diff --git a/software/MDK_projects.zip b/software/MDK_projects.zip new file mode 100644 index 0000000..72d7000 Binary files /dev/null and b/software/MDK_projects.zip differ diff --git a/software/Power_Pico/.mxproject b/software/Power_Pico/.mxproject deleted file mode 100644 index 3d2829d..0000000 --- a/software/Power_Pico/.mxproject +++ /dev/null @@ -1,52 +0,0 @@ -[PreviousLibFiles] -LibFiles=Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pcd.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pcd_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_usb.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_bus.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_system.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_utils.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dmamux.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h;Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_adc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_adc_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_adc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_i2c.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_spi.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_tim.h;Middlewares\Third_Party\FreeRTOS\Source\include\croutine.h;Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h;Middlewares\Third_Party\FreeRTOS\Source\include\event_groups.h;Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h;Middlewares\Third_Party\FreeRTOS\Source\include\list.h;Middlewares\Third_Party\FreeRTOS\Source\include\message_buffer.h;Middlewares\Third_Party\FreeRTOS\Source\include\mpu_prototypes.h;Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h;Middlewares\Third_Party\FreeRTOS\Source\include\portable.h;Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h;Middlewares\Third_Party\FreeRTOS\Source\include\queue.h;Middlewares\Third_Party\FreeRTOS\Source\include\semphr.h;Middlewares\Third_Party\FreeRTOS\Source\include\stack_macros.h;Middlewares\Third_Party\FreeRTOS\Source\include\StackMacros.h;Middlewares\Third_Party\FreeRTOS\Source\include\stream_buffer.h;Middlewares\Third_Party\FreeRTOS\Source\include\task.h;Middlewares\Third_Party\FreeRTOS\Source\include\timers.h;Middlewares\Third_Party\FreeRTOS\Source\include\atomic.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\freertos_mpool.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\freertos_os2.h;Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_core.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_ctlreq.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_def.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_ioreq.h;Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Inc\usbd_cdc.h;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_usb.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_adc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.c;Middlewares\Third_Party\FreeRTOS\Source\croutine.c;Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;Middlewares\Third_Party\FreeRTOS\Source\list.c;Middlewares\Third_Party\FreeRTOS\Source\queue.c;Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;Middlewares\Third_Party\FreeRTOS\Source\tasks.c;Middlewares\Third_Party\FreeRTOS\Source\timers.c;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.c;Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\port.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Src\usbd_cdc.c;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pcd.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pcd_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_usb.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_bus.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_system.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_utils.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dmamux.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h;Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_adc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_adc_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_adc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_i2c.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_spi.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_tim.h;Middlewares\Third_Party\FreeRTOS\Source\include\croutine.h;Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h;Middlewares\Third_Party\FreeRTOS\Source\include\event_groups.h;Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h;Middlewares\Third_Party\FreeRTOS\Source\include\list.h;Middlewares\Third_Party\FreeRTOS\Source\include\message_buffer.h;Middlewares\Third_Party\FreeRTOS\Source\include\mpu_prototypes.h;Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h;Middlewares\Third_Party\FreeRTOS\Source\include\portable.h;Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h;Middlewares\Third_Party\FreeRTOS\Source\include\queue.h;Middlewares\Third_Party\FreeRTOS\Source\include\semphr.h;Middlewares\Third_Party\FreeRTOS\Source\include\stack_macros.h;Middlewares\Third_Party\FreeRTOS\Source\include\StackMacros.h;Middlewares\Third_Party\FreeRTOS\Source\include\stream_buffer.h;Middlewares\Third_Party\FreeRTOS\Source\include\task.h;Middlewares\Third_Party\FreeRTOS\Source\include\timers.h;Middlewares\Third_Party\FreeRTOS\Source\include\atomic.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\freertos_mpool.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\freertos_os2.h;Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_core.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_ctlreq.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_def.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_ioreq.h;Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Inc\usbd_cdc.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f411xe.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;Drivers\CMSIS\Include\cachel1_armv7.h;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_armclang_ltm.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv81mml.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm35p.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm55.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_cm85.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\core_starmc1.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\pac_armv81.h;Drivers\CMSIS\Include\pmu_armv8.h;Drivers\CMSIS\Include\tz_context.h; - -[PreviousUsedKeilFiles] -SourceFiles=..\Core\Src\main.c;..\Core\Src\gpio.c;..\Core\Src\freertos.c;..\Core\Src\adc.c;..\Core\Src\dma.c;..\Core\Src\i2c.c;..\Core\Src\spi.c;..\Core\Src\tim.c;..\USB_DEVICE\App\usb_device.c;..\USB_DEVICE\Target\usbd_conf.c;..\USB_DEVICE\App\usbd_desc.c;..\USB_DEVICE\App\usbd_cdc_if.c;..\Core\Src\stm32f4xx_it.c;..\Core\Src\stm32f4xx_hal_msp.c;..\Core\Src\stm32f4xx_hal_timebase_tim.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_usb.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_adc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.c;..\Middlewares\Third_Party\FreeRTOS\Source\croutine.c;..\Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;..\Middlewares\Third_Party\FreeRTOS\Source\list.c;..\Middlewares\Third_Party\FreeRTOS\Source\queue.c;..\Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;..\Middlewares\Third_Party\FreeRTOS\Source\tasks.c;..\Middlewares\Third_Party\FreeRTOS\Source\timers.c;..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\port.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Src\usbd_cdc.c;..\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;..\Core\Src\system_stm32f4xx.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_usb.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_adc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.c;..\Middlewares\Third_Party\FreeRTOS\Source\croutine.c;..\Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;..\Middlewares\Third_Party\FreeRTOS\Source\list.c;..\Middlewares\Third_Party\FreeRTOS\Source\queue.c;..\Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;..\Middlewares\Third_Party\FreeRTOS\Source\tasks.c;..\Middlewares\Third_Party\FreeRTOS\Source\timers.c;..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\port.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Src\usbd_cdc.c;..\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;..\Core\Src\system_stm32f4xx.c;;;..\Middlewares\Third_Party\FreeRTOS\Source\croutine.c;..\Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;..\Middlewares\Third_Party\FreeRTOS\Source\list.c;..\Middlewares\Third_Party\FreeRTOS\Source\queue.c;..\Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;..\Middlewares\Third_Party\FreeRTOS\Source\tasks.c;..\Middlewares\Third_Party\FreeRTOS\Source\timers.c;..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\port.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Src\usbd_cdc.c; -HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;..\Middlewares\Third_Party\FreeRTOS\Source\include;..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2;..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F;..\Middlewares\ST\STM32_USB_Device_Library\Core\Inc;..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Inc;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Core\Inc;..\USB_DEVICE\App;..\USB_DEVICE\Target; -CDefines=USE_HAL_DRIVER;STM32F411xE;USE_HAL_DRIVER;USE_HAL_DRIVER; - -[PreviousGenFiles] -AdvancedFolderStructure=true -HeaderFileListSize=14 -HeaderFiles#0=..\Core\Inc\gpio.h -HeaderFiles#1=..\Core\Inc\FreeRTOSConfig.h -HeaderFiles#2=..\Core\Inc\adc.h -HeaderFiles#3=..\Core\Inc\dma.h -HeaderFiles#4=..\Core\Inc\i2c.h -HeaderFiles#5=..\Core\Inc\spi.h -HeaderFiles#6=..\Core\Inc\tim.h -HeaderFiles#7=..\USB_DEVICE\App\usb_device.h -HeaderFiles#8=..\USB_DEVICE\Target\usbd_conf.h -HeaderFiles#9=..\USB_DEVICE\App\usbd_desc.h -HeaderFiles#10=..\USB_DEVICE\App\usbd_cdc_if.h -HeaderFiles#11=..\Core\Inc\stm32f4xx_it.h -HeaderFiles#12=..\Core\Inc\stm32f4xx_hal_conf.h -HeaderFiles#13=..\Core\Inc\main.h -HeaderFolderListSize=3 -HeaderPath#0=..\Core\Inc -HeaderPath#1=..\USB_DEVICE\App -HeaderPath#2=..\USB_DEVICE\Target -HeaderFiles=; -SourceFileListSize=15 -SourceFiles#0=..\Core\Src\gpio.c -SourceFiles#1=..\Core\Src\freertos.c -SourceFiles#2=..\Core\Src\adc.c -SourceFiles#3=..\Core\Src\dma.c -SourceFiles#4=..\Core\Src\i2c.c -SourceFiles#5=..\Core\Src\spi.c -SourceFiles#6=..\Core\Src\tim.c -SourceFiles#7=..\USB_DEVICE\App\usb_device.c -SourceFiles#8=..\USB_DEVICE\Target\usbd_conf.c -SourceFiles#9=..\USB_DEVICE\App\usbd_desc.c -SourceFiles#10=..\USB_DEVICE\App\usbd_cdc_if.c -SourceFiles#11=..\Core\Src\stm32f4xx_it.c -SourceFiles#12=..\Core\Src\stm32f4xx_hal_msp.c -SourceFiles#13=..\Core\Src\stm32f4xx_hal_timebase_tim.c -SourceFiles#14=..\Core\Src\main.c -SourceFolderListSize=3 -SourcePath#0=..\Core\Src -SourcePath#1=..\USB_DEVICE\App -SourcePath#2=..\USB_DEVICE\Target -SourceFiles=; - diff --git a/software/Power_Pico/BSP/BEEP/beep.c b/software/Power_Pico/BSP/BEEP/beep.c deleted file mode 100644 index 8b647bd..0000000 --- a/software/Power_Pico/BSP/BEEP/beep.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "beep.h" -#include "tim.h" - -void beep_open(void) { - HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4); // 启动PWM通道4用于蜂鸣器 -} - -void beep_close(void) { - HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_4); // 停止PWM通道4 -} diff --git a/software/Power_Pico/BSP/BEEP/beep.h b/software/Power_Pico/BSP/BEEP/beep.h deleted file mode 100644 index 67a4a4e..0000000 --- a/software/Power_Pico/BSP/BEEP/beep.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __BEEP_H__ -#define __BEEP_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "main.h" - -void beep_open(void); -void beep_close(void); - - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/software/Power_Pico/BSP/EEPROM/BL24C02.c b/software/Power_Pico/BSP/EEPROM/BL24C02.c deleted file mode 100644 index bbb26b6..0000000 --- a/software/Power_Pico/BSP/EEPROM/BL24C02.c +++ /dev/null @@ -1,190 +0,0 @@ -#include "BL24C02.h" -#include "i2c.h" -// hardware settings -#include "lcd_init.h" - -typedef struct { - uint8_t backlight_level; // 0-100 - uint8_t key_sound_enable; // 0:disable, 1:enable - uint8_t language_select; // 0:English, 1:Chinese - uint16_t rotation; // 0, 90, 180, 270 -} SysSettings_T; - -static SysSettings_T sys_settings = { - .backlight_level = 50, - .key_sound_enable = 1, - .language_select = 0, - .rotation = 0 -}; - -static void BL24C02_Write(uint8_t addr, uint16_t length, uint8_t buff[]) -{ - HAL_I2C_Mem_Write(&hi2c1, BL24C02_ADDRESS<<1, addr, I2C_MEMADD_SIZE_8BIT, buff, length, 10); -} - -static void BL24C02_Read(uint8_t addr, uint8_t length, uint8_t buff[]) -{ - HAL_I2C_Mem_Read(&hi2c1, BL24C02_ADDRESS<<1, addr, I2C_MEMADD_SIZE_8BIT, buff, length, 10); -} - -static void delay_ms(uint32_t ms) -{ - HAL_Delay(ms); -} - -/****************************************** -EEPROM Data description: -[0x00]: 0x55 for check -[0x01]: 0xAA for check - -[0x10]: user backlight_level setting -[0x11]: user key_sound_enable setting -[0x12]: user language_select setting -[0x13-14]: user rotation setting - -[0x20-]: update command storage area, "update\r\n" -*******************************************/ - -// to check the Data is right and the EEPROM is working, 0-ok, 1-erro -uint8_t EEPROM_Init_Check(void) -{ - uint8_t check_buff[2]; - delay_ms(10); - BL24C02_Read(0,2,check_buff); - if(check_buff[0] == 0x55 && check_buff[1] == 0xAA) - { - return 0;//check OK - } - else - { - check_buff[0] = 0x55; - check_buff[1] = 0xAA; - delay_ms(10); - BL24C02_Write(0,2,check_buff); - memset(check_buff,0,2); - delay_ms(10); - BL24C02_Read(0,2,check_buff); - if(check_buff[0] == 0x55 && check_buff[1] == 0xAA) - return 0;//check ok - } - return 1;//check erro -} - - -// to Save the settings -void EEPROM_SysSetting_Save(void) -{ - uint8_t buff[5]; - buff[0] = sys_settings.backlight_level; - buff[1] = sys_settings.key_sound_enable; - buff[2] = sys_settings.language_select; - buff[3] = (uint8_t)(sys_settings.rotation & 0x00FF); - buff[4] = (uint8_t)((sys_settings.rotation >> 8) & 0x00FF); - BL24C02_Write(0x10,5,buff); -} - - -// to Get the settings -void EEPROM_SysSetting_Get(void) -{ - uint8_t buff[5]; - BL24C02_Read(0x10,5,buff); - // 判断是否在范围内 - if(buff[0] <= 100) - sys_settings.backlight_level = buff[0]; - else - sys_settings.backlight_level = 60; - if(buff[1] <= 1) - sys_settings.key_sound_enable = buff[1]; - else - sys_settings.key_sound_enable = 1; - if(buff[2] <= 1) - sys_settings.language_select = buff[2]; - else - sys_settings.language_select = 0; - uint16_t rotation = (uint16_t)buff[3] | ((uint16_t)buff[4] << 8); - if(rotation == 0 || rotation == 90 || rotation == 180 || rotation == 270) - sys_settings.rotation = rotation; - else - sys_settings.rotation = 180; -} - -// to write the update command -void EEPROM_UpdateCommand_Write(bool is_update) -{ - if(is_update) { - char cmd[] = "update\r\n"; - BL24C02_Write(0x20, strlen(cmd), (uint8_t *)cmd); - } else { - char cmd[] = "-nope-\r\n"; - BL24C02_Write(0x20, strlen(cmd), (uint8_t *)cmd); - } -} - -// to check the update command -bool EEPROM_UpdateCommand_Check(void) -{ - char cmd[10] = {0}; - BL24C02_Read(0x20, 8, (uint8_t *)cmd); - if(strcmp(cmd, "update\r\n") == 0) { - return true; - } else { - return false; - } -} - -// Set functions - -void Sys_Set_BacklightLevel(uint8_t level) -{ - if(level <= 100 && level >= 0) { - sys_settings.backlight_level = level; - LCD_Set_Light(level); - } -} - -void Sys_Set_KeySoundEnable(bool enable) -{ - if(enable) { - sys_settings.key_sound_enable = 1; - } else { - sys_settings.key_sound_enable = 0; - } -} - -void Sys_Set_LanguageSelect(uint8_t lang) -{ - if(lang <= 1) { - sys_settings.language_select = lang; - } -} - -void Sys_Set_Rotation(uint16_t rotation) -{ - if(rotation == 0 || rotation == 90 || rotation == 180 || rotation == 270) { - sys_settings.rotation = rotation; - LCD_SetRotation(rotation); - } -} - -// Get functions - -uint8_t Sys_Get_BacklightLevel(void) -{ - return sys_settings.backlight_level; -} - -uint8_t Sys_Get_KeySoundEnable(void) -{ - return sys_settings.key_sound_enable; -} - -uint8_t Sys_Get_LanguageSelect(void) -{ - return sys_settings.language_select; -} - -uint16_t Sys_Get_Rotation(void) -{ - return sys_settings.rotation; -} diff --git a/software/Power_Pico/BSP/EEPROM/BL24C02.h b/software/Power_Pico/BSP/EEPROM/BL24C02.h deleted file mode 100644 index f30323f..0000000 --- a/software/Power_Pico/BSP/EEPROM/BL24C02.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __BL24C02_H -#define __BL24C02_H - -#include -#include -#include - -#define BL24C02_ADDRESS 0x50 - -uint8_t EEPROM_Init_Check(void); -void EEPROM_SysSetting_Save(void); -void EEPROM_SysSetting_Get(void); -void EEPROM_UpdateCommand_Write(bool is_update); -bool EEPROM_UpdateCommand_Check(void); - -// set functions - -void Sys_Set_BacklightLevel(uint8_t level); -void Sys_Set_KeySoundEnable(bool enable); -void Sys_Set_LanguageSelect(uint8_t lang); -void Sys_Set_Rotation(uint16_t rotation); - -// get functions - -uint8_t Sys_Get_BacklightLevel(void); -uint8_t Sys_Get_KeySoundEnable(void); -uint8_t Sys_Get_LanguageSelect(void); -uint16_t Sys_Get_Rotation(void); - -#endif diff --git a/software/Power_Pico/BSP/GATE/gate.c b/software/Power_Pico/BSP/GATE/gate.c deleted file mode 100644 index 9f141e0..0000000 --- a/software/Power_Pico/BSP/GATE/gate.c +++ /dev/null @@ -1,61 +0,0 @@ -#include "gate.h" -#include "math.h" - -uint8_t gate_status = HIGH_CUR; // Default status - -void Gate_Port_Init(void) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(EN1_PORT, EN1_PIN, GPIO_PIN_SET); - HAL_GPIO_WritePin(EN2_PORT, EN2_PIN, GPIO_PIN_RESET); - - /*Configure GPIO pin : PB3 */ - GPIO_InitStruct.Pin = EN1_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(EN1_PORT, &GPIO_InitStruct); - - /*Configure GPIO pin : PB3 */ - GPIO_InitStruct.Pin = EN2_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(EN2_PORT, &GPIO_InitStruct); -} - -void flow_route_selection(uint8_t selection) -{ - if(selection > HIGH_CUR) - selection = HIGH_CUR; // Invalid selection - if(selection < LOW_CUR) - selection = LOW_CUR; - if(selection == HIGH_CUR) - { - HAL_GPIO_WritePin(EN1_PORT, EN1_PIN, GPIO_PIN_SET); - HAL_GPIO_WritePin(EN2_PORT, EN2_PIN, GPIO_PIN_RESET); - } - else if(selection == MID_CUR) - { - HAL_GPIO_WritePin(EN1_PORT, EN1_PIN, GPIO_PIN_RESET); - HAL_GPIO_WritePin(EN2_PORT, EN2_PIN, GPIO_PIN_SET); - } - else if(selection == LOW_CUR) - { - HAL_GPIO_WritePin(EN1_PORT, EN1_PIN, GPIO_PIN_RESET); - HAL_GPIO_WritePin(EN2_PORT, EN2_PIN, GPIO_PIN_RESET); - } - gate_status = selection; // Update the status -} - -uint8_t Gate_get_status(void) -{ - return gate_status; -} - diff --git a/software/Power_Pico/BSP/GATE/gate.h b/software/Power_Pico/BSP/GATE/gate.h deleted file mode 100644 index d446bd5..0000000 --- a/software/Power_Pico/BSP/GATE/gate.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef __GATE_H__ -#define __GATE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "main.h" -#include "adc.h" - -// EN1 -#define EN1_PORT GPIOB -#define EN1_PIN GPIO_PIN_3 - -// EN2 -#define EN2_PORT GPIOA -#define EN2_PIN GPIO_PIN_15 - -// Flow route selection -#define HIGH_CUR 3 -#define MID_CUR 2 -#define LOW_CUR 1 - -void Gate_Port_Init(void); -void flow_route_selection(uint8_t selection); -uint8_t Gate_get_status(void); - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/software/Power_Pico/BSP/KEY/key.c b/software/Power_Pico/BSP/KEY/key.c deleted file mode 100644 index 01ee539..0000000 --- a/software/Power_Pico/BSP/KEY/key.c +++ /dev/null @@ -1,276 +0,0 @@ -/* - * key.c - * - * 按键驱动: - * - 支持多键注册(GPIO,低/高有效) - * - 去抖、长按、连发 - * - 事件队列(DOWN/UP/CLICK/LONG/REPEAT) - * - 掩码查询当前稳定按下状态,支持多键同时 - * - * Created on: 2025-12-02 - */ - -#include "key.h" -#include "sys.h" -#include "cmsis_os.h" // 若无OS,可移除 -#include - -/* 若有OS则用OS tick,否则用HAL tick */ -#if OS_SUPPORT - #define key_get_tick() ((uint32_t)osKernelGetTickCount()) -#else - #define key_get_tick() ((uint32_t)HAL_GetTick()) -#endif -#define TICK_DIFF(now, then) ((uint32_t)((uint32_t)(now) - (uint32_t)(then))) - -/* 按键槽结构体 */ -typedef struct { - GPIO_TypeDef* port; // gpio port - uint16_t pin; // gpio pin - uint8_t active_high; // 高电平有效 - uint8_t registered; // 是否已注册 - uint8_t raw_pressed; // 原始按下状态 - uint8_t stable_pressed; // 稳定按下状态 - uint32_t debounce_tick; // 消抖计时 - uint8_t long_reported; // 长按事件是否上报 - uint32_t press_tick; // 按下时刻 - uint32_t last_repeat_tick; // 上次连发时刻 -} key_slot_t; - -/* 全局按键管理结构体 */ -static struct { - uint8_t mode; - key_timing_t timing; - uint32_t long_enable_mask; - key_slot_t slot[KEY_ID_MAX]; - uint32_t raw_mask; - uint32_t stable_mask; -} g_key = { - .mode = (KEY_MODE_REPORT_DOWN_UP | KEY_MODE_CLICK_ON_RELEASE | KEY_MODE_LONG_ONCE), - .timing = { .debounce_ms = 5, .long_ms = 500, .repeat_ms = 100 }, - .long_enable_mask = 0, - .raw_mask = 0, - .stable_mask = 0, -}; - -/** - * @brief 注册GPIO按键 - * @param id 按键ID - * @param port GPIO端口 - * @param pin GPIO引脚 - * @param active_high 引脚高电平有效 -*/ -bool Key_RegisterGPIO(key_id_t id, GPIO_TypeDef* port, uint16_t pin, uint8_t active_high) -{ - if(id >= KEY_ID_MAX || port == NULL) return false; - key_slot_t* k = &g_key.slot[id]; - k->port = port; - k->pin = pin; - k->active_high = active_high ? 1 : 0; - k->registered = 1; - k->raw_pressed = 0; - k->stable_pressed = 0; - k->debounce_tick = key_get_tick(); - k->long_reported = 0; - k->press_tick = 0; - k->last_repeat_tick = 0; - return true; -} - -/** - * @brief 设置按键模式 - * @param mode_flags 模式标志位 - */ -void Key_SetMode(uint8_t mode_flags) { g_key.mode = mode_flags; } -/** - * @brief 获取按键模式 - * @return 当前模式标志位 - */ -uint8_t Key_GetMode(void) { return g_key.mode; } -/** - * @brief 设置允许长按/连发的按键掩码 - * @param mask 按键掩码 - */ -void Key_SetLongEnableMask(uint32_t mask) { g_key.long_enable_mask = mask & KEY_ALL_MASK; } -/** - * @brief 获取允许长按/连发的按键掩码 - * @return 按键掩码 - */ -uint32_t Key_GetLongEnableMask(void) { return g_key.long_enable_mask; } -/** - * @brief 获取当前稳定按下的按键掩码 - * @return 按键掩码 - */ -uint32_t Key_GetPressedMask(void) { return g_key.stable_mask; } -/** - * @brief 获取当前原始按下的按键掩码 - * @return 按键掩码 - */ -uint32_t Key_GetRawMask(void) { return g_key.raw_mask; } -/** - * @brief 设置时序参数 - * @param t 指向时序参数结构体的指针 - */ -void Key_SetTiming(const key_timing_t* t) -{ - if(!t) return; - if(t->debounce_ms) g_key.timing.debounce_ms = t->debounce_ms; - if(t->repeat_ms) g_key.timing.repeat_ms = t->repeat_ms; - if(t->long_ms) g_key.timing.long_ms = t->long_ms; -} -/** - * @brief 获取按键按下状态(考虑高/低有效) - * @param port GPIO端口 - * @param pin GPIO引脚 - * @param active_high 引脚高电平有效 - */ -static inline uint8_t read_pressed(GPIO_TypeDef* port, uint16_t pin, uint8_t active_high) -{ - GPIO_PinState s = HAL_GPIO_ReadPin(port, pin); - return active_high ? (s == GPIO_PIN_SET) : (s == GPIO_PIN_RESET); -} - -/** - * @brief 扫描一次,若有事件则通过 out_evt 返回 - * @param out_evt 指向事件对象的指针(非空) - * @return true 有事件;false 无事件 - * @note 每次调用仅返回一个事件,优先级顺序:DOWN/UP -> CLICK -> LONG -> REPEAT, - * @note 返回事件后可以检测掩码,查看是否同时按下键,用于组合逻辑Key_GetPressedMask(); - */ -bool Key_Scan(key_event_t* out_evt) -{ - if(!out_evt) return false; - uint32_t now = key_get_tick(); - - /* 采样原始状态 */ - uint32_t new_raw_mask = 0; - for(uint8_t i=0; iregistered) continue; - uint8_t raw = read_pressed(k->port, k->pin, k->active_high); - if(raw != k->raw_pressed){ - k->raw_pressed = raw; - k->debounce_tick = now; - } - if(raw) new_raw_mask |= KEY_BIT(i); - } - g_key.raw_mask = new_raw_mask; - - /* 边沿与事件(优先返回最先发现的一个事件) */ - for(uint8_t i=0; iregistered) continue; - - /* 去抖窗口内不改变稳定态 */ - if(TICK_DIFF(now, k->debounce_tick) < g_key.timing.debounce_ms){ - continue; - } - - uint8_t stable_now = k->raw_pressed; - if(stable_now != k->stable_pressed){ - /* 稳定边沿 */ - k->stable_pressed = stable_now; - if(stable_now){ - /* DOWN */ - g_key.stable_mask |= KEY_BIT(i); - k->press_tick = now; - k->last_repeat_tick = now; - k->long_reported = 0; - if(g_key.mode & KEY_MODE_REPORT_DOWN_UP){ - out_evt->id = (key_id_t)i; - out_evt->type = KEY_EVT_DOWN; - return true; - } - }else{ - /* UP */ - g_key.stable_mask &= ~KEY_BIT(i); - - if(g_key.mode & KEY_MODE_REPORT_DOWN_UP){ - out_evt->id = (key_id_t)i; - out_evt->type = KEY_EVT_UP; - return true; - } - if((g_key.mode & KEY_MODE_CLICK_ON_RELEASE) && !k->long_reported){ - out_evt->id = (key_id_t)i; - out_evt->type = KEY_EVT_CLICK; - /* 复位长按标记 */ - k->long_reported = 0; - return true; - } - /* 复位长按标记 */ - k->long_reported = 0; - } - } - } - - /* 长按/连发(按下且允许时) */ - for(uint8_t i=0; iregistered || !k->stable_pressed) continue; - if(!(g_key.long_enable_mask & KEY_BIT(i))) continue; - - uint32_t held = TICK_DIFF(now, k->press_tick); - - /* 首次长按 */ - if(!k->long_reported && (held >= g_key.timing.long_ms)){ - k->long_reported = 1; - if(g_key.mode & (KEY_MODE_LONG_ONCE | KEY_MODE_REPEAT)){ - out_evt->id = (key_id_t)i; - out_evt->type = KEY_EVT_LONG; - k->last_repeat_tick = now; - return true; - } - } - - /* 连发 */ - if(k->long_reported && (g_key.mode & KEY_MODE_REPEAT)){ - if(TICK_DIFF(now, k->last_repeat_tick) >= g_key.timing.repeat_ms){ - k->last_repeat_tick = now; - out_evt->id = (key_id_t)i; - out_evt->type = KEY_EVT_REPEAT; - return true; - } - } - } - - return false; -} - -/* 初始化GPIO */ -static void Key_Port_Init(void) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - - /*Configure GPIO pin : PA0 */ - GPIO_InitStruct.Pin = KEYB_PIN | KEYY_PIN | KEYL_PIN | KEYR_PIN | KEYN_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_PULLUP; - HAL_GPIO_Init(KEYB_PORT, &GPIO_InitStruct); -} - -/* 注册默认按键 */ -static bool Key_RegisterDefaultKeys(void) -{ - bool ok = true; - ok &= Key_RegisterGPIO(KEY_ID_B, KEYB_PORT, KEYB_PIN, 0); - ok &= Key_RegisterGPIO(KEY_ID_Y, KEYY_PORT, KEYY_PIN, 0); - ok &= Key_RegisterGPIO(KEY_ID_L, KEYL_PORT, KEYL_PIN, 0); - ok &= Key_RegisterGPIO(KEY_ID_R, KEYR_PORT, KEYR_PIN, 0); - ok &= Key_RegisterGPIO(KEY_ID_N, KEYN_PORT, KEYN_PIN, 0); - return ok; -} - -/* 初始化按键 */ -void Key_Init(void) -{ - memset(&g_key.slot[0], 0, sizeof(g_key.slot)); - g_key.raw_mask = 0; - g_key.stable_mask = 0; - Key_Port_Init(); - Key_RegisterDefaultKeys(); - Key_SetMode(KEY_MODE_CLICK_ON_RELEASE | KEY_MODE_LONG_ONCE | KEY_MODE_REPEAT); - Key_SetLongEnableMask(KEY_BIT(KEY_ID_Y) | KEY_BIT(KEY_ID_N)); -} diff --git a/software/Power_Pico/BSP/KEY/key.h b/software/Power_Pico/BSP/KEY/key.h deleted file mode 100644 index 08d058f..0000000 --- a/software/Power_Pico/BSP/KEY/key.h +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef __KEY_H__ -#define __KEY_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#pragma once - -#include "main.h" -#include -#include - -// 时间参数(单位:ms) - -#define KEY_LONG_THRESHOLD_MS 500 // 长按判定时间 -#define KEY_REPEAT_INTERVAL_MS 150 // 连发间隔时间 -#define KEY_DEBOUNCE_MS 3 // 消抖时间 - -/* 掩码工具(位索引即 key_id_t) */ -#define KEY_BIT(id) (1U << (uint8_t)(id)) -#define KEY_ALL_MASK ((uint32_t)((KEY_ID_MAX >= 32) ? 0xFFFFFFFFu : ((1u << KEY_ID_MAX) - 1))) - -//KEYB -#define KEYB_PORT GPIOA -#define KEYB_PIN GPIO_PIN_0 - -//KEYN -#define KEYN_PORT GPIOA -#define KEYN_PIN GPIO_PIN_4 - -//KEYL -#define KEYL_PORT GPIOA -#define KEYL_PIN GPIO_PIN_3 - -//KEYR -#define KEYR_PORT GPIOA -#define KEYR_PIN GPIO_PIN_2 - -//KEYY -#define KEYY_PORT GPIOA -#define KEYY_PIN GPIO_PIN_1 - -/** - * @brief 按键ID(与掩码位索引一致) - */ -typedef enum { - KEY_ID_B = 0, // KEYB - KEY_ID_Y, // KEYY - KEY_ID_L, // KEYL - KEY_ID_R, // KEYR - KEY_ID_N, // KEYN - KEY_ID_MAX -} key_id_t; - -/** - * @brief 事件类型 - */ -typedef enum { - KEY_EVT_NONE = 0, - KEY_EVT_DOWN = 1, // 去抖后稳定按下 - KEY_EVT_UP = 2, // 去抖后稳定释放 - KEY_EVT_CLICK = 3, // 短按(一次按下->释放,且未触发长按) - KEY_EVT_LONG = 4, // 达到长按阈值触发一次 - KEY_EVT_REPEAT = 5 // 长按连发周期事件 -} key_evt_type_t; - -/** - * @brief 事件对象 - */ -typedef struct { - key_id_t id; - key_evt_type_t type; -} key_event_t; - -/** - * @brief 扫描模式(可用位或"|"组合) - */ -typedef enum { - KEY_MODE_REPORT_DOWN_UP = 0x01, // 上报 DOWN/UP - KEY_MODE_CLICK_ON_RELEASE = 0x02, // 释放时若未长按,上报 CLICK - KEY_MODE_LONG_ONCE = 0x04, // 达到阈值上报一次 LONG - KEY_MODE_REPEAT = 0x08 // 达到阈值后周期性上报 REPEAT -} key_mode_t; - -/** - * @brief 时序参数(单位:ms),可运行时修改 - */ -typedef struct { - uint16_t debounce_ms; // 消抖时间,建议 3~20 - uint16_t long_ms; // 长按判定时间,建议 400~800 - uint16_t repeat_ms; // 连发间隔,建议 80~200 -} key_timing_t; - - -void Key_Init(void); -bool Key_Scan(key_event_t* out_evt); - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/software/Power_Pico/BSP/LCD/ST7789.txt b/software/Power_Pico/BSP/LCD/ST7789.txt deleted file mode 100644 index e69de29..0000000 diff --git a/software/Power_Pico/BSP/LCD/lcd.c b/software/Power_Pico/BSP/LCD/lcd.c deleted file mode 100644 index 2ce1af7..0000000 --- a/software/Power_Pico/BSP/LCD/lcd.c +++ /dev/null @@ -1,611 +0,0 @@ -#include "lcd.h" -#include "lcd_init.h" -#include "lcdfont.h" -#include "spi.h" -#include "cmsis_os.h" - -extern osSemaphoreId_t DMA_SemaphoreHandle; -/****************************************************************************** - 函数说明:在指定区域填充颜色 - 入口数据:xsta,ysta 起始坐标 - xend,yend 终止坐标 - color 要填充的颜色 - 返回值: 无 -******************************************************************************/ -void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color) -{ - u16 i,j; - LCD_Address_Set(xsta, ysta,xend-1, yend-1);//设置显示范围 - for(i=ysta;iCR1 |= SPI_CR1_DFF; // 置位 DFF,启用 16 位数据帧 - __HAL_SPI_ENABLE(&hspi2); - // 3. 启动 DMA 传输 - HAL_SPI_Transmit_DMA(&hspi2, (uint8_t*)color_p, count); -} - -static void *lcd_ready_cb = NULL; - -// 设置通知的回调函数 -void LCD_Set_Flush_Complete_Callback(void *cb) -{ - // 保存回调指针 - lcd_ready_cb = cb; -} - -// DMA 传输完成中断回调 -void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) -{ - if (hspi->Instance == SPI2) - { - // 1. 死等 SPI 总线发完最后 1 bit - while (hspi->Instance->SR & SPI_FLAG_BSY); - - // 2. 安全切回 8-bit 模式 (为下一次发送命令做准备) - __HAL_SPI_DISABLE(hspi); - hspi->Instance->CR1 &= ~SPI_CR1_DFF; // 清除 DFF,回退到 8 位 - __HAL_SPI_ENABLE(hspi); - - // 3. 通知 LVGL 渲染结束,执行回调函数 - if (lcd_ready_cb) { - LCD_CallbackFunc_t func = (LCD_CallbackFunc_t)lcd_ready_cb; - func(); - } - } -} - -/****************************************************************************** - 函数说明:在指定位置画点 - 入口数据:x,y 画点坐标 - color 点的颜色 - 返回值: 无 -******************************************************************************/ -void LCD_DrawPoint(u16 x,u16 y,u16 color) -{ - LCD_Address_Set(x,y,x,y);//设置光标位置 - LCD_WR_DATA(color); -} - - -/****************************************************************************** - 函数说明:画线 - 入口数据:x1,y1 起始坐标 - x2,y2 终止坐标 - color 线的颜色 - 返回值: 无 -******************************************************************************/ -void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color) -{ - u16 t; - int xerr=0,yerr=0,delta_x,delta_y,distance; - int incx,incy,uRow,uCol; - delta_x=x2-x1; //计算坐标增量 - delta_y=y2-y1; - uRow=x1;//画线起点坐标 - uCol=y1; - if(delta_x>0)incx=1; //设置单步方向 - else if (delta_x==0)incx=0;//垂直线 - else {incx=-1;delta_x=-delta_x;} - if(delta_y>0)incy=1; - else if (delta_y==0)incy=0;//水平线 - else {incy=-1;delta_y=-delta_y;} - if(delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴 - else distance=delta_y; - for(t=0;tdistance) - { - xerr-=distance; - uRow+=incx; - } - if(yerr>distance) - { - yerr-=distance; - uCol+=incy; - } - } -} - - -/****************************************************************************** - 函数说明:画矩形 - 入口数据:x1,y1 起始坐标 - x2,y2 终止坐标 - color 矩形的颜色 - 返回值: 无 -******************************************************************************/ -void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color) -{ - LCD_DrawLine(x1,y1,x2,y1,color); - LCD_DrawLine(x1,y1,x1,y2,color); - LCD_DrawLine(x1,y2,x2,y2,color); - LCD_DrawLine(x2,y1,x2,y2,color); -} - - -/****************************************************************************** - 函数说明:画圆 - 入口数据:x0,y0 圆心坐标 - r 半径 - color 圆的颜色 - 返回值: 无 -******************************************************************************/ -void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color) -{ - int a,b; - a=0;b=r; - while(a<=b) - { - LCD_DrawPoint(x0-b,y0-a,color); //3 - LCD_DrawPoint(x0+b,y0-a,color); //0 - LCD_DrawPoint(x0-a,y0+b,color); //1 - LCD_DrawPoint(x0-a,y0-b,color); //2 - LCD_DrawPoint(x0+b,y0+a,color); //4 - LCD_DrawPoint(x0+a,y0-b,color); //5 - LCD_DrawPoint(x0+a,y0+b,color); //6 - LCD_DrawPoint(x0-b,y0+a,color); //7 - a++; - if((a*a+b*b)>(r*r))//判断要画的点是否过远 - { - b--; - } - } -} - -/****************************************************************************** - 函数说明:显示汉字串 - 入口数据:x,y显示坐标 - *s 要显示的汉字串 - fc 字的颜色 - bc 字的背景色 - sizey 字号 可选 16 24 32 - mode: 0非叠加模式 1叠加模式 - 返回值: 无 -******************************************************************************/ -void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode) -{ - while(*s!=0) - { - if(sizey==12) LCD_ShowChinese12x12(x,y,s,fc,bc,sizey,mode); - else if(sizey==16) LCD_ShowChinese16x16(x,y,s,fc,bc,sizey,mode); - else if(sizey==24) LCD_ShowChinese24x24(x,y,s,fc,bc,sizey,mode); - else if(sizey==32) LCD_ShowChinese32x32(x,y,s,fc,bc,sizey,mode); - else return; - s+=2; - x+=sizey; - } -} - -/****************************************************************************** - 函数说明:显示单个12x12汉字 - 入口数据:x,y显示坐标 - *s 要显示的汉字 - fc 字的颜色 - bc 字的背景色 - sizey 字号 - mode: 0非叠加模式 1叠加模式 - 返回值: 无 -******************************************************************************/ -void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode) -{ - u8 i,j,m=0; - u16 k; - u16 HZnum;//汉字数目 - u16 TypefaceNum;//一个字符所占字节大小 - u16 x0=x; - TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey; - - HZnum=sizeof(tfont12)/sizeof(typFNT_GB12); //统计汉字数目 - for(k=0;k>8); -// LCD_Writ_Bus(dat); - uint8_t temp[2]; - temp[0]=(dat>>8)&0xff; - temp[1]=dat&0xff; - HAL_SPI_Transmit(&hspi2,temp,2,1); - -} - - -/****************************************************************************** - ˵LCDд - ݣdat д - ֵ -******************************************************************************/ -void LCD_WR_REG(u8 dat) -{ - LCD_DC_Clr();//д - LCD_Writ_Bus(dat); - LCD_DC_Set();//д -} - - -/****************************************************************************** - ˵ʼͽַ - ݣx1,x2 еʼͽַ - y1,y2 еʼͽַ - ֵ -******************************************************************************/ -void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2) -{ - LCD_WR_REG(0x2a);//еַ - LCD_WR_DATA(x1 + OFFSET_X); - LCD_WR_DATA(x2 + OFFSET_X); - LCD_WR_REG(0x2b);//еַ - LCD_WR_DATA(y1 + OFFSET_Y); - LCD_WR_DATA(y2 + OFFSET_Y); - LCD_WR_REG(0x2c);//д -} - - -/****************************************************************************** - ˵LCDڱ - ݣdc,ռձ,5%~100% - ֵ -******************************************************************************/ -void LCD_Set_Light(uint8_t dc) -{ - if(dc>=5 && dc<=100) - __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,dc*PWM_PERIOD/100); -} - - -/****************************************************************************** - ˵LCDرձ - ݣ - ֵ -******************************************************************************/ -void LCD_Close_Light(void) -{ - __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,0); - //HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_3); -} - - -/****************************************************************************** - ˵LCD - ݣ - ֵ -******************************************************************************/ -void LCD_Open_Light(void) -{ - HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3); -} - -/****************************************************************************** - ˵ST7789 SLEEP IN - ݣ - ֵ -******************************************************************************/ -void LCD_ST7789_SleepIn(void) -{ - LCD_WR_REG(0x10); - HAL_Delay(100); -} - - -/****************************************************************************** - ˵ST7789 SLEEP OUT - ݣ - ֵ -******************************************************************************/ -void LCD_ST7789_SleepOut(void) -{ - LCD_WR_REG(0x11); - HAL_Delay(100); -} - -/****************************************************************************** - ˵Ļת - ݣrotation 0, 90, 180, 270 - ֵ -******************************************************************************/ -void LCD_SetRotation(uint16_t rotation) { - LCD_WR_REG(0x36); // Memory Data Access Control - switch(rotation) { - case 0: - OFFSET_X = 0; - OFFSET_Y = 0; - LCD_WR_DATA8(0x00); - break; - case 180: - OFFSET_X = 0; - OFFSET_Y = 80; - LCD_WR_DATA8(0xC0); - break; - case 90: - OFFSET_X = 0; - OFFSET_Y = 0; - LCD_WR_DATA8(0x70); - break; - case 270: - OFFSET_X = 80; - OFFSET_Y = 0; - LCD_WR_DATA8(0xA0); - break; - default: - OFFSET_X = 0; - OFFSET_Y = 0; - LCD_WR_DATA8(0x00); - break; - } -} - -/****************************************************************************** - ˵LCDʼ - ݣ - ֵ -******************************************************************************/ -void LCD_Init(void) -{ - LCD_GPIO_Init();//ʼGPIO - LCD_CS_Clr(); //chip select - - LCD_RES_Clr(); //λ - HAL_Delay(100); - LCD_RES_Set(); - HAL_Delay(100); - - // 1. ˳˯ģʽ (Exit Sleep Mode) - LCD_WR_REG(0x11); - HAL_Delay(120); - - // 2. ʾ (Memory Data Access Control) - LCD_SetRotation(LCD_ROTATION); - - // 3. ظʽ (Interface Pixel Format) - // 0x55 ʾ 16λɫ (RGB565)Ϊ0x66 (18λɫ)ɫ᲻ȷ - LCD_WR_REG(0x3A); - LCD_WR_DATA8(0x55); - - // 4. Porch (ʱ) - // ɨǰʱ䣬ͨҪ޸ġ - LCD_WR_REG(0xB2); - LCD_WR_DATA8(0x0C); - LCD_WR_DATA8(0x0C); - LCD_WR_DATA8(0x00); - LCD_WR_DATA8(0x33); - LCD_WR_DATA8(0x33); - - // 5. Gate (Gate Control) - // ɫʹؼVGHVGLѹӰĻĶԱȶȺӽǡ - // 0x35һȽͨõֵĻдֱĴŻ˸Գ޸ֵ - LCD_WR_REG(0xB7); - LCD_WR_DATA8(0x35); - - // 6. VCOM (VCOM Setting) - // ɫʹؼǷdzҪIJֱӰʾرǶԱȶȺ˸ - // 0x19 һοֵ 0x10 0x30 ֮䳢ԣҵȶֵ - LCD_WR_REG(0xBB); - LCD_WR_DATA8(0x19); - - // 7. LCM (LCM Control) - LCD_WR_REG(0xC0); - LCD_WR_DATA8(0x2C); - - // 8. VDV VRH ʹ - LCD_WR_REG(0xC2); - LCD_WR_DATA8(0x01); - - // 9. VRH (VRH Set) - // ɫʹؼӰѹ΢ĻȺ͹ġ - LCD_WR_REG(0xC3); - LCD_WR_DATA8(0x12); - - // 10. VDV (VDV Set) - // ͨĬֵ - LCD_WR_REG(0xC4); - LCD_WR_DATA8(0x20); - - // 11. ֡ʿ (Frame Rate Control) - // 0x0F ͨӦ 60Hz ҵˢʡĻ˸ԳԼСֵ0x14ӹġ - LCD_WR_REG(0xC6); - LCD_WR_DATA8(0x0F); - - // 12. Դ (Power Control) - LCD_WR_REG(0xD0); - LCD_WR_DATA8(0xA6); - LCD_WR_DATA8(0xA1); - - // 13. Gamma У (Positive Voltage Gamma Control) - // ɫʹؼǵɫͻҽױĵIJ֣ - // 14ֽڶ˴ӰĻҽߡ޸ЩֵıɫʵıͶȡԱȶȺ͹ƽȡ - LCD_WR_REG(0xE0); - LCD_WR_DATA8(0xD0); - LCD_WR_DATA8(0x04); - LCD_WR_DATA8(0x0D); - LCD_WR_DATA8(0x11); - LCD_WR_DATA8(0x13); - LCD_WR_DATA8(0x2B); - LCD_WR_DATA8(0x3F); - LCD_WR_DATA8(0x54); - LCD_WR_DATA8(0x4C); - LCD_WR_DATA8(0x18); - LCD_WR_DATA8(0x0D); - LCD_WR_DATA8(0x0B); - LCD_WR_DATA8(0x1F); - LCD_WR_DATA8(0x23); - - // 14. Gamma У (Negative Voltage Gamma Control) - // ɫʹؼGammaͬҪҪϵԴﵽЧ - LCD_WR_REG(0xE1); - LCD_WR_DATA8(0xD0); - LCD_WR_DATA8(0x04); - LCD_WR_DATA8(0x0C); - LCD_WR_DATA8(0x11); - LCD_WR_DATA8(0x13); - LCD_WR_DATA8(0x2C); - LCD_WR_DATA8(0x3F); - LCD_WR_DATA8(0x44); - LCD_WR_DATA8(0x51); - LCD_WR_DATA8(0x2F); - LCD_WR_DATA8(0x1F); - LCD_WR_DATA8(0x1F); - LCD_WR_DATA8(0x20); - LCD_WR_DATA8(0x23); - - // 15. ɫת (Display Inversion On) - LCD_WR_REG(0x21); - - // 16. ʾ (Display On) - LCD_WR_REG(0x29); -} - - - diff --git a/software/Power_Pico/BSP/LCD/lcd_init.h b/software/Power_Pico/BSP/LCD/lcd_init.h deleted file mode 100644 index 5b8fd90..0000000 --- a/software/Power_Pico/BSP/LCD/lcd_init.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef __LCD_INIT_H -#define __LCD_INIT_H - -#include "sys.h" - -extern uint8_t LCD_ROTATION; -extern uint8_t OFFSET_X; -extern uint8_t OFFSET_Y; - -#define LCD_W 240 -#define LCD_H 240 - -//-----------------LCD˿ڶ---------------- -#define SCLK_PORT GPIOB -#define SCLK_PIN GPIO_PIN_13 - -#define SDA_PORT GPIOB -#define SDA_PIN GPIO_PIN_15 - -#define RES_PORT GPIOB -#define RES_PIN GPIO_PIN_12 - -#define DC_PORT GPIOA -#define DC_PIN GPIO_PIN_9 - -#define CS_PORT GPIOA -#define CS_PIN GPIO_PIN_8 - -#define BLK_PORT GPIOA -#define BLK_PIN GPIO_PIN_10 - -#define LCD_SCLK_Clr() HAL_GPIO_WritePin(SCLK_PORT,SCLK_PIN,GPIO_PIN_RESET)//SCL=SCLK -#define LCD_SCLK_Set() HAL_GPIO_WritePin(SCLK_PORT,SCLK_PIN,GPIO_PIN_SET) - -#define LCD_MOSI_Clr() HAL_GPIO_WritePin(SDA_PORT,SDA_PIN,GPIO_PIN_RESET)//SDA=MOSI -#define LCD_MOSI_Set() HAL_GPIO_WritePin(SDA_PORT,SDA_PIN,GPIO_PIN_SET) - -#define LCD_RES_Clr() HAL_GPIO_WritePin(RES_PORT,RES_PIN,GPIO_PIN_RESET)//RES -#define LCD_RES_Set() HAL_GPIO_WritePin(RES_PORT,RES_PIN,GPIO_PIN_SET) - -#define LCD_DC_Clr() HAL_GPIO_WritePin(DC_PORT,DC_PIN,GPIO_PIN_RESET)//DC -#define LCD_DC_Set() HAL_GPIO_WritePin(DC_PORT,DC_PIN,GPIO_PIN_SET) - -#define LCD_CS_Clr() HAL_GPIO_WritePin(CS_PORT,CS_PIN,GPIO_PIN_RESET)//CS -#define LCD_CS_Set() HAL_GPIO_WritePin(CS_PORT,CS_PIN,GPIO_PIN_SET) - -#define LCD_BLK_Clr() HAL_GPIO_WritePin(BLK_PORT,BLK_PIN,GPIO_PIN_RESET)//BLK -#define LCD_BLK_Set() HAL_GPIO_WritePin(BLK_PORT,BLK_PIN,GPIO_PIN_SET) - -void LCD_GPIO_Init(void);//ʼGPIO -void LCD_Writ_Bus(u8 dat);//ģSPIʱ -void LCD_WR_DATA8(u8 dat);//дһֽ -void LCD_WR_DATA(u16 dat);//дֽ -void LCD_WR_REG(u8 dat);//дһָ -void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);//꺯 -void LCD_Init(void);//LCDʼ -void LCD_Set_Light(uint8_t dc); -void LCD_Close_Light(void); -void LCD_ST7789_SleepIn(void); -void LCD_ST7789_SleepOut(void); -void LCD_Open_Light(void); -void LCD_SetRotation(uint16_t rotation); - -#endif - - - - diff --git a/software/Power_Pico/BSP/LCD/lcdfont.h b/software/Power_Pico/BSP/LCD/lcdfont.h deleted file mode 100644 index ae3b43a..0000000 --- a/software/Power_Pico/BSP/LCD/lcdfont.h +++ /dev/null @@ -1,535 +0,0 @@ -#ifndef __LCDFONT_H -#define __LCDFONT_H - -const unsigned char ascii_1206[][12]={ - -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ -{0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x00,0x00},/*"!",1*/ -{0x14,0x14,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/ -{0x00,0x00,0x0A,0x0A,0x1F,0x0A,0x0A,0x1F,0x0A,0x0A,0x00,0x00},/*"#",3*/ -{0x00,0x04,0x0E,0x15,0x05,0x06,0x0C,0x14,0x15,0x0E,0x04,0x00},/*"$",4*/ -{0x00,0x00,0x12,0x15,0x0D,0x15,0x2E,0x2C,0x2A,0x12,0x00,0x00},/*"%",5*/ -{0x00,0x00,0x04,0x0A,0x0A,0x36,0x15,0x15,0x29,0x16,0x00,0x00},/*"&",6*/ -{0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ -{0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x10,0x00},/*"(",8*/ -{0x02,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x02,0x00},/*")",9*/ -{0x00,0x00,0x00,0x04,0x15,0x0E,0x0E,0x15,0x04,0x00,0x00,0x00},/*"*",10*/ -{0x00,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00,0x00,0x00},/*"+",11*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x01,0x00},/*",",12*/ -{0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00},/*".",14*/ -{0x00,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x01,0x00},/*"/",15*/ -{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"0",16*/ -{0x00,0x00,0x04,0x06,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"1",17*/ -{0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x02,0x01,0x1F,0x00,0x00},/*"2",18*/ -{0x00,0x00,0x0E,0x11,0x10,0x0C,0x10,0x10,0x11,0x0E,0x00,0x00},/*"3",19*/ -{0x00,0x00,0x08,0x0C,0x0C,0x0A,0x09,0x1F,0x08,0x1C,0x00,0x00},/*"4",20*/ -{0x00,0x00,0x1F,0x01,0x01,0x0F,0x11,0x10,0x11,0x0E,0x00,0x00},/*"5",21*/ -{0x00,0x00,0x0C,0x12,0x01,0x0D,0x13,0x11,0x11,0x0E,0x00,0x00},/*"6",22*/ -{0x00,0x00,0x1E,0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x00,0x00},/*"7",23*/ -{0x00,0x00,0x0E,0x11,0x11,0x0E,0x11,0x11,0x11,0x0E,0x00,0x00},/*"8",24*/ -{0x00,0x00,0x0E,0x11,0x11,0x19,0x16,0x10,0x09,0x06,0x00,0x00},/*"9",25*/ -{0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00},/*":",26*/ -{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x04,0x00},/*";",27*/ -{0x00,0x00,0x10,0x08,0x04,0x02,0x02,0x04,0x08,0x10,0x00,0x00},/*"<",28*/ -{0x00,0x00,0x00,0x00,0x3F,0x00,0x3F,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ -{0x00,0x00,0x02,0x04,0x08,0x10,0x10,0x08,0x04,0x02,0x00,0x00},/*">",30*/ -{0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x04,0x00,0x04,0x00,0x00},/*"?",31*/ -{0x00,0x00,0x1C,0x22,0x29,0x2D,0x2D,0x1D,0x22,0x1C,0x00,0x00},/*"@",32*/ -{0x00,0x00,0x04,0x04,0x0C,0x0A,0x0A,0x1E,0x12,0x33,0x00,0x00},/*"A",33*/ -{0x00,0x00,0x0F,0x12,0x12,0x0E,0x12,0x12,0x12,0x0F,0x00,0x00},/*"B",34*/ -{0x00,0x00,0x1E,0x11,0x01,0x01,0x01,0x01,0x11,0x0E,0x00,0x00},/*"C",35*/ -{0x00,0x00,0x0F,0x12,0x12,0x12,0x12,0x12,0x12,0x0F,0x00,0x00},/*"D",36*/ -{0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x12,0x1F,0x00,0x00},/*"E",37*/ -{0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x02,0x07,0x00,0x00},/*"F",38*/ -{0x00,0x00,0x1C,0x12,0x01,0x01,0x39,0x11,0x12,0x0C,0x00,0x00},/*"G",39*/ -{0x00,0x00,0x33,0x12,0x12,0x1E,0x12,0x12,0x12,0x33,0x00,0x00},/*"H",40*/ -{0x00,0x00,0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"I",41*/ -{0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x07},/*"J",42*/ -{0x00,0x00,0x37,0x12,0x0A,0x06,0x0A,0x12,0x12,0x37,0x00,0x00},/*"K",43*/ -{0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x22,0x3F,0x00,0x00},/*"L",44*/ -{0x00,0x00,0x3B,0x1B,0x1B,0x1B,0x15,0x15,0x15,0x35,0x00,0x00},/*"M",45*/ -{0x00,0x00,0x3B,0x12,0x16,0x16,0x1A,0x1A,0x12,0x17,0x00,0x00},/*"N",46*/ -{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"O",47*/ -{0x00,0x00,0x0F,0x12,0x12,0x0E,0x02,0x02,0x02,0x07,0x00,0x00},/*"P",48*/ -{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x17,0x19,0x0E,0x18,0x00},/*"Q",49*/ -{0x00,0x00,0x0F,0x12,0x12,0x0E,0x0A,0x12,0x12,0x37,0x00,0x00},/*"R",50*/ -{0x00,0x00,0x1E,0x11,0x01,0x06,0x08,0x10,0x11,0x0F,0x00,0x00},/*"S",51*/ -{0x00,0x00,0x1F,0x15,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"T",52*/ -{0x00,0x00,0x33,0x12,0x12,0x12,0x12,0x12,0x12,0x0C,0x00,0x00},/*"U",53*/ -{0x00,0x00,0x33,0x12,0x12,0x0A,0x0A,0x0C,0x04,0x04,0x00,0x00},/*"V",54*/ -{0x00,0x00,0x15,0x15,0x15,0x15,0x0E,0x0A,0x0A,0x0A,0x00,0x00},/*"W",55*/ -{0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x0A,0x0A,0x1B,0x00,0x00},/*"X",56*/ -{0x00,0x00,0x1B,0x0A,0x0A,0x0A,0x04,0x04,0x04,0x0E,0x00,0x00},/*"Y",57*/ -{0x00,0x00,0x1F,0x09,0x08,0x04,0x04,0x02,0x12,0x1F,0x00,0x00},/*"Z",58*/ -{0x1C,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1C,0x00},/*"[",59*/ -{0x00,0x02,0x02,0x04,0x04,0x04,0x08,0x08,0x08,0x10,0x10,0x00},/*"\",60*/ -{0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0E,0x00},/*"]",61*/ -{0x04,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F},/*"_",63*/ -{0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ -{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1C,0x12,0x3C,0x00,0x00},/*"a",65*/ -{0x00,0x03,0x02,0x02,0x02,0x0E,0x12,0x12,0x12,0x0E,0x00,0x00},/*"b",66*/ -{0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x02,0x12,0x0C,0x00,0x00},/*"c",67*/ -{0x00,0x18,0x10,0x10,0x10,0x1C,0x12,0x12,0x12,0x3C,0x00,0x00},/*"d",68*/ -{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1E,0x02,0x1C,0x00,0x00},/*"e",69*/ -{0x00,0x18,0x24,0x04,0x04,0x1E,0x04,0x04,0x04,0x1E,0x00,0x00},/*"f",70*/ -{0x00,0x00,0x00,0x00,0x00,0x3C,0x12,0x0C,0x02,0x1C,0x22,0x1C},/*"g",71*/ -{0x00,0x03,0x02,0x02,0x02,0x0E,0x12,0x12,0x12,0x37,0x00,0x00},/*"h",72*/ -{0x00,0x04,0x04,0x00,0x00,0x06,0x04,0x04,0x04,0x0E,0x00,0x00},/*"i",73*/ -{0x00,0x08,0x08,0x00,0x00,0x0C,0x08,0x08,0x08,0x08,0x08,0x07},/*"j",74*/ -{0x00,0x03,0x02,0x02,0x02,0x1A,0x0A,0x06,0x0A,0x13,0x00,0x00},/*"k",75*/ -{0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"l",76*/ -{0x00,0x00,0x00,0x00,0x00,0x0F,0x15,0x15,0x15,0x15,0x00,0x00},/*"m",77*/ -{0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x37,0x00,0x00},/*"n",78*/ -{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x12,0x12,0x0C,0x00,0x00},/*"o",79*/ -{0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x0E,0x02,0x07},/*"p",80*/ -{0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x12,0x12,0x1C,0x10,0x38},/*"q",81*/ -{0x00,0x00,0x00,0x00,0x00,0x1B,0x06,0x02,0x02,0x07,0x00,0x00},/*"r",82*/ -{0x00,0x00,0x00,0x00,0x00,0x1E,0x02,0x0C,0x10,0x1E,0x00,0x00},/*"s",83*/ -{0x00,0x00,0x00,0x04,0x04,0x1E,0x04,0x04,0x04,0x1C,0x00,0x00},/*"t",84*/ -{0x00,0x00,0x00,0x00,0x00,0x1B,0x12,0x12,0x12,0x3C,0x00,0x00},/*"u",85*/ -{0x00,0x00,0x00,0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x00,0x00},/*"v",86*/ -{0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x0E,0x0A,0x0A,0x00,0x00},/*"w",87*/ -{0x00,0x00,0x00,0x00,0x00,0x1B,0x0A,0x04,0x0A,0x1B,0x00,0x00},/*"x",88*/ -{0x00,0x00,0x00,0x00,0x00,0x33,0x12,0x12,0x0C,0x08,0x04,0x03},/*"y",89*/ -{0x00,0x00,0x00,0x00,0x00,0x1E,0x08,0x04,0x04,0x1E,0x00,0x00},/*"z",90*/ -{0x18,0x08,0x08,0x08,0x08,0x0C,0x08,0x08,0x08,0x08,0x18,0x00},/*"{",91*/ -{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},/*"|",92*/ -{0x06,0x04,0x04,0x04,0x04,0x08,0x04,0x04,0x04,0x04,0x06,0x00},/*"}",93*/ -{0x16,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ -}; - -const unsigned char ascii_1608[][16]={ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ -{0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x18,0x18,0x00,0x00},/*"!",1*/ -{0x00,0x48,0x6C,0x24,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/ -{0x00,0x00,0x00,0x24,0x24,0x24,0x7F,0x12,0x12,0x12,0x7F,0x12,0x12,0x12,0x00,0x00},/*"#",3*/ -{0x00,0x00,0x08,0x1C,0x2A,0x2A,0x0A,0x0C,0x18,0x28,0x28,0x2A,0x2A,0x1C,0x08,0x08},/*"$",4*/ -{0x00,0x00,0x00,0x22,0x25,0x15,0x15,0x15,0x2A,0x58,0x54,0x54,0x54,0x22,0x00,0x00},/*"%",5*/ -{0x00,0x00,0x00,0x0C,0x12,0x12,0x12,0x0A,0x76,0x25,0x29,0x11,0x91,0x6E,0x00,0x00},/*"&",6*/ -{0x00,0x06,0x06,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ -{0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x00},/*"(",8*/ -{0x00,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x04,0x02,0x00},/*")",9*/ -{0x00,0x00,0x00,0x00,0x08,0x08,0x6B,0x1C,0x1C,0x6B,0x08,0x08,0x00,0x00,0x00,0x00},/*"*",10*/ -{0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x7F,0x08,0x08,0x08,0x08,0x00,0x00,0x00},/*"+",11*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x04,0x03},/*",",12*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00},/*".",14*/ -{0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x00},/*"/",15*/ -{0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*"0",16*/ -{0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"1",17*/ -{0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00},/*"2",18*/ -{0x00,0x00,0x00,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,0x22,0x1C,0x00,0x00},/*"3",19*/ -{0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,0x20,0x78,0x00,0x00},/*"4",20*/ -{0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,0x22,0x1C,0x00,0x00},/*"5",21*/ -{0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*"6",22*/ -{0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00},/*"7",23*/ -{0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00},/*"8",24*/ -{0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,0x24,0x1C,0x00,0x00},/*"9",25*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00},/*":",26*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x04},/*";",27*/ -{0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x40,0x00,0x00},/*"<",28*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ -{0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00},/*">",30*/ -{0x00,0x00,0x00,0x3C,0x42,0x42,0x46,0x40,0x20,0x10,0x10,0x00,0x18,0x18,0x00,0x00},/*"?",31*/ -{0x00,0x00,0x00,0x1C,0x22,0x5A,0x55,0x55,0x55,0x55,0x2D,0x42,0x22,0x1C,0x00,0x00},/*"@",32*/ -{0x00,0x00,0x00,0x08,0x08,0x18,0x14,0x14,0x24,0x3C,0x22,0x42,0x42,0xE7,0x00,0x00},/*"A",33*/ -{0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x1E,0x22,0x42,0x42,0x42,0x22,0x1F,0x00,0x00},/*"B",34*/ -{0x00,0x00,0x00,0x7C,0x42,0x42,0x01,0x01,0x01,0x01,0x01,0x42,0x22,0x1C,0x00,0x00},/*"C",35*/ -{0x00,0x00,0x00,0x1F,0x22,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x22,0x1F,0x00,0x00},/*"D",36*/ -{0x00,0x00,0x00,0x3F,0x42,0x12,0x12,0x1E,0x12,0x12,0x02,0x42,0x42,0x3F,0x00,0x00},/*"E",37*/ -{0x00,0x00,0x00,0x3F,0x42,0x12,0x12,0x1E,0x12,0x12,0x02,0x02,0x02,0x07,0x00,0x00},/*"F",38*/ -{0x00,0x00,0x00,0x3C,0x22,0x22,0x01,0x01,0x01,0x71,0x21,0x22,0x22,0x1C,0x00,0x00},/*"G",39*/ -{0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"H",40*/ -{0x00,0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"I",41*/ -{0x00,0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x0F},/*"J",42*/ -{0x00,0x00,0x00,0x77,0x22,0x12,0x0A,0x0E,0x0A,0x12,0x12,0x22,0x22,0x77,0x00,0x00},/*"K",43*/ -{0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x7F,0x00,0x00},/*"L",44*/ -{0x00,0x00,0x00,0x77,0x36,0x36,0x36,0x36,0x2A,0x2A,0x2A,0x2A,0x2A,0x6B,0x00,0x00},/*"M",45*/ -{0x00,0x00,0x00,0xE3,0x46,0x46,0x4A,0x4A,0x52,0x52,0x52,0x62,0x62,0x47,0x00,0x00},/*"N",46*/ -{0x00,0x00,0x00,0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x22,0x1C,0x00,0x00},/*"O",47*/ -{0x00,0x00,0x00,0x3F,0x42,0x42,0x42,0x42,0x3E,0x02,0x02,0x02,0x02,0x07,0x00,0x00},/*"P",48*/ -{0x00,0x00,0x00,0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x4D,0x53,0x32,0x1C,0x60,0x00},/*"Q",49*/ -{0x00,0x00,0x00,0x3F,0x42,0x42,0x42,0x3E,0x12,0x12,0x22,0x22,0x42,0xC7,0x00,0x00},/*"R",50*/ -{0x00,0x00,0x00,0x7C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x42,0x42,0x3E,0x00,0x00},/*"S",51*/ -{0x00,0x00,0x00,0x7F,0x49,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00},/*"T",52*/ -{0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00},/*"U",53*/ -{0x00,0x00,0x00,0xE7,0x42,0x42,0x22,0x24,0x24,0x14,0x14,0x18,0x08,0x08,0x00,0x00},/*"V",54*/ -{0x00,0x00,0x00,0x6B,0x49,0x49,0x49,0x49,0x55,0x55,0x36,0x22,0x22,0x22,0x00,0x00},/*"W",55*/ -{0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x18,0x18,0x18,0x24,0x24,0x42,0xE7,0x00,0x00},/*"X",56*/ -{0x00,0x00,0x00,0x77,0x22,0x22,0x14,0x14,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00},/*"Y",57*/ -{0x00,0x00,0x00,0x7E,0x21,0x20,0x10,0x10,0x08,0x04,0x04,0x42,0x42,0x3F,0x00,0x00},/*"Z",58*/ -{0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78,0x00},/*"[",59*/ -{0x00,0x00,0x02,0x02,0x04,0x04,0x08,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x40,0x40},/*"\",60*/ -{0x00,0x1E,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1E,0x00},/*"]",61*/ -{0x00,0x38,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF},/*"_",63*/ -{0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x78,0x44,0x42,0x42,0xFC,0x00,0x00},/*"a",65*/ -{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x26,0x1A,0x00,0x00},/*"b",66*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x02,0x02,0x02,0x44,0x38,0x00,0x00},/*"c",67*/ -{0x00,0x00,0x00,0x60,0x40,0x40,0x40,0x78,0x44,0x42,0x42,0x42,0x64,0xD8,0x00,0x00},/*"d",68*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x7E,0x02,0x02,0x42,0x3C,0x00,0x00},/*"e",69*/ -{0x00,0x00,0x00,0xF0,0x88,0x08,0x08,0x7E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"f",70*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x22,0x22,0x1C,0x02,0x3C,0x42,0x42,0x3C},/*"g",71*/ -{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x3A,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"h",72*/ -{0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"i",73*/ -{0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x1E},/*"j",74*/ -{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x72,0x12,0x0A,0x16,0x12,0x22,0x77,0x00,0x00},/*"k",75*/ -{0x00,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"l",76*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x92,0x92,0x92,0x92,0x92,0xB7,0x00,0x00},/*"m",77*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"n",78*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00},/*"o",79*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0x26,0x42,0x42,0x42,0x22,0x1E,0x02,0x07},/*"p",80*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x42,0x42,0x42,0x44,0x78,0x40,0xE0},/*"q",81*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x4C,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"r",82*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x42,0x02,0x3C,0x40,0x42,0x3E,0x00,0x00},/*"s",83*/ -{0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00},/*"t",84*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x42,0x42,0x42,0x42,0x62,0xDC,0x00,0x00},/*"u",85*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x14,0x08,0x08,0x00,0x00},/*"v",86*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEB,0x49,0x49,0x55,0x55,0x22,0x22,0x00,0x00},/*"w",87*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x24,0x18,0x18,0x18,0x24,0x6E,0x00,0x00},/*"x",88*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x14,0x18,0x08,0x08,0x07},/*"y",89*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x22,0x10,0x08,0x08,0x44,0x7E,0x00,0x00},/*"z",90*/ -{0x00,0xC0,0x20,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0xC0,0x00},/*"{",91*/ -{0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10},/*"|",92*/ -{0x00,0x06,0x08,0x08,0x08,0x08,0x08,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x00},/*"}",93*/ -{0x0C,0x32,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ -}; -const unsigned char ascii_2412[][48]={ -{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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/ -{0x00,0x00,0x00,0x00,0x60,0x06,0x60,0x06,0x30,0x03,0x98,0x01,0x88,0x00,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,0x00,0x00,0x00,0x00,0x00},/*""",2*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0xFE,0x07,0xFE,0x07,0x08,0x02,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0xFE,0x07,0xFE,0x07,0x04,0x01,0x04,0x01,0x04,0x01,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"#",3*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0xF0,0x01,0x58,0x03,0x4C,0x03,0xCC,0x03,0x4C,0x00,0x58,0x00,0x70,0x00,0xE0,0x00,0xC0,0x01,0xC0,0x01,0x40,0x03,0x4C,0x03,0x5C,0x03,0x4C,0x03,0x48,0x01,0xF0,0x00,0x40,0x00,0x40,0x00,0x00,0x00},/*"$",4*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x01,0x0A,0x01,0x91,0x00,0x91,0x00,0x91,0x00,0x51,0x00,0x51,0x00,0x3A,0x00,0xAE,0x03,0xA0,0x02,0x50,0x04,0x50,0x04,0x48,0x04,0x48,0x04,0x48,0x04,0x84,0x02,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"%",5*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x2C,0x00,0x98,0x07,0x1C,0x01,0x1A,0x01,0x33,0x01,0x33,0x01,0x63,0x01,0xE3,0x00,0xC3,0x08,0xC6,0x09,0x3C,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"&",6*/ -{0x00,0x00,0x00,0x00,0x0C,0x00,0x1C,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,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,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ -{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x80,0x00,0x80,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00},/*"(",8*/ -{0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00,0x00},/*")",9*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xC0,0x00,0x40,0x00,0x46,0x0C,0x4E,0x0F,0xD0,0x01,0xF0,0x01,0x5E,0x0F,0x46,0x0C,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"*",10*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0xFE,0x0F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"+",11*/ -{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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1C,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,0x00},/*",",12*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/ -{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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/ -{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x01,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x00,0x00},/*"/",15*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0x0C,0x03,0x98,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"0",16*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x7C,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"1",17*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x84,0x01,0x02,0x03,0x06,0x03,0x06,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0xC0,0x00,0x60,0x00,0x20,0x00,0x10,0x00,0x08,0x02,0x04,0x02,0x06,0x02,0xFE,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"2",18*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0xC6,0x00,0x86,0x01,0x86,0x01,0x80,0x01,0x80,0x01,0xC0,0x00,0x70,0x00,0x80,0x01,0x00,0x01,0x00,0x03,0x00,0x03,0x06,0x03,0x06,0x03,0x86,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"3",19*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0xC0,0x01,0xA0,0x01,0xA0,0x01,0x90,0x01,0x88,0x01,0x88,0x01,0x84,0x01,0x82,0x01,0xFE,0x0F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"4",20*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xF4,0x00,0x8C,0x01,0x04,0x03,0x00,0x03,0x00,0x03,0x06,0x03,0x06,0x03,0x82,0x01,0x84,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"5",21*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x18,0x03,0x0C,0x03,0x0C,0x00,0x04,0x00,0x06,0x00,0xE6,0x01,0x16,0x03,0x0E,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x0C,0x02,0x18,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"6",22*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x0C,0x06,0x04,0x02,0x04,0x01,0x00,0x01,0x00,0x01,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"7",23*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x02,0x1C,0x03,0xF0,0x00,0xC8,0x01,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"8",24*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x0C,0x01,0x0C,0x03,0x06,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x8C,0x06,0x78,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x0C,0x01,0x8C,0x01,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"9",25*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x40,0x00,0x20,0x00,0x20,0x00},/*";",27*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00},/*"<",28*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*">",30*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x06,0x04,0x0C,0x04,0x0C,0x0C,0x0C,0x0C,0x0C,0x00,0x07,0x80,0x01,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"?",31*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x18,0x03,0x0C,0x02,0xCC,0x05,0x64,0x05,0x66,0x05,0xA6,0x05,0xB6,0x04,0xB6,0x04,0xB6,0x04,0xB6,0x04,0xB6,0x02,0xE4,0x01,0x0C,0x04,0x0C,0x02,0x18,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"@",32*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x50,0x00,0xD0,0x00,0x90,0x00,0x90,0x00,0x88,0x00,0x88,0x01,0x08,0x01,0xF8,0x01,0x04,0x03,0x04,0x03,0x04,0x02,0x02,0x02,0x02,0x06,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00},/*"A",33*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x8C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x8C,0x01,0xFC,0x00,0x0C,0x03,0x0C,0x02,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x03,0xFE,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"B",34*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x03,0x0C,0x06,0x0C,0x04,0x04,0x04,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x04,0x0C,0x04,0x0C,0x02,0x18,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"C",35*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x8C,0x01,0x0C,0x03,0x0C,0x03,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x03,0x0C,0x03,0x8C,0x01,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"D",36*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x06,0x03,0x06,0x04,0x06,0x04,0x06,0x00,0x86,0x00,0x86,0x00,0xFE,0x00,0x86,0x00,0x86,0x00,0x86,0x00,0x06,0x00,0x06,0x04,0x06,0x04,0x06,0x02,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"E",37*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x06,0x03,0x06,0x04,0x06,0x04,0x06,0x00,0x86,0x00,0x86,0x00,0xFE,0x00,0x86,0x00,0x86,0x00,0x86,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"F",38*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x18,0x01,0x0C,0x02,0x0C,0x02,0x04,0x02,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xC6,0x0F,0x06,0x03,0x06,0x03,0x0C,0x03,0x0C,0x03,0x18,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"G",39*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xFE,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00},/*"H",40*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"I",41*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC6,0x00,0x66,0x00,0x3C,0x00},/*"J",42*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x03,0x86,0x01,0xC6,0x00,0x46,0x00,0x26,0x00,0x16,0x00,0x36,0x00,0x2E,0x00,0x6E,0x00,0x46,0x00,0xC6,0x00,0x86,0x00,0x86,0x01,0x06,0x01,0x06,0x03,0x8F,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"K",43*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x04,0x06,0x04,0x06,0x02,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"L",44*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x86,0x03,0x86,0x03,0x8E,0x03,0x8E,0x03,0x4E,0x03,0x4E,0x03,0x4A,0x03,0x5A,0x03,0x5A,0x03,0x3A,0x03,0x32,0x03,0x32,0x03,0x32,0x03,0x12,0x03,0x87,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"M",45*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8E,0x0F,0x0C,0x02,0x1C,0x02,0x1C,0x02,0x34,0x02,0x34,0x02,0x64,0x02,0x64,0x02,0x44,0x02,0xC4,0x02,0x84,0x02,0x84,0x03,0x84,0x03,0x04,0x03,0x04,0x03,0x1F,0x02,0x00,0x00,0x00,0x00,0x00,0x00},/*"N",46*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x0C,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x02,0x0C,0x03,0x98,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"O",47*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x06,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x86,0x03,0xFE,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"P",48*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x0C,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x76,0x06,0x4C,0x02,0xCC,0x03,0x98,0x01,0xF0,0x00,0x80,0x07,0x00,0x03,0x00,0x00},/*"Q",49*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x06,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0xFE,0x00,0x46,0x00,0xC6,0x00,0x86,0x00,0x86,0x01,0x06,0x03,0x06,0x03,0x06,0x06,0x0F,0x0E,0x00,0x00,0x00,0x00,0x00,0x00},/*"R",50*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x02,0x0C,0x03,0x06,0x02,0x06,0x02,0x06,0x00,0x0E,0x00,0x3C,0x00,0xF8,0x00,0xE0,0x03,0x80,0x03,0x00,0x07,0x02,0x06,0x02,0x06,0x06,0x06,0x0C,0x03,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"S",51*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x62,0x04,0x61,0x08,0x61,0x08,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"T",52*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x07,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x18,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"U",53*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x07,0x06,0x02,0x04,0x01,0x04,0x01,0x0C,0x01,0x0C,0x01,0x88,0x00,0x88,0x00,0x98,0x00,0x98,0x00,0x50,0x00,0x50,0x00,0x70,0x00,0x30,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"V",54*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF7,0x0E,0x62,0x04,0x42,0x04,0x46,0x04,0x46,0x04,0x64,0x02,0x64,0x02,0xE4,0x02,0xE4,0x02,0x9C,0x02,0x9C,0x01,0x98,0x01,0x98,0x01,0x88,0x01,0x88,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"W",55*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x07,0x0C,0x01,0x08,0x01,0x18,0x01,0x90,0x00,0xB0,0x00,0x60,0x00,0x20,0x00,0x60,0x00,0x60,0x00,0xD0,0x00,0x90,0x00,0x88,0x01,0x08,0x01,0x04,0x03,0x8E,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"X",56*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x06,0x04,0x04,0x02,0x0C,0x02,0x08,0x01,0x18,0x01,0xB8,0x00,0xB0,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"Y",57*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0x0C,0x02,0x06,0x03,0x02,0x01,0x80,0x01,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x18,0x00,0x08,0x04,0x0C,0x04,0x04,0x02,0xFE,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"Z",58*/ -{0x00,0x00,0x00,0x00,0xE0,0x03,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0xE0,0x03,0x00,0x00},/*"[",59*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0xC0,0x00,0x80,0x00,0x80,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04},/*"\",60*/ -{0x00,0x00,0x00,0x00,0x7C,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7C,0x00,0x00,0x00},/*"]",61*/ -{0x00,0x00,0x60,0x00,0x90,0x00,0x08,0x01,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ -{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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F},/*"_",63*/ -{0x00,0x00,0x00,0x00,0x18,0x00,0x60,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x0C,0x03,0x0C,0x03,0x00,0x03,0xE0,0x03,0x1C,0x03,0x0E,0x03,0x06,0x03,0x06,0x03,0x8E,0x0B,0x7C,0x0E,0x00,0x00,0x00,0x00,0x00,0x00},/*"a",65*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0xCC,0x01,0x3C,0x03,0x1C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x02,0x1C,0x03,0xE4,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"b",66*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x8C,0x01,0x8C,0x01,0x86,0x01,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x02,0x0C,0x02,0x0C,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"c",67*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xC0,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x78,0x03,0x8C,0x03,0x0C,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x04,0x03,0x8C,0x07,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"d",68*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x18,0x03,0x08,0x02,0x0C,0x06,0x0C,0x06,0xFC,0x07,0x0C,0x00,0x0C,0x00,0x18,0x04,0x18,0x02,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"e",69*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x60,0x06,0x30,0x06,0x30,0x00,0x30,0x00,0xFE,0x01,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"f",70*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0xD8,0x06,0x8C,0x01,0x8C,0x01,0x8C,0x01,0x98,0x01,0xF8,0x00,0x0C,0x00,0xFC,0x00,0xCC,0x03,0x06,0x03,0x06,0x03,0x8E,0x03,0xF8,0x00},/*"g",71*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0xEC,0x01,0x1C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x9E,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"h",72*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x7C,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"i",73*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xCC,0x00,0x7C,0x00},/*"j",74*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x8C,0x03,0x8C,0x00,0x8C,0x00,0x4C,0x00,0x6C,0x00,0x5C,0x00,0x8C,0x00,0x8C,0x01,0x0C,0x01,0x0C,0x03,0x9E,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"k",75*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x7C,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"l",76*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x07,0xEE,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00},/*"m",77*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x01,0x1C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x9E,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"n",78*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0x0C,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"o",79*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x01,0x1C,0x03,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x03,0x1C,0x03,0xEC,0x01,0x0C,0x00,0x0C,0x00,0x3E,0x00},/*"p",80*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x8C,0x03,0x0C,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x04,0x03,0x8C,0x03,0x78,0x03,0x00,0x03,0x00,0x03,0xC0,0x07},/*"q",81*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x03,0x58,0x06,0x38,0x06,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"r",82*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x03,0x1C,0x03,0x0C,0x02,0x0C,0x02,0x38,0x00,0xF0,0x00,0xC0,0x03,0x04,0x03,0x04,0x03,0x8C,0x03,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"s",83*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x30,0x00,0x30,0x00,0xFE,0x01,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x02,0x30,0x02,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"t",84*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x8E,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x9C,0x07,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"u",85*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x07,0x0C,0x02,0x08,0x01,0x08,0x01,0x18,0x01,0x90,0x00,0xB0,0x00,0xB0,0x00,0x60,0x00,0x60,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"v",86*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF7,0x0E,0x62,0x04,0x46,0x04,0x64,0x02,0x64,0x02,0xEC,0x02,0x9C,0x01,0x98,0x01,0x98,0x01,0x98,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"w",87*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBC,0x07,0x18,0x01,0x10,0x01,0xB0,0x00,0x60,0x00,0x60,0x00,0xE0,0x00,0x90,0x00,0x08,0x01,0x08,0x03,0x9E,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"x",88*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x07,0x08,0x01,0x08,0x01,0x08,0x01,0x90,0x00,0x90,0x00,0xB0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x20,0x00,0x20,0x00,0x24,0x00,0x1C,0x00},/*"y",89*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x84,0x01,0xC4,0x00,0x44,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x18,0x02,0x08,0x02,0x0C,0x03,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"z",90*/ -{0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x40,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x03,0x00,0x00},/*"{",91*/ -{0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00},/*"|",92*/ -{0x00,0x00,0x00,0x00,0x0C,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x0C,0x00,0x00,0x00},/*"}",93*/ -{0x00,0x00,0x1C,0x00,0x22,0x04,0xC2,0x04,0x80,0x03,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ - - -}; -const unsigned char ascii_3216[][64]={ -{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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0xC0,0x03,0xC0,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1C,0xE0,0x1C,0xF0,0x1E,0x70,0x0E,0x38,0x07,0x18,0x03,0x08,0x01,0x84,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0xFE,0x7F,0xFE,0x7F,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0xFE,0x7F,0xFE,0x7F,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"#",3*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xC0,0x07,0x60,0x19,0x10,0x31,0x18,0x31,0x18,0x39,0x18,0x39,0x38,0x01,0x70,0x01,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0F,0x00,0x1D,0x00,0x39,0x00,0x31,0x1C,0x31,0x1C,0x31,0x0C,0x31,0x0C,0x11,0x18,0x0D,0xE0,0x07,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00},/*"$",4*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x10,0x36,0x18,0x63,0x08,0x63,0x0C,0x63,0x04,0x63,0x04,0x63,0x02,0x63,0x02,0x63,0x01,0x36,0x1D,0x9C,0x37,0x80,0x22,0x80,0x63,0x40,0x63,0x40,0x63,0x20,0x63,0x20,0x63,0x30,0x63,0x10,0x22,0x18,0x36,0x08,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"%",5*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x00,0xCC,0x00,0x78,0x00,0x18,0x3E,0x1C,0x08,0x36,0x08,0x32,0x08,0x63,0x04,0x63,0x04,0xC3,0x04,0xC3,0x03,0x83,0x43,0x06,0x43,0x8E,0x26,0x78,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"&",6*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x3C,0x00,0x3C,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x0C,0x00,0x06,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x03,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x00},/*"(",8*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00,0x00},/*")",9*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0x80,0x03,0x00,0x01,0x1C,0x71,0x3C,0x79,0x78,0x3D,0xC0,0x07,0x00,0x01,0xC0,0x07,0x78,0x3D,0x3C,0x79,0x1C,0x71,0x00,0x01,0x80,0x03,0x80,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"*",10*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0xFC,0x7F,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"+",11*/ -{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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x3C,0x00,0x3C,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x0C,0x00,0x06,0x00},/*",",12*/ -{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,0x00,0x00,0x00,0x00,0xFE,0x7F,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,0x00,0x00},/*"-",13*/ -{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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x3C,0x00,0x3C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x10,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0xC0,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x10,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00,0x00},/*"/",15*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x60,0x0C,0x30,0x18,0x18,0x30,0x18,0x30,0x18,0x20,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x18,0x20,0x18,0x30,0x18,0x30,0x30,0x18,0x60,0x0C,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"0",16*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xC0,0x03,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"1",17*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x10,0x1C,0x08,0x18,0x04,0x30,0x04,0x30,0x0C,0x30,0x0C,0x30,0x00,0x30,0x00,0x18,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x20,0x20,0x10,0x20,0x08,0x20,0x04,0x30,0xFC,0x1F,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"2",18*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x0E,0x0C,0x0C,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x00,0x18,0x00,0x0C,0x00,0x06,0xC0,0x03,0x00,0x0E,0x00,0x18,0x00,0x10,0x00,0x30,0x00,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x10,0x0C,0x18,0x18,0x0C,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"3",19*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0E,0x00,0x0E,0x00,0x0F,0x80,0x0E,0x80,0x0E,0x40,0x0E,0x60,0x0E,0x20,0x0E,0x10,0x0E,0x10,0x0E,0x08,0x0E,0x04,0x0E,0x04,0x0E,0xFE,0x7F,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0xC0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"4",20*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0xF0,0x3F,0x10,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0xC8,0x07,0x28,0x0C,0x18,0x18,0x08,0x10,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x0C,0x30,0x0C,0x30,0x04,0x18,0x04,0x18,0x08,0x0C,0xF0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"5",21*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0xC0,0x10,0x20,0x30,0x10,0x30,0x18,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x8C,0x0F,0x6C,0x18,0x3C,0x30,0x1C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x18,0x60,0x18,0x20,0x30,0x30,0x60,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"6",22*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0xF8,0x3F,0x1C,0x10,0x0C,0x08,0x04,0x08,0x04,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"7",23*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x30,0x0C,0x18,0x18,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x1C,0x30,0x38,0x18,0x70,0x08,0xE0,0x07,0xB0,0x07,0x18,0x0E,0x0C,0x1C,0x06,0x38,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x0C,0x18,0x18,0x0C,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"8",24*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x04,0x0C,0x08,0x0C,0x18,0x06,0x10,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x38,0x0C,0x3C,0x18,0x36,0xF0,0x31,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x18,0x0C,0x0C,0x0C,0x06,0x0C,0x03,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"9",25*/ -{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,0x80,0x01,0xC0,0x03,0xC0,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0xC0,0x03,0xC0,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/ -{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,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0xC0,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x00,0x00},/*";",27*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x00,0x80,0x01,0x00,0x03,0x00,0x06,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"<",28*/ -{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,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x60,0x00,0xC0,0x00,0x80,0x01,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*">",30*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x30,0x18,0x08,0x30,0x08,0x60,0x0C,0x60,0x1C,0x60,0x1C,0x60,0x1C,0x60,0x00,0x30,0x00,0x1C,0x00,0x06,0x00,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0xC0,0x03,0xC0,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"?",31*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x60,0x18,0x10,0x30,0x18,0x20,0x0C,0x2F,0x8C,0x4D,0x86,0x4C,0xC6,0x4C,0xC6,0x4C,0x66,0x4C,0x66,0x44,0x66,0x44,0x66,0x26,0x66,0x26,0x66,0x15,0xCC,0x1C,0x0C,0x40,0x08,0x20,0x18,0x30,0x30,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"@",32*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x40,0x01,0x60,0x03,0x20,0x03,0x20,0x03,0x20,0x03,0x30,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0xF8,0x0F,0x08,0x0C,0x08,0x0C,0x08,0x0C,0x0C,0x0C,0x04,0x18,0x04,0x18,0x06,0x18,0x1F,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"A",33*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x18,0x1C,0x18,0x38,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x18,0x18,0x0C,0xF8,0x07,0x18,0x18,0x18,0x30,0x18,0x20,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x30,0x18,0x18,0xFE,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"B",34*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x27,0x60,0x38,0x10,0x30,0x18,0x20,0x0C,0x40,0x0C,0x40,0x04,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0C,0x40,0x0C,0x40,0x0C,0x20,0x18,0x30,0x30,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"C",35*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x18,0x0E,0x18,0x18,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x30,0x18,0x30,0x18,0x10,0x18,0x18,0x18,0x0E,0xFE,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"D",36*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x18,0x30,0x18,0x20,0x18,0x60,0x18,0x40,0x18,0x00,0x18,0x08,0x18,0x08,0x18,0x0C,0xF8,0x0F,0x18,0x0C,0x18,0x08,0x18,0x08,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x40,0x18,0x40,0x18,0x20,0x18,0x30,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"E",37*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x18,0x70,0x18,0x40,0x18,0xC0,0x18,0x80,0x18,0x00,0x18,0x10,0x18,0x10,0x18,0x18,0xF8,0x1F,0x18,0x18,0x18,0x10,0x18,0x10,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"F",38*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x13,0x70,0x1C,0x10,0x10,0x18,0x10,0x0C,0x20,0x0C,0x20,0x04,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0xFC,0x06,0x30,0x06,0x30,0x0C,0x30,0x0C,0x30,0x18,0x30,0x18,0x30,0x30,0x08,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"G",39*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x7E,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0xFC,0x1F,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x3F,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"H",40*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"I",41*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x7F,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x0E,0x06,0x0E,0x03,0x8E,0x01,0xFC,0x00},/*"J",42*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x7C,0x18,0x18,0x18,0x08,0x18,0x04,0x18,0x06,0x18,0x02,0x18,0x01,0x98,0x01,0x98,0x01,0xD8,0x01,0xB8,0x03,0x38,0x03,0x18,0x07,0x18,0x06,0x18,0x0E,0x18,0x0C,0x18,0x1C,0x18,0x18,0x18,0x30,0x18,0x30,0x7E,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"K",43*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x40,0x18,0x40,0x18,0x20,0x18,0x30,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"L",44*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x3C,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x36,0x74,0x32,0x64,0x32,0x64,0x32,0x64,0x32,0x64,0x31,0xC4,0x31,0xC4,0x31,0xC4,0x31,0xC4,0x30,0xC4,0x30,0x84,0x30,0x9F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"M",45*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x7C,0x1C,0x10,0x3C,0x10,0x34,0x10,0x34,0x10,0x74,0x10,0x64,0x10,0xE4,0x10,0xC4,0x10,0xC4,0x11,0x84,0x11,0x84,0x13,0x04,0x13,0x04,0x17,0x04,0x16,0x04,0x1E,0x04,0x1C,0x04,0x1C,0x04,0x1C,0x04,0x18,0x1F,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"N",46*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x30,0x0C,0x18,0x18,0x08,0x10,0x0C,0x30,0x0C,0x30,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x0C,0x20,0x0C,0x30,0x08,0x10,0x18,0x18,0x30,0x0C,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"O",47*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x18,0x18,0x18,0x30,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x30,0x18,0x18,0xF8,0x0F,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"P",48*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x30,0x0C,0x18,0x18,0x0C,0x10,0x0C,0x30,0x0C,0x20,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0xE4,0x61,0x2C,0x33,0x1C,0x32,0x18,0x16,0x30,0x0E,0xC0,0x07,0x00,0x4C,0x00,0x7C,0x00,0x38,0x00,0x00,0x00,0x00},/*"Q",49*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x18,0x1C,0x18,0x38,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x18,0x18,0x0C,0xF8,0x07,0x98,0x03,0x18,0x03,0x18,0x07,0x18,0x06,0x18,0x06,0x18,0x0E,0x18,0x0C,0x18,0x0C,0x18,0x1C,0x18,0x18,0x7E,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"R",50*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x27,0x30,0x38,0x18,0x30,0x0C,0x20,0x0C,0x20,0x0C,0x00,0x0C,0x00,0x18,0x00,0x78,0x00,0xE0,0x03,0x80,0x0F,0x00,0x1E,0x00,0x38,0x00,0x70,0x00,0x60,0x04,0x60,0x04,0x60,0x08,0x60,0x18,0x30,0x38,0x18,0xC8,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"S",51*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x3F,0x8C,0x21,0x84,0x61,0x82,0x41,0x82,0x41,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"T",52*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x7C,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x08,0x08,0x38,0x04,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"U",53*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0xF8,0x18,0x20,0x18,0x20,0x18,0x20,0x30,0x10,0x30,0x10,0x30,0x10,0x30,0x10,0x60,0x08,0x60,0x08,0x60,0x08,0xE0,0x0C,0xC0,0x04,0xC0,0x04,0xC0,0x04,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"V",54*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xF3,0x86,0x61,0x86,0x21,0x86,0x21,0x8C,0x21,0x0C,0x21,0x8C,0x23,0x8C,0x13,0x8C,0x13,0x8C,0x13,0x4C,0x13,0x58,0x12,0x58,0x16,0x58,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x30,0x0C,0x10,0x04,0x10,0x04,0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"W",55*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x3E,0x18,0x08,0x38,0x08,0x30,0x04,0x30,0x04,0x70,0x02,0x60,0x02,0xE0,0x01,0xC0,0x01,0xC0,0x01,0x80,0x01,0x80,0x03,0x40,0x03,0x40,0x07,0x20,0x06,0x20,0x06,0x10,0x0C,0x10,0x0C,0x08,0x18,0x08,0x18,0x3E,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"X",56*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x7C,0x1C,0x10,0x18,0x10,0x18,0x08,0x30,0x08,0x30,0x0C,0x70,0x04,0x60,0x04,0x60,0x02,0xC0,0x02,0xC0,0x02,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"Y",57*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x18,0x18,0x08,0x18,0x04,0x0C,0x04,0x0E,0x00,0x06,0x00,0x07,0x00,0x03,0x80,0x03,0x80,0x01,0xC0,0x01,0xC0,0x00,0xE0,0x00,0x60,0x00,0x70,0x00,0x30,0x00,0x38,0x20,0x18,0x20,0x1C,0x10,0x0C,0x18,0xFE,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"Z",58*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0xC0,0x3F,0x00,0x00,0x00,0x00},/*"[",59*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x18,0x00,0x18,0x00,0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0x60,0x00,0x40,0x00,0xC0,0x00,0x80,0x00,0x80,0x01,0x80,0x01,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x04,0x00,0x0C,0x00,0x08,0x00,0x18,0x00,0x18,0x00,0x10,0x00,0x30,0x00,0x20,0x00,0x00},/*"\",60*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0xFC,0x03,0x00,0x00,0x00,0x00},/*"]",61*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0xC0,0x06,0x20,0x08,0x10,0x10,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ -{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,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,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF},/*"_",63*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0xC0,0x00,0x00,0x01,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ -{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,0xF0,0x03,0x18,0x06,0x0C,0x0C,0x0C,0x0C,0x00,0x0C,0x80,0x0F,0x70,0x0C,0x1C,0x0C,0x0C,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x4C,0x0C,0x4F,0xF8,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"a",65*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x0F,0xD8,0x18,0x38,0x30,0x38,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x20,0x38,0x30,0x78,0x18,0xC8,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"b",66*/ -{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,0xC0,0x07,0x70,0x0C,0x18,0x18,0x18,0x18,0x0C,0x18,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x20,0x18,0x20,0x18,0x10,0x30,0x08,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"c",67*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0xE0,0x1B,0x30,0x1C,0x18,0x18,0x18,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x08,0x18,0x18,0x1C,0x30,0x7A,0xE0,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"d",68*/ -{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,0xC0,0x07,0x30,0x0C,0x18,0x18,0x08,0x10,0x0C,0x30,0x0C,0x30,0xFC,0x3F,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x20,0x18,0x10,0x70,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"e",69*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x80,0xC3,0x80,0xC0,0xC0,0xC0,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xFC,0x1F,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xF8,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"f",70*/ -{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,0xC0,0x77,0x30,0x6C,0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x10,0x18,0x30,0x0C,0xF0,0x07,0x18,0x00,0x18,0x00,0xF0,0x0F,0xF0,0x3F,0x08,0x70,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x38,0x38,0xE0,0x0F},/*"g",71*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x98,0x0F,0xD8,0x18,0x38,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x7E,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"h",72*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"i",73*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x80,0x1F,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x18,0x0C,0x18,0x06,0xF0,0x03},/*"j",74*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x3E,0x18,0x0C,0x18,0x06,0x18,0x03,0x18,0x01,0x98,0x01,0xD8,0x01,0x38,0x03,0x18,0x07,0x18,0x06,0x18,0x0C,0x18,0x1C,0x18,0x18,0x7E,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"k",75*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"l",76*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0xEE,0x1C,0x9C,0x33,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0xDE,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"m",77*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x0F,0xD8,0x18,0x38,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x7E,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"n",78*/ -{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,0xC0,0x07,0x70,0x1C,0x10,0x30,0x18,0x30,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x18,0x30,0x18,0x30,0x30,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"o",79*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x9E,0x0F,0x58,0x18,0x38,0x30,0x18,0x20,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x30,0x38,0x30,0x78,0x18,0x98,0x07,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00},/*"p",80*/ -{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,0xC0,0x23,0x30,0x3C,0x18,0x38,0x18,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x08,0x30,0x18,0x38,0x30,0x3C,0xE0,0x33,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0xFC},/*"q",81*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x7E,0x3C,0x60,0x66,0x60,0x61,0xE0,0x00,0xE0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"r",82*/ -{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,0xE0,0x27,0x30,0x38,0x18,0x30,0x18,0x20,0x18,0x00,0x70,0x00,0xE0,0x03,0x80,0x0F,0x00,0x1C,0x04,0x30,0x04,0x30,0x0C,0x30,0x1C,0x18,0xEC,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"s",83*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xC0,0x00,0xE0,0x00,0xFC,0x1F,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x20,0xC0,0x20,0x80,0x11,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"t",84*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x1E,0x3C,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x38,0x30,0xF4,0xE0,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"u",85*/ -{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,0x7E,0x3C,0x18,0x18,0x18,0x08,0x38,0x08,0x30,0x04,0x30,0x04,0x70,0x02,0x60,0x02,0x60,0x02,0xE0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"v",86*/ -{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,0xDF,0xF7,0x8E,0x63,0x0C,0x23,0x8C,0x23,0x8C,0x23,0x98,0x13,0x98,0x13,0x58,0x16,0x58,0x16,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x20,0x04,0x20,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"w",87*/ -{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,0xFC,0x3E,0x70,0x08,0x70,0x04,0xE0,0x04,0xC0,0x02,0xC0,0x01,0x80,0x03,0x80,0x03,0x40,0x07,0x60,0x06,0x20,0x0C,0x10,0x0C,0x18,0x18,0x3E,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"x",88*/ -{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,0x7E,0x7C,0x18,0x18,0x18,0x08,0x30,0x08,0x30,0x08,0x30,0x04,0x60,0x04,0x60,0x04,0xC0,0x02,0xC0,0x02,0xC0,0x02,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x4C,0x00,0x3C,0x00},/*"y",89*/ -{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,0xFC,0x1F,0x0C,0x0C,0x04,0x0E,0x04,0x06,0x00,0x03,0x80,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x20,0x30,0x20,0x38,0x30,0x1C,0x18,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"z",90*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x00},/*"{",91*/ -{0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01},/*"|",92*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x0C,0x00,0x00,0x00},/*"}",93*/ -{0x00,0x00,0x38,0x00,0xC4,0x00,0x86,0x40,0x02,0x61,0x00,0x22,0x00,0x1C,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ -}; - -typedef struct -{ - unsigned char Index[2]; - unsigned char Msk[24]; -}typFNT_GB12; - - -const typFNT_GB12 tfont12[]={ -"",0x20,0x00,0x20,0x00,0x20,0x00,0xFE,0x03,0x22,0x02,0x22,0x02,0x22,0x02,0xFE,0x03, -0x22,0x02,0x20,0x00,0x20,0x00,0x20,0x00,/*"",0*/ -"",0xFC,0x01,0x04,0x01,0xFC,0x01,0x04,0x01,0xFC,0x01,0x20,0x00,0xFF,0x07,0x04,0x01, -0xFC,0x01,0x20,0x00,0x24,0x01,0x32,0x02,/*"",1*/ -"԰",0xFE,0x07,0x02,0x04,0xFA,0x04,0x02,0x04,0x02,0x04,0xFE,0x05,0x52,0x04,0x52,0x04, -0x4A,0x05,0x86,0x05,0x02,0x04,0xFE,0x07,/*"԰",2*/ -"",0x10,0x00,0x10,0x00,0xFF,0x01,0x11,0x01,0x11,0x01,0xFF,0x01,0x11,0x01,0x11,0x01, -0xFF,0x01,0x11,0x04,0x10,0x04,0xE0,0x07,/*"",3*/ -"",0x00,0x00,0xFC,0x01,0x80,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0xFF,0x07,0x20,0x00, -0x20,0x00,0x20,0x00,0x20,0x00,0x38,0x00,/*"",4*/ - -}; - -typedef struct -{ - unsigned char Index[2]; - unsigned char Msk[32]; -}typFNT_GB16; - - -const typFNT_GB16 tfont16[]={ - -"",0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10, -0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x10,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,/*"",0*/ -"",0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x80,0x00,0xFF,0x7F,0x00,0x00, -0xF8,0x0F,0x08,0x08,0x08,0x08,0xF8,0x0F,0x80,0x00,0x84,0x10,0xA2,0x20,0x40,0x00,/*"",1*/ -"԰",0x00,0x00,0xFE,0x3F,0x02,0x20,0xF2,0x27,0x02,0x20,0x02,0x20,0xFA,0x2F,0x22,0x21, -0x22,0x21,0x22,0x21,0x12,0x29,0x12,0x29,0x0A,0x2E,0x02,0x20,0xFE,0x3F,0x02,0x20,/*"԰",2*/ -"",0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,0xFC,0x1F, -0x84,0x10,0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x50,0x80,0x40,0x80,0x40,0x00,0x7F,/*"",3*/ -"",0x00,0x00,0xFE,0x1F,0x00,0x08,0x00,0x04,0x00,0x02,0x80,0x01,0x80,0x00,0xFF,0x7F, -0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,/*"",4*/ -}; - - -typedef struct -{ - unsigned char Index[2]; - unsigned char Msk[72]; -}typFNT_GB24; - - -const typFNT_GB24 tfont24[]={ - -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00, -0x08,0x00,0x08,0x08,0x18,0xF8,0xFF,0x1F,0x18,0x08,0x18,0x18,0x08,0x18,0x18,0x08, -0x18,0x18,0x08,0x18,0x18,0x08,0x18,0x18,0x08,0x18,0xF8,0xFF,0x1F,0x08,0x08,0x08, -0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x18,0x00,0x00, -0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,/*"",0*/ - -"",0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x06,0xC0,0xFF,0x07,0x40,0x00,0x06,0xC0, -0xFF,0x07,0x40,0x00,0x06,0xC0,0xFF,0x07,0x40,0x08,0x02,0x00,0x30,0x00,0xFE,0xFF, -0x3F,0x00,0x00,0x00,0xC0,0xFF,0x07,0xC0,0x00,0x02,0xC0,0x00,0x02,0xC0,0x00,0x02, -0xC0,0xFF,0x03,0x80,0x10,0x00,0x80,0x11,0x01,0x60,0x10,0x0E,0x30,0x10,0x18,0x0C, -0x1E,0x30,0x00,0x1C,0x00,0x00,0x00,0x00,/*"",1*/ - -"԰",0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x30,0xF8,0xFF,0x1F,0x08,0x00,0x10,0x08, -0xC0,0x10,0x08,0x3F,0x10,0x08,0x00,0x10,0x08,0x00,0x10,0x08,0x00,0x13,0xC8,0xFF, -0x10,0x08,0x22,0x10,0x08,0x22,0x10,0x08,0x22,0x10,0x08,0x22,0x10,0x08,0x21,0x12, -0x08,0x21,0x14,0x88,0x60,0x16,0x48,0xC0,0x13,0x28,0x00,0x10,0x08,0x00,0x10,0xF8, -0xFF,0x1F,0x08,0x00,0x10,0x00,0x00,0x00,/*"԰",2*/ - -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00, -0x08,0x00,0xF0,0xFF,0x0F,0x10,0x08,0x04,0x10,0x08,0x04,0x10,0x08,0x04,0x10,0x08, -0x04,0xF0,0xFF,0x07,0x10,0x08,0x04,0x10,0x08,0x04,0x10,0x08,0x04,0x10,0x08,0x04, -0xF0,0xFF,0x07,0x10,0x08,0x00,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x20,0x00, -0x18,0x30,0x00,0xF0,0x1F,0x00,0x00,0x00,/*"",3*/ - -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xF0,0xFF,0x0F,0x00,0x00,0x06,0x00, -0x00,0x01,0x00,0xC0,0x00,0x00,0x28,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18, -0x30,0xFE,0xFF,0x7F,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00, -0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00, -0x1F,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,/*"",4*/ - -}; - - -typedef struct -{ - unsigned char Index[2]; - unsigned char Msk[128]; -}typFNT_GB32; - - -const typFNT_GB32 tfont32[]={ - -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x01,0x00, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00, -0x10,0x80,0x01,0x0C,0xF0,0xFF,0xFF,0x0F,0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04, -0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04, -0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04,0xF0,0xFF,0xFF,0x07,0x30,0x80,0x01,0x04, -0x30,0x80,0x01,0x04,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,/*"",0*/ -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01, -0x00,0xFF,0xFF,0x01,0x00,0x03,0x80,0x01,0x00,0x03,0x80,0x01,0x00,0xFF,0xFF,0x01, -0x00,0x03,0x80,0x01,0x00,0x03,0x80,0x01,0x00,0xFF,0xFF,0x01,0x00,0x81,0x81,0x00, -0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x1C,0xFC,0xFF,0xFF,0x3F,0x00,0x00,0x40,0x00, -0x00,0x03,0xC0,0x01,0x00,0xFF,0xFF,0x01,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, -0x00,0x03,0xC0,0x00,0x00,0xFF,0xFF,0x00,0x00,0x01,0x41,0x00,0x00,0x04,0x01,0x00, -0x00,0x0E,0x71,0x00,0x00,0x07,0x81,0x01,0x80,0x01,0x01,0x07,0x60,0x00,0x01,0x0E, -0x18,0x98,0x01,0x1C,0x04,0xE0,0x01,0x18,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,/*"",1*/ -"԰",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xF0,0xFF,0xFF,0x1F, -0x30,0x00,0x00,0x0C,0x30,0x00,0x00,0x0C,0x30,0x00,0x10,0x0C,0x30,0xFE,0x3F,0x0C, -0x30,0x04,0x00,0x0C,0x30,0x00,0x00,0x0C,0x30,0x00,0x00,0x0C,0x30,0x00,0x00,0x0C, -0x30,0x00,0xC0,0x0C,0xF0,0xFF,0xFF,0x0D,0x30,0x30,0x06,0x0E,0x30,0x30,0x06,0x0C, -0x30,0x10,0x06,0x0C,0x30,0x10,0x06,0x0C,0x30,0x10,0x06,0x0C,0x30,0x18,0x86,0x0C, -0x30,0x18,0x86,0x0C,0x30,0x08,0x06,0x0D,0x30,0x0C,0x86,0x0D,0x30,0x06,0xEE,0x0F, -0x30,0x02,0xFC,0x0D,0x30,0x01,0x00,0x0C,0xF0,0x00,0x00,0x0C,0x30,0x00,0x00,0x0C, -0xF0,0xFF,0xFF,0x0F,0x30,0x00,0x00,0x0C,0x10,0x00,0x00,0x04,0x00,0x00,0x00,0x00,/*"԰",2*/ -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x01,0x00, -0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00, -0xE0,0xFF,0xFF,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03, -0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0xE0,0xFF,0xFF,0x03, -0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03, -0x60,0xC0,0x00,0x03,0xE0,0xFF,0xFF,0x03,0x60,0xC0,0x00,0x01,0x60,0xC0,0x00,0x00, -0x00,0xC0,0x00,0x08,0x00,0xC0,0x00,0x10,0x00,0xC0,0x00,0x10,0x00,0xC0,0x00,0x18, -0x00,0xC0,0x01,0x38,0x00,0x80,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"",3*/ -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, -0xC0,0xFF,0xFF,0x07,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0x00, -0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x03,0x00, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x08,0x00,0x80,0x01,0x1C,0xFC,0xFF,0xFF,0x3F, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00, -0x00,0xFC,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,/*"",4*/ -}; - -#endif - - diff --git a/software/Power_Pico/BSP/LCD/pic.h b/software/Power_Pico/BSP/LCD/pic.h deleted file mode 100644 index 48d492c..0000000 --- a/software/Power_Pico/BSP/LCD/pic.h +++ /dev/null @@ -1,209 +0,0 @@ -#ifndef __PIC_H -#define __PIC_H - -const unsigned char gImage_1[3200] = { /* 0X10,0X10,0X00,0X28,0X00,0X28,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,0XF7,0XBE, -0XFF,0XFF,0XFF,0XDE,0XC6,0X38,0X8C,0X92,0X6B,0X8E,0X6B,0X6E,0X7C,0X10,0XAD,0X96, -0XE7,0X3C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0X5D, -0X9D,0X15,0X63,0X4F,0X42,0X6C,0X32,0X0A,0X29,0X88,0X19,0X46,0X19,0X25,0X21,0X45, -0X31,0XE8,0X6B,0X8E,0XC6,0X38,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XA5,0X36,0X53,0X10, -0X4B,0X10,0X53,0X51,0X4B,0X0F,0X3A,0X6C,0X31,0XE9,0X21,0X67,0X19,0X25,0X10,0XE4, -0X08,0XA3,0X00,0X62,0X08,0X83,0X52,0XCB,0XD6,0X9A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X3C,0X63,0X70,0X63,0XB3,0X7C,0XB8, -0X63,0XF5,0X43,0X11,0X32,0X4D,0X29,0XEA,0X21,0X88,0X19,0X26,0X19,0X05,0X19,0X05, -0X11,0X04,0X11,0X04,0X10,0XE4,0X00,0X83,0X08,0XA3,0X8C,0X72,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDE,0XDB,0X3A,0X4B,0X42,0XF0,0X6C,0X35,0X4B,0X54, -0X32,0XB1,0X2A,0X2E,0X21,0XEB,0X21,0XA9,0X19,0X67,0X19,0X05,0X11,0X04,0X11,0X04, -0X11,0X04,0X11,0X04,0X11,0X04,0X19,0X05,0X10,0XE4,0X00,0X42,0X73,0XAF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XEF,0X5D,0X32,0X09,0X32,0X4C,0X4B,0X10,0X32,0X8F,0X2A,0X4F, -0X2A,0X2E,0X19,0XCC,0X19,0X89,0X21,0X89,0X19,0X47,0X19,0X05,0X11,0X04,0X11,0X04, -0X10,0XC4,0X10,0XC4,0X11,0X04,0X11,0X04,0X11,0X04,0X10,0XE4,0X00,0X42,0X84,0X31, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0X52,0XEC,0X19,0X47,0X32,0X4C,0X2A,0X0B,0X21,0XEC,0X21,0XEC, -0X22,0X0C,0X5B,0X91,0X4A,0XEE,0X11,0X06,0X19,0X26,0X19,0X04,0X10,0XE4,0X10,0XE4, -0X29,0XA7,0X21,0X66,0X08,0XA3,0X19,0X05,0X11,0X04,0X11,0X04,0X10,0XE4,0X00,0X82, -0XBD,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,0XA5,0X35,0X08,0X83,0X21,0X88,0X21,0X88,0X21,0X89,0X21,0XAA,0X21,0X8A, -0X42,0X6B,0X8C,0X71,0XFF,0XFF,0X8C,0X72,0X08,0X83,0X11,0X04,0X08,0XC4,0X42,0X29, -0XDE,0XFB,0XEF,0X5D,0X5A,0XEC,0X08,0X83,0X11,0X04,0X11,0X04,0X11,0X04,0X08,0X83, -0X31,0XE8,0XFF,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, -0XF7,0XBE,0X31,0XC7,0X10,0XC4,0X19,0X25,0X19,0X26,0X19,0X47,0X19,0X47,0X29,0XA8, -0X52,0X8A,0X4A,0X28,0XAD,0X55,0XFF,0XFF,0X31,0XE8,0X08,0XA3,0X19,0X05,0X6B,0X4D, -0X6B,0X4D,0XFF,0XFF,0XEF,0X7D,0X21,0X45,0X10,0XC4,0X11,0X04,0X11,0X04,0X11,0X04, -0X00,0X62,0XAD,0X76,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XB5,0X96,0X00,0X62,0X11,0X04,0X19,0X04,0X11,0X05,0X19,0X05,0X08,0XC4,0X4A,0X8B, -0XB5,0XB6,0XEF,0X5D,0XBD,0XF7,0XFF,0XFF,0X6B,0X8E,0X00,0X62,0X42,0X29,0X5A,0XAA, -0X42,0X08,0XFF,0XFF,0XFF,0XFF,0X52,0XCC,0X08,0X83,0X11,0X04,0X11,0X04,0X11,0X04, -0X08,0XA3,0X52,0XAD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X1C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X63,0X4E,0X00,0X62,0X11,0X04,0X11,0X04,0X11,0X04,0X10,0XE4,0X00,0X62,0X63,0X8E, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X73,0XCF,0X00,0X01,0X9C,0XF3,0X63,0X2C, -0XB5,0X96,0XFF,0XFF,0XFF,0XFF,0X5B,0X2D,0X00,0X83,0X11,0X04,0X11,0X04,0X11,0X04, -0X10,0XE4,0X21,0X67,0XEF,0X3D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XBD,0XF8,0XB5,0XB7,0XEF,0X9E,0X52,0XCB,0X94,0XB3,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF, -0X31,0XE8,0X08,0XA3,0X11,0X04,0X11,0X04,0X11,0X04,0X11,0X04,0X08,0XA3,0X42,0X49, -0XF7,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0X4A,0X6A,0X00,0X01,0X84,0X72,0XFF,0XFF, -0XFF,0XFF,0XF7,0XFF,0XEF,0XDF,0X3A,0X09,0X08,0XA3,0X11,0X04,0X11,0X04,0X11,0X04, -0X11,0X04,0X11,0X05,0XBE,0X18,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X7B,0XF0,0X00,0X62,0X31,0XE8,0X31,0XC7,0X00,0X41,0XA5,0X35,0XFF,0XFF,0XEF,0X5D, -0X21,0X46,0X10,0XC4,0X11,0X04,0X11,0X04,0X11,0X04,0X11,0X04,0X10,0XE4,0X08,0XA3, -0X9D,0X76,0XF7,0XFF,0XFF,0XFF,0XAD,0XB7,0X08,0XA3,0X08,0XA3,0X31,0XC7,0XE7,0X9E, -0XF7,0XFF,0XF7,0XFF,0XA5,0X76,0X08,0XA3,0X10,0XE4,0X11,0X04,0X11,0X04,0X11,0X04, -0X11,0X05,0X11,0X05,0XA5,0X35,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XDE,0XDB,0X29,0XA7,0X00,0X83,0X10,0XC4,0X10,0XC4,0X10,0XC4,0XE7,0X1C,0XEF,0X9E, -0X11,0X05,0X10,0XE4,0X11,0X04,0X11,0X04,0X11,0X04,0X11,0X04,0X19,0X04,0X08,0XC4, -0X10,0XE5,0X6B,0XD1,0X6B,0XD1,0X08,0XC5,0X00,0X64,0X08,0XA5,0X00,0X43,0X32,0X2B, -0X9D,0X77,0X84,0XB3,0X19,0X25,0X10,0XC4,0X11,0X04,0X11,0X04,0X11,0X04,0X11,0X04, -0X19,0X25,0X09,0X26,0X9D,0X35,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X73,0XAF,0X00,0X62,0X19,0X04,0X19,0X05,0X00,0X82,0X5B,0X0D,0X9B,0X8E, -0X10,0X62,0X11,0X05,0X11,0X04,0X11,0X04,0X19,0X04,0X10,0XE4,0X00,0X85,0X11,0X05, -0X39,0XC4,0X5A,0X81,0X7B,0X40,0X9C,0X22,0XAC,0X43,0XA4,0X03,0X9B,0X83,0X72,0X82, -0X49,0X82,0X18,0XC2,0X00,0XA4,0X00,0XC5,0X10,0XE4,0X19,0X04,0X11,0X04,0X19,0X05, -0X19,0X47,0X11,0X67,0X5A,0XEC,0XFF,0XBE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XDF,0XDE,0XDB,0X10,0XC4,0X10,0XE4,0X11,0X04,0X11,0X05,0X18,0XA4,0XC0,0X01, -0X88,0X83,0X00,0XE4,0X19,0X05,0X19,0X04,0X08,0XC5,0X21,0X44,0X83,0X43,0XD5,0X23, -0XFE,0X42,0XFE,0XE4,0XFF,0X27,0XFF,0X07,0XFE,0XA4,0XFE,0X64,0XFE,0X03,0XFD,0XA3, -0XFC,0XE2,0XEC,0X42,0XB3,0X83,0X62,0X24,0X10,0XE5,0X08,0XC4,0X19,0X04,0X19,0X26, -0X19,0XA8,0X21,0X87,0X90,0X00,0XBC,0XD3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XDF,0XFF,0XFF,0X7C,0X10,0X00,0X42,0X19,0X05,0X11,0X05,0X28,0X83,0XD0,0X01, -0XF8,0X44,0X48,0XA3,0X00,0XE4,0X08,0XC5,0X5A,0X44,0XED,0X02,0XFD,0XE2,0XFE,0X02, -0XFE,0X66,0XFF,0X74,0XFF,0XB8,0XFF,0X73,0XF6,0XE7,0XF6,0XA6,0XF6,0X45,0XF5,0XA4, -0XFC,0XC3,0XFC,0X62,0XFC,0XC2,0XFC,0XC2,0XCB,0XE3,0X49,0XC4,0X11,0X06,0X19,0X88, -0X01,0X87,0X90,0XA4,0XF8,0X01,0X9A,0XEC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XF7,0XBE,0X31,0XE8,0X00,0X83,0X09,0X05,0X40,0X82,0XC0,0X01, -0XF8,0X23,0XF0,0X85,0X48,0XA3,0X00,0XA4,0X5A,0X44,0XFD,0X02,0XCC,0X23,0XDC,0XC2, -0XFE,0X04,0XFE,0X28,0XF6,0X48,0XF6,0X46,0XF6,0X24,0XF5,0XE4,0XFD,0X64,0XFC,0XE3, -0XFC,0X62,0XFC,0XC2,0XE4,0X02,0XDC,0X02,0XFC,0XE2,0X7A,0XA4,0X01,0X48,0X01,0X67, -0X78,0XC4,0XF8,0X24,0XF8,0X02,0XB0,0X84,0XE7,0X7D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDE,0XDB,0X19,0X25,0X00,0XA3,0X38,0XC4,0XE0,0X02, -0XD8,0X22,0XF8,0X44,0XF8,0XA6,0X78,0XA4,0X00,0X63,0X21,0X43,0X72,0X83,0X39,0X83, -0X9B,0X82,0XF5,0X21,0XFD,0X61,0XFD,0X22,0XFC,0XE2,0XFC,0XA2,0XFC,0X42,0XFC,0X42, -0XFC,0X42,0XAB,0X22,0X41,0X83,0X92,0XC3,0X52,0X04,0X01,0X26,0X19,0X25,0X98,0XA4, -0XF8,0X44,0XF8,0X23,0XF8,0X02,0XD0,0XA4,0XEF,0X9E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XD6,0X9A,0X29,0X87,0X00,0XA5,0XB8,0X43, -0XF8,0X22,0XE0,0X23,0XF8,0X65,0XF8,0XE8,0XC9,0X07,0X48,0X83,0X00,0X42,0X00,0XA3, -0X00,0X84,0X29,0X63,0X7A,0XA2,0XB3,0X62,0XCB,0XA2,0XD3,0X62,0XBB,0X02,0X8A,0X82, -0X39,0X83,0X00,0XA4,0X00,0XE5,0X00,0XE5,0X08,0XE5,0X60,0XC4,0XD8,0X64,0XF8,0X44, -0XF8,0X24,0XF8,0X23,0XF8,0X02,0X88,0X83,0XC6,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X3D,0X5B,0X50,0X31,0X08, -0XE8,0X23,0XF8,0X43,0XF0,0X44,0XF8,0X65,0XF9,0X09,0XF9,0XAB,0XD1,0X89,0X89,0X06, -0X48,0XA3,0X18,0X42,0X00,0X02,0X00,0X42,0X00,0X61,0X00,0X82,0X00,0X62,0X00,0X62, -0X00,0X83,0X20,0XA3,0X50,0XC4,0X88,0XA5,0XD8,0X85,0XF8,0X65,0XF8,0X44,0XF8,0X44, -0XF8,0X23,0XF8,0X23,0XD0,0X03,0X10,0X82,0X29,0XC7,0XEF,0X5D,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X32,0X6C, -0X38,0XA5,0XD8,0X02,0XF8,0X23,0XF8,0X65,0XF8,0X66,0XF8,0XA7,0XF9,0X4A,0XFA,0X0C, -0XFA,0X4D,0XEA,0X4C,0XD2,0X0B,0XB9,0XA9,0XB1,0X68,0XA9,0X47,0XB1,0X27,0XB9,0X07, -0XD1,0X07,0XE8,0XE7,0XF8,0XC7,0XF8,0XA7,0XF8,0X65,0XF8,0X65,0XF8,0X44,0XF8,0X23, -0XF8,0X03,0XD0,0X02,0X28,0XA3,0X09,0X05,0X08,0XC4,0X5A,0XEC,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDE,0XFB,0X19,0X05, -0X00,0XC4,0X41,0XA7,0XC0,0XE6,0XF8,0X03,0XF8,0X86,0XF8,0XA7,0XF8,0X87,0XF8,0X86, -0XF8,0XC7,0XF9,0X29,0XF9,0X8A,0XF9,0XAB,0XF9,0XAB,0XF9,0X8B,0XF9,0X6A,0XF9,0X29, -0XF9,0X08,0XF8,0XC7,0XF8,0XA6,0XF8,0X86,0XF8,0X65,0XF8,0X64,0XF8,0X23,0XF0,0X02, -0XB1,0X06,0X29,0X25,0X00,0XE4,0X10,0XE4,0X19,0X25,0X19,0X25,0X9D,0X14,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XAD,0X96,0X00,0X62, -0X08,0X82,0X95,0X35,0XCE,0XBA,0XA2,0X8B,0XD0,0X44,0XF8,0X25,0XF8,0X87,0XF8,0XA7, -0XF8,0XC7,0XF8,0XA7,0XF8,0X87,0XF8,0X86,0XF8,0X86,0XF8,0X86,0XF8,0X87,0XF8,0XA7, -0XF8,0XA7,0XF8,0XA6,0XF8,0X85,0XF8,0X65,0XF8,0X64,0XF0,0X24,0XB8,0X64,0X93,0X0D, -0XB6,0XBB,0X63,0XCF,0X08,0X83,0X11,0X04,0X10,0XE4,0X21,0X66,0X3A,0X49,0XEF,0X5D, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X94,0XD3,0X00,0X42, -0X10,0XE4,0XCE,0XBB,0XFF,0XFF,0XE7,0XBE,0XB5,0X76,0XAA,0XCC,0XC1,0X07,0XE0,0X45, -0XF8,0X45,0XF8,0X46,0XF8,0X66,0XF8,0X86,0XF8,0X86,0XF8,0X86,0XF8,0X86,0XF8,0X65, -0XF8,0X45,0XF8,0X65,0XE8,0X65,0XD0,0X44,0XA8,0X43,0X88,0X01,0X90,0X82,0XD7,0X3C, -0XEF,0XFF,0X95,0X55,0X08,0X83,0X11,0X04,0X11,0X04,0X19,0X05,0X19,0X46,0X94,0XB3, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X94,0XB3,0X00,0X41, -0X21,0X86,0XDF,0X5D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0XDF,0XC6,0X7A,0XB4,0XD3, -0XB3,0X4E,0XC2,0X2A,0XD1,0X68,0XE0,0XE6,0XE8,0XA6,0XE8,0XA5,0XE8,0XA5,0XD8,0XE6, -0XC9,0X88,0XA9,0X06,0XA8,0X22,0XA8,0X02,0XA0,0X00,0XC8,0X00,0XD8,0X00,0XE5,0XF7, -0XE7,0XFF,0XAD,0XF8,0X10,0XC4,0X10,0XE4,0X11,0X04,0X10,0XE4,0X11,0X05,0X4A,0X8B, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XA5,0X55,0X00,0X41, -0X29,0XA7,0XDF,0X5D,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XEF,0XFF,0XDF,0X7D,0XCE,0XDB,0XCE,0X59,0XCD,0XF8,0XCD,0XD7,0XC5,0XF7,0XCE,0X79, -0XBE,0XFB,0XA2,0XAB,0XF0,0X03,0XF8,0X45,0XD0,0X42,0XE8,0X43,0XF0,0X00,0XD4,0X72, -0XDF,0XFF,0XAE,0X39,0X10,0XE4,0X10,0XE4,0X11,0X04,0X10,0XE4,0X11,0X05,0X29,0X87, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCE,0X59,0X08,0X83, -0X21,0X46,0XD7,0X1C,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, -0XEF,0XFF,0XBA,0X8B,0XF8,0X04,0XF8,0X45,0XE0,0X62,0XF0,0X44,0XF8,0X00,0XDB,0X8E, -0XDF,0XFF,0XA5,0XF8,0X10,0XC4,0X10,0XE4,0X10,0XE4,0X11,0X04,0X10,0XE4,0X19,0X25, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBE,0X29,0X87, -0X08,0X83,0XB6,0X39,0XF7,0XFF,0XF7,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, -0XE7,0XBE,0XBA,0X4A,0XF8,0X03,0XF8,0X45,0XF8,0X64,0XF8,0X44,0XF8,0X00,0XE3,0X6E, -0XD7,0XFF,0X8C,0XF4,0X08,0X83,0X11,0X04,0X10,0XE4,0X10,0XE4,0X10,0XE4,0X19,0X05, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X73,0XEF, -0X00,0X00,0X84,0X72,0XEF,0XFF,0XEF,0XBE,0XFF,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XE7,0XDF,0XBA,0X8B,0XF8,0X03,0XF8,0X45,0XF8,0X45,0XF8,0X23,0XF8,0X00,0XD4,0XD3, -0XD7,0XFF,0X5B,0X4E,0X00,0X21,0X3A,0X29,0XA5,0X55,0X08,0X83,0X10,0XC4,0X19,0X25, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDE,0XFB, -0X08,0XA3,0X31,0XE8,0XDF,0X9E,0XE7,0X9E,0XEF,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XF7,0XFF,0XBC,0X51,0XE0,0X02,0XF8,0X03,0XF0,0X03,0XE0,0X43,0XC2,0XEC,0XCF,0X7E, -0XBE,0XFC,0X21,0X46,0X00,0X21,0X94,0XD3,0XFF,0XFF,0X84,0X51,0X00,0X00,0X29,0X87, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X84,0X51,0X00,0X00,0X8C,0XF4,0XEF,0XFF,0XE7,0X9E,0XEF,0XBF,0XFF,0XDF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XDF,0X3D,0XBD,0X55,0XBC,0X52,0XBC,0X72,0XB5,0XB7,0XC7,0X5D,0XDF,0XFF, -0X6B,0XF0,0X00,0X00,0X3A,0X09,0XF7,0XBF,0XFF,0XFF,0XFF,0XFF,0X9D,0X14,0XA5,0X55, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X4A,0XAC,0X08,0XA4,0XBE,0XBB,0XE7,0XDF,0XE7,0X7E,0XEF,0XBE,0XF7,0XDF, -0XFF,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XDF,0XF7,0XDF,0XEF,0XFF,0XDF,0XDF,0XD7,0XBF,0XD7,0X9E,0XDF,0XDF,0XA5,0XD8, -0X08,0X83,0X11,0X26,0XD6,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XEE,0X79,0XDC,0X8B,0X31,0X21,0X21,0XA9,0XCF,0X3D,0XDF,0XBF,0XDF,0X7E,0XE7,0X9E, -0XEF,0XBE,0XEF,0XBF,0XF7,0XDF,0XF7,0XDF,0XF7,0XDF,0XF7,0XDF,0XF7,0XDF,0XEF,0XBF, -0XEF,0XBE,0XE7,0X9E,0XDF,0X7E,0XD7,0X5E,0XD7,0X5E,0XDF,0XDF,0XB6,0X9A,0X19,0X26, -0X08,0X42,0XA3,0XED,0XFF,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,0XDD,0X74, -0XDB,0XC0,0XFE,0X00,0XEE,0X42,0X42,0X02,0X21,0X89,0XB6,0X7B,0XDF,0XDF,0XD7,0X7E, -0XDF,0X7E,0XDF,0X7E,0XE7,0X9E,0XE7,0X9E,0XE7,0X9E,0XE7,0X9E,0XE7,0X9E,0XDF,0X7E, -0XDF,0X7E,0XD7,0X5D,0XD7,0X5D,0XDF,0X9E,0XE7,0XFF,0XA5,0XF8,0X11,0X07,0X18,0XE3, -0XC5,0X02,0XFD,0X60,0XD3,0XE6,0XEE,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0X9E,0XBA,0X84, -0XFC,0XC1,0XFE,0X42,0XFE,0X82,0XFE,0XA2,0X83,0X81,0X21,0X45,0X74,0X74,0XC7,0X5E, -0XDF,0XDF,0XD7,0X7E,0XD7,0X5E,0XD7,0X5D,0XD7,0X5E,0XD7,0X5E,0XD7,0X5D,0XD7,0X5D, -0XD7,0X5E,0XDF,0X9E,0XE7,0XFF,0XC7,0X3D,0X63,0XF1,0X08,0X84,0X52,0X42,0XE6,0X26, -0XFF,0X29,0XFE,0X86,0XF3,0XE0,0XC3,0X6A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDE,0X18,0XD2,0XC1, -0XFD,0XA2,0XFE,0X22,0XFE,0X42,0XFE,0X42,0XFE,0X62,0XD4,0XE2,0X6A,0X41,0X42,0X49, -0X74,0X53,0XA6,0X3B,0XC7,0X3E,0XD7,0XBF,0XD7,0XBF,0XD7,0XBF,0XDF,0XBF,0XD7,0XBF, -0XC7,0X3E,0XA6,0X1A,0X63,0XF2,0X29,0XA7,0X41,0X82,0XB4,0X22,0XFE,0X62,0XFE,0X83, -0XFE,0XAA,0XFF,0X0F,0XFD,0X67,0XBA,0X63,0XEF,0X3C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE6,0X9A,0XD2,0X80, -0XFD,0X21,0XFD,0XC2,0XF5,0XE2,0XF5,0XC2,0XF5,0X82,0XFD,0X82,0XFD,0X62,0XDC,0X61, -0X9B,0X21,0X6A,0X84,0X6A,0XE9,0X63,0X2C,0X63,0XAF,0X74,0X11,0X63,0X6E,0X63,0X2C, -0X5A,0X89,0X52,0X04,0X7A,0X81,0XCB,0XC2,0XFC,0XE2,0XFD,0X62,0XFD,0X82,0XFD,0XC2, -0XFD,0XC2,0XFD,0XE4,0XFD,0X24,0XCA,0X62,0XE7,0X1C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCC,0XB1, -0XD2,0X81,0XF3,0XC0,0XFC,0XC1,0XFD,0X02,0XFD,0X02,0XFC,0XE2,0XFC,0XC2,0XFC,0XC2, -0XFC,0X81,0XFB,0X80,0XC9,0XC0,0X81,0XA4,0XAD,0X35,0XCE,0X59,0X9C,0X71,0X81,0X21, -0XDA,0X00,0XFB,0XA1,0XFC,0X82,0XFC,0XA2,0XFC,0X82,0XFC,0XA2,0XFD,0X02,0XFD,0X22, -0XFC,0XE2,0XFC,0X00,0XDA,0X60,0XCC,0X90,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XDE,0X59,0XC4,0X0D,0XCB,0X06,0XD2,0XE4,0XDB,0X03,0XDB,0X03,0XDA,0XE3,0XD2,0XC3, -0XC2,0XA4,0XB3,0X09,0XBC,0XD2,0XF7,0X9E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE6,0XFB, -0XB4,0X0E,0XBA,0XA6,0XD2,0X83,0XE2,0XE3,0XEB,0X02,0XEB,0X22,0XE3,0X22,0XDB,0X03, -0XD2,0XE4,0XC3,0X6A,0XD5,0XB6,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -}; - -#endif - - diff --git a/software/Power_Pico/BSP/PD/FUSB302_UFP.c b/software/Power_Pico/BSP/PD/FUSB302_UFP.c deleted file mode 100644 index f2f9d65..0000000 --- a/software/Power_Pico/BSP/PD/FUSB302_UFP.c +++ /dev/null @@ -1,596 +0,0 @@ - -/** - * FUSB302_UFP.c - * - * Updated on: Jan 4, 2021 - * Author: Ryan Ma - * - * Minimalist USB PD implement with only UFP(device) functionality - * Requires only stdint.h and string.h - * No use of bit-field for better cross-platform compatibility - * - * FUSB302 can support PD3.0 with limitations and workarounds - * - Do not have enough FIFO for unchunked message, use chunked message instead - * - VBUS sense low threshold at 4V, disable vbus_sense if request PPS below 4V - * - */ - -#include -#include "FUSB302_UFP.h" - -/* Switches0 : 02h */ -#define PU_EN2 (0x01 << 7) -#define PU_EN1 (0x01 << 6) -#define VCONN_CC2 (0x01 << 5) -#define VCONN_CC1 (0x01 << 4) -#define MEAS_CC2 (0x01 << 3) -#define MEAS_CC1 (0x01 << 2) -#define PDWN2 (0x01 << 1) -#define PDWN1 (0x01 << 0) - -/* Switches1 : 03h */ -#define POWERROLE (0x01 << 7) -#define SPECREV1 (0x01 << 6) -#define SPECREV0 (0x01 << 5) -#define DATAROLE (0x01 << 4) -#define AUTO_CRC (0x01 << 2) -#define TXCC2 (0x01 << 1) -#define TXCC1 (0x01 << 0) - -/* Measure : 04h */ -#define MEAS_VBUS (0x01 << 6) - -/* Control0 : 06h */ -#define TX_FLUSH (0x01 << 6) -#define INT_MASK (0x01 << 5) -#define HOST_CUR_MASK (0x03 << 2) -#define HOST_CUR_3A0 (0x03 << 2) -#define HOST_CUR_1A5 (0x02 << 2) -#define HOST_CUR_USB (0x01 << 2) -#define AUTO_PRE (0x01 << 1) -#define TX_START (0x01 << 0) - -/* Control1 : 07h */ -#define ENSOP2DB (0x01 << 6) -#define ENSOP1DB (0x01 << 5) -#define BIST_MODE2 (0x01 << 4) -#define RX_FLUSH (0x01 << 2) -#define ENSOP2 (0x01 << 1) -#define ENSOP1 (0x01 << 0) - -/* Control2 : 08h */ -#define WAKE_EN (0x01 << 3) -#define MODE_MASK (0x03 << 1) -#define MODE_DFP (0x03 << 1) -#define MODE_UFP (0x02 << 1) -#define MODE_DRP (0x01 << 1) -#define TOGGLE (0x01 << 0) - -/* Control3 : 09h */ -#define SEND_HARDRESET (0x01 << 6) -#define BIST_TMODE (0x01 << 5) /* on FUSB302B only */ -#define AUTO_HARDRESET (0x01 << 4) -#define AUTO_SOFTRESET (0x01 << 3) -#define N_RETRIES_MASK (0x03 << 1) -#define N_RETRIES(n) ((n) << 1) -#define AUTO_RETRY (0x01 << 0) - -/* Mask : 0Ah */ -#define M_VBUSOK (0x01 << 7) -#define M_ACTIVITY (0x01 << 6) -#define M_COMP_CHNG (0x01 << 5) -#define M_CRC_CHK (0x01 << 4) -#define M_ALERT (0x01 << 3) -#define M_WAKE (0x01 << 2) -#define M_COLLISION (0x01 << 1) -#define M_BC_LVL (0x01 << 0) - -/* Power : 0Bh */ -#define PWR_INT_OSC (0x01 << 3) /* Enable internal oscillator */ -#define PWR_MEASURE (0x01 << 2) /* Measure block powered */ -#define PWR_RECEIVER (0x01 << 1) /* Receiver powered and current reference for Measure block */ -#define PWR_BANDGAP (0x01 << 0) /* Bandgap and wake circuitry */ - -/* Reset : 0Ch */ -#define PD_RESET (0x01 << 1) -#define SW_RES (0x01 << 0) - -/* Maska : 0Eh */ -#define M_OCP_TEMP (0x01 << 7) -#define M_TOGDONE (0x01 << 6) -#define M_SOFTFAIL (0x01 << 5) -#define M_RETRYFAIL (0x01 << 4) -#define M_HARDSENT (0x01 << 3) -#define M_TXSENT (0x01 << 2) -#define M_SOFTRST (0x01 << 1) -#define M_HARDRST (0x01 << 0) - -/* Maskb : 0Fh */ -#define M_GCRCSENT (0x01 << 0) - -/* Status0a : 3Ch */ -#define SOFTFAIL (0x01 << 5) -#define RETRYFAIL (0x01 << 4) -#define POWER3_2 (0x01 << 2) -#define SOFTRST (0x01 << 1) -#define HARDRST (0x01 << 0) - -/* Status1a : 3Dh */ -#define TOGSS_MASK (0x07 << 3) -#define TOGSS_RUNNING (0x00 << 3) -#define TOGSS_SRC1 (0x01 << 3) -#define TOGSS_SRC2 (0x02 << 3) -#define TOGSS_SNK1 (0x05 << 3) -#define TOGSS_SNK2 (0x06 << 3) -#define TOGSS_AUDIOA (0x07 << 3) -#define RXSOP2DB (0x01 << 2) -#define RXSOP1DB (0x01 << 1) -#define RXSOP (0x01 << 0) - -/* Interrupta : 3Eh */ -#define I_OCP_TEMP (0x01 << 7) -#define I_TOGDONE (0x01 << 6) -#define I_SOFTFAIL (0x01 << 5) -#define I_RETRYFAIL (0x01 << 4) -#define I_HARDSENT (0x01 << 3) -#define I_TXSENT (0x01 << 2) -#define I_SOFTRST (0x01 << 1) -#define I_HARDRST (0x01 << 0) - -/* Interruptb : 3Fh */ -#define I_GCRCSENT (0x01 << 0) - -/* Status0 : 40h */ -#define VBUSOK (0x01 << 7) -#define ACTIVITY (0x01 << 6) -#define COMP (0x01 << 5) -#define CRC_CHK (0x01 << 4) -#define ALERT (0x01 << 3) -#define WAKE (0x01 << 2) -#define BC_LVL_MASK (0x03 << 0) -#define BC_LVL_LT200 (0x00 << 0) -#define BC_LVL_200_660 (0x01 << 0) -#define BC_LVL_660_1230 (0x02 << 0) -#define BC_LVL_GT1230 (0x03 << 0) - -/* Status1 : 41h */ -#define RXSOP2 (0x01 << 7) -#define RXSOP1 (0x01 << 6) -#define RX_EMPTY (0x01 << 5) -#define RX_FULL (0x01 << 4) -#define TX_EMPTY (0x01 << 3) -#define TX_FULL (0x01 << 2) -#define OVRTEMP (0x01 << 1) -#define OCP (0x01 << 0) - -/* Interrupt : 42h */ -#define I_VBUSOK (0x01 << 7) -#define I_ACTIVITY (0x01 << 6) -#define I_COMP_CHNG (0x01 << 5) -#define I_CRC_CHK (0x01 << 4) -#define I_ALERT (0x01 << 3) -#define I_WAKE (0x01 << 2) -#define I_COLLISION (0x01 << 1) -#define I_BC_LVL (0x01 << 0) - -#define ADDRESS_DEVICE_ID 0x01 -#define ADDRESS_SWITCHES0 0x02 -#define ADDRESS_SWITCHES1 0x03 -#define ADDRESS_MEASURE 0x04 -#define ADDRESS_SLICE 0x05 -#define ADDRESS_CONTROL0 0x06 -#define ADDRESS_CONTROL1 0x07 -#define ADDRESS_CONTROL2 0x08 -#define ADDRESS_CONTROL3 0x09 -#define ADDRESS_MASK 0x0A -#define ADDRESS_POWER 0x0B -#define ADDRESS_RESET 0x0C -#define ADDRESS_MASKA 0x0E -#define ADDRESS_MASKB 0x0F -#define ADDRESS_STATUS0A 0x3C -#define ADDRESS_STATUS1A 0x3D -#define ADDRESS_INTERRUPTA 0x3E -#define ADDRESS_INTERRUPTB 0x3F -#define ADDRESS_STATUS0 0x40 -#define ADDRESS_STATUS1 0x41 -#define ADDRESS_INTERRUPT 0x42 -#define ADDRESS_FIFOS 0x43 - -#define REG_DEVICE_ID dev->reg_control[ADDRESS_DEVICE_ID - ADDRESS_DEVICE_ID] -#define REG_SWITCHES0 dev->reg_control[ADDRESS_SWITCHES0 - ADDRESS_DEVICE_ID] -#define REG_SWITCHES1 dev->reg_control[ADDRESS_SWITCHES1 - ADDRESS_DEVICE_ID] -#define REG_MEASURE dev->reg_control[ADDRESS_MEASURE - ADDRESS_DEVICE_ID] -#define REG_SLICE dev->reg_control[ADDRESS_SLICE - ADDRESS_DEVICE_ID] -#define REG_CONTROL0 dev->reg_control[ADDRESS_CONTROL0 - ADDRESS_DEVICE_ID] -#define REG_CONTROL1 dev->reg_control[ADDRESS_CONTROL1 - ADDRESS_DEVICE_ID] -#define REG_CONTROL2 dev->reg_control[ADDRESS_CONTROL2 - ADDRESS_DEVICE_ID] -#define REG_CONTROL3 dev->reg_control[ADDRESS_CONTROL3 - ADDRESS_DEVICE_ID] -#define REG_MASK dev->reg_control[ADDRESS_MASK - ADDRESS_DEVICE_ID] -#define REG_POWER dev->reg_control[ADDRESS_POWER - ADDRESS_DEVICE_ID] -#define REG_RESET dev->reg_control[ADDRESS_RESET - ADDRESS_DEVICE_ID] -#define REG_MASKA dev->reg_control[ADDRESS_MASKA - ADDRESS_DEVICE_ID] -#define REG_MASKB dev->reg_control[ADDRESS_MASKB - ADDRESS_DEVICE_ID] -#define REG_STATUS0A dev->reg_status[ADDRESS_STATUS0A - ADDRESS_STATUS0A] -#define REG_STATUS1A dev->reg_status[ADDRESS_STATUS1A - ADDRESS_STATUS0A] -#define REG_INTERRUPTA dev->reg_status[ADDRESS_INTERRUPTA - ADDRESS_STATUS0A] -#define REG_INTERRUPTB dev->reg_status[ADDRESS_INTERRUPTB - ADDRESS_STATUS0A] -#define REG_STATUS0 dev->reg_status[ADDRESS_STATUS0 - ADDRESS_STATUS0A] -#define REG_STATUS1 dev->reg_status[ADDRESS_STATUS1 - ADDRESS_STATUS0A] -#define REG_INTERRUPT dev->reg_status[ADDRESS_INTERRUPT - ADDRESS_STATUS0A] - -enum FUSB302_transmit_data_tokens_t { - TX_TOKEN_TXON = 0xA1, - TX_TOKEN_SOP1 = 0x12, - TX_TOKEN_SOP2 = 0x13, - TX_TOKEN_SOP3 = 0x1B, - TX_TOKEN_RESET1 = 0x15, - TX_TOKEN_RESET2 = 0x16, - TX_TOKEN_PACKSYM = 0x80, - TX_TOKEN_JAM_CRC = 0xFF, - TX_TOKEN_EOP = 0x14, - TX_TOKEN_TXOFF = 0xFE, -}; - -enum FUSB302_state_t { - FUSB302_STATE_UNATTACHED = 0, - FUSB302_STATE_ATTACHED -}; - -#define FUSB302_ERR_MSG(s) s - -#define REG_READ(addr, data, count) do { \ - if (reg_read(dev, addr, data, count) != FUSB302_SUCCESS) { return FUSB302_ERR_READ_DEVICE; } \ -} while(0) - -#define REG_WRITE(addr, data, count) do { \ - if (reg_write(dev, addr, data, count) != FUSB302_SUCCESS) { return FUSB302_ERR_WRITE_DEVICE; } \ -} while(0) - -static inline FUSB302_ret_t reg_read(FUSB302_dev_t *dev, uint8_t address, uint8_t *data, uint8_t count) -{ - FUSB302_ret_t ret = dev->i2c_read(dev->i2c_address, address, data, count); - if (ret != FUSB302_SUCCESS) { - dev->err_msg = FUSB302_ERR_MSG("Fail to read register"); - } - return ret; -} - -static inline FUSB302_ret_t reg_write(FUSB302_dev_t *dev, uint8_t address, uint8_t *data, uint8_t count) -{ - FUSB302_ret_t ret = dev->i2c_write(dev->i2c_address, address, data, count); - if (ret != FUSB302_SUCCESS) { - dev->err_msg = FUSB302_ERR_MSG("Fail to write register"); - } - return ret; -} - -static FUSB302_ret_t FUSB302_read_cc_lvl(FUSB302_dev_t *dev, uint8_t * cc_value) -{ - /* 00: < 200 mV : vRa - 01: >200 mV, <660 mV : vRd-USB - 10: >660 mV, <1.23 V : vRd-1.5 - 11: >1.23 V : vRd-3.0 */ - uint8_t cc, cc_verify; - REG_READ(ADDRESS_STATUS0, ®_STATUS0, 1); - cc = REG_STATUS0 & BC_LVL_MASK; - for (uint8_t i = 0; i < 5; i++) { - REG_READ(ADDRESS_STATUS0, ®_STATUS0, 1); - cc_verify = REG_STATUS0 & BC_LVL_MASK; - if (cc != cc_verify) { - return FUSB302_BUSY; - } - } - *cc_value = cc; - return FUSB302_SUCCESS; -} - -static FUSB302_ret_t FUSB302_read_incoming_packet(FUSB302_dev_t *dev, FUSB302_event_t * events) -{ - uint8_t len, b[3]; - REG_READ(ADDRESS_FIFOS, b, 3); - dev->rx_header = ((uint16_t)b[2] << 8) | b[1]; - len = (dev->rx_header >> 12) & 0x7; - REG_READ(ADDRESS_FIFOS, dev->rx_buffer, len * 4 + 4); /* add 4 to len to read CRC out */ - - if (events) { - *events |= FUSB302_EVENT_RX_SOP; - } - return FUSB302_SUCCESS; -} - -static FUSB302_ret_t FUSB302_state_unattached(FUSB302_dev_t *dev, FUSB302_event_t * events) -{ - REG_READ(ADDRESS_STATUS0, ®_STATUS0, 1); - if (REG_STATUS0 & VBUSOK) { - /* enable internal oscillator */ - REG_POWER = PWR_BANDGAP | PWR_RECEIVER | PWR_MEASURE | PWR_INT_OSC; - REG_WRITE(ADDRESS_POWER, ®_POWER, 1); - dev->delay_ms(2); - - /* read cc1 */ - REG_SWITCHES0 = PDWN1 | PDWN2 | MEAS_CC1; - REG_SWITCHES1 = SPECREV0; - REG_MEASURE = 49; - REG_WRITE(ADDRESS_SWITCHES0, ®_SWITCHES0, 3); - dev->delay_ms(2); - while (FUSB302_read_cc_lvl(dev, &dev->cc1) != FUSB302_SUCCESS) { - dev->delay_ms(2); - } - - /* read cc2 */ - REG_SWITCHES0 = PDWN1 | PDWN2 | MEAS_CC2; - REG_WRITE(ADDRESS_SWITCHES0, ®_SWITCHES0, 1); - dev->delay_ms(2); - while (FUSB302_read_cc_lvl(dev, &dev->cc2) != FUSB302_SUCCESS) { - dev->delay_ms(2); - } - - /* clear interrupt */ - REG_READ(ADDRESS_INTERRUPTA, ®_INTERRUPTA, 2); - dev->interrupta = 0; - dev->interruptb = 0; - - /* enable tx on cc pin */ - if (dev->cc1 > 0) { - REG_SWITCHES0 = PDWN1 | PDWN2 | MEAS_CC1; - REG_SWITCHES1 = SPECREV0 | AUTO_CRC | TXCC1; - //REG_SWITCHES1 = SPECREV0 | TXCC1; - } else if (dev->cc2 > 0) { - REG_SWITCHES0 = PDWN1 | PDWN2 | MEAS_CC2; - REG_SWITCHES1 = SPECREV0 | AUTO_CRC | TXCC2; - //REG_SWITCHES1 = SPECREV0 | TXCC2; - } else { - REG_SWITCHES0 = PDWN1 | PDWN2; - REG_SWITCHES1 = SPECREV0; - } - REG_WRITE(ADDRESS_SWITCHES0, ®_SWITCHES0, 2); - - /* update state */ - dev->state = FUSB302_STATE_ATTACHED; - if (events) { - *events |= FUSB302_EVENT_ATTACHED; - } - } - return FUSB302_SUCCESS; -} - -static FUSB302_ret_t FUSB302_state_attached(FUSB302_dev_t *dev, FUSB302_event_t * events) -{ - REG_READ(ADDRESS_STATUS0A, ®_STATUS0A, 7); - dev->interrupta |= REG_INTERRUPTA; - dev->interruptb |= REG_INTERRUPTB; - if (dev->vbus_sense && ((REG_STATUS0 & VBUSOK) == 0)) { - /* reset cc pins to pull down */ - REG_SWITCHES0 = PDWN1 | PDWN2; - REG_SWITCHES1 = SPECREV0; - REG_MEASURE = 49; - REG_WRITE(ADDRESS_SWITCHES0, ®_SWITCHES0, 3); - - /* turn off internal oscillator */ - REG_POWER = PWR_BANDGAP | PWR_RECEIVER | PWR_MEASURE; - REG_WRITE(ADDRESS_POWER, ®_POWER, 1); - - /* update state */ - dev->state = FUSB302_STATE_UNATTACHED; - if (events) { - *events |= FUSB302_EVENT_DETACHED; - } - return FUSB302_SUCCESS; - } - if (REG_STATUS0A & HARDRST) { - uint8_t reg_control = PD_RESET; - REG_WRITE(ADDRESS_RESET, ®_control, 1); - return FUSB302_SUCCESS; - } - if (dev->interruptb & I_GCRCSENT) { - dev->interruptb &= ~I_GCRCSENT; - if (events) { - *events |= FUSB302_EVENT_GOOD_CRC_SENT; - } - } - if ((REG_STATUS1 & RX_EMPTY) == 0) { - if (FUSB302_read_incoming_packet(dev, events) != FUSB302_SUCCESS) { - uint8_t rx_flush = REG_CONTROL1 | RX_FLUSH; - reg_write(dev, ADDRESS_CONTROL1, &rx_flush, 1); - } - } - return FUSB302_SUCCESS; -} - -FUSB302_ret_t FUSB302_init(FUSB302_dev_t *dev) -{ - if (dev->i2c_address == 0) { - dev->err_msg = FUSB302_ERR_MSG("Invalid i2c address"); - return FUSB302_ERR_PARAM; - } - if (dev->i2c_read == 0) { - dev->err_msg = FUSB302_ERR_MSG("Invalid i2c_read function"); - return FUSB302_ERR_PARAM; - } - if (dev->i2c_write == 0) { - dev->err_msg = FUSB302_ERR_MSG("Invalid i2c_write function"); - return FUSB302_ERR_PARAM; - } - - if (reg_read(dev, ADDRESS_DEVICE_ID, &dev->reg_control[1], 1) != FUSB302_SUCCESS) { - dev->err_msg = FUSB302_ERR_MSG("Device not found"); - return FUSB302_ERR_READ_DEVICE; - } - - if ((dev->reg_control[1] & 0x80) == 0) { - dev->err_msg = FUSB302_ERR_MSG("Invalid device version"); - return FUSB302_ERR_DEVICE_ID; - } - - dev->state = FUSB302_STATE_UNATTACHED; - dev->rx_header = 0; - memset(dev->rx_buffer, 0, sizeof(dev->rx_buffer)); - - /* restore default settings */ - REG_RESET = SW_RES; - REG_WRITE(ADDRESS_RESET, ®_RESET, 1); - - /* fetch all R/W registers */ - REG_READ(ADDRESS_DEVICE_ID, ®_DEVICE_ID, 15); - - /* configure switchs and comparators */ - REG_SWITCHES0 = PDWN1 | PDWN2; - REG_SWITCHES1 = SPECREV0; - REG_MEASURE = 49; - REG_WRITE(ADDRESS_SWITCHES0, ®_SWITCHES0, 3); - - /* configure auto retries */ - REG_CONTROL3 &= ~N_RETRIES_MASK; - REG_CONTROL3 |= N_RETRIES(3) | AUTO_RETRY; - REG_WRITE(ADDRESS_CONTROL3, ®_CONTROL3, 1); - - /* configure interrupt mask */ - REG_MASK = 0xFF; - REG_MASK &= ~(M_VBUSOK | M_ACTIVITY | M_COLLISION | M_ALERT | M_CRC_CHK); - REG_WRITE(ADDRESS_MASK, ®_MASK, 1); - - /* configure interrupt maska/maskb */ - REG_MASKA = 0xFF; - REG_MASKA &= ~(M_RETRYFAIL | M_HARDSENT | M_TXSENT | M_HARDRST); - REG_WRITE(ADDRESS_MASKA, ®_MASKA, 1); - REG_MASKB = 0xFF; - REG_MASKB &= ~(M_GCRCSENT); - REG_WRITE(ADDRESS_MASKB, ®_MASKB, 1); - - /* enable interrupt */ - REG_CONTROL0 &= ~INT_MASK; - REG_WRITE(ADDRESS_CONTROL0, ®_CONTROL0, 1); - - /* Power on, enable VUSB detection */ - REG_POWER = PWR_BANDGAP | PWR_RECEIVER | PWR_MEASURE; - REG_WRITE(ADDRESS_POWER, ®_POWER, 1); - - dev->vbus_sense = 1; - dev->err_msg = FUSB302_ERR_MSG(""); - return FUSB302_SUCCESS; -} - -FUSB302_ret_t FUSB302_pd_reset(FUSB302_dev_t *dev) -{ - uint8_t reg = PD_RESET; - REG_WRITE(ADDRESS_RESET, ®, 1); - return FUSB302_SUCCESS; -} - -FUSB302_ret_t FUSB302_pdwn_cc(FUSB302_dev_t *dev, uint8_t enable) -{ - REG_SWITCHES0 = enable ? (PDWN1 | PDWN2) : 0; - REG_WRITE(ADDRESS_SWITCHES0, ®_SWITCHES0, 1); - return FUSB302_SUCCESS; -} - -FUSB302_ret_t FUSB302_set_vbus_sense(FUSB302_dev_t *dev, uint8_t enable) -{ - if (dev->vbus_sense != enable) { - if (enable) { - REG_MASK &= ~M_VBUSOK; /* enable VBUSOK interrupt */ - } else { - REG_MASK |= M_VBUSOK; /* disable VBUSOK interrupt */ - } - REG_WRITE(ADDRESS_MASK, ®_MASK, 1); - dev->vbus_sense = enable; - } - return FUSB302_SUCCESS; -} - -FUSB302_ret_t FUSB302_get_ID(FUSB302_dev_t *dev, uint8_t * version_ID, uint8_t * revision_ID) -{ - if (dev && (REG_DEVICE_ID & 0x80)) { - if (version_ID) { - *version_ID = (REG_DEVICE_ID >> 4) & 0x7; - } - if (revision_ID) { - *revision_ID = (REG_DEVICE_ID >> 0) & 0xF; - } - return FUSB302_SUCCESS; - } - return FUSB302_ERR_PARAM; -} - -FUSB302_ret_t FUSB302_get_cc(FUSB302_dev_t *dev, uint8_t *cc1, uint8_t *cc2) -{ - if (cc1) { - *cc1 = dev->cc1; - } - if (cc2) { - *cc2 = dev->cc2; - } - return FUSB302_SUCCESS; -} - -FUSB302_ret_t FUSB302_get_vbus_level(FUSB302_dev_t *dev, uint8_t *vbus) -{ - uint8_t reg_control; - REG_READ(ADDRESS_STATUS0, ®_control, 1); - *vbus = reg_control & VBUSOK ? 1 : 0; - return FUSB302_SUCCESS; -} - -FUSB302_ret_t FUSB302_get_message(FUSB302_dev_t *dev, uint16_t * header, uint32_t * data) -{ - if (header) { - *header = dev->rx_header; - } - if (data) { - uint8_t len = (dev->rx_header >> 12) & 0x7; - memcpy(data, dev->rx_buffer, len * 4); - } - return FUSB302_SUCCESS; -} - -FUSB302_ret_t FUSB302_tx_sop(FUSB302_dev_t *dev, uint16_t header, const uint32_t *data) -{ - uint8_t buf[40]; - uint8_t * pbuf = buf; - uint8_t obj_count = ((header >> 12) & 7); - *pbuf++ = (uint8_t)TX_TOKEN_SOP1; - *pbuf++ = (uint8_t)TX_TOKEN_SOP1; - *pbuf++ = (uint8_t)TX_TOKEN_SOP1; - *pbuf++ = (uint8_t)TX_TOKEN_SOP2; - *pbuf++ = (uint8_t)TX_TOKEN_PACKSYM | ((obj_count << 2) + 2); - *pbuf++ = header & 0xFF; header >>= 8; - *pbuf++ = header & 0xFF; - for (uint8_t i = 0; i < obj_count; i++) { - uint32_t d = *data++; - *pbuf++ = d & 0xFF; d >>= 8; - *pbuf++ = d & 0xFF; d >>= 8; - *pbuf++ = d & 0xFF; d >>= 8; - *pbuf++ = d & 0xFF; - } - *pbuf++ = (uint8_t)TX_TOKEN_JAM_CRC; - *pbuf++ = (uint8_t)TX_TOKEN_EOP; - *pbuf++ = (uint8_t)TX_TOKEN_TXOFF; - *pbuf++ = (uint8_t)TX_TOKEN_TXON; - REG_WRITE(ADDRESS_FIFOS, buf, pbuf - buf); - dev->delay_ms(2); - return FUSB302_SUCCESS; -} - -FUSB302_ret_t FUSB302_tx_hard_reset(FUSB302_dev_t *dev) -{ - uint8_t reg_control = REG_CONTROL3; - reg_control |= SEND_HARDRESET; - REG_WRITE(ADDRESS_CONTROL3, ®_control, 1); - dev->delay_ms(6); - reg_control = PD_RESET; - REG_WRITE(ADDRESS_RESET, ®_control, 1); - return FUSB302_SUCCESS; -} - -FUSB302_ret_t FUSB302_alert(FUSB302_dev_t *dev, FUSB302_event_t * events) -{ - FUSB302_ret_t (* const handler[]) (FUSB302_dev_t *, FUSB302_event_t *) = { - FUSB302_state_unattached, - FUSB302_state_attached - }; - if (dev->state < sizeof(handler) / sizeof(handler[0])) { - return handler[dev->state](dev, events); - } - dev->state = FUSB302_STATE_UNATTACHED; - return FUSB302_SUCCESS; -} diff --git a/software/Power_Pico/BSP/PD/FUSB302_UFP.h b/software/Power_Pico/BSP/PD/FUSB302_UFP.h deleted file mode 100644 index 77beafb..0000000 --- a/software/Power_Pico/BSP/PD/FUSB302_UFP.h +++ /dev/null @@ -1,76 +0,0 @@ - -/** - * FUSB302_UFP.h - * - * Updated on: Jan 4, 2021 - * Author: Ryan Ma - * - * Minimalist USB PD implement with only UFP(device) functionality - * Requires only stdint.h and string.h - * No use of bit-field for better cross-platform compatibility - * - * FUSB302 can support PD3.0 with limitations and workarounds - * - Do not have enough FIFO for unchunked message, use chunked message instead - * - VBUS sense low threshold at 4V, disable vbus_sense if request PPS below 4V - * - */ - -#ifndef FUSB302_UFP_H -#define FUSB302_UFP_H - -#include - -enum { - FUSB302_SUCCESS = 0, - FUSB302_BUSY = (1 << 0), - FUSB302_ERR_PARAM = (1 << 1), - FUSB302_ERR_DEVICE_ID = (1 << 2), - FUSB302_ERR_READ_DEVICE = (1 << 3), - FUSB302_ERR_WRITE_DEVICE = (1 << 4) -}; -typedef uint8_t FUSB302_ret_t; - -#define FUSB302_EVENT_ATTACHED (1 << 0) -#define FUSB302_EVENT_DETACHED (1 << 1) -#define FUSB302_EVENT_RX_SOP (1 << 2) -#define FUSB302_EVENT_GOOD_CRC_SENT (1 << 3) -typedef uint8_t FUSB302_event_t; - -typedef struct { - /* setup by user */ - uint8_t i2c_address; - FUSB302_ret_t (*i2c_read)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count); - FUSB302_ret_t (*i2c_write)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count); - FUSB302_ret_t (*delay_ms)(uint32_t t); - - /* used by this library */ - const char * err_msg; - uint16_t rx_header; - uint8_t rx_buffer[32]; - uint8_t reg_control[15]; - uint8_t reg_status[7]; - - uint8_t interrupta; - uint8_t interruptb; - uint8_t cc1; - uint8_t cc2; - uint8_t state; - uint8_t vbus_sense; -} FUSB302_dev_t; - -static inline const char * FUSB302_get_last_err_msg(FUSB302_dev_t *dev) { return dev->err_msg; } - -FUSB302_ret_t FUSB302_init (FUSB302_dev_t *dev); -FUSB302_ret_t FUSB302_pd_reset (FUSB302_dev_t *dev); -FUSB302_ret_t FUSB302_pdwn_cc (FUSB302_dev_t *dev, uint8_t enable); -FUSB302_ret_t FUSB302_set_vbus_sense (FUSB302_dev_t *dev, uint8_t enable); -FUSB302_ret_t FUSB302_get_ID (FUSB302_dev_t *dev, uint8_t *version_ID, uint8_t *revision_ID); -FUSB302_ret_t FUSB302_get_cc (FUSB302_dev_t *dev, uint8_t *cc1, uint8_t *cc2); -FUSB302_ret_t FUSB302_get_vbus_level (FUSB302_dev_t *dev, uint8_t *vbus); -FUSB302_ret_t FUSB302_get_message (FUSB302_dev_t *dev, uint16_t *header, uint32_t *data); -FUSB302_ret_t FUSB302_tx_sop (FUSB302_dev_t *dev, uint16_t header, const uint32_t *data); -FUSB302_ret_t FUSB302_tx_hard_reset (FUSB302_dev_t *dev); -FUSB302_ret_t FUSB302_alert (FUSB302_dev_t *dev, FUSB302_event_t *events); - -#endif /* FUSB302_H */ - diff --git a/software/Power_Pico/BSP/PD/PD_UFP_Protocol.c b/software/Power_Pico/BSP/PD/PD_UFP_Protocol.c deleted file mode 100644 index aac1e9e..0000000 --- a/software/Power_Pico/BSP/PD/PD_UFP_Protocol.c +++ /dev/null @@ -1,599 +0,0 @@ - -/** - * PD_UFP_Protocol.c - * - * Updated on: Jan 25, 2021 - * Author: Ryan Ma - * - * Minimalist USB PD implement with only UFP(device) sink only functionality - * Requires PD PHY to do automatic GoodCRC response on valid SOP messages. - * Requires only stdint.h, stdbool.h and string.h - * No use of bit-field for better cross-platform compatibility - * - * Support PD3.0 PPS - * Do not support extended message. Not necessary for PD trigger and PPS. - * - * Reference: USB_PD_R2_0 V1.3 - 20170112 - * USB_PD_R3_0 V2.0 20190829 + ECNs 2020-12-10 - * - Chapter 6. Protocol Layer - * - */ - -#include -#include "PD_UFP_Protocol.h" - -#define PD_SPECIFICATION_REVISION 0x2 - -#define PD_CONTROL_MSG_TYPE_ACCEPT 0x3 -#define PD_CONTROL_MSG_TYPE_REJECT 0x4 -#define PD_CONTROL_MSG_TYPE_GET_SRC_CAP 0x7 -#define PD_CONTROL_MSG_TYPE_NOT_SUPPORT 0x10 -#define PD_CONTROL_MSG_TYPE_GET_PPS_STATUS 0x14 - -#define PD_DATA_MSG_TYPE_REQUEST 0x2 -#define PD_DATA_MSG_TYPE_SINK_CAP 0x4 -#define PD_DATA_MSG_TYPE_VENDOR_DEFINED 0xF - -#define PD_EXT_MSG_TYPE_SINK_CAP_EXT 0xF - -typedef struct { - uint8_t type; - uint8_t spec_rev; - uint8_t id; - uint8_t num_of_obj; -} PD_msg_header_info_t; - -typedef struct { - uint16_t limit; - uint8_t use_voltage; - uint8_t use_current; -} PD_power_option_setting_t; - -struct PD_msg_state_t { - const char * name; - void (*handler)(PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events); - bool (*responder)(PD_protocol_t * p, uint16_t * header, uint32_t * obj); -}; - -/* Optimize RAM usage on AVR MCU by allocate const in PROGMEM */ -#if defined(__AVR__) -#include -#define SET_MSG_STAGE(d, s) do { static struct PD_msg_state_t m; memcpy_P(&m, s, sizeof(struct PD_msg_state_t)); d = &m; } while (0) -#define SET_MSG_NAME(d, s) do { static char n[16]; strncpy_P(n, s, 15); d = n; } while (0) -#define COPY_PDO(d, s) do { memcpy_P(&d, &s, 4); } while (0) -#else -#define PROGMEM -#define SET_MSG_STAGE(d, s) do { d = s; } while (0) -#define SET_MSG_NAME(d, s) do { d = s; } while (0) -#define COPY_PDO(d, s) do { d = s; } while (0) -#endif - -#define T(name) static const char str_ ## name [] PROGMEM = #name - -static void handler_good_crc (PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events); -static void handler_goto_min (PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events); -static void handler_accept (PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events); -static void handler_reject (PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events); -static void handler_ps_rdy (PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events); -static void handler_source_cap (PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events); -static void handler_BIST (PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events); -static void handler_alert (PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events); -static void handler_vender_def (PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events); -static void handler_PPS_Status (PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events); - -static bool responder_get_sink_cap (PD_protocol_t * p, uint16_t * header, uint32_t * obj); -static bool responder_reject (PD_protocol_t * p, uint16_t * header, uint32_t * obj); -static bool responder_soft_reset (PD_protocol_t * p, uint16_t * header, uint32_t * obj); -static bool responder_source_cap (PD_protocol_t * p, uint16_t * header, uint32_t * obj); -static bool responder_vender_def (PD_protocol_t * p, uint16_t * header, uint32_t * obj); -static bool responder_sink_cap_ext (PD_protocol_t * p, uint16_t * header, uint32_t * obj); -static bool responder_not_support (PD_protocol_t * p, uint16_t * header, uint32_t * obj); - -T(C0); T(GoodCRC); T(GotoMin); T(Accept); T(Reject); T(Ping); T(PS_RDY); T(Get_Src_Cap); -T(Get_Sink_Cap); T(DR_Swap); T(PR_Swap); T(VCONN_Swap); T(Wait); T(Soft_Rst); T(Dat_Rst); T(Dat_Rst_Cpt); -T(NS); T(Get_Src_Ext); T(Get_Stat); T(FR_Swap); T(Get_PPS_Stat); T(Get_CC); T(Get_Sink_Ext); T(C_R); - -static const struct PD_msg_state_t ctrl_msg_list[] PROGMEM = { - {.name = str_C0, .handler = 0, .responder = 0}, - {.name = str_GoodCRC, .handler = handler_good_crc, .responder = 0}, - {.name = str_GotoMin, .handler = handler_goto_min, .responder = 0}, - {.name = str_Accept, .handler = handler_accept, .responder = 0}, - {.name = str_Reject, .handler = handler_reject, .responder = 0}, - {.name = str_Ping, .handler = 0, .responder = 0}, - {.name = str_PS_RDY, .handler = handler_ps_rdy, .responder = 0}, - {.name = str_Get_Src_Cap, .handler = 0, .responder = responder_not_support}, - {.name = str_Get_Sink_Cap, .handler = 0, .responder = responder_get_sink_cap}, - {.name = str_DR_Swap, .handler = 0, .responder = responder_reject}, - {.name = str_PR_Swap, .handler = 0, .responder = responder_not_support}, - {.name = str_VCONN_Swap, .handler = 0, .responder = responder_reject}, - {.name = str_Wait, .handler = 0, .responder = 0}, - {.name = str_Soft_Rst, .handler = 0, .responder = responder_soft_reset}, - {.name = str_Dat_Rst, .handler = 0, .responder = 0}, - {.name = str_Dat_Rst_Cpt, .handler = 0, .responder = 0}, - - {.name = str_NS, .handler = 0, .responder = 0}, - {.name = str_Get_Src_Ext, .handler = 0, .responder = responder_not_support}, - {.name = str_Get_Stat, .handler = 0, .responder = responder_not_support}, - {.name = str_FR_Swap, .handler = 0, .responder = responder_not_support}, - {.name = str_Get_PPS_Stat, .handler = 0, .responder = responder_not_support}, - {.name = str_Get_CC, .handler = 0, .responder = responder_not_support}, - {.name = str_Get_Sink_Ext, .handler = 0, .responder = responder_sink_cap_ext}, - {.name = str_C_R, .handler = 0, .responder = responder_not_support}, -}; - -T(D0); T(Src_Cap); T(Request); T(BIST); T(Sink_Cap); T(Bat_Stat); T(Alert); T(Get_CI); -T(Enter_USB); T(D9); T(D10); T(D11); T(D12); T(D13); T(D14); T(VDM); -T(D_R); - -static const struct PD_msg_state_t data_msg_list[] PROGMEM = { - {.name = str_D0, .handler = 0, .responder = 0}, - {.name = str_Src_Cap, .handler = handler_source_cap, .responder = responder_source_cap}, - {.name = str_Request, .handler = 0, .responder = responder_not_support}, - {.name = str_BIST, .handler = handler_BIST, .responder = 0}, - {.name = str_Sink_Cap, .handler = 0, .responder = responder_not_support}, - {.name = str_Bat_Stat, .handler = 0, .responder = responder_not_support}, - {.name = str_Alert, .handler = handler_alert, .responder = 0}, - {.name = str_Get_CI, .handler = 0, .responder = responder_not_support}, - {.name = str_Enter_USB, .handler = 0, .responder = 0}, - {.name = str_D9, .handler = 0, .responder = 0}, - {.name = str_D10, .handler = 0, .responder = 0}, - {.name = str_D11, .handler = 0, .responder = 0}, - {.name = str_D12, .handler = 0, .responder = 0}, - {.name = str_D13, .handler = 0, .responder = 0}, - {.name = str_D14, .handler = 0, .responder = 0}, - {.name = str_VDM, .handler = handler_vender_def, .responder = responder_vender_def}, - - {.name = str_D_R, .handler = 0, .responder = responder_not_support}, -}; - -T(E0); T(Src_Cap_Ext); T(Status); T(Get_Bat_cap); T(Get_Bat_Stat); T(Bat_Cap); T(Get_Mfg_Info); T(Mfg_Info); -T(Sec_Request); T(Sec_Response); T(FU_request); T(FU_Response); T(PPS_Stat); T(Country_Info); T(Country_Code); T(Sink_Cap_Ext); -T(E_R); - -static const struct PD_msg_state_t ext_msg_list[] PROGMEM = { - {.name = str_E0, .handler = 0, .responder = responder_not_support}, - {.name = str_Src_Cap_Ext, .handler = 0, .responder = 0}, - {.name = str_Status, .handler = 0, .responder = 0}, - {.name = str_Get_Bat_cap, .handler = 0, .responder = responder_not_support}, - {.name = str_Get_Bat_Stat, .handler = 0, .responder = responder_not_support}, - {.name = str_Bat_Cap, .handler = 0, .responder = 0}, - {.name = str_Get_Mfg_Info, .handler = 0, .responder = responder_not_support}, - {.name = str_Mfg_Info, .handler = 0, .responder = 0}, - {.name = str_Sec_Request, .handler = 0, .responder = responder_not_support}, - {.name = str_Sec_Response, .handler = 0, .responder = 0}, - {.name = str_FU_request, .handler = 0, .responder = responder_not_support}, - {.name = str_FU_Response, .handler = 0, .responder = 0}, - {.name = str_PPS_Stat, .handler = handler_PPS_Status, .responder = 0}, - {.name = str_Country_Info, .handler = 0, .responder = 0}, - {.name = str_Country_Code, .handler = 0, .responder = 0}, - {.name = str_Sink_Cap_Ext, .handler = 0, .responder = responder_not_support}, - - {.name = str_E_R, .handler = 0, .responder = responder_not_support}, -}; - -static const PD_power_option_setting_t power_option_setting[8] = { - {.limit = 25, .use_voltage = 1, .use_current = 0}, /* PD_POWER_OPTION_MAX_5V */ - {.limit = 45, .use_voltage = 1, .use_current = 0}, /* PD_POWER_OPTION_MAX_9V */ - {.limit = 60, .use_voltage = 1, .use_current = 0}, /* PD_POWER_OPTION_MAX_12V */ - {.limit = 75, .use_voltage = 1, .use_current = 0}, /* PD_POWER_OPTION_MAX_15V */ - {.limit = 100, .use_voltage = 1, .use_current = 0}, /* PD_POWER_OPTION_MAX_20V */ - {.limit = 100, .use_voltage = 1, .use_current = 0}, /* PD_POWER_OPTION_MAX_VOLTAGE */ - {.limit = 125, .use_voltage = 0, .use_current = 1}, /* PD_POWER_OPTION_MAX_CURRENT */ - {.limit = 12500,.use_voltage = 1, .use_current = 1}, /* PD_POWER_OPTION_MAX_POWER */ -}; - -static uint8_t evaluate_src_cap(PD_protocol_t * p, uint16_t PPS_voltage, uint8_t PPS_current) -{ - const PD_power_option_setting_t * setting; - PD_power_info_t info; - uint8_t option = p->power_option; - uint8_t selected = 0; - - /* If selected option is not available, use first PDO. Reference: 6.4.1 Capabilities Message - The vSafe5V Fixed Supply Object Shall always be the first object. */ - if (option >= sizeof(power_option_setting) / sizeof(power_option_setting[0])) { - return 0; - } - - setting = &power_option_setting[option]; - for (uint8_t n = 0; PD_protocol_get_power_info(p, n, &info); n++) { - if (info.type == PD_PDO_TYPE_AUGMENTED_PDO) { - uint16_t pps_v = PPS_voltage * 2; /* Voltage in 20mV units */ - uint16_t pps_i = PPS_current * 5; /* Current in 50mA units */ - /* PD_power_info_t: Voltage in 50mV units, Current in 10mA units */ - if (info.min_v * 5 <= pps_v && pps_v <= info.max_v * 5 && pps_i <= info.max_i) { - return n; - } - } else { - uint8_t v = setting->use_voltage ? info.max_v >> 2 : 1; - uint8_t i = setting->use_current ? info.max_i >> 2 : 1; - uint16_t power = (uint16_t)v * i; /* reduce 10-bit power info to 8-bit and use 8-bit x 8-bit multiplication */ - if (power <= setting->limit) { - selected = n; - } - } - } - return selected; -} - -static void parse_header(PD_msg_header_info_t * info, uint16_t header) -{ - /* Reference: 6.2.1.1 Message Header */ - info->type = (header >> 0) & 0x1F; /* 4...0 Message Type */ - info->spec_rev = (header >> 6) & 0x3; /* 7...6 Specification Revision */ - info->id = (header >> 9) & 0x7; /* 11...9 MessageID */ - info->num_of_obj = (header >> 12) & 0x7; /* 14...12 Number of Data Objects */ -} - -static uint16_t generate_header(PD_protocol_t * p, uint8_t type, uint8_t obj_count) -{ - /* Reference: 6.2.1.1 Message Header */ - uint16_t h = ((uint16_t)type << 0) | /* 4...0 Message Type */ - ((uint16_t)PD_SPECIFICATION_REVISION << 6) | /* 7...6 Specification Revision */ - ((uint16_t)p->message_id << 9) | /* 11...9 MessageID */ - ((uint16_t)obj_count << 12); /* 14...12 Number of Data Objects */ - p->tx_msg_header = h; - return h; -} - -static uint16_t generate_header_ext(PD_protocol_t * p, uint8_t type, uint8_t data_size, uint32_t * obj) -{ - uint16_t h = generate_header(p, type, (data_size + 5) >> 2); /* set obj_count to fit ext header and data */ - h |= (uint16_t)1 << 15; /* Set extended field */ - /* Reference: 6.2.1.2 Extended Message Headerr */ - obj[0] |= ((uint16_t)data_size << 0) | /* 8...0 ata Size */ - /* Assume short message, set Chunk Number and Request Chunk to 0 */ - ((uint16_t)1 << 15); /* 15 Chunked */ - p->tx_msg_header = h; - return h; -} - -static void handler_good_crc(PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events) -{ - /* Reference: 6.2.1.3 Message ID - MessageIDCounter Shall be initialized to zero at power-on / reset, increment when receive GoodCRC Message */ - uint8_t message_id = p->message_id; - if (++message_id > 7) { - message_id = 0; - } - p->message_id = message_id; -} - -static void handler_goto_min(PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events) -{ - // Not implemented -} - -static void handler_accept(PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events) -{ - if (events) { - *events |= PD_PROTOCOL_EVENT_ACCEPT; - } -} - -static void handler_reject(PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events) -{ - if (events) { - *events |= PD_PROTOCOL_EVENT_PS_RDY; - } -} - -static void handler_ps_rdy(PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events) -{ - if (events) { - *events |= PD_PROTOCOL_EVENT_PS_RDY; - } -} - -static void handler_source_cap(PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events) -{ - PD_msg_header_info_t h; - parse_header(&h, header); - p->power_data_obj_count = h.num_of_obj; - for (uint8_t i = 0; i < h.num_of_obj; i++) { - p->power_data_obj[i] = obj[i]; - } - p->power_data_obj_selected = evaluate_src_cap(p, p->PPS_voltage, p->PPS_current); - if (events) { - *events |= PD_PROTOCOL_EVENT_SRC_CAP; - } -} - -static void handler_BIST(PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events) -{ - // TODO: implement BIST -} - -static void handler_alert(PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events) -{ - // TODO: implement alert -} - -static void handler_vender_def(PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events) -{ - // TODO: implement VDM parsing -} - -static void handler_PPS_Status(PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events) -{ - /* Handle chunked Extended message, Offset 2 byte for Extended Message Header */ - p->PPSSDB[0] = (obj[0] >> 16) & 0xFF; - p->PPSSDB[1] = (obj[0] >> 24) & 0xFF; - p->PPSSDB[2] = (obj[1] >> 0) & 0xFF; - p->PPSSDB[3] = (obj[1] >> 8) & 0xFF; - if (events) { - *events |= PD_PROTOCOL_EVENT_PPS_STATUS; - } -} - -static bool responder_get_sink_cap(PD_protocol_t * p, uint16_t * header, uint32_t * obj) -{ - /* Reference: 6.4.1.2.3 Sink Fixed Supply Power Data Object */ - uint32_t data = ((uint32_t)100 << 0) | /* B9...0 Operational Current in 10mA units */ - ((uint32_t)100 << 10) | /* B19...10 Voltage in 50mV units */ - ((uint32_t)1 << 26) | /* B26 USB Communications Capable */ - ((uint32_t)1 << 28) | /* B28 Higher Capability */ - ((uint32_t)PD_PDO_TYPE_FIXED_SUPPLY << 30); /* B31...30 Fixed supply */ - *obj = data; /* Only implement 5V 1A Fix supply PDO. Source rarely request sink cap */ - *header = generate_header(p, PD_DATA_MSG_TYPE_SINK_CAP, 1); - return true; -} - -static bool responder_sink_cap_ext(PD_protocol_t * p, uint16_t * header, uint32_t * obj) -{ - /* Reference: 6.5.13 Sink_Capabilities_Extended Message - 6.12.3 Applicability of Extended Messages (Normative; Shall be supported) */ - #define SINK_CAP_VID 0 - #define SINK_CAP_PID 0 - #define SINK_CAP_XID 0 /* If the vendor does not have an XID, then it Shall return zero */ - #define SINK_CAP_FW_Version 1 - #define SINK_CAP_HW_Version 1 - #define SINK_CAP_SKEDB_Version 1 - #define SINK_CAP_SINK_MODE 0x3 /* Bit 0: PPS charging supported, Bit 1: VBUS powered */ - #define SINK_CAP_SINK_MIN_PDP 5 /* Minimum PD Power in Watt */ - #define SINK_CAP_SINK_OP_PDP 5 /* Operational PD Power in Watt */ - #define SINK_CAP_SINK_MAX_PDP 100 /* Maximum PD Power in Watt */ - static const uint32_t SKEDB[6] PROGMEM = { /* 2-byte header + 21-byte data, chunked to 6 PDO */ - /* PDO[0], data byte 0...1 */ - /* 16-bit LSB is reserved for Extended Message Header */ - ((uint32_t)SINK_CAP_VID << 16), /* Byte 0...1 VID */ - /* PDO[1], data byte 2...5 */ - ((uint32_t)SINK_CAP_PID << 0) | /* Byte 2...3 PID */ - (((uint32_t)SINK_CAP_XID & 0xFF) << 16), /* Byte 4...5 XID */ - /* PDO[2], data byte 6...9 */ - (((uint32_t)SINK_CAP_XID >> 16) << 0) | /* Byte 6...7 XID */ - ((uint32_t)SINK_CAP_FW_Version << 16) | /* Byte 8 FW Version */ - ((uint32_t)SINK_CAP_HW_Version << 24), /* Byte 9 HW Version */ - /* PDO[3], data byte 10...13 */ - ((uint32_t)SINK_CAP_SKEDB_Version << 0), /* Byte 10 SKEDB Version */ - /* Not set Byte 11 Load Step, Byte 13..12 Sink Load Characteristics */ - /* PDO[4], data byte 14...17 */ - /* Not set Byte 14 Compliance, Byte 15 Touch Temp, Byte 16 Battery Info */ - ((uint32_t)SINK_CAP_SINK_MODE << 24), /* Byte 17 Sink Modes */ - /* PDO[5], data byte 18...20 */ - ((uint32_t)SINK_CAP_SINK_MIN_PDP << 0) | /* Byte 18 Minimum PDP */ - ((uint32_t)SINK_CAP_SINK_OP_PDP << 8) | /* Byte 19 Operational PDP */ - ((uint32_t)SINK_CAP_SINK_MAX_PDP << 16) /* Byte 20 Maximum PDP */ - }; - uint8_t i; - for (i = 0; i < 6; i++) { - COPY_PDO(obj[i], SKEDB[i]); - } - *header = generate_header_ext(p, PD_EXT_MSG_TYPE_SINK_CAP_EXT, 21, obj); - return false; -} - -static bool responder_reject(PD_protocol_t * p, uint16_t * header, uint32_t * obj) -{ - *header = generate_header(p, PD_CONTROL_MSG_TYPE_REJECT, 0); - return true; -} - -static bool responder_not_support(PD_protocol_t * p, uint16_t * header, uint32_t * obj) -{ - *header = generate_header(p, PD_CONTROL_MSG_TYPE_NOT_SUPPORT, 0); - return true; -} - -static bool responder_soft_reset(PD_protocol_t * p, uint16_t * header, uint32_t * obj) -{ - *header = generate_header(p, PD_CONTROL_MSG_TYPE_ACCEPT, 0); - return true; -} - -static bool responder_source_cap(PD_protocol_t * p, uint16_t * header, uint32_t * obj) -{ - PD_power_info_t info; - uint32_t data, pos = p->power_data_obj_selected + 1; - PD_protocol_get_power_info(p, p->power_data_obj_selected, &info); - /* Reference: 6.4.2 Request Message */ - if (info.type == PD_PDO_TYPE_AUGMENTED_PDO) { - /* NOTE: To compatible PD2.0 PHY, do not set Unchunked Extended Messages Supported */ - data = ((uint32_t)p->PPS_current << 0) | /* B6 ...0 Operating Current 50mA units */ - ((uint32_t)p->PPS_voltage << 9) | /* B19...9 Output Voltage in 20mV units */ - ((uint32_t)1 << 25) | /* B25 USB Communication Capable */ - ((uint32_t)pos << 28); /* B30...28 Object position (000b is Reserved and Shall Not be used) */ - } else { - uint32_t req = info.max_i ? info.max_i : info.max_p; - data = ((uint32_t)req << 0) | /* B9 ...0 Max Operating Current 10mA units / Max Operating Power in 250mW units */ - ((uint32_t)req << 10) | /* B19...10 Operating Current 10mA units / Operating Power in 250mW units */ - ((uint32_t)1 << 25) | /* B25 USB Communication Capable */ - ((uint32_t)pos << 28); /* B30...28 Object position (000b is Reserved and Shall Not be used) */ - } - *obj = data; - *header = generate_header(p, PD_DATA_MSG_TYPE_REQUEST, 1); - return true; -} - -static bool responder_vender_def(PD_protocol_t * p, uint16_t * header, uint32_t * obj) -{ - // TODO: implement VDM respond - return false; -} - -void PD_protocol_handle_msg(PD_protocol_t * p, uint16_t header, uint32_t * obj, PD_protocol_event_t * events) -{ - #define EXT_MSG_LIMIT (sizeof(ext_msg_list) / sizeof(ext_msg_list[0]) - 1) - #define DATA_MSG_LIMIT (sizeof(data_msg_list) / sizeof(data_msg_list[0]) - 1) - #define CTRL_MSG_LIMIT (sizeof(ctrl_msg_list) / sizeof(ctrl_msg_list[0]) - 1) - - const struct PD_msg_state_t * state; - PD_msg_header_info_t h; - parse_header(&h, header); - p->rx_msg_header = header; - if ((header >> 15) & 0x1) { - state = &ext_msg_list[h.type > EXT_MSG_LIMIT ? EXT_MSG_LIMIT : h.type]; - } else if (h.num_of_obj) { - state = &data_msg_list[h.type > DATA_MSG_LIMIT ? DATA_MSG_LIMIT : h.type]; - } else { - state =&ctrl_msg_list[h.type > CTRL_MSG_LIMIT ? CTRL_MSG_LIMIT : h.type]; - } - SET_MSG_STAGE(p->msg_state, state); - if (p->msg_state->handler) { - p->msg_state->handler(p, header, obj, events); - } -} - -bool PD_protocol_respond(PD_protocol_t * p, uint16_t * header, uint32_t * obj) -{ - if (p && p->msg_state && p->msg_state->responder && header && obj) { - return p->msg_state->responder(p, (uint16_t *)header, obj); - } - return false; -} - -void PD_protocol_create_get_src_cap(PD_protocol_t * p, uint16_t * header) -{ - *header = generate_header(p, PD_CONTROL_MSG_TYPE_GET_SRC_CAP, 0); -} - -void PD_protocol_create_get_PPS_status(PD_protocol_t *p, uint16_t *header) -{ - *header = generate_header(p, PD_CONTROL_MSG_TYPE_GET_PPS_STATUS, 0); -} - -void PD_protocol_create_request(PD_protocol_t * p, uint16_t * header, uint32_t * obj) -{ - responder_source_cap(p, header, obj); -} - -bool PD_protocol_get_power_info(PD_protocol_t * p, uint8_t index, PD_power_info_t * power_info) -{ - if (p && index < p->power_data_obj_count && power_info) { - uint32_t obj = p->power_data_obj[index]; - power_info->type = obj >> 30; - switch (power_info->type) { - case PD_PDO_TYPE_FIXED_SUPPLY: - /* Reference: 6.4.1.2.3 Source Fixed Supply Power Data Object */ - power_info->min_v = 0; - power_info->max_v = (obj >> 10) & 0x3FF; /* B19...10 Voltage in 50mV units */ - power_info->max_i = (obj >> 0) & 0x3FF; /* B9 ...0 Max Current in 10mA units */ - power_info->max_p = 0; - break; - case PD_PDO_TYPE_BATTERY: - /* Reference: 6.4.1.2.5 Battery Supply Power Data Object */ - power_info->min_v = (obj >> 10) & 0x3FF; /* B19...10 Min Voltage in 50mV units */ - power_info->max_v = (obj >> 20) & 0x3FF; /* B29...20 Max Voltage in 50mV units */ - power_info->max_i = 0; - power_info->max_p = (obj >> 0) & 0x3FF; /* B9 ...0 Max Allowable Power in 250mW units */ - break; - case PD_PDO_TYPE_VARIABLE_SUPPLY: - /* Reference: 6.4.1.2.4 Variable Supply (non-Battery) Power Data Object */ - power_info->min_v = (obj >> 10) & 0x3FF; /* B19...10 Min Voltage in 50mV units */ - power_info->max_v = (obj >> 20) & 0x3FF; /* B29...20 Max Voltage in 50mV units */ - power_info->max_i = (obj >> 0) & 0x3FF; /* B9 ...0 Max Current in 10mA units */ - power_info->max_p = 0; - break; - case PD_PDO_TYPE_AUGMENTED_PDO: - /* Reference: 6.4.1.3.4 Programmable Power Supply Augmented Power Data Object */ - power_info->max_v = ((obj >> 17) & 0xFF) * 2; /* B24...17 Max Voltage in 100mV units */ - power_info->min_v = ((obj >> 8) & 0xFF) * 2; /* B15...8 Min Voltage in 100mV units */ - power_info->max_i = ((obj >> 0) & 0x7F) * 5; /* B6 ...0 Max Current in 50mA units */ - power_info->max_p = 0; - break; - } - return true; - } - return false; -} - -bool PD_protocol_get_msg_info(uint16_t header, PD_msg_info_t * msg_info) -{ - PD_msg_header_info_t h; - parse_header(&h, header); - if (msg_info) { - const char * name; - const struct PD_msg_state_t * state; - uint8_t type = h.type; - SET_MSG_STAGE(state, header & 0x8000 ? &ext_msg_list[type] : - h.num_of_obj ? &data_msg_list[type] : &ctrl_msg_list[type]); - SET_MSG_NAME(name, state->name); - msg_info->name = name; - msg_info->id = h.id; - msg_info->spec_rev = h.spec_rev; - msg_info->num_of_obj = h.num_of_obj; - msg_info->extended = header >> 15; - return true; - } - return false; -} - -bool PD_protocol_get_PPS_status(PD_protocol_t *p, PPS_status_t * PPS_status) -{ - if (p && PPS_status) { - /* Reference: 6.5.10 PPS_Status Message */ - PPS_status->output_voltage = ((uint16_t)p->PPSSDB[1] << 8) | p->PPSSDB[0]; - PPS_status->output_current = p->PPSSDB[2]; - PPS_status->flag_PTF = (p->PPSSDB[3] >> 1) & 0x3; /* Bit 1 ... 2 */ - PPS_status->flag_OMF = (p->PPSSDB[3] >> 3) & 0x1; /* Bit 3 */ - return true; - } - return false; -} - -bool PD_protocol_set_power_option(PD_protocol_t * p, enum PD_power_option_t option) -{ - p->power_option = option; - p->PPS_voltage = 0; - p->PPS_current = 0; - if (p->power_data_obj_count > 0) { - p->power_data_obj_selected = evaluate_src_cap(p, p->PPS_voltage, p->PPS_current); - return true; /* need to re-send request */ - } - return false; -} - -bool PD_protocol_select_power(PD_protocol_t * p, uint8_t index) -{ - if (index < p->power_data_obj_count) { - p->power_data_obj_selected = index; - return true; /* need to re-send request */ - } - return false; -} - -bool PD_protocol_set_PPS(PD_protocol_t * p, uint16_t PPS_voltage, uint8_t PPS_current, bool strict) -{ - if (p->PPS_voltage != PPS_voltage || p->PPS_current != PPS_current) { - uint8_t selected = evaluate_src_cap(p, PPS_voltage, PPS_current); - if (selected || !strict) { - p->PPS_voltage = PPS_voltage; - p->PPS_current = PPS_current; - p->power_data_obj_selected = selected; - return true; /* need to re-send request */ - } - } - return false; -} - -void PD_protocol_reset(PD_protocol_t * p) -{ - p->msg_state = &ctrl_msg_list[0]; - p->message_id = 0; -} - -void PD_protocol_init(PD_protocol_t * p) -{ - memset(p, 0, sizeof(PD_protocol_t)); - p->msg_state = &ctrl_msg_list[0]; -} diff --git a/software/Power_Pico/BSP/PD/PD_UFP_Protocol.h b/software/Power_Pico/BSP/PD/PD_UFP_Protocol.h deleted file mode 100644 index 973f23a..0000000 --- a/software/Power_Pico/BSP/PD/PD_UFP_Protocol.h +++ /dev/null @@ -1,150 +0,0 @@ - -/** - * PD_UFP_Protocol.c - * - * Updated on: Aug 25, 2021 - * Author: Ryan Ma - * - * Minimalist USB PD implement with only UFP(device) sink only functionality - * Requires PD PHY to do automatic GoodCRC response on valid SOP messages. - * Requires only stdint.h, stdbool.h and string.h - * No use of bit-field for better cross-platform compatibility - * - * Support PD3.0 PPS - * Do not support extended message. Not necessary for PD trigger and PPS. - * - * Reference: USB_PD_R2_0 V1.3 - 20170112 - * USB_PD_R3_0 V2.0 20190829 + ECNs 2020-12-10 - * - Chapter 6. Protocol Layer - * - */ - -#ifndef PD_UFP_PROTOCOL_H -#define PD_UFP_PROTOCOL_H - -#include -#include - -/* For use in PD_protocol_get_power_info() */ -#define PD_V(v) ((uint16_t)(v * 20 + 0.01)) -#define PD_A(a) ((uint16_t)(a * 100 + 0.01)) - -/* For use in PD_protocol_set_PPS_option() */ -#define PPS_V(v) ((uint16_t)(v * 50 + 0.01)) -#define PPS_A(a) ((uint8_t)(a * 20 + 0.01)) - -#define PD_PROTOCOL_MAX_NUM_OF_PDO 7 - -#define PD_PROTOCOL_EVENT_SRC_CAP (1 << 0) -#define PD_PROTOCOL_EVENT_PS_RDY (1 << 1) -#define PD_PROTOCOL_EVENT_ACCEPT (1 << 2) -#define PD_PROTOCOL_EVENT_REJECT (1 << 3) -#define PD_PROTOCOL_EVENT_PPS_STATUS (1 << 4) - -typedef uint8_t PD_protocol_event_t; - -enum PD_power_option_t { - PD_POWER_OPTION_MAX_5V = 0, - PD_POWER_OPTION_MAX_9V = 1, - PD_POWER_OPTION_MAX_12V = 2, - PD_POWER_OPTION_MAX_15V = 3, - PD_POWER_OPTION_MAX_20V = 4, - PD_POWER_OPTION_MAX_VOLTAGE = 5, - PD_POWER_OPTION_MAX_CURRENT = 6, - PD_POWER_OPTION_MAX_POWER = 7, -}; - -enum PD_power_data_obj_type_t { /* Power data object type */ - PD_PDO_TYPE_FIXED_SUPPLY = 0, - PD_PDO_TYPE_BATTERY = 1, - PD_PDO_TYPE_VARIABLE_SUPPLY = 2, - PD_PDO_TYPE_AUGMENTED_PDO = 3 /* USB PD 3.0 */ -}; - -enum PPS_PTF_t { - PPS_PTF_NOT_SUPPORT = 0, - PPS_PTF_NORMAL = 1, - PPS_PTF_WARNING = 2, - PPS_PTF_OVER_TEMPERATURE = 3 -}; - -enum PPS_OMF_t { - PPS_OMF_VOLTAGE_MODE = 0, - PPS_OMF_CURRENT_LIMIT_MODE = 1 -}; - -typedef struct { - uint16_t output_voltage; /* Voltage in 20mV units, 0xFFFF if not supported */ - uint8_t output_current; /* Current in 50mV units, 0xFF if not supported */ - enum PPS_PTF_t flag_PTF; - enum PPS_OMF_t flag_OMF; -} PPS_status_t; - -typedef struct { - const char * name; - uint8_t id; - uint8_t spec_rev; - uint8_t num_of_obj; - uint8_t extended; -} PD_msg_info_t; - -typedef struct { - enum PD_power_data_obj_type_t type; - uint16_t min_v; /* Voltage in 50mV units */ - uint16_t max_v; /* Voltage in 50mV units */ - uint16_t max_i; /* Current in 10mA units */ - uint16_t max_p; /* Power in 250mW units */ -} PD_power_info_t; - -struct PD_msg_state_t; -typedef struct { - const struct PD_msg_state_t *msg_state; - uint16_t tx_msg_header; - uint16_t rx_msg_header; - uint8_t message_id; - - uint16_t PPS_voltage; - uint8_t PPS_current; - uint8_t PPSSDB[4]; /* PPS Status Data Block */ - - enum PD_power_option_t power_option; - uint32_t power_data_obj[PD_PROTOCOL_MAX_NUM_OF_PDO]; - uint8_t power_data_obj_count; - uint8_t power_data_obj_selected; -} PD_protocol_t; - -/* Message handler */ -void PD_protocol_handle_msg(PD_protocol_t *p, uint16_t header, uint32_t *obj, PD_protocol_event_t *events); -bool PD_protocol_respond(PD_protocol_t *p, uint16_t *h, uint32_t *obj); - -/* PD Message creation */ -void PD_protocol_create_get_src_cap(PD_protocol_t *p, uint16_t *header); -void PD_protocol_create_get_PPS_status(PD_protocol_t *p, uint16_t *header); -void PD_protocol_create_request(PD_protocol_t *p, uint16_t *header, uint32_t *obj); - -/* Get functions */ -static inline uint8_t PD_protocol_get_selected_power(PD_protocol_t *p) { return p->power_data_obj_selected; } -static inline uint16_t PD_protocol_get_PPS_voltage(PD_protocol_t *p) { return p->PPS_voltage; } /* Voltage in 20mV units */ -static inline uint8_t PD_protocol_get_PPS_current(PD_protocol_t *p) { return p->PPS_current; } /* Current in 50mA units */ - -static inline uint16_t PD_protocol_get_tx_msg_header(PD_protocol_t *p) { return p->tx_msg_header; } -static inline uint16_t PD_protocol_get_rx_msg_header(PD_protocol_t *p) { return p->rx_msg_header; } - -bool PD_protocol_get_msg_info(uint16_t header, PD_msg_info_t * msg_info); - -bool PD_protocol_get_power_info(PD_protocol_t *p, uint8_t index, PD_power_info_t *power_info); -bool PD_protocol_get_PPS_status(PD_protocol_t *p, PPS_status_t * PPS_status); - -/* Set Fixed and Variable power option */ -bool PD_protocol_set_power_option(PD_protocol_t *p, enum PD_power_option_t option); -bool PD_protocol_select_power(PD_protocol_t *p, uint8_t index); - -/* Set PPS Voltage in 20mV units, Current in 50mA units. return true if re-send request is needed - strict=true, If PPS setting is not qualified, return false, nothing is changed. - strict=false, if PPS setting is not qualified, fall back to regular power option */ -bool PD_protocol_set_PPS(PD_protocol_t * p, uint16_t PPS_voltage, uint8_t PPS_current, bool strict); - -void PD_protocol_reset(PD_protocol_t *p); -void PD_protocol_init(PD_protocol_t *p); - -#endif diff --git a/software/Power_Pico/BSP/PD/fusb302_dev.c b/software/Power_Pico/BSP/PD/fusb302_dev.c deleted file mode 100644 index e2f54b6..0000000 --- a/software/Power_Pico/BSP/PD/fusb302_dev.c +++ /dev/null @@ -1,196 +0,0 @@ -#include "fusb302_dev.h" -#include "i2c.h" -#include "cmsis_os2.h" - -#define FUSB302_USE_OS 1 - -#if FUSB302_USE_OS == 1 - #define clock_ms() osKernelGetTickCount() - #define delay_ms(ms) osDelay(ms) -#else - #define clock_ms() HAL_GetTick() - #define delay_ms(ms) HAL_Delay(ms) -#endif - - - -#define PD_POLLING 100 -#define TYPEC_SINK_WAIT_CAP 350 -#define REQUEST_TO_PS_READY 580 -#define PPS_REQUEST 5000 - -FUSB302_dev_t fusb302_dev; -App_PD_t app_pd; - -void fusb302_i2c_read(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count) -{ - HAL_I2C_Mem_Read(&hi2c1, dev_addr, reg_addr, I2C_MEMADD_SIZE_8BIT, data, count, 10); -} - -void fusb302_i2c_write(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count) -{ - HAL_I2C_Mem_Write(&hi2c1, dev_addr, reg_addr, I2C_MEMADD_SIZE_8BIT, data, count, 10); -} - - -void status_power_ready(status_power_t status, uint16_t voltage, uint16_t current) -{ - app_pd.ready_voltage = voltage; - app_pd.ready_current = current; - app_pd.status_power = status; -} - -void set_default_power(void) -{ - status_power_ready(STATUS_POWER_TYP, PD_V(5.0), PD_A(1.0)); -} - -void handle_protocol_event(PD_protocol_event_t events) -{ - if (events & PD_PROTOCOL_EVENT_SRC_CAP) { - app_pd.wait_src_cap = 0; - app_pd.get_src_cap_retry_count = 0; - app_pd.wait_ps_rdy = 1; - app_pd.time_wait_ps_rdy = clock_ms(); - app_pd.state = PD_STATE_GET_CAPS; // 更新状态:已收到能力,可以请求了 - } - if (events & PD_PROTOCOL_EVENT_REJECT) { - if (app_pd.wait_ps_rdy) { - app_pd.wait_ps_rdy = 0; - app_pd.state = PD_STATE_FAILED; // 更新状态:请求被拒绝 - } - } - if (events & PD_PROTOCOL_EVENT_PS_RDY) { - PD_power_info_t p; - uint8_t i, selected_power = PD_protocol_get_selected_power(&app_pd.protocol); - PD_protocol_get_power_info(&app_pd.protocol, selected_power, &p); - app_pd.wait_ps_rdy = 0; - if (p.type == PD_PDO_TYPE_AUGMENTED_PDO) { - // PPS mode - FUSB302_set_vbus_sense(&fusb302_dev, 0); - if (app_pd.PPS_voltage_next) { - // Two stage startup for PPS voltage < 5V - PD_protocol_set_PPS(&app_pd.protocol, app_pd.PPS_voltage_next, app_pd.PPS_current_next, false); - app_pd.PPS_voltage_next = 0; - app_pd.send_request = 1; - } else { - app_pd.time_PPS_request = clock_ms(); - status_power_ready(STATUS_POWER_PPS, - PD_protocol_get_PPS_voltage(&app_pd.protocol), PD_protocol_get_PPS_current(&app_pd.protocol)); - app_pd.state = PD_STATE_SUCCESS_PPS; // 更新状态:成功协商到PPS - } - } else { - FUSB302_set_vbus_sense(&fusb302_dev, 1); - status_power_ready(STATUS_POWER_TYP, p.max_v, p.max_i); - app_pd.state = PD_STATE_SUCCESS_FIXED; // 更新状态:协商到了一个固定电压 - } - } -} - -void handle_FUSB302_event(FUSB302_event_t events) -{ - if (events & FUSB302_EVENT_DETACHED) { - PD_protocol_reset(&app_pd.protocol); - app_pd.cc = 0; - return; - } - if (events & FUSB302_EVENT_ATTACHED) { - uint8_t cc1 = 0, cc2 = 0, cc = 0; - FUSB302_get_cc(&fusb302_dev, &cc1, &cc2); - PD_protocol_reset(&app_pd.protocol); - if (cc1 && cc2 == 0) { - cc = cc1; - app_pd.cc = 1; - } else if (cc2 && cc1 == 0) { - cc = cc2; - app_pd.cc = 2; - } - /* TODO: handle no cc detected error */ - if (cc > 1) { - app_pd.wait_src_cap = 1; - } else { - set_default_power(); - } - } - if (events & FUSB302_EVENT_RX_SOP) { - PD_protocol_event_t protocol_event = 0; - uint16_t header; - uint32_t obj[7]; - FUSB302_get_message(&fusb302_dev, &header, obj); - PD_protocol_handle_msg(&app_pd.protocol, header, obj, &protocol_event); - if (protocol_event) { - handle_protocol_event(protocol_event); - } - } - if (events & FUSB302_EVENT_GOOD_CRC_SENT) { - uint16_t header; - uint32_t obj[7]; - delay_ms(4); /* Delay respond in case there are retry messages */ - if (PD_protocol_respond(&app_pd.protocol, &header, obj)) { - FUSB302_tx_sop(&fusb302_dev, header, obj); - } - } -} - -bool fusb302_timer(void) -{ - uint32_t t = clock_ms(); - if (app_pd.wait_src_cap && t - app_pd.time_wait_src_cap > TYPEC_SINK_WAIT_CAP) { - app_pd.time_wait_src_cap = t; - if (app_pd.get_src_cap_retry_count < 3) { - uint16_t header; - app_pd.get_src_cap_retry_count += 1; - /* Try to request soruce capabilities message (will not cause power cycle VBUS) */ - PD_protocol_create_get_src_cap(&app_pd.protocol, &header); - FUSB302_tx_sop(&fusb302_dev, header, 0); - } else { - app_pd.get_src_cap_retry_count = 0; - /* Hard reset will cause the source power cycle VBUS. */ - FUSB302_tx_hard_reset(&fusb302_dev); - PD_protocol_reset(&app_pd.protocol); - } - } - if (app_pd.wait_ps_rdy) { - if (t - app_pd.time_wait_ps_rdy > REQUEST_TO_PS_READY) { - app_pd.wait_ps_rdy = 0; - set_default_power(); - } - } else if (app_pd.send_request || (app_pd.status_power == STATUS_POWER_PPS && t - app_pd.time_PPS_request > PPS_REQUEST)) { - app_pd.wait_ps_rdy = 1; - app_pd.send_request = 0; - app_pd.state = PD_STATE_NEGOTIATING; // 更新状态:正在协商中 - app_pd.time_PPS_request = t; - uint16_t header; - uint32_t obj[7]; - /* Send request if option updated or regularly in PPS mode to keep power alive */ - PD_protocol_create_request(&app_pd.protocol, &header, obj); - app_pd.time_wait_ps_rdy = clock_ms(); - FUSB302_tx_sop(&fusb302_dev, header, obj); - } - if (t - app_pd.time_polling > PD_POLLING) { - app_pd.time_polling = t; - return true; - } - return false; -} - -bool is_power_ready(void) { return app_pd.status_power == STATUS_POWER_TYP; } -bool is_PPS_ready(void) { return app_pd.status_power == STATUS_POWER_PPS; } -void send_power_request(void) { app_pd.send_request = 1; } - -uint8_t fusb302_dev_init(void) { - fusb302_dev.i2c_address = 0x22<<1; // FUSB302 I2C address - fusb302_dev.i2c_read = fusb302_i2c_read; - fusb302_dev.i2c_write = fusb302_i2c_write; - #if FUSB302_USE_OS == 1 - fusb302_dev.delay_ms = osDelay; - #else - fusb302_dev.delay_ms = HAL_Delay; - #endif - if (FUSB302_init(&fusb302_dev) == FUSB302_SUCCESS && FUSB302_get_ID(&fusb302_dev, 0, 0) == FUSB302_SUCCESS) { - PD_protocol_init(&app_pd.protocol); - app_pd.state = PD_STATE_IDLE; // 初始状态 - return 0; - } - return 1; -} diff --git a/software/Power_Pico/BSP/PD/fusb302_dev.h b/software/Power_Pico/BSP/PD/fusb302_dev.h deleted file mode 100644 index 85d217b..0000000 --- a/software/Power_Pico/BSP/PD/fusb302_dev.h +++ /dev/null @@ -1,104 +0,0 @@ -#ifndef __FUSB302_DEV_H__ -#define __FUSB302_DEV_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "FUSB302_UFP.h" -#include "PD_UFP_Protocol.h" - -typedef uint8_t status_power_t; - -enum { - PD_UFP_VOLTAGE_LED_OFF = 0, - PD_UFP_VOLTAGE_LED_5V = 1, - PD_UFP_VOLTAGE_LED_9V = 2, - PD_UFP_VOLTAGE_LED_12V = 3, - PD_UFP_VOLTAGE_LED_15V = 4, - PD_UFP_VOLTAGE_LED_20V = 5, - PD_UFP_VOLTAGE_LED_AUTO = 6 -}; -typedef uint8_t PD_UFP_VOLTAGE_LED_t; - -enum { - PD_UFP_CURRENT_LED_OFF = 0, - PD_UFP_CURRENT_LED_LE_1V = 1, - PD_UFP_CURRENT_LED_LE_3V = 2, - PD_UFP_CURRENT_LED_GT_3V = 3, - PD_UFP_CURRENT_LED_AUTO = 4 -}; -typedef uint8_t PD_UFP_CURRENT_LED_t; - -enum { - STATUS_POWER_NA = 0, - STATUS_POWER_TYP, - STATUS_POWER_PPS -}; -typedef uint8_t status_power_t; - -enum { - PD_SYS_STATE_INIT = 0, - PD_SYS_STATE_READY, - PD_SYS_STATE_ERROR -}; -typedef uint8_t PD_user_state_t; - -typedef enum { - PD_STATE_IDLE, // 空闲状态 - PD_STATE_NEGOTIATING, // 正在协商中 (已发送请求,等待PS_RDY) - PD_STATE_SUCCESS_PPS, // 成功协商到PPS模式 - PD_STATE_SUCCESS_FIXED, // 成功协商到固定电压 - PD_STATE_FAILED, // 协商失败 (收到Reject或超时) - PD_STATE_GET_CAPS // 刚刚收到能力列表,准备发起第一次请求 -} App_PD_State_t; - -typedef struct -{ - - App_PD_State_t state; - - PD_protocol_t protocol; - - // Power ready power - uint16_t ready_voltage; - uint16_t ready_current; - - // PPS setup - uint16_t PPS_voltage_next; - uint8_t PPS_current_next; - // Status - uint8_t status_initialized; - uint8_t status_src_cap_received; - status_power_t status_power; - // Timer and counter for PD Policy - uint32_t time_polling; - uint32_t time_wait_src_cap; - uint32_t time_wait_ps_rdy; - uint32_t time_PPS_request; - uint8_t get_src_cap_retry_count; - uint8_t wait_src_cap; - uint8_t wait_ps_rdy; - uint8_t send_request; - uint8_t cc; - char power_list[7][24]; - uint8_t power_list_num; - uint8_t power_index; - float power_v; - float power_i; -}App_PD_t; - -extern FUSB302_dev_t fusb302_dev; -extern App_PD_t app_pd; - -uint8_t fusb302_dev_init(void); -void handle_FUSB302_event(FUSB302_event_t events); -bool is_power_ready(void); -bool is_PPS_ready(void); -void send_power_request(void); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/software/Power_Pico/BSP/sys.h b/software/Power_Pico/BSP/sys.h deleted file mode 100644 index 942fb54..0000000 --- a/software/Power_Pico/BSP/sys.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef __SYS_H__ -#define __SYS_H__ - -#include "stm32f4xx.h" -#include "stm32f4xx_hal.h" - -#define OS_SUPPORT 1 -#define SYS_CLK 100 - -typedef int32_t s32; -typedef int16_t s16; -typedef int8_t s8; - -typedef const int32_t sc32; -typedef const int16_t sc16; -typedef const int8_t sc8; - -typedef __IO int32_t vs32; -typedef __IO int16_t vs16; -typedef __IO int8_t vs8; - -typedef __I int32_t vsc32; -typedef __I int16_t vsc16; -typedef __I int8_t vsc8; - -typedef uint32_t u32; -typedef uint16_t u16; -typedef uint8_t u8; - -typedef const uint32_t uc32; -typedef const uint16_t uc16; -typedef const uint8_t uc8; - -typedef __IO uint32_t vu32; -typedef __IO uint16_t vu16; -typedef __IO uint8_t vu8; - -typedef __I uint32_t vuc32; -typedef __I uint16_t vuc16; -typedef __I uint8_t vuc8; - -#endif diff --git a/software/Power_Pico/Core/Inc/FreeRTOSConfig.h b/software/Power_Pico/Core/Inc/FreeRTOSConfig.h deleted file mode 100644 index 0022cb1..0000000 --- a/software/Power_Pico/Core/Inc/FreeRTOSConfig.h +++ /dev/null @@ -1,171 +0,0 @@ -/* USER CODE BEGIN Header */ -/* - * FreeRTOS Kernel V10.3.1 - * Portion Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * Portion Copyright (C) 2019 StMicroelectronics, Inc. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ -/* USER CODE END Header */ - -#ifndef FREERTOS_CONFIG_H -#define FREERTOS_CONFIG_H - -/*----------------------------------------------------------- - * Application specific definitions. - * - * These definitions should be adjusted for your particular hardware and - * application requirements. - * - * These parameters and more are described within the 'configuration' section of the - * FreeRTOS API documentation available on the FreeRTOS.org web site. - * - * See http://www.freertos.org/a00110.html - *----------------------------------------------------------*/ - -/* USER CODE BEGIN Includes */ -/* Section where include file can be added */ -/* USER CODE END Includes */ - -/* Ensure definitions are only used by the compiler, and not by the assembler. */ -#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) - #include - extern uint32_t SystemCoreClock; -#endif -#ifndef CMSIS_device_header -#define CMSIS_device_header "stm32f4xx.h" -#endif /* CMSIS_device_header */ - -#define configENABLE_FPU 0 -#define configENABLE_MPU 0 - -#define configUSE_PREEMPTION 1 -#define configSUPPORT_STATIC_ALLOCATION 1 -#define configSUPPORT_DYNAMIC_ALLOCATION 1 -#define configUSE_IDLE_HOOK 0 -#define configUSE_TICK_HOOK 1 -#define configCPU_CLOCK_HZ ( SystemCoreClock ) -#define configTICK_RATE_HZ ((TickType_t)1000) -#define configMAX_PRIORITIES ( 56 ) -#define configMINIMAL_STACK_SIZE ((uint16_t)128) -#define configTOTAL_HEAP_SIZE ((size_t)15360) -#define configMAX_TASK_NAME_LEN ( 16 ) -#define configUSE_TRACE_FACILITY 1 -#define configUSE_16_BIT_TICKS 0 -#define configUSE_MUTEXES 1 -#define configQUEUE_REGISTRY_SIZE 8 -#define configUSE_RECURSIVE_MUTEXES 1 -#define configUSE_COUNTING_SEMAPHORES 1 -#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 -/* USER CODE BEGIN MESSAGE_BUFFER_LENGTH_TYPE */ -/* Defaults to size_t for backward compatibility, but can be changed - if lengths will always be less than the number of bytes in a size_t. */ -#define configMESSAGE_BUFFER_LENGTH_TYPE size_t -/* USER CODE END MESSAGE_BUFFER_LENGTH_TYPE */ - -/* Co-routine definitions. */ -#define configUSE_CO_ROUTINES 0 -#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) - -/* Software timer definitions. */ -#define configUSE_TIMERS 1 -#define configTIMER_TASK_PRIORITY ( 2 ) -#define configTIMER_QUEUE_LENGTH 10 -#define configTIMER_TASK_STACK_DEPTH 256 - -/* CMSIS-RTOS V2 flags */ -#define configUSE_OS2_THREAD_SUSPEND_RESUME 1 -#define configUSE_OS2_THREAD_ENUMERATE 1 -#define configUSE_OS2_EVENTFLAGS_FROM_ISR 1 -#define configUSE_OS2_THREAD_FLAGS 1 -#define configUSE_OS2_TIMER 1 -#define configUSE_OS2_MUTEX 1 - -/* Set the following definitions to 1 to include the API function, or zero -to exclude the API function. */ -#define INCLUDE_vTaskPrioritySet 1 -#define INCLUDE_uxTaskPriorityGet 1 -#define INCLUDE_vTaskDelete 1 -#define INCLUDE_vTaskCleanUpResources 0 -#define INCLUDE_vTaskSuspend 1 -#define INCLUDE_vTaskDelayUntil 1 -#define INCLUDE_vTaskDelay 1 -#define INCLUDE_xTaskGetSchedulerState 1 -#define INCLUDE_xTimerPendFunctionCall 1 -#define INCLUDE_xQueueGetMutexHolder 1 -#define INCLUDE_uxTaskGetStackHighWaterMark 1 -#define INCLUDE_xTaskGetCurrentTaskHandle 1 -#define INCLUDE_eTaskGetState 1 - -/* - * The CMSIS-RTOS V2 FreeRTOS wrapper is dependent on the heap implementation used - * by the application thus the correct define need to be enabled below - */ -#define USE_FreeRTOS_HEAP_4 - -/* Cortex-M specific definitions. */ -#ifdef __NVIC_PRIO_BITS - /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ - #define configPRIO_BITS __NVIC_PRIO_BITS -#else - #define configPRIO_BITS 4 -#endif - -/* The lowest interrupt priority that can be used in a call to a "set priority" -function. */ -#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 - -/* The highest interrupt priority that can be used by any interrupt service -routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL -INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER -PRIORITY THAN THIS! (higher priorities are lower numeric values. */ -#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 - -/* Interrupt priorities used by the kernel port layer itself. These are generic -to all Cortex-M ports, and do not rely on any particular library functions. */ -#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) -/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! -See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ -#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) - -/* Normal assert() semantics without relying on the provision of an assert.h -header file. */ -/* USER CODE BEGIN 1 */ -#define configASSERT( x ) if ((x) == 0) {taskDISABLE_INTERRUPTS(); for( ;; );} -/* USER CODE END 1 */ - -/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS -standard names. */ -#define vPortSVCHandler SVC_Handler -#define xPortPendSVHandler PendSV_Handler - -/* IMPORTANT: After 10.3.1 update, Systick_Handler comes from NVIC (if SYS timebase = systick), otherwise from cmsis_os2.c */ - -#define USE_CUSTOM_SYSTICK_HANDLER_IMPLEMENTATION 0 - -/* USER CODE BEGIN Defines */ -#define configUSE_STATS_FORMATTING_FUNCTIONS 1 -/* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */ -/* USER CODE END Defines */ - -#endif /* FREERTOS_CONFIG_H */ diff --git a/software/Power_Pico/Core/Inc/adc.h b/software/Power_Pico/Core/Inc/adc.h deleted file mode 100644 index 54a020c..0000000 --- a/software/Power_Pico/Core/Inc/adc.h +++ /dev/null @@ -1,120 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file adc.h - * @brief This file contains all the function prototypes for - * the adc.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __ADC_H__ -#define __ADC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -#define ADC_TIMES 100 // 每次采样 100 次 (10ms) -#define ADC_CHANNELS 5 // 5 通道:电压 + 3 档电流 + REF -#define PACKET_HEADER_0 0xAA -#define PACKET_HEADER_1 0x55 - -// Rank1=PA5, Rank2=PA6, Rank3=PA7, Rank4=PB0, Rank5=PB1 -#define IDX_VOL 0 -#define IDX_LOW 1 -#define IDX_MID 2 -#define IDX_HIGH 3 -#define IDX_REF 4 - -// Resistance values in ohms -#define HIGH_CUR_RES 0.005f // 5 m ohm -#define MID_CUR_RES 0.5f // 500 m ohm -#define LOW_CUR_RES 50.0f // 50 ohm - -// 预先计算标度因子 -#define SCALE_LOW (3.0f / 4096.0f / 50.0f / LOW_CUR_RES * 1000000.0) // uA -#define SCALE_MID (3.0f / 4096.0f / 50.0f / MID_CUR_RES * 1000000.0) // uA -#define SCALE_HIGH (3.0f / 4096.0f / 50.0f / HIGH_CUR_RES * 1000000.0) // uA - -// 量程阈值 -#define THRESH_HIGH 4000-2048 // 对应550uA 50mA -#define THRESH_LOW 15 // 对应大概450uA 45mA -// 次数 -#define THRESH_TIMES 8 - -// 监视器更新频率和对应的采样点数量 -#define MONITOR_UPDATE_PERIOD_MS 250 -#define MONITOR_UPDATE_CHUNK_COUNT (MONITOR_UPDATE_PERIOD_MS / 10) - -/* --- USB 数据包结构 (总长 711 字节) --- */ -#pragma pack(push, 1) // 强制 1 字节对齐 -typedef struct { - uint8_t header[2]; // 0x55, 0xAA - uint64_t timestamp; // 64位微秒级时间戳 - uint8_t data_count; // 固定 100 - - struct { - uint8_t range; // 量程: 1=Low, 2=Mid, 3=High - uint16_t vol_adc; // 电压 - uint16_t cur_adc; // 电流 (选择后) - uint16_t ref_adc; // 参考电压 - } samples[ADC_TIMES]; - -} USB_ADC_Packet_t; -#pragma pack(pop) - -/* --- 统计监视器结构体 --- */ -typedef struct { - /* * 累加和使用 64 位整数,防止溢出并保持精度 - * sum_cur_resolution_10na: 用户要求的 uA*100,即分辨率 0.01uA (10nA) - * sum_vol_mv: 电压为了保持精度累加 mV,Get时再转 V - */ - volatile int64_t sum_cur_resolution_10na; - volatile int64_t sum_vol_mv; - volatile uint32_t count; - volatile float avg_vol_v; - volatile float avg_cur_ua; -} Data_Monitor_t; - -// 原始 DMA 缓冲区 [200][5] -extern uint16_t adc_raw_buffer[ADC_TIMES * 2][ADC_CHANNELS]; - -/* USER CODE END Includes */ - -extern ADC_HandleTypeDef hadc1; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_ADC1_Init(void); - -/* USER CODE BEGIN Prototypes */ - -void Data_Monitor_Get_Values(float *out_vol_v, float *out_cur_ua); -void Data_Monitor_Clear(void); - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __ADC_H__ */ - diff --git a/software/Power_Pico/Core/Inc/dma.h b/software/Power_Pico/Core/Inc/dma.h deleted file mode 100644 index 493d98e..0000000 --- a/software/Power_Pico/Core/Inc/dma.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file dma.h - * @brief This file contains all the function prototypes for - * the dma.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __DMA_H__ -#define __DMA_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* DMA memory to memory transfer handles -------------------------------------*/ - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_DMA_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __DMA_H__ */ - diff --git a/software/Power_Pico/Core/Inc/gpio.h b/software/Power_Pico/Core/Inc/gpio.h deleted file mode 100644 index 9ac4857..0000000 --- a/software/Power_Pico/Core/Inc/gpio.h +++ /dev/null @@ -1,49 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file gpio.h - * @brief This file contains all the function prototypes for - * the gpio.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GPIO_H__ -#define __GPIO_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_GPIO_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif -#endif /*__ GPIO_H__ */ - diff --git a/software/Power_Pico/Core/Inc/i2c.h b/software/Power_Pico/Core/Inc/i2c.h deleted file mode 100644 index e5f10f5..0000000 --- a/software/Power_Pico/Core/Inc/i2c.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file i2c.h - * @brief This file contains all the function prototypes for - * the i2c.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __I2C_H__ -#define __I2C_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern I2C_HandleTypeDef hi2c1; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_I2C1_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __I2C_H__ */ - diff --git a/software/Power_Pico/Core/Inc/main.h b/software/Power_Pico/Core/Inc/main.h deleted file mode 100644 index 9e6ffde..0000000 --- a/software/Power_Pico/Core/Inc/main.h +++ /dev/null @@ -1,69 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.h - * @brief : Header for main.c file. - * This file contains the common defines of the application. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MAIN_H -#define __MAIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ - -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void Error_Handler(void); - -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -/* Private defines -----------------------------------------------------------*/ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -#ifdef __cplusplus -} -#endif - -#endif /* __MAIN_H */ diff --git a/software/Power_Pico/Core/Inc/spi.h b/software/Power_Pico/Core/Inc/spi.h deleted file mode 100644 index 0fcb920..0000000 --- a/software/Power_Pico/Core/Inc/spi.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file spi.h - * @brief This file contains all the function prototypes for - * the spi.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPI_H__ -#define __SPI_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern SPI_HandleTypeDef hspi2; - -/* USER CODE BEGIN Private defines */ -extern DMA_HandleTypeDef hdma_spi2_tx; -/* USER CODE END Private defines */ - -void MX_SPI2_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __SPI_H__ */ - diff --git a/software/Power_Pico/Core/Inc/stm32f4xx_hal_conf.h b/software/Power_Pico/Core/Inc/stm32f4xx_hal_conf.h deleted file mode 100644 index b52f9dc..0000000 --- a/software/Power_Pico/Core/Inc/stm32f4xx_hal_conf.h +++ /dev/null @@ -1,495 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_hal_conf_template.h - * @author MCD Application Team - * @brief HAL configuration template file. - * This file should be copied to the application folder and renamed - * to stm32f4xx_hal_conf.h. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CONF_H -#define __STM32F4xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED - - /* #define HAL_CRYP_MODULE_ENABLED */ -#define HAL_ADC_MODULE_ENABLED -/* #define HAL_CAN_MODULE_ENABLED */ -/* #define HAL_CRC_MODULE_ENABLED */ -/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ -/* #define HAL_DAC_MODULE_ENABLED */ -/* #define HAL_DCMI_MODULE_ENABLED */ -/* #define HAL_DMA2D_MODULE_ENABLED */ -/* #define HAL_ETH_MODULE_ENABLED */ -/* #define HAL_ETH_LEGACY_MODULE_ENABLED */ -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_PCCARD_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ -/* #define HAL_HASH_MODULE_ENABLED */ -#define HAL_I2C_MODULE_ENABLED -/* #define HAL_I2S_MODULE_ENABLED */ -/* #define HAL_IWDG_MODULE_ENABLED */ -/* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_RNG_MODULE_ENABLED */ -/* #define HAL_RTC_MODULE_ENABLED */ -/* #define HAL_SAI_MODULE_ENABLED */ -/* #define HAL_SD_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ -#define HAL_SPI_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -/* #define HAL_UART_MODULE_ENABLED */ -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ -#define HAL_PCD_MODULE_ENABLED -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_DSI_MODULE_ENABLED */ -/* #define HAL_QSPI_MODULE_ENABLED */ -/* #define HAL_QSPI_MODULE_ENABLED */ -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_FMPI2C_MODULE_ENABLED */ -/* #define HAL_FMPSMBUS_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -#define HAL_GPIO_MODULE_ENABLED -#define HAL_EXTI_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED - -/* ########################## HSE/HSI Values adaptation ##################### */ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) - #define LSI_VALUE 32000U /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature.*/ -/** - * @brief External Low Speed oscillator (LSE) value. - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External audio frequency in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#define VDD_VALUE 3300U /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY 15U /*!< tick interrupt priority */ -#define USE_RTOS 0U -#define PREFETCH_ENABLE 1U -#define INSTRUCTION_CACHE_ENABLE 1U -#define DATA_CACHE_ENABLE 1U - -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ -#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ -#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ -#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ -#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ -#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ -#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ -#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ -#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ -#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ -#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ -#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ -#define USE_HAL_FMPSMBUS_REGISTER_CALLBACKS 0U /* FMPSMBUS register callback disabled */ -#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ -#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ -#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ -#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ -#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ -#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ -#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ -#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ -#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ -#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ -#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ -#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ -#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ -#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ -#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ -#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ -#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1U */ - -/* ################## Ethernet peripheral configuration ##################### */ - -/* Section 1 : Ethernet peripheral configuration */ - -/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ -#define MAC_ADDR0 2U -#define MAC_ADDR1 0U -#define MAC_ADDR2 0U -#define MAC_ADDR3 0U -#define MAC_ADDR4 0U -#define MAC_ADDR5 0U - -/* Definition of the Ethernet driver buffers size and count */ -#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ -#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ - -/* Section 2: PHY configuration section */ - -/* DP83848_PHY_ADDRESS Address*/ -#define DP83848_PHY_ADDRESS -/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ -#define PHY_RESET_DELAY 0x000000FFU -/* PHY Configuration delay */ -#define PHY_CONFIG_DELAY 0x00000FFFU - -#define PHY_READ_TO 0x0000FFFFU -#define PHY_WRITE_TO 0x0000FFFFU - -/* Section 3: Common PHY Registers */ - -#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ -#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ - -#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ -#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ -#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ - -#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ -#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ -#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ - -/* Section 4: Extended PHY Registers */ -#define PHY_SR ((uint16_t)) /*!< PHY status register Offset */ - -#define PHY_SPEED_STATUS ((uint16_t)) /*!< PHY Speed mask */ -#define PHY_DUPLEX_STATUS ((uint16_t)) /*!< PHY Duplex mask */ - -/* ################## SPI peripheral configuration ########################## */ - -/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver -* Activated: CRC code is present inside driver -* Deactivated: CRC code cleaned from driver -*/ - -#define USE_SPI_CRC 0U - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED - #include "stm32f4xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32f4xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED - #include "stm32f4xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32f4xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32f4xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32f4xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_CAN_MODULE_ENABLED - #include "stm32f4xx_hal_can.h" -#endif /* HAL_CAN_MODULE_ENABLED */ - -#ifdef HAL_CAN_LEGACY_MODULE_ENABLED - #include "stm32f4xx_hal_can_legacy.h" -#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32f4xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32f4xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DMA2D_MODULE_ENABLED - #include "stm32f4xx_hal_dma2d.h" -#endif /* HAL_DMA2D_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32f4xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED - #include "stm32f4xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED - #include "stm32f4xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_ETH_LEGACY_MODULE_ENABLED - #include "stm32f4xx_hal_eth_legacy.h" -#endif /* HAL_ETH_LEGACY_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32f4xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32f4xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32f4xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_PCCARD_MODULE_ENABLED - #include "stm32f4xx_hal_pccard.h" -#endif /* HAL_PCCARD_MODULE_ENABLED */ - -#ifdef HAL_SDRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sdram.h" -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED - #include "stm32f4xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32f4xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED - #include "stm32f4xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED - #include "stm32f4xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32f4xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_LTDC_MODULE_ENABLED - #include "stm32f4xx_hal_ltdc.h" -#endif /* HAL_LTDC_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32f4xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED - #include "stm32f4xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32f4xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED - #include "stm32f4xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED - #include "stm32f4xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32f4xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32f4xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32f4xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32f4xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32f4xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32f4xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32f4xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32f4xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED - #include "stm32f4xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_DSI_MODULE_ENABLED - #include "stm32f4xx_hal_dsi.h" -#endif /* HAL_DSI_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED - #include "stm32f4xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED - #include "stm32f4xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_FMPI2C_MODULE_ENABLED - #include "stm32f4xx_hal_fmpi2c.h" -#endif /* HAL_FMPI2C_MODULE_ENABLED */ - -#ifdef HAL_FMPSMBUS_MODULE_ENABLED - #include "stm32f4xx_hal_fmpsmbus.h" -#endif /* HAL_FMPSMBUS_MODULE_ENABLED */ - -#ifdef HAL_SPDIFRX_MODULE_ENABLED - #include "stm32f4xx_hal_spdifrx.h" -#endif /* HAL_SPDIFRX_MODULE_ENABLED */ - -#ifdef HAL_DFSDM_MODULE_ENABLED - #include "stm32f4xx_hal_dfsdm.h" -#endif /* HAL_DFSDM_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED - #include "stm32f4xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -#ifdef HAL_MMC_MODULE_ENABLED - #include "stm32f4xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_CONF_H */ diff --git a/software/Power_Pico/Core/Inc/stm32f4xx_it.h b/software/Power_Pico/Core/Inc/stm32f4xx_it.h deleted file mode 100644 index 994fb56..0000000 --- a/software/Power_Pico/Core/Inc/stm32f4xx_it.h +++ /dev/null @@ -1,67 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_it.h - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_IT_H -#define __STM32F4xx_IT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ - -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void NMI_Handler(void); -void HardFault_Handler(void); -void MemManage_Handler(void); -void BusFault_Handler(void); -void UsageFault_Handler(void); -void DebugMon_Handler(void); -void DMA1_Stream4_IRQHandler(void); -void TIM1_TRG_COM_TIM11_IRQHandler(void); -void DMA2_Stream0_IRQHandler(void); -void OTG_FS_IRQHandler(void); -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_IT_H */ diff --git a/software/Power_Pico/Core/Inc/tim.h b/software/Power_Pico/Core/Inc/tim.h deleted file mode 100644 index 262b301..0000000 --- a/software/Power_Pico/Core/Inc/tim.h +++ /dev/null @@ -1,66 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file tim.h - * @brief This file contains all the function prototypes for - * the tim.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __TIM_H__ -#define __TIM_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern TIM_HandleTypeDef htim1; - -extern TIM_HandleTypeDef htim2; - -extern TIM_HandleTypeDef htim4; - -extern TIM_HandleTypeDef htim5; - -/* USER CODE BEGIN Private defines */ -#define PWM_PERIOD 300 -/* USER CODE END Private defines */ - -void MX_TIM1_Init(void); -void MX_TIM2_Init(void); -void MX_TIM4_Init(void); -void MX_TIM5_Init(void); - -void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); - -/* USER CODE BEGIN Prototypes */ - -void ClearMicrosecondCounter(void); -uint64_t GetMicrosecondCounter(void); - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __TIM_H__ */ - diff --git a/software/Power_Pico/Core/Src/adc.c b/software/Power_Pico/Core/Src/adc.c deleted file mode 100644 index 60994e1..0000000 --- a/software/Power_Pico/Core/Src/adc.c +++ /dev/null @@ -1,455 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file adc.c - * @brief This file provides code for the configuration - * of the ADC instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "adc.h" - -/* USER CODE BEGIN 0 */ - -#include "tim.h" -#include "usb_device.h" -#include "gate.h" - -// DMA 双缓冲原始数据 [200行][5列] -uint16_t adc_raw_buffer[ADC_TIMES * 2][ADC_CHANNELS]; -// USB 发送缓冲区 (Ping-Pong 双缓冲防止发送冲突) -USB_ADC_Packet_t usb_packet_buffer[2]; -// 统计实例 -Data_Monitor_t g_data_monitor = {0}; -// 物理切换防抖计数器 -static uint8_t high_overload_cnt = 0; -static uint8_t low_underload_cnt = 0; -static uint8_t is_transition_next = 0; // 标记下一包是否为过渡数据 -// 用于监视数据更新的计数器 -static uint32_t monitor_chunk_counter = 0; - -/* USER CODE END 0 */ - -ADC_HandleTypeDef hadc1; -DMA_HandleTypeDef hdma_adc1; - -/* ADC1 init function */ -void MX_ADC1_Init(void) -{ - - /* USER CODE BEGIN ADC1_Init 0 */ - - /* USER CODE END ADC1_Init 0 */ - - ADC_ChannelConfTypeDef sConfig = {0}; - - /* USER CODE BEGIN ADC1_Init 1 */ - - /* USER CODE END ADC1_Init 1 */ - - /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) - */ - hadc1.Instance = ADC1; - hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; - hadc1.Init.Resolution = ADC_RESOLUTION_12B; - hadc1.Init.ScanConvMode = ENABLE; - hadc1.Init.ContinuousConvMode = DISABLE; - hadc1.Init.DiscontinuousConvMode = DISABLE; - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; - hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T2_TRGO; - hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; - hadc1.Init.NbrOfConversion = 5; - hadc1.Init.DMAContinuousRequests = ENABLE; - hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; - if (HAL_ADC_Init(&hadc1) != HAL_OK) - { - Error_Handler(); - } - - /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. - */ - sConfig.Channel = ADC_CHANNEL_5; - sConfig.Rank = 1; - sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES; - if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) - { - Error_Handler(); - } - - /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. - */ - sConfig.Channel = ADC_CHANNEL_6; - sConfig.Rank = 2; - if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) - { - Error_Handler(); - } - - /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. - */ - sConfig.Channel = ADC_CHANNEL_7; - sConfig.Rank = 3; - if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) - { - Error_Handler(); - } - - /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. - */ - sConfig.Channel = ADC_CHANNEL_8; - sConfig.Rank = 4; - if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) - { - Error_Handler(); - } - - /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. - */ - sConfig.Channel = ADC_CHANNEL_9; - sConfig.Rank = 5; - if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN ADC1_Init 2 */ - __HAL_DMA_ENABLE_IT(&hdma_adc1, DMA_IT_TC); /*开启DMA传输完成中断*/ - /* USER CODE END ADC1_Init 2 */ - -} - -void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(adcHandle->Instance==ADC1) - { - /* USER CODE BEGIN ADC1_MspInit 0 */ - - /* USER CODE END ADC1_MspInit 0 */ - /* ADC1 clock enable */ - __HAL_RCC_ADC1_CLK_ENABLE(); - - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**ADC1 GPIO Configuration - PA5 ------> ADC1_IN5 - PA6 ------> ADC1_IN6 - PA7 ------> ADC1_IN7 - PB0 ------> ADC1_IN8 - PB1 ------> ADC1_IN9 - */ - GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* ADC1 DMA Init */ - /* ADC1 Init */ - hdma_adc1.Instance = DMA2_Stream0; - hdma_adc1.Init.Channel = DMA_CHANNEL_0; - hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; - hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; - hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; - hdma_adc1.Init.Mode = DMA_CIRCULAR; - hdma_adc1.Init.Priority = DMA_PRIORITY_LOW; - hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - if (HAL_DMA_Init(&hdma_adc1) != HAL_OK) - { - Error_Handler(); - } - - __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1); - - /* USER CODE BEGIN ADC1_MspInit 1 */ - - /* USER CODE END ADC1_MspInit 1 */ - } -} - -void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) -{ - - if(adcHandle->Instance==ADC1) - { - /* USER CODE BEGIN ADC1_MspDeInit 0 */ - - /* USER CODE END ADC1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_ADC1_CLK_DISABLE(); - - /**ADC1 GPIO Configuration - PA5 ------> ADC1_IN5 - PA6 ------> ADC1_IN6 - PA7 ------> ADC1_IN7 - PB0 ------> ADC1_IN8 - PB1 ------> ADC1_IN9 - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); - - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1); - - /* ADC1 DMA DeInit */ - HAL_DMA_DeInit(adcHandle->DMA_Handle); - /* USER CODE BEGIN ADC1_MspDeInit 1 */ - - /* USER CODE END ADC1_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -// 内部调用的数据更新函数,mV 和 10nA 累加 -static void Data_Monitor_Update(uint16_t vol_adc, uint16_t cur_adc, uint16_t ref_adc, uint8_t range) -{ - // 1. 计算电压 (mV) - // V = (ADC_Value / 4095) * 3.0V * (10k + 1k) / 1k - // mV = ADC_Value * (3000.0 / 4095 * 11) - float voltage_mv = (float)vol_adc * (3000.0f / 4095.0f * 11.0f); - - // 2. 计算电流 (单位: 10nA) - // I_uA = ADC_Value * SCALE_XXX - // I_10nA = I_uA * 100 - uint64_t current_10na = 0; - switch (range) { - case LOW_CUR: - current_10na = (uint64_t)((float)(cur_adc-ref_adc) * SCALE_LOW * 100.0f); - break; - case MID_CUR: - current_10na = (uint64_t)((float)(cur_adc-ref_adc) * SCALE_MID * 100.0f); - break; - case HIGH_CUR: - current_10na = (uint64_t)((float)(cur_adc-ref_adc) * SCALE_HIGH * 100.0f); - break; - } - - // 3. 计算电压引入的误差电流 (单位: 10nA) - float error_current_10na = voltage_mv / 11.0f; - - // 4. 计算最终校正后的电流 - // 注意:误差电流是正的,所以要从测量值中减去 - float final_current_10na = current_10na - error_current_10na; - - // 5. 累加数据 (此函数在中断上下文中被调用,Data_Monitor_Get_Values会处理中断保护) - g_data_monitor.sum_vol_mv += (uint64_t)voltage_mv; - g_data_monitor.sum_cur_resolution_10na += final_current_10na; - g_data_monitor.count++; -} - -// 内部调用的计算函数,计算平均值并重置累加器 -static void Data_Monitor_Calculate_Average(void) -{ - // 关中断保护,确保在计算和重置期间 g_data_monitor 不被修改 - __disable_irq(); - - if (g_data_monitor.count > 0) - { - // 计算平均值并存储到结构体的新成员中 - g_data_monitor.avg_vol_v = (float)g_data_monitor.sum_vol_mv / g_data_monitor.count / 1000.0f; - g_data_monitor.avg_cur_ua = (float)g_data_monitor.sum_cur_resolution_10na / g_data_monitor.count / 100.0f; - } - else - { - // 如果在此期间没有有效数据(例如,一直处于档位切换中) - g_data_monitor.avg_vol_v = 0.0f; - g_data_monitor.avg_cur_ua = 0.0f; - } - - // 重置累加器,为下一个计算周期做准备 - g_data_monitor.sum_vol_mv = 0; - g_data_monitor.sum_cur_resolution_10na = 0; - g_data_monitor.count = 0; - - __enable_irq(); -} - -// 外部调用的获取函数,单位 V 和 uA -void Data_Monitor_Get_Values(float *out_vol_v, float *out_cur_ua) -{ - // 直接返回已经计算好的平均值,无需关中断,因为读取 float 是原子操作 - *out_vol_v = g_data_monitor.avg_vol_v; - *out_cur_ua = g_data_monitor.avg_cur_ua; -} - -// 外部调用的清除函数,重置所有统计数据 -void Data_Monitor_Clear(void) -{ - __disable_irq(); - g_data_monitor.sum_vol_mv = 0; - g_data_monitor.sum_cur_resolution_10na = 0; - g_data_monitor.count = 0; - g_data_monitor.avg_vol_v = 0.0f; - g_data_monitor.avg_cur_ua = 0.0f; - __enable_irq(); -} - -// 处理 ADC 数据块的核心函数,负责数据选择、切换决策和USB发送 -static void Process_ADC_Chunk(uint16_t *chunk_ptr, uint8_t packet_idx) -{ - USB_ADC_Packet_t *pkg = &usb_packet_buffer[packet_idx]; - - // 填充包头 - pkg->header[0] = PACKET_HEADER_0; - pkg->header[1] = PACKET_HEADER_1; - pkg->timestamp = GetMicrosecondCounter(); - pkg->data_count = ADC_TIMES; - - // 获取当前物理档位 - uint8_t current_hw_range = Gate_get_status(); - uint8_t req_switch_range = current_hw_range; // 初始化请求切换的档位 - - // 如果上一包触发了切换,本包数据是在切换期间采集的“脏数据”,必须丢弃 - if (is_transition_next) { - is_transition_next = 0; // 清除标志 - high_overload_cnt = 0; // 清除计数器,为下一次干净数据做准备 - low_underload_cnt = 0; - // 直接返回,不处理也不发送任何数据 - return; - } - - int i = 0; - // 遍历采样点 - for (i = 0; i < ADC_TIMES; i++) - { - uint16_t *sample_row = chunk_ptr + (i * ADC_CHANNELS); - uint16_t raw_vol = sample_row[IDX_VOL]; - uint16_t raw_low = sample_row[IDX_LOW]; - uint16_t raw_mid = sample_row[IDX_MID]; - uint16_t raw_hig = sample_row[IDX_HIGH]; - uint16_t raw_ref = sample_row[IDX_REF]; - - // --- 基于当前物理档位,进行独立的切换决策 --- - switch (current_hw_range) - { - case LOW_CUR: - // 在LOW档,只关心raw_low是否过载 - if (abs(raw_low-raw_ref) >= THRESH_HIGH) { - high_overload_cnt++; - if (high_overload_cnt >= THRESH_TIMES) { - req_switch_range = MID_CUR; // 请求升到MID档 - } - } else { - high_overload_cnt = 0; - } - // LOW档不存在欠载问题 - low_underload_cnt = 0; - break; - - case MID_CUR: - // 在MID档,判断raw_mid是否过载或欠载 - if (abs(raw_mid-raw_ref) >= THRESH_HIGH) { // 过载 - high_overload_cnt++; - if (high_overload_cnt >= THRESH_TIMES) { - req_switch_range = HIGH_CUR; // 请求升到HIGH档 - } - } else { - high_overload_cnt = 0; - } - - if (abs(raw_mid-raw_ref) < THRESH_LOW) { // 欠载 - low_underload_cnt++; - if (low_underload_cnt >= THRESH_TIMES) { - req_switch_range = LOW_CUR; // 请求降到LOW档 - } - } else { - low_underload_cnt = 0; - } - break; - - case HIGH_CUR: - // 在HIGH档,只关心raw_hig是否欠载 - if (abs(raw_hig-raw_ref) < THRESH_LOW) { // 注意:这里用raw_hig判断 - low_underload_cnt++; - if (low_underload_cnt >= THRESH_TIMES) { - req_switch_range = MID_CUR; // 请求降到MID档 - } - } else { - low_underload_cnt = 0; - } - // HIGH档不存在过载问题 - high_overload_cnt = 0; - break; - } - - // 如果已经做出切换决定,立即跳出循环 - if (req_switch_range != current_hw_range) { - break; - } - - // --- 数据选择与填充 --- - // 根据采集本数据块时的硬件档位(current_hw_range)来选择有效的电流ADC值 - uint16_t final_cur = 0; - switch (current_hw_range) { - case LOW_CUR: final_cur = raw_low; break; - case MID_CUR: final_cur = raw_mid; break; - case HIGH_CUR: final_cur = raw_hig; break; - } - - // 填充USB数据包的当前采样点 - pkg->samples[i].range = current_hw_range; - pkg->samples[i].vol_adc = raw_vol; - pkg->samples[i].cur_adc = final_cur; - pkg->samples[i].ref_adc = raw_ref; - - // 更新用于屏幕显示的统计数据 - Data_Monitor_Update(raw_vol, final_cur, raw_ref, current_hw_range); - } - - // 更新包中实际有效的数据点数量 - pkg->data_count = i; - - // --- 循环结束后,执行物理切换 --- - if (req_switch_range != current_hw_range) - { - flow_route_selection(req_switch_range); // 执行物理切换 - is_transition_next = 1; // 标记下一包是过渡数据 - high_overload_cnt = 0; // 切换后清零计数器 - low_underload_cnt = 0; - } - - // USB 发送 (非阻塞) - CDC_Transmit_FS((uint8_t*)pkg, sizeof(USB_ADC_Packet_t)); - - // - monitor_chunk_counter++; - if (monitor_chunk_counter >= MONITOR_UPDATE_CHUNK_COUNT) - { - monitor_chunk_counter = 0; // 重置计数器 - Data_Monitor_Calculate_Average(); // 执行计算 - } -} - -/* --- DMA 回调函数 --- */ - -void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc) -{ - // 处理前半段 (Buffer 行 0 ~ 99) - // 传入 &adc_raw_buffer[0][0] - Process_ADC_Chunk(&adc_raw_buffer[0][0], 0); -} - -void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) -{ - // 处理后半段 (Buffer 行 100 ~ 199) - // 传入 &adc_raw_buffer[ADC_TIMES][0] - Process_ADC_Chunk(&adc_raw_buffer[ADC_TIMES][0], 1); -} - -/* USER CODE END 1 */ diff --git a/software/Power_Pico/Core/Src/dma.c b/software/Power_Pico/Core/Src/dma.c deleted file mode 100644 index db883fa..0000000 --- a/software/Power_Pico/Core/Src/dma.c +++ /dev/null @@ -1,59 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file dma.c - * @brief This file provides code for the configuration - * of all the requested memory to memory DMA transfers. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "dma.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/*----------------------------------------------------------------------------*/ -/* Configure DMA */ -/*----------------------------------------------------------------------------*/ - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/** - * Enable DMA controller clock - */ -void MX_DMA_Init(void) -{ - - /* DMA controller clock enable */ - __HAL_RCC_DMA1_CLK_ENABLE(); - __HAL_RCC_DMA2_CLK_ENABLE(); - - /* DMA interrupt init */ - /* DMA1_Stream4_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Stream4_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(DMA1_Stream4_IRQn); - /* DMA2_Stream0_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); - -} - -/* USER CODE BEGIN 2 */ - -/* USER CODE END 2 */ - diff --git a/software/Power_Pico/Core/Src/freertos.c b/software/Power_Pico/Core/Src/freertos.c deleted file mode 100644 index 6ff6f88..0000000 --- a/software/Power_Pico/Core/Src/freertos.c +++ /dev/null @@ -1,148 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * File Name : freertos.c - * Description : Code for freertos applications - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "FreeRTOS.h" -#include "task.h" -#include "main.h" -#include "cmsis_os.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -#include "user_TasksInit.h" -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN PTD */ - -/* USER CODE END PTD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN Variables */ - -/* USER CODE END Variables */ -/* Definitions for defaultTask */ -osThreadId_t defaultTaskHandle; -const osThreadAttr_t defaultTask_attributes = { - .name = "defaultTask", - .stack_size = 128 * 4, - .priority = (osPriority_t) osPriorityNormal, -}; - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN FunctionPrototypes */ - -/* USER CODE END FunctionPrototypes */ - -void StartDefaultTask(void *argument); - -extern void MX_USB_DEVICE_Init(void); -void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ - -/* Hook prototypes */ -void vApplicationTickHook(void); - -/* USER CODE BEGIN 3 */ -void vApplicationTickHook( void ) -{ - /* This function will be called by each tick interrupt if - configUSE_TICK_HOOK is set to 1 in FreeRTOSConfig.h. User code can be - added here, but the tick hook is called from an interrupt context, so - code must not attempt to block, and only the interrupt safe FreeRTOS API - functions can be used (those that end in FromISR()). */ - TaskTickHook(); -} -/* USER CODE END 3 */ - -/** - * @brief FreeRTOS initialization - * @param None - * @retval None - */ -void MX_FREERTOS_Init(void) { - /* USER CODE BEGIN Init */ - User_Tasks_Init(); - /* USER CODE END Init */ - - /* USER CODE BEGIN RTOS_MUTEX */ - /* add mutexes, ... */ - /* USER CODE END RTOS_MUTEX */ - - /* USER CODE BEGIN RTOS_SEMAPHORES */ - /* add semaphores, ... */ - /* USER CODE END RTOS_SEMAPHORES */ - - /* USER CODE BEGIN RTOS_TIMERS */ - /* start timers, add new ones, ... */ - /* USER CODE END RTOS_TIMERS */ - - /* USER CODE BEGIN RTOS_QUEUES */ - /* add queues, ... */ - /* USER CODE END RTOS_QUEUES */ - - /* Create the thread(s) */ - /* creation of defaultTask */ - defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); - - /* USER CODE BEGIN RTOS_THREADS */ - /* add threads, ... */ - /* USER CODE END RTOS_THREADS */ - - /* USER CODE BEGIN RTOS_EVENTS */ - /* add events, ... */ - /* USER CODE END RTOS_EVENTS */ - -} - -/* USER CODE BEGIN Header_StartDefaultTask */ -/** - * @brief Function implementing the defaultTask thread. - * @param argument: Not used - * @retval None - */ -/* USER CODE END Header_StartDefaultTask */ -void StartDefaultTask(void *argument) -{ - /* init code for USB_DEVICE */ - MX_USB_DEVICE_Init(); - /* USER CODE BEGIN StartDefaultTask */ - /* Infinite loop */ - for(;;) - { - HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); - osDelay(500); - } - /* USER CODE END StartDefaultTask */ -} - -/* Private application code --------------------------------------------------*/ -/* USER CODE BEGIN Application */ - -/* USER CODE END Application */ - diff --git a/software/Power_Pico/Core/Src/gpio.c b/software/Power_Pico/Core/Src/gpio.c deleted file mode 100644 index 9236eb6..0000000 --- a/software/Power_Pico/Core/Src/gpio.c +++ /dev/null @@ -1,83 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file gpio.c - * @brief This file provides code for the configuration - * of all used GPIO pins. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "gpio.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/*----------------------------------------------------------------------------*/ -/* Configure GPIO */ -/*----------------------------------------------------------------------------*/ -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/** Configure pins as - * Analog - * Input - * Output - * EVENT_OUT - * EXTI -*/ -void MX_GPIO_Init(void) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOH_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); - - /*Configure GPIO pin : PC13 */ - GPIO_InitStruct.Pin = GPIO_PIN_13; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - /*Configure GPIO pin : PB10 */ - GPIO_InitStruct.Pin = GPIO_PIN_10; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /*Configure GPIO pin : PB4 */ - GPIO_InitStruct.Pin = GPIO_PIN_4; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - -} - -/* USER CODE BEGIN 2 */ - -/* USER CODE END 2 */ diff --git a/software/Power_Pico/Core/Src/i2c.c b/software/Power_Pico/Core/Src/i2c.c deleted file mode 100644 index deff244..0000000 --- a/software/Power_Pico/Core/Src/i2c.c +++ /dev/null @@ -1,116 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file i2c.c - * @brief This file provides code for the configuration - * of the I2C instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "i2c.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -I2C_HandleTypeDef hi2c1; - -/* I2C1 init function */ -void MX_I2C1_Init(void) -{ - - /* USER CODE BEGIN I2C1_Init 0 */ - - /* USER CODE END I2C1_Init 0 */ - - /* USER CODE BEGIN I2C1_Init 1 */ - - /* USER CODE END I2C1_Init 1 */ - hi2c1.Instance = I2C1; - hi2c1.Init.ClockSpeed = 100000; - hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; - hi2c1.Init.OwnAddress1 = 0; - hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - hi2c1.Init.OwnAddress2 = 0; - hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - if (HAL_I2C_Init(&hi2c1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN I2C1_Init 2 */ - - /* USER CODE END I2C1_Init 2 */ - -} - -void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(i2cHandle->Instance==I2C1) - { - /* USER CODE BEGIN I2C1_MspInit 0 */ - - /* USER CODE END I2C1_MspInit 0 */ - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA - */ - GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* I2C1 clock enable */ - __HAL_RCC_I2C1_CLK_ENABLE(); - /* USER CODE BEGIN I2C1_MspInit 1 */ - - /* USER CODE END I2C1_MspInit 1 */ - } -} - -void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) -{ - - if(i2cHandle->Instance==I2C1) - { - /* USER CODE BEGIN I2C1_MspDeInit 0 */ - - /* USER CODE END I2C1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_I2C1_CLK_DISABLE(); - - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6); - - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); - - /* USER CODE BEGIN I2C1_MspDeInit 1 */ - - /* USER CODE END I2C1_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/software/Power_Pico/Core/Src/main.c b/software/Power_Pico/Core/Src/main.c deleted file mode 100644 index 6041648..0000000 --- a/software/Power_Pico/Core/Src/main.c +++ /dev/null @@ -1,233 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.c - * @brief : Main program body - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -#include "cmsis_os.h" -#include "adc.h" -#include "dma.h" -#include "i2c.h" -#include "spi.h" -#include "tim.h" -#include "usb_device.h" -#include "gpio.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN PTD */ - -/* USER CODE END PTD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -void SystemClock_Config(void); -void MX_FREERTOS_Init(void); -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/** - * @brief The application entry point. - * @retval int - */ -int main(void) -{ - - /* USER CODE BEGIN 1 */ - //this must set same as keil setting - SCB->VTOR = FLASH_BASE + 0x00010000U; - /* USER CODE END 1 */ - - /* MCU Configuration--------------------------------------------------------*/ - - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); - - /* USER CODE BEGIN Init */ - - /* USER CODE END Init */ - - /* Configure the system clock */ - SystemClock_Config(); - - /* USER CODE BEGIN SysInit */ - __enable_irq(); - /* USER CODE END SysInit */ - - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_DMA_Init(); - MX_ADC1_Init(); - MX_TIM1_Init(); - MX_TIM4_Init(); - MX_SPI2_Init(); - MX_I2C1_Init(); - MX_TIM2_Init(); - MX_TIM5_Init(); - /* USER CODE BEGIN 2 */ - - /* USER CODE END 2 */ - - /* Init scheduler */ - osKernelInitialize(); - - /* Call init function for freertos objects (in cmsis_os2.c) */ - MX_FREERTOS_Init(); - - /* Start scheduler */ - osKernelStart(); - - /* We should never get here as control is now taken by the scheduler */ - - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - while (1) - { - /* USER CODE END WHILE */ - - /* USER CODE BEGIN 3 */ - } - /* USER CODE END 3 */ -} - -/** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) -{ - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - - /** Configure the main internal regulator output voltage - */ - __HAL_RCC_PWR_CLK_ENABLE(); - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 25; - RCC_OscInitStruct.PLL.PLLN = 192; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 4; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - { - Error_Handler(); - } - - /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK) - { - Error_Handler(); - } -} - -/* USER CODE BEGIN 4 */ - -/* USER CODE END 4 */ - -/** - * @brief Period elapsed callback in non blocking mode - * @note This function is called when TIM11 interrupt took place, inside - * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment - * a global variable "uwTick" used as application time base. - * @param htim : TIM handle - * @retval None - */ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* USER CODE BEGIN Callback 0 */ - - /* USER CODE END Callback 0 */ - if (htim->Instance == TIM11) - { - HAL_IncTick(); - } - /* USER CODE BEGIN Callback 1 */ - - /* USER CODE END Callback 1 */ -} - -/** - * @brief This function is executed in case of error occurrence. - * @retval None - */ -void Error_Handler(void) -{ - /* USER CODE BEGIN Error_Handler_Debug */ - /* User can add his own implementation to report the HAL error return state */ - __disable_irq(); - while (1) - { - } - /* USER CODE END Error_Handler_Debug */ -} - -#ifdef USE_FULL_ASSERT -/** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ -void assert_failed(uint8_t *file, uint32_t line) -{ - /* USER CODE BEGIN 6 */ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ -} -#endif /* USE_FULL_ASSERT */ diff --git a/software/Power_Pico/Core/Src/spi.c b/software/Power_Pico/Core/Src/spi.c deleted file mode 100644 index c7ec692..0000000 --- a/software/Power_Pico/Core/Src/spi.c +++ /dev/null @@ -1,139 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file spi.c - * @brief This file provides code for the configuration - * of the SPI instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "spi.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -SPI_HandleTypeDef hspi2; -DMA_HandleTypeDef hdma_spi2_tx; - -/* SPI2 init function */ -void MX_SPI2_Init(void) -{ - - /* USER CODE BEGIN SPI2_Init 0 */ - - /* USER CODE END SPI2_Init 0 */ - - /* USER CODE BEGIN SPI2_Init 1 */ - - /* USER CODE END SPI2_Init 1 */ - hspi2.Instance = SPI2; - hspi2.Init.Mode = SPI_MODE_MASTER; - hspi2.Init.Direction = SPI_DIRECTION_2LINES; - hspi2.Init.DataSize = SPI_DATASIZE_8BIT; - hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH; - hspi2.Init.CLKPhase = SPI_PHASE_2EDGE; - hspi2.Init.NSS = SPI_NSS_SOFT; - hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi2.Init.TIMode = SPI_TIMODE_DISABLE; - hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi2.Init.CRCPolynomial = 10; - if (HAL_SPI_Init(&hspi2) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN SPI2_Init 2 */ - - /* USER CODE END SPI2_Init 2 */ - -} - -void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(spiHandle->Instance==SPI2) - { - /* USER CODE BEGIN SPI2_MspInit 0 */ - - /* USER CODE END SPI2_MspInit 0 */ - /* SPI2 clock enable */ - __HAL_RCC_SPI2_CLK_ENABLE(); - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**SPI2 GPIO Configuration - PB13 ------> SPI2_SCK - PB15 ------> SPI2_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* SPI2 DMA Init */ - /* SPI2_TX Init */ - hdma_spi2_tx.Instance = DMA1_Stream4; - hdma_spi2_tx.Init.Channel = DMA_CHANNEL_0; - hdma_spi2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; - hdma_spi2_tx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_spi2_tx.Init.MemInc = DMA_MINC_ENABLE; - hdma_spi2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; - hdma_spi2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; - hdma_spi2_tx.Init.Mode = DMA_NORMAL; - hdma_spi2_tx.Init.Priority = DMA_PRIORITY_LOW; - hdma_spi2_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - if (HAL_DMA_Init(&hdma_spi2_tx) != HAL_OK) - { - Error_Handler(); - } - - __HAL_LINKDMA(spiHandle,hdmatx,hdma_spi2_tx); - - /* USER CODE BEGIN SPI2_MspInit 1 */ - - /* USER CODE END SPI2_MspInit 1 */ - } -} - -void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) -{ - - if(spiHandle->Instance==SPI2) - { - /* USER CODE BEGIN SPI2_MspDeInit 0 */ - - /* USER CODE END SPI2_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI2_CLK_DISABLE(); - - /**SPI2 GPIO Configuration - PB13 ------> SPI2_SCK - PB15 ------> SPI2_MOSI - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_15); - - /* SPI2 DMA DeInit */ - HAL_DMA_DeInit(spiHandle->hdmatx); - /* USER CODE BEGIN SPI2_MspDeInit 1 */ - - /* USER CODE END SPI2_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/software/Power_Pico/Core/Src/stm32f4xx_hal_msp.c b/software/Power_Pico/Core/Src/stm32f4xx_hal_msp.c deleted file mode 100644 index 14a8392..0000000 --- a/software/Power_Pico/Core/Src/stm32f4xx_hal_msp.c +++ /dev/null @@ -1,84 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_hal_msp.c - * @brief This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Define */ - -/* USER CODE END Define */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Macro */ - -/* USER CODE END Macro */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* External functions --------------------------------------------------------*/ -/* USER CODE BEGIN ExternalFunctions */ - -/* USER CODE END ExternalFunctions */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - /* PendSV_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0); - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/software/Power_Pico/Core/Src/stm32f4xx_hal_timebase_tim.c b/software/Power_Pico/Core/Src/stm32f4xx_hal_timebase_tim.c deleted file mode 100644 index db360a7..0000000 --- a/software/Power_Pico/Core/Src/stm32f4xx_hal_timebase_tim.c +++ /dev/null @@ -1,128 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_hal_timebase_tim.c - * @brief HAL time base based on the hardware TIM. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" -#include "stm32f4xx_hal_tim.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -TIM_HandleTypeDef htim11; -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief This function configures the TIM11 as a time base source. - * The time source is configured to have 1ms time base with a dedicated - * Tick interrupt priority. - * @note This function is called automatically at the beginning of program after - * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). - * @param TickPriority: Tick interrupt priority. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) -{ - RCC_ClkInitTypeDef clkconfig; - uint32_t uwTimclock = 0U; - - uint32_t uwPrescalerValue = 0U; - uint32_t pFLatency; - - HAL_StatusTypeDef status; - - /* Enable TIM11 clock */ - __HAL_RCC_TIM11_CLK_ENABLE(); - - /* Get clock configuration */ - HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); - - /* Compute TIM11 clock */ - uwTimclock = HAL_RCC_GetPCLK2Freq(); - - /* Compute the prescaler value to have TIM11 counter clock equal to 1MHz */ - uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U); - - /* Initialize TIM11 */ - htim11.Instance = TIM11; - - /* Initialize TIMx peripheral as follow: - * Period = [(TIM11CLK/1000) - 1]. to have a (1/1000) s time base. - * Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. - * ClockDivision = 0 - * Counter direction = Up - */ - htim11.Init.Period = (1000000U / 1000U) - 1U; - htim11.Init.Prescaler = uwPrescalerValue; - htim11.Init.ClockDivision = 0; - htim11.Init.CounterMode = TIM_COUNTERMODE_UP; - htim11.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - - status = HAL_TIM_Base_Init(&htim11); - if (status == HAL_OK) - { - /* Start the TIM time Base generation in interrupt mode */ - status = HAL_TIM_Base_Start_IT(&htim11); - if (status == HAL_OK) - { - /* Enable the TIM11 global Interrupt */ - HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM11_IRQn); - /* Configure the SysTick IRQ priority */ - if (TickPriority < (1UL << __NVIC_PRIO_BITS)) - { - /* Configure the TIM IRQ priority */ - HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM11_IRQn, TickPriority, 0U); - uwTickPrio = TickPriority; - } - else - { - status = HAL_ERROR; - } - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Suspend Tick increment. - * @note Disable the tick increment by disabling TIM11 update interrupt. - * @param None - * @retval None - */ -void HAL_SuspendTick(void) -{ - /* Disable TIM11 update Interrupt */ - __HAL_TIM_DISABLE_IT(&htim11, TIM_IT_UPDATE); -} - -/** - * @brief Resume Tick increment. - * @note Enable the tick increment by Enabling TIM11 update interrupt. - * @param None - * @retval None - */ -void HAL_ResumeTick(void) -{ - /* Enable TIM11 Update interrupt */ - __HAL_TIM_ENABLE_IT(&htim11, TIM_IT_UPDATE); -} - diff --git a/software/Power_Pico/Core/Src/stm32f4xx_it.c b/software/Power_Pico/Core/Src/stm32f4xx_it.c deleted file mode 100644 index 363f633..0000000 --- a/software/Power_Pico/Core/Src/stm32f4xx_it.c +++ /dev/null @@ -1,227 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -#include "stm32f4xx_it.h" -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -#include "adc.h" -#include "gate.h" -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/* External variables --------------------------------------------------------*/ -extern PCD_HandleTypeDef hpcd_USB_OTG_FS; -extern DMA_HandleTypeDef hdma_adc1; -extern DMA_HandleTypeDef hdma_spi2_tx; -extern TIM_HandleTypeDef htim1; -extern TIM_HandleTypeDef htim11; - -/* USER CODE BEGIN EV */ - -/* USER CODE END EV */ - -/******************************************************************************/ -/* Cortex-M4 Processor Interruption and Exception Handlers */ -/******************************************************************************/ -/** - * @brief This function handles Non maskable interrupt. - */ -void NMI_Handler(void) -{ - /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ - - /* USER CODE END NonMaskableInt_IRQn 0 */ - /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ - while (1) - { - } - /* USER CODE END NonMaskableInt_IRQn 1 */ -} - -/** - * @brief This function handles Hard fault interrupt. - */ -void HardFault_Handler(void) -{ - /* USER CODE BEGIN HardFault_IRQn 0 */ - - /* USER CODE END HardFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_HardFault_IRQn 0 */ - /* USER CODE END W1_HardFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Memory management fault. - */ -void MemManage_Handler(void) -{ - /* USER CODE BEGIN MemoryManagement_IRQn 0 */ - - /* USER CODE END MemoryManagement_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ - /* USER CODE END W1_MemoryManagement_IRQn 0 */ - } -} - -/** - * @brief This function handles Pre-fetch fault, memory access fault. - */ -void BusFault_Handler(void) -{ - /* USER CODE BEGIN BusFault_IRQn 0 */ - - /* USER CODE END BusFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_BusFault_IRQn 0 */ - /* USER CODE END W1_BusFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Undefined instruction or illegal state. - */ -void UsageFault_Handler(void) -{ - /* USER CODE BEGIN UsageFault_IRQn 0 */ - - /* USER CODE END UsageFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ - /* USER CODE END W1_UsageFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Debug monitor. - */ -void DebugMon_Handler(void) -{ - /* USER CODE BEGIN DebugMonitor_IRQn 0 */ - - /* USER CODE END DebugMonitor_IRQn 0 */ - /* USER CODE BEGIN DebugMonitor_IRQn 1 */ - - /* USER CODE END DebugMonitor_IRQn 1 */ -} - -/******************************************************************************/ -/* STM32F4xx Peripheral Interrupt Handlers */ -/* Add here the Interrupt Handlers for the used peripherals. */ -/* For the available peripheral interrupt handler names, */ -/* please refer to the startup file (startup_stm32f4xx.s). */ -/******************************************************************************/ - -/** - * @brief This function handles DMA1 stream4 global interrupt. - */ -void DMA1_Stream4_IRQHandler(void) -{ - /* USER CODE BEGIN DMA1_Stream4_IRQn 0 */ - - /* USER CODE END DMA1_Stream4_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_spi2_tx); - /* USER CODE BEGIN DMA1_Stream4_IRQn 1 */ - - /* USER CODE END DMA1_Stream4_IRQn 1 */ -} - -/** - * @brief This function handles TIM1 trigger and commutation interrupts and TIM11 global interrupt. - */ -void TIM1_TRG_COM_TIM11_IRQHandler(void) -{ - /* USER CODE BEGIN TIM1_TRG_COM_TIM11_IRQn 0 */ - - /* USER CODE END TIM1_TRG_COM_TIM11_IRQn 0 */ - HAL_TIM_IRQHandler(&htim1); - HAL_TIM_IRQHandler(&htim11); - /* USER CODE BEGIN TIM1_TRG_COM_TIM11_IRQn 1 */ - - /* USER CODE END TIM1_TRG_COM_TIM11_IRQn 1 */ -} - -/** - * @brief This function handles DMA2 stream0 global interrupt. - */ -void DMA2_Stream0_IRQHandler(void) -{ - /* USER CODE BEGIN DMA2_Stream0_IRQn 0 */ - - /* USER CODE END DMA2_Stream0_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_adc1); - /* USER CODE BEGIN DMA2_Stream0_IRQn 1 */ - - /* USER CODE END DMA2_Stream0_IRQn 1 */ -} - -/** - * @brief This function handles USB On The Go FS global interrupt. - */ -void OTG_FS_IRQHandler(void) -{ - /* USER CODE BEGIN OTG_FS_IRQn 0 */ - - /* USER CODE END OTG_FS_IRQn 0 */ - HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS); - /* USER CODE BEGIN OTG_FS_IRQn 1 */ - - /* USER CODE END OTG_FS_IRQn 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/software/Power_Pico/Core/Src/system_stm32f4xx.c b/software/Power_Pico/Core/Src/system_stm32f4xx.c deleted file mode 100644 index 3bd40f7..0000000 --- a/software/Power_Pico/Core/Src/system_stm32f4xx.c +++ /dev/null @@ -1,747 +0,0 @@ -/** - ****************************************************************************** - * @file system_stm32f4xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f4xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx_system - * @{ - */ - -/** @addtogroup STM32F4xx_System_Private_Includes - * @{ - */ - - -#include "stm32f4xx.h" - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ -/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) -/* #define DATA_IN_ExtSRAM */ -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\ - STM32F412Zx || STM32F412Vx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/* #define DATA_IN_ExtSDRAM */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ - STM32F479xx */ - -/* Note: Following vector table addresses must be defined in line with linker - configuration. */ -/*!< Uncomment the following line if you need to relocate the vector table - anywhere in Flash or Sram, else the vector table is kept at the automatic - remap of boot address selected */ -/* #define USER_VECT_TAB_ADDRESS */ - -#if defined(USER_VECT_TAB_ADDRESS) -/*!< Uncomment the following line if you need to relocate your vector Table - in Sram else user remap will be done in Flash. */ -/* #define VECT_TAB_SRAM */ -#if defined(VECT_TAB_SRAM) -#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field. - This value must be a multiple of 0x200. */ -#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -#else -#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. - This value must be a multiple of 0x200. */ -#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -#endif /* VECT_TAB_SRAM */ -#endif /* USER_VECT_TAB_ADDRESS */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Variables - * @{ - */ - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ -uint32_t SystemCoreClock = 16000000; -const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; -const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes - * @{ - */ - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - static void SystemInit_ExtMemCtl(void); -#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the FPU setting, vector table location and External memory - * configuration. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - SystemInit_ExtMemCtl(); -#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ - - /* Configure the Vector Table location -------------------------------------*/ -#if defined(USER_VECT_TAB_ADDRESS) - SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#endif /* USER_VECT_TAB_ADDRESS */ -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value - * depends on the application requirements), user has to ensure that HSE_VALUE - * is same as the real frequency of the crystal used. Otherwise, this function - * may have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f4xx.s before jump to main. - * This function configures the external memories (SRAM/SDRAM) - * This SRAM/SDRAM will be used as program data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; - - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - - /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ - RCC->AHB1ENR |= 0x000001F8; - - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xAAAA0A8A; - /* Configure PDx pins speed to 100 MHz */ - GPIOD->OSPEEDR = 0xFFFF0FCF; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA828A; - /* Configure PEx pins speed to 100 MHz */ - GPIOE->OSPEEDR = 0xFFFFC3CF; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA800AAA; - /* Configure PFx pins speed to 50 MHz */ - GPIOF->OSPEEDR = 0xAA800AAA; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0xAAAAAAAA; - /* Configure PGx pins speed to 50 MHz */ - GPIOG->OSPEEDR = 0xAAAAAAAA; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - - /* Connect PHx pins to FMC Alternate function */ - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - /* Configure PHx pins in Alternate function mode */ - GPIOH->MODER = 0xAAAA08A0; - /* Configure PHx pins speed to 50 MHz */ - GPIOH->OSPEEDR = 0xAAAA08A0; - /* Configure PHx pins Output type to push-pull */ - GPIOH->OTYPER = 0x00000000; - /* No pull-up, pull-down for PHx pins */ - GPIOH->PUPDR = 0x00000000; - - /* Connect PIx pins to FMC Alternate function */ - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - /* Configure PIx pins in Alternate function mode */ - GPIOI->MODER = 0x0028AAAA; - /* Configure PIx pins speed to 50 MHz */ - GPIOI->OSPEEDR = 0x0028AAAA; - /* Configure PIx pins Output type to push-pull */ - GPIOI->OTYPER = 0x00000000; - /* No pull-up, pull-down for PIx pins */ - GPIOI->PUPDR = 0x00000000; - -/*-- FMC Configuration -------------------------------------------------------*/ - /* Enable the FMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - - FMC_Bank5_6->SDCR[0] = 0x000019E4; - FMC_Bank5_6->SDTR[0] = 0x01115351; - - /* SDRAM initialization sequence */ - /* Clock enable command */ - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Delay */ - for (index = 0; index<1000; index++); - - /* PALL command */ - FMC_Bank5_6->SDCMR = 0x00000012; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Auto refresh command */ - FMC_Bank5_6->SDCMR = 0x00000073; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* MRD register program */ - FMC_Bank5_6->SDCMR = 0x00046014; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Set refresh count */ - tmpreg = FMC_Bank5_6->SDRTR; - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); - - /* Disable write protection */ - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F469xx || STM32F479xx */ - - (void)(tmp); -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f4xx.s before jump to main. - * This function configures the external memories (SRAM/SDRAM) - * This SRAM/SDRAM will be used as program data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#if defined (DATA_IN_ExtSDRAM) - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - -#if defined(STM32F446xx) - /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface - clock */ - RCC->AHB1ENR |= 0x0000007D; -#else - /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface - clock */ - RCC->AHB1ENR |= 0x000001F8; -#endif /* STM32F446xx */ - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - -#if defined(STM32F446xx) - /* Connect PAx pins to FMC Alternate function */ - GPIOA->AFR[0] |= 0xC0000000; - GPIOA->AFR[1] |= 0x00000000; - /* Configure PDx pins in Alternate function mode */ - GPIOA->MODER |= 0x00008000; - /* Configure PDx pins speed to 50 MHz */ - GPIOA->OSPEEDR |= 0x00008000; - /* Configure PDx pins Output type to push-pull */ - GPIOA->OTYPER |= 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOA->PUPDR |= 0x00000000; - - /* Connect PCx pins to FMC Alternate function */ - GPIOC->AFR[0] |= 0x00CC0000; - GPIOC->AFR[1] |= 0x00000000; - /* Configure PDx pins in Alternate function mode */ - GPIOC->MODER |= 0x00000A00; - /* Configure PDx pins speed to 50 MHz */ - GPIOC->OSPEEDR |= 0x00000A00; - /* Configure PDx pins Output type to push-pull */ - GPIOC->OTYPER |= 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOC->PUPDR |= 0x00000000; -#endif /* STM32F446xx */ - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x000000CC; - GPIOD->AFR[1] = 0xCC000CCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xA02A000A; - /* Configure PDx pins speed to 50 MHz */ - GPIOD->OSPEEDR = 0xA02A000A; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00000CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA800A; - /* Configure PEx pins speed to 50 MHz */ - GPIOE->OSPEEDR = 0xAAAA800A; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA800AAA; - /* Configure PFx pins speed to 50 MHz */ - GPIOF->OSPEEDR = 0xAA800AAA; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0xAAAAAAAA; - /* Configure PGx pins speed to 50 MHz */ - GPIOG->OSPEEDR = 0xAAAAAAAA; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) - /* Connect PHx pins to FMC Alternate function */ - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - /* Configure PHx pins in Alternate function mode */ - GPIOH->MODER = 0xAAAA08A0; - /* Configure PHx pins speed to 50 MHz */ - GPIOH->OSPEEDR = 0xAAAA08A0; - /* Configure PHx pins Output type to push-pull */ - GPIOH->OTYPER = 0x00000000; - /* No pull-up, pull-down for PHx pins */ - GPIOH->PUPDR = 0x00000000; - - /* Connect PIx pins to FMC Alternate function */ - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - /* Configure PIx pins in Alternate function mode */ - GPIOI->MODER = 0x0028AAAA; - /* Configure PIx pins speed to 50 MHz */ - GPIOI->OSPEEDR = 0x0028AAAA; - /* Configure PIx pins Output type to push-pull */ - GPIOI->OTYPER = 0x00000000; - /* No pull-up, pull-down for PIx pins */ - GPIOI->PUPDR = 0x00000000; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -/*-- FMC Configuration -------------------------------------------------------*/ - /* Enable the FMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - - /* Configure and enable SDRAM bank1 */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCR[0] = 0x00001954; -#else - FMC_Bank5_6->SDCR[0] = 0x000019E4; -#endif /* STM32F446xx */ - FMC_Bank5_6->SDTR[0] = 0x01115351; - - /* SDRAM initialization sequence */ - /* Clock enable command */ - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Delay */ - for (index = 0; index<1000; index++); - - /* PALL command */ - FMC_Bank5_6->SDCMR = 0x00000012; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Auto refresh command */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x000000F3; -#else - FMC_Bank5_6->SDCMR = 0x00000073; -#endif /* STM32F446xx */ - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* MRD register program */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x00044014; -#else - FMC_Bank5_6->SDCMR = 0x00046014; -#endif /* STM32F446xx */ - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Set refresh count */ - tmpreg = FMC_Bank5_6->SDRTR; -#if defined(STM32F446xx) - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); -#else - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); -#endif /* STM32F446xx */ - - /* Disable write protection */ - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); -#endif /* DATA_IN_ExtSDRAM */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) - -#if defined(DATA_IN_ExtSRAM) -/*-- GPIOs Configuration -----------------------------------------------------*/ - /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ - RCC->AHB1ENR |= 0x00000078; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xAAAA0A8A; - /* Configure PDx pins speed to 100 MHz */ - GPIOD->OSPEEDR = 0xFFFF0FCF; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA828A; - /* Configure PEx pins speed to 100 MHz */ - GPIOE->OSPEEDR = 0xFFFFC3CF; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0x00CCCCCC; - GPIOF->AFR[1] = 0xCCCC0000; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA000AAA; - /* Configure PFx pins speed to 100 MHz */ - GPIOF->OSPEEDR = 0xFF000FFF; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0x00CCCCCC; - GPIOG->AFR[1] = 0x000000C0; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0x00085AAA; - /* Configure PGx pins speed to 100 MHz */ - GPIOG->OSPEEDR = 0x000CAFFF; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - -/*-- FMC/FSMC Configuration --------------------------------------------------*/ - /* Enable the FMC/FSMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F469xx || STM32F479xx */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ - || defined(STM32F412Zx) || defined(STM32F412Vx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); - /* Configure and enable Bank1_SRAM2 */ - FSMC_Bank1->BTCR[2] = 0x00001011; - FSMC_Bank1->BTCR[3] = 0x00000201; - FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ - -#endif /* DATA_IN_ExtSRAM */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ - STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ - (void)(tmp); -} -#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/software/Power_Pico/Core/Src/tim.c b/software/Power_Pico/Core/Src/tim.c deleted file mode 100644 index 303cf49..0000000 --- a/software/Power_Pico/Core/Src/tim.c +++ /dev/null @@ -1,434 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file tim.c - * @brief This file provides code for the configuration - * of the TIM instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "tim.h" - -/* USER CODE BEGIN 0 */ - -// 64位总微秒计数器 -static volatile uint64_t g_total_microseconds = 0; -// 上一次读取的TIM5计数值 -static volatile uint32_t g_last_tim_value = 0; - -/* USER CODE END 0 */ - -TIM_HandleTypeDef htim1; -TIM_HandleTypeDef htim2; -TIM_HandleTypeDef htim4; -TIM_HandleTypeDef htim5; - -/* TIM1 init function */ -void MX_TIM1_Init(void) -{ - - /* USER CODE BEGIN TIM1_Init 0 */ - - /* USER CODE END TIM1_Init 0 */ - - TIM_MasterConfigTypeDef sMasterConfig = {0}; - TIM_OC_InitTypeDef sConfigOC = {0}; - TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; - - /* USER CODE BEGIN TIM1_Init 1 */ - - /* USER CODE END TIM1_Init 1 */ - htim1.Instance = TIM1; - htim1.Init.Prescaler = 95; - htim1.Init.CounterMode = TIM_COUNTERMODE_UP; - htim1.Init.Period = 300; - htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim1.Init.RepetitionCounter = 0; - htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) - { - Error_Handler(); - } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 0; - sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; - sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; - sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; - sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; - sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; - if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) - { - Error_Handler(); - } - sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; - sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; - sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; - sBreakDeadTimeConfig.DeadTime = 0; - sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; - sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; - sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; - if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM1_Init 2 */ - - /* USER CODE END TIM1_Init 2 */ - HAL_TIM_MspPostInit(&htim1); - -} -/* TIM2 init function */ -void MX_TIM2_Init(void) -{ - - /* USER CODE BEGIN TIM2_Init 0 */ - - /* USER CODE END TIM2_Init 0 */ - - TIM_SlaveConfigTypeDef sSlaveConfig = {0}; - TIM_MasterConfigTypeDef sMasterConfig = {0}; - - /* USER CODE BEGIN TIM2_Init 1 */ - - /* USER CODE END TIM2_Init 1 */ - htim2.Instance = TIM2; - htim2.Init.Prescaler = 95; - htim2.Init.CounterMode = TIM_COUNTERMODE_UP; - htim2.Init.Period = 99; - htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; - if (HAL_TIM_Base_Init(&htim2) != HAL_OK) - { - Error_Handler(); - } - sSlaveConfig.SlaveMode = TIM_SLAVEMODE_DISABLE; - sSlaveConfig.InputTrigger = TIM_TS_ITR0; - if (HAL_TIM_SlaveConfigSynchro(&htim2, &sSlaveConfig) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM2_Init 2 */ - - /* USER CODE END TIM2_Init 2 */ - -} -/* TIM4 init function */ -void MX_TIM4_Init(void) -{ - - /* USER CODE BEGIN TIM4_Init 0 */ - - /* USER CODE END TIM4_Init 0 */ - - TIM_MasterConfigTypeDef sMasterConfig = {0}; - TIM_OC_InitTypeDef sConfigOC = {0}; - - /* USER CODE BEGIN TIM4_Init 1 */ - - /* USER CODE END TIM4_Init 1 */ - htim4.Instance = TIM4; - htim4.Init.Prescaler = 95; - htim4.Init.CounterMode = TIM_COUNTERMODE_UP; - htim4.Init.Period = 500; - htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) - { - Error_Handler(); - } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 250; - sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; - sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; - if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM4_Init 2 */ - - /* USER CODE END TIM4_Init 2 */ - HAL_TIM_MspPostInit(&htim4); - -} -/* TIM5 init function */ -void MX_TIM5_Init(void) -{ - - /* USER CODE BEGIN TIM5_Init 0 */ - - /* USER CODE END TIM5_Init 0 */ - - TIM_MasterConfigTypeDef sMasterConfig = {0}; - TIM_OC_InitTypeDef sConfigOC = {0}; - - /* USER CODE BEGIN TIM5_Init 1 */ - - /* USER CODE END TIM5_Init 1 */ - htim5.Instance = TIM5; - htim5.Init.Prescaler = 95; - htim5.Init.CounterMode = TIM_COUNTERMODE_UP; - htim5.Init.Period = 4294967295; - htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_PWM_Init(&htim5) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) - { - Error_Handler(); - } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 0; - sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; - sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; - if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM5_Init 2 */ - - /* USER CODE END TIM5_Init 2 */ - -} - -void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle) -{ - - if(tim_pwmHandle->Instance==TIM1) - { - /* USER CODE BEGIN TIM1_MspInit 0 */ - - /* USER CODE END TIM1_MspInit 0 */ - /* TIM1 clock enable */ - __HAL_RCC_TIM1_CLK_ENABLE(); - - /* TIM1 interrupt Init */ - HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM11_IRQn, 15, 0); - HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM11_IRQn); - /* USER CODE BEGIN TIM1_MspInit 1 */ - - /* USER CODE END TIM1_MspInit 1 */ - } - else if(tim_pwmHandle->Instance==TIM4) - { - /* USER CODE BEGIN TIM4_MspInit 0 */ - - /* USER CODE END TIM4_MspInit 0 */ - /* TIM4 clock enable */ - __HAL_RCC_TIM4_CLK_ENABLE(); - /* USER CODE BEGIN TIM4_MspInit 1 */ - - /* USER CODE END TIM4_MspInit 1 */ - } - else if(tim_pwmHandle->Instance==TIM5) - { - /* USER CODE BEGIN TIM5_MspInit 0 */ - - /* USER CODE END TIM5_MspInit 0 */ - /* TIM5 clock enable */ - __HAL_RCC_TIM5_CLK_ENABLE(); - /* USER CODE BEGIN TIM5_MspInit 1 */ - - /* USER CODE END TIM5_MspInit 1 */ - } -} - -void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) -{ - - if(tim_baseHandle->Instance==TIM2) - { - /* USER CODE BEGIN TIM2_MspInit 0 */ - - /* USER CODE END TIM2_MspInit 0 */ - /* TIM2 clock enable */ - __HAL_RCC_TIM2_CLK_ENABLE(); - /* USER CODE BEGIN TIM2_MspInit 1 */ - - /* USER CODE END TIM2_MspInit 1 */ - } -} -void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(timHandle->Instance==TIM1) - { - /* USER CODE BEGIN TIM1_MspPostInit 0 */ - - /* USER CODE END TIM1_MspPostInit 0 */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**TIM1 GPIO Configuration - PA10 ------> TIM1_CH3 - */ - GPIO_InitStruct.Pin = GPIO_PIN_10; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN TIM1_MspPostInit 1 */ - - /* USER CODE END TIM1_MspPostInit 1 */ - } - else if(timHandle->Instance==TIM4) - { - /* USER CODE BEGIN TIM4_MspPostInit 0 */ - - /* USER CODE END TIM4_MspPostInit 0 */ - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**TIM4 GPIO Configuration - PB9 ------> TIM4_CH4 - */ - GPIO_InitStruct.Pin = GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF2_TIM4; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN TIM4_MspPostInit 1 */ - - /* USER CODE END TIM4_MspPostInit 1 */ - } - -} - -void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* tim_pwmHandle) -{ - - if(tim_pwmHandle->Instance==TIM1) - { - /* USER CODE BEGIN TIM1_MspDeInit 0 */ - - /* USER CODE END TIM1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM1_CLK_DISABLE(); - - /* TIM1 interrupt Deinit */ - HAL_NVIC_DisableIRQ(TIM1_TRG_COM_TIM11_IRQn); - /* USER CODE BEGIN TIM1_MspDeInit 1 */ - - /* USER CODE END TIM1_MspDeInit 1 */ - } - else if(tim_pwmHandle->Instance==TIM4) - { - /* USER CODE BEGIN TIM4_MspDeInit 0 */ - - /* USER CODE END TIM4_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM4_CLK_DISABLE(); - /* USER CODE BEGIN TIM4_MspDeInit 1 */ - - /* USER CODE END TIM4_MspDeInit 1 */ - } - else if(tim_pwmHandle->Instance==TIM5) - { - /* USER CODE BEGIN TIM5_MspDeInit 0 */ - - /* USER CODE END TIM5_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM5_CLK_DISABLE(); - /* USER CODE BEGIN TIM5_MspDeInit 1 */ - - /* USER CODE END TIM5_MspDeInit 1 */ - } -} - -void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) -{ - - if(tim_baseHandle->Instance==TIM2) - { - /* USER CODE BEGIN TIM2_MspDeInit 0 */ - - /* USER CODE END TIM2_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM2_CLK_DISABLE(); - /* USER CODE BEGIN TIM2_MspDeInit 1 */ - - /* USER CODE END TIM2_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/** - * @brief 更新并获取64位的总微秒数 (核心函数) - * @note 此函数应该被经常性调用, 以处理32位计数器的溢出并累加到64位变量中。 - */ -void UpdateMicrosecondCounter(void) -{ - uint32_t current_tim_value = __HAL_TIM_GET_COUNTER(&htim5); - uint32_t diff; - - if (current_tim_value >= g_last_tim_value) { - // 没有溢出 - diff = current_tim_value - g_last_tim_value; - } else { - // 32位计数器已经溢出 - // diff = (最大值 - 上一次的值) + 当前值 + 1 - diff = (0xFFFFFFFF - g_last_tim_value) + current_tim_value + 1; - } - - g_total_microseconds += diff; - g_last_tim_value = current_tim_value; -} - -/** - * @brief 获取累计的64位微秒数 - * @retval 64位的总微秒数 - */ -uint64_t GetMicrosecondCounter(void) -{ - // 在读取前先更新一次,以获取最精确的值 - UpdateMicrosecondCounter(); - return g_total_microseconds; -} - -/** - * @brief 清除累计的微秒计数器 - */ -void ClearMicrosecondCounter(void) -{ - g_total_microseconds = 0; - // 同时重置TIM5的硬件计数器和软件记录值 - __HAL_TIM_SET_COUNTER(&htim5, 0); - g_last_tim_value = 0; -} - -/* USER CODE END 1 */ diff --git a/software/Power_Pico/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f411xe.h b/software/Power_Pico/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f411xe.h deleted file mode 100644 index baa9edc..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f411xe.h +++ /dev/null @@ -1,8680 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f411xe.h - * @author MCD Application Team - * @brief CMSIS STM32F411xE Device Peripheral Access Layer Header File. - * - * This file contains: - * - Data structures and the address mapping for all peripherals - * - peripherals registers declarations and bits definition - * - Macros to access peripheral's registers hardware - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS_Device - * @{ - */ - -/** @addtogroup stm32f411xe - * @{ - */ - -#ifndef __STM32F411xE_H -#define __STM32F411xE_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M4 Processor and Core Peripherals - */ -#define __CM4_REV 0x0001U /*!< Core revision r0p1 */ -#define __MPU_PRESENT 1U /*!< STM32F4XX provides an MPU */ -#define __NVIC_PRIO_BITS 4U /*!< STM32F4XX uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ -#define __FPU_PRESENT 1U /*!< FPU present */ - -/** - * @} - */ - -/** @addtogroup Peripheral_interrupt_number_definition - * @{ - */ - -/** - * @brief STM32F4XX Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum -{ - /****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */ - /****** STM32 specific Interrupt Numbers **********************************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ - DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ - DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ - DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ - DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ - DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ - DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ - ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ - TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ - TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ - DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ - DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ - DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ - DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ - DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ - OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ - DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ - DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ - DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ - USART6_IRQn = 71, /*!< USART6 global interrupt */ - I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ - I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ - FPU_IRQn = 81, /*!< FPU global interrupt */ - SPI4_IRQn = 84, /*!< SPI4 global Interrupt */ - SPI5_IRQn = 85 /*!< SPI5 global Interrupt */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ -#include "system_stm32f4xx.h" -#include - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ - __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ - __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ - __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ - __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ - __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ - __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ - __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ - __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ - __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ - __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ - __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ - __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __IO uint32_t CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ -} ADC_Common_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ -} CRC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -} DBGMCU_TypeDef; - - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DMA stream x configuration register */ - __IO uint32_t NDTR; /*!< DMA stream x number of data register */ - __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ - __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ - __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ - __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ -} DMA_Stream_TypeDef; - -typedef struct -{ - __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ - __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ - __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ - __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ -} DMA_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ - __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ - __IO uint32_t OPTCR; /*!< FLASH option control register , Address offset: 0x14 */ - __IO uint32_t OPTCR1; /*!< FLASH option control register 1, Address offset: 0x18 */ -} FLASH_TypeDef; - -/** - * @brief General Purpose I/O - */ - -typedef struct -{ - __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ - __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ -} GPIO_TypeDef; - -/** - * @brief System configuration controller - */ - -typedef struct -{ - __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ - __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ - __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ - uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ - __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ - __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ - __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ - __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ - __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ - __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ - __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ - __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ - __IO uint32_t FLTR; /*!< I2C FLTR register, Address offset: 0x24 */ -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ - __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ - __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ -} IWDG_TypeDef; - - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ - __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ - __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32_t RESERVED0; /*!< Reserved, 0x1C */ - __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32_t RESERVED2; /*!< Reserved, 0x3C */ - __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32_t RESERVED4; /*!< Reserved, 0x5C */ - __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ - uint32_t RESERVED7[1]; /*!< Reserved, 0x88 */ - __IO uint32_t DCKCFGR; /*!< RCC Dedicated Clocks configuration register, Address offset: 0x8C */ -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ - __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ - __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ - __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ - __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ - __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ - __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ - __IO uint32_t SSR; /*!< RTC sub second register, Address offset: 0x28 */ - __IO uint32_t SHIFTR; /*!< RTC shift control register, Address offset: 0x2C */ - __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ - __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ - __IO uint32_t TSSSR; /*!< RTC time-stamp sub second register, Address offset: 0x38 */ - __IO uint32_t CALR; /*!< RTC calibration register, Address offset: 0x3C */ - __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ - __IO uint32_t ALRMASSR;/*!< RTC alarm A sub second register, Address offset: 0x44 */ - __IO uint32_t ALRMBSSR;/*!< RTC alarm B sub second register, Address offset: 0x48 */ - uint32_t RESERVED7; /*!< Reserved, 0x4C */ - __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ - __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ - __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ - __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ - __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ - __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ - __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ - __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ - __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ - __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ - __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ - __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ - __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ - __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ - __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ - __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ - __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ - __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ - __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ - __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ -} RTC_TypeDef; - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ - __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ - __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ - __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ - __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ - __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ - __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ - __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ - __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ - __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ - __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ - __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ - __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ - __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ - __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ - __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ - uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ - __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ - uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ - __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ - __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ - __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ - __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ - __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ - __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ - __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ - __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ - __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ -} SPI_TypeDef; - - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ - __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ - __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ - __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ - __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ - __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ - __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ - __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ - __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ - __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ - __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ - __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ - __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ - __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ - __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ - __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ - __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ - __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ - __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ - __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ - __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ - __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ - __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ - __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ - __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ - __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ - __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ -} WWDG_TypeDef; -/** - * @brief USB_OTG_Core_Registers - */ -typedef struct -{ - __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h */ - __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h */ - __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h */ - __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch */ - __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h */ - __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h */ - __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h */ - __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch */ - __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h */ - __IO uint32_t GRXFSIZ; /*!< Receive FIFO Size Register 024h */ - __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h */ - __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch */ - uint32_t Reserved30[2]; /*!< Reserved 030h */ - __IO uint32_t GCCFG; /*!< General Purpose IO Register 038h */ - __IO uint32_t CID; /*!< User ID Register 03Ch */ - uint32_t Reserved40[48]; /*!< Reserved 0x40-0xFF */ - __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg 100h */ - __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO */ -} USB_OTG_GlobalTypeDef; - -/** - * @brief USB_OTG_device_Registers - */ -typedef struct -{ - __IO uint32_t DCFG; /*!< dev Configuration Register 800h */ - __IO uint32_t DCTL; /*!< dev Control Register 804h */ - __IO uint32_t DSTS; /*!< dev Status Register (RO) 808h */ - uint32_t Reserved0C; /*!< Reserved 80Ch */ - __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask 810h */ - __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask 814h */ - __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg 818h */ - __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask 81Ch */ - uint32_t Reserved20; /*!< Reserved 820h */ - uint32_t Reserved9; /*!< Reserved 824h */ - __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register 828h */ - __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register 82Ch */ - __IO uint32_t DTHRCTL; /*!< dev threshold 830h */ - __IO uint32_t DIEPEMPMSK; /*!< dev empty msk 834h */ - __IO uint32_t DEACHINT; /*!< dedicated EP interrupt 838h */ - __IO uint32_t DEACHMSK; /*!< dedicated EP msk 83Ch */ - uint32_t Reserved40; /*!< dedicated EP mask 840h */ - __IO uint32_t DINEP1MSK; /*!< dedicated EP mask 844h */ - uint32_t Reserved44[15]; /*!< Reserved 844-87Ch */ - __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk 884h */ -} USB_OTG_DeviceTypeDef; - -/** - * @brief USB_OTG_IN_Endpoint-Specific_Register - */ -typedef struct -{ - __IO uint32_t DIEPCTL; /*!< dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ - uint32_t Reserved04; /*!< Reserved 900h + (ep_num * 20h) + 04h */ - __IO uint32_t DIEPINT; /*!< dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ - uint32_t Reserved0C; /*!< Reserved 900h + (ep_num * 20h) + 0Ch */ - __IO uint32_t DIEPTSIZ; /*!< IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ - __IO uint32_t DIEPDMA; /*!< IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ - __IO uint32_t DTXFSTS; /*!< IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ - uint32_t Reserved18; /*!< Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ -} USB_OTG_INEndpointTypeDef; - -/** - * @brief USB_OTG_OUT_Endpoint-Specific_Registers - */ -typedef struct -{ - __IO uint32_t DOEPCTL; /*!< dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h */ - uint32_t Reserved04; /*!< Reserved B00h + (ep_num * 20h) + 04h */ - __IO uint32_t DOEPINT; /*!< dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h */ - uint32_t Reserved0C; /*!< Reserved B00h + (ep_num * 20h) + 0Ch */ - __IO uint32_t DOEPTSIZ; /*!< dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h */ - __IO uint32_t DOEPDMA; /*!< dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h */ - uint32_t Reserved18[2]; /*!< Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch */ -} USB_OTG_OUTEndpointTypeDef; - -/** - * @brief USB_OTG_Host_Mode_Register_Structures - */ -typedef struct -{ - __IO uint32_t HCFG; /*!< Host Configuration Register 400h */ - __IO uint32_t HFIR; /*!< Host Frame Interval Register 404h */ - __IO uint32_t HFNUM; /*!< Host Frame Nbr/Frame Remaining 408h */ - uint32_t Reserved40C; /*!< Reserved 40Ch */ - __IO uint32_t HPTXSTS; /*!< Host Periodic Tx FIFO/ Queue Status 410h */ - __IO uint32_t HAINT; /*!< Host All Channels Interrupt Register 414h */ - __IO uint32_t HAINTMSK; /*!< Host All Channels Interrupt Mask 418h */ -} USB_OTG_HostTypeDef; - -/** - * @brief USB_OTG_Host_Channel_Specific_Registers - */ -typedef struct -{ - __IO uint32_t HCCHAR; /*!< Host Channel Characteristics Register 500h */ - __IO uint32_t HCSPLT; /*!< Host Channel Split Control Register 504h */ - __IO uint32_t HCINT; /*!< Host Channel Interrupt Register 508h */ - __IO uint32_t HCINTMSK; /*!< Host Channel Interrupt Mask Register 50Ch */ - __IO uint32_t HCTSIZ; /*!< Host Channel Transfer Size Register 510h */ - __IO uint32_t HCDMA; /*!< Host Channel DMA Address Register 514h */ - uint32_t Reserved[2]; /*!< Reserved */ -} USB_OTG_HostChannelTypeDef; - -/** - * @} - */ - -/** @addtogroup Peripheral_memory_map - * @{ - */ -#define FLASH_BASE 0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region */ -#define SRAM1_BASE 0x20000000UL /*!< SRAM1(128 KB) base address in the alias region */ -#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */ -#define SRAM1_BB_BASE 0x22000000UL /*!< SRAM1(128 KB) base address in the bit-band region */ -#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */ -#define BKPSRAM_BB_BASE 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */ -#define FLASH_END 0x0807FFFFUL /*!< FLASH end address */ -#define FLASH_OTP_BASE 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ -#define FLASH_OTP_END 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ - -/* Legacy defines */ -#define SRAM_BASE SRAM1_BASE -#define SRAM_BB_BASE SRAM1_BB_BASE - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) -#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) -#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000UL) - -/*!< APB1 peripherals */ -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000UL) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400UL) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800UL) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00UL) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800UL) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00UL) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000UL) -#define I2S2ext_BASE (APB1PERIPH_BASE + 0x3400UL) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) -#define I2S3ext_BASE (APB1PERIPH_BASE + 0x4000UL) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400UL) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400UL) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800UL) -#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00UL) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000UL) - -/*!< APB2 peripherals */ -#define TIM1_BASE (APB2PERIPH_BASE + 0x0000UL) -#define USART1_BASE (APB2PERIPH_BASE + 0x1000UL) -#define USART6_BASE (APB2PERIPH_BASE + 0x1400UL) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2000UL) -#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300UL) -/* Legacy define */ -#define ADC_BASE ADC1_COMMON_BASE -#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00UL) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000UL) -#define SPI4_BASE (APB2PERIPH_BASE + 0x3400UL) -#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800UL) -#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00UL) -#define TIM9_BASE (APB2PERIPH_BASE + 0x4000UL) -#define TIM10_BASE (APB2PERIPH_BASE + 0x4400UL) -#define TIM11_BASE (APB2PERIPH_BASE + 0x4800UL) -#define SPI5_BASE (APB2PERIPH_BASE + 0x5000UL) - -/*!< AHB1 peripherals */ -#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL) -#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL) -#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800UL) -#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00UL) -#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000UL) -#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00UL) -#define CRC_BASE (AHB1PERIPH_BASE + 0x3000UL) -#define RCC_BASE (AHB1PERIPH_BASE + 0x3800UL) -#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00UL) -#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000UL) -#define DMA1_Stream0_BASE (DMA1_BASE + 0x010UL) -#define DMA1_Stream1_BASE (DMA1_BASE + 0x028UL) -#define DMA1_Stream2_BASE (DMA1_BASE + 0x040UL) -#define DMA1_Stream3_BASE (DMA1_BASE + 0x058UL) -#define DMA1_Stream4_BASE (DMA1_BASE + 0x070UL) -#define DMA1_Stream5_BASE (DMA1_BASE + 0x088UL) -#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0UL) -#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8UL) -#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400UL) -#define DMA2_Stream0_BASE (DMA2_BASE + 0x010UL) -#define DMA2_Stream1_BASE (DMA2_BASE + 0x028UL) -#define DMA2_Stream2_BASE (DMA2_BASE + 0x040UL) -#define DMA2_Stream3_BASE (DMA2_BASE + 0x058UL) -#define DMA2_Stream4_BASE (DMA2_BASE + 0x070UL) -#define DMA2_Stream5_BASE (DMA2_BASE + 0x088UL) -#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0UL) -#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8UL) - - -/*!< Debug MCU registers base address */ -#define DBGMCU_BASE 0xE0042000UL -/*!< USB registers base address */ -#define USB_OTG_FS_PERIPH_BASE 0x50000000UL - -#define USB_OTG_GLOBAL_BASE 0x000UL -#define USB_OTG_DEVICE_BASE 0x800UL -#define USB_OTG_IN_ENDPOINT_BASE 0x900UL -#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL -#define USB_OTG_EP_REG_SIZE 0x20UL -#define USB_OTG_HOST_BASE 0x400UL -#define USB_OTG_HOST_PORT_BASE 0x440UL -#define USB_OTG_HOST_CHANNEL_BASE 0x500UL -#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL -#define USB_OTG_PCGCCTL_BASE 0xE00UL -#define USB_OTG_FIFO_BASE 0x1000UL -#define USB_OTG_FIFO_SIZE 0x1000UL - -#define UID_BASE 0x1FFF7A10UL /*!< Unique device ID register base address */ -#define FLASHSIZE_BASE 0x1FFF7A22UL /*!< FLASH Size register base address */ -#define PACKAGE_BASE 0x1FFF7BF0UL /*!< Package size register base address */ -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define I2S2ext ((SPI_TypeDef *) I2S2ext_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define I2S3ext ((SPI_TypeDef *) I2S3ext_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define I2C3 ((I2C_TypeDef *) I2C3_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) -/* Legacy define */ -#define ADC ADC1_COMMON -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define SPI4 ((SPI_TypeDef *) SPI4_BASE) -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define SPI5 ((SPI_TypeDef *) SPI5_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) -#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) -#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) -#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) -#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) -#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) -#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) -#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) -#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) -#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) -#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) -#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) -#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) -#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) -#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) -#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - -/** @addtogroup Hardware_Constant_Definition - * @{ - */ -#define LSI_STARTUP_TIME 40U /*!< LSI Maximum startup time in us */ -/** - * @} - */ - -/** @addtogroup Peripheral_Registers_Bits_Definition -* @{ -*/ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* Analog to Digital Converter */ -/* */ -/******************************************************************************/ - -/******************** Bit definition for ADC_SR register ********************/ -#define ADC_SR_AWD_Pos (0U) -#define ADC_SR_AWD_Msk (0x1UL << ADC_SR_AWD_Pos) /*!< 0x00000001 */ -#define ADC_SR_AWD ADC_SR_AWD_Msk /*!> SCB_CCSIDR_ASSOCIATIVITY_Pos) -#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) - -#ifndef __SCB_DCACHE_LINE_SIZE -#define __SCB_DCACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ -#endif - -#ifndef __SCB_ICACHE_LINE_SIZE -#define __SCB_ICACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ -#endif - -/** - \brief Enable I-Cache - \details Turns on I-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */ - - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable I-Cache - \details Turns off I-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate I-Cache - \details Invalidates I-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; - __DSB(); - __ISB(); - #endif -} - - -/** - \brief I-Cache Invalidate by address - \details Invalidates I-Cache for the given address. - I-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - I-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] isize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateICache_by_Addr (volatile void *addr, int32_t isize) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if ( isize > 0 ) { - int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_ICACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->ICIMVAU = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_ICACHE_LINE_SIZE; - op_size -= __SCB_ICACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief Enable D-Cache - \details Turns on D-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */ - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - __DSB(); - - SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable D-Cache - \details Turns off D-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate D-Cache - \details Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean D-Cache - \details Cleans D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | - ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean & Invalidate D-Cache - \details Cleans and Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief D-Cache Invalidate by address - \details Invalidates D-Cache for the given address. - D-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateDCache_by_Addr (volatile void *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean by address - \details Cleans D-Cache for the given address - D-Cache is cleaned starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanDCache_by_Addr (volatile void *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean and Invalidate by address - \details Cleans and invalidates D_Cache for the given address - D-Cache is cleaned and invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned and invalidated. - \param[in] addr address (aligned to 32-byte boundary) - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache_by_Addr (volatile void *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - -/*@} end of CMSIS_Core_CacheFunctions */ - -#endif /* ARM_CACHEL1_ARMV7_H */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_armcc.h b/software/Power_Pico/Drivers/CMSIS/Include/cmsis_armcc.h deleted file mode 100644 index a955d47..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_armcc.h +++ /dev/null @@ -1,888 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armcc.h - * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file - * @version V5.3.2 - * @date 27. May 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __CMSIS_ARMCC_H -#define __CMSIS_ARMCC_H - - -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) - #error "Please use Arm Compiler Toolchain V4.0.677 or later!" -#endif - -/* CMSIS compiler control architecture macros */ -#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ - (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) - #define __ARM_ARCH_6M__ 1 -#endif - -#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) - #define __ARM_ARCH_7M__ 1 -#endif - -#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) - #define __ARM_ARCH_7EM__ 1 -#endif - - /* __ARM_ARCH_8M_BASE__ not applicable */ - /* __ARM_ARCH_8M_MAIN__ not applicable */ - /* __ARM_ARCH_8_1M_MAIN__ not applicable */ - -/* CMSIS compiler control DSP macros */ -#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - #define __ARM_FEATURE_DSP 1 -#endif - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE __inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline -#endif -#ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE static __forceinline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __declspec(noreturn) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed)) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT __packed struct -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION __packed union -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __memory_changed() -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START -#define __PROGRAM_START __main -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET"))) -#endif - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __nop - - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI __wfi - - -/** - \brief Wait For Event - \details 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. - */ -#define __WFE __wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __sev - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -#define __ISB() __isb(0xF) - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __dsb(0xF) - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __dmb(0xF) - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV __rev - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) -{ - rev16 r0, r0 - bx lr -} -#endif - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) -{ - revsh r0, r0 - bx lr -} -#endif - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -#define __ROR __ror - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __breakpoint(value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - #define __RBIT __rbit -#else -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ - - result = value; /* r will be reversed bits of v; first get LSB of v */ - for (value >>= 1U; value != 0U; value >>= 1U) - { - result <<= 1U; - result |= value & 1U; - s--; - } - result <<= s; /* shift when v's highest bits are zero */ - return result; -} -#endif - - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __clz - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) -#else - #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) -#else - #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) -#else - #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXB(value, ptr) __strex(value, ptr) -#else - #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXH(value, ptr) __strex(value, ptr) -#else - #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXW(value, ptr) __strex(value, ptr) -#else - #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __clrex - - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __ssat - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __usat - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) -{ - rrx r0, r0 - bx lr -} -#endif - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRBT(value, ptr) __strt(value, ptr) - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRHT(value, ptr) __strt(value, ptr) - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRT(value, ptr) __strt(value, ptr) - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) -{ - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; -} - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) -{ - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -/* intrinsic void __enable_irq(); */ - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -/* intrinsic void __disable_irq(); */ - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_INLINE uint32_t __get_CONTROL(void) -{ - register uint32_t __regControl __ASM("control"); - return(__regControl); -} - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - register uint32_t __regControl __ASM("control"); - __regControl = control; - __ISB(); -} - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_INLINE uint32_t __get_IPSR(void) -{ - register uint32_t __regIPSR __ASM("ipsr"); - return(__regIPSR); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_INLINE uint32_t __get_APSR(void) -{ - register uint32_t __regAPSR __ASM("apsr"); - return(__regAPSR); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_INLINE uint32_t __get_xPSR(void) -{ - register uint32_t __regXPSR __ASM("xpsr"); - return(__regXPSR); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - return(__regProcessStackPointer); -} - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - __regProcessStackPointer = topOfProcStack; -} - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - return(__regMainStackPointer); -} - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - __regMainStackPointer = topOfMainStack; -} - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - register uint32_t __regPriMask __ASM("primask"); - return(__regPriMask); -} - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - register uint32_t __regPriMask __ASM("primask"); - __regPriMask = (priMask); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -#define __disable_fault_irq __disable_fiq - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - register uint32_t __regBasePri __ASM("basepri"); - return(__regBasePri); -} - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) -{ - register uint32_t __regBasePri __ASM("basepri"); - __regBasePri = (basePri & 0xFFU); -} - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - register uint32_t __regBasePriMax __ASM("basepri_max"); - __regBasePriMax = (basePri & 0xFFU); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - return(__regFaultMask); -} - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - __regFaultMask = (faultMask & (uint32_t)1U); -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -__STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - register uint32_t __regfpscr __ASM("fpscr"); - return(__regfpscr); -#else - return(0U); -#endif -} - - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - register uint32_t __regfpscr __ASM("fpscr"); - __regfpscr = (fpscr); -#else - (void)fpscr; -#endif -} - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -#define __SADD8 __sadd8 -#define __QADD8 __qadd8 -#define __SHADD8 __shadd8 -#define __UADD8 __uadd8 -#define __UQADD8 __uqadd8 -#define __UHADD8 __uhadd8 -#define __SSUB8 __ssub8 -#define __QSUB8 __qsub8 -#define __SHSUB8 __shsub8 -#define __USUB8 __usub8 -#define __UQSUB8 __uqsub8 -#define __UHSUB8 __uhsub8 -#define __SADD16 __sadd16 -#define __QADD16 __qadd16 -#define __SHADD16 __shadd16 -#define __UADD16 __uadd16 -#define __UQADD16 __uqadd16 -#define __UHADD16 __uhadd16 -#define __SSUB16 __ssub16 -#define __QSUB16 __qsub16 -#define __SHSUB16 __shsub16 -#define __USUB16 __usub16 -#define __UQSUB16 __uqsub16 -#define __UHSUB16 __uhsub16 -#define __SASX __sasx -#define __QASX __qasx -#define __SHASX __shasx -#define __UASX __uasx -#define __UQASX __uqasx -#define __UHASX __uhasx -#define __SSAX __ssax -#define __QSAX __qsax -#define __SHSAX __shsax -#define __USAX __usax -#define __UQSAX __uqsax -#define __UHSAX __uhsax -#define __USAD8 __usad8 -#define __USADA8 __usada8 -#define __SSAT16 __ssat16 -#define __USAT16 __usat16 -#define __UXTB16 __uxtb16 -#define __UXTAB16 __uxtab16 -#define __SXTB16 __sxtb16 -#define __SXTAB16 __sxtab16 -#define __SMUAD __smuad -#define __SMUADX __smuadx -#define __SMLAD __smlad -#define __SMLADX __smladx -#define __SMLALD __smlald -#define __SMLALDX __smlaldx -#define __SMUSD __smusd -#define __SMUSDX __smusdx -#define __SMLSD __smlsd -#define __SMLSDX __smlsdx -#define __SMLSLD __smlsld -#define __SMLSLDX __smlsldx -#define __SEL __sel -#define __QADD __qadd -#define __QSUB __qsub - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ - ((int64_t)(ARG3) << 32U) ) >> 32U)) - -#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) - -#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) - -#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCC_H */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_armclang.h b/software/Power_Pico/Drivers/CMSIS/Include/cmsis_armclang.h deleted file mode 100644 index 6911417..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_armclang.h +++ /dev/null @@ -1,1503 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armclang.h - * @brief CMSIS compiler armclang (Arm Compiler 6) header file - * @version V5.4.3 - * @date 27. May 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ - -#ifndef __CMSIS_ARMCLANG_H -#define __CMSIS_ARMCLANG_H - -#pragma clang system_header /* treat file as system include file */ - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE __inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline -#endif -#ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __attribute__((__noreturn__)) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START -#define __PROGRAM_START __main -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET"))) -#endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#ifndef __STACK_SEAL -#define __STACK_SEAL Image$$STACKSEAL$$ZI$$Base -#endif - -#ifndef __TZ_STACK_SEAL_SIZE -#define __TZ_STACK_SEAL_SIZE 8U -#endif - -#ifndef __TZ_STACK_SEAL_VALUE -#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL -#endif - - -__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { - *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; -} -#endif - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_RW_REG(r) "+l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_RW_REG(r) "+r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __builtin_arm_nop - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI __builtin_arm_wfi - - -/** - \brief Wait For Event - \details 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. - */ -#define __WFE __builtin_arm_wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __builtin_arm_sev - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -#define __ISB() __builtin_arm_isb(0xF) - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __builtin_arm_dsb(0xF) - - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __builtin_arm_dmb(0xF) - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV(value) __builtin_bswap32(value) - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV16(value) __ROR(__REV(value), 16) - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REVSH(value) (int16_t)__builtin_bswap16(value) - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - op2 %= 32U; - if (op2 == 0U) - { - return op1; - } - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __ASM volatile ("bkpt "#value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -#define __RBIT __builtin_arm_rbit - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) -{ - /* Even though __builtin_clz produces a CLZ instruction on ARM, formally - __builtin_clz(0) is undefined behaviour, so handle this case specially. - This guarantees ARM-compatible results if happening to compile on a non-ARM - target, and ensures the compiler doesn't decide to activate any - optimisations using the logic "value was passed to __builtin_clz, so it - is non-zero". - ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a - single CLZ instruction. - */ - if (value == 0U) - { - return 32U; - } - return __builtin_clz(value); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDREXB (uint8_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDREXH (uint16_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDREXW (uint32_t)__builtin_arm_ldrex - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXB (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXH (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXW (uint32_t)__builtin_arm_strex - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __builtin_arm_clrex - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __builtin_arm_ssat - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __builtin_arm_usat - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); -} - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) -{ - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; -} - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) -{ - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief Load-Acquire (8 bit) - \details Executes a LDAB instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire (16 bit) - \details Executes a LDAH instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire (32 bit) - \details Executes a LDA instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return(result); -} - - -/** - \brief Store-Release (8 bit) - \details Executes a STLB instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (16 bit) - \details Executes a STLH instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (32 bit) - \details Executes a STL instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Load-Acquire Exclusive (8 bit) - \details Executes a LDAB exclusive instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDAEXB (uint8_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (16 bit) - \details Executes a LDAH exclusive instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDAEXH (uint16_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (32 bit) - \details Executes a LDA exclusive instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDAEX (uint32_t)__builtin_arm_ldaex - - -/** - \brief Store-Release Exclusive (8 bit) - \details Executes a STLB exclusive instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXB (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (16 bit) - \details Executes a STLH exclusive instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXH (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (32 bit) - \details Executes a STL exclusive instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEX (uint32_t)__builtin_arm_stlex - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -#ifndef __ARM_COMPAT_H -__STATIC_FORCEINLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i" : : : "memory"); -} -#endif - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -#ifndef __ARM_COMPAT_H -__STATIC_FORCEINLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i" : : : "memory"); -} -#endif - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Control Register (non-secure) - \details Returns the content of the non-secure Control Register when in secure mode. - \return non-secure Control Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); - __ISB(); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Control Register (non-secure) - \details Writes the given value to the non-secure Control Register when in secure state. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); - __ISB(); -} -#endif - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); -} -#endif - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); -} -#endif - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Stack Pointer (non-secure) - \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. - \return SP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. - \param [in] topOfStack Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) -{ - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); -} -#endif - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Priority Mask (non-secure) - \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Priority Mask (non-secure) - \details Assigns the given value to the non-secure Priority Mask Register when in secure state. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) -{ - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); -} -#endif - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f" : : : "memory"); -} - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f" : : : "memory"); -} - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Base Priority (non-secure) - \details Returns the current value of the non-secure Base Priority register when in secure state. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Base Priority (non-secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); -} -#endif - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Fault Mask (non-secure) - \details Returns the current value of the non-secure Fault Mask register when in secure state. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Fault Mask (non-secure) - \details Assigns the given value to the non-secure Fault Mask register when in secure state. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); -} -#endif - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief Get Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return result; -#endif -} - -#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); -#endif -} -#endif - - -/** - \brief Get Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - return result; -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). - \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. - \param [in] MainStackPtrLimit Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); -#endif -} -#endif - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr -#else -#define __get_FPSCR() ((uint32_t)0U) -#endif - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __set_FPSCR __builtin_arm_set_fpscr -#else -#define __set_FPSCR(x) ((void)(x)) -#endif - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - -#define __SADD8 __builtin_arm_sadd8 -#define __QADD8 __builtin_arm_qadd8 -#define __SHADD8 __builtin_arm_shadd8 -#define __UADD8 __builtin_arm_uadd8 -#define __UQADD8 __builtin_arm_uqadd8 -#define __UHADD8 __builtin_arm_uhadd8 -#define __SSUB8 __builtin_arm_ssub8 -#define __QSUB8 __builtin_arm_qsub8 -#define __SHSUB8 __builtin_arm_shsub8 -#define __USUB8 __builtin_arm_usub8 -#define __UQSUB8 __builtin_arm_uqsub8 -#define __UHSUB8 __builtin_arm_uhsub8 -#define __SADD16 __builtin_arm_sadd16 -#define __QADD16 __builtin_arm_qadd16 -#define __SHADD16 __builtin_arm_shadd16 -#define __UADD16 __builtin_arm_uadd16 -#define __UQADD16 __builtin_arm_uqadd16 -#define __UHADD16 __builtin_arm_uhadd16 -#define __SSUB16 __builtin_arm_ssub16 -#define __QSUB16 __builtin_arm_qsub16 -#define __SHSUB16 __builtin_arm_shsub16 -#define __USUB16 __builtin_arm_usub16 -#define __UQSUB16 __builtin_arm_uqsub16 -#define __UHSUB16 __builtin_arm_uhsub16 -#define __SASX __builtin_arm_sasx -#define __QASX __builtin_arm_qasx -#define __SHASX __builtin_arm_shasx -#define __UASX __builtin_arm_uasx -#define __UQASX __builtin_arm_uqasx -#define __UHASX __builtin_arm_uhasx -#define __SSAX __builtin_arm_ssax -#define __QSAX __builtin_arm_qsax -#define __SHSAX __builtin_arm_shsax -#define __USAX __builtin_arm_usax -#define __UQSAX __builtin_arm_uqsax -#define __UHSAX __builtin_arm_uhsax -#define __USAD8 __builtin_arm_usad8 -#define __USADA8 __builtin_arm_usada8 -#define __SSAT16 __builtin_arm_ssat16 -#define __USAT16 __builtin_arm_usat16 -#define __UXTB16 __builtin_arm_uxtb16 -#define __UXTAB16 __builtin_arm_uxtab16 -#define __SXTB16 __builtin_arm_sxtb16 -#define __SXTAB16 __builtin_arm_sxtab16 -#define __SMUAD __builtin_arm_smuad -#define __SMUADX __builtin_arm_smuadx -#define __SMLAD __builtin_arm_smlad -#define __SMLADX __builtin_arm_smladx -#define __SMLALD __builtin_arm_smlald -#define __SMLALDX __builtin_arm_smlaldx -#define __SMUSD __builtin_arm_smusd -#define __SMUSDX __builtin_arm_smusdx -#define __SMLSD __builtin_arm_smlsd -#define __SMLSDX __builtin_arm_smlsdx -#define __SMLSLD __builtin_arm_smlsld -#define __SMLSLDX __builtin_arm_smlsldx -#define __SEL __builtin_arm_sel -#define __QADD __builtin_arm_qadd -#define __QSUB __builtin_arm_qsub - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) - -#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) - -__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__ARM_FEATURE_DSP == 1) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCLANG_H */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_armclang_ltm.h b/software/Power_Pico/Drivers/CMSIS/Include/cmsis_armclang_ltm.h deleted file mode 100644 index 1e255d5..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_armclang_ltm.h +++ /dev/null @@ -1,1928 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armclang_ltm.h - * @brief CMSIS compiler armclang (Arm Compiler 6) header file - * @version V1.5.3 - * @date 27. May 2021 - ******************************************************************************/ -/* - * Copyright (c) 2018-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ - -#ifndef __CMSIS_ARMCLANG_H -#define __CMSIS_ARMCLANG_H - -#pragma clang system_header /* treat file as system include file */ - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE __inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline -#endif -#ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __attribute__((__noreturn__)) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START -#define __PROGRAM_START __main -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET"))) -#endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#ifndef __STACK_SEAL -#define __STACK_SEAL Image$$STACKSEAL$$ZI$$Base -#endif - -#ifndef __TZ_STACK_SEAL_SIZE -#define __TZ_STACK_SEAL_SIZE 8U -#endif - -#ifndef __TZ_STACK_SEAL_VALUE -#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL -#endif - - -__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { - *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; -} -#endif - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __builtin_arm_nop - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI __builtin_arm_wfi - - -/** - \brief Wait For Event - \details 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. - */ -#define __WFE __builtin_arm_wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __builtin_arm_sev - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -#define __ISB() __builtin_arm_isb(0xF) - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __builtin_arm_dsb(0xF) - - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __builtin_arm_dmb(0xF) - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV(value) __builtin_bswap32(value) - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV16(value) __ROR(__REV(value), 16) - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REVSH(value) (int16_t)__builtin_bswap16(value) - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - op2 %= 32U; - if (op2 == 0U) - { - return op1; - } - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __ASM volatile ("bkpt "#value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -#define __RBIT __builtin_arm_rbit - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) -{ - /* Even though __builtin_clz produces a CLZ instruction on ARM, formally - __builtin_clz(0) is undefined behaviour, so handle this case specially. - This guarantees ARM-compatible results if happening to compile on a non-ARM - target, and ensures the compiler doesn't decide to activate any - optimisations using the logic "value was passed to __builtin_clz, so it - is non-zero". - ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a - single CLZ instruction. - */ - if (value == 0U) - { - return 32U; - } - return __builtin_clz(value); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDREXB (uint8_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDREXH (uint16_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDREXW (uint32_t)__builtin_arm_ldrex - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXB (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXH (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXW (uint32_t)__builtin_arm_strex - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __builtin_arm_clrex - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __builtin_arm_ssat - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __builtin_arm_usat - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); -} - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) -{ - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; -} - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) -{ - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief Load-Acquire (8 bit) - \details Executes a LDAB instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire (16 bit) - \details Executes a LDAH instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire (32 bit) - \details Executes a LDA instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return(result); -} - - -/** - \brief Store-Release (8 bit) - \details Executes a STLB instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (16 bit) - \details Executes a STLH instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (32 bit) - \details Executes a STL instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Load-Acquire Exclusive (8 bit) - \details Executes a LDAB exclusive instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDAEXB (uint8_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (16 bit) - \details Executes a LDAH exclusive instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDAEXH (uint16_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (32 bit) - \details Executes a LDA exclusive instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDAEX (uint32_t)__builtin_arm_ldaex - - -/** - \brief Store-Release Exclusive (8 bit) - \details Executes a STLB exclusive instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXB (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (16 bit) - \details Executes a STLH exclusive instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXH (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (32 bit) - \details Executes a STL exclusive instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEX (uint32_t)__builtin_arm_stlex - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -#ifndef __ARM_COMPAT_H -__STATIC_FORCEINLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i" : : : "memory"); -} -#endif - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -#ifndef __ARM_COMPAT_H -__STATIC_FORCEINLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i" : : : "memory"); -} -#endif - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Control Register (non-secure) - \details Returns the content of the non-secure Control Register when in secure mode. - \return non-secure Control Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); - __ISB(); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Control Register (non-secure) - \details Writes the given value to the non-secure Control Register when in secure state. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); - __ISB(); -} -#endif - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); -} -#endif - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); -} -#endif - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Stack Pointer (non-secure) - \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. - \return SP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. - \param [in] topOfStack Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) -{ - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); -} -#endif - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Priority Mask (non-secure) - \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Priority Mask (non-secure) - \details Assigns the given value to the non-secure Priority Mask Register when in secure state. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) -{ - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); -} -#endif - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f" : : : "memory"); -} - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f" : : : "memory"); -} - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Base Priority (non-secure) - \details Returns the current value of the non-secure Base Priority register when in secure state. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Base Priority (non-secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); -} -#endif - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Fault Mask (non-secure) - \details Returns the current value of the non-secure Fault Mask register when in secure state. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Fault Mask (non-secure) - \details Assigns the given value to the non-secure Fault Mask register when in secure state. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); -} -#endif - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) - -/** - \brief Get Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return result; -#endif -} - -#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); -#endif -} -#endif - - -/** - \brief Get Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - return result; -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). - \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. - \param [in] MainStackPtrLimit Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); -#endif -} -#endif - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr -#else -#define __get_FPSCR() ((uint32_t)0U) -#endif - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __set_FPSCR __builtin_arm_set_fpscr -#else -#define __set_FPSCR(x) ((void)(x)) -#endif - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - -__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SSAT16(ARG1,ARG2) \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -#define __USAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) - -#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) - -__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__ARM_FEATURE_DSP == 1) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCLANG_H */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_compiler.h b/software/Power_Pico/Drivers/CMSIS/Include/cmsis_compiler.h deleted file mode 100644 index adbf296..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_compiler.h +++ /dev/null @@ -1,283 +0,0 @@ -/**************************************************************************//** - * @file cmsis_compiler.h - * @brief CMSIS compiler generic header file - * @version V5.1.0 - * @date 09. October 2018 - ******************************************************************************/ -/* - * Copyright (c) 2009-2018 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __CMSIS_COMPILER_H -#define __CMSIS_COMPILER_H - -#include - -/* - * Arm Compiler 4/5 - */ -#if defined ( __CC_ARM ) - #include "cmsis_armcc.h" - - -/* - * Arm Compiler 6.6 LTM (armclang) - */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) - #include "cmsis_armclang_ltm.h" - - /* - * Arm Compiler above 6.10.1 (armclang) - */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) - #include "cmsis_armclang.h" - - -/* - * GNU Compiler - */ -#elif defined ( __GNUC__ ) - #include "cmsis_gcc.h" - - -/* - * IAR Compiler - */ -#elif defined ( __ICCARM__ ) - #include - - -/* - * TI Arm Compiler - */ -#elif defined ( __TI_ARM__ ) - #include - - #ifndef __ASM - #define __ASM __asm - #endif - #ifndef __INLINE - #define __INLINE inline - #endif - #ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline - #endif - #ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __STATIC_INLINE - #endif - #ifndef __NO_RETURN - #define __NO_RETURN __attribute__((noreturn)) - #endif - #ifndef __USED - #define __USED __attribute__((used)) - #endif - #ifndef __WEAK - #define __WEAK __attribute__((weak)) - #endif - #ifndef __PACKED - #define __PACKED __attribute__((packed)) - #endif - #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed)) - #endif - #ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed)) - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) - #endif - #ifndef __RESTRICT - #define __RESTRICT __restrict - #endif - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif - - -/* - * TASKING Compiler - */ -#elif defined ( __TASKING__ ) - /* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all intrinsics, - * Including the CMSIS ones. - */ - - #ifndef __ASM - #define __ASM __asm - #endif - #ifndef __INLINE - #define __INLINE inline - #endif - #ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline - #endif - #ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __STATIC_INLINE - #endif - #ifndef __NO_RETURN - #define __NO_RETURN __attribute__((noreturn)) - #endif - #ifndef __USED - #define __USED __attribute__((used)) - #endif - #ifndef __WEAK - #define __WEAK __attribute__((weak)) - #endif - #ifndef __PACKED - #define __PACKED __packed__ - #endif - #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __packed__ - #endif - #ifndef __PACKED_UNION - #define __PACKED_UNION union __packed__ - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - struct __packed__ T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED - #define __ALIGNED(x) __align(x) - #endif - #ifndef __RESTRICT - #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. - #define __RESTRICT - #endif - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif - - -/* - * COSMIC Compiler - */ -#elif defined ( __CSMC__ ) - #include - - #ifndef __ASM - #define __ASM _asm - #endif - #ifndef __INLINE - #define __INLINE inline - #endif - #ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline - #endif - #ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __STATIC_INLINE - #endif - #ifndef __NO_RETURN - // NO RETURN is automatically detected hence no warning here - #define __NO_RETURN - #endif - #ifndef __USED - #warning No compiler specific solution for __USED. __USED is ignored. - #define __USED - #endif - #ifndef __WEAK - #define __WEAK __weak - #endif - #ifndef __PACKED - #define __PACKED @packed - #endif - #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT @packed struct - #endif - #ifndef __PACKED_UNION - #define __PACKED_UNION @packed union - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - @packed struct T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED - #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. - #define __ALIGNED(x) - #endif - #ifndef __RESTRICT - #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. - #define __RESTRICT - #endif - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif - - -#else - #error Unknown compiler. -#endif - - -#endif /* __CMSIS_COMPILER_H */ - diff --git a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_gcc.h b/software/Power_Pico/Drivers/CMSIS/Include/cmsis_gcc.h deleted file mode 100644 index 67bda4e..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_gcc.h +++ /dev/null @@ -1,2211 +0,0 @@ -/**************************************************************************//** - * @file cmsis_gcc.h - * @brief CMSIS compiler GCC header file - * @version V5.4.1 - * @date 27. May 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __CMSIS_GCC_H -#define __CMSIS_GCC_H - -/* ignore some GCC warnings */ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wsign-conversion" -#pragma GCC diagnostic ignored "-Wconversion" -#pragma GCC diagnostic ignored "-Wunused-parameter" - -/* Fallback for __has_builtin */ -#ifndef __has_builtin - #define __has_builtin(x) (0) -#endif - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline -#endif -#ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __attribute__((__noreturn__)) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START - -/** - \brief Initializes data and bss sections - \details This default implementations initialized all data and additional bss - sections relying on .copy.table and .zero.table specified properly - in the used linker script. - - */ -__STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void) -{ - extern void _start(void) __NO_RETURN; - - typedef struct { - uint32_t const* src; - uint32_t* dest; - uint32_t wlen; - } __copy_table_t; - - typedef struct { - uint32_t* dest; - uint32_t wlen; - } __zero_table_t; - - extern const __copy_table_t __copy_table_start__; - extern const __copy_table_t __copy_table_end__; - extern const __zero_table_t __zero_table_start__; - extern const __zero_table_t __zero_table_end__; - - for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) { - for(uint32_t i=0u; iwlen; ++i) { - pTable->dest[i] = pTable->src[i]; - } - } - - for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) { - for(uint32_t i=0u; iwlen; ++i) { - pTable->dest[i] = 0u; - } - } - - _start(); -} - -#define __PROGRAM_START __cmsis_start -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP __StackTop -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT __StackLimit -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section(".vectors"))) -#endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#ifndef __STACK_SEAL -#define __STACK_SEAL __StackSeal -#endif - -#ifndef __TZ_STACK_SEAL_SIZE -#define __TZ_STACK_SEAL_SIZE 8U -#endif - -#ifndef __TZ_STACK_SEAL_VALUE -#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL -#endif - - -__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { - *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; -} -#endif - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_RW_REG(r) "+l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_RW_REG(r) "+r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP() __ASM volatile ("nop") - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI() __ASM volatile ("wfi":::"memory") - - -/** - \brief Wait For Event - \details 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. - */ -#define __WFE() __ASM volatile ("wfe":::"memory") - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV() __ASM volatile ("sev") - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -__STATIC_FORCEINLINE void __ISB(void) -{ - __ASM volatile ("isb 0xF":::"memory"); -} - - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -__STATIC_FORCEINLINE void __DSB(void) -{ - __ASM volatile ("dsb 0xF":::"memory"); -} - - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -__STATIC_FORCEINLINE void __DMB(void) -{ - __ASM volatile ("dmb 0xF":::"memory"); -} - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. - \param [in] value Value to reverse - \return Reversed value - */ -__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) -{ -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) - return __builtin_bswap32(value); -#else - uint32_t result; - - __ASM ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return result; -#endif -} - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. - \param [in] value Value to reverse - \return Reversed value - */ -__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) -{ - uint32_t result; - - __ASM ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return result; -} - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. - \param [in] value Value to reverse - \return Reversed value - */ -__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) -{ -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - return (int16_t)__builtin_bswap16(value); -#else - int16_t result; - - __ASM ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return result; -#endif -} - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - op2 %= 32U; - if (op2 == 0U) - { - return op1; - } - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __ASM volatile ("bkpt "#value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) - __ASM ("rbit %0, %1" : "=r" (result) : "r" (value) ); -#else - uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ - - result = value; /* r will be reversed bits of v; first get LSB of v */ - for (value >>= 1U; value != 0U; value >>= 1U) - { - result <<= 1U; - result |= value & 1U; - s--; - } - result <<= s; /* shift when v's highest bits are zero */ -#endif - return result; -} - - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) -{ - /* Even though __builtin_clz produces a CLZ instruction on ARM, formally - __builtin_clz(0) is undefined behaviour, so handle this case specially. - This guarantees ARM-compatible results if happening to compile on a non-ARM - target, and ensures the compiler doesn't decide to activate any - optimisations using the logic "value was passed to __builtin_clz, so it - is non-zero". - ARM GCC 7.3 and possibly earlier will optimise this test away, leaving a - single CLZ instruction. - */ - if (value == 0U) - { - return 32U; - } - return __builtin_clz(value); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); - return(result); -} - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); - return(result); -} - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); - return(result); -} - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); - return(result); -} - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -__STATIC_FORCEINLINE void __CLREX(void) -{ - __ASM volatile ("clrex" ::: "memory"); -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] ARG1 Value to be saturated - \param [in] ARG2 Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT(ARG1, ARG2) \ -__extension__ \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM volatile ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ - __RES; \ - }) - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] ARG1 Value to be saturated - \param [in] ARG2 Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT(ARG1, ARG2) \ -__extension__ \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM volatile ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ - __RES; \ - }) - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); -#endif - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); -#endif - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); -} - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) -{ - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; -} - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) -{ - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief Load-Acquire (8 bit) - \details Executes a LDAB instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire (16 bit) - \details Executes a LDAH instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire (32 bit) - \details Executes a LDA instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return(result); -} - - -/** - \brief Store-Release (8 bit) - \details Executes a STLB instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (16 bit) - \details Executes a STLH instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (32 bit) - \details Executes a STL instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Load-Acquire Exclusive (8 bit) - \details Executes a LDAB exclusive instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire Exclusive (16 bit) - \details Executes a LDAH exclusive instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire Exclusive (32 bit) - \details Executes a LDA exclusive instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return(result); -} - - -/** - \brief Store-Release Exclusive (8 bit) - \details Executes a STLB exclusive instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); - return(result); -} - - -/** - \brief Store-Release Exclusive (16 bit) - \details Executes a STLH exclusive instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); - return(result); -} - - -/** - \brief Store-Release Exclusive (32 bit) - \details Executes a STL exclusive instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); - return(result); -} - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i" : : : "memory"); -} - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i" : : : "memory"); -} - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Control Register (non-secure) - \details Returns the content of the non-secure Control Register when in secure mode. - \return non-secure Control Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); - __ISB(); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Control Register (non-secure) - \details Writes the given value to the non-secure Control Register when in secure state. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); - __ISB(); -} -#endif - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); -} -#endif - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); -} -#endif - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Stack Pointer (non-secure) - \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. - \return SP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. - \param [in] topOfStack Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) -{ - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); -} -#endif - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Priority Mask (non-secure) - \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Priority Mask (non-secure) - \details Assigns the given value to the non-secure Priority Mask Register when in secure state. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) -{ - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); -} -#endif - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f" : : : "memory"); -} - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f" : : : "memory"); -} - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Base Priority (non-secure) - \details Returns the current value of the non-secure Base Priority register when in secure state. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Base Priority (non-secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); -} -#endif - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Fault Mask (non-secure) - \details Returns the current value of the non-secure Fault Mask register when in secure state. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Fault Mask (non-secure) - \details Assigns the given value to the non-secure Fault Mask register when in secure state. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); -} -#endif - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) - -/** - \brief Get Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return result; -#endif -} - -#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); -#endif -} -#endif - - -/** - \brief Get Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - return result; -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). - \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. - \param [in] MainStackPtrLimit Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); -#endif -} -#endif - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#if __has_builtin(__builtin_arm_get_fpscr) -// Re-enable using built-in when GCC has been fixed -// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) - /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ - return __builtin_arm_get_fpscr(); -#else - uint32_t result; - - __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); - return(result); -#endif -#else - return(0U); -#endif -} - - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#if __has_builtin(__builtin_arm_set_fpscr) -// Re-enable using built-in when GCC has been fixed -// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) - /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ - __builtin_arm_set_fpscr(fpscr); -#else - __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); -#endif -#else - (void)fpscr; -#endif -} - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - -__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SSAT16(ARG1, ARG2) \ -__extension__ \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM volatile ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ - __RES; \ - }) - -#define __USAT16(ARG1, ARG2) \ -__extension__ \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM volatile ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ - __RES; \ - }) - -__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTB16_RORn(uint32_t op1, uint32_t rotate) -{ - uint32_t result; - if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) { - __ASM volatile ("sxtb16 %0, %1, ROR %2" : "=r" (result) : "r" (op1), "i" (rotate) ); - } else { - result = __SXTB16(__ROR(op1, rotate)) ; - } - return result; -} - -__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTAB16_RORn(uint32_t op1, uint32_t op2, uint32_t rotate) -{ - uint32_t result; - if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) { - __ASM volatile ("sxtab16 %0, %1, %2, ROR %3" : "=r" (result) : "r" (op1) , "r" (op2) , "i" (rotate)); - } else { - result = __SXTAB16(op1, __ROR(op2, rotate)); - } - return result; -} - - -__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -#define __PKHBT(ARG1,ARG2,ARG3) \ -__extension__ \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -#define __PKHTB(ARG1,ARG2,ARG3) \ -__extension__ \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - if (ARG3 == 0) \ - __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ - else \ - __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - - -__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__ARM_FEATURE_DSP == 1) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#pragma GCC diagnostic pop - -#endif /* __CMSIS_GCC_H */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_iccarm.h b/software/Power_Pico/Drivers/CMSIS/Include/cmsis_iccarm.h deleted file mode 100644 index 65b824b..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_iccarm.h +++ /dev/null @@ -1,1002 +0,0 @@ -/**************************************************************************//** - * @file cmsis_iccarm.h - * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file - * @version V5.3.0 - * @date 14. April 2021 - ******************************************************************************/ - -//------------------------------------------------------------------------------ -// -// Copyright (c) 2017-2021 IAR Systems -// Copyright (c) 2017-2021 Arm Limited. All rights reserved. -// -// SPDX-License-Identifier: Apache-2.0 -// -// Licensed under the Apache License, Version 2.0 (the "License") -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//------------------------------------------------------------------------------ - - -#ifndef __CMSIS_ICCARM_H__ -#define __CMSIS_ICCARM_H__ - -#ifndef __ICCARM__ - #error This file should only be compiled by ICCARM -#endif - -#pragma system_include - -#define __IAR_FT _Pragma("inline=forced") __intrinsic - -#if (__VER__ >= 8000000) - #define __ICCARM_V8 1 -#else - #define __ICCARM_V8 0 -#endif - -#ifndef __ALIGNED - #if __ICCARM_V8 - #define __ALIGNED(x) __attribute__((aligned(x))) - #elif (__VER__ >= 7080000) - /* Needs IAR language extensions */ - #define __ALIGNED(x) __attribute__((aligned(x))) - #else - #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. - #define __ALIGNED(x) - #endif -#endif - - -/* Define compiler macros for CPU architecture, used in CMSIS 5. - */ -#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ -/* Macros already defined */ -#else - #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) - #define __ARM_ARCH_8M_MAIN__ 1 - #elif defined(__ARM8M_BASELINE__) - #define __ARM_ARCH_8M_BASE__ 1 - #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' - #if __ARM_ARCH == 6 - #define __ARM_ARCH_6M__ 1 - #elif __ARM_ARCH == 7 - #if __ARM_FEATURE_DSP - #define __ARM_ARCH_7EM__ 1 - #else - #define __ARM_ARCH_7M__ 1 - #endif - #endif /* __ARM_ARCH */ - #endif /* __ARM_ARCH_PROFILE == 'M' */ -#endif - -/* Alternativ core deduction for older ICCARM's */ -#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ - !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) - #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) - #define __ARM_ARCH_6M__ 1 - #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) - #define __ARM_ARCH_7M__ 1 - #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) - #define __ARM_ARCH_7EM__ 1 - #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) - #define __ARM_ARCH_8M_BASE__ 1 - #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) - #define __ARM_ARCH_8M_MAIN__ 1 - #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) - #define __ARM_ARCH_8M_MAIN__ 1 - #else - #error "Unknown target." - #endif -#endif - - - -#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 - #define __IAR_M0_FAMILY 1 -#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 - #define __IAR_M0_FAMILY 1 -#else - #define __IAR_M0_FAMILY 0 -#endif - - -#ifndef __ASM - #define __ASM __asm -#endif - -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") -#endif - -#ifndef __INLINE - #define __INLINE inline -#endif - -#ifndef __NO_RETURN - #if __ICCARM_V8 - #define __NO_RETURN __attribute__((__noreturn__)) - #else - #define __NO_RETURN _Pragma("object_attribute=__noreturn") - #endif -#endif - -#ifndef __PACKED - #if __ICCARM_V8 - #define __PACKED __attribute__((packed, aligned(1))) - #else - /* Needs IAR language extensions */ - #define __PACKED __packed - #endif -#endif - -#ifndef __PACKED_STRUCT - #if __ICCARM_V8 - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) - #else - /* Needs IAR language extensions */ - #define __PACKED_STRUCT __packed struct - #endif -#endif - -#ifndef __PACKED_UNION - #if __ICCARM_V8 - #define __PACKED_UNION union __attribute__((packed, aligned(1))) - #else - /* Needs IAR language extensions */ - #define __PACKED_UNION __packed union - #endif -#endif - -#ifndef __RESTRICT - #if __ICCARM_V8 - #define __RESTRICT __restrict - #else - /* Needs IAR language extensions */ - #define __RESTRICT restrict - #endif -#endif - -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline -#endif - -#ifndef __FORCEINLINE - #define __FORCEINLINE _Pragma("inline=forced") -#endif - -#ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE -#endif - -#ifndef __UNALIGNED_UINT16_READ -#pragma language=save -#pragma language=extended -__IAR_FT uint16_t __iar_uint16_read(void const *ptr) -{ - return *(__packed uint16_t*)(ptr); -} -#pragma language=restore -#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) -#endif - - -#ifndef __UNALIGNED_UINT16_WRITE -#pragma language=save -#pragma language=extended -__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) -{ - *(__packed uint16_t*)(ptr) = val;; -} -#pragma language=restore -#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) -#endif - -#ifndef __UNALIGNED_UINT32_READ -#pragma language=save -#pragma language=extended -__IAR_FT uint32_t __iar_uint32_read(void const *ptr) -{ - return *(__packed uint32_t*)(ptr); -} -#pragma language=restore -#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) -#endif - -#ifndef __UNALIGNED_UINT32_WRITE -#pragma language=save -#pragma language=extended -__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) -{ - *(__packed uint32_t*)(ptr) = val;; -} -#pragma language=restore -#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) -#endif - -#ifndef __UNALIGNED_UINT32 /* deprecated */ -#pragma language=save -#pragma language=extended -__packed struct __iar_u32 { uint32_t v; }; -#pragma language=restore -#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) -#endif - -#ifndef __USED - #if __ICCARM_V8 - #define __USED __attribute__((used)) - #else - #define __USED _Pragma("__root") - #endif -#endif - -#undef __WEAK /* undo the definition from DLib_Defaults.h */ -#ifndef __WEAK - #if __ICCARM_V8 - #define __WEAK __attribute__((weak)) - #else - #define __WEAK _Pragma("__weak") - #endif -#endif - -#ifndef __PROGRAM_START -#define __PROGRAM_START __iar_program_start -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP CSTACK$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT CSTACK$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __vector_table -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE @".intvec" -#endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#ifndef __STACK_SEAL -#define __STACK_SEAL STACKSEAL$$Base -#endif - -#ifndef __TZ_STACK_SEAL_SIZE -#define __TZ_STACK_SEAL_SIZE 8U -#endif - -#ifndef __TZ_STACK_SEAL_VALUE -#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL -#endif - -__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { - *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; -} -#endif - -#ifndef __ICCARM_INTRINSICS_VERSION__ - #define __ICCARM_INTRINSICS_VERSION__ 0 -#endif - -#if __ICCARM_INTRINSICS_VERSION__ == 2 - - #if defined(__CLZ) - #undef __CLZ - #endif - #if defined(__REVSH) - #undef __REVSH - #endif - #if defined(__RBIT) - #undef __RBIT - #endif - #if defined(__SSAT) - #undef __SSAT - #endif - #if defined(__USAT) - #undef __USAT - #endif - - #include "iccarm_builtin.h" - - #define __disable_fault_irq __iar_builtin_disable_fiq - #define __disable_irq __iar_builtin_disable_interrupt - #define __enable_fault_irq __iar_builtin_enable_fiq - #define __enable_irq __iar_builtin_enable_interrupt - #define __arm_rsr __iar_builtin_rsr - #define __arm_wsr __iar_builtin_wsr - - - #define __get_APSR() (__arm_rsr("APSR")) - #define __get_BASEPRI() (__arm_rsr("BASEPRI")) - #define __get_CONTROL() (__arm_rsr("CONTROL")) - #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) - - #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - #define __get_FPSCR() (__arm_rsr("FPSCR")) - #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) - #else - #define __get_FPSCR() ( 0 ) - #define __set_FPSCR(VALUE) ((void)VALUE) - #endif - - #define __get_IPSR() (__arm_rsr("IPSR")) - #define __get_MSP() (__arm_rsr("MSP")) - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - #define __get_MSPLIM() (0U) - #else - #define __get_MSPLIM() (__arm_rsr("MSPLIM")) - #endif - #define __get_PRIMASK() (__arm_rsr("PRIMASK")) - #define __get_PSP() (__arm_rsr("PSP")) - - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - #define __get_PSPLIM() (0U) - #else - #define __get_PSPLIM() (__arm_rsr("PSPLIM")) - #endif - - #define __get_xPSR() (__arm_rsr("xPSR")) - - #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) - #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) - -__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) -{ - __arm_wsr("CONTROL", control); - __iar_builtin_ISB(); -} - - #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) - #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) - - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - #define __set_MSPLIM(VALUE) ((void)(VALUE)) - #else - #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) - #endif - #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) - #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - #define __set_PSPLIM(VALUE) ((void)(VALUE)) - #else - #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) - #endif - - #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) - -__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __arm_wsr("CONTROL_NS", control); - __iar_builtin_ISB(); -} - - #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) - #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) - #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) - #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) - #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) - #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) - #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) - #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) - #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) - #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) - #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) - #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) - - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - #define __TZ_get_PSPLIM_NS() (0U) - #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) - #else - #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) - #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) - #endif - - #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) - #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) - - #define __NOP __iar_builtin_no_operation - - #define __CLZ __iar_builtin_CLZ - #define __CLREX __iar_builtin_CLREX - - #define __DMB __iar_builtin_DMB - #define __DSB __iar_builtin_DSB - #define __ISB __iar_builtin_ISB - - #define __LDREXB __iar_builtin_LDREXB - #define __LDREXH __iar_builtin_LDREXH - #define __LDREXW __iar_builtin_LDREX - - #define __RBIT __iar_builtin_RBIT - #define __REV __iar_builtin_REV - #define __REV16 __iar_builtin_REV16 - - __IAR_FT int16_t __REVSH(int16_t val) - { - return (int16_t) __iar_builtin_REVSH(val); - } - - #define __ROR __iar_builtin_ROR - #define __RRX __iar_builtin_RRX - - #define __SEV __iar_builtin_SEV - - #if !__IAR_M0_FAMILY - #define __SSAT __iar_builtin_SSAT - #endif - - #define __STREXB __iar_builtin_STREXB - #define __STREXH __iar_builtin_STREXH - #define __STREXW __iar_builtin_STREX - - #if !__IAR_M0_FAMILY - #define __USAT __iar_builtin_USAT - #endif - - #define __WFE __iar_builtin_WFE - #define __WFI __iar_builtin_WFI - - #if __ARM_MEDIA__ - #define __SADD8 __iar_builtin_SADD8 - #define __QADD8 __iar_builtin_QADD8 - #define __SHADD8 __iar_builtin_SHADD8 - #define __UADD8 __iar_builtin_UADD8 - #define __UQADD8 __iar_builtin_UQADD8 - #define __UHADD8 __iar_builtin_UHADD8 - #define __SSUB8 __iar_builtin_SSUB8 - #define __QSUB8 __iar_builtin_QSUB8 - #define __SHSUB8 __iar_builtin_SHSUB8 - #define __USUB8 __iar_builtin_USUB8 - #define __UQSUB8 __iar_builtin_UQSUB8 - #define __UHSUB8 __iar_builtin_UHSUB8 - #define __SADD16 __iar_builtin_SADD16 - #define __QADD16 __iar_builtin_QADD16 - #define __SHADD16 __iar_builtin_SHADD16 - #define __UADD16 __iar_builtin_UADD16 - #define __UQADD16 __iar_builtin_UQADD16 - #define __UHADD16 __iar_builtin_UHADD16 - #define __SSUB16 __iar_builtin_SSUB16 - #define __QSUB16 __iar_builtin_QSUB16 - #define __SHSUB16 __iar_builtin_SHSUB16 - #define __USUB16 __iar_builtin_USUB16 - #define __UQSUB16 __iar_builtin_UQSUB16 - #define __UHSUB16 __iar_builtin_UHSUB16 - #define __SASX __iar_builtin_SASX - #define __QASX __iar_builtin_QASX - #define __SHASX __iar_builtin_SHASX - #define __UASX __iar_builtin_UASX - #define __UQASX __iar_builtin_UQASX - #define __UHASX __iar_builtin_UHASX - #define __SSAX __iar_builtin_SSAX - #define __QSAX __iar_builtin_QSAX - #define __SHSAX __iar_builtin_SHSAX - #define __USAX __iar_builtin_USAX - #define __UQSAX __iar_builtin_UQSAX - #define __UHSAX __iar_builtin_UHSAX - #define __USAD8 __iar_builtin_USAD8 - #define __USADA8 __iar_builtin_USADA8 - #define __SSAT16 __iar_builtin_SSAT16 - #define __USAT16 __iar_builtin_USAT16 - #define __UXTB16 __iar_builtin_UXTB16 - #define __UXTAB16 __iar_builtin_UXTAB16 - #define __SXTB16 __iar_builtin_SXTB16 - #define __SXTAB16 __iar_builtin_SXTAB16 - #define __SMUAD __iar_builtin_SMUAD - #define __SMUADX __iar_builtin_SMUADX - #define __SMMLA __iar_builtin_SMMLA - #define __SMLAD __iar_builtin_SMLAD - #define __SMLADX __iar_builtin_SMLADX - #define __SMLALD __iar_builtin_SMLALD - #define __SMLALDX __iar_builtin_SMLALDX - #define __SMUSD __iar_builtin_SMUSD - #define __SMUSDX __iar_builtin_SMUSDX - #define __SMLSD __iar_builtin_SMLSD - #define __SMLSDX __iar_builtin_SMLSDX - #define __SMLSLD __iar_builtin_SMLSLD - #define __SMLSLDX __iar_builtin_SMLSLDX - #define __SEL __iar_builtin_SEL - #define __QADD __iar_builtin_QADD - #define __QSUB __iar_builtin_QSUB - #define __PKHBT __iar_builtin_PKHBT - #define __PKHTB __iar_builtin_PKHTB - #endif - -#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ - - #if __IAR_M0_FAMILY - /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ - #define __CLZ __cmsis_iar_clz_not_active - #define __SSAT __cmsis_iar_ssat_not_active - #define __USAT __cmsis_iar_usat_not_active - #define __RBIT __cmsis_iar_rbit_not_active - #define __get_APSR __cmsis_iar_get_APSR_not_active - #endif - - - #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) - #define __get_FPSCR __cmsis_iar_get_FPSR_not_active - #define __set_FPSCR __cmsis_iar_set_FPSR_not_active - #endif - - #ifdef __INTRINSICS_INCLUDED - #error intrinsics.h is already included previously! - #endif - - #include - - #if __IAR_M0_FAMILY - /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ - #undef __CLZ - #undef __SSAT - #undef __USAT - #undef __RBIT - #undef __get_APSR - - __STATIC_INLINE uint8_t __CLZ(uint32_t data) - { - if (data == 0U) { return 32U; } - - uint32_t count = 0U; - uint32_t mask = 0x80000000U; - - while ((data & mask) == 0U) - { - count += 1U; - mask = mask >> 1U; - } - return count; - } - - __STATIC_INLINE uint32_t __RBIT(uint32_t v) - { - uint8_t sc = 31U; - uint32_t r = v; - for (v >>= 1U; v; v >>= 1U) - { - r <<= 1U; - r |= v & 1U; - sc--; - } - return (r << sc); - } - - __STATIC_INLINE uint32_t __get_APSR(void) - { - uint32_t res; - __asm("MRS %0,APSR" : "=r" (res)); - return res; - } - - #endif - - #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) - #undef __get_FPSCR - #undef __set_FPSCR - #define __get_FPSCR() (0) - #define __set_FPSCR(VALUE) ((void)VALUE) - #endif - - #pragma diag_suppress=Pe940 - #pragma diag_suppress=Pe177 - - #define __enable_irq __enable_interrupt - #define __disable_irq __disable_interrupt - #define __NOP __no_operation - - #define __get_xPSR __get_PSR - - #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) - - __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) - { - return __LDREX((unsigned long *)ptr); - } - - __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) - { - return __STREX(value, (unsigned long *)ptr); - } - #endif - - - /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ - #if (__CORTEX_M >= 0x03) - - __IAR_FT uint32_t __RRX(uint32_t value) - { - uint32_t result; - __ASM volatile("RRX %0, %1" : "=r"(result) : "r" (value)); - return(result); - } - - __IAR_FT void __set_BASEPRI_MAX(uint32_t value) - { - __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); - } - - - #define __enable_fault_irq __enable_fiq - #define __disable_fault_irq __disable_fiq - - - #endif /* (__CORTEX_M >= 0x03) */ - - __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) - { - return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); - } - - #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) - - __IAR_FT uint32_t __get_MSPLIM(void) - { - uint32_t res; - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - res = 0U; - #else - __asm volatile("MRS %0,MSPLIM" : "=r" (res)); - #endif - return res; - } - - __IAR_FT void __set_MSPLIM(uint32_t value) - { - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)value; - #else - __asm volatile("MSR MSPLIM,%0" :: "r" (value)); - #endif - } - - __IAR_FT uint32_t __get_PSPLIM(void) - { - uint32_t res; - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - res = 0U; - #else - __asm volatile("MRS %0,PSPLIM" : "=r" (res)); - #endif - return res; - } - - __IAR_FT void __set_PSPLIM(uint32_t value) - { - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)value; - #else - __asm volatile("MSR PSPLIM,%0" :: "r" (value)); - #endif - } - - __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) - { - __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); - __iar_builtin_ISB(); - } - - __IAR_FT uint32_t __TZ_get_PSP_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,PSP_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_PSP_NS(uint32_t value) - { - __asm volatile("MSR PSP_NS,%0" :: "r" (value)); - } - - __IAR_FT uint32_t __TZ_get_MSP_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,MSP_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_MSP_NS(uint32_t value) - { - __asm volatile("MSR MSP_NS,%0" :: "r" (value)); - } - - __IAR_FT uint32_t __TZ_get_SP_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,SP_NS" : "=r" (res)); - return res; - } - __IAR_FT void __TZ_set_SP_NS(uint32_t value) - { - __asm volatile("MSR SP_NS,%0" :: "r" (value)); - } - - __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) - { - __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); - } - - __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) - { - __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); - } - - __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) - { - __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); - } - - __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) - { - uint32_t res; - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - res = 0U; - #else - __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); - #endif - return res; - } - - __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) - { - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)value; - #else - __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); - #endif - } - - __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) - { - __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); - } - - #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ - -#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ - -#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) - -#if __IAR_M0_FAMILY - __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) - { - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; - } - - __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) - { - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; - } -#endif - -#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ - - __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) - { - uint32_t res; - __ASM volatile ("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); - return ((uint8_t)res); - } - - __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) - { - uint32_t res; - __ASM volatile ("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); - return ((uint16_t)res); - } - - __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) - { - uint32_t res; - __ASM volatile ("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); - return res; - } - - __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) - { - __ASM volatile ("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); - } - - __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) - { - __ASM volatile ("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); - } - - __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) - { - __ASM volatile ("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); - } - -#endif /* (__CORTEX_M >= 0x03) */ - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) - - - __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) - { - uint32_t res; - __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); - return ((uint8_t)res); - } - - __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) - { - uint32_t res; - __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); - return ((uint16_t)res); - } - - __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) - { - uint32_t res; - __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); - return res; - } - - __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) - { - __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); - } - - __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) - { - __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); - } - - __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) - { - __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); - } - - __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) - { - uint32_t res; - __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); - return ((uint8_t)res); - } - - __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) - { - uint32_t res; - __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); - return ((uint16_t)res); - } - - __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) - { - uint32_t res; - __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); - return res; - } - - __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) - { - uint32_t res; - __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); - return res; - } - - __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) - { - uint32_t res; - __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); - return res; - } - - __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) - { - uint32_t res; - __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); - return res; - } - -#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ - -#undef __IAR_FT -#undef __IAR_M0_FAMILY -#undef __ICCARM_V8 - -#pragma diag_default=Pe940 -#pragma diag_default=Pe177 - -#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) - -#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) - -#endif /* __CMSIS_ICCARM_H__ */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_version.h b/software/Power_Pico/Drivers/CMSIS/Include/cmsis_version.h deleted file mode 100644 index 8b4765f..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/cmsis_version.h +++ /dev/null @@ -1,39 +0,0 @@ -/**************************************************************************//** - * @file cmsis_version.h - * @brief CMSIS Core(M) Version definitions - * @version V5.0.5 - * @date 02. February 2022 - ******************************************************************************/ -/* - * Copyright (c) 2009-2022 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CMSIS_VERSION_H -#define __CMSIS_VERSION_H - -/* CMSIS Version definitions */ -#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ -#define __CM_CMSIS_VERSION_SUB ( 6U) /*!< [15:0] CMSIS Core(M) sub version */ -#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ - __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ -#endif diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_armv81mml.h b/software/Power_Pico/Drivers/CMSIS/Include/core_armv81mml.h deleted file mode 100644 index 94128a1..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_armv81mml.h +++ /dev/null @@ -1,4228 +0,0 @@ -/**************************************************************************//** - * @file core_armv81mml.h - * @brief CMSIS Armv8.1-M Mainline Core Peripheral Access Layer Header File - * @version V1.4.2 - * @date 13. October 2021 - ******************************************************************************/ -/* - * Copyright (c) 2018-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_ARMV81MML_H_GENERIC -#define __CORE_ARMV81MML_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_ARMV81MML - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS ARMV81MML definitions */ -#define __ARMv81MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __ARMv81MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __ARMv81MML_CMSIS_VERSION ((__ARMv81MML_CMSIS_VERSION_MAIN << 16U) | \ - __ARMv81MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (81U) /*!< Cortex-M Core */ - -#if defined ( __CC_ARM ) - #error Legacy Arm Compiler does not support Armv8.1-M target architecture. -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV81MML_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_ARMV81MML_H_DEPENDANT -#define __CORE_ARMV81MML_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __ARMv81MML_REV - #define __ARMv81MML_REV 0x0000U - #warning "__ARMv81MML_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #if __FPU_PRESENT != 0U - #ifndef __FPU_DP - #define __FPU_DP 0U - #warning "__FPU_DP not defined in device header file; using default!" - #endif - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __PMU_PRESENT - #define __PMU_PRESENT 0U - #warning "__PMU_PRESENT not defined in device header file; using default!" - #endif - - #if __PMU_PRESENT != 0U - #ifndef __PMU_NUM_EVENTCNT - #define __PMU_NUM_EVENTCNT 2U - #warning "__PMU_NUM_EVENTCNT not defined in device header file; using default!" - #elif (__PMU_NUM_EVENTCNT > 31 || __PMU_NUM_EVENTCNT < 2) - #error "__PMU_NUM_EVENTCNT is out of range in device header file!" */ - #endif - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group ARMv81MML */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - __IOM uint32_t RFSR; /*!< Offset: 0x204 (R/W) RAS Fault Status Register */ - uint32_t RESERVED4[14U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_IESB_Pos 5U /*!< SCB AIRCR: Implicit ESB Enable Position */ -#define SCB_AIRCR_IESB_Msk (1UL << SCB_AIRCR_IESB_Pos) /*!< SCB AIRCR: Implicit ESB Enable Mask */ - -#define SCB_AIRCR_DIT_Pos 4U /*!< SCB AIRCR: Data Independent Timing Position */ -#define SCB_AIRCR_DIT_Msk (1UL << SCB_AIRCR_DIT_Pos) /*!< SCB AIRCR: Data Independent Timing Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_TRD_Pos 20U /*!< SCB CCR: TRD Position */ -#define SCB_CCR_TRD_Msk (1UL << SCB_CCR_TRD_Pos) /*!< SCB CCR: TRD Mask */ - -#define SCB_CCR_LOB_Pos 19U /*!< SCB CCR: LOB Position */ -#define SCB_CCR_LOB_Msk (1UL << SCB_CCR_LOB_Pos) /*!< SCB CCR: LOB Mask */ - -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_PMU_Pos 5U /*!< SCB DFSR: PMU Position */ -#define SCB_DFSR_PMU_Msk (1UL << SCB_DFSR_PMU_Pos) /*!< SCB DFSR: PMU Mask */ - -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CP7_Pos 7U /*!< SCB NSACR: CP7 Position */ -#define SCB_NSACR_CP7_Msk (1UL << SCB_NSACR_CP7_Pos) /*!< SCB NSACR: CP7 Mask */ - -#define SCB_NSACR_CP6_Pos 6U /*!< SCB NSACR: CP6 Position */ -#define SCB_NSACR_CP6_Msk (1UL << SCB_NSACR_CP6_Pos) /*!< SCB NSACR: CP6 Mask */ - -#define SCB_NSACR_CP5_Pos 5U /*!< SCB NSACR: CP5 Position */ -#define SCB_NSACR_CP5_Msk (1UL << SCB_NSACR_CP5_Pos) /*!< SCB NSACR: CP5 Mask */ - -#define SCB_NSACR_CP4_Pos 4U /*!< SCB NSACR: CP4 Position */ -#define SCB_NSACR_CP4_Msk (1UL << SCB_NSACR_CP4_Pos) /*!< SCB NSACR: CP4 Mask */ - -#define SCB_NSACR_CP3_Pos 3U /*!< SCB NSACR: CP3 Position */ -#define SCB_NSACR_CP3_Msk (1UL << SCB_NSACR_CP3_Pos) /*!< SCB NSACR: CP3 Mask */ - -#define SCB_NSACR_CP2_Pos 2U /*!< SCB NSACR: CP2 Position */ -#define SCB_NSACR_CP2_Msk (1UL << SCB_NSACR_CP2_Pos) /*!< SCB NSACR: CP2 Mask */ - -#define SCB_NSACR_CP1_Pos 1U /*!< SCB NSACR: CP1 Position */ -#define SCB_NSACR_CP1_Msk (1UL << SCB_NSACR_CP1_Pos) /*!< SCB NSACR: CP1 Mask */ - -#define SCB_NSACR_CP0_Pos 0U /*!< SCB NSACR: CP0 Position */ -#define SCB_NSACR_CP0_Msk (1UL /*<< SCB_NSACR_CP0_Pos*/) /*!< SCB NSACR: CP0 Mask */ - -/* SCB Debug Feature Register 0 Definitions */ -#define SCB_ID_DFR_UDE_Pos 28U /*!< SCB ID_DFR: UDE Position */ -#define SCB_ID_DFR_UDE_Msk (0xFUL << SCB_ID_DFR_UDE_Pos) /*!< SCB ID_DFR: UDE Mask */ - -#define SCB_ID_DFR_MProfDbg_Pos 20U /*!< SCB ID_DFR: MProfDbg Position */ -#define SCB_ID_DFR_MProfDbg_Msk (0xFUL << SCB_ID_DFR_MProfDbg_Pos) /*!< SCB ID_DFR: MProfDbg Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB RAS Fault Status Register Definitions */ -#define SCB_RFSR_V_Pos 31U /*!< SCB RFSR: V Position */ -#define SCB_RFSR_V_Msk (1UL << SCB_RFSR_V_Pos) /*!< SCB RFSR: V Mask */ - -#define SCB_RFSR_IS_Pos 16U /*!< SCB RFSR: IS Position */ -#define SCB_RFSR_IS_Msk (0x7FFFUL << SCB_RFSR_IS_Pos) /*!< SCB RFSR: IS Mask */ - -#define SCB_RFSR_UET_Pos 0U /*!< SCB RFSR: UET Position */ -#define SCB_RFSR_UET_Msk (3UL /*<< SCB_RFSR_UET_Pos*/) /*!< SCB RFSR: UET Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[3U]; - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) ITM Device Type Register */ - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFmt_Pos 0U /*!< TPI FFCR: EnFmt Position */ -#define TPI_FFCR_EnFmt_Msk (0x3UL << /*TPI_FFCR_EnFmt_Pos*/) /*!< TPI FFCR: EnFmt Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_PMU Performance Monitoring Unit (PMU) - \brief Type definitions for the Performance Monitoring Unit (PMU) - @{ - */ - -/** - \brief Structure type to access the Performance Monitoring Unit (PMU). - */ -typedef struct -{ - __IOM uint32_t EVCNTR[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x0 (R/W) PMU Event Counter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED0[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCNTR; /*!< Offset: 0x7C (R/W) PMU Cycle Counter Register */ - uint32_t RESERVED1[224]; - __IOM uint32_t EVTYPER[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x400 (R/W) PMU Event Type and Filter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED2[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCFILTR; /*!< Offset: 0x47C (R/W) PMU Cycle Counter Filter Register */ - uint32_t RESERVED3[480]; - __IOM uint32_t CNTENSET; /*!< Offset: 0xC00 (R/W) PMU Count Enable Set Register */ - uint32_t RESERVED4[7]; - __IOM uint32_t CNTENCLR; /*!< Offset: 0xC20 (R/W) PMU Count Enable Clear Register */ - uint32_t RESERVED5[7]; - __IOM uint32_t INTENSET; /*!< Offset: 0xC40 (R/W) PMU Interrupt Enable Set Register */ - uint32_t RESERVED6[7]; - __IOM uint32_t INTENCLR; /*!< Offset: 0xC60 (R/W) PMU Interrupt Enable Clear Register */ - uint32_t RESERVED7[7]; - __IOM uint32_t OVSCLR; /*!< Offset: 0xC80 (R/W) PMU Overflow Flag Status Clear Register */ - uint32_t RESERVED8[7]; - __IOM uint32_t SWINC; /*!< Offset: 0xCA0 (R/W) PMU Software Increment Register */ - uint32_t RESERVED9[7]; - __IOM uint32_t OVSSET; /*!< Offset: 0xCC0 (R/W) PMU Overflow Flag Status Set Register */ - uint32_t RESERVED10[79]; - __IOM uint32_t TYPE; /*!< Offset: 0xE00 (R/W) PMU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0xE04 (R/W) PMU Control Register */ - uint32_t RESERVED11[108]; - __IOM uint32_t AUTHSTATUS; /*!< Offset: 0xFB8 (R/W) PMU Authentication Status Register */ - __IOM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/W) PMU Device Architecture Register */ - uint32_t RESERVED12[3]; - __IOM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/W) PMU Device Type Register */ - __IOM uint32_t PIDR4; /*!< Offset: 0xFD0 (R/W) PMU Peripheral Identification Register 4 */ - uint32_t RESERVED13[3]; - __IOM uint32_t PIDR0; /*!< Offset: 0xFE0 (R/W) PMU Peripheral Identification Register 0 */ - __IOM uint32_t PIDR1; /*!< Offset: 0xFE4 (R/W) PMU Peripheral Identification Register 1 */ - __IOM uint32_t PIDR2; /*!< Offset: 0xFE8 (R/W) PMU Peripheral Identification Register 2 */ - __IOM uint32_t PIDR3; /*!< Offset: 0xFEC (R/W) PMU Peripheral Identification Register 3 */ - __IOM uint32_t CIDR0; /*!< Offset: 0xFF0 (R/W) PMU Component Identification Register 0 */ - __IOM uint32_t CIDR1; /*!< Offset: 0xFF4 (R/W) PMU Component Identification Register 1 */ - __IOM uint32_t CIDR2; /*!< Offset: 0xFF8 (R/W) PMU Component Identification Register 2 */ - __IOM uint32_t CIDR3; /*!< Offset: 0xFFC (R/W) PMU Component Identification Register 3 */ -} PMU_Type; - -/** \brief PMU Event Counter Registers (0-30) Definitions */ - -#define PMU_EVCNTR_CNT_Pos 0U /*!< PMU EVCNTR: Counter Position */ -#define PMU_EVCNTR_CNT_Msk (0xFFFFUL /*<< PMU_EVCNTRx_CNT_Pos*/) /*!< PMU EVCNTR: Counter Mask */ - -/** \brief PMU Event Type and Filter Registers (0-30) Definitions */ - -#define PMU_EVTYPER_EVENTTOCNT_Pos 0U /*!< PMU EVTYPER: Event to Count Position */ -#define PMU_EVTYPER_EVENTTOCNT_Msk (0xFFFFUL /*<< EVTYPERx_EVENTTOCNT_Pos*/) /*!< PMU EVTYPER: Event to Count Mask */ - -/** \brief PMU Count Enable Set Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENSET: Event Counter 0 Enable Set Position */ -#define PMU_CNTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENSET_CNT0_ENABLE_Pos*/) /*!< PMU CNTENSET: Event Counter 0 Enable Set Mask */ - -#define PMU_CNTENSET_CNT1_ENABLE_Pos 1U /*!< PMU CNTENSET: Event Counter 1 Enable Set Position */ -#define PMU_CNTENSET_CNT1_ENABLE_Msk (1UL << PMU_CNTENSET_CNT1_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 1 Enable Set Mask */ - -#define PMU_CNTENSET_CNT2_ENABLE_Pos 2U /*!< PMU CNTENSET: Event Counter 2 Enable Set Position */ -#define PMU_CNTENSET_CNT2_ENABLE_Msk (1UL << PMU_CNTENSET_CNT2_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 2 Enable Set Mask */ - -#define PMU_CNTENSET_CNT3_ENABLE_Pos 3U /*!< PMU CNTENSET: Event Counter 3 Enable Set Position */ -#define PMU_CNTENSET_CNT3_ENABLE_Msk (1UL << PMU_CNTENSET_CNT3_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 3 Enable Set Mask */ - -#define PMU_CNTENSET_CNT4_ENABLE_Pos 4U /*!< PMU CNTENSET: Event Counter 4 Enable Set Position */ -#define PMU_CNTENSET_CNT4_ENABLE_Msk (1UL << PMU_CNTENSET_CNT4_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 4 Enable Set Mask */ - -#define PMU_CNTENSET_CNT5_ENABLE_Pos 5U /*!< PMU CNTENSET: Event Counter 5 Enable Set Position */ -#define PMU_CNTENSET_CNT5_ENABLE_Msk (1UL << PMU_CNTENSET_CNT5_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 5 Enable Set Mask */ - -#define PMU_CNTENSET_CNT6_ENABLE_Pos 6U /*!< PMU CNTENSET: Event Counter 6 Enable Set Position */ -#define PMU_CNTENSET_CNT6_ENABLE_Msk (1UL << PMU_CNTENSET_CNT6_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 6 Enable Set Mask */ - -#define PMU_CNTENSET_CNT7_ENABLE_Pos 7U /*!< PMU CNTENSET: Event Counter 7 Enable Set Position */ -#define PMU_CNTENSET_CNT7_ENABLE_Msk (1UL << PMU_CNTENSET_CNT7_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 7 Enable Set Mask */ - -#define PMU_CNTENSET_CNT8_ENABLE_Pos 8U /*!< PMU CNTENSET: Event Counter 8 Enable Set Position */ -#define PMU_CNTENSET_CNT8_ENABLE_Msk (1UL << PMU_CNTENSET_CNT8_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 8 Enable Set Mask */ - -#define PMU_CNTENSET_CNT9_ENABLE_Pos 9U /*!< PMU CNTENSET: Event Counter 9 Enable Set Position */ -#define PMU_CNTENSET_CNT9_ENABLE_Msk (1UL << PMU_CNTENSET_CNT9_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 9 Enable Set Mask */ - -#define PMU_CNTENSET_CNT10_ENABLE_Pos 10U /*!< PMU CNTENSET: Event Counter 10 Enable Set Position */ -#define PMU_CNTENSET_CNT10_ENABLE_Msk (1UL << PMU_CNTENSET_CNT10_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 10 Enable Set Mask */ - -#define PMU_CNTENSET_CNT11_ENABLE_Pos 11U /*!< PMU CNTENSET: Event Counter 11 Enable Set Position */ -#define PMU_CNTENSET_CNT11_ENABLE_Msk (1UL << PMU_CNTENSET_CNT11_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 11 Enable Set Mask */ - -#define PMU_CNTENSET_CNT12_ENABLE_Pos 12U /*!< PMU CNTENSET: Event Counter 12 Enable Set Position */ -#define PMU_CNTENSET_CNT12_ENABLE_Msk (1UL << PMU_CNTENSET_CNT12_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 12 Enable Set Mask */ - -#define PMU_CNTENSET_CNT13_ENABLE_Pos 13U /*!< PMU CNTENSET: Event Counter 13 Enable Set Position */ -#define PMU_CNTENSET_CNT13_ENABLE_Msk (1UL << PMU_CNTENSET_CNT13_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 13 Enable Set Mask */ - -#define PMU_CNTENSET_CNT14_ENABLE_Pos 14U /*!< PMU CNTENSET: Event Counter 14 Enable Set Position */ -#define PMU_CNTENSET_CNT14_ENABLE_Msk (1UL << PMU_CNTENSET_CNT14_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 14 Enable Set Mask */ - -#define PMU_CNTENSET_CNT15_ENABLE_Pos 15U /*!< PMU CNTENSET: Event Counter 15 Enable Set Position */ -#define PMU_CNTENSET_CNT15_ENABLE_Msk (1UL << PMU_CNTENSET_CNT15_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 15 Enable Set Mask */ - -#define PMU_CNTENSET_CNT16_ENABLE_Pos 16U /*!< PMU CNTENSET: Event Counter 16 Enable Set Position */ -#define PMU_CNTENSET_CNT16_ENABLE_Msk (1UL << PMU_CNTENSET_CNT16_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 16 Enable Set Mask */ - -#define PMU_CNTENSET_CNT17_ENABLE_Pos 17U /*!< PMU CNTENSET: Event Counter 17 Enable Set Position */ -#define PMU_CNTENSET_CNT17_ENABLE_Msk (1UL << PMU_CNTENSET_CNT17_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 17 Enable Set Mask */ - -#define PMU_CNTENSET_CNT18_ENABLE_Pos 18U /*!< PMU CNTENSET: Event Counter 18 Enable Set Position */ -#define PMU_CNTENSET_CNT18_ENABLE_Msk (1UL << PMU_CNTENSET_CNT18_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 18 Enable Set Mask */ - -#define PMU_CNTENSET_CNT19_ENABLE_Pos 19U /*!< PMU CNTENSET: Event Counter 19 Enable Set Position */ -#define PMU_CNTENSET_CNT19_ENABLE_Msk (1UL << PMU_CNTENSET_CNT19_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 19 Enable Set Mask */ - -#define PMU_CNTENSET_CNT20_ENABLE_Pos 20U /*!< PMU CNTENSET: Event Counter 20 Enable Set Position */ -#define PMU_CNTENSET_CNT20_ENABLE_Msk (1UL << PMU_CNTENSET_CNT20_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 20 Enable Set Mask */ - -#define PMU_CNTENSET_CNT21_ENABLE_Pos 21U /*!< PMU CNTENSET: Event Counter 21 Enable Set Position */ -#define PMU_CNTENSET_CNT21_ENABLE_Msk (1UL << PMU_CNTENSET_CNT21_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 21 Enable Set Mask */ - -#define PMU_CNTENSET_CNT22_ENABLE_Pos 22U /*!< PMU CNTENSET: Event Counter 22 Enable Set Position */ -#define PMU_CNTENSET_CNT22_ENABLE_Msk (1UL << PMU_CNTENSET_CNT22_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 22 Enable Set Mask */ - -#define PMU_CNTENSET_CNT23_ENABLE_Pos 23U /*!< PMU CNTENSET: Event Counter 23 Enable Set Position */ -#define PMU_CNTENSET_CNT23_ENABLE_Msk (1UL << PMU_CNTENSET_CNT23_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 23 Enable Set Mask */ - -#define PMU_CNTENSET_CNT24_ENABLE_Pos 24U /*!< PMU CNTENSET: Event Counter 24 Enable Set Position */ -#define PMU_CNTENSET_CNT24_ENABLE_Msk (1UL << PMU_CNTENSET_CNT24_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 24 Enable Set Mask */ - -#define PMU_CNTENSET_CNT25_ENABLE_Pos 25U /*!< PMU CNTENSET: Event Counter 25 Enable Set Position */ -#define PMU_CNTENSET_CNT25_ENABLE_Msk (1UL << PMU_CNTENSET_CNT25_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 25 Enable Set Mask */ - -#define PMU_CNTENSET_CNT26_ENABLE_Pos 26U /*!< PMU CNTENSET: Event Counter 26 Enable Set Position */ -#define PMU_CNTENSET_CNT26_ENABLE_Msk (1UL << PMU_CNTENSET_CNT26_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 26 Enable Set Mask */ - -#define PMU_CNTENSET_CNT27_ENABLE_Pos 27U /*!< PMU CNTENSET: Event Counter 27 Enable Set Position */ -#define PMU_CNTENSET_CNT27_ENABLE_Msk (1UL << PMU_CNTENSET_CNT27_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 27 Enable Set Mask */ - -#define PMU_CNTENSET_CNT28_ENABLE_Pos 28U /*!< PMU CNTENSET: Event Counter 28 Enable Set Position */ -#define PMU_CNTENSET_CNT28_ENABLE_Msk (1UL << PMU_CNTENSET_CNT28_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 28 Enable Set Mask */ - -#define PMU_CNTENSET_CNT29_ENABLE_Pos 29U /*!< PMU CNTENSET: Event Counter 29 Enable Set Position */ -#define PMU_CNTENSET_CNT29_ENABLE_Msk (1UL << PMU_CNTENSET_CNT29_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 29 Enable Set Mask */ - -#define PMU_CNTENSET_CNT30_ENABLE_Pos 30U /*!< PMU CNTENSET: Event Counter 30 Enable Set Position */ -#define PMU_CNTENSET_CNT30_ENABLE_Msk (1UL << PMU_CNTENSET_CNT30_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 30 Enable Set Mask */ - -#define PMU_CNTENSET_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENSET: Cycle Counter Enable Set Position */ -#define PMU_CNTENSET_CCNTR_ENABLE_Msk (1UL << PMU_CNTENSET_CCNTR_ENABLE_Pos) /*!< PMU CNTENSET: Cycle Counter Enable Set Mask */ - -/** \brief PMU Count Enable Clear Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Position */ -#define PMU_CNTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU CNTENCLR: Event Counter 1 Enable Clear Position */ -#define PMU_CNTENCLR_CNT1_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT1_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 1 Enable Clear */ - -#define PMU_CNTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Position */ -#define PMU_CNTENCLR_CNT2_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT2_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Position */ -#define PMU_CNTENCLR_CNT3_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT3_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Position */ -#define PMU_CNTENCLR_CNT4_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT4_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Position */ -#define PMU_CNTENCLR_CNT5_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT5_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Position */ -#define PMU_CNTENCLR_CNT6_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT6_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Position */ -#define PMU_CNTENCLR_CNT7_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT7_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Position */ -#define PMU_CNTENCLR_CNT8_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT8_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Position */ -#define PMU_CNTENCLR_CNT9_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT9_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Position */ -#define PMU_CNTENCLR_CNT10_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT10_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Position */ -#define PMU_CNTENCLR_CNT11_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT11_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Position */ -#define PMU_CNTENCLR_CNT12_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT12_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Position */ -#define PMU_CNTENCLR_CNT13_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT13_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Position */ -#define PMU_CNTENCLR_CNT14_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT14_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Position */ -#define PMU_CNTENCLR_CNT15_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT15_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Position */ -#define PMU_CNTENCLR_CNT16_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT16_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Position */ -#define PMU_CNTENCLR_CNT17_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT17_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Position */ -#define PMU_CNTENCLR_CNT18_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT18_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Position */ -#define PMU_CNTENCLR_CNT19_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT19_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Position */ -#define PMU_CNTENCLR_CNT20_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT20_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Position */ -#define PMU_CNTENCLR_CNT21_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT21_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Position */ -#define PMU_CNTENCLR_CNT22_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT22_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Position */ -#define PMU_CNTENCLR_CNT23_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT23_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Position */ -#define PMU_CNTENCLR_CNT24_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT24_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Position */ -#define PMU_CNTENCLR_CNT25_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT25_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Position */ -#define PMU_CNTENCLR_CNT26_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT26_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Position */ -#define PMU_CNTENCLR_CNT27_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT27_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Position */ -#define PMU_CNTENCLR_CNT28_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT28_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Position */ -#define PMU_CNTENCLR_CNT29_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT29_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Position */ -#define PMU_CNTENCLR_CNT30_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT30_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Mask */ - -#define PMU_CNTENCLR_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENCLR: Cycle Counter Enable Clear Position */ -#define PMU_CNTENCLR_CCNTR_ENABLE_Msk (1UL << PMU_CNTENCLR_CCNTR_ENABLE_Pos) /*!< PMU CNTENCLR: Cycle Counter Enable Clear Mask */ - -/** \brief PMU Interrupt Enable Set Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENSET_CNT0_ENABLE_Pos*/) /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT1_ENABLE_Pos 1U /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT1_ENABLE_Msk (1UL << PMU_INTENSET_CNT1_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT2_ENABLE_Pos 2U /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT2_ENABLE_Msk (1UL << PMU_INTENSET_CNT2_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT3_ENABLE_Pos 3U /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT3_ENABLE_Msk (1UL << PMU_INTENSET_CNT3_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT4_ENABLE_Pos 4U /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT4_ENABLE_Msk (1UL << PMU_INTENSET_CNT4_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT5_ENABLE_Pos 5U /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT5_ENABLE_Msk (1UL << PMU_INTENSET_CNT5_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT6_ENABLE_Pos 6U /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT6_ENABLE_Msk (1UL << PMU_INTENSET_CNT6_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT7_ENABLE_Pos 7U /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT7_ENABLE_Msk (1UL << PMU_INTENSET_CNT7_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT8_ENABLE_Pos 8U /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT8_ENABLE_Msk (1UL << PMU_INTENSET_CNT8_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT9_ENABLE_Pos 9U /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT9_ENABLE_Msk (1UL << PMU_INTENSET_CNT9_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT10_ENABLE_Pos 10U /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT10_ENABLE_Msk (1UL << PMU_INTENSET_CNT10_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT11_ENABLE_Pos 11U /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT11_ENABLE_Msk (1UL << PMU_INTENSET_CNT11_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT12_ENABLE_Pos 12U /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT12_ENABLE_Msk (1UL << PMU_INTENSET_CNT12_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT13_ENABLE_Pos 13U /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT13_ENABLE_Msk (1UL << PMU_INTENSET_CNT13_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT14_ENABLE_Pos 14U /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT14_ENABLE_Msk (1UL << PMU_INTENSET_CNT14_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT15_ENABLE_Pos 15U /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT15_ENABLE_Msk (1UL << PMU_INTENSET_CNT15_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT16_ENABLE_Pos 16U /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT16_ENABLE_Msk (1UL << PMU_INTENSET_CNT16_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT17_ENABLE_Pos 17U /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT17_ENABLE_Msk (1UL << PMU_INTENSET_CNT17_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT18_ENABLE_Pos 18U /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT18_ENABLE_Msk (1UL << PMU_INTENSET_CNT18_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT19_ENABLE_Pos 19U /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT19_ENABLE_Msk (1UL << PMU_INTENSET_CNT19_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT20_ENABLE_Pos 20U /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT20_ENABLE_Msk (1UL << PMU_INTENSET_CNT20_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT21_ENABLE_Pos 21U /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT21_ENABLE_Msk (1UL << PMU_INTENSET_CNT21_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT22_ENABLE_Pos 22U /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT22_ENABLE_Msk (1UL << PMU_INTENSET_CNT22_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT23_ENABLE_Pos 23U /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT23_ENABLE_Msk (1UL << PMU_INTENSET_CNT23_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT24_ENABLE_Pos 24U /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT24_ENABLE_Msk (1UL << PMU_INTENSET_CNT24_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT25_ENABLE_Pos 25U /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT25_ENABLE_Msk (1UL << PMU_INTENSET_CNT25_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT26_ENABLE_Pos 26U /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT26_ENABLE_Msk (1UL << PMU_INTENSET_CNT26_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT27_ENABLE_Pos 27U /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT27_ENABLE_Msk (1UL << PMU_INTENSET_CNT27_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT28_ENABLE_Pos 28U /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT28_ENABLE_Msk (1UL << PMU_INTENSET_CNT28_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT29_ENABLE_Pos 29U /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT29_ENABLE_Msk (1UL << PMU_INTENSET_CNT29_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT30_ENABLE_Pos 30U /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT30_ENABLE_Msk (1UL << PMU_INTENSET_CNT30_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Position */ -#define PMU_INTENSET_CCYCNT_ENABLE_Msk (1UL << PMU_INTENSET_CYCCNT_ENABLE_Pos) /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Mask */ - -/** \brief PMU Interrupt Enable Clear Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT1_ENABLE_Msk (1UL << PMU_INTENCLR_CNT1_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear */ - -#define PMU_INTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT2_ENABLE_Msk (1UL << PMU_INTENCLR_CNT2_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT3_ENABLE_Msk (1UL << PMU_INTENCLR_CNT3_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT4_ENABLE_Msk (1UL << PMU_INTENCLR_CNT4_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT5_ENABLE_Msk (1UL << PMU_INTENCLR_CNT5_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT6_ENABLE_Msk (1UL << PMU_INTENCLR_CNT6_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT7_ENABLE_Msk (1UL << PMU_INTENCLR_CNT7_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT8_ENABLE_Msk (1UL << PMU_INTENCLR_CNT8_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT9_ENABLE_Msk (1UL << PMU_INTENCLR_CNT9_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT10_ENABLE_Msk (1UL << PMU_INTENCLR_CNT10_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT11_ENABLE_Msk (1UL << PMU_INTENCLR_CNT11_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT12_ENABLE_Msk (1UL << PMU_INTENCLR_CNT12_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT13_ENABLE_Msk (1UL << PMU_INTENCLR_CNT13_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT14_ENABLE_Msk (1UL << PMU_INTENCLR_CNT14_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT15_ENABLE_Msk (1UL << PMU_INTENCLR_CNT15_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT16_ENABLE_Msk (1UL << PMU_INTENCLR_CNT16_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT17_ENABLE_Msk (1UL << PMU_INTENCLR_CNT17_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT18_ENABLE_Msk (1UL << PMU_INTENCLR_CNT18_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT19_ENABLE_Msk (1UL << PMU_INTENCLR_CNT19_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT20_ENABLE_Msk (1UL << PMU_INTENCLR_CNT20_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT21_ENABLE_Msk (1UL << PMU_INTENCLR_CNT21_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT22_ENABLE_Msk (1UL << PMU_INTENCLR_CNT22_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT23_ENABLE_Msk (1UL << PMU_INTENCLR_CNT23_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT24_ENABLE_Msk (1UL << PMU_INTENCLR_CNT24_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT25_ENABLE_Msk (1UL << PMU_INTENCLR_CNT25_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT26_ENABLE_Msk (1UL << PMU_INTENCLR_CNT26_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT27_ENABLE_Msk (1UL << PMU_INTENCLR_CNT27_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT28_ENABLE_Msk (1UL << PMU_INTENCLR_CNT28_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT29_ENABLE_Msk (1UL << PMU_INTENCLR_CNT29_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT30_ENABLE_Msk (1UL << PMU_INTENCLR_CNT30_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CYCCNT_ENABLE_Msk (1UL << PMU_INTENCLR_CYCCNT_ENABLE_Pos) /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Mask */ - -/** \brief PMU Overflow Flag Status Set Register Definitions */ - -#define PMU_OVSSET_CNT0_STATUS_Pos 0U /*!< PMU OVSSET: Event Counter 0 Overflow Set Position */ -#define PMU_OVSSET_CNT0_STATUS_Msk (1UL /*<< PMU_OVSSET_CNT0_STATUS_Pos*/) /*!< PMU OVSSET: Event Counter 0 Overflow Set Mask */ - -#define PMU_OVSSET_CNT1_STATUS_Pos 1U /*!< PMU OVSSET: Event Counter 1 Overflow Set Position */ -#define PMU_OVSSET_CNT1_STATUS_Msk (1UL << PMU_OVSSET_CNT1_STATUS_Pos) /*!< PMU OVSSET: Event Counter 1 Overflow Set Mask */ - -#define PMU_OVSSET_CNT2_STATUS_Pos 2U /*!< PMU OVSSET: Event Counter 2 Overflow Set Position */ -#define PMU_OVSSET_CNT2_STATUS_Msk (1UL << PMU_OVSSET_CNT2_STATUS_Pos) /*!< PMU OVSSET: Event Counter 2 Overflow Set Mask */ - -#define PMU_OVSSET_CNT3_STATUS_Pos 3U /*!< PMU OVSSET: Event Counter 3 Overflow Set Position */ -#define PMU_OVSSET_CNT3_STATUS_Msk (1UL << PMU_OVSSET_CNT3_STATUS_Pos) /*!< PMU OVSSET: Event Counter 3 Overflow Set Mask */ - -#define PMU_OVSSET_CNT4_STATUS_Pos 4U /*!< PMU OVSSET: Event Counter 4 Overflow Set Position */ -#define PMU_OVSSET_CNT4_STATUS_Msk (1UL << PMU_OVSSET_CNT4_STATUS_Pos) /*!< PMU OVSSET: Event Counter 4 Overflow Set Mask */ - -#define PMU_OVSSET_CNT5_STATUS_Pos 5U /*!< PMU OVSSET: Event Counter 5 Overflow Set Position */ -#define PMU_OVSSET_CNT5_STATUS_Msk (1UL << PMU_OVSSET_CNT5_STATUS_Pos) /*!< PMU OVSSET: Event Counter 5 Overflow Set Mask */ - -#define PMU_OVSSET_CNT6_STATUS_Pos 6U /*!< PMU OVSSET: Event Counter 6 Overflow Set Position */ -#define PMU_OVSSET_CNT6_STATUS_Msk (1UL << PMU_OVSSET_CNT6_STATUS_Pos) /*!< PMU OVSSET: Event Counter 6 Overflow Set Mask */ - -#define PMU_OVSSET_CNT7_STATUS_Pos 7U /*!< PMU OVSSET: Event Counter 7 Overflow Set Position */ -#define PMU_OVSSET_CNT7_STATUS_Msk (1UL << PMU_OVSSET_CNT7_STATUS_Pos) /*!< PMU OVSSET: Event Counter 7 Overflow Set Mask */ - -#define PMU_OVSSET_CNT8_STATUS_Pos 8U /*!< PMU OVSSET: Event Counter 8 Overflow Set Position */ -#define PMU_OVSSET_CNT8_STATUS_Msk (1UL << PMU_OVSSET_CNT8_STATUS_Pos) /*!< PMU OVSSET: Event Counter 8 Overflow Set Mask */ - -#define PMU_OVSSET_CNT9_STATUS_Pos 9U /*!< PMU OVSSET: Event Counter 9 Overflow Set Position */ -#define PMU_OVSSET_CNT9_STATUS_Msk (1UL << PMU_OVSSET_CNT9_STATUS_Pos) /*!< PMU OVSSET: Event Counter 9 Overflow Set Mask */ - -#define PMU_OVSSET_CNT10_STATUS_Pos 10U /*!< PMU OVSSET: Event Counter 10 Overflow Set Position */ -#define PMU_OVSSET_CNT10_STATUS_Msk (1UL << PMU_OVSSET_CNT10_STATUS_Pos) /*!< PMU OVSSET: Event Counter 10 Overflow Set Mask */ - -#define PMU_OVSSET_CNT11_STATUS_Pos 11U /*!< PMU OVSSET: Event Counter 11 Overflow Set Position */ -#define PMU_OVSSET_CNT11_STATUS_Msk (1UL << PMU_OVSSET_CNT11_STATUS_Pos) /*!< PMU OVSSET: Event Counter 11 Overflow Set Mask */ - -#define PMU_OVSSET_CNT12_STATUS_Pos 12U /*!< PMU OVSSET: Event Counter 12 Overflow Set Position */ -#define PMU_OVSSET_CNT12_STATUS_Msk (1UL << PMU_OVSSET_CNT12_STATUS_Pos) /*!< PMU OVSSET: Event Counter 12 Overflow Set Mask */ - -#define PMU_OVSSET_CNT13_STATUS_Pos 13U /*!< PMU OVSSET: Event Counter 13 Overflow Set Position */ -#define PMU_OVSSET_CNT13_STATUS_Msk (1UL << PMU_OVSSET_CNT13_STATUS_Pos) /*!< PMU OVSSET: Event Counter 13 Overflow Set Mask */ - -#define PMU_OVSSET_CNT14_STATUS_Pos 14U /*!< PMU OVSSET: Event Counter 14 Overflow Set Position */ -#define PMU_OVSSET_CNT14_STATUS_Msk (1UL << PMU_OVSSET_CNT14_STATUS_Pos) /*!< PMU OVSSET: Event Counter 14 Overflow Set Mask */ - -#define PMU_OVSSET_CNT15_STATUS_Pos 15U /*!< PMU OVSSET: Event Counter 15 Overflow Set Position */ -#define PMU_OVSSET_CNT15_STATUS_Msk (1UL << PMU_OVSSET_CNT15_STATUS_Pos) /*!< PMU OVSSET: Event Counter 15 Overflow Set Mask */ - -#define PMU_OVSSET_CNT16_STATUS_Pos 16U /*!< PMU OVSSET: Event Counter 16 Overflow Set Position */ -#define PMU_OVSSET_CNT16_STATUS_Msk (1UL << PMU_OVSSET_CNT16_STATUS_Pos) /*!< PMU OVSSET: Event Counter 16 Overflow Set Mask */ - -#define PMU_OVSSET_CNT17_STATUS_Pos 17U /*!< PMU OVSSET: Event Counter 17 Overflow Set Position */ -#define PMU_OVSSET_CNT17_STATUS_Msk (1UL << PMU_OVSSET_CNT17_STATUS_Pos) /*!< PMU OVSSET: Event Counter 17 Overflow Set Mask */ - -#define PMU_OVSSET_CNT18_STATUS_Pos 18U /*!< PMU OVSSET: Event Counter 18 Overflow Set Position */ -#define PMU_OVSSET_CNT18_STATUS_Msk (1UL << PMU_OVSSET_CNT18_STATUS_Pos) /*!< PMU OVSSET: Event Counter 18 Overflow Set Mask */ - -#define PMU_OVSSET_CNT19_STATUS_Pos 19U /*!< PMU OVSSET: Event Counter 19 Overflow Set Position */ -#define PMU_OVSSET_CNT19_STATUS_Msk (1UL << PMU_OVSSET_CNT19_STATUS_Pos) /*!< PMU OVSSET: Event Counter 19 Overflow Set Mask */ - -#define PMU_OVSSET_CNT20_STATUS_Pos 20U /*!< PMU OVSSET: Event Counter 20 Overflow Set Position */ -#define PMU_OVSSET_CNT20_STATUS_Msk (1UL << PMU_OVSSET_CNT20_STATUS_Pos) /*!< PMU OVSSET: Event Counter 20 Overflow Set Mask */ - -#define PMU_OVSSET_CNT21_STATUS_Pos 21U /*!< PMU OVSSET: Event Counter 21 Overflow Set Position */ -#define PMU_OVSSET_CNT21_STATUS_Msk (1UL << PMU_OVSSET_CNT21_STATUS_Pos) /*!< PMU OVSSET: Event Counter 21 Overflow Set Mask */ - -#define PMU_OVSSET_CNT22_STATUS_Pos 22U /*!< PMU OVSSET: Event Counter 22 Overflow Set Position */ -#define PMU_OVSSET_CNT22_STATUS_Msk (1UL << PMU_OVSSET_CNT22_STATUS_Pos) /*!< PMU OVSSET: Event Counter 22 Overflow Set Mask */ - -#define PMU_OVSSET_CNT23_STATUS_Pos 23U /*!< PMU OVSSET: Event Counter 23 Overflow Set Position */ -#define PMU_OVSSET_CNT23_STATUS_Msk (1UL << PMU_OVSSET_CNT23_STATUS_Pos) /*!< PMU OVSSET: Event Counter 23 Overflow Set Mask */ - -#define PMU_OVSSET_CNT24_STATUS_Pos 24U /*!< PMU OVSSET: Event Counter 24 Overflow Set Position */ -#define PMU_OVSSET_CNT24_STATUS_Msk (1UL << PMU_OVSSET_CNT24_STATUS_Pos) /*!< PMU OVSSET: Event Counter 24 Overflow Set Mask */ - -#define PMU_OVSSET_CNT25_STATUS_Pos 25U /*!< PMU OVSSET: Event Counter 25 Overflow Set Position */ -#define PMU_OVSSET_CNT25_STATUS_Msk (1UL << PMU_OVSSET_CNT25_STATUS_Pos) /*!< PMU OVSSET: Event Counter 25 Overflow Set Mask */ - -#define PMU_OVSSET_CNT26_STATUS_Pos 26U /*!< PMU OVSSET: Event Counter 26 Overflow Set Position */ -#define PMU_OVSSET_CNT26_STATUS_Msk (1UL << PMU_OVSSET_CNT26_STATUS_Pos) /*!< PMU OVSSET: Event Counter 26 Overflow Set Mask */ - -#define PMU_OVSSET_CNT27_STATUS_Pos 27U /*!< PMU OVSSET: Event Counter 27 Overflow Set Position */ -#define PMU_OVSSET_CNT27_STATUS_Msk (1UL << PMU_OVSSET_CNT27_STATUS_Pos) /*!< PMU OVSSET: Event Counter 27 Overflow Set Mask */ - -#define PMU_OVSSET_CNT28_STATUS_Pos 28U /*!< PMU OVSSET: Event Counter 28 Overflow Set Position */ -#define PMU_OVSSET_CNT28_STATUS_Msk (1UL << PMU_OVSSET_CNT28_STATUS_Pos) /*!< PMU OVSSET: Event Counter 28 Overflow Set Mask */ - -#define PMU_OVSSET_CNT29_STATUS_Pos 29U /*!< PMU OVSSET: Event Counter 29 Overflow Set Position */ -#define PMU_OVSSET_CNT29_STATUS_Msk (1UL << PMU_OVSSET_CNT29_STATUS_Pos) /*!< PMU OVSSET: Event Counter 29 Overflow Set Mask */ - -#define PMU_OVSSET_CNT30_STATUS_Pos 30U /*!< PMU OVSSET: Event Counter 30 Overflow Set Position */ -#define PMU_OVSSET_CNT30_STATUS_Msk (1UL << PMU_OVSSET_CNT30_STATUS_Pos) /*!< PMU OVSSET: Event Counter 30 Overflow Set Mask */ - -#define PMU_OVSSET_CYCCNT_STATUS_Pos 31U /*!< PMU OVSSET: Cycle Counter Overflow Set Position */ -#define PMU_OVSSET_CYCCNT_STATUS_Msk (1UL << PMU_OVSSET_CYCCNT_STATUS_Pos) /*!< PMU OVSSET: Cycle Counter Overflow Set Mask */ - -/** \brief PMU Overflow Flag Status Clear Register Definitions */ - -#define PMU_OVSCLR_CNT0_STATUS_Pos 0U /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Position */ -#define PMU_OVSCLR_CNT0_STATUS_Msk (1UL /*<< PMU_OVSCLR_CNT0_STATUS_Pos*/) /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT1_STATUS_Pos 1U /*!< PMU OVSCLR: Event Counter 1 Overflow Clear Position */ -#define PMU_OVSCLR_CNT1_STATUS_Msk (1UL << PMU_OVSCLR_CNT1_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 1 Overflow Clear */ - -#define PMU_OVSCLR_CNT2_STATUS_Pos 2U /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Position */ -#define PMU_OVSCLR_CNT2_STATUS_Msk (1UL << PMU_OVSCLR_CNT2_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT3_STATUS_Pos 3U /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Position */ -#define PMU_OVSCLR_CNT3_STATUS_Msk (1UL << PMU_OVSCLR_CNT3_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT4_STATUS_Pos 4U /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Position */ -#define PMU_OVSCLR_CNT4_STATUS_Msk (1UL << PMU_OVSCLR_CNT4_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT5_STATUS_Pos 5U /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Position */ -#define PMU_OVSCLR_CNT5_STATUS_Msk (1UL << PMU_OVSCLR_CNT5_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT6_STATUS_Pos 6U /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Position */ -#define PMU_OVSCLR_CNT6_STATUS_Msk (1UL << PMU_OVSCLR_CNT6_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT7_STATUS_Pos 7U /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Position */ -#define PMU_OVSCLR_CNT7_STATUS_Msk (1UL << PMU_OVSCLR_CNT7_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT8_STATUS_Pos 8U /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Position */ -#define PMU_OVSCLR_CNT8_STATUS_Msk (1UL << PMU_OVSCLR_CNT8_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT9_STATUS_Pos 9U /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Position */ -#define PMU_OVSCLR_CNT9_STATUS_Msk (1UL << PMU_OVSCLR_CNT9_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT10_STATUS_Pos 10U /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Position */ -#define PMU_OVSCLR_CNT10_STATUS_Msk (1UL << PMU_OVSCLR_CNT10_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT11_STATUS_Pos 11U /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Position */ -#define PMU_OVSCLR_CNT11_STATUS_Msk (1UL << PMU_OVSCLR_CNT11_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT12_STATUS_Pos 12U /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Position */ -#define PMU_OVSCLR_CNT12_STATUS_Msk (1UL << PMU_OVSCLR_CNT12_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT13_STATUS_Pos 13U /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Position */ -#define PMU_OVSCLR_CNT13_STATUS_Msk (1UL << PMU_OVSCLR_CNT13_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT14_STATUS_Pos 14U /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Position */ -#define PMU_OVSCLR_CNT14_STATUS_Msk (1UL << PMU_OVSCLR_CNT14_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT15_STATUS_Pos 15U /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Position */ -#define PMU_OVSCLR_CNT15_STATUS_Msk (1UL << PMU_OVSCLR_CNT15_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT16_STATUS_Pos 16U /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Position */ -#define PMU_OVSCLR_CNT16_STATUS_Msk (1UL << PMU_OVSCLR_CNT16_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT17_STATUS_Pos 17U /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Position */ -#define PMU_OVSCLR_CNT17_STATUS_Msk (1UL << PMU_OVSCLR_CNT17_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT18_STATUS_Pos 18U /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Position */ -#define PMU_OVSCLR_CNT18_STATUS_Msk (1UL << PMU_OVSCLR_CNT18_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT19_STATUS_Pos 19U /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Position */ -#define PMU_OVSCLR_CNT19_STATUS_Msk (1UL << PMU_OVSCLR_CNT19_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT20_STATUS_Pos 20U /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Position */ -#define PMU_OVSCLR_CNT20_STATUS_Msk (1UL << PMU_OVSCLR_CNT20_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT21_STATUS_Pos 21U /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Position */ -#define PMU_OVSCLR_CNT21_STATUS_Msk (1UL << PMU_OVSCLR_CNT21_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT22_STATUS_Pos 22U /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Position */ -#define PMU_OVSCLR_CNT22_STATUS_Msk (1UL << PMU_OVSCLR_CNT22_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT23_STATUS_Pos 23U /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Position */ -#define PMU_OVSCLR_CNT23_STATUS_Msk (1UL << PMU_OVSCLR_CNT23_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT24_STATUS_Pos 24U /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Position */ -#define PMU_OVSCLR_CNT24_STATUS_Msk (1UL << PMU_OVSCLR_CNT24_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT25_STATUS_Pos 25U /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Position */ -#define PMU_OVSCLR_CNT25_STATUS_Msk (1UL << PMU_OVSCLR_CNT25_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT26_STATUS_Pos 26U /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Position */ -#define PMU_OVSCLR_CNT26_STATUS_Msk (1UL << PMU_OVSCLR_CNT26_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT27_STATUS_Pos 27U /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Position */ -#define PMU_OVSCLR_CNT27_STATUS_Msk (1UL << PMU_OVSCLR_CNT27_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT28_STATUS_Pos 28U /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Position */ -#define PMU_OVSCLR_CNT28_STATUS_Msk (1UL << PMU_OVSCLR_CNT28_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT29_STATUS_Pos 29U /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Position */ -#define PMU_OVSCLR_CNT29_STATUS_Msk (1UL << PMU_OVSCLR_CNT29_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT30_STATUS_Pos 30U /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Position */ -#define PMU_OVSCLR_CNT30_STATUS_Msk (1UL << PMU_OVSCLR_CNT30_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Mask */ - -#define PMU_OVSCLR_CYCCNT_STATUS_Pos 31U /*!< PMU OVSCLR: Cycle Counter Overflow Clear Position */ -#define PMU_OVSCLR_CYCCNT_STATUS_Msk (1UL << PMU_OVSCLR_CYCCNT_STATUS_Pos) /*!< PMU OVSCLR: Cycle Counter Overflow Clear Mask */ - -/** \brief PMU Software Increment Counter */ - -#define PMU_SWINC_CNT0_Pos 0U /*!< PMU SWINC: Event Counter 0 Software Increment Position */ -#define PMU_SWINC_CNT0_Msk (1UL /*<< PMU_SWINC_CNT0_Pos */) /*!< PMU SWINC: Event Counter 0 Software Increment Mask */ - -#define PMU_SWINC_CNT1_Pos 1U /*!< PMU SWINC: Event Counter 1 Software Increment Position */ -#define PMU_SWINC_CNT1_Msk (1UL << PMU_SWINC_CNT1_Pos) /*!< PMU SWINC: Event Counter 1 Software Increment Mask */ - -#define PMU_SWINC_CNT2_Pos 2U /*!< PMU SWINC: Event Counter 2 Software Increment Position */ -#define PMU_SWINC_CNT2_Msk (1UL << PMU_SWINC_CNT2_Pos) /*!< PMU SWINC: Event Counter 2 Software Increment Mask */ - -#define PMU_SWINC_CNT3_Pos 3U /*!< PMU SWINC: Event Counter 3 Software Increment Position */ -#define PMU_SWINC_CNT3_Msk (1UL << PMU_SWINC_CNT3_Pos) /*!< PMU SWINC: Event Counter 3 Software Increment Mask */ - -#define PMU_SWINC_CNT4_Pos 4U /*!< PMU SWINC: Event Counter 4 Software Increment Position */ -#define PMU_SWINC_CNT4_Msk (1UL << PMU_SWINC_CNT4_Pos) /*!< PMU SWINC: Event Counter 4 Software Increment Mask */ - -#define PMU_SWINC_CNT5_Pos 5U /*!< PMU SWINC: Event Counter 5 Software Increment Position */ -#define PMU_SWINC_CNT5_Msk (1UL << PMU_SWINC_CNT5_Pos) /*!< PMU SWINC: Event Counter 5 Software Increment Mask */ - -#define PMU_SWINC_CNT6_Pos 6U /*!< PMU SWINC: Event Counter 6 Software Increment Position */ -#define PMU_SWINC_CNT6_Msk (1UL << PMU_SWINC_CNT6_Pos) /*!< PMU SWINC: Event Counter 6 Software Increment Mask */ - -#define PMU_SWINC_CNT7_Pos 7U /*!< PMU SWINC: Event Counter 7 Software Increment Position */ -#define PMU_SWINC_CNT7_Msk (1UL << PMU_SWINC_CNT7_Pos) /*!< PMU SWINC: Event Counter 7 Software Increment Mask */ - -#define PMU_SWINC_CNT8_Pos 8U /*!< PMU SWINC: Event Counter 8 Software Increment Position */ -#define PMU_SWINC_CNT8_Msk (1UL << PMU_SWINC_CNT8_Pos) /*!< PMU SWINC: Event Counter 8 Software Increment Mask */ - -#define PMU_SWINC_CNT9_Pos 9U /*!< PMU SWINC: Event Counter 9 Software Increment Position */ -#define PMU_SWINC_CNT9_Msk (1UL << PMU_SWINC_CNT9_Pos) /*!< PMU SWINC: Event Counter 9 Software Increment Mask */ - -#define PMU_SWINC_CNT10_Pos 10U /*!< PMU SWINC: Event Counter 10 Software Increment Position */ -#define PMU_SWINC_CNT10_Msk (1UL << PMU_SWINC_CNT10_Pos) /*!< PMU SWINC: Event Counter 10 Software Increment Mask */ - -#define PMU_SWINC_CNT11_Pos 11U /*!< PMU SWINC: Event Counter 11 Software Increment Position */ -#define PMU_SWINC_CNT11_Msk (1UL << PMU_SWINC_CNT11_Pos) /*!< PMU SWINC: Event Counter 11 Software Increment Mask */ - -#define PMU_SWINC_CNT12_Pos 12U /*!< PMU SWINC: Event Counter 12 Software Increment Position */ -#define PMU_SWINC_CNT12_Msk (1UL << PMU_SWINC_CNT12_Pos) /*!< PMU SWINC: Event Counter 12 Software Increment Mask */ - -#define PMU_SWINC_CNT13_Pos 13U /*!< PMU SWINC: Event Counter 13 Software Increment Position */ -#define PMU_SWINC_CNT13_Msk (1UL << PMU_SWINC_CNT13_Pos) /*!< PMU SWINC: Event Counter 13 Software Increment Mask */ - -#define PMU_SWINC_CNT14_Pos 14U /*!< PMU SWINC: Event Counter 14 Software Increment Position */ -#define PMU_SWINC_CNT14_Msk (1UL << PMU_SWINC_CNT14_Pos) /*!< PMU SWINC: Event Counter 14 Software Increment Mask */ - -#define PMU_SWINC_CNT15_Pos 15U /*!< PMU SWINC: Event Counter 15 Software Increment Position */ -#define PMU_SWINC_CNT15_Msk (1UL << PMU_SWINC_CNT15_Pos) /*!< PMU SWINC: Event Counter 15 Software Increment Mask */ - -#define PMU_SWINC_CNT16_Pos 16U /*!< PMU SWINC: Event Counter 16 Software Increment Position */ -#define PMU_SWINC_CNT16_Msk (1UL << PMU_SWINC_CNT16_Pos) /*!< PMU SWINC: Event Counter 16 Software Increment Mask */ - -#define PMU_SWINC_CNT17_Pos 17U /*!< PMU SWINC: Event Counter 17 Software Increment Position */ -#define PMU_SWINC_CNT17_Msk (1UL << PMU_SWINC_CNT17_Pos) /*!< PMU SWINC: Event Counter 17 Software Increment Mask */ - -#define PMU_SWINC_CNT18_Pos 18U /*!< PMU SWINC: Event Counter 18 Software Increment Position */ -#define PMU_SWINC_CNT18_Msk (1UL << PMU_SWINC_CNT18_Pos) /*!< PMU SWINC: Event Counter 18 Software Increment Mask */ - -#define PMU_SWINC_CNT19_Pos 19U /*!< PMU SWINC: Event Counter 19 Software Increment Position */ -#define PMU_SWINC_CNT19_Msk (1UL << PMU_SWINC_CNT19_Pos) /*!< PMU SWINC: Event Counter 19 Software Increment Mask */ - -#define PMU_SWINC_CNT20_Pos 20U /*!< PMU SWINC: Event Counter 20 Software Increment Position */ -#define PMU_SWINC_CNT20_Msk (1UL << PMU_SWINC_CNT20_Pos) /*!< PMU SWINC: Event Counter 20 Software Increment Mask */ - -#define PMU_SWINC_CNT21_Pos 21U /*!< PMU SWINC: Event Counter 21 Software Increment Position */ -#define PMU_SWINC_CNT21_Msk (1UL << PMU_SWINC_CNT21_Pos) /*!< PMU SWINC: Event Counter 21 Software Increment Mask */ - -#define PMU_SWINC_CNT22_Pos 22U /*!< PMU SWINC: Event Counter 22 Software Increment Position */ -#define PMU_SWINC_CNT22_Msk (1UL << PMU_SWINC_CNT22_Pos) /*!< PMU SWINC: Event Counter 22 Software Increment Mask */ - -#define PMU_SWINC_CNT23_Pos 23U /*!< PMU SWINC: Event Counter 23 Software Increment Position */ -#define PMU_SWINC_CNT23_Msk (1UL << PMU_SWINC_CNT23_Pos) /*!< PMU SWINC: Event Counter 23 Software Increment Mask */ - -#define PMU_SWINC_CNT24_Pos 24U /*!< PMU SWINC: Event Counter 24 Software Increment Position */ -#define PMU_SWINC_CNT24_Msk (1UL << PMU_SWINC_CNT24_Pos) /*!< PMU SWINC: Event Counter 24 Software Increment Mask */ - -#define PMU_SWINC_CNT25_Pos 25U /*!< PMU SWINC: Event Counter 25 Software Increment Position */ -#define PMU_SWINC_CNT25_Msk (1UL << PMU_SWINC_CNT25_Pos) /*!< PMU SWINC: Event Counter 25 Software Increment Mask */ - -#define PMU_SWINC_CNT26_Pos 26U /*!< PMU SWINC: Event Counter 26 Software Increment Position */ -#define PMU_SWINC_CNT26_Msk (1UL << PMU_SWINC_CNT26_Pos) /*!< PMU SWINC: Event Counter 26 Software Increment Mask */ - -#define PMU_SWINC_CNT27_Pos 27U /*!< PMU SWINC: Event Counter 27 Software Increment Position */ -#define PMU_SWINC_CNT27_Msk (1UL << PMU_SWINC_CNT27_Pos) /*!< PMU SWINC: Event Counter 27 Software Increment Mask */ - -#define PMU_SWINC_CNT28_Pos 28U /*!< PMU SWINC: Event Counter 28 Software Increment Position */ -#define PMU_SWINC_CNT28_Msk (1UL << PMU_SWINC_CNT28_Pos) /*!< PMU SWINC: Event Counter 28 Software Increment Mask */ - -#define PMU_SWINC_CNT29_Pos 29U /*!< PMU SWINC: Event Counter 29 Software Increment Position */ -#define PMU_SWINC_CNT29_Msk (1UL << PMU_SWINC_CNT29_Pos) /*!< PMU SWINC: Event Counter 29 Software Increment Mask */ - -#define PMU_SWINC_CNT30_Pos 30U /*!< PMU SWINC: Event Counter 30 Software Increment Position */ -#define PMU_SWINC_CNT30_Msk (1UL << PMU_SWINC_CNT30_Pos) /*!< PMU SWINC: Event Counter 30 Software Increment Mask */ - -/** \brief PMU Control Register Definitions */ - -#define PMU_CTRL_ENABLE_Pos 0U /*!< PMU CTRL: ENABLE Position */ -#define PMU_CTRL_ENABLE_Msk (1UL /*<< PMU_CTRL_ENABLE_Pos*/) /*!< PMU CTRL: ENABLE Mask */ - -#define PMU_CTRL_EVENTCNT_RESET_Pos 1U /*!< PMU CTRL: Event Counter Reset Position */ -#define PMU_CTRL_EVENTCNT_RESET_Msk (1UL << PMU_CTRL_EVENTCNT_RESET_Pos) /*!< PMU CTRL: Event Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_RESET_Pos 2U /*!< PMU CTRL: Cycle Counter Reset Position */ -#define PMU_CTRL_CYCCNT_RESET_Msk (1UL << PMU_CTRL_CYCCNT_RESET_Pos) /*!< PMU CTRL: Cycle Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_DISABLE_Pos 5U /*!< PMU CTRL: Disable Cycle Counter Position */ -#define PMU_CTRL_CYCCNT_DISABLE_Msk (1UL << PMU_CTRL_CYCCNT_DISABLE_Pos) /*!< PMU CTRL: Disable Cycle Counter Mask */ - -#define PMU_CTRL_FRZ_ON_OV_Pos 9U /*!< PMU CTRL: Freeze-on-overflow Position */ -#define PMU_CTRL_FRZ_ON_OV_Msk (1UL << PMU_CTRL_FRZ_ON_OVERFLOW_Pos) /*!< PMU CTRL: Freeze-on-overflow Mask */ - -#define PMU_CTRL_TRACE_ON_OV_Pos 11U /*!< PMU CTRL: Trace-on-overflow Position */ -#define PMU_CTRL_TRACE_ON_OV_Msk (1UL << PMU_CTRL_TRACE_ON_OVERFLOW_Pos) /*!< PMU CTRL: Trace-on-overflow Mask */ - -/** \brief PMU Type Register Definitions */ - -#define PMU_TYPE_NUM_CNTS_Pos 0U /*!< PMU TYPE: Number of Counters Position */ -#define PMU_TYPE_NUM_CNTS_Msk (0xFFUL /*<< PMU_TYPE_NUM_CNTS_Pos*/) /*!< PMU TYPE: Number of Counters Mask */ - -#define PMU_TYPE_SIZE_CNTS_Pos 8U /*!< PMU TYPE: Size of Counters Position */ -#define PMU_TYPE_SIZE_CNTS_Msk (0x3FUL << PMU_TYPE_SIZE_CNTS_Pos) /*!< PMU TYPE: Size of Counters Mask */ - -#define PMU_TYPE_CYCCNT_PRESENT_Pos 14U /*!< PMU TYPE: Cycle Counter Present Position */ -#define PMU_TYPE_CYCCNT_PRESENT_Msk (1UL << PMU_TYPE_CYCCNT_PRESENT_Pos) /*!< PMU TYPE: Cycle Counter Present Mask */ - -#define PMU_TYPE_FRZ_OV_SUPPORT_Pos 21U /*!< PMU TYPE: Freeze-on-overflow Support Position */ -#define PMU_TYPE_FRZ_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Freeze-on-overflow Support Mask */ - -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Pos 23U /*!< PMU TYPE: Trace-on-overflow Support Position */ -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Trace-on-overflow Support Mask */ - -/** \brief PMU Authentication Status Register Definitions */ - -#define PMU_AUTHSTATUS_NSID_Pos 0U /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSID_Msk (0x3UL /*<< PMU_AUTHSTATUS_NSID_Pos*/) /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSNID_Pos 2U /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSNID_Msk (0x3UL << PMU_AUTHSTATUS_NSNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SID_Pos 4U /*!< PMU AUTHSTATUS: Secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_SID_Msk (0x3UL << PMU_AUTHSTATUS_SID_Pos) /*!< PMU AUTHSTATUS: Secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SNID_Pos 6U /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SNID_Msk (0x3UL << PMU_AUTHSTATUS_SNID_Pos) /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUID_Pos 16U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUID_Msk (0x3UL << PMU_AUTHSTATUS_NSUID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUNID_Pos 18U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUNID_Msk (0x3UL << PMU_AUTHSTATUS_NSUNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUID_Pos 20U /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_SUID_Msk (0x3UL << PMU_AUTHSTATUS_SUID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUNID_Pos 22U /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SUNID_Msk (0x3UL << PMU_AUTHSTATUS_SUNID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Mask */ - -/*@} end of group CMSIS_PMU */ -#endif - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ -#define MPU_RLAR_PXN_Msk (1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -#define FPU_FPDSCR_FZ16_Pos 19U /*!< FPDSCR: FZ16 bit Position */ -#define FPU_FPDSCR_FZ16_Msk (1UL << FPU_FPDSCR_FZ16_Pos) /*!< FPDSCR: FZ16 bit Mask */ - -#define FPU_FPDSCR_LTPSIZE_Pos 16U /*!< FPDSCR: LTPSIZE bit Position */ -#define FPU_FPDSCR_LTPSIZE_Msk (7UL << FPU_FPDSCR_LTPSIZE_Pos) /*!< FPDSCR: LTPSIZE bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FPRound_Pos 28U /*!< MVFR0: FPRound bits Position */ -#define FPU_MVFR0_FPRound_Msk (0xFUL << FPU_MVFR0_FPRound_Pos) /*!< MVFR0: FPRound bits Mask */ - -#define FPU_MVFR0_FPSqrt_Pos 20U /*!< MVFR0: FPSqrt bits Position */ -#define FPU_MVFR0_FPSqrt_Msk (0xFUL << FPU_MVFR0_FPSqrt_Pos) /*!< MVFR0: FPSqrt bits Mask */ - -#define FPU_MVFR0_FPDivide_Pos 16U /*!< MVFR0: FPDivide bits Position */ -#define FPU_MVFR0_FPDivide_Msk (0xFUL << FPU_MVFR0_FPDivide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FPDP_Pos 8U /*!< MVFR0: FPDP bits Position */ -#define FPU_MVFR0_FPDP_Msk (0xFUL << FPU_MVFR0_FPDP_Pos) /*!< MVFR0: FPDP bits Mask */ - -#define FPU_MVFR0_FPSP_Pos 4U /*!< MVFR0: FPSP bits Position */ -#define FPU_MVFR0_FPSP_Msk (0xFUL << FPU_MVFR0_FPSP_Pos) /*!< MVFR0: FPSP bits Mask */ - -#define FPU_MVFR0_SIMDReg_Pos 0U /*!< MVFR0: SIMDReg bits Position */ -#define FPU_MVFR0_SIMDReg_Msk (0xFUL /*<< FPU_MVFR0_SIMDReg_Pos*/) /*!< MVFR0: SIMDReg bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FMAC_Pos 28U /*!< MVFR1: FMAC bits Position */ -#define FPU_MVFR1_FMAC_Msk (0xFUL << FPU_MVFR1_FMAC_Pos) /*!< MVFR1: FMAC bits Mask */ - -#define FPU_MVFR1_FPHP_Pos 24U /*!< MVFR1: FPHP bits Position */ -#define FPU_MVFR1_FPHP_Msk (0xFUL << FPU_MVFR1_FPHP_Pos) /*!< MVFR1: FPHP bits Mask */ - -#define FPU_MVFR1_FP16_Pos 20U /*!< MVFR1: FP16 bits Position */ -#define FPU_MVFR1_FP16_Msk (0xFUL << FPU_MVFR1_FP16_Pos) /*!< MVFR1: FP16 bits Mask */ - -#define FPU_MVFR1_MVE_Pos 8U /*!< MVFR1: MVE bits Position */ -#define FPU_MVFR1_MVE_Msk (0xFUL << FPU_MVFR1_MVE_Pos) /*!< MVFR1: MVE bits Mask */ - -#define FPU_MVFR1_FPDNaN_Pos 4U /*!< MVFR1: FPDNaN bits Position */ -#define FPU_MVFR1_FPDNaN_Msk (0xFUL << FPU_MVFR1_FPDNaN_Pos) /*!< MVFR1: FPDNaN bits Mask */ - -#define FPU_MVFR1_FPFtZ_Pos 0U /*!< MVFR1: FPFtZ bits Position */ -#define FPU_MVFR1_FPFtZ_Msk (0xFUL /*<< FPU_MVFR1_FPFtZ_Pos*/) /*!< MVFR1: FPFtZ bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_FPD_Pos 23U /*!< \deprecated CoreDebug DHCSR: S_FPD Position */ -#define CoreDebug_DHCSR_S_FPD_Msk (1UL << CoreDebug_DHCSR_S_FPD_Pos) /*!< \deprecated CoreDebug DHCSR: S_FPD Mask */ - -#define CoreDebug_DHCSR_S_SUIDE_Pos 22U /*!< \deprecated CoreDebug DHCSR: S_SUIDE Position */ -#define CoreDebug_DHCSR_S_SUIDE_Msk (1UL << CoreDebug_DHCSR_S_SUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SUIDE Mask */ - -#define CoreDebug_DHCSR_S_NSUIDE_Pos 21U /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Position */ -#define CoreDebug_DHCSR_S_NSUIDE_Msk (1UL << CoreDebug_DHCSR_S_NSUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Mask */ - -#define CoreDebug_DHCSR_S_SDE_Pos 20U /*!< \deprecated CoreDebug DHCSR: S_SDE Position */ -#define CoreDebug_DHCSR_S_SDE_Msk (1UL << CoreDebug_DHCSR_S_SDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SDE Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_PMOV_Pos 6U /*!< \deprecated CoreDebug DHCSR: C_PMOV Position */ -#define CoreDebug_DHCSR_C_PMOV_Msk (1UL << CoreDebug_DHCSR_C_PMOV_Pos) /*!< \deprecated CoreDebug DHCSR: C_PMOV Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Set Clear Exception and Monitor Control Register Definitions */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_REQ_Pos 3U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_SET_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_PEND_Pos 1U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_SET_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_UIDEN_Pos 10U /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_UIDAPEN_Pos 9U /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDAPEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDAPEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Mask */ - -#define CoreDebug_DAUTHCTRL_FSDMA_Pos 8U /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Position */ -#define CoreDebug_DAUTHCTRL_FSDMA_Msk (1UL << CoreDebug_DAUTHCTRL_FSDMA_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_FPD_Pos 23U /*!< DCB DHCSR: Floating-point registers Debuggable Position */ -#define DCB_DHCSR_S_FPD_Msk (0x1UL << DCB_DHCSR_S_FPD_Pos) /*!< DCB DHCSR: Floating-point registers Debuggable Mask */ - -#define DCB_DHCSR_S_SUIDE_Pos 22U /*!< DCB DHCSR: Secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_SUIDE_Msk (0x1UL << DCB_DHCSR_S_SUIDE_Pos) /*!< DCB DHCSR: Secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_NSUIDE_Pos 21U /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_NSUIDE_Msk (0x1UL << DCB_DHCSR_S_NSUIDE_Pos) /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_PMOV_Pos 6U /*!< DCB DHCSR: Halt on PMU overflow control Position */ -#define DCB_DHCSR_C_PMOV_Msk (0x1UL << DCB_DHCSR_C_PMOV_Pos) /*!< DCB DHCSR: Halt on PMU overflow control Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DSCEMCR, Debug Set Clear Exception and Monitor Control Register Definitions */ -#define DCB_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< DCB DSCEMCR: Clear monitor request Position */ -#define DCB_DSCEMCR_CLR_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_REQ_Pos) /*!< DCB DSCEMCR: Clear monitor request Mask */ - -#define DCB_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< DCB DSCEMCR: Clear monitor pend Position */ -#define DCB_DSCEMCR_CLR_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_PEND_Pos) /*!< DCB DSCEMCR: Clear monitor pend Mask */ - -#define DCB_DSCEMCR_SET_MON_REQ_Pos 3U /*!< DCB DSCEMCR: Set monitor request Position */ -#define DCB_DSCEMCR_SET_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_SET_MON_REQ_Pos) /*!< DCB DSCEMCR: Set monitor request Mask */ - -#define DCB_DSCEMCR_SET_MON_PEND_Pos 1U /*!< DCB DSCEMCR: Set monitor pend Position */ -#define DCB_DSCEMCR_SET_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_SET_MON_PEND_Pos) /*!< DCB DSCEMCR: Set monitor pend Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_UIDEN_Pos 10U /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Position */ -#define DCB_DAUTHCTRL_UIDEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Mask */ - -#define DCB_DAUTHCTRL_UIDAPEN_Pos 9U /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Position */ -#define DCB_DAUTHCTRL_UIDAPEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDAPEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Mask */ - -#define DCB_DAUTHCTRL_FSDMA_Pos 8U /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Position */ -#define DCB_DAUTHCTRL_FSDMA_Msk (0x1UL << DCB_DAUTHCTRL_FSDMA_Pos) /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Mask */ - -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SUNID_Pos 22U /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUNID_Msk (0x3UL << DIB_DAUTHSTATUS_SUNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SUID_Pos 20U /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUID_Msk (0x3UL << DIB_DAUTHSTATUS_SUID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_NSUNID_Pos 18U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Position */ -#define DIB_DAUTHSTATUS_NSUNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Mask */ - -#define DIB_DAUTHSTATUS_NSUID_Pos 16U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_NSUID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - #define PMU_BASE (0xE0003000UL) /*!< PMU Base Address */ - #define PMU ((PMU_Type *) PMU_BASE ) /*!< PMU configuration struct */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## PMU functions and events #################################### */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - -#include "pmu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - -/* ########################## MVE functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_MveFunctions MVE Functions - \brief Function that provides MVE type. - @{ - */ - -/** - \brief get MVE type - \details returns the MVE type - \returns - - \b 0: No Vector Extension (MVE) - - \b 1: Integer Vector Extension (MVE-I) - - \b 2: Floating-point Vector Extension (MVE-F) - */ -__STATIC_INLINE uint32_t SCB_GetMVEType(void) -{ - const uint32_t mvfr1 = FPU->MVFR1; - if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x2U << FPU_MVFR1_MVE_Pos)) - { - return 2U; - } - else if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x1U << FPU_MVFR1_MVE_Pos)) - { - return 1U; - } - else - { - return 0U; - } -} - - -/*@} end of CMSIS_Core_MveFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV81MML_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_armv8mbl.h b/software/Power_Pico/Drivers/CMSIS/Include/core_armv8mbl.h deleted file mode 100644 index 932d3d1..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_armv8mbl.h +++ /dev/null @@ -1,2222 +0,0 @@ -/**************************************************************************//** - * @file core_armv8mbl.h - * @brief CMSIS Armv8-M Baseline Core Peripheral Access Layer Header File - * @version V5.1.0 - * @date 27. March 2020 - ******************************************************************************/ -/* - * Copyright (c) 2009-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_ARMV8MBL_H_GENERIC -#define __CORE_ARMV8MBL_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_ARMv8MBL - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS definitions */ -#define __ARMv8MBL_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __ARMv8MBL_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __ARMv8MBL_CMSIS_VERSION ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \ - __ARMv8MBL_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (2U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MBL_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_ARMV8MBL_H_DEPENDANT -#define __CORE_ARMV8MBL_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __ARMv8MBL_REV - #define __ARMv8MBL_REV 0x0000U - #warning "__ARMv8MBL_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif - - #ifndef __ETM_PRESENT - #define __ETM_PRESENT 0U - #warning "__ETM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MTB_PRESENT - #define __MTB_PRESENT 0U - #warning "__MTB_PRESENT not defined in device header file; using default!" - #endif - -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group ARMv8MBL */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - uint32_t RESERVED0[6U]; - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - uint32_t RESERVED0[7U]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 1U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#endif -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: DWTENA Position */ -#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< \deprecated CoreDebug DEMCR: DWTENA Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/* Interrupt Priorities are WORD accessible only under Armv6-M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - -#define __NVIC_SetPriorityGrouping(X) (void)(X) -#define __NVIC_GetPriorityGrouping() (0U) - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - If VTOR is not present address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MBL_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_armv8mml.h b/software/Power_Pico/Drivers/CMSIS/Include/core_armv8mml.h deleted file mode 100644 index c119fbf..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_armv8mml.h +++ /dev/null @@ -1,3209 +0,0 @@ -/**************************************************************************//** - * @file core_armv8mml.h - * @brief CMSIS Armv8-M Mainline Core Peripheral Access Layer Header File - * @version V5.2.3 - * @date 13. October 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_ARMV8MML_H_GENERIC -#define __CORE_ARMV8MML_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_ARMv8MML - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS Armv8MML definitions */ -#define __ARMv8MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __ARMv8MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __ARMv8MML_CMSIS_VERSION ((__ARMv8MML_CMSIS_VERSION_MAIN << 16U) | \ - __ARMv8MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (80U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MML_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_ARMV8MML_H_DEPENDANT -#define __CORE_ARMV8MML_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __ARMv8MML_REV - #define __ARMv8MML_REV 0x0000U - #warning "__ARMv8MML_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group ARMv8MML */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MML_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_cm0.h b/software/Power_Pico/Drivers/CMSIS/Include/core_cm0.h deleted file mode 100644 index 6441ff3..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_cm0.h +++ /dev/null @@ -1,952 +0,0 @@ -/**************************************************************************//** - * @file core_cm0.h - * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File - * @version V5.0.8 - * @date 21. August 2019 - ******************************************************************************/ -/* - * Copyright (c) 2009-2019 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM0_H_GENERIC -#define __CORE_CM0_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M0 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM0 definitions */ -#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ - __CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (0U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0_H_DEPENDANT -#define __CORE_CM0_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0_REV - #define __CM0_REV 0x0000U - #warning "__CM0_REV not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M0 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t _reserved0:1; /*!< bit: 0 Reserved */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - uint32_t RESERVED0; - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the Cortex-M0 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ -/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */ - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ - - -/* Interrupt Priorities are WORD accessible only under Armv6-M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - -#define __NVIC_SetPriorityGrouping(X) (void)(X) -#define __NVIC_GetPriorityGrouping() (0U) - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - Address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ - *(vectors + (int32_t)IRQn) = vector; /* use pointer arithmetic to access vector */ - /* ARM Application Note 321 states that the M0 does not require the architectural barrier */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ - return *(vectors + (int32_t)IRQn); /* use pointer arithmetic to access vector */ -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_cm0plus.h b/software/Power_Pico/Drivers/CMSIS/Include/core_cm0plus.h deleted file mode 100644 index 4e7179a..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_cm0plus.h +++ /dev/null @@ -1,1087 +0,0 @@ -/**************************************************************************//** - * @file core_cm0plus.h - * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File - * @version V5.0.9 - * @date 21. August 2019 - ******************************************************************************/ -/* - * Copyright (c) 2009-2019 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM0PLUS_H_GENERIC -#define __CORE_CM0PLUS_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex-M0+ - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM0+ definitions */ -#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ - __CM0PLUS_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (0U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0PLUS_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0PLUS_H_DEPENDANT -#define __CORE_CM0PLUS_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0PLUS_REV - #define __CM0PLUS_REV 0x0000U - #warning "__CM0PLUS_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex-M0+ */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -#define MPU_TYPE_RALIASES 1U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the Cortex-M0+ header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ -/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0+ */ - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ - - -/* Interrupt Priorities are WORD accessible only under Armv6-M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - -#define __NVIC_SetPriorityGrouping(X) (void)(X) -#define __NVIC_GetPriorityGrouping() (0U) - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - If VTOR is not present address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -#else - uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ - *(vectors + (int32_t)IRQn) = vector; /* use pointer arithmetic to access vector */ -#endif - /* ARM Application Note 321 states that the M0+ does not require the architectural barrier */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -#else - uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ - return *(vectors + (int32_t)IRQn); /* use pointer arithmetic to access vector */ -#endif -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0PLUS_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_cm1.h b/software/Power_Pico/Drivers/CMSIS/Include/core_cm1.h deleted file mode 100644 index 76b4569..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_cm1.h +++ /dev/null @@ -1,979 +0,0 @@ -/**************************************************************************//** - * @file core_cm1.h - * @brief CMSIS Cortex-M1 Core Peripheral Access Layer Header File - * @version V1.0.1 - * @date 12. November 2018 - ******************************************************************************/ -/* - * Copyright (c) 2009-2018 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM1_H_GENERIC -#define __CORE_CM1_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M1 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM1 definitions */ -#define __CM1_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM1_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM1_CMSIS_VERSION ((__CM1_CMSIS_VERSION_MAIN << 16U) | \ - __CM1_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (1U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM1_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM1_H_DEPENDANT -#define __CORE_CM1_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM1_REV - #define __CM1_REV 0x0100U - #warning "__CM1_REV not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M1 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t _reserved0:1; /*!< bit: 0 Reserved */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - uint32_t RESERVED0; - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_ITCMUAEN_Pos 4U /*!< ACTLR: Instruction TCM Upper Alias Enable Position */ -#define SCnSCB_ACTLR_ITCMUAEN_Msk (1UL << SCnSCB_ACTLR_ITCMUAEN_Pos) /*!< ACTLR: Instruction TCM Upper Alias Enable Mask */ - -#define SCnSCB_ACTLR_ITCMLAEN_Pos 3U /*!< ACTLR: Instruction TCM Lower Alias Enable Position */ -#define SCnSCB_ACTLR_ITCMLAEN_Msk (1UL << SCnSCB_ACTLR_ITCMLAEN_Pos) /*!< ACTLR: Instruction TCM Lower Alias Enable Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M1 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the Cortex-M1 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ -/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M1 */ - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ - - -/* Interrupt Priorities are WORD accessible only under Armv6-M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - -#define __NVIC_SetPriorityGrouping(X) (void)(X) -#define __NVIC_GetPriorityGrouping() (0U) - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - Address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)0x0U; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M1 does not require the architectural barrier */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)0x0U; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM1_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_cm23.h b/software/Power_Pico/Drivers/CMSIS/Include/core_cm23.h deleted file mode 100644 index 55fff99..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_cm23.h +++ /dev/null @@ -1,2297 +0,0 @@ -/**************************************************************************//** - * @file core_cm23.h - * @brief CMSIS Cortex-M23 Core Peripheral Access Layer Header File - * @version V5.1.0 - * @date 11. February 2020 - ******************************************************************************/ -/* - * Copyright (c) 2009-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM23_H_GENERIC -#define __CORE_CM23_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M23 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS definitions */ -#define __CM23_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM23_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM23_CMSIS_VERSION ((__CM23_CMSIS_VERSION_MAIN << 16U) | \ - __CM23_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (23U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM23_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM23_H_DEPENDANT -#define __CORE_CM23_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM23_REV - #define __CM23_REV 0x0000U - #warning "__CM23_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif - - #ifndef __ETM_PRESENT - #define __ETM_PRESENT 0U - #warning "__ETM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MTB_PRESENT - #define __MTB_PRESENT 0U - #warning "__MTB_PRESENT not defined in device header file; using default!" - #endif - -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M23 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - uint32_t RESERVED0[6U]; - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ - __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ - __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration Test FIFO Test Data 0 Register Definitions */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ -#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ -#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ -#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ - -/* TPI Integration Test ATB Control Register 2 Register Definitions */ -#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ -#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ - -#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ -#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ - -#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ -#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ - -#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ -#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ - -/* TPI Integration Test FIFO Test Data 1 Register Definitions */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ -#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ -#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ -#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ - -/* TPI Integration Test ATB Control Register 0 Definitions */ -#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ -#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ - -#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ -#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ - -#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ -#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ - -#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ -#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - uint32_t RESERVED0[7U]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 1U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#endif -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: DWTENA Position */ -#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< \deprecated CoreDebug DEMCR: DWTENA Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else -/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M23 */ -/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M23 */ - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/* Interrupt Priorities are WORD accessible only under Armv6-M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - -#define __NVIC_SetPriorityGrouping(X) (void)(X) -#define __NVIC_GetPriorityGrouping() (0U) - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - If VTOR is not present address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM23_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_cm3.h b/software/Power_Pico/Drivers/CMSIS/Include/core_cm3.h deleted file mode 100644 index 74fb87e..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_cm3.h +++ /dev/null @@ -1,1943 +0,0 @@ -/**************************************************************************//** - * @file core_cm3.h - * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File - * @version V5.1.2 - * @date 04. June 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM3_H_GENERIC -#define __CORE_CM3_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M3 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM3 definitions */ -#define __CM3_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM3_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ - __CM3_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (3U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM3_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM3_H_DEPENDANT -#define __CORE_CM3_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM3_REV - #define __CM3_REV 0x0200U - #warning "__CM3_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M3 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#if defined (__CM3_REV) && (__CM3_REV < 0x0201U) /* core r2p1 */ -#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#else -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ -#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -#else - uint32_t RESERVED1[1U]; -#endif -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) -#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ -#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ - -#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ -#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ -#endif - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ -#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ - -#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ -#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ -#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ - -#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ -#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M3 does not require the architectural barrier */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM3_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_cm33.h b/software/Power_Pico/Drivers/CMSIS/Include/core_cm33.h deleted file mode 100644 index 18a2e6f..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_cm33.h +++ /dev/null @@ -1,3277 +0,0 @@ -/**************************************************************************//** - * @file core_cm33.h - * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File - * @version V5.2.3 - * @date 13. October 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM33_H_GENERIC -#define __CORE_CM33_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M33 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM33 definitions */ -#define __CM33_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM33_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM33_CMSIS_VERSION ((__CM33_CMSIS_VERSION_MAIN << 16U) | \ - __CM33_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (33U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined (__TARGET_FPU_VFP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined (__ARM_FP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined (__ARMVFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined (__TI_VFP_SUPPORT__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined (__FPU_VFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM33_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM33_H_DEPENDANT -#define __CORE_CM33_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM33_REV - #define __CM33_REV 0x0000U - #warning "__CM33_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M33 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ - __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ - __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration Test FIFO Test Data 0 Register Definitions */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ -#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ -#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ -#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ - -/* TPI Integration Test ATB Control Register 2 Register Definitions */ -#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ -#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ - -#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ -#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ - -#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ -#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ - -#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ -#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ - -/* TPI Integration Test FIFO Test Data 1 Register Definitions */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ -#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ -#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ -#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ - -/* TPI Integration Test ATB Control Register 0 Definitions */ -#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ -#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ - -#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ -#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ - -#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ -#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ - -#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ -#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM33_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_cm35p.h b/software/Power_Pico/Drivers/CMSIS/Include/core_cm35p.h deleted file mode 100644 index 3843d95..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_cm35p.h +++ /dev/null @@ -1,3277 +0,0 @@ -/**************************************************************************//** - * @file core_cm35p.h - * @brief CMSIS Cortex-M35P Core Peripheral Access Layer Header File - * @version V1.1.3 - * @date 13. October 2021 - ******************************************************************************/ -/* - * Copyright (c) 2018-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM35P_H_GENERIC -#define __CORE_CM35P_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M35P - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM35P definitions */ -#define __CM35P_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM35P_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM35P_CMSIS_VERSION ((__CM35P_CMSIS_VERSION_MAIN << 16U) | \ - __CM35P_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (35U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined (__TARGET_FPU_VFP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined (__ARM_FP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined (__ARMVFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined (__TI_VFP_SUPPORT__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined (__FPU_VFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM35P_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM35P_H_DEPENDANT -#define __CORE_CM35P_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM35P_REV - #define __CM35P_REV 0x0000U - #warning "__CM35P_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M35P */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ - __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ - __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration Test FIFO Test Data 0 Register Definitions */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ -#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ -#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ -#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ - -/* TPI Integration Test ATB Control Register 2 Register Definitions */ -#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ -#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ - -#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ -#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ - -#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ -#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ - -#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ -#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ - -/* TPI Integration Test FIFO Test Data 1 Register Definitions */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ -#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ -#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ -#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ - -/* TPI Integration Test ATB Control Register 0 Definitions */ -#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ -#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ - -#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ -#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ - -#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ -#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ - -#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ -#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM35P_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_cm4.h b/software/Power_Pico/Drivers/CMSIS/Include/core_cm4.h deleted file mode 100644 index e21cd14..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_cm4.h +++ /dev/null @@ -1,2129 +0,0 @@ -/**************************************************************************//** - * @file core_cm4.h - * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File - * @version V5.1.2 - * @date 04. June 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM4_H_GENERIC -#define __CORE_CM4_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M4 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM4 definitions */ -#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ - __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (4U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM4_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM4_H_DEPENDANT -#define __CORE_CM4_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM4_REV - #define __CM4_REV 0x0000U - #warning "__CM4_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M4 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ -#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ - -#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ -#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ -#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ - -#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ -#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ -#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ - -#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ -#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and FP Feature Register 2 Definitions */ - -#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */ -#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */ - -/*@} end of group CMSIS_FPU */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ -#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ -#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M4 does not require the architectural barrier */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM4_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_cm55.h b/software/Power_Pico/Drivers/CMSIS/Include/core_cm55.h deleted file mode 100644 index faa30ce..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_cm55.h +++ /dev/null @@ -1,4817 +0,0 @@ -/**************************************************************************//** - * @file core_cm55.h - * @brief CMSIS Cortex-M55 Core Peripheral Access Layer Header File - * @version V1.2.4 - * @date 21. April 2022 - ******************************************************************************/ -/* - * Copyright (c) 2018-2022 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM55_H_GENERIC -#define __CORE_CM55_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M55 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM55 definitions */ -#define __CM55_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM55_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM55_CMSIS_VERSION ((__CM55_CMSIS_VERSION_MAIN << 16U) | \ - __CM55_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (55U) /*!< Cortex-M Core */ - -#if defined ( __CC_ARM ) - #error Legacy Arm Compiler does not support Armv8.1-M target architecture. -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM55_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM55_H_DEPENDANT -#define __CORE_CM55_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM55_REV - #define __CM55_REV 0x0000U - #warning "__CM55_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #if __FPU_PRESENT != 0U - #ifndef __FPU_DP - #define __FPU_DP 0U - #warning "__FPU_DP not defined in device header file; using default!" - #endif - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __PMU_PRESENT - #define __PMU_PRESENT 0U - #warning "__PMU_PRESENT not defined in device header file; using default!" - #endif - - #if __PMU_PRESENT != 0U - #ifndef __PMU_NUM_EVENTCNT - #define __PMU_NUM_EVENTCNT 8U - #warning "__PMU_NUM_EVENTCNT not defined in device header file; using default!" - #elif (__PMU_NUM_EVENTCNT > 8 || __PMU_NUM_EVENTCNT < 2) - #error "__PMU_NUM_EVENTCNT is out of range in device header file!" */ - #endif - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M55 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core EWIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core PMU Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - __IOM uint32_t RFSR; /*!< Offset: 0x204 (R/W) RAS Fault Status Register */ - uint32_t RESERVED4[14U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_IESB_Pos 5U /*!< SCB AIRCR: Implicit ESB Enable Position */ -#define SCB_AIRCR_IESB_Msk (1UL << SCB_AIRCR_IESB_Pos) /*!< SCB AIRCR: Implicit ESB Enable Mask */ - -#define SCB_AIRCR_DIT_Pos 4U /*!< SCB AIRCR: Data Independent Timing Position */ -#define SCB_AIRCR_DIT_Msk (1UL << SCB_AIRCR_DIT_Pos) /*!< SCB AIRCR: Data Independent Timing Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_TRD_Pos 20U /*!< SCB CCR: TRD Position */ -#define SCB_CCR_TRD_Msk (1UL << SCB_CCR_TRD_Pos) /*!< SCB CCR: TRD Mask */ - -#define SCB_CCR_LOB_Pos 19U /*!< SCB CCR: LOB Position */ -#define SCB_CCR_LOB_Msk (1UL << SCB_CCR_LOB_Pos) /*!< SCB CCR: LOB Mask */ - -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_PMU_Pos 5U /*!< SCB DFSR: PMU Position */ -#define SCB_DFSR_PMU_Msk (1UL << SCB_DFSR_PMU_Pos) /*!< SCB DFSR: PMU Mask */ - -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CP7_Pos 7U /*!< SCB NSACR: CP7 Position */ -#define SCB_NSACR_CP7_Msk (1UL << SCB_NSACR_CP7_Pos) /*!< SCB NSACR: CP7 Mask */ - -#define SCB_NSACR_CP6_Pos 6U /*!< SCB NSACR: CP6 Position */ -#define SCB_NSACR_CP6_Msk (1UL << SCB_NSACR_CP6_Pos) /*!< SCB NSACR: CP6 Mask */ - -#define SCB_NSACR_CP5_Pos 5U /*!< SCB NSACR: CP5 Position */ -#define SCB_NSACR_CP5_Msk (1UL << SCB_NSACR_CP5_Pos) /*!< SCB NSACR: CP5 Mask */ - -#define SCB_NSACR_CP4_Pos 4U /*!< SCB NSACR: CP4 Position */ -#define SCB_NSACR_CP4_Msk (1UL << SCB_NSACR_CP4_Pos) /*!< SCB NSACR: CP4 Mask */ - -#define SCB_NSACR_CP3_Pos 3U /*!< SCB NSACR: CP3 Position */ -#define SCB_NSACR_CP3_Msk (1UL << SCB_NSACR_CP3_Pos) /*!< SCB NSACR: CP3 Mask */ - -#define SCB_NSACR_CP2_Pos 2U /*!< SCB NSACR: CP2 Position */ -#define SCB_NSACR_CP2_Msk (1UL << SCB_NSACR_CP2_Pos) /*!< SCB NSACR: CP2 Mask */ - -#define SCB_NSACR_CP1_Pos 1U /*!< SCB NSACR: CP1 Position */ -#define SCB_NSACR_CP1_Msk (1UL << SCB_NSACR_CP1_Pos) /*!< SCB NSACR: CP1 Mask */ - -#define SCB_NSACR_CP0_Pos 0U /*!< SCB NSACR: CP0 Position */ -#define SCB_NSACR_CP0_Msk (1UL /*<< SCB_NSACR_CP0_Pos*/) /*!< SCB NSACR: CP0 Mask */ - -/* SCB Debug Feature Register 0 Definitions */ -#define SCB_ID_DFR_UDE_Pos 28U /*!< SCB ID_DFR: UDE Position */ -#define SCB_ID_DFR_UDE_Msk (0xFUL << SCB_ID_DFR_UDE_Pos) /*!< SCB ID_DFR: UDE Mask */ - -#define SCB_ID_DFR_MProfDbg_Pos 20U /*!< SCB ID_DFR: MProfDbg Position */ -#define SCB_ID_DFR_MProfDbg_Msk (0xFUL << SCB_ID_DFR_MProfDbg_Pos) /*!< SCB ID_DFR: MProfDbg Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB RAS Fault Status Register Definitions */ -#define SCB_RFSR_V_Pos 31U /*!< SCB RFSR: V Position */ -#define SCB_RFSR_V_Msk (1UL << SCB_RFSR_V_Pos) /*!< SCB RFSR: V Mask */ - -#define SCB_RFSR_IS_Pos 16U /*!< SCB RFSR: IS Position */ -#define SCB_RFSR_IS_Msk (0x7FFFUL << SCB_RFSR_IS_Pos) /*!< SCB RFSR: IS Mask */ - -#define SCB_RFSR_UET_Pos 0U /*!< SCB RFSR: UET Position */ -#define SCB_RFSR_UET_Msk (3UL /*<< SCB_RFSR_UET_Pos*/) /*!< SCB RFSR: UET Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ICB Implementation Control Block register (ICB) - \brief Type definitions for the Implementation Control Block Register - @{ - */ - -/** - \brief Structure type to access the Implementation Control Block (ICB). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} ICB_Type; - -/* Auxiliary Control Register Definitions */ -#define ICB_ACTLR_DISCRITAXIRUW_Pos 27U /*!< ACTLR: DISCRITAXIRUW Position */ -#define ICB_ACTLR_DISCRITAXIRUW_Msk (1UL << ICB_ACTLR_DISCRITAXIRUW_Pos) /*!< ACTLR: DISCRITAXIRUW Mask */ - -#define ICB_ACTLR_DISDI_Pos 16U /*!< ACTLR: DISDI Position */ -#define ICB_ACTLR_DISDI_Msk (3UL << ICB_ACTLR_DISDI_Pos) /*!< ACTLR: DISDI Mask */ - -#define ICB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ -#define ICB_ACTLR_DISCRITAXIRUR_Msk (1UL << ICB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ - -#define ICB_ACTLR_EVENTBUSEN_Pos 14U /*!< ACTLR: EVENTBUSEN Position */ -#define ICB_ACTLR_EVENTBUSEN_Msk (1UL << ICB_ACTLR_EVENTBUSEN_Pos) /*!< ACTLR: EVENTBUSEN Mask */ - -#define ICB_ACTLR_EVENTBUSEN_S_Pos 13U /*!< ACTLR: EVENTBUSEN_S Position */ -#define ICB_ACTLR_EVENTBUSEN_S_Msk (1UL << ICB_ACTLR_EVENTBUSEN_S_Pos) /*!< ACTLR: EVENTBUSEN_S Mask */ - -#define ICB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ -#define ICB_ACTLR_DISITMATBFLUSH_Msk (1UL << ICB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ - -#define ICB_ACTLR_DISNWAMODE_Pos 11U /*!< ACTLR: DISNWAMODE Position */ -#define ICB_ACTLR_DISNWAMODE_Msk (1UL << ICB_ACTLR_DISNWAMODE_Pos) /*!< ACTLR: DISNWAMODE Mask */ - -#define ICB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ -#define ICB_ACTLR_FPEXCODIS_Msk (1UL << ICB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ - -#define ICB_ACTLR_DISOLAP_Pos 7U /*!< ACTLR: DISOLAP Position */ -#define ICB_ACTLR_DISOLAP_Msk (1UL << ICB_ACTLR_DISOLAP_Pos) /*!< ACTLR: DISOLAP Mask */ - -#define ICB_ACTLR_DISOLAPS_Pos 6U /*!< ACTLR: DISOLAPS Position */ -#define ICB_ACTLR_DISOLAPS_Msk (1UL << ICB_ACTLR_DISOLAPS_Pos) /*!< ACTLR: DISOLAPS Mask */ - -#define ICB_ACTLR_DISLOBR_Pos 5U /*!< ACTLR: DISLOBR Position */ -#define ICB_ACTLR_DISLOBR_Msk (1UL << ICB_ACTLR_DISLOBR_Pos) /*!< ACTLR: DISLOBR Mask */ - -#define ICB_ACTLR_DISLO_Pos 4U /*!< ACTLR: DISLO Position */ -#define ICB_ACTLR_DISLO_Msk (1UL << ICB_ACTLR_DISLO_Pos) /*!< ACTLR: DISLO Mask */ - -#define ICB_ACTLR_DISLOLEP_Pos 3U /*!< ACTLR: DISLOLEP Position */ -#define ICB_ACTLR_DISLOLEP_Msk (1UL << ICB_ACTLR_DISLOLEP_Pos) /*!< ACTLR: DISLOLEP Mask */ - -#define ICB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define ICB_ACTLR_DISFOLD_Msk (1UL << ICB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -/* Interrupt Controller Type Register Definitions */ -#define ICB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define ICB_ICTR_INTLINESNUM_Msk (0xFUL /*<< ICB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_ICB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[3U]; - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) ITM Device Type Register */ - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup MemSysCtl_Type Memory System Control Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Memory System Control Registers (MEMSYSCTL) - @{ - */ - -/** - \brief Structure type to access the Memory System Control Registers (MEMSYSCTL). - */ -typedef struct -{ - __IOM uint32_t MSCR; /*!< Offset: 0x000 (R/W) Memory System Control Register */ - __IOM uint32_t PFCR; /*!< Offset: 0x004 (R/W) Prefetcher Control Register */ - uint32_t RESERVED1[2U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x010 (R/W) ITCM Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x014 (R/W) DTCM Control Register */ - __IOM uint32_t PAHBCR; /*!< Offset: 0x018 (R/W) P-AHB Control Register */ - uint32_t RESERVED2[313U]; - __IOM uint32_t ITGU_CTRL; /*!< Offset: 0x500 (R/W) ITGU Control Register */ - __IOM uint32_t ITGU_CFG; /*!< Offset: 0x504 (R/W) ITGU Configuration Register */ - uint32_t RESERVED3[2U]; - __IOM uint32_t ITGU_LUT[16U]; /*!< Offset: 0x510 (R/W) ITGU Look Up Table Register */ - uint32_t RESERVED4[44U]; - __IOM uint32_t DTGU_CTRL; /*!< Offset: 0x600 (R/W) DTGU Control Registers */ - __IOM uint32_t DTGU_CFG; /*!< Offset: 0x604 (R/W) DTGU Configuration Register */ - uint32_t RESERVED5[2U]; - __IOM uint32_t DTGU_LUT[16U]; /*!< Offset: 0x610 (R/W) DTGU Look Up Table Register */ -} MemSysCtl_Type; - -/* MEMSYSCTL Memory System Control Register (MSCR) Register Definitions */ -#define MEMSYSCTL_MSCR_CPWRDN_Pos 17U /*!< MEMSYSCTL MSCR: CPWRDN Position */ -#define MEMSYSCTL_MSCR_CPWRDN_Msk (0x1UL << MEMSYSCTL_MSCR_CPWRDN_Pos) /*!< MEMSYSCTL MSCR: CPWRDN Mask */ - -#define MEMSYSCTL_MSCR_DCCLEAN_Pos 16U /*!< MEMSYSCTL MSCR: DCCLEAN Position */ -#define MEMSYSCTL_MSCR_DCCLEAN_Msk (0x1UL << MEMSYSCTL_MSCR_DCCLEAN_Pos) /*!< MEMSYSCTL MSCR: DCCLEAN Mask */ - -#define MEMSYSCTL_MSCR_ICACTIVE_Pos 13U /*!< MEMSYSCTL MSCR: ICACTIVE Position */ -#define MEMSYSCTL_MSCR_ICACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_ICACTIVE_Pos) /*!< MEMSYSCTL MSCR: ICACTIVE Mask */ - -#define MEMSYSCTL_MSCR_DCACTIVE_Pos 12U /*!< MEMSYSCTL MSCR: DCACTIVE Position */ -#define MEMSYSCTL_MSCR_DCACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_DCACTIVE_Pos) /*!< MEMSYSCTL MSCR: DCACTIVE Mask */ - -#define MEMSYSCTL_MSCR_TECCCHKDIS_Pos 4U /*!< MEMSYSCTL MSCR: TECCCHKDIS Position */ -#define MEMSYSCTL_MSCR_TECCCHKDIS_Msk (0x1UL << MEMSYSCTL_MSCR_TECCCHKDIS_Pos) /*!< MEMSYSCTL MSCR: TECCCHKDIS Mask */ - -#define MEMSYSCTL_MSCR_EVECCFAULT_Pos 3U /*!< MEMSYSCTL MSCR: EVECCFAULT Position */ -#define MEMSYSCTL_MSCR_EVECCFAULT_Msk (0x1UL << MEMSYSCTL_MSCR_EVECCFAULT_Pos) /*!< MEMSYSCTL MSCR: EVECCFAULT Mask */ - -#define MEMSYSCTL_MSCR_FORCEWT_Pos 2U /*!< MEMSYSCTL MSCR: FORCEWT Position */ -#define MEMSYSCTL_MSCR_FORCEWT_Msk (0x1UL << MEMSYSCTL_MSCR_FORCEWT_Pos) /*!< MEMSYSCTL MSCR: FORCEWT Mask */ - -#define MEMSYSCTL_MSCR_ECCEN_Pos 1U /*!< MEMSYSCTL MSCR: ECCEN Position */ -#define MEMSYSCTL_MSCR_ECCEN_Msk (0x1UL << MEMSYSCTL_MSCR_ECCEN_Pos) /*!< MEMSYSCTL MSCR: ECCEN Mask */ - -/* MEMSYSCTL Prefetcher Control Register (PFCR) Register Definitions */ -#define MEMSYSCTL_PFCR_MAX_OS_Pos 7U /*!< MEMSYSCTL PFCR: MAX_OS Position */ -#define MEMSYSCTL_PFCR_MAX_OS_Msk (0x7UL << MEMSYSCTL_PFCR_MAX_OS_Pos) /*!< MEMSYSCTL PFCR: MAX_OS Mask */ - -#define MEMSYSCTL_PFCR_MAX_LA_Pos 4U /*!< MEMSYSCTL PFCR: MAX_LA Position */ -#define MEMSYSCTL_PFCR_MAX_LA_Msk (0x7UL << MEMSYSCTL_PFCR_MAX_LA_Pos) /*!< MEMSYSCTL PFCR: MAX_LA Mask */ - -#define MEMSYSCTL_PFCR_MIN_LA_Pos 1U /*!< MEMSYSCTL PFCR: MIN_LA Position */ -#define MEMSYSCTL_PFCR_MIN_LA_Msk (0x7UL << MEMSYSCTL_PFCR_MIN_LA_Pos) /*!< MEMSYSCTL PFCR: MIN_LA Mask */ - -#define MEMSYSCTL_PFCR_ENABLE_Pos 0U /*!< MEMSYSCTL PFCR: ENABLE Position */ -#define MEMSYSCTL_PFCR_ENABLE_Msk (0x1UL /*<< MEMSYSCTL_PFCR_ENABLE_Pos*/) /*!< MEMSYSCTL PFCR: ENABLE Mask */ - -/* MEMSYSCTL ITCM Control Register (ITCMCR) Register Definitions */ -#define MEMSYSCTL_ITCMCR_SZ_Pos 3U /*!< MEMSYSCTL ITCMCR: SZ Position */ -#define MEMSYSCTL_ITCMCR_SZ_Msk (0xFUL << MEMSYSCTL_ITCMCR_SZ_Pos) /*!< MEMSYSCTL ITCMCR: SZ Mask */ - -#define MEMSYSCTL_ITCMCR_EN_Pos 0U /*!< MEMSYSCTL ITCMCR: EN Position */ -#define MEMSYSCTL_ITCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_ITCMCR_EN_Pos*/) /*!< MEMSYSCTL ITCMCR: EN Mask */ - -/* MEMSYSCTL DTCM Control Register (DTCMCR) Register Definitions */ -#define MEMSYSCTL_DTCMCR_SZ_Pos 3U /*!< MEMSYSCTL DTCMCR: SZ Position */ -#define MEMSYSCTL_DTCMCR_SZ_Msk (0xFUL << MEMSYSCTL_DTCMCR_SZ_Pos) /*!< MEMSYSCTL DTCMCR: SZ Mask */ - -#define MEMSYSCTL_DTCMCR_EN_Pos 0U /*!< MEMSYSCTL DTCMCR: EN Position */ -#define MEMSYSCTL_DTCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_DTCMCR_EN_Pos*/) /*!< MEMSYSCTL DTCMCR: EN Mask */ - -/* MEMSYSCTL P-AHB Control Register (PAHBCR) Register Definitions */ -#define MEMSYSCTL_PAHBCR_SZ_Pos 1U /*!< MEMSYSCTL PAHBCR: SZ Position */ -#define MEMSYSCTL_PAHBCR_SZ_Msk (0x7UL << MEMSYSCTL_PAHBCR_SZ_Pos) /*!< MEMSYSCTL PAHBCR: SZ Mask */ - -#define MEMSYSCTL_PAHBCR_EN_Pos 0U /*!< MEMSYSCTL PAHBCR: EN Position */ -#define MEMSYSCTL_PAHBCR_EN_Msk (0x1UL /*<< MEMSYSCTL_PAHBCR_EN_Pos*/) /*!< MEMSYSCTL PAHBCR: EN Mask */ - -/* MEMSYSCTL ITGU Control Register (ITGU_CTRL) Register Definitions */ -#define MEMSYSCTL_ITGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL ITGU_CTRL: DEREN Position */ -#define MEMSYSCTL_ITGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_ITGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL ITGU_CTRL: DEREN Mask */ - -#define MEMSYSCTL_ITGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL ITGU_CTRL: DBFEN Position */ -#define MEMSYSCTL_ITGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_ITGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL ITGU_CTRL: DBFEN Mask */ - -/* MEMSYSCTL ITGU Configuration Register (ITGU_CFG) Register Definitions */ -#define MEMSYSCTL_ITGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL ITGU_CFG: PRESENT Position */ -#define MEMSYSCTL_ITGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_ITGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL ITGU_CFG: PRESENT Mask */ - -#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Position */ -#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Mask */ - -#define MEMSYSCTL_ITGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL ITGU_CFG: BLKSZ Position */ -#define MEMSYSCTL_ITGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_ITGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL ITGU_CFG: BLKSZ Mask */ - -/* MEMSYSCTL DTGU Control Registers (DTGU_CTRL) Register Definitions */ -#define MEMSYSCTL_DTGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL DTGU_CTRL: DEREN Position */ -#define MEMSYSCTL_DTGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_DTGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL DTGU_CTRL: DEREN Mask */ - -#define MEMSYSCTL_DTGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL DTGU_CTRL: DBFEN Position */ -#define MEMSYSCTL_DTGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_DTGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL DTGU_CTRL: DBFEN Mask */ - -/* MEMSYSCTL DTGU Configuration Register (DTGU_CFG) Register Definitions */ -#define MEMSYSCTL_DTGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL DTGU_CFG: PRESENT Position */ -#define MEMSYSCTL_DTGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_DTGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL DTGU_CFG: PRESENT Mask */ - -#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Position */ -#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Mask */ - -#define MEMSYSCTL_DTGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL DTGU_CFG: BLKSZ Position */ -#define MEMSYSCTL_DTGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_DTGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL DTGU_CFG: BLKSZ Mask */ - - -/*@}*/ /* end of group MemSysCtl_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup PwrModCtl_Type Power Mode Control Registers - \brief Type definitions for the Power Mode Control Registers (PWRMODCTL) - @{ - */ - -/** - \brief Structure type to access the Power Mode Control Registers (PWRMODCTL). - */ -typedef struct -{ - __IOM uint32_t CPDLPSTATE; /*!< Offset: 0x000 (R/W) Core Power Domain Low Power State Register */ - __IOM uint32_t DPDLPSTATE; /*!< Offset: 0x004 (R/W) Debug Power Domain Low Power State Register */ -} PwrModCtl_Type; - -/* PWRMODCTL Core Power Domain Low Power State (CPDLPSTATE) Register Definitions */ -#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos 8U /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Mask */ - -#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos 4U /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Mask */ - -#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos 0U /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Msk (0x3UL /*<< PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos*/) /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Mask */ - -/* PWRMODCTL Debug Power Domain Low Power State (DPDLPSTATE) Register Definitions */ -#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos 0U /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Position */ -#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Msk (0x3UL /*<< PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos*/) /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Mask */ - -/*@}*/ /* end of group PwrModCtl_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup EWIC_Type External Wakeup Interrupt Controller Registers - \brief Type definitions for the External Wakeup Interrupt Controller Registers (EWIC) - @{ - */ - -/** - \brief Structure type to access the External Wakeup Interrupt Controller Registers (EWIC). - */ -typedef struct -{ - __OM uint32_t EVENTSPR; /*!< Offset: 0x000 ( /W) Event Set Pending Register */ - uint32_t RESERVED0[31U]; - __IM uint32_t EVENTMASKA; /*!< Offset: 0x080 (R/W) Event Mask A Register */ - __IM uint32_t EVENTMASK[15]; /*!< Offset: 0x084 (R/W) Event Mask Register */ -} EWIC_Type; - -/* EWIC External Wakeup Interrupt Controller (EVENTSPR) Register Definitions */ -#define EWIC_EVENTSPR_EDBGREQ_Pos 2U /*!< EWIC EVENTSPR: EDBGREQ Position */ -#define EWIC_EVENTSPR_EDBGREQ_Msk (0x1UL << EWIC_EVENTSPR_EDBGREQ_Pos) /*!< EWIC EVENTSPR: EDBGREQ Mask */ - -#define EWIC_EVENTSPR_NMI_Pos 1U /*!< EWIC EVENTSPR: NMI Position */ -#define EWIC_EVENTSPR_NMI_Msk (0x1UL << EWIC_EVENTSPR_NMI_Pos) /*!< EWIC EVENTSPR: NMI Mask */ - -#define EWIC_EVENTSPR_EVENT_Pos 0U /*!< EWIC EVENTSPR: EVENT Position */ -#define EWIC_EVENTSPR_EVENT_Msk (0x1UL /*<< EWIC_EVENTSPR_EVENT_Pos*/) /*!< EWIC EVENTSPR: EVENT Mask */ - -/* EWIC External Wakeup Interrupt Controller (EVENTMASKA) Register Definitions */ -#define EWIC_EVENTMASKA_EDBGREQ_Pos 2U /*!< EWIC EVENTMASKA: EDBGREQ Position */ -#define EWIC_EVENTMASKA_EDBGREQ_Msk (0x1UL << EWIC_EVENTMASKA_EDBGREQ_Pos) /*!< EWIC EVENTMASKA: EDBGREQ Mask */ - -#define EWIC_EVENTMASKA_NMI_Pos 1U /*!< EWIC EVENTMASKA: NMI Position */ -#define EWIC_EVENTMASKA_NMI_Msk (0x1UL << EWIC_EVENTMASKA_NMI_Pos) /*!< EWIC EVENTMASKA: NMI Mask */ - -#define EWIC_EVENTMASKA_EVENT_Pos 0U /*!< EWIC EVENTMASKA: EVENT Position */ -#define EWIC_EVENTMASKA_EVENT_Msk (0x1UL /*<< EWIC_EVENTMASKA_EVENT_Pos*/) /*!< EWIC EVENTMASKA: EVENT Mask */ - -/* EWIC External Wakeup Interrupt Controller (EVENTMASK) Register Definitions */ -#define EWIC_EVENTMASK_IRQ_Pos 0U /*!< EWIC EVENTMASKA: IRQ Position */ -#define EWIC_EVENTMASK_IRQ_Msk (0xFFFFFFFFUL /*<< EWIC_EVENTMASKA_IRQ_Pos*/) /*!< EWIC EVENTMASKA: IRQ Mask */ - -/*@}*/ /* end of group EWIC_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup ErrBnk_Type Error Banking Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Error Banking Registers (ERRBNK) - @{ - */ - -/** - \brief Structure type to access the Error Banking Registers (ERRBNK). - */ -typedef struct -{ - __IOM uint32_t IEBR0; /*!< Offset: 0x000 (R/W) Instruction Cache Error Bank Register 0 */ - __IOM uint32_t IEBR1; /*!< Offset: 0x004 (R/W) Instruction Cache Error Bank Register 1 */ - uint32_t RESERVED0[2U]; - __IOM uint32_t DEBR0; /*!< Offset: 0x010 (R/W) Data Cache Error Bank Register 0 */ - __IOM uint32_t DEBR1; /*!< Offset: 0x014 (R/W) Data Cache Error Bank Register 1 */ - uint32_t RESERVED1[2U]; - __IOM uint32_t TEBR0; /*!< Offset: 0x020 (R/W) TCM Error Bank Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t TEBR1; /*!< Offset: 0x028 (R/W) TCM Error Bank Register 1 */ -} ErrBnk_Type; - -/* ERRBNK Instruction Cache Error Bank Register 0 (IEBR0) Register Definitions */ -#define ERRBNK_IEBR0_SWDEF_Pos 30U /*!< ERRBNK IEBR0: SWDEF Position */ -#define ERRBNK_IEBR0_SWDEF_Msk (0x3UL << ERRBNK_IEBR0_SWDEF_Pos) /*!< ERRBNK IEBR0: SWDEF Mask */ - -#define ERRBNK_IEBR0_BANK_Pos 16U /*!< ERRBNK IEBR0: BANK Position */ -#define ERRBNK_IEBR0_BANK_Msk (0x1UL << ERRBNK_IEBR0_BANK_Pos) /*!< ERRBNK IEBR0: BANK Mask */ - -#define ERRBNK_IEBR0_LOCATION_Pos 2U /*!< ERRBNK IEBR0: LOCATION Position */ -#define ERRBNK_IEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR0_LOCATION_Pos) /*!< ERRBNK IEBR0: LOCATION Mask */ - -#define ERRBNK_IEBR0_LOCKED_Pos 1U /*!< ERRBNK IEBR0: LOCKED Position */ -#define ERRBNK_IEBR0_LOCKED_Msk (0x1UL << ERRBNK_IEBR0_LOCKED_Pos) /*!< ERRBNK IEBR0: LOCKED Mask */ - -#define ERRBNK_IEBR0_VALID_Pos 0U /*!< ERRBNK IEBR0: VALID Position */ -#define ERRBNK_IEBR0_VALID_Msk (0x1UL << /*ERRBNK_IEBR0_VALID_Pos*/) /*!< ERRBNK IEBR0: VALID Mask */ - -/* ERRBNK Instruction Cache Error Bank Register 1 (IEBR1) Register Definitions */ -#define ERRBNK_IEBR1_SWDEF_Pos 30U /*!< ERRBNK IEBR1: SWDEF Position */ -#define ERRBNK_IEBR1_SWDEF_Msk (0x3UL << ERRBNK_IEBR1_SWDEF_Pos) /*!< ERRBNK IEBR1: SWDEF Mask */ - -#define ERRBNK_IEBR1_BANK_Pos 16U /*!< ERRBNK IEBR1: BANK Position */ -#define ERRBNK_IEBR1_BANK_Msk (0x1UL << ERRBNK_IEBR1_BANK_Pos) /*!< ERRBNK IEBR1: BANK Mask */ - -#define ERRBNK_IEBR1_LOCATION_Pos 2U /*!< ERRBNK IEBR1: LOCATION Position */ -#define ERRBNK_IEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR1_LOCATION_Pos) /*!< ERRBNK IEBR1: LOCATION Mask */ - -#define ERRBNK_IEBR1_LOCKED_Pos 1U /*!< ERRBNK IEBR1: LOCKED Position */ -#define ERRBNK_IEBR1_LOCKED_Msk (0x1UL << ERRBNK_IEBR1_LOCKED_Pos) /*!< ERRBNK IEBR1: LOCKED Mask */ - -#define ERRBNK_IEBR1_VALID_Pos 0U /*!< ERRBNK IEBR1: VALID Position */ -#define ERRBNK_IEBR1_VALID_Msk (0x1UL << /*ERRBNK_IEBR1_VALID_Pos*/) /*!< ERRBNK IEBR1: VALID Mask */ - -/* ERRBNK Data Cache Error Bank Register 0 (DEBR0) Register Definitions */ -#define ERRBNK_DEBR0_SWDEF_Pos 30U /*!< ERRBNK DEBR0: SWDEF Position */ -#define ERRBNK_DEBR0_SWDEF_Msk (0x3UL << ERRBNK_DEBR0_SWDEF_Pos) /*!< ERRBNK DEBR0: SWDEF Mask */ - -#define ERRBNK_DEBR0_TYPE_Pos 17U /*!< ERRBNK DEBR0: TYPE Position */ -#define ERRBNK_DEBR0_TYPE_Msk (0x1UL << ERRBNK_DEBR0_TYPE_Pos) /*!< ERRBNK DEBR0: TYPE Mask */ - -#define ERRBNK_DEBR0_BANK_Pos 16U /*!< ERRBNK DEBR0: BANK Position */ -#define ERRBNK_DEBR0_BANK_Msk (0x1UL << ERRBNK_DEBR0_BANK_Pos) /*!< ERRBNK DEBR0: BANK Mask */ - -#define ERRBNK_DEBR0_LOCATION_Pos 2U /*!< ERRBNK DEBR0: LOCATION Position */ -#define ERRBNK_DEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR0_LOCATION_Pos) /*!< ERRBNK DEBR0: LOCATION Mask */ - -#define ERRBNK_DEBR0_LOCKED_Pos 1U /*!< ERRBNK DEBR0: LOCKED Position */ -#define ERRBNK_DEBR0_LOCKED_Msk (0x1UL << ERRBNK_DEBR0_LOCKED_Pos) /*!< ERRBNK DEBR0: LOCKED Mask */ - -#define ERRBNK_DEBR0_VALID_Pos 0U /*!< ERRBNK DEBR0: VALID Position */ -#define ERRBNK_DEBR0_VALID_Msk (0x1UL << /*ERRBNK_DEBR0_VALID_Pos*/) /*!< ERRBNK DEBR0: VALID Mask */ - -/* ERRBNK Data Cache Error Bank Register 1 (DEBR1) Register Definitions */ -#define ERRBNK_DEBR1_SWDEF_Pos 30U /*!< ERRBNK DEBR1: SWDEF Position */ -#define ERRBNK_DEBR1_SWDEF_Msk (0x3UL << ERRBNK_DEBR1_SWDEF_Pos) /*!< ERRBNK DEBR1: SWDEF Mask */ - -#define ERRBNK_DEBR1_TYPE_Pos 17U /*!< ERRBNK DEBR1: TYPE Position */ -#define ERRBNK_DEBR1_TYPE_Msk (0x1UL << ERRBNK_DEBR1_TYPE_Pos) /*!< ERRBNK DEBR1: TYPE Mask */ - -#define ERRBNK_DEBR1_BANK_Pos 16U /*!< ERRBNK DEBR1: BANK Position */ -#define ERRBNK_DEBR1_BANK_Msk (0x1UL << ERRBNK_DEBR1_BANK_Pos) /*!< ERRBNK DEBR1: BANK Mask */ - -#define ERRBNK_DEBR1_LOCATION_Pos 2U /*!< ERRBNK DEBR1: LOCATION Position */ -#define ERRBNK_DEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR1_LOCATION_Pos) /*!< ERRBNK DEBR1: LOCATION Mask */ - -#define ERRBNK_DEBR1_LOCKED_Pos 1U /*!< ERRBNK DEBR1: LOCKED Position */ -#define ERRBNK_DEBR1_LOCKED_Msk (0x1UL << ERRBNK_DEBR1_LOCKED_Pos) /*!< ERRBNK DEBR1: LOCKED Mask */ - -#define ERRBNK_DEBR1_VALID_Pos 0U /*!< ERRBNK DEBR1: VALID Position */ -#define ERRBNK_DEBR1_VALID_Msk (0x1UL << /*ERRBNK_DEBR1_VALID_Pos*/) /*!< ERRBNK DEBR1: VALID Mask */ - -/* ERRBNK TCM Error Bank Register 0 (TEBR0) Register Definitions */ -#define ERRBNK_TEBR0_SWDEF_Pos 30U /*!< ERRBNK TEBR0: SWDEF Position */ -#define ERRBNK_TEBR0_SWDEF_Msk (0x3UL << ERRBNK_TEBR0_SWDEF_Pos) /*!< ERRBNK TEBR0: SWDEF Mask */ - -#define ERRBNK_TEBR0_POISON_Pos 28U /*!< ERRBNK TEBR0: POISON Position */ -#define ERRBNK_TEBR0_POISON_Msk (0x1UL << ERRBNK_TEBR0_POISON_Pos) /*!< ERRBNK TEBR0: POISON Mask */ - -#define ERRBNK_TEBR0_TYPE_Pos 27U /*!< ERRBNK TEBR0: TYPE Position */ -#define ERRBNK_TEBR0_TYPE_Msk (0x1UL << ERRBNK_TEBR0_TYPE_Pos) /*!< ERRBNK TEBR0: TYPE Mask */ - -#define ERRBNK_TEBR0_BANK_Pos 24U /*!< ERRBNK TEBR0: BANK Position */ -#define ERRBNK_TEBR0_BANK_Msk (0x3UL << ERRBNK_TEBR0_BANK_Pos) /*!< ERRBNK TEBR0: BANK Mask */ - -#define ERRBNK_TEBR0_LOCATION_Pos 2U /*!< ERRBNK TEBR0: LOCATION Position */ -#define ERRBNK_TEBR0_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR0_LOCATION_Pos) /*!< ERRBNK TEBR0: LOCATION Mask */ - -#define ERRBNK_TEBR0_LOCKED_Pos 1U /*!< ERRBNK TEBR0: LOCKED Position */ -#define ERRBNK_TEBR0_LOCKED_Msk (0x1UL << ERRBNK_TEBR0_LOCKED_Pos) /*!< ERRBNK TEBR0: LOCKED Mask */ - -#define ERRBNK_TEBR0_VALID_Pos 0U /*!< ERRBNK TEBR0: VALID Position */ -#define ERRBNK_TEBR0_VALID_Msk (0x1UL << /*ERRBNK_TEBR0_VALID_Pos*/) /*!< ERRBNK TEBR0: VALID Mask */ - -/* ERRBNK TCM Error Bank Register 1 (TEBR1) Register Definitions */ -#define ERRBNK_TEBR1_SWDEF_Pos 30U /*!< ERRBNK TEBR1: SWDEF Position */ -#define ERRBNK_TEBR1_SWDEF_Msk (0x3UL << ERRBNK_TEBR1_SWDEF_Pos) /*!< ERRBNK TEBR1: SWDEF Mask */ - -#define ERRBNK_TEBR1_POISON_Pos 28U /*!< ERRBNK TEBR1: POISON Position */ -#define ERRBNK_TEBR1_POISON_Msk (0x1UL << ERRBNK_TEBR1_POISON_Pos) /*!< ERRBNK TEBR1: POISON Mask */ - -#define ERRBNK_TEBR1_TYPE_Pos 27U /*!< ERRBNK TEBR1: TYPE Position */ -#define ERRBNK_TEBR1_TYPE_Msk (0x1UL << ERRBNK_TEBR1_TYPE_Pos) /*!< ERRBNK TEBR1: TYPE Mask */ - -#define ERRBNK_TEBR1_BANK_Pos 24U /*!< ERRBNK TEBR1: BANK Position */ -#define ERRBNK_TEBR1_BANK_Msk (0x3UL << ERRBNK_TEBR1_BANK_Pos) /*!< ERRBNK TEBR1: BANK Mask */ - -#define ERRBNK_TEBR1_LOCATION_Pos 2U /*!< ERRBNK TEBR1: LOCATION Position */ -#define ERRBNK_TEBR1_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR1_LOCATION_Pos) /*!< ERRBNK TEBR1: LOCATION Mask */ - -#define ERRBNK_TEBR1_LOCKED_Pos 1U /*!< ERRBNK TEBR1: LOCKED Position */ -#define ERRBNK_TEBR1_LOCKED_Msk (0x1UL << ERRBNK_TEBR1_LOCKED_Pos) /*!< ERRBNK TEBR1: LOCKED Mask */ - -#define ERRBNK_TEBR1_VALID_Pos 0U /*!< ERRBNK TEBR1: VALID Position */ -#define ERRBNK_TEBR1_VALID_Msk (0x1UL << /*ERRBNK_TEBR1_VALID_Pos*/) /*!< ERRBNK TEBR1: VALID Mask */ - -/*@}*/ /* end of group ErrBnk_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup PrcCfgInf_Type Processor Configuration Information Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Processor Configuration Information Registerss (PRCCFGINF) - @{ - */ - -/** - \brief Structure type to access the Processor Configuration Information Registerss (PRCCFGINF). - */ -typedef struct -{ - __OM uint32_t CFGINFOSEL; /*!< Offset: 0x000 ( /W) Processor Configuration Information Selection Register */ - __IM uint32_t CFGINFORD; /*!< Offset: 0x004 (R/ ) Processor Configuration Information Read Data Register */ -} PrcCfgInf_Type; - -/* PRCCFGINF Processor Configuration Information Selection Register (CFGINFOSEL) Definitions */ - -/* PRCCFGINF Processor Configuration Information Read Data Register (CFGINFORD) Definitions */ - -/*@}*/ /* end of group PrcCfgInf_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup STL_Type Software Test Library Observation Registers - \brief Type definitions for the Software Test Library Observation Registerss (STL) - @{ - */ - -/** - \brief Structure type to access the Software Test Library Observation Registerss (STL). - */ -typedef struct -{ - __IM uint32_t STLNVICPENDOR; /*!< Offset: 0x000 (R/ ) NVIC Pending Priority Tree Register */ - __IM uint32_t STLNVICACTVOR; /*!< Offset: 0x004 (R/ ) NVIC Active Priority Tree Register */ - uint32_t RESERVED0[2U]; - __OM uint32_t STLIDMPUSR; /*!< Offset: 0x010 ( /W) MPU Sanple Register */ - __IM uint32_t STLIMPUOR; /*!< Offset: 0x014 (R/ ) MPU Region Hit Register */ - __IM uint32_t STLD0MPUOR; /*!< Offset: 0x018 (R/ ) MPU Memory Attributes Register 0 */ - __IM uint32_t STLD1MPUOR; /*!< Offset: 0x01C (R/ ) MPU Memory Attributes Register 1 */ - -} STL_Type; - -/* STL Software Test Library Observation Register (STLNVICPENDOR) Definitions */ -#define STL_STLNVICPENDOR_VALID_Pos 18U /*!< STL STLNVICPENDOR: VALID Position */ -#define STL_STLNVICPENDOR_VALID_Msk (0x1UL << STL_STLNVICPENDOR_VALID_Pos) /*!< STL STLNVICPENDOR: VALID Mask */ - -#define STL_STLNVICPENDOR_TARGET_Pos 17U /*!< STL STLNVICPENDOR: TARGET Position */ -#define STL_STLNVICPENDOR_TARGET_Msk (0x1UL << STL_STLNVICPENDOR_TARGET_Pos) /*!< STL STLNVICPENDOR: TARGET Mask */ - -#define STL_STLNVICPENDOR_PRIORITY_Pos 9U /*!< STL STLNVICPENDOR: PRIORITY Position */ -#define STL_STLNVICPENDOR_PRIORITY_Msk (0xFFUL << STL_STLNVICPENDOR_PRIORITY_Pos) /*!< STL STLNVICPENDOR: PRIORITY Mask */ - -#define STL_STLNVICPENDOR_INTNUM_Pos 0U /*!< STL STLNVICPENDOR: INTNUM Position */ -#define STL_STLNVICPENDOR_INTNUM_Msk (0x1FFUL /*<< STL_STLNVICPENDOR_INTNUM_Pos*/) /*!< STL STLNVICPENDOR: INTNUM Mask */ - -/* STL Software Test Library Observation Register (STLNVICACTVOR) Definitions */ -#define STL_STLNVICACTVOR_VALID_Pos 18U /*!< STL STLNVICACTVOR: VALID Position */ -#define STL_STLNVICACTVOR_VALID_Msk (0x1UL << STL_STLNVICACTVOR_VALID_Pos) /*!< STL STLNVICACTVOR: VALID Mask */ - -#define STL_STLNVICACTVOR_TARGET_Pos 17U /*!< STL STLNVICACTVOR: TARGET Position */ -#define STL_STLNVICACTVOR_TARGET_Msk (0x1UL << STL_STLNVICACTVOR_TARGET_Pos) /*!< STL STLNVICACTVOR: TARGET Mask */ - -#define STL_STLNVICACTVOR_PRIORITY_Pos 9U /*!< STL STLNVICACTVOR: PRIORITY Position */ -#define STL_STLNVICACTVOR_PRIORITY_Msk (0xFFUL << STL_STLNVICACTVOR_PRIORITY_Pos) /*!< STL STLNVICACTVOR: PRIORITY Mask */ - -#define STL_STLNVICACTVOR_INTNUM_Pos 0U /*!< STL STLNVICACTVOR: INTNUM Position */ -#define STL_STLNVICACTVOR_INTNUM_Msk (0x1FFUL /*<< STL_STLNVICACTVOR_INTNUM_Pos*/) /*!< STL STLNVICACTVOR: INTNUM Mask */ - -/* STL Software Test Library Observation Register (STLIDMPUSR) Definitions */ -#define STL_STLIDMPUSR_ADDR_Pos 5U /*!< STL STLIDMPUSR: ADDR Position */ -#define STL_STLIDMPUSR_ADDR_Msk (0x7FFFFFFUL << STL_STLIDMPUSR_ADDR_Pos) /*!< STL STLIDMPUSR: ADDR Mask */ - -#define STL_STLIDMPUSR_INSTR_Pos 2U /*!< STL STLIDMPUSR: INSTR Position */ -#define STL_STLIDMPUSR_INSTR_Msk (0x1UL << STL_STLIDMPUSR_INSTR_Pos) /*!< STL STLIDMPUSR: INSTR Mask */ - -#define STL_STLIDMPUSR_DATA_Pos 1U /*!< STL STLIDMPUSR: DATA Position */ -#define STL_STLIDMPUSR_DATA_Msk (0x1UL << STL_STLIDMPUSR_DATA_Pos) /*!< STL STLIDMPUSR: DATA Mask */ - -/* STL Software Test Library Observation Register (STLIMPUOR) Definitions */ -#define STL_STLIMPUOR_HITREGION_Pos 9U /*!< STL STLIMPUOR: HITREGION Position */ -#define STL_STLIMPUOR_HITREGION_Msk (0xFFUL << STL_STLIMPUOR_HITREGION_Pos) /*!< STL STLIMPUOR: HITREGION Mask */ - -#define STL_STLIMPUOR_ATTR_Pos 0U /*!< STL STLIMPUOR: ATTR Position */ -#define STL_STLIMPUOR_ATTR_Msk (0x1FFUL /*<< STL_STLIMPUOR_ATTR_Pos*/) /*!< STL STLIMPUOR: ATTR Mask */ - -/* STL Software Test Library Observation Register (STLD0MPUOR) Definitions */ -#define STL_STLD0MPUOR_HITREGION_Pos 9U /*!< STL STLD0MPUOR: HITREGION Position */ -#define STL_STLD0MPUOR_HITREGION_Msk (0xFFUL << STL_STLD0MPUOR_HITREGION_Pos) /*!< STL STLD0MPUOR: HITREGION Mask */ - -#define STL_STLD0MPUOR_ATTR_Pos 0U /*!< STL STLD0MPUOR: ATTR Position */ -#define STL_STLD0MPUOR_ATTR_Msk (0x1FFUL /*<< STL_STLD0MPUOR_ATTR_Pos*/) /*!< STL STLD0MPUOR: ATTR Mask */ - -/* STL Software Test Library Observation Register (STLD1MPUOR) Definitions */ -#define STL_STLD1MPUOR_HITREGION_Pos 9U /*!< STL STLD1MPUOR: HITREGION Position */ -#define STL_STLD1MPUOR_HITREGION_Msk (0xFFUL << STL_STLD1MPUOR_HITREGION_Pos) /*!< STL STLD1MPUOR: HITREGION Mask */ - -#define STL_STLD1MPUOR_ATTR_Pos 0U /*!< STL STLD1MPUOR: ATTR Position */ -#define STL_STLD1MPUOR_ATTR_Msk (0x1FFUL /*<< STL_STLD1MPUOR_ATTR_Pos*/) /*!< STL STLD1MPUOR: ATTR Mask */ - -/*@}*/ /* end of group STL_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFmt_Pos 0U /*!< TPI FFCR: EnFmt Position */ -#define TPI_FFCR_EnFmt_Msk (0x3UL << /*TPI_FFCR_EnFmt_Pos*/) /*!< TPI FFCR: EnFmt Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_PMU Performance Monitoring Unit (PMU) - \brief Type definitions for the Performance Monitoring Unit (PMU) - @{ - */ - -/** - \brief Structure type to access the Performance Monitoring Unit (PMU). - */ -typedef struct -{ - __IOM uint32_t EVCNTR[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x0 (R/W) PMU Event Counter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED0[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCNTR; /*!< Offset: 0x7C (R/W) PMU Cycle Counter Register */ - uint32_t RESERVED1[224]; - __IOM uint32_t EVTYPER[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x400 (R/W) PMU Event Type and Filter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED2[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCFILTR; /*!< Offset: 0x47C (R/W) PMU Cycle Counter Filter Register */ - uint32_t RESERVED3[480]; - __IOM uint32_t CNTENSET; /*!< Offset: 0xC00 (R/W) PMU Count Enable Set Register */ - uint32_t RESERVED4[7]; - __IOM uint32_t CNTENCLR; /*!< Offset: 0xC20 (R/W) PMU Count Enable Clear Register */ - uint32_t RESERVED5[7]; - __IOM uint32_t INTENSET; /*!< Offset: 0xC40 (R/W) PMU Interrupt Enable Set Register */ - uint32_t RESERVED6[7]; - __IOM uint32_t INTENCLR; /*!< Offset: 0xC60 (R/W) PMU Interrupt Enable Clear Register */ - uint32_t RESERVED7[7]; - __IOM uint32_t OVSCLR; /*!< Offset: 0xC80 (R/W) PMU Overflow Flag Status Clear Register */ - uint32_t RESERVED8[7]; - __IOM uint32_t SWINC; /*!< Offset: 0xCA0 (R/W) PMU Software Increment Register */ - uint32_t RESERVED9[7]; - __IOM uint32_t OVSSET; /*!< Offset: 0xCC0 (R/W) PMU Overflow Flag Status Set Register */ - uint32_t RESERVED10[79]; - __IOM uint32_t TYPE; /*!< Offset: 0xE00 (R/W) PMU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0xE04 (R/W) PMU Control Register */ - uint32_t RESERVED11[108]; - __IOM uint32_t AUTHSTATUS; /*!< Offset: 0xFB8 (R/W) PMU Authentication Status Register */ - __IOM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/W) PMU Device Architecture Register */ - uint32_t RESERVED12[3]; - __IOM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/W) PMU Device Type Register */ - __IOM uint32_t PIDR4; /*!< Offset: 0xFD0 (R/W) PMU Peripheral Identification Register 4 */ - uint32_t RESERVED13[3]; - __IOM uint32_t PIDR0; /*!< Offset: 0xFE0 (R/W) PMU Peripheral Identification Register 0 */ - __IOM uint32_t PIDR1; /*!< Offset: 0xFE4 (R/W) PMU Peripheral Identification Register 1 */ - __IOM uint32_t PIDR2; /*!< Offset: 0xFE8 (R/W) PMU Peripheral Identification Register 2 */ - __IOM uint32_t PIDR3; /*!< Offset: 0xFEC (R/W) PMU Peripheral Identification Register 3 */ - __IOM uint32_t CIDR0; /*!< Offset: 0xFF0 (R/W) PMU Component Identification Register 0 */ - __IOM uint32_t CIDR1; /*!< Offset: 0xFF4 (R/W) PMU Component Identification Register 1 */ - __IOM uint32_t CIDR2; /*!< Offset: 0xFF8 (R/W) PMU Component Identification Register 2 */ - __IOM uint32_t CIDR3; /*!< Offset: 0xFFC (R/W) PMU Component Identification Register 3 */ -} PMU_Type; - -/** \brief PMU Event Counter Registers (0-30) Definitions */ - -#define PMU_EVCNTR_CNT_Pos 0U /*!< PMU EVCNTR: Counter Position */ -#define PMU_EVCNTR_CNT_Msk (0xFFFFUL /*<< PMU_EVCNTRx_CNT_Pos*/) /*!< PMU EVCNTR: Counter Mask */ - -/** \brief PMU Event Type and Filter Registers (0-30) Definitions */ - -#define PMU_EVTYPER_EVENTTOCNT_Pos 0U /*!< PMU EVTYPER: Event to Count Position */ -#define PMU_EVTYPER_EVENTTOCNT_Msk (0xFFFFUL /*<< EVTYPERx_EVENTTOCNT_Pos*/) /*!< PMU EVTYPER: Event to Count Mask */ - -/** \brief PMU Count Enable Set Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENSET: Event Counter 0 Enable Set Position */ -#define PMU_CNTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENSET_CNT0_ENABLE_Pos*/) /*!< PMU CNTENSET: Event Counter 0 Enable Set Mask */ - -#define PMU_CNTENSET_CNT1_ENABLE_Pos 1U /*!< PMU CNTENSET: Event Counter 1 Enable Set Position */ -#define PMU_CNTENSET_CNT1_ENABLE_Msk (1UL << PMU_CNTENSET_CNT1_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 1 Enable Set Mask */ - -#define PMU_CNTENSET_CNT2_ENABLE_Pos 2U /*!< PMU CNTENSET: Event Counter 2 Enable Set Position */ -#define PMU_CNTENSET_CNT2_ENABLE_Msk (1UL << PMU_CNTENSET_CNT2_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 2 Enable Set Mask */ - -#define PMU_CNTENSET_CNT3_ENABLE_Pos 3U /*!< PMU CNTENSET: Event Counter 3 Enable Set Position */ -#define PMU_CNTENSET_CNT3_ENABLE_Msk (1UL << PMU_CNTENSET_CNT3_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 3 Enable Set Mask */ - -#define PMU_CNTENSET_CNT4_ENABLE_Pos 4U /*!< PMU CNTENSET: Event Counter 4 Enable Set Position */ -#define PMU_CNTENSET_CNT4_ENABLE_Msk (1UL << PMU_CNTENSET_CNT4_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 4 Enable Set Mask */ - -#define PMU_CNTENSET_CNT5_ENABLE_Pos 5U /*!< PMU CNTENSET: Event Counter 5 Enable Set Position */ -#define PMU_CNTENSET_CNT5_ENABLE_Msk (1UL << PMU_CNTENSET_CNT5_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 5 Enable Set Mask */ - -#define PMU_CNTENSET_CNT6_ENABLE_Pos 6U /*!< PMU CNTENSET: Event Counter 6 Enable Set Position */ -#define PMU_CNTENSET_CNT6_ENABLE_Msk (1UL << PMU_CNTENSET_CNT6_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 6 Enable Set Mask */ - -#define PMU_CNTENSET_CNT7_ENABLE_Pos 7U /*!< PMU CNTENSET: Event Counter 7 Enable Set Position */ -#define PMU_CNTENSET_CNT7_ENABLE_Msk (1UL << PMU_CNTENSET_CNT7_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 7 Enable Set Mask */ - -#define PMU_CNTENSET_CNT8_ENABLE_Pos 8U /*!< PMU CNTENSET: Event Counter 8 Enable Set Position */ -#define PMU_CNTENSET_CNT8_ENABLE_Msk (1UL << PMU_CNTENSET_CNT8_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 8 Enable Set Mask */ - -#define PMU_CNTENSET_CNT9_ENABLE_Pos 9U /*!< PMU CNTENSET: Event Counter 9 Enable Set Position */ -#define PMU_CNTENSET_CNT9_ENABLE_Msk (1UL << PMU_CNTENSET_CNT9_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 9 Enable Set Mask */ - -#define PMU_CNTENSET_CNT10_ENABLE_Pos 10U /*!< PMU CNTENSET: Event Counter 10 Enable Set Position */ -#define PMU_CNTENSET_CNT10_ENABLE_Msk (1UL << PMU_CNTENSET_CNT10_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 10 Enable Set Mask */ - -#define PMU_CNTENSET_CNT11_ENABLE_Pos 11U /*!< PMU CNTENSET: Event Counter 11 Enable Set Position */ -#define PMU_CNTENSET_CNT11_ENABLE_Msk (1UL << PMU_CNTENSET_CNT11_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 11 Enable Set Mask */ - -#define PMU_CNTENSET_CNT12_ENABLE_Pos 12U /*!< PMU CNTENSET: Event Counter 12 Enable Set Position */ -#define PMU_CNTENSET_CNT12_ENABLE_Msk (1UL << PMU_CNTENSET_CNT12_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 12 Enable Set Mask */ - -#define PMU_CNTENSET_CNT13_ENABLE_Pos 13U /*!< PMU CNTENSET: Event Counter 13 Enable Set Position */ -#define PMU_CNTENSET_CNT13_ENABLE_Msk (1UL << PMU_CNTENSET_CNT13_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 13 Enable Set Mask */ - -#define PMU_CNTENSET_CNT14_ENABLE_Pos 14U /*!< PMU CNTENSET: Event Counter 14 Enable Set Position */ -#define PMU_CNTENSET_CNT14_ENABLE_Msk (1UL << PMU_CNTENSET_CNT14_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 14 Enable Set Mask */ - -#define PMU_CNTENSET_CNT15_ENABLE_Pos 15U /*!< PMU CNTENSET: Event Counter 15 Enable Set Position */ -#define PMU_CNTENSET_CNT15_ENABLE_Msk (1UL << PMU_CNTENSET_CNT15_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 15 Enable Set Mask */ - -#define PMU_CNTENSET_CNT16_ENABLE_Pos 16U /*!< PMU CNTENSET: Event Counter 16 Enable Set Position */ -#define PMU_CNTENSET_CNT16_ENABLE_Msk (1UL << PMU_CNTENSET_CNT16_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 16 Enable Set Mask */ - -#define PMU_CNTENSET_CNT17_ENABLE_Pos 17U /*!< PMU CNTENSET: Event Counter 17 Enable Set Position */ -#define PMU_CNTENSET_CNT17_ENABLE_Msk (1UL << PMU_CNTENSET_CNT17_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 17 Enable Set Mask */ - -#define PMU_CNTENSET_CNT18_ENABLE_Pos 18U /*!< PMU CNTENSET: Event Counter 18 Enable Set Position */ -#define PMU_CNTENSET_CNT18_ENABLE_Msk (1UL << PMU_CNTENSET_CNT18_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 18 Enable Set Mask */ - -#define PMU_CNTENSET_CNT19_ENABLE_Pos 19U /*!< PMU CNTENSET: Event Counter 19 Enable Set Position */ -#define PMU_CNTENSET_CNT19_ENABLE_Msk (1UL << PMU_CNTENSET_CNT19_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 19 Enable Set Mask */ - -#define PMU_CNTENSET_CNT20_ENABLE_Pos 20U /*!< PMU CNTENSET: Event Counter 20 Enable Set Position */ -#define PMU_CNTENSET_CNT20_ENABLE_Msk (1UL << PMU_CNTENSET_CNT20_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 20 Enable Set Mask */ - -#define PMU_CNTENSET_CNT21_ENABLE_Pos 21U /*!< PMU CNTENSET: Event Counter 21 Enable Set Position */ -#define PMU_CNTENSET_CNT21_ENABLE_Msk (1UL << PMU_CNTENSET_CNT21_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 21 Enable Set Mask */ - -#define PMU_CNTENSET_CNT22_ENABLE_Pos 22U /*!< PMU CNTENSET: Event Counter 22 Enable Set Position */ -#define PMU_CNTENSET_CNT22_ENABLE_Msk (1UL << PMU_CNTENSET_CNT22_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 22 Enable Set Mask */ - -#define PMU_CNTENSET_CNT23_ENABLE_Pos 23U /*!< PMU CNTENSET: Event Counter 23 Enable Set Position */ -#define PMU_CNTENSET_CNT23_ENABLE_Msk (1UL << PMU_CNTENSET_CNT23_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 23 Enable Set Mask */ - -#define PMU_CNTENSET_CNT24_ENABLE_Pos 24U /*!< PMU CNTENSET: Event Counter 24 Enable Set Position */ -#define PMU_CNTENSET_CNT24_ENABLE_Msk (1UL << PMU_CNTENSET_CNT24_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 24 Enable Set Mask */ - -#define PMU_CNTENSET_CNT25_ENABLE_Pos 25U /*!< PMU CNTENSET: Event Counter 25 Enable Set Position */ -#define PMU_CNTENSET_CNT25_ENABLE_Msk (1UL << PMU_CNTENSET_CNT25_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 25 Enable Set Mask */ - -#define PMU_CNTENSET_CNT26_ENABLE_Pos 26U /*!< PMU CNTENSET: Event Counter 26 Enable Set Position */ -#define PMU_CNTENSET_CNT26_ENABLE_Msk (1UL << PMU_CNTENSET_CNT26_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 26 Enable Set Mask */ - -#define PMU_CNTENSET_CNT27_ENABLE_Pos 27U /*!< PMU CNTENSET: Event Counter 27 Enable Set Position */ -#define PMU_CNTENSET_CNT27_ENABLE_Msk (1UL << PMU_CNTENSET_CNT27_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 27 Enable Set Mask */ - -#define PMU_CNTENSET_CNT28_ENABLE_Pos 28U /*!< PMU CNTENSET: Event Counter 28 Enable Set Position */ -#define PMU_CNTENSET_CNT28_ENABLE_Msk (1UL << PMU_CNTENSET_CNT28_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 28 Enable Set Mask */ - -#define PMU_CNTENSET_CNT29_ENABLE_Pos 29U /*!< PMU CNTENSET: Event Counter 29 Enable Set Position */ -#define PMU_CNTENSET_CNT29_ENABLE_Msk (1UL << PMU_CNTENSET_CNT29_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 29 Enable Set Mask */ - -#define PMU_CNTENSET_CNT30_ENABLE_Pos 30U /*!< PMU CNTENSET: Event Counter 30 Enable Set Position */ -#define PMU_CNTENSET_CNT30_ENABLE_Msk (1UL << PMU_CNTENSET_CNT30_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 30 Enable Set Mask */ - -#define PMU_CNTENSET_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENSET: Cycle Counter Enable Set Position */ -#define PMU_CNTENSET_CCNTR_ENABLE_Msk (1UL << PMU_CNTENSET_CCNTR_ENABLE_Pos) /*!< PMU CNTENSET: Cycle Counter Enable Set Mask */ - -/** \brief PMU Count Enable Clear Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Position */ -#define PMU_CNTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU CNTENCLR: Event Counter 1 Enable Clear Position */ -#define PMU_CNTENCLR_CNT1_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT1_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 1 Enable Clear */ - -#define PMU_CNTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Position */ -#define PMU_CNTENCLR_CNT2_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT2_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Position */ -#define PMU_CNTENCLR_CNT3_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT3_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Position */ -#define PMU_CNTENCLR_CNT4_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT4_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Position */ -#define PMU_CNTENCLR_CNT5_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT5_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Position */ -#define PMU_CNTENCLR_CNT6_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT6_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Position */ -#define PMU_CNTENCLR_CNT7_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT7_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Position */ -#define PMU_CNTENCLR_CNT8_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT8_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Position */ -#define PMU_CNTENCLR_CNT9_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT9_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Position */ -#define PMU_CNTENCLR_CNT10_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT10_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Position */ -#define PMU_CNTENCLR_CNT11_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT11_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Position */ -#define PMU_CNTENCLR_CNT12_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT12_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Position */ -#define PMU_CNTENCLR_CNT13_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT13_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Position */ -#define PMU_CNTENCLR_CNT14_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT14_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Position */ -#define PMU_CNTENCLR_CNT15_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT15_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Position */ -#define PMU_CNTENCLR_CNT16_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT16_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Position */ -#define PMU_CNTENCLR_CNT17_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT17_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Position */ -#define PMU_CNTENCLR_CNT18_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT18_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Position */ -#define PMU_CNTENCLR_CNT19_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT19_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Position */ -#define PMU_CNTENCLR_CNT20_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT20_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Position */ -#define PMU_CNTENCLR_CNT21_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT21_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Position */ -#define PMU_CNTENCLR_CNT22_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT22_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Position */ -#define PMU_CNTENCLR_CNT23_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT23_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Position */ -#define PMU_CNTENCLR_CNT24_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT24_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Position */ -#define PMU_CNTENCLR_CNT25_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT25_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Position */ -#define PMU_CNTENCLR_CNT26_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT26_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Position */ -#define PMU_CNTENCLR_CNT27_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT27_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Position */ -#define PMU_CNTENCLR_CNT28_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT28_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Position */ -#define PMU_CNTENCLR_CNT29_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT29_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Position */ -#define PMU_CNTENCLR_CNT30_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT30_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Mask */ - -#define PMU_CNTENCLR_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENCLR: Cycle Counter Enable Clear Position */ -#define PMU_CNTENCLR_CCNTR_ENABLE_Msk (1UL << PMU_CNTENCLR_CCNTR_ENABLE_Pos) /*!< PMU CNTENCLR: Cycle Counter Enable Clear Mask */ - -/** \brief PMU Interrupt Enable Set Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENSET_CNT0_ENABLE_Pos*/) /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT1_ENABLE_Pos 1U /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT1_ENABLE_Msk (1UL << PMU_INTENSET_CNT1_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT2_ENABLE_Pos 2U /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT2_ENABLE_Msk (1UL << PMU_INTENSET_CNT2_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT3_ENABLE_Pos 3U /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT3_ENABLE_Msk (1UL << PMU_INTENSET_CNT3_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT4_ENABLE_Pos 4U /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT4_ENABLE_Msk (1UL << PMU_INTENSET_CNT4_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT5_ENABLE_Pos 5U /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT5_ENABLE_Msk (1UL << PMU_INTENSET_CNT5_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT6_ENABLE_Pos 6U /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT6_ENABLE_Msk (1UL << PMU_INTENSET_CNT6_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT7_ENABLE_Pos 7U /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT7_ENABLE_Msk (1UL << PMU_INTENSET_CNT7_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT8_ENABLE_Pos 8U /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT8_ENABLE_Msk (1UL << PMU_INTENSET_CNT8_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT9_ENABLE_Pos 9U /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT9_ENABLE_Msk (1UL << PMU_INTENSET_CNT9_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT10_ENABLE_Pos 10U /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT10_ENABLE_Msk (1UL << PMU_INTENSET_CNT10_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT11_ENABLE_Pos 11U /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT11_ENABLE_Msk (1UL << PMU_INTENSET_CNT11_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT12_ENABLE_Pos 12U /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT12_ENABLE_Msk (1UL << PMU_INTENSET_CNT12_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT13_ENABLE_Pos 13U /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT13_ENABLE_Msk (1UL << PMU_INTENSET_CNT13_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT14_ENABLE_Pos 14U /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT14_ENABLE_Msk (1UL << PMU_INTENSET_CNT14_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT15_ENABLE_Pos 15U /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT15_ENABLE_Msk (1UL << PMU_INTENSET_CNT15_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT16_ENABLE_Pos 16U /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT16_ENABLE_Msk (1UL << PMU_INTENSET_CNT16_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT17_ENABLE_Pos 17U /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT17_ENABLE_Msk (1UL << PMU_INTENSET_CNT17_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT18_ENABLE_Pos 18U /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT18_ENABLE_Msk (1UL << PMU_INTENSET_CNT18_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT19_ENABLE_Pos 19U /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT19_ENABLE_Msk (1UL << PMU_INTENSET_CNT19_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT20_ENABLE_Pos 20U /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT20_ENABLE_Msk (1UL << PMU_INTENSET_CNT20_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT21_ENABLE_Pos 21U /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT21_ENABLE_Msk (1UL << PMU_INTENSET_CNT21_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT22_ENABLE_Pos 22U /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT22_ENABLE_Msk (1UL << PMU_INTENSET_CNT22_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT23_ENABLE_Pos 23U /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT23_ENABLE_Msk (1UL << PMU_INTENSET_CNT23_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT24_ENABLE_Pos 24U /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT24_ENABLE_Msk (1UL << PMU_INTENSET_CNT24_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT25_ENABLE_Pos 25U /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT25_ENABLE_Msk (1UL << PMU_INTENSET_CNT25_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT26_ENABLE_Pos 26U /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT26_ENABLE_Msk (1UL << PMU_INTENSET_CNT26_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT27_ENABLE_Pos 27U /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT27_ENABLE_Msk (1UL << PMU_INTENSET_CNT27_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT28_ENABLE_Pos 28U /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT28_ENABLE_Msk (1UL << PMU_INTENSET_CNT28_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT29_ENABLE_Pos 29U /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT29_ENABLE_Msk (1UL << PMU_INTENSET_CNT29_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT30_ENABLE_Pos 30U /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT30_ENABLE_Msk (1UL << PMU_INTENSET_CNT30_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Position */ -#define PMU_INTENSET_CCYCNT_ENABLE_Msk (1UL << PMU_INTENSET_CYCCNT_ENABLE_Pos) /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Mask */ - -/** \brief PMU Interrupt Enable Clear Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT1_ENABLE_Msk (1UL << PMU_INTENCLR_CNT1_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear */ - -#define PMU_INTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT2_ENABLE_Msk (1UL << PMU_INTENCLR_CNT2_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT3_ENABLE_Msk (1UL << PMU_INTENCLR_CNT3_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT4_ENABLE_Msk (1UL << PMU_INTENCLR_CNT4_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT5_ENABLE_Msk (1UL << PMU_INTENCLR_CNT5_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT6_ENABLE_Msk (1UL << PMU_INTENCLR_CNT6_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT7_ENABLE_Msk (1UL << PMU_INTENCLR_CNT7_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT8_ENABLE_Msk (1UL << PMU_INTENCLR_CNT8_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT9_ENABLE_Msk (1UL << PMU_INTENCLR_CNT9_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT10_ENABLE_Msk (1UL << PMU_INTENCLR_CNT10_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT11_ENABLE_Msk (1UL << PMU_INTENCLR_CNT11_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT12_ENABLE_Msk (1UL << PMU_INTENCLR_CNT12_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT13_ENABLE_Msk (1UL << PMU_INTENCLR_CNT13_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT14_ENABLE_Msk (1UL << PMU_INTENCLR_CNT14_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT15_ENABLE_Msk (1UL << PMU_INTENCLR_CNT15_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT16_ENABLE_Msk (1UL << PMU_INTENCLR_CNT16_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT17_ENABLE_Msk (1UL << PMU_INTENCLR_CNT17_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT18_ENABLE_Msk (1UL << PMU_INTENCLR_CNT18_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT19_ENABLE_Msk (1UL << PMU_INTENCLR_CNT19_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT20_ENABLE_Msk (1UL << PMU_INTENCLR_CNT20_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT21_ENABLE_Msk (1UL << PMU_INTENCLR_CNT21_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT22_ENABLE_Msk (1UL << PMU_INTENCLR_CNT22_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT23_ENABLE_Msk (1UL << PMU_INTENCLR_CNT23_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT24_ENABLE_Msk (1UL << PMU_INTENCLR_CNT24_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT25_ENABLE_Msk (1UL << PMU_INTENCLR_CNT25_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT26_ENABLE_Msk (1UL << PMU_INTENCLR_CNT26_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT27_ENABLE_Msk (1UL << PMU_INTENCLR_CNT27_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT28_ENABLE_Msk (1UL << PMU_INTENCLR_CNT28_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT29_ENABLE_Msk (1UL << PMU_INTENCLR_CNT29_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT30_ENABLE_Msk (1UL << PMU_INTENCLR_CNT30_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CYCCNT_ENABLE_Msk (1UL << PMU_INTENCLR_CYCCNT_ENABLE_Pos) /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Mask */ - -/** \brief PMU Overflow Flag Status Set Register Definitions */ - -#define PMU_OVSSET_CNT0_STATUS_Pos 0U /*!< PMU OVSSET: Event Counter 0 Overflow Set Position */ -#define PMU_OVSSET_CNT0_STATUS_Msk (1UL /*<< PMU_OVSSET_CNT0_STATUS_Pos*/) /*!< PMU OVSSET: Event Counter 0 Overflow Set Mask */ - -#define PMU_OVSSET_CNT1_STATUS_Pos 1U /*!< PMU OVSSET: Event Counter 1 Overflow Set Position */ -#define PMU_OVSSET_CNT1_STATUS_Msk (1UL << PMU_OVSSET_CNT1_STATUS_Pos) /*!< PMU OVSSET: Event Counter 1 Overflow Set Mask */ - -#define PMU_OVSSET_CNT2_STATUS_Pos 2U /*!< PMU OVSSET: Event Counter 2 Overflow Set Position */ -#define PMU_OVSSET_CNT2_STATUS_Msk (1UL << PMU_OVSSET_CNT2_STATUS_Pos) /*!< PMU OVSSET: Event Counter 2 Overflow Set Mask */ - -#define PMU_OVSSET_CNT3_STATUS_Pos 3U /*!< PMU OVSSET: Event Counter 3 Overflow Set Position */ -#define PMU_OVSSET_CNT3_STATUS_Msk (1UL << PMU_OVSSET_CNT3_STATUS_Pos) /*!< PMU OVSSET: Event Counter 3 Overflow Set Mask */ - -#define PMU_OVSSET_CNT4_STATUS_Pos 4U /*!< PMU OVSSET: Event Counter 4 Overflow Set Position */ -#define PMU_OVSSET_CNT4_STATUS_Msk (1UL << PMU_OVSSET_CNT4_STATUS_Pos) /*!< PMU OVSSET: Event Counter 4 Overflow Set Mask */ - -#define PMU_OVSSET_CNT5_STATUS_Pos 5U /*!< PMU OVSSET: Event Counter 5 Overflow Set Position */ -#define PMU_OVSSET_CNT5_STATUS_Msk (1UL << PMU_OVSSET_CNT5_STATUS_Pos) /*!< PMU OVSSET: Event Counter 5 Overflow Set Mask */ - -#define PMU_OVSSET_CNT6_STATUS_Pos 6U /*!< PMU OVSSET: Event Counter 6 Overflow Set Position */ -#define PMU_OVSSET_CNT6_STATUS_Msk (1UL << PMU_OVSSET_CNT6_STATUS_Pos) /*!< PMU OVSSET: Event Counter 6 Overflow Set Mask */ - -#define PMU_OVSSET_CNT7_STATUS_Pos 7U /*!< PMU OVSSET: Event Counter 7 Overflow Set Position */ -#define PMU_OVSSET_CNT7_STATUS_Msk (1UL << PMU_OVSSET_CNT7_STATUS_Pos) /*!< PMU OVSSET: Event Counter 7 Overflow Set Mask */ - -#define PMU_OVSSET_CNT8_STATUS_Pos 8U /*!< PMU OVSSET: Event Counter 8 Overflow Set Position */ -#define PMU_OVSSET_CNT8_STATUS_Msk (1UL << PMU_OVSSET_CNT8_STATUS_Pos) /*!< PMU OVSSET: Event Counter 8 Overflow Set Mask */ - -#define PMU_OVSSET_CNT9_STATUS_Pos 9U /*!< PMU OVSSET: Event Counter 9 Overflow Set Position */ -#define PMU_OVSSET_CNT9_STATUS_Msk (1UL << PMU_OVSSET_CNT9_STATUS_Pos) /*!< PMU OVSSET: Event Counter 9 Overflow Set Mask */ - -#define PMU_OVSSET_CNT10_STATUS_Pos 10U /*!< PMU OVSSET: Event Counter 10 Overflow Set Position */ -#define PMU_OVSSET_CNT10_STATUS_Msk (1UL << PMU_OVSSET_CNT10_STATUS_Pos) /*!< PMU OVSSET: Event Counter 10 Overflow Set Mask */ - -#define PMU_OVSSET_CNT11_STATUS_Pos 11U /*!< PMU OVSSET: Event Counter 11 Overflow Set Position */ -#define PMU_OVSSET_CNT11_STATUS_Msk (1UL << PMU_OVSSET_CNT11_STATUS_Pos) /*!< PMU OVSSET: Event Counter 11 Overflow Set Mask */ - -#define PMU_OVSSET_CNT12_STATUS_Pos 12U /*!< PMU OVSSET: Event Counter 12 Overflow Set Position */ -#define PMU_OVSSET_CNT12_STATUS_Msk (1UL << PMU_OVSSET_CNT12_STATUS_Pos) /*!< PMU OVSSET: Event Counter 12 Overflow Set Mask */ - -#define PMU_OVSSET_CNT13_STATUS_Pos 13U /*!< PMU OVSSET: Event Counter 13 Overflow Set Position */ -#define PMU_OVSSET_CNT13_STATUS_Msk (1UL << PMU_OVSSET_CNT13_STATUS_Pos) /*!< PMU OVSSET: Event Counter 13 Overflow Set Mask */ - -#define PMU_OVSSET_CNT14_STATUS_Pos 14U /*!< PMU OVSSET: Event Counter 14 Overflow Set Position */ -#define PMU_OVSSET_CNT14_STATUS_Msk (1UL << PMU_OVSSET_CNT14_STATUS_Pos) /*!< PMU OVSSET: Event Counter 14 Overflow Set Mask */ - -#define PMU_OVSSET_CNT15_STATUS_Pos 15U /*!< PMU OVSSET: Event Counter 15 Overflow Set Position */ -#define PMU_OVSSET_CNT15_STATUS_Msk (1UL << PMU_OVSSET_CNT15_STATUS_Pos) /*!< PMU OVSSET: Event Counter 15 Overflow Set Mask */ - -#define PMU_OVSSET_CNT16_STATUS_Pos 16U /*!< PMU OVSSET: Event Counter 16 Overflow Set Position */ -#define PMU_OVSSET_CNT16_STATUS_Msk (1UL << PMU_OVSSET_CNT16_STATUS_Pos) /*!< PMU OVSSET: Event Counter 16 Overflow Set Mask */ - -#define PMU_OVSSET_CNT17_STATUS_Pos 17U /*!< PMU OVSSET: Event Counter 17 Overflow Set Position */ -#define PMU_OVSSET_CNT17_STATUS_Msk (1UL << PMU_OVSSET_CNT17_STATUS_Pos) /*!< PMU OVSSET: Event Counter 17 Overflow Set Mask */ - -#define PMU_OVSSET_CNT18_STATUS_Pos 18U /*!< PMU OVSSET: Event Counter 18 Overflow Set Position */ -#define PMU_OVSSET_CNT18_STATUS_Msk (1UL << PMU_OVSSET_CNT18_STATUS_Pos) /*!< PMU OVSSET: Event Counter 18 Overflow Set Mask */ - -#define PMU_OVSSET_CNT19_STATUS_Pos 19U /*!< PMU OVSSET: Event Counter 19 Overflow Set Position */ -#define PMU_OVSSET_CNT19_STATUS_Msk (1UL << PMU_OVSSET_CNT19_STATUS_Pos) /*!< PMU OVSSET: Event Counter 19 Overflow Set Mask */ - -#define PMU_OVSSET_CNT20_STATUS_Pos 20U /*!< PMU OVSSET: Event Counter 20 Overflow Set Position */ -#define PMU_OVSSET_CNT20_STATUS_Msk (1UL << PMU_OVSSET_CNT20_STATUS_Pos) /*!< PMU OVSSET: Event Counter 20 Overflow Set Mask */ - -#define PMU_OVSSET_CNT21_STATUS_Pos 21U /*!< PMU OVSSET: Event Counter 21 Overflow Set Position */ -#define PMU_OVSSET_CNT21_STATUS_Msk (1UL << PMU_OVSSET_CNT21_STATUS_Pos) /*!< PMU OVSSET: Event Counter 21 Overflow Set Mask */ - -#define PMU_OVSSET_CNT22_STATUS_Pos 22U /*!< PMU OVSSET: Event Counter 22 Overflow Set Position */ -#define PMU_OVSSET_CNT22_STATUS_Msk (1UL << PMU_OVSSET_CNT22_STATUS_Pos) /*!< PMU OVSSET: Event Counter 22 Overflow Set Mask */ - -#define PMU_OVSSET_CNT23_STATUS_Pos 23U /*!< PMU OVSSET: Event Counter 23 Overflow Set Position */ -#define PMU_OVSSET_CNT23_STATUS_Msk (1UL << PMU_OVSSET_CNT23_STATUS_Pos) /*!< PMU OVSSET: Event Counter 23 Overflow Set Mask */ - -#define PMU_OVSSET_CNT24_STATUS_Pos 24U /*!< PMU OVSSET: Event Counter 24 Overflow Set Position */ -#define PMU_OVSSET_CNT24_STATUS_Msk (1UL << PMU_OVSSET_CNT24_STATUS_Pos) /*!< PMU OVSSET: Event Counter 24 Overflow Set Mask */ - -#define PMU_OVSSET_CNT25_STATUS_Pos 25U /*!< PMU OVSSET: Event Counter 25 Overflow Set Position */ -#define PMU_OVSSET_CNT25_STATUS_Msk (1UL << PMU_OVSSET_CNT25_STATUS_Pos) /*!< PMU OVSSET: Event Counter 25 Overflow Set Mask */ - -#define PMU_OVSSET_CNT26_STATUS_Pos 26U /*!< PMU OVSSET: Event Counter 26 Overflow Set Position */ -#define PMU_OVSSET_CNT26_STATUS_Msk (1UL << PMU_OVSSET_CNT26_STATUS_Pos) /*!< PMU OVSSET: Event Counter 26 Overflow Set Mask */ - -#define PMU_OVSSET_CNT27_STATUS_Pos 27U /*!< PMU OVSSET: Event Counter 27 Overflow Set Position */ -#define PMU_OVSSET_CNT27_STATUS_Msk (1UL << PMU_OVSSET_CNT27_STATUS_Pos) /*!< PMU OVSSET: Event Counter 27 Overflow Set Mask */ - -#define PMU_OVSSET_CNT28_STATUS_Pos 28U /*!< PMU OVSSET: Event Counter 28 Overflow Set Position */ -#define PMU_OVSSET_CNT28_STATUS_Msk (1UL << PMU_OVSSET_CNT28_STATUS_Pos) /*!< PMU OVSSET: Event Counter 28 Overflow Set Mask */ - -#define PMU_OVSSET_CNT29_STATUS_Pos 29U /*!< PMU OVSSET: Event Counter 29 Overflow Set Position */ -#define PMU_OVSSET_CNT29_STATUS_Msk (1UL << PMU_OVSSET_CNT29_STATUS_Pos) /*!< PMU OVSSET: Event Counter 29 Overflow Set Mask */ - -#define PMU_OVSSET_CNT30_STATUS_Pos 30U /*!< PMU OVSSET: Event Counter 30 Overflow Set Position */ -#define PMU_OVSSET_CNT30_STATUS_Msk (1UL << PMU_OVSSET_CNT30_STATUS_Pos) /*!< PMU OVSSET: Event Counter 30 Overflow Set Mask */ - -#define PMU_OVSSET_CYCCNT_STATUS_Pos 31U /*!< PMU OVSSET: Cycle Counter Overflow Set Position */ -#define PMU_OVSSET_CYCCNT_STATUS_Msk (1UL << PMU_OVSSET_CYCCNT_STATUS_Pos) /*!< PMU OVSSET: Cycle Counter Overflow Set Mask */ - -/** \brief PMU Overflow Flag Status Clear Register Definitions */ - -#define PMU_OVSCLR_CNT0_STATUS_Pos 0U /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Position */ -#define PMU_OVSCLR_CNT0_STATUS_Msk (1UL /*<< PMU_OVSCLR_CNT0_STATUS_Pos*/) /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT1_STATUS_Pos 1U /*!< PMU OVSCLR: Event Counter 1 Overflow Clear Position */ -#define PMU_OVSCLR_CNT1_STATUS_Msk (1UL << PMU_OVSCLR_CNT1_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 1 Overflow Clear */ - -#define PMU_OVSCLR_CNT2_STATUS_Pos 2U /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Position */ -#define PMU_OVSCLR_CNT2_STATUS_Msk (1UL << PMU_OVSCLR_CNT2_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT3_STATUS_Pos 3U /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Position */ -#define PMU_OVSCLR_CNT3_STATUS_Msk (1UL << PMU_OVSCLR_CNT3_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT4_STATUS_Pos 4U /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Position */ -#define PMU_OVSCLR_CNT4_STATUS_Msk (1UL << PMU_OVSCLR_CNT4_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT5_STATUS_Pos 5U /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Position */ -#define PMU_OVSCLR_CNT5_STATUS_Msk (1UL << PMU_OVSCLR_CNT5_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT6_STATUS_Pos 6U /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Position */ -#define PMU_OVSCLR_CNT6_STATUS_Msk (1UL << PMU_OVSCLR_CNT6_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT7_STATUS_Pos 7U /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Position */ -#define PMU_OVSCLR_CNT7_STATUS_Msk (1UL << PMU_OVSCLR_CNT7_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT8_STATUS_Pos 8U /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Position */ -#define PMU_OVSCLR_CNT8_STATUS_Msk (1UL << PMU_OVSCLR_CNT8_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT9_STATUS_Pos 9U /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Position */ -#define PMU_OVSCLR_CNT9_STATUS_Msk (1UL << PMU_OVSCLR_CNT9_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT10_STATUS_Pos 10U /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Position */ -#define PMU_OVSCLR_CNT10_STATUS_Msk (1UL << PMU_OVSCLR_CNT10_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT11_STATUS_Pos 11U /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Position */ -#define PMU_OVSCLR_CNT11_STATUS_Msk (1UL << PMU_OVSCLR_CNT11_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT12_STATUS_Pos 12U /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Position */ -#define PMU_OVSCLR_CNT12_STATUS_Msk (1UL << PMU_OVSCLR_CNT12_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT13_STATUS_Pos 13U /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Position */ -#define PMU_OVSCLR_CNT13_STATUS_Msk (1UL << PMU_OVSCLR_CNT13_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT14_STATUS_Pos 14U /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Position */ -#define PMU_OVSCLR_CNT14_STATUS_Msk (1UL << PMU_OVSCLR_CNT14_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT15_STATUS_Pos 15U /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Position */ -#define PMU_OVSCLR_CNT15_STATUS_Msk (1UL << PMU_OVSCLR_CNT15_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT16_STATUS_Pos 16U /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Position */ -#define PMU_OVSCLR_CNT16_STATUS_Msk (1UL << PMU_OVSCLR_CNT16_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT17_STATUS_Pos 17U /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Position */ -#define PMU_OVSCLR_CNT17_STATUS_Msk (1UL << PMU_OVSCLR_CNT17_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT18_STATUS_Pos 18U /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Position */ -#define PMU_OVSCLR_CNT18_STATUS_Msk (1UL << PMU_OVSCLR_CNT18_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT19_STATUS_Pos 19U /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Position */ -#define PMU_OVSCLR_CNT19_STATUS_Msk (1UL << PMU_OVSCLR_CNT19_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT20_STATUS_Pos 20U /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Position */ -#define PMU_OVSCLR_CNT20_STATUS_Msk (1UL << PMU_OVSCLR_CNT20_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT21_STATUS_Pos 21U /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Position */ -#define PMU_OVSCLR_CNT21_STATUS_Msk (1UL << PMU_OVSCLR_CNT21_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT22_STATUS_Pos 22U /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Position */ -#define PMU_OVSCLR_CNT22_STATUS_Msk (1UL << PMU_OVSCLR_CNT22_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT23_STATUS_Pos 23U /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Position */ -#define PMU_OVSCLR_CNT23_STATUS_Msk (1UL << PMU_OVSCLR_CNT23_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT24_STATUS_Pos 24U /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Position */ -#define PMU_OVSCLR_CNT24_STATUS_Msk (1UL << PMU_OVSCLR_CNT24_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT25_STATUS_Pos 25U /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Position */ -#define PMU_OVSCLR_CNT25_STATUS_Msk (1UL << PMU_OVSCLR_CNT25_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT26_STATUS_Pos 26U /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Position */ -#define PMU_OVSCLR_CNT26_STATUS_Msk (1UL << PMU_OVSCLR_CNT26_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT27_STATUS_Pos 27U /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Position */ -#define PMU_OVSCLR_CNT27_STATUS_Msk (1UL << PMU_OVSCLR_CNT27_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT28_STATUS_Pos 28U /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Position */ -#define PMU_OVSCLR_CNT28_STATUS_Msk (1UL << PMU_OVSCLR_CNT28_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT29_STATUS_Pos 29U /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Position */ -#define PMU_OVSCLR_CNT29_STATUS_Msk (1UL << PMU_OVSCLR_CNT29_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT30_STATUS_Pos 30U /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Position */ -#define PMU_OVSCLR_CNT30_STATUS_Msk (1UL << PMU_OVSCLR_CNT30_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Mask */ - -#define PMU_OVSCLR_CYCCNT_STATUS_Pos 31U /*!< PMU OVSCLR: Cycle Counter Overflow Clear Position */ -#define PMU_OVSCLR_CYCCNT_STATUS_Msk (1UL << PMU_OVSCLR_CYCCNT_STATUS_Pos) /*!< PMU OVSCLR: Cycle Counter Overflow Clear Mask */ - -/** \brief PMU Software Increment Counter */ - -#define PMU_SWINC_CNT0_Pos 0U /*!< PMU SWINC: Event Counter 0 Software Increment Position */ -#define PMU_SWINC_CNT0_Msk (1UL /*<< PMU_SWINC_CNT0_Pos */) /*!< PMU SWINC: Event Counter 0 Software Increment Mask */ - -#define PMU_SWINC_CNT1_Pos 1U /*!< PMU SWINC: Event Counter 1 Software Increment Position */ -#define PMU_SWINC_CNT1_Msk (1UL << PMU_SWINC_CNT1_Pos) /*!< PMU SWINC: Event Counter 1 Software Increment Mask */ - -#define PMU_SWINC_CNT2_Pos 2U /*!< PMU SWINC: Event Counter 2 Software Increment Position */ -#define PMU_SWINC_CNT2_Msk (1UL << PMU_SWINC_CNT2_Pos) /*!< PMU SWINC: Event Counter 2 Software Increment Mask */ - -#define PMU_SWINC_CNT3_Pos 3U /*!< PMU SWINC: Event Counter 3 Software Increment Position */ -#define PMU_SWINC_CNT3_Msk (1UL << PMU_SWINC_CNT3_Pos) /*!< PMU SWINC: Event Counter 3 Software Increment Mask */ - -#define PMU_SWINC_CNT4_Pos 4U /*!< PMU SWINC: Event Counter 4 Software Increment Position */ -#define PMU_SWINC_CNT4_Msk (1UL << PMU_SWINC_CNT4_Pos) /*!< PMU SWINC: Event Counter 4 Software Increment Mask */ - -#define PMU_SWINC_CNT5_Pos 5U /*!< PMU SWINC: Event Counter 5 Software Increment Position */ -#define PMU_SWINC_CNT5_Msk (1UL << PMU_SWINC_CNT5_Pos) /*!< PMU SWINC: Event Counter 5 Software Increment Mask */ - -#define PMU_SWINC_CNT6_Pos 6U /*!< PMU SWINC: Event Counter 6 Software Increment Position */ -#define PMU_SWINC_CNT6_Msk (1UL << PMU_SWINC_CNT6_Pos) /*!< PMU SWINC: Event Counter 6 Software Increment Mask */ - -#define PMU_SWINC_CNT7_Pos 7U /*!< PMU SWINC: Event Counter 7 Software Increment Position */ -#define PMU_SWINC_CNT7_Msk (1UL << PMU_SWINC_CNT7_Pos) /*!< PMU SWINC: Event Counter 7 Software Increment Mask */ - -#define PMU_SWINC_CNT8_Pos 8U /*!< PMU SWINC: Event Counter 8 Software Increment Position */ -#define PMU_SWINC_CNT8_Msk (1UL << PMU_SWINC_CNT8_Pos) /*!< PMU SWINC: Event Counter 8 Software Increment Mask */ - -#define PMU_SWINC_CNT9_Pos 9U /*!< PMU SWINC: Event Counter 9 Software Increment Position */ -#define PMU_SWINC_CNT9_Msk (1UL << PMU_SWINC_CNT9_Pos) /*!< PMU SWINC: Event Counter 9 Software Increment Mask */ - -#define PMU_SWINC_CNT10_Pos 10U /*!< PMU SWINC: Event Counter 10 Software Increment Position */ -#define PMU_SWINC_CNT10_Msk (1UL << PMU_SWINC_CNT10_Pos) /*!< PMU SWINC: Event Counter 10 Software Increment Mask */ - -#define PMU_SWINC_CNT11_Pos 11U /*!< PMU SWINC: Event Counter 11 Software Increment Position */ -#define PMU_SWINC_CNT11_Msk (1UL << PMU_SWINC_CNT11_Pos) /*!< PMU SWINC: Event Counter 11 Software Increment Mask */ - -#define PMU_SWINC_CNT12_Pos 12U /*!< PMU SWINC: Event Counter 12 Software Increment Position */ -#define PMU_SWINC_CNT12_Msk (1UL << PMU_SWINC_CNT12_Pos) /*!< PMU SWINC: Event Counter 12 Software Increment Mask */ - -#define PMU_SWINC_CNT13_Pos 13U /*!< PMU SWINC: Event Counter 13 Software Increment Position */ -#define PMU_SWINC_CNT13_Msk (1UL << PMU_SWINC_CNT13_Pos) /*!< PMU SWINC: Event Counter 13 Software Increment Mask */ - -#define PMU_SWINC_CNT14_Pos 14U /*!< PMU SWINC: Event Counter 14 Software Increment Position */ -#define PMU_SWINC_CNT14_Msk (1UL << PMU_SWINC_CNT14_Pos) /*!< PMU SWINC: Event Counter 14 Software Increment Mask */ - -#define PMU_SWINC_CNT15_Pos 15U /*!< PMU SWINC: Event Counter 15 Software Increment Position */ -#define PMU_SWINC_CNT15_Msk (1UL << PMU_SWINC_CNT15_Pos) /*!< PMU SWINC: Event Counter 15 Software Increment Mask */ - -#define PMU_SWINC_CNT16_Pos 16U /*!< PMU SWINC: Event Counter 16 Software Increment Position */ -#define PMU_SWINC_CNT16_Msk (1UL << PMU_SWINC_CNT16_Pos) /*!< PMU SWINC: Event Counter 16 Software Increment Mask */ - -#define PMU_SWINC_CNT17_Pos 17U /*!< PMU SWINC: Event Counter 17 Software Increment Position */ -#define PMU_SWINC_CNT17_Msk (1UL << PMU_SWINC_CNT17_Pos) /*!< PMU SWINC: Event Counter 17 Software Increment Mask */ - -#define PMU_SWINC_CNT18_Pos 18U /*!< PMU SWINC: Event Counter 18 Software Increment Position */ -#define PMU_SWINC_CNT18_Msk (1UL << PMU_SWINC_CNT18_Pos) /*!< PMU SWINC: Event Counter 18 Software Increment Mask */ - -#define PMU_SWINC_CNT19_Pos 19U /*!< PMU SWINC: Event Counter 19 Software Increment Position */ -#define PMU_SWINC_CNT19_Msk (1UL << PMU_SWINC_CNT19_Pos) /*!< PMU SWINC: Event Counter 19 Software Increment Mask */ - -#define PMU_SWINC_CNT20_Pos 20U /*!< PMU SWINC: Event Counter 20 Software Increment Position */ -#define PMU_SWINC_CNT20_Msk (1UL << PMU_SWINC_CNT20_Pos) /*!< PMU SWINC: Event Counter 20 Software Increment Mask */ - -#define PMU_SWINC_CNT21_Pos 21U /*!< PMU SWINC: Event Counter 21 Software Increment Position */ -#define PMU_SWINC_CNT21_Msk (1UL << PMU_SWINC_CNT21_Pos) /*!< PMU SWINC: Event Counter 21 Software Increment Mask */ - -#define PMU_SWINC_CNT22_Pos 22U /*!< PMU SWINC: Event Counter 22 Software Increment Position */ -#define PMU_SWINC_CNT22_Msk (1UL << PMU_SWINC_CNT22_Pos) /*!< PMU SWINC: Event Counter 22 Software Increment Mask */ - -#define PMU_SWINC_CNT23_Pos 23U /*!< PMU SWINC: Event Counter 23 Software Increment Position */ -#define PMU_SWINC_CNT23_Msk (1UL << PMU_SWINC_CNT23_Pos) /*!< PMU SWINC: Event Counter 23 Software Increment Mask */ - -#define PMU_SWINC_CNT24_Pos 24U /*!< PMU SWINC: Event Counter 24 Software Increment Position */ -#define PMU_SWINC_CNT24_Msk (1UL << PMU_SWINC_CNT24_Pos) /*!< PMU SWINC: Event Counter 24 Software Increment Mask */ - -#define PMU_SWINC_CNT25_Pos 25U /*!< PMU SWINC: Event Counter 25 Software Increment Position */ -#define PMU_SWINC_CNT25_Msk (1UL << PMU_SWINC_CNT25_Pos) /*!< PMU SWINC: Event Counter 25 Software Increment Mask */ - -#define PMU_SWINC_CNT26_Pos 26U /*!< PMU SWINC: Event Counter 26 Software Increment Position */ -#define PMU_SWINC_CNT26_Msk (1UL << PMU_SWINC_CNT26_Pos) /*!< PMU SWINC: Event Counter 26 Software Increment Mask */ - -#define PMU_SWINC_CNT27_Pos 27U /*!< PMU SWINC: Event Counter 27 Software Increment Position */ -#define PMU_SWINC_CNT27_Msk (1UL << PMU_SWINC_CNT27_Pos) /*!< PMU SWINC: Event Counter 27 Software Increment Mask */ - -#define PMU_SWINC_CNT28_Pos 28U /*!< PMU SWINC: Event Counter 28 Software Increment Position */ -#define PMU_SWINC_CNT28_Msk (1UL << PMU_SWINC_CNT28_Pos) /*!< PMU SWINC: Event Counter 28 Software Increment Mask */ - -#define PMU_SWINC_CNT29_Pos 29U /*!< PMU SWINC: Event Counter 29 Software Increment Position */ -#define PMU_SWINC_CNT29_Msk (1UL << PMU_SWINC_CNT29_Pos) /*!< PMU SWINC: Event Counter 29 Software Increment Mask */ - -#define PMU_SWINC_CNT30_Pos 30U /*!< PMU SWINC: Event Counter 30 Software Increment Position */ -#define PMU_SWINC_CNT30_Msk (1UL << PMU_SWINC_CNT30_Pos) /*!< PMU SWINC: Event Counter 30 Software Increment Mask */ - -/** \brief PMU Control Register Definitions */ - -#define PMU_CTRL_ENABLE_Pos 0U /*!< PMU CTRL: ENABLE Position */ -#define PMU_CTRL_ENABLE_Msk (1UL /*<< PMU_CTRL_ENABLE_Pos*/) /*!< PMU CTRL: ENABLE Mask */ - -#define PMU_CTRL_EVENTCNT_RESET_Pos 1U /*!< PMU CTRL: Event Counter Reset Position */ -#define PMU_CTRL_EVENTCNT_RESET_Msk (1UL << PMU_CTRL_EVENTCNT_RESET_Pos) /*!< PMU CTRL: Event Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_RESET_Pos 2U /*!< PMU CTRL: Cycle Counter Reset Position */ -#define PMU_CTRL_CYCCNT_RESET_Msk (1UL << PMU_CTRL_CYCCNT_RESET_Pos) /*!< PMU CTRL: Cycle Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_DISABLE_Pos 5U /*!< PMU CTRL: Disable Cycle Counter Position */ -#define PMU_CTRL_CYCCNT_DISABLE_Msk (1UL << PMU_CTRL_CYCCNT_DISABLE_Pos) /*!< PMU CTRL: Disable Cycle Counter Mask */ - -#define PMU_CTRL_FRZ_ON_OV_Pos 9U /*!< PMU CTRL: Freeze-on-overflow Position */ -#define PMU_CTRL_FRZ_ON_OV_Msk (1UL << PMU_CTRL_FRZ_ON_OVERFLOW_Pos) /*!< PMU CTRL: Freeze-on-overflow Mask */ - -#define PMU_CTRL_TRACE_ON_OV_Pos 11U /*!< PMU CTRL: Trace-on-overflow Position */ -#define PMU_CTRL_TRACE_ON_OV_Msk (1UL << PMU_CTRL_TRACE_ON_OVERFLOW_Pos) /*!< PMU CTRL: Trace-on-overflow Mask */ - -/** \brief PMU Type Register Definitions */ - -#define PMU_TYPE_NUM_CNTS_Pos 0U /*!< PMU TYPE: Number of Counters Position */ -#define PMU_TYPE_NUM_CNTS_Msk (0xFFUL /*<< PMU_TYPE_NUM_CNTS_Pos*/) /*!< PMU TYPE: Number of Counters Mask */ - -#define PMU_TYPE_SIZE_CNTS_Pos 8U /*!< PMU TYPE: Size of Counters Position */ -#define PMU_TYPE_SIZE_CNTS_Msk (0x3FUL << PMU_TYPE_SIZE_CNTS_Pos) /*!< PMU TYPE: Size of Counters Mask */ - -#define PMU_TYPE_CYCCNT_PRESENT_Pos 14U /*!< PMU TYPE: Cycle Counter Present Position */ -#define PMU_TYPE_CYCCNT_PRESENT_Msk (1UL << PMU_TYPE_CYCCNT_PRESENT_Pos) /*!< PMU TYPE: Cycle Counter Present Mask */ - -#define PMU_TYPE_FRZ_OV_SUPPORT_Pos 21U /*!< PMU TYPE: Freeze-on-overflow Support Position */ -#define PMU_TYPE_FRZ_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Freeze-on-overflow Support Mask */ - -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Pos 23U /*!< PMU TYPE: Trace-on-overflow Support Position */ -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Trace-on-overflow Support Mask */ - -/** \brief PMU Authentication Status Register Definitions */ - -#define PMU_AUTHSTATUS_NSID_Pos 0U /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSID_Msk (0x3UL /*<< PMU_AUTHSTATUS_NSID_Pos*/) /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSNID_Pos 2U /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSNID_Msk (0x3UL << PMU_AUTHSTATUS_NSNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SID_Pos 4U /*!< PMU AUTHSTATUS: Secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_SID_Msk (0x3UL << PMU_AUTHSTATUS_SID_Pos) /*!< PMU AUTHSTATUS: Secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SNID_Pos 6U /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SNID_Msk (0x3UL << PMU_AUTHSTATUS_SNID_Pos) /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUID_Pos 16U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUID_Msk (0x3UL << PMU_AUTHSTATUS_NSUID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUNID_Pos 18U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUNID_Msk (0x3UL << PMU_AUTHSTATUS_NSUNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUID_Pos 20U /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_SUID_Msk (0x3UL << PMU_AUTHSTATUS_SUID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUNID_Pos 22U /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SUNID_Msk (0x3UL << PMU_AUTHSTATUS_SUNID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Mask */ - - -/*@} end of group CMSIS_PMU */ -#endif - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ -#define MPU_RLAR_PXN_Msk (1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -#define FPU_FPDSCR_FZ16_Pos 19U /*!< FPDSCR: FZ16 bit Position */ -#define FPU_FPDSCR_FZ16_Msk (1UL << FPU_FPDSCR_FZ16_Pos) /*!< FPDSCR: FZ16 bit Mask */ - -#define FPU_FPDSCR_LTPSIZE_Pos 16U /*!< FPDSCR: LTPSIZE bit Position */ -#define FPU_FPDSCR_LTPSIZE_Msk (7UL << FPU_FPDSCR_LTPSIZE_Pos) /*!< FPDSCR: LTPSIZE bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FPRound_Pos 28U /*!< MVFR0: FPRound bits Position */ -#define FPU_MVFR0_FPRound_Msk (0xFUL << FPU_MVFR0_FPRound_Pos) /*!< MVFR0: FPRound bits Mask */ - -#define FPU_MVFR0_FPSqrt_Pos 20U /*!< MVFR0: FPSqrt bits Position */ -#define FPU_MVFR0_FPSqrt_Msk (0xFUL << FPU_MVFR0_FPSqrt_Pos) /*!< MVFR0: FPSqrt bits Mask */ - -#define FPU_MVFR0_FPDivide_Pos 16U /*!< MVFR0: FPDivide bits Position */ -#define FPU_MVFR0_FPDivide_Msk (0xFUL << FPU_MVFR0_FPDivide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FPDP_Pos 8U /*!< MVFR0: FPDP bits Position */ -#define FPU_MVFR0_FPDP_Msk (0xFUL << FPU_MVFR0_FPDP_Pos) /*!< MVFR0: FPDP bits Mask */ - -#define FPU_MVFR0_FPSP_Pos 4U /*!< MVFR0: FPSP bits Position */ -#define FPU_MVFR0_FPSP_Msk (0xFUL << FPU_MVFR0_FPSP_Pos) /*!< MVFR0: FPSP bits Mask */ - -#define FPU_MVFR0_SIMDReg_Pos 0U /*!< MVFR0: SIMDReg bits Position */ -#define FPU_MVFR0_SIMDReg_Msk (0xFUL /*<< FPU_MVFR0_SIMDReg_Pos*/) /*!< MVFR0: SIMDReg bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FMAC_Pos 28U /*!< MVFR1: FMAC bits Position */ -#define FPU_MVFR1_FMAC_Msk (0xFUL << FPU_MVFR1_FMAC_Pos) /*!< MVFR1: FMAC bits Mask */ - -#define FPU_MVFR1_FPHP_Pos 24U /*!< MVFR1: FPHP bits Position */ -#define FPU_MVFR1_FPHP_Msk (0xFUL << FPU_MVFR1_FPHP_Pos) /*!< MVFR1: FPHP bits Mask */ - -#define FPU_MVFR1_FP16_Pos 20U /*!< MVFR1: FP16 bits Position */ -#define FPU_MVFR1_FP16_Msk (0xFUL << FPU_MVFR1_FP16_Pos) /*!< MVFR1: FP16 bits Mask */ - -#define FPU_MVFR1_MVE_Pos 8U /*!< MVFR1: MVE bits Position */ -#define FPU_MVFR1_MVE_Msk (0xFUL << FPU_MVFR1_MVE_Pos) /*!< MVFR1: MVE bits Mask */ - -#define FPU_MVFR1_FPDNaN_Pos 4U /*!< MVFR1: FPDNaN bits Position */ -#define FPU_MVFR1_FPDNaN_Msk (0xFUL << FPU_MVFR1_FPDNaN_Pos) /*!< MVFR1: FPDNaN bits Mask */ - -#define FPU_MVFR1_FPFtZ_Pos 0U /*!< MVFR1: FPFtZ bits Position */ -#define FPU_MVFR1_FPFtZ_Msk (0xFUL /*<< FPU_MVFR1_FPFtZ_Pos*/) /*!< MVFR1: FPFtZ bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_FPD_Pos 23U /*!< \deprecated CoreDebug DHCSR: S_FPD Position */ -#define CoreDebug_DHCSR_S_FPD_Msk (1UL << CoreDebug_DHCSR_S_FPD_Pos) /*!< \deprecated CoreDebug DHCSR: S_FPD Mask */ - -#define CoreDebug_DHCSR_S_SUIDE_Pos 22U /*!< \deprecated CoreDebug DHCSR: S_SUIDE Position */ -#define CoreDebug_DHCSR_S_SUIDE_Msk (1UL << CoreDebug_DHCSR_S_SUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SUIDE Mask */ - -#define CoreDebug_DHCSR_S_NSUIDE_Pos 21U /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Position */ -#define CoreDebug_DHCSR_S_NSUIDE_Msk (1UL << CoreDebug_DHCSR_S_NSUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Mask */ - -#define CoreDebug_DHCSR_S_SDE_Pos 20U /*!< \deprecated CoreDebug DHCSR: S_SDE Position */ -#define CoreDebug_DHCSR_S_SDE_Msk (1UL << CoreDebug_DHCSR_S_SDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SDE Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_PMOV_Pos 6U /*!< \deprecated CoreDebug DHCSR: C_PMOV Position */ -#define CoreDebug_DHCSR_C_PMOV_Msk (1UL << CoreDebug_DHCSR_C_PMOV_Pos) /*!< \deprecated CoreDebug DHCSR: C_PMOV Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Set Clear Exception and Monitor Control Register Definitions */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_REQ_Pos 3U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_SET_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_PEND_Pos 1U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_SET_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_UIDEN_Pos 10U /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_UIDAPEN_Pos 9U /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDAPEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDAPEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Mask */ - -#define CoreDebug_DAUTHCTRL_FSDMA_Pos 8U /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Position */ -#define CoreDebug_DAUTHCTRL_FSDMA_Msk (1UL << CoreDebug_DAUTHCTRL_FSDMA_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_FPD_Pos 23U /*!< DCB DHCSR: Floating-point registers Debuggable Position */ -#define DCB_DHCSR_S_FPD_Msk (0x1UL << DCB_DHCSR_S_FPD_Pos) /*!< DCB DHCSR: Floating-point registers Debuggable Mask */ - -#define DCB_DHCSR_S_SUIDE_Pos 22U /*!< DCB DHCSR: Secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_SUIDE_Msk (0x1UL << DCB_DHCSR_S_SUIDE_Pos) /*!< DCB DHCSR: Secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_NSUIDE_Pos 21U /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_NSUIDE_Msk (0x1UL << DCB_DHCSR_S_NSUIDE_Pos) /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_PMOV_Pos 6U /*!< DCB DHCSR: Halt on PMU overflow control Position */ -#define DCB_DHCSR_C_PMOV_Msk (0x1UL << DCB_DHCSR_C_PMOV_Pos) /*!< DCB DHCSR: Halt on PMU overflow control Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DSCEMCR, Debug Set Clear Exception and Monitor Control Register Definitions */ -#define DCB_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< DCB DSCEMCR: Clear monitor request Position */ -#define DCB_DSCEMCR_CLR_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_REQ_Pos) /*!< DCB DSCEMCR: Clear monitor request Mask */ - -#define DCB_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< DCB DSCEMCR: Clear monitor pend Position */ -#define DCB_DSCEMCR_CLR_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_PEND_Pos) /*!< DCB DSCEMCR: Clear monitor pend Mask */ - -#define DCB_DSCEMCR_SET_MON_REQ_Pos 3U /*!< DCB DSCEMCR: Set monitor request Position */ -#define DCB_DSCEMCR_SET_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_SET_MON_REQ_Pos) /*!< DCB DSCEMCR: Set monitor request Mask */ - -#define DCB_DSCEMCR_SET_MON_PEND_Pos 1U /*!< DCB DSCEMCR: Set monitor pend Position */ -#define DCB_DSCEMCR_SET_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_SET_MON_PEND_Pos) /*!< DCB DSCEMCR: Set monitor pend Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_UIDEN_Pos 10U /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Position */ -#define DCB_DAUTHCTRL_UIDEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Mask */ - -#define DCB_DAUTHCTRL_UIDAPEN_Pos 9U /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Position */ -#define DCB_DAUTHCTRL_UIDAPEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDAPEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Mask */ - -#define DCB_DAUTHCTRL_FSDMA_Pos 8U /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Position */ -#define DCB_DAUTHCTRL_FSDMA_Msk (0x1UL << DCB_DAUTHCTRL_FSDMA_Pos) /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Mask */ - -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SUNID_Pos 22U /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUNID_Msk (0x3UL << DIB_DAUTHSTATUS_SUNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SUID_Pos 20U /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUID_Msk (0x3UL << DIB_DAUTHSTATUS_SUID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_NSUNID_Pos 18U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Position */ -#define DIB_DAUTHSTATUS_NSUNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Mask */ - -#define DIB_DAUTHSTATUS_NSUID_Pos 16U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_NSUID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define MEMSYSCTL_BASE (0xE001E000UL) /*!< Memory System Control Base Address */ - #define ERRBNK_BASE (0xE001E100UL) /*!< Error Banking Base Address */ - #define PWRMODCTL_BASE (0xE001E300UL) /*!< Power Mode Control Base Address */ - #define EWIC_BASE (0xE001E400UL) /*!< External Wakeup Interrupt Controller Base Address */ - #define PRCCFGINF_BASE (0xE001E700UL) /*!< Processor Configuration Information Base Address */ - #define STL_BASE (0xE001E800UL) /*!< Software Test Library Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define ICB ((ICB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define MEMSYSCTL ((MemSysCtl_Type *) MEMSYSCTL_BASE ) /*!< Memory System Control configuration struct */ - #define ERRBNK ((ErrBnk_Type *) ERRBNK_BASE ) /*!< Error Banking configuration struct */ - #define PWRMODCTL ((PwrModCtl_Type *) PWRMODCTL_BASE ) /*!< Power Mode Control configuration struct */ - #define EWIC ((EWIC_Type *) EWIC_BASE ) /*!< EWIC configuration struct */ - #define PRCCFGINF ((PrcCfgInf_Type *) PRCCFGINF_BASE ) /*!< Processor Configuration Information configuration struct */ - #define STL ((STL_Type *) STL_BASE ) /*!< Software Test Library configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - #define PMU_BASE (0xE0003000UL) /*!< PMU Base Address */ - #define PMU ((PMU_Type *) PMU_BASE ) /*!< PMU configuration struct */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define ICB_NS ((ICB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ - -/* 'SCnSCB' is deprecated and replaced by 'ICB' */ -typedef ICB_Type SCnSCB_Type; - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISCRITAXIRUW_Pos (ICB_ACTLR_DISCRITAXIRUW_Pos) -#define SCnSCB_ACTLR_DISCRITAXIRUW_Msk (ICB_ACTLR_DISCRITAXIRUW_Msk) - -#define SCnSCB_ACTLR_DISDI_Pos (ICB_ACTLR_DISDI_Pos) -#define SCnSCB_ACTLR_DISDI_Msk (ICB_ACTLR_DISDI_Msk) - -#define SCnSCB_ACTLR_DISCRITAXIRUR_Pos (ICB_ACTLR_DISCRITAXIRUR_Pos) -#define SCnSCB_ACTLR_DISCRITAXIRUR_Msk (ICB_ACTLR_DISCRITAXIRUR_Msk) - -#define SCnSCB_ACTLR_EVENTBUSEN_Pos (ICB_ACTLR_EVENTBUSEN_Pos) -#define SCnSCB_ACTLR_EVENTBUSEN_Msk (ICB_ACTLR_EVENTBUSEN_Msk) - -#define SCnSCB_ACTLR_EVENTBUSEN_S_Pos (ICB_ACTLR_EVENTBUSEN_S_Pos) -#define SCnSCB_ACTLR_EVENTBUSEN_S_Msk (ICB_ACTLR_EVENTBUSEN_S_Msk) - -#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos (ICB_ACTLR_DISITMATBFLUSH_Pos) -#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (ICB_ACTLR_DISITMATBFLUSH_Msk) - -#define SCnSCB_ACTLR_DISNWAMODE_Pos (ICB_ACTLR_DISNWAMODE_Pos) -#define SCnSCB_ACTLR_DISNWAMODE_Msk (ICB_ACTLR_DISNWAMODE_Msk) - -#define SCnSCB_ACTLR_FPEXCODIS_Pos (ICB_ACTLR_FPEXCODIS_Pos) -#define SCnSCB_ACTLR_FPEXCODIS_Msk (ICB_ACTLR_FPEXCODIS_Msk) - -#define SCnSCB_ACTLR_DISOLAP_Pos (ICB_ACTLR_DISOLAP_Pos) -#define SCnSCB_ACTLR_DISOLAP_Msk (ICB_ACTLR_DISOLAP_Msk) - -#define SCnSCB_ACTLR_DISOLAPS_Pos (ICB_ACTLR_DISOLAPS_Pos) -#define SCnSCB_ACTLR_DISOLAPS_Msk (ICB_ACTLR_DISOLAPS_Msk) - -#define SCnSCB_ACTLR_DISLOBR_Pos (ICB_ACTLR_DISLOBR_Pos) -#define SCnSCB_ACTLR_DISLOBR_Msk (ICB_ACTLR_DISLOBR_Msk) - -#define SCnSCB_ACTLR_DISLO_Pos (ICB_ACTLR_DISLO_Pos) -#define SCnSCB_ACTLR_DISLO_Msk (ICB_ACTLR_DISLO_Msk) - -#define SCnSCB_ACTLR_DISLOLEP_Pos (ICB_ACTLR_DISLOLEP_Pos) -#define SCnSCB_ACTLR_DISLOLEP_Msk (ICB_ACTLR_DISLOLEP_Msk) - -#define SCnSCB_ACTLR_DISFOLD_Pos (ICB_ACTLR_DISFOLD_Pos) -#define SCnSCB_ACTLR_DISFOLD_Msk (ICB_ACTLR_DISFOLD_Msk) - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos (ICB_ICTR_INTLINESNUM_Pos) -#define SCnSCB_ICTR_INTLINESNUM_Msk (ICB_ICTR_INTLINESNUM_Msk) - -#define SCnSCB (ICB) -#define SCnSCB_NS (ICB_NS) - -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## PMU functions and events #################################### */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - -#include "pmu_armv8.h" - -/** - \brief Cortex-M55 PMU events - \note Architectural PMU events can be found in pmu_armv8.h -*/ - -#define ARMCM55_PMU_ECC_ERR 0xC000 /*!< Any ECC error */ -#define ARMCM55_PMU_ECC_ERR_FATAL 0xC001 /*!< Any fatal ECC error */ -#define ARMCM55_PMU_ECC_ERR_DCACHE 0xC010 /*!< Any ECC error in the data cache */ -#define ARMCM55_PMU_ECC_ERR_ICACHE 0xC011 /*!< Any ECC error in the instruction cache */ -#define ARMCM55_PMU_ECC_ERR_FATAL_DCACHE 0xC012 /*!< Any fatal ECC error in the data cache */ -#define ARMCM55_PMU_ECC_ERR_FATAL_ICACHE 0xC013 /*!< Any fatal ECC error in the instruction cache*/ -#define ARMCM55_PMU_ECC_ERR_DTCM 0xC020 /*!< Any ECC error in the DTCM */ -#define ARMCM55_PMU_ECC_ERR_ITCM 0xC021 /*!< Any ECC error in the ITCM */ -#define ARMCM55_PMU_ECC_ERR_FATAL_DTCM 0xC022 /*!< Any fatal ECC error in the DTCM */ -#define ARMCM55_PMU_ECC_ERR_FATAL_ITCM 0xC023 /*!< Any fatal ECC error in the ITCM */ -#define ARMCM55_PMU_PF_LINEFILL 0xC100 /*!< A prefetcher starts a line-fill */ -#define ARMCM55_PMU_PF_CANCEL 0xC101 /*!< A prefetcher stops prefetching */ -#define ARMCM55_PMU_PF_DROP_LINEFILL 0xC102 /*!< A linefill triggered by a prefetcher has been dropped because of lack of buffering */ -#define ARMCM55_PMU_NWAMODE_ENTER 0xC200 /*!< No write-allocate mode entry */ -#define ARMCM55_PMU_NWAMODE 0xC201 /*!< Write-allocate store is not allocated into the data cache due to no-write-allocate mode */ -#define ARMCM55_PMU_SAHB_ACCESS 0xC300 /*!< Read or write access on the S-AHB interface to the TCM */ -#define ARMCM55_PMU_PAHB_ACCESS 0xC301 /*!< Read or write access to the P-AHB write interface */ -#define ARMCM55_PMU_AXI_WRITE_ACCESS 0xC302 /*!< Any beat access to M-AXI write interface */ -#define ARMCM55_PMU_AXI_READ_ACCESS 0xC303 /*!< Any beat access to M-AXI read interface */ -#define ARMCM55_PMU_DOSTIMEOUT_DOUBLE 0xC400 /*!< Denial of Service timeout has fired twice and caused buffers to drain to allow forward progress */ -#define ARMCM55_PMU_DOSTIMEOUT_TRIPLE 0xC401 /*!< Denial of Service timeout has fired three times and blocked the LSU to force forward progress */ - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - -/* ########################## MVE functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_MveFunctions MVE Functions - \brief Function that provides MVE type. - @{ - */ - -/** - \brief get MVE type - \details returns the MVE type - \returns - - \b 0: No Vector Extension (MVE) - - \b 1: Integer Vector Extension (MVE-I) - - \b 2: Floating-point Vector Extension (MVE-F) - */ -__STATIC_INLINE uint32_t SCB_GetMVEType(void) -{ - const uint32_t mvfr1 = FPU->MVFR1; - if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x2U << FPU_MVFR1_MVE_Pos)) - { - return 2U; - } - else if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x1U << FPU_MVFR1_MVE_Pos)) - { - return 1U; - } - else - { - return 0U; - } -} - - -/*@} end of CMSIS_Core_MveFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM55_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_cm7.h b/software/Power_Pico/Drivers/CMSIS/Include/core_cm7.h deleted file mode 100644 index 010506e..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_cm7.h +++ /dev/null @@ -1,2366 +0,0 @@ -/**************************************************************************//** - * @file core_cm7.h - * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File - * @version V5.1.6 - * @date 04. June 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM7_H_GENERIC -#define __CORE_CM7_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M7 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM7 definitions */ -#define __CM7_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM7_CMSIS_VERSION_SUB ( __CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ - __CM7_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (7U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM7_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM7_H_DEPENDANT -#define __CORE_CM7_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM7_REV - #define __CM7_REV 0x0000U - #warning "__CM7_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DTCM_PRESENT - #define __DTCM_PRESENT 0U - #warning "__DTCM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M7 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[1U]; - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - uint32_t RESERVED3[93U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ - uint32_t RESERVED7[5U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ - __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ - __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ - __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ - uint32_t RESERVED8[1U]; - __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ - -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/* Instruction Tightly-Coupled Memory Control Register Definitions */ -#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ -#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ - -#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ -#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ - -#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ -#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ - -#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ -#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ - -/* Data Tightly-Coupled Memory Control Register Definitions */ -#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ -#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ - -#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ -#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ - -#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ -#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ - -#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ -#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ - -/* AHBP Control Register Definitions */ -#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ -#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ - -#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ -#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ - -/* L1 Cache Control Register Definitions */ -#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ -#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ - -#define SCB_CACR_ECCEN_Pos 1U /*!< \deprecated SCB CACR: ECCEN Position */ -#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< \deprecated SCB CACR: ECCEN Mask */ - -#define SCB_CACR_ECCDIS_Pos 1U /*!< SCB CACR: ECCDIS Position */ -#define SCB_CACR_ECCDIS_Msk (1UL << SCB_CACR_ECCDIS_Pos) /*!< SCB CACR: ECCDIS Mask */ - -#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ -#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ - -/* AHBS Control Register Definitions */ -#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ -#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBSCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ - -#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ -#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBSCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ - -#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ -#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBSCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ - -/* Auxiliary Bus Fault Status Register Definitions */ -#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ -#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ - -#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ -#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ - -#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ -#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ - -#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ -#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ - -#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ -#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ - -#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ -#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISDYNADD_Pos 26U /*!< ACTLR: DISDYNADD Position */ -#define SCnSCB_ACTLR_DISDYNADD_Msk (1UL << SCnSCB_ACTLR_DISDYNADD_Pos) /*!< ACTLR: DISDYNADD Mask */ - -#define SCnSCB_ACTLR_DISISSCH1_Pos 21U /*!< ACTLR: DISISSCH1 Position */ -#define SCnSCB_ACTLR_DISISSCH1_Msk (0x1FUL << SCnSCB_ACTLR_DISISSCH1_Pos) /*!< ACTLR: DISISSCH1 Mask */ - -#define SCnSCB_ACTLR_DISDI_Pos 16U /*!< ACTLR: DISDI Position */ -#define SCnSCB_ACTLR_DISDI_Msk (0x1FUL << SCnSCB_ACTLR_DISDI_Pos) /*!< ACTLR: DISDI Mask */ - -#define SCnSCB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ -#define SCnSCB_ACTLR_DISCRITAXIRUR_Msk (1UL << SCnSCB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ - -#define SCnSCB_ACTLR_DISBTACALLOC_Pos 14U /*!< ACTLR: DISBTACALLOC Position */ -#define SCnSCB_ACTLR_DISBTACALLOC_Msk (1UL << SCnSCB_ACTLR_DISBTACALLOC_Pos) /*!< ACTLR: DISBTACALLOC Mask */ - -#define SCnSCB_ACTLR_DISBTACREAD_Pos 13U /*!< ACTLR: DISBTACREAD Position */ -#define SCnSCB_ACTLR_DISBTACREAD_Msk (1UL << SCnSCB_ACTLR_DISBTACREAD_Pos) /*!< ACTLR: DISBTACREAD Mask */ - -#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ -#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ - -#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ -#define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ - -#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ -#define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED3[981U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ -#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ - -#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ -#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ -#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ - -#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ -#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and FP Feature Register 2 Definitions */ - -#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */ -#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */ - -/*@} end of group CMSIS_FPU */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ -#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ -#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = SCB->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - -/*@} end of CMSIS_Core_FpuFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM7_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_cm85.h b/software/Power_Pico/Drivers/CMSIS/Include/core_cm85.h deleted file mode 100644 index 6046311..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_cm85.h +++ /dev/null @@ -1,4672 +0,0 @@ -/**************************************************************************//** - * @file core_cm85.h - * @brief CMSIS Cortex-M85 Core Peripheral Access Layer Header File - * @version V1.0.4 - * @date 21. April 2022 - ******************************************************************************/ -/* - * Copyright (c) 2022 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM85_H_GENERIC -#define __CORE_CM85_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M85 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM85 definitions */ - -#define __CORTEX_M (85U) /*!< Cortex-M Core */ - -#if defined ( __CC_ARM ) - #error Legacy Arm Compiler does not support Armv8.1-M target architecture. -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM85_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM85_H_DEPENDANT -#define __CORE_CM85_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM85_REV - #define __CM85_REV 0x0001U - #warning "__CM85_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #if __FPU_PRESENT != 0U - #ifndef __FPU_DP - #define __FPU_DP 0U - #warning "__FPU_DP not defined in device header file; using default!" - #endif - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __PMU_PRESENT - #define __PMU_PRESENT 0U - #warning "__PMU_PRESENT not defined in device header file; using default!" - #endif - - #if __PMU_PRESENT != 0U - #ifndef __PMU_NUM_EVENTCNT - #define __PMU_NUM_EVENTCNT 8U - #warning "__PMU_NUM_EVENTCNT not defined in device header file; using default!" - #elif (__PMU_NUM_EVENTCNT > 8 || __PMU_NUM_EVENTCNT < 2) - #error "__PMU_NUM_EVENTCNT is out of range in device header file!" */ - #endif - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M85 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core EWIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core PMU Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:1; /*!< bit: 20 Reserved */ - uint32_t B:1; /*!< bit: 21 BTI active (read 0) */ - uint32_t _reserved2:2; /*!< bit: 22..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_B_Pos 21U /*!< xPSR: B Position */ -#define xPSR_B_Msk (1UL << xPSR_B_Pos) /*!< xPSR: B Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t BTI_EN:1; /*!< bit: 4 Privileged branch target identification enable */ - uint32_t UBTI_EN:1; /*!< bit: 5 Unprivileged branch target identification enable */ - uint32_t PAC_EN:1; /*!< bit: 6 Privileged pointer authentication enable */ - uint32_t UPAC_EN:1; /*!< bit: 7 Unprivileged pointer authentication enable */ - uint32_t _reserved1:24; /*!< bit: 8..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_UPAC_EN_Pos 7U /*!< CONTROL: UPAC_EN Position */ -#define CONTROL_UPAC_EN_Msk (1UL << CONTROL_UPAC_EN_Pos) /*!< CONTROL: UPAC_EN Mask */ - -#define CONTROL_PAC_EN_Pos 6U /*!< CONTROL: PAC_EN Position */ -#define CONTROL_PAC_EN_Msk (1UL << CONTROL_PAC_EN_Pos) /*!< CONTROL: PAC_EN Mask */ - -#define CONTROL_UBTI_EN_Pos 5U /*!< CONTROL: UBTI_EN Position */ -#define CONTROL_UBTI_EN_Msk (1UL << CONTROL_UBTI_EN_Pos) /*!< CONTROL: UBTI_EN Mask */ - -#define CONTROL_BTI_EN_Pos 4U /*!< CONTROL: BTI_EN Position */ -#define CONTROL_BTI_EN_Msk (1UL << CONTROL_BTI_EN_Pos) /*!< CONTROL: BTI_EN Mask */ - -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - __IOM uint32_t RFSR; /*!< Offset: 0x204 (R/W) RAS Fault Status Register */ - uint32_t RESERVED4[14U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_IESB_Pos 5U /*!< SCB AIRCR: Implicit ESB Enable Position */ -#define SCB_AIRCR_IESB_Msk (1UL << SCB_AIRCR_IESB_Pos) /*!< SCB AIRCR: Implicit ESB Enable Mask */ - -#define SCB_AIRCR_DIT_Pos 4U /*!< SCB AIRCR: Data Independent Timing Position */ -#define SCB_AIRCR_DIT_Msk (1UL << SCB_AIRCR_DIT_Pos) /*!< SCB AIRCR: Data Independent Timing Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_TRD_Pos 20U /*!< SCB CCR: TRD Position */ -#define SCB_CCR_TRD_Msk (1UL << SCB_CCR_TRD_Pos) /*!< SCB CCR: TRD Mask */ - -#define SCB_CCR_LOB_Pos 19U /*!< SCB CCR: LOB Position */ -#define SCB_CCR_LOB_Msk (1UL << SCB_CCR_LOB_Pos) /*!< SCB CCR: LOB Mask */ - -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_PMU_Pos 5U /*!< SCB DFSR: PMU Position */ -#define SCB_DFSR_PMU_Msk (1UL << SCB_DFSR_PMU_Pos) /*!< SCB DFSR: PMU Mask */ - -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CP7_Pos 7U /*!< SCB NSACR: CP7 Position */ -#define SCB_NSACR_CP7_Msk (1UL << SCB_NSACR_CP7_Pos) /*!< SCB NSACR: CP7 Mask */ - -#define SCB_NSACR_CP6_Pos 6U /*!< SCB NSACR: CP6 Position */ -#define SCB_NSACR_CP6_Msk (1UL << SCB_NSACR_CP6_Pos) /*!< SCB NSACR: CP6 Mask */ - -#define SCB_NSACR_CP5_Pos 5U /*!< SCB NSACR: CP5 Position */ -#define SCB_NSACR_CP5_Msk (1UL << SCB_NSACR_CP5_Pos) /*!< SCB NSACR: CP5 Mask */ - -#define SCB_NSACR_CP4_Pos 4U /*!< SCB NSACR: CP4 Position */ -#define SCB_NSACR_CP4_Msk (1UL << SCB_NSACR_CP4_Pos) /*!< SCB NSACR: CP4 Mask */ - -#define SCB_NSACR_CP3_Pos 3U /*!< SCB NSACR: CP3 Position */ -#define SCB_NSACR_CP3_Msk (1UL << SCB_NSACR_CP3_Pos) /*!< SCB NSACR: CP3 Mask */ - -#define SCB_NSACR_CP2_Pos 2U /*!< SCB NSACR: CP2 Position */ -#define SCB_NSACR_CP2_Msk (1UL << SCB_NSACR_CP2_Pos) /*!< SCB NSACR: CP2 Mask */ - -#define SCB_NSACR_CP1_Pos 1U /*!< SCB NSACR: CP1 Position */ -#define SCB_NSACR_CP1_Msk (1UL << SCB_NSACR_CP1_Pos) /*!< SCB NSACR: CP1 Mask */ - -#define SCB_NSACR_CP0_Pos 0U /*!< SCB NSACR: CP0 Position */ -#define SCB_NSACR_CP0_Msk (1UL /*<< SCB_NSACR_CP0_Pos*/) /*!< SCB NSACR: CP0 Mask */ - -/* SCB Debug Feature Register 0 Definitions */ -#define SCB_ID_DFR_UDE_Pos 28U /*!< SCB ID_DFR: UDE Position */ -#define SCB_ID_DFR_UDE_Msk (0xFUL << SCB_ID_DFR_UDE_Pos) /*!< SCB ID_DFR: UDE Mask */ - -#define SCB_ID_DFR_MProfDbg_Pos 20U /*!< SCB ID_DFR: MProfDbg Position */ -#define SCB_ID_DFR_MProfDbg_Msk (0xFUL << SCB_ID_DFR_MProfDbg_Pos) /*!< SCB ID_DFR: MProfDbg Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB RAS Fault Status Register Definitions */ -#define SCB_RFSR_V_Pos 31U /*!< SCB RFSR: V Position */ -#define SCB_RFSR_V_Msk (1UL << SCB_RFSR_V_Pos) /*!< SCB RFSR: V Mask */ - -#define SCB_RFSR_IS_Pos 16U /*!< SCB RFSR: IS Position */ -#define SCB_RFSR_IS_Msk (0x7FFFUL << SCB_RFSR_IS_Pos) /*!< SCB RFSR: IS Mask */ - -#define SCB_RFSR_UET_Pos 0U /*!< SCB RFSR: UET Position */ -#define SCB_RFSR_UET_Msk (3UL /*<< SCB_RFSR_UET_Pos*/) /*!< SCB RFSR: UET Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ICB Implementation Control Block register (ICB) - \brief Type definitions for the Implementation Control Block Register - @{ - */ - -/** - \brief Structure type to access the Implementation Control Block (ICB). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} ICB_Type; - -/* Auxiliary Control Register Definitions */ -#define ICB_ACTLR_DISCRITAXIRUW_Pos 27U /*!< ACTLR: DISCRITAXIRUW Position */ -#define ICB_ACTLR_DISCRITAXIRUW_Msk (1UL << ICB_ACTLR_DISCRITAXIRUW_Pos) /*!< ACTLR: DISCRITAXIRUW Mask */ - -#define ICB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ -#define ICB_ACTLR_DISCRITAXIRUR_Msk (1UL << ICB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ - -#define ICB_ACTLR_EVENTBUSEN_Pos 14U /*!< ACTLR: EVENTBUSEN Position */ -#define ICB_ACTLR_EVENTBUSEN_Msk (1UL << ICB_ACTLR_EVENTBUSEN_Pos) /*!< ACTLR: EVENTBUSEN Mask */ - -#define ICB_ACTLR_EVENTBUSEN_S_Pos 13U /*!< ACTLR: EVENTBUSEN_S Position */ -#define ICB_ACTLR_EVENTBUSEN_S_Msk (1UL << ICB_ACTLR_EVENTBUSEN_S_Pos) /*!< ACTLR: EVENTBUSEN_S Mask */ - -#define ICB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ -#define ICB_ACTLR_DISITMATBFLUSH_Msk (1UL << ICB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ - -#define ICB_ACTLR_DISNWAMODE_Pos 11U /*!< ACTLR: DISNWAMODE Position */ -#define ICB_ACTLR_DISNWAMODE_Msk (1UL << ICB_ACTLR_DISNWAMODE_Pos) /*!< ACTLR: DISNWAMODE Mask */ - -#define ICB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ -#define ICB_ACTLR_FPEXCODIS_Msk (1UL << ICB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ - -/* Interrupt Controller Type Register Definitions */ -#define ICB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define ICB_ICTR_INTLINESNUM_Msk (0xFUL /*<< ICB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_ICB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[3U]; - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) ITM Device Type Register */ - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup MemSysCtl_Type Memory System Control Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Memory System Control Registers (MEMSYSCTL) - @{ - */ - -/** - \brief Structure type to access the Memory System Control Registers (MEMSYSCTL). - */ -typedef struct -{ - __IOM uint32_t MSCR; /*!< Offset: 0x000 (R/W) Memory System Control Register */ - __IOM uint32_t PFCR; /*!< Offset: 0x004 (R/W) Prefetcher Control Register */ - uint32_t RESERVED1[2U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x010 (R/W) ITCM Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x014 (R/W) DTCM Control Register */ - __IOM uint32_t PAHBCR; /*!< Offset: 0x018 (R/W) P-AHB Control Register */ - uint32_t RESERVED2[313U]; - __IOM uint32_t ITGU_CTRL; /*!< Offset: 0x500 (R/W) ITGU Control Register */ - __IOM uint32_t ITGU_CFG; /*!< Offset: 0x504 (R/W) ITGU Configuration Register */ - uint32_t RESERVED3[2U]; - __IOM uint32_t ITGU_LUT[16U]; /*!< Offset: 0x510 (R/W) ITGU Look Up Table Register */ - uint32_t RESERVED4[44U]; - __IOM uint32_t DTGU_CTRL; /*!< Offset: 0x600 (R/W) DTGU Control Registers */ - __IOM uint32_t DTGU_CFG; /*!< Offset: 0x604 (R/W) DTGU Configuration Register */ - uint32_t RESERVED5[2U]; - __IOM uint32_t DTGU_LUT[16U]; /*!< Offset: 0x610 (R/W) DTGU Look Up Table Register */ -} MemSysCtl_Type; - -/* MEMSYSCTL Memory System Control Register (MSCR) Register Definitions */ -#define MEMSYSCTL_MSCR_CPWRDN_Pos 17U /*!< MEMSYSCTL MSCR: CPWRDN Position */ -#define MEMSYSCTL_MSCR_CPWRDN_Msk (0x1UL << MEMSYSCTL_MSCR_CPWRDN_Pos) /*!< MEMSYSCTL MSCR: CPWRDN Mask */ - -#define MEMSYSCTL_MSCR_DCCLEAN_Pos 16U /*!< MEMSYSCTL MSCR: DCCLEAN Position */ -#define MEMSYSCTL_MSCR_DCCLEAN_Msk (0x1UL << MEMSYSCTL_MSCR_DCCLEAN_Pos) /*!< MEMSYSCTL MSCR: DCCLEAN Mask */ - -#define MEMSYSCTL_MSCR_ICACTIVE_Pos 13U /*!< MEMSYSCTL MSCR: ICACTIVE Position */ -#define MEMSYSCTL_MSCR_ICACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_ICACTIVE_Pos) /*!< MEMSYSCTL MSCR: ICACTIVE Mask */ - -#define MEMSYSCTL_MSCR_DCACTIVE_Pos 12U /*!< MEMSYSCTL MSCR: DCACTIVE Position */ -#define MEMSYSCTL_MSCR_DCACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_DCACTIVE_Pos) /*!< MEMSYSCTL MSCR: DCACTIVE Mask */ - -#define MEMSYSCTL_MSCR_EVECCFAULT_Pos 3U /*!< MEMSYSCTL MSCR: EVECCFAULT Position */ -#define MEMSYSCTL_MSCR_EVECCFAULT_Msk (0x1UL << MEMSYSCTL_MSCR_EVECCFAULT_Pos) /*!< MEMSYSCTL MSCR: EVECCFAULT Mask */ - -#define MEMSYSCTL_MSCR_FORCEWT_Pos 2U /*!< MEMSYSCTL MSCR: FORCEWT Position */ -#define MEMSYSCTL_MSCR_FORCEWT_Msk (0x1UL << MEMSYSCTL_MSCR_FORCEWT_Pos) /*!< MEMSYSCTL MSCR: FORCEWT Mask */ - -#define MEMSYSCTL_MSCR_ECCEN_Pos 1U /*!< MEMSYSCTL MSCR: ECCEN Position */ -#define MEMSYSCTL_MSCR_ECCEN_Msk (0x1UL << MEMSYSCTL_MSCR_ECCEN_Pos) /*!< MEMSYSCTL MSCR: ECCEN Mask */ - -/* MEMSYSCTL Prefetcher Control Register (PFCR) Register Definitions */ -#define MEMSYSCTL_PFCR_DIS_NLP_Pos 7U /*!< MEMSYSCTL PFCR: DIS_NLP Position */ -#define MEMSYSCTL_PFCR_DIS_NLP_Msk (0x1UL << MEMSYSCTL_PFCR_DIS_NLP_Pos) /*!< MEMSYSCTL PFCR: DIS_NLP Mask */ - -#define MEMSYSCTL_PFCR_ENABLE_Pos 0U /*!< MEMSYSCTL PFCR: ENABLE Position */ -#define MEMSYSCTL_PFCR_ENABLE_Msk (0x1UL /*<< MEMSYSCTL_PFCR_ENABLE_Pos*/) /*!< MEMSYSCTL PFCR: ENABLE Mask */ - -/* MEMSYSCTL ITCM Control Register (ITCMCR) Register Definitions */ -#define MEMSYSCTL_ITCMCR_SZ_Pos 3U /*!< MEMSYSCTL ITCMCR: SZ Position */ -#define MEMSYSCTL_ITCMCR_SZ_Msk (0xFUL << MEMSYSCTL_ITCMCR_SZ_Pos) /*!< MEMSYSCTL ITCMCR: SZ Mask */ - -#define MEMSYSCTL_ITCMCR_EN_Pos 0U /*!< MEMSYSCTL ITCMCR: EN Position */ -#define MEMSYSCTL_ITCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_ITCMCR_EN_Pos*/) /*!< MEMSYSCTL ITCMCR: EN Mask */ - -/* MEMSYSCTL DTCM Control Register (DTCMCR) Register Definitions */ -#define MEMSYSCTL_DTCMCR_SZ_Pos 3U /*!< MEMSYSCTL DTCMCR: SZ Position */ -#define MEMSYSCTL_DTCMCR_SZ_Msk (0xFUL << MEMSYSCTL_DTCMCR_SZ_Pos) /*!< MEMSYSCTL DTCMCR: SZ Mask */ - -#define MEMSYSCTL_DTCMCR_EN_Pos 0U /*!< MEMSYSCTL DTCMCR: EN Position */ -#define MEMSYSCTL_DTCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_DTCMCR_EN_Pos*/) /*!< MEMSYSCTL DTCMCR: EN Mask */ - -/* MEMSYSCTL P-AHB Control Register (PAHBCR) Register Definitions */ -#define MEMSYSCTL_PAHBCR_SZ_Pos 1U /*!< MEMSYSCTL PAHBCR: SZ Position */ -#define MEMSYSCTL_PAHBCR_SZ_Msk (0x7UL << MEMSYSCTL_PAHBCR_SZ_Pos) /*!< MEMSYSCTL PAHBCR: SZ Mask */ - -#define MEMSYSCTL_PAHBCR_EN_Pos 0U /*!< MEMSYSCTL PAHBCR: EN Position */ -#define MEMSYSCTL_PAHBCR_EN_Msk (0x1UL /*<< MEMSYSCTL_PAHBCR_EN_Pos*/) /*!< MEMSYSCTL PAHBCR: EN Mask */ - -/* MEMSYSCTL ITGU Control Register (ITGU_CTRL) Register Definitions */ -#define MEMSYSCTL_ITGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL ITGU_CTRL: DEREN Position */ -#define MEMSYSCTL_ITGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_ITGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL ITGU_CTRL: DEREN Mask */ - -#define MEMSYSCTL_ITGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL ITGU_CTRL: DBFEN Position */ -#define MEMSYSCTL_ITGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_ITGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL ITGU_CTRL: DBFEN Mask */ - -/* MEMSYSCTL ITGU Configuration Register (ITGU_CFG) Register Definitions */ -#define MEMSYSCTL_ITGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL ITGU_CFG: PRESENT Position */ -#define MEMSYSCTL_ITGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_ITGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL ITGU_CFG: PRESENT Mask */ - -#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Position */ -#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Mask */ - -#define MEMSYSCTL_ITGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL ITGU_CFG: BLKSZ Position */ -#define MEMSYSCTL_ITGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_ITGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL ITGU_CFG: BLKSZ Mask */ - -/* MEMSYSCTL DTGU Control Registers (DTGU_CTRL) Register Definitions */ -#define MEMSYSCTL_DTGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL DTGU_CTRL: DEREN Position */ -#define MEMSYSCTL_DTGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_DTGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL DTGU_CTRL: DEREN Mask */ - -#define MEMSYSCTL_DTGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL DTGU_CTRL: DBFEN Position */ -#define MEMSYSCTL_DTGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_DTGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL DTGU_CTRL: DBFEN Mask */ - -/* MEMSYSCTL DTGU Configuration Register (DTGU_CFG) Register Definitions */ -#define MEMSYSCTL_DTGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL DTGU_CFG: PRESENT Position */ -#define MEMSYSCTL_DTGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_DTGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL DTGU_CFG: PRESENT Mask */ - -#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Position */ -#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Mask */ - -#define MEMSYSCTL_DTGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL DTGU_CFG: BLKSZ Position */ -#define MEMSYSCTL_DTGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_DTGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL DTGU_CFG: BLKSZ Mask */ - - -/*@}*/ /* end of group MemSysCtl_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup PwrModCtl_Type Power Mode Control Registers - \brief Type definitions for the Power Mode Control Registers (PWRMODCTL) - @{ - */ - -/** - \brief Structure type to access the Power Mode Control Registers (PWRMODCTL). - */ -typedef struct -{ - __IOM uint32_t CPDLPSTATE; /*!< Offset: 0x000 (R/W) Core Power Domain Low Power State Register */ - __IOM uint32_t DPDLPSTATE; /*!< Offset: 0x004 (R/W) Debug Power Domain Low Power State Register */ -} PwrModCtl_Type; - -/* PWRMODCTL Core Power Domain Low Power State (CPDLPSTATE) Register Definitions */ -#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos 8U /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Mask */ - -#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos 4U /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Mask */ - -#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos 0U /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Msk (0x3UL /*<< PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos*/) /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Mask */ - -/* PWRMODCTL Debug Power Domain Low Power State (DPDLPSTATE) Register Definitions */ -#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos 0U /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Position */ -#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Msk (0x3UL /*<< PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos*/) /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Mask */ - -/*@}*/ /* end of group PwrModCtl_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup EWIC_Type External Wakeup Interrupt Controller Registers - \brief Type definitions for the External Wakeup Interrupt Controller Registers (EWIC) - @{ - */ - -/** - \brief Structure type to access the External Wakeup Interrupt Controller Registers (EWIC). - */ -typedef struct -{ - __OM uint32_t EVENTSPR; /*!< Offset: 0x000 ( /W) Event Set Pending Register */ - uint32_t RESERVED0[31U]; - __IM uint32_t EVENTMASKA; /*!< Offset: 0x080 (R/W) Event Mask A Register */ - __IM uint32_t EVENTMASK[15]; /*!< Offset: 0x084 (R/W) Event Mask Register */ -} EWIC_Type; - -/* EWIC External Wakeup Interrupt Controller (EVENTSPR) Register Definitions */ -#define EWIC_EVENTSPR_EDBGREQ_Pos 2U /*!< EWIC EVENTSPR: EDBGREQ Position */ -#define EWIC_EVENTSPR_EDBGREQ_Msk (0x1UL << EWIC_EVENTSPR_EDBGREQ_Pos) /*!< EWIC EVENTSPR: EDBGREQ Mask */ - -#define EWIC_EVENTSPR_NMI_Pos 1U /*!< EWIC EVENTSPR: NMI Position */ -#define EWIC_EVENTSPR_NMI_Msk (0x1UL << EWIC_EVENTSPR_NMI_Pos) /*!< EWIC EVENTSPR: NMI Mask */ - -#define EWIC_EVENTSPR_EVENT_Pos 0U /*!< EWIC EVENTSPR: EVENT Position */ -#define EWIC_EVENTSPR_EVENT_Msk (0x1UL /*<< EWIC_EVENTSPR_EVENT_Pos*/) /*!< EWIC EVENTSPR: EVENT Mask */ - -/* EWIC External Wakeup Interrupt Controller (EVENTMASKA) Register Definitions */ -#define EWIC_EVENTMASKA_EDBGREQ_Pos 2U /*!< EWIC EVENTMASKA: EDBGREQ Position */ -#define EWIC_EVENTMASKA_EDBGREQ_Msk (0x1UL << EWIC_EVENTMASKA_EDBGREQ_Pos) /*!< EWIC EVENTMASKA: EDBGREQ Mask */ - -#define EWIC_EVENTMASKA_NMI_Pos 1U /*!< EWIC EVENTMASKA: NMI Position */ -#define EWIC_EVENTMASKA_NMI_Msk (0x1UL << EWIC_EVENTMASKA_NMI_Pos) /*!< EWIC EVENTMASKA: NMI Mask */ - -#define EWIC_EVENTMASKA_EVENT_Pos 0U /*!< EWIC EVENTMASKA: EVENT Position */ -#define EWIC_EVENTMASKA_EVENT_Msk (0x1UL /*<< EWIC_EVENTMASKA_EVENT_Pos*/) /*!< EWIC EVENTMASKA: EVENT Mask */ - -/* EWIC External Wakeup Interrupt Controller (EVENTMASK) Register Definitions */ -#define EWIC_EVENTMASK_IRQ_Pos 0U /*!< EWIC EVENTMASKA: IRQ Position */ -#define EWIC_EVENTMASK_IRQ_Msk (0xFFFFFFFFUL /*<< EWIC_EVENTMASKA_IRQ_Pos*/) /*!< EWIC EVENTMASKA: IRQ Mask */ - -/*@}*/ /* end of group EWIC_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup ErrBnk_Type Error Banking Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Error Banking Registers (ERRBNK) - @{ - */ - -/** - \brief Structure type to access the Error Banking Registers (ERRBNK). - */ -typedef struct -{ - __IOM uint32_t IEBR0; /*!< Offset: 0x000 (R/W) Instruction Cache Error Bank Register 0 */ - __IOM uint32_t IEBR1; /*!< Offset: 0x004 (R/W) Instruction Cache Error Bank Register 1 */ - uint32_t RESERVED0[2U]; - __IOM uint32_t DEBR0; /*!< Offset: 0x010 (R/W) Data Cache Error Bank Register 0 */ - __IOM uint32_t DEBR1; /*!< Offset: 0x014 (R/W) Data Cache Error Bank Register 1 */ - uint32_t RESERVED1[2U]; - __IOM uint32_t TEBR0; /*!< Offset: 0x020 (R/W) TCM Error Bank Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t TEBR1; /*!< Offset: 0x028 (R/W) TCM Error Bank Register 1 */ -} ErrBnk_Type; - -/* ERRBNK Instruction Cache Error Bank Register 0 (IEBR0) Register Definitions */ -#define ERRBNK_IEBR0_SWDEF_Pos 30U /*!< ERRBNK IEBR0: SWDEF Position */ -#define ERRBNK_IEBR0_SWDEF_Msk (0x3UL << ERRBNK_IEBR0_SWDEF_Pos) /*!< ERRBNK IEBR0: SWDEF Mask */ - -#define ERRBNK_IEBR0_BANK_Pos 16U /*!< ERRBNK IEBR0: BANK Position */ -#define ERRBNK_IEBR0_BANK_Msk (0x1UL << ERRBNK_IEBR0_BANK_Pos) /*!< ERRBNK IEBR0: BANK Mask */ - -#define ERRBNK_IEBR0_LOCATION_Pos 2U /*!< ERRBNK IEBR0: LOCATION Position */ -#define ERRBNK_IEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR0_LOCATION_Pos) /*!< ERRBNK IEBR0: LOCATION Mask */ - -#define ERRBNK_IEBR0_LOCKED_Pos 1U /*!< ERRBNK IEBR0: LOCKED Position */ -#define ERRBNK_IEBR0_LOCKED_Msk (0x1UL << ERRBNK_IEBR0_LOCKED_Pos) /*!< ERRBNK IEBR0: LOCKED Mask */ - -#define ERRBNK_IEBR0_VALID_Pos 0U /*!< ERRBNK IEBR0: VALID Position */ -#define ERRBNK_IEBR0_VALID_Msk (0x1UL << /*ERRBNK_IEBR0_VALID_Pos*/) /*!< ERRBNK IEBR0: VALID Mask */ - -/* ERRBNK Instruction Cache Error Bank Register 1 (IEBR1) Register Definitions */ -#define ERRBNK_IEBR1_SWDEF_Pos 30U /*!< ERRBNK IEBR1: SWDEF Position */ -#define ERRBNK_IEBR1_SWDEF_Msk (0x3UL << ERRBNK_IEBR1_SWDEF_Pos) /*!< ERRBNK IEBR1: SWDEF Mask */ - -#define ERRBNK_IEBR1_BANK_Pos 16U /*!< ERRBNK IEBR1: BANK Position */ -#define ERRBNK_IEBR1_BANK_Msk (0x1UL << ERRBNK_IEBR1_BANK_Pos) /*!< ERRBNK IEBR1: BANK Mask */ - -#define ERRBNK_IEBR1_LOCATION_Pos 2U /*!< ERRBNK IEBR1: LOCATION Position */ -#define ERRBNK_IEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR1_LOCATION_Pos) /*!< ERRBNK IEBR1: LOCATION Mask */ - -#define ERRBNK_IEBR1_LOCKED_Pos 1U /*!< ERRBNK IEBR1: LOCKED Position */ -#define ERRBNK_IEBR1_LOCKED_Msk (0x1UL << ERRBNK_IEBR1_LOCKED_Pos) /*!< ERRBNK IEBR1: LOCKED Mask */ - -#define ERRBNK_IEBR1_VALID_Pos 0U /*!< ERRBNK IEBR1: VALID Position */ -#define ERRBNK_IEBR1_VALID_Msk (0x1UL << /*ERRBNK_IEBR1_VALID_Pos*/) /*!< ERRBNK IEBR1: VALID Mask */ - -/* ERRBNK Data Cache Error Bank Register 0 (DEBR0) Register Definitions */ -#define ERRBNK_DEBR0_SWDEF_Pos 30U /*!< ERRBNK DEBR0: SWDEF Position */ -#define ERRBNK_DEBR0_SWDEF_Msk (0x3UL << ERRBNK_DEBR0_SWDEF_Pos) /*!< ERRBNK DEBR0: SWDEF Mask */ - -#define ERRBNK_DEBR0_TYPE_Pos 17U /*!< ERRBNK DEBR0: TYPE Position */ -#define ERRBNK_DEBR0_TYPE_Msk (0x1UL << ERRBNK_DEBR0_TYPE_Pos) /*!< ERRBNK DEBR0: TYPE Mask */ - -#define ERRBNK_DEBR0_BANK_Pos 16U /*!< ERRBNK DEBR0: BANK Position */ -#define ERRBNK_DEBR0_BANK_Msk (0x1UL << ERRBNK_DEBR0_BANK_Pos) /*!< ERRBNK DEBR0: BANK Mask */ - -#define ERRBNK_DEBR0_LOCATION_Pos 2U /*!< ERRBNK DEBR0: LOCATION Position */ -#define ERRBNK_DEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR0_LOCATION_Pos) /*!< ERRBNK DEBR0: LOCATION Mask */ - -#define ERRBNK_DEBR0_LOCKED_Pos 1U /*!< ERRBNK DEBR0: LOCKED Position */ -#define ERRBNK_DEBR0_LOCKED_Msk (0x1UL << ERRBNK_DEBR0_LOCKED_Pos) /*!< ERRBNK DEBR0: LOCKED Mask */ - -#define ERRBNK_DEBR0_VALID_Pos 0U /*!< ERRBNK DEBR0: VALID Position */ -#define ERRBNK_DEBR0_VALID_Msk (0x1UL << /*ERRBNK_DEBR0_VALID_Pos*/) /*!< ERRBNK DEBR0: VALID Mask */ - -/* ERRBNK Data Cache Error Bank Register 1 (DEBR1) Register Definitions */ -#define ERRBNK_DEBR1_SWDEF_Pos 30U /*!< ERRBNK DEBR1: SWDEF Position */ -#define ERRBNK_DEBR1_SWDEF_Msk (0x3UL << ERRBNK_DEBR1_SWDEF_Pos) /*!< ERRBNK DEBR1: SWDEF Mask */ - -#define ERRBNK_DEBR1_TYPE_Pos 17U /*!< ERRBNK DEBR1: TYPE Position */ -#define ERRBNK_DEBR1_TYPE_Msk (0x1UL << ERRBNK_DEBR1_TYPE_Pos) /*!< ERRBNK DEBR1: TYPE Mask */ - -#define ERRBNK_DEBR1_BANK_Pos 16U /*!< ERRBNK DEBR1: BANK Position */ -#define ERRBNK_DEBR1_BANK_Msk (0x1UL << ERRBNK_DEBR1_BANK_Pos) /*!< ERRBNK DEBR1: BANK Mask */ - -#define ERRBNK_DEBR1_LOCATION_Pos 2U /*!< ERRBNK DEBR1: LOCATION Position */ -#define ERRBNK_DEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR1_LOCATION_Pos) /*!< ERRBNK DEBR1: LOCATION Mask */ - -#define ERRBNK_DEBR1_LOCKED_Pos 1U /*!< ERRBNK DEBR1: LOCKED Position */ -#define ERRBNK_DEBR1_LOCKED_Msk (0x1UL << ERRBNK_DEBR1_LOCKED_Pos) /*!< ERRBNK DEBR1: LOCKED Mask */ - -#define ERRBNK_DEBR1_VALID_Pos 0U /*!< ERRBNK DEBR1: VALID Position */ -#define ERRBNK_DEBR1_VALID_Msk (0x1UL << /*ERRBNK_DEBR1_VALID_Pos*/) /*!< ERRBNK DEBR1: VALID Mask */ - -/* ERRBNK TCM Error Bank Register 0 (TEBR0) Register Definitions */ -#define ERRBNK_TEBR0_SWDEF_Pos 30U /*!< ERRBNK TEBR0: SWDEF Position */ -#define ERRBNK_TEBR0_SWDEF_Msk (0x3UL << ERRBNK_TEBR0_SWDEF_Pos) /*!< ERRBNK TEBR0: SWDEF Mask */ - -#define ERRBNK_TEBR0_POISON_Pos 28U /*!< ERRBNK TEBR0: POISON Position */ -#define ERRBNK_TEBR0_POISON_Msk (0x1UL << ERRBNK_TEBR0_POISON_Pos) /*!< ERRBNK TEBR0: POISON Mask */ - -#define ERRBNK_TEBR0_TYPE_Pos 27U /*!< ERRBNK TEBR0: TYPE Position */ -#define ERRBNK_TEBR0_TYPE_Msk (0x1UL << ERRBNK_TEBR0_TYPE_Pos) /*!< ERRBNK TEBR0: TYPE Mask */ - -#define ERRBNK_TEBR0_BANK_Pos 24U /*!< ERRBNK TEBR0: BANK Position */ -#define ERRBNK_TEBR0_BANK_Msk (0x3UL << ERRBNK_TEBR0_BANK_Pos) /*!< ERRBNK TEBR0: BANK Mask */ - -#define ERRBNK_TEBR0_LOCATION_Pos 2U /*!< ERRBNK TEBR0: LOCATION Position */ -#define ERRBNK_TEBR0_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR0_LOCATION_Pos) /*!< ERRBNK TEBR0: LOCATION Mask */ - -#define ERRBNK_TEBR0_LOCKED_Pos 1U /*!< ERRBNK TEBR0: LOCKED Position */ -#define ERRBNK_TEBR0_LOCKED_Msk (0x1UL << ERRBNK_TEBR0_LOCKED_Pos) /*!< ERRBNK TEBR0: LOCKED Mask */ - -#define ERRBNK_TEBR0_VALID_Pos 0U /*!< ERRBNK TEBR0: VALID Position */ -#define ERRBNK_TEBR0_VALID_Msk (0x1UL << /*ERRBNK_TEBR0_VALID_Pos*/) /*!< ERRBNK TEBR0: VALID Mask */ - -/* ERRBNK TCM Error Bank Register 1 (TEBR1) Register Definitions */ -#define ERRBNK_TEBR1_SWDEF_Pos 30U /*!< ERRBNK TEBR1: SWDEF Position */ -#define ERRBNK_TEBR1_SWDEF_Msk (0x3UL << ERRBNK_TEBR1_SWDEF_Pos) /*!< ERRBNK TEBR1: SWDEF Mask */ - -#define ERRBNK_TEBR1_POISON_Pos 28U /*!< ERRBNK TEBR1: POISON Position */ -#define ERRBNK_TEBR1_POISON_Msk (0x1UL << ERRBNK_TEBR1_POISON_Pos) /*!< ERRBNK TEBR1: POISON Mask */ - -#define ERRBNK_TEBR1_TYPE_Pos 27U /*!< ERRBNK TEBR1: TYPE Position */ -#define ERRBNK_TEBR1_TYPE_Msk (0x1UL << ERRBNK_TEBR1_TYPE_Pos) /*!< ERRBNK TEBR1: TYPE Mask */ - -#define ERRBNK_TEBR1_BANK_Pos 24U /*!< ERRBNK TEBR1: BANK Position */ -#define ERRBNK_TEBR1_BANK_Msk (0x3UL << ERRBNK_TEBR1_BANK_Pos) /*!< ERRBNK TEBR1: BANK Mask */ - -#define ERRBNK_TEBR1_LOCATION_Pos 2U /*!< ERRBNK TEBR1: LOCATION Position */ -#define ERRBNK_TEBR1_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR1_LOCATION_Pos) /*!< ERRBNK TEBR1: LOCATION Mask */ - -#define ERRBNK_TEBR1_LOCKED_Pos 1U /*!< ERRBNK TEBR1: LOCKED Position */ -#define ERRBNK_TEBR1_LOCKED_Msk (0x1UL << ERRBNK_TEBR1_LOCKED_Pos) /*!< ERRBNK TEBR1: LOCKED Mask */ - -#define ERRBNK_TEBR1_VALID_Pos 0U /*!< ERRBNK TEBR1: VALID Position */ -#define ERRBNK_TEBR1_VALID_Msk (0x1UL << /*ERRBNK_TEBR1_VALID_Pos*/) /*!< ERRBNK TEBR1: VALID Mask */ - -/*@}*/ /* end of group ErrBnk_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup PrcCfgInf_Type Processor Configuration Information Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Processor Configuration Information Registerss (PRCCFGINF) - @{ - */ - -/** - \brief Structure type to access the Processor Configuration Information Registerss (PRCCFGINF). - */ -typedef struct -{ - __OM uint32_t CFGINFOSEL; /*!< Offset: 0x000 ( /W) Processor Configuration Information Selection Register */ - __IM uint32_t CFGINFORD; /*!< Offset: 0x004 (R/ ) Processor Configuration Information Read Data Register */ -} PrcCfgInf_Type; - -/* PRCCFGINF Processor Configuration Information Selection Register (CFGINFOSEL) Definitions */ - -/* PRCCFGINF Processor Configuration Information Read Data Register (CFGINFORD) Definitions */ - -/*@}*/ /* end of group PrcCfgInf_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFmt_Pos 0U /*!< TPI FFCR: EnFmt Position */ -#define TPI_FFCR_EnFmt_Msk (0x3UL << /*TPI_FFCR_EnFmt_Pos*/) /*!< TPI FFCR: EnFmt Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_PMU Performance Monitoring Unit (PMU) - \brief Type definitions for the Performance Monitoring Unit (PMU) - @{ - */ - -/** - \brief Structure type to access the Performance Monitoring Unit (PMU). - */ -typedef struct -{ - __IOM uint32_t EVCNTR[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x0 (R/W) PMU Event Counter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED0[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCNTR; /*!< Offset: 0x7C (R/W) PMU Cycle Counter Register */ - uint32_t RESERVED1[224]; - __IOM uint32_t EVTYPER[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x400 (R/W) PMU Event Type and Filter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED2[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCFILTR; /*!< Offset: 0x47C (R/W) PMU Cycle Counter Filter Register */ - uint32_t RESERVED3[480]; - __IOM uint32_t CNTENSET; /*!< Offset: 0xC00 (R/W) PMU Count Enable Set Register */ - uint32_t RESERVED4[7]; - __IOM uint32_t CNTENCLR; /*!< Offset: 0xC20 (R/W) PMU Count Enable Clear Register */ - uint32_t RESERVED5[7]; - __IOM uint32_t INTENSET; /*!< Offset: 0xC40 (R/W) PMU Interrupt Enable Set Register */ - uint32_t RESERVED6[7]; - __IOM uint32_t INTENCLR; /*!< Offset: 0xC60 (R/W) PMU Interrupt Enable Clear Register */ - uint32_t RESERVED7[7]; - __IOM uint32_t OVSCLR; /*!< Offset: 0xC80 (R/W) PMU Overflow Flag Status Clear Register */ - uint32_t RESERVED8[7]; - __IOM uint32_t SWINC; /*!< Offset: 0xCA0 (R/W) PMU Software Increment Register */ - uint32_t RESERVED9[7]; - __IOM uint32_t OVSSET; /*!< Offset: 0xCC0 (R/W) PMU Overflow Flag Status Set Register */ - uint32_t RESERVED10[79]; - __IOM uint32_t TYPE; /*!< Offset: 0xE00 (R/W) PMU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0xE04 (R/W) PMU Control Register */ - uint32_t RESERVED11[108]; - __IOM uint32_t AUTHSTATUS; /*!< Offset: 0xFB8 (R/W) PMU Authentication Status Register */ - __IOM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/W) PMU Device Architecture Register */ - uint32_t RESERVED12[3]; - __IOM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/W) PMU Device Type Register */ - __IOM uint32_t PIDR4; /*!< Offset: 0xFD0 (R/W) PMU Peripheral Identification Register 4 */ - uint32_t RESERVED13[3]; - __IOM uint32_t PIDR0; /*!< Offset: 0xFE0 (R/W) PMU Peripheral Identification Register 0 */ - __IOM uint32_t PIDR1; /*!< Offset: 0xFE4 (R/W) PMU Peripheral Identification Register 1 */ - __IOM uint32_t PIDR2; /*!< Offset: 0xFE8 (R/W) PMU Peripheral Identification Register 2 */ - __IOM uint32_t PIDR3; /*!< Offset: 0xFEC (R/W) PMU Peripheral Identification Register 3 */ - __IOM uint32_t CIDR0; /*!< Offset: 0xFF0 (R/W) PMU Component Identification Register 0 */ - __IOM uint32_t CIDR1; /*!< Offset: 0xFF4 (R/W) PMU Component Identification Register 1 */ - __IOM uint32_t CIDR2; /*!< Offset: 0xFF8 (R/W) PMU Component Identification Register 2 */ - __IOM uint32_t CIDR3; /*!< Offset: 0xFFC (R/W) PMU Component Identification Register 3 */ -} PMU_Type; - -/** \brief PMU Event Counter Registers (0-30) Definitions */ - -#define PMU_EVCNTR_CNT_Pos 0U /*!< PMU EVCNTR: Counter Position */ -#define PMU_EVCNTR_CNT_Msk (0xFFFFUL /*<< PMU_EVCNTRx_CNT_Pos*/) /*!< PMU EVCNTR: Counter Mask */ - -/** \brief PMU Event Type and Filter Registers (0-30) Definitions */ - -#define PMU_EVTYPER_EVENTTOCNT_Pos 0U /*!< PMU EVTYPER: Event to Count Position */ -#define PMU_EVTYPER_EVENTTOCNT_Msk (0xFFFFUL /*<< EVTYPERx_EVENTTOCNT_Pos*/) /*!< PMU EVTYPER: Event to Count Mask */ - -/** \brief PMU Count Enable Set Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENSET: Event Counter 0 Enable Set Position */ -#define PMU_CNTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENSET_CNT0_ENABLE_Pos*/) /*!< PMU CNTENSET: Event Counter 0 Enable Set Mask */ - -#define PMU_CNTENSET_CNT1_ENABLE_Pos 1U /*!< PMU CNTENSET: Event Counter 1 Enable Set Position */ -#define PMU_CNTENSET_CNT1_ENABLE_Msk (1UL << PMU_CNTENSET_CNT1_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 1 Enable Set Mask */ - -#define PMU_CNTENSET_CNT2_ENABLE_Pos 2U /*!< PMU CNTENSET: Event Counter 2 Enable Set Position */ -#define PMU_CNTENSET_CNT2_ENABLE_Msk (1UL << PMU_CNTENSET_CNT2_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 2 Enable Set Mask */ - -#define PMU_CNTENSET_CNT3_ENABLE_Pos 3U /*!< PMU CNTENSET: Event Counter 3 Enable Set Position */ -#define PMU_CNTENSET_CNT3_ENABLE_Msk (1UL << PMU_CNTENSET_CNT3_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 3 Enable Set Mask */ - -#define PMU_CNTENSET_CNT4_ENABLE_Pos 4U /*!< PMU CNTENSET: Event Counter 4 Enable Set Position */ -#define PMU_CNTENSET_CNT4_ENABLE_Msk (1UL << PMU_CNTENSET_CNT4_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 4 Enable Set Mask */ - -#define PMU_CNTENSET_CNT5_ENABLE_Pos 5U /*!< PMU CNTENSET: Event Counter 5 Enable Set Position */ -#define PMU_CNTENSET_CNT5_ENABLE_Msk (1UL << PMU_CNTENSET_CNT5_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 5 Enable Set Mask */ - -#define PMU_CNTENSET_CNT6_ENABLE_Pos 6U /*!< PMU CNTENSET: Event Counter 6 Enable Set Position */ -#define PMU_CNTENSET_CNT6_ENABLE_Msk (1UL << PMU_CNTENSET_CNT6_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 6 Enable Set Mask */ - -#define PMU_CNTENSET_CNT7_ENABLE_Pos 7U /*!< PMU CNTENSET: Event Counter 7 Enable Set Position */ -#define PMU_CNTENSET_CNT7_ENABLE_Msk (1UL << PMU_CNTENSET_CNT7_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 7 Enable Set Mask */ - -#define PMU_CNTENSET_CNT8_ENABLE_Pos 8U /*!< PMU CNTENSET: Event Counter 8 Enable Set Position */ -#define PMU_CNTENSET_CNT8_ENABLE_Msk (1UL << PMU_CNTENSET_CNT8_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 8 Enable Set Mask */ - -#define PMU_CNTENSET_CNT9_ENABLE_Pos 9U /*!< PMU CNTENSET: Event Counter 9 Enable Set Position */ -#define PMU_CNTENSET_CNT9_ENABLE_Msk (1UL << PMU_CNTENSET_CNT9_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 9 Enable Set Mask */ - -#define PMU_CNTENSET_CNT10_ENABLE_Pos 10U /*!< PMU CNTENSET: Event Counter 10 Enable Set Position */ -#define PMU_CNTENSET_CNT10_ENABLE_Msk (1UL << PMU_CNTENSET_CNT10_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 10 Enable Set Mask */ - -#define PMU_CNTENSET_CNT11_ENABLE_Pos 11U /*!< PMU CNTENSET: Event Counter 11 Enable Set Position */ -#define PMU_CNTENSET_CNT11_ENABLE_Msk (1UL << PMU_CNTENSET_CNT11_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 11 Enable Set Mask */ - -#define PMU_CNTENSET_CNT12_ENABLE_Pos 12U /*!< PMU CNTENSET: Event Counter 12 Enable Set Position */ -#define PMU_CNTENSET_CNT12_ENABLE_Msk (1UL << PMU_CNTENSET_CNT12_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 12 Enable Set Mask */ - -#define PMU_CNTENSET_CNT13_ENABLE_Pos 13U /*!< PMU CNTENSET: Event Counter 13 Enable Set Position */ -#define PMU_CNTENSET_CNT13_ENABLE_Msk (1UL << PMU_CNTENSET_CNT13_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 13 Enable Set Mask */ - -#define PMU_CNTENSET_CNT14_ENABLE_Pos 14U /*!< PMU CNTENSET: Event Counter 14 Enable Set Position */ -#define PMU_CNTENSET_CNT14_ENABLE_Msk (1UL << PMU_CNTENSET_CNT14_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 14 Enable Set Mask */ - -#define PMU_CNTENSET_CNT15_ENABLE_Pos 15U /*!< PMU CNTENSET: Event Counter 15 Enable Set Position */ -#define PMU_CNTENSET_CNT15_ENABLE_Msk (1UL << PMU_CNTENSET_CNT15_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 15 Enable Set Mask */ - -#define PMU_CNTENSET_CNT16_ENABLE_Pos 16U /*!< PMU CNTENSET: Event Counter 16 Enable Set Position */ -#define PMU_CNTENSET_CNT16_ENABLE_Msk (1UL << PMU_CNTENSET_CNT16_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 16 Enable Set Mask */ - -#define PMU_CNTENSET_CNT17_ENABLE_Pos 17U /*!< PMU CNTENSET: Event Counter 17 Enable Set Position */ -#define PMU_CNTENSET_CNT17_ENABLE_Msk (1UL << PMU_CNTENSET_CNT17_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 17 Enable Set Mask */ - -#define PMU_CNTENSET_CNT18_ENABLE_Pos 18U /*!< PMU CNTENSET: Event Counter 18 Enable Set Position */ -#define PMU_CNTENSET_CNT18_ENABLE_Msk (1UL << PMU_CNTENSET_CNT18_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 18 Enable Set Mask */ - -#define PMU_CNTENSET_CNT19_ENABLE_Pos 19U /*!< PMU CNTENSET: Event Counter 19 Enable Set Position */ -#define PMU_CNTENSET_CNT19_ENABLE_Msk (1UL << PMU_CNTENSET_CNT19_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 19 Enable Set Mask */ - -#define PMU_CNTENSET_CNT20_ENABLE_Pos 20U /*!< PMU CNTENSET: Event Counter 20 Enable Set Position */ -#define PMU_CNTENSET_CNT20_ENABLE_Msk (1UL << PMU_CNTENSET_CNT20_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 20 Enable Set Mask */ - -#define PMU_CNTENSET_CNT21_ENABLE_Pos 21U /*!< PMU CNTENSET: Event Counter 21 Enable Set Position */ -#define PMU_CNTENSET_CNT21_ENABLE_Msk (1UL << PMU_CNTENSET_CNT21_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 21 Enable Set Mask */ - -#define PMU_CNTENSET_CNT22_ENABLE_Pos 22U /*!< PMU CNTENSET: Event Counter 22 Enable Set Position */ -#define PMU_CNTENSET_CNT22_ENABLE_Msk (1UL << PMU_CNTENSET_CNT22_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 22 Enable Set Mask */ - -#define PMU_CNTENSET_CNT23_ENABLE_Pos 23U /*!< PMU CNTENSET: Event Counter 23 Enable Set Position */ -#define PMU_CNTENSET_CNT23_ENABLE_Msk (1UL << PMU_CNTENSET_CNT23_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 23 Enable Set Mask */ - -#define PMU_CNTENSET_CNT24_ENABLE_Pos 24U /*!< PMU CNTENSET: Event Counter 24 Enable Set Position */ -#define PMU_CNTENSET_CNT24_ENABLE_Msk (1UL << PMU_CNTENSET_CNT24_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 24 Enable Set Mask */ - -#define PMU_CNTENSET_CNT25_ENABLE_Pos 25U /*!< PMU CNTENSET: Event Counter 25 Enable Set Position */ -#define PMU_CNTENSET_CNT25_ENABLE_Msk (1UL << PMU_CNTENSET_CNT25_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 25 Enable Set Mask */ - -#define PMU_CNTENSET_CNT26_ENABLE_Pos 26U /*!< PMU CNTENSET: Event Counter 26 Enable Set Position */ -#define PMU_CNTENSET_CNT26_ENABLE_Msk (1UL << PMU_CNTENSET_CNT26_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 26 Enable Set Mask */ - -#define PMU_CNTENSET_CNT27_ENABLE_Pos 27U /*!< PMU CNTENSET: Event Counter 27 Enable Set Position */ -#define PMU_CNTENSET_CNT27_ENABLE_Msk (1UL << PMU_CNTENSET_CNT27_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 27 Enable Set Mask */ - -#define PMU_CNTENSET_CNT28_ENABLE_Pos 28U /*!< PMU CNTENSET: Event Counter 28 Enable Set Position */ -#define PMU_CNTENSET_CNT28_ENABLE_Msk (1UL << PMU_CNTENSET_CNT28_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 28 Enable Set Mask */ - -#define PMU_CNTENSET_CNT29_ENABLE_Pos 29U /*!< PMU CNTENSET: Event Counter 29 Enable Set Position */ -#define PMU_CNTENSET_CNT29_ENABLE_Msk (1UL << PMU_CNTENSET_CNT29_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 29 Enable Set Mask */ - -#define PMU_CNTENSET_CNT30_ENABLE_Pos 30U /*!< PMU CNTENSET: Event Counter 30 Enable Set Position */ -#define PMU_CNTENSET_CNT30_ENABLE_Msk (1UL << PMU_CNTENSET_CNT30_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 30 Enable Set Mask */ - -#define PMU_CNTENSET_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENSET: Cycle Counter Enable Set Position */ -#define PMU_CNTENSET_CCNTR_ENABLE_Msk (1UL << PMU_CNTENSET_CCNTR_ENABLE_Pos) /*!< PMU CNTENSET: Cycle Counter Enable Set Mask */ - -/** \brief PMU Count Enable Clear Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Position */ -#define PMU_CNTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU CNTENCLR: Event Counter 1 Enable Clear Position */ -#define PMU_CNTENCLR_CNT1_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT1_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 1 Enable Clear */ - -#define PMU_CNTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Position */ -#define PMU_CNTENCLR_CNT2_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT2_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Position */ -#define PMU_CNTENCLR_CNT3_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT3_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Position */ -#define PMU_CNTENCLR_CNT4_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT4_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Position */ -#define PMU_CNTENCLR_CNT5_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT5_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Position */ -#define PMU_CNTENCLR_CNT6_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT6_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Position */ -#define PMU_CNTENCLR_CNT7_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT7_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Position */ -#define PMU_CNTENCLR_CNT8_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT8_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Position */ -#define PMU_CNTENCLR_CNT9_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT9_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Position */ -#define PMU_CNTENCLR_CNT10_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT10_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Position */ -#define PMU_CNTENCLR_CNT11_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT11_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Position */ -#define PMU_CNTENCLR_CNT12_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT12_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Position */ -#define PMU_CNTENCLR_CNT13_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT13_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Position */ -#define PMU_CNTENCLR_CNT14_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT14_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Position */ -#define PMU_CNTENCLR_CNT15_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT15_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Position */ -#define PMU_CNTENCLR_CNT16_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT16_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Position */ -#define PMU_CNTENCLR_CNT17_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT17_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Position */ -#define PMU_CNTENCLR_CNT18_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT18_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Position */ -#define PMU_CNTENCLR_CNT19_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT19_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Position */ -#define PMU_CNTENCLR_CNT20_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT20_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Position */ -#define PMU_CNTENCLR_CNT21_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT21_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Position */ -#define PMU_CNTENCLR_CNT22_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT22_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Position */ -#define PMU_CNTENCLR_CNT23_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT23_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Position */ -#define PMU_CNTENCLR_CNT24_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT24_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Position */ -#define PMU_CNTENCLR_CNT25_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT25_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Position */ -#define PMU_CNTENCLR_CNT26_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT26_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Position */ -#define PMU_CNTENCLR_CNT27_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT27_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Position */ -#define PMU_CNTENCLR_CNT28_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT28_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Position */ -#define PMU_CNTENCLR_CNT29_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT29_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Position */ -#define PMU_CNTENCLR_CNT30_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT30_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Mask */ - -#define PMU_CNTENCLR_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENCLR: Cycle Counter Enable Clear Position */ -#define PMU_CNTENCLR_CCNTR_ENABLE_Msk (1UL << PMU_CNTENCLR_CCNTR_ENABLE_Pos) /*!< PMU CNTENCLR: Cycle Counter Enable Clear Mask */ - -/** \brief PMU Interrupt Enable Set Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENSET_CNT0_ENABLE_Pos*/) /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT1_ENABLE_Pos 1U /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT1_ENABLE_Msk (1UL << PMU_INTENSET_CNT1_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT2_ENABLE_Pos 2U /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT2_ENABLE_Msk (1UL << PMU_INTENSET_CNT2_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT3_ENABLE_Pos 3U /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT3_ENABLE_Msk (1UL << PMU_INTENSET_CNT3_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT4_ENABLE_Pos 4U /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT4_ENABLE_Msk (1UL << PMU_INTENSET_CNT4_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT5_ENABLE_Pos 5U /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT5_ENABLE_Msk (1UL << PMU_INTENSET_CNT5_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT6_ENABLE_Pos 6U /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT6_ENABLE_Msk (1UL << PMU_INTENSET_CNT6_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT7_ENABLE_Pos 7U /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT7_ENABLE_Msk (1UL << PMU_INTENSET_CNT7_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT8_ENABLE_Pos 8U /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT8_ENABLE_Msk (1UL << PMU_INTENSET_CNT8_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT9_ENABLE_Pos 9U /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT9_ENABLE_Msk (1UL << PMU_INTENSET_CNT9_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT10_ENABLE_Pos 10U /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT10_ENABLE_Msk (1UL << PMU_INTENSET_CNT10_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT11_ENABLE_Pos 11U /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT11_ENABLE_Msk (1UL << PMU_INTENSET_CNT11_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT12_ENABLE_Pos 12U /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT12_ENABLE_Msk (1UL << PMU_INTENSET_CNT12_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT13_ENABLE_Pos 13U /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT13_ENABLE_Msk (1UL << PMU_INTENSET_CNT13_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT14_ENABLE_Pos 14U /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT14_ENABLE_Msk (1UL << PMU_INTENSET_CNT14_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT15_ENABLE_Pos 15U /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT15_ENABLE_Msk (1UL << PMU_INTENSET_CNT15_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT16_ENABLE_Pos 16U /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT16_ENABLE_Msk (1UL << PMU_INTENSET_CNT16_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT17_ENABLE_Pos 17U /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT17_ENABLE_Msk (1UL << PMU_INTENSET_CNT17_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT18_ENABLE_Pos 18U /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT18_ENABLE_Msk (1UL << PMU_INTENSET_CNT18_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT19_ENABLE_Pos 19U /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT19_ENABLE_Msk (1UL << PMU_INTENSET_CNT19_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT20_ENABLE_Pos 20U /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT20_ENABLE_Msk (1UL << PMU_INTENSET_CNT20_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT21_ENABLE_Pos 21U /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT21_ENABLE_Msk (1UL << PMU_INTENSET_CNT21_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT22_ENABLE_Pos 22U /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT22_ENABLE_Msk (1UL << PMU_INTENSET_CNT22_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT23_ENABLE_Pos 23U /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT23_ENABLE_Msk (1UL << PMU_INTENSET_CNT23_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT24_ENABLE_Pos 24U /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT24_ENABLE_Msk (1UL << PMU_INTENSET_CNT24_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT25_ENABLE_Pos 25U /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT25_ENABLE_Msk (1UL << PMU_INTENSET_CNT25_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT26_ENABLE_Pos 26U /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT26_ENABLE_Msk (1UL << PMU_INTENSET_CNT26_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT27_ENABLE_Pos 27U /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT27_ENABLE_Msk (1UL << PMU_INTENSET_CNT27_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT28_ENABLE_Pos 28U /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT28_ENABLE_Msk (1UL << PMU_INTENSET_CNT28_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT29_ENABLE_Pos 29U /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT29_ENABLE_Msk (1UL << PMU_INTENSET_CNT29_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT30_ENABLE_Pos 30U /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT30_ENABLE_Msk (1UL << PMU_INTENSET_CNT30_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Position */ -#define PMU_INTENSET_CCYCNT_ENABLE_Msk (1UL << PMU_INTENSET_CYCCNT_ENABLE_Pos) /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Mask */ - -/** \brief PMU Interrupt Enable Clear Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT1_ENABLE_Msk (1UL << PMU_INTENCLR_CNT1_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear */ - -#define PMU_INTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT2_ENABLE_Msk (1UL << PMU_INTENCLR_CNT2_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT3_ENABLE_Msk (1UL << PMU_INTENCLR_CNT3_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT4_ENABLE_Msk (1UL << PMU_INTENCLR_CNT4_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT5_ENABLE_Msk (1UL << PMU_INTENCLR_CNT5_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT6_ENABLE_Msk (1UL << PMU_INTENCLR_CNT6_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT7_ENABLE_Msk (1UL << PMU_INTENCLR_CNT7_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT8_ENABLE_Msk (1UL << PMU_INTENCLR_CNT8_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT9_ENABLE_Msk (1UL << PMU_INTENCLR_CNT9_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT10_ENABLE_Msk (1UL << PMU_INTENCLR_CNT10_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT11_ENABLE_Msk (1UL << PMU_INTENCLR_CNT11_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT12_ENABLE_Msk (1UL << PMU_INTENCLR_CNT12_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT13_ENABLE_Msk (1UL << PMU_INTENCLR_CNT13_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT14_ENABLE_Msk (1UL << PMU_INTENCLR_CNT14_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT15_ENABLE_Msk (1UL << PMU_INTENCLR_CNT15_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT16_ENABLE_Msk (1UL << PMU_INTENCLR_CNT16_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT17_ENABLE_Msk (1UL << PMU_INTENCLR_CNT17_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT18_ENABLE_Msk (1UL << PMU_INTENCLR_CNT18_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT19_ENABLE_Msk (1UL << PMU_INTENCLR_CNT19_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT20_ENABLE_Msk (1UL << PMU_INTENCLR_CNT20_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT21_ENABLE_Msk (1UL << PMU_INTENCLR_CNT21_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT22_ENABLE_Msk (1UL << PMU_INTENCLR_CNT22_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT23_ENABLE_Msk (1UL << PMU_INTENCLR_CNT23_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT24_ENABLE_Msk (1UL << PMU_INTENCLR_CNT24_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT25_ENABLE_Msk (1UL << PMU_INTENCLR_CNT25_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT26_ENABLE_Msk (1UL << PMU_INTENCLR_CNT26_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT27_ENABLE_Msk (1UL << PMU_INTENCLR_CNT27_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT28_ENABLE_Msk (1UL << PMU_INTENCLR_CNT28_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT29_ENABLE_Msk (1UL << PMU_INTENCLR_CNT29_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT30_ENABLE_Msk (1UL << PMU_INTENCLR_CNT30_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CYCCNT_ENABLE_Msk (1UL << PMU_INTENCLR_CYCCNT_ENABLE_Pos) /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Mask */ - -/** \brief PMU Overflow Flag Status Set Register Definitions */ - -#define PMU_OVSSET_CNT0_STATUS_Pos 0U /*!< PMU OVSSET: Event Counter 0 Overflow Set Position */ -#define PMU_OVSSET_CNT0_STATUS_Msk (1UL /*<< PMU_OVSSET_CNT0_STATUS_Pos*/) /*!< PMU OVSSET: Event Counter 0 Overflow Set Mask */ - -#define PMU_OVSSET_CNT1_STATUS_Pos 1U /*!< PMU OVSSET: Event Counter 1 Overflow Set Position */ -#define PMU_OVSSET_CNT1_STATUS_Msk (1UL << PMU_OVSSET_CNT1_STATUS_Pos) /*!< PMU OVSSET: Event Counter 1 Overflow Set Mask */ - -#define PMU_OVSSET_CNT2_STATUS_Pos 2U /*!< PMU OVSSET: Event Counter 2 Overflow Set Position */ -#define PMU_OVSSET_CNT2_STATUS_Msk (1UL << PMU_OVSSET_CNT2_STATUS_Pos) /*!< PMU OVSSET: Event Counter 2 Overflow Set Mask */ - -#define PMU_OVSSET_CNT3_STATUS_Pos 3U /*!< PMU OVSSET: Event Counter 3 Overflow Set Position */ -#define PMU_OVSSET_CNT3_STATUS_Msk (1UL << PMU_OVSSET_CNT3_STATUS_Pos) /*!< PMU OVSSET: Event Counter 3 Overflow Set Mask */ - -#define PMU_OVSSET_CNT4_STATUS_Pos 4U /*!< PMU OVSSET: Event Counter 4 Overflow Set Position */ -#define PMU_OVSSET_CNT4_STATUS_Msk (1UL << PMU_OVSSET_CNT4_STATUS_Pos) /*!< PMU OVSSET: Event Counter 4 Overflow Set Mask */ - -#define PMU_OVSSET_CNT5_STATUS_Pos 5U /*!< PMU OVSSET: Event Counter 5 Overflow Set Position */ -#define PMU_OVSSET_CNT5_STATUS_Msk (1UL << PMU_OVSSET_CNT5_STATUS_Pos) /*!< PMU OVSSET: Event Counter 5 Overflow Set Mask */ - -#define PMU_OVSSET_CNT6_STATUS_Pos 6U /*!< PMU OVSSET: Event Counter 6 Overflow Set Position */ -#define PMU_OVSSET_CNT6_STATUS_Msk (1UL << PMU_OVSSET_CNT6_STATUS_Pos) /*!< PMU OVSSET: Event Counter 6 Overflow Set Mask */ - -#define PMU_OVSSET_CNT7_STATUS_Pos 7U /*!< PMU OVSSET: Event Counter 7 Overflow Set Position */ -#define PMU_OVSSET_CNT7_STATUS_Msk (1UL << PMU_OVSSET_CNT7_STATUS_Pos) /*!< PMU OVSSET: Event Counter 7 Overflow Set Mask */ - -#define PMU_OVSSET_CNT8_STATUS_Pos 8U /*!< PMU OVSSET: Event Counter 8 Overflow Set Position */ -#define PMU_OVSSET_CNT8_STATUS_Msk (1UL << PMU_OVSSET_CNT8_STATUS_Pos) /*!< PMU OVSSET: Event Counter 8 Overflow Set Mask */ - -#define PMU_OVSSET_CNT9_STATUS_Pos 9U /*!< PMU OVSSET: Event Counter 9 Overflow Set Position */ -#define PMU_OVSSET_CNT9_STATUS_Msk (1UL << PMU_OVSSET_CNT9_STATUS_Pos) /*!< PMU OVSSET: Event Counter 9 Overflow Set Mask */ - -#define PMU_OVSSET_CNT10_STATUS_Pos 10U /*!< PMU OVSSET: Event Counter 10 Overflow Set Position */ -#define PMU_OVSSET_CNT10_STATUS_Msk (1UL << PMU_OVSSET_CNT10_STATUS_Pos) /*!< PMU OVSSET: Event Counter 10 Overflow Set Mask */ - -#define PMU_OVSSET_CNT11_STATUS_Pos 11U /*!< PMU OVSSET: Event Counter 11 Overflow Set Position */ -#define PMU_OVSSET_CNT11_STATUS_Msk (1UL << PMU_OVSSET_CNT11_STATUS_Pos) /*!< PMU OVSSET: Event Counter 11 Overflow Set Mask */ - -#define PMU_OVSSET_CNT12_STATUS_Pos 12U /*!< PMU OVSSET: Event Counter 12 Overflow Set Position */ -#define PMU_OVSSET_CNT12_STATUS_Msk (1UL << PMU_OVSSET_CNT12_STATUS_Pos) /*!< PMU OVSSET: Event Counter 12 Overflow Set Mask */ - -#define PMU_OVSSET_CNT13_STATUS_Pos 13U /*!< PMU OVSSET: Event Counter 13 Overflow Set Position */ -#define PMU_OVSSET_CNT13_STATUS_Msk (1UL << PMU_OVSSET_CNT13_STATUS_Pos) /*!< PMU OVSSET: Event Counter 13 Overflow Set Mask */ - -#define PMU_OVSSET_CNT14_STATUS_Pos 14U /*!< PMU OVSSET: Event Counter 14 Overflow Set Position */ -#define PMU_OVSSET_CNT14_STATUS_Msk (1UL << PMU_OVSSET_CNT14_STATUS_Pos) /*!< PMU OVSSET: Event Counter 14 Overflow Set Mask */ - -#define PMU_OVSSET_CNT15_STATUS_Pos 15U /*!< PMU OVSSET: Event Counter 15 Overflow Set Position */ -#define PMU_OVSSET_CNT15_STATUS_Msk (1UL << PMU_OVSSET_CNT15_STATUS_Pos) /*!< PMU OVSSET: Event Counter 15 Overflow Set Mask */ - -#define PMU_OVSSET_CNT16_STATUS_Pos 16U /*!< PMU OVSSET: Event Counter 16 Overflow Set Position */ -#define PMU_OVSSET_CNT16_STATUS_Msk (1UL << PMU_OVSSET_CNT16_STATUS_Pos) /*!< PMU OVSSET: Event Counter 16 Overflow Set Mask */ - -#define PMU_OVSSET_CNT17_STATUS_Pos 17U /*!< PMU OVSSET: Event Counter 17 Overflow Set Position */ -#define PMU_OVSSET_CNT17_STATUS_Msk (1UL << PMU_OVSSET_CNT17_STATUS_Pos) /*!< PMU OVSSET: Event Counter 17 Overflow Set Mask */ - -#define PMU_OVSSET_CNT18_STATUS_Pos 18U /*!< PMU OVSSET: Event Counter 18 Overflow Set Position */ -#define PMU_OVSSET_CNT18_STATUS_Msk (1UL << PMU_OVSSET_CNT18_STATUS_Pos) /*!< PMU OVSSET: Event Counter 18 Overflow Set Mask */ - -#define PMU_OVSSET_CNT19_STATUS_Pos 19U /*!< PMU OVSSET: Event Counter 19 Overflow Set Position */ -#define PMU_OVSSET_CNT19_STATUS_Msk (1UL << PMU_OVSSET_CNT19_STATUS_Pos) /*!< PMU OVSSET: Event Counter 19 Overflow Set Mask */ - -#define PMU_OVSSET_CNT20_STATUS_Pos 20U /*!< PMU OVSSET: Event Counter 20 Overflow Set Position */ -#define PMU_OVSSET_CNT20_STATUS_Msk (1UL << PMU_OVSSET_CNT20_STATUS_Pos) /*!< PMU OVSSET: Event Counter 20 Overflow Set Mask */ - -#define PMU_OVSSET_CNT21_STATUS_Pos 21U /*!< PMU OVSSET: Event Counter 21 Overflow Set Position */ -#define PMU_OVSSET_CNT21_STATUS_Msk (1UL << PMU_OVSSET_CNT21_STATUS_Pos) /*!< PMU OVSSET: Event Counter 21 Overflow Set Mask */ - -#define PMU_OVSSET_CNT22_STATUS_Pos 22U /*!< PMU OVSSET: Event Counter 22 Overflow Set Position */ -#define PMU_OVSSET_CNT22_STATUS_Msk (1UL << PMU_OVSSET_CNT22_STATUS_Pos) /*!< PMU OVSSET: Event Counter 22 Overflow Set Mask */ - -#define PMU_OVSSET_CNT23_STATUS_Pos 23U /*!< PMU OVSSET: Event Counter 23 Overflow Set Position */ -#define PMU_OVSSET_CNT23_STATUS_Msk (1UL << PMU_OVSSET_CNT23_STATUS_Pos) /*!< PMU OVSSET: Event Counter 23 Overflow Set Mask */ - -#define PMU_OVSSET_CNT24_STATUS_Pos 24U /*!< PMU OVSSET: Event Counter 24 Overflow Set Position */ -#define PMU_OVSSET_CNT24_STATUS_Msk (1UL << PMU_OVSSET_CNT24_STATUS_Pos) /*!< PMU OVSSET: Event Counter 24 Overflow Set Mask */ - -#define PMU_OVSSET_CNT25_STATUS_Pos 25U /*!< PMU OVSSET: Event Counter 25 Overflow Set Position */ -#define PMU_OVSSET_CNT25_STATUS_Msk (1UL << PMU_OVSSET_CNT25_STATUS_Pos) /*!< PMU OVSSET: Event Counter 25 Overflow Set Mask */ - -#define PMU_OVSSET_CNT26_STATUS_Pos 26U /*!< PMU OVSSET: Event Counter 26 Overflow Set Position */ -#define PMU_OVSSET_CNT26_STATUS_Msk (1UL << PMU_OVSSET_CNT26_STATUS_Pos) /*!< PMU OVSSET: Event Counter 26 Overflow Set Mask */ - -#define PMU_OVSSET_CNT27_STATUS_Pos 27U /*!< PMU OVSSET: Event Counter 27 Overflow Set Position */ -#define PMU_OVSSET_CNT27_STATUS_Msk (1UL << PMU_OVSSET_CNT27_STATUS_Pos) /*!< PMU OVSSET: Event Counter 27 Overflow Set Mask */ - -#define PMU_OVSSET_CNT28_STATUS_Pos 28U /*!< PMU OVSSET: Event Counter 28 Overflow Set Position */ -#define PMU_OVSSET_CNT28_STATUS_Msk (1UL << PMU_OVSSET_CNT28_STATUS_Pos) /*!< PMU OVSSET: Event Counter 28 Overflow Set Mask */ - -#define PMU_OVSSET_CNT29_STATUS_Pos 29U /*!< PMU OVSSET: Event Counter 29 Overflow Set Position */ -#define PMU_OVSSET_CNT29_STATUS_Msk (1UL << PMU_OVSSET_CNT29_STATUS_Pos) /*!< PMU OVSSET: Event Counter 29 Overflow Set Mask */ - -#define PMU_OVSSET_CNT30_STATUS_Pos 30U /*!< PMU OVSSET: Event Counter 30 Overflow Set Position */ -#define PMU_OVSSET_CNT30_STATUS_Msk (1UL << PMU_OVSSET_CNT30_STATUS_Pos) /*!< PMU OVSSET: Event Counter 30 Overflow Set Mask */ - -#define PMU_OVSSET_CYCCNT_STATUS_Pos 31U /*!< PMU OVSSET: Cycle Counter Overflow Set Position */ -#define PMU_OVSSET_CYCCNT_STATUS_Msk (1UL << PMU_OVSSET_CYCCNT_STATUS_Pos) /*!< PMU OVSSET: Cycle Counter Overflow Set Mask */ - -/** \brief PMU Overflow Flag Status Clear Register Definitions */ - -#define PMU_OVSCLR_CNT0_STATUS_Pos 0U /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Position */ -#define PMU_OVSCLR_CNT0_STATUS_Msk (1UL /*<< PMU_OVSCLR_CNT0_STATUS_Pos*/) /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT1_STATUS_Pos 1U /*!< PMU OVSCLR: Event Counter 1 Overflow Clear Position */ -#define PMU_OVSCLR_CNT1_STATUS_Msk (1UL << PMU_OVSCLR_CNT1_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 1 Overflow Clear */ - -#define PMU_OVSCLR_CNT2_STATUS_Pos 2U /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Position */ -#define PMU_OVSCLR_CNT2_STATUS_Msk (1UL << PMU_OVSCLR_CNT2_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT3_STATUS_Pos 3U /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Position */ -#define PMU_OVSCLR_CNT3_STATUS_Msk (1UL << PMU_OVSCLR_CNT3_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT4_STATUS_Pos 4U /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Position */ -#define PMU_OVSCLR_CNT4_STATUS_Msk (1UL << PMU_OVSCLR_CNT4_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT5_STATUS_Pos 5U /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Position */ -#define PMU_OVSCLR_CNT5_STATUS_Msk (1UL << PMU_OVSCLR_CNT5_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT6_STATUS_Pos 6U /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Position */ -#define PMU_OVSCLR_CNT6_STATUS_Msk (1UL << PMU_OVSCLR_CNT6_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT7_STATUS_Pos 7U /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Position */ -#define PMU_OVSCLR_CNT7_STATUS_Msk (1UL << PMU_OVSCLR_CNT7_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT8_STATUS_Pos 8U /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Position */ -#define PMU_OVSCLR_CNT8_STATUS_Msk (1UL << PMU_OVSCLR_CNT8_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT9_STATUS_Pos 9U /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Position */ -#define PMU_OVSCLR_CNT9_STATUS_Msk (1UL << PMU_OVSCLR_CNT9_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT10_STATUS_Pos 10U /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Position */ -#define PMU_OVSCLR_CNT10_STATUS_Msk (1UL << PMU_OVSCLR_CNT10_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT11_STATUS_Pos 11U /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Position */ -#define PMU_OVSCLR_CNT11_STATUS_Msk (1UL << PMU_OVSCLR_CNT11_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT12_STATUS_Pos 12U /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Position */ -#define PMU_OVSCLR_CNT12_STATUS_Msk (1UL << PMU_OVSCLR_CNT12_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT13_STATUS_Pos 13U /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Position */ -#define PMU_OVSCLR_CNT13_STATUS_Msk (1UL << PMU_OVSCLR_CNT13_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT14_STATUS_Pos 14U /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Position */ -#define PMU_OVSCLR_CNT14_STATUS_Msk (1UL << PMU_OVSCLR_CNT14_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT15_STATUS_Pos 15U /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Position */ -#define PMU_OVSCLR_CNT15_STATUS_Msk (1UL << PMU_OVSCLR_CNT15_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT16_STATUS_Pos 16U /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Position */ -#define PMU_OVSCLR_CNT16_STATUS_Msk (1UL << PMU_OVSCLR_CNT16_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT17_STATUS_Pos 17U /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Position */ -#define PMU_OVSCLR_CNT17_STATUS_Msk (1UL << PMU_OVSCLR_CNT17_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT18_STATUS_Pos 18U /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Position */ -#define PMU_OVSCLR_CNT18_STATUS_Msk (1UL << PMU_OVSCLR_CNT18_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT19_STATUS_Pos 19U /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Position */ -#define PMU_OVSCLR_CNT19_STATUS_Msk (1UL << PMU_OVSCLR_CNT19_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT20_STATUS_Pos 20U /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Position */ -#define PMU_OVSCLR_CNT20_STATUS_Msk (1UL << PMU_OVSCLR_CNT20_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT21_STATUS_Pos 21U /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Position */ -#define PMU_OVSCLR_CNT21_STATUS_Msk (1UL << PMU_OVSCLR_CNT21_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT22_STATUS_Pos 22U /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Position */ -#define PMU_OVSCLR_CNT22_STATUS_Msk (1UL << PMU_OVSCLR_CNT22_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT23_STATUS_Pos 23U /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Position */ -#define PMU_OVSCLR_CNT23_STATUS_Msk (1UL << PMU_OVSCLR_CNT23_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT24_STATUS_Pos 24U /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Position */ -#define PMU_OVSCLR_CNT24_STATUS_Msk (1UL << PMU_OVSCLR_CNT24_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT25_STATUS_Pos 25U /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Position */ -#define PMU_OVSCLR_CNT25_STATUS_Msk (1UL << PMU_OVSCLR_CNT25_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT26_STATUS_Pos 26U /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Position */ -#define PMU_OVSCLR_CNT26_STATUS_Msk (1UL << PMU_OVSCLR_CNT26_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT27_STATUS_Pos 27U /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Position */ -#define PMU_OVSCLR_CNT27_STATUS_Msk (1UL << PMU_OVSCLR_CNT27_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT28_STATUS_Pos 28U /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Position */ -#define PMU_OVSCLR_CNT28_STATUS_Msk (1UL << PMU_OVSCLR_CNT28_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT29_STATUS_Pos 29U /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Position */ -#define PMU_OVSCLR_CNT29_STATUS_Msk (1UL << PMU_OVSCLR_CNT29_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT30_STATUS_Pos 30U /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Position */ -#define PMU_OVSCLR_CNT30_STATUS_Msk (1UL << PMU_OVSCLR_CNT30_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Mask */ - -#define PMU_OVSCLR_CYCCNT_STATUS_Pos 31U /*!< PMU OVSCLR: Cycle Counter Overflow Clear Position */ -#define PMU_OVSCLR_CYCCNT_STATUS_Msk (1UL << PMU_OVSCLR_CYCCNT_STATUS_Pos) /*!< PMU OVSCLR: Cycle Counter Overflow Clear Mask */ - -/** \brief PMU Software Increment Counter */ - -#define PMU_SWINC_CNT0_Pos 0U /*!< PMU SWINC: Event Counter 0 Software Increment Position */ -#define PMU_SWINC_CNT0_Msk (1UL /*<< PMU_SWINC_CNT0_Pos */) /*!< PMU SWINC: Event Counter 0 Software Increment Mask */ - -#define PMU_SWINC_CNT1_Pos 1U /*!< PMU SWINC: Event Counter 1 Software Increment Position */ -#define PMU_SWINC_CNT1_Msk (1UL << PMU_SWINC_CNT1_Pos) /*!< PMU SWINC: Event Counter 1 Software Increment Mask */ - -#define PMU_SWINC_CNT2_Pos 2U /*!< PMU SWINC: Event Counter 2 Software Increment Position */ -#define PMU_SWINC_CNT2_Msk (1UL << PMU_SWINC_CNT2_Pos) /*!< PMU SWINC: Event Counter 2 Software Increment Mask */ - -#define PMU_SWINC_CNT3_Pos 3U /*!< PMU SWINC: Event Counter 3 Software Increment Position */ -#define PMU_SWINC_CNT3_Msk (1UL << PMU_SWINC_CNT3_Pos) /*!< PMU SWINC: Event Counter 3 Software Increment Mask */ - -#define PMU_SWINC_CNT4_Pos 4U /*!< PMU SWINC: Event Counter 4 Software Increment Position */ -#define PMU_SWINC_CNT4_Msk (1UL << PMU_SWINC_CNT4_Pos) /*!< PMU SWINC: Event Counter 4 Software Increment Mask */ - -#define PMU_SWINC_CNT5_Pos 5U /*!< PMU SWINC: Event Counter 5 Software Increment Position */ -#define PMU_SWINC_CNT5_Msk (1UL << PMU_SWINC_CNT5_Pos) /*!< PMU SWINC: Event Counter 5 Software Increment Mask */ - -#define PMU_SWINC_CNT6_Pos 6U /*!< PMU SWINC: Event Counter 6 Software Increment Position */ -#define PMU_SWINC_CNT6_Msk (1UL << PMU_SWINC_CNT6_Pos) /*!< PMU SWINC: Event Counter 6 Software Increment Mask */ - -#define PMU_SWINC_CNT7_Pos 7U /*!< PMU SWINC: Event Counter 7 Software Increment Position */ -#define PMU_SWINC_CNT7_Msk (1UL << PMU_SWINC_CNT7_Pos) /*!< PMU SWINC: Event Counter 7 Software Increment Mask */ - -#define PMU_SWINC_CNT8_Pos 8U /*!< PMU SWINC: Event Counter 8 Software Increment Position */ -#define PMU_SWINC_CNT8_Msk (1UL << PMU_SWINC_CNT8_Pos) /*!< PMU SWINC: Event Counter 8 Software Increment Mask */ - -#define PMU_SWINC_CNT9_Pos 9U /*!< PMU SWINC: Event Counter 9 Software Increment Position */ -#define PMU_SWINC_CNT9_Msk (1UL << PMU_SWINC_CNT9_Pos) /*!< PMU SWINC: Event Counter 9 Software Increment Mask */ - -#define PMU_SWINC_CNT10_Pos 10U /*!< PMU SWINC: Event Counter 10 Software Increment Position */ -#define PMU_SWINC_CNT10_Msk (1UL << PMU_SWINC_CNT10_Pos) /*!< PMU SWINC: Event Counter 10 Software Increment Mask */ - -#define PMU_SWINC_CNT11_Pos 11U /*!< PMU SWINC: Event Counter 11 Software Increment Position */ -#define PMU_SWINC_CNT11_Msk (1UL << PMU_SWINC_CNT11_Pos) /*!< PMU SWINC: Event Counter 11 Software Increment Mask */ - -#define PMU_SWINC_CNT12_Pos 12U /*!< PMU SWINC: Event Counter 12 Software Increment Position */ -#define PMU_SWINC_CNT12_Msk (1UL << PMU_SWINC_CNT12_Pos) /*!< PMU SWINC: Event Counter 12 Software Increment Mask */ - -#define PMU_SWINC_CNT13_Pos 13U /*!< PMU SWINC: Event Counter 13 Software Increment Position */ -#define PMU_SWINC_CNT13_Msk (1UL << PMU_SWINC_CNT13_Pos) /*!< PMU SWINC: Event Counter 13 Software Increment Mask */ - -#define PMU_SWINC_CNT14_Pos 14U /*!< PMU SWINC: Event Counter 14 Software Increment Position */ -#define PMU_SWINC_CNT14_Msk (1UL << PMU_SWINC_CNT14_Pos) /*!< PMU SWINC: Event Counter 14 Software Increment Mask */ - -#define PMU_SWINC_CNT15_Pos 15U /*!< PMU SWINC: Event Counter 15 Software Increment Position */ -#define PMU_SWINC_CNT15_Msk (1UL << PMU_SWINC_CNT15_Pos) /*!< PMU SWINC: Event Counter 15 Software Increment Mask */ - -#define PMU_SWINC_CNT16_Pos 16U /*!< PMU SWINC: Event Counter 16 Software Increment Position */ -#define PMU_SWINC_CNT16_Msk (1UL << PMU_SWINC_CNT16_Pos) /*!< PMU SWINC: Event Counter 16 Software Increment Mask */ - -#define PMU_SWINC_CNT17_Pos 17U /*!< PMU SWINC: Event Counter 17 Software Increment Position */ -#define PMU_SWINC_CNT17_Msk (1UL << PMU_SWINC_CNT17_Pos) /*!< PMU SWINC: Event Counter 17 Software Increment Mask */ - -#define PMU_SWINC_CNT18_Pos 18U /*!< PMU SWINC: Event Counter 18 Software Increment Position */ -#define PMU_SWINC_CNT18_Msk (1UL << PMU_SWINC_CNT18_Pos) /*!< PMU SWINC: Event Counter 18 Software Increment Mask */ - -#define PMU_SWINC_CNT19_Pos 19U /*!< PMU SWINC: Event Counter 19 Software Increment Position */ -#define PMU_SWINC_CNT19_Msk (1UL << PMU_SWINC_CNT19_Pos) /*!< PMU SWINC: Event Counter 19 Software Increment Mask */ - -#define PMU_SWINC_CNT20_Pos 20U /*!< PMU SWINC: Event Counter 20 Software Increment Position */ -#define PMU_SWINC_CNT20_Msk (1UL << PMU_SWINC_CNT20_Pos) /*!< PMU SWINC: Event Counter 20 Software Increment Mask */ - -#define PMU_SWINC_CNT21_Pos 21U /*!< PMU SWINC: Event Counter 21 Software Increment Position */ -#define PMU_SWINC_CNT21_Msk (1UL << PMU_SWINC_CNT21_Pos) /*!< PMU SWINC: Event Counter 21 Software Increment Mask */ - -#define PMU_SWINC_CNT22_Pos 22U /*!< PMU SWINC: Event Counter 22 Software Increment Position */ -#define PMU_SWINC_CNT22_Msk (1UL << PMU_SWINC_CNT22_Pos) /*!< PMU SWINC: Event Counter 22 Software Increment Mask */ - -#define PMU_SWINC_CNT23_Pos 23U /*!< PMU SWINC: Event Counter 23 Software Increment Position */ -#define PMU_SWINC_CNT23_Msk (1UL << PMU_SWINC_CNT23_Pos) /*!< PMU SWINC: Event Counter 23 Software Increment Mask */ - -#define PMU_SWINC_CNT24_Pos 24U /*!< PMU SWINC: Event Counter 24 Software Increment Position */ -#define PMU_SWINC_CNT24_Msk (1UL << PMU_SWINC_CNT24_Pos) /*!< PMU SWINC: Event Counter 24 Software Increment Mask */ - -#define PMU_SWINC_CNT25_Pos 25U /*!< PMU SWINC: Event Counter 25 Software Increment Position */ -#define PMU_SWINC_CNT25_Msk (1UL << PMU_SWINC_CNT25_Pos) /*!< PMU SWINC: Event Counter 25 Software Increment Mask */ - -#define PMU_SWINC_CNT26_Pos 26U /*!< PMU SWINC: Event Counter 26 Software Increment Position */ -#define PMU_SWINC_CNT26_Msk (1UL << PMU_SWINC_CNT26_Pos) /*!< PMU SWINC: Event Counter 26 Software Increment Mask */ - -#define PMU_SWINC_CNT27_Pos 27U /*!< PMU SWINC: Event Counter 27 Software Increment Position */ -#define PMU_SWINC_CNT27_Msk (1UL << PMU_SWINC_CNT27_Pos) /*!< PMU SWINC: Event Counter 27 Software Increment Mask */ - -#define PMU_SWINC_CNT28_Pos 28U /*!< PMU SWINC: Event Counter 28 Software Increment Position */ -#define PMU_SWINC_CNT28_Msk (1UL << PMU_SWINC_CNT28_Pos) /*!< PMU SWINC: Event Counter 28 Software Increment Mask */ - -#define PMU_SWINC_CNT29_Pos 29U /*!< PMU SWINC: Event Counter 29 Software Increment Position */ -#define PMU_SWINC_CNT29_Msk (1UL << PMU_SWINC_CNT29_Pos) /*!< PMU SWINC: Event Counter 29 Software Increment Mask */ - -#define PMU_SWINC_CNT30_Pos 30U /*!< PMU SWINC: Event Counter 30 Software Increment Position */ -#define PMU_SWINC_CNT30_Msk (1UL << PMU_SWINC_CNT30_Pos) /*!< PMU SWINC: Event Counter 30 Software Increment Mask */ - -/** \brief PMU Control Register Definitions */ - -#define PMU_CTRL_ENABLE_Pos 0U /*!< PMU CTRL: ENABLE Position */ -#define PMU_CTRL_ENABLE_Msk (1UL /*<< PMU_CTRL_ENABLE_Pos*/) /*!< PMU CTRL: ENABLE Mask */ - -#define PMU_CTRL_EVENTCNT_RESET_Pos 1U /*!< PMU CTRL: Event Counter Reset Position */ -#define PMU_CTRL_EVENTCNT_RESET_Msk (1UL << PMU_CTRL_EVENTCNT_RESET_Pos) /*!< PMU CTRL: Event Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_RESET_Pos 2U /*!< PMU CTRL: Cycle Counter Reset Position */ -#define PMU_CTRL_CYCCNT_RESET_Msk (1UL << PMU_CTRL_CYCCNT_RESET_Pos) /*!< PMU CTRL: Cycle Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_DISABLE_Pos 5U /*!< PMU CTRL: Disable Cycle Counter Position */ -#define PMU_CTRL_CYCCNT_DISABLE_Msk (1UL << PMU_CTRL_CYCCNT_DISABLE_Pos) /*!< PMU CTRL: Disable Cycle Counter Mask */ - -#define PMU_CTRL_FRZ_ON_OV_Pos 9U /*!< PMU CTRL: Freeze-on-overflow Position */ -#define PMU_CTRL_FRZ_ON_OV_Msk (1UL << PMU_CTRL_FRZ_ON_OVERFLOW_Pos) /*!< PMU CTRL: Freeze-on-overflow Mask */ - -#define PMU_CTRL_TRACE_ON_OV_Pos 11U /*!< PMU CTRL: Trace-on-overflow Position */ -#define PMU_CTRL_TRACE_ON_OV_Msk (1UL << PMU_CTRL_TRACE_ON_OVERFLOW_Pos) /*!< PMU CTRL: Trace-on-overflow Mask */ - -/** \brief PMU Type Register Definitions */ - -#define PMU_TYPE_NUM_CNTS_Pos 0U /*!< PMU TYPE: Number of Counters Position */ -#define PMU_TYPE_NUM_CNTS_Msk (0xFFUL /*<< PMU_TYPE_NUM_CNTS_Pos*/) /*!< PMU TYPE: Number of Counters Mask */ - -#define PMU_TYPE_SIZE_CNTS_Pos 8U /*!< PMU TYPE: Size of Counters Position */ -#define PMU_TYPE_SIZE_CNTS_Msk (0x3FUL << PMU_TYPE_SIZE_CNTS_Pos) /*!< PMU TYPE: Size of Counters Mask */ - -#define PMU_TYPE_CYCCNT_PRESENT_Pos 14U /*!< PMU TYPE: Cycle Counter Present Position */ -#define PMU_TYPE_CYCCNT_PRESENT_Msk (1UL << PMU_TYPE_CYCCNT_PRESENT_Pos) /*!< PMU TYPE: Cycle Counter Present Mask */ - -#define PMU_TYPE_FRZ_OV_SUPPORT_Pos 21U /*!< PMU TYPE: Freeze-on-overflow Support Position */ -#define PMU_TYPE_FRZ_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Freeze-on-overflow Support Mask */ - -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Pos 23U /*!< PMU TYPE: Trace-on-overflow Support Position */ -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Trace-on-overflow Support Mask */ - -/** \brief PMU Authentication Status Register Definitions */ - -#define PMU_AUTHSTATUS_NSID_Pos 0U /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSID_Msk (0x3UL /*<< PMU_AUTHSTATUS_NSID_Pos*/) /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSNID_Pos 2U /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSNID_Msk (0x3UL << PMU_AUTHSTATUS_NSNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SID_Pos 4U /*!< PMU AUTHSTATUS: Secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_SID_Msk (0x3UL << PMU_AUTHSTATUS_SID_Pos) /*!< PMU AUTHSTATUS: Secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SNID_Pos 6U /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SNID_Msk (0x3UL << PMU_AUTHSTATUS_SNID_Pos) /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUID_Pos 16U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUID_Msk (0x3UL << PMU_AUTHSTATUS_NSUID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUNID_Pos 18U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUNID_Msk (0x3UL << PMU_AUTHSTATUS_NSUNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUID_Pos 20U /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_SUID_Msk (0x3UL << PMU_AUTHSTATUS_SUID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUNID_Pos 22U /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SUNID_Msk (0x3UL << PMU_AUTHSTATUS_SUNID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Mask */ - - -/*@} end of group CMSIS_PMU */ -#endif - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ -#define MPU_RLAR_PXN_Msk (1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -#define FPU_FPDSCR_FZ16_Pos 19U /*!< FPDSCR: FZ16 bit Position */ -#define FPU_FPDSCR_FZ16_Msk (1UL << FPU_FPDSCR_FZ16_Pos) /*!< FPDSCR: FZ16 bit Mask */ - -#define FPU_FPDSCR_LTPSIZE_Pos 16U /*!< FPDSCR: LTPSIZE bit Position */ -#define FPU_FPDSCR_LTPSIZE_Msk (7UL << FPU_FPDSCR_LTPSIZE_Pos) /*!< FPDSCR: LTPSIZE bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FPRound_Pos 28U /*!< MVFR0: FPRound bits Position */ -#define FPU_MVFR0_FPRound_Msk (0xFUL << FPU_MVFR0_FPRound_Pos) /*!< MVFR0: FPRound bits Mask */ - -#define FPU_MVFR0_FPSqrt_Pos 20U /*!< MVFR0: FPSqrt bits Position */ -#define FPU_MVFR0_FPSqrt_Msk (0xFUL << FPU_MVFR0_FPSqrt_Pos) /*!< MVFR0: FPSqrt bits Mask */ - -#define FPU_MVFR0_FPDivide_Pos 16U /*!< MVFR0: FPDivide bits Position */ -#define FPU_MVFR0_FPDivide_Msk (0xFUL << FPU_MVFR0_FPDivide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FPDP_Pos 8U /*!< MVFR0: FPDP bits Position */ -#define FPU_MVFR0_FPDP_Msk (0xFUL << FPU_MVFR0_FPDP_Pos) /*!< MVFR0: FPDP bits Mask */ - -#define FPU_MVFR0_FPSP_Pos 4U /*!< MVFR0: FPSP bits Position */ -#define FPU_MVFR0_FPSP_Msk (0xFUL << FPU_MVFR0_FPSP_Pos) /*!< MVFR0: FPSP bits Mask */ - -#define FPU_MVFR0_SIMDReg_Pos 0U /*!< MVFR0: SIMDReg bits Position */ -#define FPU_MVFR0_SIMDReg_Msk (0xFUL /*<< FPU_MVFR0_SIMDReg_Pos*/) /*!< MVFR0: SIMDReg bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FMAC_Pos 28U /*!< MVFR1: FMAC bits Position */ -#define FPU_MVFR1_FMAC_Msk (0xFUL << FPU_MVFR1_FMAC_Pos) /*!< MVFR1: FMAC bits Mask */ - -#define FPU_MVFR1_FPHP_Pos 24U /*!< MVFR1: FPHP bits Position */ -#define FPU_MVFR1_FPHP_Msk (0xFUL << FPU_MVFR1_FPHP_Pos) /*!< MVFR1: FPHP bits Mask */ - -#define FPU_MVFR1_FP16_Pos 20U /*!< MVFR1: FP16 bits Position */ -#define FPU_MVFR1_FP16_Msk (0xFUL << FPU_MVFR1_FP16_Pos) /*!< MVFR1: FP16 bits Mask */ - -#define FPU_MVFR1_MVE_Pos 8U /*!< MVFR1: MVE bits Position */ -#define FPU_MVFR1_MVE_Msk (0xFUL << FPU_MVFR1_MVE_Pos) /*!< MVFR1: MVE bits Mask */ - -#define FPU_MVFR1_FPDNaN_Pos 4U /*!< MVFR1: FPDNaN bits Position */ -#define FPU_MVFR1_FPDNaN_Msk (0xFUL << FPU_MVFR1_FPDNaN_Pos) /*!< MVFR1: FPDNaN bits Mask */ - -#define FPU_MVFR1_FPFtZ_Pos 0U /*!< MVFR1: FPFtZ bits Position */ -#define FPU_MVFR1_FPFtZ_Msk (0xFUL /*<< FPU_MVFR1_FPFtZ_Pos*/) /*!< MVFR1: FPFtZ bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_FPD_Pos 23U /*!< \deprecated CoreDebug DHCSR: S_FPD Position */ -#define CoreDebug_DHCSR_S_FPD_Msk (1UL << CoreDebug_DHCSR_S_FPD_Pos) /*!< \deprecated CoreDebug DHCSR: S_FPD Mask */ - -#define CoreDebug_DHCSR_S_SUIDE_Pos 22U /*!< \deprecated CoreDebug DHCSR: S_SUIDE Position */ -#define CoreDebug_DHCSR_S_SUIDE_Msk (1UL << CoreDebug_DHCSR_S_SUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SUIDE Mask */ - -#define CoreDebug_DHCSR_S_NSUIDE_Pos 21U /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Position */ -#define CoreDebug_DHCSR_S_NSUIDE_Msk (1UL << CoreDebug_DHCSR_S_NSUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Mask */ - -#define CoreDebug_DHCSR_S_SDE_Pos 20U /*!< \deprecated CoreDebug DHCSR: S_SDE Position */ -#define CoreDebug_DHCSR_S_SDE_Msk (1UL << CoreDebug_DHCSR_S_SDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SDE Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_PMOV_Pos 6U /*!< \deprecated CoreDebug DHCSR: C_PMOV Position */ -#define CoreDebug_DHCSR_C_PMOV_Msk (1UL << CoreDebug_DHCSR_C_PMOV_Pos) /*!< \deprecated CoreDebug DHCSR: C_PMOV Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Set Clear Exception and Monitor Control Register Definitions */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_REQ_Pos 3U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_SET_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_PEND_Pos 1U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_SET_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_UIDEN_Pos 10U /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_UIDAPEN_Pos 9U /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDAPEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDAPEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Mask */ - -#define CoreDebug_DAUTHCTRL_FSDMA_Pos 8U /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Position */ -#define CoreDebug_DAUTHCTRL_FSDMA_Msk (1UL << CoreDebug_DAUTHCTRL_FSDMA_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_FPD_Pos 23U /*!< DCB DHCSR: Floating-point registers Debuggable Position */ -#define DCB_DHCSR_S_FPD_Msk (0x1UL << DCB_DHCSR_S_FPD_Pos) /*!< DCB DHCSR: Floating-point registers Debuggable Mask */ - -#define DCB_DHCSR_S_SUIDE_Pos 22U /*!< DCB DHCSR: Secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_SUIDE_Msk (0x1UL << DCB_DHCSR_S_SUIDE_Pos) /*!< DCB DHCSR: Secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_NSUIDE_Pos 21U /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_NSUIDE_Msk (0x1UL << DCB_DHCSR_S_NSUIDE_Pos) /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_PMOV_Pos 6U /*!< DCB DHCSR: Halt on PMU overflow control Position */ -#define DCB_DHCSR_C_PMOV_Msk (0x1UL << DCB_DHCSR_C_PMOV_Pos) /*!< DCB DHCSR: Halt on PMU overflow control Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DSCEMCR, Debug Set Clear Exception and Monitor Control Register Definitions */ -#define DCB_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< DCB DSCEMCR: Clear monitor request Position */ -#define DCB_DSCEMCR_CLR_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_REQ_Pos) /*!< DCB DSCEMCR: Clear monitor request Mask */ - -#define DCB_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< DCB DSCEMCR: Clear monitor pend Position */ -#define DCB_DSCEMCR_CLR_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_PEND_Pos) /*!< DCB DSCEMCR: Clear monitor pend Mask */ - -#define DCB_DSCEMCR_SET_MON_REQ_Pos 3U /*!< DCB DSCEMCR: Set monitor request Position */ -#define DCB_DSCEMCR_SET_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_SET_MON_REQ_Pos) /*!< DCB DSCEMCR: Set monitor request Mask */ - -#define DCB_DSCEMCR_SET_MON_PEND_Pos 1U /*!< DCB DSCEMCR: Set monitor pend Position */ -#define DCB_DSCEMCR_SET_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_SET_MON_PEND_Pos) /*!< DCB DSCEMCR: Set monitor pend Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_UIDEN_Pos 10U /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Position */ -#define DCB_DAUTHCTRL_UIDEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Mask */ - -#define DCB_DAUTHCTRL_UIDAPEN_Pos 9U /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Position */ -#define DCB_DAUTHCTRL_UIDAPEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDAPEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Mask */ - -#define DCB_DAUTHCTRL_FSDMA_Pos 8U /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Position */ -#define DCB_DAUTHCTRL_FSDMA_Msk (0x1UL << DCB_DAUTHCTRL_FSDMA_Pos) /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Mask */ - -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SUNID_Pos 22U /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUNID_Msk (0x3UL << DIB_DAUTHSTATUS_SUNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SUID_Pos 20U /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUID_Msk (0x3UL << DIB_DAUTHSTATUS_SUID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_NSUNID_Pos 18U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Position */ -#define DIB_DAUTHSTATUS_NSUNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Mask */ - -#define DIB_DAUTHSTATUS_NSUID_Pos 16U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_NSUID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define MEMSYSCTL_BASE (0xE001E000UL) /*!< Memory System Control Base Address */ - #define ERRBNK_BASE (0xE001E100UL) /*!< Error Banking Base Address */ - #define PWRMODCTL_BASE (0xE001E300UL) /*!< Power Mode Control Base Address */ - #define EWIC_BASE (0xE001E400UL) /*!< External Wakeup Interrupt Controller Base Address */ - #define PRCCFGINF_BASE (0xE001E700UL) /*!< Processor Configuration Information Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define ICB ((ICB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define MEMSYSCTL ((MemSysCtl_Type *) MEMSYSCTL_BASE ) /*!< Memory System Control configuration struct */ - #define ERRBNK ((ErrBnk_Type *) ERRBNK_BASE ) /*!< Error Banking configuration struct */ - #define PWRMODCTL ((PwrModCtl_Type *) PWRMODCTL_BASE ) /*!< Power Mode Control configuration struct */ - #define EWIC ((EWIC_Type *) EWIC_BASE ) /*!< EWIC configuration struct */ - #define PRCCFGINF ((PrcCfgInf_Type *) PRCCFGINF_BASE ) /*!< Processor Configuration Information configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - #define PMU_BASE (0xE0003000UL) /*!< PMU Base Address */ - #define PMU ((PMU_Type *) PMU_BASE ) /*!< PMU configuration struct */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define ICB_NS ((ICB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ - -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## PMU functions and events #################################### */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - -#include "pmu_armv8.h" - -/** - \brief Cortex-M85 PMU events - \note Architectural PMU events can be found in pmu_armv8.h -*/ - -#define ARMCM85_PMU_ECC_ERR 0xC000 /*!< One or more Error Correcting Code (ECC) errors detected */ -#define ARMCM85_PMU_ECC_ERR_MBIT 0xC001 /*!< One or more multi-bit ECC errors detected */ -#define ARMCM85_PMU_ECC_ERR_DCACHE 0xC010 /*!< One or more ECC errors in the data cache */ -#define ARMCM85_PMU_ECC_ERR_ICACHE 0xC011 /*!< One or more ECC errors in the instruction cache */ -#define ARMCM85_PMU_ECC_ERR_MBIT_DCACHE 0xC012 /*!< One or more multi-bit ECC errors in the data cache */ -#define ARMCM85_PMU_ECC_ERR_MBIT_ICACHE 0xC013 /*!< One or more multi-bit ECC errors in the instruction cache */ -#define ARMCM85_PMU_ECC_ERR_DTCM 0xC020 /*!< One or more ECC errors in the Data Tightly Coupled Memory (DTCM) */ -#define ARMCM85_PMU_ECC_ERR_ITCM 0xC021 /*!< One or more ECC errors in the Instruction Tightly Coupled Memory (ITCM) */ -#define ARMCM85_PMU_ECC_ERR_MBIT_DTCM 0xC022 /*!< One or more multi-bit ECC errors in the DTCM */ -#define ARMCM85_PMU_ECC_ERR_MBIT_ITCM 0xC023 /*!< One or more multi-bit ECC errors in the ITCM */ -#define ARMCM85_PMU_PF_LINEFILL 0xC100 /*!< The prefetcher starts a line-fill */ -#define ARMCM85_PMU_PF_CANCEL 0xC101 /*!< The prefetcher stops prefetching */ -#define ARMCM85_PMU_PF_DROP_LINEFILL 0xC102 /*!< A linefill triggered by a prefetcher has been dropped because of lack of buffering */ -#define ARMCM85_PMU_NWAMODE_ENTER 0xC200 /*!< No write-allocate mode entry */ -#define ARMCM85_PMU_NWAMODE 0xC201 /*!< Write-allocate store is not allocated into the data cache due to no-write-allocate mode */ -#define ARMCM85_PMU_SAHB_ACCESS 0xC300 /*!< Read or write access on the S-AHB interface to the TCM */ -#define ARMCM85_PMU_PAHB_ACCESS 0xC301 /*!< Read or write access on the P-AHB write interface */ -#define ARMCM85_PMU_AXI_WRITE_ACCESS 0xC302 /*!< Any beat access to M-AXI write interface */ -#define ARMCM85_PMU_AXI_READ_ACCESS 0xC303 /*!< Any beat access to M-AXI read interface */ -#define ARMCM85_PMU_DOSTIMEOUT_DOUBLE 0xC400 /*!< Denial of Service timeout has fired twice and caused buffers to drain to allow forward progress */ -#define ARMCM85_PMU_DOSTIMEOUT_TRIPLE 0xC401 /*!< Denial of Service timeout has fired three times and blocked the LSU to force forward progress */ - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - -/* ########################## MVE functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_MveFunctions MVE Functions - \brief Function that provides MVE type. - @{ - */ - -/** - \brief get MVE type - \details returns the MVE type - \returns - - \b 0: No Vector Extension (MVE) - - \b 1: Integer Vector Extension (MVE-I) - - \b 2: Floating-point Vector Extension (MVE-F) - */ -__STATIC_INLINE uint32_t SCB_GetMVEType(void) -{ - const uint32_t mvfr1 = FPU->MVFR1; - if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x2U << FPU_MVFR1_MVE_Pos)) - { - return 2U; - } - else if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x1U << FPU_MVFR1_MVE_Pos)) - { - return 1U; - } - else - { - return 0U; - } -} - - -/*@} end of CMSIS_Core_MveFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - -/* ################### PAC Key functions ########################### */ - -#if (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) -#include "pac_armv81.h" -#endif - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM85_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_sc000.h b/software/Power_Pico/Drivers/CMSIS/Include/core_sc000.h deleted file mode 100644 index dbc755f..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_sc000.h +++ /dev/null @@ -1,1030 +0,0 @@ -/**************************************************************************//** - * @file core_sc000.h - * @brief CMSIS SC000 Core Peripheral Access Layer Header File - * @version V5.0.7 - * @date 27. March 2020 - ******************************************************************************/ -/* - * Copyright (c) 2009-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_SC000_H_GENERIC -#define __CORE_SC000_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup SC000 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS SC000 definitions */ -#define __SC000_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __SC000_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ - __SC000_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_SC (000U) /*!< Cortex secure core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC000_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_SC000_H_DEPENDANT -#define __CORE_SC000_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __SC000_REV - #define __SC000_REV 0x0000U - #warning "__SC000_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group SC000 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t _reserved0:1; /*!< bit: 0 Reserved */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - uint32_t RESERVED1[154U]; - __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the SC000 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else -/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for SC000 */ -/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for SC000 */ - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ -/*#define NVIC_GetActive __NVIC_GetActive not available for SC000 */ - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ - - -/* Interrupt Priorities are WORD accessible only under Armv6-M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M0 and M0+ do not require the architectural barrier - assume SC000 is the same */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC000_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_sc300.h b/software/Power_Pico/Drivers/CMSIS/Include/core_sc300.h deleted file mode 100644 index d666210..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_sc300.h +++ /dev/null @@ -1,1917 +0,0 @@ -/**************************************************************************//** - * @file core_sc300.h - * @brief CMSIS SC300 Core Peripheral Access Layer Header File - * @version V5.0.10 - * @date 04. June 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_SC300_H_GENERIC -#define __CORE_SC300_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup SC3000 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS SC300 definitions */ -#define __SC300_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __SC300_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ - __SC300_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_SC (300U) /*!< Cortex secure core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC300_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_SC300_H_DEPENDANT -#define __CORE_SC300_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __SC300_REV - #define __SC300_REV 0x0000U - #warning "__SC300_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group SC300 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - uint32_t RESERVED1[129U]; - __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ -#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ - -#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ -#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ -#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ - -#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ -#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M3 does not require the architectural barrier */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC300_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/core_starmc1.h b/software/Power_Pico/Drivers/CMSIS/Include/core_starmc1.h deleted file mode 100644 index d86c8d3..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/core_starmc1.h +++ /dev/null @@ -1,3592 +0,0 @@ -/**************************************************************************//** - * @file core_starmc1.h - * @brief CMSIS ArmChina STAR-MC1 Core Peripheral Access Layer Header File - * @version V1.0.2 - * @date 07. April 2022 - ******************************************************************************/ -/* - * Copyright (c) 2009-2018 Arm Limited. - * Copyright (c) 2018-2022 Arm China. - * All rights reserved. - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_STAR_H_GENERIC -#define __CORE_STAR_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup STAR-MC1 - @{ - */ - -#include "cmsis_version.h" - -/* Macro Define for STAR-MC1 */ -#define __STAR_MC (1U) /*!< STAR-MC Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined (__TARGET_FPU_VFP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined (__ARM_FP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined (__ARMVFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined (__TI_VFP_SUPPORT__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined (__FPU_VFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_STAR_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_STAR_H_DEPENDANT -#define __CORE_STAR_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __STAR_REV - #define __STAR_REV 0x0000U - #warning "__STAR_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DTCM_PRESENT - #define __DTCM_PRESENT 0U - #warning "__DTCM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group STAR-MC1 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for STAR-MC1 processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[1U]; - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED_ADD1[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: F00-D00=0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ -} SCB_Type; - -typedef struct -{ - __IOM uint32_t CACR; /*!< Offset: 0x0 (R/W) L1 Cache Control Register */ - __IOM uint32_t ITCMCR; /*!< Offset: 0x10 (R/W) Instruction Tightly-Coupled Memory Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x14 (R/W) Data Tightly-Coupled Memory Control Registers */ -}EMSS_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -#define SCB_CLIDR_IC_Pos 0U /*!< SCB CLIDR: IC Position */ -#define SCB_CLIDR_IC_Msk (1UL << SCB_CLIDR_IC_Pos) /*!< SCB CLIDR: IC Mask */ - -#define SCB_CLIDR_DC_Pos 1U /*!< SCB CLIDR: DC Position */ -#define SCB_CLIDR_DC_Msk (1UL << SCB_CLIDR_DC_Pos) /*!< SCB CLIDR: DC Mask */ - - - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache line Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_LEVEL_Pos 1U /*!< SCB DCISW: Level Position */ -#define SCB_DCISW_LEVEL_Msk (7UL << SCB_DCISW_LEVEL_Pos) /*!< SCB DCISW: Level Mask */ - -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0xFFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean line by Set-way Register Definitions */ -#define SCB_DCCSW_LEVEL_Pos 1U /*!< SCB DCCSW: Level Position */ -#define SCB_DCCSW_LEVEL_Msk (7UL << SCB_DCCSW_LEVEL_Pos) /*!< SCB DCCSW: Level Mask */ - -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0xFFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_LEVEL_Pos 1U /*!< SCB DCCISW: Level Position */ -#define SCB_DCCISW_LEVEL_Msk (7UL << SCB_DCCISW_LEVEL_Pos) /*!< SCB DCCISW: Level Mask */ - -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0xFFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/* ArmChina: Implementation Defined */ -/* Instruction Tightly-Coupled Memory Control Register Definitions */ -#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ -#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ - -#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ -#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ - -/* Data Tightly-Coupled Memory Control Register Definitions */ -#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ -#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ - -#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ -#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ - -/* L1 Cache Control Register Definitions */ -#define SCB_CACR_DCCLEAN_Pos 16U /*!< SCB CACR: DCCLEAN Position */ -#define SCB_CACR_DCCLEAN_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: DCCLEAN Mask */ - -#define SCB_CACR_ICACTIVE_Pos 13U /*!< SCB CACR: ICACTIVE Position */ -#define SCB_CACR_ICACTIVE_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: ICACTIVE Mask */ - -#define SCB_CACR_DCACTIVE_Pos 12U /*!< SCB CACR: DCACTIVE Position */ -#define SCB_CACR_DCACTIVE_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: DCACTIVE Mask */ - -#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ -#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ - __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ - __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration Test FIFO Test Data 0 Register Definitions */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ -#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ -#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ -#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ - -/* TPI Integration Test ATB Control Register 2 Register Definitions */ -#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ -#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ - -#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ -#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ - -#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ -#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ - -#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ -#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ - -/* TPI Integration Test FIFO Test Data 1 Register Definitions */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ -#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ -#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ -#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ - -/* TPI Integration Test ATB Control Register 0 Definitions */ -#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ -#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ - -#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ -#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ - -#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ -#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ - -#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ -#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - - - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define EMSS_BASE (0xE001E000UL) /*!AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses including - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/** - \brief Software Reset - \details Initiates a system reset request to reset the CPU. - */ -__NO_RETURN __STATIC_INLINE void __SW_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses including - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_BFHFNMINS_Msk) | /* Keep BFHFNMINS unchanged. Use this Reset function in case your case need to keep it */ - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | /* Keep priority group unchanged */ - SCB_AIRCR_SYSRESETREQ_Msk ); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) - -/* ########################## Cache functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_CacheFunctions Cache Functions - \brief Functions that configure Instruction and Data cache. - @{ - */ - -/* Cache Size ID Register Macros */ -#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) -#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) - -#define __SCB_DCACHE_LINE_SIZE 32U /*!< STAR-MC1 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ -#define __SCB_ICACHE_LINE_SIZE 32U /*!< STAR-MC1 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ - -/** - \brief Enable I-Cache - \details Turns on I-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */ - - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable I-Cache - \details Turns off I-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate I-Cache - \details Invalidates I-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; - __DSB(); - __ISB(); - #endif -} - - -/** - \brief I-Cache Invalidate by address - \details Invalidates I-Cache for the given address. - I-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - I-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] isize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateICache_by_Addr (void *addr, int32_t isize) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if ( isize > 0 ) { - int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_ICACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->ICIMVAU = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_ICACHE_LINE_SIZE; - op_size -= __SCB_ICACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief Enable D-Cache - \details Turns on D-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */ - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - __DSB(); - - SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable D-Cache - \details Turns off D-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate D-Cache - \details Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean D-Cache - \details Cleans D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | - ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean & Invalidate D-Cache - \details Cleans and Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief D-Cache Invalidate by address - \details Invalidates D-Cache for the given address. - D-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateDCache_by_Addr (void *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean by address - \details Cleans D-Cache for the given address - D-Cache is cleaned starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean and Invalidate by address - \details Cleans and invalidates D_Cache for the given address - D-Cache is cleaned and invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned and invalidated. - \param[in] addr address (aligned to 32-byte boundary) - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - -/*@} end of CMSIS_Core_CacheFunctions */ -#endif - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_STAR_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/mpu_armv7.h b/software/Power_Pico/Drivers/CMSIS/Include/mpu_armv7.h deleted file mode 100644 index d9eedf8..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/mpu_armv7.h +++ /dev/null @@ -1,275 +0,0 @@ -/****************************************************************************** - * @file mpu_armv7.h - * @brief CMSIS MPU API for Armv7-M MPU - * @version V5.1.2 - * @date 25. May 2020 - ******************************************************************************/ -/* - * Copyright (c) 2017-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef ARM_MPU_ARMV7_H -#define ARM_MPU_ARMV7_H - -#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes -#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes -#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes -#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes -#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes -#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte -#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes -#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes -#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes -#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes -#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes -#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes -#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes -#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes -#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes -#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte -#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes -#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes -#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes -#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes -#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes -#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes -#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes -#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes -#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes -#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte -#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes -#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes - -#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access -#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only -#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only -#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access -#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only -#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access - -/** MPU Region Base Address Register Value -* -* \param Region The region to be configured, number 0 to 15. -* \param BaseAddress The base address for the region. -*/ -#define ARM_MPU_RBAR(Region, BaseAddress) \ - (((BaseAddress) & MPU_RBAR_ADDR_Msk) | \ - ((Region) & MPU_RBAR_REGION_Msk) | \ - (MPU_RBAR_VALID_Msk)) - -/** -* MPU Memory Access Attributes -* -* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. -* \param IsShareable Region is shareable between multiple bus masters. -* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. -* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. -*/ -#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \ - ((((TypeExtField) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ - (((IsShareable) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ - (((IsCacheable) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ - (((IsBufferable) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk)) - -/** -* MPU Region Attribute and Size Register Value -* -* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. -* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. -* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_. -* \param SubRegionDisable Sub-region disable field. -* \param Size Region size of the region to be configured, for example 4K, 8K. -*/ -#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \ - ((((DisableExec) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ - (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ - (((AccessAttributes) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) | \ - (((SubRegionDisable) << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \ - (((Size) << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \ - (((MPU_RASR_ENABLE_Msk)))) - -/** -* MPU Region Attribute and Size Register Value -* -* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. -* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. -* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. -* \param IsShareable Region is shareable between multiple bus masters. -* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. -* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. -* \param SubRegionDisable Sub-region disable field. -* \param Size Region size of the region to be configured, for example 4K, 8K. -*/ -#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ - ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size) - -/** -* MPU Memory Access Attribute for strongly ordered memory. -* - TEX: 000b -* - Shareable -* - Non-cacheable -* - Non-bufferable -*/ -#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U) - -/** -* MPU Memory Access Attribute for device memory. -* - TEX: 000b (if shareable) or 010b (if non-shareable) -* - Shareable or non-shareable -* - Non-cacheable -* - Bufferable (if shareable) or non-bufferable (if non-shareable) -* -* \param IsShareable Configures the device memory as shareable or non-shareable. -*/ -#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U)) - -/** -* MPU Memory Access Attribute for normal memory. -* - TEX: 1BBb (reflecting outer cacheability rules) -* - Shareable or non-shareable -* - Cacheable or non-cacheable (reflecting inner cacheability rules) -* - Bufferable or non-bufferable (reflecting inner cacheability rules) -* -* \param OuterCp Configures the outer cache policy. -* \param InnerCp Configures the inner cache policy. -* \param IsShareable Configures the memory as shareable or non-shareable. -*/ -#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) >> 1U), ((InnerCp) & 1U)) - -/** -* MPU Memory Access Attribute non-cacheable policy. -*/ -#define ARM_MPU_CACHEP_NOCACHE 0U - -/** -* MPU Memory Access Attribute write-back, write and read allocate policy. -*/ -#define ARM_MPU_CACHEP_WB_WRA 1U - -/** -* MPU Memory Access Attribute write-through, no write allocate policy. -*/ -#define ARM_MPU_CACHEP_WT_NWA 2U - -/** -* MPU Memory Access Attribute write-back, no write allocate policy. -*/ -#define ARM_MPU_CACHEP_WB_NWA 3U - - -/** -* Struct for a single MPU Region -*/ -typedef struct { - uint32_t RBAR; //!< The region base address register value (RBAR) - uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR -} ARM_MPU_Region_t; - -/** Enable the MPU. -* \param MPU_Control Default access permissions for unconfigured regions. -*/ -__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) -{ - __DMB(); - MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; -#endif - __DSB(); - __ISB(); -} - -/** Disable the MPU. -*/ -__STATIC_INLINE void ARM_MPU_Disable(void) -{ - __DMB(); -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; -#endif - MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; - __DSB(); - __ISB(); -} - -/** Clear and disable the given MPU region. -* \param rnr Region number to be cleared. -*/ -__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) -{ - MPU->RNR = rnr; - MPU->RASR = 0U; -} - -/** Configure an MPU region. -* \param rbar Value for RBAR register. -* \param rasr Value for RASR register. -*/ -__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) -{ - MPU->RBAR = rbar; - MPU->RASR = rasr; -} - -/** Configure the given MPU region. -* \param rnr Region number to be configured. -* \param rbar Value for RBAR register. -* \param rasr Value for RASR register. -*/ -__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) -{ - MPU->RNR = rnr; - MPU->RBAR = rbar; - MPU->RASR = rasr; -} - -/** Memcpy with strictly ordered memory access, e.g. used by code in ARM_MPU_Load(). -* \param dst Destination data is copied to. -* \param src Source data is copied from. -* \param len Amount of data words to be copied. -*/ -__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) -{ - uint32_t i; - for (i = 0U; i < len; ++i) - { - dst[i] = src[i]; - } -} - -/** Load the given number of MPU regions from a table. -* \param table Pointer to the MPU configuration table. -* \param cnt Amount of regions to be configured. -*/ -__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) -{ - const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; - while (cnt > MPU_TYPE_RALIASES) { - ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); - table += MPU_TYPE_RALIASES; - cnt -= MPU_TYPE_RALIASES; - } - ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); -} - -#endif diff --git a/software/Power_Pico/Drivers/CMSIS/Include/mpu_armv8.h b/software/Power_Pico/Drivers/CMSIS/Include/mpu_armv8.h deleted file mode 100644 index 3de16ef..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/mpu_armv8.h +++ /dev/null @@ -1,352 +0,0 @@ -/****************************************************************************** - * @file mpu_armv8.h - * @brief CMSIS MPU API for Armv8-M and Armv8.1-M MPU - * @version V5.1.3 - * @date 03. February 2021 - ******************************************************************************/ -/* - * Copyright (c) 2017-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef ARM_MPU_ARMV8_H -#define ARM_MPU_ARMV8_H - -/** \brief Attribute for device memory (outer only) */ -#define ARM_MPU_ATTR_DEVICE ( 0U ) - -/** \brief Attribute for non-cacheable, normal memory */ -#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U ) - -/** \brief Attribute for normal memory (outer and inner) -* \param NT Non-Transient: Set to 1 for non-transient data. -* \param WB Write-Back: Set to 1 to use write-back update policy. -* \param RA Read Allocation: Set to 1 to use cache allocation on read miss. -* \param WA Write Allocation: Set to 1 to use cache allocation on write miss. -*/ -#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ - ((((NT) & 1U) << 3U) | (((WB) & 1U) << 2U) | (((RA) & 1U) << 1U) | ((WA) & 1U)) - -/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ -#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) - -/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ -#define ARM_MPU_ATTR_DEVICE_nGnRE (1U) - -/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ -#define ARM_MPU_ATTR_DEVICE_nGRE (2U) - -/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ -#define ARM_MPU_ATTR_DEVICE_GRE (3U) - -/** \brief Memory Attribute -* \param O Outer memory attributes -* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes -*/ -#define ARM_MPU_ATTR(O, I) ((((O) & 0xFU) << 4U) | ((((O) & 0xFU) != 0U) ? ((I) & 0xFU) : (((I) & 0x3U) << 2U))) - -/** \brief Normal memory non-shareable */ -#define ARM_MPU_SH_NON (0U) - -/** \brief Normal memory outer shareable */ -#define ARM_MPU_SH_OUTER (2U) - -/** \brief Normal memory inner shareable */ -#define ARM_MPU_SH_INNER (3U) - -/** \brief Memory access permissions -* \param RO Read-Only: Set to 1 for read-only memory. -* \param NP Non-Privileged: Set to 1 for non-privileged memory. -*/ -#define ARM_MPU_AP_(RO, NP) ((((RO) & 1U) << 1U) | ((NP) & 1U)) - -/** \brief Region Base Address Register value -* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. -* \param SH Defines the Shareability domain for this memory region. -* \param RO Read-Only: Set to 1 for a read-only memory region. -* \param NP Non-Privileged: Set to 1 for a non-privileged memory region. -* \oaram XN eXecute Never: Set to 1 for a non-executable memory region. -*/ -#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ - (((BASE) & MPU_RBAR_BASE_Msk) | \ - (((SH) << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ - ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ - (((XN) << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) - -/** \brief Region Limit Address Register value -* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. -* \param IDX The attribute index to be associated with this memory region. -*/ -#define ARM_MPU_RLAR(LIMIT, IDX) \ - (((LIMIT) & MPU_RLAR_LIMIT_Msk) | \ - (((IDX) << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ - (MPU_RLAR_EN_Msk)) - -#if defined(MPU_RLAR_PXN_Pos) - -/** \brief Region Limit Address Register with PXN value -* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. -* \param PXN Privileged execute never. Defines whether code can be executed from this privileged region. -* \param IDX The attribute index to be associated with this memory region. -*/ -#define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX) \ - (((LIMIT) & MPU_RLAR_LIMIT_Msk) | \ - (((PXN) << MPU_RLAR_PXN_Pos) & MPU_RLAR_PXN_Msk) | \ - (((IDX) << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ - (MPU_RLAR_EN_Msk)) - -#endif - -/** -* Struct for a single MPU Region -*/ -typedef struct { - uint32_t RBAR; /*!< Region Base Address Register value */ - uint32_t RLAR; /*!< Region Limit Address Register value */ -} ARM_MPU_Region_t; - -/** Enable the MPU. -* \param MPU_Control Default access permissions for unconfigured regions. -*/ -__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) -{ - __DMB(); - MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; -#endif - __DSB(); - __ISB(); -} - -/** Disable the MPU. -*/ -__STATIC_INLINE void ARM_MPU_Disable(void) -{ - __DMB(); -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; -#endif - MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; - __DSB(); - __ISB(); -} - -#ifdef MPU_NS -/** Enable the Non-secure MPU. -* \param MPU_Control Default access permissions for unconfigured regions. -*/ -__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) -{ - __DMB(); - MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; -#endif - __DSB(); - __ISB(); -} - -/** Disable the Non-secure MPU. -*/ -__STATIC_INLINE void ARM_MPU_Disable_NS(void) -{ - __DMB(); -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; -#endif - MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk; - __DSB(); - __ISB(); -} -#endif - -/** Set the memory attribute encoding to the given MPU. -* \param mpu Pointer to the MPU to be configured. -* \param idx The attribute index to be set [0-7] -* \param attr The attribute value to be set. -*/ -__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) -{ - const uint8_t reg = idx / 4U; - const uint32_t pos = ((idx % 4U) * 8U); - const uint32_t mask = 0xFFU << pos; - - if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { - return; // invalid index - } - - mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); -} - -/** Set the memory attribute encoding. -* \param idx The attribute index to be set [0-7] -* \param attr The attribute value to be set. -*/ -__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) -{ - ARM_MPU_SetMemAttrEx(MPU, idx, attr); -} - -#ifdef MPU_NS -/** Set the memory attribute encoding to the Non-secure MPU. -* \param idx The attribute index to be set [0-7] -* \param attr The attribute value to be set. -*/ -__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) -{ - ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); -} -#endif - -/** Clear and disable the given MPU region of the given MPU. -* \param mpu Pointer to MPU to be used. -* \param rnr Region number to be cleared. -*/ -__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) -{ - mpu->RNR = rnr; - mpu->RLAR = 0U; -} - -/** Clear and disable the given MPU region. -* \param rnr Region number to be cleared. -*/ -__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) -{ - ARM_MPU_ClrRegionEx(MPU, rnr); -} - -#ifdef MPU_NS -/** Clear and disable the given Non-secure MPU region. -* \param rnr Region number to be cleared. -*/ -__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) -{ - ARM_MPU_ClrRegionEx(MPU_NS, rnr); -} -#endif - -/** Configure the given MPU region of the given MPU. -* \param mpu Pointer to MPU to be used. -* \param rnr Region number to be configured. -* \param rbar Value for RBAR register. -* \param rlar Value for RLAR register. -*/ -__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) -{ - mpu->RNR = rnr; - mpu->RBAR = rbar; - mpu->RLAR = rlar; -} - -/** Configure the given MPU region. -* \param rnr Region number to be configured. -* \param rbar Value for RBAR register. -* \param rlar Value for RLAR register. -*/ -__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) -{ - ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); -} - -#ifdef MPU_NS -/** Configure the given Non-secure MPU region. -* \param rnr Region number to be configured. -* \param rbar Value for RBAR register. -* \param rlar Value for RLAR register. -*/ -__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) -{ - ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar); -} -#endif - -/** Memcpy with strictly ordered memory access, e.g. used by code in ARM_MPU_LoadEx() -* \param dst Destination data is copied to. -* \param src Source data is copied from. -* \param len Amount of data words to be copied. -*/ -__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) -{ - uint32_t i; - for (i = 0U; i < len; ++i) - { - dst[i] = src[i]; - } -} - -/** Load the given number of MPU regions from a table to the given MPU. -* \param mpu Pointer to the MPU registers to be used. -* \param rnr First region number to be configured. -* \param table Pointer to the MPU configuration table. -* \param cnt Amount of regions to be configured. -*/ -__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) -{ - const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; - if (cnt == 1U) { - mpu->RNR = rnr; - ARM_MPU_OrderedMemcpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); - } else { - uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U); - uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; - - mpu->RNR = rnrBase; - while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { - uint32_t c = MPU_TYPE_RALIASES - rnrOffset; - ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); - table += c; - cnt -= c; - rnrOffset = 0U; - rnrBase += MPU_TYPE_RALIASES; - mpu->RNR = rnrBase; - } - - ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); - } -} - -/** Load the given number of MPU regions from a table. -* \param rnr First region number to be configured. -* \param table Pointer to the MPU configuration table. -* \param cnt Amount of regions to be configured. -*/ -__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) -{ - ARM_MPU_LoadEx(MPU, rnr, table, cnt); -} - -#ifdef MPU_NS -/** Load the given number of MPU regions from a table to the Non-secure MPU. -* \param rnr First region number to be configured. -* \param table Pointer to the MPU configuration table. -* \param cnt Amount of regions to be configured. -*/ -__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) -{ - ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); -} -#endif - -#endif - diff --git a/software/Power_Pico/Drivers/CMSIS/Include/pac_armv81.h b/software/Power_Pico/Drivers/CMSIS/Include/pac_armv81.h deleted file mode 100644 index 854b60a..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/pac_armv81.h +++ /dev/null @@ -1,206 +0,0 @@ -/****************************************************************************** - * @file pac_armv81.h - * @brief CMSIS PAC key functions for Armv8.1-M PAC extension - * @version V1.0.0 - * @date 23. March 2022 - ******************************************************************************/ -/* - * Copyright (c) 2022 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef PAC_ARMV81_H -#define PAC_ARMV81_H - - -/* ################### PAC Key functions ########################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_PacKeyFunctions PAC Key functions - \brief Functions that access the PAC keys. - @{ - */ - -#if (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) - -/** - \brief read the PAC key used for privileged mode - \details Reads the PAC key stored in the PAC_KEY_P registers. - \param [out] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __get_PAC_KEY_P (uint32_t* pPacKey) { - __ASM volatile ( - "mrs r1, pac_key_p_0\n" - "str r1,[%0,#0]\n" - "mrs r1, pac_key_p_1\n" - "str r1,[%0,#4]\n" - "mrs r1, pac_key_p_2\n" - "str r1,[%0,#8]\n" - "mrs r1, pac_key_p_3\n" - "str r1,[%0,#12]\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief write the PAC key used for privileged mode - \details writes the given PAC key to the PAC_KEY_P registers. - \param [in] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __set_PAC_KEY_P (uint32_t* pPacKey) { - __ASM volatile ( - "ldr r1,[%0,#0]\n" - "msr pac_key_p_0, r1\n" - "ldr r1,[%0,#4]\n" - "msr pac_key_p_1, r1\n" - "ldr r1,[%0,#8]\n" - "msr pac_key_p_2, r1\n" - "ldr r1,[%0,#12]\n" - "msr pac_key_p_3, r1\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief read the PAC key used for unprivileged mode - \details Reads the PAC key stored in the PAC_KEY_U registers. - \param [out] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __get_PAC_KEY_U (uint32_t* pPacKey) { - __ASM volatile ( - "mrs r1, pac_key_u_0\n" - "str r1,[%0,#0]\n" - "mrs r1, pac_key_u_1\n" - "str r1,[%0,#4]\n" - "mrs r1, pac_key_u_2\n" - "str r1,[%0,#8]\n" - "mrs r1, pac_key_u_3\n" - "str r1,[%0,#12]\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief write the PAC key used for unprivileged mode - \details writes the given PAC key to the PAC_KEY_U registers. - \param [in] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __set_PAC_KEY_U (uint32_t* pPacKey) { - __ASM volatile ( - "ldr r1,[%0,#0]\n" - "msr pac_key_u_0, r1\n" - "ldr r1,[%0,#4]\n" - "msr pac_key_u_1, r1\n" - "ldr r1,[%0,#8]\n" - "msr pac_key_u_2, r1\n" - "ldr r1,[%0,#12]\n" - "msr pac_key_u_3, r1\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) - -/** - \brief read the PAC key used for privileged mode (non-secure) - \details Reads the PAC key stored in the non-secure PAC_KEY_P registers when in secure mode. - \param [out] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __TZ_get_PAC_KEY_P_NS (uint32_t* pPacKey) { - __ASM volatile ( - "mrs r1, pac_key_p_0_ns\n" - "str r1,[%0,#0]\n" - "mrs r1, pac_key_p_1_ns\n" - "str r1,[%0,#4]\n" - "mrs r1, pac_key_p_2_ns\n" - "str r1,[%0,#8]\n" - "mrs r1, pac_key_p_3_ns\n" - "str r1,[%0,#12]\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief write the PAC key used for privileged mode (non-secure) - \details writes the given PAC key to the non-secure PAC_KEY_P registers when in secure mode. - \param [in] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __TZ_set_PAC_KEY_P_NS (uint32_t* pPacKey) { - __ASM volatile ( - "ldr r1,[%0,#0]\n" - "msr pac_key_p_0_ns, r1\n" - "ldr r1,[%0,#4]\n" - "msr pac_key_p_1_ns, r1\n" - "ldr r1,[%0,#8]\n" - "msr pac_key_p_2_ns, r1\n" - "ldr r1,[%0,#12]\n" - "msr pac_key_p_3_ns, r1\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief read the PAC key used for unprivileged mode (non-secure) - \details Reads the PAC key stored in the non-secure PAC_KEY_U registers when in secure mode. - \param [out] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __TZ_get_PAC_KEY_U_NS (uint32_t* pPacKey) { - __ASM volatile ( - "mrs r1, pac_key_u_0_ns\n" - "str r1,[%0,#0]\n" - "mrs r1, pac_key_u_1_ns\n" - "str r1,[%0,#4]\n" - "mrs r1, pac_key_u_2_ns\n" - "str r1,[%0,#8]\n" - "mrs r1, pac_key_u_3_ns\n" - "str r1,[%0,#12]\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief write the PAC key used for unprivileged mode (non-secure) - \details writes the given PAC key to the non-secure PAC_KEY_U registers when in secure mode. - \param [in] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __TZ_set_PAC_KEY_U_NS (uint32_t* pPacKey) { - __ASM volatile ( - "ldr r1,[%0,#0]\n" - "msr pac_key_u_0_ns, r1\n" - "ldr r1,[%0,#4]\n" - "msr pac_key_u_1_ns, r1\n" - "ldr r1,[%0,#8]\n" - "msr pac_key_u_2_ns, r1\n" - "ldr r1,[%0,#12]\n" - "msr pac_key_u_3_ns, r1\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -#endif /* (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) */ - -#endif /* (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) */ - -/*@} end of CMSIS_Core_PacKeyFunctions */ - - -#endif /* PAC_ARMV81_H */ diff --git a/software/Power_Pico/Drivers/CMSIS/Include/pmu_armv8.h b/software/Power_Pico/Drivers/CMSIS/Include/pmu_armv8.h deleted file mode 100644 index f8f3d89..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/pmu_armv8.h +++ /dev/null @@ -1,337 +0,0 @@ -/****************************************************************************** - * @file pmu_armv8.h - * @brief CMSIS PMU API for Armv8.1-M PMU - * @version V1.0.1 - * @date 15. April 2020 - ******************************************************************************/ -/* - * Copyright (c) 2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef ARM_PMU_ARMV8_H -#define ARM_PMU_ARMV8_H - -/** - * \brief PMU Events - * \note See the Armv8.1-M Architecture Reference Manual for full details on these PMU events. - * */ - -#define ARM_PMU_SW_INCR 0x0000 /*!< Software update to the PMU_SWINC register, architecturally executed and condition code check pass */ -#define ARM_PMU_L1I_CACHE_REFILL 0x0001 /*!< L1 I-Cache refill */ -#define ARM_PMU_L1D_CACHE_REFILL 0x0003 /*!< L1 D-Cache refill */ -#define ARM_PMU_L1D_CACHE 0x0004 /*!< L1 D-Cache access */ -#define ARM_PMU_LD_RETIRED 0x0006 /*!< Memory-reading instruction architecturally executed and condition code check pass */ -#define ARM_PMU_ST_RETIRED 0x0007 /*!< Memory-writing instruction architecturally executed and condition code check pass */ -#define ARM_PMU_INST_RETIRED 0x0008 /*!< Instruction architecturally executed */ -#define ARM_PMU_EXC_TAKEN 0x0009 /*!< Exception entry */ -#define ARM_PMU_EXC_RETURN 0x000A /*!< Exception return instruction architecturally executed and the condition code check pass */ -#define ARM_PMU_PC_WRITE_RETIRED 0x000C /*!< Software change to the Program Counter (PC). Instruction is architecturally executed and condition code check pass */ -#define ARM_PMU_BR_IMMED_RETIRED 0x000D /*!< Immediate branch architecturally executed */ -#define ARM_PMU_BR_RETURN_RETIRED 0x000E /*!< Function return instruction architecturally executed and the condition code check pass */ -#define ARM_PMU_UNALIGNED_LDST_RETIRED 0x000F /*!< Unaligned memory memory-reading or memory-writing instruction architecturally executed and condition code check pass */ -#define ARM_PMU_BR_MIS_PRED 0x0010 /*!< Mispredicted or not predicted branch speculatively executed */ -#define ARM_PMU_CPU_CYCLES 0x0011 /*!< Cycle */ -#define ARM_PMU_BR_PRED 0x0012 /*!< Predictable branch speculatively executed */ -#define ARM_PMU_MEM_ACCESS 0x0013 /*!< Data memory access */ -#define ARM_PMU_L1I_CACHE 0x0014 /*!< Level 1 instruction cache access */ -#define ARM_PMU_L1D_CACHE_WB 0x0015 /*!< Level 1 data cache write-back */ -#define ARM_PMU_L2D_CACHE 0x0016 /*!< Level 2 data cache access */ -#define ARM_PMU_L2D_CACHE_REFILL 0x0017 /*!< Level 2 data cache refill */ -#define ARM_PMU_L2D_CACHE_WB 0x0018 /*!< Level 2 data cache write-back */ -#define ARM_PMU_BUS_ACCESS 0x0019 /*!< Bus access */ -#define ARM_PMU_MEMORY_ERROR 0x001A /*!< Local memory error */ -#define ARM_PMU_INST_SPEC 0x001B /*!< Instruction speculatively executed */ -#define ARM_PMU_BUS_CYCLES 0x001D /*!< Bus cycles */ -#define ARM_PMU_CHAIN 0x001E /*!< For an odd numbered counter, increment when an overflow occurs on the preceding even-numbered counter on the same PE */ -#define ARM_PMU_L1D_CACHE_ALLOCATE 0x001F /*!< Level 1 data cache allocation without refill */ -#define ARM_PMU_L2D_CACHE_ALLOCATE 0x0020 /*!< Level 2 data cache allocation without refill */ -#define ARM_PMU_BR_RETIRED 0x0021 /*!< Branch instruction architecturally executed */ -#define ARM_PMU_BR_MIS_PRED_RETIRED 0x0022 /*!< Mispredicted branch instruction architecturally executed */ -#define ARM_PMU_STALL_FRONTEND 0x0023 /*!< No operation issued because of the frontend */ -#define ARM_PMU_STALL_BACKEND 0x0024 /*!< No operation issued because of the backend */ -#define ARM_PMU_L2I_CACHE 0x0027 /*!< Level 2 instruction cache access */ -#define ARM_PMU_L2I_CACHE_REFILL 0x0028 /*!< Level 2 instruction cache refill */ -#define ARM_PMU_L3D_CACHE_ALLOCATE 0x0029 /*!< Level 3 data cache allocation without refill */ -#define ARM_PMU_L3D_CACHE_REFILL 0x002A /*!< Level 3 data cache refill */ -#define ARM_PMU_L3D_CACHE 0x002B /*!< Level 3 data cache access */ -#define ARM_PMU_L3D_CACHE_WB 0x002C /*!< Level 3 data cache write-back */ -#define ARM_PMU_LL_CACHE_RD 0x0036 /*!< Last level data cache read */ -#define ARM_PMU_LL_CACHE_MISS_RD 0x0037 /*!< Last level data cache read miss */ -#define ARM_PMU_L1D_CACHE_MISS_RD 0x0039 /*!< Level 1 data cache read miss */ -#define ARM_PMU_OP_COMPLETE 0x003A /*!< Operation retired */ -#define ARM_PMU_OP_SPEC 0x003B /*!< Operation speculatively executed */ -#define ARM_PMU_STALL 0x003C /*!< Stall cycle for instruction or operation not sent for execution */ -#define ARM_PMU_STALL_OP_BACKEND 0x003D /*!< Stall cycle for instruction or operation not sent for execution due to pipeline backend */ -#define ARM_PMU_STALL_OP_FRONTEND 0x003E /*!< Stall cycle for instruction or operation not sent for execution due to pipeline frontend */ -#define ARM_PMU_STALL_OP 0x003F /*!< Instruction or operation slots not occupied each cycle */ -#define ARM_PMU_L1D_CACHE_RD 0x0040 /*!< Level 1 data cache read */ -#define ARM_PMU_LE_RETIRED 0x0100 /*!< Loop end instruction executed */ -#define ARM_PMU_LE_SPEC 0x0101 /*!< Loop end instruction speculatively executed */ -#define ARM_PMU_BF_RETIRED 0x0104 /*!< Branch future instruction architecturally executed and condition code check pass */ -#define ARM_PMU_BF_SPEC 0x0105 /*!< Branch future instruction speculatively executed and condition code check pass */ -#define ARM_PMU_LE_CANCEL 0x0108 /*!< Loop end instruction not taken */ -#define ARM_PMU_BF_CANCEL 0x0109 /*!< Branch future instruction not taken */ -#define ARM_PMU_SE_CALL_S 0x0114 /*!< Call to secure function, resulting in Security state change */ -#define ARM_PMU_SE_CALL_NS 0x0115 /*!< Call to non-secure function, resulting in Security state change */ -#define ARM_PMU_DWT_CMPMATCH0 0x0118 /*!< DWT comparator 0 match */ -#define ARM_PMU_DWT_CMPMATCH1 0x0119 /*!< DWT comparator 1 match */ -#define ARM_PMU_DWT_CMPMATCH2 0x011A /*!< DWT comparator 2 match */ -#define ARM_PMU_DWT_CMPMATCH3 0x011B /*!< DWT comparator 3 match */ -#define ARM_PMU_MVE_INST_RETIRED 0x0200 /*!< MVE instruction architecturally executed */ -#define ARM_PMU_MVE_INST_SPEC 0x0201 /*!< MVE instruction speculatively executed */ -#define ARM_PMU_MVE_FP_RETIRED 0x0204 /*!< MVE floating-point instruction architecturally executed */ -#define ARM_PMU_MVE_FP_SPEC 0x0205 /*!< MVE floating-point instruction speculatively executed */ -#define ARM_PMU_MVE_FP_HP_RETIRED 0x0208 /*!< MVE half-precision floating-point instruction architecturally executed */ -#define ARM_PMU_MVE_FP_HP_SPEC 0x0209 /*!< MVE half-precision floating-point instruction speculatively executed */ -#define ARM_PMU_MVE_FP_SP_RETIRED 0x020C /*!< MVE single-precision floating-point instruction architecturally executed */ -#define ARM_PMU_MVE_FP_SP_SPEC 0x020D /*!< MVE single-precision floating-point instruction speculatively executed */ -#define ARM_PMU_MVE_FP_MAC_RETIRED 0x0214 /*!< MVE floating-point multiply or multiply-accumulate instruction architecturally executed */ -#define ARM_PMU_MVE_FP_MAC_SPEC 0x0215 /*!< MVE floating-point multiply or multiply-accumulate instruction speculatively executed */ -#define ARM_PMU_MVE_INT_RETIRED 0x0224 /*!< MVE integer instruction architecturally executed */ -#define ARM_PMU_MVE_INT_SPEC 0x0225 /*!< MVE integer instruction speculatively executed */ -#define ARM_PMU_MVE_INT_MAC_RETIRED 0x0228 /*!< MVE multiply or multiply-accumulate instruction architecturally executed */ -#define ARM_PMU_MVE_INT_MAC_SPEC 0x0229 /*!< MVE multiply or multiply-accumulate instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_RETIRED 0x0238 /*!< MVE load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_SPEC 0x0239 /*!< MVE load or store instruction speculatively executed */ -#define ARM_PMU_MVE_LD_RETIRED 0x023C /*!< MVE load instruction architecturally executed */ -#define ARM_PMU_MVE_LD_SPEC 0x023D /*!< MVE load instruction speculatively executed */ -#define ARM_PMU_MVE_ST_RETIRED 0x0240 /*!< MVE store instruction architecturally executed */ -#define ARM_PMU_MVE_ST_SPEC 0x0241 /*!< MVE store instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_CONTIG_RETIRED 0x0244 /*!< MVE contiguous load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_CONTIG_SPEC 0x0245 /*!< MVE contiguous load or store instruction speculatively executed */ -#define ARM_PMU_MVE_LD_CONTIG_RETIRED 0x0248 /*!< MVE contiguous load instruction architecturally executed */ -#define ARM_PMU_MVE_LD_CONTIG_SPEC 0x0249 /*!< MVE contiguous load instruction speculatively executed */ -#define ARM_PMU_MVE_ST_CONTIG_RETIRED 0x024C /*!< MVE contiguous store instruction architecturally executed */ -#define ARM_PMU_MVE_ST_CONTIG_SPEC 0x024D /*!< MVE contiguous store instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_NONCONTIG_RETIRED 0x0250 /*!< MVE non-contiguous load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_NONCONTIG_SPEC 0x0251 /*!< MVE non-contiguous load or store instruction speculatively executed */ -#define ARM_PMU_MVE_LD_NONCONTIG_RETIRED 0x0254 /*!< MVE non-contiguous load instruction architecturally executed */ -#define ARM_PMU_MVE_LD_NONCONTIG_SPEC 0x0255 /*!< MVE non-contiguous load instruction speculatively executed */ -#define ARM_PMU_MVE_ST_NONCONTIG_RETIRED 0x0258 /*!< MVE non-contiguous store instruction architecturally executed */ -#define ARM_PMU_MVE_ST_NONCONTIG_SPEC 0x0259 /*!< MVE non-contiguous store instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_MULTI_RETIRED 0x025C /*!< MVE memory instruction targeting multiple registers architecturally executed */ -#define ARM_PMU_MVE_LDST_MULTI_SPEC 0x025D /*!< MVE memory instruction targeting multiple registers speculatively executed */ -#define ARM_PMU_MVE_LD_MULTI_RETIRED 0x0260 /*!< MVE memory load instruction targeting multiple registers architecturally executed */ -#define ARM_PMU_MVE_LD_MULTI_SPEC 0x0261 /*!< MVE memory load instruction targeting multiple registers speculatively executed */ -#define ARM_PMU_MVE_ST_MULTI_RETIRED 0x0261 /*!< MVE memory store instruction targeting multiple registers architecturally executed */ -#define ARM_PMU_MVE_ST_MULTI_SPEC 0x0265 /*!< MVE memory store instruction targeting multiple registers speculatively executed */ -#define ARM_PMU_MVE_LDST_UNALIGNED_RETIRED 0x028C /*!< MVE unaligned memory load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_UNALIGNED_SPEC 0x028D /*!< MVE unaligned memory load or store instruction speculatively executed */ -#define ARM_PMU_MVE_LD_UNALIGNED_RETIRED 0x0290 /*!< MVE unaligned load instruction architecturally executed */ -#define ARM_PMU_MVE_LD_UNALIGNED_SPEC 0x0291 /*!< MVE unaligned load instruction speculatively executed */ -#define ARM_PMU_MVE_ST_UNALIGNED_RETIRED 0x0294 /*!< MVE unaligned store instruction architecturally executed */ -#define ARM_PMU_MVE_ST_UNALIGNED_SPEC 0x0295 /*!< MVE unaligned store instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_UNALIGNED_NONCONTIG_RETIRED 0x0298 /*!< MVE unaligned noncontiguous load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_UNALIGNED_NONCONTIG_SPEC 0x0299 /*!< MVE unaligned noncontiguous load or store instruction speculatively executed */ -#define ARM_PMU_MVE_VREDUCE_RETIRED 0x02A0 /*!< MVE vector reduction instruction architecturally executed */ -#define ARM_PMU_MVE_VREDUCE_SPEC 0x02A1 /*!< MVE vector reduction instruction speculatively executed */ -#define ARM_PMU_MVE_VREDUCE_FP_RETIRED 0x02A4 /*!< MVE floating-point vector reduction instruction architecturally executed */ -#define ARM_PMU_MVE_VREDUCE_FP_SPEC 0x02A5 /*!< MVE floating-point vector reduction instruction speculatively executed */ -#define ARM_PMU_MVE_VREDUCE_INT_RETIRED 0x02A8 /*!< MVE integer vector reduction instruction architecturally executed */ -#define ARM_PMU_MVE_VREDUCE_INT_SPEC 0x02A9 /*!< MVE integer vector reduction instruction speculatively executed */ -#define ARM_PMU_MVE_PRED 0x02B8 /*!< Cycles where one or more predicated beats architecturally executed */ -#define ARM_PMU_MVE_STALL 0x02CC /*!< Stall cycles caused by an MVE instruction */ -#define ARM_PMU_MVE_STALL_RESOURCE 0x02CD /*!< Stall cycles caused by an MVE instruction because of resource conflicts */ -#define ARM_PMU_MVE_STALL_RESOURCE_MEM 0x02CE /*!< Stall cycles caused by an MVE instruction because of memory resource conflicts */ -#define ARM_PMU_MVE_STALL_RESOURCE_FP 0x02CF /*!< Stall cycles caused by an MVE instruction because of floating-point resource conflicts */ -#define ARM_PMU_MVE_STALL_RESOURCE_INT 0x02D0 /*!< Stall cycles caused by an MVE instruction because of integer resource conflicts */ -#define ARM_PMU_MVE_STALL_BREAK 0x02D3 /*!< Stall cycles caused by an MVE chain break */ -#define ARM_PMU_MVE_STALL_DEPENDENCY 0x02D4 /*!< Stall cycles caused by MVE register dependency */ -#define ARM_PMU_ITCM_ACCESS 0x4007 /*!< Instruction TCM access */ -#define ARM_PMU_DTCM_ACCESS 0x4008 /*!< Data TCM access */ -#define ARM_PMU_TRCEXTOUT0 0x4010 /*!< ETM external output 0 */ -#define ARM_PMU_TRCEXTOUT1 0x4011 /*!< ETM external output 1 */ -#define ARM_PMU_TRCEXTOUT2 0x4012 /*!< ETM external output 2 */ -#define ARM_PMU_TRCEXTOUT3 0x4013 /*!< ETM external output 3 */ -#define ARM_PMU_CTI_TRIGOUT4 0x4018 /*!< Cross-trigger Interface output trigger 4 */ -#define ARM_PMU_CTI_TRIGOUT5 0x4019 /*!< Cross-trigger Interface output trigger 5 */ -#define ARM_PMU_CTI_TRIGOUT6 0x401A /*!< Cross-trigger Interface output trigger 6 */ -#define ARM_PMU_CTI_TRIGOUT7 0x401B /*!< Cross-trigger Interface output trigger 7 */ - -/** \brief PMU Functions */ - -__STATIC_INLINE void ARM_PMU_Enable(void); -__STATIC_INLINE void ARM_PMU_Disable(void); - -__STATIC_INLINE void ARM_PMU_Set_EVTYPER(uint32_t num, uint32_t type); - -__STATIC_INLINE void ARM_PMU_CYCCNT_Reset(void); -__STATIC_INLINE void ARM_PMU_EVCNTR_ALL_Reset(void); - -__STATIC_INLINE void ARM_PMU_CNTR_Enable(uint32_t mask); -__STATIC_INLINE void ARM_PMU_CNTR_Disable(uint32_t mask); - -__STATIC_INLINE uint32_t ARM_PMU_Get_CCNTR(void); -__STATIC_INLINE uint32_t ARM_PMU_Get_EVCNTR(uint32_t num); - -__STATIC_INLINE uint32_t ARM_PMU_Get_CNTR_OVS(void); -__STATIC_INLINE void ARM_PMU_Set_CNTR_OVS(uint32_t mask); - -__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Enable(uint32_t mask); -__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Disable(uint32_t mask); - -__STATIC_INLINE void ARM_PMU_CNTR_Increment(uint32_t mask); - -/** - \brief Enable the PMU -*/ -__STATIC_INLINE void ARM_PMU_Enable(void) -{ - PMU->CTRL |= PMU_CTRL_ENABLE_Msk; -} - -/** - \brief Disable the PMU -*/ -__STATIC_INLINE void ARM_PMU_Disable(void) -{ - PMU->CTRL &= ~PMU_CTRL_ENABLE_Msk; -} - -/** - \brief Set event to count for PMU eventer counter - \param [in] num Event counter (0-30) to configure - \param [in] type Event to count -*/ -__STATIC_INLINE void ARM_PMU_Set_EVTYPER(uint32_t num, uint32_t type) -{ - PMU->EVTYPER[num] = type; -} - -/** - \brief Reset cycle counter -*/ -__STATIC_INLINE void ARM_PMU_CYCCNT_Reset(void) -{ - PMU->CTRL |= PMU_CTRL_CYCCNT_RESET_Msk; -} - -/** - \brief Reset all event counters -*/ -__STATIC_INLINE void ARM_PMU_EVCNTR_ALL_Reset(void) -{ - PMU->CTRL |= PMU_CTRL_EVENTCNT_RESET_Msk; -} - -/** - \brief Enable counters - \param [in] mask Counters to enable - \note Enables one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_CNTR_Enable(uint32_t mask) -{ - PMU->CNTENSET = mask; -} - -/** - \brief Disable counters - \param [in] mask Counters to enable - \note Disables one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_CNTR_Disable(uint32_t mask) -{ - PMU->CNTENCLR = mask; -} - -/** - \brief Read cycle counter - \return Cycle count -*/ -__STATIC_INLINE uint32_t ARM_PMU_Get_CCNTR(void) -{ - return PMU->CCNTR; -} - -/** - \brief Read event counter - \param [in] num Event counter (0-30) to read - \return Event count -*/ -__STATIC_INLINE uint32_t ARM_PMU_Get_EVCNTR(uint32_t num) -{ - return PMU_EVCNTR_CNT_Msk & PMU->EVCNTR[num]; -} - -/** - \brief Read counter overflow status - \return Counter overflow status bits for the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE uint32_t ARM_PMU_Get_CNTR_OVS(void) -{ - return PMU->OVSSET; -} - -/** - \brief Clear counter overflow status - \param [in] mask Counter overflow status bits to clear - \note Clears overflow status bits for one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_Set_CNTR_OVS(uint32_t mask) -{ - PMU->OVSCLR = mask; -} - -/** - \brief Enable counter overflow interrupt request - \param [in] mask Counter overflow interrupt request bits to set - \note Sets overflow interrupt request bits for one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Enable(uint32_t mask) -{ - PMU->INTENSET = mask; -} - -/** - \brief Disable counter overflow interrupt request - \param [in] mask Counter overflow interrupt request bits to clear - \note Clears overflow interrupt request bits for one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Disable(uint32_t mask) -{ - PMU->INTENCLR = mask; -} - -/** - \brief Software increment event counter - \param [in] mask Counters to increment - \note Software increment bits for one or more event counters (0-30) -*/ -__STATIC_INLINE void ARM_PMU_CNTR_Increment(uint32_t mask) -{ - PMU->SWINC = mask; -} - -#endif diff --git a/software/Power_Pico/Drivers/CMSIS/Include/tz_context.h b/software/Power_Pico/Drivers/CMSIS/Include/tz_context.h deleted file mode 100644 index 0d09749..0000000 --- a/software/Power_Pico/Drivers/CMSIS/Include/tz_context.h +++ /dev/null @@ -1,70 +0,0 @@ -/****************************************************************************** - * @file tz_context.h - * @brief Context Management for Armv8-M TrustZone - * @version V1.0.1 - * @date 10. January 2018 - ******************************************************************************/ -/* - * Copyright (c) 2017-2018 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef TZ_CONTEXT_H -#define TZ_CONTEXT_H - -#include - -#ifndef TZ_MODULEID_T -#define TZ_MODULEID_T -/// \details Data type that identifies secure software modules called by a process. -typedef uint32_t TZ_ModuleId_t; -#endif - -/// \details TZ Memory ID identifies an allocated memory slot. -typedef uint32_t TZ_MemoryId_t; - -/// Initialize secure context memory system -/// \return execution status (1: success, 0: error) -uint32_t TZ_InitContextSystem_S (void); - -/// Allocate context memory for calling secure software modules in TrustZone -/// \param[in] module identifies software modules called from non-secure mode -/// \return value != 0 id TrustZone memory slot identifier -/// \return value 0 no memory available or internal error -TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); - -/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S -/// \param[in] id TrustZone memory slot identifier -/// \return execution status (1: success, 0: error) -uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); - -/// Load secure context (called on RTOS thread context switch) -/// \param[in] id TrustZone memory slot identifier -/// \return execution status (1: success, 0: error) -uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); - -/// Store secure context (called on RTOS thread context switch) -/// \param[in] id TrustZone memory slot identifier -/// \return execution status (1: success, 0: error) -uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); - -#endif // TZ_CONTEXT_H diff --git a/software/Power_Pico/Drivers/CMSIS/LICENSE.txt b/software/Power_Pico/Drivers/CMSIS/LICENSE.txt deleted file mode 100644 index 8dada3e..0000000 --- a/software/Power_Pico/Drivers/CMSIS/LICENSE.txt +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h deleted file mode 100644 index 239d149..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ /dev/null @@ -1,4359 +0,0 @@ -/** - ****************************************************************************** - * @file stm32_hal_legacy.h - * @author MCD Application Team - * @brief This file contains aliases definition for the STM32Cube HAL constants - * macros and functions maintained for legacy purpose. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32_HAL_LEGACY -#define STM32_HAL_LEGACY - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup HAL_AES_Aliased_Defines HAL CRYP Aliased Defines maintained for legacy purpose - * @{ - */ -#define AES_FLAG_RDERR CRYP_FLAG_RDERR -#define AES_FLAG_WRERR CRYP_FLAG_WRERR -#define AES_CLEARFLAG_CCF CRYP_CLEARFLAG_CCF -#define AES_CLEARFLAG_RDERR CRYP_CLEARFLAG_RDERR -#define AES_CLEARFLAG_WRERR CRYP_CLEARFLAG_WRERR -#if defined(STM32H7) || defined(STM32MP1) -#define CRYP_DATATYPE_32B CRYP_NO_SWAP -#define CRYP_DATATYPE_16B CRYP_HALFWORD_SWAP -#define CRYP_DATATYPE_8B CRYP_BYTE_SWAP -#define CRYP_DATATYPE_1B CRYP_BIT_SWAP -#endif /* STM32H7 || STM32MP1 */ -/** - * @} - */ - -/** @defgroup HAL_ADC_Aliased_Defines HAL ADC Aliased Defines maintained for legacy purpose - * @{ - */ -#define ADC_RESOLUTION12b ADC_RESOLUTION_12B -#define ADC_RESOLUTION10b ADC_RESOLUTION_10B -#define ADC_RESOLUTION8b ADC_RESOLUTION_8B -#define ADC_RESOLUTION6b ADC_RESOLUTION_6B -#define OVR_DATA_OVERWRITTEN ADC_OVR_DATA_OVERWRITTEN -#define OVR_DATA_PRESERVED ADC_OVR_DATA_PRESERVED -#define EOC_SINGLE_CONV ADC_EOC_SINGLE_CONV -#define EOC_SEQ_CONV ADC_EOC_SEQ_CONV -#define EOC_SINGLE_SEQ_CONV ADC_EOC_SINGLE_SEQ_CONV -#define REGULAR_GROUP ADC_REGULAR_GROUP -#define INJECTED_GROUP ADC_INJECTED_GROUP -#define REGULAR_INJECTED_GROUP ADC_REGULAR_INJECTED_GROUP -#define AWD_EVENT ADC_AWD_EVENT -#define AWD1_EVENT ADC_AWD1_EVENT -#define AWD2_EVENT ADC_AWD2_EVENT -#define AWD3_EVENT ADC_AWD3_EVENT -#define OVR_EVENT ADC_OVR_EVENT -#define JQOVF_EVENT ADC_JQOVF_EVENT -#define ALL_CHANNELS ADC_ALL_CHANNELS -#define REGULAR_CHANNELS ADC_REGULAR_CHANNELS -#define INJECTED_CHANNELS ADC_INJECTED_CHANNELS -#define SYSCFG_FLAG_SENSOR_ADC ADC_FLAG_SENSOR -#define SYSCFG_FLAG_VREF_ADC ADC_FLAG_VREFINT -#define ADC_CLOCKPRESCALER_PCLK_DIV1 ADC_CLOCK_SYNC_PCLK_DIV1 -#define ADC_CLOCKPRESCALER_PCLK_DIV2 ADC_CLOCK_SYNC_PCLK_DIV2 -#define ADC_CLOCKPRESCALER_PCLK_DIV4 ADC_CLOCK_SYNC_PCLK_DIV4 -#define ADC_CLOCKPRESCALER_PCLK_DIV6 ADC_CLOCK_SYNC_PCLK_DIV6 -#define ADC_CLOCKPRESCALER_PCLK_DIV8 ADC_CLOCK_SYNC_PCLK_DIV8 -#define ADC_EXTERNALTRIG0_T6_TRGO ADC_EXTERNALTRIGCONV_T6_TRGO -#define ADC_EXTERNALTRIG1_T21_CC2 ADC_EXTERNALTRIGCONV_T21_CC2 -#define ADC_EXTERNALTRIG2_T2_TRGO ADC_EXTERNALTRIGCONV_T2_TRGO -#define ADC_EXTERNALTRIG3_T2_CC4 ADC_EXTERNALTRIGCONV_T2_CC4 -#define ADC_EXTERNALTRIG4_T22_TRGO ADC_EXTERNALTRIGCONV_T22_TRGO -#define ADC_EXTERNALTRIG7_EXT_IT11 ADC_EXTERNALTRIGCONV_EXT_IT11 -#define ADC_CLOCK_ASYNC ADC_CLOCK_ASYNC_DIV1 -#define ADC_EXTERNALTRIG_EDGE_NONE ADC_EXTERNALTRIGCONVEDGE_NONE -#define ADC_EXTERNALTRIG_EDGE_RISING ADC_EXTERNALTRIGCONVEDGE_RISING -#define ADC_EXTERNALTRIG_EDGE_FALLING ADC_EXTERNALTRIGCONVEDGE_FALLING -#define ADC_EXTERNALTRIG_EDGE_RISINGFALLING ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING -#define ADC_SAMPLETIME_2CYCLE_5 ADC_SAMPLETIME_2CYCLES_5 - -#define HAL_ADC_STATE_BUSY_REG HAL_ADC_STATE_REG_BUSY -#define HAL_ADC_STATE_BUSY_INJ HAL_ADC_STATE_INJ_BUSY -#define HAL_ADC_STATE_EOC_REG HAL_ADC_STATE_REG_EOC -#define HAL_ADC_STATE_EOC_INJ HAL_ADC_STATE_INJ_EOC -#define HAL_ADC_STATE_ERROR HAL_ADC_STATE_ERROR_INTERNAL -#define HAL_ADC_STATE_BUSY HAL_ADC_STATE_BUSY_INTERNAL -#define HAL_ADC_STATE_AWD HAL_ADC_STATE_AWD1 - -#if defined(STM32H7) -#define ADC_CHANNEL_VBAT_DIV4 ADC_CHANNEL_VBAT -#endif /* STM32H7 */ - -#if defined(STM32U5) -#define ADC_SAMPLETIME_5CYCLE ADC_SAMPLETIME_5CYCLES -#define ADC_SAMPLETIME_391CYCLES_5 ADC_SAMPLETIME_391CYCLES -#define ADC4_SAMPLETIME_160CYCLES_5 ADC4_SAMPLETIME_814CYCLES_5 -#endif /* STM32U5 */ - -#if defined(STM32H5) -#define ADC_CHANNEL_VCORE ADC_CHANNEL_VDDCORE -#endif /* STM32H5 */ -/** - * @} - */ - -/** @defgroup HAL_CEC_Aliased_Defines HAL CEC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define __HAL_CEC_GET_IT __HAL_CEC_GET_FLAG - -/** - * @} - */ - -/** @defgroup HAL_COMP_Aliased_Defines HAL COMP Aliased Defines maintained for legacy purpose - * @{ - */ -#define COMP_WINDOWMODE_DISABLED COMP_WINDOWMODE_DISABLE -#define COMP_WINDOWMODE_ENABLED COMP_WINDOWMODE_ENABLE -#define COMP_EXTI_LINE_COMP1_EVENT COMP_EXTI_LINE_COMP1 -#define COMP_EXTI_LINE_COMP2_EVENT COMP_EXTI_LINE_COMP2 -#define COMP_EXTI_LINE_COMP3_EVENT COMP_EXTI_LINE_COMP3 -#define COMP_EXTI_LINE_COMP4_EVENT COMP_EXTI_LINE_COMP4 -#define COMP_EXTI_LINE_COMP5_EVENT COMP_EXTI_LINE_COMP5 -#define COMP_EXTI_LINE_COMP6_EVENT COMP_EXTI_LINE_COMP6 -#define COMP_EXTI_LINE_COMP7_EVENT COMP_EXTI_LINE_COMP7 -#if defined(STM32L0) -#define COMP_LPTIMCONNECTION_ENABLED ((uint32_t)0x00000003U) /*!< COMPX output generic naming: connected to LPTIM - input 1 for COMP1, LPTIM input 2 for COMP2 */ -#endif -#define COMP_OUTPUT_COMP6TIM2OCREFCLR COMP_OUTPUT_COMP6_TIM2OCREFCLR -#if defined(STM32F373xC) || defined(STM32F378xx) -#define COMP_OUTPUT_TIM3IC1 COMP_OUTPUT_COMP1_TIM3IC1 -#define COMP_OUTPUT_TIM3OCREFCLR COMP_OUTPUT_COMP1_TIM3OCREFCLR -#endif /* STM32F373xC || STM32F378xx */ - -#if defined(STM32L0) || defined(STM32L4) -#define COMP_WINDOWMODE_ENABLE COMP_WINDOWMODE_COMP1_INPUT_PLUS_COMMON - -#define COMP_NONINVERTINGINPUT_IO1 COMP_INPUT_PLUS_IO1 -#define COMP_NONINVERTINGINPUT_IO2 COMP_INPUT_PLUS_IO2 -#define COMP_NONINVERTINGINPUT_IO3 COMP_INPUT_PLUS_IO3 -#define COMP_NONINVERTINGINPUT_IO4 COMP_INPUT_PLUS_IO4 -#define COMP_NONINVERTINGINPUT_IO5 COMP_INPUT_PLUS_IO5 -#define COMP_NONINVERTINGINPUT_IO6 COMP_INPUT_PLUS_IO6 - -#define COMP_INVERTINGINPUT_1_4VREFINT COMP_INPUT_MINUS_1_4VREFINT -#define COMP_INVERTINGINPUT_1_2VREFINT COMP_INPUT_MINUS_1_2VREFINT -#define COMP_INVERTINGINPUT_3_4VREFINT COMP_INPUT_MINUS_3_4VREFINT -#define COMP_INVERTINGINPUT_VREFINT COMP_INPUT_MINUS_VREFINT -#define COMP_INVERTINGINPUT_DAC1_CH1 COMP_INPUT_MINUS_DAC1_CH1 -#define COMP_INVERTINGINPUT_DAC1_CH2 COMP_INPUT_MINUS_DAC1_CH2 -#define COMP_INVERTINGINPUT_DAC1 COMP_INPUT_MINUS_DAC1_CH1 -#define COMP_INVERTINGINPUT_DAC2 COMP_INPUT_MINUS_DAC1_CH2 -#define COMP_INVERTINGINPUT_IO1 COMP_INPUT_MINUS_IO1 -#if defined(STM32L0) -/* Issue fixed on STM32L0 COMP driver: only 2 dedicated IO (IO1 and IO2), */ -/* IO2 was wrongly assigned to IO shared with DAC and IO3 was corresponding */ -/* to the second dedicated IO (only for COMP2). */ -#define COMP_INVERTINGINPUT_IO2 COMP_INPUT_MINUS_DAC1_CH2 -#define COMP_INVERTINGINPUT_IO3 COMP_INPUT_MINUS_IO2 -#else -#define COMP_INVERTINGINPUT_IO2 COMP_INPUT_MINUS_IO2 -#define COMP_INVERTINGINPUT_IO3 COMP_INPUT_MINUS_IO3 -#endif -#define COMP_INVERTINGINPUT_IO4 COMP_INPUT_MINUS_IO4 -#define COMP_INVERTINGINPUT_IO5 COMP_INPUT_MINUS_IO5 - -#define COMP_OUTPUTLEVEL_LOW COMP_OUTPUT_LEVEL_LOW -#define COMP_OUTPUTLEVEL_HIGH COMP_OUTPUT_LEVEL_HIGH - -/* Note: Literal "COMP_FLAG_LOCK" kept for legacy purpose. */ -/* To check COMP lock state, use macro "__HAL_COMP_IS_LOCKED()". */ -#if defined(COMP_CSR_LOCK) -#define COMP_FLAG_LOCK COMP_CSR_LOCK -#elif defined(COMP_CSR_COMP1LOCK) -#define COMP_FLAG_LOCK COMP_CSR_COMP1LOCK -#elif defined(COMP_CSR_COMPxLOCK) -#define COMP_FLAG_LOCK COMP_CSR_COMPxLOCK -#endif - -#if defined(STM32L4) -#define COMP_BLANKINGSRCE_TIM1OC5 COMP_BLANKINGSRC_TIM1_OC5_COMP1 -#define COMP_BLANKINGSRCE_TIM2OC3 COMP_BLANKINGSRC_TIM2_OC3_COMP1 -#define COMP_BLANKINGSRCE_TIM3OC3 COMP_BLANKINGSRC_TIM3_OC3_COMP1 -#define COMP_BLANKINGSRCE_TIM3OC4 COMP_BLANKINGSRC_TIM3_OC4_COMP2 -#define COMP_BLANKINGSRCE_TIM8OC5 COMP_BLANKINGSRC_TIM8_OC5_COMP2 -#define COMP_BLANKINGSRCE_TIM15OC1 COMP_BLANKINGSRC_TIM15_OC1_COMP2 -#define COMP_BLANKINGSRCE_NONE COMP_BLANKINGSRC_NONE -#endif - -#if defined(STM32L0) -#define COMP_MODE_HIGHSPEED COMP_POWERMODE_MEDIUMSPEED -#define COMP_MODE_LOWSPEED COMP_POWERMODE_ULTRALOWPOWER -#else -#define COMP_MODE_HIGHSPEED COMP_POWERMODE_HIGHSPEED -#define COMP_MODE_MEDIUMSPEED COMP_POWERMODE_MEDIUMSPEED -#define COMP_MODE_LOWPOWER COMP_POWERMODE_LOWPOWER -#define COMP_MODE_ULTRALOWPOWER COMP_POWERMODE_ULTRALOWPOWER -#endif - -#endif - -#if defined(STM32U5) -#define __HAL_COMP_COMP1_EXTI_CLEAR_RASING_FLAG __HAL_COMP_COMP1_EXTI_CLEAR_RISING_FLAG -#endif - -/** - * @} - */ - -/** @defgroup HAL_CORTEX_Aliased_Defines HAL CORTEX Aliased Defines maintained for legacy purpose - * @{ - */ -#define __HAL_CORTEX_SYSTICKCLK_CONFIG HAL_SYSTICK_CLKSourceConfig -#if defined(STM32U5) -#define MPU_DEVICE_nGnRnE MPU_DEVICE_NGNRNE -#define MPU_DEVICE_nGnRE MPU_DEVICE_NGNRE -#define MPU_DEVICE_nGRE MPU_DEVICE_NGRE -#endif /* STM32U5 */ -/** - * @} - */ - -/** @defgroup CRC_Aliases CRC API aliases - * @{ - */ -#if defined(STM32H5) || defined(STM32C0) -#else -#define HAL_CRC_Input_Data_Reverse HAL_CRCEx_Input_Data_Reverse /*!< Aliased to HAL_CRCEx_Input_Data_Reverse for - inter STM32 series compatibility */ -#define HAL_CRC_Output_Data_Reverse HAL_CRCEx_Output_Data_Reverse /*!< Aliased to HAL_CRCEx_Output_Data_Reverse for - inter STM32 series compatibility */ -#endif -/** - * @} - */ - -/** @defgroup HAL_CRC_Aliased_Defines HAL CRC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define CRC_OUTPUTDATA_INVERSION_DISABLED CRC_OUTPUTDATA_INVERSION_DISABLE -#define CRC_OUTPUTDATA_INVERSION_ENABLED CRC_OUTPUTDATA_INVERSION_ENABLE - -/** - * @} - */ - -/** @defgroup HAL_DAC_Aliased_Defines HAL DAC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define DAC1_CHANNEL_1 DAC_CHANNEL_1 -#define DAC1_CHANNEL_2 DAC_CHANNEL_2 -#define DAC2_CHANNEL_1 DAC_CHANNEL_1 -#define DAC_WAVE_NONE 0x00000000U -#define DAC_WAVE_NOISE DAC_CR_WAVE1_0 -#define DAC_WAVE_TRIANGLE DAC_CR_WAVE1_1 -#define DAC_WAVEGENERATION_NONE DAC_WAVE_NONE -#define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE -#define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE - -#if defined(STM32G4) || defined(STM32H7) || defined (STM32U5) -#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL -#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL -#endif - -#if defined(STM32U5) -#define DAC_TRIGGER_STOP_LPTIM1_OUT DAC_TRIGGER_STOP_LPTIM1_CH1 -#define DAC_TRIGGER_STOP_LPTIM3_OUT DAC_TRIGGER_STOP_LPTIM3_CH1 -#define DAC_TRIGGER_LPTIM1_OUT DAC_TRIGGER_LPTIM1_CH1 -#define DAC_TRIGGER_LPTIM3_OUT DAC_TRIGGER_LPTIM3_CH1 -#endif - -#if defined(STM32H5) -#define DAC_TRIGGER_LPTIM1_OUT DAC_TRIGGER_LPTIM1_CH1 -#define DAC_TRIGGER_LPTIM2_OUT DAC_TRIGGER_LPTIM2_CH1 -#endif - -#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || \ - defined(STM32F4) || defined(STM32G4) -#define HAL_DAC_MSP_INIT_CB_ID HAL_DAC_MSPINIT_CB_ID -#define HAL_DAC_MSP_DEINIT_CB_ID HAL_DAC_MSPDEINIT_CB_ID -#endif - -/** - * @} - */ - -/** @defgroup HAL_DMA_Aliased_Defines HAL DMA Aliased Defines maintained for legacy purpose - * @{ - */ -#define HAL_REMAPDMA_ADC_DMA_CH2 DMA_REMAP_ADC_DMA_CH2 -#define HAL_REMAPDMA_USART1_TX_DMA_CH4 DMA_REMAP_USART1_TX_DMA_CH4 -#define HAL_REMAPDMA_USART1_RX_DMA_CH5 DMA_REMAP_USART1_RX_DMA_CH5 -#define HAL_REMAPDMA_TIM16_DMA_CH4 DMA_REMAP_TIM16_DMA_CH4 -#define HAL_REMAPDMA_TIM17_DMA_CH2 DMA_REMAP_TIM17_DMA_CH2 -#define HAL_REMAPDMA_USART3_DMA_CH32 DMA_REMAP_USART3_DMA_CH32 -#define HAL_REMAPDMA_TIM16_DMA_CH6 DMA_REMAP_TIM16_DMA_CH6 -#define HAL_REMAPDMA_TIM17_DMA_CH7 DMA_REMAP_TIM17_DMA_CH7 -#define HAL_REMAPDMA_SPI2_DMA_CH67 DMA_REMAP_SPI2_DMA_CH67 -#define HAL_REMAPDMA_USART2_DMA_CH67 DMA_REMAP_USART2_DMA_CH67 -#define HAL_REMAPDMA_I2C1_DMA_CH76 DMA_REMAP_I2C1_DMA_CH76 -#define HAL_REMAPDMA_TIM1_DMA_CH6 DMA_REMAP_TIM1_DMA_CH6 -#define HAL_REMAPDMA_TIM2_DMA_CH7 DMA_REMAP_TIM2_DMA_CH7 -#define HAL_REMAPDMA_TIM3_DMA_CH6 DMA_REMAP_TIM3_DMA_CH6 - -#define IS_HAL_REMAPDMA IS_DMA_REMAP -#define __HAL_REMAPDMA_CHANNEL_ENABLE __HAL_DMA_REMAP_CHANNEL_ENABLE -#define __HAL_REMAPDMA_CHANNEL_DISABLE __HAL_DMA_REMAP_CHANNEL_DISABLE - -#if defined(STM32L4) - -#define HAL_DMAMUX1_REQUEST_GEN_EXTI0 HAL_DMAMUX1_REQ_GEN_EXTI0 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI1 HAL_DMAMUX1_REQ_GEN_EXTI1 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI2 HAL_DMAMUX1_REQ_GEN_EXTI2 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI3 HAL_DMAMUX1_REQ_GEN_EXTI3 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI4 HAL_DMAMUX1_REQ_GEN_EXTI4 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI5 HAL_DMAMUX1_REQ_GEN_EXTI5 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI6 HAL_DMAMUX1_REQ_GEN_EXTI6 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI7 HAL_DMAMUX1_REQ_GEN_EXTI7 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI8 HAL_DMAMUX1_REQ_GEN_EXTI8 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI9 HAL_DMAMUX1_REQ_GEN_EXTI9 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI10 HAL_DMAMUX1_REQ_GEN_EXTI10 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI11 HAL_DMAMUX1_REQ_GEN_EXTI11 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI12 HAL_DMAMUX1_REQ_GEN_EXTI12 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI13 HAL_DMAMUX1_REQ_GEN_EXTI13 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI14 HAL_DMAMUX1_REQ_GEN_EXTI14 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI15 HAL_DMAMUX1_REQ_GEN_EXTI15 -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH0_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH0_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH1_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH1_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH2_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH2_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH3_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH3_EVT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM1_OUT HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX1_REQ_GEN_LPTIM2_OUT -#define HAL_DMAMUX1_REQUEST_GEN_DSI_TE HAL_DMAMUX1_REQ_GEN_DSI_TE -#define HAL_DMAMUX1_REQUEST_GEN_DSI_EOT HAL_DMAMUX1_REQ_GEN_DSI_EOT -#define HAL_DMAMUX1_REQUEST_GEN_DMA2D_EOT HAL_DMAMUX1_REQ_GEN_DMA2D_EOT -#define HAL_DMAMUX1_REQUEST_GEN_LTDC_IT HAL_DMAMUX1_REQ_GEN_LTDC_IT - -#define HAL_DMAMUX_REQUEST_GEN_NO_EVENT HAL_DMAMUX_REQ_GEN_NO_EVENT -#define HAL_DMAMUX_REQUEST_GEN_RISING HAL_DMAMUX_REQ_GEN_RISING -#define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING -#define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING - -#if defined(STM32L4R5xx) || defined(STM32L4R9xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || \ - defined(STM32L4S7xx) || defined(STM32L4S9xx) -#define DMA_REQUEST_DCMI_PSSI DMA_REQUEST_DCMI -#endif - -#endif /* STM32L4 */ - -#if defined(STM32G0) -#define DMA_REQUEST_DAC1_CHANNEL1 DMA_REQUEST_DAC1_CH1 -#define DMA_REQUEST_DAC1_CHANNEL2 DMA_REQUEST_DAC1_CH2 -#define DMA_REQUEST_TIM16_TRIG_COM DMA_REQUEST_TIM16_COM -#define DMA_REQUEST_TIM17_TRIG_COM DMA_REQUEST_TIM17_COM - -#define LL_DMAMUX_REQ_TIM16_TRIG_COM LL_DMAMUX_REQ_TIM16_COM -#define LL_DMAMUX_REQ_TIM17_TRIG_COM LL_DMAMUX_REQ_TIM17_COM -#endif - -#if defined(STM32H7) - -#define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1 -#define DMA_REQUEST_DAC2 DMA_REQUEST_DAC1_CH2 - -#define BDMA_REQUEST_LP_UART1_RX BDMA_REQUEST_LPUART1_RX -#define BDMA_REQUEST_LP_UART1_TX BDMA_REQUEST_LPUART1_TX - -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH0_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH0_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH1_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH1_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH2_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH2_EVT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM1_OUT HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX1_REQ_GEN_LPTIM2_OUT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM3_OUT HAL_DMAMUX1_REQ_GEN_LPTIM3_OUT -#define HAL_DMAMUX1_REQUEST_GEN_EXTI0 HAL_DMAMUX1_REQ_GEN_EXTI0 -#define HAL_DMAMUX1_REQUEST_GEN_TIM12_TRGO HAL_DMAMUX1_REQ_GEN_TIM12_TRGO - -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH0_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH0_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH1_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH1_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH2_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH2_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH3_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH3_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH4_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH4_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH5_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH5_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH6_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH6_EVT -#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_RX_WKUP HAL_DMAMUX2_REQ_GEN_LPUART1_RX_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_TX_WKUP HAL_DMAMUX2_REQ_GEN_LPUART1_TX_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM2_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM2_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX2_REQ_GEN_LPTIM2_OUT -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM3_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM3_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM3_OUT HAL_DMAMUX2_REQ_GEN_LPTIM3_OUT -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM4_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM4_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM5_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM5_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_I2C4_WKUP HAL_DMAMUX2_REQ_GEN_I2C4_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_SPI6_WKUP HAL_DMAMUX2_REQ_GEN_SPI6_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_COMP1_OUT HAL_DMAMUX2_REQ_GEN_COMP1_OUT -#define HAL_DMAMUX2_REQUEST_GEN_COMP2_OUT HAL_DMAMUX2_REQ_GEN_COMP2_OUT -#define HAL_DMAMUX2_REQUEST_GEN_RTC_WKUP HAL_DMAMUX2_REQ_GEN_RTC_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_EXTI0 HAL_DMAMUX2_REQ_GEN_EXTI0 -#define HAL_DMAMUX2_REQUEST_GEN_EXTI2 HAL_DMAMUX2_REQ_GEN_EXTI2 -#define HAL_DMAMUX2_REQUEST_GEN_I2C4_IT_EVT HAL_DMAMUX2_REQ_GEN_I2C4_IT_EVT -#define HAL_DMAMUX2_REQUEST_GEN_SPI6_IT HAL_DMAMUX2_REQ_GEN_SPI6_IT -#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_TX_IT HAL_DMAMUX2_REQ_GEN_LPUART1_TX_IT -#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_RX_IT HAL_DMAMUX2_REQ_GEN_LPUART1_RX_IT -#define HAL_DMAMUX2_REQUEST_GEN_ADC3_IT HAL_DMAMUX2_REQ_GEN_ADC3_IT -#define HAL_DMAMUX2_REQUEST_GEN_ADC3_AWD1_OUT HAL_DMAMUX2_REQ_GEN_ADC3_AWD1_OUT -#define HAL_DMAMUX2_REQUEST_GEN_BDMA_CH0_IT HAL_DMAMUX2_REQ_GEN_BDMA_CH0_IT -#define HAL_DMAMUX2_REQUEST_GEN_BDMA_CH1_IT HAL_DMAMUX2_REQ_GEN_BDMA_CH1_IT - -#define HAL_DMAMUX_REQUEST_GEN_NO_EVENT HAL_DMAMUX_REQ_GEN_NO_EVENT -#define HAL_DMAMUX_REQUEST_GEN_RISING HAL_DMAMUX_REQ_GEN_RISING -#define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING -#define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING - -#define DFSDM_FILTER_EXT_TRIG_LPTIM1 DFSDM_FILTER_EXT_TRIG_LPTIM1_OUT -#define DFSDM_FILTER_EXT_TRIG_LPTIM2 DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT -#define DFSDM_FILTER_EXT_TRIG_LPTIM3 DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT - -#define DAC_TRIGGER_LP1_OUT DAC_TRIGGER_LPTIM1_OUT -#define DAC_TRIGGER_LP2_OUT DAC_TRIGGER_LPTIM2_OUT - -#endif /* STM32H7 */ - -#if defined(STM32U5) -#define GPDMA1_REQUEST_DCMI GPDMA1_REQUEST_DCMI_PSSI -#endif /* STM32U5 */ -/** - * @} - */ - -/** @defgroup HAL_FLASH_Aliased_Defines HAL FLASH Aliased Defines maintained for legacy purpose - * @{ - */ - -#define TYPEPROGRAM_BYTE FLASH_TYPEPROGRAM_BYTE -#define TYPEPROGRAM_HALFWORD FLASH_TYPEPROGRAM_HALFWORD -#define TYPEPROGRAM_WORD FLASH_TYPEPROGRAM_WORD -#define TYPEPROGRAM_DOUBLEWORD FLASH_TYPEPROGRAM_DOUBLEWORD -#define TYPEERASE_SECTORS FLASH_TYPEERASE_SECTORS -#define TYPEERASE_PAGES FLASH_TYPEERASE_PAGES -#define TYPEERASE_PAGEERASE FLASH_TYPEERASE_PAGES -#define TYPEERASE_MASSERASE FLASH_TYPEERASE_MASSERASE -#define WRPSTATE_DISABLE OB_WRPSTATE_DISABLE -#define WRPSTATE_ENABLE OB_WRPSTATE_ENABLE -#define HAL_FLASH_TIMEOUT_VALUE FLASH_TIMEOUT_VALUE -#define OBEX_PCROP OPTIONBYTE_PCROP -#define OBEX_BOOTCONFIG OPTIONBYTE_BOOTCONFIG -#define PCROPSTATE_DISABLE OB_PCROP_STATE_DISABLE -#define PCROPSTATE_ENABLE OB_PCROP_STATE_ENABLE -#define TYPEERASEDATA_BYTE FLASH_TYPEERASEDATA_BYTE -#define TYPEERASEDATA_HALFWORD FLASH_TYPEERASEDATA_HALFWORD -#define TYPEERASEDATA_WORD FLASH_TYPEERASEDATA_WORD -#define TYPEPROGRAMDATA_BYTE FLASH_TYPEPROGRAMDATA_BYTE -#define TYPEPROGRAMDATA_HALFWORD FLASH_TYPEPROGRAMDATA_HALFWORD -#define TYPEPROGRAMDATA_WORD FLASH_TYPEPROGRAMDATA_WORD -#define TYPEPROGRAMDATA_FASTBYTE FLASH_TYPEPROGRAMDATA_FASTBYTE -#define TYPEPROGRAMDATA_FASTHALFWORD FLASH_TYPEPROGRAMDATA_FASTHALFWORD -#define TYPEPROGRAMDATA_FASTWORD FLASH_TYPEPROGRAMDATA_FASTWORD -#define PAGESIZE FLASH_PAGE_SIZE -#define TYPEPROGRAM_FASTBYTE FLASH_TYPEPROGRAM_BYTE -#define TYPEPROGRAM_FASTHALFWORD FLASH_TYPEPROGRAM_HALFWORD -#define TYPEPROGRAM_FASTWORD FLASH_TYPEPROGRAM_WORD -#define VOLTAGE_RANGE_1 FLASH_VOLTAGE_RANGE_1 -#define VOLTAGE_RANGE_2 FLASH_VOLTAGE_RANGE_2 -#define VOLTAGE_RANGE_3 FLASH_VOLTAGE_RANGE_3 -#define VOLTAGE_RANGE_4 FLASH_VOLTAGE_RANGE_4 -#define TYPEPROGRAM_FAST FLASH_TYPEPROGRAM_FAST -#define TYPEPROGRAM_FAST_AND_LAST FLASH_TYPEPROGRAM_FAST_AND_LAST -#define WRPAREA_BANK1_AREAA OB_WRPAREA_BANK1_AREAA -#define WRPAREA_BANK1_AREAB OB_WRPAREA_BANK1_AREAB -#define WRPAREA_BANK2_AREAA OB_WRPAREA_BANK2_AREAA -#define WRPAREA_BANK2_AREAB OB_WRPAREA_BANK2_AREAB -#define IWDG_STDBY_FREEZE OB_IWDG_STDBY_FREEZE -#define IWDG_STDBY_ACTIVE OB_IWDG_STDBY_RUN -#define IWDG_STOP_FREEZE OB_IWDG_STOP_FREEZE -#define IWDG_STOP_ACTIVE OB_IWDG_STOP_RUN -#define FLASH_ERROR_NONE HAL_FLASH_ERROR_NONE -#define FLASH_ERROR_RD HAL_FLASH_ERROR_RD -#define FLASH_ERROR_PG HAL_FLASH_ERROR_PROG -#define FLASH_ERROR_PGP HAL_FLASH_ERROR_PGS -#define FLASH_ERROR_WRP HAL_FLASH_ERROR_WRP -#define FLASH_ERROR_OPTV HAL_FLASH_ERROR_OPTV -#define FLASH_ERROR_OPTVUSR HAL_FLASH_ERROR_OPTVUSR -#define FLASH_ERROR_PROG HAL_FLASH_ERROR_PROG -#define FLASH_ERROR_OP HAL_FLASH_ERROR_OPERATION -#define FLASH_ERROR_PGA HAL_FLASH_ERROR_PGA -#define FLASH_ERROR_SIZE HAL_FLASH_ERROR_SIZE -#define FLASH_ERROR_SIZ HAL_FLASH_ERROR_SIZE -#define FLASH_ERROR_PGS HAL_FLASH_ERROR_PGS -#define FLASH_ERROR_MIS HAL_FLASH_ERROR_MIS -#define FLASH_ERROR_FAST HAL_FLASH_ERROR_FAST -#define FLASH_ERROR_FWWERR HAL_FLASH_ERROR_FWWERR -#define FLASH_ERROR_NOTZERO HAL_FLASH_ERROR_NOTZERO -#define FLASH_ERROR_OPERATION HAL_FLASH_ERROR_OPERATION -#define FLASH_ERROR_ERS HAL_FLASH_ERROR_ERS -#define OB_WDG_SW OB_IWDG_SW -#define OB_WDG_HW OB_IWDG_HW -#define OB_SDADC12_VDD_MONITOR_SET OB_SDACD_VDD_MONITOR_SET -#define OB_SDADC12_VDD_MONITOR_RESET OB_SDACD_VDD_MONITOR_RESET -#define OB_RAM_PARITY_CHECK_SET OB_SRAM_PARITY_SET -#define OB_RAM_PARITY_CHECK_RESET OB_SRAM_PARITY_RESET -#define IS_OB_SDADC12_VDD_MONITOR IS_OB_SDACD_VDD_MONITOR -#define OB_RDP_LEVEL0 OB_RDP_LEVEL_0 -#define OB_RDP_LEVEL1 OB_RDP_LEVEL_1 -#define OB_RDP_LEVEL2 OB_RDP_LEVEL_2 -#if defined(STM32G0) || defined(STM32C0) -#define OB_BOOT_LOCK_DISABLE OB_BOOT_ENTRY_FORCED_NONE -#define OB_BOOT_LOCK_ENABLE OB_BOOT_ENTRY_FORCED_FLASH -#else -#define OB_BOOT_ENTRY_FORCED_NONE OB_BOOT_LOCK_DISABLE -#define OB_BOOT_ENTRY_FORCED_FLASH OB_BOOT_LOCK_ENABLE -#endif -#if defined(STM32H7) -#define FLASH_FLAG_SNECCE_BANK1RR FLASH_FLAG_SNECCERR_BANK1 -#define FLASH_FLAG_DBECCE_BANK1RR FLASH_FLAG_DBECCERR_BANK1 -#define FLASH_FLAG_STRBER_BANK1R FLASH_FLAG_STRBERR_BANK1 -#define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2 -#define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2 -#define FLASH_FLAG_STRBER_BANK2R FLASH_FLAG_STRBERR_BANK2 -#define FLASH_FLAG_WDW FLASH_FLAG_WBNE -#define OB_WRP_SECTOR_All OB_WRP_SECTOR_ALL -#endif /* STM32H7 */ -#if defined(STM32U5) -#define OB_USER_nRST_STOP OB_USER_NRST_STOP -#define OB_USER_nRST_STDBY OB_USER_NRST_STDBY -#define OB_USER_nRST_SHDW OB_USER_NRST_SHDW -#define OB_USER_nSWBOOT0 OB_USER_NSWBOOT0 -#define OB_USER_nBOOT0 OB_USER_NBOOT0 -#define OB_nBOOT0_RESET OB_NBOOT0_RESET -#define OB_nBOOT0_SET OB_NBOOT0_SET -#define OB_USER_SRAM134_RST OB_USER_SRAM_RST -#define OB_SRAM134_RST_ERASE OB_SRAM_RST_ERASE -#define OB_SRAM134_RST_NOT_ERASE OB_SRAM_RST_NOT_ERASE -#endif /* STM32U5 */ -#if defined(STM32U0) -#define OB_USER_nRST_STOP OB_USER_NRST_STOP -#define OB_USER_nRST_STDBY OB_USER_NRST_STDBY -#define OB_USER_nRST_SHDW OB_USER_NRST_SHDW -#define OB_USER_nBOOT_SEL OB_USER_NBOOT_SEL -#define OB_USER_nBOOT0 OB_USER_NBOOT0 -#define OB_USER_nBOOT1 OB_USER_NBOOT1 -#define OB_nBOOT0_RESET OB_NBOOT0_RESET -#define OB_nBOOT0_SET OB_NBOOT0_SET -#endif /* STM32U0 */ - -/** - * @} - */ - -/** @defgroup HAL_JPEG_Aliased_Macros HAL JPEG Aliased Macros maintained for legacy purpose - * @{ - */ - -#if defined(STM32H7) -#define __HAL_RCC_JPEG_CLK_ENABLE __HAL_RCC_JPGDECEN_CLK_ENABLE -#define __HAL_RCC_JPEG_CLK_DISABLE __HAL_RCC_JPGDECEN_CLK_DISABLE -#define __HAL_RCC_JPEG_FORCE_RESET __HAL_RCC_JPGDECRST_FORCE_RESET -#define __HAL_RCC_JPEG_RELEASE_RESET __HAL_RCC_JPGDECRST_RELEASE_RESET -#define __HAL_RCC_JPEG_CLK_SLEEP_ENABLE __HAL_RCC_JPGDEC_CLK_SLEEP_ENABLE -#define __HAL_RCC_JPEG_CLK_SLEEP_DISABLE __HAL_RCC_JPGDEC_CLK_SLEEP_DISABLE -#endif /* STM32H7 */ - -/** - * @} - */ - -/** @defgroup HAL_SYSCFG_Aliased_Defines HAL SYSCFG Aliased Defines maintained for legacy purpose - * @{ - */ - -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PA9 I2C_FASTMODEPLUS_PA9 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PA10 I2C_FASTMODEPLUS_PA10 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB6 I2C_FASTMODEPLUS_PB6 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB7 I2C_FASTMODEPLUS_PB7 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB8 I2C_FASTMODEPLUS_PB8 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB9 I2C_FASTMODEPLUS_PB9 -#define HAL_SYSCFG_FASTMODEPLUS_I2C1 I2C_FASTMODEPLUS_I2C1 -#define HAL_SYSCFG_FASTMODEPLUS_I2C2 I2C_FASTMODEPLUS_I2C2 -#define HAL_SYSCFG_FASTMODEPLUS_I2C3 I2C_FASTMODEPLUS_I2C3 -#if defined(STM32G4) - -#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOSwitchBooster -#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOSwitchBooster -#define HAL_SYSCFG_EnableIOAnalogSwitchVDD HAL_SYSCFG_EnableIOSwitchVDD -#define HAL_SYSCFG_DisableIOAnalogSwitchVDD HAL_SYSCFG_DisableIOSwitchVDD -#endif /* STM32G4 */ - -#if defined(STM32H5) -#define SYSCFG_IT_FPU_IOC SBS_IT_FPU_IOC -#define SYSCFG_IT_FPU_DZC SBS_IT_FPU_DZC -#define SYSCFG_IT_FPU_UFC SBS_IT_FPU_UFC -#define SYSCFG_IT_FPU_OFC SBS_IT_FPU_OFC -#define SYSCFG_IT_FPU_IDC SBS_IT_FPU_IDC -#define SYSCFG_IT_FPU_IXC SBS_IT_FPU_IXC - -#define SYSCFG_BREAK_FLASH_ECC SBS_BREAK_FLASH_ECC -#define SYSCFG_BREAK_PVD SBS_BREAK_PVD -#define SYSCFG_BREAK_SRAM_ECC SBS_BREAK_SRAM_ECC -#define SYSCFG_BREAK_LOCKUP SBS_BREAK_LOCKUP - -#define SYSCFG_VREFBUF_VOLTAGE_SCALE0 VREFBUF_VOLTAGE_SCALE0 -#define SYSCFG_VREFBUF_VOLTAGE_SCALE1 VREFBUF_VOLTAGE_SCALE1 -#define SYSCFG_VREFBUF_VOLTAGE_SCALE2 VREFBUF_VOLTAGE_SCALE2 -#define SYSCFG_VREFBUF_VOLTAGE_SCALE3 VREFBUF_VOLTAGE_SCALE3 - -#define SYSCFG_VREFBUF_HIGH_IMPEDANCE_DISABLE VREFBUF_HIGH_IMPEDANCE_DISABLE -#define SYSCFG_VREFBUF_HIGH_IMPEDANCE_ENABLE VREFBUF_HIGH_IMPEDANCE_ENABLE - -#define SYSCFG_FASTMODEPLUS_PB6 SBS_FASTMODEPLUS_PB6 -#define SYSCFG_FASTMODEPLUS_PB7 SBS_FASTMODEPLUS_PB7 -#define SYSCFG_FASTMODEPLUS_PB8 SBS_FASTMODEPLUS_PB8 -#define SYSCFG_FASTMODEPLUS_PB9 SBS_FASTMODEPLUS_PB9 - -#define SYSCFG_ETH_MII SBS_ETH_MII -#define SYSCFG_ETH_RMII SBS_ETH_RMII -#define IS_SYSCFG_ETHERNET_CONFIG IS_SBS_ETHERNET_CONFIG - -#define SYSCFG_MEMORIES_ERASE_FLAG_IPMEE SBS_MEMORIES_ERASE_FLAG_IPMEE -#define SYSCFG_MEMORIES_ERASE_FLAG_MCLR SBS_MEMORIES_ERASE_FLAG_MCLR -#define IS_SYSCFG_MEMORIES_ERASE_FLAG IS_SBS_MEMORIES_ERASE_FLAG - -#define IS_SYSCFG_CODE_CONFIG IS_SBS_CODE_CONFIG - -#define SYSCFG_MPU_NSEC SBS_MPU_NSEC -#define SYSCFG_VTOR_NSEC SBS_VTOR_NSEC -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#define SYSCFG_SAU SBS_SAU -#define SYSCFG_MPU_SEC SBS_MPU_SEC -#define SYSCFG_VTOR_AIRCR_SEC SBS_VTOR_AIRCR_SEC -#define SYSCFG_LOCK_ALL SBS_LOCK_ALL -#else -#define SYSCFG_LOCK_ALL SBS_LOCK_ALL -#endif /* __ARM_FEATURE_CMSE */ - -#define SYSCFG_CLK SBS_CLK -#define SYSCFG_CLASSB SBS_CLASSB -#define SYSCFG_FPU SBS_FPU -#define SYSCFG_ALL SBS_ALL - -#define SYSCFG_SEC SBS_SEC -#define SYSCFG_NSEC SBS_NSEC - -#define __HAL_SYSCFG_FPU_INTERRUPT_ENABLE __HAL_SBS_FPU_INTERRUPT_ENABLE -#define __HAL_SYSCFG_FPU_INTERRUPT_DISABLE __HAL_SBS_FPU_INTERRUPT_DISABLE - -#define __HAL_SYSCFG_BREAK_ECC_LOCK __HAL_SBS_BREAK_ECC_LOCK -#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK __HAL_SBS_BREAK_LOCKUP_LOCK -#define __HAL_SYSCFG_BREAK_PVD_LOCK __HAL_SBS_BREAK_PVD_LOCK -#define __HAL_SYSCFG_BREAK_SRAM_ECC_LOCK __HAL_SBS_BREAK_SRAM_ECC_LOCK - -#define __HAL_SYSCFG_FASTMODEPLUS_ENABLE __HAL_SBS_FASTMODEPLUS_ENABLE -#define __HAL_SYSCFG_FASTMODEPLUS_DISABLE __HAL_SBS_FASTMODEPLUS_DISABLE - -#define __HAL_SYSCFG_GET_MEMORIES_ERASE_STATUS __HAL_SBS_GET_MEMORIES_ERASE_STATUS -#define __HAL_SYSCFG_CLEAR_MEMORIES_ERASE_STATUS __HAL_SBS_CLEAR_MEMORIES_ERASE_STATUS - -#define IS_SYSCFG_FPU_INTERRUPT IS_SBS_FPU_INTERRUPT -#define IS_SYSCFG_BREAK_CONFIG IS_SBS_BREAK_CONFIG -#define IS_SYSCFG_VREFBUF_VOLTAGE_SCALE IS_VREFBUF_VOLTAGE_SCALE -#define IS_SYSCFG_VREFBUF_HIGH_IMPEDANCE IS_VREFBUF_HIGH_IMPEDANCE -#define IS_SYSCFG_VREFBUF_TRIMMING IS_VREFBUF_TRIMMING -#define IS_SYSCFG_FASTMODEPLUS IS_SBS_FASTMODEPLUS -#define IS_SYSCFG_ITEMS_ATTRIBUTES IS_SBS_ITEMS_ATTRIBUTES -#define IS_SYSCFG_ATTRIBUTES IS_SBS_ATTRIBUTES -#define IS_SYSCFG_LOCK_ITEMS IS_SBS_LOCK_ITEMS - -#define HAL_SYSCFG_VREFBUF_VoltageScalingConfig HAL_VREFBUF_VoltageScalingConfig -#define HAL_SYSCFG_VREFBUF_HighImpedanceConfig HAL_VREFBUF_HighImpedanceConfig -#define HAL_SYSCFG_VREFBUF_TrimmingConfig HAL_VREFBUF_TrimmingConfig -#define HAL_SYSCFG_EnableVREFBUF HAL_EnableVREFBUF -#define HAL_SYSCFG_DisableVREFBUF HAL_DisableVREFBUF - -#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SBS_EnableIOAnalogSwitchBooster -#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SBS_DisableIOAnalogSwitchBooster -#define HAL_SYSCFG_ETHInterfaceSelect HAL_SBS_ETHInterfaceSelect - -#define HAL_SYSCFG_Lock HAL_SBS_Lock -#define HAL_SYSCFG_GetLock HAL_SBS_GetLock - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#define HAL_SYSCFG_ConfigAttributes HAL_SBS_ConfigAttributes -#define HAL_SYSCFG_GetConfigAttributes HAL_SBS_GetConfigAttributes -#endif /* __ARM_FEATURE_CMSE */ - -#endif /* STM32H5 */ - - -/** - * @} - */ - - -/** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose - * @{ - */ -#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) -#define FMC_NAND_PCC_WAIT_FEATURE_DISABLE FMC_NAND_WAIT_FEATURE_DISABLE -#define FMC_NAND_PCC_WAIT_FEATURE_ENABLE FMC_NAND_WAIT_FEATURE_ENABLE -#define FMC_NAND_PCC_MEM_BUS_WIDTH_8 FMC_NAND_MEM_BUS_WIDTH_8 -#define FMC_NAND_PCC_MEM_BUS_WIDTH_16 FMC_NAND_MEM_BUS_WIDTH_16 -#elif defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) -#define FMC_NAND_WAIT_FEATURE_DISABLE FMC_NAND_PCC_WAIT_FEATURE_DISABLE -#define FMC_NAND_WAIT_FEATURE_ENABLE FMC_NAND_PCC_WAIT_FEATURE_ENABLE -#define FMC_NAND_MEM_BUS_WIDTH_8 FMC_NAND_PCC_MEM_BUS_WIDTH_8 -#define FMC_NAND_MEM_BUS_WIDTH_16 FMC_NAND_PCC_MEM_BUS_WIDTH_16 -#endif -/** - * @} - */ - -/** @defgroup LL_FSMC_Aliased_Defines LL FSMC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define FSMC_NORSRAM_TYPEDEF FSMC_NORSRAM_TypeDef -#define FSMC_NORSRAM_EXTENDED_TYPEDEF FSMC_NORSRAM_EXTENDED_TypeDef -/** - * @} - */ - -/** @defgroup HAL_GPIO_Aliased_Macros HAL GPIO Aliased Macros maintained for legacy purpose - * @{ - */ -#define GET_GPIO_SOURCE GPIO_GET_INDEX -#define GET_GPIO_INDEX GPIO_GET_INDEX - -#if defined(STM32F4) -#define GPIO_AF12_SDMMC GPIO_AF12_SDIO -#define GPIO_AF12_SDMMC1 GPIO_AF12_SDIO -#endif - -#if defined(STM32F7) -#define GPIO_AF12_SDIO GPIO_AF12_SDMMC1 -#define GPIO_AF12_SDMMC GPIO_AF12_SDMMC1 -#endif - -#if defined(STM32L4) -#define GPIO_AF12_SDIO GPIO_AF12_SDMMC1 -#define GPIO_AF12_SDMMC GPIO_AF12_SDMMC1 -#endif - -#if defined(STM32H7) -#define GPIO_AF7_SDIO1 GPIO_AF7_SDMMC1 -#define GPIO_AF8_SDIO1 GPIO_AF8_SDMMC1 -#define GPIO_AF12_SDIO1 GPIO_AF12_SDMMC1 -#define GPIO_AF9_SDIO2 GPIO_AF9_SDMMC2 -#define GPIO_AF10_SDIO2 GPIO_AF10_SDMMC2 -#define GPIO_AF11_SDIO2 GPIO_AF11_SDMMC2 - -#if defined (STM32H743xx) || defined (STM32H753xx) || defined (STM32H750xx) || defined (STM32H742xx) || \ - defined (STM32H745xx) || defined (STM32H755xx) || defined (STM32H747xx) || defined (STM32H757xx) -#define GPIO_AF10_OTG2_HS GPIO_AF10_OTG2_FS -#define GPIO_AF10_OTG1_FS GPIO_AF10_OTG1_HS -#define GPIO_AF12_OTG2_FS GPIO_AF12_OTG1_FS -#endif /*STM32H743xx || STM32H753xx || STM32H750xx || STM32H742xx || STM32H745xx || STM32H755xx || STM32H747xx || \ - STM32H757xx */ -#endif /* STM32H7 */ - -#define GPIO_AF0_LPTIM GPIO_AF0_LPTIM1 -#define GPIO_AF1_LPTIM GPIO_AF1_LPTIM1 -#define GPIO_AF2_LPTIM GPIO_AF2_LPTIM1 - -#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || \ - defined(STM32G4) || defined(STM32H7) || defined(STM32WB) || defined(STM32U5) -#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW -#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM -#define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH -#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7 || STM32WB || STM32U5*/ - -#if defined(STM32L1) -#define GPIO_SPEED_VERY_LOW GPIO_SPEED_FREQ_LOW -#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_MEDIUM -#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_HIGH -#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L1 */ - -#if defined(STM32F0) || defined(STM32F3) || defined(STM32F1) -#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW -#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM -#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_HIGH -#endif /* STM32F0 || STM32F3 || STM32F1 */ - -#define GPIO_AF6_DFSDM GPIO_AF6_DFSDM1 - -#if defined(STM32U5) || defined(STM32H5) -#define GPIO_AF0_RTC_50Hz GPIO_AF0_RTC_50HZ -#endif /* STM32U5 || STM32H5 */ -#if defined(STM32U5) -#define GPIO_AF0_S2DSTOP GPIO_AF0_SRDSTOP -#define GPIO_AF11_LPGPIO GPIO_AF11_LPGPIO1 -#endif /* STM32U5 */ -/** - * @} - */ - -/** @defgroup HAL_GTZC_Aliased_Defines HAL GTZC Aliased Defines maintained for legacy purpose - * @{ - */ -#if defined(STM32U5) -#define GTZC_PERIPH_DCMI GTZC_PERIPH_DCMI_PSSI -#define GTZC_PERIPH_LTDC GTZC_PERIPH_LTDCUSB -#endif /* STM32U5 */ -#if defined(STM32H5) -#define GTZC_PERIPH_DAC12 GTZC_PERIPH_DAC1 -#define GTZC_PERIPH_ADC12 GTZC_PERIPH_ADC -#define GTZC_PERIPH_USBFS GTZC_PERIPH_USB -#endif /* STM32H5 */ -#if defined(STM32H5) || defined(STM32U5) -#define GTZC_MCPBB_NB_VCTR_REG_MAX GTZC_MPCBB_NB_VCTR_REG_MAX -#define GTZC_MCPBB_NB_LCK_VCTR_REG_MAX GTZC_MPCBB_NB_LCK_VCTR_REG_MAX -#define GTZC_MCPBB_SUPERBLOCK_UNLOCKED GTZC_MPCBB_SUPERBLOCK_UNLOCKED -#define GTZC_MCPBB_SUPERBLOCK_LOCKED GTZC_MPCBB_SUPERBLOCK_LOCKED -#define GTZC_MCPBB_BLOCK_NSEC GTZC_MPCBB_BLOCK_NSEC -#define GTZC_MCPBB_BLOCK_SEC GTZC_MPCBB_BLOCK_SEC -#define GTZC_MCPBB_BLOCK_NPRIV GTZC_MPCBB_BLOCK_NPRIV -#define GTZC_MCPBB_BLOCK_PRIV GTZC_MPCBB_BLOCK_PRIV -#define GTZC_MCPBB_LOCK_OFF GTZC_MPCBB_LOCK_OFF -#define GTZC_MCPBB_LOCK_ON GTZC_MPCBB_LOCK_ON -#endif /* STM32H5 || STM32U5 */ -/** - * @} - */ - -/** @defgroup HAL_HRTIM_Aliased_Macros HAL HRTIM Aliased Macros maintained for legacy purpose - * @{ - */ -#define HRTIM_TIMDELAYEDPROTECTION_DISABLED HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT1_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT1_EEV6 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT2_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT2_EEV6 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDBOTH_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDBOTH_EEV6 -#define HRTIM_TIMDELAYEDPROTECTION_BALANCED_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_BALANCED_EEV6 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT1_DEEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT1_DEEV7 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT2_DEEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT2_DEEV7 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDBOTH_EEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDBOTH_EEV7 -#define HRTIM_TIMDELAYEDPROTECTION_BALANCED_EEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_BALANCED_EEV7 - -#define __HAL_HRTIM_SetCounter __HAL_HRTIM_SETCOUNTER -#define __HAL_HRTIM_GetCounter __HAL_HRTIM_GETCOUNTER -#define __HAL_HRTIM_SetPeriod __HAL_HRTIM_SETPERIOD -#define __HAL_HRTIM_GetPeriod __HAL_HRTIM_GETPERIOD -#define __HAL_HRTIM_SetClockPrescaler __HAL_HRTIM_SETCLOCKPRESCALER -#define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER -#define __HAL_HRTIM_SetCompare __HAL_HRTIM_SETCOMPARE -#define __HAL_HRTIM_GetCompare __HAL_HRTIM_GETCOMPARE - -#if defined(STM32G4) -#define HAL_HRTIM_ExternalEventCounterConfig HAL_HRTIM_ExtEventCounterConfig -#define HAL_HRTIM_ExternalEventCounterEnable HAL_HRTIM_ExtEventCounterEnable -#define HAL_HRTIM_ExternalEventCounterDisable HAL_HRTIM_ExtEventCounterDisable -#define HAL_HRTIM_ExternalEventCounterReset HAL_HRTIM_ExtEventCounterReset -#define HRTIM_TIMEEVENT_A HRTIM_EVENTCOUNTER_A -#define HRTIM_TIMEEVENT_B HRTIM_EVENTCOUNTER_B -#define HRTIM_TIMEEVENTRESETMODE_UNCONDITIONAL HRTIM_EVENTCOUNTER_RSTMODE_UNCONDITIONAL -#define HRTIM_TIMEEVENTRESETMODE_CONDITIONAL HRTIM_EVENTCOUNTER_RSTMODE_CONDITIONAL -#endif /* STM32G4 */ - -#if defined(STM32H7) -#define HRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 - -#define HRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 -#endif /* STM32H7 */ - -#if defined(STM32F3) -/** @brief Constants defining available sources associated to external events. - */ -#define HRTIM_EVENTSRC_1 (0x00000000U) -#define HRTIM_EVENTSRC_2 (HRTIM_EECR1_EE1SRC_0) -#define HRTIM_EVENTSRC_3 (HRTIM_EECR1_EE1SRC_1) -#define HRTIM_EVENTSRC_4 (HRTIM_EECR1_EE1SRC_1 | HRTIM_EECR1_EE1SRC_0) - -/** @brief Constants defining the DLL calibration periods (in micro seconds) - */ -#define HRTIM_CALIBRATIONRATE_7300 0x00000000U -#define HRTIM_CALIBRATIONRATE_910 (HRTIM_DLLCR_CALRTE_0) -#define HRTIM_CALIBRATIONRATE_114 (HRTIM_DLLCR_CALRTE_1) -#define HRTIM_CALIBRATIONRATE_14 (HRTIM_DLLCR_CALRTE_1 | HRTIM_DLLCR_CALRTE_0) - -#endif /* STM32F3 */ -/** - * @} - */ - -/** @defgroup HAL_I2C_Aliased_Defines HAL I2C Aliased Defines maintained for legacy purpose - * @{ - */ -#define I2C_DUALADDRESS_DISABLED I2C_DUALADDRESS_DISABLE -#define I2C_DUALADDRESS_ENABLED I2C_DUALADDRESS_ENABLE -#define I2C_GENERALCALL_DISABLED I2C_GENERALCALL_DISABLE -#define I2C_GENERALCALL_ENABLED I2C_GENERALCALL_ENABLE -#define I2C_NOSTRETCH_DISABLED I2C_NOSTRETCH_DISABLE -#define I2C_NOSTRETCH_ENABLED I2C_NOSTRETCH_ENABLE -#define I2C_ANALOGFILTER_ENABLED I2C_ANALOGFILTER_ENABLE -#define I2C_ANALOGFILTER_DISABLED I2C_ANALOGFILTER_DISABLE -#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32G0) || defined(STM32L4) || \ - defined(STM32L1) || defined(STM32F7) -#define HAL_I2C_STATE_MEM_BUSY_TX HAL_I2C_STATE_BUSY_TX -#define HAL_I2C_STATE_MEM_BUSY_RX HAL_I2C_STATE_BUSY_RX -#define HAL_I2C_STATE_MASTER_BUSY_TX HAL_I2C_STATE_BUSY_TX -#define HAL_I2C_STATE_MASTER_BUSY_RX HAL_I2C_STATE_BUSY_RX -#define HAL_I2C_STATE_SLAVE_BUSY_TX HAL_I2C_STATE_BUSY_TX -#define HAL_I2C_STATE_SLAVE_BUSY_RX HAL_I2C_STATE_BUSY_RX -#endif -/** - * @} - */ - -/** @defgroup HAL_IRDA_Aliased_Defines HAL IRDA Aliased Defines maintained for legacy purpose - * @{ - */ -#define IRDA_ONE_BIT_SAMPLE_DISABLED IRDA_ONE_BIT_SAMPLE_DISABLE -#define IRDA_ONE_BIT_SAMPLE_ENABLED IRDA_ONE_BIT_SAMPLE_ENABLE - -/** - * @} - */ - -/** @defgroup HAL_IWDG_Aliased_Defines HAL IWDG Aliased Defines maintained for legacy purpose - * @{ - */ -#define KR_KEY_RELOAD IWDG_KEY_RELOAD -#define KR_KEY_ENABLE IWDG_KEY_ENABLE -#define KR_KEY_EWA IWDG_KEY_WRITE_ACCESS_ENABLE -#define KR_KEY_DWA IWDG_KEY_WRITE_ACCESS_DISABLE -/** - * @} - */ - -/** @defgroup HAL_LPTIM_Aliased_Defines HAL LPTIM Aliased Defines maintained for legacy purpose - * @{ - */ - -#define LPTIM_CLOCKSAMPLETIME_DIRECTTRANSISTION LPTIM_CLOCKSAMPLETIME_DIRECTTRANSITION -#define LPTIM_CLOCKSAMPLETIME_2TRANSISTIONS LPTIM_CLOCKSAMPLETIME_2TRANSITIONS -#define LPTIM_CLOCKSAMPLETIME_4TRANSISTIONS LPTIM_CLOCKSAMPLETIME_4TRANSITIONS -#define LPTIM_CLOCKSAMPLETIME_8TRANSISTIONS LPTIM_CLOCKSAMPLETIME_8TRANSITIONS - -#define LPTIM_CLOCKPOLARITY_RISINGEDGE LPTIM_CLOCKPOLARITY_RISING -#define LPTIM_CLOCKPOLARITY_FALLINGEDGE LPTIM_CLOCKPOLARITY_FALLING -#define LPTIM_CLOCKPOLARITY_BOTHEDGES LPTIM_CLOCKPOLARITY_RISING_FALLING - -#define LPTIM_TRIGSAMPLETIME_DIRECTTRANSISTION LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION -#define LPTIM_TRIGSAMPLETIME_2TRANSISTIONS LPTIM_TRIGSAMPLETIME_2TRANSITIONS -#define LPTIM_TRIGSAMPLETIME_4TRANSISTIONS LPTIM_TRIGSAMPLETIME_4TRANSITIONS -#define LPTIM_TRIGSAMPLETIME_8TRANSISTIONS LPTIM_TRIGSAMPLETIME_8TRANSITIONS - -/* The following 3 definition have also been present in a temporary version of lptim.h */ -/* They need to be renamed also to the right name, just in case */ -#define LPTIM_TRIGSAMPLETIME_2TRANSITION LPTIM_TRIGSAMPLETIME_2TRANSITIONS -#define LPTIM_TRIGSAMPLETIME_4TRANSITION LPTIM_TRIGSAMPLETIME_4TRANSITIONS -#define LPTIM_TRIGSAMPLETIME_8TRANSITION LPTIM_TRIGSAMPLETIME_8TRANSITIONS - - -/** @defgroup HAL_LPTIM_Aliased_Defines HAL LPTIM Aliased Defines maintained for legacy purpose - * @{ - */ -#define HAL_LPTIM_ReadCompare HAL_LPTIM_ReadCapturedValue -/** - * @} - */ - -#if defined(STM32U5) -#define LPTIM_ISR_CC1 LPTIM_ISR_CC1IF -#define LPTIM_ISR_CC2 LPTIM_ISR_CC2IF -#define LPTIM_CHANNEL_ALL 0x00000000U -#endif /* STM32U5 */ -/** - * @} - */ - -/** @defgroup HAL_NAND_Aliased_Defines HAL NAND Aliased Defines maintained for legacy purpose - * @{ - */ -#define HAL_NAND_Read_Page HAL_NAND_Read_Page_8b -#define HAL_NAND_Write_Page HAL_NAND_Write_Page_8b -#define HAL_NAND_Read_SpareArea HAL_NAND_Read_SpareArea_8b -#define HAL_NAND_Write_SpareArea HAL_NAND_Write_SpareArea_8b - -#define NAND_AddressTypedef NAND_AddressTypeDef - -#define __ARRAY_ADDRESS ARRAY_ADDRESS -#define __ADDR_1st_CYCLE ADDR_1ST_CYCLE -#define __ADDR_2nd_CYCLE ADDR_2ND_CYCLE -#define __ADDR_3rd_CYCLE ADDR_3RD_CYCLE -#define __ADDR_4th_CYCLE ADDR_4TH_CYCLE -/** - * @} - */ - -/** @defgroup HAL_NOR_Aliased_Defines HAL NOR Aliased Defines maintained for legacy purpose - * @{ - */ -#define NOR_StatusTypedef HAL_NOR_StatusTypeDef -#define NOR_SUCCESS HAL_NOR_STATUS_SUCCESS -#define NOR_ONGOING HAL_NOR_STATUS_ONGOING -#define NOR_ERROR HAL_NOR_STATUS_ERROR -#define NOR_TIMEOUT HAL_NOR_STATUS_TIMEOUT - -#define __NOR_WRITE NOR_WRITE -#define __NOR_ADDR_SHIFT NOR_ADDR_SHIFT -/** - * @} - */ - -/** @defgroup HAL_OPAMP_Aliased_Defines HAL OPAMP Aliased Defines maintained for legacy purpose - * @{ - */ - -#define OPAMP_NONINVERTINGINPUT_VP0 OPAMP_NONINVERTINGINPUT_IO0 -#define OPAMP_NONINVERTINGINPUT_VP1 OPAMP_NONINVERTINGINPUT_IO1 -#define OPAMP_NONINVERTINGINPUT_VP2 OPAMP_NONINVERTINGINPUT_IO2 -#define OPAMP_NONINVERTINGINPUT_VP3 OPAMP_NONINVERTINGINPUT_IO3 - -#define OPAMP_SEC_NONINVERTINGINPUT_VP0 OPAMP_SEC_NONINVERTINGINPUT_IO0 -#define OPAMP_SEC_NONINVERTINGINPUT_VP1 OPAMP_SEC_NONINVERTINGINPUT_IO1 -#define OPAMP_SEC_NONINVERTINGINPUT_VP2 OPAMP_SEC_NONINVERTINGINPUT_IO2 -#define OPAMP_SEC_NONINVERTINGINPUT_VP3 OPAMP_SEC_NONINVERTINGINPUT_IO3 - -#define OPAMP_INVERTINGINPUT_VM0 OPAMP_INVERTINGINPUT_IO0 -#define OPAMP_INVERTINGINPUT_VM1 OPAMP_INVERTINGINPUT_IO1 - -#define IOPAMP_INVERTINGINPUT_VM0 OPAMP_INVERTINGINPUT_IO0 -#define IOPAMP_INVERTINGINPUT_VM1 OPAMP_INVERTINGINPUT_IO1 - -#define OPAMP_SEC_INVERTINGINPUT_VM0 OPAMP_SEC_INVERTINGINPUT_IO0 -#define OPAMP_SEC_INVERTINGINPUT_VM1 OPAMP_SEC_INVERTINGINPUT_IO1 - -#define OPAMP_INVERTINGINPUT_VINM OPAMP_SEC_INVERTINGINPUT_IO1 - -#define OPAMP_PGACONNECT_NO OPAMP_PGA_CONNECT_INVERTINGINPUT_NO -#define OPAMP_PGACONNECT_VM0 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0 -#define OPAMP_PGACONNECT_VM1 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1 - -#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5) || defined(STM32H7) || defined(STM32G4) || defined(STM32U5) -#define HAL_OPAMP_MSP_INIT_CB_ID HAL_OPAMP_MSPINIT_CB_ID -#define HAL_OPAMP_MSP_DEINIT_CB_ID HAL_OPAMP_MSPDEINIT_CB_ID -#endif - -#if defined(STM32L4) || defined(STM32L5) -#define OPAMP_POWERMODE_NORMAL OPAMP_POWERMODE_NORMALPOWER -#elif defined(STM32G4) -#define OPAMP_POWERMODE_NORMAL OPAMP_POWERMODE_NORMALSPEED -#endif - -/** - * @} - */ - -/** @defgroup HAL_I2S_Aliased_Defines HAL I2S Aliased Defines maintained for legacy purpose - * @{ - */ -#define I2S_STANDARD_PHILLIPS I2S_STANDARD_PHILIPS - -#if defined(STM32H7) -#define I2S_IT_TXE I2S_IT_TXP -#define I2S_IT_RXNE I2S_IT_RXP - -#define I2S_FLAG_TXE I2S_FLAG_TXP -#define I2S_FLAG_RXNE I2S_FLAG_RXP -#endif - -#if defined(STM32F7) -#define I2S_CLOCK_SYSCLK I2S_CLOCK_PLL -#endif -/** - * @} - */ - -/** @defgroup HAL_PCCARD_Aliased_Defines HAL PCCARD Aliased Defines maintained for legacy purpose - * @{ - */ - -/* Compact Flash-ATA registers description */ -#define CF_DATA ATA_DATA -#define CF_SECTOR_COUNT ATA_SECTOR_COUNT -#define CF_SECTOR_NUMBER ATA_SECTOR_NUMBER -#define CF_CYLINDER_LOW ATA_CYLINDER_LOW -#define CF_CYLINDER_HIGH ATA_CYLINDER_HIGH -#define CF_CARD_HEAD ATA_CARD_HEAD -#define CF_STATUS_CMD ATA_STATUS_CMD -#define CF_STATUS_CMD_ALTERNATE ATA_STATUS_CMD_ALTERNATE -#define CF_COMMON_DATA_AREA ATA_COMMON_DATA_AREA - -/* Compact Flash-ATA commands */ -#define CF_READ_SECTOR_CMD ATA_READ_SECTOR_CMD -#define CF_WRITE_SECTOR_CMD ATA_WRITE_SECTOR_CMD -#define CF_ERASE_SECTOR_CMD ATA_ERASE_SECTOR_CMD -#define CF_IDENTIFY_CMD ATA_IDENTIFY_CMD - -#define PCCARD_StatusTypedef HAL_PCCARD_StatusTypeDef -#define PCCARD_SUCCESS HAL_PCCARD_STATUS_SUCCESS -#define PCCARD_ONGOING HAL_PCCARD_STATUS_ONGOING -#define PCCARD_ERROR HAL_PCCARD_STATUS_ERROR -#define PCCARD_TIMEOUT HAL_PCCARD_STATUS_TIMEOUT -/** - * @} - */ - -/** @defgroup HAL_RTC_Aliased_Defines HAL RTC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define FORMAT_BIN RTC_FORMAT_BIN -#define FORMAT_BCD RTC_FORMAT_BCD - -#define RTC_ALARMSUBSECONDMASK_None RTC_ALARMSUBSECONDMASK_NONE -#define RTC_TAMPERERASEBACKUP_DISABLED RTC_TAMPER_ERASE_BACKUP_DISABLE -#define RTC_TAMPERMASK_FLAG_DISABLED RTC_TAMPERMASK_FLAG_DISABLE -#define RTC_TAMPERMASK_FLAG_ENABLED RTC_TAMPERMASK_FLAG_ENABLE - -#define RTC_MASKTAMPERFLAG_DISABLED RTC_TAMPERMASK_FLAG_DISABLE -#define RTC_MASKTAMPERFLAG_ENABLED RTC_TAMPERMASK_FLAG_ENABLE -#define RTC_TAMPERERASEBACKUP_ENABLED RTC_TAMPER_ERASE_BACKUP_ENABLE -#define RTC_TAMPER1_2_INTERRUPT RTC_ALL_TAMPER_INTERRUPT -#define RTC_TAMPER1_2_3_INTERRUPT RTC_ALL_TAMPER_INTERRUPT - -#define RTC_TIMESTAMPPIN_PC13 RTC_TIMESTAMPPIN_DEFAULT -#define RTC_TIMESTAMPPIN_PA0 RTC_TIMESTAMPPIN_POS1 -#define RTC_TIMESTAMPPIN_PI8 RTC_TIMESTAMPPIN_POS1 -#define RTC_TIMESTAMPPIN_PC1 RTC_TIMESTAMPPIN_POS2 - -#define RTC_OUTPUT_REMAP_PC13 RTC_OUTPUT_REMAP_NONE -#define RTC_OUTPUT_REMAP_PB14 RTC_OUTPUT_REMAP_POS1 -#define RTC_OUTPUT_REMAP_PB2 RTC_OUTPUT_REMAP_POS1 - -#define RTC_TAMPERPIN_PC13 RTC_TAMPERPIN_DEFAULT -#define RTC_TAMPERPIN_PA0 RTC_TAMPERPIN_POS1 -#define RTC_TAMPERPIN_PI8 RTC_TAMPERPIN_POS1 - -#if defined(STM32H5) || defined(STM32H7RS) -#define TAMP_SECRETDEVICE_ERASE_NONE TAMP_DEVICESECRETS_ERASE_NONE -#define TAMP_SECRETDEVICE_ERASE_BKP_SRAM TAMP_DEVICESECRETS_ERASE_BKPSRAM -#endif /* STM32H5 || STM32H7RS */ - -#if defined(STM32WBA) -#define TAMP_SECRETDEVICE_ERASE_NONE TAMP_DEVICESECRETS_ERASE_NONE -#define TAMP_SECRETDEVICE_ERASE_SRAM2 TAMP_DEVICESECRETS_ERASE_SRAM2 -#define TAMP_SECRETDEVICE_ERASE_RHUK TAMP_DEVICESECRETS_ERASE_RHUK -#define TAMP_SECRETDEVICE_ERASE_ICACHE TAMP_DEVICESECRETS_ERASE_ICACHE -#define TAMP_SECRETDEVICE_ERASE_SAES_AES_HASH TAMP_DEVICESECRETS_ERASE_SAES_AES_HASH -#define TAMP_SECRETDEVICE_ERASE_PKA_SRAM TAMP_DEVICESECRETS_ERASE_PKA_SRAM -#define TAMP_SECRETDEVICE_ERASE_ALL TAMP_DEVICESECRETS_ERASE_ALL -#endif /* STM32WBA */ - -#if defined(STM32H5) || defined(STM32WBA) || defined(STM32H7RS) -#define TAMP_SECRETDEVICE_ERASE_DISABLE TAMP_DEVICESECRETS_ERASE_NONE -#define TAMP_SECRETDEVICE_ERASE_ENABLE TAMP_SECRETDEVICE_ERASE_ALL -#endif /* STM32H5 || STM32WBA || STM32H7RS */ - -#if defined(STM32F7) -#define RTC_TAMPCR_TAMPXE RTC_TAMPER_ENABLE_BITS_MASK -#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_IT_ENABLE_BITS_MASK -#endif /* STM32F7 */ - -#if defined(STM32H7) -#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X -#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT -#endif /* STM32H7 */ - -#if defined(STM32F7) || defined(STM32H7) || defined(STM32L0) -#define RTC_TAMPER1_INTERRUPT RTC_IT_TAMP1 -#define RTC_TAMPER2_INTERRUPT RTC_IT_TAMP2 -#define RTC_TAMPER3_INTERRUPT RTC_IT_TAMP3 -#define RTC_ALL_TAMPER_INTERRUPT RTC_IT_TAMP -#endif /* STM32F7 || STM32H7 || STM32L0 */ - -/** - * @} - */ - - -/** @defgroup HAL_SMARTCARD_Aliased_Defines HAL SMARTCARD Aliased Defines maintained for legacy purpose - * @{ - */ -#define SMARTCARD_NACK_ENABLED SMARTCARD_NACK_ENABLE -#define SMARTCARD_NACK_DISABLED SMARTCARD_NACK_DISABLE - -#define SMARTCARD_ONEBIT_SAMPLING_DISABLED SMARTCARD_ONE_BIT_SAMPLE_DISABLE -#define SMARTCARD_ONEBIT_SAMPLING_ENABLED SMARTCARD_ONE_BIT_SAMPLE_ENABLE -#define SMARTCARD_ONEBIT_SAMPLING_DISABLE SMARTCARD_ONE_BIT_SAMPLE_DISABLE -#define SMARTCARD_ONEBIT_SAMPLING_ENABLE SMARTCARD_ONE_BIT_SAMPLE_ENABLE - -#define SMARTCARD_TIMEOUT_DISABLED SMARTCARD_TIMEOUT_DISABLE -#define SMARTCARD_TIMEOUT_ENABLED SMARTCARD_TIMEOUT_ENABLE - -#define SMARTCARD_LASTBIT_DISABLED SMARTCARD_LASTBIT_DISABLE -#define SMARTCARD_LASTBIT_ENABLED SMARTCARD_LASTBIT_ENABLE -/** - * @} - */ - - -/** @defgroup HAL_SMBUS_Aliased_Defines HAL SMBUS Aliased Defines maintained for legacy purpose - * @{ - */ -#define SMBUS_DUALADDRESS_DISABLED SMBUS_DUALADDRESS_DISABLE -#define SMBUS_DUALADDRESS_ENABLED SMBUS_DUALADDRESS_ENABLE -#define SMBUS_GENERALCALL_DISABLED SMBUS_GENERALCALL_DISABLE -#define SMBUS_GENERALCALL_ENABLED SMBUS_GENERALCALL_ENABLE -#define SMBUS_NOSTRETCH_DISABLED SMBUS_NOSTRETCH_DISABLE -#define SMBUS_NOSTRETCH_ENABLED SMBUS_NOSTRETCH_ENABLE -#define SMBUS_ANALOGFILTER_ENABLED SMBUS_ANALOGFILTER_ENABLE -#define SMBUS_ANALOGFILTER_DISABLED SMBUS_ANALOGFILTER_DISABLE -#define SMBUS_PEC_DISABLED SMBUS_PEC_DISABLE -#define SMBUS_PEC_ENABLED SMBUS_PEC_ENABLE -#define HAL_SMBUS_STATE_SLAVE_LISTEN HAL_SMBUS_STATE_LISTEN -/** - * @} - */ - -/** @defgroup HAL_SPI_Aliased_Defines HAL SPI Aliased Defines maintained for legacy purpose - * @{ - */ -#define SPI_TIMODE_DISABLED SPI_TIMODE_DISABLE -#define SPI_TIMODE_ENABLED SPI_TIMODE_ENABLE - -#define SPI_CRCCALCULATION_DISABLED SPI_CRCCALCULATION_DISABLE -#define SPI_CRCCALCULATION_ENABLED SPI_CRCCALCULATION_ENABLE - -#define SPI_NSS_PULSE_DISABLED SPI_NSS_PULSE_DISABLE -#define SPI_NSS_PULSE_ENABLED SPI_NSS_PULSE_ENABLE - -#if defined(STM32H7) - -#define SPI_FLAG_TXE SPI_FLAG_TXP -#define SPI_FLAG_RXNE SPI_FLAG_RXP - -#define SPI_IT_TXE SPI_IT_TXP -#define SPI_IT_RXNE SPI_IT_RXP - -#define SPI_FRLVL_EMPTY SPI_RX_FIFO_0PACKET -#define SPI_FRLVL_QUARTER_FULL SPI_RX_FIFO_1PACKET -#define SPI_FRLVL_HALF_FULL SPI_RX_FIFO_2PACKET -#define SPI_FRLVL_FULL SPI_RX_FIFO_3PACKET - -#endif /* STM32H7 */ - -/** - * @} - */ - -/** @defgroup HAL_TIM_Aliased_Defines HAL TIM Aliased Defines maintained for legacy purpose - * @{ - */ -#define CCER_CCxE_MASK TIM_CCER_CCxE_MASK -#define CCER_CCxNE_MASK TIM_CCER_CCxNE_MASK - -#define TIM_DMABase_CR1 TIM_DMABASE_CR1 -#define TIM_DMABase_CR2 TIM_DMABASE_CR2 -#define TIM_DMABase_SMCR TIM_DMABASE_SMCR -#define TIM_DMABase_DIER TIM_DMABASE_DIER -#define TIM_DMABase_SR TIM_DMABASE_SR -#define TIM_DMABase_EGR TIM_DMABASE_EGR -#define TIM_DMABase_CCMR1 TIM_DMABASE_CCMR1 -#define TIM_DMABase_CCMR2 TIM_DMABASE_CCMR2 -#define TIM_DMABase_CCER TIM_DMABASE_CCER -#define TIM_DMABase_CNT TIM_DMABASE_CNT -#define TIM_DMABase_PSC TIM_DMABASE_PSC -#define TIM_DMABase_ARR TIM_DMABASE_ARR -#define TIM_DMABase_RCR TIM_DMABASE_RCR -#define TIM_DMABase_CCR1 TIM_DMABASE_CCR1 -#define TIM_DMABase_CCR2 TIM_DMABASE_CCR2 -#define TIM_DMABase_CCR3 TIM_DMABASE_CCR3 -#define TIM_DMABase_CCR4 TIM_DMABASE_CCR4 -#define TIM_DMABase_BDTR TIM_DMABASE_BDTR -#define TIM_DMABase_DCR TIM_DMABASE_DCR -#define TIM_DMABase_DMAR TIM_DMABASE_DMAR -#define TIM_DMABase_OR1 TIM_DMABASE_OR1 -#define TIM_DMABase_CCMR3 TIM_DMABASE_CCMR3 -#define TIM_DMABase_CCR5 TIM_DMABASE_CCR5 -#define TIM_DMABase_CCR6 TIM_DMABASE_CCR6 -#define TIM_DMABase_OR2 TIM_DMABASE_OR2 -#define TIM_DMABase_OR3 TIM_DMABASE_OR3 -#define TIM_DMABase_OR TIM_DMABASE_OR - -#define TIM_EventSource_Update TIM_EVENTSOURCE_UPDATE -#define TIM_EventSource_CC1 TIM_EVENTSOURCE_CC1 -#define TIM_EventSource_CC2 TIM_EVENTSOURCE_CC2 -#define TIM_EventSource_CC3 TIM_EVENTSOURCE_CC3 -#define TIM_EventSource_CC4 TIM_EVENTSOURCE_CC4 -#define TIM_EventSource_COM TIM_EVENTSOURCE_COM -#define TIM_EventSource_Trigger TIM_EVENTSOURCE_TRIGGER -#define TIM_EventSource_Break TIM_EVENTSOURCE_BREAK -#define TIM_EventSource_Break2 TIM_EVENTSOURCE_BREAK2 - -#define TIM_DMABurstLength_1Transfer TIM_DMABURSTLENGTH_1TRANSFER -#define TIM_DMABurstLength_2Transfers TIM_DMABURSTLENGTH_2TRANSFERS -#define TIM_DMABurstLength_3Transfers TIM_DMABURSTLENGTH_3TRANSFERS -#define TIM_DMABurstLength_4Transfers TIM_DMABURSTLENGTH_4TRANSFERS -#define TIM_DMABurstLength_5Transfers TIM_DMABURSTLENGTH_5TRANSFERS -#define TIM_DMABurstLength_6Transfers TIM_DMABURSTLENGTH_6TRANSFERS -#define TIM_DMABurstLength_7Transfers TIM_DMABURSTLENGTH_7TRANSFERS -#define TIM_DMABurstLength_8Transfers TIM_DMABURSTLENGTH_8TRANSFERS -#define TIM_DMABurstLength_9Transfers TIM_DMABURSTLENGTH_9TRANSFERS -#define TIM_DMABurstLength_10Transfers TIM_DMABURSTLENGTH_10TRANSFERS -#define TIM_DMABurstLength_11Transfers TIM_DMABURSTLENGTH_11TRANSFERS -#define TIM_DMABurstLength_12Transfers TIM_DMABURSTLENGTH_12TRANSFERS -#define TIM_DMABurstLength_13Transfers TIM_DMABURSTLENGTH_13TRANSFERS -#define TIM_DMABurstLength_14Transfers TIM_DMABURSTLENGTH_14TRANSFERS -#define TIM_DMABurstLength_15Transfers TIM_DMABURSTLENGTH_15TRANSFERS -#define TIM_DMABurstLength_16Transfers TIM_DMABURSTLENGTH_16TRANSFERS -#define TIM_DMABurstLength_17Transfers TIM_DMABURSTLENGTH_17TRANSFERS -#define TIM_DMABurstLength_18Transfers TIM_DMABURSTLENGTH_18TRANSFERS - -#if defined(STM32L0) -#define TIM22_TI1_GPIO1 TIM22_TI1_GPIO -#define TIM22_TI1_GPIO2 TIM22_TI1_GPIO -#endif - -#if defined(STM32F3) -#define IS_TIM_HALL_INTERFACE_INSTANCE IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE -#endif - -#if defined(STM32H7) -#define TIM_TIM1_ETR_COMP1_OUT TIM_TIM1_ETR_COMP1 -#define TIM_TIM1_ETR_COMP2_OUT TIM_TIM1_ETR_COMP2 -#define TIM_TIM8_ETR_COMP1_OUT TIM_TIM8_ETR_COMP1 -#define TIM_TIM8_ETR_COMP2_OUT TIM_TIM8_ETR_COMP2 -#define TIM_TIM2_ETR_COMP1_OUT TIM_TIM2_ETR_COMP1 -#define TIM_TIM2_ETR_COMP2_OUT TIM_TIM2_ETR_COMP2 -#define TIM_TIM3_ETR_COMP1_OUT TIM_TIM3_ETR_COMP1 -#define TIM_TIM1_TI1_COMP1_OUT TIM_TIM1_TI1_COMP1 -#define TIM_TIM8_TI1_COMP2_OUT TIM_TIM8_TI1_COMP2 -#define TIM_TIM2_TI4_COMP1_OUT TIM_TIM2_TI4_COMP1 -#define TIM_TIM2_TI4_COMP2_OUT TIM_TIM2_TI4_COMP2 -#define TIM_TIM2_TI4_COMP1COMP2_OUT TIM_TIM2_TI4_COMP1_COMP2 -#define TIM_TIM3_TI1_COMP1_OUT TIM_TIM3_TI1_COMP1 -#define TIM_TIM3_TI1_COMP2_OUT TIM_TIM3_TI1_COMP2 -#define TIM_TIM3_TI1_COMP1COMP2_OUT TIM_TIM3_TI1_COMP1_COMP2 -#endif - -#if defined(STM32U5) -#define OCREF_CLEAR_SELECT_Pos OCREF_CLEAR_SELECT_POS -#define OCREF_CLEAR_SELECT_Msk OCREF_CLEAR_SELECT_MSK -#endif -/** - * @} - */ - -/** @defgroup HAL_TSC_Aliased_Defines HAL TSC Aliased Defines maintained for legacy purpose - * @{ - */ -#define TSC_SYNC_POL_FALL TSC_SYNC_POLARITY_FALLING -#define TSC_SYNC_POL_RISE_HIGH TSC_SYNC_POLARITY_RISING -/** - * @} - */ - -/** @defgroup HAL_UART_Aliased_Defines HAL UART Aliased Defines maintained for legacy purpose - * @{ - */ -#define UART_ONEBIT_SAMPLING_DISABLED UART_ONE_BIT_SAMPLE_DISABLE -#define UART_ONEBIT_SAMPLING_ENABLED UART_ONE_BIT_SAMPLE_ENABLE -#define UART_ONE_BIT_SAMPLE_DISABLED UART_ONE_BIT_SAMPLE_DISABLE -#define UART_ONE_BIT_SAMPLE_ENABLED UART_ONE_BIT_SAMPLE_ENABLE - -#define __HAL_UART_ONEBIT_ENABLE __HAL_UART_ONE_BIT_SAMPLE_ENABLE -#define __HAL_UART_ONEBIT_DISABLE __HAL_UART_ONE_BIT_SAMPLE_DISABLE - -#define __DIV_SAMPLING16 UART_DIV_SAMPLING16 -#define __DIVMANT_SAMPLING16 UART_DIVMANT_SAMPLING16 -#define __DIVFRAQ_SAMPLING16 UART_DIVFRAQ_SAMPLING16 -#define __UART_BRR_SAMPLING16 UART_BRR_SAMPLING16 - -#define __DIV_SAMPLING8 UART_DIV_SAMPLING8 -#define __DIVMANT_SAMPLING8 UART_DIVMANT_SAMPLING8 -#define __DIVFRAQ_SAMPLING8 UART_DIVFRAQ_SAMPLING8 -#define __UART_BRR_SAMPLING8 UART_BRR_SAMPLING8 - -#define __DIV_LPUART UART_DIV_LPUART - -#define UART_WAKEUPMETHODE_IDLELINE UART_WAKEUPMETHOD_IDLELINE -#define UART_WAKEUPMETHODE_ADDRESSMARK UART_WAKEUPMETHOD_ADDRESSMARK - -/** - * @} - */ - - -/** @defgroup HAL_USART_Aliased_Defines HAL USART Aliased Defines maintained for legacy purpose - * @{ - */ - -#define USART_CLOCK_DISABLED USART_CLOCK_DISABLE -#define USART_CLOCK_ENABLED USART_CLOCK_ENABLE - -#define USARTNACK_ENABLED USART_NACK_ENABLE -#define USARTNACK_DISABLED USART_NACK_DISABLE -/** - * @} - */ - -/** @defgroup HAL_WWDG_Aliased_Defines HAL WWDG Aliased Defines maintained for legacy purpose - * @{ - */ -#define CFR_BASE WWDG_CFR_BASE - -/** - * @} - */ - -/** @defgroup HAL_CAN_Aliased_Defines HAL CAN Aliased Defines maintained for legacy purpose - * @{ - */ -#define CAN_FilterFIFO0 CAN_FILTER_FIFO0 -#define CAN_FilterFIFO1 CAN_FILTER_FIFO1 -#define CAN_IT_RQCP0 CAN_IT_TME -#define CAN_IT_RQCP1 CAN_IT_TME -#define CAN_IT_RQCP2 CAN_IT_TME -#define INAK_TIMEOUT CAN_TIMEOUT_VALUE -#define SLAK_TIMEOUT CAN_TIMEOUT_VALUE -#define CAN_TXSTATUS_FAILED ((uint8_t)0x00U) -#define CAN_TXSTATUS_OK ((uint8_t)0x01U) -#define CAN_TXSTATUS_PENDING ((uint8_t)0x02U) - -/** - * @} - */ - -/** @defgroup HAL_ETH_Aliased_Defines HAL ETH Aliased Defines maintained for legacy purpose - * @{ - */ - -#define VLAN_TAG ETH_VLAN_TAG -#define MIN_ETH_PAYLOAD ETH_MIN_ETH_PAYLOAD -#define MAX_ETH_PAYLOAD ETH_MAX_ETH_PAYLOAD -#define JUMBO_FRAME_PAYLOAD ETH_JUMBO_FRAME_PAYLOAD -#define MACMIIAR_CR_MASK ETH_MACMIIAR_CR_MASK -#define MACCR_CLEAR_MASK ETH_MACCR_CLEAR_MASK -#define MACFCR_CLEAR_MASK ETH_MACFCR_CLEAR_MASK -#define DMAOMR_CLEAR_MASK ETH_DMAOMR_CLEAR_MASK - -#define ETH_MMCCR 0x00000100U -#define ETH_MMCRIR 0x00000104U -#define ETH_MMCTIR 0x00000108U -#define ETH_MMCRIMR 0x0000010CU -#define ETH_MMCTIMR 0x00000110U -#define ETH_MMCTGFSCCR 0x0000014CU -#define ETH_MMCTGFMSCCR 0x00000150U -#define ETH_MMCTGFCR 0x00000168U -#define ETH_MMCRFCECR 0x00000194U -#define ETH_MMCRFAECR 0x00000198U -#define ETH_MMCRGUFCR 0x000001C4U - -#define ETH_MAC_TXFIFO_FULL 0x02000000U /* Tx FIFO full */ -#define ETH_MAC_TXFIFONOT_EMPTY 0x01000000U /* Tx FIFO not empty */ -#define ETH_MAC_TXFIFO_WRITE_ACTIVE 0x00400000U /* Tx FIFO write active */ -#define ETH_MAC_TXFIFO_IDLE 0x00000000U /* Tx FIFO read status: Idle */ -#define ETH_MAC_TXFIFO_READ 0x00100000U /* Tx FIFO read status: Read (transferring data to - the MAC transmitter) */ -#define ETH_MAC_TXFIFO_WAITING 0x00200000U /* Tx FIFO read status: Waiting for TxStatus from - MAC transmitter */ -#define ETH_MAC_TXFIFO_WRITING 0x00300000U /* Tx FIFO read status: Writing the received TxStatus - or flushing the TxFIFO */ -#define ETH_MAC_TRANSMISSION_PAUSE 0x00080000U /* MAC transmitter in pause */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_IDLE 0x00000000U /* MAC transmit frame controller: Idle */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_WAITING 0x00020000U /* MAC transmit frame controller: Waiting for Status - of previous frame or IFG/backoff period to be over */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_GENRATING_PCF 0x00040000U /* MAC transmit frame controller: Generating and - transmitting a Pause control frame (in full duplex mode) */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_TRANSFERRING 0x00060000U /* MAC transmit frame controller: Transferring input - frame for transmission */ -#define ETH_MAC_MII_TRANSMIT_ACTIVE 0x00010000U /* MAC MII transmit engine active */ -#define ETH_MAC_RXFIFO_EMPTY 0x00000000U /* Rx FIFO fill level: empty */ -#define ETH_MAC_RXFIFO_BELOW_THRESHOLD 0x00000100U /* Rx FIFO fill level: fill-level below flow-control - de-activate threshold */ -#define ETH_MAC_RXFIFO_ABOVE_THRESHOLD 0x00000200U /* Rx FIFO fill level: fill-level above flow-control - activate threshold */ -#define ETH_MAC_RXFIFO_FULL 0x00000300U /* Rx FIFO fill level: full */ -#if defined(STM32F1) -#else -#define ETH_MAC_READCONTROLLER_IDLE 0x00000000U /* Rx FIFO read controller IDLE state */ -#define ETH_MAC_READCONTROLLER_READING_DATA 0x00000020U /* Rx FIFO read controller Reading frame data */ -#define ETH_MAC_READCONTROLLER_READING_STATUS 0x00000040U /* Rx FIFO read controller Reading frame status - (or time-stamp) */ -#endif -#define ETH_MAC_READCONTROLLER_FLUSHING 0x00000060U /* Rx FIFO read controller Flushing the frame data and - status */ -#define ETH_MAC_RXFIFO_WRITE_ACTIVE 0x00000010U /* Rx FIFO write controller active */ -#define ETH_MAC_SMALL_FIFO_NOTACTIVE 0x00000000U /* MAC small FIFO read / write controllers not active */ -#define ETH_MAC_SMALL_FIFO_READ_ACTIVE 0x00000002U /* MAC small FIFO read controller active */ -#define ETH_MAC_SMALL_FIFO_WRITE_ACTIVE 0x00000004U /* MAC small FIFO write controller active */ -#define ETH_MAC_SMALL_FIFO_RW_ACTIVE 0x00000006U /* MAC small FIFO read / write controllers active */ -#define ETH_MAC_MII_RECEIVE_PROTOCOL_ACTIVE 0x00000001U /* MAC MII receive protocol engine active */ - -#define ETH_TxPacketConfig ETH_TxPacketConfigTypeDef /* Transmit Packet Configuration structure definition */ - -/** - * @} - */ - -/** @defgroup HAL_DCMI_Aliased_Defines HAL DCMI Aliased Defines maintained for legacy purpose - * @{ - */ -#define HAL_DCMI_ERROR_OVF HAL_DCMI_ERROR_OVR -#define DCMI_IT_OVF DCMI_IT_OVR -#define DCMI_FLAG_OVFRI DCMI_FLAG_OVRRI -#define DCMI_FLAG_OVFMI DCMI_FLAG_OVRMI - -#define HAL_DCMI_ConfigCROP HAL_DCMI_ConfigCrop -#define HAL_DCMI_EnableCROP HAL_DCMI_EnableCrop -#define HAL_DCMI_DisableCROP HAL_DCMI_DisableCrop - -/** - * @} - */ - -#if defined(STM32L4) || defined(STM32F7) || defined(STM32F427xx) || defined(STM32F437xx) \ - || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) \ - || defined(STM32H7) -/** @defgroup HAL_DMA2D_Aliased_Defines HAL DMA2D Aliased Defines maintained for legacy purpose - * @{ - */ -#define DMA2D_ARGB8888 DMA2D_OUTPUT_ARGB8888 -#define DMA2D_RGB888 DMA2D_OUTPUT_RGB888 -#define DMA2D_RGB565 DMA2D_OUTPUT_RGB565 -#define DMA2D_ARGB1555 DMA2D_OUTPUT_ARGB1555 -#define DMA2D_ARGB4444 DMA2D_OUTPUT_ARGB4444 - -#define CM_ARGB8888 DMA2D_INPUT_ARGB8888 -#define CM_RGB888 DMA2D_INPUT_RGB888 -#define CM_RGB565 DMA2D_INPUT_RGB565 -#define CM_ARGB1555 DMA2D_INPUT_ARGB1555 -#define CM_ARGB4444 DMA2D_INPUT_ARGB4444 -#define CM_L8 DMA2D_INPUT_L8 -#define CM_AL44 DMA2D_INPUT_AL44 -#define CM_AL88 DMA2D_INPUT_AL88 -#define CM_L4 DMA2D_INPUT_L4 -#define CM_A8 DMA2D_INPUT_A8 -#define CM_A4 DMA2D_INPUT_A4 -/** - * @} - */ -#endif /* STM32L4 || STM32F7 || STM32F4 || STM32H7 */ - -#if defined(STM32L4) || defined(STM32F7) || defined(STM32F427xx) || defined(STM32F437xx) \ - || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) \ - || defined(STM32H7) || defined(STM32U5) -/** @defgroup DMA2D_Aliases DMA2D API Aliases - * @{ - */ -#define HAL_DMA2D_DisableCLUT HAL_DMA2D_CLUTLoading_Abort /*!< Aliased to HAL_DMA2D_CLUTLoading_Abort - for compatibility with legacy code */ -/** - * @} - */ - -#endif /* STM32L4 || STM32F7 || STM32F4 || STM32H7 || STM32U5 */ - -/** @defgroup HAL_PPP_Aliased_Defines HAL PPP Aliased Defines maintained for legacy purpose - * @{ - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup HAL_CRYP_Aliased_Functions HAL CRYP Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_CRYP_ComputationCpltCallback HAL_CRYPEx_ComputationCpltCallback -/** - * @} - */ - -/** @defgroup HAL_DCACHE_Aliased_Functions HAL DCACHE Aliased Functions maintained for legacy purpose - * @{ - */ - -#if defined(STM32U5) -#define HAL_DCACHE_CleanInvalidateByAddr HAL_DCACHE_CleanInvalidByAddr -#define HAL_DCACHE_CleanInvalidateByAddr_IT HAL_DCACHE_CleanInvalidByAddr_IT -#endif /* STM32U5 */ - -/** - * @} - */ - -#if !defined(STM32F2) -/** @defgroup HASH_alias HASH API alias - * @{ - */ -#define HAL_HASHEx_IRQHandler HAL_HASH_IRQHandler /*!< Redirection for compatibility with legacy code */ -/** - * - * @} - */ -#endif /* STM32F2 */ -/** @defgroup HAL_HASH_Aliased_Functions HAL HASH Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_HASH_STATETypeDef HAL_HASH_StateTypeDef -#define HAL_HASHPhaseTypeDef HAL_HASH_PhaseTypeDef -#define HAL_HMAC_MD5_Finish HAL_HASH_MD5_Finish -#define HAL_HMAC_SHA1_Finish HAL_HASH_SHA1_Finish -#define HAL_HMAC_SHA224_Finish HAL_HASH_SHA224_Finish -#define HAL_HMAC_SHA256_Finish HAL_HASH_SHA256_Finish - -/*HASH Algorithm Selection*/ - -#define HASH_AlgoSelection_SHA1 HASH_ALGOSELECTION_SHA1 -#define HASH_AlgoSelection_SHA224 HASH_ALGOSELECTION_SHA224 -#define HASH_AlgoSelection_SHA256 HASH_ALGOSELECTION_SHA256 -#define HASH_AlgoSelection_MD5 HASH_ALGOSELECTION_MD5 - -#define HASH_AlgoMode_HASH HASH_ALGOMODE_HASH -#define HASH_AlgoMode_HMAC HASH_ALGOMODE_HMAC - -#define HASH_HMACKeyType_ShortKey HASH_HMAC_KEYTYPE_SHORTKEY -#define HASH_HMACKeyType_LongKey HASH_HMAC_KEYTYPE_LONGKEY - -#if defined(STM32L4) || defined(STM32L5) || defined(STM32F2) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) - -#define HAL_HASH_MD5_Accumulate HAL_HASH_MD5_Accmlt -#define HAL_HASH_MD5_Accumulate_End HAL_HASH_MD5_Accmlt_End -#define HAL_HASH_MD5_Accumulate_IT HAL_HASH_MD5_Accmlt_IT -#define HAL_HASH_MD5_Accumulate_End_IT HAL_HASH_MD5_Accmlt_End_IT - -#define HAL_HASH_SHA1_Accumulate HAL_HASH_SHA1_Accmlt -#define HAL_HASH_SHA1_Accumulate_End HAL_HASH_SHA1_Accmlt_End -#define HAL_HASH_SHA1_Accumulate_IT HAL_HASH_SHA1_Accmlt_IT -#define HAL_HASH_SHA1_Accumulate_End_IT HAL_HASH_SHA1_Accmlt_End_IT - -#define HAL_HASHEx_SHA224_Accumulate HAL_HASHEx_SHA224_Accmlt -#define HAL_HASHEx_SHA224_Accumulate_End HAL_HASHEx_SHA224_Accmlt_End -#define HAL_HASHEx_SHA224_Accumulate_IT HAL_HASHEx_SHA224_Accmlt_IT -#define HAL_HASHEx_SHA224_Accumulate_End_IT HAL_HASHEx_SHA224_Accmlt_End_IT - -#define HAL_HASHEx_SHA256_Accumulate HAL_HASHEx_SHA256_Accmlt -#define HAL_HASHEx_SHA256_Accumulate_End HAL_HASHEx_SHA256_Accmlt_End -#define HAL_HASHEx_SHA256_Accumulate_IT HAL_HASHEx_SHA256_Accmlt_IT -#define HAL_HASHEx_SHA256_Accumulate_End_IT HAL_HASHEx_SHA256_Accmlt_End_IT - -#endif /* STM32L4 || STM32L5 || STM32F2 || STM32F4 || STM32F7 || STM32H7 */ -/** - * @} - */ - -/** @defgroup HAL_Aliased_Functions HAL Generic Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_EnableDBGSleepMode HAL_DBGMCU_EnableDBGSleepMode -#define HAL_DisableDBGSleepMode HAL_DBGMCU_DisableDBGSleepMode -#define HAL_EnableDBGStopMode HAL_DBGMCU_EnableDBGStopMode -#define HAL_DisableDBGStopMode HAL_DBGMCU_DisableDBGStopMode -#define HAL_EnableDBGStandbyMode HAL_DBGMCU_EnableDBGStandbyMode -#define HAL_DisableDBGStandbyMode HAL_DBGMCU_DisableDBGStandbyMode -#define HAL_DBG_LowPowerConfig(Periph, cmd) (((cmd\ - )==ENABLE)? HAL_DBGMCU_DBG_EnableLowPowerConfig(Periph) : \ - HAL_DBGMCU_DBG_DisableLowPowerConfig(Periph)) -#define HAL_VREFINT_OutputSelect HAL_SYSCFG_VREFINT_OutputSelect -#define HAL_Lock_Cmd(cmd) (((cmd)==ENABLE) ? HAL_SYSCFG_Enable_Lock_VREFINT() : HAL_SYSCFG_Disable_Lock_VREFINT()) -#if defined(STM32L0) -#else -#define HAL_VREFINT_Cmd(cmd) (((cmd)==ENABLE)? HAL_SYSCFG_EnableVREFINT() : HAL_SYSCFG_DisableVREFINT()) -#endif -#define HAL_ADC_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT()) -#define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd\ - )==ENABLE) ? HAL_ADCEx_EnableVREFINTTempSensor() : \ - HAL_ADCEx_DisableVREFINTTempSensor()) -#if defined(STM32H7A3xx) || defined(STM32H7B3xx) || defined(STM32H7B0xx) || defined(STM32H7A3xxQ) || \ - defined(STM32H7B3xxQ) || defined(STM32H7B0xxQ) -#define HAL_EnableSRDomainDBGStopMode HAL_EnableDomain3DBGStopMode -#define HAL_DisableSRDomainDBGStopMode HAL_DisableDomain3DBGStopMode -#define HAL_EnableSRDomainDBGStandbyMode HAL_EnableDomain3DBGStandbyMode -#define HAL_DisableSRDomainDBGStandbyMode HAL_DisableDomain3DBGStandbyMode -#endif /* STM32H7A3xx || STM32H7B3xx || STM32H7B0xx || STM32H7A3xxQ || STM32H7B3xxQ || STM32H7B0xxQ */ - -/** - * @} - */ - -/** @defgroup HAL_FLASH_Aliased_Functions HAL FLASH Aliased Functions maintained for legacy purpose - * @{ - */ -#define FLASH_HalfPageProgram HAL_FLASHEx_HalfPageProgram -#define FLASH_EnableRunPowerDown HAL_FLASHEx_EnableRunPowerDown -#define FLASH_DisableRunPowerDown HAL_FLASHEx_DisableRunPowerDown -#define HAL_DATA_EEPROMEx_Unlock HAL_FLASHEx_DATAEEPROM_Unlock -#define HAL_DATA_EEPROMEx_Lock HAL_FLASHEx_DATAEEPROM_Lock -#define HAL_DATA_EEPROMEx_Erase HAL_FLASHEx_DATAEEPROM_Erase -#define HAL_DATA_EEPROMEx_Program HAL_FLASHEx_DATAEEPROM_Program - -/** - * @} - */ - -/** @defgroup HAL_I2C_Aliased_Functions HAL I2C Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_I2CEx_AnalogFilter_Config HAL_I2CEx_ConfigAnalogFilter -#define HAL_I2CEx_DigitalFilter_Config HAL_I2CEx_ConfigDigitalFilter -#define HAL_FMPI2CEx_AnalogFilter_Config HAL_FMPI2CEx_ConfigAnalogFilter -#define HAL_FMPI2CEx_DigitalFilter_Config HAL_FMPI2CEx_ConfigDigitalFilter - -#define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd) == ENABLE)? \ - HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): \ - HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus)) - -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || \ - defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || \ - defined(STM32L4) || defined(STM32L5) || defined(STM32G4) || defined(STM32L1) -#define HAL_I2C_Master_Sequential_Transmit_IT HAL_I2C_Master_Seq_Transmit_IT -#define HAL_I2C_Master_Sequential_Receive_IT HAL_I2C_Master_Seq_Receive_IT -#define HAL_I2C_Slave_Sequential_Transmit_IT HAL_I2C_Slave_Seq_Transmit_IT -#define HAL_I2C_Slave_Sequential_Receive_IT HAL_I2C_Slave_Seq_Receive_IT -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 || - STM32L4 || STM32L5 || STM32G4 || STM32L1 */ -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || \ - defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4)|| defined(STM32L1) -#define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA -#define HAL_I2C_Master_Sequential_Receive_DMA HAL_I2C_Master_Seq_Receive_DMA -#define HAL_I2C_Slave_Sequential_Transmit_DMA HAL_I2C_Slave_Seq_Transmit_DMA -#define HAL_I2C_Slave_Sequential_Receive_DMA HAL_I2C_Slave_Seq_Receive_DMA -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 || STM32L1 */ - -#if defined(STM32F4) -#define HAL_FMPI2C_Master_Sequential_Transmit_IT HAL_FMPI2C_Master_Seq_Transmit_IT -#define HAL_FMPI2C_Master_Sequential_Receive_IT HAL_FMPI2C_Master_Seq_Receive_IT -#define HAL_FMPI2C_Slave_Sequential_Transmit_IT HAL_FMPI2C_Slave_Seq_Transmit_IT -#define HAL_FMPI2C_Slave_Sequential_Receive_IT HAL_FMPI2C_Slave_Seq_Receive_IT -#define HAL_FMPI2C_Master_Sequential_Transmit_DMA HAL_FMPI2C_Master_Seq_Transmit_DMA -#define HAL_FMPI2C_Master_Sequential_Receive_DMA HAL_FMPI2C_Master_Seq_Receive_DMA -#define HAL_FMPI2C_Slave_Sequential_Transmit_DMA HAL_FMPI2C_Slave_Seq_Transmit_DMA -#define HAL_FMPI2C_Slave_Sequential_Receive_DMA HAL_FMPI2C_Slave_Seq_Receive_DMA -#endif /* STM32F4 */ -/** - * @} - */ - -/** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose - * @{ - */ - -#if defined(STM32G0) -#define HAL_PWR_ConfigPVD HAL_PWREx_ConfigPVD -#define HAL_PWR_EnablePVD HAL_PWREx_EnablePVD -#define HAL_PWR_DisablePVD HAL_PWREx_DisablePVD -#define HAL_PWR_PVD_IRQHandler HAL_PWREx_PVD_IRQHandler -#endif -#define HAL_PWR_PVDConfig HAL_PWR_ConfigPVD -#define HAL_PWR_DisableBkUpReg HAL_PWREx_DisableBkUpReg -#define HAL_PWR_DisableFlashPowerDown HAL_PWREx_DisableFlashPowerDown -#define HAL_PWR_DisableVddio2Monitor HAL_PWREx_DisableVddio2Monitor -#define HAL_PWR_EnableBkUpReg HAL_PWREx_EnableBkUpReg -#define HAL_PWR_EnableFlashPowerDown HAL_PWREx_EnableFlashPowerDown -#define HAL_PWR_EnableVddio2Monitor HAL_PWREx_EnableVddio2Monitor -#define HAL_PWR_PVD_PVM_IRQHandler HAL_PWREx_PVD_PVM_IRQHandler -#define HAL_PWR_PVDLevelConfig HAL_PWR_ConfigPVD -#define HAL_PWR_Vddio2Monitor_IRQHandler HAL_PWREx_Vddio2Monitor_IRQHandler -#define HAL_PWR_Vddio2MonitorCallback HAL_PWREx_Vddio2MonitorCallback -#define HAL_PWREx_ActivateOverDrive HAL_PWREx_EnableOverDrive -#define HAL_PWREx_DeactivateOverDrive HAL_PWREx_DisableOverDrive -#define HAL_PWREx_DisableSDADCAnalog HAL_PWREx_DisableSDADC -#define HAL_PWREx_EnableSDADCAnalog HAL_PWREx_EnableSDADC -#define HAL_PWREx_PVMConfig HAL_PWREx_ConfigPVM - -#define PWR_MODE_NORMAL PWR_PVD_MODE_NORMAL -#define PWR_MODE_IT_RISING PWR_PVD_MODE_IT_RISING -#define PWR_MODE_IT_FALLING PWR_PVD_MODE_IT_FALLING -#define PWR_MODE_IT_RISING_FALLING PWR_PVD_MODE_IT_RISING_FALLING -#define PWR_MODE_EVENT_RISING PWR_PVD_MODE_EVENT_RISING -#define PWR_MODE_EVENT_FALLING PWR_PVD_MODE_EVENT_FALLING -#define PWR_MODE_EVENT_RISING_FALLING PWR_PVD_MODE_EVENT_RISING_FALLING - -#define CR_OFFSET_BB PWR_CR_OFFSET_BB -#define CSR_OFFSET_BB PWR_CSR_OFFSET_BB -#define PMODE_BIT_NUMBER VOS_BIT_NUMBER -#define CR_PMODE_BB CR_VOS_BB - -#define DBP_BitNumber DBP_BIT_NUMBER -#define PVDE_BitNumber PVDE_BIT_NUMBER -#define PMODE_BitNumber PMODE_BIT_NUMBER -#define EWUP_BitNumber EWUP_BIT_NUMBER -#define FPDS_BitNumber FPDS_BIT_NUMBER -#define ODEN_BitNumber ODEN_BIT_NUMBER -#define ODSWEN_BitNumber ODSWEN_BIT_NUMBER -#define MRLVDS_BitNumber MRLVDS_BIT_NUMBER -#define LPLVDS_BitNumber LPLVDS_BIT_NUMBER -#define BRE_BitNumber BRE_BIT_NUMBER - -#define PWR_MODE_EVT PWR_PVD_MODE_NORMAL - -#if defined (STM32U5) -#define PWR_SRAM1_PAGE1_STOP_RETENTION PWR_SRAM1_PAGE1_STOP -#define PWR_SRAM1_PAGE2_STOP_RETENTION PWR_SRAM1_PAGE2_STOP -#define PWR_SRAM1_PAGE3_STOP_RETENTION PWR_SRAM1_PAGE3_STOP -#define PWR_SRAM1_PAGE4_STOP_RETENTION PWR_SRAM1_PAGE4_STOP -#define PWR_SRAM1_PAGE5_STOP_RETENTION PWR_SRAM1_PAGE5_STOP -#define PWR_SRAM1_PAGE6_STOP_RETENTION PWR_SRAM1_PAGE6_STOP -#define PWR_SRAM1_PAGE7_STOP_RETENTION PWR_SRAM1_PAGE7_STOP -#define PWR_SRAM1_PAGE8_STOP_RETENTION PWR_SRAM1_PAGE8_STOP -#define PWR_SRAM1_PAGE9_STOP_RETENTION PWR_SRAM1_PAGE9_STOP -#define PWR_SRAM1_PAGE10_STOP_RETENTION PWR_SRAM1_PAGE10_STOP -#define PWR_SRAM1_PAGE11_STOP_RETENTION PWR_SRAM1_PAGE11_STOP -#define PWR_SRAM1_PAGE12_STOP_RETENTION PWR_SRAM1_PAGE12_STOP -#define PWR_SRAM1_FULL_STOP_RETENTION PWR_SRAM1_FULL_STOP - -#define PWR_SRAM2_PAGE1_STOP_RETENTION PWR_SRAM2_PAGE1_STOP -#define PWR_SRAM2_PAGE2_STOP_RETENTION PWR_SRAM2_PAGE2_STOP -#define PWR_SRAM2_FULL_STOP_RETENTION PWR_SRAM2_FULL_STOP - -#define PWR_SRAM3_PAGE1_STOP_RETENTION PWR_SRAM3_PAGE1_STOP -#define PWR_SRAM3_PAGE2_STOP_RETENTION PWR_SRAM3_PAGE2_STOP -#define PWR_SRAM3_PAGE3_STOP_RETENTION PWR_SRAM3_PAGE3_STOP -#define PWR_SRAM3_PAGE4_STOP_RETENTION PWR_SRAM3_PAGE4_STOP -#define PWR_SRAM3_PAGE5_STOP_RETENTION PWR_SRAM3_PAGE5_STOP -#define PWR_SRAM3_PAGE6_STOP_RETENTION PWR_SRAM3_PAGE6_STOP -#define PWR_SRAM3_PAGE7_STOP_RETENTION PWR_SRAM3_PAGE7_STOP -#define PWR_SRAM3_PAGE8_STOP_RETENTION PWR_SRAM3_PAGE8_STOP -#define PWR_SRAM3_PAGE9_STOP_RETENTION PWR_SRAM3_PAGE9_STOP -#define PWR_SRAM3_PAGE10_STOP_RETENTION PWR_SRAM3_PAGE10_STOP -#define PWR_SRAM3_PAGE11_STOP_RETENTION PWR_SRAM3_PAGE11_STOP -#define PWR_SRAM3_PAGE12_STOP_RETENTION PWR_SRAM3_PAGE12_STOP -#define PWR_SRAM3_PAGE13_STOP_RETENTION PWR_SRAM3_PAGE13_STOP -#define PWR_SRAM3_FULL_STOP_RETENTION PWR_SRAM3_FULL_STOP - -#define PWR_SRAM4_FULL_STOP_RETENTION PWR_SRAM4_FULL_STOP - -#define PWR_SRAM5_PAGE1_STOP_RETENTION PWR_SRAM5_PAGE1_STOP -#define PWR_SRAM5_PAGE2_STOP_RETENTION PWR_SRAM5_PAGE2_STOP -#define PWR_SRAM5_PAGE3_STOP_RETENTION PWR_SRAM5_PAGE3_STOP -#define PWR_SRAM5_PAGE4_STOP_RETENTION PWR_SRAM5_PAGE4_STOP -#define PWR_SRAM5_PAGE5_STOP_RETENTION PWR_SRAM5_PAGE5_STOP -#define PWR_SRAM5_PAGE6_STOP_RETENTION PWR_SRAM5_PAGE6_STOP -#define PWR_SRAM5_PAGE7_STOP_RETENTION PWR_SRAM5_PAGE7_STOP -#define PWR_SRAM5_PAGE8_STOP_RETENTION PWR_SRAM5_PAGE8_STOP -#define PWR_SRAM5_PAGE9_STOP_RETENTION PWR_SRAM5_PAGE9_STOP -#define PWR_SRAM5_PAGE10_STOP_RETENTION PWR_SRAM5_PAGE10_STOP -#define PWR_SRAM5_PAGE11_STOP_RETENTION PWR_SRAM5_PAGE11_STOP -#define PWR_SRAM5_PAGE12_STOP_RETENTION PWR_SRAM5_PAGE12_STOP -#define PWR_SRAM5_PAGE13_STOP_RETENTION PWR_SRAM5_PAGE13_STOP -#define PWR_SRAM5_FULL_STOP_RETENTION PWR_SRAM5_FULL_STOP - -#define PWR_SRAM6_PAGE1_STOP_RETENTION PWR_SRAM6_PAGE1_STOP -#define PWR_SRAM6_PAGE2_STOP_RETENTION PWR_SRAM6_PAGE2_STOP -#define PWR_SRAM6_PAGE3_STOP_RETENTION PWR_SRAM6_PAGE3_STOP -#define PWR_SRAM6_PAGE4_STOP_RETENTION PWR_SRAM6_PAGE4_STOP -#define PWR_SRAM6_PAGE5_STOP_RETENTION PWR_SRAM6_PAGE5_STOP -#define PWR_SRAM6_PAGE6_STOP_RETENTION PWR_SRAM6_PAGE6_STOP -#define PWR_SRAM6_PAGE7_STOP_RETENTION PWR_SRAM6_PAGE7_STOP -#define PWR_SRAM6_PAGE8_STOP_RETENTION PWR_SRAM6_PAGE8_STOP -#define PWR_SRAM6_FULL_STOP_RETENTION PWR_SRAM6_FULL_STOP - - -#define PWR_ICACHE_FULL_STOP_RETENTION PWR_ICACHE_FULL_STOP -#define PWR_DCACHE1_FULL_STOP_RETENTION PWR_DCACHE1_FULL_STOP -#define PWR_DCACHE2_FULL_STOP_RETENTION PWR_DCACHE2_FULL_STOP -#define PWR_DMA2DRAM_FULL_STOP_RETENTION PWR_DMA2DRAM_FULL_STOP -#define PWR_PERIPHRAM_FULL_STOP_RETENTION PWR_PERIPHRAM_FULL_STOP -#define PWR_PKA32RAM_FULL_STOP_RETENTION PWR_PKA32RAM_FULL_STOP -#define PWR_GRAPHICPRAM_FULL_STOP_RETENTION PWR_GRAPHICPRAM_FULL_STOP -#define PWR_DSIRAM_FULL_STOP_RETENTION PWR_DSIRAM_FULL_STOP -#define PWR_JPEGRAM_FULL_STOP_RETENTION PWR_JPEGRAM_FULL_STOP - - -#define PWR_SRAM2_PAGE1_STANDBY_RETENTION PWR_SRAM2_PAGE1_STANDBY -#define PWR_SRAM2_PAGE2_STANDBY_RETENTION PWR_SRAM2_PAGE2_STANDBY -#define PWR_SRAM2_FULL_STANDBY_RETENTION PWR_SRAM2_FULL_STANDBY - -#define PWR_SRAM1_FULL_RUN_RETENTION PWR_SRAM1_FULL_RUN -#define PWR_SRAM2_FULL_RUN_RETENTION PWR_SRAM2_FULL_RUN -#define PWR_SRAM3_FULL_RUN_RETENTION PWR_SRAM3_FULL_RUN -#define PWR_SRAM4_FULL_RUN_RETENTION PWR_SRAM4_FULL_RUN -#define PWR_SRAM5_FULL_RUN_RETENTION PWR_SRAM5_FULL_RUN -#define PWR_SRAM6_FULL_RUN_RETENTION PWR_SRAM6_FULL_RUN - -#define PWR_ALL_RAM_RUN_RETENTION_MASK PWR_ALL_RAM_RUN_MASK -#endif - -/** - * @} - */ - -/** @defgroup HAL_RTC_Aliased_Functions HAL RTC Aliased Functions maintained for legacy purpose - * @{ - */ -#if defined(STM32H5) || defined(STM32WBA) || defined(STM32H7RS) -#define HAL_RTCEx_SetBoothardwareKey HAL_RTCEx_LockBootHardwareKey -#define HAL_RTCEx_BKUPBlock_Enable HAL_RTCEx_BKUPBlock -#define HAL_RTCEx_BKUPBlock_Disable HAL_RTCEx_BKUPUnblock -#define HAL_RTCEx_Erase_SecretDev_Conf HAL_RTCEx_ConfigEraseDeviceSecrets -#endif /* STM32H5 || STM32WBA || STM32H7RS */ - -/** - * @} - */ - -/** @defgroup HAL_SMBUS_Aliased_Functions HAL SMBUS Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_SMBUS_Slave_Listen_IT HAL_SMBUS_EnableListen_IT -#define HAL_SMBUS_SlaveAddrCallback HAL_SMBUS_AddrCallback -#define HAL_SMBUS_SlaveListenCpltCallback HAL_SMBUS_ListenCpltCallback -/** - * @} - */ - -/** @defgroup HAL_SPI_Aliased_Functions HAL SPI Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_SPI_FlushRxFifo HAL_SPIEx_FlushRxFifo -/** - * @} - */ - -/** @defgroup HAL_TIM_Aliased_Functions HAL TIM Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_TIM_DMADelayPulseCplt TIM_DMADelayPulseCplt -#define HAL_TIM_DMAError TIM_DMAError -#define HAL_TIM_DMACaptureCplt TIM_DMACaptureCplt -#define HAL_TIMEx_DMACommutationCplt TIMEx_DMACommutationCplt -#if defined(STM32H7) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || \ - defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) -#define HAL_TIM_SlaveConfigSynchronization HAL_TIM_SlaveConfigSynchro -#define HAL_TIM_SlaveConfigSynchronization_IT HAL_TIM_SlaveConfigSynchro_IT -#define HAL_TIMEx_CommutationCallback HAL_TIMEx_CommutCallback -#define HAL_TIMEx_ConfigCommutationEvent HAL_TIMEx_ConfigCommutEvent -#define HAL_TIMEx_ConfigCommutationEvent_IT HAL_TIMEx_ConfigCommutEvent_IT -#define HAL_TIMEx_ConfigCommutationEvent_DMA HAL_TIMEx_ConfigCommutEvent_DMA -#endif /* STM32H7 || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 */ -/** - * @} - */ - -/** @defgroup HAL_UART_Aliased_Functions HAL UART Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_UART_WakeupCallback HAL_UARTEx_WakeupCallback -/** - * @} - */ - -/** @defgroup HAL_LTDC_Aliased_Functions HAL LTDC Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_LTDC_LineEvenCallback HAL_LTDC_LineEventCallback -#define HAL_LTDC_Relaod HAL_LTDC_Reload -#define HAL_LTDC_StructInitFromVideoConfig HAL_LTDCEx_StructInitFromVideoConfig -#define HAL_LTDC_StructInitFromAdaptedCommandConfig HAL_LTDCEx_StructInitFromAdaptedCommandConfig -/** - * @} - */ - - -/** @defgroup HAL_PPP_Aliased_Functions HAL PPP Aliased Functions maintained for legacy purpose - * @{ - */ - -/** - * @} - */ - -/* Exported macros ------------------------------------------------------------*/ - -/** @defgroup HAL_AES_Aliased_Macros HAL CRYP Aliased Macros maintained for legacy purpose - * @{ - */ -#define AES_IT_CC CRYP_IT_CC -#define AES_IT_ERR CRYP_IT_ERR -#define AES_FLAG_CCF CRYP_FLAG_CCF -/** - * @} - */ - -/** @defgroup HAL_Aliased_Macros HAL Generic Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_GET_BOOT_MODE __HAL_SYSCFG_GET_BOOT_MODE -#define __HAL_REMAPMEMORY_FLASH __HAL_SYSCFG_REMAPMEMORY_FLASH -#define __HAL_REMAPMEMORY_SYSTEMFLASH __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH -#define __HAL_REMAPMEMORY_SRAM __HAL_SYSCFG_REMAPMEMORY_SRAM -#define __HAL_REMAPMEMORY_FMC __HAL_SYSCFG_REMAPMEMORY_FMC -#define __HAL_REMAPMEMORY_FMC_SDRAM __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM -#define __HAL_REMAPMEMORY_FSMC __HAL_SYSCFG_REMAPMEMORY_FSMC -#define __HAL_REMAPMEMORY_QUADSPI __HAL_SYSCFG_REMAPMEMORY_QUADSPI -#define __HAL_FMC_BANK __HAL_SYSCFG_FMC_BANK -#define __HAL_GET_FLAG __HAL_SYSCFG_GET_FLAG -#define __HAL_CLEAR_FLAG __HAL_SYSCFG_CLEAR_FLAG -#define __HAL_VREFINT_OUT_ENABLE __HAL_SYSCFG_VREFINT_OUT_ENABLE -#define __HAL_VREFINT_OUT_DISABLE __HAL_SYSCFG_VREFINT_OUT_DISABLE -#define __HAL_SYSCFG_SRAM2_WRP_ENABLE __HAL_SYSCFG_SRAM2_WRP_0_31_ENABLE - -#define SYSCFG_FLAG_VREF_READY SYSCFG_FLAG_VREFINT_READY -#define SYSCFG_FLAG_RC48 RCC_FLAG_HSI48 -#define IS_SYSCFG_FASTMODEPLUS_CONFIG IS_I2C_FASTMODEPLUS -#define UFB_MODE_BitNumber UFB_MODE_BIT_NUMBER -#define CMP_PD_BitNumber CMP_PD_BIT_NUMBER - -/** - * @} - */ - - -/** @defgroup HAL_ADC_Aliased_Macros HAL ADC Aliased Macros maintained for legacy purpose - * @{ - */ -#define __ADC_ENABLE __HAL_ADC_ENABLE -#define __ADC_DISABLE __HAL_ADC_DISABLE -#define __HAL_ADC_ENABLING_CONDITIONS ADC_ENABLING_CONDITIONS -#define __HAL_ADC_DISABLING_CONDITIONS ADC_DISABLING_CONDITIONS -#define __HAL_ADC_IS_ENABLED ADC_IS_ENABLE -#define __ADC_IS_ENABLED ADC_IS_ENABLE -#define __HAL_ADC_IS_SOFTWARE_START_REGULAR ADC_IS_SOFTWARE_START_REGULAR -#define __HAL_ADC_IS_SOFTWARE_START_INJECTED ADC_IS_SOFTWARE_START_INJECTED -#define __HAL_ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED -#define __HAL_ADC_IS_CONVERSION_ONGOING_REGULAR ADC_IS_CONVERSION_ONGOING_REGULAR -#define __HAL_ADC_IS_CONVERSION_ONGOING_INJECTED ADC_IS_CONVERSION_ONGOING_INJECTED -#define __HAL_ADC_IS_CONVERSION_ONGOING ADC_IS_CONVERSION_ONGOING -#define __HAL_ADC_CLEAR_ERRORCODE ADC_CLEAR_ERRORCODE - -#define __HAL_ADC_GET_RESOLUTION ADC_GET_RESOLUTION -#define __HAL_ADC_JSQR_RK ADC_JSQR_RK -#define __HAL_ADC_CFGR_AWD1CH ADC_CFGR_AWD1CH_SHIFT -#define __HAL_ADC_CFGR_AWD23CR ADC_CFGR_AWD23CR -#define __HAL_ADC_CFGR_INJECT_AUTO_CONVERSION ADC_CFGR_INJECT_AUTO_CONVERSION -#define __HAL_ADC_CFGR_INJECT_CONTEXT_QUEUE ADC_CFGR_INJECT_CONTEXT_QUEUE -#define __HAL_ADC_CFGR_INJECT_DISCCONTINUOUS ADC_CFGR_INJECT_DISCCONTINUOUS -#define __HAL_ADC_CFGR_REG_DISCCONTINUOUS ADC_CFGR_REG_DISCCONTINUOUS -#define __HAL_ADC_CFGR_DISCONTINUOUS_NUM ADC_CFGR_DISCONTINUOUS_NUM -#define __HAL_ADC_CFGR_AUTOWAIT ADC_CFGR_AUTOWAIT -#define __HAL_ADC_CFGR_CONTINUOUS ADC_CFGR_CONTINUOUS -#define __HAL_ADC_CFGR_OVERRUN ADC_CFGR_OVERRUN -#define __HAL_ADC_CFGR_DMACONTREQ ADC_CFGR_DMACONTREQ -#define __HAL_ADC_CFGR_EXTSEL ADC_CFGR_EXTSEL_SET -#define __HAL_ADC_JSQR_JEXTSEL ADC_JSQR_JEXTSEL_SET -#define __HAL_ADC_OFR_CHANNEL ADC_OFR_CHANNEL -#define __HAL_ADC_DIFSEL_CHANNEL ADC_DIFSEL_CHANNEL -#define __HAL_ADC_CALFACT_DIFF_SET ADC_CALFACT_DIFF_SET -#define __HAL_ADC_CALFACT_DIFF_GET ADC_CALFACT_DIFF_GET -#define __HAL_ADC_TRX_HIGHTHRESHOLD ADC_TRX_HIGHTHRESHOLD - -#define __HAL_ADC_OFFSET_SHIFT_RESOLUTION ADC_OFFSET_SHIFT_RESOLUTION -#define __HAL_ADC_AWD1THRESHOLD_SHIFT_RESOLUTION ADC_AWD1THRESHOLD_SHIFT_RESOLUTION -#define __HAL_ADC_AWD23THRESHOLD_SHIFT_RESOLUTION ADC_AWD23THRESHOLD_SHIFT_RESOLUTION -#define __HAL_ADC_COMMON_REGISTER ADC_COMMON_REGISTER -#define __HAL_ADC_COMMON_CCR_MULTI ADC_COMMON_CCR_MULTI -#define __HAL_ADC_MULTIMODE_IS_ENABLED ADC_MULTIMODE_IS_ENABLE -#define __ADC_MULTIMODE_IS_ENABLED ADC_MULTIMODE_IS_ENABLE -#define __HAL_ADC_NONMULTIMODE_OR_MULTIMODEMASTER ADC_NONMULTIMODE_OR_MULTIMODEMASTER -#define __HAL_ADC_COMMON_ADC_OTHER ADC_COMMON_ADC_OTHER -#define __HAL_ADC_MULTI_SLAVE ADC_MULTI_SLAVE - -#define __HAL_ADC_SQR1_L ADC_SQR1_L_SHIFT -#define __HAL_ADC_JSQR_JL ADC_JSQR_JL_SHIFT -#define __HAL_ADC_JSQR_RK_JL ADC_JSQR_RK_JL -#define __HAL_ADC_CR1_DISCONTINUOUS_NUM ADC_CR1_DISCONTINUOUS_NUM -#define __HAL_ADC_CR1_SCAN ADC_CR1_SCAN_SET -#define __HAL_ADC_CONVCYCLES_MAX_RANGE ADC_CONVCYCLES_MAX_RANGE -#define __HAL_ADC_CLOCK_PRESCALER_RANGE ADC_CLOCK_PRESCALER_RANGE -#define __HAL_ADC_GET_CLOCK_PRESCALER ADC_GET_CLOCK_PRESCALER - -#define __HAL_ADC_SQR1 ADC_SQR1 -#define __HAL_ADC_SMPR1 ADC_SMPR1 -#define __HAL_ADC_SMPR2 ADC_SMPR2 -#define __HAL_ADC_SQR3_RK ADC_SQR3_RK -#define __HAL_ADC_SQR2_RK ADC_SQR2_RK -#define __HAL_ADC_SQR1_RK ADC_SQR1_RK -#define __HAL_ADC_CR2_CONTINUOUS ADC_CR2_CONTINUOUS -#define __HAL_ADC_CR1_DISCONTINUOUS ADC_CR1_DISCONTINUOUS -#define __HAL_ADC_CR1_SCANCONV ADC_CR1_SCANCONV -#define __HAL_ADC_CR2_EOCSelection ADC_CR2_EOCSelection -#define __HAL_ADC_CR2_DMAContReq ADC_CR2_DMAContReq -#define __HAL_ADC_JSQR ADC_JSQR - -#define __HAL_ADC_CHSELR_CHANNEL ADC_CHSELR_CHANNEL -#define __HAL_ADC_CFGR1_REG_DISCCONTINUOUS ADC_CFGR1_REG_DISCCONTINUOUS -#define __HAL_ADC_CFGR1_AUTOOFF ADC_CFGR1_AUTOOFF -#define __HAL_ADC_CFGR1_AUTOWAIT ADC_CFGR1_AUTOWAIT -#define __HAL_ADC_CFGR1_CONTINUOUS ADC_CFGR1_CONTINUOUS -#define __HAL_ADC_CFGR1_OVERRUN ADC_CFGR1_OVERRUN -#define __HAL_ADC_CFGR1_SCANDIR ADC_CFGR1_SCANDIR -#define __HAL_ADC_CFGR1_DMACONTREQ ADC_CFGR1_DMACONTREQ - -/** - * @} - */ - -/** @defgroup HAL_DAC_Aliased_Macros HAL DAC Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_DHR12R1_ALIGNEMENT DAC_DHR12R1_ALIGNMENT -#define __HAL_DHR12R2_ALIGNEMENT DAC_DHR12R2_ALIGNMENT -#define __HAL_DHR12RD_ALIGNEMENT DAC_DHR12RD_ALIGNMENT -#define IS_DAC_GENERATE_WAVE IS_DAC_WAVE - -/** - * @} - */ - -/** @defgroup HAL_DBGMCU_Aliased_Macros HAL DBGMCU Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_FREEZE_TIM1_DBGMCU __HAL_DBGMCU_FREEZE_TIM1 -#define __HAL_UNFREEZE_TIM1_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM1 -#define __HAL_FREEZE_TIM2_DBGMCU __HAL_DBGMCU_FREEZE_TIM2 -#define __HAL_UNFREEZE_TIM2_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM2 -#define __HAL_FREEZE_TIM3_DBGMCU __HAL_DBGMCU_FREEZE_TIM3 -#define __HAL_UNFREEZE_TIM3_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM3 -#define __HAL_FREEZE_TIM4_DBGMCU __HAL_DBGMCU_FREEZE_TIM4 -#define __HAL_UNFREEZE_TIM4_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM4 -#define __HAL_FREEZE_TIM5_DBGMCU __HAL_DBGMCU_FREEZE_TIM5 -#define __HAL_UNFREEZE_TIM5_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM5 -#define __HAL_FREEZE_TIM6_DBGMCU __HAL_DBGMCU_FREEZE_TIM6 -#define __HAL_UNFREEZE_TIM6_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM6 -#define __HAL_FREEZE_TIM7_DBGMCU __HAL_DBGMCU_FREEZE_TIM7 -#define __HAL_UNFREEZE_TIM7_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM7 -#define __HAL_FREEZE_TIM8_DBGMCU __HAL_DBGMCU_FREEZE_TIM8 -#define __HAL_UNFREEZE_TIM8_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM8 - -#define __HAL_FREEZE_TIM9_DBGMCU __HAL_DBGMCU_FREEZE_TIM9 -#define __HAL_UNFREEZE_TIM9_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM9 -#define __HAL_FREEZE_TIM10_DBGMCU __HAL_DBGMCU_FREEZE_TIM10 -#define __HAL_UNFREEZE_TIM10_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM10 -#define __HAL_FREEZE_TIM11_DBGMCU __HAL_DBGMCU_FREEZE_TIM11 -#define __HAL_UNFREEZE_TIM11_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM11 -#define __HAL_FREEZE_TIM12_DBGMCU __HAL_DBGMCU_FREEZE_TIM12 -#define __HAL_UNFREEZE_TIM12_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM12 -#define __HAL_FREEZE_TIM13_DBGMCU __HAL_DBGMCU_FREEZE_TIM13 -#define __HAL_UNFREEZE_TIM13_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM13 -#define __HAL_FREEZE_TIM14_DBGMCU __HAL_DBGMCU_FREEZE_TIM14 -#define __HAL_UNFREEZE_TIM14_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM14 -#define __HAL_FREEZE_CAN2_DBGMCU __HAL_DBGMCU_FREEZE_CAN2 -#define __HAL_UNFREEZE_CAN2_DBGMCU __HAL_DBGMCU_UNFREEZE_CAN2 - - -#define __HAL_FREEZE_TIM15_DBGMCU __HAL_DBGMCU_FREEZE_TIM15 -#define __HAL_UNFREEZE_TIM15_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM15 -#define __HAL_FREEZE_TIM16_DBGMCU __HAL_DBGMCU_FREEZE_TIM16 -#define __HAL_UNFREEZE_TIM16_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM16 -#define __HAL_FREEZE_TIM17_DBGMCU __HAL_DBGMCU_FREEZE_TIM17 -#define __HAL_UNFREEZE_TIM17_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM17 -#define __HAL_FREEZE_RTC_DBGMCU __HAL_DBGMCU_FREEZE_RTC -#define __HAL_UNFREEZE_RTC_DBGMCU __HAL_DBGMCU_UNFREEZE_RTC -#if defined(STM32H7) -#define __HAL_FREEZE_WWDG_DBGMCU __HAL_DBGMCU_FREEZE_WWDG1 -#define __HAL_UNFREEZE_WWDG_DBGMCU __HAL_DBGMCU_UnFreeze_WWDG1 -#define __HAL_FREEZE_IWDG_DBGMCU __HAL_DBGMCU_FREEZE_IWDG1 -#define __HAL_UNFREEZE_IWDG_DBGMCU __HAL_DBGMCU_UnFreeze_IWDG1 -#else -#define __HAL_FREEZE_WWDG_DBGMCU __HAL_DBGMCU_FREEZE_WWDG -#define __HAL_UNFREEZE_WWDG_DBGMCU __HAL_DBGMCU_UNFREEZE_WWDG -#define __HAL_FREEZE_IWDG_DBGMCU __HAL_DBGMCU_FREEZE_IWDG -#define __HAL_UNFREEZE_IWDG_DBGMCU __HAL_DBGMCU_UNFREEZE_IWDG -#endif /* STM32H7 */ -#define __HAL_FREEZE_I2C1_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT -#define __HAL_UNFREEZE_I2C1_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT -#define __HAL_FREEZE_I2C2_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT -#define __HAL_UNFREEZE_I2C2_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT -#define __HAL_FREEZE_I2C3_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT -#define __HAL_UNFREEZE_I2C3_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT -#define __HAL_FREEZE_CAN1_DBGMCU __HAL_DBGMCU_FREEZE_CAN1 -#define __HAL_UNFREEZE_CAN1_DBGMCU __HAL_DBGMCU_UNFREEZE_CAN1 -#define __HAL_FREEZE_LPTIM1_DBGMCU __HAL_DBGMCU_FREEZE_LPTIM1 -#define __HAL_UNFREEZE_LPTIM1_DBGMCU __HAL_DBGMCU_UNFREEZE_LPTIM1 -#define __HAL_FREEZE_LPTIM2_DBGMCU __HAL_DBGMCU_FREEZE_LPTIM2 -#define __HAL_UNFREEZE_LPTIM2_DBGMCU __HAL_DBGMCU_UNFREEZE_LPTIM2 - -/** - * @} - */ - -/** @defgroup HAL_COMP_Aliased_Macros HAL COMP Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined(STM32F3) -#define COMP_START __HAL_COMP_ENABLE -#define COMP_STOP __HAL_COMP_DISABLE -#define COMP_LOCK __HAL_COMP_LOCK - -#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) || defined(STM32F303x8) || \ - defined(STM32F334x8) || defined(STM32F328xx) -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP6_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP6_EXTI_CLEAR_FLAG()) -#endif -#if defined(STM32F302xE) || defined(STM32F302xC) -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP6_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP6_EXTI_CLEAR_FLAG()) -#endif -#if defined(STM32F303xE) || defined(STM32F398xx) || defined(STM32F303xC) || defined(STM32F358xx) -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP7_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP7_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP7_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP7_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP7_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP7_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP7_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP7_EXTI_CLEAR_FLAG()) -#endif -#if defined(STM32F373xC) ||defined(STM32F378xx) -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP2_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP2_EXTI_CLEAR_FLAG()) -#endif -#else -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP2_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP2_EXTI_CLEAR_FLAG()) -#endif - -#define __HAL_COMP_GET_EXTI_LINE COMP_GET_EXTI_LINE - -#if defined(STM32L0) || defined(STM32L4) -/* Note: On these STM32 families, the only argument of this macro */ -/* is COMP_FLAG_LOCK. */ -/* This macro is replaced by __HAL_COMP_IS_LOCKED with only HAL handle */ -/* argument. */ -#define __HAL_COMP_GET_FLAG(__HANDLE__, __FLAG__) (__HAL_COMP_IS_LOCKED(__HANDLE__)) -#endif -/** - * @} - */ - -#if defined(STM32L0) || defined(STM32L4) -/** @defgroup HAL_COMP_Aliased_Functions HAL COMP Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_COMP_Start_IT HAL_COMP_Start /* Function considered as legacy as EXTI event or IT configuration is - done into HAL_COMP_Init() */ -#define HAL_COMP_Stop_IT HAL_COMP_Stop /* Function considered as legacy as EXTI event or IT configuration is - done into HAL_COMP_Init() */ -/** - * @} - */ -#endif - -/** @defgroup HAL_DAC_Aliased_Macros HAL DAC Aliased Macros maintained for legacy purpose - * @{ - */ - -#define IS_DAC_WAVE(WAVE) (((WAVE) == DAC_WAVE_NONE) || \ - ((WAVE) == DAC_WAVE_NOISE)|| \ - ((WAVE) == DAC_WAVE_TRIANGLE)) - -/** - * @} - */ - -/** @defgroup HAL_FLASH_Aliased_Macros HAL FLASH Aliased Macros maintained for legacy purpose - * @{ - */ - -#define IS_WRPAREA IS_OB_WRPAREA -#define IS_TYPEPROGRAM IS_FLASH_TYPEPROGRAM -#define IS_TYPEPROGRAMFLASH IS_FLASH_TYPEPROGRAM -#define IS_TYPEERASE IS_FLASH_TYPEERASE -#define IS_NBSECTORS IS_FLASH_NBSECTORS -#define IS_OB_WDG_SOURCE IS_OB_IWDG_SOURCE - -/** - * @} - */ - -/** @defgroup HAL_I2C_Aliased_Macros HAL I2C Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_I2C_RESET_CR2 I2C_RESET_CR2 -#define __HAL_I2C_GENERATE_START I2C_GENERATE_START -#if defined(STM32F1) -#define __HAL_I2C_FREQ_RANGE I2C_FREQRANGE -#else -#define __HAL_I2C_FREQ_RANGE I2C_FREQ_RANGE -#endif /* STM32F1 */ -#define __HAL_I2C_RISE_TIME I2C_RISE_TIME -#define __HAL_I2C_SPEED_STANDARD I2C_SPEED_STANDARD -#define __HAL_I2C_SPEED_FAST I2C_SPEED_FAST -#define __HAL_I2C_SPEED I2C_SPEED -#define __HAL_I2C_7BIT_ADD_WRITE I2C_7BIT_ADD_WRITE -#define __HAL_I2C_7BIT_ADD_READ I2C_7BIT_ADD_READ -#define __HAL_I2C_10BIT_ADDRESS I2C_10BIT_ADDRESS -#define __HAL_I2C_10BIT_HEADER_WRITE I2C_10BIT_HEADER_WRITE -#define __HAL_I2C_10BIT_HEADER_READ I2C_10BIT_HEADER_READ -#define __HAL_I2C_MEM_ADD_MSB I2C_MEM_ADD_MSB -#define __HAL_I2C_MEM_ADD_LSB I2C_MEM_ADD_LSB -#define __HAL_I2C_FREQRANGE I2C_FREQRANGE -/** - * @} - */ - -/** @defgroup HAL_I2S_Aliased_Macros HAL I2S Aliased Macros maintained for legacy purpose - * @{ - */ - -#define IS_I2S_INSTANCE IS_I2S_ALL_INSTANCE -#define IS_I2S_INSTANCE_EXT IS_I2S_ALL_INSTANCE_EXT - -#if defined(STM32H7) -#define __HAL_I2S_CLEAR_FREFLAG __HAL_I2S_CLEAR_TIFREFLAG -#endif - -/** - * @} - */ - -/** @defgroup HAL_IRDA_Aliased_Macros HAL IRDA Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __IRDA_DISABLE __HAL_IRDA_DISABLE -#define __IRDA_ENABLE __HAL_IRDA_ENABLE - -#define __HAL_IRDA_GETCLOCKSOURCE IRDA_GETCLOCKSOURCE -#define __HAL_IRDA_MASK_COMPUTATION IRDA_MASK_COMPUTATION -#define __IRDA_GETCLOCKSOURCE IRDA_GETCLOCKSOURCE -#define __IRDA_MASK_COMPUTATION IRDA_MASK_COMPUTATION - -#define IS_IRDA_ONEBIT_SAMPLE IS_IRDA_ONE_BIT_SAMPLE - - -/** - * @} - */ - - -/** @defgroup HAL_IWDG_Aliased_Macros HAL IWDG Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_IWDG_ENABLE_WRITE_ACCESS IWDG_ENABLE_WRITE_ACCESS -#define __HAL_IWDG_DISABLE_WRITE_ACCESS IWDG_DISABLE_WRITE_ACCESS -/** - * @} - */ - - -/** @defgroup HAL_LPTIM_Aliased_Macros HAL LPTIM Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_LPTIM_ENABLE_INTERRUPT __HAL_LPTIM_ENABLE_IT -#define __HAL_LPTIM_DISABLE_INTERRUPT __HAL_LPTIM_DISABLE_IT -#define __HAL_LPTIM_GET_ITSTATUS __HAL_LPTIM_GET_IT_SOURCE - -/** - * @} - */ - - -/** @defgroup HAL_OPAMP_Aliased_Macros HAL OPAMP Aliased Macros maintained for legacy purpose - * @{ - */ -#define __OPAMP_CSR_OPAXPD OPAMP_CSR_OPAXPD -#define __OPAMP_CSR_S3SELX OPAMP_CSR_S3SELX -#define __OPAMP_CSR_S4SELX OPAMP_CSR_S4SELX -#define __OPAMP_CSR_S5SELX OPAMP_CSR_S5SELX -#define __OPAMP_CSR_S6SELX OPAMP_CSR_S6SELX -#define __OPAMP_CSR_OPAXCAL_L OPAMP_CSR_OPAXCAL_L -#define __OPAMP_CSR_OPAXCAL_H OPAMP_CSR_OPAXCAL_H -#define __OPAMP_CSR_OPAXLPM OPAMP_CSR_OPAXLPM -#define __OPAMP_CSR_ALL_SWITCHES OPAMP_CSR_ALL_SWITCHES -#define __OPAMP_CSR_ANAWSELX OPAMP_CSR_ANAWSELX -#define __OPAMP_CSR_OPAXCALOUT OPAMP_CSR_OPAXCALOUT -#define __OPAMP_OFFSET_TRIM_BITSPOSITION OPAMP_OFFSET_TRIM_BITSPOSITION -#define __OPAMP_OFFSET_TRIM_SET OPAMP_OFFSET_TRIM_SET - -/** - * @} - */ - - -/** @defgroup HAL_PWR_Aliased_Macros HAL PWR Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_PVD_EVENT_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_EVENT -#define __HAL_PVD_EVENT_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_EVENT -#define __HAL_PVD_EXTI_FALLINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE -#define __HAL_PVD_EXTI_FALLINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE -#define __HAL_PVD_EXTI_RISINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE -#define __HAL_PVD_EXTI_RISINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE -#define __HAL_PVM_EVENT_DISABLE __HAL_PWR_PVM_EVENT_DISABLE -#define __HAL_PVM_EVENT_ENABLE __HAL_PWR_PVM_EVENT_ENABLE -#define __HAL_PVM_EXTI_FALLINGTRIGGER_DISABLE __HAL_PWR_PVM_EXTI_FALLINGTRIGGER_DISABLE -#define __HAL_PVM_EXTI_FALLINGTRIGGER_ENABLE __HAL_PWR_PVM_EXTI_FALLINGTRIGGER_ENABLE -#define __HAL_PVM_EXTI_RISINGTRIGGER_DISABLE __HAL_PWR_PVM_EXTI_RISINGTRIGGER_DISABLE -#define __HAL_PVM_EXTI_RISINGTRIGGER_ENABLE __HAL_PWR_PVM_EXTI_RISINGTRIGGER_ENABLE -#define __HAL_PWR_INTERNALWAKEUP_DISABLE HAL_PWREx_DisableInternalWakeUpLine -#define __HAL_PWR_INTERNALWAKEUP_ENABLE HAL_PWREx_EnableInternalWakeUpLine -#define __HAL_PWR_PULL_UP_DOWN_CONFIG_DISABLE HAL_PWREx_DisablePullUpPullDownConfig -#define __HAL_PWR_PULL_UP_DOWN_CONFIG_ENABLE HAL_PWREx_EnablePullUpPullDownConfig -#define __HAL_PWR_PVD_EXTI_CLEAR_EGDE_TRIGGER() do { __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); \ - __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); \ - } while(0) -#define __HAL_PWR_PVD_EXTI_EVENT_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_EVENT -#define __HAL_PWR_PVD_EXTI_EVENT_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_EVENT -#define __HAL_PWR_PVD_EXTI_FALLINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE -#define __HAL_PWR_PVD_EXTI_FALLINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE -#define __HAL_PWR_PVD_EXTI_RISINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE -#define __HAL_PWR_PVD_EXTI_RISINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE -#define __HAL_PWR_PVD_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE -#define __HAL_PWR_PVD_EXTI_SET_RISING_EDGE_TRIGGER __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE -#define __HAL_PWR_PVM_DISABLE() do { HAL_PWREx_DisablePVM1();HAL_PWREx_DisablePVM2(); \ - HAL_PWREx_DisablePVM3();HAL_PWREx_DisablePVM4(); \ - } while(0) -#define __HAL_PWR_PVM_ENABLE() do { HAL_PWREx_EnablePVM1();HAL_PWREx_EnablePVM2(); \ - HAL_PWREx_EnablePVM3();HAL_PWREx_EnablePVM4(); \ - } while(0) -#define __HAL_PWR_SRAM2CONTENT_PRESERVE_DISABLE HAL_PWREx_DisableSRAM2ContentRetention -#define __HAL_PWR_SRAM2CONTENT_PRESERVE_ENABLE HAL_PWREx_EnableSRAM2ContentRetention -#define __HAL_PWR_VDDIO2_DISABLE HAL_PWREx_DisableVddIO2 -#define __HAL_PWR_VDDIO2_ENABLE HAL_PWREx_EnableVddIO2 -#define __HAL_PWR_VDDIO2_EXTI_CLEAR_EGDE_TRIGGER __HAL_PWR_VDDIO2_EXTI_DISABLE_FALLING_EDGE -#define __HAL_PWR_VDDIO2_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_PWR_VDDIO2_EXTI_ENABLE_FALLING_EDGE -#define __HAL_PWR_VDDUSB_DISABLE HAL_PWREx_DisableVddUSB -#define __HAL_PWR_VDDUSB_ENABLE HAL_PWREx_EnableVddUSB - -#if defined (STM32F4) -#define __HAL_PVD_EXTI_ENABLE_IT(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_ENABLE_IT() -#define __HAL_PVD_EXTI_DISABLE_IT(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_DISABLE_IT() -#define __HAL_PVD_EXTI_GET_FLAG(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_GET_FLAG() -#define __HAL_PVD_EXTI_CLEAR_FLAG(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_CLEAR_FLAG() -#define __HAL_PVD_EXTI_GENERATE_SWIT(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_GENERATE_SWIT() -#else -#define __HAL_PVD_EXTI_CLEAR_FLAG __HAL_PWR_PVD_EXTI_CLEAR_FLAG -#define __HAL_PVD_EXTI_DISABLE_IT __HAL_PWR_PVD_EXTI_DISABLE_IT -#define __HAL_PVD_EXTI_ENABLE_IT __HAL_PWR_PVD_EXTI_ENABLE_IT -#define __HAL_PVD_EXTI_GENERATE_SWIT __HAL_PWR_PVD_EXTI_GENERATE_SWIT -#define __HAL_PVD_EXTI_GET_FLAG __HAL_PWR_PVD_EXTI_GET_FLAG -#endif /* STM32F4 */ -/** - * @} - */ - - -/** @defgroup HAL_RCC_Aliased HAL RCC Aliased maintained for legacy purpose - * @{ - */ - -#define RCC_StopWakeUpClock_MSI RCC_STOP_WAKEUPCLOCK_MSI -#define RCC_StopWakeUpClock_HSI RCC_STOP_WAKEUPCLOCK_HSI - -#define HAL_RCC_CCSCallback HAL_RCC_CSSCallback -#define HAL_RC48_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? \ - HAL_RCCEx_EnableHSI48_VREFINT() : HAL_RCCEx_DisableHSI48_VREFINT()) - -#define __ADC_CLK_DISABLE __HAL_RCC_ADC_CLK_DISABLE -#define __ADC_CLK_ENABLE __HAL_RCC_ADC_CLK_ENABLE -#define __ADC_CLK_SLEEP_DISABLE __HAL_RCC_ADC_CLK_SLEEP_DISABLE -#define __ADC_CLK_SLEEP_ENABLE __HAL_RCC_ADC_CLK_SLEEP_ENABLE -#define __ADC_FORCE_RESET __HAL_RCC_ADC_FORCE_RESET -#define __ADC_RELEASE_RESET __HAL_RCC_ADC_RELEASE_RESET -#define __ADC1_CLK_DISABLE __HAL_RCC_ADC1_CLK_DISABLE -#define __ADC1_CLK_ENABLE __HAL_RCC_ADC1_CLK_ENABLE -#define __ADC1_FORCE_RESET __HAL_RCC_ADC1_FORCE_RESET -#define __ADC1_RELEASE_RESET __HAL_RCC_ADC1_RELEASE_RESET -#define __ADC1_CLK_SLEEP_ENABLE __HAL_RCC_ADC1_CLK_SLEEP_ENABLE -#define __ADC1_CLK_SLEEP_DISABLE __HAL_RCC_ADC1_CLK_SLEEP_DISABLE -#define __ADC2_CLK_DISABLE __HAL_RCC_ADC2_CLK_DISABLE -#define __ADC2_CLK_ENABLE __HAL_RCC_ADC2_CLK_ENABLE -#define __ADC2_FORCE_RESET __HAL_RCC_ADC2_FORCE_RESET -#define __ADC2_RELEASE_RESET __HAL_RCC_ADC2_RELEASE_RESET -#define __ADC3_CLK_DISABLE __HAL_RCC_ADC3_CLK_DISABLE -#define __ADC3_CLK_ENABLE __HAL_RCC_ADC3_CLK_ENABLE -#define __ADC3_FORCE_RESET __HAL_RCC_ADC3_FORCE_RESET -#define __ADC3_RELEASE_RESET __HAL_RCC_ADC3_RELEASE_RESET -#define __AES_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE -#define __AES_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE -#define __AES_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE -#define __AES_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE -#define __AES_FORCE_RESET __HAL_RCC_AES_FORCE_RESET -#define __AES_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET -#define __CRYP_CLK_SLEEP_ENABLE __HAL_RCC_CRYP_CLK_SLEEP_ENABLE -#define __CRYP_CLK_SLEEP_DISABLE __HAL_RCC_CRYP_CLK_SLEEP_DISABLE -#define __CRYP_CLK_ENABLE __HAL_RCC_CRYP_CLK_ENABLE -#define __CRYP_CLK_DISABLE __HAL_RCC_CRYP_CLK_DISABLE -#define __CRYP_FORCE_RESET __HAL_RCC_CRYP_FORCE_RESET -#define __CRYP_RELEASE_RESET __HAL_RCC_CRYP_RELEASE_RESET -#define __AFIO_CLK_DISABLE __HAL_RCC_AFIO_CLK_DISABLE -#define __AFIO_CLK_ENABLE __HAL_RCC_AFIO_CLK_ENABLE -#define __AFIO_FORCE_RESET __HAL_RCC_AFIO_FORCE_RESET -#define __AFIO_RELEASE_RESET __HAL_RCC_AFIO_RELEASE_RESET -#define __AHB_FORCE_RESET __HAL_RCC_AHB_FORCE_RESET -#define __AHB_RELEASE_RESET __HAL_RCC_AHB_RELEASE_RESET -#define __AHB1_FORCE_RESET __HAL_RCC_AHB1_FORCE_RESET -#define __AHB1_RELEASE_RESET __HAL_RCC_AHB1_RELEASE_RESET -#define __AHB2_FORCE_RESET __HAL_RCC_AHB2_FORCE_RESET -#define __AHB2_RELEASE_RESET __HAL_RCC_AHB2_RELEASE_RESET -#define __AHB3_FORCE_RESET __HAL_RCC_AHB3_FORCE_RESET -#define __AHB3_RELEASE_RESET __HAL_RCC_AHB3_RELEASE_RESET -#define __APB1_FORCE_RESET __HAL_RCC_APB1_FORCE_RESET -#define __APB1_RELEASE_RESET __HAL_RCC_APB1_RELEASE_RESET -#define __APB2_FORCE_RESET __HAL_RCC_APB2_FORCE_RESET -#define __APB2_RELEASE_RESET __HAL_RCC_APB2_RELEASE_RESET -#if defined(STM32C0) -#define __HAL_RCC_APB1_FORCE_RESET __HAL_RCC_APB1_GRP1_FORCE_RESET -#define __HAL_RCC_APB1_RELEASE_RESET __HAL_RCC_APB1_GRP1_RELEASE_RESET -#define __HAL_RCC_APB2_FORCE_RESET __HAL_RCC_APB1_GRP2_FORCE_RESET -#define __HAL_RCC_APB2_RELEASE_RESET __HAL_RCC_APB1_GRP2_RELEASE_RESET -#endif /* STM32C0 */ -#define __BKP_CLK_DISABLE __HAL_RCC_BKP_CLK_DISABLE -#define __BKP_CLK_ENABLE __HAL_RCC_BKP_CLK_ENABLE -#define __BKP_FORCE_RESET __HAL_RCC_BKP_FORCE_RESET -#define __BKP_RELEASE_RESET __HAL_RCC_BKP_RELEASE_RESET -#define __CAN1_CLK_DISABLE __HAL_RCC_CAN1_CLK_DISABLE -#define __CAN1_CLK_ENABLE __HAL_RCC_CAN1_CLK_ENABLE -#define __CAN1_CLK_SLEEP_DISABLE __HAL_RCC_CAN1_CLK_SLEEP_DISABLE -#define __CAN1_CLK_SLEEP_ENABLE __HAL_RCC_CAN1_CLK_SLEEP_ENABLE -#define __CAN1_FORCE_RESET __HAL_RCC_CAN1_FORCE_RESET -#define __CAN1_RELEASE_RESET __HAL_RCC_CAN1_RELEASE_RESET -#define __CAN_CLK_DISABLE __HAL_RCC_CAN1_CLK_DISABLE -#define __CAN_CLK_ENABLE __HAL_RCC_CAN1_CLK_ENABLE -#define __CAN_FORCE_RESET __HAL_RCC_CAN1_FORCE_RESET -#define __CAN_RELEASE_RESET __HAL_RCC_CAN1_RELEASE_RESET -#define __CAN2_CLK_DISABLE __HAL_RCC_CAN2_CLK_DISABLE -#define __CAN2_CLK_ENABLE __HAL_RCC_CAN2_CLK_ENABLE -#define __CAN2_FORCE_RESET __HAL_RCC_CAN2_FORCE_RESET -#define __CAN2_RELEASE_RESET __HAL_RCC_CAN2_RELEASE_RESET -#define __CEC_CLK_DISABLE __HAL_RCC_CEC_CLK_DISABLE -#define __CEC_CLK_ENABLE __HAL_RCC_CEC_CLK_ENABLE -#define __COMP_CLK_DISABLE __HAL_RCC_COMP_CLK_DISABLE -#define __COMP_CLK_ENABLE __HAL_RCC_COMP_CLK_ENABLE -#define __COMP_FORCE_RESET __HAL_RCC_COMP_FORCE_RESET -#define __COMP_RELEASE_RESET __HAL_RCC_COMP_RELEASE_RESET -#define __COMP_CLK_SLEEP_ENABLE __HAL_RCC_COMP_CLK_SLEEP_ENABLE -#define __COMP_CLK_SLEEP_DISABLE __HAL_RCC_COMP_CLK_SLEEP_DISABLE -#define __CEC_FORCE_RESET __HAL_RCC_CEC_FORCE_RESET -#define __CEC_RELEASE_RESET __HAL_RCC_CEC_RELEASE_RESET -#define __CRC_CLK_DISABLE __HAL_RCC_CRC_CLK_DISABLE -#define __CRC_CLK_ENABLE __HAL_RCC_CRC_CLK_ENABLE -#define __CRC_CLK_SLEEP_DISABLE __HAL_RCC_CRC_CLK_SLEEP_DISABLE -#define __CRC_CLK_SLEEP_ENABLE __HAL_RCC_CRC_CLK_SLEEP_ENABLE -#define __CRC_FORCE_RESET __HAL_RCC_CRC_FORCE_RESET -#define __CRC_RELEASE_RESET __HAL_RCC_CRC_RELEASE_RESET -#define __DAC_CLK_DISABLE __HAL_RCC_DAC_CLK_DISABLE -#define __DAC_CLK_ENABLE __HAL_RCC_DAC_CLK_ENABLE -#define __DAC_FORCE_RESET __HAL_RCC_DAC_FORCE_RESET -#define __DAC_RELEASE_RESET __HAL_RCC_DAC_RELEASE_RESET -#define __DAC1_CLK_DISABLE __HAL_RCC_DAC1_CLK_DISABLE -#define __DAC1_CLK_ENABLE __HAL_RCC_DAC1_CLK_ENABLE -#define __DAC1_CLK_SLEEP_DISABLE __HAL_RCC_DAC1_CLK_SLEEP_DISABLE -#define __DAC1_CLK_SLEEP_ENABLE __HAL_RCC_DAC1_CLK_SLEEP_ENABLE -#define __DAC1_FORCE_RESET __HAL_RCC_DAC1_FORCE_RESET -#define __DAC1_RELEASE_RESET __HAL_RCC_DAC1_RELEASE_RESET -#define __DBGMCU_CLK_ENABLE __HAL_RCC_DBGMCU_CLK_ENABLE -#define __DBGMCU_CLK_DISABLE __HAL_RCC_DBGMCU_CLK_DISABLE -#define __DBGMCU_FORCE_RESET __HAL_RCC_DBGMCU_FORCE_RESET -#define __DBGMCU_RELEASE_RESET __HAL_RCC_DBGMCU_RELEASE_RESET -#define __DFSDM_CLK_DISABLE __HAL_RCC_DFSDM_CLK_DISABLE -#define __DFSDM_CLK_ENABLE __HAL_RCC_DFSDM_CLK_ENABLE -#define __DFSDM_CLK_SLEEP_DISABLE __HAL_RCC_DFSDM_CLK_SLEEP_DISABLE -#define __DFSDM_CLK_SLEEP_ENABLE __HAL_RCC_DFSDM_CLK_SLEEP_ENABLE -#define __DFSDM_FORCE_RESET __HAL_RCC_DFSDM_FORCE_RESET -#define __DFSDM_RELEASE_RESET __HAL_RCC_DFSDM_RELEASE_RESET -#define __DMA1_CLK_DISABLE __HAL_RCC_DMA1_CLK_DISABLE -#define __DMA1_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE -#define __DMA1_CLK_SLEEP_DISABLE __HAL_RCC_DMA1_CLK_SLEEP_DISABLE -#define __DMA1_CLK_SLEEP_ENABLE __HAL_RCC_DMA1_CLK_SLEEP_ENABLE -#define __DMA1_FORCE_RESET __HAL_RCC_DMA1_FORCE_RESET -#define __DMA1_RELEASE_RESET __HAL_RCC_DMA1_RELEASE_RESET -#define __DMA2_CLK_DISABLE __HAL_RCC_DMA2_CLK_DISABLE -#define __DMA2_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE -#define __DMA2_CLK_SLEEP_DISABLE __HAL_RCC_DMA2_CLK_SLEEP_DISABLE -#define __DMA2_CLK_SLEEP_ENABLE __HAL_RCC_DMA2_CLK_SLEEP_ENABLE -#define __DMA2_FORCE_RESET __HAL_RCC_DMA2_FORCE_RESET -#define __DMA2_RELEASE_RESET __HAL_RCC_DMA2_RELEASE_RESET -#define __ETHMAC_CLK_DISABLE __HAL_RCC_ETHMAC_CLK_DISABLE -#define __ETHMAC_CLK_ENABLE __HAL_RCC_ETHMAC_CLK_ENABLE -#define __ETHMAC_FORCE_RESET __HAL_RCC_ETHMAC_FORCE_RESET -#define __ETHMAC_RELEASE_RESET __HAL_RCC_ETHMAC_RELEASE_RESET -#define __ETHMACRX_CLK_DISABLE __HAL_RCC_ETHMACRX_CLK_DISABLE -#define __ETHMACRX_CLK_ENABLE __HAL_RCC_ETHMACRX_CLK_ENABLE -#define __ETHMACTX_CLK_DISABLE __HAL_RCC_ETHMACTX_CLK_DISABLE -#define __ETHMACTX_CLK_ENABLE __HAL_RCC_ETHMACTX_CLK_ENABLE -#define __FIREWALL_CLK_DISABLE __HAL_RCC_FIREWALL_CLK_DISABLE -#define __FIREWALL_CLK_ENABLE __HAL_RCC_FIREWALL_CLK_ENABLE -#define __FLASH_CLK_DISABLE __HAL_RCC_FLASH_CLK_DISABLE -#define __FLASH_CLK_ENABLE __HAL_RCC_FLASH_CLK_ENABLE -#define __FLASH_CLK_SLEEP_DISABLE __HAL_RCC_FLASH_CLK_SLEEP_DISABLE -#define __FLASH_CLK_SLEEP_ENABLE __HAL_RCC_FLASH_CLK_SLEEP_ENABLE -#define __FLASH_FORCE_RESET __HAL_RCC_FLASH_FORCE_RESET -#define __FLASH_RELEASE_RESET __HAL_RCC_FLASH_RELEASE_RESET -#define __FLITF_CLK_DISABLE __HAL_RCC_FLITF_CLK_DISABLE -#define __FLITF_CLK_ENABLE __HAL_RCC_FLITF_CLK_ENABLE -#define __FLITF_FORCE_RESET __HAL_RCC_FLITF_FORCE_RESET -#define __FLITF_RELEASE_RESET __HAL_RCC_FLITF_RELEASE_RESET -#define __FLITF_CLK_SLEEP_ENABLE __HAL_RCC_FLITF_CLK_SLEEP_ENABLE -#define __FLITF_CLK_SLEEP_DISABLE __HAL_RCC_FLITF_CLK_SLEEP_DISABLE -#define __FMC_CLK_DISABLE __HAL_RCC_FMC_CLK_DISABLE -#define __FMC_CLK_ENABLE __HAL_RCC_FMC_CLK_ENABLE -#define __FMC_CLK_SLEEP_DISABLE __HAL_RCC_FMC_CLK_SLEEP_DISABLE -#define __FMC_CLK_SLEEP_ENABLE __HAL_RCC_FMC_CLK_SLEEP_ENABLE -#define __FMC_FORCE_RESET __HAL_RCC_FMC_FORCE_RESET -#define __FMC_RELEASE_RESET __HAL_RCC_FMC_RELEASE_RESET -#define __FSMC_CLK_DISABLE __HAL_RCC_FSMC_CLK_DISABLE -#define __FSMC_CLK_ENABLE __HAL_RCC_FSMC_CLK_ENABLE -#define __GPIOA_CLK_DISABLE __HAL_RCC_GPIOA_CLK_DISABLE -#define __GPIOA_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE -#define __GPIOA_CLK_SLEEP_DISABLE __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE -#define __GPIOA_CLK_SLEEP_ENABLE __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE -#define __GPIOA_FORCE_RESET __HAL_RCC_GPIOA_FORCE_RESET -#define __GPIOA_RELEASE_RESET __HAL_RCC_GPIOA_RELEASE_RESET -#define __GPIOB_CLK_DISABLE __HAL_RCC_GPIOB_CLK_DISABLE -#define __GPIOB_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE -#define __GPIOB_CLK_SLEEP_DISABLE __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE -#define __GPIOB_CLK_SLEEP_ENABLE __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE -#define __GPIOB_FORCE_RESET __HAL_RCC_GPIOB_FORCE_RESET -#define __GPIOB_RELEASE_RESET __HAL_RCC_GPIOB_RELEASE_RESET -#define __GPIOC_CLK_DISABLE __HAL_RCC_GPIOC_CLK_DISABLE -#define __GPIOC_CLK_ENABLE __HAL_RCC_GPIOC_CLK_ENABLE -#define __GPIOC_CLK_SLEEP_DISABLE __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE -#define __GPIOC_CLK_SLEEP_ENABLE __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE -#define __GPIOC_FORCE_RESET __HAL_RCC_GPIOC_FORCE_RESET -#define __GPIOC_RELEASE_RESET __HAL_RCC_GPIOC_RELEASE_RESET -#define __GPIOD_CLK_DISABLE __HAL_RCC_GPIOD_CLK_DISABLE -#define __GPIOD_CLK_ENABLE __HAL_RCC_GPIOD_CLK_ENABLE -#define __GPIOD_CLK_SLEEP_DISABLE __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE -#define __GPIOD_CLK_SLEEP_ENABLE __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE -#define __GPIOD_FORCE_RESET __HAL_RCC_GPIOD_FORCE_RESET -#define __GPIOD_RELEASE_RESET __HAL_RCC_GPIOD_RELEASE_RESET -#define __GPIOE_CLK_DISABLE __HAL_RCC_GPIOE_CLK_DISABLE -#define __GPIOE_CLK_ENABLE __HAL_RCC_GPIOE_CLK_ENABLE -#define __GPIOE_CLK_SLEEP_DISABLE __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE -#define __GPIOE_CLK_SLEEP_ENABLE __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE -#define __GPIOE_FORCE_RESET __HAL_RCC_GPIOE_FORCE_RESET -#define __GPIOE_RELEASE_RESET __HAL_RCC_GPIOE_RELEASE_RESET -#define __GPIOF_CLK_DISABLE __HAL_RCC_GPIOF_CLK_DISABLE -#define __GPIOF_CLK_ENABLE __HAL_RCC_GPIOF_CLK_ENABLE -#define __GPIOF_CLK_SLEEP_DISABLE __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE -#define __GPIOF_CLK_SLEEP_ENABLE __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE -#define __GPIOF_FORCE_RESET __HAL_RCC_GPIOF_FORCE_RESET -#define __GPIOF_RELEASE_RESET __HAL_RCC_GPIOF_RELEASE_RESET -#define __GPIOG_CLK_DISABLE __HAL_RCC_GPIOG_CLK_DISABLE -#define __GPIOG_CLK_ENABLE __HAL_RCC_GPIOG_CLK_ENABLE -#define __GPIOG_CLK_SLEEP_DISABLE __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE -#define __GPIOG_CLK_SLEEP_ENABLE __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE -#define __GPIOG_FORCE_RESET __HAL_RCC_GPIOG_FORCE_RESET -#define __GPIOG_RELEASE_RESET __HAL_RCC_GPIOG_RELEASE_RESET -#define __GPIOH_CLK_DISABLE __HAL_RCC_GPIOH_CLK_DISABLE -#define __GPIOH_CLK_ENABLE __HAL_RCC_GPIOH_CLK_ENABLE -#define __GPIOH_CLK_SLEEP_DISABLE __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE -#define __GPIOH_CLK_SLEEP_ENABLE __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE -#define __GPIOH_FORCE_RESET __HAL_RCC_GPIOH_FORCE_RESET -#define __GPIOH_RELEASE_RESET __HAL_RCC_GPIOH_RELEASE_RESET -#define __I2C1_CLK_DISABLE __HAL_RCC_I2C1_CLK_DISABLE -#define __I2C1_CLK_ENABLE __HAL_RCC_I2C1_CLK_ENABLE -#define __I2C1_CLK_SLEEP_DISABLE __HAL_RCC_I2C1_CLK_SLEEP_DISABLE -#define __I2C1_CLK_SLEEP_ENABLE __HAL_RCC_I2C1_CLK_SLEEP_ENABLE -#define __I2C1_FORCE_RESET __HAL_RCC_I2C1_FORCE_RESET -#define __I2C1_RELEASE_RESET __HAL_RCC_I2C1_RELEASE_RESET -#define __I2C2_CLK_DISABLE __HAL_RCC_I2C2_CLK_DISABLE -#define __I2C2_CLK_ENABLE __HAL_RCC_I2C2_CLK_ENABLE -#define __I2C2_CLK_SLEEP_DISABLE __HAL_RCC_I2C2_CLK_SLEEP_DISABLE -#define __I2C2_CLK_SLEEP_ENABLE __HAL_RCC_I2C2_CLK_SLEEP_ENABLE -#define __I2C2_FORCE_RESET __HAL_RCC_I2C2_FORCE_RESET -#define __I2C2_RELEASE_RESET __HAL_RCC_I2C2_RELEASE_RESET -#define __I2C3_CLK_DISABLE __HAL_RCC_I2C3_CLK_DISABLE -#define __I2C3_CLK_ENABLE __HAL_RCC_I2C3_CLK_ENABLE -#define __I2C3_CLK_SLEEP_DISABLE __HAL_RCC_I2C3_CLK_SLEEP_DISABLE -#define __I2C3_CLK_SLEEP_ENABLE __HAL_RCC_I2C3_CLK_SLEEP_ENABLE -#define __I2C3_FORCE_RESET __HAL_RCC_I2C3_FORCE_RESET -#define __I2C3_RELEASE_RESET __HAL_RCC_I2C3_RELEASE_RESET -#define __LCD_CLK_DISABLE __HAL_RCC_LCD_CLK_DISABLE -#define __LCD_CLK_ENABLE __HAL_RCC_LCD_CLK_ENABLE -#define __LCD_CLK_SLEEP_DISABLE __HAL_RCC_LCD_CLK_SLEEP_DISABLE -#define __LCD_CLK_SLEEP_ENABLE __HAL_RCC_LCD_CLK_SLEEP_ENABLE -#define __LCD_FORCE_RESET __HAL_RCC_LCD_FORCE_RESET -#define __LCD_RELEASE_RESET __HAL_RCC_LCD_RELEASE_RESET -#define __LPTIM1_CLK_DISABLE __HAL_RCC_LPTIM1_CLK_DISABLE -#define __LPTIM1_CLK_ENABLE __HAL_RCC_LPTIM1_CLK_ENABLE -#define __LPTIM1_CLK_SLEEP_DISABLE __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE -#define __LPTIM1_CLK_SLEEP_ENABLE __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE -#define __LPTIM1_FORCE_RESET __HAL_RCC_LPTIM1_FORCE_RESET -#define __LPTIM1_RELEASE_RESET __HAL_RCC_LPTIM1_RELEASE_RESET -#define __LPTIM2_CLK_DISABLE __HAL_RCC_LPTIM2_CLK_DISABLE -#define __LPTIM2_CLK_ENABLE __HAL_RCC_LPTIM2_CLK_ENABLE -#define __LPTIM2_CLK_SLEEP_DISABLE __HAL_RCC_LPTIM2_CLK_SLEEP_DISABLE -#define __LPTIM2_CLK_SLEEP_ENABLE __HAL_RCC_LPTIM2_CLK_SLEEP_ENABLE -#define __LPTIM2_FORCE_RESET __HAL_RCC_LPTIM2_FORCE_RESET -#define __LPTIM2_RELEASE_RESET __HAL_RCC_LPTIM2_RELEASE_RESET -#define __LPUART1_CLK_DISABLE __HAL_RCC_LPUART1_CLK_DISABLE -#define __LPUART1_CLK_ENABLE __HAL_RCC_LPUART1_CLK_ENABLE -#define __LPUART1_CLK_SLEEP_DISABLE __HAL_RCC_LPUART1_CLK_SLEEP_DISABLE -#define __LPUART1_CLK_SLEEP_ENABLE __HAL_RCC_LPUART1_CLK_SLEEP_ENABLE -#define __LPUART1_FORCE_RESET __HAL_RCC_LPUART1_FORCE_RESET -#define __LPUART1_RELEASE_RESET __HAL_RCC_LPUART1_RELEASE_RESET -#define __OPAMP_CLK_DISABLE __HAL_RCC_OPAMP_CLK_DISABLE -#define __OPAMP_CLK_ENABLE __HAL_RCC_OPAMP_CLK_ENABLE -#define __OPAMP_CLK_SLEEP_DISABLE __HAL_RCC_OPAMP_CLK_SLEEP_DISABLE -#define __OPAMP_CLK_SLEEP_ENABLE __HAL_RCC_OPAMP_CLK_SLEEP_ENABLE -#define __OPAMP_FORCE_RESET __HAL_RCC_OPAMP_FORCE_RESET -#define __OPAMP_RELEASE_RESET __HAL_RCC_OPAMP_RELEASE_RESET -#define __OTGFS_CLK_DISABLE __HAL_RCC_OTGFS_CLK_DISABLE -#define __OTGFS_CLK_ENABLE __HAL_RCC_OTGFS_CLK_ENABLE -#define __OTGFS_CLK_SLEEP_DISABLE __HAL_RCC_OTGFS_CLK_SLEEP_DISABLE -#define __OTGFS_CLK_SLEEP_ENABLE __HAL_RCC_OTGFS_CLK_SLEEP_ENABLE -#define __OTGFS_FORCE_RESET __HAL_RCC_OTGFS_FORCE_RESET -#define __OTGFS_RELEASE_RESET __HAL_RCC_OTGFS_RELEASE_RESET -#define __PWR_CLK_DISABLE __HAL_RCC_PWR_CLK_DISABLE -#define __PWR_CLK_ENABLE __HAL_RCC_PWR_CLK_ENABLE -#define __PWR_CLK_SLEEP_DISABLE __HAL_RCC_PWR_CLK_SLEEP_DISABLE -#define __PWR_CLK_SLEEP_ENABLE __HAL_RCC_PWR_CLK_SLEEP_ENABLE -#define __PWR_FORCE_RESET __HAL_RCC_PWR_FORCE_RESET -#define __PWR_RELEASE_RESET __HAL_RCC_PWR_RELEASE_RESET -#define __QSPI_CLK_DISABLE __HAL_RCC_QSPI_CLK_DISABLE -#define __QSPI_CLK_ENABLE __HAL_RCC_QSPI_CLK_ENABLE -#define __QSPI_CLK_SLEEP_DISABLE __HAL_RCC_QSPI_CLK_SLEEP_DISABLE -#define __QSPI_CLK_SLEEP_ENABLE __HAL_RCC_QSPI_CLK_SLEEP_ENABLE -#define __QSPI_FORCE_RESET __HAL_RCC_QSPI_FORCE_RESET -#define __QSPI_RELEASE_RESET __HAL_RCC_QSPI_RELEASE_RESET - -#if defined(STM32WB) -#define __HAL_RCC_QSPI_CLK_DISABLE __HAL_RCC_QUADSPI_CLK_DISABLE -#define __HAL_RCC_QSPI_CLK_ENABLE __HAL_RCC_QUADSPI_CLK_ENABLE -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE __HAL_RCC_QUADSPI_CLK_SLEEP_DISABLE -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE __HAL_RCC_QUADSPI_CLK_SLEEP_ENABLE -#define __HAL_RCC_QSPI_FORCE_RESET __HAL_RCC_QUADSPI_FORCE_RESET -#define __HAL_RCC_QSPI_RELEASE_RESET __HAL_RCC_QUADSPI_RELEASE_RESET -#define __HAL_RCC_QSPI_IS_CLK_ENABLED __HAL_RCC_QUADSPI_IS_CLK_ENABLED -#define __HAL_RCC_QSPI_IS_CLK_DISABLED __HAL_RCC_QUADSPI_IS_CLK_DISABLED -#define __HAL_RCC_QSPI_IS_CLK_SLEEP_ENABLED __HAL_RCC_QUADSPI_IS_CLK_SLEEP_ENABLED -#define __HAL_RCC_QSPI_IS_CLK_SLEEP_DISABLED __HAL_RCC_QUADSPI_IS_CLK_SLEEP_DISABLED -#define QSPI_IRQHandler QUADSPI_IRQHandler -#endif /* __HAL_RCC_QUADSPI_CLK_ENABLE */ - -#define __RNG_CLK_DISABLE __HAL_RCC_RNG_CLK_DISABLE -#define __RNG_CLK_ENABLE __HAL_RCC_RNG_CLK_ENABLE -#define __RNG_CLK_SLEEP_DISABLE __HAL_RCC_RNG_CLK_SLEEP_DISABLE -#define __RNG_CLK_SLEEP_ENABLE __HAL_RCC_RNG_CLK_SLEEP_ENABLE -#define __RNG_FORCE_RESET __HAL_RCC_RNG_FORCE_RESET -#define __RNG_RELEASE_RESET __HAL_RCC_RNG_RELEASE_RESET -#define __SAI1_CLK_DISABLE __HAL_RCC_SAI1_CLK_DISABLE -#define __SAI1_CLK_ENABLE __HAL_RCC_SAI1_CLK_ENABLE -#define __SAI1_CLK_SLEEP_DISABLE __HAL_RCC_SAI1_CLK_SLEEP_DISABLE -#define __SAI1_CLK_SLEEP_ENABLE __HAL_RCC_SAI1_CLK_SLEEP_ENABLE -#define __SAI1_FORCE_RESET __HAL_RCC_SAI1_FORCE_RESET -#define __SAI1_RELEASE_RESET __HAL_RCC_SAI1_RELEASE_RESET -#define __SAI2_CLK_DISABLE __HAL_RCC_SAI2_CLK_DISABLE -#define __SAI2_CLK_ENABLE __HAL_RCC_SAI2_CLK_ENABLE -#define __SAI2_CLK_SLEEP_DISABLE __HAL_RCC_SAI2_CLK_SLEEP_DISABLE -#define __SAI2_CLK_SLEEP_ENABLE __HAL_RCC_SAI2_CLK_SLEEP_ENABLE -#define __SAI2_FORCE_RESET __HAL_RCC_SAI2_FORCE_RESET -#define __SAI2_RELEASE_RESET __HAL_RCC_SAI2_RELEASE_RESET -#define __SDIO_CLK_DISABLE __HAL_RCC_SDIO_CLK_DISABLE -#define __SDIO_CLK_ENABLE __HAL_RCC_SDIO_CLK_ENABLE -#define __SDMMC_CLK_DISABLE __HAL_RCC_SDMMC_CLK_DISABLE -#define __SDMMC_CLK_ENABLE __HAL_RCC_SDMMC_CLK_ENABLE -#define __SDMMC_CLK_SLEEP_DISABLE __HAL_RCC_SDMMC_CLK_SLEEP_DISABLE -#define __SDMMC_CLK_SLEEP_ENABLE __HAL_RCC_SDMMC_CLK_SLEEP_ENABLE -#define __SDMMC_FORCE_RESET __HAL_RCC_SDMMC_FORCE_RESET -#define __SDMMC_RELEASE_RESET __HAL_RCC_SDMMC_RELEASE_RESET -#define __SPI1_CLK_DISABLE __HAL_RCC_SPI1_CLK_DISABLE -#define __SPI1_CLK_ENABLE __HAL_RCC_SPI1_CLK_ENABLE -#define __SPI1_CLK_SLEEP_DISABLE __HAL_RCC_SPI1_CLK_SLEEP_DISABLE -#define __SPI1_CLK_SLEEP_ENABLE __HAL_RCC_SPI1_CLK_SLEEP_ENABLE -#define __SPI1_FORCE_RESET __HAL_RCC_SPI1_FORCE_RESET -#define __SPI1_RELEASE_RESET __HAL_RCC_SPI1_RELEASE_RESET -#define __SPI2_CLK_DISABLE __HAL_RCC_SPI2_CLK_DISABLE -#define __SPI2_CLK_ENABLE __HAL_RCC_SPI2_CLK_ENABLE -#define __SPI2_CLK_SLEEP_DISABLE __HAL_RCC_SPI2_CLK_SLEEP_DISABLE -#define __SPI2_CLK_SLEEP_ENABLE __HAL_RCC_SPI2_CLK_SLEEP_ENABLE -#define __SPI2_FORCE_RESET __HAL_RCC_SPI2_FORCE_RESET -#define __SPI2_RELEASE_RESET __HAL_RCC_SPI2_RELEASE_RESET -#define __SPI3_CLK_DISABLE __HAL_RCC_SPI3_CLK_DISABLE -#define __SPI3_CLK_ENABLE __HAL_RCC_SPI3_CLK_ENABLE -#define __SPI3_CLK_SLEEP_DISABLE __HAL_RCC_SPI3_CLK_SLEEP_DISABLE -#define __SPI3_CLK_SLEEP_ENABLE __HAL_RCC_SPI3_CLK_SLEEP_ENABLE -#define __SPI3_FORCE_RESET __HAL_RCC_SPI3_FORCE_RESET -#define __SPI3_RELEASE_RESET __HAL_RCC_SPI3_RELEASE_RESET -#define __SRAM_CLK_DISABLE __HAL_RCC_SRAM_CLK_DISABLE -#define __SRAM_CLK_ENABLE __HAL_RCC_SRAM_CLK_ENABLE -#define __SRAM1_CLK_SLEEP_DISABLE __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE -#define __SRAM1_CLK_SLEEP_ENABLE __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE -#define __SRAM2_CLK_SLEEP_DISABLE __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE -#define __SRAM2_CLK_SLEEP_ENABLE __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE -#define __SWPMI1_CLK_DISABLE __HAL_RCC_SWPMI1_CLK_DISABLE -#define __SWPMI1_CLK_ENABLE __HAL_RCC_SWPMI1_CLK_ENABLE -#define __SWPMI1_CLK_SLEEP_DISABLE __HAL_RCC_SWPMI1_CLK_SLEEP_DISABLE -#define __SWPMI1_CLK_SLEEP_ENABLE __HAL_RCC_SWPMI1_CLK_SLEEP_ENABLE -#define __SWPMI1_FORCE_RESET __HAL_RCC_SWPMI1_FORCE_RESET -#define __SWPMI1_RELEASE_RESET __HAL_RCC_SWPMI1_RELEASE_RESET -#define __SYSCFG_CLK_DISABLE __HAL_RCC_SYSCFG_CLK_DISABLE -#define __SYSCFG_CLK_ENABLE __HAL_RCC_SYSCFG_CLK_ENABLE -#define __SYSCFG_CLK_SLEEP_DISABLE __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE -#define __SYSCFG_CLK_SLEEP_ENABLE __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE -#define __SYSCFG_FORCE_RESET __HAL_RCC_SYSCFG_FORCE_RESET -#define __SYSCFG_RELEASE_RESET __HAL_RCC_SYSCFG_RELEASE_RESET -#define __TIM1_CLK_DISABLE __HAL_RCC_TIM1_CLK_DISABLE -#define __TIM1_CLK_ENABLE __HAL_RCC_TIM1_CLK_ENABLE -#define __TIM1_CLK_SLEEP_DISABLE __HAL_RCC_TIM1_CLK_SLEEP_DISABLE -#define __TIM1_CLK_SLEEP_ENABLE __HAL_RCC_TIM1_CLK_SLEEP_ENABLE -#define __TIM1_FORCE_RESET __HAL_RCC_TIM1_FORCE_RESET -#define __TIM1_RELEASE_RESET __HAL_RCC_TIM1_RELEASE_RESET -#define __TIM10_CLK_DISABLE __HAL_RCC_TIM10_CLK_DISABLE -#define __TIM10_CLK_ENABLE __HAL_RCC_TIM10_CLK_ENABLE -#define __TIM10_FORCE_RESET __HAL_RCC_TIM10_FORCE_RESET -#define __TIM10_RELEASE_RESET __HAL_RCC_TIM10_RELEASE_RESET -#define __TIM11_CLK_DISABLE __HAL_RCC_TIM11_CLK_DISABLE -#define __TIM11_CLK_ENABLE __HAL_RCC_TIM11_CLK_ENABLE -#define __TIM11_FORCE_RESET __HAL_RCC_TIM11_FORCE_RESET -#define __TIM11_RELEASE_RESET __HAL_RCC_TIM11_RELEASE_RESET -#define __TIM12_CLK_DISABLE __HAL_RCC_TIM12_CLK_DISABLE -#define __TIM12_CLK_ENABLE __HAL_RCC_TIM12_CLK_ENABLE -#define __TIM12_FORCE_RESET __HAL_RCC_TIM12_FORCE_RESET -#define __TIM12_RELEASE_RESET __HAL_RCC_TIM12_RELEASE_RESET -#define __TIM13_CLK_DISABLE __HAL_RCC_TIM13_CLK_DISABLE -#define __TIM13_CLK_ENABLE __HAL_RCC_TIM13_CLK_ENABLE -#define __TIM13_FORCE_RESET __HAL_RCC_TIM13_FORCE_RESET -#define __TIM13_RELEASE_RESET __HAL_RCC_TIM13_RELEASE_RESET -#define __TIM14_CLK_DISABLE __HAL_RCC_TIM14_CLK_DISABLE -#define __TIM14_CLK_ENABLE __HAL_RCC_TIM14_CLK_ENABLE -#define __TIM14_FORCE_RESET __HAL_RCC_TIM14_FORCE_RESET -#define __TIM14_RELEASE_RESET __HAL_RCC_TIM14_RELEASE_RESET -#define __TIM15_CLK_DISABLE __HAL_RCC_TIM15_CLK_DISABLE -#define __TIM15_CLK_ENABLE __HAL_RCC_TIM15_CLK_ENABLE -#define __TIM15_CLK_SLEEP_DISABLE __HAL_RCC_TIM15_CLK_SLEEP_DISABLE -#define __TIM15_CLK_SLEEP_ENABLE __HAL_RCC_TIM15_CLK_SLEEP_ENABLE -#define __TIM15_FORCE_RESET __HAL_RCC_TIM15_FORCE_RESET -#define __TIM15_RELEASE_RESET __HAL_RCC_TIM15_RELEASE_RESET -#define __TIM16_CLK_DISABLE __HAL_RCC_TIM16_CLK_DISABLE -#define __TIM16_CLK_ENABLE __HAL_RCC_TIM16_CLK_ENABLE -#define __TIM16_CLK_SLEEP_DISABLE __HAL_RCC_TIM16_CLK_SLEEP_DISABLE -#define __TIM16_CLK_SLEEP_ENABLE __HAL_RCC_TIM16_CLK_SLEEP_ENABLE -#define __TIM16_FORCE_RESET __HAL_RCC_TIM16_FORCE_RESET -#define __TIM16_RELEASE_RESET __HAL_RCC_TIM16_RELEASE_RESET -#define __TIM17_CLK_DISABLE __HAL_RCC_TIM17_CLK_DISABLE -#define __TIM17_CLK_ENABLE __HAL_RCC_TIM17_CLK_ENABLE -#define __TIM17_CLK_SLEEP_DISABLE __HAL_RCC_TIM17_CLK_SLEEP_DISABLE -#define __TIM17_CLK_SLEEP_ENABLE __HAL_RCC_TIM17_CLK_SLEEP_ENABLE -#define __TIM17_FORCE_RESET __HAL_RCC_TIM17_FORCE_RESET -#define __TIM17_RELEASE_RESET __HAL_RCC_TIM17_RELEASE_RESET -#define __TIM2_CLK_DISABLE __HAL_RCC_TIM2_CLK_DISABLE -#define __TIM2_CLK_ENABLE __HAL_RCC_TIM2_CLK_ENABLE -#define __TIM2_CLK_SLEEP_DISABLE __HAL_RCC_TIM2_CLK_SLEEP_DISABLE -#define __TIM2_CLK_SLEEP_ENABLE __HAL_RCC_TIM2_CLK_SLEEP_ENABLE -#define __TIM2_FORCE_RESET __HAL_RCC_TIM2_FORCE_RESET -#define __TIM2_RELEASE_RESET __HAL_RCC_TIM2_RELEASE_RESET -#define __TIM3_CLK_DISABLE __HAL_RCC_TIM3_CLK_DISABLE -#define __TIM3_CLK_ENABLE __HAL_RCC_TIM3_CLK_ENABLE -#define __TIM3_CLK_SLEEP_DISABLE __HAL_RCC_TIM3_CLK_SLEEP_DISABLE -#define __TIM3_CLK_SLEEP_ENABLE __HAL_RCC_TIM3_CLK_SLEEP_ENABLE -#define __TIM3_FORCE_RESET __HAL_RCC_TIM3_FORCE_RESET -#define __TIM3_RELEASE_RESET __HAL_RCC_TIM3_RELEASE_RESET -#define __TIM4_CLK_DISABLE __HAL_RCC_TIM4_CLK_DISABLE -#define __TIM4_CLK_ENABLE __HAL_RCC_TIM4_CLK_ENABLE -#define __TIM4_CLK_SLEEP_DISABLE __HAL_RCC_TIM4_CLK_SLEEP_DISABLE -#define __TIM4_CLK_SLEEP_ENABLE __HAL_RCC_TIM4_CLK_SLEEP_ENABLE -#define __TIM4_FORCE_RESET __HAL_RCC_TIM4_FORCE_RESET -#define __TIM4_RELEASE_RESET __HAL_RCC_TIM4_RELEASE_RESET -#define __TIM5_CLK_DISABLE __HAL_RCC_TIM5_CLK_DISABLE -#define __TIM5_CLK_ENABLE __HAL_RCC_TIM5_CLK_ENABLE -#define __TIM5_CLK_SLEEP_DISABLE __HAL_RCC_TIM5_CLK_SLEEP_DISABLE -#define __TIM5_CLK_SLEEP_ENABLE __HAL_RCC_TIM5_CLK_SLEEP_ENABLE -#define __TIM5_FORCE_RESET __HAL_RCC_TIM5_FORCE_RESET -#define __TIM5_RELEASE_RESET __HAL_RCC_TIM5_RELEASE_RESET -#define __TIM6_CLK_DISABLE __HAL_RCC_TIM6_CLK_DISABLE -#define __TIM6_CLK_ENABLE __HAL_RCC_TIM6_CLK_ENABLE -#define __TIM6_CLK_SLEEP_DISABLE __HAL_RCC_TIM6_CLK_SLEEP_DISABLE -#define __TIM6_CLK_SLEEP_ENABLE __HAL_RCC_TIM6_CLK_SLEEP_ENABLE -#define __TIM6_FORCE_RESET __HAL_RCC_TIM6_FORCE_RESET -#define __TIM6_RELEASE_RESET __HAL_RCC_TIM6_RELEASE_RESET -#define __TIM7_CLK_DISABLE __HAL_RCC_TIM7_CLK_DISABLE -#define __TIM7_CLK_ENABLE __HAL_RCC_TIM7_CLK_ENABLE -#define __TIM7_CLK_SLEEP_DISABLE __HAL_RCC_TIM7_CLK_SLEEP_DISABLE -#define __TIM7_CLK_SLEEP_ENABLE __HAL_RCC_TIM7_CLK_SLEEP_ENABLE -#define __TIM7_FORCE_RESET __HAL_RCC_TIM7_FORCE_RESET -#define __TIM7_RELEASE_RESET __HAL_RCC_TIM7_RELEASE_RESET -#define __TIM8_CLK_DISABLE __HAL_RCC_TIM8_CLK_DISABLE -#define __TIM8_CLK_ENABLE __HAL_RCC_TIM8_CLK_ENABLE -#define __TIM8_CLK_SLEEP_DISABLE __HAL_RCC_TIM8_CLK_SLEEP_DISABLE -#define __TIM8_CLK_SLEEP_ENABLE __HAL_RCC_TIM8_CLK_SLEEP_ENABLE -#define __TIM8_FORCE_RESET __HAL_RCC_TIM8_FORCE_RESET -#define __TIM8_RELEASE_RESET __HAL_RCC_TIM8_RELEASE_RESET -#define __TIM9_CLK_DISABLE __HAL_RCC_TIM9_CLK_DISABLE -#define __TIM9_CLK_ENABLE __HAL_RCC_TIM9_CLK_ENABLE -#define __TIM9_FORCE_RESET __HAL_RCC_TIM9_FORCE_RESET -#define __TIM9_RELEASE_RESET __HAL_RCC_TIM9_RELEASE_RESET -#define __TSC_CLK_DISABLE __HAL_RCC_TSC_CLK_DISABLE -#define __TSC_CLK_ENABLE __HAL_RCC_TSC_CLK_ENABLE -#define __TSC_CLK_SLEEP_DISABLE __HAL_RCC_TSC_CLK_SLEEP_DISABLE -#define __TSC_CLK_SLEEP_ENABLE __HAL_RCC_TSC_CLK_SLEEP_ENABLE -#define __TSC_FORCE_RESET __HAL_RCC_TSC_FORCE_RESET -#define __TSC_RELEASE_RESET __HAL_RCC_TSC_RELEASE_RESET -#define __UART4_CLK_DISABLE __HAL_RCC_UART4_CLK_DISABLE -#define __UART4_CLK_ENABLE __HAL_RCC_UART4_CLK_ENABLE -#define __UART4_CLK_SLEEP_DISABLE __HAL_RCC_UART4_CLK_SLEEP_DISABLE -#define __UART4_CLK_SLEEP_ENABLE __HAL_RCC_UART4_CLK_SLEEP_ENABLE -#define __UART4_FORCE_RESET __HAL_RCC_UART4_FORCE_RESET -#define __UART4_RELEASE_RESET __HAL_RCC_UART4_RELEASE_RESET -#define __UART5_CLK_DISABLE __HAL_RCC_UART5_CLK_DISABLE -#define __UART5_CLK_ENABLE __HAL_RCC_UART5_CLK_ENABLE -#define __UART5_CLK_SLEEP_DISABLE __HAL_RCC_UART5_CLK_SLEEP_DISABLE -#define __UART5_CLK_SLEEP_ENABLE __HAL_RCC_UART5_CLK_SLEEP_ENABLE -#define __UART5_FORCE_RESET __HAL_RCC_UART5_FORCE_RESET -#define __UART5_RELEASE_RESET __HAL_RCC_UART5_RELEASE_RESET -#define __USART1_CLK_DISABLE __HAL_RCC_USART1_CLK_DISABLE -#define __USART1_CLK_ENABLE __HAL_RCC_USART1_CLK_ENABLE -#define __USART1_CLK_SLEEP_DISABLE __HAL_RCC_USART1_CLK_SLEEP_DISABLE -#define __USART1_CLK_SLEEP_ENABLE __HAL_RCC_USART1_CLK_SLEEP_ENABLE -#define __USART1_FORCE_RESET __HAL_RCC_USART1_FORCE_RESET -#define __USART1_RELEASE_RESET __HAL_RCC_USART1_RELEASE_RESET -#define __USART2_CLK_DISABLE __HAL_RCC_USART2_CLK_DISABLE -#define __USART2_CLK_ENABLE __HAL_RCC_USART2_CLK_ENABLE -#define __USART2_CLK_SLEEP_DISABLE __HAL_RCC_USART2_CLK_SLEEP_DISABLE -#define __USART2_CLK_SLEEP_ENABLE __HAL_RCC_USART2_CLK_SLEEP_ENABLE -#define __USART2_FORCE_RESET __HAL_RCC_USART2_FORCE_RESET -#define __USART2_RELEASE_RESET __HAL_RCC_USART2_RELEASE_RESET -#define __USART3_CLK_DISABLE __HAL_RCC_USART3_CLK_DISABLE -#define __USART3_CLK_ENABLE __HAL_RCC_USART3_CLK_ENABLE -#define __USART3_CLK_SLEEP_DISABLE __HAL_RCC_USART3_CLK_SLEEP_DISABLE -#define __USART3_CLK_SLEEP_ENABLE __HAL_RCC_USART3_CLK_SLEEP_ENABLE -#define __USART3_FORCE_RESET __HAL_RCC_USART3_FORCE_RESET -#define __USART3_RELEASE_RESET __HAL_RCC_USART3_RELEASE_RESET -#define __USART4_CLK_DISABLE __HAL_RCC_UART4_CLK_DISABLE -#define __USART4_CLK_ENABLE __HAL_RCC_UART4_CLK_ENABLE -#define __USART4_CLK_SLEEP_ENABLE __HAL_RCC_UART4_CLK_SLEEP_ENABLE -#define __USART4_CLK_SLEEP_DISABLE __HAL_RCC_UART4_CLK_SLEEP_DISABLE -#define __USART4_FORCE_RESET __HAL_RCC_UART4_FORCE_RESET -#define __USART4_RELEASE_RESET __HAL_RCC_UART4_RELEASE_RESET -#define __USART5_CLK_DISABLE __HAL_RCC_UART5_CLK_DISABLE -#define __USART5_CLK_ENABLE __HAL_RCC_UART5_CLK_ENABLE -#define __USART5_CLK_SLEEP_ENABLE __HAL_RCC_UART5_CLK_SLEEP_ENABLE -#define __USART5_CLK_SLEEP_DISABLE __HAL_RCC_UART5_CLK_SLEEP_DISABLE -#define __USART5_FORCE_RESET __HAL_RCC_UART5_FORCE_RESET -#define __USART5_RELEASE_RESET __HAL_RCC_UART5_RELEASE_RESET -#define __USART7_CLK_DISABLE __HAL_RCC_UART7_CLK_DISABLE -#define __USART7_CLK_ENABLE __HAL_RCC_UART7_CLK_ENABLE -#define __USART7_FORCE_RESET __HAL_RCC_UART7_FORCE_RESET -#define __USART7_RELEASE_RESET __HAL_RCC_UART7_RELEASE_RESET -#define __USART8_CLK_DISABLE __HAL_RCC_UART8_CLK_DISABLE -#define __USART8_CLK_ENABLE __HAL_RCC_UART8_CLK_ENABLE -#define __USART8_FORCE_RESET __HAL_RCC_UART8_FORCE_RESET -#define __USART8_RELEASE_RESET __HAL_RCC_UART8_RELEASE_RESET -#define __USB_CLK_DISABLE __HAL_RCC_USB_CLK_DISABLE -#define __USB_CLK_ENABLE __HAL_RCC_USB_CLK_ENABLE -#define __USB_FORCE_RESET __HAL_RCC_USB_FORCE_RESET -#define __USB_CLK_SLEEP_ENABLE __HAL_RCC_USB_CLK_SLEEP_ENABLE -#define __USB_CLK_SLEEP_DISABLE __HAL_RCC_USB_CLK_SLEEP_DISABLE -#define __USB_OTG_FS_CLK_DISABLE __HAL_RCC_USB_OTG_FS_CLK_DISABLE -#define __USB_OTG_FS_CLK_ENABLE __HAL_RCC_USB_OTG_FS_CLK_ENABLE -#define __USB_RELEASE_RESET __HAL_RCC_USB_RELEASE_RESET - -#if defined(STM32H7) -#define __HAL_RCC_WWDG_CLK_DISABLE __HAL_RCC_WWDG1_CLK_DISABLE -#define __HAL_RCC_WWDG_CLK_ENABLE __HAL_RCC_WWDG1_CLK_ENABLE -#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG1_CLK_SLEEP_DISABLE -#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG1_CLK_SLEEP_ENABLE - -#define __HAL_RCC_WWDG_FORCE_RESET ((void)0U) /* Not available on the STM32H7*/ -#define __HAL_RCC_WWDG_RELEASE_RESET ((void)0U) /* Not available on the STM32H7*/ - - -#define __HAL_RCC_WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG1_IS_CLK_ENABLED -#define __HAL_RCC_WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG1_IS_CLK_DISABLED -#define RCC_SPI4CLKSOURCE_D2PCLK1 RCC_SPI4CLKSOURCE_D2PCLK2 -#define RCC_SPI5CLKSOURCE_D2PCLK1 RCC_SPI5CLKSOURCE_D2PCLK2 -#define RCC_SPI45CLKSOURCE_D2PCLK1 RCC_SPI45CLKSOURCE_D2PCLK2 -#define RCC_SPI45CLKSOURCE_CDPCLK1 RCC_SPI45CLKSOURCE_CDPCLK2 -#define RCC_SPI45CLKSOURCE_PCLK1 RCC_SPI45CLKSOURCE_PCLK2 -#endif - -#define __WWDG_CLK_DISABLE __HAL_RCC_WWDG_CLK_DISABLE -#define __WWDG_CLK_ENABLE __HAL_RCC_WWDG_CLK_ENABLE -#define __WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG_CLK_SLEEP_DISABLE -#define __WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG_CLK_SLEEP_ENABLE -#define __WWDG_FORCE_RESET __HAL_RCC_WWDG_FORCE_RESET -#define __WWDG_RELEASE_RESET __HAL_RCC_WWDG_RELEASE_RESET - -#define __TIM21_CLK_ENABLE __HAL_RCC_TIM21_CLK_ENABLE -#define __TIM21_CLK_DISABLE __HAL_RCC_TIM21_CLK_DISABLE -#define __TIM21_FORCE_RESET __HAL_RCC_TIM21_FORCE_RESET -#define __TIM21_RELEASE_RESET __HAL_RCC_TIM21_RELEASE_RESET -#define __TIM21_CLK_SLEEP_ENABLE __HAL_RCC_TIM21_CLK_SLEEP_ENABLE -#define __TIM21_CLK_SLEEP_DISABLE __HAL_RCC_TIM21_CLK_SLEEP_DISABLE -#define __TIM22_CLK_ENABLE __HAL_RCC_TIM22_CLK_ENABLE -#define __TIM22_CLK_DISABLE __HAL_RCC_TIM22_CLK_DISABLE -#define __TIM22_FORCE_RESET __HAL_RCC_TIM22_FORCE_RESET -#define __TIM22_RELEASE_RESET __HAL_RCC_TIM22_RELEASE_RESET -#define __TIM22_CLK_SLEEP_ENABLE __HAL_RCC_TIM22_CLK_SLEEP_ENABLE -#define __TIM22_CLK_SLEEP_DISABLE __HAL_RCC_TIM22_CLK_SLEEP_DISABLE -#define __CRS_CLK_DISABLE __HAL_RCC_CRS_CLK_DISABLE -#define __CRS_CLK_ENABLE __HAL_RCC_CRS_CLK_ENABLE -#define __CRS_CLK_SLEEP_DISABLE __HAL_RCC_CRS_CLK_SLEEP_DISABLE -#define __CRS_CLK_SLEEP_ENABLE __HAL_RCC_CRS_CLK_SLEEP_ENABLE -#define __CRS_FORCE_RESET __HAL_RCC_CRS_FORCE_RESET -#define __CRS_RELEASE_RESET __HAL_RCC_CRS_RELEASE_RESET -#define __RCC_BACKUPRESET_FORCE __HAL_RCC_BACKUPRESET_FORCE -#define __RCC_BACKUPRESET_RELEASE __HAL_RCC_BACKUPRESET_RELEASE - -#define __USB_OTG_FS_FORCE_RESET __HAL_RCC_USB_OTG_FS_FORCE_RESET -#define __USB_OTG_FS_RELEASE_RESET __HAL_RCC_USB_OTG_FS_RELEASE_RESET -#define __USB_OTG_FS_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE -#define __USB_OTG_FS_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE -#define __USB_OTG_HS_CLK_DISABLE __HAL_RCC_USB_OTG_HS_CLK_DISABLE -#define __USB_OTG_HS_CLK_ENABLE __HAL_RCC_USB_OTG_HS_CLK_ENABLE -#define __USB_OTG_HS_ULPI_CLK_ENABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE -#define __USB_OTG_HS_ULPI_CLK_DISABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE -#define __TIM9_CLK_SLEEP_ENABLE __HAL_RCC_TIM9_CLK_SLEEP_ENABLE -#define __TIM9_CLK_SLEEP_DISABLE __HAL_RCC_TIM9_CLK_SLEEP_DISABLE -#define __TIM10_CLK_SLEEP_ENABLE __HAL_RCC_TIM10_CLK_SLEEP_ENABLE -#define __TIM10_CLK_SLEEP_DISABLE __HAL_RCC_TIM10_CLK_SLEEP_DISABLE -#define __TIM11_CLK_SLEEP_ENABLE __HAL_RCC_TIM11_CLK_SLEEP_ENABLE -#define __TIM11_CLK_SLEEP_DISABLE __HAL_RCC_TIM11_CLK_SLEEP_DISABLE -#define __ETHMACPTP_CLK_SLEEP_ENABLE __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE -#define __ETHMACPTP_CLK_SLEEP_DISABLE __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE -#define __ETHMACPTP_CLK_ENABLE __HAL_RCC_ETHMACPTP_CLK_ENABLE -#define __ETHMACPTP_CLK_DISABLE __HAL_RCC_ETHMACPTP_CLK_DISABLE -#define __HASH_CLK_ENABLE __HAL_RCC_HASH_CLK_ENABLE -#define __HASH_FORCE_RESET __HAL_RCC_HASH_FORCE_RESET -#define __HASH_RELEASE_RESET __HAL_RCC_HASH_RELEASE_RESET -#define __HASH_CLK_SLEEP_ENABLE __HAL_RCC_HASH_CLK_SLEEP_ENABLE -#define __HASH_CLK_SLEEP_DISABLE __HAL_RCC_HASH_CLK_SLEEP_DISABLE -#define __HASH_CLK_DISABLE __HAL_RCC_HASH_CLK_DISABLE -#define __SPI5_CLK_ENABLE __HAL_RCC_SPI5_CLK_ENABLE -#define __SPI5_CLK_DISABLE __HAL_RCC_SPI5_CLK_DISABLE -#define __SPI5_FORCE_RESET __HAL_RCC_SPI5_FORCE_RESET -#define __SPI5_RELEASE_RESET __HAL_RCC_SPI5_RELEASE_RESET -#define __SPI5_CLK_SLEEP_ENABLE __HAL_RCC_SPI5_CLK_SLEEP_ENABLE -#define __SPI5_CLK_SLEEP_DISABLE __HAL_RCC_SPI5_CLK_SLEEP_DISABLE -#define __SPI6_CLK_ENABLE __HAL_RCC_SPI6_CLK_ENABLE -#define __SPI6_CLK_DISABLE __HAL_RCC_SPI6_CLK_DISABLE -#define __SPI6_FORCE_RESET __HAL_RCC_SPI6_FORCE_RESET -#define __SPI6_RELEASE_RESET __HAL_RCC_SPI6_RELEASE_RESET -#define __SPI6_CLK_SLEEP_ENABLE __HAL_RCC_SPI6_CLK_SLEEP_ENABLE -#define __SPI6_CLK_SLEEP_DISABLE __HAL_RCC_SPI6_CLK_SLEEP_DISABLE -#define __LTDC_CLK_ENABLE __HAL_RCC_LTDC_CLK_ENABLE -#define __LTDC_CLK_DISABLE __HAL_RCC_LTDC_CLK_DISABLE -#define __LTDC_FORCE_RESET __HAL_RCC_LTDC_FORCE_RESET -#define __LTDC_RELEASE_RESET __HAL_RCC_LTDC_RELEASE_RESET -#define __LTDC_CLK_SLEEP_ENABLE __HAL_RCC_LTDC_CLK_SLEEP_ENABLE -#define __ETHMAC_CLK_SLEEP_ENABLE __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE -#define __ETHMAC_CLK_SLEEP_DISABLE __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE -#define __ETHMACTX_CLK_SLEEP_ENABLE __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE -#define __ETHMACTX_CLK_SLEEP_DISABLE __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE -#define __ETHMACRX_CLK_SLEEP_ENABLE __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE -#define __ETHMACRX_CLK_SLEEP_DISABLE __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE -#define __TIM12_CLK_SLEEP_ENABLE __HAL_RCC_TIM12_CLK_SLEEP_ENABLE -#define __TIM12_CLK_SLEEP_DISABLE __HAL_RCC_TIM12_CLK_SLEEP_DISABLE -#define __TIM13_CLK_SLEEP_ENABLE __HAL_RCC_TIM13_CLK_SLEEP_ENABLE -#define __TIM13_CLK_SLEEP_DISABLE __HAL_RCC_TIM13_CLK_SLEEP_DISABLE -#define __TIM14_CLK_SLEEP_ENABLE __HAL_RCC_TIM14_CLK_SLEEP_ENABLE -#define __TIM14_CLK_SLEEP_DISABLE __HAL_RCC_TIM14_CLK_SLEEP_DISABLE -#define __BKPSRAM_CLK_ENABLE __HAL_RCC_BKPSRAM_CLK_ENABLE -#define __BKPSRAM_CLK_DISABLE __HAL_RCC_BKPSRAM_CLK_DISABLE -#define __BKPSRAM_CLK_SLEEP_ENABLE __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE -#define __BKPSRAM_CLK_SLEEP_DISABLE __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE -#define __CCMDATARAMEN_CLK_ENABLE __HAL_RCC_CCMDATARAMEN_CLK_ENABLE -#define __CCMDATARAMEN_CLK_DISABLE __HAL_RCC_CCMDATARAMEN_CLK_DISABLE -#define __USART6_CLK_ENABLE __HAL_RCC_USART6_CLK_ENABLE -#define __USART6_CLK_DISABLE __HAL_RCC_USART6_CLK_DISABLE -#define __USART6_FORCE_RESET __HAL_RCC_USART6_FORCE_RESET -#define __USART6_RELEASE_RESET __HAL_RCC_USART6_RELEASE_RESET -#define __USART6_CLK_SLEEP_ENABLE __HAL_RCC_USART6_CLK_SLEEP_ENABLE -#define __USART6_CLK_SLEEP_DISABLE __HAL_RCC_USART6_CLK_SLEEP_DISABLE -#define __SPI4_CLK_ENABLE __HAL_RCC_SPI4_CLK_ENABLE -#define __SPI4_CLK_DISABLE __HAL_RCC_SPI4_CLK_DISABLE -#define __SPI4_FORCE_RESET __HAL_RCC_SPI4_FORCE_RESET -#define __SPI4_RELEASE_RESET __HAL_RCC_SPI4_RELEASE_RESET -#define __SPI4_CLK_SLEEP_ENABLE __HAL_RCC_SPI4_CLK_SLEEP_ENABLE -#define __SPI4_CLK_SLEEP_DISABLE __HAL_RCC_SPI4_CLK_SLEEP_DISABLE -#define __GPIOI_CLK_ENABLE __HAL_RCC_GPIOI_CLK_ENABLE -#define __GPIOI_CLK_DISABLE __HAL_RCC_GPIOI_CLK_DISABLE -#define __GPIOI_FORCE_RESET __HAL_RCC_GPIOI_FORCE_RESET -#define __GPIOI_RELEASE_RESET __HAL_RCC_GPIOI_RELEASE_RESET -#define __GPIOI_CLK_SLEEP_ENABLE __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE -#define __GPIOI_CLK_SLEEP_DISABLE __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE -#define __GPIOJ_CLK_ENABLE __HAL_RCC_GPIOJ_CLK_ENABLE -#define __GPIOJ_CLK_DISABLE __HAL_RCC_GPIOJ_CLK_DISABLE -#define __GPIOJ_FORCE_RESET __HAL_RCC_GPIOJ_FORCE_RESET -#define __GPIOJ_RELEASE_RESET __HAL_RCC_GPIOJ_RELEASE_RESET -#define __GPIOJ_CLK_SLEEP_ENABLE __HAL_RCC_GPIOJ_CLK_SLEEP_ENABLE -#define __GPIOJ_CLK_SLEEP_DISABLE __HAL_RCC_GPIOJ_CLK_SLEEP_DISABLE -#define __GPIOK_CLK_ENABLE __HAL_RCC_GPIOK_CLK_ENABLE -#define __GPIOK_CLK_DISABLE __HAL_RCC_GPIOK_CLK_DISABLE -#define __GPIOK_RELEASE_RESET __HAL_RCC_GPIOK_RELEASE_RESET -#define __GPIOK_CLK_SLEEP_ENABLE __HAL_RCC_GPIOK_CLK_SLEEP_ENABLE -#define __GPIOK_CLK_SLEEP_DISABLE __HAL_RCC_GPIOK_CLK_SLEEP_DISABLE -#define __ETH_CLK_ENABLE __HAL_RCC_ETH_CLK_ENABLE -#define __ETH_CLK_DISABLE __HAL_RCC_ETH_CLK_DISABLE -#define __DCMI_CLK_ENABLE __HAL_RCC_DCMI_CLK_ENABLE -#define __DCMI_CLK_DISABLE __HAL_RCC_DCMI_CLK_DISABLE -#define __DCMI_FORCE_RESET __HAL_RCC_DCMI_FORCE_RESET -#define __DCMI_RELEASE_RESET __HAL_RCC_DCMI_RELEASE_RESET -#define __DCMI_CLK_SLEEP_ENABLE __HAL_RCC_DCMI_CLK_SLEEP_ENABLE -#define __DCMI_CLK_SLEEP_DISABLE __HAL_RCC_DCMI_CLK_SLEEP_DISABLE -#define __UART7_CLK_ENABLE __HAL_RCC_UART7_CLK_ENABLE -#define __UART7_CLK_DISABLE __HAL_RCC_UART7_CLK_DISABLE -#define __UART7_RELEASE_RESET __HAL_RCC_UART7_RELEASE_RESET -#define __UART7_FORCE_RESET __HAL_RCC_UART7_FORCE_RESET -#define __UART7_CLK_SLEEP_ENABLE __HAL_RCC_UART7_CLK_SLEEP_ENABLE -#define __UART7_CLK_SLEEP_DISABLE __HAL_RCC_UART7_CLK_SLEEP_DISABLE -#define __UART8_CLK_ENABLE __HAL_RCC_UART8_CLK_ENABLE -#define __UART8_CLK_DISABLE __HAL_RCC_UART8_CLK_DISABLE -#define __UART8_FORCE_RESET __HAL_RCC_UART8_FORCE_RESET -#define __UART8_RELEASE_RESET __HAL_RCC_UART8_RELEASE_RESET -#define __UART8_CLK_SLEEP_ENABLE __HAL_RCC_UART8_CLK_SLEEP_ENABLE -#define __UART8_CLK_SLEEP_DISABLE __HAL_RCC_UART8_CLK_SLEEP_DISABLE -#define __OTGHS_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE -#define __OTGHS_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE -#define __OTGHS_FORCE_RESET __HAL_RCC_USB_OTG_HS_FORCE_RESET -#define __OTGHS_RELEASE_RESET __HAL_RCC_USB_OTG_HS_RELEASE_RESET -#define __OTGHSULPI_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE -#define __OTGHSULPI_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE -#define __HAL_RCC_OTGHS_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE -#define __HAL_RCC_OTGHS_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE -#define __HAL_RCC_OTGHS_IS_CLK_SLEEP_ENABLED __HAL_RCC_USB_OTG_HS_IS_CLK_SLEEP_ENABLED -#define __HAL_RCC_OTGHS_IS_CLK_SLEEP_DISABLED __HAL_RCC_USB_OTG_HS_IS_CLK_SLEEP_DISABLED -#define __HAL_RCC_OTGHS_FORCE_RESET __HAL_RCC_USB_OTG_HS_FORCE_RESET -#define __HAL_RCC_OTGHS_RELEASE_RESET __HAL_RCC_USB_OTG_HS_RELEASE_RESET -#define __HAL_RCC_OTGHSULPI_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE -#define __HAL_RCC_OTGHSULPI_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE -#define __HAL_RCC_OTGHSULPI_IS_CLK_SLEEP_ENABLED __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_SLEEP_ENABLED -#define __HAL_RCC_OTGHSULPI_IS_CLK_SLEEP_DISABLED __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_SLEEP_DISABLED -#define __SRAM3_CLK_SLEEP_ENABLE __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE -#define __CAN2_CLK_SLEEP_ENABLE __HAL_RCC_CAN2_CLK_SLEEP_ENABLE -#define __CAN2_CLK_SLEEP_DISABLE __HAL_RCC_CAN2_CLK_SLEEP_DISABLE -#define __DAC_CLK_SLEEP_ENABLE __HAL_RCC_DAC_CLK_SLEEP_ENABLE -#define __DAC_CLK_SLEEP_DISABLE __HAL_RCC_DAC_CLK_SLEEP_DISABLE -#define __ADC2_CLK_SLEEP_ENABLE __HAL_RCC_ADC2_CLK_SLEEP_ENABLE -#define __ADC2_CLK_SLEEP_DISABLE __HAL_RCC_ADC2_CLK_SLEEP_DISABLE -#define __ADC3_CLK_SLEEP_ENABLE __HAL_RCC_ADC3_CLK_SLEEP_ENABLE -#define __ADC3_CLK_SLEEP_DISABLE __HAL_RCC_ADC3_CLK_SLEEP_DISABLE -#define __FSMC_FORCE_RESET __HAL_RCC_FSMC_FORCE_RESET -#define __FSMC_RELEASE_RESET __HAL_RCC_FSMC_RELEASE_RESET -#define __FSMC_CLK_SLEEP_ENABLE __HAL_RCC_FSMC_CLK_SLEEP_ENABLE -#define __FSMC_CLK_SLEEP_DISABLE __HAL_RCC_FSMC_CLK_SLEEP_DISABLE -#define __SDIO_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET -#define __SDIO_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET -#define __SDIO_CLK_SLEEP_DISABLE __HAL_RCC_SDIO_CLK_SLEEP_DISABLE -#define __SDIO_CLK_SLEEP_ENABLE __HAL_RCC_SDIO_CLK_SLEEP_ENABLE -#define __DMA2D_CLK_ENABLE __HAL_RCC_DMA2D_CLK_ENABLE -#define __DMA2D_CLK_DISABLE __HAL_RCC_DMA2D_CLK_DISABLE -#define __DMA2D_FORCE_RESET __HAL_RCC_DMA2D_FORCE_RESET -#define __DMA2D_RELEASE_RESET __HAL_RCC_DMA2D_RELEASE_RESET -#define __DMA2D_CLK_SLEEP_ENABLE __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE -#define __DMA2D_CLK_SLEEP_DISABLE __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE - -/* alias define maintained for legacy */ -#define __HAL_RCC_OTGFS_FORCE_RESET __HAL_RCC_USB_OTG_FS_FORCE_RESET -#define __HAL_RCC_OTGFS_RELEASE_RESET __HAL_RCC_USB_OTG_FS_RELEASE_RESET - -#define __ADC12_CLK_ENABLE __HAL_RCC_ADC12_CLK_ENABLE -#define __ADC12_CLK_DISABLE __HAL_RCC_ADC12_CLK_DISABLE -#define __ADC34_CLK_ENABLE __HAL_RCC_ADC34_CLK_ENABLE -#define __ADC34_CLK_DISABLE __HAL_RCC_ADC34_CLK_DISABLE -#define __DAC2_CLK_ENABLE __HAL_RCC_DAC2_CLK_ENABLE -#define __DAC2_CLK_DISABLE __HAL_RCC_DAC2_CLK_DISABLE -#define __TIM18_CLK_ENABLE __HAL_RCC_TIM18_CLK_ENABLE -#define __TIM18_CLK_DISABLE __HAL_RCC_TIM18_CLK_DISABLE -#define __TIM19_CLK_ENABLE __HAL_RCC_TIM19_CLK_ENABLE -#define __TIM19_CLK_DISABLE __HAL_RCC_TIM19_CLK_DISABLE -#define __TIM20_CLK_ENABLE __HAL_RCC_TIM20_CLK_ENABLE -#define __TIM20_CLK_DISABLE __HAL_RCC_TIM20_CLK_DISABLE -#define __HRTIM1_CLK_ENABLE __HAL_RCC_HRTIM1_CLK_ENABLE -#define __HRTIM1_CLK_DISABLE __HAL_RCC_HRTIM1_CLK_DISABLE -#define __SDADC1_CLK_ENABLE __HAL_RCC_SDADC1_CLK_ENABLE -#define __SDADC2_CLK_ENABLE __HAL_RCC_SDADC2_CLK_ENABLE -#define __SDADC3_CLK_ENABLE __HAL_RCC_SDADC3_CLK_ENABLE -#define __SDADC1_CLK_DISABLE __HAL_RCC_SDADC1_CLK_DISABLE -#define __SDADC2_CLK_DISABLE __HAL_RCC_SDADC2_CLK_DISABLE -#define __SDADC3_CLK_DISABLE __HAL_RCC_SDADC3_CLK_DISABLE - -#define __ADC12_FORCE_RESET __HAL_RCC_ADC12_FORCE_RESET -#define __ADC12_RELEASE_RESET __HAL_RCC_ADC12_RELEASE_RESET -#define __ADC34_FORCE_RESET __HAL_RCC_ADC34_FORCE_RESET -#define __ADC34_RELEASE_RESET __HAL_RCC_ADC34_RELEASE_RESET -#define __DAC2_FORCE_RESET __HAL_RCC_DAC2_FORCE_RESET -#define __DAC2_RELEASE_RESET __HAL_RCC_DAC2_RELEASE_RESET -#define __TIM18_FORCE_RESET __HAL_RCC_TIM18_FORCE_RESET -#define __TIM18_RELEASE_RESET __HAL_RCC_TIM18_RELEASE_RESET -#define __TIM19_FORCE_RESET __HAL_RCC_TIM19_FORCE_RESET -#define __TIM19_RELEASE_RESET __HAL_RCC_TIM19_RELEASE_RESET -#define __TIM20_FORCE_RESET __HAL_RCC_TIM20_FORCE_RESET -#define __TIM20_RELEASE_RESET __HAL_RCC_TIM20_RELEASE_RESET -#define __HRTIM1_FORCE_RESET __HAL_RCC_HRTIM1_FORCE_RESET -#define __HRTIM1_RELEASE_RESET __HAL_RCC_HRTIM1_RELEASE_RESET -#define __SDADC1_FORCE_RESET __HAL_RCC_SDADC1_FORCE_RESET -#define __SDADC2_FORCE_RESET __HAL_RCC_SDADC2_FORCE_RESET -#define __SDADC3_FORCE_RESET __HAL_RCC_SDADC3_FORCE_RESET -#define __SDADC1_RELEASE_RESET __HAL_RCC_SDADC1_RELEASE_RESET -#define __SDADC2_RELEASE_RESET __HAL_RCC_SDADC2_RELEASE_RESET -#define __SDADC3_RELEASE_RESET __HAL_RCC_SDADC3_RELEASE_RESET - -#define __ADC1_IS_CLK_ENABLED __HAL_RCC_ADC1_IS_CLK_ENABLED -#define __ADC1_IS_CLK_DISABLED __HAL_RCC_ADC1_IS_CLK_DISABLED -#define __ADC12_IS_CLK_ENABLED __HAL_RCC_ADC12_IS_CLK_ENABLED -#define __ADC12_IS_CLK_DISABLED __HAL_RCC_ADC12_IS_CLK_DISABLED -#define __ADC34_IS_CLK_ENABLED __HAL_RCC_ADC34_IS_CLK_ENABLED -#define __ADC34_IS_CLK_DISABLED __HAL_RCC_ADC34_IS_CLK_DISABLED -#define __CEC_IS_CLK_ENABLED __HAL_RCC_CEC_IS_CLK_ENABLED -#define __CEC_IS_CLK_DISABLED __HAL_RCC_CEC_IS_CLK_DISABLED -#define __CRC_IS_CLK_ENABLED __HAL_RCC_CRC_IS_CLK_ENABLED -#define __CRC_IS_CLK_DISABLED __HAL_RCC_CRC_IS_CLK_DISABLED -#define __DAC1_IS_CLK_ENABLED __HAL_RCC_DAC1_IS_CLK_ENABLED -#define __DAC1_IS_CLK_DISABLED __HAL_RCC_DAC1_IS_CLK_DISABLED -#define __DAC2_IS_CLK_ENABLED __HAL_RCC_DAC2_IS_CLK_ENABLED -#define __DAC2_IS_CLK_DISABLED __HAL_RCC_DAC2_IS_CLK_DISABLED -#define __DMA1_IS_CLK_ENABLED __HAL_RCC_DMA1_IS_CLK_ENABLED -#define __DMA1_IS_CLK_DISABLED __HAL_RCC_DMA1_IS_CLK_DISABLED -#define __DMA2_IS_CLK_ENABLED __HAL_RCC_DMA2_IS_CLK_ENABLED -#define __DMA2_IS_CLK_DISABLED __HAL_RCC_DMA2_IS_CLK_DISABLED -#define __FLITF_IS_CLK_ENABLED __HAL_RCC_FLITF_IS_CLK_ENABLED -#define __FLITF_IS_CLK_DISABLED __HAL_RCC_FLITF_IS_CLK_DISABLED -#define __FMC_IS_CLK_ENABLED __HAL_RCC_FMC_IS_CLK_ENABLED -#define __FMC_IS_CLK_DISABLED __HAL_RCC_FMC_IS_CLK_DISABLED -#define __GPIOA_IS_CLK_ENABLED __HAL_RCC_GPIOA_IS_CLK_ENABLED -#define __GPIOA_IS_CLK_DISABLED __HAL_RCC_GPIOA_IS_CLK_DISABLED -#define __GPIOB_IS_CLK_ENABLED __HAL_RCC_GPIOB_IS_CLK_ENABLED -#define __GPIOB_IS_CLK_DISABLED __HAL_RCC_GPIOB_IS_CLK_DISABLED -#define __GPIOC_IS_CLK_ENABLED __HAL_RCC_GPIOC_IS_CLK_ENABLED -#define __GPIOC_IS_CLK_DISABLED __HAL_RCC_GPIOC_IS_CLK_DISABLED -#define __GPIOD_IS_CLK_ENABLED __HAL_RCC_GPIOD_IS_CLK_ENABLED -#define __GPIOD_IS_CLK_DISABLED __HAL_RCC_GPIOD_IS_CLK_DISABLED -#define __GPIOE_IS_CLK_ENABLED __HAL_RCC_GPIOE_IS_CLK_ENABLED -#define __GPIOE_IS_CLK_DISABLED __HAL_RCC_GPIOE_IS_CLK_DISABLED -#define __GPIOF_IS_CLK_ENABLED __HAL_RCC_GPIOF_IS_CLK_ENABLED -#define __GPIOF_IS_CLK_DISABLED __HAL_RCC_GPIOF_IS_CLK_DISABLED -#define __GPIOG_IS_CLK_ENABLED __HAL_RCC_GPIOG_IS_CLK_ENABLED -#define __GPIOG_IS_CLK_DISABLED __HAL_RCC_GPIOG_IS_CLK_DISABLED -#define __GPIOH_IS_CLK_ENABLED __HAL_RCC_GPIOH_IS_CLK_ENABLED -#define __GPIOH_IS_CLK_DISABLED __HAL_RCC_GPIOH_IS_CLK_DISABLED -#define __HRTIM1_IS_CLK_ENABLED __HAL_RCC_HRTIM1_IS_CLK_ENABLED -#define __HRTIM1_IS_CLK_DISABLED __HAL_RCC_HRTIM1_IS_CLK_DISABLED -#define __I2C1_IS_CLK_ENABLED __HAL_RCC_I2C1_IS_CLK_ENABLED -#define __I2C1_IS_CLK_DISABLED __HAL_RCC_I2C1_IS_CLK_DISABLED -#define __I2C2_IS_CLK_ENABLED __HAL_RCC_I2C2_IS_CLK_ENABLED -#define __I2C2_IS_CLK_DISABLED __HAL_RCC_I2C2_IS_CLK_DISABLED -#define __I2C3_IS_CLK_ENABLED __HAL_RCC_I2C3_IS_CLK_ENABLED -#define __I2C3_IS_CLK_DISABLED __HAL_RCC_I2C3_IS_CLK_DISABLED -#define __PWR_IS_CLK_ENABLED __HAL_RCC_PWR_IS_CLK_ENABLED -#define __PWR_IS_CLK_DISABLED __HAL_RCC_PWR_IS_CLK_DISABLED -#define __SYSCFG_IS_CLK_ENABLED __HAL_RCC_SYSCFG_IS_CLK_ENABLED -#define __SYSCFG_IS_CLK_DISABLED __HAL_RCC_SYSCFG_IS_CLK_DISABLED -#define __SPI1_IS_CLK_ENABLED __HAL_RCC_SPI1_IS_CLK_ENABLED -#define __SPI1_IS_CLK_DISABLED __HAL_RCC_SPI1_IS_CLK_DISABLED -#define __SPI2_IS_CLK_ENABLED __HAL_RCC_SPI2_IS_CLK_ENABLED -#define __SPI2_IS_CLK_DISABLED __HAL_RCC_SPI2_IS_CLK_DISABLED -#define __SPI3_IS_CLK_ENABLED __HAL_RCC_SPI3_IS_CLK_ENABLED -#define __SPI3_IS_CLK_DISABLED __HAL_RCC_SPI3_IS_CLK_DISABLED -#define __SPI4_IS_CLK_ENABLED __HAL_RCC_SPI4_IS_CLK_ENABLED -#define __SPI4_IS_CLK_DISABLED __HAL_RCC_SPI4_IS_CLK_DISABLED -#define __SDADC1_IS_CLK_ENABLED __HAL_RCC_SDADC1_IS_CLK_ENABLED -#define __SDADC1_IS_CLK_DISABLED __HAL_RCC_SDADC1_IS_CLK_DISABLED -#define __SDADC2_IS_CLK_ENABLED __HAL_RCC_SDADC2_IS_CLK_ENABLED -#define __SDADC2_IS_CLK_DISABLED __HAL_RCC_SDADC2_IS_CLK_DISABLED -#define __SDADC3_IS_CLK_ENABLED __HAL_RCC_SDADC3_IS_CLK_ENABLED -#define __SDADC3_IS_CLK_DISABLED __HAL_RCC_SDADC3_IS_CLK_DISABLED -#define __SRAM_IS_CLK_ENABLED __HAL_RCC_SRAM_IS_CLK_ENABLED -#define __SRAM_IS_CLK_DISABLED __HAL_RCC_SRAM_IS_CLK_DISABLED -#define __TIM1_IS_CLK_ENABLED __HAL_RCC_TIM1_IS_CLK_ENABLED -#define __TIM1_IS_CLK_DISABLED __HAL_RCC_TIM1_IS_CLK_DISABLED -#define __TIM2_IS_CLK_ENABLED __HAL_RCC_TIM2_IS_CLK_ENABLED -#define __TIM2_IS_CLK_DISABLED __HAL_RCC_TIM2_IS_CLK_DISABLED -#define __TIM3_IS_CLK_ENABLED __HAL_RCC_TIM3_IS_CLK_ENABLED -#define __TIM3_IS_CLK_DISABLED __HAL_RCC_TIM3_IS_CLK_DISABLED -#define __TIM4_IS_CLK_ENABLED __HAL_RCC_TIM4_IS_CLK_ENABLED -#define __TIM4_IS_CLK_DISABLED __HAL_RCC_TIM4_IS_CLK_DISABLED -#define __TIM5_IS_CLK_ENABLED __HAL_RCC_TIM5_IS_CLK_ENABLED -#define __TIM5_IS_CLK_DISABLED __HAL_RCC_TIM5_IS_CLK_DISABLED -#define __TIM6_IS_CLK_ENABLED __HAL_RCC_TIM6_IS_CLK_ENABLED -#define __TIM6_IS_CLK_DISABLED __HAL_RCC_TIM6_IS_CLK_DISABLED -#define __TIM7_IS_CLK_ENABLED __HAL_RCC_TIM7_IS_CLK_ENABLED -#define __TIM7_IS_CLK_DISABLED __HAL_RCC_TIM7_IS_CLK_DISABLED -#define __TIM8_IS_CLK_ENABLED __HAL_RCC_TIM8_IS_CLK_ENABLED -#define __TIM8_IS_CLK_DISABLED __HAL_RCC_TIM8_IS_CLK_DISABLED -#define __TIM12_IS_CLK_ENABLED __HAL_RCC_TIM12_IS_CLK_ENABLED -#define __TIM12_IS_CLK_DISABLED __HAL_RCC_TIM12_IS_CLK_DISABLED -#define __TIM13_IS_CLK_ENABLED __HAL_RCC_TIM13_IS_CLK_ENABLED -#define __TIM13_IS_CLK_DISABLED __HAL_RCC_TIM13_IS_CLK_DISABLED -#define __TIM14_IS_CLK_ENABLED __HAL_RCC_TIM14_IS_CLK_ENABLED -#define __TIM14_IS_CLK_DISABLED __HAL_RCC_TIM14_IS_CLK_DISABLED -#define __TIM15_IS_CLK_ENABLED __HAL_RCC_TIM15_IS_CLK_ENABLED -#define __TIM15_IS_CLK_DISABLED __HAL_RCC_TIM15_IS_CLK_DISABLED -#define __TIM16_IS_CLK_ENABLED __HAL_RCC_TIM16_IS_CLK_ENABLED -#define __TIM16_IS_CLK_DISABLED __HAL_RCC_TIM16_IS_CLK_DISABLED -#define __TIM17_IS_CLK_ENABLED __HAL_RCC_TIM17_IS_CLK_ENABLED -#define __TIM17_IS_CLK_DISABLED __HAL_RCC_TIM17_IS_CLK_DISABLED -#define __TIM18_IS_CLK_ENABLED __HAL_RCC_TIM18_IS_CLK_ENABLED -#define __TIM18_IS_CLK_DISABLED __HAL_RCC_TIM18_IS_CLK_DISABLED -#define __TIM19_IS_CLK_ENABLED __HAL_RCC_TIM19_IS_CLK_ENABLED -#define __TIM19_IS_CLK_DISABLED __HAL_RCC_TIM19_IS_CLK_DISABLED -#define __TIM20_IS_CLK_ENABLED __HAL_RCC_TIM20_IS_CLK_ENABLED -#define __TIM20_IS_CLK_DISABLED __HAL_RCC_TIM20_IS_CLK_DISABLED -#define __TSC_IS_CLK_ENABLED __HAL_RCC_TSC_IS_CLK_ENABLED -#define __TSC_IS_CLK_DISABLED __HAL_RCC_TSC_IS_CLK_DISABLED -#define __UART4_IS_CLK_ENABLED __HAL_RCC_UART4_IS_CLK_ENABLED -#define __UART4_IS_CLK_DISABLED __HAL_RCC_UART4_IS_CLK_DISABLED -#define __UART5_IS_CLK_ENABLED __HAL_RCC_UART5_IS_CLK_ENABLED -#define __UART5_IS_CLK_DISABLED __HAL_RCC_UART5_IS_CLK_DISABLED -#define __USART1_IS_CLK_ENABLED __HAL_RCC_USART1_IS_CLK_ENABLED -#define __USART1_IS_CLK_DISABLED __HAL_RCC_USART1_IS_CLK_DISABLED -#define __USART2_IS_CLK_ENABLED __HAL_RCC_USART2_IS_CLK_ENABLED -#define __USART2_IS_CLK_DISABLED __HAL_RCC_USART2_IS_CLK_DISABLED -#define __USART3_IS_CLK_ENABLED __HAL_RCC_USART3_IS_CLK_ENABLED -#define __USART3_IS_CLK_DISABLED __HAL_RCC_USART3_IS_CLK_DISABLED -#define __USB_IS_CLK_ENABLED __HAL_RCC_USB_IS_CLK_ENABLED -#define __USB_IS_CLK_DISABLED __HAL_RCC_USB_IS_CLK_DISABLED -#define __WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG_IS_CLK_ENABLED -#define __WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG_IS_CLK_DISABLED - -#if defined(STM32L1) -#define __HAL_RCC_CRYP_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE -#define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE -#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE -#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE -#define __HAL_RCC_CRYP_FORCE_RESET __HAL_RCC_AES_FORCE_RESET -#define __HAL_RCC_CRYP_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET -#endif /* STM32L1 */ - -#if defined(STM32F4) -#define __HAL_RCC_SDMMC1_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET -#define __HAL_RCC_SDMMC1_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET -#define __HAL_RCC_SDMMC1_CLK_SLEEP_ENABLE __HAL_RCC_SDIO_CLK_SLEEP_ENABLE -#define __HAL_RCC_SDMMC1_CLK_SLEEP_DISABLE __HAL_RCC_SDIO_CLK_SLEEP_DISABLE -#define __HAL_RCC_SDMMC1_CLK_ENABLE __HAL_RCC_SDIO_CLK_ENABLE -#define __HAL_RCC_SDMMC1_CLK_DISABLE __HAL_RCC_SDIO_CLK_DISABLE -#define __HAL_RCC_SDMMC1_IS_CLK_ENABLED __HAL_RCC_SDIO_IS_CLK_ENABLED -#define __HAL_RCC_SDMMC1_IS_CLK_DISABLED __HAL_RCC_SDIO_IS_CLK_DISABLED -#define Sdmmc1ClockSelection SdioClockSelection -#define RCC_PERIPHCLK_SDMMC1 RCC_PERIPHCLK_SDIO -#define RCC_SDMMC1CLKSOURCE_CLK48 RCC_SDIOCLKSOURCE_CK48 -#define RCC_SDMMC1CLKSOURCE_SYSCLK RCC_SDIOCLKSOURCE_SYSCLK -#define __HAL_RCC_SDMMC1_CONFIG __HAL_RCC_SDIO_CONFIG -#define __HAL_RCC_GET_SDMMC1_SOURCE __HAL_RCC_GET_SDIO_SOURCE -#endif - -#if defined(STM32F7) || defined(STM32L4) -#define __HAL_RCC_SDIO_FORCE_RESET __HAL_RCC_SDMMC1_FORCE_RESET -#define __HAL_RCC_SDIO_RELEASE_RESET __HAL_RCC_SDMMC1_RELEASE_RESET -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE __HAL_RCC_SDMMC1_CLK_SLEEP_ENABLE -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE __HAL_RCC_SDMMC1_CLK_SLEEP_DISABLE -#define __HAL_RCC_SDIO_CLK_ENABLE __HAL_RCC_SDMMC1_CLK_ENABLE -#define __HAL_RCC_SDIO_CLK_DISABLE __HAL_RCC_SDMMC1_CLK_DISABLE -#define __HAL_RCC_SDIO_IS_CLK_ENABLED __HAL_RCC_SDMMC1_IS_CLK_ENABLED -#define __HAL_RCC_SDIO_IS_CLK_DISABLED __HAL_RCC_SDMMC1_IS_CLK_DISABLED -#define SdioClockSelection Sdmmc1ClockSelection -#define RCC_PERIPHCLK_SDIO RCC_PERIPHCLK_SDMMC1 -#define __HAL_RCC_SDIO_CONFIG __HAL_RCC_SDMMC1_CONFIG -#define __HAL_RCC_GET_SDIO_SOURCE __HAL_RCC_GET_SDMMC1_SOURCE -#endif - -#if defined(STM32F7) -#define RCC_SDIOCLKSOURCE_CLK48 RCC_SDMMC1CLKSOURCE_CLK48 -#define RCC_SDIOCLKSOURCE_SYSCLK RCC_SDMMC1CLKSOURCE_SYSCLK -#endif - -#if defined(STM32H7) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() __HAL_RCC_USB1_OTG_HS_CLK_ENABLE() -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_ENABLE() -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() __HAL_RCC_USB1_OTG_HS_CLK_DISABLE() -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_DISABLE() -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() __HAL_RCC_USB1_OTG_HS_FORCE_RESET() -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() __HAL_RCC_USB1_OTG_HS_RELEASE_RESET() -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() __HAL_RCC_USB1_OTG_HS_CLK_SLEEP_ENABLE() -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_SLEEP_ENABLE() -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() __HAL_RCC_USB1_OTG_HS_CLK_SLEEP_DISABLE() -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_SLEEP_DISABLE() - -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() __HAL_RCC_USB2_OTG_FS_CLK_ENABLE() -#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_ENABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_ENABLE() -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() __HAL_RCC_USB2_OTG_FS_CLK_DISABLE() -#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_DISABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_DISABLE() -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() __HAL_RCC_USB2_OTG_FS_FORCE_RESET() -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() __HAL_RCC_USB2_OTG_FS_RELEASE_RESET() -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() __HAL_RCC_USB2_OTG_FS_CLK_SLEEP_ENABLE() -#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_SLEEP_ENABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_ENABLE() -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() __HAL_RCC_USB2_OTG_FS_CLK_SLEEP_DISABLE() -#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_SLEEP_DISABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_DISABLE() -#endif - -#define __HAL_RCC_I2SCLK __HAL_RCC_I2S_CONFIG -#define __HAL_RCC_I2SCLK_CONFIG __HAL_RCC_I2S_CONFIG - -#define __RCC_PLLSRC RCC_GET_PLL_OSCSOURCE - -#define IS_RCC_MSIRANGE IS_RCC_MSI_CLOCK_RANGE -#define IS_RCC_RTCCLK_SOURCE IS_RCC_RTCCLKSOURCE -#define IS_RCC_SYSCLK_DIV IS_RCC_HCLK -#define IS_RCC_HCLK_DIV IS_RCC_PCLK -#define IS_RCC_PERIPHCLK IS_RCC_PERIPHCLOCK - -#define RCC_IT_HSI14 RCC_IT_HSI14RDY - -#define RCC_IT_CSSLSE RCC_IT_LSECSS -#define RCC_IT_CSSHSE RCC_IT_CSS - -#define RCC_PLLMUL_3 RCC_PLL_MUL3 -#define RCC_PLLMUL_4 RCC_PLL_MUL4 -#define RCC_PLLMUL_6 RCC_PLL_MUL6 -#define RCC_PLLMUL_8 RCC_PLL_MUL8 -#define RCC_PLLMUL_12 RCC_PLL_MUL12 -#define RCC_PLLMUL_16 RCC_PLL_MUL16 -#define RCC_PLLMUL_24 RCC_PLL_MUL24 -#define RCC_PLLMUL_32 RCC_PLL_MUL32 -#define RCC_PLLMUL_48 RCC_PLL_MUL48 - -#define RCC_PLLDIV_2 RCC_PLL_DIV2 -#define RCC_PLLDIV_3 RCC_PLL_DIV3 -#define RCC_PLLDIV_4 RCC_PLL_DIV4 - -#define IS_RCC_MCOSOURCE IS_RCC_MCO1SOURCE -#define __HAL_RCC_MCO_CONFIG __HAL_RCC_MCO1_CONFIG -#define RCC_MCO_NODIV RCC_MCODIV_1 -#define RCC_MCO_DIV1 RCC_MCODIV_1 -#define RCC_MCO_DIV2 RCC_MCODIV_2 -#define RCC_MCO_DIV4 RCC_MCODIV_4 -#define RCC_MCO_DIV8 RCC_MCODIV_8 -#define RCC_MCO_DIV16 RCC_MCODIV_16 -#define RCC_MCO_DIV32 RCC_MCODIV_32 -#define RCC_MCO_DIV64 RCC_MCODIV_64 -#define RCC_MCO_DIV128 RCC_MCODIV_128 -#define RCC_MCOSOURCE_NONE RCC_MCO1SOURCE_NOCLOCK -#define RCC_MCOSOURCE_LSI RCC_MCO1SOURCE_LSI -#define RCC_MCOSOURCE_LSE RCC_MCO1SOURCE_LSE -#define RCC_MCOSOURCE_SYSCLK RCC_MCO1SOURCE_SYSCLK -#define RCC_MCOSOURCE_HSI RCC_MCO1SOURCE_HSI -#define RCC_MCOSOURCE_HSI14 RCC_MCO1SOURCE_HSI14 -#define RCC_MCOSOURCE_HSI48 RCC_MCO1SOURCE_HSI48 -#define RCC_MCOSOURCE_HSE RCC_MCO1SOURCE_HSE -#define RCC_MCOSOURCE_PLLCLK_DIV1 RCC_MCO1SOURCE_PLLCLK -#define RCC_MCOSOURCE_PLLCLK_NODIV RCC_MCO1SOURCE_PLLCLK -#define RCC_MCOSOURCE_PLLCLK_DIV2 RCC_MCO1SOURCE_PLLCLK_DIV2 - -#if defined(STM32U0) -#define RCC_SYSCLKSOURCE_STATUS_PLLR RCC_SYSCLKSOURCE_STATUS_PLLCLK -#endif - -#if defined(STM32L4) || defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) || \ - defined(STM32WL) || defined(STM32C0) || defined(STM32H7RS) || defined(STM32U0) -#define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE -#else -#define RCC_RTCCLKSOURCE_NONE RCC_RTCCLKSOURCE_NO_CLK -#endif - -#define RCC_USBCLK_PLLSAI1 RCC_USBCLKSOURCE_PLLSAI1 -#define RCC_USBCLK_PLL RCC_USBCLKSOURCE_PLL -#define RCC_USBCLK_MSI RCC_USBCLKSOURCE_MSI -#define RCC_USBCLKSOURCE_PLLCLK RCC_USBCLKSOURCE_PLL -#define RCC_USBPLLCLK_DIV1 RCC_USBCLKSOURCE_PLL -#define RCC_USBPLLCLK_DIV1_5 RCC_USBCLKSOURCE_PLL_DIV1_5 -#define RCC_USBPLLCLK_DIV2 RCC_USBCLKSOURCE_PLL_DIV2 -#define RCC_USBPLLCLK_DIV3 RCC_USBCLKSOURCE_PLL_DIV3 - -#define HSION_BitNumber RCC_HSION_BIT_NUMBER -#define HSION_BITNUMBER RCC_HSION_BIT_NUMBER -#define HSEON_BitNumber RCC_HSEON_BIT_NUMBER -#define HSEON_BITNUMBER RCC_HSEON_BIT_NUMBER -#define MSION_BITNUMBER RCC_MSION_BIT_NUMBER -#define CSSON_BitNumber RCC_CSSON_BIT_NUMBER -#define CSSON_BITNUMBER RCC_CSSON_BIT_NUMBER -#define PLLON_BitNumber RCC_PLLON_BIT_NUMBER -#define PLLON_BITNUMBER RCC_PLLON_BIT_NUMBER -#define PLLI2SON_BitNumber RCC_PLLI2SON_BIT_NUMBER -#define I2SSRC_BitNumber RCC_I2SSRC_BIT_NUMBER -#define RTCEN_BitNumber RCC_RTCEN_BIT_NUMBER -#define RTCEN_BITNUMBER RCC_RTCEN_BIT_NUMBER -#define BDRST_BitNumber RCC_BDRST_BIT_NUMBER -#define BDRST_BITNUMBER RCC_BDRST_BIT_NUMBER -#define RTCRST_BITNUMBER RCC_RTCRST_BIT_NUMBER -#define LSION_BitNumber RCC_LSION_BIT_NUMBER -#define LSION_BITNUMBER RCC_LSION_BIT_NUMBER -#define LSEON_BitNumber RCC_LSEON_BIT_NUMBER -#define LSEON_BITNUMBER RCC_LSEON_BIT_NUMBER -#define LSEBYP_BITNUMBER RCC_LSEBYP_BIT_NUMBER -#define PLLSAION_BitNumber RCC_PLLSAION_BIT_NUMBER -#define TIMPRE_BitNumber RCC_TIMPRE_BIT_NUMBER -#define RMVF_BitNumber RCC_RMVF_BIT_NUMBER -#define RMVF_BITNUMBER RCC_RMVF_BIT_NUMBER -#define RCC_CR2_HSI14TRIM_BitNumber RCC_HSI14TRIM_BIT_NUMBER -#define CR_BYTE2_ADDRESS RCC_CR_BYTE2_ADDRESS -#define CIR_BYTE1_ADDRESS RCC_CIR_BYTE1_ADDRESS -#define CIR_BYTE2_ADDRESS RCC_CIR_BYTE2_ADDRESS -#define BDCR_BYTE0_ADDRESS RCC_BDCR_BYTE0_ADDRESS -#define DBP_TIMEOUT_VALUE RCC_DBP_TIMEOUT_VALUE -#define LSE_TIMEOUT_VALUE RCC_LSE_TIMEOUT_VALUE - -#define CR_HSION_BB RCC_CR_HSION_BB -#define CR_CSSON_BB RCC_CR_CSSON_BB -#define CR_PLLON_BB RCC_CR_PLLON_BB -#define CR_PLLI2SON_BB RCC_CR_PLLI2SON_BB -#define CR_MSION_BB RCC_CR_MSION_BB -#define CSR_LSION_BB RCC_CSR_LSION_BB -#define CSR_LSEON_BB RCC_CSR_LSEON_BB -#define CSR_LSEBYP_BB RCC_CSR_LSEBYP_BB -#define CSR_RTCEN_BB RCC_CSR_RTCEN_BB -#define CSR_RTCRST_BB RCC_CSR_RTCRST_BB -#define CFGR_I2SSRC_BB RCC_CFGR_I2SSRC_BB -#define BDCR_RTCEN_BB RCC_BDCR_RTCEN_BB -#define BDCR_BDRST_BB RCC_BDCR_BDRST_BB -#define CR_HSEON_BB RCC_CR_HSEON_BB -#define CSR_RMVF_BB RCC_CSR_RMVF_BB -#define CR_PLLSAION_BB RCC_CR_PLLSAION_BB -#define DCKCFGR_TIMPRE_BB RCC_DCKCFGR_TIMPRE_BB - -#define __HAL_RCC_CRS_ENABLE_FREQ_ERROR_COUNTER __HAL_RCC_CRS_FREQ_ERROR_COUNTER_ENABLE -#define __HAL_RCC_CRS_DISABLE_FREQ_ERROR_COUNTER __HAL_RCC_CRS_FREQ_ERROR_COUNTER_DISABLE -#define __HAL_RCC_CRS_ENABLE_AUTOMATIC_CALIB __HAL_RCC_CRS_AUTOMATIC_CALIB_ENABLE -#define __HAL_RCC_CRS_DISABLE_AUTOMATIC_CALIB __HAL_RCC_CRS_AUTOMATIC_CALIB_DISABLE -#define __HAL_RCC_CRS_CALCULATE_RELOADVALUE __HAL_RCC_CRS_RELOADVALUE_CALCULATE - -#define __HAL_RCC_GET_IT_SOURCE __HAL_RCC_GET_IT - -#define RCC_CRS_SYNCWARM RCC_CRS_SYNCWARN -#define RCC_CRS_TRIMOV RCC_CRS_TRIMOVF - -#define RCC_PERIPHCLK_CK48 RCC_PERIPHCLK_CLK48 -#define RCC_CK48CLKSOURCE_PLLQ RCC_CLK48CLKSOURCE_PLLQ -#define RCC_CK48CLKSOURCE_PLLSAIP RCC_CLK48CLKSOURCE_PLLSAIP -#define RCC_CK48CLKSOURCE_PLLI2SQ RCC_CLK48CLKSOURCE_PLLI2SQ -#define IS_RCC_CK48CLKSOURCE IS_RCC_CLK48CLKSOURCE -#define RCC_SDIOCLKSOURCE_CK48 RCC_SDIOCLKSOURCE_CLK48 - -#define __HAL_RCC_DFSDM_CLK_ENABLE __HAL_RCC_DFSDM1_CLK_ENABLE -#define __HAL_RCC_DFSDM_CLK_DISABLE __HAL_RCC_DFSDM1_CLK_DISABLE -#define __HAL_RCC_DFSDM_IS_CLK_ENABLED __HAL_RCC_DFSDM1_IS_CLK_ENABLED -#define __HAL_RCC_DFSDM_IS_CLK_DISABLED __HAL_RCC_DFSDM1_IS_CLK_DISABLED -#define __HAL_RCC_DFSDM_FORCE_RESET __HAL_RCC_DFSDM1_FORCE_RESET -#define __HAL_RCC_DFSDM_RELEASE_RESET __HAL_RCC_DFSDM1_RELEASE_RESET -#define __HAL_RCC_DFSDM_CLK_SLEEP_ENABLE __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE -#define __HAL_RCC_DFSDM_CLK_SLEEP_DISABLE __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE -#define __HAL_RCC_DFSDM_IS_CLK_SLEEP_ENABLED __HAL_RCC_DFSDM1_IS_CLK_SLEEP_ENABLED -#define __HAL_RCC_DFSDM_IS_CLK_SLEEP_DISABLED __HAL_RCC_DFSDM1_IS_CLK_SLEEP_DISABLED -#define DfsdmClockSelection Dfsdm1ClockSelection -#define RCC_PERIPHCLK_DFSDM RCC_PERIPHCLK_DFSDM1 -#define RCC_DFSDMCLKSOURCE_PCLK RCC_DFSDM1CLKSOURCE_PCLK2 -#define RCC_DFSDMCLKSOURCE_SYSCLK RCC_DFSDM1CLKSOURCE_SYSCLK -#define __HAL_RCC_DFSDM_CONFIG __HAL_RCC_DFSDM1_CONFIG -#define __HAL_RCC_GET_DFSDM_SOURCE __HAL_RCC_GET_DFSDM1_SOURCE -#define RCC_DFSDM1CLKSOURCE_PCLK RCC_DFSDM1CLKSOURCE_PCLK2 -#define RCC_SWPMI1CLKSOURCE_PCLK RCC_SWPMI1CLKSOURCE_PCLK1 -#if !defined(STM32U0) -#define RCC_LPTIM1CLKSOURCE_PCLK RCC_LPTIM1CLKSOURCE_PCLK1 -#define RCC_LPTIM2CLKSOURCE_PCLK RCC_LPTIM2CLKSOURCE_PCLK1 -#endif - -#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB1 RCC_DFSDM1AUDIOCLKSOURCE_I2S1 -#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB2 RCC_DFSDM1AUDIOCLKSOURCE_I2S2 -#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB1 RCC_DFSDM2AUDIOCLKSOURCE_I2S1 -#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB2 RCC_DFSDM2AUDIOCLKSOURCE_I2S2 -#define RCC_DFSDM1CLKSOURCE_APB2 RCC_DFSDM1CLKSOURCE_PCLK2 -#define RCC_DFSDM2CLKSOURCE_APB2 RCC_DFSDM2CLKSOURCE_PCLK2 -#define RCC_FMPI2C1CLKSOURCE_APB RCC_FMPI2C1CLKSOURCE_PCLK1 -#if defined(STM32U5) -#define MSIKPLLModeSEL RCC_MSIKPLL_MODE_SEL -#define MSISPLLModeSEL RCC_MSISPLL_MODE_SEL -#define __HAL_RCC_AHB21_CLK_DISABLE __HAL_RCC_AHB2_1_CLK_DISABLE -#define __HAL_RCC_AHB22_CLK_DISABLE __HAL_RCC_AHB2_2_CLK_DISABLE -#define __HAL_RCC_AHB1_CLK_Disable_Clear __HAL_RCC_AHB1_CLK_ENABLE -#define __HAL_RCC_AHB21_CLK_Disable_Clear __HAL_RCC_AHB2_1_CLK_ENABLE -#define __HAL_RCC_AHB22_CLK_Disable_Clear __HAL_RCC_AHB2_2_CLK_ENABLE -#define __HAL_RCC_AHB3_CLK_Disable_Clear __HAL_RCC_AHB3_CLK_ENABLE -#define __HAL_RCC_APB1_CLK_Disable_Clear __HAL_RCC_APB1_CLK_ENABLE -#define __HAL_RCC_APB2_CLK_Disable_Clear __HAL_RCC_APB2_CLK_ENABLE -#define __HAL_RCC_APB3_CLK_Disable_Clear __HAL_RCC_APB3_CLK_ENABLE -#define IS_RCC_MSIPLLModeSelection IS_RCC_MSIPLLMODE_SELECT -#define RCC_PERIPHCLK_CLK48 RCC_PERIPHCLK_ICLK -#define RCC_CLK48CLKSOURCE_HSI48 RCC_ICLK_CLKSOURCE_HSI48 -#define RCC_CLK48CLKSOURCE_PLL2 RCC_ICLK_CLKSOURCE_PLL2 -#define RCC_CLK48CLKSOURCE_PLL1 RCC_ICLK_CLKSOURCE_PLL1 -#define RCC_CLK48CLKSOURCE_MSIK RCC_ICLK_CLKSOURCE_MSIK -#define __HAL_RCC_ADC1_CLK_ENABLE __HAL_RCC_ADC12_CLK_ENABLE -#define __HAL_RCC_ADC1_CLK_DISABLE __HAL_RCC_ADC12_CLK_DISABLE -#define __HAL_RCC_ADC1_IS_CLK_ENABLED __HAL_RCC_ADC12_IS_CLK_ENABLED -#define __HAL_RCC_ADC1_IS_CLK_DISABLED __HAL_RCC_ADC12_IS_CLK_DISABLED -#define __HAL_RCC_ADC1_FORCE_RESET __HAL_RCC_ADC12_FORCE_RESET -#define __HAL_RCC_ADC1_RELEASE_RESET __HAL_RCC_ADC12_RELEASE_RESET -#define __HAL_RCC_ADC1_CLK_SLEEP_ENABLE __HAL_RCC_ADC12_CLK_SLEEP_ENABLE -#define __HAL_RCC_ADC1_CLK_SLEEP_DISABLE __HAL_RCC_ADC12_CLK_SLEEP_DISABLE -#define __HAL_RCC_GET_CLK48_SOURCE __HAL_RCC_GET_ICLK_SOURCE -#define __HAL_RCC_PLLFRACN_ENABLE __HAL_RCC_PLL_FRACN_ENABLE -#define __HAL_RCC_PLLFRACN_DISABLE __HAL_RCC_PLL_FRACN_DISABLE -#define __HAL_RCC_PLLFRACN_CONFIG __HAL_RCC_PLL_FRACN_CONFIG -#define IS_RCC_PLLFRACN_VALUE IS_RCC_PLL_FRACN_VALUE -#endif /* STM32U5 */ - -#if defined(STM32H5) -#define __HAL_RCC_PLLFRACN_ENABLE __HAL_RCC_PLL_FRACN_ENABLE -#define __HAL_RCC_PLLFRACN_DISABLE __HAL_RCC_PLL_FRACN_DISABLE -#define __HAL_RCC_PLLFRACN_CONFIG __HAL_RCC_PLL_FRACN_CONFIG -#define IS_RCC_PLLFRACN_VALUE IS_RCC_PLL_FRACN_VALUE - -#define RCC_PLLSOURCE_NONE RCC_PLL1_SOURCE_NONE -#define RCC_PLLSOURCE_HSI RCC_PLL1_SOURCE_HSI -#define RCC_PLLSOURCE_CSI RCC_PLL1_SOURCE_CSI -#define RCC_PLLSOURCE_HSE RCC_PLL1_SOURCE_HSE -#define RCC_PLLVCIRANGE_0 RCC_PLL1_VCIRANGE_0 -#define RCC_PLLVCIRANGE_1 RCC_PLL1_VCIRANGE_1 -#define RCC_PLLVCIRANGE_2 RCC_PLL1_VCIRANGE_2 -#define RCC_PLLVCIRANGE_3 RCC_PLL1_VCIRANGE_3 -#define RCC_PLL1VCOWIDE RCC_PLL1_VCORANGE_WIDE -#define RCC_PLL1VCOMEDIUM RCC_PLL1_VCORANGE_MEDIUM - -#define IS_RCC_PLLSOURCE IS_RCC_PLL1_SOURCE -#define IS_RCC_PLLRGE_VALUE IS_RCC_PLL1_VCIRGE_VALUE -#define IS_RCC_PLLVCORGE_VALUE IS_RCC_PLL1_VCORGE_VALUE -#define IS_RCC_PLLCLOCKOUT_VALUE IS_RCC_PLL1_CLOCKOUT_VALUE -#define IS_RCC_PLL_FRACN_VALUE IS_RCC_PLL1_FRACN_VALUE -#define IS_RCC_PLLM_VALUE IS_RCC_PLL1_DIVM_VALUE -#define IS_RCC_PLLN_VALUE IS_RCC_PLL1_MULN_VALUE -#define IS_RCC_PLLP_VALUE IS_RCC_PLL1_DIVP_VALUE -#define IS_RCC_PLLQ_VALUE IS_RCC_PLL1_DIVQ_VALUE -#define IS_RCC_PLLR_VALUE IS_RCC_PLL1_DIVR_VALUE - -#define __HAL_RCC_PLL_ENABLE __HAL_RCC_PLL1_ENABLE -#define __HAL_RCC_PLL_DISABLE __HAL_RCC_PLL1_DISABLE -#define __HAL_RCC_PLL_FRACN_ENABLE __HAL_RCC_PLL1_FRACN_ENABLE -#define __HAL_RCC_PLL_FRACN_DISABLE __HAL_RCC_PLL1_FRACN_DISABLE -#define __HAL_RCC_PLL_CONFIG __HAL_RCC_PLL1_CONFIG -#define __HAL_RCC_PLL_PLLSOURCE_CONFIG __HAL_RCC_PLL1_PLLSOURCE_CONFIG -#define __HAL_RCC_PLL_DIVM_CONFIG __HAL_RCC_PLL1_DIVM_CONFIG -#define __HAL_RCC_PLL_FRACN_CONFIG __HAL_RCC_PLL1_FRACN_CONFIG -#define __HAL_RCC_PLL_VCIRANGE __HAL_RCC_PLL1_VCIRANGE -#define __HAL_RCC_PLL_VCORANGE __HAL_RCC_PLL1_VCORANGE -#define __HAL_RCC_GET_PLL_OSCSOURCE __HAL_RCC_GET_PLL1_OSCSOURCE -#define __HAL_RCC_PLLCLKOUT_ENABLE __HAL_RCC_PLL1_CLKOUT_ENABLE -#define __HAL_RCC_PLLCLKOUT_DISABLE __HAL_RCC_PLL1_CLKOUT_DISABLE -#define __HAL_RCC_GET_PLLCLKOUT_CONFIG __HAL_RCC_GET_PLL1_CLKOUT_CONFIG - -#define __HAL_RCC_PLL2FRACN_ENABLE __HAL_RCC_PLL2_FRACN_ENABLE -#define __HAL_RCC_PLL2FRACN_DISABLE __HAL_RCC_PLL2_FRACN_DISABLE -#define __HAL_RCC_PLL2CLKOUT_ENABLE __HAL_RCC_PLL2_CLKOUT_ENABLE -#define __HAL_RCC_PLL2CLKOUT_DISABLE __HAL_RCC_PLL2_CLKOUT_DISABLE -#define __HAL_RCC_PLL2FRACN_CONFIG __HAL_RCC_PLL2_FRACN_CONFIG -#define __HAL_RCC_GET_PLL2CLKOUT_CONFIG __HAL_RCC_GET_PLL2_CLKOUT_CONFIG - -#define __HAL_RCC_PLL3FRACN_ENABLE __HAL_RCC_PLL3_FRACN_ENABLE -#define __HAL_RCC_PLL3FRACN_DISABLE __HAL_RCC_PLL3_FRACN_DISABLE -#define __HAL_RCC_PLL3CLKOUT_ENABLE __HAL_RCC_PLL3_CLKOUT_ENABLE -#define __HAL_RCC_PLL3CLKOUT_DISABLE __HAL_RCC_PLL3_CLKOUT_DISABLE -#define __HAL_RCC_PLL3FRACN_CONFIG __HAL_RCC_PLL3_FRACN_CONFIG -#define __HAL_RCC_GET_PLL3CLKOUT_CONFIG __HAL_RCC_GET_PLL3_CLKOUT_CONFIG - -#define RCC_PLL2VCIRANGE_0 RCC_PLL2_VCIRANGE_0 -#define RCC_PLL2VCIRANGE_1 RCC_PLL2_VCIRANGE_1 -#define RCC_PLL2VCIRANGE_2 RCC_PLL2_VCIRANGE_2 -#define RCC_PLL2VCIRANGE_3 RCC_PLL2_VCIRANGE_3 - -#define RCC_PLL2VCOWIDE RCC_PLL2_VCORANGE_WIDE -#define RCC_PLL2VCOMEDIUM RCC_PLL2_VCORANGE_MEDIUM - -#define RCC_PLL2SOURCE_NONE RCC_PLL2_SOURCE_NONE -#define RCC_PLL2SOURCE_HSI RCC_PLL2_SOURCE_HSI -#define RCC_PLL2SOURCE_CSI RCC_PLL2_SOURCE_CSI -#define RCC_PLL2SOURCE_HSE RCC_PLL2_SOURCE_HSE - -#define RCC_PLL3VCIRANGE_0 RCC_PLL3_VCIRANGE_0 -#define RCC_PLL3VCIRANGE_1 RCC_PLL3_VCIRANGE_1 -#define RCC_PLL3VCIRANGE_2 RCC_PLL3_VCIRANGE_2 -#define RCC_PLL3VCIRANGE_3 RCC_PLL3_VCIRANGE_3 - -#define RCC_PLL3VCOWIDE RCC_PLL3_VCORANGE_WIDE -#define RCC_PLL3VCOMEDIUM RCC_PLL3_VCORANGE_MEDIUM - -#define RCC_PLL3SOURCE_NONE RCC_PLL3_SOURCE_NONE -#define RCC_PLL3SOURCE_HSI RCC_PLL3_SOURCE_HSI -#define RCC_PLL3SOURCE_CSI RCC_PLL3_SOURCE_CSI -#define RCC_PLL3SOURCE_HSE RCC_PLL3_SOURCE_HSE - - -#endif /* STM32H5 */ - -/** - * @} - */ - -/** @defgroup HAL_RNG_Aliased_Macros HAL RNG Aliased Macros maintained for legacy purpose - * @{ - */ -#define HAL_RNG_ReadyCallback(__HANDLE__) HAL_RNG_ReadyDataCallback((__HANDLE__), uint32_t random32bit) - -/** - * @} - */ - -/** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || \ - defined (STM32L4P5xx)|| defined (STM32L4Q5xx) || defined (STM32G4) || defined (STM32WL) || defined (STM32U5) || \ - defined (STM32WBA) || defined (STM32H5) || defined (STM32C0) || defined (STM32H7RS) || defined (STM32U0) -#else -#define __HAL_RTC_CLEAR_FLAG __HAL_RTC_EXTI_CLEAR_FLAG -#endif -#define __HAL_RTC_DISABLE_IT __HAL_RTC_EXTI_DISABLE_IT -#define __HAL_RTC_ENABLE_IT __HAL_RTC_EXTI_ENABLE_IT - -#if defined (STM32F1) -#define __HAL_RTC_EXTI_CLEAR_FLAG(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_CLEAR_FLAG() - -#define __HAL_RTC_EXTI_ENABLE_IT(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_ENABLE_IT() - -#define __HAL_RTC_EXTI_DISABLE_IT(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_DISABLE_IT() - -#define __HAL_RTC_EXTI_GET_FLAG(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_GET_FLAG() - -#define __HAL_RTC_EXTI_GENERATE_SWIT(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_GENERATE_SWIT() -#else -#define __HAL_RTC_EXTI_CLEAR_FLAG(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_CLEAR_FLAG() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_CLEAR_FLAG())) -#define __HAL_RTC_EXTI_ENABLE_IT(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_ENABLE_IT() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_IT())) -#define __HAL_RTC_EXTI_DISABLE_IT(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_DISABLE_IT() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_DISABLE_IT() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_DISABLE_IT())) -#define __HAL_RTC_EXTI_GET_FLAG(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_GET_FLAG() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_GET_FLAG() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_GET_FLAG())) -#define __HAL_RTC_EXTI_GENERATE_SWIT(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_GENERATE_SWIT() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_GENERATE_SWIT() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_GENERATE_SWIT())) -#endif /* STM32F1 */ - -#if defined (STM32F0) || defined (STM32F2) || defined (STM32F3) || defined (STM32F4) || defined (STM32F7) || \ - defined (STM32H7) || \ - defined (STM32L0) || defined (STM32L1) || \ - defined (STM32WB) -#define __HAL_RTC_TAMPER_GET_IT __HAL_RTC_TAMPER_GET_FLAG -#endif - -#define IS_ALARM IS_RTC_ALARM -#define IS_ALARM_MASK IS_RTC_ALARM_MASK -#define IS_TAMPER IS_RTC_TAMPER -#define IS_TAMPER_ERASE_MODE IS_RTC_TAMPER_ERASE_MODE -#define IS_TAMPER_FILTER IS_RTC_TAMPER_FILTER -#define IS_TAMPER_INTERRUPT IS_RTC_TAMPER_INTERRUPT -#define IS_TAMPER_MASKFLAG_STATE IS_RTC_TAMPER_MASKFLAG_STATE -#define IS_TAMPER_PRECHARGE_DURATION IS_RTC_TAMPER_PRECHARGE_DURATION -#define IS_TAMPER_PULLUP_STATE IS_RTC_TAMPER_PULLUP_STATE -#define IS_TAMPER_SAMPLING_FREQ IS_RTC_TAMPER_SAMPLING_FREQ -#define IS_TAMPER_TIMESTAMPONTAMPER_DETECTION IS_RTC_TAMPER_TIMESTAMPONTAMPER_DETECTION -#define IS_TAMPER_TRIGGER IS_RTC_TAMPER_TRIGGER -#define IS_WAKEUP_CLOCK IS_RTC_WAKEUP_CLOCK -#define IS_WAKEUP_COUNTER IS_RTC_WAKEUP_COUNTER - -#define __RTC_WRITEPROTECTION_ENABLE __HAL_RTC_WRITEPROTECTION_ENABLE -#define __RTC_WRITEPROTECTION_DISABLE __HAL_RTC_WRITEPROTECTION_DISABLE - -#if defined (STM32H5) -#define __HAL_RCC_RTCAPB_CLK_ENABLE __HAL_RCC_RTC_CLK_ENABLE -#define __HAL_RCC_RTCAPB_CLK_DISABLE __HAL_RCC_RTC_CLK_DISABLE -#endif /* STM32H5 */ - -/** - * @} - */ - -/** @defgroup HAL_SD_Aliased_Macros HAL SD/MMC Aliased Macros maintained for legacy purpose - * @{ - */ - -#define SD_OCR_CID_CSD_OVERWRIETE SD_OCR_CID_CSD_OVERWRITE -#define SD_CMD_SD_APP_STAUS SD_CMD_SD_APP_STATUS - -#if !defined(STM32F1) && !defined(STM32F2) && !defined(STM32F4) && !defined(STM32L1) -#define eMMC_HIGH_VOLTAGE_RANGE EMMC_HIGH_VOLTAGE_RANGE -#define eMMC_DUAL_VOLTAGE_RANGE EMMC_DUAL_VOLTAGE_RANGE -#define eMMC_LOW_VOLTAGE_RANGE EMMC_LOW_VOLTAGE_RANGE - -#define SDMMC_NSpeed_CLK_DIV SDMMC_NSPEED_CLK_DIV -#define SDMMC_HSpeed_CLK_DIV SDMMC_HSPEED_CLK_DIV -#endif - -#if defined(STM32F4) || defined(STM32F2) -#define SD_SDMMC_DISABLED SD_SDIO_DISABLED -#define SD_SDMMC_FUNCTION_BUSY SD_SDIO_FUNCTION_BUSY -#define SD_SDMMC_FUNCTION_FAILED SD_SDIO_FUNCTION_FAILED -#define SD_SDMMC_UNKNOWN_FUNCTION SD_SDIO_UNKNOWN_FUNCTION -#define SD_CMD_SDMMC_SEN_OP_COND SD_CMD_SDIO_SEN_OP_COND -#define SD_CMD_SDMMC_RW_DIRECT SD_CMD_SDIO_RW_DIRECT -#define SD_CMD_SDMMC_RW_EXTENDED SD_CMD_SDIO_RW_EXTENDED -#define __HAL_SD_SDMMC_ENABLE __HAL_SD_SDIO_ENABLE -#define __HAL_SD_SDMMC_DISABLE __HAL_SD_SDIO_DISABLE -#define __HAL_SD_SDMMC_DMA_ENABLE __HAL_SD_SDIO_DMA_ENABLE -#define __HAL_SD_SDMMC_DMA_DISABLE __HAL_SD_SDIO_DMA_DISABL -#define __HAL_SD_SDMMC_ENABLE_IT __HAL_SD_SDIO_ENABLE_IT -#define __HAL_SD_SDMMC_DISABLE_IT __HAL_SD_SDIO_DISABLE_IT -#define __HAL_SD_SDMMC_GET_FLAG __HAL_SD_SDIO_GET_FLAG -#define __HAL_SD_SDMMC_CLEAR_FLAG __HAL_SD_SDIO_CLEAR_FLAG -#define __HAL_SD_SDMMC_GET_IT __HAL_SD_SDIO_GET_IT -#define __HAL_SD_SDMMC_CLEAR_IT __HAL_SD_SDIO_CLEAR_IT -#define SDMMC_STATIC_FLAGS SDIO_STATIC_FLAGS -#define SDMMC_CMD0TIMEOUT SDIO_CMD0TIMEOUT -#define SD_SDMMC_SEND_IF_COND SD_SDIO_SEND_IF_COND -/* alias CMSIS */ -#define SDMMC1_IRQn SDIO_IRQn -#define SDMMC1_IRQHandler SDIO_IRQHandler -#endif - -#if defined(STM32F7) || defined(STM32L4) -#define SD_SDIO_DISABLED SD_SDMMC_DISABLED -#define SD_SDIO_FUNCTION_BUSY SD_SDMMC_FUNCTION_BUSY -#define SD_SDIO_FUNCTION_FAILED SD_SDMMC_FUNCTION_FAILED -#define SD_SDIO_UNKNOWN_FUNCTION SD_SDMMC_UNKNOWN_FUNCTION -#define SD_CMD_SDIO_SEN_OP_COND SD_CMD_SDMMC_SEN_OP_COND -#define SD_CMD_SDIO_RW_DIRECT SD_CMD_SDMMC_RW_DIRECT -#define SD_CMD_SDIO_RW_EXTENDED SD_CMD_SDMMC_RW_EXTENDED -#define __HAL_SD_SDIO_ENABLE __HAL_SD_SDMMC_ENABLE -#define __HAL_SD_SDIO_DISABLE __HAL_SD_SDMMC_DISABLE -#define __HAL_SD_SDIO_DMA_ENABLE __HAL_SD_SDMMC_DMA_ENABLE -#define __HAL_SD_SDIO_DMA_DISABL __HAL_SD_SDMMC_DMA_DISABLE -#define __HAL_SD_SDIO_ENABLE_IT __HAL_SD_SDMMC_ENABLE_IT -#define __HAL_SD_SDIO_DISABLE_IT __HAL_SD_SDMMC_DISABLE_IT -#define __HAL_SD_SDIO_GET_FLAG __HAL_SD_SDMMC_GET_FLAG -#define __HAL_SD_SDIO_CLEAR_FLAG __HAL_SD_SDMMC_CLEAR_FLAG -#define __HAL_SD_SDIO_GET_IT __HAL_SD_SDMMC_GET_IT -#define __HAL_SD_SDIO_CLEAR_IT __HAL_SD_SDMMC_CLEAR_IT -#define SDIO_STATIC_FLAGS SDMMC_STATIC_FLAGS -#define SDIO_CMD0TIMEOUT SDMMC_CMD0TIMEOUT -#define SD_SDIO_SEND_IF_COND SD_SDMMC_SEND_IF_COND -/* alias CMSIS for compatibilities */ -#define SDIO_IRQn SDMMC1_IRQn -#define SDIO_IRQHandler SDMMC1_IRQHandler -#endif - -#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4) || defined(STM32H7) -#define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef -#define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef -#define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef -#define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef -#endif - -#if defined(STM32H7) || defined(STM32L5) -#define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback HAL_MMCEx_Read_DMADoubleBuf0CpltCallback -#define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback HAL_MMCEx_Read_DMADoubleBuf1CpltCallback -#define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback HAL_MMCEx_Write_DMADoubleBuf0CpltCallback -#define HAL_MMCEx_Write_DMADoubleBuffer1CpltCallback HAL_MMCEx_Write_DMADoubleBuf1CpltCallback -#define HAL_SDEx_Read_DMADoubleBuffer0CpltCallback HAL_SDEx_Read_DMADoubleBuf0CpltCallback -#define HAL_SDEx_Read_DMADoubleBuffer1CpltCallback HAL_SDEx_Read_DMADoubleBuf1CpltCallback -#define HAL_SDEx_Write_DMADoubleBuffer0CpltCallback HAL_SDEx_Write_DMADoubleBuf0CpltCallback -#define HAL_SDEx_Write_DMADoubleBuffer1CpltCallback HAL_SDEx_Write_DMADoubleBuf1CpltCallback -#define HAL_SD_DriveTransciver_1_8V_Callback HAL_SD_DriveTransceiver_1_8V_Callback -#endif -/** - * @} - */ - -/** @defgroup HAL_SMARTCARD_Aliased_Macros HAL SMARTCARD Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __SMARTCARD_ENABLE_IT __HAL_SMARTCARD_ENABLE_IT -#define __SMARTCARD_DISABLE_IT __HAL_SMARTCARD_DISABLE_IT -#define __SMARTCARD_ENABLE __HAL_SMARTCARD_ENABLE -#define __SMARTCARD_DISABLE __HAL_SMARTCARD_DISABLE -#define __SMARTCARD_DMA_REQUEST_ENABLE __HAL_SMARTCARD_DMA_REQUEST_ENABLE -#define __SMARTCARD_DMA_REQUEST_DISABLE __HAL_SMARTCARD_DMA_REQUEST_DISABLE - -#define __HAL_SMARTCARD_GETCLOCKSOURCE SMARTCARD_GETCLOCKSOURCE -#define __SMARTCARD_GETCLOCKSOURCE SMARTCARD_GETCLOCKSOURCE - -#define IS_SMARTCARD_ONEBIT_SAMPLING IS_SMARTCARD_ONE_BIT_SAMPLE - -/** - * @} - */ - -/** @defgroup HAL_SMBUS_Aliased_Macros HAL SMBUS Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_SMBUS_RESET_CR1 SMBUS_RESET_CR1 -#define __HAL_SMBUS_RESET_CR2 SMBUS_RESET_CR2 -#define __HAL_SMBUS_GENERATE_START SMBUS_GENERATE_START -#define __HAL_SMBUS_GET_ADDR_MATCH SMBUS_GET_ADDR_MATCH -#define __HAL_SMBUS_GET_DIR SMBUS_GET_DIR -#define __HAL_SMBUS_GET_STOP_MODE SMBUS_GET_STOP_MODE -#define __HAL_SMBUS_GET_PEC_MODE SMBUS_GET_PEC_MODE -#define __HAL_SMBUS_GET_ALERT_ENABLED SMBUS_GET_ALERT_ENABLED -/** - * @} - */ - -/** @defgroup HAL_SPI_Aliased_Macros HAL SPI Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_SPI_1LINE_TX SPI_1LINE_TX -#define __HAL_SPI_1LINE_RX SPI_1LINE_RX -#define __HAL_SPI_RESET_CRC SPI_RESET_CRC - -/** - * @} - */ - -/** @defgroup HAL_UART_Aliased_Macros HAL UART Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_UART_GETCLOCKSOURCE UART_GETCLOCKSOURCE -#define __HAL_UART_MASK_COMPUTATION UART_MASK_COMPUTATION -#define __UART_GETCLOCKSOURCE UART_GETCLOCKSOURCE -#define __UART_MASK_COMPUTATION UART_MASK_COMPUTATION - -#define IS_UART_WAKEUPMETHODE IS_UART_WAKEUPMETHOD - -#define IS_UART_ONEBIT_SAMPLE IS_UART_ONE_BIT_SAMPLE -#define IS_UART_ONEBIT_SAMPLING IS_UART_ONE_BIT_SAMPLE - -/** - * @} - */ - - -/** @defgroup HAL_USART_Aliased_Macros HAL USART Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __USART_ENABLE_IT __HAL_USART_ENABLE_IT -#define __USART_DISABLE_IT __HAL_USART_DISABLE_IT -#define __USART_ENABLE __HAL_USART_ENABLE -#define __USART_DISABLE __HAL_USART_DISABLE - -#define __HAL_USART_GETCLOCKSOURCE USART_GETCLOCKSOURCE -#define __USART_GETCLOCKSOURCE USART_GETCLOCKSOURCE - -#if defined(STM32F0) || defined(STM32F3) || defined(STM32F7) -#define USART_OVERSAMPLING_16 0x00000000U -#define USART_OVERSAMPLING_8 USART_CR1_OVER8 - -#define IS_USART_OVERSAMPLING(__SAMPLING__) (((__SAMPLING__) == USART_OVERSAMPLING_16) || \ - ((__SAMPLING__) == USART_OVERSAMPLING_8)) -#endif /* STM32F0 || STM32F3 || STM32F7 */ -/** - * @} - */ - -/** @defgroup HAL_USB_Aliased_Macros HAL USB Aliased Macros maintained for legacy purpose - * @{ - */ -#define USB_EXTI_LINE_WAKEUP USB_WAKEUP_EXTI_LINE - -#define USB_FS_EXTI_TRIGGER_RISING_EDGE USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE -#define USB_FS_EXTI_TRIGGER_FALLING_EDGE USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE -#define USB_FS_EXTI_TRIGGER_BOTH_EDGE USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE -#define USB_FS_EXTI_LINE_WAKEUP USB_OTG_FS_WAKEUP_EXTI_LINE - -#define USB_HS_EXTI_TRIGGER_RISING_EDGE USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE -#define USB_HS_EXTI_TRIGGER_FALLING_EDGE USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE -#define USB_HS_EXTI_TRIGGER_BOTH_EDGE USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE -#define USB_HS_EXTI_LINE_WAKEUP USB_OTG_HS_WAKEUP_EXTI_LINE - -#define __HAL_USB_EXTI_ENABLE_IT __HAL_USB_WAKEUP_EXTI_ENABLE_IT -#define __HAL_USB_EXTI_DISABLE_IT __HAL_USB_WAKEUP_EXTI_DISABLE_IT -#define __HAL_USB_EXTI_GET_FLAG __HAL_USB_WAKEUP_EXTI_GET_FLAG -#define __HAL_USB_EXTI_CLEAR_FLAG __HAL_USB_WAKEUP_EXTI_CLEAR_FLAG -#define __HAL_USB_EXTI_SET_RISING_EDGE_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_EDGE -#define __HAL_USB_EXTI_SET_FALLING_EDGE_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_FALLING_EDGE -#define __HAL_USB_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE - -#define __HAL_USB_FS_EXTI_ENABLE_IT __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT -#define __HAL_USB_FS_EXTI_DISABLE_IT __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT -#define __HAL_USB_FS_EXTI_GET_FLAG __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG -#define __HAL_USB_FS_EXTI_CLEAR_FLAG __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG -#define __HAL_USB_FS_EXTI_SET_RISING_EGDE_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE -#define __HAL_USB_FS_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_FALLING_EDGE -#define __HAL_USB_FS_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE -#define __HAL_USB_FS_EXTI_GENERATE_SWIT __HAL_USB_OTG_FS_WAKEUP_EXTI_GENERATE_SWIT - -#define __HAL_USB_HS_EXTI_ENABLE_IT __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT -#define __HAL_USB_HS_EXTI_DISABLE_IT __HAL_USB_OTG_HS_WAKEUP_EXTI_DISABLE_IT -#define __HAL_USB_HS_EXTI_GET_FLAG __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG -#define __HAL_USB_HS_EXTI_CLEAR_FLAG __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG -#define __HAL_USB_HS_EXTI_SET_RISING_EGDE_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE -#define __HAL_USB_HS_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_FALLING_EDGE -#define __HAL_USB_HS_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE -#define __HAL_USB_HS_EXTI_GENERATE_SWIT __HAL_USB_OTG_HS_WAKEUP_EXTI_GENERATE_SWIT - -#define HAL_PCD_ActiveRemoteWakeup HAL_PCD_ActivateRemoteWakeup -#define HAL_PCD_DeActiveRemoteWakeup HAL_PCD_DeActivateRemoteWakeup - -#define HAL_PCD_SetTxFiFo HAL_PCDEx_SetTxFiFo -#define HAL_PCD_SetRxFiFo HAL_PCDEx_SetRxFiFo -/** - * @} - */ - -/** @defgroup HAL_TIM_Aliased_Macros HAL TIM Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_TIM_SetICPrescalerValue TIM_SET_ICPRESCALERVALUE -#define __HAL_TIM_ResetICPrescalerValue TIM_RESET_ICPRESCALERVALUE - -#define TIM_GET_ITSTATUS __HAL_TIM_GET_IT_SOURCE -#define TIM_GET_CLEAR_IT __HAL_TIM_CLEAR_IT - -#define __HAL_TIM_GET_ITSTATUS __HAL_TIM_GET_IT_SOURCE - -#define __HAL_TIM_DIRECTION_STATUS __HAL_TIM_IS_TIM_COUNTING_DOWN -#define __HAL_TIM_PRESCALER __HAL_TIM_SET_PRESCALER -#define __HAL_TIM_SetCounter __HAL_TIM_SET_COUNTER -#define __HAL_TIM_GetCounter __HAL_TIM_GET_COUNTER -#define __HAL_TIM_SetAutoreload __HAL_TIM_SET_AUTORELOAD -#define __HAL_TIM_GetAutoreload __HAL_TIM_GET_AUTORELOAD -#define __HAL_TIM_SetClockDivision __HAL_TIM_SET_CLOCKDIVISION -#define __HAL_TIM_GetClockDivision __HAL_TIM_GET_CLOCKDIVISION -#define __HAL_TIM_SetICPrescaler __HAL_TIM_SET_ICPRESCALER -#define __HAL_TIM_GetICPrescaler __HAL_TIM_GET_ICPRESCALER -#define __HAL_TIM_SetCompare __HAL_TIM_SET_COMPARE -#define __HAL_TIM_GetCompare __HAL_TIM_GET_COMPARE - -#define TIM_BREAKINPUTSOURCE_DFSDM TIM_BREAKINPUTSOURCE_DFSDM1 - -#define TIM_OCMODE_ASSYMETRIC_PWM1 TIM_OCMODE_ASYMMETRIC_PWM1 -#define TIM_OCMODE_ASSYMETRIC_PWM2 TIM_OCMODE_ASYMMETRIC_PWM2 -/** - * @} - */ - -/** @defgroup HAL_ETH_Aliased_Macros HAL ETH Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_ETH_EXTI_ENABLE_IT __HAL_ETH_WAKEUP_EXTI_ENABLE_IT -#define __HAL_ETH_EXTI_DISABLE_IT __HAL_ETH_WAKEUP_EXTI_DISABLE_IT -#define __HAL_ETH_EXTI_GET_FLAG __HAL_ETH_WAKEUP_EXTI_GET_FLAG -#define __HAL_ETH_EXTI_CLEAR_FLAG __HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG -#define __HAL_ETH_EXTI_SET_RISING_EGDE_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_RISING_EDGE_TRIGGER -#define __HAL_ETH_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_FALLING_EDGE_TRIGGER -#define __HAL_ETH_EXTI_SET_FALLINGRISING_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_FALLINGRISING_TRIGGER - -#define ETH_PROMISCIOUSMODE_ENABLE ETH_PROMISCUOUS_MODE_ENABLE -#define ETH_PROMISCIOUSMODE_DISABLE ETH_PROMISCUOUS_MODE_DISABLE -#define IS_ETH_PROMISCIOUS_MODE IS_ETH_PROMISCUOUS_MODE -/** - * @} - */ - -/** @defgroup HAL_LTDC_Aliased_Macros HAL LTDC Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_LTDC_LAYER LTDC_LAYER -#define __HAL_LTDC_RELOAD_CONFIG __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG -/** - * @} - */ - -/** @defgroup HAL_SAI_Aliased_Macros HAL SAI Aliased Macros maintained for legacy purpose - * @{ - */ -#define SAI_OUTPUTDRIVE_DISABLED SAI_OUTPUTDRIVE_DISABLE -#define SAI_OUTPUTDRIVE_ENABLED SAI_OUTPUTDRIVE_ENABLE -#define SAI_MASTERDIVIDER_ENABLED SAI_MASTERDIVIDER_ENABLE -#define SAI_MASTERDIVIDER_DISABLED SAI_MASTERDIVIDER_DISABLE -#define SAI_STREOMODE SAI_STEREOMODE -#define SAI_FIFOStatus_Empty SAI_FIFOSTATUS_EMPTY -#define SAI_FIFOStatus_Less1QuarterFull SAI_FIFOSTATUS_LESS1QUARTERFULL -#define SAI_FIFOStatus_1QuarterFull SAI_FIFOSTATUS_1QUARTERFULL -#define SAI_FIFOStatus_HalfFull SAI_FIFOSTATUS_HALFFULL -#define SAI_FIFOStatus_3QuartersFull SAI_FIFOSTATUS_3QUARTERFULL -#define SAI_FIFOStatus_Full SAI_FIFOSTATUS_FULL -#define IS_SAI_BLOCK_MONO_STREO_MODE IS_SAI_BLOCK_MONO_STEREO_MODE -#define SAI_SYNCHRONOUS_EXT SAI_SYNCHRONOUS_EXT_SAI1 -#define SAI_SYNCEXT_IN_ENABLE SAI_SYNCEXT_OUTBLOCKA_ENABLE -/** - * @} - */ - -/** @defgroup HAL_SPDIFRX_Aliased_Macros HAL SPDIFRX Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined(STM32H7) -#define HAL_SPDIFRX_ReceiveControlFlow HAL_SPDIFRX_ReceiveCtrlFlow -#define HAL_SPDIFRX_ReceiveControlFlow_IT HAL_SPDIFRX_ReceiveCtrlFlow_IT -#define HAL_SPDIFRX_ReceiveControlFlow_DMA HAL_SPDIFRX_ReceiveCtrlFlow_DMA -#endif -/** - * @} - */ - -/** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose - * @{ - */ -#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3) -#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT -#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA -#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart -#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT -#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA -#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop -#endif -/** - * @} - */ - -/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined (STM32L4) || defined (STM32F4) || defined (STM32F7) || defined(STM32H7) -#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE -#endif /* STM32L4 || STM32F4 || STM32F7 */ -/** - * @} - */ - -/** @defgroup HAL_Generic_Aliased_Macros HAL Generic Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined (STM32F7) -#define ART_ACCLERATOR_ENABLE ART_ACCELERATOR_ENABLE -#endif /* STM32F7 */ -/** - * @} - */ - -/** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose - * @{ - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32_HAL_LEGACY */ - - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h deleted file mode 100644 index f7eb847..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h +++ /dev/null @@ -1,297 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal.h - * @author MCD Application Team - * @brief This file contains all the functions prototypes for the HAL - * module driver. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_H -#define __STM32F4xx_HAL_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_conf.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup HAL - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup HAL_Exported_Constants HAL Exported Constants - * @{ - */ - -/** @defgroup HAL_TICK_FREQ Tick Frequency - * @{ - */ -typedef enum -{ - HAL_TICK_FREQ_10HZ = 100U, - HAL_TICK_FREQ_100HZ = 10U, - HAL_TICK_FREQ_1KHZ = 1U, - HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ -} HAL_TickFreqTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup HAL_Exported_Macros HAL Exported Macros - * @{ - */ - -/** @brief Freeze/Unfreeze Peripherals in Debug mode - */ -#define __HAL_DBGMCU_FREEZE_TIM2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM2_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM3() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM3_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM4() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM4_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM5() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM5_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM6() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM6_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM7() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM7_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM12() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM12_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM13() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM13_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM14() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM14_STOP)) -#define __HAL_DBGMCU_FREEZE_RTC() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_RTC_STOP)) -#define __HAL_DBGMCU_FREEZE_WWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_WWDG_STOP)) -#define __HAL_DBGMCU_FREEZE_IWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_IWDG_STOP)) -#define __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_CAN1() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN1_STOP)) -#define __HAL_DBGMCU_FREEZE_CAN2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN2_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM1() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM1_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM8() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM8_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM9() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM9_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM10() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM10_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM11() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM11_STOP)) - -#define __HAL_DBGMCU_UNFREEZE_TIM2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM2_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM3() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM3_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM4() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM4_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM5() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM5_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM6() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM6_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM7() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM7_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM12() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM12_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM13() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM13_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM14() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM14_STOP)) -#define __HAL_DBGMCU_UNFREEZE_RTC() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_RTC_STOP)) -#define __HAL_DBGMCU_UNFREEZE_WWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_WWDG_STOP)) -#define __HAL_DBGMCU_UNFREEZE_IWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_IWDG_STOP)) -#define __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_CAN1() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN1_STOP)) -#define __HAL_DBGMCU_UNFREEZE_CAN2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN2_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM1() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM1_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM8() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM8_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM9() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM9_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM10() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM10_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM11() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM11_STOP)) - -/** @brief Main Flash memory mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FLASH() (SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE)) - -/** @brief System Flash memory mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= SYSCFG_MEMRMP_MEM_MODE_0;\ - }while(0); - -/** @brief Embedded SRAM mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_SRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_0 | SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -/** @brief FSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FSMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** @brief FMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); - -/** @brief FMC/SDRAM Bank 1 and 2 mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_2);\ - }while(0); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup Cortex_Lockup_Enable Cortex Lockup Enable - * @{ - */ -/** @brief SYSCFG Break Lockup lock - * Enables and locks the connection of Cortex-M4 LOCKUP (Hardfault) output to TIM1/8 input - * @note The selected configuration is locked and can be unlocked by system reset - */ -#define __HAL_SYSCFG_BREAK_PVD_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_PVD_LOCK); \ - SYSCFG->CFGR2 |= SYSCFG_CFGR2_PVD_LOCK; \ - }while(0) -/** - * @} - */ - -/** @defgroup PVD_Lock_Enable PVD Lock - * @{ - */ -/** @brief SYSCFG Break PVD lock - * Enables and locks the PVD connection with Timer1/8 Break Input, , as well as the PVDE and PLS[2:0] in the PWR_CR register - * @note The selected configuration is locked and can be unlocked by system reset - */ -#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_LOCKUP_LOCK); \ - SYSCFG->CFGR2 |= SYSCFG_CFGR2_LOCKUP_LOCK; \ - }while(0) -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup HAL_Private_Macros HAL Private Macros - * @{ - */ -#define IS_TICKFREQ(FREQ) (((FREQ) == HAL_TICK_FREQ_10HZ) || \ - ((FREQ) == HAL_TICK_FREQ_100HZ) || \ - ((FREQ) == HAL_TICK_FREQ_1KHZ)) -/** - * @} - */ - -/* Exported variables --------------------------------------------------------*/ - -/** @addtogroup HAL_Exported_Variables - * @{ - */ -extern __IO uint32_t uwTick; -extern uint32_t uwTickPrio; -extern HAL_TickFreqTypeDef uwTickFreq; -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_Exported_Functions - * @{ - */ -/** @addtogroup HAL_Exported_Functions_Group1 - * @{ - */ -/* Initialization and Configuration functions ******************************/ -HAL_StatusTypeDef HAL_Init(void); -HAL_StatusTypeDef HAL_DeInit(void); -void HAL_MspInit(void); -void HAL_MspDeInit(void); -HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority); -/** - * @} - */ - -/** @addtogroup HAL_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions ************************************************/ -void HAL_IncTick(void); -void HAL_Delay(uint32_t Delay); -uint32_t HAL_GetTick(void); -uint32_t HAL_GetTickPrio(void); -HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq); -HAL_TickFreqTypeDef HAL_GetTickFreq(void); -void HAL_SuspendTick(void); -void HAL_ResumeTick(void); -uint32_t HAL_GetHalVersion(void); -uint32_t HAL_GetREVID(void); -uint32_t HAL_GetDEVID(void); -void HAL_DBGMCU_EnableDBGSleepMode(void); -void HAL_DBGMCU_DisableDBGSleepMode(void); -void HAL_DBGMCU_EnableDBGStopMode(void); -void HAL_DBGMCU_DisableDBGStopMode(void); -void HAL_DBGMCU_EnableDBGStandbyMode(void); -void HAL_DBGMCU_DisableDBGStandbyMode(void); -void HAL_EnableCompensationCell(void); -void HAL_DisableCompensationCell(void); -uint32_t HAL_GetUIDw0(void); -uint32_t HAL_GetUIDw1(void); -uint32_t HAL_GetUIDw2(void); -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -void HAL_EnableMemorySwappingBank(void); -void HAL_DisableMemorySwappingBank(void); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup HAL_Private_Variables HAL Private Variables - * @{ - */ -/** - * @} - */ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup HAL_Private_Constants HAL Private Constants - * @{ - */ -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_H */ - - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h deleted file mode 100644 index c79a073..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h +++ /dev/null @@ -1,898 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_adc.h - * @author MCD Application Team - * @brief Header file containing functions prototypes of ADC HAL library. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_ADC_H -#define __STM32F4xx_ADC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/* Include low level driver */ -#include "stm32f4xx_ll_adc.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup ADC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup ADC_Exported_Types ADC Exported Types - * @{ - */ - -/** - * @brief Structure definition of ADC and regular group initialization - * @note Parameters of this structure are shared within 2 scopes: - * - Scope entire ADC (affects regular and injected groups): ClockPrescaler, Resolution, ScanConvMode, DataAlign, ScanConvMode, EOCSelection, LowPowerAutoWait, LowPowerAutoPowerOff, ChannelsBank. - * - Scope regular group: ContinuousConvMode, NbrOfConversion, DiscontinuousConvMode, NbrOfDiscConversion, ExternalTrigConvEdge, ExternalTrigConv. - * @note The setting of these parameters with function HAL_ADC_Init() is conditioned to ADC state. - * ADC state can be either: - * - For all parameters: ADC disabled - * - For all parameters except 'Resolution', 'ScanConvMode', 'DiscontinuousConvMode', 'NbrOfDiscConversion' : ADC enabled without conversion on going on regular group. - * - For parameters 'ExternalTrigConv' and 'ExternalTrigConvEdge': ADC enabled, even with conversion on going. - * If ADC is not in the appropriate state to modify some parameters, these parameters setting is bypassed - * without error reporting (as it can be the expected behaviour in case of intended action to update another parameter (which fulfills the ADC state condition) on the fly). - */ -typedef struct -{ - uint32_t ClockPrescaler; /*!< Select ADC clock prescaler. The clock is common for - all the ADCs. - This parameter can be a value of @ref ADC_ClockPrescaler */ - uint32_t Resolution; /*!< Configures the ADC resolution. - This parameter can be a value of @ref ADC_Resolution */ - uint32_t DataAlign; /*!< Specifies ADC data alignment to right (MSB on register bit 11 and LSB on register bit 0) (default setting) - or to left (if regular group: MSB on register bit 15 and LSB on register bit 4, if injected group (MSB kept as signed value due to potential negative value after offset application): MSB on register bit 14 and LSB on register bit 3). - This parameter can be a value of @ref ADC_Data_align */ - uint32_t ScanConvMode; /*!< Configures the sequencer of regular and injected groups. - This parameter can be associated to parameter 'DiscontinuousConvMode' to have main sequence subdivided in successive parts. - If disabled: Conversion is performed in single mode (one channel converted, the one defined in rank 1). - Parameters 'NbrOfConversion' and 'InjectedNbrOfConversion' are discarded (equivalent to set to 1). - If enabled: Conversions are performed in sequence mode (multiple ranks defined by 'NbrOfConversion'/'InjectedNbrOfConversion' and each channel rank). - Scan direction is upward: from rank1 to rank 'n'. - This parameter can be set to ENABLE or DISABLE */ - uint32_t EOCSelection; /*!< Specifies what EOC (End Of Conversion) flag is used for conversion by polling and interruption: end of conversion of each rank or complete sequence. - This parameter can be a value of @ref ADC_EOCSelection. - Note: For injected group, end of conversion (flag&IT) is raised only at the end of the sequence. - Therefore, if end of conversion is set to end of each conversion, injected group should not be used with interruption (HAL_ADCEx_InjectedStart_IT) - or polling (HAL_ADCEx_InjectedStart and HAL_ADCEx_InjectedPollForConversion). By the way, polling is still possible since driver will use an estimated timing for end of injected conversion. - Note: If overrun feature is intended to be used, use ADC in mode 'interruption' (function HAL_ADC_Start_IT() ) with parameter EOCSelection set to end of each conversion or in mode 'transfer by DMA' (function HAL_ADC_Start_DMA()). - If overrun feature is intended to be bypassed, use ADC in mode 'polling' or 'interruption' with parameter EOCSelection must be set to end of sequence */ - FunctionalState ContinuousConvMode; /*!< Specifies whether the conversion is performed in single mode (one conversion) or continuous mode for regular group, - after the selected trigger occurred (software start or external trigger). - This parameter can be set to ENABLE or DISABLE. */ - uint32_t NbrOfConversion; /*!< Specifies the number of ranks that will be converted within the regular group sequencer. - To use regular group sequencer and convert several ranks, parameter 'ScanConvMode' must be enabled. - This parameter must be a number between Min_Data = 1 and Max_Data = 16. */ - FunctionalState DiscontinuousConvMode; /*!< Specifies whether the conversions sequence of regular group is performed in Complete-sequence/Discontinuous-sequence (main sequence subdivided in successive parts). - Discontinuous mode is used only if sequencer is enabled (parameter 'ScanConvMode'). If sequencer is disabled, this parameter is discarded. - Discontinuous mode can be enabled only if continuous mode is disabled. If continuous mode is enabled, this parameter setting is discarded. - This parameter can be set to ENABLE or DISABLE. */ - uint32_t NbrOfDiscConversion; /*!< Specifies the number of discontinuous conversions in which the main sequence of regular group (parameter NbrOfConversion) will be subdivided. - If parameter 'DiscontinuousConvMode' is disabled, this parameter is discarded. - This parameter must be a number between Min_Data = 1 and Max_Data = 8. */ - uint32_t ExternalTrigConv; /*!< Selects the external event used to trigger the conversion start of regular group. - If set to ADC_SOFTWARE_START, external triggers are disabled. - If set to external trigger source, triggering is on event rising edge by default. - This parameter can be a value of @ref ADC_External_trigger_Source_Regular */ - uint32_t ExternalTrigConvEdge; /*!< Selects the external trigger edge of regular group. - If trigger is set to ADC_SOFTWARE_START, this parameter is discarded. - This parameter can be a value of @ref ADC_External_trigger_edge_Regular */ - FunctionalState DMAContinuousRequests; /*!< Specifies whether the DMA requests are performed in one shot mode (DMA transfer stop when number of conversions is reached) - or in Continuous mode (DMA transfer unlimited, whatever number of conversions). - Note: In continuous mode, DMA must be configured in circular mode. Otherwise an overrun will be triggered when DMA buffer maximum pointer is reached. - Note: This parameter must be modified when no conversion is on going on both regular and injected groups (ADC disabled, or ADC enabled without continuous mode or external trigger that could launch a conversion). - This parameter can be set to ENABLE or DISABLE. */ -} ADC_InitTypeDef; - - - -/** - * @brief Structure definition of ADC channel for regular group - * @note The setting of these parameters with function HAL_ADC_ConfigChannel() is conditioned to ADC state. - * ADC can be either disabled or enabled without conversion on going on regular group. - */ -typedef struct -{ - uint32_t Channel; /*!< Specifies the channel to configure into ADC regular group. - This parameter can be a value of @ref ADC_channels */ - uint32_t Rank; /*!< Specifies the rank in the regular group sequencer. - This parameter must be a number between Min_Data = 1 and Max_Data = 16 */ - uint32_t SamplingTime; /*!< Sampling time value to be set for the selected channel. - Unit: ADC clock cycles - Conversion time is the addition of sampling time and processing time (12 ADC clock cycles at ADC resolution 12 bits, 11 cycles at 10 bits, 9 cycles at 8 bits, 7 cycles at 6 bits). - This parameter can be a value of @ref ADC_sampling_times - Caution: This parameter updates the parameter property of the channel, that can be used into regular and/or injected groups. - If this same channel has been previously configured in the other group (regular/injected), it will be updated to last setting. - Note: In case of usage of internal measurement channels (VrefInt/Vbat/TempSensor), - sampling time constraints must be respected (sampling time can be adjusted in function of ADC clock frequency and sampling time setting) - Refer to device datasheet for timings values, parameters TS_vrefint, TS_temp (values rough order: 4us min). */ - uint32_t Offset; /*!< Reserved for future use, can be set to 0 */ -} ADC_ChannelConfTypeDef; - -/** - * @brief ADC Configuration multi-mode structure definition - */ -typedef struct -{ - uint32_t WatchdogMode; /*!< Configures the ADC analog watchdog mode. - This parameter can be a value of @ref ADC_analog_watchdog_selection */ - uint32_t HighThreshold; /*!< Configures the ADC analog watchdog High threshold value. - This parameter must be a 12-bit value. */ - uint32_t LowThreshold; /*!< Configures the ADC analog watchdog High threshold value. - This parameter must be a 12-bit value. */ - uint32_t Channel; /*!< Configures ADC channel for the analog watchdog. - This parameter has an effect only if watchdog mode is configured on single channel - This parameter can be a value of @ref ADC_channels */ - FunctionalState ITMode; /*!< Specifies whether the analog watchdog is configured - is interrupt mode or in polling mode. - This parameter can be set to ENABLE or DISABLE */ - uint32_t WatchdogNumber; /*!< Reserved for future use, can be set to 0 */ -} ADC_AnalogWDGConfTypeDef; - -/** - * @brief HAL ADC state machine: ADC states definition (bitfields) - */ -/* States of ADC global scope */ -#define HAL_ADC_STATE_RESET 0x00000000U /*!< ADC not yet initialized or disabled */ -#define HAL_ADC_STATE_READY 0x00000001U /*!< ADC peripheral ready for use */ -#define HAL_ADC_STATE_BUSY_INTERNAL 0x00000002U /*!< ADC is busy to internal process (initialization, calibration) */ -#define HAL_ADC_STATE_TIMEOUT 0x00000004U /*!< TimeOut occurrence */ - -/* States of ADC errors */ -#define HAL_ADC_STATE_ERROR_INTERNAL 0x00000010U /*!< Internal error occurrence */ -#define HAL_ADC_STATE_ERROR_CONFIG 0x00000020U /*!< Configuration error occurrence */ -#define HAL_ADC_STATE_ERROR_DMA 0x00000040U /*!< DMA error occurrence */ - -/* States of ADC group regular */ -#define HAL_ADC_STATE_REG_BUSY 0x00000100U /*!< A conversion on group regular is ongoing or can occur (either by continuous mode, - external trigger, low power auto power-on (if feature available), multimode ADC master control (if feature available)) */ -#define HAL_ADC_STATE_REG_EOC 0x00000200U /*!< Conversion data available on group regular */ -#define HAL_ADC_STATE_REG_OVR 0x00000400U /*!< Overrun occurrence */ - -/* States of ADC group injected */ -#define HAL_ADC_STATE_INJ_BUSY 0x00001000U /*!< A conversion on group injected is ongoing or can occur (either by auto-injection mode, - external trigger, low power auto power-on (if feature available), multimode ADC master control (if feature available)) */ -#define HAL_ADC_STATE_INJ_EOC 0x00002000U /*!< Conversion data available on group injected */ - -/* States of ADC analog watchdogs */ -#define HAL_ADC_STATE_AWD1 0x00010000U /*!< Out-of-window occurrence of analog watchdog 1 */ -#define HAL_ADC_STATE_AWD2 0x00020000U /*!< Not available on STM32F4 device: Out-of-window occurrence of analog watchdog 2 */ -#define HAL_ADC_STATE_AWD3 0x00040000U /*!< Not available on STM32F4 device: Out-of-window occurrence of analog watchdog 3 */ - -/* States of ADC multi-mode */ -#define HAL_ADC_STATE_MULTIMODE_SLAVE 0x00100000U /*!< Not available on STM32F4 device: ADC in multimode slave state, controlled by another ADC master ( */ - - -/** - * @brief ADC handle Structure definition - */ -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) -typedef struct __ADC_HandleTypeDef -#else -typedef struct -#endif -{ - ADC_TypeDef *Instance; /*!< Register base address */ - - ADC_InitTypeDef Init; /*!< ADC required parameters */ - - __IO uint32_t NbrOfCurrentConversionRank; /*!< ADC number of current conversion rank */ - - DMA_HandleTypeDef *DMA_Handle; /*!< Pointer DMA Handler */ - - HAL_LockTypeDef Lock; /*!< ADC locking object */ - - __IO uint32_t State; /*!< ADC communication state */ - - __IO uint32_t ErrorCode; /*!< ADC Error code */ -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) - void (* ConvCpltCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC conversion complete callback */ - void (* ConvHalfCpltCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC conversion DMA half-transfer callback */ - void (* LevelOutOfWindowCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC analog watchdog 1 callback */ - void (* ErrorCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC error callback */ - void (* InjectedConvCpltCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC group injected conversion complete callback */ - void (* MspInitCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC Msp Init callback */ - void (* MspDeInitCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC Msp DeInit callback */ -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ -} ADC_HandleTypeDef; - -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) -/** - * @brief HAL ADC Callback ID enumeration definition - */ -typedef enum -{ - HAL_ADC_CONVERSION_COMPLETE_CB_ID = 0x00U, /*!< ADC conversion complete callback ID */ - HAL_ADC_CONVERSION_HALF_CB_ID = 0x01U, /*!< ADC conversion DMA half-transfer callback ID */ - HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID = 0x02U, /*!< ADC analog watchdog 1 callback ID */ - HAL_ADC_ERROR_CB_ID = 0x03U, /*!< ADC error callback ID */ - HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID = 0x04U, /*!< ADC group injected conversion complete callback ID */ - HAL_ADC_MSPINIT_CB_ID = 0x05U, /*!< ADC Msp Init callback ID */ - HAL_ADC_MSPDEINIT_CB_ID = 0x06U /*!< ADC Msp DeInit callback ID */ -} HAL_ADC_CallbackIDTypeDef; - -/** - * @brief HAL ADC Callback pointer definition - */ -typedef void (*pADC_CallbackTypeDef)(ADC_HandleTypeDef *hadc); /*!< pointer to a ADC callback function */ - -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup ADC_Exported_Constants ADC Exported Constants - * @{ - */ - -/** @defgroup ADC_Error_Code ADC Error Code - * @{ - */ -#define HAL_ADC_ERROR_NONE 0x00U /*!< No error */ -#define HAL_ADC_ERROR_INTERNAL 0x01U /*!< ADC IP internal error: if problem of clocking, - enable/disable, erroneous state */ -#define HAL_ADC_ERROR_OVR 0x02U /*!< Overrun error */ -#define HAL_ADC_ERROR_DMA 0x04U /*!< DMA transfer error */ -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) -#define HAL_ADC_ERROR_INVALID_CALLBACK (0x10U) /*!< Invalid Callback error */ -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ -/** - * @} - */ - - -/** @defgroup ADC_ClockPrescaler ADC Clock Prescaler - * @{ - */ -#define ADC_CLOCK_SYNC_PCLK_DIV2 0x00000000U -#define ADC_CLOCK_SYNC_PCLK_DIV4 ((uint32_t)ADC_CCR_ADCPRE_0) -#define ADC_CLOCK_SYNC_PCLK_DIV6 ((uint32_t)ADC_CCR_ADCPRE_1) -#define ADC_CLOCK_SYNC_PCLK_DIV8 ((uint32_t)ADC_CCR_ADCPRE) -/** - * @} - */ - -/** @defgroup ADC_delay_between_2_sampling_phases ADC Delay Between 2 Sampling Phases - * @{ - */ -#define ADC_TWOSAMPLINGDELAY_5CYCLES 0x00000000U -#define ADC_TWOSAMPLINGDELAY_6CYCLES ((uint32_t)ADC_CCR_DELAY_0) -#define ADC_TWOSAMPLINGDELAY_7CYCLES ((uint32_t)ADC_CCR_DELAY_1) -#define ADC_TWOSAMPLINGDELAY_8CYCLES ((uint32_t)(ADC_CCR_DELAY_1 | ADC_CCR_DELAY_0)) -#define ADC_TWOSAMPLINGDELAY_9CYCLES ((uint32_t)ADC_CCR_DELAY_2) -#define ADC_TWOSAMPLINGDELAY_10CYCLES ((uint32_t)(ADC_CCR_DELAY_2 | ADC_CCR_DELAY_0)) -#define ADC_TWOSAMPLINGDELAY_11CYCLES ((uint32_t)(ADC_CCR_DELAY_2 | ADC_CCR_DELAY_1)) -#define ADC_TWOSAMPLINGDELAY_12CYCLES ((uint32_t)(ADC_CCR_DELAY_2 | ADC_CCR_DELAY_1 | ADC_CCR_DELAY_0)) -#define ADC_TWOSAMPLINGDELAY_13CYCLES ((uint32_t)ADC_CCR_DELAY_3) -#define ADC_TWOSAMPLINGDELAY_14CYCLES ((uint32_t)(ADC_CCR_DELAY_3 | ADC_CCR_DELAY_0)) -#define ADC_TWOSAMPLINGDELAY_15CYCLES ((uint32_t)(ADC_CCR_DELAY_3 | ADC_CCR_DELAY_1)) -#define ADC_TWOSAMPLINGDELAY_16CYCLES ((uint32_t)(ADC_CCR_DELAY_3 | ADC_CCR_DELAY_1 | ADC_CCR_DELAY_0)) -#define ADC_TWOSAMPLINGDELAY_17CYCLES ((uint32_t)(ADC_CCR_DELAY_3 | ADC_CCR_DELAY_2)) -#define ADC_TWOSAMPLINGDELAY_18CYCLES ((uint32_t)(ADC_CCR_DELAY_3 | ADC_CCR_DELAY_2 | ADC_CCR_DELAY_0)) -#define ADC_TWOSAMPLINGDELAY_19CYCLES ((uint32_t)(ADC_CCR_DELAY_3 | ADC_CCR_DELAY_2 | ADC_CCR_DELAY_1)) -#define ADC_TWOSAMPLINGDELAY_20CYCLES ((uint32_t)ADC_CCR_DELAY) -/** - * @} - */ - -/** @defgroup ADC_Resolution ADC Resolution - * @{ - */ -#define ADC_RESOLUTION_12B 0x00000000U -#define ADC_RESOLUTION_10B ((uint32_t)ADC_CR1_RES_0) -#define ADC_RESOLUTION_8B ((uint32_t)ADC_CR1_RES_1) -#define ADC_RESOLUTION_6B ((uint32_t)ADC_CR1_RES) -/** - * @} - */ - -/** @defgroup ADC_External_trigger_edge_Regular ADC External Trigger Edge Regular - * @{ - */ -#define ADC_EXTERNALTRIGCONVEDGE_NONE 0x00000000U -#define ADC_EXTERNALTRIGCONVEDGE_RISING ((uint32_t)ADC_CR2_EXTEN_0) -#define ADC_EXTERNALTRIGCONVEDGE_FALLING ((uint32_t)ADC_CR2_EXTEN_1) -#define ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING ((uint32_t)ADC_CR2_EXTEN) -/** - * @} - */ - -/** @defgroup ADC_External_trigger_Source_Regular ADC External Trigger Source Regular - * @{ - */ -/* Note: Parameter ADC_SOFTWARE_START is a software parameter used for */ -/* compatibility with other STM32 devices. */ -#define ADC_EXTERNALTRIGCONV_T1_CC1 0x00000000U -#define ADC_EXTERNALTRIGCONV_T1_CC2 ((uint32_t)ADC_CR2_EXTSEL_0) -#define ADC_EXTERNALTRIGCONV_T1_CC3 ((uint32_t)ADC_CR2_EXTSEL_1) -#define ADC_EXTERNALTRIGCONV_T2_CC2 ((uint32_t)(ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0)) -#define ADC_EXTERNALTRIGCONV_T2_CC3 ((uint32_t)ADC_CR2_EXTSEL_2) -#define ADC_EXTERNALTRIGCONV_T2_CC4 ((uint32_t)(ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_0)) -#define ADC_EXTERNALTRIGCONV_T2_TRGO ((uint32_t)(ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1)) -#define ADC_EXTERNALTRIGCONV_T3_CC1 ((uint32_t)(ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0)) -#define ADC_EXTERNALTRIGCONV_T3_TRGO ((uint32_t)ADC_CR2_EXTSEL_3) -#define ADC_EXTERNALTRIGCONV_T4_CC4 ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_0)) -#define ADC_EXTERNALTRIGCONV_T5_CC1 ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_1)) -#define ADC_EXTERNALTRIGCONV_T5_CC2 ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0)) -#define ADC_EXTERNALTRIGCONV_T5_CC3 ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2)) -#define ADC_EXTERNALTRIGCONV_T8_CC1 ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_0)) -#define ADC_EXTERNALTRIGCONV_T8_TRGO ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1)) -#define ADC_EXTERNALTRIGCONV_Ext_IT11 ((uint32_t)ADC_CR2_EXTSEL) -#define ADC_SOFTWARE_START ((uint32_t)ADC_CR2_EXTSEL + 1U) -/** - * @} - */ - -/** @defgroup ADC_Data_align ADC Data Align - * @{ - */ -#define ADC_DATAALIGN_RIGHT 0x00000000U -#define ADC_DATAALIGN_LEFT ((uint32_t)ADC_CR2_ALIGN) -/** - * @} - */ - -/** @defgroup ADC_channels ADC Common Channels - * @{ - */ -#define ADC_CHANNEL_0 0x00000000U -#define ADC_CHANNEL_1 ((uint32_t)ADC_CR1_AWDCH_0) -#define ADC_CHANNEL_2 ((uint32_t)ADC_CR1_AWDCH_1) -#define ADC_CHANNEL_3 ((uint32_t)(ADC_CR1_AWDCH_1 | ADC_CR1_AWDCH_0)) -#define ADC_CHANNEL_4 ((uint32_t)ADC_CR1_AWDCH_2) -#define ADC_CHANNEL_5 ((uint32_t)(ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_0)) -#define ADC_CHANNEL_6 ((uint32_t)(ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_1)) -#define ADC_CHANNEL_7 ((uint32_t)(ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_1 | ADC_CR1_AWDCH_0)) -#define ADC_CHANNEL_8 ((uint32_t)ADC_CR1_AWDCH_3) -#define ADC_CHANNEL_9 ((uint32_t)(ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_0)) -#define ADC_CHANNEL_10 ((uint32_t)(ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_1)) -#define ADC_CHANNEL_11 ((uint32_t)(ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_1 | ADC_CR1_AWDCH_0)) -#define ADC_CHANNEL_12 ((uint32_t)(ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_2)) -#define ADC_CHANNEL_13 ((uint32_t)(ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_0)) -#define ADC_CHANNEL_14 ((uint32_t)(ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_1)) -#define ADC_CHANNEL_15 ((uint32_t)(ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_1 | ADC_CR1_AWDCH_0)) -#define ADC_CHANNEL_16 ((uint32_t)ADC_CR1_AWDCH_4) -#define ADC_CHANNEL_17 ((uint32_t)(ADC_CR1_AWDCH_4 | ADC_CR1_AWDCH_0)) -#define ADC_CHANNEL_18 ((uint32_t)(ADC_CR1_AWDCH_4 | ADC_CR1_AWDCH_1)) - -#define ADC_CHANNEL_VREFINT ((uint32_t)ADC_CHANNEL_17) -#define ADC_CHANNEL_VBAT ((uint32_t)ADC_CHANNEL_18) -/** - * @} - */ - -/** @defgroup ADC_sampling_times ADC Sampling Times - * @{ - */ -#define ADC_SAMPLETIME_3CYCLES 0x00000000U -#define ADC_SAMPLETIME_15CYCLES ((uint32_t)ADC_SMPR1_SMP10_0) -#define ADC_SAMPLETIME_28CYCLES ((uint32_t)ADC_SMPR1_SMP10_1) -#define ADC_SAMPLETIME_56CYCLES ((uint32_t)(ADC_SMPR1_SMP10_1 | ADC_SMPR1_SMP10_0)) -#define ADC_SAMPLETIME_84CYCLES ((uint32_t)ADC_SMPR1_SMP10_2) -#define ADC_SAMPLETIME_112CYCLES ((uint32_t)(ADC_SMPR1_SMP10_2 | ADC_SMPR1_SMP10_0)) -#define ADC_SAMPLETIME_144CYCLES ((uint32_t)(ADC_SMPR1_SMP10_2 | ADC_SMPR1_SMP10_1)) -#define ADC_SAMPLETIME_480CYCLES ((uint32_t)ADC_SMPR1_SMP10) -/** - * @} - */ - -/** @defgroup ADC_EOCSelection ADC EOC Selection - * @{ - */ -#define ADC_EOC_SEQ_CONV 0x00000000U -#define ADC_EOC_SINGLE_CONV 0x00000001U -#define ADC_EOC_SINGLE_SEQ_CONV 0x00000002U /*!< reserved for future use */ -/** - * @} - */ - -/** @defgroup ADC_Event_type ADC Event Type - * @{ - */ -#define ADC_AWD_EVENT ((uint32_t)ADC_FLAG_AWD) -#define ADC_OVR_EVENT ((uint32_t)ADC_FLAG_OVR) -/** - * @} - */ - -/** @defgroup ADC_analog_watchdog_selection ADC Analog Watchdog Selection - * @{ - */ -#define ADC_ANALOGWATCHDOG_SINGLE_REG ((uint32_t)(ADC_CR1_AWDSGL | ADC_CR1_AWDEN)) -#define ADC_ANALOGWATCHDOG_SINGLE_INJEC ((uint32_t)(ADC_CR1_AWDSGL | ADC_CR1_JAWDEN)) -#define ADC_ANALOGWATCHDOG_SINGLE_REGINJEC ((uint32_t)(ADC_CR1_AWDSGL | ADC_CR1_AWDEN | ADC_CR1_JAWDEN)) -#define ADC_ANALOGWATCHDOG_ALL_REG ((uint32_t)ADC_CR1_AWDEN) -#define ADC_ANALOGWATCHDOG_ALL_INJEC ((uint32_t)ADC_CR1_JAWDEN) -#define ADC_ANALOGWATCHDOG_ALL_REGINJEC ((uint32_t)(ADC_CR1_AWDEN | ADC_CR1_JAWDEN)) -#define ADC_ANALOGWATCHDOG_NONE 0x00000000U -/** - * @} - */ - -/** @defgroup ADC_interrupts_definition ADC Interrupts Definition - * @{ - */ -#define ADC_IT_EOC ((uint32_t)ADC_CR1_EOCIE) -#define ADC_IT_AWD ((uint32_t)ADC_CR1_AWDIE) -#define ADC_IT_JEOC ((uint32_t)ADC_CR1_JEOCIE) -#define ADC_IT_OVR ((uint32_t)ADC_CR1_OVRIE) -/** - * @} - */ - -/** @defgroup ADC_flags_definition ADC Flags Definition - * @{ - */ -#define ADC_FLAG_AWD ((uint32_t)ADC_SR_AWD) -#define ADC_FLAG_EOC ((uint32_t)ADC_SR_EOC) -#define ADC_FLAG_JEOC ((uint32_t)ADC_SR_JEOC) -#define ADC_FLAG_JSTRT ((uint32_t)ADC_SR_JSTRT) -#define ADC_FLAG_STRT ((uint32_t)ADC_SR_STRT) -#define ADC_FLAG_OVR ((uint32_t)ADC_SR_OVR) -/** - * @} - */ - -/** @defgroup ADC_channels_type ADC Channels Type - * @{ - */ -#define ADC_ALL_CHANNELS 0x00000001U -#define ADC_REGULAR_CHANNELS 0x00000002U /*!< reserved for future use */ -#define ADC_INJECTED_CHANNELS 0x00000003U /*!< reserved for future use */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup ADC_Exported_Macros ADC Exported Macros - * @{ - */ - -/** @brief Reset ADC handle state - * @param __HANDLE__ ADC handle - * @retval None - */ -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) -#define __HAL_ADC_RESET_HANDLE_STATE(__HANDLE__) \ - do{ \ - (__HANDLE__)->State = HAL_ADC_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_ADC_RESET_HANDLE_STATE(__HANDLE__) \ - ((__HANDLE__)->State = HAL_ADC_STATE_RESET) -#endif - -/** - * @brief Enable the ADC peripheral. - * @param __HANDLE__ ADC handle - * @retval None - */ -#define __HAL_ADC_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR2 |= ADC_CR2_ADON) - -/** - * @brief Disable the ADC peripheral. - * @param __HANDLE__ ADC handle - * @retval None - */ -#define __HAL_ADC_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR2 &= ~ADC_CR2_ADON) - -/** - * @brief Enable the ADC end of conversion interrupt. - * @param __HANDLE__ specifies the ADC Handle. - * @param __INTERRUPT__ ADC Interrupt. - * @retval None - */ -#define __HAL_ADC_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->CR1) |= (__INTERRUPT__)) - -/** - * @brief Disable the ADC end of conversion interrupt. - * @param __HANDLE__ specifies the ADC Handle. - * @param __INTERRUPT__ ADC interrupt. - * @retval None - */ -#define __HAL_ADC_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->CR1) &= ~(__INTERRUPT__)) - -/** @brief Check if the specified ADC interrupt source is enabled or disabled. - * @param __HANDLE__ specifies the ADC Handle. - * @param __INTERRUPT__ specifies the ADC interrupt source to check. - * @retval The new state of __IT__ (TRUE or FALSE). - */ -#define __HAL_ADC_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->CR1 & (__INTERRUPT__)) == (__INTERRUPT__)) - -/** - * @brief Clear the ADC's pending flags. - * @param __HANDLE__ specifies the ADC Handle. - * @param __FLAG__ ADC flag. - * @retval None - */ -#define __HAL_ADC_CLEAR_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR) = ~(__FLAG__)) - -/** - * @brief Get the selected ADC's flag status. - * @param __HANDLE__ specifies the ADC Handle. - * @param __FLAG__ ADC flag. - * @retval None - */ -#define __HAL_ADC_GET_FLAG(__HANDLE__, __FLAG__) ((((__HANDLE__)->Instance->SR) & (__FLAG__)) == (__FLAG__)) - -/** - * @} - */ - -/* Include ADC HAL Extension module */ -#include "stm32f4xx_hal_adc_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup ADC_Exported_Functions - * @{ - */ - -/** @addtogroup ADC_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions ***********************************/ -HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc); -HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc); -void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc); -void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc); - -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) -/* Callbacks Register/UnRegister functions ***********************************/ -HAL_StatusTypeDef HAL_ADC_RegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID, pADC_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @addtogroup ADC_Exported_Functions_Group2 - * @{ - */ -/* I/O operation functions ******************************************************/ -HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc); -HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc); -HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout); - -HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef *hadc, uint32_t EventType, uint32_t Timeout); - -HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef *hadc); -HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef *hadc); - -void HAL_ADC_IRQHandler(ADC_HandleTypeDef *hadc); - -HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length); -HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef *hadc); - -uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc); - -void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc); -void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc); -void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef *hadc); -void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc); -/** - * @} - */ - -/** @addtogroup ADC_Exported_Functions_Group3 - * @{ - */ -/* Peripheral Control functions *************************************************/ -HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef *hadc, ADC_ChannelConfTypeDef *sConfig); -HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef *hadc, ADC_AnalogWDGConfTypeDef *AnalogWDGConfig); -/** - * @} - */ - -/** @addtogroup ADC_Exported_Functions_Group4 - * @{ - */ -/* Peripheral State functions ***************************************************/ -uint32_t HAL_ADC_GetState(ADC_HandleTypeDef *hadc); -uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup ADC_Private_Constants ADC Private Constants - * @{ - */ -/* Delay for ADC stabilization time. */ -/* Maximum delay is 1us (refer to device datasheet, parameter tSTAB). */ -/* Unit: us */ -#define ADC_STAB_DELAY_US 3U -/* Delay for temperature sensor stabilization time. */ -/* Maximum delay is 10us (refer to device datasheet, parameter tSTART). */ -/* Unit: us */ -#define ADC_TEMPSENSOR_DELAY_US 10U -/** - * @} - */ - -/* Private macro ------------------------------------------------------------*/ - -/** @defgroup ADC_Private_Macros ADC Private Macros - * @{ - */ -/* Macro reserved for internal HAL driver usage, not intended to be used in - code of final user */ - -/** - * @brief Verification of ADC state: enabled or disabled - * @param __HANDLE__ ADC handle - * @retval SET (ADC enabled) or RESET (ADC disabled) - */ -#define ADC_IS_ENABLE(__HANDLE__) \ - ((( ((__HANDLE__)->Instance->SR & ADC_SR_ADONS) == ADC_SR_ADONS ) \ - ) ? SET : RESET) - -/** - * @brief Test if conversion trigger of regular group is software start - * or external trigger. - * @param __HANDLE__ ADC handle - * @retval SET (software start) or RESET (external trigger) - */ -#define ADC_IS_SOFTWARE_START_REGULAR(__HANDLE__) \ - (((__HANDLE__)->Instance->CR2 & ADC_CR2_EXTEN) == RESET) - -/** - * @brief Test if conversion trigger of injected group is software start - * or external trigger. - * @param __HANDLE__ ADC handle - * @retval SET (software start) or RESET (external trigger) - */ -#define ADC_IS_SOFTWARE_START_INJECTED(__HANDLE__) \ - (((__HANDLE__)->Instance->CR2 & ADC_CR2_JEXTEN) == RESET) - -/** - * @brief Simultaneously clears and sets specific bits of the handle State - * @note: ADC_STATE_CLR_SET() macro is merely aliased to generic macro MODIFY_REG(), - * the first parameter is the ADC handle State, the second parameter is the - * bit field to clear, the third and last parameter is the bit field to set. - * @retval None - */ -#define ADC_STATE_CLR_SET MODIFY_REG - -/** - * @brief Clear ADC error code (set it to error code: "no error") - * @param __HANDLE__ ADC handle - * @retval None - */ -#define ADC_CLEAR_ERRORCODE(__HANDLE__) \ - ((__HANDLE__)->ErrorCode = HAL_ADC_ERROR_NONE) - - -#define IS_ADC_CLOCKPRESCALER(ADC_CLOCK) (((ADC_CLOCK) == ADC_CLOCK_SYNC_PCLK_DIV2) || \ - ((ADC_CLOCK) == ADC_CLOCK_SYNC_PCLK_DIV4) || \ - ((ADC_CLOCK) == ADC_CLOCK_SYNC_PCLK_DIV6) || \ - ((ADC_CLOCK) == ADC_CLOCK_SYNC_PCLK_DIV8)) -#define IS_ADC_SAMPLING_DELAY(DELAY) (((DELAY) == ADC_TWOSAMPLINGDELAY_5CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_6CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_7CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_8CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_9CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_10CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_11CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_12CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_13CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_14CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_15CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_16CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_17CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_18CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_19CYCLES) || \ - ((DELAY) == ADC_TWOSAMPLINGDELAY_20CYCLES)) -#define IS_ADC_RESOLUTION(RESOLUTION) (((RESOLUTION) == ADC_RESOLUTION_12B) || \ - ((RESOLUTION) == ADC_RESOLUTION_10B) || \ - ((RESOLUTION) == ADC_RESOLUTION_8B) || \ - ((RESOLUTION) == ADC_RESOLUTION_6B)) -#define IS_ADC_EXT_TRIG_EDGE(EDGE) (((EDGE) == ADC_EXTERNALTRIGCONVEDGE_NONE) || \ - ((EDGE) == ADC_EXTERNALTRIGCONVEDGE_RISING) || \ - ((EDGE) == ADC_EXTERNALTRIGCONVEDGE_FALLING) || \ - ((EDGE) == ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING)) -#define IS_ADC_EXT_TRIG(REGTRIG) (((REGTRIG) == ADC_EXTERNALTRIGCONV_T1_CC1) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T1_CC2) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T1_CC3) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T2_CC2) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T2_CC3) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T2_CC4) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T2_TRGO) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T3_CC1) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T3_TRGO) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T4_CC4) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T5_CC1) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T5_CC2) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T5_CC3) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T8_CC1) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_T8_TRGO) || \ - ((REGTRIG) == ADC_EXTERNALTRIGCONV_Ext_IT11)|| \ - ((REGTRIG) == ADC_SOFTWARE_START)) -#define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DATAALIGN_RIGHT) || \ - ((ALIGN) == ADC_DATAALIGN_LEFT)) -#define IS_ADC_SAMPLE_TIME(TIME) (((TIME) == ADC_SAMPLETIME_3CYCLES) || \ - ((TIME) == ADC_SAMPLETIME_15CYCLES) || \ - ((TIME) == ADC_SAMPLETIME_28CYCLES) || \ - ((TIME) == ADC_SAMPLETIME_56CYCLES) || \ - ((TIME) == ADC_SAMPLETIME_84CYCLES) || \ - ((TIME) == ADC_SAMPLETIME_112CYCLES) || \ - ((TIME) == ADC_SAMPLETIME_144CYCLES) || \ - ((TIME) == ADC_SAMPLETIME_480CYCLES)) -#define IS_ADC_EOCSelection(EOCSelection) (((EOCSelection) == ADC_EOC_SINGLE_CONV) || \ - ((EOCSelection) == ADC_EOC_SEQ_CONV) || \ - ((EOCSelection) == ADC_EOC_SINGLE_SEQ_CONV)) -#define IS_ADC_EVENT_TYPE(EVENT) (((EVENT) == ADC_AWD_EVENT) || \ - ((EVENT) == ADC_OVR_EVENT)) -#define IS_ADC_ANALOG_WATCHDOG(WATCHDOG) (((WATCHDOG) == ADC_ANALOGWATCHDOG_SINGLE_REG) || \ - ((WATCHDOG) == ADC_ANALOGWATCHDOG_SINGLE_INJEC) || \ - ((WATCHDOG) == ADC_ANALOGWATCHDOG_SINGLE_REGINJEC) || \ - ((WATCHDOG) == ADC_ANALOGWATCHDOG_ALL_REG) || \ - ((WATCHDOG) == ADC_ANALOGWATCHDOG_ALL_INJEC) || \ - ((WATCHDOG) == ADC_ANALOGWATCHDOG_ALL_REGINJEC) || \ - ((WATCHDOG) == ADC_ANALOGWATCHDOG_NONE)) -#define IS_ADC_CHANNELS_TYPE(CHANNEL_TYPE) (((CHANNEL_TYPE) == ADC_ALL_CHANNELS) || \ - ((CHANNEL_TYPE) == ADC_REGULAR_CHANNELS) || \ - ((CHANNEL_TYPE) == ADC_INJECTED_CHANNELS)) -#define IS_ADC_THRESHOLD(THRESHOLD) ((THRESHOLD) <= 0xFFFU) - -#define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= 1U) && ((LENGTH) <= 16U)) -#define IS_ADC_REGULAR_RANK(RANK) (((RANK) >= 1U) && ((RANK) <= (16U))) -#define IS_ADC_REGULAR_DISC_NUMBER(NUMBER) (((NUMBER) >= 1U) && ((NUMBER) <= 8U)) -#define IS_ADC_RANGE(RESOLUTION, ADC_VALUE) \ - ((((RESOLUTION) == ADC_RESOLUTION_12B) && ((ADC_VALUE) <= 0x0FFFU)) || \ - (((RESOLUTION) == ADC_RESOLUTION_10B) && ((ADC_VALUE) <= 0x03FFU)) || \ - (((RESOLUTION) == ADC_RESOLUTION_8B) && ((ADC_VALUE) <= 0x00FFU)) || \ - (((RESOLUTION) == ADC_RESOLUTION_6B) && ((ADC_VALUE) <= 0x003FU))) - -/** - * @brief Set ADC Regular channel sequence length. - * @param _NbrOfConversion_ Regular channel sequence length. - * @retval None - */ -#define ADC_SQR1(_NbrOfConversion_) (((_NbrOfConversion_) - (uint8_t)1U) << 20U) - -/** - * @brief Set the ADC's sample time for channel numbers between 10 and 18. - * @param _SAMPLETIME_ Sample time parameter. - * @param _CHANNELNB_ Channel number. - * @retval None - */ -#define ADC_SMPR1(_SAMPLETIME_, _CHANNELNB_) ((_SAMPLETIME_) << (3U * (((uint32_t)((uint16_t)(_CHANNELNB_))) - 10U))) - -/** - * @brief Set the ADC's sample time for channel numbers between 0 and 9. - * @param _SAMPLETIME_ Sample time parameter. - * @param _CHANNELNB_ Channel number. - * @retval None - */ -#define ADC_SMPR2(_SAMPLETIME_, _CHANNELNB_) ((_SAMPLETIME_) << (3U * ((uint32_t)((uint16_t)(_CHANNELNB_))))) - -/** - * @brief Set the selected regular channel rank for rank between 1 and 6. - * @param _CHANNELNB_ Channel number. - * @param _RANKNB_ Rank number. - * @retval None - */ -#define ADC_SQR3_RK(_CHANNELNB_, _RANKNB_) (((uint32_t)((uint16_t)(_CHANNELNB_))) << (5U * ((_RANKNB_) - 1U))) - -/** - * @brief Set the selected regular channel rank for rank between 7 and 12. - * @param _CHANNELNB_ Channel number. - * @param _RANKNB_ Rank number. - * @retval None - */ -#define ADC_SQR2_RK(_CHANNELNB_, _RANKNB_) (((uint32_t)((uint16_t)(_CHANNELNB_))) << (5U * ((_RANKNB_) - 7U))) - -/** - * @brief Set the selected regular channel rank for rank between 13 and 16. - * @param _CHANNELNB_ Channel number. - * @param _RANKNB_ Rank number. - * @retval None - */ -#define ADC_SQR1_RK(_CHANNELNB_, _RANKNB_) (((uint32_t)((uint16_t)(_CHANNELNB_))) << (5U * ((_RANKNB_) - 13U))) - -/** - * @brief Enable ADC continuous conversion mode. - * @param _CONTINUOUS_MODE_ Continuous mode. - * @retval None - */ -#define ADC_CR2_CONTINUOUS(_CONTINUOUS_MODE_) ((_CONTINUOUS_MODE_) << 1U) - -/** - * @brief Configures the number of discontinuous conversions for the regular group channels. - * @param _NBR_DISCONTINUOUSCONV_ Number of discontinuous conversions. - * @retval None - */ -#define ADC_CR1_DISCONTINUOUS(_NBR_DISCONTINUOUSCONV_) (((_NBR_DISCONTINUOUSCONV_) - 1U) << ADC_CR1_DISCNUM_Pos) - -/** - * @brief Enable ADC scan mode. - * @param _SCANCONV_MODE_ Scan conversion mode. - * @retval None - */ -#define ADC_CR1_SCANCONV(_SCANCONV_MODE_) ((_SCANCONV_MODE_) << 8U) - -/** - * @brief Enable the ADC end of conversion selection. - * @param _EOCSelection_MODE_ End of conversion selection mode. - * @retval None - */ -#define ADC_CR2_EOCSelection(_EOCSelection_MODE_) ((_EOCSelection_MODE_) << 10U) - -/** - * @brief Enable the ADC DMA continuous request. - * @param _DMAContReq_MODE_ DMA continuous request mode. - * @retval None - */ -#define ADC_CR2_DMAContReq(_DMAContReq_MODE_) ((_DMAContReq_MODE_) << 9U) - -/** - * @brief Return resolution bits in CR1 register. - * @param __HANDLE__ ADC handle - * @retval None - */ -#define ADC_GET_RESOLUTION(__HANDLE__) (((__HANDLE__)->Instance->CR1) & ADC_CR1_RES) - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup ADC_Private_Functions ADC Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_ADC_H */ - - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h deleted file mode 100644 index 8ce8484..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h +++ /dev/null @@ -1,407 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_adc_ex.h - * @author MCD Application Team - * @brief Header file of ADC HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_ADC_EX_H -#define __STM32F4xx_ADC_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup ADCEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup ADCEx_Exported_Types ADC Exported Types - * @{ - */ - -/** - * @brief ADC Configuration injected Channel structure definition - * @note Parameters of this structure are shared within 2 scopes: - * - Scope channel: InjectedChannel, InjectedRank, InjectedSamplingTime, InjectedOffset - * - Scope injected group (affects all channels of injected group): InjectedNbrOfConversion, InjectedDiscontinuousConvMode, - * AutoInjectedConv, ExternalTrigInjecConvEdge, ExternalTrigInjecConv. - * @note The setting of these parameters with function HAL_ADCEx_InjectedConfigChannel() is conditioned to ADC state. - * ADC state can be either: - * - For all parameters: ADC disabled - * - For all except parameters 'InjectedDiscontinuousConvMode' and 'AutoInjectedConv': ADC enabled without conversion on going on injected group. - * - For parameters 'ExternalTrigInjecConv' and 'ExternalTrigInjecConvEdge': ADC enabled, even with conversion on going on injected group. - */ -typedef struct -{ - uint32_t InjectedChannel; /*!< Selection of ADC channel to configure - This parameter can be a value of @ref ADC_channels - Note: Depending on devices, some channels may not be available on package pins. Refer to device datasheet for channels availability. */ - uint32_t InjectedRank; /*!< Rank in the injected group sequencer - This parameter must be a value of @ref ADCEx_injected_rank - Note: In case of need to disable a channel or change order of conversion sequencer, rank containing a previous channel setting can be overwritten by the new channel setting (or parameter number of conversions can be adjusted) */ - uint32_t InjectedSamplingTime; /*!< Sampling time value to be set for the selected channel. - Unit: ADC clock cycles - Conversion time is the addition of sampling time and processing time (12 ADC clock cycles at ADC resolution 12 bits, 11 cycles at 10 bits, 9 cycles at 8 bits, 7 cycles at 6 bits). - This parameter can be a value of @ref ADC_sampling_times - Caution: This parameter updates the parameter property of the channel, that can be used into regular and/or injected groups. - If this same channel has been previously configured in the other group (regular/injected), it will be updated to last setting. - Note: In case of usage of internal measurement channels (VrefInt/Vbat/TempSensor), - sampling time constraints must be respected (sampling time can be adjusted in function of ADC clock frequency and sampling time setting) - Refer to device datasheet for timings values, parameters TS_vrefint, TS_temp (values rough order: 4us min). */ - uint32_t InjectedOffset; /*!< Defines the offset to be subtracted from the raw converted data (for channels set on injected group only). - Offset value must be a positive number. - Depending of ADC resolution selected (12, 10, 8 or 6 bits), - this parameter must be a number between Min_Data = 0x000 and Max_Data = 0xFFF, 0x3FF, 0xFF or 0x3F respectively. */ - uint32_t InjectedNbrOfConversion; /*!< Specifies the number of ranks that will be converted within the injected group sequencer. - To use the injected group sequencer and convert several ranks, parameter 'ScanConvMode' must be enabled. - This parameter must be a number between Min_Data = 1 and Max_Data = 4. - Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to - configure a channel on injected group can impact the configuration of other channels previously set. */ - FunctionalState InjectedDiscontinuousConvMode; /*!< Specifies whether the conversions sequence of injected group is performed in Complete-sequence/Discontinuous-sequence (main sequence subdivided in successive parts). - Discontinuous mode is used only if sequencer is enabled (parameter 'ScanConvMode'). If sequencer is disabled, this parameter is discarded. - Discontinuous mode can be enabled only if continuous mode is disabled. If continuous mode is enabled, this parameter setting is discarded. - This parameter can be set to ENABLE or DISABLE. - Note: For injected group, number of discontinuous ranks increment is fixed to one-by-one. - Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to - configure a channel on injected group can impact the configuration of other channels previously set. */ - FunctionalState AutoInjectedConv; /*!< Enables or disables the selected ADC automatic injected group conversion after regular one - This parameter can be set to ENABLE or DISABLE. - Note: To use Automatic injected conversion, discontinuous mode must be disabled ('DiscontinuousConvMode' and 'InjectedDiscontinuousConvMode' set to DISABLE) - Note: To use Automatic injected conversion, injected group external triggers must be disabled ('ExternalTrigInjecConv' set to ADC_SOFTWARE_START) - Note: In case of DMA used with regular group: if DMA configured in normal mode (single shot) JAUTO will be stopped upon DMA transfer complete. - To maintain JAUTO always enabled, DMA must be configured in circular mode. - Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to - configure a channel on injected group can impact the configuration of other channels previously set. */ - uint32_t ExternalTrigInjecConv; /*!< Selects the external event used to trigger the conversion start of injected group. - If set to ADC_INJECTED_SOFTWARE_START, external triggers are disabled. - If set to external trigger source, triggering is on event rising edge. - This parameter can be a value of @ref ADCEx_External_trigger_Source_Injected - Note: This parameter must be modified when ADC is disabled (before ADC start conversion or after ADC stop conversion). - If ADC is enabled, this parameter setting is bypassed without error reporting (as it can be the expected behaviour in case of another parameter update on the fly) - Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to - configure a channel on injected group can impact the configuration of other channels previously set. */ - uint32_t ExternalTrigInjecConvEdge; /*!< Selects the external trigger edge of injected group. - This parameter can be a value of @ref ADCEx_External_trigger_edge_Injected. - If trigger is set to ADC_INJECTED_SOFTWARE_START, this parameter is discarded. - Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to - configure a channel on injected group can impact the configuration of other channels previously set. */ -} ADC_InjectionConfTypeDef; - -/** - * @brief ADC Configuration multi-mode structure definition - */ -typedef struct -{ - uint32_t Mode; /*!< Configures the ADC to operate in independent or multi mode. - This parameter can be a value of @ref ADCEx_Common_mode */ - uint32_t DMAAccessMode; /*!< Configures the Direct memory access mode for multi ADC mode. - This parameter can be a value of @ref ADCEx_Direct_memory_access_mode_for_multi_mode */ - uint32_t TwoSamplingDelay; /*!< Configures the Delay between 2 sampling phases. - This parameter can be a value of @ref ADC_delay_between_2_sampling_phases */ -} ADC_MultiModeTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup ADCEx_Exported_Constants ADC Exported Constants - * @{ - */ - -/** @defgroup ADCEx_Common_mode ADC Common Mode - * @{ - */ -#define ADC_MODE_INDEPENDENT 0x00000000U -#define ADC_DUALMODE_REGSIMULT_INJECSIMULT ((uint32_t)ADC_CCR_MULTI_0) -#define ADC_DUALMODE_REGSIMULT_ALTERTRIG ((uint32_t)ADC_CCR_MULTI_1) -#define ADC_DUALMODE_INJECSIMULT ((uint32_t)(ADC_CCR_MULTI_2 | ADC_CCR_MULTI_0)) -#define ADC_DUALMODE_REGSIMULT ((uint32_t)(ADC_CCR_MULTI_2 | ADC_CCR_MULTI_1)) -#define ADC_DUALMODE_INTERL ((uint32_t)(ADC_CCR_MULTI_2 | ADC_CCR_MULTI_1 | ADC_CCR_MULTI_0)) -#define ADC_DUALMODE_ALTERTRIG ((uint32_t)(ADC_CCR_MULTI_3 | ADC_CCR_MULTI_0)) -#define ADC_TRIPLEMODE_REGSIMULT_INJECSIMULT ((uint32_t)(ADC_CCR_MULTI_4 | ADC_CCR_MULTI_0)) -#define ADC_TRIPLEMODE_REGSIMULT_AlterTrig ((uint32_t)(ADC_CCR_MULTI_4 | ADC_CCR_MULTI_1)) -#define ADC_TRIPLEMODE_INJECSIMULT ((uint32_t)(ADC_CCR_MULTI_4 | ADC_CCR_MULTI_2 | ADC_CCR_MULTI_0)) -#define ADC_TRIPLEMODE_REGSIMULT ((uint32_t)(ADC_CCR_MULTI_4 | ADC_CCR_MULTI_2 | ADC_CCR_MULTI_1)) -#define ADC_TRIPLEMODE_INTERL ((uint32_t)(ADC_CCR_MULTI_4 | ADC_CCR_MULTI_2 | ADC_CCR_MULTI_1 | ADC_CCR_MULTI_0)) -#define ADC_TRIPLEMODE_ALTERTRIG ((uint32_t)(ADC_CCR_MULTI_4 | ADC_CCR_MULTI_3 | ADC_CCR_MULTI_0)) -/** - * @} - */ - -/** @defgroup ADCEx_Direct_memory_access_mode_for_multi_mode ADC Direct Memory Access Mode For Multi Mode - * @{ - */ -#define ADC_DMAACCESSMODE_DISABLED 0x00000000U /*!< DMA mode disabled */ -#define ADC_DMAACCESSMODE_1 ((uint32_t)ADC_CCR_DMA_0) /*!< DMA mode 1 enabled (2 / 3 half-words one by one - 1 then 2 then 3)*/ -#define ADC_DMAACCESSMODE_2 ((uint32_t)ADC_CCR_DMA_1) /*!< DMA mode 2 enabled (2 / 3 half-words by pairs - 2&1 then 1&3 then 3&2)*/ -#define ADC_DMAACCESSMODE_3 ((uint32_t)ADC_CCR_DMA) /*!< DMA mode 3 enabled (2 / 3 bytes by pairs - 2&1 then 1&3 then 3&2) */ -/** - * @} - */ - -/** @defgroup ADCEx_External_trigger_edge_Injected ADC External Trigger Edge Injected - * @{ - */ -#define ADC_EXTERNALTRIGINJECCONVEDGE_NONE 0x00000000U -#define ADC_EXTERNALTRIGINJECCONVEDGE_RISING ((uint32_t)ADC_CR2_JEXTEN_0) -#define ADC_EXTERNALTRIGINJECCONVEDGE_FALLING ((uint32_t)ADC_CR2_JEXTEN_1) -#define ADC_EXTERNALTRIGINJECCONVEDGE_RISINGFALLING ((uint32_t)ADC_CR2_JEXTEN) -/** - * @} - */ - -/** @defgroup ADCEx_External_trigger_Source_Injected ADC External Trigger Source Injected - * @{ - */ -#define ADC_EXTERNALTRIGINJECCONV_T1_CC4 0x00000000U -#define ADC_EXTERNALTRIGINJECCONV_T1_TRGO ((uint32_t)ADC_CR2_JEXTSEL_0) -#define ADC_EXTERNALTRIGINJECCONV_T2_CC1 ((uint32_t)ADC_CR2_JEXTSEL_1) -#define ADC_EXTERNALTRIGINJECCONV_T2_TRGO ((uint32_t)(ADC_CR2_JEXTSEL_1 | ADC_CR2_JEXTSEL_0)) -#define ADC_EXTERNALTRIGINJECCONV_T3_CC2 ((uint32_t)ADC_CR2_JEXTSEL_2) -#define ADC_EXTERNALTRIGINJECCONV_T3_CC4 ((uint32_t)(ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_0)) -#define ADC_EXTERNALTRIGINJECCONV_T4_CC1 ((uint32_t)(ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_1)) -#define ADC_EXTERNALTRIGINJECCONV_T4_CC2 ((uint32_t)(ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_1 | ADC_CR2_JEXTSEL_0)) -#define ADC_EXTERNALTRIGINJECCONV_T4_CC3 ((uint32_t)ADC_CR2_JEXTSEL_3) -#define ADC_EXTERNALTRIGINJECCONV_T4_TRGO ((uint32_t)(ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_0)) -#define ADC_EXTERNALTRIGINJECCONV_T5_CC4 ((uint32_t)(ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_1)) -#define ADC_EXTERNALTRIGINJECCONV_T5_TRGO ((uint32_t)(ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_1 | ADC_CR2_JEXTSEL_0)) -#define ADC_EXTERNALTRIGINJECCONV_T8_CC2 ((uint32_t)(ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_2)) -#define ADC_EXTERNALTRIGINJECCONV_T8_CC3 ((uint32_t)(ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_0)) -#define ADC_EXTERNALTRIGINJECCONV_T8_CC4 ((uint32_t)(ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_1)) -#define ADC_EXTERNALTRIGINJECCONV_EXT_IT15 ((uint32_t)ADC_CR2_JEXTSEL) -#define ADC_INJECTED_SOFTWARE_START ((uint32_t)ADC_CR2_JEXTSEL + 1U) -/** - * @} - */ - -/** @defgroup ADCEx_injected_rank ADC Injected Rank - * @{ - */ -#define ADC_INJECTED_RANK_1 0x00000001U -#define ADC_INJECTED_RANK_2 0x00000002U -#define ADC_INJECTED_RANK_3 0x00000003U -#define ADC_INJECTED_RANK_4 0x00000004U -/** - * @} - */ - -/** @defgroup ADCEx_channels ADC Specific Channels - * @{ - */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || \ - defined(STM32F410Rx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || \ - defined(STM32F412Cx) -#define ADC_CHANNEL_TEMPSENSOR ((uint32_t)ADC_CHANNEL_16) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F410xx || STM32F412Zx || - STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F411xE) || defined(STM32F413xx) || defined(STM32F423xx) || defined(STM32F427xx) || defined(STM32F437xx) ||\ - defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT 0x10000000U /* Dummy bit for driver internal usage, not used in ADC channel setting registers CR1 or SQRx */ -#define ADC_CHANNEL_TEMPSENSOR ((uint32_t)ADC_CHANNEL_18 | ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT) -#endif /* STM32F411xE || STM32F413xx || STM32F423xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup ADC_Exported_Macros ADC Exported Macros - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) -/** - * @brief Disable internal path of ADC channel Vbat - * @note Use case of this macro: - * On devices STM32F42x and STM32F43x, ADC internal channels - * Vbat and VrefInt share the same internal path, only - * one of them can be enabled.This macro is to be used when ADC - * channels Vbat and VrefInt are selected, and must be called - * before starting conversion of ADC channel VrefInt in order - * to disable ADC channel Vbat. - * @retval None - */ -#define __HAL_ADC_PATH_INTERNAL_VBAT_DISABLE() (ADC->CCR &= ~(ADC_CCR_VBATE)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup ADCEx_Exported_Functions - * @{ - */ - -/** @addtogroup ADCEx_Exported_Functions_Group1 - * @{ - */ - -/* I/O operation functions ******************************************************/ -HAL_StatusTypeDef HAL_ADCEx_InjectedStart(ADC_HandleTypeDef *hadc); -HAL_StatusTypeDef HAL_ADCEx_InjectedStop(ADC_HandleTypeDef *hadc); -HAL_StatusTypeDef HAL_ADCEx_InjectedPollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout); -HAL_StatusTypeDef HAL_ADCEx_InjectedStart_IT(ADC_HandleTypeDef *hadc); -HAL_StatusTypeDef HAL_ADCEx_InjectedStop_IT(ADC_HandleTypeDef *hadc); -uint32_t HAL_ADCEx_InjectedGetValue(ADC_HandleTypeDef *hadc, uint32_t InjectedRank); -HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length); -HAL_StatusTypeDef HAL_ADCEx_MultiModeStop_DMA(ADC_HandleTypeDef *hadc); -uint32_t HAL_ADCEx_MultiModeGetValue(ADC_HandleTypeDef *hadc); -void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc); - -/* Peripheral Control functions *************************************************/ -HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef *hadc, ADC_InjectionConfTypeDef *sConfigInjected); -HAL_StatusTypeDef HAL_ADCEx_MultiModeConfigChannel(ADC_HandleTypeDef *hadc, ADC_MultiModeTypeDef *multimode); - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup ADCEx_Private_Constants ADC Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup ADCEx_Private_Macros ADC Private Macros - * @{ - */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || \ - defined(STM32F410Rx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || \ - defined(STM32F412Cx) -#define IS_ADC_CHANNEL(CHANNEL) ((CHANNEL) <= ADC_CHANNEL_18) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || - STM32F410xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F411xE) || defined(STM32F413xx) || defined(STM32F423xx) || defined(STM32F427xx) || \ - defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) -#define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) <= ADC_CHANNEL_18) || \ - ((CHANNEL) == ADC_CHANNEL_TEMPSENSOR)) -#endif /* STM32F411xE || STM32F413xx || STM32F423xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#define IS_ADC_MODE(MODE) (((MODE) == ADC_MODE_INDEPENDENT) || \ - ((MODE) == ADC_DUALMODE_REGSIMULT_INJECSIMULT) || \ - ((MODE) == ADC_DUALMODE_REGSIMULT_ALTERTRIG) || \ - ((MODE) == ADC_DUALMODE_INJECSIMULT) || \ - ((MODE) == ADC_DUALMODE_REGSIMULT) || \ - ((MODE) == ADC_DUALMODE_INTERL) || \ - ((MODE) == ADC_DUALMODE_ALTERTRIG) || \ - ((MODE) == ADC_TRIPLEMODE_REGSIMULT_INJECSIMULT) || \ - ((MODE) == ADC_TRIPLEMODE_REGSIMULT_AlterTrig) || \ - ((MODE) == ADC_TRIPLEMODE_INJECSIMULT) || \ - ((MODE) == ADC_TRIPLEMODE_REGSIMULT) || \ - ((MODE) == ADC_TRIPLEMODE_INTERL) || \ - ((MODE) == ADC_TRIPLEMODE_ALTERTRIG)) -#define IS_ADC_DMA_ACCESS_MODE(MODE) (((MODE) == ADC_DMAACCESSMODE_DISABLED) || \ - ((MODE) == ADC_DMAACCESSMODE_1) || \ - ((MODE) == ADC_DMAACCESSMODE_2) || \ - ((MODE) == ADC_DMAACCESSMODE_3)) -#define IS_ADC_EXT_INJEC_TRIG_EDGE(EDGE) (((EDGE) == ADC_EXTERNALTRIGINJECCONVEDGE_NONE) || \ - ((EDGE) == ADC_EXTERNALTRIGINJECCONVEDGE_RISING) || \ - ((EDGE) == ADC_EXTERNALTRIGINJECCONVEDGE_FALLING) || \ - ((EDGE) == ADC_EXTERNALTRIGINJECCONVEDGE_RISINGFALLING)) -#define IS_ADC_EXT_INJEC_TRIG(INJTRIG) (((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T1_CC4) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T1_TRGO) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T2_CC1) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T2_TRGO) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T3_CC2) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T3_CC4) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T4_CC1) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T4_CC2) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T4_CC3) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T4_TRGO) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T5_CC4) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T5_TRGO) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T8_CC2) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T8_CC3) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T8_CC4) || \ - ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_EXT_IT15)|| \ - ((INJTRIG) == ADC_INJECTED_SOFTWARE_START)) -#define IS_ADC_INJECTED_LENGTH(LENGTH) (((LENGTH) >= 1U) && ((LENGTH) <= 4U)) -#define IS_ADC_INJECTED_RANK(RANK) (((RANK) >= 1U) && ((RANK) <= 4U)) - -/** - * @brief Set the selected injected Channel rank. - * @param _CHANNELNB_ Channel number. - * @param _RANKNB_ Rank number. - * @param _JSQR_JL_ Sequence length. - * @retval None - */ -#define ADC_JSQR(_CHANNELNB_, _RANKNB_, _JSQR_JL_) (((uint32_t)((uint16_t)(_CHANNELNB_))) << (5U * (uint8_t)(((_RANKNB_) + 3U) - (_JSQR_JL_)))) - -/** - * @brief Defines if the selected ADC is within ADC common register ADC123 or ADC1 - * if available (ADC2, ADC3 availability depends on STM32 product) - * @param __HANDLE__ ADC handle - * @retval Common control register ADC123 or ADC1 - */ -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) || defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define ADC_COMMON_REGISTER(__HANDLE__) ADC123_COMMON -#else -#define ADC_COMMON_REGISTER(__HANDLE__) ADC1_COMMON -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx || STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup ADCEx_Private_Functions ADC Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_ADC_EX_H */ - - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h deleted file mode 100644 index 7690930..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h +++ /dev/null @@ -1,410 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_cortex.h - * @author MCD Application Team - * @brief Header file of CORTEX HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CORTEX_H -#define __STM32F4xx_HAL_CORTEX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup CORTEX - * @{ - */ -/* Exported types ------------------------------------------------------------*/ -/** @defgroup CORTEX_Exported_Types Cortex Exported Types - * @{ - */ - -#if (__MPU_PRESENT == 1U) -/** @defgroup CORTEX_MPU_Region_Initialization_Structure_definition MPU Region Initialization Structure Definition - * @brief MPU Region initialization structure - * @{ - */ -typedef struct -{ - uint8_t Enable; /*!< Specifies the status of the region. - This parameter can be a value of @ref CORTEX_MPU_Region_Enable */ - uint8_t Number; /*!< Specifies the number of the region to protect. - This parameter can be a value of @ref CORTEX_MPU_Region_Number */ - uint32_t BaseAddress; /*!< Specifies the base address of the region to protect. */ - uint8_t Size; /*!< Specifies the size of the region to protect. - This parameter can be a value of @ref CORTEX_MPU_Region_Size */ - uint8_t SubRegionDisable; /*!< Specifies the number of the subregion protection to disable. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF */ - uint8_t TypeExtField; /*!< Specifies the TEX field level. - This parameter can be a value of @ref CORTEX_MPU_TEX_Levels */ - uint8_t AccessPermission; /*!< Specifies the region access permission type. - This parameter can be a value of @ref CORTEX_MPU_Region_Permission_Attributes */ - uint8_t DisableExec; /*!< Specifies the instruction access status. - This parameter can be a value of @ref CORTEX_MPU_Instruction_Access */ - uint8_t IsShareable; /*!< Specifies the shareability status of the protected region. - This parameter can be a value of @ref CORTEX_MPU_Access_Shareable */ - uint8_t IsCacheable; /*!< Specifies the cacheable status of the region protected. - This parameter can be a value of @ref CORTEX_MPU_Access_Cacheable */ - uint8_t IsBufferable; /*!< Specifies the bufferable status of the protected region. - This parameter can be a value of @ref CORTEX_MPU_Access_Bufferable */ -}MPU_Region_InitTypeDef; -/** - * @} - */ -#endif /* __MPU_PRESENT */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup CORTEX_Exported_Constants CORTEX Exported Constants - * @{ - */ - -/** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group - * @{ - */ -#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority - 4 bits for subpriority */ -#define NVIC_PRIORITYGROUP_1 0x00000006U /*!< 1 bits for pre-emption priority - 3 bits for subpriority */ -#define NVIC_PRIORITYGROUP_2 0x00000005U /*!< 2 bits for pre-emption priority - 2 bits for subpriority */ -#define NVIC_PRIORITYGROUP_3 0x00000004U /*!< 3 bits for pre-emption priority - 1 bits for subpriority */ -#define NVIC_PRIORITYGROUP_4 0x00000003U /*!< 4 bits for pre-emption priority - 0 bits for subpriority */ -/** - * @} - */ - -/** @defgroup CORTEX_SysTick_clock_source CORTEX _SysTick clock source - * @{ - */ -#define SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U -#define SYSTICK_CLKSOURCE_HCLK 0x00000004U - -/** - * @} - */ - -#if (__MPU_PRESENT == 1) -/** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control - * @{ - */ -#define MPU_HFNMI_PRIVDEF_NONE 0x00000000U -#define MPU_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk -#define MPU_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk -#define MPU_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) - -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable - * @{ - */ -#define MPU_REGION_ENABLE ((uint8_t)0x01) -#define MPU_REGION_DISABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access - * @{ - */ -#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00) -#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable - * @{ - */ -#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable - * @{ - */ -#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable - * @{ - */ -#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_TEX_Levels MPU TEX Levels - * @{ - */ -#define MPU_TEX_LEVEL0 ((uint8_t)0x00) -#define MPU_TEX_LEVEL1 ((uint8_t)0x01) -#define MPU_TEX_LEVEL2 ((uint8_t)0x02) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size - * @{ - */ -#define MPU_REGION_SIZE_32B ((uint8_t)0x04) -#define MPU_REGION_SIZE_64B ((uint8_t)0x05) -#define MPU_REGION_SIZE_128B ((uint8_t)0x06) -#define MPU_REGION_SIZE_256B ((uint8_t)0x07) -#define MPU_REGION_SIZE_512B ((uint8_t)0x08) -#define MPU_REGION_SIZE_1KB ((uint8_t)0x09) -#define MPU_REGION_SIZE_2KB ((uint8_t)0x0A) -#define MPU_REGION_SIZE_4KB ((uint8_t)0x0B) -#define MPU_REGION_SIZE_8KB ((uint8_t)0x0C) -#define MPU_REGION_SIZE_16KB ((uint8_t)0x0D) -#define MPU_REGION_SIZE_32KB ((uint8_t)0x0E) -#define MPU_REGION_SIZE_64KB ((uint8_t)0x0F) -#define MPU_REGION_SIZE_128KB ((uint8_t)0x10) -#define MPU_REGION_SIZE_256KB ((uint8_t)0x11) -#define MPU_REGION_SIZE_512KB ((uint8_t)0x12) -#define MPU_REGION_SIZE_1MB ((uint8_t)0x13) -#define MPU_REGION_SIZE_2MB ((uint8_t)0x14) -#define MPU_REGION_SIZE_4MB ((uint8_t)0x15) -#define MPU_REGION_SIZE_8MB ((uint8_t)0x16) -#define MPU_REGION_SIZE_16MB ((uint8_t)0x17) -#define MPU_REGION_SIZE_32MB ((uint8_t)0x18) -#define MPU_REGION_SIZE_64MB ((uint8_t)0x19) -#define MPU_REGION_SIZE_128MB ((uint8_t)0x1A) -#define MPU_REGION_SIZE_256MB ((uint8_t)0x1B) -#define MPU_REGION_SIZE_512MB ((uint8_t)0x1C) -#define MPU_REGION_SIZE_1GB ((uint8_t)0x1D) -#define MPU_REGION_SIZE_2GB ((uint8_t)0x1E) -#define MPU_REGION_SIZE_4GB ((uint8_t)0x1F) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes - * @{ - */ -#define MPU_REGION_NO_ACCESS ((uint8_t)0x00) -#define MPU_REGION_PRIV_RW ((uint8_t)0x01) -#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02) -#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03) -#define MPU_REGION_PRIV_RO ((uint8_t)0x05) -#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number - * @{ - */ -#define MPU_REGION_NUMBER0 ((uint8_t)0x00) -#define MPU_REGION_NUMBER1 ((uint8_t)0x01) -#define MPU_REGION_NUMBER2 ((uint8_t)0x02) -#define MPU_REGION_NUMBER3 ((uint8_t)0x03) -#define MPU_REGION_NUMBER4 ((uint8_t)0x04) -#define MPU_REGION_NUMBER5 ((uint8_t)0x05) -#define MPU_REGION_NUMBER6 ((uint8_t)0x06) -#define MPU_REGION_NUMBER7 ((uint8_t)0x07) -/** - * @} - */ -#endif /* __MPU_PRESENT */ - -/** - * @} - */ - - -/* Exported Macros -----------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup CORTEX_Exported_Functions - * @{ - */ - -/** @addtogroup CORTEX_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); -void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); -void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); -void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); -void HAL_NVIC_SystemReset(void); -uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb); -/** - * @} - */ - -/** @addtogroup CORTEX_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions ***********************************************/ -uint32_t HAL_NVIC_GetPriorityGrouping(void); -void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority); -uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); -void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn); -void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn); -uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn); -void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource); -void HAL_SYSTICK_IRQHandler(void); -void HAL_SYSTICK_Callback(void); - -#if (__MPU_PRESENT == 1U) -void HAL_MPU_Enable(uint32_t MPU_Control); -void HAL_MPU_Disable(void); -void HAL_MPU_EnableRegion(uint32_t RegionNumber); -void HAL_MPU_DisableRegion(uint32_t RegionNumber); -void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init); -#endif /* __MPU_PRESENT */ -void HAL_CORTEX_ClearEvent(void); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup CORTEX_Private_Macros CORTEX Private Macros - * @{ - */ -#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PRIORITYGROUP_0) || \ - ((GROUP) == NVIC_PRIORITYGROUP_1) || \ - ((GROUP) == NVIC_PRIORITYGROUP_2) || \ - ((GROUP) == NVIC_PRIORITYGROUP_3) || \ - ((GROUP) == NVIC_PRIORITYGROUP_4)) - -#define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY) ((PRIORITY) < 0x10U) - -#define IS_NVIC_SUB_PRIORITY(PRIORITY) ((PRIORITY) < 0x10U) - -#define IS_NVIC_DEVICE_IRQ(IRQ) ((IRQ) >= (IRQn_Type)0x00U) - -#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SYSTICK_CLKSOURCE_HCLK) || \ - ((SOURCE) == SYSTICK_CLKSOURCE_HCLK_DIV8)) - -#if (__MPU_PRESENT == 1U) -#define IS_MPU_REGION_ENABLE(STATE) (((STATE) == MPU_REGION_ENABLE) || \ - ((STATE) == MPU_REGION_DISABLE)) - -#define IS_MPU_INSTRUCTION_ACCESS(STATE) (((STATE) == MPU_INSTRUCTION_ACCESS_ENABLE) || \ - ((STATE) == MPU_INSTRUCTION_ACCESS_DISABLE)) - -#define IS_MPU_ACCESS_SHAREABLE(STATE) (((STATE) == MPU_ACCESS_SHAREABLE) || \ - ((STATE) == MPU_ACCESS_NOT_SHAREABLE)) - -#define IS_MPU_ACCESS_CACHEABLE(STATE) (((STATE) == MPU_ACCESS_CACHEABLE) || \ - ((STATE) == MPU_ACCESS_NOT_CACHEABLE)) - -#define IS_MPU_ACCESS_BUFFERABLE(STATE) (((STATE) == MPU_ACCESS_BUFFERABLE) || \ - ((STATE) == MPU_ACCESS_NOT_BUFFERABLE)) - -#define IS_MPU_TEX_LEVEL(TYPE) (((TYPE) == MPU_TEX_LEVEL0) || \ - ((TYPE) == MPU_TEX_LEVEL1) || \ - ((TYPE) == MPU_TEX_LEVEL2)) - -#define IS_MPU_REGION_PERMISSION_ATTRIBUTE(TYPE) (((TYPE) == MPU_REGION_NO_ACCESS) || \ - ((TYPE) == MPU_REGION_PRIV_RW) || \ - ((TYPE) == MPU_REGION_PRIV_RW_URO) || \ - ((TYPE) == MPU_REGION_FULL_ACCESS) || \ - ((TYPE) == MPU_REGION_PRIV_RO) || \ - ((TYPE) == MPU_REGION_PRIV_RO_URO)) - -#define IS_MPU_REGION_NUMBER(NUMBER) (((NUMBER) == MPU_REGION_NUMBER0) || \ - ((NUMBER) == MPU_REGION_NUMBER1) || \ - ((NUMBER) == MPU_REGION_NUMBER2) || \ - ((NUMBER) == MPU_REGION_NUMBER3) || \ - ((NUMBER) == MPU_REGION_NUMBER4) || \ - ((NUMBER) == MPU_REGION_NUMBER5) || \ - ((NUMBER) == MPU_REGION_NUMBER6) || \ - ((NUMBER) == MPU_REGION_NUMBER7)) - -#define IS_MPU_REGION_SIZE(SIZE) (((SIZE) == MPU_REGION_SIZE_32B) || \ - ((SIZE) == MPU_REGION_SIZE_64B) || \ - ((SIZE) == MPU_REGION_SIZE_128B) || \ - ((SIZE) == MPU_REGION_SIZE_256B) || \ - ((SIZE) == MPU_REGION_SIZE_512B) || \ - ((SIZE) == MPU_REGION_SIZE_1KB) || \ - ((SIZE) == MPU_REGION_SIZE_2KB) || \ - ((SIZE) == MPU_REGION_SIZE_4KB) || \ - ((SIZE) == MPU_REGION_SIZE_8KB) || \ - ((SIZE) == MPU_REGION_SIZE_16KB) || \ - ((SIZE) == MPU_REGION_SIZE_32KB) || \ - ((SIZE) == MPU_REGION_SIZE_64KB) || \ - ((SIZE) == MPU_REGION_SIZE_128KB) || \ - ((SIZE) == MPU_REGION_SIZE_256KB) || \ - ((SIZE) == MPU_REGION_SIZE_512KB) || \ - ((SIZE) == MPU_REGION_SIZE_1MB) || \ - ((SIZE) == MPU_REGION_SIZE_2MB) || \ - ((SIZE) == MPU_REGION_SIZE_4MB) || \ - ((SIZE) == MPU_REGION_SIZE_8MB) || \ - ((SIZE) == MPU_REGION_SIZE_16MB) || \ - ((SIZE) == MPU_REGION_SIZE_32MB) || \ - ((SIZE) == MPU_REGION_SIZE_64MB) || \ - ((SIZE) == MPU_REGION_SIZE_128MB) || \ - ((SIZE) == MPU_REGION_SIZE_256MB) || \ - ((SIZE) == MPU_REGION_SIZE_512MB) || \ - ((SIZE) == MPU_REGION_SIZE_1GB) || \ - ((SIZE) == MPU_REGION_SIZE_2GB) || \ - ((SIZE) == MPU_REGION_SIZE_4GB)) - -#define IS_MPU_SUB_REGION_DISABLE(SUBREGION) ((SUBREGION) < (uint16_t)0x00FF) -#endif /* __MPU_PRESENT */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_CORTEX_H */ - - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h deleted file mode 100644 index 1df0d7d..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h +++ /dev/null @@ -1,212 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_def.h - * @author MCD Application Team - * @brief This file contains HAL common defines, enumeration, macros and - * structures definitions. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DEF -#define __STM32F4xx_HAL_DEF - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" -#include "Legacy/stm32_hal_legacy.h" -#include - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief HAL Status structures definition - */ -typedef enum -{ - HAL_OK = 0x00U, - HAL_ERROR = 0x01U, - HAL_BUSY = 0x02U, - HAL_TIMEOUT = 0x03U -} HAL_StatusTypeDef; - -/** - * @brief HAL Lock structures definition - */ -typedef enum -{ - HAL_UNLOCKED = 0x00U, - HAL_LOCKED = 0x01U -} HAL_LockTypeDef; - -/* Exported macro ------------------------------------------------------------*/ - -#if !defined(UNUSED) -#define UNUSED(X) (void)X /* To avoid gcc/g++ warnings */ -#endif /* UNUSED */ - -#define HAL_MAX_DELAY 0xFFFFFFFFU - -#define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) == (BIT)) -#define HAL_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == 0U) - -#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ - do{ \ - (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \ - (__DMA_HANDLE__).Parent = (__HANDLE__); \ - } while(0U) - -/** @brief Reset the Handle's State field. - * @param __HANDLE__ specifies the Peripheral Handle. - * @note This macro can be used for the following purpose: - * - When the Handle is declared as local variable; before passing it as parameter - * to HAL_PPP_Init() for the first time, it is mandatory to use this macro - * to set to 0 the Handle's "State" field. - * Otherwise, "State" field may have any random value and the first time the function - * HAL_PPP_Init() is called, the low level hardware initialization will be missed - * (i.e. HAL_PPP_MspInit() will not be executed). - * - When there is a need to reconfigure the low level hardware: instead of calling - * HAL_PPP_DeInit() then HAL_PPP_Init(), user can make a call to this macro then HAL_PPP_Init(). - * In this later function, when the Handle's "State" field is set to 0, it will execute the function - * HAL_PPP_MspInit() which will reconfigure the low level hardware. - * @retval None - */ -#define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0U) - -#if (USE_RTOS == 1U) - /* Reserved for future use */ - #error "USE_RTOS should be 0 in the current HAL release" -#else - #define __HAL_LOCK(__HANDLE__) \ - do{ \ - if((__HANDLE__)->Lock == HAL_LOCKED) \ - { \ - return HAL_BUSY; \ - } \ - else \ - { \ - (__HANDLE__)->Lock = HAL_LOCKED; \ - } \ - }while (0U) - - #define __HAL_UNLOCK(__HANDLE__) \ - do{ \ - (__HANDLE__)->Lock = HAL_UNLOCKED; \ - }while (0U) -#endif /* USE_RTOS */ - -#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */ - #ifndef __weak - #define __weak __attribute__((weak)) - #endif - #ifndef __packed - #define __packed __attribute__((packed)) - #endif -#elif defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ - #ifndef __weak - #define __weak __attribute__((weak)) - #endif /* __weak */ - #ifndef __packed - #define __packed __attribute__((__packed__)) - #endif /* __packed */ -#endif /* __GNUC__ */ - - -/* Macro to get variable aligned on 4-bytes, for __ICCARM__ the directive "#pragma data_alignment=4" must be used instead */ -#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */ - #ifndef __ALIGN_BEGIN - #define __ALIGN_BEGIN - #endif - #ifndef __ALIGN_END - #define __ALIGN_END __attribute__ ((aligned (4))) - #endif -#elif defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ - #ifndef __ALIGN_END -#define __ALIGN_END __attribute__ ((aligned (4))) - #endif /* __ALIGN_END */ - #ifndef __ALIGN_BEGIN - #define __ALIGN_BEGIN - #endif /* __ALIGN_BEGIN */ -#else - #ifndef __ALIGN_END - #define __ALIGN_END - #endif /* __ALIGN_END */ - #ifndef __ALIGN_BEGIN - #if defined (__CC_ARM) /* ARM Compiler V5*/ -#define __ALIGN_BEGIN __align(4) - #elif defined (__ICCARM__) /* IAR Compiler */ - #define __ALIGN_BEGIN - #endif /* __CC_ARM */ - #endif /* __ALIGN_BEGIN */ -#endif /* __GNUC__ */ - - -/** - * @brief __RAM_FUNC definition - */ -#if defined ( __CC_ARM ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) -/* ARM Compiler V4/V5 and V6 - -------------------------- - RAM functions are defined using the toolchain options. - Functions that are executed in RAM should reside in a separate source module. - Using the 'Options for File' dialog you can simply change the 'Code / Const' - area of a module to a memory space in physical RAM. - Available memory areas are declared in the 'Target' tab of the 'Options for Target' - dialog. -*/ -#define __RAM_FUNC - -#elif defined ( __ICCARM__ ) -/* ICCARM Compiler - --------------- - RAM functions are defined using a specific toolchain keyword "__ramfunc". -*/ -#define __RAM_FUNC __ramfunc - -#elif defined ( __GNUC__ ) -/* GNU Compiler - ------------ - RAM functions are defined using a specific toolchain attribute - "__attribute__((section(".RamFunc")))". -*/ -#define __RAM_FUNC __attribute__((section(".RamFunc"))) - -#endif - -/** - * @brief __NOINLINE definition - */ -#if defined ( __CC_ARM ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) || defined ( __GNUC__ ) -/* ARM V4/V5 and V6 & GNU Compiler - ------------------------------- -*/ -#define __NOINLINE __attribute__ ( (noinline) ) - -#elif defined ( __ICCARM__ ) -/* ICCARM Compiler - --------------- -*/ -#define __NOINLINE _Pragma("optimize = no_inline") - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* ___STM32F4xx_HAL_DEF */ - - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h deleted file mode 100644 index 7ff3836..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h +++ /dev/null @@ -1,802 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma.h - * @author MCD Application Team - * @brief Header file of DMA HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DMA_H -#define __STM32F4xx_HAL_DMA_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup DMA - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Types DMA Exported Types - * @brief DMA Exported Types - * @{ - */ - -/** - * @brief DMA Configuration Structure definition - */ -typedef struct -{ - uint32_t Channel; /*!< Specifies the channel used for the specified stream. - This parameter can be a value of @ref DMA_Channel_selection */ - - uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, - from memory to memory or from peripheral to memory. - This parameter can be a value of @ref DMA_Data_transfer_direction */ - - uint32_t PeriphInc; /*!< Specifies whether the Peripheral address register should be incremented or not. - This parameter can be a value of @ref DMA_Peripheral_incremented_mode */ - - uint32_t MemInc; /*!< Specifies whether the memory address register should be incremented or not. - This parameter can be a value of @ref DMA_Memory_incremented_mode */ - - uint32_t PeriphDataAlignment; /*!< Specifies the Peripheral data width. - This parameter can be a value of @ref DMA_Peripheral_data_size */ - - uint32_t MemDataAlignment; /*!< Specifies the Memory data width. - This parameter can be a value of @ref DMA_Memory_data_size */ - - uint32_t Mode; /*!< Specifies the operation mode of the DMAy Streamx. - This parameter can be a value of @ref DMA_mode - @note The circular buffer mode cannot be used if the memory-to-memory - data transfer is configured on the selected Stream */ - - uint32_t Priority; /*!< Specifies the software priority for the DMAy Streamx. - This parameter can be a value of @ref DMA_Priority_level */ - - uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. - This parameter can be a value of @ref DMA_FIFO_direct_mode - @note The Direct mode (FIFO mode disabled) cannot be used if the - memory-to-memory data transfer is configured on the selected stream */ - - uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. - This parameter can be a value of @ref DMA_FIFO_threshold_level */ - - uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_Memory_burst - @note The burst mode is possible only if the address Increment mode is enabled. */ - - uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_Peripheral_burst - @note The burst mode is possible only if the address Increment mode is enabled. */ -}DMA_InitTypeDef; - - -/** - * @brief HAL DMA State structures definition - */ -typedef enum -{ - HAL_DMA_STATE_RESET = 0x00U, /*!< DMA not yet initialized or disabled */ - HAL_DMA_STATE_READY = 0x01U, /*!< DMA initialized and ready for use */ - HAL_DMA_STATE_BUSY = 0x02U, /*!< DMA process is ongoing */ - HAL_DMA_STATE_TIMEOUT = 0x03U, /*!< DMA timeout state */ - HAL_DMA_STATE_ERROR = 0x04U, /*!< DMA error state */ - HAL_DMA_STATE_ABORT = 0x05U, /*!< DMA Abort state */ -}HAL_DMA_StateTypeDef; - -/** - * @brief HAL DMA Error Code structure definition - */ -typedef enum -{ - HAL_DMA_FULL_TRANSFER = 0x00U, /*!< Full transfer */ - HAL_DMA_HALF_TRANSFER = 0x01U /*!< Half Transfer */ -}HAL_DMA_LevelCompleteTypeDef; - -/** - * @brief HAL DMA Error Code structure definition - */ -typedef enum -{ - HAL_DMA_XFER_CPLT_CB_ID = 0x00U, /*!< Full transfer */ - HAL_DMA_XFER_HALFCPLT_CB_ID = 0x01U, /*!< Half Transfer */ - HAL_DMA_XFER_M1CPLT_CB_ID = 0x02U, /*!< M1 Full Transfer */ - HAL_DMA_XFER_M1HALFCPLT_CB_ID = 0x03U, /*!< M1 Half Transfer */ - HAL_DMA_XFER_ERROR_CB_ID = 0x04U, /*!< Error */ - HAL_DMA_XFER_ABORT_CB_ID = 0x05U, /*!< Abort */ - HAL_DMA_XFER_ALL_CB_ID = 0x06U /*!< All */ -}HAL_DMA_CallbackIDTypeDef; - -/** - * @brief DMA handle Structure definition - */ -typedef struct __DMA_HandleTypeDef -{ - DMA_Stream_TypeDef *Instance; /*!< Register base address */ - - DMA_InitTypeDef Init; /*!< DMA communication parameters */ - - HAL_LockTypeDef Lock; /*!< DMA locking object */ - - __IO HAL_DMA_StateTypeDef State; /*!< DMA transfer state */ - - void *Parent; /*!< Parent object state */ - - void (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete callback */ - - void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA Half transfer complete callback */ - - void (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete Memory1 callback */ - - void (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Half complete Memory1 callback */ - - void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer error callback */ - - void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Abort callback */ - - __IO uint32_t ErrorCode; /*!< DMA Error code */ - - uint32_t StreamBaseAddress; /*!< DMA Stream Base Address */ - - uint32_t StreamIndex; /*!< DMA Stream Index */ - -}DMA_HandleTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Constants DMA Exported Constants - * @brief DMA Exported constants - * @{ - */ - -/** @defgroup DMA_Error_Code DMA Error Code - * @brief DMA Error Code - * @{ - */ -#define HAL_DMA_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_DMA_ERROR_TE 0x00000001U /*!< Transfer error */ -#define HAL_DMA_ERROR_FE 0x00000002U /*!< FIFO error */ -#define HAL_DMA_ERROR_DME 0x00000004U /*!< Direct Mode error */ -#define HAL_DMA_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ -#define HAL_DMA_ERROR_PARAM 0x00000040U /*!< Parameter error */ -#define HAL_DMA_ERROR_NO_XFER 0x00000080U /*!< Abort requested with no Xfer ongoing */ -#define HAL_DMA_ERROR_NOT_SUPPORTED 0x00000100U /*!< Not supported mode */ -/** - * @} - */ - -/** @defgroup DMA_Channel_selection DMA Channel selection - * @brief DMA channel selection - * @{ - */ -#define DMA_CHANNEL_0 0x00000000U /*!< DMA Channel 0 */ -#define DMA_CHANNEL_1 0x02000000U /*!< DMA Channel 1 */ -#define DMA_CHANNEL_2 0x04000000U /*!< DMA Channel 2 */ -#define DMA_CHANNEL_3 0x06000000U /*!< DMA Channel 3 */ -#define DMA_CHANNEL_4 0x08000000U /*!< DMA Channel 4 */ -#define DMA_CHANNEL_5 0x0A000000U /*!< DMA Channel 5 */ -#define DMA_CHANNEL_6 0x0C000000U /*!< DMA Channel 6 */ -#define DMA_CHANNEL_7 0x0E000000U /*!< DMA Channel 7 */ -#if defined (DMA_SxCR_CHSEL_3) -#define DMA_CHANNEL_8 0x10000000U /*!< DMA Channel 8 */ -#define DMA_CHANNEL_9 0x12000000U /*!< DMA Channel 9 */ -#define DMA_CHANNEL_10 0x14000000U /*!< DMA Channel 10 */ -#define DMA_CHANNEL_11 0x16000000U /*!< DMA Channel 11 */ -#define DMA_CHANNEL_12 0x18000000U /*!< DMA Channel 12 */ -#define DMA_CHANNEL_13 0x1A000000U /*!< DMA Channel 13 */ -#define DMA_CHANNEL_14 0x1C000000U /*!< DMA Channel 14 */ -#define DMA_CHANNEL_15 0x1E000000U /*!< DMA Channel 15 */ -#endif /* DMA_SxCR_CHSEL_3 */ -/** - * @} - */ - -/** @defgroup DMA_Data_transfer_direction DMA Data transfer direction - * @brief DMA data transfer direction - * @{ - */ -#define DMA_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ -#define DMA_MEMORY_TO_PERIPH ((uint32_t)DMA_SxCR_DIR_0) /*!< Memory to peripheral direction */ -#define DMA_MEMORY_TO_MEMORY ((uint32_t)DMA_SxCR_DIR_1) /*!< Memory to memory direction */ -/** - * @} - */ - -/** @defgroup DMA_Peripheral_incremented_mode DMA Peripheral incremented mode - * @brief DMA peripheral incremented mode - * @{ - */ -#define DMA_PINC_ENABLE ((uint32_t)DMA_SxCR_PINC) /*!< Peripheral increment mode enable */ -#define DMA_PINC_DISABLE 0x00000000U /*!< Peripheral increment mode disable */ -/** - * @} - */ - -/** @defgroup DMA_Memory_incremented_mode DMA Memory incremented mode - * @brief DMA memory incremented mode - * @{ - */ -#define DMA_MINC_ENABLE ((uint32_t)DMA_SxCR_MINC) /*!< Memory increment mode enable */ -#define DMA_MINC_DISABLE 0x00000000U /*!< Memory increment mode disable */ -/** - * @} - */ - -/** @defgroup DMA_Peripheral_data_size DMA Peripheral data size - * @brief DMA peripheral data size - * @{ - */ -#define DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment: Byte */ -#define DMA_PDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_PSIZE_0) /*!< Peripheral data alignment: HalfWord */ -#define DMA_PDATAALIGN_WORD ((uint32_t)DMA_SxCR_PSIZE_1) /*!< Peripheral data alignment: Word */ -/** - * @} - */ - -/** @defgroup DMA_Memory_data_size DMA Memory data size - * @brief DMA memory data size - * @{ - */ -#define DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment: Byte */ -#define DMA_MDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_MSIZE_0) /*!< Memory data alignment: HalfWord */ -#define DMA_MDATAALIGN_WORD ((uint32_t)DMA_SxCR_MSIZE_1) /*!< Memory data alignment: Word */ -/** - * @} - */ - -/** @defgroup DMA_mode DMA mode - * @brief DMA mode - * @{ - */ -#define DMA_NORMAL 0x00000000U /*!< Normal mode */ -#define DMA_CIRCULAR ((uint32_t)DMA_SxCR_CIRC) /*!< Circular mode */ -#define DMA_PFCTRL ((uint32_t)DMA_SxCR_PFCTRL) /*!< Peripheral flow control mode */ -/** - * @} - */ - -/** @defgroup DMA_Priority_level DMA Priority level - * @brief DMA priority levels - * @{ - */ -#define DMA_PRIORITY_LOW 0x00000000U /*!< Priority level: Low */ -#define DMA_PRIORITY_MEDIUM ((uint32_t)DMA_SxCR_PL_0) /*!< Priority level: Medium */ -#define DMA_PRIORITY_HIGH ((uint32_t)DMA_SxCR_PL_1) /*!< Priority level: High */ -#define DMA_PRIORITY_VERY_HIGH ((uint32_t)DMA_SxCR_PL) /*!< Priority level: Very High */ -/** - * @} - */ - -/** @defgroup DMA_FIFO_direct_mode DMA FIFO direct mode - * @brief DMA FIFO direct mode - * @{ - */ -#define DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */ -#define DMA_FIFOMODE_ENABLE ((uint32_t)DMA_SxFCR_DMDIS) /*!< FIFO mode enable */ -/** - * @} - */ - -/** @defgroup DMA_FIFO_threshold_level DMA FIFO threshold level - * @brief DMA FIFO level - * @{ - */ -#define DMA_FIFO_THRESHOLD_1QUARTERFULL 0x00000000U /*!< FIFO threshold 1 quart full configuration */ -#define DMA_FIFO_THRESHOLD_HALFFULL ((uint32_t)DMA_SxFCR_FTH_0) /*!< FIFO threshold half full configuration */ -#define DMA_FIFO_THRESHOLD_3QUARTERSFULL ((uint32_t)DMA_SxFCR_FTH_1) /*!< FIFO threshold 3 quarts full configuration */ -#define DMA_FIFO_THRESHOLD_FULL ((uint32_t)DMA_SxFCR_FTH) /*!< FIFO threshold full configuration */ -/** - * @} - */ - -/** @defgroup DMA_Memory_burst DMA Memory burst - * @brief DMA memory burst - * @{ - */ -#define DMA_MBURST_SINGLE 0x00000000U -#define DMA_MBURST_INC4 ((uint32_t)DMA_SxCR_MBURST_0) -#define DMA_MBURST_INC8 ((uint32_t)DMA_SxCR_MBURST_1) -#define DMA_MBURST_INC16 ((uint32_t)DMA_SxCR_MBURST) -/** - * @} - */ - -/** @defgroup DMA_Peripheral_burst DMA Peripheral burst - * @brief DMA peripheral burst - * @{ - */ -#define DMA_PBURST_SINGLE 0x00000000U -#define DMA_PBURST_INC4 ((uint32_t)DMA_SxCR_PBURST_0) -#define DMA_PBURST_INC8 ((uint32_t)DMA_SxCR_PBURST_1) -#define DMA_PBURST_INC16 ((uint32_t)DMA_SxCR_PBURST) -/** - * @} - */ - -/** @defgroup DMA_interrupt_enable_definitions DMA interrupt enable definitions - * @brief DMA interrupts definition - * @{ - */ -#define DMA_IT_TC ((uint32_t)DMA_SxCR_TCIE) -#define DMA_IT_HT ((uint32_t)DMA_SxCR_HTIE) -#define DMA_IT_TE ((uint32_t)DMA_SxCR_TEIE) -#define DMA_IT_DME ((uint32_t)DMA_SxCR_DMEIE) -#define DMA_IT_FE 0x00000080U -/** - * @} - */ - -/** @defgroup DMA_flag_definitions DMA flag definitions - * @brief DMA flag definitions - * @{ - */ -#define DMA_FLAG_FEIF0_4 0x00000001U -#define DMA_FLAG_DMEIF0_4 0x00000004U -#define DMA_FLAG_TEIF0_4 0x00000008U -#define DMA_FLAG_HTIF0_4 0x00000010U -#define DMA_FLAG_TCIF0_4 0x00000020U -#define DMA_FLAG_FEIF1_5 0x00000040U -#define DMA_FLAG_DMEIF1_5 0x00000100U -#define DMA_FLAG_TEIF1_5 0x00000200U -#define DMA_FLAG_HTIF1_5 0x00000400U -#define DMA_FLAG_TCIF1_5 0x00000800U -#define DMA_FLAG_FEIF2_6 0x00010000U -#define DMA_FLAG_DMEIF2_6 0x00040000U -#define DMA_FLAG_TEIF2_6 0x00080000U -#define DMA_FLAG_HTIF2_6 0x00100000U -#define DMA_FLAG_TCIF2_6 0x00200000U -#define DMA_FLAG_FEIF3_7 0x00400000U -#define DMA_FLAG_DMEIF3_7 0x01000000U -#define DMA_FLAG_TEIF3_7 0x02000000U -#define DMA_FLAG_HTIF3_7 0x04000000U -#define DMA_FLAG_TCIF3_7 0x08000000U -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ - -/** @brief Reset DMA handle state - * @param __HANDLE__ specifies the DMA handle. - * @retval None - */ -#define __HAL_DMA_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DMA_STATE_RESET) - -/** - * @brief Return the current DMA Stream FIFO filled level. - * @param __HANDLE__ DMA handle - * @retval The FIFO filling state. - * - DMA_FIFOStatus_Less1QuarterFull: when FIFO is less than 1 quarter-full - * and not empty. - * - DMA_FIFOStatus_1QuarterFull: if more than 1 quarter-full. - * - DMA_FIFOStatus_HalfFull: if more than 1 half-full. - * - DMA_FIFOStatus_3QuartersFull: if more than 3 quarters-full. - * - DMA_FIFOStatus_Empty: when FIFO is empty - * - DMA_FIFOStatus_Full: when FIFO is full - */ -#define __HAL_DMA_GET_FS(__HANDLE__) (((__HANDLE__)->Instance->FCR & (DMA_SxFCR_FS))) - -/** - * @brief Enable the specified DMA Stream. - * @param __HANDLE__ DMA handle - * @retval None - */ -#define __HAL_DMA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DMA_SxCR_EN) - -/** - * @brief Disable the specified DMA Stream. - * @param __HANDLE__ DMA handle - * @retval None - */ -#define __HAL_DMA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~DMA_SxCR_EN) - -/* Interrupt & Flag management */ - -/** - * @brief Return the current DMA Stream transfer complete flag. - * @param __HANDLE__ DMA handle - * @retval The specified transfer complete flag index. - */ -#define __HAL_DMA_GET_TC_FLAG_INDEX(__HANDLE__) \ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TCIF2_6 :\ - DMA_FLAG_TCIF3_7) - -/** - * @brief Return the current DMA Stream half transfer complete flag. - * @param __HANDLE__ DMA handle - * @retval The specified half transfer complete flag index. - */ -#define __HAL_DMA_GET_HT_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_HTIF2_6 :\ - DMA_FLAG_HTIF3_7) - -/** - * @brief Return the current DMA Stream transfer error flag. - * @param __HANDLE__ DMA handle - * @retval The specified transfer error flag index. - */ -#define __HAL_DMA_GET_TE_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TEIF2_6 :\ - DMA_FLAG_TEIF3_7) - -/** - * @brief Return the current DMA Stream FIFO error flag. - * @param __HANDLE__ DMA handle - * @retval The specified FIFO error flag index. - */ -#define __HAL_DMA_GET_FE_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_FEIF2_6 :\ - DMA_FLAG_FEIF3_7) - -/** - * @brief Return the current DMA Stream direct mode error flag. - * @param __HANDLE__ DMA handle - * @retval The specified direct mode error flag index. - */ -#define __HAL_DMA_GET_DME_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_DMEIF2_6 :\ - DMA_FLAG_DMEIF3_7) - -/** - * @brief Get the DMA Stream pending flags. - * @param __HANDLE__ DMA handle - * @param __FLAG__ Get the specified flag. - * This parameter can be any combination of the following values: - * @arg DMA_FLAG_TCIFx: Transfer complete flag. - * @arg DMA_FLAG_HTIFx: Half transfer complete flag. - * @arg DMA_FLAG_TEIFx: Transfer error flag. - * @arg DMA_FLAG_DMEIFx: Direct mode error flag. - * @arg DMA_FLAG_FEIFx: FIFO error flag. - * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. - * @retval The state of FLAG (SET or RESET). - */ -#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)\ -(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HISR & (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LISR & (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HISR & (__FLAG__)) : (DMA1->LISR & (__FLAG__))) - -/** - * @brief Clear the DMA Stream pending flags. - * @param __HANDLE__ DMA handle - * @param __FLAG__ specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg DMA_FLAG_TCIFx: Transfer complete flag. - * @arg DMA_FLAG_HTIFx: Half transfer complete flag. - * @arg DMA_FLAG_TEIFx: Transfer error flag. - * @arg DMA_FLAG_DMEIFx: Direct mode error flag. - * @arg DMA_FLAG_FEIFx: FIFO error flag. - * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. - * @retval None - */ -#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) \ -(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HIFCR = (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LIFCR = (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HIFCR = (__FLAG__)) : (DMA1->LIFCR = (__FLAG__))) - -/** - * @brief Enable the specified DMA Stream interrupts. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval None - */ -#define __HAL_DMA_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ -((__HANDLE__)->Instance->CR |= (__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR |= (__INTERRUPT__))) - -/** - * @brief Disable the specified DMA Stream interrupts. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval None - */ -#define __HAL_DMA_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ -((__HANDLE__)->Instance->CR &= ~(__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR &= ~(__INTERRUPT__))) - -/** - * @brief Check whether the specified DMA Stream interrupt is enabled or disabled. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt source to check. - * This parameter can be one of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval The state of DMA_IT. - */ -#define __HAL_DMA_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ - ((__HANDLE__)->Instance->CR & (__INTERRUPT__)) : \ - ((__HANDLE__)->Instance->FCR & (__INTERRUPT__))) - -/** - * @brief Writes the number of data units to be transferred on the DMA Stream. - * @param __HANDLE__ DMA handle - * @param __COUNTER__ Number of data units to be transferred (from 0 to 65535) - * Number of data items depends only on the Peripheral data format. - * - * @note If Peripheral data format is Bytes: number of data units is equal - * to total number of bytes to be transferred. - * - * @note If Peripheral data format is Half-Word: number of data units is - * equal to total number of bytes to be transferred / 2. - * - * @note If Peripheral data format is Word: number of data units is equal - * to total number of bytes to be transferred / 4. - * - * @retval The number of remaining data units in the current DMAy Streamx transfer. - */ -#define __HAL_DMA_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->NDTR = (uint16_t)(__COUNTER__)) - -/** - * @brief Returns the number of remaining data units in the current DMAy Streamx transfer. - * @param __HANDLE__ DMA handle - * - * @retval The number of remaining data units in the current DMA Stream transfer. - */ -#define __HAL_DMA_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->NDTR) - - -/* Include DMA HAL Extension module */ -#include "stm32f4xx_hal_dma_ex.h" - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Functions DMA Exported Functions - * @brief DMA Exported functions - * @{ - */ - -/** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * @{ - */ -HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma); -/** - * @} - */ - -/** @defgroup DMA_Exported_Functions_Group2 I/O operation functions - * @brief I/O operation functions - * @{ - */ -HAL_StatusTypeDef HAL_DMA_Start (DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout); -void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_CleanCallbacks(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)); -HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID); - -/** - * @} - */ - -/** @defgroup DMA_Exported_Functions_Group3 Peripheral State functions - * @brief Peripheral State functions - * @{ - */ -HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma); -uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma); -/** - * @} - */ -/** - * @} - */ -/* Private Constants -------------------------------------------------------------*/ -/** @defgroup DMA_Private_Constants DMA Private Constants - * @brief DMA private defines and constants - * @{ - */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup DMA_Private_Macros DMA Private Macros - * @brief DMA private macros - * @{ - */ -#if defined (DMA_SxCR_CHSEL_3) -#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ - ((CHANNEL) == DMA_CHANNEL_1) || \ - ((CHANNEL) == DMA_CHANNEL_2) || \ - ((CHANNEL) == DMA_CHANNEL_3) || \ - ((CHANNEL) == DMA_CHANNEL_4) || \ - ((CHANNEL) == DMA_CHANNEL_5) || \ - ((CHANNEL) == DMA_CHANNEL_6) || \ - ((CHANNEL) == DMA_CHANNEL_7) || \ - ((CHANNEL) == DMA_CHANNEL_8) || \ - ((CHANNEL) == DMA_CHANNEL_9) || \ - ((CHANNEL) == DMA_CHANNEL_10)|| \ - ((CHANNEL) == DMA_CHANNEL_11)|| \ - ((CHANNEL) == DMA_CHANNEL_12)|| \ - ((CHANNEL) == DMA_CHANNEL_13)|| \ - ((CHANNEL) == DMA_CHANNEL_14)|| \ - ((CHANNEL) == DMA_CHANNEL_15)) -#else -#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ - ((CHANNEL) == DMA_CHANNEL_1) || \ - ((CHANNEL) == DMA_CHANNEL_2) || \ - ((CHANNEL) == DMA_CHANNEL_3) || \ - ((CHANNEL) == DMA_CHANNEL_4) || \ - ((CHANNEL) == DMA_CHANNEL_5) || \ - ((CHANNEL) == DMA_CHANNEL_6) || \ - ((CHANNEL) == DMA_CHANNEL_7)) -#endif /* DMA_SxCR_CHSEL_3 */ - -#define IS_DMA_DIRECTION(DIRECTION) (((DIRECTION) == DMA_PERIPH_TO_MEMORY ) || \ - ((DIRECTION) == DMA_MEMORY_TO_PERIPH) || \ - ((DIRECTION) == DMA_MEMORY_TO_MEMORY)) - -#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x01U) && ((SIZE) < 0x10000U)) - -#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PINC_ENABLE) || \ - ((STATE) == DMA_PINC_DISABLE)) - -#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MINC_ENABLE) || \ - ((STATE) == DMA_MINC_DISABLE)) - -#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PDATAALIGN_BYTE) || \ - ((SIZE) == DMA_PDATAALIGN_HALFWORD) || \ - ((SIZE) == DMA_PDATAALIGN_WORD)) - -#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MDATAALIGN_BYTE) || \ - ((SIZE) == DMA_MDATAALIGN_HALFWORD) || \ - ((SIZE) == DMA_MDATAALIGN_WORD )) - -#define IS_DMA_MODE(MODE) (((MODE) == DMA_NORMAL ) || \ - ((MODE) == DMA_CIRCULAR) || \ - ((MODE) == DMA_PFCTRL)) - -#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_PRIORITY_LOW ) || \ - ((PRIORITY) == DMA_PRIORITY_MEDIUM) || \ - ((PRIORITY) == DMA_PRIORITY_HIGH) || \ - ((PRIORITY) == DMA_PRIORITY_VERY_HIGH)) - -#define IS_DMA_FIFO_MODE_STATE(STATE) (((STATE) == DMA_FIFOMODE_DISABLE ) || \ - ((STATE) == DMA_FIFOMODE_ENABLE)) - -#define IS_DMA_FIFO_THRESHOLD(THRESHOLD) (((THRESHOLD) == DMA_FIFO_THRESHOLD_1QUARTERFULL ) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_HALFFULL) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_3QUARTERSFULL) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_FULL)) - -#define IS_DMA_MEMORY_BURST(BURST) (((BURST) == DMA_MBURST_SINGLE) || \ - ((BURST) == DMA_MBURST_INC4) || \ - ((BURST) == DMA_MBURST_INC8) || \ - ((BURST) == DMA_MBURST_INC16)) - -#define IS_DMA_PERIPHERAL_BURST(BURST) (((BURST) == DMA_PBURST_SINGLE) || \ - ((BURST) == DMA_PBURST_INC4) || \ - ((BURST) == DMA_PBURST_INC8) || \ - ((BURST) == DMA_PBURST_INC16)) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DMA_Private_Functions DMA Private Functions - * @brief DMA private functions - * @{ - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_DMA_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h deleted file mode 100644 index 9858c74..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma_ex.h - * @author MCD Application Team - * @brief Header file of DMA HAL extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DMA_EX_H -#define __STM32F4xx_HAL_DMA_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup DMAEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup DMAEx_Exported_Types DMAEx Exported Types - * @brief DMAEx Exported types - * @{ - */ - -/** - * @brief HAL DMA Memory definition - */ -typedef enum -{ - MEMORY0 = 0x00U, /*!< Memory 0 */ - MEMORY1 = 0x01U /*!< Memory 1 */ -}HAL_DMA_MemoryTypeDef; - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup DMAEx_Exported_Functions DMAEx Exported Functions - * @brief DMAEx Exported functions - * @{ - */ - -/** @defgroup DMAEx_Exported_Functions_Group1 Extended features functions - * @brief Extended features functions - * @{ - */ - -/* IO operation functions *******************************************************/ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory); - -/** - * @} - */ -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DMAEx_Private_Functions DMAEx Private Functions - * @brief DMAEx Private functions - * @{ - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_HAL_DMA_EX_H*/ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h deleted file mode 100644 index b18a228..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h +++ /dev/null @@ -1,366 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_exti.h - * @author MCD Application Team - * @brief Header file of EXTI HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2018 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS.Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32f4xx_HAL_EXTI_H -#define STM32f4xx_HAL_EXTI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup EXTI EXTI - * @brief EXTI HAL module driver - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup EXTI_Exported_Types EXTI Exported Types - * @{ - */ -typedef enum -{ - HAL_EXTI_COMMON_CB_ID = 0x00U -} EXTI_CallbackIDTypeDef; - -/** - * @brief EXTI Handle structure definition - */ -typedef struct -{ - uint32_t Line; /*!< Exti line number */ - void (* PendingCallback)(void); /*!< Exti pending callback */ -} EXTI_HandleTypeDef; - -/** - * @brief EXTI Configuration structure definition - */ -typedef struct -{ - uint32_t Line; /*!< The Exti line to be configured. This parameter - can be a value of @ref EXTI_Line */ - uint32_t Mode; /*!< The Exit Mode to be configured for a core. - This parameter can be a combination of @ref EXTI_Mode */ - uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter - can be a value of @ref EXTI_Trigger */ - uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. - This parameter is only possible for line 0 to 15. It - can be a value of @ref EXTI_GPIOSel */ -} EXTI_ConfigTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Constants EXTI Exported Constants - * @{ - */ - -/** @defgroup EXTI_Line EXTI Line - * @{ - */ -#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ -#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ -#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ -#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ -#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ -#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ -#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ -#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ -#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ -#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ -#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ -#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ -#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ -#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ -#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ -#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ -#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ -#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#if defined(EXTI_IMR_IM18) -#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#else -#define EXTI_LINE_18 (EXTI_RESERVED | 0x12u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM18 */ -#if defined(EXTI_IMR_IM19) -#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#else -#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM19 */ -#if defined(EXTI_IMR_IM20) -#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#else -#define EXTI_LINE_20 (EXTI_RESERVED | 0x14u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM20 */ -#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM1 asynchronous event */ -#endif /* EXTI_IMR_IM23 */ - -/** - * @} - */ - -/** @defgroup EXTI_Mode EXTI Mode - * @{ - */ -#define EXTI_MODE_NONE 0x00000000u -#define EXTI_MODE_INTERRUPT 0x00000001u -#define EXTI_MODE_EVENT 0x00000002u -/** - * @} - */ - -/** @defgroup EXTI_Trigger EXTI Trigger - * @{ - */ - -#define EXTI_TRIGGER_NONE 0x00000000u -#define EXTI_TRIGGER_RISING 0x00000001u -#define EXTI_TRIGGER_FALLING 0x00000002u -#define EXTI_TRIGGER_RISING_FALLING (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) -/** - * @} - */ - -/** @defgroup EXTI_GPIOSel EXTI GPIOSel - * @brief - * @{ - */ -#define EXTI_GPIOA 0x00000000u -#define EXTI_GPIOB 0x00000001u -#define EXTI_GPIOC 0x00000002u -#if defined (GPIOD) -#define EXTI_GPIOD 0x00000003u -#endif /* GPIOD */ -#if defined (GPIOE) -#define EXTI_GPIOE 0x00000004u -#endif /* GPIOE */ -#if defined (GPIOF) -#define EXTI_GPIOF 0x00000005u -#endif /* GPIOF */ -#if defined (GPIOG) -#define EXTI_GPIOG 0x00000006u -#endif /* GPIOG */ -#if defined (GPIOH) -#define EXTI_GPIOH 0x00000007u -#endif /* GPIOH */ -#if defined (GPIOI) -#define EXTI_GPIOI 0x00000008u -#endif /* GPIOI */ -#if defined (GPIOJ) -#define EXTI_GPIOJ 0x00000009u -#endif /* GPIOJ */ -#if defined (GPIOK) -#define EXTI_GPIOK 0x0000000Au -#endif /* GPIOK */ - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Macros EXTI Exported Macros - * @{ - */ - -/** - * @} - */ - -/* Private constants --------------------------------------------------------*/ -/** @defgroup EXTI_Private_Constants EXTI Private Constants - * @{ - */ -/** - * @brief EXTI Line property definition - */ -#define EXTI_PROPERTY_SHIFT 24u -#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) -#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) -#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) -#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) - -/** - * @brief EXTI bit usage - */ -#define EXTI_PIN_MASK 0x0000001Fu - -/** - * @brief EXTI Mask for interrupt & event mode - */ -#define EXTI_MODE_MASK (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT) - -/** - * @brief EXTI Mask for trigger possibilities - */ -#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) - -/** - * @brief EXTI Line number - */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_NB 24UL -#else -#define EXTI_LINE_NB 23UL -#endif /* EXTI_IMR_IM23 */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup EXTI_Private_Macros EXTI Private Macros - * @{ - */ -#define IS_EXTI_LINE(__EXTI_LINE__) ((((__EXTI_LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ - ((((__EXTI_LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ - (((__EXTI_LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ - (((__EXTI_LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) - -#define IS_EXTI_MODE(__EXTI_LINE__) ((((__EXTI_LINE__) & EXTI_MODE_MASK) != 0x00u) && \ - (((__EXTI_LINE__) & ~EXTI_MODE_MASK) == 0x00u)) - -#define IS_EXTI_TRIGGER(__EXTI_LINE__) (((__EXTI_LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) - -#define IS_EXTI_PENDING_EDGE(__EXTI_LINE__) ((__EXTI_LINE__) == EXTI_TRIGGER_RISING_FALLING) - -#define IS_EXTI_CONFIG_LINE(__EXTI_LINE__) (((__EXTI_LINE__) & EXTI_CONFIG) != 0x00u) - -#if !defined (GPIOD) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOE) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOF) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOI) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOJ) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH) || \ - ((__PORT__) == EXTI_GPIOI)) -#else -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH) || \ - ((__PORT__) == EXTI_GPIOI) || \ - ((__PORT__) == EXTI_GPIOJ) || \ - ((__PORT__) == EXTI_GPIOK)) -#endif /* GPIOD */ - -#define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Functions EXTI Exported Functions - * @brief EXTI Exported Functions - * @{ - */ - -/** @defgroup EXTI_Exported_Functions_Group1 Configuration functions - * @brief Configuration functions - * @{ - */ -/* Configuration functions ****************************************************/ -HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); -HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); -HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti); -HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)); -HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine); -/** - * @} - */ - -/** @defgroup EXTI_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * @{ - */ -/* IO operation functions *****************************************************/ -void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti); -uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); -void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); -void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32f4xx_HAL_EXTI_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h deleted file mode 100644 index 41f77d2..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h +++ /dev/null @@ -1,425 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash.h - * @author MCD Application Team - * @brief Header file of FLASH HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_FLASH_H -#define __STM32F4xx_HAL_FLASH_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASH - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Types FLASH Exported Types - * @{ - */ - -/** - * @brief FLASH Procedure structure definition - */ -typedef enum -{ - FLASH_PROC_NONE = 0U, - FLASH_PROC_SECTERASE, - FLASH_PROC_MASSERASE, - FLASH_PROC_PROGRAM -} FLASH_ProcedureTypeDef; - -/** - * @brief FLASH handle Structure definition - */ -typedef struct -{ - __IO FLASH_ProcedureTypeDef ProcedureOnGoing; /*Internal variable to indicate which procedure is ongoing or not in IT context*/ - - __IO uint32_t NbSectorsToErase; /*Internal variable to save the remaining sectors to erase in IT context*/ - - __IO uint8_t VoltageForErase; /*Internal variable to provide voltage range selected by user in IT context*/ - - __IO uint32_t Sector; /*Internal variable to define the current sector which is erasing*/ - - __IO uint32_t Bank; /*Internal variable to save current bank selected during mass erase*/ - - __IO uint32_t Address; /*Internal variable to save address selected for program*/ - - HAL_LockTypeDef Lock; /* FLASH locking object */ - - __IO uint32_t ErrorCode; /* FLASH error code */ - -} FLASH_ProcessTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Constants FLASH Exported Constants - * @{ - */ -/** @defgroup FLASH_Error_Code FLASH Error Code - * @brief FLASH Error Code - * @{ - */ -#define HAL_FLASH_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_FLASH_ERROR_RD 0x00000001U /*!< Read Protection error */ -#define HAL_FLASH_ERROR_PGS 0x00000002U /*!< Programming Sequence error */ -#define HAL_FLASH_ERROR_PGP 0x00000004U /*!< Programming Parallelism error */ -#define HAL_FLASH_ERROR_PGA 0x00000008U /*!< Programming Alignment error */ -#define HAL_FLASH_ERROR_WRP 0x00000010U /*!< Write protection error */ -#define HAL_FLASH_ERROR_OPERATION 0x00000020U /*!< Operation Error */ -/** - * @} - */ - -/** @defgroup FLASH_Type_Program FLASH Type Program - * @{ - */ -#define FLASH_TYPEPROGRAM_BYTE 0x00000000U /*!< Program byte (8-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_HALFWORD 0x00000001U /*!< Program a half-word (16-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_WORD 0x00000002U /*!< Program a word (32-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_DOUBLEWORD 0x00000003U /*!< Program a double word (64-bit) at a specified address */ -/** - * @} - */ - -/** @defgroup FLASH_Flag_definition FLASH Flag definition - * @brief Flag definition - * @{ - */ -#define FLASH_FLAG_EOP FLASH_SR_EOP /*!< FLASH End of Operation flag */ -#define FLASH_FLAG_OPERR FLASH_SR_SOP /*!< FLASH operation Error flag */ -#define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /*!< FLASH Write protected error flag */ -#define FLASH_FLAG_PGAERR FLASH_SR_PGAERR /*!< FLASH Programming Alignment error flag */ -#define FLASH_FLAG_PGPERR FLASH_SR_PGPERR /*!< FLASH Programming Parallelism error flag */ -#define FLASH_FLAG_PGSERR FLASH_SR_PGSERR /*!< FLASH Programming Sequence error flag */ -#if defined(FLASH_SR_RDERR) -#define FLASH_FLAG_RDERR FLASH_SR_RDERR /*!< Read Protection error flag (PCROP) */ -#endif /* FLASH_SR_RDERR */ -#define FLASH_FLAG_BSY FLASH_SR_BSY /*!< FLASH Busy flag */ -/** - * @} - */ - -/** @defgroup FLASH_Interrupt_definition FLASH Interrupt definition - * @brief FLASH Interrupt definition - * @{ - */ -#define FLASH_IT_EOP FLASH_CR_EOPIE /*!< End of FLASH Operation Interrupt source */ -#define FLASH_IT_ERR 0x02000000U /*!< Error Interrupt source */ -/** - * @} - */ - -/** @defgroup FLASH_Program_Parallelism FLASH Program Parallelism - * @{ - */ -#define FLASH_PSIZE_BYTE 0x00000000U -#define FLASH_PSIZE_HALF_WORD 0x00000100U -#define FLASH_PSIZE_WORD 0x00000200U -#define FLASH_PSIZE_DOUBLE_WORD 0x00000300U -#define CR_PSIZE_MASK 0xFFFFFCFFU -/** - * @} - */ - -/** @defgroup FLASH_Keys FLASH Keys - * @{ - */ -#define RDP_KEY ((uint16_t)0x00A5) -#define FLASH_KEY1 0x45670123U -#define FLASH_KEY2 0xCDEF89ABU -#define FLASH_OPT_KEY1 0x08192A3BU -#define FLASH_OPT_KEY2 0x4C5D6E7FU -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Macros FLASH Exported Macros - * @{ - */ -/** - * @brief Set the FLASH Latency. - * @param __LATENCY__ FLASH Latency - * The value of this parameter depend on device used within the same series - * @retval none - */ -#define __HAL_FLASH_SET_LATENCY(__LATENCY__) (*(__IO uint8_t *)ACR_BYTE0_ADDRESS = (uint8_t)(__LATENCY__)) - -/** - * @brief Get the FLASH Latency. - * @retval FLASH Latency - * The value of this parameter depend on device used within the same series - */ -#define __HAL_FLASH_GET_LATENCY() (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)) - -/** - * @brief Enable the FLASH prefetch buffer. - * @retval none - */ -#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE() (FLASH->ACR |= FLASH_ACR_PRFTEN) - -/** - * @brief Disable the FLASH prefetch buffer. - * @retval none - */ -#define __HAL_FLASH_PREFETCH_BUFFER_DISABLE() (FLASH->ACR &= (~FLASH_ACR_PRFTEN)) - -/** - * @brief Enable the FLASH instruction cache. - * @retval none - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_ICEN) - -/** - * @brief Disable the FLASH instruction cache. - * @retval none - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_ICEN)) - -/** - * @brief Enable the FLASH data cache. - * @retval none - */ -#define __HAL_FLASH_DATA_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_DCEN) - -/** - * @brief Disable the FLASH data cache. - * @retval none - */ -#define __HAL_FLASH_DATA_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_DCEN)) - -/** - * @brief Resets the FLASH instruction Cache. - * @note This function must be used only when the Instruction Cache is disabled. - * @retval None - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_ICRST; \ - FLASH->ACR &= ~FLASH_ACR_ICRST; \ - }while(0U) - -/** - * @brief Resets the FLASH data Cache. - * @note This function must be used only when the data Cache is disabled. - * @retval None - */ -#define __HAL_FLASH_DATA_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_DCRST; \ - FLASH->ACR &= ~FLASH_ACR_DCRST; \ - }while(0U) -/** - * @brief Enable the specified FLASH interrupt. - * @param __INTERRUPT__ FLASH interrupt - * This parameter can be any combination of the following values: - * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt - * @arg FLASH_IT_ERR: Error Interrupt - * @retval none - */ -#define __HAL_FLASH_ENABLE_IT(__INTERRUPT__) (FLASH->CR |= (__INTERRUPT__)) - -/** - * @brief Disable the specified FLASH interrupt. - * @param __INTERRUPT__ FLASH interrupt - * This parameter can be any combination of the following values: - * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt - * @arg FLASH_IT_ERR: Error Interrupt - * @retval none - */ -#define __HAL_FLASH_DISABLE_IT(__INTERRUPT__) (FLASH->CR &= ~(uint32_t)(__INTERRUPT__)) - -/** - * @brief Get the specified FLASH flag status. - * @param __FLAG__ specifies the FLASH flags to check. - * This parameter can be any combination of the following values: - * @arg FLASH_FLAG_EOP : FLASH End of Operation flag - * @arg FLASH_FLAG_OPERR : FLASH operation Error flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag - * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag - * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) - * @arg FLASH_FLAG_BSY : FLASH Busy flag - * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices - * @retval The new state of __FLAG__ (SET or RESET). - */ -#define __HAL_FLASH_GET_FLAG(__FLAG__) ((FLASH->SR & (__FLAG__))) - -/** - * @brief Clear the specified FLASH flags. - * @param __FLAG__ specifies the FLASH flags to clear. - * This parameter can be any combination of the following values: - * @arg FLASH_FLAG_EOP : FLASH End of Operation flag - * @arg FLASH_FLAG_OPERR : FLASH operation Error flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag - * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag - * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) - * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices - * @retval none - */ -#define __HAL_FLASH_CLEAR_FLAG(__FLAG__) (FLASH->SR = (__FLAG__)) -/** - * @} - */ - -/* Include FLASH HAL Extension module */ -#include "stm32f4xx_hal_flash_ex.h" -#include "stm32f4xx_hal_flash_ramfunc.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup FLASH_Exported_Functions - * @{ - */ -/** @addtogroup FLASH_Exported_Functions_Group1 - * @{ - */ -/* Program operation functions ***********************************************/ -HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data); -HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data); -/* FLASH IRQ handler method */ -void HAL_FLASH_IRQHandler(void); -/* Callbacks in non blocking modes */ -void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue); -void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue); -/** - * @} - */ - -/** @addtogroup FLASH_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions **********************************************/ -HAL_StatusTypeDef HAL_FLASH_Unlock(void); -HAL_StatusTypeDef HAL_FLASH_Lock(void); -HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void); -HAL_StatusTypeDef HAL_FLASH_OB_Lock(void); -/* Option bytes control */ -HAL_StatusTypeDef HAL_FLASH_OB_Launch(void); -/** - * @} - */ - -/** @addtogroup FLASH_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State functions ************************************************/ -uint32_t HAL_FLASH_GetError(void); -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Variables FLASH Private Variables - * @{ - */ - -/** - * @} - */ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Constants FLASH Private Constants - * @{ - */ - -/** - * @brief ACR register byte 0 (Bits[7:0]) base address - */ -#define ACR_BYTE0_ADDRESS 0x40023C00U -/** - * @brief OPTCR register byte 0 (Bits[7:0]) base address - */ -#define OPTCR_BYTE0_ADDRESS 0x40023C14U -/** - * @brief OPTCR register byte 1 (Bits[15:8]) base address - */ -#define OPTCR_BYTE1_ADDRESS 0x40023C15U -/** - * @brief OPTCR register byte 2 (Bits[23:16]) base address - */ -#define OPTCR_BYTE2_ADDRESS 0x40023C16U -/** - * @brief OPTCR register byte 3 (Bits[31:24]) base address - */ -#define OPTCR_BYTE3_ADDRESS 0x40023C17U - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup FLASH_Private_Macros FLASH Private Macros - * @{ - */ - -/** @defgroup FLASH_IS_FLASH_Definitions FLASH Private macros to check input parameters - * @{ - */ -#define IS_FLASH_TYPEPROGRAM(VALUE)(((VALUE) == FLASH_TYPEPROGRAM_BYTE) || \ - ((VALUE) == FLASH_TYPEPROGRAM_HALFWORD) || \ - ((VALUE) == FLASH_TYPEPROGRAM_WORD) || \ - ((VALUE) == FLASH_TYPEPROGRAM_DOUBLEWORD)) -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Functions FLASH Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_FLASH_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h deleted file mode 100644 index 5fa89db..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h +++ /dev/null @@ -1,1063 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ex.h - * @author MCD Application Team - * @brief Header file of FLASH HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_FLASH_EX_H -#define __STM32F4xx_HAL_FLASH_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASHEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup FLASHEx_Exported_Types FLASH Exported Types - * @{ - */ - -/** - * @brief FLASH Erase structure definition - */ -typedef struct -{ - uint32_t TypeErase; /*!< Mass erase or sector Erase. - This parameter can be a value of @ref FLASHEx_Type_Erase */ - - uint32_t Banks; /*!< Select banks to erase when Mass erase is enabled. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint32_t Sector; /*!< Initial FLASH sector to erase when Mass erase is disabled - This parameter must be a value of @ref FLASHEx_Sectors */ - - uint32_t NbSectors; /*!< Number of sectors to be erased. - This parameter must be a value between 1 and (max number of sectors - value of Initial sector)*/ - - uint32_t VoltageRange;/*!< The device voltage range which defines the erase parallelism - This parameter must be a value of @ref FLASHEx_Voltage_Range */ - -} FLASH_EraseInitTypeDef; - -/** - * @brief FLASH Option Bytes Program structure definition - */ -typedef struct -{ - uint32_t OptionType; /*!< Option byte to be configured. - This parameter can be a value of @ref FLASHEx_Option_Type */ - - uint32_t WRPState; /*!< Write protection activation or deactivation. - This parameter can be a value of @ref FLASHEx_WRP_State */ - - uint32_t WRPSector; /*!< Specifies the sector(s) to be write protected. - The value of this parameter depend on device used within the same series */ - - uint32_t Banks; /*!< Select banks for WRP activation/deactivation of all sectors. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint32_t RDPLevel; /*!< Set the read protection level. - This parameter can be a value of @ref FLASHEx_Option_Bytes_Read_Protection */ - - uint32_t BORLevel; /*!< Set the BOR Level. - This parameter can be a value of @ref FLASHEx_BOR_Reset_Level */ - - uint8_t USERConfig; /*!< Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. */ - -} FLASH_OBProgramInitTypeDef; - -/** - * @brief FLASH Advanced Option Bytes Program structure definition - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -typedef struct -{ - uint32_t OptionType; /*!< Option byte to be configured for extension. - This parameter can be a value of @ref FLASHEx_Advanced_Option_Type */ - - uint32_t PCROPState; /*!< PCROP activation or deactivation. - This parameter can be a value of @ref FLASHEx_PCROP_State */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - uint16_t Sectors; /*!< specifies the sector(s) set for PCROP. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx ||\ - STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - uint32_t Banks; /*!< Select banks for PCROP activation/deactivation of all sectors. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint16_t SectorsBank1; /*!< Specifies the sector(s) set for PCROP for Bank1. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ - - uint16_t SectorsBank2; /*!< Specifies the sector(s) set for PCROP for Bank2. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ - - uint8_t BootConfig; /*!< Specifies Option bytes for boot config. - This parameter can be a value of @ref FLASHEx_Dual_Boot */ - -#endif /*STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -} FLASH_AdvOBProgramInitTypeDef; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || - STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup FLASHEx_Exported_Constants FLASH Exported Constants - * @{ - */ - -/** @defgroup FLASHEx_Type_Erase FLASH Type Erase - * @{ - */ -#define FLASH_TYPEERASE_SECTORS 0x00000000U /*!< Sectors erase only */ -#define FLASH_TYPEERASE_MASSERASE 0x00000001U /*!< Flash Mass erase activation */ -/** - * @} - */ - -/** @defgroup FLASHEx_Voltage_Range FLASH Voltage Range - * @{ - */ -#define FLASH_VOLTAGE_RANGE_1 0x00000000U /*!< Device operating range: 1.8V to 2.1V */ -#define FLASH_VOLTAGE_RANGE_2 0x00000001U /*!< Device operating range: 2.1V to 2.7V */ -#define FLASH_VOLTAGE_RANGE_3 0x00000002U /*!< Device operating range: 2.7V to 3.6V */ -#define FLASH_VOLTAGE_RANGE_4 0x00000003U /*!< Device operating range: 2.7V to 3.6V + External Vpp */ -/** - * @} - */ - -/** @defgroup FLASHEx_WRP_State FLASH WRP State - * @{ - */ -#define OB_WRPSTATE_DISABLE 0x00000000U /*!< Disable the write protection of the desired bank 1 sectors */ -#define OB_WRPSTATE_ENABLE 0x00000001U /*!< Enable the write protection of the desired bank 1 sectors */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Type FLASH Option Type - * @{ - */ -#define OPTIONBYTE_WRP 0x00000001U /*!< WRP option byte configuration */ -#define OPTIONBYTE_RDP 0x00000002U /*!< RDP option byte configuration */ -#define OPTIONBYTE_USER 0x00000004U /*!< USER option byte configuration */ -#define OPTIONBYTE_BOR 0x00000008U /*!< BOR option byte configuration */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_Read_Protection FLASH Option Bytes Read Protection - * @{ - */ -#define OB_RDP_LEVEL_0 ((uint8_t)0xAA) -#define OB_RDP_LEVEL_1 ((uint8_t)0x55) -#define OB_RDP_LEVEL_2 ((uint8_t)0xCC) /*!< Warning: When enabling read protection level 2 - it s no more possible to go back to level 1 or 0 */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_IWatchdog FLASH Option Bytes IWatchdog - * @{ - */ -#define OB_IWDG_SW ((uint8_t)0x20) /*!< Software IWDG selected */ -#define OB_IWDG_HW ((uint8_t)0x00) /*!< Hardware IWDG selected */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_nRST_STOP FLASH Option Bytes nRST_STOP - * @{ - */ -#define OB_STOP_NO_RST ((uint8_t)0x40) /*!< No reset generated when entering in STOP */ -#define OB_STOP_RST ((uint8_t)0x00) /*!< Reset generated when entering in STOP */ -/** - * @} - */ - - -/** @defgroup FLASHEx_Option_Bytes_nRST_STDBY FLASH Option Bytes nRST_STDBY - * @{ - */ -#define OB_STDBY_NO_RST ((uint8_t)0x80) /*!< No reset generated when entering in STANDBY */ -#define OB_STDBY_RST ((uint8_t)0x00) /*!< Reset generated when entering in STANDBY */ -/** - * @} - */ - -/** @defgroup FLASHEx_BOR_Reset_Level FLASH BOR Reset Level - * @{ - */ -#define OB_BOR_LEVEL3 ((uint8_t)0x00) /*!< Supply voltage ranges from 2.70 to 3.60 V */ -#define OB_BOR_LEVEL2 ((uint8_t)0x04) /*!< Supply voltage ranges from 2.40 to 2.70 V */ -#define OB_BOR_LEVEL1 ((uint8_t)0x08) /*!< Supply voltage ranges from 2.10 to 2.40 V */ -#define OB_BOR_OFF ((uint8_t)0x0C) /*!< Supply voltage ranges from 1.62 to 2.10 V */ -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup FLASHEx_PCROP_State FLASH PCROP State - * @{ - */ -#define OB_PCROP_STATE_DISABLE 0x00000000U /*!< Disable PCROP */ -#define OB_PCROP_STATE_ENABLE 0x00000001U /*!< Enable PCROP */ -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/** @defgroup FLASHEx_Advanced_Option_Type FLASH Advanced Option Type - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define OPTIONBYTE_PCROP 0x00000001U /*!< PCROP option byte configuration */ -#define OPTIONBYTE_BOOTCONFIG 0x00000002U /*!< BOOTConfig option byte configuration */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -#define OPTIONBYTE_PCROP 0x00000001U /*!= FLASH_BASE) && ((ADDRESS) <= FLASH_END)) || \ - (((ADDRESS) >= FLASH_OTP_BASE) && ((ADDRESS) <= FLASH_OTP_END))) - -#define IS_FLASH_NBSECTORS(NBSECTORS) (((NBSECTORS) != 0) && ((NBSECTORS) <= FLASH_SECTOR_TOTAL)) - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFF000000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xC */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F401xC) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xC */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_BOOT(BOOT) (((BOOT) == OB_DUAL_BOOT_ENABLE) || ((BOOT) == OB_DUAL_BOOT_DISABLE)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_PCROP_SELECT(PCROP) (((PCROP) == OB_PCROP_SELECTED) || ((PCROP) == OB_PCROP_DESELECTED)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup FLASHEx_Private_Functions FLASH Private Functions - * @{ - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange); -void FLASH_FlushCaches(void); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_FLASH_EX_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h deleted file mode 100644 index 2112e74..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ramfunc.h - * @author MCD Application Team - * @brief Header file of FLASH RAMFUNC driver. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_FLASH_RAMFUNC_H -#define __STM32F4xx_FLASH_RAMFUNC_H - -#ifdef __cplusplus -extern "C" { -#endif -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASH_RAMFUNC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup FLASH_RAMFUNC_Exported_Functions - * @{ - */ - -/** @addtogroup FLASH_RAMFUNC_Exported_Functions_Group1 - * @{ - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_FLASH_RAMFUNC_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h deleted file mode 100644 index 5f3d749..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h +++ /dev/null @@ -1,325 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio.h - * @author MCD Application Team - * @brief Header file of GPIO HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_GPIO_H -#define __STM32F4xx_HAL_GPIO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup GPIO - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Types GPIO Exported Types - * @{ - */ - -/** - * @brief GPIO Init structure definition - */ -typedef struct -{ - uint32_t Pin; /*!< Specifies the GPIO pins to be configured. - This parameter can be any value of @ref GPIO_pins_define */ - - uint32_t Mode; /*!< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref GPIO_mode_define */ - - uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. - This parameter can be a value of @ref GPIO_pull_define */ - - uint32_t Speed; /*!< Specifies the speed for the selected pins. - This parameter can be a value of @ref GPIO_speed_define */ - - uint32_t Alternate; /*!< Peripheral to be connected to the selected pins. - This parameter can be a value of @ref GPIO_Alternate_function_selection */ -}GPIO_InitTypeDef; - -/** - * @brief GPIO Bit SET and Bit RESET enumeration - */ -typedef enum -{ - GPIO_PIN_RESET = 0, - GPIO_PIN_SET -}GPIO_PinState; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup GPIO_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_pins_define GPIO pins define - * @{ - */ -#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */ -#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */ -#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */ -#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */ -#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */ -#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */ -#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */ -#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */ -#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */ -#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */ -#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */ -#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */ -#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */ -#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */ -#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */ -#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */ -#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */ - -#define GPIO_PIN_MASK 0x0000FFFFU /* PIN mask for assert test */ -/** - * @} - */ - -/** @defgroup GPIO_mode_define GPIO mode define - * @brief GPIO Configuration Mode - * Elements values convention: 0x00WX00YZ - * - W : EXTI trigger detection on 3 bits - * - X : EXTI mode (IT or Event) on 2 bits - * - Y : Output type (Push Pull or Open Drain) on 1 bit - * - Z : GPIO mode (Input, Output, Alternate or Analog) on 2 bits - * @{ - */ -#define GPIO_MODE_INPUT MODE_INPUT /*!< Input Floating Mode */ -#define GPIO_MODE_OUTPUT_PP (MODE_OUTPUT | OUTPUT_PP) /*!< Output Push Pull Mode */ -#define GPIO_MODE_OUTPUT_OD (MODE_OUTPUT | OUTPUT_OD) /*!< Output Open Drain Mode */ -#define GPIO_MODE_AF_PP (MODE_AF | OUTPUT_PP) /*!< Alternate Function Push Pull Mode */ -#define GPIO_MODE_AF_OD (MODE_AF | OUTPUT_OD) /*!< Alternate Function Open Drain Mode */ - -#define GPIO_MODE_ANALOG MODE_ANALOG /*!< Analog Mode */ - -#define GPIO_MODE_IT_RISING (MODE_INPUT | EXTI_IT | TRIGGER_RISING) /*!< External Interrupt Mode with Rising edge trigger detection */ -#define GPIO_MODE_IT_FALLING (MODE_INPUT | EXTI_IT | TRIGGER_FALLING) /*!< External Interrupt Mode with Falling edge trigger detection */ -#define GPIO_MODE_IT_RISING_FALLING (MODE_INPUT | EXTI_IT | TRIGGER_RISING | TRIGGER_FALLING) /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ - -#define GPIO_MODE_EVT_RISING (MODE_INPUT | EXTI_EVT | TRIGGER_RISING) /*!< External Event Mode with Rising edge trigger detection */ -#define GPIO_MODE_EVT_FALLING (MODE_INPUT | EXTI_EVT | TRIGGER_FALLING) /*!< External Event Mode with Falling edge trigger detection */ -#define GPIO_MODE_EVT_RISING_FALLING (MODE_INPUT | EXTI_EVT | TRIGGER_RISING | TRIGGER_FALLING) /*!< External Event Mode with Rising/Falling edge trigger detection */ - -/** - * @} - */ - -/** @defgroup GPIO_speed_define GPIO speed define - * @brief GPIO Output Maximum frequency - * @{ - */ -#define GPIO_SPEED_FREQ_LOW 0x00000000U /*!< IO works at 2 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_MEDIUM 0x00000001U /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_HIGH 0x00000002U /*!< range 25 MHz to 100 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_VERY_HIGH 0x00000003U /*!< range 50 MHz to 200 MHz, please refer to the product datasheet */ -/** - * @} - */ - - /** @defgroup GPIO_pull_define GPIO pull define - * @brief GPIO Pull-Up or Pull-Down Activation - * @{ - */ -#define GPIO_NOPULL 0x00000000U /*!< No Pull-up or Pull-down activation */ -#define GPIO_PULLUP 0x00000001U /*!< Pull-up activation */ -#define GPIO_PULLDOWN 0x00000002U /*!< Pull-down activation */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Macros GPIO Exported Macros - * @{ - */ - -/** - * @brief Checks whether the specified EXTI line flag is set or not. - * @param __EXTI_LINE__ specifies the EXTI line flag to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval The new state of __EXTI_LINE__ (SET or RESET). - */ -#define __HAL_GPIO_EXTI_GET_FLAG(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) - -/** - * @brief Clears the EXTI's line pending flags. - * @param __EXTI_LINE__ specifies the EXTI lines flags to clear. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_CLEAR_FLAG(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) - -/** - * @brief Checks whether the specified EXTI line is asserted or not. - * @param __EXTI_LINE__ specifies the EXTI line to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval The new state of __EXTI_LINE__ (SET or RESET). - */ -#define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) - -/** - * @brief Clears the EXTI's line pending bits. - * @param __EXTI_LINE__ specifies the EXTI lines to clear. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) - -/** - * @brief Generates a Software interrupt on selected EXTI line. - * @param __EXTI_LINE__ specifies the EXTI line to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__) (EXTI->SWIER |= (__EXTI_LINE__)) -/** - * @} - */ - -/* Include GPIO HAL Extension module */ -#include "stm32f4xx_hal_gpio_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup GPIO_Exported_Functions - * @{ - */ - -/** @addtogroup GPIO_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); -void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); -/** - * @} - */ - -/** @addtogroup GPIO_Exported_Functions_Group2 - * @{ - */ -/* IO operation functions *****************************************************/ -GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); -void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin); -void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup GPIO_Private_Constants GPIO Private Constants - * @{ - */ -#define GPIO_MODE_Pos 0U -#define GPIO_MODE (0x3UL << GPIO_MODE_Pos) -#define MODE_INPUT (0x0UL << GPIO_MODE_Pos) -#define MODE_OUTPUT (0x1UL << GPIO_MODE_Pos) -#define MODE_AF (0x2UL << GPIO_MODE_Pos) -#define MODE_ANALOG (0x3UL << GPIO_MODE_Pos) -#define OUTPUT_TYPE_Pos 4U -#define OUTPUT_TYPE (0x1UL << OUTPUT_TYPE_Pos) -#define OUTPUT_PP (0x0UL << OUTPUT_TYPE_Pos) -#define OUTPUT_OD (0x1UL << OUTPUT_TYPE_Pos) -#define EXTI_MODE_Pos 16U -#define EXTI_MODE (0x3UL << EXTI_MODE_Pos) -#define EXTI_IT (0x1UL << EXTI_MODE_Pos) -#define EXTI_EVT (0x2UL << EXTI_MODE_Pos) -#define TRIGGER_MODE_Pos 20U -#define TRIGGER_MODE (0x7UL << TRIGGER_MODE_Pos) -#define TRIGGER_RISING (0x1UL << TRIGGER_MODE_Pos) -#define TRIGGER_FALLING (0x2UL << TRIGGER_MODE_Pos) - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup GPIO_Private_Macros GPIO Private Macros - * @{ - */ -#define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(PIN) (((((uint32_t)PIN) & GPIO_PIN_MASK ) != 0x00U) && ((((uint32_t)PIN) & ~GPIO_PIN_MASK) == 0x00U)) -#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ - ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ - ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ - ((MODE) == GPIO_MODE_AF_PP) ||\ - ((MODE) == GPIO_MODE_AF_OD) ||\ - ((MODE) == GPIO_MODE_IT_RISING) ||\ - ((MODE) == GPIO_MODE_IT_FALLING) ||\ - ((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\ - ((MODE) == GPIO_MODE_EVT_RISING) ||\ - ((MODE) == GPIO_MODE_EVT_FALLING) ||\ - ((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||\ - ((MODE) == GPIO_MODE_ANALOG)) -#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_SPEED_FREQ_LOW) || ((SPEED) == GPIO_SPEED_FREQ_MEDIUM) || \ - ((SPEED) == GPIO_SPEED_FREQ_HIGH) || ((SPEED) == GPIO_SPEED_FREQ_VERY_HIGH)) -#define IS_GPIO_PULL(PULL) (((PULL) == GPIO_NOPULL) || ((PULL) == GPIO_PULLUP) || \ - ((PULL) == GPIO_PULLDOWN)) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup GPIO_Private_Functions GPIO Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_GPIO_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h deleted file mode 100644 index 5e0b7cc..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h +++ /dev/null @@ -1,1590 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio_ex.h - * @author MCD Application Team - * @brief Header file of GPIO HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_GPIO_EX_H -#define __STM32F4xx_HAL_GPIO_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup GPIOEx GPIOEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_Alternate_function_selection GPIO Alternate Function Selection - * @{ - */ - -/*------------------------------------------ STM32F429xx/STM32F439xx ---------*/ -#if defined(STM32F429xx) || defined(STM32F439xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -/** @brief GPIO_Legacy - */ -#define GPIO_AF5_I2S3ext GPIO_AF5_SPI3 /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F427xx || STM32F437xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ -#if defined(STM32F407xx) || defined(STM32F417xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F405xx || STM32F415xx */ - -/*----------------------------------------------------------------------------*/ - -/*---------------------------------------- STM32F401xx------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ - - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F401xC || STM32F401xE */ -/*----------------------------------------------------------------------------*/ - -/*--------------- STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-------------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ -#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ -#define GPIO_AF10_FMC ((uint8_t)0x0A) /* FMC Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -/*----------------------------------------------------------------------------*/ - -/*--------------- STM32F413xx/STM32F423xx-------------------------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ -#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ -#define GPIO_AF3_DFSDM2 ((uint8_t)0x03) /* DFSDM2 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF6_DFSDM2 ((uint8_t)0x06) /* DFSDM2 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_SAI1 ((uint8_t)0x07) /* SAI1 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ -#define GPIO_AF7_DFSDM2 ((uint8_t)0x07) /* DFSDM2 Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ -#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_SAI1 ((uint8_t)0x0A) /* SAI1 Alternate Function mapping */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF10_DFSDM2 ((uint8_t)0x0A) /* DFSDM2 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ -#define GPIO_AF10_FSMC ((uint8_t)0x0A) /* FSMC Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_UART4 ((uint8_t)0x0B) /* UART4 Alternate Function mapping */ -#define GPIO_AF11_UART5 ((uint8_t)0x0B) /* UART5 Alternate Function mapping */ -#define GPIO_AF11_UART9 ((uint8_t)0x0B) /* UART9 Alternate Function mapping */ -#define GPIO_AF11_UART10 ((uint8_t)0x0B) /* UART10 Alternate Function mapping */ -#define GPIO_AF11_CAN3 ((uint8_t)0x0B) /* CAN3 Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_RNG ((uint8_t)0x0E) /* RNG Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F413xx || STM32F423xx */ - -/*---------------------------------------- STM32F411xx------------------------*/ -#if defined(STM32F411xE) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F411xE */ - -/*---------------------------------------- STM32F410xx------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#if defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#endif /* STM32F410Cx || STM32F410Rx */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI1 ((uint8_t)0x06) /* SPI1 Alternate Function mapping */ -#if defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#endif /* STM32F410Cx || STM32F410Rx */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/*---------------------------------------- STM32F446xx -----------------------*/ -#if defined(STM32F446xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ -#define GPIO_AF3_CEC ((uint8_t)0x03) /* CEC Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF4_CEC ((uint8_t)0x04) /* CEC Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4 Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_UART5 ((uint8_t)0x07) /* UART5 Alternate Function mapping */ -#define GPIO_AF7_SPI2 ((uint8_t)0x07) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_SPDIFRX ((uint8_t)0x07) /* SPDIFRX Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_SPDIFRX ((uint8_t)0x08) /* SPDIFRX Alternate Function mapping */ -#define GPIO_AF8_SAI2 ((uint8_t)0x08) /* SAI2 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ -#define GPIO_AF10_SAI2 ((uint8_t)0x0A) /* SAI2 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F469xx/STM32F479xx--------------------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ -#define GPIO_AF13_DSI ((uint8_t)0x0D) /* DSI Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ - -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Macros GPIO Exported Macros - * @{ - */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Functions GPIO Exported Functions - * @{ - */ -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Constants GPIO Private Constants - * @{ - */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Macros GPIO Private Macros - * @{ - */ -/** @defgroup GPIOEx_Get_Port_Index GPIO Get Port Index - * @{ - */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U :\ - ((__GPIOx__) == (GPIOH))? 7U : 8U) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U :\ - ((__GPIOx__) == (GPIOH))? 7U :\ - ((__GPIOx__) == (GPIOI))? 8U :\ - ((__GPIOx__) == (GPIOJ))? 9U : 10U) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U : 7U) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U : 7U) -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U : 7U) -#endif /* STM32F446xx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U : 7U) -#endif /* STM32F412Vx */ -#if defined(STM32F412Rx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U : 7U) -#endif /* STM32F412Rx */ -#if defined(STM32F412Cx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U : 7U) -#endif /* STM32F412Cx */ - -/** - * @} - */ - -/** @defgroup GPIOEx_IS_Alternat_function_selection GPIO Check Alternate Function - * @{ - */ -/*------------------------- STM32F429xx/STM32F439xx---------------------------*/ -#if defined(STM32F429xx) || defined(STM32F439xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF14_LTDC)) - -#endif /* STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1)) - -#endif /* STM32F427xx || STM32F437xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ -#if defined(STM32F407xx) || defined(STM32F417xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF12_OTG_HS_FS) || ((AF) == GPIO_AF12_SDIO) || \ - ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F405xx || STM32F415xx */ - -/*----------------------------------------------------------------------------*/ - -/*---------------------------------------- STM32F401xx------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF12_SDIO) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM9) || \ - ((AF) == GPIO_AF3_TIM10) || ((AF) == GPIO_AF3_TIM11) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF7_USART1) || \ - ((AF) == GPIO_AF7_USART2) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF15_EVENTOUT)) -#endif /* STM32F401xC || STM32F401xE */ -/*----------------------------------------------------------------------------*/ -/*---------------------------------------- STM32F410xx------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_GPIO_AF(AF) (((AF) < 10U) || ((AF) == 15U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/*---------------------------------------- STM32F411xx------------------------*/ -#if defined(STM32F411xE) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF4_I2C1) || \ - ((AF) == GPIO_AF4_I2C2) || ((AF) == GPIO_AF4_I2C3) || \ - ((AF) == GPIO_AF5_SPI1) || ((AF) == GPIO_AF5_SPI2) || \ - ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI4) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF6_SPI5) || ((AF) == GPIO_AF7_SPI3) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF8_USART6) || ((AF) == GPIO_AF10_OTG_FS) || \ - ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F411xE */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------------------------- STM32F446xx ----------------*/ -#if defined(STM32F446xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF3_CEC) || ((AF) == GPIO_AF4_CEC) || \ - ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI2) || \ - ((AF) == GPIO_AF6_SPI4) || ((AF) == GPIO_AF7_UART5) || \ - ((AF) == GPIO_AF7_SPI2) || ((AF) == GPIO_AF7_SPI3) || \ - ((AF) == GPIO_AF7_SPDIFRX) || ((AF) == GPIO_AF8_SPDIFRX) || \ - ((AF) == GPIO_AF8_SAI2) || ((AF) == GPIO_AF9_QSPI) || \ - ((AF) == GPIO_AF10_SAI2) || ((AF) == GPIO_AF10_QSPI)) - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------------------- STM32F469xx/STM32F479xx --------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF14_LTDC) || ((AF) == GPIO_AF13_DSI) || \ - ((AF) == GPIO_AF9_QSPI) || ((AF) == GPIO_AF10_QSPI)) - -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-----------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 11U) && ((AF) != 14U) && ((AF) != 13U)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/*----------------------------------------------------------------------------*/ - -/*------------------STM32F413xx/STM32F423xx-----------------------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 13U)) -#endif /* STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Functions GPIO Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_GPIO_EX_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h deleted file mode 100644 index 9a7a67e..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h +++ /dev/null @@ -1,741 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_i2c.h - * @author MCD Application Team - * @brief Header file of I2C HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_I2C_H -#define __STM32F4xx_HAL_I2C_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup I2C - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup I2C_Exported_Types I2C Exported Types - * @{ - */ - -/** @defgroup I2C_Configuration_Structure_definition I2C Configuration Structure definition - * @brief I2C Configuration Structure definition - * @{ - */ -typedef struct -{ - uint32_t ClockSpeed; /*!< Specifies the clock frequency. - This parameter must be set to a value lower than 400kHz */ - - uint32_t DutyCycle; /*!< Specifies the I2C fast mode duty cycle. - This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */ - - uint32_t OwnAddress1; /*!< Specifies the first device own address. - This parameter can be a 7-bit or 10-bit address. */ - - uint32_t AddressingMode; /*!< Specifies if 7-bit or 10-bit addressing mode is selected. - This parameter can be a value of @ref I2C_addressing_mode */ - - uint32_t DualAddressMode; /*!< Specifies if dual addressing mode is selected. - This parameter can be a value of @ref I2C_dual_addressing_mode */ - - uint32_t OwnAddress2; /*!< Specifies the second device own address if dual addressing mode is selected - This parameter can be a 7-bit address. */ - - uint32_t GeneralCallMode; /*!< Specifies if general call mode is selected. - This parameter can be a value of @ref I2C_general_call_addressing_mode */ - - uint32_t NoStretchMode; /*!< Specifies if nostretch mode is selected. - This parameter can be a value of @ref I2C_nostretch_mode */ - -} I2C_InitTypeDef; - -/** - * @} - */ - -/** @defgroup HAL_state_structure_definition HAL state structure definition - * @brief HAL State structure definition - * @note HAL I2C State value coding follow below described bitmap : - * b7-b6 Error information - * 00 : No Error - * 01 : Abort (Abort user request on going) - * 10 : Timeout - * 11 : Error - * b5 Peripheral initialization status - * 0 : Reset (Peripheral not initialized) - * 1 : Init done (Peripheral initialized and ready to use. HAL I2C Init function called) - * b4 (not used) - * x : Should be set to 0 - * b3 - * 0 : Ready or Busy (No Listen mode ongoing) - * 1 : Listen (Peripheral in Address Listen Mode) - * b2 Intrinsic process state - * 0 : Ready - * 1 : Busy (Peripheral busy with some configuration or internal operations) - * b1 Rx state - * 0 : Ready (no Rx operation ongoing) - * 1 : Busy (Rx operation ongoing) - * b0 Tx state - * 0 : Ready (no Tx operation ongoing) - * 1 : Busy (Tx operation ongoing) - * @{ - */ -typedef enum -{ - HAL_I2C_STATE_RESET = 0x00U, /*!< Peripheral is not yet Initialized */ - HAL_I2C_STATE_READY = 0x20U, /*!< Peripheral Initialized and ready for use */ - HAL_I2C_STATE_BUSY = 0x24U, /*!< An internal process is ongoing */ - HAL_I2C_STATE_BUSY_TX = 0x21U, /*!< Data Transmission process is ongoing */ - HAL_I2C_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing */ - HAL_I2C_STATE_LISTEN = 0x28U, /*!< Address Listen Mode is ongoing */ - HAL_I2C_STATE_BUSY_TX_LISTEN = 0x29U, /*!< Address Listen Mode and Data Transmission - process is ongoing */ - HAL_I2C_STATE_BUSY_RX_LISTEN = 0x2AU, /*!< Address Listen Mode and Data Reception - process is ongoing */ - HAL_I2C_STATE_ABORT = 0x60U, /*!< Abort user request ongoing */ - HAL_I2C_STATE_TIMEOUT = 0xA0U, /*!< Timeout state */ - HAL_I2C_STATE_ERROR = 0xE0U /*!< Error */ - -} HAL_I2C_StateTypeDef; - -/** - * @} - */ - -/** @defgroup HAL_mode_structure_definition HAL mode structure definition - * @brief HAL Mode structure definition - * @note HAL I2C Mode value coding follow below described bitmap :\n - * b7 (not used)\n - * x : Should be set to 0\n - * b6\n - * 0 : None\n - * 1 : Memory (HAL I2C communication is in Memory Mode)\n - * b5\n - * 0 : None\n - * 1 : Slave (HAL I2C communication is in Slave Mode)\n - * b4\n - * 0 : None\n - * 1 : Master (HAL I2C communication is in Master Mode)\n - * b3-b2-b1-b0 (not used)\n - * xxxx : Should be set to 0000 - * @{ - */ -typedef enum -{ - HAL_I2C_MODE_NONE = 0x00U, /*!< No I2C communication on going */ - HAL_I2C_MODE_MASTER = 0x10U, /*!< I2C communication is in Master Mode */ - HAL_I2C_MODE_SLAVE = 0x20U, /*!< I2C communication is in Slave Mode */ - HAL_I2C_MODE_MEM = 0x40U /*!< I2C communication is in Memory Mode */ - -} HAL_I2C_ModeTypeDef; - -/** - * @} - */ - -/** @defgroup I2C_Error_Code_definition I2C Error Code definition - * @brief I2C Error Code definition - * @{ - */ -#define HAL_I2C_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_I2C_ERROR_BERR 0x00000001U /*!< BERR error */ -#define HAL_I2C_ERROR_ARLO 0x00000002U /*!< ARLO error */ -#define HAL_I2C_ERROR_AF 0x00000004U /*!< AF error */ -#define HAL_I2C_ERROR_OVR 0x00000008U /*!< OVR error */ -#define HAL_I2C_ERROR_DMA 0x00000010U /*!< DMA transfer error */ -#define HAL_I2C_ERROR_TIMEOUT 0x00000020U /*!< Timeout Error */ -#define HAL_I2C_ERROR_SIZE 0x00000040U /*!< Size Management error */ -#define HAL_I2C_ERROR_DMA_PARAM 0x00000080U /*!< DMA Parameter Error */ -#define HAL_I2C_WRONG_START 0x00000200U /*!< Wrong start Error */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -#define HAL_I2C_ERROR_INVALID_CALLBACK 0x00000100U /*!< Invalid Callback error */ -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup I2C_handle_Structure_definition I2C handle Structure definition - * @brief I2C handle Structure definition - * @{ - */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -typedef struct __I2C_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -{ - I2C_TypeDef *Instance; /*!< I2C registers base address */ - - I2C_InitTypeDef Init; /*!< I2C communication parameters */ - - uint8_t *pBuffPtr; /*!< Pointer to I2C transfer buffer */ - - uint16_t XferSize; /*!< I2C transfer size */ - - __IO uint16_t XferCount; /*!< I2C transfer counter */ - - __IO uint32_t XferOptions; /*!< I2C transfer options */ - - __IO uint32_t PreviousState; /*!< I2C communication Previous state and mode - context for internal usage */ - - DMA_HandleTypeDef *hdmatx; /*!< I2C Tx DMA handle parameters */ - - DMA_HandleTypeDef *hdmarx; /*!< I2C Rx DMA handle parameters */ - - HAL_LockTypeDef Lock; /*!< I2C locking object */ - - __IO HAL_I2C_StateTypeDef State; /*!< I2C communication state */ - - __IO HAL_I2C_ModeTypeDef Mode; /*!< I2C communication mode */ - - __IO uint32_t ErrorCode; /*!< I2C Error code */ - - __IO uint32_t Devaddress; /*!< I2C Target device address */ - - __IO uint32_t Memaddress; /*!< I2C Target memory address */ - - __IO uint32_t MemaddSize; /*!< I2C Target memory address size */ - - __IO uint32_t EventCount; /*!< I2C Event counter */ - - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Master Tx Transfer completed callback */ - void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Master Rx Transfer completed callback */ - void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Slave Tx Transfer completed callback */ - void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Slave Rx Transfer completed callback */ - void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Listen Complete callback */ - void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Memory Tx Transfer completed callback */ - void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Memory Rx Transfer completed callback */ - void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Error callback */ - void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Abort callback */ - - void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< I2C Slave Address Match callback */ - - void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Msp Init callback */ - void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Msp DeInit callback */ - -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -} I2C_HandleTypeDef; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -/** - * @brief HAL I2C Callback ID enumeration definition - */ -typedef enum -{ - HAL_I2C_MASTER_TX_COMPLETE_CB_ID = 0x00U, /*!< I2C Master Tx Transfer completed callback ID */ - HAL_I2C_MASTER_RX_COMPLETE_CB_ID = 0x01U, /*!< I2C Master Rx Transfer completed callback ID */ - HAL_I2C_SLAVE_TX_COMPLETE_CB_ID = 0x02U, /*!< I2C Slave Tx Transfer completed callback ID */ - HAL_I2C_SLAVE_RX_COMPLETE_CB_ID = 0x03U, /*!< I2C Slave Rx Transfer completed callback ID */ - HAL_I2C_LISTEN_COMPLETE_CB_ID = 0x04U, /*!< I2C Listen Complete callback ID */ - HAL_I2C_MEM_TX_COMPLETE_CB_ID = 0x05U, /*!< I2C Memory Tx Transfer callback ID */ - HAL_I2C_MEM_RX_COMPLETE_CB_ID = 0x06U, /*!< I2C Memory Rx Transfer completed callback ID */ - HAL_I2C_ERROR_CB_ID = 0x07U, /*!< I2C Error callback ID */ - HAL_I2C_ABORT_CB_ID = 0x08U, /*!< I2C Abort callback ID */ - - HAL_I2C_MSPINIT_CB_ID = 0x09U, /*!< I2C Msp Init callback ID */ - HAL_I2C_MSPDEINIT_CB_ID = 0x0AU /*!< I2C Msp DeInit callback ID */ - -} HAL_I2C_CallbackIDTypeDef; - -/** - * @brief HAL I2C Callback pointer definition - */ -typedef void (*pI2C_CallbackTypeDef)(I2C_HandleTypeDef *hi2c); /*!< pointer to an I2C callback function */ -typedef void (*pI2C_AddrCallbackTypeDef)(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< pointer to an I2C Address Match callback function */ - -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** - * @} - */ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup I2C_Exported_Constants I2C Exported Constants - * @{ - */ - -/** @defgroup I2C_duty_cycle_in_fast_mode I2C duty cycle in fast mode - * @{ - */ -#define I2C_DUTYCYCLE_2 0x00000000U -#define I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY -/** - * @} - */ - -/** @defgroup I2C_addressing_mode I2C addressing mode - * @{ - */ -#define I2C_ADDRESSINGMODE_7BIT 0x00004000U -#define I2C_ADDRESSINGMODE_10BIT (I2C_OAR1_ADDMODE | 0x00004000U) -/** - * @} - */ - -/** @defgroup I2C_dual_addressing_mode I2C dual addressing mode - * @{ - */ -#define I2C_DUALADDRESS_DISABLE 0x00000000U -#define I2C_DUALADDRESS_ENABLE I2C_OAR2_ENDUAL -/** - * @} - */ - -/** @defgroup I2C_general_call_addressing_mode I2C general call addressing mode - * @{ - */ -#define I2C_GENERALCALL_DISABLE 0x00000000U -#define I2C_GENERALCALL_ENABLE I2C_CR1_ENGC -/** - * @} - */ - -/** @defgroup I2C_nostretch_mode I2C nostretch mode - * @{ - */ -#define I2C_NOSTRETCH_DISABLE 0x00000000U -#define I2C_NOSTRETCH_ENABLE I2C_CR1_NOSTRETCH -/** - * @} - */ - -/** @defgroup I2C_Memory_Address_Size I2C Memory Address Size - * @{ - */ -#define I2C_MEMADD_SIZE_8BIT 0x00000001U -#define I2C_MEMADD_SIZE_16BIT 0x00000010U -/** - * @} - */ - -/** @defgroup I2C_XferDirection_definition I2C XferDirection definition - * @{ - */ -#define I2C_DIRECTION_RECEIVE 0x00000000U -#define I2C_DIRECTION_TRANSMIT 0x00000001U -/** - * @} - */ - -/** @defgroup I2C_XferOptions_definition I2C XferOptions definition - * @{ - */ -#define I2C_FIRST_FRAME 0x00000001U -#define I2C_FIRST_AND_NEXT_FRAME 0x00000002U -#define I2C_NEXT_FRAME 0x00000004U -#define I2C_FIRST_AND_LAST_FRAME 0x00000008U -#define I2C_LAST_FRAME_NO_STOP 0x00000010U -#define I2C_LAST_FRAME 0x00000020U - -/* List of XferOptions in usage of : - * 1- Restart condition in all use cases (direction change or not) - */ -#define I2C_OTHER_FRAME (0x00AA0000U) -#define I2C_OTHER_AND_LAST_FRAME (0xAA000000U) -/** - * @} - */ - -/** @defgroup I2C_Interrupt_configuration_definition I2C Interrupt configuration definition - * @brief I2C Interrupt definition - * Elements values convention: 0xXXXXXXXX - * - XXXXXXXX : Interrupt control mask - * @{ - */ -#define I2C_IT_BUF I2C_CR2_ITBUFEN -#define I2C_IT_EVT I2C_CR2_ITEVTEN -#define I2C_IT_ERR I2C_CR2_ITERREN -/** - * @} - */ - -/** @defgroup I2C_Flag_definition I2C Flag definition - * @{ - */ - -#define I2C_FLAG_OVR 0x00010800U -#define I2C_FLAG_AF 0x00010400U -#define I2C_FLAG_ARLO 0x00010200U -#define I2C_FLAG_BERR 0x00010100U -#define I2C_FLAG_TXE 0x00010080U -#define I2C_FLAG_RXNE 0x00010040U -#define I2C_FLAG_STOPF 0x00010010U -#define I2C_FLAG_ADD10 0x00010008U -#define I2C_FLAG_BTF 0x00010004U -#define I2C_FLAG_ADDR 0x00010002U -#define I2C_FLAG_SB 0x00010001U -#define I2C_FLAG_DUALF 0x00100080U -#define I2C_FLAG_GENCALL 0x00100010U -#define I2C_FLAG_TRA 0x00100004U -#define I2C_FLAG_BUSY 0x00100002U -#define I2C_FLAG_MSL 0x00100001U -/** - * @} - */ - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ - -/** @defgroup I2C_Exported_Macros I2C Exported Macros - * @{ - */ - -/** @brief Reset I2C handle state. - * @param __HANDLE__ specifies the I2C Handle. - * @retval None - */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) do{ \ - (__HANDLE__)->State = HAL_I2C_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_I2C_STATE_RESET) -#endif - -/** @brief Enable or disable the specified I2C interrupts. - * @param __HANDLE__ specifies the I2C Handle. - * @param __INTERRUPT__ specifies the interrupt source to enable or disable. - * This parameter can be one of the following values: - * @arg I2C_IT_BUF: Buffer interrupt enable - * @arg I2C_IT_EVT: Event interrupt enable - * @arg I2C_IT_ERR: Error interrupt enable - * @retval None - */ -#define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BIT((__HANDLE__)->Instance->CR2,(__INTERRUPT__)) -#define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__) CLEAR_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__)) - -/** @brief Checks if the specified I2C interrupt source is enabled or disabled. - * @param __HANDLE__ specifies the I2C Handle. - * @param __INTERRUPT__ specifies the I2C interrupt source to check. - * This parameter can be one of the following values: - * @arg I2C_IT_BUF: Buffer interrupt enable - * @arg I2C_IT_EVT: Event interrupt enable - * @arg I2C_IT_ERR: Error interrupt enable - * @retval The new state of __INTERRUPT__ (TRUE or FALSE). - */ -#define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) - -/** @brief Checks whether the specified I2C flag is set or not. - * @param __HANDLE__ specifies the I2C Handle. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg I2C_FLAG_OVR: Overrun/Underrun flag - * @arg I2C_FLAG_AF: Acknowledge failure flag - * @arg I2C_FLAG_ARLO: Arbitration lost flag - * @arg I2C_FLAG_BERR: Bus error flag - * @arg I2C_FLAG_TXE: Data register empty flag - * @arg I2C_FLAG_RXNE: Data register not empty flag - * @arg I2C_FLAG_STOPF: Stop detection flag - * @arg I2C_FLAG_ADD10: 10-bit header sent flag - * @arg I2C_FLAG_BTF: Byte transfer finished flag - * @arg I2C_FLAG_ADDR: Address sent flag - * Address matched flag - * @arg I2C_FLAG_SB: Start bit flag - * @arg I2C_FLAG_DUALF: Dual flag - * @arg I2C_FLAG_GENCALL: General call header flag - * @arg I2C_FLAG_TRA: Transmitter/Receiver flag - * @arg I2C_FLAG_BUSY: Bus busy flag - * @arg I2C_FLAG_MSL: Master/Slave flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) ((((uint8_t)((__FLAG__) >> 16U)) == 0x01U) ? \ - (((((__HANDLE__)->Instance->SR1) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET) : \ - (((((__HANDLE__)->Instance->SR2) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET)) - -/** @brief Clears the I2C pending flags which are cleared by writing 0 in a specific bit. - * @param __HANDLE__ specifies the I2C Handle. - * @param __FLAG__ specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) - * @arg I2C_FLAG_AF: Acknowledge failure flag - * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) - * @arg I2C_FLAG_BERR: Bus error flag - * @retval None - */ -#define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR1 = ~((__FLAG__) & I2C_FLAG_MASK)) - -/** @brief Clears the I2C ADDR pending flag. - * @param __HANDLE__ specifies the I2C Handle. - * This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral. - * @retval None - */ -#define __HAL_I2C_CLEAR_ADDRFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg = 0x00U; \ - tmpreg = (__HANDLE__)->Instance->SR1; \ - tmpreg = (__HANDLE__)->Instance->SR2; \ - UNUSED(tmpreg); \ - } while(0) - -/** @brief Clears the I2C STOPF pending flag. - * @param __HANDLE__ specifies the I2C Handle. - * @retval None - */ -#define __HAL_I2C_CLEAR_STOPFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg = 0x00U; \ - tmpreg = (__HANDLE__)->Instance->SR1; \ - SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE); \ - UNUSED(tmpreg); \ - } while(0) - -/** @brief Enable the specified I2C peripheral. - * @param __HANDLE__ specifies the I2C Handle. - * @retval None - */ -#define __HAL_I2C_ENABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE) - -/** @brief Disable the specified I2C peripheral. - * @param __HANDLE__ specifies the I2C Handle. - * @retval None - */ -#define __HAL_I2C_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE) - -/** - * @} - */ - -/* Include I2C HAL Extension module */ -#include "stm32f4xx_hal_i2c_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup I2C_Exported_Functions - * @{ - */ - -/** @addtogroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -/* Initialization and de-initialization functions******************************/ -HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c); -HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID); - -HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @addtogroup I2C_Exported_Functions_Group2 Input and Output operation functions - * @{ - */ -/* IO operation functions ****************************************************/ -/******* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout); - -/******* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); - -HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c); -HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c); -HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress); - -/******* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); - -HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -/** - * @} - */ - -/** @addtogroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @{ - */ -/******* I2C IRQHandler and Callbacks used in non blocking modes (Interrupt and DMA) */ -void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c); -void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); -void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c); -/** - * @} - */ - -/** @addtogroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions - * @{ - */ -/* Peripheral State, Mode and Error functions *********************************/ -HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c); -HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c); -uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c); - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup I2C_Private_Constants I2C Private Constants - * @{ - */ -#define I2C_FLAG_MASK 0x0000FFFFU -#define I2C_MIN_PCLK_FREQ_STANDARD 2000000U /*!< 2 MHz */ -#define I2C_MIN_PCLK_FREQ_FAST 4000000U /*!< 4 MHz */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup I2C_Private_Macros I2C Private Macros - * @{ - */ - -#define I2C_MIN_PCLK_FREQ(__PCLK__, __SPEED__) (((__SPEED__) <= 100000U) ? ((__PCLK__) < I2C_MIN_PCLK_FREQ_STANDARD) : ((__PCLK__) < I2C_MIN_PCLK_FREQ_FAST)) -#define I2C_CCR_CALCULATION(__PCLK__, __SPEED__, __COEFF__) (((((__PCLK__) - 1U)/((__SPEED__) * (__COEFF__))) + 1U) & I2C_CCR_CCR) -#define I2C_FREQRANGE(__PCLK__) ((__PCLK__)/1000000U) -#define I2C_RISE_TIME(__FREQRANGE__, __SPEED__) (((__SPEED__) <= 100000U) ? ((__FREQRANGE__) + 1U) : ((((__FREQRANGE__) * 300U) / 1000U) + 1U)) -#define I2C_SPEED_STANDARD(__PCLK__, __SPEED__) ((I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U) < 4U)? 4U:I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U)) -#define I2C_SPEED_FAST(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__DUTYCYCLE__) == I2C_DUTYCYCLE_2)? I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 3U) : (I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 25U) | I2C_DUTYCYCLE_16_9)) -#define I2C_SPEED(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__SPEED__) <= 100000U)? (I2C_SPEED_STANDARD((__PCLK__), (__SPEED__))) : \ - ((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__)) & I2C_CCR_CCR) == 0U)? 1U : \ - ((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__))) | I2C_CCR_FS)) - -#define I2C_7BIT_ADD_WRITE(__ADDRESS__) ((uint8_t)((__ADDRESS__) & (uint8_t)(~I2C_OAR1_ADD0))) -#define I2C_7BIT_ADD_READ(__ADDRESS__) ((uint8_t)((__ADDRESS__) | I2C_OAR1_ADD0)) - -#define I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF))) -#define I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)0x00F0))) -#define I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)(0x00F1)))) - -#define I2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0xFF00)) >> 8))) -#define I2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF))) - -/** @defgroup I2C_IS_RTC_Definitions I2C Private macros to check input parameters - * @{ - */ -#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DUTYCYCLE_2) || \ - ((CYCLE) == I2C_DUTYCYCLE_16_9)) -#define IS_I2C_ADDRESSING_MODE(ADDRESS) (((ADDRESS) == I2C_ADDRESSINGMODE_7BIT) || \ - ((ADDRESS) == I2C_ADDRESSINGMODE_10BIT)) -#define IS_I2C_DUAL_ADDRESS(ADDRESS) (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \ - ((ADDRESS) == I2C_DUALADDRESS_ENABLE)) -#define IS_I2C_GENERAL_CALL(CALL) (((CALL) == I2C_GENERALCALL_DISABLE) || \ - ((CALL) == I2C_GENERALCALL_ENABLE)) -#define IS_I2C_NO_STRETCH(STRETCH) (((STRETCH) == I2C_NOSTRETCH_DISABLE) || \ - ((STRETCH) == I2C_NOSTRETCH_ENABLE)) -#define IS_I2C_MEMADD_SIZE(SIZE) (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \ - ((SIZE) == I2C_MEMADD_SIZE_16BIT)) -#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) > 0U) && ((SPEED) <= 400000U)) -#define IS_I2C_OWN_ADDRESS1(ADDRESS1) (((ADDRESS1) & 0xFFFFFC00U) == 0U) -#define IS_I2C_OWN_ADDRESS2(ADDRESS2) (((ADDRESS2) & 0xFFFFFF01U) == 0U) -#define IS_I2C_TRANSFER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_FIRST_FRAME) || \ - ((REQUEST) == I2C_FIRST_AND_NEXT_FRAME) || \ - ((REQUEST) == I2C_NEXT_FRAME) || \ - ((REQUEST) == I2C_FIRST_AND_LAST_FRAME) || \ - ((REQUEST) == I2C_LAST_FRAME) || \ - ((REQUEST) == I2C_LAST_FRAME_NO_STOP) || \ - IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST)) - -#define IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_OTHER_FRAME) || \ - ((REQUEST) == I2C_OTHER_AND_LAST_FRAME)) - -#define I2C_CHECK_FLAG(__ISR__, __FLAG__) ((((__ISR__) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET) -#define I2C_CHECK_IT_SOURCE(__CR1__, __IT__) ((((__CR1__) & (__IT__)) == (__IT__)) ? SET : RESET) -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup I2C_Private_Functions I2C Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_HAL_I2C_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h deleted file mode 100644 index 31ad99c..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h +++ /dev/null @@ -1,115 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_i2c_ex.h - * @author MCD Application Team - * @brief Header file of I2C HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_I2C_EX_H -#define __STM32F4xx_HAL_I2C_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup I2CEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2CEx_Exported_Constants I2C Exported Constants - * @{ - */ - -/** @defgroup I2CEx_Analog_Filter I2C Analog Filter - * @{ - */ -#define I2C_ANALOGFILTER_ENABLE 0x00000000U -#define I2C_ANALOGFILTER_DISABLE I2C_FLTR_ANOFF -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup I2CEx_Exported_Functions - * @{ - */ - -/** @addtogroup I2CEx_Exported_Functions_Group1 - * @{ - */ -/* Peripheral Control functions ************************************************/ -HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t AnalogFilter); -HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup I2CEx_Private_Constants I2C Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup I2CEx_Private_Macros I2C Private Macros - * @{ - */ -#define IS_I2C_ANALOG_FILTER(FILTER) (((FILTER) == I2C_ANALOGFILTER_ENABLE) || \ - ((FILTER) == I2C_ANALOGFILTER_DISABLE)) -#define IS_I2C_DIGITAL_FILTER(FILTER) ((FILTER) <= 0x0000000FU) -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_I2C_EX_H */ - - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h deleted file mode 100644 index de1ec24..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h +++ /dev/null @@ -1,461 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pcd.h - * @author MCD Application Team - * @brief Header file of PCD HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_PCD_H -#define STM32F4xx_HAL_PCD_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_ll_usb.h" - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PCD - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup PCD_Exported_Types PCD Exported Types - * @{ - */ - -/** - * @brief PCD State structure definition - */ -typedef enum -{ - HAL_PCD_STATE_RESET = 0x00, - HAL_PCD_STATE_READY = 0x01, - HAL_PCD_STATE_ERROR = 0x02, - HAL_PCD_STATE_BUSY = 0x03, - HAL_PCD_STATE_TIMEOUT = 0x04 -} PCD_StateTypeDef; - -/* Device LPM suspend state */ -typedef enum -{ - LPM_L0 = 0x00, /* on */ - LPM_L1 = 0x01, /* LPM L1 sleep */ - LPM_L2 = 0x02, /* suspend */ - LPM_L3 = 0x03, /* off */ -} PCD_LPM_StateTypeDef; - -typedef enum -{ - PCD_LPM_L0_ACTIVE = 0x00, /* on */ - PCD_LPM_L1_ACTIVE = 0x01, /* LPM L1 sleep */ -} PCD_LPM_MsgTypeDef; - -typedef enum -{ - PCD_BCD_ERROR = 0xFF, - PCD_BCD_CONTACT_DETECTION = 0xFE, - PCD_BCD_STD_DOWNSTREAM_PORT = 0xFD, - PCD_BCD_CHARGING_DOWNSTREAM_PORT = 0xFC, - PCD_BCD_DEDICATED_CHARGING_PORT = 0xFB, - PCD_BCD_DISCOVERY_COMPLETED = 0x00, - -} PCD_BCD_MsgTypeDef; - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -typedef USB_OTG_GlobalTypeDef PCD_TypeDef; -typedef USB_OTG_CfgTypeDef PCD_InitTypeDef; -typedef USB_OTG_EPTypeDef PCD_EPTypeDef; -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -/** - * @brief PCD Handle Structure definition - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -typedef struct __PCD_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - PCD_TypeDef *Instance; /*!< Register base address */ - PCD_InitTypeDef Init; /*!< PCD required parameters */ - __IO uint8_t USB_Address; /*!< USB Address */ - PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ - PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ - HAL_LockTypeDef Lock; /*!< PCD peripheral status */ - __IO PCD_StateTypeDef State; /*!< PCD communication state */ - __IO uint32_t ErrorCode; /*!< PCD Error code */ - uint32_t Setup[12]; /*!< Setup packet buffer */ - PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ - uint32_t BESL; - uint32_t FrameNumber; /*!< Store Current Frame number */ - - - uint32_t lpm_active; /*!< Enable or disable the Link Power Management . - This parameter can be set to ENABLE or DISABLE */ - - uint32_t battery_charging_active; /*!< Enable or disable Battery charging. - This parameter can be set to ENABLE or DISABLE */ - void *pData; /*!< Pointer to upper stack Handler */ - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - void (* SOFCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD SOF callback */ - void (* SetupStageCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Setup Stage callback */ - void (* ResetCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Reset callback */ - void (* SuspendCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Suspend callback */ - void (* ResumeCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Resume callback */ - void (* ConnectCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Connect callback */ - void (* DisconnectCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Disconnect callback */ - - void (* DataOutStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD Data OUT Stage callback */ - void (* DataInStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD Data IN Stage callback */ - void (* ISOOUTIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD ISO OUT Incomplete callback */ - void (* ISOINIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD ISO IN Incomplete callback */ - void (* BCDCallback)(struct __PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg); /*!< USB OTG PCD BCD callback */ - void (* LPMCallback)(struct __PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); /*!< USB OTG PCD LPM callback */ - - void (* MspInitCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Msp Init callback */ - void (* MspDeInitCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Msp DeInit callback */ -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -} PCD_HandleTypeDef; - -/** - * @} - */ - -/* Include PCD HAL Extended module */ -#include "stm32f4xx_hal_pcd_ex.h" - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PCD_Exported_Constants PCD Exported Constants - * @{ - */ - -/** @defgroup PCD_Speed PCD Speed - * @{ - */ -#define PCD_SPEED_HIGH USBD_HS_SPEED -#define PCD_SPEED_HIGH_IN_FULL USBD_HSINFS_SPEED -#define PCD_SPEED_FULL USBD_FS_SPEED -/** - * @} - */ - -/** @defgroup PCD_PHY_Module PCD PHY Module - * @{ - */ -#define PCD_PHY_ULPI 1U -#define PCD_PHY_EMBEDDED 2U -#define PCD_PHY_UTMI 3U -/** - * @} - */ - -/** @defgroup PCD_Error_Code_definition PCD Error Code definition - * @brief PCD Error Code definition - * @{ - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -#define HAL_PCD_ERROR_INVALID_CALLBACK (0x00000010U) /*!< Invalid Callback error */ -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup PCD_Exported_Macros PCD Exported Macros - * @brief macros to handle interrupts and specific clock configurations - * @{ - */ -#define __HAL_PCD_ENABLE(__HANDLE__) (void)USB_EnableGlobalInt ((__HANDLE__)->Instance) -#define __HAL_PCD_DISABLE(__HANDLE__) (void)USB_DisableGlobalInt ((__HANDLE__)->Instance) - -#define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__) \ - ((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__)) - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->GINTSTS) &= (__INTERRUPT__)) -#define __HAL_PCD_IS_INVALID_INTERRUPT(__HANDLE__) (USB_ReadInterrupts((__HANDLE__)->Instance) == 0U) - -#define __HAL_PCD_UNGATE_PHYCLOCK(__HANDLE__) \ - *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) &= ~(USB_OTG_PCGCCTL_STOPCLK) - -#define __HAL_PCD_GATE_PHYCLOCK(__HANDLE__) \ - *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) |= USB_OTG_PCGCCTL_STOPCLK - -#define __HAL_PCD_IS_PHY_SUSPENDED(__HANDLE__) \ - ((*(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE)) & 0x10U) - -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= (USB_OTG_HS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_HS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = (USB_OTG_HS_WAKEUP_EXTI_LINE) - -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ - do { \ - EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE); \ - EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE; \ - } while(0U) -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= USB_OTG_FS_WAKEUP_EXTI_LINE -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_FS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = USB_OTG_FS_WAKEUP_EXTI_LINE - -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ - do { \ - EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE); \ - EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE; \ - } while(0U) -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PCD_Exported_Functions PCD Exported Functions - * @{ - */ - -/* Initialization/de-initialization functions ********************************/ -/** @addtogroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd); -void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd); -void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd); - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -/** @defgroup HAL_PCD_Callback_ID_enumeration_definition HAL USB OTG PCD Callback ID enumeration definition - * @brief HAL USB OTG PCD Callback ID enumeration definition - * @{ - */ -typedef enum -{ - HAL_PCD_SOF_CB_ID = 0x01, /*!< USB PCD SOF callback ID */ - HAL_PCD_SETUPSTAGE_CB_ID = 0x02, /*!< USB PCD Setup Stage callback ID */ - HAL_PCD_RESET_CB_ID = 0x03, /*!< USB PCD Reset callback ID */ - HAL_PCD_SUSPEND_CB_ID = 0x04, /*!< USB PCD Suspend callback ID */ - HAL_PCD_RESUME_CB_ID = 0x05, /*!< USB PCD Resume callback ID */ - HAL_PCD_CONNECT_CB_ID = 0x06, /*!< USB PCD Connect callback ID */ - HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ - - HAL_PCD_MSPINIT_CB_ID = 0x08, /*!< USB PCD MspInit callback ID */ - HAL_PCD_MSPDEINIT_CB_ID = 0x09 /*!< USB PCD MspDeInit callback ID */ - -} HAL_PCD_CallbackIDTypeDef; -/** - * @} - */ - -/** @defgroup HAL_PCD_Callback_pointer_definition HAL USB OTG PCD Callback pointer definition - * @brief HAL USB OTG PCD Callback pointer definition - * @{ - */ - -typedef void (*pPCD_CallbackTypeDef)(PCD_HandleTypeDef *hpcd); /*!< pointer to a common USB OTG PCD callback function */ -typedef void (*pPCD_DataOutStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD Data OUT Stage callback */ -typedef void (*pPCD_DataInStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD Data IN Stage callback */ -typedef void (*pPCD_IsoOutIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD ISO OUT Incomplete callback */ -typedef void (*pPCD_IsoInIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD ISO IN Incomplete callback */ -typedef void (*pPCD_LpmCallbackTypeDef)(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); /*!< pointer to USB OTG PCD LPM callback */ -typedef void (*pPCD_BcdCallbackTypeDef)(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg); /*!< pointer to USB OTG PCD BCD callback */ - -/** - * @} - */ - -HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID, - pPCD_CallbackTypeDef pCallback); - -HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID); - -HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, - pPCD_DataOutStageCallbackTypeDef pCallback); - -HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd); - -HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, - pPCD_DataInStageCallbackTypeDef pCallback); - -HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd); - -HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, - pPCD_IsoOutIncpltCallbackTypeDef pCallback); - -HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd); - -HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, - pPCD_IsoInIncpltCallbackTypeDef pCallback); - -HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd); - -HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, pPCD_BcdCallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_PCD_UnRegisterBcdCallback(PCD_HandleTypeDef *hpcd); - -HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_PCD_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* I/O operation functions ***************************************************/ -/* Non-Blocking mode: Interrupt */ -/** @addtogroup PCD_Exported_Functions_Group2 Input and Output operation functions - * @{ - */ -HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd); -void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd); -void HAL_PCD_WKUP_IRQHandler(PCD_HandleTypeDef *hpcd); - -void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd); - -void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); -void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); -void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); -void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); -/** - * @} - */ - -/* Peripheral Control functions **********************************************/ -/** @addtogroup PCD_Exported_Functions_Group3 Peripheral Control functions - * @{ - */ -HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address); -HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type); -HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len); -HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len); -HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_EP_Abort(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd); -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -HAL_StatusTypeDef HAL_PCD_SetTestMode(const PCD_HandleTypeDef *hpcd, uint8_t testmode); -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef const *hpcd, uint8_t ep_addr); -/** - * @} - */ - -/* Peripheral State functions ************************************************/ -/** @addtogroup PCD_Exported_Functions_Group4 Peripheral State functions - * @{ - */ -PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef const *hpcd); -/** - * @} - */ - -/** - * @} - */ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PCD_Private_Constants PCD Private Constants - * @{ - */ -/** @defgroup USB_EXTI_Line_Interrupt USB EXTI line interrupt - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -#define USB_OTG_FS_WAKEUP_EXTI_LINE (0x1U << 18) /*!< USB FS EXTI Line WakeUp Interrupt */ -#define USB_OTG_HS_WAKEUP_EXTI_LINE (0x1U << 20) /*!< USB HS EXTI Line WakeUp Interrupt */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - - -/** - * @} - */ -/** - * @} - */ - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -#ifndef USB_OTG_DOEPINT_OTEPSPR -#define USB_OTG_DOEPINT_OTEPSPR (0x1UL << 5) /*!< Status Phase Received interrupt */ -#endif /* defined USB_OTG_DOEPINT_OTEPSPR */ - -#ifndef USB_OTG_DOEPMSK_OTEPSPRM -#define USB_OTG_DOEPMSK_OTEPSPRM (0x1UL << 5) /*!< Setup Packet Received interrupt mask */ -#endif /* defined USB_OTG_DOEPMSK_OTEPSPRM */ - -#ifndef USB_OTG_DOEPINT_NAK -#define USB_OTG_DOEPINT_NAK (0x1UL << 13) /*!< NAK interrupt */ -#endif /* defined USB_OTG_DOEPINT_NAK */ - -#ifndef USB_OTG_DOEPMSK_NAKM -#define USB_OTG_DOEPMSK_NAKM (0x1UL << 13) /*!< OUT Packet NAK interrupt mask */ -#endif /* defined USB_OTG_DOEPMSK_NAKM */ - -#ifndef USB_OTG_DOEPINT_STPKTRX -#define USB_OTG_DOEPINT_STPKTRX (0x1UL << 15) /*!< Setup Packet Received interrupt */ -#endif /* defined USB_OTG_DOEPINT_STPKTRX */ - -#ifndef USB_OTG_DOEPMSK_NYETM -#define USB_OTG_DOEPMSK_NYETM (0x1UL << 14) /*!< Setup Packet Received interrupt mask */ -#endif /* defined USB_OTG_DOEPMSK_NYETM */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PCD_Private_Macros PCD Private Macros - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_PCD_H */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd_ex.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd_ex.h deleted file mode 100644 index 284c9d5..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd_ex.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pcd_ex.h - * @author MCD Application Team - * @brief Header file of PCD HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_PCD_EX_H -#define STM32F4xx_HAL_PCD_EX_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PCDEx - * @{ - */ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PCDEx_Exported_Functions PCDEx Exported Functions - * @{ - */ -/** @addtogroup PCDEx_Exported_Functions_Group1 Peripheral Control functions - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size); -HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size); -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \ - || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \ - || defined(STM32F423xx) -HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd); -#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || - defined(STM32F423xx) */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) \ - || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -HAL_StatusTypeDef HAL_PCDEx_ActivateBCD(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCDEx_DeActivateBCD(PCD_HandleTypeDef *hpcd); -void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd); -#endif /* defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) */ -void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); -void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* STM32F4xx_HAL_PCD_EX_H */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h deleted file mode 100644 index a7273d5..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h +++ /dev/null @@ -1,436 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr.h - * @author MCD Application Team - * @brief Header file of PWR HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_PWR_H -#define __STM32F4xx_HAL_PWR_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PWR - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup PWR_Exported_Types PWR Exported Types - * @{ - */ - -/** - * @brief PWR PVD configuration structure definition - */ -typedef struct -{ - uint32_t PVDLevel; /*!< PVDLevel: Specifies the PVD detection level. - This parameter can be a value of @ref PWR_PVD_detection_level */ - - uint32_t Mode; /*!< Mode: Specifies the operating mode for the selected pins. - This parameter can be a value of @ref PWR_PVD_Mode */ -}PWR_PVDTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWR_Exported_Constants PWR Exported Constants - * @{ - */ - -/** @defgroup PWR_WakeUp_Pins PWR WakeUp Pins - * @{ - */ -#define PWR_WAKEUP_PIN1 0x00000100U -/** - * @} - */ - -/** @defgroup PWR_PVD_detection_level PWR PVD detection level - * @{ - */ -#define PWR_PVDLEVEL_0 PWR_CR_PLS_LEV0 -#define PWR_PVDLEVEL_1 PWR_CR_PLS_LEV1 -#define PWR_PVDLEVEL_2 PWR_CR_PLS_LEV2 -#define PWR_PVDLEVEL_3 PWR_CR_PLS_LEV3 -#define PWR_PVDLEVEL_4 PWR_CR_PLS_LEV4 -#define PWR_PVDLEVEL_5 PWR_CR_PLS_LEV5 -#define PWR_PVDLEVEL_6 PWR_CR_PLS_LEV6 -#define PWR_PVDLEVEL_7 PWR_CR_PLS_LEV7/* External input analog voltage - (Compare internally to VREFINT) */ -/** - * @} - */ - -/** @defgroup PWR_PVD_Mode PWR PVD Mode - * @{ - */ -#define PWR_PVD_MODE_NORMAL 0x00000000U /*!< basic mode is used */ -#define PWR_PVD_MODE_IT_RISING 0x00010001U /*!< External Interrupt Mode with Rising edge trigger detection */ -#define PWR_PVD_MODE_IT_FALLING 0x00010002U /*!< External Interrupt Mode with Falling edge trigger detection */ -#define PWR_PVD_MODE_IT_RISING_FALLING 0x00010003U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ -#define PWR_PVD_MODE_EVENT_RISING 0x00020001U /*!< Event Mode with Rising edge trigger detection */ -#define PWR_PVD_MODE_EVENT_FALLING 0x00020002U /*!< Event Mode with Falling edge trigger detection */ -#define PWR_PVD_MODE_EVENT_RISING_FALLING 0x00020003U /*!< Event Mode with Rising/Falling edge trigger detection */ -/** - * @} - */ - - -/** @defgroup PWR_Regulator_state_in_STOP_mode PWR Regulator state in SLEEP/STOP mode - * @{ - */ -#define PWR_MAINREGULATOR_ON 0x00000000U -#define PWR_LOWPOWERREGULATOR_ON PWR_CR_LPDS -/** - * @} - */ - -/** @defgroup PWR_SLEEP_mode_entry PWR SLEEP mode entry - * @{ - */ -#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01) -#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02) -#define PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR ((uint8_t)0x03) - -/** - * @} - */ - -/** @defgroup PWR_STOP_mode_entry PWR STOP mode entry - * @{ - */ -#define PWR_STOPENTRY_WFI ((uint8_t)0x01) -#define PWR_STOPENTRY_WFE ((uint8_t)0x02) -#define PWR_STOPENTRY_WFE_NO_EVT_CLEAR ((uint8_t)0x03) -/** - * @} - */ - -/** @defgroup PWR_Flag PWR Flag - * @{ - */ -#define PWR_FLAG_WU PWR_CSR_WUF -#define PWR_FLAG_SB PWR_CSR_SBF -#define PWR_FLAG_PVDO PWR_CSR_PVDO -#define PWR_FLAG_BRR PWR_CSR_BRR -#define PWR_FLAG_VOSRDY PWR_CSR_VOSRDY -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWR_Exported_Macro PWR Exported Macro - * @{ - */ - -/** @brief Check PWR flag is set or not. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag. This flag indicates that a wakeup event - * was received from the WKUP pin or from the RTC alarm (Alarm A - * or Alarm B), RTC Tamper event, RTC TimeStamp event or RTC Wakeup. - * An additional wakeup event is detected if the WKUP pin is enabled - * (by setting the EWUP bit) when the WKUP pin level is already high. - * @arg PWR_FLAG_SB: StandBy flag. This flag indicates that the system was - * resumed from StandBy mode. - * @arg PWR_FLAG_PVDO: PVD Output. This flag is valid only if PVD is enabled - * by the HAL_PWR_EnablePVD() function. The PVD is stopped by Standby mode - * For this reason, this bit is equal to 0 after Standby or reset - * until the PVDE bit is set. - * @arg PWR_FLAG_BRR: Backup regulator ready flag. This bit is not reset - * when the device wakes up from Standby mode or by a system reset - * or power reset. - * @arg PWR_FLAG_VOSRDY: This flag indicates that the Regulator voltage - * scaling output selection is ready. - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_PWR_GET_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the PWR's pending flags. - * @param __FLAG__ specifies the flag to clear. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag - * @arg PWR_FLAG_SB: StandBy flag - */ -#define __HAL_PWR_CLEAR_FLAG(__FLAG__) (PWR->CR |= (__FLAG__) << 2U) - -/** - * @brief Enable the PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_IT() (EXTI->IMR |= (PWR_EXTI_LINE_PVD)) - -/** - * @brief Disable the PVD EXTI Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_IT() (EXTI->IMR &= ~(PWR_EXTI_LINE_PVD)) - -/** - * @brief Enable event on PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_EVENT() (EXTI->EMR |= (PWR_EXTI_LINE_PVD)) - -/** - * @brief Disable event on PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_EVENT() (EXTI->EMR &= ~(PWR_EXTI_LINE_PVD)) - -/** - * @brief Enable the PVD Extended Interrupt Rising Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE() SET_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) - -/** - * @brief Disable the PVD Extended Interrupt Rising Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE() CLEAR_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) - -/** - * @brief Enable the PVD Extended Interrupt Falling Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE() SET_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) - - -/** - * @brief Disable the PVD Extended Interrupt Falling Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE() CLEAR_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) - - -/** - * @brief PVD EXTI line configuration: set rising & falling edge trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE();\ - __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE();\ - }while(0U) - -/** - * @brief Disable the PVD Extended Interrupt Rising & Falling Trigger. - * This parameter can be: - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();\ - __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE();\ - }while(0U) - -/** - * @brief checks whether the specified PVD Exti interrupt flag is set or not. - * @retval EXTI PVD Line Status. - */ -#define __HAL_PWR_PVD_EXTI_GET_FLAG() (EXTI->PR & (PWR_EXTI_LINE_PVD)) - -/** - * @brief Clear the PVD Exti flag. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_CLEAR_FLAG() (EXTI->PR = (PWR_EXTI_LINE_PVD)) - -/** - * @brief Generates a Software interrupt on PVD EXTI line. - * @retval None - */ -#define __HAL_PWR_PVD_EXTI_GENERATE_SWIT() (EXTI->SWIER |= (PWR_EXTI_LINE_PVD)) - -/** - * @} - */ - -/* Include PWR HAL Extension module */ -#include "stm32f4xx_hal_pwr_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PWR_Exported_Functions PWR Exported Functions - * @{ - */ - -/** @addtogroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_PWR_DeInit(void); -void HAL_PWR_EnableBkUpAccess(void); -void HAL_PWR_DisableBkUpAccess(void); -/** - * @} - */ - -/** @addtogroup PWR_Exported_Functions_Group2 Peripheral Control functions - * @{ - */ -/* Peripheral Control functions **********************************************/ -/* PVD configuration */ -void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD); -void HAL_PWR_EnablePVD(void); -void HAL_PWR_DisablePVD(void); - -/* WakeUp pins configuration */ -void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx); -void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx); - -/* Low Power modes entry */ -void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry); -void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry); -void HAL_PWR_EnterSTANDBYMode(void); - -/* Power PVD IRQ Handler */ -void HAL_PWR_PVD_IRQHandler(void); -void HAL_PWR_PVDCallback(void); - -/* Cortex System Control functions *******************************************/ -void HAL_PWR_EnableSleepOnExit(void); -void HAL_PWR_DisableSleepOnExit(void); -void HAL_PWR_EnableSEVOnPend(void); -void HAL_PWR_DisableSEVOnPend(void); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PWR_Private_Constants PWR Private Constants - * @{ - */ - -/** @defgroup PWR_PVD_EXTI_Line PWR PVD EXTI Line - * @{ - */ -#define PWR_EXTI_LINE_PVD ((uint32_t)EXTI_IMR_MR16) /*!< External interrupt line 16 Connected to the PVD EXTI Line */ -/** - * @} - */ - -/** @defgroup PWR_register_alias_address PWR Register alias address - * @{ - */ -/* ------------- PWR registers bit address in the alias region ---------------*/ -#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) -#define PWR_CR_OFFSET 0x00U -#define PWR_CSR_OFFSET 0x04U -#define PWR_CR_OFFSET_BB (PWR_OFFSET + PWR_CR_OFFSET) -#define PWR_CSR_OFFSET_BB (PWR_OFFSET + PWR_CSR_OFFSET) -/** - * @} - */ - -/** @defgroup PWR_CR_register_alias PWR CR Register alias address - * @{ - */ -/* --- CR Register ---*/ -/* Alias word address of DBP bit */ -#define DBP_BIT_NUMBER PWR_CR_DBP_Pos -#define CR_DBP_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (DBP_BIT_NUMBER * 4U)) - -/* Alias word address of PVDE bit */ -#define PVDE_BIT_NUMBER PWR_CR_PVDE_Pos -#define CR_PVDE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (PVDE_BIT_NUMBER * 4U)) - -/* Alias word address of VOS bit */ -#define VOS_BIT_NUMBER PWR_CR_VOS_Pos -#define CR_VOS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (VOS_BIT_NUMBER * 4U)) -/** - * @} - */ - -/** @defgroup PWR_CSR_register_alias PWR CSR Register alias address - * @{ - */ -/* --- CSR Register ---*/ -/* Alias word address of EWUP bit */ -#define EWUP_BIT_NUMBER PWR_CSR_EWUP_Pos -#define CSR_EWUP_BB (PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (EWUP_BIT_NUMBER * 4U)) -/** - * @} - */ - -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PWR_Private_Macros PWR Private Macros - * @{ - */ - -/** @defgroup PWR_IS_PWR_Definitions PWR Private macros to check input parameters - * @{ - */ -#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLEVEL_0) || ((LEVEL) == PWR_PVDLEVEL_1)|| \ - ((LEVEL) == PWR_PVDLEVEL_2) || ((LEVEL) == PWR_PVDLEVEL_3)|| \ - ((LEVEL) == PWR_PVDLEVEL_4) || ((LEVEL) == PWR_PVDLEVEL_5)|| \ - ((LEVEL) == PWR_PVDLEVEL_6) || ((LEVEL) == PWR_PVDLEVEL_7)) -#define IS_PWR_PVD_MODE(MODE) (((MODE) == PWR_PVD_MODE_IT_RISING)|| ((MODE) == PWR_PVD_MODE_IT_FALLING) || \ - ((MODE) == PWR_PVD_MODE_IT_RISING_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING) || \ - ((MODE) == PWR_PVD_MODE_EVENT_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING_FALLING) || \ - ((MODE) == PWR_PVD_MODE_NORMAL)) -#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_ON) || \ - ((REGULATOR) == PWR_LOWPOWERREGULATOR_ON)) - -#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPENTRY_WFI) || \ - ((ENTRY) == PWR_SLEEPENTRY_WFE) || \ - ((ENTRY) == PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR)) - -#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPENTRY_WFI) || \ - ((ENTRY) == PWR_STOPENTRY_WFE) || \ - ((ENTRY) == PWR_STOPENTRY_WFE_NO_EVT_CLEAR)) -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_HAL_PWR_H */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h deleted file mode 100644 index 57fd4d9..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h +++ /dev/null @@ -1,340 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr_ex.h - * @author MCD Application Team - * @brief Header file of PWR HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_PWR_EX_H -#define __STM32F4xx_HAL_PWR_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PWREx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Constants PWREx Exported Constants - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** @defgroup PWREx_Regulator_state_in_UnderDrive_mode PWREx Regulator state in UnderDrive mode - * @{ - */ -#define PWR_MAINREGULATOR_UNDERDRIVE_ON PWR_CR_MRUDS -#define PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON ((uint32_t)(PWR_CR_LPDS | PWR_CR_LPUDS)) -/** - * @} - */ - -/** @defgroup PWREx_Over_Under_Drive_Flag PWREx Over Under Drive Flag - * @{ - */ -#define PWR_FLAG_ODRDY PWR_CSR_ODRDY -#define PWR_FLAG_ODSWRDY PWR_CSR_ODSWRDY -#define PWR_FLAG_UDRDY PWR_CSR_UDSWRDY -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -/** @defgroup PWREx_Regulator_Voltage_Scale PWREx Regulator Voltage Scale - * @{ - */ -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK = 168 MHz. */ -#define PWR_REGULATOR_VOLTAGE_SCALE2 0x00000000U /* Scale 2 mode: the maximum value of fHCLK = 144 MHz. */ -#else -#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK is 168 MHz. It can be extended to - 180 MHz by activating the over-drive mode. */ -#define PWR_REGULATOR_VOLTAGE_SCALE2 PWR_CR_VOS_1 /* Scale 2 mode: the maximum value of fHCLK is 144 MHz. It can be extended to - 168 MHz by activating the over-drive mode. */ -#define PWR_REGULATOR_VOLTAGE_SCALE3 PWR_CR_VOS_0 /* Scale 3 mode: the maximum value of fHCLK is 120 MHz. */ -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ -/** - * @} - */ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup PWREx_WakeUp_Pins PWREx WakeUp Pins - * @{ - */ -#define PWR_WAKEUP_PIN2 0x00000080U -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define PWR_WAKEUP_PIN3 0x00000040U -#endif /* STM32F410xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Zx || STM32F412Vx || \ - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ -#endif /* STM32F410xx || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Constants PWREx Exported Constants - * @{ - */ - -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -/** @brief macros configure the main internal regulator output voltage. - * @param __REGULATOR__ specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption when the device does - * not operate at the maximum frequency (refer to the datasheets for more details). - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * @retval None - */ -#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ - UNUSED(tmpreg); \ - } while(0U) -#else -/** @brief macros configure the main internal regulator output voltage. - * @param __REGULATOR__ specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption when the device does - * not operate at the maximum frequency (refer to the datasheets for more details). - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode - * @retval None - */ -#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macros to enable or disable the Over drive mode. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_OVERDRIVE_ENABLE() (*(__IO uint32_t *) CR_ODEN_BB = ENABLE) -#define __HAL_PWR_OVERDRIVE_DISABLE() (*(__IO uint32_t *) CR_ODEN_BB = DISABLE) - -/** @brief Macros to enable or disable the Over drive switching. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_OVERDRIVESWITCHING_ENABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = ENABLE) -#define __HAL_PWR_OVERDRIVESWITCHING_DISABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = DISABLE) - -/** @brief Macros to enable or disable the Under drive mode. - * @note This mode is enabled only with STOP low power mode. - * In this mode, the 1.2V domain is preserved in reduced leakage mode. This - * mode is only available when the main regulator or the low power regulator - * is in low voltage mode. - * @note If the Under-drive mode was enabled, it is automatically disabled after - * exiting Stop mode. - * When the voltage regulator operates in Under-drive mode, an additional - * startup delay is induced when waking up from Stop mode. - */ -#define __HAL_PWR_UNDERDRIVE_ENABLE() (PWR->CR |= (uint32_t)PWR_CR_UDEN) -#define __HAL_PWR_UNDERDRIVE_DISABLE() (PWR->CR &= (uint32_t)(~PWR_CR_UDEN)) - -/** @brief Check PWR flag is set or not. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg PWR_FLAG_ODRDY: This flag indicates that the Over-drive mode - * is ready - * @arg PWR_FLAG_ODSWRDY: This flag indicates that the Over-drive mode - * switching is ready - * @arg PWR_FLAG_UDRDY: This flag indicates that the Under-drive mode - * is enabled in Stop mode - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_PWR_GET_ODRUDR_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the Under-Drive Ready flag. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_CLEAR_ODRUDR_FLAG() (PWR->CSR |= PWR_FLAG_UDRDY) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PWREx_Exported_Functions PWREx Exported Functions - * @{ - */ - -/** @addtogroup PWREx_Exported_Functions_Group1 - * @{ - */ -void HAL_PWREx_EnableFlashPowerDown(void); -void HAL_PWREx_DisableFlashPowerDown(void); -HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void); -HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void); -uint32_t HAL_PWREx_GetVoltageRange(void); -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling); - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ - defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -void HAL_PWREx_EnableMainRegulatorLowVoltage(void); -void HAL_PWREx_DisableMainRegulatorLowVoltage(void); -void HAL_PWREx_EnableLowRegulatorLowVoltage(void); -void HAL_PWREx_DisableLowRegulatorLowVoltage(void); -#endif /* STM32F410xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F412Zx || STM32F412Vx ||\ - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void); -HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void); -HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PWREx_Private_Constants PWREx Private Constants - * @{ - */ - -/** @defgroup PWREx_register_alias_address PWREx Register alias address - * @{ - */ -/* ------------- PWR registers bit address in the alias region ---------------*/ -/* --- CR Register ---*/ -/* Alias word address of FPDS bit */ -#define FPDS_BIT_NUMBER PWR_CR_FPDS_Pos -#define CR_FPDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (FPDS_BIT_NUMBER * 4U)) - -/* Alias word address of ODEN bit */ -#define ODEN_BIT_NUMBER PWR_CR_ODEN_Pos -#define CR_ODEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODEN_BIT_NUMBER * 4U)) - -/* Alias word address of ODSWEN bit */ -#define ODSWEN_BIT_NUMBER PWR_CR_ODSWEN_Pos -#define CR_ODSWEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODSWEN_BIT_NUMBER * 4U)) - -/* Alias word address of MRLVDS bit */ -#define MRLVDS_BIT_NUMBER PWR_CR_MRLVDS_Pos -#define CR_MRLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (MRLVDS_BIT_NUMBER * 4U)) - -/* Alias word address of LPLVDS bit */ -#define LPLVDS_BIT_NUMBER PWR_CR_LPLVDS_Pos -#define CR_LPLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (LPLVDS_BIT_NUMBER * 4U)) - - /** - * @} - */ - -/** @defgroup PWREx_CSR_register_alias PWRx CSR Register alias address - * @{ - */ -/* --- CSR Register ---*/ -/* Alias word address of BRE bit */ -#define BRE_BIT_NUMBER PWR_CSR_BRE_Pos -#define CSR_BRE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (BRE_BIT_NUMBER * 4U)) - -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PWREx_Private_Macros PWREx Private Macros - * @{ - */ - -/** @defgroup PWREx_IS_PWR_Definitions PWREx Private macros to check input parameters - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_PWR_REGULATOR_UNDERDRIVE(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_UNDERDRIVE_ON) || \ - ((REGULATOR) == PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2)) -#else -#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE3)) -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ - -#if defined(STM32F446xx) -#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2)) -#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2) || \ - ((PIN) == PWR_WAKEUP_PIN3)) -#else -#define IS_PWR_WAKEUP_PIN(PIN) ((PIN) == PWR_WAKEUP_PIN1) -#endif /* STM32F446xx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_HAL_PWR_EX_H */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h deleted file mode 100644 index cf01e51..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h +++ /dev/null @@ -1,1458 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc.h - * @author MCD Application Team - * @brief Header file of RCC HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_RCC_H -#define __STM32F4xx_HAL_RCC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/* Include RCC HAL Extended module */ -/* (include on top of file since RCC structures are defined in extended file) */ -#include "stm32f4xx_hal_rcc_ex.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup RCC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup RCC_Exported_Types RCC Exported Types - * @{ - */ - -/** - * @brief RCC Internal/External Oscillator (HSE, HSI, LSE and LSI) configuration structure definition - */ -typedef struct -{ - uint32_t OscillatorType; /*!< The oscillators to be configured. - This parameter can be a value of @ref RCC_Oscillator_Type */ - - uint32_t HSEState; /*!< The new state of the HSE. - This parameter can be a value of @ref RCC_HSE_Config */ - - uint32_t LSEState; /*!< The new state of the LSE. - This parameter can be a value of @ref RCC_LSE_Config */ - - uint32_t HSIState; /*!< The new state of the HSI. - This parameter can be a value of @ref RCC_HSI_Config */ - - uint32_t HSICalibrationValue; /*!< The HSI calibration trimming value (default is RCC_HSICALIBRATION_DEFAULT). - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F */ - - uint32_t LSIState; /*!< The new state of the LSI. - This parameter can be a value of @ref RCC_LSI_Config */ - - RCC_PLLInitTypeDef PLL; /*!< PLL structure parameters */ -} RCC_OscInitTypeDef; - -/** - * @brief RCC System, AHB and APB busses clock configuration structure definition - */ -typedef struct -{ - uint32_t ClockType; /*!< The clock to be configured. - This parameter can be a value of @ref RCC_System_Clock_Type */ - - uint32_t SYSCLKSource; /*!< The clock source (SYSCLKS) used as system clock. - This parameter can be a value of @ref RCC_System_Clock_Source */ - - uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). - This parameter can be a value of @ref RCC_AHB_Clock_Source */ - - uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). - This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ - - uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). - This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ - -} RCC_ClkInitTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RCC_Exported_Constants RCC Exported Constants - * @{ - */ - -/** @defgroup RCC_Oscillator_Type Oscillator Type - * @{ - */ -#define RCC_OSCILLATORTYPE_NONE 0x00000000U -#define RCC_OSCILLATORTYPE_HSE 0x00000001U -#define RCC_OSCILLATORTYPE_HSI 0x00000002U -#define RCC_OSCILLATORTYPE_LSE 0x00000004U -#define RCC_OSCILLATORTYPE_LSI 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_HSE_Config HSE Config - * @{ - */ -#define RCC_HSE_OFF 0x00000000U -#define RCC_HSE_ON RCC_CR_HSEON -#define RCC_HSE_BYPASS ((uint32_t)(RCC_CR_HSEBYP | RCC_CR_HSEON)) -/** - * @} - */ - -/** @defgroup RCC_LSE_Config LSE Config - * @{ - */ -#define RCC_LSE_OFF 0x00000000U -#define RCC_LSE_ON RCC_BDCR_LSEON -#define RCC_LSE_BYPASS ((uint32_t)(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON)) -/** - * @} - */ - -/** @defgroup RCC_HSI_Config HSI Config - * @{ - */ -#define RCC_HSI_OFF ((uint8_t)0x00) -#define RCC_HSI_ON ((uint8_t)0x01) - -#define RCC_HSICALIBRATION_DEFAULT 0x10U /* Default HSI calibration trimming value */ -/** - * @} - */ - -/** @defgroup RCC_LSI_Config LSI Config - * @{ - */ -#define RCC_LSI_OFF ((uint8_t)0x00) -#define RCC_LSI_ON ((uint8_t)0x01) -/** - * @} - */ - -/** @defgroup RCC_PLL_Config PLL Config - * @{ - */ -#define RCC_PLL_NONE ((uint8_t)0x00) -#define RCC_PLL_OFF ((uint8_t)0x01) -#define RCC_PLL_ON ((uint8_t)0x02) -/** - * @} - */ - -/** @defgroup RCC_PLLP_Clock_Divider PLLP Clock Divider - * @{ - */ -#define RCC_PLLP_DIV2 0x00000002U -#define RCC_PLLP_DIV4 0x00000004U -#define RCC_PLLP_DIV6 0x00000006U -#define RCC_PLLP_DIV8 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_PLL_Clock_Source PLL Clock Source - * @{ - */ -#define RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI -#define RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Type System Clock Type - * @{ - */ -#define RCC_CLOCKTYPE_SYSCLK 0x00000001U -#define RCC_CLOCKTYPE_HCLK 0x00000002U -#define RCC_CLOCKTYPE_PCLK1 0x00000004U -#define RCC_CLOCKTYPE_PCLK2 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Source System Clock Source - * @note The RCC_SYSCLKSOURCE_PLLRCLK parameter is available only for - * STM32F446xx devices. - * @{ - */ -#define RCC_SYSCLKSOURCE_HSI RCC_CFGR_SW_HSI -#define RCC_SYSCLKSOURCE_HSE RCC_CFGR_SW_HSE -#define RCC_SYSCLKSOURCE_PLLCLK RCC_CFGR_SW_PLL -#define RCC_SYSCLKSOURCE_PLLRCLK ((uint32_t)(RCC_CFGR_SW_0 | RCC_CFGR_SW_1)) -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Source_Status System Clock Source Status - * @note The RCC_SYSCLKSOURCE_STATUS_PLLRCLK parameter is available only for - * STM32F446xx devices. - * @{ - */ -#define RCC_SYSCLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_PLLCLK RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_PLLRCLK ((uint32_t)(RCC_CFGR_SWS_0 | RCC_CFGR_SWS_1)) /*!< PLLR used as system clock */ -/** - * @} - */ - -/** @defgroup RCC_AHB_Clock_Source AHB Clock Source - * @{ - */ -#define RCC_SYSCLK_DIV1 RCC_CFGR_HPRE_DIV1 -#define RCC_SYSCLK_DIV2 RCC_CFGR_HPRE_DIV2 -#define RCC_SYSCLK_DIV4 RCC_CFGR_HPRE_DIV4 -#define RCC_SYSCLK_DIV8 RCC_CFGR_HPRE_DIV8 -#define RCC_SYSCLK_DIV16 RCC_CFGR_HPRE_DIV16 -#define RCC_SYSCLK_DIV64 RCC_CFGR_HPRE_DIV64 -#define RCC_SYSCLK_DIV128 RCC_CFGR_HPRE_DIV128 -#define RCC_SYSCLK_DIV256 RCC_CFGR_HPRE_DIV256 -#define RCC_SYSCLK_DIV512 RCC_CFGR_HPRE_DIV512 -/** - * @} - */ - -/** @defgroup RCC_APB1_APB2_Clock_Source APB1/APB2 Clock Source - * @{ - */ -#define RCC_HCLK_DIV1 RCC_CFGR_PPRE1_DIV1 -#define RCC_HCLK_DIV2 RCC_CFGR_PPRE1_DIV2 -#define RCC_HCLK_DIV4 RCC_CFGR_PPRE1_DIV4 -#define RCC_HCLK_DIV8 RCC_CFGR_PPRE1_DIV8 -#define RCC_HCLK_DIV16 RCC_CFGR_PPRE1_DIV16 -/** - * @} - */ - -/** @defgroup RCC_RTC_Clock_Source RTC Clock Source - * @{ - */ -#define RCC_RTCCLKSOURCE_NO_CLK 0x00000000U -#define RCC_RTCCLKSOURCE_LSE 0x00000100U -#define RCC_RTCCLKSOURCE_LSI 0x00000200U -#define RCC_RTCCLKSOURCE_HSE_DIVX 0x00000300U -#define RCC_RTCCLKSOURCE_HSE_DIV2 0x00020300U -#define RCC_RTCCLKSOURCE_HSE_DIV3 0x00030300U -#define RCC_RTCCLKSOURCE_HSE_DIV4 0x00040300U -#define RCC_RTCCLKSOURCE_HSE_DIV5 0x00050300U -#define RCC_RTCCLKSOURCE_HSE_DIV6 0x00060300U -#define RCC_RTCCLKSOURCE_HSE_DIV7 0x00070300U -#define RCC_RTCCLKSOURCE_HSE_DIV8 0x00080300U -#define RCC_RTCCLKSOURCE_HSE_DIV9 0x00090300U -#define RCC_RTCCLKSOURCE_HSE_DIV10 0x000A0300U -#define RCC_RTCCLKSOURCE_HSE_DIV11 0x000B0300U -#define RCC_RTCCLKSOURCE_HSE_DIV12 0x000C0300U -#define RCC_RTCCLKSOURCE_HSE_DIV13 0x000D0300U -#define RCC_RTCCLKSOURCE_HSE_DIV14 0x000E0300U -#define RCC_RTCCLKSOURCE_HSE_DIV15 0x000F0300U -#define RCC_RTCCLKSOURCE_HSE_DIV16 0x00100300U -#define RCC_RTCCLKSOURCE_HSE_DIV17 0x00110300U -#define RCC_RTCCLKSOURCE_HSE_DIV18 0x00120300U -#define RCC_RTCCLKSOURCE_HSE_DIV19 0x00130300U -#define RCC_RTCCLKSOURCE_HSE_DIV20 0x00140300U -#define RCC_RTCCLKSOURCE_HSE_DIV21 0x00150300U -#define RCC_RTCCLKSOURCE_HSE_DIV22 0x00160300U -#define RCC_RTCCLKSOURCE_HSE_DIV23 0x00170300U -#define RCC_RTCCLKSOURCE_HSE_DIV24 0x00180300U -#define RCC_RTCCLKSOURCE_HSE_DIV25 0x00190300U -#define RCC_RTCCLKSOURCE_HSE_DIV26 0x001A0300U -#define RCC_RTCCLKSOURCE_HSE_DIV27 0x001B0300U -#define RCC_RTCCLKSOURCE_HSE_DIV28 0x001C0300U -#define RCC_RTCCLKSOURCE_HSE_DIV29 0x001D0300U -#define RCC_RTCCLKSOURCE_HSE_DIV30 0x001E0300U -#define RCC_RTCCLKSOURCE_HSE_DIV31 0x001F0300U -/** - * @} - */ - -/** @defgroup RCC_MCO_Index MCO Index - * @{ - */ -#define RCC_MCO1 0x00000000U -#define RCC_MCO2 0x00000001U -/** - * @} - */ - -/** @defgroup RCC_MCO1_Clock_Source MCO1 Clock Source - * @{ - */ -#define RCC_MCO1SOURCE_HSI 0x00000000U -#define RCC_MCO1SOURCE_LSE RCC_CFGR_MCO1_0 -#define RCC_MCO1SOURCE_HSE RCC_CFGR_MCO1_1 -#define RCC_MCO1SOURCE_PLLCLK RCC_CFGR_MCO1 -/** - * @} - */ - -/** @defgroup RCC_MCOx_Clock_Prescaler MCOx Clock Prescaler - * @{ - */ -#define RCC_MCODIV_1 0x00000000U -#define RCC_MCODIV_2 RCC_CFGR_MCO1PRE_2 -#define RCC_MCODIV_3 ((uint32_t)RCC_CFGR_MCO1PRE_0 | RCC_CFGR_MCO1PRE_2) -#define RCC_MCODIV_4 ((uint32_t)RCC_CFGR_MCO1PRE_1 | RCC_CFGR_MCO1PRE_2) -#define RCC_MCODIV_5 RCC_CFGR_MCO1PRE -/** - * @} - */ - -/** @defgroup RCC_Interrupt Interrupts - * @{ - */ -#define RCC_IT_LSIRDY ((uint8_t)0x01) -#define RCC_IT_LSERDY ((uint8_t)0x02) -#define RCC_IT_HSIRDY ((uint8_t)0x04) -#define RCC_IT_HSERDY ((uint8_t)0x08) -#define RCC_IT_PLLRDY ((uint8_t)0x10) -#define RCC_IT_PLLI2SRDY ((uint8_t)0x20) -#define RCC_IT_CSS ((uint8_t)0x80) -/** - * @} - */ - -/** @defgroup RCC_Flag Flags - * Elements values convention: 0XXYYYYYb - * - YYYYY : Flag position in the register - * - 0XX : Register index - * - 01: CR register - * - 10: BDCR register - * - 11: CSR register - * @{ - */ -/* Flags in the CR register */ -#define RCC_FLAG_HSIRDY ((uint8_t)0x21) -#define RCC_FLAG_HSERDY ((uint8_t)0x31) -#define RCC_FLAG_PLLRDY ((uint8_t)0x39) -#define RCC_FLAG_PLLI2SRDY ((uint8_t)0x3B) - -/* Flags in the BDCR register */ -#define RCC_FLAG_LSERDY ((uint8_t)0x41) - -/* Flags in the CSR register */ -#define RCC_FLAG_LSIRDY ((uint8_t)0x61) -#define RCC_FLAG_BORRST ((uint8_t)0x79) -#define RCC_FLAG_PINRST ((uint8_t)0x7A) -#define RCC_FLAG_PORRST ((uint8_t)0x7B) -#define RCC_FLAG_SFTRST ((uint8_t)0x7C) -#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) -#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) -#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RCC_Exported_Macros RCC Exported Macros - * @{ - */ - -/** @defgroup RCC_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_GPIOA_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN)) -#define __HAL_RCC_GPIOB_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOBEN)) -#define __HAL_RCC_GPIOC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOCEN)) -#define __HAL_RCC_GPIOH_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOHEN)) -#define __HAL_RCC_DMA1_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA1EN)) -#define __HAL_RCC_DMA2_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2EN)) -/** - * @} - */ - -/** @defgroup RCC_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOA_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) != RESET) -#define __HAL_RCC_GPIOB_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) != RESET) -#define __HAL_RCC_GPIOC_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) != RESET) -#define __HAL_RCC_GPIOH_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) != RESET) -#define __HAL_RCC_DMA1_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) != RESET) -#define __HAL_RCC_DMA2_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) != RESET) - -#define __HAL_RCC_GPIOA_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) == RESET) -#define __HAL_RCC_GPIOB_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) == RESET) -#define __HAL_RCC_GPIOC_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) == RESET) -#define __HAL_RCC_GPIOH_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) == RESET) -#define __HAL_RCC_DMA1_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) == RESET) -#define __HAL_RCC_DMA2_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_WWDG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_PWR_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN)) -#define __HAL_RCC_WWDG_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_WWDGEN)) -#define __HAL_RCC_SPI2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN)) -#define __HAL_RCC_USART2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART2EN)) -#define __HAL_RCC_I2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN)) -#define __HAL_RCC_I2C2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN)) -#define __HAL_RCC_PWR_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_PWREN)) -/** - * @} - */ - -/** @defgroup RCC_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) != RESET) -#define __HAL_RCC_WWDG_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) != RESET) -#define __HAL_RCC_SPI2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) != RESET) -#define __HAL_RCC_USART2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) != RESET) -#define __HAL_RCC_I2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) != RESET) -#define __HAL_RCC_I2C2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) != RESET) -#define __HAL_RCC_PWR_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) != RESET) - -#define __HAL_RCC_TIM5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) == RESET) -#define __HAL_RCC_WWDG_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) == RESET) -#define __HAL_RCC_SPI2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) == RESET) -#define __HAL_RCC_USART2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) == RESET) -#define __HAL_RCC_I2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) == RESET) -#define __HAL_RCC_I2C2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) == RESET) -#define __HAL_RCC_PWR_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SYSCFG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM9_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM11_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM1EN)) -#define __HAL_RCC_USART1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) -#define __HAL_RCC_USART6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART6EN)) -#define __HAL_RCC_ADC1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN)) -#define __HAL_RCC_SPI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN)) -#define __HAL_RCC_SYSCFG_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SYSCFGEN)) -#define __HAL_RCC_TIM9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM9EN)) -#define __HAL_RCC_TIM11_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM11EN)) -/** - * @} - */ - -/** @defgroup RCC_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) != RESET) -#define __HAL_RCC_USART1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) != RESET) -#define __HAL_RCC_USART6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) != RESET) -#define __HAL_RCC_ADC1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) != RESET) -#define __HAL_RCC_SPI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) != RESET) -#define __HAL_RCC_SYSCFG_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) != RESET) -#define __HAL_RCC_TIM9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) != RESET) -#define __HAL_RCC_TIM11_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) != RESET) - -#define __HAL_RCC_TIM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) == RESET) -#define __HAL_RCC_USART1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) == RESET) -#define __HAL_RCC_USART6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) == RESET) -#define __HAL_RCC_ADC1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) == RESET) -#define __HAL_RCC_SPI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) == RESET) -#define __HAL_RCC_SYSCFG_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) == RESET) -#define __HAL_RCC_TIM9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) == RESET) -#define __HAL_RCC_TIM11_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_GPIOA_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOARST)) -#define __HAL_RCC_GPIOB_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOBRST)) -#define __HAL_RCC_GPIOC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOCRST)) -#define __HAL_RCC_GPIOH_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOHRST)) -#define __HAL_RCC_DMA1_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA1RST)) -#define __HAL_RCC_DMA2_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2RST)) - -#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) -#define __HAL_RCC_GPIOA_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOARST)) -#define __HAL_RCC_GPIOB_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOBRST)) -#define __HAL_RCC_GPIOC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOCRST)) -#define __HAL_RCC_GPIOH_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOHRST)) -#define __HAL_RCC_DMA1_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA1RST)) -#define __HAL_RCC_DMA2_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2RST)) -/** - * @} - */ - -/** @defgroup RCC_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM5RST)) -#define __HAL_RCC_WWDG_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_WWDGRST)) -#define __HAL_RCC_SPI2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI2RST)) -#define __HAL_RCC_USART2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART2RST)) -#define __HAL_RCC_I2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C1RST)) -#define __HAL_RCC_I2C2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C2RST)) -#define __HAL_RCC_PWR_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_PWRRST)) - -#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) -#define __HAL_RCC_TIM5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM5RST)) -#define __HAL_RCC_WWDG_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_WWDGRST)) -#define __HAL_RCC_SPI2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI2RST)) -#define __HAL_RCC_USART2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART2RST)) -#define __HAL_RCC_I2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C1RST)) -#define __HAL_RCC_I2C2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C2RST)) -#define __HAL_RCC_PWR_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_PWRRST)) -/** - * @} - */ - -/** @defgroup RCC_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM1RST)) -#define __HAL_RCC_USART1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART1RST)) -#define __HAL_RCC_USART6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART6RST)) -#define __HAL_RCC_ADC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_ADCRST)) -#define __HAL_RCC_SPI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI1RST)) -#define __HAL_RCC_SYSCFG_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SYSCFGRST)) -#define __HAL_RCC_TIM9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM9RST)) -#define __HAL_RCC_TIM11_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM11RST)) - -#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) -#define __HAL_RCC_TIM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM1RST)) -#define __HAL_RCC_USART1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART1RST)) -#define __HAL_RCC_USART6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART6RST)) -#define __HAL_RCC_ADC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_ADCRST)) -#define __HAL_RCC_SPI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI1RST)) -#define __HAL_RCC_SYSCFG_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SYSCFGRST)) -#define __HAL_RCC_TIM9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM9RST)) -#define __HAL_RCC_TIM11_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM11RST)) -/** - * @} - */ - -/** @defgroup RCC_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOALPEN)) -#define __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOBLPEN)) -#define __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOCLPEN)) -#define __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOHLPEN)) -#define __HAL_RCC_DMA1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA1LPEN)) -#define __HAL_RCC_DMA2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2LPEN)) - -#define __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOALPEN)) -#define __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOBLPEN)) -#define __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOCLPEN)) -#define __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOHLPEN)) -#define __HAL_RCC_DMA1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA1LPEN)) -#define __HAL_RCC_DMA2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2LPEN)) -/** - * @} - */ - -/** @defgroup RCC_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM5LPEN)) -#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_WWDGLPEN)) -#define __HAL_RCC_SPI2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI2LPEN)) -#define __HAL_RCC_USART2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART2LPEN)) -#define __HAL_RCC_I2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C1LPEN)) -#define __HAL_RCC_I2C2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C2LPEN)) -#define __HAL_RCC_PWR_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_PWRLPEN)) - -#define __HAL_RCC_TIM5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM5LPEN)) -#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_WWDGLPEN)) -#define __HAL_RCC_SPI2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI2LPEN)) -#define __HAL_RCC_USART2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART2LPEN)) -#define __HAL_RCC_I2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C1LPEN)) -#define __HAL_RCC_I2C2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C2LPEN)) -#define __HAL_RCC_PWR_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_PWRLPEN)) -/** - * @} - */ - -/** @defgroup RCC_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM1LPEN)) -#define __HAL_RCC_USART1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART1LPEN)) -#define __HAL_RCC_USART6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART6LPEN)) -#define __HAL_RCC_ADC1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC1LPEN)) -#define __HAL_RCC_SPI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI1LPEN)) -#define __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SYSCFGLPEN)) -#define __HAL_RCC_TIM9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM9LPEN)) -#define __HAL_RCC_TIM11_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM11LPEN)) - -#define __HAL_RCC_TIM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM1LPEN)) -#define __HAL_RCC_USART1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART1LPEN)) -#define __HAL_RCC_USART6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART6LPEN)) -#define __HAL_RCC_ADC1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC1LPEN)) -#define __HAL_RCC_SPI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI1LPEN)) -#define __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SYSCFGLPEN)) -#define __HAL_RCC_TIM9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM9LPEN)) -#define __HAL_RCC_TIM11_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM11LPEN)) -/** - * @} - */ - -/** @defgroup RCC_HSI_Configuration HSI Configuration - * @{ - */ - -/** @brief Macros to enable or disable the Internal High Speed oscillator (HSI). - * @note The HSI is stopped by hardware when entering STOP and STANDBY modes. - * It is used (enabled by hardware) as system clock source after startup - * from Reset, wake-up from STOP and STANDBY mode, or in case of failure - * of the HSE used directly or indirectly as system clock (if the Clock - * Security System CSS is enabled). - * @note HSI can not be stopped if it is used as system clock source. In this case, - * you have to select another source of the system clock then stop the HSI. - * @note After enabling the HSI, the application software should wait on HSIRDY - * flag to be set indicating that HSI clock is stable and can be used as - * system clock source. - * This parameter can be: ENABLE or DISABLE. - * @note When the HSI is stopped, HSIRDY flag goes low after 6 HSI oscillator - * clock cycles. - */ -#define __HAL_RCC_HSI_ENABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = ENABLE) -#define __HAL_RCC_HSI_DISABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = DISABLE) - -/** @brief Macro to adjust the Internal High Speed oscillator (HSI) calibration value. - * @note The calibration is used to compensate for the variations in voltage - * and temperature that influence the frequency of the internal HSI RC. - * @param __HSICalibrationValue__ specifies the calibration trimming value. - * (default is RCC_HSICALIBRATION_DEFAULT). - * This parameter must be a number between 0 and 0x1F. - */ -#define __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(__HSICalibrationValue__) (MODIFY_REG(RCC->CR,\ - RCC_CR_HSITRIM, (uint32_t)(__HSICalibrationValue__) << RCC_CR_HSITRIM_Pos)) -/** - * @} - */ - -/** @defgroup RCC_LSI_Configuration LSI Configuration - * @{ - */ - -/** @brief Macros to enable or disable the Internal Low Speed oscillator (LSI). - * @note After enabling the LSI, the application software should wait on - * LSIRDY flag to be set indicating that LSI clock is stable and can - * be used to clock the IWDG and/or the RTC. - * @note LSI can not be disabled if the IWDG is running. - * @note When the LSI is stopped, LSIRDY flag goes low after 6 LSI oscillator - * clock cycles. - */ -#define __HAL_RCC_LSI_ENABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = ENABLE) -#define __HAL_RCC_LSI_DISABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = DISABLE) -/** - * @} - */ - -/** @defgroup RCC_HSE_Configuration HSE Configuration - * @{ - */ - -/** - * @brief Macro to configure the External High Speed oscillator (HSE). - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not supported by this macro. - * User should request a transition to HSE Off first and then HSE On or HSE Bypass. - * @note After enabling the HSE (RCC_HSE_ON or RCC_HSE_Bypass), the application - * software should wait on HSERDY flag to be set indicating that HSE clock - * is stable and can be used to clock the PLL and/or system clock. - * @note HSE state can not be changed if it is used directly or through the - * PLL as system clock. In this case, you have to select another source - * of the system clock then change the HSE state (ex. disable it). - * @note The HSE is stopped by hardware when entering STOP and STANDBY modes. - * @note This function reset the CSSON bit, so if the clock security system(CSS) - * was previously enabled you have to enable it again after calling this - * function. - * @param __STATE__ specifies the new state of the HSE. - * This parameter can be one of the following values: - * @arg RCC_HSE_OFF: turn OFF the HSE oscillator, HSERDY flag goes low after - * 6 HSE oscillator clock cycles. - * @arg RCC_HSE_ON: turn ON the HSE oscillator. - * @arg RCC_HSE_BYPASS: HSE oscillator bypassed with external clock. - */ -#define __HAL_RCC_HSE_CONFIG(__STATE__) \ - do { \ - if ((__STATE__) == RCC_HSE_ON) \ - { \ - SET_BIT(RCC->CR, RCC_CR_HSEON); \ - } \ - else if ((__STATE__) == RCC_HSE_BYPASS) \ - { \ - SET_BIT(RCC->CR, RCC_CR_HSEBYP); \ - SET_BIT(RCC->CR, RCC_CR_HSEON); \ - } \ - else \ - { \ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON); \ - CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); \ - } \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCC_LSE_Configuration LSE Configuration - * @{ - */ - -/** - * @brief Macro to configure the External Low Speed oscillator (LSE). - * @note Transition LSE Bypass to LSE On and LSE On to LSE Bypass are not supported by this macro. - * User should request a transition to LSE Off first and then LSE On or LSE Bypass. - * @note As the LSE is in the Backup domain and write access is denied to - * this domain after reset, you have to enable write access using - * HAL_PWR_EnableBkUpAccess() function before to configure the LSE - * (to be done once after reset). - * @note After enabling the LSE (RCC_LSE_ON or RCC_LSE_BYPASS), the application - * software should wait on LSERDY flag to be set indicating that LSE clock - * is stable and can be used to clock the RTC. - * @param __STATE__ specifies the new state of the LSE. - * This parameter can be one of the following values: - * @arg RCC_LSE_OFF: turn OFF the LSE oscillator, LSERDY flag goes low after - * 6 LSE oscillator clock cycles. - * @arg RCC_LSE_ON: turn ON the LSE oscillator. - * @arg RCC_LSE_BYPASS: LSE oscillator bypassed with external clock. - */ -#define __HAL_RCC_LSE_CONFIG(__STATE__) \ - do { \ - if((__STATE__) == RCC_LSE_ON) \ - { \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - } \ - else if((__STATE__) == RCC_LSE_BYPASS) \ - { \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - } \ - else \ - { \ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ - } \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCC_Internal_RTC_Clock_Configuration RTC Clock Configuration - * @{ - */ - -/** @brief Macros to enable or disable the RTC clock. - * @note These macros must be used only after the RTC clock source was selected. - */ -#define __HAL_RCC_RTC_ENABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = ENABLE) -#define __HAL_RCC_RTC_DISABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = DISABLE) - -/** @brief Macros to configure the RTC clock (RTCCLK). - * @note As the RTC clock configuration bits are in the Backup domain and write - * access is denied to this domain after reset, you have to enable write - * access using the Power Backup Access macro before to configure - * the RTC clock source (to be done once after reset). - * @note Once the RTC clock is configured it can't be changed unless the - * Backup domain is reset using __HAL_RCC_BackupReset_RELEASE() macro, or by - * a Power On Reset (POR). - * @param __RTCCLKSource__ specifies the RTC clock source. - * This parameter can be one of the following values: - * @arg @ref RCC_RTCCLKSOURCE_NO_CLK : No clock selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_LSE : LSE selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_LSI : LSI selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() - * @note If the LSE or LSI is used as RTC clock source, the RTC continues to - * work in STOP and STANDBY modes, and can be used as wake-up source. - * However, when the HSE clock is used as RTC clock source, the RTC - * cannot be used in STOP and STANDBY modes. - * @note The maximum input clock frequency for RTC is 1MHz (when using HSE as - * RTC clock source). - */ -#define __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__) (((__RTCCLKSource__) & RCC_BDCR_RTCSEL) == RCC_BDCR_RTCSEL) ? \ - MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, ((__RTCCLKSource__) & 0xFFFFCFFU)) : CLEAR_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) - -#define __HAL_RCC_RTC_CONFIG(__RTCCLKSource__) do { __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__); \ - RCC->BDCR |= ((__RTCCLKSource__) & 0x00000FFFU); \ - } while(0U) - -/** @brief Macro to get the RTC clock source. - * @retval The clock source can be one of the following values: - * @arg @ref RCC_RTCCLKSOURCE_NO_CLK No clock selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_LSE LSE selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_LSI LSI selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() - */ -#define __HAL_RCC_GET_RTC_SOURCE() (READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)) - -/** - * @brief Get the RTC and HSE clock divider (RTCPRE). - * @retval Returned value can be one of the following values: - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() - */ -#define __HAL_RCC_GET_RTC_HSE_PRESCALER() (READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) | RCC_BDCR_RTCSEL) - -/** @brief Macros to force or release the Backup domain reset. - * @note This function resets the RTC peripheral (including the backup registers) - * and the RTC clock source selection in RCC_CSR register. - * @note The BKPSRAM is not affected by this reset. - */ -#define __HAL_RCC_BACKUPRESET_FORCE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = ENABLE) -#define __HAL_RCC_BACKUPRESET_RELEASE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = DISABLE) -/** - * @} - */ - -/** @defgroup RCC_PLL_Configuration PLL Configuration - * @{ - */ - -/** @brief Macros to enable or disable the main PLL. - * @note After enabling the main PLL, the application software should wait on - * PLLRDY flag to be set indicating that PLL clock is stable and can - * be used as system clock source. - * @note The main PLL can not be disabled if it is used as system clock source - * @note The main PLL is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLL_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = ENABLE) -#define __HAL_RCC_PLL_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = DISABLE) - -/** @brief Macro to configure the PLL clock source. - * @note This function must be used only when the main PLL is disabled. - * @param __PLLSOURCE__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * - */ -#define __HAL_RCC_PLL_PLLSOURCE_CONFIG(__PLLSOURCE__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (__PLLSOURCE__)) - -/** @brief Macro to configure the PLL multiplication factor. - * @note This function must be used only when the main PLL is disabled. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * - */ -#define __HAL_RCC_PLL_PLLM_CONFIG(__PLLM__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, (__PLLM__)) -/** - * @} - */ - -/** @defgroup RCC_Get_Clock_source Get Clock source - * @{ - */ -/** - * @brief Macro to configure the system clock source. - * @param __RCC_SYSCLKSOURCE__ specifies the system clock source. - * This parameter can be one of the following values: - * - RCC_SYSCLKSOURCE_HSI: HSI oscillator is used as system clock source. - * - RCC_SYSCLKSOURCE_HSE: HSE oscillator is used as system clock source. - * - RCC_SYSCLKSOURCE_PLLCLK: PLL output is used as system clock source. - * - RCC_SYSCLKSOURCE_PLLRCLK: PLLR output is used as system clock source. This - * parameter is available only for STM32F446xx devices. - */ -#define __HAL_RCC_SYSCLK_CONFIG(__RCC_SYSCLKSOURCE__) MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (__RCC_SYSCLKSOURCE__)) - -/** @brief Macro to get the clock source used as system clock. - * @retval The clock source used as system clock. The returned value can be one - * of the following: - * - RCC_SYSCLKSOURCE_STATUS_HSI: HSI used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_HSE: HSE used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_PLLCLK: PLL used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_PLLRCLK: PLLR used as system clock. This parameter - * is available only for STM32F446xx devices. - */ -#define __HAL_RCC_GET_SYSCLK_SOURCE() (RCC->CFGR & RCC_CFGR_SWS) - -/** @brief Macro to get the oscillator used as PLL clock source. - * @retval The oscillator used as PLL clock source. The returned value can be one - * of the following: - * - RCC_PLLSOURCE_HSI: HSI oscillator is used as PLL clock source. - * - RCC_PLLSOURCE_HSE: HSE oscillator is used as PLL clock source. - */ -#define __HAL_RCC_GET_PLL_OSCSOURCE() ((uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC)) -/** - * @} - */ - -/** @defgroup RCCEx_MCOx_Clock_Config RCC Extended MCOx Clock Config - * @{ - */ - -/** @brief Macro to configure the MCO1 clock. - * @param __MCOCLKSOURCE__ specifies the MCO clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source - * @param __MCODIV__ specifies the MCO clock prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - */ -#define __HAL_RCC_MCO1_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), ((__MCOCLKSOURCE__) | (__MCODIV__))) - -/** @brief Macro to configure the MCO2 clock. - * @param __MCOCLKSOURCE__ specifies the MCO clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx - * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices - * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source - * @param __MCODIV__ specifies the MCO clock prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - * @note For STM32F410Rx devices, to output I2SCLK clock on MCO2, you should have - * at least one of the SPI clocks enabled (SPI1, SPI2 or SPI5). - */ -#define __HAL_RCC_MCO2_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), ((__MCOCLKSOURCE__) | ((__MCODIV__) << 3U))); -/** - * @} - */ - -/** @defgroup RCC_Flags_Interrupts_Management Flags Interrupts Management - * @brief macros to manage the specified RCC Flags and interrupts. - * @{ - */ - -/** @brief Enable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to enable - * the selected interrupts). - * @param __INTERRUPT__ specifies the RCC interrupt sources to be enabled. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - */ -#define __HAL_RCC_ENABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS |= (__INTERRUPT__)) - -/** @brief Disable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to disable - * the selected interrupts). - * @param __INTERRUPT__ specifies the RCC interrupt sources to be disabled. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - */ -#define __HAL_RCC_DISABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS &= (uint8_t)(~(__INTERRUPT__))) - -/** @brief Clear the RCC's interrupt pending bits (Perform Byte access to RCC_CIR[23:16] - * bits to clear the selected interrupt pending bits. - * @param __INTERRUPT__ specifies the interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - * @arg RCC_IT_CSS: Clock Security System interrupt - */ -#define __HAL_RCC_CLEAR_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE2_ADDRESS = (__INTERRUPT__)) - -/** @brief Check the RCC's interrupt has occurred or not. - * @param __INTERRUPT__ specifies the RCC interrupt source to check. - * This parameter can be one of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - * @arg RCC_IT_CSS: Clock Security System interrupt - * @retval The new state of __INTERRUPT__ (TRUE or FALSE). - */ -#define __HAL_RCC_GET_IT(__INTERRUPT__) ((RCC->CIR & (__INTERRUPT__)) == (__INTERRUPT__)) - -/** @brief Set RMVF bit to clear the reset flags: RCC_FLAG_PINRST, RCC_FLAG_PORRST, - * RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST and RCC_FLAG_LPWRRST. - */ -#define __HAL_RCC_CLEAR_RESET_FLAGS() (RCC->CSR |= RCC_CSR_RMVF) - -/** @brief Check RCC flag is set or not. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready. - * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready. - * @arg RCC_FLAG_PLLRDY: Main PLL clock ready. - * @arg RCC_FLAG_PLLI2SRDY: PLLI2S clock ready. - * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready. - * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready. - * @arg RCC_FLAG_BORRST: POR/PDR or BOR reset. - * @arg RCC_FLAG_PINRST: Pin reset. - * @arg RCC_FLAG_PORRST: POR/PDR reset. - * @arg RCC_FLAG_SFTRST: Software reset. - * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset. - * @arg RCC_FLAG_WWDGRST: Window Watchdog reset. - * @arg RCC_FLAG_LPWRRST: Low Power reset. - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define RCC_FLAG_MASK ((uint8_t)0x1FU) -#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U)\ - == 1U)? RCC->CR :((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :((((__FLAG__) >> 5U) == 3U)? RCC->CSR :RCC->CIR))) &\ - (1U << ((__FLAG__) & RCC_FLAG_MASK)))!= 0U)? 1U : 0U) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup RCC_Exported_Functions - * @{ - */ - -/** @addtogroup RCC_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions ******************************/ -HAL_StatusTypeDef HAL_RCC_DeInit(void); -HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct); -HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency); -/** - * @} - */ - -/** @addtogroup RCC_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions ************************************************/ -void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv); -void HAL_RCC_EnableCSS(void); -void HAL_RCC_DisableCSS(void); -uint32_t HAL_RCC_GetSysClockFreq(void); -uint32_t HAL_RCC_GetHCLKFreq(void); -uint32_t HAL_RCC_GetPCLK1Freq(void); -uint32_t HAL_RCC_GetPCLK2Freq(void); -void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct); -void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency); - -/* CSS NMI IRQ handler */ -void HAL_RCC_NMI_IRQHandler(void); - -/* User Callbacks in non blocking mode (IT mode) */ -void HAL_RCC_CSSCallback(void); - -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup RCC_Private_Constants RCC Private Constants - * @{ - */ - -/** @defgroup RCC_BitAddress_AliasRegion RCC BitAddress AliasRegion - * @brief RCC registers bit address in the alias region - * @{ - */ -#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) -/* --- CR Register --- */ -/* Alias word address of HSION bit */ -#define RCC_CR_OFFSET (RCC_OFFSET + 0x00U) -#define RCC_HSION_BIT_NUMBER 0x00U -#define RCC_CR_HSION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_HSION_BIT_NUMBER * 4U)) -/* Alias word address of CSSON bit */ -#define RCC_CSSON_BIT_NUMBER 0x13U -#define RCC_CR_CSSON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_CSSON_BIT_NUMBER * 4U)) -/* Alias word address of PLLON bit */ -#define RCC_PLLON_BIT_NUMBER 0x18U -#define RCC_CR_PLLON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLON_BIT_NUMBER * 4U)) - -/* --- BDCR Register --- */ -/* Alias word address of RTCEN bit */ -#define RCC_BDCR_OFFSET (RCC_OFFSET + 0x70U) -#define RCC_RTCEN_BIT_NUMBER 0x0FU -#define RCC_BDCR_RTCEN_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_RTCEN_BIT_NUMBER * 4U)) -/* Alias word address of BDRST bit */ -#define RCC_BDRST_BIT_NUMBER 0x10U -#define RCC_BDCR_BDRST_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_BDRST_BIT_NUMBER * 4U)) - -/* --- CSR Register --- */ -/* Alias word address of LSION bit */ -#define RCC_CSR_OFFSET (RCC_OFFSET + 0x74U) -#define RCC_LSION_BIT_NUMBER 0x00U -#define RCC_CSR_LSION_BB (PERIPH_BB_BASE + (RCC_CSR_OFFSET * 32U) + (RCC_LSION_BIT_NUMBER * 4U)) - -/* CR register byte 3 (Bits[23:16]) base address */ -#define RCC_CR_BYTE2_ADDRESS 0x40023802U - -/* CIR register byte 2 (Bits[15:8]) base address */ -#define RCC_CIR_BYTE1_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x01U)) - -/* CIR register byte 3 (Bits[23:16]) base address */ -#define RCC_CIR_BYTE2_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x02U)) - -/* BDCR register base address */ -#define RCC_BDCR_BYTE0_ADDRESS (PERIPH_BASE + RCC_BDCR_OFFSET) - -#define RCC_DBP_TIMEOUT_VALUE 2U -#define RCC_LSE_TIMEOUT_VALUE LSE_STARTUP_TIMEOUT - -#define HSE_TIMEOUT_VALUE HSE_STARTUP_TIMEOUT -#define HSI_TIMEOUT_VALUE 2U /* 2 ms */ -#define LSI_TIMEOUT_VALUE 2U /* 2 ms */ -#define CLOCKSWITCH_TIMEOUT_VALUE 5000U /* 5 s */ - -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup RCC_Private_Macros RCC Private Macros - * @{ - */ - -/** @defgroup RCC_IS_RCC_Definitions RCC Private macros to check input parameters - * @{ - */ -#define IS_RCC_OSCILLATORTYPE(OSCILLATOR) ((OSCILLATOR) <= 15U) - -#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ - ((HSE) == RCC_HSE_BYPASS)) - -#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ - ((LSE) == RCC_LSE_BYPASS)) - -#define IS_RCC_HSI(HSI) (((HSI) == RCC_HSI_OFF) || ((HSI) == RCC_HSI_ON)) - -#define IS_RCC_LSI(LSI) (((LSI) == RCC_LSI_OFF) || ((LSI) == RCC_LSI_ON)) - -#define IS_RCC_PLL(PLL) (((PLL) == RCC_PLL_NONE) ||((PLL) == RCC_PLL_OFF) || ((PLL) == RCC_PLL_ON)) - -#define IS_RCC_PLLSOURCE(SOURCE) (((SOURCE) == RCC_PLLSOURCE_HSI) || \ - ((SOURCE) == RCC_PLLSOURCE_HSE)) - -#define IS_RCC_SYSCLKSOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSOURCE_HSI) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_HSE) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_PLLCLK) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_PLLRCLK)) - -#define IS_RCC_RTCCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_RTCCLKSOURCE_LSE) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_LSI) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV2) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV3) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV4) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV5) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV6) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV7) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV8) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV9) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV10) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV11) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV12) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV13) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV14) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV15) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV16) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV17) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV18) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV19) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV20) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV21) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV22) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV23) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV24) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV25) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV26) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV27) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV28) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV29) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV30) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV31)) - -#define IS_RCC_PLLM_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 63U)) - -#define IS_RCC_PLLP_VALUE(VALUE) (((VALUE) == 2U) || ((VALUE) == 4U) || ((VALUE) == 6U) || ((VALUE) == 8U)) - -#define IS_RCC_PLLQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_DIV1) || ((HCLK) == RCC_SYSCLK_DIV2) || \ - ((HCLK) == RCC_SYSCLK_DIV4) || ((HCLK) == RCC_SYSCLK_DIV8) || \ - ((HCLK) == RCC_SYSCLK_DIV16) || ((HCLK) == RCC_SYSCLK_DIV64) || \ - ((HCLK) == RCC_SYSCLK_DIV128) || ((HCLK) == RCC_SYSCLK_DIV256) || \ - ((HCLK) == RCC_SYSCLK_DIV512)) - -#define IS_RCC_CLOCKTYPE(CLK) ((1U <= (CLK)) && ((CLK) <= 15U)) - -#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_DIV1) || ((PCLK) == RCC_HCLK_DIV2) || \ - ((PCLK) == RCC_HCLK_DIV4) || ((PCLK) == RCC_HCLK_DIV8) || \ - ((PCLK) == RCC_HCLK_DIV16)) - -#define IS_RCC_MCO(MCOx) (((MCOx) == RCC_MCO1) || ((MCOx) == RCC_MCO2)) - -#define IS_RCC_MCO1SOURCE(SOURCE) (((SOURCE) == RCC_MCO1SOURCE_HSI) || ((SOURCE) == RCC_MCO1SOURCE_LSE) || \ - ((SOURCE) == RCC_MCO1SOURCE_HSE) || ((SOURCE) == RCC_MCO1SOURCE_PLLCLK)) - -#define IS_RCC_MCODIV(DIV) (((DIV) == RCC_MCODIV_1) || ((DIV) == RCC_MCODIV_2) || \ - ((DIV) == RCC_MCODIV_3) || ((DIV) == RCC_MCODIV_4) || \ - ((DIV) == RCC_MCODIV_5)) -#define IS_RCC_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1FU) - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_RCC_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h deleted file mode 100644 index 3b62134..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h +++ /dev/null @@ -1,7190 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc_ex.h - * @author MCD Application Team - * @brief Header file of RCC HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_RCC_EX_H -#define __STM32F4xx_HAL_RCC_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup RCCEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Types RCCEx Exported Types - * @{ - */ - -/** - * @brief RCC PLL configuration structure definition - */ -typedef struct -{ - uint32_t PLLState; /*!< The new state of the PLL. - This parameter can be a value of @ref RCC_PLL_Config */ - - uint32_t PLLSource; /*!< RCC_PLLSource: PLL entry clock source. - This parameter must be a value of @ref RCC_PLL_Clock_Source */ - - uint32_t PLLM; /*!< PLLM: Division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 0 and Max_Data = 63 */ - - uint32_t PLLN; /*!< PLLN: Multiplication factor for PLL VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 - except for STM32F411xE devices where the Min_Data = 192 */ - - uint32_t PLLP; /*!< PLLP: Division factor for main system clock (SYSCLK). - This parameter must be a value of @ref RCC_PLLP_Clock_Divider */ - - uint32_t PLLQ; /*!< PLLQ: Division factor for OTG FS, SDIO and RNG clocks. - This parameter must be a number between Min_Data = 2 and Max_Data = 15 */ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) - uint32_t PLLR; /*!< PLLR: PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. - This parameter is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx - and STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. - This parameter must be a number between Min_Data = 2 and Max_Data = 7 */ -#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -} RCC_PLLInitTypeDef; - -#if defined(STM32F446xx) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLI2SP; /*!< Specifies division factor for SPDIFRX Clock. - This parameter must be a value of @ref RCCEx_PLLI2SP_Clock_Divider */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ -} RCC_PLLI2SInitTypeDef; - -/** - * @brief PLLSAI Clock structure definition - */ -typedef struct -{ - uint32_t PLLSAIM; /*!< Specifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS, SDIO and RNG clocks. - This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ - - uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ -} RCC_PLLSAIInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ - - uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ - - uint32_t Sai1ClockSelection; /*!< Specifies SAI1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_SAI1_Clock_Source */ - - uint32_t Sai2ClockSelection; /*!< Specifies SAI2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_SAI2_Clock_Source */ - - uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ - - uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ - - uint32_t CecClockSelection; /*!< Specifies CEC Clock Source Selection. - This parameter can be a value of @ref RCCEx_CEC_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint32_t SpdifClockSelection; /*!< Specifies SPDIFRX Clock Source Selection. - This parameter can be a value of @ref RCCEx_SPDIFRX_Clock_Source */ - - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -} RCC_PeriphCLKInitTypeDef; -#endif /* STM32F446xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - uint32_t I2SClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2S_APB_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -} RCC_PeriphCLKInitTypeDef; -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ -} RCC_PLLI2SInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ - -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t PLLDivR; /*!< Specifies the PLL division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLL is selected as Clock Source SAI */ - - uint32_t PLLI2SDivR; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ -#endif /* STM32F413xx || STM32F423xx */ - - uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ - - uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint32_t Dfsdm1ClockSelection; /*!< Specifies DFSDM1 Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM1_Kernel_Clock_Source */ - - uint32_t Dfsdm1AudioClockSelection;/*!< Specifies DFSDM1 Audio Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM1_Audio_Clock_Source */ - -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t Dfsdm2ClockSelection; /*!< Specifies DFSDM2 Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM2_Kernel_Clock_Source */ - - uint32_t Dfsdm2AudioClockSelection;/*!< Specifies DFSDM2 Audio Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM2_Audio_Clock_Source */ - - uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ - - uint32_t SaiAClockSelection; /*!< Specifies SAI1_A Clock Prescalers Selection - This parameter can be a value of @ref RCCEx_SAI1_BlockA_Clock_Source */ - - uint32_t SaiBClockSelection; /*!< Specifies SAI1_B Clock Prescalers Selection - This parameter can be a value of @ref RCCEx_SAI1_BlockB_Clock_Source */ -#endif /* STM32F413xx || STM32F423xx */ - - uint32_t PLLI2SSelection; /*!< Specifies PLL I2S Clock Source Selection. - This parameter can be a value of @ref RCCEx_PLL_I2S_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -} RCC_PeriphCLKInitTypeDef; -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI1 clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ -} RCC_PLLI2SInitTypeDef; - -/** - * @brief PLLSAI Clock structure definition - */ -typedef struct -{ - uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432. - This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ -#if defined(STM32F469xx) || defined(STM32F479xx) - uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS and SDIO clocks. - This parameter is only available in STM32F469xx/STM32F479xx devices. - This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ -#endif /* STM32F469xx || STM32F479xx */ - - uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI1 clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ - - uint32_t PLLSAIR; /*!< specifies the division factor for LTDC clock - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLSAI is selected as Clock Source LTDC */ - -} RCC_PLLSAIInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ - - uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ - - uint32_t PLLSAIDivR; /*!< Specifies the PLLSAI division factor for LTDC clock. - This parameter must be one value of @ref RCCEx_PLLSAI_DIVR */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Prescalers Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -#if defined(STM32F469xx) || defined(STM32F479xx) - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ -#endif /* STM32F469xx || STM32F479xx */ -} RCC_PeriphCLKInitTypeDef; - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ -#if defined(STM32F411xE) - uint32_t PLLI2SM; /*!< PLLM: Division factor for PLLI2S VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 62 */ -#endif /* STM32F411xE */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 - Except for STM32F411xE devices where the Min_Data = 192. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - -} RCC_PLLI2SInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -} RCC_PeriphCLKInitTypeDef; -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Constants RCCEx Exported Constants - * @{ - */ - -/** @defgroup RCCEx_Periph_Clock_Selection RCC Periph Clock Selection - * @{ - */ -/* Peripheral Clock source for STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -#define RCC_PERIPHCLK_I2S_APB1 0x00000001U -#define RCC_PERIPHCLK_I2S_APB2 0x00000002U -#define RCC_PERIPHCLK_TIM 0x00000004U -#define RCC_PERIPHCLK_RTC 0x00000008U -#define RCC_PERIPHCLK_FMPI2C1 0x00000010U -#define RCC_PERIPHCLK_CLK48 0x00000020U -#define RCC_PERIPHCLK_SDIO 0x00000040U -#define RCC_PERIPHCLK_PLLI2S 0x00000080U -#define RCC_PERIPHCLK_DFSDM1 0x00000100U -#define RCC_PERIPHCLK_DFSDM1_AUDIO 0x00000200U -#endif /* STM32F412Zx || STM32F412Vx) || STM32F412Rx || STM32F412Cx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define RCC_PERIPHCLK_DFSDM2 0x00000400U -#define RCC_PERIPHCLK_DFSDM2_AUDIO 0x00000800U -#define RCC_PERIPHCLK_LPTIM1 0x00001000U -#define RCC_PERIPHCLK_SAIA 0x00002000U -#define RCC_PERIPHCLK_SAIB 0x00004000U -#endif /* STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- Peripheral Clock source for STM32F410xx ----------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_TIM 0x00000002U -#define RCC_PERIPHCLK_RTC 0x00000004U -#define RCC_PERIPHCLK_FMPI2C1 0x00000008U -#define RCC_PERIPHCLK_LPTIM1 0x00000010U -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- Peripheral Clock source for STM32F446xx ----------------*/ -#if defined(STM32F446xx) -#define RCC_PERIPHCLK_I2S_APB1 0x00000001U -#define RCC_PERIPHCLK_I2S_APB2 0x00000002U -#define RCC_PERIPHCLK_SAI1 0x00000004U -#define RCC_PERIPHCLK_SAI2 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_CEC 0x00000040U -#define RCC_PERIPHCLK_FMPI2C1 0x00000080U -#define RCC_PERIPHCLK_CLK48 0x00000100U -#define RCC_PERIPHCLK_SDIO 0x00000200U -#define RCC_PERIPHCLK_SPDIFRX 0x00000400U -#define RCC_PERIPHCLK_PLLI2S 0x00000800U -#endif /* STM32F446xx */ -/*-----------------------------------------------------------------------------*/ - -/*----------- Peripheral Clock source for STM32F469xx/STM32F479xx -------------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U -#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U -#define RCC_PERIPHCLK_LTDC 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_PLLI2S 0x00000040U -#define RCC_PERIPHCLK_CLK48 0x00000080U -#define RCC_PERIPHCLK_SDIO 0x00000100U -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*-------- Peripheral Clock source for STM32F42xxx/STM32F43xxx ---------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U -#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U -#define RCC_PERIPHCLK_LTDC 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_PLLI2S 0x00000040U -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*-------- Peripheral Clock source for STM32F40xxx/STM32F41xxx ---------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_RTC 0x00000002U -#define RCC_PERIPHCLK_PLLI2S 0x00000004U -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define RCC_PERIPHCLK_TIM 0x00000008U -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -/*----------------------------------------------------------------------------*/ -/** - * @} - */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ - defined(STM32F479xx) -/** @defgroup RCCEx_I2S_Clock_Source I2S Clock Source - * @{ - */ -#define RCC_I2SCLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SCLKSOURCE_EXT RCC_CFGR_I2SSRC -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */ - -/** @defgroup RCCEx_PLLSAI_DIVR RCC PLLSAI DIVR - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PLLSAIDIVR_2 0x00000000U -#define RCC_PLLSAIDIVR_4 0x00010000U -#define RCC_PLLSAIDIVR_8 0x00020000U -#define RCC_PLLSAIDIVR_16 0x00030000U -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_PLLI2SP_Clock_Divider RCC PLLI2SP Clock Divider - * @{ - */ -#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define RCC_PLLI2SP_DIV2 0x00000002U -#define RCC_PLLI2SP_DIV4 0x00000004U -#define RCC_PLLI2SP_DIV6 0x00000006U -#define RCC_PLLI2SP_DIV8 0x00000008U -#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/** - * @} - */ - -/** @defgroup RCCEx_PLLSAIP_Clock_Divider RCC PLLSAIP Clock Divider - * @{ - */ -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PLLSAIP_DIV2 0x00000002U -#define RCC_PLLSAIP_DIV4 0x00000004U -#define RCC_PLLSAIP_DIV6 0x00000006U -#define RCC_PLLSAIP_DIV8 0x00000008U -#endif /* STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_SAI_BlockA_Clock_Source RCC SAI BlockA Clock Source - * @{ - */ -#define RCC_SAIACLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAIACLKSOURCE_PLLI2S 0x00100000U -#define RCC_SAIACLKSOURCE_EXT 0x00200000U -/** - * @} - */ - -/** @defgroup RCCEx_SAI_BlockB_Clock_Source RCC SAI BlockB Clock Source - * @{ - */ -#define RCC_SAIBCLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAIBCLKSOURCE_PLLI2S 0x00400000U -#define RCC_SAIBCLKSOURCE_EXT 0x00800000U -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_SDIOSEL) -/** - * @} - */ - -/** @defgroup RCCEx_DSI_Clock_Source RCC DSI Clock Source - * @{ - */ -#define RCC_DSICLKSOURCE_DSIPHY 0x00000000U -#define RCC_DSICLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_DSISEL) -/** - * @} - */ -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F446xx) -/** @defgroup RCCEx_SAI1_Clock_Source RCC SAI1 Clock Source - * @{ - */ -#define RCC_SAI1CLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAI1CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI1SRC_0) -#define RCC_SAI1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1SRC_1) -#define RCC_SAI1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_SAI2_Clock_Source RCC SAI2 Clock Source - * @{ - */ -#define RCC_SAI2CLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAI2CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI2SRC_0) -#define RCC_SAI2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI2SRC_1) -#define RCC_SAI2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source - * @{ - */ -#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) -#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) -#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source - * @{ - */ -#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) -#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) -#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_CEC_Clock_Source RCC CEC Clock Source - * @{ - */ -#define RCC_CECCLKSOURCE_HSI 0x00000000U -#define RCC_CECCLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_CECSEL) -/** - * @} - */ - -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR2_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SPDIFRX_Clock_Source RCC SPDIFRX Clock Source - * @{ - */ -#define RCC_SPDIFRXCLKSOURCE_PLLR 0x00000000U -#define RCC_SPDIFRXCLKSOURCE_PLLI2SP ((uint32_t)RCC_DCKCFGR2_SPDIFRXSEL) -/** - * @} - */ - -#endif /* STM32F446xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_SAI1_BlockA_Clock_Source RCC SAI BlockA Clock Source - * @{ - */ -#define RCC_SAIACLKSOURCE_PLLI2SR 0x00000000U -#define RCC_SAIACLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0) -#define RCC_SAIACLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1ASRC_1) -#define RCC_SAIACLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0 | RCC_DCKCFGR_SAI1ASRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_SAI1_BlockB_Clock_Source RCC SAI BlockB Clock Source - * @{ - */ -#define RCC_SAIBCLKSOURCE_PLLI2SR 0x00000000U -#define RCC_SAIBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0) -#define RCC_SAIBCLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1BSRC_1) -#define RCC_SAIBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0 | RCC_DCKCFGR_SAI1BSRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source - * @{ - */ -#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U -#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) -#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) -#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) -/** - * @} - */ - - -/** @defgroup RCCEx_DFSDM2_Audio_Clock_Source RCC DFSDM2 Audio Clock Source - * @{ - */ -#define RCC_DFSDM2AUDIOCLKSOURCE_I2S1 0x00000000U -#define RCC_DFSDM2AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM2ASEL) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM2_Kernel_Clock_Source RCC DFSDM2 Kernel Clock Source - * @{ - */ -#define RCC_DFSDM2CLKSOURCE_PCLK2 0x00000000U -#define RCC_DFSDM2CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) -/** - * @} - */ - -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_PLL_I2S_Clock_Source PLL I2S Clock Source - * @{ - */ -#define RCC_PLLI2SCLKSOURCE_PLLSRC 0x00000000U -#define RCC_PLLI2SCLKSOURCE_EXT ((uint32_t)RCC_PLLI2SCFGR_PLLI2SSRC) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM1_Audio_Clock_Source RCC DFSDM1 Audio Clock Source - * @{ - */ -#define RCC_DFSDM1AUDIOCLKSOURCE_I2S1 0x00000000U -#define RCC_DFSDM1AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM1ASEL) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM1_Kernel_Clock_Source RCC DFSDM1 Kernel Clock Source - * @{ - */ -#define RCC_DFSDM1CLKSOURCE_PCLK2 0x00000000U -#define RCC_DFSDM1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source - * @{ - */ -#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) -#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) -#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source - * @{ - */ -#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) -#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) -#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLI2SQ ((uint32_t)RCC_DCKCFGR2_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) -/** - * @} - */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) - -/** @defgroup RCCEx_I2S_APB_Clock_Source RCC I2S APB Clock Source - * @{ - */ -#define RCC_I2SAPBCLKSOURCE_PLLR 0x00000000U -#define RCC_I2SAPBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2SSRC_0) -#define RCC_I2SAPBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2SSRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source - * @{ - */ -#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U -#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) -#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) -#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_TIM_PRescaler_Selection RCC TIM PRescaler Selection - * @{ - */ -#define RCC_TIMPRES_DESACTIVATED ((uint8_t)0x00) -#define RCC_TIMPRES_ACTIVATED ((uint8_t)0x01) -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -/** @defgroup RCCEx_LSE_Dual_Mode_Selection RCC LSE Dual Mode Selection - * @{ - */ -#define RCC_LSE_LOWPOWER_MODE ((uint8_t)0x00) -#define RCC_LSE_HIGHDRIVE_MODE ((uint8_t)0x01) -/** - * @} - */ -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx ||\ - STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source - * @{ - */ -#define RCC_MCO2SOURCE_SYSCLK 0x00000000U -#define RCC_MCO2SOURCE_PLLI2SCLK RCC_CFGR_MCO2_0 -#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 -#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F413xx | STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source - * @{ - */ -#define RCC_MCO2SOURCE_SYSCLK 0x00000000U -#define RCC_MCO2SOURCE_I2SCLK RCC_CFGR_MCO2_0 -#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 -#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Macros RCCEx Exported Macros - * @{ - */ -/*------------------- STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx --------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOJ_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOK_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA2D_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) -#define __HAL_RCC_GPIOJ_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOJEN)) -#define __HAL_RCC_GPIOK_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOKEN)) -#define __HAL_RCC_DMA2D_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2DEN)) -#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) -#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) -#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) -#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) - -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETH_CLK_ENABLE() do { \ - __HAL_RCC_ETHMAC_CLK_ENABLE(); \ - __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ - __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ - } while(0U) -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETH_CLK_DISABLE() do { \ - __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ - __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ - __HAL_RCC_ETHMAC_CLK_DISABLE(); \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) -#define __HAL_RCC_GPIOJ_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) != RESET) -#define __HAL_RCC_GPIOK_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) != RESET) -#define __HAL_RCC_DMA2D_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) != RESET) -#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) -#define __HAL_RCC_GPIOJ_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) == RESET) -#define __HAL_RCC_GPIOK_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) == RESET) -#define __HAL_RCC_DMA2D_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) == RESET) -#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_HASH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) -#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ - -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) -#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) - -#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) -#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) -#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) -#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) -#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) -#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) -#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#define __HAL_RCC_SPI6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI6EN)) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_LTDC_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_LTDCEN)) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_DSI_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DSIEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#define __HAL_RCC_SPI6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) != RESET) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))!= RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))== RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#define __HAL_RCC_SPI6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) == RESET) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) != RESET) -#define __HAL_RCC_LTDC_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) == RESET) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) != RESET) -#define __HAL_RCC_DSI_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) == RESET) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x22E017FFU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_GPIOJ_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOJRST)) -#define __HAL_RCC_GPIOK_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOKRST)) -#define __HAL_RCC_DMA2D_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2DRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_GPIOJ_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOJRST)) -#define __HAL_RCC_GPIOK_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOKRST)) -#define __HAL_RCC_DMA2D_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2DRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F469xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000C1U) -#endif /* STM32F427xx || STM32F429xx || STM32F469xx */ -#if defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000F1U) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) - -#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000001U) -#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000003U) -#endif /* STM32F469xx || STM32F479xx */ -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xF6FEC9FFU) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x0C777933U) -#endif /* STM32F469xx || STM32F479xx */ -#if defined(STM32F429xx) || defined(STM32F439xx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x04777933U) -#endif /* STM32F429xx || STM32F439xx */ -#if defined(STM32F427xx) || defined(STM32F437xx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00777933U) -#endif /* STM32F427xx || STM32F437xx */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI6RST)) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI6RST)) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_LTDCRST)) -#define __HAL_RCC_LTDC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_LTDCRST)) -#endif /* STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DSIRST)) -#define __HAL_RCC_DSI_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DSIRST)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_GPIOJ_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOJLPEN)) -#define __HAL_RCC_GPIOK_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOKLPEN)) -#define __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM3LPEN)) -#define __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2DLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_GPIOJ_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOJLPEN)) -#define __HAL_RCC_GPIOK_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOKLPEN)) -#define __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2DLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) - -#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SPI6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI6LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SPI6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI6LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_LTDCLPEN)) - -#define __HAL_RCC_LTDC_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_LTDCLPEN)) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DSILPEN)) -#define __HAL_RCC_DSI_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DSILPEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------------- STM32F40xxx/STM32F41xxx-----------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#if defined(STM32F407xx)|| defined(STM32F417xx) -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETH_CLK_ENABLE() do { \ - __HAL_RCC_ETHMAC_CLK_ENABLE(); \ - __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ - __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ - } while(0U) - -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) -#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) -#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) -#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) -#define __HAL_RCC_ETH_CLK_DISABLE() do { \ - __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ - __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ - __HAL_RCC_ETHMAC_CLK_DISABLE(); \ - } while(0U) -#endif /* STM32F407xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN))== RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#if defined(STM32F407xx)|| defined(STM32F417xx) -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) -#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) -#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) -#endif /* STM32F407xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_HASH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) -#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) -#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) - -#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) -#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) -#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#if defined (STM32F405xx) || defined (STM32F415xx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x206011FFU) -#endif /* STM32F405xx || STM32F415xx */ -#if defined (STM32F407xx) || defined (STM32F417xx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x226011FFU) -#endif /* STM32F407xx || STM32F417xx */ -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#if defined (STM32F415xx) || defined (STM32F417xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000F1U) -#endif /* STM32F415xx || STM32F417xx */ -#if defined (STM32F405xx) || defined (STM32F407xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000C1U) -#endif /* STM32F405xx || STM32F407xx */ -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) - -#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) -#endif /* STM32F415xx || STM32F417xx */ - -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000001U) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xF6FEC9FFU) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x04777933U) -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) - -#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------- STM32F401xE/STM32F401xC --------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -/** - * @} - */ -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060109FU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x00000080U) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x10E2C80FU) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00077931U) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -/** - * @} - */ -#endif /* STM32F401xC || STM32F401xE*/ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F410xx -------------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) != RESET) - -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB1) peripheral clock. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) -#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) -#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) -#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) - -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x80601087U) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_RNGRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() -#define __HAL_RCC_AHB2_RELEASE_RESET() -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() -#define __HAL_RCC_AHB3_RELEASE_RESET() -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#if defined (STM32F410Rx) || defined (STM32F410Cx) -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x31624A18U) -#endif /* STM32F410Rx || STM32F410Cx */ -#if defined (STM32F410Tx) -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x31620A18U) -#endif /* STM32F410Tx */ -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) - -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#if defined (STM32F410Rx) || defined (STM32F410Cx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00155131U) -#endif /* STM32F410Rx || STM32F410Cx */ -#if defined (STM32F410Tx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00055111U) -#endif /* STM32F410Tx */ -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_RNGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_RNGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) -#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) - -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) -#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) -/** - * @} - */ - -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F411xx -------------------------------*/ -#if defined(STM32F411xE) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEX_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060109FU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x00000080U) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x10E2C80FU) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00177931U) -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -/** - * @} - */ -#endif /* STM32F411xE */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F446xx -----------------------------*/ -#if defined(STM32F446xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN))!= RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) - -#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPDIFRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CEC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_SPDIFRX_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPDIFRXEN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_CEC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CECEN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_SPDIFRX_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_CEC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_SPDIFRX_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_CEC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) -#define __HAL_RCC_SAI2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI2EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#define __HAL_RCC_SAI2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) -#define __HAL_RCC_SAI2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x206010FFU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x00000081U) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000003U) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) - -#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x3FFFC9FFU) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_SPDIFRX_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPDIFRXRST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_CEC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CECRST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_SPDIFRX_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPDIFRXRST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_CEC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CECRST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00C77933U) -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SAI2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI2RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SAI2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI2RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) - -#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_SPDIFRX_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPDIFRXLPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_CEC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CECLPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_SPDIFRX_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPDIFRXLPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_CEC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CECLPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SAI2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI2LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SAI2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI2LPEN)) -/** - * @} - */ - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*-------STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx-------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_AES_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_AESEN)) -#endif /* STM32F423xx */ - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) - -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) != RESET) -#define __HAL_RCC_AES_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) == RESET) -#endif /* STM32F423xx */ - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) - -#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN3EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) -#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) -#endif /* STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN))!= RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) -#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) -#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) -#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART9EN)) -#define __HAL_RCC_UART10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART10EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM1EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM2EN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) != RESET) -#define __HAL_RCC_UART10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) == RESET) -#define __HAL_RCC_UART10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#if defined (STM32F412Zx) || defined(STM32F413xx) || defined (STM32F423xx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x006010FFU) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined (STM32F412Cx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x00601087U) -#endif /* STM32F412Cx */ -#if defined (STM32F412Vx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060109FU) -#endif /* STM32F412Vx */ -#if defined (STM32F412Rx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060108FU) -#endif /* STM32F412Rx */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000D0U) -#define __HAL_RCC_AES_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_AESRST)) -#define __HAL_RCC_AES_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_AESRST)) -#else -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000C0U) -#endif /* STM32F423xx */ -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) - -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000003U) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) - -#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Cx) -#define __HAL_RCC_AHB3_FORCE_RESET() -#define __HAL_RCC_AHB3_RELEASE_RESET() - -#define __HAL_RCC_FSMC_FORCE_RESET() -#define __HAL_RCC_QSPI_FORCE_RESET() - -#define __HAL_RCC_FSMC_RELEASE_RESET() -#define __HAL_RCC_QSPI_RELEASE_RESET() -#endif /* STM32F412Cx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xFFFECBFFU) -#endif /* STM32F413xx || STM32F423xx */ -#if defined (STM32F412Zx) || defined (STM32F412Vx) || defined (STM32F412Rx) || defined (STM32F412Cx) -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x17E6C9FFU) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN3RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN3RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#if defined(STM32F413xx)|| defined(STM32F423xx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x035779F3U) -#endif /* STM32F413xx || STM32F423xx */ -#if defined (STM32F412Zx) || defined (STM32F412Vx) || defined (STM32F412Rx) || defined (STM32F412Cx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x01177933U) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART9RST)) -#define __HAL_RCC_UART10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART10RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM1RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM2RST)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART9RST)) -#define __HAL_RCC_UART10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART10RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM1RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM2RST)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_AESLPEN)) -#define __HAL_RCC_AES_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_AESLPEN)) -#endif /* STM32F423xx */ - -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) - -#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN3LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN3LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART9LPEN)) -#define __HAL_RCC_UART10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART10LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART9LPEN)) -#define __HAL_RCC_UART10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART10LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------- PLL Configuration --------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the main PLL clock source, multiplication and division factors. - * @note This function must be used only when the main PLL is disabled. - * @param __RCC_PLLSource__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLN parameter correctly to ensure that the VCO - * output frequency is between 100 and 432 MHz. - * - * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note If the USB OTG FS is used in your application, you have to set the - * PLLQ parameter correctly to have 48 MHz clock for the USB. However, - * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work - * correctly. - * - * @param __PLLR__ PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note This parameter is only available in STM32F446xx/STM32F469xx/STM32F479xx/ - STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. - * - */ -#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__) \ - (RCC->PLLCFGR = ((__RCC_PLLSource__) | (__PLLM__) | \ - ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ - ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ - ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos) | \ - ((__PLLR__) << RCC_PLLCFGR_PLLR_Pos))) -#else -/** @brief Macro to configure the main PLL clock source, multiplication and division factors. - * @note This function must be used only when the main PLL is disabled. - * @param __RCC_PLLSource__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432 - * Except for STM32F411xE devices where Min_Data = 192. - * @note You have to set the PLLN parameter correctly to ensure that the VCO - * output frequency is between 100 and 432 MHz, Except for STM32F411xE devices - * where frequency is between 192 and 432 MHz. - * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note If the USB OTG FS is used in your application, you have to set the - * PLLQ parameter correctly to have 48 MHz clock for the USB. However, - * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work - * correctly. - * - */ -#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__) \ - (RCC->PLLCFGR = (0x20000000U | (__RCC_PLLSource__) | (__PLLM__)| \ - ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ - ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ - ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos))) -#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------PLLI2S Configuration ---------------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - -/** @brief Macros to enable or disable the PLLI2S. - * @note The PLLI2S is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLLI2S_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = ENABLE) -#define __HAL_RCC_PLLI2S_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = DISABLE) - -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F412Cx */ -#if defined(STM32F446xx) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SP__ specifies division factor for SPDIFRX Clock. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * @note the PLLI2SP parameter is only available with STM32F446xx Devices - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - * @param __PLLI2SQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SP__, __PLLI2SQ__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((((__PLLI2SP__) >> 1U) -1U) << RCC_PLLI2SCFGR_PLLI2SP_Pos) |\ - ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - * @param __PLLI2SQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#else -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SN__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = (((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#endif /* STM32F446xx */ - -#if defined(STM32F411xE) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note The PLLI2SM parameter is only used with STM32F411xE/STM32F410xx Devices - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLLI2S jitter. - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 192 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 192 and Max_Data = 432 MHz. - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - */ -#define __HAL_RCC_PLLI2S_I2SCLK_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#endif /* STM32F411xE */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro used by the SAI HAL driver to configure the PLLI2S clock multiplication and division factors. - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API) - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * @param __PLLI2SQ__ specifies the division factor for SAI1 clock. - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note the PLLI2SQ parameter is only available with STM32F427xx/437xx/429xx/439xx/469xx/479xx - * Devices and can be configured using the __HAL_RCC_PLLI2S_PLLSAICLK_CONFIG() macro - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - */ -#define __HAL_RCC_PLLI2S_SAICLK_CONFIG(__PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SN__) << 6U) |\ - ((__PLLI2SQ__) << 24U) |\ - ((__PLLI2SR__) << 28U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------ PLLSAI Configuration ------------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macros to Enable or Disable the PLLISAI. - * @note The PLLSAI is only available with STM32F429x/439x Devices. - * @note The PLLSAI is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLLSAI_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = ENABLE) -#define __HAL_RCC_PLLSAI_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = DISABLE) - -#if defined(STM32F446xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIM__ specifies the division factor for PLLSAI VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLSAIM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * @note The PLLSAIM parameter is only used with STM32F446xx Devices - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIP__ specifies division factor for OTG FS, SDIO and RNG clocks. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * @note the PLLSAIP parameter is only available with STM32F446xx Devices - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIM__, __PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = ((__PLLSAIM__) | \ - ((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ - ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) | \ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos))) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIP__ specifies division factor for SDIO and CLK48 clocks. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) |\ - ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) |\ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) |\ - ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) | \ - ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- PLLSAI/PLLI2S Dividers Configuration -------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. - * @note This function must be called before enabling the PLLI2S. - * @param __PLLI2SDivR__ specifies the PLLI2S division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLI2SR) / __PLLI2SDivR__ - */ -#define __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(__PLLI2SDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, (__PLLI2SDivR__)-1U)) - -/** @brief Macro to configure the SAI clock Divider coming from PLL. - * @param __PLLDivR__ specifies the PLL division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLR) / __PLLDivR__ - */ -#define __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(__PLLDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, ((__PLLDivR__)-1U)<<8U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. - * @note This function must be called before enabling the PLLI2S. - * @param __PLLI2SDivQ__ specifies the PLLI2S division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLI2SQ) / __PLLI2SDivQ__ - */ -#define __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(__PLLI2SDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, (__PLLI2SDivQ__)-1U)) - -/** @brief Macro to configure the SAI clock Divider coming from PLLSAI. - * @note This function must be called before enabling the PLLSAI. - * @param __PLLSAIDivQ__ specifies the PLLSAI division factor for SAI1 clock . - * This parameter must be a number between Min_Data = 1 and Max_Data = 32. - * SAI1 clock frequency = f(PLLSAIQ) / __PLLSAIDivQ__ - */ -#define __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(__PLLSAIDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, ((__PLLSAIDivQ__)-1U)<<8U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the LTDC clock Divider coming from PLLSAI. - * - * @note The LTDC peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling the PLLSAI. - * @param __PLLSAIDivR__ specifies the PLLSAI division factor for LTDC clock . - * This parameter must be a number between Min_Data = 2 and Max_Data = 16. - * LTDC clock frequency = f(PLLSAIR) / __PLLSAIDivR__ - */ -#define __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(__PLLSAIDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, (__PLLSAIDivR__))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------- Peripheral Clock selection -----------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||\ - defined(STM32F479xx) -/** @brief Macro to configure the I2S clock source (I2SCLK). - * @note This function must be called before enabling the I2S APB clock. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. - * @arg RCC_I2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin - * used as I2S clock source. - */ -#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (MODIFY_REG(RCC->CFGR, RCC_CFGR_I2SSRC, (__SOURCE__))) - - -/** @brief Macro to get the I2S clock source (I2SCLK). - * @retval The clock source can be one of the following values: - * @arg @ref RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. - * @arg @ref RCC_I2SCLKSOURCE_EXT External clock mapped on the I2S_CKIN pin - * used as I2S clock source - */ -#define __HAL_RCC_GET_I2S_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_I2SSRC))) -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** @brief Macro to configure SAI1BlockA clock source selection. - * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used - * as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used - * as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin - * used as SAI1 Block A clock. - */ -#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) - -/** @brief Macro to configure SAI1BlockB clock source selection. - * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block B clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used - * as SAI1 Block B clock. - * @arg RCC_SAIBCLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used - * as SAI1 Block B clock. - * @arg RCC_SAIBCLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin - * used as SAI1 Block B clock. - */ -#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F446xx) -/** @brief Macro to configure SAI1 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI1 clock source. - * This parameter can be one of the following values: - * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - */ -#define __HAL_RCC_SAI1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - */ -#define __HAL_RCC_GET_SAI1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC)) - -/** @brief Macro to configure SAI2 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI2 clock source. - * This parameter can be one of the following values: - * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. - */ -#define __HAL_RCC_SAI2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC, (__SOURCE__))) - -/** @brief Macro to Get SAI2 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. - */ -#define __HAL_RCC_GET_SAI2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC)) - -/** @brief Macro to configure I2S APB1 clock source selection. - * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. - * @param __SOURCE__ specifies the I2S APB1 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB1 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) - -/** @brief Macro to configure I2S APB2 clock source selection. - * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB2 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) - -/** @brief Macro to configure the CEC clock. - * @param __SOURCE__ specifies the CEC clock source. - * This parameter can be one of the following values: - * @arg RCC_CECCLKSOURCE_HSI: HSI selected as CEC clock - * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock - */ -#define __HAL_RCC_CEC_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CEC clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CECCLKSOURCE_HSI488: HSI selected as CEC clock - * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock - */ -#define __HAL_RCC_GET_CEC_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) - -/** @brief Macro to configure the SPDIFRX clock. - * @param __SOURCE__ specifies the SPDIFRX clock source. - * This parameter can be one of the following values: - * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. - * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. - */ -#define __HAL_RCC_SPDIFRX_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SPDIFRX clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. - * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. - */ -#define __HAL_RCC_GET_SPDIFRX_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL)) - -/** @brief Macro to configure the DSI clock. - * @param __SOURCE__ specifies the DSI clock source. - * This parameter can be one of the following values: - * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. - * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. - */ -#define __HAL_RCC_DSI_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the DSI clock. - * @retval The clock source can be one of the following values: - * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. - * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. - */ -#define __HAL_RCC_GET_DSI_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL)) - -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the DFSDM1 clock. - * @param __DFSDM1_CLKSOURCE__ specifies the DFSDM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernel clock. - * @retval None - */ -#define __HAL_RCC_DFSDM1_CONFIG(__DFSDM1_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM1_CLKSOURCE__)) - -/** @brief Macro to get the DFSDM1 clock source. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernel clock. - */ -#define __HAL_RCC_GET_DFSDM1_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) - -/** @brief Macro to configure DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ - STM32F413xx/STM32F423xx Devices. - * @param __SOURCE__ specifies the DFSDM1 Audio clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_DFSDM1AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL, (__SOURCE__))) - -/** @brief Macro to Get DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ - STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_GET_DFSDM1AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL)) - -#if defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the DFSDM2 clock. - * @param __DFSDM2_CLKSOURCE__ specifies the DFSDM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernel clock. - * @retval None - */ -#define __HAL_RCC_DFSDM2_CONFIG(__DFSDM2_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM2_CLKSOURCE__)) - -/** @brief Macro to get the DFSDM2 clock source. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernel clock. - */ -#define __HAL_RCC_GET_DFSDM2_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) - -/** @brief Macro to configure DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @param __SOURCE__ specifies the DFSDM2 Audio clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_DFSDM2AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL, (__SOURCE__))) - -/** @brief Macro to Get DFSDM2 Audio clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_GET_DFSDM2AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL)) - -/** @brief Macro to configure SAI1BlockA clock source selection. - * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 BlockA clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_SAI_BLOCKA_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC)) - -/** @brief Macro to configure SAI1 BlockB clock source selection. - * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block B clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 BlockB clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_SAI_BLOCKB_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC)) - -/** @brief Macro to configure the LPTIM1 clock. - * @param __SOURCE__ specifies the LPTIM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the LPTIM1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) -#endif /* STM32F413xx || STM32F423xx */ - -/** @brief Macro to configure I2S APB1 clock source selection. - * @param __SOURCE__ specifies the I2S APB1 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB1 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) - -/** @brief Macro to configure I2S APB2 clock source selection. - * @param __SOURCE__ specifies the I2S APB2 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB2 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) - -/** @brief Macro to configure the PLL I2S clock source (PLLI2SCLK). - * @note This macro must be called before enabling the I2S APB clock. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLI2SCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - * @arg RCC_PLLI2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin - * used as I2S clock source. - */ -#define __HAL_RCC_PLL_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_PLLI2SCFGR_PLLI2SSRC_BB = (__SOURCE__)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) - -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @brief Macro to configure I2S clock source selection. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. - * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. - */ -#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC, (__SOURCE__))) - -/** @brief Macro to Get I2S clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. - * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. - */ -#define __HAL_RCC_GET_I2S_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the LPTIM1 clock. - * @param __SOURCE__ specifies the LPTIM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the LPTIM1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the Timers clocks prescalers - * @note This feature is only available with STM32F429x/439x Devices. - * @param __PRESC__ specifies the Timers clocks prescalers selection - * This parameter can be one of the following values: - * @arg RCC_TIMPRES_DESACTIVATED: The Timers kernels clocks prescaler is - * equal to HPRE if PPREx is corresponding to division by 1 or 2, - * else it is equal to [(HPRE * PPREx) / 2] if PPREx is corresponding to - * division by 4 or more. - * @arg RCC_TIMPRES_ACTIVATED: The Timers kernels clocks prescaler is - * equal to HPRE if PPREx is corresponding to division by 1, 2 or 4, - * else it is equal to [(HPRE * PPREx) / 4] if PPREx is corresponding - * to division by 8 or more. - */ -#define __HAL_RCC_TIMCLKPRESCALER(__PRESC__) (*(__IO uint32_t *) RCC_DCKCFGR_TIMPRE_BB = (__PRESC__)) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx) || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE ||\ - STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx ||\ - STM32F423xx */ - -/*----------------------------------------------------------------------------*/ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Enable PLLSAI_RDY interrupt. - */ -#define __HAL_RCC_PLLSAI_ENABLE_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYIE)) - -/** @brief Disable PLLSAI_RDY interrupt. - */ -#define __HAL_RCC_PLLSAI_DISABLE_IT() (RCC->CIR &= ~(RCC_CIR_PLLSAIRDYIE)) - -/** @brief Clear the PLLSAI RDY interrupt pending bits. - */ -#define __HAL_RCC_PLLSAI_CLEAR_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYF)) - -/** @brief Check the PLLSAI RDY interrupt has occurred or not. - * @retval The new state (TRUE or FALSE). - */ -#define __HAL_RCC_PLLSAI_GET_IT() ((RCC->CIR & (RCC_CIR_PLLSAIRDYIE)) == (RCC_CIR_PLLSAIRDYIE)) - -/** @brief Check PLLSAI RDY flag is set or not. - * @retval The new state (TRUE or FALSE). - */ -#define __HAL_RCC_PLLSAI_GET_FLAG() ((RCC->CR & (RCC_CR_PLLSAIRDY)) == (RCC_CR_PLLSAIRDY)) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @brief Macros to enable or disable the RCC MCO1 feature. - */ -#define __HAL_RCC_MCO1_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = ENABLE) -#define __HAL_RCC_MCO1_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = DISABLE) - -/** @brief Macros to enable or disable the RCC MCO2 feature. - */ -#define __HAL_RCC_MCO2_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = ENABLE) -#define __HAL_RCC_MCO2_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = DISABLE) - -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup RCCEx_Exported_Functions - * @{ - */ - -/** @addtogroup RCCEx_Exported_Functions_Group1 - * @{ - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); - -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk); - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -void HAL_RCCEx_SelectLSEMode(uint8_t Mode); -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -#if defined(RCC_PLLI2S_SUPPORT) -HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit); -HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void); -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit); -HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void); -#endif /* RCC_PLLSAI_SUPPORT */ -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup RCCEx_Private_Constants RCCEx Private Constants - * @{ - */ - -/** @defgroup RCCEx_BitAddress_AliasRegion RCC BitAddress AliasRegion - * @brief RCC registers bit address in the alias region - * @{ - */ -/* --- CR Register ---*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/* Alias word address of PLLSAION bit */ -#define RCC_PLLSAION_BIT_NUMBER 0x1CU -#define RCC_CR_PLLSAION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLSAION_BIT_NUMBER * 4U)) - -#define PLLSAI_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/* Alias word address of PLLI2SON bit */ -#define RCC_PLLI2SON_BIT_NUMBER 0x1AU -#define RCC_CR_PLLI2SON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLI2SON_BIT_NUMBER * 4U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/* --- DCKCFGR Register ---*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ - defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/* Alias word address of TIMPRE bit */ -#define RCC_DCKCFGR_OFFSET (RCC_OFFSET + 0x8CU) -#define RCC_TIMPRE_BIT_NUMBER 0x18U -#define RCC_DCKCFGR_TIMPRE_BB (PERIPH_BB_BASE + (RCC_DCKCFGR_OFFSET * 32U) + (RCC_TIMPRE_BIT_NUMBER * 4U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F410xx || STM32F401xC ||\ - STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/* --- CFGR Register ---*/ -#define RCC_CFGR_OFFSET (RCC_OFFSET + 0x08U) -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) -/* Alias word address of I2SSRC bit */ -#define RCC_I2SSRC_BIT_NUMBER 0x17U -#define RCC_CFGR_I2SSRC_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_I2SSRC_BIT_NUMBER * 4U)) - -#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/* --- PLLI2SCFGR Register ---*/ -#define RCC_PLLI2SCFGR_OFFSET (RCC_OFFSET + 0x84U) -/* Alias word address of PLLI2SSRC bit */ -#define RCC_PLLI2SSRC_BIT_NUMBER 0x16U -#define RCC_PLLI2SCFGR_PLLI2SSRC_BB (PERIPH_BB_BASE\ - + (RCC_PLLI2SCFGR_OFFSET * 32U) + (RCC_PLLI2SSRC_BIT_NUMBER * 4U)) - -#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx | STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/* Alias word address of MCO1EN bit */ -#define RCC_MCO1EN_BIT_NUMBER 0x8U -#define RCC_CFGR_MCO1EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO1EN_BIT_NUMBER * 4U)) - -/* Alias word address of MCO2EN bit */ -#define RCC_MCO2EN_BIT_NUMBER 0x9U -#define RCC_CFGR_MCO2EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO2EN_BIT_NUMBER * 4U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#define PLL_TIMEOUT_VALUE 2U /* 2 ms */ -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup RCCEx_Private_Macros RCCEx Private Macros - * @{ - */ -/** @defgroup RCCEx_IS_RCC_Definitions RCC Private macros to check input parameters - * @{ - */ -#define IS_RCC_PLLN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) -#define IS_RCC_PLLI2SN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000007FU)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000007U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000000FU)) -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000001FU)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F446xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000FFFU)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000001FFU)) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000003FFU)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00007FFFU)) -#endif /* STM32F413xx || STM32F423xx */ - -#define IS_RCC_PLLI2SR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLSAIN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) - -#define IS_RCC_PLLSAIQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLSAIR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLSAI_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLI2S_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLSAI_DIVR_VALUE(VALUE) (((VALUE) == RCC_PLLSAIDIVR_2) ||\ - ((VALUE) == RCC_PLLSAIDIVR_4) ||\ - ((VALUE) == RCC_PLLSAIDIVR_8) ||\ - ((VALUE) == RCC_PLLSAIDIVR_16)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PLLI2SM_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 63U)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) -#endif /* STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) - -#define IS_RCC_I2SAPBCLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPBCLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLSRC)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F446xx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLI2SP_VALUE(VALUE) (((VALUE) == RCC_PLLI2SP_DIV2) ||\ - ((VALUE) == RCC_PLLI2SP_DIV4) ||\ - ((VALUE) == RCC_PLLI2SP_DIV6) ||\ - ((VALUE) == RCC_PLLI2SP_DIV8)) - -#define IS_RCC_PLLSAIM_VALUE(VALUE) ((VALUE) <= 63U) - -#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ - ((VALUE) == RCC_PLLSAIP_DIV4) ||\ - ((VALUE) == RCC_PLLSAIP_DIV6) ||\ - ((VALUE) == RCC_PLLSAIP_DIV8)) - -#define IS_RCC_SAI1CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI1CLKSOURCE_PLLSAI) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_EXT)) - -#define IS_RCC_SAI2CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI2CLKSOURCE_PLLSAI) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLSRC)) - -#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) - -#define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_CECCLKSOURCE(SOURCE) (((SOURCE) == RCC_CECCLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_CECCLKSOURCE_LSE)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_SPDIFRXCLKSOURCE(SOURCE) (((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ - ((VALUE) == RCC_PLLSAIP_DIV4) ||\ - ((VALUE) == RCC_PLLSAIP_DIV6) ||\ - ((VALUE) == RCC_PLLSAIP_DIV8)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_DSIBYTELANECLKSOURCE(SOURCE) (((SOURCE) == RCC_DSICLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_DSICLKSOURCE_DSIPHY)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLI2SCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_PLLI2SCLKSOURCE_PLLSRC) || \ - ((__SOURCE__) == RCC_PLLI2SCLKSOURCE_EXT)) - -#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) - -#define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLI2SQ)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM1CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1CLKSOURCE_PCLK2) || \ - ((__SOURCE__) == RCC_DFSDM1CLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM1AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S1) || \ - ((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S2)) - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_DFSDM2CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2CLKSOURCE_PCLK2) || \ - ((__SOURCE__) == RCC_DFSDM2CLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM2AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S1) || \ - ((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S2)) - -#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) - -#define IS_RCC_SAIACLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIACLKSOURCE_PLLI2SR) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_PLLSRC)) - -#define IS_RCC_SAIBCLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIBCLKSOURCE_PLLI2SR) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_PLLSRC)) - -#define IS_RCC_PLL_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLI2S_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#endif /* STM32F413xx || STM32F423xx */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - -#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_PLLI2SCLK)|| \ - ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) - -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || \ - STM32F412Rx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_I2SCLK)|| \ - ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_RCC_EX_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h deleted file mode 100644 index 4e2de04..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h +++ /dev/null @@ -1,729 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_spi.h - * @author MCD Application Team - * @brief Header file of SPI HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_SPI_H -#define STM32F4xx_HAL_SPI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup SPI - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup SPI_Exported_Types SPI Exported Types - * @{ - */ - -/** - * @brief SPI Configuration Structure definition - */ -typedef struct -{ - uint32_t Mode; /*!< Specifies the SPI operating mode. - This parameter can be a value of @ref SPI_Mode */ - - uint32_t Direction; /*!< Specifies the SPI bidirectional mode state. - This parameter can be a value of @ref SPI_Direction */ - - uint32_t DataSize; /*!< Specifies the SPI data size. - This parameter can be a value of @ref SPI_Data_Size */ - - uint32_t CLKPolarity; /*!< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_Clock_Polarity */ - - uint32_t CLKPhase; /*!< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_Clock_Phase */ - - uint32_t NSS; /*!< Specifies whether the NSS signal is managed by - hardware (NSS pin) or by software using the SSI bit. - This parameter can be a value of @ref SPI_Slave_Select_management */ - - uint32_t BaudRatePrescaler; /*!< Specifies the Baud Rate prescaler value which will be - used to configure the transmit and receive SCK clock. - This parameter can be a value of @ref SPI_BaudRate_Prescaler - @note The communication clock is derived from the master - clock. The slave clock does not need to be set. */ - - uint32_t FirstBit; /*!< Specifies whether data transfers start from MSB or LSB bit. - This parameter can be a value of @ref SPI_MSB_LSB_transmission */ - - uint32_t TIMode; /*!< Specifies if the TI mode is enabled or not. - This parameter can be a value of @ref SPI_TI_mode */ - - uint32_t CRCCalculation; /*!< Specifies if the CRC calculation is enabled or not. - This parameter can be a value of @ref SPI_CRC_Calculation */ - - uint32_t CRCPolynomial; /*!< Specifies the polynomial used for the CRC calculation. - This parameter must be an odd number between Min_Data = 1 and Max_Data = 65535 */ -} SPI_InitTypeDef; - -/** - * @brief HAL SPI State structure definition - */ -typedef enum -{ - HAL_SPI_STATE_RESET = 0x00U, /*!< Peripheral not Initialized */ - HAL_SPI_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ - HAL_SPI_STATE_BUSY = 0x02U, /*!< an internal process is ongoing */ - HAL_SPI_STATE_BUSY_TX = 0x03U, /*!< Data Transmission process is ongoing */ - HAL_SPI_STATE_BUSY_RX = 0x04U, /*!< Data Reception process is ongoing */ - HAL_SPI_STATE_BUSY_TX_RX = 0x05U, /*!< Data Transmission and Reception process is ongoing */ - HAL_SPI_STATE_ERROR = 0x06U, /*!< SPI error state */ - HAL_SPI_STATE_ABORT = 0x07U /*!< SPI abort is ongoing */ -} HAL_SPI_StateTypeDef; - -/** - * @brief SPI handle Structure definition - */ -typedef struct __SPI_HandleTypeDef -{ - SPI_TypeDef *Instance; /*!< SPI registers base address */ - - SPI_InitTypeDef Init; /*!< SPI communication parameters */ - - const uint8_t *pTxBuffPtr; /*!< Pointer to SPI Tx transfer Buffer */ - - uint16_t TxXferSize; /*!< SPI Tx Transfer size */ - - __IO uint16_t TxXferCount; /*!< SPI Tx Transfer Counter */ - - uint8_t *pRxBuffPtr; /*!< Pointer to SPI Rx transfer Buffer */ - - uint16_t RxXferSize; /*!< SPI Rx Transfer size */ - - __IO uint16_t RxXferCount; /*!< SPI Rx Transfer Counter */ - - void (*RxISR)(struct __SPI_HandleTypeDef *hspi); /*!< function pointer on Rx ISR */ - - void (*TxISR)(struct __SPI_HandleTypeDef *hspi); /*!< function pointer on Tx ISR */ - - DMA_HandleTypeDef *hdmatx; /*!< SPI Tx DMA Handle parameters */ - - DMA_HandleTypeDef *hdmarx; /*!< SPI Rx DMA Handle parameters */ - - HAL_LockTypeDef Lock; /*!< Locking object */ - - __IO HAL_SPI_StateTypeDef State; /*!< SPI communication state */ - - __IO uint32_t ErrorCode; /*!< SPI Error code */ - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - void (* TxCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Tx Completed callback */ - void (* RxCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Rx Completed callback */ - void (* TxRxCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI TxRx Completed callback */ - void (* TxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Tx Half Completed callback */ - void (* RxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Rx Half Completed callback */ - void (* TxRxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI TxRx Half Completed callback */ - void (* ErrorCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Error callback */ - void (* AbortCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Abort callback */ - void (* MspInitCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Msp Init callback */ - void (* MspDeInitCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Msp DeInit callback */ - -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} SPI_HandleTypeDef; - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -/** - * @brief HAL SPI Callback ID enumeration definition - */ -typedef enum -{ - HAL_SPI_TX_COMPLETE_CB_ID = 0x00U, /*!< SPI Tx Completed callback ID */ - HAL_SPI_RX_COMPLETE_CB_ID = 0x01U, /*!< SPI Rx Completed callback ID */ - HAL_SPI_TX_RX_COMPLETE_CB_ID = 0x02U, /*!< SPI TxRx Completed callback ID */ - HAL_SPI_TX_HALF_COMPLETE_CB_ID = 0x03U, /*!< SPI Tx Half Completed callback ID */ - HAL_SPI_RX_HALF_COMPLETE_CB_ID = 0x04U, /*!< SPI Rx Half Completed callback ID */ - HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID = 0x05U, /*!< SPI TxRx Half Completed callback ID */ - HAL_SPI_ERROR_CB_ID = 0x06U, /*!< SPI Error callback ID */ - HAL_SPI_ABORT_CB_ID = 0x07U, /*!< SPI Abort callback ID */ - HAL_SPI_MSPINIT_CB_ID = 0x08U, /*!< SPI Msp Init callback ID */ - HAL_SPI_MSPDEINIT_CB_ID = 0x09U /*!< SPI Msp DeInit callback ID */ - -} HAL_SPI_CallbackIDTypeDef; - -/** - * @brief HAL SPI Callback pointer definition - */ -typedef void (*pSPI_CallbackTypeDef)(SPI_HandleTypeDef *hspi); /*!< pointer to an SPI callback function */ - -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SPI_Exported_Constants SPI Exported Constants - * @{ - */ - -/** @defgroup SPI_Error_Code SPI Error Code - * @{ - */ -#define HAL_SPI_ERROR_NONE (0x00000000U) /*!< No error */ -#define HAL_SPI_ERROR_MODF (0x00000001U) /*!< MODF error */ -#define HAL_SPI_ERROR_CRC (0x00000002U) /*!< CRC error */ -#define HAL_SPI_ERROR_OVR (0x00000004U) /*!< OVR error */ -#define HAL_SPI_ERROR_FRE (0x00000008U) /*!< FRE error */ -#define HAL_SPI_ERROR_DMA (0x00000010U) /*!< DMA transfer error */ -#define HAL_SPI_ERROR_FLAG (0x00000020U) /*!< Error on RXNE/TXE/BSY Flag */ -#define HAL_SPI_ERROR_ABORT (0x00000040U) /*!< Error during SPI Abort procedure */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -#define HAL_SPI_ERROR_INVALID_CALLBACK (0x00000080U) /*!< Invalid Callback error */ -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup SPI_Mode SPI Mode - * @{ - */ -#define SPI_MODE_SLAVE (0x00000000U) -#define SPI_MODE_MASTER (SPI_CR1_MSTR | SPI_CR1_SSI) -/** - * @} - */ - -/** @defgroup SPI_Direction SPI Direction Mode - * @{ - */ -#define SPI_DIRECTION_2LINES (0x00000000U) -#define SPI_DIRECTION_2LINES_RXONLY SPI_CR1_RXONLY -#define SPI_DIRECTION_1LINE SPI_CR1_BIDIMODE -/** - * @} - */ - -/** @defgroup SPI_Data_Size SPI Data Size - * @{ - */ -#define SPI_DATASIZE_8BIT (0x00000000U) -#define SPI_DATASIZE_16BIT SPI_CR1_DFF -/** - * @} - */ - -/** @defgroup SPI_Clock_Polarity SPI Clock Polarity - * @{ - */ -#define SPI_POLARITY_LOW (0x00000000U) -#define SPI_POLARITY_HIGH SPI_CR1_CPOL -/** - * @} - */ - -/** @defgroup SPI_Clock_Phase SPI Clock Phase - * @{ - */ -#define SPI_PHASE_1EDGE (0x00000000U) -#define SPI_PHASE_2EDGE SPI_CR1_CPHA -/** - * @} - */ - -/** @defgroup SPI_Slave_Select_management SPI Slave Select Management - * @{ - */ -#define SPI_NSS_SOFT SPI_CR1_SSM -#define SPI_NSS_HARD_INPUT (0x00000000U) -#define SPI_NSS_HARD_OUTPUT (SPI_CR2_SSOE << 16U) -/** - * @} - */ - -/** @defgroup SPI_BaudRate_Prescaler SPI BaudRate Prescaler - * @{ - */ -#define SPI_BAUDRATEPRESCALER_2 (0x00000000U) -#define SPI_BAUDRATEPRESCALER_4 (SPI_CR1_BR_0) -#define SPI_BAUDRATEPRESCALER_8 (SPI_CR1_BR_1) -#define SPI_BAUDRATEPRESCALER_16 (SPI_CR1_BR_1 | SPI_CR1_BR_0) -#define SPI_BAUDRATEPRESCALER_32 (SPI_CR1_BR_2) -#define SPI_BAUDRATEPRESCALER_64 (SPI_CR1_BR_2 | SPI_CR1_BR_0) -#define SPI_BAUDRATEPRESCALER_128 (SPI_CR1_BR_2 | SPI_CR1_BR_1) -#define SPI_BAUDRATEPRESCALER_256 (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0) -/** - * @} - */ - -/** @defgroup SPI_MSB_LSB_transmission SPI MSB LSB Transmission - * @{ - */ -#define SPI_FIRSTBIT_MSB (0x00000000U) -#define SPI_FIRSTBIT_LSB SPI_CR1_LSBFIRST -/** - * @} - */ - -/** @defgroup SPI_TI_mode SPI TI Mode - * @{ - */ -#define SPI_TIMODE_DISABLE (0x00000000U) -#define SPI_TIMODE_ENABLE SPI_CR2_FRF -/** - * @} - */ - -/** @defgroup SPI_CRC_Calculation SPI CRC Calculation - * @{ - */ -#define SPI_CRCCALCULATION_DISABLE (0x00000000U) -#define SPI_CRCCALCULATION_ENABLE SPI_CR1_CRCEN -/** - * @} - */ - -/** @defgroup SPI_Interrupt_definition SPI Interrupt Definition - * @{ - */ -#define SPI_IT_TXE SPI_CR2_TXEIE -#define SPI_IT_RXNE SPI_CR2_RXNEIE -#define SPI_IT_ERR SPI_CR2_ERRIE -/** - * @} - */ - -/** @defgroup SPI_Flags_definition SPI Flags Definition - * @{ - */ -#define SPI_FLAG_RXNE SPI_SR_RXNE /* SPI status flag: Rx buffer not empty flag */ -#define SPI_FLAG_TXE SPI_SR_TXE /* SPI status flag: Tx buffer empty flag */ -#define SPI_FLAG_BSY SPI_SR_BSY /* SPI status flag: Busy flag */ -#define SPI_FLAG_CRCERR SPI_SR_CRCERR /* SPI Error flag: CRC error flag */ -#define SPI_FLAG_MODF SPI_SR_MODF /* SPI Error flag: Mode fault flag */ -#define SPI_FLAG_OVR SPI_SR_OVR /* SPI Error flag: Overrun flag */ -#define SPI_FLAG_FRE SPI_SR_FRE /* SPI Error flag: TI mode frame format error flag */ -#define SPI_FLAG_MASK (SPI_SR_RXNE | SPI_SR_TXE | SPI_SR_BSY | SPI_SR_CRCERR\ - | SPI_SR_MODF | SPI_SR_OVR | SPI_SR_FRE) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup SPI_Exported_Macros SPI Exported Macros - * @{ - */ - -/** @brief Reset SPI handle state. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -#define __HAL_SPI_RESET_HANDLE_STATE(__HANDLE__) do{ \ - (__HANDLE__)->State = HAL_SPI_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_SPI_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_SPI_STATE_RESET) -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - -/** @brief Enable the specified SPI interrupts. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @param __INTERRUPT__ specifies the interrupt source to enable. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval None - */ -#define __HAL_SPI_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__)) - -/** @brief Disable the specified SPI interrupts. - * @param __HANDLE__ specifies the SPI handle. - * This parameter can be SPIx where x: 1, 2, or 3 to select the SPI peripheral. - * @param __INTERRUPT__ specifies the interrupt source to disable. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval None - */ -#define __HAL_SPI_DISABLE_IT(__HANDLE__, __INTERRUPT__) CLEAR_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__)) - -/** @brief Check whether the specified SPI interrupt source is enabled or not. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @param __INTERRUPT__ specifies the SPI interrupt source to check. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval The new state of __IT__ (TRUE or FALSE). - */ -#define __HAL_SPI_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2\ - & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) - -/** @brief Check whether the specified SPI flag is set or not. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg SPI_FLAG_RXNE: Receive buffer not empty flag - * @arg SPI_FLAG_TXE: Transmit buffer empty flag - * @arg SPI_FLAG_CRCERR: CRC error flag - * @arg SPI_FLAG_MODF: Mode fault flag - * @arg SPI_FLAG_OVR: Overrun flag - * @arg SPI_FLAG_BSY: Busy flag - * @arg SPI_FLAG_FRE: Frame format error flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_SPI_GET_FLAG(__HANDLE__, __FLAG__) ((((__HANDLE__)->Instance->SR) & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the SPI CRCERR pending flag. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_CRCERRFLAG(__HANDLE__) ((__HANDLE__)->Instance->SR = (uint16_t)(~SPI_FLAG_CRCERR)) - -/** @brief Clear the SPI MODF pending flag. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_MODFFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg_modf = 0x00U; \ - tmpreg_modf = (__HANDLE__)->Instance->SR; \ - CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE); \ - UNUSED(tmpreg_modf); \ - } while(0U) - -/** @brief Clear the SPI OVR pending flag. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_OVRFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg_ovr = 0x00U; \ - tmpreg_ovr = (__HANDLE__)->Instance->DR; \ - tmpreg_ovr = (__HANDLE__)->Instance->SR; \ - UNUSED(tmpreg_ovr); \ - } while(0U) - -/** @brief Clear the SPI FRE pending flag. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_FREFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg_fre = 0x00U; \ - tmpreg_fre = (__HANDLE__)->Instance->SR; \ - UNUSED(tmpreg_fre); \ - }while(0U) - -/** @brief Enable the SPI peripheral. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_ENABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE) - -/** @brief Disable the SPI peripheral. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE) - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup SPI_Private_Macros SPI Private Macros - * @{ - */ - -/** @brief Set the SPI transmit-only mode. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define SPI_1LINE_TX(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_BIDIOE) - -/** @brief Set the SPI receive-only mode. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define SPI_1LINE_RX(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_BIDIOE) - -/** @brief Reset the CRC calculation of the SPI. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define SPI_RESET_CRC(__HANDLE__) do{CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_CRCEN);\ - SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_CRCEN);}while(0U) - -/** @brief Check whether the specified SPI flag is set or not. - * @param __SR__ copy of SPI SR register. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg SPI_FLAG_RXNE: Receive buffer not empty flag - * @arg SPI_FLAG_TXE: Transmit buffer empty flag - * @arg SPI_FLAG_CRCERR: CRC error flag - * @arg SPI_FLAG_MODF: Mode fault flag - * @arg SPI_FLAG_OVR: Overrun flag - * @arg SPI_FLAG_BSY: Busy flag - * @arg SPI_FLAG_FRE: Frame format error flag - * @retval SET or RESET. - */ -#define SPI_CHECK_FLAG(__SR__, __FLAG__) ((((__SR__) & ((__FLAG__) & SPI_FLAG_MASK)) == \ - ((__FLAG__) & SPI_FLAG_MASK)) ? SET : RESET) - -/** @brief Check whether the specified SPI Interrupt is set or not. - * @param __CR2__ copy of SPI CR2 register. - * @param __INTERRUPT__ specifies the SPI interrupt source to check. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval SET or RESET. - */ -#define SPI_CHECK_IT_SOURCE(__CR2__, __INTERRUPT__) ((((__CR2__) & (__INTERRUPT__)) == \ - (__INTERRUPT__)) ? SET : RESET) - -/** @brief Checks if SPI Mode parameter is in allowed range. - * @param __MODE__ specifies the SPI Mode. - * This parameter can be a value of @ref SPI_Mode - * @retval None - */ -#define IS_SPI_MODE(__MODE__) (((__MODE__) == SPI_MODE_SLAVE) || \ - ((__MODE__) == SPI_MODE_MASTER)) - -/** @brief Checks if SPI Direction Mode parameter is in allowed range. - * @param __MODE__ specifies the SPI Direction Mode. - * This parameter can be a value of @ref SPI_Direction - * @retval None - */ -#define IS_SPI_DIRECTION(__MODE__) (((__MODE__) == SPI_DIRECTION_2LINES) || \ - ((__MODE__) == SPI_DIRECTION_2LINES_RXONLY) || \ - ((__MODE__) == SPI_DIRECTION_1LINE)) - -/** @brief Checks if SPI Direction Mode parameter is 2 lines. - * @param __MODE__ specifies the SPI Direction Mode. - * @retval None - */ -#define IS_SPI_DIRECTION_2LINES(__MODE__) ((__MODE__) == SPI_DIRECTION_2LINES) - -/** @brief Checks if SPI Direction Mode parameter is 1 or 2 lines. - * @param __MODE__ specifies the SPI Direction Mode. - * @retval None - */ -#define IS_SPI_DIRECTION_2LINES_OR_1LINE(__MODE__) (((__MODE__) == SPI_DIRECTION_2LINES) || \ - ((__MODE__) == SPI_DIRECTION_1LINE)) - -/** @brief Checks if SPI Data Size parameter is in allowed range. - * @param __DATASIZE__ specifies the SPI Data Size. - * This parameter can be a value of @ref SPI_Data_Size - * @retval None - */ -#define IS_SPI_DATASIZE(__DATASIZE__) (((__DATASIZE__) == SPI_DATASIZE_16BIT) || \ - ((__DATASIZE__) == SPI_DATASIZE_8BIT)) - -/** @brief Checks if SPI Serial clock steady state parameter is in allowed range. - * @param __CPOL__ specifies the SPI serial clock steady state. - * This parameter can be a value of @ref SPI_Clock_Polarity - * @retval None - */ -#define IS_SPI_CPOL(__CPOL__) (((__CPOL__) == SPI_POLARITY_LOW) || \ - ((__CPOL__) == SPI_POLARITY_HIGH)) - -/** @brief Checks if SPI Clock Phase parameter is in allowed range. - * @param __CPHA__ specifies the SPI Clock Phase. - * This parameter can be a value of @ref SPI_Clock_Phase - * @retval None - */ -#define IS_SPI_CPHA(__CPHA__) (((__CPHA__) == SPI_PHASE_1EDGE) || \ - ((__CPHA__) == SPI_PHASE_2EDGE)) - -/** @brief Checks if SPI Slave Select parameter is in allowed range. - * @param __NSS__ specifies the SPI Slave Select management parameter. - * This parameter can be a value of @ref SPI_Slave_Select_management - * @retval None - */ -#define IS_SPI_NSS(__NSS__) (((__NSS__) == SPI_NSS_SOFT) || \ - ((__NSS__) == SPI_NSS_HARD_INPUT) || \ - ((__NSS__) == SPI_NSS_HARD_OUTPUT)) - -/** @brief Checks if SPI Baudrate prescaler parameter is in allowed range. - * @param __PRESCALER__ specifies the SPI Baudrate prescaler. - * This parameter can be a value of @ref SPI_BaudRate_Prescaler - * @retval None - */ -#define IS_SPI_BAUDRATE_PRESCALER(__PRESCALER__) (((__PRESCALER__) == SPI_BAUDRATEPRESCALER_2) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_4) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_8) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_16) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_32) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_64) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_128) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_256)) - -/** @brief Checks if SPI MSB LSB transmission parameter is in allowed range. - * @param __BIT__ specifies the SPI MSB LSB transmission (whether data transfer starts from MSB or LSB bit). - * This parameter can be a value of @ref SPI_MSB_LSB_transmission - * @retval None - */ -#define IS_SPI_FIRST_BIT(__BIT__) (((__BIT__) == SPI_FIRSTBIT_MSB) || \ - ((__BIT__) == SPI_FIRSTBIT_LSB)) - -/** @brief Checks if SPI TI mode parameter is in allowed range. - * @param __MODE__ specifies the SPI TI mode. - * This parameter can be a value of @ref SPI_TI_mode - * @retval None - */ -#define IS_SPI_TIMODE(__MODE__) (((__MODE__) == SPI_TIMODE_DISABLE) || \ - ((__MODE__) == SPI_TIMODE_ENABLE)) - -/** @brief Checks if SPI CRC calculation enabled state is in allowed range. - * @param __CALCULATION__ specifies the SPI CRC calculation enable state. - * This parameter can be a value of @ref SPI_CRC_Calculation - * @retval None - */ -#define IS_SPI_CRC_CALCULATION(__CALCULATION__) (((__CALCULATION__) == SPI_CRCCALCULATION_DISABLE) || \ - ((__CALCULATION__) == SPI_CRCCALCULATION_ENABLE)) - -/** @brief Checks if SPI polynomial value to be used for the CRC calculation, is in allowed range. - * @param __POLYNOMIAL__ specifies the SPI polynomial value to be used for the CRC calculation. - * This parameter must be a number between Min_Data = 0 and Max_Data = 65535 - * @retval None - */ -#define IS_SPI_CRC_POLYNOMIAL(__POLYNOMIAL__) (((__POLYNOMIAL__) >= 0x1U) && \ - ((__POLYNOMIAL__) <= 0xFFFFU) && \ - (((__POLYNOMIAL__)&0x1U) != 0U)) - -/** @brief Checks if DMA handle is valid. - * @param __HANDLE__ specifies a DMA Handle. - * @retval None - */ -#define IS_SPI_DMA_HANDLE(__HANDLE__) ((__HANDLE__) != NULL) - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup SPI_Exported_Functions - * @{ - */ - -/** @addtogroup SPI_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions ********************************/ -HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi); -void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi); -void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID, - pSPI_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @addtogroup SPI_Exported_Functions_Group2 - * @{ - */ -/* I/O operation functions ***************************************************/ -HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size); -HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size); -HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi); -/* Transfer Abort functions */ -HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi); - -void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi); -/** - * @} - */ - -/** @addtogroup SPI_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State and Error functions ***************************************/ -HAL_SPI_StateTypeDef HAL_SPI_GetState(const SPI_HandleTypeDef *hspi); -uint32_t HAL_SPI_GetError(const SPI_HandleTypeDef *hspi); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_SPI_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h deleted file mode 100644 index 1a8357c..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h +++ /dev/null @@ -1,2155 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim.h - * @author MCD Application Team - * @brief Header file of TIM HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_TIM_H -#define STM32F4xx_HAL_TIM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup TIM - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup TIM_Exported_Types TIM Exported Types - * @{ - */ - -/** - * @brief TIM Time base Configuration Structure definition - */ -typedef struct -{ - uint32_t Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t CounterMode; /*!< Specifies the counter mode. - This parameter can be a value of @ref TIM_Counter_Mode */ - - uint32_t Period; /*!< Specifies the period value to be loaded into the active - Auto-Reload Register at the next update event. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ - - uint32_t ClockDivision; /*!< Specifies the clock division. - This parameter can be a value of @ref TIM_ClockDivision */ - - uint32_t RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter - reaches zero, an update event is generated and counting restarts - from the RCR value (N). - This means in PWM mode that (N+1) corresponds to: - - the number of PWM periods in edge-aligned mode - - the number of half PWM period in center-aligned mode - GP timers: this parameter must be a number between Min_Data = 0x00 and - Max_Data = 0xFF. - Advanced timers: this parameter must be a number between Min_Data = 0x0000 and - Max_Data = 0xFFFF. */ - - uint32_t AutoReloadPreload; /*!< Specifies the auto-reload preload. - This parameter can be a value of @ref TIM_AutoReloadPreload */ -} TIM_Base_InitTypeDef; - -/** - * @brief TIM Output Compare Configuration Structure definition - */ -typedef struct -{ - uint32_t OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCFastMode; /*!< Specifies the Fast mode state. - This parameter can be a value of @ref TIM_Output_Fast_State - @note This parameter is valid only in PWM1 and PWM2 mode. */ - - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ -} TIM_OC_InitTypeDef; - -/** - * @brief TIM One Pulse Mode Configuration Structure definition - */ -typedef struct -{ - uint32_t OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_OnePulse_InitTypeDef; - -/** - * @brief TIM Input Capture Configuration Structure definition - */ -typedef struct -{ - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_IC_InitTypeDef; - -/** - * @brief TIM Encoder Configuration Structure definition - */ -typedef struct -{ - uint32_t EncoderMode; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Mode */ - - uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ - - uint32_t IC1Selection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC1Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ - - uint32_t IC2Selection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t IC2Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC2Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_Encoder_InitTypeDef; - -/** - * @brief Clock Configuration Handle Structure definition - */ -typedef struct -{ - uint32_t ClockSource; /*!< TIM clock sources - This parameter can be a value of @ref TIM_Clock_Source */ - uint32_t ClockPolarity; /*!< TIM clock polarity - This parameter can be a value of @ref TIM_Clock_Polarity */ - uint32_t ClockPrescaler; /*!< TIM clock prescaler - This parameter can be a value of @ref TIM_Clock_Prescaler */ - uint32_t ClockFilter; /*!< TIM clock filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_ClockConfigTypeDef; - -/** - * @brief TIM Clear Input Configuration Handle Structure definition - */ -typedef struct -{ - uint32_t ClearInputState; /*!< TIM clear Input state - This parameter can be ENABLE or DISABLE */ - uint32_t ClearInputSource; /*!< TIM clear Input sources - This parameter can be a value of @ref TIM_ClearInput_Source */ - uint32_t ClearInputPolarity; /*!< TIM Clear Input polarity - This parameter can be a value of @ref TIM_ClearInput_Polarity */ - uint32_t ClearInputPrescaler; /*!< TIM Clear Input prescaler - This parameter must be 0: When OCRef clear feature is used with ETR source, - ETR prescaler must be off */ - uint32_t ClearInputFilter; /*!< TIM Clear Input filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_ClearInputConfigTypeDef; - -/** - * @brief TIM Master configuration Structure definition - */ -typedef struct -{ - uint32_t MasterOutputTrigger; /*!< Trigger output (TRGO) selection - This parameter can be a value of @ref TIM_Master_Mode_Selection */ - uint32_t MasterSlaveMode; /*!< Master/slave mode selection - This parameter can be a value of @ref TIM_Master_Slave_Mode - @note When the Master/slave mode is enabled, the effect of - an event on the trigger input (TRGI) is delayed to allow a - perfect synchronization between the current timer and its - slaves (through TRGO). It is not mandatory in case of timer - synchronization mode. */ -} TIM_MasterConfigTypeDef; - -/** - * @brief TIM Slave configuration Structure definition - */ -typedef struct -{ - uint32_t SlaveMode; /*!< Slave mode selection - This parameter can be a value of @ref TIM_Slave_Mode */ - uint32_t InputTrigger; /*!< Input Trigger source - This parameter can be a value of @ref TIM_Trigger_Selection */ - uint32_t TriggerPolarity; /*!< Input Trigger polarity - This parameter can be a value of @ref TIM_Trigger_Polarity */ - uint32_t TriggerPrescaler; /*!< Input trigger prescaler - This parameter can be a value of @ref TIM_Trigger_Prescaler */ - uint32_t TriggerFilter; /*!< Input trigger filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - -} TIM_SlaveConfigTypeDef; - -/** - * @brief TIM Break input(s) and Dead time configuration Structure definition - * @note 2 break inputs can be configured (BKIN and BKIN2) with configurable - * filter and polarity. - */ -typedef struct -{ - uint32_t OffStateRunMode; /*!< TIM off state in run mode, This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */ - - uint32_t OffStateIDLEMode; /*!< TIM off state in IDLE mode, This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */ - - uint32_t LockLevel; /*!< TIM Lock level, This parameter can be a value of @ref TIM_Lock_level */ - - uint32_t DeadTime; /*!< TIM dead Time, This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF */ - - uint32_t BreakState; /*!< TIM Break State, This parameter can be a value of @ref TIM_Break_Input_enable_disable */ - - uint32_t BreakPolarity; /*!< TIM Break input polarity, This parameter can be a value of @ref TIM_Break_Polarity */ - - uint32_t BreakFilter; /*!< Specifies the break input filter.This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t AutomaticOutput; /*!< TIM Automatic Output Enable state, This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ - -} TIM_BreakDeadTimeConfigTypeDef; - -/** - * @brief HAL State structures definition - */ -typedef enum -{ - HAL_TIM_STATE_RESET = 0x00U, /*!< Peripheral not yet initialized or disabled */ - HAL_TIM_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ - HAL_TIM_STATE_BUSY = 0x02U, /*!< An internal process is ongoing */ - HAL_TIM_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ - HAL_TIM_STATE_ERROR = 0x04U /*!< Reception process is ongoing */ -} HAL_TIM_StateTypeDef; - -/** - * @brief TIM Channel States definition - */ -typedef enum -{ - HAL_TIM_CHANNEL_STATE_RESET = 0x00U, /*!< TIM Channel initial state */ - HAL_TIM_CHANNEL_STATE_READY = 0x01U, /*!< TIM Channel ready for use */ - HAL_TIM_CHANNEL_STATE_BUSY = 0x02U, /*!< An internal process is ongoing on the TIM channel */ -} HAL_TIM_ChannelStateTypeDef; - -/** - * @brief DMA Burst States definition - */ -typedef enum -{ - HAL_DMA_BURST_STATE_RESET = 0x00U, /*!< DMA Burst initial state */ - HAL_DMA_BURST_STATE_READY = 0x01U, /*!< DMA Burst ready for use */ - HAL_DMA_BURST_STATE_BUSY = 0x02U, /*!< Ongoing DMA Burst */ -} HAL_TIM_DMABurstStateTypeDef; - -/** - * @brief HAL Active channel structures definition - */ -typedef enum -{ - HAL_TIM_ACTIVE_CHANNEL_1 = 0x01U, /*!< The active channel is 1 */ - HAL_TIM_ACTIVE_CHANNEL_2 = 0x02U, /*!< The active channel is 2 */ - HAL_TIM_ACTIVE_CHANNEL_3 = 0x04U, /*!< The active channel is 3 */ - HAL_TIM_ACTIVE_CHANNEL_4 = 0x08U, /*!< The active channel is 4 */ - HAL_TIM_ACTIVE_CHANNEL_CLEARED = 0x00U /*!< All active channels cleared */ -} HAL_TIM_ActiveChannel; - -/** - * @brief TIM Time Base Handle Structure definition - */ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -typedef struct __TIM_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -{ - TIM_TypeDef *Instance; /*!< Register base address */ - TIM_Base_InitTypeDef Init; /*!< TIM Time Base required parameters */ - HAL_TIM_ActiveChannel Channel; /*!< Active channel */ - DMA_HandleTypeDef *hdma[7]; /*!< DMA Handlers array - This array is accessed by a @ref DMA_Handle_index */ - HAL_LockTypeDef Lock; /*!< Locking object */ - __IO HAL_TIM_StateTypeDef State; /*!< TIM operation state */ - __IO HAL_TIM_ChannelStateTypeDef ChannelState[4]; /*!< TIM channel operation state */ - __IO HAL_TIM_ChannelStateTypeDef ChannelNState[4]; /*!< TIM complementary channel operation state */ - __IO HAL_TIM_DMABurstStateTypeDef DMABurstState; /*!< DMA burst operation state */ - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - void (* Base_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp Init Callback */ - void (* Base_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp DeInit Callback */ - void (* IC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp Init Callback */ - void (* IC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp DeInit Callback */ - void (* OC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp Init Callback */ - void (* OC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp DeInit Callback */ - void (* PWM_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp Init Callback */ - void (* PWM_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp DeInit Callback */ - void (* OnePulse_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp Init Callback */ - void (* OnePulse_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp DeInit Callback */ - void (* Encoder_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp Init Callback */ - void (* Encoder_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp DeInit Callback */ - void (* HallSensor_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp Init Callback */ - void (* HallSensor_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp DeInit Callback */ - void (* PeriodElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed Callback */ - void (* PeriodElapsedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed half complete Callback */ - void (* TriggerCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger Callback */ - void (* TriggerHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger half complete Callback */ - void (* IC_CaptureCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture Callback */ - void (* IC_CaptureHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture half complete Callback */ - void (* OC_DelayElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Output Compare Delay Elapsed Callback */ - void (* PWM_PulseFinishedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished Callback */ - void (* PWM_PulseFinishedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished half complete Callback */ - void (* ErrorCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Error Callback */ - void (* CommutationCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation Callback */ - void (* CommutationHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation half complete Callback */ - void (* BreakCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Break Callback */ -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} TIM_HandleTypeDef; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief HAL TIM Callback ID enumeration definition - */ -typedef enum -{ - HAL_TIM_BASE_MSPINIT_CB_ID = 0x00U /*!< TIM Base MspInit Callback ID */ - , HAL_TIM_BASE_MSPDEINIT_CB_ID = 0x01U /*!< TIM Base MspDeInit Callback ID */ - , HAL_TIM_IC_MSPINIT_CB_ID = 0x02U /*!< TIM IC MspInit Callback ID */ - , HAL_TIM_IC_MSPDEINIT_CB_ID = 0x03U /*!< TIM IC MspDeInit Callback ID */ - , HAL_TIM_OC_MSPINIT_CB_ID = 0x04U /*!< TIM OC MspInit Callback ID */ - , HAL_TIM_OC_MSPDEINIT_CB_ID = 0x05U /*!< TIM OC MspDeInit Callback ID */ - , HAL_TIM_PWM_MSPINIT_CB_ID = 0x06U /*!< TIM PWM MspInit Callback ID */ - , HAL_TIM_PWM_MSPDEINIT_CB_ID = 0x07U /*!< TIM PWM MspDeInit Callback ID */ - , HAL_TIM_ONE_PULSE_MSPINIT_CB_ID = 0x08U /*!< TIM One Pulse MspInit Callback ID */ - , HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID = 0x09U /*!< TIM One Pulse MspDeInit Callback ID */ - , HAL_TIM_ENCODER_MSPINIT_CB_ID = 0x0AU /*!< TIM Encoder MspInit Callback ID */ - , HAL_TIM_ENCODER_MSPDEINIT_CB_ID = 0x0BU /*!< TIM Encoder MspDeInit Callback ID */ - , HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID = 0x0CU /*!< TIM Hall Sensor MspDeInit Callback ID */ - , HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID = 0x0DU /*!< TIM Hall Sensor MspDeInit Callback ID */ - , HAL_TIM_PERIOD_ELAPSED_CB_ID = 0x0EU /*!< TIM Period Elapsed Callback ID */ - , HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID = 0x0FU /*!< TIM Period Elapsed half complete Callback ID */ - , HAL_TIM_TRIGGER_CB_ID = 0x10U /*!< TIM Trigger Callback ID */ - , HAL_TIM_TRIGGER_HALF_CB_ID = 0x11U /*!< TIM Trigger half complete Callback ID */ - , HAL_TIM_IC_CAPTURE_CB_ID = 0x12U /*!< TIM Input Capture Callback ID */ - , HAL_TIM_IC_CAPTURE_HALF_CB_ID = 0x13U /*!< TIM Input Capture half complete Callback ID */ - , HAL_TIM_OC_DELAY_ELAPSED_CB_ID = 0x14U /*!< TIM Output Compare Delay Elapsed Callback ID */ - , HAL_TIM_PWM_PULSE_FINISHED_CB_ID = 0x15U /*!< TIM PWM Pulse Finished Callback ID */ - , HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID = 0x16U /*!< TIM PWM Pulse Finished half complete Callback ID */ - , HAL_TIM_ERROR_CB_ID = 0x17U /*!< TIM Error Callback ID */ - , HAL_TIM_COMMUTATION_CB_ID = 0x18U /*!< TIM Commutation Callback ID */ - , HAL_TIM_COMMUTATION_HALF_CB_ID = 0x19U /*!< TIM Commutation half complete Callback ID */ - , HAL_TIM_BREAK_CB_ID = 0x1AU /*!< TIM Break Callback ID */ -} HAL_TIM_CallbackIDTypeDef; - -/** - * @brief HAL TIM Callback pointer definition - */ -typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to the TIM callback function */ - -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ -/* End of exported types -----------------------------------------------------*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIM_Exported_Constants TIM Exported Constants - * @{ - */ - -/** @defgroup TIM_ClearInput_Source TIM Clear Input Source - * @{ - */ -#define TIM_CLEARINPUTSOURCE_NONE 0x00000000U /*!< OCREF_CLR is disabled */ -#define TIM_CLEARINPUTSOURCE_ETR 0x00000001U /*!< OCREF_CLR is connected to ETRF input */ -/** - * @} - */ - -/** @defgroup TIM_DMA_Base_address TIM DMA Base Address - * @{ - */ -#define TIM_DMABASE_CR1 0x00000000U -#define TIM_DMABASE_CR2 0x00000001U -#define TIM_DMABASE_SMCR 0x00000002U -#define TIM_DMABASE_DIER 0x00000003U -#define TIM_DMABASE_SR 0x00000004U -#define TIM_DMABASE_EGR 0x00000005U -#define TIM_DMABASE_CCMR1 0x00000006U -#define TIM_DMABASE_CCMR2 0x00000007U -#define TIM_DMABASE_CCER 0x00000008U -#define TIM_DMABASE_CNT 0x00000009U -#define TIM_DMABASE_PSC 0x0000000AU -#define TIM_DMABASE_ARR 0x0000000BU -#define TIM_DMABASE_RCR 0x0000000CU -#define TIM_DMABASE_CCR1 0x0000000DU -#define TIM_DMABASE_CCR2 0x0000000EU -#define TIM_DMABASE_CCR3 0x0000000FU -#define TIM_DMABASE_CCR4 0x00000010U -#define TIM_DMABASE_BDTR 0x00000011U -#define TIM_DMABASE_DCR 0x00000012U -#define TIM_DMABASE_DMAR 0x00000013U -/** - * @} - */ - -/** @defgroup TIM_Event_Source TIM Event Source - * @{ - */ -#define TIM_EVENTSOURCE_UPDATE TIM_EGR_UG /*!< Reinitialize the counter and generates an update of the registers */ -#define TIM_EVENTSOURCE_CC1 TIM_EGR_CC1G /*!< A capture/compare event is generated on channel 1 */ -#define TIM_EVENTSOURCE_CC2 TIM_EGR_CC2G /*!< A capture/compare event is generated on channel 2 */ -#define TIM_EVENTSOURCE_CC3 TIM_EGR_CC3G /*!< A capture/compare event is generated on channel 3 */ -#define TIM_EVENTSOURCE_CC4 TIM_EGR_CC4G /*!< A capture/compare event is generated on channel 4 */ -#define TIM_EVENTSOURCE_COM TIM_EGR_COMG /*!< A commutation event is generated */ -#define TIM_EVENTSOURCE_TRIGGER TIM_EGR_TG /*!< A trigger event is generated */ -#define TIM_EVENTSOURCE_BREAK TIM_EGR_BG /*!< A break event is generated */ -/** - * @} - */ - -/** @defgroup TIM_Input_Channel_Polarity TIM Input Channel polarity - * @{ - */ -#define TIM_INPUTCHANNELPOLARITY_RISING 0x00000000U /*!< Polarity for TIx source */ -#define TIM_INPUTCHANNELPOLARITY_FALLING TIM_CCER_CC1P /*!< Polarity for TIx source */ -#define TIM_INPUTCHANNELPOLARITY_BOTHEDGE (TIM_CCER_CC1P | TIM_CCER_CC1NP) /*!< Polarity for TIx source */ -/** - * @} - */ - -/** @defgroup TIM_ETR_Polarity TIM ETR Polarity - * @{ - */ -#define TIM_ETRPOLARITY_INVERTED TIM_SMCR_ETP /*!< Polarity for ETR source */ -#define TIM_ETRPOLARITY_NONINVERTED 0x00000000U /*!< Polarity for ETR source */ -/** - * @} - */ - -/** @defgroup TIM_ETR_Prescaler TIM ETR Prescaler - * @{ - */ -#define TIM_ETRPRESCALER_DIV1 0x00000000U /*!< No prescaler is used */ -#define TIM_ETRPRESCALER_DIV2 TIM_SMCR_ETPS_0 /*!< ETR input source is divided by 2 */ -#define TIM_ETRPRESCALER_DIV4 TIM_SMCR_ETPS_1 /*!< ETR input source is divided by 4 */ -#define TIM_ETRPRESCALER_DIV8 TIM_SMCR_ETPS /*!< ETR input source is divided by 8 */ -/** - * @} - */ - -/** @defgroup TIM_Counter_Mode TIM Counter Mode - * @{ - */ -#define TIM_COUNTERMODE_UP 0x00000000U /*!< Counter used as up-counter */ -#define TIM_COUNTERMODE_DOWN TIM_CR1_DIR /*!< Counter used as down-counter */ -#define TIM_COUNTERMODE_CENTERALIGNED1 TIM_CR1_CMS_0 /*!< Center-aligned mode 1 */ -#define TIM_COUNTERMODE_CENTERALIGNED2 TIM_CR1_CMS_1 /*!< Center-aligned mode 2 */ -#define TIM_COUNTERMODE_CENTERALIGNED3 TIM_CR1_CMS /*!< Center-aligned mode 3 */ -/** - * @} - */ - -/** @defgroup TIM_ClockDivision TIM Clock Division - * @{ - */ -#define TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< Clock division: tDTS=tCK_INT */ -#define TIM_CLOCKDIVISION_DIV2 TIM_CR1_CKD_0 /*!< Clock division: tDTS=2*tCK_INT */ -#define TIM_CLOCKDIVISION_DIV4 TIM_CR1_CKD_1 /*!< Clock division: tDTS=4*tCK_INT */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_State TIM Output Compare State - * @{ - */ -#define TIM_OUTPUTSTATE_DISABLE 0x00000000U /*!< Capture/Compare 1 output disabled */ -#define TIM_OUTPUTSTATE_ENABLE TIM_CCER_CC1E /*!< Capture/Compare 1 output enabled */ -/** - * @} - */ - -/** @defgroup TIM_AutoReloadPreload TIM Auto-Reload Preload - * @{ - */ -#define TIM_AUTORELOAD_PRELOAD_DISABLE 0x00000000U /*!< TIMx_ARR register is not buffered */ -#define TIM_AUTORELOAD_PRELOAD_ENABLE TIM_CR1_ARPE /*!< TIMx_ARR register is buffered */ - -/** - * @} - */ - -/** @defgroup TIM_Output_Fast_State TIM Output Fast State - * @{ - */ -#define TIM_OCFAST_DISABLE 0x00000000U /*!< Output Compare fast disable */ -#define TIM_OCFAST_ENABLE TIM_CCMR1_OC1FE /*!< Output Compare fast enable */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_State TIM Complementary Output Compare State - * @{ - */ -#define TIM_OUTPUTNSTATE_DISABLE 0x00000000U /*!< OCxN is disabled */ -#define TIM_OUTPUTNSTATE_ENABLE TIM_CCER_CC1NE /*!< OCxN is enabled */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Polarity TIM Output Compare Polarity - * @{ - */ -#define TIM_OCPOLARITY_HIGH 0x00000000U /*!< Capture/Compare output polarity */ -#define TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< Capture/Compare output polarity */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Polarity TIM Complementary Output Compare Polarity - * @{ - */ -#define TIM_OCNPOLARITY_HIGH 0x00000000U /*!< Capture/Compare complementary output polarity */ -#define TIM_OCNPOLARITY_LOW TIM_CCER_CC1NP /*!< Capture/Compare complementary output polarity */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Idle_State TIM Output Compare Idle State - * @{ - */ -#define TIM_OCIDLESTATE_SET TIM_CR2_OIS1 /*!< Output Idle state: OCx=1 when MOE=0 */ -#define TIM_OCIDLESTATE_RESET 0x00000000U /*!< Output Idle state: OCx=0 when MOE=0 */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Idle_State TIM Complementary Output Compare Idle State - * @{ - */ -#define TIM_OCNIDLESTATE_SET TIM_CR2_OIS1N /*!< Complementary output Idle state: OCxN=1 when MOE=0 */ -#define TIM_OCNIDLESTATE_RESET 0x00000000U /*!< Complementary output Idle state: OCxN=0 when MOE=0 */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Polarity TIM Input Capture Polarity - * @{ - */ -#define TIM_ICPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Capture triggered by rising edge on timer input */ -#define TIM_ICPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Capture triggered by falling edge on timer input */ -#define TIM_ICPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Capture triggered by both rising and falling edges on timer input*/ -/** - * @} - */ - -/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity - * @{ - */ -#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ -#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection - * @{ - */ -#define TIM_ICSELECTION_DIRECTTI TIM_CCMR1_CC1S_0 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC1, IC2, IC3 or IC4, respectively */ -#define TIM_ICSELECTION_INDIRECTTI TIM_CCMR1_CC1S_1 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC2, IC1, IC4 or IC3, respectively */ -#define TIM_ICSELECTION_TRC TIM_CCMR1_CC1S /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Prescaler TIM Input Capture Prescaler - * @{ - */ -#define TIM_ICPSC_DIV1 0x00000000U /*!< Capture performed each time an edge is detected on the capture input */ -#define TIM_ICPSC_DIV2 TIM_CCMR1_IC1PSC_0 /*!< Capture performed once every 2 events */ -#define TIM_ICPSC_DIV4 TIM_CCMR1_IC1PSC_1 /*!< Capture performed once every 4 events */ -#define TIM_ICPSC_DIV8 TIM_CCMR1_IC1PSC /*!< Capture performed once every 8 events */ -/** - * @} - */ - -/** @defgroup TIM_One_Pulse_Mode TIM One Pulse Mode - * @{ - */ -#define TIM_OPMODE_SINGLE TIM_CR1_OPM /*!< Counter stops counting at the next update event */ -#define TIM_OPMODE_REPETITIVE 0x00000000U /*!< Counter is not stopped at update event */ -/** - * @} - */ - -/** @defgroup TIM_Encoder_Mode TIM Encoder Mode - * @{ - */ -#define TIM_ENCODERMODE_TI1 TIM_SMCR_SMS_0 /*!< Quadrature encoder mode 1, x2 mode, counts up/down on TI1FP1 edge depending on TI2FP2 level */ -#define TIM_ENCODERMODE_TI2 TIM_SMCR_SMS_1 /*!< Quadrature encoder mode 2, x2 mode, counts up/down on TI2FP2 edge depending on TI1FP1 level. */ -#define TIM_ENCODERMODE_TI12 (TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< Quadrature encoder mode 3, x4 mode, counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. */ -/** - * @} - */ - -/** @defgroup TIM_Interrupt_definition TIM interrupt Definition - * @{ - */ -#define TIM_IT_UPDATE TIM_DIER_UIE /*!< Update interrupt */ -#define TIM_IT_CC1 TIM_DIER_CC1IE /*!< Capture/Compare 1 interrupt */ -#define TIM_IT_CC2 TIM_DIER_CC2IE /*!< Capture/Compare 2 interrupt */ -#define TIM_IT_CC3 TIM_DIER_CC3IE /*!< Capture/Compare 3 interrupt */ -#define TIM_IT_CC4 TIM_DIER_CC4IE /*!< Capture/Compare 4 interrupt */ -#define TIM_IT_COM TIM_DIER_COMIE /*!< Commutation interrupt */ -#define TIM_IT_TRIGGER TIM_DIER_TIE /*!< Trigger interrupt */ -#define TIM_IT_BREAK TIM_DIER_BIE /*!< Break interrupt */ -/** - * @} - */ - -/** @defgroup TIM_Commutation_Source TIM Commutation Source - * @{ - */ -#define TIM_COMMUTATION_TRGI TIM_CR2_CCUS /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit or when an rising edge occurs on trigger input */ -#define TIM_COMMUTATION_SOFTWARE 0x00000000U /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit */ -/** - * @} - */ - -/** @defgroup TIM_DMA_sources TIM DMA Sources - * @{ - */ -#define TIM_DMA_UPDATE TIM_DIER_UDE /*!< DMA request is triggered by the update event */ -#define TIM_DMA_CC1 TIM_DIER_CC1DE /*!< DMA request is triggered by the capture/compare macth 1 event */ -#define TIM_DMA_CC2 TIM_DIER_CC2DE /*!< DMA request is triggered by the capture/compare macth 2 event event */ -#define TIM_DMA_CC3 TIM_DIER_CC3DE /*!< DMA request is triggered by the capture/compare macth 3 event event */ -#define TIM_DMA_CC4 TIM_DIER_CC4DE /*!< DMA request is triggered by the capture/compare macth 4 event event */ -#define TIM_DMA_COM TIM_DIER_COMDE /*!< DMA request is triggered by the commutation event */ -#define TIM_DMA_TRIGGER TIM_DIER_TDE /*!< DMA request is triggered by the trigger event */ -/** - * @} - */ - -/** @defgroup TIM_CC_DMA_Request CCx DMA request selection - * @{ - */ -#define TIM_CCDMAREQUEST_CC 0x00000000U /*!< CCx DMA request sent when capture or compare match event occurs */ -#define TIM_CCDMAREQUEST_UPDATE TIM_CR2_CCDS /*!< CCx DMA requests sent when update event occurs */ -/** - * @} - */ - -/** @defgroup TIM_Flag_definition TIM Flag Definition - * @{ - */ -#define TIM_FLAG_UPDATE TIM_SR_UIF /*!< Update interrupt flag */ -#define TIM_FLAG_CC1 TIM_SR_CC1IF /*!< Capture/Compare 1 interrupt flag */ -#define TIM_FLAG_CC2 TIM_SR_CC2IF /*!< Capture/Compare 2 interrupt flag */ -#define TIM_FLAG_CC3 TIM_SR_CC3IF /*!< Capture/Compare 3 interrupt flag */ -#define TIM_FLAG_CC4 TIM_SR_CC4IF /*!< Capture/Compare 4 interrupt flag */ -#define TIM_FLAG_COM TIM_SR_COMIF /*!< Commutation interrupt flag */ -#define TIM_FLAG_TRIGGER TIM_SR_TIF /*!< Trigger interrupt flag */ -#define TIM_FLAG_BREAK TIM_SR_BIF /*!< Break interrupt flag */ -#define TIM_FLAG_CC1OF TIM_SR_CC1OF /*!< Capture 1 overcapture flag */ -#define TIM_FLAG_CC2OF TIM_SR_CC2OF /*!< Capture 2 overcapture flag */ -#define TIM_FLAG_CC3OF TIM_SR_CC3OF /*!< Capture 3 overcapture flag */ -#define TIM_FLAG_CC4OF TIM_SR_CC4OF /*!< Capture 4 overcapture flag */ -/** - * @} - */ - -/** @defgroup TIM_Channel TIM Channel - * @{ - */ -#define TIM_CHANNEL_1 0x00000000U /*!< Capture/compare channel 1 identifier */ -#define TIM_CHANNEL_2 0x00000004U /*!< Capture/compare channel 2 identifier */ -#define TIM_CHANNEL_3 0x00000008U /*!< Capture/compare channel 3 identifier */ -#define TIM_CHANNEL_4 0x0000000CU /*!< Capture/compare channel 4 identifier */ -#define TIM_CHANNEL_ALL 0x0000003CU /*!< Global Capture/compare channel identifier */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Source TIM Clock Source - * @{ - */ -#define TIM_CLOCKSOURCE_INTERNAL TIM_SMCR_ETPS_0 /*!< Internal clock source */ -#define TIM_CLOCKSOURCE_ETRMODE1 TIM_TS_ETRF /*!< External clock source mode 1 (ETRF) */ -#define TIM_CLOCKSOURCE_ETRMODE2 TIM_SMCR_ETPS_1 /*!< External clock source mode 2 */ -#define TIM_CLOCKSOURCE_TI1ED TIM_TS_TI1F_ED /*!< External clock source mode 1 (TTI1FP1 + edge detect.) */ -#define TIM_CLOCKSOURCE_TI1 TIM_TS_TI1FP1 /*!< External clock source mode 1 (TTI1FP1) */ -#define TIM_CLOCKSOURCE_TI2 TIM_TS_TI2FP2 /*!< External clock source mode 1 (TTI2FP2) */ -#define TIM_CLOCKSOURCE_ITR0 TIM_TS_ITR0 /*!< External clock source mode 1 (ITR0) */ -#define TIM_CLOCKSOURCE_ITR1 TIM_TS_ITR1 /*!< External clock source mode 1 (ITR1) */ -#define TIM_CLOCKSOURCE_ITR2 TIM_TS_ITR2 /*!< External clock source mode 1 (ITR2) */ -#define TIM_CLOCKSOURCE_ITR3 TIM_TS_ITR3 /*!< External clock source mode 1 (ITR3) */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Polarity TIM Clock Polarity - * @{ - */ -#define TIM_CLOCKPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx clock sources */ -#define TIM_CLOCKPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx clock sources */ -#define TIM_CLOCKPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIx clock sources */ -#define TIM_CLOCKPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIx clock sources */ -#define TIM_CLOCKPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIx clock sources */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Prescaler TIM Clock Prescaler - * @{ - */ -#define TIM_CLOCKPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_CLOCKPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Clock: Capture performed once every 2 events. */ -#define TIM_CLOCKPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Clock: Capture performed once every 4 events. */ -#define TIM_CLOCKPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Clock: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_ClearInput_Polarity TIM Clear Input Polarity - * @{ - */ -#define TIM_CLEARINPUTPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx pin */ -#define TIM_CLEARINPUTPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx pin */ -/** - * @} - */ - -/** @defgroup TIM_ClearInput_Prescaler TIM Clear Input Prescaler - * @{ - */ -#define TIM_CLEARINPUTPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_CLEARINPUTPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR pin: Capture performed once every 2 events. */ -#define TIM_CLEARINPUTPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR pin: Capture performed once every 4 events. */ -#define TIM_CLEARINPUTPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR pin: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state TIM OSSR OffState Selection for Run mode state - * @{ - */ -#define TIM_OSSR_ENABLE TIM_BDTR_OSSR /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ -#define TIM_OSSR_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ -/** - * @} - */ - -/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state TIM OSSI OffState Selection for Idle mode state - * @{ - */ -#define TIM_OSSI_ENABLE TIM_BDTR_OSSI /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ -#define TIM_OSSI_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ -/** - * @} - */ -/** @defgroup TIM_Lock_level TIM Lock level - * @{ - */ -#define TIM_LOCKLEVEL_OFF 0x00000000U /*!< LOCK OFF */ -#define TIM_LOCKLEVEL_1 TIM_BDTR_LOCK_0 /*!< LOCK Level 1 */ -#define TIM_LOCKLEVEL_2 TIM_BDTR_LOCK_1 /*!< LOCK Level 2 */ -#define TIM_LOCKLEVEL_3 TIM_BDTR_LOCK /*!< LOCK Level 3 */ -/** - * @} - */ - -/** @defgroup TIM_Break_Input_enable_disable TIM Break Input Enable - * @{ - */ -#define TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break input BRK is enabled */ -#define TIM_BREAK_DISABLE 0x00000000U /*!< Break input BRK is disabled */ -/** - * @} - */ - -/** @defgroup TIM_Break_Polarity TIM Break Input Polarity - * @{ - */ -#define TIM_BREAKPOLARITY_LOW 0x00000000U /*!< Break input BRK is active low */ -#define TIM_BREAKPOLARITY_HIGH TIM_BDTR_BKP /*!< Break input BRK is active high */ -/** - * @} - */ - -/** @defgroup TIM_AOE_Bit_Set_Reset TIM Automatic Output Enable - * @{ - */ -#define TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /*!< MOE can be set only by software */ -#define TIM_AUTOMATICOUTPUT_ENABLE TIM_BDTR_AOE /*!< MOE can be set by software or automatically at the next update event (if none of the break inputs BRK and BRK2 is active) */ -/** - * @} - */ - -/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection - * @{ - */ -#define TIM_TRGO_RESET 0x00000000U /*!< TIMx_EGR.UG bit is used as trigger output (TRGO) */ -#define TIM_TRGO_ENABLE TIM_CR2_MMS_0 /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO) */ -#define TIM_TRGO_UPDATE TIM_CR2_MMS_1 /*!< Update event is used as trigger output (TRGO) */ -#define TIM_TRGO_OC1 (TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< Capture or a compare match 1 is used as trigger output (TRGO) */ -#define TIM_TRGO_OC1REF TIM_CR2_MMS_2 /*!< OC1REF signal is used as trigger output (TRGO) */ -#define TIM_TRGO_OC2REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_0) /*!< OC2REF signal is used as trigger output(TRGO) */ -#define TIM_TRGO_OC3REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1) /*!< OC3REF signal is used as trigger output(TRGO) */ -#define TIM_TRGO_OC4REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< OC4REF signal is used as trigger output(TRGO) */ -/** - * @} - */ - -/** @defgroup TIM_Master_Slave_Mode TIM Master/Slave Mode - * @{ - */ -#define TIM_MASTERSLAVEMODE_ENABLE TIM_SMCR_MSM /*!< No action */ -#define TIM_MASTERSLAVEMODE_DISABLE 0x00000000U /*!< Master/slave mode is selected */ -/** - * @} - */ - -/** @defgroup TIM_Slave_Mode TIM Slave mode - * @{ - */ -#define TIM_SLAVEMODE_DISABLE 0x00000000U /*!< Slave mode disabled */ -#define TIM_SLAVEMODE_RESET TIM_SMCR_SMS_2 /*!< Reset Mode */ -#define TIM_SLAVEMODE_GATED (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0) /*!< Gated Mode */ -#define TIM_SLAVEMODE_TRIGGER (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1) /*!< Trigger Mode */ -#define TIM_SLAVEMODE_EXTERNAL1 (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< External Clock Mode 1 */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_and_PWM_modes TIM Output Compare and PWM Modes - * @{ - */ -#define TIM_OCMODE_TIMING 0x00000000U /*!< Frozen */ -#define TIM_OCMODE_ACTIVE TIM_CCMR1_OC1M_0 /*!< Set channel to active level on match */ -#define TIM_OCMODE_INACTIVE TIM_CCMR1_OC1M_1 /*!< Set channel to inactive level on match */ -#define TIM_OCMODE_TOGGLE (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< Toggle */ -#define TIM_OCMODE_PWM1 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1) /*!< PWM mode 1 */ -#define TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< PWM mode 2 */ -#define TIM_OCMODE_FORCED_ACTIVE (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0) /*!< Force active level */ -#define TIM_OCMODE_FORCED_INACTIVE TIM_CCMR1_OC1M_2 /*!< Force inactive level */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Selection TIM Trigger Selection - * @{ - */ -#define TIM_TS_ITR0 0x00000000U /*!< Internal Trigger 0 (ITR0) */ -#define TIM_TS_ITR1 TIM_SMCR_TS_0 /*!< Internal Trigger 1 (ITR1) */ -#define TIM_TS_ITR2 TIM_SMCR_TS_1 /*!< Internal Trigger 2 (ITR2) */ -#define TIM_TS_ITR3 (TIM_SMCR_TS_0 | TIM_SMCR_TS_1) /*!< Internal Trigger 3 (ITR3) */ -#define TIM_TS_TI1F_ED TIM_SMCR_TS_2 /*!< TI1 Edge Detector (TI1F_ED) */ -#define TIM_TS_TI1FP1 (TIM_SMCR_TS_0 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 1 (TI1FP1) */ -#define TIM_TS_TI2FP2 (TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 2 (TI2FP2) */ -#define TIM_TS_ETRF (TIM_SMCR_TS_0 | TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered External Trigger input (ETRF) */ -#define TIM_TS_NONE 0x0000FFFFU /*!< No trigger selected */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Polarity TIM Trigger Polarity - * @{ - */ -#define TIM_TRIGGERPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx trigger sources */ -#define TIM_TRIGGERPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx trigger sources */ -#define TIM_TRIGGERPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -#define TIM_TRIGGERPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -#define TIM_TRIGGERPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Prescaler TIM Trigger Prescaler - * @{ - */ -#define TIM_TRIGGERPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_TRIGGERPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Trigger: Capture performed once every 2 events. */ -#define TIM_TRIGGERPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Trigger: Capture performed once every 4 events. */ -#define TIM_TRIGGERPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Trigger: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_TI1_Selection TIM TI1 Input Selection - * @{ - */ -#define TIM_TI1SELECTION_CH1 0x00000000U /*!< The TIMx_CH1 pin is connected to TI1 input */ -#define TIM_TI1SELECTION_XORCOMBINATION TIM_CR2_TI1S /*!< The TIMx_CH1, CH2 and CH3 pins are connected to the TI1 input (XOR combination) */ -/** - * @} - */ - -/** @defgroup TIM_DMA_Burst_Length TIM DMA Burst Length - * @{ - */ -#define TIM_DMABURSTLENGTH_1TRANSFER 0x00000000U /*!< The transfer is done to 1 register starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_2TRANSFERS 0x00000100U /*!< The transfer is done to 2 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_3TRANSFERS 0x00000200U /*!< The transfer is done to 3 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_4TRANSFERS 0x00000300U /*!< The transfer is done to 4 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_5TRANSFERS 0x00000400U /*!< The transfer is done to 5 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_6TRANSFERS 0x00000500U /*!< The transfer is done to 6 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_7TRANSFERS 0x00000600U /*!< The transfer is done to 7 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_8TRANSFERS 0x00000700U /*!< The transfer is done to 8 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_9TRANSFERS 0x00000800U /*!< The transfer is done to 9 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_10TRANSFERS 0x00000900U /*!< The transfer is done to 10 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_11TRANSFERS 0x00000A00U /*!< The transfer is done to 11 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_12TRANSFERS 0x00000B00U /*!< The transfer is done to 12 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_13TRANSFERS 0x00000C00U /*!< The transfer is done to 13 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_14TRANSFERS 0x00000D00U /*!< The transfer is done to 14 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_15TRANSFERS 0x00000E00U /*!< The transfer is done to 15 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_16TRANSFERS 0x00000F00U /*!< The transfer is done to 16 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_17TRANSFERS 0x00001000U /*!< The transfer is done to 17 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_18TRANSFERS 0x00001100U /*!< The transfer is done to 18 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -/** - * @} - */ - -/** @defgroup DMA_Handle_index TIM DMA Handle Index - * @{ - */ -#define TIM_DMA_ID_UPDATE ((uint16_t) 0x0000) /*!< Index of the DMA handle used for Update DMA requests */ -#define TIM_DMA_ID_CC1 ((uint16_t) 0x0001) /*!< Index of the DMA handle used for Capture/Compare 1 DMA requests */ -#define TIM_DMA_ID_CC2 ((uint16_t) 0x0002) /*!< Index of the DMA handle used for Capture/Compare 2 DMA requests */ -#define TIM_DMA_ID_CC3 ((uint16_t) 0x0003) /*!< Index of the DMA handle used for Capture/Compare 3 DMA requests */ -#define TIM_DMA_ID_CC4 ((uint16_t) 0x0004) /*!< Index of the DMA handle used for Capture/Compare 4 DMA requests */ -#define TIM_DMA_ID_COMMUTATION ((uint16_t) 0x0005) /*!< Index of the DMA handle used for Commutation DMA requests */ -#define TIM_DMA_ID_TRIGGER ((uint16_t) 0x0006) /*!< Index of the DMA handle used for Trigger DMA requests */ -/** - * @} - */ - -/** @defgroup Channel_CC_State TIM Capture/Compare Channel State - * @{ - */ -#define TIM_CCx_ENABLE 0x00000001U /*!< Input or output channel is enabled */ -#define TIM_CCx_DISABLE 0x00000000U /*!< Input or output channel is disabled */ -#define TIM_CCxN_ENABLE 0x00000004U /*!< Complementary output channel is enabled */ -#define TIM_CCxN_DISABLE 0x00000000U /*!< Complementary output channel is enabled */ -/** - * @} - */ - -/** - * @} - */ -/* End of exported constants -------------------------------------------------*/ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup TIM_Exported_Macros TIM Exported Macros - * @{ - */ - -/** @brief Reset TIM handle state. - * @param __HANDLE__ TIM handle. - * @retval None - */ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ - (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ - (__HANDLE__)->ChannelState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->DMABurstState = HAL_DMA_BURST_STATE_RESET; \ - (__HANDLE__)->Base_MspInitCallback = NULL; \ - (__HANDLE__)->Base_MspDeInitCallback = NULL; \ - (__HANDLE__)->IC_MspInitCallback = NULL; \ - (__HANDLE__)->IC_MspDeInitCallback = NULL; \ - (__HANDLE__)->OC_MspInitCallback = NULL; \ - (__HANDLE__)->OC_MspDeInitCallback = NULL; \ - (__HANDLE__)->PWM_MspInitCallback = NULL; \ - (__HANDLE__)->PWM_MspDeInitCallback = NULL; \ - (__HANDLE__)->OnePulse_MspInitCallback = NULL; \ - (__HANDLE__)->OnePulse_MspDeInitCallback = NULL; \ - (__HANDLE__)->Encoder_MspInitCallback = NULL; \ - (__HANDLE__)->Encoder_MspDeInitCallback = NULL; \ - (__HANDLE__)->HallSensor_MspInitCallback = NULL; \ - (__HANDLE__)->HallSensor_MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ - (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ - (__HANDLE__)->ChannelState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->DMABurstState = HAL_DMA_BURST_STATE_RESET; \ - } while(0) -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @brief Enable the TIM peripheral. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|=(TIM_CR1_CEN)) - -/** - * @brief Enable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_MOE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->BDTR|=(TIM_BDTR_MOE)) - -/** - * @brief Disable the TIM peripheral. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) - -/** - * @brief Disable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been - * disabled - */ -#define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) - -/** - * @brief Disable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - * @note The Main Output Enable of a timer instance is disabled unconditionally - */ -#define __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(__HANDLE__) (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE) - -/** @brief Enable the specified TIM interrupt. - * @param __HANDLE__ specifies the TIM Handle. - * @param __INTERRUPT__ specifies the TIM interrupt source to enable. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__)) - -/** @brief Disable the specified TIM interrupt. - * @param __HANDLE__ specifies the TIM Handle. - * @param __INTERRUPT__ specifies the TIM interrupt source to disable. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER &= ~(__INTERRUPT__)) - -/** @brief Enable the specified DMA request. - * @param __HANDLE__ specifies the TIM Handle. - * @param __DMA__ specifies the TIM DMA request to enable. - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: Update DMA request - * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request - * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request - * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request - * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request - * @arg TIM_DMA_COM: Commutation DMA request - * @arg TIM_DMA_TRIGGER: Trigger DMA request - * @retval None - */ -#define __HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER |= (__DMA__)) - -/** @brief Disable the specified DMA request. - * @param __HANDLE__ specifies the TIM Handle. - * @param __DMA__ specifies the TIM DMA request to disable. - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: Update DMA request - * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request - * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request - * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request - * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request - * @arg TIM_DMA_COM: Commutation DMA request - * @arg TIM_DMA_TRIGGER: Trigger DMA request - * @retval None - */ -#define __HAL_TIM_DISABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER &= ~(__DMA__)) - -/** @brief Check whether the specified TIM interrupt flag is set or not. - * @param __HANDLE__ specifies the TIM Handle. - * @param __FLAG__ specifies the TIM interrupt flag to check. - * This parameter can be one of the following values: - * @arg TIM_FLAG_UPDATE: Update interrupt flag - * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag - * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag - * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag - * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag - * @arg TIM_FLAG_COM: Commutation interrupt flag - * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag - * @arg TIM_FLAG_BREAK: Break interrupt flag - * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag - * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag - * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag - * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__)) - -/** @brief Clear the specified TIM interrupt flag. - * @param __HANDLE__ specifies the TIM Handle. - * @param __FLAG__ specifies the TIM interrupt flag to clear. - * This parameter can be one of the following values: - * @arg TIM_FLAG_UPDATE: Update interrupt flag - * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag - * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag - * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag - * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag - * @arg TIM_FLAG_COM: Commutation interrupt flag - * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag - * @arg TIM_FLAG_BREAK: Break interrupt flag - * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag - * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag - * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag - * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) - -/** - * @brief Check whether the specified TIM interrupt source is enabled or not. - * @param __HANDLE__ TIM handle - * @param __INTERRUPT__ specifies the TIM interrupt source to check. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval The state of TIM_IT (SET or RESET). - */ -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ - == (__INTERRUPT__)) ? SET : RESET) - -/** @brief Clear the TIM interrupt pending bits. - * @param __HANDLE__ TIM handle - * @param __INTERRUPT__ specifies the interrupt pending bit to clear. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) - -/** - * @brief Indicates whether or not the TIM Counter is used as downcounter. - * @param __HANDLE__ TIM handle. - * @retval False (Counter used as upcounter) or True (Counter used as downcounter) - * @note This macro is particularly useful to get the counting mode when the timer operates in Center-aligned mode - * or Encoder mode. - */ -#define __HAL_TIM_IS_TIM_COUNTING_DOWN(__HANDLE__) (((__HANDLE__)->Instance->CR1 &(TIM_CR1_DIR)) == (TIM_CR1_DIR)) - -/** - * @brief Set the TIM Prescaler on runtime. - * @param __HANDLE__ TIM handle. - * @param __PRESC__ specifies the Prescaler new value. - * @retval None - */ -#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__)) - -/** - * @brief Set the TIM Counter Register value on runtime. - * @param __HANDLE__ TIM handle. - * @param __COUNTER__ specifies the Counter register new value. - * @retval None - */ -#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->CNT = (__COUNTER__)) - -/** - * @brief Get the TIM Counter Register value on runtime. - * @param __HANDLE__ TIM handle. - * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) - */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) - -/** - * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. - * @param __HANDLE__ TIM handle. - * @param __AUTORELOAD__ specifies the Counter register new value. - * @retval None - */ -#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) - -/** - * @brief Get the TIM Autoreload Register value on runtime. - * @param __HANDLE__ TIM handle. - * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) - */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) - -/** - * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. - * @param __HANDLE__ TIM handle. - * @param __CKD__ specifies the clock division value. - * This parameter can be one of the following value: - * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT - * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT - * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT - * @retval None - */ -#define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) - -/** - * @brief Get the TIM Clock Division value on runtime. - * @param __HANDLE__ TIM handle. - * @retval The clock division can be one of the following values: - * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT - * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT - * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT - */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) - -/** - * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() - * function. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __ICPSC__ specifies the Input Capture4 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -#define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) - -/** - * @brief Get the TIM Input Capture prescaler on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: get input capture 1 prescaler value - * @arg TIM_CHANNEL_2: get input capture 2 prescaler value - * @arg TIM_CHANNEL_3: get input capture 3 prescaler value - * @arg TIM_CHANNEL_4: get input capture 4 prescaler value - * @retval The input capture prescaler can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - */ -#define __HAL_TIM_GET_ICPRESCALER(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? (((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC2PSC) >> 8U) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC3PSC) :\ - (((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC4PSC)) >> 8U) - -/** - * @brief Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __COMPARE__ specifies the Capture Compare register new value. - * @retval None - */ -#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ - ((__HANDLE__)->Instance->CCR4 = (__COMPARE__))) - -/** - * @brief Get the TIM Capture Compare Register value on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channel associated with the capture compare register - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: get capture/compare 1 register value - * @arg TIM_CHANNEL_2: get capture/compare 2 register value - * @arg TIM_CHANNEL_3: get capture/compare 3 register value - * @arg TIM_CHANNEL_4: get capture/compare 4 register value - * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) - */ -#define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ - ((__HANDLE__)->Instance->CCR4)) - -/** - * @brief Set the TIM Output compare preload. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval None - */ -#define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ - ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE)) - -/** - * @brief Reset the TIM Output compare preload. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval None - */ -#define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE)) - -/** - * @brief Enable fast mode for a given channel. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @note When fast mode is enabled an active edge on the trigger input acts - * like a compare match on CCx output. Delay to sample the trigger - * input and to activate CCx output is reduced to 3 clock cycles. - * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. - * @retval None - */ -#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ - ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE)) - -/** - * @brief Disable fast mode for a given channel. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @note When fast mode is disabled CCx output behaves normally depending - * on counter and CCRx values even when the trigger is ON. The minimum - * delay to activate CCx output when an active edge occurs on the - * trigger input is 5 clock cycles. - * @retval None - */ -#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE)) - -/** - * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. - * @param __HANDLE__ TIM handle. - * @note When the URS bit of the TIMx_CR1 register is set, only counter - * overflow/underflow generates an update interrupt or DMA request (if - * enabled) - * @retval None - */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) - -/** - * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. - * @param __HANDLE__ TIM handle. - * @note When the URS bit of the TIMx_CR1 register is reset, any of the - * following events generate an update interrupt or DMA request (if - * enabled): - * _ Counter overflow underflow - * _ Setting the UG bit - * _ Update generation through the slave mode controller - * @retval None - */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) - -/** - * @brief Set the TIM Capture x input polarity on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __POLARITY__ Polarity for TIx source - * @arg TIM_INPUTCHANNELPOLARITY_RISING: Rising Edge - * @arg TIM_INPUTCHANNELPOLARITY_FALLING: Falling Edge - * @arg TIM_INPUTCHANNELPOLARITY_BOTHEDGE: Rising and Falling Edge - * @retval None - */ -#define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) - -/** @brief Select the Capture/compare DMA request source. - * @param __HANDLE__ specifies the TIM Handle. - * @param __CCDMA__ specifies Capture/compare DMA request source - * This parameter can be one of the following values: - * @arg TIM_CCDMAREQUEST_CC: CCx DMA request generated on Capture/Compare event - * @arg TIM_CCDMAREQUEST_UPDATE: CCx DMA request generated on Update event - * @retval None - */ -#define __HAL_TIM_SELECT_CCDMAREQUEST(__HANDLE__, __CCDMA__) \ - MODIFY_REG((__HANDLE__)->Instance->CR2, TIM_CR2_CCDS, (__CCDMA__)) - -/** - * @} - */ -/* End of exported macros ----------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup TIM_Private_Constants TIM Private Constants - * @{ - */ -/* The counter of a timer instance is disabled only if all the CCx and CCxN - channels have been disabled */ -#define TIM_CCER_CCxE_MASK ((uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)) -#define TIM_CCER_CCxNE_MASK ((uint32_t)(TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) -/** - * @} - */ -/* End of private constants --------------------------------------------------*/ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup TIM_Private_Macros TIM Private Macros - * @{ - */ -#define IS_TIM_CLEARINPUT_SOURCE(__MODE__) (((__MODE__) == TIM_CLEARINPUTSOURCE_NONE) || \ - ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) - -#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ - ((__BASE__) == TIM_DMABASE_CR2) || \ - ((__BASE__) == TIM_DMABASE_SMCR) || \ - ((__BASE__) == TIM_DMABASE_DIER) || \ - ((__BASE__) == TIM_DMABASE_SR) || \ - ((__BASE__) == TIM_DMABASE_EGR) || \ - ((__BASE__) == TIM_DMABASE_CCMR1) || \ - ((__BASE__) == TIM_DMABASE_CCMR2) || \ - ((__BASE__) == TIM_DMABASE_CCER) || \ - ((__BASE__) == TIM_DMABASE_CNT) || \ - ((__BASE__) == TIM_DMABASE_PSC) || \ - ((__BASE__) == TIM_DMABASE_ARR) || \ - ((__BASE__) == TIM_DMABASE_RCR) || \ - ((__BASE__) == TIM_DMABASE_CCR1) || \ - ((__BASE__) == TIM_DMABASE_CCR2) || \ - ((__BASE__) == TIM_DMABASE_CCR3) || \ - ((__BASE__) == TIM_DMABASE_CCR4) || \ - ((__BASE__) == TIM_DMABASE_BDTR)) - -#define IS_TIM_EVENT_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFFFF00U) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) - -#define IS_TIM_COUNTER_MODE(__MODE__) (((__MODE__) == TIM_COUNTERMODE_UP) || \ - ((__MODE__) == TIM_COUNTERMODE_DOWN) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED1) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) - -#define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ - ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ - ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) - -#define IS_TIM_AUTORELOAD_PRELOAD(PRELOAD) (((PRELOAD) == TIM_AUTORELOAD_PRELOAD_DISABLE) || \ - ((PRELOAD) == TIM_AUTORELOAD_PRELOAD_ENABLE)) - -#define IS_TIM_FAST_STATE(__STATE__) (((__STATE__) == TIM_OCFAST_DISABLE) || \ - ((__STATE__) == TIM_OCFAST_ENABLE)) - -#define IS_TIM_OC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCPOLARITY_HIGH) || \ - ((__POLARITY__) == TIM_OCPOLARITY_LOW)) - -#define IS_TIM_OCN_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCNPOLARITY_HIGH) || \ - ((__POLARITY__) == TIM_OCNPOLARITY_LOW)) - -#define IS_TIM_OCIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCIDLESTATE_SET) || \ - ((__STATE__) == TIM_OCIDLESTATE_RESET)) - -#define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ - ((__STATE__) == TIM_OCNIDLESTATE_RESET)) - -#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) - -#define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ - ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) - -#define IS_TIM_IC_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_ICSELECTION_DIRECTTI) || \ - ((__SELECTION__) == TIM_ICSELECTION_INDIRECTTI) || \ - ((__SELECTION__) == TIM_ICSELECTION_TRC)) - -#define IS_TIM_IC_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_ICPSC_DIV1) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV2) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV4) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV8)) - -#define IS_TIM_OPM_MODE(__MODE__) (((__MODE__) == TIM_OPMODE_SINGLE) || \ - ((__MODE__) == TIM_OPMODE_REPETITIVE)) - -#define IS_TIM_ENCODER_MODE(__MODE__) (((__MODE__) == TIM_ENCODERMODE_TI1) || \ - ((__MODE__) == TIM_ENCODERMODE_TI2) || \ - ((__MODE__) == TIM_ENCODERMODE_TI12)) - -#define IS_TIM_DMA_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFF80FFU) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) - -#define IS_TIM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2) || \ - ((__CHANNEL__) == TIM_CHANNEL_3) || \ - ((__CHANNEL__) == TIM_CHANNEL_4) || \ - ((__CHANNEL__) == TIM_CHANNEL_ALL)) - -#define IS_TIM_OPM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2)) - -#define IS_TIM_PERIOD(__HANDLE__, __PERIOD__) ((IS_TIM_32B_COUNTER_INSTANCE(((__HANDLE__)->Instance)) == 0U) ? \ - (((__PERIOD__) > 0U) && ((__PERIOD__) <= 0x0000FFFFU)) : \ - ((__PERIOD__) > 0U)) - -#define IS_TIM_COMPLEMENTARY_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2) || \ - ((__CHANNEL__) == TIM_CHANNEL_3)) - -#define IS_TIM_CLOCKSOURCE(__CLOCK__) (((__CLOCK__) == TIM_CLOCKSOURCE_INTERNAL) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE1) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI1ED) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI1) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR0) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR1) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR3)) - -#define IS_TIM_CLOCKPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLOCKPOLARITY_INVERTED) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_NONINVERTED) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_FALLING) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_BOTHEDGE)) - -#define IS_TIM_CLOCKPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV8)) - -#define IS_TIM_CLOCKFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_CLEARINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLEARINPUTPOLARITY_INVERTED) || \ - ((__POLARITY__) == TIM_CLEARINPUTPOLARITY_NONINVERTED)) - -#define IS_TIM_CLEARINPUT_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV8)) - -#define IS_TIM_CLEARINPUT_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_OSSR_STATE(__STATE__) (((__STATE__) == TIM_OSSR_ENABLE) || \ - ((__STATE__) == TIM_OSSR_DISABLE)) - -#define IS_TIM_OSSI_STATE(__STATE__) (((__STATE__) == TIM_OSSI_ENABLE) || \ - ((__STATE__) == TIM_OSSI_DISABLE)) - -#define IS_TIM_LOCK_LEVEL(__LEVEL__) (((__LEVEL__) == TIM_LOCKLEVEL_OFF) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_1) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_2) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_3)) - -#define IS_TIM_BREAK_FILTER(__BRKFILTER__) ((__BRKFILTER__) <= 0xFUL) - -#define IS_TIM_BREAK_STATE(__STATE__) (((__STATE__) == TIM_BREAK_ENABLE) || \ - ((__STATE__) == TIM_BREAK_DISABLE)) - -#define IS_TIM_BREAK_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_BREAKPOLARITY_LOW) || \ - ((__POLARITY__) == TIM_BREAKPOLARITY_HIGH)) - -#define IS_TIM_AUTOMATIC_OUTPUT_STATE(__STATE__) (((__STATE__) == TIM_AUTOMATICOUTPUT_ENABLE) || \ - ((__STATE__) == TIM_AUTOMATICOUTPUT_DISABLE)) - -#define IS_TIM_TRGO_SOURCE(__SOURCE__) (((__SOURCE__) == TIM_TRGO_RESET) || \ - ((__SOURCE__) == TIM_TRGO_ENABLE) || \ - ((__SOURCE__) == TIM_TRGO_UPDATE) || \ - ((__SOURCE__) == TIM_TRGO_OC1) || \ - ((__SOURCE__) == TIM_TRGO_OC1REF) || \ - ((__SOURCE__) == TIM_TRGO_OC2REF) || \ - ((__SOURCE__) == TIM_TRGO_OC3REF) || \ - ((__SOURCE__) == TIM_TRGO_OC4REF)) - -#define IS_TIM_MSM_STATE(__STATE__) (((__STATE__) == TIM_MASTERSLAVEMODE_ENABLE) || \ - ((__STATE__) == TIM_MASTERSLAVEMODE_DISABLE)) - -#define IS_TIM_SLAVE_MODE(__MODE__) (((__MODE__) == TIM_SLAVEMODE_DISABLE) || \ - ((__MODE__) == TIM_SLAVEMODE_RESET) || \ - ((__MODE__) == TIM_SLAVEMODE_GATED) || \ - ((__MODE__) == TIM_SLAVEMODE_TRIGGER) || \ - ((__MODE__) == TIM_SLAVEMODE_EXTERNAL1)) - -#define IS_TIM_PWM_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_PWM1) || \ - ((__MODE__) == TIM_OCMODE_PWM2)) - -#define IS_TIM_OC_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_TIMING) || \ - ((__MODE__) == TIM_OCMODE_ACTIVE) || \ - ((__MODE__) == TIM_OCMODE_INACTIVE) || \ - ((__MODE__) == TIM_OCMODE_TOGGLE) || \ - ((__MODE__) == TIM_OCMODE_FORCED_ACTIVE) || \ - ((__MODE__) == TIM_OCMODE_FORCED_INACTIVE)) - -#define IS_TIM_TRIGGER_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ - ((__SELECTION__) == TIM_TS_ITR1) || \ - ((__SELECTION__) == TIM_TS_ITR2) || \ - ((__SELECTION__) == TIM_TS_ITR3) || \ - ((__SELECTION__) == TIM_TS_TI1F_ED) || \ - ((__SELECTION__) == TIM_TS_TI1FP1) || \ - ((__SELECTION__) == TIM_TS_TI2FP2) || \ - ((__SELECTION__) == TIM_TS_ETRF)) - -#define IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ - ((__SELECTION__) == TIM_TS_ITR1) || \ - ((__SELECTION__) == TIM_TS_ITR2) || \ - ((__SELECTION__) == TIM_TS_ITR3) || \ - ((__SELECTION__) == TIM_TS_NONE)) - -#define IS_TIM_TRIGGERPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_TRIGGERPOLARITY_INVERTED ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_NONINVERTED) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_RISING ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_FALLING ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_BOTHEDGE )) - -#define IS_TIM_TRIGGERPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV8)) - -#define IS_TIM_TRIGGERFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_TI1SELECTION(__TI1SELECTION__) (((__TI1SELECTION__) == TIM_TI1SELECTION_CH1) || \ - ((__TI1SELECTION__) == TIM_TI1SELECTION_XORCOMBINATION)) - -#define IS_TIM_DMA_LENGTH(__LENGTH__) (((__LENGTH__) == TIM_DMABURSTLENGTH_1TRANSFER) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_2TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_3TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_4TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_5TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_6TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_7TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_8TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_9TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_10TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_11TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_12TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_13TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_14TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_15TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_16TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_17TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_18TRANSFERS)) - -#define IS_TIM_DMA_DATA_LENGTH(LENGTH) (((LENGTH) >= 0x1U) && ((LENGTH) < 0x10000U)) - -#define IS_TIM_IC_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_DEADTIME(__DEADTIME__) ((__DEADTIME__) <= 0xFFU) - -#define IS_TIM_SLAVEMODE_TRIGGER_ENABLED(__TRIGGER__) ((__TRIGGER__) == TIM_SLAVEMODE_TRIGGER) - -#define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) - -#define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) - -#define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) - -#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) - -#define TIM_CHANNEL_STATE_GET(__HANDLE__, __CHANNEL__)\ - (((__CHANNEL__) == TIM_CHANNEL_1) ? (__HANDLE__)->ChannelState[0] :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? (__HANDLE__)->ChannelState[1] :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? (__HANDLE__)->ChannelState[2] :\ - (__HANDLE__)->ChannelState[3]) - -#define TIM_CHANNEL_STATE_SET(__HANDLE__, __CHANNEL__, __CHANNEL_STATE__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->ChannelState[0] = (__CHANNEL_STATE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->ChannelState[1] = (__CHANNEL_STATE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->ChannelState[2] = (__CHANNEL_STATE__)) :\ - ((__HANDLE__)->ChannelState[3] = (__CHANNEL_STATE__))) - -#define TIM_CHANNEL_STATE_SET_ALL(__HANDLE__, __CHANNEL_STATE__) do { \ - (__HANDLE__)->ChannelState[0] = (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelState[1] = (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelState[2] = (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelState[3] = (__CHANNEL_STATE__); \ - } while(0) - -#define TIM_CHANNEL_N_STATE_GET(__HANDLE__, __CHANNEL__)\ - (((__CHANNEL__) == TIM_CHANNEL_1) ? (__HANDLE__)->ChannelNState[0] :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? (__HANDLE__)->ChannelNState[1] :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? (__HANDLE__)->ChannelNState[2] :\ - (__HANDLE__)->ChannelNState[3]) - -#define TIM_CHANNEL_N_STATE_SET(__HANDLE__, __CHANNEL__, __CHANNEL_STATE__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->ChannelNState[0] = (__CHANNEL_STATE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->ChannelNState[1] = (__CHANNEL_STATE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->ChannelNState[2] = (__CHANNEL_STATE__)) :\ - ((__HANDLE__)->ChannelNState[3] = (__CHANNEL_STATE__))) - -#define TIM_CHANNEL_N_STATE_SET_ALL(__HANDLE__, __CHANNEL_STATE__) do { \ - (__HANDLE__)->ChannelNState[0] = \ - (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelNState[1] = \ - (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelNState[2] = \ - (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelNState[3] = \ - (__CHANNEL_STATE__); \ - } while(0) - -/** - * @} - */ -/* End of private macros -----------------------------------------------------*/ - -/* Include TIM HAL Extended module */ -#include "stm32f4xx_hal_tim_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup TIM_Exported_Functions TIM Exported Functions - * @{ - */ - -/** @addtogroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * @{ - */ -/* Time Base functions ********************************************************/ -HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, const uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * @{ - */ -/* Timer Output Compare functions *********************************************/ -HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length); -HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * @{ - */ -/* Timer PWM functions ********************************************************/ -HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length); -HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * @{ - */ -/* Timer Input Capture functions **********************************************/ -HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * @{ - */ -/* Timer One Pulse functions **************************************************/ -HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode); -HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * @{ - */ -/* Timer Encoder functions ****************************************************/ -HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, const TIM_Encoder_InitTypeDef *sConfig); -HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, - uint32_t *pData2, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief IRQ handler management - * @{ - */ -/* Interrupt Handler functions ***********************************************/ -void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ -/* Control functions *********************************************************/ -HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_OC_InitTypeDef *sConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_OC_InitTypeDef *sConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_IC_InitTypeDef *sConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, - uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, - const TIM_ClearInputConfigTypeDef *sClearInputConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, const TIM_ClockConfigTypeDef *sClockSourceConfig); -HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, - uint32_t BurstLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, - uint32_t BurstLength, uint32_t DataLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, - uint32_t BurstLength, uint32_t DataLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); -uint32_t HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * @{ - */ -/* Callback in non blocking modes (Interrupt and DMA) *************************/ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, - pTIM_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief Peripheral State functions - * @{ - */ -/* Peripheral State functions ************************************************/ -HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(const TIM_HandleTypeDef *htim); - -/* Peripheral Channel state functions ************************************************/ -HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(const TIM_HandleTypeDef *htim); -HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(const TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(const TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** - * @} - */ -/* End of exported functions -------------------------------------------------*/ - -/* Private functions----------------------------------------------------------*/ -/** @defgroup TIM_Private_Functions TIM Private Functions - * @{ - */ -void TIM_Base_SetConfig(TIM_TypeDef *TIMx, const TIM_Base_InitTypeDef *Structure); -void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); -void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); -void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, - uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter); - -void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma); -void TIM_DMAError(DMA_HandleTypeDef *hdma); -void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma); -void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma); -void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -void TIM_ResetCallback(TIM_HandleTypeDef *htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ -/* End of private functions --------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_TIM_H */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h deleted file mode 100644 index 561e9bb..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h +++ /dev/null @@ -1,355 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim_ex.h - * @author MCD Application Team - * @brief Header file of TIM HAL Extended module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_TIM_EX_H -#define STM32F4xx_HAL_TIM_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup TIMEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Types TIM Extended Exported Types - * @{ - */ - -/** - * @brief TIM Hall sensor Configuration Structure definition - */ - -typedef struct -{ - uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC1Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t Commutation_Delay; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ -} TIM_HallSensor_InitTypeDef; -/** - * @} - */ -/* End of exported types -----------------------------------------------------*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Constants TIM Extended Exported Constants - * @{ - */ - -/** @defgroup TIMEx_Remap TIM Extended Remapping - * @{ - */ -#if defined (TIM2) -#if defined(TIM8) -#define TIM_TIM2_TIM8_TRGO 0x00000000U /*!< TIM2 ITR1 is connected to TIM8 TRGO */ -#endif /* TIM8 */ -#define TIM_TIM2_ETH_PTP TIM_OR_ITR1_RMP_0 /*!< TIM2 ITR1 is connected to PTP trigger output */ -#define TIM_TIM2_USBFS_SOF TIM_OR_ITR1_RMP_1 /*!< TIM2 ITR1 is connected to OTG FS SOF */ -#define TIM_TIM2_USBHS_SOF (TIM_OR_ITR1_RMP_1 | TIM_OR_ITR1_RMP_0) /*!< TIM2 ITR1 is connected to OTG HS SOF */ -#endif /* TIM2 */ - -#define TIM_TIM5_GPIO 0x00000000U /*!< TIM5 TI4 is connected to GPIO */ -#define TIM_TIM5_LSI TIM_OR_TI4_RMP_0 /*!< TIM5 TI4 is connected to LSI */ -#define TIM_TIM5_LSE TIM_OR_TI4_RMP_1 /*!< TIM5 TI4 is connected to LSE */ -#define TIM_TIM5_RTC (TIM_OR_TI4_RMP_1 | TIM_OR_TI4_RMP_0) /*!< TIM5 TI4 is connected to the RTC wakeup interrupt */ - -#define TIM_TIM11_GPIO 0x00000000U /*!< TIM11 TI1 is connected to GPIO */ -#define TIM_TIM11_HSE TIM_OR_TI1_RMP_1 /*!< TIM11 TI1 is connected to HSE_RTC clock */ -#if defined(SPDIFRX) -#define TIM_TIM11_SPDIFRX TIM_OR_TI1_RMP_0 /*!< TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC */ -#endif /* SPDIFRX*/ - -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) -#define LPTIM_REMAP_MASK 0x10000000U - -#define TIM_TIM9_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM9 ITR1 is connected to TIM3 TRGO */ -#define TIM_TIM9_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM9_ITR1_RMP) /*!< TIM9 ITR1 is connected to LPTIM1 output */ - -#define TIM_TIM5_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM5 ITR1 is connected to TIM3 TRGO */ -#define TIM_TIM5_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM5_ITR1_RMP) /*!< TIM5 ITR1 is connected to LPTIM1 output */ - -#define TIM_TIM1_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM1 ITR2 is connected to TIM3 TRGO */ -#define TIM_TIM1_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM1_ITR2_RMP) /*!< TIM1 ITR2 is connected to LPTIM1 output */ -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ -/** - * @} - */ - -/** - * @} - */ -/* End of exported constants -------------------------------------------------*/ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Macros TIM Extended Exported Macros - * @{ - */ - -/** - * @} - */ -/* End of exported macro -----------------------------------------------------*/ - -/* Private macro -------------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Macros TIM Extended Private Macros - * @{ - */ -#if defined(SPDIFRX) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_SPDIFRX) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#elif defined(TIM2) -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE))) || \ - (((INSTANCE) == TIM1) && (((TIM_REMAP) == TIM_TIM1_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM1_LPTIM))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM5_LPTIM))) || \ - (((INSTANCE) == TIM9) && (((TIM_REMAP) == TIM_TIM9_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM9_LPTIM)))) -#elif defined(TIM8) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#else -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_ETH_PTP) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ -#else -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#endif /* SPDIFRX */ - -/** - * @} - */ -/* End of private macro ------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup TIMEx_Exported_Functions TIM Extended Exported Functions - * @{ - */ - -/** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * @{ - */ -/* Timer Hall Sensor functions **********************************************/ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, const TIM_HallSensor_InitTypeDef *sConfig); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); - -void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim); - -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * @{ - */ -/* Timer Complementary Output Compare functions *****************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * @{ - */ -/* Timer Complementary PWM functions ****************************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * @{ - */ -/* Timer Complementary One Pulse functions **********************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ -/* Extended Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, - const TIM_MasterConfigTypeDef *sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, - const TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); -HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions - * @brief Extended Callbacks functions - * @{ - */ -/* Extended Callback **********************************************************/ -void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim); -void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions - * @brief Extended Peripheral State functions - * @{ - */ -/* Extended Peripheral State functions ***************************************/ -HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(const TIM_HandleTypeDef *htim, uint32_t ChannelN); -/** - * @} - */ - -/** - * @} - */ -/* End of exported functions -------------------------------------------------*/ - -/* Private functions----------------------------------------------------------*/ -/** @addtogroup TIMEx_Private_Functions TIM Extended Private Functions - * @{ - */ -void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); -void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma); -/** - * @} - */ -/* End of private functions --------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* STM32F4xx_HAL_TIM_EX_H */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_adc.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_adc.h deleted file mode 100644 index 13f6751..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_adc.h +++ /dev/null @@ -1,4782 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_adc.h - * @author MCD Application Team - * @brief Header file of ADC LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_ADC_H -#define __STM32F4xx_LL_ADC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (ADC1) || defined (ADC2) || defined (ADC3) - -/** @defgroup ADC_LL ADC - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup ADC_LL_Private_Constants ADC Private Constants - * @{ - */ - -/* Internal mask for ADC group regular sequencer: */ -/* To select into literal LL_ADC_REG_RANK_x the relevant bits for: */ -/* - sequencer register offset */ -/* - sequencer rank bits position into the selected register */ - -/* Internal register offset for ADC group regular sequencer configuration */ -/* (offset placed into a spare area of literal definition) */ -#define ADC_SQR1_REGOFFSET 0x00000000UL -#define ADC_SQR2_REGOFFSET 0x00000100UL -#define ADC_SQR3_REGOFFSET 0x00000200UL -#define ADC_SQR4_REGOFFSET 0x00000300UL - -#define ADC_REG_SQRX_REGOFFSET_MASK (ADC_SQR1_REGOFFSET | ADC_SQR2_REGOFFSET | ADC_SQR3_REGOFFSET | ADC_SQR4_REGOFFSET) -#define ADC_REG_RANK_ID_SQRX_MASK (ADC_CHANNEL_ID_NUMBER_MASK_POSBIT0) - -/* Definition of ADC group regular sequencer bits information to be inserted */ -/* into ADC group regular sequencer ranks literals definition. */ -#define ADC_REG_RANK_1_SQRX_BITOFFSET_POS ( 0UL) /* Value equivalent to POSITION_VAL(ADC_SQR3_SQ1) */ -#define ADC_REG_RANK_2_SQRX_BITOFFSET_POS ( 5UL) /* Value equivalent to POSITION_VAL(ADC_SQR3_SQ2) */ -#define ADC_REG_RANK_3_SQRX_BITOFFSET_POS (10UL) /* Value equivalent to POSITION_VAL(ADC_SQR3_SQ3) */ -#define ADC_REG_RANK_4_SQRX_BITOFFSET_POS (15UL) /* Value equivalent to POSITION_VAL(ADC_SQR3_SQ4) */ -#define ADC_REG_RANK_5_SQRX_BITOFFSET_POS (20UL) /* Value equivalent to POSITION_VAL(ADC_SQR3_SQ5) */ -#define ADC_REG_RANK_6_SQRX_BITOFFSET_POS (25UL) /* Value equivalent to POSITION_VAL(ADC_SQR3_SQ6) */ -#define ADC_REG_RANK_7_SQRX_BITOFFSET_POS ( 0UL) /* Value equivalent to POSITION_VAL(ADC_SQR2_SQ7) */ -#define ADC_REG_RANK_8_SQRX_BITOFFSET_POS ( 5UL) /* Value equivalent to POSITION_VAL(ADC_SQR2_SQ8) */ -#define ADC_REG_RANK_9_SQRX_BITOFFSET_POS (10UL) /* Value equivalent to POSITION_VAL(ADC_SQR2_SQ9) */ -#define ADC_REG_RANK_10_SQRX_BITOFFSET_POS (15UL) /* Value equivalent to POSITION_VAL(ADC_SQR2_SQ10) */ -#define ADC_REG_RANK_11_SQRX_BITOFFSET_POS (20UL) /* Value equivalent to POSITION_VAL(ADC_SQR2_SQ11) */ -#define ADC_REG_RANK_12_SQRX_BITOFFSET_POS (25UL) /* Value equivalent to POSITION_VAL(ADC_SQR2_SQ12) */ -#define ADC_REG_RANK_13_SQRX_BITOFFSET_POS ( 0UL) /* Value equivalent to POSITION_VAL(ADC_SQR1_SQ13) */ -#define ADC_REG_RANK_14_SQRX_BITOFFSET_POS ( 5UL) /* Value equivalent to POSITION_VAL(ADC_SQR1_SQ14) */ -#define ADC_REG_RANK_15_SQRX_BITOFFSET_POS (10UL) /* Value equivalent to POSITION_VAL(ADC_SQR1_SQ15) */ -#define ADC_REG_RANK_16_SQRX_BITOFFSET_POS (15UL) /* Value equivalent to POSITION_VAL(ADC_SQR1_SQ16) */ - -/* Internal mask for ADC group injected sequencer: */ -/* To select into literal LL_ADC_INJ_RANK_x the relevant bits for: */ -/* - data register offset */ -/* - offset register offset */ -/* - sequencer rank bits position into the selected register */ - -/* Internal register offset for ADC group injected data register */ -/* (offset placed into a spare area of literal definition) */ -#define ADC_JDR1_REGOFFSET 0x00000000UL -#define ADC_JDR2_REGOFFSET 0x00000100UL -#define ADC_JDR3_REGOFFSET 0x00000200UL -#define ADC_JDR4_REGOFFSET 0x00000300UL - -/* Internal register offset for ADC group injected offset configuration */ -/* (offset placed into a spare area of literal definition) */ -#define ADC_JOFR1_REGOFFSET 0x00000000UL -#define ADC_JOFR2_REGOFFSET 0x00001000UL -#define ADC_JOFR3_REGOFFSET 0x00002000UL -#define ADC_JOFR4_REGOFFSET 0x00003000UL - -#define ADC_INJ_JDRX_REGOFFSET_MASK (ADC_JDR1_REGOFFSET | ADC_JDR2_REGOFFSET | ADC_JDR3_REGOFFSET | ADC_JDR4_REGOFFSET) -#define ADC_INJ_JOFRX_REGOFFSET_MASK (ADC_JOFR1_REGOFFSET | ADC_JOFR2_REGOFFSET | ADC_JOFR3_REGOFFSET | ADC_JOFR4_REGOFFSET) -#define ADC_INJ_RANK_ID_JSQR_MASK (ADC_CHANNEL_ID_NUMBER_MASK_POSBIT0) - -/* Internal mask for ADC group regular trigger: */ -/* To select into literal LL_ADC_REG_TRIG_x the relevant bits for: */ -/* - regular trigger source */ -/* - regular trigger edge */ -#define ADC_REG_TRIG_EXT_EDGE_DEFAULT (ADC_CR2_EXTEN_0) /* Trigger edge set to rising edge (default setting for compatibility with some ADC on other STM32 families having this setting set by HW default value) */ - -/* Mask containing trigger source masks for each of possible */ -/* trigger edge selection duplicated with shifts [0; 4; 8; 12] */ -/* corresponding to {SW start; ext trigger; ext trigger; ext trigger}. */ -#define ADC_REG_TRIG_SOURCE_MASK (((LL_ADC_REG_TRIG_SOFTWARE & ADC_CR2_EXTSEL) >> (4UL * 0UL)) | \ - ((ADC_CR2_EXTSEL) >> (4UL * 1UL)) | \ - ((ADC_CR2_EXTSEL) >> (4UL * 2UL)) | \ - ((ADC_CR2_EXTSEL) >> (4UL * 3UL))) - -/* Mask containing trigger edge masks for each of possible */ -/* trigger edge selection duplicated with shifts [0; 4; 8; 12] */ -/* corresponding to {SW start; ext trigger; ext trigger; ext trigger}. */ -#define ADC_REG_TRIG_EDGE_MASK (((LL_ADC_REG_TRIG_SOFTWARE & ADC_CR2_EXTEN) >> (4UL * 0UL)) | \ - ((ADC_REG_TRIG_EXT_EDGE_DEFAULT) >> (4UL * 1UL)) | \ - ((ADC_REG_TRIG_EXT_EDGE_DEFAULT) >> (4UL * 2UL)) | \ - ((ADC_REG_TRIG_EXT_EDGE_DEFAULT) >> (4UL * 3UL))) - -/* Definition of ADC group regular trigger bits information. */ -#define ADC_REG_TRIG_EXTSEL_BITOFFSET_POS (24UL) /* Value equivalent to POSITION_VAL(ADC_CR2_EXTSEL) */ -#define ADC_REG_TRIG_EXTEN_BITOFFSET_POS (28UL) /* Value equivalent to POSITION_VAL(ADC_CR2_EXTEN) */ - - - -/* Internal mask for ADC group injected trigger: */ -/* To select into literal LL_ADC_INJ_TRIG_x the relevant bits for: */ -/* - injected trigger source */ -/* - injected trigger edge */ -#define ADC_INJ_TRIG_EXT_EDGE_DEFAULT (ADC_CR2_JEXTEN_0) /* Trigger edge set to rising edge (default setting for compatibility with some ADC on other STM32 families having this setting set by HW default value) */ - -/* Mask containing trigger source masks for each of possible */ -/* trigger edge selection duplicated with shifts [0; 4; 8; 12] */ -/* corresponding to {SW start; ext trigger; ext trigger; ext trigger}. */ -#define ADC_INJ_TRIG_SOURCE_MASK (((LL_ADC_REG_TRIG_SOFTWARE & ADC_CR2_JEXTSEL) >> (4UL * 0UL)) | \ - ((ADC_CR2_JEXTSEL) >> (4UL * 1UL)) | \ - ((ADC_CR2_JEXTSEL) >> (4UL * 2UL)) | \ - ((ADC_CR2_JEXTSEL) >> (4UL * 3UL))) - -/* Mask containing trigger edge masks for each of possible */ -/* trigger edge selection duplicated with shifts [0; 4; 8; 12] */ -/* corresponding to {SW start; ext trigger; ext trigger; ext trigger}. */ -#define ADC_INJ_TRIG_EDGE_MASK (((LL_ADC_INJ_TRIG_SOFTWARE & ADC_CR2_JEXTEN) >> (4UL * 0UL)) | \ - ((ADC_INJ_TRIG_EXT_EDGE_DEFAULT) >> (4UL * 1UL)) | \ - ((ADC_INJ_TRIG_EXT_EDGE_DEFAULT) >> (4UL * 2UL)) | \ - ((ADC_INJ_TRIG_EXT_EDGE_DEFAULT) >> (4UL * 3UL))) - -/* Definition of ADC group injected trigger bits information. */ -#define ADC_INJ_TRIG_EXTSEL_BITOFFSET_POS (16UL) /* Value equivalent to POSITION_VAL(ADC_CR2_JEXTSEL) */ -#define ADC_INJ_TRIG_EXTEN_BITOFFSET_POS (20UL) /* Value equivalent to POSITION_VAL(ADC_CR2_JEXTEN) */ - -/* Internal mask for ADC channel: */ -/* To select into literal LL_ADC_CHANNEL_x the relevant bits for: */ -/* - channel identifier defined by number */ -/* - channel differentiation between external channels (connected to */ -/* GPIO pins) and internal channels (connected to internal paths) */ -/* - channel sampling time defined by SMPRx register offset */ -/* and SMPx bits positions into SMPRx register */ -#define ADC_CHANNEL_ID_NUMBER_MASK (ADC_CR1_AWDCH) -#define ADC_CHANNEL_ID_NUMBER_BITOFFSET_POS ( 0UL)/* Value equivalent to POSITION_VAL(ADC_CHANNEL_ID_NUMBER_MASK) */ -#define ADC_CHANNEL_ID_MASK (ADC_CHANNEL_ID_NUMBER_MASK | ADC_CHANNEL_ID_INTERNAL_CH_MASK) -/* Equivalent mask of ADC_CHANNEL_NUMBER_MASK aligned on register LSB (bit 0) */ -#define ADC_CHANNEL_ID_NUMBER_MASK_POSBIT0 0x0000001FU /* Equivalent to shift: (ADC_CHANNEL_NUMBER_MASK >> POSITION_VAL(ADC_CHANNEL_NUMBER_MASK)) */ - -/* Channel differentiation between external and internal channels */ -#define ADC_CHANNEL_ID_INTERNAL_CH 0x80000000UL /* Marker of internal channel */ -#define ADC_CHANNEL_ID_INTERNAL_CH_2 0x40000000UL /* Marker of internal channel for other ADC instances, in case of different ADC internal channels mapped on same channel number on different ADC instances */ -#define ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT 0x10000000U /* Dummy bit for driver internal usage, not used in ADC channel setting registers CR1 or SQRx */ -#define ADC_CHANNEL_ID_INTERNAL_CH_MASK (ADC_CHANNEL_ID_INTERNAL_CH | ADC_CHANNEL_ID_INTERNAL_CH_2 | ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT) - -/* Internal register offset for ADC channel sampling time configuration */ -/* (offset placed into a spare area of literal definition) */ -#define ADC_SMPR1_REGOFFSET 0x00000000UL -#define ADC_SMPR2_REGOFFSET 0x02000000UL -#define ADC_CHANNEL_SMPRX_REGOFFSET_MASK (ADC_SMPR1_REGOFFSET | ADC_SMPR2_REGOFFSET) - -#define ADC_CHANNEL_SMPx_BITOFFSET_MASK 0x01F00000UL -#define ADC_CHANNEL_SMPx_BITOFFSET_POS (20UL) /* Value equivalent to POSITION_VAL(ADC_CHANNEL_SMPx_BITOFFSET_MASK) */ - -/* Definition of channels ID number information to be inserted into */ -/* channels literals definition. */ -#define ADC_CHANNEL_0_NUMBER 0x00000000UL -#define ADC_CHANNEL_1_NUMBER ( ADC_CR1_AWDCH_0) -#define ADC_CHANNEL_2_NUMBER ( ADC_CR1_AWDCH_1 ) -#define ADC_CHANNEL_3_NUMBER ( ADC_CR1_AWDCH_1 | ADC_CR1_AWDCH_0) -#define ADC_CHANNEL_4_NUMBER ( ADC_CR1_AWDCH_2 ) -#define ADC_CHANNEL_5_NUMBER ( ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_0) -#define ADC_CHANNEL_6_NUMBER ( ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_1 ) -#define ADC_CHANNEL_7_NUMBER ( ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_1 | ADC_CR1_AWDCH_0) -#define ADC_CHANNEL_8_NUMBER ( ADC_CR1_AWDCH_3 ) -#define ADC_CHANNEL_9_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_0) -#define ADC_CHANNEL_10_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_1 ) -#define ADC_CHANNEL_11_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_1 | ADC_CR1_AWDCH_0) -#define ADC_CHANNEL_12_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_2 ) -#define ADC_CHANNEL_13_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_0) -#define ADC_CHANNEL_14_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_1 ) -#define ADC_CHANNEL_15_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_1 | ADC_CR1_AWDCH_0) -#define ADC_CHANNEL_16_NUMBER (ADC_CR1_AWDCH_4 ) -#define ADC_CHANNEL_17_NUMBER (ADC_CR1_AWDCH_4 | ADC_CR1_AWDCH_0) -#define ADC_CHANNEL_18_NUMBER (ADC_CR1_AWDCH_4 | ADC_CR1_AWDCH_1 ) - -/* Definition of channels sampling time information to be inserted into */ -/* channels literals definition. */ -#define ADC_CHANNEL_0_SMP (ADC_SMPR2_REGOFFSET | (( 0UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP0) */ -#define ADC_CHANNEL_1_SMP (ADC_SMPR2_REGOFFSET | (( 3UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP1) */ -#define ADC_CHANNEL_2_SMP (ADC_SMPR2_REGOFFSET | (( 6UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP2) */ -#define ADC_CHANNEL_3_SMP (ADC_SMPR2_REGOFFSET | (( 9UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP3) */ -#define ADC_CHANNEL_4_SMP (ADC_SMPR2_REGOFFSET | ((12UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP4) */ -#define ADC_CHANNEL_5_SMP (ADC_SMPR2_REGOFFSET | ((15UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP5) */ -#define ADC_CHANNEL_6_SMP (ADC_SMPR2_REGOFFSET | ((18UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP6) */ -#define ADC_CHANNEL_7_SMP (ADC_SMPR2_REGOFFSET | ((21UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP7) */ -#define ADC_CHANNEL_8_SMP (ADC_SMPR2_REGOFFSET | ((24UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP8) */ -#define ADC_CHANNEL_9_SMP (ADC_SMPR2_REGOFFSET | ((27UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP9) */ -#define ADC_CHANNEL_10_SMP (ADC_SMPR1_REGOFFSET | (( 0UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP10) */ -#define ADC_CHANNEL_11_SMP (ADC_SMPR1_REGOFFSET | (( 3UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP11) */ -#define ADC_CHANNEL_12_SMP (ADC_SMPR1_REGOFFSET | (( 6UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP12) */ -#define ADC_CHANNEL_13_SMP (ADC_SMPR1_REGOFFSET | (( 9UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP13) */ -#define ADC_CHANNEL_14_SMP (ADC_SMPR1_REGOFFSET | ((12UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP14) */ -#define ADC_CHANNEL_15_SMP (ADC_SMPR1_REGOFFSET | ((15UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP15) */ -#define ADC_CHANNEL_16_SMP (ADC_SMPR1_REGOFFSET | ((18UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP16) */ -#define ADC_CHANNEL_17_SMP (ADC_SMPR1_REGOFFSET | ((21UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP17) */ -#define ADC_CHANNEL_18_SMP (ADC_SMPR1_REGOFFSET | ((24UL) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP18) */ - -/* Internal mask for ADC analog watchdog: */ -/* To select into literals LL_ADC_AWD_CHANNELx_xxx the relevant bits for: */ -/* (concatenation of multiple bits used in different analog watchdogs, */ -/* (feature of several watchdogs not available on all STM32 families)). */ -/* - analog watchdog 1: monitored channel defined by number, */ -/* selection of ADC group (ADC groups regular and-or injected). */ - -/* Internal register offset for ADC analog watchdog channel configuration */ -#define ADC_AWD_CR1_REGOFFSET 0x00000000UL - -#define ADC_AWD_CRX_REGOFFSET_MASK (ADC_AWD_CR1_REGOFFSET) - -#define ADC_AWD_CR1_CHANNEL_MASK (ADC_CR1_AWDCH | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) -#define ADC_AWD_CR_ALL_CHANNEL_MASK (ADC_AWD_CR1_CHANNEL_MASK) - -/* Internal register offset for ADC analog watchdog threshold configuration */ -#define ADC_AWD_TR1_HIGH_REGOFFSET 0x00000000UL -#define ADC_AWD_TR1_LOW_REGOFFSET 0x00000001UL -#define ADC_AWD_TRX_REGOFFSET_MASK (ADC_AWD_TR1_HIGH_REGOFFSET | ADC_AWD_TR1_LOW_REGOFFSET) - -/* ADC registers bits positions */ -#define ADC_CR1_RES_BITOFFSET_POS (24UL) /* Value equivalent to POSITION_VAL(ADC_CR1_RES) */ -#define ADC_TR_HT_BITOFFSET_POS (16UL) /* Value equivalent to POSITION_VAL(ADC_TR_HT) */ - -/* ADC internal channels related definitions */ -/* Internal voltage reference VrefInt */ -#define VREFINT_CAL_ADDR ((uint16_t*) (0x1FFF7A2AU)) /* Internal voltage reference, address of parameter VREFINT_CAL: VrefInt ADC raw data acquired at temperature 30 DegC (tolerance: +-5 DegC), Vref+ = 3.3 V (tolerance: +-10 mV). */ -#define VREFINT_CAL_VREF ( 3300UL) /* Analog voltage reference (Vref+) value with which temperature sensor has been calibrated in production (tolerance: +-10 mV) (unit: mV). */ -/* Temperature sensor */ -#define TEMPSENSOR_CAL1_ADDR ((uint16_t*) (0x1FFF7A2CU)) /* Internal temperature sensor, address of parameter TS_CAL1: On STM32F4, temperature sensor ADC raw data acquired at temperature 30 DegC (tolerance: +-5 DegC), Vref+ = 3.3 V (tolerance: +-10 mV). */ -#define TEMPSENSOR_CAL2_ADDR ((uint16_t*) (0x1FFF7A2EU)) /* Internal temperature sensor, address of parameter TS_CAL2: On STM32F4, temperature sensor ADC raw data acquired at temperature 110 DegC (tolerance: +-5 DegC), Vref+ = 3.3 V (tolerance: +-10 mV). */ -#define TEMPSENSOR_CAL1_TEMP (( int32_t) 30) /* Internal temperature sensor, temperature at which temperature sensor has been calibrated in production for data into TEMPSENSOR_CAL1_ADDR (tolerance: +-5 DegC) (unit: DegC). */ -#define TEMPSENSOR_CAL2_TEMP (( int32_t) 110) /* Internal temperature sensor, temperature at which temperature sensor has been calibrated in production for data into TEMPSENSOR_CAL2_ADDR (tolerance: +-5 DegC) (unit: DegC). */ -#define TEMPSENSOR_CAL_VREFANALOG ( 3300UL) /* Analog voltage reference (Vref+) voltage with which temperature sensor has been calibrated in production (+-10 mV) (unit: mV). */ - -/** - * @} - */ - - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup ADC_LL_Private_Macros ADC Private Macros - * @{ - */ - -/** - * @brief Driver macro reserved for internal use: isolate bits with the - * selected mask and shift them to the register LSB - * (shift mask on register position bit 0). - * @param __BITS__ Bits in register 32 bits - * @param __MASK__ Mask in register 32 bits - * @retval Bits in register 32 bits - */ -#define __ADC_MASK_SHIFT(__BITS__, __MASK__) \ - (((__BITS__) & (__MASK__)) >> POSITION_VAL((__MASK__))) - -/** - * @brief Driver macro reserved for internal use: set a pointer to - * a register from a register basis from which an offset - * is applied. - * @param __REG__ Register basis from which the offset is applied. - * @param __REG_OFFFSET__ Offset to be applied (unit number of registers). - * @retval Pointer to register address - */ -#define __ADC_PTR_REG_OFFSET(__REG__, __REG_OFFFSET__) \ - ((__IO uint32_t *)((uint32_t) ((uint32_t)(&(__REG__)) + ((__REG_OFFFSET__) << 2UL)))) - -/** - * @} - */ - - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup ADC_LL_ES_INIT ADC Exported Init structure - * @{ - */ - -/** - * @brief Structure definition of some features of ADC common parameters - * and multimode - * (all ADC instances belonging to the same ADC common instance). - * @note The setting of these parameters by function @ref LL_ADC_CommonInit() - * is conditioned to ADC instances state (all ADC instances - * sharing the same ADC common instance): - * All ADC instances sharing the same ADC common instance must be - * disabled. - */ -typedef struct -{ - uint32_t CommonClock; /*!< Set parameter common to several ADC: Clock source and prescaler. - This parameter can be a value of @ref ADC_LL_EC_COMMON_CLOCK_SOURCE - - This feature can be modified afterwards using unitary function @ref LL_ADC_SetCommonClock(). */ - -#if defined(ADC_MULTIMODE_SUPPORT) - uint32_t Multimode; /*!< Set ADC multimode configuration to operate in independent mode or multimode (for devices with several ADC instances). - This parameter can be a value of @ref ADC_LL_EC_MULTI_MODE - - This feature can be modified afterwards using unitary function @ref LL_ADC_SetMultimode(). */ - - uint32_t MultiDMATransfer; /*!< Set ADC multimode conversion data transfer: no transfer or transfer by DMA. - This parameter can be a value of @ref ADC_LL_EC_MULTI_DMA_TRANSFER - - This feature can be modified afterwards using unitary function @ref LL_ADC_SetMultiDMATransfer(). */ - - uint32_t MultiTwoSamplingDelay; /*!< Set ADC multimode delay between 2 sampling phases. - This parameter can be a value of @ref ADC_LL_EC_MULTI_TWOSMP_DELAY - - This feature can be modified afterwards using unitary function @ref LL_ADC_SetMultiTwoSamplingDelay(). */ -#endif /* ADC_MULTIMODE_SUPPORT */ - -} LL_ADC_CommonInitTypeDef; - -/** - * @brief Structure definition of some features of ADC instance. - * @note These parameters have an impact on ADC scope: ADC instance. - * Affects both group regular and group injected (availability - * of ADC group injected depends on STM32 families). - * Refer to corresponding unitary functions into - * @ref ADC_LL_EF_Configuration_ADC_Instance . - * @note The setting of these parameters by function @ref LL_ADC_Init() - * is conditioned to ADC state: - * ADC instance must be disabled. - * This condition is applied to all ADC features, for efficiency - * and compatibility over all STM32 families. However, the different - * features can be set under different ADC state conditions - * (setting possible with ADC enabled without conversion on going, - * ADC enabled with conversion on going, ...) - * Each feature can be updated afterwards with a unitary function - * and potentially with ADC in a different state than disabled, - * refer to description of each function for setting - * conditioned to ADC state. - */ -typedef struct -{ - uint32_t Resolution; /*!< Set ADC resolution. - This parameter can be a value of @ref ADC_LL_EC_RESOLUTION - - This feature can be modified afterwards using unitary function @ref LL_ADC_SetResolution(). */ - - uint32_t DataAlignment; /*!< Set ADC conversion data alignment. - This parameter can be a value of @ref ADC_LL_EC_DATA_ALIGN - - This feature can be modified afterwards using unitary function @ref LL_ADC_SetDataAlignment(). */ - - uint32_t SequencersScanMode; /*!< Set ADC scan selection. - This parameter can be a value of @ref ADC_LL_EC_SCAN_SELECTION - - This feature can be modified afterwards using unitary function @ref LL_ADC_SetSequencersScanMode(). */ - -} LL_ADC_InitTypeDef; - -/** - * @brief Structure definition of some features of ADC group regular. - * @note These parameters have an impact on ADC scope: ADC group regular. - * Refer to corresponding unitary functions into - * @ref ADC_LL_EF_Configuration_ADC_Group_Regular - * (functions with prefix "REG"). - * @note The setting of these parameters by function @ref LL_ADC_REG_Init() - * is conditioned to ADC state: - * ADC instance must be disabled. - * This condition is applied to all ADC features, for efficiency - * and compatibility over all STM32 families. However, the different - * features can be set under different ADC state conditions - * (setting possible with ADC enabled without conversion on going, - * ADC enabled with conversion on going, ...) - * Each feature can be updated afterwards with a unitary function - * and potentially with ADC in a different state than disabled, - * refer to description of each function for setting - * conditioned to ADC state. - */ -typedef struct -{ - uint32_t TriggerSource; /*!< Set ADC group regular conversion trigger source: internal (SW start) or from external IP (timer event, external interrupt line). - This parameter can be a value of @ref ADC_LL_EC_REG_TRIGGER_SOURCE - @note On this STM32 series, setting of external trigger edge is performed - using function @ref LL_ADC_REG_StartConversionExtTrig(). - - This feature can be modified afterwards using unitary function @ref LL_ADC_REG_SetTriggerSource(). */ - - uint32_t SequencerLength; /*!< Set ADC group regular sequencer length. - This parameter can be a value of @ref ADC_LL_EC_REG_SEQ_SCAN_LENGTH - @note This parameter is discarded if scan mode is disabled (refer to parameter 'ADC_SequencersScanMode'). - - This feature can be modified afterwards using unitary function @ref LL_ADC_REG_SetSequencerLength(). */ - - uint32_t SequencerDiscont; /*!< Set ADC group regular sequencer discontinuous mode: sequence subdivided and scan conversions interrupted every selected number of ranks. - This parameter can be a value of @ref ADC_LL_EC_REG_SEQ_DISCONT_MODE - @note This parameter has an effect only if group regular sequencer is enabled - (scan length of 2 ranks or more). - - This feature can be modified afterwards using unitary function @ref LL_ADC_REG_SetSequencerDiscont(). */ - - uint32_t ContinuousMode; /*!< Set ADC continuous conversion mode on ADC group regular, whether ADC conversions are performed in single mode (one conversion per trigger) or in continuous mode (after the first trigger, following conversions launched successively automatically). - This parameter can be a value of @ref ADC_LL_EC_REG_CONTINUOUS_MODE - Note: It is not possible to enable both ADC group regular continuous mode and discontinuous mode. - - This feature can be modified afterwards using unitary function @ref LL_ADC_REG_SetContinuousMode(). */ - - uint32_t DMATransfer; /*!< Set ADC group regular conversion data transfer: no transfer or transfer by DMA, and DMA requests mode. - This parameter can be a value of @ref ADC_LL_EC_REG_DMA_TRANSFER - - This feature can be modified afterwards using unitary function @ref LL_ADC_REG_SetDMATransfer(). */ - -} LL_ADC_REG_InitTypeDef; - -/** - * @brief Structure definition of some features of ADC group injected. - * @note These parameters have an impact on ADC scope: ADC group injected. - * Refer to corresponding unitary functions into - * @ref ADC_LL_EF_Configuration_ADC_Group_Regular - * (functions with prefix "INJ"). - * @note The setting of these parameters by function @ref LL_ADC_INJ_Init() - * is conditioned to ADC state: - * ADC instance must be disabled. - * This condition is applied to all ADC features, for efficiency - * and compatibility over all STM32 families. However, the different - * features can be set under different ADC state conditions - * (setting possible with ADC enabled without conversion on going, - * ADC enabled with conversion on going, ...) - * Each feature can be updated afterwards with a unitary function - * and potentially with ADC in a different state than disabled, - * refer to description of each function for setting - * conditioned to ADC state. - */ -typedef struct -{ - uint32_t TriggerSource; /*!< Set ADC group injected conversion trigger source: internal (SW start) or from external IP (timer event, external interrupt line). - This parameter can be a value of @ref ADC_LL_EC_INJ_TRIGGER_SOURCE - @note On this STM32 series, setting of external trigger edge is performed - using function @ref LL_ADC_INJ_StartConversionExtTrig(). - - This feature can be modified afterwards using unitary function @ref LL_ADC_INJ_SetTriggerSource(). */ - - uint32_t SequencerLength; /*!< Set ADC group injected sequencer length. - This parameter can be a value of @ref ADC_LL_EC_INJ_SEQ_SCAN_LENGTH - @note This parameter is discarded if scan mode is disabled (refer to parameter 'ADC_SequencersScanMode'). - - This feature can be modified afterwards using unitary function @ref LL_ADC_INJ_SetSequencerLength(). */ - - uint32_t SequencerDiscont; /*!< Set ADC group injected sequencer discontinuous mode: sequence subdivided and scan conversions interrupted every selected number of ranks. - This parameter can be a value of @ref ADC_LL_EC_INJ_SEQ_DISCONT_MODE - @note This parameter has an effect only if group injected sequencer is enabled - (scan length of 2 ranks or more). - - This feature can be modified afterwards using unitary function @ref LL_ADC_INJ_SetSequencerDiscont(). */ - - uint32_t TrigAuto; /*!< Set ADC group injected conversion trigger: independent or from ADC group regular. - This parameter can be a value of @ref ADC_LL_EC_INJ_TRIG_AUTO - Note: This parameter must be set to set to independent trigger if injected trigger source is set to an external trigger. - - This feature can be modified afterwards using unitary function @ref LL_ADC_INJ_SetTrigAuto(). */ - -} LL_ADC_INJ_InitTypeDef; - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup ADC_LL_Exported_Constants ADC Exported Constants - * @{ - */ - -/** @defgroup ADC_LL_EC_FLAG ADC flags - * @brief Flags defines which can be used with LL_ADC_ReadReg function - * @{ - */ -#define LL_ADC_FLAG_STRT ADC_SR_STRT /*!< ADC flag ADC group regular conversion start */ -#define LL_ADC_FLAG_EOCS ADC_SR_EOC /*!< ADC flag ADC group regular end of unitary conversion or sequence conversions (to configure flag of end of conversion, use function @ref LL_ADC_REG_SetFlagEndOfConversion() ) */ -#define LL_ADC_FLAG_OVR ADC_SR_OVR /*!< ADC flag ADC group regular overrun */ -#define LL_ADC_FLAG_JSTRT ADC_SR_JSTRT /*!< ADC flag ADC group injected conversion start */ -#define LL_ADC_FLAG_JEOS ADC_SR_JEOC /*!< ADC flag ADC group injected end of sequence conversions (Note: on this STM32 series, there is no flag ADC group injected end of unitary conversion. Flag noted as "JEOC" is corresponding to flag "JEOS" in other STM32 families) */ -#define LL_ADC_FLAG_AWD1 ADC_SR_AWD /*!< ADC flag ADC analog watchdog 1 */ -#if defined(ADC_MULTIMODE_SUPPORT) -#define LL_ADC_FLAG_EOCS_MST ADC_CSR_EOC1 /*!< ADC flag ADC multimode master group regular end of unitary conversion or sequence conversions (to configure flag of end of conversion, use function @ref LL_ADC_REG_SetFlagEndOfConversion() ) */ -#define LL_ADC_FLAG_EOCS_SLV1 ADC_CSR_EOC2 /*!< ADC flag ADC multimode slave 1 group regular end of unitary conversion or sequence conversions (to configure flag of end of conversion, use function @ref LL_ADC_REG_SetFlagEndOfConversion() ) */ -#define LL_ADC_FLAG_EOCS_SLV2 ADC_CSR_EOC3 /*!< ADC flag ADC multimode slave 2 group regular end of unitary conversion or sequence conversions (to configure flag of end of conversion, use function @ref LL_ADC_REG_SetFlagEndOfConversion() ) */ -#define LL_ADC_FLAG_OVR_MST ADC_CSR_OVR1 /*!< ADC flag ADC multimode master group regular overrun */ -#define LL_ADC_FLAG_OVR_SLV1 ADC_CSR_OVR2 /*!< ADC flag ADC multimode slave 1 group regular overrun */ -#define LL_ADC_FLAG_OVR_SLV2 ADC_CSR_OVR3 /*!< ADC flag ADC multimode slave 2 group regular overrun */ -#define LL_ADC_FLAG_JEOS_MST ADC_CSR_JEOC1 /*!< ADC flag ADC multimode master group injected end of sequence conversions (Note: on this STM32 series, there is no flag ADC group injected end of unitary conversion. Flag noted as "JEOC" is corresponding to flag "JEOS" in other STM32 families) */ -#define LL_ADC_FLAG_JEOS_SLV1 ADC_CSR_JEOC2 /*!< ADC flag ADC multimode slave 1 group injected end of sequence conversions (Note: on this STM32 series, there is no flag ADC group injected end of unitary conversion. Flag noted as "JEOC" is corresponding to flag "JEOS" in other STM32 families) */ -#define LL_ADC_FLAG_JEOS_SLV2 ADC_CSR_JEOC3 /*!< ADC flag ADC multimode slave 2 group injected end of sequence conversions (Note: on this STM32 series, there is no flag ADC group injected end of unitary conversion. Flag noted as "JEOC" is corresponding to flag "JEOS" in other STM32 families) */ -#define LL_ADC_FLAG_AWD1_MST ADC_CSR_AWD1 /*!< ADC flag ADC multimode master analog watchdog 1 of the ADC master */ -#define LL_ADC_FLAG_AWD1_SLV1 ADC_CSR_AWD2 /*!< ADC flag ADC multimode slave 1 analog watchdog 1 */ -#define LL_ADC_FLAG_AWD1_SLV2 ADC_CSR_AWD3 /*!< ADC flag ADC multimode slave 2 analog watchdog 1 */ -#endif -/** - * @} - */ - -/** @defgroup ADC_LL_EC_IT ADC interruptions for configuration (interruption enable or disable) - * @brief IT defines which can be used with LL_ADC_ReadReg and LL_ADC_WriteReg functions - * @{ - */ -#define LL_ADC_IT_EOCS ADC_CR1_EOCIE /*!< ADC interruption ADC group regular end of unitary conversion or sequence conversions (to configure flag of end of conversion, use function @ref LL_ADC_REG_SetFlagEndOfConversion() ) */ -#define LL_ADC_IT_OVR ADC_CR1_OVRIE /*!< ADC interruption ADC group regular overrun */ -#define LL_ADC_IT_JEOS ADC_CR1_JEOCIE /*!< ADC interruption ADC group injected end of sequence conversions (Note: on this STM32 series, there is no flag ADC group injected end of unitary conversion. Flag noted as "JEOC" is corresponding to flag "JEOS" in other STM32 families) */ -#define LL_ADC_IT_AWD1 ADC_CR1_AWDIE /*!< ADC interruption ADC analog watchdog 1 */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_REGISTERS ADC registers compliant with specific purpose - * @{ - */ -/* List of ADC registers intended to be used (most commonly) with */ -/* DMA transfer. */ -/* Refer to function @ref LL_ADC_DMA_GetRegAddr(). */ -#define LL_ADC_DMA_REG_REGULAR_DATA 0x00000000UL /* ADC group regular conversion data register (corresponding to register DR) to be used with ADC configured in independent mode. Without DMA transfer, register accessed by LL function @ref LL_ADC_REG_ReadConversionData32() and other functions @ref LL_ADC_REG_ReadConversionDatax() */ -#if defined(ADC_MULTIMODE_SUPPORT) -#define LL_ADC_DMA_REG_REGULAR_DATA_MULTI 0x00000001UL /* ADC group regular conversion data register (corresponding to register CDR) to be used with ADC configured in multimode (available on STM32 devices with several ADC instances). Without DMA transfer, register accessed by LL function @ref LL_ADC_REG_ReadMultiConversionData32() */ -#endif -/** - * @} - */ - -/** @defgroup ADC_LL_EC_COMMON_CLOCK_SOURCE ADC common - Clock source - * @{ - */ -#define LL_ADC_CLOCK_SYNC_PCLK_DIV2 0x00000000UL /*!< ADC synchronous clock derived from AHB clock with prescaler division by 2 */ -#define LL_ADC_CLOCK_SYNC_PCLK_DIV4 ( ADC_CCR_ADCPRE_0) /*!< ADC synchronous clock derived from AHB clock with prescaler division by 4 */ -#define LL_ADC_CLOCK_SYNC_PCLK_DIV6 (ADC_CCR_ADCPRE_1 ) /*!< ADC synchronous clock derived from AHB clock with prescaler division by 6 */ -#define LL_ADC_CLOCK_SYNC_PCLK_DIV8 (ADC_CCR_ADCPRE_1 | ADC_CCR_ADCPRE_0) /*!< ADC synchronous clock derived from AHB clock with prescaler division by 8 */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_COMMON_PATH_INTERNAL ADC common - Measurement path to internal channels - * @{ - */ -/* Note: Other measurement paths to internal channels may be available */ -/* (connections to other peripherals). */ -/* If they are not listed below, they do not require any specific */ -/* path enable. In this case, Access to measurement path is done */ -/* only by selecting the corresponding ADC internal channel. */ -#define LL_ADC_PATH_INTERNAL_NONE 0x00000000UL /*!< ADC measurement paths all disabled */ -#define LL_ADC_PATH_INTERNAL_VREFINT (ADC_CCR_TSVREFE) /*!< ADC measurement path to internal channel VrefInt */ -#define LL_ADC_PATH_INTERNAL_TEMPSENSOR (ADC_CCR_TSVREFE) /*!< ADC measurement path to internal channel temperature sensor */ -#define LL_ADC_PATH_INTERNAL_VBAT (ADC_CCR_VBATE) /*!< ADC measurement path to internal channel Vbat */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_RESOLUTION ADC instance - Resolution - * @{ - */ -#define LL_ADC_RESOLUTION_12B 0x00000000UL /*!< ADC resolution 12 bits */ -#define LL_ADC_RESOLUTION_10B ( ADC_CR1_RES_0) /*!< ADC resolution 10 bits */ -#define LL_ADC_RESOLUTION_8B (ADC_CR1_RES_1 ) /*!< ADC resolution 8 bits */ -#define LL_ADC_RESOLUTION_6B (ADC_CR1_RES_1 | ADC_CR1_RES_0) /*!< ADC resolution 6 bits */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_DATA_ALIGN ADC instance - Data alignment - * @{ - */ -#define LL_ADC_DATA_ALIGN_RIGHT 0x00000000UL /*!< ADC conversion data alignment: right aligned (alignment on data register LSB bit 0)*/ -#define LL_ADC_DATA_ALIGN_LEFT (ADC_CR2_ALIGN) /*!< ADC conversion data alignment: left aligned (alignment on data register MSB bit 15)*/ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_SCAN_SELECTION ADC instance - Scan selection - * @{ - */ -#define LL_ADC_SEQ_SCAN_DISABLE 0x00000000UL /*!< ADC conversion is performed in unitary conversion mode (one channel converted, that defined in rank 1). Configuration of both groups regular and injected sequencers (sequence length, ...) is discarded: equivalent to length of 1 rank.*/ -#define LL_ADC_SEQ_SCAN_ENABLE (ADC_CR1_SCAN) /*!< ADC conversions are performed in sequence conversions mode, according to configuration of both groups regular and injected sequencers (sequence length, ...). */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_GROUPS ADC instance - Groups - * @{ - */ -#define LL_ADC_GROUP_REGULAR 0x00000001UL /*!< ADC group regular (available on all STM32 devices) */ -#define LL_ADC_GROUP_INJECTED 0x00000002UL /*!< ADC group injected (not available on all STM32 devices)*/ -#define LL_ADC_GROUP_REGULAR_INJECTED 0x00000003UL /*!< ADC both groups regular and injected */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_CHANNEL ADC instance - Channel number - * @{ - */ -#define LL_ADC_CHANNEL_0 (ADC_CHANNEL_0_NUMBER | ADC_CHANNEL_0_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN0 */ -#define LL_ADC_CHANNEL_1 (ADC_CHANNEL_1_NUMBER | ADC_CHANNEL_1_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN1 */ -#define LL_ADC_CHANNEL_2 (ADC_CHANNEL_2_NUMBER | ADC_CHANNEL_2_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN2 */ -#define LL_ADC_CHANNEL_3 (ADC_CHANNEL_3_NUMBER | ADC_CHANNEL_3_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN3 */ -#define LL_ADC_CHANNEL_4 (ADC_CHANNEL_4_NUMBER | ADC_CHANNEL_4_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN4 */ -#define LL_ADC_CHANNEL_5 (ADC_CHANNEL_5_NUMBER | ADC_CHANNEL_5_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN5 */ -#define LL_ADC_CHANNEL_6 (ADC_CHANNEL_6_NUMBER | ADC_CHANNEL_6_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN6 */ -#define LL_ADC_CHANNEL_7 (ADC_CHANNEL_7_NUMBER | ADC_CHANNEL_7_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN7 */ -#define LL_ADC_CHANNEL_8 (ADC_CHANNEL_8_NUMBER | ADC_CHANNEL_8_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN8 */ -#define LL_ADC_CHANNEL_9 (ADC_CHANNEL_9_NUMBER | ADC_CHANNEL_9_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN9 */ -#define LL_ADC_CHANNEL_10 (ADC_CHANNEL_10_NUMBER | ADC_CHANNEL_10_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN10 */ -#define LL_ADC_CHANNEL_11 (ADC_CHANNEL_11_NUMBER | ADC_CHANNEL_11_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN11 */ -#define LL_ADC_CHANNEL_12 (ADC_CHANNEL_12_NUMBER | ADC_CHANNEL_12_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN12 */ -#define LL_ADC_CHANNEL_13 (ADC_CHANNEL_13_NUMBER | ADC_CHANNEL_13_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN13 */ -#define LL_ADC_CHANNEL_14 (ADC_CHANNEL_14_NUMBER | ADC_CHANNEL_14_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN14 */ -#define LL_ADC_CHANNEL_15 (ADC_CHANNEL_15_NUMBER | ADC_CHANNEL_15_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN15 */ -#define LL_ADC_CHANNEL_16 (ADC_CHANNEL_16_NUMBER | ADC_CHANNEL_16_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN16 */ -#define LL_ADC_CHANNEL_17 (ADC_CHANNEL_17_NUMBER | ADC_CHANNEL_17_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN17 */ -#define LL_ADC_CHANNEL_18 (ADC_CHANNEL_18_NUMBER | ADC_CHANNEL_18_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN18 */ -#define LL_ADC_CHANNEL_VREFINT (LL_ADC_CHANNEL_17 | ADC_CHANNEL_ID_INTERNAL_CH) /*!< ADC internal channel connected to VrefInt: Internal voltage reference. On STM32F4, ADC channel available only on ADC instance: ADC1. */ -#define LL_ADC_CHANNEL_VBAT (LL_ADC_CHANNEL_18 | ADC_CHANNEL_ID_INTERNAL_CH) /*!< ADC internal channel connected to Vbat/3: Vbat voltage through a divider ladder of factor 1/3 to have Vbat always below Vdda. On STM32F4, ADC channel available only on ADC instance: ADC1. */ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F415xx) || defined(STM32F417xx) -#define LL_ADC_CHANNEL_TEMPSENSOR (LL_ADC_CHANNEL_16 | ADC_CHANNEL_ID_INTERNAL_CH) /*!< ADC internal channel connected to Temperature sensor. On STM32F4, ADC channel available only on ADC instance: ADC1. */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F410xx */ -#if defined(STM32F411xE) || defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define LL_ADC_CHANNEL_TEMPSENSOR (LL_ADC_CHANNEL_18 | ADC_CHANNEL_ID_INTERNAL_CH | ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT) /*!< ADC internal channel connected to Temperature sensor. On STM32F4, ADC channel available only on ADC instance: ADC1. This internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. */ -#endif /* STM32F411xE || STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_REG_TRIGGER_SOURCE ADC group regular - Trigger source - * @{ - */ -#define LL_ADC_REG_TRIG_SOFTWARE 0x00000000UL /*!< ADC group regular conversion trigger internal: SW start. */ -#define LL_ADC_REG_TRIG_EXT_TIM1_CH1 (ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM1 channel 1 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM1_CH2 (ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM1 channel 2 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM1_CH3 (ADC_CR2_EXTSEL_1 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM1 channel 3 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM2_CH2 (ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM2 channel 2 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM2_CH3 (ADC_CR2_EXTSEL_2 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM2 channel 3 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM2_CH4 (ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM2 channel 4 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM2_TRGO (ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM2 TRGO. Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM3_CH1 (ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM3 channel 1 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM3_TRGO (ADC_CR2_EXTSEL_3 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM3 TRGO. Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM4_CH4 (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM4 channel 4 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM5_CH1 (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_1 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM5 channel 1 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM5_CH2 (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM5 channel 2 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM5_CH3 (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM5 channel 3 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM8_CH1 (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM8 channel 1 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_TIM8_TRGO (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM8 TRGO. Trigger edge set to rising edge (default setting). */ -#define LL_ADC_REG_TRIG_EXT_EXTI_LINE11 (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: external interrupt line 11. Trigger edge set to rising edge (default setting). */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_REG_TRIGGER_EDGE ADC group regular - Trigger edge - * @{ - */ -#define LL_ADC_REG_TRIG_EXT_RISING ( ADC_CR2_EXTEN_0) /*!< ADC group regular conversion trigger polarity set to rising edge */ -#define LL_ADC_REG_TRIG_EXT_FALLING (ADC_CR2_EXTEN_1 ) /*!< ADC group regular conversion trigger polarity set to falling edge */ -#define LL_ADC_REG_TRIG_EXT_RISINGFALLING (ADC_CR2_EXTEN_1 | ADC_CR2_EXTEN_0) /*!< ADC group regular conversion trigger polarity set to both rising and falling edges */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_REG_CONTINUOUS_MODE ADC group regular - Continuous mode - * @{ - */ -#define LL_ADC_REG_CONV_SINGLE 0x00000000UL /*!< ADC conversions are performed in single mode: one conversion per trigger */ -#define LL_ADC_REG_CONV_CONTINUOUS (ADC_CR2_CONT) /*!< ADC conversions are performed in continuous mode: after the first trigger, following conversions launched successively automatically */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_REG_DMA_TRANSFER ADC group regular - DMA transfer of ADC conversion data - * @{ - */ -#define LL_ADC_REG_DMA_TRANSFER_NONE 0x00000000UL /*!< ADC conversions are not transferred by DMA */ -#define LL_ADC_REG_DMA_TRANSFER_LIMITED ( ADC_CR2_DMA) /*!< ADC conversion data are transferred by DMA, in limited mode (one shot mode): DMA transfer requests are stopped when number of DMA data transfers (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. */ -#define LL_ADC_REG_DMA_TRANSFER_UNLIMITED (ADC_CR2_DDS | ADC_CR2_DMA) /*!< ADC conversion data are transferred by DMA, in unlimited mode: DMA transfer requests are unlimited, whatever number of DMA data transferred (number of ADC conversions). This ADC mode is intended to be used with DMA mode circular. */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_REG_FLAG_EOC_SELECTION ADC group regular - Flag EOC selection (unitary or sequence conversions) - * @{ - */ -#define LL_ADC_REG_FLAG_EOC_SEQUENCE_CONV 0x00000000UL /*!< ADC flag EOC (end of unitary conversion) selected */ -#define LL_ADC_REG_FLAG_EOC_UNITARY_CONV (ADC_CR2_EOCS) /*!< ADC flag EOS (end of sequence conversions) selected */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_REG_SEQ_SCAN_LENGTH ADC group regular - Sequencer scan length - * @{ - */ -#define LL_ADC_REG_SEQ_SCAN_DISABLE 0x00000000UL /*!< ADC group regular sequencer disable (equivalent to sequencer of 1 rank: ADC conversion on only 1 channel) */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS ( ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 2 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS ( ADC_SQR1_L_1 ) /*!< ADC group regular sequencer enable with 3 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS ( ADC_SQR1_L_1 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 4 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS ( ADC_SQR1_L_2 ) /*!< ADC group regular sequencer enable with 5 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS ( ADC_SQR1_L_2 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 6 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS ( ADC_SQR1_L_2 | ADC_SQR1_L_1 ) /*!< ADC group regular sequencer enable with 7 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS ( ADC_SQR1_L_2 | ADC_SQR1_L_1 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 8 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS (ADC_SQR1_L_3 ) /*!< ADC group regular sequencer enable with 9 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 10 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_1 ) /*!< ADC group regular sequencer enable with 11 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_1 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 12 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_2 ) /*!< ADC group regular sequencer enable with 13 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_2 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 14 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_2 | ADC_SQR1_L_1 ) /*!< ADC group regular sequencer enable with 15 ranks in the sequence */ -#define LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_2 | ADC_SQR1_L_1 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 16 ranks in the sequence */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_REG_SEQ_DISCONT_MODE ADC group regular - Sequencer discontinuous mode - * @{ - */ -#define LL_ADC_REG_SEQ_DISCONT_DISABLE 0x00000000UL /*!< ADC group regular sequencer discontinuous mode disable */ -#define LL_ADC_REG_SEQ_DISCONT_1RANK ( ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every rank */ -#define LL_ADC_REG_SEQ_DISCONT_2RANKS ( ADC_CR1_DISCNUM_0 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enabled with sequence interruption every 2 ranks */ -#define LL_ADC_REG_SEQ_DISCONT_3RANKS ( ADC_CR1_DISCNUM_1 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every 3 ranks */ -#define LL_ADC_REG_SEQ_DISCONT_4RANKS ( ADC_CR1_DISCNUM_1 | ADC_CR1_DISCNUM_0 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every 4 ranks */ -#define LL_ADC_REG_SEQ_DISCONT_5RANKS (ADC_CR1_DISCNUM_2 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every 5 ranks */ -#define LL_ADC_REG_SEQ_DISCONT_6RANKS (ADC_CR1_DISCNUM_2 | ADC_CR1_DISCNUM_0 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every 6 ranks */ -#define LL_ADC_REG_SEQ_DISCONT_7RANKS (ADC_CR1_DISCNUM_2 | ADC_CR1_DISCNUM_1 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every 7 ranks */ -#define LL_ADC_REG_SEQ_DISCONT_8RANKS (ADC_CR1_DISCNUM_2 | ADC_CR1_DISCNUM_1 | ADC_CR1_DISCNUM_0 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every 8 ranks */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_REG_SEQ_RANKS ADC group regular - Sequencer ranks - * @{ - */ -#define LL_ADC_REG_RANK_1 (ADC_SQR3_REGOFFSET | ADC_REG_RANK_1_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 1 */ -#define LL_ADC_REG_RANK_2 (ADC_SQR3_REGOFFSET | ADC_REG_RANK_2_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 2 */ -#define LL_ADC_REG_RANK_3 (ADC_SQR3_REGOFFSET | ADC_REG_RANK_3_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 3 */ -#define LL_ADC_REG_RANK_4 (ADC_SQR3_REGOFFSET | ADC_REG_RANK_4_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 4 */ -#define LL_ADC_REG_RANK_5 (ADC_SQR3_REGOFFSET | ADC_REG_RANK_5_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 5 */ -#define LL_ADC_REG_RANK_6 (ADC_SQR3_REGOFFSET | ADC_REG_RANK_6_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 6 */ -#define LL_ADC_REG_RANK_7 (ADC_SQR2_REGOFFSET | ADC_REG_RANK_7_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 7 */ -#define LL_ADC_REG_RANK_8 (ADC_SQR2_REGOFFSET | ADC_REG_RANK_8_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 8 */ -#define LL_ADC_REG_RANK_9 (ADC_SQR2_REGOFFSET | ADC_REG_RANK_9_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 9 */ -#define LL_ADC_REG_RANK_10 (ADC_SQR2_REGOFFSET | ADC_REG_RANK_10_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 10 */ -#define LL_ADC_REG_RANK_11 (ADC_SQR2_REGOFFSET | ADC_REG_RANK_11_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 11 */ -#define LL_ADC_REG_RANK_12 (ADC_SQR2_REGOFFSET | ADC_REG_RANK_12_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 12 */ -#define LL_ADC_REG_RANK_13 (ADC_SQR1_REGOFFSET | ADC_REG_RANK_13_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 13 */ -#define LL_ADC_REG_RANK_14 (ADC_SQR1_REGOFFSET | ADC_REG_RANK_14_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 14 */ -#define LL_ADC_REG_RANK_15 (ADC_SQR1_REGOFFSET | ADC_REG_RANK_15_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 15 */ -#define LL_ADC_REG_RANK_16 (ADC_SQR1_REGOFFSET | ADC_REG_RANK_16_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 16 */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_INJ_TRIGGER_SOURCE ADC group injected - Trigger source - * @{ - */ -#define LL_ADC_INJ_TRIG_SOFTWARE 0x00000000UL /*!< ADC group injected conversion trigger internal: SW start. */ -#define LL_ADC_INJ_TRIG_EXT_TIM1_CH4 (ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM1 channel 4 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM1_TRGO (ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM1 TRGO. Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM2_CH1 (ADC_CR2_JEXTSEL_1 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM2 channel 1 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM2_TRGO (ADC_CR2_JEXTSEL_1 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM2 TRGO. Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM3_CH2 (ADC_CR2_JEXTSEL_2 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM3 channel 2 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM3_CH4 (ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM3 channel 4 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM4_CH1 (ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_1 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM4 channel 1 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM4_CH2 (ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_1 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM4 channel 2 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM4_CH3 (ADC_CR2_JEXTSEL_3 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM4 channel 3 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM4_TRGO (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM4 TRGO. Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM5_CH4 (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_1 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM5 channel 4 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM5_TRGO (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_1 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM5 TRGO. Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM8_CH2 (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_2 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM8 channel 2 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM8_CH3 (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM8 channel 3 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_TIM8_CH4 (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_1 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM8 channel 4 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ -#define LL_ADC_INJ_TRIG_EXT_EXTI_LINE15 (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_1 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: external interrupt line 15. Trigger edge set to rising edge (default setting). */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_INJ_TRIGGER_EDGE ADC group injected - Trigger edge - * @{ - */ -#define LL_ADC_INJ_TRIG_EXT_RISING ( ADC_CR2_JEXTEN_0) /*!< ADC group injected conversion trigger polarity set to rising edge */ -#define LL_ADC_INJ_TRIG_EXT_FALLING (ADC_CR2_JEXTEN_1 ) /*!< ADC group injected conversion trigger polarity set to falling edge */ -#define LL_ADC_INJ_TRIG_EXT_RISINGFALLING (ADC_CR2_JEXTEN_1 | ADC_CR2_JEXTEN_0) /*!< ADC group injected conversion trigger polarity set to both rising and falling edges */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_INJ_TRIG_AUTO ADC group injected - Automatic trigger mode - * @{ - */ -#define LL_ADC_INJ_TRIG_INDEPENDENT 0x00000000UL /*!< ADC group injected conversion trigger independent. Setting mandatory if ADC group injected injected trigger source is set to an external trigger. */ -#define LL_ADC_INJ_TRIG_FROM_GRP_REGULAR (ADC_CR1_JAUTO) /*!< ADC group injected conversion trigger from ADC group regular. Setting compliant only with group injected trigger source set to SW start, without any further action on ADC group injected conversion start or stop: in this case, ADC group injected is controlled only from ADC group regular. */ -/** - * @} - */ - - -/** @defgroup ADC_LL_EC_INJ_SEQ_SCAN_LENGTH ADC group injected - Sequencer scan length - * @{ - */ -#define LL_ADC_INJ_SEQ_SCAN_DISABLE 0x00000000UL /*!< ADC group injected sequencer disable (equivalent to sequencer of 1 rank: ADC conversion on only 1 channel) */ -#define LL_ADC_INJ_SEQ_SCAN_ENABLE_2RANKS ( ADC_JSQR_JL_0) /*!< ADC group injected sequencer enable with 2 ranks in the sequence */ -#define LL_ADC_INJ_SEQ_SCAN_ENABLE_3RANKS (ADC_JSQR_JL_1 ) /*!< ADC group injected sequencer enable with 3 ranks in the sequence */ -#define LL_ADC_INJ_SEQ_SCAN_ENABLE_4RANKS (ADC_JSQR_JL_1 | ADC_JSQR_JL_0) /*!< ADC group injected sequencer enable with 4 ranks in the sequence */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_INJ_SEQ_DISCONT_MODE ADC group injected - Sequencer discontinuous mode - * @{ - */ -#define LL_ADC_INJ_SEQ_DISCONT_DISABLE 0x00000000UL /*!< ADC group injected sequencer discontinuous mode disable */ -#define LL_ADC_INJ_SEQ_DISCONT_1RANK (ADC_CR1_JDISCEN) /*!< ADC group injected sequencer discontinuous mode enable with sequence interruption every rank */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_INJ_SEQ_RANKS ADC group injected - Sequencer ranks - * @{ - */ -#define LL_ADC_INJ_RANK_1 (ADC_JDR1_REGOFFSET | ADC_JOFR1_REGOFFSET | 0x00000001UL) /*!< ADC group injected sequencer rank 1 */ -#define LL_ADC_INJ_RANK_2 (ADC_JDR2_REGOFFSET | ADC_JOFR2_REGOFFSET | 0x00000002UL) /*!< ADC group injected sequencer rank 2 */ -#define LL_ADC_INJ_RANK_3 (ADC_JDR3_REGOFFSET | ADC_JOFR3_REGOFFSET | 0x00000003UL) /*!< ADC group injected sequencer rank 3 */ -#define LL_ADC_INJ_RANK_4 (ADC_JDR4_REGOFFSET | ADC_JOFR4_REGOFFSET | 0x00000004UL) /*!< ADC group injected sequencer rank 4 */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_CHANNEL_SAMPLINGTIME Channel - Sampling time - * @{ - */ -#define LL_ADC_SAMPLINGTIME_3CYCLES 0x00000000UL /*!< Sampling time 3 ADC clock cycles */ -#define LL_ADC_SAMPLINGTIME_15CYCLES (ADC_SMPR1_SMP10_0) /*!< Sampling time 15 ADC clock cycles */ -#define LL_ADC_SAMPLINGTIME_28CYCLES (ADC_SMPR1_SMP10_1) /*!< Sampling time 28 ADC clock cycles */ -#define LL_ADC_SAMPLINGTIME_56CYCLES (ADC_SMPR1_SMP10_1 | ADC_SMPR1_SMP10_0) /*!< Sampling time 56 ADC clock cycles */ -#define LL_ADC_SAMPLINGTIME_84CYCLES (ADC_SMPR1_SMP10_2) /*!< Sampling time 84 ADC clock cycles */ -#define LL_ADC_SAMPLINGTIME_112CYCLES (ADC_SMPR1_SMP10_2 | ADC_SMPR1_SMP10_0) /*!< Sampling time 112 ADC clock cycles */ -#define LL_ADC_SAMPLINGTIME_144CYCLES (ADC_SMPR1_SMP10_2 | ADC_SMPR1_SMP10_1) /*!< Sampling time 144 ADC clock cycles */ -#define LL_ADC_SAMPLINGTIME_480CYCLES (ADC_SMPR1_SMP10) /*!< Sampling time 480 ADC clock cycles */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_AWD_NUMBER Analog watchdog - Analog watchdog number - * @{ - */ -#define LL_ADC_AWD1 (ADC_AWD_CR1_CHANNEL_MASK | ADC_AWD_CR1_REGOFFSET) /*!< ADC analog watchdog number 1 */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_AWD_CHANNELS Analog watchdog - Monitored channels - * @{ - */ -#define LL_ADC_AWD_DISABLE 0x00000000UL /*!< ADC analog watchdog monitoring disabled */ -#define LL_ADC_AWD_ALL_CHANNELS_REG ( ADC_CR1_AWDEN ) /*!< ADC analog watchdog monitoring of all channels, converted by group regular only */ -#define LL_ADC_AWD_ALL_CHANNELS_INJ ( ADC_CR1_JAWDEN ) /*!< ADC analog watchdog monitoring of all channels, converted by group injected only */ -#define LL_ADC_AWD_ALL_CHANNELS_REG_INJ ( ADC_CR1_JAWDEN | ADC_CR1_AWDEN ) /*!< ADC analog watchdog monitoring of all channels, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_0_REG ((LL_ADC_CHANNEL_0 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN0, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_0_INJ ((LL_ADC_CHANNEL_0 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN0, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_0_REG_INJ ((LL_ADC_CHANNEL_0 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN0, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_1_REG ((LL_ADC_CHANNEL_1 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN1, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_1_INJ ((LL_ADC_CHANNEL_1 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN1, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_1_REG_INJ ((LL_ADC_CHANNEL_1 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN1, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_2_REG ((LL_ADC_CHANNEL_2 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN2, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_2_INJ ((LL_ADC_CHANNEL_2 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN2, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_2_REG_INJ ((LL_ADC_CHANNEL_2 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN2, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_3_REG ((LL_ADC_CHANNEL_3 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN3, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_3_INJ ((LL_ADC_CHANNEL_3 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN3, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_3_REG_INJ ((LL_ADC_CHANNEL_3 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN3, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_4_REG ((LL_ADC_CHANNEL_4 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN4, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_4_INJ ((LL_ADC_CHANNEL_4 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN4, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_4_REG_INJ ((LL_ADC_CHANNEL_4 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN4, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_5_REG ((LL_ADC_CHANNEL_5 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN5, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_5_INJ ((LL_ADC_CHANNEL_5 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN5, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_5_REG_INJ ((LL_ADC_CHANNEL_5 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN5, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_6_REG ((LL_ADC_CHANNEL_6 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN6, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_6_INJ ((LL_ADC_CHANNEL_6 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN6, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_6_REG_INJ ((LL_ADC_CHANNEL_6 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN6, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_7_REG ((LL_ADC_CHANNEL_7 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN7, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_7_INJ ((LL_ADC_CHANNEL_7 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN7, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_7_REG_INJ ((LL_ADC_CHANNEL_7 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN7, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_8_REG ((LL_ADC_CHANNEL_8 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN8, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_8_INJ ((LL_ADC_CHANNEL_8 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN8, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_8_REG_INJ ((LL_ADC_CHANNEL_8 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN8, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_9_REG ((LL_ADC_CHANNEL_9 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN9, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_9_INJ ((LL_ADC_CHANNEL_9 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN9, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_9_REG_INJ ((LL_ADC_CHANNEL_9 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN9, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_10_REG ((LL_ADC_CHANNEL_10 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN10, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_10_INJ ((LL_ADC_CHANNEL_10 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN10, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_10_REG_INJ ((LL_ADC_CHANNEL_10 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN10, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_11_REG ((LL_ADC_CHANNEL_11 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN11, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_11_INJ ((LL_ADC_CHANNEL_11 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN11, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_11_REG_INJ ((LL_ADC_CHANNEL_11 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN11, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_12_REG ((LL_ADC_CHANNEL_12 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN12, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_12_INJ ((LL_ADC_CHANNEL_12 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN12, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_12_REG_INJ ((LL_ADC_CHANNEL_12 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN12, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_13_REG ((LL_ADC_CHANNEL_13 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN13, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_13_INJ ((LL_ADC_CHANNEL_13 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN13, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_13_REG_INJ ((LL_ADC_CHANNEL_13 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN13, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_14_REG ((LL_ADC_CHANNEL_14 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN14, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_14_INJ ((LL_ADC_CHANNEL_14 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN14, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_14_REG_INJ ((LL_ADC_CHANNEL_14 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN14, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_15_REG ((LL_ADC_CHANNEL_15 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN15, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_15_INJ ((LL_ADC_CHANNEL_15 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN15, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_15_REG_INJ ((LL_ADC_CHANNEL_15 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN15, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_16_REG ((LL_ADC_CHANNEL_16 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN16, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_16_INJ ((LL_ADC_CHANNEL_16 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN16, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_16_REG_INJ ((LL_ADC_CHANNEL_16 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN16, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_17_REG ((LL_ADC_CHANNEL_17 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN17, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_17_INJ ((LL_ADC_CHANNEL_17 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN17, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_17_REG_INJ ((LL_ADC_CHANNEL_17 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN17, converted by either group regular or injected */ -#define LL_ADC_AWD_CHANNEL_18_REG ((LL_ADC_CHANNEL_18 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN18, converted by group regular only */ -#define LL_ADC_AWD_CHANNEL_18_INJ ((LL_ADC_CHANNEL_18 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN18, converted by group injected only */ -#define LL_ADC_AWD_CHANNEL_18_REG_INJ ((LL_ADC_CHANNEL_18 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN18, converted by either group regular or injected */ -#define LL_ADC_AWD_CH_VREFINT_REG ((LL_ADC_CHANNEL_VREFINT & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to VrefInt: Internal voltage reference, converted by group regular only */ -#define LL_ADC_AWD_CH_VREFINT_INJ ((LL_ADC_CHANNEL_VREFINT & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to VrefInt: Internal voltage reference, converted by group injected only */ -#define LL_ADC_AWD_CH_VREFINT_REG_INJ ((LL_ADC_CHANNEL_VREFINT & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to VrefInt: Internal voltage reference, converted by either group regular or injected */ -#define LL_ADC_AWD_CH_VBAT_REG ((LL_ADC_CHANNEL_VBAT & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Vbat/3: Vbat voltage through a divider ladder of factor 1/3 to have Vbat always below Vdda, converted by group regular only */ -#define LL_ADC_AWD_CH_VBAT_INJ ((LL_ADC_CHANNEL_VBAT & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Vbat/3: Vbat voltage through a divider ladder of factor 1/3 to have Vbat always below Vdda, converted by group injected only */ -#define LL_ADC_AWD_CH_VBAT_REG_INJ ((LL_ADC_CHANNEL_VBAT & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Vbat/3: Vbat voltage through a divider ladder of factor 1/3 to have Vbat always below Vdda */ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F415xx) || defined(STM32F417xx) -#define LL_ADC_AWD_CH_TEMPSENSOR_REG ((LL_ADC_CHANNEL_TEMPSENSOR & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Temperature sensor, converted by group regular only */ -#define LL_ADC_AWD_CH_TEMPSENSOR_INJ ((LL_ADC_CHANNEL_TEMPSENSOR & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Temperature sensor, converted by group injected only */ -#define LL_ADC_AWD_CH_TEMPSENSOR_REG_INJ ((LL_ADC_CHANNEL_TEMPSENSOR & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Temperature sensor, converted by either group regular or injected */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F410xx */ -#if defined(STM32F411xE) || defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define LL_ADC_AWD_CH_TEMPSENSOR_REG ((LL_ADC_CHANNEL_TEMPSENSOR & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Temperature sensor, converted by group regular only. This internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. */ -#define LL_ADC_AWD_CH_TEMPSENSOR_INJ ((LL_ADC_CHANNEL_TEMPSENSOR & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Temperature sensor, converted by group injected only. This internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. */ -#define LL_ADC_AWD_CH_TEMPSENSOR_REG_INJ ((LL_ADC_CHANNEL_TEMPSENSOR & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Temperature sensor, converted by either group regular or injected. This internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. */ -#endif /* STM32F411xE || STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_AWD_THRESHOLDS Analog watchdog - Thresholds - * @{ - */ -#define LL_ADC_AWD_THRESHOLD_HIGH (ADC_AWD_TR1_HIGH_REGOFFSET) /*!< ADC analog watchdog threshold high */ -#define LL_ADC_AWD_THRESHOLD_LOW (ADC_AWD_TR1_LOW_REGOFFSET) /*!< ADC analog watchdog threshold low */ -/** - * @} - */ - -#if defined(ADC_MULTIMODE_SUPPORT) -/** @defgroup ADC_LL_EC_MULTI_MODE Multimode - Mode - * @{ - */ -#define LL_ADC_MULTI_INDEPENDENT 0x00000000UL /*!< ADC dual mode disabled (ADC independent mode) */ -#define LL_ADC_MULTI_DUAL_REG_SIMULT ( ADC_CCR_MULTI_2 | ADC_CCR_MULTI_1 ) /*!< ADC dual mode enabled: group regular simultaneous */ -#define LL_ADC_MULTI_DUAL_REG_INTERL ( ADC_CCR_MULTI_2 | ADC_CCR_MULTI_1 | ADC_CCR_MULTI_0) /*!< ADC dual mode enabled: Combined group regular interleaved */ -#define LL_ADC_MULTI_DUAL_INJ_SIMULT ( ADC_CCR_MULTI_2 | ADC_CCR_MULTI_0) /*!< ADC dual mode enabled: group injected simultaneous */ -#define LL_ADC_MULTI_DUAL_INJ_ALTERN (ADC_CCR_MULTI_3 | ADC_CCR_MULTI_0) /*!< ADC dual mode enabled: group injected alternate trigger. Works only with external triggers (not internal SW start) */ -#define LL_ADC_MULTI_DUAL_REG_SIM_INJ_SIM ( ADC_CCR_MULTI_0) /*!< ADC dual mode enabled: Combined group regular simultaneous + group injected simultaneous */ -#define LL_ADC_MULTI_DUAL_REG_SIM_INJ_ALT ( ADC_CCR_MULTI_1 ) /*!< ADC dual mode enabled: Combined group regular simultaneous + group injected alternate trigger */ -#define LL_ADC_MULTI_DUAL_REG_INT_INJ_SIM ( ADC_CCR_MULTI_1 | ADC_CCR_MULTI_0) /*!< ADC dual mode enabled: Combined group regular interleaved + group injected simultaneous */ -#if defined(ADC3) -#define LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_SIM (ADC_CCR_MULTI_4 | ADC_CCR_MULTI_0) /*!< ADC triple mode enabled: Combined group regular simultaneous + group injected simultaneous */ -#define LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_ALT (ADC_CCR_MULTI_4 | ADC_CCR_MULTI_1 ) /*!< ADC triple mode enabled: Combined group regular simultaneous + group injected alternate trigger */ -#define LL_ADC_MULTI_TRIPLE_INJ_SIMULT (ADC_CCR_MULTI_4 | ADC_CCR_MULTI_2 | ADC_CCR_MULTI_0) /*!< ADC triple mode enabled: group injected simultaneous */ -#define LL_ADC_MULTI_TRIPLE_REG_SIMULT (ADC_CCR_MULTI_4 | ADC_CCR_MULTI_2 | ADC_CCR_MULTI_1 ) /*!< ADC triple mode enabled: group regular simultaneous */ -#define LL_ADC_MULTI_TRIPLE_REG_INTERL (ADC_CCR_MULTI_4 | ADC_CCR_MULTI_2 | ADC_CCR_MULTI_1 | ADC_CCR_MULTI_0) /*!< ADC triple mode enabled: Combined group regular interleaved */ -#define LL_ADC_MULTI_TRIPLE_INJ_ALTERN (ADC_CCR_MULTI_4 | ADC_CCR_MULTI_0) /*!< ADC triple mode enabled: group injected alternate trigger. Works only with external triggers (not internal SW start) */ -#endif -/** - * @} - */ - -/** @defgroup ADC_LL_EC_MULTI_DMA_TRANSFER Multimode - DMA transfer - * @{ - */ -#define LL_ADC_MULTI_REG_DMA_EACH_ADC 0x00000000UL /*!< ADC multimode group regular conversions are transferred by DMA: each ADC uses its own DMA channel, with its individual DMA transfer settings */ -#define LL_ADC_MULTI_REG_DMA_LIMIT_1 ( ADC_CCR_DMA_0) /*!< ADC multimode group regular conversions are transferred by DMA, one DMA channel for all ADC instances (DMA of ADC master), in limited mode (one shot mode): DMA transfer requests are stopped when number of DMA data transfers (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. Setting of DMA mode 1: 2 or 3 (dual or triple mode) half-words one by one, ADC1 then ADC2 then ADC3. */ -#define LL_ADC_MULTI_REG_DMA_LIMIT_2 ( ADC_CCR_DMA_1 ) /*!< ADC multimode group regular conversions are transferred by DMA, one DMA channel for all ADC instances (DMA of ADC master), in limited mode (one shot mode): DMA transfer requests are stopped when number of DMA data transfers (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. Setting of DMA mode 2: 2 or 3 (dual or triple mode) half-words one by one, ADC2&1 then ADC1&3 then ADC3&2. */ -#define LL_ADC_MULTI_REG_DMA_LIMIT_3 ( ADC_CCR_DMA_1 | ADC_CCR_DMA_0) /*!< ADC multimode group regular conversions are transferred by DMA, one DMA channel for all ADC instances (DMA of ADC master), in limited mode (one shot mode): DMA transfer requests are stopped when number of DMA data transfers (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. Setting of DMA mode 3: 2 or 3 (dual or triple mode) bytes one by one, ADC2&1 then ADC1&3 then ADC3&2. */ -#define LL_ADC_MULTI_REG_DMA_UNLMT_1 (ADC_CCR_DDS | ADC_CCR_DMA_0) /*!< ADC multimode group regular conversions are transferred by DMA, one DMA channel for all ADC instances (DMA of ADC master), in unlimited mode: DMA transfer requests are unlimited, whatever number of DMA data transferred (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. Setting of DMA mode 1: 2 or 3 (dual or triple mode) half-words one by one, ADC1 then ADC2 then ADC3. */ -#define LL_ADC_MULTI_REG_DMA_UNLMT_2 (ADC_CCR_DDS | ADC_CCR_DMA_1 ) /*!< ADC multimode group regular conversions are transferred by DMA, one DMA channel for all ADC instances (DMA of ADC master), in unlimited mode: DMA transfer requests are unlimited, whatever number of DMA data transferred (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. Setting of DMA mode 2: 2 or 3 (dual or triple mode) half-words by pairs, ADC2&1 then ADC1&3 then ADC3&2. */ -#define LL_ADC_MULTI_REG_DMA_UNLMT_3 (ADC_CCR_DDS | ADC_CCR_DMA_1 | ADC_CCR_DMA_0) /*!< ADC multimode group regular conversions are transferred by DMA, one DMA channel for all ADC instances (DMA of ADC master), in unlimited mode: DMA transfer requests are unlimited, whatever number of DMA data transferred (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. Setting of DMA mode 3: 2 or 3 (dual or triple mode) bytes one by one, ADC2&1 then ADC1&3 then ADC3&2. */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_MULTI_TWOSMP_DELAY Multimode - Delay between two sampling phases - * @{ - */ -#define LL_ADC_MULTI_TWOSMP_DELAY_5CYCLES 0x00000000UL /*!< ADC multimode delay between two sampling phases: 5 ADC clock cycles*/ -#define LL_ADC_MULTI_TWOSMP_DELAY_6CYCLES ( ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 6 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_7CYCLES ( ADC_CCR_DELAY_1 ) /*!< ADC multimode delay between two sampling phases: 7 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_8CYCLES ( ADC_CCR_DELAY_1 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 8 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_9CYCLES ( ADC_CCR_DELAY_2 ) /*!< ADC multimode delay between two sampling phases: 9 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_10CYCLES ( ADC_CCR_DELAY_2 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 10 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_11CYCLES ( ADC_CCR_DELAY_2 | ADC_CCR_DELAY_1 ) /*!< ADC multimode delay between two sampling phases: 11 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_12CYCLES ( ADC_CCR_DELAY_2 | ADC_CCR_DELAY_1 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 12 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_13CYCLES (ADC_CCR_DELAY_3 ) /*!< ADC multimode delay between two sampling phases: 13 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_14CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 14 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_15CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_1 ) /*!< ADC multimode delay between two sampling phases: 15 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_16CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_1 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 16 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_17CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_2 ) /*!< ADC multimode delay between two sampling phases: 17 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_18CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_2 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 18 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_19CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_2 | ADC_CCR_DELAY_1 ) /*!< ADC multimode delay between two sampling phases: 19 ADC clock cycles */ -#define LL_ADC_MULTI_TWOSMP_DELAY_20CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_2 | ADC_CCR_DELAY_1 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 20 ADC clock cycles */ -/** - * @} - */ - -/** @defgroup ADC_LL_EC_MULTI_MASTER_SLAVE Multimode - ADC master or slave - * @{ - */ -#define LL_ADC_MULTI_MASTER ( ADC_CDR_RDATA_MST) /*!< In multimode, selection among several ADC instances: ADC master */ -#define LL_ADC_MULTI_SLAVE (ADC_CDR_RDATA_SLV ) /*!< In multimode, selection among several ADC instances: ADC slave */ -#define LL_ADC_MULTI_MASTER_SLAVE (ADC_CDR_RDATA_SLV | ADC_CDR_RDATA_MST) /*!< In multimode, selection among several ADC instances: both ADC master and ADC slave */ -/** - * @} - */ - -#endif /* ADC_MULTIMODE_SUPPORT */ - - -/** @defgroup ADC_LL_EC_HW_DELAYS Definitions of ADC hardware constraints delays - * @note Only ADC IP HW delays are defined in ADC LL driver driver, - * not timeout values. - * For details on delays values, refer to descriptions in source code - * above each literal definition. - * @{ - */ - -/* Note: Only ADC IP HW delays are defined in ADC LL driver driver, */ -/* not timeout values. */ -/* Timeout values for ADC operations are dependent to device clock */ -/* configuration (system clock versus ADC clock), */ -/* and therefore must be defined in user application. */ -/* Indications for estimation of ADC timeout delays, for this */ -/* STM32 series: */ -/* - ADC enable time: maximum delay is 2us */ -/* (refer to device datasheet, parameter "tSTAB") */ -/* - ADC conversion time: duration depending on ADC clock and ADC */ -/* configuration. */ -/* (refer to device reference manual, section "Timing") */ - -/* Delay for internal voltage reference stabilization time. */ -/* Delay set to maximum value (refer to device datasheet, */ -/* parameter "tSTART"). */ -/* Unit: us */ -#define LL_ADC_DELAY_VREFINT_STAB_US ( 10UL) /*!< Delay for internal voltage reference stabilization time */ - -/* Delay for temperature sensor stabilization time. */ -/* Literal set to maximum value (refer to device datasheet, */ -/* parameter "tSTART"). */ -/* Unit: us */ -#define LL_ADC_DELAY_TEMPSENSOR_STAB_US ( 10UL) /*!< Delay for internal voltage reference stabilization time */ - -/** - * @} - */ - -/** - * @} - */ - - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup ADC_LL_Exported_Macros ADC Exported Macros - * @{ - */ - -/** @defgroup ADC_LL_EM_WRITE_READ Common write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in ADC register - * @param __INSTANCE__ ADC Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_ADC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in ADC register - * @param __INSTANCE__ ADC Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_ADC_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** @defgroup ADC_LL_EM_HELPER_MACRO ADC helper macro - * @{ - */ - -/** - * @brief Helper macro to get ADC channel number in decimal format - * from literals LL_ADC_CHANNEL_x. - * @note Example: - * __LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_4) - * will return decimal number "4". - * @note The input can be a value from functions where a channel - * number is returned, either defined with number - * or with bitfield (only one bit must be set). - * @param __CHANNEL__ This parameter can be one of the following values: - * @arg @ref LL_ADC_CHANNEL_0 - * @arg @ref LL_ADC_CHANNEL_1 - * @arg @ref LL_ADC_CHANNEL_2 - * @arg @ref LL_ADC_CHANNEL_3 - * @arg @ref LL_ADC_CHANNEL_4 - * @arg @ref LL_ADC_CHANNEL_5 - * @arg @ref LL_ADC_CHANNEL_6 - * @arg @ref LL_ADC_CHANNEL_7 - * @arg @ref LL_ADC_CHANNEL_8 - * @arg @ref LL_ADC_CHANNEL_9 - * @arg @ref LL_ADC_CHANNEL_10 - * @arg @ref LL_ADC_CHANNEL_11 - * @arg @ref LL_ADC_CHANNEL_12 - * @arg @ref LL_ADC_CHANNEL_13 - * @arg @ref LL_ADC_CHANNEL_14 - * @arg @ref LL_ADC_CHANNEL_15 - * @arg @ref LL_ADC_CHANNEL_16 - * @arg @ref LL_ADC_CHANNEL_17 - * @arg @ref LL_ADC_CHANNEL_18 - * @arg @ref LL_ADC_CHANNEL_VREFINT (1) - * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) - * @arg @ref LL_ADC_CHANNEL_VBAT (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. - * @retval Value between Min_Data=0 and Max_Data=18 - */ -#define __LL_ADC_CHANNEL_TO_DECIMAL_NB(__CHANNEL__) \ - (((__CHANNEL__) & ADC_CHANNEL_ID_NUMBER_MASK) >> ADC_CHANNEL_ID_NUMBER_BITOFFSET_POS) - -/** - * @brief Helper macro to get ADC channel in literal format LL_ADC_CHANNEL_x - * from number in decimal format. - * @note Example: - * __LL_ADC_DECIMAL_NB_TO_CHANNEL(4) - * will return a data equivalent to "LL_ADC_CHANNEL_4". - * @param __DECIMAL_NB__ Value between Min_Data=0 and Max_Data=18 - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_CHANNEL_0 - * @arg @ref LL_ADC_CHANNEL_1 - * @arg @ref LL_ADC_CHANNEL_2 - * @arg @ref LL_ADC_CHANNEL_3 - * @arg @ref LL_ADC_CHANNEL_4 - * @arg @ref LL_ADC_CHANNEL_5 - * @arg @ref LL_ADC_CHANNEL_6 - * @arg @ref LL_ADC_CHANNEL_7 - * @arg @ref LL_ADC_CHANNEL_8 - * @arg @ref LL_ADC_CHANNEL_9 - * @arg @ref LL_ADC_CHANNEL_10 - * @arg @ref LL_ADC_CHANNEL_11 - * @arg @ref LL_ADC_CHANNEL_12 - * @arg @ref LL_ADC_CHANNEL_13 - * @arg @ref LL_ADC_CHANNEL_14 - * @arg @ref LL_ADC_CHANNEL_15 - * @arg @ref LL_ADC_CHANNEL_16 - * @arg @ref LL_ADC_CHANNEL_17 - * @arg @ref LL_ADC_CHANNEL_18 - * @arg @ref LL_ADC_CHANNEL_VREFINT (1) - * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) - * @arg @ref LL_ADC_CHANNEL_VBAT (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled.\n - * (1) For ADC channel read back from ADC register, - * comparison with internal channel parameter to be done - * using helper macro @ref __LL_ADC_CHANNEL_INTERNAL_TO_EXTERNAL(). - */ -#define __LL_ADC_DECIMAL_NB_TO_CHANNEL(__DECIMAL_NB__) \ - (((__DECIMAL_NB__) <= 9UL) \ - ? ( \ - ((__DECIMAL_NB__) << ADC_CHANNEL_ID_NUMBER_BITOFFSET_POS) | \ - (ADC_SMPR2_REGOFFSET | (((uint32_t) (3UL * (__DECIMAL_NB__))) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) \ - ) \ - : \ - ( \ - ((__DECIMAL_NB__) << ADC_CHANNEL_ID_NUMBER_BITOFFSET_POS) | \ - (ADC_SMPR1_REGOFFSET | (((uint32_t) (3UL * ((__DECIMAL_NB__) - 10UL))) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) \ - ) \ - ) - -/** - * @brief Helper macro to determine whether the selected channel - * corresponds to literal definitions of driver. - * @note The different literal definitions of ADC channels are: - * - ADC internal channel: - * LL_ADC_CHANNEL_VREFINT, LL_ADC_CHANNEL_TEMPSENSOR, ... - * - ADC external channel (channel connected to a GPIO pin): - * LL_ADC_CHANNEL_1, LL_ADC_CHANNEL_2, ... - * @note The channel parameter must be a value defined from literal - * definition of a ADC internal channel (LL_ADC_CHANNEL_VREFINT, - * LL_ADC_CHANNEL_TEMPSENSOR, ...), - * ADC external channel (LL_ADC_CHANNEL_1, LL_ADC_CHANNEL_2, ...), - * must not be a value from functions where a channel number is - * returned from ADC registers, - * because internal and external channels share the same channel - * number in ADC registers. The differentiation is made only with - * parameters definitions of driver. - * @param __CHANNEL__ This parameter can be one of the following values: - * @arg @ref LL_ADC_CHANNEL_0 - * @arg @ref LL_ADC_CHANNEL_1 - * @arg @ref LL_ADC_CHANNEL_2 - * @arg @ref LL_ADC_CHANNEL_3 - * @arg @ref LL_ADC_CHANNEL_4 - * @arg @ref LL_ADC_CHANNEL_5 - * @arg @ref LL_ADC_CHANNEL_6 - * @arg @ref LL_ADC_CHANNEL_7 - * @arg @ref LL_ADC_CHANNEL_8 - * @arg @ref LL_ADC_CHANNEL_9 - * @arg @ref LL_ADC_CHANNEL_10 - * @arg @ref LL_ADC_CHANNEL_11 - * @arg @ref LL_ADC_CHANNEL_12 - * @arg @ref LL_ADC_CHANNEL_13 - * @arg @ref LL_ADC_CHANNEL_14 - * @arg @ref LL_ADC_CHANNEL_15 - * @arg @ref LL_ADC_CHANNEL_16 - * @arg @ref LL_ADC_CHANNEL_17 - * @arg @ref LL_ADC_CHANNEL_18 - * @arg @ref LL_ADC_CHANNEL_VREFINT (1) - * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) - * @arg @ref LL_ADC_CHANNEL_VBAT (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. - * @retval Value "0" if the channel corresponds to a parameter definition of a ADC external channel (channel connected to a GPIO pin). - * Value "1" if the channel corresponds to a parameter definition of a ADC internal channel. - */ -#define __LL_ADC_IS_CHANNEL_INTERNAL(__CHANNEL__) \ - (((__CHANNEL__) & ADC_CHANNEL_ID_INTERNAL_CH_MASK) != 0UL) - -/** - * @brief Helper macro to convert a channel defined from parameter - * definition of a ADC internal channel (LL_ADC_CHANNEL_VREFINT, - * LL_ADC_CHANNEL_TEMPSENSOR, ...), - * to its equivalent parameter definition of a ADC external channel - * (LL_ADC_CHANNEL_1, LL_ADC_CHANNEL_2, ...). - * @note The channel parameter can be, additionally to a value - * defined from parameter definition of a ADC internal channel - * (LL_ADC_CHANNEL_VREFINT, LL_ADC_CHANNEL_TEMPSENSOR, ...), - * a value defined from parameter definition of - * ADC external channel (LL_ADC_CHANNEL_1, LL_ADC_CHANNEL_2, ...) - * or a value from functions where a channel number is returned - * from ADC registers. - * @param __CHANNEL__ This parameter can be one of the following values: - * @arg @ref LL_ADC_CHANNEL_0 - * @arg @ref LL_ADC_CHANNEL_1 - * @arg @ref LL_ADC_CHANNEL_2 - * @arg @ref LL_ADC_CHANNEL_3 - * @arg @ref LL_ADC_CHANNEL_4 - * @arg @ref LL_ADC_CHANNEL_5 - * @arg @ref LL_ADC_CHANNEL_6 - * @arg @ref LL_ADC_CHANNEL_7 - * @arg @ref LL_ADC_CHANNEL_8 - * @arg @ref LL_ADC_CHANNEL_9 - * @arg @ref LL_ADC_CHANNEL_10 - * @arg @ref LL_ADC_CHANNEL_11 - * @arg @ref LL_ADC_CHANNEL_12 - * @arg @ref LL_ADC_CHANNEL_13 - * @arg @ref LL_ADC_CHANNEL_14 - * @arg @ref LL_ADC_CHANNEL_15 - * @arg @ref LL_ADC_CHANNEL_16 - * @arg @ref LL_ADC_CHANNEL_17 - * @arg @ref LL_ADC_CHANNEL_18 - * @arg @ref LL_ADC_CHANNEL_VREFINT (1) - * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) - * @arg @ref LL_ADC_CHANNEL_VBAT (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_CHANNEL_0 - * @arg @ref LL_ADC_CHANNEL_1 - * @arg @ref LL_ADC_CHANNEL_2 - * @arg @ref LL_ADC_CHANNEL_3 - * @arg @ref LL_ADC_CHANNEL_4 - * @arg @ref LL_ADC_CHANNEL_5 - * @arg @ref LL_ADC_CHANNEL_6 - * @arg @ref LL_ADC_CHANNEL_7 - * @arg @ref LL_ADC_CHANNEL_8 - * @arg @ref LL_ADC_CHANNEL_9 - * @arg @ref LL_ADC_CHANNEL_10 - * @arg @ref LL_ADC_CHANNEL_11 - * @arg @ref LL_ADC_CHANNEL_12 - * @arg @ref LL_ADC_CHANNEL_13 - * @arg @ref LL_ADC_CHANNEL_14 - * @arg @ref LL_ADC_CHANNEL_15 - * @arg @ref LL_ADC_CHANNEL_16 - * @arg @ref LL_ADC_CHANNEL_17 - * @arg @ref LL_ADC_CHANNEL_18 - */ -#define __LL_ADC_CHANNEL_INTERNAL_TO_EXTERNAL(__CHANNEL__) \ - ((__CHANNEL__) & ~ADC_CHANNEL_ID_INTERNAL_CH_MASK) - -/** - * @brief Helper macro to determine whether the internal channel - * selected is available on the ADC instance selected. - * @note The channel parameter must be a value defined from parameter - * definition of a ADC internal channel (LL_ADC_CHANNEL_VREFINT, - * LL_ADC_CHANNEL_TEMPSENSOR, ...), - * must not be a value defined from parameter definition of - * ADC external channel (LL_ADC_CHANNEL_1, LL_ADC_CHANNEL_2, ...) - * or a value from functions where a channel number is - * returned from ADC registers, - * because internal and external channels share the same channel - * number in ADC registers. The differentiation is made only with - * parameters definitions of driver. - * @param __ADC_INSTANCE__ ADC instance - * @param __CHANNEL__ This parameter can be one of the following values: - * @arg @ref LL_ADC_CHANNEL_VREFINT (1) - * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) - * @arg @ref LL_ADC_CHANNEL_VBAT (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1. - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. - * @retval Value "0" if the internal channel selected is not available on the ADC instance selected. - * Value "1" if the internal channel selected is available on the ADC instance selected. - */ -#define __LL_ADC_IS_CHANNEL_INTERNAL_AVAILABLE(__ADC_INSTANCE__, __CHANNEL__) \ - ( \ - ((__CHANNEL__) == LL_ADC_CHANNEL_VREFINT) || \ - ((__CHANNEL__) == LL_ADC_CHANNEL_TEMPSENSOR) || \ - ((__CHANNEL__) == LL_ADC_CHANNEL_VBAT) \ - ) -/** - * @brief Helper macro to define ADC analog watchdog parameter: - * define a single channel to monitor with analog watchdog - * from sequencer channel and groups definition. - * @note To be used with function @ref LL_ADC_SetAnalogWDMonitChannels(). - * Example: - * LL_ADC_SetAnalogWDMonitChannels( - * ADC1, LL_ADC_AWD1, - * __LL_ADC_ANALOGWD_CHANNEL_GROUP(LL_ADC_CHANNEL4, LL_ADC_GROUP_REGULAR)) - * @param __CHANNEL__ This parameter can be one of the following values: - * @arg @ref LL_ADC_CHANNEL_0 - * @arg @ref LL_ADC_CHANNEL_1 - * @arg @ref LL_ADC_CHANNEL_2 - * @arg @ref LL_ADC_CHANNEL_3 - * @arg @ref LL_ADC_CHANNEL_4 - * @arg @ref LL_ADC_CHANNEL_5 - * @arg @ref LL_ADC_CHANNEL_6 - * @arg @ref LL_ADC_CHANNEL_7 - * @arg @ref LL_ADC_CHANNEL_8 - * @arg @ref LL_ADC_CHANNEL_9 - * @arg @ref LL_ADC_CHANNEL_10 - * @arg @ref LL_ADC_CHANNEL_11 - * @arg @ref LL_ADC_CHANNEL_12 - * @arg @ref LL_ADC_CHANNEL_13 - * @arg @ref LL_ADC_CHANNEL_14 - * @arg @ref LL_ADC_CHANNEL_15 - * @arg @ref LL_ADC_CHANNEL_16 - * @arg @ref LL_ADC_CHANNEL_17 - * @arg @ref LL_ADC_CHANNEL_18 - * @arg @ref LL_ADC_CHANNEL_VREFINT (1) - * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) - * @arg @ref LL_ADC_CHANNEL_VBAT (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled.\n - * (1) For ADC channel read back from ADC register, - * comparison with internal channel parameter to be done - * using helper macro @ref __LL_ADC_CHANNEL_INTERNAL_TO_EXTERNAL(). - * @param __GROUP__ This parameter can be one of the following values: - * @arg @ref LL_ADC_GROUP_REGULAR - * @arg @ref LL_ADC_GROUP_INJECTED - * @arg @ref LL_ADC_GROUP_REGULAR_INJECTED - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_AWD_DISABLE - * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG - * @arg @ref LL_ADC_AWD_ALL_CHANNELS_INJ - * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_0_REG - * @arg @ref LL_ADC_AWD_CHANNEL_0_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_0_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_1_REG - * @arg @ref LL_ADC_AWD_CHANNEL_1_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_1_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_2_REG - * @arg @ref LL_ADC_AWD_CHANNEL_2_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_2_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_3_REG - * @arg @ref LL_ADC_AWD_CHANNEL_3_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_3_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_4_REG - * @arg @ref LL_ADC_AWD_CHANNEL_4_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_4_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_5_REG - * @arg @ref LL_ADC_AWD_CHANNEL_5_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_5_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_6_REG - * @arg @ref LL_ADC_AWD_CHANNEL_6_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_6_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_7_REG - * @arg @ref LL_ADC_AWD_CHANNEL_7_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_7_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_8_REG - * @arg @ref LL_ADC_AWD_CHANNEL_8_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_8_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_9_REG - * @arg @ref LL_ADC_AWD_CHANNEL_9_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_9_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_10_REG - * @arg @ref LL_ADC_AWD_CHANNEL_10_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_10_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_11_REG - * @arg @ref LL_ADC_AWD_CHANNEL_11_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_11_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_12_REG - * @arg @ref LL_ADC_AWD_CHANNEL_12_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_12_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_13_REG - * @arg @ref LL_ADC_AWD_CHANNEL_13_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_13_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_14_REG - * @arg @ref LL_ADC_AWD_CHANNEL_14_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_14_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_15_REG - * @arg @ref LL_ADC_AWD_CHANNEL_15_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_15_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_16_REG - * @arg @ref LL_ADC_AWD_CHANNEL_16_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_16_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_17_REG - * @arg @ref LL_ADC_AWD_CHANNEL_17_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_17_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_18_REG - * @arg @ref LL_ADC_AWD_CHANNEL_18_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_18_REG_INJ - * @arg @ref LL_ADC_AWD_CH_VREFINT_REG (1) - * @arg @ref LL_ADC_AWD_CH_VREFINT_INJ (1) - * @arg @ref LL_ADC_AWD_CH_VREFINT_REG_INJ (1) - * @arg @ref LL_ADC_AWD_CH_TEMPSENSOR_REG (1)(2) - * @arg @ref LL_ADC_AWD_CH_TEMPSENSOR_INJ (1)(2) - * @arg @ref LL_ADC_AWD_CH_TEMPSENSOR_REG_INJ (1)(2) - * @arg @ref LL_ADC_AWD_CH_VBAT_REG (1) - * @arg @ref LL_ADC_AWD_CH_VBAT_INJ (1) - * @arg @ref LL_ADC_AWD_CH_VBAT_REG_INJ (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. - */ -#define __LL_ADC_ANALOGWD_CHANNEL_GROUP(__CHANNEL__, __GROUP__) \ - (((__GROUP__) == LL_ADC_GROUP_REGULAR) \ - ? (((__CHANNEL__) & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) \ - : \ - ((__GROUP__) == LL_ADC_GROUP_INJECTED) \ - ? (((__CHANNEL__) & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) \ - : \ - (((__CHANNEL__) & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) \ - ) - -/** - * @brief Helper macro to set the value of ADC analog watchdog threshold high - * or low in function of ADC resolution, when ADC resolution is - * different of 12 bits. - * @note To be used with function @ref LL_ADC_SetAnalogWDThresholds(). - * Example, with a ADC resolution of 8 bits, to set the value of - * analog watchdog threshold high (on 8 bits): - * LL_ADC_SetAnalogWDThresholds - * (< ADCx param >, - * __LL_ADC_ANALOGWD_SET_THRESHOLD_RESOLUTION(LL_ADC_RESOLUTION_8B, ) - * ); - * @param __ADC_RESOLUTION__ This parameter can be one of the following values: - * @arg @ref LL_ADC_RESOLUTION_12B - * @arg @ref LL_ADC_RESOLUTION_10B - * @arg @ref LL_ADC_RESOLUTION_8B - * @arg @ref LL_ADC_RESOLUTION_6B - * @param __AWD_THRESHOLD__ Value between Min_Data=0x000 and Max_Data=0xFFF - * @retval Value between Min_Data=0x000 and Max_Data=0xFFF - */ -#define __LL_ADC_ANALOGWD_SET_THRESHOLD_RESOLUTION(__ADC_RESOLUTION__, __AWD_THRESHOLD__) \ - ((__AWD_THRESHOLD__) << ((__ADC_RESOLUTION__) >> (ADC_CR1_RES_BITOFFSET_POS - 1UL ))) - -/** - * @brief Helper macro to get the value of ADC analog watchdog threshold high - * or low in function of ADC resolution, when ADC resolution is - * different of 12 bits. - * @note To be used with function @ref LL_ADC_GetAnalogWDThresholds(). - * Example, with a ADC resolution of 8 bits, to get the value of - * analog watchdog threshold high (on 8 bits): - * < threshold_value_6_bits > = __LL_ADC_ANALOGWD_GET_THRESHOLD_RESOLUTION - * (LL_ADC_RESOLUTION_8B, - * LL_ADC_GetAnalogWDThresholds(, LL_ADC_AWD_THRESHOLD_HIGH) - * ); - * @param __ADC_RESOLUTION__ This parameter can be one of the following values: - * @arg @ref LL_ADC_RESOLUTION_12B - * @arg @ref LL_ADC_RESOLUTION_10B - * @arg @ref LL_ADC_RESOLUTION_8B - * @arg @ref LL_ADC_RESOLUTION_6B - * @param __AWD_THRESHOLD_12_BITS__ Value between Min_Data=0x000 and Max_Data=0xFFF - * @retval Value between Min_Data=0x000 and Max_Data=0xFFF - */ -#define __LL_ADC_ANALOGWD_GET_THRESHOLD_RESOLUTION(__ADC_RESOLUTION__, __AWD_THRESHOLD_12_BITS__) \ - ((__AWD_THRESHOLD_12_BITS__) >> ((__ADC_RESOLUTION__) >> (ADC_CR1_RES_BITOFFSET_POS - 1UL ))) - -#if defined(ADC_MULTIMODE_SUPPORT) -/** - * @brief Helper macro to get the ADC multimode conversion data of ADC master - * or ADC slave from raw value with both ADC conversion data concatenated. - * @note This macro is intended to be used when multimode transfer by DMA - * is enabled: refer to function @ref LL_ADC_SetMultiDMATransfer(). - * In this case the transferred data need to processed with this macro - * to separate the conversion data of ADC master and ADC slave. - * @param __ADC_MULTI_MASTER_SLAVE__ This parameter can be one of the following values: - * @arg @ref LL_ADC_MULTI_MASTER - * @arg @ref LL_ADC_MULTI_SLAVE - * @param __ADC_MULTI_CONV_DATA__ Value between Min_Data=0x000 and Max_Data=0xFFF - * @retval Value between Min_Data=0x000 and Max_Data=0xFFF - */ -#define __LL_ADC_MULTI_CONV_DATA_MASTER_SLAVE(__ADC_MULTI_MASTER_SLAVE__, __ADC_MULTI_CONV_DATA__) \ - (((__ADC_MULTI_CONV_DATA__) >> POSITION_VAL((__ADC_MULTI_MASTER_SLAVE__))) & ADC_CDR_RDATA_MST) -#endif - -/** - * @brief Helper macro to select the ADC common instance - * to which is belonging the selected ADC instance. - * @note ADC common register instance can be used for: - * - Set parameters common to several ADC instances - * - Multimode (for devices with several ADC instances) - * Refer to functions having argument "ADCxy_COMMON" as parameter. - * @param __ADCx__ ADC instance - * @retval ADC common register instance - */ -#if defined(ADC1) && defined(ADC2) && defined(ADC3) -#define __LL_ADC_COMMON_INSTANCE(__ADCx__) \ - (ADC123_COMMON) -#elif defined(ADC1) && defined(ADC2) -#define __LL_ADC_COMMON_INSTANCE(__ADCx__) \ - (ADC12_COMMON) -#else -#define __LL_ADC_COMMON_INSTANCE(__ADCx__) \ - (ADC1_COMMON) -#endif - -/** - * @brief Helper macro to check if all ADC instances sharing the same - * ADC common instance are disabled. - * @note This check is required by functions with setting conditioned to - * ADC state: - * All ADC instances of the ADC common group must be disabled. - * Refer to functions having argument "ADCxy_COMMON" as parameter. - * @note On devices with only 1 ADC common instance, parameter of this macro - * is useless and can be ignored (parameter kept for compatibility - * with devices featuring several ADC common instances). - * @param __ADCXY_COMMON__ ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval Value "0" if all ADC instances sharing the same ADC common instance - * are disabled. - * Value "1" if at least one ADC instance sharing the same ADC common instance - * is enabled. - */ -#if defined(ADC1) && defined(ADC2) && defined(ADC3) -#define __LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(__ADCXY_COMMON__) \ - (LL_ADC_IsEnabled(ADC1) | \ - LL_ADC_IsEnabled(ADC2) | \ - LL_ADC_IsEnabled(ADC3) ) -#elif defined(ADC1) && defined(ADC2) -#define __LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(__ADCXY_COMMON__) \ - (LL_ADC_IsEnabled(ADC1) | \ - LL_ADC_IsEnabled(ADC2) ) -#else -#define __LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(__ADCXY_COMMON__) \ - (LL_ADC_IsEnabled(ADC1)) -#endif - -/** - * @brief Helper macro to define the ADC conversion data full-scale digital - * value corresponding to the selected ADC resolution. - * @note ADC conversion data full-scale corresponds to voltage range - * determined by analog voltage references Vref+ and Vref- - * (refer to reference manual). - * @param __ADC_RESOLUTION__ This parameter can be one of the following values: - * @arg @ref LL_ADC_RESOLUTION_12B - * @arg @ref LL_ADC_RESOLUTION_10B - * @arg @ref LL_ADC_RESOLUTION_8B - * @arg @ref LL_ADC_RESOLUTION_6B - * @retval ADC conversion data equivalent voltage value (unit: mVolt) - */ -#define __LL_ADC_DIGITAL_SCALE(__ADC_RESOLUTION__) \ - (0xFFFU >> ((__ADC_RESOLUTION__) >> (ADC_CR1_RES_BITOFFSET_POS - 1UL))) - -/** - * @brief Helper macro to convert the ADC conversion data from - * a resolution to another resolution. - * @param __DATA__ ADC conversion data to be converted - * @param __ADC_RESOLUTION_CURRENT__ Resolution of to the data to be converted - * This parameter can be one of the following values: - * @arg @ref LL_ADC_RESOLUTION_12B - * @arg @ref LL_ADC_RESOLUTION_10B - * @arg @ref LL_ADC_RESOLUTION_8B - * @arg @ref LL_ADC_RESOLUTION_6B - * @param __ADC_RESOLUTION_TARGET__ Resolution of the data after conversion - * This parameter can be one of the following values: - * @arg @ref LL_ADC_RESOLUTION_12B - * @arg @ref LL_ADC_RESOLUTION_10B - * @arg @ref LL_ADC_RESOLUTION_8B - * @arg @ref LL_ADC_RESOLUTION_6B - * @retval ADC conversion data to the requested resolution - */ -#define __LL_ADC_CONVERT_DATA_RESOLUTION(__DATA__, __ADC_RESOLUTION_CURRENT__, __ADC_RESOLUTION_TARGET__) \ - (((__DATA__) \ - << ((__ADC_RESOLUTION_CURRENT__) >> (ADC_CR1_RES_BITOFFSET_POS - 1UL))) \ - >> ((__ADC_RESOLUTION_TARGET__) >> (ADC_CR1_RES_BITOFFSET_POS - 1UL)) \ - ) - -/** - * @brief Helper macro to calculate the voltage (unit: mVolt) - * corresponding to a ADC conversion data (unit: digital value). - * @note Analog reference voltage (Vref+) must be either known from - * user board environment or can be calculated using ADC measurement - * and ADC helper macro @ref __LL_ADC_CALC_VREFANALOG_VOLTAGE(). - * @param __VREFANALOG_VOLTAGE__ Analog reference voltage (unit mV) - * @param __ADC_DATA__ ADC conversion data (resolution 12 bits) - * (unit: digital value). - * @param __ADC_RESOLUTION__ This parameter can be one of the following values: - * @arg @ref LL_ADC_RESOLUTION_12B - * @arg @ref LL_ADC_RESOLUTION_10B - * @arg @ref LL_ADC_RESOLUTION_8B - * @arg @ref LL_ADC_RESOLUTION_6B - * @retval ADC conversion data equivalent voltage value (unit: mVolt) - */ -#define __LL_ADC_CALC_DATA_TO_VOLTAGE(__VREFANALOG_VOLTAGE__,\ - __ADC_DATA__,\ - __ADC_RESOLUTION__) \ - ((__ADC_DATA__) * (__VREFANALOG_VOLTAGE__) \ - / __LL_ADC_DIGITAL_SCALE(__ADC_RESOLUTION__) \ - ) - -/** - * @brief Helper macro to calculate analog reference voltage (Vref+) - * (unit: mVolt) from ADC conversion data of internal voltage - * reference VrefInt. - * @note Computation is using VrefInt calibration value - * stored in system memory for each device during production. - * @note This voltage depends on user board environment: voltage level - * connected to pin Vref+. - * On devices with small package, the pin Vref+ is not present - * and internally bonded to pin Vdda. - * @note On this STM32 series, calibration data of internal voltage reference - * VrefInt corresponds to a resolution of 12 bits, - * this is the recommended ADC resolution to convert voltage of - * internal voltage reference VrefInt. - * Otherwise, this macro performs the processing to scale - * ADC conversion data to 12 bits. - * @param __VREFINT_ADC_DATA__ ADC conversion data (resolution 12 bits) - * of internal voltage reference VrefInt (unit: digital value). - * @param __ADC_RESOLUTION__ This parameter can be one of the following values: - * @arg @ref LL_ADC_RESOLUTION_12B - * @arg @ref LL_ADC_RESOLUTION_10B - * @arg @ref LL_ADC_RESOLUTION_8B - * @arg @ref LL_ADC_RESOLUTION_6B - * @retval Analog reference voltage (unit: mV) - */ -#define __LL_ADC_CALC_VREFANALOG_VOLTAGE(__VREFINT_ADC_DATA__,\ - __ADC_RESOLUTION__) \ - (((uint32_t)(*VREFINT_CAL_ADDR) * VREFINT_CAL_VREF) \ - / __LL_ADC_CONVERT_DATA_RESOLUTION((__VREFINT_ADC_DATA__), \ - (__ADC_RESOLUTION__), \ - LL_ADC_RESOLUTION_12B)) - -/* Note: On device STM32F4x9, calibration parameter TS_CAL2 is not available. */ -/* Therefore, helper macro __LL_ADC_CALC_TEMPERATURE() is not available.*/ -/* Use helper macro @ref __LL_ADC_CALC_TEMPERATURE_TYP_PARAMS(). */ -#if !defined(STM32F469) && !defined(STM32F479xx) && !defined(STM32F429xx) && !defined(STM32F439xx) -/** - * @brief Helper macro to calculate the temperature (unit: degree Celsius) - * from ADC conversion data of internal temperature sensor. - * @note Computation is using temperature sensor calibration values - * stored in system memory for each device during production. - * @note Calculation formula: - * Temperature = ((TS_ADC_DATA - TS_CAL1) - * * (TS_CAL2_TEMP - TS_CAL1_TEMP)) - * / (TS_CAL2 - TS_CAL1) + TS_CAL1_TEMP - * with TS_ADC_DATA = temperature sensor raw data measured by ADC - * Avg_Slope = (TS_CAL2 - TS_CAL1) - * / (TS_CAL2_TEMP - TS_CAL1_TEMP) - * TS_CAL1 = equivalent TS_ADC_DATA at temperature - * TEMP_DEGC_CAL1 (calibrated in factory) - * TS_CAL2 = equivalent TS_ADC_DATA at temperature - * TEMP_DEGC_CAL2 (calibrated in factory) - * Caution: Calculation relevancy under reserve that calibration - * parameters are correct (address and data). - * To calculate temperature using temperature sensor - * datasheet typical values (generic values less, therefore - * less accurate than calibrated values), - * use helper macro @ref __LL_ADC_CALC_TEMPERATURE_TYP_PARAMS(). - * @note As calculation input, the analog reference voltage (Vref+) must be - * defined as it impacts the ADC LSB equivalent voltage. - * @note Analog reference voltage (Vref+) must be either known from - * user board environment or can be calculated using ADC measurement - * and ADC helper macro @ref __LL_ADC_CALC_VREFANALOG_VOLTAGE(). - * @note On this STM32 series, calibration data of temperature sensor - * corresponds to a resolution of 12 bits, - * this is the recommended ADC resolution to convert voltage of - * temperature sensor. - * Otherwise, this macro performs the processing to scale - * ADC conversion data to 12 bits. - * @param __VREFANALOG_VOLTAGE__ Analog reference voltage (unit mV) - * @param __TEMPSENSOR_ADC_DATA__ ADC conversion data of internal - * temperature sensor (unit: digital value). - * @param __ADC_RESOLUTION__ ADC resolution at which internal temperature - * sensor voltage has been measured. - * This parameter can be one of the following values: - * @arg @ref LL_ADC_RESOLUTION_12B - * @arg @ref LL_ADC_RESOLUTION_10B - * @arg @ref LL_ADC_RESOLUTION_8B - * @arg @ref LL_ADC_RESOLUTION_6B - * @retval Temperature (unit: degree Celsius) - */ -#define __LL_ADC_CALC_TEMPERATURE(__VREFANALOG_VOLTAGE__,\ - __TEMPSENSOR_ADC_DATA__,\ - __ADC_RESOLUTION__) \ - (((( ((int32_t)((__LL_ADC_CONVERT_DATA_RESOLUTION((__TEMPSENSOR_ADC_DATA__), \ - (__ADC_RESOLUTION__), \ - LL_ADC_RESOLUTION_12B) \ - * (__VREFANALOG_VOLTAGE__)) \ - / TEMPSENSOR_CAL_VREFANALOG) \ - - (int32_t) *TEMPSENSOR_CAL1_ADDR) \ - ) * (int32_t)(TEMPSENSOR_CAL2_TEMP - TEMPSENSOR_CAL1_TEMP) \ - ) / (int32_t)((int32_t)*TEMPSENSOR_CAL2_ADDR - (int32_t)*TEMPSENSOR_CAL1_ADDR) \ - ) + TEMPSENSOR_CAL1_TEMP \ - ) -#endif - -/** - * @brief Helper macro to calculate the temperature (unit: degree Celsius) - * from ADC conversion data of internal temperature sensor. - * @note Computation is using temperature sensor typical values - * (refer to device datasheet). - * @note Calculation formula: - * Temperature = (TS_TYP_CALx_VOLT(uV) - TS_ADC_DATA * Conversion_uV) - * / Avg_Slope + CALx_TEMP - * with TS_ADC_DATA = temperature sensor raw data measured by ADC - * (unit: digital value) - * Avg_Slope = temperature sensor slope - * (unit: uV/Degree Celsius) - * TS_TYP_CALx_VOLT = temperature sensor digital value at - * temperature CALx_TEMP (unit: mV) - * Caution: Calculation relevancy under reserve the temperature sensor - * of the current device has characteristics in line with - * datasheet typical values. - * If temperature sensor calibration values are available on - * on this device (presence of macro __LL_ADC_CALC_TEMPERATURE()), - * temperature calculation will be more accurate using - * helper macro @ref __LL_ADC_CALC_TEMPERATURE(). - * @note As calculation input, the analog reference voltage (Vref+) must be - * defined as it impacts the ADC LSB equivalent voltage. - * @note Analog reference voltage (Vref+) must be either known from - * user board environment or can be calculated using ADC measurement - * and ADC helper macro @ref __LL_ADC_CALC_VREFANALOG_VOLTAGE(). - * @note ADC measurement data must correspond to a resolution of 12bits - * (full scale digital value 4095). If not the case, the data must be - * preliminarily rescaled to an equivalent resolution of 12 bits. - * @param __TEMPSENSOR_TYP_AVGSLOPE__ Device datasheet data Temperature sensor slope typical value (unit uV/DegCelsius). - * On STM32F4, refer to device datasheet parameter "Avg_Slope". - * @param __TEMPSENSOR_TYP_CALX_V__ Device datasheet data Temperature sensor voltage typical value (at temperature and Vref+ defined in parameters below) (unit mV). - * On STM32F4, refer to device datasheet parameter "V25". - * @param __TEMPSENSOR_CALX_TEMP__ Device datasheet data Temperature at which temperature sensor voltage (see parameter above) is corresponding (unit mV) - * @param __VREFANALOG_VOLTAGE__ Analog voltage reference (Vref+) voltage (unit mV) - * @param __TEMPSENSOR_ADC_DATA__ ADC conversion data of internal temperature sensor (unit digital value). - * @param __ADC_RESOLUTION__ ADC resolution at which internal temperature sensor voltage has been measured. - * This parameter can be one of the following values: - * @arg @ref LL_ADC_RESOLUTION_12B - * @arg @ref LL_ADC_RESOLUTION_10B - * @arg @ref LL_ADC_RESOLUTION_8B - * @arg @ref LL_ADC_RESOLUTION_6B - * @retval Temperature (unit: degree Celsius) - */ -#define __LL_ADC_CALC_TEMPERATURE_TYP_PARAMS(__TEMPSENSOR_TYP_AVGSLOPE__,\ - __TEMPSENSOR_TYP_CALX_V__,\ - __TEMPSENSOR_CALX_TEMP__,\ - __VREFANALOG_VOLTAGE__,\ - __TEMPSENSOR_ADC_DATA__,\ - __ADC_RESOLUTION__) \ - ((( ( \ - (int32_t)(((__TEMPSENSOR_TYP_CALX_V__)) \ - * 1000) \ - - \ - (int32_t)((((__TEMPSENSOR_ADC_DATA__) * (__VREFANALOG_VOLTAGE__)) \ - / __LL_ADC_DIGITAL_SCALE(__ADC_RESOLUTION__)) \ - * 1000) \ - ) \ - ) / (__TEMPSENSOR_TYP_AVGSLOPE__) \ - ) + (__TEMPSENSOR_CALX_TEMP__) \ - ) - -/** - * @} - */ - -/** - * @} - */ - - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup ADC_LL_Exported_Functions ADC Exported Functions - * @{ - */ - -/** @defgroup ADC_LL_EF_DMA_Management ADC DMA management - * @{ - */ -/* Note: LL ADC functions to set DMA transfer are located into sections of */ -/* configuration of ADC instance, groups and multimode (if available): */ -/* @ref LL_ADC_REG_SetDMATransfer(), ... */ - -/** - * @brief Function to help to configure DMA transfer from ADC: retrieve the - * ADC register address from ADC instance and a list of ADC registers - * intended to be used (most commonly) with DMA transfer. - * @note These ADC registers are data registers: - * when ADC conversion data is available in ADC data registers, - * ADC generates a DMA transfer request. - * @note This macro is intended to be used with LL DMA driver, refer to - * function "LL_DMA_ConfigAddresses()". - * Example: - * LL_DMA_ConfigAddresses(DMA1, - * LL_DMA_CHANNEL_1, - * LL_ADC_DMA_GetRegAddr(ADC1, LL_ADC_DMA_REG_REGULAR_DATA), - * (uint32_t)&< array or variable >, - * LL_DMA_DIRECTION_PERIPH_TO_MEMORY); - * @note For devices with several ADC: in multimode, some devices - * use a different data register outside of ADC instance scope - * (common data register). This macro manages this register difference, - * only ADC instance has to be set as parameter. - * @rmtoll DR RDATA LL_ADC_DMA_GetRegAddr\n - * CDR RDATA_MST LL_ADC_DMA_GetRegAddr\n - * CDR RDATA_SLV LL_ADC_DMA_GetRegAddr - * @param ADCx ADC instance - * @param Register This parameter can be one of the following values: - * @arg @ref LL_ADC_DMA_REG_REGULAR_DATA - * @arg @ref LL_ADC_DMA_REG_REGULAR_DATA_MULTI (1) - * - * (1) Available on devices with several ADC instances. - * @retval ADC register address - */ -#if defined(ADC_MULTIMODE_SUPPORT) -__STATIC_INLINE uint32_t LL_ADC_DMA_GetRegAddr(const ADC_TypeDef *ADCx, uint32_t Register) -{ - uint32_t data_reg_addr = 0UL; - - if (Register == LL_ADC_DMA_REG_REGULAR_DATA) - { - /* Retrieve address of register DR */ - data_reg_addr = (uint32_t) & (ADCx->DR); - } - else /* (Register == LL_ADC_DMA_REG_REGULAR_DATA_MULTI) */ - { - /* Retrieve address of register CDR */ - data_reg_addr = (uint32_t) & ((__LL_ADC_COMMON_INSTANCE(ADCx))->CDR); - } - - return data_reg_addr; -} -#else -__STATIC_INLINE uint32_t LL_ADC_DMA_GetRegAddr(ADC_TypeDef *ADCx, uint32_t Register) -{ - /* Prevent unused argument compilation warning */ - (void)Register; - - /* Retrieve address of register DR */ - return (uint32_t) & (ADCx->DR); -} -#endif - -/** - * @} - */ - -/** @defgroup ADC_LL_EF_Configuration_ADC_Common Configuration of ADC hierarchical scope: common to several ADC instances - * @{ - */ - -/** - * @brief Set parameter common to several ADC: Clock source and prescaler. - * @rmtoll CCR ADCPRE LL_ADC_SetCommonClock - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @param CommonClock This parameter can be one of the following values: - * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV2 - * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV4 - * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV6 - * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV8 - * @retval None - */ -__STATIC_INLINE void LL_ADC_SetCommonClock(ADC_Common_TypeDef *ADCxy_COMMON, uint32_t CommonClock) -{ - MODIFY_REG(ADCxy_COMMON->CCR, ADC_CCR_ADCPRE, CommonClock); -} - -/** - * @brief Get parameter common to several ADC: Clock source and prescaler. - * @rmtoll CCR ADCPRE LL_ADC_GetCommonClock - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV2 - * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV4 - * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV6 - * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV8 - */ -__STATIC_INLINE uint32_t LL_ADC_GetCommonClock(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (uint32_t)(READ_BIT(ADCxy_COMMON->CCR, ADC_CCR_ADCPRE)); -} - -/** - * @brief Set parameter common to several ADC: measurement path to internal - * channels (VrefInt, temperature sensor, ...). - * @note One or several values can be selected. - * Example: (LL_ADC_PATH_INTERNAL_VREFINT | - * LL_ADC_PATH_INTERNAL_TEMPSENSOR) - * @note Stabilization time of measurement path to internal channel: - * After enabling internal paths, before starting ADC conversion, - * a delay is required for internal voltage reference and - * temperature sensor stabilization time. - * Refer to device datasheet. - * Refer to literal @ref LL_ADC_DELAY_VREFINT_STAB_US. - * Refer to literal @ref LL_ADC_DELAY_TEMPSENSOR_STAB_US. - * @note ADC internal channel sampling time constraint: - * For ADC conversion of internal channels, - * a sampling time minimum value is required. - * Refer to device datasheet. - * @rmtoll CCR TSVREFE LL_ADC_SetCommonPathInternalCh\n - * CCR VBATE LL_ADC_SetCommonPathInternalCh - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @param PathInternal This parameter can be a combination of the following values: - * @arg @ref LL_ADC_PATH_INTERNAL_NONE - * @arg @ref LL_ADC_PATH_INTERNAL_VREFINT - * @arg @ref LL_ADC_PATH_INTERNAL_TEMPSENSOR - * @arg @ref LL_ADC_PATH_INTERNAL_VBAT - * @retval None - */ -__STATIC_INLINE void LL_ADC_SetCommonPathInternalCh(ADC_Common_TypeDef *ADCxy_COMMON, uint32_t PathInternal) -{ - MODIFY_REG(ADCxy_COMMON->CCR, ADC_CCR_TSVREFE | ADC_CCR_VBATE, PathInternal); -} - -/** - * @brief Get parameter common to several ADC: measurement path to internal - * channels (VrefInt, temperature sensor, ...). - * @note One or several values can be selected. - * Example: (LL_ADC_PATH_INTERNAL_VREFINT | - * LL_ADC_PATH_INTERNAL_TEMPSENSOR) - * @rmtoll CCR TSVREFE LL_ADC_GetCommonPathInternalCh\n - * CCR VBATE LL_ADC_GetCommonPathInternalCh - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval Returned value can be a combination of the following values: - * @arg @ref LL_ADC_PATH_INTERNAL_NONE - * @arg @ref LL_ADC_PATH_INTERNAL_VREFINT - * @arg @ref LL_ADC_PATH_INTERNAL_TEMPSENSOR - * @arg @ref LL_ADC_PATH_INTERNAL_VBAT - */ -__STATIC_INLINE uint32_t LL_ADC_GetCommonPathInternalCh(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (uint32_t)(READ_BIT(ADCxy_COMMON->CCR, ADC_CCR_TSVREFE | ADC_CCR_VBATE)); -} - -/** - * @} - */ - -/** @defgroup ADC_LL_EF_Configuration_ADC_Instance Configuration of ADC hierarchical scope: ADC instance - * @{ - */ - -/** - * @brief Set ADC resolution. - * Refer to reference manual for alignments formats - * dependencies to ADC resolutions. - * @rmtoll CR1 RES LL_ADC_SetResolution - * @param ADCx ADC instance - * @param Resolution This parameter can be one of the following values: - * @arg @ref LL_ADC_RESOLUTION_12B - * @arg @ref LL_ADC_RESOLUTION_10B - * @arg @ref LL_ADC_RESOLUTION_8B - * @arg @ref LL_ADC_RESOLUTION_6B - * @retval None - */ -__STATIC_INLINE void LL_ADC_SetResolution(ADC_TypeDef *ADCx, uint32_t Resolution) -{ - MODIFY_REG(ADCx->CR1, ADC_CR1_RES, Resolution); -} - -/** - * @brief Get ADC resolution. - * Refer to reference manual for alignments formats - * dependencies to ADC resolutions. - * @rmtoll CR1 RES LL_ADC_GetResolution - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_RESOLUTION_12B - * @arg @ref LL_ADC_RESOLUTION_10B - * @arg @ref LL_ADC_RESOLUTION_8B - * @arg @ref LL_ADC_RESOLUTION_6B - */ -__STATIC_INLINE uint32_t LL_ADC_GetResolution(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->CR1, ADC_CR1_RES)); -} - -/** - * @brief Set ADC conversion data alignment. - * @note Refer to reference manual for alignments formats - * dependencies to ADC resolutions. - * @rmtoll CR2 ALIGN LL_ADC_SetDataAlignment - * @param ADCx ADC instance - * @param DataAlignment This parameter can be one of the following values: - * @arg @ref LL_ADC_DATA_ALIGN_RIGHT - * @arg @ref LL_ADC_DATA_ALIGN_LEFT - * @retval None - */ -__STATIC_INLINE void LL_ADC_SetDataAlignment(ADC_TypeDef *ADCx, uint32_t DataAlignment) -{ - MODIFY_REG(ADCx->CR2, ADC_CR2_ALIGN, DataAlignment); -} - -/** - * @brief Get ADC conversion data alignment. - * @note Refer to reference manual for alignments formats - * dependencies to ADC resolutions. - * @rmtoll CR2 ALIGN LL_ADC_SetDataAlignment - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_DATA_ALIGN_RIGHT - * @arg @ref LL_ADC_DATA_ALIGN_LEFT - */ -__STATIC_INLINE uint32_t LL_ADC_GetDataAlignment(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->CR2, ADC_CR2_ALIGN)); -} - -/** - * @brief Set ADC sequencers scan mode, for all ADC groups - * (group regular, group injected). - * @note According to sequencers scan mode : - * - If disabled: ADC conversion is performed in unitary conversion - * mode (one channel converted, that defined in rank 1). - * Configuration of sequencers of all ADC groups - * (sequencer scan length, ...) is discarded: equivalent to - * scan length of 1 rank. - * - If enabled: ADC conversions are performed in sequence conversions - * mode, according to configuration of sequencers of - * each ADC group (sequencer scan length, ...). - * Refer to function @ref LL_ADC_REG_SetSequencerLength() - * and to function @ref LL_ADC_INJ_SetSequencerLength(). - * @rmtoll CR1 SCAN LL_ADC_SetSequencersScanMode - * @param ADCx ADC instance - * @param ScanMode This parameter can be one of the following values: - * @arg @ref LL_ADC_SEQ_SCAN_DISABLE - * @arg @ref LL_ADC_SEQ_SCAN_ENABLE - * @retval None - */ -__STATIC_INLINE void LL_ADC_SetSequencersScanMode(ADC_TypeDef *ADCx, uint32_t ScanMode) -{ - MODIFY_REG(ADCx->CR1, ADC_CR1_SCAN, ScanMode); -} - -/** - * @brief Get ADC sequencers scan mode, for all ADC groups - * (group regular, group injected). - * @note According to sequencers scan mode : - * - If disabled: ADC conversion is performed in unitary conversion - * mode (one channel converted, that defined in rank 1). - * Configuration of sequencers of all ADC groups - * (sequencer scan length, ...) is discarded: equivalent to - * scan length of 1 rank. - * - If enabled: ADC conversions are performed in sequence conversions - * mode, according to configuration of sequencers of - * each ADC group (sequencer scan length, ...). - * Refer to function @ref LL_ADC_REG_SetSequencerLength() - * and to function @ref LL_ADC_INJ_SetSequencerLength(). - * @rmtoll CR1 SCAN LL_ADC_GetSequencersScanMode - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_SEQ_SCAN_DISABLE - * @arg @ref LL_ADC_SEQ_SCAN_ENABLE - */ -__STATIC_INLINE uint32_t LL_ADC_GetSequencersScanMode(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->CR1, ADC_CR1_SCAN)); -} - -/** - * @} - */ - -/** @defgroup ADC_LL_EF_Configuration_ADC_Group_Regular Configuration of ADC hierarchical scope: group regular - * @{ - */ - -/** - * @brief Set ADC group regular conversion trigger source: - * internal (SW start) or from external IP (timer event, - * external interrupt line). - * @note On this STM32 series, setting of external trigger edge is performed - * using function @ref LL_ADC_REG_StartConversionExtTrig(). - * @note Availability of parameters of trigger sources from timer - * depends on timers availability on the selected device. - * @rmtoll CR2 EXTSEL LL_ADC_REG_SetTriggerSource\n - * CR2 EXTEN LL_ADC_REG_SetTriggerSource - * @param ADCx ADC instance - * @param TriggerSource This parameter can be one of the following values: - * @arg @ref LL_ADC_REG_TRIG_SOFTWARE - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM1_CH1 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM1_CH2 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM1_CH3 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_CH2 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_CH3 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_CH4 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_TRGO - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM3_CH1 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM3_TRGO - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM4_CH4 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM5_CH1 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM5_CH2 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM5_CH3 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM8_CH1 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM8_TRGO - * @arg @ref LL_ADC_REG_TRIG_EXT_EXTI_LINE11 - * @retval None - */ -__STATIC_INLINE void LL_ADC_REG_SetTriggerSource(ADC_TypeDef *ADCx, uint32_t TriggerSource) -{ - /* Note: On this STM32 series, ADC group regular external trigger edge */ - /* is used to perform a ADC conversion start. */ - /* This function does not set external trigger edge. */ - /* This feature is set using function */ - /* @ref LL_ADC_REG_StartConversionExtTrig(). */ - MODIFY_REG(ADCx->CR2, ADC_CR2_EXTSEL, (TriggerSource & ADC_CR2_EXTSEL)); -} - -/** - * @brief Get ADC group regular conversion trigger source: - * internal (SW start) or from external IP (timer event, - * external interrupt line). - * @note To determine whether group regular trigger source is - * internal (SW start) or external, without detail - * of which peripheral is selected as external trigger, - * (equivalent to - * "if(LL_ADC_REG_GetTriggerSource(ADC1) == LL_ADC_REG_TRIG_SOFTWARE)") - * use function @ref LL_ADC_REG_IsTriggerSourceSWStart. - * @note Availability of parameters of trigger sources from timer - * depends on timers availability on the selected device. - * @rmtoll CR2 EXTSEL LL_ADC_REG_GetTriggerSource\n - * CR2 EXTEN LL_ADC_REG_GetTriggerSource - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_REG_TRIG_SOFTWARE - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM1_CH1 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM1_CH2 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM1_CH3 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_CH2 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_CH3 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_CH4 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_TRGO - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM3_CH1 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM3_TRGO - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM4_CH4 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM5_CH1 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM5_CH2 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM5_CH3 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM8_CH1 - * @arg @ref LL_ADC_REG_TRIG_EXT_TIM8_TRGO - * @arg @ref LL_ADC_REG_TRIG_EXT_EXTI_LINE11 - */ -__STATIC_INLINE uint32_t LL_ADC_REG_GetTriggerSource(const ADC_TypeDef *ADCx) -{ - uint32_t TriggerSource = READ_BIT(ADCx->CR2, ADC_CR2_EXTSEL | ADC_CR2_EXTEN); - - /* Value for shift of {0; 4; 8; 12} depending on value of bitfield */ - /* corresponding to ADC_CR2_EXTEN {0; 1; 2; 3}. */ - uint32_t ShiftExten = ((TriggerSource & ADC_CR2_EXTEN) >> (ADC_REG_TRIG_EXTEN_BITOFFSET_POS - 2UL)); - - /* Set bitfield corresponding to ADC_CR2_EXTEN and ADC_CR2_EXTSEL */ - /* to match with triggers literals definition. */ - return ((TriggerSource - & (ADC_REG_TRIG_SOURCE_MASK << ShiftExten) & ADC_CR2_EXTSEL) - | ((ADC_REG_TRIG_EDGE_MASK << ShiftExten) & ADC_CR2_EXTEN) - ); -} - -/** - * @brief Get ADC group regular conversion trigger source internal (SW start) - or external. - * @note In case of group regular trigger source set to external trigger, - * to determine which peripheral is selected as external trigger, - * use function @ref LL_ADC_REG_GetTriggerSource(). - * @rmtoll CR2 EXTEN LL_ADC_REG_IsTriggerSourceSWStart - * @param ADCx ADC instance - * @retval Value "0" if trigger source external trigger - * Value "1" if trigger source SW start. - */ -__STATIC_INLINE uint32_t LL_ADC_REG_IsTriggerSourceSWStart(const ADC_TypeDef *ADCx) -{ - return (READ_BIT(ADCx->CR2, ADC_CR2_EXTEN) == (LL_ADC_REG_TRIG_SOFTWARE & ADC_CR2_EXTEN)); -} - -/** - * @brief Get ADC group regular conversion trigger polarity. - * @note Applicable only for trigger source set to external trigger. - * @note On this STM32 series, setting of external trigger edge is performed - * using function @ref LL_ADC_REG_StartConversionExtTrig(). - * @rmtoll CR2 EXTEN LL_ADC_REG_GetTriggerEdge - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_REG_TRIG_EXT_RISING - * @arg @ref LL_ADC_REG_TRIG_EXT_FALLING - * @arg @ref LL_ADC_REG_TRIG_EXT_RISINGFALLING - */ -__STATIC_INLINE uint32_t LL_ADC_REG_GetTriggerEdge(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->CR2, ADC_CR2_EXTEN)); -} - - -/** - * @brief Set ADC group regular sequencer length and scan direction. - * @note Description of ADC group regular sequencer features: - * - For devices with sequencer fully configurable - * (function "LL_ADC_REG_SetSequencerRanks()" available): - * sequencer length and each rank affectation to a channel - * are configurable. - * This function performs configuration of: - * - Sequence length: Number of ranks in the scan sequence. - * - Sequence direction: Unless specified in parameters, sequencer - * scan direction is forward (from rank 1 to rank n). - * Sequencer ranks are selected using - * function "LL_ADC_REG_SetSequencerRanks()". - * - For devices with sequencer not fully configurable - * (function "LL_ADC_REG_SetSequencerChannels()" available): - * sequencer length and each rank affectation to a channel - * are defined by channel number. - * This function performs configuration of: - * - Sequence length: Number of ranks in the scan sequence is - * defined by number of channels set in the sequence, - * rank of each channel is fixed by channel HW number. - * (channel 0 fixed on rank 0, channel 1 fixed on rank1, ...). - * - Sequence direction: Unless specified in parameters, sequencer - * scan direction is forward (from lowest channel number to - * highest channel number). - * Sequencer ranks are selected using - * function "LL_ADC_REG_SetSequencerChannels()". - * @note On this STM32 series, group regular sequencer configuration - * is conditioned to ADC instance sequencer mode. - * If ADC instance sequencer mode is disabled, sequencers of - * all groups (group regular, group injected) can be configured - * but their execution is disabled (limited to rank 1). - * Refer to function @ref LL_ADC_SetSequencersScanMode(). - * @note Sequencer disabled is equivalent to sequencer of 1 rank: - * ADC conversion on only 1 channel. - * @rmtoll SQR1 L LL_ADC_REG_SetSequencerLength - * @param ADCx ADC instance - * @param SequencerNbRanks This parameter can be one of the following values: - * @arg @ref LL_ADC_REG_SEQ_SCAN_DISABLE - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS - * @retval None - */ -__STATIC_INLINE void LL_ADC_REG_SetSequencerLength(ADC_TypeDef *ADCx, uint32_t SequencerNbRanks) -{ - MODIFY_REG(ADCx->SQR1, ADC_SQR1_L, SequencerNbRanks); -} - -/** - * @brief Get ADC group regular sequencer length and scan direction. - * @note Description of ADC group regular sequencer features: - * - For devices with sequencer fully configurable - * (function "LL_ADC_REG_SetSequencerRanks()" available): - * sequencer length and each rank affectation to a channel - * are configurable. - * This function retrieves: - * - Sequence length: Number of ranks in the scan sequence. - * - Sequence direction: Unless specified in parameters, sequencer - * scan direction is forward (from rank 1 to rank n). - * Sequencer ranks are selected using - * function "LL_ADC_REG_SetSequencerRanks()". - * - For devices with sequencer not fully configurable - * (function "LL_ADC_REG_SetSequencerChannels()" available): - * sequencer length and each rank affectation to a channel - * are defined by channel number. - * This function retrieves: - * - Sequence length: Number of ranks in the scan sequence is - * defined by number of channels set in the sequence, - * rank of each channel is fixed by channel HW number. - * (channel 0 fixed on rank 0, channel 1 fixed on rank1, ...). - * - Sequence direction: Unless specified in parameters, sequencer - * scan direction is forward (from lowest channel number to - * highest channel number). - * Sequencer ranks are selected using - * function "LL_ADC_REG_SetSequencerChannels()". - * @note On this STM32 series, group regular sequencer configuration - * is conditioned to ADC instance sequencer mode. - * If ADC instance sequencer mode is disabled, sequencers of - * all groups (group regular, group injected) can be configured - * but their execution is disabled (limited to rank 1). - * Refer to function @ref LL_ADC_SetSequencersScanMode(). - * @note Sequencer disabled is equivalent to sequencer of 1 rank: - * ADC conversion on only 1 channel. - * @rmtoll SQR1 L LL_ADC_REG_SetSequencerLength - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_REG_SEQ_SCAN_DISABLE - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS - * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS - */ -__STATIC_INLINE uint32_t LL_ADC_REG_GetSequencerLength(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->SQR1, ADC_SQR1_L)); -} - -/** - * @brief Set ADC group regular sequencer discontinuous mode: - * sequence subdivided and scan conversions interrupted every selected - * number of ranks. - * @note It is not possible to enable both ADC group regular - * continuous mode and sequencer discontinuous mode. - * @note It is not possible to enable both ADC auto-injected mode - * and ADC group regular sequencer discontinuous mode. - * @rmtoll CR1 DISCEN LL_ADC_REG_SetSequencerDiscont\n - * CR1 DISCNUM LL_ADC_REG_SetSequencerDiscont - * @param ADCx ADC instance - * @param SeqDiscont This parameter can be one of the following values: - * @arg @ref LL_ADC_REG_SEQ_DISCONT_DISABLE - * @arg @ref LL_ADC_REG_SEQ_DISCONT_1RANK - * @arg @ref LL_ADC_REG_SEQ_DISCONT_2RANKS - * @arg @ref LL_ADC_REG_SEQ_DISCONT_3RANKS - * @arg @ref LL_ADC_REG_SEQ_DISCONT_4RANKS - * @arg @ref LL_ADC_REG_SEQ_DISCONT_5RANKS - * @arg @ref LL_ADC_REG_SEQ_DISCONT_6RANKS - * @arg @ref LL_ADC_REG_SEQ_DISCONT_7RANKS - * @arg @ref LL_ADC_REG_SEQ_DISCONT_8RANKS - * @retval None - */ -__STATIC_INLINE void LL_ADC_REG_SetSequencerDiscont(ADC_TypeDef *ADCx, uint32_t SeqDiscont) -{ - MODIFY_REG(ADCx->CR1, ADC_CR1_DISCEN | ADC_CR1_DISCNUM, SeqDiscont); -} - -/** - * @brief Get ADC group regular sequencer discontinuous mode: - * sequence subdivided and scan conversions interrupted every selected - * number of ranks. - * @rmtoll CR1 DISCEN LL_ADC_REG_GetSequencerDiscont\n - * CR1 DISCNUM LL_ADC_REG_GetSequencerDiscont - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_REG_SEQ_DISCONT_DISABLE - * @arg @ref LL_ADC_REG_SEQ_DISCONT_1RANK - * @arg @ref LL_ADC_REG_SEQ_DISCONT_2RANKS - * @arg @ref LL_ADC_REG_SEQ_DISCONT_3RANKS - * @arg @ref LL_ADC_REG_SEQ_DISCONT_4RANKS - * @arg @ref LL_ADC_REG_SEQ_DISCONT_5RANKS - * @arg @ref LL_ADC_REG_SEQ_DISCONT_6RANKS - * @arg @ref LL_ADC_REG_SEQ_DISCONT_7RANKS - * @arg @ref LL_ADC_REG_SEQ_DISCONT_8RANKS - */ -__STATIC_INLINE uint32_t LL_ADC_REG_GetSequencerDiscont(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->CR1, ADC_CR1_DISCEN | ADC_CR1_DISCNUM)); -} - -/** - * @brief Set ADC group regular sequence: channel on the selected - * scan sequence rank. - * @note This function performs configuration of: - * - Channels ordering into each rank of scan sequence: - * whatever channel can be placed into whatever rank. - * @note On this STM32 series, ADC group regular sequencer is - * fully configurable: sequencer length and each rank - * affectation to a channel are configurable. - * Refer to description of function @ref LL_ADC_REG_SetSequencerLength(). - * @note Depending on devices and packages, some channels may not be available. - * Refer to device datasheet for channels availability. - * @note On this STM32 series, to measure internal channels (VrefInt, - * TempSensor, ...), measurement paths to internal channels must be - * enabled separately. - * This can be done using function @ref LL_ADC_SetCommonPathInternalCh(). - * @rmtoll SQR3 SQ1 LL_ADC_REG_SetSequencerRanks\n - * SQR3 SQ2 LL_ADC_REG_SetSequencerRanks\n - * SQR3 SQ3 LL_ADC_REG_SetSequencerRanks\n - * SQR3 SQ4 LL_ADC_REG_SetSequencerRanks\n - * SQR3 SQ5 LL_ADC_REG_SetSequencerRanks\n - * SQR3 SQ6 LL_ADC_REG_SetSequencerRanks\n - * SQR2 SQ7 LL_ADC_REG_SetSequencerRanks\n - * SQR2 SQ8 LL_ADC_REG_SetSequencerRanks\n - * SQR2 SQ9 LL_ADC_REG_SetSequencerRanks\n - * SQR2 SQ10 LL_ADC_REG_SetSequencerRanks\n - * SQR2 SQ11 LL_ADC_REG_SetSequencerRanks\n - * SQR2 SQ12 LL_ADC_REG_SetSequencerRanks\n - * SQR1 SQ13 LL_ADC_REG_SetSequencerRanks\n - * SQR1 SQ14 LL_ADC_REG_SetSequencerRanks\n - * SQR1 SQ15 LL_ADC_REG_SetSequencerRanks\n - * SQR1 SQ16 LL_ADC_REG_SetSequencerRanks - * @param ADCx ADC instance - * @param Rank This parameter can be one of the following values: - * @arg @ref LL_ADC_REG_RANK_1 - * @arg @ref LL_ADC_REG_RANK_2 - * @arg @ref LL_ADC_REG_RANK_3 - * @arg @ref LL_ADC_REG_RANK_4 - * @arg @ref LL_ADC_REG_RANK_5 - * @arg @ref LL_ADC_REG_RANK_6 - * @arg @ref LL_ADC_REG_RANK_7 - * @arg @ref LL_ADC_REG_RANK_8 - * @arg @ref LL_ADC_REG_RANK_9 - * @arg @ref LL_ADC_REG_RANK_10 - * @arg @ref LL_ADC_REG_RANK_11 - * @arg @ref LL_ADC_REG_RANK_12 - * @arg @ref LL_ADC_REG_RANK_13 - * @arg @ref LL_ADC_REG_RANK_14 - * @arg @ref LL_ADC_REG_RANK_15 - * @arg @ref LL_ADC_REG_RANK_16 - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_ADC_CHANNEL_0 - * @arg @ref LL_ADC_CHANNEL_1 - * @arg @ref LL_ADC_CHANNEL_2 - * @arg @ref LL_ADC_CHANNEL_3 - * @arg @ref LL_ADC_CHANNEL_4 - * @arg @ref LL_ADC_CHANNEL_5 - * @arg @ref LL_ADC_CHANNEL_6 - * @arg @ref LL_ADC_CHANNEL_7 - * @arg @ref LL_ADC_CHANNEL_8 - * @arg @ref LL_ADC_CHANNEL_9 - * @arg @ref LL_ADC_CHANNEL_10 - * @arg @ref LL_ADC_CHANNEL_11 - * @arg @ref LL_ADC_CHANNEL_12 - * @arg @ref LL_ADC_CHANNEL_13 - * @arg @ref LL_ADC_CHANNEL_14 - * @arg @ref LL_ADC_CHANNEL_15 - * @arg @ref LL_ADC_CHANNEL_16 - * @arg @ref LL_ADC_CHANNEL_17 - * @arg @ref LL_ADC_CHANNEL_18 - * @arg @ref LL_ADC_CHANNEL_VREFINT (1) - * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) - * @arg @ref LL_ADC_CHANNEL_VBAT (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. - * @retval None - */ -__STATIC_INLINE void LL_ADC_REG_SetSequencerRanks(ADC_TypeDef *ADCx, uint32_t Rank, uint32_t Channel) -{ - /* Set bits with content of parameter "Channel" with bits position */ - /* in register and register position depending on parameter "Rank". */ - /* Parameters "Rank" and "Channel" are used with masks because containing */ - /* other bits reserved for other purpose. */ - __IO uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->SQR1, __ADC_MASK_SHIFT(Rank, ADC_REG_SQRX_REGOFFSET_MASK)); - - MODIFY_REG(*preg, - ADC_CHANNEL_ID_NUMBER_MASK << (Rank & ADC_REG_RANK_ID_SQRX_MASK), - (Channel & ADC_CHANNEL_ID_NUMBER_MASK) << (Rank & ADC_REG_RANK_ID_SQRX_MASK)); -} - -/** - * @brief Get ADC group regular sequence: channel on the selected - * scan sequence rank. - * @note On this STM32 series, ADC group regular sequencer is - * fully configurable: sequencer length and each rank - * affectation to a channel are configurable. - * Refer to description of function @ref LL_ADC_REG_SetSequencerLength(). - * @note Depending on devices and packages, some channels may not be available. - * Refer to device datasheet for channels availability. - * @note Usage of the returned channel number: - * - To reinject this channel into another function LL_ADC_xxx: - * the returned channel number is only partly formatted on definition - * of literals LL_ADC_CHANNEL_x. Therefore, it has to be compared - * with parts of literals LL_ADC_CHANNEL_x or using - * helper macro @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB(). - * Then the selected literal LL_ADC_CHANNEL_x can be used - * as parameter for another function. - * - To get the channel number in decimal format: - * process the returned value with the helper macro - * @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB(). - * @rmtoll SQR3 SQ1 LL_ADC_REG_GetSequencerRanks\n - * SQR3 SQ2 LL_ADC_REG_GetSequencerRanks\n - * SQR3 SQ3 LL_ADC_REG_GetSequencerRanks\n - * SQR3 SQ4 LL_ADC_REG_GetSequencerRanks\n - * SQR3 SQ5 LL_ADC_REG_GetSequencerRanks\n - * SQR3 SQ6 LL_ADC_REG_GetSequencerRanks\n - * SQR2 SQ7 LL_ADC_REG_GetSequencerRanks\n - * SQR2 SQ8 LL_ADC_REG_GetSequencerRanks\n - * SQR2 SQ9 LL_ADC_REG_GetSequencerRanks\n - * SQR2 SQ10 LL_ADC_REG_GetSequencerRanks\n - * SQR2 SQ11 LL_ADC_REG_GetSequencerRanks\n - * SQR2 SQ12 LL_ADC_REG_GetSequencerRanks\n - * SQR1 SQ13 LL_ADC_REG_GetSequencerRanks\n - * SQR1 SQ14 LL_ADC_REG_GetSequencerRanks\n - * SQR1 SQ15 LL_ADC_REG_GetSequencerRanks\n - * SQR1 SQ16 LL_ADC_REG_GetSequencerRanks - * @param ADCx ADC instance - * @param Rank This parameter can be one of the following values: - * @arg @ref LL_ADC_REG_RANK_1 - * @arg @ref LL_ADC_REG_RANK_2 - * @arg @ref LL_ADC_REG_RANK_3 - * @arg @ref LL_ADC_REG_RANK_4 - * @arg @ref LL_ADC_REG_RANK_5 - * @arg @ref LL_ADC_REG_RANK_6 - * @arg @ref LL_ADC_REG_RANK_7 - * @arg @ref LL_ADC_REG_RANK_8 - * @arg @ref LL_ADC_REG_RANK_9 - * @arg @ref LL_ADC_REG_RANK_10 - * @arg @ref LL_ADC_REG_RANK_11 - * @arg @ref LL_ADC_REG_RANK_12 - * @arg @ref LL_ADC_REG_RANK_13 - * @arg @ref LL_ADC_REG_RANK_14 - * @arg @ref LL_ADC_REG_RANK_15 - * @arg @ref LL_ADC_REG_RANK_16 - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_CHANNEL_0 - * @arg @ref LL_ADC_CHANNEL_1 - * @arg @ref LL_ADC_CHANNEL_2 - * @arg @ref LL_ADC_CHANNEL_3 - * @arg @ref LL_ADC_CHANNEL_4 - * @arg @ref LL_ADC_CHANNEL_5 - * @arg @ref LL_ADC_CHANNEL_6 - * @arg @ref LL_ADC_CHANNEL_7 - * @arg @ref LL_ADC_CHANNEL_8 - * @arg @ref LL_ADC_CHANNEL_9 - * @arg @ref LL_ADC_CHANNEL_10 - * @arg @ref LL_ADC_CHANNEL_11 - * @arg @ref LL_ADC_CHANNEL_12 - * @arg @ref LL_ADC_CHANNEL_13 - * @arg @ref LL_ADC_CHANNEL_14 - * @arg @ref LL_ADC_CHANNEL_15 - * @arg @ref LL_ADC_CHANNEL_16 - * @arg @ref LL_ADC_CHANNEL_17 - * @arg @ref LL_ADC_CHANNEL_18 - * @arg @ref LL_ADC_CHANNEL_VREFINT (1) - * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) - * @arg @ref LL_ADC_CHANNEL_VBAT (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled.\n - * (1) For ADC channel read back from ADC register, - * comparison with internal channel parameter to be done - * using helper macro @ref __LL_ADC_CHANNEL_INTERNAL_TO_EXTERNAL(). - */ -__STATIC_INLINE uint32_t LL_ADC_REG_GetSequencerRanks(const ADC_TypeDef *ADCx, uint32_t Rank) -{ - __IO uint32_t const *preg = __ADC_PTR_REG_OFFSET(ADCx->SQR1, __ADC_MASK_SHIFT(Rank, ADC_REG_SQRX_REGOFFSET_MASK)); - - return (uint32_t)(READ_BIT(*preg, - ADC_CHANNEL_ID_NUMBER_MASK << (Rank & ADC_REG_RANK_ID_SQRX_MASK)) - >> (Rank & ADC_REG_RANK_ID_SQRX_MASK) - ); -} - -/** - * @brief Set ADC continuous conversion mode on ADC group regular. - * @note Description of ADC continuous conversion mode: - * - single mode: one conversion per trigger - * - continuous mode: after the first trigger, following - * conversions launched successively automatically. - * @note It is not possible to enable both ADC group regular - * continuous mode and sequencer discontinuous mode. - * @rmtoll CR2 CONT LL_ADC_REG_SetContinuousMode - * @param ADCx ADC instance - * @param Continuous This parameter can be one of the following values: - * @arg @ref LL_ADC_REG_CONV_SINGLE - * @arg @ref LL_ADC_REG_CONV_CONTINUOUS - * @retval None - */ -__STATIC_INLINE void LL_ADC_REG_SetContinuousMode(ADC_TypeDef *ADCx, uint32_t Continuous) -{ - MODIFY_REG(ADCx->CR2, ADC_CR2_CONT, Continuous); -} - -/** - * @brief Get ADC continuous conversion mode on ADC group regular. - * @note Description of ADC continuous conversion mode: - * - single mode: one conversion per trigger - * - continuous mode: after the first trigger, following - * conversions launched successively automatically. - * @rmtoll CR2 CONT LL_ADC_REG_GetContinuousMode - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_REG_CONV_SINGLE - * @arg @ref LL_ADC_REG_CONV_CONTINUOUS - */ -__STATIC_INLINE uint32_t LL_ADC_REG_GetContinuousMode(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->CR2, ADC_CR2_CONT)); -} - -/** - * @brief Set ADC group regular conversion data transfer: no transfer or - * transfer by DMA, and DMA requests mode. - * @note If transfer by DMA selected, specifies the DMA requests - * mode: - * - Limited mode (One shot mode): DMA transfer requests are stopped - * when number of DMA data transfers (number of - * ADC conversions) is reached. - * This ADC mode is intended to be used with DMA mode non-circular. - * - Unlimited mode: DMA transfer requests are unlimited, - * whatever number of DMA data transfers (number of - * ADC conversions). - * This ADC mode is intended to be used with DMA mode circular. - * @note If ADC DMA requests mode is set to unlimited and DMA is set to - * mode non-circular: - * when DMA transfers size will be reached, DMA will stop transfers of - * ADC conversions data ADC will raise an overrun error - * (overrun flag and interruption if enabled). - * @note For devices with several ADC instances: ADC multimode DMA - * settings are available using function @ref LL_ADC_SetMultiDMATransfer(). - * @note To configure DMA source address (peripheral address), - * use function @ref LL_ADC_DMA_GetRegAddr(). - * @rmtoll CR2 DMA LL_ADC_REG_SetDMATransfer\n - * CR2 DDS LL_ADC_REG_SetDMATransfer - * @param ADCx ADC instance - * @param DMATransfer This parameter can be one of the following values: - * @arg @ref LL_ADC_REG_DMA_TRANSFER_NONE - * @arg @ref LL_ADC_REG_DMA_TRANSFER_LIMITED - * @arg @ref LL_ADC_REG_DMA_TRANSFER_UNLIMITED - * @retval None - */ -__STATIC_INLINE void LL_ADC_REG_SetDMATransfer(ADC_TypeDef *ADCx, uint32_t DMATransfer) -{ - MODIFY_REG(ADCx->CR2, ADC_CR2_DMA | ADC_CR2_DDS, DMATransfer); -} - -/** - * @brief Get ADC group regular conversion data transfer: no transfer or - * transfer by DMA, and DMA requests mode. - * @note If transfer by DMA selected, specifies the DMA requests - * mode: - * - Limited mode (One shot mode): DMA transfer requests are stopped - * when number of DMA data transfers (number of - * ADC conversions) is reached. - * This ADC mode is intended to be used with DMA mode non-circular. - * - Unlimited mode: DMA transfer requests are unlimited, - * whatever number of DMA data transfers (number of - * ADC conversions). - * This ADC mode is intended to be used with DMA mode circular. - * @note If ADC DMA requests mode is set to unlimited and DMA is set to - * mode non-circular: - * when DMA transfers size will be reached, DMA will stop transfers of - * ADC conversions data ADC will raise an overrun error - * (overrun flag and interruption if enabled). - * @note For devices with several ADC instances: ADC multimode DMA - * settings are available using function @ref LL_ADC_GetMultiDMATransfer(). - * @note To configure DMA source address (peripheral address), - * use function @ref LL_ADC_DMA_GetRegAddr(). - * @rmtoll CR2 DMA LL_ADC_REG_GetDMATransfer\n - * CR2 DDS LL_ADC_REG_GetDMATransfer - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_REG_DMA_TRANSFER_NONE - * @arg @ref LL_ADC_REG_DMA_TRANSFER_LIMITED - * @arg @ref LL_ADC_REG_DMA_TRANSFER_UNLIMITED - */ -__STATIC_INLINE uint32_t LL_ADC_REG_GetDMATransfer(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->CR2, ADC_CR2_DMA | ADC_CR2_DDS)); -} - -/** - * @brief Specify which ADC flag between EOC (end of unitary conversion) - * or EOS (end of sequence conversions) is used to indicate - * the end of conversion. - * @note This feature is aimed to be set when using ADC with - * programming model by polling or interruption - * (programming model by DMA usually uses DMA interruptions - * to indicate end of conversion and data transfer). - * @note For ADC group injected, end of conversion (flag&IT) is raised - * only at the end of the sequence. - * @rmtoll CR2 EOCS LL_ADC_REG_SetFlagEndOfConversion - * @param ADCx ADC instance - * @param EocSelection This parameter can be one of the following values: - * @arg @ref LL_ADC_REG_FLAG_EOC_SEQUENCE_CONV - * @arg @ref LL_ADC_REG_FLAG_EOC_UNITARY_CONV - * @retval None - */ -__STATIC_INLINE void LL_ADC_REG_SetFlagEndOfConversion(ADC_TypeDef *ADCx, uint32_t EocSelection) -{ - MODIFY_REG(ADCx->CR2, ADC_CR2_EOCS, EocSelection); -} - -/** - * @brief Get which ADC flag between EOC (end of unitary conversion) - * or EOS (end of sequence conversions) is used to indicate - * the end of conversion. - * @rmtoll CR2 EOCS LL_ADC_REG_GetFlagEndOfConversion - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_REG_FLAG_EOC_SEQUENCE_CONV - * @arg @ref LL_ADC_REG_FLAG_EOC_UNITARY_CONV - */ -__STATIC_INLINE uint32_t LL_ADC_REG_GetFlagEndOfConversion(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->CR2, ADC_CR2_EOCS)); -} - -/** - * @} - */ - -/** @defgroup ADC_LL_EF_Configuration_ADC_Group_Injected Configuration of ADC hierarchical scope: group injected - * @{ - */ - -/** - * @brief Set ADC group injected conversion trigger source: - * internal (SW start) or from external IP (timer event, - * external interrupt line). - * @note On this STM32 series, setting of external trigger edge is performed - * using function @ref LL_ADC_INJ_StartConversionExtTrig(). - * @note Availability of parameters of trigger sources from timer - * depends on timers availability on the selected device. - * @rmtoll CR2 JEXTSEL LL_ADC_INJ_SetTriggerSource\n - * CR2 JEXTEN LL_ADC_INJ_SetTriggerSource - * @param ADCx ADC instance - * @param TriggerSource This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_TRIG_SOFTWARE - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM1_CH4 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM1_TRGO - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM2_CH1 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM2_TRGO - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM3_CH2 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM3_CH4 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_CH1 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_CH2 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_CH3 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_TRGO - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM5_CH4 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM5_TRGO - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM8_CH2 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM8_CH3 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM8_CH4 - * @arg @ref LL_ADC_INJ_TRIG_EXT_EXTI_LINE15 - * @retval None - */ -__STATIC_INLINE void LL_ADC_INJ_SetTriggerSource(ADC_TypeDef *ADCx, uint32_t TriggerSource) -{ - /* Note: On this STM32 series, ADC group injected external trigger edge */ - /* is used to perform a ADC conversion start. */ - /* This function does not set external trigger edge. */ - /* This feature is set using function */ - /* @ref LL_ADC_INJ_StartConversionExtTrig(). */ - MODIFY_REG(ADCx->CR2, ADC_CR2_JEXTSEL, (TriggerSource & ADC_CR2_JEXTSEL)); -} - -/** - * @brief Get ADC group injected conversion trigger source: - * internal (SW start) or from external IP (timer event, - * external interrupt line). - * @note To determine whether group injected trigger source is - * internal (SW start) or external, without detail - * of which peripheral is selected as external trigger, - * (equivalent to - * "if(LL_ADC_INJ_GetTriggerSource(ADC1) == LL_ADC_INJ_TRIG_SOFTWARE)") - * use function @ref LL_ADC_INJ_IsTriggerSourceSWStart. - * @note Availability of parameters of trigger sources from timer - * depends on timers availability on the selected device. - * @rmtoll CR2 JEXTSEL LL_ADC_INJ_GetTriggerSource\n - * CR2 JEXTEN LL_ADC_INJ_GetTriggerSource - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_INJ_TRIG_SOFTWARE - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM1_CH4 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM1_TRGO - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM2_CH1 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM2_TRGO - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM3_CH2 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM3_CH4 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_CH1 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_CH2 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_CH3 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_TRGO - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM5_CH4 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM5_TRGO - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM8_CH2 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM8_CH3 - * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM8_CH4 - * @arg @ref LL_ADC_INJ_TRIG_EXT_EXTI_LINE15 - */ -__STATIC_INLINE uint32_t LL_ADC_INJ_GetTriggerSource(const ADC_TypeDef *ADCx) -{ - uint32_t TriggerSource = READ_BIT(ADCx->CR2, ADC_CR2_JEXTSEL | ADC_CR2_JEXTEN); - - /* Value for shift of {0; 4; 8; 12} depending on value of bitfield */ - /* corresponding to ADC_CR2_JEXTEN {0; 1; 2; 3}. */ - uint32_t ShiftExten = ((TriggerSource & ADC_CR2_JEXTEN) >> (ADC_INJ_TRIG_EXTEN_BITOFFSET_POS - 2UL)); - - /* Set bitfield corresponding to ADC_CR2_JEXTEN and ADC_CR2_JEXTSEL */ - /* to match with triggers literals definition. */ - return ((TriggerSource - & (ADC_INJ_TRIG_SOURCE_MASK << ShiftExten) & ADC_CR2_JEXTSEL) - | ((ADC_INJ_TRIG_EDGE_MASK << ShiftExten) & ADC_CR2_JEXTEN) - ); -} - -/** - * @brief Get ADC group injected conversion trigger source internal (SW start) - or external - * @note In case of group injected trigger source set to external trigger, - * to determine which peripheral is selected as external trigger, - * use function @ref LL_ADC_INJ_GetTriggerSource. - * @rmtoll CR2 JEXTEN LL_ADC_INJ_IsTriggerSourceSWStart - * @param ADCx ADC instance - * @retval Value "0" if trigger source external trigger - * Value "1" if trigger source SW start. - */ -__STATIC_INLINE uint32_t LL_ADC_INJ_IsTriggerSourceSWStart(const ADC_TypeDef *ADCx) -{ - return (READ_BIT(ADCx->CR2, ADC_CR2_JEXTEN) == (LL_ADC_INJ_TRIG_SOFTWARE & ADC_CR2_JEXTEN)); -} - -/** - * @brief Get ADC group injected conversion trigger polarity. - * Applicable only for trigger source set to external trigger. - * @rmtoll CR2 JEXTEN LL_ADC_INJ_GetTriggerEdge - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_INJ_TRIG_EXT_RISING - * @arg @ref LL_ADC_INJ_TRIG_EXT_FALLING - * @arg @ref LL_ADC_INJ_TRIG_EXT_RISINGFALLING - */ -__STATIC_INLINE uint32_t LL_ADC_INJ_GetTriggerEdge(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->CR2, ADC_CR2_JEXTEN)); -} - -/** - * @brief Set ADC group injected sequencer length and scan direction. - * @note This function performs configuration of: - * - Sequence length: Number of ranks in the scan sequence. - * - Sequence direction: Unless specified in parameters, sequencer - * scan direction is forward (from rank 1 to rank n). - * @note On this STM32 series, group injected sequencer configuration - * is conditioned to ADC instance sequencer mode. - * If ADC instance sequencer mode is disabled, sequencers of - * all groups (group regular, group injected) can be configured - * but their execution is disabled (limited to rank 1). - * Refer to function @ref LL_ADC_SetSequencersScanMode(). - * @note Sequencer disabled is equivalent to sequencer of 1 rank: - * ADC conversion on only 1 channel. - * @rmtoll JSQR JL LL_ADC_INJ_SetSequencerLength - * @param ADCx ADC instance - * @param SequencerNbRanks This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_SEQ_SCAN_DISABLE - * @arg @ref LL_ADC_INJ_SEQ_SCAN_ENABLE_2RANKS - * @arg @ref LL_ADC_INJ_SEQ_SCAN_ENABLE_3RANKS - * @arg @ref LL_ADC_INJ_SEQ_SCAN_ENABLE_4RANKS - * @retval None - */ -__STATIC_INLINE void LL_ADC_INJ_SetSequencerLength(ADC_TypeDef *ADCx, uint32_t SequencerNbRanks) -{ - MODIFY_REG(ADCx->JSQR, ADC_JSQR_JL, SequencerNbRanks); -} - -/** - * @brief Get ADC group injected sequencer length and scan direction. - * @note This function retrieves: - * - Sequence length: Number of ranks in the scan sequence. - * - Sequence direction: Unless specified in parameters, sequencer - * scan direction is forward (from rank 1 to rank n). - * @note On this STM32 series, group injected sequencer configuration - * is conditioned to ADC instance sequencer mode. - * If ADC instance sequencer mode is disabled, sequencers of - * all groups (group regular, group injected) can be configured - * but their execution is disabled (limited to rank 1). - * Refer to function @ref LL_ADC_SetSequencersScanMode(). - * @note Sequencer disabled is equivalent to sequencer of 1 rank: - * ADC conversion on only 1 channel. - * @rmtoll JSQR JL LL_ADC_INJ_GetSequencerLength - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_INJ_SEQ_SCAN_DISABLE - * @arg @ref LL_ADC_INJ_SEQ_SCAN_ENABLE_2RANKS - * @arg @ref LL_ADC_INJ_SEQ_SCAN_ENABLE_3RANKS - * @arg @ref LL_ADC_INJ_SEQ_SCAN_ENABLE_4RANKS - */ -__STATIC_INLINE uint32_t LL_ADC_INJ_GetSequencerLength(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->JSQR, ADC_JSQR_JL)); -} - -/** - * @brief Set ADC group injected sequencer discontinuous mode: - * sequence subdivided and scan conversions interrupted every selected - * number of ranks. - * @note It is not possible to enable both ADC group injected - * auto-injected mode and sequencer discontinuous mode. - * @rmtoll CR1 DISCEN LL_ADC_INJ_SetSequencerDiscont - * @param ADCx ADC instance - * @param SeqDiscont This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_SEQ_DISCONT_DISABLE - * @arg @ref LL_ADC_INJ_SEQ_DISCONT_1RANK - * @retval None - */ -__STATIC_INLINE void LL_ADC_INJ_SetSequencerDiscont(ADC_TypeDef *ADCx, uint32_t SeqDiscont) -{ - MODIFY_REG(ADCx->CR1, ADC_CR1_JDISCEN, SeqDiscont); -} - -/** - * @brief Get ADC group injected sequencer discontinuous mode: - * sequence subdivided and scan conversions interrupted every selected - * number of ranks. - * @rmtoll CR1 DISCEN LL_ADC_REG_GetSequencerDiscont - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_INJ_SEQ_DISCONT_DISABLE - * @arg @ref LL_ADC_INJ_SEQ_DISCONT_1RANK - */ -__STATIC_INLINE uint32_t LL_ADC_INJ_GetSequencerDiscont(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->CR1, ADC_CR1_JDISCEN)); -} - -/** - * @brief Set ADC group injected sequence: channel on the selected - * sequence rank. - * @note Depending on devices and packages, some channels may not be available. - * Refer to device datasheet for channels availability. - * @note On this STM32 series, to measure internal channels (VrefInt, - * TempSensor, ...), measurement paths to internal channels must be - * enabled separately. - * This can be done using function @ref LL_ADC_SetCommonPathInternalCh(). - * @rmtoll JSQR JSQ1 LL_ADC_INJ_SetSequencerRanks\n - * JSQR JSQ2 LL_ADC_INJ_SetSequencerRanks\n - * JSQR JSQ3 LL_ADC_INJ_SetSequencerRanks\n - * JSQR JSQ4 LL_ADC_INJ_SetSequencerRanks - * @param ADCx ADC instance - * @param Rank This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_RANK_1 - * @arg @ref LL_ADC_INJ_RANK_2 - * @arg @ref LL_ADC_INJ_RANK_3 - * @arg @ref LL_ADC_INJ_RANK_4 - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_ADC_CHANNEL_0 - * @arg @ref LL_ADC_CHANNEL_1 - * @arg @ref LL_ADC_CHANNEL_2 - * @arg @ref LL_ADC_CHANNEL_3 - * @arg @ref LL_ADC_CHANNEL_4 - * @arg @ref LL_ADC_CHANNEL_5 - * @arg @ref LL_ADC_CHANNEL_6 - * @arg @ref LL_ADC_CHANNEL_7 - * @arg @ref LL_ADC_CHANNEL_8 - * @arg @ref LL_ADC_CHANNEL_9 - * @arg @ref LL_ADC_CHANNEL_10 - * @arg @ref LL_ADC_CHANNEL_11 - * @arg @ref LL_ADC_CHANNEL_12 - * @arg @ref LL_ADC_CHANNEL_13 - * @arg @ref LL_ADC_CHANNEL_14 - * @arg @ref LL_ADC_CHANNEL_15 - * @arg @ref LL_ADC_CHANNEL_16 - * @arg @ref LL_ADC_CHANNEL_17 - * @arg @ref LL_ADC_CHANNEL_18 - * @arg @ref LL_ADC_CHANNEL_VREFINT (1) - * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) - * @arg @ref LL_ADC_CHANNEL_VBAT (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. - * @retval None - */ -__STATIC_INLINE void LL_ADC_INJ_SetSequencerRanks(ADC_TypeDef *ADCx, uint32_t Rank, uint32_t Channel) -{ - /* Set bits with content of parameter "Channel" with bits position */ - /* in register depending on parameter "Rank". */ - /* Parameters "Rank" and "Channel" are used with masks because containing */ - /* other bits reserved for other purpose. */ - uint32_t tmpreg1 = (READ_BIT(ADCx->JSQR, ADC_JSQR_JL) >> ADC_JSQR_JL_Pos) + 1UL; - - MODIFY_REG(ADCx->JSQR, - ADC_CHANNEL_ID_NUMBER_MASK << (5UL * (uint8_t)(((Rank) + 3UL) - (tmpreg1))), - (Channel & ADC_CHANNEL_ID_NUMBER_MASK) << (5UL * (uint8_t)(((Rank) + 3UL) - (tmpreg1)))); -} - -/** - * @brief Get ADC group injected sequence: channel on the selected - * sequence rank. - * @note Depending on devices and packages, some channels may not be available. - * Refer to device datasheet for channels availability. - * @note Usage of the returned channel number: - * - To reinject this channel into another function LL_ADC_xxx: - * the returned channel number is only partly formatted on definition - * of literals LL_ADC_CHANNEL_x. Therefore, it has to be compared - * with parts of literals LL_ADC_CHANNEL_x or using - * helper macro @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB(). - * Then the selected literal LL_ADC_CHANNEL_x can be used - * as parameter for another function. - * - To get the channel number in decimal format: - * process the returned value with the helper macro - * @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB(). - * @rmtoll JSQR JSQ1 LL_ADC_INJ_SetSequencerRanks\n - * JSQR JSQ2 LL_ADC_INJ_SetSequencerRanks\n - * JSQR JSQ3 LL_ADC_INJ_SetSequencerRanks\n - * JSQR JSQ4 LL_ADC_INJ_SetSequencerRanks - * @param ADCx ADC instance - * @param Rank This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_RANK_1 - * @arg @ref LL_ADC_INJ_RANK_2 - * @arg @ref LL_ADC_INJ_RANK_3 - * @arg @ref LL_ADC_INJ_RANK_4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_CHANNEL_0 - * @arg @ref LL_ADC_CHANNEL_1 - * @arg @ref LL_ADC_CHANNEL_2 - * @arg @ref LL_ADC_CHANNEL_3 - * @arg @ref LL_ADC_CHANNEL_4 - * @arg @ref LL_ADC_CHANNEL_5 - * @arg @ref LL_ADC_CHANNEL_6 - * @arg @ref LL_ADC_CHANNEL_7 - * @arg @ref LL_ADC_CHANNEL_8 - * @arg @ref LL_ADC_CHANNEL_9 - * @arg @ref LL_ADC_CHANNEL_10 - * @arg @ref LL_ADC_CHANNEL_11 - * @arg @ref LL_ADC_CHANNEL_12 - * @arg @ref LL_ADC_CHANNEL_13 - * @arg @ref LL_ADC_CHANNEL_14 - * @arg @ref LL_ADC_CHANNEL_15 - * @arg @ref LL_ADC_CHANNEL_16 - * @arg @ref LL_ADC_CHANNEL_17 - * @arg @ref LL_ADC_CHANNEL_18 - * @arg @ref LL_ADC_CHANNEL_VREFINT (1) - * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) - * @arg @ref LL_ADC_CHANNEL_VBAT (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled.\n - * (1) For ADC channel read back from ADC register, - * comparison with internal channel parameter to be done - * using helper macro @ref __LL_ADC_CHANNEL_INTERNAL_TO_EXTERNAL(). - */ -__STATIC_INLINE uint32_t LL_ADC_INJ_GetSequencerRanks(const ADC_TypeDef *ADCx, uint32_t Rank) -{ - uint32_t tmpreg1 = (READ_BIT(ADCx->JSQR, ADC_JSQR_JL) >> ADC_JSQR_JL_Pos) + 1UL; - - return (uint32_t)(READ_BIT(ADCx->JSQR, - ADC_CHANNEL_ID_NUMBER_MASK << (5UL * (uint8_t)(((Rank) + 3UL) - (tmpreg1)))) - >> (5UL * (uint8_t)(((Rank) + 3UL) - (tmpreg1))) - ); -} - -/** - * @brief Set ADC group injected conversion trigger: - * independent or from ADC group regular. - * @note This mode can be used to extend number of data registers - * updated after one ADC conversion trigger and with data - * permanently kept (not erased by successive conversions of scan of - * ADC sequencer ranks), up to 5 data registers: - * 1 data register on ADC group regular, 4 data registers - * on ADC group injected. - * @note If ADC group injected injected trigger source is set to an - * external trigger, this feature must be must be set to - * independent trigger. - * ADC group injected automatic trigger is compliant only with - * group injected trigger source set to SW start, without any - * further action on ADC group injected conversion start or stop: - * in this case, ADC group injected is controlled only - * from ADC group regular. - * @note It is not possible to enable both ADC group injected - * auto-injected mode and sequencer discontinuous mode. - * @rmtoll CR1 JAUTO LL_ADC_INJ_SetTrigAuto - * @param ADCx ADC instance - * @param TrigAuto This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_TRIG_INDEPENDENT - * @arg @ref LL_ADC_INJ_TRIG_FROM_GRP_REGULAR - * @retval None - */ -__STATIC_INLINE void LL_ADC_INJ_SetTrigAuto(ADC_TypeDef *ADCx, uint32_t TrigAuto) -{ - MODIFY_REG(ADCx->CR1, ADC_CR1_JAUTO, TrigAuto); -} - -/** - * @brief Get ADC group injected conversion trigger: - * independent or from ADC group regular. - * @rmtoll CR1 JAUTO LL_ADC_INJ_GetTrigAuto - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_INJ_TRIG_INDEPENDENT - * @arg @ref LL_ADC_INJ_TRIG_FROM_GRP_REGULAR - */ -__STATIC_INLINE uint32_t LL_ADC_INJ_GetTrigAuto(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->CR1, ADC_CR1_JAUTO)); -} - -/** - * @brief Set ADC group injected offset. - * @note It sets: - * - ADC group injected rank to which the offset programmed - * will be applied - * - Offset level (offset to be subtracted from the raw - * converted data). - * Caution: Offset format is dependent to ADC resolution: - * offset has to be left-aligned on bit 11, the LSB (right bits) - * are set to 0. - * @note Offset cannot be enabled or disabled. - * To emulate offset disabled, set an offset value equal to 0. - * @rmtoll JOFR1 JOFFSET1 LL_ADC_INJ_SetOffset\n - * JOFR2 JOFFSET2 LL_ADC_INJ_SetOffset\n - * JOFR3 JOFFSET3 LL_ADC_INJ_SetOffset\n - * JOFR4 JOFFSET4 LL_ADC_INJ_SetOffset - * @param ADCx ADC instance - * @param Rank This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_RANK_1 - * @arg @ref LL_ADC_INJ_RANK_2 - * @arg @ref LL_ADC_INJ_RANK_3 - * @arg @ref LL_ADC_INJ_RANK_4 - * @param OffsetLevel Value between Min_Data=0x000 and Max_Data=0xFFF - * @retval None - */ -__STATIC_INLINE void LL_ADC_INJ_SetOffset(ADC_TypeDef *ADCx, uint32_t Rank, uint32_t OffsetLevel) -{ - __IO uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->JOFR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JOFRX_REGOFFSET_MASK)); - - MODIFY_REG(*preg, - ADC_JOFR1_JOFFSET1, - OffsetLevel); -} - -/** - * @brief Get ADC group injected offset. - * @note It gives offset level (offset to be subtracted from the raw converted data). - * Caution: Offset format is dependent to ADC resolution: - * offset has to be left-aligned on bit 11, the LSB (right bits) - * are set to 0. - * @rmtoll JOFR1 JOFFSET1 LL_ADC_INJ_GetOffset\n - * JOFR2 JOFFSET2 LL_ADC_INJ_GetOffset\n - * JOFR3 JOFFSET3 LL_ADC_INJ_GetOffset\n - * JOFR4 JOFFSET4 LL_ADC_INJ_GetOffset - * @param ADCx ADC instance - * @param Rank This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_RANK_1 - * @arg @ref LL_ADC_INJ_RANK_2 - * @arg @ref LL_ADC_INJ_RANK_3 - * @arg @ref LL_ADC_INJ_RANK_4 - * @retval Value between Min_Data=0x000 and Max_Data=0xFFF - */ -__STATIC_INLINE uint32_t LL_ADC_INJ_GetOffset(const ADC_TypeDef *ADCx, uint32_t Rank) -{ - __IO uint32_t const *preg = __ADC_PTR_REG_OFFSET(ADCx->JOFR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JOFRX_REGOFFSET_MASK)); - - return (uint32_t)(READ_BIT(*preg, - ADC_JOFR1_JOFFSET1) - ); -} - -/** - * @} - */ - -/** @defgroup ADC_LL_EF_Configuration_Channels Configuration of ADC hierarchical scope: channels - * @{ - */ - -/** - * @brief Set sampling time of the selected ADC channel - * Unit: ADC clock cycles. - * @note On this device, sampling time is on channel scope: independently - * of channel mapped on ADC group regular or injected. - * @note In case of internal channel (VrefInt, TempSensor, ...) to be - * converted: - * sampling time constraints must be respected (sampling time can be - * adjusted in function of ADC clock frequency and sampling time - * setting). - * Refer to device datasheet for timings values (parameters TS_vrefint, - * TS_temp, ...). - * @note Conversion time is the addition of sampling time and processing time. - * Refer to reference manual for ADC processing time of - * this STM32 series. - * @note In case of ADC conversion of internal channel (VrefInt, - * temperature sensor, ...), a sampling time minimum value - * is required. - * Refer to device datasheet. - * @rmtoll SMPR1 SMP18 LL_ADC_SetChannelSamplingTime\n - * SMPR1 SMP17 LL_ADC_SetChannelSamplingTime\n - * SMPR1 SMP16 LL_ADC_SetChannelSamplingTime\n - * SMPR1 SMP15 LL_ADC_SetChannelSamplingTime\n - * SMPR1 SMP14 LL_ADC_SetChannelSamplingTime\n - * SMPR1 SMP13 LL_ADC_SetChannelSamplingTime\n - * SMPR1 SMP12 LL_ADC_SetChannelSamplingTime\n - * SMPR1 SMP11 LL_ADC_SetChannelSamplingTime\n - * SMPR1 SMP10 LL_ADC_SetChannelSamplingTime\n - * SMPR2 SMP9 LL_ADC_SetChannelSamplingTime\n - * SMPR2 SMP8 LL_ADC_SetChannelSamplingTime\n - * SMPR2 SMP7 LL_ADC_SetChannelSamplingTime\n - * SMPR2 SMP6 LL_ADC_SetChannelSamplingTime\n - * SMPR2 SMP5 LL_ADC_SetChannelSamplingTime\n - * SMPR2 SMP4 LL_ADC_SetChannelSamplingTime\n - * SMPR2 SMP3 LL_ADC_SetChannelSamplingTime\n - * SMPR2 SMP2 LL_ADC_SetChannelSamplingTime\n - * SMPR2 SMP1 LL_ADC_SetChannelSamplingTime\n - * SMPR2 SMP0 LL_ADC_SetChannelSamplingTime - * @param ADCx ADC instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_ADC_CHANNEL_0 - * @arg @ref LL_ADC_CHANNEL_1 - * @arg @ref LL_ADC_CHANNEL_2 - * @arg @ref LL_ADC_CHANNEL_3 - * @arg @ref LL_ADC_CHANNEL_4 - * @arg @ref LL_ADC_CHANNEL_5 - * @arg @ref LL_ADC_CHANNEL_6 - * @arg @ref LL_ADC_CHANNEL_7 - * @arg @ref LL_ADC_CHANNEL_8 - * @arg @ref LL_ADC_CHANNEL_9 - * @arg @ref LL_ADC_CHANNEL_10 - * @arg @ref LL_ADC_CHANNEL_11 - * @arg @ref LL_ADC_CHANNEL_12 - * @arg @ref LL_ADC_CHANNEL_13 - * @arg @ref LL_ADC_CHANNEL_14 - * @arg @ref LL_ADC_CHANNEL_15 - * @arg @ref LL_ADC_CHANNEL_16 - * @arg @ref LL_ADC_CHANNEL_17 - * @arg @ref LL_ADC_CHANNEL_18 - * @arg @ref LL_ADC_CHANNEL_VREFINT (1) - * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) - * @arg @ref LL_ADC_CHANNEL_VBAT (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. - * @param SamplingTime This parameter can be one of the following values: - * @arg @ref LL_ADC_SAMPLINGTIME_3CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_15CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_28CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_56CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_84CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_112CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_144CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_480CYCLES - * @retval None - */ -__STATIC_INLINE void LL_ADC_SetChannelSamplingTime(ADC_TypeDef *ADCx, uint32_t Channel, uint32_t SamplingTime) -{ - /* Set bits with content of parameter "SamplingTime" with bits position */ - /* in register and register position depending on parameter "Channel". */ - /* Parameter "Channel" is used with masks because containing */ - /* other bits reserved for other purpose. */ - __IO uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->SMPR1, __ADC_MASK_SHIFT(Channel, ADC_CHANNEL_SMPRX_REGOFFSET_MASK)); - - MODIFY_REG(*preg, - ADC_SMPR2_SMP0 << __ADC_MASK_SHIFT(Channel, ADC_CHANNEL_SMPx_BITOFFSET_MASK), - SamplingTime << __ADC_MASK_SHIFT(Channel, ADC_CHANNEL_SMPx_BITOFFSET_MASK)); -} - -/** - * @brief Get sampling time of the selected ADC channel - * Unit: ADC clock cycles. - * @note On this device, sampling time is on channel scope: independently - * of channel mapped on ADC group regular or injected. - * @note Conversion time is the addition of sampling time and processing time. - * Refer to reference manual for ADC processing time of - * this STM32 series. - * @rmtoll SMPR1 SMP18 LL_ADC_GetChannelSamplingTime\n - * SMPR1 SMP17 LL_ADC_GetChannelSamplingTime\n - * SMPR1 SMP16 LL_ADC_GetChannelSamplingTime\n - * SMPR1 SMP15 LL_ADC_GetChannelSamplingTime\n - * SMPR1 SMP14 LL_ADC_GetChannelSamplingTime\n - * SMPR1 SMP13 LL_ADC_GetChannelSamplingTime\n - * SMPR1 SMP12 LL_ADC_GetChannelSamplingTime\n - * SMPR1 SMP11 LL_ADC_GetChannelSamplingTime\n - * SMPR1 SMP10 LL_ADC_GetChannelSamplingTime\n - * SMPR2 SMP9 LL_ADC_GetChannelSamplingTime\n - * SMPR2 SMP8 LL_ADC_GetChannelSamplingTime\n - * SMPR2 SMP7 LL_ADC_GetChannelSamplingTime\n - * SMPR2 SMP6 LL_ADC_GetChannelSamplingTime\n - * SMPR2 SMP5 LL_ADC_GetChannelSamplingTime\n - * SMPR2 SMP4 LL_ADC_GetChannelSamplingTime\n - * SMPR2 SMP3 LL_ADC_GetChannelSamplingTime\n - * SMPR2 SMP2 LL_ADC_GetChannelSamplingTime\n - * SMPR2 SMP1 LL_ADC_GetChannelSamplingTime\n - * SMPR2 SMP0 LL_ADC_GetChannelSamplingTime - * @param ADCx ADC instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_ADC_CHANNEL_0 - * @arg @ref LL_ADC_CHANNEL_1 - * @arg @ref LL_ADC_CHANNEL_2 - * @arg @ref LL_ADC_CHANNEL_3 - * @arg @ref LL_ADC_CHANNEL_4 - * @arg @ref LL_ADC_CHANNEL_5 - * @arg @ref LL_ADC_CHANNEL_6 - * @arg @ref LL_ADC_CHANNEL_7 - * @arg @ref LL_ADC_CHANNEL_8 - * @arg @ref LL_ADC_CHANNEL_9 - * @arg @ref LL_ADC_CHANNEL_10 - * @arg @ref LL_ADC_CHANNEL_11 - * @arg @ref LL_ADC_CHANNEL_12 - * @arg @ref LL_ADC_CHANNEL_13 - * @arg @ref LL_ADC_CHANNEL_14 - * @arg @ref LL_ADC_CHANNEL_15 - * @arg @ref LL_ADC_CHANNEL_16 - * @arg @ref LL_ADC_CHANNEL_17 - * @arg @ref LL_ADC_CHANNEL_18 - * @arg @ref LL_ADC_CHANNEL_VREFINT (1) - * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) - * @arg @ref LL_ADC_CHANNEL_VBAT (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_SAMPLINGTIME_3CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_15CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_28CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_56CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_84CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_112CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_144CYCLES - * @arg @ref LL_ADC_SAMPLINGTIME_480CYCLES - */ -__STATIC_INLINE uint32_t LL_ADC_GetChannelSamplingTime(const ADC_TypeDef *ADCx, uint32_t Channel) -{ - __IO uint32_t const *preg = __ADC_PTR_REG_OFFSET(ADCx->SMPR1, __ADC_MASK_SHIFT(Channel, ADC_CHANNEL_SMPRX_REGOFFSET_MASK)); - - return (uint32_t)(READ_BIT(*preg, - ADC_SMPR2_SMP0 << __ADC_MASK_SHIFT(Channel, ADC_CHANNEL_SMPx_BITOFFSET_MASK)) - >> __ADC_MASK_SHIFT(Channel, ADC_CHANNEL_SMPx_BITOFFSET_MASK) - ); -} - -/** - * @} - */ - -/** @defgroup ADC_LL_EF_Configuration_ADC_AnalogWatchdog Configuration of ADC transversal scope: analog watchdog - * @{ - */ - -/** - * @brief Set ADC analog watchdog monitored channels: - * a single channel or all channels, - * on ADC groups regular and-or injected. - * @note Once monitored channels are selected, analog watchdog - * is enabled. - * @note In case of need to define a single channel to monitor - * with analog watchdog from sequencer channel definition, - * use helper macro @ref __LL_ADC_ANALOGWD_CHANNEL_GROUP(). - * @note On this STM32 series, there is only 1 kind of analog watchdog - * instance: - * - AWD standard (instance AWD1): - * - channels monitored: can monitor 1 channel or all channels. - * - groups monitored: ADC groups regular and-or injected. - * - resolution: resolution is not limited (corresponds to - * ADC resolution configured). - * @rmtoll CR1 AWD1CH LL_ADC_SetAnalogWDMonitChannels\n - * CR1 AWD1SGL LL_ADC_SetAnalogWDMonitChannels\n - * CR1 AWD1EN LL_ADC_SetAnalogWDMonitChannels - * @param ADCx ADC instance - * @param AWDChannelGroup This parameter can be one of the following values: - * @arg @ref LL_ADC_AWD_DISABLE - * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG - * @arg @ref LL_ADC_AWD_ALL_CHANNELS_INJ - * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_0_REG - * @arg @ref LL_ADC_AWD_CHANNEL_0_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_0_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_1_REG - * @arg @ref LL_ADC_AWD_CHANNEL_1_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_1_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_2_REG - * @arg @ref LL_ADC_AWD_CHANNEL_2_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_2_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_3_REG - * @arg @ref LL_ADC_AWD_CHANNEL_3_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_3_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_4_REG - * @arg @ref LL_ADC_AWD_CHANNEL_4_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_4_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_5_REG - * @arg @ref LL_ADC_AWD_CHANNEL_5_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_5_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_6_REG - * @arg @ref LL_ADC_AWD_CHANNEL_6_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_6_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_7_REG - * @arg @ref LL_ADC_AWD_CHANNEL_7_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_7_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_8_REG - * @arg @ref LL_ADC_AWD_CHANNEL_8_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_8_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_9_REG - * @arg @ref LL_ADC_AWD_CHANNEL_9_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_9_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_10_REG - * @arg @ref LL_ADC_AWD_CHANNEL_10_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_10_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_11_REG - * @arg @ref LL_ADC_AWD_CHANNEL_11_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_11_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_12_REG - * @arg @ref LL_ADC_AWD_CHANNEL_12_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_12_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_13_REG - * @arg @ref LL_ADC_AWD_CHANNEL_13_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_13_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_14_REG - * @arg @ref LL_ADC_AWD_CHANNEL_14_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_14_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_15_REG - * @arg @ref LL_ADC_AWD_CHANNEL_15_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_15_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_16_REG - * @arg @ref LL_ADC_AWD_CHANNEL_16_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_16_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_17_REG - * @arg @ref LL_ADC_AWD_CHANNEL_17_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_17_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_18_REG - * @arg @ref LL_ADC_AWD_CHANNEL_18_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_18_REG_INJ - * @arg @ref LL_ADC_AWD_CH_VREFINT_REG (1) - * @arg @ref LL_ADC_AWD_CH_VREFINT_INJ (1) - * @arg @ref LL_ADC_AWD_CH_VREFINT_REG_INJ (1) - * @arg @ref LL_ADC_AWD_CH_TEMPSENSOR_REG (1)(2) - * @arg @ref LL_ADC_AWD_CH_TEMPSENSOR_INJ (1)(2) - * @arg @ref LL_ADC_AWD_CH_TEMPSENSOR_REG_INJ (1)(2) - * @arg @ref LL_ADC_AWD_CH_VBAT_REG (1) - * @arg @ref LL_ADC_AWD_CH_VBAT_INJ (1) - * @arg @ref LL_ADC_AWD_CH_VBAT_REG_INJ (1) - * - * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n - * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. - * @retval None - */ -__STATIC_INLINE void LL_ADC_SetAnalogWDMonitChannels(ADC_TypeDef *ADCx, uint32_t AWDChannelGroup) -{ - MODIFY_REG(ADCx->CR1, - (ADC_CR1_AWDEN | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL | ADC_CR1_AWDCH), - AWDChannelGroup); -} - -/** - * @brief Get ADC analog watchdog monitored channel. - * @note Usage of the returned channel number: - * - To reinject this channel into another function LL_ADC_xxx: - * the returned channel number is only partly formatted on definition - * of literals LL_ADC_CHANNEL_x. Therefore, it has to be compared - * with parts of literals LL_ADC_CHANNEL_x or using - * helper macro @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB(). - * Then the selected literal LL_ADC_CHANNEL_x can be used - * as parameter for another function. - * - To get the channel number in decimal format: - * process the returned value with the helper macro - * @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB(). - * Applicable only when the analog watchdog is set to monitor - * one channel. - * @note On this STM32 series, there is only 1 kind of analog watchdog - * instance: - * - AWD standard (instance AWD1): - * - channels monitored: can monitor 1 channel or all channels. - * - groups monitored: ADC groups regular and-or injected. - * - resolution: resolution is not limited (corresponds to - * ADC resolution configured). - * @rmtoll CR1 AWD1CH LL_ADC_GetAnalogWDMonitChannels\n - * CR1 AWD1SGL LL_ADC_GetAnalogWDMonitChannels\n - * CR1 AWD1EN LL_ADC_GetAnalogWDMonitChannels - * @param ADCx ADC instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_AWD_DISABLE - * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG - * @arg @ref LL_ADC_AWD_ALL_CHANNELS_INJ - * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_0_REG - * @arg @ref LL_ADC_AWD_CHANNEL_0_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_0_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_1_REG - * @arg @ref LL_ADC_AWD_CHANNEL_1_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_1_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_2_REG - * @arg @ref LL_ADC_AWD_CHANNEL_2_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_2_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_3_REG - * @arg @ref LL_ADC_AWD_CHANNEL_3_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_3_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_4_REG - * @arg @ref LL_ADC_AWD_CHANNEL_4_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_4_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_5_REG - * @arg @ref LL_ADC_AWD_CHANNEL_5_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_5_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_6_REG - * @arg @ref LL_ADC_AWD_CHANNEL_6_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_6_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_7_REG - * @arg @ref LL_ADC_AWD_CHANNEL_7_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_7_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_8_REG - * @arg @ref LL_ADC_AWD_CHANNEL_8_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_8_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_9_REG - * @arg @ref LL_ADC_AWD_CHANNEL_9_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_9_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_10_REG - * @arg @ref LL_ADC_AWD_CHANNEL_10_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_10_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_11_REG - * @arg @ref LL_ADC_AWD_CHANNEL_11_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_11_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_12_REG - * @arg @ref LL_ADC_AWD_CHANNEL_12_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_12_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_13_REG - * @arg @ref LL_ADC_AWD_CHANNEL_13_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_13_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_14_REG - * @arg @ref LL_ADC_AWD_CHANNEL_14_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_14_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_15_REG - * @arg @ref LL_ADC_AWD_CHANNEL_15_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_15_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_16_REG - * @arg @ref LL_ADC_AWD_CHANNEL_16_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_16_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_17_REG - * @arg @ref LL_ADC_AWD_CHANNEL_17_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_17_REG_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_18_REG - * @arg @ref LL_ADC_AWD_CHANNEL_18_INJ - * @arg @ref LL_ADC_AWD_CHANNEL_18_REG_INJ - */ -__STATIC_INLINE uint32_t LL_ADC_GetAnalogWDMonitChannels(const ADC_TypeDef *ADCx) -{ - return (uint32_t)(READ_BIT(ADCx->CR1, (ADC_CR1_AWDEN | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL | ADC_CR1_AWDCH))); -} - -/** - * @brief Set ADC analog watchdog threshold value of threshold - * high or low. - * @note In case of ADC resolution different of 12 bits, - * analog watchdog thresholds data require a specific shift. - * Use helper macro @ref __LL_ADC_ANALOGWD_SET_THRESHOLD_RESOLUTION(). - * @note On this STM32 series, there is only 1 kind of analog watchdog - * instance: - * - AWD standard (instance AWD1): - * - channels monitored: can monitor 1 channel or all channels. - * - groups monitored: ADC groups regular and-or injected. - * - resolution: resolution is not limited (corresponds to - * ADC resolution configured). - * @rmtoll HTR HT LL_ADC_SetAnalogWDThresholds\n - * LTR LT LL_ADC_SetAnalogWDThresholds - * @param ADCx ADC instance - * @param AWDThresholdsHighLow This parameter can be one of the following values: - * @arg @ref LL_ADC_AWD_THRESHOLD_HIGH - * @arg @ref LL_ADC_AWD_THRESHOLD_LOW - * @param AWDThresholdValue Value between Min_Data=0x000 and Max_Data=0xFFF - * @retval None - */ -__STATIC_INLINE void LL_ADC_SetAnalogWDThresholds(ADC_TypeDef *ADCx, uint32_t AWDThresholdsHighLow, uint32_t AWDThresholdValue) -{ - __IO uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->HTR, AWDThresholdsHighLow); - - MODIFY_REG(*preg, - ADC_HTR_HT, - AWDThresholdValue); -} - -/** - * @brief Get ADC analog watchdog threshold value of threshold high or - * threshold low. - * @note In case of ADC resolution different of 12 bits, - * analog watchdog thresholds data require a specific shift. - * Use helper macro @ref __LL_ADC_ANALOGWD_GET_THRESHOLD_RESOLUTION(). - * @rmtoll HTR HT LL_ADC_GetAnalogWDThresholds\n - * LTR LT LL_ADC_GetAnalogWDThresholds - * @param ADCx ADC instance - * @param AWDThresholdsHighLow This parameter can be one of the following values: - * @arg @ref LL_ADC_AWD_THRESHOLD_HIGH - * @arg @ref LL_ADC_AWD_THRESHOLD_LOW - * @retval Value between Min_Data=0x000 and Max_Data=0xFFF -*/ -__STATIC_INLINE uint32_t LL_ADC_GetAnalogWDThresholds(const ADC_TypeDef *ADCx, uint32_t AWDThresholdsHighLow) -{ - __IO uint32_t const *preg = __ADC_PTR_REG_OFFSET(ADCx->HTR, AWDThresholdsHighLow); - - return (uint32_t)(READ_BIT(*preg, ADC_HTR_HT)); -} - -/** - * @} - */ - -/** @defgroup ADC_LL_EF_Configuration_ADC_Multimode Configuration of ADC hierarchical scope: multimode - * @{ - */ - -#if defined(ADC_MULTIMODE_SUPPORT) -/** - * @brief Set ADC multimode configuration to operate in independent mode - * or multimode (for devices with several ADC instances). - * @note If multimode configuration: the selected ADC instance is - * either master or slave depending on hardware. - * Refer to reference manual. - * @rmtoll CCR MULTI LL_ADC_SetMultimode - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @param Multimode This parameter can be one of the following values: - * @arg @ref LL_ADC_MULTI_INDEPENDENT - * @arg @ref LL_ADC_MULTI_DUAL_REG_SIMULT - * @arg @ref LL_ADC_MULTI_DUAL_REG_INTERL - * @arg @ref LL_ADC_MULTI_DUAL_INJ_SIMULT - * @arg @ref LL_ADC_MULTI_DUAL_INJ_ALTERN - * @arg @ref LL_ADC_MULTI_DUAL_REG_SIM_INJ_SIM - * @arg @ref LL_ADC_MULTI_DUAL_REG_SIM_INJ_ALT - * @arg @ref LL_ADC_MULTI_DUAL_REG_INT_INJ_SIM - * @arg @ref LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_SIM - * @arg @ref LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_ALT - * @arg @ref LL_ADC_MULTI_TRIPLE_INJ_SIMULT - * @arg @ref LL_ADC_MULTI_TRIPLE_REG_SIMULT - * @arg @ref LL_ADC_MULTI_TRIPLE_REG_INTERL - * @arg @ref LL_ADC_MULTI_TRIPLE_INJ_ALTERN - * @retval None - */ -__STATIC_INLINE void LL_ADC_SetMultimode(ADC_Common_TypeDef *ADCxy_COMMON, uint32_t Multimode) -{ - MODIFY_REG(ADCxy_COMMON->CCR, ADC_CCR_MULTI, Multimode); -} - -/** - * @brief Get ADC multimode configuration to operate in independent mode - * or multimode (for devices with several ADC instances). - * @note If multimode configuration: the selected ADC instance is - * either master or slave depending on hardware. - * Refer to reference manual. - * @rmtoll CCR MULTI LL_ADC_GetMultimode - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_MULTI_INDEPENDENT - * @arg @ref LL_ADC_MULTI_DUAL_REG_SIMULT - * @arg @ref LL_ADC_MULTI_DUAL_REG_INTERL - * @arg @ref LL_ADC_MULTI_DUAL_INJ_SIMULT - * @arg @ref LL_ADC_MULTI_DUAL_INJ_ALTERN - * @arg @ref LL_ADC_MULTI_DUAL_REG_SIM_INJ_SIM - * @arg @ref LL_ADC_MULTI_DUAL_REG_SIM_INJ_ALT - * @arg @ref LL_ADC_MULTI_DUAL_REG_INT_INJ_SIM - * @arg @ref LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_SIM - * @arg @ref LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_ALT - * @arg @ref LL_ADC_MULTI_TRIPLE_INJ_SIMULT - * @arg @ref LL_ADC_MULTI_TRIPLE_REG_SIMULT - * @arg @ref LL_ADC_MULTI_TRIPLE_REG_INTERL - * @arg @ref LL_ADC_MULTI_TRIPLE_INJ_ALTERN - */ -__STATIC_INLINE uint32_t LL_ADC_GetMultimode(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (uint32_t)(READ_BIT(ADCxy_COMMON->CCR, ADC_CCR_MULTI)); -} - -/** - * @brief Set ADC multimode conversion data transfer: no transfer - * or transfer by DMA. - * @note If ADC multimode transfer by DMA is not selected: - * each ADC uses its own DMA channel, with its individual - * DMA transfer settings. - * If ADC multimode transfer by DMA is selected: - * One DMA channel is used for both ADC (DMA of ADC master) - * Specifies the DMA requests mode: - * - Limited mode (One shot mode): DMA transfer requests are stopped - * when number of DMA data transfers (number of - * ADC conversions) is reached. - * This ADC mode is intended to be used with DMA mode non-circular. - * - Unlimited mode: DMA transfer requests are unlimited, - * whatever number of DMA data transfers (number of - * ADC conversions). - * This ADC mode is intended to be used with DMA mode circular. - * @note If ADC DMA requests mode is set to unlimited and DMA is set to - * mode non-circular: - * when DMA transfers size will be reached, DMA will stop transfers of - * ADC conversions data ADC will raise an overrun error - * (overrun flag and interruption if enabled). - * @note How to retrieve multimode conversion data: - * Whatever multimode transfer by DMA setting: using function - * @ref LL_ADC_REG_ReadMultiConversionData32(). - * If ADC multimode transfer by DMA is selected: conversion data - * is a raw data with ADC master and slave concatenated. - * A macro is available to get the conversion data of - * ADC master or ADC slave: see helper macro - * @ref __LL_ADC_MULTI_CONV_DATA_MASTER_SLAVE(). - * @rmtoll CCR MDMA LL_ADC_SetMultiDMATransfer\n - * CCR DDS LL_ADC_SetMultiDMATransfer - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @param MultiDMATransfer This parameter can be one of the following values: - * @arg @ref LL_ADC_MULTI_REG_DMA_EACH_ADC - * @arg @ref LL_ADC_MULTI_REG_DMA_LIMIT_1 - * @arg @ref LL_ADC_MULTI_REG_DMA_LIMIT_2 - * @arg @ref LL_ADC_MULTI_REG_DMA_LIMIT_3 - * @arg @ref LL_ADC_MULTI_REG_DMA_UNLMT_1 - * @arg @ref LL_ADC_MULTI_REG_DMA_UNLMT_2 - * @arg @ref LL_ADC_MULTI_REG_DMA_UNLMT_3 - * @retval None - */ -__STATIC_INLINE void LL_ADC_SetMultiDMATransfer(ADC_Common_TypeDef *ADCxy_COMMON, uint32_t MultiDMATransfer) -{ - MODIFY_REG(ADCxy_COMMON->CCR, ADC_CCR_DMA | ADC_CCR_DDS, MultiDMATransfer); -} - -/** - * @brief Get ADC multimode conversion data transfer: no transfer - * or transfer by DMA. - * @note If ADC multimode transfer by DMA is not selected: - * each ADC uses its own DMA channel, with its individual - * DMA transfer settings. - * If ADC multimode transfer by DMA is selected: - * One DMA channel is used for both ADC (DMA of ADC master) - * Specifies the DMA requests mode: - * - Limited mode (One shot mode): DMA transfer requests are stopped - * when number of DMA data transfers (number of - * ADC conversions) is reached. - * This ADC mode is intended to be used with DMA mode non-circular. - * - Unlimited mode: DMA transfer requests are unlimited, - * whatever number of DMA data transfers (number of - * ADC conversions). - * This ADC mode is intended to be used with DMA mode circular. - * @note If ADC DMA requests mode is set to unlimited and DMA is set to - * mode non-circular: - * when DMA transfers size will be reached, DMA will stop transfers of - * ADC conversions data ADC will raise an overrun error - * (overrun flag and interruption if enabled). - * @note How to retrieve multimode conversion data: - * Whatever multimode transfer by DMA setting: using function - * @ref LL_ADC_REG_ReadMultiConversionData32(). - * If ADC multimode transfer by DMA is selected: conversion data - * is a raw data with ADC master and slave concatenated. - * A macro is available to get the conversion data of - * ADC master or ADC slave: see helper macro - * @ref __LL_ADC_MULTI_CONV_DATA_MASTER_SLAVE(). - * @rmtoll CCR MDMA LL_ADC_GetMultiDMATransfer\n - * CCR DDS LL_ADC_GetMultiDMATransfer - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_MULTI_REG_DMA_EACH_ADC - * @arg @ref LL_ADC_MULTI_REG_DMA_LIMIT_1 - * @arg @ref LL_ADC_MULTI_REG_DMA_LIMIT_2 - * @arg @ref LL_ADC_MULTI_REG_DMA_LIMIT_3 - * @arg @ref LL_ADC_MULTI_REG_DMA_UNLMT_1 - * @arg @ref LL_ADC_MULTI_REG_DMA_UNLMT_2 - * @arg @ref LL_ADC_MULTI_REG_DMA_UNLMT_3 - */ -__STATIC_INLINE uint32_t LL_ADC_GetMultiDMATransfer(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (uint32_t)(READ_BIT(ADCxy_COMMON->CCR, ADC_CCR_DMA | ADC_CCR_DDS)); -} - -/** - * @brief Set ADC multimode delay between 2 sampling phases. - * @note The sampling delay range depends on ADC resolution: - * - ADC resolution 12 bits can have maximum delay of 12 cycles. - * - ADC resolution 10 bits can have maximum delay of 10 cycles. - * - ADC resolution 8 bits can have maximum delay of 8 cycles. - * - ADC resolution 6 bits can have maximum delay of 6 cycles. - * @rmtoll CCR DELAY LL_ADC_SetMultiTwoSamplingDelay - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @param MultiTwoSamplingDelay This parameter can be one of the following values: - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_5CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_6CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_7CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_8CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_9CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_10CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_11CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_12CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_13CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_14CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_15CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_16CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_17CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_18CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_19CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_20CYCLES - * @retval None - */ -__STATIC_INLINE void LL_ADC_SetMultiTwoSamplingDelay(ADC_Common_TypeDef *ADCxy_COMMON, uint32_t MultiTwoSamplingDelay) -{ - MODIFY_REG(ADCxy_COMMON->CCR, ADC_CCR_DELAY, MultiTwoSamplingDelay); -} - -/** - * @brief Get ADC multimode delay between 2 sampling phases. - * @rmtoll CCR DELAY LL_ADC_GetMultiTwoSamplingDelay - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval Returned value can be one of the following values: - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_5CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_6CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_7CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_8CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_9CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_10CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_11CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_12CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_13CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_14CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_15CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_16CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_17CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_18CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_19CYCLES - * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_20CYCLES - */ -__STATIC_INLINE uint32_t LL_ADC_GetMultiTwoSamplingDelay(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (uint32_t)(READ_BIT(ADCxy_COMMON->CCR, ADC_CCR_DELAY)); -} -#endif /* ADC_MULTIMODE_SUPPORT */ - -/** - * @} - */ -/** @defgroup ADC_LL_EF_Operation_ADC_Instance Operation on ADC hierarchical scope: ADC instance - * @{ - */ - -/** - * @brief Enable the selected ADC instance. - * @note On this STM32 series, after ADC enable, a delay for - * ADC internal analog stabilization is required before performing a - * ADC conversion start. - * Refer to device datasheet, parameter tSTAB. - * @rmtoll CR2 ADON LL_ADC_Enable - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_Enable(ADC_TypeDef *ADCx) -{ - SET_BIT(ADCx->CR2, ADC_CR2_ADON); -} - -/** - * @brief Disable the selected ADC instance. - * @rmtoll CR2 ADON LL_ADC_Disable - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_Disable(ADC_TypeDef *ADCx) -{ - CLEAR_BIT(ADCx->CR2, ADC_CR2_ADON); -} - -/** - * @brief Get the selected ADC instance enable state. - * @rmtoll CR2 ADON LL_ADC_IsEnabled - * @param ADCx ADC instance - * @retval 0: ADC is disabled, 1: ADC is enabled. - */ -__STATIC_INLINE uint32_t LL_ADC_IsEnabled(const ADC_TypeDef *ADCx) -{ - return (READ_BIT(ADCx->CR2, ADC_CR2_ADON) == (ADC_CR2_ADON)); -} - -/** - * @} - */ - -/** @defgroup ADC_LL_EF_Operation_ADC_Group_Regular Operation on ADC hierarchical scope: group regular - * @{ - */ - -/** - * @brief Start ADC group regular conversion. - * @note On this STM32 series, this function is relevant only for - * internal trigger (SW start), not for external trigger: - * - If ADC trigger has been set to software start, ADC conversion - * starts immediately. - * - If ADC trigger has been set to external trigger, ADC conversion - * start must be performed using function - * @ref LL_ADC_REG_StartConversionExtTrig(). - * (if external trigger edge would have been set during ADC other - * settings, ADC conversion would start at trigger event - * as soon as ADC is enabled). - * @rmtoll CR2 SWSTART LL_ADC_REG_StartConversionSWStart - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_REG_StartConversionSWStart(ADC_TypeDef *ADCx) -{ - SET_BIT(ADCx->CR2, ADC_CR2_SWSTART); -} - -/** - * @brief Start ADC group regular conversion from external trigger. - * @note ADC conversion will start at next trigger event (on the selected - * trigger edge) following the ADC start conversion command. - * @note On this STM32 series, this function is relevant for - * ADC conversion start from external trigger. - * If internal trigger (SW start) is needed, perform ADC conversion - * start using function @ref LL_ADC_REG_StartConversionSWStart(). - * @rmtoll CR2 EXTEN LL_ADC_REG_StartConversionExtTrig - * @param ExternalTriggerEdge This parameter can be one of the following values: - * @arg @ref LL_ADC_REG_TRIG_EXT_RISING - * @arg @ref LL_ADC_REG_TRIG_EXT_FALLING - * @arg @ref LL_ADC_REG_TRIG_EXT_RISINGFALLING - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_REG_StartConversionExtTrig(ADC_TypeDef *ADCx, uint32_t ExternalTriggerEdge) -{ - SET_BIT(ADCx->CR2, ExternalTriggerEdge); -} - -/** - * @brief Stop ADC group regular conversion from external trigger. - * @note No more ADC conversion will start at next trigger event - * following the ADC stop conversion command. - * If a conversion is on-going, it will be completed. - * @note On this STM32 series, there is no specific command - * to stop a conversion on-going or to stop ADC converting - * in continuous mode. These actions can be performed - * using function @ref LL_ADC_Disable(). - * @rmtoll CR2 EXTEN LL_ADC_REG_StopConversionExtTrig - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_REG_StopConversionExtTrig(ADC_TypeDef *ADCx) -{ - CLEAR_BIT(ADCx->CR2, ADC_CR2_EXTEN); -} - -/** - * @brief Get ADC group regular conversion data, range fit for - * all ADC configurations: all ADC resolutions and - * all oversampling increased data width (for devices - * with feature oversampling). - * @rmtoll DR RDATA LL_ADC_REG_ReadConversionData32 - * @param ADCx ADC instance - * @retval Value between Min_Data=0x00000000 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_ADC_REG_ReadConversionData32(const ADC_TypeDef *ADCx) -{ - return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA)); -} - -/** - * @brief Get ADC group regular conversion data, range fit for - * ADC resolution 12 bits. - * @note For devices with feature oversampling: Oversampling - * can increase data width, function for extended range - * may be needed: @ref LL_ADC_REG_ReadConversionData32. - * @rmtoll DR RDATA LL_ADC_REG_ReadConversionData12 - * @param ADCx ADC instance - * @retval Value between Min_Data=0x000 and Max_Data=0xFFF - */ -__STATIC_INLINE uint16_t LL_ADC_REG_ReadConversionData12(const ADC_TypeDef *ADCx) -{ - return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA)); -} - -/** - * @brief Get ADC group regular conversion data, range fit for - * ADC resolution 10 bits. - * @note For devices with feature oversampling: Oversampling - * can increase data width, function for extended range - * may be needed: @ref LL_ADC_REG_ReadConversionData32. - * @rmtoll DR RDATA LL_ADC_REG_ReadConversionData10 - * @param ADCx ADC instance - * @retval Value between Min_Data=0x000 and Max_Data=0x3FF - */ -__STATIC_INLINE uint16_t LL_ADC_REG_ReadConversionData10(const ADC_TypeDef *ADCx) -{ - return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA)); -} - -/** - * @brief Get ADC group regular conversion data, range fit for - * ADC resolution 8 bits. - * @note For devices with feature oversampling: Oversampling - * can increase data width, function for extended range - * may be needed: @ref LL_ADC_REG_ReadConversionData32. - * @rmtoll DR RDATA LL_ADC_REG_ReadConversionData8 - * @param ADCx ADC instance - * @retval Value between Min_Data=0x00 and Max_Data=0xFF - */ -__STATIC_INLINE uint8_t LL_ADC_REG_ReadConversionData8(const ADC_TypeDef *ADCx) -{ - return (uint8_t)(READ_BIT(ADCx->DR, ADC_DR_DATA)); -} - -/** - * @brief Get ADC group regular conversion data, range fit for - * ADC resolution 6 bits. - * @note For devices with feature oversampling: Oversampling - * can increase data width, function for extended range - * may be needed: @ref LL_ADC_REG_ReadConversionData32. - * @rmtoll DR RDATA LL_ADC_REG_ReadConversionData6 - * @param ADCx ADC instance - * @retval Value between Min_Data=0x00 and Max_Data=0x3F - */ -__STATIC_INLINE uint8_t LL_ADC_REG_ReadConversionData6(const ADC_TypeDef *ADCx) -{ - return (uint8_t)(READ_BIT(ADCx->DR, ADC_DR_DATA)); -} - -#if defined(ADC_MULTIMODE_SUPPORT) -/** - * @brief Get ADC multimode conversion data of ADC master, ADC slave - * or raw data with ADC master and slave concatenated. - * @note If raw data with ADC master and slave concatenated is retrieved, - * a macro is available to get the conversion data of - * ADC master or ADC slave: see helper macro - * @ref __LL_ADC_MULTI_CONV_DATA_MASTER_SLAVE(). - * (however this macro is mainly intended for multimode - * transfer by DMA, because this function can do the same - * by getting multimode conversion data of ADC master or ADC slave - * separately). - * @rmtoll CDR DATA1 LL_ADC_REG_ReadMultiConversionData32\n - * CDR DATA2 LL_ADC_REG_ReadMultiConversionData32 - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @param ConversionData This parameter can be one of the following values: - * @arg @ref LL_ADC_MULTI_MASTER - * @arg @ref LL_ADC_MULTI_SLAVE - * @arg @ref LL_ADC_MULTI_MASTER_SLAVE - * @retval Value between Min_Data=0x00000000 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_ADC_REG_ReadMultiConversionData32(const ADC_Common_TypeDef *ADCxy_COMMON, uint32_t ConversionData) -{ - return (uint32_t)(READ_BIT(ADCxy_COMMON->CDR, - ADC_DR_ADC2DATA) - >> POSITION_VAL(ConversionData) - ); -} -#endif /* ADC_MULTIMODE_SUPPORT */ - -/** - * @} - */ - -/** @defgroup ADC_LL_EF_Operation_ADC_Group_Injected Operation on ADC hierarchical scope: group injected - * @{ - */ - -/** - * @brief Start ADC group injected conversion. - * @note On this STM32 series, this function is relevant only for - * internal trigger (SW start), not for external trigger: - * - If ADC trigger has been set to software start, ADC conversion - * starts immediately. - * - If ADC trigger has been set to external trigger, ADC conversion - * start must be performed using function - * @ref LL_ADC_INJ_StartConversionExtTrig(). - * (if external trigger edge would have been set during ADC other - * settings, ADC conversion would start at trigger event - * as soon as ADC is enabled). - * @rmtoll CR2 JSWSTART LL_ADC_INJ_StartConversionSWStart - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_INJ_StartConversionSWStart(ADC_TypeDef *ADCx) -{ - SET_BIT(ADCx->CR2, ADC_CR2_JSWSTART); -} - -/** - * @brief Start ADC group injected conversion from external trigger. - * @note ADC conversion will start at next trigger event (on the selected - * trigger edge) following the ADC start conversion command. - * @note On this STM32 series, this function is relevant for - * ADC conversion start from external trigger. - * If internal trigger (SW start) is needed, perform ADC conversion - * start using function @ref LL_ADC_INJ_StartConversionSWStart(). - * @rmtoll CR2 JEXTEN LL_ADC_INJ_StartConversionExtTrig - * @param ExternalTriggerEdge This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_TRIG_EXT_RISING - * @arg @ref LL_ADC_INJ_TRIG_EXT_FALLING - * @arg @ref LL_ADC_INJ_TRIG_EXT_RISINGFALLING - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_INJ_StartConversionExtTrig(ADC_TypeDef *ADCx, uint32_t ExternalTriggerEdge) -{ - SET_BIT(ADCx->CR2, ExternalTriggerEdge); -} - -/** - * @brief Stop ADC group injected conversion from external trigger. - * @note No more ADC conversion will start at next trigger event - * following the ADC stop conversion command. - * If a conversion is on-going, it will be completed. - * @note On this STM32 series, there is no specific command - * to stop a conversion on-going or to stop ADC converting - * in continuous mode. These actions can be performed - * using function @ref LL_ADC_Disable(). - * @rmtoll CR2 JEXTEN LL_ADC_INJ_StopConversionExtTrig - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_INJ_StopConversionExtTrig(ADC_TypeDef *ADCx) -{ - CLEAR_BIT(ADCx->CR2, ADC_CR2_JEXTEN); -} - -/** - * @brief Get ADC group regular conversion data, range fit for - * all ADC configurations: all ADC resolutions and - * all oversampling increased data width (for devices - * with feature oversampling). - * @rmtoll JDR1 JDATA LL_ADC_INJ_ReadConversionData32\n - * JDR2 JDATA LL_ADC_INJ_ReadConversionData32\n - * JDR3 JDATA LL_ADC_INJ_ReadConversionData32\n - * JDR4 JDATA LL_ADC_INJ_ReadConversionData32 - * @param ADCx ADC instance - * @param Rank This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_RANK_1 - * @arg @ref LL_ADC_INJ_RANK_2 - * @arg @ref LL_ADC_INJ_RANK_3 - * @arg @ref LL_ADC_INJ_RANK_4 - * @retval Value between Min_Data=0x00000000 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_ADC_INJ_ReadConversionData32(const ADC_TypeDef *ADCx, uint32_t Rank) -{ - __IO uint32_t const *preg = __ADC_PTR_REG_OFFSET(ADCx->JDR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JDRX_REGOFFSET_MASK)); - - return (uint32_t)(READ_BIT(*preg, - ADC_JDR1_JDATA) - ); -} - -/** - * @brief Get ADC group injected conversion data, range fit for - * ADC resolution 12 bits. - * @note For devices with feature oversampling: Oversampling - * can increase data width, function for extended range - * may be needed: @ref LL_ADC_INJ_ReadConversionData32. - * @rmtoll JDR1 JDATA LL_ADC_INJ_ReadConversionData12\n - * JDR2 JDATA LL_ADC_INJ_ReadConversionData12\n - * JDR3 JDATA LL_ADC_INJ_ReadConversionData12\n - * JDR4 JDATA LL_ADC_INJ_ReadConversionData12 - * @param ADCx ADC instance - * @param Rank This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_RANK_1 - * @arg @ref LL_ADC_INJ_RANK_2 - * @arg @ref LL_ADC_INJ_RANK_3 - * @arg @ref LL_ADC_INJ_RANK_4 - * @retval Value between Min_Data=0x000 and Max_Data=0xFFF - */ -__STATIC_INLINE uint16_t LL_ADC_INJ_ReadConversionData12(const ADC_TypeDef *ADCx, uint32_t Rank) -{ - __IO uint32_t const *preg = __ADC_PTR_REG_OFFSET(ADCx->JDR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JDRX_REGOFFSET_MASK)); - - return (uint16_t)(READ_BIT(*preg, - ADC_JDR1_JDATA) - ); -} - -/** - * @brief Get ADC group injected conversion data, range fit for - * ADC resolution 10 bits. - * @note For devices with feature oversampling: Oversampling - * can increase data width, function for extended range - * may be needed: @ref LL_ADC_INJ_ReadConversionData32. - * @rmtoll JDR1 JDATA LL_ADC_INJ_ReadConversionData10\n - * JDR2 JDATA LL_ADC_INJ_ReadConversionData10\n - * JDR3 JDATA LL_ADC_INJ_ReadConversionData10\n - * JDR4 JDATA LL_ADC_INJ_ReadConversionData10 - * @param ADCx ADC instance - * @param Rank This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_RANK_1 - * @arg @ref LL_ADC_INJ_RANK_2 - * @arg @ref LL_ADC_INJ_RANK_3 - * @arg @ref LL_ADC_INJ_RANK_4 - * @retval Value between Min_Data=0x000 and Max_Data=0x3FF - */ -__STATIC_INLINE uint16_t LL_ADC_INJ_ReadConversionData10(const ADC_TypeDef *ADCx, uint32_t Rank) -{ - __IO uint32_t const *preg = __ADC_PTR_REG_OFFSET(ADCx->JDR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JDRX_REGOFFSET_MASK)); - - return (uint16_t)(READ_BIT(*preg, - ADC_JDR1_JDATA) - ); -} - -/** - * @brief Get ADC group injected conversion data, range fit for - * ADC resolution 8 bits. - * @note For devices with feature oversampling: Oversampling - * can increase data width, function for extended range - * may be needed: @ref LL_ADC_INJ_ReadConversionData32. - * @rmtoll JDR1 JDATA LL_ADC_INJ_ReadConversionData8\n - * JDR2 JDATA LL_ADC_INJ_ReadConversionData8\n - * JDR3 JDATA LL_ADC_INJ_ReadConversionData8\n - * JDR4 JDATA LL_ADC_INJ_ReadConversionData8 - * @param ADCx ADC instance - * @param Rank This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_RANK_1 - * @arg @ref LL_ADC_INJ_RANK_2 - * @arg @ref LL_ADC_INJ_RANK_3 - * @arg @ref LL_ADC_INJ_RANK_4 - * @retval Value between Min_Data=0x00 and Max_Data=0xFF - */ -__STATIC_INLINE uint8_t LL_ADC_INJ_ReadConversionData8(const ADC_TypeDef *ADCx, uint32_t Rank) -{ - __IO uint32_t const *preg = __ADC_PTR_REG_OFFSET(ADCx->JDR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JDRX_REGOFFSET_MASK)); - - return (uint8_t)(READ_BIT(*preg, - ADC_JDR1_JDATA) - ); -} - -/** - * @brief Get ADC group injected conversion data, range fit for - * ADC resolution 6 bits. - * @note For devices with feature oversampling: Oversampling - * can increase data width, function for extended range - * may be needed: @ref LL_ADC_INJ_ReadConversionData32. - * @rmtoll JDR1 JDATA LL_ADC_INJ_ReadConversionData6\n - * JDR2 JDATA LL_ADC_INJ_ReadConversionData6\n - * JDR3 JDATA LL_ADC_INJ_ReadConversionData6\n - * JDR4 JDATA LL_ADC_INJ_ReadConversionData6 - * @param ADCx ADC instance - * @param Rank This parameter can be one of the following values: - * @arg @ref LL_ADC_INJ_RANK_1 - * @arg @ref LL_ADC_INJ_RANK_2 - * @arg @ref LL_ADC_INJ_RANK_3 - * @arg @ref LL_ADC_INJ_RANK_4 - * @retval Value between Min_Data=0x00 and Max_Data=0x3F - */ -__STATIC_INLINE uint8_t LL_ADC_INJ_ReadConversionData6(const ADC_TypeDef *ADCx, uint32_t Rank) -{ - __IO uint32_t const *preg = __ADC_PTR_REG_OFFSET(ADCx->JDR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JDRX_REGOFFSET_MASK)); - - return (uint8_t)(READ_BIT(*preg, - ADC_JDR1_JDATA) - ); -} - -/** - * @} - */ - -/** @defgroup ADC_LL_EF_FLAG_Management ADC flag management - * @{ - */ - -/** - * @brief Get flag ADC group regular end of unitary conversion - * or end of sequence conversions, depending on - * ADC configuration. - * @note To configure flag of end of conversion, - * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). - * @rmtoll SR EOC LL_ADC_IsActiveFlag_EOCS - * @param ADCx ADC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_EOCS(const ADC_TypeDef *ADCx) -{ - return (READ_BIT(ADCx->SR, LL_ADC_FLAG_EOCS) == (LL_ADC_FLAG_EOCS)); -} - -/** - * @brief Get flag ADC group regular overrun. - * @rmtoll SR OVR LL_ADC_IsActiveFlag_OVR - * @param ADCx ADC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_OVR(const ADC_TypeDef *ADCx) -{ - return (READ_BIT(ADCx->SR, LL_ADC_FLAG_OVR) == (LL_ADC_FLAG_OVR)); -} - - -/** - * @brief Get flag ADC group injected end of sequence conversions. - * @rmtoll SR JEOC LL_ADC_IsActiveFlag_JEOS - * @param ADCx ADC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_JEOS(const ADC_TypeDef *ADCx) -{ - /* Note: on this STM32 series, there is no flag ADC group injected */ - /* end of unitary conversion. */ - /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ - /* in other STM32 families). */ - return (READ_BIT(ADCx->SR, LL_ADC_FLAG_JEOS) == (LL_ADC_FLAG_JEOS)); -} - -/** - * @brief Get flag ADC analog watchdog 1 flag - * @rmtoll SR AWD LL_ADC_IsActiveFlag_AWD1 - * @param ADCx ADC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_AWD1(const ADC_TypeDef *ADCx) -{ - return (READ_BIT(ADCx->SR, LL_ADC_FLAG_AWD1) == (LL_ADC_FLAG_AWD1)); -} - -/** - * @brief Clear flag ADC group regular end of unitary conversion - * or end of sequence conversions, depending on - * ADC configuration. - * @note To configure flag of end of conversion, - * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). - * @rmtoll SR EOC LL_ADC_ClearFlag_EOCS - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_ClearFlag_EOCS(ADC_TypeDef *ADCx) -{ - WRITE_REG(ADCx->SR, ~LL_ADC_FLAG_EOCS); -} - -/** - * @brief Clear flag ADC group regular overrun. - * @rmtoll SR OVR LL_ADC_ClearFlag_OVR - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_ClearFlag_OVR(ADC_TypeDef *ADCx) -{ - WRITE_REG(ADCx->SR, ~LL_ADC_FLAG_OVR); -} - - -/** - * @brief Clear flag ADC group injected end of sequence conversions. - * @rmtoll SR JEOC LL_ADC_ClearFlag_JEOS - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_ClearFlag_JEOS(ADC_TypeDef *ADCx) -{ - /* Note: on this STM32 series, there is no flag ADC group injected */ - /* end of unitary conversion. */ - /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ - /* in other STM32 families). */ - WRITE_REG(ADCx->SR, ~LL_ADC_FLAG_JEOS); -} - -/** - * @brief Clear flag ADC analog watchdog 1. - * @rmtoll SR AWD LL_ADC_ClearFlag_AWD1 - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_ClearFlag_AWD1(ADC_TypeDef *ADCx) -{ - WRITE_REG(ADCx->SR, ~LL_ADC_FLAG_AWD1); -} - -#if defined(ADC_MULTIMODE_SUPPORT) -/** - * @brief Get flag multimode ADC group regular end of unitary conversion - * or end of sequence conversions, depending on - * ADC configuration, of the ADC master. - * @note To configure flag of end of conversion, - * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). - * @rmtoll CSR EOC1 LL_ADC_IsActiveFlag_MST_EOCS - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_MST_EOCS(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_EOCS_MST) == (LL_ADC_FLAG_EOCS_MST)); -} - -/** - * @brief Get flag multimode ADC group regular end of unitary conversion - * or end of sequence conversions, depending on - * ADC configuration, of the ADC slave 1. - * @note To configure flag of end of conversion, - * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). - * @rmtoll CSR EOC2 LL_ADC_IsActiveFlag_SLV1_EOCS - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV1_EOCS(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_EOCS_SLV1) == (LL_ADC_FLAG_EOCS_SLV1)); -} - -/** - * @brief Get flag multimode ADC group regular end of unitary conversion - * or end of sequence conversions, depending on - * ADC configuration, of the ADC slave 2. - * @note To configure flag of end of conversion, - * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). - * @rmtoll CSR EOC3 LL_ADC_IsActiveFlag_SLV2_EOCS - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV2_EOCS(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_EOCS_SLV2) == (LL_ADC_FLAG_EOCS_SLV2)); -} -/** - * @brief Get flag multimode ADC group regular overrun of the ADC master. - * @rmtoll CSR OVR1 LL_ADC_IsActiveFlag_MST_OVR - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_MST_OVR(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_OVR_MST) == (LL_ADC_FLAG_OVR_MST)); -} - -/** - * @brief Get flag multimode ADC group regular overrun of the ADC slave 1. - * @rmtoll CSR OVR2 LL_ADC_IsActiveFlag_SLV1_OVR - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV1_OVR(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_OVR_SLV1) == (LL_ADC_FLAG_OVR_SLV1)); -} - -/** - * @brief Get flag multimode ADC group regular overrun of the ADC slave 2. - * @rmtoll CSR OVR3 LL_ADC_IsActiveFlag_SLV2_OVR - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV2_OVR(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_OVR_SLV2) == (LL_ADC_FLAG_OVR_SLV2)); -} - - -/** - * @brief Get flag multimode ADC group injected end of sequence conversions of the ADC master. - * @rmtoll CSR JEOC LL_ADC_IsActiveFlag_MST_JEOS - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_MST_JEOS(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - /* Note: on this STM32 series, there is no flag ADC group injected */ - /* end of unitary conversion. */ - /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ - /* in other STM32 families). */ - return (READ_BIT(ADCxy_COMMON->CSR, ADC_CSR_JEOC1) == (ADC_CSR_JEOC1)); -} - -/** - * @brief Get flag multimode ADC group injected end of sequence conversions of the ADC slave 1. - * @rmtoll CSR JEOC2 LL_ADC_IsActiveFlag_SLV1_JEOS - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV1_JEOS(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - /* Note: on this STM32 series, there is no flag ADC group injected */ - /* end of unitary conversion. */ - /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ - /* in other STM32 families). */ - return (READ_BIT(ADCxy_COMMON->CSR, ADC_CSR_JEOC2) == (ADC_CSR_JEOC2)); -} - -/** - * @brief Get flag multimode ADC group injected end of sequence conversions of the ADC slave 2. - * @rmtoll CSR JEOC3 LL_ADC_IsActiveFlag_SLV2_JEOS - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV2_JEOS(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - /* Note: on this STM32 series, there is no flag ADC group injected */ - /* end of unitary conversion. */ - /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ - /* in other STM32 families). */ - return (READ_BIT(ADCxy_COMMON->CSR, ADC_CSR_JEOC3) == (ADC_CSR_JEOC3)); -} - -/** - * @brief Get flag multimode ADC analog watchdog 1 of the ADC master. - * @rmtoll CSR AWD1 LL_ADC_IsActiveFlag_MST_AWD1 - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_MST_AWD1(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_AWD1_MST) == (LL_ADC_FLAG_AWD1_MST)); -} - -/** - * @brief Get flag multimode analog watchdog 1 of the ADC slave 1. - * @rmtoll CSR AWD2 LL_ADC_IsActiveFlag_SLV1_AWD1 - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV1_AWD1(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_AWD1_SLV1) == (LL_ADC_FLAG_AWD1_SLV1)); -} - -/** - * @brief Get flag multimode analog watchdog 1 of the ADC slave 2. - * @rmtoll CSR AWD3 LL_ADC_IsActiveFlag_SLV2_AWD1 - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV2_AWD1(const ADC_Common_TypeDef *ADCxy_COMMON) -{ - return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_AWD1_SLV2) == (LL_ADC_FLAG_AWD1_SLV2)); -} - -#endif /* ADC_MULTIMODE_SUPPORT */ - -/** - * @} - */ - -/** @defgroup ADC_LL_EF_IT_Management ADC IT management - * @{ - */ - -/** - * @brief Enable interruption ADC group regular end of unitary conversion - * or end of sequence conversions, depending on - * ADC configuration. - * @note To configure flag of end of conversion, - * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). - * @rmtoll CR1 EOCIE LL_ADC_EnableIT_EOCS - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_EnableIT_EOCS(ADC_TypeDef *ADCx) -{ - SET_BIT(ADCx->CR1, LL_ADC_IT_EOCS); -} - -/** - * @brief Enable ADC group regular interruption overrun. - * @rmtoll CR1 OVRIE LL_ADC_EnableIT_OVR - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_EnableIT_OVR(ADC_TypeDef *ADCx) -{ - SET_BIT(ADCx->CR1, LL_ADC_IT_OVR); -} - - -/** - * @brief Enable interruption ADC group injected end of sequence conversions. - * @rmtoll CR1 JEOCIE LL_ADC_EnableIT_JEOS - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_EnableIT_JEOS(ADC_TypeDef *ADCx) -{ - /* Note: on this STM32 series, there is no flag ADC group injected */ - /* end of unitary conversion. */ - /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ - /* in other STM32 families). */ - SET_BIT(ADCx->CR1, LL_ADC_IT_JEOS); -} - -/** - * @brief Enable interruption ADC analog watchdog 1. - * @rmtoll CR1 AWDIE LL_ADC_EnableIT_AWD1 - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_EnableIT_AWD1(ADC_TypeDef *ADCx) -{ - SET_BIT(ADCx->CR1, LL_ADC_IT_AWD1); -} - -/** - * @brief Disable interruption ADC group regular end of unitary conversion - * or end of sequence conversions, depending on - * ADC configuration. - * @note To configure flag of end of conversion, - * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). - * @rmtoll CR1 EOCIE LL_ADC_DisableIT_EOCS - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_DisableIT_EOCS(ADC_TypeDef *ADCx) -{ - CLEAR_BIT(ADCx->CR1, LL_ADC_IT_EOCS); -} - -/** - * @brief Disable interruption ADC group regular overrun. - * @rmtoll CR1 OVRIE LL_ADC_DisableIT_OVR - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_DisableIT_OVR(ADC_TypeDef *ADCx) -{ - CLEAR_BIT(ADCx->CR1, LL_ADC_IT_OVR); -} - - -/** - * @brief Disable interruption ADC group injected end of sequence conversions. - * @rmtoll CR1 JEOCIE LL_ADC_EnableIT_JEOS - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_DisableIT_JEOS(ADC_TypeDef *ADCx) -{ - /* Note: on this STM32 series, there is no flag ADC group injected */ - /* end of unitary conversion. */ - /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ - /* in other STM32 families). */ - CLEAR_BIT(ADCx->CR1, LL_ADC_IT_JEOS); -} - -/** - * @brief Disable interruption ADC analog watchdog 1. - * @rmtoll CR1 AWDIE LL_ADC_EnableIT_AWD1 - * @param ADCx ADC instance - * @retval None - */ -__STATIC_INLINE void LL_ADC_DisableIT_AWD1(ADC_TypeDef *ADCx) -{ - CLEAR_BIT(ADCx->CR1, LL_ADC_IT_AWD1); -} - -/** - * @brief Get state of interruption ADC group regular end of unitary conversion - * or end of sequence conversions, depending on - * ADC configuration. - * @note To configure flag of end of conversion, - * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). - * (0: interrupt disabled, 1: interrupt enabled) - * @rmtoll CR1 EOCIE LL_ADC_IsEnabledIT_EOCS - * @param ADCx ADC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsEnabledIT_EOCS(const ADC_TypeDef *ADCx) -{ - return (READ_BIT(ADCx->CR1, LL_ADC_IT_EOCS) == (LL_ADC_IT_EOCS)); -} - -/** - * @brief Get state of interruption ADC group regular overrun - * (0: interrupt disabled, 1: interrupt enabled). - * @rmtoll CR1 OVRIE LL_ADC_IsEnabledIT_OVR - * @param ADCx ADC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsEnabledIT_OVR(const ADC_TypeDef *ADCx) -{ - return (READ_BIT(ADCx->CR1, LL_ADC_IT_OVR) == (LL_ADC_IT_OVR)); -} - - -/** - * @brief Get state of interruption ADC group injected end of sequence conversions - * (0: interrupt disabled, 1: interrupt enabled). - * @rmtoll CR1 JEOCIE LL_ADC_EnableIT_JEOS - * @param ADCx ADC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsEnabledIT_JEOS(const ADC_TypeDef *ADCx) -{ - /* Note: on this STM32 series, there is no flag ADC group injected */ - /* end of unitary conversion. */ - /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ - /* in other STM32 families). */ - return (READ_BIT(ADCx->CR1, LL_ADC_IT_JEOS) == (LL_ADC_IT_JEOS)); -} - -/** - * @brief Get state of interruption ADC analog watchdog 1 - * (0: interrupt disabled, 1: interrupt enabled). - * @rmtoll CR1 AWDIE LL_ADC_EnableIT_AWD1 - * @param ADCx ADC instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_ADC_IsEnabledIT_AWD1(const ADC_TypeDef *ADCx) -{ - return (READ_BIT(ADCx->CR1, LL_ADC_IT_AWD1) == (LL_ADC_IT_AWD1)); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup ADC_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -/* Initialization of some features of ADC common parameters and multimode */ -ErrorStatus LL_ADC_CommonDeInit(ADC_Common_TypeDef *ADCxy_COMMON); -ErrorStatus LL_ADC_CommonInit(ADC_Common_TypeDef *ADCxy_COMMON, LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct); -void LL_ADC_CommonStructInit(LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct); - -/* De-initialization of ADC instance, ADC group regular and ADC group injected */ -/* (availability of ADC group injected depends on STM32 families) */ -ErrorStatus LL_ADC_DeInit(ADC_TypeDef *ADCx); - -/* Initialization of some features of ADC instance */ -ErrorStatus LL_ADC_Init(ADC_TypeDef *ADCx, LL_ADC_InitTypeDef *ADC_InitStruct); -void LL_ADC_StructInit(LL_ADC_InitTypeDef *ADC_InitStruct); - -/* Initialization of some features of ADC instance and ADC group regular */ -ErrorStatus LL_ADC_REG_Init(ADC_TypeDef *ADCx, LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct); -void LL_ADC_REG_StructInit(LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct); - -/* Initialization of some features of ADC instance and ADC group injected */ -ErrorStatus LL_ADC_INJ_Init(ADC_TypeDef *ADCx, LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct); -void LL_ADC_INJ_StructInit(LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct); - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* ADC1 || ADC2 || ADC3 */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_ADC_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h deleted file mode 100644 index ce19d4d..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h +++ /dev/null @@ -1,2105 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_bus.h - * @author MCD Application Team - * @brief Header file of BUS LL module. - - @verbatim - ##### RCC Limitations ##### - ============================================================================== - [..] - A delay between an RCC peripheral clock enable and the effective peripheral - enabling should be taken into account in order to manage the peripheral read/write - from/to registers. - (+) This delay depends on the peripheral mapping. - (++) AHB & APB peripherals, 1 dummy read is necessary - - [..] - Workarounds: - (#) For AHB & APB peripherals, a dummy read to the peripheral register has been - inserted in each LL_{BUS}_GRP{x}_EnableClock() function. - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_BUS_H -#define __STM32F4xx_LL_BUS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined(RCC) - -/** @defgroup BUS_LL BUS - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup BUS_LL_Exported_Constants BUS Exported Constants - * @{ - */ - -/** @defgroup BUS_LL_EC_AHB1_GRP1_PERIPH AHB1 GRP1 PERIPH - * @{ - */ -#define LL_AHB1_GRP1_PERIPH_ALL 0xFFFFFFFFU -#define LL_AHB1_GRP1_PERIPH_GPIOA RCC_AHB1ENR_GPIOAEN -#define LL_AHB1_GRP1_PERIPH_GPIOB RCC_AHB1ENR_GPIOBEN -#define LL_AHB1_GRP1_PERIPH_GPIOC RCC_AHB1ENR_GPIOCEN -#if defined(GPIOD) -#define LL_AHB1_GRP1_PERIPH_GPIOD RCC_AHB1ENR_GPIODEN -#endif /* GPIOD */ -#if defined(GPIOE) -#define LL_AHB1_GRP1_PERIPH_GPIOE RCC_AHB1ENR_GPIOEEN -#endif /* GPIOE */ -#if defined(GPIOF) -#define LL_AHB1_GRP1_PERIPH_GPIOF RCC_AHB1ENR_GPIOFEN -#endif /* GPIOF */ -#if defined(GPIOG) -#define LL_AHB1_GRP1_PERIPH_GPIOG RCC_AHB1ENR_GPIOGEN -#endif /* GPIOG */ -#if defined(GPIOH) -#define LL_AHB1_GRP1_PERIPH_GPIOH RCC_AHB1ENR_GPIOHEN -#endif /* GPIOH */ -#if defined(GPIOI) -#define LL_AHB1_GRP1_PERIPH_GPIOI RCC_AHB1ENR_GPIOIEN -#endif /* GPIOI */ -#if defined(GPIOJ) -#define LL_AHB1_GRP1_PERIPH_GPIOJ RCC_AHB1ENR_GPIOJEN -#endif /* GPIOJ */ -#if defined(GPIOK) -#define LL_AHB1_GRP1_PERIPH_GPIOK RCC_AHB1ENR_GPIOKEN -#endif /* GPIOK */ -#define LL_AHB1_GRP1_PERIPH_CRC RCC_AHB1ENR_CRCEN -#if defined(RCC_AHB1ENR_BKPSRAMEN) -#define LL_AHB1_GRP1_PERIPH_BKPSRAM RCC_AHB1ENR_BKPSRAMEN -#endif /* RCC_AHB1ENR_BKPSRAMEN */ -#if defined(RCC_AHB1ENR_CCMDATARAMEN) -#define LL_AHB1_GRP1_PERIPH_CCMDATARAM RCC_AHB1ENR_CCMDATARAMEN -#endif /* RCC_AHB1ENR_CCMDATARAMEN */ -#define LL_AHB1_GRP1_PERIPH_DMA1 RCC_AHB1ENR_DMA1EN -#define LL_AHB1_GRP1_PERIPH_DMA2 RCC_AHB1ENR_DMA2EN -#if defined(RCC_AHB1ENR_RNGEN) -#define LL_AHB1_GRP1_PERIPH_RNG RCC_AHB1ENR_RNGEN -#endif /* RCC_AHB1ENR_RNGEN */ -#if defined(DMA2D) -#define LL_AHB1_GRP1_PERIPH_DMA2D RCC_AHB1ENR_DMA2DEN -#endif /* DMA2D */ -#if defined(ETH) -#define LL_AHB1_GRP1_PERIPH_ETHMAC RCC_AHB1ENR_ETHMACEN -#define LL_AHB1_GRP1_PERIPH_ETHMACTX RCC_AHB1ENR_ETHMACTXEN -#define LL_AHB1_GRP1_PERIPH_ETHMACRX RCC_AHB1ENR_ETHMACRXEN -#define LL_AHB1_GRP1_PERIPH_ETHMACPTP RCC_AHB1ENR_ETHMACPTPEN -#endif /* ETH */ -#if defined(USB_OTG_HS) -#define LL_AHB1_GRP1_PERIPH_OTGHS RCC_AHB1ENR_OTGHSEN -#define LL_AHB1_GRP1_PERIPH_OTGHSULPI RCC_AHB1ENR_OTGHSULPIEN -#endif /* USB_OTG_HS */ -#define LL_AHB1_GRP1_PERIPH_FLITF RCC_AHB1LPENR_FLITFLPEN -#define LL_AHB1_GRP1_PERIPH_SRAM1 RCC_AHB1LPENR_SRAM1LPEN -#if defined(RCC_AHB1LPENR_SRAM2LPEN) -#define LL_AHB1_GRP1_PERIPH_SRAM2 RCC_AHB1LPENR_SRAM2LPEN -#endif /* RCC_AHB1LPENR_SRAM2LPEN */ -#if defined(RCC_AHB1LPENR_SRAM3LPEN) -#define LL_AHB1_GRP1_PERIPH_SRAM3 RCC_AHB1LPENR_SRAM3LPEN -#endif /* RCC_AHB1LPENR_SRAM3LPEN */ -/** - * @} - */ - -#if defined(RCC_AHB2_SUPPORT) -/** @defgroup BUS_LL_EC_AHB2_GRP1_PERIPH AHB2 GRP1 PERIPH - * @{ - */ -#define LL_AHB2_GRP1_PERIPH_ALL 0xFFFFFFFFU -#if defined(DCMI) -#define LL_AHB2_GRP1_PERIPH_DCMI RCC_AHB2ENR_DCMIEN -#endif /* DCMI */ -#if defined(CRYP) -#define LL_AHB2_GRP1_PERIPH_CRYP RCC_AHB2ENR_CRYPEN -#endif /* CRYP */ -#if defined(AES) -#define LL_AHB2_GRP1_PERIPH_AES RCC_AHB2ENR_AESEN -#endif /* AES */ -#if defined(HASH) -#define LL_AHB2_GRP1_PERIPH_HASH RCC_AHB2ENR_HASHEN -#endif /* HASH */ -#if defined(RCC_AHB2ENR_RNGEN) -#define LL_AHB2_GRP1_PERIPH_RNG RCC_AHB2ENR_RNGEN -#endif /* RCC_AHB2ENR_RNGEN */ -#if defined(USB_OTG_FS) -#define LL_AHB2_GRP1_PERIPH_OTGFS RCC_AHB2ENR_OTGFSEN -#endif /* USB_OTG_FS */ -/** - * @} - */ -#endif /* RCC_AHB2_SUPPORT */ - -#if defined(RCC_AHB3_SUPPORT) -/** @defgroup BUS_LL_EC_AHB3_GRP1_PERIPH AHB3 GRP1 PERIPH - * @{ - */ -#define LL_AHB3_GRP1_PERIPH_ALL 0xFFFFFFFFU -#if defined(FSMC_Bank1) -#define LL_AHB3_GRP1_PERIPH_FSMC RCC_AHB3ENR_FSMCEN -#endif /* FSMC_Bank1 */ -#if defined(FMC_Bank1) -#define LL_AHB3_GRP1_PERIPH_FMC RCC_AHB3ENR_FMCEN -#endif /* FMC_Bank1 */ -#if defined(QUADSPI) -#define LL_AHB3_GRP1_PERIPH_QSPI RCC_AHB3ENR_QSPIEN -#endif /* QUADSPI */ -/** - * @} - */ -#endif /* RCC_AHB3_SUPPORT */ - -/** @defgroup BUS_LL_EC_APB1_GRP1_PERIPH APB1 GRP1 PERIPH - * @{ - */ -#define LL_APB1_GRP1_PERIPH_ALL 0xFFFFFFFFU -#if defined(TIM2) -#define LL_APB1_GRP1_PERIPH_TIM2 RCC_APB1ENR_TIM2EN -#endif /* TIM2 */ -#if defined(TIM3) -#define LL_APB1_GRP1_PERIPH_TIM3 RCC_APB1ENR_TIM3EN -#endif /* TIM3 */ -#if defined(TIM4) -#define LL_APB1_GRP1_PERIPH_TIM4 RCC_APB1ENR_TIM4EN -#endif /* TIM4 */ -#define LL_APB1_GRP1_PERIPH_TIM5 RCC_APB1ENR_TIM5EN -#if defined(TIM6) -#define LL_APB1_GRP1_PERIPH_TIM6 RCC_APB1ENR_TIM6EN -#endif /* TIM6 */ -#if defined(TIM7) -#define LL_APB1_GRP1_PERIPH_TIM7 RCC_APB1ENR_TIM7EN -#endif /* TIM7 */ -#if defined(TIM12) -#define LL_APB1_GRP1_PERIPH_TIM12 RCC_APB1ENR_TIM12EN -#endif /* TIM12 */ -#if defined(TIM13) -#define LL_APB1_GRP1_PERIPH_TIM13 RCC_APB1ENR_TIM13EN -#endif /* TIM13 */ -#if defined(TIM14) -#define LL_APB1_GRP1_PERIPH_TIM14 RCC_APB1ENR_TIM14EN -#endif /* TIM14 */ -#if defined(LPTIM1) -#define LL_APB1_GRP1_PERIPH_LPTIM1 RCC_APB1ENR_LPTIM1EN -#endif /* LPTIM1 */ -#if defined(RCC_APB1ENR_RTCAPBEN) -#define LL_APB1_GRP1_PERIPH_RTCAPB RCC_APB1ENR_RTCAPBEN -#endif /* RCC_APB1ENR_RTCAPBEN */ -#define LL_APB1_GRP1_PERIPH_WWDG RCC_APB1ENR_WWDGEN -#if defined(SPI2) -#define LL_APB1_GRP1_PERIPH_SPI2 RCC_APB1ENR_SPI2EN -#endif /* SPI2 */ -#if defined(SPI3) -#define LL_APB1_GRP1_PERIPH_SPI3 RCC_APB1ENR_SPI3EN -#endif /* SPI3 */ -#if defined(SPDIFRX) -#define LL_APB1_GRP1_PERIPH_SPDIFRX RCC_APB1ENR_SPDIFRXEN -#endif /* SPDIFRX */ -#define LL_APB1_GRP1_PERIPH_USART2 RCC_APB1ENR_USART2EN -#if defined(USART3) -#define LL_APB1_GRP1_PERIPH_USART3 RCC_APB1ENR_USART3EN -#endif /* USART3 */ -#if defined(UART4) -#define LL_APB1_GRP1_PERIPH_UART4 RCC_APB1ENR_UART4EN -#endif /* UART4 */ -#if defined(UART5) -#define LL_APB1_GRP1_PERIPH_UART5 RCC_APB1ENR_UART5EN -#endif /* UART5 */ -#define LL_APB1_GRP1_PERIPH_I2C1 RCC_APB1ENR_I2C1EN -#define LL_APB1_GRP1_PERIPH_I2C2 RCC_APB1ENR_I2C2EN -#if defined(I2C3) -#define LL_APB1_GRP1_PERIPH_I2C3 RCC_APB1ENR_I2C3EN -#endif /* I2C3 */ -#if defined(FMPI2C1) -#define LL_APB1_GRP1_PERIPH_FMPI2C1 RCC_APB1ENR_FMPI2C1EN -#endif /* FMPI2C1 */ -#if defined(CAN1) -#define LL_APB1_GRP1_PERIPH_CAN1 RCC_APB1ENR_CAN1EN -#endif /* CAN1 */ -#if defined(CAN2) -#define LL_APB1_GRP1_PERIPH_CAN2 RCC_APB1ENR_CAN2EN -#endif /* CAN2 */ -#if defined(CAN3) -#define LL_APB1_GRP1_PERIPH_CAN3 RCC_APB1ENR_CAN3EN -#endif /* CAN3 */ -#if defined(CEC) -#define LL_APB1_GRP1_PERIPH_CEC RCC_APB1ENR_CECEN -#endif /* CEC */ -#define LL_APB1_GRP1_PERIPH_PWR RCC_APB1ENR_PWREN -#if defined(DAC1) -#define LL_APB1_GRP1_PERIPH_DAC1 RCC_APB1ENR_DACEN -#endif /* DAC1 */ -#if defined(UART7) -#define LL_APB1_GRP1_PERIPH_UART7 RCC_APB1ENR_UART7EN -#endif /* UART7 */ -#if defined(UART8) -#define LL_APB1_GRP1_PERIPH_UART8 RCC_APB1ENR_UART8EN -#endif /* UART8 */ -/** - * @} - */ - -/** @defgroup BUS_LL_EC_APB2_GRP1_PERIPH APB2 GRP1 PERIPH - * @{ - */ -#define LL_APB2_GRP1_PERIPH_ALL 0xFFFFFFFFU -#define LL_APB2_GRP1_PERIPH_TIM1 RCC_APB2ENR_TIM1EN -#if defined(TIM8) -#define LL_APB2_GRP1_PERIPH_TIM8 RCC_APB2ENR_TIM8EN -#endif /* TIM8 */ -#define LL_APB2_GRP1_PERIPH_USART1 RCC_APB2ENR_USART1EN -#if defined(USART6) -#define LL_APB2_GRP1_PERIPH_USART6 RCC_APB2ENR_USART6EN -#endif /* USART6 */ -#if defined(UART9) -#define LL_APB2_GRP1_PERIPH_UART9 RCC_APB2ENR_UART9EN -#endif /* UART9 */ -#if defined(UART10) -#define LL_APB2_GRP1_PERIPH_UART10 RCC_APB2ENR_UART10EN -#endif /* UART10 */ -#define LL_APB2_GRP1_PERIPH_ADC1 RCC_APB2ENR_ADC1EN -#if defined(ADC2) -#define LL_APB2_GRP1_PERIPH_ADC2 RCC_APB2ENR_ADC2EN -#endif /* ADC2 */ -#if defined(ADC3) -#define LL_APB2_GRP1_PERIPH_ADC3 RCC_APB2ENR_ADC3EN -#endif /* ADC3 */ -#if defined(SDIO) -#define LL_APB2_GRP1_PERIPH_SDIO RCC_APB2ENR_SDIOEN -#endif /* SDIO */ -#define LL_APB2_GRP1_PERIPH_SPI1 RCC_APB2ENR_SPI1EN -#if defined(SPI4) -#define LL_APB2_GRP1_PERIPH_SPI4 RCC_APB2ENR_SPI4EN -#endif /* SPI4 */ -#define LL_APB2_GRP1_PERIPH_SYSCFG RCC_APB2ENR_SYSCFGEN -#if defined(RCC_APB2ENR_EXTITEN) -#define LL_APB2_GRP1_PERIPH_EXTI RCC_APB2ENR_EXTITEN -#endif /* RCC_APB2ENR_EXTITEN */ -#define LL_APB2_GRP1_PERIPH_TIM9 RCC_APB2ENR_TIM9EN -#if defined(TIM10) -#define LL_APB2_GRP1_PERIPH_TIM10 RCC_APB2ENR_TIM10EN -#endif /* TIM10 */ -#define LL_APB2_GRP1_PERIPH_TIM11 RCC_APB2ENR_TIM11EN -#if defined(SPI5) -#define LL_APB2_GRP1_PERIPH_SPI5 RCC_APB2ENR_SPI5EN -#endif /* SPI5 */ -#if defined(SPI6) -#define LL_APB2_GRP1_PERIPH_SPI6 RCC_APB2ENR_SPI6EN -#endif /* SPI6 */ -#if defined(SAI1) -#define LL_APB2_GRP1_PERIPH_SAI1 RCC_APB2ENR_SAI1EN -#endif /* SAI1 */ -#if defined(SAI2) -#define LL_APB2_GRP1_PERIPH_SAI2 RCC_APB2ENR_SAI2EN -#endif /* SAI2 */ -#if defined(LTDC) -#define LL_APB2_GRP1_PERIPH_LTDC RCC_APB2ENR_LTDCEN -#endif /* LTDC */ -#if defined(DSI) -#define LL_APB2_GRP1_PERIPH_DSI RCC_APB2ENR_DSIEN -#endif /* DSI */ -#if defined(DFSDM1_Channel0) -#define LL_APB2_GRP1_PERIPH_DFSDM1 RCC_APB2ENR_DFSDM1EN -#endif /* DFSDM1_Channel0 */ -#if defined(DFSDM2_Channel0) -#define LL_APB2_GRP1_PERIPH_DFSDM2 RCC_APB2ENR_DFSDM2EN -#endif /* DFSDM2_Channel0 */ -#define LL_APB2_GRP1_PERIPH_ADC RCC_APB2RSTR_ADCRST -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup BUS_LL_Exported_Functions BUS Exported Functions - * @{ - */ - -/** @defgroup BUS_LL_EF_AHB1 AHB1 - * @{ - */ - -/** - * @brief Enable AHB1 peripherals clock. - * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOBEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOCEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIODEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOEEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOFEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOGEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOHEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOIEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOJEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOKEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR CRCEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR DMA1EN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR DMA2EN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR RNGEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR DMA2DEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR ETHMACEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR OTGHSEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB1ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB1ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if AHB1 peripheral clock is enabled or not - * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOBEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOCEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIODEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOEEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOFEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOGEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOHEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOIEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOJEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOKEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR CRCEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR DMA1EN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR DMA2EN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR RNGEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR DMA2DEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR ETHMACEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR OTGHSEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_AHB1_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->AHB1ENR, Periphs) == Periphs); -} - -/** - * @brief Disable AHB1 peripherals clock. - * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOBEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOCEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIODEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOEEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOFEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOGEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOHEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOIEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOJEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOKEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR CRCEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR DMA1EN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR DMA2EN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR RNGEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR DMA2DEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR ETHMACEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR OTGHSEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB1ENR, Periphs); -} - -/** - * @brief Force AHB1 peripherals reset. - * @rmtoll AHB1RSTR GPIOARST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOBRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOCRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIODRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOERST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOFRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOGRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOHRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOIRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOJRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOKRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR CRCRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR DMA1RST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR DMA2RST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR RNGRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR DMA2DRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR ETHMACRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR OTGHSRST LL_AHB1_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_ALL - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->AHB1RSTR, Periphs); -} - -/** - * @brief Release AHB1 peripherals reset. - * @rmtoll AHB1RSTR GPIOARST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOBRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOCRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIODRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOERST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOFRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOGRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOHRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOIRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOJRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOKRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR CRCRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR DMA1RST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR DMA2RST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR RNGRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR DMA2DRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR ETHMACRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR OTGHSRST LL_AHB1_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_ALL - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB1RSTR, Periphs); -} - -/** - * @brief Enable AHB1 peripheral clocks in low-power mode - * @rmtoll AHB1LPENR GPIOALPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOBLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOCLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIODLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOELPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOFLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOGLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOHLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOILPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOJLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOKLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR CRCLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR FLITFLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR SRAM1LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR SRAM2LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR SRAM3LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR DMA1LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR DMA2LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR DMA2DLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR RNGLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR ETHMACLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR ETHMACTXLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR ETHMACRXLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR ETHMACPTPLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR OTGHSLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR OTGHSULPILPEN LL_AHB1_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_FLITF - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM1 - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM2 (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM3 (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB1LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB1LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable AHB1 peripheral clocks in low-power mode - * @rmtoll AHB1LPENR GPIOALPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOBLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOCLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIODLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOELPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOFLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOGLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOHLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOILPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOJLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOKLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR CRCLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR FLITFLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR SRAM1LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR SRAM2LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR SRAM3LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR DMA1LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR DMA2LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR DMA2DLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR RNGLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR ETHMACLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR ETHMACTXLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR ETHMACRXLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR ETHMACPTPLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR OTGHSLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR OTGHSULPILPEN LL_AHB1_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_FLITF - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM1 - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM2 (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM3 (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB1LPENR, Periphs); -} - -/** - * @} - */ - -#if defined(RCC_AHB2_SUPPORT) -/** @defgroup BUS_LL_EF_AHB2 AHB2 - * @{ - */ - -/** - * @brief Enable AHB2 peripherals clock. - * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR CRYPEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR AESEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR HASHEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR RNGEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR OTGFSEN LL_AHB2_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB2ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB2ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if AHB2 peripheral clock is enabled or not - * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR CRYPEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR AESEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR HASHEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR RNGEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR OTGFSEN LL_AHB2_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_AHB2_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->AHB2ENR, Periphs) == Periphs); -} - -/** - * @brief Disable AHB2 peripherals clock. - * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR CRYPEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR AESEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR HASHEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR RNGEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR OTGFSEN LL_AHB2_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB2ENR, Periphs); -} - -/** - * @brief Force AHB2 peripherals reset. - * @rmtoll AHB2RSTR DCMIRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR CRYPRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR AESRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR HASHRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR RNGRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR OTGFSRST LL_AHB2_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_ALL - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->AHB2RSTR, Periphs); -} - -/** - * @brief Release AHB2 peripherals reset. - * @rmtoll AHB2RSTR DCMIRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR CRYPRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR AESRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR HASHRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR RNGRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR OTGFSRST LL_AHB2_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_ALL - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB2RSTR, Periphs); -} - -/** - * @brief Enable AHB2 peripheral clocks in low-power mode - * @rmtoll AHB2LPENR DCMILPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR CRYPLPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR AESLPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR HASHLPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR RNGLPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR OTGFSLPEN LL_AHB2_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB2LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB2LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable AHB2 peripheral clocks in low-power mode - * @rmtoll AHB2LPENR DCMILPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR CRYPLPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR AESLPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR HASHLPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR RNGLPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR OTGFSLPEN LL_AHB2_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB2LPENR, Periphs); -} - -/** - * @} - */ -#endif /* RCC_AHB2_SUPPORT */ - -#if defined(RCC_AHB3_SUPPORT) -/** @defgroup BUS_LL_EF_AHB3 AHB3 - * @{ - */ - -/** - * @brief Enable AHB3 peripherals clock. - * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_EnableClock\n - * AHB3ENR FSMCEN LL_AHB3_GRP1_EnableClock\n - * AHB3ENR QSPIEN LL_AHB3_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB3ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB3ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if AHB3 peripheral clock is enabled or not - * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_IsEnabledClock\n - * AHB3ENR FSMCEN LL_AHB3_GRP1_IsEnabledClock\n - * AHB3ENR QSPIEN LL_AHB3_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_AHB3_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->AHB3ENR, Periphs) == Periphs); -} - -/** - * @brief Disable AHB3 peripherals clock. - * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_DisableClock\n - * AHB3ENR FSMCEN LL_AHB3_GRP1_DisableClock\n - * AHB3ENR QSPIEN LL_AHB3_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB3ENR, Periphs); -} - -/** - * @brief Force AHB3 peripherals reset. - * @rmtoll AHB3RSTR FMCRST LL_AHB3_GRP1_ForceReset\n - * AHB3RSTR FSMCRST LL_AHB3_GRP1_ForceReset\n - * AHB3RSTR QSPIRST LL_AHB3_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_ALL - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->AHB3RSTR, Periphs); -} - -/** - * @brief Release AHB3 peripherals reset. - * @rmtoll AHB3RSTR FMCRST LL_AHB3_GRP1_ReleaseReset\n - * AHB3RSTR FSMCRST LL_AHB3_GRP1_ReleaseReset\n - * AHB3RSTR QSPIRST LL_AHB3_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_ALL - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB3RSTR, Periphs); -} - -/** - * @brief Enable AHB3 peripheral clocks in low-power mode - * @rmtoll AHB3LPENR FMCLPEN LL_AHB3_GRP1_EnableClockLowPower\n - * AHB3LPENR FSMCLPEN LL_AHB3_GRP1_EnableClockLowPower\n - * AHB3LPENR QSPILPEN LL_AHB3_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB3LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB3LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable AHB3 peripheral clocks in low-power mode - * @rmtoll AHB3LPENR FMCLPEN LL_AHB3_GRP1_DisableClockLowPower\n - * AHB3LPENR FSMCLPEN LL_AHB3_GRP1_DisableClockLowPower\n - * AHB3LPENR QSPILPEN LL_AHB3_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB3LPENR, Periphs); -} - -/** - * @} - */ -#endif /* RCC_AHB3_SUPPORT */ - -/** @defgroup BUS_LL_EF_APB1 APB1 - * @{ - */ - -/** - * @brief Enable APB1 peripherals clock. - * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM4EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM5EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM6EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM7EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM12EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM13EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM14EN LL_APB1_GRP1_EnableClock\n - * APB1ENR LPTIM1EN LL_APB1_GRP1_EnableClock\n - * APB1ENR WWDGEN LL_APB1_GRP1_EnableClock\n - * APB1ENR SPI2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR SPI3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR SPDIFRXEN LL_APB1_GRP1_EnableClock\n - * APB1ENR USART2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR USART3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR UART4EN LL_APB1_GRP1_EnableClock\n - * APB1ENR UART5EN LL_APB1_GRP1_EnableClock\n - * APB1ENR I2C1EN LL_APB1_GRP1_EnableClock\n - * APB1ENR I2C2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR I2C3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR FMPI2C1EN LL_APB1_GRP1_EnableClock\n - * APB1ENR CAN1EN LL_APB1_GRP1_EnableClock\n - * APB1ENR CAN2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR CAN3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR CECEN LL_APB1_GRP1_EnableClock\n - * APB1ENR PWREN LL_APB1_GRP1_EnableClock\n - * APB1ENR DACEN LL_APB1_GRP1_EnableClock\n - * APB1ENR UART7EN LL_APB1_GRP1_EnableClock\n - * APB1ENR UART8EN LL_APB1_GRP1_EnableClock\n - * APB1ENR RTCAPBEN LL_APB1_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->APB1ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->APB1ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if APB1 peripheral clock is enabled or not - * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM4EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM5EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM6EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM7EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM12EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM13EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM14EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR LPTIM1EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR WWDGEN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR SPI2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR SPI3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR SPDIFRXEN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR USART2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR USART3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR UART4EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR UART5EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR I2C1EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR I2C2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR I2C3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR FMPI2C1EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR CAN1EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR CAN2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR CAN3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR CECEN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR PWREN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR DACEN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR UART7EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR UART8EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR RTCAPBEN LL_APB1_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_APB1_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->APB1ENR, Periphs) == Periphs); -} - -/** - * @brief Disable APB1 peripherals clock. - * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM4EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM5EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM6EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM7EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM12EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM13EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM14EN LL_APB1_GRP1_DisableClock\n - * APB1ENR LPTIM1EN LL_APB1_GRP1_DisableClock\n - * APB1ENR WWDGEN LL_APB1_GRP1_DisableClock\n - * APB1ENR SPI2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR SPI3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR SPDIFRXEN LL_APB1_GRP1_DisableClock\n - * APB1ENR USART2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR USART3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR UART4EN LL_APB1_GRP1_DisableClock\n - * APB1ENR UART5EN LL_APB1_GRP1_DisableClock\n - * APB1ENR I2C1EN LL_APB1_GRP1_DisableClock\n - * APB1ENR I2C2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR I2C3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR FMPI2C1EN LL_APB1_GRP1_DisableClock\n - * APB1ENR CAN1EN LL_APB1_GRP1_DisableClock\n - * APB1ENR CAN2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR CAN3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR CECEN LL_APB1_GRP1_DisableClock\n - * APB1ENR PWREN LL_APB1_GRP1_DisableClock\n - * APB1ENR DACEN LL_APB1_GRP1_DisableClock\n - * APB1ENR UART7EN LL_APB1_GRP1_DisableClock\n - * APB1ENR UART8EN LL_APB1_GRP1_DisableClock\n - * APB1ENR RTCAPBEN LL_APB1_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB1ENR, Periphs); -} - -/** - * @brief Force APB1 peripherals reset. - * @rmtoll APB1RSTR TIM2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM4RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM5RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM6RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM7RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM12RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM13RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM14RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR LPTIM1RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR WWDGRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR SPI2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR SPI3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR SPDIFRXRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR USART2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR USART3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR UART4RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR UART5RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR I2C1RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR I2C2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR I2C3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR FMPI2C1RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR CAN1RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR CAN2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR CAN3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR CECRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR PWRRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR DACRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR UART7RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR UART8RST LL_APB1_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->APB1RSTR, Periphs); -} - -/** - * @brief Release APB1 peripherals reset. - * @rmtoll APB1RSTR TIM2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM4RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM5RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM6RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM7RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM12RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM13RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM14RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR LPTIM1RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR WWDGRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR SPI2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR SPI3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR SPDIFRXRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR USART2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR USART3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR UART4RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR UART5RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR I2C1RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR I2C2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR I2C3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR FMPI2C1RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR CAN1RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR CAN2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR CAN3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR CECRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR PWRRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR DACRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR UART7RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR UART8RST LL_APB1_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB1RSTR, Periphs); -} - -/** - * @brief Enable APB1 peripheral clocks in low-power mode - * @rmtoll APB1LPENR TIM2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM4LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM5LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM6LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM7LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM12LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM13LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM14LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR LPTIM1LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR WWDGLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR SPI2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR SPI3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR SPDIFRXLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR USART2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR USART3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR UART4LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR UART5LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR I2C1LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR I2C2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR I2C3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR FMPI2C1LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR CAN1LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR CAN2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR CAN3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR CECLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR PWRLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR DACLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR UART7LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR UART8LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR RTCAPBLPEN LL_APB1_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->APB1LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->APB1LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable APB1 peripheral clocks in low-power mode - * @rmtoll APB1LPENR TIM2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM4LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM5LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM6LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM7LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM12LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM13LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM14LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR LPTIM1LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR WWDGLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR SPI2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR SPI3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR SPDIFRXLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR USART2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR USART3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR UART4LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR UART5LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR I2C1LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR I2C2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR I2C3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR FMPI2C1LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR CAN1LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR CAN2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR CAN3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR CECLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR PWRLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR DACLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR UART7LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR UART8LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR RTCAPBLPEN LL_APB1_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB1LPENR, Periphs); -} - -/** - * @} - */ - -/** @defgroup BUS_LL_EF_APB2 APB2 - * @{ - */ - -/** - * @brief Enable APB2 peripherals clock. - * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR TIM8EN LL_APB2_GRP1_EnableClock\n - * APB2ENR USART1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR USART6EN LL_APB2_GRP1_EnableClock\n - * APB2ENR UART9EN LL_APB2_GRP1_EnableClock\n - * APB2ENR UART10EN LL_APB2_GRP1_EnableClock\n - * APB2ENR ADC1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR ADC2EN LL_APB2_GRP1_EnableClock\n - * APB2ENR ADC3EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SDIOEN LL_APB2_GRP1_EnableClock\n - * APB2ENR SPI1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SPI4EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SYSCFGEN LL_APB2_GRP1_EnableClock\n - * APB2ENR EXTITEN LL_APB2_GRP1_EnableClock\n - * APB2ENR TIM9EN LL_APB2_GRP1_EnableClock\n - * APB2ENR TIM10EN LL_APB2_GRP1_EnableClock\n - * APB2ENR TIM11EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SPI5EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SPI6EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SAI1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SAI2EN LL_APB2_GRP1_EnableClock\n - * APB2ENR LTDCEN LL_APB2_GRP1_EnableClock\n - * APB2ENR DSIEN LL_APB2_GRP1_EnableClock\n - * APB2ENR DFSDM1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR DFSDM2EN LL_APB2_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->APB2ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->APB2ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if APB2 peripheral clock is enabled or not - * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR TIM8EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR USART1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR USART6EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR UART9EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR UART10EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR ADC1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR ADC2EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR ADC3EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SDIOEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SPI1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SPI4EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SYSCFGEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR EXTITEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR TIM9EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR TIM10EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR TIM11EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SPI5EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SPI6EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SAI1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SAI2EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR LTDCEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR DSIEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR DFSDM1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR DFSDM2EN LL_APB2_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_APB2_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->APB2ENR, Periphs) == Periphs); -} - -/** - * @brief Disable APB2 peripherals clock. - * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR TIM8EN LL_APB2_GRP1_DisableClock\n - * APB2ENR USART1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR USART6EN LL_APB2_GRP1_DisableClock\n - * APB2ENR UART9EN LL_APB2_GRP1_DisableClock\n - * APB2ENR UART10EN LL_APB2_GRP1_DisableClock\n - * APB2ENR ADC1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR ADC2EN LL_APB2_GRP1_DisableClock\n - * APB2ENR ADC3EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SDIOEN LL_APB2_GRP1_DisableClock\n - * APB2ENR SPI1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SPI4EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SYSCFGEN LL_APB2_GRP1_DisableClock\n - * APB2ENR EXTITEN LL_APB2_GRP1_DisableClock\n - * APB2ENR TIM9EN LL_APB2_GRP1_DisableClock\n - * APB2ENR TIM10EN LL_APB2_GRP1_DisableClock\n - * APB2ENR TIM11EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SPI5EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SPI6EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SAI1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SAI2EN LL_APB2_GRP1_DisableClock\n - * APB2ENR LTDCEN LL_APB2_GRP1_DisableClock\n - * APB2ENR DSIEN LL_APB2_GRP1_DisableClock\n - * APB2ENR DFSDM1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR DFSDM2EN LL_APB2_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB2ENR, Periphs); -} - -/** - * @brief Force APB2 peripherals reset. - * @rmtoll APB2RSTR TIM1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR TIM8RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR USART1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR USART6RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR UART9RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR UART10RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR ADCRST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SDIORST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SPI1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SPI4RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SYSCFGRST LL_APB2_GRP1_ForceReset\n - * APB2RSTR TIM9RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR TIM10RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR TIM11RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SPI5RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SPI6RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SAI1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SAI2RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR LTDCRST LL_APB2_GRP1_ForceReset\n - * APB2RSTR DSIRST LL_APB2_GRP1_ForceReset\n - * APB2RSTR DFSDM1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR DFSDM2RST LL_APB2_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_ALL - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->APB2RSTR, Periphs); -} - -/** - * @brief Release APB2 peripherals reset. - * @rmtoll APB2RSTR TIM1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR TIM8RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR USART1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR USART6RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR UART9RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR UART10RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR ADCRST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SDIORST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SPI1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SPI4RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SYSCFGRST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR TIM9RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR TIM10RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR TIM11RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SPI5RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SPI6RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SAI1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SAI2RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR LTDCRST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR DSIRST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR DFSDM1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR DFSDM2RST LL_APB2_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_ALL - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB2RSTR, Periphs); -} - -/** - * @brief Enable APB2 peripheral clocks in low-power mode - * @rmtoll APB2LPENR TIM1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR TIM8LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR USART1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR USART6LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR UART9LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR UART10LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR ADC1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR ADC2LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR ADC3LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SDIOLPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SPI1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SPI4LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SYSCFGLPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR EXTITLPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR TIM9LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR TIM10LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR TIM11LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SPI5LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SPI6LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SAI1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SAI2LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR LTDCLPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR DSILPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR DFSDM1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR DSILPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR DFSDM2LPEN LL_APB2_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->APB2LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->APB2LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable APB2 peripheral clocks in low-power mode - * @rmtoll APB2LPENR TIM1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR TIM8LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR USART1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR USART6LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR UART9LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR UART10LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR ADC1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR ADC2LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR ADC3LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SDIOLPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SPI1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SPI4LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SYSCFGLPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR EXTITLPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR TIM9LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR TIM10LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR TIM11LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SPI5LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SPI6LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SAI1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SAI2LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR LTDCLPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR DSILPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR DFSDM1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR DSILPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR DFSDM2LPEN LL_APB2_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB2LPENR, Periphs); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined(RCC) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_BUS_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h deleted file mode 100644 index 9a183ea..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h +++ /dev/null @@ -1,647 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_cortex.h - * @author MCD Application Team - * @brief Header file of CORTEX LL module. - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The LL CORTEX driver contains a set of generic APIs that can be - used by user: - (+) SYSTICK configuration used by LL_mDelay and LL_Init1msTick - functions - (+) Low power mode configuration (SCB register of Cortex-MCU) - (+) MPU API to configure and enable regions - (MPU services provided only on some devices) - (+) API to access to MCU info (CPUID register) - (+) API to enable fault handler (SHCSR accesses) - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_CORTEX_H -#define __STM32F4xx_LL_CORTEX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -/** @defgroup CORTEX_LL CORTEX - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ - -/* Private macros ------------------------------------------------------------*/ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup CORTEX_LL_Exported_Constants CORTEX Exported Constants - * @{ - */ - -/** @defgroup CORTEX_LL_EC_CLKSOURCE_HCLK SYSTICK Clock Source - * @{ - */ -#define LL_SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U /*!< AHB clock divided by 8 selected as SysTick clock source.*/ -#define LL_SYSTICK_CLKSOURCE_HCLK SysTick_CTRL_CLKSOURCE_Msk /*!< AHB clock selected as SysTick clock source. */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_FAULT Handler Fault type - * @{ - */ -#define LL_HANDLER_FAULT_USG SCB_SHCSR_USGFAULTENA_Msk /*!< Usage fault */ -#define LL_HANDLER_FAULT_BUS SCB_SHCSR_BUSFAULTENA_Msk /*!< Bus fault */ -#define LL_HANDLER_FAULT_MEM SCB_SHCSR_MEMFAULTENA_Msk /*!< Memory management fault */ -/** - * @} - */ - -#if __MPU_PRESENT - -/** @defgroup CORTEX_LL_EC_CTRL_HFNMI_PRIVDEF MPU Control - * @{ - */ -#define LL_MPU_CTRL_HFNMI_PRIVDEF_NONE 0x00000000U /*!< Disable NMI and privileged SW access */ -#define LL_MPU_CTRL_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk /*!< Enables the operation of MPU during hard fault, NMI, and FAULTMASK handlers */ -#define LL_MPU_CTRL_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk /*!< Enable privileged software access to default memory map */ -#define LL_MPU_CTRL_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) /*!< Enable NMI and privileged SW access */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_REGION MPU Region Number - * @{ - */ -#define LL_MPU_REGION_NUMBER0 0x00U /*!< REGION Number 0 */ -#define LL_MPU_REGION_NUMBER1 0x01U /*!< REGION Number 1 */ -#define LL_MPU_REGION_NUMBER2 0x02U /*!< REGION Number 2 */ -#define LL_MPU_REGION_NUMBER3 0x03U /*!< REGION Number 3 */ -#define LL_MPU_REGION_NUMBER4 0x04U /*!< REGION Number 4 */ -#define LL_MPU_REGION_NUMBER5 0x05U /*!< REGION Number 5 */ -#define LL_MPU_REGION_NUMBER6 0x06U /*!< REGION Number 6 */ -#define LL_MPU_REGION_NUMBER7 0x07U /*!< REGION Number 7 */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_REGION_SIZE MPU Region Size - * @{ - */ -#define LL_MPU_REGION_SIZE_32B (0x04U << MPU_RASR_SIZE_Pos) /*!< 32B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_64B (0x05U << MPU_RASR_SIZE_Pos) /*!< 64B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_128B (0x06U << MPU_RASR_SIZE_Pos) /*!< 128B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_256B (0x07U << MPU_RASR_SIZE_Pos) /*!< 256B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_512B (0x08U << MPU_RASR_SIZE_Pos) /*!< 512B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_1KB (0x09U << MPU_RASR_SIZE_Pos) /*!< 1KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_2KB (0x0AU << MPU_RASR_SIZE_Pos) /*!< 2KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_4KB (0x0BU << MPU_RASR_SIZE_Pos) /*!< 4KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_8KB (0x0CU << MPU_RASR_SIZE_Pos) /*!< 8KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_16KB (0x0DU << MPU_RASR_SIZE_Pos) /*!< 16KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_32KB (0x0EU << MPU_RASR_SIZE_Pos) /*!< 32KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_64KB (0x0FU << MPU_RASR_SIZE_Pos) /*!< 64KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_128KB (0x10U << MPU_RASR_SIZE_Pos) /*!< 128KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_256KB (0x11U << MPU_RASR_SIZE_Pos) /*!< 256KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_512KB (0x12U << MPU_RASR_SIZE_Pos) /*!< 512KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_1MB (0x13U << MPU_RASR_SIZE_Pos) /*!< 1MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_2MB (0x14U << MPU_RASR_SIZE_Pos) /*!< 2MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_4MB (0x15U << MPU_RASR_SIZE_Pos) /*!< 4MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_8MB (0x16U << MPU_RASR_SIZE_Pos) /*!< 8MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_16MB (0x17U << MPU_RASR_SIZE_Pos) /*!< 16MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_32MB (0x18U << MPU_RASR_SIZE_Pos) /*!< 32MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_64MB (0x19U << MPU_RASR_SIZE_Pos) /*!< 64MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_128MB (0x1AU << MPU_RASR_SIZE_Pos) /*!< 128MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_256MB (0x1BU << MPU_RASR_SIZE_Pos) /*!< 256MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_512MB (0x1CU << MPU_RASR_SIZE_Pos) /*!< 512MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_1GB (0x1DU << MPU_RASR_SIZE_Pos) /*!< 1GB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_2GB (0x1EU << MPU_RASR_SIZE_Pos) /*!< 2GB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_4GB (0x1FU << MPU_RASR_SIZE_Pos) /*!< 4GB Size of the MPU protection region */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_REGION_PRIVILEDGES MPU Region Privileges - * @{ - */ -#define LL_MPU_REGION_NO_ACCESS (0x00U << MPU_RASR_AP_Pos) /*!< No access*/ -#define LL_MPU_REGION_PRIV_RW (0x01U << MPU_RASR_AP_Pos) /*!< RW privileged (privileged access only)*/ -#define LL_MPU_REGION_PRIV_RW_URO (0x02U << MPU_RASR_AP_Pos) /*!< RW privileged - RO user (Write in a user program generates a fault) */ -#define LL_MPU_REGION_FULL_ACCESS (0x03U << MPU_RASR_AP_Pos) /*!< RW privileged & user (Full access) */ -#define LL_MPU_REGION_PRIV_RO (0x05U << MPU_RASR_AP_Pos) /*!< RO privileged (privileged read only)*/ -#define LL_MPU_REGION_PRIV_RO_URO (0x06U << MPU_RASR_AP_Pos) /*!< RO privileged & user (read only) */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_TEX MPU TEX Level - * @{ - */ -#define LL_MPU_TEX_LEVEL0 (0x00U << MPU_RASR_TEX_Pos) /*!< b000 for TEX bits */ -#define LL_MPU_TEX_LEVEL1 (0x01U << MPU_RASR_TEX_Pos) /*!< b001 for TEX bits */ -#define LL_MPU_TEX_LEVEL2 (0x02U << MPU_RASR_TEX_Pos) /*!< b010 for TEX bits */ -#define LL_MPU_TEX_LEVEL4 (0x04U << MPU_RASR_TEX_Pos) /*!< b100 for TEX bits */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_INSTRUCTION_ACCESS MPU Instruction Access - * @{ - */ -#define LL_MPU_INSTRUCTION_ACCESS_ENABLE 0x00U /*!< Instruction fetches enabled */ -#define LL_MPU_INSTRUCTION_ACCESS_DISABLE MPU_RASR_XN_Msk /*!< Instruction fetches disabled*/ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_SHAREABLE_ACCESS MPU Shareable Access - * @{ - */ -#define LL_MPU_ACCESS_SHAREABLE MPU_RASR_S_Msk /*!< Shareable memory attribute */ -#define LL_MPU_ACCESS_NOT_SHAREABLE 0x00U /*!< Not Shareable memory attribute */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_CACHEABLE_ACCESS MPU Cacheable Access - * @{ - */ -#define LL_MPU_ACCESS_CACHEABLE MPU_RASR_C_Msk /*!< Cacheable memory attribute */ -#define LL_MPU_ACCESS_NOT_CACHEABLE 0x00U /*!< Not Cacheable memory attribute */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_BUFFERABLE_ACCESS MPU Bufferable Access - * @{ - */ -#define LL_MPU_ACCESS_BUFFERABLE MPU_RASR_B_Msk /*!< Bufferable memory attribute */ -#define LL_MPU_ACCESS_NOT_BUFFERABLE 0x00U /*!< Not Bufferable memory attribute */ -/** - * @} - */ -#endif /* __MPU_PRESENT */ -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup CORTEX_LL_Exported_Functions CORTEX Exported Functions - * @{ - */ - -/** @defgroup CORTEX_LL_EF_SYSTICK SYSTICK - * @{ - */ - -/** - * @brief This function checks if the Systick counter flag is active or not. - * @note It can be used in timeout function on application side. - * @rmtoll STK_CTRL COUNTFLAG LL_SYSTICK_IsActiveCounterFlag - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SYSTICK_IsActiveCounterFlag(void) -{ - return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk)); -} - -/** - * @brief Configures the SysTick clock source - * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_SetClkSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 - * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK - * @retval None - */ -__STATIC_INLINE void LL_SYSTICK_SetClkSource(uint32_t Source) -{ - if (Source == LL_SYSTICK_CLKSOURCE_HCLK) - { - SET_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); - } - else - { - CLEAR_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); - } -} - -/** - * @brief Get the SysTick clock source - * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_GetClkSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 - * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK - */ -__STATIC_INLINE uint32_t LL_SYSTICK_GetClkSource(void) -{ - return READ_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); -} - -/** - * @brief Enable SysTick exception request - * @rmtoll STK_CTRL TICKINT LL_SYSTICK_EnableIT - * @retval None - */ -__STATIC_INLINE void LL_SYSTICK_EnableIT(void) -{ - SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); -} - -/** - * @brief Disable SysTick exception request - * @rmtoll STK_CTRL TICKINT LL_SYSTICK_DisableIT - * @retval None - */ -__STATIC_INLINE void LL_SYSTICK_DisableIT(void) -{ - CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); -} - -/** - * @brief Checks if the SYSTICK interrupt is enabled or disabled. - * @rmtoll STK_CTRL TICKINT LL_SYSTICK_IsEnabledIT - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SYSTICK_IsEnabledIT(void) -{ - return (READ_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk) == (SysTick_CTRL_TICKINT_Msk)); -} - -/** - * @} - */ - -/** @defgroup CORTEX_LL_EF_LOW_POWER_MODE LOW POWER MODE - * @{ - */ - -/** - * @brief Processor uses sleep as its low power mode - * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableSleep - * @retval None - */ -__STATIC_INLINE void LL_LPM_EnableSleep(void) -{ - /* Clear SLEEPDEEP bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); -} - -/** - * @brief Processor uses deep sleep as its low power mode - * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableDeepSleep - * @retval None - */ -__STATIC_INLINE void LL_LPM_EnableDeepSleep(void) -{ - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); -} - -/** - * @brief Configures sleep-on-exit when returning from Handler mode to Thread mode. - * @note Setting this bit to 1 enables an interrupt-driven application to avoid returning to an - * empty main application. - * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_EnableSleepOnExit - * @retval None - */ -__STATIC_INLINE void LL_LPM_EnableSleepOnExit(void) -{ - /* Set SLEEPONEXIT bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Do not sleep when returning to Thread mode. - * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_DisableSleepOnExit - * @retval None - */ -__STATIC_INLINE void LL_LPM_DisableSleepOnExit(void) -{ - /* Clear SLEEPONEXIT bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Enabled events and all interrupts, including disabled interrupts, can wakeup the - * processor. - * @rmtoll SCB_SCR SEVEONPEND LL_LPM_EnableEventOnPend - * @retval None - */ -__STATIC_INLINE void LL_LPM_EnableEventOnPend(void) -{ - /* Set SEVEONPEND bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @brief Only enabled interrupts or events can wakeup the processor, disabled interrupts are - * excluded - * @rmtoll SCB_SCR SEVEONPEND LL_LPM_DisableEventOnPend - * @retval None - */ -__STATIC_INLINE void LL_LPM_DisableEventOnPend(void) -{ - /* Clear SEVEONPEND bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @brief Clear pending events. - * @retval None - */ -__STATIC_INLINE void LL_LPM_ClearEvent(void) -{ - __SEV(); - __WFE(); -} - -/** - * @} - */ - -/** @defgroup CORTEX_LL_EF_HANDLER HANDLER - * @{ - */ - -/** - * @brief Enable a fault in System handler control register (SHCSR) - * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_EnableFault - * @param Fault This parameter can be a combination of the following values: - * @arg @ref LL_HANDLER_FAULT_USG - * @arg @ref LL_HANDLER_FAULT_BUS - * @arg @ref LL_HANDLER_FAULT_MEM - * @retval None - */ -__STATIC_INLINE void LL_HANDLER_EnableFault(uint32_t Fault) -{ - /* Enable the system handler fault */ - SET_BIT(SCB->SHCSR, Fault); -} - -/** - * @brief Disable a fault in System handler control register (SHCSR) - * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_DisableFault - * @param Fault This parameter can be a combination of the following values: - * @arg @ref LL_HANDLER_FAULT_USG - * @arg @ref LL_HANDLER_FAULT_BUS - * @arg @ref LL_HANDLER_FAULT_MEM - * @retval None - */ -__STATIC_INLINE void LL_HANDLER_DisableFault(uint32_t Fault) -{ - /* Disable the system handler fault */ - CLEAR_BIT(SCB->SHCSR, Fault); -} - -/** - * @} - */ - -/** @defgroup CORTEX_LL_EF_MCU_INFO MCU INFO - * @{ - */ - -/** - * @brief Get Implementer code - * @rmtoll SCB_CPUID IMPLEMENTER LL_CPUID_GetImplementer - * @retval Value should be equal to 0x41 for ARM - */ -__STATIC_INLINE uint32_t LL_CPUID_GetImplementer(void) -{ - return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_IMPLEMENTER_Msk) >> SCB_CPUID_IMPLEMENTER_Pos); -} - -/** - * @brief Get Variant number (The r value in the rnpn product revision identifier) - * @rmtoll SCB_CPUID VARIANT LL_CPUID_GetVariant - * @retval Value between 0 and 255 (0x0: revision 0) - */ -__STATIC_INLINE uint32_t LL_CPUID_GetVariant(void) -{ - return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_VARIANT_Msk) >> SCB_CPUID_VARIANT_Pos); -} - -/** - * @brief Get Constant number - * @rmtoll SCB_CPUID ARCHITECTURE LL_CPUID_GetConstant - * @retval Value should be equal to 0xF for Cortex-M4 devices - */ -__STATIC_INLINE uint32_t LL_CPUID_GetConstant(void) -{ - return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_ARCHITECTURE_Msk) >> SCB_CPUID_ARCHITECTURE_Pos); -} - -/** - * @brief Get Part number - * @rmtoll SCB_CPUID PARTNO LL_CPUID_GetParNo - * @retval Value should be equal to 0xC24 for Cortex-M4 - */ -__STATIC_INLINE uint32_t LL_CPUID_GetParNo(void) -{ - return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_PARTNO_Msk) >> SCB_CPUID_PARTNO_Pos); -} - -/** - * @brief Get Revision number (The p value in the rnpn product revision identifier, indicates patch release) - * @rmtoll SCB_CPUID REVISION LL_CPUID_GetRevision - * @retval Value between 0 and 255 (0x1: patch 1) - */ -__STATIC_INLINE uint32_t LL_CPUID_GetRevision(void) -{ - return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_REVISION_Msk) >> SCB_CPUID_REVISION_Pos); -} - -/** - * @} - */ - -#if __MPU_PRESENT -/** @defgroup CORTEX_LL_EF_MPU MPU - * @{ - */ - -/** - * @brief Enable MPU with input options - * @rmtoll MPU_CTRL ENABLE LL_MPU_Enable - * @param Options This parameter can be one of the following values: - * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF_NONE - * @arg @ref LL_MPU_CTRL_HARDFAULT_NMI - * @arg @ref LL_MPU_CTRL_PRIVILEGED_DEFAULT - * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF - * @retval None - */ -__STATIC_INLINE void LL_MPU_Enable(uint32_t Options) -{ - /* Enable the MPU*/ - WRITE_REG(MPU->CTRL, (MPU_CTRL_ENABLE_Msk | Options)); - /* Ensure MPU settings take effects */ - __DSB(); - /* Sequence instruction fetches using update settings */ - __ISB(); -} - -/** - * @brief Disable MPU - * @rmtoll MPU_CTRL ENABLE LL_MPU_Disable - * @retval None - */ -__STATIC_INLINE void LL_MPU_Disable(void) -{ - /* Make sure outstanding transfers are done */ - __DMB(); - /* Disable MPU*/ - WRITE_REG(MPU->CTRL, 0U); -} - -/** - * @brief Check if MPU is enabled or not - * @rmtoll MPU_CTRL ENABLE LL_MPU_IsEnabled - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_MPU_IsEnabled(void) -{ - return (READ_BIT(MPU->CTRL, MPU_CTRL_ENABLE_Msk) == (MPU_CTRL_ENABLE_Msk)); -} - -/** - * @brief Enable a MPU region - * @rmtoll MPU_RASR ENABLE LL_MPU_EnableRegion - * @param Region This parameter can be one of the following values: - * @arg @ref LL_MPU_REGION_NUMBER0 - * @arg @ref LL_MPU_REGION_NUMBER1 - * @arg @ref LL_MPU_REGION_NUMBER2 - * @arg @ref LL_MPU_REGION_NUMBER3 - * @arg @ref LL_MPU_REGION_NUMBER4 - * @arg @ref LL_MPU_REGION_NUMBER5 - * @arg @ref LL_MPU_REGION_NUMBER6 - * @arg @ref LL_MPU_REGION_NUMBER7 - * @retval None - */ -__STATIC_INLINE void LL_MPU_EnableRegion(uint32_t Region) -{ - /* Set Region number */ - WRITE_REG(MPU->RNR, Region); - /* Enable the MPU region */ - SET_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); -} - -/** - * @brief Configure and enable a region - * @rmtoll MPU_RNR REGION LL_MPU_ConfigRegion\n - * MPU_RBAR REGION LL_MPU_ConfigRegion\n - * MPU_RBAR ADDR LL_MPU_ConfigRegion\n - * MPU_RASR XN LL_MPU_ConfigRegion\n - * MPU_RASR AP LL_MPU_ConfigRegion\n - * MPU_RASR S LL_MPU_ConfigRegion\n - * MPU_RASR C LL_MPU_ConfigRegion\n - * MPU_RASR B LL_MPU_ConfigRegion\n - * MPU_RASR SIZE LL_MPU_ConfigRegion - * @param Region This parameter can be one of the following values: - * @arg @ref LL_MPU_REGION_NUMBER0 - * @arg @ref LL_MPU_REGION_NUMBER1 - * @arg @ref LL_MPU_REGION_NUMBER2 - * @arg @ref LL_MPU_REGION_NUMBER3 - * @arg @ref LL_MPU_REGION_NUMBER4 - * @arg @ref LL_MPU_REGION_NUMBER5 - * @arg @ref LL_MPU_REGION_NUMBER6 - * @arg @ref LL_MPU_REGION_NUMBER7 - * @param Address Value of region base address - * @param SubRegionDisable Sub-region disable value between Min_Data = 0x00 and Max_Data = 0xFF - * @param Attributes This parameter can be a combination of the following values: - * @arg @ref LL_MPU_REGION_SIZE_32B or @ref LL_MPU_REGION_SIZE_64B or @ref LL_MPU_REGION_SIZE_128B or @ref LL_MPU_REGION_SIZE_256B or @ref LL_MPU_REGION_SIZE_512B - * or @ref LL_MPU_REGION_SIZE_1KB or @ref LL_MPU_REGION_SIZE_2KB or @ref LL_MPU_REGION_SIZE_4KB or @ref LL_MPU_REGION_SIZE_8KB or @ref LL_MPU_REGION_SIZE_16KB - * or @ref LL_MPU_REGION_SIZE_32KB or @ref LL_MPU_REGION_SIZE_64KB or @ref LL_MPU_REGION_SIZE_128KB or @ref LL_MPU_REGION_SIZE_256KB or @ref LL_MPU_REGION_SIZE_512KB - * or @ref LL_MPU_REGION_SIZE_1MB or @ref LL_MPU_REGION_SIZE_2MB or @ref LL_MPU_REGION_SIZE_4MB or @ref LL_MPU_REGION_SIZE_8MB or @ref LL_MPU_REGION_SIZE_16MB - * or @ref LL_MPU_REGION_SIZE_32MB or @ref LL_MPU_REGION_SIZE_64MB or @ref LL_MPU_REGION_SIZE_128MB or @ref LL_MPU_REGION_SIZE_256MB or @ref LL_MPU_REGION_SIZE_512MB - * or @ref LL_MPU_REGION_SIZE_1GB or @ref LL_MPU_REGION_SIZE_2GB or @ref LL_MPU_REGION_SIZE_4GB - * @arg @ref LL_MPU_REGION_NO_ACCESS or @ref LL_MPU_REGION_PRIV_RW or @ref LL_MPU_REGION_PRIV_RW_URO or @ref LL_MPU_REGION_FULL_ACCESS - * or @ref LL_MPU_REGION_PRIV_RO or @ref LL_MPU_REGION_PRIV_RO_URO - * @arg @ref LL_MPU_TEX_LEVEL0 or @ref LL_MPU_TEX_LEVEL1 or @ref LL_MPU_TEX_LEVEL2 or @ref LL_MPU_TEX_LEVEL4 - * @arg @ref LL_MPU_INSTRUCTION_ACCESS_ENABLE or @ref LL_MPU_INSTRUCTION_ACCESS_DISABLE - * @arg @ref LL_MPU_ACCESS_SHAREABLE or @ref LL_MPU_ACCESS_NOT_SHAREABLE - * @arg @ref LL_MPU_ACCESS_CACHEABLE or @ref LL_MPU_ACCESS_NOT_CACHEABLE - * @arg @ref LL_MPU_ACCESS_BUFFERABLE or @ref LL_MPU_ACCESS_NOT_BUFFERABLE - * @retval None - */ -__STATIC_INLINE void LL_MPU_ConfigRegion(uint32_t Region, uint32_t SubRegionDisable, uint32_t Address, uint32_t Attributes) -{ - /* Set Region number */ - WRITE_REG(MPU->RNR, Region); - /* Set base address */ - WRITE_REG(MPU->RBAR, (Address & 0xFFFFFFE0U)); - /* Configure MPU */ - WRITE_REG(MPU->RASR, (MPU_RASR_ENABLE_Msk | Attributes | (SubRegionDisable << MPU_RASR_SRD_Pos))); -} - -/** - * @brief Disable a region - * @rmtoll MPU_RNR REGION LL_MPU_DisableRegion\n - * MPU_RASR ENABLE LL_MPU_DisableRegion - * @param Region This parameter can be one of the following values: - * @arg @ref LL_MPU_REGION_NUMBER0 - * @arg @ref LL_MPU_REGION_NUMBER1 - * @arg @ref LL_MPU_REGION_NUMBER2 - * @arg @ref LL_MPU_REGION_NUMBER3 - * @arg @ref LL_MPU_REGION_NUMBER4 - * @arg @ref LL_MPU_REGION_NUMBER5 - * @arg @ref LL_MPU_REGION_NUMBER6 - * @arg @ref LL_MPU_REGION_NUMBER7 - * @retval None - */ -__STATIC_INLINE void LL_MPU_DisableRegion(uint32_t Region) -{ - /* Set Region number */ - WRITE_REG(MPU->RNR, Region); - /* Disable the MPU region */ - CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); -} - -/** - * @} - */ - -#endif /* __MPU_PRESENT */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_CORTEX_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h deleted file mode 100644 index c0182de..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h +++ /dev/null @@ -1,2868 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_dma.h - * @author MCD Application Team - * @brief Header file of DMA LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_DMA_H -#define __STM32F4xx_LL_DMA_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (DMA1) || defined (DMA2) - -/** @defgroup DMA_LL DMA - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup DMA_LL_Private_Variables DMA Private Variables - * @{ - */ -/* Array used to get the DMA stream register offset versus stream index LL_DMA_STREAM_x */ -static const uint8_t STREAM_OFFSET_TAB[] = -{ - (uint8_t)(DMA1_Stream0_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream1_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream2_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream3_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream4_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream5_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream6_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream7_BASE - DMA1_BASE) -}; - -/** - * @} - */ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup DMA_LL_Private_Constants DMA Private Constants - * @{ - */ -/** - * @} - */ - - -/* Private macros ------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup DMA_LL_ES_INIT DMA Exported Init structure - * @{ - */ -typedef struct -{ - uint32_t PeriphOrM2MSrcAddress; /*!< Specifies the peripheral base address for DMA transfer - or as Source base address in case of memory to memory transfer direction. - - This parameter must be a value between Min_Data = 0 and Max_Data = 0xFFFFFFFF. */ - - uint32_t MemoryOrM2MDstAddress; /*!< Specifies the memory base address for DMA transfer - or as Destination base address in case of memory to memory transfer direction. - - This parameter must be a value between Min_Data = 0 and Max_Data = 0xFFFFFFFF. */ - - uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, - from memory to memory or from peripheral to memory. - This parameter can be a value of @ref DMA_LL_EC_DIRECTION - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetDataTransferDirection(). */ - - uint32_t Mode; /*!< Specifies the normal or circular operation mode. - This parameter can be a value of @ref DMA_LL_EC_MODE - @note The circular buffer mode cannot be used if the memory to memory - data transfer direction is configured on the selected Stream - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetMode(). */ - - uint32_t PeriphOrM2MSrcIncMode; /*!< Specifies whether the Peripheral address or Source address in case of memory to memory transfer direction - is incremented or not. - This parameter can be a value of @ref DMA_LL_EC_PERIPH - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphIncMode(). */ - - uint32_t MemoryOrM2MDstIncMode; /*!< Specifies whether the Memory address or Destination address in case of memory to memory transfer direction - is incremented or not. - This parameter can be a value of @ref DMA_LL_EC_MEMORY - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemoryIncMode(). */ - - uint32_t PeriphOrM2MSrcDataSize; /*!< Specifies the Peripheral data size alignment or Source data size alignment (byte, half word, word) - in case of memory to memory transfer direction. - This parameter can be a value of @ref DMA_LL_EC_PDATAALIGN - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphSize(). */ - - uint32_t MemoryOrM2MDstDataSize; /*!< Specifies the Memory data size alignment or Destination data size alignment (byte, half word, word) - in case of memory to memory transfer direction. - This parameter can be a value of @ref DMA_LL_EC_MDATAALIGN - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemorySize(). */ - - uint32_t NbData; /*!< Specifies the number of data to transfer, in data unit. - The data unit is equal to the source buffer configuration set in PeripheralSize - or MemorySize parameters depending in the transfer direction. - This parameter must be a value between Min_Data = 0 and Max_Data = 0x0000FFFF - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetDataLength(). */ - - uint32_t Channel; /*!< Specifies the peripheral channel. - This parameter can be a value of @ref DMA_LL_EC_CHANNEL - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetChannelSelection(). */ - - uint32_t Priority; /*!< Specifies the channel priority level. - This parameter can be a value of @ref DMA_LL_EC_PRIORITY - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetStreamPriorityLevel(). */ - - uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. - This parameter can be a value of @ref DMA_LL_FIFOMODE - @note The Direct mode (FIFO mode disabled) cannot be used if the - memory-to-memory data transfer is configured on the selected stream - - This feature can be modified afterwards using unitary functions @ref LL_DMA_EnableFifoMode() or @ref LL_DMA_EnableFifoMode() . */ - - uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. - This parameter can be a value of @ref DMA_LL_EC_FIFOTHRESHOLD - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetFIFOThreshold(). */ - - uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_LL_EC_MBURST - @note The burst mode is possible only if the address Increment mode is enabled. - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemoryBurstxfer(). */ - - uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_LL_EC_PBURST - @note The burst mode is possible only if the address Increment mode is enabled. - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphBurstxfer(). */ - -} LL_DMA_InitTypeDef; -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup DMA_LL_Exported_Constants DMA Exported Constants - * @{ - */ - -/** @defgroup DMA_LL_EC_STREAM STREAM - * @{ - */ -#define LL_DMA_STREAM_0 0x00000000U -#define LL_DMA_STREAM_1 0x00000001U -#define LL_DMA_STREAM_2 0x00000002U -#define LL_DMA_STREAM_3 0x00000003U -#define LL_DMA_STREAM_4 0x00000004U -#define LL_DMA_STREAM_5 0x00000005U -#define LL_DMA_STREAM_6 0x00000006U -#define LL_DMA_STREAM_7 0x00000007U -#define LL_DMA_STREAM_ALL 0xFFFF0000U -/** - * @} - */ - -/** @defgroup DMA_LL_EC_DIRECTION DIRECTION - * @{ - */ -#define LL_DMA_DIRECTION_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ -#define LL_DMA_DIRECTION_MEMORY_TO_PERIPH DMA_SxCR_DIR_0 /*!< Memory to peripheral direction */ -#define LL_DMA_DIRECTION_MEMORY_TO_MEMORY DMA_SxCR_DIR_1 /*!< Memory to memory direction */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_MODE MODE - * @{ - */ -#define LL_DMA_MODE_NORMAL 0x00000000U /*!< Normal Mode */ -#define LL_DMA_MODE_CIRCULAR DMA_SxCR_CIRC /*!< Circular Mode */ -#define LL_DMA_MODE_PFCTRL DMA_SxCR_PFCTRL /*!< Peripheral flow control mode */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_DOUBLEBUFFER_MODE DOUBLEBUFFER MODE - * @{ - */ -#define LL_DMA_DOUBLEBUFFER_MODE_DISABLE 0x00000000U /*!< Disable double buffering mode */ -#define LL_DMA_DOUBLEBUFFER_MODE_ENABLE DMA_SxCR_DBM /*!< Enable double buffering mode */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_PERIPH PERIPH - * @{ - */ -#define LL_DMA_PERIPH_NOINCREMENT 0x00000000U /*!< Peripheral increment mode Disable */ -#define LL_DMA_PERIPH_INCREMENT DMA_SxCR_PINC /*!< Peripheral increment mode Enable */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_MEMORY MEMORY - * @{ - */ -#define LL_DMA_MEMORY_NOINCREMENT 0x00000000U /*!< Memory increment mode Disable */ -#define LL_DMA_MEMORY_INCREMENT DMA_SxCR_MINC /*!< Memory increment mode Enable */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_PDATAALIGN PDATAALIGN - * @{ - */ -#define LL_DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment : Byte */ -#define LL_DMA_PDATAALIGN_HALFWORD DMA_SxCR_PSIZE_0 /*!< Peripheral data alignment : HalfWord */ -#define LL_DMA_PDATAALIGN_WORD DMA_SxCR_PSIZE_1 /*!< Peripheral data alignment : Word */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_MDATAALIGN MDATAALIGN - * @{ - */ -#define LL_DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment : Byte */ -#define LL_DMA_MDATAALIGN_HALFWORD DMA_SxCR_MSIZE_0 /*!< Memory data alignment : HalfWord */ -#define LL_DMA_MDATAALIGN_WORD DMA_SxCR_MSIZE_1 /*!< Memory data alignment : Word */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_OFFSETSIZE OFFSETSIZE - * @{ - */ -#define LL_DMA_OFFSETSIZE_PSIZE 0x00000000U /*!< Peripheral increment offset size is linked to the PSIZE */ -#define LL_DMA_OFFSETSIZE_FIXEDTO4 DMA_SxCR_PINCOS /*!< Peripheral increment offset size is fixed to 4 (32-bit alignment) */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_PRIORITY PRIORITY - * @{ - */ -#define LL_DMA_PRIORITY_LOW 0x00000000U /*!< Priority level : Low */ -#define LL_DMA_PRIORITY_MEDIUM DMA_SxCR_PL_0 /*!< Priority level : Medium */ -#define LL_DMA_PRIORITY_HIGH DMA_SxCR_PL_1 /*!< Priority level : High */ -#define LL_DMA_PRIORITY_VERYHIGH DMA_SxCR_PL /*!< Priority level : Very_High */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_CHANNEL CHANNEL - * @{ - */ -#define LL_DMA_CHANNEL_0 0x00000000U /* Select Channel0 of DMA Instance */ -#define LL_DMA_CHANNEL_1 DMA_SxCR_CHSEL_0 /* Select Channel1 of DMA Instance */ -#define LL_DMA_CHANNEL_2 DMA_SxCR_CHSEL_1 /* Select Channel2 of DMA Instance */ -#define LL_DMA_CHANNEL_3 (DMA_SxCR_CHSEL_0 | DMA_SxCR_CHSEL_1) /* Select Channel3 of DMA Instance */ -#define LL_DMA_CHANNEL_4 DMA_SxCR_CHSEL_2 /* Select Channel4 of DMA Instance */ -#define LL_DMA_CHANNEL_5 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_0) /* Select Channel5 of DMA Instance */ -#define LL_DMA_CHANNEL_6 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1) /* Select Channel6 of DMA Instance */ -#define LL_DMA_CHANNEL_7 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0) /* Select Channel7 of DMA Instance */ -#if defined (DMA_SxCR_CHSEL_3) -#define LL_DMA_CHANNEL_8 DMA_SxCR_CHSEL_3 /* Select Channel8 of DMA Instance */ -#define LL_DMA_CHANNEL_9 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_0) /* Select Channel9 of DMA Instance */ -#define LL_DMA_CHANNEL_10 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_1) /* Select Channel10 of DMA Instance */ -#define LL_DMA_CHANNEL_11 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0) /* Select Channel11 of DMA Instance */ -#define LL_DMA_CHANNEL_12 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2) /* Select Channel12 of DMA Instance */ -#define LL_DMA_CHANNEL_13 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_0) /* Select Channel13 of DMA Instance */ -#define LL_DMA_CHANNEL_14 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1) /* Select Channel14 of DMA Instance */ -#define LL_DMA_CHANNEL_15 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0) /* Select Channel15 of DMA Instance */ -#endif /* DMA_SxCR_CHSEL_3 */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_MBURST MBURST - * @{ - */ -#define LL_DMA_MBURST_SINGLE 0x00000000U /*!< Memory burst single transfer configuration */ -#define LL_DMA_MBURST_INC4 DMA_SxCR_MBURST_0 /*!< Memory burst of 4 beats transfer configuration */ -#define LL_DMA_MBURST_INC8 DMA_SxCR_MBURST_1 /*!< Memory burst of 8 beats transfer configuration */ -#define LL_DMA_MBURST_INC16 (DMA_SxCR_MBURST_0 | DMA_SxCR_MBURST_1) /*!< Memory burst of 16 beats transfer configuration */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_PBURST PBURST - * @{ - */ -#define LL_DMA_PBURST_SINGLE 0x00000000U /*!< Peripheral burst single transfer configuration */ -#define LL_DMA_PBURST_INC4 DMA_SxCR_PBURST_0 /*!< Peripheral burst of 4 beats transfer configuration */ -#define LL_DMA_PBURST_INC8 DMA_SxCR_PBURST_1 /*!< Peripheral burst of 8 beats transfer configuration */ -#define LL_DMA_PBURST_INC16 (DMA_SxCR_PBURST_0 | DMA_SxCR_PBURST_1) /*!< Peripheral burst of 16 beats transfer configuration */ -/** - * @} - */ - -/** @defgroup DMA_LL_FIFOMODE DMA_LL_FIFOMODE - * @{ - */ -#define LL_DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable (direct mode is enabled) */ -#define LL_DMA_FIFOMODE_ENABLE DMA_SxFCR_DMDIS /*!< FIFO mode enable */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_FIFOSTATUS_0 FIFOSTATUS 0 - * @{ - */ -#define LL_DMA_FIFOSTATUS_0_25 0x00000000U /*!< 0 < fifo_level < 1/4 */ -#define LL_DMA_FIFOSTATUS_25_50 DMA_SxFCR_FS_0 /*!< 1/4 < fifo_level < 1/2 */ -#define LL_DMA_FIFOSTATUS_50_75 DMA_SxFCR_FS_1 /*!< 1/2 < fifo_level < 3/4 */ -#define LL_DMA_FIFOSTATUS_75_100 (DMA_SxFCR_FS_1 | DMA_SxFCR_FS_0) /*!< 3/4 < fifo_level < full */ -#define LL_DMA_FIFOSTATUS_EMPTY DMA_SxFCR_FS_2 /*!< FIFO is empty */ -#define LL_DMA_FIFOSTATUS_FULL (DMA_SxFCR_FS_2 | DMA_SxFCR_FS_0) /*!< FIFO is full */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_FIFOTHRESHOLD FIFOTHRESHOLD - * @{ - */ -#define LL_DMA_FIFOTHRESHOLD_1_4 0x00000000U /*!< FIFO threshold 1 quart full configuration */ -#define LL_DMA_FIFOTHRESHOLD_1_2 DMA_SxFCR_FTH_0 /*!< FIFO threshold half full configuration */ -#define LL_DMA_FIFOTHRESHOLD_3_4 DMA_SxFCR_FTH_1 /*!< FIFO threshold 3 quarts full configuration */ -#define LL_DMA_FIFOTHRESHOLD_FULL DMA_SxFCR_FTH /*!< FIFO threshold full configuration */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_CURRENTTARGETMEM CURRENTTARGETMEM - * @{ - */ -#define LL_DMA_CURRENTTARGETMEM0 0x00000000U /*!< Set CurrentTarget Memory to Memory 0 */ -#define LL_DMA_CURRENTTARGETMEM1 DMA_SxCR_CT /*!< Set CurrentTarget Memory to Memory 1 */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup DMA_LL_Exported_Macros DMA Exported Macros - * @{ - */ - -/** @defgroup DMA_LL_EM_WRITE_READ Common Write and read registers macros - * @{ - */ -/** - * @brief Write a value in DMA register - * @param __INSTANCE__ DMA Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_DMA_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in DMA register - * @param __INSTANCE__ DMA Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_DMA_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** @defgroup DMA_LL_EM_CONVERT_DMAxCHANNELy Convert DMAxStreamy - * @{ - */ -/** - * @brief Convert DMAx_Streamy into DMAx - * @param __STREAM_INSTANCE__ DMAx_Streamy - * @retval DMAx - */ -#define __LL_DMA_GET_INSTANCE(__STREAM_INSTANCE__) \ -(((uint32_t)(__STREAM_INSTANCE__) > ((uint32_t)DMA1_Stream7)) ? DMA2 : DMA1) - -/** - * @brief Convert DMAx_Streamy into LL_DMA_STREAM_y - * @param __STREAM_INSTANCE__ DMAx_Streamy - * @retval LL_DMA_CHANNEL_y - */ -#define __LL_DMA_GET_STREAM(__STREAM_INSTANCE__) \ -(((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream0)) ? LL_DMA_STREAM_0 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream0)) ? LL_DMA_STREAM_0 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream1)) ? LL_DMA_STREAM_1 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream1)) ? LL_DMA_STREAM_1 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream2)) ? LL_DMA_STREAM_2 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream2)) ? LL_DMA_STREAM_2 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream3)) ? LL_DMA_STREAM_3 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream3)) ? LL_DMA_STREAM_3 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream4)) ? LL_DMA_STREAM_4 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream4)) ? LL_DMA_STREAM_4 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream5)) ? LL_DMA_STREAM_5 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream5)) ? LL_DMA_STREAM_5 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream6)) ? LL_DMA_STREAM_6 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream6)) ? LL_DMA_STREAM_6 : \ - LL_DMA_STREAM_7) - -/** - * @brief Convert DMA Instance DMAx and LL_DMA_STREAM_y into DMAx_Streamy - * @param __DMA_INSTANCE__ DMAx - * @param __STREAM__ LL_DMA_STREAM_y - * @retval DMAx_Streamy - */ -#define __LL_DMA_GET_STREAM_INSTANCE(__DMA_INSTANCE__, __STREAM__) \ -((((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_0))) ? DMA1_Stream0 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_0))) ? DMA2_Stream0 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_1))) ? DMA1_Stream1 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_1))) ? DMA2_Stream1 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_2))) ? DMA1_Stream2 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_2))) ? DMA2_Stream2 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_3))) ? DMA1_Stream3 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_3))) ? DMA2_Stream3 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_4))) ? DMA1_Stream4 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_4))) ? DMA2_Stream4 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_5))) ? DMA1_Stream5 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_5))) ? DMA2_Stream5 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_6))) ? DMA1_Stream6 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_6))) ? DMA2_Stream6 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_7))) ? DMA1_Stream7 : \ - DMA2_Stream7) - -/** - * @} - */ - -/** - * @} - */ - - -/* Exported functions --------------------------------------------------------*/ - /** @defgroup DMA_LL_Exported_Functions DMA Exported Functions - * @{ - */ - -/** @defgroup DMA_LL_EF_Configuration Configuration - * @{ - */ -/** - * @brief Enable DMA stream. - * @rmtoll CR EN LL_DMA_EnableStream - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableStream(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN); -} - -/** - * @brief Disable DMA stream. - * @rmtoll CR EN LL_DMA_DisableStream - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableStream(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN); -} - -/** - * @brief Check if DMA stream is enabled or disabled. - * @rmtoll CR EN LL_DMA_IsEnabledStream - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledStream(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN) == (DMA_SxCR_EN)); -} - -/** - * @brief Configure all parameters linked to DMA transfer. - * @rmtoll CR DIR LL_DMA_ConfigTransfer\n - * CR CIRC LL_DMA_ConfigTransfer\n - * CR PINC LL_DMA_ConfigTransfer\n - * CR MINC LL_DMA_ConfigTransfer\n - * CR PSIZE LL_DMA_ConfigTransfer\n - * CR MSIZE LL_DMA_ConfigTransfer\n - * CR PL LL_DMA_ConfigTransfer\n - * CR PFCTRL LL_DMA_ConfigTransfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Configuration This parameter must be a combination of all the following values: - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY or @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH or @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - * @arg @ref LL_DMA_MODE_NORMAL or @ref LL_DMA_MODE_CIRCULAR or @ref LL_DMA_MODE_PFCTRL - * @arg @ref LL_DMA_PERIPH_INCREMENT or @ref LL_DMA_PERIPH_NOINCREMENT - * @arg @ref LL_DMA_MEMORY_INCREMENT or @ref LL_DMA_MEMORY_NOINCREMENT - * @arg @ref LL_DMA_PDATAALIGN_BYTE or @ref LL_DMA_PDATAALIGN_HALFWORD or @ref LL_DMA_PDATAALIGN_WORD - * @arg @ref LL_DMA_MDATAALIGN_BYTE or @ref LL_DMA_MDATAALIGN_HALFWORD or @ref LL_DMA_MDATAALIGN_WORD - * @arg @ref LL_DMA_PRIORITY_LOW or @ref LL_DMA_PRIORITY_MEDIUM or @ref LL_DMA_PRIORITY_HIGH or @ref LL_DMA_PRIORITY_VERYHIGH - *@retval None - */ -__STATIC_INLINE void LL_DMA_ConfigTransfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Configuration) -{ - MODIFY_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, - DMA_SxCR_DIR | DMA_SxCR_CIRC | DMA_SxCR_PINC | DMA_SxCR_MINC | DMA_SxCR_PSIZE | DMA_SxCR_MSIZE | DMA_SxCR_PL | DMA_SxCR_PFCTRL, - Configuration); -} - -/** - * @brief Set Data transfer direction (read from peripheral or from memory). - * @rmtoll CR DIR LL_DMA_SetDataTransferDirection - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Direction This parameter can be one of the following values: - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetDataTransferDirection(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Direction) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DIR, Direction); -} - -/** - * @brief Get Data transfer direction (read from peripheral or from memory). - * @rmtoll CR DIR LL_DMA_GetDataTransferDirection - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - */ -__STATIC_INLINE uint32_t LL_DMA_GetDataTransferDirection(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DIR)); -} - -/** - * @brief Set DMA mode normal, circular or peripheral flow control. - * @rmtoll CR CIRC LL_DMA_SetMode\n - * CR PFCTRL LL_DMA_SetMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_DMA_MODE_NORMAL - * @arg @ref LL_DMA_MODE_CIRCULAR - * @arg @ref LL_DMA_MODE_PFCTRL - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Mode) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CIRC | DMA_SxCR_PFCTRL, Mode); -} - -/** - * @brief Get DMA mode normal, circular or peripheral flow control. - * @rmtoll CR CIRC LL_DMA_GetMode\n - * CR PFCTRL LL_DMA_GetMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_MODE_NORMAL - * @arg @ref LL_DMA_MODE_CIRCULAR - * @arg @ref LL_DMA_MODE_PFCTRL - */ -__STATIC_INLINE uint32_t LL_DMA_GetMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CIRC | DMA_SxCR_PFCTRL)); -} - -/** - * @brief Set Peripheral increment mode. - * @rmtoll CR PINC LL_DMA_SetPeriphIncMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param IncrementMode This parameter can be one of the following values: - * @arg @ref LL_DMA_PERIPH_NOINCREMENT - * @arg @ref LL_DMA_PERIPH_INCREMENT - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t IncrementMode) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINC, IncrementMode); -} - -/** - * @brief Get Peripheral increment mode. - * @rmtoll CR PINC LL_DMA_GetPeriphIncMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PERIPH_NOINCREMENT - * @arg @ref LL_DMA_PERIPH_INCREMENT - */ -__STATIC_INLINE uint32_t LL_DMA_GetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINC)); -} - -/** - * @brief Set Memory increment mode. - * @rmtoll CR MINC LL_DMA_SetMemoryIncMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param IncrementMode This parameter can be one of the following values: - * @arg @ref LL_DMA_MEMORY_NOINCREMENT - * @arg @ref LL_DMA_MEMORY_INCREMENT - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t IncrementMode) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MINC, IncrementMode); -} - -/** - * @brief Get Memory increment mode. - * @rmtoll CR MINC LL_DMA_GetMemoryIncMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_MEMORY_NOINCREMENT - * @arg @ref LL_DMA_MEMORY_INCREMENT - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MINC)); -} - -/** - * @brief Set Peripheral size. - * @rmtoll CR PSIZE LL_DMA_SetPeriphSize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Size This parameter can be one of the following values: - * @arg @ref LL_DMA_PDATAALIGN_BYTE - * @arg @ref LL_DMA_PDATAALIGN_HALFWORD - * @arg @ref LL_DMA_PDATAALIGN_WORD - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetPeriphSize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Size) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PSIZE, Size); -} - -/** - * @brief Get Peripheral size. - * @rmtoll CR PSIZE LL_DMA_GetPeriphSize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PDATAALIGN_BYTE - * @arg @ref LL_DMA_PDATAALIGN_HALFWORD - * @arg @ref LL_DMA_PDATAALIGN_WORD - */ -__STATIC_INLINE uint32_t LL_DMA_GetPeriphSize(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PSIZE)); -} - -/** - * @brief Set Memory size. - * @rmtoll CR MSIZE LL_DMA_SetMemorySize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Size This parameter can be one of the following values: - * @arg @ref LL_DMA_MDATAALIGN_BYTE - * @arg @ref LL_DMA_MDATAALIGN_HALFWORD - * @arg @ref LL_DMA_MDATAALIGN_WORD - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemorySize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Size) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MSIZE, Size); -} - -/** - * @brief Get Memory size. - * @rmtoll CR MSIZE LL_DMA_GetMemorySize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_MDATAALIGN_BYTE - * @arg @ref LL_DMA_MDATAALIGN_HALFWORD - * @arg @ref LL_DMA_MDATAALIGN_WORD - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemorySize(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MSIZE)); -} - -/** - * @brief Set Peripheral increment offset size. - * @rmtoll CR PINCOS LL_DMA_SetIncOffsetSize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param OffsetSize This parameter can be one of the following values: - * @arg @ref LL_DMA_OFFSETSIZE_PSIZE - * @arg @ref LL_DMA_OFFSETSIZE_FIXEDTO4 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetIncOffsetSize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t OffsetSize) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINCOS, OffsetSize); -} - -/** - * @brief Get Peripheral increment offset size. - * @rmtoll CR PINCOS LL_DMA_GetIncOffsetSize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_OFFSETSIZE_PSIZE - * @arg @ref LL_DMA_OFFSETSIZE_FIXEDTO4 - */ -__STATIC_INLINE uint32_t LL_DMA_GetIncOffsetSize(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINCOS)); -} - -/** - * @brief Set Stream priority level. - * @rmtoll CR PL LL_DMA_SetStreamPriorityLevel - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Priority This parameter can be one of the following values: - * @arg @ref LL_DMA_PRIORITY_LOW - * @arg @ref LL_DMA_PRIORITY_MEDIUM - * @arg @ref LL_DMA_PRIORITY_HIGH - * @arg @ref LL_DMA_PRIORITY_VERYHIGH - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetStreamPriorityLevel(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Priority) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PL, Priority); -} - -/** - * @brief Get Stream priority level. - * @rmtoll CR PL LL_DMA_GetStreamPriorityLevel - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PRIORITY_LOW - * @arg @ref LL_DMA_PRIORITY_MEDIUM - * @arg @ref LL_DMA_PRIORITY_HIGH - * @arg @ref LL_DMA_PRIORITY_VERYHIGH - */ -__STATIC_INLINE uint32_t LL_DMA_GetStreamPriorityLevel(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PL)); -} - -/** - * @brief Set Number of data to transfer. - * @rmtoll NDTR NDT LL_DMA_SetDataLength - * @note This action has no effect if - * stream is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param NbData Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetDataLength(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t NbData) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->NDTR, DMA_SxNDT, NbData); -} - -/** - * @brief Get Number of data to transfer. - * @rmtoll NDTR NDT LL_DMA_GetDataLength - * @note Once the stream is enabled, the return value indicate the - * remaining bytes to be transmitted. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetDataLength(DMA_TypeDef* DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->NDTR, DMA_SxNDT)); -} - -/** - * @brief Select Channel number associated to the Stream. - * @rmtoll CR CHSEL LL_DMA_SetChannelSelection - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetChannelSelection(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Channel) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CHSEL, Channel); -} - -/** - * @brief Get the Channel number associated to the Stream. - * @rmtoll CR CHSEL LL_DMA_GetChannelSelection - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - */ -__STATIC_INLINE uint32_t LL_DMA_GetChannelSelection(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CHSEL)); -} - -/** - * @brief Set Memory burst transfer configuration. - * @rmtoll CR MBURST LL_DMA_SetMemoryBurstxfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Mburst This parameter can be one of the following values: - * @arg @ref LL_DMA_MBURST_SINGLE - * @arg @ref LL_DMA_MBURST_INC4 - * @arg @ref LL_DMA_MBURST_INC8 - * @arg @ref LL_DMA_MBURST_INC16 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemoryBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Mburst) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MBURST, Mburst); -} - -/** - * @brief Get Memory burst transfer configuration. - * @rmtoll CR MBURST LL_DMA_GetMemoryBurstxfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_MBURST_SINGLE - * @arg @ref LL_DMA_MBURST_INC4 - * @arg @ref LL_DMA_MBURST_INC8 - * @arg @ref LL_DMA_MBURST_INC16 - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemoryBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MBURST)); -} - -/** - * @brief Set Peripheral burst transfer configuration. - * @rmtoll CR PBURST LL_DMA_SetPeriphBurstxfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Pburst This parameter can be one of the following values: - * @arg @ref LL_DMA_PBURST_SINGLE - * @arg @ref LL_DMA_PBURST_INC4 - * @arg @ref LL_DMA_PBURST_INC8 - * @arg @ref LL_DMA_PBURST_INC16 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetPeriphBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Pburst) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PBURST, Pburst); -} - -/** - * @brief Get Peripheral burst transfer configuration. - * @rmtoll CR PBURST LL_DMA_GetPeriphBurstxfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PBURST_SINGLE - * @arg @ref LL_DMA_PBURST_INC4 - * @arg @ref LL_DMA_PBURST_INC8 - * @arg @ref LL_DMA_PBURST_INC16 - */ -__STATIC_INLINE uint32_t LL_DMA_GetPeriphBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PBURST)); -} - -/** - * @brief Set Current target (only in double buffer mode) to Memory 1 or Memory 0. - * @rmtoll CR CT LL_DMA_SetCurrentTargetMem - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param CurrentMemory This parameter can be one of the following values: - * @arg @ref LL_DMA_CURRENTTARGETMEM0 - * @arg @ref LL_DMA_CURRENTTARGETMEM1 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetCurrentTargetMem(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t CurrentMemory) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CT, CurrentMemory); -} - -/** - * @brief Get Current target (only in double buffer mode). - * @rmtoll CR CT LL_DMA_GetCurrentTargetMem - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_CURRENTTARGETMEM0 - * @arg @ref LL_DMA_CURRENTTARGETMEM1 - */ -__STATIC_INLINE uint32_t LL_DMA_GetCurrentTargetMem(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CT)); -} - -/** - * @brief Enable the double buffer mode. - * @rmtoll CR DBM LL_DMA_EnableDoubleBufferMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableDoubleBufferMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DBM); -} - -/** - * @brief Disable the double buffer mode. - * @rmtoll CR DBM LL_DMA_DisableDoubleBufferMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableDoubleBufferMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DBM); -} - -/** - * @brief Get FIFO status. - * @rmtoll FCR FS LL_DMA_GetFIFOStatus - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_FIFOSTATUS_0_25 - * @arg @ref LL_DMA_FIFOSTATUS_25_50 - * @arg @ref LL_DMA_FIFOSTATUS_50_75 - * @arg @ref LL_DMA_FIFOSTATUS_75_100 - * @arg @ref LL_DMA_FIFOSTATUS_EMPTY - * @arg @ref LL_DMA_FIFOSTATUS_FULL - */ -__STATIC_INLINE uint32_t LL_DMA_GetFIFOStatus(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FS)); -} - -/** - * @brief Disable Fifo mode. - * @rmtoll FCR DMDIS LL_DMA_DisableFifoMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableFifoMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_DMDIS); -} - -/** - * @brief Enable Fifo mode. - * @rmtoll FCR DMDIS LL_DMA_EnableFifoMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableFifoMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_DMDIS); -} - -/** - * @brief Select FIFO threshold. - * @rmtoll FCR FTH LL_DMA_SetFIFOThreshold - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Threshold This parameter can be one of the following values: - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 - * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetFIFOThreshold(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Threshold) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH, Threshold); -} - -/** - * @brief Get FIFO threshold. - * @rmtoll FCR FTH LL_DMA_GetFIFOThreshold - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 - * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL - */ -__STATIC_INLINE uint32_t LL_DMA_GetFIFOThreshold(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH)); -} - -/** - * @brief Configure the FIFO . - * @rmtoll FCR FTH LL_DMA_ConfigFifo\n - * FCR DMDIS LL_DMA_ConfigFifo - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param FifoMode This parameter can be one of the following values: - * @arg @ref LL_DMA_FIFOMODE_ENABLE - * @arg @ref LL_DMA_FIFOMODE_DISABLE - * @param FifoThreshold This parameter can be one of the following values: - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 - * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL - * @retval None - */ -__STATIC_INLINE void LL_DMA_ConfigFifo(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t FifoMode, uint32_t FifoThreshold) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH|DMA_SxFCR_DMDIS, FifoMode|FifoThreshold); -} - -/** - * @brief Configure the Source and Destination addresses. - * @note This API must not be called when the DMA stream is enabled. - * @rmtoll M0AR M0A LL_DMA_ConfigAddresses\n - * PAR PA LL_DMA_ConfigAddresses - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param SrcAddress Between 0 to 0xFFFFFFFF - * @param DstAddress Between 0 to 0xFFFFFFFF - * @param Direction This parameter can be one of the following values: - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - * @retval None - */ -__STATIC_INLINE void LL_DMA_ConfigAddresses(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t SrcAddress, uint32_t DstAddress, uint32_t Direction) -{ - /* Direction Memory to Periph */ - if (Direction == LL_DMA_DIRECTION_MEMORY_TO_PERIPH) - { - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, SrcAddress); - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, DstAddress); - } - /* Direction Periph to Memory and Memory to Memory */ - else - { - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, SrcAddress); - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, DstAddress); - } -} - -/** - * @brief Set the Memory address. - * @rmtoll M0AR M0A LL_DMA_SetMemoryAddress - * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. - * @note This API must not be called when the DMA channel is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param MemoryAddress Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) -{ - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, MemoryAddress); -} - -/** - * @brief Set the Peripheral address. - * @rmtoll PAR PA LL_DMA_SetPeriphAddress - * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. - * @note This API must not be called when the DMA channel is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param PeriphAddress Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t PeriphAddress) -{ - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, PeriphAddress); -} - -/** - * @brief Get the Memory address. - * @rmtoll M0AR M0A LL_DMA_GetMemoryAddress - * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream) -{ - return (READ_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR)); -} - -/** - * @brief Get the Peripheral address. - * @rmtoll PAR PA LL_DMA_GetPeriphAddress - * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream) -{ - return (READ_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR)); -} - -/** - * @brief Set the Memory to Memory Source address. - * @rmtoll PAR PA LL_DMA_SetM2MSrcAddress - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * @note This API must not be called when the DMA channel is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param MemoryAddress Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetM2MSrcAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) -{ - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, MemoryAddress); -} - -/** - * @brief Set the Memory to Memory Destination address. - * @rmtoll M0AR M0A LL_DMA_SetM2MDstAddress - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * @note This API must not be called when the DMA channel is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param MemoryAddress Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetM2MDstAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) - { - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, MemoryAddress); - } - -/** - * @brief Get the Memory to Memory Source address. - * @rmtoll PAR PA LL_DMA_GetM2MSrcAddress - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetM2MSrcAddress(DMA_TypeDef* DMAx, uint32_t Stream) - { - return (READ_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR)); - } - -/** - * @brief Get the Memory to Memory Destination address. - * @rmtoll M0AR M0A LL_DMA_GetM2MDstAddress - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetM2MDstAddress(DMA_TypeDef* DMAx, uint32_t Stream) -{ - return (READ_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR)); -} - -/** - * @brief Set Memory 1 address (used in case of Double buffer mode). - * @rmtoll M1AR M1A LL_DMA_SetMemory1Address - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Address Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemory1Address(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Address) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M1AR, DMA_SxM1AR_M1A, Address); -} - -/** - * @brief Get Memory 1 address (used in case of Double buffer mode). - * @rmtoll M1AR M1A LL_DMA_GetMemory1Address - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemory1Address(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M1AR); -} - -/** - * @} - */ - -/** @defgroup DMA_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Get Stream 0 half transfer flag. - * @rmtoll LISR HTIF0 LL_DMA_IsActiveFlag_HT0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF0)==(DMA_LISR_HTIF0)); -} - -/** - * @brief Get Stream 1 half transfer flag. - * @rmtoll LISR HTIF1 LL_DMA_IsActiveFlag_HT1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF1)==(DMA_LISR_HTIF1)); -} - -/** - * @brief Get Stream 2 half transfer flag. - * @rmtoll LISR HTIF2 LL_DMA_IsActiveFlag_HT2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF2)==(DMA_LISR_HTIF2)); -} - -/** - * @brief Get Stream 3 half transfer flag. - * @rmtoll LISR HTIF3 LL_DMA_IsActiveFlag_HT3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF3)==(DMA_LISR_HTIF3)); -} - -/** - * @brief Get Stream 4 half transfer flag. - * @rmtoll HISR HTIF4 LL_DMA_IsActiveFlag_HT4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF4)==(DMA_HISR_HTIF4)); -} - -/** - * @brief Get Stream 5 half transfer flag. - * @rmtoll HISR HTIF0 LL_DMA_IsActiveFlag_HT5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF5)==(DMA_HISR_HTIF5)); -} - -/** - * @brief Get Stream 6 half transfer flag. - * @rmtoll HISR HTIF6 LL_DMA_IsActiveFlag_HT6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF6)==(DMA_HISR_HTIF6)); -} - -/** - * @brief Get Stream 7 half transfer flag. - * @rmtoll HISR HTIF7 LL_DMA_IsActiveFlag_HT7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF7)==(DMA_HISR_HTIF7)); -} - -/** - * @brief Get Stream 0 transfer complete flag. - * @rmtoll LISR TCIF0 LL_DMA_IsActiveFlag_TC0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF0)==(DMA_LISR_TCIF0)); -} - -/** - * @brief Get Stream 1 transfer complete flag. - * @rmtoll LISR TCIF1 LL_DMA_IsActiveFlag_TC1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF1)==(DMA_LISR_TCIF1)); -} - -/** - * @brief Get Stream 2 transfer complete flag. - * @rmtoll LISR TCIF2 LL_DMA_IsActiveFlag_TC2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF2)==(DMA_LISR_TCIF2)); -} - -/** - * @brief Get Stream 3 transfer complete flag. - * @rmtoll LISR TCIF3 LL_DMA_IsActiveFlag_TC3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF3)==(DMA_LISR_TCIF3)); -} - -/** - * @brief Get Stream 4 transfer complete flag. - * @rmtoll HISR TCIF4 LL_DMA_IsActiveFlag_TC4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF4)==(DMA_HISR_TCIF4)); -} - -/** - * @brief Get Stream 5 transfer complete flag. - * @rmtoll HISR TCIF0 LL_DMA_IsActiveFlag_TC5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF5)==(DMA_HISR_TCIF5)); -} - -/** - * @brief Get Stream 6 transfer complete flag. - * @rmtoll HISR TCIF6 LL_DMA_IsActiveFlag_TC6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF6)==(DMA_HISR_TCIF6)); -} - -/** - * @brief Get Stream 7 transfer complete flag. - * @rmtoll HISR TCIF7 LL_DMA_IsActiveFlag_TC7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF7)==(DMA_HISR_TCIF7)); -} - -/** - * @brief Get Stream 0 transfer error flag. - * @rmtoll LISR TEIF0 LL_DMA_IsActiveFlag_TE0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF0)==(DMA_LISR_TEIF0)); -} - -/** - * @brief Get Stream 1 transfer error flag. - * @rmtoll LISR TEIF1 LL_DMA_IsActiveFlag_TE1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF1)==(DMA_LISR_TEIF1)); -} - -/** - * @brief Get Stream 2 transfer error flag. - * @rmtoll LISR TEIF2 LL_DMA_IsActiveFlag_TE2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF2)==(DMA_LISR_TEIF2)); -} - -/** - * @brief Get Stream 3 transfer error flag. - * @rmtoll LISR TEIF3 LL_DMA_IsActiveFlag_TE3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF3)==(DMA_LISR_TEIF3)); -} - -/** - * @brief Get Stream 4 transfer error flag. - * @rmtoll HISR TEIF4 LL_DMA_IsActiveFlag_TE4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF4)==(DMA_HISR_TEIF4)); -} - -/** - * @brief Get Stream 5 transfer error flag. - * @rmtoll HISR TEIF0 LL_DMA_IsActiveFlag_TE5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF5)==(DMA_HISR_TEIF5)); -} - -/** - * @brief Get Stream 6 transfer error flag. - * @rmtoll HISR TEIF6 LL_DMA_IsActiveFlag_TE6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF6)==(DMA_HISR_TEIF6)); -} - -/** - * @brief Get Stream 7 transfer error flag. - * @rmtoll HISR TEIF7 LL_DMA_IsActiveFlag_TE7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF7)==(DMA_HISR_TEIF7)); -} - -/** - * @brief Get Stream 0 direct mode error flag. - * @rmtoll LISR DMEIF0 LL_DMA_IsActiveFlag_DME0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF0)==(DMA_LISR_DMEIF0)); -} - -/** - * @brief Get Stream 1 direct mode error flag. - * @rmtoll LISR DMEIF1 LL_DMA_IsActiveFlag_DME1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF1)==(DMA_LISR_DMEIF1)); -} - -/** - * @brief Get Stream 2 direct mode error flag. - * @rmtoll LISR DMEIF2 LL_DMA_IsActiveFlag_DME2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF2)==(DMA_LISR_DMEIF2)); -} - -/** - * @brief Get Stream 3 direct mode error flag. - * @rmtoll LISR DMEIF3 LL_DMA_IsActiveFlag_DME3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF3)==(DMA_LISR_DMEIF3)); -} - -/** - * @brief Get Stream 4 direct mode error flag. - * @rmtoll HISR DMEIF4 LL_DMA_IsActiveFlag_DME4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF4)==(DMA_HISR_DMEIF4)); -} - -/** - * @brief Get Stream 5 direct mode error flag. - * @rmtoll HISR DMEIF0 LL_DMA_IsActiveFlag_DME5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF5)==(DMA_HISR_DMEIF5)); -} - -/** - * @brief Get Stream 6 direct mode error flag. - * @rmtoll HISR DMEIF6 LL_DMA_IsActiveFlag_DME6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF6)==(DMA_HISR_DMEIF6)); -} - -/** - * @brief Get Stream 7 direct mode error flag. - * @rmtoll HISR DMEIF7 LL_DMA_IsActiveFlag_DME7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF7)==(DMA_HISR_DMEIF7)); -} - -/** - * @brief Get Stream 0 FIFO error flag. - * @rmtoll LISR FEIF0 LL_DMA_IsActiveFlag_FE0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF0)==(DMA_LISR_FEIF0)); -} - -/** - * @brief Get Stream 1 FIFO error flag. - * @rmtoll LISR FEIF1 LL_DMA_IsActiveFlag_FE1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF1)==(DMA_LISR_FEIF1)); -} - -/** - * @brief Get Stream 2 FIFO error flag. - * @rmtoll LISR FEIF2 LL_DMA_IsActiveFlag_FE2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF2)==(DMA_LISR_FEIF2)); -} - -/** - * @brief Get Stream 3 FIFO error flag. - * @rmtoll LISR FEIF3 LL_DMA_IsActiveFlag_FE3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF3)==(DMA_LISR_FEIF3)); -} - -/** - * @brief Get Stream 4 FIFO error flag. - * @rmtoll HISR FEIF4 LL_DMA_IsActiveFlag_FE4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF4)==(DMA_HISR_FEIF4)); -} - -/** - * @brief Get Stream 5 FIFO error flag. - * @rmtoll HISR FEIF0 LL_DMA_IsActiveFlag_FE5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF5)==(DMA_HISR_FEIF5)); -} - -/** - * @brief Get Stream 6 FIFO error flag. - * @rmtoll HISR FEIF6 LL_DMA_IsActiveFlag_FE6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF6)==(DMA_HISR_FEIF6)); -} - -/** - * @brief Get Stream 7 FIFO error flag. - * @rmtoll HISR FEIF7 LL_DMA_IsActiveFlag_FE7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF7)==(DMA_HISR_FEIF7)); -} - -/** - * @brief Clear Stream 0 half transfer flag. - * @rmtoll LIFCR CHTIF0 LL_DMA_ClearFlag_HT0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF0); -} - -/** - * @brief Clear Stream 1 half transfer flag. - * @rmtoll LIFCR CHTIF1 LL_DMA_ClearFlag_HT1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF1); -} - -/** - * @brief Clear Stream 2 half transfer flag. - * @rmtoll LIFCR CHTIF2 LL_DMA_ClearFlag_HT2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF2); -} - -/** - * @brief Clear Stream 3 half transfer flag. - * @rmtoll LIFCR CHTIF3 LL_DMA_ClearFlag_HT3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF3); -} - -/** - * @brief Clear Stream 4 half transfer flag. - * @rmtoll HIFCR CHTIF4 LL_DMA_ClearFlag_HT4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF4); -} - -/** - * @brief Clear Stream 5 half transfer flag. - * @rmtoll HIFCR CHTIF5 LL_DMA_ClearFlag_HT5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF5); -} - -/** - * @brief Clear Stream 6 half transfer flag. - * @rmtoll HIFCR CHTIF6 LL_DMA_ClearFlag_HT6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF6); -} - -/** - * @brief Clear Stream 7 half transfer flag. - * @rmtoll HIFCR CHTIF7 LL_DMA_ClearFlag_HT7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF7); -} - -/** - * @brief Clear Stream 0 transfer complete flag. - * @rmtoll LIFCR CTCIF0 LL_DMA_ClearFlag_TC0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF0); -} - -/** - * @brief Clear Stream 1 transfer complete flag. - * @rmtoll LIFCR CTCIF1 LL_DMA_ClearFlag_TC1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF1); -} - -/** - * @brief Clear Stream 2 transfer complete flag. - * @rmtoll LIFCR CTCIF2 LL_DMA_ClearFlag_TC2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF2); -} - -/** - * @brief Clear Stream 3 transfer complete flag. - * @rmtoll LIFCR CTCIF3 LL_DMA_ClearFlag_TC3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF3); -} - -/** - * @brief Clear Stream 4 transfer complete flag. - * @rmtoll HIFCR CTCIF4 LL_DMA_ClearFlag_TC4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF4); -} - -/** - * @brief Clear Stream 5 transfer complete flag. - * @rmtoll HIFCR CTCIF5 LL_DMA_ClearFlag_TC5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF5); -} - -/** - * @brief Clear Stream 6 transfer complete flag. - * @rmtoll HIFCR CTCIF6 LL_DMA_ClearFlag_TC6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF6); -} - -/** - * @brief Clear Stream 7 transfer complete flag. - * @rmtoll HIFCR CTCIF7 LL_DMA_ClearFlag_TC7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF7); -} - -/** - * @brief Clear Stream 0 transfer error flag. - * @rmtoll LIFCR CTEIF0 LL_DMA_ClearFlag_TE0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF0); -} - -/** - * @brief Clear Stream 1 transfer error flag. - * @rmtoll LIFCR CTEIF1 LL_DMA_ClearFlag_TE1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF1); -} - -/** - * @brief Clear Stream 2 transfer error flag. - * @rmtoll LIFCR CTEIF2 LL_DMA_ClearFlag_TE2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF2); -} - -/** - * @brief Clear Stream 3 transfer error flag. - * @rmtoll LIFCR CTEIF3 LL_DMA_ClearFlag_TE3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF3); -} - -/** - * @brief Clear Stream 4 transfer error flag. - * @rmtoll HIFCR CTEIF4 LL_DMA_ClearFlag_TE4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF4); -} - -/** - * @brief Clear Stream 5 transfer error flag. - * @rmtoll HIFCR CTEIF5 LL_DMA_ClearFlag_TE5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF5); -} - -/** - * @brief Clear Stream 6 transfer error flag. - * @rmtoll HIFCR CTEIF6 LL_DMA_ClearFlag_TE6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF6); -} - -/** - * @brief Clear Stream 7 transfer error flag. - * @rmtoll HIFCR CTEIF7 LL_DMA_ClearFlag_TE7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF7); -} - -/** - * @brief Clear Stream 0 direct mode error flag. - * @rmtoll LIFCR CDMEIF0 LL_DMA_ClearFlag_DME0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF0); -} - -/** - * @brief Clear Stream 1 direct mode error flag. - * @rmtoll LIFCR CDMEIF1 LL_DMA_ClearFlag_DME1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF1); -} - -/** - * @brief Clear Stream 2 direct mode error flag. - * @rmtoll LIFCR CDMEIF2 LL_DMA_ClearFlag_DME2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF2); -} - -/** - * @brief Clear Stream 3 direct mode error flag. - * @rmtoll LIFCR CDMEIF3 LL_DMA_ClearFlag_DME3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF3); -} - -/** - * @brief Clear Stream 4 direct mode error flag. - * @rmtoll HIFCR CDMEIF4 LL_DMA_ClearFlag_DME4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF4); -} - -/** - * @brief Clear Stream 5 direct mode error flag. - * @rmtoll HIFCR CDMEIF5 LL_DMA_ClearFlag_DME5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF5); -} - -/** - * @brief Clear Stream 6 direct mode error flag. - * @rmtoll HIFCR CDMEIF6 LL_DMA_ClearFlag_DME6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF6); -} - -/** - * @brief Clear Stream 7 direct mode error flag. - * @rmtoll HIFCR CDMEIF7 LL_DMA_ClearFlag_DME7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF7); -} - -/** - * @brief Clear Stream 0 FIFO error flag. - * @rmtoll LIFCR CFEIF0 LL_DMA_ClearFlag_FE0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF0); -} - -/** - * @brief Clear Stream 1 FIFO error flag. - * @rmtoll LIFCR CFEIF1 LL_DMA_ClearFlag_FE1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF1); -} - -/** - * @brief Clear Stream 2 FIFO error flag. - * @rmtoll LIFCR CFEIF2 LL_DMA_ClearFlag_FE2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF2); -} - -/** - * @brief Clear Stream 3 FIFO error flag. - * @rmtoll LIFCR CFEIF3 LL_DMA_ClearFlag_FE3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF3); -} - -/** - * @brief Clear Stream 4 FIFO error flag. - * @rmtoll HIFCR CFEIF4 LL_DMA_ClearFlag_FE4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF4); -} - -/** - * @brief Clear Stream 5 FIFO error flag. - * @rmtoll HIFCR CFEIF5 LL_DMA_ClearFlag_FE5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF5); -} - -/** - * @brief Clear Stream 6 FIFO error flag. - * @rmtoll HIFCR CFEIF6 LL_DMA_ClearFlag_FE6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF6); -} - -/** - * @brief Clear Stream 7 FIFO error flag. - * @rmtoll HIFCR CFEIF7 LL_DMA_ClearFlag_FE7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF7); -} - -/** - * @} - */ - -/** @defgroup DMA_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable Half transfer interrupt. - * @rmtoll CR HTIE LL_DMA_EnableIT_HT - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE); -} - -/** - * @brief Enable Transfer error interrupt. - * @rmtoll CR TEIE LL_DMA_EnableIT_TE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE); -} - -/** - * @brief Enable Transfer complete interrupt. - * @rmtoll CR TCIE LL_DMA_EnableIT_TC - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE); -} - -/** - * @brief Enable Direct mode error interrupt. - * @rmtoll CR DMEIE LL_DMA_EnableIT_DME - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE); -} - -/** - * @brief Enable FIFO error interrupt. - * @rmtoll FCR FEIE LL_DMA_EnableIT_FE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE); -} - -/** - * @brief Disable Half transfer interrupt. - * @rmtoll CR HTIE LL_DMA_DisableIT_HT - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE); -} - -/** - * @brief Disable Transfer error interrupt. - * @rmtoll CR TEIE LL_DMA_DisableIT_TE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE); -} - -/** - * @brief Disable Transfer complete interrupt. - * @rmtoll CR TCIE LL_DMA_DisableIT_TC - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE); -} - -/** - * @brief Disable Direct mode error interrupt. - * @rmtoll CR DMEIE LL_DMA_DisableIT_DME - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE); -} - -/** - * @brief Disable FIFO error interrupt. - * @rmtoll FCR FEIE LL_DMA_DisableIT_FE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE); -} - -/** - * @brief Check if Half transfer interrupt is enabled. - * @rmtoll CR HTIE LL_DMA_IsEnabledIT_HT - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE) == DMA_SxCR_HTIE); -} - -/** - * @brief Check if Transfer error nterrup is enabled. - * @rmtoll CR TEIE LL_DMA_IsEnabledIT_TE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE) == DMA_SxCR_TEIE); -} - -/** - * @brief Check if Transfer complete interrupt is enabled. - * @rmtoll CR TCIE LL_DMA_IsEnabledIT_TC - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE) == DMA_SxCR_TCIE); -} - -/** - * @brief Check if Direct mode error interrupt is enabled. - * @rmtoll CR DMEIE LL_DMA_IsEnabledIT_DME - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE) == DMA_SxCR_DMEIE); -} - -/** - * @brief Check if FIFO error interrupt is enabled. - * @rmtoll FCR FEIE LL_DMA_IsEnabledIT_FE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE) == DMA_SxFCR_FEIE); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup DMA_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -uint32_t LL_DMA_Init(DMA_TypeDef *DMAx, uint32_t Stream, LL_DMA_InitTypeDef *DMA_InitStruct); -uint32_t LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Stream); -void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct); - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* DMA1 || DMA2 */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_DMA_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h deleted file mode 100644 index 65ab691..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h +++ /dev/null @@ -1,954 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_exti.h - * @author MCD Application Team - * @brief Header file of EXTI LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS.Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_EXTI_H -#define __STM32F4xx_LL_EXTI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (EXTI) - -/** @defgroup EXTI_LL EXTI - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private Macros ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup EXTI_LL_Private_Macros EXTI Private Macros - * @{ - */ -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup EXTI_LL_ES_INIT EXTI Exported Init structure - * @{ - */ -typedef struct -{ - - uint32_t Line_0_31; /*!< Specifies the EXTI lines to be enabled or disabled for Lines in range 0 to 31 - This parameter can be any combination of @ref EXTI_LL_EC_LINE */ - - FunctionalState LineCommand; /*!< Specifies the new state of the selected EXTI lines. - This parameter can be set either to ENABLE or DISABLE */ - - uint8_t Mode; /*!< Specifies the mode for the EXTI lines. - This parameter can be a value of @ref EXTI_LL_EC_MODE. */ - - uint8_t Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. - This parameter can be a value of @ref EXTI_LL_EC_TRIGGER. */ -} LL_EXTI_InitTypeDef; - -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup EXTI_LL_Exported_Constants EXTI Exported Constants - * @{ - */ - -/** @defgroup EXTI_LL_EC_LINE LINE - * @{ - */ -#define LL_EXTI_LINE_0 EXTI_IMR_IM0 /*!< Extended line 0 */ -#define LL_EXTI_LINE_1 EXTI_IMR_IM1 /*!< Extended line 1 */ -#define LL_EXTI_LINE_2 EXTI_IMR_IM2 /*!< Extended line 2 */ -#define LL_EXTI_LINE_3 EXTI_IMR_IM3 /*!< Extended line 3 */ -#define LL_EXTI_LINE_4 EXTI_IMR_IM4 /*!< Extended line 4 */ -#define LL_EXTI_LINE_5 EXTI_IMR_IM5 /*!< Extended line 5 */ -#define LL_EXTI_LINE_6 EXTI_IMR_IM6 /*!< Extended line 6 */ -#define LL_EXTI_LINE_7 EXTI_IMR_IM7 /*!< Extended line 7 */ -#define LL_EXTI_LINE_8 EXTI_IMR_IM8 /*!< Extended line 8 */ -#define LL_EXTI_LINE_9 EXTI_IMR_IM9 /*!< Extended line 9 */ -#define LL_EXTI_LINE_10 EXTI_IMR_IM10 /*!< Extended line 10 */ -#define LL_EXTI_LINE_11 EXTI_IMR_IM11 /*!< Extended line 11 */ -#define LL_EXTI_LINE_12 EXTI_IMR_IM12 /*!< Extended line 12 */ -#define LL_EXTI_LINE_13 EXTI_IMR_IM13 /*!< Extended line 13 */ -#define LL_EXTI_LINE_14 EXTI_IMR_IM14 /*!< Extended line 14 */ -#define LL_EXTI_LINE_15 EXTI_IMR_IM15 /*!< Extended line 15 */ -#if defined(EXTI_IMR_IM16) -#define LL_EXTI_LINE_16 EXTI_IMR_IM16 /*!< Extended line 16 */ -#endif -#define LL_EXTI_LINE_17 EXTI_IMR_IM17 /*!< Extended line 17 */ -#if defined(EXTI_IMR_IM18) -#define LL_EXTI_LINE_18 EXTI_IMR_IM18 /*!< Extended line 18 */ -#endif -#define LL_EXTI_LINE_19 EXTI_IMR_IM19 /*!< Extended line 19 */ -#if defined(EXTI_IMR_IM20) -#define LL_EXTI_LINE_20 EXTI_IMR_IM20 /*!< Extended line 20 */ -#endif -#if defined(EXTI_IMR_IM21) -#define LL_EXTI_LINE_21 EXTI_IMR_IM21 /*!< Extended line 21 */ -#endif -#if defined(EXTI_IMR_IM22) -#define LL_EXTI_LINE_22 EXTI_IMR_IM22 /*!< Extended line 22 */ -#endif -#if defined(EXTI_IMR_IM23) -#define LL_EXTI_LINE_23 EXTI_IMR_IM23 /*!< Extended line 23 */ -#endif -#if defined(EXTI_IMR_IM24) -#define LL_EXTI_LINE_24 EXTI_IMR_IM24 /*!< Extended line 24 */ -#endif -#if defined(EXTI_IMR_IM25) -#define LL_EXTI_LINE_25 EXTI_IMR_IM25 /*!< Extended line 25 */ -#endif -#if defined(EXTI_IMR_IM26) -#define LL_EXTI_LINE_26 EXTI_IMR_IM26 /*!< Extended line 26 */ -#endif -#if defined(EXTI_IMR_IM27) -#define LL_EXTI_LINE_27 EXTI_IMR_IM27 /*!< Extended line 27 */ -#endif -#if defined(EXTI_IMR_IM28) -#define LL_EXTI_LINE_28 EXTI_IMR_IM28 /*!< Extended line 28 */ -#endif -#if defined(EXTI_IMR_IM29) -#define LL_EXTI_LINE_29 EXTI_IMR_IM29 /*!< Extended line 29 */ -#endif -#if defined(EXTI_IMR_IM30) -#define LL_EXTI_LINE_30 EXTI_IMR_IM30 /*!< Extended line 30 */ -#endif -#if defined(EXTI_IMR_IM31) -#define LL_EXTI_LINE_31 EXTI_IMR_IM31 /*!< Extended line 31 */ -#endif -#define LL_EXTI_LINE_ALL_0_31 EXTI_IMR_IM /*!< All Extended line not reserved*/ - - -#define LL_EXTI_LINE_ALL ((uint32_t)0xFFFFFFFFU) /*!< All Extended line */ - -#if defined(USE_FULL_LL_DRIVER) -#define LL_EXTI_LINE_NONE ((uint32_t)0x00000000U) /*!< None Extended line */ -#endif /*USE_FULL_LL_DRIVER*/ - -/** - * @} - */ -#if defined(USE_FULL_LL_DRIVER) - -/** @defgroup EXTI_LL_EC_MODE Mode - * @{ - */ -#define LL_EXTI_MODE_IT ((uint8_t)0x00U) /*!< Interrupt Mode */ -#define LL_EXTI_MODE_EVENT ((uint8_t)0x01U) /*!< Event Mode */ -#define LL_EXTI_MODE_IT_EVENT ((uint8_t)0x02U) /*!< Interrupt & Event Mode */ -/** - * @} - */ - -/** @defgroup EXTI_LL_EC_TRIGGER Edge Trigger - * @{ - */ -#define LL_EXTI_TRIGGER_NONE ((uint8_t)0x00U) /*!< No Trigger Mode */ -#define LL_EXTI_TRIGGER_RISING ((uint8_t)0x01U) /*!< Trigger Rising Mode */ -#define LL_EXTI_TRIGGER_FALLING ((uint8_t)0x02U) /*!< Trigger Falling Mode */ -#define LL_EXTI_TRIGGER_RISING_FALLING ((uint8_t)0x03U) /*!< Trigger Rising & Falling Mode */ - -/** - * @} - */ - - -#endif /*USE_FULL_LL_DRIVER*/ - - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup EXTI_LL_Exported_Macros EXTI Exported Macros - * @{ - */ - -/** @defgroup EXTI_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in EXTI register - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_EXTI_WriteReg(__REG__, __VALUE__) WRITE_REG(EXTI->__REG__, (__VALUE__)) - -/** - * @brief Read a value in EXTI register - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_EXTI_ReadReg(__REG__) READ_REG(EXTI->__REG__) -/** - * @} - */ - - -/** - * @} - */ - - - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup EXTI_LL_Exported_Functions EXTI Exported Functions - * @{ - */ -/** @defgroup EXTI_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable ExtiLine Interrupt request for Lines in range 0 to 31 - * @note The reset value for the direct or internal lines (see RM) - * is set to 1 in order to enable the interrupt by default. - * Bits are set automatically at Power on. - * @rmtoll IMR IMx LL_EXTI_EnableIT_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_EnableIT_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->IMR, ExtiLine); -} - -/** - * @brief Disable ExtiLine Interrupt request for Lines in range 0 to 31 - * @note The reset value for the direct or internal lines (see RM) - * is set to 1 in order to enable the interrupt by default. - * Bits are set automatically at Power on. - * @rmtoll IMR IMx LL_EXTI_DisableIT_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_DisableIT_0_31(uint32_t ExtiLine) -{ - CLEAR_BIT(EXTI->IMR, ExtiLine); -} - - -/** - * @brief Indicate if ExtiLine Interrupt request is enabled for Lines in range 0 to 31 - * @note The reset value for the direct or internal lines (see RM) - * is set to 1 in order to enable the interrupt by default. - * Bits are set automatically at Power on. - * @rmtoll IMR IMx LL_EXTI_IsEnabledIT_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsEnabledIT_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->IMR, ExtiLine) == (ExtiLine)); -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Event_Management Event_Management - * @{ - */ - -/** - * @brief Enable ExtiLine Event request for Lines in range 0 to 31 - * @rmtoll EMR EMx LL_EXTI_EnableEvent_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_EnableEvent_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->EMR, ExtiLine); - -} - - -/** - * @brief Disable ExtiLine Event request for Lines in range 0 to 31 - * @rmtoll EMR EMx LL_EXTI_DisableEvent_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_DisableEvent_0_31(uint32_t ExtiLine) -{ - CLEAR_BIT(EXTI->EMR, ExtiLine); -} - - -/** - * @brief Indicate if ExtiLine Event request is enabled for Lines in range 0 to 31 - * @rmtoll EMR EMx LL_EXTI_IsEnabledEvent_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsEnabledEvent_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->EMR, ExtiLine) == (ExtiLine)); - -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Rising_Trigger_Management Rising_Trigger_Management - * @{ - */ - -/** - * @brief Enable ExtiLine Rising Edge Trigger for Lines in range 0 to 31 - * @note The configurable wakeup lines are edge-triggered. No glitch must be - * generated on these lines. If a rising edge on a configurable interrupt - * line occurs during a write operation in the EXTI_RTSR register, the - * pending bit is not set. - * Rising and falling edge triggers can be set for - * the same interrupt line. In this case, both generate a trigger - * condition. - * @rmtoll RTSR RTx LL_EXTI_EnableRisingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_EnableRisingTrig_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->RTSR, ExtiLine); - -} - - -/** - * @brief Disable ExtiLine Rising Edge Trigger for Lines in range 0 to 31 - * @note The configurable wakeup lines are edge-triggered. No glitch must be - * generated on these lines. If a rising edge on a configurable interrupt - * line occurs during a write operation in the EXTI_RTSR register, the - * pending bit is not set. - * Rising and falling edge triggers can be set for - * the same interrupt line. In this case, both generate a trigger - * condition. - * @rmtoll RTSR RTx LL_EXTI_DisableRisingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_DisableRisingTrig_0_31(uint32_t ExtiLine) -{ - CLEAR_BIT(EXTI->RTSR, ExtiLine); - -} - - -/** - * @brief Check if rising edge trigger is enabled for Lines in range 0 to 31 - * @rmtoll RTSR RTx LL_EXTI_IsEnabledRisingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsEnabledRisingTrig_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->RTSR, ExtiLine) == (ExtiLine)); -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Falling_Trigger_Management Falling_Trigger_Management - * @{ - */ - -/** - * @brief Enable ExtiLine Falling Edge Trigger for Lines in range 0 to 31 - * @note The configurable wakeup lines are edge-triggered. No glitch must be - * generated on these lines. If a falling edge on a configurable interrupt - * line occurs during a write operation in the EXTI_FTSR register, the - * pending bit is not set. - * Rising and falling edge triggers can be set for - * the same interrupt line. In this case, both generate a trigger - * condition. - * @rmtoll FTSR FTx LL_EXTI_EnableFallingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_EnableFallingTrig_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->FTSR, ExtiLine); -} - - -/** - * @brief Disable ExtiLine Falling Edge Trigger for Lines in range 0 to 31 - * @note The configurable wakeup lines are edge-triggered. No glitch must be - * generated on these lines. If a Falling edge on a configurable interrupt - * line occurs during a write operation in the EXTI_FTSR register, the - * pending bit is not set. - * Rising and falling edge triggers can be set for the same interrupt line. - * In this case, both generate a trigger condition. - * @rmtoll FTSR FTx LL_EXTI_DisableFallingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_DisableFallingTrig_0_31(uint32_t ExtiLine) -{ - CLEAR_BIT(EXTI->FTSR, ExtiLine); -} - - -/** - * @brief Check if falling edge trigger is enabled for Lines in range 0 to 31 - * @rmtoll FTSR FTx LL_EXTI_IsEnabledFallingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsEnabledFallingTrig_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->FTSR, ExtiLine) == (ExtiLine)); -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Software_Interrupt_Management Software_Interrupt_Management - * @{ - */ - -/** - * @brief Generate a software Interrupt Event for Lines in range 0 to 31 - * @note If the interrupt is enabled on this line in the EXTI_IMR, writing a 1 to - * this bit when it is at '0' sets the corresponding pending bit in EXTI_PR - * resulting in an interrupt request generation. - * This bit is cleared by clearing the corresponding bit in the EXTI_PR - * register (by writing a 1 into the bit) - * @rmtoll SWIER SWIx LL_EXTI_GenerateSWI_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_GenerateSWI_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->SWIER, ExtiLine); -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Flag_Management Flag_Management - * @{ - */ - -/** - * @brief Check if the ExtLine Flag is set or not for Lines in range 0 to 31 - * @note This bit is set when the selected edge event arrives on the interrupt - * line. This bit is cleared by writing a 1 to the bit. - * @rmtoll PR PIFx LL_EXTI_IsActiveFlag_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsActiveFlag_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->PR, ExtiLine) == (ExtiLine)); -} - - -/** - * @brief Read ExtLine Combination Flag for Lines in range 0 to 31 - * @note This bit is set when the selected edge event arrives on the interrupt - * line. This bit is cleared by writing a 1 to the bit. - * @rmtoll PR PIFx LL_EXTI_ReadFlag_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval @note This bit is set when the selected edge event arrives on the interrupt - */ -__STATIC_INLINE uint32_t LL_EXTI_ReadFlag_0_31(uint32_t ExtiLine) -{ - return (uint32_t)(READ_BIT(EXTI->PR, ExtiLine)); -} - - -/** - * @brief Clear ExtLine Flags for Lines in range 0 to 31 - * @note This bit is set when the selected edge event arrives on the interrupt - * line. This bit is cleared by writing a 1 to the bit. - * @rmtoll PR PIFx LL_EXTI_ClearFlag_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_ClearFlag_0_31(uint32_t ExtiLine) -{ - WRITE_REG(EXTI->PR, ExtiLine); -} - - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup EXTI_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -uint32_t LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct); -uint32_t LL_EXTI_DeInit(void); -void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct); - - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* EXTI */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_EXTI_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h deleted file mode 100644 index 6bee7fd..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h +++ /dev/null @@ -1,981 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_gpio.h - * @author MCD Application Team - * @brief Header file of GPIO LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_GPIO_H -#define __STM32F4xx_LL_GPIO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK) - -/** @defgroup GPIO_LL GPIO - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup GPIO_LL_Private_Macros GPIO Private Macros - * @{ - */ - -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup GPIO_LL_ES_INIT GPIO Exported Init structures - * @{ - */ - -/** - * @brief LL GPIO Init Structure definition - */ -typedef struct -{ - uint32_t Pin; /*!< Specifies the GPIO pins to be configured. - This parameter can be any value of @ref GPIO_LL_EC_PIN */ - - uint32_t Mode; /*!< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref GPIO_LL_EC_MODE. - - GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinMode().*/ - - uint32_t Speed; /*!< Specifies the speed for the selected pins. - This parameter can be a value of @ref GPIO_LL_EC_SPEED. - - GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinSpeed().*/ - - uint32_t OutputType; /*!< Specifies the operating output type for the selected pins. - This parameter can be a value of @ref GPIO_LL_EC_OUTPUT. - - GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinOutputType().*/ - - uint32_t Pull; /*!< Specifies the operating Pull-up/Pull down for the selected pins. - This parameter can be a value of @ref GPIO_LL_EC_PULL. - - GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinPull().*/ - - uint32_t Alternate; /*!< Specifies the Peripheral to be connected to the selected pins. - This parameter can be a value of @ref GPIO_LL_EC_AF. - - GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetAFPin_0_7() and LL_GPIO_SetAFPin_8_15().*/ -} LL_GPIO_InitTypeDef; - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup GPIO_LL_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_LL_EC_PIN PIN - * @{ - */ -#define LL_GPIO_PIN_0 GPIO_BSRR_BS_0 /*!< Select pin 0 */ -#define LL_GPIO_PIN_1 GPIO_BSRR_BS_1 /*!< Select pin 1 */ -#define LL_GPIO_PIN_2 GPIO_BSRR_BS_2 /*!< Select pin 2 */ -#define LL_GPIO_PIN_3 GPIO_BSRR_BS_3 /*!< Select pin 3 */ -#define LL_GPIO_PIN_4 GPIO_BSRR_BS_4 /*!< Select pin 4 */ -#define LL_GPIO_PIN_5 GPIO_BSRR_BS_5 /*!< Select pin 5 */ -#define LL_GPIO_PIN_6 GPIO_BSRR_BS_6 /*!< Select pin 6 */ -#define LL_GPIO_PIN_7 GPIO_BSRR_BS_7 /*!< Select pin 7 */ -#define LL_GPIO_PIN_8 GPIO_BSRR_BS_8 /*!< Select pin 8 */ -#define LL_GPIO_PIN_9 GPIO_BSRR_BS_9 /*!< Select pin 9 */ -#define LL_GPIO_PIN_10 GPIO_BSRR_BS_10 /*!< Select pin 10 */ -#define LL_GPIO_PIN_11 GPIO_BSRR_BS_11 /*!< Select pin 11 */ -#define LL_GPIO_PIN_12 GPIO_BSRR_BS_12 /*!< Select pin 12 */ -#define LL_GPIO_PIN_13 GPIO_BSRR_BS_13 /*!< Select pin 13 */ -#define LL_GPIO_PIN_14 GPIO_BSRR_BS_14 /*!< Select pin 14 */ -#define LL_GPIO_PIN_15 GPIO_BSRR_BS_15 /*!< Select pin 15 */ -#define LL_GPIO_PIN_ALL (GPIO_BSRR_BS_0 | GPIO_BSRR_BS_1 | GPIO_BSRR_BS_2 | \ - GPIO_BSRR_BS_3 | GPIO_BSRR_BS_4 | GPIO_BSRR_BS_5 | \ - GPIO_BSRR_BS_6 | GPIO_BSRR_BS_7 | GPIO_BSRR_BS_8 | \ - GPIO_BSRR_BS_9 | GPIO_BSRR_BS_10 | GPIO_BSRR_BS_11 | \ - GPIO_BSRR_BS_12 | GPIO_BSRR_BS_13 | GPIO_BSRR_BS_14 | \ - GPIO_BSRR_BS_15) /*!< Select all pins */ -/** - * @} - */ - -/** @defgroup GPIO_LL_EC_MODE Mode - * @{ - */ -#define LL_GPIO_MODE_INPUT (0x00000000U) /*!< Select input mode */ -#define LL_GPIO_MODE_OUTPUT GPIO_MODER_MODER0_0 /*!< Select output mode */ -#define LL_GPIO_MODE_ALTERNATE GPIO_MODER_MODER0_1 /*!< Select alternate function mode */ -#define LL_GPIO_MODE_ANALOG GPIO_MODER_MODER0 /*!< Select analog mode */ -/** - * @} - */ - -/** @defgroup GPIO_LL_EC_OUTPUT Output Type - * @{ - */ -#define LL_GPIO_OUTPUT_PUSHPULL (0x00000000U) /*!< Select push-pull as output type */ -#define LL_GPIO_OUTPUT_OPENDRAIN GPIO_OTYPER_OT_0 /*!< Select open-drain as output type */ -/** - * @} - */ - -/** @defgroup GPIO_LL_EC_SPEED Output Speed - * @{ - */ -#define LL_GPIO_SPEED_FREQ_LOW (0x00000000U) /*!< Select I/O low output speed */ -#define LL_GPIO_SPEED_FREQ_MEDIUM GPIO_OSPEEDER_OSPEEDR0_0 /*!< Select I/O medium output speed */ -#define LL_GPIO_SPEED_FREQ_HIGH GPIO_OSPEEDER_OSPEEDR0_1 /*!< Select I/O fast output speed */ -#define LL_GPIO_SPEED_FREQ_VERY_HIGH GPIO_OSPEEDER_OSPEEDR0 /*!< Select I/O high output speed */ -/** - * @} - */ - -/** @defgroup GPIO_LL_EC_PULL Pull Up Pull Down - * @{ - */ -#define LL_GPIO_PULL_NO (0x00000000U) /*!< Select I/O no pull */ -#define LL_GPIO_PULL_UP GPIO_PUPDR_PUPDR0_0 /*!< Select I/O pull up */ -#define LL_GPIO_PULL_DOWN GPIO_PUPDR_PUPDR0_1 /*!< Select I/O pull down */ -/** - * @} - */ - -/** @defgroup GPIO_LL_EC_AF Alternate Function - * @{ - */ -#define LL_GPIO_AF_0 (0x0000000U) /*!< Select alternate function 0 */ -#define LL_GPIO_AF_1 (0x0000001U) /*!< Select alternate function 1 */ -#define LL_GPIO_AF_2 (0x0000002U) /*!< Select alternate function 2 */ -#define LL_GPIO_AF_3 (0x0000003U) /*!< Select alternate function 3 */ -#define LL_GPIO_AF_4 (0x0000004U) /*!< Select alternate function 4 */ -#define LL_GPIO_AF_5 (0x0000005U) /*!< Select alternate function 5 */ -#define LL_GPIO_AF_6 (0x0000006U) /*!< Select alternate function 6 */ -#define LL_GPIO_AF_7 (0x0000007U) /*!< Select alternate function 7 */ -#define LL_GPIO_AF_8 (0x0000008U) /*!< Select alternate function 8 */ -#define LL_GPIO_AF_9 (0x0000009U) /*!< Select alternate function 9 */ -#define LL_GPIO_AF_10 (0x000000AU) /*!< Select alternate function 10 */ -#define LL_GPIO_AF_11 (0x000000BU) /*!< Select alternate function 11 */ -#define LL_GPIO_AF_12 (0x000000CU) /*!< Select alternate function 12 */ -#define LL_GPIO_AF_13 (0x000000DU) /*!< Select alternate function 13 */ -#define LL_GPIO_AF_14 (0x000000EU) /*!< Select alternate function 14 */ -#define LL_GPIO_AF_15 (0x000000FU) /*!< Select alternate function 15 */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIO_LL_Exported_Macros GPIO Exported Macros - * @{ - */ - -/** @defgroup GPIO_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in GPIO register - * @param __INSTANCE__ GPIO Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_GPIO_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in GPIO register - * @param __INSTANCE__ GPIO Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_GPIO_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup GPIO_LL_Exported_Functions GPIO Exported Functions - * @{ - */ - -/** @defgroup GPIO_LL_EF_Port_Configuration Port Configuration - * @{ - */ - -/** - * @brief Configure gpio mode for a dedicated pin on dedicated port. - * @note I/O mode can be Input mode, General purpose output, Alternate function mode or Analog. - * @note Warning: only one pin can be passed as parameter. - * @rmtoll MODER MODEy LL_GPIO_SetPinMode - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_GPIO_MODE_INPUT - * @arg @ref LL_GPIO_MODE_OUTPUT - * @arg @ref LL_GPIO_MODE_ALTERNATE - * @arg @ref LL_GPIO_MODE_ANALOG - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode) -{ - MODIFY_REG(GPIOx->MODER, (GPIO_MODER_MODER0 << (POSITION_VAL(Pin) * 2U)), (Mode << (POSITION_VAL(Pin) * 2U))); -} - -/** - * @brief Return gpio mode for a dedicated pin on dedicated port. - * @note I/O mode can be Input mode, General purpose output, Alternate function mode or Analog. - * @note Warning: only one pin can be passed as parameter. - * @rmtoll MODER MODEy LL_GPIO_GetPinMode - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_MODE_INPUT - * @arg @ref LL_GPIO_MODE_OUTPUT - * @arg @ref LL_GPIO_MODE_ALTERNATE - * @arg @ref LL_GPIO_MODE_ANALOG - */ -__STATIC_INLINE uint32_t LL_GPIO_GetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->MODER, - (GPIO_MODER_MODER0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); -} - -/** - * @brief Configure gpio output type for several pins on dedicated port. - * @note Output type as to be set when gpio pin is in output or - * alternate modes. Possible type are Push-pull or Open-drain. - * @rmtoll OTYPER OTy LL_GPIO_SetPinOutputType - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @param OutputType This parameter can be one of the following values: - * @arg @ref LL_GPIO_OUTPUT_PUSHPULL - * @arg @ref LL_GPIO_OUTPUT_OPENDRAIN - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t PinMask, uint32_t OutputType) -{ - MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType)); -} - -/** - * @brief Return gpio output type for several pins on dedicated port. - * @note Output type as to be set when gpio pin is in output or - * alternate modes. Possible type are Push-pull or Open-drain. - * @note Warning: only one pin can be passed as parameter. - * @rmtoll OTYPER OTy LL_GPIO_GetPinOutputType - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_OUTPUT_PUSHPULL - * @arg @ref LL_GPIO_OUTPUT_OPENDRAIN - */ -__STATIC_INLINE uint32_t LL_GPIO_GetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->OTYPER, Pin) >> POSITION_VAL(Pin)); -} - -/** - * @brief Configure gpio speed for a dedicated pin on dedicated port. - * @note I/O speed can be Low, Medium, Fast or High speed. - * @note Warning: only one pin can be passed as parameter. - * @note Refer to datasheet for frequency specifications and the power - * supply and load conditions for each speed. - * @rmtoll OSPEEDR OSPEEDy LL_GPIO_SetPinSpeed - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @param Speed This parameter can be one of the following values: - * @arg @ref LL_GPIO_SPEED_FREQ_LOW - * @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM - * @arg @ref LL_GPIO_SPEED_FREQ_HIGH - * @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Speed) -{ - MODIFY_REG(GPIOx->OSPEEDR, (GPIO_OSPEEDER_OSPEEDR0 << (POSITION_VAL(Pin) * 2U)), - (Speed << (POSITION_VAL(Pin) * 2U))); -} - -/** - * @brief Return gpio speed for a dedicated pin on dedicated port. - * @note I/O speed can be Low, Medium, Fast or High speed. - * @note Warning: only one pin can be passed as parameter. - * @note Refer to datasheet for frequency specifications and the power - * supply and load conditions for each speed. - * @rmtoll OSPEEDR OSPEEDy LL_GPIO_GetPinSpeed - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_SPEED_FREQ_LOW - * @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM - * @arg @ref LL_GPIO_SPEED_FREQ_HIGH - * @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH - */ -__STATIC_INLINE uint32_t LL_GPIO_GetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->OSPEEDR, - (GPIO_OSPEEDER_OSPEEDR0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); -} - -/** - * @brief Configure gpio pull-up or pull-down for a dedicated pin on a dedicated port. - * @note Warning: only one pin can be passed as parameter. - * @rmtoll PUPDR PUPDy LL_GPIO_SetPinPull - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @param Pull This parameter can be one of the following values: - * @arg @ref LL_GPIO_PULL_NO - * @arg @ref LL_GPIO_PULL_UP - * @arg @ref LL_GPIO_PULL_DOWN - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Pull) -{ - MODIFY_REG(GPIOx->PUPDR, (GPIO_PUPDR_PUPDR0 << (POSITION_VAL(Pin) * 2U)), (Pull << (POSITION_VAL(Pin) * 2U))); -} - -/** - * @brief Return gpio pull-up or pull-down for a dedicated pin on a dedicated port - * @note Warning: only one pin can be passed as parameter. - * @rmtoll PUPDR PUPDy LL_GPIO_GetPinPull - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_PULL_NO - * @arg @ref LL_GPIO_PULL_UP - * @arg @ref LL_GPIO_PULL_DOWN - */ -__STATIC_INLINE uint32_t LL_GPIO_GetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->PUPDR, - (GPIO_PUPDR_PUPDR0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); -} - -/** - * @brief Configure gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port. - * @note Possible values are from AF0 to AF15 depending on target. - * @note Warning: only one pin can be passed as parameter. - * @rmtoll AFRL AFSELy LL_GPIO_SetAFPin_0_7 - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @param Alternate This parameter can be one of the following values: - * @arg @ref LL_GPIO_AF_0 - * @arg @ref LL_GPIO_AF_1 - * @arg @ref LL_GPIO_AF_2 - * @arg @ref LL_GPIO_AF_3 - * @arg @ref LL_GPIO_AF_4 - * @arg @ref LL_GPIO_AF_5 - * @arg @ref LL_GPIO_AF_6 - * @arg @ref LL_GPIO_AF_7 - * @arg @ref LL_GPIO_AF_8 - * @arg @ref LL_GPIO_AF_9 - * @arg @ref LL_GPIO_AF_10 - * @arg @ref LL_GPIO_AF_11 - * @arg @ref LL_GPIO_AF_12 - * @arg @ref LL_GPIO_AF_13 - * @arg @ref LL_GPIO_AF_14 - * @arg @ref LL_GPIO_AF_15 - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) -{ - MODIFY_REG(GPIOx->AFR[0], (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * 4U)), - (Alternate << (POSITION_VAL(Pin) * 4U))); -} - -/** - * @brief Return gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port. - * @rmtoll AFRL AFSELy LL_GPIO_GetAFPin_0_7 - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_AF_0 - * @arg @ref LL_GPIO_AF_1 - * @arg @ref LL_GPIO_AF_2 - * @arg @ref LL_GPIO_AF_3 - * @arg @ref LL_GPIO_AF_4 - * @arg @ref LL_GPIO_AF_5 - * @arg @ref LL_GPIO_AF_6 - * @arg @ref LL_GPIO_AF_7 - * @arg @ref LL_GPIO_AF_8 - * @arg @ref LL_GPIO_AF_9 - * @arg @ref LL_GPIO_AF_10 - * @arg @ref LL_GPIO_AF_11 - * @arg @ref LL_GPIO_AF_12 - * @arg @ref LL_GPIO_AF_13 - * @arg @ref LL_GPIO_AF_14 - * @arg @ref LL_GPIO_AF_15 - */ -__STATIC_INLINE uint32_t LL_GPIO_GetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->AFR[0], - (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * 4U))) >> (POSITION_VAL(Pin) * 4U)); -} - -/** - * @brief Configure gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. - * @note Possible values are from AF0 to AF15 depending on target. - * @note Warning: only one pin can be passed as parameter. - * @rmtoll AFRH AFSELy LL_GPIO_SetAFPin_8_15 - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @param Alternate This parameter can be one of the following values: - * @arg @ref LL_GPIO_AF_0 - * @arg @ref LL_GPIO_AF_1 - * @arg @ref LL_GPIO_AF_2 - * @arg @ref LL_GPIO_AF_3 - * @arg @ref LL_GPIO_AF_4 - * @arg @ref LL_GPIO_AF_5 - * @arg @ref LL_GPIO_AF_6 - * @arg @ref LL_GPIO_AF_7 - * @arg @ref LL_GPIO_AF_8 - * @arg @ref LL_GPIO_AF_9 - * @arg @ref LL_GPIO_AF_10 - * @arg @ref LL_GPIO_AF_11 - * @arg @ref LL_GPIO_AF_12 - * @arg @ref LL_GPIO_AF_13 - * @arg @ref LL_GPIO_AF_14 - * @arg @ref LL_GPIO_AF_15 - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) -{ - MODIFY_REG(GPIOx->AFR[1], (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * 4U)), - (Alternate << (POSITION_VAL(Pin >> 8U) * 4U))); -} - -/** - * @brief Return gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. - * @note Possible values are from AF0 to AF15 depending on target. - * @rmtoll AFRH AFSELy LL_GPIO_GetAFPin_8_15 - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_AF_0 - * @arg @ref LL_GPIO_AF_1 - * @arg @ref LL_GPIO_AF_2 - * @arg @ref LL_GPIO_AF_3 - * @arg @ref LL_GPIO_AF_4 - * @arg @ref LL_GPIO_AF_5 - * @arg @ref LL_GPIO_AF_6 - * @arg @ref LL_GPIO_AF_7 - * @arg @ref LL_GPIO_AF_8 - * @arg @ref LL_GPIO_AF_9 - * @arg @ref LL_GPIO_AF_10 - * @arg @ref LL_GPIO_AF_11 - * @arg @ref LL_GPIO_AF_12 - * @arg @ref LL_GPIO_AF_13 - * @arg @ref LL_GPIO_AF_14 - * @arg @ref LL_GPIO_AF_15 - */ -__STATIC_INLINE uint32_t LL_GPIO_GetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->AFR[1], - (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * 4U))) >> (POSITION_VAL(Pin >> 8U) * 4U)); -} - - -/** - * @brief Lock configuration of several pins for a dedicated port. - * @note When the lock sequence has been applied on a port bit, the - * value of this port bit can no longer be modified until the - * next reset. - * @note Each lock bit freezes a specific configuration register - * (control and alternate function registers). - * @rmtoll LCKR LCKK LL_GPIO_LockPin - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void LL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - __IO uint32_t temp; - WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask); - WRITE_REG(GPIOx->LCKR, PinMask); - WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask); - temp = READ_REG(GPIOx->LCKR); - (void) temp; -} - -/** - * @brief Return 1 if all pins passed as parameter, of a dedicated port, are locked. else Return 0. - * @rmtoll LCKR LCKy LL_GPIO_IsPinLocked - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_GPIO_IsPinLocked(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - return (READ_BIT(GPIOx->LCKR, PinMask) == (PinMask)); -} - -/** - * @brief Return 1 if one of the pin of a dedicated port is locked. else return 0. - * @rmtoll LCKR LCKK LL_GPIO_IsAnyPinLocked - * @param GPIOx GPIO Port - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_GPIO_IsAnyPinLocked(GPIO_TypeDef *GPIOx) -{ - return (READ_BIT(GPIOx->LCKR, GPIO_LCKR_LCKK) == (GPIO_LCKR_LCKK)); -} - -/** - * @} - */ - -/** @defgroup GPIO_LL_EF_Data_Access Data Access - * @{ - */ - -/** - * @brief Return full input data register value for a dedicated port. - * @rmtoll IDR IDy LL_GPIO_ReadInputPort - * @param GPIOx GPIO Port - * @retval Input data register value of port - */ -__STATIC_INLINE uint32_t LL_GPIO_ReadInputPort(GPIO_TypeDef *GPIOx) -{ - return (uint32_t)(READ_REG(GPIOx->IDR)); -} - -/** - * @brief Return if input data level for several pins of dedicated port is high or low. - * @rmtoll IDR IDy LL_GPIO_IsInputPinSet - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_GPIO_IsInputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - return (READ_BIT(GPIOx->IDR, PinMask) == (PinMask)); -} - -/** - * @brief Write output data register for the port. - * @rmtoll ODR ODy LL_GPIO_WriteOutputPort - * @param GPIOx GPIO Port - * @param PortValue Level value for each pin of the port - * @retval None - */ -__STATIC_INLINE void LL_GPIO_WriteOutputPort(GPIO_TypeDef *GPIOx, uint32_t PortValue) -{ - WRITE_REG(GPIOx->ODR, PortValue); -} - -/** - * @brief Return full output data register value for a dedicated port. - * @rmtoll ODR ODy LL_GPIO_ReadOutputPort - * @param GPIOx GPIO Port - * @retval Output data register value of port - */ -__STATIC_INLINE uint32_t LL_GPIO_ReadOutputPort(GPIO_TypeDef *GPIOx) -{ - return (uint32_t)(READ_REG(GPIOx->ODR)); -} - -/** - * @brief Return if input data level for several pins of dedicated port is high or low. - * @rmtoll ODR ODy LL_GPIO_IsOutputPinSet - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_GPIO_IsOutputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - return (READ_BIT(GPIOx->ODR, PinMask) == (PinMask)); -} - -/** - * @brief Set several pins to high level on dedicated gpio port. - * @rmtoll BSRR BSy LL_GPIO_SetOutputPin - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - WRITE_REG(GPIOx->BSRR, PinMask); -} - -/** - * @brief Set several pins to low level on dedicated gpio port. - * @rmtoll BSRR BRy LL_GPIO_ResetOutputPin - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void LL_GPIO_ResetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - WRITE_REG(GPIOx->BSRR, (PinMask << 16)); -} - -/** - * @brief Toggle data value for several pin of dedicated port. - * @rmtoll ODR ODy LL_GPIO_TogglePin - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void LL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - uint32_t odr = READ_REG(GPIOx->ODR); - WRITE_REG(GPIOx->BSRR, ((odr & PinMask) << 16u) | (~odr & PinMask)); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup GPIO_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -ErrorStatus LL_GPIO_DeInit(GPIO_TypeDef *GPIOx); -ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct); -void LL_GPIO_StructInit(LL_GPIO_InitTypeDef *GPIO_InitStruct); - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK) */ -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_GPIO_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h deleted file mode 100644 index 92d4a74..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h +++ /dev/null @@ -1,1890 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_i2c.h - * @author MCD Application Team - * @brief Header file of I2C LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_I2C_H -#define __STM32F4xx_LL_I2C_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (I2C1) || defined (I2C2) || defined (I2C3) - -/** @defgroup I2C_LL I2C - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup I2C_LL_Private_Constants I2C Private Constants - * @{ - */ - -/* Defines used to perform compute and check in the macros */ -#define LL_I2C_MAX_SPEED_STANDARD 100000U -#define LL_I2C_MAX_SPEED_FAST 400000U -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2C_LL_Private_Macros I2C Private Macros - * @{ - */ -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2C_LL_ES_INIT I2C Exported Init structure - * @{ - */ -typedef struct -{ - uint32_t PeripheralMode; /*!< Specifies the peripheral mode. - This parameter can be a value of @ref I2C_LL_EC_PERIPHERAL_MODE - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetMode(). */ - - uint32_t ClockSpeed; /*!< Specifies the clock frequency. - This parameter must be set to a value lower than 400kHz (in Hz) - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetClockPeriod() - or @ref LL_I2C_SetDutyCycle() or @ref LL_I2C_SetClockSpeedMode() or @ref LL_I2C_ConfigSpeed(). */ - - uint32_t DutyCycle; /*!< Specifies the I2C fast mode duty cycle. - This parameter can be a value of @ref I2C_LL_EC_DUTYCYCLE - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetDutyCycle(). */ - -#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) - uint32_t AnalogFilter; /*!< Enables or disables analog noise filter. - This parameter can be a value of @ref I2C_LL_EC_ANALOGFILTER_SELECTION - - This feature can be modified afterwards using unitary functions @ref LL_I2C_EnableAnalogFilter() or LL_I2C_DisableAnalogFilter(). */ - - uint32_t DigitalFilter; /*!< Configures the digital noise filter. - This parameter can be a number between Min_Data = 0x00 and Max_Data = 0x0F - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetDigitalFilter(). */ - -#endif - uint32_t OwnAddress1; /*!< Specifies the device own address 1. - This parameter must be a value between Min_Data = 0x00 and Max_Data = 0x3FF - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetOwnAddress1(). */ - - uint32_t TypeAcknowledge; /*!< Specifies the ACKnowledge or Non ACKnowledge condition after the address receive match code or next received byte. - This parameter can be a value of @ref I2C_LL_EC_I2C_ACKNOWLEDGE - - This feature can be modified afterwards using unitary function @ref LL_I2C_AcknowledgeNextData(). */ - - uint32_t OwnAddrSize; /*!< Specifies the device own address 1 size (7-bit or 10-bit). - This parameter can be a value of @ref I2C_LL_EC_OWNADDRESS1 - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetOwnAddress1(). */ -} LL_I2C_InitTypeDef; -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2C_LL_Exported_Constants I2C Exported Constants - * @{ - */ - -/** @defgroup I2C_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_I2C_ReadReg function - * @{ - */ -#define LL_I2C_SR1_SB I2C_SR1_SB /*!< Start Bit (master mode) */ -#define LL_I2C_SR1_ADDR I2C_SR1_ADDR /*!< Address sent (master mode) or - Address matched flag (slave mode) */ -#define LL_I2C_SR1_BTF I2C_SR1_BTF /*!< Byte Transfer Finished flag */ -#define LL_I2C_SR1_ADD10 I2C_SR1_ADD10 /*!< 10-bit header sent (master mode) */ -#define LL_I2C_SR1_STOPF I2C_SR1_STOPF /*!< Stop detection flag (slave mode) */ -#define LL_I2C_SR1_RXNE I2C_SR1_RXNE /*!< Data register not empty (receivers) */ -#define LL_I2C_SR1_TXE I2C_SR1_TXE /*!< Data register empty (transmitters) */ -#define LL_I2C_SR1_BERR I2C_SR1_BERR /*!< Bus error */ -#define LL_I2C_SR1_ARLO I2C_SR1_ARLO /*!< Arbitration lost */ -#define LL_I2C_SR1_AF I2C_SR1_AF /*!< Acknowledge failure flag */ -#define LL_I2C_SR1_OVR I2C_SR1_OVR /*!< Overrun/Underrun */ -#define LL_I2C_SR1_PECERR I2C_ISR_PECERR /*!< PEC Error in reception (SMBus mode) */ -#define LL_I2C_SR1_TIMEOUT I2C_ISR_TIMEOUT /*!< Timeout detection flag (SMBus mode) */ -#define LL_I2C_SR1_SMALERT I2C_ISR_SMALERT /*!< SMBus alert (SMBus mode) */ -#define LL_I2C_SR2_MSL I2C_SR2_MSL /*!< Master/Slave flag */ -#define LL_I2C_SR2_BUSY I2C_SR2_BUSY /*!< Bus busy flag */ -#define LL_I2C_SR2_TRA I2C_SR2_TRA /*!< Transmitter/receiver direction */ -#define LL_I2C_SR2_GENCALL I2C_SR2_GENCALL /*!< General call address (Slave mode) */ -#define LL_I2C_SR2_SMBDEFAULT I2C_SR2_SMBDEFAULT /*!< SMBus Device default address (Slave mode) */ -#define LL_I2C_SR2_SMBHOST I2C_SR2_SMBHOST /*!< SMBus Host address (Slave mode) */ -#define LL_I2C_SR2_DUALF I2C_SR2_DUALF /*!< Dual flag (Slave mode) */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_I2C_ReadReg and LL_I2C_WriteReg functions - * @{ - */ -#define LL_I2C_CR2_ITEVTEN I2C_CR2_ITEVTEN /*!< Events interrupts enable */ -#define LL_I2C_CR2_ITBUFEN I2C_CR2_ITBUFEN /*!< Buffer interrupts enable */ -#define LL_I2C_CR2_ITERREN I2C_CR2_ITERREN /*!< Error interrupts enable */ -/** - * @} - */ - -#if defined(I2C_FLTR_ANOFF) -/** @defgroup I2C_LL_EC_ANALOGFILTER_SELECTION Analog Filter Selection - * @{ - */ -#define LL_I2C_ANALOGFILTER_ENABLE 0x00000000U /*!< Analog filter is enabled. */ -#define LL_I2C_ANALOGFILTER_DISABLE I2C_FLTR_ANOFF /*!< Analog filter is disabled.*/ -/** - * @} - */ - -#endif -/** @defgroup I2C_LL_EC_OWNADDRESS1 Own Address 1 Length - * @{ - */ -#define LL_I2C_OWNADDRESS1_7BIT 0x00004000U /*!< Own address 1 is a 7-bit address. */ -#define LL_I2C_OWNADDRESS1_10BIT (uint32_t)(I2C_OAR1_ADDMODE | 0x00004000U) /*!< Own address 1 is a 10-bit address. */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_DUTYCYCLE Fast Mode Duty Cycle - * @{ - */ -#define LL_I2C_DUTYCYCLE_2 0x00000000U /*!< I2C fast mode Tlow/Thigh = 2 */ -#define LL_I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY /*!< I2C fast mode Tlow/Thigh = 16/9 */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_CLOCK_SPEED_MODE Master Clock Speed Mode - * @{ - */ -#define LL_I2C_CLOCK_SPEED_STANDARD_MODE 0x00000000U /*!< Master clock speed range is standard mode */ -#define LL_I2C_CLOCK_SPEED_FAST_MODE I2C_CCR_FS /*!< Master clock speed range is fast mode */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_PERIPHERAL_MODE Peripheral Mode - * @{ - */ -#define LL_I2C_MODE_I2C 0x00000000U /*!< I2C Master or Slave mode */ -#define LL_I2C_MODE_SMBUS_HOST (uint32_t)(I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP) /*!< SMBus Host address acknowledge */ -#define LL_I2C_MODE_SMBUS_DEVICE I2C_CR1_SMBUS /*!< SMBus Device default mode (Default address not acknowledge) */ -#define LL_I2C_MODE_SMBUS_DEVICE_ARP (uint32_t)(I2C_CR1_SMBUS | I2C_CR1_ENARP) /*!< SMBus Device Default address acknowledge */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_I2C_ACKNOWLEDGE Acknowledge Generation - * @{ - */ -#define LL_I2C_ACK I2C_CR1_ACK /*!< ACK is sent after current received byte. */ -#define LL_I2C_NACK 0x00000000U /*!< NACK is sent after current received byte.*/ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_DIRECTION Read Write Direction - * @{ - */ -#define LL_I2C_DIRECTION_WRITE I2C_SR2_TRA /*!< Bus is in write transfer */ -#define LL_I2C_DIRECTION_READ 0x00000000U /*!< Bus is in read transfer */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup I2C_LL_Exported_Macros I2C Exported Macros - * @{ - */ - -/** @defgroup I2C_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in I2C register - * @param __INSTANCE__ I2C Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_I2C_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in I2C register - * @param __INSTANCE__ I2C Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_I2C_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** @defgroup I2C_LL_EM_Exported_Macros_Helper Exported Macros Helper - * @{ - */ - -/** - * @brief Convert Peripheral Clock Frequency in Mhz. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). - * @retval Value of peripheral clock (in Mhz) - */ -#define __LL_I2C_FREQ_HZ_TO_MHZ(__PCLK__) (uint32_t)((__PCLK__)/1000000U) - -/** - * @brief Convert Peripheral Clock Frequency in Hz. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Mhz). - * @retval Value of peripheral clock (in Hz) - */ -#define __LL_I2C_FREQ_MHZ_TO_HZ(__PCLK__) (uint32_t)((__PCLK__)*1000000U) - -/** - * @brief Compute I2C Clock rising time. - * @param __FREQRANGE__ This parameter must be a value of peripheral clock (in Mhz). - * @param __SPEED__ This parameter must be a value lower than 400kHz (in Hz). - * @retval Value between Min_Data=0x02 and Max_Data=0x3F - */ -#define __LL_I2C_RISE_TIME(__FREQRANGE__, __SPEED__) (uint32_t)(((__SPEED__) <= LL_I2C_MAX_SPEED_STANDARD) ? ((__FREQRANGE__) + 1U) : ((((__FREQRANGE__) * 300U) / 1000U) + 1U)) - -/** - * @brief Compute Speed clock range to a Clock Control Register (I2C_CCR_CCR) value. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). - * @param __SPEED__ This parameter must be a value lower than 400kHz (in Hz). - * @param __DUTYCYCLE__ This parameter can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - * @retval Value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. - */ -#define __LL_I2C_SPEED_TO_CCR(__PCLK__, __SPEED__, __DUTYCYCLE__) (uint32_t)(((__SPEED__) <= LL_I2C_MAX_SPEED_STANDARD)? \ - (__LL_I2C_SPEED_STANDARD_TO_CCR((__PCLK__), (__SPEED__))) : \ - (__LL_I2C_SPEED_FAST_TO_CCR((__PCLK__), (__SPEED__), (__DUTYCYCLE__)))) - -/** - * @brief Compute Speed Standard clock range to a Clock Control Register (I2C_CCR_CCR) value. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). - * @param __SPEED__ This parameter must be a value lower than 100kHz (in Hz). - * @retval Value between Min_Data=0x004 and Max_Data=0xFFF. - */ -#define __LL_I2C_SPEED_STANDARD_TO_CCR(__PCLK__, __SPEED__) (uint32_t)(((((__PCLK__)/((__SPEED__) << 1U)) & I2C_CCR_CCR) < 4U)? 4U:((__PCLK__) / ((__SPEED__) << 1U))) - -/** - * @brief Compute Speed Fast clock range to a Clock Control Register (I2C_CCR_CCR) value. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). - * @param __SPEED__ This parameter must be a value between Min_Data=100Khz and Max_Data=400Khz (in Hz). - * @param __DUTYCYCLE__ This parameter can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - * @retval Value between Min_Data=0x001 and Max_Data=0xFFF - */ -#define __LL_I2C_SPEED_FAST_TO_CCR(__PCLK__, __SPEED__, __DUTYCYCLE__) (uint32_t)(((__DUTYCYCLE__) == LL_I2C_DUTYCYCLE_2)? \ - (((((__PCLK__) / ((__SPEED__) * 3U)) & I2C_CCR_CCR) == 0U)? 1U:((__PCLK__) / ((__SPEED__) * 3U))) : \ - (((((__PCLK__) / ((__SPEED__) * 25U)) & I2C_CCR_CCR) == 0U)? 1U:((__PCLK__) / ((__SPEED__) * 25U)))) - -/** - * @brief Get the Least significant bits of a 10-Bits address. - * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. - * @retval Value between Min_Data=0x00 and Max_Data=0xFF - */ -#define __LL_I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FF)))) - -/** - * @brief Convert a 10-Bits address to a 10-Bits header with Write direction. - * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. - * @retval Value between Min_Data=0xF0 and Max_Data=0xF6 - */ -#define __LL_I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300))) >> 7) | (uint16_t)(0xF0)))) - -/** - * @brief Convert a 10-Bits address to a 10-Bits header with Read direction. - * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. - * @retval Value between Min_Data=0xF1 and Max_Data=0xF7 - */ -#define __LL_I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300))) >> 7) | (uint16_t)(0xF1)))) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup I2C_LL_Exported_Functions I2C Exported Functions - * @{ - */ - -/** @defgroup I2C_LL_EF_Configuration Configuration - * @{ - */ - -/** - * @brief Enable I2C peripheral (PE = 1). - * @rmtoll CR1 PE LL_I2C_Enable - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_Enable(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_PE); -} - -/** - * @brief Disable I2C peripheral (PE = 0). - * @rmtoll CR1 PE LL_I2C_Disable - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_Disable(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_PE); -} - -/** - * @brief Check if the I2C peripheral is enabled or disabled. - * @rmtoll CR1 PE LL_I2C_IsEnabled - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabled(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_PE) == (I2C_CR1_PE)); -} - -#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) -/** - * @brief Configure Noise Filters (Analog and Digital). - * @note If the analog filter is also enabled, the digital filter is added to analog filter. - * The filters can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll FLTR ANOFF LL_I2C_ConfigFilters\n - * FLTR DNF LL_I2C_ConfigFilters - * @param I2Cx I2C Instance. - * @param AnalogFilter This parameter can be one of the following values: - * @arg @ref LL_I2C_ANALOGFILTER_ENABLE - * @arg @ref LL_I2C_ANALOGFILTER_DISABLE - * @param DigitalFilter This parameter must be a value between Min_Data=0x00 (Digital filter disabled) and Max_Data=0x0F (Digital filter enabled and filtering capability up to 15*TPCLK1) - * This parameter is used to configure the digital noise filter on SDA and SCL input. The digital filter will suppress the spikes with a length of up to DNF[3:0]*TPCLK1. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ConfigFilters(I2C_TypeDef *I2Cx, uint32_t AnalogFilter, uint32_t DigitalFilter) -{ - MODIFY_REG(I2Cx->FLTR, I2C_FLTR_ANOFF | I2C_FLTR_DNF, AnalogFilter | DigitalFilter); -} -#endif -#if defined(I2C_FLTR_DNF) - -/** - * @brief Configure Digital Noise Filter. - * @note If the analog filter is also enabled, the digital filter is added to analog filter. - * This filter can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll FLTR DNF LL_I2C_SetDigitalFilter - * @param I2Cx I2C Instance. - * @param DigitalFilter This parameter must be a value between Min_Data=0x00 (Digital filter disabled) and Max_Data=0x0F (Digital filter enabled and filtering capability up to 15*TPCLK1) - * This parameter is used to configure the digital noise filter on SDA and SCL input. The digital filter will suppress the spikes with a length of up to DNF[3:0]*TPCLK1. - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetDigitalFilter(I2C_TypeDef *I2Cx, uint32_t DigitalFilter) -{ - MODIFY_REG(I2Cx->FLTR, I2C_FLTR_DNF, DigitalFilter); -} - -/** - * @brief Get the current Digital Noise Filter configuration. - * @rmtoll FLTR DNF LL_I2C_GetDigitalFilter - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x0 and Max_Data=0xF - */ -__STATIC_INLINE uint32_t LL_I2C_GetDigitalFilter(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->FLTR, I2C_FLTR_DNF)); -} -#endif -#if defined(I2C_FLTR_ANOFF) - -/** - * @brief Enable Analog Noise Filter. - * @note This filter can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll FLTR ANOFF LL_I2C_EnableAnalogFilter - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableAnalogFilter(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF); -} - -/** - * @brief Disable Analog Noise Filter. - * @note This filter can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll FLTR ANOFF LL_I2C_DisableAnalogFilter - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableAnalogFilter(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF); -} - -/** - * @brief Check if Analog Noise Filter is enabled or disabled. - * @rmtoll FLTR ANOFF LL_I2C_IsEnabledAnalogFilter - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledAnalogFilter(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF) == (I2C_FLTR_ANOFF)); -} -#endif - -/** - * @brief Enable DMA transmission requests. - * @rmtoll CR2 DMAEN LL_I2C_EnableDMAReq_TX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableDMAReq_TX(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_DMAEN); -} - -/** - * @brief Disable DMA transmission requests. - * @rmtoll CR2 DMAEN LL_I2C_DisableDMAReq_TX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableDMAReq_TX(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_DMAEN); -} - -/** - * @brief Check if DMA transmission requests are enabled or disabled. - * @rmtoll CR2 DMAEN LL_I2C_IsEnabledDMAReq_TX - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledDMAReq_TX(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_DMAEN) == (I2C_CR2_DMAEN)); -} - -/** - * @brief Enable DMA reception requests. - * @rmtoll CR2 DMAEN LL_I2C_EnableDMAReq_RX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableDMAReq_RX(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_DMAEN); -} - -/** - * @brief Disable DMA reception requests. - * @rmtoll CR2 DMAEN LL_I2C_DisableDMAReq_RX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableDMAReq_RX(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_DMAEN); -} - -/** - * @brief Check if DMA reception requests are enabled or disabled. - * @rmtoll CR2 DMAEN LL_I2C_IsEnabledDMAReq_RX - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledDMAReq_RX(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_DMAEN) == (I2C_CR2_DMAEN)); -} - -/** - * @brief Get the data register address used for DMA transfer. - * @rmtoll DR DR LL_I2C_DMA_GetRegAddr - * @param I2Cx I2C Instance. - * @retval Address of data register - */ -__STATIC_INLINE uint32_t LL_I2C_DMA_GetRegAddr(I2C_TypeDef *I2Cx) -{ - return (uint32_t) & (I2Cx->DR); -} - -/** - * @brief Enable Clock stretching. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll CR1 NOSTRETCH LL_I2C_EnableClockStretching - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableClockStretching(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH); -} - -/** - * @brief Disable Clock stretching. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll CR1 NOSTRETCH LL_I2C_DisableClockStretching - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableClockStretching(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH); -} - -/** - * @brief Check if Clock stretching is enabled or disabled. - * @rmtoll CR1 NOSTRETCH LL_I2C_IsEnabledClockStretching - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledClockStretching(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH) != (I2C_CR1_NOSTRETCH)); -} - -/** - * @brief Enable General Call. - * @note When enabled the Address 0x00 is ACKed. - * @rmtoll CR1 ENGC LL_I2C_EnableGeneralCall - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableGeneralCall(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_ENGC); -} - -/** - * @brief Disable General Call. - * @note When disabled the Address 0x00 is NACKed. - * @rmtoll CR1 ENGC LL_I2C_DisableGeneralCall - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableGeneralCall(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_ENGC); -} - -/** - * @brief Check if General Call is enabled or disabled. - * @rmtoll CR1 ENGC LL_I2C_IsEnabledGeneralCall - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledGeneralCall(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_ENGC) == (I2C_CR1_ENGC)); -} - -/** - * @brief Set the Own Address1. - * @rmtoll OAR1 ADD0 LL_I2C_SetOwnAddress1\n - * OAR1 ADD1_7 LL_I2C_SetOwnAddress1\n - * OAR1 ADD8_9 LL_I2C_SetOwnAddress1\n - * OAR1 ADDMODE LL_I2C_SetOwnAddress1 - * @param I2Cx I2C Instance. - * @param OwnAddress1 This parameter must be a value between Min_Data=0 and Max_Data=0x3FF. - * @param OwnAddrSize This parameter can be one of the following values: - * @arg @ref LL_I2C_OWNADDRESS1_7BIT - * @arg @ref LL_I2C_OWNADDRESS1_10BIT - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetOwnAddress1(I2C_TypeDef *I2Cx, uint32_t OwnAddress1, uint32_t OwnAddrSize) -{ - MODIFY_REG(I2Cx->OAR1, I2C_OAR1_ADD0 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD8_9 | I2C_OAR1_ADDMODE, OwnAddress1 | OwnAddrSize); -} - -/** - * @brief Set the 7bits Own Address2. - * @note This action has no effect if own address2 is enabled. - * @rmtoll OAR2 ADD2 LL_I2C_SetOwnAddress2 - * @param I2Cx I2C Instance. - * @param OwnAddress2 This parameter must be a value between Min_Data=0 and Max_Data=0x7F. - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetOwnAddress2(I2C_TypeDef *I2Cx, uint32_t OwnAddress2) -{ - MODIFY_REG(I2Cx->OAR2, I2C_OAR2_ADD2, OwnAddress2); -} - -/** - * @brief Enable acknowledge on Own Address2 match address. - * @rmtoll OAR2 ENDUAL LL_I2C_EnableOwnAddress2 - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableOwnAddress2(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL); -} - -/** - * @brief Disable acknowledge on Own Address2 match address. - * @rmtoll OAR2 ENDUAL LL_I2C_DisableOwnAddress2 - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableOwnAddress2(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL); -} - -/** - * @brief Check if Own Address1 acknowledge is enabled or disabled. - * @rmtoll OAR2 ENDUAL LL_I2C_IsEnabledOwnAddress2 - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledOwnAddress2(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL) == (I2C_OAR2_ENDUAL)); -} - -/** - * @brief Configure the Peripheral clock frequency. - * @rmtoll CR2 FREQ LL_I2C_SetPeriphClock - * @param I2Cx I2C Instance. - * @param PeriphClock Peripheral Clock (in Hz) - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetPeriphClock(I2C_TypeDef *I2Cx, uint32_t PeriphClock) -{ - MODIFY_REG(I2Cx->CR2, I2C_CR2_FREQ, __LL_I2C_FREQ_HZ_TO_MHZ(PeriphClock)); -} - -/** - * @brief Get the Peripheral clock frequency. - * @rmtoll CR2 FREQ LL_I2C_GetPeriphClock - * @param I2Cx I2C Instance. - * @retval Value of Peripheral Clock (in Hz) - */ -__STATIC_INLINE uint32_t LL_I2C_GetPeriphClock(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(__LL_I2C_FREQ_MHZ_TO_HZ(READ_BIT(I2Cx->CR2, I2C_CR2_FREQ))); -} - -/** - * @brief Configure the Duty cycle (Fast mode only). - * @rmtoll CCR DUTY LL_I2C_SetDutyCycle - * @param I2Cx I2C Instance. - * @param DutyCycle This parameter can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetDutyCycle(I2C_TypeDef *I2Cx, uint32_t DutyCycle) -{ - MODIFY_REG(I2Cx->CCR, I2C_CCR_DUTY, DutyCycle); -} - -/** - * @brief Get the Duty cycle (Fast mode only). - * @rmtoll CCR DUTY LL_I2C_GetDutyCycle - * @param I2Cx I2C Instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - */ -__STATIC_INLINE uint32_t LL_I2C_GetDutyCycle(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_DUTY)); -} - -/** - * @brief Configure the I2C master clock speed mode. - * @rmtoll CCR FS LL_I2C_SetClockSpeedMode - * @param I2Cx I2C Instance. - * @param ClockSpeedMode This parameter can be one of the following values: - * @arg @ref LL_I2C_CLOCK_SPEED_STANDARD_MODE - * @arg @ref LL_I2C_CLOCK_SPEED_FAST_MODE - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetClockSpeedMode(I2C_TypeDef *I2Cx, uint32_t ClockSpeedMode) -{ - MODIFY_REG(I2Cx->CCR, I2C_CCR_FS, ClockSpeedMode); -} - -/** - * @brief Get the the I2C master speed mode. - * @rmtoll CCR FS LL_I2C_GetClockSpeedMode - * @param I2Cx I2C Instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_CLOCK_SPEED_STANDARD_MODE - * @arg @ref LL_I2C_CLOCK_SPEED_FAST_MODE - */ -__STATIC_INLINE uint32_t LL_I2C_GetClockSpeedMode(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_FS)); -} - -/** - * @brief Configure the SCL, SDA rising time. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll TRISE TRISE LL_I2C_SetRiseTime - * @param I2Cx I2C Instance. - * @param RiseTime This parameter must be a value between Min_Data=0x02 and Max_Data=0x3F. - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetRiseTime(I2C_TypeDef *I2Cx, uint32_t RiseTime) -{ - MODIFY_REG(I2Cx->TRISE, I2C_TRISE_TRISE, RiseTime); -} - -/** - * @brief Get the SCL, SDA rising time. - * @rmtoll TRISE TRISE LL_I2C_GetRiseTime - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x02 and Max_Data=0x3F - */ -__STATIC_INLINE uint32_t LL_I2C_GetRiseTime(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->TRISE, I2C_TRISE_TRISE)); -} - -/** - * @brief Configure the SCL high and low period. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll CCR CCR LL_I2C_SetClockPeriod - * @param I2Cx I2C Instance. - * @param ClockPeriod This parameter must be a value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetClockPeriod(I2C_TypeDef *I2Cx, uint32_t ClockPeriod) -{ - MODIFY_REG(I2Cx->CCR, I2C_CCR_CCR, ClockPeriod); -} - -/** - * @brief Get the SCL high and low period. - * @rmtoll CCR CCR LL_I2C_GetClockPeriod - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. - */ -__STATIC_INLINE uint32_t LL_I2C_GetClockPeriod(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_CCR)); -} - -/** - * @brief Configure the SCL speed. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll CR2 FREQ LL_I2C_ConfigSpeed\n - * TRISE TRISE LL_I2C_ConfigSpeed\n - * CCR FS LL_I2C_ConfigSpeed\n - * CCR DUTY LL_I2C_ConfigSpeed\n - * CCR CCR LL_I2C_ConfigSpeed - * @param I2Cx I2C Instance. - * @param PeriphClock Peripheral Clock (in Hz) - * @param ClockSpeed This parameter must be a value lower than 400kHz (in Hz). - * @param DutyCycle This parameter can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - * @retval None - */ -__STATIC_INLINE void LL_I2C_ConfigSpeed(I2C_TypeDef *I2Cx, uint32_t PeriphClock, uint32_t ClockSpeed, - uint32_t DutyCycle) -{ - uint32_t freqrange = 0x0U; - uint32_t clockconfig = 0x0U; - - /* Compute frequency range */ - freqrange = __LL_I2C_FREQ_HZ_TO_MHZ(PeriphClock); - - /* Configure I2Cx: Frequency range register */ - MODIFY_REG(I2Cx->CR2, I2C_CR2_FREQ, freqrange); - - /* Configure I2Cx: Rise Time register */ - MODIFY_REG(I2Cx->TRISE, I2C_TRISE_TRISE, __LL_I2C_RISE_TIME(freqrange, ClockSpeed)); - - /* Configure Speed mode, Duty Cycle and Clock control register value */ - if (ClockSpeed > LL_I2C_MAX_SPEED_STANDARD) - { - /* Set Speed mode at fast and duty cycle for Clock Speed request in fast clock range */ - clockconfig = LL_I2C_CLOCK_SPEED_FAST_MODE | \ - __LL_I2C_SPEED_FAST_TO_CCR(PeriphClock, ClockSpeed, DutyCycle) | \ - DutyCycle; - } - else - { - /* Set Speed mode at standard for Clock Speed request in standard clock range */ - clockconfig = LL_I2C_CLOCK_SPEED_STANDARD_MODE | \ - __LL_I2C_SPEED_STANDARD_TO_CCR(PeriphClock, ClockSpeed); - } - - /* Configure I2Cx: Clock control register */ - MODIFY_REG(I2Cx->CCR, (I2C_CCR_FS | I2C_CCR_DUTY | I2C_CCR_CCR), clockconfig); -} - -/** - * @brief Configure peripheral mode. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 SMBUS LL_I2C_SetMode\n - * CR1 SMBTYPE LL_I2C_SetMode\n - * CR1 ENARP LL_I2C_SetMode - * @param I2Cx I2C Instance. - * @param PeripheralMode This parameter can be one of the following values: - * @arg @ref LL_I2C_MODE_I2C - * @arg @ref LL_I2C_MODE_SMBUS_HOST - * @arg @ref LL_I2C_MODE_SMBUS_DEVICE - * @arg @ref LL_I2C_MODE_SMBUS_DEVICE_ARP - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetMode(I2C_TypeDef *I2Cx, uint32_t PeripheralMode) -{ - MODIFY_REG(I2Cx->CR1, I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP, PeripheralMode); -} - -/** - * @brief Get peripheral mode. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 SMBUS LL_I2C_GetMode\n - * CR1 SMBTYPE LL_I2C_GetMode\n - * CR1 ENARP LL_I2C_GetMode - * @param I2Cx I2C Instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_MODE_I2C - * @arg @ref LL_I2C_MODE_SMBUS_HOST - * @arg @ref LL_I2C_MODE_SMBUS_DEVICE - * @arg @ref LL_I2C_MODE_SMBUS_DEVICE_ARP - */ -__STATIC_INLINE uint32_t LL_I2C_GetMode(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->CR1, I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP)); -} - -/** - * @brief Enable SMBus alert (Host or Device mode) - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note SMBus Device mode: - * - SMBus Alert pin is drived low and - * Alert Response Address Header acknowledge is enabled. - * SMBus Host mode: - * - SMBus Alert pin management is supported. - * @rmtoll CR1 ALERT LL_I2C_EnableSMBusAlert - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableSMBusAlert(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_ALERT); -} - -/** - * @brief Disable SMBus alert (Host or Device mode) - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note SMBus Device mode: - * - SMBus Alert pin is not drived (can be used as a standard GPIO) and - * Alert Response Address Header acknowledge is disabled. - * SMBus Host mode: - * - SMBus Alert pin management is not supported. - * @rmtoll CR1 ALERT LL_I2C_DisableSMBusAlert - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableSMBusAlert(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_ALERT); -} - -/** - * @brief Check if SMBus alert (Host or Device mode) is enabled or disabled. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 ALERT LL_I2C_IsEnabledSMBusAlert - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusAlert(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_ALERT) == (I2C_CR1_ALERT)); -} - -/** - * @brief Enable SMBus Packet Error Calculation (PEC). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 ENPEC LL_I2C_EnableSMBusPEC - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableSMBusPEC(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_ENPEC); -} - -/** - * @brief Disable SMBus Packet Error Calculation (PEC). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 ENPEC LL_I2C_DisableSMBusPEC - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableSMBusPEC(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_ENPEC); -} - -/** - * @brief Check if SMBus Packet Error Calculation (PEC) is enabled or disabled. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 ENPEC LL_I2C_IsEnabledSMBusPEC - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusPEC(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_ENPEC) == (I2C_CR1_ENPEC)); -} - -/** - * @} - */ - -/** @defgroup I2C_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable TXE interrupt. - * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_TX\n - * CR2 ITBUFEN LL_I2C_EnableIT_TX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_TX(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); -} - -/** - * @brief Disable TXE interrupt. - * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_TX\n - * CR2 ITBUFEN LL_I2C_DisableIT_TX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_TX(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); -} - -/** - * @brief Check if the TXE Interrupt is enabled or disabled. - * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_TX\n - * CR2 ITBUFEN LL_I2C_IsEnabledIT_TX - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_TX(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN) == (I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN)); -} - -/** - * @brief Enable RXNE interrupt. - * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_RX\n - * CR2 ITBUFEN LL_I2C_EnableIT_RX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_RX(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); -} - -/** - * @brief Disable RXNE interrupt. - * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_RX\n - * CR2 ITBUFEN LL_I2C_DisableIT_RX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_RX(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); -} - -/** - * @brief Check if the RXNE Interrupt is enabled or disabled. - * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_RX\n - * CR2 ITBUFEN LL_I2C_IsEnabledIT_RX - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_RX(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN) == (I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN)); -} - -/** - * @brief Enable Events interrupts. - * @note Any of these events will generate interrupt : - * Start Bit (SB) - * Address sent, Address matched (ADDR) - * 10-bit header sent (ADD10) - * Stop detection (STOPF) - * Byte transfer finished (BTF) - * - * @note Any of these events will generate interrupt if Buffer interrupts are enabled too(using unitary function @ref LL_I2C_EnableIT_BUF()) : - * Receive buffer not empty (RXNE) - * Transmit buffer empty (TXE) - * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_EVT - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_EVT(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN); -} - -/** - * @brief Disable Events interrupts. - * @note Any of these events will generate interrupt : - * Start Bit (SB) - * Address sent, Address matched (ADDR) - * 10-bit header sent (ADD10) - * Stop detection (STOPF) - * Byte transfer finished (BTF) - * Receive buffer not empty (RXNE) - * Transmit buffer empty (TXE) - * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_EVT - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_EVT(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN); -} - -/** - * @brief Check if Events interrupts are enabled or disabled. - * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_EVT - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_EVT(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN) == (I2C_CR2_ITEVTEN)); -} - -/** - * @brief Enable Buffer interrupts. - * @note Any of these Buffer events will generate interrupt if Events interrupts are enabled too(using unitary function @ref LL_I2C_EnableIT_EVT()) : - * Receive buffer not empty (RXNE) - * Transmit buffer empty (TXE) - * @rmtoll CR2 ITBUFEN LL_I2C_EnableIT_BUF - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_BUF(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN); -} - -/** - * @brief Disable Buffer interrupts. - * @note Any of these Buffer events will generate interrupt : - * Receive buffer not empty (RXNE) - * Transmit buffer empty (TXE) - * @rmtoll CR2 ITBUFEN LL_I2C_DisableIT_BUF - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_BUF(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN); -} - -/** - * @brief Check if Buffer interrupts are enabled or disabled. - * @rmtoll CR2 ITBUFEN LL_I2C_IsEnabledIT_BUF - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_BUF(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN) == (I2C_CR2_ITBUFEN)); -} - -/** - * @brief Enable Error interrupts. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note Any of these errors will generate interrupt : - * Bus Error detection (BERR) - * Arbitration Loss (ARLO) - * Acknowledge Failure(AF) - * Overrun/Underrun (OVR) - * SMBus Timeout detection (TIMEOUT) - * SMBus PEC error detection (PECERR) - * SMBus Alert pin event detection (SMBALERT) - * @rmtoll CR2 ITERREN LL_I2C_EnableIT_ERR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_ERR(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITERREN); -} - -/** - * @brief Disable Error interrupts. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note Any of these errors will generate interrupt : - * Bus Error detection (BERR) - * Arbitration Loss (ARLO) - * Acknowledge Failure(AF) - * Overrun/Underrun (OVR) - * SMBus Timeout detection (TIMEOUT) - * SMBus PEC error detection (PECERR) - * SMBus Alert pin event detection (SMBALERT) - * @rmtoll CR2 ITERREN LL_I2C_DisableIT_ERR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_ERR(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITERREN); -} - -/** - * @brief Check if Error interrupts are enabled or disabled. - * @rmtoll CR2 ITERREN LL_I2C_IsEnabledIT_ERR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_ERR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITERREN) == (I2C_CR2_ITERREN)); -} - -/** - * @} - */ - -/** @defgroup I2C_LL_EF_FLAG_management FLAG_management - * @{ - */ - -/** - * @brief Indicate the status of Transmit data register empty flag. - * @note RESET: When next data is written in Transmit data register. - * SET: When Transmit data register is empty. - * @rmtoll SR1 TXE LL_I2C_IsActiveFlag_TXE - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_TXE(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_TXE) == (I2C_SR1_TXE)); -} - -/** - * @brief Indicate the status of Byte Transfer Finished flag. - * RESET: When Data byte transfer not done. - * SET: When Data byte transfer succeeded. - * @rmtoll SR1 BTF LL_I2C_IsActiveFlag_BTF - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BTF(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_BTF) == (I2C_SR1_BTF)); -} - -/** - * @brief Indicate the status of Receive data register not empty flag. - * @note RESET: When Receive data register is read. - * SET: When the received data is copied in Receive data register. - * @rmtoll SR1 RXNE LL_I2C_IsActiveFlag_RXNE - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_RXNE(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_RXNE) == (I2C_SR1_RXNE)); -} - -/** - * @brief Indicate the status of Start Bit (master mode). - * @note RESET: When No Start condition. - * SET: When Start condition is generated. - * @rmtoll SR1 SB LL_I2C_IsActiveFlag_SB - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_SB(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_SB) == (I2C_SR1_SB)); -} - -/** - * @brief Indicate the status of Address sent (master mode) or Address matched flag (slave mode). - * @note RESET: Clear default value. - * SET: When the address is fully sent (master mode) or when the received slave address matched with one of the enabled slave address (slave mode). - * @rmtoll SR1 ADDR LL_I2C_IsActiveFlag_ADDR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ADDR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_ADDR) == (I2C_SR1_ADDR)); -} - -/** - * @brief Indicate the status of 10-bit header sent (master mode). - * @note RESET: When no ADD10 event occurred. - * SET: When the master has sent the first address byte (header). - * @rmtoll SR1 ADD10 LL_I2C_IsActiveFlag_ADD10 - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ADD10(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_ADD10) == (I2C_SR1_ADD10)); -} - -/** - * @brief Indicate the status of Acknowledge failure flag. - * @note RESET: No acknowledge failure. - * SET: When an acknowledge failure is received after a byte transmission. - * @rmtoll SR1 AF LL_I2C_IsActiveFlag_AF - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_AF(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_AF) == (I2C_SR1_AF)); -} - -/** - * @brief Indicate the status of Stop detection flag (slave mode). - * @note RESET: Clear default value. - * SET: When a Stop condition is detected. - * @rmtoll SR1 STOPF LL_I2C_IsActiveFlag_STOP - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_STOP(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_STOPF) == (I2C_SR1_STOPF)); -} - -/** - * @brief Indicate the status of Bus error flag. - * @note RESET: Clear default value. - * SET: When a misplaced Start or Stop condition is detected. - * @rmtoll SR1 BERR LL_I2C_IsActiveFlag_BERR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BERR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_BERR) == (I2C_SR1_BERR)); -} - -/** - * @brief Indicate the status of Arbitration lost flag. - * @note RESET: Clear default value. - * SET: When arbitration lost. - * @rmtoll SR1 ARLO LL_I2C_IsActiveFlag_ARLO - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ARLO(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_ARLO) == (I2C_SR1_ARLO)); -} - -/** - * @brief Indicate the status of Overrun/Underrun flag. - * @note RESET: Clear default value. - * SET: When an overrun/underrun error occurs (Clock Stretching Disabled). - * @rmtoll SR1 OVR LL_I2C_IsActiveFlag_OVR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_OVR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_OVR) == (I2C_SR1_OVR)); -} - -/** - * @brief Indicate the status of SMBus PEC error flag in reception. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 PECERR LL_I2C_IsActiveSMBusFlag_PECERR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_PECERR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_PECERR) == (I2C_SR1_PECERR)); -} - -/** - * @brief Indicate the status of SMBus Timeout detection flag. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 TIMEOUT LL_I2C_IsActiveSMBusFlag_TIMEOUT - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_TIMEOUT(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_TIMEOUT) == (I2C_SR1_TIMEOUT)); -} - -/** - * @brief Indicate the status of SMBus alert flag. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 SMBALERT LL_I2C_IsActiveSMBusFlag_ALERT - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_ALERT(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_SMBALERT) == (I2C_SR1_SMBALERT)); -} - -/** - * @brief Indicate the status of Bus Busy flag. - * @note RESET: Clear default value. - * SET: When a Start condition is detected. - * @rmtoll SR2 BUSY LL_I2C_IsActiveFlag_BUSY - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BUSY(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_BUSY) == (I2C_SR2_BUSY)); -} - -/** - * @brief Indicate the status of Dual flag. - * @note RESET: Received address matched with OAR1. - * SET: Received address matched with OAR2. - * @rmtoll SR2 DUALF LL_I2C_IsActiveFlag_DUAL - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_DUAL(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_DUALF) == (I2C_SR2_DUALF)); -} - -/** - * @brief Indicate the status of SMBus Host address reception (Slave mode). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note RESET: No SMBus Host address - * SET: SMBus Host address received. - * @note This status is cleared by hardware after a STOP condition or repeated START condition. - * @rmtoll SR2 SMBHOST LL_I2C_IsActiveSMBusFlag_SMBHOST - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_SMBHOST(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_SMBHOST) == (I2C_SR2_SMBHOST)); -} - -/** - * @brief Indicate the status of SMBus Device default address reception (Slave mode). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note RESET: No SMBus Device default address - * SET: SMBus Device default address received. - * @note This status is cleared by hardware after a STOP condition or repeated START condition. - * @rmtoll SR2 SMBDEFAULT LL_I2C_IsActiveSMBusFlag_SMBDEFAULT - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_SMBDEFAULT(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_SMBDEFAULT) == (I2C_SR2_SMBDEFAULT)); -} - -/** - * @brief Indicate the status of General call address reception (Slave mode). - * @note RESET: No General call address - * SET: General call address received. - * @note This status is cleared by hardware after a STOP condition or repeated START condition. - * @rmtoll SR2 GENCALL LL_I2C_IsActiveFlag_GENCALL - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_GENCALL(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_GENCALL) == (I2C_SR2_GENCALL)); -} - -/** - * @brief Indicate the status of Master/Slave flag. - * @note RESET: Slave Mode. - * SET: Master Mode. - * @rmtoll SR2 MSL LL_I2C_IsActiveFlag_MSL - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_MSL(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_MSL) == (I2C_SR2_MSL)); -} - -/** - * @brief Clear Address Matched flag. - * @note Clearing this flag is done by a read access to the I2Cx_SR1 - * register followed by a read access to the I2Cx_SR2 register. - * @rmtoll SR1 ADDR LL_I2C_ClearFlag_ADDR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_ADDR(I2C_TypeDef *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = I2Cx->SR1; - (void) tmpreg; - tmpreg = I2Cx->SR2; - (void) tmpreg; -} - -/** - * @brief Clear Acknowledge failure flag. - * @rmtoll SR1 AF LL_I2C_ClearFlag_AF - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_AF(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_AF); -} - -/** - * @brief Clear Stop detection flag. - * @note Clearing this flag is done by a read access to the I2Cx_SR1 - * register followed by a write access to I2Cx_CR1 register. - * @rmtoll SR1 STOPF LL_I2C_ClearFlag_STOP\n - * CR1 PE LL_I2C_ClearFlag_STOP - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_STOP(I2C_TypeDef *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = I2Cx->SR1; - (void) tmpreg; - SET_BIT(I2Cx->CR1, I2C_CR1_PE); -} - -/** - * @brief Clear Bus error flag. - * @rmtoll SR1 BERR LL_I2C_ClearFlag_BERR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_BERR(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_BERR); -} - -/** - * @brief Clear Arbitration lost flag. - * @rmtoll SR1 ARLO LL_I2C_ClearFlag_ARLO - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_ARLO(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_ARLO); -} - -/** - * @brief Clear Overrun/Underrun flag. - * @rmtoll SR1 OVR LL_I2C_ClearFlag_OVR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_OVR(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_OVR); -} - -/** - * @brief Clear SMBus PEC error flag. - * @rmtoll SR1 PECERR LL_I2C_ClearSMBusFlag_PECERR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearSMBusFlag_PECERR(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_PECERR); -} - -/** - * @brief Clear SMBus Timeout detection flag. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 TIMEOUT LL_I2C_ClearSMBusFlag_TIMEOUT - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearSMBusFlag_TIMEOUT(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_TIMEOUT); -} - -/** - * @brief Clear SMBus Alert flag. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 SMBALERT LL_I2C_ClearSMBusFlag_ALERT - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearSMBusFlag_ALERT(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_SMBALERT); -} - -/** - * @} - */ - -/** @defgroup I2C_LL_EF_Data_Management Data_Management - * @{ - */ - -/** - * @brief Enable Reset of I2C peripheral. - * @rmtoll CR1 SWRST LL_I2C_EnableReset - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableReset(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_SWRST); -} - -/** - * @brief Disable Reset of I2C peripheral. - * @rmtoll CR1 SWRST LL_I2C_DisableReset - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableReset(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_SWRST); -} - -/** - * @brief Check if the I2C peripheral is under reset state or not. - * @rmtoll CR1 SWRST LL_I2C_IsResetEnabled - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsResetEnabled(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_SWRST) == (I2C_CR1_SWRST)); -} - -/** - * @brief Prepare the generation of a ACKnowledge or Non ACKnowledge condition after the address receive match code or next received byte. - * @note Usage in Slave or Master mode. - * @rmtoll CR1 ACK LL_I2C_AcknowledgeNextData - * @param I2Cx I2C Instance. - * @param TypeAcknowledge This parameter can be one of the following values: - * @arg @ref LL_I2C_ACK - * @arg @ref LL_I2C_NACK - * @retval None - */ -__STATIC_INLINE void LL_I2C_AcknowledgeNextData(I2C_TypeDef *I2Cx, uint32_t TypeAcknowledge) -{ - MODIFY_REG(I2Cx->CR1, I2C_CR1_ACK, TypeAcknowledge); -} - -/** - * @brief Generate a START or RESTART condition - * @note The START bit can be set even if bus is BUSY or I2C is in slave mode. - * This action has no effect when RELOAD is set. - * @rmtoll CR1 START LL_I2C_GenerateStartCondition - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_GenerateStartCondition(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_START); -} - -/** - * @brief Generate a STOP condition after the current byte transfer (master mode). - * @rmtoll CR1 STOP LL_I2C_GenerateStopCondition - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_GenerateStopCondition(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_STOP); -} - -/** - * @brief Enable bit POS (master/host mode). - * @note In that case, the ACK bit controls the (N)ACK of the next byte received or the PEC bit indicates that the next byte in shift register is a PEC. - * @rmtoll CR1 POS LL_I2C_EnableBitPOS - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableBitPOS(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_POS); -} - -/** - * @brief Disable bit POS (master/host mode). - * @note In that case, the ACK bit controls the (N)ACK of the current byte received or the PEC bit indicates that the current byte in shift register is a PEC. - * @rmtoll CR1 POS LL_I2C_DisableBitPOS - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableBitPOS(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_POS); -} - -/** - * @brief Check if bit POS is enabled or disabled. - * @rmtoll CR1 POS LL_I2C_IsEnabledBitPOS - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledBitPOS(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_POS) == (I2C_CR1_POS)); -} - -/** - * @brief Indicate the value of transfer direction. - * @note RESET: Bus is in read transfer (peripheral point of view). - * SET: Bus is in write transfer (peripheral point of view). - * @rmtoll SR2 TRA LL_I2C_GetTransferDirection - * @param I2Cx I2C Instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_DIRECTION_WRITE - * @arg @ref LL_I2C_DIRECTION_READ - */ -__STATIC_INLINE uint32_t LL_I2C_GetTransferDirection(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->SR2, I2C_SR2_TRA)); -} - -/** - * @brief Enable DMA last transfer. - * @note This action mean that next DMA EOT is the last transfer. - * @rmtoll CR2 LAST LL_I2C_EnableLastDMA - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableLastDMA(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_LAST); -} - -/** - * @brief Disable DMA last transfer. - * @note This action mean that next DMA EOT is not the last transfer. - * @rmtoll CR2 LAST LL_I2C_DisableLastDMA - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableLastDMA(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_LAST); -} - -/** - * @brief Check if DMA last transfer is enabled or disabled. - * @rmtoll CR2 LAST LL_I2C_IsEnabledLastDMA - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledLastDMA(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_LAST) == (I2C_CR2_LAST)); -} - -/** - * @brief Enable transfer or internal comparison of the SMBus Packet Error byte (transmission or reception mode). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note This feature is cleared by hardware when the PEC byte is transferred or compared, - * or by a START or STOP condition, it is also cleared by software. - * @rmtoll CR1 PEC LL_I2C_EnableSMBusPECCompare - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableSMBusPECCompare(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_PEC); -} - -/** - * @brief Disable transfer or internal comparison of the SMBus Packet Error byte (transmission or reception mode). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 PEC LL_I2C_DisableSMBusPECCompare - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableSMBusPECCompare(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_PEC); -} - -/** - * @brief Check if the SMBus Packet Error byte transfer or internal comparison is requested or not. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 PEC LL_I2C_IsEnabledSMBusPECCompare - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusPECCompare(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_PEC) == (I2C_CR1_PEC)); -} - -/** - * @brief Get the SMBus Packet Error byte calculated. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR2 PEC LL_I2C_GetSMBusPEC - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x00 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_I2C_GetSMBusPEC(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->SR2, I2C_SR2_PEC) >> I2C_SR2_PEC_Pos); -} - -/** - * @brief Read Receive Data register. - * @rmtoll DR DR LL_I2C_ReceiveData8 - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x0 and Max_Data=0xFF - */ -__STATIC_INLINE uint8_t LL_I2C_ReceiveData8(I2C_TypeDef *I2Cx) -{ - return (uint8_t)(READ_BIT(I2Cx->DR, I2C_DR_DR)); -} - -/** - * @brief Write in Transmit Data Register . - * @rmtoll DR DR LL_I2C_TransmitData8 - * @param I2Cx I2C Instance. - * @param Data Value between Min_Data=0x0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_I2C_TransmitData8(I2C_TypeDef *I2Cx, uint8_t Data) -{ - MODIFY_REG(I2Cx->DR, I2C_DR_DR, Data); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2C_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -uint32_t LL_I2C_Init(I2C_TypeDef *I2Cx, LL_I2C_InitTypeDef *I2C_InitStruct); -uint32_t LL_I2C_DeInit(I2C_TypeDef *I2Cx); -void LL_I2C_StructInit(LL_I2C_InitTypeDef *I2C_InitStruct); - - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* I2C1 || I2C2 || I2C3 */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_I2C_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h deleted file mode 100644 index ea23dc5..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h +++ /dev/null @@ -1,985 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_pwr.h - * @author MCD Application Team - * @brief Header file of PWR LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_PWR_H -#define __STM32F4xx_LL_PWR_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined(PWR) - -/** @defgroup PWR_LL PWR - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWR_LL_Exported_Constants PWR Exported Constants - * @{ - */ - -/** @defgroup PWR_LL_EC_CLEAR_FLAG Clear Flags Defines - * @brief Flags defines which can be used with LL_PWR_WriteReg function - * @{ - */ -#define LL_PWR_CR_CSBF PWR_CR_CSBF /*!< Clear standby flag */ -#define LL_PWR_CR_CWUF PWR_CR_CWUF /*!< Clear wakeup flag */ -/** - * @} - */ - -/** @defgroup PWR_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_PWR_ReadReg function - * @{ - */ -#define LL_PWR_CSR_WUF PWR_CSR_WUF /*!< Wakeup flag */ -#define LL_PWR_CSR_SBF PWR_CSR_SBF /*!< Standby flag */ -#define LL_PWR_CSR_PVDO PWR_CSR_PVDO /*!< Power voltage detector output flag */ -#define LL_PWR_CSR_VOS PWR_CSR_VOSRDY /*!< Voltage scaling select flag */ -#if defined(PWR_CSR_EWUP) -#define LL_PWR_CSR_EWUP1 PWR_CSR_EWUP /*!< Enable WKUP pin */ -#elif defined(PWR_CSR_EWUP1) -#define LL_PWR_CSR_EWUP1 PWR_CSR_EWUP1 /*!< Enable WKUP pin 1 */ -#endif /* PWR_CSR_EWUP */ -#if defined(PWR_CSR_EWUP2) -#define LL_PWR_CSR_EWUP2 PWR_CSR_EWUP2 /*!< Enable WKUP pin 2 */ -#endif /* PWR_CSR_EWUP2 */ -#if defined(PWR_CSR_EWUP3) -#define LL_PWR_CSR_EWUP3 PWR_CSR_EWUP3 /*!< Enable WKUP pin 3 */ -#endif /* PWR_CSR_EWUP3 */ -/** - * @} - */ - -/** @defgroup PWR_LL_EC_REGU_VOLTAGE Regulator Voltage - * @{ - */ -#if defined(PWR_CR_VOS_0) -#define LL_PWR_REGU_VOLTAGE_SCALE3 (PWR_CR_VOS_0) -#define LL_PWR_REGU_VOLTAGE_SCALE2 (PWR_CR_VOS_1) -#define LL_PWR_REGU_VOLTAGE_SCALE1 (PWR_CR_VOS_0 | PWR_CR_VOS_1) /* The SCALE1 is not available for STM32F401xx devices */ -#else -#define LL_PWR_REGU_VOLTAGE_SCALE1 (PWR_CR_VOS) -#define LL_PWR_REGU_VOLTAGE_SCALE2 0x00000000U -#endif /* PWR_CR_VOS_0 */ -/** - * @} - */ - -/** @defgroup PWR_LL_EC_MODE_PWR Mode Power - * @{ - */ -#define LL_PWR_MODE_STOP_MAINREGU 0x00000000U /*!< Enter Stop mode when the CPU enters deepsleep */ -#define LL_PWR_MODE_STOP_LPREGU (PWR_CR_LPDS) /*!< Enter Stop mode (with low power Regulator ON) when the CPU enters deepsleep */ -#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) -#define LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (PWR_CR_MRUDS | PWR_CR_FPDS) /*!< Enter Stop mode (with main Regulator in under-drive mode) when the CPU enters deepsleep */ -#define LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_FPDS) /*!< Enter Stop mode (with low power Regulator in under-drive mode) when the CPU enters deepsleep */ -#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ -#if defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) -#define LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (PWR_CR_MRLVDS | PWR_CR_FPDS) /*!< Enter Stop mode (with main Regulator in Deep Sleep mode) when the CPU enters deepsleep */ -#define LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (PWR_CR_LPDS | PWR_CR_LPLVDS | PWR_CR_FPDS) /*!< Enter Stop mode (with low power Regulator in Deep Sleep mode) when the CPU enters deepsleep */ -#endif /* PWR_CR_MRLVDS && PWR_CR_LPLVDS && PWR_CR_FPDS */ -#define LL_PWR_MODE_STANDBY (PWR_CR_PDDS) /*!< Enter Standby mode when the CPU enters deepsleep */ -/** - * @} - */ - -/** @defgroup PWR_LL_EC_REGU_MODE_DS_MODE Regulator Mode In Deep Sleep Mode - * @{ - */ -#define LL_PWR_REGU_DSMODE_MAIN 0x00000000U /*!< Voltage Regulator in main mode during deepsleep mode */ -#define LL_PWR_REGU_DSMODE_LOW_POWER (PWR_CR_LPDS) /*!< Voltage Regulator in low-power mode during deepsleep mode */ -/** - * @} - */ - -/** @defgroup PWR_LL_EC_PVDLEVEL Power Voltage Detector Level - * @{ - */ -#define LL_PWR_PVDLEVEL_0 (PWR_CR_PLS_LEV0) /*!< Voltage threshold detected by PVD 2.2 V */ -#define LL_PWR_PVDLEVEL_1 (PWR_CR_PLS_LEV1) /*!< Voltage threshold detected by PVD 2.3 V */ -#define LL_PWR_PVDLEVEL_2 (PWR_CR_PLS_LEV2) /*!< Voltage threshold detected by PVD 2.4 V */ -#define LL_PWR_PVDLEVEL_3 (PWR_CR_PLS_LEV3) /*!< Voltage threshold detected by PVD 2.5 V */ -#define LL_PWR_PVDLEVEL_4 (PWR_CR_PLS_LEV4) /*!< Voltage threshold detected by PVD 2.6 V */ -#define LL_PWR_PVDLEVEL_5 (PWR_CR_PLS_LEV5) /*!< Voltage threshold detected by PVD 2.7 V */ -#define LL_PWR_PVDLEVEL_6 (PWR_CR_PLS_LEV6) /*!< Voltage threshold detected by PVD 2.8 V */ -#define LL_PWR_PVDLEVEL_7 (PWR_CR_PLS_LEV7) /*!< Voltage threshold detected by PVD 2.9 V */ -/** - * @} - */ -/** @defgroup PWR_LL_EC_WAKEUP_PIN Wakeup Pins - * @{ - */ -#if defined(PWR_CSR_EWUP) -#define LL_PWR_WAKEUP_PIN1 (PWR_CSR_EWUP) /*!< WKUP pin : PA0 */ -#endif /* PWR_CSR_EWUP */ -#if defined(PWR_CSR_EWUP1) -#define LL_PWR_WAKEUP_PIN1 (PWR_CSR_EWUP1) /*!< WKUP pin 1 : PA0 */ -#endif /* PWR_CSR_EWUP1 */ -#if defined(PWR_CSR_EWUP2) -#define LL_PWR_WAKEUP_PIN2 (PWR_CSR_EWUP2) /*!< WKUP pin 2 : PC0 or PC13 according to device */ -#endif /* PWR_CSR_EWUP2 */ -#if defined(PWR_CSR_EWUP3) -#define LL_PWR_WAKEUP_PIN3 (PWR_CSR_EWUP3) /*!< WKUP pin 3 : PC1 */ -#endif /* PWR_CSR_EWUP3 */ -/** - * @} - */ - -/** - * @} - */ - - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWR_LL_Exported_Macros PWR Exported Macros - * @{ - */ - -/** @defgroup PWR_LL_EM_WRITE_READ Common write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in PWR register - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_PWR_WriteReg(__REG__, __VALUE__) WRITE_REG(PWR->__REG__, (__VALUE__)) - -/** - * @brief Read a value in PWR register - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_PWR_ReadReg(__REG__) READ_REG(PWR->__REG__) -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup PWR_LL_Exported_Functions PWR Exported Functions - * @{ - */ - -/** @defgroup PWR_LL_EF_Configuration Configuration - * @{ - */ -#if defined(PWR_CR_FISSR) -/** - * @brief Enable FLASH interface STOP while system Run is ON - * @rmtoll CR FISSR LL_PWR_EnableFLASHInterfaceSTOP - * @note This mode is enabled only with STOP low power mode. - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableFLASHInterfaceSTOP(void) -{ - SET_BIT(PWR->CR, PWR_CR_FISSR); -} - -/** - * @brief Disable FLASH Interface STOP while system Run is ON - * @rmtoll CR FISSR LL_PWR_DisableFLASHInterfaceSTOP - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableFLASHInterfaceSTOP(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_FISSR); -} - -/** - * @brief Check if FLASH Interface STOP while system Run feature is enabled - * @rmtoll CR FISSR LL_PWR_IsEnabledFLASHInterfaceSTOP - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledFLASHInterfaceSTOP(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_FISSR) == (PWR_CR_FISSR)); -} -#endif /* PWR_CR_FISSR */ - -#if defined(PWR_CR_FMSSR) -/** - * @brief Enable FLASH Memory STOP while system Run is ON - * @rmtoll CR FMSSR LL_PWR_EnableFLASHMemorySTOP - * @note This mode is enabled only with STOP low power mode. - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableFLASHMemorySTOP(void) -{ - SET_BIT(PWR->CR, PWR_CR_FMSSR); -} - -/** - * @brief Disable FLASH Memory STOP while system Run is ON - * @rmtoll CR FMSSR LL_PWR_DisableFLASHMemorySTOP - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableFLASHMemorySTOP(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); -} - -/** - * @brief Check if FLASH Memory STOP while system Run feature is enabled - * @rmtoll CR FMSSR LL_PWR_IsEnabledFLASHMemorySTOP - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledFLASHMemorySTOP(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_FMSSR) == (PWR_CR_FMSSR)); -} -#endif /* PWR_CR_FMSSR */ -#if defined(PWR_CR_UDEN) -/** - * @brief Enable Under Drive Mode - * @rmtoll CR UDEN LL_PWR_EnableUnderDriveMode - * @note This mode is enabled only with STOP low power mode. - * In this mode, the 1.2V domain is preserved in reduced leakage mode. This - * mode is only available when the main Regulator or the low power Regulator - * is in low voltage mode. - * @note If the Under-drive mode was enabled, it is automatically disabled after - * exiting Stop mode. - * When the voltage Regulator operates in Under-drive mode, an additional - * startup delay is induced when waking up from Stop mode. - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableUnderDriveMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_UDEN); -} - -/** - * @brief Disable Under Drive Mode - * @rmtoll CR UDEN LL_PWR_DisableUnderDriveMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableUnderDriveMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_UDEN); -} - -/** - * @brief Check if Under Drive Mode is enabled - * @rmtoll CR UDEN LL_PWR_IsEnabledUnderDriveMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledUnderDriveMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_UDEN) == (PWR_CR_UDEN)); -} -#endif /* PWR_CR_UDEN */ - -#if defined(PWR_CR_ODSWEN) -/** - * @brief Enable Over drive switching - * @rmtoll CR ODSWEN LL_PWR_EnableOverDriveSwitching - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableOverDriveSwitching(void) -{ - SET_BIT(PWR->CR, PWR_CR_ODSWEN); -} - -/** - * @brief Disable Over drive switching - * @rmtoll CR ODSWEN LL_PWR_DisableOverDriveSwitching - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableOverDriveSwitching(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_ODSWEN); -} - -/** - * @brief Check if Over drive switching is enabled - * @rmtoll CR ODSWEN LL_PWR_IsEnabledOverDriveSwitching - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledOverDriveSwitching(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_ODSWEN) == (PWR_CR_ODSWEN)); -} -#endif /* PWR_CR_ODSWEN */ -#if defined(PWR_CR_ODEN) -/** - * @brief Enable Over drive Mode - * @rmtoll CR ODEN LL_PWR_EnableOverDriveMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableOverDriveMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_ODEN); -} - -/** - * @brief Disable Over drive Mode - * @rmtoll CR ODEN LL_PWR_DisableOverDriveMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableOverDriveMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_ODEN); -} - -/** - * @brief Check if Over drive switching is enabled - * @rmtoll CR ODEN LL_PWR_IsEnabledOverDriveMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledOverDriveMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_ODEN) == (PWR_CR_ODEN)); -} -#endif /* PWR_CR_ODEN */ -#if defined(PWR_CR_MRUDS) -/** - * @brief Enable Main Regulator in deepsleep under-drive Mode - * @rmtoll CR MRUDS LL_PWR_EnableMainRegulatorDeepSleepUDMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableMainRegulatorDeepSleepUDMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_MRUDS); -} - -/** - * @brief Disable Main Regulator in deepsleep under-drive Mode - * @rmtoll CR MRUDS LL_PWR_DisableMainRegulatorDeepSleepUDMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableMainRegulatorDeepSleepUDMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_MRUDS); -} - -/** - * @brief Check if Main Regulator in deepsleep under-drive Mode is enabled - * @rmtoll CR MRUDS LL_PWR_IsEnabledMainRegulatorDeepSleepUDMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledMainRegulatorDeepSleepUDMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_MRUDS) == (PWR_CR_MRUDS)); -} -#endif /* PWR_CR_MRUDS */ - -#if defined(PWR_CR_LPUDS) -/** - * @brief Enable Low Power Regulator in deepsleep under-drive Mode - * @rmtoll CR LPUDS LL_PWR_EnableLowPowerRegulatorDeepSleepUDMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableLowPowerRegulatorDeepSleepUDMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_LPUDS); -} - -/** - * @brief Disable Low Power Regulator in deepsleep under-drive Mode - * @rmtoll CR LPUDS LL_PWR_DisableLowPowerRegulatorDeepSleepUDMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableLowPowerRegulatorDeepSleepUDMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_LPUDS); -} - -/** - * @brief Check if Low Power Regulator in deepsleep under-drive Mode is enabled - * @rmtoll CR LPUDS LL_PWR_IsEnabledLowPowerRegulatorDeepSleepUDMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledLowPowerRegulatorDeepSleepUDMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_LPUDS) == (PWR_CR_LPUDS)); -} -#endif /* PWR_CR_LPUDS */ - -#if defined(PWR_CR_MRLVDS) -/** - * @brief Enable Main Regulator low voltage Mode - * @rmtoll CR MRLVDS LL_PWR_EnableMainRegulatorLowVoltageMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableMainRegulatorLowVoltageMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_MRLVDS); -} - -/** - * @brief Disable Main Regulator low voltage Mode - * @rmtoll CR MRLVDS LL_PWR_DisableMainRegulatorLowVoltageMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableMainRegulatorLowVoltageMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_MRLVDS); -} - -/** - * @brief Check if Main Regulator low voltage Mode is enabled - * @rmtoll CR MRLVDS LL_PWR_IsEnabledMainRegulatorLowVoltageMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledMainRegulatorLowVoltageMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_MRLVDS) == (PWR_CR_MRLVDS)); -} -#endif /* PWR_CR_MRLVDS */ - -#if defined(PWR_CR_LPLVDS) -/** - * @brief Enable Low Power Regulator low voltage Mode - * @rmtoll CR LPLVDS LL_PWR_EnableLowPowerRegulatorLowVoltageMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableLowPowerRegulatorLowVoltageMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_LPLVDS); -} - -/** - * @brief Disable Low Power Regulator low voltage Mode - * @rmtoll CR LPLVDS LL_PWR_DisableLowPowerRegulatorLowVoltageMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableLowPowerRegulatorLowVoltageMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_LPLVDS); -} - -/** - * @brief Check if Low Power Regulator low voltage Mode is enabled - * @rmtoll CR LPLVDS LL_PWR_IsEnabledLowPowerRegulatorLowVoltageMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledLowPowerRegulatorLowVoltageMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_LPLVDS) == (PWR_CR_LPLVDS)); -} -#endif /* PWR_CR_LPLVDS */ -/** - * @brief Set the main internal Regulator output voltage - * @rmtoll CR VOS LL_PWR_SetRegulVoltageScaling - * @param VoltageScaling This parameter can be one of the following values: - * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE1 (*) - * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE2 - * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE3 - * (*) LL_PWR_REGU_VOLTAGE_SCALE1 is not available for STM32F401xx devices - * @retval None - */ -__STATIC_INLINE void LL_PWR_SetRegulVoltageScaling(uint32_t VoltageScaling) -{ - MODIFY_REG(PWR->CR, PWR_CR_VOS, VoltageScaling); -} - -/** - * @brief Get the main internal Regulator output voltage - * @rmtoll CR VOS LL_PWR_GetRegulVoltageScaling - * @retval Returned value can be one of the following values: - * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE1 (*) - * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE2 - * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE3 - * (*) LL_PWR_REGU_VOLTAGE_SCALE1 is not available for STM32F401xx devices - */ -__STATIC_INLINE uint32_t LL_PWR_GetRegulVoltageScaling(void) -{ - return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_VOS)); -} -/** - * @brief Enable the Flash Power Down in Stop Mode - * @rmtoll CR FPDS LL_PWR_EnableFlashPowerDown - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableFlashPowerDown(void) -{ - SET_BIT(PWR->CR, PWR_CR_FPDS); -} - -/** - * @brief Disable the Flash Power Down in Stop Mode - * @rmtoll CR FPDS LL_PWR_DisableFlashPowerDown - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableFlashPowerDown(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_FPDS); -} - -/** - * @brief Check if the Flash Power Down in Stop Mode is enabled - * @rmtoll CR FPDS LL_PWR_IsEnabledFlashPowerDown - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledFlashPowerDown(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_FPDS) == (PWR_CR_FPDS)); -} - -/** - * @brief Enable access to the backup domain - * @rmtoll CR DBP LL_PWR_EnableBkUpAccess - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableBkUpAccess(void) -{ - SET_BIT(PWR->CR, PWR_CR_DBP); -} - -/** - * @brief Disable access to the backup domain - * @rmtoll CR DBP LL_PWR_DisableBkUpAccess - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableBkUpAccess(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_DBP); -} - -/** - * @brief Check if the backup domain is enabled - * @rmtoll CR DBP LL_PWR_IsEnabledBkUpAccess - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledBkUpAccess(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_DBP) == (PWR_CR_DBP)); -} -/** - * @brief Enable the backup Regulator - * @rmtoll CSR BRE LL_PWR_EnableBkUpRegulator - * @note The BRE bit of the PWR_CSR register is protected against parasitic write access. - * The LL_PWR_EnableBkUpAccess() must be called before using this API. - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableBkUpRegulator(void) -{ - SET_BIT(PWR->CSR, PWR_CSR_BRE); -} - -/** - * @brief Disable the backup Regulator - * @rmtoll CSR BRE LL_PWR_DisableBkUpRegulator - * @note The BRE bit of the PWR_CSR register is protected against parasitic write access. - * The LL_PWR_EnableBkUpAccess() must be called before using this API. - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableBkUpRegulator(void) -{ - CLEAR_BIT(PWR->CSR, PWR_CSR_BRE); -} - -/** - * @brief Check if the backup Regulator is enabled - * @rmtoll CSR BRE LL_PWR_IsEnabledBkUpRegulator - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledBkUpRegulator(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_BRE) == (PWR_CSR_BRE)); -} - -/** - * @brief Set voltage Regulator mode during deep sleep mode - * @rmtoll CR LPDS LL_PWR_SetRegulModeDS - * @param RegulMode This parameter can be one of the following values: - * @arg @ref LL_PWR_REGU_DSMODE_MAIN - * @arg @ref LL_PWR_REGU_DSMODE_LOW_POWER - * @retval None - */ -__STATIC_INLINE void LL_PWR_SetRegulModeDS(uint32_t RegulMode) -{ - MODIFY_REG(PWR->CR, PWR_CR_LPDS, RegulMode); -} - -/** - * @brief Get voltage Regulator mode during deep sleep mode - * @rmtoll CR LPDS LL_PWR_GetRegulModeDS - * @retval Returned value can be one of the following values: - * @arg @ref LL_PWR_REGU_DSMODE_MAIN - * @arg @ref LL_PWR_REGU_DSMODE_LOW_POWER - */ -__STATIC_INLINE uint32_t LL_PWR_GetRegulModeDS(void) -{ - return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_LPDS)); -} - -/** - * @brief Set Power Down mode when CPU enters deepsleep - * @rmtoll CR PDDS LL_PWR_SetPowerMode\n - * @rmtoll CR MRUDS LL_PWR_SetPowerMode\n - * @rmtoll CR LPUDS LL_PWR_SetPowerMode\n - * @rmtoll CR FPDS LL_PWR_SetPowerMode\n - * @rmtoll CR MRLVDS LL_PWR_SetPowerMode\n - * @rmtoll CR LPlVDS LL_PWR_SetPowerMode\n - * @rmtoll CR FPDS LL_PWR_SetPowerMode\n - * @rmtoll CR LPDS LL_PWR_SetPowerMode - * @param PDMode This parameter can be one of the following values: - * @arg @ref LL_PWR_MODE_STOP_MAINREGU - * @arg @ref LL_PWR_MODE_STOP_LPREGU - * @arg @ref LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (*) - * @arg @ref LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (*) - * @arg @ref LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (*) - * @arg @ref LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (*) - * - * (*) not available on all devices - * @arg @ref LL_PWR_MODE_STANDBY - * @retval None - */ -__STATIC_INLINE void LL_PWR_SetPowerMode(uint32_t PDMode) -{ -#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) - MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPUDS | PWR_CR_MRUDS), PDMode); -#elif defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) - MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPLVDS | PWR_CR_MRLVDS), PDMode); -#else - MODIFY_REG(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS), PDMode); -#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ -} - -/** - * @brief Get Power Down mode when CPU enters deepsleep - * @rmtoll CR PDDS LL_PWR_GetPowerMode\n - * @rmtoll CR MRUDS LL_PWR_GetPowerMode\n - * @rmtoll CR LPUDS LL_PWR_GetPowerMode\n - * @rmtoll CR FPDS LL_PWR_GetPowerMode\n - * @rmtoll CR MRLVDS LL_PWR_GetPowerMode\n - * @rmtoll CR LPLVDS LL_PWR_GetPowerMode\n - * @rmtoll CR FPDS LL_PWR_GetPowerMode\n - * @rmtoll CR LPDS LL_PWR_GetPowerMode - * @retval Returned value can be one of the following values: - * @arg @ref LL_PWR_MODE_STOP_MAINREGU - * @arg @ref LL_PWR_MODE_STOP_LPREGU - * @arg @ref LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (*) - * @arg @ref LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (*) - * @arg @ref LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (*) - * @arg @ref LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (*) - * - * (*) not available on all devices - * @arg @ref LL_PWR_MODE_STANDBY - */ -__STATIC_INLINE uint32_t LL_PWR_GetPowerMode(void) -{ -#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) - return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPUDS | PWR_CR_MRUDS))); -#elif defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) - return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPLVDS | PWR_CR_MRLVDS))); -#else - return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS))); -#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ -} - -/** - * @brief Configure the voltage threshold detected by the Power Voltage Detector - * @rmtoll CR PLS LL_PWR_SetPVDLevel - * @param PVDLevel This parameter can be one of the following values: - * @arg @ref LL_PWR_PVDLEVEL_0 - * @arg @ref LL_PWR_PVDLEVEL_1 - * @arg @ref LL_PWR_PVDLEVEL_2 - * @arg @ref LL_PWR_PVDLEVEL_3 - * @arg @ref LL_PWR_PVDLEVEL_4 - * @arg @ref LL_PWR_PVDLEVEL_5 - * @arg @ref LL_PWR_PVDLEVEL_6 - * @arg @ref LL_PWR_PVDLEVEL_7 - * @retval None - */ -__STATIC_INLINE void LL_PWR_SetPVDLevel(uint32_t PVDLevel) -{ - MODIFY_REG(PWR->CR, PWR_CR_PLS, PVDLevel); -} - -/** - * @brief Get the voltage threshold detection - * @rmtoll CR PLS LL_PWR_GetPVDLevel - * @retval Returned value can be one of the following values: - * @arg @ref LL_PWR_PVDLEVEL_0 - * @arg @ref LL_PWR_PVDLEVEL_1 - * @arg @ref LL_PWR_PVDLEVEL_2 - * @arg @ref LL_PWR_PVDLEVEL_3 - * @arg @ref LL_PWR_PVDLEVEL_4 - * @arg @ref LL_PWR_PVDLEVEL_5 - * @arg @ref LL_PWR_PVDLEVEL_6 - * @arg @ref LL_PWR_PVDLEVEL_7 - */ -__STATIC_INLINE uint32_t LL_PWR_GetPVDLevel(void) -{ - return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_PLS)); -} - -/** - * @brief Enable Power Voltage Detector - * @rmtoll CR PVDE LL_PWR_EnablePVD - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnablePVD(void) -{ - SET_BIT(PWR->CR, PWR_CR_PVDE); -} - -/** - * @brief Disable Power Voltage Detector - * @rmtoll CR PVDE LL_PWR_DisablePVD - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisablePVD(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_PVDE); -} - -/** - * @brief Check if Power Voltage Detector is enabled - * @rmtoll CR PVDE LL_PWR_IsEnabledPVD - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledPVD(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_PVDE) == (PWR_CR_PVDE)); -} - -/** - * @brief Enable the WakeUp PINx functionality - * @rmtoll CSR EWUP LL_PWR_EnableWakeUpPin\n - * @rmtoll CSR EWUP1 LL_PWR_EnableWakeUpPin\n - * @rmtoll CSR EWUP2 LL_PWR_EnableWakeUpPin\n - * @rmtoll CSR EWUP3 LL_PWR_EnableWakeUpPin - * @param WakeUpPin This parameter can be one of the following values: - * @arg @ref LL_PWR_WAKEUP_PIN1 - * @arg @ref LL_PWR_WAKEUP_PIN2 (*) - * @arg @ref LL_PWR_WAKEUP_PIN3 (*) - * - * (*) not available on all devices - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableWakeUpPin(uint32_t WakeUpPin) -{ - SET_BIT(PWR->CSR, WakeUpPin); -} - -/** - * @brief Disable the WakeUp PINx functionality - * @rmtoll CSR EWUP LL_PWR_DisableWakeUpPin\n - * @rmtoll CSR EWUP1 LL_PWR_DisableWakeUpPin\n - * @rmtoll CSR EWUP2 LL_PWR_DisableWakeUpPin\n - * @rmtoll CSR EWUP3 LL_PWR_DisableWakeUpPin - * @param WakeUpPin This parameter can be one of the following values: - * @arg @ref LL_PWR_WAKEUP_PIN1 - * @arg @ref LL_PWR_WAKEUP_PIN2 (*) - * @arg @ref LL_PWR_WAKEUP_PIN3 (*) - * - * (*) not available on all devices - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableWakeUpPin(uint32_t WakeUpPin) -{ - CLEAR_BIT(PWR->CSR, WakeUpPin); -} - -/** - * @brief Check if the WakeUp PINx functionality is enabled - * @rmtoll CSR EWUP LL_PWR_IsEnabledWakeUpPin\n - * @rmtoll CSR EWUP1 LL_PWR_IsEnabledWakeUpPin\n - * @rmtoll CSR EWUP2 LL_PWR_IsEnabledWakeUpPin\n - * @rmtoll CSR EWUP3 LL_PWR_IsEnabledWakeUpPin - * @param WakeUpPin This parameter can be one of the following values: - * @arg @ref LL_PWR_WAKEUP_PIN1 - * @arg @ref LL_PWR_WAKEUP_PIN2 (*) - * @arg @ref LL_PWR_WAKEUP_PIN3 (*) - * - * (*) not available on all devices - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledWakeUpPin(uint32_t WakeUpPin) -{ - return (READ_BIT(PWR->CSR, WakeUpPin) == (WakeUpPin)); -} - - -/** - * @} - */ - -/** @defgroup PWR_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Get Wake-up Flag - * @rmtoll CSR WUF LL_PWR_IsActiveFlag_WU - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_WU(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_WUF) == (PWR_CSR_WUF)); -} - -/** - * @brief Get Standby Flag - * @rmtoll CSR SBF LL_PWR_IsActiveFlag_SB - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_SB(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_SBF) == (PWR_CSR_SBF)); -} - -/** - * @brief Get Backup Regulator ready Flag - * @rmtoll CSR BRR LL_PWR_IsActiveFlag_BRR - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_BRR(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_BRR) == (PWR_CSR_BRR)); -} -/** - * @brief Indicate whether VDD voltage is below the selected PVD threshold - * @rmtoll CSR PVDO LL_PWR_IsActiveFlag_PVDO - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_PVDO(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_PVDO) == (PWR_CSR_PVDO)); -} - -/** - * @brief Indicate whether the Regulator is ready in the selected voltage range or if its output voltage is still changing to the required voltage level - * @rmtoll CSR VOS LL_PWR_IsActiveFlag_VOS - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_VOS(void) -{ - return (READ_BIT(PWR->CSR, LL_PWR_CSR_VOS) == (LL_PWR_CSR_VOS)); -} -#if defined(PWR_CR_ODEN) -/** - * @brief Indicate whether the Over-Drive mode is ready or not - * @rmtoll CSR ODRDY LL_PWR_IsActiveFlag_OD - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_OD(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_ODRDY) == (PWR_CSR_ODRDY)); -} -#endif /* PWR_CR_ODEN */ - -#if defined(PWR_CR_ODSWEN) -/** - * @brief Indicate whether the Over-Drive mode switching is ready or not - * @rmtoll CSR ODSWRDY LL_PWR_IsActiveFlag_ODSW - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_ODSW(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_ODSWRDY) == (PWR_CSR_ODSWRDY)); -} -#endif /* PWR_CR_ODSWEN */ - -#if defined(PWR_CR_UDEN) -/** - * @brief Indicate whether the Under-Drive mode is ready or not - * @rmtoll CSR UDRDY LL_PWR_IsActiveFlag_UD - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_UD(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_UDRDY) == (PWR_CSR_UDRDY)); -} -#endif /* PWR_CR_UDEN */ -/** - * @brief Clear Standby Flag - * @rmtoll CR CSBF LL_PWR_ClearFlag_SB - * @retval None - */ -__STATIC_INLINE void LL_PWR_ClearFlag_SB(void) -{ - SET_BIT(PWR->CR, PWR_CR_CSBF); -} - -/** - * @brief Clear Wake-up Flags - * @rmtoll CR CWUF LL_PWR_ClearFlag_WU - * @retval None - */ -__STATIC_INLINE void LL_PWR_ClearFlag_WU(void) -{ - SET_BIT(PWR->CR, PWR_CR_CWUF); -} -#if defined(PWR_CSR_UDRDY) -/** - * @brief Clear Under-Drive ready Flag - * @rmtoll CSR UDRDY LL_PWR_ClearFlag_UD - * @retval None - */ -__STATIC_INLINE void LL_PWR_ClearFlag_UD(void) -{ - WRITE_REG(PWR->CSR, PWR_CSR_UDRDY); -} -#endif /* PWR_CSR_UDRDY */ - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup PWR_LL_EF_Init De-initialization function - * @{ - */ -ErrorStatus LL_PWR_DeInit(void); -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined(PWR) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_PWR_H */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h deleted file mode 100644 index 796f06d..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h +++ /dev/null @@ -1,7101 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_rcc.h - * @author MCD Application Team - * @brief Header file of RCC LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_RCC_H -#define __STM32F4xx_LL_RCC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined(RCC) - -/** @defgroup RCC_LL RCC - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup RCC_LL_Private_Variables RCC Private Variables - * @{ - */ - -#if defined(RCC_DCKCFGR_PLLSAIDIVR) -static const uint8_t aRCC_PLLSAIDIVRPrescTable[4] = {2, 4, 8, 16}; -#endif /* RCC_DCKCFGR_PLLSAIDIVR */ - -/** - * @} - */ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup RCC_LL_Private_Macros RCC Private Macros - * @{ - */ -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup RCC_LL_Exported_Types RCC Exported Types - * @{ - */ - -/** @defgroup LL_ES_CLOCK_FREQ Clocks Frequency Structure - * @{ - */ - -/** - * @brief RCC Clocks Frequency Structure - */ -typedef struct -{ - uint32_t SYSCLK_Frequency; /*!< SYSCLK clock frequency */ - uint32_t HCLK_Frequency; /*!< HCLK clock frequency */ - uint32_t PCLK1_Frequency; /*!< PCLK1 clock frequency */ - uint32_t PCLK2_Frequency; /*!< PCLK2 clock frequency */ -} LL_RCC_ClocksTypeDef; - -/** - * @} - */ - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RCC_LL_Exported_Constants RCC Exported Constants - * @{ - */ - -/** @defgroup RCC_LL_EC_OSC_VALUES Oscillator Values adaptation - * @brief Defines used to adapt values of different oscillators - * @note These values could be modified in the user environment according to - * HW set-up. - * @{ - */ -#if !defined (HSE_VALUE) -#define HSE_VALUE 25000000U /*!< Value of the HSE oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) -#define HSI_VALUE 16000000U /*!< Value of the HSI oscillator in Hz */ -#endif /* HSI_VALUE */ - -#if !defined (LSE_VALUE) -#define LSE_VALUE 32768U /*!< Value of the LSE oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined (LSI_VALUE) -#define LSI_VALUE 32000U /*!< Value of the LSI oscillator in Hz */ -#endif /* LSI_VALUE */ - -#if !defined (EXTERNAL_CLOCK_VALUE) -#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the I2S_CKIN external oscillator in Hz */ -#endif /* EXTERNAL_CLOCK_VALUE */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_CLEAR_FLAG Clear Flags Defines - * @brief Flags defines which can be used with LL_RCC_WriteReg function - * @{ - */ -#define LL_RCC_CIR_LSIRDYC RCC_CIR_LSIRDYC /*!< LSI Ready Interrupt Clear */ -#define LL_RCC_CIR_LSERDYC RCC_CIR_LSERDYC /*!< LSE Ready Interrupt Clear */ -#define LL_RCC_CIR_HSIRDYC RCC_CIR_HSIRDYC /*!< HSI Ready Interrupt Clear */ -#define LL_RCC_CIR_HSERDYC RCC_CIR_HSERDYC /*!< HSE Ready Interrupt Clear */ -#define LL_RCC_CIR_PLLRDYC RCC_CIR_PLLRDYC /*!< PLL Ready Interrupt Clear */ -#if defined(RCC_PLLI2S_SUPPORT) -#define LL_RCC_CIR_PLLI2SRDYC RCC_CIR_PLLI2SRDYC /*!< PLLI2S Ready Interrupt Clear */ -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_CIR_PLLSAIRDYC RCC_CIR_PLLSAIRDYC /*!< PLLSAI Ready Interrupt Clear */ -#endif /* RCC_PLLSAI_SUPPORT */ -#define LL_RCC_CIR_CSSC RCC_CIR_CSSC /*!< Clock Security System Interrupt Clear */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_RCC_ReadReg function - * @{ - */ -#define LL_RCC_CIR_LSIRDYF RCC_CIR_LSIRDYF /*!< LSI Ready Interrupt flag */ -#define LL_RCC_CIR_LSERDYF RCC_CIR_LSERDYF /*!< LSE Ready Interrupt flag */ -#define LL_RCC_CIR_HSIRDYF RCC_CIR_HSIRDYF /*!< HSI Ready Interrupt flag */ -#define LL_RCC_CIR_HSERDYF RCC_CIR_HSERDYF /*!< HSE Ready Interrupt flag */ -#define LL_RCC_CIR_PLLRDYF RCC_CIR_PLLRDYF /*!< PLL Ready Interrupt flag */ -#if defined(RCC_PLLI2S_SUPPORT) -#define LL_RCC_CIR_PLLI2SRDYF RCC_CIR_PLLI2SRDYF /*!< PLLI2S Ready Interrupt flag */ -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_CIR_PLLSAIRDYF RCC_CIR_PLLSAIRDYF /*!< PLLSAI Ready Interrupt flag */ -#endif /* RCC_PLLSAI_SUPPORT */ -#define LL_RCC_CIR_CSSF RCC_CIR_CSSF /*!< Clock Security System Interrupt flag */ -#define LL_RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF /*!< Low-Power reset flag */ -#define LL_RCC_CSR_PINRSTF RCC_CSR_PINRSTF /*!< PIN reset flag */ -#define LL_RCC_CSR_PORRSTF RCC_CSR_PORRSTF /*!< POR/PDR reset flag */ -#define LL_RCC_CSR_SFTRSTF RCC_CSR_SFTRSTF /*!< Software Reset flag */ -#define LL_RCC_CSR_IWDGRSTF RCC_CSR_IWDGRSTF /*!< Independent Watchdog reset flag */ -#define LL_RCC_CSR_WWDGRSTF RCC_CSR_WWDGRSTF /*!< Window watchdog reset flag */ -#if defined(RCC_CSR_BORRSTF) -#define LL_RCC_CSR_BORRSTF RCC_CSR_BORRSTF /*!< BOR reset flag */ -#endif /* RCC_CSR_BORRSTF */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_RCC_ReadReg and LL_RCC_WriteReg functions - * @{ - */ -#define LL_RCC_CIR_LSIRDYIE RCC_CIR_LSIRDYIE /*!< LSI Ready Interrupt Enable */ -#define LL_RCC_CIR_LSERDYIE RCC_CIR_LSERDYIE /*!< LSE Ready Interrupt Enable */ -#define LL_RCC_CIR_HSIRDYIE RCC_CIR_HSIRDYIE /*!< HSI Ready Interrupt Enable */ -#define LL_RCC_CIR_HSERDYIE RCC_CIR_HSERDYIE /*!< HSE Ready Interrupt Enable */ -#define LL_RCC_CIR_PLLRDYIE RCC_CIR_PLLRDYIE /*!< PLL Ready Interrupt Enable */ -#if defined(RCC_PLLI2S_SUPPORT) -#define LL_RCC_CIR_PLLI2SRDYIE RCC_CIR_PLLI2SRDYIE /*!< PLLI2S Ready Interrupt Enable */ -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_CIR_PLLSAIRDYIE RCC_CIR_PLLSAIRDYIE /*!< PLLSAI Ready Interrupt Enable */ -#endif /* RCC_PLLSAI_SUPPORT */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_SYS_CLKSOURCE System clock switch - * @{ - */ -#define LL_RCC_SYS_CLKSOURCE_HSI RCC_CFGR_SW_HSI /*!< HSI selection as system clock */ -#define LL_RCC_SYS_CLKSOURCE_HSE RCC_CFGR_SW_HSE /*!< HSE selection as system clock */ -#define LL_RCC_SYS_CLKSOURCE_PLL RCC_CFGR_SW_PLL /*!< PLL selection as system clock */ -#if defined(RCC_CFGR_SW_PLLR) -#define LL_RCC_SYS_CLKSOURCE_PLLR RCC_CFGR_SW_PLLR /*!< PLLR selection as system clock */ -#endif /* RCC_CFGR_SW_PLLR */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_SYS_CLKSOURCE_STATUS System clock switch status - * @{ - */ -#define LL_RCC_SYS_CLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ -#define LL_RCC_SYS_CLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ -#define LL_RCC_SYS_CLKSOURCE_STATUS_PLL RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ -#if defined(RCC_PLLR_SYSCLK_SUPPORT) -#define LL_RCC_SYS_CLKSOURCE_STATUS_PLLR RCC_CFGR_SWS_PLLR /*!< PLLR used as system clock */ -#endif /* RCC_PLLR_SYSCLK_SUPPORT */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_SYSCLK_DIV AHB prescaler - * @{ - */ -#define LL_RCC_SYSCLK_DIV_1 RCC_CFGR_HPRE_DIV1 /*!< SYSCLK not divided */ -#define LL_RCC_SYSCLK_DIV_2 RCC_CFGR_HPRE_DIV2 /*!< SYSCLK divided by 2 */ -#define LL_RCC_SYSCLK_DIV_4 RCC_CFGR_HPRE_DIV4 /*!< SYSCLK divided by 4 */ -#define LL_RCC_SYSCLK_DIV_8 RCC_CFGR_HPRE_DIV8 /*!< SYSCLK divided by 8 */ -#define LL_RCC_SYSCLK_DIV_16 RCC_CFGR_HPRE_DIV16 /*!< SYSCLK divided by 16 */ -#define LL_RCC_SYSCLK_DIV_64 RCC_CFGR_HPRE_DIV64 /*!< SYSCLK divided by 64 */ -#define LL_RCC_SYSCLK_DIV_128 RCC_CFGR_HPRE_DIV128 /*!< SYSCLK divided by 128 */ -#define LL_RCC_SYSCLK_DIV_256 RCC_CFGR_HPRE_DIV256 /*!< SYSCLK divided by 256 */ -#define LL_RCC_SYSCLK_DIV_512 RCC_CFGR_HPRE_DIV512 /*!< SYSCLK divided by 512 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_APB1_DIV APB low-speed prescaler (APB1) - * @{ - */ -#define LL_RCC_APB1_DIV_1 RCC_CFGR_PPRE1_DIV1 /*!< HCLK not divided */ -#define LL_RCC_APB1_DIV_2 RCC_CFGR_PPRE1_DIV2 /*!< HCLK divided by 2 */ -#define LL_RCC_APB1_DIV_4 RCC_CFGR_PPRE1_DIV4 /*!< HCLK divided by 4 */ -#define LL_RCC_APB1_DIV_8 RCC_CFGR_PPRE1_DIV8 /*!< HCLK divided by 8 */ -#define LL_RCC_APB1_DIV_16 RCC_CFGR_PPRE1_DIV16 /*!< HCLK divided by 16 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_APB2_DIV APB high-speed prescaler (APB2) - * @{ - */ -#define LL_RCC_APB2_DIV_1 RCC_CFGR_PPRE2_DIV1 /*!< HCLK not divided */ -#define LL_RCC_APB2_DIV_2 RCC_CFGR_PPRE2_DIV2 /*!< HCLK divided by 2 */ -#define LL_RCC_APB2_DIV_4 RCC_CFGR_PPRE2_DIV4 /*!< HCLK divided by 4 */ -#define LL_RCC_APB2_DIV_8 RCC_CFGR_PPRE2_DIV8 /*!< HCLK divided by 8 */ -#define LL_RCC_APB2_DIV_16 RCC_CFGR_PPRE2_DIV16 /*!< HCLK divided by 16 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_MCOxSOURCE MCO source selection - * @{ - */ -#define LL_RCC_MCO1SOURCE_HSI (uint32_t)(RCC_CFGR_MCO1|0x00000000U) /*!< HSI selection as MCO1 source */ -#define LL_RCC_MCO1SOURCE_LSE (uint32_t)(RCC_CFGR_MCO1|(RCC_CFGR_MCO1_0 >> 16U)) /*!< LSE selection as MCO1 source */ -#define LL_RCC_MCO1SOURCE_HSE (uint32_t)(RCC_CFGR_MCO1|(RCC_CFGR_MCO1_1 >> 16U)) /*!< HSE selection as MCO1 source */ -#define LL_RCC_MCO1SOURCE_PLLCLK (uint32_t)(RCC_CFGR_MCO1|((RCC_CFGR_MCO1_1|RCC_CFGR_MCO1_0) >> 16U)) /*!< PLLCLK selection as MCO1 source */ -#if defined(RCC_CFGR_MCO2) -#define LL_RCC_MCO2SOURCE_SYSCLK (uint32_t)(RCC_CFGR_MCO2|0x00000000U) /*!< SYSCLK selection as MCO2 source */ -#define LL_RCC_MCO2SOURCE_PLLI2S (uint32_t)(RCC_CFGR_MCO2|(RCC_CFGR_MCO2_0 >> 16U)) /*!< PLLI2S selection as MCO2 source */ -#define LL_RCC_MCO2SOURCE_HSE (uint32_t)(RCC_CFGR_MCO2|(RCC_CFGR_MCO2_1 >> 16U)) /*!< HSE selection as MCO2 source */ -#define LL_RCC_MCO2SOURCE_PLLCLK (uint32_t)(RCC_CFGR_MCO2|((RCC_CFGR_MCO2_1|RCC_CFGR_MCO2_0) >> 16U)) /*!< PLLCLK selection as MCO2 source */ -#endif /* RCC_CFGR_MCO2 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_MCOx_DIV MCO prescaler - * @{ - */ -#define LL_RCC_MCO1_DIV_1 (uint32_t)(RCC_CFGR_MCO1PRE|0x00000000U) /*!< MCO1 not divided */ -#define LL_RCC_MCO1_DIV_2 (uint32_t)(RCC_CFGR_MCO1PRE|(RCC_CFGR_MCO1PRE_2 >> 16U)) /*!< MCO1 divided by 2 */ -#define LL_RCC_MCO1_DIV_3 (uint32_t)(RCC_CFGR_MCO1PRE|((RCC_CFGR_MCO1PRE_2|RCC_CFGR_MCO1PRE_0) >> 16U)) /*!< MCO1 divided by 3 */ -#define LL_RCC_MCO1_DIV_4 (uint32_t)(RCC_CFGR_MCO1PRE|((RCC_CFGR_MCO1PRE_2|RCC_CFGR_MCO1PRE_1) >> 16U)) /*!< MCO1 divided by 4 */ -#define LL_RCC_MCO1_DIV_5 (uint32_t)(RCC_CFGR_MCO1PRE|(RCC_CFGR_MCO1PRE >> 16U)) /*!< MCO1 divided by 5 */ -#if defined(RCC_CFGR_MCO2PRE) -#define LL_RCC_MCO2_DIV_1 (uint32_t)(RCC_CFGR_MCO2PRE|0x00000000U) /*!< MCO2 not divided */ -#define LL_RCC_MCO2_DIV_2 (uint32_t)(RCC_CFGR_MCO2PRE|(RCC_CFGR_MCO2PRE_2 >> 16U)) /*!< MCO2 divided by 2 */ -#define LL_RCC_MCO2_DIV_3 (uint32_t)(RCC_CFGR_MCO2PRE|((RCC_CFGR_MCO2PRE_2|RCC_CFGR_MCO2PRE_0) >> 16U)) /*!< MCO2 divided by 3 */ -#define LL_RCC_MCO2_DIV_4 (uint32_t)(RCC_CFGR_MCO2PRE|((RCC_CFGR_MCO2PRE_2|RCC_CFGR_MCO2PRE_1) >> 16U)) /*!< MCO2 divided by 4 */ -#define LL_RCC_MCO2_DIV_5 (uint32_t)(RCC_CFGR_MCO2PRE|(RCC_CFGR_MCO2PRE >> 16U)) /*!< MCO2 divided by 5 */ -#endif /* RCC_CFGR_MCO2PRE */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_RTC_HSEDIV HSE prescaler for RTC clock - * @{ - */ -#define LL_RCC_RTC_NOCLOCK 0x00000000U /*!< HSE not divided */ -#define LL_RCC_RTC_HSE_DIV_2 RCC_CFGR_RTCPRE_1 /*!< HSE clock divided by 2 */ -#define LL_RCC_RTC_HSE_DIV_3 (RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 3 */ -#define LL_RCC_RTC_HSE_DIV_4 RCC_CFGR_RTCPRE_2 /*!< HSE clock divided by 4 */ -#define LL_RCC_RTC_HSE_DIV_5 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 5 */ -#define LL_RCC_RTC_HSE_DIV_6 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 6 */ -#define LL_RCC_RTC_HSE_DIV_7 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 7 */ -#define LL_RCC_RTC_HSE_DIV_8 RCC_CFGR_RTCPRE_3 /*!< HSE clock divided by 8 */ -#define LL_RCC_RTC_HSE_DIV_9 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 9 */ -#define LL_RCC_RTC_HSE_DIV_10 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 10 */ -#define LL_RCC_RTC_HSE_DIV_11 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 11 */ -#define LL_RCC_RTC_HSE_DIV_12 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 12 */ -#define LL_RCC_RTC_HSE_DIV_13 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 13 */ -#define LL_RCC_RTC_HSE_DIV_14 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 14 */ -#define LL_RCC_RTC_HSE_DIV_15 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 15 */ -#define LL_RCC_RTC_HSE_DIV_16 RCC_CFGR_RTCPRE_4 /*!< HSE clock divided by 16 */ -#define LL_RCC_RTC_HSE_DIV_17 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 17 */ -#define LL_RCC_RTC_HSE_DIV_18 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 18 */ -#define LL_RCC_RTC_HSE_DIV_19 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 19 */ -#define LL_RCC_RTC_HSE_DIV_20 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 20 */ -#define LL_RCC_RTC_HSE_DIV_21 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 21 */ -#define LL_RCC_RTC_HSE_DIV_22 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 22 */ -#define LL_RCC_RTC_HSE_DIV_23 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 23 */ -#define LL_RCC_RTC_HSE_DIV_24 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3) /*!< HSE clock divided by 24 */ -#define LL_RCC_RTC_HSE_DIV_25 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 25 */ -#define LL_RCC_RTC_HSE_DIV_26 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 26 */ -#define LL_RCC_RTC_HSE_DIV_27 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 27 */ -#define LL_RCC_RTC_HSE_DIV_28 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 28 */ -#define LL_RCC_RTC_HSE_DIV_29 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 29 */ -#define LL_RCC_RTC_HSE_DIV_30 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 30 */ -#define LL_RCC_RTC_HSE_DIV_31 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 31 */ -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup RCC_LL_EC_PERIPH_FREQUENCY Peripheral clock frequency - * @{ - */ -#define LL_RCC_PERIPH_FREQUENCY_NO 0x00000000U /*!< No clock enabled for the peripheral */ -#define LL_RCC_PERIPH_FREQUENCY_NA 0xFFFFFFFFU /*!< Frequency cannot be provided as external clock */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -#if defined(FMPI2C1) -/** @defgroup RCC_LL_EC_FMPI2C1_CLKSOURCE Peripheral FMPI2C clock source selection - * @{ - */ -#define LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 0x00000000U /*!< PCLK1 clock used as FMPI2C1 clock source */ -#define LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK RCC_DCKCFGR2_FMPI2C1SEL_0 /*!< SYSCLK clock used as FMPI2C1 clock source */ -#define LL_RCC_FMPI2C1_CLKSOURCE_HSI RCC_DCKCFGR2_FMPI2C1SEL_1 /*!< HSI clock used as FMPI2C1 clock source */ -/** - * @} - */ -#endif /* FMPI2C1 */ - -#if defined(LPTIM1) -/** @defgroup RCC_LL_EC_LPTIM1_CLKSOURCE Peripheral LPTIM clock source selection - * @{ - */ -#define LL_RCC_LPTIM1_CLKSOURCE_PCLK1 0x00000000U /*!< PCLK1 clock used as LPTIM1 clock */ -#define LL_RCC_LPTIM1_CLKSOURCE_HSI RCC_DCKCFGR2_LPTIM1SEL_0 /*!< LSI oscillator clock used as LPTIM1 clock */ -#define LL_RCC_LPTIM1_CLKSOURCE_LSI RCC_DCKCFGR2_LPTIM1SEL_1 /*!< HSI oscillator clock used as LPTIM1 clock */ -#define LL_RCC_LPTIM1_CLKSOURCE_LSE (uint32_t)(RCC_DCKCFGR2_LPTIM1SEL_1 | RCC_DCKCFGR2_LPTIM1SEL_0) /*!< LSE oscillator clock used as LPTIM1 clock */ -/** - * @} - */ -#endif /* LPTIM1 */ - -#if defined(SAI1) -/** @defgroup RCC_LL_EC_SAIx_CLKSOURCE Peripheral SAI clock source selection - * @{ - */ -#if defined(RCC_DCKCFGR_SAI1SRC) -#define LL_RCC_SAI1_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1SRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 clock source */ -#define LL_RCC_SAI1_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 clock source */ -#define LL_RCC_SAI1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC_1 >> 16)) /*!< PLL clock used as SAI1 clock source */ -#define LL_RCC_SAI1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC >> 16)) /*!< External pin clock used as SAI1 clock source */ -#endif /* RCC_DCKCFGR_SAI1SRC */ -#if defined(RCC_DCKCFGR_SAI2SRC) -#define LL_RCC_SAI2_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI2SRC | 0x00000000U) /*!< PLLSAI clock used as SAI2 clock source */ -#define LL_RCC_SAI2_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC_0 >> 16)) /*!< PLLI2S clock used as SAI2 clock source */ -#define LL_RCC_SAI2_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC_1 >> 16)) /*!< PLL clock used as SAI2 clock source */ -#define LL_RCC_SAI2_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC >> 16)) /*!< PLL Main clock used as SAI2 clock source */ -#endif /* RCC_DCKCFGR_SAI2SRC */ -#if defined(RCC_DCKCFGR_SAI1ASRC) -#if defined(RCC_SAI1A_PLLSOURCE_SUPPORT) -#define LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1ASRC | 0x00000000U) /*!< PLLI2S clock used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_0 >> 16)) /*!< External pin used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_1 >> 16)) /*!< PLL clock used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC >> 16)) /*!< PLL Main clock used as SAI1 block A clock source */ -#else -#define LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1ASRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_1 >> 16)) /*!< External pin clock used as SAI1 block A clock source */ -#endif /* RCC_SAI1A_PLLSOURCE_SUPPORT */ -#endif /* RCC_DCKCFGR_SAI1ASRC */ -#if defined(RCC_DCKCFGR_SAI1BSRC) -#if defined(RCC_SAI1B_PLLSOURCE_SUPPORT) -#define LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1BSRC | 0x00000000U) /*!< PLLI2S clock used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_0 >> 16)) /*!< External pin used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_1 >> 16)) /*!< PLL clock used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC >> 16)) /*!< PLL Main clock used as SAI1 block B clock source */ -#else -#define LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1BSRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_1 >> 16)) /*!< External pin clock used as SAI1 block B clock source */ -#endif /* RCC_SAI1B_PLLSOURCE_SUPPORT */ -#endif /* RCC_DCKCFGR_SAI1BSRC */ -/** - * @} - */ -#endif /* SAI1 */ - -#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) -/** @defgroup RCC_LL_EC_SDIOx_CLKSOURCE Peripheral SDIO clock source selection - * @{ - */ -#define LL_RCC_SDIO_CLKSOURCE_PLL48CLK 0x00000000U /*!< PLL 48M domain clock used as SDIO clock */ -#if defined(RCC_DCKCFGR_SDIOSEL) -#define LL_RCC_SDIO_CLKSOURCE_SYSCLK RCC_DCKCFGR_SDIOSEL /*!< System clock clock used as SDIO clock */ -#else -#define LL_RCC_SDIO_CLKSOURCE_SYSCLK RCC_DCKCFGR2_SDIOSEL /*!< System clock clock used as SDIO clock */ -#endif /* RCC_DCKCFGR_SDIOSEL */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ - -#if defined(DSI) -/** @defgroup RCC_LL_EC_DSI_CLKSOURCE Peripheral DSI clock source selection - * @{ - */ -#define LL_RCC_DSI_CLKSOURCE_PHY 0x00000000U /*!< DSI-PHY clock used as DSI byte lane clock source */ -#define LL_RCC_DSI_CLKSOURCE_PLL RCC_DCKCFGR_DSISEL /*!< PLL clock used as DSI byte lane clock source */ -/** - * @} - */ -#endif /* DSI */ - -#if defined(CEC) -/** @defgroup RCC_LL_EC_CEC_CLKSOURCE Peripheral CEC clock source selection - * @{ - */ -#define LL_RCC_CEC_CLKSOURCE_HSI_DIV488 0x00000000U /*!< HSI oscillator clock divided by 488 used as CEC clock */ -#define LL_RCC_CEC_CLKSOURCE_LSE RCC_DCKCFGR2_CECSEL /*!< LSE oscillator clock used as CEC clock */ -/** - * @} - */ -#endif /* CEC */ - -/** @defgroup RCC_LL_EC_I2S1_CLKSOURCE Peripheral I2S clock source selection - * @{ - */ -#if defined(RCC_CFGR_I2SSRC) -#define LL_RCC_I2S1_CLKSOURCE_PLLI2S 0x00000000U /*!< I2S oscillator clock used as I2S1 clock */ -#define LL_RCC_I2S1_CLKSOURCE_PIN RCC_CFGR_I2SSRC /*!< External pin clock used as I2S1 clock */ -#endif /* RCC_CFGR_I2SSRC */ -#if defined(RCC_DCKCFGR_I2SSRC) -#define LL_RCC_I2S1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2SSRC | 0x00000000U) /*!< PLL clock used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2SSRC | (RCC_DCKCFGR_I2SSRC_0 >> 16)) /*!< External pin used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2SSRC | (RCC_DCKCFGR_I2SSRC_1 >> 16)) /*!< PLL Main clock used as I2S1 clock source */ -#endif /* RCC_DCKCFGR_I2SSRC */ -#if defined(RCC_DCKCFGR_I2S1SRC) -#define LL_RCC_I2S1_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_I2S1SRC | 0x00000000U) /*!< PLLI2S clock used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC_0 >> 16)) /*!< External pin used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC_1 >> 16)) /*!< PLL clock used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC >> 16)) /*!< PLL Main clock used as I2S1 clock source */ -#endif /* RCC_DCKCFGR_I2S1SRC */ -#if defined(RCC_DCKCFGR_I2S2SRC) -#define LL_RCC_I2S2_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_I2S2SRC | 0x00000000U) /*!< PLLI2S clock used as I2S2 clock source */ -#define LL_RCC_I2S2_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC_0 >> 16)) /*!< External pin used as I2S2 clock source */ -#define LL_RCC_I2S2_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC_1 >> 16)) /*!< PLL clock used as I2S2 clock source */ -#define LL_RCC_I2S2_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC >> 16)) /*!< PLL Main clock used as I2S2 clock source */ -#endif /* RCC_DCKCFGR_I2S2SRC */ -/** - * @} - */ - -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -/** @defgroup RCC_LL_EC_CK48M_CLKSOURCE Peripheral 48Mhz domain clock source selection - * @{ - */ -#if defined(RCC_DCKCFGR_CK48MSEL) -#define LL_RCC_CK48M_CLKSOURCE_PLL 0x00000000U /*!< PLL oscillator clock used as 48Mhz domain clock */ -#define LL_RCC_CK48M_CLKSOURCE_PLLSAI RCC_DCKCFGR_CK48MSEL /*!< PLLSAI oscillator clock used as 48Mhz domain clock */ -#endif /* RCC_DCKCFGR_CK48MSEL */ -#if defined(RCC_DCKCFGR2_CK48MSEL) -#define LL_RCC_CK48M_CLKSOURCE_PLL 0x00000000U /*!< PLL oscillator clock used as 48Mhz domain clock */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_CK48M_CLKSOURCE_PLLSAI RCC_DCKCFGR2_CK48MSEL /*!< PLLSAI oscillator clock used as 48Mhz domain clock */ -#endif /* RCC_PLLSAI_SUPPORT */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -#define LL_RCC_CK48M_CLKSOURCE_PLLI2S RCC_DCKCFGR2_CK48MSEL /*!< PLLI2S oscillator clock used as 48Mhz domain clock */ -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ -#endif /* RCC_DCKCFGR2_CK48MSEL */ -/** - * @} - */ - -#if defined(RNG) -/** @defgroup RCC_LL_EC_RNG_CLKSOURCE Peripheral RNG clock source selection - * @{ - */ -#define LL_RCC_RNG_CLKSOURCE_PLL LL_RCC_CK48M_CLKSOURCE_PLL /*!< PLL clock used as RNG clock source */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_RNG_CLKSOURCE_PLLSAI LL_RCC_CK48M_CLKSOURCE_PLLSAI /*!< PLLSAI clock used as RNG clock source */ -#endif /* RCC_PLLSAI_SUPPORT */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -#define LL_RCC_RNG_CLKSOURCE_PLLI2S LL_RCC_CK48M_CLKSOURCE_PLLI2S /*!< PLLI2S clock used as RNG clock source */ -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ -/** - * @} - */ -#endif /* RNG */ - -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -/** @defgroup RCC_LL_EC_USB_CLKSOURCE Peripheral USB clock source selection - * @{ - */ -#define LL_RCC_USB_CLKSOURCE_PLL LL_RCC_CK48M_CLKSOURCE_PLL /*!< PLL clock used as USB clock source */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_USB_CLKSOURCE_PLLSAI LL_RCC_CK48M_CLKSOURCE_PLLSAI /*!< PLLSAI clock used as USB clock source */ -#endif /* RCC_PLLSAI_SUPPORT */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -#define LL_RCC_USB_CLKSOURCE_PLLI2S LL_RCC_CK48M_CLKSOURCE_PLLI2S /*!< PLLI2S clock used as USB clock source */ -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ -/** - * @} - */ -#endif /* USB_OTG_FS || USB_OTG_HS */ - -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ - -#if defined(DFSDM1_Channel0) || defined(DFSDM2_Channel0) -/** @defgroup RCC_LL_EC_DFSDM1_AUDIO_CLKSOURCE Peripheral DFSDM Audio clock source selection - * @{ - */ -#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 (uint32_t)(RCC_DCKCFGR_CKDFSDM1ASEL | 0x00000000U) /*!< I2S1 clock used as DFSDM1 Audio clock source */ -#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 (uint32_t)(RCC_DCKCFGR_CKDFSDM1ASEL | (RCC_DCKCFGR_CKDFSDM1ASEL << 16)) /*!< I2S2 clock used as DFSDM1 Audio clock source */ -#if defined(DFSDM2_Channel0) -#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (uint32_t)(RCC_DCKCFGR_CKDFSDM2ASEL | 0x00000000U) /*!< I2S1 clock used as DFSDM2 Audio clock source */ -#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (uint32_t)(RCC_DCKCFGR_CKDFSDM2ASEL | (RCC_DCKCFGR_CKDFSDM2ASEL << 16)) /*!< I2S2 clock used as DFSDM2 Audio clock source */ -#endif /* DFSDM2_Channel0 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_DFSDM1_CLKSOURCE Peripheral DFSDM clock source selection - * @{ - */ -#define LL_RCC_DFSDM1_CLKSOURCE_PCLK2 0x00000000U /*!< PCLK2 clock used as DFSDM1 clock */ -#define LL_RCC_DFSDM1_CLKSOURCE_SYSCLK RCC_DCKCFGR_CKDFSDM1SEL /*!< System clock used as DFSDM1 clock */ -#if defined(DFSDM2_Channel0) -#define LL_RCC_DFSDM2_CLKSOURCE_PCLK2 0x00000000U /*!< PCLK2 clock used as DFSDM2 clock */ -#define LL_RCC_DFSDM2_CLKSOURCE_SYSCLK RCC_DCKCFGR_CKDFSDM1SEL /*!< System clock used as DFSDM2 clock */ -#endif /* DFSDM2_Channel0 */ -/** - * @} - */ -#endif /* DFSDM1_Channel0 || DFSDM2_Channel0 */ - -#if defined(FMPI2C1) -/** @defgroup RCC_LL_EC_FMPI2C1 Peripheral FMPI2C get clock source - * @{ - */ -#define LL_RCC_FMPI2C1_CLKSOURCE RCC_DCKCFGR2_FMPI2C1SEL /*!< FMPI2C1 Clock source selection */ -/** - * @} - */ -#endif /* FMPI2C1 */ - -#if defined(SPDIFRX) -/** @defgroup RCC_LL_EC_SPDIFRX_CLKSOURCE Peripheral SPDIFRX clock source selection - * @{ - */ -#define LL_RCC_SPDIFRX1_CLKSOURCE_PLL 0x00000000U /*!< PLL clock used as SPDIFRX clock source */ -#define LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S RCC_DCKCFGR2_SPDIFRXSEL /*!< PLLI2S clock used as SPDIFRX clock source */ -/** - * @} - */ -#endif /* SPDIFRX */ - -#if defined(LPTIM1) -/** @defgroup RCC_LL_EC_LPTIM1 Peripheral LPTIM get clock source - * @{ - */ -#define LL_RCC_LPTIM1_CLKSOURCE RCC_DCKCFGR2_LPTIM1SEL /*!< LPTIM1 Clock source selection */ -/** - * @} - */ -#endif /* LPTIM1 */ - -#if defined(SAI1) -/** @defgroup RCC_LL_EC_SAIx Peripheral SAI get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_SAI1ASRC) -#define LL_RCC_SAI1_A_CLKSOURCE RCC_DCKCFGR_SAI1ASRC /*!< SAI1 block A Clock source selection */ -#endif /* RCC_DCKCFGR_SAI1ASRC */ -#if defined(RCC_DCKCFGR_SAI1BSRC) -#define LL_RCC_SAI1_B_CLKSOURCE RCC_DCKCFGR_SAI1BSRC /*!< SAI1 block B Clock source selection */ -#endif /* RCC_DCKCFGR_SAI1BSRC */ -#if defined(RCC_DCKCFGR_SAI1SRC) -#define LL_RCC_SAI1_CLKSOURCE RCC_DCKCFGR_SAI1SRC /*!< SAI1 Clock source selection */ -#endif /* RCC_DCKCFGR_SAI1SRC */ -#if defined(RCC_DCKCFGR_SAI2SRC) -#define LL_RCC_SAI2_CLKSOURCE RCC_DCKCFGR_SAI2SRC /*!< SAI2 Clock source selection */ -#endif /* RCC_DCKCFGR_SAI2SRC */ -/** - * @} - */ -#endif /* SAI1 */ - -#if defined(SDIO) -/** @defgroup RCC_LL_EC_SDIOx Peripheral SDIO get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_SDIOSEL) -#define LL_RCC_SDIO_CLKSOURCE RCC_DCKCFGR_SDIOSEL /*!< SDIO Clock source selection */ -#elif defined(RCC_DCKCFGR2_SDIOSEL) -#define LL_RCC_SDIO_CLKSOURCE RCC_DCKCFGR2_SDIOSEL /*!< SDIO Clock source selection */ -#else -#define LL_RCC_SDIO_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< SDIO Clock source selection */ -#endif /* RCC_DCKCFGR_SDIOSEL */ -/** - * @} - */ -#endif /* SDIO */ - -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -/** @defgroup RCC_LL_EC_CK48M Peripheral CK48M get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_CK48MSEL) -#define LL_RCC_CK48M_CLKSOURCE RCC_DCKCFGR_CK48MSEL /*!< CK48M Domain clock source selection */ -#endif /* RCC_DCKCFGR_CK48MSEL */ -#if defined(RCC_DCKCFGR2_CK48MSEL) -#define LL_RCC_CK48M_CLKSOURCE RCC_DCKCFGR2_CK48MSEL /*!< CK48M Domain clock source selection */ -#endif /* RCC_DCKCFGR_CK48MSEL */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ - -#if defined(RNG) -/** @defgroup RCC_LL_EC_RNG Peripheral RNG get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -#define LL_RCC_RNG_CLKSOURCE LL_RCC_CK48M_CLKSOURCE /*!< RNG Clock source selection */ -#else -#define LL_RCC_RNG_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< RNG Clock source selection */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ -/** - * @} - */ -#endif /* RNG */ - -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -/** @defgroup RCC_LL_EC_USB Peripheral USB get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -#define LL_RCC_USB_CLKSOURCE LL_RCC_CK48M_CLKSOURCE /*!< USB Clock source selection */ -#else -#define LL_RCC_USB_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< USB Clock source selection */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ -/** - * @} - */ -#endif /* USB_OTG_FS || USB_OTG_HS */ - -#if defined(CEC) -/** @defgroup RCC_LL_EC_CEC Peripheral CEC get clock source - * @{ - */ -#define LL_RCC_CEC_CLKSOURCE RCC_DCKCFGR2_CECSEL /*!< CEC Clock source selection */ -/** - * @} - */ -#endif /* CEC */ - -/** @defgroup RCC_LL_EC_I2S1 Peripheral I2S get clock source - * @{ - */ -#if defined(RCC_CFGR_I2SSRC) -#define LL_RCC_I2S1_CLKSOURCE RCC_CFGR_I2SSRC /*!< I2S1 Clock source selection */ -#endif /* RCC_CFGR_I2SSRC */ -#if defined(RCC_DCKCFGR_I2SSRC) -#define LL_RCC_I2S1_CLKSOURCE RCC_DCKCFGR_I2SSRC /*!< I2S1 Clock source selection */ -#endif /* RCC_DCKCFGR_I2SSRC */ -#if defined(RCC_DCKCFGR_I2S1SRC) -#define LL_RCC_I2S1_CLKSOURCE RCC_DCKCFGR_I2S1SRC /*!< I2S1 Clock source selection */ -#endif /* RCC_DCKCFGR_I2S1SRC */ -#if defined(RCC_DCKCFGR_I2S2SRC) -#define LL_RCC_I2S2_CLKSOURCE RCC_DCKCFGR_I2S2SRC /*!< I2S2 Clock source selection */ -#endif /* RCC_DCKCFGR_I2S2SRC */ -/** - * @} - */ - -#if defined(DFSDM1_Channel0) || defined(DFSDM2_Channel0) -/** @defgroup RCC_LL_EC_DFSDM_AUDIO Peripheral DFSDM Audio get clock source - * @{ - */ -#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE RCC_DCKCFGR_CKDFSDM1ASEL /*!< DFSDM1 Audio Clock source selection */ -#if defined(DFSDM2_Channel0) -#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE RCC_DCKCFGR_CKDFSDM2ASEL /*!< DFSDM2 Audio Clock source selection */ -#endif /* DFSDM2_Channel0 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_DFSDM Peripheral DFSDM get clock source - * @{ - */ -#define LL_RCC_DFSDM1_CLKSOURCE RCC_DCKCFGR_CKDFSDM1SEL /*!< DFSDM1 Clock source selection */ -#if defined(DFSDM2_Channel0) -#define LL_RCC_DFSDM2_CLKSOURCE RCC_DCKCFGR_CKDFSDM1SEL /*!< DFSDM2 Clock source selection */ -#endif /* DFSDM2_Channel0 */ -/** - * @} - */ -#endif /* DFSDM1_Channel0 || DFSDM2_Channel0 */ - -#if defined(SPDIFRX) -/** @defgroup RCC_LL_EC_SPDIFRX Peripheral SPDIFRX get clock source - * @{ - */ -#define LL_RCC_SPDIFRX1_CLKSOURCE RCC_DCKCFGR2_SPDIFRXSEL /*!< SPDIFRX Clock source selection */ -/** - * @} - */ -#endif /* SPDIFRX */ - -#if defined(DSI) -/** @defgroup RCC_LL_EC_DSI Peripheral DSI get clock source - * @{ - */ -#define LL_RCC_DSI_CLKSOURCE RCC_DCKCFGR_DSISEL /*!< DSI Clock source selection */ -/** - * @} - */ -#endif /* DSI */ - -#if defined(LTDC) -/** @defgroup RCC_LL_EC_LTDC Peripheral LTDC get clock source - * @{ - */ -#define LL_RCC_LTDC_CLKSOURCE RCC_DCKCFGR_PLLSAIDIVR /*!< LTDC Clock source selection */ -/** - * @} - */ -#endif /* LTDC */ - - -/** @defgroup RCC_LL_EC_RTC_CLKSOURCE RTC clock source selection - * @{ - */ -#define LL_RCC_RTC_CLKSOURCE_NONE 0x00000000U /*!< No clock used as RTC clock */ -#define LL_RCC_RTC_CLKSOURCE_LSE RCC_BDCR_RTCSEL_0 /*!< LSE oscillator clock used as RTC clock */ -#define LL_RCC_RTC_CLKSOURCE_LSI RCC_BDCR_RTCSEL_1 /*!< LSI oscillator clock used as RTC clock */ -#define LL_RCC_RTC_CLKSOURCE_HSE RCC_BDCR_RTCSEL /*!< HSE oscillator clock divided by HSE prescaler used as RTC clock */ -/** - * @} - */ - -#if defined(RCC_DCKCFGR_TIMPRE) -/** @defgroup RCC_LL_EC_TIM_CLKPRESCALER Timers clocks prescalers selection - * @{ - */ -#define LL_RCC_TIM_PRESCALER_TWICE 0x00000000U /*!< Timers clock to twice PCLK */ -#define LL_RCC_TIM_PRESCALER_FOUR_TIMES RCC_DCKCFGR_TIMPRE /*!< Timers clock to four time PCLK */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_TIMPRE */ - -/** @defgroup RCC_LL_EC_PLLSOURCE PLL, PLLI2S and PLLSAI entry clock source - * @{ - */ -#define LL_RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI /*!< HSI16 clock selected as PLL entry clock source */ -#define LL_RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE /*!< HSE clock selected as PLL entry clock source */ -#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) -#define LL_RCC_PLLI2SSOURCE_PIN (RCC_PLLI2SCFGR_PLLI2SSRC | 0x80U) /*!< I2S External pin input clock selected as PLLI2S entry clock source */ -#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_PLLM_DIV PLL, PLLI2S and PLLSAI division factor - * @{ - */ -#define LL_RCC_PLLM_DIV_2 (RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 2 */ -#define LL_RCC_PLLM_DIV_3 (RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 3 */ -#define LL_RCC_PLLM_DIV_4 (RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 4 */ -#define LL_RCC_PLLM_DIV_5 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 5 */ -#define LL_RCC_PLLM_DIV_6 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 6 */ -#define LL_RCC_PLLM_DIV_7 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 7 */ -#define LL_RCC_PLLM_DIV_8 (RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 8 */ -#define LL_RCC_PLLM_DIV_9 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 9 */ -#define LL_RCC_PLLM_DIV_10 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 10 */ -#define LL_RCC_PLLM_DIV_11 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 11 */ -#define LL_RCC_PLLM_DIV_12 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 12 */ -#define LL_RCC_PLLM_DIV_13 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 13 */ -#define LL_RCC_PLLM_DIV_14 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 14 */ -#define LL_RCC_PLLM_DIV_15 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 15 */ -#define LL_RCC_PLLM_DIV_16 (RCC_PLLCFGR_PLLM_4) /*!< PLL, PLLI2S and PLLSAI division factor by 16 */ -#define LL_RCC_PLLM_DIV_17 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 17 */ -#define LL_RCC_PLLM_DIV_18 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 18 */ -#define LL_RCC_PLLM_DIV_19 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 19 */ -#define LL_RCC_PLLM_DIV_20 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 20 */ -#define LL_RCC_PLLM_DIV_21 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 21 */ -#define LL_RCC_PLLM_DIV_22 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 22 */ -#define LL_RCC_PLLM_DIV_23 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 23 */ -#define LL_RCC_PLLM_DIV_24 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 24 */ -#define LL_RCC_PLLM_DIV_25 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 25 */ -#define LL_RCC_PLLM_DIV_26 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 26 */ -#define LL_RCC_PLLM_DIV_27 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 27 */ -#define LL_RCC_PLLM_DIV_28 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 28 */ -#define LL_RCC_PLLM_DIV_29 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 29 */ -#define LL_RCC_PLLM_DIV_30 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 30 */ -#define LL_RCC_PLLM_DIV_31 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 31 */ -#define LL_RCC_PLLM_DIV_32 (RCC_PLLCFGR_PLLM_5) /*!< PLL, PLLI2S and PLLSAI division factor by 32 */ -#define LL_RCC_PLLM_DIV_33 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 33 */ -#define LL_RCC_PLLM_DIV_34 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 34 */ -#define LL_RCC_PLLM_DIV_35 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 35 */ -#define LL_RCC_PLLM_DIV_36 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 36 */ -#define LL_RCC_PLLM_DIV_37 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 37 */ -#define LL_RCC_PLLM_DIV_38 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 38 */ -#define LL_RCC_PLLM_DIV_39 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 39 */ -#define LL_RCC_PLLM_DIV_40 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 40 */ -#define LL_RCC_PLLM_DIV_41 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 41 */ -#define LL_RCC_PLLM_DIV_42 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 42 */ -#define LL_RCC_PLLM_DIV_43 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 43 */ -#define LL_RCC_PLLM_DIV_44 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 44 */ -#define LL_RCC_PLLM_DIV_45 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 45 */ -#define LL_RCC_PLLM_DIV_46 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 46 */ -#define LL_RCC_PLLM_DIV_47 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 47 */ -#define LL_RCC_PLLM_DIV_48 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4) /*!< PLL, PLLI2S and PLLSAI division factor by 48 */ -#define LL_RCC_PLLM_DIV_49 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 49 */ -#define LL_RCC_PLLM_DIV_50 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 50 */ -#define LL_RCC_PLLM_DIV_51 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 51 */ -#define LL_RCC_PLLM_DIV_52 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 52 */ -#define LL_RCC_PLLM_DIV_53 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 53 */ -#define LL_RCC_PLLM_DIV_54 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 54 */ -#define LL_RCC_PLLM_DIV_55 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 55 */ -#define LL_RCC_PLLM_DIV_56 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 56 */ -#define LL_RCC_PLLM_DIV_57 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 57 */ -#define LL_RCC_PLLM_DIV_58 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 58 */ -#define LL_RCC_PLLM_DIV_59 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 59 */ -#define LL_RCC_PLLM_DIV_60 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 60 */ -#define LL_RCC_PLLM_DIV_61 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 61 */ -#define LL_RCC_PLLM_DIV_62 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 62 */ -#define LL_RCC_PLLM_DIV_63 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 63 */ -/** - * @} - */ - -#if defined(RCC_PLLCFGR_PLLR) -/** @defgroup RCC_LL_EC_PLLR_DIV PLL division factor (PLLR) - * @{ - */ -#define LL_RCC_PLLR_DIV_2 (RCC_PLLCFGR_PLLR_1) /*!< Main PLL division factor for PLLCLK (system clock) by 2 */ -#define LL_RCC_PLLR_DIV_3 (RCC_PLLCFGR_PLLR_1|RCC_PLLCFGR_PLLR_0) /*!< Main PLL division factor for PLLCLK (system clock) by 3 */ -#define LL_RCC_PLLR_DIV_4 (RCC_PLLCFGR_PLLR_2) /*!< Main PLL division factor for PLLCLK (system clock) by 4 */ -#define LL_RCC_PLLR_DIV_5 (RCC_PLLCFGR_PLLR_2|RCC_PLLCFGR_PLLR_0) /*!< Main PLL division factor for PLLCLK (system clock) by 5 */ -#define LL_RCC_PLLR_DIV_6 (RCC_PLLCFGR_PLLR_2|RCC_PLLCFGR_PLLR_1) /*!< Main PLL division factor for PLLCLK (system clock) by 6 */ -#define LL_RCC_PLLR_DIV_7 (RCC_PLLCFGR_PLLR) /*!< Main PLL division factor for PLLCLK (system clock) by 7 */ -/** - * @} - */ -#endif /* RCC_PLLCFGR_PLLR */ - -#if defined(RCC_DCKCFGR_PLLDIVR) -/** @defgroup RCC_LL_EC_PLLDIVR PLLDIVR division factor (PLLDIVR) - * @{ - */ -#define LL_RCC_PLLDIVR_DIV_1 (RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 1 */ -#define LL_RCC_PLLDIVR_DIV_2 (RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 2 */ -#define LL_RCC_PLLDIVR_DIV_3 (RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 3 */ -#define LL_RCC_PLLDIVR_DIV_4 (RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 4 */ -#define LL_RCC_PLLDIVR_DIV_5 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 5 */ -#define LL_RCC_PLLDIVR_DIV_6 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 6 */ -#define LL_RCC_PLLDIVR_DIV_7 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 7 */ -#define LL_RCC_PLLDIVR_DIV_8 (RCC_DCKCFGR_PLLDIVR_3) /*!< PLL division factor for PLLDIVR output by 8 */ -#define LL_RCC_PLLDIVR_DIV_9 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 9 */ -#define LL_RCC_PLLDIVR_DIV_10 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 10 */ -#define LL_RCC_PLLDIVR_DIV_11 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 11 */ -#define LL_RCC_PLLDIVR_DIV_12 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 12 */ -#define LL_RCC_PLLDIVR_DIV_13 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 13 */ -#define LL_RCC_PLLDIVR_DIV_14 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 14 */ -#define LL_RCC_PLLDIVR_DIV_15 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 15 */ -#define LL_RCC_PLLDIVR_DIV_16 (RCC_DCKCFGR_PLLDIVR_4) /*!< PLL division factor for PLLDIVR output by 16 */ -#define LL_RCC_PLLDIVR_DIV_17 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 17 */ -#define LL_RCC_PLLDIVR_DIV_18 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 18 */ -#define LL_RCC_PLLDIVR_DIV_19 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 19 */ -#define LL_RCC_PLLDIVR_DIV_20 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 20 */ -#define LL_RCC_PLLDIVR_DIV_21 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 21 */ -#define LL_RCC_PLLDIVR_DIV_22 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 22 */ -#define LL_RCC_PLLDIVR_DIV_23 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 23 */ -#define LL_RCC_PLLDIVR_DIV_24 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3) /*!< PLL division factor for PLLDIVR output by 24 */ -#define LL_RCC_PLLDIVR_DIV_25 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 25 */ -#define LL_RCC_PLLDIVR_DIV_26 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 26 */ -#define LL_RCC_PLLDIVR_DIV_27 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 27 */ -#define LL_RCC_PLLDIVR_DIV_28 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 28 */ -#define LL_RCC_PLLDIVR_DIV_29 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 29 */ -#define LL_RCC_PLLDIVR_DIV_30 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 30 */ -#define LL_RCC_PLLDIVR_DIV_31 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 31 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLDIVR */ - -/** @defgroup RCC_LL_EC_PLLP_DIV PLL division factor (PLLP) - * @{ - */ -#define LL_RCC_PLLP_DIV_2 0x00000000U /*!< Main PLL division factor for PLLP output by 2 */ -#define LL_RCC_PLLP_DIV_4 RCC_PLLCFGR_PLLP_0 /*!< Main PLL division factor for PLLP output by 4 */ -#define LL_RCC_PLLP_DIV_6 RCC_PLLCFGR_PLLP_1 /*!< Main PLL division factor for PLLP output by 6 */ -#define LL_RCC_PLLP_DIV_8 (RCC_PLLCFGR_PLLP_1 | RCC_PLLCFGR_PLLP_0) /*!< Main PLL division factor for PLLP output by 8 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_PLLQ_DIV PLL division factor (PLLQ) - * @{ - */ -#define LL_RCC_PLLQ_DIV_2 RCC_PLLCFGR_PLLQ_1 /*!< Main PLL division factor for PLLQ output by 2 */ -#define LL_RCC_PLLQ_DIV_3 (RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 3 */ -#define LL_RCC_PLLQ_DIV_4 RCC_PLLCFGR_PLLQ_2 /*!< Main PLL division factor for PLLQ output by 4 */ -#define LL_RCC_PLLQ_DIV_5 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 5 */ -#define LL_RCC_PLLQ_DIV_6 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 6 */ -#define LL_RCC_PLLQ_DIV_7 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 7 */ -#define LL_RCC_PLLQ_DIV_8 RCC_PLLCFGR_PLLQ_3 /*!< Main PLL division factor for PLLQ output by 8 */ -#define LL_RCC_PLLQ_DIV_9 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 9 */ -#define LL_RCC_PLLQ_DIV_10 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 10 */ -#define LL_RCC_PLLQ_DIV_11 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 11 */ -#define LL_RCC_PLLQ_DIV_12 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2) /*!< Main PLL division factor for PLLQ output by 12 */ -#define LL_RCC_PLLQ_DIV_13 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 13 */ -#define LL_RCC_PLLQ_DIV_14 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 14 */ -#define LL_RCC_PLLQ_DIV_15 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 15 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_PLL_SPRE_SEL PLL Spread Spectrum Selection - * @{ - */ -#define LL_RCC_SPREAD_SELECT_CENTER 0x00000000U /*!< PLL center spread spectrum selection */ -#define LL_RCC_SPREAD_SELECT_DOWN RCC_SSCGR_SPREADSEL /*!< PLL down spread spectrum selection */ -/** - * @} - */ - -#if defined(RCC_PLLI2S_SUPPORT) -/** @defgroup RCC_LL_EC_PLLI2SM PLLI2SM division factor (PLLI2SM) - * @{ - */ -#if defined(RCC_PLLI2SCFGR_PLLI2SM) -#define LL_RCC_PLLI2SM_DIV_2 (RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 2 */ -#define LL_RCC_PLLI2SM_DIV_3 (RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 3 */ -#define LL_RCC_PLLI2SM_DIV_4 (RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 4 */ -#define LL_RCC_PLLI2SM_DIV_5 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 5 */ -#define LL_RCC_PLLI2SM_DIV_6 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 6 */ -#define LL_RCC_PLLI2SM_DIV_7 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 7 */ -#define LL_RCC_PLLI2SM_DIV_8 (RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 8 */ -#define LL_RCC_PLLI2SM_DIV_9 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 9 */ -#define LL_RCC_PLLI2SM_DIV_10 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 10 */ -#define LL_RCC_PLLI2SM_DIV_11 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 11 */ -#define LL_RCC_PLLI2SM_DIV_12 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 12 */ -#define LL_RCC_PLLI2SM_DIV_13 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 13 */ -#define LL_RCC_PLLI2SM_DIV_14 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 14 */ -#define LL_RCC_PLLI2SM_DIV_15 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 15 */ -#define LL_RCC_PLLI2SM_DIV_16 (RCC_PLLI2SCFGR_PLLI2SM_4) /*!< PLLI2S division factor for PLLI2SM output by 16 */ -#define LL_RCC_PLLI2SM_DIV_17 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 17 */ -#define LL_RCC_PLLI2SM_DIV_18 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 18 */ -#define LL_RCC_PLLI2SM_DIV_19 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 19 */ -#define LL_RCC_PLLI2SM_DIV_20 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 20 */ -#define LL_RCC_PLLI2SM_DIV_21 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 21 */ -#define LL_RCC_PLLI2SM_DIV_22 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 22 */ -#define LL_RCC_PLLI2SM_DIV_23 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 23 */ -#define LL_RCC_PLLI2SM_DIV_24 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 24 */ -#define LL_RCC_PLLI2SM_DIV_25 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 25 */ -#define LL_RCC_PLLI2SM_DIV_26 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 26 */ -#define LL_RCC_PLLI2SM_DIV_27 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 27 */ -#define LL_RCC_PLLI2SM_DIV_28 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 28 */ -#define LL_RCC_PLLI2SM_DIV_29 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 29 */ -#define LL_RCC_PLLI2SM_DIV_30 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 30 */ -#define LL_RCC_PLLI2SM_DIV_31 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 31 */ -#define LL_RCC_PLLI2SM_DIV_32 (RCC_PLLI2SCFGR_PLLI2SM_5) /*!< PLLI2S division factor for PLLI2SM output by 32 */ -#define LL_RCC_PLLI2SM_DIV_33 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 33 */ -#define LL_RCC_PLLI2SM_DIV_34 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 34 */ -#define LL_RCC_PLLI2SM_DIV_35 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 35 */ -#define LL_RCC_PLLI2SM_DIV_36 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 36 */ -#define LL_RCC_PLLI2SM_DIV_37 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 37 */ -#define LL_RCC_PLLI2SM_DIV_38 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 38 */ -#define LL_RCC_PLLI2SM_DIV_39 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 39 */ -#define LL_RCC_PLLI2SM_DIV_40 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 40 */ -#define LL_RCC_PLLI2SM_DIV_41 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 41 */ -#define LL_RCC_PLLI2SM_DIV_42 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 42 */ -#define LL_RCC_PLLI2SM_DIV_43 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 43 */ -#define LL_RCC_PLLI2SM_DIV_44 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 44 */ -#define LL_RCC_PLLI2SM_DIV_45 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 45 */ -#define LL_RCC_PLLI2SM_DIV_46 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 46 */ -#define LL_RCC_PLLI2SM_DIV_47 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 47 */ -#define LL_RCC_PLLI2SM_DIV_48 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4) /*!< PLLI2S division factor for PLLI2SM output by 48 */ -#define LL_RCC_PLLI2SM_DIV_49 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 49 */ -#define LL_RCC_PLLI2SM_DIV_50 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 50 */ -#define LL_RCC_PLLI2SM_DIV_51 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 51 */ -#define LL_RCC_PLLI2SM_DIV_52 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 52 */ -#define LL_RCC_PLLI2SM_DIV_53 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 53 */ -#define LL_RCC_PLLI2SM_DIV_54 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 54 */ -#define LL_RCC_PLLI2SM_DIV_55 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 55 */ -#define LL_RCC_PLLI2SM_DIV_56 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 56 */ -#define LL_RCC_PLLI2SM_DIV_57 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 57 */ -#define LL_RCC_PLLI2SM_DIV_58 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 58 */ -#define LL_RCC_PLLI2SM_DIV_59 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 59 */ -#define LL_RCC_PLLI2SM_DIV_60 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 60 */ -#define LL_RCC_PLLI2SM_DIV_61 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 61 */ -#define LL_RCC_PLLI2SM_DIV_62 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 62 */ -#define LL_RCC_PLLI2SM_DIV_63 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 63 */ -#else -#define LL_RCC_PLLI2SM_DIV_2 LL_RCC_PLLM_DIV_2 /*!< PLLI2S division factor for PLLI2SM output by 2 */ -#define LL_RCC_PLLI2SM_DIV_3 LL_RCC_PLLM_DIV_3 /*!< PLLI2S division factor for PLLI2SM output by 3 */ -#define LL_RCC_PLLI2SM_DIV_4 LL_RCC_PLLM_DIV_4 /*!< PLLI2S division factor for PLLI2SM output by 4 */ -#define LL_RCC_PLLI2SM_DIV_5 LL_RCC_PLLM_DIV_5 /*!< PLLI2S division factor for PLLI2SM output by 5 */ -#define LL_RCC_PLLI2SM_DIV_6 LL_RCC_PLLM_DIV_6 /*!< PLLI2S division factor for PLLI2SM output by 6 */ -#define LL_RCC_PLLI2SM_DIV_7 LL_RCC_PLLM_DIV_7 /*!< PLLI2S division factor for PLLI2SM output by 7 */ -#define LL_RCC_PLLI2SM_DIV_8 LL_RCC_PLLM_DIV_8 /*!< PLLI2S division factor for PLLI2SM output by 8 */ -#define LL_RCC_PLLI2SM_DIV_9 LL_RCC_PLLM_DIV_9 /*!< PLLI2S division factor for PLLI2SM output by 9 */ -#define LL_RCC_PLLI2SM_DIV_10 LL_RCC_PLLM_DIV_10 /*!< PLLI2S division factor for PLLI2SM output by 10 */ -#define LL_RCC_PLLI2SM_DIV_11 LL_RCC_PLLM_DIV_11 /*!< PLLI2S division factor for PLLI2SM output by 11 */ -#define LL_RCC_PLLI2SM_DIV_12 LL_RCC_PLLM_DIV_12 /*!< PLLI2S division factor for PLLI2SM output by 12 */ -#define LL_RCC_PLLI2SM_DIV_13 LL_RCC_PLLM_DIV_13 /*!< PLLI2S division factor for PLLI2SM output by 13 */ -#define LL_RCC_PLLI2SM_DIV_14 LL_RCC_PLLM_DIV_14 /*!< PLLI2S division factor for PLLI2SM output by 14 */ -#define LL_RCC_PLLI2SM_DIV_15 LL_RCC_PLLM_DIV_15 /*!< PLLI2S division factor for PLLI2SM output by 15 */ -#define LL_RCC_PLLI2SM_DIV_16 LL_RCC_PLLM_DIV_16 /*!< PLLI2S division factor for PLLI2SM output by 16 */ -#define LL_RCC_PLLI2SM_DIV_17 LL_RCC_PLLM_DIV_17 /*!< PLLI2S division factor for PLLI2SM output by 17 */ -#define LL_RCC_PLLI2SM_DIV_18 LL_RCC_PLLM_DIV_18 /*!< PLLI2S division factor for PLLI2SM output by 18 */ -#define LL_RCC_PLLI2SM_DIV_19 LL_RCC_PLLM_DIV_19 /*!< PLLI2S division factor for PLLI2SM output by 19 */ -#define LL_RCC_PLLI2SM_DIV_20 LL_RCC_PLLM_DIV_20 /*!< PLLI2S division factor for PLLI2SM output by 20 */ -#define LL_RCC_PLLI2SM_DIV_21 LL_RCC_PLLM_DIV_21 /*!< PLLI2S division factor for PLLI2SM output by 21 */ -#define LL_RCC_PLLI2SM_DIV_22 LL_RCC_PLLM_DIV_22 /*!< PLLI2S division factor for PLLI2SM output by 22 */ -#define LL_RCC_PLLI2SM_DIV_23 LL_RCC_PLLM_DIV_23 /*!< PLLI2S division factor for PLLI2SM output by 23 */ -#define LL_RCC_PLLI2SM_DIV_24 LL_RCC_PLLM_DIV_24 /*!< PLLI2S division factor for PLLI2SM output by 24 */ -#define LL_RCC_PLLI2SM_DIV_25 LL_RCC_PLLM_DIV_25 /*!< PLLI2S division factor for PLLI2SM output by 25 */ -#define LL_RCC_PLLI2SM_DIV_26 LL_RCC_PLLM_DIV_26 /*!< PLLI2S division factor for PLLI2SM output by 26 */ -#define LL_RCC_PLLI2SM_DIV_27 LL_RCC_PLLM_DIV_27 /*!< PLLI2S division factor for PLLI2SM output by 27 */ -#define LL_RCC_PLLI2SM_DIV_28 LL_RCC_PLLM_DIV_28 /*!< PLLI2S division factor for PLLI2SM output by 28 */ -#define LL_RCC_PLLI2SM_DIV_29 LL_RCC_PLLM_DIV_29 /*!< PLLI2S division factor for PLLI2SM output by 29 */ -#define LL_RCC_PLLI2SM_DIV_30 LL_RCC_PLLM_DIV_30 /*!< PLLI2S division factor for PLLI2SM output by 30 */ -#define LL_RCC_PLLI2SM_DIV_31 LL_RCC_PLLM_DIV_31 /*!< PLLI2S division factor for PLLI2SM output by 31 */ -#define LL_RCC_PLLI2SM_DIV_32 LL_RCC_PLLM_DIV_32 /*!< PLLI2S division factor for PLLI2SM output by 32 */ -#define LL_RCC_PLLI2SM_DIV_33 LL_RCC_PLLM_DIV_33 /*!< PLLI2S division factor for PLLI2SM output by 33 */ -#define LL_RCC_PLLI2SM_DIV_34 LL_RCC_PLLM_DIV_34 /*!< PLLI2S division factor for PLLI2SM output by 34 */ -#define LL_RCC_PLLI2SM_DIV_35 LL_RCC_PLLM_DIV_35 /*!< PLLI2S division factor for PLLI2SM output by 35 */ -#define LL_RCC_PLLI2SM_DIV_36 LL_RCC_PLLM_DIV_36 /*!< PLLI2S division factor for PLLI2SM output by 36 */ -#define LL_RCC_PLLI2SM_DIV_37 LL_RCC_PLLM_DIV_37 /*!< PLLI2S division factor for PLLI2SM output by 37 */ -#define LL_RCC_PLLI2SM_DIV_38 LL_RCC_PLLM_DIV_38 /*!< PLLI2S division factor for PLLI2SM output by 38 */ -#define LL_RCC_PLLI2SM_DIV_39 LL_RCC_PLLM_DIV_39 /*!< PLLI2S division factor for PLLI2SM output by 39 */ -#define LL_RCC_PLLI2SM_DIV_40 LL_RCC_PLLM_DIV_40 /*!< PLLI2S division factor for PLLI2SM output by 40 */ -#define LL_RCC_PLLI2SM_DIV_41 LL_RCC_PLLM_DIV_41 /*!< PLLI2S division factor for PLLI2SM output by 41 */ -#define LL_RCC_PLLI2SM_DIV_42 LL_RCC_PLLM_DIV_42 /*!< PLLI2S division factor for PLLI2SM output by 42 */ -#define LL_RCC_PLLI2SM_DIV_43 LL_RCC_PLLM_DIV_43 /*!< PLLI2S division factor for PLLI2SM output by 43 */ -#define LL_RCC_PLLI2SM_DIV_44 LL_RCC_PLLM_DIV_44 /*!< PLLI2S division factor for PLLI2SM output by 44 */ -#define LL_RCC_PLLI2SM_DIV_45 LL_RCC_PLLM_DIV_45 /*!< PLLI2S division factor for PLLI2SM output by 45 */ -#define LL_RCC_PLLI2SM_DIV_46 LL_RCC_PLLM_DIV_46 /*!< PLLI2S division factor for PLLI2SM output by 46 */ -#define LL_RCC_PLLI2SM_DIV_47 LL_RCC_PLLM_DIV_47 /*!< PLLI2S division factor for PLLI2SM output by 47 */ -#define LL_RCC_PLLI2SM_DIV_48 LL_RCC_PLLM_DIV_48 /*!< PLLI2S division factor for PLLI2SM output by 48 */ -#define LL_RCC_PLLI2SM_DIV_49 LL_RCC_PLLM_DIV_49 /*!< PLLI2S division factor for PLLI2SM output by 49 */ -#define LL_RCC_PLLI2SM_DIV_50 LL_RCC_PLLM_DIV_50 /*!< PLLI2S division factor for PLLI2SM output by 50 */ -#define LL_RCC_PLLI2SM_DIV_51 LL_RCC_PLLM_DIV_51 /*!< PLLI2S division factor for PLLI2SM output by 51 */ -#define LL_RCC_PLLI2SM_DIV_52 LL_RCC_PLLM_DIV_52 /*!< PLLI2S division factor for PLLI2SM output by 52 */ -#define LL_RCC_PLLI2SM_DIV_53 LL_RCC_PLLM_DIV_53 /*!< PLLI2S division factor for PLLI2SM output by 53 */ -#define LL_RCC_PLLI2SM_DIV_54 LL_RCC_PLLM_DIV_54 /*!< PLLI2S division factor for PLLI2SM output by 54 */ -#define LL_RCC_PLLI2SM_DIV_55 LL_RCC_PLLM_DIV_55 /*!< PLLI2S division factor for PLLI2SM output by 55 */ -#define LL_RCC_PLLI2SM_DIV_56 LL_RCC_PLLM_DIV_56 /*!< PLLI2S division factor for PLLI2SM output by 56 */ -#define LL_RCC_PLLI2SM_DIV_57 LL_RCC_PLLM_DIV_57 /*!< PLLI2S division factor for PLLI2SM output by 57 */ -#define LL_RCC_PLLI2SM_DIV_58 LL_RCC_PLLM_DIV_58 /*!< PLLI2S division factor for PLLI2SM output by 58 */ -#define LL_RCC_PLLI2SM_DIV_59 LL_RCC_PLLM_DIV_59 /*!< PLLI2S division factor for PLLI2SM output by 59 */ -#define LL_RCC_PLLI2SM_DIV_60 LL_RCC_PLLM_DIV_60 /*!< PLLI2S division factor for PLLI2SM output by 60 */ -#define LL_RCC_PLLI2SM_DIV_61 LL_RCC_PLLM_DIV_61 /*!< PLLI2S division factor for PLLI2SM output by 61 */ -#define LL_RCC_PLLI2SM_DIV_62 LL_RCC_PLLM_DIV_62 /*!< PLLI2S division factor for PLLI2SM output by 62 */ -#define LL_RCC_PLLI2SM_DIV_63 LL_RCC_PLLM_DIV_63 /*!< PLLI2S division factor for PLLI2SM output by 63 */ -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ -/** - * @} - */ - -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) -/** @defgroup RCC_LL_EC_PLLI2SQ PLLI2SQ division factor (PLLI2SQ) - * @{ - */ -#define LL_RCC_PLLI2SQ_DIV_2 RCC_PLLI2SCFGR_PLLI2SQ_1 /*!< PLLI2S division factor for PLLI2SQ output by 2 */ -#define LL_RCC_PLLI2SQ_DIV_3 (RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 3 */ -#define LL_RCC_PLLI2SQ_DIV_4 RCC_PLLI2SCFGR_PLLI2SQ_2 /*!< PLLI2S division factor for PLLI2SQ output by 4 */ -#define LL_RCC_PLLI2SQ_DIV_5 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 5 */ -#define LL_RCC_PLLI2SQ_DIV_6 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 6 */ -#define LL_RCC_PLLI2SQ_DIV_7 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 7 */ -#define LL_RCC_PLLI2SQ_DIV_8 RCC_PLLI2SCFGR_PLLI2SQ_3 /*!< PLLI2S division factor for PLLI2SQ output by 8 */ -#define LL_RCC_PLLI2SQ_DIV_9 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 9 */ -#define LL_RCC_PLLI2SQ_DIV_10 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 10 */ -#define LL_RCC_PLLI2SQ_DIV_11 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 11 */ -#define LL_RCC_PLLI2SQ_DIV_12 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2) /*!< PLLI2S division factor for PLLI2SQ output by 12 */ -#define LL_RCC_PLLI2SQ_DIV_13 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 13 */ -#define LL_RCC_PLLI2SQ_DIV_14 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 14 */ -#define LL_RCC_PLLI2SQ_DIV_15 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 15 */ -/** - * @} - */ -#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ - -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) -/** @defgroup RCC_LL_EC_PLLI2SDIVQ PLLI2SDIVQ division factor (PLLI2SDIVQ) - * @{ - */ -#define LL_RCC_PLLI2SDIVQ_DIV_1 0x00000000U /*!< PLLI2S division factor for PLLI2SDIVQ output by 1 */ -#define LL_RCC_PLLI2SDIVQ_DIV_2 RCC_DCKCFGR_PLLI2SDIVQ_0 /*!< PLLI2S division factor for PLLI2SDIVQ output by 2 */ -#define LL_RCC_PLLI2SDIVQ_DIV_3 RCC_DCKCFGR_PLLI2SDIVQ_1 /*!< PLLI2S division factor for PLLI2SDIVQ output by 3 */ -#define LL_RCC_PLLI2SDIVQ_DIV_4 (RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 4 */ -#define LL_RCC_PLLI2SDIVQ_DIV_5 RCC_DCKCFGR_PLLI2SDIVQ_2 /*!< PLLI2S division factor for PLLI2SDIVQ output by 5 */ -#define LL_RCC_PLLI2SDIVQ_DIV_6 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 6 */ -#define LL_RCC_PLLI2SDIVQ_DIV_7 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 7 */ -#define LL_RCC_PLLI2SDIVQ_DIV_8 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 8 */ -#define LL_RCC_PLLI2SDIVQ_DIV_9 RCC_DCKCFGR_PLLI2SDIVQ_3 /*!< PLLI2S division factor for PLLI2SDIVQ output by 9 */ -#define LL_RCC_PLLI2SDIVQ_DIV_10 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 10 */ -#define LL_RCC_PLLI2SDIVQ_DIV_11 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 11 */ -#define LL_RCC_PLLI2SDIVQ_DIV_12 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 12 */ -#define LL_RCC_PLLI2SDIVQ_DIV_13 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 13 */ -#define LL_RCC_PLLI2SDIVQ_DIV_14 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 14 */ -#define LL_RCC_PLLI2SDIVQ_DIV_15 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 15 */ -#define LL_RCC_PLLI2SDIVQ_DIV_16 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 16 */ -#define LL_RCC_PLLI2SDIVQ_DIV_17 RCC_DCKCFGR_PLLI2SDIVQ_4 /*!< PLLI2S division factor for PLLI2SDIVQ output by 17 */ -#define LL_RCC_PLLI2SDIVQ_DIV_18 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 18 */ -#define LL_RCC_PLLI2SDIVQ_DIV_19 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 19 */ -#define LL_RCC_PLLI2SDIVQ_DIV_20 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 20 */ -#define LL_RCC_PLLI2SDIVQ_DIV_21 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 21 */ -#define LL_RCC_PLLI2SDIVQ_DIV_22 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 22 */ -#define LL_RCC_PLLI2SDIVQ_DIV_23 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 23 */ -#define LL_RCC_PLLI2SDIVQ_DIV_24 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 24 */ -#define LL_RCC_PLLI2SDIVQ_DIV_25 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3) /*!< PLLI2S division factor for PLLI2SDIVQ output by 25 */ -#define LL_RCC_PLLI2SDIVQ_DIV_26 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 26 */ -#define LL_RCC_PLLI2SDIVQ_DIV_27 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 27 */ -#define LL_RCC_PLLI2SDIVQ_DIV_28 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 28 */ -#define LL_RCC_PLLI2SDIVQ_DIV_29 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 29 */ -#define LL_RCC_PLLI2SDIVQ_DIV_30 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 30 */ -#define LL_RCC_PLLI2SDIVQ_DIV_31 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 31 */ -#define LL_RCC_PLLI2SDIVQ_DIV_32 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 32 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ - -#if defined(RCC_DCKCFGR_PLLI2SDIVR) -/** @defgroup RCC_LL_EC_PLLI2SDIVR PLLI2SDIVR division factor (PLLI2SDIVR) - * @{ - */ -#define LL_RCC_PLLI2SDIVR_DIV_1 (RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 1 */ -#define LL_RCC_PLLI2SDIVR_DIV_2 (RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 2 */ -#define LL_RCC_PLLI2SDIVR_DIV_3 (RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 3 */ -#define LL_RCC_PLLI2SDIVR_DIV_4 (RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 4 */ -#define LL_RCC_PLLI2SDIVR_DIV_5 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 5 */ -#define LL_RCC_PLLI2SDIVR_DIV_6 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 6 */ -#define LL_RCC_PLLI2SDIVR_DIV_7 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 7 */ -#define LL_RCC_PLLI2SDIVR_DIV_8 (RCC_DCKCFGR_PLLI2SDIVR_3) /*!< PLLI2S division factor for PLLI2SDIVR output by 8 */ -#define LL_RCC_PLLI2SDIVR_DIV_9 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 9 */ -#define LL_RCC_PLLI2SDIVR_DIV_10 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 10 */ -#define LL_RCC_PLLI2SDIVR_DIV_11 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 11 */ -#define LL_RCC_PLLI2SDIVR_DIV_12 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 12 */ -#define LL_RCC_PLLI2SDIVR_DIV_13 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 13 */ -#define LL_RCC_PLLI2SDIVR_DIV_14 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 14 */ -#define LL_RCC_PLLI2SDIVR_DIV_15 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 15 */ -#define LL_RCC_PLLI2SDIVR_DIV_16 (RCC_DCKCFGR_PLLI2SDIVR_4) /*!< PLLI2S division factor for PLLI2SDIVR output by 16 */ -#define LL_RCC_PLLI2SDIVR_DIV_17 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 17 */ -#define LL_RCC_PLLI2SDIVR_DIV_18 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 18 */ -#define LL_RCC_PLLI2SDIVR_DIV_19 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 19 */ -#define LL_RCC_PLLI2SDIVR_DIV_20 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 20 */ -#define LL_RCC_PLLI2SDIVR_DIV_21 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 21 */ -#define LL_RCC_PLLI2SDIVR_DIV_22 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 22 */ -#define LL_RCC_PLLI2SDIVR_DIV_23 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 23 */ -#define LL_RCC_PLLI2SDIVR_DIV_24 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3) /*!< PLLI2S division factor for PLLI2SDIVR output by 24 */ -#define LL_RCC_PLLI2SDIVR_DIV_25 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 25 */ -#define LL_RCC_PLLI2SDIVR_DIV_26 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 26 */ -#define LL_RCC_PLLI2SDIVR_DIV_27 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 27 */ -#define LL_RCC_PLLI2SDIVR_DIV_28 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 28 */ -#define LL_RCC_PLLI2SDIVR_DIV_29 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 29 */ -#define LL_RCC_PLLI2SDIVR_DIV_30 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 30 */ -#define LL_RCC_PLLI2SDIVR_DIV_31 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 31 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLI2SDIVR */ - -/** @defgroup RCC_LL_EC_PLLI2SR PLLI2SR division factor (PLLI2SR) - * @{ - */ -#define LL_RCC_PLLI2SR_DIV_2 RCC_PLLI2SCFGR_PLLI2SR_1 /*!< PLLI2S division factor for PLLI2SR output by 2 */ -#define LL_RCC_PLLI2SR_DIV_3 (RCC_PLLI2SCFGR_PLLI2SR_1 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 3 */ -#define LL_RCC_PLLI2SR_DIV_4 RCC_PLLI2SCFGR_PLLI2SR_2 /*!< PLLI2S division factor for PLLI2SR output by 4 */ -#define LL_RCC_PLLI2SR_DIV_5 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 5 */ -#define LL_RCC_PLLI2SR_DIV_6 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_1) /*!< PLLI2S division factor for PLLI2SR output by 6 */ -#define LL_RCC_PLLI2SR_DIV_7 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_1 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 7 */ -/** - * @} - */ - -#if defined(RCC_PLLI2SCFGR_PLLI2SP) -/** @defgroup RCC_LL_EC_PLLI2SP PLLI2SP division factor (PLLI2SP) - * @{ - */ -#define LL_RCC_PLLI2SP_DIV_2 0x00000000U /*!< PLLI2S division factor for PLLI2SP output by 2 */ -#define LL_RCC_PLLI2SP_DIV_4 RCC_PLLI2SCFGR_PLLI2SP_0 /*!< PLLI2S division factor for PLLI2SP output by 4 */ -#define LL_RCC_PLLI2SP_DIV_6 RCC_PLLI2SCFGR_PLLI2SP_1 /*!< PLLI2S division factor for PLLI2SP output by 6 */ -#define LL_RCC_PLLI2SP_DIV_8 (RCC_PLLI2SCFGR_PLLI2SP_1 | RCC_PLLI2SCFGR_PLLI2SP_0) /*!< PLLI2S division factor for PLLI2SP output by 8 */ -/** - * @} - */ -#endif /* RCC_PLLI2SCFGR_PLLI2SP */ -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** @defgroup RCC_LL_EC_PLLSAIM PLLSAIM division factor (PLLSAIM or PLLM) - * @{ - */ -#if defined(RCC_PLLSAICFGR_PLLSAIM) -#define LL_RCC_PLLSAIM_DIV_2 (RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 2 */ -#define LL_RCC_PLLSAIM_DIV_3 (RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 3 */ -#define LL_RCC_PLLSAIM_DIV_4 (RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 4 */ -#define LL_RCC_PLLSAIM_DIV_5 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 5 */ -#define LL_RCC_PLLSAIM_DIV_6 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 6 */ -#define LL_RCC_PLLSAIM_DIV_7 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 7 */ -#define LL_RCC_PLLSAIM_DIV_8 (RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 8 */ -#define LL_RCC_PLLSAIM_DIV_9 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 9 */ -#define LL_RCC_PLLSAIM_DIV_10 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 10 */ -#define LL_RCC_PLLSAIM_DIV_11 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 11 */ -#define LL_RCC_PLLSAIM_DIV_12 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 12 */ -#define LL_RCC_PLLSAIM_DIV_13 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 13 */ -#define LL_RCC_PLLSAIM_DIV_14 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 14 */ -#define LL_RCC_PLLSAIM_DIV_15 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 15 */ -#define LL_RCC_PLLSAIM_DIV_16 (RCC_PLLSAICFGR_PLLSAIM_4) /*!< PLLSAI division factor for PLLSAIM output by 16 */ -#define LL_RCC_PLLSAIM_DIV_17 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 17 */ -#define LL_RCC_PLLSAIM_DIV_18 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 18 */ -#define LL_RCC_PLLSAIM_DIV_19 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 19 */ -#define LL_RCC_PLLSAIM_DIV_20 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 20 */ -#define LL_RCC_PLLSAIM_DIV_21 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 21 */ -#define LL_RCC_PLLSAIM_DIV_22 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 22 */ -#define LL_RCC_PLLSAIM_DIV_23 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 23 */ -#define LL_RCC_PLLSAIM_DIV_24 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 24 */ -#define LL_RCC_PLLSAIM_DIV_25 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 25 */ -#define LL_RCC_PLLSAIM_DIV_26 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 26 */ -#define LL_RCC_PLLSAIM_DIV_27 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 27 */ -#define LL_RCC_PLLSAIM_DIV_28 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 28 */ -#define LL_RCC_PLLSAIM_DIV_29 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 29 */ -#define LL_RCC_PLLSAIM_DIV_30 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 30 */ -#define LL_RCC_PLLSAIM_DIV_31 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 31 */ -#define LL_RCC_PLLSAIM_DIV_32 (RCC_PLLSAICFGR_PLLSAIM_5) /*!< PLLSAI division factor for PLLSAIM output by 32 */ -#define LL_RCC_PLLSAIM_DIV_33 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 33 */ -#define LL_RCC_PLLSAIM_DIV_34 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 34 */ -#define LL_RCC_PLLSAIM_DIV_35 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 35 */ -#define LL_RCC_PLLSAIM_DIV_36 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 36 */ -#define LL_RCC_PLLSAIM_DIV_37 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 37 */ -#define LL_RCC_PLLSAIM_DIV_38 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 38 */ -#define LL_RCC_PLLSAIM_DIV_39 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 39 */ -#define LL_RCC_PLLSAIM_DIV_40 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 40 */ -#define LL_RCC_PLLSAIM_DIV_41 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 41 */ -#define LL_RCC_PLLSAIM_DIV_42 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 42 */ -#define LL_RCC_PLLSAIM_DIV_43 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 43 */ -#define LL_RCC_PLLSAIM_DIV_44 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 44 */ -#define LL_RCC_PLLSAIM_DIV_45 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 45 */ -#define LL_RCC_PLLSAIM_DIV_46 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 46 */ -#define LL_RCC_PLLSAIM_DIV_47 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 47 */ -#define LL_RCC_PLLSAIM_DIV_48 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4) /*!< PLLSAI division factor for PLLSAIM output by 48 */ -#define LL_RCC_PLLSAIM_DIV_49 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 49 */ -#define LL_RCC_PLLSAIM_DIV_50 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 50 */ -#define LL_RCC_PLLSAIM_DIV_51 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 51 */ -#define LL_RCC_PLLSAIM_DIV_52 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 52 */ -#define LL_RCC_PLLSAIM_DIV_53 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 53 */ -#define LL_RCC_PLLSAIM_DIV_54 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 54 */ -#define LL_RCC_PLLSAIM_DIV_55 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 55 */ -#define LL_RCC_PLLSAIM_DIV_56 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 56 */ -#define LL_RCC_PLLSAIM_DIV_57 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 57 */ -#define LL_RCC_PLLSAIM_DIV_58 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 58 */ -#define LL_RCC_PLLSAIM_DIV_59 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 59 */ -#define LL_RCC_PLLSAIM_DIV_60 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 60 */ -#define LL_RCC_PLLSAIM_DIV_61 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 61 */ -#define LL_RCC_PLLSAIM_DIV_62 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 62 */ -#define LL_RCC_PLLSAIM_DIV_63 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 63 */ -#else -#define LL_RCC_PLLSAIM_DIV_2 LL_RCC_PLLM_DIV_2 /*!< PLLSAI division factor for PLLSAIM output by 2 */ -#define LL_RCC_PLLSAIM_DIV_3 LL_RCC_PLLM_DIV_3 /*!< PLLSAI division factor for PLLSAIM output by 3 */ -#define LL_RCC_PLLSAIM_DIV_4 LL_RCC_PLLM_DIV_4 /*!< PLLSAI division factor for PLLSAIM output by 4 */ -#define LL_RCC_PLLSAIM_DIV_5 LL_RCC_PLLM_DIV_5 /*!< PLLSAI division factor for PLLSAIM output by 5 */ -#define LL_RCC_PLLSAIM_DIV_6 LL_RCC_PLLM_DIV_6 /*!< PLLSAI division factor for PLLSAIM output by 6 */ -#define LL_RCC_PLLSAIM_DIV_7 LL_RCC_PLLM_DIV_7 /*!< PLLSAI division factor for PLLSAIM output by 7 */ -#define LL_RCC_PLLSAIM_DIV_8 LL_RCC_PLLM_DIV_8 /*!< PLLSAI division factor for PLLSAIM output by 8 */ -#define LL_RCC_PLLSAIM_DIV_9 LL_RCC_PLLM_DIV_9 /*!< PLLSAI division factor for PLLSAIM output by 9 */ -#define LL_RCC_PLLSAIM_DIV_10 LL_RCC_PLLM_DIV_10 /*!< PLLSAI division factor for PLLSAIM output by 10 */ -#define LL_RCC_PLLSAIM_DIV_11 LL_RCC_PLLM_DIV_11 /*!< PLLSAI division factor for PLLSAIM output by 11 */ -#define LL_RCC_PLLSAIM_DIV_12 LL_RCC_PLLM_DIV_12 /*!< PLLSAI division factor for PLLSAIM output by 12 */ -#define LL_RCC_PLLSAIM_DIV_13 LL_RCC_PLLM_DIV_13 /*!< PLLSAI division factor for PLLSAIM output by 13 */ -#define LL_RCC_PLLSAIM_DIV_14 LL_RCC_PLLM_DIV_14 /*!< PLLSAI division factor for PLLSAIM output by 14 */ -#define LL_RCC_PLLSAIM_DIV_15 LL_RCC_PLLM_DIV_15 /*!< PLLSAI division factor for PLLSAIM output by 15 */ -#define LL_RCC_PLLSAIM_DIV_16 LL_RCC_PLLM_DIV_16 /*!< PLLSAI division factor for PLLSAIM output by 16 */ -#define LL_RCC_PLLSAIM_DIV_17 LL_RCC_PLLM_DIV_17 /*!< PLLSAI division factor for PLLSAIM output by 17 */ -#define LL_RCC_PLLSAIM_DIV_18 LL_RCC_PLLM_DIV_18 /*!< PLLSAI division factor for PLLSAIM output by 18 */ -#define LL_RCC_PLLSAIM_DIV_19 LL_RCC_PLLM_DIV_19 /*!< PLLSAI division factor for PLLSAIM output by 19 */ -#define LL_RCC_PLLSAIM_DIV_20 LL_RCC_PLLM_DIV_20 /*!< PLLSAI division factor for PLLSAIM output by 20 */ -#define LL_RCC_PLLSAIM_DIV_21 LL_RCC_PLLM_DIV_21 /*!< PLLSAI division factor for PLLSAIM output by 21 */ -#define LL_RCC_PLLSAIM_DIV_22 LL_RCC_PLLM_DIV_22 /*!< PLLSAI division factor for PLLSAIM output by 22 */ -#define LL_RCC_PLLSAIM_DIV_23 LL_RCC_PLLM_DIV_23 /*!< PLLSAI division factor for PLLSAIM output by 23 */ -#define LL_RCC_PLLSAIM_DIV_24 LL_RCC_PLLM_DIV_24 /*!< PLLSAI division factor for PLLSAIM output by 24 */ -#define LL_RCC_PLLSAIM_DIV_25 LL_RCC_PLLM_DIV_25 /*!< PLLSAI division factor for PLLSAIM output by 25 */ -#define LL_RCC_PLLSAIM_DIV_26 LL_RCC_PLLM_DIV_26 /*!< PLLSAI division factor for PLLSAIM output by 26 */ -#define LL_RCC_PLLSAIM_DIV_27 LL_RCC_PLLM_DIV_27 /*!< PLLSAI division factor for PLLSAIM output by 27 */ -#define LL_RCC_PLLSAIM_DIV_28 LL_RCC_PLLM_DIV_28 /*!< PLLSAI division factor for PLLSAIM output by 28 */ -#define LL_RCC_PLLSAIM_DIV_29 LL_RCC_PLLM_DIV_29 /*!< PLLSAI division factor for PLLSAIM output by 29 */ -#define LL_RCC_PLLSAIM_DIV_30 LL_RCC_PLLM_DIV_30 /*!< PLLSAI division factor for PLLSAIM output by 30 */ -#define LL_RCC_PLLSAIM_DIV_31 LL_RCC_PLLM_DIV_31 /*!< PLLSAI division factor for PLLSAIM output by 31 */ -#define LL_RCC_PLLSAIM_DIV_32 LL_RCC_PLLM_DIV_32 /*!< PLLSAI division factor for PLLSAIM output by 32 */ -#define LL_RCC_PLLSAIM_DIV_33 LL_RCC_PLLM_DIV_33 /*!< PLLSAI division factor for PLLSAIM output by 33 */ -#define LL_RCC_PLLSAIM_DIV_34 LL_RCC_PLLM_DIV_34 /*!< PLLSAI division factor for PLLSAIM output by 34 */ -#define LL_RCC_PLLSAIM_DIV_35 LL_RCC_PLLM_DIV_35 /*!< PLLSAI division factor for PLLSAIM output by 35 */ -#define LL_RCC_PLLSAIM_DIV_36 LL_RCC_PLLM_DIV_36 /*!< PLLSAI division factor for PLLSAIM output by 36 */ -#define LL_RCC_PLLSAIM_DIV_37 LL_RCC_PLLM_DIV_37 /*!< PLLSAI division factor for PLLSAIM output by 37 */ -#define LL_RCC_PLLSAIM_DIV_38 LL_RCC_PLLM_DIV_38 /*!< PLLSAI division factor for PLLSAIM output by 38 */ -#define LL_RCC_PLLSAIM_DIV_39 LL_RCC_PLLM_DIV_39 /*!< PLLSAI division factor for PLLSAIM output by 39 */ -#define LL_RCC_PLLSAIM_DIV_40 LL_RCC_PLLM_DIV_40 /*!< PLLSAI division factor for PLLSAIM output by 40 */ -#define LL_RCC_PLLSAIM_DIV_41 LL_RCC_PLLM_DIV_41 /*!< PLLSAI division factor for PLLSAIM output by 41 */ -#define LL_RCC_PLLSAIM_DIV_42 LL_RCC_PLLM_DIV_42 /*!< PLLSAI division factor for PLLSAIM output by 42 */ -#define LL_RCC_PLLSAIM_DIV_43 LL_RCC_PLLM_DIV_43 /*!< PLLSAI division factor for PLLSAIM output by 43 */ -#define LL_RCC_PLLSAIM_DIV_44 LL_RCC_PLLM_DIV_44 /*!< PLLSAI division factor for PLLSAIM output by 44 */ -#define LL_RCC_PLLSAIM_DIV_45 LL_RCC_PLLM_DIV_45 /*!< PLLSAI division factor for PLLSAIM output by 45 */ -#define LL_RCC_PLLSAIM_DIV_46 LL_RCC_PLLM_DIV_46 /*!< PLLSAI division factor for PLLSAIM output by 46 */ -#define LL_RCC_PLLSAIM_DIV_47 LL_RCC_PLLM_DIV_47 /*!< PLLSAI division factor for PLLSAIM output by 47 */ -#define LL_RCC_PLLSAIM_DIV_48 LL_RCC_PLLM_DIV_48 /*!< PLLSAI division factor for PLLSAIM output by 48 */ -#define LL_RCC_PLLSAIM_DIV_49 LL_RCC_PLLM_DIV_49 /*!< PLLSAI division factor for PLLSAIM output by 49 */ -#define LL_RCC_PLLSAIM_DIV_50 LL_RCC_PLLM_DIV_50 /*!< PLLSAI division factor for PLLSAIM output by 50 */ -#define LL_RCC_PLLSAIM_DIV_51 LL_RCC_PLLM_DIV_51 /*!< PLLSAI division factor for PLLSAIM output by 51 */ -#define LL_RCC_PLLSAIM_DIV_52 LL_RCC_PLLM_DIV_52 /*!< PLLSAI division factor for PLLSAIM output by 52 */ -#define LL_RCC_PLLSAIM_DIV_53 LL_RCC_PLLM_DIV_53 /*!< PLLSAI division factor for PLLSAIM output by 53 */ -#define LL_RCC_PLLSAIM_DIV_54 LL_RCC_PLLM_DIV_54 /*!< PLLSAI division factor for PLLSAIM output by 54 */ -#define LL_RCC_PLLSAIM_DIV_55 LL_RCC_PLLM_DIV_55 /*!< PLLSAI division factor for PLLSAIM output by 55 */ -#define LL_RCC_PLLSAIM_DIV_56 LL_RCC_PLLM_DIV_56 /*!< PLLSAI division factor for PLLSAIM output by 56 */ -#define LL_RCC_PLLSAIM_DIV_57 LL_RCC_PLLM_DIV_57 /*!< PLLSAI division factor for PLLSAIM output by 57 */ -#define LL_RCC_PLLSAIM_DIV_58 LL_RCC_PLLM_DIV_58 /*!< PLLSAI division factor for PLLSAIM output by 58 */ -#define LL_RCC_PLLSAIM_DIV_59 LL_RCC_PLLM_DIV_59 /*!< PLLSAI division factor for PLLSAIM output by 59 */ -#define LL_RCC_PLLSAIM_DIV_60 LL_RCC_PLLM_DIV_60 /*!< PLLSAI division factor for PLLSAIM output by 60 */ -#define LL_RCC_PLLSAIM_DIV_61 LL_RCC_PLLM_DIV_61 /*!< PLLSAI division factor for PLLSAIM output by 61 */ -#define LL_RCC_PLLSAIM_DIV_62 LL_RCC_PLLM_DIV_62 /*!< PLLSAI division factor for PLLSAIM output by 62 */ -#define LL_RCC_PLLSAIM_DIV_63 LL_RCC_PLLM_DIV_63 /*!< PLLSAI division factor for PLLSAIM output by 63 */ -#endif /* RCC_PLLSAICFGR_PLLSAIM */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_PLLSAIQ PLLSAIQ division factor (PLLSAIQ) - * @{ - */ -#define LL_RCC_PLLSAIQ_DIV_2 RCC_PLLSAICFGR_PLLSAIQ_1 /*!< PLLSAI division factor for PLLSAIQ output by 2 */ -#define LL_RCC_PLLSAIQ_DIV_3 (RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 3 */ -#define LL_RCC_PLLSAIQ_DIV_4 RCC_PLLSAICFGR_PLLSAIQ_2 /*!< PLLSAI division factor for PLLSAIQ output by 4 */ -#define LL_RCC_PLLSAIQ_DIV_5 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 5 */ -#define LL_RCC_PLLSAIQ_DIV_6 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 6 */ -#define LL_RCC_PLLSAIQ_DIV_7 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 7 */ -#define LL_RCC_PLLSAIQ_DIV_8 RCC_PLLSAICFGR_PLLSAIQ_3 /*!< PLLSAI division factor for PLLSAIQ output by 8 */ -#define LL_RCC_PLLSAIQ_DIV_9 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 9 */ -#define LL_RCC_PLLSAIQ_DIV_10 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 10 */ -#define LL_RCC_PLLSAIQ_DIV_11 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 11 */ -#define LL_RCC_PLLSAIQ_DIV_12 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2) /*!< PLLSAI division factor for PLLSAIQ output by 12 */ -#define LL_RCC_PLLSAIQ_DIV_13 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 13 */ -#define LL_RCC_PLLSAIQ_DIV_14 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 14 */ -#define LL_RCC_PLLSAIQ_DIV_15 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 15 */ -/** - * @} - */ - -#if defined(RCC_DCKCFGR_PLLSAIDIVQ) -/** @defgroup RCC_LL_EC_PLLSAIDIVQ PLLSAIDIVQ division factor (PLLSAIDIVQ) - * @{ - */ -#define LL_RCC_PLLSAIDIVQ_DIV_1 0x00000000U /*!< PLLSAI division factor for PLLSAIDIVQ output by 1 */ -#define LL_RCC_PLLSAIDIVQ_DIV_2 RCC_DCKCFGR_PLLSAIDIVQ_0 /*!< PLLSAI division factor for PLLSAIDIVQ output by 2 */ -#define LL_RCC_PLLSAIDIVQ_DIV_3 RCC_DCKCFGR_PLLSAIDIVQ_1 /*!< PLLSAI division factor for PLLSAIDIVQ output by 3 */ -#define LL_RCC_PLLSAIDIVQ_DIV_4 (RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 4 */ -#define LL_RCC_PLLSAIDIVQ_DIV_5 RCC_DCKCFGR_PLLSAIDIVQ_2 /*!< PLLSAI division factor for PLLSAIDIVQ output by 5 */ -#define LL_RCC_PLLSAIDIVQ_DIV_6 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 6 */ -#define LL_RCC_PLLSAIDIVQ_DIV_7 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 7 */ -#define LL_RCC_PLLSAIDIVQ_DIV_8 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 8 */ -#define LL_RCC_PLLSAIDIVQ_DIV_9 RCC_DCKCFGR_PLLSAIDIVQ_3 /*!< PLLSAI division factor for PLLSAIDIVQ output by 9 */ -#define LL_RCC_PLLSAIDIVQ_DIV_10 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 10 */ -#define LL_RCC_PLLSAIDIVQ_DIV_11 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 11 */ -#define LL_RCC_PLLSAIDIVQ_DIV_12 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 12 */ -#define LL_RCC_PLLSAIDIVQ_DIV_13 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 13 */ -#define LL_RCC_PLLSAIDIVQ_DIV_14 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 14 */ -#define LL_RCC_PLLSAIDIVQ_DIV_15 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 15 */ -#define LL_RCC_PLLSAIDIVQ_DIV_16 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 16 */ -#define LL_RCC_PLLSAIDIVQ_DIV_17 RCC_DCKCFGR_PLLSAIDIVQ_4 /*!< PLLSAI division factor for PLLSAIDIVQ output by 17 */ -#define LL_RCC_PLLSAIDIVQ_DIV_18 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 18 */ -#define LL_RCC_PLLSAIDIVQ_DIV_19 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 19 */ -#define LL_RCC_PLLSAIDIVQ_DIV_20 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 20 */ -#define LL_RCC_PLLSAIDIVQ_DIV_21 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 21 */ -#define LL_RCC_PLLSAIDIVQ_DIV_22 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 22 */ -#define LL_RCC_PLLSAIDIVQ_DIV_23 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 23 */ -#define LL_RCC_PLLSAIDIVQ_DIV_24 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 24 */ -#define LL_RCC_PLLSAIDIVQ_DIV_25 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3) /*!< PLLSAI division factor for PLLSAIDIVQ output by 25 */ -#define LL_RCC_PLLSAIDIVQ_DIV_26 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 26 */ -#define LL_RCC_PLLSAIDIVQ_DIV_27 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 27 */ -#define LL_RCC_PLLSAIDIVQ_DIV_28 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 28 */ -#define LL_RCC_PLLSAIDIVQ_DIV_29 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 29 */ -#define LL_RCC_PLLSAIDIVQ_DIV_30 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 30 */ -#define LL_RCC_PLLSAIDIVQ_DIV_31 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 31 */ -#define LL_RCC_PLLSAIDIVQ_DIV_32 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 32 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLSAIDIVQ */ - -#if defined(RCC_PLLSAICFGR_PLLSAIR) -/** @defgroup RCC_LL_EC_PLLSAIR PLLSAIR division factor (PLLSAIR) - * @{ - */ -#define LL_RCC_PLLSAIR_DIV_2 RCC_PLLSAICFGR_PLLSAIR_1 /*!< PLLSAI division factor for PLLSAIR output by 2 */ -#define LL_RCC_PLLSAIR_DIV_3 (RCC_PLLSAICFGR_PLLSAIR_1 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 3 */ -#define LL_RCC_PLLSAIR_DIV_4 RCC_PLLSAICFGR_PLLSAIR_2 /*!< PLLSAI division factor for PLLSAIR output by 4 */ -#define LL_RCC_PLLSAIR_DIV_5 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 5 */ -#define LL_RCC_PLLSAIR_DIV_6 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_1) /*!< PLLSAI division factor for PLLSAIR output by 6 */ -#define LL_RCC_PLLSAIR_DIV_7 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_1 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 7 */ -/** - * @} - */ -#endif /* RCC_PLLSAICFGR_PLLSAIR */ - -#if defined(RCC_DCKCFGR_PLLSAIDIVR) -/** @defgroup RCC_LL_EC_PLLSAIDIVR PLLSAIDIVR division factor (PLLSAIDIVR) - * @{ - */ -#define LL_RCC_PLLSAIDIVR_DIV_2 0x00000000U /*!< PLLSAI division factor for PLLSAIDIVR output by 2 */ -#define LL_RCC_PLLSAIDIVR_DIV_4 RCC_DCKCFGR_PLLSAIDIVR_0 /*!< PLLSAI division factor for PLLSAIDIVR output by 4 */ -#define LL_RCC_PLLSAIDIVR_DIV_8 RCC_DCKCFGR_PLLSAIDIVR_1 /*!< PLLSAI division factor for PLLSAIDIVR output by 8 */ -#define LL_RCC_PLLSAIDIVR_DIV_16 (RCC_DCKCFGR_PLLSAIDIVR_1 | RCC_DCKCFGR_PLLSAIDIVR_0) /*!< PLLSAI division factor for PLLSAIDIVR output by 16 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLSAIDIVR */ - -#if defined(RCC_PLLSAICFGR_PLLSAIP) -/** @defgroup RCC_LL_EC_PLLSAIP PLLSAIP division factor (PLLSAIP) - * @{ - */ -#define LL_RCC_PLLSAIP_DIV_2 0x00000000U /*!< PLLSAI division factor for PLLSAIP output by 2 */ -#define LL_RCC_PLLSAIP_DIV_4 RCC_PLLSAICFGR_PLLSAIP_0 /*!< PLLSAI division factor for PLLSAIP output by 4 */ -#define LL_RCC_PLLSAIP_DIV_6 RCC_PLLSAICFGR_PLLSAIP_1 /*!< PLLSAI division factor for PLLSAIP output by 6 */ -#define LL_RCC_PLLSAIP_DIV_8 (RCC_PLLSAICFGR_PLLSAIP_1 | RCC_PLLSAICFGR_PLLSAIP_0) /*!< PLLSAI division factor for PLLSAIP output by 8 */ -/** - * @} - */ -#endif /* RCC_PLLSAICFGR_PLLSAIP */ -#endif /* RCC_PLLSAI_SUPPORT */ -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RCC_LL_Exported_Macros RCC Exported Macros - * @{ - */ - -/** @defgroup RCC_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in RCC register - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_RCC_WriteReg(__REG__, __VALUE__) WRITE_REG(RCC->__REG__, (__VALUE__)) - -/** - * @brief Read a value in RCC register - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_RCC_ReadReg(__REG__) READ_REG(RCC->__REG__) -/** - * @} - */ - -/** @defgroup RCC_LL_EM_CALC_FREQ Calculate frequencies - * @{ - */ - -/** - * @brief Helper macro to calculate the PLLCLK frequency on system domain - * @note ex: @ref __LL_RCC_CALC_PLLCLK_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetP ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLP__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLP_DIV_2 - * @arg @ref LL_RCC_PLLP_DIV_4 - * @arg @ref LL_RCC_PLLP_DIV_6 - * @arg @ref LL_RCC_PLLP_DIV_8 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLP__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((((__PLLP__) >> RCC_PLLCFGR_PLLP_Pos ) + 1U) * 2U)) - -#if defined(RCC_PLLR_SYSCLK_SUPPORT) -/** - * @brief Helper macro to calculate the PLLRCLK frequency on system domain - * @note ex: @ref __LL_RCC_CALC_PLLRCLK_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLRCLK_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) - -#endif /* RCC_PLLR_SYSCLK_SUPPORT */ - -/** - * @brief Helper macro to calculate the PLLCLK frequency used on 48M domain - * @note ex: @ref __LL_RCC_CALC_PLLCLK_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetQ ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLQ__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLQ_DIV_2 - * @arg @ref LL_RCC_PLLQ_DIV_3 - * @arg @ref LL_RCC_PLLQ_DIV_4 - * @arg @ref LL_RCC_PLLQ_DIV_5 - * @arg @ref LL_RCC_PLLQ_DIV_6 - * @arg @ref LL_RCC_PLLQ_DIV_7 - * @arg @ref LL_RCC_PLLQ_DIV_8 - * @arg @ref LL_RCC_PLLQ_DIV_9 - * @arg @ref LL_RCC_PLLQ_DIV_10 - * @arg @ref LL_RCC_PLLQ_DIV_11 - * @arg @ref LL_RCC_PLLQ_DIV_12 - * @arg @ref LL_RCC_PLLQ_DIV_13 - * @arg @ref LL_RCC_PLLQ_DIV_14 - * @arg @ref LL_RCC_PLLQ_DIV_15 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLQ__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLQ__) >> RCC_PLLCFGR_PLLQ_Pos )) - -#if defined(DSI) -/** - * @brief Helper macro to calculate the PLLCLK frequency used on DSI - * @note ex: @ref __LL_RCC_CALC_PLLCLK_DSI_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_DSI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) -#endif /* DSI */ - -#if defined(RCC_PLLR_I2S_CLKSOURCE_SUPPORT) -/** - * @brief Helper macro to calculate the PLLCLK frequency used on I2S - * @note ex: @ref __LL_RCC_CALC_PLLCLK_I2S_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_I2S_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) -#endif /* RCC_PLLR_I2S_CLKSOURCE_SUPPORT */ - -#if defined(SPDIFRX) -/** - * @brief Helper macro to calculate the PLLCLK frequency used on SPDIFRX - * @note ex: @ref __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) -#endif /* SPDIFRX */ - -#if defined(RCC_PLLCFGR_PLLR) -#if defined(SAI1) -/** - * @brief Helper macro to calculate the PLLCLK frequency used on SAI - * @note ex: @ref __LL_RCC_CALC_PLLCLK_SAI_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR (), @ref LL_RCC_PLL_GetDIVR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @param __PLLDIVR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLDIVR_DIV_1 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_2 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_3 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_4 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_5 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_6 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_7 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_8 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_9 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_10 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_11 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_12 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_13 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_14 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_15 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_16 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_17 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_18 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_19 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_20 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_21 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_22 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_23 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_24 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_25 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_26 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_27 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_28 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_29 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_30 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_31 (*) - * - * (*) value not defined in all devices. - * @retval PLL clock frequency (in Hz) - */ -#if defined(RCC_DCKCFGR_PLLDIVR) -#define __LL_RCC_CALC_PLLCLK_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__, __PLLDIVR__) (((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) / ((__PLLDIVR__) >> RCC_DCKCFGR_PLLDIVR_Pos )) -#else -#define __LL_RCC_CALC_PLLCLK_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) -#endif /* RCC_DCKCFGR_PLLDIVR */ -#endif /* SAI1 */ -#endif /* RCC_PLLCFGR_PLLR */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Helper macro to calculate the PLLSAI frequency used for SAI domain - * @note ex: @ref __LL_RCC_CALC_PLLSAI_SAI_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), - * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetQ (), @ref LL_RCC_PLLSAI_GetDIVQ ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param __PLLSAIN__ Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLSAIQ__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIQ_DIV_15 - * @param __PLLSAIDIVQ__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 - * @retval PLLSAI clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLSAI_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIQ__, __PLLSAIDIVQ__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ - (((__PLLSAIQ__) >> RCC_PLLSAICFGR_PLLSAIQ_Pos) * (((__PLLSAIDIVQ__) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos) + 1U))) - -#if defined(RCC_PLLSAICFGR_PLLSAIP) -/** - * @brief Helper macro to calculate the PLLSAI frequency used on 48Mhz domain - * @note ex: @ref __LL_RCC_CALC_PLLSAI_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), - * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetP ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param __PLLSAIN__ Between 50 and 432 - * @param __PLLSAIP__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIP_DIV_2 - * @arg @ref LL_RCC_PLLSAIP_DIV_4 - * @arg @ref LL_RCC_PLLSAIP_DIV_6 - * @arg @ref LL_RCC_PLLSAIP_DIV_8 - * @retval PLLSAI clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLSAI_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIP__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ - ((((__PLLSAIP__) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) * 2U)) -#endif /* RCC_PLLSAICFGR_PLLSAIP */ - -#if defined(LTDC) -/** - * @brief Helper macro to calculate the PLLSAI frequency used for LTDC domain - * @note ex: @ref __LL_RCC_CALC_PLLSAI_LTDC_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), - * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetR (), @ref LL_RCC_PLLSAI_GetDIVR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param __PLLSAIN__ Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLSAIR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIR_DIV_2 - * @arg @ref LL_RCC_PLLSAIR_DIV_3 - * @arg @ref LL_RCC_PLLSAIR_DIV_4 - * @arg @ref LL_RCC_PLLSAIR_DIV_5 - * @arg @ref LL_RCC_PLLSAIR_DIV_6 - * @arg @ref LL_RCC_PLLSAIR_DIV_7 - * @param __PLLSAIDIVR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 - * @retval PLLSAI clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLSAI_LTDC_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIR__, __PLLSAIDIVR__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ - (((__PLLSAIR__) >> RCC_PLLSAICFGR_PLLSAIR_Pos) * (aRCC_PLLSAIDIVRPrescTable[(__PLLSAIDIVR__) >> RCC_DCKCFGR_PLLSAIDIVR_Pos]))) -#endif /* LTDC */ -#endif /* RCC_PLLSAI_SUPPORT */ - -#if defined(RCC_PLLI2S_SUPPORT) -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) || defined(RCC_DCKCFGR_PLLI2SDIVR) -/** - * @brief Helper macro to calculate the PLLI2S frequency used for SAI domain - * @note ex: @ref __LL_RCC_CALC_PLLI2S_SAI_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), - * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetQ (), @ref LL_RCC_PLLI2S_GetDIVQ ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param __PLLI2SN__ Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLI2SQ_R__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_7 (*) - * - * (*) value not defined in all devices. - * @param __PLLI2SDIVQ_R__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 (*) - * - * (*) value not defined in all devices. - * @retval PLLI2S clock frequency (in Hz) - */ -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) -#define __LL_RCC_CALC_PLLI2S_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ_R__, __PLLI2SDIVQ_R__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - (((__PLLI2SQ_R__) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos) * (((__PLLI2SDIVQ_R__) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos) + 1U))) -#else -#define __LL_RCC_CALC_PLLI2S_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ_R__, __PLLI2SDIVQ_R__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - (((__PLLI2SQ_R__) >> RCC_PLLI2SCFGR_PLLI2SR_Pos) * ((__PLLI2SDIVQ_R__) >> RCC_DCKCFGR_PLLI2SDIVR_Pos))) - -#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ -#endif /* RCC_DCKCFGR_PLLI2SDIVQ || RCC_DCKCFGR_PLLI2SDIVR */ - -#if defined(SPDIFRX) -/** - * @brief Helper macro to calculate the PLLI2S frequency used on SPDIFRX domain - * @note ex: @ref __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), - * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetP ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param __PLLI2SN__ Between 50 and 432 - * @param __PLLI2SP__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SP_DIV_2 - * @arg @ref LL_RCC_PLLI2SP_DIV_4 - * @arg @ref LL_RCC_PLLI2SP_DIV_6 - * @arg @ref LL_RCC_PLLI2SP_DIV_8 - * @retval PLLI2S clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SP__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - ((((__PLLI2SP__) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) * 2U)) - -#endif /* SPDIFRX */ - -/** - * @brief Helper macro to calculate the PLLI2S frequency used for I2S domain - * @note ex: @ref __LL_RCC_CALC_PLLI2S_I2S_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), - * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param __PLLI2SN__ Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLI2SR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SR_DIV_2 - * @arg @ref LL_RCC_PLLI2SR_DIV_3 - * @arg @ref LL_RCC_PLLI2SR_DIV_4 - * @arg @ref LL_RCC_PLLI2SR_DIV_5 - * @arg @ref LL_RCC_PLLI2SR_DIV_6 - * @arg @ref LL_RCC_PLLI2SR_DIV_7 - * @retval PLLI2S clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLI2S_I2S_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SR__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - ((__PLLI2SR__) >> RCC_PLLI2SCFGR_PLLI2SR_Pos)) - -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -/** - * @brief Helper macro to calculate the PLLI2S frequency used for 48Mhz domain - * @note ex: @ref __LL_RCC_CALC_PLLI2S_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), - * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetQ ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param __PLLI2SN__ Between 50 and 432 - * @param __PLLI2SQ__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 - * @retval PLLI2S clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLI2S_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - ((__PLLI2SQ__) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos)) - -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ -#endif /* RCC_PLLI2S_SUPPORT */ - -/** - * @brief Helper macro to calculate the HCLK frequency - * @param __SYSCLKFREQ__ SYSCLK frequency (based on HSE/HSI/PLLCLK) - * @param __AHBPRESCALER__ This parameter can be one of the following values: - * @arg @ref LL_RCC_SYSCLK_DIV_1 - * @arg @ref LL_RCC_SYSCLK_DIV_2 - * @arg @ref LL_RCC_SYSCLK_DIV_4 - * @arg @ref LL_RCC_SYSCLK_DIV_8 - * @arg @ref LL_RCC_SYSCLK_DIV_16 - * @arg @ref LL_RCC_SYSCLK_DIV_64 - * @arg @ref LL_RCC_SYSCLK_DIV_128 - * @arg @ref LL_RCC_SYSCLK_DIV_256 - * @arg @ref LL_RCC_SYSCLK_DIV_512 - * @retval HCLK clock frequency (in Hz) - */ -#define __LL_RCC_CALC_HCLK_FREQ(__SYSCLKFREQ__, __AHBPRESCALER__) ((__SYSCLKFREQ__) >> AHBPrescTable[((__AHBPRESCALER__) &\ - RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]) - -/** - * @brief Helper macro to calculate the PCLK1 frequency (ABP1) - * @param __HCLKFREQ__ HCLK frequency - * @param __APB1PRESCALER__ This parameter can be one of the following values: - * @arg @ref LL_RCC_APB1_DIV_1 - * @arg @ref LL_RCC_APB1_DIV_2 - * @arg @ref LL_RCC_APB1_DIV_4 - * @arg @ref LL_RCC_APB1_DIV_8 - * @arg @ref LL_RCC_APB1_DIV_16 - * @retval PCLK1 clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PCLK1_FREQ(__HCLKFREQ__, __APB1PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB1PRESCALER__) >> RCC_CFGR_PPRE1_Pos]) - -/** - * @brief Helper macro to calculate the PCLK2 frequency (ABP2) - * @param __HCLKFREQ__ HCLK frequency - * @param __APB2PRESCALER__ This parameter can be one of the following values: - * @arg @ref LL_RCC_APB2_DIV_1 - * @arg @ref LL_RCC_APB2_DIV_2 - * @arg @ref LL_RCC_APB2_DIV_4 - * @arg @ref LL_RCC_APB2_DIV_8 - * @arg @ref LL_RCC_APB2_DIV_16 - * @retval PCLK2 clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PCLK2_FREQ(__HCLKFREQ__, __APB2PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB2PRESCALER__) >> RCC_CFGR_PPRE2_Pos]) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup RCC_LL_Exported_Functions RCC Exported Functions - * @{ - */ - -/** @defgroup RCC_LL_EF_HSE HSE - * @{ - */ - -/** - * @brief Enable the Clock Security System. - * @rmtoll CR CSSON LL_RCC_HSE_EnableCSS - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_EnableCSS(void) -{ - SET_BIT(RCC->CR, RCC_CR_CSSON); -} - -/** - * @brief Enable HSE external oscillator (HSE Bypass) - * @rmtoll CR HSEBYP LL_RCC_HSE_EnableBypass - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_EnableBypass(void) -{ - SET_BIT(RCC->CR, RCC_CR_HSEBYP); -} - -/** - * @brief Disable HSE external oscillator (HSE Bypass) - * @rmtoll CR HSEBYP LL_RCC_HSE_DisableBypass - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_DisableBypass(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); -} - -/** - * @brief Enable HSE crystal oscillator (HSE ON) - * @rmtoll CR HSEON LL_RCC_HSE_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_HSEON); -} - -/** - * @brief Disable HSE crystal oscillator (HSE ON) - * @rmtoll CR HSEON LL_RCC_HSE_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON); -} - -/** - * @brief Check if HSE oscillator Ready - * @rmtoll CR HSERDY LL_RCC_HSE_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_HSE_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_HSERDY) == (RCC_CR_HSERDY)); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_HSI HSI - * @{ - */ - -/** - * @brief Enable HSI oscillator - * @rmtoll CR HSION LL_RCC_HSI_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSI_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_HSION); -} - -/** - * @brief Disable HSI oscillator - * @rmtoll CR HSION LL_RCC_HSI_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSI_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_HSION); -} - -/** - * @brief Check if HSI clock is ready - * @rmtoll CR HSIRDY LL_RCC_HSI_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_HSI_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == (RCC_CR_HSIRDY)); -} - -/** - * @brief Get HSI Calibration value - * @note When HSITRIM is written, HSICAL is updated with the sum of - * HSITRIM and the factory trim value - * @rmtoll CR HSICAL LL_RCC_HSI_GetCalibration - * @retval Between Min_Data = 0x00 and Max_Data = 0xFF - */ -__STATIC_INLINE uint32_t LL_RCC_HSI_GetCalibration(void) -{ - return (uint32_t)(READ_BIT(RCC->CR, RCC_CR_HSICAL) >> RCC_CR_HSICAL_Pos); -} - -/** - * @brief Set HSI Calibration trimming - * @note user-programmable trimming value that is added to the HSICAL - * @note Default value is 16, which, when added to the HSICAL value, - * should trim the HSI to 16 MHz +/- 1 % - * @rmtoll CR HSITRIM LL_RCC_HSI_SetCalibTrimming - * @param Value Between Min_Data = 0 and Max_Data = 31 - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSI_SetCalibTrimming(uint32_t Value) -{ - MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, Value << RCC_CR_HSITRIM_Pos); -} - -/** - * @brief Get HSI Calibration trimming - * @rmtoll CR HSITRIM LL_RCC_HSI_GetCalibTrimming - * @retval Between Min_Data = 0 and Max_Data = 31 - */ -__STATIC_INLINE uint32_t LL_RCC_HSI_GetCalibTrimming(void) -{ - return (uint32_t)(READ_BIT(RCC->CR, RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_LSE LSE - * @{ - */ - -/** - * @brief Enable Low Speed External (LSE) crystal. - * @rmtoll BDCR LSEON LL_RCC_LSE_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_Enable(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); -} - -/** - * @brief Disable Low Speed External (LSE) crystal. - * @rmtoll BDCR LSEON LL_RCC_LSE_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_Disable(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); -} - -/** - * @brief Enable external clock source (LSE bypass). - * @rmtoll BDCR LSEBYP LL_RCC_LSE_EnableBypass - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_EnableBypass(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); -} - -/** - * @brief Disable external clock source (LSE bypass). - * @rmtoll BDCR LSEBYP LL_RCC_LSE_DisableBypass - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_DisableBypass(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); -} - -/** - * @brief Check if LSE oscillator Ready - * @rmtoll BDCR LSERDY LL_RCC_LSE_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_LSE_IsReady(void) -{ - return (READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == (RCC_BDCR_LSERDY)); -} - -#if defined(RCC_BDCR_LSEMOD) -/** - * @brief Enable LSE high drive mode. - * @note LSE high drive mode can be enabled only when the LSE clock is disabled - * @rmtoll BDCR LSEMOD LL_RCC_LSE_EnableHighDriveMode - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_EnableHighDriveMode(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); -} - -/** - * @brief Disable LSE high drive mode. - * @note LSE high drive mode can be disabled only when the LSE clock is disabled - * @rmtoll BDCR LSEMOD LL_RCC_LSE_DisableHighDriveMode - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_DisableHighDriveMode(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); -} -#endif /* RCC_BDCR_LSEMOD */ - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_LSI LSI - * @{ - */ - -/** - * @brief Enable LSI Oscillator - * @rmtoll CSR LSION LL_RCC_LSI_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSI_Enable(void) -{ - SET_BIT(RCC->CSR, RCC_CSR_LSION); -} - -/** - * @brief Disable LSI Oscillator - * @rmtoll CSR LSION LL_RCC_LSI_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSI_Disable(void) -{ - CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); -} - -/** - * @brief Check if LSI is Ready - * @rmtoll CSR LSIRDY LL_RCC_LSI_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_LSI_IsReady(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == (RCC_CSR_LSIRDY)); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_System System - * @{ - */ - -/** - * @brief Configure the system clock source - * @rmtoll CFGR SW LL_RCC_SetSysClkSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_SYS_CLKSOURCE_HSI - * @arg @ref LL_RCC_SYS_CLKSOURCE_HSE - * @arg @ref LL_RCC_SYS_CLKSOURCE_PLL - * @arg @ref LL_RCC_SYS_CLKSOURCE_PLLR (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetSysClkSource(uint32_t Source) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, Source); -} - -/** - * @brief Get the system clock source - * @rmtoll CFGR SWS LL_RCC_GetSysClkSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSI - * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSE - * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_PLL - * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_PLLR (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetSysClkSource(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_SWS)); -} - -/** - * @brief Set AHB prescaler - * @rmtoll CFGR HPRE LL_RCC_SetAHBPrescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_SYSCLK_DIV_1 - * @arg @ref LL_RCC_SYSCLK_DIV_2 - * @arg @ref LL_RCC_SYSCLK_DIV_4 - * @arg @ref LL_RCC_SYSCLK_DIV_8 - * @arg @ref LL_RCC_SYSCLK_DIV_16 - * @arg @ref LL_RCC_SYSCLK_DIV_64 - * @arg @ref LL_RCC_SYSCLK_DIV_128 - * @arg @ref LL_RCC_SYSCLK_DIV_256 - * @arg @ref LL_RCC_SYSCLK_DIV_512 - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetAHBPrescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, Prescaler); -} - -/** - * @brief Set APB1 prescaler - * @rmtoll CFGR PPRE1 LL_RCC_SetAPB1Prescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_APB1_DIV_1 - * @arg @ref LL_RCC_APB1_DIV_2 - * @arg @ref LL_RCC_APB1_DIV_4 - * @arg @ref LL_RCC_APB1_DIV_8 - * @arg @ref LL_RCC_APB1_DIV_16 - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetAPB1Prescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, Prescaler); -} - -/** - * @brief Set APB2 prescaler - * @rmtoll CFGR PPRE2 LL_RCC_SetAPB2Prescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_APB2_DIV_1 - * @arg @ref LL_RCC_APB2_DIV_2 - * @arg @ref LL_RCC_APB2_DIV_4 - * @arg @ref LL_RCC_APB2_DIV_8 - * @arg @ref LL_RCC_APB2_DIV_16 - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetAPB2Prescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, Prescaler); -} - -/** - * @brief Get AHB prescaler - * @rmtoll CFGR HPRE LL_RCC_GetAHBPrescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SYSCLK_DIV_1 - * @arg @ref LL_RCC_SYSCLK_DIV_2 - * @arg @ref LL_RCC_SYSCLK_DIV_4 - * @arg @ref LL_RCC_SYSCLK_DIV_8 - * @arg @ref LL_RCC_SYSCLK_DIV_16 - * @arg @ref LL_RCC_SYSCLK_DIV_64 - * @arg @ref LL_RCC_SYSCLK_DIV_128 - * @arg @ref LL_RCC_SYSCLK_DIV_256 - * @arg @ref LL_RCC_SYSCLK_DIV_512 - */ -__STATIC_INLINE uint32_t LL_RCC_GetAHBPrescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_HPRE)); -} - -/** - * @brief Get APB1 prescaler - * @rmtoll CFGR PPRE1 LL_RCC_GetAPB1Prescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_APB1_DIV_1 - * @arg @ref LL_RCC_APB1_DIV_2 - * @arg @ref LL_RCC_APB1_DIV_4 - * @arg @ref LL_RCC_APB1_DIV_8 - * @arg @ref LL_RCC_APB1_DIV_16 - */ -__STATIC_INLINE uint32_t LL_RCC_GetAPB1Prescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE1)); -} - -/** - * @brief Get APB2 prescaler - * @rmtoll CFGR PPRE2 LL_RCC_GetAPB2Prescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_APB2_DIV_1 - * @arg @ref LL_RCC_APB2_DIV_2 - * @arg @ref LL_RCC_APB2_DIV_4 - * @arg @ref LL_RCC_APB2_DIV_8 - * @arg @ref LL_RCC_APB2_DIV_16 - */ -__STATIC_INLINE uint32_t LL_RCC_GetAPB2Prescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2)); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_MCO MCO - * @{ - */ - -#if defined(RCC_CFGR_MCO1EN) -/** - * @brief Enable MCO1 output - * @rmtoll CFGR RCC_CFGR_MCO1EN LL_RCC_MCO1_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_MCO1_Enable(void) -{ - SET_BIT(RCC->CFGR, RCC_CFGR_MCO1EN); -} - -/** - * @brief Disable MCO1 output - * @rmtoll CFGR RCC_CFGR_MCO1EN LL_RCC_MCO1_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_MCO1_Disable(void) -{ - CLEAR_BIT(RCC->CFGR, RCC_CFGR_MCO1EN); -} -#endif /* RCC_CFGR_MCO1EN */ - -#if defined(RCC_CFGR_MCO2EN) -/** - * @brief Enable MCO2 output - * @rmtoll CFGR RCC_CFGR_MCO2EN LL_RCC_MCO2_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_MCO2_Enable(void) -{ - SET_BIT(RCC->CFGR, RCC_CFGR_MCO2EN); -} - -/** - * @brief Disable MCO2 output - * @rmtoll CFGR RCC_CFGR_MCO2EN LL_RCC_MCO2_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_MCO2_Disable(void) -{ - CLEAR_BIT(RCC->CFGR, RCC_CFGR_MCO2EN); -} -#endif /* RCC_CFGR_MCO2EN */ - -/** - * @brief Configure MCOx - * @rmtoll CFGR MCO1 LL_RCC_ConfigMCO\n - * CFGR MCO1PRE LL_RCC_ConfigMCO\n - * CFGR MCO2 LL_RCC_ConfigMCO\n - * CFGR MCO2PRE LL_RCC_ConfigMCO - * @param MCOxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_MCO1SOURCE_HSI - * @arg @ref LL_RCC_MCO1SOURCE_LSE - * @arg @ref LL_RCC_MCO1SOURCE_HSE - * @arg @ref LL_RCC_MCO1SOURCE_PLLCLK - * @arg @ref LL_RCC_MCO2SOURCE_SYSCLK - * @arg @ref LL_RCC_MCO2SOURCE_PLLI2S - * @arg @ref LL_RCC_MCO2SOURCE_HSE - * @arg @ref LL_RCC_MCO2SOURCE_PLLCLK - * @param MCOxPrescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_MCO1_DIV_1 - * @arg @ref LL_RCC_MCO1_DIV_2 - * @arg @ref LL_RCC_MCO1_DIV_3 - * @arg @ref LL_RCC_MCO1_DIV_4 - * @arg @ref LL_RCC_MCO1_DIV_5 - * @arg @ref LL_RCC_MCO2_DIV_1 - * @arg @ref LL_RCC_MCO2_DIV_2 - * @arg @ref LL_RCC_MCO2_DIV_3 - * @arg @ref LL_RCC_MCO2_DIV_4 - * @arg @ref LL_RCC_MCO2_DIV_5 - * @retval None - */ -__STATIC_INLINE void LL_RCC_ConfigMCO(uint32_t MCOxSource, uint32_t MCOxPrescaler) -{ - MODIFY_REG(RCC->CFGR, (MCOxSource & 0xFFFF0000U) | (MCOxPrescaler & 0xFFFF0000U), (MCOxSource << 16U) | (MCOxPrescaler << 16U)); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_Peripheral_Clock_Source Peripheral Clock Source - * @{ - */ -#if defined(FMPI2C1) -/** - * @brief Configure FMPI2C clock source - * @rmtoll DCKCFGR2 FMPI2C1SEL LL_RCC_SetFMPI2CClockSource - * @param FMPI2CxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_HSI - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetFMPI2CClockSource(uint32_t FMPI2CxSource) -{ - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, FMPI2CxSource); -} -#endif /* FMPI2C1 */ - -#if defined(LPTIM1) -/** - * @brief Configure LPTIMx clock source - * @rmtoll DCKCFGR2 LPTIM1SEL LL_RCC_SetLPTIMClockSource - * @param LPTIMxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_PCLK1 - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_HSI - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSI - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSE - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetLPTIMClockSource(uint32_t LPTIMxSource) -{ - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, LPTIMxSource); -} -#endif /* LPTIM1 */ - -#if defined(SAI1) -/** - * @brief Configure SAIx clock source - * @rmtoll DCKCFGR SAI1SRC LL_RCC_SetSAIClockSource\n - * DCKCFGR SAI2SRC LL_RCC_SetSAIClockSource\n - * DCKCFGR SAI1ASRC LL_RCC_SetSAIClockSource\n - * DCKCFGR SAI1BSRC LL_RCC_SetSAIClockSource - * @param SAIxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetSAIClockSource(uint32_t SAIxSource) -{ - MODIFY_REG(RCC->DCKCFGR, (SAIxSource & 0xFFFF0000U), (SAIxSource << 16U)); -} -#endif /* SAI1 */ - -#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) -/** - * @brief Configure SDIO clock source - * @rmtoll DCKCFGR SDIOSEL LL_RCC_SetSDIOClockSource\n - * DCKCFGR2 SDIOSEL LL_RCC_SetSDIOClockSource - * @param SDIOxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_SDIO_CLKSOURCE_PLL48CLK - * @arg @ref LL_RCC_SDIO_CLKSOURCE_SYSCLK - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetSDIOClockSource(uint32_t SDIOxSource) -{ -#if defined(RCC_DCKCFGR_SDIOSEL) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, SDIOxSource); -#else - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, SDIOxSource); -#endif /* RCC_DCKCFGR_SDIOSEL */ -} -#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ - -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -/** - * @brief Configure 48Mhz domain clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetCK48MClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_SetCK48MClockSource - * @param CK48MxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLL - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetCK48MClockSource(uint32_t CK48MxSource) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, CK48MxSource); -#else - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, CK48MxSource); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} - -#if defined(RNG) -/** - * @brief Configure RNG clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetRNGClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_SetRNGClockSource - * @param RNGxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLL - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetRNGClockSource(uint32_t RNGxSource) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, RNGxSource); -#else - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, RNGxSource); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} -#endif /* RNG */ - -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -/** - * @brief Configure USB clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetUSBClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_SetUSBClockSource - * @param USBxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_USB_CLKSOURCE_PLL - * @arg @ref LL_RCC_USB_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_USB_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetUSBClockSource(uint32_t USBxSource) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, USBxSource); -#else - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, USBxSource); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} -#endif /* USB_OTG_FS || USB_OTG_HS */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ - -#if defined(CEC) -/** - * @brief Configure CEC clock source - * @rmtoll DCKCFGR2 CECSEL LL_RCC_SetCECClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_CEC_CLKSOURCE_HSI_DIV488 - * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetCECClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, Source); -} -#endif /* CEC */ - -/** - * @brief Configure I2S clock source - * @rmtoll CFGR I2SSRC LL_RCC_SetI2SClockSource\n - * DCKCFGR I2SSRC LL_RCC_SetI2SClockSource\n - * DCKCFGR I2S1SRC LL_RCC_SetI2SClockSource\n - * DCKCFGR I2S2SRC LL_RCC_SetI2SClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PIN - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLSRC (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetI2SClockSource(uint32_t Source) -{ -#if defined(RCC_CFGR_I2SSRC) - MODIFY_REG(RCC->CFGR, RCC_CFGR_I2SSRC, Source); -#else - MODIFY_REG(RCC->DCKCFGR, (Source & 0xFFFF0000U), (Source << 16U)); -#endif /* RCC_CFGR_I2SSRC */ -} - -#if defined(DSI) -/** - * @brief Configure DSI clock source - * @rmtoll DCKCFGR DSISEL LL_RCC_SetDSIClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_DSI_CLKSOURCE_PHY - * @arg @ref LL_RCC_DSI_CLKSOURCE_PLL - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetDSIClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, Source); -} -#endif /* DSI */ - -#if defined(DFSDM1_Channel0) -/** - * @brief Configure DFSDM Audio clock source - * @rmtoll DCKCFGR CKDFSDM1ASEL LL_RCC_SetDFSDMAudioClockSource\n - * DCKCFGR CKDFSDM2ASEL LL_RCC_SetDFSDMAudioClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (*) - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetDFSDMAudioClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->DCKCFGR, (Source & 0x0000FFFFU), (Source >> 16U)); -} - -/** - * @brief Configure DFSDM Kernel clock source - * @rmtoll DCKCFGR CKDFSDM1SEL LL_RCC_SetDFSDMClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_PCLK2 - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_SYSCLK - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_PCLK2 (*) - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_SYSCLK (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetDFSDMClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, Source); -} -#endif /* DFSDM1_Channel0 */ - -#if defined(SPDIFRX) -/** - * @brief Configure SPDIFRX clock source - * @rmtoll DCKCFGR2 SPDIFRXSEL LL_RCC_SetSPDIFRXClockSource - * @param SPDIFRXxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLL - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetSPDIFRXClockSource(uint32_t SPDIFRXxSource) -{ - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, SPDIFRXxSource); -} -#endif /* SPDIFRX */ - -#if defined(FMPI2C1) -/** - * @brief Get FMPI2C clock source - * @rmtoll DCKCFGR2 FMPI2C1SEL LL_RCC_GetFMPI2CClockSource - * @param FMPI2Cx This parameter can be one of the following values: - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_HSI - */ -__STATIC_INLINE uint32_t LL_RCC_GetFMPI2CClockSource(uint32_t FMPI2Cx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, FMPI2Cx)); -} -#endif /* FMPI2C1 */ - -#if defined(LPTIM1) -/** - * @brief Get LPTIMx clock source - * @rmtoll DCKCFGR2 LPTIM1SEL LL_RCC_GetLPTIMClockSource - * @param LPTIMx This parameter can be one of the following values: - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_PCLK1 - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_HSI - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSI - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSE - */ -__STATIC_INLINE uint32_t LL_RCC_GetLPTIMClockSource(uint32_t LPTIMx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)); -} -#endif /* LPTIM1 */ - -#if defined(SAI1) -/** - * @brief Get SAIx clock source - * @rmtoll DCKCFGR SAI1SEL LL_RCC_GetSAIClockSource\n - * DCKCFGR SAI2SEL LL_RCC_GetSAIClockSource\n - * DCKCFGR SAI1ASRC LL_RCC_GetSAIClockSource\n - * DCKCFGR SAI1BSRC LL_RCC_GetSAIClockSource - * @param SAIx This parameter can be one of the following values: - * @arg @ref LL_RCC_SAI1_CLKSOURCE (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE (*) - * - * (*) value not defined in all devices. - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetSAIClockSource(uint32_t SAIx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, SAIx) >> 16U | SAIx); -} -#endif /* SAI1 */ - -#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) -/** - * @brief Get SDIOx clock source - * @rmtoll DCKCFGR SDIOSEL LL_RCC_GetSDIOClockSource\n - * DCKCFGR2 SDIOSEL LL_RCC_GetSDIOClockSource - * @param SDIOx This parameter can be one of the following values: - * @arg @ref LL_RCC_SDIO_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SDIO_CLKSOURCE_PLL48CLK - * @arg @ref LL_RCC_SDIO_CLKSOURCE_SYSCLK - */ -__STATIC_INLINE uint32_t LL_RCC_GetSDIOClockSource(uint32_t SDIOx) -{ -#if defined(RCC_DCKCFGR_SDIOSEL) - return (uint32_t)(READ_BIT(RCC->DCKCFGR, SDIOx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, SDIOx)); -#endif /* RCC_DCKCFGR_SDIOSEL */ -} -#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ - -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -/** - * @brief Get 48Mhz domain clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetCK48MClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_GetCK48MClockSource - * @param CK48Mx This parameter can be one of the following values: - * @arg @ref LL_RCC_CK48M_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLL - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetCK48MClockSource(uint32_t CK48Mx) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - return (uint32_t)(READ_BIT(RCC->DCKCFGR, CK48Mx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, CK48Mx)); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} - -#if defined(RNG) -/** - * @brief Get RNGx clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetRNGClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_GetRNGClockSource - * @param RNGx This parameter can be one of the following values: - * @arg @ref LL_RCC_RNG_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLL - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetRNGClockSource(uint32_t RNGx) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RNGx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, RNGx)); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} -#endif /* RNG */ - -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -/** - * @brief Get USBx clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetUSBClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_GetUSBClockSource - * @param USBx This parameter can be one of the following values: - * @arg @ref LL_RCC_USB_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_USB_CLKSOURCE_PLL - * @arg @ref LL_RCC_USB_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_USB_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetUSBClockSource(uint32_t USBx) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - return (uint32_t)(READ_BIT(RCC->DCKCFGR, USBx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, USBx)); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} -#endif /* USB_OTG_FS || USB_OTG_HS */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ - -#if defined(CEC) -/** - * @brief Get CEC Clock Source - * @rmtoll DCKCFGR2 CECSEL LL_RCC_GetCECClockSource - * @param CECx This parameter can be one of the following values: - * @arg @ref LL_RCC_CEC_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_CEC_CLKSOURCE_HSI_DIV488 - * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE - */ -__STATIC_INLINE uint32_t LL_RCC_GetCECClockSource(uint32_t CECx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, CECx)); -} -#endif /* CEC */ - -/** - * @brief Get I2S Clock Source - * @rmtoll CFGR I2SSRC LL_RCC_GetI2SClockSource\n - * DCKCFGR I2SSRC LL_RCC_GetI2SClockSource\n - * DCKCFGR I2S1SRC LL_RCC_GetI2SClockSource\n - * DCKCFGR I2S2SRC LL_RCC_GetI2SClockSource - * @param I2Sx This parameter can be one of the following values: - * @arg @ref LL_RCC_I2S1_CLKSOURCE - * @arg @ref LL_RCC_I2S2_CLKSOURCE (*) - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PIN - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLSRC (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetI2SClockSource(uint32_t I2Sx) -{ -#if defined(RCC_CFGR_I2SSRC) - return (uint32_t)(READ_BIT(RCC->CFGR, I2Sx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR, I2Sx) >> 16U | I2Sx); -#endif /* RCC_CFGR_I2SSRC */ -} - -#if defined(DFSDM1_Channel0) -/** - * @brief Get DFSDM Audio Clock Source - * @rmtoll DCKCFGR CKDFSDM1ASEL LL_RCC_GetDFSDMAudioClockSource\n - * DCKCFGR CKDFSDM2ASEL LL_RCC_GetDFSDMAudioClockSource - * @param DFSDMx This parameter can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE (*) - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (*) - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetDFSDMAudioClockSource(uint32_t DFSDMx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, DFSDMx) << 16U | DFSDMx); -} - -/** - * @brief Get DFSDM Audio Clock Source - * @rmtoll DCKCFGR CKDFSDM1SEL LL_RCC_GetDFSDMClockSource - * @param DFSDMx This parameter can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE (*) - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_PCLK2 - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_SYSCLK - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_PCLK2 (*) - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_SYSCLK (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetDFSDMClockSource(uint32_t DFSDMx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, DFSDMx)); -} -#endif /* DFSDM1_Channel0 */ - -#if defined(SPDIFRX) -/** - * @brief Get SPDIFRX clock source - * @rmtoll DCKCFGR2 SPDIFRXSEL LL_RCC_GetSPDIFRXClockSource - * @param SPDIFRXx This parameter can be one of the following values: - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLL - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetSPDIFRXClockSource(uint32_t SPDIFRXx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, SPDIFRXx)); -} -#endif /* SPDIFRX */ - -#if defined(DSI) -/** - * @brief Get DSI Clock Source - * @rmtoll DCKCFGR DSISEL LL_RCC_GetDSIClockSource - * @param DSIx This parameter can be one of the following values: - * @arg @ref LL_RCC_DSI_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_DSI_CLKSOURCE_PHY - * @arg @ref LL_RCC_DSI_CLKSOURCE_PLL - */ -__STATIC_INLINE uint32_t LL_RCC_GetDSIClockSource(uint32_t DSIx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, DSIx)); -} -#endif /* DSI */ - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_RTC RTC - * @{ - */ - -/** - * @brief Set RTC Clock Source - * @note Once the RTC clock source has been selected, it cannot be changed anymore unless - * the Backup domain is reset, or unless a failure is detected on LSE (LSECSSD is - * set). The BDRST bit can be used to reset them. - * @rmtoll BDCR RTCSEL LL_RCC_SetRTCClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_RTC_CLKSOURCE_NONE - * @arg @ref LL_RCC_RTC_CLKSOURCE_LSE - * @arg @ref LL_RCC_RTC_CLKSOURCE_LSI - * @arg @ref LL_RCC_RTC_CLKSOURCE_HSE - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetRTCClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->BDCR, RCC_BDCR_RTCSEL, Source); -} - -/** - * @brief Get RTC Clock Source - * @rmtoll BDCR RTCSEL LL_RCC_GetRTCClockSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_RTC_CLKSOURCE_NONE - * @arg @ref LL_RCC_RTC_CLKSOURCE_LSE - * @arg @ref LL_RCC_RTC_CLKSOURCE_LSI - * @arg @ref LL_RCC_RTC_CLKSOURCE_HSE - */ -__STATIC_INLINE uint32_t LL_RCC_GetRTCClockSource(void) -{ - return (uint32_t)(READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)); -} - -/** - * @brief Enable RTC - * @rmtoll BDCR RTCEN LL_RCC_EnableRTC - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableRTC(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_RTCEN); -} - -/** - * @brief Disable RTC - * @rmtoll BDCR RTCEN LL_RCC_DisableRTC - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableRTC(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_RTCEN); -} - -/** - * @brief Check if RTC has been enabled or not - * @rmtoll BDCR RTCEN LL_RCC_IsEnabledRTC - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledRTC(void) -{ - return (READ_BIT(RCC->BDCR, RCC_BDCR_RTCEN) == (RCC_BDCR_RTCEN)); -} - -/** - * @brief Force the Backup domain reset - * @rmtoll BDCR BDRST LL_RCC_ForceBackupDomainReset - * @retval None - */ -__STATIC_INLINE void LL_RCC_ForceBackupDomainReset(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_BDRST); -} - -/** - * @brief Release the Backup domain reset - * @rmtoll BDCR BDRST LL_RCC_ReleaseBackupDomainReset - * @retval None - */ -__STATIC_INLINE void LL_RCC_ReleaseBackupDomainReset(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_BDRST); -} - -/** - * @brief Set HSE Prescalers for RTC Clock - * @rmtoll CFGR RTCPRE LL_RCC_SetRTC_HSEPrescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_RTC_NOCLOCK - * @arg @ref LL_RCC_RTC_HSE_DIV_2 - * @arg @ref LL_RCC_RTC_HSE_DIV_3 - * @arg @ref LL_RCC_RTC_HSE_DIV_4 - * @arg @ref LL_RCC_RTC_HSE_DIV_5 - * @arg @ref LL_RCC_RTC_HSE_DIV_6 - * @arg @ref LL_RCC_RTC_HSE_DIV_7 - * @arg @ref LL_RCC_RTC_HSE_DIV_8 - * @arg @ref LL_RCC_RTC_HSE_DIV_9 - * @arg @ref LL_RCC_RTC_HSE_DIV_10 - * @arg @ref LL_RCC_RTC_HSE_DIV_11 - * @arg @ref LL_RCC_RTC_HSE_DIV_12 - * @arg @ref LL_RCC_RTC_HSE_DIV_13 - * @arg @ref LL_RCC_RTC_HSE_DIV_14 - * @arg @ref LL_RCC_RTC_HSE_DIV_15 - * @arg @ref LL_RCC_RTC_HSE_DIV_16 - * @arg @ref LL_RCC_RTC_HSE_DIV_17 - * @arg @ref LL_RCC_RTC_HSE_DIV_18 - * @arg @ref LL_RCC_RTC_HSE_DIV_19 - * @arg @ref LL_RCC_RTC_HSE_DIV_20 - * @arg @ref LL_RCC_RTC_HSE_DIV_21 - * @arg @ref LL_RCC_RTC_HSE_DIV_22 - * @arg @ref LL_RCC_RTC_HSE_DIV_23 - * @arg @ref LL_RCC_RTC_HSE_DIV_24 - * @arg @ref LL_RCC_RTC_HSE_DIV_25 - * @arg @ref LL_RCC_RTC_HSE_DIV_26 - * @arg @ref LL_RCC_RTC_HSE_DIV_27 - * @arg @ref LL_RCC_RTC_HSE_DIV_28 - * @arg @ref LL_RCC_RTC_HSE_DIV_29 - * @arg @ref LL_RCC_RTC_HSE_DIV_30 - * @arg @ref LL_RCC_RTC_HSE_DIV_31 - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetRTC_HSEPrescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, Prescaler); -} - -/** - * @brief Get HSE Prescalers for RTC Clock - * @rmtoll CFGR RTCPRE LL_RCC_GetRTC_HSEPrescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_RTC_NOCLOCK - * @arg @ref LL_RCC_RTC_HSE_DIV_2 - * @arg @ref LL_RCC_RTC_HSE_DIV_3 - * @arg @ref LL_RCC_RTC_HSE_DIV_4 - * @arg @ref LL_RCC_RTC_HSE_DIV_5 - * @arg @ref LL_RCC_RTC_HSE_DIV_6 - * @arg @ref LL_RCC_RTC_HSE_DIV_7 - * @arg @ref LL_RCC_RTC_HSE_DIV_8 - * @arg @ref LL_RCC_RTC_HSE_DIV_9 - * @arg @ref LL_RCC_RTC_HSE_DIV_10 - * @arg @ref LL_RCC_RTC_HSE_DIV_11 - * @arg @ref LL_RCC_RTC_HSE_DIV_12 - * @arg @ref LL_RCC_RTC_HSE_DIV_13 - * @arg @ref LL_RCC_RTC_HSE_DIV_14 - * @arg @ref LL_RCC_RTC_HSE_DIV_15 - * @arg @ref LL_RCC_RTC_HSE_DIV_16 - * @arg @ref LL_RCC_RTC_HSE_DIV_17 - * @arg @ref LL_RCC_RTC_HSE_DIV_18 - * @arg @ref LL_RCC_RTC_HSE_DIV_19 - * @arg @ref LL_RCC_RTC_HSE_DIV_20 - * @arg @ref LL_RCC_RTC_HSE_DIV_21 - * @arg @ref LL_RCC_RTC_HSE_DIV_22 - * @arg @ref LL_RCC_RTC_HSE_DIV_23 - * @arg @ref LL_RCC_RTC_HSE_DIV_24 - * @arg @ref LL_RCC_RTC_HSE_DIV_25 - * @arg @ref LL_RCC_RTC_HSE_DIV_26 - * @arg @ref LL_RCC_RTC_HSE_DIV_27 - * @arg @ref LL_RCC_RTC_HSE_DIV_28 - * @arg @ref LL_RCC_RTC_HSE_DIV_29 - * @arg @ref LL_RCC_RTC_HSE_DIV_30 - * @arg @ref LL_RCC_RTC_HSE_DIV_31 - */ -__STATIC_INLINE uint32_t LL_RCC_GetRTC_HSEPrescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE)); -} - -/** - * @} - */ - -#if defined(RCC_DCKCFGR_TIMPRE) -/** @defgroup RCC_LL_EF_TIM_CLOCK_PRESCALER TIM - * @{ - */ - -/** - * @brief Set Timers Clock Prescalers - * @rmtoll DCKCFGR TIMPRE LL_RCC_SetTIMPrescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_TIM_PRESCALER_TWICE - * @arg @ref LL_RCC_TIM_PRESCALER_FOUR_TIMES - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetTIMPrescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_TIMPRE, Prescaler); -} - -/** - * @brief Get Timers Clock Prescalers - * @rmtoll DCKCFGR TIMPRE LL_RCC_GetTIMPrescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_TIM_PRESCALER_TWICE - * @arg @ref LL_RCC_TIM_PRESCALER_FOUR_TIMES - */ -__STATIC_INLINE uint32_t LL_RCC_GetTIMPrescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_TIMPRE)); -} - -/** - * @} - */ -#endif /* RCC_DCKCFGR_TIMPRE */ - -/** @defgroup RCC_LL_EF_PLL PLL - * @{ - */ - -/** - * @brief Enable PLL - * @rmtoll CR PLLON LL_RCC_PLL_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_PLLON); -} - -/** - * @brief Disable PLL - * @note Cannot be disabled if the PLL clock is used as the system clock - * @rmtoll CR PLLON LL_RCC_PLL_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_PLLON); -} - -/** - * @brief Check if PLL Ready - * @rmtoll CR PLLRDY LL_RCC_PLL_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_PLLRDY) == (RCC_CR_PLLRDY)); -} - -/** - * @brief Configure PLL used for SYSCLK Domain - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLP can be written only when PLL is disabled - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SYS\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SYS\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SYS\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SYS\n - * PLLCFGR PLLP LL_RCC_PLL_ConfigDomain_SYS - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLP_R This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLP_DIV_2 - * @arg @ref LL_RCC_PLLP_DIV_4 - * @arg @ref LL_RCC_PLLP_DIV_6 - * @arg @ref LL_RCC_PLLP_DIV_8 - * @arg @ref LL_RCC_PLLR_DIV_2 (*) - * @arg @ref LL_RCC_PLLR_DIV_3 (*) - * @arg @ref LL_RCC_PLLR_DIV_4 (*) - * @arg @ref LL_RCC_PLLR_DIV_5 (*) - * @arg @ref LL_RCC_PLLR_DIV_6 (*) - * @arg @ref LL_RCC_PLLR_DIV_7 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SYS(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP_R) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos); - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLP, PLLP_R); -#if defined(RCC_PLLR_SYSCLK_SUPPORT) - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLR, PLLP_R); -#endif /* RCC_PLLR_SYSCLK_SUPPORT */ -} - -/** - * @brief Configure PLL used for 48Mhz domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLQ can be written only when PLL is disabled - * @note This can be selected for USB, RNG, SDIO - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_48M\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_48M\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_48M\n - * PLLCFGR PLLQ LL_RCC_PLL_ConfigDomain_48M - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLQ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLQ_DIV_2 - * @arg @ref LL_RCC_PLLQ_DIV_3 - * @arg @ref LL_RCC_PLLQ_DIV_4 - * @arg @ref LL_RCC_PLLQ_DIV_5 - * @arg @ref LL_RCC_PLLQ_DIV_6 - * @arg @ref LL_RCC_PLLQ_DIV_7 - * @arg @ref LL_RCC_PLLQ_DIV_8 - * @arg @ref LL_RCC_PLLQ_DIV_9 - * @arg @ref LL_RCC_PLLQ_DIV_10 - * @arg @ref LL_RCC_PLLQ_DIV_11 - * @arg @ref LL_RCC_PLLQ_DIV_12 - * @arg @ref LL_RCC_PLLQ_DIV_13 - * @arg @ref LL_RCC_PLLQ_DIV_14 - * @arg @ref LL_RCC_PLLQ_DIV_15 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLQ, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLQ); -} - -#if defined(DSI) -/** - * @brief Configure PLL used for DSI clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI are disabled - * @note PLLN/PLLR can be written only when PLL is disabled - * @note This can be selected for DSI - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_DSI\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_DSI\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_DSI\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_DSI - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_DSI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); -} -#endif /* DSI */ - -#if defined(RCC_PLLR_I2S_CLKSOURCE_SUPPORT) -/** - * @brief Configure PLL used for I2S clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI are disabled - * @note PLLN/PLLR can be written only when PLL is disabled - * @note This can be selected for I2S - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_I2S\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_I2S\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_I2S\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_I2S - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_I2S(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); -} -#endif /* RCC_PLLR_I2S_CLKSOURCE_SUPPORT */ - -#if defined(SPDIFRX) -/** - * @brief Configure PLL used for SPDIFRX clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI are disabled - * @note PLLN/PLLR can be written only when PLL is disabled - * @note This can be selected for SPDIFRX - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SPDIFRX\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SPDIFRX\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SPDIFRX\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SPDIFRX - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SPDIFRX(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); -} -#endif /* SPDIFRX */ - -#if defined(RCC_PLLCFGR_PLLR) -#if defined(SAI1) -/** - * @brief Configure PLL used for SAI clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI are disabled - * @note PLLN/PLLR can be written only when PLL is disabled - * @note This can be selected for SAI - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SAI\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SAI\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SAI\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SAI\n - * DCKCFGR PLLDIVR LL_RCC_PLL_ConfigDomain_SAI - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @param PLLDIVR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLDIVR_DIV_1 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_2 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_3 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_4 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_5 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_6 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_7 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_8 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_9 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_10 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_11 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_12 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_13 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_14 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_15 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_16 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_17 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_18 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_19 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_20 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_21 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_22 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_23 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_24 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_25 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_26 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_27 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_28 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_29 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_30 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_31 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -#if defined(RCC_DCKCFGR_PLLDIVR) -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR, - uint32_t PLLDIVR) -#else -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -#endif /* RCC_DCKCFGR_PLLDIVR */ -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); -#if defined(RCC_DCKCFGR_PLLDIVR) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, PLLDIVR); -#endif /* RCC_DCKCFGR_PLLDIVR */ -} -#endif /* SAI1 */ -#endif /* RCC_PLLCFGR_PLLR */ - -/** - * @brief Configure PLL clock source - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_SetMainSource - * @param PLLSource This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_SetMainSource(uint32_t PLLSource) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, PLLSource); -} - -/** - * @brief Get the oscillator used as PLL clock source. - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_GetMainSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetMainSource(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC)); -} - -/** - * @brief Get Main PLL multiplication factor for VCO - * @rmtoll PLLCFGR PLLN LL_RCC_PLL_GetN - * @retval Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetN(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); -} - -/** - * @brief Get Main PLL division factor for PLLP - * @rmtoll PLLCFGR PLLP LL_RCC_PLL_GetP - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLP_DIV_2 - * @arg @ref LL_RCC_PLLP_DIV_4 - * @arg @ref LL_RCC_PLLP_DIV_6 - * @arg @ref LL_RCC_PLLP_DIV_8 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetP(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP)); -} - -/** - * @brief Get Main PLL division factor for PLLQ - * @note used for PLL48MCLK selected for USB, RNG, SDIO (48 MHz clock) - * @rmtoll PLLCFGR PLLQ LL_RCC_PLL_GetQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLQ_DIV_2 - * @arg @ref LL_RCC_PLLQ_DIV_3 - * @arg @ref LL_RCC_PLLQ_DIV_4 - * @arg @ref LL_RCC_PLLQ_DIV_5 - * @arg @ref LL_RCC_PLLQ_DIV_6 - * @arg @ref LL_RCC_PLLQ_DIV_7 - * @arg @ref LL_RCC_PLLQ_DIV_8 - * @arg @ref LL_RCC_PLLQ_DIV_9 - * @arg @ref LL_RCC_PLLQ_DIV_10 - * @arg @ref LL_RCC_PLLQ_DIV_11 - * @arg @ref LL_RCC_PLLQ_DIV_12 - * @arg @ref LL_RCC_PLLQ_DIV_13 - * @arg @ref LL_RCC_PLLQ_DIV_14 - * @arg @ref LL_RCC_PLLQ_DIV_15 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetQ(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ)); -} - -#if defined(RCC_PLLCFGR_PLLR) -/** - * @brief Get Main PLL division factor for PLLR - * @note used for PLLCLK (system clock) - * @rmtoll PLLCFGR PLLR LL_RCC_PLL_GetR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetR(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR)); -} -#endif /* RCC_PLLCFGR_PLLR */ - -#if defined(RCC_DCKCFGR_PLLDIVR) -/** - * @brief Get Main PLL division factor for PLLDIVR - * @note used for PLLSAICLK (SAI1 and SAI2 clock) - * @rmtoll DCKCFGR PLLDIVR LL_RCC_PLL_GetDIVR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLDIVR_DIV_1 - * @arg @ref LL_RCC_PLLDIVR_DIV_2 - * @arg @ref LL_RCC_PLLDIVR_DIV_3 - * @arg @ref LL_RCC_PLLDIVR_DIV_4 - * @arg @ref LL_RCC_PLLDIVR_DIV_5 - * @arg @ref LL_RCC_PLLDIVR_DIV_6 - * @arg @ref LL_RCC_PLLDIVR_DIV_7 - * @arg @ref LL_RCC_PLLDIVR_DIV_8 - * @arg @ref LL_RCC_PLLDIVR_DIV_9 - * @arg @ref LL_RCC_PLLDIVR_DIV_10 - * @arg @ref LL_RCC_PLLDIVR_DIV_11 - * @arg @ref LL_RCC_PLLDIVR_DIV_12 - * @arg @ref LL_RCC_PLLDIVR_DIV_13 - * @arg @ref LL_RCC_PLLDIVR_DIV_14 - * @arg @ref LL_RCC_PLLDIVR_DIV_15 - * @arg @ref LL_RCC_PLLDIVR_DIV_16 - * @arg @ref LL_RCC_PLLDIVR_DIV_17 - * @arg @ref LL_RCC_PLLDIVR_DIV_18 - * @arg @ref LL_RCC_PLLDIVR_DIV_19 - * @arg @ref LL_RCC_PLLDIVR_DIV_20 - * @arg @ref LL_RCC_PLLDIVR_DIV_21 - * @arg @ref LL_RCC_PLLDIVR_DIV_22 - * @arg @ref LL_RCC_PLLDIVR_DIV_23 - * @arg @ref LL_RCC_PLLDIVR_DIV_24 - * @arg @ref LL_RCC_PLLDIVR_DIV_25 - * @arg @ref LL_RCC_PLLDIVR_DIV_26 - * @arg @ref LL_RCC_PLLDIVR_DIV_27 - * @arg @ref LL_RCC_PLLDIVR_DIV_28 - * @arg @ref LL_RCC_PLLDIVR_DIV_29 - * @arg @ref LL_RCC_PLLDIVR_DIV_30 - * @arg @ref LL_RCC_PLLDIVR_DIV_31 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetDIVR(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR)); -} -#endif /* RCC_DCKCFGR_PLLDIVR */ - -/** - * @brief Get Division factor for the main PLL and other PLL - * @rmtoll PLLCFGR PLLM LL_RCC_PLL_GetDivider - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetDivider(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); -} - -/** - * @brief Configure Spread Spectrum used for PLL - * @note These bits must be written before enabling PLL - * @rmtoll SSCGR MODPER LL_RCC_PLL_ConfigSpreadSpectrum\n - * SSCGR INCSTEP LL_RCC_PLL_ConfigSpreadSpectrum\n - * SSCGR SPREADSEL LL_RCC_PLL_ConfigSpreadSpectrum - * @param Mod Between Min_Data=0 and Max_Data=8191 - * @param Inc Between Min_Data=0 and Max_Data=32767 - * @param Sel This parameter can be one of the following values: - * @arg @ref LL_RCC_SPREAD_SELECT_CENTER - * @arg @ref LL_RCC_SPREAD_SELECT_DOWN - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigSpreadSpectrum(uint32_t Mod, uint32_t Inc, uint32_t Sel) -{ - MODIFY_REG(RCC->SSCGR, RCC_SSCGR_MODPER | RCC_SSCGR_INCSTEP | RCC_SSCGR_SPREADSEL, Mod | (Inc << RCC_SSCGR_INCSTEP_Pos) | Sel); -} - -/** - * @brief Get Spread Spectrum Modulation Period for PLL - * @rmtoll SSCGR MODPER LL_RCC_PLL_GetPeriodModulation - * @retval Between Min_Data=0 and Max_Data=8191 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetPeriodModulation(void) -{ - return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_MODPER)); -} - -/** - * @brief Get Spread Spectrum Incrementation Step for PLL - * @note Must be written before enabling PLL - * @rmtoll SSCGR INCSTEP LL_RCC_PLL_GetStepIncrementation - * @retval Between Min_Data=0 and Max_Data=32767 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetStepIncrementation(void) -{ - return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_INCSTEP) >> RCC_SSCGR_INCSTEP_Pos); -} - -/** - * @brief Get Spread Spectrum Selection for PLL - * @note Must be written before enabling PLL - * @rmtoll SSCGR SPREADSEL LL_RCC_PLL_GetSpreadSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SPREAD_SELECT_CENTER - * @arg @ref LL_RCC_SPREAD_SELECT_DOWN - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetSpreadSelection(void) -{ - return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_SPREADSEL)); -} - -/** - * @brief Enable Spread Spectrum for PLL. - * @rmtoll SSCGR SSCGEN LL_RCC_PLL_SpreadSpectrum_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_SpreadSpectrum_Enable(void) -{ - SET_BIT(RCC->SSCGR, RCC_SSCGR_SSCGEN); -} - -/** - * @brief Disable Spread Spectrum for PLL. - * @rmtoll SSCGR SSCGEN LL_RCC_PLL_SpreadSpectrum_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_SpreadSpectrum_Disable(void) -{ - CLEAR_BIT(RCC->SSCGR, RCC_SSCGR_SSCGEN); -} - -/** - * @} - */ - -#if defined(RCC_PLLI2S_SUPPORT) -/** @defgroup RCC_LL_EF_PLLI2S PLLI2S - * @{ - */ - -/** - * @brief Enable PLLI2S - * @rmtoll CR PLLI2SON LL_RCC_PLLI2S_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_PLLI2SON); -} - -/** - * @brief Disable PLLI2S - * @rmtoll CR PLLI2SON LL_RCC_PLLI2S_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); -} - -/** - * @brief Check if PLLI2S Ready - * @rmtoll CR PLLI2SRDY LL_RCC_PLLI2S_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) == (RCC_CR_PLLI2SRDY)); -} - -#if (defined(RCC_DCKCFGR_PLLI2SDIVQ) || defined(RCC_DCKCFGR_PLLI2SDIVR)) -/** - * @brief Configure PLLI2S used for SAI domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLQ/PLLR can be written only when PLLI2S is disabled - * @note This can be selected for SAI - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_ConfigDomain_SAI\n - * DCKCFGR PLLI2SDIVQ LL_RCC_PLLI2S_ConfigDomain_SAI\n - * DCKCFGR PLLI2SDIVR LL_RCC_PLLI2S_ConfigDomain_SAI - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) - * - * (*) value not defined in all devices. - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param PLLN Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLQ_R This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_7 (*) - * - * (*) value not defined in all devices. - * @param PLLDIVQ_R This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ_R, - uint32_t PLLDIVQ_R) -{ - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); - MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos); -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SQ, PLLQ_R); - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, PLLDIVQ_R); -#else - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SR, PLLQ_R); - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, PLLDIVQ_R); -#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ -} -#endif /* RCC_DCKCFGR_PLLI2SDIVQ && RCC_DCKCFGR_PLLI2SDIVR */ - -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -/** - * @brief Configure PLLI2S used for 48Mhz domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLQ can be written only when PLLI2S is disabled - * @note This can be selected for RNG, USB, SDIO - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_ConfigDomain_48M - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) - * - * (*) value not defined in all devices. - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLQ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ) -{ - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); - MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SQ, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLQ); -} -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ - -#if defined(SPDIFRX) -/** - * @brief Configure PLLI2S used for SPDIFRX domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLP can be written only when PLLI2S is disabled - * @note This can be selected for SPDIFRX - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n - * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n - * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n - * PLLI2SCFGR PLLI2SP LL_RCC_PLLI2S_ConfigDomain_SPDIFRX - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLP This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SP_DIV_2 - * @arg @ref LL_RCC_PLLI2SP_DIV_4 - * @arg @ref LL_RCC_PLLI2SP_DIV_6 - * @arg @ref LL_RCC_PLLI2SP_DIV_8 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_SPDIFRX(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SP, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLP); -} -#endif /* SPDIFRX */ - -/** - * @brief Configure PLLI2S used for I2S1 domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLR can be written only when PLLI2S is disabled - * @note This can be selected for I2S - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_ConfigDomain_I2S - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) - * - * (*) value not defined in all devices. - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param PLLN Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SR_DIV_2 - * @arg @ref LL_RCC_PLLI2SR_DIV_3 - * @arg @ref LL_RCC_PLLI2SR_DIV_4 - * @arg @ref LL_RCC_PLLI2SR_DIV_5 - * @arg @ref LL_RCC_PLLI2SR_DIV_6 - * @arg @ref LL_RCC_PLLI2SR_DIV_7 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_I2S(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -{ - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); - MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SR, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLR); -} - -/** - * @brief Get I2SPLL multiplication factor for VCO - * @rmtoll PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_GetN - * @retval Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetN(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); -} - -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) -/** - * @brief Get I2SPLL division factor for PLLI2SQ - * @rmtoll PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_GetQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetQ(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SQ)); -} -#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ - -/** - * @brief Get I2SPLL division factor for PLLI2SR - * @note used for PLLI2SCLK (I2S clock) - * @rmtoll PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_GetR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SR_DIV_2 - * @arg @ref LL_RCC_PLLI2SR_DIV_3 - * @arg @ref LL_RCC_PLLI2SR_DIV_4 - * @arg @ref LL_RCC_PLLI2SR_DIV_5 - * @arg @ref LL_RCC_PLLI2SR_DIV_6 - * @arg @ref LL_RCC_PLLI2SR_DIV_7 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetR(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SR)); -} - -#if defined(RCC_PLLI2SCFGR_PLLI2SP) -/** - * @brief Get I2SPLL division factor for PLLI2SP - * @note used for PLLSPDIFRXCLK (SPDIFRX clock) - * @rmtoll PLLI2SCFGR PLLI2SP LL_RCC_PLLI2S_GetP - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SP_DIV_2 - * @arg @ref LL_RCC_PLLI2SP_DIV_4 - * @arg @ref LL_RCC_PLLI2SP_DIV_6 - * @arg @ref LL_RCC_PLLI2SP_DIV_8 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetP(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SP)); -} -#endif /* RCC_PLLI2SCFGR_PLLI2SP */ - -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) -/** - * @brief Get I2SPLL division factor for PLLI2SDIVQ - * @note used PLLSAICLK selected (SAI clock) - * @rmtoll DCKCFGR PLLI2SDIVQ LL_RCC_PLLI2S_GetDIVQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDIVQ(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ)); -} -#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ - -#if defined(RCC_DCKCFGR_PLLI2SDIVR) -/** - * @brief Get I2SPLL division factor for PLLI2SDIVR - * @note used PLLSAICLK selected (SAI clock) - * @rmtoll DCKCFGR PLLI2SDIVR LL_RCC_PLLI2S_GetDIVR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDIVR(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR)); -} -#endif /* RCC_DCKCFGR_PLLI2SDIVR */ - -/** - * @brief Get division factor for PLLI2S input clock - * @rmtoll PLLCFGR PLLM LL_RCC_PLLI2S_GetDivider\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_GetDivider - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDivider(void) -{ -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM)); -#else - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ -} - -/** - * @brief Get the oscillator used as PLL clock source. - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_GetMainSource\n - * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_GetMainSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetMainSource(void) -{ -#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) - uint32_t pllsrc = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC); - uint32_t plli2sssrc0 = READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SSRC); - uint32_t plli2sssrc1 = READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SSRC) >> 15U; - return (uint32_t)(pllsrc | plli2sssrc0 | plli2sssrc1); -#else - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC)); -#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ -} - -/** - * @} - */ -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** @defgroup RCC_LL_EF_PLLSAI PLLSAI - * @{ - */ - -/** - * @brief Enable PLLSAI - * @rmtoll CR PLLSAION LL_RCC_PLLSAI_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_PLLSAION); -} - -/** - * @brief Disable PLLSAI - * @rmtoll CR PLLSAION LL_RCC_PLLSAI_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); -} - -/** - * @brief Check if PLLSAI Ready - * @rmtoll CR PLLSAIRDY LL_RCC_PLLSAI_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) == (RCC_CR_PLLSAIRDY)); -} - -/** - * @brief Configure PLLSAI used for SAI domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLQ can be written only when PLLSAI is disabled - * @note This can be selected for SAI - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_SAI\n - * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_SAI\n - * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_ConfigDomain_SAI\n - * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_SAI\n - * PLLSAICFGR PLLSAIQ LL_RCC_PLLSAI_ConfigDomain_SAI\n - * DCKCFGR PLLSAIDIVQ LL_RCC_PLLSAI_ConfigDomain_SAI - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param PLLN Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLQ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIQ_DIV_15 - * @param PLLDIVQ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ, - uint32_t PLLDIVQ) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); -#if defined(RCC_PLLSAICFGR_PLLSAIM) - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIQ, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLQ); - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, PLLDIVQ); -} - -#if defined(RCC_PLLSAICFGR_PLLSAIP) -/** - * @brief Configure PLLSAI used for 48Mhz domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLP can be written only when PLLSAI is disabled - * @note This can be selected for USB, RNG, SDIO - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_48M\n - * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_48M\n - * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_ConfigDomain_48M\n - * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_48M\n - * PLLSAICFGR PLLSAIP LL_RCC_PLLSAI_ConfigDomain_48M - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLP This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIP_DIV_2 - * @arg @ref LL_RCC_PLLSAIP_DIV_4 - * @arg @ref LL_RCC_PLLSAIP_DIV_6 - * @arg @ref LL_RCC_PLLSAIP_DIV_8 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); -#if defined(RCC_PLLSAICFGR_PLLSAIM) - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIP, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLP); -} -#endif /* RCC_PLLSAICFGR_PLLSAIP */ - -#if defined(LTDC) -/** - * @brief Configure PLLSAI used for LTDC domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLR can be written only when PLLSAI is disabled - * @note This can be selected for LTDC - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_LTDC\n - * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_LTDC\n - * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_LTDC\n - * PLLSAICFGR PLLSAIR LL_RCC_PLLSAI_ConfigDomain_LTDC\n - * DCKCFGR PLLSAIDIVR LL_RCC_PLLSAI_ConfigDomain_LTDC - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param PLLN Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIR_DIV_2 - * @arg @ref LL_RCC_PLLSAIR_DIV_3 - * @arg @ref LL_RCC_PLLSAIR_DIV_4 - * @arg @ref LL_RCC_PLLSAIR_DIV_5 - * @arg @ref LL_RCC_PLLSAIR_DIV_6 - * @arg @ref LL_RCC_PLLSAIR_DIV_7 - * @param PLLDIVR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_LTDC(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR, - uint32_t PLLDIVR) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM, Source | PLLM); - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIR, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLR); - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, PLLDIVR); -} -#endif /* LTDC */ - -/** - * @brief Get division factor for PLLSAI input clock - * @rmtoll PLLCFGR PLLM LL_RCC_PLLSAI_GetDivider\n - * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_GetDivider - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDivider(void) -{ -#if defined(RCC_PLLSAICFGR_PLLSAIM) - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM)); -#else - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ -} - -/** - * @brief Get SAIPLL multiplication factor for VCO - * @rmtoll PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_GetN - * @retval Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetN(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); -} - -/** - * @brief Get SAIPLL division factor for PLLSAIQ - * @rmtoll PLLSAICFGR PLLSAIQ LL_RCC_PLLSAI_GetQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIQ_DIV_15 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetQ(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIQ)); -} - -#if defined(RCC_PLLSAICFGR_PLLSAIR) -/** - * @brief Get SAIPLL division factor for PLLSAIR - * @note used for PLLSAICLK (SAI clock) - * @rmtoll PLLSAICFGR PLLSAIR LL_RCC_PLLSAI_GetR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIR_DIV_2 - * @arg @ref LL_RCC_PLLSAIR_DIV_3 - * @arg @ref LL_RCC_PLLSAIR_DIV_4 - * @arg @ref LL_RCC_PLLSAIR_DIV_5 - * @arg @ref LL_RCC_PLLSAIR_DIV_6 - * @arg @ref LL_RCC_PLLSAIR_DIV_7 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetR(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIR)); -} -#endif /* RCC_PLLSAICFGR_PLLSAIR */ - -#if defined(RCC_PLLSAICFGR_PLLSAIP) -/** - * @brief Get SAIPLL division factor for PLLSAIP - * @note used for PLL48MCLK (48M domain clock) - * @rmtoll PLLSAICFGR PLLSAIP LL_RCC_PLLSAI_GetP - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIP_DIV_2 - * @arg @ref LL_RCC_PLLSAIP_DIV_4 - * @arg @ref LL_RCC_PLLSAIP_DIV_6 - * @arg @ref LL_RCC_PLLSAIP_DIV_8 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetP(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIP)); -} -#endif /* RCC_PLLSAICFGR_PLLSAIP */ - -/** - * @brief Get SAIPLL division factor for PLLSAIDIVQ - * @note used PLLSAICLK selected (SAI clock) - * @rmtoll DCKCFGR PLLSAIDIVQ LL_RCC_PLLSAI_GetDIVQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDIVQ(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ)); -} - -#if defined(RCC_DCKCFGR_PLLSAIDIVR) -/** - * @brief Get SAIPLL division factor for PLLSAIDIVR - * @note used for LTDC domain clock - * @rmtoll DCKCFGR PLLSAIDIVR LL_RCC_PLLSAI_GetDIVR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDIVR(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR)); -} -#endif /* RCC_DCKCFGR_PLLSAIDIVR */ - -/** - * @} - */ -#endif /* RCC_PLLSAI_SUPPORT */ - -/** @defgroup RCC_LL_EF_FLAG_Management FLAG Management - * @{ - */ - -/** - * @brief Clear LSI ready interrupt flag - * @rmtoll CIR LSIRDYC LL_RCC_ClearFlag_LSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_LSIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC); -} - -/** - * @brief Clear LSE ready interrupt flag - * @rmtoll CIR LSERDYC LL_RCC_ClearFlag_LSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_LSERDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_LSERDYC); -} - -/** - * @brief Clear HSI ready interrupt flag - * @rmtoll CIR HSIRDYC LL_RCC_ClearFlag_HSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_HSIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_HSIRDYC); -} - -/** - * @brief Clear HSE ready interrupt flag - * @rmtoll CIR HSERDYC LL_RCC_ClearFlag_HSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_HSERDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_HSERDYC); -} - -/** - * @brief Clear PLL ready interrupt flag - * @rmtoll CIR PLLRDYC LL_RCC_ClearFlag_PLLRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_PLLRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLRDYC); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Clear PLLI2S ready interrupt flag - * @rmtoll CIR PLLI2SRDYC LL_RCC_ClearFlag_PLLI2SRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_PLLI2SRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Clear PLLSAI ready interrupt flag - * @rmtoll CIR PLLSAIRDYC LL_RCC_ClearFlag_PLLSAIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_PLLSAIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); -} - -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @brief Clear Clock security system interrupt flag - * @rmtoll CIR CSSC LL_RCC_ClearFlag_HSECSS - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_HSECSS(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_CSSC); -} - -/** - * @brief Check if LSI ready interrupt occurred or not - * @rmtoll CIR LSIRDYF LL_RCC_IsActiveFlag_LSIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LSIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_LSIRDYF) == (RCC_CIR_LSIRDYF)); -} - -/** - * @brief Check if LSE ready interrupt occurred or not - * @rmtoll CIR LSERDYF LL_RCC_IsActiveFlag_LSERDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LSERDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_LSERDYF) == (RCC_CIR_LSERDYF)); -} - -/** - * @brief Check if HSI ready interrupt occurred or not - * @rmtoll CIR HSIRDYF LL_RCC_IsActiveFlag_HSIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_HSIRDYF) == (RCC_CIR_HSIRDYF)); -} - -/** - * @brief Check if HSE ready interrupt occurred or not - * @rmtoll CIR HSERDYF LL_RCC_IsActiveFlag_HSERDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSERDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_HSERDYF) == (RCC_CIR_HSERDYF)); -} - -/** - * @brief Check if PLL ready interrupt occurred or not - * @rmtoll CIR PLLRDYF LL_RCC_IsActiveFlag_PLLRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLRDYF) == (RCC_CIR_PLLRDYF)); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Check if PLLI2S ready interrupt occurred or not - * @rmtoll CIR PLLI2SRDYF LL_RCC_IsActiveFlag_PLLI2SRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLI2SRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYF) == (RCC_CIR_PLLI2SRDYF)); -} -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Check if PLLSAI ready interrupt occurred or not - * @rmtoll CIR PLLSAIRDYF LL_RCC_IsActiveFlag_PLLSAIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLSAIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYF) == (RCC_CIR_PLLSAIRDYF)); -} -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @brief Check if Clock security system interrupt occurred or not - * @rmtoll CIR CSSF LL_RCC_IsActiveFlag_HSECSS - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSECSS(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_CSSF) == (RCC_CIR_CSSF)); -} - -/** - * @brief Check if RCC flag Independent Watchdog reset is set or not. - * @rmtoll CSR IWDGRSTF LL_RCC_IsActiveFlag_IWDGRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_IWDGRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_IWDGRSTF) == (RCC_CSR_IWDGRSTF)); -} - -/** - * @brief Check if RCC flag Low Power reset is set or not. - * @rmtoll CSR LPWRRSTF LL_RCC_IsActiveFlag_LPWRRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LPWRRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_LPWRRSTF) == (RCC_CSR_LPWRRSTF)); -} - -/** - * @brief Check if RCC flag Pin reset is set or not. - * @rmtoll CSR PINRSTF LL_RCC_IsActiveFlag_PINRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PINRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_PINRSTF) == (RCC_CSR_PINRSTF)); -} - -/** - * @brief Check if RCC flag POR/PDR reset is set or not. - * @rmtoll CSR PORRSTF LL_RCC_IsActiveFlag_PORRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PORRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_PORRSTF) == (RCC_CSR_PORRSTF)); -} - -/** - * @brief Check if RCC flag Software reset is set or not. - * @rmtoll CSR SFTRSTF LL_RCC_IsActiveFlag_SFTRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_SFTRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_SFTRSTF) == (RCC_CSR_SFTRSTF)); -} - -/** - * @brief Check if RCC flag Window Watchdog reset is set or not. - * @rmtoll CSR WWDGRSTF LL_RCC_IsActiveFlag_WWDGRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_WWDGRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_WWDGRSTF) == (RCC_CSR_WWDGRSTF)); -} - -#if defined(RCC_CSR_BORRSTF) -/** - * @brief Check if RCC flag BOR reset is set or not. - * @rmtoll CSR BORRSTF LL_RCC_IsActiveFlag_BORRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_BORRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_BORRSTF) == (RCC_CSR_BORRSTF)); -} -#endif /* RCC_CSR_BORRSTF */ - -/** - * @brief Set RMVF bit to clear the reset flags. - * @rmtoll CSR RMVF LL_RCC_ClearResetFlags - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearResetFlags(void) -{ - SET_BIT(RCC->CSR, RCC_CSR_RMVF); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_IT_Management IT Management - * @{ - */ - -/** - * @brief Enable LSI ready interrupt - * @rmtoll CIR LSIRDYIE LL_RCC_EnableIT_LSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_LSIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_LSIRDYIE); -} - -/** - * @brief Enable LSE ready interrupt - * @rmtoll CIR LSERDYIE LL_RCC_EnableIT_LSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_LSERDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_LSERDYIE); -} - -/** - * @brief Enable HSI ready interrupt - * @rmtoll CIR HSIRDYIE LL_RCC_EnableIT_HSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_HSIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_HSIRDYIE); -} - -/** - * @brief Enable HSE ready interrupt - * @rmtoll CIR HSERDYIE LL_RCC_EnableIT_HSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_HSERDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_HSERDYIE); -} - -/** - * @brief Enable PLL ready interrupt - * @rmtoll CIR PLLRDYIE LL_RCC_EnableIT_PLLRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_PLLRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLRDYIE); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Enable PLLI2S ready interrupt - * @rmtoll CIR PLLI2SRDYIE LL_RCC_EnableIT_PLLI2SRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_PLLI2SRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); -} -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Enable PLLSAI ready interrupt - * @rmtoll CIR PLLSAIRDYIE LL_RCC_EnableIT_PLLSAIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_PLLSAIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); -} -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @brief Disable LSI ready interrupt - * @rmtoll CIR LSIRDYIE LL_RCC_DisableIT_LSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_LSIRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE); -} - -/** - * @brief Disable LSE ready interrupt - * @rmtoll CIR LSERDYIE LL_RCC_DisableIT_LSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_LSERDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_LSERDYIE); -} - -/** - * @brief Disable HSI ready interrupt - * @rmtoll CIR HSIRDYIE LL_RCC_DisableIT_HSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_HSIRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_HSIRDYIE); -} - -/** - * @brief Disable HSE ready interrupt - * @rmtoll CIR HSERDYIE LL_RCC_DisableIT_HSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_HSERDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_HSERDYIE); -} - -/** - * @brief Disable PLL ready interrupt - * @rmtoll CIR PLLRDYIE LL_RCC_DisableIT_PLLRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_PLLRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLRDYIE); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Disable PLLI2S ready interrupt - * @rmtoll CIR PLLI2SRDYIE LL_RCC_DisableIT_PLLI2SRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_PLLI2SRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Disable PLLSAI ready interrupt - * @rmtoll CIR PLLSAIRDYIE LL_RCC_DisableIT_PLLSAIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_PLLSAIRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); -} -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @brief Checks if LSI ready interrupt source is enabled or disabled. - * @rmtoll CIR LSIRDYIE LL_RCC_IsEnabledIT_LSIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_LSIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_LSIRDYIE) == (RCC_CIR_LSIRDYIE)); -} - -/** - * @brief Checks if LSE ready interrupt source is enabled or disabled. - * @rmtoll CIR LSERDYIE LL_RCC_IsEnabledIT_LSERDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_LSERDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_LSERDYIE) == (RCC_CIR_LSERDYIE)); -} - -/** - * @brief Checks if HSI ready interrupt source is enabled or disabled. - * @rmtoll CIR HSIRDYIE LL_RCC_IsEnabledIT_HSIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_HSIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_HSIRDYIE) == (RCC_CIR_HSIRDYIE)); -} - -/** - * @brief Checks if HSE ready interrupt source is enabled or disabled. - * @rmtoll CIR HSERDYIE LL_RCC_IsEnabledIT_HSERDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_HSERDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_HSERDYIE) == (RCC_CIR_HSERDYIE)); -} - -/** - * @brief Checks if PLL ready interrupt source is enabled or disabled. - * @rmtoll CIR PLLRDYIE LL_RCC_IsEnabledIT_PLLRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLRDYIE) == (RCC_CIR_PLLRDYIE)); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Checks if PLLI2S ready interrupt source is enabled or disabled. - * @rmtoll CIR PLLI2SRDYIE LL_RCC_IsEnabledIT_PLLI2SRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLI2SRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE) == (RCC_CIR_PLLI2SRDYIE)); -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Checks if PLLSAI ready interrupt source is enabled or disabled. - * @rmtoll CIR PLLSAIRDYIE LL_RCC_IsEnabledIT_PLLSAIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLSAIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE) == (RCC_CIR_PLLSAIRDYIE)); -} -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup RCC_LL_EF_Init De-initialization function - * @{ - */ -ErrorStatus LL_RCC_DeInit(void); -/** - * @} - */ - -/** @defgroup RCC_LL_EF_Get_Freq Get system and peripherals clocks frequency functions - * @{ - */ -void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks); -#if defined(FMPI2C1) -uint32_t LL_RCC_GetFMPI2CClockFreq(uint32_t FMPI2CxSource); -#endif /* FMPI2C1 */ -#if defined(LPTIM1) -uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource); -#endif /* LPTIM1 */ -#if defined(SAI1) -uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource); -#endif /* SAI1 */ -#if defined(SDIO) -uint32_t LL_RCC_GetSDIOClockFreq(uint32_t SDIOxSource); -#endif /* SDIO */ -#if defined(RNG) -uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource); -#endif /* RNG */ -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource); -#endif /* USB_OTG_FS || USB_OTG_HS */ -#if defined(DFSDM1_Channel0) -uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource); -uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource); -#endif /* DFSDM1_Channel0 */ -uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource); -#if defined(CEC) -uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource); -#endif /* CEC */ -#if defined(LTDC) -uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource); -#endif /* LTDC */ -#if defined(SPDIFRX) -uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource); -#endif /* SPDIFRX */ -#if defined(DSI) -uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource); -#endif /* DSI */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined(RCC) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_RCC_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h deleted file mode 100644 index 371383e..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h +++ /dev/null @@ -1,2027 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_spi.h - * @author MCD Application Team - * @brief Header file of SPI LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_LL_SPI_H -#define STM32F4xx_LL_SPI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (SPI1) || defined (SPI2) || defined (SPI3) || defined (SPI4) || defined (SPI5) || defined(SPI6) - -/** @defgroup SPI_LL SPI - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup SPI_LL_ES_INIT SPI Exported Init structure - * @{ - */ - -/** - * @brief SPI Init structures definition - */ -typedef struct -{ - uint32_t TransferDirection; /*!< Specifies the SPI unidirectional or bidirectional data mode. - This parameter can be a value of @ref SPI_LL_EC_TRANSFER_MODE. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetTransferDirection().*/ - - uint32_t Mode; /*!< Specifies the SPI mode (Master/Slave). - This parameter can be a value of @ref SPI_LL_EC_MODE. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetMode().*/ - - uint32_t DataWidth; /*!< Specifies the SPI data width. - This parameter can be a value of @ref SPI_LL_EC_DATAWIDTH. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetDataWidth().*/ - - uint32_t ClockPolarity; /*!< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_LL_EC_POLARITY. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetClockPolarity().*/ - - uint32_t ClockPhase; /*!< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_LL_EC_PHASE. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetClockPhase().*/ - - uint32_t NSS; /*!< Specifies whether the NSS signal is managed by hardware (NSS pin) or by software using the SSI bit. - This parameter can be a value of @ref SPI_LL_EC_NSS_MODE. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetNSSMode().*/ - - uint32_t BaudRate; /*!< Specifies the BaudRate prescaler value which will be used to configure the transmit and receive SCK clock. - This parameter can be a value of @ref SPI_LL_EC_BAUDRATEPRESCALER. - @note The communication clock is derived from the master clock. The slave clock does not need to be set. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetBaudRatePrescaler().*/ - - uint32_t BitOrder; /*!< Specifies whether data transfers start from MSB or LSB bit. - This parameter can be a value of @ref SPI_LL_EC_BIT_ORDER. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetTransferBitOrder().*/ - - uint32_t CRCCalculation; /*!< Specifies if the CRC calculation is enabled or not. - This parameter can be a value of @ref SPI_LL_EC_CRC_CALCULATION. - - This feature can be modified afterwards using unitary functions @ref LL_SPI_EnableCRC() and @ref LL_SPI_DisableCRC().*/ - - uint32_t CRCPoly; /*!< Specifies the polynomial used for the CRC calculation. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFFFF. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetCRCPolynomial().*/ - -} LL_SPI_InitTypeDef; - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SPI_LL_Exported_Constants SPI Exported Constants - * @{ - */ - -/** @defgroup SPI_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_SPI_ReadReg function - * @{ - */ -#define LL_SPI_SR_RXNE SPI_SR_RXNE /*!< Rx buffer not empty flag */ -#define LL_SPI_SR_TXE SPI_SR_TXE /*!< Tx buffer empty flag */ -#define LL_SPI_SR_BSY SPI_SR_BSY /*!< Busy flag */ -#define LL_SPI_SR_CRCERR SPI_SR_CRCERR /*!< CRC error flag */ -#define LL_SPI_SR_MODF SPI_SR_MODF /*!< Mode fault flag */ -#define LL_SPI_SR_OVR SPI_SR_OVR /*!< Overrun flag */ -#define LL_SPI_SR_FRE SPI_SR_FRE /*!< TI mode frame format error flag */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions - * @{ - */ -#define LL_SPI_CR2_RXNEIE SPI_CR2_RXNEIE /*!< Rx buffer not empty interrupt enable */ -#define LL_SPI_CR2_TXEIE SPI_CR2_TXEIE /*!< Tx buffer empty interrupt enable */ -#define LL_SPI_CR2_ERRIE SPI_CR2_ERRIE /*!< Error interrupt enable */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_MODE Operation Mode - * @{ - */ -#define LL_SPI_MODE_MASTER (SPI_CR1_MSTR | SPI_CR1_SSI) /*!< Master configuration */ -#define LL_SPI_MODE_SLAVE 0x00000000U /*!< Slave configuration */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_PROTOCOL Serial Protocol - * @{ - */ -#define LL_SPI_PROTOCOL_MOTOROLA 0x00000000U /*!< Motorola mode. Used as default value */ -#define LL_SPI_PROTOCOL_TI (SPI_CR2_FRF) /*!< TI mode */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_PHASE Clock Phase - * @{ - */ -#define LL_SPI_PHASE_1EDGE 0x00000000U /*!< First clock transition is the first data capture edge */ -#define LL_SPI_PHASE_2EDGE (SPI_CR1_CPHA) /*!< Second clock transition is the first data capture edge */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_POLARITY Clock Polarity - * @{ - */ -#define LL_SPI_POLARITY_LOW 0x00000000U /*!< Clock to 0 when idle */ -#define LL_SPI_POLARITY_HIGH (SPI_CR1_CPOL) /*!< Clock to 1 when idle */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_BAUDRATEPRESCALER Baud Rate Prescaler - * @{ - */ -#define LL_SPI_BAUDRATEPRESCALER_DIV2 0x00000000U /*!< BaudRate control equal to fPCLK/2 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV4 (SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/4 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV8 (SPI_CR1_BR_1) /*!< BaudRate control equal to fPCLK/8 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV16 (SPI_CR1_BR_1 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/16 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV32 (SPI_CR1_BR_2) /*!< BaudRate control equal to fPCLK/32 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV64 (SPI_CR1_BR_2 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/64 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV128 (SPI_CR1_BR_2 | SPI_CR1_BR_1) /*!< BaudRate control equal to fPCLK/128 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV256 (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/256 */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_BIT_ORDER Transmission Bit Order - * @{ - */ -#define LL_SPI_LSB_FIRST (SPI_CR1_LSBFIRST) /*!< Data is transmitted/received with the LSB first */ -#define LL_SPI_MSB_FIRST 0x00000000U /*!< Data is transmitted/received with the MSB first */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_TRANSFER_MODE Transfer Mode - * @{ - */ -#define LL_SPI_FULL_DUPLEX 0x00000000U /*!< Full-Duplex mode. Rx and Tx transfer on 2 lines */ -#define LL_SPI_SIMPLEX_RX (SPI_CR1_RXONLY) /*!< Simplex Rx mode. Rx transfer only on 1 line */ -#define LL_SPI_HALF_DUPLEX_RX (SPI_CR1_BIDIMODE) /*!< Half-Duplex Rx mode. Rx transfer on 1 line */ -#define LL_SPI_HALF_DUPLEX_TX (SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE) /*!< Half-Duplex Tx mode. Tx transfer on 1 line */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_NSS_MODE Slave Select Pin Mode - * @{ - */ -#define LL_SPI_NSS_SOFT (SPI_CR1_SSM) /*!< NSS managed internally. NSS pin not used and free */ -#define LL_SPI_NSS_HARD_INPUT 0x00000000U /*!< NSS pin used in Input. Only used in Master mode */ -#define LL_SPI_NSS_HARD_OUTPUT (((uint32_t)SPI_CR2_SSOE << 16U)) /*!< NSS pin used in Output. Only used in Slave mode as chip select */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_DATAWIDTH Datawidth - * @{ - */ -#define LL_SPI_DATAWIDTH_8BIT 0x00000000U /*!< Data length for SPI transfer: 8 bits */ -#define LL_SPI_DATAWIDTH_16BIT (SPI_CR1_DFF) /*!< Data length for SPI transfer: 16 bits */ -/** - * @} - */ -#if defined(USE_FULL_LL_DRIVER) - -/** @defgroup SPI_LL_EC_CRC_CALCULATION CRC Calculation - * @{ - */ -#define LL_SPI_CRCCALCULATION_DISABLE 0x00000000U /*!< CRC calculation disabled */ -#define LL_SPI_CRCCALCULATION_ENABLE (SPI_CR1_CRCEN) /*!< CRC calculation enabled */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup SPI_LL_Exported_Macros SPI Exported Macros - * @{ - */ - -/** @defgroup SPI_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in SPI register - * @param __INSTANCE__ SPI Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_SPI_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in SPI register - * @param __INSTANCE__ SPI Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_SPI_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SPI_LL_Exported_Functions SPI Exported Functions - * @{ - */ - -/** @defgroup SPI_LL_EF_Configuration Configuration - * @{ - */ - -/** - * @brief Enable SPI peripheral - * @rmtoll CR1 SPE LL_SPI_Enable - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_Enable(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR1, SPI_CR1_SPE); -} - -/** - * @brief Disable SPI peripheral - * @note When disabling the SPI, follow the procedure described in the Reference Manual. - * @rmtoll CR1 SPE LL_SPI_Disable - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_Disable(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR1, SPI_CR1_SPE); -} - -/** - * @brief Check if SPI peripheral is enabled - * @rmtoll CR1 SPE LL_SPI_IsEnabled - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabled(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR1, SPI_CR1_SPE) == (SPI_CR1_SPE)) ? 1UL : 0UL); -} - -/** - * @brief Set SPI operation mode to Master or Slave - * @note This bit should not be changed when communication is ongoing. - * @rmtoll CR1 MSTR LL_SPI_SetMode\n - * CR1 SSI LL_SPI_SetMode - * @param SPIx SPI Instance - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_SPI_MODE_MASTER - * @arg @ref LL_SPI_MODE_SLAVE - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetMode(SPI_TypeDef *SPIx, uint32_t Mode) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_MSTR | SPI_CR1_SSI, Mode); -} - -/** - * @brief Get SPI operation mode (Master or Slave) - * @rmtoll CR1 MSTR LL_SPI_GetMode\n - * CR1 SSI LL_SPI_GetMode - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_MODE_MASTER - * @arg @ref LL_SPI_MODE_SLAVE - */ -__STATIC_INLINE uint32_t LL_SPI_GetMode(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_MSTR | SPI_CR1_SSI)); -} - -/** - * @brief Set serial protocol used - * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. - * @rmtoll CR2 FRF LL_SPI_SetStandard - * @param SPIx SPI Instance - * @param Standard This parameter can be one of the following values: - * @arg @ref LL_SPI_PROTOCOL_MOTOROLA - * @arg @ref LL_SPI_PROTOCOL_TI - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetStandard(SPI_TypeDef *SPIx, uint32_t Standard) -{ - MODIFY_REG(SPIx->CR2, SPI_CR2_FRF, Standard); -} - -/** - * @brief Get serial protocol used - * @rmtoll CR2 FRF LL_SPI_GetStandard - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_PROTOCOL_MOTOROLA - * @arg @ref LL_SPI_PROTOCOL_TI - */ -__STATIC_INLINE uint32_t LL_SPI_GetStandard(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_FRF)); -} - -/** - * @brief Set clock phase - * @note This bit should not be changed when communication is ongoing. - * This bit is not used in SPI TI mode. - * @rmtoll CR1 CPHA LL_SPI_SetClockPhase - * @param SPIx SPI Instance - * @param ClockPhase This parameter can be one of the following values: - * @arg @ref LL_SPI_PHASE_1EDGE - * @arg @ref LL_SPI_PHASE_2EDGE - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetClockPhase(SPI_TypeDef *SPIx, uint32_t ClockPhase) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_CPHA, ClockPhase); -} - -/** - * @brief Get clock phase - * @rmtoll CR1 CPHA LL_SPI_GetClockPhase - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_PHASE_1EDGE - * @arg @ref LL_SPI_PHASE_2EDGE - */ -__STATIC_INLINE uint32_t LL_SPI_GetClockPhase(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPHA)); -} - -/** - * @brief Set clock polarity - * @note This bit should not be changed when communication is ongoing. - * This bit is not used in SPI TI mode. - * @rmtoll CR1 CPOL LL_SPI_SetClockPolarity - * @param SPIx SPI Instance - * @param ClockPolarity This parameter can be one of the following values: - * @arg @ref LL_SPI_POLARITY_LOW - * @arg @ref LL_SPI_POLARITY_HIGH - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetClockPolarity(SPI_TypeDef *SPIx, uint32_t ClockPolarity) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_CPOL, ClockPolarity); -} - -/** - * @brief Get clock polarity - * @rmtoll CR1 CPOL LL_SPI_GetClockPolarity - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_POLARITY_LOW - * @arg @ref LL_SPI_POLARITY_HIGH - */ -__STATIC_INLINE uint32_t LL_SPI_GetClockPolarity(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPOL)); -} - -/** - * @brief Set baud rate prescaler - * @note These bits should not be changed when communication is ongoing. SPI BaudRate = fPCLK/Prescaler. - * @rmtoll CR1 BR LL_SPI_SetBaudRatePrescaler - * @param SPIx SPI Instance - * @param BaudRate This parameter can be one of the following values: - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV2 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV4 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV8 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV16 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV32 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV64 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV128 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV256 - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetBaudRatePrescaler(SPI_TypeDef *SPIx, uint32_t BaudRate) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_BR, BaudRate); -} - -/** - * @brief Get baud rate prescaler - * @rmtoll CR1 BR LL_SPI_GetBaudRatePrescaler - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV2 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV4 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV8 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV16 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV32 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV64 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV128 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV256 - */ -__STATIC_INLINE uint32_t LL_SPI_GetBaudRatePrescaler(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_BR)); -} - -/** - * @brief Set transfer bit order - * @note This bit should not be changed when communication is ongoing. This bit is not used in SPI TI mode. - * @rmtoll CR1 LSBFIRST LL_SPI_SetTransferBitOrder - * @param SPIx SPI Instance - * @param BitOrder This parameter can be one of the following values: - * @arg @ref LL_SPI_LSB_FIRST - * @arg @ref LL_SPI_MSB_FIRST - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetTransferBitOrder(SPI_TypeDef *SPIx, uint32_t BitOrder) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_LSBFIRST, BitOrder); -} - -/** - * @brief Get transfer bit order - * @rmtoll CR1 LSBFIRST LL_SPI_GetTransferBitOrder - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_LSB_FIRST - * @arg @ref LL_SPI_MSB_FIRST - */ -__STATIC_INLINE uint32_t LL_SPI_GetTransferBitOrder(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_LSBFIRST)); -} - -/** - * @brief Set transfer direction mode - * @note For Half-Duplex mode, Rx Direction is set by default. - * In master mode, the MOSI pin is used and in slave mode, the MISO pin is used for Half-Duplex. - * @rmtoll CR1 RXONLY LL_SPI_SetTransferDirection\n - * CR1 BIDIMODE LL_SPI_SetTransferDirection\n - * CR1 BIDIOE LL_SPI_SetTransferDirection - * @param SPIx SPI Instance - * @param TransferDirection This parameter can be one of the following values: - * @arg @ref LL_SPI_FULL_DUPLEX - * @arg @ref LL_SPI_SIMPLEX_RX - * @arg @ref LL_SPI_HALF_DUPLEX_RX - * @arg @ref LL_SPI_HALF_DUPLEX_TX - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetTransferDirection(SPI_TypeDef *SPIx, uint32_t TransferDirection) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE, TransferDirection); -} - -/** - * @brief Get transfer direction mode - * @rmtoll CR1 RXONLY LL_SPI_GetTransferDirection\n - * CR1 BIDIMODE LL_SPI_GetTransferDirection\n - * CR1 BIDIOE LL_SPI_GetTransferDirection - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_FULL_DUPLEX - * @arg @ref LL_SPI_SIMPLEX_RX - * @arg @ref LL_SPI_HALF_DUPLEX_RX - * @arg @ref LL_SPI_HALF_DUPLEX_TX - */ -__STATIC_INLINE uint32_t LL_SPI_GetTransferDirection(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE)); -} - -/** - * @brief Set frame data width - * @rmtoll CR1 DFF LL_SPI_SetDataWidth - * @param SPIx SPI Instance - * @param DataWidth This parameter can be one of the following values: - * @arg @ref LL_SPI_DATAWIDTH_8BIT - * @arg @ref LL_SPI_DATAWIDTH_16BIT - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetDataWidth(SPI_TypeDef *SPIx, uint32_t DataWidth) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_DFF, DataWidth); -} - -/** - * @brief Get frame data width - * @rmtoll CR1 DFF LL_SPI_GetDataWidth - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_DATAWIDTH_8BIT - * @arg @ref LL_SPI_DATAWIDTH_16BIT - */ -__STATIC_INLINE uint32_t LL_SPI_GetDataWidth(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_DFF)); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_CRC_Management CRC Management - * @{ - */ - -/** - * @brief Enable CRC - * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. - * @rmtoll CR1 CRCEN LL_SPI_EnableCRC - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableCRC(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR1, SPI_CR1_CRCEN); -} - -/** - * @brief Disable CRC - * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. - * @rmtoll CR1 CRCEN LL_SPI_DisableCRC - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableCRC(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR1, SPI_CR1_CRCEN); -} - -/** - * @brief Check if CRC is enabled - * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. - * @rmtoll CR1 CRCEN LL_SPI_IsEnabledCRC - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledCRC(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR1, SPI_CR1_CRCEN) == (SPI_CR1_CRCEN)) ? 1UL : 0UL); -} - -/** - * @brief Set CRCNext to transfer CRC on the line - * @note This bit has to be written as soon as the last data is written in the SPIx_DR register. - * @rmtoll CR1 CRCNEXT LL_SPI_SetCRCNext - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetCRCNext(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR1, SPI_CR1_CRCNEXT); -} - -/** - * @brief Set polynomial for CRC calculation - * @rmtoll CRCPR CRCPOLY LL_SPI_SetCRCPolynomial - * @param SPIx SPI Instance - * @param CRCPoly This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFFFF - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetCRCPolynomial(SPI_TypeDef *SPIx, uint32_t CRCPoly) -{ - WRITE_REG(SPIx->CRCPR, (uint16_t)CRCPoly); -} - -/** - * @brief Get polynomial for CRC calculation - * @rmtoll CRCPR CRCPOLY LL_SPI_GetCRCPolynomial - * @param SPIx SPI Instance - * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF - */ -__STATIC_INLINE uint32_t LL_SPI_GetCRCPolynomial(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->CRCPR)); -} - -/** - * @brief Get Rx CRC - * @rmtoll RXCRCR RXCRC LL_SPI_GetRxCRC - * @param SPIx SPI Instance - * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF - */ -__STATIC_INLINE uint32_t LL_SPI_GetRxCRC(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->RXCRCR)); -} - -/** - * @brief Get Tx CRC - * @rmtoll TXCRCR TXCRC LL_SPI_GetTxCRC - * @param SPIx SPI Instance - * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF - */ -__STATIC_INLINE uint32_t LL_SPI_GetTxCRC(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->TXCRCR)); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_NSS_Management Slave Select Pin Management - * @{ - */ - -/** - * @brief Set NSS mode - * @note LL_SPI_NSS_SOFT Mode is not used in SPI TI mode. - * @rmtoll CR1 SSM LL_SPI_SetNSSMode\n - * @rmtoll CR2 SSOE LL_SPI_SetNSSMode - * @param SPIx SPI Instance - * @param NSS This parameter can be one of the following values: - * @arg @ref LL_SPI_NSS_SOFT - * @arg @ref LL_SPI_NSS_HARD_INPUT - * @arg @ref LL_SPI_NSS_HARD_OUTPUT - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetNSSMode(SPI_TypeDef *SPIx, uint32_t NSS) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_SSM, NSS); - MODIFY_REG(SPIx->CR2, SPI_CR2_SSOE, ((uint32_t)(NSS >> 16U))); -} - -/** - * @brief Get NSS mode - * @rmtoll CR1 SSM LL_SPI_GetNSSMode\n - * @rmtoll CR2 SSOE LL_SPI_GetNSSMode - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_NSS_SOFT - * @arg @ref LL_SPI_NSS_HARD_INPUT - * @arg @ref LL_SPI_NSS_HARD_OUTPUT - */ -__STATIC_INLINE uint32_t LL_SPI_GetNSSMode(const SPI_TypeDef *SPIx) -{ - uint32_t Ssm = (READ_BIT(SPIx->CR1, SPI_CR1_SSM)); - uint32_t Ssoe = (READ_BIT(SPIx->CR2, SPI_CR2_SSOE) << 16U); - return (Ssm | Ssoe); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_FLAG_Management FLAG Management - * @{ - */ - -/** - * @brief Check if Rx buffer is not empty - * @rmtoll SR RXNE LL_SPI_IsActiveFlag_RXNE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_RXNE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_RXNE) == (SPI_SR_RXNE)) ? 1UL : 0UL); -} - -/** - * @brief Check if Tx buffer is empty - * @rmtoll SR TXE LL_SPI_IsActiveFlag_TXE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_TXE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_TXE) == (SPI_SR_TXE)) ? 1UL : 0UL); -} - -/** - * @brief Get CRC error flag - * @rmtoll SR CRCERR LL_SPI_IsActiveFlag_CRCERR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_CRCERR(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_CRCERR) == (SPI_SR_CRCERR)) ? 1UL : 0UL); -} - -/** - * @brief Get mode fault error flag - * @rmtoll SR MODF LL_SPI_IsActiveFlag_MODF - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_MODF(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_MODF) == (SPI_SR_MODF)) ? 1UL : 0UL); -} - -/** - * @brief Get overrun error flag - * @rmtoll SR OVR LL_SPI_IsActiveFlag_OVR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_OVR(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_OVR) == (SPI_SR_OVR)) ? 1UL : 0UL); -} - -/** - * @brief Get busy flag - * @note The BSY flag is cleared under any one of the following conditions: - * -When the SPI is correctly disabled - * -When a fault is detected in Master mode (MODF bit set to 1) - * -In Master mode, when it finishes a data transmission and no new data is ready to be - * sent - * -In Slave mode, when the BSY flag is set to '0' for at least one SPI clock cycle between - * each data transfer. - * @rmtoll SR BSY LL_SPI_IsActiveFlag_BSY - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_BSY(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_BSY) == (SPI_SR_BSY)) ? 1UL : 0UL); -} - -/** - * @brief Get frame format error flag - * @rmtoll SR FRE LL_SPI_IsActiveFlag_FRE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_FRE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_FRE) == (SPI_SR_FRE)) ? 1UL : 0UL); -} - -/** - * @brief Clear CRC error flag - * @rmtoll SR CRCERR LL_SPI_ClearFlag_CRCERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_ClearFlag_CRCERR(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->SR, SPI_SR_CRCERR); -} - -/** - * @brief Clear mode fault error flag - * @note Clearing this flag is done by a read access to the SPIx_SR - * register followed by a write access to the SPIx_CR1 register - * @rmtoll SR MODF LL_SPI_ClearFlag_MODF - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_ClearFlag_MODF(SPI_TypeDef *SPIx) -{ - __IO uint32_t tmpreg_sr; - tmpreg_sr = SPIx->SR; - (void) tmpreg_sr; - CLEAR_BIT(SPIx->CR1, SPI_CR1_SPE); -} - -/** - * @brief Clear overrun error flag - * @note Clearing this flag is done by a read access to the SPIx_DR - * register followed by a read access to the SPIx_SR register - * @rmtoll SR OVR LL_SPI_ClearFlag_OVR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_ClearFlag_OVR(SPI_TypeDef *SPIx) -{ - __IO uint32_t tmpreg; - tmpreg = SPIx->DR; - (void) tmpreg; - tmpreg = SPIx->SR; - (void) tmpreg; -} - -/** - * @brief Clear frame format error flag - * @note Clearing this flag is done by reading SPIx_SR register - * @rmtoll SR FRE LL_SPI_ClearFlag_FRE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_ClearFlag_FRE(SPI_TypeDef *SPIx) -{ - __IO uint32_t tmpreg; - tmpreg = SPIx->SR; - (void) tmpreg; -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_IT_Management Interrupt Management - * @{ - */ - -/** - * @brief Enable error interrupt - * @note This bit controls the generation of an interrupt when an error condition occurs (CRCERR, OVR, MODF in SPI mode, FRE at TI mode). - * @rmtoll CR2 ERRIE LL_SPI_EnableIT_ERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableIT_ERR(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_ERRIE); -} - -/** - * @brief Enable Rx buffer not empty interrupt - * @rmtoll CR2 RXNEIE LL_SPI_EnableIT_RXNE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableIT_RXNE(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_RXNEIE); -} - -/** - * @brief Enable Tx buffer empty interrupt - * @rmtoll CR2 TXEIE LL_SPI_EnableIT_TXE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableIT_TXE(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_TXEIE); -} - -/** - * @brief Disable error interrupt - * @note This bit controls the generation of an interrupt when an error condition occurs (CRCERR, OVR, MODF in SPI mode, FRE at TI mode). - * @rmtoll CR2 ERRIE LL_SPI_DisableIT_ERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableIT_ERR(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_ERRIE); -} - -/** - * @brief Disable Rx buffer not empty interrupt - * @rmtoll CR2 RXNEIE LL_SPI_DisableIT_RXNE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableIT_RXNE(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_RXNEIE); -} - -/** - * @brief Disable Tx buffer empty interrupt - * @rmtoll CR2 TXEIE LL_SPI_DisableIT_TXE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableIT_TXE(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_TXEIE); -} - -/** - * @brief Check if error interrupt is enabled - * @rmtoll CR2 ERRIE LL_SPI_IsEnabledIT_ERR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_ERR(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_ERRIE) == (SPI_CR2_ERRIE)) ? 1UL : 0UL); -} - -/** - * @brief Check if Rx buffer not empty interrupt is enabled - * @rmtoll CR2 RXNEIE LL_SPI_IsEnabledIT_RXNE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_RXNE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_RXNEIE) == (SPI_CR2_RXNEIE)) ? 1UL : 0UL); -} - -/** - * @brief Check if Tx buffer empty interrupt - * @rmtoll CR2 TXEIE LL_SPI_IsEnabledIT_TXE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_TXE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_TXEIE) == (SPI_CR2_TXEIE)) ? 1UL : 0UL); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_DMA_Management DMA Management - * @{ - */ - -/** - * @brief Enable DMA Rx - * @rmtoll CR2 RXDMAEN LL_SPI_EnableDMAReq_RX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableDMAReq_RX(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_RXDMAEN); -} - -/** - * @brief Disable DMA Rx - * @rmtoll CR2 RXDMAEN LL_SPI_DisableDMAReq_RX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableDMAReq_RX(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_RXDMAEN); -} - -/** - * @brief Check if DMA Rx is enabled - * @rmtoll CR2 RXDMAEN LL_SPI_IsEnabledDMAReq_RX - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledDMAReq_RX(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_RXDMAEN) == (SPI_CR2_RXDMAEN)) ? 1UL : 0UL); -} - -/** - * @brief Enable DMA Tx - * @rmtoll CR2 TXDMAEN LL_SPI_EnableDMAReq_TX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableDMAReq_TX(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_TXDMAEN); -} - -/** - * @brief Disable DMA Tx - * @rmtoll CR2 TXDMAEN LL_SPI_DisableDMAReq_TX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableDMAReq_TX(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_TXDMAEN); -} - -/** - * @brief Check if DMA Tx is enabled - * @rmtoll CR2 TXDMAEN LL_SPI_IsEnabledDMAReq_TX - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledDMAReq_TX(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_TXDMAEN) == (SPI_CR2_TXDMAEN)) ? 1UL : 0UL); -} - -/** - * @brief Get the data register address used for DMA transfer - * @rmtoll DR DR LL_SPI_DMA_GetRegAddr - * @param SPIx SPI Instance - * @retval Address of data register - */ -__STATIC_INLINE uint32_t LL_SPI_DMA_GetRegAddr(const SPI_TypeDef *SPIx) -{ - return (uint32_t) &(SPIx->DR); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_DATA_Management DATA Management - * @{ - */ - -/** - * @brief Read 8-Bits in the data register - * @rmtoll DR DR LL_SPI_ReceiveData8 - * @param SPIx SPI Instance - * @retval RxData Value between Min_Data=0x00 and Max_Data=0xFF - */ -__STATIC_INLINE uint8_t LL_SPI_ReceiveData8(SPI_TypeDef *SPIx) -{ - return (*((__IO uint8_t *)&SPIx->DR)); -} - -/** - * @brief Read 16-Bits in the data register - * @rmtoll DR DR LL_SPI_ReceiveData16 - * @param SPIx SPI Instance - * @retval RxData Value between Min_Data=0x00 and Max_Data=0xFFFF - */ -__STATIC_INLINE uint16_t LL_SPI_ReceiveData16(SPI_TypeDef *SPIx) -{ - return (uint16_t)(READ_REG(SPIx->DR)); -} - -/** - * @brief Write 8-Bits in the data register - * @rmtoll DR DR LL_SPI_TransmitData8 - * @param SPIx SPI Instance - * @param TxData Value between Min_Data=0x00 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_SPI_TransmitData8(SPI_TypeDef *SPIx, uint8_t TxData) -{ -#if defined (__GNUC__) - __IO uint8_t *spidr = ((__IO uint8_t *)&SPIx->DR); - *spidr = TxData; -#else - *((__IO uint8_t *)&SPIx->DR) = TxData; -#endif /* __GNUC__ */ -} - -/** - * @brief Write 16-Bits in the data register - * @rmtoll DR DR LL_SPI_TransmitData16 - * @param SPIx SPI Instance - * @param TxData Value between Min_Data=0x00 and Max_Data=0xFFFF - * @retval None - */ -__STATIC_INLINE void LL_SPI_TransmitData16(SPI_TypeDef *SPIx, uint16_t TxData) -{ -#if defined (__GNUC__) - __IO uint16_t *spidr = ((__IO uint16_t *)&SPIx->DR); - *spidr = TxData; -#else - SPIx->DR = TxData; -#endif /* __GNUC__ */ -} - -/** - * @} - */ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup SPI_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -ErrorStatus LL_SPI_DeInit(const SPI_TypeDef *SPIx); -ErrorStatus LL_SPI_Init(SPI_TypeDef *SPIx, LL_SPI_InitTypeDef *SPI_InitStruct); -void LL_SPI_StructInit(LL_SPI_InitTypeDef *SPI_InitStruct); - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup I2S_LL I2S - * @{ - */ - -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2S_LL_ES_INIT I2S Exported Init structure - * @{ - */ - -/** - * @brief I2S Init structure definition - */ - -typedef struct -{ - uint32_t Mode; /*!< Specifies the I2S operating mode. - This parameter can be a value of @ref I2S_LL_EC_MODE - - This feature can be modified afterwards using unitary function @ref LL_I2S_SetTransferMode().*/ - - uint32_t Standard; /*!< Specifies the standard used for the I2S communication. - This parameter can be a value of @ref I2S_LL_EC_STANDARD - - This feature can be modified afterwards using unitary function @ref LL_I2S_SetStandard().*/ - - - uint32_t DataFormat; /*!< Specifies the data format for the I2S communication. - This parameter can be a value of @ref I2S_LL_EC_DATA_FORMAT - - This feature can be modified afterwards using unitary function @ref LL_I2S_SetDataFormat().*/ - - - uint32_t MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. - This parameter can be a value of @ref I2S_LL_EC_MCLK_OUTPUT - - This feature can be modified afterwards using unitary functions @ref LL_I2S_EnableMasterClock() or @ref LL_I2S_DisableMasterClock.*/ - - - uint32_t AudioFreq; /*!< Specifies the frequency selected for the I2S communication. - This parameter can be a value of @ref I2S_LL_EC_AUDIO_FREQ - - Audio Frequency can be modified afterwards using Reference manual formulas to calculate Prescaler Linear, Parity - and unitary functions @ref LL_I2S_SetPrescalerLinear() and @ref LL_I2S_SetPrescalerParity() to set it.*/ - - - uint32_t ClockPolarity; /*!< Specifies the idle state of the I2S clock. - This parameter can be a value of @ref I2S_LL_EC_POLARITY - - This feature can be modified afterwards using unitary function @ref LL_I2S_SetClockPolarity().*/ - -} LL_I2S_InitTypeDef; - -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2S_LL_Exported_Constants I2S Exported Constants - * @{ - */ - -/** @defgroup I2S_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_I2S_ReadReg function - * @{ - */ -#define LL_I2S_SR_RXNE LL_SPI_SR_RXNE /*!< Rx buffer not empty flag */ -#define LL_I2S_SR_TXE LL_SPI_SR_TXE /*!< Tx buffer empty flag */ -#define LL_I2S_SR_BSY LL_SPI_SR_BSY /*!< Busy flag */ -#define LL_I2S_SR_UDR SPI_SR_UDR /*!< Underrun flag */ -#define LL_I2S_SR_OVR LL_SPI_SR_OVR /*!< Overrun flag */ -#define LL_I2S_SR_FRE LL_SPI_SR_FRE /*!< TI mode frame format error flag */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions - * @{ - */ -#define LL_I2S_CR2_RXNEIE LL_SPI_CR2_RXNEIE /*!< Rx buffer not empty interrupt enable */ -#define LL_I2S_CR2_TXEIE LL_SPI_CR2_TXEIE /*!< Tx buffer empty interrupt enable */ -#define LL_I2S_CR2_ERRIE LL_SPI_CR2_ERRIE /*!< Error interrupt enable */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_DATA_FORMAT Data format - * @{ - */ -#define LL_I2S_DATAFORMAT_16B 0x00000000U /*!< Data length 16 bits, Channel length 16bit */ -#define LL_I2S_DATAFORMAT_16B_EXTENDED (SPI_I2SCFGR_CHLEN) /*!< Data length 16 bits, Channel length 32bit */ -#define LL_I2S_DATAFORMAT_24B (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_0) /*!< Data length 24 bits, Channel length 32bit */ -#define LL_I2S_DATAFORMAT_32B (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_1) /*!< Data length 16 bits, Channel length 32bit */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_POLARITY Clock Polarity - * @{ - */ -#define LL_I2S_POLARITY_LOW 0x00000000U /*!< Clock steady state is low level */ -#define LL_I2S_POLARITY_HIGH (SPI_I2SCFGR_CKPOL) /*!< Clock steady state is high level */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_STANDARD I2s Standard - * @{ - */ -#define LL_I2S_STANDARD_PHILIPS 0x00000000U /*!< I2S standard philips */ -#define LL_I2S_STANDARD_MSB (SPI_I2SCFGR_I2SSTD_0) /*!< MSB justified standard (left justified) */ -#define LL_I2S_STANDARD_LSB (SPI_I2SCFGR_I2SSTD_1) /*!< LSB justified standard (right justified) */ -#define LL_I2S_STANDARD_PCM_SHORT (SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1) /*!< PCM standard, short frame synchronization */ -#define LL_I2S_STANDARD_PCM_LONG (SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1 | SPI_I2SCFGR_PCMSYNC) /*!< PCM standard, long frame synchronization */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_MODE Operation Mode - * @{ - */ -#define LL_I2S_MODE_SLAVE_TX 0x00000000U /*!< Slave Tx configuration */ -#define LL_I2S_MODE_SLAVE_RX (SPI_I2SCFGR_I2SCFG_0) /*!< Slave Rx configuration */ -#define LL_I2S_MODE_MASTER_TX (SPI_I2SCFGR_I2SCFG_1) /*!< Master Tx configuration */ -#define LL_I2S_MODE_MASTER_RX (SPI_I2SCFGR_I2SCFG_0 | SPI_I2SCFGR_I2SCFG_1) /*!< Master Rx configuration */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_PRESCALER_FACTOR Prescaler Factor - * @{ - */ -#define LL_I2S_PRESCALER_PARITY_EVEN 0x00000000U /*!< Odd factor: Real divider value is = I2SDIV * 2 */ -#define LL_I2S_PRESCALER_PARITY_ODD (SPI_I2SPR_ODD >> 8U) /*!< Odd factor: Real divider value is = (I2SDIV * 2)+1 */ -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) - -/** @defgroup I2S_LL_EC_MCLK_OUTPUT MCLK Output - * @{ - */ -#define LL_I2S_MCLK_OUTPUT_DISABLE 0x00000000U /*!< Master clock output is disabled */ -#define LL_I2S_MCLK_OUTPUT_ENABLE (SPI_I2SPR_MCKOE) /*!< Master clock output is enabled */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_AUDIO_FREQ Audio Frequency - * @{ - */ - -#define LL_I2S_AUDIOFREQ_192K 192000U /*!< Audio Frequency configuration 192000 Hz */ -#define LL_I2S_AUDIOFREQ_96K 96000U /*!< Audio Frequency configuration 96000 Hz */ -#define LL_I2S_AUDIOFREQ_48K 48000U /*!< Audio Frequency configuration 48000 Hz */ -#define LL_I2S_AUDIOFREQ_44K 44100U /*!< Audio Frequency configuration 44100 Hz */ -#define LL_I2S_AUDIOFREQ_32K 32000U /*!< Audio Frequency configuration 32000 Hz */ -#define LL_I2S_AUDIOFREQ_22K 22050U /*!< Audio Frequency configuration 22050 Hz */ -#define LL_I2S_AUDIOFREQ_16K 16000U /*!< Audio Frequency configuration 16000 Hz */ -#define LL_I2S_AUDIOFREQ_11K 11025U /*!< Audio Frequency configuration 11025 Hz */ -#define LL_I2S_AUDIOFREQ_8K 8000U /*!< Audio Frequency configuration 8000 Hz */ -#define LL_I2S_AUDIOFREQ_DEFAULT 2U /*!< Audio Freq not specified. Register I2SDIV = 2 */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup I2S_LL_Exported_Macros I2S Exported Macros - * @{ - */ - -/** @defgroup I2S_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in I2S register - * @param __INSTANCE__ I2S Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_I2S_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in I2S register - * @param __INSTANCE__ I2S Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_I2S_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** - * @} - */ - - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup I2S_LL_Exported_Functions I2S Exported Functions - * @{ - */ - -/** @defgroup I2S_LL_EF_Configuration Configuration - * @{ - */ - -/** - * @brief Select I2S mode and Enable I2S peripheral - * @rmtoll I2SCFGR I2SMOD LL_I2S_Enable\n - * I2SCFGR I2SE LL_I2S_Enable - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_Enable(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD | SPI_I2SCFGR_I2SE); -} - -/** - * @brief Disable I2S peripheral - * @rmtoll I2SCFGR I2SE LL_I2S_Disable - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_Disable(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD | SPI_I2SCFGR_I2SE); -} - -/** - * @brief Check if I2S peripheral is enabled - * @rmtoll I2SCFGR I2SE LL_I2S_IsEnabled - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabled(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SE) == (SPI_I2SCFGR_I2SE)) ? 1UL : 0UL); -} - -/** - * @brief Set I2S data frame length - * @rmtoll I2SCFGR DATLEN LL_I2S_SetDataFormat\n - * I2SCFGR CHLEN LL_I2S_SetDataFormat - * @param SPIx SPI Instance - * @param DataFormat This parameter can be one of the following values: - * @arg @ref LL_I2S_DATAFORMAT_16B - * @arg @ref LL_I2S_DATAFORMAT_16B_EXTENDED - * @arg @ref LL_I2S_DATAFORMAT_24B - * @arg @ref LL_I2S_DATAFORMAT_32B - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetDataFormat(SPI_TypeDef *SPIx, uint32_t DataFormat) -{ - MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN, DataFormat); -} - -/** - * @brief Get I2S data frame length - * @rmtoll I2SCFGR DATLEN LL_I2S_GetDataFormat\n - * I2SCFGR CHLEN LL_I2S_GetDataFormat - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_DATAFORMAT_16B - * @arg @ref LL_I2S_DATAFORMAT_16B_EXTENDED - * @arg @ref LL_I2S_DATAFORMAT_24B - * @arg @ref LL_I2S_DATAFORMAT_32B - */ -__STATIC_INLINE uint32_t LL_I2S_GetDataFormat(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)); -} - -/** - * @brief Set I2S clock polarity - * @rmtoll I2SCFGR CKPOL LL_I2S_SetClockPolarity - * @param SPIx SPI Instance - * @param ClockPolarity This parameter can be one of the following values: - * @arg @ref LL_I2S_POLARITY_LOW - * @arg @ref LL_I2S_POLARITY_HIGH - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetClockPolarity(SPI_TypeDef *SPIx, uint32_t ClockPolarity) -{ - SET_BIT(SPIx->I2SCFGR, ClockPolarity); -} - -/** - * @brief Get I2S clock polarity - * @rmtoll I2SCFGR CKPOL LL_I2S_GetClockPolarity - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_POLARITY_LOW - * @arg @ref LL_I2S_POLARITY_HIGH - */ -__STATIC_INLINE uint32_t LL_I2S_GetClockPolarity(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_CKPOL)); -} - -/** - * @brief Set I2S standard protocol - * @rmtoll I2SCFGR I2SSTD LL_I2S_SetStandard\n - * I2SCFGR PCMSYNC LL_I2S_SetStandard - * @param SPIx SPI Instance - * @param Standard This parameter can be one of the following values: - * @arg @ref LL_I2S_STANDARD_PHILIPS - * @arg @ref LL_I2S_STANDARD_MSB - * @arg @ref LL_I2S_STANDARD_LSB - * @arg @ref LL_I2S_STANDARD_PCM_SHORT - * @arg @ref LL_I2S_STANDARD_PCM_LONG - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetStandard(SPI_TypeDef *SPIx, uint32_t Standard) -{ - MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC, Standard); -} - -/** - * @brief Get I2S standard protocol - * @rmtoll I2SCFGR I2SSTD LL_I2S_GetStandard\n - * I2SCFGR PCMSYNC LL_I2S_GetStandard - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_STANDARD_PHILIPS - * @arg @ref LL_I2S_STANDARD_MSB - * @arg @ref LL_I2S_STANDARD_LSB - * @arg @ref LL_I2S_STANDARD_PCM_SHORT - * @arg @ref LL_I2S_STANDARD_PCM_LONG - */ -__STATIC_INLINE uint32_t LL_I2S_GetStandard(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC)); -} - -/** - * @brief Set I2S transfer mode - * @rmtoll I2SCFGR I2SCFG LL_I2S_SetTransferMode - * @param SPIx SPI Instance - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_I2S_MODE_SLAVE_TX - * @arg @ref LL_I2S_MODE_SLAVE_RX - * @arg @ref LL_I2S_MODE_MASTER_TX - * @arg @ref LL_I2S_MODE_MASTER_RX - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetTransferMode(SPI_TypeDef *SPIx, uint32_t Mode) -{ - MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_I2SCFG, Mode); -} - -/** - * @brief Get I2S transfer mode - * @rmtoll I2SCFGR I2SCFG LL_I2S_GetTransferMode - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_MODE_SLAVE_TX - * @arg @ref LL_I2S_MODE_SLAVE_RX - * @arg @ref LL_I2S_MODE_MASTER_TX - * @arg @ref LL_I2S_MODE_MASTER_RX - */ -__STATIC_INLINE uint32_t LL_I2S_GetTransferMode(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SCFG)); -} - -/** - * @brief Set I2S linear prescaler - * @rmtoll I2SPR I2SDIV LL_I2S_SetPrescalerLinear - * @param SPIx SPI Instance - * @param PrescalerLinear Value between Min_Data=0x02 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetPrescalerLinear(SPI_TypeDef *SPIx, uint8_t PrescalerLinear) -{ - MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_I2SDIV, PrescalerLinear); -} - -/** - * @brief Get I2S linear prescaler - * @rmtoll I2SPR I2SDIV LL_I2S_GetPrescalerLinear - * @param SPIx SPI Instance - * @retval PrescalerLinear Value between Min_Data=0x02 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_I2S_GetPrescalerLinear(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SPR, SPI_I2SPR_I2SDIV)); -} - -/** - * @brief Set I2S parity prescaler - * @rmtoll I2SPR ODD LL_I2S_SetPrescalerParity - * @param SPIx SPI Instance - * @param PrescalerParity This parameter can be one of the following values: - * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN - * @arg @ref LL_I2S_PRESCALER_PARITY_ODD - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetPrescalerParity(SPI_TypeDef *SPIx, uint32_t PrescalerParity) -{ - MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_ODD, PrescalerParity << 8U); -} - -/** - * @brief Get I2S parity prescaler - * @rmtoll I2SPR ODD LL_I2S_GetPrescalerParity - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN - * @arg @ref LL_I2S_PRESCALER_PARITY_ODD - */ -__STATIC_INLINE uint32_t LL_I2S_GetPrescalerParity(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SPR, SPI_I2SPR_ODD) >> 8U); -} - -/** - * @brief Enable the master clock output (Pin MCK) - * @rmtoll I2SPR MCKOE LL_I2S_EnableMasterClock - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableMasterClock(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE); -} - -/** - * @brief Disable the master clock output (Pin MCK) - * @rmtoll I2SPR MCKOE LL_I2S_DisableMasterClock - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableMasterClock(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE); -} - -/** - * @brief Check if the master clock output (Pin MCK) is enabled - * @rmtoll I2SPR MCKOE LL_I2S_IsEnabledMasterClock - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledMasterClock(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE) == (SPI_I2SPR_MCKOE)) ? 1UL : 0UL); -} - -#if defined(SPI_I2SCFGR_ASTRTEN) -/** - * @brief Enable asynchronous start - * @rmtoll I2SCFGR ASTRTEN LL_I2S_EnableAsyncStart - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableAsyncStart(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN); -} - -/** - * @brief Disable asynchronous start - * @rmtoll I2SCFGR ASTRTEN LL_I2S_DisableAsyncStart - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableAsyncStart(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN); -} - -/** - * @brief Check if asynchronous start is enabled - * @rmtoll I2SCFGR ASTRTEN LL_I2S_IsEnabledAsyncStart - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledAsyncStart(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN) == (SPI_I2SCFGR_ASTRTEN)) ? 1UL : 0UL); -} -#endif /* SPI_I2SCFGR_ASTRTEN */ - -/** - * @} - */ - -/** @defgroup I2S_LL_EF_FLAG FLAG Management - * @{ - */ - -/** - * @brief Check if Rx buffer is not empty - * @rmtoll SR RXNE LL_I2S_IsActiveFlag_RXNE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_RXNE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_RXNE(SPIx); -} - -/** - * @brief Check if Tx buffer is empty - * @rmtoll SR TXE LL_I2S_IsActiveFlag_TXE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_TXE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_TXE(SPIx); -} - -/** - * @brief Get busy flag - * @rmtoll SR BSY LL_I2S_IsActiveFlag_BSY - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_BSY(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_BSY(SPIx); -} - -/** - * @brief Get overrun error flag - * @rmtoll SR OVR LL_I2S_IsActiveFlag_OVR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_OVR(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_OVR(SPIx); -} - -/** - * @brief Get underrun error flag - * @rmtoll SR UDR LL_I2S_IsActiveFlag_UDR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_UDR(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_UDR) == (SPI_SR_UDR)) ? 1UL : 0UL); -} - -/** - * @brief Get frame format error flag - * @rmtoll SR FRE LL_I2S_IsActiveFlag_FRE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_FRE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_FRE(SPIx); -} - -/** - * @brief Get channel side flag. - * @note 0: Channel Left has to be transmitted or has been received\n - * 1: Channel Right has to be transmitted or has been received\n - * It has no significance in PCM mode. - * @rmtoll SR CHSIDE LL_I2S_IsActiveFlag_CHSIDE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_CHSIDE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_CHSIDE) == (SPI_SR_CHSIDE)) ? 1UL : 0UL); -} - -/** - * @brief Clear overrun error flag - * @rmtoll SR OVR LL_I2S_ClearFlag_OVR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_ClearFlag_OVR(SPI_TypeDef *SPIx) -{ - LL_SPI_ClearFlag_OVR(SPIx); -} - -/** - * @brief Clear underrun error flag - * @rmtoll SR UDR LL_I2S_ClearFlag_UDR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_ClearFlag_UDR(SPI_TypeDef *SPIx) -{ - __IO uint32_t tmpreg; - tmpreg = SPIx->SR; - (void)tmpreg; -} - -/** - * @brief Clear frame format error flag - * @rmtoll SR FRE LL_I2S_ClearFlag_FRE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_ClearFlag_FRE(SPI_TypeDef *SPIx) -{ - LL_SPI_ClearFlag_FRE(SPIx); -} - -/** - * @} - */ - -/** @defgroup I2S_LL_EF_IT Interrupt Management - * @{ - */ - -/** - * @brief Enable error IT - * @note This bit controls the generation of an interrupt when an error condition occurs (OVR, UDR and FRE in I2S mode). - * @rmtoll CR2 ERRIE LL_I2S_EnableIT_ERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableIT_ERR(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableIT_ERR(SPIx); -} - -/** - * @brief Enable Rx buffer not empty IT - * @rmtoll CR2 RXNEIE LL_I2S_EnableIT_RXNE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableIT_RXNE(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableIT_RXNE(SPIx); -} - -/** - * @brief Enable Tx buffer empty IT - * @rmtoll CR2 TXEIE LL_I2S_EnableIT_TXE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableIT_TXE(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableIT_TXE(SPIx); -} - -/** - * @brief Disable error IT - * @note This bit controls the generation of an interrupt when an error condition occurs (OVR, UDR and FRE in I2S mode). - * @rmtoll CR2 ERRIE LL_I2S_DisableIT_ERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableIT_ERR(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableIT_ERR(SPIx); -} - -/** - * @brief Disable Rx buffer not empty IT - * @rmtoll CR2 RXNEIE LL_I2S_DisableIT_RXNE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableIT_RXNE(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableIT_RXNE(SPIx); -} - -/** - * @brief Disable Tx buffer empty IT - * @rmtoll CR2 TXEIE LL_I2S_DisableIT_TXE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableIT_TXE(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableIT_TXE(SPIx); -} - -/** - * @brief Check if ERR IT is enabled - * @rmtoll CR2 ERRIE LL_I2S_IsEnabledIT_ERR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_ERR(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledIT_ERR(SPIx); -} - -/** - * @brief Check if RXNE IT is enabled - * @rmtoll CR2 RXNEIE LL_I2S_IsEnabledIT_RXNE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_RXNE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledIT_RXNE(SPIx); -} - -/** - * @brief Check if TXE IT is enabled - * @rmtoll CR2 TXEIE LL_I2S_IsEnabledIT_TXE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_TXE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledIT_TXE(SPIx); -} - -/** - * @} - */ - -/** @defgroup I2S_LL_EF_DMA DMA Management - * @{ - */ - -/** - * @brief Enable DMA Rx - * @rmtoll CR2 RXDMAEN LL_I2S_EnableDMAReq_RX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableDMAReq_RX(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableDMAReq_RX(SPIx); -} - -/** - * @brief Disable DMA Rx - * @rmtoll CR2 RXDMAEN LL_I2S_DisableDMAReq_RX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableDMAReq_RX(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableDMAReq_RX(SPIx); -} - -/** - * @brief Check if DMA Rx is enabled - * @rmtoll CR2 RXDMAEN LL_I2S_IsEnabledDMAReq_RX - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledDMAReq_RX(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledDMAReq_RX(SPIx); -} - -/** - * @brief Enable DMA Tx - * @rmtoll CR2 TXDMAEN LL_I2S_EnableDMAReq_TX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableDMAReq_TX(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableDMAReq_TX(SPIx); -} - -/** - * @brief Disable DMA Tx - * @rmtoll CR2 TXDMAEN LL_I2S_DisableDMAReq_TX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableDMAReq_TX(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableDMAReq_TX(SPIx); -} - -/** - * @brief Check if DMA Tx is enabled - * @rmtoll CR2 TXDMAEN LL_I2S_IsEnabledDMAReq_TX - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledDMAReq_TX(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledDMAReq_TX(SPIx); -} - -/** - * @} - */ - -/** @defgroup I2S_LL_EF_DATA DATA Management - * @{ - */ - -/** - * @brief Read 16-Bits in data register - * @rmtoll DR DR LL_I2S_ReceiveData16 - * @param SPIx SPI Instance - * @retval RxData Value between Min_Data=0x0000 and Max_Data=0xFFFF - */ -__STATIC_INLINE uint16_t LL_I2S_ReceiveData16(SPI_TypeDef *SPIx) -{ - return LL_SPI_ReceiveData16(SPIx); -} - -/** - * @brief Write 16-Bits in data register - * @rmtoll DR DR LL_I2S_TransmitData16 - * @param SPIx SPI Instance - * @param TxData Value between Min_Data=0x0000 and Max_Data=0xFFFF - * @retval None - */ -__STATIC_INLINE void LL_I2S_TransmitData16(SPI_TypeDef *SPIx, uint16_t TxData) -{ - LL_SPI_TransmitData16(SPIx, TxData); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2S_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -ErrorStatus LL_I2S_DeInit(const SPI_TypeDef *SPIx); -ErrorStatus LL_I2S_Init(SPI_TypeDef *SPIx, LL_I2S_InitTypeDef *I2S_InitStruct); -void LL_I2S_StructInit(LL_I2S_InitTypeDef *I2S_InitStruct); -void LL_I2S_ConfigPrescaler(SPI_TypeDef *SPIx, uint32_t PrescalerLinear, uint32_t PrescalerParity); -#if defined (SPI_I2S_FULLDUPLEX_SUPPORT) -ErrorStatus LL_I2S_InitFullDuplex(SPI_TypeDef *I2Sxext, LL_I2S_InitTypeDef *I2S_InitStruct); -#endif /* SPI_I2S_FULLDUPLEX_SUPPORT */ - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined (SPI1) || defined (SPI2) || defined (SPI3) || defined (SPI4) || defined (SPI5) || defined(SPI6) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_LL_SPI_H */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h deleted file mode 100644 index 84ea5c4..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h +++ /dev/null @@ -1,1711 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_system.h - * @author MCD Application Team - * @brief Header file of SYSTEM LL module. - * - ****************************************************************************** - * @attention - * - *Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The LL SYSTEM driver contains a set of generic APIs that can be - used by user: - (+) Some of the FLASH features need to be handled in the SYSTEM file. - (+) Access to DBGCMU registers - (+) Access to SYSCFG registers - - @endverbatim - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_SYSTEM_H -#define __STM32F4xx_LL_SYSTEM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (FLASH) || defined (SYSCFG) || defined (DBGMCU) - -/** @defgroup SYSTEM_LL SYSTEM - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup SYSTEM_LL_Private_Constants SYSTEM Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SYSTEM_LL_Exported_Constants SYSTEM Exported Constants - * @{ - */ - -/** @defgroup SYSTEM_LL_EC_REMAP SYSCFG REMAP -* @{ -*/ -#define LL_SYSCFG_REMAP_FLASH (uint32_t)0x00000000 /*!< Main Flash memory mapped at 0x00000000 */ -#define LL_SYSCFG_REMAP_SYSTEMFLASH SYSCFG_MEMRMP_MEM_MODE_0 /*!< System Flash memory mapped at 0x00000000 */ -#if defined(FSMC_Bank1) -#define LL_SYSCFG_REMAP_FSMC SYSCFG_MEMRMP_MEM_MODE_1 /*!< FSMC(NOR/PSRAM 1 and 2) mapped at 0x00000000 */ -#endif /* FSMC_Bank1 */ -#if defined(FMC_Bank1) -#define LL_SYSCFG_REMAP_FMC SYSCFG_MEMRMP_MEM_MODE_1 /*!< FMC(NOR/PSRAM 1 and 2) mapped at 0x00000000 */ -#define LL_SYSCFG_REMAP_SDRAM SYSCFG_MEMRMP_MEM_MODE_2 /*!< FMC/SDRAM mapped at 0x00000000 */ -#endif /* FMC_Bank1 */ -#define LL_SYSCFG_REMAP_SRAM (SYSCFG_MEMRMP_MEM_MODE_1 | SYSCFG_MEMRMP_MEM_MODE_0) /*!< SRAM1 mapped at 0x00000000 */ - -/** - * @} - */ - -#if defined(SYSCFG_PMC_MII_RMII_SEL) - /** @defgroup SYSTEM_LL_EC_PMC SYSCFG PMC -* @{ -*/ -#define LL_SYSCFG_PMC_ETHMII (uint32_t)0x00000000 /*!< ETH Media MII interface */ -#define LL_SYSCFG_PMC_ETHRMII (uint32_t)SYSCFG_PMC_MII_RMII_SEL /*!< ETH Media RMII interface */ - -/** - * @} - */ -#endif /* SYSCFG_PMC_MII_RMII_SEL */ - - - -#if defined(SYSCFG_MEMRMP_UFB_MODE) -/** @defgroup SYSTEM_LL_EC_BANKMODE SYSCFG BANK MODE - * @{ - */ -#define LL_SYSCFG_BANKMODE_BANK1 (uint32_t)0x00000000 /*!< Flash Bank 1 base address mapped at 0x0800 0000 (AXI) and 0x0020 0000 (TCM) - and Flash Bank 2 base address mapped at 0x0810 0000 (AXI) and 0x0030 0000 (TCM)*/ -#define LL_SYSCFG_BANKMODE_BANK2 SYSCFG_MEMRMP_UFB_MODE /*!< Flash Bank 2 base address mapped at 0x0800 0000 (AXI) and 0x0020 0000(TCM) - and Flash Bank 1 base address mapped at 0x0810 0000 (AXI) and 0x0030 0000(TCM) */ -/** - * @} - */ -#endif /* SYSCFG_MEMRMP_UFB_MODE */ -/** @defgroup SYSTEM_LL_EC_I2C_FASTMODEPLUS SYSCFG I2C FASTMODEPLUS - * @{ - */ -#if defined(SYSCFG_CFGR_FMPI2C1_SCL) -#define LL_SYSCFG_I2C_FASTMODEPLUS_SCL SYSCFG_CFGR_FMPI2C1_SCL /*!< Enable Fast Mode Plus on FMPI2C_SCL pin */ -#define LL_SYSCFG_I2C_FASTMODEPLUS_SDA SYSCFG_CFGR_FMPI2C1_SDA /*!< Enable Fast Mode Plus on FMPI2C_SDA pin*/ -#endif /* SYSCFG_CFGR_FMPI2C1_SCL */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_EXTI_PORT SYSCFG EXTI PORT - * @{ - */ -#define LL_SYSCFG_EXTI_PORTA (uint32_t)0 /*!< EXTI PORT A */ -#define LL_SYSCFG_EXTI_PORTB (uint32_t)1 /*!< EXTI PORT B */ -#define LL_SYSCFG_EXTI_PORTC (uint32_t)2 /*!< EXTI PORT C */ -#define LL_SYSCFG_EXTI_PORTD (uint32_t)3 /*!< EXTI PORT D */ -#define LL_SYSCFG_EXTI_PORTE (uint32_t)4 /*!< EXTI PORT E */ -#if defined(GPIOF) -#define LL_SYSCFG_EXTI_PORTF (uint32_t)5 /*!< EXTI PORT F */ -#endif /* GPIOF */ -#if defined(GPIOG) -#define LL_SYSCFG_EXTI_PORTG (uint32_t)6 /*!< EXTI PORT G */ -#endif /* GPIOG */ -#define LL_SYSCFG_EXTI_PORTH (uint32_t)7 /*!< EXTI PORT H */ -#if defined(GPIOI) -#define LL_SYSCFG_EXTI_PORTI (uint32_t)8 /*!< EXTI PORT I */ -#endif /* GPIOI */ -#if defined(GPIOJ) -#define LL_SYSCFG_EXTI_PORTJ (uint32_t)9 /*!< EXTI PORT J */ -#endif /* GPIOJ */ -#if defined(GPIOK) -#define LL_SYSCFG_EXTI_PORTK (uint32_t)10 /*!< EXTI PORT k */ -#endif /* GPIOK */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_EXTI_LINE SYSCFG EXTI LINE - * @{ - */ -#define LL_SYSCFG_EXTI_LINE0 (uint32_t)(0x000FU << 16 | 0) /*!< EXTI_POSITION_0 | EXTICR[0] */ -#define LL_SYSCFG_EXTI_LINE1 (uint32_t)(0x00F0U << 16 | 0) /*!< EXTI_POSITION_4 | EXTICR[0] */ -#define LL_SYSCFG_EXTI_LINE2 (uint32_t)(0x0F00U << 16 | 0) /*!< EXTI_POSITION_8 | EXTICR[0] */ -#define LL_SYSCFG_EXTI_LINE3 (uint32_t)(0xF000U << 16 | 0) /*!< EXTI_POSITION_12 | EXTICR[0] */ -#define LL_SYSCFG_EXTI_LINE4 (uint32_t)(0x000FU << 16 | 1) /*!< EXTI_POSITION_0 | EXTICR[1] */ -#define LL_SYSCFG_EXTI_LINE5 (uint32_t)(0x00F0U << 16 | 1) /*!< EXTI_POSITION_4 | EXTICR[1] */ -#define LL_SYSCFG_EXTI_LINE6 (uint32_t)(0x0F00U << 16 | 1) /*!< EXTI_POSITION_8 | EXTICR[1] */ -#define LL_SYSCFG_EXTI_LINE7 (uint32_t)(0xF000U << 16 | 1) /*!< EXTI_POSITION_12 | EXTICR[1] */ -#define LL_SYSCFG_EXTI_LINE8 (uint32_t)(0x000FU << 16 | 2) /*!< EXTI_POSITION_0 | EXTICR[2] */ -#define LL_SYSCFG_EXTI_LINE9 (uint32_t)(0x00F0U << 16 | 2) /*!< EXTI_POSITION_4 | EXTICR[2] */ -#define LL_SYSCFG_EXTI_LINE10 (uint32_t)(0x0F00U << 16 | 2) /*!< EXTI_POSITION_8 | EXTICR[2] */ -#define LL_SYSCFG_EXTI_LINE11 (uint32_t)(0xF000U << 16 | 2) /*!< EXTI_POSITION_12 | EXTICR[2] */ -#define LL_SYSCFG_EXTI_LINE12 (uint32_t)(0x000FU << 16 | 3) /*!< EXTI_POSITION_0 | EXTICR[3] */ -#define LL_SYSCFG_EXTI_LINE13 (uint32_t)(0x00F0U << 16 | 3) /*!< EXTI_POSITION_4 | EXTICR[3] */ -#define LL_SYSCFG_EXTI_LINE14 (uint32_t)(0x0F00U << 16 | 3) /*!< EXTI_POSITION_8 | EXTICR[3] */ -#define LL_SYSCFG_EXTI_LINE15 (uint32_t)(0xF000U << 16 | 3) /*!< EXTI_POSITION_12 | EXTICR[3] */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_TIMBREAK SYSCFG TIMER BREAK - * @{ - */ -#if defined(SYSCFG_CFGR2_LOCKUP_LOCK) -#define LL_SYSCFG_TIMBREAK_LOCKUP SYSCFG_CFGR2_LOCKUP_LOCK /*!< Enables and locks the LOCKUP output of CortexM4 - with Break Input of TIM1/8 */ -#define LL_SYSCFG_TIMBREAK_PVD SYSCFG_CFGR2_PVD_LOCK /*!< Enables and locks the PVD connection with TIM1/8 Break Input - and also the PVDE and PLS bits of the Power Control Interface */ -#endif /* SYSCFG_CFGR2_CLL */ -/** - * @} - */ - -#if defined(SYSCFG_MCHDLYCR_BSCKSEL) -/** @defgroup SYSTEM_LL_DFSDM_BitStream_ClockSource SYSCFG MCHDLY BCKKSEL - * @{ - */ -#define LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 (uint32_t)0x00000000 -#define LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 SYSCFG_MCHDLYCR_BSCKSEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM_MCHDLYEN SYSCFG MCHDLY MCHDLYEN - * @{ - */ -#define LL_SYSCFG_DFSDM1_MCHDLYEN SYSCFG_MCHDLYCR_MCHDLY1EN -#define LL_SYSCFG_DFSDM2_MCHDLYEN SYSCFG_MCHDLYCR_MCHDLY2EN -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM_DataIn0_Source SYSCFG MCHDLY DFSDMD0SEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_DataIn0 SYSCFG_MCHDLYCR_DFSDM1D0SEL -#define LL_SYSCFG_DFSDM2_DataIn0 SYSCFG_MCHDLYCR_DFSDM2D0SEL - -#define LL_SYSCFG_DFSDM1_DataIn0_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D0SEL << 16) | 0x00000000) -#define LL_SYSCFG_DFSDM1_DataIn0_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D0SEL << 16) | SYSCFG_MCHDLYCR_DFSDM1D0SEL) -#define LL_SYSCFG_DFSDM2_DataIn0_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D0SEL << 16) | 0x00000000) -#define LL_SYSCFG_DFSDM2_DataIn0_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D0SEL << 16) | SYSCFG_MCHDLYCR_DFSDM2D0SEL) -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM_DataIn2_Source SYSCFG MCHDLY DFSDMD2SEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_DataIn2 SYSCFG_MCHDLYCR_DFSDM1D2SEL -#define LL_SYSCFG_DFSDM2_DataIn2 SYSCFG_MCHDLYCR_DFSDM2D2SEL - -#define LL_SYSCFG_DFSDM1_DataIn2_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D2SEL << 16) | 0x00000000) -#define LL_SYSCFG_DFSDM1_DataIn2_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D2SEL << 16) | SYSCFG_MCHDLYCR_DFSDM1D2SEL) -#define LL_SYSCFG_DFSDM2_DataIn2_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D2SEL << 16) | 0x00000000) -#define LL_SYSCFG_DFSDM2_DataIn2_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D2SEL << 16) | SYSCFG_MCHDLYCR_DFSDM2D2SEL) -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM1_TIM4OC2_BitstreamDistribution SYSCFG MCHDLY DFSDM1CK02SEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 SYSCFG_MCHDLYCR_DFSDM1CK02SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM1_TIM4OC1_BitstreamDistribution SYSCFG MCHDLY DFSDM1CK13SEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 SYSCFG_MCHDLYCR_DFSDM1CK13SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM1_CLKIN_SourceSelection SYSCFG MCHDLY DFSDMCFG - * @{ - */ -#define LL_SYSCFG_DFSDM1_CKIN_PAD (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM1_CKIN_DM SYSCFG_MCHDLYCR_DFSDM1CFG -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM1_CLKOUT_SourceSelection SYSCFG MCHDLY DFSDM1CKOSEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_CKOUT (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM1_CKOUT_M27 SYSCFG_MCHDLYCR_DFSDM1CKOSEL -/** - * @} - */ - -/** @defgroup SYSTEM_LL_DFSDM2_DataIn4_SourceSelection SYSCFG MCHDLY DFSDM2D4SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_DataIn4_PAD (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_DataIn4_DM SYSCFG_MCHDLYCR_DFSDM2D4SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_DataIn6_SourceSelection SYSCFG MCHDLY DFSDM2D6SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_DataIn6_PAD (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_DataIn6_DM SYSCFG_MCHDLYCR_DFSDM2D6SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC4_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK04SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 SYSCFG_MCHDLYCR_DFSDM2CK04SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC3_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK15SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 SYSCFG_MCHDLYCR_DFSDM2CK15SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC2_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK26SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 SYSCFG_MCHDLYCR_DFSDM2CK26SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC1_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK37SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 SYSCFG_MCHDLYCR_DFSDM2CK37SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_CLKIN_SourceSelection SYSCFG MCHDLY DFSDM2CFG - * @{ - */ -#define LL_SYSCFG_DFSDM2_CKIN_PAD (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_CKIN_DM SYSCFG_MCHDLYCR_DFSDM2CFG -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_CLKOUT_SourceSelection SYSCFG MCHDLY DFSDM2CKOSEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_CKOUT (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_CKOUT_M27 SYSCFG_MCHDLYCR_DFSDM2CKOSEL -/** - * @} - */ -#endif /* SYSCFG_MCHDLYCR_BSCKSEL */ - -/** @defgroup SYSTEM_LL_EC_TRACE DBGMCU TRACE Pin Assignment - * @{ - */ -#define LL_DBGMCU_TRACE_NONE 0x00000000U /*!< TRACE pins not assigned (default state) */ -#define LL_DBGMCU_TRACE_ASYNCH DBGMCU_CR_TRACE_IOEN /*!< TRACE pin assignment for Asynchronous Mode */ -#define LL_DBGMCU_TRACE_SYNCH_SIZE1 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE_0) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 1 */ -#define LL_DBGMCU_TRACE_SYNCH_SIZE2 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE_1) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 2 */ -#define LL_DBGMCU_TRACE_SYNCH_SIZE4 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 4 */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_APB1_GRP1_STOP_IP DBGMCU APB1 GRP1 STOP IP - * @{ - */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM2_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM2_STOP DBGMCU_APB1_FZ_DBG_TIM2_STOP /*!< TIM2 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM2_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM3_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM3_STOP DBGMCU_APB1_FZ_DBG_TIM3_STOP /*!< TIM3 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM3_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM4_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM4_STOP DBGMCU_APB1_FZ_DBG_TIM4_STOP /*!< TIM4 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM4_STOP */ -#define LL_DBGMCU_APB1_GRP1_TIM5_STOP DBGMCU_APB1_FZ_DBG_TIM5_STOP /*!< TIM5 counter stopped when core is halted */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM6_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM6_STOP DBGMCU_APB1_FZ_DBG_TIM6_STOP /*!< TIM6 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM6_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM7_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM7_STOP DBGMCU_APB1_FZ_DBG_TIM7_STOP /*!< TIM7 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM7_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM12_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM12_STOP DBGMCU_APB1_FZ_DBG_TIM12_STOP /*!< TIM12 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM12_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM13_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM13_STOP DBGMCU_APB1_FZ_DBG_TIM13_STOP /*!< TIM13 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM13_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM14_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM14_STOP DBGMCU_APB1_FZ_DBG_TIM14_STOP /*!< TIM14 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM14_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_LPTIM_STOP) -#define LL_DBGMCU_APB1_GRP1_LPTIM_STOP DBGMCU_APB1_FZ_DBG_LPTIM_STOP /*!< LPTIM counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_LPTIM_STOP */ -#define LL_DBGMCU_APB1_GRP1_RTC_STOP DBGMCU_APB1_FZ_DBG_RTC_STOP /*!< RTC counter stopped when core is halted */ -#define LL_DBGMCU_APB1_GRP1_WWDG_STOP DBGMCU_APB1_FZ_DBG_WWDG_STOP /*!< Debug Window Watchdog stopped when Core is halted */ -#define LL_DBGMCU_APB1_GRP1_IWDG_STOP DBGMCU_APB1_FZ_DBG_IWDG_STOP /*!< Debug Independent Watchdog stopped when Core is halted */ -#define LL_DBGMCU_APB1_GRP1_I2C1_STOP DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT /*!< I2C1 SMBUS timeout mode stopped when Core is halted */ -#define LL_DBGMCU_APB1_GRP1_I2C2_STOP DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT /*!< I2C2 SMBUS timeout mode stopped when Core is halted */ -#if defined(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT) -#define LL_DBGMCU_APB1_GRP1_I2C3_STOP DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT /*!< I2C3 SMBUS timeout mode stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT */ -#if defined(DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT) -#define LL_DBGMCU_APB1_GRP1_I2C4_STOP DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT /*!< I2C4 SMBUS timeout mode stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT */ -#if defined(DBGMCU_APB1_FZ_DBG_CAN1_STOP) -#define LL_DBGMCU_APB1_GRP1_CAN1_STOP DBGMCU_APB1_FZ_DBG_CAN1_STOP /*!< CAN1 debug stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_CAN1_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_CAN2_STOP) -#define LL_DBGMCU_APB1_GRP1_CAN2_STOP DBGMCU_APB1_FZ_DBG_CAN2_STOP /*!< CAN2 debug stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_CAN2_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_CAN3_STOP) -#define LL_DBGMCU_APB1_GRP1_CAN3_STOP DBGMCU_APB1_FZ_DBG_CAN3_STOP /*!< CAN3 debug stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_CAN3_STOP */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_APB2_GRP1_STOP_IP DBGMCU APB2 GRP1 STOP IP - * @{ - */ -#define LL_DBGMCU_APB2_GRP1_TIM1_STOP DBGMCU_APB2_FZ_DBG_TIM1_STOP /*!< TIM1 counter stopped when core is halted */ -#if defined(DBGMCU_APB2_FZ_DBG_TIM8_STOP) -#define LL_DBGMCU_APB2_GRP1_TIM8_STOP DBGMCU_APB2_FZ_DBG_TIM8_STOP /*!< TIM8 counter stopped when core is halted */ -#endif /* DBGMCU_APB2_FZ_DBG_TIM8_STOP */ -#define LL_DBGMCU_APB2_GRP1_TIM9_STOP DBGMCU_APB2_FZ_DBG_TIM9_STOP /*!< TIM9 counter stopped when core is halted */ -#if defined(DBGMCU_APB2_FZ_DBG_TIM10_STOP) -#define LL_DBGMCU_APB2_GRP1_TIM10_STOP DBGMCU_APB2_FZ_DBG_TIM10_STOP /*!< TIM10 counter stopped when core is halted */ -#endif /* DBGMCU_APB2_FZ_DBG_TIM10_STOP */ -#define LL_DBGMCU_APB2_GRP1_TIM11_STOP DBGMCU_APB2_FZ_DBG_TIM11_STOP /*!< TIM11 counter stopped when core is halted */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_LATENCY FLASH LATENCY - * @{ - */ -#define LL_FLASH_LATENCY_0 FLASH_ACR_LATENCY_0WS /*!< FLASH Zero wait state */ -#define LL_FLASH_LATENCY_1 FLASH_ACR_LATENCY_1WS /*!< FLASH One wait state */ -#define LL_FLASH_LATENCY_2 FLASH_ACR_LATENCY_2WS /*!< FLASH Two wait states */ -#define LL_FLASH_LATENCY_3 FLASH_ACR_LATENCY_3WS /*!< FLASH Three wait states */ -#define LL_FLASH_LATENCY_4 FLASH_ACR_LATENCY_4WS /*!< FLASH Four wait states */ -#define LL_FLASH_LATENCY_5 FLASH_ACR_LATENCY_5WS /*!< FLASH five wait state */ -#define LL_FLASH_LATENCY_6 FLASH_ACR_LATENCY_6WS /*!< FLASH six wait state */ -#define LL_FLASH_LATENCY_7 FLASH_ACR_LATENCY_7WS /*!< FLASH seven wait states */ -#define LL_FLASH_LATENCY_8 FLASH_ACR_LATENCY_8WS /*!< FLASH eight wait states */ -#define LL_FLASH_LATENCY_9 FLASH_ACR_LATENCY_9WS /*!< FLASH nine wait states */ -#define LL_FLASH_LATENCY_10 FLASH_ACR_LATENCY_10WS /*!< FLASH ten wait states */ -#define LL_FLASH_LATENCY_11 FLASH_ACR_LATENCY_11WS /*!< FLASH eleven wait states */ -#define LL_FLASH_LATENCY_12 FLASH_ACR_LATENCY_12WS /*!< FLASH twelve wait states */ -#define LL_FLASH_LATENCY_13 FLASH_ACR_LATENCY_13WS /*!< FLASH thirteen wait states */ -#define LL_FLASH_LATENCY_14 FLASH_ACR_LATENCY_14WS /*!< FLASH fourteen wait states */ -#define LL_FLASH_LATENCY_15 FLASH_ACR_LATENCY_15WS /*!< FLASH fifteen wait states */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SYSTEM_LL_Exported_Functions SYSTEM Exported Functions - * @{ - */ - -/** @defgroup SYSTEM_LL_EF_SYSCFG SYSCFG - * @{ - */ -/** - * @brief Set memory mapping at address 0x00000000 - * @rmtoll SYSCFG_MEMRMP MEM_MODE LL_SYSCFG_SetRemapMemory - * @param Memory This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_REMAP_FLASH - * @arg @ref LL_SYSCFG_REMAP_SYSTEMFLASH - * @arg @ref LL_SYSCFG_REMAP_SRAM - * @arg @ref LL_SYSCFG_REMAP_FSMC (*) - * @arg @ref LL_SYSCFG_REMAP_FMC (*) - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetRemapMemory(uint32_t Memory) -{ - MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE, Memory); -} - -/** - * @brief Get memory mapping at address 0x00000000 - * @rmtoll SYSCFG_MEMRMP MEM_MODE LL_SYSCFG_GetRemapMemory - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_REMAP_FLASH - * @arg @ref LL_SYSCFG_REMAP_SYSTEMFLASH - * @arg @ref LL_SYSCFG_REMAP_SRAM - * @arg @ref LL_SYSCFG_REMAP_FSMC (*) - * @arg @ref LL_SYSCFG_REMAP_FMC (*) - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetRemapMemory(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE)); -} - -#if defined(SYSCFG_MEMRMP_SWP_FMC) -/** - * @brief Enables the FMC Memory Mapping Swapping - * @rmtoll SYSCFG_MEMRMP SWP_FMC LL_SYSCFG_EnableFMCMemorySwapping - * @note SDRAM is accessible at 0x60000000 and NOR/RAM - * is accessible at 0xC0000000 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_EnableFMCMemorySwapping(void) -{ - SET_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FMC_0); -} - -/** - * @brief Disables the FMC Memory Mapping Swapping - * @rmtoll SYSCFG_MEMRMP SWP_FMC LL_SYSCFG_DisableFMCMemorySwapping - * @note SDRAM is accessible at 0xC0000000 (default mapping) - * and NOR/RAM is accessible at 0x60000000 (default mapping) - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DisableFMCMemorySwapping(void) -{ - CLEAR_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FMC); -} - -#endif /* SYSCFG_MEMRMP_SWP_FMC */ -/** - * @brief Enables the Compensation cell Power Down - * @rmtoll SYSCFG_CMPCR CMP_PD LL_SYSCFG_EnableCompensationCell - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_EnableCompensationCell(void) -{ - SET_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_CMP_PD); -} - -/** - * @brief Disables the Compensation cell Power Down - * @rmtoll SYSCFG_CMPCR CMP_PD LL_SYSCFG_DisableCompensationCell - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DisableCompensationCell(void) -{ - CLEAR_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_CMP_PD); -} - -/** - * @brief Get Compensation Cell ready Flag - * @rmtoll SYSCFG_CMPCR READY LL_SYSCFG_IsActiveFlag_CMPCR - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SYSCFG_IsActiveFlag_CMPCR(void) -{ - return (READ_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_READY) == (SYSCFG_CMPCR_READY)); -} - -#if defined(SYSCFG_PMC_MII_RMII_SEL) -/** - * @brief Select Ethernet PHY interface - * @rmtoll SYSCFG_PMC MII_RMII_SEL LL_SYSCFG_SetPHYInterface - * @param Interface This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_PMC_ETHMII - * @arg @ref LL_SYSCFG_PMC_ETHRMII - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetPHYInterface(uint32_t Interface) -{ - MODIFY_REG(SYSCFG->PMC, SYSCFG_PMC_MII_RMII_SEL, Interface); -} - -/** - * @brief Get Ethernet PHY interface - * @rmtoll SYSCFG_PMC MII_RMII_SEL LL_SYSCFG_GetPHYInterface - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_PMC_ETHMII - * @arg @ref LL_SYSCFG_PMC_ETHRMII - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetPHYInterface(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->PMC, SYSCFG_PMC_MII_RMII_SEL)); -} -#endif /* SYSCFG_PMC_MII_RMII_SEL */ - - - -#if defined(SYSCFG_MEMRMP_UFB_MODE) -/** - * @brief Select Flash bank mode (Bank flashed at 0x08000000) - * @rmtoll SYSCFG_MEMRMP UFB_MODE LL_SYSCFG_SetFlashBankMode - * @param Bank This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_BANKMODE_BANK1 - * @arg @ref LL_SYSCFG_BANKMODE_BANK2 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetFlashBankMode(uint32_t Bank) -{ - MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_UFB_MODE, Bank); -} - -/** - * @brief Get Flash bank mode (Bank flashed at 0x08000000) - * @rmtoll SYSCFG_MEMRMP UFB_MODE LL_SYSCFG_GetFlashBankMode - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_BANKMODE_BANK1 - * @arg @ref LL_SYSCFG_BANKMODE_BANK2 - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetFlashBankMode(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_UFB_MODE)); -} -#endif /* SYSCFG_MEMRMP_UFB_MODE */ - -#if defined(SYSCFG_CFGR_FMPI2C1_SCL) -/** - * @brief Enable the I2C fast mode plus driving capability. - * @rmtoll SYSCFG_CFGR FMPI2C1_SCL LL_SYSCFG_EnableFastModePlus\n - * SYSCFG_CFGR FMPI2C1_SDA LL_SYSCFG_EnableFastModePlus - * @param ConfigFastModePlus This parameter can be a combination of the following values: - * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SCL - * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SDA - * (*) value not defined in all devices - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_EnableFastModePlus(uint32_t ConfigFastModePlus) -{ - SET_BIT(SYSCFG->CFGR, ConfigFastModePlus); -} - -/** - * @brief Disable the I2C fast mode plus driving capability. - * @rmtoll SYSCFG_CFGR FMPI2C1_SCL LL_SYSCFG_DisableFastModePlus\n - * SYSCFG_CFGR FMPI2C1_SDA LL_SYSCFG_DisableFastModePlus\n - * @param ConfigFastModePlus This parameter can be a combination of the following values: - * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SCL - * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SDA - * (*) value not defined in all devices - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DisableFastModePlus(uint32_t ConfigFastModePlus) -{ - CLEAR_BIT(SYSCFG->CFGR, ConfigFastModePlus); -} -#endif /* SYSCFG_CFGR_FMPI2C1_SCL */ - -/** - * @brief Configure source input for the EXTI external interrupt. - * @rmtoll SYSCFG_EXTICR1 EXTIx LL_SYSCFG_SetEXTISource\n - * SYSCFG_EXTICR2 EXTIx LL_SYSCFG_SetEXTISource\n - * SYSCFG_EXTICR3 EXTIx LL_SYSCFG_SetEXTISource\n - * SYSCFG_EXTICR4 EXTIx LL_SYSCFG_SetEXTISource - * @param Port This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_EXTI_PORTA - * @arg @ref LL_SYSCFG_EXTI_PORTB - * @arg @ref LL_SYSCFG_EXTI_PORTC - * @arg @ref LL_SYSCFG_EXTI_PORTD - * @arg @ref LL_SYSCFG_EXTI_PORTE - * @arg @ref LL_SYSCFG_EXTI_PORTF (*) - * @arg @ref LL_SYSCFG_EXTI_PORTG (*) - * @arg @ref LL_SYSCFG_EXTI_PORTH - * - * (*) value not defined in all devices - * @param Line This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_EXTI_LINE0 - * @arg @ref LL_SYSCFG_EXTI_LINE1 - * @arg @ref LL_SYSCFG_EXTI_LINE2 - * @arg @ref LL_SYSCFG_EXTI_LINE3 - * @arg @ref LL_SYSCFG_EXTI_LINE4 - * @arg @ref LL_SYSCFG_EXTI_LINE5 - * @arg @ref LL_SYSCFG_EXTI_LINE6 - * @arg @ref LL_SYSCFG_EXTI_LINE7 - * @arg @ref LL_SYSCFG_EXTI_LINE8 - * @arg @ref LL_SYSCFG_EXTI_LINE9 - * @arg @ref LL_SYSCFG_EXTI_LINE10 - * @arg @ref LL_SYSCFG_EXTI_LINE11 - * @arg @ref LL_SYSCFG_EXTI_LINE12 - * @arg @ref LL_SYSCFG_EXTI_LINE13 - * @arg @ref LL_SYSCFG_EXTI_LINE14 - * @arg @ref LL_SYSCFG_EXTI_LINE15 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetEXTISource(uint32_t Port, uint32_t Line) -{ - MODIFY_REG(SYSCFG->EXTICR[Line & 0xFF], (Line >> 16), Port << POSITION_VAL((Line >> 16))); -} - -/** - * @brief Get the configured defined for specific EXTI Line - * @rmtoll SYSCFG_EXTICR1 EXTIx LL_SYSCFG_GetEXTISource\n - * SYSCFG_EXTICR2 EXTIx LL_SYSCFG_GetEXTISource\n - * SYSCFG_EXTICR3 EXTIx LL_SYSCFG_GetEXTISource\n - * SYSCFG_EXTICR4 EXTIx LL_SYSCFG_GetEXTISource - * @param Line This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_EXTI_LINE0 - * @arg @ref LL_SYSCFG_EXTI_LINE1 - * @arg @ref LL_SYSCFG_EXTI_LINE2 - * @arg @ref LL_SYSCFG_EXTI_LINE3 - * @arg @ref LL_SYSCFG_EXTI_LINE4 - * @arg @ref LL_SYSCFG_EXTI_LINE5 - * @arg @ref LL_SYSCFG_EXTI_LINE6 - * @arg @ref LL_SYSCFG_EXTI_LINE7 - * @arg @ref LL_SYSCFG_EXTI_LINE8 - * @arg @ref LL_SYSCFG_EXTI_LINE9 - * @arg @ref LL_SYSCFG_EXTI_LINE10 - * @arg @ref LL_SYSCFG_EXTI_LINE11 - * @arg @ref LL_SYSCFG_EXTI_LINE12 - * @arg @ref LL_SYSCFG_EXTI_LINE13 - * @arg @ref LL_SYSCFG_EXTI_LINE14 - * @arg @ref LL_SYSCFG_EXTI_LINE15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_EXTI_PORTA - * @arg @ref LL_SYSCFG_EXTI_PORTB - * @arg @ref LL_SYSCFG_EXTI_PORTC - * @arg @ref LL_SYSCFG_EXTI_PORTD - * @arg @ref LL_SYSCFG_EXTI_PORTE - * @arg @ref LL_SYSCFG_EXTI_PORTF (*) - * @arg @ref LL_SYSCFG_EXTI_PORTG (*) - * @arg @ref LL_SYSCFG_EXTI_PORTH - * (*) value not defined in all devices - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetEXTISource(uint32_t Line) -{ - return (uint32_t)(READ_BIT(SYSCFG->EXTICR[Line & 0xFF], (Line >> 16)) >> POSITION_VAL(Line >> 16)); -} - -#if defined(SYSCFG_CFGR2_LOCKUP_LOCK) -/** - * @brief Set connections to TIM1/8 break inputs - * @rmtoll SYSCFG_CFGR2 LockUp Lock LL_SYSCFG_SetTIMBreakInputs \n - * SYSCFG_CFGR2 PVD Lock LL_SYSCFG_SetTIMBreakInputs - * @param Break This parameter can be a combination of the following values: - * @arg @ref LL_SYSCFG_TIMBREAK_LOCKUP - * @arg @ref LL_SYSCFG_TIMBREAK_PVD - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetTIMBreakInputs(uint32_t Break) -{ - MODIFY_REG(SYSCFG->CFGR2, SYSCFG_CFGR2_LOCKUP_LOCK | SYSCFG_CFGR2_PVD_LOCK, Break); -} - -/** - * @brief Get connections to TIM1/8 Break inputs - * @rmtoll SYSCFG_CFGR2 LockUp Lock LL_SYSCFG_SetTIMBreakInputs \n - * SYSCFG_CFGR2 PVD Lock LL_SYSCFG_SetTIMBreakInputs - * @retval Returned value can be can be a combination of the following values: - * @arg @ref LL_SYSCFG_TIMBREAK_LOCKUP - * @arg @ref LL_SYSCFG_TIMBREAK_PVD - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetTIMBreakInputs(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->CFGR2, SYSCFG_CFGR2_LOCKUP_LOCK | SYSCFG_CFGR2_PVD_LOCK)); -} -#endif /* SYSCFG_CFGR2_LOCKUP_LOCK */ -#if defined(SYSCFG_MCHDLYCR_BSCKSEL) -/** - * @brief Select the DFSDM2 or TIM2_OC1 as clock source for the bitstream clock. - * @rmtoll SYSCFG_MCHDLYCR BSCKSEL LL_SYSCFG_DFSDM_SetBitstreamClockSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 - * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_SetBitstreamClockSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_BSCKSEL, ClockSource); -} -/** - * @brief Get the DFSDM2 or TIM2_OC1 as clock source for the bitstream clock. - * @rmtoll SYSCFG_MCHDLYCR BSCKSEL LL_SYSCFG_DFSDM_GetBitstreamClockSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 - * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetBitstreamClockSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_BSCKSEL)); -} -/** - * @brief Enables the DFSDM1 or DFSDM2 Delay clock - * @rmtoll SYSCFG_MCHDLYCR MCHDLYEN LL_SYSCFG_DFSDM_EnableDelayClock - * @param MCHDLY This parameter can be one of the following values - * @arg @ref LL_SYSCFG_DFSDM1_MCHDLYEN - * @arg @ref LL_SYSCFG_DFSDM2_MCHDLYEN - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_EnableDelayClock(uint32_t MCHDLY) -{ - SET_BIT(SYSCFG->MCHDLYCR, MCHDLY); -} - -/** - * @brief Disables the DFSDM1 or the DFSDM2 Delay clock - * @rmtoll SYSCFG_MCHDLYCR MCHDLY1EN LL_SYSCFG_DFSDM1_DisableDelayClock - * @param MCHDLY This parameter can be one of the following values - * @arg @ref LL_SYSCFG_DFSDM1_MCHDLYEN - * @arg @ref LL_SYSCFG_DFSDM2_MCHDLYEN - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_DisableDelayClock(uint32_t MCHDLY) -{ - CLEAR_BIT(SYSCFG->MCHDLYCR, MCHDLY); -} - -/** - * @brief Select the source for DFSDM1 or DFSDM2 DatIn0 - * @rmtoll SYSCFG_MCHDLYCR DFSDMD0SEL LL_SYSCFG_DFSDM_SetDataIn0Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_DM - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_SetDataIn0Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, (Source >> 16), (Source & 0x0000FFFF)); -} -/** - * @brief Get the source for DFSDM1 or DFSDM2 DatIn0. - * @rmtoll SYSCFG_MCHDLYCR DFSDMD0SEL LL_SYSCFG_DFSDM_GetDataIn0Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0 - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0 - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_DM - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetDataIn0Source(uint32_t Source) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, Source)); -} -/** - * @brief Select the source for DFSDM1 or DFSDM2 DatIn2 - * @rmtoll SYSCFG_MCHDLYCR DFSDMD2SEL LL_SYSCFG_DFSDM_SetDataIn2Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_DM - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_SetDataIn2Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, (Source >> 16), (Source & 0x0000FFFF)); -} -/** - * @brief Get the source for DFSDM1 or DFSDM2 DatIn2. - * @rmtoll SYSCFG_MCHDLYCR DFSDMD2SEL LL_SYSCFG_DFSDM_GetDataIn2Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2 - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2 - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_DM - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetDataIn2Source(uint32_t Source) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, Source)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM4 OC2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CK02SEL LL_SYSCFG_DFSDM1_SetTIM4OC2BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetTIM4OC2BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK02SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM4 OC2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM1D2SEL LL_SYSCFG_DFSDM1_GetTIM4OC2BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetTIM4OC2BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK02SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM4 OC1 - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CK13SEL LL_SYSCFG_DFSDM1_SetTIM4OC1BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetTIM4OC1BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK13SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM4 OC1 - * @rmtoll SYSCFG_MCHDLYCR DFSDM1D2SEL LL_SYSCFG_DFSDM1_GetTIM4OC1BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetTIM4OC1BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK13SEL)); -} - -/** - * @brief Select the DFSDM1 Clock In - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CFG LL_SYSCFG_DFSDM1_SetClockInSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_CKIN_PAD - * @arg @ref LL_SYSCFG_DFSDM1_CKIN_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetClockInSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CFG, ClockSource); -} -/** - * @brief GET the DFSDM1 Clock In - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CFG LL_SYSCFG_DFSDM1_GetClockInSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_CKIN_PAD - * @arg @ref LL_SYSCFG_DFSDM1_CKIN_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetClockInSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CFG)); -} - -/** - * @brief Select the DFSDM1 Clock Out - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CKOSEL LL_SYSCFG_DFSDM1_SetClockOutSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_CKOUT - * @arg @ref LL_SYSCFG_DFSDM1_CKOUT_M27 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetClockOutSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CKOSEL, ClockSource); -} -/** - * @brief GET the DFSDM1 Clock Out - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CKOSEL LL_SYSCFG_DFSDM1_GetClockOutSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_CKOUT - * @arg @ref LL_SYSCFG_DFSDM1_CKOUT_M27 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetClockOutSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CKOSEL)); -} - -/** - * @brief Enables the DFSDM2 Delay clock - * @rmtoll SYSCFG_MCHDLYCR MCHDLY2EN LL_SYSCFG_DFSDM2_EnableDelayClock - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_EnableDelayClock(void) -{ - SET_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_MCHDLY2EN); -} - -/** - * @brief Disables the DFSDM2 Delay clock - * @rmtoll SYSCFG_MCHDLYCR MCHDLY2EN LL_SYSCFG_DFSDM2_DisableDelayClock - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_DisableDelayClock(void) -{ - CLEAR_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_MCHDLY2EN); -} -/** - * @brief Select the source for DFSDM2 DatIn0 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D0SEL LL_SYSCFG_DFSDM2_SetDataIn0Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn0Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D0SEL, Source); -} -/** - * @brief Get the source for DFSDM2 DatIn0. - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D0SEL LL_SYSCFG_DFSDM2_GetDataIn0Source - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn0Source(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D0SEL)); -} - -/** - * @brief Select the source for DFSDM2 DatIn2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D2SEL LL_SYSCFG_DFSDM2_SetDataIn2Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn2Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D2SEL, Source); -} -/** - * @brief Get the source for DFSDM2 DatIn2. - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D2SEL LL_SYSCFG_DFSDM2_GetDataIn2Source - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn2Source(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D2SEL)); -} - -/** - * @brief Select the source for DFSDM2 DatIn4 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D4SEL LL_SYSCFG_DFSDM2_SetDataIn4Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn4Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D4SEL, Source); -} -/** - * @brief Get the source for DFSDM2 DatIn4. - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D4SEL LL_SYSCFG_DFSDM2_GetDataIn4Source - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn4Source(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D4SEL)); -} - -/** - * @brief Select the source for DFSDM2 DatIn6 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D6SEL LL_SYSCFG_DFSDM2_SetDataIn6Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn6Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D6SEL, Source); -} -/** - * @brief Get the source for DFSDM2 DatIn6. - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D6SEL LL_SYSCFG_DFSDM2_GetDataIn6Source - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn6Source(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D6SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM3 OC4 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_SetTIM3OC4BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC4BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK04SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM3 OC4 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC4BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC4BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK04SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM3 OC3 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK15SEL LL_SYSCFG_DFSDM2_SetTIM3OC3BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC3BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK15SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM3 OC4 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC3BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC3BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK15SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM3 OC2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK26SEL LL_SYSCFG_DFSDM2_SetTIM3OC2BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC2BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK26SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM3 OC2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC2BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC2BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK26SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM3 OC1 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK37SEL LL_SYSCFG_DFSDM2_SetTIM3OC1BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC1BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK37SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM3 OC1 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK37SEL LL_SYSCFG_DFSDM2_GetTIM3OC1BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC1BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK37SEL)); -} - -/** - * @brief Select the DFSDM2 Clock In - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CFG LL_SYSCFG_DFSDM2_SetClockInSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_CKIN_PAD - * @arg @ref LL_SYSCFG_DFSDM2_CKIN_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetClockInSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CFG, ClockSource); -} -/** - * @brief GET the DFSDM2 Clock In - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CFG LL_SYSCFG_DFSDM2_GetClockInSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_CKIN_PAD - * @arg @ref LL_SYSCFG_DFSDM2_CKIN_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetClockInSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CFG)); -} - -/** - * @brief Select the DFSDM2 Clock Out - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CKOSEL LL_SYSCFG_DFSDM2_SetClockOutSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_CKOUT - * @arg @ref LL_SYSCFG_DFSDM2_CKOUT_M27 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetClockOutSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CKOSEL, ClockSource); -} -/** - * @brief GET the DFSDM2 Clock Out - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CKOSEL LL_SYSCFG_DFSDM2_GetClockOutSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_CKOUT - * @arg @ref LL_SYSCFG_DFSDM2_CKOUT_M27 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetClockOutSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CKOSEL)); -} - -#endif /* SYSCFG_MCHDLYCR_BSCKSEL */ -/** - * @} - */ - - -/** @defgroup SYSTEM_LL_EF_DBGMCU DBGMCU - * @{ - */ - -/** - * @brief Return the device identifier - * @note For STM32F405/407xx and STM32F415/417xx devices, the device ID is 0x413 - * @note For STM32F42xxx and STM32F43xxx devices, the device ID is 0x419 - * @note For STM32F401xx devices, the device ID is 0x423 - * @note For STM32F401xx devices, the device ID is 0x433 - * @note For STM32F411xx devices, the device ID is 0x431 - * @note For STM32F410xx devices, the device ID is 0x458 - * @note For STM32F412xx devices, the device ID is 0x441 - * @note For STM32F413xx and STM32423xx devices, the device ID is 0x463 - * @note For STM32F446xx devices, the device ID is 0x421 - * @note For STM32F469xx and STM32F479xx devices, the device ID is 0x434 - * @rmtoll DBGMCU_IDCODE DEV_ID LL_DBGMCU_GetDeviceID - * @retval Values between Min_Data=0x00 and Max_Data=0xFFF - */ -__STATIC_INLINE uint32_t LL_DBGMCU_GetDeviceID(void) -{ - return (uint32_t)(READ_BIT(DBGMCU->IDCODE, DBGMCU_IDCODE_DEV_ID)); -} - -/** - * @brief Return the device revision identifier - * @note This field indicates the revision of the device. - For example, it is read as RevA -> 0x1000, Cat 2 revZ -> 0x1001, rev1 -> 0x1003, rev2 ->0x1007, revY -> 0x100F for STM32F405/407xx and STM32F415/417xx devices - For example, it is read as RevA -> 0x1000, Cat 2 revY -> 0x1003, rev1 -> 0x1007, rev3 ->0x2001 for STM32F42xxx and STM32F43xxx devices - For example, it is read as RevZ -> 0x1000, Cat 2 revA -> 0x1001 for STM32F401xB/C devices - For example, it is read as RevA -> 0x1000, Cat 2 revZ -> 0x1001 for STM32F401xD/E devices - For example, it is read as RevA -> 0x1000 for STM32F411xx,STM32F413/423xx,STM32F469/423xx, STM32F446xx and STM32F410xx devices - For example, it is read as RevZ -> 0x1001, Cat 2 revB -> 0x2000, revC -> 0x3000 for STM32F412xx devices - * @rmtoll DBGMCU_IDCODE REV_ID LL_DBGMCU_GetRevisionID - * @retval Values between Min_Data=0x00 and Max_Data=0xFFFF - */ -__STATIC_INLINE uint32_t LL_DBGMCU_GetRevisionID(void) -{ - return (uint32_t)(READ_BIT(DBGMCU->IDCODE, DBGMCU_IDCODE_REV_ID) >> DBGMCU_IDCODE_REV_ID_Pos); -} - -/** - * @brief Enable the Debug Module during SLEEP mode - * @rmtoll DBGMCU_CR DBG_SLEEP LL_DBGMCU_EnableDBGSleepMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_EnableDBGSleepMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Disable the Debug Module during SLEEP mode - * @rmtoll DBGMCU_CR DBG_SLEEP LL_DBGMCU_DisableDBGSleepMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_DisableDBGSleepMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Enable the Debug Module during STOP mode - * @rmtoll DBGMCU_CR DBG_STOP LL_DBGMCU_EnableDBGStopMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_EnableDBGStopMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Disable the Debug Module during STOP mode - * @rmtoll DBGMCU_CR DBG_STOP LL_DBGMCU_DisableDBGStopMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_DisableDBGStopMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Enable the Debug Module during STANDBY mode - * @rmtoll DBGMCU_CR DBG_STANDBY LL_DBGMCU_EnableDBGStandbyMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_EnableDBGStandbyMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Disable the Debug Module during STANDBY mode - * @rmtoll DBGMCU_CR DBG_STANDBY LL_DBGMCU_DisableDBGStandbyMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_DisableDBGStandbyMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Set Trace pin assignment control - * @rmtoll DBGMCU_CR TRACE_IOEN LL_DBGMCU_SetTracePinAssignment\n - * DBGMCU_CR TRACE_MODE LL_DBGMCU_SetTracePinAssignment - * @param PinAssignment This parameter can be one of the following values: - * @arg @ref LL_DBGMCU_TRACE_NONE - * @arg @ref LL_DBGMCU_TRACE_ASYNCH - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE1 - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE2 - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE4 - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_SetTracePinAssignment(uint32_t PinAssignment) -{ - MODIFY_REG(DBGMCU->CR, DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE, PinAssignment); -} - -/** - * @brief Get Trace pin assignment control - * @rmtoll DBGMCU_CR TRACE_IOEN LL_DBGMCU_GetTracePinAssignment\n - * DBGMCU_CR TRACE_MODE LL_DBGMCU_GetTracePinAssignment - * @retval Returned value can be one of the following values: - * @arg @ref LL_DBGMCU_TRACE_NONE - * @arg @ref LL_DBGMCU_TRACE_ASYNCH - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE1 - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE2 - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE4 - */ -__STATIC_INLINE uint32_t LL_DBGMCU_GetTracePinAssignment(void) -{ - return (uint32_t)(READ_BIT(DBGMCU->CR, DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE)); -} - -/** - * @brief Freeze APB1 peripherals (group1 peripherals) - * @rmtoll DBGMCU_APB1_FZ DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_LPTIM_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C3_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C4_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN1_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN2_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN3_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM2_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM3_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM4_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM5_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM6_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM7_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM12_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM13_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM14_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_LPTIM_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_RTC_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_WWDG_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_IWDG_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C1_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C2_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C3_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C4_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN1_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN2_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN3_STOP (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_APB1_GRP1_FreezePeriph(uint32_t Periphs) -{ - SET_BIT(DBGMCU->APB1FZ, Periphs); -} - -/** - * @brief Unfreeze APB1 peripherals (group1 peripherals) - * @rmtoll DBGMCU_APB1_FZ DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_LPTIM_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C3_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C4_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN1_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN2_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN3_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM2_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM3_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM4_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM5_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM6_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM7_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM12_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM13_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM14_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_LPTIM_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_RTC_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_WWDG_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_IWDG_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C1_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C2_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C3_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C4_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN1_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN2_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN3_STOP (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_APB1_GRP1_UnFreezePeriph(uint32_t Periphs) -{ - CLEAR_BIT(DBGMCU->APB1FZ, Periphs); -} - -/** - * @brief Freeze APB2 peripherals - * @rmtoll DBGMCU_APB2_FZ DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM9_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM10_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM11_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM1_STOP - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM8_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM9_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM10_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM11_STOP (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_APB2_GRP1_FreezePeriph(uint32_t Periphs) -{ - SET_BIT(DBGMCU->APB2FZ, Periphs); -} - -/** - * @brief Unfreeze APB2 peripherals - * @rmtoll DBGMCU_APB2_FZ DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM9_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM10_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM11_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM1_STOP - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM8_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM9_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM10_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM11_STOP (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_APB2_GRP1_UnFreezePeriph(uint32_t Periphs) -{ - CLEAR_BIT(DBGMCU->APB2FZ, Periphs); -} -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EF_FLASH FLASH - * @{ - */ - -/** - * @brief Set FLASH Latency - * @rmtoll FLASH_ACR LATENCY LL_FLASH_SetLatency - * @param Latency This parameter can be one of the following values: - * @arg @ref LL_FLASH_LATENCY_0 - * @arg @ref LL_FLASH_LATENCY_1 - * @arg @ref LL_FLASH_LATENCY_2 - * @arg @ref LL_FLASH_LATENCY_3 - * @arg @ref LL_FLASH_LATENCY_4 - * @arg @ref LL_FLASH_LATENCY_5 - * @arg @ref LL_FLASH_LATENCY_6 - * @arg @ref LL_FLASH_LATENCY_7 - * @arg @ref LL_FLASH_LATENCY_8 - * @arg @ref LL_FLASH_LATENCY_9 - * @arg @ref LL_FLASH_LATENCY_10 - * @arg @ref LL_FLASH_LATENCY_11 - * @arg @ref LL_FLASH_LATENCY_12 - * @arg @ref LL_FLASH_LATENCY_13 - * @arg @ref LL_FLASH_LATENCY_14 - * @arg @ref LL_FLASH_LATENCY_15 - * @retval None - */ -__STATIC_INLINE void LL_FLASH_SetLatency(uint32_t Latency) -{ - MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, Latency); -} - -/** - * @brief Get FLASH Latency - * @rmtoll FLASH_ACR LATENCY LL_FLASH_GetLatency - * @retval Returned value can be one of the following values: - * @arg @ref LL_FLASH_LATENCY_0 - * @arg @ref LL_FLASH_LATENCY_1 - * @arg @ref LL_FLASH_LATENCY_2 - * @arg @ref LL_FLASH_LATENCY_3 - * @arg @ref LL_FLASH_LATENCY_4 - * @arg @ref LL_FLASH_LATENCY_5 - * @arg @ref LL_FLASH_LATENCY_6 - * @arg @ref LL_FLASH_LATENCY_7 - * @arg @ref LL_FLASH_LATENCY_8 - * @arg @ref LL_FLASH_LATENCY_9 - * @arg @ref LL_FLASH_LATENCY_10 - * @arg @ref LL_FLASH_LATENCY_11 - * @arg @ref LL_FLASH_LATENCY_12 - * @arg @ref LL_FLASH_LATENCY_13 - * @arg @ref LL_FLASH_LATENCY_14 - * @arg @ref LL_FLASH_LATENCY_15 - */ -__STATIC_INLINE uint32_t LL_FLASH_GetLatency(void) -{ - return (uint32_t)(READ_BIT(FLASH->ACR, FLASH_ACR_LATENCY)); -} - -/** - * @brief Enable Prefetch - * @rmtoll FLASH_ACR PRFTEN LL_FLASH_EnablePrefetch - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnablePrefetch(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_PRFTEN); -} - -/** - * @brief Disable Prefetch - * @rmtoll FLASH_ACR PRFTEN LL_FLASH_DisablePrefetch - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisablePrefetch(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_PRFTEN); -} - -/** - * @brief Check if Prefetch buffer is enabled - * @rmtoll FLASH_ACR PRFTEN LL_FLASH_IsPrefetchEnabled - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_FLASH_IsPrefetchEnabled(void) -{ - return (READ_BIT(FLASH->ACR, FLASH_ACR_PRFTEN) == (FLASH_ACR_PRFTEN)); -} - -/** - * @brief Enable Instruction cache - * @rmtoll FLASH_ACR ICEN LL_FLASH_EnableInstCache - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnableInstCache(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_ICEN); -} - -/** - * @brief Disable Instruction cache - * @rmtoll FLASH_ACR ICEN LL_FLASH_DisableInstCache - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisableInstCache(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_ICEN); -} - -/** - * @brief Enable Data cache - * @rmtoll FLASH_ACR DCEN LL_FLASH_EnableDataCache - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnableDataCache(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_DCEN); -} - -/** - * @brief Disable Data cache - * @rmtoll FLASH_ACR DCEN LL_FLASH_DisableDataCache - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisableDataCache(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_DCEN); -} - -/** - * @brief Enable Instruction cache reset - * @note bit can be written only when the instruction cache is disabled - * @rmtoll FLASH_ACR ICRST LL_FLASH_EnableInstCacheReset - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnableInstCacheReset(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_ICRST); -} - -/** - * @brief Disable Instruction cache reset - * @rmtoll FLASH_ACR ICRST LL_FLASH_DisableInstCacheReset - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisableInstCacheReset(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_ICRST); -} - -/** - * @brief Enable Data cache reset - * @note bit can be written only when the data cache is disabled - * @rmtoll FLASH_ACR DCRST LL_FLASH_EnableDataCacheReset - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnableDataCacheReset(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_DCRST); -} - -/** - * @brief Disable Data cache reset - * @rmtoll FLASH_ACR DCRST LL_FLASH_DisableDataCacheReset - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisableDataCacheReset(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_DCRST); -} - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined (FLASH) || defined (SYSCFG) || defined (DBGMCU) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_SYSTEM_H */ - - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h deleted file mode 100644 index a11f561..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h +++ /dev/null @@ -1,4096 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_tim.h - * @author MCD Application Team - * @brief Header file of TIM LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_TIM_H -#define __STM32F4xx_LL_TIM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (TIM1) || defined (TIM2) || defined (TIM3) || defined (TIM4) || defined (TIM5) || defined (TIM6) || defined (TIM7) || defined (TIM8) || defined (TIM9) || defined (TIM10) || defined (TIM11) || defined (TIM12) || defined (TIM13) || defined (TIM14) - -/** @defgroup TIM_LL TIM - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup TIM_LL_Private_Variables TIM Private Variables - * @{ - */ -static const uint8_t OFFSET_TAB_CCMRx[] = -{ - 0x00U, /* 0: TIMx_CH1 */ - 0x00U, /* 1: TIMx_CH1N */ - 0x00U, /* 2: TIMx_CH2 */ - 0x00U, /* 3: TIMx_CH2N */ - 0x04U, /* 4: TIMx_CH3 */ - 0x04U, /* 5: TIMx_CH3N */ - 0x04U /* 6: TIMx_CH4 */ -}; - -static const uint8_t SHIFT_TAB_OCxx[] = -{ - 0U, /* 0: OC1M, OC1FE, OC1PE */ - 0U, /* 1: - NA */ - 8U, /* 2: OC2M, OC2FE, OC2PE */ - 0U, /* 3: - NA */ - 0U, /* 4: OC3M, OC3FE, OC3PE */ - 0U, /* 5: - NA */ - 8U /* 6: OC4M, OC4FE, OC4PE */ -}; - -static const uint8_t SHIFT_TAB_ICxx[] = -{ - 0U, /* 0: CC1S, IC1PSC, IC1F */ - 0U, /* 1: - NA */ - 8U, /* 2: CC2S, IC2PSC, IC2F */ - 0U, /* 3: - NA */ - 0U, /* 4: CC3S, IC3PSC, IC3F */ - 0U, /* 5: - NA */ - 8U /* 6: CC4S, IC4PSC, IC4F */ -}; - -static const uint8_t SHIFT_TAB_CCxP[] = -{ - 0U, /* 0: CC1P */ - 2U, /* 1: CC1NP */ - 4U, /* 2: CC2P */ - 6U, /* 3: CC2NP */ - 8U, /* 4: CC3P */ - 10U, /* 5: CC3NP */ - 12U /* 6: CC4P */ -}; - -static const uint8_t SHIFT_TAB_OISx[] = -{ - 0U, /* 0: OIS1 */ - 1U, /* 1: OIS1N */ - 2U, /* 2: OIS2 */ - 3U, /* 3: OIS2N */ - 4U, /* 4: OIS3 */ - 5U, /* 5: OIS3N */ - 6U /* 6: OIS4 */ -}; -/** - * @} - */ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup TIM_LL_Private_Constants TIM Private Constants - * @{ - */ - - -/* Remap mask definitions */ -#define TIMx_OR_RMP_SHIFT 16U -#define TIMx_OR_RMP_MASK 0x0000FFFFU -#define TIM2_OR_RMP_MASK (TIM_OR_ITR1_RMP << TIMx_OR_RMP_SHIFT) -#define TIM5_OR_RMP_MASK (TIM_OR_TI4_RMP << TIMx_OR_RMP_SHIFT) -#define TIM11_OR_RMP_MASK (TIM_OR_TI1_RMP << TIMx_OR_RMP_SHIFT) - -/* Mask used to set the TDG[x:0] of the DTG bits of the TIMx_BDTR register */ -#define DT_DELAY_1 ((uint8_t)0x7F) -#define DT_DELAY_2 ((uint8_t)0x3F) -#define DT_DELAY_3 ((uint8_t)0x1F) -#define DT_DELAY_4 ((uint8_t)0x1F) - -/* Mask used to set the DTG[7:5] bits of the DTG bits of the TIMx_BDTR register */ -#define DT_RANGE_1 ((uint8_t)0x00) -#define DT_RANGE_2 ((uint8_t)0x80) -#define DT_RANGE_3 ((uint8_t)0xC0) -#define DT_RANGE_4 ((uint8_t)0xE0) - - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup TIM_LL_Private_Macros TIM Private Macros - * @{ - */ -/** @brief Convert channel id into channel index. - * @param __CHANNEL__ This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval none - */ -#define TIM_GET_CHANNEL_INDEX( __CHANNEL__) \ - (((__CHANNEL__) == LL_TIM_CHANNEL_CH1) ? 0U :\ - ((__CHANNEL__) == LL_TIM_CHANNEL_CH1N) ? 1U :\ - ((__CHANNEL__) == LL_TIM_CHANNEL_CH2) ? 2U :\ - ((__CHANNEL__) == LL_TIM_CHANNEL_CH2N) ? 3U :\ - ((__CHANNEL__) == LL_TIM_CHANNEL_CH3) ? 4U :\ - ((__CHANNEL__) == LL_TIM_CHANNEL_CH3N) ? 5U : 6U) - -/** @brief Calculate the deadtime sampling period(in ps). - * @param __TIMCLK__ timer input clock frequency (in Hz). - * @param __CKD__ This parameter can be one of the following values: - * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 - * @retval none - */ -#define TIM_CALC_DTS(__TIMCLK__, __CKD__) \ - (((__CKD__) == LL_TIM_CLOCKDIVISION_DIV1) ? ((uint64_t)1000000000000U/(__TIMCLK__)) : \ - ((__CKD__) == LL_TIM_CLOCKDIVISION_DIV2) ? ((uint64_t)1000000000000U/((__TIMCLK__) >> 1U)) : \ - ((uint64_t)1000000000000U/((__TIMCLK__) >> 2U))) -/** - * @} - */ - - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup TIM_LL_ES_INIT TIM Exported Init structure - * @{ - */ - -/** - * @brief TIM Time Base configuration structure definition. - */ -typedef struct -{ - uint16_t Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. - This parameter can be a number between Min_Data=0x0000 and Max_Data=0xFFFF. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetPrescaler().*/ - - uint32_t CounterMode; /*!< Specifies the counter mode. - This parameter can be a value of @ref TIM_LL_EC_COUNTERMODE. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetCounterMode().*/ - - uint32_t Autoreload; /*!< Specifies the auto reload value to be loaded into the active - Auto-Reload Register at the next update event. - This parameter must be a number between Min_Data=0x0000 and Max_Data=0xFFFF. - Some timer instances may support 32 bits counters. In that case this parameter must - be a number between 0x0000 and 0xFFFFFFFF. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetAutoReload().*/ - - uint32_t ClockDivision; /*!< Specifies the clock division. - This parameter can be a value of @ref TIM_LL_EC_CLOCKDIVISION. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetClockDivision().*/ - - uint32_t RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter - reaches zero, an update event is generated and counting restarts - from the RCR value (N). - This means in PWM mode that (N+1) corresponds to: - - the number of PWM periods in edge-aligned mode - - the number of half PWM period in center-aligned mode - GP timers: this parameter must be a number between Min_Data = 0x00 and - Max_Data = 0xFF. - Advanced timers: this parameter must be a number between Min_Data = 0x0000 and - Max_Data = 0xFFFF. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetRepetitionCounter().*/ -} LL_TIM_InitTypeDef; - -/** - * @brief TIM Output Compare configuration structure definition. - */ -typedef struct -{ - uint32_t OCMode; /*!< Specifies the output mode. - This parameter can be a value of @ref TIM_LL_EC_OCMODE. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetMode().*/ - - uint32_t OCState; /*!< Specifies the TIM Output Compare state. - This parameter can be a value of @ref TIM_LL_EC_OCSTATE. - - This feature can be modified afterwards using unitary functions - @ref LL_TIM_CC_EnableChannel() or @ref LL_TIM_CC_DisableChannel().*/ - - uint32_t OCNState; /*!< Specifies the TIM complementary Output Compare state. - This parameter can be a value of @ref TIM_LL_EC_OCSTATE. - - This feature can be modified afterwards using unitary functions - @ref LL_TIM_CC_EnableChannel() or @ref LL_TIM_CC_DisableChannel().*/ - - uint32_t CompareValue; /*!< Specifies the Compare value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data=0x0000 and Max_Data=0xFFFF. - - This feature can be modified afterwards using unitary function - LL_TIM_OC_SetCompareCHx (x=1..6).*/ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_LL_EC_OCPOLARITY. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetPolarity().*/ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_LL_EC_OCPOLARITY. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetPolarity().*/ - - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_LL_EC_OCIDLESTATE. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetIdleState().*/ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_LL_EC_OCIDLESTATE. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetIdleState().*/ -} LL_TIM_OC_InitTypeDef; - -/** - * @brief TIM Input Capture configuration structure definition. - */ - -typedef struct -{ - - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPolarity().*/ - - uint32_t ICActiveInput; /*!< Specifies the input. - This parameter can be a value of @ref TIM_LL_EC_ACTIVEINPUT. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetActiveInput().*/ - - uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_LL_EC_ICPSC. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPrescaler().*/ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a value of @ref TIM_LL_EC_IC_FILTER. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetFilter().*/ -} LL_TIM_IC_InitTypeDef; - - -/** - * @brief TIM Encoder interface configuration structure definition. - */ -typedef struct -{ - uint32_t EncoderMode; /*!< Specifies the encoder resolution (x2 or x4). - This parameter can be a value of @ref TIM_LL_EC_ENCODERMODE. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetEncoderMode().*/ - - uint32_t IC1Polarity; /*!< Specifies the active edge of TI1 input. - This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPolarity().*/ - - uint32_t IC1ActiveInput; /*!< Specifies the TI1 input source - This parameter can be a value of @ref TIM_LL_EC_ACTIVEINPUT. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetActiveInput().*/ - - uint32_t IC1Prescaler; /*!< Specifies the TI1 input prescaler value. - This parameter can be a value of @ref TIM_LL_EC_ICPSC. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPrescaler().*/ - - uint32_t IC1Filter; /*!< Specifies the TI1 input filter. - This parameter can be a value of @ref TIM_LL_EC_IC_FILTER. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetFilter().*/ - - uint32_t IC2Polarity; /*!< Specifies the active edge of TI2 input. - This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPolarity().*/ - - uint32_t IC2ActiveInput; /*!< Specifies the TI2 input source - This parameter can be a value of @ref TIM_LL_EC_ACTIVEINPUT. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetActiveInput().*/ - - uint32_t IC2Prescaler; /*!< Specifies the TI2 input prescaler value. - This parameter can be a value of @ref TIM_LL_EC_ICPSC. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPrescaler().*/ - - uint32_t IC2Filter; /*!< Specifies the TI2 input filter. - This parameter can be a value of @ref TIM_LL_EC_IC_FILTER. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetFilter().*/ - -} LL_TIM_ENCODER_InitTypeDef; - -/** - * @brief TIM Hall sensor interface configuration structure definition. - */ -typedef struct -{ - - uint32_t IC1Polarity; /*!< Specifies the active edge of TI1 input. - This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPolarity().*/ - - uint32_t IC1Prescaler; /*!< Specifies the TI1 input prescaler value. - Prescaler must be set to get a maximum counter period longer than the - time interval between 2 consecutive changes on the Hall inputs. - This parameter can be a value of @ref TIM_LL_EC_ICPSC. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPrescaler().*/ - - uint32_t IC1Filter; /*!< Specifies the TI1 input filter. - This parameter can be a value of - @ref TIM_LL_EC_IC_FILTER. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetFilter().*/ - - uint32_t CommutationDelay; /*!< Specifies the compare value to be loaded into the Capture Compare Register. - A positive pulse (TRGO event) is generated with a programmable delay every time - a change occurs on the Hall inputs. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetCompareCH2().*/ -} LL_TIM_HALLSENSOR_InitTypeDef; - -/** - * @brief BDTR (Break and Dead Time) structure definition - */ -typedef struct -{ - uint32_t OSSRState; /*!< Specifies the Off-State selection used in Run mode. - This parameter can be a value of @ref TIM_LL_EC_OSSR - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetOffStates() - - @note This bit-field cannot be modified as long as LOCK level 2 has been - programmed. */ - - uint32_t OSSIState; /*!< Specifies the Off-State used in Idle state. - This parameter can be a value of @ref TIM_LL_EC_OSSI - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetOffStates() - - @note This bit-field cannot be modified as long as LOCK level 2 has been - programmed. */ - - uint32_t LockLevel; /*!< Specifies the LOCK level parameters. - This parameter can be a value of @ref TIM_LL_EC_LOCKLEVEL - - @note The LOCK bits can be written only once after the reset. Once the TIMx_BDTR - register has been written, their content is frozen until the next reset.*/ - - uint8_t DeadTime; /*!< Specifies the delay time between the switching-off and the - switching-on of the outputs. - This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetDeadTime() - - @note This bit-field can not be modified as long as LOCK level 1, 2 or 3 has been - programmed. */ - - uint16_t BreakState; /*!< Specifies whether the TIM Break input is enabled or not. - This parameter can be a value of @ref TIM_LL_EC_BREAK_ENABLE - - This feature can be modified afterwards using unitary functions - @ref LL_TIM_EnableBRK() or @ref LL_TIM_DisableBRK() - - @note This bit-field can not be modified as long as LOCK level 1 has been - programmed. */ - - uint32_t BreakPolarity; /*!< Specifies the TIM Break Input pin polarity. - This parameter can be a value of @ref TIM_LL_EC_BREAK_POLARITY - - This feature can be modified afterwards using unitary function - @ref LL_TIM_ConfigBRK() - - @note This bit-field can not be modified as long as LOCK level 1 has been - programmed. */ - - uint32_t AutomaticOutput; /*!< Specifies whether the TIM Automatic Output feature is enabled or not. - This parameter can be a value of @ref TIM_LL_EC_AUTOMATICOUTPUT_ENABLE - - This feature can be modified afterwards using unitary functions - @ref LL_TIM_EnableAutomaticOutput() or @ref LL_TIM_DisableAutomaticOutput() - - @note This bit-field can not be modified as long as LOCK level 1 has been - programmed. */ -} LL_TIM_BDTR_InitTypeDef; - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIM_LL_Exported_Constants TIM Exported Constants - * @{ - */ - -/** @defgroup TIM_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_TIM_ReadReg function. - * @{ - */ -#define LL_TIM_SR_UIF TIM_SR_UIF /*!< Update interrupt flag */ -#define LL_TIM_SR_CC1IF TIM_SR_CC1IF /*!< Capture/compare 1 interrupt flag */ -#define LL_TIM_SR_CC2IF TIM_SR_CC2IF /*!< Capture/compare 2 interrupt flag */ -#define LL_TIM_SR_CC3IF TIM_SR_CC3IF /*!< Capture/compare 3 interrupt flag */ -#define LL_TIM_SR_CC4IF TIM_SR_CC4IF /*!< Capture/compare 4 interrupt flag */ -#define LL_TIM_SR_COMIF TIM_SR_COMIF /*!< COM interrupt flag */ -#define LL_TIM_SR_TIF TIM_SR_TIF /*!< Trigger interrupt flag */ -#define LL_TIM_SR_BIF TIM_SR_BIF /*!< Break interrupt flag */ -#define LL_TIM_SR_CC1OF TIM_SR_CC1OF /*!< Capture/Compare 1 overcapture flag */ -#define LL_TIM_SR_CC2OF TIM_SR_CC2OF /*!< Capture/Compare 2 overcapture flag */ -#define LL_TIM_SR_CC3OF TIM_SR_CC3OF /*!< Capture/Compare 3 overcapture flag */ -#define LL_TIM_SR_CC4OF TIM_SR_CC4OF /*!< Capture/Compare 4 overcapture flag */ -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup TIM_LL_EC_BREAK_ENABLE Break Enable - * @{ - */ -#define LL_TIM_BREAK_DISABLE 0x00000000U /*!< Break function disabled */ -#define LL_TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break function enabled */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_AUTOMATICOUTPUT_ENABLE Automatic output enable - * @{ - */ -#define LL_TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /*!< MOE can be set only by software */ -#define LL_TIM_AUTOMATICOUTPUT_ENABLE TIM_BDTR_AOE /*!< MOE can be set by software or automatically at the next update event */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** @defgroup TIM_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_TIM_ReadReg and LL_TIM_WriteReg functions. - * @{ - */ -#define LL_TIM_DIER_UIE TIM_DIER_UIE /*!< Update interrupt enable */ -#define LL_TIM_DIER_CC1IE TIM_DIER_CC1IE /*!< Capture/compare 1 interrupt enable */ -#define LL_TIM_DIER_CC2IE TIM_DIER_CC2IE /*!< Capture/compare 2 interrupt enable */ -#define LL_TIM_DIER_CC3IE TIM_DIER_CC3IE /*!< Capture/compare 3 interrupt enable */ -#define LL_TIM_DIER_CC4IE TIM_DIER_CC4IE /*!< Capture/compare 4 interrupt enable */ -#define LL_TIM_DIER_COMIE TIM_DIER_COMIE /*!< COM interrupt enable */ -#define LL_TIM_DIER_TIE TIM_DIER_TIE /*!< Trigger interrupt enable */ -#define LL_TIM_DIER_BIE TIM_DIER_BIE /*!< Break interrupt enable */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_UPDATESOURCE Update Source - * @{ - */ -#define LL_TIM_UPDATESOURCE_REGULAR 0x00000000U /*!< Counter overflow/underflow, Setting the UG bit or Update generation through the slave mode controller generates an update request */ -#define LL_TIM_UPDATESOURCE_COUNTER TIM_CR1_URS /*!< Only counter overflow/underflow generates an update request */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_ONEPULSEMODE One Pulse Mode - * @{ - */ -#define LL_TIM_ONEPULSEMODE_SINGLE TIM_CR1_OPM /*!< Counter stops counting at the next update event */ -#define LL_TIM_ONEPULSEMODE_REPETITIVE 0x00000000U /*!< Counter is not stopped at update event */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_COUNTERMODE Counter Mode - * @{ - */ -#define LL_TIM_COUNTERMODE_UP 0x00000000U /*!< Counter used as upcounter */ -#define LL_TIM_COUNTERMODE_DOWN TIM_CR1_DIR /*!< Counter used as downcounter */ -#define LL_TIM_COUNTERMODE_CENTER_DOWN TIM_CR1_CMS_0 /*!< The counter counts up and down alternatively. Output compare interrupt flags of output channels are set only when the counter is counting down. */ -#define LL_TIM_COUNTERMODE_CENTER_UP TIM_CR1_CMS_1 /*!< The counter counts up and down alternatively. Output compare interrupt flags of output channels are set only when the counter is counting up */ -#define LL_TIM_COUNTERMODE_CENTER_UP_DOWN TIM_CR1_CMS /*!< The counter counts up and down alternatively. Output compare interrupt flags of output channels are set only when the counter is counting up or down. */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_CLOCKDIVISION Clock Division - * @{ - */ -#define LL_TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< tDTS=tCK_INT */ -#define LL_TIM_CLOCKDIVISION_DIV2 TIM_CR1_CKD_0 /*!< tDTS=2*tCK_INT */ -#define LL_TIM_CLOCKDIVISION_DIV4 TIM_CR1_CKD_1 /*!< tDTS=4*tCK_INT */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_COUNTERDIRECTION Counter Direction - * @{ - */ -#define LL_TIM_COUNTERDIRECTION_UP 0x00000000U /*!< Timer counter counts up */ -#define LL_TIM_COUNTERDIRECTION_DOWN TIM_CR1_DIR /*!< Timer counter counts down */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_CCUPDATESOURCE Capture Compare Update Source - * @{ - */ -#define LL_TIM_CCUPDATESOURCE_COMG_ONLY 0x00000000U /*!< Capture/compare control bits are updated by setting the COMG bit only */ -#define LL_TIM_CCUPDATESOURCE_COMG_AND_TRGI TIM_CR2_CCUS /*!< Capture/compare control bits are updated by setting the COMG bit or when a rising edge occurs on trigger input (TRGI) */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_CCDMAREQUEST Capture Compare DMA Request - * @{ - */ -#define LL_TIM_CCDMAREQUEST_CC 0x00000000U /*!< CCx DMA request sent when CCx event occurs */ -#define LL_TIM_CCDMAREQUEST_UPDATE TIM_CR2_CCDS /*!< CCx DMA requests sent when update event occurs */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_LOCKLEVEL Lock Level - * @{ - */ -#define LL_TIM_LOCKLEVEL_OFF 0x00000000U /*!< LOCK OFF - No bit is write protected */ -#define LL_TIM_LOCKLEVEL_1 TIM_BDTR_LOCK_0 /*!< LOCK Level 1 */ -#define LL_TIM_LOCKLEVEL_2 TIM_BDTR_LOCK_1 /*!< LOCK Level 2 */ -#define LL_TIM_LOCKLEVEL_3 TIM_BDTR_LOCK /*!< LOCK Level 3 */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_CHANNEL Channel - * @{ - */ -#define LL_TIM_CHANNEL_CH1 TIM_CCER_CC1E /*!< Timer input/output channel 1 */ -#define LL_TIM_CHANNEL_CH1N TIM_CCER_CC1NE /*!< Timer complementary output channel 1 */ -#define LL_TIM_CHANNEL_CH2 TIM_CCER_CC2E /*!< Timer input/output channel 2 */ -#define LL_TIM_CHANNEL_CH2N TIM_CCER_CC2NE /*!< Timer complementary output channel 2 */ -#define LL_TIM_CHANNEL_CH3 TIM_CCER_CC3E /*!< Timer input/output channel 3 */ -#define LL_TIM_CHANNEL_CH3N TIM_CCER_CC3NE /*!< Timer complementary output channel 3 */ -#define LL_TIM_CHANNEL_CH4 TIM_CCER_CC4E /*!< Timer input/output channel 4 */ -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup TIM_LL_EC_OCSTATE Output Configuration State - * @{ - */ -#define LL_TIM_OCSTATE_DISABLE 0x00000000U /*!< OCx is not active */ -#define LL_TIM_OCSTATE_ENABLE TIM_CCER_CC1E /*!< OCx signal is output on the corresponding output pin */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** @defgroup TIM_LL_EC_OCMODE Output Configuration Mode - * @{ - */ -#define LL_TIM_OCMODE_FROZEN 0x00000000U /*!TIMx_CCRy else active.*/ -#define LL_TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!TIMx_CCRy else inactive*/ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_OCPOLARITY Output Configuration Polarity - * @{ - */ -#define LL_TIM_OCPOLARITY_HIGH 0x00000000U /*!< OCxactive high*/ -#define LL_TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< OCxactive low*/ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_OCIDLESTATE Output Configuration Idle State - * @{ - */ -#define LL_TIM_OCIDLESTATE_LOW 0x00000000U /*!__REG__, (__VALUE__)) - -/** - * @brief Read a value in TIM register. - * @param __INSTANCE__ TIM Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_TIM_ReadReg(__INSTANCE__, __REG__) READ_REG((__INSTANCE__)->__REG__) -/** - * @} - */ - -/** - * @brief HELPER macro calculating DTG[0:7] in the TIMx_BDTR register to achieve the requested dead time duration. - * @note ex: @ref __LL_TIM_CALC_DEADTIME (80000000, @ref LL_TIM_GetClockDivision (), 120); - * @param __TIMCLK__ timer input clock frequency (in Hz) - * @param __CKD__ This parameter can be one of the following values: - * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 - * @param __DT__ deadtime duration (in ns) - * @retval DTG[0:7] - */ -#define __LL_TIM_CALC_DEADTIME(__TIMCLK__, __CKD__, __DT__) \ - ( (((uint64_t)((__DT__)*1000U)) < ((DT_DELAY_1+1U) * TIM_CALC_DTS((__TIMCLK__), (__CKD__)))) ? \ - (uint8_t)(((uint64_t)((__DT__)*1000U) / TIM_CALC_DTS((__TIMCLK__), (__CKD__))) & DT_DELAY_1) : \ - (((uint64_t)((__DT__)*1000U)) < ((64U + (DT_DELAY_2+1U)) * 2U * TIM_CALC_DTS((__TIMCLK__), (__CKD__)))) ? \ - (uint8_t)(DT_RANGE_2 | ((uint8_t)((uint8_t)((((uint64_t)((__DT__)*1000U))/ TIM_CALC_DTS((__TIMCLK__), \ - (__CKD__))) >> 1U) - (uint8_t) 64) & DT_DELAY_2)) :\ - (((uint64_t)((__DT__)*1000U)) < ((32U + (DT_DELAY_3+1U)) * 8U * TIM_CALC_DTS((__TIMCLK__), (__CKD__)))) ? \ - (uint8_t)(DT_RANGE_3 | ((uint8_t)((uint8_t)(((((uint64_t)(__DT__)*1000U))/ TIM_CALC_DTS((__TIMCLK__), \ - (__CKD__))) >> 3U) - (uint8_t) 32) & DT_DELAY_3)) :\ - (((uint64_t)((__DT__)*1000U)) < ((32U + (DT_DELAY_4+1U)) * 16U * TIM_CALC_DTS((__TIMCLK__), (__CKD__)))) ? \ - (uint8_t)(DT_RANGE_4 | ((uint8_t)((uint8_t)(((((uint64_t)(__DT__)*1000U))/ TIM_CALC_DTS((__TIMCLK__), \ - (__CKD__))) >> 4U) - (uint8_t) 32) & DT_DELAY_4)) :\ - 0U) - -/** - * @brief HELPER macro calculating the prescaler value to achieve the required counter clock frequency. - * @note ex: @ref __LL_TIM_CALC_PSC (80000000, 1000000); - * @param __TIMCLK__ timer input clock frequency (in Hz) - * @param __CNTCLK__ counter clock frequency (in Hz) - * @retval Prescaler value (between Min_Data=0 and Max_Data=65535) - */ -#define __LL_TIM_CALC_PSC(__TIMCLK__, __CNTCLK__) \ - (((__TIMCLK__) >= (__CNTCLK__)) ? (uint32_t)((((__TIMCLK__) + (__CNTCLK__)/2U)/(__CNTCLK__)) - 1U) : 0U) - -/** - * @brief HELPER macro calculating the auto-reload value to achieve the required output signal frequency. - * @note ex: @ref __LL_TIM_CALC_ARR (1000000, @ref LL_TIM_GetPrescaler (), 10000); - * @param __TIMCLK__ timer input clock frequency (in Hz) - * @param __PSC__ prescaler - * @param __FREQ__ output signal frequency (in Hz) - * @retval Auto-reload value (between Min_Data=0 and Max_Data=65535) - */ -#define __LL_TIM_CALC_ARR(__TIMCLK__, __PSC__, __FREQ__) \ - ((((__TIMCLK__)/((__PSC__) + 1U)) >= (__FREQ__)) ? (((__TIMCLK__)/((__FREQ__) * ((__PSC__) + 1U))) - 1U) : 0U) - -/** - * @brief HELPER macro calculating the compare value required to achieve the required timer output compare - * active/inactive delay. - * @note ex: @ref __LL_TIM_CALC_DELAY (1000000, @ref LL_TIM_GetPrescaler (), 10); - * @param __TIMCLK__ timer input clock frequency (in Hz) - * @param __PSC__ prescaler - * @param __DELAY__ timer output compare active/inactive delay (in us) - * @retval Compare value (between Min_Data=0 and Max_Data=65535) - */ -#define __LL_TIM_CALC_DELAY(__TIMCLK__, __PSC__, __DELAY__) \ - ((uint32_t)(((uint64_t)(__TIMCLK__) * (uint64_t)(__DELAY__)) \ - / ((uint64_t)1000000U * (uint64_t)((__PSC__) + 1U)))) - -/** - * @brief HELPER macro calculating the auto-reload value to achieve the required pulse duration - * (when the timer operates in one pulse mode). - * @note ex: @ref __LL_TIM_CALC_PULSE (1000000, @ref LL_TIM_GetPrescaler (), 10, 20); - * @param __TIMCLK__ timer input clock frequency (in Hz) - * @param __PSC__ prescaler - * @param __DELAY__ timer output compare active/inactive delay (in us) - * @param __PULSE__ pulse duration (in us) - * @retval Auto-reload value (between Min_Data=0 and Max_Data=65535) - */ -#define __LL_TIM_CALC_PULSE(__TIMCLK__, __PSC__, __DELAY__, __PULSE__) \ - ((uint32_t)(__LL_TIM_CALC_DELAY((__TIMCLK__), (__PSC__), (__PULSE__)) \ - + __LL_TIM_CALC_DELAY((__TIMCLK__), (__PSC__), (__DELAY__)))) - -/** - * @brief HELPER macro retrieving the ratio of the input capture prescaler - * @note ex: @ref __LL_TIM_GET_ICPSC_RATIO (@ref LL_TIM_IC_GetPrescaler ()); - * @param __ICPSC__ This parameter can be one of the following values: - * @arg @ref LL_TIM_ICPSC_DIV1 - * @arg @ref LL_TIM_ICPSC_DIV2 - * @arg @ref LL_TIM_ICPSC_DIV4 - * @arg @ref LL_TIM_ICPSC_DIV8 - * @retval Input capture prescaler ratio (1, 2, 4 or 8) - */ -#define __LL_TIM_GET_ICPSC_RATIO(__ICPSC__) \ - ((uint32_t)(0x01U << (((__ICPSC__) >> 16U) >> TIM_CCMR1_IC1PSC_Pos))) - - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup TIM_LL_Exported_Functions TIM Exported Functions - * @{ - */ - -/** @defgroup TIM_LL_EF_Time_Base Time Base configuration - * @{ - */ -/** - * @brief Enable timer counter. - * @rmtoll CR1 CEN LL_TIM_EnableCounter - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableCounter(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->CR1, TIM_CR1_CEN); -} - -/** - * @brief Disable timer counter. - * @rmtoll CR1 CEN LL_TIM_DisableCounter - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableCounter(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->CR1, TIM_CR1_CEN); -} - -/** - * @brief Indicates whether the timer counter is enabled. - * @rmtoll CR1 CEN LL_TIM_IsEnabledCounter - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledCounter(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->CR1, TIM_CR1_CEN) == (TIM_CR1_CEN)) ? 1UL : 0UL); -} - -/** - * @brief Enable update event generation. - * @rmtoll CR1 UDIS LL_TIM_EnableUpdateEvent - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableUpdateEvent(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->CR1, TIM_CR1_UDIS); -} - -/** - * @brief Disable update event generation. - * @rmtoll CR1 UDIS LL_TIM_DisableUpdateEvent - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableUpdateEvent(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->CR1, TIM_CR1_UDIS); -} - -/** - * @brief Indicates whether update event generation is enabled. - * @rmtoll CR1 UDIS LL_TIM_IsEnabledUpdateEvent - * @param TIMx Timer instance - * @retval Inverted state of bit (0 or 1). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledUpdateEvent(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->CR1, TIM_CR1_UDIS) == (uint32_t)RESET) ? 1UL : 0UL); -} - -/** - * @brief Set update event source - * @note Update event source set to LL_TIM_UPDATESOURCE_REGULAR: any of the following events - * generate an update interrupt or DMA request if enabled: - * - Counter overflow/underflow - * - Setting the UG bit - * - Update generation through the slave mode controller - * @note Update event source set to LL_TIM_UPDATESOURCE_COUNTER: only counter - * overflow/underflow generates an update interrupt or DMA request if enabled. - * @rmtoll CR1 URS LL_TIM_SetUpdateSource - * @param TIMx Timer instance - * @param UpdateSource This parameter can be one of the following values: - * @arg @ref LL_TIM_UPDATESOURCE_REGULAR - * @arg @ref LL_TIM_UPDATESOURCE_COUNTER - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetUpdateSource(TIM_TypeDef *TIMx, uint32_t UpdateSource) -{ - MODIFY_REG(TIMx->CR1, TIM_CR1_URS, UpdateSource); -} - -/** - * @brief Get actual event update source - * @rmtoll CR1 URS LL_TIM_GetUpdateSource - * @param TIMx Timer instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_UPDATESOURCE_REGULAR - * @arg @ref LL_TIM_UPDATESOURCE_COUNTER - */ -__STATIC_INLINE uint32_t LL_TIM_GetUpdateSource(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_URS)); -} - -/** - * @brief Set one pulse mode (one shot v.s. repetitive). - * @rmtoll CR1 OPM LL_TIM_SetOnePulseMode - * @param TIMx Timer instance - * @param OnePulseMode This parameter can be one of the following values: - * @arg @ref LL_TIM_ONEPULSEMODE_SINGLE - * @arg @ref LL_TIM_ONEPULSEMODE_REPETITIVE - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetOnePulseMode(TIM_TypeDef *TIMx, uint32_t OnePulseMode) -{ - MODIFY_REG(TIMx->CR1, TIM_CR1_OPM, OnePulseMode); -} - -/** - * @brief Get actual one pulse mode. - * @rmtoll CR1 OPM LL_TIM_GetOnePulseMode - * @param TIMx Timer instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_ONEPULSEMODE_SINGLE - * @arg @ref LL_TIM_ONEPULSEMODE_REPETITIVE - */ -__STATIC_INLINE uint32_t LL_TIM_GetOnePulseMode(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_OPM)); -} - -/** - * @brief Set the timer counter counting mode. - * @note Macro IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx) can be used to - * check whether or not the counter mode selection feature is supported - * by a timer instance. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * @rmtoll CR1 DIR LL_TIM_SetCounterMode\n - * CR1 CMS LL_TIM_SetCounterMode - * @param TIMx Timer instance - * @param CounterMode This parameter can be one of the following values: - * @arg @ref LL_TIM_COUNTERMODE_UP - * @arg @ref LL_TIM_COUNTERMODE_DOWN - * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP - * @arg @ref LL_TIM_COUNTERMODE_CENTER_DOWN - * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP_DOWN - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetCounterMode(TIM_TypeDef *TIMx, uint32_t CounterMode) -{ - MODIFY_REG(TIMx->CR1, (TIM_CR1_DIR | TIM_CR1_CMS), CounterMode); -} - -/** - * @brief Get actual counter mode. - * @note Macro IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx) can be used to - * check whether or not the counter mode selection feature is supported - * by a timer instance. - * @rmtoll CR1 DIR LL_TIM_GetCounterMode\n - * CR1 CMS LL_TIM_GetCounterMode - * @param TIMx Timer instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_COUNTERMODE_UP - * @arg @ref LL_TIM_COUNTERMODE_DOWN - * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP - * @arg @ref LL_TIM_COUNTERMODE_CENTER_DOWN - * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP_DOWN - */ -__STATIC_INLINE uint32_t LL_TIM_GetCounterMode(const TIM_TypeDef *TIMx) -{ - uint32_t counter_mode; - - counter_mode = (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_CMS)); - - if (counter_mode == 0U) - { - counter_mode = (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_DIR)); - } - - return counter_mode; -} - -/** - * @brief Enable auto-reload (ARR) preload. - * @rmtoll CR1 ARPE LL_TIM_EnableARRPreload - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableARRPreload(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->CR1, TIM_CR1_ARPE); -} - -/** - * @brief Disable auto-reload (ARR) preload. - * @rmtoll CR1 ARPE LL_TIM_DisableARRPreload - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableARRPreload(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->CR1, TIM_CR1_ARPE); -} - -/** - * @brief Indicates whether auto-reload (ARR) preload is enabled. - * @rmtoll CR1 ARPE LL_TIM_IsEnabledARRPreload - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledARRPreload(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->CR1, TIM_CR1_ARPE) == (TIM_CR1_ARPE)) ? 1UL : 0UL); -} - -/** - * @brief Set the division ratio between the timer clock and the sampling clock used by the dead-time generators - * (when supported) and the digital filters. - * @note Macro IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx) can be used to check - * whether or not the clock division feature is supported by the timer - * instance. - * @rmtoll CR1 CKD LL_TIM_SetClockDivision - * @param TIMx Timer instance - * @param ClockDivision This parameter can be one of the following values: - * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetClockDivision(TIM_TypeDef *TIMx, uint32_t ClockDivision) -{ - MODIFY_REG(TIMx->CR1, TIM_CR1_CKD, ClockDivision); -} - -/** - * @brief Get the actual division ratio between the timer clock and the sampling clock used by the dead-time - * generators (when supported) and the digital filters. - * @note Macro IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx) can be used to check - * whether or not the clock division feature is supported by the timer - * instance. - * @rmtoll CR1 CKD LL_TIM_GetClockDivision - * @param TIMx Timer instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 - */ -__STATIC_INLINE uint32_t LL_TIM_GetClockDivision(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_CKD)); -} - -/** - * @brief Set the counter value. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @rmtoll CNT CNT LL_TIM_SetCounter - * @param TIMx Timer instance - * @param Counter Counter value (between Min_Data=0 and Max_Data=0xFFFF or 0xFFFFFFFF) - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetCounter(TIM_TypeDef *TIMx, uint32_t Counter) -{ - WRITE_REG(TIMx->CNT, Counter); -} - -/** - * @brief Get the counter value. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @rmtoll CNT CNT LL_TIM_GetCounter - * @param TIMx Timer instance - * @retval Counter value (between Min_Data=0 and Max_Data=0xFFFF or 0xFFFFFFFF) - */ -__STATIC_INLINE uint32_t LL_TIM_GetCounter(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CNT)); -} - -/** - * @brief Get the current direction of the counter - * @rmtoll CR1 DIR LL_TIM_GetDirection - * @param TIMx Timer instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_COUNTERDIRECTION_UP - * @arg @ref LL_TIM_COUNTERDIRECTION_DOWN - */ -__STATIC_INLINE uint32_t LL_TIM_GetDirection(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_DIR)); -} - -/** - * @brief Set the prescaler value. - * @note The counter clock frequency CK_CNT is equal to fCK_PSC / (PSC[15:0] + 1). - * @note The prescaler can be changed on the fly as this control register is buffered. The new - * prescaler ratio is taken into account at the next update event. - * @note Helper macro @ref __LL_TIM_CALC_PSC can be used to calculate the Prescaler parameter - * @rmtoll PSC PSC LL_TIM_SetPrescaler - * @param TIMx Timer instance - * @param Prescaler between Min_Data=0 and Max_Data=65535 - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetPrescaler(TIM_TypeDef *TIMx, uint32_t Prescaler) -{ - WRITE_REG(TIMx->PSC, Prescaler); -} - -/** - * @brief Get the prescaler value. - * @rmtoll PSC PSC LL_TIM_GetPrescaler - * @param TIMx Timer instance - * @retval Prescaler value between Min_Data=0 and Max_Data=65535 - */ -__STATIC_INLINE uint32_t LL_TIM_GetPrescaler(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->PSC)); -} - -/** - * @brief Set the auto-reload value. - * @note The counter is blocked while the auto-reload value is null. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Helper macro @ref __LL_TIM_CALC_ARR can be used to calculate the AutoReload parameter - * @rmtoll ARR ARR LL_TIM_SetAutoReload - * @param TIMx Timer instance - * @param AutoReload between Min_Data=0 and Max_Data=65535 - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetAutoReload(TIM_TypeDef *TIMx, uint32_t AutoReload) -{ - WRITE_REG(TIMx->ARR, AutoReload); -} - -/** - * @brief Get the auto-reload value. - * @rmtoll ARR ARR LL_TIM_GetAutoReload - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @param TIMx Timer instance - * @retval Auto-reload value - */ -__STATIC_INLINE uint32_t LL_TIM_GetAutoReload(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->ARR)); -} - -/** - * @brief Set the repetition counter value. - * @note Macro IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a repetition counter. - * @rmtoll RCR REP LL_TIM_SetRepetitionCounter - * @param TIMx Timer instance - * @param RepetitionCounter between Min_Data=0 and Max_Data=255 or 65535 for advanced timer. - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetRepetitionCounter(TIM_TypeDef *TIMx, uint32_t RepetitionCounter) -{ - WRITE_REG(TIMx->RCR, RepetitionCounter); -} - -/** - * @brief Get the repetition counter value. - * @note Macro IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a repetition counter. - * @rmtoll RCR REP LL_TIM_GetRepetitionCounter - * @param TIMx Timer instance - * @retval Repetition counter value - */ -__STATIC_INLINE uint32_t LL_TIM_GetRepetitionCounter(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->RCR)); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Capture_Compare Capture Compare configuration - * @{ - */ -/** - * @brief Enable the capture/compare control bits (CCxE, CCxNE and OCxM) preload. - * @note CCxE, CCxNE and OCxM bits are preloaded, after having been written, - * they are updated only when a commutation event (COM) occurs. - * @note Only on channels that have a complementary output. - * @note Macro IS_TIM_COMMUTATION_EVENT_INSTANCE(TIMx) can be used to check - * whether or not a timer instance is able to generate a commutation event. - * @rmtoll CR2 CCPC LL_TIM_CC_EnablePreload - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_EnablePreload(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->CR2, TIM_CR2_CCPC); -} - -/** - * @brief Disable the capture/compare control bits (CCxE, CCxNE and OCxM) preload. - * @note Macro IS_TIM_COMMUTATION_EVENT_INSTANCE(TIMx) can be used to check - * whether or not a timer instance is able to generate a commutation event. - * @rmtoll CR2 CCPC LL_TIM_CC_DisablePreload - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_DisablePreload(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->CR2, TIM_CR2_CCPC); -} - -/** - * @brief Indicates whether the capture/compare control bits (CCxE, CCxNE and OCxM) preload is enabled. - * @rmtoll CR2 CCPC LL_TIM_CC_IsEnabledPreload - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_CC_IsEnabledPreload(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->CR2, TIM_CR2_CCPC) == (TIM_CR2_CCPC)) ? 1UL : 0UL); -} - -/** - * @brief Set the updated source of the capture/compare control bits (CCxE, CCxNE and OCxM). - * @note Macro IS_TIM_COMMUTATION_EVENT_INSTANCE(TIMx) can be used to check - * whether or not a timer instance is able to generate a commutation event. - * @rmtoll CR2 CCUS LL_TIM_CC_SetUpdate - * @param TIMx Timer instance - * @param CCUpdateSource This parameter can be one of the following values: - * @arg @ref LL_TIM_CCUPDATESOURCE_COMG_ONLY - * @arg @ref LL_TIM_CCUPDATESOURCE_COMG_AND_TRGI - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_SetUpdate(TIM_TypeDef *TIMx, uint32_t CCUpdateSource) -{ - MODIFY_REG(TIMx->CR2, TIM_CR2_CCUS, CCUpdateSource); -} - -/** - * @brief Set the trigger of the capture/compare DMA request. - * @rmtoll CR2 CCDS LL_TIM_CC_SetDMAReqTrigger - * @param TIMx Timer instance - * @param DMAReqTrigger This parameter can be one of the following values: - * @arg @ref LL_TIM_CCDMAREQUEST_CC - * @arg @ref LL_TIM_CCDMAREQUEST_UPDATE - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_SetDMAReqTrigger(TIM_TypeDef *TIMx, uint32_t DMAReqTrigger) -{ - MODIFY_REG(TIMx->CR2, TIM_CR2_CCDS, DMAReqTrigger); -} - -/** - * @brief Get actual trigger of the capture/compare DMA request. - * @rmtoll CR2 CCDS LL_TIM_CC_GetDMAReqTrigger - * @param TIMx Timer instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_CCDMAREQUEST_CC - * @arg @ref LL_TIM_CCDMAREQUEST_UPDATE - */ -__STATIC_INLINE uint32_t LL_TIM_CC_GetDMAReqTrigger(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_BIT(TIMx->CR2, TIM_CR2_CCDS)); -} - -/** - * @brief Set the lock level to freeze the - * configuration of several capture/compare parameters. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * the lock mechanism is supported by a timer instance. - * @rmtoll BDTR LOCK LL_TIM_CC_SetLockLevel - * @param TIMx Timer instance - * @param LockLevel This parameter can be one of the following values: - * @arg @ref LL_TIM_LOCKLEVEL_OFF - * @arg @ref LL_TIM_LOCKLEVEL_1 - * @arg @ref LL_TIM_LOCKLEVEL_2 - * @arg @ref LL_TIM_LOCKLEVEL_3 - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_SetLockLevel(TIM_TypeDef *TIMx, uint32_t LockLevel) -{ - MODIFY_REG(TIMx->BDTR, TIM_BDTR_LOCK, LockLevel); -} - -/** - * @brief Enable capture/compare channels. - * @rmtoll CCER CC1E LL_TIM_CC_EnableChannel\n - * CCER CC1NE LL_TIM_CC_EnableChannel\n - * CCER CC2E LL_TIM_CC_EnableChannel\n - * CCER CC2NE LL_TIM_CC_EnableChannel\n - * CCER CC3E LL_TIM_CC_EnableChannel\n - * CCER CC3NE LL_TIM_CC_EnableChannel\n - * CCER CC4E LL_TIM_CC_EnableChannel - * @param TIMx Timer instance - * @param Channels This parameter can be a combination of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_EnableChannel(TIM_TypeDef *TIMx, uint32_t Channels) -{ - SET_BIT(TIMx->CCER, Channels); -} - -/** - * @brief Disable capture/compare channels. - * @rmtoll CCER CC1E LL_TIM_CC_DisableChannel\n - * CCER CC1NE LL_TIM_CC_DisableChannel\n - * CCER CC2E LL_TIM_CC_DisableChannel\n - * CCER CC2NE LL_TIM_CC_DisableChannel\n - * CCER CC3E LL_TIM_CC_DisableChannel\n - * CCER CC3NE LL_TIM_CC_DisableChannel\n - * CCER CC4E LL_TIM_CC_DisableChannel - * @param TIMx Timer instance - * @param Channels This parameter can be a combination of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_DisableChannel(TIM_TypeDef *TIMx, uint32_t Channels) -{ - CLEAR_BIT(TIMx->CCER, Channels); -} - -/** - * @brief Indicate whether channel(s) is(are) enabled. - * @rmtoll CCER CC1E LL_TIM_CC_IsEnabledChannel\n - * CCER CC1NE LL_TIM_CC_IsEnabledChannel\n - * CCER CC2E LL_TIM_CC_IsEnabledChannel\n - * CCER CC2NE LL_TIM_CC_IsEnabledChannel\n - * CCER CC3E LL_TIM_CC_IsEnabledChannel\n - * CCER CC3NE LL_TIM_CC_IsEnabledChannel\n - * CCER CC4E LL_TIM_CC_IsEnabledChannel - * @param TIMx Timer instance - * @param Channels This parameter can be a combination of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_CC_IsEnabledChannel(const TIM_TypeDef *TIMx, uint32_t Channels) -{ - return ((READ_BIT(TIMx->CCER, Channels) == (Channels)) ? 1UL : 0UL); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Output_Channel Output channel configuration - * @{ - */ -/** - * @brief Configure an output channel. - * @rmtoll CCMR1 CC1S LL_TIM_OC_ConfigOutput\n - * CCMR1 CC2S LL_TIM_OC_ConfigOutput\n - * CCMR2 CC3S LL_TIM_OC_ConfigOutput\n - * CCMR2 CC4S LL_TIM_OC_ConfigOutput\n - * CCER CC1P LL_TIM_OC_ConfigOutput\n - * CCER CC2P LL_TIM_OC_ConfigOutput\n - * CCER CC3P LL_TIM_OC_ConfigOutput\n - * CCER CC4P LL_TIM_OC_ConfigOutput\n - * CR2 OIS1 LL_TIM_OC_ConfigOutput\n - * CR2 OIS2 LL_TIM_OC_ConfigOutput\n - * CR2 OIS3 LL_TIM_OC_ConfigOutput\n - * CR2 OIS4 LL_TIM_OC_ConfigOutput - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param Configuration This parameter must be a combination of all the following values: - * @arg @ref LL_TIM_OCPOLARITY_HIGH or @ref LL_TIM_OCPOLARITY_LOW - * @arg @ref LL_TIM_OCIDLESTATE_LOW or @ref LL_TIM_OCIDLESTATE_HIGH - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_ConfigOutput(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Configuration) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - CLEAR_BIT(*pReg, (TIM_CCMR1_CC1S << SHIFT_TAB_OCxx[iChannel])); - MODIFY_REG(TIMx->CCER, (TIM_CCER_CC1P << SHIFT_TAB_CCxP[iChannel]), - (Configuration & TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel]); - MODIFY_REG(TIMx->CR2, (TIM_CR2_OIS1 << SHIFT_TAB_OISx[iChannel]), - (Configuration & TIM_CR2_OIS1) << SHIFT_TAB_OISx[iChannel]); -} - -/** - * @brief Define the behavior of the output reference signal OCxREF from which - * OCx and OCxN (when relevant) are derived. - * @rmtoll CCMR1 OC1M LL_TIM_OC_SetMode\n - * CCMR1 OC2M LL_TIM_OC_SetMode\n - * CCMR2 OC3M LL_TIM_OC_SetMode\n - * CCMR2 OC4M LL_TIM_OC_SetMode - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_TIM_OCMODE_FROZEN - * @arg @ref LL_TIM_OCMODE_ACTIVE - * @arg @ref LL_TIM_OCMODE_INACTIVE - * @arg @ref LL_TIM_OCMODE_TOGGLE - * @arg @ref LL_TIM_OCMODE_FORCED_INACTIVE - * @arg @ref LL_TIM_OCMODE_FORCED_ACTIVE - * @arg @ref LL_TIM_OCMODE_PWM1 - * @arg @ref LL_TIM_OCMODE_PWM2 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetMode(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Mode) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - MODIFY_REG(*pReg, ((TIM_CCMR1_OC1M | TIM_CCMR1_CC1S) << SHIFT_TAB_OCxx[iChannel]), Mode << SHIFT_TAB_OCxx[iChannel]); -} - -/** - * @brief Get the output compare mode of an output channel. - * @rmtoll CCMR1 OC1M LL_TIM_OC_GetMode\n - * CCMR1 OC2M LL_TIM_OC_GetMode\n - * CCMR2 OC3M LL_TIM_OC_GetMode\n - * CCMR2 OC4M LL_TIM_OC_GetMode - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_OCMODE_FROZEN - * @arg @ref LL_TIM_OCMODE_ACTIVE - * @arg @ref LL_TIM_OCMODE_INACTIVE - * @arg @ref LL_TIM_OCMODE_TOGGLE - * @arg @ref LL_TIM_OCMODE_FORCED_INACTIVE - * @arg @ref LL_TIM_OCMODE_FORCED_ACTIVE - * @arg @ref LL_TIM_OCMODE_PWM1 - * @arg @ref LL_TIM_OCMODE_PWM2 - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetMode(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - return (READ_BIT(*pReg, ((TIM_CCMR1_OC1M | TIM_CCMR1_CC1S) << SHIFT_TAB_OCxx[iChannel])) >> SHIFT_TAB_OCxx[iChannel]); -} - -/** - * @brief Set the polarity of an output channel. - * @rmtoll CCER CC1P LL_TIM_OC_SetPolarity\n - * CCER CC1NP LL_TIM_OC_SetPolarity\n - * CCER CC2P LL_TIM_OC_SetPolarity\n - * CCER CC2NP LL_TIM_OC_SetPolarity\n - * CCER CC3P LL_TIM_OC_SetPolarity\n - * CCER CC3NP LL_TIM_OC_SetPolarity\n - * CCER CC4P LL_TIM_OC_SetPolarity - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param Polarity This parameter can be one of the following values: - * @arg @ref LL_TIM_OCPOLARITY_HIGH - * @arg @ref LL_TIM_OCPOLARITY_LOW - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetPolarity(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Polarity) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - MODIFY_REG(TIMx->CCER, (TIM_CCER_CC1P << SHIFT_TAB_CCxP[iChannel]), Polarity << SHIFT_TAB_CCxP[iChannel]); -} - -/** - * @brief Get the polarity of an output channel. - * @rmtoll CCER CC1P LL_TIM_OC_GetPolarity\n - * CCER CC1NP LL_TIM_OC_GetPolarity\n - * CCER CC2P LL_TIM_OC_GetPolarity\n - * CCER CC2NP LL_TIM_OC_GetPolarity\n - * CCER CC3P LL_TIM_OC_GetPolarity\n - * CCER CC3NP LL_TIM_OC_GetPolarity\n - * CCER CC4P LL_TIM_OC_GetPolarity - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_OCPOLARITY_HIGH - * @arg @ref LL_TIM_OCPOLARITY_LOW - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetPolarity(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - return (READ_BIT(TIMx->CCER, (TIM_CCER_CC1P << SHIFT_TAB_CCxP[iChannel])) >> SHIFT_TAB_CCxP[iChannel]); -} - -/** - * @brief Set the IDLE state of an output channel - * @note This function is significant only for the timer instances - * supporting the break feature. Macro IS_TIM_BREAK_INSTANCE(TIMx) - * can be used to check whether or not a timer instance provides - * a break input. - * @rmtoll CR2 OIS1 LL_TIM_OC_SetIdleState\n - * CR2 OIS1N LL_TIM_OC_SetIdleState\n - * CR2 OIS2 LL_TIM_OC_SetIdleState\n - * CR2 OIS2N LL_TIM_OC_SetIdleState\n - * CR2 OIS3 LL_TIM_OC_SetIdleState\n - * CR2 OIS3N LL_TIM_OC_SetIdleState\n - * CR2 OIS4 LL_TIM_OC_SetIdleState - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param IdleState This parameter can be one of the following values: - * @arg @ref LL_TIM_OCIDLESTATE_LOW - * @arg @ref LL_TIM_OCIDLESTATE_HIGH - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetIdleState(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t IdleState) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - MODIFY_REG(TIMx->CR2, (TIM_CR2_OIS1 << SHIFT_TAB_OISx[iChannel]), IdleState << SHIFT_TAB_OISx[iChannel]); -} - -/** - * @brief Get the IDLE state of an output channel - * @rmtoll CR2 OIS1 LL_TIM_OC_GetIdleState\n - * CR2 OIS1N LL_TIM_OC_GetIdleState\n - * CR2 OIS2 LL_TIM_OC_GetIdleState\n - * CR2 OIS2N LL_TIM_OC_GetIdleState\n - * CR2 OIS3 LL_TIM_OC_GetIdleState\n - * CR2 OIS3N LL_TIM_OC_GetIdleState\n - * CR2 OIS4 LL_TIM_OC_GetIdleState - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_OCIDLESTATE_LOW - * @arg @ref LL_TIM_OCIDLESTATE_HIGH - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetIdleState(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - return (READ_BIT(TIMx->CR2, (TIM_CR2_OIS1 << SHIFT_TAB_OISx[iChannel])) >> SHIFT_TAB_OISx[iChannel]); -} - -/** - * @brief Enable fast mode for the output channel. - * @note Acts only if the channel is configured in PWM1 or PWM2 mode. - * @rmtoll CCMR1 OC1FE LL_TIM_OC_EnableFast\n - * CCMR1 OC2FE LL_TIM_OC_EnableFast\n - * CCMR2 OC3FE LL_TIM_OC_EnableFast\n - * CCMR2 OC4FE LL_TIM_OC_EnableFast - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_EnableFast(TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - SET_BIT(*pReg, (TIM_CCMR1_OC1FE << SHIFT_TAB_OCxx[iChannel])); - -} - -/** - * @brief Disable fast mode for the output channel. - * @rmtoll CCMR1 OC1FE LL_TIM_OC_DisableFast\n - * CCMR1 OC2FE LL_TIM_OC_DisableFast\n - * CCMR2 OC3FE LL_TIM_OC_DisableFast\n - * CCMR2 OC4FE LL_TIM_OC_DisableFast - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_DisableFast(TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - CLEAR_BIT(*pReg, (TIM_CCMR1_OC1FE << SHIFT_TAB_OCxx[iChannel])); - -} - -/** - * @brief Indicates whether fast mode is enabled for the output channel. - * @rmtoll CCMR1 OC1FE LL_TIM_OC_IsEnabledFast\n - * CCMR1 OC2FE LL_TIM_OC_IsEnabledFast\n - * CCMR2 OC3FE LL_TIM_OC_IsEnabledFast\n - * CCMR2 OC4FE LL_TIM_OC_IsEnabledFast\n - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_OC_IsEnabledFast(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - uint32_t bitfield = TIM_CCMR1_OC1FE << SHIFT_TAB_OCxx[iChannel]; - return ((READ_BIT(*pReg, bitfield) == bitfield) ? 1UL : 0UL); -} - -/** - * @brief Enable compare register (TIMx_CCRx) preload for the output channel. - * @rmtoll CCMR1 OC1PE LL_TIM_OC_EnablePreload\n - * CCMR1 OC2PE LL_TIM_OC_EnablePreload\n - * CCMR2 OC3PE LL_TIM_OC_EnablePreload\n - * CCMR2 OC4PE LL_TIM_OC_EnablePreload - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_EnablePreload(TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - SET_BIT(*pReg, (TIM_CCMR1_OC1PE << SHIFT_TAB_OCxx[iChannel])); -} - -/** - * @brief Disable compare register (TIMx_CCRx) preload for the output channel. - * @rmtoll CCMR1 OC1PE LL_TIM_OC_DisablePreload\n - * CCMR1 OC2PE LL_TIM_OC_DisablePreload\n - * CCMR2 OC3PE LL_TIM_OC_DisablePreload\n - * CCMR2 OC4PE LL_TIM_OC_DisablePreload - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_DisablePreload(TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - CLEAR_BIT(*pReg, (TIM_CCMR1_OC1PE << SHIFT_TAB_OCxx[iChannel])); -} - -/** - * @brief Indicates whether compare register (TIMx_CCRx) preload is enabled for the output channel. - * @rmtoll CCMR1 OC1PE LL_TIM_OC_IsEnabledPreload\n - * CCMR1 OC2PE LL_TIM_OC_IsEnabledPreload\n - * CCMR2 OC3PE LL_TIM_OC_IsEnabledPreload\n - * CCMR2 OC4PE LL_TIM_OC_IsEnabledPreload\n - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_OC_IsEnabledPreload(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - uint32_t bitfield = TIM_CCMR1_OC1PE << SHIFT_TAB_OCxx[iChannel]; - return ((READ_BIT(*pReg, bitfield) == bitfield) ? 1UL : 0UL); -} - -/** - * @brief Enable clearing the output channel on an external event. - * @note This function can only be used in Output compare and PWM modes. It does not work in Forced mode. - * @note Macro IS_TIM_OCXREF_CLEAR_INSTANCE(TIMx) can be used to check whether - * or not a timer instance can clear the OCxREF signal on an external event. - * @rmtoll CCMR1 OC1CE LL_TIM_OC_EnableClear\n - * CCMR1 OC2CE LL_TIM_OC_EnableClear\n - * CCMR2 OC3CE LL_TIM_OC_EnableClear\n - * CCMR2 OC4CE LL_TIM_OC_EnableClear - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_EnableClear(TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - SET_BIT(*pReg, (TIM_CCMR1_OC1CE << SHIFT_TAB_OCxx[iChannel])); -} - -/** - * @brief Disable clearing the output channel on an external event. - * @note Macro IS_TIM_OCXREF_CLEAR_INSTANCE(TIMx) can be used to check whether - * or not a timer instance can clear the OCxREF signal on an external event. - * @rmtoll CCMR1 OC1CE LL_TIM_OC_DisableClear\n - * CCMR1 OC2CE LL_TIM_OC_DisableClear\n - * CCMR2 OC3CE LL_TIM_OC_DisableClear\n - * CCMR2 OC4CE LL_TIM_OC_DisableClear - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_DisableClear(TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - CLEAR_BIT(*pReg, (TIM_CCMR1_OC1CE << SHIFT_TAB_OCxx[iChannel])); -} - -/** - * @brief Indicates clearing the output channel on an external event is enabled for the output channel. - * @note This function enables clearing the output channel on an external event. - * @note This function can only be used in Output compare and PWM modes. It does not work in Forced mode. - * @note Macro IS_TIM_OCXREF_CLEAR_INSTANCE(TIMx) can be used to check whether - * or not a timer instance can clear the OCxREF signal on an external event. - * @rmtoll CCMR1 OC1CE LL_TIM_OC_IsEnabledClear\n - * CCMR1 OC2CE LL_TIM_OC_IsEnabledClear\n - * CCMR2 OC3CE LL_TIM_OC_IsEnabledClear\n - * CCMR2 OC4CE LL_TIM_OC_IsEnabledClear\n - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_OC_IsEnabledClear(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - uint32_t bitfield = TIM_CCMR1_OC1CE << SHIFT_TAB_OCxx[iChannel]; - return ((READ_BIT(*pReg, bitfield) == bitfield) ? 1UL : 0UL); -} - -/** - * @brief Set the dead-time delay (delay inserted between the rising edge of the OCxREF signal and the rising edge of - * the Ocx and OCxN signals). - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * dead-time insertion feature is supported by a timer instance. - * @note Helper macro @ref __LL_TIM_CALC_DEADTIME can be used to calculate the DeadTime parameter - * @rmtoll BDTR DTG LL_TIM_OC_SetDeadTime - * @param TIMx Timer instance - * @param DeadTime between Min_Data=0 and Max_Data=255 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetDeadTime(TIM_TypeDef *TIMx, uint32_t DeadTime) -{ - MODIFY_REG(TIMx->BDTR, TIM_BDTR_DTG, DeadTime); -} - -/** - * @brief Set compare value for output channel 1 (TIMx_CCR1). - * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC1_INSTANCE(TIMx) can be used to check whether or not - * output channel 1 is supported by a timer instance. - * @rmtoll CCR1 CCR1 LL_TIM_OC_SetCompareCH1 - * @param TIMx Timer instance - * @param CompareValue between Min_Data=0 and Max_Data=65535 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetCompareCH1(TIM_TypeDef *TIMx, uint32_t CompareValue) -{ - WRITE_REG(TIMx->CCR1, CompareValue); -} - -/** - * @brief Set compare value for output channel 2 (TIMx_CCR2). - * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC2_INSTANCE(TIMx) can be used to check whether or not - * output channel 2 is supported by a timer instance. - * @rmtoll CCR2 CCR2 LL_TIM_OC_SetCompareCH2 - * @param TIMx Timer instance - * @param CompareValue between Min_Data=0 and Max_Data=65535 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetCompareCH2(TIM_TypeDef *TIMx, uint32_t CompareValue) -{ - WRITE_REG(TIMx->CCR2, CompareValue); -} - -/** - * @brief Set compare value for output channel 3 (TIMx_CCR3). - * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC3_INSTANCE(TIMx) can be used to check whether or not - * output channel is supported by a timer instance. - * @rmtoll CCR3 CCR3 LL_TIM_OC_SetCompareCH3 - * @param TIMx Timer instance - * @param CompareValue between Min_Data=0 and Max_Data=65535 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetCompareCH3(TIM_TypeDef *TIMx, uint32_t CompareValue) -{ - WRITE_REG(TIMx->CCR3, CompareValue); -} - -/** - * @brief Set compare value for output channel 4 (TIMx_CCR4). - * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC4_INSTANCE(TIMx) can be used to check whether or not - * output channel 4 is supported by a timer instance. - * @rmtoll CCR4 CCR4 LL_TIM_OC_SetCompareCH4 - * @param TIMx Timer instance - * @param CompareValue between Min_Data=0 and Max_Data=65535 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetCompareCH4(TIM_TypeDef *TIMx, uint32_t CompareValue) -{ - WRITE_REG(TIMx->CCR4, CompareValue); -} - -/** - * @brief Get compare value (TIMx_CCR1) set for output channel 1. - * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC1_INSTANCE(TIMx) can be used to check whether or not - * output channel 1 is supported by a timer instance. - * @rmtoll CCR1 CCR1 LL_TIM_OC_GetCompareCH1 - * @param TIMx Timer instance - * @retval CompareValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH1(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR1)); -} - -/** - * @brief Get compare value (TIMx_CCR2) set for output channel 2. - * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC2_INSTANCE(TIMx) can be used to check whether or not - * output channel 2 is supported by a timer instance. - * @rmtoll CCR2 CCR2 LL_TIM_OC_GetCompareCH2 - * @param TIMx Timer instance - * @retval CompareValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH2(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR2)); -} - -/** - * @brief Get compare value (TIMx_CCR3) set for output channel 3. - * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC3_INSTANCE(TIMx) can be used to check whether or not - * output channel 3 is supported by a timer instance. - * @rmtoll CCR3 CCR3 LL_TIM_OC_GetCompareCH3 - * @param TIMx Timer instance - * @retval CompareValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH3(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR3)); -} - -/** - * @brief Get compare value (TIMx_CCR4) set for output channel 4. - * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC4_INSTANCE(TIMx) can be used to check whether or not - * output channel 4 is supported by a timer instance. - * @rmtoll CCR4 CCR4 LL_TIM_OC_GetCompareCH4 - * @param TIMx Timer instance - * @retval CompareValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH4(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR4)); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Input_Channel Input channel configuration - * @{ - */ -/** - * @brief Configure input channel. - * @rmtoll CCMR1 CC1S LL_TIM_IC_Config\n - * CCMR1 IC1PSC LL_TIM_IC_Config\n - * CCMR1 IC1F LL_TIM_IC_Config\n - * CCMR1 CC2S LL_TIM_IC_Config\n - * CCMR1 IC2PSC LL_TIM_IC_Config\n - * CCMR1 IC2F LL_TIM_IC_Config\n - * CCMR2 CC3S LL_TIM_IC_Config\n - * CCMR2 IC3PSC LL_TIM_IC_Config\n - * CCMR2 IC3F LL_TIM_IC_Config\n - * CCMR2 CC4S LL_TIM_IC_Config\n - * CCMR2 IC4PSC LL_TIM_IC_Config\n - * CCMR2 IC4F LL_TIM_IC_Config\n - * CCER CC1P LL_TIM_IC_Config\n - * CCER CC1NP LL_TIM_IC_Config\n - * CCER CC2P LL_TIM_IC_Config\n - * CCER CC2NP LL_TIM_IC_Config\n - * CCER CC3P LL_TIM_IC_Config\n - * CCER CC3NP LL_TIM_IC_Config\n - * CCER CC4P LL_TIM_IC_Config\n - * CCER CC4NP LL_TIM_IC_Config - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param Configuration This parameter must be a combination of all the following values: - * @arg @ref LL_TIM_ACTIVEINPUT_DIRECTTI or @ref LL_TIM_ACTIVEINPUT_INDIRECTTI or @ref LL_TIM_ACTIVEINPUT_TRC - * @arg @ref LL_TIM_ICPSC_DIV1 or ... or @ref LL_TIM_ICPSC_DIV8 - * @arg @ref LL_TIM_IC_FILTER_FDIV1 or ... or @ref LL_TIM_IC_FILTER_FDIV32_N8 - * @arg @ref LL_TIM_IC_POLARITY_RISING or @ref LL_TIM_IC_POLARITY_FALLING or @ref LL_TIM_IC_POLARITY_BOTHEDGE - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_Config(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Configuration) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - MODIFY_REG(*pReg, ((TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC | TIM_CCMR1_CC1S) << SHIFT_TAB_ICxx[iChannel]), - ((Configuration >> 16U) & (TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC | TIM_CCMR1_CC1S)) \ - << SHIFT_TAB_ICxx[iChannel]); - MODIFY_REG(TIMx->CCER, ((TIM_CCER_CC1NP | TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel]), - (Configuration & (TIM_CCER_CC1NP | TIM_CCER_CC1P)) << SHIFT_TAB_CCxP[iChannel]); -} - -/** - * @brief Set the active input. - * @rmtoll CCMR1 CC1S LL_TIM_IC_SetActiveInput\n - * CCMR1 CC2S LL_TIM_IC_SetActiveInput\n - * CCMR2 CC3S LL_TIM_IC_SetActiveInput\n - * CCMR2 CC4S LL_TIM_IC_SetActiveInput - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param ICActiveInput This parameter can be one of the following values: - * @arg @ref LL_TIM_ACTIVEINPUT_DIRECTTI - * @arg @ref LL_TIM_ACTIVEINPUT_INDIRECTTI - * @arg @ref LL_TIM_ACTIVEINPUT_TRC - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_SetActiveInput(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICActiveInput) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - MODIFY_REG(*pReg, ((TIM_CCMR1_CC1S) << SHIFT_TAB_ICxx[iChannel]), (ICActiveInput >> 16U) << SHIFT_TAB_ICxx[iChannel]); -} - -/** - * @brief Get the current active input. - * @rmtoll CCMR1 CC1S LL_TIM_IC_GetActiveInput\n - * CCMR1 CC2S LL_TIM_IC_GetActiveInput\n - * CCMR2 CC3S LL_TIM_IC_GetActiveInput\n - * CCMR2 CC4S LL_TIM_IC_GetActiveInput - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_ACTIVEINPUT_DIRECTTI - * @arg @ref LL_TIM_ACTIVEINPUT_INDIRECTTI - * @arg @ref LL_TIM_ACTIVEINPUT_TRC - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetActiveInput(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - return ((READ_BIT(*pReg, ((TIM_CCMR1_CC1S) << SHIFT_TAB_ICxx[iChannel])) >> SHIFT_TAB_ICxx[iChannel]) << 16U); -} - -/** - * @brief Set the prescaler of input channel. - * @rmtoll CCMR1 IC1PSC LL_TIM_IC_SetPrescaler\n - * CCMR1 IC2PSC LL_TIM_IC_SetPrescaler\n - * CCMR2 IC3PSC LL_TIM_IC_SetPrescaler\n - * CCMR2 IC4PSC LL_TIM_IC_SetPrescaler - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param ICPrescaler This parameter can be one of the following values: - * @arg @ref LL_TIM_ICPSC_DIV1 - * @arg @ref LL_TIM_ICPSC_DIV2 - * @arg @ref LL_TIM_ICPSC_DIV4 - * @arg @ref LL_TIM_ICPSC_DIV8 - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_SetPrescaler(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICPrescaler) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - MODIFY_REG(*pReg, ((TIM_CCMR1_IC1PSC) << SHIFT_TAB_ICxx[iChannel]), (ICPrescaler >> 16U) << SHIFT_TAB_ICxx[iChannel]); -} - -/** - * @brief Get the current prescaler value acting on an input channel. - * @rmtoll CCMR1 IC1PSC LL_TIM_IC_GetPrescaler\n - * CCMR1 IC2PSC LL_TIM_IC_GetPrescaler\n - * CCMR2 IC3PSC LL_TIM_IC_GetPrescaler\n - * CCMR2 IC4PSC LL_TIM_IC_GetPrescaler - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_ICPSC_DIV1 - * @arg @ref LL_TIM_ICPSC_DIV2 - * @arg @ref LL_TIM_ICPSC_DIV4 - * @arg @ref LL_TIM_ICPSC_DIV8 - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetPrescaler(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - return ((READ_BIT(*pReg, ((TIM_CCMR1_IC1PSC) << SHIFT_TAB_ICxx[iChannel])) >> SHIFT_TAB_ICxx[iChannel]) << 16U); -} - -/** - * @brief Set the input filter duration. - * @rmtoll CCMR1 IC1F LL_TIM_IC_SetFilter\n - * CCMR1 IC2F LL_TIM_IC_SetFilter\n - * CCMR2 IC3F LL_TIM_IC_SetFilter\n - * CCMR2 IC4F LL_TIM_IC_SetFilter - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param ICFilter This parameter can be one of the following values: - * @arg @ref LL_TIM_IC_FILTER_FDIV1 - * @arg @ref LL_TIM_IC_FILTER_FDIV1_N2 - * @arg @ref LL_TIM_IC_FILTER_FDIV1_N4 - * @arg @ref LL_TIM_IC_FILTER_FDIV1_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV2_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV2_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV4_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV4_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV8_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV8_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV16_N5 - * @arg @ref LL_TIM_IC_FILTER_FDIV16_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV16_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV32_N5 - * @arg @ref LL_TIM_IC_FILTER_FDIV32_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV32_N8 - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_SetFilter(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICFilter) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - MODIFY_REG(*pReg, ((TIM_CCMR1_IC1F) << SHIFT_TAB_ICxx[iChannel]), (ICFilter >> 16U) << SHIFT_TAB_ICxx[iChannel]); -} - -/** - * @brief Get the input filter duration. - * @rmtoll CCMR1 IC1F LL_TIM_IC_GetFilter\n - * CCMR1 IC2F LL_TIM_IC_GetFilter\n - * CCMR2 IC3F LL_TIM_IC_GetFilter\n - * CCMR2 IC4F LL_TIM_IC_GetFilter - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_IC_FILTER_FDIV1 - * @arg @ref LL_TIM_IC_FILTER_FDIV1_N2 - * @arg @ref LL_TIM_IC_FILTER_FDIV1_N4 - * @arg @ref LL_TIM_IC_FILTER_FDIV1_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV2_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV2_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV4_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV4_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV8_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV8_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV16_N5 - * @arg @ref LL_TIM_IC_FILTER_FDIV16_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV16_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV32_N5 - * @arg @ref LL_TIM_IC_FILTER_FDIV32_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV32_N8 - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetFilter(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - return ((READ_BIT(*pReg, ((TIM_CCMR1_IC1F) << SHIFT_TAB_ICxx[iChannel])) >> SHIFT_TAB_ICxx[iChannel]) << 16U); -} - -/** - * @brief Set the input channel polarity. - * @rmtoll CCER CC1P LL_TIM_IC_SetPolarity\n - * CCER CC1NP LL_TIM_IC_SetPolarity\n - * CCER CC2P LL_TIM_IC_SetPolarity\n - * CCER CC2NP LL_TIM_IC_SetPolarity\n - * CCER CC3P LL_TIM_IC_SetPolarity\n - * CCER CC3NP LL_TIM_IC_SetPolarity\n - * CCER CC4P LL_TIM_IC_SetPolarity\n - * CCER CC4NP LL_TIM_IC_SetPolarity - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param ICPolarity This parameter can be one of the following values: - * @arg @ref LL_TIM_IC_POLARITY_RISING - * @arg @ref LL_TIM_IC_POLARITY_FALLING - * @arg @ref LL_TIM_IC_POLARITY_BOTHEDGE - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_SetPolarity(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICPolarity) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - MODIFY_REG(TIMx->CCER, ((TIM_CCER_CC1NP | TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel]), - ICPolarity << SHIFT_TAB_CCxP[iChannel]); -} - -/** - * @brief Get the current input channel polarity. - * @rmtoll CCER CC1P LL_TIM_IC_GetPolarity\n - * CCER CC1NP LL_TIM_IC_GetPolarity\n - * CCER CC2P LL_TIM_IC_GetPolarity\n - * CCER CC2NP LL_TIM_IC_GetPolarity\n - * CCER CC3P LL_TIM_IC_GetPolarity\n - * CCER CC3NP LL_TIM_IC_GetPolarity\n - * CCER CC4P LL_TIM_IC_GetPolarity\n - * CCER CC4NP LL_TIM_IC_GetPolarity - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_IC_POLARITY_RISING - * @arg @ref LL_TIM_IC_POLARITY_FALLING - * @arg @ref LL_TIM_IC_POLARITY_BOTHEDGE - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetPolarity(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - return (READ_BIT(TIMx->CCER, ((TIM_CCER_CC1NP | TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel])) >> - SHIFT_TAB_CCxP[iChannel]); -} - -/** - * @brief Connect the TIMx_CH1, CH2 and CH3 pins to the TI1 input (XOR combination). - * @note Macro IS_TIM_XOR_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides an XOR input. - * @rmtoll CR2 TI1S LL_TIM_IC_EnableXORCombination - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_EnableXORCombination(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->CR2, TIM_CR2_TI1S); -} - -/** - * @brief Disconnect the TIMx_CH1, CH2 and CH3 pins from the TI1 input. - * @note Macro IS_TIM_XOR_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides an XOR input. - * @rmtoll CR2 TI1S LL_TIM_IC_DisableXORCombination - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_DisableXORCombination(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->CR2, TIM_CR2_TI1S); -} - -/** - * @brief Indicates whether the TIMx_CH1, CH2 and CH3 pins are connectected to the TI1 input. - * @note Macro IS_TIM_XOR_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides an XOR input. - * @rmtoll CR2 TI1S LL_TIM_IC_IsEnabledXORCombination - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IC_IsEnabledXORCombination(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->CR2, TIM_CR2_TI1S) == (TIM_CR2_TI1S)) ? 1UL : 0UL); -} - -/** - * @brief Get captured value for input channel 1. - * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC1_INSTANCE(TIMx) can be used to check whether or not - * input channel 1 is supported by a timer instance. - * @rmtoll CCR1 CCR1 LL_TIM_IC_GetCaptureCH1 - * @param TIMx Timer instance - * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH1(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR1)); -} - -/** - * @brief Get captured value for input channel 2. - * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC2_INSTANCE(TIMx) can be used to check whether or not - * input channel 2 is supported by a timer instance. - * @rmtoll CCR2 CCR2 LL_TIM_IC_GetCaptureCH2 - * @param TIMx Timer instance - * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH2(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR2)); -} - -/** - * @brief Get captured value for input channel 3. - * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC3_INSTANCE(TIMx) can be used to check whether or not - * input channel 3 is supported by a timer instance. - * @rmtoll CCR3 CCR3 LL_TIM_IC_GetCaptureCH3 - * @param TIMx Timer instance - * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH3(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR3)); -} - -/** - * @brief Get captured value for input channel 4. - * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC4_INSTANCE(TIMx) can be used to check whether or not - * input channel 4 is supported by a timer instance. - * @rmtoll CCR4 CCR4 LL_TIM_IC_GetCaptureCH4 - * @param TIMx Timer instance - * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH4(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR4)); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Clock_Selection Counter clock selection - * @{ - */ -/** - * @brief Enable external clock mode 2. - * @note When external clock mode 2 is enabled the counter is clocked by any active edge on the ETRF signal. - * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports external clock mode2. - * @rmtoll SMCR ECE LL_TIM_EnableExternalClock - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableExternalClock(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->SMCR, TIM_SMCR_ECE); -} - -/** - * @brief Disable external clock mode 2. - * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports external clock mode2. - * @rmtoll SMCR ECE LL_TIM_DisableExternalClock - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableExternalClock(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->SMCR, TIM_SMCR_ECE); -} - -/** - * @brief Indicate whether external clock mode 2 is enabled. - * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports external clock mode2. - * @rmtoll SMCR ECE LL_TIM_IsEnabledExternalClock - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledExternalClock(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SMCR, TIM_SMCR_ECE) == (TIM_SMCR_ECE)) ? 1UL : 0UL); -} - -/** - * @brief Set the clock source of the counter clock. - * @note when selected clock source is external clock mode 1, the timer input - * the external clock is applied is selected by calling the @ref LL_TIM_SetTriggerInput() - * function. This timer input must be configured by calling - * the @ref LL_TIM_IC_Config() function. - * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports external clock mode1. - * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports external clock mode2. - * @rmtoll SMCR SMS LL_TIM_SetClockSource\n - * SMCR ECE LL_TIM_SetClockSource - * @param TIMx Timer instance - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_TIM_CLOCKSOURCE_INTERNAL - * @arg @ref LL_TIM_CLOCKSOURCE_EXT_MODE1 - * @arg @ref LL_TIM_CLOCKSOURCE_EXT_MODE2 - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetClockSource(TIM_TypeDef *TIMx, uint32_t ClockSource) -{ - MODIFY_REG(TIMx->SMCR, TIM_SMCR_SMS | TIM_SMCR_ECE, ClockSource); -} - -/** - * @brief Set the encoder interface mode. - * @note Macro IS_TIM_ENCODER_INTERFACE_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports the encoder mode. - * @rmtoll SMCR SMS LL_TIM_SetEncoderMode - * @param TIMx Timer instance - * @param EncoderMode This parameter can be one of the following values: - * @arg @ref LL_TIM_ENCODERMODE_X2_TI1 - * @arg @ref LL_TIM_ENCODERMODE_X2_TI2 - * @arg @ref LL_TIM_ENCODERMODE_X4_TI12 - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetEncoderMode(TIM_TypeDef *TIMx, uint32_t EncoderMode) -{ - MODIFY_REG(TIMx->SMCR, TIM_SMCR_SMS, EncoderMode); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Timer_Synchronization Timer synchronisation configuration - * @{ - */ -/** - * @brief Set the trigger output (TRGO) used for timer synchronization . - * @note Macro IS_TIM_MASTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance can operate as a master timer. - * @rmtoll CR2 MMS LL_TIM_SetTriggerOutput - * @param TIMx Timer instance - * @param TimerSynchronization This parameter can be one of the following values: - * @arg @ref LL_TIM_TRGO_RESET - * @arg @ref LL_TIM_TRGO_ENABLE - * @arg @ref LL_TIM_TRGO_UPDATE - * @arg @ref LL_TIM_TRGO_CC1IF - * @arg @ref LL_TIM_TRGO_OC1REF - * @arg @ref LL_TIM_TRGO_OC2REF - * @arg @ref LL_TIM_TRGO_OC3REF - * @arg @ref LL_TIM_TRGO_OC4REF - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetTriggerOutput(TIM_TypeDef *TIMx, uint32_t TimerSynchronization) -{ - MODIFY_REG(TIMx->CR2, TIM_CR2_MMS, TimerSynchronization); -} - -/** - * @brief Set the synchronization mode of a slave timer. - * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not - * a timer instance can operate as a slave timer. - * @rmtoll SMCR SMS LL_TIM_SetSlaveMode - * @param TIMx Timer instance - * @param SlaveMode This parameter can be one of the following values: - * @arg @ref LL_TIM_SLAVEMODE_DISABLED - * @arg @ref LL_TIM_SLAVEMODE_RESET - * @arg @ref LL_TIM_SLAVEMODE_GATED - * @arg @ref LL_TIM_SLAVEMODE_TRIGGER - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetSlaveMode(TIM_TypeDef *TIMx, uint32_t SlaveMode) -{ - MODIFY_REG(TIMx->SMCR, TIM_SMCR_SMS, SlaveMode); -} - -/** - * @brief Set the selects the trigger input to be used to synchronize the counter. - * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not - * a timer instance can operate as a slave timer. - * @rmtoll SMCR TS LL_TIM_SetTriggerInput - * @param TIMx Timer instance - * @param TriggerInput This parameter can be one of the following values: - * @arg @ref LL_TIM_TS_ITR0 - * @arg @ref LL_TIM_TS_ITR1 - * @arg @ref LL_TIM_TS_ITR2 - * @arg @ref LL_TIM_TS_ITR3 - * @arg @ref LL_TIM_TS_TI1F_ED - * @arg @ref LL_TIM_TS_TI1FP1 - * @arg @ref LL_TIM_TS_TI2FP2 - * @arg @ref LL_TIM_TS_ETRF - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetTriggerInput(TIM_TypeDef *TIMx, uint32_t TriggerInput) -{ - MODIFY_REG(TIMx->SMCR, TIM_SMCR_TS, TriggerInput); -} - -/** - * @brief Enable the Master/Slave mode. - * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not - * a timer instance can operate as a slave timer. - * @rmtoll SMCR MSM LL_TIM_EnableMasterSlaveMode - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableMasterSlaveMode(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->SMCR, TIM_SMCR_MSM); -} - -/** - * @brief Disable the Master/Slave mode. - * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not - * a timer instance can operate as a slave timer. - * @rmtoll SMCR MSM LL_TIM_DisableMasterSlaveMode - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableMasterSlaveMode(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->SMCR, TIM_SMCR_MSM); -} - -/** - * @brief Indicates whether the Master/Slave mode is enabled. - * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not - * a timer instance can operate as a slave timer. - * @rmtoll SMCR MSM LL_TIM_IsEnabledMasterSlaveMode - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledMasterSlaveMode(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SMCR, TIM_SMCR_MSM) == (TIM_SMCR_MSM)) ? 1UL : 0UL); -} - -/** - * @brief Configure the external trigger (ETR) input. - * @note Macro IS_TIM_ETR_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides an external trigger input. - * @rmtoll SMCR ETP LL_TIM_ConfigETR\n - * SMCR ETPS LL_TIM_ConfigETR\n - * SMCR ETF LL_TIM_ConfigETR - * @param TIMx Timer instance - * @param ETRPolarity This parameter can be one of the following values: - * @arg @ref LL_TIM_ETR_POLARITY_NONINVERTED - * @arg @ref LL_TIM_ETR_POLARITY_INVERTED - * @param ETRPrescaler This parameter can be one of the following values: - * @arg @ref LL_TIM_ETR_PRESCALER_DIV1 - * @arg @ref LL_TIM_ETR_PRESCALER_DIV2 - * @arg @ref LL_TIM_ETR_PRESCALER_DIV4 - * @arg @ref LL_TIM_ETR_PRESCALER_DIV8 - * @param ETRFilter This parameter can be one of the following values: - * @arg @ref LL_TIM_ETR_FILTER_FDIV1 - * @arg @ref LL_TIM_ETR_FILTER_FDIV1_N2 - * @arg @ref LL_TIM_ETR_FILTER_FDIV1_N4 - * @arg @ref LL_TIM_ETR_FILTER_FDIV1_N8 - * @arg @ref LL_TIM_ETR_FILTER_FDIV2_N6 - * @arg @ref LL_TIM_ETR_FILTER_FDIV2_N8 - * @arg @ref LL_TIM_ETR_FILTER_FDIV4_N6 - * @arg @ref LL_TIM_ETR_FILTER_FDIV4_N8 - * @arg @ref LL_TIM_ETR_FILTER_FDIV8_N6 - * @arg @ref LL_TIM_ETR_FILTER_FDIV8_N8 - * @arg @ref LL_TIM_ETR_FILTER_FDIV16_N5 - * @arg @ref LL_TIM_ETR_FILTER_FDIV16_N6 - * @arg @ref LL_TIM_ETR_FILTER_FDIV16_N8 - * @arg @ref LL_TIM_ETR_FILTER_FDIV32_N5 - * @arg @ref LL_TIM_ETR_FILTER_FDIV32_N6 - * @arg @ref LL_TIM_ETR_FILTER_FDIV32_N8 - * @retval None - */ -__STATIC_INLINE void LL_TIM_ConfigETR(TIM_TypeDef *TIMx, uint32_t ETRPolarity, uint32_t ETRPrescaler, - uint32_t ETRFilter) -{ - MODIFY_REG(TIMx->SMCR, TIM_SMCR_ETP | TIM_SMCR_ETPS | TIM_SMCR_ETF, ETRPolarity | ETRPrescaler | ETRFilter); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Break_Function Break function configuration - * @{ - */ -/** - * @brief Enable the break function. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR BKE LL_TIM_EnableBRK - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableBRK(TIM_TypeDef *TIMx) -{ - __IO uint32_t tmpreg; - SET_BIT(TIMx->BDTR, TIM_BDTR_BKE); - /* Note: Any write operation to this bit takes a delay of 1 APB clock cycle to become effective. */ - tmpreg = READ_REG(TIMx->BDTR); - (void)(tmpreg); -} - -/** - * @brief Disable the break function. - * @rmtoll BDTR BKE LL_TIM_DisableBRK - * @param TIMx Timer instance - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableBRK(TIM_TypeDef *TIMx) -{ - __IO uint32_t tmpreg; - CLEAR_BIT(TIMx->BDTR, TIM_BDTR_BKE); - /* Note: Any write operation to this bit takes a delay of 1 APB clock cycle to become effective. */ - tmpreg = READ_REG(TIMx->BDTR); - (void)(tmpreg); -} - -/** - * @brief Configure the break input. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR BKP LL_TIM_ConfigBRK - * @param TIMx Timer instance - * @param BreakPolarity This parameter can be one of the following values: - * @arg @ref LL_TIM_BREAK_POLARITY_LOW - * @arg @ref LL_TIM_BREAK_POLARITY_HIGH - * @retval None - */ -__STATIC_INLINE void LL_TIM_ConfigBRK(TIM_TypeDef *TIMx, uint32_t BreakPolarity) -{ - __IO uint32_t tmpreg; - MODIFY_REG(TIMx->BDTR, TIM_BDTR_BKP, BreakPolarity); - /* Note: Any write operation to BKP bit takes a delay of 1 APB clock cycle to become effective. */ - tmpreg = READ_REG(TIMx->BDTR); - (void)(tmpreg); -} - -/** - * @brief Select the outputs off state (enabled v.s. disabled) in Idle and Run modes. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR OSSI LL_TIM_SetOffStates\n - * BDTR OSSR LL_TIM_SetOffStates - * @param TIMx Timer instance - * @param OffStateIdle This parameter can be one of the following values: - * @arg @ref LL_TIM_OSSI_DISABLE - * @arg @ref LL_TIM_OSSI_ENABLE - * @param OffStateRun This parameter can be one of the following values: - * @arg @ref LL_TIM_OSSR_DISABLE - * @arg @ref LL_TIM_OSSR_ENABLE - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetOffStates(TIM_TypeDef *TIMx, uint32_t OffStateIdle, uint32_t OffStateRun) -{ - MODIFY_REG(TIMx->BDTR, TIM_BDTR_OSSI | TIM_BDTR_OSSR, OffStateIdle | OffStateRun); -} - -/** - * @brief Enable automatic output (MOE can be set by software or automatically when a break input is active). - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR AOE LL_TIM_EnableAutomaticOutput - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableAutomaticOutput(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->BDTR, TIM_BDTR_AOE); -} - -/** - * @brief Disable automatic output (MOE can be set only by software). - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR AOE LL_TIM_DisableAutomaticOutput - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableAutomaticOutput(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->BDTR, TIM_BDTR_AOE); -} - -/** - * @brief Indicate whether automatic output is enabled. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR AOE LL_TIM_IsEnabledAutomaticOutput - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledAutomaticOutput(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->BDTR, TIM_BDTR_AOE) == (TIM_BDTR_AOE)) ? 1UL : 0UL); -} - -/** - * @brief Enable the outputs (set the MOE bit in TIMx_BDTR register). - * @note The MOE bit in TIMx_BDTR register allows to enable /disable the outputs by - * software and is reset in case of break or break2 event - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR MOE LL_TIM_EnableAllOutputs - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableAllOutputs(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->BDTR, TIM_BDTR_MOE); -} - -/** - * @brief Disable the outputs (reset the MOE bit in TIMx_BDTR register). - * @note The MOE bit in TIMx_BDTR register allows to enable /disable the outputs by - * software and is reset in case of break or break2 event. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR MOE LL_TIM_DisableAllOutputs - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableAllOutputs(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->BDTR, TIM_BDTR_MOE); -} - -/** - * @brief Indicates whether outputs are enabled. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR MOE LL_TIM_IsEnabledAllOutputs - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledAllOutputs(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->BDTR, TIM_BDTR_MOE) == (TIM_BDTR_MOE)) ? 1UL : 0UL); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_DMA_Burst_Mode DMA burst mode configuration - * @{ - */ -/** - * @brief Configures the timer DMA burst feature. - * @note Macro IS_TIM_DMABURST_INSTANCE(TIMx) can be used to check whether or - * not a timer instance supports the DMA burst mode. - * @rmtoll DCR DBL LL_TIM_ConfigDMABurst\n - * DCR DBA LL_TIM_ConfigDMABurst - * @param TIMx Timer instance - * @param DMABurstBaseAddress This parameter can be one of the following values: - * @arg @ref LL_TIM_DMABURST_BASEADDR_CR1 - * @arg @ref LL_TIM_DMABURST_BASEADDR_CR2 - * @arg @ref LL_TIM_DMABURST_BASEADDR_SMCR - * @arg @ref LL_TIM_DMABURST_BASEADDR_DIER - * @arg @ref LL_TIM_DMABURST_BASEADDR_SR - * @arg @ref LL_TIM_DMABURST_BASEADDR_EGR - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCMR1 - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCMR2 - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCER - * @arg @ref LL_TIM_DMABURST_BASEADDR_CNT - * @arg @ref LL_TIM_DMABURST_BASEADDR_PSC - * @arg @ref LL_TIM_DMABURST_BASEADDR_ARR - * @arg @ref LL_TIM_DMABURST_BASEADDR_RCR - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR1 - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR2 - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR3 - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR4 - * @arg @ref LL_TIM_DMABURST_BASEADDR_BDTR - * @param DMABurstLength This parameter can be one of the following values: - * @arg @ref LL_TIM_DMABURST_LENGTH_1TRANSFER - * @arg @ref LL_TIM_DMABURST_LENGTH_2TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_3TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_4TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_5TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_6TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_7TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_8TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_9TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_10TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_11TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_12TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_13TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_14TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_15TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_16TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_17TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_18TRANSFERS - * @retval None - */ -__STATIC_INLINE void LL_TIM_ConfigDMABurst(TIM_TypeDef *TIMx, uint32_t DMABurstBaseAddress, uint32_t DMABurstLength) -{ - MODIFY_REG(TIMx->DCR, (TIM_DCR_DBL | TIM_DCR_DBA), (DMABurstBaseAddress | DMABurstLength)); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Timer_Inputs_Remapping Timer input remapping - * @{ - */ -/** - * @brief Remap TIM inputs (input channel, internal/external triggers). - * @note Macro IS_TIM_REMAP_INSTANCE(TIMx) can be used to check whether or not - * a some timer inputs can be remapped. - * @rmtoll TIM1_OR ITR2_RMP LL_TIM_SetRemap\n - * TIM2_OR ITR1_RMP LL_TIM_SetRemap\n - * TIM5_OR ITR1_RMP LL_TIM_SetRemap\n - * TIM5_OR TI4_RMP LL_TIM_SetRemap\n - * TIM9_OR ITR1_RMP LL_TIM_SetRemap\n - * TIM11_OR TI1_RMP LL_TIM_SetRemap\n - * LPTIM1_OR OR LL_TIM_SetRemap - * @param TIMx Timer instance - * @param Remap Remap param depends on the TIMx. Description available only - * in CHM version of the User Manual (not in .pdf). - * Otherwise see Reference Manual description of OR registers. - * - * Below description summarizes "Timer Instance" and "Remap" param combinations: - * - * TIM1: one of the following values - * - * ITR2_RMP can be one of the following values - * @arg @ref LL_TIM_TIM1_ITR2_RMP_TIM3_TRGO (*) - * @arg @ref LL_TIM_TIM1_ITR2_RMP_LPTIM (*) - * - * TIM2: one of the following values - * - * ITR1_RMP can be one of the following values - * @arg @ref LL_TIM_TIM2_ITR1_RMP_TIM8_TRGO - * @arg @ref LL_TIM_TIM2_ITR1_RMP_OTG_FS_SOF - * @arg @ref LL_TIM_TIM2_ITR1_RMP_OTG_HS_SOF - * - * TIM5: one of the following values - * - * @arg @ref LL_TIM_TIM5_TI4_RMP_GPIO - * @arg @ref LL_TIM_TIM5_TI4_RMP_LSI - * @arg @ref LL_TIM_TIM5_TI4_RMP_LSE - * @arg @ref LL_TIM_TIM5_TI4_RMP_RTC - * @arg @ref LL_TIM_TIM5_ITR1_RMP_TIM3_TRGO (*) - * @arg @ref LL_TIM_TIM5_ITR1_RMP_LPTIM (*) - * - * TIM9: one of the following values - * - * ITR1_RMP can be one of the following values - * @arg @ref LL_TIM_TIM9_ITR1_RMP_TIM3_TRGO (*) - * @arg @ref LL_TIM_TIM9_ITR1_RMP_LPTIM (*) - * - * TIM11: one of the following values - * - * @arg @ref LL_TIM_TIM11_TI1_RMP_GPIO - * @arg @ref LL_TIM_TIM11_TI1_RMP_GPIO1 (*) - * @arg @ref LL_TIM_TIM11_TI1_RMP_HSE_RTC - * @arg @ref LL_TIM_TIM11_TI1_RMP_GPIO2 - * @arg @ref LL_TIM_TIM11_TI1_RMP_SPDIFRX (*) - * - * (*) Value not defined in all devices. \n - * - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetRemap(TIM_TypeDef *TIMx, uint32_t Remap) -{ -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM9_ITR1_RMP) - if ((Remap & LL_TIM_LPTIM_REMAP_MASK) == LL_TIM_LPTIM_REMAP_MASK) - { - /* Connect TIMx internal trigger to LPTIM1 output */ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN); - MODIFY_REG(LPTIM1->OR, - (LPTIM_OR_TIM1_ITR2_RMP | LPTIM_OR_TIM5_ITR1_RMP | LPTIM_OR_TIM9_ITR1_RMP), - Remap & ~(LL_TIM_LPTIM_REMAP_MASK)); - } - else - { - MODIFY_REG(TIMx->OR, (Remap >> TIMx_OR_RMP_SHIFT), (Remap & TIMx_OR_RMP_MASK)); - } -#else - MODIFY_REG(TIMx->OR, (Remap >> TIMx_OR_RMP_SHIFT), (Remap & TIMx_OR_RMP_MASK)); -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM9_ITR1_RMP */ -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_FLAG_Management FLAG-Management - * @{ - */ -/** - * @brief Clear the update interrupt flag (UIF). - * @rmtoll SR UIF LL_TIM_ClearFlag_UPDATE - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_UPDATE(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_UIF)); -} - -/** - * @brief Indicate whether update interrupt flag (UIF) is set (update interrupt is pending). - * @rmtoll SR UIF LL_TIM_IsActiveFlag_UPDATE - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_UPDATE(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_UIF) == (TIM_SR_UIF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 1 interrupt flag (CC1F). - * @rmtoll SR CC1IF LL_TIM_ClearFlag_CC1 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC1(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC1IF)); -} - -/** - * @brief Indicate whether Capture/Compare 1 interrupt flag (CC1F) is set (Capture/Compare 1 interrupt is pending). - * @rmtoll SR CC1IF LL_TIM_IsActiveFlag_CC1 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC1(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC1IF) == (TIM_SR_CC1IF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 2 interrupt flag (CC2F). - * @rmtoll SR CC2IF LL_TIM_ClearFlag_CC2 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC2(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC2IF)); -} - -/** - * @brief Indicate whether Capture/Compare 2 interrupt flag (CC2F) is set (Capture/Compare 2 interrupt is pending). - * @rmtoll SR CC2IF LL_TIM_IsActiveFlag_CC2 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC2(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC2IF) == (TIM_SR_CC2IF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 3 interrupt flag (CC3F). - * @rmtoll SR CC3IF LL_TIM_ClearFlag_CC3 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC3(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC3IF)); -} - -/** - * @brief Indicate whether Capture/Compare 3 interrupt flag (CC3F) is set (Capture/Compare 3 interrupt is pending). - * @rmtoll SR CC3IF LL_TIM_IsActiveFlag_CC3 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC3(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC3IF) == (TIM_SR_CC3IF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 4 interrupt flag (CC4F). - * @rmtoll SR CC4IF LL_TIM_ClearFlag_CC4 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC4(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC4IF)); -} - -/** - * @brief Indicate whether Capture/Compare 4 interrupt flag (CC4F) is set (Capture/Compare 4 interrupt is pending). - * @rmtoll SR CC4IF LL_TIM_IsActiveFlag_CC4 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC4(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC4IF) == (TIM_SR_CC4IF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the commutation interrupt flag (COMIF). - * @rmtoll SR COMIF LL_TIM_ClearFlag_COM - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_COM(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_COMIF)); -} - -/** - * @brief Indicate whether commutation interrupt flag (COMIF) is set (commutation interrupt is pending). - * @rmtoll SR COMIF LL_TIM_IsActiveFlag_COM - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_COM(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_COMIF) == (TIM_SR_COMIF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the trigger interrupt flag (TIF). - * @rmtoll SR TIF LL_TIM_ClearFlag_TRIG - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_TRIG(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_TIF)); -} - -/** - * @brief Indicate whether trigger interrupt flag (TIF) is set (trigger interrupt is pending). - * @rmtoll SR TIF LL_TIM_IsActiveFlag_TRIG - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_TRIG(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_TIF) == (TIM_SR_TIF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the break interrupt flag (BIF). - * @rmtoll SR BIF LL_TIM_ClearFlag_BRK - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_BRK(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_BIF)); -} - -/** - * @brief Indicate whether break interrupt flag (BIF) is set (break interrupt is pending). - * @rmtoll SR BIF LL_TIM_IsActiveFlag_BRK - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_BRK(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_BIF) == (TIM_SR_BIF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 1 over-capture interrupt flag (CC1OF). - * @rmtoll SR CC1OF LL_TIM_ClearFlag_CC1OVR - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC1OVR(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC1OF)); -} - -/** - * @brief Indicate whether Capture/Compare 1 over-capture interrupt flag (CC1OF) is set - * (Capture/Compare 1 interrupt is pending). - * @rmtoll SR CC1OF LL_TIM_IsActiveFlag_CC1OVR - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC1OVR(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC1OF) == (TIM_SR_CC1OF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 2 over-capture interrupt flag (CC2OF). - * @rmtoll SR CC2OF LL_TIM_ClearFlag_CC2OVR - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC2OVR(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC2OF)); -} - -/** - * @brief Indicate whether Capture/Compare 2 over-capture interrupt flag (CC2OF) is set - * (Capture/Compare 2 over-capture interrupt is pending). - * @rmtoll SR CC2OF LL_TIM_IsActiveFlag_CC2OVR - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC2OVR(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC2OF) == (TIM_SR_CC2OF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 3 over-capture interrupt flag (CC3OF). - * @rmtoll SR CC3OF LL_TIM_ClearFlag_CC3OVR - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC3OVR(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC3OF)); -} - -/** - * @brief Indicate whether Capture/Compare 3 over-capture interrupt flag (CC3OF) is set - * (Capture/Compare 3 over-capture interrupt is pending). - * @rmtoll SR CC3OF LL_TIM_IsActiveFlag_CC3OVR - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC3OVR(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC3OF) == (TIM_SR_CC3OF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 4 over-capture interrupt flag (CC4OF). - * @rmtoll SR CC4OF LL_TIM_ClearFlag_CC4OVR - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC4OVR(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC4OF)); -} - -/** - * @brief Indicate whether Capture/Compare 4 over-capture interrupt flag (CC4OF) is set - * (Capture/Compare 4 over-capture interrupt is pending). - * @rmtoll SR CC4OF LL_TIM_IsActiveFlag_CC4OVR - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC4OVR(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC4OF) == (TIM_SR_CC4OF)) ? 1UL : 0UL); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_IT_Management IT-Management - * @{ - */ -/** - * @brief Enable update interrupt (UIE). - * @rmtoll DIER UIE LL_TIM_EnableIT_UPDATE - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_UPDATE(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_UIE); -} - -/** - * @brief Disable update interrupt (UIE). - * @rmtoll DIER UIE LL_TIM_DisableIT_UPDATE - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_UPDATE(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_UIE); -} - -/** - * @brief Indicates whether the update interrupt (UIE) is enabled. - * @rmtoll DIER UIE LL_TIM_IsEnabledIT_UPDATE - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_UPDATE(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_UIE) == (TIM_DIER_UIE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 1 interrupt (CC1IE). - * @rmtoll DIER CC1IE LL_TIM_EnableIT_CC1 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_CC1(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC1IE); -} - -/** - * @brief Disable capture/compare 1 interrupt (CC1IE). - * @rmtoll DIER CC1IE LL_TIM_DisableIT_CC1 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_CC1(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC1IE); -} - -/** - * @brief Indicates whether the capture/compare 1 interrupt (CC1IE) is enabled. - * @rmtoll DIER CC1IE LL_TIM_IsEnabledIT_CC1 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC1(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC1IE) == (TIM_DIER_CC1IE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 2 interrupt (CC2IE). - * @rmtoll DIER CC2IE LL_TIM_EnableIT_CC2 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_CC2(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC2IE); -} - -/** - * @brief Disable capture/compare 2 interrupt (CC2IE). - * @rmtoll DIER CC2IE LL_TIM_DisableIT_CC2 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_CC2(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC2IE); -} - -/** - * @brief Indicates whether the capture/compare 2 interrupt (CC2IE) is enabled. - * @rmtoll DIER CC2IE LL_TIM_IsEnabledIT_CC2 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC2(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC2IE) == (TIM_DIER_CC2IE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 3 interrupt (CC3IE). - * @rmtoll DIER CC3IE LL_TIM_EnableIT_CC3 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_CC3(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC3IE); -} - -/** - * @brief Disable capture/compare 3 interrupt (CC3IE). - * @rmtoll DIER CC3IE LL_TIM_DisableIT_CC3 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_CC3(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC3IE); -} - -/** - * @brief Indicates whether the capture/compare 3 interrupt (CC3IE) is enabled. - * @rmtoll DIER CC3IE LL_TIM_IsEnabledIT_CC3 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC3(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC3IE) == (TIM_DIER_CC3IE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 4 interrupt (CC4IE). - * @rmtoll DIER CC4IE LL_TIM_EnableIT_CC4 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_CC4(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC4IE); -} - -/** - * @brief Disable capture/compare 4 interrupt (CC4IE). - * @rmtoll DIER CC4IE LL_TIM_DisableIT_CC4 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_CC4(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC4IE); -} - -/** - * @brief Indicates whether the capture/compare 4 interrupt (CC4IE) is enabled. - * @rmtoll DIER CC4IE LL_TIM_IsEnabledIT_CC4 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC4(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC4IE) == (TIM_DIER_CC4IE)) ? 1UL : 0UL); -} - -/** - * @brief Enable commutation interrupt (COMIE). - * @rmtoll DIER COMIE LL_TIM_EnableIT_COM - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_COM(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_COMIE); -} - -/** - * @brief Disable commutation interrupt (COMIE). - * @rmtoll DIER COMIE LL_TIM_DisableIT_COM - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_COM(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_COMIE); -} - -/** - * @brief Indicates whether the commutation interrupt (COMIE) is enabled. - * @rmtoll DIER COMIE LL_TIM_IsEnabledIT_COM - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_COM(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_COMIE) == (TIM_DIER_COMIE)) ? 1UL : 0UL); -} - -/** - * @brief Enable trigger interrupt (TIE). - * @rmtoll DIER TIE LL_TIM_EnableIT_TRIG - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_TRIG(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_TIE); -} - -/** - * @brief Disable trigger interrupt (TIE). - * @rmtoll DIER TIE LL_TIM_DisableIT_TRIG - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_TRIG(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_TIE); -} - -/** - * @brief Indicates whether the trigger interrupt (TIE) is enabled. - * @rmtoll DIER TIE LL_TIM_IsEnabledIT_TRIG - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_TRIG(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_TIE) == (TIM_DIER_TIE)) ? 1UL : 0UL); -} - -/** - * @brief Enable break interrupt (BIE). - * @rmtoll DIER BIE LL_TIM_EnableIT_BRK - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_BRK(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_BIE); -} - -/** - * @brief Disable break interrupt (BIE). - * @rmtoll DIER BIE LL_TIM_DisableIT_BRK - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_BRK(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_BIE); -} - -/** - * @brief Indicates whether the break interrupt (BIE) is enabled. - * @rmtoll DIER BIE LL_TIM_IsEnabledIT_BRK - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_BRK(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_BIE) == (TIM_DIER_BIE)) ? 1UL : 0UL); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_DMA_Management DMA Management - * @{ - */ -/** - * @brief Enable update DMA request (UDE). - * @rmtoll DIER UDE LL_TIM_EnableDMAReq_UPDATE - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_UPDATE(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_UDE); -} - -/** - * @brief Disable update DMA request (UDE). - * @rmtoll DIER UDE LL_TIM_DisableDMAReq_UPDATE - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_UPDATE(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_UDE); -} - -/** - * @brief Indicates whether the update DMA request (UDE) is enabled. - * @rmtoll DIER UDE LL_TIM_IsEnabledDMAReq_UPDATE - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_UPDATE(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_UDE) == (TIM_DIER_UDE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 1 DMA request (CC1DE). - * @rmtoll DIER CC1DE LL_TIM_EnableDMAReq_CC1 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_CC1(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC1DE); -} - -/** - * @brief Disable capture/compare 1 DMA request (CC1DE). - * @rmtoll DIER CC1DE LL_TIM_DisableDMAReq_CC1 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_CC1(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC1DE); -} - -/** - * @brief Indicates whether the capture/compare 1 DMA request (CC1DE) is enabled. - * @rmtoll DIER CC1DE LL_TIM_IsEnabledDMAReq_CC1 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC1(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC1DE) == (TIM_DIER_CC1DE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 2 DMA request (CC2DE). - * @rmtoll DIER CC2DE LL_TIM_EnableDMAReq_CC2 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_CC2(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC2DE); -} - -/** - * @brief Disable capture/compare 2 DMA request (CC2DE). - * @rmtoll DIER CC2DE LL_TIM_DisableDMAReq_CC2 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_CC2(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC2DE); -} - -/** - * @brief Indicates whether the capture/compare 2 DMA request (CC2DE) is enabled. - * @rmtoll DIER CC2DE LL_TIM_IsEnabledDMAReq_CC2 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC2(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC2DE) == (TIM_DIER_CC2DE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 3 DMA request (CC3DE). - * @rmtoll DIER CC3DE LL_TIM_EnableDMAReq_CC3 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_CC3(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC3DE); -} - -/** - * @brief Disable capture/compare 3 DMA request (CC3DE). - * @rmtoll DIER CC3DE LL_TIM_DisableDMAReq_CC3 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_CC3(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC3DE); -} - -/** - * @brief Indicates whether the capture/compare 3 DMA request (CC3DE) is enabled. - * @rmtoll DIER CC3DE LL_TIM_IsEnabledDMAReq_CC3 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC3(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC3DE) == (TIM_DIER_CC3DE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 4 DMA request (CC4DE). - * @rmtoll DIER CC4DE LL_TIM_EnableDMAReq_CC4 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_CC4(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC4DE); -} - -/** - * @brief Disable capture/compare 4 DMA request (CC4DE). - * @rmtoll DIER CC4DE LL_TIM_DisableDMAReq_CC4 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_CC4(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC4DE); -} - -/** - * @brief Indicates whether the capture/compare 4 DMA request (CC4DE) is enabled. - * @rmtoll DIER CC4DE LL_TIM_IsEnabledDMAReq_CC4 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC4(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC4DE) == (TIM_DIER_CC4DE)) ? 1UL : 0UL); -} - -/** - * @brief Enable commutation DMA request (COMDE). - * @rmtoll DIER COMDE LL_TIM_EnableDMAReq_COM - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_COM(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_COMDE); -} - -/** - * @brief Disable commutation DMA request (COMDE). - * @rmtoll DIER COMDE LL_TIM_DisableDMAReq_COM - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_COM(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_COMDE); -} - -/** - * @brief Indicates whether the commutation DMA request (COMDE) is enabled. - * @rmtoll DIER COMDE LL_TIM_IsEnabledDMAReq_COM - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_COM(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_COMDE) == (TIM_DIER_COMDE)) ? 1UL : 0UL); -} - -/** - * @brief Enable trigger interrupt (TDE). - * @rmtoll DIER TDE LL_TIM_EnableDMAReq_TRIG - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_TRIG(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_TDE); -} - -/** - * @brief Disable trigger interrupt (TDE). - * @rmtoll DIER TDE LL_TIM_DisableDMAReq_TRIG - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_TRIG(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_TDE); -} - -/** - * @brief Indicates whether the trigger interrupt (TDE) is enabled. - * @rmtoll DIER TDE LL_TIM_IsEnabledDMAReq_TRIG - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_TRIG(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_TDE) == (TIM_DIER_TDE)) ? 1UL : 0UL); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_EVENT_Management EVENT-Management - * @{ - */ -/** - * @brief Generate an update event. - * @rmtoll EGR UG LL_TIM_GenerateEvent_UPDATE - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_UPDATE(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_UG); -} - -/** - * @brief Generate Capture/Compare 1 event. - * @rmtoll EGR CC1G LL_TIM_GenerateEvent_CC1 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_CC1(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_CC1G); -} - -/** - * @brief Generate Capture/Compare 2 event. - * @rmtoll EGR CC2G LL_TIM_GenerateEvent_CC2 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_CC2(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_CC2G); -} - -/** - * @brief Generate Capture/Compare 3 event. - * @rmtoll EGR CC3G LL_TIM_GenerateEvent_CC3 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_CC3(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_CC3G); -} - -/** - * @brief Generate Capture/Compare 4 event. - * @rmtoll EGR CC4G LL_TIM_GenerateEvent_CC4 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_CC4(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_CC4G); -} - -/** - * @brief Generate commutation event. - * @rmtoll EGR COMG LL_TIM_GenerateEvent_COM - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_COM(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_COMG); -} - -/** - * @brief Generate trigger event. - * @rmtoll EGR TG LL_TIM_GenerateEvent_TRIG - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_TRIG(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_TG); -} - -/** - * @brief Generate break event. - * @rmtoll EGR BG LL_TIM_GenerateEvent_BRK - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_BRK(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_BG); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup TIM_LL_EF_Init Initialisation and deinitialisation functions - * @{ - */ - -ErrorStatus LL_TIM_DeInit(const TIM_TypeDef *TIMx); -void LL_TIM_StructInit(LL_TIM_InitTypeDef *TIM_InitStruct); -ErrorStatus LL_TIM_Init(TIM_TypeDef *TIMx, const LL_TIM_InitTypeDef *TIM_InitStruct); -void LL_TIM_OC_StructInit(LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct); -ErrorStatus LL_TIM_OC_Init(TIM_TypeDef *TIMx, uint32_t Channel, const LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct); -void LL_TIM_IC_StructInit(LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); -ErrorStatus LL_TIM_IC_Init(TIM_TypeDef *TIMx, uint32_t Channel, const LL_TIM_IC_InitTypeDef *TIM_IC_InitStruct); -void LL_TIM_ENCODER_StructInit(LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct); -ErrorStatus LL_TIM_ENCODER_Init(TIM_TypeDef *TIMx, const LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct); -void LL_TIM_HALLSENSOR_StructInit(LL_TIM_HALLSENSOR_InitTypeDef *TIM_HallSensorInitStruct); -ErrorStatus LL_TIM_HALLSENSOR_Init(TIM_TypeDef *TIMx, const LL_TIM_HALLSENSOR_InitTypeDef *TIM_HallSensorInitStruct); -void LL_TIM_BDTR_StructInit(LL_TIM_BDTR_InitTypeDef *TIM_BDTRInitStruct); -ErrorStatus LL_TIM_BDTR_Init(TIM_TypeDef *TIMx, const LL_TIM_BDTR_InitTypeDef *TIM_BDTRInitStruct); -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* TIM1 || TIM2 || TIM3 || TIM4 || TIM5 || TIM6 || TIM7 || TIM8 || TIM9 || TIM10 || TIM11 || TIM12 || TIM13 || TIM14 */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_TIM_H */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usb.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usb.h deleted file mode 100644 index caabcf3..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usb.h +++ /dev/null @@ -1,578 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_usb.h - * @author MCD Application Team - * @brief Header file of USB Low Layer HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_LL_USB_H -#define STM32F4xx_LL_USB_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup USB_LL - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -#ifndef HAL_USB_TIMEOUT -#define HAL_USB_TIMEOUT 0xF000000U -#endif /* define HAL_USB_TIMEOUT */ - -#ifndef HAL_USB_CURRENT_MODE_MAX_DELAY_MS -#define HAL_USB_CURRENT_MODE_MAX_DELAY_MS 200U -#endif /* define HAL_USB_CURRENT_MODE_MAX_DELAY_MS */ - -/** - * @brief USB Mode definition - */ - -typedef enum -{ - USB_DEVICE_MODE = 0, - USB_HOST_MODE = 1, - USB_DRD_MODE = 2 -} USB_ModeTypeDef; - -/** - * @brief URB States definition - */ -typedef enum -{ - URB_IDLE = 0, - URB_DONE, - URB_NOTREADY, - URB_NYET, - URB_ERROR, - URB_STALL -} USB_URBStateTypeDef; - -/** - * @brief Host channel States definition - */ -typedef enum -{ - HC_IDLE = 0, - HC_XFRC, - HC_HALTED, - HC_ACK, - HC_NAK, - HC_NYET, - HC_STALL, - HC_XACTERR, - HC_BBLERR, - HC_DATATGLERR -} USB_HCStateTypeDef; - - -/** - * @brief USB Instance Initialization Structure definition - */ -typedef struct -{ - uint8_t dev_endpoints; /*!< Device Endpoints number. - This parameter depends on the used USB core. - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint8_t Host_channels; /*!< Host Channels number. - This parameter Depends on the used USB core. - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint8_t dma_enable; /*!< USB DMA state. - If DMA is not supported this parameter shall be set by default to zero */ - - uint8_t speed; /*!< USB Core speed. - This parameter can be any value of @ref PCD_Speed/HCD_Speed - (HCD_SPEED_xxx, HCD_SPEED_xxx) */ - - uint8_t ep0_mps; /*!< Set the Endpoint 0 Max Packet size. */ - - uint8_t phy_itface; /*!< Select the used PHY interface. - This parameter can be any value of @ref PCD_PHY_Module/HCD_PHY_Module */ - - uint8_t Sof_enable; /*!< Enable or disable the output of the SOF signal. */ - - uint8_t low_power_enable; /*!< Enable or disable the low Power Mode. */ - - uint8_t lpm_enable; /*!< Enable or disable Link Power Management. */ - - uint8_t battery_charging_enable; /*!< Enable or disable Battery charging. */ - - uint8_t vbus_sensing_enable; /*!< Enable or disable the VBUS Sensing feature. */ - - uint8_t use_dedicated_ep1; /*!< Enable or disable the use of the dedicated EP1 interrupt. */ - - uint8_t use_external_vbus; /*!< Enable or disable the use of the external VBUS. */ - -} USB_CfgTypeDef; - -typedef struct -{ - uint8_t num; /*!< Endpoint number - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint8_t is_in; /*!< Endpoint direction - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t is_stall; /*!< Endpoint stall condition - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t is_iso_incomplete; /*!< Endpoint isoc condition - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t type; /*!< Endpoint type - This parameter can be any value of @ref USB_LL_EP_Type */ - - uint8_t data_pid_start; /*!< Initial data PID - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint32_t maxpacket; /*!< Endpoint Max packet size - This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */ - - uint8_t *xfer_buff; /*!< Pointer to transfer buffer */ - - uint32_t xfer_len; /*!< Current transfer length */ - - uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer */ - - uint8_t even_odd_frame; /*!< IFrame parity - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint16_t tx_fifo_num; /*!< Transmission FIFO number - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint32_t dma_addr; /*!< 32 bits aligned transfer buffer address */ - - uint32_t xfer_size; /*!< requested transfer size */ -} USB_EPTypeDef; - -typedef struct -{ - uint8_t dev_addr; /*!< USB device address. - This parameter must be a number between Min_Data = 1 and Max_Data = 255 */ - - uint8_t ch_num; /*!< Host channel number. - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint8_t ep_num; /*!< Endpoint number. - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint8_t ep_is_in; /*!< Endpoint direction - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t speed; /*!< USB Host Channel speed. - This parameter can be any value of @ref HCD_Device_Speed: - (HCD_DEVICE_SPEED_xxx) */ - - uint8_t do_ping; /*!< Enable or disable the use of the PING protocol for HS mode. */ - uint8_t do_ssplit; /*!< Enable start split transaction in HS mode. */ - uint8_t do_csplit; /*!< Enable complete split transaction in HS mode. */ - uint8_t ep_ss_schedule; /*!< Enable periodic endpoint start split schedule . */ - uint32_t iso_splt_xactPos; /*!< iso split transfer transaction position. */ - - uint8_t hub_port_nbr; /*!< USB HUB port number */ - uint8_t hub_addr; /*!< USB HUB address */ - - uint8_t ep_type; /*!< Endpoint Type. - This parameter can be any value of @ref USB_LL_EP_Type */ - - uint16_t max_packet; /*!< Endpoint Max packet size. - This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */ - - uint8_t data_pid; /*!< Initial data PID. - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t *xfer_buff; /*!< Pointer to transfer buffer. */ - - uint32_t XferSize; /*!< OTG Channel transfer size. */ - - uint32_t xfer_len; /*!< Current transfer length. */ - - uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer. */ - - uint8_t toggle_in; /*!< IN transfer current toggle flag. - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t toggle_out; /*!< OUT transfer current toggle flag - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint32_t dma_addr; /*!< 32 bits aligned transfer buffer address. */ - - uint32_t ErrCnt; /*!< Host channel error count. */ - uint32_t NyetErrCnt; /*!< Complete Split NYET Host channel error count. */ - - USB_URBStateTypeDef urb_state; /*!< URB state. - This parameter can be any value of @ref USB_URBStateTypeDef */ - - USB_HCStateTypeDef state; /*!< Host Channel state. - This parameter can be any value of @ref USB_HCStateTypeDef */ -} USB_HCTypeDef; - -typedef USB_ModeTypeDef USB_OTG_ModeTypeDef; -typedef USB_CfgTypeDef USB_OTG_CfgTypeDef; -typedef USB_EPTypeDef USB_OTG_EPTypeDef; -typedef USB_URBStateTypeDef USB_OTG_URBStateTypeDef; -typedef USB_HCStateTypeDef USB_OTG_HCStateTypeDef; -typedef USB_HCTypeDef USB_OTG_HCTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup PCD_Exported_Constants PCD Exported Constants - * @{ - */ - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** @defgroup USB_OTG_CORE VERSION ID - * @{ - */ -#define USB_OTG_CORE_ID_300A 0x4F54300AU -#define USB_OTG_CORE_ID_310A 0x4F54310AU -/** - * @} - */ - -/** @defgroup USB_Core_Mode_ USB Core Mode - * @{ - */ -#define USB_OTG_MODE_DEVICE 0U -#define USB_OTG_MODE_HOST 1U -#define USB_OTG_MODE_DRD 2U -/** - * @} - */ - -/** @defgroup USB_LL_Core_Speed USB Low Layer Core Speed - * @{ - */ -#define USB_OTG_SPEED_HIGH 0U -#define USB_OTG_SPEED_HIGH_IN_FULL 1U -#define USB_OTG_SPEED_FULL 3U -/** - * @} - */ - -/** @defgroup USB_LL_Core_PHY USB Low Layer Core PHY - * @{ - */ -#define USB_OTG_ULPI_PHY 1U -#define USB_OTG_EMBEDDED_PHY 2U -/** - * @} - */ - -/** @defgroup USB_LL_Turnaround_Timeout Turnaround Timeout Value - * @{ - */ -#ifndef USBD_HS_TRDT_VALUE -#define USBD_HS_TRDT_VALUE 9U -#endif /* USBD_HS_TRDT_VALUE */ -#ifndef USBD_FS_TRDT_VALUE -#define USBD_FS_TRDT_VALUE 5U -#define USBD_DEFAULT_TRDT_VALUE 9U -#endif /* USBD_HS_TRDT_VALUE */ -/** - * @} - */ - -/** @defgroup USB_LL_Core_MPS USB Low Layer Core MPS - * @{ - */ -#define USB_OTG_HS_MAX_PACKET_SIZE 512U -#define USB_OTG_FS_MAX_PACKET_SIZE 64U -#define USB_OTG_MAX_EP0_SIZE 64U -/** - * @} - */ - -/** @defgroup USB_LL_Core_PHY_Frequency USB Low Layer Core PHY Frequency - * @{ - */ -#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ (0U << 1) -#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ (1U << 1) -#define DSTS_ENUMSPD_FS_PHY_48MHZ (3U << 1) -/** - * @} - */ - -/** @defgroup USB_LL_CORE_Frame_Interval USB Low Layer Core Frame Interval - * @{ - */ -#define DCFG_FRAME_INTERVAL_80 0U -#define DCFG_FRAME_INTERVAL_85 1U -#define DCFG_FRAME_INTERVAL_90 2U -#define DCFG_FRAME_INTERVAL_95 3U -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -/** @defgroup USB_LL_EP0_MPS USB Low Layer EP0 MPS - * @{ - */ -#define EP_MPS_64 0U -#define EP_MPS_32 1U -#define EP_MPS_16 2U -#define EP_MPS_8 3U -/** - * @} - */ - -/** @defgroup USB_LL_EP_Type USB Low Layer EP Type - * @{ - */ -#define EP_TYPE_CTRL 0U -#define EP_TYPE_ISOC 1U -#define EP_TYPE_BULK 2U -#define EP_TYPE_INTR 3U -#define EP_TYPE_MSK 3U -/** - * @} - */ - -/** @defgroup USB_LL_EP_Speed USB Low Layer EP Speed - * @{ - */ -#define EP_SPEED_LOW 0U -#define EP_SPEED_FULL 1U -#define EP_SPEED_HIGH 2U -/** - * @} - */ - -/** @defgroup USB_LL_CH_PID_Type USB Low Layer Channel PID Type - * @{ - */ -#define HC_PID_DATA0 0U -#define HC_PID_DATA2 1U -#define HC_PID_DATA1 2U -#define HC_PID_SETUP 3U -/** - * @} - */ - -/** @defgroup USB_LL Device Speed - * @{ - */ -#define USBD_HS_SPEED 0U -#define USBD_HSINFS_SPEED 1U -#define USBH_HS_SPEED 0U -#define USBD_FS_SPEED 2U -#define USBH_FSLS_SPEED 1U -/** - * @} - */ - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** @defgroup USB_LL_STS_Defines USB Low Layer STS Defines - * @{ - */ -#define STS_GOUT_NAK 1U -#define STS_DATA_UPDT 2U -#define STS_XFER_COMP 3U -#define STS_SETUP_COMP 4U -#define STS_SETUP_UPDT 6U -/** - * @} - */ - -/** @defgroup USB_LL_HCFG_SPEED_Defines USB Low Layer HCFG Speed Defines - * @{ - */ -#define HCFG_30_60_MHZ 0U -#define HCFG_48_MHZ 1U -#define HCFG_6_MHZ 2U -/** - * @} - */ - -/** @defgroup USB_LL_HFIR_Defines USB Low Layer frame interval Defines - * @{ - */ -#define HFIR_6_MHZ 6000U -#define HFIR_60_MHZ 60000U -#define HFIR_48_MHZ 48000U -/** - * @} - */ - -/** @defgroup USB_LL_HPRT0_PRTSPD_SPEED_Defines USB Low Layer HPRT0 PRTSPD Speed Defines - * @{ - */ -#define HPRT0_PRTSPD_HIGH_SPEED 0U -#define HPRT0_PRTSPD_FULL_SPEED 1U -#define HPRT0_PRTSPD_LOW_SPEED 2U -/** - * @} - */ - -#define HCCHAR_CTRL 0U -#define HCCHAR_ISOC 1U -#define HCCHAR_BULK 2U -#define HCCHAR_INTR 3U - -#define GRXSTS_PKTSTS_IN 2U -#define GRXSTS_PKTSTS_IN_XFER_COMP 3U -#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5U -#define GRXSTS_PKTSTS_CH_HALTED 7U - -#define CLEAR_INTERRUPT_MASK 0xFFFFFFFFU - -#define HC_MAX_PKT_CNT 256U -#define ISO_SPLT_MPS 188U - -#define HCSPLT_BEGIN 1U -#define HCSPLT_MIDDLE 2U -#define HCSPLT_END 3U -#define HCSPLT_FULL 4U - -#define TEST_J 1U -#define TEST_K 2U -#define TEST_SE0_NAK 3U -#define TEST_PACKET 4U -#define TEST_FORCE_EN 5U - -#define USBx_PCGCCTL *(__IO uint32_t *)((uint32_t)USBx_BASE + USB_OTG_PCGCCTL_BASE) -#define USBx_HPRT0 *(__IO uint32_t *)((uint32_t)USBx_BASE + USB_OTG_HOST_PORT_BASE) - -#define USBx_DEVICE ((USB_OTG_DeviceTypeDef *)(USBx_BASE + USB_OTG_DEVICE_BASE)) -#define USBx_INEP(i) ((USB_OTG_INEndpointTypeDef *)(USBx_BASE\ - + USB_OTG_IN_ENDPOINT_BASE + ((i) * USB_OTG_EP_REG_SIZE))) - -#define USBx_OUTEP(i) ((USB_OTG_OUTEndpointTypeDef *)(USBx_BASE\ - + USB_OTG_OUT_ENDPOINT_BASE + ((i) * USB_OTG_EP_REG_SIZE))) - -#define USBx_DFIFO(i) *(__IO uint32_t *)(USBx_BASE + USB_OTG_FIFO_BASE + ((i) * USB_OTG_FIFO_SIZE)) - -#define USBx_HOST ((USB_OTG_HostTypeDef *)(USBx_BASE + USB_OTG_HOST_BASE)) -#define USBx_HC(i) ((USB_OTG_HostChannelTypeDef *)(USBx_BASE\ - + USB_OTG_HOST_CHANNEL_BASE\ - + ((i) * USB_OTG_HOST_CHANNEL_SIZE))) - - -#define EP_ADDR_MSK 0xFU -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup USB_LL_Exported_Macros USB Low Layer Exported Macros - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -#define USB_MASK_INTERRUPT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->GINTMSK &= ~(__INTERRUPT__)) -#define USB_UNMASK_INTERRUPT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->GINTMSK |= (__INTERRUPT__)) - -#define CLEAR_IN_EP_INTR(__EPNUM__, __INTERRUPT__) (USBx_INEP(__EPNUM__)->DIEPINT = (__INTERRUPT__)) -#define CLEAR_OUT_EP_INTR(__EPNUM__, __INTERRUPT__) (USBx_OUTEP(__EPNUM__)->DOEPINT = (__INTERRUPT__)) -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup USB_LL_Exported_Functions USB Low Layer Exported Functions - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg); -HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg); -HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, uint32_t hclk, uint8_t speed); -HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx, USB_OTG_ModeTypeDef mode); -HAL_StatusTypeDef USB_SetDevSpeed(const USB_OTG_GlobalTypeDef *USBx, uint8_t speed); -HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num); -HAL_StatusTypeDef USB_ActivateEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_DeactivateEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep, uint8_t dma); -HAL_StatusTypeDef USB_WritePacket(const USB_OTG_GlobalTypeDef *USBx, uint8_t *src, - uint8_t ch_ep_num, uint16_t len, uint8_t dma); - -void *USB_ReadPacket(const USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len); -HAL_StatusTypeDef USB_EPSetStall(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_EPClearStall(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_EPStopXfer(const USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_SetDevAddress(const USB_OTG_GlobalTypeDef *USBx, uint8_t address); -HAL_StatusTypeDef USB_DevConnect(const USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_DevDisconnect(const USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_ActivateSetup(const USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_EP0_OutStart(const USB_OTG_GlobalTypeDef *USBx, uint8_t dma, const uint8_t *psetup); -uint8_t USB_GetDevSpeed(const USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_GetMode(const USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_ReadInterrupts(USB_OTG_GlobalTypeDef const *USBx); -uint32_t USB_ReadChInterrupts(const USB_OTG_GlobalTypeDef *USBx, uint8_t chnum); -uint32_t USB_ReadDevAllOutEpInterrupt(const USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_ReadDevOutEPInterrupt(const USB_OTG_GlobalTypeDef *USBx, uint8_t epnum); -uint32_t USB_ReadDevAllInEpInterrupt(const USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_ReadDevInEPInterrupt(const USB_OTG_GlobalTypeDef *USBx, uint8_t epnum); -void USB_ClearInterrupts(USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt); - -HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg); -HAL_StatusTypeDef USB_InitFSLSPClkSel(const USB_OTG_GlobalTypeDef *USBx, uint8_t freq); -HAL_StatusTypeDef USB_ResetPort(const USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_DriveVbus(const USB_OTG_GlobalTypeDef *USBx, uint8_t state); -uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef const *USBx); -uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef const *USBx); -HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num, - uint8_t epnum, uint8_t dev_address, uint8_t speed, - uint8_t ep_type, uint16_t mps); -HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, - USB_OTG_HCTypeDef *hc, uint8_t dma); - -uint32_t USB_HC_ReadInterrupt(const USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_HC_Halt(const USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num); -HAL_StatusTypeDef USB_DoPing(const USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num); -HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_ActivateRemoteWakeup(const USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_DeActivateRemoteWakeup(const USB_OTG_GlobalTypeDef *USBx); -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* STM32F4xx_LL_USB_H */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h deleted file mode 100644 index accdac7..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h +++ /dev/null @@ -1,307 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_utils.h - * @author MCD Application Team - * @brief Header file of UTILS LL module. - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The LL UTILS driver contains a set of generic APIs that can be - used by user: - (+) Device electronic signature - (+) Timing functions - (+) PLL configuration functions - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_UTILS_H -#define __STM32F4xx_LL_UTILS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -/** @defgroup UTILS_LL UTILS - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup UTILS_LL_Private_Constants UTILS Private Constants - * @{ - */ - -/* Max delay can be used in LL_mDelay */ -#define LL_MAX_DELAY 0xFFFFFFFFU - -/** - * @brief Unique device ID register base address - */ -#define UID_BASE_ADDRESS UID_BASE - -/** - * @brief Flash size data register base address - */ -#define FLASHSIZE_BASE_ADDRESS FLASHSIZE_BASE - -/** - * @brief Package data register base address - */ -#define PACKAGE_BASE_ADDRESS PACKAGE_BASE - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup UTILS_LL_Private_Macros UTILS Private Macros - * @{ - */ -/** - * @} - */ -/* Exported types ------------------------------------------------------------*/ -/** @defgroup UTILS_LL_ES_INIT UTILS Exported structures - * @{ - */ -/** - * @brief UTILS PLL structure definition - */ -typedef struct -{ - uint32_t PLLM; /*!< Division factor for PLL VCO input clock. - This parameter can be a value of @ref RCC_LL_EC_PLLM_DIV - - This feature can be modified afterwards using unitary function - @ref LL_RCC_PLL_ConfigDomain_SYS(). */ - - uint32_t PLLN; /*!< Multiplication factor for PLL VCO output clock. - This parameter must be a number between Min_Data = @ref RCC_PLLN_MIN_VALUE - and Max_Data = @ref RCC_PLLN_MIN_VALUE - - This feature can be modified afterwards using unitary function - @ref LL_RCC_PLL_ConfigDomain_SYS(). */ - - uint32_t PLLP; /*!< Division for the main system clock. - This parameter can be a value of @ref RCC_LL_EC_PLLP_DIV - - This feature can be modified afterwards using unitary function - @ref LL_RCC_PLL_ConfigDomain_SYS(). */ -} LL_UTILS_PLLInitTypeDef; - -/** - * @brief UTILS System, AHB and APB buses clock configuration structure definition - */ -typedef struct -{ - uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). - This parameter can be a value of @ref RCC_LL_EC_SYSCLK_DIV - - This feature can be modified afterwards using unitary function - @ref LL_RCC_SetAHBPrescaler(). */ - - uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). - This parameter can be a value of @ref RCC_LL_EC_APB1_DIV - - This feature can be modified afterwards using unitary function - @ref LL_RCC_SetAPB1Prescaler(). */ - - uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). - This parameter can be a value of @ref RCC_LL_EC_APB2_DIV - - This feature can be modified afterwards using unitary function - @ref LL_RCC_SetAPB2Prescaler(). */ - -} LL_UTILS_ClkInitTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup UTILS_LL_Exported_Constants UTILS Exported Constants - * @{ - */ - -/** @defgroup UTILS_EC_HSE_BYPASS HSE Bypass activation - * @{ - */ -#define LL_UTILS_HSEBYPASS_OFF 0x00000000U /*!< HSE Bypass is not enabled */ -#define LL_UTILS_HSEBYPASS_ON 0x00000001U /*!< HSE Bypass is enabled */ -/** - * @} - */ - -/** @defgroup UTILS_EC_PACKAGETYPE PACKAGE TYPE - * @{ - */ -#define LL_UTILS_PACKAGETYPE_WLCSP36_UFQFPN48_LQFP64 0x00000000U /*!< WLCSP36 or UFQFPN48 or LQFP64 package type */ -#define LL_UTILS_PACKAGETYPE_WLCSP168_FBGA169_LQFP100_LQFP64_UFQFPN48 0x00000100U /*!< WLCSP168 or FBGA169 or LQFP100 or LQFP64 or UFQFPN48 package type */ -#define LL_UTILS_PACKAGETYPE_WLCSP64_WLCSP81_LQFP176_UFBGA176 0x00000200U /*!< WLCSP64 or WLCSP81 or LQFP176 or UFBGA176 package type */ -#define LL_UTILS_PACKAGETYPE_LQFP144_UFBGA144_UFBGA144_UFBGA100 0x00000300U /*!< LQFP144 or UFBGA144 or UFBGA144 or UFBGA100 package type */ -#define LL_UTILS_PACKAGETYPE_LQFP100_LQFP208_TFBGA216 0x00000400U /*!< LQFP100 or LQFP208 or TFBGA216 package type */ -#define LL_UTILS_PACKAGETYPE_LQFP208_TFBGA216 0x00000500U /*!< LQFP208 or TFBGA216 package type */ -#define LL_UTILS_PACKAGETYPE_TQFP64_UFBGA144_LQFP144 0x00000700U /*!< TQFP64 or UFBGA144 or LQFP144 package type */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup UTILS_LL_Exported_Functions UTILS Exported Functions - * @{ - */ - -/** @defgroup UTILS_EF_DEVICE_ELECTRONIC_SIGNATURE DEVICE ELECTRONIC SIGNATURE - * @{ - */ - -/** - * @brief Get Word0 of the unique device identifier (UID based on 96 bits) - * @retval UID[31:0] - */ -__STATIC_INLINE uint32_t LL_GetUID_Word0(void) -{ - return (uint32_t)(READ_REG(*((uint32_t *)UID_BASE_ADDRESS))); -} - -/** - * @brief Get Word1 of the unique device identifier (UID based on 96 bits) - * @retval UID[63:32] - */ -__STATIC_INLINE uint32_t LL_GetUID_Word1(void) -{ - return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 4U)))); -} - -/** - * @brief Get Word2 of the unique device identifier (UID based on 96 bits) - * @retval UID[95:64] - */ -__STATIC_INLINE uint32_t LL_GetUID_Word2(void) -{ - return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 8U)))); -} - -/** - * @brief Get Flash memory size - * @note This bitfield indicates the size of the device Flash memory expressed in - * Kbytes. As an example, 0x040 corresponds to 64 Kbytes. - * @retval FLASH_SIZE[15:0]: Flash memory size - */ -__STATIC_INLINE uint32_t LL_GetFlashSize(void) -{ - return (uint32_t)(READ_REG(*((uint32_t *)FLASHSIZE_BASE_ADDRESS)) & 0xFFFF); -} - -/** - * @brief Get Package type - * @retval Returned value can be one of the following values: - * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP36_UFQFPN48_LQFP64 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP168_FBGA169_LQFP100_LQFP64_UFQFPN48 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP64_WLCSP81_LQFP176_UFBGA176 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_LQFP144_UFBGA144_UFBGA144_UFBGA100 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_LQFP100_LQFP208_TFBGA216 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_LQFP208_TFBGA216 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_TQFP64_UFBGA144_LQFP144 (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_GetPackageType(void) -{ - return (uint32_t)(READ_REG(*((uint32_t *)PACKAGE_BASE_ADDRESS)) & 0x0700U); -} - -/** - * @} - */ - -/** @defgroup UTILS_LL_EF_DELAY DELAY - * @{ - */ - -/** - * @brief This function configures the Cortex-M SysTick source of the time base. - * @param HCLKFrequency HCLK frequency in Hz (can be calculated thanks to RCC helper macro) - * @note When a RTOS is used, it is recommended to avoid changing the SysTick - * configuration by calling this function, for a delay use rather osDelay RTOS service. - * @param Ticks Frequency of Ticks (Hz) - * @retval None - */ -__STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks) -{ - /* Configure the SysTick to have interrupt in 1ms time base */ - SysTick->LOAD = (uint32_t)((HCLKFrequency / Ticks) - 1UL); /* set reload register */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */ -} - -void LL_Init1msTick(uint32_t HCLKFrequency); -void LL_mDelay(uint32_t Delay); - -/** - * @} - */ - -/** @defgroup UTILS_EF_SYSTEM SYSTEM - * @{ - */ - -void LL_SetSystemCoreClock(uint32_t HCLKFrequency); -ErrorStatus LL_SetFlashLatency(uint32_t HCLK_Frequency); -ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, - LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); -ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass, - LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_UTILS_H */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt deleted file mode 100644 index 3edc4d1..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt +++ /dev/null @@ -1,6 +0,0 @@ -This software component is provided to you as part of a software package and -applicable license terms are in the Package_license file. If you received this -software component outside of a package or without applicable license terms, -the terms of the BSD-3-Clause license shall apply. -You may obtain a copy of the BSD-3-Clause at: -https://opensource.org/licenses/BSD-3-Clause diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c deleted file mode 100644 index 4497de6..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c +++ /dev/null @@ -1,616 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal.c - * @author MCD Application Team - * @brief HAL module driver. - * This is the common part of the HAL initialization - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The common HAL driver contains a set of generic and common APIs that can be - used by the PPP peripheral drivers and the user to start using the HAL. - [..] - The HAL contains two APIs' categories: - (+) Common HAL APIs - (+) Services HAL APIs - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup HAL HAL - * @brief HAL module driver. - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup HAL_Private_Constants - * @{ - */ -/** - * @brief STM32F4xx HAL Driver version number V1.8.3 - */ -#define __STM32F4xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ -#define __STM32F4xx_HAL_VERSION_SUB1 (0x08U) /*!< [23:16] sub1 version */ -#define __STM32F4xx_HAL_VERSION_SUB2 (0x03U) /*!< [15:8] sub2 version */ -#define __STM32F4xx_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */ -#define __STM32F4xx_HAL_VERSION ((__STM32F4xx_HAL_VERSION_MAIN << 24U)\ - |(__STM32F4xx_HAL_VERSION_SUB1 << 16U)\ - |(__STM32F4xx_HAL_VERSION_SUB2 << 8U )\ - |(__STM32F4xx_HAL_VERSION_RC)) - -#define IDCODE_DEVID_MASK 0x00000FFFU - -/* ------------ RCC registers bit address in the alias region ----------- */ -#define SYSCFG_OFFSET (SYSCFG_BASE - PERIPH_BASE) -/* --- MEMRMP Register ---*/ -/* Alias word address of UFB_MODE bit */ -#define MEMRMP_OFFSET SYSCFG_OFFSET -#define UFB_MODE_BIT_NUMBER SYSCFG_MEMRMP_UFB_MODE_Pos -#define UFB_MODE_BB (uint32_t)(PERIPH_BB_BASE + (MEMRMP_OFFSET * 32U) + (UFB_MODE_BIT_NUMBER * 4U)) - -/* --- CMPCR Register ---*/ -/* Alias word address of CMP_PD bit */ -#define CMPCR_OFFSET (SYSCFG_OFFSET + 0x20U) -#define CMP_PD_BIT_NUMBER SYSCFG_CMPCR_CMP_PD_Pos -#define CMPCR_CMP_PD_BB (uint32_t)(PERIPH_BB_BASE + (CMPCR_OFFSET * 32U) + (CMP_PD_BIT_NUMBER * 4U)) - -/* --- MCHDLYCR Register ---*/ -/* Alias word address of BSCKSEL bit */ -#define MCHDLYCR_OFFSET (SYSCFG_OFFSET + 0x30U) -#define BSCKSEL_BIT_NUMBER SYSCFG_MCHDLYCR_BSCKSEL_Pos -#define MCHDLYCR_BSCKSEL_BB (uint32_t)(PERIPH_BB_BASE + (MCHDLYCR_OFFSET * 32U) + (BSCKSEL_BIT_NUMBER * 4U)) -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup HAL_Private_Variables - * @{ - */ -__IO uint32_t uwTick; -uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */ -HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ -/** - * @} - */ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup HAL_Exported_Functions HAL Exported Functions - * @{ - */ - -/** @defgroup HAL_Exported_Functions_Group1 Initialization and de-initialization Functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initializes the Flash interface the NVIC allocation and initial clock - configuration. It initializes the systick also when timeout is needed - and the backup domain when enabled. - (+) De-Initializes common part of the HAL. - (+) Configure the time base source to have 1ms time base with a dedicated - Tick interrupt priority. - (++) SysTick timer is used by default as source of time base, but user - can eventually implement his proper time base source (a general purpose - timer for example or other time source), keeping in mind that Time base - duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and - handled in milliseconds basis. - (++) Time base configuration function (HAL_InitTick ()) is called automatically - at the beginning of the program after reset by HAL_Init() or at any time - when clock is configured, by HAL_RCC_ClockConfig(). - (++) Source of time base is configured to generate interrupts at regular - time intervals. Care must be taken if HAL_Delay() is called from a - peripheral ISR process, the Tick interrupt line must have higher priority - (numerically lower) than the peripheral interrupt. Otherwise the caller - ISR process will be blocked. - (++) functions affecting time base configurations are declared as __weak - to make override possible in case of other implementations in user file. -@endverbatim - * @{ - */ - -/** - * @brief This function is used to initialize the HAL Library; it must be the first - * instruction to be executed in the main program (before to call any other - * HAL function), it performs the following: - * Configure the Flash prefetch, instruction and Data caches. - * Configures the SysTick to generate an interrupt each 1 millisecond, - * which is clocked by the HSI (at this stage, the clock is not yet - * configured and thus the system is running from the internal HSI at 16 MHz). - * Set NVIC Group Priority to 4. - * Calls the HAL_MspInit() callback function defined in user file - * "stm32f4xx_hal_msp.c" to do the global low level hardware initialization - * - * @note SysTick is used as time base for the HAL_Delay() function, the application - * need to ensure that the SysTick time base is always set to 1 millisecond - * to have correct HAL operation. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_Init(void) -{ - /* Configure Flash prefetch, Instruction cache, Data cache */ -#if (INSTRUCTION_CACHE_ENABLE != 0U) - __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); -#endif /* INSTRUCTION_CACHE_ENABLE */ - -#if (DATA_CACHE_ENABLE != 0U) - __HAL_FLASH_DATA_CACHE_ENABLE(); -#endif /* DATA_CACHE_ENABLE */ - -#if (PREFETCH_ENABLE != 0U) - __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); -#endif /* PREFETCH_ENABLE */ - - /* Set Interrupt Group Priority */ - HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); - - /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ - HAL_InitTick(TICK_INT_PRIORITY); - - /* Init the low level hardware */ - HAL_MspInit(); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief This function de-Initializes common part of the HAL and stops the systick. - * This function is optional. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DeInit(void) -{ - /* Reset of all peripherals */ - __HAL_RCC_APB1_FORCE_RESET(); - __HAL_RCC_APB1_RELEASE_RESET(); - - __HAL_RCC_APB2_FORCE_RESET(); - __HAL_RCC_APB2_RELEASE_RESET(); - - __HAL_RCC_AHB1_FORCE_RESET(); - __HAL_RCC_AHB1_RELEASE_RESET(); - - __HAL_RCC_AHB2_FORCE_RESET(); - __HAL_RCC_AHB2_RELEASE_RESET(); - - __HAL_RCC_AHB3_FORCE_RESET(); - __HAL_RCC_AHB3_RELEASE_RESET(); - - /* De-Init the low level hardware */ - HAL_MspDeInit(); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initialize the MSP. - * @retval None - */ -__weak void HAL_MspInit(void) -{ - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes the MSP. - * @retval None - */ -__weak void HAL_MspDeInit(void) -{ - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief This function configures the source of the time base. - * The time source is configured to have 1ms time base with a dedicated - * Tick interrupt priority. - * @note This function is called automatically at the beginning of program after - * reset by HAL_Init() or at any time when clock is reconfigured by HAL_RCC_ClockConfig(). - * @note In the default implementation, SysTick timer is the source of time base. - * It is used to generate interrupts at regular time intervals. - * Care must be taken if HAL_Delay() is called from a peripheral ISR process, - * The SysTick interrupt must have higher priority (numerically lower) - * than the peripheral interrupt. Otherwise the caller ISR process will be blocked. - * The function is declared as __weak to be overwritten in case of other - * implementation in user file. - * @param TickPriority Tick interrupt priority. - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) -{ - /* Configure the SysTick to have interrupt in 1ms time basis*/ - if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) - { - return HAL_ERROR; - } - - /* Configure the SysTick IRQ priority */ - if (TickPriority < (1UL << __NVIC_PRIO_BITS)) - { - HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); - uwTickPrio = TickPriority; - } - else - { - return HAL_ERROR; - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup HAL_Exported_Functions_Group2 HAL Control functions - * @brief HAL Control functions - * -@verbatim - =============================================================================== - ##### HAL Control functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Provide a tick value in millisecond - (+) Provide a blocking delay in millisecond - (+) Suspend the time base source interrupt - (+) Resume the time base source interrupt - (+) Get the HAL API driver version - (+) Get the device identifier - (+) Get the device revision identifier - (+) Enable/Disable Debug module during SLEEP mode - (+) Enable/Disable Debug module during STOP mode - (+) Enable/Disable Debug module during STANDBY mode - -@endverbatim - * @{ - */ - -/** - * @brief This function is called to increment a global variable "uwTick" - * used as application time base. - * @note In the default implementation, this variable is incremented each 1ms - * in SysTick ISR. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_IncTick(void) -{ - uwTick += uwTickFreq; -} - -/** - * @brief Provides a tick value in millisecond. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval tick value - */ -__weak uint32_t HAL_GetTick(void) -{ - return uwTick; -} - -/** - * @brief This function returns a tick priority. - * @retval tick priority - */ -uint32_t HAL_GetTickPrio(void) -{ - return uwTickPrio; -} - -/** - * @brief Set new tick Freq. - * @retval Status - */ -HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) -{ - HAL_StatusTypeDef status = HAL_OK; - HAL_TickFreqTypeDef prevTickFreq; - - assert_param(IS_TICKFREQ(Freq)); - - if (uwTickFreq != Freq) - { - /* Back up uwTickFreq frequency */ - prevTickFreq = uwTickFreq; - - /* Update uwTickFreq global variable used by HAL_InitTick() */ - uwTickFreq = Freq; - - /* Apply the new tick Freq */ - status = HAL_InitTick(uwTickPrio); - - if (status != HAL_OK) - { - /* Restore previous tick frequency */ - uwTickFreq = prevTickFreq; - } - } - - return status; -} - -/** - * @brief Return tick frequency. - * @retval Tick frequency. - * Value of @ref HAL_TickFreqTypeDef. - */ -HAL_TickFreqTypeDef HAL_GetTickFreq(void) -{ - return uwTickFreq; -} - -/** - * @brief This function provides minimum delay (in milliseconds) based - * on variable incremented. - * @note In the default implementation , SysTick timer is the source of time base. - * It is used to generate interrupts at regular time intervals where uwTick - * is incremented. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @param Delay specifies the delay time length, in milliseconds. - * @retval None - */ -__weak void HAL_Delay(uint32_t Delay) -{ - uint32_t tickstart = HAL_GetTick(); - uint32_t wait = Delay; - - /* Add a freq to guarantee minimum wait */ - if (wait < HAL_MAX_DELAY) - { - wait += (uint32_t)(uwTickFreq); - } - - while((HAL_GetTick() - tickstart) < wait) - { - } -} - -/** - * @brief Suspend Tick increment. - * @note In the default implementation , SysTick timer is the source of time base. It is - * used to generate interrupts at regular time intervals. Once HAL_SuspendTick() - * is called, the SysTick interrupt will be disabled and so Tick increment - * is suspended. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_SuspendTick(void) -{ - /* Disable SysTick Interrupt */ - SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; -} - -/** - * @brief Resume Tick increment. - * @note In the default implementation , SysTick timer is the source of time base. It is - * used to generate interrupts at regular time intervals. Once HAL_ResumeTick() - * is called, the SysTick interrupt will be enabled and so Tick increment - * is resumed. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_ResumeTick(void) -{ - /* Enable SysTick Interrupt */ - SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; -} - -/** - * @brief Returns the HAL revision - * @retval version : 0xXYZR (8bits for each decimal, R for RC) - */ -uint32_t HAL_GetHalVersion(void) -{ - return __STM32F4xx_HAL_VERSION; -} - -/** - * @brief Returns the device revision identifier. - * @retval Device revision identifier - */ -uint32_t HAL_GetREVID(void) -{ - return((DBGMCU->IDCODE) >> 16U); -} - -/** - * @brief Returns the device identifier. - * @retval Device identifier - */ -uint32_t HAL_GetDEVID(void) -{ - return((DBGMCU->IDCODE) & IDCODE_DEVID_MASK); -} - -/** - * @brief Enable the Debug Module during SLEEP mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGSleepMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Disable the Debug Module during SLEEP mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGSleepMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Enable the Debug Module during STOP mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGStopMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Disable the Debug Module during STOP mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGStopMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Enable the Debug Module during STANDBY mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGStandbyMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Disable the Debug Module during STANDBY mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGStandbyMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Enables the I/O Compensation Cell. - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V. - * @retval None - */ -void HAL_EnableCompensationCell(void) -{ - *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)ENABLE; -} - -/** - * @brief Power-down the I/O Compensation Cell. - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V. - * @retval None - */ -void HAL_DisableCompensationCell(void) -{ - *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)DISABLE; -} - -/** - * @brief Returns first word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw0(void) -{ - return (READ_REG(*((uint32_t *)UID_BASE))); -} - -/** - * @brief Returns second word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw1(void) -{ - return (READ_REG(*((uint32_t *)(UID_BASE + 4U)))); -} - -/** - * @brief Returns third word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw2(void) -{ - return (READ_REG(*((uint32_t *)(UID_BASE + 8U)))); -} - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Enables the Internal FLASH Bank Swapping. - * - * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. - * - * @note Flash Bank2 mapped at 0x08000000 (and aliased @0x00000000) - * and Flash Bank1 mapped at 0x08100000 (and aliased at 0x00100000) - * - * @retval None - */ -void HAL_EnableMemorySwappingBank(void) -{ - *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Internal FLASH Bank Swapping. - * - * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. - * - * @note The default state : Flash Bank1 mapped at 0x08000000 (and aliased @0x00000000) - * and Flash Bank2 mapped at 0x08100000 (and aliased at 0x00100000) - * - * @retval None - */ -void HAL_DisableMemorySwappingBank(void) -{ - *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)DISABLE; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c deleted file mode 100644 index 9ad943d..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c +++ /dev/null @@ -1,2110 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_adc.c - * @author MCD Application Team - * @brief This file provides firmware functions to manage the following - * functionalities of the Analog to Digital Converter (ADC) peripheral: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * + Peripheral State functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### ADC Peripheral features ##### - ============================================================================== - [..] - (#) 12-bit, 10-bit, 8-bit or 6-bit configurable resolution. - (#) Interrupt generation at the end of conversion, end of injected conversion, - and in case of analog watchdog or overrun events - (#) Single and continuous conversion modes. - (#) Scan mode for automatic conversion of channel 0 to channel x. - (#) Data alignment with in-built data coherency. - (#) Channel-wise programmable sampling time. - (#) External trigger option with configurable polarity for both regular and - injected conversion. - (#) Dual/Triple mode (on devices with 2 ADCs or more). - (#) Configurable DMA data storage in Dual/Triple ADC mode. - (#) Configurable delay between conversions in Dual/Triple interleaved mode. - (#) ADC conversion type (refer to the datasheets). - (#) ADC supply requirements: 2.4 V to 3.6 V at full speed and down to 1.8 V at - slower speed. - (#) ADC input range: VREF(minus) = VIN = VREF(plus). - (#) DMA request generation during regular channel conversion. - - - ##### How to use this driver ##### - ============================================================================== - [..] - (#)Initialize the ADC low level resources by implementing the HAL_ADC_MspInit(): - (##) Enable the ADC interface clock using __HAL_RCC_ADC_CLK_ENABLE() - (##) ADC pins configuration - (+++) Enable the clock for the ADC GPIOs using the following function: - __HAL_RCC_GPIOx_CLK_ENABLE() - (+++) Configure these ADC pins in analog mode using HAL_GPIO_Init() - (##) In case of using interrupts (e.g. HAL_ADC_Start_IT()) - (+++) Configure the ADC interrupt priority using HAL_NVIC_SetPriority() - (+++) Enable the ADC IRQ handler using HAL_NVIC_EnableIRQ() - (+++) In ADC IRQ handler, call HAL_ADC_IRQHandler() - (##) In case of using DMA to control data transfer (e.g. HAL_ADC_Start_DMA()) - (+++) Enable the DMAx interface clock using __HAL_RCC_DMAx_CLK_ENABLE() - (+++) Configure and enable two DMA streams stream for managing data - transfer from peripheral to memory (output stream) - (+++) Associate the initialized DMA handle to the CRYP DMA handle - using __HAL_LINKDMA() - (+++) Configure the priority and enable the NVIC for the transfer complete - interrupt on the two DMA Streams. The output stream should have higher - priority than the input stream. - - *** Configuration of ADC, groups regular/injected, channels parameters *** - ============================================================================== - [..] - (#) Configure the ADC parameters (resolution, data alignment, ...) - and regular group parameters (conversion trigger, sequencer, ...) - using function HAL_ADC_Init(). - - (#) Configure the channels for regular group parameters (channel number, - channel rank into sequencer, ..., into regular group) - using function HAL_ADC_ConfigChannel(). - - (#) Optionally, configure the injected group parameters (conversion trigger, - sequencer, ..., of injected group) - and the channels for injected group parameters (channel number, - channel rank into sequencer, ..., into injected group) - using function HAL_ADCEx_InjectedConfigChannel(). - - (#) Optionally, configure the analog watchdog parameters (channels - monitored, thresholds, ...) using function HAL_ADC_AnalogWDGConfig(). - - (#) Optionally, for devices with several ADC instances: configure the - multimode parameters using function HAL_ADCEx_MultiModeConfigChannel(). - - *** Execution of ADC conversions *** - ============================================================================== - [..] - (#) ADC driver can be used among three modes: polling, interruption, - transfer by DMA. - - *** Polling mode IO operation *** - ================================= - [..] - (+) Start the ADC peripheral using HAL_ADC_Start() - (+) Wait for end of conversion using HAL_ADC_PollForConversion(), at this stage - user can specify the value of timeout according to his end application - (+) To read the ADC converted values, use the HAL_ADC_GetValue() function. - (+) Stop the ADC peripheral using HAL_ADC_Stop() - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Start the ADC peripheral using HAL_ADC_Start_IT() - (+) Use HAL_ADC_IRQHandler() called under ADC_IRQHandler() Interrupt subroutine - (+) At ADC end of conversion HAL_ADC_ConvCpltCallback() function is executed and user can - add his own code by customization of function pointer HAL_ADC_ConvCpltCallback - (+) In case of ADC Error, HAL_ADC_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_ADC_ErrorCallback - (+) Stop the ADC peripheral using HAL_ADC_Stop_IT() - - *** DMA mode IO operation *** - ============================== - [..] - (+) Start the ADC peripheral using HAL_ADC_Start_DMA(), at this stage the user specify the length - of data to be transferred at each end of conversion - (+) At The end of data transfer by HAL_ADC_ConvCpltCallback() function is executed and user can - add his own code by customization of function pointer HAL_ADC_ConvCpltCallback - (+) In case of transfer Error, HAL_ADC_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_ADC_ErrorCallback - (+) Stop the ADC peripheral using HAL_ADC_Stop_DMA() - - *** ADC HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in ADC HAL driver. - - (+) __HAL_ADC_ENABLE : Enable the ADC peripheral - (+) __HAL_ADC_DISABLE : Disable the ADC peripheral - (+) __HAL_ADC_ENABLE_IT: Enable the ADC end of conversion interrupt - (+) __HAL_ADC_DISABLE_IT: Disable the ADC end of conversion interrupt - (+) __HAL_ADC_GET_IT_SOURCE: Check if the specified ADC interrupt source is enabled or disabled - (+) __HAL_ADC_CLEAR_FLAG: Clear the ADC's pending flags - (+) __HAL_ADC_GET_FLAG: Get the selected ADC's flag status - (+) ADC_GET_RESOLUTION: Return resolution bits in CR1 register - - [..] - (@) You can refer to the ADC HAL driver header file for more useful macros - - *** Deinitialization of ADC *** - ============================================================================== - [..] - (#) Disable the ADC interface - (++) ADC clock can be hard reset and disabled at RCC top level. - (++) Hard reset of ADC peripherals - using macro __HAL_RCC_ADC_FORCE_RESET(), __HAL_RCC_ADC_RELEASE_RESET(). - (++) ADC clock disable using the equivalent macro/functions as configuration step. - (+++) Example: - Into HAL_ADC_MspDeInit() (recommended code location) or with - other device clock parameters configuration: - (+++) HAL_RCC_GetOscConfig(&RCC_OscInitStructure); - (+++) RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI; - (+++) RCC_OscInitStructure.HSIState = RCC_HSI_OFF; (if not used for system clock) - (+++) HAL_RCC_OscConfig(&RCC_OscInitStructure); - - (#) ADC pins configuration - (++) Disable the clock for the ADC GPIOs using macro __HAL_RCC_GPIOx_CLK_DISABLE() - - (#) Optionally, in case of usage of ADC with interruptions: - (++) Disable the NVIC for ADC using function HAL_NVIC_DisableIRQ(ADCx_IRQn) - - (#) Optionally, in case of usage of DMA: - (++) Deinitialize the DMA using function HAL_DMA_DeInit(). - (++) Disable the NVIC for DMA using function HAL_NVIC_DisableIRQ(DMAx_Channelx_IRQn) - *** Callback registration *** - ============================================================================== - [..] - - The compilation flag USE_HAL_ADC_REGISTER_CALLBACKS, when set to 1, - allows the user to configure dynamically the driver callbacks. - Use Functions HAL_ADC_RegisterCallback() - to register an interrupt callback. - [..] - - Function HAL_ADC_RegisterCallback() allows to register following callbacks: - (+) ConvCpltCallback : ADC conversion complete callback - (+) ConvHalfCpltCallback : ADC conversion DMA half-transfer callback - (+) LevelOutOfWindowCallback : ADC analog watchdog 1 callback - (+) ErrorCallback : ADC error callback - (+) InjectedConvCpltCallback : ADC group injected conversion complete callback - (+) InjectedQueueOverflowCallback : ADC group injected context queue overflow callback - (+) LevelOutOfWindow2Callback : ADC analog watchdog 2 callback - (+) LevelOutOfWindow3Callback : ADC analog watchdog 3 callback - (+) EndOfSamplingCallback : ADC end of sampling callback - (+) MspInitCallback : ADC Msp Init callback - (+) MspDeInitCallback : ADC Msp DeInit callback - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - [..] - - Use function HAL_ADC_UnRegisterCallback to reset a callback to the default - weak function. - [..] - - HAL_ADC_UnRegisterCallback takes as parameters the HAL peripheral handle, - and the Callback ID. - This function allows to reset following callbacks: - (+) ConvCpltCallback : ADC conversion complete callback - (+) ConvHalfCpltCallback : ADC conversion DMA half-transfer callback - (+) LevelOutOfWindowCallback : ADC analog watchdog 1 callback - (+) ErrorCallback : ADC error callback - (+) InjectedConvCpltCallback : ADC group injected conversion complete callback - (+) InjectedQueueOverflowCallback : ADC group injected context queue overflow callback - (+) LevelOutOfWindow2Callback : ADC analog watchdog 2 callback - (+) LevelOutOfWindow3Callback : ADC analog watchdog 3 callback - (+) EndOfSamplingCallback : ADC end of sampling callback - (+) MspInitCallback : ADC Msp Init callback - (+) MspDeInitCallback : ADC Msp DeInit callback - [..] - - By default, after the HAL_ADC_Init() and when the state is HAL_ADC_STATE_RESET - all callbacks are set to the corresponding weak functions: - examples HAL_ADC_ConvCpltCallback(), HAL_ADC_ErrorCallback(). - Exception done for MspInit and MspDeInit functions that are - reset to the legacy weak functions in the HAL_ADC_Init()/ HAL_ADC_DeInit() only when - these callbacks are null (not registered beforehand). - [..] - - If MspInit or MspDeInit are not null, the HAL_ADC_Init()/ HAL_ADC_DeInit() - keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - [..] - - Callbacks can be registered/unregistered in HAL_ADC_STATE_READY state only. - Exception done MspInit/MspDeInit functions that can be registered/unregistered - in HAL_ADC_STATE_READY or HAL_ADC_STATE_RESET state, - thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. - [..] - - Then, the user first registers the MspInit/MspDeInit user callbacks - using HAL_ADC_RegisterCallback() before calling HAL_ADC_DeInit() - or HAL_ADC_Init() function. - [..] - - When the compilation flag USE_HAL_ADC_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available and all callbacks - are set to the corresponding weak functions. - - @endverbatim - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup ADC ADC - * @brief ADC driver modules - * @{ - */ - -#ifdef HAL_ADC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup ADC_Private_Functions - * @{ - */ -/* Private function prototypes -----------------------------------------------*/ -static void ADC_Init(ADC_HandleTypeDef *hadc); -static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma); -static void ADC_DMAError(DMA_HandleTypeDef *hdma); -static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma); -/** - * @} - */ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup ADC_Exported_Functions ADC Exported Functions - * @{ - */ - -/** @defgroup ADC_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize and configure the ADC. - (+) De-initialize the ADC. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the ADCx peripheral according to the specified parameters - * in the ADC_InitStruct and initializes the ADC MSP. - * - * @note This function is used to configure the global features of the ADC ( - * ClockPrescaler, Resolution, Data Alignment and number of conversion), however, - * the rest of the configuration parameters are specific to the regular - * channels group (scan mode activation, continuous mode activation, - * External trigger source and edge, DMA continuous request after the - * last transfer and End of conversion selection). - * - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc) -{ - HAL_StatusTypeDef tmp_hal_status = HAL_OK; - - /* Check ADC handle */ - if (hadc == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); - assert_param(IS_ADC_CLOCKPRESCALER(hadc->Init.ClockPrescaler)); - assert_param(IS_ADC_RESOLUTION(hadc->Init.Resolution)); - assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ScanConvMode)); - assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode)); - assert_param(IS_ADC_EXT_TRIG(hadc->Init.ExternalTrigConv)); - assert_param(IS_ADC_DATA_ALIGN(hadc->Init.DataAlign)); - assert_param(IS_ADC_REGULAR_LENGTH(hadc->Init.NbrOfConversion)); - assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAContinuousRequests)); - assert_param(IS_ADC_EOCSelection(hadc->Init.EOCSelection)); - assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DiscontinuousConvMode)); - - if (hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START) - { - assert_param(IS_ADC_EXT_TRIG_EDGE(hadc->Init.ExternalTrigConvEdge)); - } - - if (hadc->State == HAL_ADC_STATE_RESET) - { -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) - /* Init the ADC Callback settings */ - hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback; /* Legacy weak callback */ - hadc->ConvHalfCpltCallback = HAL_ADC_ConvHalfCpltCallback; /* Legacy weak callback */ - hadc->LevelOutOfWindowCallback = HAL_ADC_LevelOutOfWindowCallback; /* Legacy weak callback */ - hadc->ErrorCallback = HAL_ADC_ErrorCallback; /* Legacy weak callback */ - hadc->InjectedConvCpltCallback = HAL_ADCEx_InjectedConvCpltCallback; /* Legacy weak callback */ - if (hadc->MspInitCallback == NULL) - { - hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */ - } - - /* Init the low level hardware */ - hadc->MspInitCallback(hadc); -#else - /* Init the low level hardware */ - HAL_ADC_MspInit(hadc); -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ - - /* Initialize ADC error code */ - ADC_CLEAR_ERRORCODE(hadc); - - /* Allocate lock resource and initialize it */ - hadc->Lock = HAL_UNLOCKED; - } - - /* Configuration of ADC parameters if previous preliminary actions are */ - /* correctly completed. */ - if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL)) - { - /* Set ADC state */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY, - HAL_ADC_STATE_BUSY_INTERNAL); - - /* Set ADC parameters */ - ADC_Init(hadc); - - /* Set ADC error code to none */ - ADC_CLEAR_ERRORCODE(hadc); - - /* Set the ADC state */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_BUSY_INTERNAL, - HAL_ADC_STATE_READY); - } - else - { - tmp_hal_status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hadc); - - /* Return function status */ - return tmp_hal_status; -} - -/** - * @brief Deinitializes the ADCx peripheral registers to their default reset values. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc) -{ - HAL_StatusTypeDef tmp_hal_status = HAL_OK; - - /* Check ADC handle */ - if (hadc == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); - - /* Set ADC state */ - SET_BIT(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL); - - /* Stop potential conversion on going, on regular and injected groups */ - /* Disable ADC peripheral */ - __HAL_ADC_DISABLE(hadc); - - /* Configuration of ADC parameters if previous preliminary actions are */ - /* correctly completed. */ - if (HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON)) - { -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) - if (hadc->MspDeInitCallback == NULL) - { - hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */ - } - - /* DeInit the low level hardware: RCC clock, NVIC */ - hadc->MspDeInitCallback(hadc); -#else - /* DeInit the low level hardware: RCC clock, NVIC */ - HAL_ADC_MspDeInit(hadc); -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ - - /* Set ADC error code to none */ - ADC_CLEAR_ERRORCODE(hadc); - - /* Set ADC state */ - hadc->State = HAL_ADC_STATE_RESET; - } - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - /* Return function status */ - return tmp_hal_status; -} - -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User ADC Callback - * To be used instead of the weak predefined callback - * @param hadc Pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID ADC conversion complete callback ID - * @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID ADC conversion DMA half-transfer callback ID - * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID ADC analog watchdog 1 callback ID - * @arg @ref HAL_ADC_ERROR_CB_ID ADC error callback ID - * @arg @ref HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID ADC group injected conversion complete callback ID - * @arg @ref HAL_ADC_MSPINIT_CB_ID ADC Msp Init callback ID - * @arg @ref HAL_ADC_MSPDEINIT_CB_ID ADC Msp DeInit callback ID - * @param pCallback pointer to the Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADC_RegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID, pADC_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - if ((hadc->State & HAL_ADC_STATE_READY) != 0UL) - { - switch (CallbackID) - { - case HAL_ADC_CONVERSION_COMPLETE_CB_ID : - hadc->ConvCpltCallback = pCallback; - break; - - case HAL_ADC_CONVERSION_HALF_CB_ID : - hadc->ConvHalfCpltCallback = pCallback; - break; - - case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID : - hadc->LevelOutOfWindowCallback = pCallback; - break; - - case HAL_ADC_ERROR_CB_ID : - hadc->ErrorCallback = pCallback; - break; - - case HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID : - hadc->InjectedConvCpltCallback = pCallback; - break; - - case HAL_ADC_MSPINIT_CB_ID : - hadc->MspInitCallback = pCallback; - break; - - case HAL_ADC_MSPDEINIT_CB_ID : - hadc->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_ADC_STATE_RESET == hadc->State) - { - switch (CallbackID) - { - case HAL_ADC_MSPINIT_CB_ID : - hadc->MspInitCallback = pCallback; - break; - - case HAL_ADC_MSPDEINIT_CB_ID : - hadc->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Unregister a ADC Callback - * ADC callback is redirected to the weak predefined callback - * @param hadc Pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID ADC conversion complete callback ID - * @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID ADC conversion DMA half-transfer callback ID - * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID ADC analog watchdog 1 callback ID - * @arg @ref HAL_ADC_ERROR_CB_ID ADC error callback ID - * @arg @ref HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID ADC group injected conversion complete callback ID - * @arg @ref HAL_ADC_MSPINIT_CB_ID ADC Msp Init callback ID - * @arg @ref HAL_ADC_MSPDEINIT_CB_ID ADC Msp DeInit callback ID - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - if ((hadc->State & HAL_ADC_STATE_READY) != 0UL) - { - switch (CallbackID) - { - case HAL_ADC_CONVERSION_COMPLETE_CB_ID : - hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback; - break; - - case HAL_ADC_CONVERSION_HALF_CB_ID : - hadc->ConvHalfCpltCallback = HAL_ADC_ConvHalfCpltCallback; - break; - - case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID : - hadc->LevelOutOfWindowCallback = HAL_ADC_LevelOutOfWindowCallback; - break; - - case HAL_ADC_ERROR_CB_ID : - hadc->ErrorCallback = HAL_ADC_ErrorCallback; - break; - - case HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID : - hadc->InjectedConvCpltCallback = HAL_ADCEx_InjectedConvCpltCallback; - break; - - case HAL_ADC_MSPINIT_CB_ID : - hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_ADC_MSPDEINIT_CB_ID : - hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_ADC_STATE_RESET == hadc->State) - { - switch (CallbackID) - { - case HAL_ADC_MSPINIT_CB_ID : - hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_ADC_MSPDEINIT_CB_ID : - hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} - -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ - -/** - * @brief Initializes the ADC MSP. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval None - */ -__weak void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hadc); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_ADC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes the ADC MSP. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval None - */ -__weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hadc); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_ADC_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup ADC_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Start conversion of regular channel. - (+) Stop conversion of regular channel. - (+) Start conversion of regular channel and enable interrupt. - (+) Stop conversion of regular channel and disable interrupt. - (+) Start conversion of regular channel and enable DMA transfer. - (+) Stop conversion of regular channel and disable DMA transfer. - (+) Handle ADC interrupt request. - -@endverbatim - * @{ - */ - -/** - * @brief Enables ADC and starts conversion of the regular channels. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc) -{ - __IO uint32_t counter = 0U; - ADC_Common_TypeDef *tmpADC_Common; - - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode)); - assert_param(IS_ADC_EXT_TRIG_EDGE(hadc->Init.ExternalTrigConvEdge)); - - /* Process locked */ - __HAL_LOCK(hadc); - - /* Enable the ADC peripheral */ - /* Check if ADC peripheral is disabled in order to enable it and wait during - Tstab time the ADC's stabilization */ - if ((hadc->Instance->CR2 & ADC_CR2_ADON) != ADC_CR2_ADON) - { - /* Enable the Peripheral */ - __HAL_ADC_ENABLE(hadc); - - /* Delay for ADC stabilization time */ - /* Compute number of CPU cycles to wait for */ - counter = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000U)); - while (counter != 0U) - { - counter--; - } - } - - /* Start conversion if ADC is effectively enabled */ - if (HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_ADON)) - { - /* Set ADC state */ - /* - Clear state bitfield related to regular group conversion results */ - /* - Set state bitfield related to regular group operation */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR, - HAL_ADC_STATE_REG_BUSY); - - /* If conversions on group regular are also triggering group injected, */ - /* update ADC state. */ - if (READ_BIT(hadc->Instance->CR1, ADC_CR1_JAUTO) != RESET) - { - ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY); - } - - /* State machine update: Check if an injected conversion is ongoing */ - if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY)) - { - /* Reset ADC error code fields related to conversions on group regular */ - CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA)); - } - else - { - /* Reset ADC all error code fields */ - ADC_CLEAR_ERRORCODE(hadc); - } - - /* Process unlocked */ - /* Unlock before starting ADC conversions: in case of potential */ - /* interruption, to let the process to ADC IRQ Handler. */ - __HAL_UNLOCK(hadc); - - /* Pointer to the common control register to which is belonging hadc */ - /* (Depending on STM32F4 product, there may be up to 3 ADCs and 1 common */ - /* control register) */ - tmpADC_Common = ADC_COMMON_REGISTER(hadc); - - /* Clear regular group conversion flag and overrun flag */ - /* (To ensure of no unknown state from potential previous ADC operations) */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOC | ADC_FLAG_OVR); - - /* Check if Multimode enabled */ - if (HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) - { -#if defined(ADC2) && defined(ADC3) - if ((hadc->Instance == ADC1) || ((hadc->Instance == ADC2) && ((ADC->CCR & ADC_CCR_MULTI_Msk) < ADC_CCR_MULTI_0)) \ - || ((hadc->Instance == ADC3) && ((ADC->CCR & ADC_CCR_MULTI_Msk) < ADC_CCR_MULTI_4))) - { -#endif /* ADC2 || ADC3 */ - /* if no external trigger present enable software conversion of regular channels */ - if ((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) - { - /* Enable the selected ADC software conversion for regular group */ - hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART; - } -#if defined(ADC2) && defined(ADC3) - } -#endif /* ADC2 || ADC3 */ - } - else - { - /* if instance of handle correspond to ADC1 and no external trigger present enable software conversion of regular channels */ - if ((hadc->Instance == ADC1) && ((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET)) - { - /* Enable the selected ADC software conversion for regular group */ - hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART; - } - } - } - else - { - /* Update ADC state machine to error */ - SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); - - /* Set ADC error code to ADC IP internal error */ - SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Disables ADC and stop conversion of regular channels. - * - * @note Caution: This function will stop also injected channels. - * - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * - * @retval HAL status. - */ -HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); - - /* Process locked */ - __HAL_LOCK(hadc); - - /* Stop potential conversion on going, on regular and injected groups */ - /* Disable ADC peripheral */ - __HAL_ADC_DISABLE(hadc); - - /* Check if ADC is effectively disabled */ - if (HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON)) - { - /* Set ADC state */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY, - HAL_ADC_STATE_READY); - } - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Poll for regular conversion complete - * @note ADC conversion flags EOS (end of sequence) and EOC (end of - * conversion) are cleared by this function. - * @note This function cannot be used in a particular setup: ADC configured - * in DMA mode and polling for end of each conversion (ADC init - * parameter "EOCSelection" set to ADC_EOC_SINGLE_CONV). - * In this case, DMA resets the flag EOC and polling cannot be - * performed on each conversion. Nevertheless, polling can still - * be performed on the complete sequence. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @param Timeout Timeout value in millisecond. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout) -{ - uint32_t tickstart = 0U; - - /* Verification that ADC configuration is compliant with polling for */ - /* each conversion: */ - /* Particular case is ADC configured in DMA mode and ADC sequencer with */ - /* several ranks and polling for end of each conversion. */ - /* For code simplicity sake, this particular case is generalized to */ - /* ADC configured in DMA mode and polling for end of each conversion. */ - if (HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_EOCS) && - HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_DMA)) - { - /* Update ADC state machine to error */ - SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG); - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - return HAL_ERROR; - } - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Check End of conversion flag */ - while (!(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC))) - { - /* Check if timeout is disabled (set to infinite wait) */ - if (Timeout != HAL_MAX_DELAY) - { - if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout)) - { - /* New check to avoid false timeout detection in case of preemption */ - if (!(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC))) - { - /* Update ADC state machine to timeout */ - SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT); - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - return HAL_TIMEOUT; - } - } - } - } - - /* Clear regular group conversion flag */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_STRT | ADC_FLAG_EOC); - - /* Update ADC state machine */ - SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC); - - /* Determine whether any further conversion upcoming on group regular */ - /* by external trigger, continuous mode or scan sequence on going. */ - /* Note: On STM32F4, there is no independent flag of end of sequence. */ - /* The test of scan sequence on going is done either with scan */ - /* sequence disabled or with end of conversion flag set to */ - /* of end of sequence. */ - if (ADC_IS_SOFTWARE_START_REGULAR(hadc) && - (hadc->Init.ContinuousConvMode == DISABLE) && - (HAL_IS_BIT_CLR(hadc->Instance->SQR1, ADC_SQR1_L) || - HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS))) - { - /* Set ADC state */ - CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY); - - if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_INJ_BUSY)) - { - SET_BIT(hadc->State, HAL_ADC_STATE_READY); - } - } - - /* Return ADC state */ - return HAL_OK; -} - -/** - * @brief Poll for conversion event - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @param EventType the ADC event type. - * This parameter can be one of the following values: - * @arg ADC_AWD_EVENT: ADC Analog watch Dog event. - * @arg ADC_OVR_EVENT: ADC Overrun event. - * @param Timeout Timeout value in millisecond. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef *hadc, uint32_t EventType, uint32_t Timeout) -{ - uint32_t tickstart = 0U; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); - assert_param(IS_ADC_EVENT_TYPE(EventType)); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Check selected event flag */ - while (!(__HAL_ADC_GET_FLAG(hadc, EventType))) - { - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout)) - { - /* New check to avoid false timeout detection in case of preemption */ - if (!(__HAL_ADC_GET_FLAG(hadc, EventType))) - { - /* Update ADC state machine to timeout */ - SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT); - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - return HAL_TIMEOUT; - } - } - } - } - - /* Analog watchdog (level out of window) event */ - if (EventType == ADC_AWD_EVENT) - { - /* Set ADC state */ - SET_BIT(hadc->State, HAL_ADC_STATE_AWD1); - - /* Clear ADC analog watchdog flag */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD); - } - /* Overrun event */ - else - { - /* Set ADC state */ - SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR); - /* Set ADC error code to overrun */ - SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR); - - /* Clear ADC overrun flag */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR); - } - - /* Return ADC state */ - return HAL_OK; -} - - -/** - * @brief Enables the interrupt and starts ADC conversion of regular channels. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval HAL status. - */ -HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef *hadc) -{ - __IO uint32_t counter = 0U; - ADC_Common_TypeDef *tmpADC_Common; - - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode)); - assert_param(IS_ADC_EXT_TRIG_EDGE(hadc->Init.ExternalTrigConvEdge)); - - /* Process locked */ - __HAL_LOCK(hadc); - - /* Enable the ADC peripheral */ - /* Check if ADC peripheral is disabled in order to enable it and wait during - Tstab time the ADC's stabilization */ - if ((hadc->Instance->CR2 & ADC_CR2_ADON) != ADC_CR2_ADON) - { - /* Enable the Peripheral */ - __HAL_ADC_ENABLE(hadc); - - /* Delay for ADC stabilization time */ - /* Compute number of CPU cycles to wait for */ - counter = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000U)); - while (counter != 0U) - { - counter--; - } - } - - /* Start conversion if ADC is effectively enabled */ - if (HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_ADON)) - { - /* Set ADC state */ - /* - Clear state bitfield related to regular group conversion results */ - /* - Set state bitfield related to regular group operation */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR, - HAL_ADC_STATE_REG_BUSY); - - /* If conversions on group regular are also triggering group injected, */ - /* update ADC state. */ - if (READ_BIT(hadc->Instance->CR1, ADC_CR1_JAUTO) != RESET) - { - ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY); - } - - /* State machine update: Check if an injected conversion is ongoing */ - if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY)) - { - /* Reset ADC error code fields related to conversions on group regular */ - CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA)); - } - else - { - /* Reset ADC all error code fields */ - ADC_CLEAR_ERRORCODE(hadc); - } - - /* Process unlocked */ - /* Unlock before starting ADC conversions: in case of potential */ - /* interruption, to let the process to ADC IRQ Handler. */ - __HAL_UNLOCK(hadc); - - /* Pointer to the common control register to which is belonging hadc */ - /* (Depending on STM32F4 product, there may be up to 3 ADCs and 1 common */ - /* control register) */ - tmpADC_Common = ADC_COMMON_REGISTER(hadc); - - /* Clear regular group conversion flag and overrun flag */ - /* (To ensure of no unknown state from potential previous ADC operations) */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOC | ADC_FLAG_OVR); - - /* Enable end of conversion interrupt for regular group */ - __HAL_ADC_ENABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_OVR)); - - /* Check if Multimode enabled */ - if (HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) - { -#if defined(ADC2) && defined(ADC3) - if ((hadc->Instance == ADC1) || ((hadc->Instance == ADC2) && ((ADC->CCR & ADC_CCR_MULTI_Msk) < ADC_CCR_MULTI_0)) \ - || ((hadc->Instance == ADC3) && ((ADC->CCR & ADC_CCR_MULTI_Msk) < ADC_CCR_MULTI_4))) - { -#endif /* ADC2 || ADC3 */ - /* if no external trigger present enable software conversion of regular channels */ - if ((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) - { - /* Enable the selected ADC software conversion for regular group */ - hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART; - } -#if defined(ADC2) && defined(ADC3) - } -#endif /* ADC2 || ADC3 */ - } - else - { - /* if instance of handle correspond to ADC1 and no external trigger present enable software conversion of regular channels */ - if ((hadc->Instance == ADC1) && ((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET)) - { - /* Enable the selected ADC software conversion for regular group */ - hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART; - } - } - } - else - { - /* Update ADC state machine to error */ - SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); - - /* Set ADC error code to ADC IP internal error */ - SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Disables the interrupt and stop ADC conversion of regular channels. - * - * @note Caution: This function will stop also injected channels. - * - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval HAL status. - */ -HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef *hadc) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); - - /* Process locked */ - __HAL_LOCK(hadc); - - /* Stop potential conversion on going, on regular and injected groups */ - /* Disable ADC peripheral */ - __HAL_ADC_DISABLE(hadc); - - /* Check if ADC is effectively disabled */ - if (HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON)) - { - /* Disable ADC end of conversion interrupt for regular group */ - __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_OVR)); - - /* Set ADC state */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY, - HAL_ADC_STATE_READY); - } - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Handles ADC interrupt request - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval None - */ -void HAL_ADC_IRQHandler(ADC_HandleTypeDef *hadc) -{ - uint32_t tmp1 = 0U, tmp2 = 0U; - - uint32_t tmp_sr = hadc->Instance->SR; - uint32_t tmp_cr1 = hadc->Instance->CR1; - - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode)); - assert_param(IS_ADC_REGULAR_LENGTH(hadc->Init.NbrOfConversion)); - assert_param(IS_ADC_EOCSelection(hadc->Init.EOCSelection)); - - tmp1 = tmp_sr & ADC_FLAG_EOC; - tmp2 = tmp_cr1 & ADC_IT_EOC; - /* Check End of conversion flag for regular channels */ - if (tmp1 && tmp2) - { - /* Update state machine on conversion status if not in error state */ - if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL)) - { - /* Set ADC state */ - SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC); - } - - /* Determine whether any further conversion upcoming on group regular */ - /* by external trigger, continuous mode or scan sequence on going. */ - /* Note: On STM32F4, there is no independent flag of end of sequence. */ - /* The test of scan sequence on going is done either with scan */ - /* sequence disabled or with end of conversion flag set to */ - /* of end of sequence. */ - if (ADC_IS_SOFTWARE_START_REGULAR(hadc) && - (hadc->Init.ContinuousConvMode == DISABLE) && - (HAL_IS_BIT_CLR(hadc->Instance->SQR1, ADC_SQR1_L) || - HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS))) - { - /* Disable ADC end of single conversion interrupt on group regular */ - /* Note: Overrun interrupt was enabled with EOC interrupt in */ - /* HAL_ADC_Start_IT(), but is not disabled here because can be used */ - /* by overrun IRQ process below. */ - __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC); - - /* Set ADC state */ - CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY); - - if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_INJ_BUSY)) - { - SET_BIT(hadc->State, HAL_ADC_STATE_READY); - } - } - - /* Conversion complete callback */ -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) - hadc->ConvCpltCallback(hadc); -#else - HAL_ADC_ConvCpltCallback(hadc); -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ - - /* Clear regular group conversion flag */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_STRT | ADC_FLAG_EOC); - } - - tmp1 = tmp_sr & ADC_FLAG_JEOC; - tmp2 = tmp_cr1 & ADC_IT_JEOC; - /* Check End of conversion flag for injected channels */ - if (tmp1 && tmp2) - { - /* Update state machine on conversion status if not in error state */ - if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL)) - { - /* Set ADC state */ - SET_BIT(hadc->State, HAL_ADC_STATE_INJ_EOC); - } - - /* Determine whether any further conversion upcoming on group injected */ - /* by external trigger, scan sequence on going or by automatic injected */ - /* conversion from group regular (same conditions as group regular */ - /* interruption disabling above). */ - if (ADC_IS_SOFTWARE_START_INJECTED(hadc) && - (HAL_IS_BIT_CLR(hadc->Instance->JSQR, ADC_JSQR_JL) || - HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS)) && - (HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO) && - (ADC_IS_SOFTWARE_START_REGULAR(hadc) && - (hadc->Init.ContinuousConvMode == DISABLE)))) - { - /* Disable ADC end of single conversion interrupt on group injected */ - __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC); - - /* Set ADC state */ - CLEAR_BIT(hadc->State, HAL_ADC_STATE_INJ_BUSY); - - if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_REG_BUSY)) - { - SET_BIT(hadc->State, HAL_ADC_STATE_READY); - } - } - - /* Conversion complete callback */ - /* Conversion complete callback */ -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) - hadc->InjectedConvCpltCallback(hadc); -#else - HAL_ADCEx_InjectedConvCpltCallback(hadc); -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ - - /* Clear injected group conversion flag */ - __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_JSTRT | ADC_FLAG_JEOC)); - } - - tmp1 = tmp_sr & ADC_FLAG_AWD; - tmp2 = tmp_cr1 & ADC_IT_AWD; - /* Check Analog watchdog flag */ - if (tmp1 && tmp2) - { - if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_AWD)) - { - /* Set ADC state */ - SET_BIT(hadc->State, HAL_ADC_STATE_AWD1); - - /* Level out of window callback */ -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) - hadc->LevelOutOfWindowCallback(hadc); -#else - HAL_ADC_LevelOutOfWindowCallback(hadc); -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ - - /* Clear the ADC analog watchdog flag */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD); - } - } - - tmp1 = tmp_sr & ADC_FLAG_OVR; - tmp2 = tmp_cr1 & ADC_IT_OVR; - /* Check Overrun flag */ - if (tmp1 && tmp2) - { - /* Note: On STM32F4, ADC overrun can be set through other parameters */ - /* refer to description of parameter "EOCSelection" for more */ - /* details. */ - - /* Set ADC error code to overrun */ - SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR); - - /* Clear ADC overrun flag */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR); - - /* Error callback */ -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) - hadc->ErrorCallback(hadc); -#else - HAL_ADC_ErrorCallback(hadc); -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ - - /* Clear the Overrun flag */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR); - } -} - -/** - * @brief Enables ADC DMA request after last transfer (Single-ADC mode) and enables ADC peripheral - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @param pData The destination Buffer address. - * @param Length The length of data to be transferred from ADC peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length) -{ - __IO uint32_t counter = 0U; - ADC_Common_TypeDef *tmpADC_Common; - - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode)); - assert_param(IS_ADC_EXT_TRIG_EDGE(hadc->Init.ExternalTrigConvEdge)); - - /* Process locked */ - __HAL_LOCK(hadc); - - /* Enable the ADC peripheral */ - /* Check if ADC peripheral is disabled in order to enable it and wait during - Tstab time the ADC's stabilization */ - if ((hadc->Instance->CR2 & ADC_CR2_ADON) != ADC_CR2_ADON) - { - /* Enable the Peripheral */ - __HAL_ADC_ENABLE(hadc); - - /* Delay for ADC stabilization time */ - /* Compute number of CPU cycles to wait for */ - counter = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000U)); - while (counter != 0U) - { - counter--; - } - } - - /* Check ADC DMA Mode */ - /* - disable the DMA Mode if it is already enabled */ - if ((hadc->Instance->CR2 & ADC_CR2_DMA) == ADC_CR2_DMA) - { - CLEAR_BIT(hadc->Instance->CR2, ADC_CR2_DMA); - } - - /* Start conversion if ADC is effectively enabled */ - if (HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_ADON)) - { - /* Set ADC state */ - /* - Clear state bitfield related to regular group conversion results */ - /* - Set state bitfield related to regular group operation */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR, - HAL_ADC_STATE_REG_BUSY); - - /* If conversions on group regular are also triggering group injected, */ - /* update ADC state. */ - if (READ_BIT(hadc->Instance->CR1, ADC_CR1_JAUTO) != RESET) - { - ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY); - } - - /* State machine update: Check if an injected conversion is ongoing */ - if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY)) - { - /* Reset ADC error code fields related to conversions on group regular */ - CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA)); - } - else - { - /* Reset ADC all error code fields */ - ADC_CLEAR_ERRORCODE(hadc); - } - - /* Process unlocked */ - /* Unlock before starting ADC conversions: in case of potential */ - /* interruption, to let the process to ADC IRQ Handler. */ - __HAL_UNLOCK(hadc); - - /* Pointer to the common control register to which is belonging hadc */ - /* (Depending on STM32F4 product, there may be up to 3 ADCs and 1 common */ - /* control register) */ - tmpADC_Common = ADC_COMMON_REGISTER(hadc); - - /* Set the DMA transfer complete callback */ - hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt; - - /* Set the DMA half transfer complete callback */ - hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt; - - /* Set the DMA error callback */ - hadc->DMA_Handle->XferErrorCallback = ADC_DMAError; - - - /* Manage ADC and DMA start: ADC overrun interruption, DMA start, ADC */ - /* start (in case of SW start): */ - - /* Clear regular group conversion flag and overrun flag */ - /* (To ensure of no unknown state from potential previous ADC operations) */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOC | ADC_FLAG_OVR); - - /* Enable ADC overrun interrupt */ - __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR); - - /* Enable ADC DMA mode */ - hadc->Instance->CR2 |= ADC_CR2_DMA; - - /* Start the DMA channel */ - HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length); - - /* Check if Multimode enabled */ - if (HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) - { -#if defined(ADC2) && defined(ADC3) - if ((hadc->Instance == ADC1) || ((hadc->Instance == ADC2) && ((ADC->CCR & ADC_CCR_MULTI_Msk) < ADC_CCR_MULTI_0)) \ - || ((hadc->Instance == ADC3) && ((ADC->CCR & ADC_CCR_MULTI_Msk) < ADC_CCR_MULTI_4))) - { -#endif /* ADC2 || ADC3 */ - /* if no external trigger present enable software conversion of regular channels */ - if ((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) - { - /* Enable the selected ADC software conversion for regular group */ - hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART; - } -#if defined(ADC2) && defined(ADC3) - } -#endif /* ADC2 || ADC3 */ - } - else - { - /* if instance of handle correspond to ADC1 and no external trigger present enable software conversion of regular channels */ - if ((hadc->Instance == ADC1) && ((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET)) - { - /* Enable the selected ADC software conversion for regular group */ - hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART; - } - } - } - else - { - /* Update ADC state machine to error */ - SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); - - /* Set ADC error code to ADC IP internal error */ - SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Disables ADC DMA (Single-ADC mode) and disables ADC peripheral - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef *hadc) -{ - HAL_StatusTypeDef tmp_hal_status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); - - /* Process locked */ - __HAL_LOCK(hadc); - - /* Stop potential conversion on going, on regular and injected groups */ - /* Disable ADC peripheral */ - __HAL_ADC_DISABLE(hadc); - - /* Check if ADC is effectively disabled */ - if (HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON)) - { - /* Disable the selected ADC DMA mode */ - hadc->Instance->CR2 &= ~ADC_CR2_DMA; - - /* Disable the DMA channel (in case of DMA in circular mode or stop while */ - /* DMA transfer is on going) */ - if (hadc->DMA_Handle->State == HAL_DMA_STATE_BUSY) - { - tmp_hal_status = HAL_DMA_Abort(hadc->DMA_Handle); - - /* Check if DMA channel effectively disabled */ - if (tmp_hal_status != HAL_OK) - { - /* Update ADC state machine to error */ - SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA); - } - } - - /* Disable ADC overrun interrupt */ - __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR); - - /* Set ADC state */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY, - HAL_ADC_STATE_READY); - } - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - /* Return function status */ - return tmp_hal_status; -} - -/** - * @brief Gets the converted value from data register of regular channel. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval Converted value - */ -uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc) -{ - /* Return the selected ADC converted value */ - return hadc->Instance->DR; -} - -/** - * @brief Regular conversion complete callback in non blocking mode - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval None - */ -__weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hadc); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_ADC_ConvCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Regular conversion half DMA transfer callback in non blocking mode - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval None - */ -__weak void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hadc); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_ADC_ConvHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Analog watchdog callback in non blocking mode - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval None - */ -__weak void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef *hadc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hadc); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_ADC_LevelOoutOfWindowCallback could be implemented in the user file - */ -} - -/** - * @brief Error ADC callback. - * @note In case of error due to overrun when using ADC with DMA transfer - * (HAL ADC handle parameter "ErrorCode" to state "HAL_ADC_ERROR_OVR"): - * - Reinitialize the DMA using function "HAL_ADC_Stop_DMA()". - * - If needed, restart a new ADC conversion using function - * "HAL_ADC_Start_DMA()" - * (this function is also clearing overrun flag) - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval None - */ -__weak void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hadc); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_ADC_ErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup ADC_Exported_Functions_Group3 Peripheral Control functions - * @brief Peripheral Control functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure regular channels. - (+) Configure injected channels. - (+) Configure multimode. - (+) Configure the analog watch dog. - -@endverbatim - * @{ - */ - -/** -* @brief Configures for the selected ADC regular channel its corresponding -* rank in the sequencer and its sample time. -* @param hadc pointer to a ADC_HandleTypeDef structure that contains -* the configuration information for the specified ADC. -* @param sConfig ADC configuration structure. -* @retval HAL status -*/ -HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef *hadc, ADC_ChannelConfTypeDef *sConfig) -{ - __IO uint32_t counter = 0U; - ADC_Common_TypeDef *tmpADC_Common; - - /* Check the parameters */ - assert_param(IS_ADC_CHANNEL(sConfig->Channel)); - assert_param(IS_ADC_REGULAR_RANK(sConfig->Rank)); - assert_param(IS_ADC_SAMPLE_TIME(sConfig->SamplingTime)); - - /* Process locked */ - __HAL_LOCK(hadc); - - /* if ADC_Channel_10 ... ADC_Channel_18 is selected */ - if (sConfig->Channel > ADC_CHANNEL_9) - { - /* Clear the old sample time */ - hadc->Instance->SMPR1 &= ~ADC_SMPR1(ADC_SMPR1_SMP10, sConfig->Channel); - - /* Set the new sample time */ - hadc->Instance->SMPR1 |= ADC_SMPR1(sConfig->SamplingTime, sConfig->Channel); - } - else /* ADC_Channel include in ADC_Channel_[0..9] */ - { - /* Clear the old sample time */ - hadc->Instance->SMPR2 &= ~ADC_SMPR2(ADC_SMPR2_SMP0, sConfig->Channel); - - /* Set the new sample time */ - hadc->Instance->SMPR2 |= ADC_SMPR2(sConfig->SamplingTime, sConfig->Channel); - } - - /* For Rank 1 to 6 */ - if (sConfig->Rank < 7U) - { - /* Clear the old SQx bits for the selected rank */ - hadc->Instance->SQR3 &= ~ADC_SQR3_RK(ADC_SQR3_SQ1, sConfig->Rank); - - /* Set the SQx bits for the selected rank */ - hadc->Instance->SQR3 |= ADC_SQR3_RK(sConfig->Channel, sConfig->Rank); - } - /* For Rank 7 to 12 */ - else if (sConfig->Rank < 13U) - { - /* Clear the old SQx bits for the selected rank */ - hadc->Instance->SQR2 &= ~ADC_SQR2_RK(ADC_SQR2_SQ7, sConfig->Rank); - - /* Set the SQx bits for the selected rank */ - hadc->Instance->SQR2 |= ADC_SQR2_RK(sConfig->Channel, sConfig->Rank); - } - /* For Rank 13 to 16 */ - else - { - /* Clear the old SQx bits for the selected rank */ - hadc->Instance->SQR1 &= ~ADC_SQR1_RK(ADC_SQR1_SQ13, sConfig->Rank); - - /* Set the SQx bits for the selected rank */ - hadc->Instance->SQR1 |= ADC_SQR1_RK(sConfig->Channel, sConfig->Rank); - } - - /* Pointer to the common control register to which is belonging hadc */ - /* (Depending on STM32F4 product, there may be up to 3 ADCs and 1 common */ - /* control register) */ - tmpADC_Common = ADC_COMMON_REGISTER(hadc); - - /* if ADC1 Channel_18 is selected for VBAT Channel ennable VBATE */ - if ((hadc->Instance == ADC1) && (sConfig->Channel == ADC_CHANNEL_VBAT)) - { - /* Disable the TEMPSENSOR channel in case of using board with multiplixed ADC_CHANNEL_VBAT & ADC_CHANNEL_TEMPSENSOR*/ - if ((uint16_t)ADC_CHANNEL_TEMPSENSOR == (uint16_t)ADC_CHANNEL_VBAT) - { - tmpADC_Common->CCR &= ~ADC_CCR_TSVREFE; - } - /* Enable the VBAT channel*/ - tmpADC_Common->CCR |= ADC_CCR_VBATE; - } - - /* if ADC1 Channel_16 or Channel_18 is selected for Temperature sensor or - Channel_17 is selected for VREFINT enable TSVREFE */ - if ((hadc->Instance == ADC1) && ((sConfig->Channel == ADC_CHANNEL_TEMPSENSOR) || (sConfig->Channel == ADC_CHANNEL_VREFINT))) - { - /* Disable the VBAT channel in case of using board with multiplixed ADC_CHANNEL_VBAT & ADC_CHANNEL_TEMPSENSOR*/ - if ((uint16_t)ADC_CHANNEL_TEMPSENSOR == (uint16_t)ADC_CHANNEL_VBAT) - { - tmpADC_Common->CCR &= ~ADC_CCR_VBATE; - } - /* Enable the Temperature sensor and VREFINT channel*/ - tmpADC_Common->CCR |= ADC_CCR_TSVREFE; - - if (sConfig->Channel == ADC_CHANNEL_TEMPSENSOR) - { - /* Delay for temperature sensor stabilization time */ - /* Compute number of CPU cycles to wait for */ - counter = (ADC_TEMPSENSOR_DELAY_US * (SystemCoreClock / 1000000U)); - while (counter != 0U) - { - counter--; - } - } - } - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Configures the analog watchdog. - * @note Analog watchdog thresholds can be modified while ADC conversion - * is on going. - * In this case, some constraints must be taken into account: - * The programmed threshold values are effective from the next - * ADC EOC (end of unitary conversion). - * Considering that registers write delay may happen due to - * bus activity, this might cause an uncertainty on the - * effective timing of the new programmed threshold values. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @param AnalogWDGConfig pointer to an ADC_AnalogWDGConfTypeDef structure - * that contains the configuration information of ADC analog watchdog. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef *hadc, ADC_AnalogWDGConfTypeDef *AnalogWDGConfig) -{ -#ifdef USE_FULL_ASSERT - uint32_t tmp = 0U; -#endif /* USE_FULL_ASSERT */ - - /* Check the parameters */ - assert_param(IS_ADC_ANALOG_WATCHDOG(AnalogWDGConfig->WatchdogMode)); - assert_param(IS_ADC_CHANNEL(AnalogWDGConfig->Channel)); - assert_param(IS_FUNCTIONAL_STATE(AnalogWDGConfig->ITMode)); - -#ifdef USE_FULL_ASSERT - tmp = ADC_GET_RESOLUTION(hadc); - assert_param(IS_ADC_RANGE(tmp, AnalogWDGConfig->HighThreshold)); - assert_param(IS_ADC_RANGE(tmp, AnalogWDGConfig->LowThreshold)); -#endif /* USE_FULL_ASSERT */ - - /* Process locked */ - __HAL_LOCK(hadc); - - if (AnalogWDGConfig->ITMode == ENABLE) - { - /* Enable the ADC Analog watchdog interrupt */ - __HAL_ADC_ENABLE_IT(hadc, ADC_IT_AWD); - } - else - { - /* Disable the ADC Analog watchdog interrupt */ - __HAL_ADC_DISABLE_IT(hadc, ADC_IT_AWD); - } - - /* Clear AWDEN, JAWDEN and AWDSGL bits */ - hadc->Instance->CR1 &= ~(ADC_CR1_AWDSGL | ADC_CR1_JAWDEN | ADC_CR1_AWDEN); - - /* Set the analog watchdog enable mode */ - hadc->Instance->CR1 |= AnalogWDGConfig->WatchdogMode; - - /* Set the high threshold */ - hadc->Instance->HTR = AnalogWDGConfig->HighThreshold; - - /* Set the low threshold */ - hadc->Instance->LTR = AnalogWDGConfig->LowThreshold; - - /* Clear the Analog watchdog channel select bits */ - hadc->Instance->CR1 &= ~ADC_CR1_AWDCH; - - /* Set the Analog watchdog channel */ - hadc->Instance->CR1 |= (uint32_t)((uint16_t)(AnalogWDGConfig->Channel)); - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup ADC_Exported_Functions_Group4 ADC Peripheral State functions - * @brief ADC Peripheral State functions - * -@verbatim - =============================================================================== - ##### Peripheral State and errors functions ##### - =============================================================================== - [..] - This subsection provides functions allowing to - (+) Check the ADC state - (+) Check the ADC Error - -@endverbatim - * @{ - */ - -/** - * @brief return the ADC state - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval HAL state - */ -uint32_t HAL_ADC_GetState(ADC_HandleTypeDef *hadc) -{ - /* Return ADC state */ - return hadc->State; -} - -/** - * @brief Return the ADC error code - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval ADC Error Code - */ -uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc) -{ - return hadc->ErrorCode; -} - -/** - * @} - */ - -/** @addtogroup ADC_Private_Functions - * @{ - */ - -/** - * @brief Initializes the ADCx peripheral according to the specified parameters - * in the ADC_InitStruct without initializing the ADC MSP. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval None - */ -static void ADC_Init(ADC_HandleTypeDef *hadc) -{ - ADC_Common_TypeDef *tmpADC_Common; - - /* Set ADC parameters */ - /* Pointer to the common control register to which is belonging hadc */ - /* (Depending on STM32F4 product, there may be up to 3 ADCs and 1 common */ - /* control register) */ - tmpADC_Common = ADC_COMMON_REGISTER(hadc); - - /* Set the ADC clock prescaler */ - tmpADC_Common->CCR &= ~(ADC_CCR_ADCPRE); - tmpADC_Common->CCR |= hadc->Init.ClockPrescaler; - - /* Set ADC scan mode */ - hadc->Instance->CR1 &= ~(ADC_CR1_SCAN); - hadc->Instance->CR1 |= ADC_CR1_SCANCONV(hadc->Init.ScanConvMode); - - /* Set ADC resolution */ - hadc->Instance->CR1 &= ~(ADC_CR1_RES); - hadc->Instance->CR1 |= hadc->Init.Resolution; - - /* Set ADC data alignment */ - hadc->Instance->CR2 &= ~(ADC_CR2_ALIGN); - hadc->Instance->CR2 |= hadc->Init.DataAlign; - - /* Enable external trigger if trigger selection is different of software */ - /* start. */ - /* Note: This configuration keeps the hardware feature of parameter */ - /* ExternalTrigConvEdge "trigger edge none" equivalent to */ - /* software start. */ - if (hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START) - { - /* Select external trigger to start conversion */ - hadc->Instance->CR2 &= ~(ADC_CR2_EXTSEL); - hadc->Instance->CR2 |= hadc->Init.ExternalTrigConv; - - /* Select external trigger polarity */ - hadc->Instance->CR2 &= ~(ADC_CR2_EXTEN); - hadc->Instance->CR2 |= hadc->Init.ExternalTrigConvEdge; - } - else - { - /* Reset the external trigger */ - hadc->Instance->CR2 &= ~(ADC_CR2_EXTSEL); - hadc->Instance->CR2 &= ~(ADC_CR2_EXTEN); - } - - /* Enable or disable ADC continuous conversion mode */ - hadc->Instance->CR2 &= ~(ADC_CR2_CONT); - hadc->Instance->CR2 |= ADC_CR2_CONTINUOUS((uint32_t)hadc->Init.ContinuousConvMode); - - if (hadc->Init.DiscontinuousConvMode != DISABLE) - { - assert_param(IS_ADC_REGULAR_DISC_NUMBER(hadc->Init.NbrOfDiscConversion)); - - /* Enable the selected ADC regular discontinuous mode */ - hadc->Instance->CR1 |= (uint32_t)ADC_CR1_DISCEN; - - /* Set the number of channels to be converted in discontinuous mode */ - hadc->Instance->CR1 &= ~(ADC_CR1_DISCNUM); - hadc->Instance->CR1 |= ADC_CR1_DISCONTINUOUS(hadc->Init.NbrOfDiscConversion); - } - else - { - /* Disable the selected ADC regular discontinuous mode */ - hadc->Instance->CR1 &= ~(ADC_CR1_DISCEN); - } - - /* Set ADC number of conversion */ - hadc->Instance->SQR1 &= ~(ADC_SQR1_L); - hadc->Instance->SQR1 |= ADC_SQR1(hadc->Init.NbrOfConversion); - - /* Enable or disable ADC DMA continuous request */ - hadc->Instance->CR2 &= ~(ADC_CR2_DDS); - hadc->Instance->CR2 |= ADC_CR2_DMAContReq((uint32_t)hadc->Init.DMAContinuousRequests); - - /* Enable or disable ADC end of conversion selection */ - hadc->Instance->CR2 &= ~(ADC_CR2_EOCS); - hadc->Instance->CR2 |= ADC_CR2_EOCSelection(hadc->Init.EOCSelection); -} - -/** - * @brief DMA transfer complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma) -{ - /* Retrieve ADC handle corresponding to current DMA handle */ - ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Update state machine on conversion status if not in error state */ - if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA)) - { - /* Update ADC state machine */ - SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC); - - /* Determine whether any further conversion upcoming on group regular */ - /* by external trigger, continuous mode or scan sequence on going. */ - /* Note: On STM32F4, there is no independent flag of end of sequence. */ - /* The test of scan sequence on going is done either with scan */ - /* sequence disabled or with end of conversion flag set to */ - /* of end of sequence. */ - if (ADC_IS_SOFTWARE_START_REGULAR(hadc) && - (hadc->Init.ContinuousConvMode == DISABLE) && - (HAL_IS_BIT_CLR(hadc->Instance->SQR1, ADC_SQR1_L) || - HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS))) - { - /* Disable ADC end of single conversion interrupt on group regular */ - /* Note: Overrun interrupt was enabled with EOC interrupt in */ - /* HAL_ADC_Start_IT(), but is not disabled here because can be used */ - /* by overrun IRQ process below. */ - __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC); - - /* Set ADC state */ - CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY); - - if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_INJ_BUSY)) - { - SET_BIT(hadc->State, HAL_ADC_STATE_READY); - } - } - - /* Conversion complete callback */ -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) - hadc->ConvCpltCallback(hadc); -#else - HAL_ADC_ConvCpltCallback(hadc); -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ - } - else /* DMA and-or internal error occurred */ - { - if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) != 0UL) - { - /* Call HAL ADC Error Callback function */ -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) - hadc->ErrorCallback(hadc); -#else - HAL_ADC_ErrorCallback(hadc); -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ - } - else - { - /* Call DMA error callback */ - hadc->DMA_Handle->XferErrorCallback(hdma); - } - } -} - -/** - * @brief DMA half transfer complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma) -{ - ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - /* Half conversion callback */ -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) - hadc->ConvHalfCpltCallback(hadc); -#else - HAL_ADC_ConvHalfCpltCallback(hadc); -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA error callback - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void ADC_DMAError(DMA_HandleTypeDef *hdma) -{ - ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - hadc->State = HAL_ADC_STATE_ERROR_DMA; - /* Set ADC error code to DMA error */ - hadc->ErrorCode |= HAL_ADC_ERROR_DMA; - /* Error callback */ -#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) - hadc->ErrorCallback(hadc); -#else - HAL_ADC_ErrorCallback(hadc); -#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_ADC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c deleted file mode 100644 index 1d8ad7b..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c +++ /dev/null @@ -1,1115 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_adc_ex.c - * @author MCD Application Team - * @brief This file provides firmware functions to manage the following - * functionalities of the ADC extension peripheral: - * + Extended features functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#)Initialize the ADC low level resources by implementing the HAL_ADC_MspInit(): - (##) Enable the ADC interface clock using __HAL_RCC_ADC_CLK_ENABLE() - (##) ADC pins configuration - (+++) Enable the clock for the ADC GPIOs using the following function: - __HAL_RCC_GPIOx_CLK_ENABLE() - (+++) Configure these ADC pins in analog mode using HAL_GPIO_Init() - (##) In case of using interrupts (e.g. HAL_ADC_Start_IT()) - (+++) Configure the ADC interrupt priority using HAL_NVIC_SetPriority() - (+++) Enable the ADC IRQ handler using HAL_NVIC_EnableIRQ() - (+++) In ADC IRQ handler, call HAL_ADC_IRQHandler() - (##) In case of using DMA to control data transfer (e.g. HAL_ADC_Start_DMA()) - (+++) Enable the DMAx interface clock using __HAL_RCC_DMAx_CLK_ENABLE() - (+++) Configure and enable two DMA streams stream for managing data - transfer from peripheral to memory (output stream) - (+++) Associate the initialized DMA handle to the ADC DMA handle - using __HAL_LINKDMA() - (+++) Configure the priority and enable the NVIC for the transfer complete - interrupt on the two DMA Streams. The output stream should have higher - priority than the input stream. - (#) Configure the ADC Prescaler, conversion resolution and data alignment - using the HAL_ADC_Init() function. - - (#) Configure the ADC Injected channels group features, use HAL_ADC_Init() - and HAL_ADC_ConfigChannel() functions. - - (#) Three operation modes are available within this driver: - - *** Polling mode IO operation *** - ================================= - [..] - (+) Start the ADC peripheral using HAL_ADCEx_InjectedStart() - (+) Wait for end of conversion using HAL_ADC_PollForConversion(), at this stage - user can specify the value of timeout according to his end application - (+) To read the ADC converted values, use the HAL_ADCEx_InjectedGetValue() function. - (+) Stop the ADC peripheral using HAL_ADCEx_InjectedStop() - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Start the ADC peripheral using HAL_ADCEx_InjectedStart_IT() - (+) Use HAL_ADC_IRQHandler() called under ADC_IRQHandler() Interrupt subroutine - (+) At ADC end of conversion HAL_ADCEx_InjectedConvCpltCallback() function is executed and user can - add his own code by customization of function pointer HAL_ADCEx_InjectedConvCpltCallback - (+) In case of ADC Error, HAL_ADCEx_InjectedErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_ADCEx_InjectedErrorCallback - (+) Stop the ADC peripheral using HAL_ADCEx_InjectedStop_IT() - - *** Multi mode ADCs Regular channels configuration *** - ====================================================== - [..] - (+) Select the Multi mode ADC regular channels features (dual or triple mode) - and configure the DMA mode using HAL_ADCEx_MultiModeConfigChannel() functions. - (+) Start the ADC peripheral using HAL_ADCEx_MultiModeStart_DMA(), at this stage the user specify the length - of data to be transferred at each end of conversion - (+) Read the ADCs converted values using the HAL_ADCEx_MultiModeGetValue() function. - - - @endverbatim - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup ADCEx ADCEx - * @brief ADC Extended driver modules - * @{ - */ - -#ifdef HAL_ADC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup ADCEx_Private_Functions - * @{ - */ -/* Private function prototypes -----------------------------------------------*/ -static void ADC_MultiModeDMAConvCplt(DMA_HandleTypeDef *hdma); -static void ADC_MultiModeDMAError(DMA_HandleTypeDef *hdma); -static void ADC_MultiModeDMAHalfConvCplt(DMA_HandleTypeDef *hdma); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup ADCEx_Exported_Functions ADC Exported Functions - * @{ - */ - -/** @defgroup ADCEx_Exported_Functions_Group1 Extended features functions - * @brief Extended features functions - * -@verbatim - =============================================================================== - ##### Extended features functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Start conversion of injected channel. - (+) Stop conversion of injected channel. - (+) Start multimode and enable DMA transfer. - (+) Stop multimode and disable DMA transfer. - (+) Get result of injected channel conversion. - (+) Get result of multimode conversion. - (+) Configure injected channels. - (+) Configure multimode. - -@endverbatim - * @{ - */ - -/** - * @brief Enables the selected ADC software start conversion of the injected channels. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADCEx_InjectedStart(ADC_HandleTypeDef *hadc) -{ - __IO uint32_t counter = 0U; - uint32_t tmp1 = 0U, tmp2 = 0U; - ADC_Common_TypeDef *tmpADC_Common; - - /* Process locked */ - __HAL_LOCK(hadc); - - /* Enable the ADC peripheral */ - - /* Check if ADC peripheral is disabled in order to enable it and wait during - Tstab time the ADC's stabilization */ - if ((hadc->Instance->CR2 & ADC_CR2_ADON) != ADC_CR2_ADON) - { - /* Enable the Peripheral */ - __HAL_ADC_ENABLE(hadc); - - /* Delay for ADC stabilization time */ - /* Compute number of CPU cycles to wait for */ - counter = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000U)); - while (counter != 0U) - { - counter--; - } - } - - /* Start conversion if ADC is effectively enabled */ - if (HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_ADON)) - { - /* Set ADC state */ - /* - Clear state bitfield related to injected group conversion results */ - /* - Set state bitfield related to injected operation */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_READY | HAL_ADC_STATE_INJ_EOC, - HAL_ADC_STATE_INJ_BUSY); - - /* Check if a regular conversion is ongoing */ - /* Note: On this device, there is no ADC error code fields related to */ - /* conversions on group injected only. In case of conversion on */ - /* going on group regular, no error code is reset. */ - if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_REG_BUSY)) - { - /* Reset ADC all error code fields */ - ADC_CLEAR_ERRORCODE(hadc); - } - - /* Process unlocked */ - /* Unlock before starting ADC conversions: in case of potential */ - /* interruption, to let the process to ADC IRQ Handler. */ - __HAL_UNLOCK(hadc); - - /* Clear injected group conversion flag */ - /* (To ensure of no unknown state from potential previous ADC operations) */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC); - - /* Pointer to the common control register to which is belonging hadc */ - /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ - /* control register) */ - tmpADC_Common = ADC_COMMON_REGISTER(hadc); - - /* Check if Multimode enabled */ - if (HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) - { - tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN); - tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO); - if (tmp1 && tmp2) - { - /* Enable the selected ADC software conversion for injected group */ - hadc->Instance->CR2 |= ADC_CR2_JSWSTART; - } - } - else - { - tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN); - tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO); - if ((hadc->Instance == ADC1) && tmp1 && tmp2) - { - /* Enable the selected ADC software conversion for injected group */ - hadc->Instance->CR2 |= ADC_CR2_JSWSTART; - } - } - } - else - { - /* Update ADC state machine to error */ - SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); - - /* Set ADC error code to ADC IP internal error */ - SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Enables the interrupt and starts ADC conversion of injected channels. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * - * @retval HAL status. - */ -HAL_StatusTypeDef HAL_ADCEx_InjectedStart_IT(ADC_HandleTypeDef *hadc) -{ - __IO uint32_t counter = 0U; - uint32_t tmp1 = 0U, tmp2 = 0U; - ADC_Common_TypeDef *tmpADC_Common; - - /* Process locked */ - __HAL_LOCK(hadc); - - /* Enable the ADC peripheral */ - - /* Check if ADC peripheral is disabled in order to enable it and wait during - Tstab time the ADC's stabilization */ - if ((hadc->Instance->CR2 & ADC_CR2_ADON) != ADC_CR2_ADON) - { - /* Enable the Peripheral */ - __HAL_ADC_ENABLE(hadc); - - /* Delay for ADC stabilization time */ - /* Compute number of CPU cycles to wait for */ - counter = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000U)); - while (counter != 0U) - { - counter--; - } - } - - /* Start conversion if ADC is effectively enabled */ - if (HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_ADON)) - { - /* Set ADC state */ - /* - Clear state bitfield related to injected group conversion results */ - /* - Set state bitfield related to injected operation */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_READY | HAL_ADC_STATE_INJ_EOC, - HAL_ADC_STATE_INJ_BUSY); - - /* Check if a regular conversion is ongoing */ - /* Note: On this device, there is no ADC error code fields related to */ - /* conversions on group injected only. In case of conversion on */ - /* going on group regular, no error code is reset. */ - if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_REG_BUSY)) - { - /* Reset ADC all error code fields */ - ADC_CLEAR_ERRORCODE(hadc); - } - - /* Process unlocked */ - /* Unlock before starting ADC conversions: in case of potential */ - /* interruption, to let the process to ADC IRQ Handler. */ - __HAL_UNLOCK(hadc); - - /* Clear injected group conversion flag */ - /* (To ensure of no unknown state from potential previous ADC operations) */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC); - - /* Enable end of conversion interrupt for injected channels */ - __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOC); - - /* Pointer to the common control register to which is belonging hadc */ - /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ - /* control register) */ - tmpADC_Common = ADC_COMMON_REGISTER(hadc); - - /* Check if Multimode enabled */ - if (HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) - { - tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN); - tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO); - if (tmp1 && tmp2) - { - /* Enable the selected ADC software conversion for injected group */ - hadc->Instance->CR2 |= ADC_CR2_JSWSTART; - } - } - else - { - tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN); - tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO); - if ((hadc->Instance == ADC1) && tmp1 && tmp2) - { - /* Enable the selected ADC software conversion for injected group */ - hadc->Instance->CR2 |= ADC_CR2_JSWSTART; - } - } - } - else - { - /* Update ADC state machine to error */ - SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); - - /* Set ADC error code to ADC IP internal error */ - SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stop conversion of injected channels. Disable ADC peripheral if - * no regular conversion is on going. - * @note If ADC must be disabled and if conversion is on going on - * regular group, function HAL_ADC_Stop must be used to stop both - * injected and regular groups, and disable the ADC. - * @note If injected group mode auto-injection is enabled, - * function HAL_ADC_Stop must be used. - * @note In case of auto-injection mode, HAL_ADC_Stop must be used. - * @param hadc ADC handle - * @retval None - */ -HAL_StatusTypeDef HAL_ADCEx_InjectedStop(ADC_HandleTypeDef *hadc) -{ - HAL_StatusTypeDef tmp_hal_status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); - - /* Process locked */ - __HAL_LOCK(hadc); - - /* Stop potential conversion and disable ADC peripheral */ - /* Conditioned to: */ - /* - No conversion on the other group (regular group) is intended to */ - /* continue (injected and regular groups stop conversion and ADC disable */ - /* are common) */ - /* - In case of auto-injection mode, HAL_ADC_Stop must be used. */ - if (((hadc->State & HAL_ADC_STATE_REG_BUSY) == RESET) && - HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO)) - { - /* Stop potential conversion on going, on regular and injected groups */ - /* Disable ADC peripheral */ - __HAL_ADC_DISABLE(hadc); - - /* Check if ADC is effectively disabled */ - if (HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON)) - { - /* Set ADC state */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY, - HAL_ADC_STATE_READY); - } - } - else - { - /* Update ADC state machine to error */ - SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG); - - tmp_hal_status = HAL_ERROR; - } - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - /* Return function status */ - return tmp_hal_status; -} - -/** - * @brief Poll for injected conversion complete - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @param Timeout Timeout value in millisecond. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADCEx_InjectedPollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout) -{ - uint32_t tickstart = 0U; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Check End of conversion flag */ - while (!(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOC))) - { - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout)) - { - /* New check to avoid false timeout detection in case of preemption */ - if (!(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOC))) - { - hadc->State = HAL_ADC_STATE_TIMEOUT; - /* Process unlocked */ - __HAL_UNLOCK(hadc); - return HAL_TIMEOUT; - } - } - } - } - - /* Clear injected group conversion flag */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JSTRT | ADC_FLAG_JEOC); - - /* Update ADC state machine */ - SET_BIT(hadc->State, HAL_ADC_STATE_INJ_EOC); - - /* Determine whether any further conversion upcoming on group injected */ - /* by external trigger, continuous mode or scan sequence on going. */ - /* Note: On STM32F4, there is no independent flag of end of sequence. */ - /* The test of scan sequence on going is done either with scan */ - /* sequence disabled or with end of conversion flag set to */ - /* of end of sequence. */ - if (ADC_IS_SOFTWARE_START_INJECTED(hadc) && - (HAL_IS_BIT_CLR(hadc->Instance->JSQR, ADC_JSQR_JL) || - HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS)) && - (HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO) && - (ADC_IS_SOFTWARE_START_REGULAR(hadc) && - (hadc->Init.ContinuousConvMode == DISABLE)))) - { - /* Set ADC state */ - CLEAR_BIT(hadc->State, HAL_ADC_STATE_INJ_BUSY); - - if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_REG_BUSY)) - { - SET_BIT(hadc->State, HAL_ADC_STATE_READY); - } - } - - /* Return ADC state */ - return HAL_OK; -} - -/** - * @brief Stop conversion of injected channels, disable interruption of - * end-of-conversion. Disable ADC peripheral if no regular conversion - * is on going. - * @note If ADC must be disabled and if conversion is on going on - * regular group, function HAL_ADC_Stop must be used to stop both - * injected and regular groups, and disable the ADC. - * @note If injected group mode auto-injection is enabled, - * function HAL_ADC_Stop must be used. - * @param hadc ADC handle - * @retval None - */ -HAL_StatusTypeDef HAL_ADCEx_InjectedStop_IT(ADC_HandleTypeDef *hadc) -{ - HAL_StatusTypeDef tmp_hal_status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); - - /* Process locked */ - __HAL_LOCK(hadc); - - /* Stop potential conversion and disable ADC peripheral */ - /* Conditioned to: */ - /* - No conversion on the other group (regular group) is intended to */ - /* continue (injected and regular groups stop conversion and ADC disable */ - /* are common) */ - /* - In case of auto-injection mode, HAL_ADC_Stop must be used. */ - if (((hadc->State & HAL_ADC_STATE_REG_BUSY) == RESET) && - HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO)) - { - /* Stop potential conversion on going, on regular and injected groups */ - /* Disable ADC peripheral */ - __HAL_ADC_DISABLE(hadc); - - /* Check if ADC is effectively disabled */ - if (HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON)) - { - /* Disable ADC end of conversion interrupt for injected channels */ - __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC); - - /* Set ADC state */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY, - HAL_ADC_STATE_READY); - } - } - else - { - /* Update ADC state machine to error */ - SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG); - - tmp_hal_status = HAL_ERROR; - } - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - /* Return function status */ - return tmp_hal_status; -} - -/** - * @brief Gets the converted value from data register of injected channel. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @param InjectedRank the ADC injected rank. - * This parameter can be one of the following values: - * @arg ADC_INJECTED_RANK_1: Injected Channel1 selected - * @arg ADC_INJECTED_RANK_2: Injected Channel2 selected - * @arg ADC_INJECTED_RANK_3: Injected Channel3 selected - * @arg ADC_INJECTED_RANK_4: Injected Channel4 selected - * @retval None - */ -uint32_t HAL_ADCEx_InjectedGetValue(ADC_HandleTypeDef *hadc, uint32_t InjectedRank) -{ - __IO uint32_t tmp = 0U; - - /* Check the parameters */ - assert_param(IS_ADC_INJECTED_RANK(InjectedRank)); - - /* Clear injected group conversion flag to have similar behaviour as */ - /* regular group: reading data register also clears end of conversion flag. */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC); - - /* Return the selected ADC converted value */ - switch (InjectedRank) - { - case ADC_INJECTED_RANK_4: - { - tmp = hadc->Instance->JDR4; - } - break; - case ADC_INJECTED_RANK_3: - { - tmp = hadc->Instance->JDR3; - } - break; - case ADC_INJECTED_RANK_2: - { - tmp = hadc->Instance->JDR2; - } - break; - case ADC_INJECTED_RANK_1: - { - tmp = hadc->Instance->JDR1; - } - break; - default: - break; - } - return tmp; -} - -/** - * @brief Enables ADC DMA request after last transfer (Multi-ADC mode) and enables ADC peripheral - * - * @note Caution: This function must be used only with the ADC master. - * - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @param pData Pointer to buffer in which transferred from ADC peripheral to memory will be stored. - * @param Length The length of data to be transferred from ADC peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length) -{ - __IO uint32_t counter = 0U; - ADC_Common_TypeDef *tmpADC_Common; - - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode)); - assert_param(IS_ADC_EXT_TRIG_EDGE(hadc->Init.ExternalTrigConvEdge)); - assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAContinuousRequests)); - - /* Process locked */ - __HAL_LOCK(hadc); - - /* Check if ADC peripheral is disabled in order to enable it and wait during - Tstab time the ADC's stabilization */ - if ((hadc->Instance->CR2 & ADC_CR2_ADON) != ADC_CR2_ADON) - { - /* Enable the Peripheral */ - __HAL_ADC_ENABLE(hadc); - - /* Delay for temperature sensor stabilization time */ - /* Compute number of CPU cycles to wait for */ - counter = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000U)); - while (counter != 0U) - { - counter--; - } - } - - /* Start conversion if ADC is effectively enabled */ - if (HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_ADON)) - { - /* Set ADC state */ - /* - Clear state bitfield related to regular group conversion results */ - /* - Set state bitfield related to regular group operation */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR, - HAL_ADC_STATE_REG_BUSY); - - /* If conversions on group regular are also triggering group injected, */ - /* update ADC state. */ - if (READ_BIT(hadc->Instance->CR1, ADC_CR1_JAUTO) != RESET) - { - ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY); - } - - /* State machine update: Check if an injected conversion is ongoing */ - if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY)) - { - /* Reset ADC error code fields related to conversions on group regular */ - CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA)); - } - else - { - /* Reset ADC all error code fields */ - ADC_CLEAR_ERRORCODE(hadc); - } - - /* Process unlocked */ - /* Unlock before starting ADC conversions: in case of potential */ - /* interruption, to let the process to ADC IRQ Handler. */ - __HAL_UNLOCK(hadc); - - /* Set the DMA transfer complete callback */ - hadc->DMA_Handle->XferCpltCallback = ADC_MultiModeDMAConvCplt; - - /* Set the DMA half transfer complete callback */ - hadc->DMA_Handle->XferHalfCpltCallback = ADC_MultiModeDMAHalfConvCplt; - - /* Set the DMA error callback */ - hadc->DMA_Handle->XferErrorCallback = ADC_MultiModeDMAError ; - - /* Manage ADC and DMA start: ADC overrun interruption, DMA start, ADC */ - /* start (in case of SW start): */ - - /* Clear regular group conversion flag and overrun flag */ - /* (To ensure of no unknown state from potential previous ADC operations) */ - __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOC); - - /* Enable ADC overrun interrupt */ - __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR); - - /* Pointer to the common control register to which is belonging hadc */ - /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ - /* control register) */ - tmpADC_Common = ADC_COMMON_REGISTER(hadc); - - if (hadc->Init.DMAContinuousRequests != DISABLE) - { - /* Enable the selected ADC DMA request after last transfer */ - tmpADC_Common->CCR |= ADC_CCR_DDS; - } - else - { - /* Disable the selected ADC EOC rising on each regular channel conversion */ - tmpADC_Common->CCR &= ~ADC_CCR_DDS; - } - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&tmpADC_Common->CDR, (uint32_t)pData, Length); - - /* if no external trigger present enable software conversion of regular channels */ - if ((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) - { - /* Enable the selected ADC software conversion for regular group */ - hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART; - } - } - else - { - /* Update ADC state machine to error */ - SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); - - /* Set ADC error code to ADC IP internal error */ - SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Disables ADC DMA (multi-ADC mode) and disables ADC peripheral - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADCEx_MultiModeStop_DMA(ADC_HandleTypeDef *hadc) -{ - HAL_StatusTypeDef tmp_hal_status = HAL_OK; - ADC_Common_TypeDef *tmpADC_Common; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); - - /* Process locked */ - __HAL_LOCK(hadc); - - /* Stop potential conversion on going, on regular and injected groups */ - /* Disable ADC peripheral */ - __HAL_ADC_DISABLE(hadc); - - /* Pointer to the common control register to which is belonging hadc */ - /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ - /* control register) */ - tmpADC_Common = ADC_COMMON_REGISTER(hadc); - - /* Check if ADC is effectively disabled */ - if (HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON)) - { - /* Disable the selected ADC DMA mode for multimode */ - tmpADC_Common->CCR &= ~ADC_CCR_DDS; - - /* Disable the DMA channel (in case of DMA in circular mode or stop while */ - /* DMA transfer is on going) */ - tmp_hal_status = HAL_DMA_Abort(hadc->DMA_Handle); - - /* Disable ADC overrun interrupt */ - __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR); - - /* Set ADC state */ - ADC_STATE_CLR_SET(hadc->State, - HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY, - HAL_ADC_STATE_READY); - } - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - /* Return function status */ - return tmp_hal_status; -} - -/** - * @brief Returns the last ADC1, ADC2 and ADC3 regular conversions results - * data in the selected multi mode. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval The converted data value. - */ -uint32_t HAL_ADCEx_MultiModeGetValue(ADC_HandleTypeDef *hadc) -{ - ADC_Common_TypeDef *tmpADC_Common; - - /* Prevent unused argument(s) compilation warning */ - UNUSED(hadc); - - /* Pointer to the common control register to which is belonging hadc */ - /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ - /* control register) */ - tmpADC_Common = ADC_COMMON_REGISTER(hadc); - - /* Return the multi mode conversion value */ - return tmpADC_Common->CDR; -} - -/** - * @brief Injected conversion complete callback in non blocking mode - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @retval None - */ -__weak void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hadc); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_ADC_InjectedConvCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Configures for the selected ADC injected channel its corresponding - * rank in the sequencer and its sample time. - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @param sConfigInjected ADC configuration structure for injected channel. - * @retval None - */ -HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef *hadc, ADC_InjectionConfTypeDef *sConfigInjected) -{ - -#ifdef USE_FULL_ASSERT - uint32_t tmp = 0U; - -#endif /* USE_FULL_ASSERT */ - - ADC_Common_TypeDef *tmpADC_Common; - - /* Check the parameters */ - assert_param(IS_ADC_CHANNEL(sConfigInjected->InjectedChannel)); - assert_param(IS_ADC_INJECTED_RANK(sConfigInjected->InjectedRank)); - assert_param(IS_ADC_SAMPLE_TIME(sConfigInjected->InjectedSamplingTime)); - assert_param(IS_ADC_EXT_INJEC_TRIG(sConfigInjected->ExternalTrigInjecConv)); - assert_param(IS_ADC_INJECTED_LENGTH(sConfigInjected->InjectedNbrOfConversion)); - assert_param(IS_FUNCTIONAL_STATE(sConfigInjected->AutoInjectedConv)); - assert_param(IS_FUNCTIONAL_STATE(sConfigInjected->InjectedDiscontinuousConvMode)); - -#ifdef USE_FULL_ASSERT - tmp = ADC_GET_RESOLUTION(hadc); - assert_param(IS_ADC_RANGE(tmp, sConfigInjected->InjectedOffset)); -#endif /* USE_FULL_ASSERT */ - - if (sConfigInjected->ExternalTrigInjecConv != ADC_INJECTED_SOFTWARE_START) - { - assert_param(IS_ADC_EXT_INJEC_TRIG_EDGE(sConfigInjected->ExternalTrigInjecConvEdge)); - } - - /* Process locked */ - __HAL_LOCK(hadc); - - /* if ADC_Channel_10 ... ADC_Channel_18 is selected */ - if (sConfigInjected->InjectedChannel > ADC_CHANNEL_9) - { - /* Clear the old sample time */ - hadc->Instance->SMPR1 &= ~ADC_SMPR1(ADC_SMPR1_SMP10, sConfigInjected->InjectedChannel); - - /* Set the new sample time */ - hadc->Instance->SMPR1 |= ADC_SMPR1(sConfigInjected->InjectedSamplingTime, sConfigInjected->InjectedChannel); - } - else /* ADC_Channel include in ADC_Channel_[0..9] */ - { - /* Clear the old sample time */ - hadc->Instance->SMPR2 &= ~ADC_SMPR2(ADC_SMPR2_SMP0, sConfigInjected->InjectedChannel); - - /* Set the new sample time */ - hadc->Instance->SMPR2 |= ADC_SMPR2(sConfigInjected->InjectedSamplingTime, sConfigInjected->InjectedChannel); - } - - /*---------------------------- ADCx JSQR Configuration -----------------*/ - hadc->Instance->JSQR &= ~(ADC_JSQR_JL); - hadc->Instance->JSQR |= ADC_SQR1(sConfigInjected->InjectedNbrOfConversion); - - /* Rank configuration */ - - /* Clear the old SQx bits for the selected rank */ - hadc->Instance->JSQR &= ~ADC_JSQR(ADC_JSQR_JSQ1, sConfigInjected->InjectedRank, sConfigInjected->InjectedNbrOfConversion); - - /* Set the SQx bits for the selected rank */ - hadc->Instance->JSQR |= ADC_JSQR(sConfigInjected->InjectedChannel, sConfigInjected->InjectedRank, sConfigInjected->InjectedNbrOfConversion); - - /* Enable external trigger if trigger selection is different of software */ - /* start. */ - /* Note: This configuration keeps the hardware feature of parameter */ - /* ExternalTrigConvEdge "trigger edge none" equivalent to */ - /* software start. */ - if (sConfigInjected->ExternalTrigInjecConv != ADC_INJECTED_SOFTWARE_START) - { - /* Select external trigger to start conversion */ - hadc->Instance->CR2 &= ~(ADC_CR2_JEXTSEL); - hadc->Instance->CR2 |= sConfigInjected->ExternalTrigInjecConv; - - /* Select external trigger polarity */ - hadc->Instance->CR2 &= ~(ADC_CR2_JEXTEN); - hadc->Instance->CR2 |= sConfigInjected->ExternalTrigInjecConvEdge; - } - else - { - /* Reset the external trigger */ - hadc->Instance->CR2 &= ~(ADC_CR2_JEXTSEL); - hadc->Instance->CR2 &= ~(ADC_CR2_JEXTEN); - } - - if (sConfigInjected->AutoInjectedConv != DISABLE) - { - /* Enable the selected ADC automatic injected group conversion */ - hadc->Instance->CR1 |= ADC_CR1_JAUTO; - } - else - { - /* Disable the selected ADC automatic injected group conversion */ - hadc->Instance->CR1 &= ~(ADC_CR1_JAUTO); - } - - if (sConfigInjected->InjectedDiscontinuousConvMode != DISABLE) - { - /* Enable the selected ADC injected discontinuous mode */ - hadc->Instance->CR1 |= ADC_CR1_JDISCEN; - } - else - { - /* Disable the selected ADC injected discontinuous mode */ - hadc->Instance->CR1 &= ~(ADC_CR1_JDISCEN); - } - - switch (sConfigInjected->InjectedRank) - { - case 1U: - /* Set injected channel 1 offset */ - hadc->Instance->JOFR1 &= ~(ADC_JOFR1_JOFFSET1); - hadc->Instance->JOFR1 |= sConfigInjected->InjectedOffset; - break; - case 2U: - /* Set injected channel 2 offset */ - hadc->Instance->JOFR2 &= ~(ADC_JOFR2_JOFFSET2); - hadc->Instance->JOFR2 |= sConfigInjected->InjectedOffset; - break; - case 3U: - /* Set injected channel 3 offset */ - hadc->Instance->JOFR3 &= ~(ADC_JOFR3_JOFFSET3); - hadc->Instance->JOFR3 |= sConfigInjected->InjectedOffset; - break; - default: - /* Set injected channel 4 offset */ - hadc->Instance->JOFR4 &= ~(ADC_JOFR4_JOFFSET4); - hadc->Instance->JOFR4 |= sConfigInjected->InjectedOffset; - break; - } - - /* Pointer to the common control register to which is belonging hadc */ - /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ - /* control register) */ - tmpADC_Common = ADC_COMMON_REGISTER(hadc); - - /* if ADC1 Channel_18 is selected enable VBAT Channel */ - if ((hadc->Instance == ADC1) && (sConfigInjected->InjectedChannel == ADC_CHANNEL_VBAT)) - { - /* Enable the VBAT channel*/ - tmpADC_Common->CCR |= ADC_CCR_VBATE; - } - - /* if ADC1 Channel_16 or Channel_17 is selected enable TSVREFE Channel(Temperature sensor and VREFINT) */ - if ((hadc->Instance == ADC1) && ((sConfigInjected->InjectedChannel == ADC_CHANNEL_TEMPSENSOR) || (sConfigInjected->InjectedChannel == ADC_CHANNEL_VREFINT))) - { - /* Enable the TSVREFE channel*/ - tmpADC_Common->CCR |= ADC_CCR_TSVREFE; - } - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Configures the ADC multi-mode - * @param hadc pointer to a ADC_HandleTypeDef structure that contains - * the configuration information for the specified ADC. - * @param multimode pointer to an ADC_MultiModeTypeDef structure that contains - * the configuration information for multimode. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_ADCEx_MultiModeConfigChannel(ADC_HandleTypeDef *hadc, ADC_MultiModeTypeDef *multimode) -{ - - ADC_Common_TypeDef *tmpADC_Common; - - /* Check the parameters */ - assert_param(IS_ADC_MODE(multimode->Mode)); - assert_param(IS_ADC_DMA_ACCESS_MODE(multimode->DMAAccessMode)); - assert_param(IS_ADC_SAMPLING_DELAY(multimode->TwoSamplingDelay)); - - /* Process locked */ - __HAL_LOCK(hadc); - - /* Pointer to the common control register to which is belonging hadc */ - /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ - /* control register) */ - tmpADC_Common = ADC_COMMON_REGISTER(hadc); - - /* Set ADC mode */ - tmpADC_Common->CCR &= ~(ADC_CCR_MULTI); - tmpADC_Common->CCR |= multimode->Mode; - - /* Set the ADC DMA access mode */ - tmpADC_Common->CCR &= ~(ADC_CCR_DMA); - tmpADC_Common->CCR |= multimode->DMAAccessMode; - - /* Set delay between two sampling phases */ - tmpADC_Common->CCR &= ~(ADC_CCR_DELAY); - tmpADC_Common->CCR |= multimode->TwoSamplingDelay; - - /* Process unlocked */ - __HAL_UNLOCK(hadc); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** - * @brief DMA transfer complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void ADC_MultiModeDMAConvCplt(DMA_HandleTypeDef *hdma) -{ - /* Retrieve ADC handle corresponding to current DMA handle */ - ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Update state machine on conversion status if not in error state */ - if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA)) - { - /* Update ADC state machine */ - SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC); - - /* Determine whether any further conversion upcoming on group regular */ - /* by external trigger, continuous mode or scan sequence on going. */ - /* Note: On STM32F4, there is no independent flag of end of sequence. */ - /* The test of scan sequence on going is done either with scan */ - /* sequence disabled or with end of conversion flag set to */ - /* of end of sequence. */ - if (ADC_IS_SOFTWARE_START_REGULAR(hadc) && - (hadc->Init.ContinuousConvMode == DISABLE) && - (HAL_IS_BIT_CLR(hadc->Instance->SQR1, ADC_SQR1_L) || - HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS))) - { - /* Disable ADC end of single conversion interrupt on group regular */ - /* Note: Overrun interrupt was enabled with EOC interrupt in */ - /* HAL_ADC_Start_IT(), but is not disabled here because can be used */ - /* by overrun IRQ process below. */ - __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC); - - /* Set ADC state */ - CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY); - - if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_INJ_BUSY)) - { - SET_BIT(hadc->State, HAL_ADC_STATE_READY); - } - } - - /* Conversion complete callback */ - HAL_ADC_ConvCpltCallback(hadc); - } - else - { - /* Call DMA error callback */ - hadc->DMA_Handle->XferErrorCallback(hdma); - } -} - -/** - * @brief DMA half transfer complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void ADC_MultiModeDMAHalfConvCplt(DMA_HandleTypeDef *hdma) -{ - ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - /* Conversion complete callback */ - HAL_ADC_ConvHalfCpltCallback(hadc); -} - -/** - * @brief DMA error callback - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void ADC_MultiModeDMAError(DMA_HandleTypeDef *hdma) -{ - ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - hadc->State = HAL_ADC_STATE_ERROR_DMA; - /* Set ADC error code to DMA error */ - hadc->ErrorCode |= HAL_ADC_ERROR_DMA; - HAL_ADC_ErrorCallback(hadc); -} - -/** - * @} - */ - -#endif /* HAL_ADC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c deleted file mode 100644 index c3d2ba8..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c +++ /dev/null @@ -1,538 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_cortex.c - * @author MCD Application Team - * @brief CORTEX HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the CORTEX: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - - [..] - *** How to configure Interrupts using CORTEX HAL driver *** - =========================================================== - [..] - This section provides functions allowing to configure the NVIC interrupts (IRQ). - The Cortex-M4 exceptions are managed by CMSIS functions. - - (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() - function according to the following table. - (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority(). - (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ(). - (#) please refer to programming manual for details in how to configure priority. - - -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible. - The pending IRQ priority will be managed only by the sub priority. - - -@- IRQ priority order (sorted by highest to lowest priority): - (+@) Lowest preemption priority - (+@) Lowest sub priority - (+@) Lowest hardware priority (IRQ number) - - [..] - *** How to configure Systick using CORTEX HAL driver *** - ======================================================== - [..] - Setup SysTick Timer for time base. - - (+) The HAL_SYSTICK_Config() function calls the SysTick_Config() function which - is a CMSIS function that: - (++) Configures the SysTick Reload register with value passed as function parameter. - (++) Configures the SysTick IRQ priority to the lowest value 0x0F. - (++) Resets the SysTick Counter register. - (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). - (++) Enables the SysTick Interrupt. - (++) Starts the SysTick Counter. - - (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro - __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the - HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined - inside the stm32f4xx_hal_cortex.h file. - - (+) You can change the SysTick IRQ priority by calling the - HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function - call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function. - - (+) To adjust the SysTick time base, use the following formula: - - Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) - (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function - (++) Reload Value should not exceed 0xFFFFFF - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup CORTEX CORTEX - * @brief CORTEX HAL module driver - * @{ - */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions - * @{ - */ - - -/** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] - This section provides the CORTEX HAL driver functions allowing to configure Interrupts - Systick functionalities - -@endverbatim - * @{ - */ - - -/** - * @brief Sets the priority grouping field (preemption priority and subpriority) - * using the required unlock sequence. - * @param PriorityGroup The priority grouping bits length. - * This parameter can be one of the following values: - * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority - * 4 bits for subpriority - * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority - * 3 bits for subpriority - * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority - * 2 bits for subpriority - * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority - * 1 bits for subpriority - * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority - * 0 bits for subpriority - * @note When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible. - * The pending IRQ priority will be managed only by the subpriority. - * @retval None - */ -void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - /* Check the parameters */ - assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); - - /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ - NVIC_SetPriorityGrouping(PriorityGroup); -} - -/** - * @brief Sets the priority of an interrupt. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @param PreemptPriority The preemption priority for the IRQn channel. - * This parameter can be a value between 0 and 15 - * A lower priority value indicates a higher priority - * @param SubPriority the subpriority level for the IRQ channel. - * This parameter can be a value between 0 and 15 - * A lower priority value indicates a higher priority. - * @retval None - */ -void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t prioritygroup = 0x00U; - - /* Check the parameters */ - assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); - assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); - - prioritygroup = NVIC_GetPriorityGrouping(); - - NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); -} - -/** - * @brief Enables a device specific interrupt in the NVIC interrupt controller. - * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() - * function should be called before. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Enable interrupt */ - NVIC_EnableIRQ(IRQn); -} - -/** - * @brief Disables a device specific interrupt in the NVIC interrupt controller. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Disable interrupt */ - NVIC_DisableIRQ(IRQn); -} - -/** - * @brief Initiates a system reset request to reset the MCU. - * @retval None - */ -void HAL_NVIC_SystemReset(void) -{ - /* System Reset */ - NVIC_SystemReset(); -} - -/** - * @brief Initializes the System Timer and its interrupt, and starts the System Tick Timer. - * Counter is in free running mode to generate periodic interrupts. - * @param TicksNumb Specifies the ticks Number of ticks between two interrupts. - * @retval status: - 0 Function succeeded. - * - 1 Function failed. - */ -uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) -{ - return SysTick_Config(TicksNumb); -} -/** - * @} - */ - -/** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions - * @brief Cortex control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control the CORTEX - (NVIC, SYSTICK, MPU) functionalities. - - -@endverbatim - * @{ - */ - -#if (__MPU_PRESENT == 1U) -/** - * @brief Disables the MPU - * @retval None - */ -void HAL_MPU_Disable(void) -{ - /* Make sure outstanding transfers are done */ - __DMB(); - - /* Disable fault exceptions */ - SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; - - /* Disable the MPU and clear the control register*/ - MPU->CTRL = 0U; -} - -/** - * @brief Enable the MPU. - * @param MPU_Control Specifies the control mode of the MPU during hard fault, - * NMI, FAULTMASK and privileged access to the default memory - * This parameter can be one of the following values: - * @arg MPU_HFNMI_PRIVDEF_NONE - * @arg MPU_HARDFAULT_NMI - * @arg MPU_PRIVILEGED_DEFAULT - * @arg MPU_HFNMI_PRIVDEF - * @retval None - */ -void HAL_MPU_Enable(uint32_t MPU_Control) -{ - /* Enable the MPU */ - MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; - - /* Enable fault exceptions */ - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - /* Ensure MPU setting take effects */ - __DSB(); - __ISB(); -} - -/** - * @brief Enables the MPU Region. - * @retval None - */ -void HAL_MPU_EnableRegion(uint32_t RegionNumber) -{ - /* Check the parameters */ - assert_param(IS_MPU_REGION_NUMBER(RegionNumber)); - - /* Set the Region number */ - MPU->RNR = RegionNumber; - - /* Enable the Region */ - SET_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); -} - -/** - * @brief Disables the MPU Region. - * @retval None - */ -void HAL_MPU_DisableRegion(uint32_t RegionNumber) -{ - /* Check the parameters */ - assert_param(IS_MPU_REGION_NUMBER(RegionNumber)); - - /* Set the Region number */ - MPU->RNR = RegionNumber; - - /* Disable the Region */ - CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); -} - -/** - * @brief Initializes and configures the Region and the memory to be protected. - * @param MPU_Init Pointer to a MPU_Region_InitTypeDef structure that contains - * the initialization and configuration information. - * @retval None - */ -void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init) -{ - /* Check the parameters */ - assert_param(IS_MPU_REGION_NUMBER(MPU_Init->Number)); - assert_param(IS_MPU_REGION_ENABLE(MPU_Init->Enable)); - assert_param(IS_MPU_INSTRUCTION_ACCESS(MPU_Init->DisableExec)); - assert_param(IS_MPU_REGION_PERMISSION_ATTRIBUTE(MPU_Init->AccessPermission)); - assert_param(IS_MPU_TEX_LEVEL(MPU_Init->TypeExtField)); - assert_param(IS_MPU_ACCESS_SHAREABLE(MPU_Init->IsShareable)); - assert_param(IS_MPU_ACCESS_CACHEABLE(MPU_Init->IsCacheable)); - assert_param(IS_MPU_ACCESS_BUFFERABLE(MPU_Init->IsBufferable)); - assert_param(IS_MPU_SUB_REGION_DISABLE(MPU_Init->SubRegionDisable)); - assert_param(IS_MPU_REGION_SIZE(MPU_Init->Size)); - - /* Set the Region number */ - MPU->RNR = MPU_Init->Number; - - /* Disable the Region */ - CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); - - /* Apply configuration */ - MPU->RBAR = MPU_Init->BaseAddress; - MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) | - ((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) | - ((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) | - ((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) | - ((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) | - ((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) | - ((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) | - ((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) | - ((uint32_t)MPU_Init->Enable << MPU_RASR_ENABLE_Pos); -} -#endif /* __MPU_PRESENT */ - -/** - * @brief Clear pending events. - * @retval None - */ -void HAL_CORTEX_ClearEvent(void) -{ - __SEV(); - __WFE(); -} - -/** - * @brief Gets the priority grouping field from the NVIC Interrupt Controller. - * @retval Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field) - */ -uint32_t HAL_NVIC_GetPriorityGrouping(void) -{ - /* Get the PRIGROUP[10:8] field value */ - return NVIC_GetPriorityGrouping(); -} - -/** - * @brief Gets the priority of an interrupt. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @param PriorityGroup the priority grouping bits length. - * This parameter can be one of the following values: - * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority - * 4 bits for subpriority - * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority - * 3 bits for subpriority - * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority - * 2 bits for subpriority - * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority - * 1 bits for subpriority - * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority - * 0 bits for subpriority - * @param pPreemptPriority Pointer on the Preemptive priority value (starting from 0). - * @param pSubPriority Pointer on the Subpriority value (starting from 0). - * @retval None - */ -void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority) -{ - /* Check the parameters */ - assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); - /* Get priority for Cortex-M system or device specific interrupts */ - NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); -} - -/** - * @brief Sets Pending bit of an external interrupt. - * @param IRQn External interrupt number - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Set interrupt pending */ - NVIC_SetPendingIRQ(IRQn); -} - -/** - * @brief Gets Pending Interrupt (reads the pending register in the NVIC - * and returns the pending bit for the specified interrupt). - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval status: - 0 Interrupt status is not pending. - * - 1 Interrupt status is pending. - */ -uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Return 1 if pending else 0 */ - return NVIC_GetPendingIRQ(IRQn); -} - -/** - * @brief Clears the pending bit of an external interrupt. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Clear pending interrupt */ - NVIC_ClearPendingIRQ(IRQn); -} - -/** - * @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit). - * @param IRQn External interrupt number - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval status: - 0 Interrupt status is not pending. - * - 1 Interrupt status is pending. - */ -uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Return 1 if active else 0 */ - return NVIC_GetActive(IRQn); -} - -/** - * @brief Configures the SysTick clock source. - * @param CLKSource specifies the SysTick clock source. - * This parameter can be one of the following values: - * @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. - * @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. - * @retval None - */ -void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) -{ - /* Check the parameters */ - assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); - if (CLKSource == SYSTICK_CLKSOURCE_HCLK) - { - SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; - } - else - { - SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; - } -} - -/** - * @brief This function handles SYSTICK interrupt request. - * @retval None - */ -void HAL_SYSTICK_IRQHandler(void) -{ - HAL_SYSTICK_Callback(); -} - -/** - * @brief SYSTICK callback. - * @retval None - */ -__weak void HAL_SYSTICK_Callback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SYSTICK_Callback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_CORTEX_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c deleted file mode 100644 index 3dbb477..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c +++ /dev/null @@ -1,1305 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma.c - * @author MCD Application Team - * @brief DMA HAL module driver. - * - * This file provides firmware functions to manage the following - * functionalities of the Direct Memory Access (DMA) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral State and errors functions - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Enable and configure the peripheral to be connected to the DMA Stream - (except for internal SRAM/FLASH memories: no initialization is - necessary) please refer to Reference manual for connection between peripherals - and DMA requests. - - (#) For a given Stream, program the required configuration through the following parameters: - Transfer Direction, Source and Destination data formats, - Circular, Normal or peripheral flow control mode, Stream Priority level, - Source and Destination Increment mode, FIFO mode and its Threshold (if needed), - Burst mode for Source and/or Destination (if needed) using HAL_DMA_Init() function. - - -@- Prior to HAL_DMA_Init() the clock must be enabled for DMA through the following macros: - __HAL_RCC_DMA1_CLK_ENABLE() or __HAL_RCC_DMA2_CLK_ENABLE(). - - *** Polling mode IO operation *** - ================================= - [..] - (+) Use HAL_DMA_Start() to start DMA transfer after the configuration of Source - address and destination address and the Length of data to be transferred. - (+) Use HAL_DMA_PollForTransfer() to poll for the end of current transfer, in this - case a fixed Timeout can be configured by User depending from his application. - (+) Use HAL_DMA_Abort() function to abort the current transfer. - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Configure the DMA interrupt priority using HAL_NVIC_SetPriority() - (+) Enable the DMA IRQ handler using HAL_NVIC_EnableIRQ() - (+) Use HAL_DMA_Start_IT() to start DMA transfer after the configuration of - Source address and destination address and the Length of data to be transferred. In this - case the DMA interrupt is configured - (+) Use HAL_DMA_IRQHandler() called under DMA_IRQHandler() Interrupt subroutine - (+) At the end of data transfer HAL_DMA_IRQHandler() function is executed and user can - add his own function by customization of function pointer XferCpltCallback and - XferErrorCallback (i.e a member of DMA handle structure). - [..] - (#) Use HAL_DMA_GetState() function to return the DMA state and HAL_DMA_GetError() in case of error - detection. - - (#) Use HAL_DMA_Abort_IT() function to abort the current transfer - - -@- In Memory-to-Memory transfer mode, Circular mode is not allowed. - - -@- The FIFO is used mainly to reduce bus usage and to allow data packing/unpacking: it is - possible to set different Data Sizes for the Peripheral and the Memory (ie. you can set - Half-Word data size for the peripheral to access its data register and set Word data size - for the Memory to gain in access time. Each two half words will be packed and written in - a single access to a Word in the Memory). - - -@- When FIFO is disabled, it is not allowed to configure different Data Sizes for Source - and Destination. In this case the Peripheral Data Size will be applied to both Source - and Destination. - - *** DMA HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in DMA HAL driver. - - (+) __HAL_DMA_ENABLE: Enable the specified DMA Stream. - (+) __HAL_DMA_DISABLE: Disable the specified DMA Stream. - (+) __HAL_DMA_GET_IT_SOURCE: Check whether the specified DMA Stream interrupt has occurred or not. - - [..] - (@) You can refer to the DMA HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup DMA DMA - * @brief DMA HAL module driver - * @{ - */ - -#ifdef HAL_DMA_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -typedef struct -{ - __IO uint32_t ISR; /*!< DMA interrupt status register */ - __IO uint32_t Reserved0; - __IO uint32_t IFCR; /*!< DMA interrupt flag clear register */ -} DMA_Base_Registers; - -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @addtogroup DMA_Private_Constants - * @{ - */ - #define HAL_TIMEOUT_DMA_ABORT 5U /* 5 ms */ -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup DMA_Private_Functions - * @{ - */ -static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma); - -/** - * @} - */ - -/* Exported functions ---------------------------------------------------------*/ -/** @addtogroup DMA_Exported_Functions - * @{ - */ - -/** @addtogroup DMA_Exported_Functions_Group1 - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to initialize the DMA Stream source - and destination addresses, incrementation and data sizes, transfer direction, - circular/normal mode selection, memory-to-memory mode selection and Stream priority value. - [..] - The HAL_DMA_Init() function follows the DMA configuration procedures as described in - reference manual. - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the DMA according to the specified - * parameters in the DMA_InitTypeDef and create the associated handle. - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) -{ - uint32_t tmp = 0U; - uint32_t tickstart = HAL_GetTick(); - DMA_Base_Registers *regs; - - /* Check the DMA peripheral state */ - if(hdma == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); - assert_param(IS_DMA_CHANNEL(hdma->Init.Channel)); - assert_param(IS_DMA_DIRECTION(hdma->Init.Direction)); - assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc)); - assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc)); - assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment)); - assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment)); - assert_param(IS_DMA_MODE(hdma->Init.Mode)); - assert_param(IS_DMA_PRIORITY(hdma->Init.Priority)); - assert_param(IS_DMA_FIFO_MODE_STATE(hdma->Init.FIFOMode)); - /* Check the memory burst, peripheral burst and FIFO threshold parameters only - when FIFO mode is enabled */ - if(hdma->Init.FIFOMode != DMA_FIFOMODE_DISABLE) - { - assert_param(IS_DMA_FIFO_THRESHOLD(hdma->Init.FIFOThreshold)); - assert_param(IS_DMA_MEMORY_BURST(hdma->Init.MemBurst)); - assert_param(IS_DMA_PERIPHERAL_BURST(hdma->Init.PeriphBurst)); - } - - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Allocate lock resource */ - __HAL_UNLOCK(hdma); - - /* Disable the peripheral */ - __HAL_DMA_DISABLE(hdma); - - /* Check if the DMA Stream is effectively disabled */ - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_TIMEOUT; - - return HAL_TIMEOUT; - } - } - - /* Get the CR register value */ - tmp = hdma->Instance->CR; - - /* Clear CHSEL, MBURST, PBURST, PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR, CT and DBM bits */ - tmp &= ((uint32_t)~(DMA_SxCR_CHSEL | DMA_SxCR_MBURST | DMA_SxCR_PBURST | \ - DMA_SxCR_PL | DMA_SxCR_MSIZE | DMA_SxCR_PSIZE | \ - DMA_SxCR_MINC | DMA_SxCR_PINC | DMA_SxCR_CIRC | \ - DMA_SxCR_DIR | DMA_SxCR_CT | DMA_SxCR_DBM)); - - /* Prepare the DMA Stream configuration */ - tmp |= hdma->Init.Channel | hdma->Init.Direction | - hdma->Init.PeriphInc | hdma->Init.MemInc | - hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | - hdma->Init.Mode | hdma->Init.Priority; - - /* the Memory burst and peripheral burst are not used when the FIFO is disabled */ - if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) - { - /* Get memory burst and peripheral burst */ - tmp |= hdma->Init.MemBurst | hdma->Init.PeriphBurst; - } - - /* Write to DMA Stream CR register */ - hdma->Instance->CR = tmp; - - /* Get the FCR register value */ - tmp = hdma->Instance->FCR; - - /* Clear Direct mode and FIFO threshold bits */ - tmp &= (uint32_t)~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH); - - /* Prepare the DMA Stream FIFO configuration */ - tmp |= hdma->Init.FIFOMode; - - /* The FIFO threshold is not used when the FIFO mode is disabled */ - if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) - { - /* Get the FIFO threshold */ - tmp |= hdma->Init.FIFOThreshold; - - /* Check compatibility between FIFO threshold level and size of the memory burst */ - /* for INCR4, INCR8, INCR16 bursts */ - if (hdma->Init.MemBurst != DMA_MBURST_SINGLE) - { - if (DMA_CheckFifoParam(hdma) != HAL_OK) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_PARAM; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - return HAL_ERROR; - } - } - } - - /* Write to DMA Stream FCR */ - hdma->Instance->FCR = tmp; - - /* Initialize StreamBaseAddress and StreamIndex parameters to be used to calculate - DMA steam Base Address needed by HAL_DMA_IRQHandler() and HAL_DMA_PollForTransfer() */ - regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); - - /* Clear all interrupt flags */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Initialize the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the DMA peripheral - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma) -{ - DMA_Base_Registers *regs; - - /* Check the DMA peripheral state */ - if(hdma == NULL) - { - return HAL_ERROR; - } - - /* Check the DMA peripheral state */ - if(hdma->State == HAL_DMA_STATE_BUSY) - { - /* Return error status */ - return HAL_BUSY; - } - - /* Check the parameters */ - assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); - - /* Disable the selected DMA Streamx */ - __HAL_DMA_DISABLE(hdma); - - /* Reset DMA Streamx control register */ - hdma->Instance->CR = 0U; - - /* Reset DMA Streamx number of data to transfer register */ - hdma->Instance->NDTR = 0U; - - /* Reset DMA Streamx peripheral address register */ - hdma->Instance->PAR = 0U; - - /* Reset DMA Streamx memory 0 address register */ - hdma->Instance->M0AR = 0U; - - /* Reset DMA Streamx memory 1 address register */ - hdma->Instance->M1AR = 0U; - - /* Reset DMA Streamx FIFO control register */ - hdma->Instance->FCR = 0x00000021U; - - /* Get DMA steam Base Address */ - regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); - - /* Clean all callbacks */ - hdma->XferCpltCallback = NULL; - hdma->XferHalfCpltCallback = NULL; - hdma->XferM1CpltCallback = NULL; - hdma->XferM1HalfCpltCallback = NULL; - hdma->XferErrorCallback = NULL; - hdma->XferAbortCallback = NULL; - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Reset the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Reset the DMA state */ - hdma->State = HAL_DMA_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return HAL_OK; -} - -/** - * @} - */ - -/** @addtogroup DMA_Exported_Functions_Group2 - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the source, destination address and data length and Start DMA transfer - (+) Configure the source, destination address and data length and - Start DMA transfer with interrupt - (+) Abort DMA transfer - (+) Poll for transfer complete - (+) Handle DMA interrupt request - -@endverbatim - * @{ - */ - -/** - * @brief Starts the DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Configure the source, destination address and the data length */ - DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Enable the Peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - return status; -} - -/** - * @brief Start the DMA Transfer with interrupt enabled. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Configure the source, destination address and the data length */ - DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Enable Common interrupts*/ - hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; - - if(hdma->XferHalfCpltCallback != NULL) - { - hdma->Instance->CR |= DMA_IT_HT; - } - - /* Enable the Peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - - return status; -} - -/** - * @brief Aborts the DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * - * @note After disabling a DMA Stream, a check for wait until the DMA Stream is - * effectively disabled is added. If a Stream is disabled - * while a data transfer is ongoing, the current data will be transferred - * and the Stream will be effectively disabled only after the transfer of - * this single data is finished. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma) -{ - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - uint32_t tickstart = HAL_GetTick(); - - if(hdma->State != HAL_DMA_STATE_BUSY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_ERROR; - } - else - { - /* Disable all the transfer interrupts */ - hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); - hdma->Instance->FCR &= ~(DMA_IT_FE); - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - - /* Check if the DMA Stream is effectively disabled */ - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_TIMEOUT; - } - } - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Change the DMA state*/ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - } - return HAL_OK; -} - -/** - * @brief Aborts the DMA Transfer in Interrupt mode. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma) -{ - if(hdma->State != HAL_DMA_STATE_BUSY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - return HAL_ERROR; - } - else - { - /* Set Abort State */ - hdma->State = HAL_DMA_STATE_ABORT; - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - } - - return HAL_OK; -} - -/** - * @brief Polling for transfer complete. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CompleteLevel Specifies the DMA level complete. - * @note The polling mode is kept in this version for legacy. it is recommended to use the IT model instead. - * This model could be used for debug purpose. - * @note The HAL_DMA_PollForTransfer API cannot be used in circular and double buffering mode (automatic circular mode). - * @param Timeout Timeout duration. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t mask_cpltlevel; - uint32_t tickstart = HAL_GetTick(); - uint32_t tmpisr; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs; - - if(HAL_DMA_STATE_BUSY != hdma->State) - { - /* No transfer ongoing */ - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - __HAL_UNLOCK(hdma); - return HAL_ERROR; - } - - /* Polling mode not supported in circular mode and double buffering mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != RESET) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - return HAL_ERROR; - } - - /* Get the level transfer complete flag */ - if(CompleteLevel == HAL_DMA_FULL_TRANSFER) - { - /* Transfer Complete flag */ - mask_cpltlevel = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; - } - else - { - /* Half Transfer Complete flag */ - mask_cpltlevel = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; - } - - regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - tmpisr = regs->ISR; - - while(((tmpisr & mask_cpltlevel) == RESET) && ((hdma->ErrorCode & HAL_DMA_ERROR_TE) == RESET)) - { - /* Check for the Timeout (Not applicable in circular mode)*/ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_TIMEOUT; - } - } - - /* Get the ISR register value */ - tmpisr = regs->ISR; - - if((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_TE; - - /* Clear the transfer error flag */ - regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; - } - - if((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_FE; - - /* Clear the FIFO error flag */ - regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; - } - - if((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_DME; - - /* Clear the Direct Mode error flag */ - regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; - } - } - - if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) - { - if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) - { - HAL_DMA_Abort(hdma); - - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; - - /* Change the DMA state */ - hdma->State= HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_ERROR; - } - } - - /* Get the level transfer complete flag */ - if(CompleteLevel == HAL_DMA_FULL_TRANSFER) - { - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; - - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - } - else - { - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4) << hdma->StreamIndex; - } - - return status; -} - -/** - * @brief Handles DMA interrupt request. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval None - */ -void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) -{ - uint32_t tmpisr; - __IO uint32_t count = 0U; - uint32_t timeout = SystemCoreClock / 9600U; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - tmpisr = regs->ISR; - - /* Transfer Error Interrupt management ***************************************/ - if ((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != RESET) - { - /* Disable the transfer error interrupt */ - hdma->Instance->CR &= ~(DMA_IT_TE); - - /* Clear the transfer error flag */ - regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_TE; - } - } - /* FIFO Error Interrupt management ******************************************/ - if ((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_FE) != RESET) - { - /* Clear the FIFO error flag */ - regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_FE; - } - } - /* Direct Mode Error Interrupt management ***********************************/ - if ((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_DME) != RESET) - { - /* Clear the direct mode error flag */ - regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_DME; - } - } - /* Half Transfer Complete Interrupt management ******************************/ - if ((tmpisr & (DMA_FLAG_HTIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != RESET) - { - /* Clear the half transfer complete flag */ - regs->IFCR = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; - - /* Multi_Buffering mode enabled */ - if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) - { - /* Current memory buffer used is Memory 0 */ - if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) - { - if(hdma->XferHalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferHalfCpltCallback(hdma); - } - } - /* Current memory buffer used is Memory 1 */ - else - { - if(hdma->XferM1HalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferM1HalfCpltCallback(hdma); - } - } - } - else - { - /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */ - if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) - { - /* Disable the half transfer interrupt */ - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - if(hdma->XferHalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferHalfCpltCallback(hdma); - } - } - } - } - /* Transfer Complete Interrupt management ***********************************/ - if ((tmpisr & (DMA_FLAG_TCIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != RESET) - { - /* Clear the transfer complete flag */ - regs->IFCR = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; - - if(HAL_DMA_STATE_ABORT == hdma->State) - { - /* Disable all the transfer interrupts */ - hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); - hdma->Instance->FCR &= ~(DMA_IT_FE); - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - if(hdma->XferAbortCallback != NULL) - { - hdma->XferAbortCallback(hdma); - } - return; - } - - if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) - { - /* Current memory buffer used is Memory 0 */ - if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) - { - if(hdma->XferM1CpltCallback != NULL) - { - /* Transfer complete Callback for memory1 */ - hdma->XferM1CpltCallback(hdma); - } - } - /* Current memory buffer used is Memory 1 */ - else - { - if(hdma->XferCpltCallback != NULL) - { - /* Transfer complete Callback for memory0 */ - hdma->XferCpltCallback(hdma); - } - } - } - /* Disable the transfer complete interrupt if the DMA mode is not CIRCULAR */ - else - { - if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) - { - /* Disable the transfer complete interrupt */ - hdma->Instance->CR &= ~(DMA_IT_TC); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - } - - if(hdma->XferCpltCallback != NULL) - { - /* Transfer complete callback */ - hdma->XferCpltCallback(hdma); - } - } - } - } - - /* manage error case */ - if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) - { - if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) - { - hdma->State = HAL_DMA_STATE_ABORT; - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - - do - { - if (++count > timeout) - { - break; - } - } - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - } - - if(hdma->XferErrorCallback != NULL) - { - /* Transfer error callback */ - hdma->XferErrorCallback(hdma); - } - } -} - -/** - * @brief Register callbacks - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CallbackID User Callback identifier - * a DMA_HandleTypeDef structure as parameter. - * @param pCallback pointer to private callback function which has pointer to - * a DMA_HandleTypeDef structure as parameter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)) -{ - - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - switch (CallbackID) - { - case HAL_DMA_XFER_CPLT_CB_ID: - hdma->XferCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_HALFCPLT_CB_ID: - hdma->XferHalfCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_M1CPLT_CB_ID: - hdma->XferM1CpltCallback = pCallback; - break; - - case HAL_DMA_XFER_M1HALFCPLT_CB_ID: - hdma->XferM1HalfCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_ERROR_CB_ID: - hdma->XferErrorCallback = pCallback; - break; - - case HAL_DMA_XFER_ABORT_CB_ID: - hdma->XferAbortCallback = pCallback; - break; - - default: - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return status; -} - -/** - * @brief UnRegister callbacks - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CallbackID User Callback identifier - * a HAL_DMA_CallbackIDTypeDef ENUM as parameter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - switch (CallbackID) - { - case HAL_DMA_XFER_CPLT_CB_ID: - hdma->XferCpltCallback = NULL; - break; - - case HAL_DMA_XFER_HALFCPLT_CB_ID: - hdma->XferHalfCpltCallback = NULL; - break; - - case HAL_DMA_XFER_M1CPLT_CB_ID: - hdma->XferM1CpltCallback = NULL; - break; - - case HAL_DMA_XFER_M1HALFCPLT_CB_ID: - hdma->XferM1HalfCpltCallback = NULL; - break; - - case HAL_DMA_XFER_ERROR_CB_ID: - hdma->XferErrorCallback = NULL; - break; - - case HAL_DMA_XFER_ABORT_CB_ID: - hdma->XferAbortCallback = NULL; - break; - - case HAL_DMA_XFER_ALL_CB_ID: - hdma->XferCpltCallback = NULL; - hdma->XferHalfCpltCallback = NULL; - hdma->XferM1CpltCallback = NULL; - hdma->XferM1HalfCpltCallback = NULL; - hdma->XferErrorCallback = NULL; - hdma->XferAbortCallback = NULL; - break; - - default: - status = HAL_ERROR; - break; - } - } - else - { - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return status; -} - -/** - * @} - */ - -/** @addtogroup DMA_Exported_Functions_Group3 - * -@verbatim - =============================================================================== - ##### State and Errors functions ##### - =============================================================================== - [..] - This subsection provides functions allowing to - (+) Check the DMA state - (+) Get error code - -@endverbatim - * @{ - */ - -/** - * @brief Returns the DMA state. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL state - */ -HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma) -{ - return hdma->State; -} - -/** - * @brief Return the DMA error code - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval DMA Error Code - */ -uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma) -{ - return hdma->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup DMA_Private_Functions - * @{ - */ - -/** - * @brief Sets the DMA Transfer parameter. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - /* Clear DBM bit */ - hdma->Instance->CR &= (uint32_t)(~DMA_SxCR_DBM); - - /* Configure DMA Stream data length */ - hdma->Instance->NDTR = DataLength; - - /* Memory to Peripheral */ - if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) - { - /* Configure DMA Stream destination address */ - hdma->Instance->PAR = DstAddress; - - /* Configure DMA Stream source address */ - hdma->Instance->M0AR = SrcAddress; - } - /* Peripheral to Memory */ - else - { - /* Configure DMA Stream source address */ - hdma->Instance->PAR = SrcAddress; - - /* Configure DMA Stream destination address */ - hdma->Instance->M0AR = DstAddress; - } -} - -/** - * @brief Returns the DMA Stream base address depending on stream number - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval Stream base address - */ -static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma) -{ - uint32_t stream_number = (((uint32_t)hdma->Instance & 0xFFU) - 16U) / 24U; - - /* lookup table for necessary bitshift of flags within status registers */ - static const uint8_t flagBitshiftOffset[8U] = {0U, 6U, 16U, 22U, 0U, 6U, 16U, 22U}; - hdma->StreamIndex = flagBitshiftOffset[stream_number]; - - if (stream_number > 3U) - { - /* return pointer to HISR and HIFCR */ - hdma->StreamBaseAddress = (((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)) + 4U); - } - else - { - /* return pointer to LISR and LIFCR */ - hdma->StreamBaseAddress = ((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)); - } - - return hdma->StreamBaseAddress; -} - -/** - * @brief Check compatibility between FIFO threshold level and size of the memory burst - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmp = hdma->Init.FIFOThreshold; - - /* Memory Data size equal to Byte */ - if(hdma->Init.MemDataAlignment == DMA_MDATAALIGN_BYTE) - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_HALFFULL: - if (hdma->Init.MemBurst == DMA_MBURST_INC16) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_FULL: - break; - default: - break; - } - } - - /* Memory Data size equal to Half-Word */ - else if (hdma->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - status = HAL_ERROR; - break; - case DMA_FIFO_THRESHOLD_HALFFULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_FULL: - if (hdma->Init.MemBurst == DMA_MBURST_INC16) - { - status = HAL_ERROR; - } - break; - default: - break; - } - } - - /* Memory Data size equal to Word */ - else - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_HALFFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - status = HAL_ERROR; - break; - case DMA_FIFO_THRESHOLD_FULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - default: - break; - } - } - - return status; -} - -/** - * @} - */ - -#endif /* HAL_DMA_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c deleted file mode 100644 index 7167e77..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c +++ /dev/null @@ -1,313 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma_ex.c - * @author MCD Application Team - * @brief DMA Extension HAL module driver - * This file provides firmware functions to manage the following - * functionalities of the DMA Extension peripheral: - * + Extended features functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The DMA Extension HAL driver can be used as follows: - (#) Start a multi buffer transfer using the HAL_DMA_MultiBufferStart() function - for polling mode or HAL_DMA_MultiBufferStart_IT() for interrupt mode. - - -@- In Memory-to-Memory transfer mode, Multi (Double) Buffer mode is not allowed. - -@- When Multi (Double) Buffer mode is enabled the, transfer is circular by default. - -@- In Multi (Double) buffer mode, it is possible to update the base address for - the AHB memory port on the fly (DMA_SxM0AR or DMA_SxM1AR) when the stream is enabled. - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup DMAEx DMAEx - * @brief DMA Extended HAL module driver - * @{ - */ - -#ifdef HAL_DMA_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private Constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup DMAEx_Private_Functions - * @{ - */ -static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -/** - * @} - */ - -/* Exported functions ---------------------------------------------------------*/ - -/** @addtogroup DMAEx_Exported_Functions - * @{ - */ - - -/** @addtogroup DMAEx_Exported_Functions_Group1 - * -@verbatim - =============================================================================== - ##### Extended features functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the source, destination address and data length and - Start MultiBuffer DMA transfer - (+) Configure the source, destination address and data length and - Start MultiBuffer DMA transfer with interrupt - (+) Change on the fly the memory0 or memory1 address. - -@endverbatim - * @{ - */ - - -/** - * @brief Starts the multi_buffer DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Memory-to-memory transfer not supported in double buffering mode */ - if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - status = HAL_ERROR; - } - else - { - /* Process Locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Enable the double buffer mode */ - hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; - - /* Configure DMA Stream destination address */ - hdma->Instance->M1AR = SecondMemAddress; - - /* Configure the source, destination address and the data length */ - DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Enable the peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Return error status */ - status = HAL_BUSY; - } - } - return status; -} - -/** - * @brief Starts the multi_buffer DMA Transfer with interrupt enabled. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Memory-to-memory transfer not supported in double buffering mode */ - if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - return HAL_ERROR; - } - - /* Check callback functions */ - if ((NULL == hdma->XferCpltCallback) || (NULL == hdma->XferM1CpltCallback) || (NULL == hdma->XferErrorCallback)) - { - hdma->ErrorCode = HAL_DMA_ERROR_PARAM; - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Enable the Double buffer mode */ - hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; - - /* Configure DMA Stream destination address */ - hdma->Instance->M1AR = SecondMemAddress; - - /* Configure the source, destination address and the data length */ - DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Clear all flags */ - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_DME_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_FE_FLAG_INDEX(hdma)); - - /* Enable Common interrupts*/ - hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; - hdma->Instance->FCR |= DMA_IT_FE; - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR |= DMA_IT_HT; - } - - /* Enable the peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - return status; -} - -/** - * @brief Change the memory0 or memory1 address on the fly. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param Address The new address - * @param memory the memory to be changed, This parameter can be one of - * the following values: - * MEMORY0 / - * MEMORY1 - * @note The MEMORY0 address can be changed only when the current transfer use - * MEMORY1 and the MEMORY1 address can be changed only when the current - * transfer use MEMORY0. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory) -{ - if(memory == MEMORY0) - { - /* change the memory0 address */ - hdma->Instance->M0AR = Address; - } - else - { - /* change the memory1 address */ - hdma->Instance->M1AR = Address; - } - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup DMAEx_Private_Functions - * @{ - */ - -/** - * @brief Set the DMA Transfer parameter. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - /* Configure DMA Stream data length */ - hdma->Instance->NDTR = DataLength; - - /* Peripheral to Memory */ - if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) - { - /* Configure DMA Stream destination address */ - hdma->Instance->PAR = DstAddress; - - /* Configure DMA Stream source address */ - hdma->Instance->M0AR = SrcAddress; - } - /* Memory to Peripheral */ - else - { - /* Configure DMA Stream source address */ - hdma->Instance->PAR = SrcAddress; - - /* Configure DMA Stream destination address */ - hdma->Instance->M0AR = DstAddress; - } -} - -/** - * @} - */ - -#endif /* HAL_DMA_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c deleted file mode 100644 index 3e46312..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c +++ /dev/null @@ -1,553 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_exti.c - * @author MCD Application Team - * @brief EXTI HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Extended Interrupts and events controller (EXTI) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2018 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### EXTI Peripheral features ##### - ============================================================================== - [..] - (+) Each Exti line can be configured within this driver. - - (+) Exti line can be configured in 3 different modes - (++) Interrupt - (++) Event - (++) Both of them - - (+) Configurable Exti lines can be configured with 3 different triggers - (++) Rising - (++) Falling - (++) Both of them - - (+) When set in interrupt mode, configurable Exti lines have two different - interrupts pending registers which allow to distinguish which transition - occurs: - (++) Rising edge pending interrupt - (++) Falling - - (+) Exti lines 0 to 15 are linked to gpio pin number 0 to 15. Gpio port can - be selected through multiplexer. - - ##### How to use this driver ##### - ============================================================================== - [..] - - (#) Configure the EXTI line using HAL_EXTI_SetConfigLine(). - (++) Choose the interrupt line number by setting "Line" member from - EXTI_ConfigTypeDef structure. - (++) Configure the interrupt and/or event mode using "Mode" member from - EXTI_ConfigTypeDef structure. - (++) For configurable lines, configure rising and/or falling trigger - "Trigger" member from EXTI_ConfigTypeDef structure. - (++) For Exti lines linked to gpio, choose gpio port using "GPIOSel" - member from GPIO_InitTypeDef structure. - - (#) Get current Exti configuration of a dedicated line using - HAL_EXTI_GetConfigLine(). - (++) Provide exiting handle as parameter. - (++) Provide pointer on EXTI_ConfigTypeDef structure as second parameter. - - (#) Clear Exti configuration of a dedicated line using HAL_EXTI_ClearConfigLine(). - (++) Provide exiting handle as parameter. - - (#) Register callback to treat Exti interrupts using HAL_EXTI_RegisterCallback(). - (++) Provide exiting handle as first parameter. - (++) Provide which callback will be registered using one value from - EXTI_CallbackIDTypeDef. - (++) Provide callback function pointer. - - (#) Get interrupt pending bit using HAL_EXTI_GetPending(). - - (#) Clear interrupt pending bit using HAL_EXTI_ClearPending(). - - (#) Generate software interrupt using HAL_EXTI_GenerateSWI(). - - @endverbatim - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup EXTI - * @{ - */ -/** MISRA C:2012 deviation rule has been granted for following rule: - * Rule-18.1_b - Medium: Array `EXTICR' 1st subscript interval [0,7] may be out - * of bounds [0,3] in following API : - * HAL_EXTI_SetConfigLine - * HAL_EXTI_GetConfigLine - * HAL_EXTI_ClearConfigLine - */ - -#ifdef HAL_EXTI_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private defines -----------------------------------------------------------*/ -/** @defgroup EXTI_Private_Constants EXTI Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @addtogroup EXTI_Exported_Functions - * @{ - */ - -/** @addtogroup EXTI_Exported_Functions_Group1 - * @brief Configuration functions - * -@verbatim - =============================================================================== - ##### Configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Set configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @param pExtiConfig Pointer on EXTI configuration to be set. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if ((hexti == NULL) || (pExtiConfig == NULL)) - { - return HAL_ERROR; - } - - /* Check parameters */ - assert_param(IS_EXTI_LINE(pExtiConfig->Line)); - assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); - - /* Assign line number to handle */ - hexti->Line = pExtiConfig->Line; - - /* Compute line mask */ - linepos = (pExtiConfig->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* Configure triggers for configurable lines */ - if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) - { - assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); - - /* Configure rising trigger */ - /* Mask or set line */ - if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) - { - EXTI->RTSR |= maskline; - } - else - { - EXTI->RTSR &= ~maskline; - } - - /* Configure falling trigger */ - /* Mask or set line */ - if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) - { - EXTI->FTSR |= maskline; - } - else - { - EXTI->FTSR &= ~maskline; - } - - - /* Configure gpio port selection in case of gpio exti line */ - if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - SYSCFG->EXTICR[linepos >> 2u] = regval; - } - } - - /* Configure interrupt mode : read current mode */ - /* Mask or set line */ - if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) - { - EXTI->IMR |= maskline; - } - else - { - EXTI->IMR &= ~maskline; - } - - /* Configure event mode : read current mode */ - /* Mask or set line */ - if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) - { - EXTI->EMR |= maskline; - } - else - { - EXTI->EMR &= ~maskline; - } - - return HAL_OK; -} - -/** - * @brief Get configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @param pExtiConfig Pointer on structure to store Exti configuration. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if ((hexti == NULL) || (pExtiConfig == NULL)) - { - return HAL_ERROR; - } - - /* Check the parameter */ - assert_param(IS_EXTI_LINE(hexti->Line)); - - /* Store handle line number to configuration structure */ - pExtiConfig->Line = hexti->Line; - - /* Compute line mask */ - linepos = (pExtiConfig->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* 1] Get core mode : interrupt */ - - /* Check if selected line is enable */ - if ((EXTI->IMR & maskline) != 0x00u) - { - pExtiConfig->Mode = EXTI_MODE_INTERRUPT; - } - else - { - pExtiConfig->Mode = EXTI_MODE_NONE; - } - - /* Get event mode */ - /* Check if selected line is enable */ - if ((EXTI->EMR & maskline) != 0x00u) - { - pExtiConfig->Mode |= EXTI_MODE_EVENT; - } - - /* Get default Trigger and GPIOSel configuration */ - pExtiConfig->Trigger = EXTI_TRIGGER_NONE; - pExtiConfig->GPIOSel = 0x00u; - - /* 2] Get trigger for configurable lines : rising */ - if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) - { - /* Check if configuration of selected line is enable */ - if ((EXTI->RTSR & maskline) != 0x00u) - { - pExtiConfig->Trigger = EXTI_TRIGGER_RISING; - } - - /* Get falling configuration */ - /* Check if configuration of selected line is enable */ - if ((EXTI->FTSR & maskline) != 0x00u) - { - pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; - } - - /* Get Gpio port selection for gpio lines */ - if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - pExtiConfig->GPIOSel = (regval >> (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))) & SYSCFG_EXTICR1_EXTI0; - } - } - - return HAL_OK; -} - -/** - * @brief Clear whole configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if (hexti == NULL) - { - return HAL_ERROR; - } - - /* Check the parameter */ - assert_param(IS_EXTI_LINE(hexti->Line)); - - /* compute line mask */ - linepos = (hexti->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* 1] Clear interrupt mode */ - EXTI->IMR = (EXTI->IMR & ~maskline); - - /* 2] Clear event mode */ - EXTI->EMR = (EXTI->EMR & ~maskline); - - /* 3] Clear triggers in case of configurable lines */ - if ((hexti->Line & EXTI_CONFIG) != 0x00u) - { - EXTI->RTSR = (EXTI->RTSR & ~maskline); - EXTI->FTSR = (EXTI->FTSR & ~maskline); - - /* Get Gpio port selection for gpio lines */ - if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - SYSCFG->EXTICR[linepos >> 2u] = regval; - } - } - - return HAL_OK; -} - -/** - * @brief Register callback for a dedicated Exti line. - * @param hexti Exti handle. - * @param CallbackID User callback identifier. - * This parameter can be one of @arg @ref EXTI_CallbackIDTypeDef values. - * @param pPendingCbfn function pointer to be stored as callback. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)) -{ - HAL_StatusTypeDef status = HAL_OK; - - switch (CallbackID) - { - case HAL_EXTI_COMMON_CB_ID: - hexti->PendingCallback = pPendingCbfn; - break; - - default: - status = HAL_ERROR; - break; - } - - return status; -} - -/** - * @brief Store line number as handle private field. - * @param hexti Exti handle. - * @param ExtiLine Exti line number. - * This parameter can be from 0 to @ref EXTI_LINE_NB. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(ExtiLine)); - - /* Check null pointer */ - if (hexti == NULL) - { - return HAL_ERROR; - } - else - { - /* Store line number as handle private field */ - hexti->Line = ExtiLine; - - return HAL_OK; - } -} - -/** - * @} - */ - -/** @addtogroup EXTI_Exported_Functions_Group2 - * @brief EXTI IO functions. - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Handle EXTI interrupt request. - * @param hexti Exti handle. - * @retval none. - */ -void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) -{ - uint32_t regval; - uint32_t maskline; - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Get pending bit */ - regval = (EXTI->PR & maskline); - if (regval != 0x00u) - { - /* Clear pending bit */ - EXTI->PR = maskline; - - /* Call callback */ - if (hexti->PendingCallback != NULL) - { - hexti->PendingCallback(); - } - } -} - -/** - * @brief Get interrupt pending bit of a dedicated line. - * @param hexti Exti handle. - * @param Edge Specify which pending edge as to be checked. - * This parameter can be one of the following values: - * @arg @ref EXTI_TRIGGER_RISING_FALLING - * This parameter is kept for compatibility with other series. - * @retval 1 if interrupt is pending else 0. - */ -uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Prevent unused argument(s) compilation warning */ - UNUSED(Edge); - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - assert_param(IS_EXTI_PENDING_EDGE(Edge)); - - /* Compute line mask */ - linepos = (hexti->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* return 1 if bit is set else 0 */ - regval = ((EXTI->PR & maskline) >> linepos); - return regval; -} - -/** - * @brief Clear interrupt pending bit of a dedicated line. - * @param hexti Exti handle. - * @param Edge Specify which pending edge as to be clear. - * This parameter can be one of the following values: - * @arg @ref EXTI_TRIGGER_RISING_FALLING - * This parameter is kept for compatibility with other series. - * @retval None. - */ -void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) -{ - uint32_t maskline; - - /* Prevent unused argument(s) compilation warning */ - UNUSED(Edge); - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - assert_param(IS_EXTI_PENDING_EDGE(Edge)); - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Clear Pending bit */ - EXTI->PR = maskline; -} - -/** - * @brief Generate a software interrupt for a dedicated line. - * @param hexti Exti handle. - * @retval None. - */ -void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) -{ - uint32_t maskline; - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Generate Software interrupt */ - EXTI->SWIER = maskline; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_EXTI_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c deleted file mode 100644 index 39f19f2..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c +++ /dev/null @@ -1,769 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash.c - * @author MCD Application Team - * @brief FLASH HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the internal FLASH memory: - * + Program operations functions - * + Memory Control functions - * + Peripheral Errors functions - * - @verbatim - ============================================================================== - ##### FLASH peripheral features ##### - ============================================================================== - - [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses - to the Flash memory. It implements the erase and program Flash memory operations - and the read and write protection mechanisms. - - [..] The Flash memory interface accelerates code execution with a system of instruction - prefetch and cache lines. - - [..] The FLASH main features are: - (+) Flash memory read operations - (+) Flash memory program/erase operations - (+) Read / write protections - (+) Prefetch on I-Code - (+) 64 cache lines of 128 bits on I-Code - (+) 8 cache lines of 128 bits on D-Code - - - ##### How to use this driver ##### - ============================================================================== - [..] - This driver provides functions and macros to configure and program the FLASH - memory of all STM32F4xx devices. - - (#) FLASH Memory IO Programming functions: - (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and - HAL_FLASH_Lock() functions - (++) Program functions: byte, half word, word and double word - (++) There Two modes of programming : - (+++) Polling mode using HAL_FLASH_Program() function - (+++) Interrupt mode using HAL_FLASH_Program_IT() function - - (#) Interrupts and flags management functions : - (++) Handle FLASH interrupts by calling HAL_FLASH_IRQHandler() - (++) Wait for last FLASH operation according to its status - (++) Get error flag status by calling HAL_SetErrorCode() - - [..] - In addition to these functions, this driver includes a set of macros allowing - to handle the following operations: - (+) Set the latency - (+) Enable/Disable the prefetch buffer - (+) Enable/Disable the Instruction cache and the Data cache - (+) Reset the Instruction cache and the Data cache - (+) Enable/Disable the FLASH interrupts - (+) Monitor the FLASH flags status - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASH FLASH - * @brief FLASH HAL module driver - * @{ - */ - -#ifdef HAL_FLASH_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup FLASH_Private_Constants - * @{ - */ -#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup FLASH_Private_Variables - * @{ - */ -/* Variable used for Erase sectors under interruption */ -FLASH_ProcessTypeDef pFlash; -/** - * @} - */ - -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup FLASH_Private_Functions - * @{ - */ -/* Program operations */ -static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data); -static void FLASH_Program_Word(uint32_t Address, uint32_t Data); -static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data); -static void FLASH_Program_Byte(uint32_t Address, uint8_t Data); -static void FLASH_SetErrorCode(void); - -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Functions FLASH Exported Functions - * @{ - */ - -/** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions - * @brief Programming operation functions - * -@verbatim - =============================================================================== - ##### Programming operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the FLASH - program operations. - -@endverbatim - * @{ - */ - -/** - * @brief Program byte, halfword, word or double word at a specified address - * @param TypeProgram Indicate the way to program at a specified address. - * This parameter can be a value of @ref FLASH_Type_Program - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed - * - * @retval HAL_StatusTypeDef HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if (TypeProgram == FLASH_TYPEPROGRAM_BYTE) - { - /*Program byte (8-bit) at a specified address.*/ - FLASH_Program_Byte(Address, (uint8_t) Data); - } - else if (TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) - { - /*Program halfword (16-bit) at a specified address.*/ - FLASH_Program_HalfWord(Address, (uint16_t) Data); - } - else if (TypeProgram == FLASH_TYPEPROGRAM_WORD) - { - /*Program word (32-bit) at a specified address.*/ - FLASH_Program_Word(Address, (uint32_t) Data); - } - else - { - /*Program double word (64-bit) at a specified address.*/ - FLASH_Program_DoubleWord(Address, Data); - } - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* If the program operation is completed, disable the PG Bit */ - FLASH->CR &= (~FLASH_CR_PG); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Program byte, halfword, word or double word at a specified address with interrupt enabled. - * @param TypeProgram Indicate the way to program at a specified address. - * This parameter can be a value of @ref FLASH_Type_Program - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); - - /* Enable End of FLASH Operation interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); - - /* Enable Error source interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); - - pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM; - pFlash.Address = Address; - - if (TypeProgram == FLASH_TYPEPROGRAM_BYTE) - { - /*Program byte (8-bit) at a specified address.*/ - FLASH_Program_Byte(Address, (uint8_t) Data); - } - else if (TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) - { - /*Program halfword (16-bit) at a specified address.*/ - FLASH_Program_HalfWord(Address, (uint16_t) Data); - } - else if (TypeProgram == FLASH_TYPEPROGRAM_WORD) - { - /*Program word (32-bit) at a specified address.*/ - FLASH_Program_Word(Address, (uint32_t) Data); - } - else - { - /*Program double word (64-bit) at a specified address.*/ - FLASH_Program_DoubleWord(Address, Data); - } - - return status; -} - -/** - * @brief This function handles FLASH interrupt request. - * @retval None - */ -void HAL_FLASH_IRQHandler(void) -{ - uint32_t addresstmp = 0U; - - /* Check FLASH operation error flags */ -#if defined(FLASH_SR_RDERR) - if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) -#else - if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) -#endif /* FLASH_SR_RDERR */ - { - if (pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) - { - /*return the faulty sector*/ - addresstmp = pFlash.Sector; - pFlash.Sector = 0xFFFFFFFFU; - } - else if (pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) - { - /*return the faulty bank*/ - addresstmp = pFlash.Bank; - } - else - { - /*return the faulty address*/ - addresstmp = pFlash.Address; - } - - /*Save the Error code*/ - FLASH_SetErrorCode(); - - /* FLASH error interrupt user callback */ - HAL_FLASH_OperationErrorCallback(addresstmp); - - /*Stop the procedure ongoing*/ - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - } - - /* Check FLASH End of Operation flag */ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) - { - /* Clear FLASH End of Operation pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); - - if (pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) - { - /*Nb of sector to erased can be decreased*/ - pFlash.NbSectorsToErase--; - - /* Check if there are still sectors to erase*/ - if (pFlash.NbSectorsToErase != 0U) - { - addresstmp = pFlash.Sector; - /*Indicate user which sector has been erased*/ - HAL_FLASH_EndOfOperationCallback(addresstmp); - - /*Increment sector number*/ - pFlash.Sector++; - addresstmp = pFlash.Sector; - FLASH_Erase_Sector(addresstmp, pFlash.VoltageForErase); - } - else - { - /*No more sectors to Erase, user callback can be called.*/ - /*Reset Sector and stop Erase sectors procedure*/ - pFlash.Sector = addresstmp = 0xFFFFFFFFU; - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches(); - - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(addresstmp); - } - } - else - { - if (pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) - { - /* MassErase ended. Return the selected bank */ - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches(); - - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(pFlash.Bank); - } - else - { - /*Program ended. Return the selected address*/ - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(pFlash.Address); - } - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - } - } - - if (pFlash.ProcedureOnGoing == FLASH_PROC_NONE) - { - /* Operation is completed, disable the PG, SER, SNB and MER Bits */ - CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_SER | FLASH_CR_SNB | FLASH_MER_BIT)); - - /* Disable End of FLASH Operation interrupt */ - __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP); - - /* Disable Error source interrupt */ - __HAL_FLASH_DISABLE_IT(FLASH_IT_ERR); - } -} - -/** - * @brief FLASH end of operation interrupt callback - * @param ReturnValue The value saved in this parameter depends on the ongoing procedure - * Mass Erase: Bank number which has been requested to erase - * Sectors Erase: Sector which has been erased - * (if 0xFFFFFFFFU, it means that all the selected sectors have been erased) - * Program: Address which was selected for data program - * @retval None - */ -__weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(ReturnValue); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_FLASH_EndOfOperationCallback could be implemented in the user file - */ -} - -/** - * @brief FLASH operation error interrupt callback - * @param ReturnValue The value saved in this parameter depends on the ongoing procedure - * Mass Erase: Bank number which has been requested to erase - * Sectors Erase: Sector number which returned an error - * Program: Address which was selected for data program - * @retval None - */ -__weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(ReturnValue); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_FLASH_OperationErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions - * @brief management functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the FLASH - memory operations. - -@endverbatim - * @{ - */ - -/** - * @brief Unlock the FLASH control register access - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Unlock(void) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) - { - /* Authorize the FLASH Registers access */ - WRITE_REG(FLASH->KEYR, FLASH_KEY1); - WRITE_REG(FLASH->KEYR, FLASH_KEY2); - - /* Verify Flash is unlocked */ - if (READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) - { - status = HAL_ERROR; - } - } - - return status; -} - -/** - * @brief Locks the FLASH control register access - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Lock(void) -{ - /* Set the LOCK Bit to lock the FLASH Registers access */ - FLASH->CR |= FLASH_CR_LOCK; - - return HAL_OK; -} - -/** - * @brief Unlock the FLASH Option Control Registers access. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void) -{ - if ((FLASH->OPTCR & FLASH_OPTCR_OPTLOCK) != RESET) - { - /* Authorizes the Option Byte register programming */ - FLASH->OPTKEYR = FLASH_OPT_KEY1; - FLASH->OPTKEYR = FLASH_OPT_KEY2; - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Lock the FLASH Option Control Registers access. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Lock(void) -{ - /* Set the OPTLOCK Bit to lock the FLASH Option Byte Registers access */ - FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK; - - return HAL_OK; -} - -/** - * @brief Launch the option byte loading. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Launch(void) -{ - /* Set the OPTSTRT bit in OPTCR register */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT; - - /* Wait for last operation to be completed */ - return (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE)); -} - -/** - * @} - */ - -/** @defgroup FLASH_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief Peripheral Errors functions - * -@verbatim - =============================================================================== - ##### Peripheral Errors functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time Errors of the FLASH peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Get the specific FLASH error flag. - * @retval FLASH_ErrorCode: The returned value can be a combination of: - * @arg HAL_FLASH_ERROR_RD: FLASH Read Protection error flag (PCROP) - * @arg HAL_FLASH_ERROR_PGS: FLASH Programming Sequence error flag - * @arg HAL_FLASH_ERROR_PGP: FLASH Programming Parallelism error flag - * @arg HAL_FLASH_ERROR_PGA: FLASH Programming Alignment error flag - * @arg HAL_FLASH_ERROR_WRP: FLASH Write protected error flag - * @arg HAL_FLASH_ERROR_OPERATION: FLASH operation Error flag - */ -uint32_t HAL_FLASH_GetError(void) -{ - return pFlash.ErrorCode; -} - -/** - * @} - */ - -/** - * @brief Wait for a FLASH operation to complete. - * @param Timeout maximum flash operationtimeout - * @retval HAL Status - */ -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) -{ - uint32_t tickstart = 0U; - - /* Clear Error Code */ - pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; - - /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. - Even if the FLASH operation fails, the BUSY flag will be reset and an error - flag will be set */ - /* Get tick */ - tickstart = HAL_GetTick(); - - while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET) - { - if (Timeout != HAL_MAX_DELAY) - { - if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout)) - { - return HAL_TIMEOUT; - } - } - } - - /* Check FLASH End of Operation flag */ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) - { - /* Clear FLASH End of Operation pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); - } -#if defined(FLASH_SR_RDERR) - if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) -#else - if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) -#endif /* FLASH_SR_RDERR */ - { - /*Save the error code*/ - FLASH_SetErrorCode(); - return HAL_ERROR; - } - - /* If there is no error flag set */ - return HAL_OK; - -} - -/** - * @brief Program a double word (64-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.7V to 3.6V and Vpp in the range 7V to 9V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_DOUBLE_WORD; - FLASH->CR |= FLASH_CR_PG; - - /* Program first word */ - *(__IO uint32_t *)Address = (uint32_t)Data; - - /* Barrier to ensure programming is performed in 2 steps, in right order - (independently of compiler optimization behavior) */ - __ISB(); - - /* Program second word */ - *(__IO uint32_t *)(Address + 4) = (uint32_t)(Data >> 32); -} - - -/** - * @brief Program word (32-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.7V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_Word(uint32_t Address, uint32_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint32_t *)Address = Data; -} - -/** - * @brief Program a half-word (16-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.1V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_HALF_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint16_t *)Address = Data; -} - -/** - * @brief Program byte (8-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 1.8V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_Byte(uint32_t Address, uint8_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_BYTE; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint8_t *)Address = Data; -} - -/** - * @brief Set the specific FLASH error flag. - * @retval None - */ -static void FLASH_SetErrorCode(void) -{ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; - - /* Clear FLASH write protection error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR); - } - - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGA; - - /* Clear FLASH Programming alignment error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR); - } - - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGP; - - /* Clear FLASH Programming parallelism error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR); - } - - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGS; - - /* Clear FLASH Programming sequence error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR); - } -#if defined(FLASH_SR_RDERR) - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_RD; - - /* Clear FLASH Proprietary readout protection error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_RDERR); - } -#endif /* FLASH_SR_RDERR */ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_OPERATION; - - /* Clear FLASH Operation error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR); - } -} - -/** - * @} - */ - -#endif /* HAL_FLASH_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c deleted file mode 100644 index f919fea..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c +++ /dev/null @@ -1,1344 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ex.c - * @author MCD Application Team - * @brief Extended FLASH HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the FLASH extension peripheral: - * + Extended programming operations functions - * - @verbatim - ============================================================================== - ##### Flash Extension features ##### - ============================================================================== - - [..] Comparing to other previous devices, the FLASH interface for STM32F427xx/437xx and - STM32F429xx/439xx devices contains the following additional features - - (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write - capability (RWW) - (+) Dual bank memory organization - (+) PCROP protection for all banks - - ##### How to use this driver ##### - ============================================================================== - [..] This driver provides functions to configure and program the FLASH memory - of all STM32F427xx/437xx, STM32F429xx/439xx, STM32F469xx/479xx and STM32F446xx - devices. It includes - (#) FLASH Memory Erase functions: - (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and - HAL_FLASH_Lock() functions - (++) Erase function: Erase sector, erase all sectors - (++) There are two modes of erase : - (+++) Polling Mode using HAL_FLASHEx_Erase() - (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT() - - (#) Option Bytes Programming functions: Use HAL_FLASHEx_OBProgram() to : - (++) Set/Reset the write protection - (++) Set the Read protection Level - (++) Set the BOR level - (++) Program the user Option Bytes - (#) Advanced Option Bytes Programming functions: Use HAL_FLASHEx_AdvOBProgram() to : - (++) Extended space (bank 2) erase function - (++) Full FLASH space (2 Mo) erase (bank 1 and bank 2) - (++) Dual Boot activation - (++) Write protection configuration for bank 2 - (++) PCROP protection configuration and control for both banks - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASHEx FLASHEx - * @brief FLASH HAL Extension module driver - * @{ - */ - -#ifdef HAL_FLASH_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Constants - * @{ - */ -#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Variables - * @{ - */ -extern FLASH_ProcessTypeDef pFlash; -/** - * @} - */ - -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Functions - * @{ - */ -/* Option bytes control */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level); -static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby); -static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level); -static uint8_t FLASH_OB_GetUser(void); -static uint16_t FLASH_OB_GetWRP(void); -static uint8_t FLASH_OB_GetRDP(void); -static uint8_t FLASH_OB_GetBOR(void); - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector); -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions - * @{ - */ - -/** @defgroup FLASHEx_Exported_Functions_Group1 Extended IO operation functions - * @brief Extended IO operation functions - * -@verbatim - =============================================================================== - ##### Extended programming operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the Extension FLASH - programming operations. - -@endverbatim - * @{ - */ -/** - * @brief Perform a mass erase or erase the specified FLASH memory sectors - * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that - * contains the configuration information for the erasing. - * - * @param[out] SectorError pointer to variable that - * contains the configuration information on faulty sector in case of error - * (0xFFFFFFFFU means that all the sectors have been correctly erased) - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError) -{ - HAL_StatusTypeDef status = HAL_ERROR; - uint32_t index = 0U; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /*Initialization of SectorError variable*/ - *SectorError = 0xFFFFFFFFU; - - if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) - { - /*Mass erase to be done*/ - FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* if the erase operation is completed, disable the MER Bit */ - FLASH->CR &= (~FLASH_MER_BIT); - } - else - { - /* Check the parameters */ - assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); - - /* Erase by sector by sector to be done*/ - for (index = pEraseInit->Sector; index < (pEraseInit->NbSectors + pEraseInit->Sector); index++) - { - FLASH_Erase_Sector(index, (uint8_t) pEraseInit->VoltageRange); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* If the erase operation is completed, disable the SER and SNB Bits */ - CLEAR_BIT(FLASH->CR, (FLASH_CR_SER | FLASH_CR_SNB)); - - if (status != HAL_OK) - { - /* In case of error, stop erase procedure and return the faulty sector*/ - *SectorError = index; - break; - } - } - } - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches(); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Perform a mass erase or erase the specified FLASH memory sectors with interrupt enabled - * @param pEraseInit pointer to an FLASH_EraseInitTypeDef structure that - * contains the configuration information for the erasing. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); - - /* Enable End of FLASH Operation interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); - - /* Enable Error source interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); - - /* Clear pending flags (if any) */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \ - FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); - - if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) - { - /*Mass erase to be done*/ - pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE; - pFlash.Bank = pEraseInit->Banks; - FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); - } - else - { - /* Erase by sector to be done*/ - - /* Check the parameters */ - assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); - - pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE; - pFlash.NbSectorsToErase = pEraseInit->NbSectors; - pFlash.Sector = pEraseInit->Sector; - pFlash.VoltageForErase = (uint8_t)pEraseInit->VoltageRange; - - /*Erase 1st sector and wait for IT*/ - FLASH_Erase_Sector(pEraseInit->Sector, pEraseInit->VoltageRange); - } - - return status; -} - -/** - * @brief Program option bytes - * @param pOBInit pointer to an FLASH_OBInitStruct structure that - * contains the configuration information for the programming. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_OPTIONBYTE(pOBInit->OptionType)); - - /*Write protection configuration*/ - if ((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP) - { - assert_param(IS_WRPSTATE(pOBInit->WRPState)); - if (pOBInit->WRPState == OB_WRPSTATE_ENABLE) - { - /*Enable of Write protection on the selected Sector*/ - status = FLASH_OB_EnableWRP(pOBInit->WRPSector, pOBInit->Banks); - } - else - { - /*Disable of Write protection on the selected Sector*/ - status = FLASH_OB_DisableWRP(pOBInit->WRPSector, pOBInit->Banks); - } - } - - /*Read protection configuration*/ - if ((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP) - { - status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel); - } - - /*USER configuration*/ - if ((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER) - { - status = FLASH_OB_UserConfig(pOBInit->USERConfig & OB_IWDG_SW, - pOBInit->USERConfig & OB_STOP_NO_RST, - pOBInit->USERConfig & OB_STDBY_NO_RST); - } - - /*BOR Level configuration*/ - if ((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR) - { - status = FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Get the Option byte configuration - * @param pOBInit pointer to an FLASH_OBInitStruct structure that - * contains the configuration information for the programming. - * - * @retval None - */ -void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit) -{ - pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_BOR; - - /*Get WRP*/ - pOBInit->WRPSector = (uint32_t)FLASH_OB_GetWRP(); - - /*Get RDP Level*/ - pOBInit->RDPLevel = (uint32_t)FLASH_OB_GetRDP(); - - /*Get USER*/ - pOBInit->USERConfig = (uint8_t)FLASH_OB_GetUser(); - - /*Get BOR Level*/ - pOBInit->BORLevel = (uint32_t)FLASH_OB_GetBOR(); -} - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Program option bytes - * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that - * contains the configuration information for the programming. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_AdvOBProgram(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Check the parameters */ - assert_param(IS_OBEX(pAdvOBInit->OptionType)); - - /*Program PCROP option byte*/ - if (((pAdvOBInit->OptionType) & OPTIONBYTE_PCROP) == OPTIONBYTE_PCROP) - { - /* Check the parameters */ - assert_param(IS_PCROPSTATE(pAdvOBInit->PCROPState)); - if ((pAdvOBInit->PCROPState) == OB_PCROP_STATE_ENABLE) - { - /*Enable of Write protection on the selected Sector*/ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - status = FLASH_OB_EnablePCROP(pAdvOBInit->Sectors); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - status = FLASH_OB_EnablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - } - else - { - /*Disable of Write protection on the selected Sector*/ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - status = FLASH_OB_DisablePCROP(pAdvOBInit->Sectors); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - status = FLASH_OB_DisablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - } - } - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - /*Program BOOT config option byte*/ - if (((pAdvOBInit->OptionType) & OPTIONBYTE_BOOTCONFIG) == OPTIONBYTE_BOOTCONFIG) - { - status = FLASH_OB_BootConfig(pAdvOBInit->BootConfig); - } -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - - return status; -} - -/** - * @brief Get the OBEX byte configuration - * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that - * contains the configuration information for the programming. - * - * @retval None - */ -void HAL_FLASHEx_AdvOBGetConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) -{ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - /*Get Sector*/ - pAdvOBInit->Sectors = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - /*Get Sector for Bank1*/ - pAdvOBInit->SectorsBank1 = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); - - /*Get Sector for Bank2*/ - pAdvOBInit->SectorsBank2 = (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); - - /*Get Boot config OB*/ - pAdvOBInit->BootConfig = *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS; -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ -} - -/** - * @brief Select the Protection Mode - * - * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted - * Global Read Out Protection modification (from level1 to level0) - * @note Once SPRMOD bit is active unprotection of a protected sector is not possible - * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ - * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void) -{ - uint8_t optiontmp = 0xFF; - - /* Mask SPRMOD bit */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); - - /* Update Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_SELECTED | optiontmp); - - return HAL_OK; -} - -/** - * @brief Deselect the Protection Mode - * - * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted - * Global Read Out Protection modification (from level1 to level0) - * @note Once SPRMOD bit is active unprotection of a protected sector is not possible - * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ - * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OB_DeSelectPCROP(void) -{ - uint8_t optiontmp = 0xFF; - - /* Mask SPRMOD bit */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); - - /* Update Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_DESELECTED | optiontmp); - - return HAL_OK; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx ||\ - STM32F411xE || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Returns the FLASH Write Protection Option Bytes value for Bank 2 - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx devices. - * @retval The FLASH Write Protection Option Bytes value - */ -uint16_t HAL_FLASHEx_OB_GetBank2WRP(void) -{ - /* Return the FLASH write protection Register value */ - return (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Full erase of FLASH memory sectors - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @param Banks Banks to be erased - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * @arg FLASH_BANK_2: Bank2 to be erased - * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased - * - * @retval HAL Status - */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) -{ - /* Check the parameters */ - assert_param(IS_VOLTAGERANGE(VoltageRange)); - assert_param(IS_FLASH_BANK(Banks)); - - /* if the previous operation is completed, proceed to erase all sectors */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - - if (Banks == FLASH_BANK_BOTH) - { - /* bank1 & bank2 will be erased*/ - FLASH->CR |= FLASH_MER_BIT; - } - else if (Banks == FLASH_BANK_1) - { - /*Only bank1 will be erased*/ - FLASH->CR |= FLASH_CR_MER1; - } - else - { - /*Only bank2 will be erased*/ - FLASH->CR |= FLASH_CR_MER2; - } - FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange << 8U); -} - -/** - * @brief Erase the specified FLASH memory sector - * @param Sector FLASH sector to erase - * The value of this parameter depend on device used within the same series - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @retval None - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) -{ - uint32_t tmp_psize = 0U; - - /* Check the parameters */ - assert_param(IS_FLASH_SECTOR(Sector)); - assert_param(IS_VOLTAGERANGE(VoltageRange)); - - if (VoltageRange == FLASH_VOLTAGE_RANGE_1) - { - tmp_psize = FLASH_PSIZE_BYTE; - } - else if (VoltageRange == FLASH_VOLTAGE_RANGE_2) - { - tmp_psize = FLASH_PSIZE_HALF_WORD; - } - else if (VoltageRange == FLASH_VOLTAGE_RANGE_3) - { - tmp_psize = FLASH_PSIZE_WORD; - } - else - { - tmp_psize = FLASH_PSIZE_DOUBLE_WORD; - } - - /* Need to add offset of 4 when sector higher than FLASH_SECTOR_11 */ - if (Sector > FLASH_SECTOR_11) - { - Sector += 4U; - } - /* If the previous operation is completed, proceed to erase the sector */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= tmp_psize; - CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); - FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); - FLASH->CR |= FLASH_CR_STRT; -} - -/** - * @brief Enable the write protection of the desired bank1 or bank 2 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * This parameter can be one of the following values: - * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 - * @arg OB_WRP_SECTOR_All - * @note BANK2 starts from OB_WRP_SECTOR_12 - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL FLASH State - */ -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if (((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || - (WRPSector < OB_WRP_SECTOR_12)) - { - if (WRPSector == OB_WRP_SECTOR_All) - { - /*Write protection on all sector of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~(WRPSector >> 12)); - } - else - { - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~WRPSector); - } - } - else - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector >> 12)); - } - - /*Write protection on all sector of BANK2*/ - if ((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) - { - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector >> 12)); - } - } - - } - return status; -} - -/** - * @brief Disable the write protection of the desired bank1 or bank 2 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * This parameter can be one of the following values: - * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 - * @arg OB_WRP_Sector_All - * @note BANK2 starts from OB_WRP_SECTOR_12 - * - * @param Banks Disable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * @arg FLASH_BANK_2: Bank2 to be erased - * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if (((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || - (WRPSector < OB_WRP_SECTOR_12)) - { - if (WRPSector == OB_WRP_SECTOR_All) - { - /*Write protection on all sector of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)(WRPSector >> 12); - } - else - { - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; - } - } - else - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector >> 12); - } - - /*Write protection on all sector of BANK2*/ - if ((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) - { - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector >> 12); - } - } - - } - - return status; -} - -/** - * @brief Configure the Dual Bank Boot. - * - * @note This function can be used only for STM32F42xxx/43xxx devices. - * - * @param BootConfig specifies the Dual Bank Boot Option byte. - * This parameter can be one of the following values: - * @arg OB_Dual_BootEnabled: Dual Bank Boot Enable - * @arg OB_Dual_BootDisabled: Dual Bank Boot Disabled - * @retval None - */ -static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_BOOT(BootConfig)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /* Set Dual Bank Boot */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BFB2); - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= BootConfig; - } - - return status; -} - -/** - * @brief Enable the read/write protection (PCROP) of the desired - * sectors of Bank 1 and/or Bank 2. - * @note This function can be used only for STM32F42xxx/43xxx devices. - * @param SectorBank1 Specifies the sector(s) to be read/write protected or unprotected for bank1. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 - * @arg OB_PCROP_SECTOR__All - * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 - * @arg OB_PCROP_SECTOR__All - * @param Banks Enable PCROP protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) - { - assert_param(IS_OB_PCROP(SectorBank1)); - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)SectorBank1; - } - else - { - assert_param(IS_OB_PCROP(SectorBank2)); - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; - } - - /*Write protection on all sector of BANK2*/ - if (Banks == FLASH_BANK_BOTH) - { - assert_param(IS_OB_PCROP(SectorBank2)); - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; - } - } - - } - - return status; -} - - -/** - * @brief Disable the read/write protection (PCROP) of the desired - * sectors of Bank 1 and/or Bank 2. - * @note This function can be used only for STM32F42xxx/43xxx devices. - * @param SectorBank1 specifies the sector(s) to be read/write protected or unprotected for bank1. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 - * @arg OB_PCROP_SECTOR__All - * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 - * @arg OB_PCROP_SECTOR__All - * @param Banks Disable PCROP protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) - { - assert_param(IS_OB_PCROP(SectorBank1)); - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~SectorBank1); - } - else - { - /*Write protection done on sectors of BANK2*/ - assert_param(IS_OB_PCROP(SectorBank2)); - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); - } - - /*Write protection on all sector of BANK2*/ - if (Banks == FLASH_BANK_BOTH) - { - assert_param(IS_OB_PCROP(SectorBank2)); - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); - } - } - - } - - return status; - -} - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -/** - * @brief Mass erase of FLASH memory - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @param Banks Banks to be erased - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * - * @retval None - */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) -{ - /* Check the parameters */ - assert_param(IS_VOLTAGERANGE(VoltageRange)); - assert_param(IS_FLASH_BANK(Banks)); - - /* If the previous operation is completed, proceed to erase all sectors */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_CR_MER; - FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange << 8U); -} - -/** - * @brief Erase the specified FLASH memory sector - * @param Sector FLASH sector to erase - * The value of this parameter depend on device used within the same series - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @retval None - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) -{ - uint32_t tmp_psize = 0U; - - /* Check the parameters */ - assert_param(IS_FLASH_SECTOR(Sector)); - assert_param(IS_VOLTAGERANGE(VoltageRange)); - - if (VoltageRange == FLASH_VOLTAGE_RANGE_1) - { - tmp_psize = FLASH_PSIZE_BYTE; - } - else if (VoltageRange == FLASH_VOLTAGE_RANGE_2) - { - tmp_psize = FLASH_PSIZE_HALF_WORD; - } - else if (VoltageRange == FLASH_VOLTAGE_RANGE_3) - { - tmp_psize = FLASH_PSIZE_WORD; - } - else - { - tmp_psize = FLASH_PSIZE_DOUBLE_WORD; - } - - /* If the previous operation is completed, proceed to erase the sector */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= tmp_psize; - CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); - FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); - FLASH->CR |= FLASH_CR_STRT; -} - -/** - * @brief Enable the write protection of the desired bank 1 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * The value of this parameter depend on device used within the same series - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~WRPSector); - } - - return status; -} - -/** - * @brief Disable the write protection of the desired bank 1 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * The value of this parameter depend on device used within the same series - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; - } - - return status; -} -#endif /* STM32F40xxx || STM32F41xxx || STM32F401xx || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Enable the read/write protection (PCROP) of the desired sectors. - * @note This function can be used only for STM32F401xx devices. - * @param Sector specifies the sector(s) to be read/write protected or unprotected. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 - * @arg OB_PCROP_Sector_All - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_PCROP(Sector)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)Sector; - } - - return status; -} - - -/** - * @brief Disable the read/write protection (PCROP) of the desired sectors. - * @note This function can be used only for STM32F401xx devices. - * @param Sector specifies the sector(s) to be read/write protected or unprotected. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 - * @arg OB_PCROP_Sector_All - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_PCROP(Sector)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~Sector); - } - - return status; - -} -#endif /* STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -/** - * @brief Set the read protection level. - * @param Level specifies the read protection level. - * This parameter can be one of the following values: - * @arg OB_RDP_LEVEL_0: No protection - * @arg OB_RDP_LEVEL_1: Read protection of the memory - * @arg OB_RDP_LEVEL_2: Full chip protection - * - * @note WARNING: When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_RDP_LEVEL(Level)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint8_t *)OPTCR_BYTE1_ADDRESS = Level; - } - - return status; -} - -/** - * @brief Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. - * @param Iwdg Selects the IWDG mode - * This parameter can be one of the following values: - * @arg OB_IWDG_SW: Software IWDG selected - * @arg OB_IWDG_HW: Hardware IWDG selected - * @param Stop Reset event when entering STOP mode. - * This parameter can be one of the following values: - * @arg OB_STOP_NO_RST: No reset generated when entering in STOP - * @arg OB_STOP_RST: Reset generated when entering in STOP - * @param Stdby Reset event when entering Standby mode. - * This parameter can be one of the following values: - * @arg OB_STDBY_NO_RST: No reset generated when entering in STANDBY - * @arg OB_STDBY_RST: Reset generated when entering in STANDBY - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby) -{ - uint8_t optiontmp = 0xFF; - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_IWDG_SOURCE(Iwdg)); - assert_param(IS_OB_STOP_SOURCE(Stop)); - assert_param(IS_OB_STDBY_SOURCE(Stdby)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /* Mask OPTLOCK, OPTSTRT, BOR_LEV and BFB2 bits */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS) & (uint8_t)0x1F); - - /* Update User Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS = Iwdg | (uint8_t)(Stdby | (uint8_t)(Stop | ((uint8_t)optiontmp))); - } - - return status; -} - -/** - * @brief Set the BOR Level. - * @param Level specifies the Option Bytes BOR Reset Level. - * This parameter can be one of the following values: - * @arg OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V - * @arg OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V - * @arg OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V - * @arg OB_BOR_OFF: Supply voltage ranges from 1.62 to 2.1 V - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level) -{ - /* Check the parameters */ - assert_param(IS_OB_BOR_LEVEL(Level)); - - /* Set the BOR Level */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BOR_LEV); - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= Level; - - return HAL_OK; - -} - -/** - * @brief Return the FLASH User Option Byte value. - * @retval uint8_t FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1) - * and RST_STDBY(Bit2). - */ -static uint8_t FLASH_OB_GetUser(void) -{ - /* Return the User Option Byte */ - return ((uint8_t)(FLASH->OPTCR & 0xE0)); -} - -/** - * @brief Return the FLASH Write Protection Option Bytes value. - * @retval uint16_t FLASH Write Protection Option Bytes value - */ -static uint16_t FLASH_OB_GetWRP(void) -{ - /* Return the FLASH write protection Register value */ - return (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); -} - -/** - * @brief Returns the FLASH Read Protection level. - * @retval FLASH ReadOut Protection Status: - * This parameter can be one of the following values: - * @arg OB_RDP_LEVEL_0: No protection - * @arg OB_RDP_LEVEL_1: Read protection of the memory - * @arg OB_RDP_LEVEL_2: Full chip protection - */ -static uint8_t FLASH_OB_GetRDP(void) -{ - uint8_t readstatus = OB_RDP_LEVEL_0; - - if (*(__IO uint8_t *)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_2) - { - readstatus = OB_RDP_LEVEL_2; - } - else if (*(__IO uint8_t *)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_0) - { - readstatus = OB_RDP_LEVEL_0; - } - else - { - readstatus = OB_RDP_LEVEL_1; - } - - return readstatus; -} - -/** - * @brief Returns the FLASH BOR level. - * @retval uint8_t The FLASH BOR level: - * - OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V - * - OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V - * - OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V - * - OB_BOR_OFF : Supply voltage ranges from 1.62 to 2.1 V - */ -static uint8_t FLASH_OB_GetBOR(void) -{ - /* Return the FLASH BOR level */ - return (uint8_t)(*(__IO uint8_t *)(OPTCR_BYTE0_ADDRESS) & (uint8_t)0x0C); -} - -/** - * @brief Flush the instruction and data caches - * @retval None - */ -void FLASH_FlushCaches(void) -{ - /* Flush instruction cache */ - if (READ_BIT(FLASH->ACR, FLASH_ACR_ICEN) != RESET) - { - /* Disable instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_DISABLE(); - /* Reset instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_RESET(); - /* Enable instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); - } - - /* Flush data cache */ - if (READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != RESET) - { - /* Disable data cache */ - __HAL_FLASH_DATA_CACHE_DISABLE(); - /* Reset data cache */ - __HAL_FLASH_DATA_CACHE_RESET(); - /* Enable data cache */ - __HAL_FLASH_DATA_CACHE_ENABLE(); - } -} - -/** - * @} - */ - -#endif /* HAL_FLASH_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c deleted file mode 100644 index e6ab3ac..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c +++ /dev/null @@ -1,172 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ramfunc.c - * @author MCD Application Team - * @brief FLASH RAMFUNC module driver. - * This file provides a FLASH firmware functions which should be - * executed from internal SRAM - * + Stop/Start the flash interface while System Run - * + Enable/Disable the flash sleep while System Run - @verbatim - ============================================================================== - ##### APIs executed from Internal RAM ##### - ============================================================================== - [..] - *** ARM Compiler *** - -------------------- - [..] RAM functions are defined using the toolchain options. - Functions that are be executed in RAM should reside in a separate - source module. Using the 'Options for File' dialog you can simply change - the 'Code / Const' area of a module to a memory space in physical RAM. - Available memory areas are declared in the 'Target' tab of the - Options for Target' dialog. - - *** ICCARM Compiler *** - ----------------------- - [..] RAM functions are defined using a specific toolchain keyword "__ramfunc". - - *** GNU Compiler *** - -------------------- - [..] RAM functions are defined using a specific toolchain attribute - "__attribute__((section(".RamFunc")))". - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASH_RAMFUNC FLASH RAMFUNC - * @brief FLASH functions executed from RAM - * @{ - */ -#ifdef HAL_FLASH_MODULE_ENABLED -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASH_RAMFUNC_Exported_Functions FLASH RAMFUNC Exported Functions - * @{ - */ - -/** @defgroup FLASH_RAMFUNC_Exported_Functions_Group1 Peripheral features functions executed from internal RAM - * @brief Peripheral Extended features functions - * -@verbatim - - =============================================================================== - ##### ramfunc functions ##### - =============================================================================== - [..] - This subsection provides a set of functions that should be executed from RAM - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Stop the flash interface while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Stop the flash interface while System Run */ - SET_BIT(PWR->CR, PWR_CR_FISSR); - - return HAL_OK; -} - -/** - * @brief Start the flash interface while System Run - * @note This mode is only available for STM32F411xx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Start the flash interface while System Run */ - CLEAR_BIT(PWR->CR, PWR_CR_FISSR); - - return HAL_OK; -} - -/** - * @brief Enable the flash sleep while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode could n't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Enable the flash sleep while System Run */ - SET_BIT(PWR->CR, PWR_CR_FMSSR); - - return HAL_OK; -} - -/** - * @brief Disable the flash sleep while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Disable the flash sleep while System Run */ - CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#endif /* HAL_FLASH_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c deleted file mode 100644 index b3ce9bb..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c +++ /dev/null @@ -1,533 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio.c - * @author MCD Application Team - * @brief GPIO HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the General Purpose Input/Output (GPIO) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### GPIO Peripheral features ##### - ============================================================================== - [..] - Subject to the specific hardware characteristics of each I/O port listed in the datasheet, each - port bit of the General Purpose IO (GPIO) Ports, can be individually configured by software - in several modes: - (+) Input mode - (+) Analog mode - (+) Output mode - (+) Alternate function mode - (+) External interrupt/event lines - - [..] - During and just after reset, the alternate functions and external interrupt - lines are not active and the I/O ports are configured in input floating mode. - - [..] - All GPIO pins have weak internal pull-up and pull-down resistors, which can be - activated or not. - - [..] - In Output or Alternate mode, each IO can be configured on open-drain or push-pull - type and the IO speed can be selected depending on the VDD value. - - [..] - All ports have external interrupt/event capability. To use external interrupt - lines, the port must be configured in input mode. All available GPIO pins are - connected to the 16 external interrupt/event lines from EXTI0 to EXTI15. - - [..] - The external interrupt/event controller consists of up to 23 edge detectors - (16 lines are connected to GPIO) for generating event/interrupt requests (each - input line can be independently configured to select the type (interrupt or event) - and the corresponding trigger event (rising or falling or both). Each line can - also be masked independently. - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Enable the GPIO AHB clock using the following function: __HAL_RCC_GPIOx_CLK_ENABLE(). - - (#) Configure the GPIO pin(s) using HAL_GPIO_Init(). - (++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure - (++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef - structure. - (++) In case of Output or alternate function mode selection: the speed is - configured through "Speed" member from GPIO_InitTypeDef structure. - (++) In alternate mode is selection, the alternate function connected to the IO - is configured through "Alternate" member from GPIO_InitTypeDef structure. - (++) Analog mode is required when a pin is to be used as ADC channel - or DAC output. - (++) In case of external interrupt/event selection the "Mode" member from - GPIO_InitTypeDef structure select the type (interrupt or event) and - the corresponding trigger event (rising or falling or both). - - (#) In case of external interrupt/event mode selection, configure NVIC IRQ priority - mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using - HAL_NVIC_EnableIRQ(). - - (#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin(). - - (#) To set/reset the level of a pin configured in output mode use - HAL_GPIO_WritePin()/HAL_GPIO_TogglePin(). - - (#) To lock pin configuration until next reset use HAL_GPIO_LockPin(). - - - (#) During and just after reset, the alternate functions are not - active and the GPIO pins are configured in input floating mode (except JTAG - pins). - - (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose - (PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has - priority over the GPIO function. - - (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as - general purpose PH0 and PH1, respectively, when the HSE oscillator is off. - The HSE has priority over the GPIO function. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup GPIO GPIO - * @brief GPIO HAL module driver - * @{ - */ - -#ifdef HAL_GPIO_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup GPIO_Private_Constants GPIO Private Constants - * @{ - */ - -#define GPIO_NUMBER 16U -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Functions GPIO Exported Functions - * @{ - */ - -/** @defgroup GPIO_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to initialize and de-initialize the GPIOs - to be ready for use. - -@endverbatim - * @{ - */ - - -/** - * @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Init pointer to a GPIO_InitTypeDef structure that contains - * the configuration information for the specified GPIO peripheral. - * @retval None - */ -void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) -{ - uint32_t position; - uint32_t ioposition = 0x00U; - uint32_t iocurrent = 0x00U; - uint32_t temp = 0x00U; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); - assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); - - /* Configure the port pins */ - for(position = 0U; position < GPIO_NUMBER; position++) - { - /* Get the IO position */ - ioposition = 0x01U << position; - /* Get the current IO position */ - iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; - - if(iocurrent == ioposition) - { - /*--------------------- GPIO Mode Configuration ------------------------*/ - /* In case of Output or Alternate function mode selection */ - if(((GPIO_Init->Mode & GPIO_MODE) == MODE_OUTPUT) || \ - (GPIO_Init->Mode & GPIO_MODE) == MODE_AF) - { - /* Check the Speed parameter */ - assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); - /* Configure the IO Speed */ - temp = GPIOx->OSPEEDR; - temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); - temp |= (GPIO_Init->Speed << (position * 2U)); - GPIOx->OSPEEDR = temp; - - /* Configure the IO Output Type */ - temp = GPIOx->OTYPER; - temp &= ~(GPIO_OTYPER_OT_0 << position) ; - temp |= (((GPIO_Init->Mode & OUTPUT_TYPE) >> OUTPUT_TYPE_Pos) << position); - GPIOx->OTYPER = temp; - } - - if((GPIO_Init->Mode & GPIO_MODE) != MODE_ANALOG) - { - /* Check the parameters */ - assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); - - /* Activate the Pull-up or Pull down resistor for the current IO */ - temp = GPIOx->PUPDR; - temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); - temp |= ((GPIO_Init->Pull) << (position * 2U)); - GPIOx->PUPDR = temp; - } - - /* In case of Alternate function mode selection */ - if((GPIO_Init->Mode & GPIO_MODE) == MODE_AF) - { - /* Check the Alternate function parameter */ - assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); - /* Configure Alternate function mapped with the current IO */ - temp = GPIOx->AFR[position >> 3U]; - temp &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & 0x07U) * 4U)); - GPIOx->AFR[position >> 3U] = temp; - } - - /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ - temp = GPIOx->MODER; - temp &= ~(GPIO_MODER_MODER0 << (position * 2U)); - temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U)); - GPIOx->MODER = temp; - - /*--------------------- EXTI Mode Configuration ------------------------*/ - /* Configure the External Interrupt or event for the current IO */ - if((GPIO_Init->Mode & EXTI_MODE) != 0x00U) - { - /* Enable SYSCFG Clock */ - __HAL_RCC_SYSCFG_CLK_ENABLE(); - - temp = SYSCFG->EXTICR[position >> 2U]; - temp &= ~(0x0FU << (4U * (position & 0x03U))); - temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U))); - SYSCFG->EXTICR[position >> 2U] = temp; - - /* Clear Rising Falling edge configuration */ - temp = EXTI->RTSR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & TRIGGER_RISING) != 0x00U) - { - temp |= iocurrent; - } - EXTI->RTSR = temp; - - temp = EXTI->FTSR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & TRIGGER_FALLING) != 0x00U) - { - temp |= iocurrent; - } - EXTI->FTSR = temp; - - temp = EXTI->EMR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & EXTI_EVT) != 0x00U) - { - temp |= iocurrent; - } - EXTI->EMR = temp; - - /* Clear EXTI line configuration */ - temp = EXTI->IMR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & EXTI_IT) != 0x00U) - { - temp |= iocurrent; - } - EXTI->IMR = temp; - } - } - } -} - -/** - * @brief De-initializes the GPIOx peripheral registers to their default reset values. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to be written. - * This parameter can be one of GPIO_PIN_x where x can be (0..15). - * @retval None - */ -void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) -{ - uint32_t position; - uint32_t ioposition = 0x00U; - uint32_t iocurrent = 0x00U; - uint32_t tmp = 0x00U; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - - /* Configure the port pins */ - for(position = 0U; position < GPIO_NUMBER; position++) - { - /* Get the IO position */ - ioposition = 0x01U << position; - /* Get the current IO position */ - iocurrent = (GPIO_Pin) & ioposition; - - if(iocurrent == ioposition) - { - /*------------------------- EXTI Mode Configuration --------------------*/ - tmp = SYSCFG->EXTICR[position >> 2U]; - tmp &= (0x0FU << (4U * (position & 0x03U))); - if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U)))) - { - /* Clear EXTI line configuration */ - EXTI->IMR &= ~((uint32_t)iocurrent); - EXTI->EMR &= ~((uint32_t)iocurrent); - - /* Clear Rising Falling edge configuration */ - EXTI->FTSR &= ~((uint32_t)iocurrent); - EXTI->RTSR &= ~((uint32_t)iocurrent); - - /* Configure the External Interrupt or event for the current IO */ - tmp = 0x0FU << (4U * (position & 0x03U)); - SYSCFG->EXTICR[position >> 2U] &= ~tmp; - } - - /*------------------------- GPIO Mode Configuration --------------------*/ - /* Configure IO Direction in Input Floating Mode */ - GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2U)); - - /* Configure the default Alternate Function in current IO */ - GPIOx->AFR[position >> 3U] &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; - - /* Deactivate the Pull-up and Pull-down resistor for the current IO */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); - - /* Configure the default value IO Output Type */ - GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; - - /* Configure the default value for IO Speed */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); - } - } -} - -/** - * @} - */ - -/** @defgroup GPIO_Exported_Functions_Group2 IO operation functions - * @brief GPIO Read and Write - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Reads the specified input port pin. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to read. - * This parameter can be GPIO_PIN_x where x can be (0..15). - * @retval The input port pin value. - */ -GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - GPIO_PinState bitstatus; - - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET) - { - bitstatus = GPIO_PIN_SET; - } - else - { - bitstatus = GPIO_PIN_RESET; - } - return bitstatus; -} - -/** - * @brief Sets or clears the selected data port bit. - * - * @note This function uses GPIOx_BSRR register to allow atomic read/modify - * accesses. In this way, there is no risk of an IRQ occurring between - * the read and the modify access. - * - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to be written. - * This parameter can be one of GPIO_PIN_x where x can be (0..15). - * @param PinState specifies the value to be written to the selected bit. - * This parameter can be one of the GPIO_PinState enum values: - * @arg GPIO_PIN_RESET: to clear the port pin - * @arg GPIO_PIN_SET: to set the port pin - * @retval None - */ -void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) -{ - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - assert_param(IS_GPIO_PIN_ACTION(PinState)); - - if(PinState != GPIO_PIN_RESET) - { - GPIOx->BSRR = GPIO_Pin; - } - else - { - GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; - } -} - -/** - * @brief Toggles the specified GPIO pins. - * @param GPIOx Where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin Specifies the pins to be toggled. - * @retval None - */ -void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - uint32_t odr; - - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - /* get current Output Data Register value */ - odr = GPIOx->ODR; - - /* Set selected pins that were at low level, and reset ones that were high */ - GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin); -} - -/** - * @brief Locks GPIO Pins configuration registers. - * @note The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, - * GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. - * @note The configuration of the locked GPIO pins can no longer be modified - * until the next reset. - * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F4 family - * @param GPIO_Pin specifies the port bit to be locked. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15). - * @retval None - */ -HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - __IO uint32_t tmp = GPIO_LCKR_LCKK; - - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - /* Apply lock key write sequence */ - tmp |= GPIO_Pin; - /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ - GPIOx->LCKR = tmp; - /* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */ - GPIOx->LCKR = GPIO_Pin; - /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ - GPIOx->LCKR = tmp; - /* Read LCKR register. This read is mandatory to complete key lock sequence */ - tmp = GPIOx->LCKR; - - /* Read again in order to confirm lock is active */ - if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) - { - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief This function handles EXTI interrupt request. - * @param GPIO_Pin Specifies the pins connected EXTI line - * @retval None - */ -void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) -{ - /* EXTI line interrupt detected */ - if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) - { - __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); - HAL_GPIO_EXTI_Callback(GPIO_Pin); - } -} - -/** - * @brief EXTI line detection callbacks. - * @param GPIO_Pin Specifies the pins connected EXTI line - * @retval None - */ -__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(GPIO_Pin); - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_GPIO_EXTI_Callback could be implemented in the user file - */ -} - -/** - * @} - */ - - -/** - * @} - */ - -#endif /* HAL_GPIO_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c deleted file mode 100644 index dce9ab1..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c +++ /dev/null @@ -1,7571 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_i2c.c - * @author MCD Application Team - * @brief I2C HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Inter Integrated Circuit (I2C) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral State, Mode and Error functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The I2C HAL driver can be used as follows: - - (#) Declare a I2C_HandleTypeDef handle structure, for example: - I2C_HandleTypeDef hi2c; - - (#)Initialize the I2C low level resources by implementing the HAL_I2C_MspInit() API: - (##) Enable the I2Cx interface clock - (##) I2C pins configuration - (+++) Enable the clock for the I2C GPIOs - (+++) Configure I2C pins as alternate function open-drain - (##) NVIC configuration if you need to use interrupt process - (+++) Configure the I2Cx interrupt priority - (+++) Enable the NVIC I2C IRQ Channel - (##) DMA Configuration if you need to use DMA process - (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive stream - (+++) Enable the DMAx interface clock using - (+++) Configure the DMA handle parameters - (+++) Configure the DMA Tx or Rx stream - (+++) Associate the initialized DMA handle to the hi2c DMA Tx or Rx handle - (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on - the DMA Tx or Rx stream - - (#) Configure the Communication Speed, Duty cycle, Addressing mode, Own Address1, - Dual Addressing mode, Own Address2, General call and Nostretch mode in the hi2c Init structure. - - (#) Initialize the I2C registers by calling the HAL_I2C_Init(), configures also the low level Hardware - (GPIO, CLOCK, NVIC...etc) by calling the customized HAL_I2C_MspInit() API. - - (#) To check if target device is ready for communication, use the function HAL_I2C_IsDeviceReady() - - (#) For I2C IO and IO MEM operations, three operation modes are available within this driver : - - *** Polling mode IO operation *** - ================================= - [..] - (+) Transmit in master mode an amount of data in blocking mode using HAL_I2C_Master_Transmit() - (+) Receive in master mode an amount of data in blocking mode using HAL_I2C_Master_Receive() - (+) Transmit in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Transmit() - (+) Receive in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Receive() - - *** Polling mode IO MEM operation *** - ===================================== - [..] - (+) Write an amount of data in blocking mode to a specific memory address using HAL_I2C_Mem_Write() - (+) Read an amount of data in blocking mode from a specific memory address using HAL_I2C_Mem_Read() - - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Transmit in master mode an amount of data in non-blocking mode using HAL_I2C_Master_Transmit_IT() - (+) At transmission end of transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() - (+) Receive in master mode an amount of data in non-blocking mode using HAL_I2C_Master_Receive_IT() - (+) At reception end of transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() - (+) Transmit in slave mode an amount of data in non-blocking mode using HAL_I2C_Slave_Transmit_IT() - (+) At transmission end of transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() - (+) Receive in slave mode an amount of data in non-blocking mode using HAL_I2C_Slave_Receive_IT() - (+) At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - (+) Abort a master or memory I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() - (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_AbortCpltCallback() - - *** Interrupt mode or DMA mode IO sequential operation *** - ========================================================== - [..] - (@) These interfaces allow to manage a sequential transfer with a repeated start condition - when a direction change during transfer - [..] - (+) A specific option field manage the different steps of a sequential transfer - (+) Option field values are defined through I2C_XferOptions_definition and are listed below: - (++) I2C_FIRST_AND_LAST_FRAME: No sequential usage, functional is same as associated interfaces in no sequential mode - (++) I2C_FIRST_FRAME: Sequential usage, this option allow to manage a sequence with start condition, address - and data to transfer without a final stop condition - (++) I2C_FIRST_AND_NEXT_FRAME: Sequential usage (Master only), this option allow to manage a sequence with start condition, address - and data to transfer without a final stop condition, an then permit a call the same master sequential interface - several times (like HAL_I2C_Master_Seq_Transmit_IT() then HAL_I2C_Master_Seq_Transmit_IT() - or HAL_I2C_Master_Seq_Transmit_DMA() then HAL_I2C_Master_Seq_Transmit_DMA()) - (++) I2C_NEXT_FRAME: Sequential usage, this option allow to manage a sequence with a restart condition, address - and with new data to transfer if the direction change or manage only the new data to transfer - if no direction change and without a final stop condition in both cases - (++) I2C_LAST_FRAME: Sequential usage, this option allow to manage a sequance with a restart condition, address - and with new data to transfer if the direction change or manage only the new data to transfer - if no direction change and with a final stop condition in both cases - (++) I2C_LAST_FRAME_NO_STOP: Sequential usage (Master only), this option allow to manage a restart condition after several call of the same master sequential - interface several times (link with option I2C_FIRST_AND_NEXT_FRAME). - Usage can, transfer several bytes one by one using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) - or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) - or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) - or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME). - Then usage of this option I2C_LAST_FRAME_NO_STOP at the last Transmit or Receive sequence permit to call the opposite interface Receive or Transmit - without stopping the communication and so generate a restart condition. - (++) I2C_OTHER_FRAME: Sequential usage (Master only), this option allow to manage a restart condition after each call of the same master sequential - interface. - Usage can, transfer several bytes one by one with a restart with slave address between each bytes using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) - or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) - or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) - or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME). - Then usage of this option I2C_OTHER_AND_LAST_FRAME at the last frame to help automatic generation of STOP condition. - - (+) Different sequential I2C interfaces are listed below: - (++) Sequential transmit in master I2C mode an amount of data in non-blocking mode using HAL_I2C_Master_Seq_Transmit_IT() - or using HAL_I2C_Master_Seq_Transmit_DMA() - (+++) At transmission end of current frame transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() - (++) Sequential receive in master I2C mode an amount of data in non-blocking mode using HAL_I2C_Master_Seq_Receive_IT() - or using HAL_I2C_Master_Seq_Receive_DMA() - (+++) At reception end of current frame transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() - (++) Abort a master or memory IT or DMA I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() - (+++) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_AbortCpltCallback() - (++) Enable/disable the Address listen mode in slave I2C mode using HAL_I2C_EnableListen_IT() HAL_I2C_DisableListen_IT() - (+++) When address slave I2C match, HAL_I2C_AddrCallback() is executed and user can - add his own code to check the Address Match Code and the transmission direction request by master (Write/Read). - (+++) At Listen mode end HAL_I2C_ListenCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_ListenCpltCallback() - (++) Sequential transmit in slave I2C mode an amount of data in non-blocking mode using HAL_I2C_Slave_Seq_Transmit_IT() - or using HAL_I2C_Slave_Seq_Transmit_DMA() - (+++) At transmission end of current frame transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() - (++) Sequential receive in slave I2C mode an amount of data in non-blocking mode using HAL_I2C_Slave_Seq_Receive_IT() - or using HAL_I2C_Slave_Seq_Receive_DMA() - (+++) At reception end of current frame transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() - (++) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - - *** Interrupt mode IO MEM operation *** - ======================================= - [..] - (+) Write an amount of data in non-blocking mode with Interrupt to a specific memory address using - HAL_I2C_Mem_Write_IT() - (+) At Memory end of write transfer, HAL_I2C_MemTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback() - (+) Read an amount of data in non-blocking mode with Interrupt from a specific memory address using - HAL_I2C_Mem_Read_IT() - (+) At Memory end of read transfer, HAL_I2C_MemRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback() - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - - *** DMA mode IO operation *** - ============================== - [..] - (+) Transmit in master mode an amount of data in non-blocking mode (DMA) using - HAL_I2C_Master_Transmit_DMA() - (+) At transmission end of transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() - (+) Receive in master mode an amount of data in non-blocking mode (DMA) using - HAL_I2C_Master_Receive_DMA() - (+) At reception end of transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() - (+) Transmit in slave mode an amount of data in non-blocking mode (DMA) using - HAL_I2C_Slave_Transmit_DMA() - (+) At transmission end of transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() - (+) Receive in slave mode an amount of data in non-blocking mode (DMA) using - HAL_I2C_Slave_Receive_DMA() - (+) At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - (+) Abort a master or memory I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() - (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_AbortCpltCallback() - - *** DMA mode IO MEM operation *** - ================================= - [..] - (+) Write an amount of data in non-blocking mode with DMA to a specific memory address using - HAL_I2C_Mem_Write_DMA() - (+) At Memory end of write transfer, HAL_I2C_MemTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback() - (+) Read an amount of data in non-blocking mode with DMA from a specific memory address using - HAL_I2C_Mem_Read_DMA() - (+) At Memory end of read transfer, HAL_I2C_MemRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback() - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - - - *** I2C HAL driver macros list *** - ================================== - [..] - Below the list of most used macros in I2C HAL driver. - - (+) __HAL_I2C_ENABLE: Enable the I2C peripheral - (+) __HAL_I2C_DISABLE: Disable the I2C peripheral - (+) __HAL_I2C_GET_FLAG: Checks whether the specified I2C flag is set or not - (+) __HAL_I2C_CLEAR_FLAG: Clear the specified I2C pending flag - (+) __HAL_I2C_ENABLE_IT: Enable the specified I2C interrupt - (+) __HAL_I2C_DISABLE_IT: Disable the specified I2C interrupt - - *** Callback registration *** - ============================================= - [..] - The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - Use Functions HAL_I2C_RegisterCallback() or HAL_I2C_RegisterAddrCallback() - to register an interrupt callback. - [..] - Function HAL_I2C_RegisterCallback() allows to register following callbacks: - (+) MasterTxCpltCallback : callback for Master transmission end of transfer. - (+) MasterRxCpltCallback : callback for Master reception end of transfer. - (+) SlaveTxCpltCallback : callback for Slave transmission end of transfer. - (+) SlaveRxCpltCallback : callback for Slave reception end of transfer. - (+) ListenCpltCallback : callback for end of listen mode. - (+) MemTxCpltCallback : callback for Memory transmission end of transfer. - (+) MemRxCpltCallback : callback for Memory reception end of transfer. - (+) ErrorCallback : callback for error detection. - (+) AbortCpltCallback : callback for abort completion process. - (+) MspInitCallback : callback for Msp Init. - (+) MspDeInitCallback : callback for Msp DeInit. - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - [..] - For specific callback AddrCallback use dedicated register callbacks : HAL_I2C_RegisterAddrCallback(). - [..] - Use function HAL_I2C_UnRegisterCallback to reset a callback to the default - weak function. - HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle, - and the Callback ID. - This function allows to reset following callbacks: - (+) MasterTxCpltCallback : callback for Master transmission end of transfer. - (+) MasterRxCpltCallback : callback for Master reception end of transfer. - (+) SlaveTxCpltCallback : callback for Slave transmission end of transfer. - (+) SlaveRxCpltCallback : callback for Slave reception end of transfer. - (+) ListenCpltCallback : callback for end of listen mode. - (+) MemTxCpltCallback : callback for Memory transmission end of transfer. - (+) MemRxCpltCallback : callback for Memory reception end of transfer. - (+) ErrorCallback : callback for error detection. - (+) AbortCpltCallback : callback for abort completion process. - (+) MspInitCallback : callback for Msp Init. - (+) MspDeInitCallback : callback for Msp DeInit. - [..] - For callback AddrCallback use dedicated register callbacks : HAL_I2C_UnRegisterAddrCallback(). - [..] - By default, after the HAL_I2C_Init() and when the state is HAL_I2C_STATE_RESET - all callbacks are set to the corresponding weak functions: - examples HAL_I2C_MasterTxCpltCallback(), HAL_I2C_MasterRxCpltCallback(). - Exception done for MspInit and MspDeInit functions that are - reset to the legacy weak functions in the HAL_I2C_Init()/ HAL_I2C_DeInit() only when - these callbacks are null (not registered beforehand). - If MspInit or MspDeInit are not null, the HAL_I2C_Init()/ HAL_I2C_DeInit() - keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - [..] - Callbacks can be registered/unregistered in HAL_I2C_STATE_READY state only. - Exception done MspInit/MspDeInit functions that can be registered/unregistered - in HAL_I2C_STATE_READY or HAL_I2C_STATE_RESET state, - thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. - Then, the user first registers the MspInit/MspDeInit user callbacks - using HAL_I2C_RegisterCallback() before calling HAL_I2C_DeInit() - or HAL_I2C_Init() function. - [..] - When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available and all callbacks - are set to the corresponding weak functions. - - - - [..] - (@) You can refer to the I2C HAL driver header file for more useful macros - - @endverbatim - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup I2C I2C - * @brief I2C HAL module driver - * @{ - */ - -#ifdef HAL_I2C_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @defgroup I2C_Private_Define I2C Private Define - * @{ - */ -#define I2C_TIMEOUT_FLAG 35U /*!< Timeout 35 ms */ -#define I2C_TIMEOUT_BUSY_FLAG 25U /*!< Timeout 25 ms */ -#define I2C_TIMEOUT_STOP_FLAG 5U /*!< Timeout 5 ms */ -#define I2C_NO_OPTION_FRAME 0xFFFF0000U /*!< XferOptions default value */ - -/* Private define for @ref PreviousState usage */ -#define I2C_STATE_MSK ((uint32_t)((uint32_t)((uint32_t)HAL_I2C_STATE_BUSY_TX | (uint32_t)HAL_I2C_STATE_BUSY_RX) & (uint32_t)(~((uint32_t)HAL_I2C_STATE_READY)))) /*!< Mask State define, keep only RX and TX bits */ -#define I2C_STATE_NONE ((uint32_t)(HAL_I2C_MODE_NONE)) /*!< Default Value */ -#define I2C_STATE_MASTER_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER)) /*!< Master Busy TX, combinaison of State LSB and Mode enum */ -#define I2C_STATE_MASTER_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER)) /*!< Master Busy RX, combinaison of State LSB and Mode enum */ -#define I2C_STATE_SLAVE_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE)) /*!< Slave Busy TX, combinaison of State LSB and Mode enum */ -#define I2C_STATE_SLAVE_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE)) /*!< Slave Busy RX, combinaison of State LSB and Mode enum */ - -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/** @addtogroup I2C_Private_Macros - * @{ - */ -/* Macro to get remaining data to transfer on DMA side */ -#define I2C_GET_DMA_REMAIN_DATA(__HANDLE__) __HAL_DMA_GET_COUNTER(__HANDLE__) -/** - * @} - */ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ - -/** @defgroup I2C_Private_Functions I2C Private Functions - * @{ - */ -/* Private functions to handle DMA transfer */ -static void I2C_DMAXferCplt(DMA_HandleTypeDef *hdma); -static void I2C_DMAError(DMA_HandleTypeDef *hdma); -static void I2C_DMAAbort(DMA_HandleTypeDef *hdma); - -static void I2C_ITError(I2C_HandleTypeDef *hi2c); - -static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart); - -/* Private functions to handle flags during polling transfer */ -static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnSTOPRequestThroughIT(I2C_HandleTypeDef *hi2c); -static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c); - -/* Private functions for I2C transfer IRQ handler */ -static void I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c); -static void I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c); -static void I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c); -static void I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c); -static void I2C_Master_SB(I2C_HandleTypeDef *hi2c); -static void I2C_Master_ADD10(I2C_HandleTypeDef *hi2c); -static void I2C_Master_ADDR(I2C_HandleTypeDef *hi2c); - -static void I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c); -static void I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c); -static void I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c); -static void I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c); -static void I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c, uint32_t IT2Flags); -static void I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c); -static void I2C_Slave_AF(I2C_HandleTypeDef *hi2c); - -static void I2C_MemoryTransmit_TXE_BTF(I2C_HandleTypeDef *hi2c); - -/* Private function to Convert Specific options */ -static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c); - -/* Private function to flush DR register */ -static void I2C_Flush_DR(I2C_HandleTypeDef *hi2c); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup I2C_Exported_Functions I2C Exported Functions - * @{ - */ - -/** @defgroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - deinitialize the I2Cx peripheral: - - (+) User must Implement HAL_I2C_MspInit() function in which he configures - all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC). - - (+) Call the function HAL_I2C_Init() to configure the selected device with - the selected configuration: - (++) Communication Speed - (++) Duty cycle - (++) Addressing mode - (++) Own Address 1 - (++) Dual Addressing mode - (++) Own Address 2 - (++) General call mode - (++) Nostretch mode - - (+) Call the function HAL_I2C_DeInit() to restore the default configuration - of the selected I2Cx peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the I2C according to the specified parameters - * in the I2C_InitTypeDef and initialize the associated handle. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c) -{ - uint32_t freqrange; - uint32_t pclk1; - - /* Check the I2C handle allocation */ - if (hi2c == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - assert_param(IS_I2C_CLOCK_SPEED(hi2c->Init.ClockSpeed)); - assert_param(IS_I2C_DUTY_CYCLE(hi2c->Init.DutyCycle)); - assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1)); - assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode)); - assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode)); - assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2)); - assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode)); - assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode)); - - if (hi2c->State == HAL_I2C_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hi2c->Lock = HAL_UNLOCKED; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - /* Init the I2C Callback settings */ - hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */ - hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */ - hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallback */ - hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallback */ - hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback; /* Legacy weak ListenCpltCallback */ - hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback; /* Legacy weak MemTxCpltCallback */ - hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback; /* Legacy weak MemRxCpltCallback */ - hi2c->ErrorCallback = HAL_I2C_ErrorCallback; /* Legacy weak ErrorCallback */ - hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - hi2c->AddrCallback = HAL_I2C_AddrCallback; /* Legacy weak AddrCallback */ - - if (hi2c->MspInitCallback == NULL) - { - hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit */ - } - - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - hi2c->MspInitCallback(hi2c); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - HAL_I2C_MspInit(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the selected I2C peripheral */ - __HAL_I2C_DISABLE(hi2c); - - /*Reset I2C*/ - hi2c->Instance->CR1 |= I2C_CR1_SWRST; - hi2c->Instance->CR1 &= ~I2C_CR1_SWRST; - - /* Get PCLK1 frequency */ - pclk1 = HAL_RCC_GetPCLK1Freq(); - - /* Check the minimum allowed PCLK1 frequency */ - if (I2C_MIN_PCLK_FREQ(pclk1, hi2c->Init.ClockSpeed) == 1U) - { - return HAL_ERROR; - } - - /* Calculate frequency range */ - freqrange = I2C_FREQRANGE(pclk1); - - /*---------------------------- I2Cx CR2 Configuration ----------------------*/ - /* Configure I2Cx: Frequency range */ - MODIFY_REG(hi2c->Instance->CR2, I2C_CR2_FREQ, freqrange); - - /*---------------------------- I2Cx TRISE Configuration --------------------*/ - /* Configure I2Cx: Rise Time */ - MODIFY_REG(hi2c->Instance->TRISE, I2C_TRISE_TRISE, I2C_RISE_TIME(freqrange, hi2c->Init.ClockSpeed)); - - /*---------------------------- I2Cx CCR Configuration ----------------------*/ - /* Configure I2Cx: Speed */ - MODIFY_REG(hi2c->Instance->CCR, (I2C_CCR_FS | I2C_CCR_DUTY | I2C_CCR_CCR), I2C_SPEED(pclk1, hi2c->Init.ClockSpeed, hi2c->Init.DutyCycle)); - - /*---------------------------- I2Cx CR1 Configuration ----------------------*/ - /* Configure I2Cx: Generalcall and NoStretch mode */ - MODIFY_REG(hi2c->Instance->CR1, (I2C_CR1_ENGC | I2C_CR1_NOSTRETCH), (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode)); - - /*---------------------------- I2Cx OAR1 Configuration ---------------------*/ - /* Configure I2Cx: Own Address1 and addressing mode */ - MODIFY_REG(hi2c->Instance->OAR1, (I2C_OAR1_ADDMODE | I2C_OAR1_ADD8_9 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD0), (hi2c->Init.AddressingMode | hi2c->Init.OwnAddress1)); - - /*---------------------------- I2Cx OAR2 Configuration ---------------------*/ - /* Configure I2Cx: Dual mode and Own Address2 */ - MODIFY_REG(hi2c->Instance->OAR2, (I2C_OAR2_ENDUAL | I2C_OAR2_ADD2), (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2)); - - /* Enable the selected I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->Mode = HAL_I2C_MODE_NONE; - - return HAL_OK; -} - -/** - * @brief DeInitialize the I2C peripheral. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c) -{ - /* Check the I2C handle allocation */ - if (hi2c == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the I2C Peripheral Clock */ - __HAL_I2C_DISABLE(hi2c); - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - if (hi2c->MspDeInitCallback == NULL) - { - hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit */ - } - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - hi2c->MspDeInitCallback(hi2c); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_I2C_MspDeInit(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - hi2c->State = HAL_I2C_STATE_RESET; - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; -} - -/** - * @brief Initialize the I2C MSP. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitialize the I2C MSP. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MspDeInit could be implemented in the user file - */ -} - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User I2C Callback - * To be used instead of the weak predefined callback - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID - * @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID - * @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID - * @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID - * @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID - * @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID - * @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID - * @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID - * @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID - * @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID - * @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID - * @param pCallback pointer to the Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hi2c); - - if (HAL_I2C_STATE_READY == hi2c->State) - { - switch (CallbackID) - { - case HAL_I2C_MASTER_TX_COMPLETE_CB_ID : - hi2c->MasterTxCpltCallback = pCallback; - break; - - case HAL_I2C_MASTER_RX_COMPLETE_CB_ID : - hi2c->MasterRxCpltCallback = pCallback; - break; - - case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID : - hi2c->SlaveTxCpltCallback = pCallback; - break; - - case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID : - hi2c->SlaveRxCpltCallback = pCallback; - break; - - case HAL_I2C_LISTEN_COMPLETE_CB_ID : - hi2c->ListenCpltCallback = pCallback; - break; - - case HAL_I2C_MEM_TX_COMPLETE_CB_ID : - hi2c->MemTxCpltCallback = pCallback; - break; - - case HAL_I2C_MEM_RX_COMPLETE_CB_ID : - hi2c->MemRxCpltCallback = pCallback; - break; - - case HAL_I2C_ERROR_CB_ID : - hi2c->ErrorCallback = pCallback; - break; - - case HAL_I2C_ABORT_CB_ID : - hi2c->AbortCpltCallback = pCallback; - break; - - case HAL_I2C_MSPINIT_CB_ID : - hi2c->MspInitCallback = pCallback; - break; - - case HAL_I2C_MSPDEINIT_CB_ID : - hi2c->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_I2C_STATE_RESET == hi2c->State) - { - switch (CallbackID) - { - case HAL_I2C_MSPINIT_CB_ID : - hi2c->MspInitCallback = pCallback; - break; - - case HAL_I2C_MSPDEINIT_CB_ID : - hi2c->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - return status; -} - -/** - * @brief Unregister an I2C Callback - * I2C callback is redirected to the weak predefined callback - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * This parameter can be one of the following values: - * @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID - * @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID - * @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID - * @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID - * @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID - * @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID - * @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID - * @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID - * @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID - * @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID - * @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hi2c); - - if (HAL_I2C_STATE_READY == hi2c->State) - { - switch (CallbackID) - { - case HAL_I2C_MASTER_TX_COMPLETE_CB_ID : - hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */ - break; - - case HAL_I2C_MASTER_RX_COMPLETE_CB_ID : - hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */ - break; - - case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID : - hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallback */ - break; - - case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID : - hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallback */ - break; - - case HAL_I2C_LISTEN_COMPLETE_CB_ID : - hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback; /* Legacy weak ListenCpltCallback */ - break; - - case HAL_I2C_MEM_TX_COMPLETE_CB_ID : - hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback; /* Legacy weak MemTxCpltCallback */ - break; - - case HAL_I2C_MEM_RX_COMPLETE_CB_ID : - hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback; /* Legacy weak MemRxCpltCallback */ - break; - - case HAL_I2C_ERROR_CB_ID : - hi2c->ErrorCallback = HAL_I2C_ErrorCallback; /* Legacy weak ErrorCallback */ - break; - - case HAL_I2C_ABORT_CB_ID : - hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - break; - - case HAL_I2C_MSPINIT_CB_ID : - hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_I2C_MSPDEINIT_CB_ID : - hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_I2C_STATE_RESET == hi2c->State) - { - switch (CallbackID) - { - case HAL_I2C_MSPINIT_CB_ID : - hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_I2C_MSPDEINIT_CB_ID : - hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - return status; -} - -/** - * @brief Register the Slave Address Match I2C Callback - * To be used instead of the weak HAL_I2C_AddrCallback() predefined callback - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pCallback pointer to the Address Match Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hi2c); - - if (HAL_I2C_STATE_READY == hi2c->State) - { - hi2c->AddrCallback = pCallback; - } - else - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - return status; -} - -/** - * @brief UnRegister the Slave Address Match I2C Callback - * Info Ready I2C Callback is redirected to the weak HAL_I2C_AddrCallback() predefined callback - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hi2c); - - if (HAL_I2C_STATE_READY == hi2c->State) - { - hi2c->AddrCallback = HAL_I2C_AddrCallback; /* Legacy weak AddrCallback */ - } - else - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - return status; -} - -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - -/** - * @brief I2C data register flush process. - * @param hi2c I2C handle. - * @retval None - */ -static void I2C_Flush_DR(I2C_HandleTypeDef *hi2c) -{ - /* Write a dummy data in DR to clear TXE flag */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) != RESET) - { - hi2c->Instance->DR = 0x00U; - } -} - -/** - * @} - */ - -/** @defgroup I2C_Exported_Functions_Group2 Input and Output operation functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the I2C data - transfers. - - (#) There are two modes of transfer: - (++) Blocking mode : The communication is performed in the polling mode. - The status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode : The communication is performed using Interrupts - or DMA. These functions return the status of the transfer startup. - The end of the data processing will be indicated through the - dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - - (#) Blocking mode functions are : - (++) HAL_I2C_Master_Transmit() - (++) HAL_I2C_Master_Receive() - (++) HAL_I2C_Slave_Transmit() - (++) HAL_I2C_Slave_Receive() - (++) HAL_I2C_Mem_Write() - (++) HAL_I2C_Mem_Read() - (++) HAL_I2C_IsDeviceReady() - - (#) No-Blocking mode functions with Interrupt are : - (++) HAL_I2C_Master_Transmit_IT() - (++) HAL_I2C_Master_Receive_IT() - (++) HAL_I2C_Slave_Transmit_IT() - (++) HAL_I2C_Slave_Receive_IT() - (++) HAL_I2C_Mem_Write_IT() - (++) HAL_I2C_Mem_Read_IT() - (++) HAL_I2C_Master_Seq_Transmit_IT() - (++) HAL_I2C_Master_Seq_Receive_IT() - (++) HAL_I2C_Slave_Seq_Transmit_IT() - (++) HAL_I2C_Slave_Seq_Receive_IT() - (++) HAL_I2C_EnableListen_IT() - (++) HAL_I2C_DisableListen_IT() - (++) HAL_I2C_Master_Abort_IT() - - (#) No-Blocking mode functions with DMA are : - (++) HAL_I2C_Master_Transmit_DMA() - (++) HAL_I2C_Master_Receive_DMA() - (++) HAL_I2C_Slave_Transmit_DMA() - (++) HAL_I2C_Slave_Receive_DMA() - (++) HAL_I2C_Mem_Write_DMA() - (++) HAL_I2C_Mem_Read_DMA() - (++) HAL_I2C_Master_Seq_Transmit_DMA() - (++) HAL_I2C_Master_Seq_Receive_DMA() - (++) HAL_I2C_Slave_Seq_Transmit_DMA() - (++) HAL_I2C_Slave_Seq_Receive_DMA() - - (#) A set of Transfer Complete Callbacks are provided in non Blocking mode: - (++) HAL_I2C_MasterTxCpltCallback() - (++) HAL_I2C_MasterRxCpltCallback() - (++) HAL_I2C_SlaveTxCpltCallback() - (++) HAL_I2C_SlaveRxCpltCallback() - (++) HAL_I2C_MemTxCpltCallback() - (++) HAL_I2C_MemRxCpltCallback() - (++) HAL_I2C_AddrCallback() - (++) HAL_I2C_ListenCpltCallback() - (++) HAL_I2C_ErrorCallback() - (++) HAL_I2C_AbortCpltCallback() - -@endverbatim - * @{ - */ - -/** - * @brief Transmits in master mode an amount of data in blocking mode. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Send Slave Address */ - if (I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - while (hi2c->XferSize > 0U) - { - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - hi2c->XferSize--; - - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - hi2c->XferSize--; - } - - /* Wait until BTF flag is set */ - if (I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receives in master mode an amount of data in blocking mode. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Send Slave Address */ - if (I2C_MasterRequestRead(hi2c, DevAddress, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - if (hi2c->XferSize == 0U) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferSize == 1U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferSize == 2U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - while (hi2c->XferSize > 0U) - { - if (hi2c->XferSize <= 3U) - { - /* One byte */ - if (hi2c->XferSize == 1U) - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - /* Two bytes */ - else if (hi2c->XferSize == 2U) - { - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - /* 3 Last bytes */ - else - { - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - else - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) - { - - if (hi2c->XferSize == 3U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - } - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmits in slave mode an amount of data in blocking mode. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* If 10bit addressing mode is selected */ - if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT) - { - /* Wait until ADDR flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - while (hi2c->XferSize > 0U) - { - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - return HAL_ERROR; - } - - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - hi2c->XferSize--; - - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - hi2c->XferSize--; - } - } - - /* Wait until AF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in slave mode an amount of data in blocking mode - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == (uint16_t)0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - while (hi2c->XferSize > 0U) - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - - /* Wait until STOP flag is set */ - if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - return HAL_ERROR; - } - - /* Clear STOP flag */ - __HAL_I2C_CLEAR_STOPFLAG(hi2c); - - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in master mode an amount of data in non-blocking mode with Interrupt - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in master mode an amount of data in non-blocking mode with Interrupt - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in slave mode an amount of data in non-blocking mode with Interrupt - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in slave mode an amount of data in non-blocking mode with Interrupt - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in master mode an amount of data in non-blocking mode with DMA - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - HAL_StatusTypeDef dmaxferstatus; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferM1CpltCallback = NULL; - hi2c->hdmatx->XferM1HalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in master mode an amount of data in non-blocking mode with DMA - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - HAL_StatusTypeDef dmaxferstatus; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferM1CpltCallback = NULL; - hi2c->hdmarx->XferM1HalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in slave mode an amount of data in non-blocking mode with DMA - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - HAL_StatusTypeDef dmaxferstatus; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferM1CpltCallback = NULL; - hi2c->hdmatx->XferM1HalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_LISTEN; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in slave mode an amount of data in non-blocking mode with DMA - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - HAL_StatusTypeDef dmaxferstatus; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferM1CpltCallback = NULL; - hi2c->hdmarx->XferM1HalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_LISTEN; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Write an amount of data in blocking mode to a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - while (hi2c->XferSize > 0U) - { - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - - /* Wait until BTF flag is set */ - if (I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Read an amount of data in blocking mode from a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - if (hi2c->XferSize == 0U) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferSize == 1U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferSize == 2U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - while (hi2c->XferSize > 0U) - { - if (hi2c->XferSize <= 3U) - { - /* One byte */ - if (hi2c->XferSize == 1U) - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - /* Two bytes */ - else if (hi2c->XferSize == 2U) - { - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - /* 3 Last bytes */ - else - { - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - else - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) - { - if (hi2c->XferSize == 3U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - } - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Write an amount of data in non-blocking mode with Interrupt to a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - hi2c->Memaddress = MemAddress; - hi2c->MemaddSize = MemAddSize; - hi2c->EventCount = 0U; - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Read an amount of data in non-blocking mode with Interrupt from a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - hi2c->Memaddress = MemAddress; - hi2c->MemaddSize = MemAddSize; - hi2c->EventCount = 0U; - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - if (hi2c->XferSize > 0U) - { - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Write an amount of data in non-blocking mode with DMA to a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - HAL_StatusTypeDef dmaxferstatus; - - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - hi2c->Memaddress = MemAddress; - hi2c->MemaddSize = MemAddSize; - hi2c->EventCount = 0U; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferM1CpltCallback = NULL; - hi2c->hdmatx->XferM1HalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) - { - /* Abort the ongoing DMA */ - dmaxferstatus = HAL_DMA_Abort_IT(hi2c->hdmatx); - - /* Prevent unused argument(s) compilation and MISRA warning */ - UNUSED(dmaxferstatus); - - /* Set the unused I2C DMA transfer complete callback to NULL */ - hi2c->hdmatx->XferCpltCallback = NULL; - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->XferSize = 0U; - hi2c->XferCount = 0U; - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_SIZE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Reads an amount of data in non-blocking mode with DMA from a specific memory address. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be read - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - __IO uint32_t count = 0U; - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - hi2c->Memaddress = MemAddress; - hi2c->MemaddSize = MemAddSize; - hi2c->EventCount = 0U; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferM1CpltCallback = NULL; - hi2c->hdmarx->XferM1HalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) - { - /* Abort the ongoing DMA */ - dmaxferstatus = HAL_DMA_Abort_IT(hi2c->hdmarx); - - /* Prevent unused argument(s) compilation and MISRA warning */ - UNUSED(dmaxferstatus); - - /* Set the unused I2C DMA transfer complete callback to NULL */ - hi2c->hdmarx->XferCpltCallback = NULL; - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->XferSize = 0U; - hi2c->XferCount = 0U; - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - return HAL_ERROR; - } - - if (hi2c->XferSize == 1U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - else - { - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR); - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Checks if target device is ready for communication. - * @note This function is used with Memory devices - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param Trials Number of trials - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout) -{ - /* Get tick */ - uint32_t tickstart = HAL_GetTick(); - uint32_t I2C_Trials = 0U; - FlagStatus tmp1; - FlagStatus tmp2; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - do - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - - /* Wait until ADDR or AF flag are set */ - /* Get tick */ - tickstart = HAL_GetTick(); - - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR); - tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); - while ((hi2c->State != HAL_I2C_STATE_TIMEOUT) && (tmp1 == RESET) && (tmp2 == RESET)) - { - if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) - { - hi2c->State = HAL_I2C_STATE_TIMEOUT; - } - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR); - tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); - } - - hi2c->State = HAL_I2C_STATE_READY; - - /* Check if the ADDR flag has been set */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Clear ADDR Flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Clear AF Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - } - - /* Increment Trials */ - I2C_Trials++; - } - while (I2C_Trials < Trials); - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential transmit in master I2C mode an amount of data in non-blocking mode with Interrupt. - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - __IO uint32_t Prev_State = 0x00U; - __IO uint32_t count = 0x00U; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Check Busy Flag only if FIRST call of Master interface */ - if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - hi2c->Devaddress = DevAddress; - - Prev_State = hi2c->PreviousState; - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential transmit in master I2C mode an amount of data in non-blocking mode with DMA. - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - __IO uint32_t Prev_State = 0x00U; - __IO uint32_t count = 0x00U; - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Check Busy Flag only if FIRST call of Master interface */ - if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - hi2c->Devaddress = DevAddress; - - Prev_State = hi2c->PreviousState; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* If XferOptions is not associated to a new frame, mean no start bit is request, enable directly the DMA request */ - /* In other cases, DMA request is enabled after Slave address treatment in IRQHandler */ - if ((XferOptions == I2C_NEXT_FRAME) || (XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)) - { - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential receive in master I2C mode an amount of data in non-blocking mode with Interrupt - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - __IO uint32_t Prev_State = 0x00U; - __IO uint32_t count = 0U; - uint32_t enableIT = (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Check Busy Flag only if FIRST call of Master interface */ - if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - hi2c->Devaddress = DevAddress; - - Prev_State = hi2c->PreviousState; - - if ((hi2c->XferCount == 2U) && ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))) - { - if (Prev_State == I2C_STATE_MASTER_BUSY_RX) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Remove Enabling of IT_BUF, mean RXNE treatment, treat the 2 bytes through BTF */ - enableIT &= ~I2C_IT_BUF; - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable interrupts */ - __HAL_I2C_ENABLE_IT(hi2c, enableIT); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential receive in master mode an amount of data in non-blocking mode with DMA - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - __IO uint32_t Prev_State = 0x00U; - __IO uint32_t count = 0U; - uint32_t enableIT = (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Check Busy Flag only if FIRST call of Master interface */ - if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Clear Last DMA bit */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - hi2c->Devaddress = DevAddress; - - Prev_State = hi2c->PreviousState; - - if (hi2c->XferSize > 0U) - { - if ((hi2c->XferCount == 2U) && ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))) - { - if (Prev_State == I2C_STATE_MASTER_BUSY_RX) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - if ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_OTHER_AND_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)) - { - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - } - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - if (dmaxferstatus == HAL_OK) - { - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Update interrupt for only EVT and ERR */ - enableIT = (I2C_IT_EVT | I2C_IT_ERR); - } - else - { - /* Update interrupt for only ERR */ - enableIT = I2C_IT_ERR; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* If XferOptions is not associated to a new frame, mean no start bit is request, enable directly the DMA request */ - /* In other cases, DMA request is enabled after Slave address treatment in IRQHandler */ - if ((XferOptions == I2C_NEXT_FRAME) || (XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)) - { - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, enableIT); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable interrupts */ - __HAL_I2C_ENABLE_IT(hi2c, enableIT); - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential transmit in slave mode an amount of data in non-blocking mode with Interrupt - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential transmit in slave mode an amount of data in non-blocking mode with DMA - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ - /* and then toggle the HAL slave RX state to TX state */ - if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) - { - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - /* Abort DMA Xfer if any */ - if (hi2c->hdmarx != NULL) - { - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); - } - } - } - } - else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) - { - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Abort DMA Xfer if any */ - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA TX */ - if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); - } - } - } - } - else - { - /* Nothing to do */ - } - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_LISTEN; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential receive in slave mode an amount of data in non-blocking mode with Interrupt - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential receive in slave mode an amount of data in non-blocking mode with DMA - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ - /* and then toggle the HAL slave RX state to TX state */ - if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) - { - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - /* Abort DMA Xfer if any */ - if (hi2c->hdmarx != NULL) - { - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); - } - } - } - } - else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) - { - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Abort DMA Xfer if any */ - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA TX */ - if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); - } - } - } - } - else - { - /* Nothing to do */ - } - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_LISTEN; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Enable the Address listen mode with Interrupt. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->State == HAL_I2C_STATE_READY) - { - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Disable the Address listen mode with Interrupt. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of tmp to prevent undefined behavior of volatile usage */ - uint32_t tmp; - - /* Disable Address listen mode only if a transfer is not ongoing */ - if (hi2c->State == HAL_I2C_STATE_LISTEN) - { - tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK; - hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode); - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Disable EVT and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Abort a master or memory I2C IT or DMA process communication with Interrupt. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - - /* Prevent unused argument(s) compilation warning */ - UNUSED(DevAddress); - - /* Abort Master transfer during Receive or Transmit process */ - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET) && ((CurrentMode == HAL_I2C_MODE_MASTER) || - (CurrentMode == HAL_I2C_MODE_MEM))) - { - /* Process Locked */ - __HAL_LOCK(hi2c); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_ABORT; - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->XferCount = 0U; - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Call the corresponding callback to inform upper layer of End of Transfer */ - I2C_ITError(hi2c); - - return HAL_OK; - } - else - { - /* Wrong usage of abort function */ - /* This function should be used only in case of abort monitored by master device */ - /* Or periphal is not in busy state, mean there is no active sequence to be abort */ - return HAL_ERROR; - } -} - -/** - * @} - */ - -/** @defgroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @{ - */ - -/** - * @brief This function handles I2C event interrupt request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c) -{ - uint32_t sr1itflags; - uint32_t sr2itflags = 0U; - uint32_t itsources = READ_REG(hi2c->Instance->CR2); - uint32_t CurrentXferOptions = hi2c->XferOptions; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - /* Master or Memory mode selected */ - if ((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM)) - { - sr2itflags = READ_REG(hi2c->Instance->SR2); - sr1itflags = READ_REG(hi2c->Instance->SR1); - - /* Exit IRQ event until Start Bit detected in case of Other frame requested */ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) == RESET) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(CurrentXferOptions) == 1U)) - { - return; - } - - /* SB Set ----------------------------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - /* Convert OTHER_xxx XferOptions if any */ - I2C_ConvertOtherXferOptions(hi2c); - - I2C_Master_SB(hi2c); - } - /* ADD10 Set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADD10) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_Master_ADD10(hi2c); - } - /* ADDR Set --------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_Master_ADDR(hi2c); - } - /* I2C in mode Transmitter -----------------------------------------------*/ - else if (I2C_CHECK_FLAG(sr2itflags, I2C_FLAG_TRA) != RESET) - { - /* Do not check buffer and BTF flag if a Xfer DMA is on going */ - if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) - { - /* TXE set and BTF reset -----------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_TXE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) - { - I2C_MasterTransmit_TXE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - if (CurrentState == HAL_I2C_STATE_BUSY_TX) - { - I2C_MasterTransmit_BTF(hi2c); - } - else /* HAL_I2C_MODE_MEM */ - { - if (CurrentMode == HAL_I2C_MODE_MEM) - { - I2C_MemoryTransmit_TXE_BTF(hi2c); - } - } - } - else - { - /* Do nothing */ - } - } - } - /* I2C in mode Receiver --------------------------------------------------*/ - else - { - /* Do not check buffer and BTF flag if a Xfer DMA is on going */ - if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) - { - /* RXNE set and BTF reset -----------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) - { - I2C_MasterReceive_RXNE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_MasterReceive_BTF(hi2c); - } - else - { - /* Do nothing */ - } - } - } - } - /* Slave mode selected */ - else - { - /* If an error is detected, read only SR1 register to prevent */ - /* a clear of ADDR flags by reading SR2 after reading SR1 in Error treatment */ - if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - sr1itflags = READ_REG(hi2c->Instance->SR1); - } - else - { - sr2itflags = READ_REG(hi2c->Instance->SR2); - sr1itflags = READ_REG(hi2c->Instance->SR1); - } - - /* ADDR set --------------------------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - /* Now time to read SR2, this will clear ADDR flag automatically */ - if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - sr2itflags = READ_REG(hi2c->Instance->SR2); - } - I2C_Slave_ADDR(hi2c, sr2itflags); - } - /* STOPF set --------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_Slave_STOPF(hi2c); - } - /* I2C in mode Transmitter -----------------------------------------------*/ - else if ((CurrentState == HAL_I2C_STATE_BUSY_TX) || (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN)) - { - /* TXE set and BTF reset -----------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_TXE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) - { - I2C_SlaveTransmit_TXE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_SlaveTransmit_BTF(hi2c); - } - else - { - /* Do nothing */ - } - } - /* I2C in mode Receiver --------------------------------------------------*/ - else - { - /* RXNE set and BTF reset ----------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) - { - I2C_SlaveReceive_RXNE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_SlaveReceive_BTF(hi2c); - } - else - { - /* Do nothing */ - } - } - } -} - -/** - * @brief This function handles I2C error interrupt request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c) -{ - HAL_I2C_ModeTypeDef tmp1; - uint32_t tmp2; - HAL_I2C_StateTypeDef tmp3; - uint32_t tmp4; - uint32_t sr1itflags = READ_REG(hi2c->Instance->SR1); - uint32_t itsources = READ_REG(hi2c->Instance->CR2); - uint32_t error = HAL_I2C_ERROR_NONE; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - - /* I2C Bus error interrupt occurred ----------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BERR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) - { - error |= HAL_I2C_ERROR_BERR; - - /* Clear BERR flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR); - } - - /* I2C Arbitration Lost error interrupt occurred ---------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ARLO) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) - { - error |= HAL_I2C_ERROR_ARLO; - - /* Clear ARLO flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO); - } - - /* I2C Acknowledge failure error interrupt occurred ------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) - { - tmp1 = CurrentMode; - tmp2 = hi2c->XferCount; - tmp3 = hi2c->State; - tmp4 = hi2c->PreviousState; - if ((tmp1 == HAL_I2C_MODE_SLAVE) && (tmp2 == 0U) && \ - ((tmp3 == HAL_I2C_STATE_BUSY_TX) || (tmp3 == HAL_I2C_STATE_BUSY_TX_LISTEN) || \ - ((tmp3 == HAL_I2C_STATE_LISTEN) && (tmp4 == I2C_STATE_SLAVE_BUSY_TX)))) - { - I2C_Slave_AF(hi2c); - } - else - { - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - error |= HAL_I2C_ERROR_AF; - - /* Do not generate a STOP in case of Slave receive non acknowledge during transfer (mean not at the end of transfer) */ - if ((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM)) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - } - } - - /* I2C Over-Run/Under-Run interrupt occurred -------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_OVR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) - { - error |= HAL_I2C_ERROR_OVR; - /* Clear OVR flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR); - } - - /* Call the Error Callback in case of Error detected -----------------------*/ - if (error != HAL_I2C_ERROR_NONE) - { - hi2c->ErrorCode |= error; - I2C_ITError(hi2c); - } -} - -/** - * @brief Master Tx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MasterTxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Master Rx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MasterRxCpltCallback could be implemented in the user file - */ -} - -/** @brief Slave Tx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_SlaveTxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Slave Rx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_SlaveRxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Slave Address Match callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param TransferDirection Master request Transfer Direction (Write/Read), value of @ref I2C_XferDirection_definition - * @param AddrMatchCode Address Match Code - * @retval None - */ -__weak void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - UNUSED(TransferDirection); - UNUSED(AddrMatchCode); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_AddrCallback() could be implemented in the user file - */ -} - -/** - * @brief Listen Complete callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_ListenCpltCallback() could be implemented in the user file - */ -} - -/** - * @brief Memory Tx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MemTxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Memory Rx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MemRxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief I2C error callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_ErrorCallback could be implemented in the user file - */ -} - -/** - * @brief I2C abort callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_AbortCpltCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions - * @brief Peripheral State, Mode and Error functions - * -@verbatim - =============================================================================== - ##### Peripheral State, Mode and Error functions ##### - =============================================================================== - [..] - This subsection permit to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the I2C handle state. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL state - */ -HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c) -{ - /* Return I2C handle state */ - return hi2c->State; -} - -/** - * @brief Returns the I2C Master, Slave, Memory or no mode. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL mode - */ -HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c) -{ - return hi2c->Mode; -} - -/** - * @brief Return the I2C error code. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval I2C Error Code - */ -uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c) -{ - return hi2c->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup I2C_Private_Functions - * @{ - */ - -/** - * @brief Handle TXE flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - uint32_t CurrentXferOptions = hi2c->XferOptions; - - if ((hi2c->XferSize == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX)) - { - /* Call TxCpltCallback() directly if no stop mode is set */ - if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME)) - { - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterTxCpltCallback(hi2c); -#else - HAL_I2C_MasterTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else /* Generate Stop condition then Call TxCpltCallback() */ - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemTxCpltCallback(hi2c); -#else - HAL_I2C_MemTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterTxCpltCallback(hi2c); -#else - HAL_I2C_MasterTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - } - else if ((CurrentState == HAL_I2C_STATE_BUSY_TX) || \ - ((CurrentMode == HAL_I2C_MODE_MEM) && (CurrentState == HAL_I2C_STATE_BUSY_RX))) - { - if (hi2c->XferCount == 0U) - { - /* Disable BUF interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - } - else - { - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - I2C_MemoryTransmit_TXE_BTF(hi2c); - } - else - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - } - } - else - { - /* Do nothing */ - } -} - -/** - * @brief Handle BTF flag for Master transmitter - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - uint32_t CurrentXferOptions = hi2c->XferOptions; - - if (hi2c->State == HAL_I2C_STATE_BUSY_TX) - { - if (hi2c->XferCount != 0U) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - else - { - /* Call TxCpltCallback() directly if no stop mode is set */ - if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME)) - { - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterTxCpltCallback(hi2c); -#else - HAL_I2C_MasterTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else /* Generate Stop condition then Call TxCpltCallback() */ - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemTxCpltCallback(hi2c); -#else - HAL_I2C_MemTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterTxCpltCallback(hi2c); -#else - HAL_I2C_MasterTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - } - } - else - { - /* Do nothing */ - } -} - -/** - * @brief Handle TXE and BTF flag for Memory transmitter - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MemoryTransmit_TXE_BTF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - if (hi2c->EventCount == 0U) - { - /* If Memory address size is 8Bit */ - if (hi2c->MemaddSize == I2C_MEMADD_SIZE_8BIT) - { - /* Send Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress); - - hi2c->EventCount += 2U; - } - /* If Memory address size is 16Bit */ - else - { - /* Send MSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_MSB(hi2c->Memaddress); - - hi2c->EventCount++; - } - } - else if (hi2c->EventCount == 1U) - { - /* Send LSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress); - - hi2c->EventCount++; - } - else if (hi2c->EventCount == 2U) - { - if (CurrentState == HAL_I2C_STATE_BUSY_RX) - { - /* Generate Restart */ - hi2c->Instance->CR1 |= I2C_CR1_START; - - hi2c->EventCount++; - } - else if ((hi2c->XferCount > 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX)) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - else if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX)) - { - /* Generate Stop condition then Call TxCpltCallback() */ - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemTxCpltCallback(hi2c); -#else - HAL_I2C_MemTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Do nothing */ - } - } - else - { - /* Clear TXE and BTF flags */ - I2C_Flush_DR(hi2c); - } -} - -/** - * @brief Handle RXNE flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->State == HAL_I2C_STATE_BUSY_RX) - { - uint32_t tmp; - uint32_t CurrentXferOptions; - - CurrentXferOptions = hi2c->XferOptions; - tmp = hi2c->XferCount; - if (tmp > 3U) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - if (hi2c->XferCount == (uint16_t)3) - { - /* Disable BUF interrupt, this help to treat correctly the last 4 bytes - on BTF subroutine */ - /* Disable BUF interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - } - } - else if ((hi2c->XferOptions != I2C_FIRST_AND_NEXT_FRAME) && ((tmp == 1U) || (tmp == 0U))) - { - if (I2C_WaitOnSTOPRequestThroughIT(hi2c) == HAL_OK) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - hi2c->State = HAL_I2C_STATE_READY; - - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->PreviousState = I2C_STATE_NONE; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemRxCpltCallback(hi2c); -#else - HAL_I2C_MemRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) - { - hi2c->PreviousState = I2C_STATE_NONE; - } - else - { - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; - } - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterRxCpltCallback(hi2c); -#else - HAL_I2C_MasterRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - else - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Call user error callback */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - else - { - /* Disable BUF interrupt, this help to treat correctly the last 2 bytes - on BTF subroutine if there is a reception delay between N-1 and N byte */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - } - } -} - -/** - * @brief Handle BTF flag for Master receiver - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - uint32_t CurrentXferOptions = hi2c->XferOptions; - - if (hi2c->XferCount == 4U) - { - /* Disable BUF interrupt, this help to treat correctly the last 2 bytes - on BTF subroutine if there is a reception delay between N-1 and N byte */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - else if (hi2c->XferCount == 3U) - { - /* Disable BUF interrupt, this help to treat correctly the last 2 bytes - on BTF subroutine if there is a reception delay between N-1 and N byte */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - - if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME)) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - else if (hi2c->XferCount == 2U) - { - /* Prepare next transfer or stop current transfer */ - if ((CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP)) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - else if ((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_NEXT_FRAME)) - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - else if (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else - { - /* Do nothing */ - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - /* Disable EVT and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - hi2c->State = HAL_I2C_STATE_READY; - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->PreviousState = I2C_STATE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemRxCpltCallback(hi2c); -#else - HAL_I2C_MemRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) - { - hi2c->PreviousState = I2C_STATE_NONE; - } - else - { - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; - } -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterRxCpltCallback(hi2c); -#else - HAL_I2C_MasterRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - else - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } -} - -/** - * @brief Handle SB flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Master_SB(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - if (hi2c->EventCount == 0U) - { - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress); - } - else - { - hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress); - } - } - else - { - if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) - { - /* Send slave 7 Bits address */ - if (hi2c->State == HAL_I2C_STATE_BUSY_TX) - { - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress); - } - else - { - hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress); - } - - if (((hi2c->hdmatx != NULL) && (hi2c->hdmatx->XferCpltCallback != NULL)) - || ((hi2c->hdmarx != NULL) && (hi2c->hdmarx->XferCpltCallback != NULL))) - { - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } - } - else - { - if (hi2c->EventCount == 0U) - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(hi2c->Devaddress); - } - else if (hi2c->EventCount == 1U) - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_READ(hi2c->Devaddress); - } - else - { - /* Do nothing */ - } - } - } -} - -/** - * @brief Handle ADD10 flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Master_ADD10(I2C_HandleTypeDef *hi2c) -{ - /* Send slave address */ - hi2c->Instance->DR = I2C_10BIT_ADDRESS(hi2c->Devaddress); - - if (((hi2c->hdmatx != NULL) && (hi2c->hdmatx->XferCpltCallback != NULL)) - || ((hi2c->hdmarx != NULL) && (hi2c->hdmarx->XferCpltCallback != NULL))) - { - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } -} - -/** - * @brief Handle ADDR flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Master_ADDR(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - uint32_t CurrentXferOptions = hi2c->XferOptions; - uint32_t Prev_State = hi2c->PreviousState; - - if (hi2c->State == HAL_I2C_STATE_BUSY_RX) - { - if ((hi2c->EventCount == 0U) && (CurrentMode == HAL_I2C_MODE_MEM)) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else if ((hi2c->EventCount == 0U) && (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Restart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - hi2c->EventCount++; - } - else - { - if (hi2c->XferCount == 0U) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferCount == 1U) - { - if (CurrentXferOptions == I2C_NO_OPTION_FRAME) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - } - /* Prepare next transfer or stop current transfer */ - else if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) \ - && ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (CurrentXferOptions == I2C_FIRST_FRAME))) - { - if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP)) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - } - else if (hi2c->XferCount == 2U) - { - if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP)) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - if (((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) && ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP) || (CurrentXferOptions == I2C_LAST_FRAME))) - { - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - if (((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) && ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP) || (CurrentXferOptions == I2C_LAST_FRAME))) - { - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - /* Reset Event counter */ - hi2c->EventCount = 0U; - } - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } -} - -/** - * @brief Handle TXE flag for Slave - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - if (hi2c->XferCount != 0U) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN)) - { - /* Last Byte is received, disable Interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveTxCpltCallback(hi2c); -#else - HAL_I2C_SlaveTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } -} - -/** - * @brief Handle BTF flag for Slave transmitter - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->XferCount != 0U) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } -} - -/** - * @brief Handle RXNE flag for Slave - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - if (hi2c->XferCount != 0U) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN)) - { - /* Last Byte is received, disable Interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveRxCpltCallback(hi2c); -#else - HAL_I2C_SlaveRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } -} - -/** - * @brief Handle BTF flag for Slave receiver - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->XferCount != 0U) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } -} - -/** - * @brief Handle ADD flag for Slave - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param IT2Flags Interrupt2 flags to handle. - * @retval None - */ -static void I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c, uint32_t IT2Flags) -{ - uint8_t TransferDirection = I2C_DIRECTION_RECEIVE; - uint16_t SlaveAddrCode; - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - /* Disable BUF interrupt, BUF enabling is manage through slave specific interface */ - __HAL_I2C_DISABLE_IT(hi2c, (I2C_IT_BUF)); - - /* Transfer Direction requested by Master */ - if (I2C_CHECK_FLAG(IT2Flags, I2C_FLAG_TRA) == RESET) - { - TransferDirection = I2C_DIRECTION_TRANSMIT; - } - - if (I2C_CHECK_FLAG(IT2Flags, I2C_FLAG_DUALF) == RESET) - { - SlaveAddrCode = (uint16_t)hi2c->Init.OwnAddress1; - } - else - { - SlaveAddrCode = (uint16_t)hi2c->Init.OwnAddress2; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Call Slave Addr callback */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->AddrCallback(hi2c, TransferDirection, SlaveAddrCode); -#else - HAL_I2C_AddrCallback(hi2c, TransferDirection, SlaveAddrCode); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - } -} - -/** - * @brief Handle STOPF flag for Slave - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Clear STOPF flag */ - __HAL_I2C_CLEAR_STOPFLAG(hi2c); - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* If a DMA is ongoing, Update handle size context */ - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - if ((CurrentState == HAL_I2C_STATE_BUSY_RX) || (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN)) - { - hi2c->XferCount = (uint16_t)(I2C_GET_DMA_REMAIN_DATA(hi2c->hdmarx)); - - if (hi2c->XferCount != 0U) - { - /* Set ErrorCode corresponding to a Non-Acknowledge */ - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - } - - /* Disable, stop the current DMA */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Abort DMA Xfer if any */ - if (HAL_DMA_GetState(hi2c->hdmarx) != HAL_DMA_STATE_READY) - { - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); - } - } - } - else - { - hi2c->XferCount = (uint16_t)(I2C_GET_DMA_REMAIN_DATA(hi2c->hdmatx)); - - if (hi2c->XferCount != 0U) - { - /* Set ErrorCode corresponding to a Non-Acknowledge */ - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - } - - /* Disable, stop the current DMA */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Abort DMA Xfer if any */ - if (HAL_DMA_GetState(hi2c->hdmatx) != HAL_DMA_STATE_READY) - { - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA TX */ - if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); - } - } - } - } - - /* All data are not transferred, so set error code accordingly */ - if (hi2c->XferCount != 0U) - { - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - - if (hi2c->XferCount != 0U) - { - /* Set ErrorCode corresponding to a Non-Acknowledge */ - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - } - } - - if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - /* Call the corresponding callback to inform upper layer of End of Transfer */ - I2C_ITError(hi2c); - } - else - { - if (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN) - { - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveRxCpltCallback(hi2c); -#else - HAL_I2C_SlaveRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - - if (hi2c->State == HAL_I2C_STATE_LISTEN) - { - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ListenCpltCallback(hi2c); -#else - HAL_I2C_ListenCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - if ((hi2c->PreviousState == I2C_STATE_SLAVE_BUSY_RX) || (CurrentState == HAL_I2C_STATE_BUSY_RX)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveRxCpltCallback(hi2c); -#else - HAL_I2C_SlaveRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - } -} - -/** - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Slave_AF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - uint32_t CurrentXferOptions = hi2c->XferOptions; - - if (((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) && \ - (CurrentState == HAL_I2C_STATE_LISTEN)) - { - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ListenCpltCallback(hi2c); -#else - HAL_I2C_ListenCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else if (CurrentState == HAL_I2C_STATE_BUSY_TX) - { - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear TXE flag */ - I2C_Flush_DR(hi2c); - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveTxCpltCallback(hi2c); -#else - HAL_I2C_SlaveTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Clear AF flag only */ - /* State Listen, but XferOptions == FIRST or NEXT */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - } -} - -/** - * @brief I2C interrupts error process - * @param hi2c I2C handle. - * @retval None - */ -static void I2C_ITError(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - uint32_t CurrentError; - - if (((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM)) && (CurrentState == HAL_I2C_STATE_BUSY_RX)) - { - /* Disable Pos bit in I2C CR1 when error occurred in Master/Mem Receive IT Process */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - } - - if (((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - /* keep HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_LISTEN; - } - else - { - /* If state is an abort treatment on going, don't change state */ - /* This change will be do later */ - if ((READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) && (CurrentState != HAL_I2C_STATE_ABORT)) - { - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - } - hi2c->PreviousState = I2C_STATE_NONE; - } - - /* Abort DMA transfer */ - if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN; - - if (hi2c->hdmatx->State != HAL_DMA_STATE_READY) - { - /* Set the DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; - - if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) - { - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - hi2c->State = HAL_I2C_STATE_READY; - - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); - } - } - else - { - /* Set the DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; - - if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) - { - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - } - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - hi2c->State = HAL_I2C_STATE_READY; - - /* Call Directly hi2c->hdmarx->XferAbortCallback function in case of error */ - hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); - } - } - } - else if (hi2c->State == HAL_I2C_STATE_ABORT) - { - hi2c->State = HAL_I2C_STATE_READY; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - } - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->AbortCpltCallback(hi2c); -#else - HAL_I2C_AbortCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - } - - /* Call user error callback */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - - /* STOP Flag is not set after a NACK reception, BusError, ArbitrationLost, OverRun */ - CurrentError = hi2c->ErrorCode; - - if (((CurrentError & HAL_I2C_ERROR_BERR) == HAL_I2C_ERROR_BERR) || \ - ((CurrentError & HAL_I2C_ERROR_ARLO) == HAL_I2C_ERROR_ARLO) || \ - ((CurrentError & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF) || \ - ((CurrentError & HAL_I2C_ERROR_OVR) == HAL_I2C_ERROR_OVR)) - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - } - - /* So may inform upper layer that listen phase is stopped */ - /* during NACK error treatment */ - CurrentState = hi2c->State; - if (((hi2c->ErrorCode & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF) && (CurrentState == HAL_I2C_STATE_LISTEN)) - { - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ListenCpltCallback(hi2c); -#else - HAL_I2C_ListenCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } -} - -/** - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - uint32_t CurrentXferOptions = hi2c->XferOptions; - - /* Generate Start condition if first transfer */ - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else if (hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) - { - /* Generate ReStart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else - { - /* Do nothing */ - } - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) - { - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - } - else - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress); - - /* Wait until ADD10 flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress); - } - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Master sends target device address for read request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - uint32_t CurrentXferOptions = hi2c->XferOptions; - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start condition if first transfer */ - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else if (hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) - { - /* Generate ReStart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else - { - /* Do nothing */ - } - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) - { - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress); - } - else - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress); - - /* Wait until ADD10 flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Restart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_READ(DevAddress); - } - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Master sends target device address followed by internal memory address for write request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart) -{ - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* If Memory address size is 8Bit */ - if (MemAddSize == I2C_MEMADD_SIZE_8BIT) - { - /* Send Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - /* If Memory address size is 16Bit */ - else - { - /* Send MSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress); - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Send LSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - - return HAL_OK; -} - -/** - * @brief Master sends target device address followed by internal memory address for read request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart) -{ - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* If Memory address size is 8Bit */ - if (MemAddSize == I2C_MEMADD_SIZE_8BIT) - { - /* Send Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - /* If Memory address size is 16Bit */ - else - { - /* Send MSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress); - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Send LSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Generate Restart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief DMA I2C process complete callback. - * @param hdma DMA handle - * @retval None - */ -static void I2C_DMAXferCplt(DMA_HandleTypeDef *hdma) -{ - I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */ - - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - uint32_t CurrentXferOptions = hi2c->XferOptions; - - /* Disable EVT and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Clear Complete callback */ - if (hi2c->hdmatx != NULL) - { - hi2c->hdmatx->XferCpltCallback = NULL; - } - if (hi2c->hdmarx != NULL) - { - hi2c->hdmarx->XferCpltCallback = NULL; - } - - if ((((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_BUSY_TX) == (uint32_t)HAL_I2C_STATE_BUSY_TX) || ((((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_BUSY_RX) == (uint32_t)HAL_I2C_STATE_BUSY_RX) && (CurrentMode == HAL_I2C_MODE_SLAVE))) - { - /* Disable DMA Request */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - hi2c->XferCount = 0U; - - if (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN) - { - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveTxCpltCallback(hi2c); -#else - HAL_I2C_SlaveTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else if (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN) - { - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveRxCpltCallback(hi2c); -#else - HAL_I2C_SlaveRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Do nothing */ - } - - /* Enable EVT and ERR interrupt to treat end of transfer in IRQ handler */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - } - /* Check current Mode, in case of treatment DMA handler have been preempted by a prior interrupt */ - else if (hi2c->Mode != HAL_I2C_MODE_NONE) - { - if (hi2c->XferCount == (uint16_t)1) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* Disable EVT and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Prepare next transfer or stop current transfer */ - if ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_OTHER_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - - /* Disable Last DMA */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - - /* Disable DMA Request */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - hi2c->XferCount = 0U; - - /* Check if Errors has been detected during transfer */ - if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->State = HAL_I2C_STATE_READY; - - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->PreviousState = I2C_STATE_NONE; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemRxCpltCallback(hi2c); -#else - HAL_I2C_MemRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) - { - hi2c->PreviousState = I2C_STATE_NONE; - } - else - { - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; - } - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterRxCpltCallback(hi2c); -#else - HAL_I2C_MasterRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - } - else - { - /* Do nothing */ - } -} - -/** - * @brief DMA I2C communication error callback. - * @param hdma DMA handle - * @retval None - */ -static void I2C_DMAError(DMA_HandleTypeDef *hdma) -{ - I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */ - - /* Clear Complete callback */ - if (hi2c->hdmatx != NULL) - { - hi2c->hdmatx->XferCpltCallback = NULL; - } - if (hi2c->hdmarx != NULL) - { - hi2c->hdmarx->XferCpltCallback = NULL; - } - - /* Ignore DMA FIFO error */ - if (HAL_DMA_GetError(hdma) != HAL_DMA_ERROR_FE) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - hi2c->XferCount = 0U; - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } -} - -/** - * @brief DMA I2C communication abort callback - * (To be called at end of DMA Abort procedure). - * @param hdma DMA handle. - * @retval None - */ -static void I2C_DMAAbort(DMA_HandleTypeDef *hdma) -{ - __IO uint32_t count = 0U; - I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */ - - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - /* During abort treatment, check that there is no pending STOP request */ - /* Wait until STOP flag is reset */ - count = I2C_TIMEOUT_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - if (count == 0U) - { - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - break; - } - count--; - } - while (READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP); - - /* Clear Complete callback */ - if (hi2c->hdmatx != NULL) - { - hi2c->hdmatx->XferCpltCallback = NULL; - } - if (hi2c->hdmarx != NULL) - { - hi2c->hdmarx->XferCpltCallback = NULL; - } - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->XferCount = 0U; - - /* Reset XferAbortCallback */ - if (hi2c->hdmatx != NULL) - { - hi2c->hdmatx->XferAbortCallback = NULL; - } - if (hi2c->hdmarx != NULL) - { - hi2c->hdmarx->XferAbortCallback = NULL; - } - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - /* Check if come from abort from user */ - if (hi2c->State == HAL_I2C_STATE_ABORT) - { - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->AbortCpltCallback(hi2c); -#else - HAL_I2C_AbortCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - if (((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - /* Renable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* keep HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_LISTEN; - } - else - { - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - } - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } -} - -/** - * @brief This function handles I2C Communication Timeout. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param Flag specifies the I2C flag to check. - * @param Status The new Flag status (SET or RESET). - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart) -{ - /* Wait until flag is set */ - while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status) - { - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, Flag) == Status)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for Master addressing phase. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param Flag specifies the I2C flag to check. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart) -{ - while (__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET) - { - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Clear AF Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of TXE flag. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) -{ - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET) - { - /* Check if a NACK is detected */ - if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK) - { - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of BTF flag. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) -{ - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET) - { - /* Check if a NACK is detected */ - if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK) - { - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of STOP flag. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) -{ - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) - { - /* Check if a NACK is detected */ - if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK) - { - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of STOP request through Interrupt. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnSTOPRequestThroughIT(I2C_HandleTypeDef *hi2c) -{ - __IO uint32_t count = 0U; - - /* Wait until STOP flag is reset */ - count = I2C_TIMEOUT_STOP_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_ERROR; - } - } - while (READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP); - - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of RXNE flag. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) -{ - - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET) - { - /* Check if a STOPF is detected */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET) - { - /* Clear STOP Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles Acknowledge failed detection during an I2C Communication. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c) -{ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) - { - /* Clear NACKF Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - return HAL_OK; -} - -/** - * @brief Convert I2Cx OTHER_xxx XferOptions to functional XferOptions. - * @param hi2c I2C handle. - * @retval None - */ -static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c) -{ - /* if user set XferOptions to I2C_OTHER_FRAME */ - /* it request implicitly to generate a restart condition */ - /* set XferOptions to I2C_FIRST_FRAME */ - if (hi2c->XferOptions == I2C_OTHER_FRAME) - { - hi2c->XferOptions = I2C_FIRST_FRAME; - } - /* else if user set XferOptions to I2C_OTHER_AND_LAST_FRAME */ - /* it request implicitly to generate a restart condition */ - /* then generate a stop condition at the end of transfer */ - /* set XferOptions to I2C_FIRST_AND_LAST_FRAME */ - else if (hi2c->XferOptions == I2C_OTHER_AND_LAST_FRAME) - { - hi2c->XferOptions = I2C_FIRST_AND_LAST_FRAME; - } - else - { - /* Nothing to do */ - } -} - -/** - * @} - */ - -#endif /* HAL_I2C_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c deleted file mode 100644 index 64aabaa..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c +++ /dev/null @@ -1,182 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_i2c_ex.c - * @author MCD Application Team - * @brief I2C Extension HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of I2C extension peripheral: - * + Extension features functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### I2C peripheral extension features ##### - ============================================================================== - - [..] Comparing to other previous devices, the I2C interface for STM32F427xx/437xx/ - 429xx/439xx devices contains the following additional features : - - (+) Possibility to disable or enable Analog Noise Filter - (+) Use of a configured Digital Noise Filter - - ##### How to use this driver ##### - ============================================================================== - [..] This driver provides functions to configure Noise Filter - (#) Configure I2C Analog noise filter using the function HAL_I2C_AnalogFilter_Config() - (#) Configure I2C Digital noise filter using the function HAL_I2C_DigitalFilter_Config() - - @endverbatim - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup I2CEx I2CEx - * @brief I2C HAL module driver - * @{ - */ - -#ifdef HAL_I2C_MODULE_ENABLED - -#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup I2CEx_Exported_Functions I2C Exported Functions - * @{ - */ - - -/** @defgroup I2CEx_Exported_Functions_Group1 Extension features functions - * @brief Extension features functions - * -@verbatim - =============================================================================== - ##### Extension features functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure Noise Filters - -@endverbatim - * @{ - */ - -/** - * @brief Configures I2C Analog noise filter. - * @param hi2c pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2Cx peripheral. - * @param AnalogFilter new state of the Analog filter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t AnalogFilter) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - assert_param(IS_I2C_ANALOG_FILTER(AnalogFilter)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the selected I2C peripheral */ - __HAL_I2C_DISABLE(hi2c); - - /* Reset I2Cx ANOFF bit */ - hi2c->Instance->FLTR &= ~(I2C_FLTR_ANOFF); - - /* Disable the analog filter */ - hi2c->Instance->FLTR |= AnalogFilter; - - __HAL_I2C_ENABLE(hi2c); - - hi2c->State = HAL_I2C_STATE_READY; - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Configures I2C Digital noise filter. - * @param hi2c pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2Cx peripheral. - * @param DigitalFilter Coefficient of digital noise filter between 0x00 and 0x0F. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter) -{ - uint16_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - assert_param(IS_I2C_DIGITAL_FILTER(DigitalFilter)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the selected I2C peripheral */ - __HAL_I2C_DISABLE(hi2c); - - /* Get the old register value */ - tmpreg = hi2c->Instance->FLTR; - - /* Reset I2Cx DNF bit [3:0] */ - tmpreg &= ~(I2C_FLTR_DNF); - - /* Set I2Cx DNF coefficient */ - tmpreg |= DigitalFilter; - - /* Store the new register value */ - hi2c->Instance->FLTR = tmpreg; - - __HAL_I2C_ENABLE(hi2c); - - hi2c->State = HAL_I2C_STATE_READY; - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @} - */ - -/** - * @} - */ -#endif - -#endif /* HAL_I2C_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c deleted file mode 100644 index d53e0b1..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c +++ /dev/null @@ -1,2393 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pcd.c - * @author MCD Application Team - * @brief PCD HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the USB Peripheral Controller: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The PCD HAL driver can be used as follows: - - (#) Declare a PCD_HandleTypeDef handle structure, for example: - PCD_HandleTypeDef hpcd; - - (#) Fill parameters of Init structure in HCD handle - - (#) Call HAL_PCD_Init() API to initialize the PCD peripheral (Core, Device core, ...) - - (#) Initialize the PCD low level resources through the HAL_PCD_MspInit() API: - (##) Enable the PCD/USB Low Level interface clock using - (+++) __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); - (+++) __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); (For High Speed Mode) - - (##) Initialize the related GPIO clocks - (##) Configure PCD pin-out - (##) Configure PCD NVIC interrupt - - (#)Associate the Upper USB device stack to the HAL PCD Driver: - (##) hpcd.pData = pdev; - - (#)Enable PCD transmission and reception: - (##) HAL_PCD_Start(); - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PCD PCD - * @brief PCD HAL module driver - * @{ - */ - -#ifdef HAL_PCD_MODULE_ENABLED - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PCD_Private_Macros PCD Private Macros - * @{ - */ -#define PCD_MIN(a, b) (((a) < (b)) ? (a) : (b)) -#define PCD_MAX(a, b) (((a) > (b)) ? (a) : (b)) -/** - * @} - */ - -/* Private functions prototypes ----------------------------------------------*/ -/** @defgroup PCD_Private_Functions PCD Private Functions - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum); -static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum); -static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum); -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup PCD_Exported_Functions PCD Exported Functions - * @{ - */ - -/** @defgroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This section provides functions allowing to: - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the PCD according to the specified - * parameters in the PCD_InitTypeDef and initialize the associated handle. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) -{ -#if defined (USB_OTG_FS) - const USB_OTG_GlobalTypeDef *USBx; -#endif /* defined (USB_OTG_FS) */ - uint8_t i; - - /* Check the PCD handle allocation */ - if (hpcd == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance)); - -#if defined (USB_OTG_FS) - USBx = hpcd->Instance; -#endif /* defined (USB_OTG_FS) */ - - if (hpcd->State == HAL_PCD_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hpcd->Lock = HAL_UNLOCKED; - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SOFCallback = HAL_PCD_SOFCallback; - hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback; - hpcd->ResetCallback = HAL_PCD_ResetCallback; - hpcd->SuspendCallback = HAL_PCD_SuspendCallback; - hpcd->ResumeCallback = HAL_PCD_ResumeCallback; - hpcd->ConnectCallback = HAL_PCD_ConnectCallback; - hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback; - hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback; - hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback; - hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback; - hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback; - hpcd->LPMCallback = HAL_PCDEx_LPM_Callback; - hpcd->BCDCallback = HAL_PCDEx_BCD_Callback; - - if (hpcd->MspInitCallback == NULL) - { - hpcd->MspInitCallback = HAL_PCD_MspInit; - } - - /* Init the low level hardware */ - hpcd->MspInitCallback(hpcd); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC... */ - HAL_PCD_MspInit(hpcd); -#endif /* (USE_HAL_PCD_REGISTER_CALLBACKS) */ - } - - hpcd->State = HAL_PCD_STATE_BUSY; - -#if defined (USB_OTG_FS) - /* Disable DMA mode for FS instance */ - if (USBx == USB_OTG_FS) - { - hpcd->Init.dma_enable = 0U; - } -#endif /* defined (USB_OTG_FS) */ - - /* Disable the Interrupts */ - __HAL_PCD_DISABLE(hpcd); - - /*Init the Core (common init.) */ - if (USB_CoreInit(hpcd->Instance, hpcd->Init) != HAL_OK) - { - hpcd->State = HAL_PCD_STATE_ERROR; - return HAL_ERROR; - } - - /* Force Device Mode */ - if (USB_SetCurrentMode(hpcd->Instance, USB_DEVICE_MODE) != HAL_OK) - { - hpcd->State = HAL_PCD_STATE_ERROR; - return HAL_ERROR; - } - - /* Init endpoints structures */ - for (i = 0U; i < hpcd->Init.dev_endpoints; i++) - { - /* Init ep structure */ - hpcd->IN_ep[i].is_in = 1U; - hpcd->IN_ep[i].num = i; - hpcd->IN_ep[i].tx_fifo_num = i; - /* Control until ep is activated */ - hpcd->IN_ep[i].type = EP_TYPE_CTRL; - hpcd->IN_ep[i].maxpacket = 0U; - hpcd->IN_ep[i].xfer_buff = 0U; - hpcd->IN_ep[i].xfer_len = 0U; - } - - for (i = 0U; i < hpcd->Init.dev_endpoints; i++) - { - hpcd->OUT_ep[i].is_in = 0U; - hpcd->OUT_ep[i].num = i; - /* Control until ep is activated */ - hpcd->OUT_ep[i].type = EP_TYPE_CTRL; - hpcd->OUT_ep[i].maxpacket = 0U; - hpcd->OUT_ep[i].xfer_buff = 0U; - hpcd->OUT_ep[i].xfer_len = 0U; - } - - /* Init Device */ - if (USB_DevInit(hpcd->Instance, hpcd->Init) != HAL_OK) - { - hpcd->State = HAL_PCD_STATE_ERROR; - return HAL_ERROR; - } - - hpcd->USB_Address = 0U; - hpcd->State = HAL_PCD_STATE_READY; -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \ - || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \ - || defined(STM32F423xx) - /* Activate LPM */ - if (hpcd->Init.lpm_enable == 1U) - { - (void)HAL_PCDEx_ActivateLPM(hpcd); - } -#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || - defined(STM32F423xx) */ - (void)USB_DevDisconnect(hpcd->Instance); - - return HAL_OK; -} - -/** - * @brief DeInitializes the PCD peripheral. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd) -{ - /* Check the PCD handle allocation */ - if (hpcd == NULL) - { - return HAL_ERROR; - } - - hpcd->State = HAL_PCD_STATE_BUSY; - - /* Stop Device */ - if (USB_StopDevice(hpcd->Instance) != HAL_OK) - { - return HAL_ERROR; - } - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - if (hpcd->MspDeInitCallback == NULL) - { - hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; /* Legacy weak MspDeInit */ - } - - /* DeInit the low level hardware */ - hpcd->MspDeInitCallback(hpcd); -#else - /* DeInit the low level hardware: CLOCK, NVIC.*/ - HAL_PCD_MspDeInit(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - hpcd->State = HAL_PCD_STATE_RESET; - - return HAL_OK; -} - -/** - * @brief Initializes the PCD MSP. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes PCD MSP. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_MspDeInit could be implemented in the user file - */ -} - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -/** - * @brief Register a User USB PCD Callback - * To be used instead of the weak predefined callback - * @param hpcd USB PCD handle - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_PCD_SOF_CB_ID USB PCD SOF callback ID - * @arg @ref HAL_PCD_SETUPSTAGE_CB_ID USB PCD Setup callback ID - * @arg @ref HAL_PCD_RESET_CB_ID USB PCD Reset callback ID - * @arg @ref HAL_PCD_SUSPEND_CB_ID USB PCD Suspend callback ID - * @arg @ref HAL_PCD_RESUME_CB_ID USB PCD Resume callback ID - * @arg @ref HAL_PCD_CONNECT_CB_ID USB PCD Connect callback ID - * @arg @ref HAL_PCD_DISCONNECT_CB_ID USB PCD Disconnect callback ID - * @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID - * @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID - * @param pCallback pointer to the Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, - HAL_PCD_CallbackIDTypeDef CallbackID, - pPCD_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - switch (CallbackID) - { - case HAL_PCD_SOF_CB_ID : - hpcd->SOFCallback = pCallback; - break; - - case HAL_PCD_SETUPSTAGE_CB_ID : - hpcd->SetupStageCallback = pCallback; - break; - - case HAL_PCD_RESET_CB_ID : - hpcd->ResetCallback = pCallback; - break; - - case HAL_PCD_SUSPEND_CB_ID : - hpcd->SuspendCallback = pCallback; - break; - - case HAL_PCD_RESUME_CB_ID : - hpcd->ResumeCallback = pCallback; - break; - - case HAL_PCD_CONNECT_CB_ID : - hpcd->ConnectCallback = pCallback; - break; - - case HAL_PCD_DISCONNECT_CB_ID : - hpcd->DisconnectCallback = pCallback; - break; - - case HAL_PCD_MSPINIT_CB_ID : - hpcd->MspInitCallback = pCallback; - break; - - case HAL_PCD_MSPDEINIT_CB_ID : - hpcd->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (hpcd->State == HAL_PCD_STATE_RESET) - { - switch (CallbackID) - { - case HAL_PCD_MSPINIT_CB_ID : - hpcd->MspInitCallback = pCallback; - break; - - case HAL_PCD_MSPDEINIT_CB_ID : - hpcd->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - return status; -} - -/** - * @brief Unregister an USB PCD Callback - * USB PCD callback is redirected to the weak predefined callback - * @param hpcd USB PCD handle - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_PCD_SOF_CB_ID USB PCD SOF callback ID - * @arg @ref HAL_PCD_SETUPSTAGE_CB_ID USB PCD Setup callback ID - * @arg @ref HAL_PCD_RESET_CB_ID USB PCD Reset callback ID - * @arg @ref HAL_PCD_SUSPEND_CB_ID USB PCD Suspend callback ID - * @arg @ref HAL_PCD_RESUME_CB_ID USB PCD Resume callback ID - * @arg @ref HAL_PCD_CONNECT_CB_ID USB PCD Connect callback ID - * @arg @ref HAL_PCD_DISCONNECT_CB_ID USB PCD Disconnect callback ID - * @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID - * @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - /* Setup Legacy weak Callbacks */ - if (hpcd->State == HAL_PCD_STATE_READY) - { - switch (CallbackID) - { - case HAL_PCD_SOF_CB_ID : - hpcd->SOFCallback = HAL_PCD_SOFCallback; - break; - - case HAL_PCD_SETUPSTAGE_CB_ID : - hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback; - break; - - case HAL_PCD_RESET_CB_ID : - hpcd->ResetCallback = HAL_PCD_ResetCallback; - break; - - case HAL_PCD_SUSPEND_CB_ID : - hpcd->SuspendCallback = HAL_PCD_SuspendCallback; - break; - - case HAL_PCD_RESUME_CB_ID : - hpcd->ResumeCallback = HAL_PCD_ResumeCallback; - break; - - case HAL_PCD_CONNECT_CB_ID : - hpcd->ConnectCallback = HAL_PCD_ConnectCallback; - break; - - case HAL_PCD_DISCONNECT_CB_ID : - hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback; - break; - - case HAL_PCD_MSPINIT_CB_ID : - hpcd->MspInitCallback = HAL_PCD_MspInit; - break; - - case HAL_PCD_MSPDEINIT_CB_ID : - hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; - break; - - default : - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (hpcd->State == HAL_PCD_STATE_RESET) - { - switch (CallbackID) - { - case HAL_PCD_MSPINIT_CB_ID : - hpcd->MspInitCallback = HAL_PCD_MspInit; - break; - - case HAL_PCD_MSPDEINIT_CB_ID : - hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; - break; - - default : - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - return status; -} - -/** - * @brief Register USB PCD Data OUT Stage Callback - * To be used instead of the weak HAL_PCD_DataOutStageCallback() predefined callback - * @param hpcd PCD handle - * @param pCallback pointer to the USB PCD Data OUT Stage Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, - pPCD_DataOutStageCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->DataOutStageCallback = pCallback; - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Unregister the USB PCD Data OUT Stage Callback - * USB PCD Data OUT Stage Callback is redirected to the weak HAL_PCD_DataOutStageCallback() predefined callback - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback; /* Legacy weak DataOutStageCallback */ - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Register USB PCD Data IN Stage Callback - * To be used instead of the weak HAL_PCD_DataInStageCallback() predefined callback - * @param hpcd PCD handle - * @param pCallback pointer to the USB PCD Data IN Stage Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, - pPCD_DataInStageCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->DataInStageCallback = pCallback; - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Unregister the USB PCD Data IN Stage Callback - * USB PCD Data OUT Stage Callback is redirected to the weak HAL_PCD_DataInStageCallback() predefined callback - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback; /* Legacy weak DataInStageCallback */ - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Register USB PCD Iso OUT incomplete Callback - * To be used instead of the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback - * @param hpcd PCD handle - * @param pCallback pointer to the USB PCD Iso OUT incomplete Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, - pPCD_IsoOutIncpltCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->ISOOUTIncompleteCallback = pCallback; - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Unregister the USB PCD Iso OUT incomplete Callback - * USB PCD Iso OUT incomplete Callback is redirected - * to the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback; /* Legacy weak ISOOUTIncompleteCallback */ - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Register USB PCD Iso IN incomplete Callback - * To be used instead of the weak HAL_PCD_ISOINIncompleteCallback() predefined callback - * @param hpcd PCD handle - * @param pCallback pointer to the USB PCD Iso IN incomplete Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, - pPCD_IsoInIncpltCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->ISOINIncompleteCallback = pCallback; - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Unregister the USB PCD Iso IN incomplete Callback - * USB PCD Iso IN incomplete Callback is redirected - * to the weak HAL_PCD_ISOINIncompleteCallback() predefined callback - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback; /* Legacy weak ISOINIncompleteCallback */ - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Register USB PCD BCD Callback - * To be used instead of the weak HAL_PCDEx_BCD_Callback() predefined callback - * @param hpcd PCD handle - * @param pCallback pointer to the USB PCD BCD Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, pPCD_BcdCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->BCDCallback = pCallback; - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Unregister the USB PCD BCD Callback - * USB BCD Callback is redirected to the weak HAL_PCDEx_BCD_Callback() predefined callback - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterBcdCallback(PCD_HandleTypeDef *hpcd) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->BCDCallback = HAL_PCDEx_BCD_Callback; /* Legacy weak HAL_PCDEx_BCD_Callback */ - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Register USB PCD LPM Callback - * To be used instead of the weak HAL_PCDEx_LPM_Callback() predefined callback - * @param hpcd PCD handle - * @param pCallback pointer to the USB PCD LPM Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->LPMCallback = pCallback; - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Unregister the USB PCD LPM Callback - * USB LPM Callback is redirected to the weak HAL_PCDEx_LPM_Callback() predefined callback - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->LPMCallback = HAL_PCDEx_LPM_Callback; /* Legacy weak HAL_PCDEx_LPM_Callback */ - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup PCD_Exported_Functions_Group2 Input and Output operation functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the PCD data - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Start the USB device - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - __HAL_LOCK(hpcd); - - if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) && - (hpcd->Init.battery_charging_enable == 1U)) - { - /* Enable USB Transceiver */ - USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN; - } - - __HAL_PCD_ENABLE(hpcd); - (void)USB_DevConnect(hpcd->Instance); - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Stop the USB device. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - __HAL_LOCK(hpcd); - __HAL_PCD_DISABLE(hpcd); - (void)USB_DevDisconnect(hpcd->Instance); - - (void)USB_FlushTxFifo(hpcd->Instance, 0x10U); - - if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) && - (hpcd->Init.battery_charging_enable == 1U)) - { - /* Disable USB Transceiver */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN); - } - - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** - * @brief Handles PCD interrupt request. - * @param hpcd PCD handle - * @retval HAL status - */ -void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - uint32_t USBx_BASE = (uint32_t)USBx; - USB_OTG_EPTypeDef *ep; - uint32_t i; - uint32_t ep_intr; - uint32_t epint; - uint32_t epnum; - uint32_t fifoemptymsk; - uint32_t RegVal; - - /* ensure that we are in device mode */ - if (USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE) - { - /* avoid spurious interrupt */ - if (__HAL_PCD_IS_INVALID_INTERRUPT(hpcd)) - { - return; - } - - /* store current frame number */ - hpcd->FrameNumber = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF_Msk) >> USB_OTG_DSTS_FNSOF_Pos; - - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_MMIS)) - { - /* incorrect mode, acknowledge the interrupt */ - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS); - } - - /* Handle RxQLevel Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL)) - { - USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - - RegVal = USBx->GRXSTSP; - - ep = &hpcd->OUT_ep[RegVal & USB_OTG_GRXSTSP_EPNUM]; - - if (((RegVal & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT) - { - if ((RegVal & USB_OTG_GRXSTSP_BCNT) != 0U) - { - (void)USB_ReadPacket(USBx, ep->xfer_buff, - (uint16_t)((RegVal & USB_OTG_GRXSTSP_BCNT) >> 4)); - - ep->xfer_buff += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4; - ep->xfer_count += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4; - } - } - else if (((RegVal & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT) - { - (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U); - ep->xfer_count += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4; - } - else - { - /* ... */ - } - - USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - } - - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT)) - { - epnum = 0U; - - /* Read in the device interrupt bits */ - ep_intr = USB_ReadDevAllOutEpInterrupt(hpcd->Instance); - - while (ep_intr != 0U) - { - if ((ep_intr & 0x1U) != 0U) - { - epint = USB_ReadDevOutEPInterrupt(hpcd->Instance, (uint8_t)epnum); - - if ((epint & USB_OTG_DOEPINT_XFRC) == USB_OTG_DOEPINT_XFRC) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_XFRC); - (void)PCD_EP_OutXfrComplete_int(hpcd, epnum); - } - - if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); - /* Class B setup phase done for previous decoded setup */ - (void)PCD_EP_OutSetupPacket_int(hpcd, epnum); - } - - if ((epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPDIS); - } - - /* Clear OUT Endpoint disable interrupt */ - if ((epint & USB_OTG_DOEPINT_EPDISD) == USB_OTG_DOEPINT_EPDISD) - { - if ((USBx->GINTSTS & USB_OTG_GINTSTS_BOUTNAKEFF) == USB_OTG_GINTSTS_BOUTNAKEFF) - { - USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGONAK; - } - - ep = &hpcd->OUT_ep[epnum]; - - if (ep->is_iso_incomplete == 1U) - { - ep->is_iso_incomplete = 0U; - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_EPDISD); - } - - /* Clear Status Phase Received interrupt */ - if ((epint & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR); - } - - /* Clear OUT NAK interrupt */ - if ((epint & USB_OTG_DOEPINT_NAK) == USB_OTG_DOEPINT_NAK) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_NAK); - } - } - epnum++; - ep_intr >>= 1U; - } - } - - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IEPINT)) - { - /* Read in the device interrupt bits */ - ep_intr = USB_ReadDevAllInEpInterrupt(hpcd->Instance); - - epnum = 0U; - - while (ep_intr != 0U) - { - if ((ep_intr & 0x1U) != 0U) /* In ITR */ - { - epint = USB_ReadDevInEPInterrupt(hpcd->Instance, (uint8_t)epnum); - - if ((epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC) - { - fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK)); - USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk; - - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_XFRC); - - if (hpcd->Init.dma_enable == 1U) - { - hpcd->IN_ep[epnum].xfer_buff += hpcd->IN_ep[epnum].maxpacket; - - /* this is ZLP, so prepare EP0 for next setup */ - if ((epnum == 0U) && (hpcd->IN_ep[epnum].xfer_len == 0U)) - { - /* prepare to rx more setup packets */ - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - } - } - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataInStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - if ((epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC) - { - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_TOC); - } - if ((epint & USB_OTG_DIEPINT_ITTXFE) == USB_OTG_DIEPINT_ITTXFE) - { - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_ITTXFE); - } - if ((epint & USB_OTG_DIEPINT_INEPNE) == USB_OTG_DIEPINT_INEPNE) - { - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_INEPNE); - } - if ((epint & USB_OTG_DIEPINT_EPDISD) == USB_OTG_DIEPINT_EPDISD) - { - (void)USB_FlushTxFifo(USBx, epnum); - - ep = &hpcd->IN_ep[epnum]; - - if (ep->is_iso_incomplete == 1U) - { - ep->is_iso_incomplete = 0U; - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->ISOINIncompleteCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_ISOINIncompleteCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_EPDISD); - } - if ((epint & USB_OTG_DIEPINT_TXFE) == USB_OTG_DIEPINT_TXFE) - { - (void)PCD_WriteEmptyTxFifo(hpcd, epnum); - } - } - epnum++; - ep_intr >>= 1U; - } - } - - /* Handle Resume Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT)) - { - /* Clear the Remote Wake-up Signaling */ - USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG; - - if (hpcd->LPM_State == LPM_L1) - { - hpcd->LPM_State = LPM_L0; - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->LPMCallback(hpcd, PCD_LPM_L0_ACTIVE); -#else - HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L0_ACTIVE); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - else - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->ResumeCallback(hpcd); -#else - HAL_PCD_ResumeCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT); - } - - /* Handle Suspend Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP)) - { - if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS) - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SuspendCallback(hpcd); -#else - HAL_PCD_SuspendCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP); - } -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \ - || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \ - || defined(STM32F423xx) - /* Handle LPM Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT)) - { - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT); - - if (hpcd->LPM_State == LPM_L0) - { - hpcd->LPM_State = LPM_L1; - hpcd->BESL = (hpcd->Instance->GLPMCFG & USB_OTG_GLPMCFG_BESL) >> 2U; - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->LPMCallback(hpcd, PCD_LPM_L1_ACTIVE); -#else - HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L1_ACTIVE); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - else - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SuspendCallback(hpcd); -#else - HAL_PCD_SuspendCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - } -#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || - defined(STM32F423xx) */ - /* Handle Reset Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBRST)) - { - USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG; - (void)USB_FlushTxFifo(hpcd->Instance, 0x10U); - - for (i = 0U; i < hpcd->Init.dev_endpoints; i++) - { - USBx_INEP(i)->DIEPINT = 0xFB7FU; - USBx_INEP(i)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; - USBx_OUTEP(i)->DOEPINT = 0xFB7FU; - USBx_OUTEP(i)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; - USBx_OUTEP(i)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; - } - USBx_DEVICE->DAINTMSK |= 0x10001U; - - if (hpcd->Init.use_dedicated_ep1 != 0U) - { - USBx_DEVICE->DOUTEP1MSK |= USB_OTG_DOEPMSK_STUPM | - USB_OTG_DOEPMSK_XFRCM | - USB_OTG_DOEPMSK_EPDM; - - USBx_DEVICE->DINEP1MSK |= USB_OTG_DIEPMSK_TOM | - USB_OTG_DIEPMSK_XFRCM | - USB_OTG_DIEPMSK_EPDM; - } - else - { - USBx_DEVICE->DOEPMSK |= USB_OTG_DOEPMSK_STUPM | - USB_OTG_DOEPMSK_XFRCM | - USB_OTG_DOEPMSK_EPDM | - USB_OTG_DOEPMSK_OTEPSPRM | - USB_OTG_DOEPMSK_NAKM; - - USBx_DEVICE->DIEPMSK |= USB_OTG_DIEPMSK_TOM | - USB_OTG_DIEPMSK_XFRCM | - USB_OTG_DIEPMSK_EPDM; - } - - /* Set Default Address to 0 */ - USBx_DEVICE->DCFG &= ~USB_OTG_DCFG_DAD; - - /* setup EP0 to receive SETUP packets */ - (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t)hpcd->Init.dma_enable, - (uint8_t *)hpcd->Setup); - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBRST); - } - - /* Handle Enumeration done Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE)) - { - (void)USB_ActivateSetup(hpcd->Instance); - hpcd->Init.speed = USB_GetDevSpeed(hpcd->Instance); - - /* Set USB Turnaround time */ - (void)USB_SetTurnaroundTime(hpcd->Instance, - HAL_RCC_GetHCLKFreq(), - (uint8_t)hpcd->Init.speed); - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->ResetCallback(hpcd); -#else - HAL_PCD_ResetCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE); - } - - /* Handle SOF Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF)) - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SOFCallback(hpcd); -#else - HAL_PCD_SOFCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SOF); - } - - /* Handle Global OUT NAK effective Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_BOUTNAKEFF)) - { - USBx->GINTMSK &= ~USB_OTG_GINTMSK_GONAKEFFM; - - for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++) - { - if (hpcd->OUT_ep[epnum].is_iso_incomplete == 1U) - { - /* Abort current transaction and disable the EP */ - (void)HAL_PCD_EP_Abort(hpcd, (uint8_t)epnum); - } - } - } - - /* Handle Incomplete ISO IN Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR)) - { - for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++) - { - RegVal = USBx_INEP(epnum)->DIEPCTL; - - if ((hpcd->IN_ep[epnum].type == EP_TYPE_ISOC) && - ((RegVal & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA)) - { - hpcd->IN_ep[epnum].is_iso_incomplete = 1U; - - /* Abort current transaction and disable the EP */ - (void)HAL_PCD_EP_Abort(hpcd, (uint8_t)(epnum | 0x80U)); - } - } - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR); - } - - /* Handle Incomplete ISO OUT Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT)) - { - for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++) - { - RegVal = USBx_OUTEP(epnum)->DOEPCTL; - - if ((hpcd->OUT_ep[epnum].type == EP_TYPE_ISOC) && - ((RegVal & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) && - ((RegVal & (0x1U << 16)) == (hpcd->FrameNumber & 0x1U))) - { - hpcd->OUT_ep[epnum].is_iso_incomplete = 1U; - - USBx->GINTMSK |= USB_OTG_GINTMSK_GONAKEFFM; - - if ((USBx->GINTSTS & USB_OTG_GINTSTS_BOUTNAKEFF) == 0U) - { - USBx_DEVICE->DCTL |= USB_OTG_DCTL_SGONAK; - break; - } - } - } - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT); - } - - /* Handle Connection event Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT)) - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->ConnectCallback(hpcd); -#else - HAL_PCD_ConnectCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT); - } - - /* Handle Disconnection event Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OTGINT)) - { - RegVal = hpcd->Instance->GOTGINT; - - if ((RegVal & USB_OTG_GOTGINT_SEDET) == USB_OTG_GOTGINT_SEDET) - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DisconnectCallback(hpcd); -#else - HAL_PCD_DisconnectCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - hpcd->Instance->GOTGINT |= RegVal; - } - } -} - - -/** - * @brief Handles PCD Wakeup interrupt request. - * @param hpcd PCD handle - * @retval HAL status - */ -void HAL_PCD_WKUP_IRQHandler(PCD_HandleTypeDef *hpcd) -{ -#if defined (USB_OTG_FS) - USB_OTG_GlobalTypeDef *USBx; - USBx = hpcd->Instance; - - if (USBx == USB_OTG_FS) - { - /* Clear EXTI pending Bit */ - __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG(); - } - else -#endif /* defined (USB_OTG_FS) */ - { - /* Clear EXTI pending Bit */ - __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG(); - } -} -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - - -/** - * @brief Data OUT stage callback. - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval None - */ -__weak void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - UNUSED(epnum); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_DataOutStageCallback could be implemented in the user file - */ -} - -/** - * @brief Data IN stage callback - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval None - */ -__weak void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - UNUSED(epnum); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_DataInStageCallback could be implemented in the user file - */ -} -/** - * @brief Setup stage callback - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_SetupStageCallback could be implemented in the user file - */ -} - -/** - * @brief USB Start Of Frame callback. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_SOFCallback could be implemented in the user file - */ -} - -/** - * @brief USB Reset callback. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_ResetCallback could be implemented in the user file - */ -} - -/** - * @brief Suspend event callback. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_SuspendCallback could be implemented in the user file - */ -} - -/** - * @brief Resume event callback. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_ResumeCallback could be implemented in the user file - */ -} - -/** - * @brief Incomplete ISO OUT callback. - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval None - */ -__weak void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - UNUSED(epnum); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_ISOOUTIncompleteCallback could be implemented in the user file - */ -} - -/** - * @brief Incomplete ISO IN callback. - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval None - */ -__weak void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - UNUSED(epnum); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_ISOINIncompleteCallback could be implemented in the user file - */ -} - -/** - * @brief Connection event callback. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_ConnectCallback could be implemented in the user file - */ -} - -/** - * @brief Disconnection event callback. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_DisconnectCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup PCD_Exported_Functions_Group3 Peripheral Control functions - * @brief management functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the PCD data - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Connect the USB device - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - __HAL_LOCK(hpcd); - - if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) && - (hpcd->Init.battery_charging_enable == 1U)) - { - /* Enable USB Transceiver */ - USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN; - } - (void)USB_DevConnect(hpcd->Instance); - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Disconnect the USB device. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - __HAL_LOCK(hpcd); - (void)USB_DevDisconnect(hpcd->Instance); - - if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) && - (hpcd->Init.battery_charging_enable == 1U)) - { - /* Disable USB Transceiver */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN); - } - - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Set the USB Device address. - * @param hpcd PCD handle - * @param address new device address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address) -{ - __HAL_LOCK(hpcd); - hpcd->USB_Address = address; - (void)USB_SetDevAddress(hpcd->Instance, address); - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} -/** - * @brief Open and configure an endpoint. - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @param ep_mps endpoint max packet size - * @param ep_type endpoint type - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, - uint16_t ep_mps, uint8_t ep_type) -{ - HAL_StatusTypeDef ret = HAL_OK; - PCD_EPTypeDef *ep; - - if ((ep_addr & 0x80U) == 0x80U) - { - ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 1U; - } - else - { - ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 0U; - } - - ep->num = ep_addr & EP_ADDR_MSK; - ep->maxpacket = (uint32_t)ep_mps & 0x7FFU; - ep->type = ep_type; - - if (ep->is_in != 0U) - { - /* Assign a Tx FIFO */ - ep->tx_fifo_num = ep->num; - } - - /* Set initial data PID. */ - if (ep_type == EP_TYPE_BULK) - { - ep->data_pid_start = 0U; - } - - __HAL_LOCK(hpcd); - (void)USB_ActivateEndpoint(hpcd->Instance, ep); - __HAL_UNLOCK(hpcd); - - return ret; -} - -/** - * @brief Deactivate an endpoint. - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - PCD_EPTypeDef *ep; - - if ((ep_addr & 0x80U) == 0x80U) - { - ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 1U; - } - else - { - ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 0U; - } - ep->num = ep_addr & EP_ADDR_MSK; - - __HAL_LOCK(hpcd); - (void)USB_DeactivateEndpoint(hpcd->Instance, ep); - __HAL_UNLOCK(hpcd); - return HAL_OK; -} - - -/** - * @brief Receive an amount of data. - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @param pBuf pointer to the reception buffer - * @param len amount of data to be received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) -{ - PCD_EPTypeDef *ep; - - ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; - - /*setup and start the Xfer */ - ep->xfer_buff = pBuf; - ep->xfer_len = len; - ep->xfer_count = 0U; - ep->is_in = 0U; - ep->num = ep_addr & EP_ADDR_MSK; - - if (hpcd->Init.dma_enable == 1U) - { - ep->dma_addr = (uint32_t)pBuf; - } - - (void)USB_EPStartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable); - - return HAL_OK; -} - -/** - * @brief Get Received Data Size - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @retval Data Size - */ -uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef const *hpcd, uint8_t ep_addr) -{ - return hpcd->OUT_ep[ep_addr & EP_ADDR_MSK].xfer_count; -} -/** - * @brief Send an amount of data - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @param pBuf pointer to the transmission buffer - * @param len amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) -{ - PCD_EPTypeDef *ep; - - ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; - - /*setup and start the Xfer */ - ep->xfer_buff = pBuf; - ep->xfer_len = len; - ep->xfer_count = 0U; - ep->is_in = 1U; - ep->num = ep_addr & EP_ADDR_MSK; - - if (hpcd->Init.dma_enable == 1U) - { - ep->dma_addr = (uint32_t)pBuf; - } - - (void)USB_EPStartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable); - - return HAL_OK; -} - -/** - * @brief Set a STALL condition over an endpoint - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - PCD_EPTypeDef *ep; - - if (((uint32_t)ep_addr & EP_ADDR_MSK) > hpcd->Init.dev_endpoints) - { - return HAL_ERROR; - } - - if ((0x80U & ep_addr) == 0x80U) - { - ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 1U; - } - else - { - ep = &hpcd->OUT_ep[ep_addr]; - ep->is_in = 0U; - } - - ep->is_stall = 1U; - ep->num = ep_addr & EP_ADDR_MSK; - - __HAL_LOCK(hpcd); - - (void)USB_EPSetStall(hpcd->Instance, ep); - - if ((ep_addr & EP_ADDR_MSK) == 0U) - { - (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t)hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup); - } - - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Clear a STALL condition over in an endpoint - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - PCD_EPTypeDef *ep; - - if (((uint32_t)ep_addr & 0x0FU) > hpcd->Init.dev_endpoints) - { - return HAL_ERROR; - } - - if ((0x80U & ep_addr) == 0x80U) - { - ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 1U; - } - else - { - ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 0U; - } - - ep->is_stall = 0U; - ep->num = ep_addr & EP_ADDR_MSK; - - __HAL_LOCK(hpcd); - (void)USB_EPClearStall(hpcd->Instance, ep); - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Abort an USB EP transaction. - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Abort(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - HAL_StatusTypeDef ret; - PCD_EPTypeDef *ep; - - if ((0x80U & ep_addr) == 0x80U) - { - ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; - } - else - { - ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; - } - - /* Stop Xfer */ - ret = USB_EPStopXfer(hpcd->Instance, ep); - - return ret; -} - -/** - * @brief Flush an endpoint - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - __HAL_LOCK(hpcd); - - if ((ep_addr & 0x80U) == 0x80U) - { - (void)USB_FlushTxFifo(hpcd->Instance, (uint32_t)ep_addr & EP_ADDR_MSK); - } - else - { - (void)USB_FlushRxFifo(hpcd->Instance); - } - - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Activate remote wakeup signalling - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd) -{ - return (USB_ActivateRemoteWakeup(hpcd->Instance)); -} - -/** - * @brief De-activate remote wakeup signalling. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd) -{ - return (USB_DeActivateRemoteWakeup(hpcd->Instance)); -} - -/** - * @} - */ - -/** @defgroup PCD_Exported_Functions_Group4 Peripheral State functions - * @brief Peripheral State functions - * -@verbatim - =============================================================================== - ##### Peripheral State functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the PCD handle state. - * @param hpcd PCD handle - * @retval HAL state - */ -PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef const *hpcd) -{ - return hpcd->State; -} - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** - * @brief Set the USB Device high speed test mode. - * @param hpcd PCD handle - * @param testmode USB Device high speed test mode - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_SetTestMode(const PCD_HandleTypeDef *hpcd, uint8_t testmode) -{ - const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - uint32_t USBx_BASE = (uint32_t)USBx; - - switch (testmode) - { - case TEST_J: - case TEST_K: - case TEST_SE0_NAK: - case TEST_PACKET: - case TEST_FORCE_EN: - USBx_DEVICE->DCTL |= (uint32_t)testmode << 4; - break; - - default: - break; - } - - return HAL_OK; -} -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup PCD_Private_Functions - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** - * @brief Check FIFO for the next packet to be loaded. - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval HAL status - */ -static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - uint32_t USBx_BASE = (uint32_t)USBx; - USB_OTG_EPTypeDef *ep; - uint32_t len; - uint32_t len32b; - uint32_t fifoemptymsk; - - ep = &hpcd->IN_ep[epnum]; - - if (ep->xfer_count > ep->xfer_len) - { - return HAL_ERROR; - } - - len = ep->xfer_len - ep->xfer_count; - - if (len > ep->maxpacket) - { - len = ep->maxpacket; - } - - len32b = (len + 3U) / 4U; - - while (((USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b) && - (ep->xfer_count < ep->xfer_len) && (ep->xfer_len != 0U)) - { - /* Write the FIFO */ - len = ep->xfer_len - ep->xfer_count; - - if (len > ep->maxpacket) - { - len = ep->maxpacket; - } - len32b = (len + 3U) / 4U; - - (void)USB_WritePacket(USBx, ep->xfer_buff, (uint8_t)epnum, (uint16_t)len, - (uint8_t)hpcd->Init.dma_enable); - - ep->xfer_buff += len; - ep->xfer_count += len; - } - - if (ep->xfer_len <= ep->xfer_count) - { - fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK)); - USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk; - } - - return HAL_OK; -} - - -/** - * @brief process EP OUT transfer complete interrupt. - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval HAL status - */ -static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum) -{ - USB_OTG_EPTypeDef *ep; - const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t gSNPSiD = *(__IO const uint32_t *)(&USBx->CID + 0x1U); - uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT; - - if (hpcd->Init.dma_enable == 1U) - { - if ((DoepintReg & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) /* Class C */ - { - /* StupPktRcvd = 1 this is a setup packet */ - if ((gSNPSiD > USB_OTG_CORE_ID_300A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } - } - else if ((DoepintReg & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) /* Class E */ - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR); - } - else if ((DoepintReg & (USB_OTG_DOEPINT_STUP | USB_OTG_DOEPINT_OTEPSPR)) == 0U) - { - /* StupPktRcvd = 1 this is a setup packet */ - if ((gSNPSiD > USB_OTG_CORE_ID_300A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } - else - { - ep = &hpcd->OUT_ep[epnum]; - - /* out data packet received over EP */ - ep->xfer_count = ep->xfer_size - (USBx_OUTEP(epnum)->DOEPTSIZ & USB_OTG_DOEPTSIZ_XFRSIZ); - - if (epnum == 0U) - { - if (ep->xfer_len == 0U) - { - /* this is ZLP, so prepare EP0 for next setup */ - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - } - else - { - ep->xfer_buff += ep->xfer_count; - } - } - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - } - else - { - /* ... */ - } - } - else - { - if (gSNPSiD == USB_OTG_CORE_ID_310A) - { - /* StupPktRcvd = 1 this is a setup packet */ - if ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } - else - { - if ((DoepintReg & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR); - } - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - } - else - { - if ((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U)) - { - /* this is ZLP, so prepare EP0 for next setup */ - (void)USB_EP0_OutStart(hpcd->Instance, 0U, (uint8_t *)hpcd->Setup); - } - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - } - - return HAL_OK; -} - - -/** - * @brief process EP OUT setup packet received interrupt. - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval HAL status - */ -static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum) -{ - const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t gSNPSiD = *(__IO const uint32_t *)(&USBx->CID + 0x1U); - uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT; - - if ((gSNPSiD > USB_OTG_CORE_ID_300A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } - - /* Inform the upper layer that a setup packet is available */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SetupStageCallback(hpcd); -#else - HAL_PCD_SetupStageCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - if ((gSNPSiD > USB_OTG_CORE_ID_300A) && (hpcd->Init.dma_enable == 1U)) - { - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - } - - return HAL_OK; -} -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -#endif /* HAL_PCD_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c deleted file mode 100644 index b66be6a..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c +++ /dev/null @@ -1,347 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pcd_ex.c - * @author MCD Application Team - * @brief PCD Extended HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the USB Peripheral Controller: - * + Extended features functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PCDEx PCDEx - * @brief PCD Extended HAL module driver - * @{ - */ - -#ifdef HAL_PCD_MODULE_ENABLED - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup PCDEx_Exported_Functions PCDEx Exported Functions - * @{ - */ - -/** @defgroup PCDEx_Exported_Functions_Group1 Peripheral Control functions - * @brief PCDEx control functions - * -@verbatim - =============================================================================== - ##### Extended features functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Update FIFO configuration - -@endverbatim - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** - * @brief Set Tx FIFO - * @param hpcd PCD handle - * @param fifo The number of Tx fifo - * @param size Fifo size - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size) -{ - uint8_t i; - uint32_t Tx_Offset; - - /* TXn min size = 16 words. (n : Transmit FIFO index) - When a TxFIFO is not used, the Configuration should be as follows: - case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes) - --> Txm can use the space allocated for Txn. - case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes) - --> Txn should be configured with the minimum space of 16 words - The FIFO is used optimally when used TxFIFOs are allocated in the top - of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones. - When DMA is used 3n * FIFO locations should be reserved for internal DMA registers */ - - Tx_Offset = hpcd->Instance->GRXFSIZ; - - if (fifo == 0U) - { - hpcd->Instance->DIEPTXF0_HNPTXFSIZ = ((uint32_t)size << 16) | Tx_Offset; - } - else - { - Tx_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16; - for (i = 0U; i < (fifo - 1U); i++) - { - Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16); - } - - /* Multiply Tx_Size by 2 to get higher performance */ - hpcd->Instance->DIEPTXF[fifo - 1U] = ((uint32_t)size << 16) | Tx_Offset; - } - - return HAL_OK; -} - -/** - * @brief Set Rx FIFO - * @param hpcd PCD handle - * @param size Size of Rx fifo - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size) -{ - hpcd->Instance->GRXFSIZ = size; - - return HAL_OK; -} -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \ - || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \ - || defined(STM32F423xx) -/** - * @brief Activate LPM feature. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - hpcd->lpm_active = 1U; - hpcd->LPM_State = LPM_L0; - USBx->GINTMSK |= USB_OTG_GINTMSK_LPMINTM; - USBx->GLPMCFG |= (USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL); - - return HAL_OK; -} - -/** - * @brief Deactivate LPM feature. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - hpcd->lpm_active = 0U; - USBx->GINTMSK &= ~USB_OTG_GINTMSK_LPMINTM; - USBx->GLPMCFG &= ~(USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL); - - return HAL_OK; -} -#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || - defined(STM32F423xx) */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) \ - || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Handle BatteryCharging Process. - * @param hpcd PCD handle - * @retval HAL status - */ -void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - uint32_t tickstart = HAL_GetTick(); - - /* Enable DCD : Data Contact Detect */ - USBx->GCCFG |= USB_OTG_GCCFG_DCDEN; - - /* Wait for Min DCD Timeout */ - HAL_Delay(300U); - - /* Check Detect flag */ - if ((USBx->GCCFG & USB_OTG_GCCFG_DCDET) == USB_OTG_GCCFG_DCDET) - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->BCDCallback(hpcd, PCD_BCD_CONTACT_DETECTION); -#else - HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CONTACT_DETECTION); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - - /* Primary detection: checks if connected to Standard Downstream Port - (without charging capability) */ - USBx->GCCFG &= ~USB_OTG_GCCFG_DCDEN; - HAL_Delay(50U); - USBx->GCCFG |= USB_OTG_GCCFG_PDEN; - HAL_Delay(50U); - - if ((USBx->GCCFG & USB_OTG_GCCFG_PDET) == 0U) - { - /* Case of Standard Downstream Port */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->BCDCallback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT); -#else - HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - else - { - /* start secondary detection to check connection to Charging Downstream - Port or Dedicated Charging Port */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN); - HAL_Delay(50U); - USBx->GCCFG |= USB_OTG_GCCFG_SDEN; - HAL_Delay(50U); - - if ((USBx->GCCFG & USB_OTG_GCCFG_SDET) == USB_OTG_GCCFG_SDET) - { - /* case Dedicated Charging Port */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->BCDCallback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT); -#else - HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - else - { - /* case Charging Downstream Port */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->BCDCallback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT); -#else - HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - } - - /* Battery Charging capability discovery finished */ - (void)HAL_PCDEx_DeActivateBCD(hpcd); - - /* Check for the Timeout, else start USB Device */ - if ((HAL_GetTick() - tickstart) > 1000U) - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->BCDCallback(hpcd, PCD_BCD_ERROR); -#else - HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_ERROR); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - else - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->BCDCallback(hpcd, PCD_BCD_DISCOVERY_COMPLETED); -#else - HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DISCOVERY_COMPLETED); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } -} - -/** - * @brief Activate BatteryCharging feature. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCDEx_ActivateBCD(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN); - USBx->GCCFG &= ~(USB_OTG_GCCFG_SDEN); - - /* Power Down USB transceiver */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN); - - /* Enable Battery charging */ - USBx->GCCFG |= USB_OTG_GCCFG_BCDEN; - - hpcd->battery_charging_active = 1U; - - return HAL_OK; -} - -/** - * @brief Deactivate BatteryCharging feature. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCDEx_DeActivateBCD(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - USBx->GCCFG &= ~(USB_OTG_GCCFG_SDEN); - USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN); - - /* Disable Battery charging */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_BCDEN); - - hpcd->battery_charging_active = 0U; - - return HAL_OK; -} -#endif /* defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -/** - * @brief Send LPM message to user layer callback. - * @param hpcd PCD handle - * @param msg LPM message - * @retval HAL status - */ -__weak void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - UNUSED(msg); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCDEx_LPM_Callback could be implemented in the user file - */ -} - -/** - * @brief Send BatteryCharging message to user layer callback. - * @param hpcd PCD handle - * @param msg LPM message - * @retval HAL status - */ -__weak void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - UNUSED(msg); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCDEx_BCD_Callback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -#endif /* HAL_PCD_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c deleted file mode 100644 index 5ccde64..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c +++ /dev/null @@ -1,598 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr.c - * @author MCD Application Team - * @brief PWR HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Power Controller (PWR) peripheral: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PWR PWR - * @brief PWR HAL module driver - * @{ - */ - -#ifdef HAL_PWR_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup PWR_Private_Constants - * @{ - */ - -/** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask - * @{ - */ -#define PVD_MODE_IT 0x00010000U -#define PVD_MODE_EVT 0x00020000U -#define PVD_RISING_EDGE 0x00000001U -#define PVD_FALLING_EDGE 0x00000002U -/** - * @} - */ - -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup PWR_Exported_Functions PWR Exported Functions - * @{ - */ - -/** @defgroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - After reset, the backup domain (RTC registers, RTC backup data - registers and backup SRAM) is protected against possible unwanted - write accesses. - To enable access to the RTC Domain and RTC registers, proceed as follows: - (+) Enable the Power Controller (PWR) APB1 interface clock using the - __HAL_RCC_PWR_CLK_ENABLE() macro. - (+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the HAL PWR peripheral registers to their default reset values. - * @retval None - */ -void HAL_PWR_DeInit(void) -{ - __HAL_RCC_PWR_FORCE_RESET(); - __HAL_RCC_PWR_RELEASE_RESET(); -} - -/** - * @brief Enables access to the backup domain (RTC registers, RTC - * backup data registers and backup SRAM). - * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the - * Backup Domain Access should be kept enabled. - * @note The following sequence is required to bypass the delay between - * DBP bit programming and the effective enabling of the backup domain. - * Please check the Errata Sheet for more details under "Possible delay - * in backup domain protection disabling/enabling after programming the - * DBP bit" section. - * @retval None - */ -void HAL_PWR_EnableBkUpAccess(void) -{ - __IO uint32_t dummyread; - *(__IO uint32_t *) CR_DBP_BB = (uint32_t)ENABLE; - dummyread = PWR->CR; - UNUSED(dummyread); -} - -/** - * @brief Disables access to the backup domain (RTC registers, RTC - * backup data registers and backup SRAM). - * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the - * Backup Domain Access should be kept enabled. - * @note The following sequence is required to bypass the delay between - * DBP bit programming and the effective disabling of the backup domain. - * Please check the Errata Sheet for more details under "Possible delay - * in backup domain protection disabling/enabling after programming the - * DBP bit" section. - * @retval None - */ -void HAL_PWR_DisableBkUpAccess(void) -{ - __IO uint32_t dummyread; - *(__IO uint32_t *) CR_DBP_BB = (uint32_t)DISABLE; - dummyread = PWR->CR; - UNUSED(dummyread); -} - -/** - * @} - */ - -/** @defgroup PWR_Exported_Functions_Group2 Peripheral Control functions - * @brief Low Power modes configuration functions - * -@verbatim - - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - - *** PVD configuration *** - ========================= - [..] - (+) The PVD is used to monitor the VDD power supply by comparing it to a - threshold selected by the PVD Level (PLS[2:0] bits in the PWR_CR). - (+) A PVDO flag is available to indicate if VDD/VDDA is higher or lower - than the PVD threshold. This event is internally connected to the EXTI - line16 and can generate an interrupt if enabled. This is done through - __HAL_PWR_PVD_EXTI_ENABLE_IT() macro. - (+) The PVD is stopped in Standby mode. - - *** Wake-up pin configuration *** - ================================ - [..] - (+) Wake-up pin is used to wake up the system from Standby mode. This pin is - forced in input pull-down configuration and is active on rising edges. - (+) There is one Wake-up pin: Wake-up Pin 1 on PA.00. - (++) For STM32F446xx there are two Wake-Up pins: Pin1 on PA.00 and Pin2 on PC.13 - (++) For STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx there are three Wake-Up pins: Pin1 on PA.00, Pin2 on PC.00 and Pin3 on PC.01 - - *** Low Power modes configuration *** - ===================================== - [..] - The devices feature 3 low-power modes: - (+) Sleep mode: Cortex-M4 core stopped, peripherals kept running. - (+) Stop mode: all clocks are stopped, regulator running, regulator - in low power mode - (+) Standby mode: 1.2V domain powered off. - - *** Sleep mode *** - ================== - [..] - (+) Entry: - The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(Regulator, SLEEPEntry) - functions with - (++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction - (++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction - (++) PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR: Enter SLEEP mode with WFE instruction and - no clear of pending event before. - - -@@- The Regulator parameter is not used for the STM32F4 family - and is kept as parameter just to maintain compatibility with the - lower power families (STM32L). - (+) Exit: - Any peripheral interrupt acknowledged by the nested vectored interrupt - controller (NVIC) can wake up the device from Sleep mode. - - *** Stop mode *** - ================= - [..] - In Stop mode, all clocks in the 1.2V domain are stopped, the PLL, the HSI, - and the HSE RC oscillators are disabled. Internal SRAM and register contents - are preserved. - The voltage regulator can be configured either in normal or low-power mode. - To minimize the consumption In Stop mode, FLASH can be powered off before - entering the Stop mode using the HAL_PWREx_EnableFlashPowerDown() function. - It can be switched on again by software after exiting the Stop mode using - the HAL_PWREx_DisableFlashPowerDown() function. - - (+) Entry: - The Stop mode is entered using the HAL_PWR_EnterSTOPMode(Regulator, STOPEntry) - function with: - (++) Regulator: - (+++) Main regulator ON. - (+++) Low Power regulator ON. - (++) STOPEntry: - (+++) PWR_STOPENTRY_WFI : Enter STOP mode with WFI instruction. - (+++) PWR_STOPENTRY_WFE : Enter STOP mode with WFE instruction and - clear of pending events before. - (+++) PWR_STOPENTRY_WFE_NO_EVT_CLEAR : Enter STOP mode with WFE instruction and - no clear of pending event before. - (+) Exit: - Any EXTI Line (Internal or External) configured in Interrupt/Event mode. - - *** Standby mode *** - ==================== - [..] - (+) - The Standby mode allows to achieve the lowest power consumption. It is based - on the Cortex-M4 deep sleep mode, with the voltage regulator disabled. - The 1.2V domain is consequently powered off. The PLL, the HSI oscillator and - the HSE oscillator are also switched off. SRAM and register contents are lost - except for the RTC registers, RTC backup registers, backup SRAM and Standby - circuitry. - - The voltage regulator is OFF. - - (++) Entry: - (+++) The Standby mode is entered using the HAL_PWR_EnterSTANDBYMode() function. - (++) Exit: - (+++) WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wake-up, - tamper event, time-stamp event, external reset in NRST pin, IWDG reset. - - *** Auto-wake-up (AWU) from low-power mode *** - ============================================= - [..] - - (+) The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC - Wake-up event, a tamper event or a time-stamp event, without depending on - an external interrupt (Auto-wake-up mode). - - (+) RTC auto-wake-up (AWU) from the Stop and Standby modes - - (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to - configure the RTC to generate the RTC alarm using the HAL_RTC_SetAlarm_IT() function. - - (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it - is necessary to configure the RTC to detect the tamper or time stamp event using the - HAL_RTCEx_SetTimeStamp_IT() or HAL_RTCEx_SetTamper_IT() functions. - - (++) To wake up from the Stop mode with an RTC Wake-up event, it is necessary to - configure the RTC to generate the RTC Wake-up event using the HAL_RTCEx_SetWakeUpTimer_IT() function. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). - * @param sConfigPVD pointer to an PWR_PVDTypeDef structure that contains the configuration - * information for the PVD. - * @note Refer to the electrical characteristics of your device datasheet for - * more details about the voltage threshold corresponding to each - * detection level. - * @retval None - */ -void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD) -{ - /* Check the parameters */ - assert_param(IS_PWR_PVD_LEVEL(sConfigPVD->PVDLevel)); - assert_param(IS_PWR_PVD_MODE(sConfigPVD->Mode)); - - /* Set PLS[7:5] bits according to PVDLevel value */ - MODIFY_REG(PWR->CR, PWR_CR_PLS, sConfigPVD->PVDLevel); - - /* Clear any previous config. Keep it clear if no event or IT mode is selected */ - __HAL_PWR_PVD_EXTI_DISABLE_EVENT(); - __HAL_PWR_PVD_EXTI_DISABLE_IT(); - __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); - __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); - - /* Configure interrupt mode */ - if((sConfigPVD->Mode & PVD_MODE_IT) == PVD_MODE_IT) - { - __HAL_PWR_PVD_EXTI_ENABLE_IT(); - } - - /* Configure event mode */ - if((sConfigPVD->Mode & PVD_MODE_EVT) == PVD_MODE_EVT) - { - __HAL_PWR_PVD_EXTI_ENABLE_EVENT(); - } - - /* Configure the edge */ - if((sConfigPVD->Mode & PVD_RISING_EDGE) == PVD_RISING_EDGE) - { - __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE(); - } - - if((sConfigPVD->Mode & PVD_FALLING_EDGE) == PVD_FALLING_EDGE) - { - __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); - } -} - -/** - * @brief Enables the Power Voltage Detector(PVD). - * @retval None - */ -void HAL_PWR_EnablePVD(void) -{ - *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Power Voltage Detector(PVD). - * @retval None - */ -void HAL_PWR_DisablePVD(void) -{ - *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)DISABLE; -} - -/** - * @brief Enables the Wake-up PINx functionality. - * @param WakeUpPinx Specifies the Power Wake-Up pin to enable. - * This parameter can be one of the following values: - * @arg PWR_WAKEUP_PIN1 - * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @retval None - */ -void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx) -{ - /* Check the parameter */ - assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); - - /* Enable the wake up pin */ - SET_BIT(PWR->CSR, WakeUpPinx); -} - -/** - * @brief Disables the Wake-up PINx functionality. - * @param WakeUpPinx Specifies the Power Wake-Up pin to disable. - * This parameter can be one of the following values: - * @arg PWR_WAKEUP_PIN1 - * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @retval None - */ -void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) -{ - /* Check the parameter */ - assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); - - /* Disable the wake up pin */ - CLEAR_BIT(PWR->CSR, WakeUpPinx); -} - -/** - * @brief Enters Sleep mode. - * - * @note In Sleep mode, all I/O pins keep the same state as in Run mode. - * - * @note In Sleep mode, the systick is stopped to avoid exit from this mode with - * systick interrupt when used as time base for Timeout - * - * @param Regulator Specifies the regulator state in SLEEP mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_ON: SLEEP mode with regulator ON - * @arg PWR_LOWPOWERREGULATOR_ON: SLEEP mode with low power regulator ON - * @note This parameter is not used for the STM32F4 family and is kept as parameter - * just to maintain compatibility with the lower power families. - * @param SLEEPEntry Specifies if SLEEP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_SLEEPENTRY_WFI : Enter SLEEP mode with WFI instruction - * @arg PWR_SLEEPENTRY_WFE : Enter SLEEP mode with WFE instruction and - * clear of pending events before. - * @arg PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR : Enter SLEEP mode with WFE instruction and - * no clear of pending event before. - * @retval None - */ -void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(Regulator); - - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR(Regulator)); - assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); - - /* Clear SLEEPDEEP bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* Select SLEEP mode entry -------------------------------------------------*/ - if(SLEEPEntry == PWR_SLEEPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - if(SLEEPEntry != PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR) - { - /* Clear all pending event */ - __SEV(); - __WFE(); - } - - /* Request Wait For Event */ - __WFE(); - } -} - -/** - * @brief Enters Stop mode. - * @note In Stop mode, all I/O pins keep the same state as in Run mode. - * @note When exiting Stop mode by issuing an interrupt or a wake-up event, - * the HSI RC oscillator is selected as system clock. - * @note When the voltage regulator operates in low power mode, an additional - * startup delay is incurred when waking up from Stop mode. - * By keeping the internal regulator ON during Stop mode, the consumption - * is higher although the startup time is reduced. - * @param Regulator Specifies the regulator state in Stop mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_ON: Stop mode with regulator ON - * @arg PWR_LOWPOWERREGULATOR_ON: Stop mode with low power regulator ON - * @param STOPEntry Specifies if Stop mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_STOPENTRY_WFI : Enter Stop mode with WFI instruction - * @arg PWR_STOPENTRY_WFE : Enter Stop mode with WFE instruction and - * clear of pending events before. - * @arg PWR_STOPENTRY_WFE_NO_EVT_CLEAR : Enter STOP mode with WFE instruction and - * no clear of pending event before. - * @retval None - */ -void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) -{ - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR(Regulator)); - assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); - - /* Select the regulator state in Stop mode: Set PDDS and LPDS bits according to PWR_Regulator value */ - MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS), Regulator); - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* Select Stop mode entry --------------------------------------------------*/ - if(STOPEntry == PWR_STOPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - if(STOPEntry != PWR_STOPENTRY_WFE_NO_EVT_CLEAR) - { - /* Clear all pending event */ - __SEV(); - __WFE(); - } - /* Request Wait For Event */ - __WFE(); - } - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); -} - -/** - * @brief Enters Standby mode. - * @note In Standby mode, all I/O pins are high impedance except for: - * - Reset pad (still available) - * - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC - * Alarm out, or RTC clock calibration out. - * - RTC_AF2 pin (PI8) if configured for tamper or time-stamp. - * - WKUP pin 1 (PA0) if enabled. - * @retval None - */ -void HAL_PWR_EnterSTANDBYMode(void) -{ - /* Select Standby mode */ - SET_BIT(PWR->CR, PWR_CR_PDDS); - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* This option is used to ensure that store operations are completed */ -#if defined ( __CC_ARM) - __force_stores(); -#endif - /* Request Wait For Interrupt */ - __WFI(); -} - -/** - * @brief This function handles the PWR PVD interrupt request. - * @note This API should be called under the PVD_IRQHandler(). - * @retval None - */ -void HAL_PWR_PVD_IRQHandler(void) -{ - /* Check PWR Exti flag */ - if(__HAL_PWR_PVD_EXTI_GET_FLAG() != RESET) - { - /* PWR PVD interrupt user callback */ - HAL_PWR_PVDCallback(); - - /* Clear PWR Exti pending bit */ - __HAL_PWR_PVD_EXTI_CLEAR_FLAG(); - } -} - -/** - * @brief PWR PVD interrupt callback - * @retval None - */ -__weak void HAL_PWR_PVDCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PWR_PVDCallback could be implemented in the user file - */ -} - -/** - * @brief Indicates Sleep-On-Exit when returning from Handler mode to Thread mode. - * @note Set SLEEPONEXIT bit of SCR register. When this bit is set, the processor - * re-enters SLEEP mode when an interruption handling is over. - * Setting this bit is useful when the processor is expected to run only on - * interruptions handling. - * @retval None - */ -void HAL_PWR_EnableSleepOnExit(void) -{ - /* Set SLEEPONEXIT bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Disables Sleep-On-Exit feature when returning from Handler mode to Thread mode. - * @note Clears SLEEPONEXIT bit of SCR register. When this bit is set, the processor - * re-enters SLEEP mode when an interruption handling is over. - * @retval None - */ -void HAL_PWR_DisableSleepOnExit(void) -{ - /* Clear SLEEPONEXIT bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Enables CORTEX M4 SEVONPEND bit. - * @note Sets SEVONPEND bit of SCR register. When this bit is set, this causes - * WFE to wake up when an interrupt moves from inactive to pended. - * @retval None - */ -void HAL_PWR_EnableSEVOnPend(void) -{ - /* Set SEVONPEND bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @brief Disables CORTEX M4 SEVONPEND bit. - * @note Clears SEVONPEND bit of SCR register. When this bit is set, this causes - * WFE to wake up when an interrupt moves from inactive to pended. - * @retval None - */ -void HAL_PWR_DisableSEVOnPend(void) -{ - /* Clear SEVONPEND bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_PWR_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c deleted file mode 100644 index 77f9c35..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c +++ /dev/null @@ -1,600 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr_ex.c - * @author MCD Application Team - * @brief Extended PWR HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of PWR extension peripheral: - * + Peripheral Extended features functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PWREx PWREx - * @brief PWR HAL module driver - * @{ - */ - -#ifdef HAL_PWR_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup PWREx_Private_Constants - * @{ - */ -#define PWR_OVERDRIVE_TIMEOUT_VALUE 1000U -#define PWR_UDERDRIVE_TIMEOUT_VALUE 1000U -#define PWR_BKPREG_TIMEOUT_VALUE 1000U -#define PWR_VOSRDY_TIMEOUT_VALUE 1000U -/** - * @} - */ - - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Functions PWREx Exported Functions - * @{ - */ - -/** @defgroup PWREx_Exported_Functions_Group1 Peripheral Extended features functions - * @brief Peripheral Extended features functions - * -@verbatim - - =============================================================================== - ##### Peripheral extended features functions ##### - =============================================================================== - - *** Main and Backup Regulators configuration *** - ================================================ - [..] - (+) The backup domain includes 4 Kbytes of backup SRAM accessible only from - the CPU, and address in 32-bit, 16-bit or 8-bit mode. Its content is - retained even in Standby or VBAT mode when the low power backup regulator - is enabled. It can be considered as an internal EEPROM when VBAT is - always present. You can use the HAL_PWREx_EnableBkUpReg() function to - enable the low power backup regulator. - - (+) When the backup domain is supplied by VDD (analog switch connected to VDD) - the backup SRAM is powered from VDD which replaces the VBAT power supply to - save battery life. - - (+) The backup SRAM is not mass erased by a tamper event. It is read - protected to prevent confidential data, such as cryptographic private - key, from being accessed. The backup SRAM can be erased only through - the Flash interface when a protection level change from level 1 to - level 0 is requested. - -@- Refer to the description of Read protection (RDP) in the Flash - programming manual. - - (+) The main internal regulator can be configured to have a tradeoff between - performance and power consumption when the device does not operate at - the maximum frequency. This is done through __HAL_PWR_MAINREGULATORMODE_CONFIG() - macro which configure VOS bit in PWR_CR register - - Refer to the product datasheets for more details. - - *** FLASH Power Down configuration **** - ======================================= - [..] - (+) By setting the FPDS bit in the PWR_CR register by using the - HAL_PWREx_EnableFlashPowerDown() function, the Flash memory also enters power - down mode when the device enters Stop mode. When the Flash memory - is in power down mode, an additional startup delay is incurred when - waking up from Stop mode. - - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, the scale can be modified only when the PLL - is OFF and the HSI or HSE clock source is selected as system clock. - The new value programmed is active only when the PLL is ON. - When the PLL is OFF, the voltage scale 3 is automatically selected. - Refer to the datasheets for more details. - - *** Over-Drive and Under-Drive configuration **** - ================================================= - [..] - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Run mode: the main regulator has - 2 operating modes available: - (++) Normal mode: The CPU and core logic operate at maximum frequency at a given - voltage scaling (scale 1, scale 2 or scale 3) - (++) Over-drive mode: This mode allows the CPU and the core logic to operate at a - higher frequency than the normal mode for a given voltage scaling (scale 1, - scale 2 or scale 3). This mode is enabled through HAL_PWREx_EnableOverDrive() function and - disabled by HAL_PWREx_DisableOverDrive() function, to enter or exit from Over-drive mode please follow - the sequence described in Reference manual. - - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Stop mode: the main regulator or low power regulator - supplies a low power voltage to the 1.2V domain, thus preserving the content of registers - and internal SRAM. 2 operating modes are available: - (++) Normal mode: the 1.2V domain is preserved in nominal leakage mode. This mode is only - available when the main regulator or the low power regulator is used in Scale 3 or - low voltage mode. - (++) Under-drive mode: the 1.2V domain is preserved in reduced leakage mode. This mode is only - available when the main regulator or the low power regulator is in low voltage mode. - -@endverbatim - * @{ - */ - -/** - * @brief Enables the Backup Regulator. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void) -{ - uint32_t tickstart = 0U; - - *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)ENABLE; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till Backup regulator ready flag is set */ - while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) == RESET) - { - if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Disables the Backup Regulator. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void) -{ - uint32_t tickstart = 0U; - - *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)DISABLE; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till Backup regulator ready flag is set */ - while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) != RESET) - { - if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Enables the Flash Power Down in Stop mode. - * @retval None - */ -void HAL_PWREx_EnableFlashPowerDown(void) -{ - *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Flash Power Down in Stop mode. - * @retval None - */ -void HAL_PWREx_DisableFlashPowerDown(void) -{ - *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)DISABLE; -} - -/** - * @brief Return Voltage Scaling Range. - * @retval The configured scale for the regulator voltage(VOS bit field). - * The returned value can be one of the following: - * - @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * - @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * - @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode - */ -uint32_t HAL_PWREx_GetVoltageRange(void) -{ - return (PWR->CR & PWR_CR_VOS); -} - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -/** - * @brief Configures the main internal regulator output voltage. - * @param VoltageScaling specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption. - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, - * the maximum value of fHCLK = 168 MHz. - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, - * the maximum value of fHCLK = 144 MHz. - * @note When moving from Range 1 to Range 2, the system frequency must be decreased to - * a value below 144 MHz before calling HAL_PWREx_ConfigVoltageScaling() API. - * When moving from Range 2 to Range 1, the system frequency can be increased to - * a value up to 168 MHz after calling HAL_PWREx_ConfigVoltageScaling() API. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) -{ - uint32_t tickstart = 0U; - - assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); - - /* Enable PWR RCC Clock Peripheral */ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Set Range */ - __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) - { - if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || \ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || \ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || \ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Configures the main internal regulator output voltage. - * @param VoltageScaling specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption. - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, - * the maximum value of fHCLK is 168 MHz. It can be extended to - * 180 MHz by activating the over-drive mode. - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, - * the maximum value of fHCLK is 144 MHz. It can be extended to, - * 168 MHz by activating the over-drive mode. - * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output range 3 mode, - * the maximum value of fHCLK is 120 MHz. - * @note To update the system clock frequency(SYSCLK): - * - Set the HSI or HSE as system clock frequency using the HAL_RCC_ClockConfig(). - * - Call the HAL_RCC_OscConfig() to configure the PLL. - * - Call HAL_PWREx_ConfigVoltageScaling() API to adjust the voltage scale. - * - Set the new system clock frequency using the HAL_RCC_ClockConfig(). - * @note The scale can be modified only when the HSI or HSE clock source is selected - * as system clock source, otherwise the API returns HAL_ERROR. - * @note When the PLL is OFF, the voltage scale 3 is automatically selected and the VOS bits - * value in the PWR_CR1 register are not taken in account. - * @note This API forces the PLL state ON to allow the possibility to configure the voltage scale 1 or 2. - * @note The new voltage scale is active only when the PLL is ON. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) -{ - uint32_t tickstart = 0U; - - assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); - - /* Enable PWR RCC Clock Peripheral */ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - /* Disable the main PLL */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - /* Wait till PLL is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Set Range */ - __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); - - /* Enable the main PLL */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) - { - if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Enables Main Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_EnableMainRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables Main Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xxdevices. - * @retval None - */ -void HAL_PWREx_DisableMainRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)DISABLE; -} - -/** - * @brief Enables Low Power Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_EnableLowRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables Low Power Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_DisableLowRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)DISABLE; -} - -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F412Zx || STM32F412Rx || STM32F412Vx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Activates the Over-Drive mode. - * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * This mode allows the CPU and the core logic to operate at a higher frequency - * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). - * @note It is recommended to enter or exit Over-drive mode when the application is not running - * critical tasks and when the system clock source is either HSI or HSE. - * During the Over-drive switch activation, no peripheral clocks should be enabled. - * The peripheral clocks must be enabled once the Over-drive mode is activated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void) -{ - uint32_t tickstart = 0U; - - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable the Over-drive to extend the clock frequency to 180 Mhz */ - __HAL_PWR_OVERDRIVE_ENABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Enable the Over-drive switch */ - __HAL_PWR_OVERDRIVESWITCHING_ENABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) - { - if((HAL_GetTick() - tickstart ) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Deactivates the Over-Drive mode. - * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * This mode allows the CPU and the core logic to operate at a higher frequency - * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). - * @note It is recommended to enter or exit Over-drive mode when the application is not running - * critical tasks and when the system clock source is either HSI or HSE. - * During the Over-drive switch activation, no peripheral clocks should be enabled. - * The peripheral clocks must be enabled once the Over-drive mode is activated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void) -{ - uint32_t tickstart = 0U; - - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Disable the Over-drive switch */ - __HAL_PWR_OVERDRIVESWITCHING_DISABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Disable the Over-drive */ - __HAL_PWR_OVERDRIVE_DISABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Enters in Under-Drive STOP mode. - * - * @note This mode is only available for STM32F42xxx/STM32F43xxx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * - * @note This mode can be selected only when the Under-Drive is already active - * - * @note This mode is enabled only with STOP low power mode. - * In this mode, the 1.2V domain is preserved in reduced leakage mode. This - * mode is only available when the main regulator or the low power regulator - * is in low voltage mode - * - * @note If the Under-drive mode was enabled, it is automatically disabled after - * exiting Stop mode. - * When the voltage regulator operates in Under-drive mode, an additional - * startup delay is induced when waking up from Stop mode. - * - * @note In Stop mode, all I/O pins keep the same state as in Run mode. - * - * @note When exiting Stop mode by issuing an interrupt or a wake-up event, - * the HSI RC oscillator is selected as system clock. - * - * @note When the voltage regulator operates in low power mode, an additional - * startup delay is incurred when waking up from Stop mode. - * By keeping the internal regulator ON during Stop mode, the consumption - * is higher although the startup time is reduced. - * - * @param Regulator specifies the regulator state in STOP mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_UNDERDRIVE_ON: Main Regulator in under-drive mode - * and Flash memory in power-down when the device is in Stop under-drive mode - * @arg PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON: Low Power Regulator in under-drive mode - * and Flash memory in power-down when the device is in Stop under-drive mode - * @param STOPEntry specifies if STOP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_SLEEPENTRY_WFI: enter STOP mode with WFI instruction - * @arg PWR_SLEEPENTRY_WFE: enter STOP mode with WFE instruction - * @retval None - */ -HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry) -{ - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR_UNDERDRIVE(Regulator)); - assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); - - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Enable the Under-drive Mode ---------------------------------------------*/ - /* Clear Under-drive flag */ - __HAL_PWR_CLEAR_ODRUDR_FLAG(); - - /* Enable the Under-drive */ - __HAL_PWR_UNDERDRIVE_ENABLE(); - - /* Select the regulator state in STOP mode ---------------------------------*/ - tmpreg1 = PWR->CR; - /* Clear PDDS, LPDS, MRLUDS and LPLUDS bits */ - tmpreg1 &= (uint32_t)~(PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_MRUDS); - - /* Set LPDS, MRLUDS and LPLUDS bits according to PWR_Regulator value */ - tmpreg1 |= Regulator; - - /* Store the new value */ - PWR->CR = tmpreg1; - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - - /* Select STOP mode entry --------------------------------------------------*/ - if(STOPEntry == PWR_SLEEPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - /* Request Wait For Event */ - __WFE(); - } - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); - - return HAL_OK; -} - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_PWR_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c deleted file mode 100644 index c04d33a..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c +++ /dev/null @@ -1,1124 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc.c - * @author MCD Application Team - * @brief RCC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Reset and Clock Control (RCC) peripheral: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - @verbatim - ============================================================================== - ##### RCC specific features ##### - ============================================================================== - [..] - After reset the device is running from Internal High Speed oscillator - (HSI 16MHz) with Flash 0 wait state, Flash prefetch buffer, D-Cache - and I-Cache are disabled, and all peripherals are off except internal - SRAM, Flash and JTAG. - (+) There is no prescaler on High speed (AHB) and Low speed (APB) busses; - all peripherals mapped on these busses are running at HSI speed. - (+) The clock for all peripherals is switched off, except the SRAM and FLASH. - (+) All GPIOs are in input floating state, except the JTAG pins which - are assigned to be used for debug purpose. - - [..] - Once the device started from reset, the user application has to: - (+) Configure the clock source to be used to drive the System clock - (if the application needs higher frequency/performance) - (+) Configure the System clock frequency and Flash settings - (+) Configure the AHB and APB busses prescalers - (+) Enable the clock for the peripheral(s) to be used - (+) Configure the clock source(s) for peripherals which clocks are not - derived from the System clock (I2S, RTC, ADC, USB OTG FS/SDIO/RNG) - - ##### RCC Limitations ##### - ============================================================================== - [..] - A delay between an RCC peripheral clock enable and the effective peripheral - enabling should be taken into account in order to manage the peripheral read/write - from/to registers. - (+) This delay depends on the peripheral mapping. - (+) If peripheral is mapped on AHB: the delay is 2 AHB clock cycle - after the clock enable bit is set on the hardware register - (+) If peripheral is mapped on APB: the delay is 2 APB clock cycle - after the clock enable bit is set on the hardware register - - [..] - Implemented Workaround: - (+) For AHB & APB peripherals, a dummy read to the peripheral register has been - inserted in each __HAL_RCC_PPP_CLK_ENABLE() macro. - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup RCC RCC - * @brief RCC HAL module driver - * @{ - */ - -#ifdef HAL_RCC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup RCC_Private_Constants - * @{ - */ - -/* Private macro -------------------------------------------------------------*/ -#define __MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() -#define MCO1_GPIO_PORT GPIOA -#define MCO1_PIN GPIO_PIN_8 - -#define __MCO2_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() -#define MCO2_GPIO_PORT GPIOC -#define MCO2_PIN GPIO_PIN_9 -/** - * @} - */ - -/* Private variables ---------------------------------------------------------*/ -/** @defgroup RCC_Private_Variables RCC Private Variables - * @{ - */ -/** - * @} - */ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup RCC_Exported_Functions RCC Exported Functions - * @{ - */ - -/** @defgroup RCC_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to configure the internal/external oscillators - (HSE, HSI, LSE, LSI, PLL, CSS and MCO) and the System busses clocks (SYSCLK, AHB, APB1 - and APB2). - - [..] Internal/external clock and PLL configuration - (#) HSI (high-speed internal), 16 MHz factory-trimmed RC used directly or through - the PLL as System clock source. - - (#) LSI (low-speed internal), 32 KHz low consumption RC used as IWDG and/or RTC - clock source. - - (#) HSE (high-speed external), 4 to 26 MHz crystal oscillator used directly or - through the PLL as System clock source. Can be used also as RTC clock source. - - (#) LSE (low-speed external), 32 KHz oscillator used as RTC clock source. - - (#) PLL (clocked by HSI or HSE), featuring two different output clocks: - (++) The first output is used to generate the high speed system clock (up to 168 MHz) - (++) The second output is used to generate the clock for the USB OTG FS (48 MHz), - the random analog generator (<=48 MHz) and the SDIO (<= 48 MHz). - - (#) CSS (Clock security system), once enable using the macro __HAL_RCC_CSS_ENABLE() - and if a HSE clock failure occurs(HSE used directly or through PLL as System - clock source), the System clocks automatically switched to HSI and an interrupt - is generated if enabled. The interrupt is linked to the Cortex-M4 NMI - (Non-Maskable Interrupt) exception vector. - - (#) MCO1 (microcontroller clock output), used to output HSI, LSE, HSE or PLL - clock (through a configurable prescaler) on PA8 pin. - - (#) MCO2 (microcontroller clock output), used to output HSE, PLL, SYSCLK or PLLI2S - clock (through a configurable prescaler) on PC9 pin. - - [..] System, AHB and APB busses clocks configuration - (#) Several clock sources can be used to drive the System clock (SYSCLK): HSI, - HSE and PLL. - The AHB clock (HCLK) is derived from System clock through configurable - prescaler and used to clock the CPU, memory and peripherals mapped - on AHB bus (DMA, GPIO...). APB1 (PCLK1) and APB2 (PCLK2) clocks are derived - from AHB clock through configurable prescalers and used to clock - the peripherals mapped on these busses. You can use - "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks. - - (#) For the STM32F405xx/07xx and STM32F415xx/17xx devices, the maximum - frequency of the SYSCLK and HCLK is 168 MHz, PCLK2 84 MHz and PCLK1 42 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F42xxx, STM32F43xxx, STM32F446xx, STM32F469xx and STM32F479xx devices, - the maximum frequency of the SYSCLK and HCLK is 180 MHz, PCLK2 90 MHz and PCLK1 45 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F401xx, the maximum frequency of the SYSCLK and HCLK is 84 MHz, - PCLK2 84 MHz and PCLK1 42 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F41xxx, the maximum frequency of the SYSCLK and HCLK is 100 MHz, - PCLK2 100 MHz and PCLK1 50 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - -@endverbatim - * @{ - */ - -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * - HSI ON and used as system clock source - * - HSE and PLL OFF - * - AHB, APB1 and APB2 prescaler set to 1. - * - CSS, MCO1 and MCO2 OFF - * - All interrupts disabled - * @note This function doesn't modify the configuration of the - * - Peripheral clocks - * - LSI, LSE and RTC clocks - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_RCC_DeInit(void) -{ - return HAL_OK; -} - -/** - * @brief Initializes the RCC Oscillators according to the specified parameters in the - * RCC_OscInitTypeDef. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC Oscillators. - * @note The PLL is not disabled when used as system clock. - * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not - * supported by this API. User should request a transition to LSE Off - * first and then LSE On or LSE Bypass. - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not - * supported by this API. User should request a transition to HSE Off - * first and then HSE On or HSE Bypass. - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - uint32_t tickstart; - uint32_t pll_config; - /* Check Null pointer */ - if (RCC_OscInitStruct == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); - /*------------------------------- HSE Configuration ------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) - { - /* Check the parameters */ - assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); - /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) - { - if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) - { - return HAL_ERROR; - } - } - else - { - /* Set the new HSE configuration ---------------------------------------*/ - __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); - - /* Check the HSE State */ - if ((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till HSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till HSE is bypassed or disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*----------------------------- HSI Configuration --------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) - { - /* Check the parameters */ - assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); - assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); - - /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) - { - /* When HSI is used as system clock it will not disabled */ - if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) - { - return HAL_ERROR; - } - /* Otherwise, just the calibration is allowed */ - else - { - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - } - else - { - /* Check the HSI State */ - if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) - { - /* Enable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Adjusts the Internal High Speed oscillator (HSI) calibration value. */ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - else - { - /* Disable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*------------------------------ LSI Configuration -------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) - { - /* Check the parameters */ - assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); - - /* Check the LSI State */ - if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) - { - /* Enable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - /*------------------------------ LSE Configuration -------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) - { - FlagStatus pwrclkchanged = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); - - /* Update LSE configuration in Backup Domain control register */ - /* Requires to enable write access to Backup Domain of necessary */ - if (__HAL_RCC_PWR_IS_CLK_DISABLED()) - { - __HAL_RCC_PWR_CLK_ENABLE(); - pwrclkchanged = SET; - } - - if (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - /* Enable write access to Backup domain */ - SET_BIT(PWR->CR, PWR_CR_DBP); - - /* Wait for Backup domain Write protection disable */ - tickstart = HAL_GetTick(); - - while (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Set the new LSE configuration -----------------------------------------*/ - __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); - /* Check the LSE State */ - if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Restore clock configuration if changed */ - if (pwrclkchanged == SET) - { - __HAL_RCC_PWR_CLK_DISABLE(); - } - } - /*-------------------------------- PLL Configuration -----------------------*/ - /* Check the parameters */ - assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); - if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) - { - /* Check if the PLL is used as system clock or not */ - if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) - { - /* Check the parameters */ - assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); - assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); - assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); - assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); - assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); - - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Configure the main PLL clock source, multiplication and division factors. */ - WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ - RCC_OscInitStruct->PLL.PLLM | \ - (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ - (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ - (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))); - /* Enable the main PLL. */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - else - { - /* Check if there is a request to disable the PLL used as System clock source */ - if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) - { - return HAL_ERROR; - } - else - { - /* Do not return HAL_ERROR if request repeats the current configuration */ - pll_config = RCC->PLLCFGR; -#if defined (RCC_PLLCFGR_PLLR) - if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) -#else - if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) -#endif /* RCC_PLLCFGR_PLLR */ - { - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief Initializes the CPU, AHB and APB busses clocks according to the specified - * parameters in the RCC_ClkInitStruct. - * @param RCC_ClkInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC peripheral. - * @param FLatency FLASH Latency, this parameter depend on device selected - * - * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency - * and updated by HAL_RCC_GetHCLKFreq() function called within this function - * - * @note The HSI is used (enabled by hardware) as system clock source after - * startup from Reset, wake-up from STOP and STANDBY mode, or in case - * of failure of the HSE used directly or indirectly as system clock - * (if the Clock Security System CSS is enabled). - * - * @note A switch from one clock source to another occurs only if the target - * clock source is ready (clock stable after startup delay or PLL locked). - * If a clock source which is not yet ready is selected, the switch will - * occur when the clock source will be ready. - * - * @note Depending on the device voltage range, the software has to set correctly - * HPRE[3:0] bits to ensure that HCLK not exceed the maximum allowed frequency - * (for more details refer to section above "Initialization/de-initialization functions") - * @retval None - */ -HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency) -{ - uint32_t tickstart; - - /* Check Null pointer */ - if (RCC_ClkInitStruct == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType)); - assert_param(IS_FLASH_LATENCY(FLatency)); - - /* To correctly read data from FLASH memory, the number of wait states (LATENCY) - must be correctly programmed according to the frequency of the CPU clock - (HCLK) and the supply voltage of the device. */ - - /* Increasing the number of wait states because of higher CPU frequency */ - if (FLatency > __HAL_FLASH_GET_LATENCY()) - { - /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ - __HAL_FLASH_SET_LATENCY(FLatency); - - /* Check that the new number of wait states is taken into account to access the Flash - memory by reading the FLASH_ACR register */ - if (__HAL_FLASH_GET_LATENCY() != FLatency) - { - return HAL_ERROR; - } - } - - /*-------------------------- HCLK Configuration --------------------------*/ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) - { - /* Set the highest APBx dividers in order to ensure that we do not go through - a non-spec phase whatever we decrease or increase HCLK. */ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) - { - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); - } - - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) - { - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); - } - - assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); - } - - /*------------------------- SYSCLK Configuration ---------------------------*/ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) - { - assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); - - /* HSE is selected as System Clock Source */ - if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) - { - /* Check the HSE ready flag */ - if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - return HAL_ERROR; - } - } - /* PLL is selected as System Clock Source */ - else if ((RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) || - (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLRCLK)) - { - /* Check the PLL ready flag */ - if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - return HAL_ERROR; - } - } - /* HSI is selected as System Clock Source */ - else - { - /* Check the HSI ready flag */ - if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - return HAL_ERROR; - } - } - - __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) - { - if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Decreasing the number of wait states because of lower CPU frequency */ - if (FLatency < __HAL_FLASH_GET_LATENCY()) - { - /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ - __HAL_FLASH_SET_LATENCY(FLatency); - - /* Check that the new number of wait states is taken into account to access the Flash - memory by reading the FLASH_ACR register */ - if (__HAL_FLASH_GET_LATENCY() != FLatency) - { - return HAL_ERROR; - } - } - - /*-------------------------- PCLK1 Configuration ---------------------------*/ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) - { - assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); - } - - /*-------------------------- PCLK2 Configuration ---------------------------*/ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) - { - assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U)); - } - - /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]; - - /* Configure the source of time base considering new system clocks settings */ - HAL_InitTick(uwTickPrio); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup RCC_Exported_Functions_Group2 Peripheral Control functions - * @brief RCC clocks control functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the RCC Clocks - frequencies. - -@endverbatim - * @{ - */ - -/** - * @brief Selects the clock source to output on MCO1 pin(PA8) or on MCO2 pin(PC9). - * @note PA8/PC9 should be configured in alternate function mode. - * @param RCC_MCOx specifies the output direction for the clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO1: Clock source to output on MCO1 pin(PA8). - * @arg RCC_MCO2: Clock source to output on MCO2 pin(PC9). - * @param RCC_MCOSource specifies the clock source to output. - * This parameter can be one of the following values: - * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source - * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx - * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices - * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source - * @param RCC_MCODiv specifies the MCOx prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - * @note For STM32F410Rx devices to output I2SCLK clock on MCO2 you should have - * at last one of the SPI clocks enabled (SPI1, SPI2 or SPI5). - * @retval None - */ -void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv) -{ - GPIO_InitTypeDef GPIO_InitStruct; - /* Check the parameters */ - assert_param(IS_RCC_MCO(RCC_MCOx)); - assert_param(IS_RCC_MCODIV(RCC_MCODiv)); - /* RCC_MCO1 */ - if (RCC_MCOx == RCC_MCO1) - { - assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); - - /* MCO1 Clock Enable */ - __MCO1_CLK_ENABLE(); - - /* Configure the MCO1 pin in alternate function mode */ - GPIO_InitStruct.Pin = MCO1_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Alternate = GPIO_AF0_MCO; - HAL_GPIO_Init(MCO1_GPIO_PORT, &GPIO_InitStruct); - - /* Mask MCO1 and MCO1PRE[2:0] bits then Select MCO1 clock source and prescaler */ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), (RCC_MCOSource | RCC_MCODiv)); - - /* This RCC MCO1 enable feature is available only on STM32F410xx devices */ -#if defined(RCC_CFGR_MCO1EN) - __HAL_RCC_MCO1_ENABLE(); -#endif /* RCC_CFGR_MCO1EN */ - } -#if defined(RCC_CFGR_MCO2) - else - { - assert_param(IS_RCC_MCO2SOURCE(RCC_MCOSource)); - - /* MCO2 Clock Enable */ - __MCO2_CLK_ENABLE(); - - /* Configure the MCO2 pin in alternate function mode */ - GPIO_InitStruct.Pin = MCO2_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Alternate = GPIO_AF0_MCO; - HAL_GPIO_Init(MCO2_GPIO_PORT, &GPIO_InitStruct); - - /* Mask MCO2 and MCO2PRE[2:0] bits then Select MCO2 clock source and prescaler */ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), (RCC_MCOSource | (RCC_MCODiv << 3U))); - - /* This RCC MCO2 enable feature is available only on STM32F410Rx devices */ -#if defined(RCC_CFGR_MCO2EN) - __HAL_RCC_MCO2_ENABLE(); -#endif /* RCC_CFGR_MCO2EN */ - } -#endif /* RCC_CFGR_MCO2 */ -} - -/** - * @brief Enables the Clock Security System. - * @note If a failure is detected on the HSE oscillator clock, this oscillator - * is automatically disabled and an interrupt is generated to inform the - * software about the failure (Clock Security System Interrupt, CSSI), - * allowing the MCU to perform rescue operations. The CSSI is linked to - * the Cortex-M4 NMI (Non-Maskable Interrupt) exception vector. - * @retval None - */ -void HAL_RCC_EnableCSS(void) -{ - *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Clock Security System. - * @retval None - */ -void HAL_RCC_DisableCSS(void) -{ - *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)DISABLE; -} - -/** - * @brief Returns the SYSCLK frequency - * - * @note The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) - * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) - * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * @note The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @note This function can be used by the user application to compute the - * baudrate for the communication peripherals or configure other parameters. - * - * @note Each time SYSCLK changes, this function must be called to update the - * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * - * @retval SYSCLK frequency - */ -__weak uint32_t HAL_RCC_GetSysClockFreq(void) -{ - uint32_t pllm = 0U; - uint32_t pllvco = 0U; - uint32_t pllp = 0U; - uint32_t sysclockfreq = 0U; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) - { - case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ - { - sysclockfreq = HSI_VALUE; - break; - } - case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ - { - sysclockfreq = HSE_VALUE; - break; - } - case RCC_CFGR_SWS_PLL: /* PLL used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLP */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) * 2U); - - sysclockfreq = pllvco / pllp; - break; - } - default: - { - sysclockfreq = HSI_VALUE; - break; - } - } - return sysclockfreq; -} - -/** - * @brief Returns the HCLK frequency - * @note Each time HCLK changes, this function must be called to update the - * right HCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency - * and updated within this function - * @retval HCLK frequency - */ -uint32_t HAL_RCC_GetHCLKFreq(void) -{ - return SystemCoreClock; -} - -/** - * @brief Returns the PCLK1 frequency - * @note Each time PCLK1 changes, this function must be called to update the - * right PCLK1 value. Otherwise, any configuration based on this function will be incorrect. - * @retval PCLK1 frequency - */ -uint32_t HAL_RCC_GetPCLK1Freq(void) -{ - /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]); -} - -/** - * @brief Returns the PCLK2 frequency - * @note Each time PCLK2 changes, this function must be called to update the - * right PCLK2 value. Otherwise, any configuration based on this function will be incorrect. - * @retval PCLK2 frequency - */ -uint32_t HAL_RCC_GetPCLK2Freq(void) -{ - /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]); -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * will be configured. - * @retval None - */ -__weak void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - /* Set all possible values for the Oscillator type parameter ---------------*/ - RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; - - /* Get the HSE configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) - { - RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; - } - else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) - { - RCC_OscInitStruct->HSEState = RCC_HSE_ON; - } - else - { - RCC_OscInitStruct->HSEState = RCC_HSE_OFF; - } - - /* Get the HSI configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) - { - RCC_OscInitStruct->HSIState = RCC_HSI_ON; - } - else - { - RCC_OscInitStruct->HSIState = RCC_HSI_OFF; - } - - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); - - /* Get the LSE configuration -----------------------------------------------*/ - if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) - { - RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; - } - else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) - { - RCC_OscInitStruct->LSEState = RCC_LSE_ON; - } - else - { - RCC_OscInitStruct->LSEState = RCC_LSE_OFF; - } - - /* Get the LSI configuration -----------------------------------------------*/ - if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) - { - RCC_OscInitStruct->LSIState = RCC_LSI_ON; - } - else - { - RCC_OscInitStruct->LSIState = RCC_LSI_OFF; - } - - /* Get the PLL configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; - } - else - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; - } - RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); - RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); - RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); - RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); -} - -/** - * @brief Configures the RCC_ClkInitStruct according to the internal - * RCC configuration registers. - * @param RCC_ClkInitStruct pointer to an RCC_ClkInitTypeDef structure that - * will be configured. - * @param pFLatency Pointer on the Flash Latency. - * @retval None - */ -void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency) -{ - /* Set all possible values for the Clock type parameter --------------------*/ - RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - - /* Get the SYSCLK configuration --------------------------------------------*/ - RCC_ClkInitStruct->SYSCLKSource = (uint32_t)(RCC->CFGR & RCC_CFGR_SW); - - /* Get the HCLK configuration ----------------------------------------------*/ - RCC_ClkInitStruct->AHBCLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_HPRE); - - /* Get the APB1 configuration ----------------------------------------------*/ - RCC_ClkInitStruct->APB1CLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_PPRE1); - - /* Get the APB2 configuration ----------------------------------------------*/ - RCC_ClkInitStruct->APB2CLKDivider = (uint32_t)((RCC->CFGR & RCC_CFGR_PPRE2) >> 3U); - - /* Get the Flash Wait State (Latency) configuration ------------------------*/ - *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY); -} - -/** - * @brief This function handles the RCC CSS interrupt request. - * @note This API should be called under the NMI_Handler(). - * @retval None - */ -void HAL_RCC_NMI_IRQHandler(void) -{ - /* Check RCC CSSF flag */ - if (__HAL_RCC_GET_IT(RCC_IT_CSS)) - { - /* RCC Clock Security System interrupt user callback */ - HAL_RCC_CSSCallback(); - - /* Clear RCC CSS pending bit */ - __HAL_RCC_CLEAR_IT(RCC_IT_CSS); - } -} - -/** - * @brief RCC Clock Security System interrupt callback - * @retval None - */ -__weak void HAL_RCC_CSSCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_RCC_CSSCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_RCC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c deleted file mode 100644 index 7b3b20b..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c +++ /dev/null @@ -1,3833 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc_ex.c - * @author MCD Application Team - * @brief Extension RCC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities RCC extension peripheral: - * + Extended Peripheral Control functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup RCCEx RCCEx - * @brief RCCEx HAL module driver - * @{ - */ - -#ifdef HAL_RCC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup RCCEx_Private_Constants - * @{ - */ -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions - * @{ - */ - -/** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions - * @brief Extended Peripheral Control functions - * -@verbatim - =============================================================================== - ##### Extended Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the RCC Clocks - frequencies. - [..] - (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to - select the RTC clock source; in this case the Backup domain will be reset in - order to modify the RTC Clock source, as consequence RTC registers (including - the backup registers) and RCC_BDCR register are set to their reset values. - -@endverbatim - * @{ - */ - -#if defined(STM32F446xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - uint32_t plli2sp = 0U; - uint32_t plli2sq = 0U; - uint32_t plli2sr = 0U; - uint32_t pllsaip = 0U; - uint32_t pllsaiq = 0U; - uint32_t plli2sused = 0U; - uint32_t pllsaiused = 0U; - - /* Check the peripheral clock selection parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*------------------------ I2S APB1 configuration --------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- I2S APB2 configuration ----------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*--------------------------- SAI1 configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == (RCC_PERIPHCLK_SAI1)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*-------------------------- SAI2 configuration ----------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == (RCC_PERIPHCLK_SAI2)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection)); - - /* Configure SAI2 Clock source */ - __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection); - - /* Enable the PLLI2S when it's used as clock source for SAI */ - if (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- RTC configuration --------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - /* Configure Timer Prescaler */ - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- FMPI2C1 Configuration -----------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ CEC Configuration -------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC) - { - /* Check the parameters */ - assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection)); - - /* Configure the CEC clock source */ - __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- CLK48 Configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the CLK48 clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - - /* Enable the PLLSAI when it's used as clock source for CLK48 */ - if (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- SDIO Configuration -------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ SPDIFRX Configuration ---------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) - { - /* Check the parameters */ - assert_param(IS_RCC_SPDIFRXCLKSOURCE(PeriphClkInit->SpdifClockSelection)); - - /* Configure the SPDIFRX clock source */ - __HAL_RCC_SPDIFRX_CONFIG(PeriphClkInit->SpdifClockSelection); - /* Enable the PLLI2S when it's used as clock source for SPDIFRX */ - if (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- PLLI2S Configuration ------------------------*/ - /* PLLI2S is configured when a peripheral will use it as source clock : SAI1, SAI2, I2S on APB1, - I2S on APB2 or SPDIFRX */ - if ((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) - { - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* check for common PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /*------ In Case of PLLI2S is selected as source clock for I2S -----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) - && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S))) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Read PLLI2SP/PLLI2SQ value from PLLI2SCFGR register (this value is not needed for I2S configuration) */ - plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sp, plli2sq, - PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) - && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S))) - { - /* Check for PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - /* Check for PLLI2S/DIVQ parameters */ - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SP/PLLI2SR value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ - plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sp, - PeriphClkInit->PLLI2S.PLLI2SQ, plli2sr); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*------ In Case of PLLI2S is selected as source clock for SPDIFRX -------*/ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) - && (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - plli2sq = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SP, - plli2sq, plli2sr); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SP, - PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- PLLSAI Configuration -----------------------*/ - /* PLLSAI is configured when a peripheral will use it as source clock : SAI1, SAI2, CLK48 or SDIO */ - if (pllsaiused == 1U) - { - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIM_VALUE(PeriphClkInit->PLLSAI.PLLSAIM)); - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /*------ In Case of PLLSAI is selected as source clock for SAI -----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) - && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI))) - { - /* check for PLLSAIQ Parameter */ - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - /* check for PLLSAI/DIVQ Parameter */ - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, - PeriphClkInit->PLLSAI.PLLSAIQ, 0U); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*------ In Case of PLLSAI is selected as source clock for CLK48 ---------*/ - /* In Case of PLLI2S is selected as source clock for CLK48 */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); - /* Read PLLSAIQ value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Configure the PLLSAI division factors */ - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLI2SN/PLLSAIM) */ - /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIP, - pllsaiq, 0U); - } - - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - return HAL_OK; -} - -/** - * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 | \ - RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 | \ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ - RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_FMPI2C1 | \ - RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO | \ - RCC_PERIPHCLK_SPDIFRX; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SP = (uint32_t)((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Get the PLLSAI Clock configuration --------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIM = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM) >> RCC_PLLSAICFGR_PLLSAIM_Pos); - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIP = (uint32_t)((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - - /* Get the SAI1 clock configuration ----------------------------------------*/ - PeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE(); - - /* Get the SAI2 clock configuration ----------------------------------------*/ - PeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE(); - - /* Get the I2S APB1 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); - - /* Get the I2S APB2 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); - - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the CEC clock configuration -----------------------------------------*/ - PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); - - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the CLK48 clock configuration ----------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - /* Get the SPDIFRX clock configuration -------------------------------------*/ - PeriphClkInit->SpdifClockSelection = __HAL_RCC_GET_SPDIFRX_SOURCE(); - - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_SAI1: SAI1 peripheral clock - * @arg RCC_PERIPHCLK_SAI2: SAI2 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - uint32_t tmpreg1 = 0U; - /* This variable used to store the SAI clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - /* This variable used to store the SAI clock source */ - uint32_t saiclocksource = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_SAI1: - case RCC_PERIPHCLK_SAI2: - { - saiclocksource = RCC->DCKCFGR; - saiclocksource &= (RCC_DCKCFGR_SAI1SRC | RCC_DCKCFGR_SAI2SRC); - switch (saiclocksource) - { - case 0U: /* PLLSAI is the clock source for SAI*/ - { - /* Configure the PLLSAI division factor */ - /* PLLSAI_VCO Input = PLL_SOURCE/PLLSAIM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM))); - } - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - tmpreg1 = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U; - frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U)) / (tmpreg1); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - tmpreg1 = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U); - frequency = frequency / (tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC_0: /* PLLI2S is the clock source for SAI*/ - case RCC_DCKCFGR_SAI2SRC_0: /* PLLI2S is the clock source for SAI*/ - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM))); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - tmpreg1 = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U; - frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U)) / (tmpreg1); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - tmpreg1 = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U); - frequency = frequency / (tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC_1: /* PLLR is the clock source for SAI*/ - case RCC_DCKCFGR_SAI2SRC_1: /* PLLR is the clock source for SAI*/ - { - /* Configure the PLLI2S division factor */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - /* SAI_CLK_x = PLL_VCO Output/PLLR */ - tmpreg1 = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U; - frequency = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U)) / (tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC: /* External clock is the clock source for SAI*/ - { - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - case RCC_DCKCFGR_SAI2SRC: /* PLLSRC(HSE or HSI) is the clock source for SAI*/ - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - frequency = (uint32_t)(HSI_VALUE); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - frequency = (uint32_t)(HSE_VALUE); - } - break; - } - default : - { - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB1: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB1CLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB2: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB2CLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC, RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - uint32_t pllsaip = 0U; - uint32_t pllsaiq = 0U; - uint32_t pllsair = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*--------------------------- CLK48 Configuration --------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the CLK48 clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ SDIO Configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ - /*------------------- Common configuration SAI/I2S -------------------------*/ - /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division - factor is common parameters for both peripherals */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------- I2S configuration -------------------------------*/ - /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added - only for I2S configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must - be added only for SAI configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) - { - /* Check the PLLI2S division factors */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Configure the PLLI2S multiplication and division factors */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, - PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ - /*----------------------- Common configuration SAI/LTDC --------------------*/ - /* In Case of SAI, LTDC or CLK48 Clock Configuration through PLLSAI, PLLSAIN division - factor is common parameters for these peripherals */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && - (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP))) - { - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must - be added only for SAI configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) - { - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, pllsair); - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*---------------------------- LTDC configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) - { - assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); - assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, pllsaiq, PeriphClkInit->PLLSAI.PLLSAIR); - /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); - } - - /*---------------------------- CLK48 configuration ------------------------*/ - /* Configure the PLLSAI when it is used as clock source for CLK48 */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == (RCC_PERIPHCLK_CLK48)) && - (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) - { - assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); - - /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* CLK48_CLK(first level) = PLLSAI_VCO Output/PLLSAIP */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, pllsair); - } - - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - - /*--------------------------------------------------------------------------*/ - - /*---------------------------- RTC configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - return HAL_OK; -} - -/** - * @brief Configures the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI | \ - RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC | \ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ - RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Get the PLLSAI Clock configuration --------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the CLK48 clock configuration -------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t plli2sq = 0U; -#endif /* STM32F413xx || STM32F423xx */ - uint32_t plli2sused = 0U; - - /* Check the peripheral clock selection parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*----------------------------------- I2S APB1 configuration ---------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------------- I2S APB2 configuration ---------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*----------------------- SAI1 Block A configuration -----------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == (RCC_PERIPHCLK_SAIA)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAIACLKSOURCE(PeriphClkInit->SaiAClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(PeriphClkInit->SaiAClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLR) - { - /* Check for PLL/DIVR parameters */ - assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ - __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------- SAI1 Block B configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == (RCC_PERIPHCLK_SAIB)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAIBCLKSOURCE(PeriphClkInit->SaiBClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(PeriphClkInit->SaiBClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLR) - { - /* Check for PLL/DIVR parameters */ - assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ - __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); - } - } - /*--------------------------------------------------------------------------*/ -#endif /* STM32F413xx || STM32F423xx */ - - /*------------------------------------ RTC configuration -------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------ TIM configuration -------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - /* Configure Timer Prescaler */ - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- FMPI2C1 Configuration --------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- CLK48 Configuration ----------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - - /* Enable the PLLI2S when it's used as clock source for CLK48 */ - if (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- SDIO Configuration -----------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------------------------- PLLI2S Configuration --------------*/ - /* PLLI2S is configured when a peripheral will use it as source clock : I2S on APB1 or - I2S on APB2*/ - if ((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) - { - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* check for common PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SCLKSOURCE(PeriphClkInit->PLLI2SSelection)); - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - /*-------------------- Set the PLL I2S clock -----------------------------*/ - __HAL_RCC_PLL_I2S_CONFIG(PeriphClkInit->PLLI2SSelection); - - /*------- In Case of PLLI2S is selected as source clock for I2S ----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) - && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) && (PeriphClkInit->SdioClockSelection == RCC_SDIOCLKSOURCE_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ))) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, - PeriphClkInit->PLLI2S.PLLI2SR); - } - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == RCC_PERIPHCLK_SAIA) - && (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == RCC_PERIPHCLK_SAIB) && (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR))) - { - /* Check for PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Check for PLLI2S/DIVR parameters */ - assert_param(IS_RCC_PLLI2S_DIVR_VALUE(PeriphClkInit->PLLI2SDivR)); - - /* Read PLLI2SQ value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ - plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sq, - PeriphClkInit->PLLI2S.PLLI2SR); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVR */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLI2SDivR); - } -#endif /* STM32F413xx || STM32F423xx */ - - /*----------------- In Case of PLLI2S is just selected ------------------*/ - if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, - PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM1 clock source configuration -------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection)); - - /* Configure the DFSDM1 interface clock source */ - __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM1 Audio clock source configuration -------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1_AUDIO) == RCC_PERIPHCLK_DFSDM1_AUDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM1AUDIOCLKSOURCE(PeriphClkInit->Dfsdm1AudioClockSelection)); - - /* Configure the DFSDM1 Audio interface clock source */ - __HAL_RCC_DFSDM1AUDIO_CONFIG(PeriphClkInit->Dfsdm1AudioClockSelection); - } - /*--------------------------------------------------------------------------*/ - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*-------------------- DFSDM2 clock source configuration -------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2) == RCC_PERIPHCLK_DFSDM2) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM2CLKSOURCE(PeriphClkInit->Dfsdm2ClockSelection)); - - /* Configure the DFSDM1 interface clock source */ - __HAL_RCC_DFSDM2_CONFIG(PeriphClkInit->Dfsdm2ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM2 Audio clock source configuration -------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2_AUDIO) == RCC_PERIPHCLK_DFSDM2_AUDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM2AUDIOCLKSOURCE(PeriphClkInit->Dfsdm2AudioClockSelection)); - - /* Configure the DFSDM1 Audio interface clock source */ - __HAL_RCC_DFSDM2AUDIO_CONFIG(PeriphClkInit->Dfsdm2AudioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- LPTIM1 Configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) - { - /* Check the parameters */ - assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); - - /* Configure the LPTIM1 clock source */ - __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); - } - /*--------------------------------------------------------------------------*/ -#endif /* STM32F413xx || STM32F423xx */ - - return HAL_OK; -} - -/** - * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 | \ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ - RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 | \ - RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 | \ - RCC_PERIPHCLK_DFSDM1_AUDIO | RCC_PERIPHCLK_DFSDM2 | \ - RCC_PERIPHCLK_DFSDM2_AUDIO | RCC_PERIPHCLK_LPTIM1 | \ - RCC_PERIPHCLK_SAIA | RCC_PERIPHCLK_SAIB; -#else /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 | \ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ - RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 | \ - RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 | \ - RCC_PERIPHCLK_DFSDM1_AUDIO; -#endif /* STM32F413xx || STM32F423xx */ - - - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); -#if defined(STM32F413xx) || defined(STM32F423xx) - /* Get the PLL/PLLI2S division factors -------------------------------------*/ - PeriphClkInit->PLLI2SDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVR) >> RCC_DCKCFGR_PLLI2SDIVR_Pos); - PeriphClkInit->PLLDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLDIVR) >> RCC_DCKCFGR_PLLDIVR_Pos); -#endif /* STM32F413xx || STM32F423xx */ - - /* Get the I2S APB1 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); - - /* Get the I2S APB2 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); - - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the CLK48 clock configuration ---------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - /* Get the DFSDM1 clock configuration --------------------------------------*/ - PeriphClkInit->Dfsdm1ClockSelection = __HAL_RCC_GET_DFSDM1_SOURCE(); - - /* Get the DFSDM1 Audio clock configuration --------------------------------*/ - PeriphClkInit->Dfsdm1AudioClockSelection = __HAL_RCC_GET_DFSDM1AUDIO_SOURCE(); - -#if defined(STM32F413xx) || defined(STM32F423xx) - /* Get the DFSDM2 clock configuration --------------------------------------*/ - PeriphClkInit->Dfsdm2ClockSelection = __HAL_RCC_GET_DFSDM2_SOURCE(); - - /* Get the DFSDM2 Audio clock configuration --------------------------------*/ - PeriphClkInit->Dfsdm2AudioClockSelection = __HAL_RCC_GET_DFSDM2AUDIO_SOURCE(); - - /* Get the LPTIM1 clock configuration --------------------------------------*/ - PeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE(); - - /* Get the SAI1 Block Aclock configuration ---------------------------------*/ - PeriphClkInit->SaiAClockSelection = __HAL_RCC_GET_SAI_BLOCKA_SOURCE(); - - /* Get the SAI1 Block B clock configuration --------------------------------*/ - PeriphClkInit->SaiBClockSelection = __HAL_RCC_GET_SAI_BLOCKB_SOURCE(); -#endif /* STM32F413xx || STM32F423xx */ - - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(I2S..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S_APB1: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLI2S: - { - if ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - } - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB1CLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB2: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLI2S: - { - if ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - } - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB2CLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the - * RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). - * - * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case - * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup - * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*---------------------------- RTC configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- FMPI2C1 Configuration -----------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- LPTIM1 Configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) - { - /* Check the parameters */ - assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); - - /* Configure the LPTIM1 clock source */ - __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); - } - - /*---------------------------- I2S Configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPBCLKSOURCE(PeriphClkInit->I2SClockSelection)); - - /* Configure the I2S clock source */ - __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2SClockSelection); - } - - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; - - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the I2S clock configuration -----------------------------------------*/ - PeriphClkInit->I2SClockSelection = __HAL_RCC_GET_I2S_SOURCE(); - - -} -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPBCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPBCLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPBCLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ - /*----------------------- Common configuration SAI/I2S ---------------------*/ - /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division - factor is common parameters for both peripherals */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- I2S configuration -------------------------*/ - /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added - only for I2S configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must - be added only for SAI configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) - { - /* Check the PLLI2S division factors */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Configure the PLLI2S multiplication and division factors */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, - PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ - /*----------------------- Common configuration SAI/LTDC --------------------*/ - /* In Case of SAI or LTDC Clock Configuration through PLLSAI, PLLSAIN division - factor is common parameters for both peripherals */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC)) - { - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must - be added only for SAI configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) - { - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIQ, tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*---------------------------- LTDC configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) - { - assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); - assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); - - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, tmpreg1, PeriphClkInit->PLLSAI.PLLSAIR); - /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); - } - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- RTC configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - return HAL_OK; -} - -/** - * @brief Configures the PeriphClkInit according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI | RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; - - /* Get the PLLI2S Clock configuration -----------------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Get the PLLSAI Clock configuration -----------------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors -----------------------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); - /* Get the RTC Clock configuration -----------------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the - * RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). - * - * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case - * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup - * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*---------------------------- I2S configuration ---------------------------*/ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); -#if defined(STM32F411xE) - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); -#endif /* STM32F411xE */ - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - -#if defined(STM32F411xE) - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, - PeriphClkInit->PLLI2S.PLLI2SR); -#else - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); -#endif /* STM32F411xE */ - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - - /*---------------------------- RTC configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_RTC; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); -#if defined(STM32F411xE) - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM); -#endif /* STM32F411xE */ - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { -#if defined(STM32F411xE) - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } -#else - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } -#endif /* STM32F411xE */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Select LSE mode - * - * @note This mode is only available for STM32F410xx/STM32F411xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. - * - * @param Mode specifies the LSE mode. - * This parameter can be one of the following values: - * @arg RCC_LSE_LOWPOWER_MODE: LSE oscillator in low power mode selection - * @arg RCC_LSE_HIGHDRIVE_MODE: LSE oscillator in High Drive mode selection - * @retval None - */ -void HAL_RCCEx_SelectLSEMode(uint8_t Mode) -{ - /* Check the parameters */ - assert_param(IS_RCC_LSE_MODE(Mode)); - if (Mode == RCC_LSE_HIGHDRIVE_MODE) - { - SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); - } - else - { - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); - } -} - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/** @defgroup RCCEx_Exported_Functions_Group2 Extended Clock management functions - * @brief Extended Clock management functions - * -@verbatim - =============================================================================== - ##### Extended clock management functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the - activation or deactivation of PLLI2S, PLLSAI. -@endverbatim - * @{ - */ - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Enable PLLI2S. - * @param PLLI2SInit pointer to an RCC_PLLI2SInitTypeDef structure that - * contains the configuration information for the PLLI2S - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit) -{ - uint32_t tickstart; - - /* Check for parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PLLI2SInit->PLLI2SN)); - assert_param(IS_RCC_PLLI2SR_VALUE(PLLI2SInit->PLLI2SR)); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - assert_param(IS_RCC_PLLI2SM_VALUE(PLLI2SInit->PLLI2SM)); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ -#if defined(RCC_PLLI2SCFGR_PLLI2SP) - assert_param(IS_RCC_PLLI2SP_VALUE(PLLI2SInit->PLLI2SP)); -#endif /* RCC_PLLI2SCFGR_PLLI2SP */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) - assert_param(IS_RCC_PLLI2SQ_VALUE(PLLI2SInit->PLLI2SQ)); -#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - - /* Wait till PLLI2S is disabled */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Configure the PLLI2S division factors */ -#if defined(STM32F446xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SPCLK = PLLI2S_VCO / PLLI2SP */ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ - PLLI2SInit->PLLI2SP, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ - PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * PLLI2SN */ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F411xE) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); -#else - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x PLLI2SN */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); -#endif /* STM32F446xx */ - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - - /* Wait till PLLI2S is ready */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Disable PLLI2S. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void) -{ - uint32_t tickstart; - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - - /* Wait till PLLI2S is disabled */ - tickstart = HAL_GetTick(); - while (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Enable PLLSAI. - * @param PLLSAIInit pointer to an RCC_PLLSAIInitTypeDef structure that - * contains the configuration information for the PLLSAI - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit) -{ - uint32_t tickstart; - - /* Check for parameters */ - assert_param(IS_RCC_PLLSAIN_VALUE(PLLSAIInit->PLLSAIN)); - assert_param(IS_RCC_PLLSAIQ_VALUE(PLLSAIInit->PLLSAIQ)); -#if defined(RCC_PLLSAICFGR_PLLSAIM) - assert_param(IS_RCC_PLLSAIM_VALUE(PLLSAIInit->PLLSAIM)); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ -#if defined(RCC_PLLSAICFGR_PLLSAIP) - assert_param(IS_RCC_PLLSAIP_VALUE(PLLSAIInit->PLLSAIP)); -#endif /* RCC_PLLSAICFGR_PLLSAIP */ -#if defined(RCC_PLLSAICFGR_PLLSAIR) - assert_param(IS_RCC_PLLSAIR_VALUE(PLLSAIInit->PLLSAIR)); -#endif /* RCC_PLLSAICFGR_PLLSAIR */ - - /* Disable the PLLSAI */ - __HAL_RCC_PLLSAI_DISABLE(); - - /* Wait till PLLSAI is disabled */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Configure the PLLSAI division factors */ -#if defined(STM32F446xx) - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLSAIN/PLLSAIM) */ - /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIM, PLLSAIInit->PLLSAIN, \ - PLLSAIInit->PLLSAIP, PLLSAIInit->PLLSAIQ, 0U); -#elif defined(STM32F469xx) || defined(STM32F479xx) - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * PLLSAIN */ - /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIP, \ - PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); -#else - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) x PLLSAIN */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); -#endif /* STM32F446xx */ - - /* Enable the PLLSAI */ - __HAL_RCC_PLLSAI_ENABLE(); - - /* Wait till PLLSAI is ready */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Disable PLLSAI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void) -{ - uint32_t tickstart; - - /* Disable the PLLSAI */ - __HAL_RCC_PLLSAI_DISABLE(); - - /* Wait till PLLSAI is disabled */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @} - */ - -#if defined(STM32F446xx) -/** - * @brief Returns the SYSCLK frequency - * - * @note This function implementation is valid only for STM32F446xx devices. - * @note This function add the PLL/PLLR System clock source - * - * @note The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) - * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) - * @note If SYSCLK source is PLL or PLLR, function returns values based on HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * @note The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @note This function can be used by the user application to compute the - * baudrate for the communication peripherals or configure other parameters. - * - * @note Each time SYSCLK changes, this function must be called to update the - * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * - * @retval SYSCLK frequency - */ -uint32_t HAL_RCC_GetSysClockFreq(void) -{ - uint32_t pllm = 0U; - uint32_t pllvco = 0U; - uint32_t pllp = 0U; - uint32_t pllr = 0U; - uint32_t sysclockfreq = 0U; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) - { - case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ - { - sysclockfreq = HSI_VALUE; - break; - } - case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ - { - sysclockfreq = HSE_VALUE; - break; - } - case RCC_CFGR_SWS_PLL: /* PLL/PLLP used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLP */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) * 2U); - - sysclockfreq = pllvco / pllp; - break; - } - case RCC_CFGR_SWS_PLLR: /* PLL/PLLR used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLR */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllr = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); - - sysclockfreq = pllvco / pllr; - break; - } - default: - { - sysclockfreq = HSI_VALUE; - break; - } - } - return sysclockfreq; -} -#endif /* STM32F446xx */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * - HSI ON and used as system clock source - * - HSE, PLL, PLLI2S and PLLSAI OFF - * - AHB, APB1 and APB2 prescaler set to 1. - * - CSS, MCO1 and MCO2 OFF - * - All interrupts disabled - * @note This function doesn't modify the configuration of the - * - Peripheral clocks - * - LSI, LSE and RTC clocks - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCC_DeInit(void) -{ - uint32_t tickstart; - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Set HSION bit to the reset value */ - SET_BIT(RCC->CR, RCC_CR_HSION); - - /* Wait till HSI is ready */ - while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Set HSITRIM[4:0] bits to the reset value */ - SET_BIT(RCC->CR, RCC_CR_HSITRIM_4); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset CFGR register */ - CLEAR_REG(RCC->CFGR); - - /* Wait till clock switch is ready */ - while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RESET) - { - if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Clear HSEON, HSEBYP and CSSON bits */ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_CSSON); - - /* Wait till HSE is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_HSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Clear PLLON bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLON); - - /* Wait till PLL is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - -#if defined(RCC_PLLI2S_SUPPORT) - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset PLLI2SON bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); - - /* Wait till PLLI2S is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset PLLSAI bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); - - /* Wait till PLLSAI is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } -#endif /* RCC_PLLSAI_SUPPORT */ - - /* Once PLL, PLLI2S and PLLSAI are OFF, reset PLLCFGR register to default value */ -#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ - defined(STM32F423xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLR_1; -#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) - RCC->PLLCFGR = RCC_PLLCFGR_PLLR_0 | RCC_PLLCFGR_PLLR_1 | RCC_PLLCFGR_PLLR_2 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_0 | RCC_PLLCFGR_PLLQ_1 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLQ_3; -#else - RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2; -#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx || STM32F469xx || STM32F479xx */ - - /* Reset PLLI2SCFGR register to default value */ -#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ - defined(STM32F423xx) || defined(STM32F446xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F411xE) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; -#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx */ - - /* Reset PLLSAICFGR register */ -#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIR_1; -#elif defined(STM32F446xx) - RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2; -#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F469xx || STM32F479xx */ - - /* Disable all interrupts */ - CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE | RCC_CIR_LSERDYIE | RCC_CIR_HSIRDYIE | RCC_CIR_HSERDYIE | RCC_CIR_PLLRDYIE); - -#if defined(RCC_CIR_PLLI2SRDYIE) - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); -#endif /* RCC_CIR_PLLI2SRDYIE */ - -#if defined(RCC_CIR_PLLSAIRDYIE) - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); -#endif /* RCC_CIR_PLLSAIRDYIE */ - - /* Clear all interrupt flags */ - SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR_PLLRDYC | - RCC_CIR_CSSC); - -#if defined(RCC_CIR_PLLI2SRDYC) - SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); -#endif /* RCC_CIR_PLLI2SRDYC */ - -#if defined(RCC_CIR_PLLSAIRDYC) - SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); -#endif /* RCC_CIR_PLLSAIRDYC */ - - /* Clear LSION bit */ - CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); - - /* Reset all CSR flags */ - SET_BIT(RCC->CSR, RCC_CSR_RMVF); - - /* Update the SystemCoreClock global variable */ - SystemCoreClock = HSI_VALUE; - - /* Adapt Systick interrupt period */ - if (HAL_InitTick(uwTickPrio) != HAL_OK) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Initializes the RCC Oscillators according to the specified parameters in the - * RCC_OscInitTypeDef. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC Oscillators. - * @note The PLL is not disabled when used as system clock. - * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not - * supported by this API. User should request a transition to LSE Off - * first and then LSE On or LSE Bypass. - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not - * supported by this API. User should request a transition to HSE Off - * first and then HSE On or HSE Bypass. - * @note This function add the PLL/PLLR factor management during PLL configuration this feature - * is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - uint32_t tickstart; - uint32_t pll_config; - - /* Check Null pointer */ - if (RCC_OscInitStruct == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); - /*------------------------------- HSE Configuration ------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) - { - /* Check the parameters */ - assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); - /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ -#if defined(STM32F446xx) - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) - || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) -#else - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) - || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) -#endif /* STM32F446xx */ - { - if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) - { - return HAL_ERROR; - } - } - else - { - /* Set the new HSE configuration ---------------------------------------*/ - __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); - - /* Check the HSE State */ - if ((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSE is bypassed or disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*----------------------------- HSI Configuration --------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) - { - /* Check the parameters */ - assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); - assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); - - /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ -#if defined(STM32F446xx) - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) - || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) -#else - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) - || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) -#endif /* STM32F446xx */ - { - /* When HSI is used as system clock it will not disabled */ - if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) - { - return HAL_ERROR; - } - /* Otherwise, just the calibration is allowed */ - else - { - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - } - else - { - /* Check the HSI State */ - if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) - { - /* Enable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - else - { - /* Disable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*------------------------------ LSI Configuration -------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) - { - /* Check the parameters */ - assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); - - /* Check the LSI State */ - if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) - { - /* Enable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - /*------------------------------ LSE Configuration -------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) - { - FlagStatus pwrclkchanged = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); - - /* Update LSE configuration in Backup Domain control register */ - /* Requires to enable write access to Backup Domain of necessary */ - if (__HAL_RCC_PWR_IS_CLK_DISABLED()) - { - __HAL_RCC_PWR_CLK_ENABLE(); - pwrclkchanged = SET; - } - - if (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - /* Enable write access to Backup domain */ - SET_BIT(PWR->CR, PWR_CR_DBP); - - /* Wait for Backup domain Write protection disable */ - tickstart = HAL_GetTick(); - - while (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Set the new LSE configuration -----------------------------------------*/ - __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); - /* Check the LSE State */ - if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Restore clock configuration if changed */ - if (pwrclkchanged == SET) - { - __HAL_RCC_PWR_CLK_DISABLE(); - } - } - /*-------------------------------- PLL Configuration -----------------------*/ - /* Check the parameters */ - assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); - if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) - { - /* Check if the PLL is used as system clock or not */ - if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) - { - /* Check the parameters */ - assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); - assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); - assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); - assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); - assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); - assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR)); - - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Configure the main PLL clock source, multiplication and division factors. */ - WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ - RCC_OscInitStruct->PLL.PLLM | \ - (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ - (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ - (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos) | \ - (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))); - /* Enable the main PLL. */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - else - { - /* Check if there is a request to disable the PLL used as System clock source */ - if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) - { - return HAL_ERROR; - } - else - { - /* Do not return HAL_ERROR if request repeats the current configuration */ - pll_config = RCC->PLLCFGR; -#if defined (RCC_PLLCFGR_PLLR) - if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) -#else - if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) -#endif /* RCC_PLLCFGR_PLLR */ - { - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that will be configured. - * - * @note This function is only available in case of STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. - * @note This function add the PLL/PLLR factor management - * @retval None - */ -void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - /* Set all possible values for the Oscillator type parameter ---------------*/ - RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; - - /* Get the HSE configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) - { - RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; - } - else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) - { - RCC_OscInitStruct->HSEState = RCC_HSE_ON; - } - else - { - RCC_OscInitStruct->HSEState = RCC_HSE_OFF; - } - - /* Get the HSI configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) - { - RCC_OscInitStruct->HSIState = RCC_HSI_ON; - } - else - { - RCC_OscInitStruct->HSIState = RCC_HSI_OFF; - } - - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); - - /* Get the LSE configuration -----------------------------------------------*/ - if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) - { - RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; - } - else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) - { - RCC_OscInitStruct->LSEState = RCC_LSE_ON; - } - else - { - RCC_OscInitStruct->LSEState = RCC_LSE_OFF; - } - - /* Get the LSI configuration -----------------------------------------------*/ - if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) - { - RCC_OscInitStruct->LSIState = RCC_LSI_ON; - } - else - { - RCC_OscInitStruct->LSIState = RCC_LSI_OFF; - } - - /* Get the PLL configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; - } - else - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; - } - RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); - RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); - RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); - RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); - RCC_OscInitStruct->PLL.PLLR = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); -} -#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#endif /* HAL_RCC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c deleted file mode 100644 index 99b5549..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c +++ /dev/null @@ -1,3930 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_spi.c - * @author MCD Application Team - * @brief SPI HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Serial Peripheral Interface (SPI) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State functions - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The SPI HAL driver can be used as follows: - - (#) Declare a SPI_HandleTypeDef handle structure, for example: - SPI_HandleTypeDef hspi; - - (#)Initialize the SPI low level resources by implementing the HAL_SPI_MspInit() API: - (##) Enable the SPIx interface clock - (##) SPI pins configuration - (+++) Enable the clock for the SPI GPIOs - (+++) Configure these SPI pins as alternate function push-pull - (##) NVIC configuration if you need to use interrupt process - (+++) Configure the SPIx interrupt priority - (+++) Enable the NVIC SPI IRQ handle - (##) DMA Configuration if you need to use DMA process - (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive Stream/Channel - (+++) Enable the DMAx clock - (+++) Configure the DMA handle parameters - (+++) Configure the DMA Tx or Rx Stream/Channel - (+++) Associate the initialized hdma_tx(or _rx) handle to the hspi DMA Tx or Rx handle - (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream/Channel - - (#) Program the Mode, BidirectionalMode , Data size, Baudrate Prescaler, NSS - management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure. - - (#) Initialize the SPI registers by calling the HAL_SPI_Init() API: - (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) - by calling the customized HAL_SPI_MspInit() API. - [..] - Circular mode restriction: - (#) The DMA circular mode cannot be used when the SPI is configured in these modes: - (##) Master 2Lines RxOnly - (##) Master 1Line Rx - (#) The CRC feature is not managed when the DMA circular mode is enabled - (#) When the SPI DMA Pause/Stop features are used, we must use the following APIs - the HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() only under the SPI callbacks - [..] - Master Receive mode restriction: - (#) In Master unidirectional receive-only mode (MSTR =1, BIDIMODE=0, RXONLY=1) or - bidirectional receive mode (MSTR=1, BIDIMODE=1, BIDIOE=0), to ensure that the SPI - does not initiate a new transfer the following procedure has to be respected: - (##) HAL_SPI_DeInit() - (##) HAL_SPI_Init() - [..] - Callback registration: - - (#) The compilation flag USE_HAL_SPI_REGISTER_CALLBACKS when set to 1U - allows the user to configure dynamically the driver callbacks. - Use Functions HAL_SPI_RegisterCallback() to register an interrupt callback. - - Function HAL_SPI_RegisterCallback() allows to register following callbacks: - (++) TxCpltCallback : SPI Tx Completed callback - (++) RxCpltCallback : SPI Rx Completed callback - (++) TxRxCpltCallback : SPI TxRx Completed callback - (++) TxHalfCpltCallback : SPI Tx Half Completed callback - (++) RxHalfCpltCallback : SPI Rx Half Completed callback - (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback - (++) ErrorCallback : SPI Error callback - (++) AbortCpltCallback : SPI Abort callback - (++) MspInitCallback : SPI Msp Init callback - (++) MspDeInitCallback : SPI Msp DeInit callback - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - - - (#) Use function HAL_SPI_UnRegisterCallback to reset a callback to the default - weak function. - HAL_SPI_UnRegisterCallback takes as parameters the HAL peripheral handle, - and the Callback ID. - This function allows to reset following callbacks: - (++) TxCpltCallback : SPI Tx Completed callback - (++) RxCpltCallback : SPI Rx Completed callback - (++) TxRxCpltCallback : SPI TxRx Completed callback - (++) TxHalfCpltCallback : SPI Tx Half Completed callback - (++) RxHalfCpltCallback : SPI Rx Half Completed callback - (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback - (++) ErrorCallback : SPI Error callback - (++) AbortCpltCallback : SPI Abort callback - (++) MspInitCallback : SPI Msp Init callback - (++) MspDeInitCallback : SPI Msp DeInit callback - - [..] - By default, after the HAL_SPI_Init() and when the state is HAL_SPI_STATE_RESET - all callbacks are set to the corresponding weak functions: - examples HAL_SPI_MasterTxCpltCallback(), HAL_SPI_MasterRxCpltCallback(). - Exception done for MspInit and MspDeInit functions that are - reset to the legacy weak functions in the HAL_SPI_Init()/ HAL_SPI_DeInit() only when - these callbacks are null (not registered beforehand). - If MspInit or MspDeInit are not null, the HAL_SPI_Init()/ HAL_SPI_DeInit() - keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - - [..] - Callbacks can be registered/unregistered in HAL_SPI_STATE_READY state only. - Exception done MspInit/MspDeInit functions that can be registered/unregistered - in HAL_SPI_STATE_READY or HAL_SPI_STATE_RESET state, - thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. - Then, the user first registers the MspInit/MspDeInit user callbacks - using HAL_SPI_RegisterCallback() before calling HAL_SPI_DeInit() - or HAL_SPI_Init() function. - - [..] - When the compilation define USE_HAL_PPP_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registering feature is not available - and weak (surcharged) callbacks are used. - - [..] - Using the HAL it is not possible to reach all supported SPI frequency with the different SPI Modes, - the following table resume the max SPI frequency reached with data size 8bits/16bits, - according to frequency of the APBx Peripheral Clock (fPCLK) used by the SPI instance. - - @endverbatim - - Additional table : - - DataSize = SPI_DATASIZE_8BIT: - +----------------------------------------------------------------------------------------------+ - | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | - | Process | Transfer mode |---------------------|----------------------|----------------------| - | | | Master | Slave | Master | Slave | Master | Slave | - |==============================================================================================| - | T | Polling | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | / | Interrupt | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA | - | R |----------------|----------|----------|-----------|----------|-----------|----------| - | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | R | Interrupt | Fpclk/8 | Fpclk/8 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/128 | Fpclk/2 | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/2 | Fpclk/64 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/2 | Fpclk/64 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/128| - +----------------------------------------------------------------------------------------------+ - - DataSize = SPI_DATASIZE_16BIT: - +----------------------------------------------------------------------------------------------+ - | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | - | Process | Transfer mode |---------------------|----------------------|----------------------| - | | | Master | Slave | Master | Slave | Master | Slave | - |==============================================================================================| - | T | Polling | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | / | Interrupt | Fpclk/4 | Fpclk/4 | NA | NA | NA | NA | - | R |----------------|----------|----------|-----------|----------|-----------|----------| - | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/32 | Fpclk/2 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | R | Interrupt | Fpclk/4 | Fpclk/4 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/128 | Fpclk/2 | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/32 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | T | Interrupt | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/64 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/128| - +----------------------------------------------------------------------------------------------+ - @note The max SPI frequency depend on SPI data size (8bits, 16bits), - SPI mode(2 Lines fullduplex, 2 lines RxOnly, 1 line TX/RX) and Process mode (Polling, IT, DMA). - @note - (#) TX/RX processes are HAL_SPI_TransmitReceive(), HAL_SPI_TransmitReceive_IT() and HAL_SPI_TransmitReceive_DMA() - (#) RX processes are HAL_SPI_Receive(), HAL_SPI_Receive_IT() and HAL_SPI_Receive_DMA() - (#) TX processes are HAL_SPI_Transmit(), HAL_SPI_Transmit_IT() and HAL_SPI_Transmit_DMA() - - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup SPI SPI - * @brief SPI HAL module driver - * @{ - */ -#ifdef HAL_SPI_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private defines -----------------------------------------------------------*/ -/** @defgroup SPI_Private_Constants SPI Private Constants - * @{ - */ -#define SPI_DEFAULT_TIMEOUT 100U -#define SPI_BSY_FLAG_WORKAROUND_TIMEOUT 1000U /*!< Timeout 1000 µs */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @defgroup SPI_Private_Functions SPI Private Functions - * @{ - */ -static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAError(DMA_HandleTypeDef *hdma); -static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma); -static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma); -static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State, - uint32_t Timeout, uint32_t Tickstart); -static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi); -#if (USE_SPI_CRC != 0U) -static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi); -static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); -#endif /* USE_SPI_CRC */ -static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi); -static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi); -static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi); -static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi); -static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi); -static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SPI_Exported_Functions SPI Exported Functions - * @{ - */ - -/** @defgroup SPI_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the SPIx peripheral: - - (+) User must implement HAL_SPI_MspInit() function in which he configures - all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ). - - (+) Call the function HAL_SPI_Init() to configure the selected device with - the selected configuration: - (++) Mode - (++) Direction - (++) Data Size - (++) Clock Polarity and Phase - (++) NSS Management - (++) BaudRate Prescaler - (++) FirstBit - (++) TIMode - (++) CRC Calculation - (++) CRC Polynomial if CRC enabled - - (+) Call the function HAL_SPI_DeInit() to restore the default configuration - of the selected SPIx peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the SPI according to the specified parameters - * in the SPI_InitTypeDef and initialize the associated handle. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi) -{ - /* Check the SPI handle allocation */ - if (hspi == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance)); - assert_param(IS_SPI_MODE(hspi->Init.Mode)); - assert_param(IS_SPI_DIRECTION(hspi->Init.Direction)); - assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize)); - assert_param(IS_SPI_NSS(hspi->Init.NSS)); - assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); - assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit)); - assert_param(IS_SPI_TIMODE(hspi->Init.TIMode)); - if (hspi->Init.TIMode == SPI_TIMODE_DISABLE) - { - assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity)); - assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase)); - - if (hspi->Init.Mode == SPI_MODE_MASTER) - { - assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); - } - else - { - /* Baudrate prescaler not use in Motoraola Slave mode. force to default value */ - hspi->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - } - } - else - { - assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); - - /* Force polarity and phase to TI protocaol requirements */ - hspi->Init.CLKPolarity = SPI_POLARITY_LOW; - hspi->Init.CLKPhase = SPI_PHASE_1EDGE; - } -#if (USE_SPI_CRC != 0U) - assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation)); - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial)); - } -#else - hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; -#endif /* USE_SPI_CRC */ - - if (hspi->State == HAL_SPI_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hspi->Lock = HAL_UNLOCKED; - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - /* Init the SPI Callback settings */ - hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback */ - hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback */ - hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ - hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ - hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ - hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */ - hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback */ - hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - - if (hspi->MspInitCallback == NULL) - { - hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ - } - - /* Init the low level hardware : GPIO, CLOCK, NVIC... */ - hspi->MspInitCallback(hspi); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC... */ - HAL_SPI_MspInit(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - - hspi->State = HAL_SPI_STATE_BUSY; - - /* Disable the selected SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - - /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/ - /* Configure : SPI Mode, Communication Mode, Data size, Clock polarity and phase, NSS management, - Communication speed, First bit and CRC calculation state */ - WRITE_REG(hspi->Instance->CR1, ((hspi->Init.Mode & (SPI_CR1_MSTR | SPI_CR1_SSI)) | - (hspi->Init.Direction & (SPI_CR1_RXONLY | SPI_CR1_BIDIMODE)) | - (hspi->Init.DataSize & SPI_CR1_DFF) | - (hspi->Init.CLKPolarity & SPI_CR1_CPOL) | - (hspi->Init.CLKPhase & SPI_CR1_CPHA) | - (hspi->Init.NSS & SPI_CR1_SSM) | - (hspi->Init.BaudRatePrescaler & SPI_CR1_BR_Msk) | - (hspi->Init.FirstBit & SPI_CR1_LSBFIRST) | - (hspi->Init.CRCCalculation & SPI_CR1_CRCEN))); - - /* Configure : NSS management, TI Mode */ - WRITE_REG(hspi->Instance->CR2, (((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) | (hspi->Init.TIMode & SPI_CR2_FRF))); - -#if (USE_SPI_CRC != 0U) - /*---------------------------- SPIx CRCPOLY Configuration ------------------*/ - /* Configure : CRC Polynomial */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - WRITE_REG(hspi->Instance->CRCPR, (hspi->Init.CRCPolynomial & SPI_CRCPR_CRCPOLY_Msk)); - } -#endif /* USE_SPI_CRC */ - -#if defined(SPI_I2SCFGR_I2SMOD) - /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */ - CLEAR_BIT(hspi->Instance->I2SCFGR, SPI_I2SCFGR_I2SMOD); -#endif /* SPI_I2SCFGR_I2SMOD */ - - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->State = HAL_SPI_STATE_READY; - - return HAL_OK; -} - -/** - * @brief De-Initialize the SPI peripheral. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi) -{ - /* Check the SPI handle allocation */ - if (hspi == NULL) - { - return HAL_ERROR; - } - - /* Check SPI Instance parameter */ - assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance)); - - hspi->State = HAL_SPI_STATE_BUSY; - - /* Disable the SPI Peripheral Clock */ - __HAL_SPI_DISABLE(hspi); - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - if (hspi->MspDeInitCallback == NULL) - { - hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ - } - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ - hspi->MspDeInitCallback(hspi); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ - HAL_SPI_MspDeInit(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->State = HAL_SPI_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hspi); - - return HAL_OK; -} - -/** - * @brief Initialize the SPI MSP. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_MspInit should be implemented in the user file - */ -} - -/** - * @brief De-Initialize the SPI MSP. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_MspDeInit should be implemented in the user file - */ -} - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -/** - * @brief Register a User SPI Callback - * To be used instead of the weak predefined callback - * @param hspi Pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI. - * @param CallbackID ID of the callback to be registered - * @param pCallback pointer to the Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID, - pSPI_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hspi->ErrorCode |= HAL_SPI_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hspi); - - if (HAL_SPI_STATE_READY == hspi->State) - { - switch (CallbackID) - { - case HAL_SPI_TX_COMPLETE_CB_ID : - hspi->TxCpltCallback = pCallback; - break; - - case HAL_SPI_RX_COMPLETE_CB_ID : - hspi->RxCpltCallback = pCallback; - break; - - case HAL_SPI_TX_RX_COMPLETE_CB_ID : - hspi->TxRxCpltCallback = pCallback; - break; - - case HAL_SPI_TX_HALF_COMPLETE_CB_ID : - hspi->TxHalfCpltCallback = pCallback; - break; - - case HAL_SPI_RX_HALF_COMPLETE_CB_ID : - hspi->RxHalfCpltCallback = pCallback; - break; - - case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID : - hspi->TxRxHalfCpltCallback = pCallback; - break; - - case HAL_SPI_ERROR_CB_ID : - hspi->ErrorCallback = pCallback; - break; - - case HAL_SPI_ABORT_CB_ID : - hspi->AbortCpltCallback = pCallback; - break; - - case HAL_SPI_MSPINIT_CB_ID : - hspi->MspInitCallback = pCallback; - break; - - case HAL_SPI_MSPDEINIT_CB_ID : - hspi->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_SPI_STATE_RESET == hspi->State) - { - switch (CallbackID) - { - case HAL_SPI_MSPINIT_CB_ID : - hspi->MspInitCallback = pCallback; - break; - - case HAL_SPI_MSPDEINIT_CB_ID : - hspi->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hspi); - return status; -} - -/** - * @brief Unregister an SPI Callback - * SPI callback is redirected to the weak predefined callback - * @param hspi Pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI. - * @param CallbackID ID of the callback to be unregistered - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hspi); - - if (HAL_SPI_STATE_READY == hspi->State) - { - switch (CallbackID) - { - case HAL_SPI_TX_COMPLETE_CB_ID : - hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback */ - break; - - case HAL_SPI_RX_COMPLETE_CB_ID : - hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback */ - break; - - case HAL_SPI_TX_RX_COMPLETE_CB_ID : - hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ - break; - - case HAL_SPI_TX_HALF_COMPLETE_CB_ID : - hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ - break; - - case HAL_SPI_RX_HALF_COMPLETE_CB_ID : - hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ - break; - - case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID : - hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */ - break; - - case HAL_SPI_ERROR_CB_ID : - hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback */ - break; - - case HAL_SPI_ABORT_CB_ID : - hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - break; - - case HAL_SPI_MSPINIT_CB_ID : - hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_SPI_MSPDEINIT_CB_ID : - hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_SPI_STATE_RESET == hspi->State) - { - switch (CallbackID) - { - case HAL_SPI_MSPINIT_CB_ID : - hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_SPI_MSPDEINIT_CB_ID : - hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hspi); - return status; -} -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup SPI_Exported_Functions_Group2 IO operation functions - * @brief Data transfers functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the SPI - data transfers. - - [..] The SPI supports master and slave mode : - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode: The communication is performed using Interrupts - or DMA, These APIs return the HAL status. - The end of the data processing will be indicated through the - dedicated SPI IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The HAL_SPI_TxCpltCallback(), HAL_SPI_RxCpltCallback() and HAL_SPI_TxRxCpltCallback() user callbacks - will be executed respectively at the end of the transmit or Receive process - The HAL_SPI_ErrorCallback()user callback will be executed when a communication error is detected - - (#) APIs provided for these 2 transfer modes (Blocking mode or Non blocking mode using either Interrupt or DMA) - exist for 1Line (simplex) and 2Lines (full duplex) modes. - -@endverbatim - * @{ - */ - -/** - * @brief Transmit an amount of data in blocking mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer - * @param Size amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - uint32_t tickstart; - uint16_t initial_TxXferCount; - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - initial_TxXferCount = Size; - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_TX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->pRxBuffPtr = (uint8_t *)NULL; - hspi->RxXferSize = 0U; - hspi->RxXferCount = 0U; - hspi->TxISR = NULL; - hspi->RxISR = NULL; - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_TX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Transmit data in 16 Bit mode */ - if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) - { - if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) - { - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - } - /* Transmit data in 16 Bit mode */ - while (hspi->TxXferCount > 0U) - { - /* Wait until TXE flag is set to send data */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) - { - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - } - else - { - /* Timeout management */ - if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - } - /* Transmit data in 8 Bit mode */ - else - { - if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) - { - *((__IO uint8_t *)&hspi->Instance->DR) = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint8_t); - hspi->TxXferCount--; - } - while (hspi->TxXferCount > 0U) - { - /* Wait until TXE flag is set to send data */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) - { - *((__IO uint8_t *)&hspi->Instance->DR) = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint8_t); - hspi->TxXferCount--; - } - else - { - /* Timeout management */ - if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - } -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_FLAG; - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - hspi->State = HAL_SPI_STATE_READY; - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -/** - * @brief Receive an amount of data in blocking mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer - * @param Size amount of data to be received - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ -#if (USE_SPI_CRC != 0U) - __IO uint32_t tmpreg = 0U; -#endif /* USE_SPI_CRC */ - uint32_t tickstart; - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES)) - { - hspi->State = HAL_SPI_STATE_BUSY_RX; - /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ - return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout); - } - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_RX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pRxBuffPtr = (uint8_t *)pData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->pTxBuffPtr = (uint8_t *)NULL; - hspi->TxXferSize = 0U; - hspi->TxXferCount = 0U; - hspi->RxISR = NULL; - hspi->TxISR = NULL; - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - /* this is done to handle the CRCNEXT before the latest data */ - hspi->RxXferCount--; - } -#endif /* USE_SPI_CRC */ - - /* Configure communication direction: 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_RX(hspi); - } - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Receive data in 8 Bit mode */ - if (hspi->Init.DataSize == SPI_DATASIZE_8BIT) - { - /* Transfer loop */ - while (hspi->RxXferCount > 0U) - { - /* Check the RXNE flag */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) - { - /* read the received data */ - (* (uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; - hspi->pRxBuffPtr += sizeof(uint8_t); - hspi->RxXferCount--; - } - else - { - /* Timeout management */ - if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - } - else - { - /* Transfer loop */ - while (hspi->RxXferCount > 0U) - { - /* Check the RXNE flag */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) - { - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; - hspi->pRxBuffPtr += sizeof(uint16_t); - hspi->RxXferCount--; - } - else - { - /* Timeout management */ - if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - } - -#if (USE_SPI_CRC != 0U) - /* Handle the CRC Transmission */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* freeze the CRC before the latest data */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - - /* Read the latest data */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) - { - /* the latest data has not been received */ - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - - /* Receive last data in 16 Bit mode */ - if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) - { - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; - } - /* Receive last data in 8 Bit mode */ - else - { - (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; - } - - /* Wait the CRC data */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - - /* Read CRC to Flush DR and RXNE flag */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - } -#endif /* USE_SPI_CRC */ - - /* Check the end of the transaction */ - if (SPI_EndRxTransaction(hspi, Timeout, tickstart) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_FLAG; - } - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - } -#endif /* USE_SPI_CRC */ - - hspi->State = HAL_SPI_STATE_READY; - /* Unlock the process */ - __HAL_UNLOCK(hspi); - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -/** - * @brief Transmit and Receive an amount of data in blocking mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pTxData pointer to transmission data buffer - * @param pRxData pointer to reception data buffer - * @param Size amount of data to be sent and received - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size, uint32_t Timeout) -{ - uint16_t initial_TxXferCount; - uint32_t tmp_mode; - HAL_SPI_StateTypeDef tmp_state; - uint32_t tickstart; -#if (USE_SPI_CRC != 0U) - __IO uint32_t tmpreg = 0U; -#endif /* USE_SPI_CRC */ - - /* Variable used to alternate Rx and Tx during transfer */ - uint32_t txallowed = 1U; - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* Init temporary variables */ - tmp_state = hspi->State; - tmp_mode = hspi->Init.Mode; - initial_TxXferCount = Size; - - if (!((tmp_state == HAL_SPI_STATE_READY) || \ - ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX)))) - { - return HAL_BUSY; - } - - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ - if (hspi->State != HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; - } - - /* Set the transaction information */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pRxBuffPtr = (uint8_t *)pRxData; - hspi->RxXferCount = Size; - hspi->RxXferSize = Size; - hspi->pTxBuffPtr = (const uint8_t *)pTxData; - hspi->TxXferCount = Size; - hspi->TxXferSize = Size; - - /*Init field not used in handle to zero */ - hspi->RxISR = NULL; - hspi->TxISR = NULL; - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Transmit and Receive data in 16 Bit mode */ - if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) - { - if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) - { - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - - } - while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) - { - /* Check TXE flag */ - if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U)) - { - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - /* Next Data is a reception (Rx). Tx not allowed */ - txallowed = 0U; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - } - - /* Check RXNE flag */ - if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) - { - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; - hspi->pRxBuffPtr += sizeof(uint16_t); - hspi->RxXferCount--; - /* Next Data is a Transmission (Tx). Tx is allowed */ - txallowed = 1U; - } - if (((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - /* Transmit and Receive data in 8 Bit mode */ - else - { - if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) - { - *((__IO uint8_t *)&hspi->Instance->DR) = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint8_t); - hspi->TxXferCount--; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - } - while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) - { - /* Check TXE flag */ - if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U)) - { - *(__IO uint8_t *)&hspi->Instance->DR = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr++; - hspi->TxXferCount--; - /* Next Data is a reception (Rx). Tx not allowed */ - txallowed = 0U; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - } - - /* Wait until RXNE flag is reset */ - if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) - { - (*(uint8_t *)hspi->pRxBuffPtr) = hspi->Instance->DR; - hspi->pRxBuffPtr++; - hspi->RxXferCount--; - /* Next Data is a Transmission (Tx). Tx is allowed */ - txallowed = 1U; - } - if ((((HAL_GetTick() - tickstart) >= Timeout) && ((Timeout != HAL_MAX_DELAY))) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - -#if (USE_SPI_CRC != 0U) - /* Read CRC from DR to close CRC calculation process */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Wait until TXE flag */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) - { - /* Error on the CRC reception */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - /* Read CRC */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - } - - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - /* Clear CRC Flag */ - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } -#endif /* USE_SPI_CRC */ - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_FLAG; - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - - hspi->State = HAL_SPI_STATE_READY; - /* Unlock the process */ - __HAL_UNLOCK(hspi); - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -/** - * @brief Transmit an amount of data in non-blocking mode with Interrupt. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer - * @param Size amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size) -{ - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); - - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_TX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - /* Init field not used in handle to zero */ - hspi->pRxBuffPtr = (uint8_t *)NULL; - hspi->RxXferSize = 0U; - hspi->RxXferCount = 0U; - hspi->RxISR = NULL; - - /* Set the function for IT treatment */ - if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) - { - hspi->TxISR = SPI_TxISR_16BIT; - } - else - { - hspi->TxISR = SPI_TxISR_8BIT; - } - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_TX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - /* Enable TXE and ERR interrupt */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); - - return HAL_OK; -} - -/** - * @brief Receive an amount of data in non-blocking mode with Interrupt. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer - * @param Size amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) -{ - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) - { - hspi->State = HAL_SPI_STATE_BUSY_RX; - /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ - return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size); - } - - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_RX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pRxBuffPtr = (uint8_t *)pData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /* Init field not used in handle to zero */ - hspi->pTxBuffPtr = (uint8_t *)NULL; - hspi->TxXferSize = 0U; - hspi->TxXferCount = 0U; - hspi->TxISR = NULL; - - /* Set the function for IT treatment */ - if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) - { - hspi->RxISR = SPI_RxISR_16BIT; - } - else - { - hspi->RxISR = SPI_RxISR_8BIT; - } - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_RX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Note : The SPI must be enabled after unlocking current process - to avoid the risk of SPI interrupt handle execution before current - process unlock */ - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - /* Enable RXNE and ERR interrupt */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - return HAL_OK; -} - -/** - * @brief Transmit and Receive an amount of data in non-blocking mode with Interrupt. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pTxData pointer to transmission data buffer - * @param pRxData pointer to reception data buffer - * @param Size amount of data to be sent and received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size) -{ - uint32_t tmp_mode; - HAL_SPI_StateTypeDef tmp_state; - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); - - /* Init temporary variables */ - tmp_state = hspi->State; - tmp_mode = hspi->Init.Mode; - - if (!((tmp_state == HAL_SPI_STATE_READY) || \ - ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX)))) - { - return HAL_BUSY; - } - - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hspi); - - /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ - if (hspi->State != HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; - } - - /* Set the transaction information */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pTxData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - hspi->pRxBuffPtr = (uint8_t *)pRxData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /* Set the function for IT treatment */ - if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) - { - hspi->RxISR = SPI_2linesRxISR_16BIT; - hspi->TxISR = SPI_2linesTxISR_16BIT; - } - else - { - hspi->RxISR = SPI_2linesRxISR_8BIT; - hspi->TxISR = SPI_2linesTxISR_8BIT; - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - /* Enable TXE, RXNE and ERR interrupt */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); - - return HAL_OK; -} - -/** - * @brief Transmit an amount of data in non-blocking mode with DMA. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer - * @param Size amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size) -{ - - /* Check tx dma handle */ - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_TX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - /* Init field not used in handle to zero */ - hspi->pRxBuffPtr = (uint8_t *)NULL; - hspi->TxISR = NULL; - hspi->RxISR = NULL; - hspi->RxXferSize = 0U; - hspi->RxXferCount = 0U; - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_TX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Set the SPI TxDMA Half transfer complete callback */ - hspi->hdmatx->XferHalfCpltCallback = SPI_DMAHalfTransmitCplt; - - /* Set the SPI TxDMA transfer complete callback */ - hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt; - - /* Set the DMA error callback */ - hspi->hdmatx->XferErrorCallback = SPI_DMAError; - - /* Set the DMA AbortCpltCallback */ - hspi->hdmatx->XferAbortCallback = NULL; - - /* Enable the Tx DMA Stream/Channel */ - if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, - hspi->TxXferCount)) - { - /* Update SPI error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Enable the SPI Error Interrupt Bit */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); - - /* Enable Tx DMA Request */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); - - return HAL_OK; -} - -/** - * @brief Receive an amount of data in non-blocking mode with DMA. - * @note In case of MASTER mode and SPI_DIRECTION_2LINES direction, hdmatx shall be defined. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer - * @note When the CRC feature is enabled the pData Length must be Size + 1. - * @param Size amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) -{ - /* Check rx dma handle */ - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) - { - hspi->State = HAL_SPI_STATE_BUSY_RX; - - /* Check tx dma handle */ - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); - - /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ - return HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size); - } - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_RX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pRxBuffPtr = (uint8_t *)pData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->RxISR = NULL; - hspi->TxISR = NULL; - hspi->TxXferSize = 0U; - hspi->TxXferCount = 0U; - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_RX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Set the SPI RxDMA Half transfer complete callback */ - hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; - - /* Set the SPI Rx DMA transfer complete callback */ - hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; - - /* Set the DMA error callback */ - hspi->hdmarx->XferErrorCallback = SPI_DMAError; - - /* Set the DMA AbortCpltCallback */ - hspi->hdmarx->XferAbortCallback = NULL; - - /* Enable the Rx DMA Stream/Channel */ - if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, - hspi->RxXferCount)) - { - /* Update SPI error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Enable the SPI Error Interrupt Bit */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); - - /* Enable Rx DMA Request */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); - - return HAL_OK; -} - -/** - * @brief Transmit and Receive an amount of data in non-blocking mode with DMA. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pTxData pointer to transmission data buffer - * @param pRxData pointer to reception data buffer - * @note When the CRC feature is enabled the pRxData Length must be Size + 1 - * @param Size amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size) -{ - uint32_t tmp_mode; - HAL_SPI_StateTypeDef tmp_state; - - /* Check rx & tx dma handles */ - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); - - /* Init temporary variables */ - tmp_state = hspi->State; - tmp_mode = hspi->Init.Mode; - - if (!((tmp_state == HAL_SPI_STATE_READY) || - ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX)))) - { - return HAL_BUSY; - } - - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hspi); - - /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ - if (hspi->State != HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; - } - - /* Set the transaction information */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pTxData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - hspi->pRxBuffPtr = (uint8_t *)pRxData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /* Init field not used in handle to zero */ - hspi->RxISR = NULL; - hspi->TxISR = NULL; - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Check if we are in Rx only or in Rx/Tx Mode and configure the DMA transfer complete callback */ - if (hspi->State == HAL_SPI_STATE_BUSY_RX) - { - /* Set the SPI Rx DMA Half transfer complete callback */ - hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; - hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; - } - else - { - /* Set the SPI Tx/Rx DMA Half transfer complete callback */ - hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfTransmitReceiveCplt; - hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt; - } - - /* Set the DMA error callback */ - hspi->hdmarx->XferErrorCallback = SPI_DMAError; - - /* Set the DMA AbortCpltCallback */ - hspi->hdmarx->XferAbortCallback = NULL; - - /* Enable the Rx DMA Stream/Channel */ - if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, - hspi->RxXferCount)) - { - /* Update SPI error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Enable Rx DMA Request */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); - - /* Set the SPI Tx DMA transfer complete callback as NULL because the communication closing - is performed in DMA reception complete callback */ - hspi->hdmatx->XferHalfCpltCallback = NULL; - hspi->hdmatx->XferCpltCallback = NULL; - hspi->hdmatx->XferErrorCallback = NULL; - hspi->hdmatx->XferAbortCallback = NULL; - - /* Enable the Tx DMA Stream/Channel */ - if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, - hspi->TxXferCount)) - { - /* Update SPI error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Enable the SPI Error Interrupt Bit */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); - - /* Enable Tx DMA Request */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); - - return HAL_OK; -} - -/** - * @brief Abort ongoing transfer (blocking mode). - * @param hspi SPI handle. - * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), - * started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable SPI Interrupts (depending of transfer direction) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) - * - Set handle State to READY - * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi) -{ - HAL_StatusTypeDef errorcode; - __IO uint32_t count; - __IO uint32_t resetcount; - - /* Initialized local variable */ - errorcode = HAL_OK; - resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - count = resetcount; - - /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); - - /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) - { - hspi->TxISR = SPI_AbortTx_ISR; - /* Wait HAL_SPI_STATE_ABORT state */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while (hspi->State != HAL_SPI_STATE_ABORT); - /* Reset Timeout Counter */ - count = resetcount; - } - - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) - { - hspi->RxISR = SPI_AbortRx_ISR; - /* Wait HAL_SPI_STATE_ABORT state */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while (hspi->State != HAL_SPI_STATE_ABORT); - /* Reset Timeout Counter */ - count = resetcount; - } - - /* Disable the SPI DMA Tx request if enabled */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) - { - /* Abort the SPI DMA Tx Stream/Channel : use blocking DMA Abort API (no callback) */ - if (hspi->hdmatx != NULL) - { - /* Set the SPI DMA Abort callback : - will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ - hspi->hdmatx->XferAbortCallback = NULL; - - /* Abort DMA Tx Handle linked to SPI Peripheral */ - if (HAL_DMA_Abort(hspi->hdmatx) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_ABORT; - } - - /* Disable Tx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN)); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - } - } - - /* Disable the SPI DMA Rx request if enabled */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) - { - /* Abort the SPI DMA Rx Stream/Channel : use blocking DMA Abort API (no callback) */ - if (hspi->hdmarx != NULL) - { - /* Set the SPI DMA Abort callback : - will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ - hspi->hdmarx->XferAbortCallback = NULL; - - /* Abort DMA Rx Handle linked to SPI Peripheral */ - if (HAL_DMA_Abort(hspi->hdmarx) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_ABORT; - } - - /* Disable peripheral */ - __HAL_SPI_DISABLE(hspi); - - /* Disable Rx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXDMAEN)); - } - } - /* Reset Tx and Rx transfer counters */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Check error during Abort procedure */ - if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT) - { - /* return HAL_Error in case of error during Abort procedure */ - errorcode = HAL_ERROR; - } - else - { - /* Reset errorCode */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - } - - /* Clear the Error flags in the SR register */ - __HAL_SPI_CLEAR_OVRFLAG(hspi); - __HAL_SPI_CLEAR_FREFLAG(hspi); - - /* Restore hspi->state to ready */ - hspi->State = HAL_SPI_STATE_READY; - - return errorcode; -} - -/** - * @brief Abort ongoing transfer (Interrupt mode). - * @param hspi SPI handle. - * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), - * started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable SPI Interrupts (depending of transfer direction) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) - * - Set handle State to READY - * - At abort completion, call user abort complete callback - * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be - * considered as completed only when user abort complete callback is executed (not when exiting function). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi) -{ - HAL_StatusTypeDef errorcode; - uint32_t abortcplt ; - __IO uint32_t count; - __IO uint32_t resetcount; - - /* Initialized local variable */ - errorcode = HAL_OK; - abortcplt = 1U; - resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - count = resetcount; - - /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); - - /* Change Rx and Tx Irq Handler to Disable TXEIE, RXNEIE and ERRIE interrupts */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) - { - hspi->TxISR = SPI_AbortTx_ISR; - /* Wait HAL_SPI_STATE_ABORT state */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while (hspi->State != HAL_SPI_STATE_ABORT); - /* Reset Timeout Counter */ - count = resetcount; - } - - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) - { - hspi->RxISR = SPI_AbortRx_ISR; - /* Wait HAL_SPI_STATE_ABORT state */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while (hspi->State != HAL_SPI_STATE_ABORT); - /* Reset Timeout Counter */ - count = resetcount; - } - - /* If DMA Tx and/or DMA Rx Handles are associated to SPI Handle, DMA Abort complete callbacks should be initialised - before any call to DMA Abort functions */ - /* DMA Tx Handle is valid */ - if (hspi->hdmatx != NULL) - { - /* Set DMA Abort Complete callback if UART DMA Tx request if enabled. - Otherwise, set it to NULL */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) - { - hspi->hdmatx->XferAbortCallback = SPI_DMATxAbortCallback; - } - else - { - hspi->hdmatx->XferAbortCallback = NULL; - } - } - /* DMA Rx Handle is valid */ - if (hspi->hdmarx != NULL) - { - /* Set DMA Abort Complete callback if UART DMA Rx request if enabled. - Otherwise, set it to NULL */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) - { - hspi->hdmarx->XferAbortCallback = SPI_DMARxAbortCallback; - } - else - { - hspi->hdmarx->XferAbortCallback = NULL; - } - } - - /* Disable the SPI DMA Tx request if enabled */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) - { - /* Abort the SPI DMA Tx Stream/Channel */ - if (hspi->hdmatx != NULL) - { - /* Abort DMA Tx Handle linked to SPI Peripheral */ - if (HAL_DMA_Abort_IT(hspi->hdmatx) != HAL_OK) - { - hspi->hdmatx->XferAbortCallback = NULL; - hspi->ErrorCode = HAL_SPI_ERROR_ABORT; - } - else - { - abortcplt = 0U; - } - } - } - /* Disable the SPI DMA Rx request if enabled */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) - { - /* Abort the SPI DMA Rx Stream/Channel */ - if (hspi->hdmarx != NULL) - { - /* Abort DMA Rx Handle linked to SPI Peripheral */ - if (HAL_DMA_Abort_IT(hspi->hdmarx) != HAL_OK) - { - hspi->hdmarx->XferAbortCallback = NULL; - hspi->ErrorCode = HAL_SPI_ERROR_ABORT; - } - else - { - abortcplt = 0U; - } - } - } - - if (abortcplt == 1U) - { - /* Reset Tx and Rx transfer counters */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Check error during Abort procedure */ - if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT) - { - /* return HAL_Error in case of error during Abort procedure */ - errorcode = HAL_ERROR; - } - else - { - /* Reset errorCode */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - } - - /* Clear the Error flags in the SR register */ - __HAL_SPI_CLEAR_OVRFLAG(hspi); - __HAL_SPI_CLEAR_FREFLAG(hspi); - - /* Restore hspi->State to Ready */ - hspi->State = HAL_SPI_STATE_READY; - - /* As no DMA to be aborted, call directly user Abort complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->AbortCpltCallback(hspi); -#else - HAL_SPI_AbortCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - - return errorcode; -} - -/** - * @brief Pause the DMA Transfer. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi) -{ - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Disable the SPI DMA Tx & Rx requests */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_OK; -} - -/** - * @brief Resume the DMA Transfer. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi) -{ - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Enable the SPI DMA Tx & Rx requests */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_OK; -} - -/** - * @brief Stop the DMA Transfer. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi) -{ - HAL_StatusTypeDef errorcode = HAL_OK; - /* The Lock is not implemented on this API to allow the user application - to call the HAL SPI API under callbacks HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback(): - when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated - and the correspond call back is executed HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback() - */ - - /* Abort the SPI DMA tx Stream/Channel */ - if (hspi->hdmatx != NULL) - { - if (HAL_OK != HAL_DMA_Abort(hspi->hdmatx)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - errorcode = HAL_ERROR; - } - } - /* Abort the SPI DMA rx Stream/Channel */ - if (hspi->hdmarx != NULL) - { - if (HAL_OK != HAL_DMA_Abort(hspi->hdmarx)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - errorcode = HAL_ERROR; - } - } - - /* Disable the SPI DMA Tx & Rx requests */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - hspi->State = HAL_SPI_STATE_READY; - return errorcode; -} - -/** - * @brief Handle SPI interrupt request. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval None - */ -void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi) -{ - uint32_t itsource = hspi->Instance->CR2; - uint32_t itflag = hspi->Instance->SR; - - /* SPI in mode Receiver ----------------------------------------------------*/ - if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) == RESET) && - (SPI_CHECK_FLAG(itflag, SPI_FLAG_RXNE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_RXNE) != RESET)) - { - hspi->RxISR(hspi); - return; - } - - /* SPI in mode Transmitter -------------------------------------------------*/ - if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_TXE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_TXE) != RESET)) - { - hspi->TxISR(hspi); - return; - } - - /* SPI in Error Treatment --------------------------------------------------*/ - if (((SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) || (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET) - || (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_ERR) != RESET)) - { - /* SPI Overrun error interrupt occurred ----------------------------------*/ - if (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET) - { - if (hspi->State != HAL_SPI_STATE_BUSY_TX) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_OVR); - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - else - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - return; - } - } - - /* SPI Mode Fault error interrupt occurred -------------------------------*/ - if (SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_MODF); - __HAL_SPI_CLEAR_MODFFLAG(hspi); - } - - /* SPI Frame error interrupt occurred ------------------------------------*/ - if (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FRE); - __HAL_SPI_CLEAR_FREFLAG(hspi); - } - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Disable all interrupts */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE | SPI_IT_TXE | SPI_IT_ERR); - - hspi->State = HAL_SPI_STATE_READY; - /* Disable the SPI DMA requests if enabled */ - if ((HAL_IS_BIT_SET(itsource, SPI_CR2_TXDMAEN)) || (HAL_IS_BIT_SET(itsource, SPI_CR2_RXDMAEN))) - { - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN)); - - /* Abort the SPI DMA Rx channel */ - if (hspi->hdmarx != NULL) - { - /* Set the SPI DMA Abort callback : - will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */ - hspi->hdmarx->XferAbortCallback = SPI_DMAAbortOnError; - if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmarx)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - } - } - /* Abort the SPI DMA Tx channel */ - if (hspi->hdmatx != NULL) - { - /* Set the SPI DMA Abort callback : - will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */ - hspi->hdmatx->XferAbortCallback = SPI_DMAAbortOnError; - if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmatx)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - } - } - } - else - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - } - return; - } -} - -/** - * @brief Tx Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_TxCpltCallback should be implemented in the user file - */ -} - -/** - * @brief Rx Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_RxCpltCallback should be implemented in the user file - */ -} - -/** - * @brief Tx and Rx Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_TxRxCpltCallback should be implemented in the user file - */ -} - -/** - * @brief Tx Half Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_TxHalfCpltCallback should be implemented in the user file - */ -} - -/** - * @brief Rx Half Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_RxHalfCpltCallback() should be implemented in the user file - */ -} - -/** - * @brief Tx and Rx Half Transfer callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_TxRxHalfCpltCallback() should be implemented in the user file - */ -} - -/** - * @brief SPI error callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_ErrorCallback should be implemented in the user file - */ - /* NOTE : The ErrorCode parameter in the hspi handle is updated by the SPI processes - and user can use HAL_SPI_GetError() API to check the latest error occurred - */ -} - -/** - * @brief SPI Abort Complete callback. - * @param hspi SPI handle. - * @retval None - */ -__weak void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_AbortCpltCallback can be implemented in the user file. - */ -} - -/** - * @} - */ - -/** @defgroup SPI_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief SPI control functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the SPI. - (+) HAL_SPI_GetState() API can be helpful to check in run-time the state of the SPI peripheral - (+) HAL_SPI_GetError() check in run-time Errors occurring during communication -@endverbatim - * @{ - */ - -/** - * @brief Return the SPI handle state. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval SPI state - */ -HAL_SPI_StateTypeDef HAL_SPI_GetState(const SPI_HandleTypeDef *hspi) -{ - /* Return SPI handle state */ - return hspi->State; -} - -/** - * @brief Return the SPI error code. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval SPI error code in bitmap format - */ -uint32_t HAL_SPI_GetError(const SPI_HandleTypeDef *hspi) -{ - /* Return SPI ErrorCode */ - return hspi->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup SPI_Private_Functions - * @brief Private functions - * @{ - */ - -/** - * @brief DMA SPI transmit process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - uint32_t tickstart; - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* DMA Normal Mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != DMA_SxCR_CIRC) - { - /* Disable ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); - - /* Disable Tx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Clear overrun flag in 2 Lines communication mode because received data is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - hspi->TxXferCount = 0U; - hspi->State = HAL_SPI_STATE_READY; - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - return; - } - } - /* Call user Tx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxCpltCallback(hspi); -#else - HAL_SPI_TxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI receive process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - uint32_t tickstart; -#if (USE_SPI_CRC != 0U) - __IO uint32_t tmpreg = 0U; -#endif /* USE_SPI_CRC */ - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* DMA Normal Mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != DMA_SxCR_CIRC) - { - /* Disable ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); - -#if (USE_SPI_CRC != 0U) - /* CRC handling */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Wait until RXNE flag */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - /* Error on the CRC reception */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - } - /* Read CRC */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - } -#endif /* USE_SPI_CRC */ - - /* Check if we are in Master RX 2 line mode */ - if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) - { - /* Disable Rx/Tx DMA Request (done by default to handle the case master rx direction 2 lines) */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - } - else - { - /* Normal case */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); - } - - /* Check the end of the transaction */ - if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_FLAG; - } - - hspi->RxXferCount = 0U; - hspi->State = HAL_SPI_STATE_READY; - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - } -#endif /* USE_SPI_CRC */ - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - return; - } - } - /* Call user Rx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->RxCpltCallback(hspi); -#else - HAL_SPI_RxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI transmit receive process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - uint32_t tickstart; -#if (USE_SPI_CRC != 0U) - __IO uint32_t tmpreg = 0U; -#endif /* USE_SPI_CRC */ - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* DMA Normal Mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != DMA_SxCR_CIRC) - { - /* Disable ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); - -#if (USE_SPI_CRC != 0U) - /* CRC handling */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Wait the CRC data */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - } - /* Read CRC to Flush DR and RXNE flag */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - } -#endif /* USE_SPI_CRC */ - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Disable Rx/Tx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - - hspi->TxXferCount = 0U; - hspi->RxXferCount = 0U; - hspi->State = HAL_SPI_STATE_READY; - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - } -#endif /* USE_SPI_CRC */ - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - return; - } - } - /* Call user TxRx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxRxCpltCallback(hspi); -#else - HAL_SPI_TxRxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI half transmit process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - - /* Call user Tx half complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxHalfCpltCallback(hspi); -#else - HAL_SPI_TxHalfCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI half receive process complete callback - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - - /* Call user Rx half complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->RxHalfCpltCallback(hspi); -#else - HAL_SPI_RxHalfCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI half transmit receive process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - - /* Call user TxRx half complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxRxHalfCpltCallback(hspi); -#else - HAL_SPI_TxRxHalfCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI communication error callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAError(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - - /* Stop the disable DMA transfer on SPI side */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - hspi->State = HAL_SPI_STATE_READY; - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI communication abort callback, when initiated by HAL services on Error - * (To be called at end of DMA Abort procedure following error occurrence). - * @param hdma DMA handle. - * @retval None - */ -static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI Tx communication abort callback, when initiated by user - * (To be called at end of DMA Tx Abort procedure following user abort request). - * @note When this callback is executed, User Abort complete call back is called only if no - * Abort still ongoing for Rx DMA Handle. - * @param hdma DMA handle. - * @retval None - */ -static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - __IO uint32_t count; - - hspi->hdmatx->XferAbortCallback = NULL; - count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - - /* Disable Tx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - - /* Check if an Abort process is still ongoing */ - if (hspi->hdmarx != NULL) - { - if (hspi->hdmarx->XferAbortCallback != NULL) - { - return; - } - } - - /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Check no error during Abort procedure */ - if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT) - { - /* Reset errorCode */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - } - - /* Clear the Error flags in the SR register */ - __HAL_SPI_CLEAR_OVRFLAG(hspi); - __HAL_SPI_CLEAR_FREFLAG(hspi); - - /* Restore hspi->State to Ready */ - hspi->State = HAL_SPI_STATE_READY; - - /* Call user Abort complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->AbortCpltCallback(hspi); -#else - HAL_SPI_AbortCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI Rx communication abort callback, when initiated by user - * (To be called at end of DMA Rx Abort procedure following user abort request). - * @note When this callback is executed, User Abort complete call back is called only if no - * Abort still ongoing for Tx DMA Handle. - * @param hdma DMA handle. - * @retval None - */ -static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - - /* Disable SPI Peripheral */ - __HAL_SPI_DISABLE(hspi); - - hspi->hdmarx->XferAbortCallback = NULL; - - /* Disable Rx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); - - /* Check Busy flag */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - } - - /* Check if an Abort process is still ongoing */ - if (hspi->hdmatx != NULL) - { - if (hspi->hdmatx->XferAbortCallback != NULL) - { - return; - } - } - - /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Check no error during Abort procedure */ - if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT) - { - /* Reset errorCode */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - } - - /* Clear the Error flags in the SR register */ - __HAL_SPI_CLEAR_OVRFLAG(hspi); - __HAL_SPI_CLEAR_FREFLAG(hspi); - - /* Restore hspi->State to Ready */ - hspi->State = HAL_SPI_STATE_READY; - - /* Call user Abort complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->AbortCpltCallback(hspi); -#else - HAL_SPI_AbortCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi) -{ - /* Receive data in 8bit mode */ - *hspi->pRxBuffPtr = *((__IO uint8_t *)&hspi->Instance->DR); - hspi->pRxBuffPtr++; - hspi->RxXferCount--; - - /* Check end of the reception */ - if (hspi->RxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->RxISR = SPI_2linesRxISR_8BITCRC; - return; - } -#endif /* USE_SPI_CRC */ - - /* Disable RXNE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - if (hspi->TxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } - } -} - -#if (USE_SPI_CRC != 0U) -/** - * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi) -{ - __IO uint8_t *ptmpreg8; - __IO uint8_t tmpreg8 = 0; - - /* Initialize the 8bit temporary pointer */ - ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; - /* Read 8bit CRC to flush Data Register */ - tmpreg8 = *ptmpreg8; - /* To avoid GCC warning */ - UNUSED(tmpreg8); - - /* Disable RXNE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - if (hspi->TxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } -} -#endif /* USE_SPI_CRC */ - -/** - * @brief Tx 8-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi) -{ - *(__IO uint8_t *)&hspi->Instance->DR = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr++; - hspi->TxXferCount--; - - /* Check the end of the transmission */ - if (hspi->TxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Set CRC Next Bit to send CRC */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - /* Disable TXE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); - return; - } -#endif /* USE_SPI_CRC */ - - /* Disable TXE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); - - if (hspi->RxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } - } -} - -/** - * @brief Rx 16-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi) -{ - /* Receive data in 16 Bit mode */ - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); - hspi->pRxBuffPtr += sizeof(uint16_t); - hspi->RxXferCount--; - - if (hspi->RxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->RxISR = SPI_2linesRxISR_16BITCRC; - return; - } -#endif /* USE_SPI_CRC */ - - /* Disable RXNE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE); - - if (hspi->TxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } - } -} - -#if (USE_SPI_CRC != 0U) -/** - * @brief Manage the CRC 16-bit receive for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi) -{ - __IO uint32_t tmpreg = 0U; - - /* Read 16bit CRC to flush Data Register */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - - /* Disable RXNE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE); - - SPI_CloseRxTx_ISR(hspi); -} -#endif /* USE_SPI_CRC */ - -/** - * @brief Tx 16-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi) -{ - /* Transmit data in 16 Bit mode */ - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - - /* Enable CRC Transmission */ - if (hspi->TxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Set CRC Next Bit to send CRC */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - /* Disable TXE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); - return; - } -#endif /* USE_SPI_CRC */ - - /* Disable TXE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); - - if (hspi->RxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } - } -} - -#if (USE_SPI_CRC != 0U) -/** - * @brief Manage the CRC 8-bit receive in Interrupt context. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi) -{ - __IO uint8_t *ptmpreg8; - __IO uint8_t tmpreg8 = 0; - - /* Initialize the 8bit temporary pointer */ - ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; - /* Read 8bit CRC to flush Data Register */ - tmpreg8 = *ptmpreg8; - /* To avoid GCC warning */ - UNUSED(tmpreg8); - - SPI_CloseRx_ISR(hspi); -} -#endif /* USE_SPI_CRC */ - -/** - * @brief Manage the receive 8-bit in Interrupt context. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi) -{ - *hspi->pRxBuffPtr = (*(__IO uint8_t *)&hspi->Instance->DR); - hspi->pRxBuffPtr++; - hspi->RxXferCount--; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - - if (hspi->RxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->RxISR = SPI_RxISR_8BITCRC; - return; - } -#endif /* USE_SPI_CRC */ - SPI_CloseRx_ISR(hspi); - } -} - -#if (USE_SPI_CRC != 0U) -/** - * @brief Manage the CRC 16-bit receive in Interrupt context. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi) -{ - __IO uint32_t tmpreg = 0U; - - /* Read 16bit CRC to flush Data Register */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - - /* Disable RXNE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - SPI_CloseRx_ISR(hspi); -} -#endif /* USE_SPI_CRC */ - -/** - * @brief Manage the 16-bit receive in Interrupt context. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi) -{ - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); - hspi->pRxBuffPtr += sizeof(uint16_t); - hspi->RxXferCount--; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - - if (hspi->RxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->RxISR = SPI_RxISR_16BITCRC; - return; - } -#endif /* USE_SPI_CRC */ - SPI_CloseRx_ISR(hspi); - } -} - -/** - * @brief Handle the data 8-bit transmit in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi) -{ - *(__IO uint8_t *)&hspi->Instance->DR = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr++; - hspi->TxXferCount--; - - if (hspi->TxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Enable CRC Transmission */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - SPI_CloseTx_ISR(hspi); - } -} - -/** - * @brief Handle the data 16-bit transmit in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi) -{ - /* Transmit data in 16 Bit mode */ - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - - if (hspi->TxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Enable CRC Transmission */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - SPI_CloseTx_ISR(hspi); - } -} - -/** - * @brief Handle SPI Communication Timeout. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param Flag SPI flag to check - * @param State flag state to check - * @param Timeout Timeout duration - * @param Tickstart tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State, - uint32_t Timeout, uint32_t Tickstart) -{ - __IO uint32_t count; - uint32_t tmp_timeout; - uint32_t tmp_tickstart; - - /* Adjust Timeout value in case of end of transfer */ - tmp_timeout = Timeout - (HAL_GetTick() - Tickstart); - tmp_tickstart = HAL_GetTick(); - - /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */ - count = tmp_timeout * ((SystemCoreClock * 32U) >> 20U); - - while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) != State) - { - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U)) - { - /* Disable the SPI and reset the CRC: the CRC value should be cleared - on both master and slave sides in order to resynchronize the master - and slave for their respective CRC calculation */ - - /* Disable TXE, RXNE and ERR interrupts for the interrupt process */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); - - if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) - || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) - { - /* Disable SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - } - - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - hspi->State = HAL_SPI_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_TIMEOUT; - } - /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop procedure */ - if (count == 0U) - { - tmp_timeout = 0U; - } - count--; - } - } - - return HAL_OK; -} - -/** - * @brief Handle the check of the RX transaction complete. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param Timeout Timeout duration - * @param Tickstart tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart) -{ - if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) - || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) - { - /* Disable SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - } - - /* Erratasheet: BSY bit may stay high at the end of a data transfer in Slave mode */ - if (hspi->Init.Mode == SPI_MODE_MASTER) - { - if (hspi->Init.Direction != SPI_DIRECTION_2LINES_RXONLY) - { - /* Control the BSY flag */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - } - else - { - /* Wait the RXNE reset */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - } - } - else - { - /* Wait the RXNE reset */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Handle the check of the RXTX or TX transaction complete. - * @param hspi SPI handle - * @param Timeout Timeout duration - * @param Tickstart tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart) -{ - /* Wait until TXE flag */ - if(SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_TXE, SET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - - /* Timeout in µs */ - __IO uint32_t count = SPI_BSY_FLAG_WORKAROUND_TIMEOUT * (SystemCoreClock / 24U / 1000000U); - /* Erratasheet: BSY bit may stay high at the end of a data transfer in Slave mode */ - if (hspi->Init.Mode == SPI_MODE_MASTER) - { - /* Control the BSY flag */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - } - else - { - /* Wait BSY flag during 1 Byte time transfer in case of Full-Duplex and Tx transfer - * If Timeout is reached, the transfer is considered as finish. - * User have to calculate the timeout value to fit with the time of 1 byte transfer. - * This time is directly link with the SPI clock from Master device. - */ - do - { - if (count == 0U) - { - break; - } - count--; - } while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_BSY) != RESET); - } - - return HAL_OK; -} - -/** - * @brief Handle the end of the RXTX transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi) -{ - uint32_t tickstart; - __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - /* Disable ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) - { - hspi->State = HAL_SPI_STATE_READY; - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { -#endif /* USE_SPI_CRC */ - if (hspi->ErrorCode == HAL_SPI_ERROR_NONE) - { - if (hspi->State == HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_READY; - /* Call user Rx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->RxCpltCallback(hspi); -#else - HAL_SPI_RxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { - hspi->State = HAL_SPI_STATE_READY; - /* Call user TxRx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxRxCpltCallback(hspi); -#else - HAL_SPI_TxRxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - } - else - { - hspi->State = HAL_SPI_STATE_READY; - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } -#if (USE_SPI_CRC != 0U) - } -#endif /* USE_SPI_CRC */ -} - -/** - * @brief Handle the end of the RX transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi) -{ - /* Disable RXNE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - /* Check the end of the transaction */ - if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - hspi->State = HAL_SPI_STATE_READY; - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { -#endif /* USE_SPI_CRC */ - if (hspi->ErrorCode == HAL_SPI_ERROR_NONE) - { - /* Call user Rx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->RxCpltCallback(hspi); -#else - HAL_SPI_RxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } -#if (USE_SPI_CRC != 0U) - } -#endif /* USE_SPI_CRC */ -} - -/** - * @brief Handle the end of the TX transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi) -{ - uint32_t tickstart; - __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - - /* Disable TXE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - hspi->State = HAL_SPI_STATE_READY; - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { - /* Call user Rx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxCpltCallback(hspi); -#else - HAL_SPI_TxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } -} - -/** - * @brief Handle abort a Rx transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi) -{ - __IO uint32_t tmpreg = 0U; - __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - - /* Disable SPI Peripheral */ - __HAL_SPI_DISABLE(hspi); - - /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */ - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE | SPI_CR2_RXNEIE | SPI_CR2_ERRIE)); - - /* Flush Data Register by a blank read */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - - hspi->State = HAL_SPI_STATE_ABORT; -} - -/** - * @brief Handle abort a Tx or Rx/Tx transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi) -{ - /* Disable TXEIE interrupt */ - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE)); - - /* Disable SPI Peripheral */ - __HAL_SPI_DISABLE(hspi); - - hspi->State = HAL_SPI_STATE_ABORT; -} - -/** - * @} - */ - -#endif /* HAL_SPI_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c deleted file mode 100644 index d5978cc..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c +++ /dev/null @@ -1,7632 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim.c - * @author MCD Application Team - * @brief TIM HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Timer (TIM) peripheral: - * + TIM Time Base Initialization - * + TIM Time Base Start - * + TIM Time Base Start Interruption - * + TIM Time Base Start DMA - * + TIM Output Compare/PWM Initialization - * + TIM Output Compare/PWM Channel Configuration - * + TIM Output Compare/PWM Start - * + TIM Output Compare/PWM Start Interruption - * + TIM Output Compare/PWM Start DMA - * + TIM Input Capture Initialization - * + TIM Input Capture Channel Configuration - * + TIM Input Capture Start - * + TIM Input Capture Start Interruption - * + TIM Input Capture Start DMA - * + TIM One Pulse Initialization - * + TIM One Pulse Channel Configuration - * + TIM One Pulse Start - * + TIM Encoder Interface Initialization - * + TIM Encoder Interface Start - * + TIM Encoder Interface Start Interruption - * + TIM Encoder Interface Start DMA - * + Commutation Event configuration with Interruption and DMA - * + TIM OCRef clear configuration - * + TIM External Clock configuration - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### TIMER Generic features ##### - ============================================================================== - [..] The Timer features include: - (#) 16-bit up, down, up/down auto-reload counter. - (#) 16-bit programmable prescaler allowing dividing (also on the fly) the - counter clock frequency either by any factor between 1 and 65536. - (#) Up to 4 independent channels for: - (++) Input Capture - (++) Output Compare - (++) PWM generation (Edge and Center-aligned Mode) - (++) One-pulse mode output - (#) Synchronization circuit to control the timer with external signals and to interconnect - several timers together. - (#) Supports incremental encoder for positioning purposes - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Initialize the TIM low level resources by implementing the following functions - depending on the selected feature: - (++) Time Base : HAL_TIM_Base_MspInit() - (++) Input Capture : HAL_TIM_IC_MspInit() - (++) Output Compare : HAL_TIM_OC_MspInit() - (++) PWM generation : HAL_TIM_PWM_MspInit() - (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit() - (++) Encoder mode output : HAL_TIM_Encoder_MspInit() - - (#) Initialize the TIM low level resources : - (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); - (##) TIM pins configuration - (+++) Enable the clock for the TIM GPIOs using the following function: - __HAL_RCC_GPIOx_CLK_ENABLE(); - (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); - - (#) The external Clock can be configured, if needed (the default clock is the - internal clock from the APBx), using the following function: - HAL_TIM_ConfigClockSource, the clock configuration should be done before - any start function. - - (#) Configure the TIM in the desired functioning mode using one of the - Initialization function of this driver: - (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base - (++) HAL_TIM_OC_Init and HAL_TIM_OC_ConfigChannel: to use the Timer to generate an - Output Compare signal. - (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a - PWM signal. - (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an - external signal. - (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer - in One Pulse Mode. - (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface. - - (#) Activate the TIM peripheral using one of the start functions depending from the feature used: - (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT() - (++) Input Capture : HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT() - (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT() - (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT() - (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT() - (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT(). - - (#) The DMA Burst is managed with the two following functions: - HAL_TIM_DMABurst_WriteStart() - HAL_TIM_DMABurst_ReadStart() - - *** Callback registration *** - ============================================= - - [..] - The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - - [..] - Use Function HAL_TIM_RegisterCallback() to register a callback. - HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, - the Callback ID and a pointer to the user callback function. - - [..] - Use function HAL_TIM_UnRegisterCallback() to reset a callback to the default - weak function. - HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, - and the Callback ID. - - [..] - These functions allow to register/unregister following callbacks: - (+) Base_MspInitCallback : TIM Base Msp Init Callback. - (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. - (+) IC_MspInitCallback : TIM IC Msp Init Callback. - (+) IC_MspDeInitCallback : TIM IC Msp DeInit Callback. - (+) OC_MspInitCallback : TIM OC Msp Init Callback. - (+) OC_MspDeInitCallback : TIM OC Msp DeInit Callback. - (+) PWM_MspInitCallback : TIM PWM Msp Init Callback. - (+) PWM_MspDeInitCallback : TIM PWM Msp DeInit Callback. - (+) OnePulse_MspInitCallback : TIM One Pulse Msp Init Callback. - (+) OnePulse_MspDeInitCallback : TIM One Pulse Msp DeInit Callback. - (+) Encoder_MspInitCallback : TIM Encoder Msp Init Callback. - (+) Encoder_MspDeInitCallback : TIM Encoder Msp DeInit Callback. - (+) HallSensor_MspInitCallback : TIM Hall Sensor Msp Init Callback. - (+) HallSensor_MspDeInitCallback : TIM Hall Sensor Msp DeInit Callback. - (+) PeriodElapsedCallback : TIM Period Elapsed Callback. - (+) PeriodElapsedHalfCpltCallback : TIM Period Elapsed half complete Callback. - (+) TriggerCallback : TIM Trigger Callback. - (+) TriggerHalfCpltCallback : TIM Trigger half complete Callback. - (+) IC_CaptureCallback : TIM Input Capture Callback. - (+) IC_CaptureHalfCpltCallback : TIM Input Capture half complete Callback. - (+) OC_DelayElapsedCallback : TIM Output Compare Delay Elapsed Callback. - (+) PWM_PulseFinishedCallback : TIM PWM Pulse Finished Callback. - (+) PWM_PulseFinishedHalfCpltCallback : TIM PWM Pulse Finished half complete Callback. - (+) ErrorCallback : TIM Error Callback. - (+) CommutationCallback : TIM Commutation Callback. - (+) CommutationHalfCpltCallback : TIM Commutation half complete Callback. - (+) BreakCallback : TIM Break Callback. - - [..] -By default, after the Init and when the state is HAL_TIM_STATE_RESET -all interrupt callbacks are set to the corresponding weak functions: - examples HAL_TIM_TriggerCallback(), HAL_TIM_ErrorCallback(). - - [..] - Exception done for MspInit and MspDeInit functions that are reset to the legacy weak - functionalities in the Init / DeInit only when these callbacks are null - (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit - keep and use the user MspInit / MspDeInit callbacks(registered beforehand) - - [..] - Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. - Exception done MspInit / MspDeInit that can be registered / unregistered - in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, - thus registered(user) MspInit / DeInit callbacks can be used during the Init / DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using HAL_TIM_RegisterCallback() before calling DeInit or Init function. - - [..] - When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available and all callbacks - are set to the corresponding weak functions. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup TIM TIM - * @brief TIM HAL module driver - * @{ - */ - -#ifdef HAL_TIM_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup TIM_Private_Functions - * @{ - */ -static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); -static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); -static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); -static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); -static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); -static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource); -static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - const TIM_SlaveConfigTypeDef *sSlaveConfig); -/** - * @} - */ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup TIM_Exported_Functions TIM Exported Functions - * @{ - */ - -/** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * -@verbatim - ============================================================================== - ##### Time Base functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM base. - (+) De-initialize the TIM base. - (+) Start the Time Base. - (+) Stop the Time Base. - (+) Start the Time Base and enable interrupt. - (+) Stop the Time Base and disable interrupt. - (+) Start the Time Base and enable DMA transfer. - (+) Stop the Time Base and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Time base Unit according to the specified - * parameters in the TIM_HandleTypeDef and initialize the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_Base_DeInit() before HAL_TIM_Base_Init() - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->Base_MspInitCallback == NULL) - { - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->Base_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - HAL_TIM_Base_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Set the Time Base configuration */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM Base peripheral - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->Base_MspDeInitCallback == NULL) - { - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; - } - /* DeInit the low level hardware */ - htim->Base_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_Base_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Base MSP. - * @param htim TIM Base handle - * @retval None - */ -__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Base_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Base MSP. - * @param htim TIM Base handle - * @retval None - */ -__weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Base_MspDeInit could be implemented in the user file - */ -} - - -/** - * @brief Starts the TIM Base generation. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Check the TIM state */ - if (htim->State != HAL_TIM_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Base generation in interrupt mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Check the TIM state */ - if (htim->State != HAL_TIM_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Enable the TIM Update interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation in interrupt mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Disable the TIM Update interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Base generation in DMA mode. - * @param htim TIM Base handle - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, const uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - - /* Set the TIM state */ - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - return HAL_ERROR; - } - - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)pData, (uint32_t)&htim->Instance->ARR, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Update DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation in DMA mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_UPDATE); - - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * -@verbatim - ============================================================================== - ##### TIM Output Compare functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Output Compare. - (+) De-initialize the TIM Output Compare. - (+) Start the TIM Output Compare. - (+) Stop the TIM Output Compare. - (+) Start the TIM Output Compare and enable interrupt. - (+) Stop the TIM Output Compare and disable interrupt. - (+) Start the TIM Output Compare and enable DMA transfer. - (+) Stop the TIM Output Compare and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Output Compare according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_OC_DeInit() before HAL_TIM_OC_Init() - * @param htim TIM Output Compare handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->OC_MspInitCallback == NULL) - { - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->OC_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OC_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the Output Compare */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM Output Compare handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->OC_MspDeInitCallback == NULL) - { - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; - } - /* DeInit the low level hardware */ - htim->OC_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OC_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Output Compare MSP. - * @param htim TIM Output Compare handle - * @retval None - */ -__weak void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Output Compare MSP. - * @param htim TIM Output Compare handle - * @retval None - */ -__weak void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Output Compare signal generation. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in interrupt mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Output Compare signal generation in interrupt mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM Output Compare signal generation in DMA mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Set the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) - { - return HAL_BUSY; - } - else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Output Compare signal generation in DMA mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * -@verbatim - ============================================================================== - ##### TIM PWM functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM PWM. - (+) De-initialize the TIM PWM. - (+) Start the TIM PWM. - (+) Stop the TIM PWM. - (+) Start the TIM PWM and enable interrupt. - (+) Stop the TIM PWM and disable interrupt. - (+) Start the TIM PWM and enable DMA transfer. - (+) Stop the TIM PWM and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM PWM Time Base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_PWM_DeInit() before HAL_TIM_PWM_Init() - * @param htim TIM PWM handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->PWM_MspInitCallback == NULL) - { - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->PWM_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_PWM_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the PWM */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM PWM handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->PWM_MspDeInitCallback == NULL) - { - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; - } - /* DeInit the low level hardware */ - htim->PWM_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_PWM_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM PWM MSP. - * @param htim TIM PWM handle - * @retval None - */ -__weak void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM PWM MSP. - * @param htim TIM PWM handle - * @retval None - */ -__weak void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the PWM signal generation. - * @param htim TIM handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the PWM signal generation in interrupt mode. - * @param htim TIM PWM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the PWM signal generation in interrupt mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM PWM signal generation in DMA mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Set the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) - { - return HAL_BUSY; - } - else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Output Capture/Compare 3 request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM PWM signal generation in DMA mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * -@verbatim - ============================================================================== - ##### TIM Input Capture functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Input Capture. - (+) De-initialize the TIM Input Capture. - (+) Start the TIM Input Capture. - (+) Stop the TIM Input Capture. - (+) Start the TIM Input Capture and enable interrupt. - (+) Stop the TIM Input Capture and disable interrupt. - (+) Start the TIM Input Capture and enable DMA transfer. - (+) Stop the TIM Input Capture and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Input Capture Time base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_IC_DeInit() before HAL_TIM_IC_Init() - * @param htim TIM Input Capture handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->IC_MspInitCallback == NULL) - { - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->IC_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_IC_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the input capture */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM Input Capture handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->IC_MspDeInitCallback == NULL) - { - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; - } - /* DeInit the low level hardware */ - htim->IC_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_IC_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Input Capture MSP. - * @param htim TIM Input Capture handle - * @retval None - */ -__weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Input Capture MSP. - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Input Capture measurement. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); - HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if ((channel_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Input Capture measurement. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Input Capture measurement in interrupt mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); - HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if ((channel_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Input Capture measurement in interrupt mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM Input Capture measurement in DMA mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The destination Buffer address. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); - HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - /* Set the TIM channel state */ - if ((channel_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->CCR3, (uint32_t)pData, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->CCR4, (uint32_t)pData, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Input Capture measurement in DMA mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * -@verbatim - ============================================================================== - ##### TIM One Pulse functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM One Pulse. - (+) De-initialize the TIM One Pulse. - (+) Start the TIM One Pulse. - (+) Stop the TIM One Pulse. - (+) Start the TIM One Pulse and enable interrupt. - (+) Stop the TIM One Pulse and disable interrupt. - (+) Start the TIM One Pulse and enable DMA transfer. - (+) Stop the TIM One Pulse and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM One Pulse Time Base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_OnePulse_DeInit() before HAL_TIM_OnePulse_Init() - * @note When the timer instance is initialized in One Pulse mode, timer - * channels 1 and channel 2 are reserved and cannot be used for other - * purpose. - * @param htim TIM One Pulse handle - * @param OnePulseMode Select the One pulse mode. - * This parameter can be one of the following values: - * @arg TIM_OPMODE_SINGLE: Only one pulse will be generated. - * @arg TIM_OPMODE_REPETITIVE: Repetitive pulses will be generated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_OPM_MODE(OnePulseMode)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->OnePulse_MspInitCallback == NULL) - { - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->OnePulse_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OnePulse_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Configure the Time base in the One Pulse Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Reset the OPM Bit */ - htim->Instance->CR1 &= ~TIM_CR1_OPM; - - /* Configure the OPM Mode */ - htim->Instance->CR1 |= OnePulseMode; - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM One Pulse - * @param htim TIM One Pulse handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->OnePulse_MspDeInitCallback == NULL) - { - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; - } - /* DeInit the low level hardware */ - htim->OnePulse_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_OnePulse_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM One Pulse MSP. - * @param htim TIM One Pulse handle - * @retval None - */ -__weak void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OnePulse_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM One Pulse MSP. - * @param htim TIM One Pulse handle - * @retval None - */ -__weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OnePulse_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM One Pulse signal generation. - * @note Though OutputChannel parameter is deprecated and ignored by the function - * it has been kept to avoid HAL_TIM API compatibility break. - * @note The pulse output channel is determined when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel See note above - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together - - No need to enable the counter, it's enabled automatically by hardware - (the counter starts in response to a stimulus and generate a pulse */ - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation. - * @note Though OutputChannel parameter is deprecated and ignored by the function - * it has been kept to avoid HAL_TIM API compatibility break. - * @note The pulse output channel is determined when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel See note above - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Disable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM One Pulse signal generation in interrupt mode. - * @note Though OutputChannel parameter is deprecated and ignored by the function - * it has been kept to avoid HAL_TIM API compatibility break. - * @note The pulse output channel is determined when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel See note above - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together - - No need to enable the counter, it's enabled automatically by hardware - (the counter starts in response to a stimulus and generate a pulse */ - - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation in interrupt mode. - * @note Though OutputChannel parameter is deprecated and ignored by the function - * it has been kept to avoid HAL_TIM API compatibility break. - * @note The pulse output channel is determined when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel See note above - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - - /* Disable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * -@verbatim - ============================================================================== - ##### TIM Encoder functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Encoder. - (+) De-initialize the TIM Encoder. - (+) Start the TIM Encoder. - (+) Stop the TIM Encoder. - (+) Start the TIM Encoder and enable interrupt. - (+) Stop the TIM Encoder and disable interrupt. - (+) Start the TIM Encoder and enable DMA transfer. - (+) Stop the TIM Encoder and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Encoder Interface and initialize the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_Encoder_DeInit() before HAL_TIM_Encoder_Init() - * @note Encoder mode and External clock mode 2 are not compatible and must not be selected together - * Ex: A call for @ref HAL_TIM_Encoder_Init will erase the settings of @ref HAL_TIM_ConfigClockSource - * using TIM_CLOCKSOURCE_ETRMODE2 and vice versa - * @note When the timer instance is initialized in Encoder mode, timer - * channels 1 and channel 2 are reserved and cannot be used for other - * purpose. - * @param htim TIM Encoder Interface handle - * @param sConfig TIM Encoder Interface configuration structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, const TIM_Encoder_InitTypeDef *sConfig) -{ - uint32_t tmpsmcr; - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); - assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); - assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC2Filter)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->Encoder_MspInitCallback == NULL) - { - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->Encoder_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_Encoder_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Reset the SMS and ECE bits */ - htim->Instance->SMCR &= ~(TIM_SMCR_SMS | TIM_SMCR_ECE); - - /* Configure the Time base in the Encoder Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = htim->Instance->CCMR1; - - /* Get the TIMx CCER register value */ - tmpccer = htim->Instance->CCER; - - /* Set the encoder Mode */ - tmpsmcr |= sConfig->EncoderMode; - - /* Select the Capture Compare 1 and the Capture Compare 2 as input */ - tmpccmr1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S); - tmpccmr1 |= (sConfig->IC1Selection | (sConfig->IC2Selection << 8U)); - - /* Set the Capture Compare 1 and the Capture Compare 2 prescalers and filters */ - tmpccmr1 &= ~(TIM_CCMR1_IC1PSC | TIM_CCMR1_IC2PSC); - tmpccmr1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC2F); - tmpccmr1 |= sConfig->IC1Prescaler | (sConfig->IC2Prescaler << 8U); - tmpccmr1 |= (sConfig->IC1Filter << 4U) | (sConfig->IC2Filter << 12U); - - /* Set the TI1 and the TI2 Polarities */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); - tmpccer &= ~(TIM_CCER_CC1NP | TIM_CCER_CC2NP); - tmpccer |= sConfig->IC1Polarity | (sConfig->IC2Polarity << 4U); - - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - - /* Write to TIMx CCMR1 */ - htim->Instance->CCMR1 = tmpccmr1; - - /* Write to TIMx CCER */ - htim->Instance->CCER = tmpccer; - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - - -/** - * @brief DeInitializes the TIM Encoder interface - * @param htim TIM Encoder Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->Encoder_MspDeInitCallback == NULL) - { - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; - } - /* DeInit the low level hardware */ - htim->Encoder_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_Encoder_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Encoder Interface MSP. - * @param htim TIM Encoder Interface handle - * @retval None - */ -__weak void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Encoder_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Encoder Interface MSP. - * @param htim TIM Encoder Interface handle - * @retval None - */ -__weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Encoder_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Encoder Interface. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Set the TIM channel(s) state */ - if (Channel == TIM_CHANNEL_1) - { - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else if (Channel == TIM_CHANNEL_2) - { - if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - - /* Enable the encoder interface channels */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - } - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - break; - } - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel(s) state */ - if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Encoder Interface in interrupt mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Set the TIM channel(s) state */ - if (Channel == TIM_CHANNEL_1) - { - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else if (Channel == TIM_CHANNEL_2) - { - if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - - /* Enable the encoder interface channels */ - /* Enable the capture compare Interrupts 1 and/or 2 */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - } - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface in interrupt mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - if (Channel == TIM_CHANNEL_1) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 1 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - } - else if (Channel == TIM_CHANNEL_2) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 2 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - else - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 1 and 2 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel(s) state */ - if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Encoder Interface in DMA mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @param pData1 The destination Buffer address for IC1. - * @param pData2 The destination Buffer address for IC2. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, - uint32_t *pData2, uint16_t Length) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Set the TIM channel(s) state */ - if (Channel == TIM_CHANNEL_1) - { - if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((pData1 == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - } - else if (Channel == TIM_CHANNEL_2) - { - if ((channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_2_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((pData2 == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - } - else - { - if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) - && (channel_2_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((((pData1 == NULL) || (pData2 == NULL))) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError; - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - break; - } - - default: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - break; - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface in DMA mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - if (Channel == TIM_CHANNEL_1) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 1 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - } - else if (Channel == TIM_CHANNEL_2) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 2 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - } - else - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 1 and 2 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel(s) state */ - if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ -/** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief TIM IRQ handler management - * -@verbatim - ============================================================================== - ##### IRQ handler management ##### - ============================================================================== - [..] - This section provides Timer IRQ handler function. - -@endverbatim - * @{ - */ -/** - * @brief This function handles TIM interrupts requests. - * @param htim TIM handle - * @retval None - */ -void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) -{ - uint32_t itsource = htim->Instance->DIER; - uint32_t itflag = htim->Instance->SR; - - /* Capture compare 1 event */ - if ((itflag & (TIM_FLAG_CC1)) == (TIM_FLAG_CC1)) - { - if ((itsource & (TIM_IT_CC1)) == (TIM_IT_CC1)) - { - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC1); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - /* Input capture event */ - if ((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - } - /* Capture compare 2 event */ - if ((itflag & (TIM_FLAG_CC2)) == (TIM_FLAG_CC2)) - { - if ((itsource & (TIM_IT_CC2)) == (TIM_IT_CC2)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC2); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - /* Input capture event */ - if ((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* Capture compare 3 event */ - if ((itflag & (TIM_FLAG_CC3)) == (TIM_FLAG_CC3)) - { - if ((itsource & (TIM_IT_CC3)) == (TIM_IT_CC3)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC3); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - /* Input capture event */ - if ((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* Capture compare 4 event */ - if ((itflag & (TIM_FLAG_CC4)) == (TIM_FLAG_CC4)) - { - if ((itsource & (TIM_IT_CC4)) == (TIM_IT_CC4)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC4); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - /* Input capture event */ - if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* TIM Update event */ - if ((itflag & (TIM_FLAG_UPDATE)) == (TIM_FLAG_UPDATE)) - { - if ((itsource & (TIM_IT_UPDATE)) == (TIM_IT_UPDATE)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_UPDATE); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedCallback(htim); -#else - HAL_TIM_PeriodElapsedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM Break input event */ - if ((itflag & (TIM_FLAG_BREAK)) == (TIM_FLAG_BREAK)) - { - if ((itsource & (TIM_IT_BREAK)) == (TIM_IT_BREAK)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_BREAK); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->BreakCallback(htim); -#else - HAL_TIMEx_BreakCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM Trigger detection event */ - if ((itflag & (TIM_FLAG_TRIGGER)) == (TIM_FLAG_TRIGGER)) - { - if ((itsource & (TIM_IT_TRIGGER)) == (TIM_IT_TRIGGER)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_TRIGGER); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerCallback(htim); -#else - HAL_TIM_TriggerCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM commutation event */ - if ((itflag & (TIM_FLAG_COM)) == (TIM_FLAG_COM)) - { - if ((itsource & (TIM_IT_COM)) == (TIM_IT_COM)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_COM); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationCallback(htim); -#else - HAL_TIMEx_CommutCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief TIM Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Configure The Input Output channels for OC, PWM, IC or One Pulse mode. - (+) Configure External Clock source. - (+) Configure Complementary channels, break features and dead time. - (+) Configure Master and the Slave synchronization. - (+) Configure the DMA Burst Mode. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the TIM Output Compare Channels according to the specified - * parameters in the TIM_OC_InitTypeDef. - * @param htim TIM Output Compare handle - * @param sConfig TIM Output Compare configuration structure - * @param Channel TIM Channels to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, - const TIM_OC_InitTypeDef *sConfig, - uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CHANNELS(Channel)); - assert_param(IS_TIM_OC_MODE(sConfig->OCMode)); - assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); - - /* Process Locked */ - __HAL_LOCK(htim); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 1 in Output Compare */ - TIM_OC1_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 2 in Output Compare */ - TIM_OC2_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 3 in Output Compare */ - TIM_OC3_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 4 in Output Compare */ - TIM_OC4_SetConfig(htim->Instance, sConfig); - break; - } - - default: - status = HAL_ERROR; - break; - } - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Initializes the TIM Input Capture Channels according to the specified - * parameters in the TIM_IC_InitTypeDef. - * @param htim TIM IC handle - * @param sConfig TIM Input Capture configuration structure - * @param Channel TIM Channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_IC_InitTypeDef *sConfig, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_IC_POLARITY(sConfig->ICPolarity)); - assert_param(IS_TIM_IC_SELECTION(sConfig->ICSelection)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->ICPrescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->ICFilter)); - - /* Process Locked */ - __HAL_LOCK(htim); - - if (Channel == TIM_CHANNEL_1) - { - /* TI1 Configuration */ - TIM_TI1_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - - /* Set the IC1PSC value */ - htim->Instance->CCMR1 |= sConfig->ICPrescaler; - } - else if (Channel == TIM_CHANNEL_2) - { - /* TI2 Configuration */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_TI2_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC2PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; - - /* Set the IC2PSC value */ - htim->Instance->CCMR1 |= (sConfig->ICPrescaler << 8U); - } - else if (Channel == TIM_CHANNEL_3) - { - /* TI3 Configuration */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - TIM_TI3_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC3PSC Bits */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC; - - /* Set the IC3PSC value */ - htim->Instance->CCMR2 |= sConfig->ICPrescaler; - } - else if (Channel == TIM_CHANNEL_4) - { - /* TI4 Configuration */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - TIM_TI4_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC4PSC Bits */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC; - - /* Set the IC4PSC value */ - htim->Instance->CCMR2 |= (sConfig->ICPrescaler << 8U); - } - else - { - status = HAL_ERROR; - } - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Initializes the TIM PWM channels according to the specified - * parameters in the TIM_OC_InitTypeDef. - * @param htim TIM PWM handle - * @param sConfig TIM PWM configuration structure - * @param Channel TIM Channels to be configured - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, - const TIM_OC_InitTypeDef *sConfig, - uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CHANNELS(Channel)); - assert_param(IS_TIM_PWM_MODE(sConfig->OCMode)); - assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); - assert_param(IS_TIM_FAST_STATE(sConfig->OCFastMode)); - - /* Process Locked */ - __HAL_LOCK(htim); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Configure the Channel 1 in PWM mode */ - TIM_OC1_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel1 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE; - htim->Instance->CCMR1 |= sConfig->OCFastMode; - break; - } - - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Configure the Channel 2 in PWM mode */ - TIM_OC2_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel2 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC2PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE; - htim->Instance->CCMR1 |= sConfig->OCFastMode << 8U; - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Configure the Channel 3 in PWM mode */ - TIM_OC3_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel3 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC3PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE; - htim->Instance->CCMR2 |= sConfig->OCFastMode; - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Configure the Channel 4 in PWM mode */ - TIM_OC4_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel4 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC4PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE; - htim->Instance->CCMR2 |= sConfig->OCFastMode << 8U; - break; - } - - default: - status = HAL_ERROR; - break; - } - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Initializes the TIM One Pulse Channels according to the specified - * parameters in the TIM_OnePulse_InitTypeDef. - * @param htim TIM One Pulse handle - * @param sConfig TIM One Pulse configuration structure - * @param OutputChannel TIM output channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @param InputChannel TIM input Channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @note To output a waveform with a minimum delay user can enable the fast - * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx - * output is forced in response to the edge detection on TIx input, - * without taking in account the comparison. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, - uint32_t OutputChannel, uint32_t InputChannel) -{ - HAL_StatusTypeDef status = HAL_OK; - TIM_OC_InitTypeDef temp1; - - /* Check the parameters */ - assert_param(IS_TIM_OPM_CHANNELS(OutputChannel)); - assert_param(IS_TIM_OPM_CHANNELS(InputChannel)); - - if (OutputChannel != InputChannel) - { - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Extract the Output compare configuration from sConfig structure */ - temp1.OCMode = sConfig->OCMode; - temp1.Pulse = sConfig->Pulse; - temp1.OCPolarity = sConfig->OCPolarity; - temp1.OCNPolarity = sConfig->OCNPolarity; - temp1.OCIdleState = sConfig->OCIdleState; - temp1.OCNIdleState = sConfig->OCNIdleState; - - switch (OutputChannel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - TIM_OC1_SetConfig(htim->Instance, &temp1); - break; - } - - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_OC2_SetConfig(htim->Instance, &temp1); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - switch (InputChannel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - TIM_TI1_SetConfig(htim->Instance, sConfig->ICPolarity, - sConfig->ICSelection, sConfig->ICFilter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - - /* Select the Trigger source */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI1FP1; - - /* Select the Slave Mode */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; - break; - } - - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_TI2_SetConfig(htim->Instance, sConfig->ICPolarity, - sConfig->ICSelection, sConfig->ICFilter); - - /* Reset the IC2PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; - - /* Select the Trigger source */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI2FP2; - - /* Select the Slave Mode */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; - break; - } - - default: - status = HAL_ERROR; - break; - } - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return status; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Configure the DMA Burst to transfer Data from the memory to the TIM peripheral - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @note This function should be used only when BurstLength is equal to DMA data transfer length. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, - uint32_t BurstLength) -{ - HAL_StatusTypeDef status; - - status = HAL_TIM_DMABurst_MultiWriteStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength, - ((BurstLength) >> 8U) + 1U); - - - - return status; -} - -/** - * @brief Configure the DMA Burst to transfer multiple Data from the memory to the TIM peripheral - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @param DataLength Data length. This parameter can be one value - * between 1 and 0xFFFF. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, - uint32_t BurstLength, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength)); - - if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY) - { - if ((BurstBuffer == NULL) && (BurstLength > 0U)) - { - return HAL_ERROR; - } - else - { - htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_COM: - { - /* Set the DMA commutation callbacks */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_TRIGGER: - { - /* Set the DMA trigger callbacks */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; - htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Configure the DMA Burst Mode */ - htim->Instance->DCR = (BurstBaseAddress | BurstLength); - /* Enable the TIM DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM DMA Burst mode - * @param htim TIM handle - * @param BurstRequestSrc TIM DMA Request sources to disable - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - - /* Abort the DMA transfer (at least disable the DMA stream) */ - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - break; - } - case TIM_DMA_CC1: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - case TIM_DMA_CC2: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - case TIM_DMA_CC3: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - case TIM_DMA_CC4: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - case TIM_DMA_COM: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); - break; - } - case TIM_DMA_TRIGGER: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); - break; - } - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - } - - /* Return function status */ - return status; -} - -/** - * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @note This function should be used only when BurstLength is equal to DMA data transfer length. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) -{ - HAL_StatusTypeDef status; - - status = HAL_TIM_DMABurst_MultiReadStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength, - ((BurstLength) >> 8U) + 1U); - - - return status; -} - -/** - * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @param DataLength Data length. This parameter can be one value - * between 1 and 0xFFFF. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, - uint32_t BurstLength, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength)); - - if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY) - { - if ((BurstBuffer == NULL) && (BurstLength > 0U)) - { - return HAL_ERROR; - } - else - { - htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC2: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC3: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC4: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_COM: - { - /* Set the DMA commutation callbacks */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_TRIGGER: - { - /* Set the DMA trigger callbacks */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; - htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Configure the DMA Burst Mode */ - htim->Instance->DCR = (BurstBaseAddress | BurstLength); - - /* Enable the TIM DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); - } - - /* Return function status */ - return status; -} - -/** - * @brief Stop the DMA burst reading - * @param htim TIM handle - * @param BurstRequestSrc TIM DMA Request sources to disable. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - - /* Abort the DMA transfer (at least disable the DMA stream) */ - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - break; - } - case TIM_DMA_CC1: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - case TIM_DMA_CC2: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - case TIM_DMA_CC3: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - case TIM_DMA_CC4: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - case TIM_DMA_COM: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); - break; - } - case TIM_DMA_TRIGGER: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); - break; - } - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - } - - /* Return function status */ - return status; -} - -/** - * @brief Generate a software event - * @param htim TIM handle - * @param EventSource specifies the event source. - * This parameter can be one of the following values: - * @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source - * @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source - * @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source - * @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source - * @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source - * @arg TIM_EVENTSOURCE_COM: Timer COM event source - * @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source - * @arg TIM_EVENTSOURCE_BREAK: Timer Break event source - * @note Basic timers can only generate an update event. - * @note TIM_EVENTSOURCE_COM is relevant only with advanced timer instances. - * @note TIM_EVENTSOURCE_BREAK are relevant only for timer instances - * supporting a break input. - * @retval HAL status - */ - -HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_EVENT_SOURCE(EventSource)); - - /* Process Locked */ - __HAL_LOCK(htim); - - /* Change the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Set the event sources */ - htim->Instance->EGR = EventSource; - - /* Change the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Configures the OCRef clear feature - * @param htim TIM handle - * @param sClearInputConfig pointer to a TIM_ClearInputConfigTypeDef structure that - * contains the OCREF clear feature and parameters for the TIM peripheral. - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @arg TIM_CHANNEL_4: TIM Channel 4 - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, - const TIM_ClearInputConfigTypeDef *sClearInputConfig, - uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_OCXREF_CLEAR_INSTANCE(htim->Instance)); - assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource)); - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - switch (sClearInputConfig->ClearInputSource) - { - case TIM_CLEARINPUTSOURCE_NONE: - { - /* Clear the OCREF clear selection bit and the the ETR Bits */ - CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP)); - break; - } - - case TIM_CLEARINPUTSOURCE_ETR: - { - /* Check the parameters */ - assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity)); - assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler)); - assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter)); - - /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ - if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - TIM_ETR_SetConfig(htim->Instance, - sClearInputConfig->ClearInputPrescaler, - sClearInputConfig->ClearInputPolarity, - sClearInputConfig->ClearInputFilter); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - switch (Channel) - { - case TIM_CHANNEL_1: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 1 */ - SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); - } - else - { - /* Disable the OCREF clear feature for Channel 1 */ - CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); - } - break; - } - case TIM_CHANNEL_2: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 2 */ - SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); - } - else - { - /* Disable the OCREF clear feature for Channel 2 */ - CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); - } - break; - } - case TIM_CHANNEL_3: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 3 */ - SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); - } - else - { - /* Disable the OCREF clear feature for Channel 3 */ - CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); - } - break; - } - case TIM_CHANNEL_4: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 4 */ - SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); - } - else - { - /* Disable the OCREF clear feature for Channel 4 */ - CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); - } - break; - } - default: - break; - } - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Configures the clock source to be used - * @param htim TIM handle - * @param sClockSourceConfig pointer to a TIM_ClockConfigTypeDef structure that - * contains the clock source information for the TIM peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, const TIM_ClockConfigTypeDef *sClockSourceConfig) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Check the parameters */ - assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource)); - - /* Reset the SMS, TS, ECE, ETPS and ETRF bits */ - tmpsmcr = htim->Instance->SMCR; - tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS); - tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); - htim->Instance->SMCR = tmpsmcr; - - switch (sClockSourceConfig->ClockSource) - { - case TIM_CLOCKSOURCE_INTERNAL: - { - assert_param(IS_TIM_INSTANCE(htim->Instance)); - break; - } - - case TIM_CLOCKSOURCE_ETRMODE1: - { - /* Check whether or not the timer instance supports external trigger input mode 1 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); - - /* Check ETR input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - /* Configure the ETR Clock source */ - TIM_ETR_SetConfig(htim->Instance, - sClockSourceConfig->ClockPrescaler, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - - /* Select the External clock mode1 and the ETRF trigger */ - tmpsmcr = htim->Instance->SMCR; - tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1); - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - break; - } - - case TIM_CLOCKSOURCE_ETRMODE2: - { - /* Check whether or not the timer instance supports external trigger input mode 2 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(htim->Instance)); - - /* Check ETR input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - /* Configure the ETR Clock source */ - TIM_ETR_SetConfig(htim->Instance, - sClockSourceConfig->ClockPrescaler, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - /* Enable the External clock mode2 */ - htim->Instance->SMCR |= TIM_SMCR_ECE; - break; - } - - case TIM_CLOCKSOURCE_TI1: - { - /* Check whether or not the timer instance supports external clock mode 1 */ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI1 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI1_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1); - break; - } - - case TIM_CLOCKSOURCE_TI2: - { - /* Check whether or not the timer instance supports external clock mode 1 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI2 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI2_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2); - break; - } - - case TIM_CLOCKSOURCE_TI1ED: - { - /* Check whether or not the timer instance supports external clock mode 1 */ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI1 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI1_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED); - break; - } - - case TIM_CLOCKSOURCE_ITR0: - case TIM_CLOCKSOURCE_ITR1: - case TIM_CLOCKSOURCE_ITR2: - case TIM_CLOCKSOURCE_ITR3: - { - /* Check whether or not the timer instance supports internal trigger input */ - assert_param(IS_TIM_CLOCKSOURCE_ITRX_INSTANCE(htim->Instance)); - - TIM_ITRx_SetConfig(htim->Instance, sClockSourceConfig->ClockSource); - break; - } - - default: - status = HAL_ERROR; - break; - } - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Selects the signal connected to the TI1 input: direct from CH1_input - * or a XOR combination between CH1_input, CH2_input & CH3_input - * @param htim TIM handle. - * @param TI1_Selection Indicate whether or not channel 1 is connected to the - * output of a XOR gate. - * This parameter can be one of the following values: - * @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input - * @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3 - * pins are connected to the TI1 input (XOR combination) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection) -{ - uint32_t tmpcr2; - - /* Check the parameters */ - assert_param(IS_TIM_XOR_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TI1SELECTION(TI1_Selection)); - - /* Get the TIMx CR2 register value */ - tmpcr2 = htim->Instance->CR2; - - /* Reset the TI1 selection */ - tmpcr2 &= ~TIM_CR2_TI1S; - - /* Set the TI1 selection */ - tmpcr2 |= TI1_Selection; - - /* Write to TIMxCR2 */ - htim->Instance->CR2 = tmpcr2; - - return HAL_OK; -} - -/** - * @brief Configures the TIM in Slave mode - * @param htim TIM handle. - * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that - * contains the selected trigger (internal trigger input, filtered - * timer input or external trigger input) and the Slave mode - * (Disable, Reset, Gated, Trigger, External clock mode 1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - /* Check the parameters */ - assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); - assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); - - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - /* Disable Trigger Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_TRIGGER); - - /* Disable Trigger DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIM in Slave mode in interrupt mode - * @param htim TIM handle. - * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that - * contains the selected trigger (internal trigger input, filtered - * timer input or external trigger input) and the Slave mode - * (Disable, Reset, Gated, Trigger, External clock mode 1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, - const TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - /* Check the parameters */ - assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); - assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); - - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - /* Enable Trigger Interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_TRIGGER); - - /* Disable Trigger DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Read the captured value from Capture Compare unit - * @param htim TIM handle. - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval Captured value - */ -uint32_t HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpreg = 0U; - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Return the capture 1 value */ - tmpreg = htim->Instance->CCR1; - - break; - } - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Return the capture 2 value */ - tmpreg = htim->Instance->CCR2; - - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Return the capture 3 value */ - tmpreg = htim->Instance->CCR3; - - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Return the capture 4 value */ - tmpreg = htim->Instance->CCR4; - - break; - } - - default: - break; - } - - return tmpreg; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * -@verbatim - ============================================================================== - ##### TIM Callbacks functions ##### - ============================================================================== - [..] - This section provides TIM callback functions: - (+) TIM Period elapsed callback - (+) TIM Output Compare callback - (+) TIM Input capture callback - (+) TIM Trigger callback - (+) TIM Error callback - -@endverbatim - * @{ - */ - -/** - * @brief Period elapsed callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PeriodElapsedCallback could be implemented in the user file - */ -} - -/** - * @brief Period elapsed half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PeriodElapsedHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Output Compare callback in non-blocking mode - * @param htim TIM OC handle - * @retval None - */ -__weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file - */ -} - -/** - * @brief Input Capture callback in non-blocking mode - * @param htim TIM IC handle - * @retval None - */ -__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_CaptureCallback could be implemented in the user file - */ -} - -/** - * @brief Input Capture half complete callback in non-blocking mode - * @param htim TIM IC handle - * @retval None - */ -__weak void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_CaptureHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief PWM Pulse finished callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file - */ -} - -/** - * @brief PWM Pulse finished half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_PulseFinishedHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Hall Trigger detection callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_TriggerCallback could be implemented in the user file - */ -} - -/** - * @brief Hall Trigger detection half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_TriggerHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Timer error callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_ErrorCallback could be implemented in the user file - */ -} - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User TIM callback to be used instead of the weak predefined callback - * @param htim tim handle - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID - * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID - * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID - * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID - * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID - * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID - * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID - * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID - * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID - * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID - * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID - * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID - * @param pCallback pointer to the callback function - * @retval status - */ -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, - pTIM_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - return HAL_ERROR; - } - - if (htim->State == HAL_TIM_STATE_READY) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = pCallback; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PERIOD_ELAPSED_CB_ID : - htim->PeriodElapsedCallback = pCallback; - break; - - case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : - htim->PeriodElapsedHalfCpltCallback = pCallback; - break; - - case HAL_TIM_TRIGGER_CB_ID : - htim->TriggerCallback = pCallback; - break; - - case HAL_TIM_TRIGGER_HALF_CB_ID : - htim->TriggerHalfCpltCallback = pCallback; - break; - - case HAL_TIM_IC_CAPTURE_CB_ID : - htim->IC_CaptureCallback = pCallback; - break; - - case HAL_TIM_IC_CAPTURE_HALF_CB_ID : - htim->IC_CaptureHalfCpltCallback = pCallback; - break; - - case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : - htim->OC_DelayElapsedCallback = pCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : - htim->PWM_PulseFinishedCallback = pCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : - htim->PWM_PulseFinishedHalfCpltCallback = pCallback; - break; - - case HAL_TIM_ERROR_CB_ID : - htim->ErrorCallback = pCallback; - break; - - case HAL_TIM_COMMUTATION_CB_ID : - htim->CommutationCallback = pCallback; - break; - - case HAL_TIM_COMMUTATION_HALF_CB_ID : - htim->CommutationHalfCpltCallback = pCallback; - break; - - case HAL_TIM_BREAK_CB_ID : - htim->BreakCallback = pCallback; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (htim->State == HAL_TIM_STATE_RESET) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = pCallback; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = pCallback; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Unregister a TIM callback - * TIM callback is redirected to the weak predefined callback - * @param htim tim handle - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID - * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID - * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID - * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID - * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID - * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID - * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID - * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID - * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID - * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID - * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID - * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID - * @retval status - */ -HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (htim->State == HAL_TIM_STATE_READY) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - /* Legacy weak Base MspInit Callback */ - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - /* Legacy weak Base Msp DeInit Callback */ - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - /* Legacy weak IC Msp Init Callback */ - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - /* Legacy weak IC Msp DeInit Callback */ - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - /* Legacy weak OC Msp Init Callback */ - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - /* Legacy weak OC Msp DeInit Callback */ - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - /* Legacy weak PWM Msp Init Callback */ - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - /* Legacy weak PWM Msp DeInit Callback */ - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - /* Legacy weak One Pulse Msp Init Callback */ - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - /* Legacy weak One Pulse Msp DeInit Callback */ - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - /* Legacy weak Encoder Msp Init Callback */ - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - /* Legacy weak Encoder Msp DeInit Callback */ - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - /* Legacy weak Hall Sensor Msp Init Callback */ - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - /* Legacy weak Hall Sensor Msp DeInit Callback */ - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; - break; - - case HAL_TIM_PERIOD_ELAPSED_CB_ID : - /* Legacy weak Period Elapsed Callback */ - htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; - break; - - case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : - /* Legacy weak Period Elapsed half complete Callback */ - htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; - break; - - case HAL_TIM_TRIGGER_CB_ID : - /* Legacy weak Trigger Callback */ - htim->TriggerCallback = HAL_TIM_TriggerCallback; - break; - - case HAL_TIM_TRIGGER_HALF_CB_ID : - /* Legacy weak Trigger half complete Callback */ - htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; - break; - - case HAL_TIM_IC_CAPTURE_CB_ID : - /* Legacy weak IC Capture Callback */ - htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; - break; - - case HAL_TIM_IC_CAPTURE_HALF_CB_ID : - /* Legacy weak IC Capture half complete Callback */ - htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; - break; - - case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : - /* Legacy weak OC Delay Elapsed Callback */ - htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : - /* Legacy weak PWM Pulse Finished Callback */ - htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : - /* Legacy weak PWM Pulse Finished half complete Callback */ - htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; - break; - - case HAL_TIM_ERROR_CB_ID : - /* Legacy weak Error Callback */ - htim->ErrorCallback = HAL_TIM_ErrorCallback; - break; - - case HAL_TIM_COMMUTATION_CB_ID : - /* Legacy weak Commutation Callback */ - htim->CommutationCallback = HAL_TIMEx_CommutCallback; - break; - - case HAL_TIM_COMMUTATION_HALF_CB_ID : - /* Legacy weak Commutation half complete Callback */ - htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; - break; - - case HAL_TIM_BREAK_CB_ID : - /* Legacy weak Break Callback */ - htim->BreakCallback = HAL_TIMEx_BreakCallback; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (htim->State == HAL_TIM_STATE_RESET) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - /* Legacy weak Base MspInit Callback */ - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - /* Legacy weak Base Msp DeInit Callback */ - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - /* Legacy weak IC Msp Init Callback */ - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - /* Legacy weak IC Msp DeInit Callback */ - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - /* Legacy weak OC Msp Init Callback */ - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - /* Legacy weak OC Msp DeInit Callback */ - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - /* Legacy weak PWM Msp Init Callback */ - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - /* Legacy weak PWM Msp DeInit Callback */ - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - /* Legacy weak One Pulse Msp Init Callback */ - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - /* Legacy weak One Pulse Msp DeInit Callback */ - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - /* Legacy weak Encoder Msp Init Callback */ - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - /* Legacy weak Encoder Msp DeInit Callback */ - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - /* Legacy weak Hall Sensor Msp Init Callback */ - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - /* Legacy weak Hall Sensor Msp DeInit Callback */ - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief TIM Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the TIM Base handle state. - * @param htim TIM Base handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM OC handle state. - * @param htim TIM Output Compare handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM PWM handle state. - * @param htim TIM handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Input Capture handle state. - * @param htim TIM IC handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM One Pulse Mode handle state. - * @param htim TIM OPM handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Encoder Mode handle state. - * @param htim TIM Encoder Interface handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Encoder Mode handle state. - * @param htim TIM handle - * @retval Active channel - */ -HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(const TIM_HandleTypeDef *htim) -{ - return htim->Channel; -} - -/** - * @brief Return actual state of the TIM channel. - * @param htim TIM handle - * @param Channel TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @arg TIM_CHANNEL_4: TIM Channel 4 - * @arg TIM_CHANNEL_5: TIM Channel 5 - * @arg TIM_CHANNEL_6: TIM Channel 6 - * @retval TIM Channel state - */ -HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(const TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_TIM_ChannelStateTypeDef channel_state; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); - - return channel_state; -} - -/** - * @brief Return actual state of a DMA burst operation. - * @param htim TIM handle - * @retval DMA burst state - */ -HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(const TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - - return htim->DMABurstState; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup TIM_Private_Functions TIM Private Functions - * @{ - */ - -/** - * @brief TIM DMA error callback - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMAError(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - htim->State = HAL_TIM_STATE_READY; - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->ErrorCallback(htim); -#else - HAL_TIM_ErrorCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Delay Pulse complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); - } - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Delay Pulse half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PWM_PulseFinishedHalfCpltCallback(htim); -#else - HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Capture complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); - } - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Capture half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureHalfCpltCallback(htim); -#else - HAL_TIM_IC_CaptureHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Period Elapse complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (htim->hdma[TIM_DMA_ID_UPDATE]->Init.Mode == DMA_NORMAL) - { - htim->State = HAL_TIM_STATE_READY; - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedCallback(htim); -#else - HAL_TIM_PeriodElapsedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Period Elapse half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedHalfCpltCallback(htim); -#else - HAL_TIM_PeriodElapsedHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Trigger callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (htim->hdma[TIM_DMA_ID_TRIGGER]->Init.Mode == DMA_NORMAL) - { - htim->State = HAL_TIM_STATE_READY; - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerCallback(htim); -#else - HAL_TIM_TriggerCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Trigger half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerHalfCpltCallback(htim); -#else - HAL_TIM_TriggerHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief Time Base configuration - * @param TIMx TIM peripheral - * @param Structure TIM Base configuration structure - * @retval None - */ -void TIM_Base_SetConfig(TIM_TypeDef *TIMx, const TIM_Base_InitTypeDef *Structure) -{ - uint32_t tmpcr1; - tmpcr1 = TIMx->CR1; - - /* Set TIM Time Base Unit parameters ---------------------------------------*/ - if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx)) - { - /* Select the Counter Mode */ - tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS); - tmpcr1 |= Structure->CounterMode; - } - - if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx)) - { - /* Set the clock division */ - tmpcr1 &= ~TIM_CR1_CKD; - tmpcr1 |= (uint32_t)Structure->ClockDivision; - } - - /* Set the auto-reload preload */ - MODIFY_REG(tmpcr1, TIM_CR1_ARPE, Structure->AutoReloadPreload); - - TIMx->CR1 = tmpcr1; - - /* Set the Autoreload value */ - TIMx->ARR = (uint32_t)Structure->Period ; - - /* Set the Prescaler value */ - TIMx->PSC = Structure->Prescaler; - - if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx)) - { - /* Set the Repetition Counter value */ - TIMx->RCR = Structure->RepetitionCounter; - } - - /* Generate an update event to reload the Prescaler - and the repetition counter (only for advanced timer) value immediately */ - TIMx->EGR = TIM_EGR_UG; - - /* Check if the update flag is set after the Update Generation, if so clear the UIF flag */ - if (HAL_IS_BIT_SET(TIMx->SR, TIM_FLAG_UPDATE)) - { - /* Clear the update flag */ - CLEAR_BIT(TIMx->SR, TIM_FLAG_UPDATE); - } -} - -/** - * @brief Timer Output Compare 1 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The output configuration structure - * @retval None - */ -static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= ~TIM_CCER_CC1E; - - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare Mode Bits */ - tmpccmrx &= ~TIM_CCMR1_OC1M; - tmpccmrx &= ~TIM_CCMR1_CC1S; - /* Select the Output Compare Mode */ - tmpccmrx |= OC_Config->OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC1P; - /* Set the Output Compare Polarity */ - tmpccer |= OC_Config->OCPolarity; - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_1)) - { - /* Check parameters */ - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC1NP; - /* Set the Output N Polarity */ - tmpccer |= OC_Config->OCNPolarity; - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC1NE; - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS1; - tmpcr2 &= ~TIM_CR2_OIS1N; - /* Set the Output Idle state */ - tmpcr2 |= OC_Config->OCIdleState; - /* Set the Output N Idle state */ - tmpcr2 |= OC_Config->OCNIdleState; - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR1 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 2 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The output configuration structure - * @retval None - */ -void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC2E; - - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR1_OC2M; - tmpccmrx &= ~TIM_CCMR1_CC2S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (OC_Config->OCMode << 8U); - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC2P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 4U); - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_2)) - { - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC2NP; - /* Set the Output N Polarity */ - tmpccer |= (OC_Config->OCNPolarity << 4U); - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC2NE; - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS2; - tmpcr2 &= ~TIM_CR2_OIS2N; - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 2U); - /* Set the Output N Idle state */ - tmpcr2 |= (OC_Config->OCNIdleState << 2U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR2 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 3 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The output configuration structure - * @retval None - */ -static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Disable the Channel 3: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC3E; - - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR2_OC3M; - tmpccmrx &= ~TIM_CCMR2_CC3S; - /* Select the Output Compare Mode */ - tmpccmrx |= OC_Config->OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC3P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 8U); - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_3)) - { - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC3NP; - /* Set the Output N Polarity */ - tmpccer |= (OC_Config->OCNPolarity << 8U); - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC3NE; - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS3; - tmpcr2 &= ~TIM_CR2_OIS3N; - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 4U); - /* Set the Output N Idle state */ - tmpcr2 |= (OC_Config->OCNIdleState << 4U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR3 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 4 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The output configuration structure - * @retval None - */ -static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Disable the Channel 4: Reset the CC4E Bit */ - TIMx->CCER &= ~TIM_CCER_CC4E; - - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR2_OC4M; - tmpccmrx &= ~TIM_CCMR2_CC4S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (OC_Config->OCMode << 8U); - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC4P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 12U); - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS4; - - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 6U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR4 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Slave Timer configuration function - * @param htim TIM handle - * @param sSlaveConfig Slave timer configuration - * @retval None - */ -static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - const TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Reset the Trigger Selection Bits */ - tmpsmcr &= ~TIM_SMCR_TS; - /* Set the Input Trigger source */ - tmpsmcr |= sSlaveConfig->InputTrigger; - - /* Reset the slave mode Bits */ - tmpsmcr &= ~TIM_SMCR_SMS; - /* Set the slave mode */ - tmpsmcr |= sSlaveConfig->SlaveMode; - - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - - /* Configure the trigger prescaler, filter, and polarity */ - switch (sSlaveConfig->InputTrigger) - { - case TIM_TS_ETRF: - { - /* Check the parameters */ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - /* Configure the ETR Trigger source */ - TIM_ETR_SetConfig(htim->Instance, - sSlaveConfig->TriggerPrescaler, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_TI1F_ED: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - if (sSlaveConfig->SlaveMode == TIM_SLAVEMODE_GATED) - { - return HAL_ERROR; - } - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = htim->Instance->CCER; - htim->Instance->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = htim->Instance->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4U); - - /* Write to TIMx CCMR1 and CCER registers */ - htim->Instance->CCMR1 = tmpccmr1; - htim->Instance->CCER = tmpccer; - break; - } - - case TIM_TS_TI1FP1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - /* Configure TI1 Filter and Polarity */ - TIM_TI1_ConfigInputStage(htim->Instance, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_TI2FP2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - /* Configure TI2 Filter and Polarity */ - TIM_TI2_ConfigInputStage(htim->Instance, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_ITR0: - case TIM_TS_ITR1: - case TIM_TS_ITR2: - case TIM_TS_ITR3: - { - /* Check the parameter */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - break; - } - - default: - status = HAL_ERROR; - break; - } - - return status; -} - -/** - * @brief Configure the TI1 as Input. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 1 is selected to be connected to IC1. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 1 is selected to be connected to IC2. - * @arg TIM_ICSELECTION_TRC: TIM Input 1 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI2FP1 - * (on channel2 path) is used as the input signal. Therefore CCMR1 must be - * protected against un-initialized filter and polarity values. - */ -void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = TIMx->CCMR1; - - /* Select the Input */ - if (IS_TIM_CC2_INSTANCE(TIMx) != RESET) - { - tmpccmr1 &= ~TIM_CCMR1_CC1S; - tmpccmr1 |= TIM_ICSelection; - } - else - { - tmpccmr1 |= TIM_CCMR1_CC1S_0; - } - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= ((TIM_ICFilter << 4U) & TIM_CCMR1_IC1F); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); - tmpccer |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP)); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the Polarity and Filter for TI1. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = TIMx->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= (TIM_ICFilter << 4U); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); - tmpccer |= TIM_ICPolarity; - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI2 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 2 is selected to be connected to IC2. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 2 is selected to be connected to IC1. - * @arg TIM_ICSELECTION_TRC: TIM Input 2 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI1FP2 - * (on channel1 path) is used as the input signal. Therefore CCMR1 must be - * protected against un-initialized filter and polarity values. - */ -static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 2: Reset the CC2E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC2E; - tmpccmr1 = TIMx->CCMR1; - - /* Select the Input */ - tmpccmr1 &= ~TIM_CCMR1_CC2S; - tmpccmr1 |= (TIM_ICSelection << 8U); - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC2F; - tmpccmr1 |= ((TIM_ICFilter << 12U) & TIM_CCMR1_IC2F); - - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); - tmpccer |= ((TIM_ICPolarity << 4U) & (TIM_CCER_CC2P | TIM_CCER_CC2NP)); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the Polarity and Filter for TI2. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 2: Reset the CC2E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC2E; - tmpccmr1 = TIMx->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC2F; - tmpccmr1 |= (TIM_ICFilter << 12U); - - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); - tmpccer |= (TIM_ICPolarity << 4U); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI3 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 3 is selected to be connected to IC3. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 3 is selected to be connected to IC4. - * @arg TIM_ICSELECTION_TRC: TIM Input 3 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI3FP4 - * (on channel1 path) is used as the input signal. Therefore CCMR2 must be - * protected against un-initialized filter and polarity values. - */ -static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr2; - uint32_t tmpccer; - - /* Disable the Channel 3: Reset the CC3E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC3E; - tmpccmr2 = TIMx->CCMR2; - - /* Select the Input */ - tmpccmr2 &= ~TIM_CCMR2_CC3S; - tmpccmr2 |= TIM_ICSelection; - - /* Set the filter */ - tmpccmr2 &= ~TIM_CCMR2_IC3F; - tmpccmr2 |= ((TIM_ICFilter << 4U) & TIM_CCMR2_IC3F); - - /* Select the Polarity and set the CC3E Bit */ - tmpccer &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP); - tmpccer |= ((TIM_ICPolarity << 8U) & (TIM_CCER_CC3P | TIM_CCER_CC3NP)); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI4 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 4 is selected to be connected to IC4. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 4 is selected to be connected to IC3. - * @arg TIM_ICSELECTION_TRC: TIM Input 4 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI4FP3 - * (on channel1 path) is used as the input signal. Therefore CCMR2 must be - * protected against un-initialized filter and polarity values. - * @retval None - */ -static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr2; - uint32_t tmpccer; - - /* Disable the Channel 4: Reset the CC4E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC4E; - tmpccmr2 = TIMx->CCMR2; - - /* Select the Input */ - tmpccmr2 &= ~TIM_CCMR2_CC4S; - tmpccmr2 |= (TIM_ICSelection << 8U); - - /* Set the filter */ - tmpccmr2 &= ~TIM_CCMR2_IC4F; - tmpccmr2 |= ((TIM_ICFilter << 12U) & TIM_CCMR2_IC4F); - - /* Select the Polarity and set the CC4E Bit */ - tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP); - tmpccer |= ((TIM_ICPolarity << 12U) & (TIM_CCER_CC4P | TIM_CCER_CC4NP)); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer ; -} - -/** - * @brief Selects the Input Trigger source - * @param TIMx to select the TIM peripheral - * @param InputTriggerSource The Input Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal Trigger 0 - * @arg TIM_TS_ITR1: Internal Trigger 1 - * @arg TIM_TS_ITR2: Internal Trigger 2 - * @arg TIM_TS_ITR3: Internal Trigger 3 - * @arg TIM_TS_TI1F_ED: TI1 Edge Detector - * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 - * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 - * @arg TIM_TS_ETRF: External Trigger input - * @retval None - */ -static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource) -{ - uint32_t tmpsmcr; - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - /* Reset the TS Bits */ - tmpsmcr &= ~TIM_SMCR_TS; - /* Set the Input Trigger source and the slave mode*/ - tmpsmcr |= (InputTriggerSource | TIM_SLAVEMODE_EXTERNAL1); - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} -/** - * @brief Configures the TIMx External Trigger (ETR). - * @param TIMx to select the TIM peripheral - * @param TIM_ExtTRGPrescaler The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ETRPRESCALER_DIV1: ETRP Prescaler OFF. - * @arg TIM_ETRPRESCALER_DIV2: ETRP frequency divided by 2. - * @arg TIM_ETRPRESCALER_DIV4: ETRP frequency divided by 4. - * @arg TIM_ETRPRESCALER_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ETRPOLARITY_INVERTED: active low or falling edge active. - * @arg TIM_ETRPOLARITY_NONINVERTED: active high or rising edge active. - * @param ExtTRGFilter External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, - uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) -{ - uint32_t tmpsmcr; - - tmpsmcr = TIMx->SMCR; - - /* Reset the ETR Bits */ - tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); - - /* Set the Prescaler, the Filter value and the Polarity */ - tmpsmcr |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << 8U))); - - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel x. - * @param TIMx to select the TIM peripheral - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @arg TIM_CHANNEL_4: TIM Channel 4 - * @param ChannelState specifies the TIM Channel CCxE bit new state. - * This parameter can be: TIM_CCx_ENABLE or TIM_CCx_DISABLE. - * @retval None - */ -void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState) -{ - uint32_t tmp; - - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(TIMx)); - assert_param(IS_TIM_CHANNELS(Channel)); - - tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ - - /* Reset the CCxE Bit */ - TIMx->CCER &= ~tmp; - - /* Set or reset the CCxE Bit */ - TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ -} - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief Reset interrupt callbacks to the legacy weak callbacks. - * @param htim pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -void TIM_ResetCallback(TIM_HandleTypeDef *htim) -{ - /* Reset the TIM callback to the legacy weak callbacks */ - htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; - htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; - htim->TriggerCallback = HAL_TIM_TriggerCallback; - htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; - htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; - htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; - htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; - htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; - htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; - htim->ErrorCallback = HAL_TIM_ErrorCallback; - htim->CommutationCallback = HAL_TIMEx_CommutCallback; - htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; - htim->BreakCallback = HAL_TIMEx_BreakCallback; -} -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -#endif /* HAL_TIM_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c deleted file mode 100644 index 889f8fb..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c +++ /dev/null @@ -1,2410 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim_ex.c - * @author MCD Application Team - * @brief TIM HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Timer Extended peripheral: - * + Time Hall Sensor Interface Initialization - * + Time Hall Sensor Interface Start - * + Time Complementary signal break and dead time configuration - * + Time Master and Slave synchronization configuration - * + Timer remapping capabilities configuration - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### TIMER Extended features ##### - ============================================================================== - [..] - The Timer Extended features include: - (#) Complementary outputs with programmable dead-time for : - (++) Output Compare - (++) PWM generation (Edge and Center-aligned Mode) - (++) One-pulse mode output - (#) Synchronization circuit to control the timer with external signals and to - interconnect several timers together. - (#) Break input to put the timer output signals in reset state or in a known state. - (#) Supports incremental (quadrature) encoder and hall-sensor circuitry for - positioning purposes - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Initialize the TIM low level resources by implementing the following functions - depending on the selected feature: - (++) Hall Sensor output : HAL_TIMEx_HallSensor_MspInit() - - (#) Initialize the TIM low level resources : - (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); - (##) TIM pins configuration - (+++) Enable the clock for the TIM GPIOs using the following function: - __HAL_RCC_GPIOx_CLK_ENABLE(); - (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); - - (#) The external Clock can be configured, if needed (the default clock is the - internal clock from the APBx), using the following function: - HAL_TIM_ConfigClockSource, the clock configuration should be done before - any start function. - - (#) Configure the TIM in the desired functioning mode using one of the - initialization function of this driver: - (++) HAL_TIMEx_HallSensor_Init() and HAL_TIMEx_ConfigCommutEvent(): to use the - Timer Hall Sensor Interface and the commutation event with the corresponding - Interrupt and DMA request if needed (Note that One Timer is used to interface - with the Hall sensor Interface and another Timer should be used to use - the commutation event). - - (#) Activate the TIM peripheral using one of the start functions: - (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), - HAL_TIMEx_OCN_Start_IT() - (++) Complementary PWM generation : HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(), - HAL_TIMEx_PWMN_Start_IT() - (++) Complementary One-pulse mode output : HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT() - (++) Hall Sensor output : HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(), - HAL_TIMEx_HallSensor_Start_IT(). - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup TIMEx TIMEx - * @brief TIM Extended HAL module driver - * @{ - */ - -#ifdef HAL_TIM_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma); -static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState); - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Functions TIM Extended Exported Functions - * @{ - */ - -/** @defgroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * -@verbatim - ============================================================================== - ##### Timer Hall Sensor functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure TIM HAL Sensor. - (+) De-initialize TIM HAL Sensor. - (+) Start the Hall Sensor Interface. - (+) Stop the Hall Sensor Interface. - (+) Start the Hall Sensor Interface and enable interrupts. - (+) Stop the Hall Sensor Interface and disable interrupts. - (+) Start the Hall Sensor Interface and enable DMA transfers. - (+) Stop the Hall Sensor Interface and disable DMA transfers. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Hall Sensor Interface and initialize the associated handle. - * @note When the timer instance is initialized in Hall Sensor Interface mode, - * timer channels 1 and channel 2 are reserved and cannot be used for - * other purpose. - * @param htim TIM Hall Sensor Interface handle - * @param sConfig TIM Hall Sensor configuration structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, const TIM_HallSensor_InitTypeDef *sConfig) -{ - TIM_OC_InitTypeDef OC_Config; - - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy week callbacks */ - TIM_ResetCallback(htim); - - if (htim->HallSensor_MspInitCallback == NULL) - { - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->HallSensor_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIMEx_HallSensor_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Configure the Time base in the Encoder Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Configure the Channel 1 as Input Channel to interface with the three Outputs of the Hall sensor */ - TIM_TI1_SetConfig(htim->Instance, sConfig->IC1Polarity, TIM_ICSELECTION_TRC, sConfig->IC1Filter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - /* Set the IC1PSC value */ - htim->Instance->CCMR1 |= sConfig->IC1Prescaler; - - /* Enable the Hall sensor interface (XOR function of the three inputs) */ - htim->Instance->CR2 |= TIM_CR2_TI1S; - - /* Select the TIM_TS_TI1F_ED signal as Input trigger for the TIM */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI1F_ED; - - /* Use the TIM_TS_TI1F_ED signal to reset the TIM counter each edge detection */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_RESET; - - /* Program channel 2 in PWM 2 mode with the desired Commutation_Delay*/ - OC_Config.OCFastMode = TIM_OCFAST_DISABLE; - OC_Config.OCIdleState = TIM_OCIDLESTATE_RESET; - OC_Config.OCMode = TIM_OCMODE_PWM2; - OC_Config.OCNIdleState = TIM_OCNIDLESTATE_RESET; - OC_Config.OCNPolarity = TIM_OCNPOLARITY_HIGH; - OC_Config.OCPolarity = TIM_OCPOLARITY_HIGH; - OC_Config.Pulse = sConfig->Commutation_Delay; - - TIM_OC2_SetConfig(htim->Instance, &OC_Config); - - /* Select OC2REF as trigger output on TRGO: write the MMS bits in the TIMx_CR2 - register to 101 */ - htim->Instance->CR2 &= ~TIM_CR2_MMS; - htim->Instance->CR2 |= TIM_TRGO_OC2REF; - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM Hall Sensor interface - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->HallSensor_MspDeInitCallback == NULL) - { - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; - } - /* DeInit the low level hardware */ - htim->HallSensor_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIMEx_HallSensor_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Hall Sensor MSP. - * @param htim TIM Hall Sensor Interface handle - * @retval None - */ -__weak void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_HallSensor_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Hall Sensor MSP. - * @param htim TIM Hall Sensor Interface handle - * @retval None - */ -__weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_HallSensor_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Hall Sensor Interface. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall sensor Interface. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1, 2 and 3 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Hall Sensor Interface in interrupt mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the capture compare Interrupts 1 event */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall Sensor Interface in interrupt mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts event */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Hall Sensor Interface in DMA mode. - * @param htim TIM Hall Sensor Interface handle - * @param pData The destination Buffer address. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Set the TIM channel state */ - if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Set the DMA Input Capture 1 Callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream for Capture 1*/ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the capture compare 1 Interrupt */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall Sensor Interface in DMA mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - - /* Disable the capture compare Interrupts 1 event */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * -@verbatim - ============================================================================== - ##### Timer Complementary Output Compare functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary Output Compare/PWM. - (+) Stop the Complementary Output Compare/PWM. - (+) Start the Complementary Output Compare/PWM and enable interrupts. - (+) Stop the Complementary Output Compare/PWM and disable interrupts. - (+) Start the Complementary Output Compare/PWM and enable DMA transfers. - (+) Stop the Complementary Output Compare/PWM and disable DMA transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the TIM Output Compare signal generation on the complementary - * output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation on the complementary - * output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in interrupt mode - * on the complementary output. - * @param htim TIM OC handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the TIM Break interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); - - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Output Compare signal generation in interrupt mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpccer; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the TIM Break interrupt (only if no more channel is active) */ - tmpccer = htim->Instance->CCER; - if ((tmpccer & TIM_CCER_CCxNE_MASK) == (uint32_t)RESET) - { - __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); - } - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM Output Compare signal generation in DMA mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Set the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) - { - return HAL_BUSY; - } - else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Output Compare signal generation in DMA mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * -@verbatim - ============================================================================== - ##### Timer Complementary PWM functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary PWM. - (+) Stop the Complementary PWM. - (+) Start the Complementary PWM and enable interrupts. - (+) Stop the Complementary PWM and disable interrupts. - (+) Start the Complementary PWM and enable DMA transfers. - (+) Stop the Complementary PWM and disable DMA transfers. -@endverbatim - * @{ - */ - -/** - * @brief Starts the PWM signal generation on the complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation on the complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the PWM signal generation in interrupt mode on the - * complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the TIM Break interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); - - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the PWM signal generation in interrupt mode on the - * complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpccer; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the TIM Break interrupt (only if no more channel is active) */ - tmpccer = htim->Instance->CCER; - if ((tmpccer & TIM_CCER_CCxNE_MASK) == (uint32_t)RESET) - { - __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); - } - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM PWM signal generation in DMA mode on the - * complementary output - * @param htim TIM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Set the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) - { - return HAL_BUSY; - } - else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM PWM signal generation in DMA mode on the complementary - * output - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * -@verbatim - ============================================================================== - ##### Timer Complementary One Pulse functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary One Pulse generation. - (+) Stop the Complementary One Pulse. - (+) Start the Complementary One Pulse and enable interrupts. - (+) Stop the Complementary One Pulse and disable interrupts. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the TIM One Pulse signal generation on the complementary - * output. - * @note OutputChannel must match the pulse output channel chosen when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel pulse output channel to enable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the complementary One Pulse output channel and the Input Capture channel */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); - TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation on the complementary - * output. - * @note OutputChannel must match the pulse output channel chosen when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel pulse output channel to disable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Disable the complementary One Pulse output channel and the Input Capture channel */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); - TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM One Pulse signal generation in interrupt mode on the - * complementary channel. - * @note OutputChannel must match the pulse output channel chosen when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel pulse output channel to enable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - - /* Enable the complementary One Pulse output channel and the Input Capture channel */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); - TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation in interrupt mode on the - * complementary channel. - * @note OutputChannel must match the pulse output channel chosen when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel pulse output channel to disable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - - /* Disable the complementary One Pulse output channel and the Input Capture channel */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); - TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Configure the commutation event in case of use of the Hall sensor interface. - (+) Configure Output channels for OC and PWM mode. - - (+) Configure Complementary channels, break features and dead time. - (+) Configure Master synchronization. - (+) Configure timer remapping capabilities. - -@endverbatim - * @{ - */ - -/** - * @brief Configure the TIM commutation event sequence. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Disable Commutation Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); - - /* Disable Commutation DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configure the TIM commutation event sequence with interrupt. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Disable Commutation DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); - - /* Enable the Commutation Interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configure the TIM commutation event sequence with DMA. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @note The user should configure the DMA in his own software, in This function only the COMDE bit is set - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Enable the Commutation DMA Request */ - /* Set the DMA Commutation Callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError; - - /* Disable Commutation Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); - - /* Enable the Commutation DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIM in master mode. - * @param htim TIM handle. - * @param sMasterConfig pointer to a TIM_MasterConfigTypeDef structure that - * contains the selected trigger output (TRGO) and the Master/Slave - * mode. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, - const TIM_MasterConfigTypeDef *sMasterConfig) -{ - uint32_t tmpcr2; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); - assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); - - /* Check input state */ - __HAL_LOCK(htim); - - /* Change the handler state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Get the TIMx CR2 register value */ - tmpcr2 = htim->Instance->CR2; - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Reset the MMS Bits */ - tmpcr2 &= ~TIM_CR2_MMS; - /* Select the TRGO source */ - tmpcr2 |= sMasterConfig->MasterOutputTrigger; - - /* Update TIMx CR2 */ - htim->Instance->CR2 = tmpcr2; - - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - /* Reset the MSM Bit */ - tmpsmcr &= ~TIM_SMCR_MSM; - /* Set master mode */ - tmpsmcr |= sMasterConfig->MasterSlaveMode; - - /* Update TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - } - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the Break feature, dead time, Lock level, OSSI/OSSR State - * and the AOE(automatic output enable). - * @param htim TIM handle - * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that - * contains the BDTR Register configuration information for the TIM peripheral. - * @note Interrupts can be generated when an active level is detected on the - * break input, the break 2 input or the system break input. Break - * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, - const TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig) -{ - /* Keep this variable initialized to 0 as it is used to configure BDTR register */ - uint32_t tmpbdtr = 0U; - - /* Check the parameters */ - assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); - assert_param(IS_TIM_OSSR_STATE(sBreakDeadTimeConfig->OffStateRunMode)); - assert_param(IS_TIM_OSSI_STATE(sBreakDeadTimeConfig->OffStateIDLEMode)); - assert_param(IS_TIM_LOCK_LEVEL(sBreakDeadTimeConfig->LockLevel)); - assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime)); - assert_param(IS_TIM_BREAK_STATE(sBreakDeadTimeConfig->BreakState)); - assert_param(IS_TIM_BREAK_POLARITY(sBreakDeadTimeConfig->BreakPolarity)); - assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(sBreakDeadTimeConfig->AutomaticOutput)); - - /* Check input state */ - __HAL_LOCK(htim); - - /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State, - the OSSI State, the dead time value and the Automatic Output Enable Bit */ - - /* Set the BDTR bits */ - MODIFY_REG(tmpbdtr, TIM_BDTR_DTG, sBreakDeadTimeConfig->DeadTime); - MODIFY_REG(tmpbdtr, TIM_BDTR_LOCK, sBreakDeadTimeConfig->LockLevel); - MODIFY_REG(tmpbdtr, TIM_BDTR_OSSI, sBreakDeadTimeConfig->OffStateIDLEMode); - MODIFY_REG(tmpbdtr, TIM_BDTR_OSSR, sBreakDeadTimeConfig->OffStateRunMode); - MODIFY_REG(tmpbdtr, TIM_BDTR_BKE, sBreakDeadTimeConfig->BreakState); - MODIFY_REG(tmpbdtr, TIM_BDTR_BKP, sBreakDeadTimeConfig->BreakPolarity); - MODIFY_REG(tmpbdtr, TIM_BDTR_AOE, sBreakDeadTimeConfig->AutomaticOutput); - - - /* Set TIMx_BDTR */ - htim->Instance->BDTR = tmpbdtr; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIMx Remapping input capabilities. - * @param htim TIM handle. - * @param Remap specifies the TIM remapping source. - * For TIM1, the parameter can have the following values: (**) - * @arg TIM_TIM1_TIM3_TRGO: TIM1 ITR2 is connected to TIM3 TRGO - * @arg TIM_TIM1_LPTIM: TIM1 ITR2 is connected to LPTIM1 output - * - * For TIM2, the parameter can have the following values: (**) - * @arg TIM_TIM2_TIM8_TRGO: TIM2 ITR1 is connected to TIM8 TRGO (*) - * @arg TIM_TIM2_ETH_PTP: TIM2 ITR1 is connected to PTP trigger output (*) - * @arg TIM_TIM2_USBFS_SOF: TIM2 ITR1 is connected to OTG FS SOF - * @arg TIM_TIM2_USBHS_SOF: TIM2 ITR1 is connected to OTG FS SOF - * - * For TIM5, the parameter can have the following values: - * @arg TIM_TIM5_GPIO: TIM5 TI4 is connected to GPIO - * @arg TIM_TIM5_LSI: TIM5 TI4 is connected to LSI - * @arg TIM_TIM5_LSE: TIM5 TI4 is connected to LSE - * @arg TIM_TIM5_RTC: TIM5 TI4 is connected to the RTC wakeup interrupt - * @arg TIM_TIM5_TIM3_TRGO: TIM5 ITR1 is connected to TIM3 TRGO (*) - * @arg TIM_TIM5_LPTIM: TIM5 ITR1 is connected to LPTIM1 output (*) - * - * For TIM9, the parameter can have the following values: (**) - * @arg TIM_TIM9_TIM3_TRGO: TIM9 ITR1 is connected to TIM3 TRGO - * @arg TIM_TIM9_LPTIM: TIM9 ITR1 is connected to LPTIM1 output - * - * For TIM11, the parameter can have the following values: - * @arg TIM_TIM11_GPIO: TIM11 TI1 is connected to GPIO - * @arg TIM_TIM11_HSE: TIM11 TI1 is connected to HSE_RTC clock - * @arg TIM_TIM11_SPDIFRX: TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC (*) - * - * (*) Value not defined in all devices. \n - * (**) Register not available in all devices. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap) -{ - /* Check parameters */ - assert_param(IS_TIM_REMAP(htim->Instance, Remap)); - - __HAL_LOCK(htim); - -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM9_ITR1_RMP) - if ((Remap & LPTIM_REMAP_MASK) == LPTIM_REMAP_MASK) - { - /* Connect TIMx internal trigger to LPTIM1 output */ - __HAL_RCC_LPTIM1_CLK_ENABLE(); - MODIFY_REG(LPTIM1->OR, - (LPTIM_OR_TIM1_ITR2_RMP | LPTIM_OR_TIM5_ITR1_RMP | LPTIM_OR_TIM9_ITR1_RMP), - Remap & ~(LPTIM_REMAP_MASK)); - } - else - { - /* Set the Timer remapping configuration */ - WRITE_REG(htim->Instance->OR, Remap); - } -#else - /* Set the Timer remapping configuration */ - WRITE_REG(htim->Instance->OR, Remap); -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM9_ITR1_RMP */ - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions - * @brief Extended Callbacks functions - * -@verbatim - ============================================================================== - ##### Extended Callbacks functions ##### - ============================================================================== - [..] - This section provides Extended TIM callback functions: - (+) Timer Commutation callback - (+) Timer Break callback - -@endverbatim - * @{ - */ - -/** - * @brief Commutation callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_CommutCallback could be implemented in the user file - */ -} -/** - * @brief Commutation half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_CommutHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Break detection callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_BreakCallback could be implemented in the user file - */ -} -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions - * @brief Extended Peripheral State functions - * -@verbatim - ============================================================================== - ##### Extended Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the TIM Hall Sensor interface handle state. - * @param htim TIM Hall Sensor handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return actual state of the TIM complementary channel. - * @param htim TIM handle - * @param ChannelN TIM Complementary channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @retval TIM Complementary channel state - */ -HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(const TIM_HandleTypeDef *htim, uint32_t ChannelN) -{ - HAL_TIM_ChannelStateTypeDef channel_state; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, ChannelN)); - - channel_state = TIM_CHANNEL_N_STATE_GET(htim, ChannelN); - - return channel_state; -} -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions - * @{ - */ - -/** - * @brief TIM DMA Commutation callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationCallback(htim); -#else - HAL_TIMEx_CommutCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Commutation half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationHalfCpltCallback(htim); -#else - HAL_TIMEx_CommutHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - - -/** - * @brief TIM DMA Delay Pulse complete callback (complementary channel). - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA error callback (complementary channel) - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->ErrorCallback(htim); -#else - HAL_TIM_ErrorCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel xN. - * @param TIMx to select the TIM peripheral - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @param ChannelNState specifies the TIM Channel CCxNE bit new state. - * This parameter can be: TIM_CCxN_ENABLE or TIM_CCxN_Disable. - * @retval None - */ -static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState) -{ - uint32_t tmp; - - tmp = TIM_CCER_CC1NE << (Channel & 0xFU); /* 0xFU = 15 bits max shift */ - - /* Reset the CCxNE Bit */ - TIMx->CCER &= ~tmp; - - /* Set or reset the CCxNE Bit */ - TIMx->CCER |= (uint32_t)(ChannelNState << (Channel & 0xFU)); /* 0xFU = 15 bits max shift */ -} -/** - * @} - */ - -#endif /* HAL_TIM_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_adc.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_adc.c deleted file mode 100644 index cdb750f..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_adc.c +++ /dev/null @@ -1,922 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_adc.c - * @author MCD Application Team - * @brief ADC LL module driver - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -#if defined(USE_FULL_LL_DRIVER) - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_ll_adc.h" -#include "stm32f4xx_ll_bus.h" - -#ifdef USE_FULL_ASSERT -#include "stm32_assert.h" -#else -#define assert_param(expr) ((void)0U) -#endif - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (ADC1) || defined (ADC2) || defined (ADC3) - -/** @addtogroup ADC_LL ADC - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ - -/** @addtogroup ADC_LL_Private_Macros - * @{ - */ - -/* Check of parameters for configuration of ADC hierarchical scope: */ -/* common to several ADC instances. */ -#define IS_LL_ADC_COMMON_CLOCK(__CLOCK__) \ - ( ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV2) \ - || ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV4) \ - || ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV6) \ - || ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV8) \ - ) - -/* Check of parameters for configuration of ADC hierarchical scope: */ -/* ADC instance. */ -#define IS_LL_ADC_RESOLUTION(__RESOLUTION__) \ - ( ((__RESOLUTION__) == LL_ADC_RESOLUTION_12B) \ - || ((__RESOLUTION__) == LL_ADC_RESOLUTION_10B) \ - || ((__RESOLUTION__) == LL_ADC_RESOLUTION_8B) \ - || ((__RESOLUTION__) == LL_ADC_RESOLUTION_6B) \ - ) - -#define IS_LL_ADC_DATA_ALIGN(__DATA_ALIGN__) \ - ( ((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_RIGHT) \ - || ((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_LEFT) \ - ) - -#define IS_LL_ADC_SCAN_SELECTION(__SCAN_SELECTION__) \ - ( ((__SCAN_SELECTION__) == LL_ADC_SEQ_SCAN_DISABLE) \ - || ((__SCAN_SELECTION__) == LL_ADC_SEQ_SCAN_ENABLE) \ - ) - -#define IS_LL_ADC_SEQ_SCAN_MODE(__SEQ_SCAN_MODE__) \ - ( ((__SCAN_MODE__) == LL_ADC_SEQ_SCAN_DISABLE) \ - || ((__SCAN_MODE__) == LL_ADC_SEQ_SCAN_ENABLE) \ - ) - -/* Check of parameters for configuration of ADC hierarchical scope: */ -/* ADC group regular */ -#define IS_LL_ADC_REG_TRIG_SOURCE(__REG_TRIG_SOURCE__) \ - ( ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH1) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH2) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH3) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH2) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH3) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH4) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_TRGO) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_CH1) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_TRGO) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM4_CH4) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM5_CH1) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM5_CH2) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM5_CH3) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM8_CH1) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM8_TRGO) \ - || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_EXTI_LINE11) \ - ) -#define IS_LL_ADC_REG_CONTINUOUS_MODE(__REG_CONTINUOUS_MODE__) \ - ( ((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_SINGLE) \ - || ((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_CONTINUOUS) \ - ) - -#define IS_LL_ADC_REG_DMA_TRANSFER(__REG_DMA_TRANSFER__) \ - ( ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_NONE) \ - || ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_LIMITED) \ - || ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_UNLIMITED) \ - ) - -#define IS_LL_ADC_REG_FLAG_EOC_SELECTION(__REG_FLAG_EOC_SELECTION__) \ - ( ((__REG_FLAG_EOC_SELECTION__) == LL_ADC_REG_FLAG_EOC_SEQUENCE_CONV) \ - || ((__REG_FLAG_EOC_SELECTION__) == LL_ADC_REG_FLAG_EOC_UNITARY_CONV) \ - ) - -#define IS_LL_ADC_REG_SEQ_SCAN_LENGTH(__REG_SEQ_SCAN_LENGTH__) \ - ( ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_DISABLE) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS) \ - || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS) \ - ) - -#define IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(__REG_SEQ_DISCONT_MODE__) \ - ( ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_DISABLE) \ - || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_1RANK) \ - || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_2RANKS) \ - || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_3RANKS) \ - || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_4RANKS) \ - || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_5RANKS) \ - || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_6RANKS) \ - || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_7RANKS) \ - || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_8RANKS) \ - ) - -/* Check of parameters for configuration of ADC hierarchical scope: */ -/* ADC group injected */ -#define IS_LL_ADC_INJ_TRIG_SOURCE(__INJ_TRIG_SOURCE__) \ - ( ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_SOFTWARE) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_CH4) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_TRGO) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_CH1) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_TRGO) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM3_CH2) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM3_CH4) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_CH1) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_CH2) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_CH3) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_TRGO) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM5_CH4) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM5_TRGO) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM8_CH2) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM8_CH3) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM8_CH4) \ - || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_EXTI_LINE15) \ - ) - -#define IS_LL_ADC_INJ_TRIG_EXT_EDGE(__INJ_TRIG_EXT_EDGE__) \ - ( ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_RISING) \ - || ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_FALLING) \ - || ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_RISINGFALLING) \ - ) - -#define IS_LL_ADC_INJ_TRIG_AUTO(__INJ_TRIG_AUTO__) \ - ( ((__INJ_TRIG_AUTO__) == LL_ADC_INJ_TRIG_INDEPENDENT) \ - || ((__INJ_TRIG_AUTO__) == LL_ADC_INJ_TRIG_FROM_GRP_REGULAR) \ - ) - -#define IS_LL_ADC_INJ_SEQ_SCAN_LENGTH(__INJ_SEQ_SCAN_LENGTH__) \ - ( ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_DISABLE) \ - || ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_2RANKS) \ - || ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_3RANKS) \ - || ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_4RANKS) \ - ) - -#define IS_LL_ADC_INJ_SEQ_SCAN_DISCONT_MODE(__INJ_SEQ_DISCONT_MODE__) \ - ( ((__INJ_SEQ_DISCONT_MODE__) == LL_ADC_INJ_SEQ_DISCONT_DISABLE) \ - || ((__INJ_SEQ_DISCONT_MODE__) == LL_ADC_INJ_SEQ_DISCONT_1RANK) \ - ) - -#if defined(ADC_MULTIMODE_SUPPORT) -/* Check of parameters for configuration of ADC hierarchical scope: */ -/* multimode. */ -#if defined(ADC3) -#define IS_LL_ADC_MULTI_MODE(__MULTI_MODE__) \ - ( ((__MULTI_MODE__) == LL_ADC_MULTI_INDEPENDENT) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIMULT) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INTERL) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_SIMULT) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_ALTERN) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_SIM) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_ALT) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INT_INJ_SIM) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_SIM) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_ALT) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_INJ_SIMULT) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_REG_SIMULT) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_REG_INTERL) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_INJ_ALTERN) \ - ) -#else -#define IS_LL_ADC_MULTI_MODE(__MULTI_MODE__) \ - ( ((__MULTI_MODE__) == LL_ADC_MULTI_INDEPENDENT) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIMULT) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INTERL) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_SIMULT) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_ALTERN) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_SIM) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_ALT) \ - || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INT_INJ_SIM) \ - ) -#endif - -#define IS_LL_ADC_MULTI_DMA_TRANSFER(__MULTI_DMA_TRANSFER__) \ - ( ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_EACH_ADC) \ - || ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_LIMIT_1) \ - || ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_LIMIT_2) \ - || ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_LIMIT_3) \ - || ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_UNLMT_1) \ - || ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_UNLMT_2) \ - || ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_UNLMT_3) \ - ) - -#define IS_LL_ADC_MULTI_TWOSMP_DELAY(__MULTI_TWOSMP_DELAY__) \ - ( ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_5CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_6CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_7CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_8CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_9CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_10CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_11CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_12CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_13CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_14CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_15CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_16CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_17CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_18CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_19CYCLES) \ - || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_20CYCLES) \ - ) - -#define IS_LL_ADC_MULTI_MASTER_SLAVE(__MULTI_MASTER_SLAVE__) \ - ( ((__MULTI_MASTER_SLAVE__) == LL_ADC_MULTI_MASTER) \ - || ((__MULTI_MASTER_SLAVE__) == LL_ADC_MULTI_SLAVE) \ - || ((__MULTI_MASTER_SLAVE__) == LL_ADC_MULTI_MASTER_SLAVE) \ - ) - -#endif /* ADC_MULTIMODE_SUPPORT */ -/** - * @} - */ - - -/* Private function prototypes -----------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup ADC_LL_Exported_Functions - * @{ - */ - -/** @addtogroup ADC_LL_EF_Init - * @{ - */ - -/** - * @brief De-initialize registers of all ADC instances belonging to - * the same ADC common instance to their default reset values. - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @retval An ErrorStatus enumeration value: - * - SUCCESS: ADC common registers are de-initialized - * - ERROR: not applicable - */ -ErrorStatus LL_ADC_CommonDeInit(ADC_Common_TypeDef *ADCxy_COMMON) -{ - /* Check the parameters */ - assert_param(IS_ADC_COMMON_INSTANCE(ADCxy_COMMON)); - - - /* Force reset of ADC clock (core clock) */ - LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_ADC); - - /* Release reset of ADC clock (core clock) */ - LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_ADC); - - return SUCCESS; -} - -/** - * @brief Initialize some features of ADC common parameters - * (all ADC instances belonging to the same ADC common instance) - * and multimode (for devices with several ADC instances available). - * @note The setting of ADC common parameters is conditioned to - * ADC instances state: - * All ADC instances belonging to the same ADC common instance - * must be disabled. - * @param ADCxy_COMMON ADC common instance - * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) - * @param ADC_CommonInitStruct Pointer to a @ref LL_ADC_CommonInitTypeDef structure - * @retval An ErrorStatus enumeration value: - * - SUCCESS: ADC common registers are initialized - * - ERROR: ADC common registers are not initialized - */ -ErrorStatus LL_ADC_CommonInit(ADC_Common_TypeDef *ADCxy_COMMON, LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct) -{ - ErrorStatus status = SUCCESS; - - /* Check the parameters */ - assert_param(IS_ADC_COMMON_INSTANCE(ADCxy_COMMON)); - assert_param(IS_LL_ADC_COMMON_CLOCK(ADC_CommonInitStruct->CommonClock)); - -#if defined(ADC_MULTIMODE_SUPPORT) - assert_param(IS_LL_ADC_MULTI_MODE(ADC_CommonInitStruct->Multimode)); - if (ADC_CommonInitStruct->Multimode != LL_ADC_MULTI_INDEPENDENT) - { - assert_param(IS_LL_ADC_MULTI_DMA_TRANSFER(ADC_CommonInitStruct->MultiDMATransfer)); - assert_param(IS_LL_ADC_MULTI_TWOSMP_DELAY(ADC_CommonInitStruct->MultiTwoSamplingDelay)); - } -#endif /* ADC_MULTIMODE_SUPPORT */ - - /* Note: Hardware constraint (refer to description of functions */ - /* "LL_ADC_SetCommonXXX()" and "LL_ADC_SetMultiXXX()"): */ - /* On this STM32 series, setting of these features is conditioned to */ - /* ADC state: */ - /* All ADC instances of the ADC common group must be disabled. */ - if (__LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(ADCxy_COMMON) == 0UL) - { - /* Configuration of ADC hierarchical scope: */ - /* - common to several ADC */ - /* (all ADC instances belonging to the same ADC common instance) */ - /* - Set ADC clock (conversion clock) */ - /* - multimode (if several ADC instances available on the */ - /* selected device) */ - /* - Set ADC multimode configuration */ - /* - Set ADC multimode DMA transfer */ - /* - Set ADC multimode: delay between 2 sampling phases */ -#if defined(ADC_MULTIMODE_SUPPORT) - if (ADC_CommonInitStruct->Multimode != LL_ADC_MULTI_INDEPENDENT) - { - MODIFY_REG(ADCxy_COMMON->CCR, - ADC_CCR_ADCPRE - | ADC_CCR_MULTI - | ADC_CCR_DMA - | ADC_CCR_DDS - | ADC_CCR_DELAY - , - ADC_CommonInitStruct->CommonClock - | ADC_CommonInitStruct->Multimode - | ADC_CommonInitStruct->MultiDMATransfer - | ADC_CommonInitStruct->MultiTwoSamplingDelay - ); - } - else - { - MODIFY_REG(ADCxy_COMMON->CCR, - ADC_CCR_ADCPRE - | ADC_CCR_MULTI - | ADC_CCR_DMA - | ADC_CCR_DDS - | ADC_CCR_DELAY - , - ADC_CommonInitStruct->CommonClock - | LL_ADC_MULTI_INDEPENDENT - ); - } -#else - LL_ADC_SetCommonClock(ADCxy_COMMON, ADC_CommonInitStruct->CommonClock); -#endif - } - else - { - /* Initialization error: One or several ADC instances belonging to */ - /* the same ADC common instance are not disabled. */ - status = ERROR; - } - - return status; -} - -/** - * @brief Set each @ref LL_ADC_CommonInitTypeDef field to default value. - * @param ADC_CommonInitStruct Pointer to a @ref LL_ADC_CommonInitTypeDef structure - * whose fields will be set to default values. - * @retval None - */ -void LL_ADC_CommonStructInit(LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct) -{ - /* Set ADC_CommonInitStruct fields to default values */ - /* Set fields of ADC common */ - /* (all ADC instances belonging to the same ADC common instance) */ - ADC_CommonInitStruct->CommonClock = LL_ADC_CLOCK_SYNC_PCLK_DIV2; - -#if defined(ADC_MULTIMODE_SUPPORT) - /* Set fields of ADC multimode */ - ADC_CommonInitStruct->Multimode = LL_ADC_MULTI_INDEPENDENT; - ADC_CommonInitStruct->MultiDMATransfer = LL_ADC_MULTI_REG_DMA_EACH_ADC; - ADC_CommonInitStruct->MultiTwoSamplingDelay = LL_ADC_MULTI_TWOSMP_DELAY_5CYCLES; -#endif /* ADC_MULTIMODE_SUPPORT */ -} - -/** - * @brief De-initialize registers of the selected ADC instance - * to their default reset values. - * @note To reset all ADC instances quickly (perform a hard reset), - * use function @ref LL_ADC_CommonDeInit(). - * @param ADCx ADC instance - * @retval An ErrorStatus enumeration value: - * - SUCCESS: ADC registers are de-initialized - * - ERROR: ADC registers are not de-initialized - */ -ErrorStatus LL_ADC_DeInit(ADC_TypeDef *ADCx) -{ - ErrorStatus status = SUCCESS; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_INSTANCE(ADCx)); - - /* Disable ADC instance if not already disabled. */ - if (LL_ADC_IsEnabled(ADCx) == 1UL) - { - /* Set ADC group regular trigger source to SW start to ensure to not */ - /* have an external trigger event occurring during the conversion stop */ - /* ADC disable process. */ - LL_ADC_REG_SetTriggerSource(ADCx, LL_ADC_REG_TRIG_SOFTWARE); - - /* Set ADC group injected trigger source to SW start to ensure to not */ - /* have an external trigger event occurring during the conversion stop */ - /* ADC disable process. */ - LL_ADC_INJ_SetTriggerSource(ADCx, LL_ADC_INJ_TRIG_SOFTWARE); - - /* Disable the ADC instance */ - LL_ADC_Disable(ADCx); - } - - /* Check whether ADC state is compliant with expected state */ - /* (hardware requirements of bits state to reset registers below) */ - if (READ_BIT(ADCx->CR2, ADC_CR2_ADON) == 0UL) - { - /* ========== Reset ADC registers ========== */ - /* Reset register SR */ - CLEAR_BIT(ADCx->SR, - (LL_ADC_FLAG_STRT - | LL_ADC_FLAG_JSTRT - | LL_ADC_FLAG_EOCS - | LL_ADC_FLAG_OVR - | LL_ADC_FLAG_JEOS - | LL_ADC_FLAG_AWD1) - ); - - /* Reset register CR1 */ - CLEAR_BIT(ADCx->CR1, - (ADC_CR1_OVRIE | ADC_CR1_RES | ADC_CR1_AWDEN - | ADC_CR1_JAWDEN - | ADC_CR1_DISCNUM | ADC_CR1_JDISCEN | ADC_CR1_DISCEN - | ADC_CR1_JAUTO | ADC_CR1_AWDSGL | ADC_CR1_SCAN - | ADC_CR1_JEOCIE | ADC_CR1_AWDIE | ADC_CR1_EOCIE - | ADC_CR1_AWDCH) - ); - - /* Reset register CR2 */ - CLEAR_BIT(ADCx->CR2, - (ADC_CR2_SWSTART | ADC_CR2_EXTEN | ADC_CR2_EXTSEL - | ADC_CR2_JSWSTART | ADC_CR2_JEXTEN | ADC_CR2_JEXTSEL - | ADC_CR2_ALIGN | ADC_CR2_EOCS - | ADC_CR2_DDS | ADC_CR2_DMA - | ADC_CR2_CONT | ADC_CR2_ADON) - ); - - /* Reset register SMPR1 */ - CLEAR_BIT(ADCx->SMPR1, - (ADC_SMPR1_SMP18 | ADC_SMPR1_SMP17 | ADC_SMPR1_SMP16 - | ADC_SMPR1_SMP15 | ADC_SMPR1_SMP14 | ADC_SMPR1_SMP13 - | ADC_SMPR1_SMP12 | ADC_SMPR1_SMP11 | ADC_SMPR1_SMP10) - ); - - /* Reset register SMPR2 */ - CLEAR_BIT(ADCx->SMPR2, - (ADC_SMPR2_SMP9 - | ADC_SMPR2_SMP8 | ADC_SMPR2_SMP7 | ADC_SMPR2_SMP6 - | ADC_SMPR2_SMP5 | ADC_SMPR2_SMP4 | ADC_SMPR2_SMP3 - | ADC_SMPR2_SMP2 | ADC_SMPR2_SMP1 | ADC_SMPR2_SMP0) - ); - - /* Reset register JOFR1 */ - CLEAR_BIT(ADCx->JOFR1, ADC_JOFR1_JOFFSET1); - /* Reset register JOFR2 */ - CLEAR_BIT(ADCx->JOFR2, ADC_JOFR2_JOFFSET2); - /* Reset register JOFR3 */ - CLEAR_BIT(ADCx->JOFR3, ADC_JOFR3_JOFFSET3); - /* Reset register JOFR4 */ - CLEAR_BIT(ADCx->JOFR4, ADC_JOFR4_JOFFSET4); - - /* Reset register HTR */ - SET_BIT(ADCx->HTR, ADC_HTR_HT); - /* Reset register LTR */ - CLEAR_BIT(ADCx->LTR, ADC_LTR_LT); - - /* Reset register SQR1 */ - CLEAR_BIT(ADCx->SQR1, - (ADC_SQR1_L - | ADC_SQR1_SQ16 - | ADC_SQR1_SQ15 | ADC_SQR1_SQ14 | ADC_SQR1_SQ13) - ); - - /* Reset register SQR2 */ - CLEAR_BIT(ADCx->SQR2, - (ADC_SQR2_SQ12 | ADC_SQR2_SQ11 | ADC_SQR2_SQ10 - | ADC_SQR2_SQ9 | ADC_SQR2_SQ8 | ADC_SQR2_SQ7) - ); - - /* Reset register SQR3 */ - CLEAR_BIT(ADCx->SQR3, - (ADC_SQR3_SQ6 | ADC_SQR3_SQ5 | ADC_SQR3_SQ4 - | ADC_SQR3_SQ3 | ADC_SQR3_SQ2 | ADC_SQR3_SQ1) - ); - - /* Reset register JSQR */ - CLEAR_BIT(ADCx->JSQR, - (ADC_JSQR_JL - | ADC_JSQR_JSQ4 | ADC_JSQR_JSQ3 - | ADC_JSQR_JSQ2 | ADC_JSQR_JSQ1) - ); - - /* Reset register DR */ - /* bits in access mode read only, no direct reset applicable */ - - /* Reset registers JDR1, JDR2, JDR3, JDR4 */ - /* bits in access mode read only, no direct reset applicable */ - - /* Reset register CCR */ - CLEAR_BIT(ADC->CCR, ADC_CCR_TSVREFE | ADC_CCR_ADCPRE); - } - - return status; -} - -/** - * @brief Initialize some features of ADC instance. - * @note These parameters have an impact on ADC scope: ADC instance. - * Affects both group regular and group injected (availability - * of ADC group injected depends on STM32 families). - * Refer to corresponding unitary functions into - * @ref ADC_LL_EF_Configuration_ADC_Instance . - * @note The setting of these parameters by function @ref LL_ADC_Init() - * is conditioned to ADC state: - * ADC instance must be disabled. - * This condition is applied to all ADC features, for efficiency - * and compatibility over all STM32 families. However, the different - * features can be set under different ADC state conditions - * (setting possible with ADC enabled without conversion on going, - * ADC enabled with conversion on going, ...) - * Each feature can be updated afterwards with a unitary function - * and potentially with ADC in a different state than disabled, - * refer to description of each function for setting - * conditioned to ADC state. - * @note After using this function, some other features must be configured - * using LL unitary functions. - * The minimum configuration remaining to be done is: - * - Set ADC group regular or group injected sequencer: - * map channel on the selected sequencer rank. - * Refer to function @ref LL_ADC_REG_SetSequencerRanks(). - * - Set ADC channel sampling time - * Refer to function LL_ADC_SetChannelSamplingTime(); - * @param ADCx ADC instance - * @param ADC_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure - * @retval An ErrorStatus enumeration value: - * - SUCCESS: ADC registers are initialized - * - ERROR: ADC registers are not initialized - */ -ErrorStatus LL_ADC_Init(ADC_TypeDef *ADCx, LL_ADC_InitTypeDef *ADC_InitStruct) -{ - ErrorStatus status = SUCCESS; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_INSTANCE(ADCx)); - - assert_param(IS_LL_ADC_RESOLUTION(ADC_InitStruct->Resolution)); - assert_param(IS_LL_ADC_DATA_ALIGN(ADC_InitStruct->DataAlignment)); - assert_param(IS_LL_ADC_SCAN_SELECTION(ADC_InitStruct->SequencersScanMode)); - - /* Note: Hardware constraint (refer to description of this function): */ - /* ADC instance must be disabled. */ - if (LL_ADC_IsEnabled(ADCx) == 0UL) - { - /* Configuration of ADC hierarchical scope: */ - /* - ADC instance */ - /* - Set ADC data resolution */ - /* - Set ADC conversion data alignment */ - MODIFY_REG(ADCx->CR1, - ADC_CR1_RES - | ADC_CR1_SCAN - , - ADC_InitStruct->Resolution - | ADC_InitStruct->SequencersScanMode - ); - - MODIFY_REG(ADCx->CR2, - ADC_CR2_ALIGN - , - ADC_InitStruct->DataAlignment - ); - - } - else - { - /* Initialization error: ADC instance is not disabled. */ - status = ERROR; - } - return status; -} - -/** - * @brief Set each @ref LL_ADC_InitTypeDef field to default value. - * @param ADC_InitStruct Pointer to a @ref LL_ADC_InitTypeDef structure - * whose fields will be set to default values. - * @retval None - */ -void LL_ADC_StructInit(LL_ADC_InitTypeDef *ADC_InitStruct) -{ - /* Set ADC_InitStruct fields to default values */ - /* Set fields of ADC instance */ - ADC_InitStruct->Resolution = LL_ADC_RESOLUTION_12B; - ADC_InitStruct->DataAlignment = LL_ADC_DATA_ALIGN_RIGHT; - - /* Enable scan mode to have a generic behavior with ADC of other */ - /* STM32 families, without this setting available: */ - /* ADC group regular sequencer and ADC group injected sequencer depend */ - /* only of their own configuration. */ - ADC_InitStruct->SequencersScanMode = LL_ADC_SEQ_SCAN_ENABLE; - -} - -/** - * @brief Initialize some features of ADC group regular. - * @note These parameters have an impact on ADC scope: ADC group regular. - * Refer to corresponding unitary functions into - * @ref ADC_LL_EF_Configuration_ADC_Group_Regular - * (functions with prefix "REG"). - * @note The setting of these parameters by function @ref LL_ADC_Init() - * is conditioned to ADC state: - * ADC instance must be disabled. - * This condition is applied to all ADC features, for efficiency - * and compatibility over all STM32 families. However, the different - * features can be set under different ADC state conditions - * (setting possible with ADC enabled without conversion on going, - * ADC enabled with conversion on going, ...) - * Each feature can be updated afterwards with a unitary function - * and potentially with ADC in a different state than disabled, - * refer to description of each function for setting - * conditioned to ADC state. - * @note After using this function, other features must be configured - * using LL unitary functions. - * The minimum configuration remaining to be done is: - * - Set ADC group regular or group injected sequencer: - * map channel on the selected sequencer rank. - * Refer to function @ref LL_ADC_REG_SetSequencerRanks(). - * - Set ADC channel sampling time - * Refer to function LL_ADC_SetChannelSamplingTime(); - * @param ADCx ADC instance - * @param ADC_REG_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure - * @retval An ErrorStatus enumeration value: - * - SUCCESS: ADC registers are initialized - * - ERROR: ADC registers are not initialized - */ -ErrorStatus LL_ADC_REG_Init(ADC_TypeDef *ADCx, LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct) -{ - ErrorStatus status = SUCCESS; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_INSTANCE(ADCx)); - assert_param(IS_LL_ADC_REG_TRIG_SOURCE(ADC_REG_InitStruct->TriggerSource)); - assert_param(IS_LL_ADC_REG_SEQ_SCAN_LENGTH(ADC_REG_InitStruct->SequencerLength)); - if (ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE) - { - assert_param(IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(ADC_REG_InitStruct->SequencerDiscont)); - } - assert_param(IS_LL_ADC_REG_CONTINUOUS_MODE(ADC_REG_InitStruct->ContinuousMode)); - assert_param(IS_LL_ADC_REG_DMA_TRANSFER(ADC_REG_InitStruct->DMATransfer)); - - /* ADC group regular continuous mode and discontinuous mode */ - /* can not be enabled simultenaeously */ - assert_param((ADC_REG_InitStruct->ContinuousMode == LL_ADC_REG_CONV_SINGLE) - || (ADC_REG_InitStruct->SequencerDiscont == LL_ADC_REG_SEQ_DISCONT_DISABLE)); - - /* Note: Hardware constraint (refer to description of this function): */ - /* ADC instance must be disabled. */ - if (LL_ADC_IsEnabled(ADCx) == 0UL) - { - /* Configuration of ADC hierarchical scope: */ - /* - ADC group regular */ - /* - Set ADC group regular trigger source */ - /* - Set ADC group regular sequencer length */ - /* - Set ADC group regular sequencer discontinuous mode */ - /* - Set ADC group regular continuous mode */ - /* - Set ADC group regular conversion data transfer: no transfer or */ - /* transfer by DMA, and DMA requests mode */ - /* Note: On this STM32 series, ADC trigger edge is set when starting */ - /* ADC conversion. */ - /* Refer to function @ref LL_ADC_REG_StartConversionExtTrig(). */ - if (ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE) - { - MODIFY_REG(ADCx->CR1, - ADC_CR1_DISCEN - | ADC_CR1_DISCNUM - , - ADC_REG_InitStruct->SequencerDiscont - ); - } - else - { - MODIFY_REG(ADCx->CR1, - ADC_CR1_DISCEN - | ADC_CR1_DISCNUM - , - LL_ADC_REG_SEQ_DISCONT_DISABLE - ); - } - - MODIFY_REG(ADCx->CR2, - ADC_CR2_EXTSEL - | ADC_CR2_EXTEN - | ADC_CR2_CONT - | ADC_CR2_DMA - | ADC_CR2_DDS - , - (ADC_REG_InitStruct->TriggerSource & ADC_CR2_EXTSEL) - | ADC_REG_InitStruct->ContinuousMode - | ADC_REG_InitStruct->DMATransfer - ); - - /* Set ADC group regular sequencer length and scan direction */ - /* Note: Hardware constraint (refer to description of this function): */ - /* Note: If ADC instance feature scan mode is disabled */ - /* (refer to ADC instance initialization structure */ - /* parameter @ref SequencersScanMode */ - /* or function @ref LL_ADC_SetSequencersScanMode() ), */ - /* this parameter is discarded. */ - LL_ADC_REG_SetSequencerLength(ADCx, ADC_REG_InitStruct->SequencerLength); - } - else - { - /* Initialization error: ADC instance is not disabled. */ - status = ERROR; - } - return status; -} - -/** - * @brief Set each @ref LL_ADC_REG_InitTypeDef field to default value. - * @param ADC_REG_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure - * whose fields will be set to default values. - * @retval None - */ -void LL_ADC_REG_StructInit(LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct) -{ - /* Set ADC_REG_InitStruct fields to default values */ - /* Set fields of ADC group regular */ - /* Note: On this STM32 series, ADC trigger edge is set when starting */ - /* ADC conversion. */ - /* Refer to function @ref LL_ADC_REG_StartConversionExtTrig(). */ - ADC_REG_InitStruct->TriggerSource = LL_ADC_REG_TRIG_SOFTWARE; - ADC_REG_InitStruct->SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE; - ADC_REG_InitStruct->SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE; - ADC_REG_InitStruct->ContinuousMode = LL_ADC_REG_CONV_SINGLE; - ADC_REG_InitStruct->DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE; -} - -/** - * @brief Initialize some features of ADC group injected. - * @note These parameters have an impact on ADC scope: ADC group injected. - * Refer to corresponding unitary functions into - * @ref ADC_LL_EF_Configuration_ADC_Group_Regular - * (functions with prefix "INJ"). - * @note The setting of these parameters by function @ref LL_ADC_Init() - * is conditioned to ADC state: - * ADC instance must be disabled. - * This condition is applied to all ADC features, for efficiency - * and compatibility over all STM32 families. However, the different - * features can be set under different ADC state conditions - * (setting possible with ADC enabled without conversion on going, - * ADC enabled with conversion on going, ...) - * Each feature can be updated afterwards with a unitary function - * and potentially with ADC in a different state than disabled, - * refer to description of each function for setting - * conditioned to ADC state. - * @note After using this function, other features must be configured - * using LL unitary functions. - * The minimum configuration remaining to be done is: - * - Set ADC group injected sequencer: - * map channel on the selected sequencer rank. - * Refer to function @ref LL_ADC_INJ_SetSequencerRanks(). - * - Set ADC channel sampling time - * Refer to function LL_ADC_SetChannelSamplingTime(); - * @param ADCx ADC instance - * @param ADC_INJ_InitStruct Pointer to a @ref LL_ADC_INJ_InitTypeDef structure - * @retval An ErrorStatus enumeration value: - * - SUCCESS: ADC registers are initialized - * - ERROR: ADC registers are not initialized - */ -ErrorStatus LL_ADC_INJ_Init(ADC_TypeDef *ADCx, LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct) -{ - ErrorStatus status = SUCCESS; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_INSTANCE(ADCx)); - assert_param(IS_LL_ADC_INJ_TRIG_SOURCE(ADC_INJ_InitStruct->TriggerSource)); - assert_param(IS_LL_ADC_INJ_SEQ_SCAN_LENGTH(ADC_INJ_InitStruct->SequencerLength)); - if (ADC_INJ_InitStruct->SequencerLength != LL_ADC_INJ_SEQ_SCAN_DISABLE) - { - assert_param(IS_LL_ADC_INJ_SEQ_SCAN_DISCONT_MODE(ADC_INJ_InitStruct->SequencerDiscont)); - } - assert_param(IS_LL_ADC_INJ_TRIG_AUTO(ADC_INJ_InitStruct->TrigAuto)); - - /* Note: Hardware constraint (refer to description of this function): */ - /* ADC instance must be disabled. */ - if (LL_ADC_IsEnabled(ADCx) == 0UL) - { - /* Configuration of ADC hierarchical scope: */ - /* - ADC group injected */ - /* - Set ADC group injected trigger source */ - /* - Set ADC group injected sequencer length */ - /* - Set ADC group injected sequencer discontinuous mode */ - /* - Set ADC group injected conversion trigger: independent or */ - /* from ADC group regular */ - /* Note: On this STM32 series, ADC trigger edge is set when starting */ - /* ADC conversion. */ - /* Refer to function @ref LL_ADC_INJ_StartConversionExtTrig(). */ - if (ADC_INJ_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE) - { - MODIFY_REG(ADCx->CR1, - ADC_CR1_JDISCEN - | ADC_CR1_JAUTO - , - ADC_INJ_InitStruct->SequencerDiscont - | ADC_INJ_InitStruct->TrigAuto - ); - } - else - { - MODIFY_REG(ADCx->CR1, - ADC_CR1_JDISCEN - | ADC_CR1_JAUTO - , - LL_ADC_REG_SEQ_DISCONT_DISABLE - | ADC_INJ_InitStruct->TrigAuto - ); - } - - MODIFY_REG(ADCx->CR2, - ADC_CR2_JEXTSEL - | ADC_CR2_JEXTEN - , - (ADC_INJ_InitStruct->TriggerSource & ADC_CR2_JEXTSEL) - ); - - /* Note: Hardware constraint (refer to description of this function): */ - /* Note: If ADC instance feature scan mode is disabled */ - /* (refer to ADC instance initialization structure */ - /* parameter @ref SequencersScanMode */ - /* or function @ref LL_ADC_SetSequencersScanMode() ), */ - /* this parameter is discarded. */ - LL_ADC_INJ_SetSequencerLength(ADCx, ADC_INJ_InitStruct->SequencerLength); - } - else - { - /* Initialization error: ADC instance is not disabled. */ - status = ERROR; - } - return status; -} - -/** - * @brief Set each @ref LL_ADC_INJ_InitTypeDef field to default value. - * @param ADC_INJ_InitStruct Pointer to a @ref LL_ADC_INJ_InitTypeDef structure - * whose fields will be set to default values. - * @retval None - */ -void LL_ADC_INJ_StructInit(LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct) -{ - /* Set ADC_INJ_InitStruct fields to default values */ - /* Set fields of ADC group injected */ - ADC_INJ_InitStruct->TriggerSource = LL_ADC_INJ_TRIG_SOFTWARE; - ADC_INJ_InitStruct->SequencerLength = LL_ADC_INJ_SEQ_SCAN_DISABLE; - ADC_INJ_InitStruct->SequencerDiscont = LL_ADC_INJ_SEQ_DISCONT_DISABLE; - ADC_INJ_InitStruct->TrigAuto = LL_ADC_INJ_TRIG_INDEPENDENT; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* ADC1 || ADC2 || ADC3 */ - -/** - * @} - */ - -#endif /* USE_FULL_LL_DRIVER */ - diff --git a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c b/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c deleted file mode 100644 index 40b6d83..0000000 --- a/software/Power_Pico/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c +++ /dev/null @@ -1,2316 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_usb.c - * @author MCD Application Team - * @brief USB Low Layer HAL module driver. - * - * This file provides firmware functions to manage the following - * functionalities of the USB Peripheral Controller: - * + Initialization/de-initialization functions - * + I/O operation functions - * + Peripheral Control functions - * + Peripheral State functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Fill parameters of Init structure in USB_CfgTypeDef structure. - - (#) Call USB_CoreInit() API to initialize the USB Core peripheral. - - (#) The upper HAL HCD/PCD driver will call the right routines for its internal processes. - - @endverbatim - - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_LL_USB_DRIVER - * @{ - */ - -#if defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx); - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup USB_LL_Exported_Functions USB Low Layer Exported Functions - * @{ - */ - -/** @defgroup USB_LL_Exported_Functions_Group1 Initialization/de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization/de-initialization functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the USB Core - * @param USBx USB Instance - * @param cfg pointer to a USB_OTG_CfgTypeDef structure that contains - * the configuration information for the specified USBx peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) -{ - HAL_StatusTypeDef ret; - if (cfg.phy_itface == USB_OTG_ULPI_PHY) - { - USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN); - - /* Init The ULPI Interface */ - USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL); - - /* Select vbus source */ - USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); - if (cfg.use_external_vbus == 1U) - { - USBx->GUSBCFG |= USB_OTG_GUSBCFG_ULPIEVBUSD; - } - - /* Reset after a PHY select */ - ret = USB_CoreReset(USBx); - } - else /* FS interface (embedded Phy) */ - { - /* Select FS Embedded PHY */ - USBx->GUSBCFG |= USB_OTG_GUSBCFG_PHYSEL; - - /* Reset after a PHY select */ - ret = USB_CoreReset(USBx); - - if (cfg.battery_charging_enable == 0U) - { - /* Activate the USB Transceiver */ - USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN; - } - else - { - /* Deactivate the USB Transceiver */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN); - } - } - - if (cfg.dma_enable == 1U) - { - USBx->GAHBCFG |= USB_OTG_GAHBCFG_HBSTLEN_2; - USBx->GAHBCFG |= USB_OTG_GAHBCFG_DMAEN; - } - - return ret; -} - - -/** - * @brief Set the USB turnaround time - * @param USBx USB Instance - * @param hclk: AHB clock frequency - * @retval USB turnaround time In PHY Clocks number - */ -HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, - uint32_t hclk, uint8_t speed) -{ - uint32_t UsbTrd; - - /* The USBTRD is configured according to the tables below, depending on AHB frequency - used by application. In the low AHB frequency range it is used to stretch enough the USB response - time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access - latency to the Data FIFO */ - if (speed == USBD_FS_SPEED) - { - if ((hclk >= 14200000U) && (hclk < 15000000U)) - { - /* hclk Clock Range between 14.2-15 MHz */ - UsbTrd = 0xFU; - } - else if ((hclk >= 15000000U) && (hclk < 16000000U)) - { - /* hclk Clock Range between 15-16 MHz */ - UsbTrd = 0xEU; - } - else if ((hclk >= 16000000U) && (hclk < 17200000U)) - { - /* hclk Clock Range between 16-17.2 MHz */ - UsbTrd = 0xDU; - } - else if ((hclk >= 17200000U) && (hclk < 18500000U)) - { - /* hclk Clock Range between 17.2-18.5 MHz */ - UsbTrd = 0xCU; - } - else if ((hclk >= 18500000U) && (hclk < 20000000U)) - { - /* hclk Clock Range between 18.5-20 MHz */ - UsbTrd = 0xBU; - } - else if ((hclk >= 20000000U) && (hclk < 21800000U)) - { - /* hclk Clock Range between 20-21.8 MHz */ - UsbTrd = 0xAU; - } - else if ((hclk >= 21800000U) && (hclk < 24000000U)) - { - /* hclk Clock Range between 21.8-24 MHz */ - UsbTrd = 0x9U; - } - else if ((hclk >= 24000000U) && (hclk < 27700000U)) - { - /* hclk Clock Range between 24-27.7 MHz */ - UsbTrd = 0x8U; - } - else if ((hclk >= 27700000U) && (hclk < 32000000U)) - { - /* hclk Clock Range between 27.7-32 MHz */ - UsbTrd = 0x7U; - } - else /* if(hclk >= 32000000) */ - { - /* hclk Clock Range between 32-200 MHz */ - UsbTrd = 0x6U; - } - } - else if (speed == USBD_HS_SPEED) - { - UsbTrd = USBD_HS_TRDT_VALUE; - } - else - { - UsbTrd = USBD_DEFAULT_TRDT_VALUE; - } - - USBx->GUSBCFG &= ~USB_OTG_GUSBCFG_TRDT; - USBx->GUSBCFG |= (uint32_t)((UsbTrd << 10) & USB_OTG_GUSBCFG_TRDT); - - return HAL_OK; -} - -/** - * @brief USB_EnableGlobalInt - * Enables the controller's Global Int in the AHB Config reg - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx) -{ - USBx->GAHBCFG |= USB_OTG_GAHBCFG_GINT; - return HAL_OK; -} - -/** - * @brief USB_DisableGlobalInt - * Disable the controller's Global Int in the AHB Config reg - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx) -{ - USBx->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT; - return HAL_OK; -} - -/** - * @brief USB_SetCurrentMode Set functional mode - * @param USBx Selected device - * @param mode current core mode - * This parameter can be one of these values: - * @arg USB_DEVICE_MODE Peripheral mode - * @arg USB_HOST_MODE Host mode - * @retval HAL status - */ -HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx, USB_OTG_ModeTypeDef mode) -{ - uint32_t ms = 0U; - - USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_FHMOD | USB_OTG_GUSBCFG_FDMOD); - - if (mode == USB_HOST_MODE) - { - USBx->GUSBCFG |= USB_OTG_GUSBCFG_FHMOD; - - do - { - HAL_Delay(10U); - ms += 10U; - } while ((USB_GetMode(USBx) != (uint32_t)USB_HOST_MODE) && (ms < HAL_USB_CURRENT_MODE_MAX_DELAY_MS)); - } - else if (mode == USB_DEVICE_MODE) - { - USBx->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD; - - do - { - HAL_Delay(10U); - ms += 10U; - } while ((USB_GetMode(USBx) != (uint32_t)USB_DEVICE_MODE) && (ms < HAL_USB_CURRENT_MODE_MAX_DELAY_MS)); - } - else - { - return HAL_ERROR; - } - - if (ms == HAL_USB_CURRENT_MODE_MAX_DELAY_MS) - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief USB_DevInit Initializes the USB_OTG controller registers - * for device mode - * @param USBx Selected device - * @param cfg pointer to a USB_OTG_CfgTypeDef structure that contains - * the configuration information for the specified USBx peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) -{ - HAL_StatusTypeDef ret = HAL_OK; - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t i; - - for (i = 0U; i < 15U; i++) - { - USBx->DIEPTXF[i] = 0U; - } - -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \ - || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \ - || defined(STM32F423xx) - /* VBUS Sensing setup */ - if (cfg.vbus_sensing_enable == 0U) - { - USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS; - - /* Deactivate VBUS Sensing B */ - USBx->GCCFG &= ~USB_OTG_GCCFG_VBDEN; - - /* B-peripheral session valid override enable */ - USBx->GOTGCTL |= USB_OTG_GOTGCTL_BVALOEN; - USBx->GOTGCTL |= USB_OTG_GOTGCTL_BVALOVAL; - } - else - { - /* Enable HW VBUS sensing */ - USBx->GCCFG |= USB_OTG_GCCFG_VBDEN; - } -#else - /* VBUS Sensing setup */ - if (cfg.vbus_sensing_enable == 0U) - { - /* - * Disable HW VBUS sensing. VBUS is internally considered to be always - * at VBUS-Valid level (5V). - */ - USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS; - USBx->GCCFG |= USB_OTG_GCCFG_NOVBUSSENS; - USBx->GCCFG &= ~USB_OTG_GCCFG_VBUSBSEN; - USBx->GCCFG &= ~USB_OTG_GCCFG_VBUSASEN; - } - else - { - /* Enable HW VBUS sensing */ - USBx->GCCFG &= ~USB_OTG_GCCFG_NOVBUSSENS; - USBx->GCCFG |= USB_OTG_GCCFG_VBUSBSEN; - } -#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || - defined(STM32F423xx) */ - - /* Restart the Phy Clock */ - USBx_PCGCCTL = 0U; - - if (cfg.phy_itface == USB_OTG_ULPI_PHY) - { - if (cfg.speed == USBD_HS_SPEED) - { - /* Set Core speed to High speed mode */ - (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH); - } - else - { - /* Set Core speed to Full speed mode */ - (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH_IN_FULL); - } - } - else - { - /* Set Core speed to Full speed mode */ - (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_FULL); - } - - /* Flush the FIFOs */ - if (USB_FlushTxFifo(USBx, 0x10U) != HAL_OK) /* all Tx FIFOs */ - { - ret = HAL_ERROR; - } - - if (USB_FlushRxFifo(USBx) != HAL_OK) - { - ret = HAL_ERROR; - } - - /* Clear all pending Device Interrupts */ - USBx_DEVICE->DIEPMSK = 0U; - USBx_DEVICE->DOEPMSK = 0U; - USBx_DEVICE->DAINTMSK = 0U; - - for (i = 0U; i < cfg.dev_endpoints; i++) - { - if ((USBx_INEP(i)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) - { - if (i == 0U) - { - USBx_INEP(i)->DIEPCTL = USB_OTG_DIEPCTL_SNAK; - } - else - { - USBx_INEP(i)->DIEPCTL = USB_OTG_DIEPCTL_EPDIS | USB_OTG_DIEPCTL_SNAK; - } - } - else - { - USBx_INEP(i)->DIEPCTL = 0U; - } - - USBx_INEP(i)->DIEPTSIZ = 0U; - USBx_INEP(i)->DIEPINT = 0xFB7FU; - } - - for (i = 0U; i < cfg.dev_endpoints; i++) - { - if ((USBx_OUTEP(i)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) - { - if (i == 0U) - { - USBx_OUTEP(i)->DOEPCTL = USB_OTG_DOEPCTL_SNAK; - } - else - { - USBx_OUTEP(i)->DOEPCTL = USB_OTG_DOEPCTL_EPDIS | USB_OTG_DOEPCTL_SNAK; - } - } - else - { - USBx_OUTEP(i)->DOEPCTL = 0U; - } - - USBx_OUTEP(i)->DOEPTSIZ = 0U; - USBx_OUTEP(i)->DOEPINT = 0xFB7FU; - } - - USBx_DEVICE->DIEPMSK &= ~(USB_OTG_DIEPMSK_TXFURM); - - /* Disable all interrupts. */ - USBx->GINTMSK = 0U; - - /* Clear any pending interrupts */ - USBx->GINTSTS = 0xBFFFFFFFU; - - /* Enable the common interrupts */ - if (cfg.dma_enable == 0U) - { - USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM; - } - - /* Enable interrupts matching to the Device mode ONLY */ - USBx->GINTMSK |= USB_OTG_GINTMSK_USBSUSPM | USB_OTG_GINTMSK_USBRST | - USB_OTG_GINTMSK_ENUMDNEM | USB_OTG_GINTMSK_IEPINT | - USB_OTG_GINTMSK_OEPINT | USB_OTG_GINTMSK_IISOIXFRM | - USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM; - - if (cfg.Sof_enable != 0U) - { - USBx->GINTMSK |= USB_OTG_GINTMSK_SOFM; - } - - if (cfg.vbus_sensing_enable == 1U) - { - USBx->GINTMSK |= (USB_OTG_GINTMSK_SRQIM | USB_OTG_GINTMSK_OTGINT); - } - - return ret; -} - -/** - * @brief USB_FlushTxFifo Flush a Tx FIFO - * @param USBx Selected device - * @param num FIFO number - * This parameter can be a value from 1 to 15 - 15 means Flush all Tx FIFOs - * @retval HAL status - */ -HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num) -{ - __IO uint32_t count = 0U; - - /* Wait for AHB master IDLE state. */ - do - { - count++; - - if (count > HAL_USB_TIMEOUT) - { - return HAL_TIMEOUT; - } - } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); - - /* Flush TX Fifo */ - count = 0U; - USBx->GRSTCTL = (USB_OTG_GRSTCTL_TXFFLSH | (num << 6)); - - do - { - count++; - - if (count > HAL_USB_TIMEOUT) - { - return HAL_TIMEOUT; - } - } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH); - - return HAL_OK; -} - -/** - * @brief USB_FlushRxFifo Flush Rx FIFO - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx) -{ - __IO uint32_t count = 0U; - - /* Wait for AHB master IDLE state. */ - do - { - count++; - - if (count > HAL_USB_TIMEOUT) - { - return HAL_TIMEOUT; - } - } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); - - /* Flush RX Fifo */ - count = 0U; - USBx->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH; - - do - { - count++; - - if (count > HAL_USB_TIMEOUT) - { - return HAL_TIMEOUT; - } - } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH); - - return HAL_OK; -} - -/** - * @brief USB_SetDevSpeed Initializes the DevSpd field of DCFG register - * depending the PHY type and the enumeration speed of the device. - * @param USBx Selected device - * @param speed device speed - * This parameter can be one of these values: - * @arg USB_OTG_SPEED_HIGH: High speed mode - * @arg USB_OTG_SPEED_HIGH_IN_FULL: High speed core in Full Speed mode - * @arg USB_OTG_SPEED_FULL: Full speed mode - * @retval Hal status - */ -HAL_StatusTypeDef USB_SetDevSpeed(const USB_OTG_GlobalTypeDef *USBx, uint8_t speed) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - USBx_DEVICE->DCFG |= speed; - return HAL_OK; -} - -/** - * @brief USB_GetDevSpeed Return the Dev Speed - * @param USBx Selected device - * @retval speed device speed - * This parameter can be one of these values: - * @arg USBD_HS_SPEED: High speed mode - * @arg USBD_FS_SPEED: Full speed mode - */ -uint8_t USB_GetDevSpeed(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint8_t speed; - uint32_t DevEnumSpeed = USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD; - - if (DevEnumSpeed == DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ) - { - speed = USBD_HS_SPEED; - } - else if ((DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ) || - (DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_48MHZ)) - { - speed = USBD_FS_SPEED; - } - else - { - speed = 0xFU; - } - - return speed; -} - -/** - * @brief Activate and configure an endpoint - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_ActivateEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - - if (ep->is_in == 1U) - { - USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK)); - - if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_USBAEP) == 0U) - { - USBx_INEP(epnum)->DIEPCTL |= (ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ) | - ((uint32_t)ep->type << 18) | (epnum << 22) | - USB_OTG_DIEPCTL_SD0PID_SEVNFRM | - USB_OTG_DIEPCTL_USBAEP; - } - } - else - { - USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16); - - if (((USBx_OUTEP(epnum)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0U) - { - USBx_OUTEP(epnum)->DOEPCTL |= (ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ) | - ((uint32_t)ep->type << 18) | - USB_OTG_DIEPCTL_SD0PID_SEVNFRM | - USB_OTG_DOEPCTL_USBAEP; - } - } - return HAL_OK; -} - -/** - * @brief Activate and configure a dedicated endpoint - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - - /* Read DEPCTLn register */ - if (ep->is_in == 1U) - { - if (((USBx_INEP(epnum)->DIEPCTL) & USB_OTG_DIEPCTL_USBAEP) == 0U) - { - USBx_INEP(epnum)->DIEPCTL |= (ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ) | - ((uint32_t)ep->type << 18) | (epnum << 22) | - USB_OTG_DIEPCTL_SD0PID_SEVNFRM | - USB_OTG_DIEPCTL_USBAEP; - } - - USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK)); - } - else - { - if (((USBx_OUTEP(epnum)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0U) - { - USBx_OUTEP(epnum)->DOEPCTL |= (ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ) | - ((uint32_t)ep->type << 18) | (epnum << 22) | - USB_OTG_DOEPCTL_USBAEP; - } - - USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16); - } - - return HAL_OK; -} - -/** - * @brief De-activate and de-initialize an endpoint - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_DeactivateEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - - /* Read DEPCTLn register */ - if (ep->is_in == 1U) - { - if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; - } - - USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); - USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_USBAEP | - USB_OTG_DIEPCTL_MPSIZ | - USB_OTG_DIEPCTL_TXFNUM | - USB_OTG_DIEPCTL_SD0PID_SEVNFRM | - USB_OTG_DIEPCTL_EPTYP); - } - else - { - if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) - { - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; - } - - USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); - USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_USBAEP | - USB_OTG_DOEPCTL_MPSIZ | - USB_OTG_DOEPCTL_SD0PID_SEVNFRM | - USB_OTG_DOEPCTL_EPTYP); - } - - return HAL_OK; -} - -/** - * @brief De-activate and de-initialize a dedicated endpoint - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - - /* Read DEPCTLn register */ - if (ep->is_in == 1U) - { - if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; - } - - USBx_INEP(epnum)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP; - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); - } - else - { - if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) - { - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; - } - - USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); - } - - return HAL_OK; -} - -/** - * @brief USB_EPStartXfer : setup and starts a transfer over an EP - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @param dma USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @retval HAL status - */ -HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep, uint8_t dma) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - uint16_t pktcnt; - - /* IN endpoint */ - if (ep->is_in == 1U) - { - /* Zero Length Packet? */ - if (ep->xfer_len == 0U) - { - USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); - USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); - USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); - } - else - { - /* Program the transfer size and packet count - * as follows: xfersize = N * maxpacket + - * short_packet pktcnt = N + (short_packet - * exist ? 1 : 0) - */ - USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); - USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); - - if (epnum == 0U) - { - if (ep->xfer_len > ep->maxpacket) - { - ep->xfer_len = ep->maxpacket; - } - - USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); - } - else - { - pktcnt = (uint16_t)((ep->xfer_len + ep->maxpacket - 1U) / ep->maxpacket); - USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (pktcnt << 19)); - - if (ep->type == EP_TYPE_ISOC) - { - USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_MULCNT); - USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & (pktcnt << 29)); - } - } - - USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len); - } - - if (dma == 1U) - { - if ((uint32_t)ep->dma_addr != 0U) - { - USBx_INEP(epnum)->DIEPDMA = (uint32_t)(ep->dma_addr); - } - - if (ep->type == EP_TYPE_ISOC) - { - if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; - } - else - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; - } - } - - /* EP enable, IN data in FIFO */ - USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); - } - else - { - /* EP enable, IN data in FIFO */ - USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); - - if (ep->type != EP_TYPE_ISOC) - { - /* Enable the Tx FIFO Empty Interrupt for this EP */ - if (ep->xfer_len > 0U) - { - USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK); - } - } - else - { - if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; - } - else - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; - } - - (void)USB_WritePacket(USBx, ep->xfer_buff, ep->num, (uint16_t)ep->xfer_len, dma); - } - } - } - else /* OUT endpoint */ - { - /* Program the transfer size and packet count as follows: - * pktcnt = N - * xfersize = N * maxpacket - */ - USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ); - USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT); - - if (epnum == 0U) - { - if (ep->xfer_len > 0U) - { - ep->xfer_len = ep->maxpacket; - } - - /* Store transfer size, for EP0 this is equal to endpoint max packet size */ - ep->xfer_size = ep->maxpacket; - - USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & ep->xfer_size); - USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); - } - else - { - if (ep->xfer_len == 0U) - { - USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & ep->maxpacket); - USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); - } - else - { - pktcnt = (uint16_t)((ep->xfer_len + ep->maxpacket - 1U) / ep->maxpacket); - ep->xfer_size = ep->maxpacket * pktcnt; - - USBx_OUTEP(epnum)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_PKTCNT & ((uint32_t)pktcnt << 19); - USBx_OUTEP(epnum)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_XFRSIZ & ep->xfer_size; - } - } - - if (dma == 1U) - { - if ((uint32_t)ep->xfer_buff != 0U) - { - USBx_OUTEP(epnum)->DOEPDMA = (uint32_t)(ep->xfer_buff); - } - } - - if (ep->type == EP_TYPE_ISOC) - { - if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) - { - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SODDFRM; - } - else - { - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; - } - } - /* EP enable */ - USBx_OUTEP(epnum)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA); - } - - return HAL_OK; -} - - -/** - * @brief USB_EPStoptXfer Stop transfer on an EP - * @param USBx usb device instance - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_EPStopXfer(const USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) -{ - __IO uint32_t count = 0U; - HAL_StatusTypeDef ret = HAL_OK; - uint32_t USBx_BASE = (uint32_t)USBx; - - /* IN endpoint */ - if (ep->is_in == 1U) - { - /* EP enable, IN data in FIFO */ - if (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) - { - USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_SNAK); - USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_EPDIS); - - do - { - count++; - - if (count > 10000U) - { - ret = HAL_ERROR; - break; - } - } while (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA); - } - } - else /* OUT endpoint */ - { - if (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) - { - USBx_OUTEP(ep->num)->DOEPCTL |= (USB_OTG_DOEPCTL_SNAK); - USBx_OUTEP(ep->num)->DOEPCTL |= (USB_OTG_DOEPCTL_EPDIS); - - do - { - count++; - - if (count > 10000U) - { - ret = HAL_ERROR; - break; - } - } while (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA); - } - } - - return ret; -} - - -/** - * @brief USB_WritePacket : Writes a packet into the Tx FIFO associated - * with the EP/channel - * @param USBx Selected device - * @param src pointer to source buffer - * @param ch_ep_num endpoint or host channel number - * @param len Number of bytes to write - * @param dma USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @retval HAL status - */ -HAL_StatusTypeDef USB_WritePacket(const USB_OTG_GlobalTypeDef *USBx, uint8_t *src, - uint8_t ch_ep_num, uint16_t len, uint8_t dma) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint8_t *pSrc = src; - uint32_t count32b; - uint32_t i; - - if (dma == 0U) - { - count32b = ((uint32_t)len + 3U) / 4U; - for (i = 0U; i < count32b; i++) - { - USBx_DFIFO((uint32_t)ch_ep_num) = __UNALIGNED_UINT32_READ(pSrc); - pSrc++; - pSrc++; - pSrc++; - pSrc++; - } - } - - return HAL_OK; -} - -/** - * @brief USB_ReadPacket : read a packet from the RX FIFO - * @param USBx Selected device - * @param dest source pointer - * @param len Number of bytes to read - * @retval pointer to destination buffer - */ -void *USB_ReadPacket(const USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint8_t *pDest = dest; - uint32_t pData; - uint32_t i; - uint32_t count32b = (uint32_t)len >> 2U; - uint16_t remaining_bytes = len % 4U; - - for (i = 0U; i < count32b; i++) - { - __UNALIGNED_UINT32_WRITE(pDest, USBx_DFIFO(0U)); - pDest++; - pDest++; - pDest++; - pDest++; - } - - /* When Number of data is not word aligned, read the remaining byte */ - if (remaining_bytes != 0U) - { - i = 0U; - __UNALIGNED_UINT32_WRITE(&pData, USBx_DFIFO(0U)); - - do - { - *(uint8_t *)pDest = (uint8_t)(pData >> (8U * (uint8_t)(i))); - i++; - pDest++; - remaining_bytes--; - } while (remaining_bytes != 0U); - } - - return ((void *)pDest); -} - -/** - * @brief USB_EPSetStall : set a stall condition over an EP - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_EPSetStall(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - - if (ep->is_in == 1U) - { - if (((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == 0U) && (epnum != 0U)) - { - USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_EPDIS); - } - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_STALL; - } - else - { - if (((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == 0U) && (epnum != 0U)) - { - USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_EPDIS); - } - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_STALL; - } - - return HAL_OK; -} - -/** - * @brief USB_EPClearStall : Clear a stall condition over an EP - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_EPClearStall(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - - if (ep->is_in == 1U) - { - USBx_INEP(epnum)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; - if ((ep->type == EP_TYPE_INTR) || (ep->type == EP_TYPE_BULK)) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; /* DATA0 */ - } - } - else - { - USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; - if ((ep->type == EP_TYPE_INTR) || (ep->type == EP_TYPE_BULK)) - { - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; /* DATA0 */ - } - } - return HAL_OK; -} - -/** - * @brief USB_StopDevice : Stop the usb device mode - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx) -{ - HAL_StatusTypeDef ret; - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t i; - - /* Clear Pending interrupt */ - for (i = 0U; i < 15U; i++) - { - USBx_INEP(i)->DIEPINT = 0xFB7FU; - USBx_OUTEP(i)->DOEPINT = 0xFB7FU; - } - - /* Clear interrupt masks */ - USBx_DEVICE->DIEPMSK = 0U; - USBx_DEVICE->DOEPMSK = 0U; - USBx_DEVICE->DAINTMSK = 0U; - - /* Flush the FIFO */ - ret = USB_FlushRxFifo(USBx); - if (ret != HAL_OK) - { - return ret; - } - - ret = USB_FlushTxFifo(USBx, 0x10U); - if (ret != HAL_OK) - { - return ret; - } - - return ret; -} - -/** - * @brief USB_SetDevAddress : Stop the usb device mode - * @param USBx Selected device - * @param address new device address to be assigned - * This parameter can be a value from 0 to 255 - * @retval HAL status - */ -HAL_StatusTypeDef USB_SetDevAddress(const USB_OTG_GlobalTypeDef *USBx, uint8_t address) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - USBx_DEVICE->DCFG &= ~(USB_OTG_DCFG_DAD); - USBx_DEVICE->DCFG |= ((uint32_t)address << 4) & USB_OTG_DCFG_DAD; - - return HAL_OK; -} - -/** - * @brief USB_DevConnect : Connect the USB device by enabling Rpu - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_DevConnect(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - /* In case phy is stopped, ensure to ungate and restore the phy CLK */ - USBx_PCGCCTL &= ~(USB_OTG_PCGCCTL_STOPCLK | USB_OTG_PCGCCTL_GATECLK); - - USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_SDIS; - - return HAL_OK; -} - -/** - * @brief USB_DevDisconnect : Disconnect the USB device by disabling Rpu - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_DevDisconnect(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - /* In case phy is stopped, ensure to ungate and restore the phy CLK */ - USBx_PCGCCTL &= ~(USB_OTG_PCGCCTL_STOPCLK | USB_OTG_PCGCCTL_GATECLK); - - USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS; - - return HAL_OK; -} - -/** - * @brief USB_ReadInterrupts: return the global USB interrupt status - * @param USBx Selected device - * @retval USB Global Interrupt status - */ -uint32_t USB_ReadInterrupts(USB_OTG_GlobalTypeDef const *USBx) -{ - uint32_t tmpreg; - - tmpreg = USBx->GINTSTS; - tmpreg &= USBx->GINTMSK; - - return tmpreg; -} - -/** - * @brief USB_ReadChInterrupts: return USB channel interrupt status - * @param USBx Selected device - * @param chnum Channel number - * @retval USB Channel Interrupt status - */ -uint32_t USB_ReadChInterrupts(const USB_OTG_GlobalTypeDef *USBx, uint8_t chnum) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t tmpreg; - - tmpreg = USBx_HC(chnum)->HCINT; - tmpreg &= USBx_HC(chnum)->HCINTMSK; - - return tmpreg; -} - -/** - * @brief USB_ReadDevAllOutEpInterrupt: return the USB device OUT endpoints interrupt status - * @param USBx Selected device - * @retval USB Device OUT EP interrupt status - */ -uint32_t USB_ReadDevAllOutEpInterrupt(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t tmpreg; - - tmpreg = USBx_DEVICE->DAINT; - tmpreg &= USBx_DEVICE->DAINTMSK; - - return ((tmpreg & 0xffff0000U) >> 16); -} - -/** - * @brief USB_ReadDevAllInEpInterrupt: return the USB device IN endpoints interrupt status - * @param USBx Selected device - * @retval USB Device IN EP interrupt status - */ -uint32_t USB_ReadDevAllInEpInterrupt(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t tmpreg; - - tmpreg = USBx_DEVICE->DAINT; - tmpreg &= USBx_DEVICE->DAINTMSK; - - return ((tmpreg & 0xFFFFU)); -} - -/** - * @brief Returns Device OUT EP Interrupt register - * @param USBx Selected device - * @param epnum endpoint number - * This parameter can be a value from 0 to 15 - * @retval Device OUT EP Interrupt register - */ -uint32_t USB_ReadDevOutEPInterrupt(const USB_OTG_GlobalTypeDef *USBx, uint8_t epnum) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t tmpreg; - - tmpreg = USBx_OUTEP((uint32_t)epnum)->DOEPINT; - tmpreg &= USBx_DEVICE->DOEPMSK; - - return tmpreg; -} - -/** - * @brief Returns Device IN EP Interrupt register - * @param USBx Selected device - * @param epnum endpoint number - * This parameter can be a value from 0 to 15 - * @retval Device IN EP Interrupt register - */ -uint32_t USB_ReadDevInEPInterrupt(const USB_OTG_GlobalTypeDef *USBx, uint8_t epnum) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t tmpreg; - uint32_t msk; - uint32_t emp; - - msk = USBx_DEVICE->DIEPMSK; - emp = USBx_DEVICE->DIEPEMPMSK; - msk |= ((emp >> (epnum & EP_ADDR_MSK)) & 0x1U) << 7; - tmpreg = USBx_INEP((uint32_t)epnum)->DIEPINT & msk; - - return tmpreg; -} - -/** - * @brief USB_ClearInterrupts: clear a USB interrupt - * @param USBx Selected device - * @param interrupt flag - * @retval None - */ -void USB_ClearInterrupts(USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt) -{ - USBx->GINTSTS &= interrupt; -} - -/** - * @brief Returns USB core mode - * @param USBx Selected device - * @retval return core mode : Host or Device - * This parameter can be one of these values: - * 0 : Host - * 1 : Device - */ -uint32_t USB_GetMode(const USB_OTG_GlobalTypeDef *USBx) -{ - return ((USBx->GINTSTS) & 0x1U); -} - -/** - * @brief Activate EP0 for Setup transactions - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_ActivateSetup(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - /* Set the MPS of the IN EP0 to 64 bytes */ - USBx_INEP(0U)->DIEPCTL &= ~USB_OTG_DIEPCTL_MPSIZ; - - USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGINAK; - - return HAL_OK; -} - -/** - * @brief Prepare the EP0 to start the first control setup - * @param USBx Selected device - * @param dma USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @param psetup pointer to setup packet - * @retval HAL status - */ -HAL_StatusTypeDef USB_EP0_OutStart(const USB_OTG_GlobalTypeDef *USBx, uint8_t dma, const uint8_t *psetup) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t gSNPSiD = *(__IO const uint32_t *)(&USBx->CID + 0x1U); - - if (gSNPSiD > USB_OTG_CORE_ID_300A) - { - if ((USBx_OUTEP(0U)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) - { - return HAL_OK; - } - } - - USBx_OUTEP(0U)->DOEPTSIZ = 0U; - USBx_OUTEP(0U)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); - USBx_OUTEP(0U)->DOEPTSIZ |= (3U * 8U); - USBx_OUTEP(0U)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_STUPCNT; - - if (dma == 1U) - { - USBx_OUTEP(0U)->DOEPDMA = (uint32_t)psetup; - /* EP enable */ - USBx_OUTEP(0U)->DOEPCTL |= USB_OTG_DOEPCTL_EPENA | USB_OTG_DOEPCTL_USBAEP; - } - - return HAL_OK; -} - -/** - * @brief Reset the USB Core (needed after USB clock settings change) - * @param USBx Selected device - * @retval HAL status - */ -static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx) -{ - __IO uint32_t count = 0U; - - /* Wait for AHB master IDLE state. */ - do - { - count++; - - if (count > HAL_USB_TIMEOUT) - { - return HAL_TIMEOUT; - } - } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); - - /* Core Soft Reset */ - count = 0U; - USBx->GRSTCTL |= USB_OTG_GRSTCTL_CSRST; - - do - { - count++; - - if (count > HAL_USB_TIMEOUT) - { - return HAL_TIMEOUT; - } - } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST); - - return HAL_OK; -} - -/** - * @brief USB_HostInit : Initializes the USB OTG controller registers - * for Host mode - * @param USBx Selected device - * @param cfg pointer to a USB_OTG_CfgTypeDef structure that contains - * the configuration information for the specified USBx peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) -{ - HAL_StatusTypeDef ret = HAL_OK; - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t i; - - /* Restart the Phy Clock */ - USBx_PCGCCTL = 0U; - -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \ - || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \ - || defined(STM32F423xx) - /* Disable HW VBUS sensing */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_VBDEN); -#else - /* - * Disable HW VBUS sensing. VBUS is internally considered to be always - * at VBUS-Valid level (5V). - */ - USBx->GCCFG |= USB_OTG_GCCFG_NOVBUSSENS; - USBx->GCCFG &= ~USB_OTG_GCCFG_VBUSBSEN; - USBx->GCCFG &= ~USB_OTG_GCCFG_VBUSASEN; -#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || - defined(STM32F423xx) */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) \ - || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - /* Disable Battery chargin detector */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_BCDEN); -#endif /* defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) */ - - if ((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) == 0U) - { - if (cfg.speed == USBH_FSLS_SPEED) - { - /* Force Device Enumeration to FS/LS mode only */ - USBx_HOST->HCFG |= USB_OTG_HCFG_FSLSS; - } - else - { - /* Set default Max speed support */ - USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSS); - } - } - else - { - /* Set default Max speed support */ - USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSS); - } - - /* Make sure the FIFOs are flushed. */ - if (USB_FlushTxFifo(USBx, 0x10U) != HAL_OK) /* all Tx FIFOs */ - { - ret = HAL_ERROR; - } - - if (USB_FlushRxFifo(USBx) != HAL_OK) - { - ret = HAL_ERROR; - } - - /* Clear all pending HC Interrupts */ - for (i = 0U; i < cfg.Host_channels; i++) - { - USBx_HC(i)->HCINT = CLEAR_INTERRUPT_MASK; - USBx_HC(i)->HCINTMSK = 0U; - } - - /* Disable all interrupts. */ - USBx->GINTMSK = 0U; - - /* Clear any pending interrupts */ - USBx->GINTSTS = CLEAR_INTERRUPT_MASK; -#if defined (USB_OTG_HS) - if (USBx == USB_OTG_HS) - { - /* set Rx FIFO size */ - USBx->GRXFSIZ = 0x200U; - USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t)(((0x100U << 16) & USB_OTG_NPTXFD) | 0x200U); - USBx->HPTXFSIZ = (uint32_t)(((0xE0U << 16) & USB_OTG_HPTXFSIZ_PTXFD) | 0x300U); - } - else -#endif /* defined (USB_OTG_HS) */ - { - /* set Rx FIFO size */ - USBx->GRXFSIZ = 0x80U; - USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t)(((0x60U << 16) & USB_OTG_NPTXFD) | 0x80U); - USBx->HPTXFSIZ = (uint32_t)(((0x40U << 16)& USB_OTG_HPTXFSIZ_PTXFD) | 0xE0U); - } - - /* Enable the common interrupts */ - if (cfg.dma_enable == 0U) - { - USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM; - } - - /* Enable interrupts matching to the Host mode ONLY */ - USBx->GINTMSK |= (USB_OTG_GINTMSK_PRTIM | USB_OTG_GINTMSK_HCIM | \ - USB_OTG_GINTMSK_SOFM | USB_OTG_GINTSTS_DISCINT | \ - USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM); - - return ret; -} - -/** - * @brief USB_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the - * HCFG register on the PHY type and set the right frame interval - * @param USBx Selected device - * @param freq clock frequency - * This parameter can be one of these values: - * HCFG_48_MHZ : Full Speed 48 MHz Clock - * HCFG_6_MHZ : Low Speed 6 MHz Clock - * @retval HAL status - */ -HAL_StatusTypeDef USB_InitFSLSPClkSel(const USB_OTG_GlobalTypeDef *USBx, uint8_t freq) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSPCS); - USBx_HOST->HCFG |= (uint32_t)freq & USB_OTG_HCFG_FSLSPCS; - - if (freq == HCFG_48_MHZ) - { - USBx_HOST->HFIR = HFIR_48_MHZ; - } - else if (freq == HCFG_6_MHZ) - { - USBx_HOST->HFIR = HFIR_6_MHZ; - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief USB_OTG_ResetPort : Reset Host Port - * @param USBx Selected device - * @retval HAL status - * @note (1)The application must wait at least 10 ms - * before clearing the reset bit. - */ -HAL_StatusTypeDef USB_ResetPort(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - __IO uint32_t hprt0 = 0U; - - hprt0 = USBx_HPRT0; - - hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | - USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG); - - USBx_HPRT0 = (USB_OTG_HPRT_PRST | hprt0); - HAL_Delay(100U); /* See Note #1 */ - USBx_HPRT0 = ((~USB_OTG_HPRT_PRST) & hprt0); - HAL_Delay(10U); - - return HAL_OK; -} - -/** - * @brief USB_DriveVbus : activate or de-activate vbus - * @param state VBUS state - * This parameter can be one of these values: - * 0 : Deactivate VBUS - * 1 : Activate VBUS - * @retval HAL status - */ -HAL_StatusTypeDef USB_DriveVbus(const USB_OTG_GlobalTypeDef *USBx, uint8_t state) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - __IO uint32_t hprt0 = 0U; - - hprt0 = USBx_HPRT0; - - hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | - USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG); - - if (((hprt0 & USB_OTG_HPRT_PPWR) == 0U) && (state == 1U)) - { - USBx_HPRT0 = (USB_OTG_HPRT_PPWR | hprt0); - } - if (((hprt0 & USB_OTG_HPRT_PPWR) == USB_OTG_HPRT_PPWR) && (state == 0U)) - { - USBx_HPRT0 = ((~USB_OTG_HPRT_PPWR) & hprt0); - } - return HAL_OK; -} - -/** - * @brief Return Host Core speed - * @param USBx Selected device - * @retval speed : Host speed - * This parameter can be one of these values: - * @arg HCD_SPEED_HIGH: High speed mode - * @arg HCD_SPEED_FULL: Full speed mode - * @arg HCD_SPEED_LOW: Low speed mode - */ -uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef const *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - __IO uint32_t hprt0 = 0U; - - hprt0 = USBx_HPRT0; - return ((hprt0 & USB_OTG_HPRT_PSPD) >> 17); -} - -/** - * @brief Return Host Current Frame number - * @param USBx Selected device - * @retval current frame number - */ -uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef const *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - return (USBx_HOST->HFNUM & USB_OTG_HFNUM_FRNUM); -} - -/** - * @brief Initialize a host channel - * @param USBx Selected device - * @param ch_num Channel number - * This parameter can be a value from 1 to 15 - * @param epnum Endpoint number - * This parameter can be a value from 1 to 15 - * @param dev_address Current device address - * This parameter can be a value from 0 to 255 - * @param speed Current device speed - * This parameter can be one of these values: - * @arg USB_OTG_SPEED_HIGH: High speed mode - * @arg USB_OTG_SPEED_FULL: Full speed mode - * @arg USB_OTG_SPEED_LOW: Low speed mode - * @param ep_type Endpoint Type - * This parameter can be one of these values: - * @arg EP_TYPE_CTRL: Control type - * @arg EP_TYPE_ISOC: Isochronous type - * @arg EP_TYPE_BULK: Bulk type - * @arg EP_TYPE_INTR: Interrupt type - * @param mps Max Packet Size - * This parameter can be a value from 0 to 32K - * @retval HAL state - */ -HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num, - uint8_t epnum, uint8_t dev_address, uint8_t speed, - uint8_t ep_type, uint16_t mps) -{ - HAL_StatusTypeDef ret = HAL_OK; - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t HCcharEpDir; - uint32_t HCcharLowSpeed; - uint32_t HostCoreSpeed; - - /* Clear old interrupt conditions for this host channel. */ - USBx_HC((uint32_t)ch_num)->HCINT = CLEAR_INTERRUPT_MASK; - - /* Enable channel interrupts required for this transfer. */ - switch (ep_type) - { - case EP_TYPE_CTRL: - case EP_TYPE_BULK: - USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM | - USB_OTG_HCINTMSK_STALLM | - USB_OTG_HCINTMSK_TXERRM | - USB_OTG_HCINTMSK_DTERRM | - USB_OTG_HCINTMSK_AHBERR | - USB_OTG_HCINTMSK_NAKM; - - if ((epnum & 0x80U) == 0x80U) - { - USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM; - } - else - { -#if defined (USB_OTG_HS) - if (USBx == USB_OTG_HS) - { - USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_NYET | - USB_OTG_HCINTMSK_ACKM; - } -#endif /* defined (USB_OTG_HS) */ - } - break; - - case EP_TYPE_INTR: - USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM | - USB_OTG_HCINTMSK_STALLM | - USB_OTG_HCINTMSK_TXERRM | - USB_OTG_HCINTMSK_DTERRM | - USB_OTG_HCINTMSK_NAKM | - USB_OTG_HCINTMSK_AHBERR | - USB_OTG_HCINTMSK_FRMORM; - - if ((epnum & 0x80U) == 0x80U) - { - USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM; - } - - break; - - case EP_TYPE_ISOC: - USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM | - USB_OTG_HCINTMSK_ACKM | - USB_OTG_HCINTMSK_AHBERR | - USB_OTG_HCINTMSK_FRMORM; - - if ((epnum & 0x80U) == 0x80U) - { - USBx_HC((uint32_t)ch_num)->HCINTMSK |= (USB_OTG_HCINTMSK_TXERRM | USB_OTG_HCINTMSK_BBERRM); - } - break; - - default: - ret = HAL_ERROR; - break; - } - - /* Clear Hub Start Split transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT = 0U; - - /* Enable host channel Halt interrupt */ - USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_CHHM; - - /* Enable the top level host channel interrupt. */ - USBx_HOST->HAINTMSK |= 1UL << (ch_num & 0xFU); - - /* Make sure host channel interrupts are enabled. */ - USBx->GINTMSK |= USB_OTG_GINTMSK_HCIM; - - /* Program the HCCHAR register */ - if ((epnum & 0x80U) == 0x80U) - { - HCcharEpDir = (0x1U << 15) & USB_OTG_HCCHAR_EPDIR; - } - else - { - HCcharEpDir = 0U; - } - - HostCoreSpeed = USB_GetHostSpeed(USBx); - - /* LS device plugged to HUB */ - if ((speed == HPRT0_PRTSPD_LOW_SPEED) && (HostCoreSpeed != HPRT0_PRTSPD_LOW_SPEED)) - { - HCcharLowSpeed = (0x1U << 17) & USB_OTG_HCCHAR_LSDEV; - } - else - { - HCcharLowSpeed = 0U; - } - - USBx_HC((uint32_t)ch_num)->HCCHAR = (((uint32_t)dev_address << 22) & USB_OTG_HCCHAR_DAD) | - ((((uint32_t)epnum & 0x7FU) << 11) & USB_OTG_HCCHAR_EPNUM) | - (((uint32_t)ep_type << 18) & USB_OTG_HCCHAR_EPTYP) | - ((uint32_t)mps & USB_OTG_HCCHAR_MPSIZ) | - USB_OTG_HCCHAR_MC_0 | HCcharEpDir | HCcharLowSpeed; - - if ((ep_type == EP_TYPE_INTR) || (ep_type == EP_TYPE_ISOC)) - { - USBx_HC((uint32_t)ch_num)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM; - } - - return ret; -} - -/** - * @brief Start a transfer over a host channel - * @param USBx Selected device - * @param hc pointer to host channel structure - * @param dma USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @retval HAL state - */ -HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t ch_num = (uint32_t)hc->ch_num; - __IO uint32_t tmpreg; - uint8_t is_oddframe; - uint16_t len_words; - uint16_t num_packets; - uint16_t max_hc_pkt_count = HC_MAX_PKT_CNT; - -#if defined (USB_OTG_HS) - if (USBx == USB_OTG_HS) - { - /* in DMA mode host Core automatically issues ping in case of NYET/NAK */ - if (dma == 1U) - { - if (((hc->ep_type == EP_TYPE_CTRL) || (hc->ep_type == EP_TYPE_BULK)) && (hc->do_ssplit == 0U)) - { - - USBx_HC((uint32_t)ch_num)->HCINTMSK &= ~(USB_OTG_HCINTMSK_NYET | - USB_OTG_HCINTMSK_ACKM | - USB_OTG_HCINTMSK_NAKM); - } - } - else - { - if ((hc->speed == USBH_HS_SPEED) && (hc->do_ping == 1U)) - { - (void)USB_DoPing(USBx, hc->ch_num); - return HAL_OK; - } - } - } -#endif /* defined (USB_OTG_HS) */ - - if (hc->do_ssplit == 1U) - { - /* Set number of packet to 1 for Split transaction */ - num_packets = 1U; - - if (hc->ep_is_in != 0U) - { - hc->XferSize = (uint32_t)num_packets * hc->max_packet; - } - else - { - if (hc->ep_type == EP_TYPE_ISOC) - { - if (hc->xfer_len > ISO_SPLT_MPS) - { - /* Isochrone Max Packet Size for Split mode */ - hc->XferSize = hc->max_packet; - hc->xfer_len = hc->XferSize; - - if ((hc->iso_splt_xactPos == HCSPLT_BEGIN) || (hc->iso_splt_xactPos == HCSPLT_MIDDLE)) - { - hc->iso_splt_xactPos = HCSPLT_MIDDLE; - } - else - { - hc->iso_splt_xactPos = HCSPLT_BEGIN; - } - } - else - { - hc->XferSize = hc->xfer_len; - - if ((hc->iso_splt_xactPos != HCSPLT_BEGIN) && (hc->iso_splt_xactPos != HCSPLT_MIDDLE)) - { - hc->iso_splt_xactPos = HCSPLT_FULL; - } - else - { - hc->iso_splt_xactPos = HCSPLT_END; - } - } - } - else - { - if ((dma == 1U) && (hc->xfer_len > hc->max_packet)) - { - hc->XferSize = (uint32_t)num_packets * hc->max_packet; - } - else - { - hc->XferSize = hc->xfer_len; - } - } - } - } - else - { - /* Compute the expected number of packets associated to the transfer */ - if (hc->xfer_len > 0U) - { - num_packets = (uint16_t)((hc->xfer_len + hc->max_packet - 1U) / hc->max_packet); - - if (num_packets > max_hc_pkt_count) - { - num_packets = max_hc_pkt_count; - hc->XferSize = (uint32_t)num_packets * hc->max_packet; - } - } - else - { - num_packets = 1U; - } - - /* - * For IN channel HCTSIZ.XferSize is expected to be an integer multiple of - * max_packet size. - */ - if (hc->ep_is_in != 0U) - { - hc->XferSize = (uint32_t)num_packets * hc->max_packet; - } - else - { - hc->XferSize = hc->xfer_len; - } - } - - /* Initialize the HCTSIZn register */ - USBx_HC(ch_num)->HCTSIZ = (hc->XferSize & USB_OTG_HCTSIZ_XFRSIZ) | - (((uint32_t)num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) | - (((uint32_t)hc->data_pid << 29) & USB_OTG_HCTSIZ_DPID); - - if (dma != 0U) - { - /* xfer_buff MUST be 32-bits aligned */ - USBx_HC(ch_num)->HCDMA = (uint32_t)hc->xfer_buff; - } - - is_oddframe = (((uint32_t)USBx_HOST->HFNUM & 0x01U) != 0U) ? 0U : 1U; - USBx_HC(ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM; - USBx_HC(ch_num)->HCCHAR |= (uint32_t)is_oddframe << 29; - - if (hc->do_ssplit == 1U) - { - /* Set Hub start Split transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT = ((uint32_t)hc->hub_addr << USB_OTG_HCSPLT_HUBADDR_Pos) | - (uint32_t)hc->hub_port_nbr | USB_OTG_HCSPLT_SPLITEN; - - /* unmask ack & nyet for IN/OUT transactions */ - USBx_HC((uint32_t)ch_num)->HCINTMSK |= (USB_OTG_HCINTMSK_ACKM | - USB_OTG_HCINTMSK_NYET); - - if ((hc->do_csplit == 1U) && (hc->ep_is_in == 0U)) - { - USBx_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_COMPLSPLT; - USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_NYET; - } - - if (((hc->ep_type == EP_TYPE_ISOC) || (hc->ep_type == EP_TYPE_INTR)) && - (hc->do_csplit == 1U) && (hc->ep_is_in == 1U)) - { - USBx_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_COMPLSPLT; - } - - /* Position management for iso out transaction on split mode */ - if ((hc->ep_type == EP_TYPE_ISOC) && (hc->ep_is_in == 0U)) - { - /* Set data payload position */ - switch (hc->iso_splt_xactPos) - { - case HCSPLT_BEGIN: - /* First data payload for OUT Transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_XACTPOS_1; - break; - - case HCSPLT_MIDDLE: - /* Middle data payload for OUT Transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_XACTPOS_Pos; - break; - - case HCSPLT_END: - /* End data payload for OUT Transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_XACTPOS_0; - break; - - case HCSPLT_FULL: - /* Entire data payload for OUT Transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_XACTPOS; - break; - - default: - break; - } - } - } - else - { - /* Clear Hub Start Split transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT = 0U; - } - - /* Set host channel enable */ - tmpreg = USBx_HC(ch_num)->HCCHAR; - tmpreg &= ~USB_OTG_HCCHAR_CHDIS; - - /* make sure to set the correct ep direction */ - if (hc->ep_is_in != 0U) - { - tmpreg |= USB_OTG_HCCHAR_EPDIR; - } - else - { - tmpreg &= ~USB_OTG_HCCHAR_EPDIR; - } - tmpreg |= USB_OTG_HCCHAR_CHENA; - USBx_HC(ch_num)->HCCHAR = tmpreg; - - if (dma != 0U) /* dma mode */ - { - return HAL_OK; - } - - if ((hc->ep_is_in == 0U) && (hc->xfer_len > 0U) && (hc->do_csplit == 0U)) - { - switch (hc->ep_type) - { - /* Non periodic transfer */ - case EP_TYPE_CTRL: - case EP_TYPE_BULK: - - len_words = (uint16_t)((hc->xfer_len + 3U) / 4U); - - /* check if there is enough space in FIFO space */ - if (len_words > (USBx->HNPTXSTS & 0xFFFFU)) - { - /* need to process data in nptxfempty interrupt */ - USBx->GINTMSK |= USB_OTG_GINTMSK_NPTXFEM; - } - break; - - /* Periodic transfer */ - case EP_TYPE_INTR: - case EP_TYPE_ISOC: - len_words = (uint16_t)((hc->xfer_len + 3U) / 4U); - /* check if there is enough space in FIFO space */ - if (len_words > (USBx_HOST->HPTXSTS & 0xFFFFU)) /* split the transfer */ - { - /* need to process data in ptxfempty interrupt */ - USBx->GINTMSK |= USB_OTG_GINTMSK_PTXFEM; - } - break; - - default: - break; - } - - /* Write packet into the Tx FIFO. */ - (void)USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, (uint16_t)hc->xfer_len, 0); - } - - return HAL_OK; -} - -/** - * @brief Read all host channel interrupts status - * @param USBx Selected device - * @retval HAL state - */ -uint32_t USB_HC_ReadInterrupt(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - return ((USBx_HOST->HAINT) & 0xFFFFU); -} - -/** - * @brief Halt a host channel - * @param USBx Selected device - * @param hc_num Host Channel number - * This parameter can be a value from 1 to 15 - * @retval HAL state - */ -HAL_StatusTypeDef USB_HC_Halt(const USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t hcnum = (uint32_t)hc_num; - __IO uint32_t count = 0U; - uint32_t HcEpType = (USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_EPTYP) >> 18; - uint32_t ChannelEna = (USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_CHENA) >> 31; - uint32_t SplitEna = (USBx_HC(hcnum)->HCSPLT & USB_OTG_HCSPLT_SPLITEN) >> 31; - - /* In buffer DMA, Channel disable must not be programmed for non-split periodic channels. - At the end of the next uframe/frame (in the worst case), the core generates a channel halted - and disables the channel automatically. */ - - if ((((USBx->GAHBCFG & USB_OTG_GAHBCFG_DMAEN) == USB_OTG_GAHBCFG_DMAEN) && (SplitEna == 0U)) && - ((ChannelEna == 0U) || (((HcEpType == HCCHAR_ISOC) || (HcEpType == HCCHAR_INTR))))) - { - return HAL_OK; - } - - /* Check for space in the request queue to issue the halt. */ - if ((HcEpType == HCCHAR_CTRL) || (HcEpType == HCCHAR_BULK)) - { - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHDIS; - - if ((USBx->GAHBCFG & USB_OTG_GAHBCFG_DMAEN) == 0U) - { - if ((USBx->HNPTXSTS & (0xFFU << 16)) == 0U) - { - USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA; - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - do - { - count++; - - if (count > 1000U) - { - break; - } - } while ((USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); - } - else - { - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - } - } - else - { - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - } - } - else - { - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHDIS; - - if ((USBx_HOST->HPTXSTS & (0xFFU << 16)) == 0U) - { - USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA; - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - do - { - count++; - - if (count > 1000U) - { - break; - } - } while ((USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); - } - else - { - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - } - } - - return HAL_OK; -} - -/** - * @brief Initiate Do Ping protocol - * @param USBx Selected device - * @param hc_num Host Channel number - * This parameter can be a value from 1 to 15 - * @retval HAL state - */ -HAL_StatusTypeDef USB_DoPing(const USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t chnum = (uint32_t)ch_num; - uint32_t num_packets = 1U; - uint32_t tmpreg; - - USBx_HC(chnum)->HCTSIZ = ((num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) | - USB_OTG_HCTSIZ_DOPING; - - /* Set host channel enable */ - tmpreg = USBx_HC(chnum)->HCCHAR; - tmpreg &= ~USB_OTG_HCCHAR_CHDIS; - tmpreg |= USB_OTG_HCCHAR_CHENA; - USBx_HC(chnum)->HCCHAR = tmpreg; - - return HAL_OK; -} - -/** - * @brief Stop Host Core - * @param USBx Selected device - * @retval HAL state - */ -HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) -{ - HAL_StatusTypeDef ret = HAL_OK; - uint32_t USBx_BASE = (uint32_t)USBx; - __IO uint32_t count = 0U; - uint32_t value; - uint32_t i; - - (void)USB_DisableGlobalInt(USBx); - - /* Flush USB FIFO */ - if (USB_FlushTxFifo(USBx, 0x10U) != HAL_OK) /* all Tx FIFOs */ - { - ret = HAL_ERROR; - } - - if (USB_FlushRxFifo(USBx) != HAL_OK) - { - ret = HAL_ERROR; - } - - /* Flush out any leftover queued requests. */ - for (i = 0U; i <= 15U; i++) - { - value = USBx_HC(i)->HCCHAR; - value |= USB_OTG_HCCHAR_CHDIS; - value &= ~USB_OTG_HCCHAR_CHENA; - value &= ~USB_OTG_HCCHAR_EPDIR; - USBx_HC(i)->HCCHAR = value; - } - - /* Halt all channels to put them into a known state. */ - for (i = 0U; i <= 15U; i++) - { - value = USBx_HC(i)->HCCHAR; - value |= USB_OTG_HCCHAR_CHDIS; - value |= USB_OTG_HCCHAR_CHENA; - value &= ~USB_OTG_HCCHAR_EPDIR; - USBx_HC(i)->HCCHAR = value; - - do - { - count++; - - if (count > 1000U) - { - break; - } - } while ((USBx_HC(i)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); - } - - /* Clear any pending Host interrupts */ - USBx_HOST->HAINT = CLEAR_INTERRUPT_MASK; - USBx->GINTSTS = CLEAR_INTERRUPT_MASK; - - (void)USB_EnableGlobalInt(USBx); - - return ret; -} - -/** - * @brief USB_ActivateRemoteWakeup active remote wakeup signalling - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_ActivateRemoteWakeup(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS) - { - /* active Remote wakeup signalling */ - USBx_DEVICE->DCTL |= USB_OTG_DCTL_RWUSIG; - } - - return HAL_OK; -} - -/** - * @brief USB_DeActivateRemoteWakeup de-active remote wakeup signalling - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_DeActivateRemoteWakeup(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - /* active Remote wakeup signalling */ - USBx_DEVICE->DCTL &= ~(USB_OTG_DCTL_RWUSIG); - - return HAL_OK; -} -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -/** - * @} - */ - -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -#endif /* defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) */ - -/** - * @} - */ diff --git a/software/Power_Pico/KeilClear.bat b/software/Power_Pico/KeilClear.bat deleted file mode 100644 index 3cb49c8..0000000 --- a/software/Power_Pico/KeilClear.bat +++ /dev/null @@ -1,50 +0,0 @@ -del *.bak /s - -del *.ddk /s - -del *.edk /s - -del *.lst /s - -del *.lnp /s - -del *.mpf /s - -del *.mpj /s - -del *.obj /s - -del *.omf /s - -del *.plg /s - -del *.rpt /s - -del *.tmp /s - -del *.__i /s - -del *.crf /s -del *.o /s - -del *.d /s - -del *.axf /s - -del *.tra /s - -del *.dep /s - -del JLinkLog.txt /s - -del *.iex /s - -del *.htm /s - -del *.sct /s - -del *.map /s - -del *.scvd /s - -exit diff --git a/software/Power_Pico/MDK-ARM/DebugConfig/power_pico_STM32F411CEUx.dbgconf b/software/Power_Pico/MDK-ARM/DebugConfig/power_pico_STM32F411CEUx.dbgconf deleted file mode 100644 index de9f9b9..0000000 --- a/software/Power_Pico/MDK-ARM/DebugConfig/power_pico_STM32F411CEUx.dbgconf +++ /dev/null @@ -1,41 +0,0 @@ -// File: STM32F401xBCDE_411xCE.dbgconf -// Version: 1.0.0 -// Note: refer to STM32F401xB/C STM32F401xD/E reference manual (RM0368) -// refer to STM32F401xB/C STM32F401xD/E datasheet -// refer to STM32F411xC/E reference manual (RM0383) -// refer to STM32F411xC/E datasheet - -// <<< Use Configuration Wizard in Context Menu >>> - -// Debug MCU configuration register (DBGMCU_CR) -// DBG_STANDBY Debug Standby Mode -// DBG_STOP Debug Stop Mode -// DBG_SLEEP Debug Sleep Mode -// -DbgMCU_CR = 0x00000007; - -// Debug MCU APB1 freeze register (DBGMCU_APB1_FZ) -// Reserved bits must be kept at reset value -// DBG_I2C3_SMBUS_TIMEOUT I2C3 SMBUS timeout mode stopped when core is halted -// DBG_I2C2_SMBUS_TIMEOUT I2C2 SMBUS timeout mode stopped when core is halted -// DBG_I2C1_SMBUS_TIMEOUT I2C1 SMBUS timeout mode stopped when core is halted -// DBG_IWDG_STOP Independent watchdog stopped when core is halted -// DBG_WWDG_STOP Window watchdog stopped when core is halted -// DBG_RTC_STOP RTC stopped when core is halted -// DBG_TIM5_STOP TIM5 counter stopped when core is halted -// DBG_TIM4_STOP TIM4 counter stopped when core is halted -// DBG_TIM3_STOP TIM3 counter stopped when core is halted -// DBG_TIM2_STOP TIM2 counter stopped when core is halted -// -DbgMCU_APB1_Fz = 0x00000000; - -// Debug MCU APB2 freeze register (DBGMCU_APB2_FZ) -// Reserved bits must be kept at reset value -// DBG_TIM11_STOP TIM11 counter stopped when core is halted -// DBG_TIM10_STOP TIM10 counter stopped when core is halted -// DBG_TIM9_STOP TIM9 counter stopped when core is halted -// DBG_TIM1_STOP TIM1 counter stopped when core is halted -// -DbgMCU_APB2_Fz = 0x00000000; - -// <<< end of configuration section >>> \ No newline at end of file diff --git a/software/Power_Pico/MDK-ARM/DebugConfig/power_pico_STM32F411RETx.dbgconf b/software/Power_Pico/MDK-ARM/DebugConfig/power_pico_STM32F411RETx.dbgconf deleted file mode 100644 index de9f9b9..0000000 --- a/software/Power_Pico/MDK-ARM/DebugConfig/power_pico_STM32F411RETx.dbgconf +++ /dev/null @@ -1,41 +0,0 @@ -// File: STM32F401xBCDE_411xCE.dbgconf -// Version: 1.0.0 -// Note: refer to STM32F401xB/C STM32F401xD/E reference manual (RM0368) -// refer to STM32F401xB/C STM32F401xD/E datasheet -// refer to STM32F411xC/E reference manual (RM0383) -// refer to STM32F411xC/E datasheet - -// <<< Use Configuration Wizard in Context Menu >>> - -// Debug MCU configuration register (DBGMCU_CR) -// DBG_STANDBY Debug Standby Mode -// DBG_STOP Debug Stop Mode -// DBG_SLEEP Debug Sleep Mode -// -DbgMCU_CR = 0x00000007; - -// Debug MCU APB1 freeze register (DBGMCU_APB1_FZ) -// Reserved bits must be kept at reset value -// DBG_I2C3_SMBUS_TIMEOUT I2C3 SMBUS timeout mode stopped when core is halted -// DBG_I2C2_SMBUS_TIMEOUT I2C2 SMBUS timeout mode stopped when core is halted -// DBG_I2C1_SMBUS_TIMEOUT I2C1 SMBUS timeout mode stopped when core is halted -// DBG_IWDG_STOP Independent watchdog stopped when core is halted -// DBG_WWDG_STOP Window watchdog stopped when core is halted -// DBG_RTC_STOP RTC stopped when core is halted -// DBG_TIM5_STOP TIM5 counter stopped when core is halted -// DBG_TIM4_STOP TIM4 counter stopped when core is halted -// DBG_TIM3_STOP TIM3 counter stopped when core is halted -// DBG_TIM2_STOP TIM2 counter stopped when core is halted -// -DbgMCU_APB1_Fz = 0x00000000; - -// Debug MCU APB2 freeze register (DBGMCU_APB2_FZ) -// Reserved bits must be kept at reset value -// DBG_TIM11_STOP TIM11 counter stopped when core is halted -// DBG_TIM10_STOP TIM10 counter stopped when core is halted -// DBG_TIM9_STOP TIM9 counter stopped when core is halted -// DBG_TIM1_STOP TIM1 counter stopped when core is halted -// -DbgMCU_APB2_Fz = 0x00000000; - -// <<< end of configuration section >>> \ No newline at end of file diff --git a/software/Power_Pico/MDK-ARM/RTE/_power_pico/RTE_Components.h b/software/Power_Pico/MDK-ARM/RTE/_power_pico/RTE_Components.h deleted file mode 100644 index d3b77d4..0000000 --- a/software/Power_Pico/MDK-ARM/RTE/_power_pico/RTE_Components.h +++ /dev/null @@ -1,21 +0,0 @@ - -/* - * Auto generated Run-Time-Environment Configuration File - * *** Do not modify ! *** - * - * Project: 'power_pico' - * Target: 'power_pico' - */ - -#ifndef RTE_COMPONENTS_H -#define RTE_COMPONENTS_H - - -/* - * Define the Device Header File: - */ -#define CMSIS_device_header "stm32f4xx.h" - - - -#endif /* RTE_COMPONENTS_H */ diff --git a/software/Power_Pico/MDK-ARM/power_pico.uvguix.kingham b/software/Power_Pico/MDK-ARM/power_pico.uvguix.kingham deleted file mode 100644 index 2720255..0000000 --- a/software/Power_Pico/MDK-ARM/power_pico.uvguix.kingham +++ /dev/null @@ -1,3628 +0,0 @@ - - - - -6.1 - -
### uVision Project, (C) Keil Software
- - - E:\projects\Github_Projects\Power_Pico\Power_Pico\User\GUI\font - - - - - - - 38003 - Registers - 115 115 - - - 346 - Code Coverage - 1010 160 - - - 204 - Performance Analyzer - 1170 - - - - - - 35141 - Event Statistics - - 200 50 700 - - - 1506 - Symbols - - 64 64 64 - - - 1936 - Watch 1 - - 200 133 133 - - - 1937 - Watch 2 - - 200 133 133 - - - 1935 - Call Stack + Locals - - 200 133 133 - - - 2506 - Trace Data - - 75 135 130 95 70 230 200 150 - - - 466 - Source Browser - 500 - 166 - - - - - - - - 0 - 0 - 0 - 50 - 16 - - - - - - - 44 - 2 - 3 - - -32000 - -32000 - - - -1 - -1 - - - 125 - 125 - 1277 - 718 - - - - 0 - - 417 - 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000002000000010000000100000058453A5C70726F6A656374735C4769746875625F50726F6A656374735C506F7765725F5069636F5C736F6674776172655C506F7765725F5069636F5C4D444B2D41524D5C737461727475705F73746D33326634313178652E730000000015737461727475705F73746D33326634313178652E7300000000C5D4F200FFFFFFFF58453A5C70726F6A656374735C4769746875625F50726F6A656374735C506F7765725F5069636F5C736F6674776172655C506F7765725F5069636F5C557365725C4755495C73637265656E735C75695F536574506167652E63000000000C75695F536574506167652E6300000000FFDC7800FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000F400000066000000000600005A020000 - - - - 0 - Build - - -1 - -1 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F40000004F00000090050000DF000000 - - - 16 - F40000006600000090050000F6000000 - - - - 1005 - 1005 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000ED0000002A020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 109 - 109 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000ED0000002A020000 - - - 16 - 8A000000A1000000A6010000E1020000 - - - - 1465 - 1465 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000005203000031010000 - - - - 1466 - 1466 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000005203000031010000 - - - - 1467 - 1467 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000005203000031010000 - - - - 1468 - 1468 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000005203000031010000 - - - - 1506 - 1506 - 0 - 0 - 0 - 0 - 32767 - 0 - 16384 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 1913 - 1913 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - 8A000000A10000005203000031010000 - - - - 1935 - 1935 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 1936 - 1936 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 1937 - 1937 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 1939 - 1939 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000005203000031010000 - - - - 1940 - 1940 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000005203000031010000 - - - - 1941 - 1941 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000005203000031010000 - - - - 1942 - 1942 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000005203000031010000 - - - - 195 - 195 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000ED0000002A020000 - - - 16 - 8A000000A1000000A6010000E1020000 - - - - 196 - 196 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000ED0000002A020000 - - - 16 - 8A000000A1000000A6010000E1020000 - - - - 197 - 197 - 1 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 000000005B0200000006000006030000 - - - 16 - 8A000000A10000005203000031010000 - - - - 198 - 198 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 000000001902000090050000BD020000 - - - 16 - 8A000000A10000005203000031010000 - - - - 199 - 199 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 030000005E020000FD050000ED020000 - - - 16 - 8A000000A10000005203000031010000 - - - - 203 - 203 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - 8A000000A10000005203000031010000 - - - - 204 - 204 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - 8A000000A10000005203000031010000 - - - - 221 - 221 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 00000000000000000000000000000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 2506 - 2506 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 2507 - 2507 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000005203000031010000 - - - - 343 - 343 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - 8A000000A10000005203000031010000 - - - - 346 - 346 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - 8A000000A10000005203000031010000 - - - - 35141 - 35141 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35824 - 35824 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - 8A000000A10000005203000031010000 - - - - 35885 - 35885 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35886 - 35886 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35887 - 35887 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35888 - 35888 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35889 - 35889 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35890 - 35890 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35891 - 35891 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35892 - 35892 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35893 - 35893 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35894 - 35894 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35895 - 35895 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35896 - 35896 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35897 - 35897 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35898 - 35898 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35899 - 35899 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35900 - 35900 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35901 - 35901 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35902 - 35902 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35903 - 35903 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35904 - 35904 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 35905 - 35905 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 38003 - 38003 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000ED0000002A020000 - - - 16 - 8A000000A1000000A6010000E1020000 - - - - 38007 - 38007 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 030000005E020000FD050000ED020000 - - - 16 - 8A000000A10000005203000031010000 - - - - 436 - 436 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 030000005E020000FD050000ED020000 - - - 16 - 8A000000A1000000A6010000E1020000 - - - - 437 - 437 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 440 - 440 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 463 - 463 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 030000005E020000FD050000ED020000 - - - 16 - 8A000000A1000000A6010000E1020000 - - - - 466 - 466 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 030000005E020000FD050000ED020000 - - - 16 - 8A000000A1000000A6010000E1020000 - - - - 470 - 470 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - 8A000000A10000005203000031010000 - - - - 50000 - 50000 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50001 - 50001 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50002 - 50002 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50003 - 50003 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50004 - 50004 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50005 - 50005 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50006 - 50006 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50007 - 50007 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50008 - 50008 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50009 - 50009 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50010 - 50010 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50011 - 50011 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50012 - 50012 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50013 - 50013 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50014 - 50014 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50015 - 50015 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50016 - 50016 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50017 - 50017 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50018 - 50018 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 50019 - 50019 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 59392 - 59392 - 1 - 0 - 0 - 0 - 966 - 0 - 8192 - 0 - - 16 - 0000000000000000D10300001C000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59393 - 0 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 00000000060300000006000019030000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59399 - 59399 - 1 - 0 - 0 - 0 - 476 - 0 - 8192 - 1 - - 16 - 000000001C000000E701000038000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59400 - 59400 - 0 - 0 - 0 - 0 - 612 - 0 - 8192 - 2 - - 16 - 00000000380000006F02000054000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 824 - 824 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - 8A000000A10000007A0100006C010000 - - - - 3312 - 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000DF00000090050000E3000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000F40000006600000090050000F6000000F40000004F00000090050000DF0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A004000029020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000A0040000660000009005000040020000A00400004F000000900500002902000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFF00000004F000000F400000043020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000000000066000000F00000005A020000000000004F000000F0000000430200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000015020000900500001902000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000000000000000000003002000090050000D4020000000000001902000090050000BD02000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFC802000019020000CC020000BD02000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF00000000430200000006000047020000010000000100001004000000010000000AFDFFFF8E000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000000000005E020000000600001D030000000000004702000000060000060300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 - - - 59392 - File - - 2982 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000000000000000000000000000000000000000000100000001000000960000000200205000000000124D585F5553425F4445564943455F496E697496000000000000001400124D585F5553425F4445564943455F496E6974065F5F7765616B1C48414C5F4144435F436F6E7648616C6643706C7443616C6C6261636B1648414C5F5350495F547843706C7443616C6C6261636B067072696E74660E4344435F526563656976655F46530E50445F4556545F5345545F505053067374727563740B50445F4556545F53544F500C50445F4556545F53544152541250445F636F6D6D616E645F6576656E745F741350445F636D645F4D65737361676551756575651250445F55495F4D65737361676551756575650B50445F55495F4D53475F741C506167654D616E616765725F68616E646C655F6B65795F6576656E741C506167654D616E616765725F6765745F63757272656E745F7061676510506167654D616E616765725F676F746F10506167654D616E616765725F7072657610506167654D616E616765725F6E65787414506167654D616E616765725F72656769737465720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 - - - 1423 - 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 1423 - 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 - - - - 59399 - Build - - 980 - 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000000A706F7765725F7069636F960000000000000001000A706F7765725F7069636F000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 - - - 583 - 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 583 - 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 - - - - 59400 - Debug - - 2373 - 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 - - - 898 - 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 898 - 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 - - - - 0 - 1536 - 864 - - - - 1 - Debug - - -1 - -1 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 1A0100004F00000000060000BE000000 - - - 16 - 1A0100006600000000060000D5000000 - - - - 1005 - 1005 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000660000001301000026020000 - - - 16 - 70000000870000003001000027010000 - - - - 109 - 109 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000660000001301000013020000 - - - 16 - 70000000870000005301000043020000 - - - - 1465 - 1465 - 1 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD050000ED020000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1466 - 1466 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD05000000030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1467 - 1467 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD05000000030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1468 - 1468 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD05000000030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1506 - 1506 - 0 - 0 - 0 - 0 - 32767 - 0 - 16384 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 1913 - 1913 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D01000066000000FD050000A5000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1935 - 1935 - 1 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD050000ED020000 - - - 16 - 70000000870000003001000027010000 - - - - 1936 - 1936 - 1 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD050000ED020000 - - - 16 - FD030000D4030000BD04000074040000 - - - - 1937 - 1937 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD05000000030000 - - - 16 - 70000000870000003001000027010000 - - - - 1939 - 1939 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD05000000030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1940 - 1940 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD05000000030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1941 - 1941 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD05000000030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1942 - 1942 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD05000000030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 195 - 195 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000660000001301000013020000 - - - 16 - 70000000870000005301000043020000 - - - - 196 - 196 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000660000001301000013020000 - - - 16 - 70000000870000005301000043020000 - - - - 197 - 197 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 03000000C00100006D040000FE010000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 198 - 198 - 1 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 00000000430200000003000006030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 199 - 199 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000C00100006D040000FE010000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 203 - 203 - 1 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1A0100006300000000060000BE000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 204 - 204 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D01000066000000FD050000A5000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 221 - 221 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 00000000000000000000000000000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 2506 - 2506 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 2507 - 2507 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD05000000030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 343 - 343 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D01000066000000FD050000A5000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 346 - 346 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D01000066000000FD050000A5000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 35141 - 35141 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D01000066000000FD050000A5000000 - - - 16 - 70000000870000003001000027010000 - - - - 35824 - 35824 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D01000066000000FD050000A5000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 35885 - 35885 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35886 - 35886 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35887 - 35887 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35888 - 35888 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35889 - 35889 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35890 - 35890 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35891 - 35891 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35892 - 35892 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35893 - 35893 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35894 - 35894 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35895 - 35895 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35896 - 35896 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35897 - 35897 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35898 - 35898 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35899 - 35899 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35900 - 35900 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35901 - 35901 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35902 - 35902 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35903 - 35903 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35904 - 35904 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35905 - 35905 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 38003 - 38003 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000660000001301000026020000 - - - 16 - 70000000870000005301000043020000 - - - - 38007 - 38007 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000C00100006D040000FE010000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 436 - 436 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000C00100006D040000FE010000 - - - 16 - 70000000870000005301000043020000 - - - - 437 - 437 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD05000000030000 - - - 16 - 70000000870000003001000027010000 - - - - 440 - 440 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD05000000030000 - - - 16 - 70000000870000003001000027010000 - - - - 463 - 463 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000C00100006D040000FE010000 - - - 16 - 70000000870000005301000043020000 - - - - 466 - 466 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000C00100006D040000FE010000 - - - 16 - 70000000870000005301000043020000 - - - - 470 - 470 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D01000066000000FD050000A5000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 50000 - 50000 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50001 - 50001 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 50002 - 50002 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50003 - 50003 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50004 - 50004 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 50005 - 50005 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50006 - 50006 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50007 - 50007 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50008 - 50008 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50009 - 50009 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50010 - 50010 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50011 - 50011 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50012 - 50012 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50013 - 50013 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50014 - 50014 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50015 - 50015 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 50016 - 50016 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50017 - 50017 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50018 - 50018 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50019 - 50019 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 59392 - 59392 - 1 - 0 - 0 - 0 - 966 - 0 - 8192 - 0 - - 16 - 0000000000000000D10300001C000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59393 - 0 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 00000000060300000006000019030000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59399 - 59399 - 0 - 0 - 0 - 0 - 476 - 0 - 8192 - 1 - - 16 - 000000001C000000E701000038000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59400 - 59400 - 1 - 0 - 0 - 0 - 612 - 0 - 8192 - 2 - - 16 - 000000001C0000006F02000038000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 824 - 824 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 070300005A020000FD05000000030000 - - - 16 - 70000000870000003001000027010000 - - - - 3311 - 000000000B000000000000000020000001000000FFFFFFFFFFFFFFFF1A010000BE00000000060000C20000000100000001000010040000000100000094FFFFFF9C010000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000010000001A0100006600000000060000D50000001A0100004F00000000060000BE0000000000000040280056080000000B446973617373656D626C7901000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFFAC0300004F000000B0030000A5010000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000B00300006600000070040000BC010000B00300004F00000070040000A501000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF160100004F0000001A0100003F0200000100000002000010040000000100000028FFFFFF9D060000FFFFFFFF05000000ED0300006D000000C3000000C4000000739400000180001000000100000000000000660000001601000043020000000000004F000000160100003F0200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73000000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7300000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657300000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273010000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000001000000FFFFFFFFFFFFFFFF000000003F020000000600004302000001000000010000100400000001000000D0FEFFFFA600000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F0700009307000094070000950700009607000091070000B5010000B80100003803000090070000BA050000BB050000BC050000CB090000B9050000018000800000010000000403000047020000000600001D0300000403000043020000000600000603000000000000404100560F0000001343616C6C20537461636B202B204C6F63616C73010000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF0757617463682031010000009007000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFF084D656D6F7279203101000000B905000001000000FFFFFFFFFFFFFFFF000000000000000001000000000000000100000001000000FFFFFFFF0003000043020000040300000603000001000000020000100400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000000000000FFFFFFFFFFFFFFFF00000000A501000070040000A9010000000000000100000004000000010000000000000000000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF010000779400000180008000000000000000000000C0010000700400002E02000000000000A901000070040000170200000000000040820046060000000C4275696C64204F757470757400000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0642726F777365000000007794000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 - - - 59392 - File - - 2982 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000000000000000000000000000000000000000000100000001000000960000000200205000000000124D585F5553425F4445564943455F496E697496000000000000001400124D585F5553425F4445564943455F496E6974065F5F7765616B1C48414C5F4144435F436F6E7648616C6643706C7443616C6C6261636B1648414C5F5350495F547843706C7443616C6C6261636B067072696E74660E4344435F526563656976655F46530E50445F4556545F5345545F505053067374727563740B50445F4556545F53544F500C50445F4556545F53544152541250445F636F6D6D616E645F6576656E745F741350445F636D645F4D65737361676551756575651250445F55495F4D65737361676551756575650B50445F55495F4D53475F741C506167654D616E616765725F68616E646C655F6B65795F6576656E741C506167654D616E616765725F6765745F63757272656E745F7061676510506167654D616E616765725F676F746F10506167654D616E616765725F7072657610506167654D616E616765725F6E65787414506167654D616E616765725F72656769737465720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000100150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000000180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 - - - 1423 - 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 1423 - 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 - - - - 59399 - Build - - 955 - 00200000000000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0000000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000000002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050FFFFFFFF00960000000000000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000000240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 - - - 583 - 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 583 - 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 - - - - 59400 - Debug - - 2362 - 00200000010000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000004002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000020001002D0000000000000000000000000000000001000000010000000180F07F0000020001002E0000000000000000000000000000000001000000010000000180E8880000020000003700000000000000000000000000000000010000000100000001803B010000020001002F0000000000000000000000000000000001000000010000000180BB8A00000200010030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000002000100310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F0100000200010032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000002000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000002000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 - - - 898 - 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 898 - 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 - - - - 0 - 1536 - 864 - - - - - - 1 - 0 - - 100 - 1 - - startup_stm32f411xe.s - 0 - 172 - 177 - 1 - - 0 - - - ..\User\GUI\screens\ui_SetPage.c - 0 - 485 - 488 - 1 - - 0 - - - - -
diff --git a/software/Power_Pico/MDK-ARM/power_pico.uvoptx b/software/Power_Pico/MDK-ARM/power_pico.uvoptx deleted file mode 100644 index 96c4839..0000000 --- a/software/Power_Pico/MDK-ARM/power_pico.uvoptx +++ /dev/null @@ -1,3122 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - power_pico - 0x4 - ARM-ADS - - 25000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_512 -FL080000 -FS08000000 -FP0($$Device:STM32F411CEUx$CMSIS\Flash\STM32F4xx_512.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U-O206 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F411CEUx$CMSIS\Flash\STM32F4xx_512.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - - - - 0 - 1 - gate_status - - - 1 - 1 - app_pd,0x0A - - - 2 - 1 - PageManager - - - 3 - 1 - _pd_working_status - - - - - 1 - 1 - 0x2001B008 - 0 - - - - 0 - - - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Application/MDK-ARM - 0 - 0 - 0 - 0 - - 1 - 1 - 2 - 0 - 0 - 0 - startup_stm32f411xe.s - startup_stm32f411xe.s - 0 - 0 - - - - - Application/User/Core - 0 - 0 - 0 - 0 - - 2 - 2 - 1 - 0 - 0 - 0 - ../Core/Src/main.c - main.c - 0 - 0 - - - 2 - 3 - 1 - 0 - 0 - 0 - ../Core/Src/gpio.c - gpio.c - 0 - 0 - - - 2 - 4 - 1 - 0 - 0 - 0 - ../Core/Src/freertos.c - freertos.c - 0 - 0 - - - 2 - 5 - 1 - 0 - 0 - 0 - ../Core/Src/adc.c - adc.c - 0 - 0 - - - 2 - 6 - 1 - 0 - 0 - 0 - ../Core/Src/dma.c - dma.c - 0 - 0 - - - 2 - 7 - 1 - 0 - 0 - 0 - ../Core/Src/i2c.c - i2c.c - 0 - 0 - - - 2 - 8 - 1 - 0 - 0 - 0 - ../Core/Src/spi.c - spi.c - 0 - 0 - - - 2 - 9 - 1 - 0 - 0 - 0 - ../Core/Src/tim.c - tim.c - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ../Core/Src/stm32f4xx_it.c - stm32f4xx_it.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ../Core/Src/stm32f4xx_hal_msp.c - stm32f4xx_hal_msp.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ../Core/Src/stm32f4xx_hal_timebase_tim.c - stm32f4xx_hal_timebase_tim.c - 0 - 0 - - - - - Application/User/Tasks - 0 - 0 - 0 - 0 - - 3 - 13 - 1 - 0 - 0 - 0 - ..\User\Tasks\Src\user_TasksInit.c - user_TasksInit.c - 0 - 0 - - - 3 - 14 - 1 - 0 - 0 - 0 - ..\User\Tasks\Src\user_HardwareInitTask.c - user_HardwareInitTask.c - 0 - 0 - - - 3 - 15 - 1 - 0 - 0 - 0 - ..\User\Tasks\Src\user_LVGLTask.c - user_LVGLTask.c - 0 - 0 - - - 3 - 16 - 1 - 0 - 0 - 0 - ..\User\Tasks\Src\user_KeyTask.c - user_KeyTask.c - 0 - 0 - - - 3 - 17 - 1 - 0 - 0 - 0 - ..\User\Tasks\Src\user_MessageTask.c - user_MessageTask.c - 0 - 0 - - - 3 - 18 - 1 - 0 - 0 - 0 - ..\User\Tasks\Src\user_PDUFPTask.c - user_PDUFPTask.c - 0 - 0 - - - - - Application/User/GUI - 0 - 0 - 0 - 0 - - 4 - 19 - 1 - 0 - 0 - 0 - ..\User\GUI\common\lv_lib_pm.c - lv_lib_pm.c - 0 - 0 - - - 4 - 20 - 1 - 0 - 0 - 0 - ..\User\GUI\common\lv_lib_animation.c - lv_lib_animation.c - 0 - 0 - - - 4 - 21 - 1 - 0 - 0 - 0 - ..\User\GUI\common\lv_i18n.c - lv_i18n.c - 0 - 0 - - - 4 - 22 - 1 - 0 - 0 - 0 - ..\User\GUI\ui.c - ui.c - 0 - 0 - - - 4 - 23 - 1 - 0 - 0 - 0 - ..\User\GUI\ui_helpers.c - ui_helpers.c - 0 - 0 - - - 4 - 24 - 1 - 0 - 0 - 0 - ..\User\GUI\screens\ui_StartPage.c - ui_StartPage.c - 0 - 0 - - - 4 - 25 - 1 - 0 - 0 - 0 - ..\User\GUI\screens\ui_mainPage.c - ui_mainPage.c - 0 - 0 - - - 4 - 26 - 1 - 0 - 0 - 0 - ..\User\GUI\screens\ui_ChartPage.c - ui_ChartPage.c - 0 - 0 - - - 4 - 27 - 1 - 0 - 0 - 0 - ..\User\GUI\screens\ui_SetPage.c - ui_SetPage.c - 0 - 0 - - - 4 - 28 - 1 - 0 - 0 - 0 - ..\User\GUI\screens\ui_PPSPage.c - ui_PPSPage.c - 0 - 0 - - - - - Application/User/font - 0 - 0 - 0 - 0 - - 5 - 29 - 1 - 0 - 0 - 0 - ..\User\GUI\font\ui_font_zhongyuan18.c - ui_font_zhongyuan18.c - 0 - 0 - - - 5 - 30 - 1 - 0 - 0 - 0 - ..\User\GUI\font\ui_font_zhongyuan20.c - ui_font_zhongyuan20.c - 0 - 0 - - - 5 - 31 - 1 - 0 - 0 - 0 - ..\User\GUI\font\ui_font_HeiTi32.c - ui_font_HeiTi32.c - 0 - 0 - - - 5 - 32 - 1 - 0 - 0 - 0 - ..\User\GUI\font\ui_font_HeiTi48.c - ui_font_HeiTi48.c - 0 - 0 - - - 5 - 33 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\font\lv_font_montserrat_14.c - lv_font_montserrat_14.c - 0 - 0 - - - 5 - 34 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\font\lv_font_montserrat_16.c - lv_font_montserrat_16.c - 0 - 0 - - - 5 - 35 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\font\lv_font_montserrat_18.c - lv_font_montserrat_18.c - 0 - 0 - - - 5 - 36 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\font\lv_font_montserrat_28.c - lv_font_montserrat_28.c - 0 - 0 - - - 5 - 37 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\font\lv_font_montserrat_20.c - lv_font_montserrat_20.c - 0 - 0 - - - 5 - 38 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\font\lv_font_montserrat_22.c - lv_font_montserrat_22.c - 0 - 0 - - - - - Application/User/img - 0 - 0 - 0 - 0 - - 6 - 39 - 1 - 0 - 0 - 0 - ..\User\GUI\images\ui_img_chicken_png.c - ui_img_chicken_png.c - 0 - 0 - - - - - Drivers/STM32F4xx_HAL_Driver - 0 - 0 - 0 - 0 - - 7 - 40 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c - stm32f4xx_hal_tim.c - 0 - 0 - - - 7 - 41 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c - stm32f4xx_hal_tim_ex.c - 0 - 0 - - - 7 - 42 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c - stm32f4xx_hal_pcd.c - 0 - 0 - - - 7 - 43 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c - stm32f4xx_hal_pcd_ex.c - 0 - 0 - - - 7 - 44 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c - stm32f4xx_ll_usb.c - 0 - 0 - - - 7 - 45 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c - stm32f4xx_hal_rcc.c - 0 - 0 - - - 7 - 46 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c - stm32f4xx_hal_rcc_ex.c - 0 - 0 - - - 7 - 47 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c - stm32f4xx_hal_flash.c - 0 - 0 - - - 7 - 48 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c - stm32f4xx_hal_flash_ex.c - 0 - 0 - - - 7 - 49 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c - stm32f4xx_hal_flash_ramfunc.c - 0 - 0 - - - 7 - 50 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c - stm32f4xx_hal_gpio.c - 0 - 0 - - - 7 - 51 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c - stm32f4xx_hal_dma_ex.c - 0 - 0 - - - 7 - 52 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c - stm32f4xx_hal_dma.c - 0 - 0 - - - 7 - 53 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c - stm32f4xx_hal_pwr.c - 0 - 0 - - - 7 - 54 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c - stm32f4xx_hal_pwr_ex.c - 0 - 0 - - - 7 - 55 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c - stm32f4xx_hal_cortex.c - 0 - 0 - - - 7 - 56 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c - stm32f4xx_hal.c - 0 - 0 - - - 7 - 57 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c - stm32f4xx_hal_exti.c - 0 - 0 - - - 7 - 58 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c - stm32f4xx_hal_adc.c - 0 - 0 - - - 7 - 59 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c - stm32f4xx_hal_adc_ex.c - 0 - 0 - - - 7 - 60 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_adc.c - stm32f4xx_ll_adc.c - 0 - 0 - - - 7 - 61 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c - stm32f4xx_hal_i2c.c - 0 - 0 - - - 7 - 62 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c - stm32f4xx_hal_i2c_ex.c - 0 - 0 - - - 7 - 63 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c - stm32f4xx_hal_spi.c - 0 - 0 - - - - - Drivers/BSP - 0 - 0 - 0 - 0 - - 8 - 64 - 1 - 0 - 0 - 0 - ..\BSP\LCD\lcd.c - lcd.c - 0 - 0 - - - 8 - 65 - 1 - 0 - 0 - 0 - ..\BSP\LCD\lcd_init.c - lcd_init.c - 0 - 0 - - - 8 - 66 - 1 - 0 - 0 - 0 - ..\BSP\KEY\key.c - key.c - 0 - 0 - - - 8 - 67 - 1 - 0 - 0 - 0 - ..\BSP\GATE\gate.c - gate.c - 0 - 0 - - - 8 - 68 - 1 - 0 - 0 - 0 - ..\BSP\BEEP\beep.c - beep.c - 0 - 0 - - - 8 - 69 - 1 - 0 - 0 - 0 - ..\BSP\EEPROM\BL24C02.c - BL24C02.c - 0 - 0 - - - 8 - 70 - 1 - 0 - 0 - 0 - ..\BSP\PD\FUSB302_UFP.c - FUSB302_UFP.c - 0 - 0 - - - 8 - 71 - 1 - 0 - 0 - 0 - ..\BSP\PD\PD_UFP_Protocol.c - PD_UFP_Protocol.c - 0 - 0 - - - 8 - 72 - 1 - 0 - 0 - 0 - ..\BSP\PD\fusb302_dev.c - fusb302_dev.c - 0 - 0 - - - - - Drivers/CMSIS - 0 - 0 - 0 - 0 - - 9 - 73 - 1 - 0 - 0 - 0 - ../Core/Src/system_stm32f4xx.c - system_stm32f4xx.c - 0 - 0 - - - - - Middlewares/FreeRTOS - 0 - 0 - 0 - 0 - - 10 - 74 - 1 - 0 - 0 - 0 - ../Middlewares/Third_Party/FreeRTOS/Source/croutine.c - croutine.c - 0 - 0 - - - 10 - 75 - 1 - 0 - 0 - 0 - ../Middlewares/Third_Party/FreeRTOS/Source/event_groups.c - event_groups.c - 0 - 0 - - - 10 - 76 - 1 - 0 - 0 - 0 - ../Middlewares/Third_Party/FreeRTOS/Source/list.c - list.c - 0 - 0 - - - 10 - 77 - 1 - 0 - 0 - 0 - ../Middlewares/Third_Party/FreeRTOS/Source/queue.c - queue.c - 0 - 0 - - - 10 - 78 - 1 - 0 - 0 - 0 - ../Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c - stream_buffer.c - 0 - 0 - - - 10 - 79 - 1 - 0 - 0 - 0 - ../Middlewares/Third_Party/FreeRTOS/Source/tasks.c - tasks.c - 0 - 0 - - - 10 - 80 - 1 - 0 - 0 - 0 - ../Middlewares/Third_Party/FreeRTOS/Source/timers.c - timers.c - 0 - 0 - - - 10 - 81 - 1 - 0 - 0 - 0 - ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c - cmsis_os2.c - 0 - 0 - - - 10 - 82 - 1 - 0 - 0 - 0 - ../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c - heap_4.c - 0 - 0 - - - 10 - 83 - 1 - 0 - 0 - 0 - ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c - port.c - 0 - 0 - - - - - Middlewares/LVGL/Src - 0 - 0 - 0 - 0 - - 11 - 84 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\lv_init.c - lv_init.c - 0 - 0 - - - 11 - 85 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\core\lv_group.c - lv_group.c - 0 - 0 - - - 11 - 86 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\core\lv_obj.c - lv_obj.c - 0 - 0 - - - 11 - 87 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\core\lv_obj_class.c - lv_obj_class.c - 0 - 0 - - - 11 - 88 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\core\lv_obj_draw.c - lv_obj_draw.c - 0 - 0 - - - 11 - 89 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\core\lv_obj_event.c - lv_obj_event.c - 0 - 0 - - - 11 - 90 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\core\lv_obj_id_builtin.c - lv_obj_id_builtin.c - 0 - 0 - - - 11 - 91 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\core\lv_obj_pos.c - lv_obj_pos.c - 0 - 0 - - - 11 - 92 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\core\lv_obj_property.c - lv_obj_property.c - 0 - 0 - - - 11 - 93 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\core\lv_obj_scroll.c - lv_obj_scroll.c - 0 - 0 - - - 11 - 94 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\core\lv_obj_style.c - lv_obj_style.c - 0 - 0 - - - 11 - 95 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\core\lv_obj_style_gen.c - lv_obj_style_gen.c - 0 - 0 - - - 11 - 96 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\core\lv_obj_tree.c - lv_obj_tree.c - 0 - 0 - - - 11 - 97 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\core\lv_refr.c - lv_refr.c - 0 - 0 - - - 11 - 98 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\display\lv_display.c - lv_display.c - 0 - 0 - - - 11 - 99 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\lv_draw.c - lv_draw.c - 0 - 0 - - - 11 - 100 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\lv_draw_arc.c - lv_draw_arc.c - 0 - 0 - - - 11 - 101 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\lv_draw_buf.c - lv_draw_buf.c - 0 - 0 - - - 11 - 102 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\lv_draw_image.c - lv_draw_image.c - 0 - 0 - - - 11 - 103 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\lv_draw_label.c - lv_draw_label.c - 0 - 0 - - - 11 - 104 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\lv_draw_line.c - lv_draw_line.c - 0 - 0 - - - 11 - 105 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\lv_draw_mask.c - lv_draw_mask.c - 0 - 0 - - - 11 - 106 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\lv_draw_rect.c - lv_draw_rect.c - 0 - 0 - - - 11 - 107 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\lv_draw_triangle.c - lv_draw_triangle.c - 0 - 0 - - - 11 - 108 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\lv_draw_vector.c - lv_draw_vector.c - 0 - 0 - - - 11 - 109 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\lv_image_decoder.c - lv_image_decoder.c - 0 - 0 - - - 11 - 110 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\font\lv_font.c - lv_font.c - 0 - 0 - - - 11 - 111 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_anim.c - lv_anim.c - 0 - 0 - - - 11 - 112 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_anim_timeline.c - lv_anim_timeline.c - 0 - 0 - - - 11 - 113 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_area.c - lv_area.c - 0 - 0 - - - 11 - 114 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_array.c - lv_array.c - 0 - 0 - - - 11 - 115 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_async.c - lv_async.c - 0 - 0 - - - 11 - 116 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_bidi.c - lv_bidi.c - 0 - 0 - - - 11 - 117 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_color.c - lv_color.c - 0 - 0 - - - 11 - 118 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_color_op.c - lv_color_op.c - 0 - 0 - - - 11 - 119 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_event.c - lv_event.c - 0 - 0 - - - 11 - 120 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_fs.c - lv_fs.c - 0 - 0 - - - 11 - 121 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_ll.c - lv_ll.c - 0 - 0 - - - 11 - 122 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_log.c - lv_log.c - 0 - 0 - - - 11 - 123 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_lru.c - lv_lru.c - 0 - 0 - - - 11 - 124 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_math.c - lv_math.c - 0 - 0 - - - 11 - 125 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_matrix.c - lv_matrix.c - 0 - 0 - - - 11 - 126 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_palette.c - lv_palette.c - 0 - 0 - - - 11 - 127 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_profiler_builtin.c - lv_profiler_builtin.c - 0 - 0 - - - 11 - 128 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_rb.c - lv_rb.c - 0 - 0 - - - 11 - 129 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_style.c - lv_style.c - 0 - 0 - - - 11 - 130 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_style_gen.c - lv_style_gen.c - 0 - 0 - - - 11 - 131 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_templ.c - lv_templ.c - 0 - 0 - - - 11 - 132 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_text.c - lv_text.c - 0 - 0 - - - 11 - 133 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_text_ap.c - lv_text_ap.c - 0 - 0 - - - 11 - 134 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_timer.c - lv_timer.c - 0 - 0 - - - 11 - 135 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\lv_utils.c - lv_utils.c - 0 - 0 - - - 11 - 136 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\cache\lv_cache.c - lv_cache.c - 0 - 0 - - - 11 - 137 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\cache\lv_cache_entry.c - lv_cache_entry.c - 0 - 0 - - - 11 - 138 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\cache\lv_cache_lru_rb.c - lv_cache_lru_rb.c - 0 - 0 - - - 11 - 139 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\cache\lv_image_cache.c - lv_image_cache.c - 0 - 0 - - - 11 - 140 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\misc\cache\lv_image_header_cache.c - lv_image_header_cache.c - 0 - 0 - - - 11 - 141 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\indev\lv_indev.c - lv_indev.c - 0 - 0 - - - 11 - 142 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\indev\lv_indev_scroll.c - lv_indev_scroll.c - 0 - 0 - - - 11 - 143 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\layouts\lv_layout.c - lv_layout.c - 0 - 0 - - - 11 - 144 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\layouts\grid\lv_grid.c - lv_grid.c - 0 - 0 - - - 11 - 145 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\layouts\flex\lv_flex.c - lv_flex.c - 0 - 0 - - - 11 - 146 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw.c - lv_draw_sw.c - 0 - 0 - - - 11 - 147 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_arc.c - lv_draw_sw_arc.c - 0 - 0 - - - 11 - 148 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_border.c - lv_draw_sw_border.c - 0 - 0 - - - 11 - 149 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_box_shadow.c - lv_draw_sw_box_shadow.c - 0 - 0 - - - 11 - 150 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_fill.c - lv_draw_sw_fill.c - 0 - 0 - - - 11 - 151 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_gradient.c - lv_draw_sw_gradient.c - 0 - 0 - - - 11 - 152 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_img.c - lv_draw_sw_img.c - 0 - 0 - - - 11 - 153 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_letter.c - lv_draw_sw_letter.c - 0 - 0 - - - 11 - 154 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_line.c - lv_draw_sw_line.c - 0 - 0 - - - 11 - 155 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_mask.c - lv_draw_sw_mask.c - 0 - 0 - - - 11 - 156 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_mask_rect.c - lv_draw_sw_mask_rect.c - 0 - 0 - - - 11 - 157 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_transform.c - lv_draw_sw_transform.c - 0 - 0 - - - 11 - 158 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_triangle.c - lv_draw_sw_triangle.c - 0 - 0 - - - 11 - 159 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_vector.c - lv_draw_sw_vector.c - 0 - 0 - - - 11 - 160 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\tick\lv_tick.c - lv_tick.c - 0 - 0 - - - 11 - 161 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\themes\lv_theme.c - lv_theme.c - 0 - 0 - - - 11 - 162 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\themes\simple\lv_theme_simple.c - lv_theme_simple.c - 0 - 0 - - - 11 - 163 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\themes\mono\lv_theme_mono.c - lv_theme_mono.c - 0 - 0 - - - 11 - 164 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\themes\default\lv_theme_default.c - lv_theme_default.c - 0 - 0 - - - 11 - 165 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\stdlib\lv_mem.c - lv_mem.c - 0 - 0 - - - 11 - 166 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\stdlib\builtin\lv_mem_core_builtin.c - lv_mem_core_builtin.c - 0 - 0 - - - 11 - 167 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\stdlib\builtin\lv_sprintf_builtin.c - lv_sprintf_builtin.c - 0 - 0 - - - 11 - 168 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\stdlib\builtin\lv_string_builtin.c - lv_string_builtin.c - 0 - 0 - - - 11 - 169 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\stdlib\builtin\lv_tlsf.c - lv_tlsf.c - 0 - 0 - - - 11 - 170 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\libs\bin_decoder\lv_bin_decoder.c - lv_bin_decoder.c - 0 - 0 - - - 11 - 171 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\libs\bmp\lv_bmp.c - lv_bmp.c - 0 - 0 - - - 11 - 172 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\libs\ffmpeg\lv_ffmpeg.c - lv_ffmpeg.c - 0 - 0 - - - 11 - 173 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\libs\freetype\lv_freetype.c - lv_freetype.c - 0 - 0 - - - 11 - 174 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\libs\freetype\lv_freetype_glyph.c - lv_freetype_glyph.c - 0 - 0 - - - 11 - 175 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\libs\freetype\lv_freetype_image.c - lv_freetype_image.c - 0 - 0 - - - 11 - 176 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\libs\freetype\lv_freetype_outline.c - lv_freetype_outline.c - 0 - 0 - - - 11 - 177 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\libs\freetype\lv_ftsystem.c - lv_ftsystem.c - 0 - 0 - - - 11 - 178 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\osal\lv_os.c - lv_os.c - 0 - 0 - - - 11 - 179 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\animimage\lv_animimage.c - lv_animimage.c - 0 - 0 - - - 11 - 180 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\arc\lv_arc.c - lv_arc.c - 0 - 0 - - - 11 - 181 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\bar\lv_bar.c - lv_bar.c - 0 - 0 - - - 11 - 182 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\button\lv_button.c - lv_button.c - 0 - 0 - - - 11 - 183 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\buttonmatrix\lv_buttonmatrix.c - lv_buttonmatrix.c - 0 - 0 - - - 11 - 184 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\canvas\lv_canvas.c - lv_canvas.c - 0 - 0 - - - 11 - 185 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\chart\lv_chart.c - lv_chart.c - 0 - 0 - - - 11 - 186 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\checkbox\lv_checkbox.c - lv_checkbox.c - 0 - 0 - - - 11 - 187 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\dropdown\lv_dropdown.c - lv_dropdown.c - 0 - 0 - - - 11 - 188 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\image\lv_image.c - lv_image.c - 0 - 0 - - - 11 - 189 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\imagebutton\lv_imagebutton.c - lv_imagebutton.c - 0 - 0 - - - 11 - 190 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\label\lv_label.c - lv_label.c - 0 - 0 - - - 11 - 191 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\line\lv_line.c - lv_line.c - 0 - 0 - - - 11 - 192 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\list\lv_list.c - lv_list.c - 0 - 0 - - - 11 - 193 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\lottie\lv_lottie.c - lv_lottie.c - 0 - 0 - - - 11 - 194 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\menu\lv_menu.c - lv_menu.c - 0 - 0 - - - 11 - 195 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\msgbox\lv_msgbox.c - lv_msgbox.c - 0 - 0 - - - 11 - 196 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\roller\lv_roller.c - lv_roller.c - 0 - 0 - - - 11 - 197 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\scale\lv_scale.c - lv_scale.c - 0 - 0 - - - 11 - 198 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\slider\lv_slider.c - lv_slider.c - 0 - 0 - - - 11 - 199 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\span\lv_span.c - lv_span.c - 0 - 0 - - - 11 - 200 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\spinbox\lv_spinbox.c - lv_spinbox.c - 0 - 0 - - - 11 - 201 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\spinner\lv_spinner.c - lv_spinner.c - 0 - 0 - - - 11 - 202 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\switch\lv_switch.c - lv_switch.c - 0 - 0 - - - 11 - 203 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\table\lv_table.c - lv_table.c - 0 - 0 - - - 11 - 204 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\tabview\lv_tabview.c - lv_tabview.c - 0 - 0 - - - 11 - 205 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\textarea\lv_textarea.c - lv_textarea.c - 0 - 0 - - - 11 - 206 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\tileview\lv_tileview.c - lv_tileview.c - 0 - 0 - - - 11 - 207 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\font\lv_binfont_loader.c - lv_binfont_loader.c - 0 - 0 - - - 11 - 208 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\font\lv_font_fmt_txt.c - lv_font_fmt_txt.c - 0 - 0 - - - 11 - 209 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\osal\lv_cmsis_rtos2.c - lv_cmsis_rtos2.c - 0 - 0 - - - 11 - 210 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\osal\lv_freertos.c - lv_freertos.c - 0 - 0 - - - 11 - 211 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\osal\lv_mqx.c - lv_mqx.c - 0 - 0 - - - 11 - 212 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\osal\lv_os_none.c - lv_os_none.c - 0 - 0 - - - 11 - 213 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\blend\lv_draw_sw_blend.c - lv_draw_sw_blend.c - 0 - 0 - - - 11 - 214 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\calendar\lv_calendar.c - lv_calendar.c - 0 - 0 - - - 11 - 215 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\calendar\lv_calendar_chinese.c - lv_calendar_chinese.c - 0 - 0 - - - 11 - 216 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\calendar\lv_calendar_header_arrow.c - lv_calendar_header_arrow.c - 0 - 0 - - - 11 - 217 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\calendar\lv_calendar_header_dropdown.c - lv_calendar_header_dropdown.c - 0 - 0 - - - 11 - 218 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\keyboard\lv_keyboard.c - lv_keyboard.c - 0 - 0 - - - 11 - 219 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\led\lv_led.c - lv_led.c - 0 - 0 - - - 11 - 220 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\widgets\win\lv_win.c - lv_win.c - 0 - 0 - - - 11 - 221 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\src\draw\sw\blend\lv_draw_sw_blend_to_rgb565.c - lv_draw_sw_blend_to_rgb565.c - 0 - 0 - - - - - Middlewares/LVGL/Port - 0 - 0 - 0 - 0 - - 12 - 222 - 1 - 0 - 0 - 0 - ..\Middlewares\LVGL\porting\lv_port_disp.c - lv_port_disp.c - 0 - 0 - - - - - Application/User/USB_DEVICE/App - 0 - 0 - 0 - 0 - - 13 - 223 - 1 - 0 - 0 - 0 - ../USB_DEVICE/App/usb_device.c - usb_device.c - 0 - 0 - - - 13 - 224 - 1 - 0 - 0 - 0 - ../USB_DEVICE/App/usbd_desc.c - usbd_desc.c - 0 - 0 - - - 13 - 225 - 1 - 0 - 0 - 0 - ../USB_DEVICE/App/usbd_cdc_if.c - usbd_cdc_if.c - 0 - 0 - - - - - Application/User/USB_DEVICE/Target - 0 - 0 - 0 - 0 - - 14 - 226 - 1 - 0 - 0 - 0 - ../USB_DEVICE/Target/usbd_conf.c - usbd_conf.c - 0 - 0 - - - - - Middlewares/USB_Device_Library - 0 - 0 - 0 - 0 - - 15 - 227 - 1 - 0 - 0 - 0 - ../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c - usbd_core.c - 0 - 0 - - - 15 - 228 - 1 - 0 - 0 - 0 - ../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c - usbd_ctlreq.c - 0 - 0 - - - 15 - 229 - 1 - 0 - 0 - 0 - ../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c - usbd_ioreq.c - 0 - 0 - - - 15 - 230 - 1 - 0 - 0 - 0 - ../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c - usbd_cdc.c - 0 - 0 - - - - - ::CMSIS - 0 - 0 - 0 - 1 - - -
diff --git a/software/Power_Pico/MDK-ARM/power_pico.uvprojx b/software/Power_Pico/MDK-ARM/power_pico.uvprojx deleted file mode 100644 index d596f73..0000000 --- a/software/Power_Pico/MDK-ARM/power_pico.uvprojx +++ /dev/null @@ -1,2814 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - power_pico - 0x4 - ARM-ADS - 5060960::V5.06 update 7 (build 960)::.\ARMCC - 0 - - - STM32F411CEUx - STMicroelectronics - Keil.STM32F4xx_DFP.2.17.1 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32F411RETx$CMSIS\Flash\STM32F4xx_512.FLM)) - 0 - $$Device:STM32F411RETx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h - - - - - - - - - - $$Device:STM32F411RETx$CMSIS\SVD\STM32F411.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - power_pico\ - power_pico - 1 - 0 - 1 - 1 - 1 - - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 1 - fromelf.exe --bin -o "$L@L.bin" "#L - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 0 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4101 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8010000 - 0x70000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 4 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 5 - 3 - 1 - 1 - 0 - 0 - 0 - - --locale=english - USE_HAL_DRIVER,STM32F411xE - - ../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Middlewares/Third_Party/FreeRTOS/Source/include;../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2;../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../BSP;../BSP/KEY;../BSP/LCD;../BSP/GATE;../BSP/BEEP;../BSP/data_queue;../BSP/PD;../BSP/EEPROM;../Middlewares/LVGL;../Middlewares/LVGL/src;../Middlewares/LVGL/porting;../User/Tasks/Inc;../User/GUI;../User/GUI/common;../USB_DEVICE/App;../USB_DEVICE/Target;../Middlewares/ST/STM32_USB_Device_Library/Core/Inc;../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - - - - - ../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Middlewares/Third_Party/FreeRTOS/Source/include;../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2;../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include - - - - 1 - 0 - 0 - 0 - 1 - 0 - - - - - - - - - - - - - - - Application/MDK-ARM - - - startup_stm32f411xe.s - 2 - startup_stm32f411xe.s - - - - - Application/User/Core - - - main.c - 1 - ../Core/Src/main.c - - - gpio.c - 1 - ../Core/Src/gpio.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - freertos.c - 1 - ../Core/Src/freertos.c - - - adc.c - 1 - ../Core/Src/adc.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - dma.c - 1 - ../Core/Src/dma.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - i2c.c - 1 - ../Core/Src/i2c.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - spi.c - 1 - ../Core/Src/spi.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - tim.c - 1 - ../Core/Src/tim.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_it.c - 1 - ../Core/Src/stm32f4xx_it.c - - - stm32f4xx_hal_msp.c - 1 - ../Core/Src/stm32f4xx_hal_msp.c - - - stm32f4xx_hal_timebase_tim.c - 1 - ../Core/Src/stm32f4xx_hal_timebase_tim.c - - - - - Application/User/Tasks - - - user_TasksInit.c - 1 - ..\User\Tasks\Src\user_TasksInit.c - - - user_HardwareInitTask.c - 1 - ..\User\Tasks\Src\user_HardwareInitTask.c - - - user_LVGLTask.c - 1 - ..\User\Tasks\Src\user_LVGLTask.c - - - user_KeyTask.c - 1 - ..\User\Tasks\Src\user_KeyTask.c - - - user_MessageTask.c - 1 - ..\User\Tasks\Src\user_MessageTask.c - - - user_PDUFPTask.c - 1 - ..\User\Tasks\Src\user_PDUFPTask.c - - - - - Application/User/GUI - - - lv_lib_pm.c - 1 - ..\User\GUI\common\lv_lib_pm.c - - - lv_lib_animation.c - 1 - ..\User\GUI\common\lv_lib_animation.c - - - lv_i18n.c - 1 - ..\User\GUI\common\lv_i18n.c - - - ui.c - 1 - ..\User\GUI\ui.c - - - ui_helpers.c - 1 - ..\User\GUI\ui_helpers.c - - - ui_StartPage.c - 1 - ..\User\GUI\screens\ui_StartPage.c - - - ui_mainPage.c - 1 - ..\User\GUI\screens\ui_mainPage.c - - - ui_ChartPage.c - 1 - ..\User\GUI\screens\ui_ChartPage.c - - - ui_SetPage.c - 1 - ..\User\GUI\screens\ui_SetPage.c - - - ui_PPSPage.c - 1 - ..\User\GUI\screens\ui_PPSPage.c - - - - - Application/User/font - - - ui_font_zhongyuan18.c - 1 - ..\User\GUI\font\ui_font_zhongyuan18.c - - - ui_font_zhongyuan20.c - 1 - ..\User\GUI\font\ui_font_zhongyuan20.c - - - ui_font_HeiTi32.c - 1 - ..\User\GUI\font\ui_font_HeiTi32.c - - - ui_font_HeiTi48.c - 1 - ..\User\GUI\font\ui_font_HeiTi48.c - - - lv_font_montserrat_14.c - 1 - ..\Middlewares\LVGL\src\font\lv_font_montserrat_14.c - - - lv_font_montserrat_16.c - 1 - ..\Middlewares\LVGL\src\font\lv_font_montserrat_16.c - - - lv_font_montserrat_18.c - 1 - ..\Middlewares\LVGL\src\font\lv_font_montserrat_18.c - - - lv_font_montserrat_28.c - 1 - ..\Middlewares\LVGL\src\font\lv_font_montserrat_28.c - - - lv_font_montserrat_20.c - 1 - ..\Middlewares\LVGL\src\font\lv_font_montserrat_20.c - - - lv_font_montserrat_22.c - 1 - ..\Middlewares\LVGL\src\font\lv_font_montserrat_22.c - - - - - Application/User/img - - - ui_img_chicken_png.c - 1 - ..\User\GUI\images\ui_img_chicken_png.c - - - - - Drivers/STM32F4xx_HAL_Driver - - - stm32f4xx_hal_tim.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c - - - stm32f4xx_hal_tim_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c - - - stm32f4xx_hal_pcd.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_hal_pcd_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_ll_usb.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_hal_rcc.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c - - - stm32f4xx_hal_rcc_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c - - - stm32f4xx_hal_flash.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c - - - stm32f4xx_hal_flash_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c - - - stm32f4xx_hal_flash_ramfunc.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c - - - stm32f4xx_hal_gpio.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c - - - stm32f4xx_hal_dma_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c - - - stm32f4xx_hal_dma.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c - - - stm32f4xx_hal_pwr.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c - - - stm32f4xx_hal_pwr_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c - - - stm32f4xx_hal_cortex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c - - - stm32f4xx_hal.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c - - - stm32f4xx_hal_exti.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c - - - stm32f4xx_hal_adc.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c - - - stm32f4xx_hal_adc_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c - - - stm32f4xx_ll_adc.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_adc.c - - - stm32f4xx_hal_i2c.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_hal_i2c_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_hal_spi.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c - - - - - Drivers/BSP - - - lcd.c - 1 - ..\BSP\LCD\lcd.c - - - lcd_init.c - 1 - ..\BSP\LCD\lcd_init.c - - - key.c - 1 - ..\BSP\KEY\key.c - - - gate.c - 1 - ..\BSP\GATE\gate.c - - - beep.c - 1 - ..\BSP\BEEP\beep.c - - - BL24C02.c - 1 - ..\BSP\EEPROM\BL24C02.c - - - FUSB302_UFP.c - 1 - ..\BSP\PD\FUSB302_UFP.c - - - PD_UFP_Protocol.c - 1 - ..\BSP\PD\PD_UFP_Protocol.c - - - fusb302_dev.c - 1 - ..\BSP\PD\fusb302_dev.c - - - - - Drivers/CMSIS - - - system_stm32f4xx.c - 1 - ../Core/Src/system_stm32f4xx.c - - - - - Middlewares/FreeRTOS - - - croutine.c - 1 - ../Middlewares/Third_Party/FreeRTOS/Source/croutine.c - - - event_groups.c - 1 - ../Middlewares/Third_Party/FreeRTOS/Source/event_groups.c - - - list.c - 1 - ../Middlewares/Third_Party/FreeRTOS/Source/list.c - - - queue.c - 1 - ../Middlewares/Third_Party/FreeRTOS/Source/queue.c - - - stream_buffer.c - 1 - ../Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c - - - tasks.c - 1 - ../Middlewares/Third_Party/FreeRTOS/Source/tasks.c - - - timers.c - 1 - ../Middlewares/Third_Party/FreeRTOS/Source/timers.c - - - cmsis_os2.c - 1 - ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c - - - heap_4.c - 1 - ../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c - - - port.c - 1 - ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c - - - - - Middlewares/LVGL/Src - - - lv_init.c - 1 - ..\Middlewares\LVGL\src\lv_init.c - - - lv_group.c - 1 - ..\Middlewares\LVGL\src\core\lv_group.c - - - lv_obj.c - 1 - ..\Middlewares\LVGL\src\core\lv_obj.c - - - lv_obj_class.c - 1 - ..\Middlewares\LVGL\src\core\lv_obj_class.c - - - lv_obj_draw.c - 1 - ..\Middlewares\LVGL\src\core\lv_obj_draw.c - - - lv_obj_event.c - 1 - ..\Middlewares\LVGL\src\core\lv_obj_event.c - - - lv_obj_id_builtin.c - 1 - ..\Middlewares\LVGL\src\core\lv_obj_id_builtin.c - - - lv_obj_pos.c - 1 - ..\Middlewares\LVGL\src\core\lv_obj_pos.c - - - lv_obj_property.c - 1 - ..\Middlewares\LVGL\src\core\lv_obj_property.c - - - lv_obj_scroll.c - 1 - ..\Middlewares\LVGL\src\core\lv_obj_scroll.c - - - lv_obj_style.c - 1 - ..\Middlewares\LVGL\src\core\lv_obj_style.c - - - lv_obj_style_gen.c - 1 - ..\Middlewares\LVGL\src\core\lv_obj_style_gen.c - - - lv_obj_tree.c - 1 - ..\Middlewares\LVGL\src\core\lv_obj_tree.c - - - lv_refr.c - 1 - ..\Middlewares\LVGL\src\core\lv_refr.c - - - lv_display.c - 1 - ..\Middlewares\LVGL\src\display\lv_display.c - - - lv_draw.c - 1 - ..\Middlewares\LVGL\src\draw\lv_draw.c - - - lv_draw_arc.c - 1 - ..\Middlewares\LVGL\src\draw\lv_draw_arc.c - - - lv_draw_buf.c - 1 - ..\Middlewares\LVGL\src\draw\lv_draw_buf.c - - - lv_draw_image.c - 1 - ..\Middlewares\LVGL\src\draw\lv_draw_image.c - - - lv_draw_label.c - 1 - ..\Middlewares\LVGL\src\draw\lv_draw_label.c - - - lv_draw_line.c - 1 - ..\Middlewares\LVGL\src\draw\lv_draw_line.c - - - lv_draw_mask.c - 1 - ..\Middlewares\LVGL\src\draw\lv_draw_mask.c - - - lv_draw_rect.c - 1 - ..\Middlewares\LVGL\src\draw\lv_draw_rect.c - - - lv_draw_triangle.c - 1 - ..\Middlewares\LVGL\src\draw\lv_draw_triangle.c - - - lv_draw_vector.c - 1 - ..\Middlewares\LVGL\src\draw\lv_draw_vector.c - - - lv_image_decoder.c - 1 - ..\Middlewares\LVGL\src\draw\lv_image_decoder.c - - - lv_font.c - 1 - ..\Middlewares\LVGL\src\font\lv_font.c - - - lv_anim.c - 1 - ..\Middlewares\LVGL\src\misc\lv_anim.c - - - lv_anim_timeline.c - 1 - ..\Middlewares\LVGL\src\misc\lv_anim_timeline.c - - - lv_area.c - 1 - ..\Middlewares\LVGL\src\misc\lv_area.c - - - lv_array.c - 1 - ..\Middlewares\LVGL\src\misc\lv_array.c - - - lv_async.c - 1 - ..\Middlewares\LVGL\src\misc\lv_async.c - - - lv_bidi.c - 1 - ..\Middlewares\LVGL\src\misc\lv_bidi.c - - - lv_color.c - 1 - ..\Middlewares\LVGL\src\misc\lv_color.c - - - lv_color_op.c - 1 - ..\Middlewares\LVGL\src\misc\lv_color_op.c - - - lv_event.c - 1 - ..\Middlewares\LVGL\src\misc\lv_event.c - - - lv_fs.c - 1 - ..\Middlewares\LVGL\src\misc\lv_fs.c - - - lv_ll.c - 1 - ..\Middlewares\LVGL\src\misc\lv_ll.c - - - lv_log.c - 1 - ..\Middlewares\LVGL\src\misc\lv_log.c - - - lv_lru.c - 1 - ..\Middlewares\LVGL\src\misc\lv_lru.c - - - lv_math.c - 1 - ..\Middlewares\LVGL\src\misc\lv_math.c - - - lv_matrix.c - 1 - ..\Middlewares\LVGL\src\misc\lv_matrix.c - - - lv_palette.c - 1 - ..\Middlewares\LVGL\src\misc\lv_palette.c - - - lv_profiler_builtin.c - 1 - ..\Middlewares\LVGL\src\misc\lv_profiler_builtin.c - - - lv_rb.c - 1 - ..\Middlewares\LVGL\src\misc\lv_rb.c - - - lv_style.c - 1 - ..\Middlewares\LVGL\src\misc\lv_style.c - - - lv_style_gen.c - 1 - ..\Middlewares\LVGL\src\misc\lv_style_gen.c - - - lv_templ.c - 1 - ..\Middlewares\LVGL\src\misc\lv_templ.c - - - lv_text.c - 1 - ..\Middlewares\LVGL\src\misc\lv_text.c - - - lv_text_ap.c - 1 - ..\Middlewares\LVGL\src\misc\lv_text_ap.c - - - lv_timer.c - 1 - ..\Middlewares\LVGL\src\misc\lv_timer.c - - - lv_utils.c - 1 - ..\Middlewares\LVGL\src\misc\lv_utils.c - - - lv_cache.c - 1 - ..\Middlewares\LVGL\src\misc\cache\lv_cache.c - - - lv_cache_entry.c - 1 - ..\Middlewares\LVGL\src\misc\cache\lv_cache_entry.c - - - lv_cache_lru_rb.c - 1 - ..\Middlewares\LVGL\src\misc\cache\lv_cache_lru_rb.c - - - lv_image_cache.c - 1 - ..\Middlewares\LVGL\src\misc\cache\lv_image_cache.c - - - lv_image_header_cache.c - 1 - ..\Middlewares\LVGL\src\misc\cache\lv_image_header_cache.c - - - lv_indev.c - 1 - ..\Middlewares\LVGL\src\indev\lv_indev.c - - - lv_indev_scroll.c - 1 - ..\Middlewares\LVGL\src\indev\lv_indev_scroll.c - - - lv_layout.c - 1 - ..\Middlewares\LVGL\src\layouts\lv_layout.c - - - lv_grid.c - 1 - ..\Middlewares\LVGL\src\layouts\grid\lv_grid.c - - - lv_flex.c - 1 - ..\Middlewares\LVGL\src\layouts\flex\lv_flex.c - - - lv_draw_sw.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw.c - - - lv_draw_sw_arc.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_arc.c - - - lv_draw_sw_border.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_border.c - - - lv_draw_sw_box_shadow.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_box_shadow.c - - - lv_draw_sw_fill.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_fill.c - - - lv_draw_sw_gradient.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_gradient.c - - - lv_draw_sw_img.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_img.c - - - lv_draw_sw_letter.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_letter.c - - - lv_draw_sw_line.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_line.c - - - lv_draw_sw_mask.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_mask.c - - - lv_draw_sw_mask_rect.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_mask_rect.c - - - lv_draw_sw_transform.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_transform.c - - - lv_draw_sw_triangle.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_triangle.c - - - lv_draw_sw_vector.c - 1 - ..\Middlewares\LVGL\src\draw\sw\lv_draw_sw_vector.c - - - lv_tick.c - 1 - ..\Middlewares\LVGL\src\tick\lv_tick.c - - - lv_theme.c - 1 - ..\Middlewares\LVGL\src\themes\lv_theme.c - - - lv_theme_simple.c - 1 - ..\Middlewares\LVGL\src\themes\simple\lv_theme_simple.c - - - lv_theme_mono.c - 1 - ..\Middlewares\LVGL\src\themes\mono\lv_theme_mono.c - - - lv_theme_default.c - 1 - ..\Middlewares\LVGL\src\themes\default\lv_theme_default.c - - - lv_mem.c - 1 - ..\Middlewares\LVGL\src\stdlib\lv_mem.c - - - lv_mem_core_builtin.c - 1 - ..\Middlewares\LVGL\src\stdlib\builtin\lv_mem_core_builtin.c - - - lv_sprintf_builtin.c - 1 - ..\Middlewares\LVGL\src\stdlib\builtin\lv_sprintf_builtin.c - - - lv_string_builtin.c - 1 - ..\Middlewares\LVGL\src\stdlib\builtin\lv_string_builtin.c - - - lv_tlsf.c - 1 - ..\Middlewares\LVGL\src\stdlib\builtin\lv_tlsf.c - - - lv_bin_decoder.c - 1 - ..\Middlewares\LVGL\src\libs\bin_decoder\lv_bin_decoder.c - - - lv_bmp.c - 1 - ..\Middlewares\LVGL\src\libs\bmp\lv_bmp.c - - - lv_ffmpeg.c - 1 - ..\Middlewares\LVGL\src\libs\ffmpeg\lv_ffmpeg.c - - - lv_freetype.c - 1 - ..\Middlewares\LVGL\src\libs\freetype\lv_freetype.c - - - lv_freetype_glyph.c - 1 - ..\Middlewares\LVGL\src\libs\freetype\lv_freetype_glyph.c - - - lv_freetype_image.c - 1 - ..\Middlewares\LVGL\src\libs\freetype\lv_freetype_image.c - - - lv_freetype_outline.c - 1 - ..\Middlewares\LVGL\src\libs\freetype\lv_freetype_outline.c - - - lv_ftsystem.c - 1 - ..\Middlewares\LVGL\src\libs\freetype\lv_ftsystem.c - - - lv_os.c - 1 - ..\Middlewares\LVGL\src\osal\lv_os.c - - - lv_animimage.c - 1 - ..\Middlewares\LVGL\src\widgets\animimage\lv_animimage.c - - - lv_arc.c - 1 - ..\Middlewares\LVGL\src\widgets\arc\lv_arc.c - - - lv_bar.c - 1 - ..\Middlewares\LVGL\src\widgets\bar\lv_bar.c - - - lv_button.c - 1 - ..\Middlewares\LVGL\src\widgets\button\lv_button.c - - - lv_buttonmatrix.c - 1 - ..\Middlewares\LVGL\src\widgets\buttonmatrix\lv_buttonmatrix.c - - - lv_canvas.c - 1 - ..\Middlewares\LVGL\src\widgets\canvas\lv_canvas.c - - - lv_chart.c - 1 - ..\Middlewares\LVGL\src\widgets\chart\lv_chart.c - - - lv_checkbox.c - 1 - ..\Middlewares\LVGL\src\widgets\checkbox\lv_checkbox.c - - - lv_dropdown.c - 1 - ..\Middlewares\LVGL\src\widgets\dropdown\lv_dropdown.c - - - lv_image.c - 1 - ..\Middlewares\LVGL\src\widgets\image\lv_image.c - - - lv_imagebutton.c - 1 - ..\Middlewares\LVGL\src\widgets\imagebutton\lv_imagebutton.c - - - lv_label.c - 1 - ..\Middlewares\LVGL\src\widgets\label\lv_label.c - - - lv_line.c - 1 - ..\Middlewares\LVGL\src\widgets\line\lv_line.c - - - lv_list.c - 1 - ..\Middlewares\LVGL\src\widgets\list\lv_list.c - - - lv_lottie.c - 1 - ..\Middlewares\LVGL\src\widgets\lottie\lv_lottie.c - - - lv_menu.c - 1 - ..\Middlewares\LVGL\src\widgets\menu\lv_menu.c - - - lv_msgbox.c - 1 - ..\Middlewares\LVGL\src\widgets\msgbox\lv_msgbox.c - - - lv_roller.c - 1 - ..\Middlewares\LVGL\src\widgets\roller\lv_roller.c - - - lv_scale.c - 1 - ..\Middlewares\LVGL\src\widgets\scale\lv_scale.c - - - lv_slider.c - 1 - ..\Middlewares\LVGL\src\widgets\slider\lv_slider.c - - - lv_span.c - 1 - ..\Middlewares\LVGL\src\widgets\span\lv_span.c - - - lv_spinbox.c - 1 - ..\Middlewares\LVGL\src\widgets\spinbox\lv_spinbox.c - - - lv_spinner.c - 1 - ..\Middlewares\LVGL\src\widgets\spinner\lv_spinner.c - - - lv_switch.c - 1 - ..\Middlewares\LVGL\src\widgets\switch\lv_switch.c - - - lv_table.c - 1 - ..\Middlewares\LVGL\src\widgets\table\lv_table.c - - - lv_tabview.c - 1 - ..\Middlewares\LVGL\src\widgets\tabview\lv_tabview.c - - - lv_textarea.c - 1 - ..\Middlewares\LVGL\src\widgets\textarea\lv_textarea.c - - - lv_tileview.c - 1 - ..\Middlewares\LVGL\src\widgets\tileview\lv_tileview.c - - - lv_binfont_loader.c - 1 - ..\Middlewares\LVGL\src\font\lv_binfont_loader.c - - - lv_font_fmt_txt.c - 1 - ..\Middlewares\LVGL\src\font\lv_font_fmt_txt.c - - - lv_cmsis_rtos2.c - 1 - ..\Middlewares\LVGL\src\osal\lv_cmsis_rtos2.c - - - lv_freertos.c - 1 - ..\Middlewares\LVGL\src\osal\lv_freertos.c - - - lv_mqx.c - 1 - ..\Middlewares\LVGL\src\osal\lv_mqx.c - - - lv_os_none.c - 1 - ..\Middlewares\LVGL\src\osal\lv_os_none.c - - - lv_draw_sw_blend.c - 1 - ..\Middlewares\LVGL\src\draw\sw\blend\lv_draw_sw_blend.c - - - lv_calendar.c - 1 - ..\Middlewares\LVGL\src\widgets\calendar\lv_calendar.c - - - lv_calendar_chinese.c - 1 - ..\Middlewares\LVGL\src\widgets\calendar\lv_calendar_chinese.c - - - lv_calendar_header_arrow.c - 1 - ..\Middlewares\LVGL\src\widgets\calendar\lv_calendar_header_arrow.c - - - lv_calendar_header_dropdown.c - 1 - ..\Middlewares\LVGL\src\widgets\calendar\lv_calendar_header_dropdown.c - - - lv_keyboard.c - 1 - ..\Middlewares\LVGL\src\widgets\keyboard\lv_keyboard.c - - - lv_led.c - 1 - ..\Middlewares\LVGL\src\widgets\led\lv_led.c - - - lv_win.c - 1 - ..\Middlewares\LVGL\src\widgets\win\lv_win.c - - - lv_draw_sw_blend_to_rgb565.c - 1 - ..\Middlewares\LVGL\src\draw\sw\blend\lv_draw_sw_blend_to_rgb565.c - - - - - Middlewares/LVGL/Port - - - lv_port_disp.c - 1 - ..\Middlewares\LVGL\porting\lv_port_disp.c - - - - - Application/User/USB_DEVICE/App - - - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 4 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 1 - - - - - - - - - - - - usb_device.c - 1 - ../USB_DEVICE/App/usb_device.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - usbd_desc.c - 1 - ../USB_DEVICE/App/usbd_desc.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - usbd_cdc_if.c - 1 - ../USB_DEVICE/App/usbd_cdc_if.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - - - Application/User/USB_DEVICE/Target - - - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 4 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 1 - - - - - - - - - - - - usbd_conf.c - 1 - ../USB_DEVICE/Target/usbd_conf.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - - - Middlewares/USB_Device_Library - - - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 4 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 1 - - - - - - - - - - - - usbd_core.c - 1 - ../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - usbd_ctlreq.c - 1 - ../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - usbd_ioreq.c - 1 - ../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - usbd_cdc.c - 1 - ../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - - - ::CMSIS - - - - - - - - - - - - - - - - - - - - - - power_pico - 1 - - - - -
diff --git a/software/Power_Pico/MDK-ARM/power_pico/power_pico.bin b/software/Power_Pico/MDK-ARM/power_pico/power_pico.bin deleted file mode 100644 index fed42a8..0000000 Binary files a/software/Power_Pico/MDK-ARM/power_pico/power_pico.bin and /dev/null differ diff --git a/software/Power_Pico/MDK-ARM/startup_stm32f411xe.s b/software/Power_Pico/MDK-ARM/startup_stm32f411xe.s deleted file mode 100644 index f42c973..0000000 --- a/software/Power_Pico/MDK-ARM/startup_stm32f411xe.s +++ /dev/null @@ -1,377 +0,0 @@ -;******************************************************************************* -;* File Name : startup_stm32f411xe.s -;* Author : MCD Application Team -;* Description : STM32F411xExx devices vector table for MDK-ARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM4 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************* -;* @attention -;* -;* Copyright (c) 2017 STMicroelectronics. -;* All rights reserved. -;* -;* This software is licensed under terms that can be found in the LICENSE file -;* in the root directory of this software component. -;* If no LICENSE file comes with this software, it is provided AS-IS. -;* -;******************************************************************************* -;* <<< Use Configuration Wizard in Context Menu >>> -; -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; Stack Configuration -; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Stack_Size EQU 0x400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; Heap Configuration -; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Heap_Size EQU 0x200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window WatchDog - DCD PVD_IRQHandler ; PVD through EXTI Line detection - DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line - DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line0 - DCD EXTI1_IRQHandler ; EXTI Line1 - DCD EXTI2_IRQHandler ; EXTI Line2 - DCD EXTI3_IRQHandler ; EXTI Line3 - DCD EXTI4_IRQHandler ; EXTI Line4 - DCD DMA1_Stream0_IRQHandler ; DMA1 Stream 0 - DCD DMA1_Stream1_IRQHandler ; DMA1 Stream 1 - DCD DMA1_Stream2_IRQHandler ; DMA1 Stream 2 - DCD DMA1_Stream3_IRQHandler ; DMA1 Stream 3 - DCD DMA1_Stream4_IRQHandler ; DMA1 Stream 4 - DCD DMA1_Stream5_IRQHandler ; DMA1 Stream 5 - DCD DMA1_Stream6_IRQHandler ; DMA1 Stream 6 - DCD ADC_IRQHandler ; ADC1, ADC2 and ADC3s - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD EXTI9_5_IRQHandler ; External Line[9:5]s - DCD TIM1_BRK_TIM9_IRQHandler ; TIM1 Break and TIM9 - DCD TIM1_UP_TIM10_IRQHandler ; TIM1 Update and TIM10 - DCD TIM1_TRG_COM_TIM11_IRQHandler ; TIM1 Trigger and Commutation and TIM11 - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM4_IRQHandler ; TIM4 - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD I2C2_EV_IRQHandler ; I2C2 Event - DCD I2C2_ER_IRQHandler ; I2C2 Error - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD 0 ; Reserved - DCD EXTI15_10_IRQHandler ; External Line[15:10]s - DCD RTC_Alarm_IRQHandler ; RTC Alarm (A and B) through EXTI Line - DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD DMA1_Stream7_IRQHandler ; DMA1 Stream7 - DCD 0 ; Reserved - DCD SDIO_IRQHandler ; SDIO - DCD TIM5_IRQHandler ; TIM5 - DCD SPI3_IRQHandler ; SPI3 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD DMA2_Stream0_IRQHandler ; DMA2 Stream 0 - DCD DMA2_Stream1_IRQHandler ; DMA2 Stream 1 - DCD DMA2_Stream2_IRQHandler ; DMA2 Stream 2 - DCD DMA2_Stream3_IRQHandler ; DMA2 Stream 3 - DCD DMA2_Stream4_IRQHandler ; DMA2 Stream 4 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD OTG_FS_IRQHandler ; USB OTG FS - DCD DMA2_Stream5_IRQHandler ; DMA2 Stream 5 - DCD DMA2_Stream6_IRQHandler ; DMA2 Stream 6 - DCD DMA2_Stream7_IRQHandler ; DMA2 Stream 7 - DCD USART6_IRQHandler ; USART6 - DCD I2C3_EV_IRQHandler ; I2C3 event - DCD I2C3_ER_IRQHandler ; I2C3 error - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD FPU_IRQHandler ; FPU - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SPI4_IRQHandler ; SPI4 - DCD SPI5_IRQHandler ; SPI5 - -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT SystemInit - IMPORT __main - - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP -BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP -UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT TAMP_STAMP_IRQHandler [WEAK] - EXPORT RTC_WKUP_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_IRQHandler [WEAK] - EXPORT EXTI1_IRQHandler [WEAK] - EXPORT EXTI2_IRQHandler [WEAK] - EXPORT EXTI3_IRQHandler [WEAK] - EXPORT EXTI4_IRQHandler [WEAK] - EXPORT DMA1_Stream0_IRQHandler [WEAK] - EXPORT DMA1_Stream1_IRQHandler [WEAK] - EXPORT DMA1_Stream2_IRQHandler [WEAK] - EXPORT DMA1_Stream3_IRQHandler [WEAK] - EXPORT DMA1_Stream4_IRQHandler [WEAK] - EXPORT DMA1_Stream5_IRQHandler [WEAK] - EXPORT DMA1_Stream6_IRQHandler [WEAK] - EXPORT ADC_IRQHandler [WEAK] - EXPORT EXTI9_5_IRQHandler [WEAK] - EXPORT TIM1_BRK_TIM9_IRQHandler [WEAK] - EXPORT TIM1_UP_TIM10_IRQHandler [WEAK] - EXPORT TIM1_TRG_COM_TIM11_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM4_IRQHandler [WEAK] - EXPORT I2C1_EV_IRQHandler [WEAK] - EXPORT I2C1_ER_IRQHandler [WEAK] - EXPORT I2C2_EV_IRQHandler [WEAK] - EXPORT I2C2_ER_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT EXTI15_10_IRQHandler [WEAK] - EXPORT RTC_Alarm_IRQHandler [WEAK] - EXPORT OTG_FS_WKUP_IRQHandler [WEAK] - EXPORT DMA1_Stream7_IRQHandler [WEAK] - EXPORT SDIO_IRQHandler [WEAK] - EXPORT TIM5_IRQHandler [WEAK] - EXPORT SPI3_IRQHandler [WEAK] - EXPORT DMA2_Stream0_IRQHandler [WEAK] - EXPORT DMA2_Stream1_IRQHandler [WEAK] - EXPORT DMA2_Stream2_IRQHandler [WEAK] - EXPORT DMA2_Stream3_IRQHandler [WEAK] - EXPORT DMA2_Stream4_IRQHandler [WEAK] - EXPORT OTG_FS_IRQHandler [WEAK] - EXPORT DMA2_Stream5_IRQHandler [WEAK] - EXPORT DMA2_Stream6_IRQHandler [WEAK] - EXPORT DMA2_Stream7_IRQHandler [WEAK] - EXPORT USART6_IRQHandler [WEAK] - EXPORT I2C3_EV_IRQHandler [WEAK] - EXPORT I2C3_ER_IRQHandler [WEAK] - EXPORT FPU_IRQHandler [WEAK] - EXPORT SPI4_IRQHandler [WEAK] - EXPORT SPI5_IRQHandler [WEAK] - -WWDG_IRQHandler -PVD_IRQHandler -TAMP_STAMP_IRQHandler -RTC_WKUP_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_IRQHandler -EXTI1_IRQHandler -EXTI2_IRQHandler -EXTI3_IRQHandler -EXTI4_IRQHandler -DMA1_Stream0_IRQHandler -DMA1_Stream1_IRQHandler -DMA1_Stream2_IRQHandler -DMA1_Stream3_IRQHandler -DMA1_Stream4_IRQHandler -DMA1_Stream5_IRQHandler -DMA1_Stream6_IRQHandler -ADC_IRQHandler -EXTI9_5_IRQHandler -TIM1_BRK_TIM9_IRQHandler -TIM1_UP_TIM10_IRQHandler -TIM1_TRG_COM_TIM11_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -TIM4_IRQHandler -I2C1_EV_IRQHandler -I2C1_ER_IRQHandler -I2C2_EV_IRQHandler -I2C2_ER_IRQHandler -SPI1_IRQHandler -SPI2_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -EXTI15_10_IRQHandler -RTC_Alarm_IRQHandler -OTG_FS_WKUP_IRQHandler -DMA1_Stream7_IRQHandler -SDIO_IRQHandler -TIM5_IRQHandler -SPI3_IRQHandler -DMA2_Stream0_IRQHandler -DMA2_Stream1_IRQHandler -DMA2_Stream2_IRQHandler -DMA2_Stream3_IRQHandler -DMA2_Stream4_IRQHandler -OTG_FS_IRQHandler -DMA2_Stream5_IRQHandler -DMA2_Stream6_IRQHandler -DMA2_Stream7_IRQHandler -USART6_IRQHandler -I2C3_EV_IRQHandler -I2C3_ER_IRQHandler -FPU_IRQHandler -SPI4_IRQHandler -SPI5_IRQHandler - - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END diff --git a/software/Power_Pico/Middlewares/LVGL/lv_conf.h b/software/Power_Pico/Middlewares/LVGL/lv_conf.h deleted file mode 100644 index 862607f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/lv_conf.h +++ /dev/null @@ -1,1127 +0,0 @@ -/** - * @file lv_conf.h - * Configuration file for v9.2.3-dev - */ - -/* - * Copy this file as `lv_conf.h` - * 1. simply next to the `lvgl` folder - * 2. or any other places and - * - define `LV_CONF_INCLUDE_SIMPLE` - * - add the path as include path - */ - -/* clang-format off */ -#if 1 /*Set it to "1" to enable content*/ - -#ifndef LV_CONF_H -#define LV_CONF_H - -/*If you need to include anything here, do it inside the `__ASSEMBLY__` guard */ -#if 0 && defined(__ASSEMBLY__) -#include "my_include.h" -#endif - -/*==================== - COLOR SETTINGS - *====================*/ - -/*Color depth: 1 (I1), 8 (L8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ -#define LV_COLOR_DEPTH 16 - -/*========================= - STDLIB WRAPPER SETTINGS - *=========================*/ - -/* Possible values - * - LV_STDLIB_BUILTIN: LVGL's built in implementation - * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc - * - LV_STDLIB_MICROPYTHON: MicroPython implementation - * - LV_STDLIB_RTTHREAD: RT-Thread implementation - * - LV_STDLIB_CUSTOM: Implement the functions externally - */ -#define LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN -#define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN -#define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN - -#define LV_STDINT_INCLUDE -#define LV_STDDEF_INCLUDE -#define LV_STDBOOL_INCLUDE -#define LV_INTTYPES_INCLUDE -#define LV_LIMITS_INCLUDE -#define LV_STDARG_INCLUDE - -#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN - /*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/ - #define LV_MEM_SIZE (64 * 1024U) /*[bytes]*/ - - /*Size of the memory expand for `lv_malloc()` in bytes*/ - #define LV_MEM_POOL_EXPAND_SIZE 0 - - /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ - #define LV_MEM_ADR 0 /*0: unused*/ - /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ - #if LV_MEM_ADR == 0 - #undef LV_MEM_POOL_INCLUDE - #undef LV_MEM_POOL_ALLOC - #endif -#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/ - -/*==================== - HAL SETTINGS - *====================*/ - -/*Default display refresh, input device read and animation step period.*/ -#define LV_DEF_REFR_PERIOD 33 /*[ms]*/ - -/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. - *(Not so important, you can adjust it to modify default sizes and spaces)*/ -#define LV_DPI_DEF 130 /*[px/inch]*/ - -/*================= - * OPERATING SYSTEM - *=================*/ -/*Select an operating system to use. Possible options: - * - LV_OS_NONE - * - LV_OS_PTHREAD - * - LV_OS_FREERTOS - * - LV_OS_CMSIS_RTOS2 - * - LV_OS_RTTHREAD - * - LV_OS_WINDOWS - * - LV_OS_MQX - * - LV_OS_CUSTOM */ -#define LV_USE_OS LV_OS_NONE - -#if LV_USE_OS == LV_OS_CUSTOM - #define LV_OS_CUSTOM_INCLUDE -#endif -#if LV_USE_OS == LV_OS_FREERTOS - /* - * Unblocking an RTOS task with a direct notification is 45% faster and uses less RAM - * than unblocking a task using an intermediary object such as a binary semaphore. - * RTOS task notifications can only be used when there is only one task that can be the recipient of the event. - */ - #define LV_USE_FREERTOS_TASK_NOTIFY 1 -#endif - -/*======================== - * RENDERING CONFIGURATION - *========================*/ - -/*Align the stride of all layers and images to this bytes*/ -#define LV_DRAW_BUF_STRIDE_ALIGN 1 - -/*Align the start address of draw_buf addresses to this bytes*/ -#define LV_DRAW_BUF_ALIGN 4 - -/*Using matrix for transformations. - *Requirements: - `LV_USE_MATRIX = 1`. - The rendering engine needs to support 3x3 matrix transformations.*/ -#define LV_DRAW_TRANSFORM_USE_MATRIX 0 - -/* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode - * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. - * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers - * and can't be drawn in chunks. */ - -/*The target buffer size for simple layer chunks.*/ -#define LV_DRAW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/ - -/* The stack size of the drawing thread. - * NOTE: If FreeType or ThorVG is enabled, it is recommended to set it to 32KB or more. - */ -#define LV_DRAW_THREAD_STACK_SIZE (8 * 1024) /*[bytes]*/ - -#define LV_USE_DRAW_SW 1 -#if LV_USE_DRAW_SW == 1 - - /* - * Selectively disable color format support in order to reduce code size. - * NOTE: some features use certain color formats internally, e.g. - * - gradients use RGB888 - * - bitmaps with transparency may use ARGB8888 - */ - - #define LV_DRAW_SW_SUPPORT_RGB565 1 - #define LV_DRAW_SW_SUPPORT_RGB565A8 1 - #define LV_DRAW_SW_SUPPORT_RGB888 0 - #define LV_DRAW_SW_SUPPORT_XRGB8888 0 - #define LV_DRAW_SW_SUPPORT_ARGB8888 0 - #define LV_DRAW_SW_SUPPORT_L8 0 - #define LV_DRAW_SW_SUPPORT_AL88 0 - #define LV_DRAW_SW_SUPPORT_A8 0 - #define LV_DRAW_SW_SUPPORT_I1 0 - - /* Set the number of draw unit. - * > 1 requires an operating system enabled in `LV_USE_OS` - * > 1 means multiple threads will render the screen in parallel */ - #define LV_DRAW_SW_DRAW_UNIT_CNT 1 - - /* Use Arm-2D to accelerate the sw render */ - #define LV_USE_DRAW_ARM2D_SYNC 0 - - /* Enable native helium assembly to be compiled */ - #define LV_USE_NATIVE_HELIUM_ASM 0 - - /* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only - * 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */ - #define LV_DRAW_SW_COMPLEX 1 - - #if LV_DRAW_SW_COMPLEX == 1 - /*Allow buffering some shadow calculation. - *LV_DRAW_SW_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` - *Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost*/ - #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 - - /* Set number of maximally cached circle data. - * The circumference of 1/4 circle are saved for anti-aliasing - * radius * 4 bytes are used per circle (the most often used radiuses are saved) - * 0: to disable caching */ - #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 - #endif - - #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE - - #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM - #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" - #endif - - /* Enable drawing complex gradients in software: linear at an angle, radial or conical */ - #define LV_USE_DRAW_SW_COMPLEX_GRADIENTS 0 -#endif - -/* Use NXP's VG-Lite GPU on iMX RTxxx platforms. */ -#define LV_USE_DRAW_VGLITE 0 - -#if LV_USE_DRAW_VGLITE - /* Enable blit quality degradation workaround recommended for screen's dimension > 352 pixels. */ - #define LV_USE_VGLITE_BLIT_SPLIT 0 - - #if LV_USE_OS - /* Use additional draw thread for VG-Lite processing.*/ - #define LV_USE_VGLITE_DRAW_THREAD 1 - - #if LV_USE_VGLITE_DRAW_THREAD - /* Enable VGLite draw async. Queue multiple tasks and flash them once to the GPU. */ - #define LV_USE_VGLITE_DRAW_ASYNC 1 - #endif - #endif - - /* Enable VGLite asserts. */ - #define LV_USE_VGLITE_ASSERT 0 -#endif - -/* Use NXP's PXP on iMX RTxxx platforms. */ -#define LV_USE_PXP 0 - -#if LV_USE_PXP - /* Use PXP for drawing.*/ - #define LV_USE_DRAW_PXP 1 - - /* Use PXP to rotate display.*/ - #define LV_USE_ROTATE_PXP 0 - - #if LV_USE_DRAW_PXP && LV_USE_OS - /* Use additional draw thread for PXP processing.*/ - #define LV_USE_PXP_DRAW_THREAD 1 - #endif - - /* Enable PXP asserts. */ - #define LV_USE_PXP_ASSERT 0 -#endif - -/* Use Renesas Dave2D on RA platforms. */ -#define LV_USE_DRAW_DAVE2D 0 - -/* Draw using cached SDL textures*/ -#define LV_USE_DRAW_SDL 0 - -/* Use VG-Lite GPU. */ -#define LV_USE_DRAW_VG_LITE 0 - -#if LV_USE_DRAW_VG_LITE - /* Enable VG-Lite custom external 'gpu_init()' function */ - #define LV_VG_LITE_USE_GPU_INIT 0 - - /* Enable VG-Lite assert. */ - #define LV_VG_LITE_USE_ASSERT 0 - - /* VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */ - #define LV_VG_LITE_FLUSH_MAX_COUNT 8 - - /* Enable border to simulate shadow - * NOTE: which usually improves performance, - * but does not guarantee the same rendering quality as the software. */ - #define LV_VG_LITE_USE_BOX_SHADOW 0 - - /* VG-Lite gradient maximum cache number. - * NOTE: The memory usage of a single gradient image is 4K bytes. - */ - #define LV_VG_LITE_GRAD_CACHE_CNT 32 - - /* VG-Lite stroke maximum cache number. - */ - #define LV_VG_LITE_STROKE_CACHE_CNT 32 - -#endif - -/*======================= - * FEATURE CONFIGURATION - *=======================*/ - -/*------------- - * Logging - *-----------*/ - -/*Enable the log module*/ -#define LV_USE_LOG 0 -#if LV_USE_LOG - - /*How important log should be added: - *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information - *LV_LOG_LEVEL_INFO Log important events - *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem - *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail - *LV_LOG_LEVEL_USER Only logs added by the user - *LV_LOG_LEVEL_NONE Do not log anything*/ - #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN - - /*1: Print the log with 'printf'; - *0: User need to register a callback with `lv_log_register_print_cb()`*/ - #define LV_LOG_PRINTF 0 - - /*Set callback to print the logs. - *E.g `my_print`. The prototype should be `void my_print(lv_log_level_t level, const char * buf)` - *Can be overwritten by `lv_log_register_print_cb`*/ - //#define LV_LOG_PRINT_CB - - /*1: Enable print timestamp; - *0: Disable print timestamp*/ - #define LV_LOG_USE_TIMESTAMP 1 - - /*1: Print file and line number of the log; - *0: Do not print file and line number of the log*/ - #define LV_LOG_USE_FILE_LINE 1 - - - /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ - #define LV_LOG_TRACE_MEM 1 - #define LV_LOG_TRACE_TIMER 1 - #define LV_LOG_TRACE_INDEV 1 - #define LV_LOG_TRACE_DISP_REFR 1 - #define LV_LOG_TRACE_EVENT 1 - #define LV_LOG_TRACE_OBJ_CREATE 1 - #define LV_LOG_TRACE_LAYOUT 1 - #define LV_LOG_TRACE_ANIM 1 - #define LV_LOG_TRACE_CACHE 1 - -#endif /*LV_USE_LOG*/ - -/*------------- - * Asserts - *-----------*/ - -/*Enable asserts if an operation is failed or an invalid data is found. - *If LV_USE_LOG is enabled an error message will be printed on failure*/ -#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ -#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ -#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ -#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ -#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ - -/*Add a custom handler when assert happens e.g. to restart the MCU*/ -#define LV_ASSERT_HANDLER_INCLUDE -#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ - -/*------------- - * Debug - *-----------*/ - -/*1: Draw random colored rectangles over the redrawn areas*/ -#define LV_USE_REFR_DEBUG 0 - -/*1: Draw a red overlay for ARGB layers and a green overlay for RGB layers*/ -#define LV_USE_LAYER_DEBUG 0 - -/*1: Draw overlays with different colors for each draw_unit's tasks. - *Also add the index number of the draw unit on white background. - *For layers add the index number of the draw unit on black background.*/ -#define LV_USE_PARALLEL_DRAW_DEBUG 0 - -/*------------- - * Others - *-----------*/ - -#define LV_ENABLE_GLOBAL_CUSTOM 0 -#if LV_ENABLE_GLOBAL_CUSTOM - /*Header to include for the custom 'lv_global' function"*/ - #define LV_GLOBAL_CUSTOM_INCLUDE -#endif - -/*Default cache size in bytes. - *Used by image decoders such as `lv_lodepng` to keep the decoded image in the memory. - *If size is not set to 0, the decoder will fail to decode when the cache is full. - *If size is 0, the cache function is not enabled and the decoded mem will be released immediately after use.*/ -#define LV_CACHE_DEF_SIZE 0 - -/*Default number of image header cache entries. The cache is used to store the headers of images - *The main logic is like `LV_CACHE_DEF_SIZE` but for image headers.*/ -#define LV_IMAGE_HEADER_CACHE_DEF_CNT 0 - -/*Number of stops allowed per gradient. Increase this to allow more stops. - *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ -#define LV_GRADIENT_MAX_STOPS 2 - -/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. - * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ -#define LV_COLOR_MIX_ROUND_OFS 0 - -/* Add 2 x 32 bit variables to each lv_obj_t to speed up getting style properties */ -#define LV_OBJ_STYLE_CACHE 0 - -/* Add `id` field to `lv_obj_t` */ -#define LV_USE_OBJ_ID 0 - -/* Automatically assign an ID when obj is created */ -#define LV_OBJ_ID_AUTO_ASSIGN LV_USE_OBJ_ID - -/*Use the builtin obj ID handler functions: -* - lv_obj_assign_id: Called when a widget is created. Use a separate counter for each widget class as an ID. -* - lv_obj_id_compare: Compare the ID to decide if it matches with a requested value. -* - lv_obj_stringify_id: Return e.g. "button3" -* - lv_obj_free_id: Does nothing, as there is no memory allocation for the ID. -* When disabled these functions needs to be implemented by the user.*/ -#define LV_USE_OBJ_ID_BUILTIN 1 - -/*Use obj property set/get API*/ -#define LV_USE_OBJ_PROPERTY 0 - -/*Enable property name support*/ -#define LV_USE_OBJ_PROPERTY_NAME 1 - -/* VG-Lite Simulator */ -/*Requires: LV_USE_THORVG_INTERNAL or LV_USE_THORVG_EXTERNAL */ -#define LV_USE_VG_LITE_THORVG 0 - -#if LV_USE_VG_LITE_THORVG - - /*Enable LVGL's blend mode support*/ - #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT 0 - - /*Enable YUV color format support*/ - #define LV_VG_LITE_THORVG_YUV_SUPPORT 0 - - /*Enable Linear gradient extension support*/ - #define LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT 0 - - /*Enable 16 pixels alignment*/ - #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 - - /*Buffer address alignment*/ - #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64 - - /*Enable multi-thread render*/ - #define LV_VG_LITE_THORVG_THREAD_RENDER 0 - -#endif - -/*===================== - * COMPILER SETTINGS - *====================*/ - -/*For big endian systems set to 1*/ -#define LV_BIG_ENDIAN_SYSTEM 0 - -/*Define a custom attribute to `lv_tick_inc` function*/ -#define LV_ATTRIBUTE_TICK_INC - -/*Define a custom attribute to `lv_timer_handler` function*/ -#define LV_ATTRIBUTE_TIMER_HANDLER - -/*Define a custom attribute to `lv_display_flush_ready` function*/ -#define LV_ATTRIBUTE_FLUSH_READY - -/*Required alignment size for buffers*/ -#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 - -/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). - * E.g. __attribute__((aligned(4)))*/ -#define LV_ATTRIBUTE_MEM_ALIGN - -/*Attribute to mark large constant arrays for example font's bitmaps*/ -#define LV_ATTRIBUTE_LARGE_CONST - -/*Compiler prefix for a big array declaration in RAM*/ -#define LV_ATTRIBUTE_LARGE_RAM_ARRAY - -/*Place performance critical functions into a faster memory (e.g RAM)*/ -#define LV_ATTRIBUTE_FAST_MEM - -/*Export integer constant to binding. This macro is used with constants in the form of LV_ that - *should also appear on LVGL binding API such as MicroPython.*/ -#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ - -/*Prefix all global extern data with this*/ -#define LV_ATTRIBUTE_EXTERN_DATA - -/* Use `float` as `lv_value_precise_t` */ -#define LV_USE_FLOAT 0 - -/*Enable matrix support - *Requires `LV_USE_FLOAT = 1`*/ -#define LV_USE_MATRIX 0 - -/*Include `lvgl_private.h` in `lvgl.h` to access internal data and functions by default*/ -#define LV_USE_PRIVATE_API 0 - -/*================== - * FONT USAGE - *===================*/ - -/*Montserrat fonts with ASCII range and some symbols using bpp = 4 - *https://fonts.google.com/specimen/Montserrat*/ -#define LV_FONT_MONTSERRAT_8 0 -#define LV_FONT_MONTSERRAT_10 0 -#define LV_FONT_MONTSERRAT_12 0 -#define LV_FONT_MONTSERRAT_14 1 -#define LV_FONT_MONTSERRAT_16 1 -#define LV_FONT_MONTSERRAT_18 1 -#define LV_FONT_MONTSERRAT_20 1 -#define LV_FONT_MONTSERRAT_22 1 -#define LV_FONT_MONTSERRAT_24 0 -#define LV_FONT_MONTSERRAT_26 0 -#define LV_FONT_MONTSERRAT_28 1 -#define LV_FONT_MONTSERRAT_30 0 -#define LV_FONT_MONTSERRAT_32 0 -#define LV_FONT_MONTSERRAT_34 0 -#define LV_FONT_MONTSERRAT_36 0 -#define LV_FONT_MONTSERRAT_38 0 -#define LV_FONT_MONTSERRAT_40 0 -#define LV_FONT_MONTSERRAT_42 0 -#define LV_FONT_MONTSERRAT_44 0 -#define LV_FONT_MONTSERRAT_46 0 -#define LV_FONT_MONTSERRAT_48 0 - -/*Demonstrate special features*/ -#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ -#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ -#define LV_FONT_SIMSUN_14_CJK 0 /*1000 most common CJK radicals*/ -#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ - -/*Pixel perfect monospace fonts*/ -#define LV_FONT_UNSCII_8 0 -#define LV_FONT_UNSCII_16 0 - -/*Optionally declare custom fonts here. - *You can use these fonts as default font too and they will be available globally. - *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ -#define LV_FONT_CUSTOM_DECLARE - -/*Always set a default font*/ -#define LV_FONT_DEFAULT &lv_font_montserrat_14 - -/*Enable handling large font and/or fonts with a lot of characters. - *The limit depends on the font size, font face and bpp. - *Compiler error will be triggered if a font needs it.*/ -#define LV_FONT_FMT_TXT_LARGE 0 - -/*Enables/disables support for compressed fonts.*/ -#define LV_USE_FONT_COMPRESSED 0 - -/*Enable drawing placeholders when glyph dsc is not found*/ -#define LV_USE_FONT_PLACEHOLDER 1 - -/*================= - * TEXT SETTINGS - *=================*/ - -/** - * Select a character encoding for strings. - * Your IDE or editor should have the same character encoding - * - LV_TXT_ENC_UTF8 - * - LV_TXT_ENC_ASCII - */ -#define LV_TXT_ENC LV_TXT_ENC_UTF8 - -/*Can break (wrap) texts on these chars*/ -#define LV_TXT_BREAK_CHARS " ,.;:-_)]}" - -/*If a word is at least this long, will break wherever "prettiest" - *To disable, set to a value <= 0*/ -#define LV_TXT_LINE_BREAK_LONG_LEN 0 - -/*Minimum number of characters in a long word to put on a line before a break. - *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ -#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 - -/*Minimum number of characters in a long word to put on a line after a break. - *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ -#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 - -/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. - *The direction will be processed according to the Unicode Bidirectional Algorithm: - *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ -#define LV_USE_BIDI 0 -#if LV_USE_BIDI - /*Set the default direction. Supported values: - *`LV_BASE_DIR_LTR` Left-to-Right - *`LV_BASE_DIR_RTL` Right-to-Left - *`LV_BASE_DIR_AUTO` detect texts base direction*/ - #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO -#endif - -/*Enable Arabic/Persian processing - *In these languages characters should be replaced with another form based on their position in the text*/ -#define LV_USE_ARABIC_PERSIAN_CHARS 0 - -/*================== - * WIDGETS - *================*/ - -/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ - -#define LV_WIDGETS_HAS_DEFAULT_VALUE 1 - -#define LV_USE_ANIMIMG 1 - -#define LV_USE_ARC 1 - -#define LV_USE_BAR 1 - -#define LV_USE_BUTTON 1 - -#define LV_USE_BUTTONMATRIX 1 - -#define LV_USE_CALENDAR 1 -#if LV_USE_CALENDAR - #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 - #if LV_CALENDAR_WEEK_STARTS_MONDAY - #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} - #else - #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} - #endif - - #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} - #define LV_USE_CALENDAR_HEADER_ARROW 1 - #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 - #define LV_USE_CALENDAR_CHINESE 0 -#endif /*LV_USE_CALENDAR*/ - -#define LV_USE_CANVAS 1 - -#define LV_USE_CHART 1 - -#define LV_USE_CHECKBOX 1 - -#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ - -#define LV_USE_IMAGE 1 /*Requires: lv_label*/ - -#define LV_USE_IMAGEBUTTON 1 - -#define LV_USE_KEYBOARD 1 - -#define LV_USE_LABEL 1 -#if LV_USE_LABEL - #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ - #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ - #define LV_LABEL_WAIT_CHAR_COUNT 3 /*The count of wait chart*/ -#endif - -#define LV_USE_LED 1 - -#define LV_USE_LINE 1 - -#define LV_USE_LIST 1 - -#define LV_USE_LOTTIE 0 /*Requires: lv_canvas, thorvg */ - -#define LV_USE_MENU 1 - -#define LV_USE_MSGBOX 1 - -#define LV_USE_ROLLER 1 /*Requires: lv_label*/ - -#define LV_USE_SCALE 1 - -#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ - -#define LV_USE_SPAN 1 -#if LV_USE_SPAN - /*A line text can contain maximum num of span descriptor */ - #define LV_SPAN_SNIPPET_STACK_SIZE 64 -#endif - -#define LV_USE_SPINBOX 1 - -#define LV_USE_SPINNER 1 - -#define LV_USE_SWITCH 1 - -#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ -#if LV_USE_TEXTAREA != 0 - #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ -#endif - -#define LV_USE_TABLE 1 - -#define LV_USE_TABVIEW 1 - -#define LV_USE_TILEVIEW 1 - -#define LV_USE_WIN 1 - -/*================== - * THEMES - *==================*/ - -/*A simple, impressive and very complete theme*/ -#define LV_USE_THEME_DEFAULT 1 -#if LV_USE_THEME_DEFAULT - - /*0: Light mode; 1: Dark mode*/ - #define LV_THEME_DEFAULT_DARK 0 - - /*1: Enable grow on press*/ - #define LV_THEME_DEFAULT_GROW 1 - - /*Default transition time in [ms]*/ - #define LV_THEME_DEFAULT_TRANSITION_TIME 80 -#endif /*LV_USE_THEME_DEFAULT*/ - -/*A very simple theme that is a good starting point for a custom theme*/ -#define LV_USE_THEME_SIMPLE 1 - -/*A theme designed for monochrome displays*/ -#define LV_USE_THEME_MONO 1 - -/*================== - * LAYOUTS - *==================*/ - -/*A layout similar to Flexbox in CSS.*/ -#define LV_USE_FLEX 1 - -/*A layout similar to Grid in CSS.*/ -#define LV_USE_GRID 1 - -/*==================== - * 3RD PARTS LIBRARIES - *====================*/ - -/*File system interfaces for common APIs */ - -/*Setting a default driver letter allows skipping the driver prefix in filepaths*/ -#define LV_FS_DEFAULT_DRIVE_LETTER '\0' - -/*API for fopen, fread, etc*/ -#define LV_USE_FS_STDIO 0 -#if LV_USE_FS_STDIO - #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ - #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ -#endif - -/*API for open, read, etc*/ -#define LV_USE_FS_POSIX 0 -#if LV_USE_FS_POSIX - #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ - #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ -#endif - -/*API for CreateFile, ReadFile, etc*/ -#define LV_USE_FS_WIN32 0 -#if LV_USE_FS_WIN32 - #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ - #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ -#endif - -/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ -#define LV_USE_FS_FATFS 0 -#if LV_USE_FS_FATFS - #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ -#endif - -/*API for memory-mapped file access. */ -#define LV_USE_FS_MEMFS 0 -#if LV_USE_FS_MEMFS - #define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ -#endif - -/*API for LittleFs. */ -#define LV_USE_FS_LITTLEFS 0 -#if LV_USE_FS_LITTLEFS - #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ -#endif - -/*API for Arduino LittleFs. */ -#define LV_USE_FS_ARDUINO_ESP_LITTLEFS 0 -#if LV_USE_FS_ARDUINO_ESP_LITTLEFS - #define LV_FS_ARDUINO_ESP_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ -#endif - -/*API for Arduino Sd. */ -#define LV_USE_FS_ARDUINO_SD 0 -#if LV_USE_FS_ARDUINO_SD - #define LV_FS_ARDUINO_SD_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ -#endif - -/*LODEPNG decoder library*/ -#define LV_USE_LODEPNG 0 - -/*PNG decoder(libpng) library*/ -#define LV_USE_LIBPNG 0 - -/*BMP decoder library*/ -#define LV_USE_BMP 0 - -/* JPG + split JPG decoder library. - * Split JPG is a custom format optimized for embedded systems. */ -#define LV_USE_TJPGD 0 - -/* libjpeg-turbo decoder library. - * Supports complete JPEG specifications and high-performance JPEG decoding. */ -#define LV_USE_LIBJPEG_TURBO 0 - -/*GIF decoder library*/ -#define LV_USE_GIF 0 -#if LV_USE_GIF - /*GIF decoder accelerate*/ - #define LV_GIF_CACHE_DECODE_DATA 0 -#endif - - -/*Decode bin images to RAM*/ -#define LV_BIN_DECODER_RAM_LOAD 0 - -/*RLE decompress library*/ -#define LV_USE_RLE 0 - -/*QR code library*/ -#define LV_USE_QRCODE 0 - -/*Barcode code library*/ -#define LV_USE_BARCODE 0 - -/*FreeType library*/ -#define LV_USE_FREETYPE 0 -#if LV_USE_FREETYPE - /*Let FreeType to use LVGL memory and file porting*/ - #define LV_FREETYPE_USE_LVGL_PORT 0 - - /*Cache count of the glyphs in FreeType. It means the number of glyphs that can be cached. - *The higher the value, the more memory will be used.*/ - #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 -#endif - -/* Built-in TTF decoder */ -#define LV_USE_TINY_TTF 0 -#if LV_USE_TINY_TTF - /* Enable loading TTF data from files */ - #define LV_TINY_TTF_FILE_SUPPORT 0 - #define LV_TINY_TTF_CACHE_GLYPH_CNT 256 -#endif - -/*Rlottie library*/ -#define LV_USE_RLOTTIE 0 - -/*Enable Vector Graphic APIs - *Requires `LV_USE_MATRIX = 1`*/ -#define LV_USE_VECTOR_GRAPHIC 0 - -/* Enable ThorVG (vector graphics library) from the src/libs folder */ -#define LV_USE_THORVG_INTERNAL 0 - -/* Enable ThorVG by assuming that its installed and linked to the project */ -#define LV_USE_THORVG_EXTERNAL 0 - -/*Use lvgl built-in LZ4 lib*/ -#define LV_USE_LZ4_INTERNAL 0 - -/*Use external LZ4 library*/ -#define LV_USE_LZ4_EXTERNAL 0 - -/*FFmpeg library for image decoding and playing videos - *Supports all major image formats so do not enable other image decoder with it*/ -#define LV_USE_FFMPEG 0 -#if LV_USE_FFMPEG - /*Dump input information to stderr*/ - #define LV_FFMPEG_DUMP_FORMAT 0 -#endif - -/*================== - * OTHERS - *==================*/ - -/*1: Enable API to take snapshot for object*/ -#define LV_USE_SNAPSHOT 0 - -/*1: Enable system monitor component*/ -#define LV_USE_SYSMON 0 -#if LV_USE_SYSMON - /*Get the idle percentage. E.g. uint32_t my_get_idle(void);*/ - #define LV_SYSMON_GET_IDLE lv_timer_get_idle - - /*1: Show CPU usage and FPS count - * Requires `LV_USE_SYSMON = 1`*/ - #define LV_USE_PERF_MONITOR 0 - #if LV_USE_PERF_MONITOR - #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT - - /*0: Displays performance data on the screen, 1: Prints performance data using log.*/ - #define LV_USE_PERF_MONITOR_LOG_MODE 0 - #endif - - /*1: Show the used memory and the memory fragmentation - * Requires `LV_USE_STDLIB_MALLOC = LV_STDLIB_BUILTIN` - * Requires `LV_USE_SYSMON = 1`*/ - #define LV_USE_MEM_MONITOR 0 - #if LV_USE_MEM_MONITOR - #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT - #endif - -#endif /*LV_USE_SYSMON*/ - -/*1: Enable the runtime performance profiler*/ -#define LV_USE_PROFILER 0 -#if LV_USE_PROFILER - /*1: Enable the built-in profiler*/ - #define LV_USE_PROFILER_BUILTIN 1 - #if LV_USE_PROFILER_BUILTIN - /*Default profiler trace buffer size*/ - #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /*[bytes]*/ - #endif - - /*Header to include for the profiler*/ - #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" - - /*Profiler start point function*/ - #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN - - /*Profiler end point function*/ - #define LV_PROFILER_END LV_PROFILER_BUILTIN_END - - /*Profiler start point function with custom tag*/ - #define LV_PROFILER_BEGIN_TAG LV_PROFILER_BUILTIN_BEGIN_TAG - - /*Profiler end point function with custom tag*/ - #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG -#endif - -/*1: Enable Monkey test*/ -#define LV_USE_MONKEY 0 - -/*1: Enable grid navigation*/ -#define LV_USE_GRIDNAV 0 - -/*1: Enable lv_obj fragment*/ -#define LV_USE_FRAGMENT 0 - -/*1: Support using images as font in label or span widgets */ -#define LV_USE_IMGFONT 0 - -/*1: Enable an observer pattern implementation*/ -#define LV_USE_OBSERVER 1 - -/*1: Enable Pinyin input method*/ -/*Requires: lv_keyboard*/ -#define LV_USE_IME_PINYIN 0 -#if LV_USE_IME_PINYIN - /*1: Use default thesaurus*/ - /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesaurus*/ - #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 - /*Set the maximum number of candidate panels that can be displayed*/ - /*This needs to be adjusted according to the size of the screen*/ - #define LV_IME_PINYIN_CAND_TEXT_NUM 6 - - /*Use 9 key input(k9)*/ - #define LV_IME_PINYIN_USE_K9_MODE 1 - #if LV_IME_PINYIN_USE_K9_MODE == 1 - #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 - #endif /*LV_IME_PINYIN_USE_K9_MODE*/ -#endif - -/*1: Enable file explorer*/ -/*Requires: lv_table*/ -#define LV_USE_FILE_EXPLORER 0 -#if LV_USE_FILE_EXPLORER - /*Maximum length of path*/ - #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) - /*Quick access bar, 1:use, 0:not use*/ - /*Requires: lv_list*/ - #define LV_FILE_EXPLORER_QUICK_ACCESS 1 -#endif - -/*================== - * DEVICES - *==================*/ - -/*Use SDL to open window on PC and handle mouse and keyboard*/ -#define LV_USE_SDL 0 -#if LV_USE_SDL - #define LV_SDL_INCLUDE_PATH - #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/ - #define LV_SDL_BUF_COUNT 1 /*1 or 2*/ - #define LV_SDL_ACCELERATED 1 /*1: Use hardware acceleration*/ - #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/ - #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/ - #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/ -#endif - -/*Use X11 to open window on Linux desktop and handle mouse and keyboard*/ -#define LV_USE_X11 0 -#if LV_USE_X11 - #define LV_X11_DIRECT_EXIT 1 /*Exit the application when all X11 windows have been closed*/ - #define LV_X11_DOUBLE_BUFFER 1 /*Use double buffers for rendering*/ - /*select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!)*/ - #define LV_X11_RENDER_MODE_PARTIAL 1 /*Partial render mode (preferred)*/ - #define LV_X11_RENDER_MODE_DIRECT 0 /*direct render mode*/ - #define LV_X11_RENDER_MODE_FULL 0 /*Full render mode*/ -#endif - -/*Use Wayland to open a window and handle input on Linux or BSD desktops */ -#define LV_USE_WAYLAND 0 -#if LV_USE_WAYLAND - #define LV_WAYLAND_WINDOW_DECORATIONS 0 /*Draw client side window decorations only necessary on Mutter/GNOME*/ - #define LV_WAYLAND_WL_SHELL 0 /*Use the legacy wl_shell protocol instead of the default XDG shell*/ -#endif - -/*Driver for /dev/fb*/ -#define LV_USE_LINUX_FBDEV 0 -#if LV_USE_LINUX_FBDEV - #define LV_LINUX_FBDEV_BSD 0 - #define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL - #define LV_LINUX_FBDEV_BUFFER_COUNT 0 - #define LV_LINUX_FBDEV_BUFFER_SIZE 60 -#endif - -/*Use Nuttx to open window and handle touchscreen*/ -#define LV_USE_NUTTX 0 - -#if LV_USE_NUTTX - #define LV_USE_NUTTX_LIBUV 0 - - /*Use Nuttx custom init API to open window and handle touchscreen*/ - #define LV_USE_NUTTX_CUSTOM_INIT 0 - - /*Driver for /dev/lcd*/ - #define LV_USE_NUTTX_LCD 0 - #if LV_USE_NUTTX_LCD - #define LV_NUTTX_LCD_BUFFER_COUNT 0 - #define LV_NUTTX_LCD_BUFFER_SIZE 60 - #endif - - /*Driver for /dev/input*/ - #define LV_USE_NUTTX_TOUCHSCREEN 0 - -#endif - -/*Driver for /dev/dri/card*/ -#define LV_USE_LINUX_DRM 0 - -/*Interface for TFT_eSPI*/ -#define LV_USE_TFT_ESPI 0 - -/*Driver for evdev input devices*/ -#define LV_USE_EVDEV 0 - -/*Driver for libinput input devices*/ -#define LV_USE_LIBINPUT 0 - -#if LV_USE_LIBINPUT - #define LV_LIBINPUT_BSD 0 - - /*Full keyboard support*/ - #define LV_LIBINPUT_XKB 0 - #if LV_LIBINPUT_XKB - /*"setxkbmap -query" can help find the right values for your keyboard*/ - #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL } - #endif -#endif - -/*Drivers for LCD devices connected via SPI/parallel port*/ -#define LV_USE_ST7735 0 -#define LV_USE_ST7789 0 -#define LV_USE_ST7796 0 -#define LV_USE_ILI9341 0 - -#define LV_USE_GENERIC_MIPI (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341) - -/*Driver for Renesas GLCD*/ -#define LV_USE_RENESAS_GLCDC 0 - -/* LVGL Windows backend */ -#define LV_USE_WINDOWS 0 - -/* Use OpenGL to open window on PC and handle mouse and keyboard */ -#define LV_USE_OPENGLES 0 -#if LV_USE_OPENGLES - #define LV_USE_OPENGLES_DEBUG 1 /* Enable or disable debug for opengles */ -#endif - -/* QNX Screen display and input drivers */ -#define LV_USE_QNX 0 -#if LV_USE_QNX - #define LV_QNX_BUF_COUNT 1 /*1 or 2*/ -#endif - -/*================== -* EXAMPLES -*==================*/ - -/*Enable the examples to be built with the library*/ -#define LV_BUILD_EXAMPLES 1 - -/*=================== - * DEMO USAGE - ====================*/ - -/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ -#define LV_USE_DEMO_WIDGETS 0 - -/*Demonstrate the usage of encoder and keyboard*/ -#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 - -/*Benchmark your system*/ -#define LV_USE_DEMO_BENCHMARK 0 - -/*Render test for each primitives. Requires at least 480x272 display*/ -#define LV_USE_DEMO_RENDER 0 - -/*Stress test for LVGL*/ -#define LV_USE_DEMO_STRESS 0 - -/*Music player demo*/ -#define LV_USE_DEMO_MUSIC 0 -#if LV_USE_DEMO_MUSIC - #define LV_DEMO_MUSIC_SQUARE 0 - #define LV_DEMO_MUSIC_LANDSCAPE 0 - #define LV_DEMO_MUSIC_ROUND 0 - #define LV_DEMO_MUSIC_LARGE 0 - #define LV_DEMO_MUSIC_AUTO_PLAY 0 -#endif - -/*Flex layout demo*/ -#define LV_USE_DEMO_FLEX_LAYOUT 0 - -/*Smart-phone like multi-language demo*/ -#define LV_USE_DEMO_MULTILANG 0 - -/*Widget transformation demo*/ -#define LV_USE_DEMO_TRANSFORM 0 - -/*Demonstrate scroll settings*/ -#define LV_USE_DEMO_SCROLL 0 - -/*Vector graphic demo*/ -#define LV_USE_DEMO_VECTOR_GRAPHIC 0 - -/*--END OF LV_CONF_H--*/ - -#endif /*LV_CONF_H*/ - -#endif /*End of "Content enable"*/ diff --git a/software/Power_Pico/Middlewares/LVGL/lv_version.h b/software/Power_Pico/Middlewares/LVGL/lv_version.h deleted file mode 100644 index 98416cc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/lv_version.h +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @file lv_version.h - * The current version of LVGL - */ - -#ifndef LVGL_VERSION_H -#define LVGL_VERSION_H - -#define LVGL_VERSION_MAJOR 9 -#define LVGL_VERSION_MINOR 2 -#define LVGL_VERSION_PATCH 3 -#define LVGL_VERSION_INFO "dev" - -#endif /* LVGL_VERSION_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/lvgl.h b/software/Power_Pico/Middlewares/LVGL/lvgl.h deleted file mode 100644 index df6140e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/lvgl.h +++ /dev/null @@ -1,194 +0,0 @@ -/** - * @file lvgl.h - * Include all LVGL related headers - */ - -#ifndef LVGL_H -#define LVGL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************** - * CURRENT VERSION OF LVGL - ***************************/ -#include "lv_version.h" - -/********************* - * INCLUDES - *********************/ -#include "src/lv_init.h" - -#include "src/stdlib/lv_mem.h" -#include "src/stdlib/lv_string.h" -#include "src/stdlib/lv_sprintf.h" - -#include "src/misc/lv_log.h" -#include "src/misc/lv_timer.h" -#include "src/misc/lv_math.h" -#include "src/misc/lv_array.h" -#include "src/misc/lv_async.h" -#include "src/misc/lv_anim_timeline.h" -#include "src/misc/lv_profiler_builtin.h" -#include "src/misc/lv_rb.h" -#include "src/misc/lv_utils.h" - -#include "src/tick/lv_tick.h" - -#include "src/core/lv_obj.h" -#include "src/core/lv_group.h" -#include "src/indev/lv_indev.h" -#include "src/core/lv_refr.h" -#include "src/display/lv_display.h" - -#include "src/font/lv_font.h" -#include "src/font/lv_binfont_loader.h" -#include "src/font/lv_font_fmt_txt.h" - -#include "src/widgets/animimage/lv_animimage.h" -#include "src/widgets/arc/lv_arc.h" -#include "src/widgets/bar/lv_bar.h" -#include "src/widgets/button/lv_button.h" -#include "src/widgets/buttonmatrix/lv_buttonmatrix.h" -#include "src/widgets/calendar/lv_calendar.h" -#include "src/widgets/canvas/lv_canvas.h" -#include "src/widgets/chart/lv_chart.h" -#include "src/widgets/checkbox/lv_checkbox.h" -#include "src/widgets/dropdown/lv_dropdown.h" -#include "src/widgets/image/lv_image.h" -#include "src/widgets/imagebutton/lv_imagebutton.h" -#include "src/widgets/keyboard/lv_keyboard.h" -#include "src/widgets/label/lv_label.h" -#include "src/widgets/led/lv_led.h" -#include "src/widgets/line/lv_line.h" -#include "src/widgets/list/lv_list.h" -#include "src/widgets/lottie/lv_lottie.h" -#include "src/widgets/menu/lv_menu.h" -#include "src/widgets/msgbox/lv_msgbox.h" -#include "src/widgets/roller/lv_roller.h" -#include "src/widgets/scale/lv_scale.h" -#include "src/widgets/slider/lv_slider.h" -#include "src/widgets/span/lv_span.h" -#include "src/widgets/spinbox/lv_spinbox.h" -#include "src/widgets/spinner/lv_spinner.h" -#include "src/widgets/switch/lv_switch.h" -#include "src/widgets/table/lv_table.h" -#include "src/widgets/tabview/lv_tabview.h" -#include "src/widgets/textarea/lv_textarea.h" -#include "src/widgets/tileview/lv_tileview.h" -#include "src/widgets/win/lv_win.h" - -#include "src/others/snapshot/lv_snapshot.h" -#include "src/others/sysmon/lv_sysmon.h" -#include "src/others/monkey/lv_monkey.h" -#include "src/others/gridnav/lv_gridnav.h" -#include "src/others/fragment/lv_fragment.h" -#include "src/others/imgfont/lv_imgfont.h" -#include "src/others/observer/lv_observer.h" -#include "src/others/ime/lv_ime_pinyin.h" -#include "src/others/file_explorer/lv_file_explorer.h" - -#include "src/libs/barcode/lv_barcode.h" -#include "src/libs/bin_decoder/lv_bin_decoder.h" -#include "src/libs/bmp/lv_bmp.h" -#include "src/libs/rle/lv_rle.h" -#include "src/libs/fsdrv/lv_fsdrv.h" -#include "src/libs/lodepng/lv_lodepng.h" -#include "src/libs/libpng/lv_libpng.h" -#include "src/libs/gif/lv_gif.h" -#include "src/libs/qrcode/lv_qrcode.h" -#include "src/libs/tjpgd/lv_tjpgd.h" -#include "src/libs/libjpeg_turbo/lv_libjpeg_turbo.h" -#include "src/libs/freetype/lv_freetype.h" -#include "src/libs/rlottie/lv_rlottie.h" -#include "src/libs/ffmpeg/lv_ffmpeg.h" -#include "src/libs/tiny_ttf/lv_tiny_ttf.h" - -#include "src/layouts/lv_layout.h" - -#include "src/draw/lv_draw.h" -#include "src/draw/lv_draw_buf.h" -#include "src/draw/lv_draw_vector.h" -#include "src/draw/sw/lv_draw_sw.h" - -#include "src/themes/lv_theme.h" - -#include "src/drivers/lv_drivers.h" - -#include "src/lv_api_map_v8.h" -#include "src/lv_api_map_v9_0.h" -#include "src/lv_api_map_v9_1.h" - -#if LV_USE_PRIVATE_API -#include "src/lvgl_private.h" -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -/** Gives 1 if the x.y.z version is supported in the current version - * Usage: - * - * - Require v6 - * #if LV_VERSION_CHECK(6,0,0) - * new_func_in_v6(); - * #endif - * - * - * - Require at least v5.3 - * #if LV_VERSION_CHECK(5,3,0) - * new_feature_from_v5_3(); - * #endif - * - * - * - Require v5.3.2 bugfixes - * #if LV_VERSION_CHECK(5,3,2) - * bugfix_in_v5_3_2(); - * #endif - * - */ -#define LV_VERSION_CHECK(x,y,z) (x == LVGL_VERSION_MAJOR && (y < LVGL_VERSION_MINOR || (y == LVGL_VERSION_MINOR && z <= LVGL_VERSION_PATCH))) - -/** - * Wrapper functions for VERSION macros - */ - -static inline int lv_version_major(void) -{ - return LVGL_VERSION_MAJOR; -} - -static inline int lv_version_minor(void) -{ - return LVGL_VERSION_MINOR; -} - -static inline int lv_version_patch(void) -{ - return LVGL_VERSION_PATCH; -} - -static inline const char * lv_version_info(void) -{ - return LVGL_VERSION_INFO; -} - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LVGL_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/porting/lv_port_disp.c b/software/Power_Pico/Middlewares/LVGL/porting/lv_port_disp.c deleted file mode 100644 index 39db2cd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/porting/lv_port_disp.c +++ /dev/null @@ -1,169 +0,0 @@ -/** - * @file lv_port_disp_templ.c - * - */ - -/*Copy this file as "lv_port_disp.c" and set this value to "1" to enable content*/ -#if 1 - -/********************* - * INCLUDES - *********************/ -#include "lv_port_disp.h" -#include - -// lcd -#include "lcd.h" -#include "lcd_init.h" - -/********************* - * DEFINES - *********************/ -#ifndef MY_DISP_HOR_RES - #warning Please define or replace the macro MY_DISP_HOR_RES with the actual screen width, default value 320 is used for now. - #define MY_DISP_HOR_RES 240 -#endif - -#ifndef MY_DISP_VER_RES - #warning Please define or replace the macro MY_DISP_VER_RES with the actual screen height, default value 240 is used for now. - #define MY_DISP_VER_RES 240 -#endif - -#define BYTE_PER_PIXEL (LV_COLOR_FORMAT_GET_SIZE(LV_COLOR_FORMAT_RGB565)) /*will be 2 for RGB565 */ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void disp_init(void); - -static void disp_flush(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); - -/********************** - * STATIC VARIABLES - **********************/ - -// 1. 定义一个静态变量来保存当前的 driver 句柄 -static lv_display_t *g_current_disp_drv = NULL; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_port_disp_init(void) -{ - /*------------------------- - * Initialize your display - * -----------------------*/ - disp_init(); - - /*------------------------------------ - * Create a display and set a flush_cb - * -----------------------------------*/ - lv_display_t * disp = lv_display_create(MY_DISP_HOR_RES, MY_DISP_VER_RES); - lv_display_set_flush_cb(disp, disp_flush); - g_current_disp_drv = disp; -#define BUFFER_METHOD 1 -#if BUFFER_METHOD == 1 - /* Example 1 - * One buffer for partial rendering*/ - LV_ATTRIBUTE_MEM_ALIGN - static uint8_t buf_1_1[MY_DISP_HOR_RES * MY_DISP_VER_RES / 4 * BYTE_PER_PIXEL]; - lv_display_set_buffers(disp, buf_1_1, NULL, sizeof(buf_1_1), LV_DISPLAY_RENDER_MODE_PARTIAL); -#elif BUFFER_METHOD == 2 - - /* Example 2 - * Two buffers for partial rendering - * In flush_cb DMA or similar hardware should be used to update the display in the background.*/ - LV_ATTRIBUTE_MEM_ALIGN - static uint8_t buf_2_1[MY_DISP_HOR_RES * MY_DISP_VER_RES / 8 * BYTE_PER_PIXEL]; - - LV_ATTRIBUTE_MEM_ALIGN - static uint8_t buf_2_2[MY_DISP_HOR_RES * MY_DISP_VER_RES / 8 * BYTE_PER_PIXEL]; - lv_display_set_buffers(disp, buf_2_1, buf_2_2, sizeof(buf_2_1), LV_DISPLAY_RENDER_MODE_PARTIAL); - -#elif BUFFER_METHOD == 3 - /* Example 3 - * Two buffers screen sized buffer for double buffering. - * Both LV_DISPLAY_RENDER_MODE_DIRECT and LV_DISPLAY_RENDER_MODE_FULL works, see their comments*/ - LV_ATTRIBUTE_MEM_ALIGN - static uint8_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES * BYTE_PER_PIXEL]; - - LV_ATTRIBUTE_MEM_ALIGN - static uint8_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES * BYTE_PER_PIXEL]; - lv_display_set_buffers(disp, buf_3_1, buf_3_2, sizeof(buf_3_1), LV_DISPLAY_RENDER_MODE_DIRECT); -#endif - -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -void lcd_flush_ready_callback(void) -{ - if (g_current_disp_drv != NULL) { - lv_display_flush_ready(g_current_disp_drv); - } -} - -/*Initialize your display and the required peripherals.*/ -static void disp_init(void) -{ - /*You code here*/ - LCD_Init(); - LCD_Fill(0,0, LCD_W, LCD_H, BLACK); - LCD_Close_Light(); - LCD_Set_Flush_Complete_Callback(lcd_flush_ready_callback); -} - -volatile bool disp_flush_enabled = true; - -/* Enable updating the screen (the flushing process) when disp_flush() is called by LVGL - */ -void disp_enable_update(void) -{ - disp_flush_enabled = true; -} - -/* Disable updating the screen (the flushing process) when disp_flush() is called by LVGL - */ -void disp_disable_update(void) -{ - disp_flush_enabled = false; -} - -/*Flush the content of the internal buffer the specific area on the display. - *`px_map` contains the rendered image as raw pixel map and it should be copied to `area` on the display. - *You can use DMA or any hardware acceleration to do this operation in the background but - *'lv_display_flush_ready()' has to be called when it's finished.*/ -static void disp_flush(lv_display_t * disp_drv, const lv_area_t * area, uint8_t * px_map) -{ - static lv_display_rotation_t last_rotation = LV_DISPLAY_ROTATION_0; - lv_display_rotation_t current_rotation = lv_display_get_rotation(disp_drv); - lv_area_t rotated_area; - if (current_rotation != last_rotation) { - LCD_SetRotation(current_rotation * 90); // 仅在旋转状态改变时调用 - last_rotation = current_rotation; // 更新上次状态 - } - if(disp_flush_enabled) { - LCD_Color_Render_Async(area->x1,area->y1,area->x2,area->y2, (uint16_t *)px_map); - } - - /*IMPORTANT!!! - *Inform the graphics library that you are ready with the flushing*/ - // lv_display_flush_ready(disp_drv); -} - -#else /*Enable this file at the top*/ - -/*This dummy typedef exists purely to silence -Wpedantic.*/ -typedef int keep_pedantic_happy; -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/porting/lv_port_disp.h b/software/Power_Pico/Middlewares/LVGL/porting/lv_port_disp.h deleted file mode 100644 index 427140e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/porting/lv_port_disp.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file lv_port_disp_templ.h - * - */ - -/*Copy this file as "lv_port_disp.h" and set this value to "1" to enable content*/ -#if 1 - -#ifndef LV_PORT_DISP_TEMPL_H -#define LV_PORT_DISP_TEMPL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#if defined(LV_LVGL_H_INCLUDE_SIMPLE) -#include "lvgl.h" -#else -// #include "lvgl/lvgl.h" -#include "lvgl.h" -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ -/* Initialize low level display driver */ -void lv_port_disp_init(void); - -/* Enable updating the screen (the flushing process) when disp_flush() is called by LVGL - */ -void disp_enable_update(void); - -/* Disable updating the screen (the flushing process) when disp_flush() is called by LVGL - */ -void disp_disable_update(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_PORT_DISP_TEMPL_H*/ - -#endif /*Disable/Enable content*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_global.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_global.h deleted file mode 100644 index c106e4f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_global.h +++ /dev/null @@ -1,266 +0,0 @@ -/** - * @file lv_global.h - * - */ - -#ifndef LV_GLOBAL_H -#define LV_GLOBAL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" - -#include "../misc/lv_types.h" -#include "../draw/lv_draw.h" -#if LV_USE_DRAW_SW -#include "../draw/sw/lv_draw_sw.h" -#endif -#include "../misc/lv_anim.h" -#include "../misc/lv_area.h" -#include "../misc/lv_color_op.h" -#include "../misc/lv_ll.h" -#include "../misc/lv_log.h" -#include "../misc/lv_style.h" -#include "../misc/lv_timer.h" -#include "../osal/lv_os.h" -#include "../others/sysmon/lv_sysmon.h" -#include "../stdlib/builtin/lv_tlsf.h" - -#if LV_USE_FONT_COMPRESSED -#include "../font/lv_font_fmt_txt_private.h" -#endif - -#include "../tick/lv_tick.h" -#include "../layouts/lv_layout.h" - -#include "../misc/lv_types.h" - -#include "../misc/lv_timer_private.h" -#include "../misc/lv_anim_private.h" -#include "../tick/lv_tick_private.h" -#include "../draw/lv_draw_buf_private.h" -#include "../draw/lv_draw_private.h" -#include "../draw/sw/lv_draw_sw_private.h" -#include "../draw/sw/lv_draw_sw_mask_private.h" -#include "../stdlib/builtin/lv_tlsf_private.h" -#include "../others/sysmon/lv_sysmon_private.h" -#include "../layouts/lv_layout_private.h" - -/********************* - * DEFINES - *********************/ -#define ZERO_MEM_SENTINEL 0xa1b2c3d4 - -/********************** - * TYPEDEFS - **********************/ - -#if LV_USE_SPAN != 0 -struct _snippet_stack; -#endif - -#if LV_USE_FREETYPE -struct lv_freetype_context_t; -#endif - -#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN -struct lv_profiler_builtin_ctx_t; -#endif - -#if LV_USE_NUTTX -struct lv_nuttx_ctx_t; -#endif - -typedef struct lv_global_t { - bool inited; - bool deinit_in_progress; /**< Can be used e.g. in the LV_EVENT_DELETE to deinit the drivers too */ - - lv_ll_t disp_ll; - lv_display_t * disp_refresh; - lv_display_t * disp_default; - - lv_ll_t style_trans_ll; - bool style_refresh; - uint32_t style_custom_table_size; - uint32_t style_last_custom_prop_id; - uint8_t * style_custom_prop_flag_lookup_table; - - lv_ll_t group_ll; - lv_group_t * group_default; - - lv_ll_t indev_ll; - lv_indev_t * indev_active; - lv_obj_t * indev_obj_active; - - uint32_t layout_count; - lv_layout_dsc_t * layout_list; - bool layout_update_mutex; - - uint32_t memory_zero; - uint32_t math_rand_seed; - - lv_event_t * event_header; - uint32_t event_last_register_id; - - lv_timer_state_t timer_state; - lv_anim_state_t anim_state; - lv_tick_state_t tick_state; - - lv_draw_buf_handlers_t draw_buf_handlers; - lv_draw_buf_handlers_t font_draw_buf_handlers; - lv_draw_buf_handlers_t image_cache_draw_buf_handlers; /**< Ensure that all assigned draw buffers - * can be managed by image cache. */ - - lv_ll_t img_decoder_ll; - - lv_cache_t * img_cache; - lv_cache_t * img_header_cache; - - lv_draw_global_info_t draw_info; -#if defined(LV_DRAW_SW_SHADOW_CACHE_SIZE) && LV_DRAW_SW_SHADOW_CACHE_SIZE > 0 - lv_draw_sw_shadow_cache_t sw_shadow_cache; -#endif -#if LV_DRAW_SW_COMPLEX - lv_draw_sw_mask_radius_circle_dsc_arr_t sw_circle_cache; -#endif - -#if LV_USE_LOG - lv_log_print_g_cb_t custom_log_print_cb; -#endif - -#if LV_USE_LOG && LV_LOG_USE_TIMESTAMP - uint32_t log_last_log_time; -#endif - -#if LV_USE_THEME_SIMPLE - void * theme_simple; -#endif - -#if LV_USE_THEME_DEFAULT - void * theme_default; -#endif - -#if LV_USE_THEME_MONO - void * theme_mono; -#endif - -#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN - lv_tlsf_state_t tlsf_state; -#endif - - lv_ll_t fsdrv_ll; -#if LV_USE_FS_STDIO != '\0' - lv_fs_drv_t stdio_fs_drv; -#endif -#if LV_USE_FS_POSIX - lv_fs_drv_t posix_fs_drv; -#endif - -#if LV_USE_FS_FATFS - lv_fs_drv_t fatfs_fs_drv; -#endif - -#if LV_USE_FS_WIN32 != '\0' - lv_fs_drv_t win32_fs_drv; -#endif - -#if LV_USE_FS_LITTLEFS - lv_fs_drv_t littlefs_fs_drv; -#endif - -#if LV_USE_FS_ARDUINO_ESP_LITTLEFS - lv_fs_drv_t arduino_esp_littlefs_fs_drv; -#endif - -#if LV_USE_FS_ARDUINO_SD - lv_fs_drv_t arduino_sd_fs_drv; -#endif - -#if LV_USE_FREETYPE - struct lv_freetype_context_t * ft_context; -#endif - -#if LV_USE_FONT_COMPRESSED - lv_font_fmt_rle_t font_fmt_rle; -#endif - -#if LV_USE_SPAN != 0 - struct _snippet_stack * span_snippet_stack; -#endif - -#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN - struct lv_profiler_builtin_ctx_t * profiler_context; -#endif - -#if LV_USE_FILE_EXPLORER != 0 - lv_style_t fe_list_button_style; -#endif - -#if LV_USE_MEM_MONITOR - lv_sysmon_backend_data_t sysmon_mem; -#endif - -#if LV_USE_IME_PINYIN != 0 - size_t ime_cand_len; -#endif - -#if LV_USE_OBJ_ID_BUILTIN - void * objid_array; - uint32_t objid_count; -#endif - -#if LV_USE_NUTTX - struct lv_nuttx_ctx_t * nuttx_ctx; -#endif - -#if LV_USE_OS != LV_OS_NONE - lv_mutex_t lv_general_mutex; -#endif - -#if LV_USE_OS == LV_OS_FREERTOS - uint32_t freertos_idle_time_sum; - uint32_t freertos_non_idle_time_sum; - uint32_t freertos_task_switch_timestamp; - bool freertos_idle_task_running; -#endif - - - void * user_data; -} lv_global_t; - -/********************** - * MACROS - **********************/ - -#if LV_ENABLE_GLOBAL_CUSTOM -#include LV_GLOBAL_CUSTOM_INCLUDE - -#ifndef LV_GLOBAL_CUSTOM -#define LV_GLOBAL_CUSTOM() lv_global_default() -#endif -#define LV_GLOBAL_DEFAULT() LV_GLOBAL_CUSTOM() -#else -LV_ATTRIBUTE_EXTERN_DATA extern lv_global_t lv_global; -#define LV_GLOBAL_DEFAULT() (&lv_global) -#endif - -/********************** - * GLOBAL PROTOTYPES - **********************/ -#if LV_ENABLE_GLOBAL_CUSTOM -/** - * Get the default global object for current thread - * @return pointer to the default global object - */ -lv_global_t * lv_global_default(void); -#endif -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_GLOBAL_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_group.c b/software/Power_Pico/Middlewares/LVGL/src/core/lv_group.c deleted file mode 100644 index d1cdb31..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_group.c +++ /dev/null @@ -1,530 +0,0 @@ -/** - * @file lv_group.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_group_private.h" -#include "../core/lv_obj_private.h" -#include "../core/lv_global.h" -#include "../indev/lv_indev.h" -#include "../misc/lv_types.h" - -/********************* - * DEFINES - *********************/ -#define default_group LV_GLOBAL_DEFAULT()->group_default -#define group_ll_p &(LV_GLOBAL_DEFAULT()->group_ll) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *), - void * (*move)(const lv_ll_t *, const void *)); -static void lv_group_refocus(lv_group_t * g); -static lv_indev_t * get_indev(const lv_group_t * g); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_group_init(void) -{ - lv_ll_init(group_ll_p, sizeof(lv_group_t)); -} - -void lv_group_deinit(void) -{ - lv_ll_clear(group_ll_p); -} - -lv_group_t * lv_group_create(void) -{ - lv_group_t * group = lv_ll_ins_head(group_ll_p); - LV_ASSERT_MALLOC(group); - if(group == NULL) return NULL; - lv_ll_init(&group->obj_ll, sizeof(lv_obj_t *)); - - group->obj_focus = NULL; - group->frozen = 0; - group->focus_cb = NULL; - group->edge_cb = NULL; - group->editing = 0; - group->refocus_policy = LV_GROUP_REFOCUS_POLICY_PREV; - group->wrap = 1; - group->user_data = NULL; - - return group; -} - -void lv_group_delete(lv_group_t * group) -{ - /*Defocus the currently focused object*/ - LV_ASSERT_NULL(group); - if(group->obj_focus != NULL) { - lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); - lv_obj_invalidate(*group->obj_focus); - } - - /*Remove the objects from the group*/ - lv_obj_t ** obj; - LV_LL_READ(&group->obj_ll, obj) { - if((*obj)->spec_attr)(*obj)->spec_attr->group_p = NULL; - } - - /*Remove the group from any indev devices */ - lv_indev_t * indev = lv_indev_get_next(NULL); - while(indev) { - if(lv_indev_get_group(indev) == group) { - lv_indev_set_group(indev, NULL); - } - indev = lv_indev_get_next(indev); - } - - /*If the group is the default group, set the default group as NULL*/ - if(group == lv_group_get_default()) lv_group_set_default(NULL); - - lv_ll_clear(&(group->obj_ll)); - lv_ll_remove(group_ll_p, group); - lv_free(group); -} - -void lv_group_set_default(lv_group_t * group) -{ - default_group = group; -} - -lv_group_t * lv_group_get_default(void) -{ - return default_group; -} - -void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj) -{ - if(group == NULL) return; - - LV_LOG_TRACE("begin"); - - /*Be sure the object is removed from its current group*/ - lv_group_remove_obj(obj); - - if(obj->spec_attr == NULL) lv_obj_allocate_spec_attr(obj); - obj->spec_attr->group_p = group; - - lv_obj_t ** next = lv_ll_ins_tail(&group->obj_ll); - LV_ASSERT_MALLOC(next); - if(next == NULL) return; - *next = obj; - - /*If the head and the tail is equal then there is only one object in the linked list. - *In this case automatically activate it*/ - if(lv_ll_get_head(&group->obj_ll) == next) { - lv_group_refocus(group); - } - - LV_LOG_TRACE("finished"); -} - -void lv_group_swap_obj(lv_obj_t * obj1, lv_obj_t * obj2) -{ - lv_group_t * g1 = lv_obj_get_group(obj1); - lv_group_t * g2 = lv_obj_get_group(obj2); - if(g1 != g2) return; - if(g1 == NULL) return; - - /*Do not add the object twice*/ - lv_obj_t ** obj_i; - LV_LL_READ(&g1->obj_ll, obj_i) { - if((*obj_i) == obj1)(*obj_i) = obj2; - else if((*obj_i) == obj2)(*obj_i) = obj1; - } - - lv_obj_t * focused = lv_group_get_focused(g1); - if(focused == obj1) lv_group_focus_obj(obj2); - else if(focused == obj2) lv_group_focus_obj(obj1); - -} - -void lv_group_remove_obj(lv_obj_t * obj) -{ - lv_group_t * g = lv_obj_get_group(obj); - if(g == NULL) return; - - LV_LOG_TRACE("begin"); - - /*Focus on the next object*/ - if(g->obj_focus && *g->obj_focus == obj) { - if(g->frozen) g->frozen = 0; - - /*If this is the only object in the group then focus to nothing.*/ - if(lv_ll_get_head(&g->obj_ll) == g->obj_focus && lv_ll_get_tail(&g->obj_ll) == g->obj_focus) { - lv_obj_send_event(*g->obj_focus, LV_EVENT_DEFOCUSED, get_indev(g)); - } - /*If there more objects in the group then focus to the next/prev object*/ - else { - lv_group_refocus(g); - } - } - - /*If the focuses object is still the same then it was the only object in the group but it will - *be deleted. Set the `obj_focus` to NULL to get back to the initial state of the group with - *zero objects*/ - if(g->obj_focus && *g->obj_focus == obj) { - g->obj_focus = NULL; - } - - /*Search the object and remove it from its group*/ - lv_obj_t ** i; - LV_LL_READ(&g->obj_ll, i) { - if(*i == obj) { - lv_ll_remove(&g->obj_ll, i); - lv_free(i); - if(obj->spec_attr) obj->spec_attr->group_p = NULL; - break; - } - } - LV_LOG_TRACE("finished"); -} - -void lv_group_remove_all_objs(lv_group_t * group) -{ - LV_ASSERT_NULL(group); - - /*Defocus the currently focused object*/ - if(group->obj_focus != NULL) { - lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); - lv_obj_invalidate(*group->obj_focus); - group->obj_focus = NULL; - } - - /*Remove the objects from the group*/ - lv_obj_t ** obj; - LV_LL_READ(&group->obj_ll, obj) { - if((*obj)->spec_attr)(*obj)->spec_attr->group_p = NULL; - } - - lv_ll_clear(&(group->obj_ll)); -} - -void lv_group_focus_obj(lv_obj_t * obj) -{ - if(obj == NULL) return; - lv_group_t * g = lv_obj_get_group(obj); - if(g == NULL) return; - - if(g->frozen != 0) return; - - /*On defocus edit mode must be leaved*/ - lv_group_set_editing(g, false); - - lv_obj_t ** i; - LV_LL_READ(&g->obj_ll, i) { - if(*i == obj) { - if(g->obj_focus != NULL && obj != *g->obj_focus) { /*Do not defocus if the same object needs to be focused again*/ - lv_result_t res = lv_obj_send_event(*g->obj_focus, LV_EVENT_DEFOCUSED, get_indev(g)); - if(res != LV_RESULT_OK) return; - lv_obj_invalidate(*g->obj_focus); - } - - g->obj_focus = i; - - if(g->obj_focus != NULL) { - if(g->focus_cb) g->focus_cb(g); - lv_result_t res = lv_obj_send_event(*g->obj_focus, LV_EVENT_FOCUSED, get_indev(g)); - if(res != LV_RESULT_OK) return; - lv_obj_invalidate(*g->obj_focus); - } - break; - } - } -} - -void lv_group_focus_next(lv_group_t * group) -{ - LV_ASSERT_NULL(group); - - bool focus_changed = focus_next_core(group, lv_ll_get_head, lv_ll_get_next); - if(group->edge_cb) { - if(!focus_changed) - group->edge_cb(group, true); - } -} - -void lv_group_focus_prev(lv_group_t * group) -{ - LV_ASSERT_NULL(group); - - bool focus_changed = focus_next_core(group, lv_ll_get_tail, lv_ll_get_prev); - if(group->edge_cb) { - if(!focus_changed) - group->edge_cb(group, false); - } -} - -void lv_group_focus_freeze(lv_group_t * group, bool en) -{ - LV_ASSERT_NULL(group); - - if(en == false) group->frozen = 0; - else group->frozen = 1; -} - -lv_result_t lv_group_send_data(lv_group_t * group, uint32_t c) -{ - LV_ASSERT_NULL(group); - - lv_obj_t * act = lv_group_get_focused(group); - if(act == NULL) return LV_RESULT_OK; - - if(lv_obj_has_state(act, LV_STATE_DISABLED)) return LV_RESULT_OK; - - return lv_obj_send_event(act, LV_EVENT_KEY, &c); -} - -void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb) -{ - if(group == NULL) return; - - group->focus_cb = focus_cb; -} - -void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb) -{ - LV_ASSERT_NULL(group); - - group->edge_cb = edge_cb; -} - -void lv_group_set_editing(lv_group_t * group, bool edit) -{ - LV_ASSERT_NULL(group); - uint8_t en_val = edit ? 1 : 0; - - if(en_val == group->editing) return; /*Do not set the same mode again*/ - - group->editing = en_val; - lv_obj_t * focused = lv_group_get_focused(group); - - if(focused) { - lv_result_t res = lv_obj_send_event(*group->obj_focus, LV_EVENT_FOCUSED, get_indev(group)); - if(res != LV_RESULT_OK) return; - - lv_obj_invalidate(focused); - } -} - -void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy) -{ - LV_ASSERT_NULL(group); - group->refocus_policy = policy & 0x01; -} - -void lv_group_set_wrap(lv_group_t * group, bool en) -{ - LV_ASSERT_NULL(group); - group->wrap = en ? 1 : 0; -} - -lv_obj_t * lv_group_get_focused(const lv_group_t * group) -{ - if(!group) return NULL; - if(group->obj_focus == NULL) return NULL; - - return *group->obj_focus; -} - -lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group) -{ - if(!group) return NULL; - return group->focus_cb; -} - -lv_group_edge_cb_t lv_group_get_edge_cb(const lv_group_t * group) -{ - if(!group) return NULL; - return group->edge_cb; -} - -bool lv_group_get_editing(const lv_group_t * group) -{ - if(!group) return false; - return group->editing; -} - -bool lv_group_get_wrap(lv_group_t * group) -{ - if(!group) return false; - return group->wrap; -} - -uint32_t lv_group_get_obj_count(lv_group_t * group) -{ - LV_ASSERT_NULL(group); - return lv_ll_get_len(&group->obj_ll); -} - -lv_obj_t * lv_group_get_obj_by_index(lv_group_t * group, uint32_t index) -{ - uint32_t len = 0; - lv_obj_t ** obj; - - LV_LL_READ(&group->obj_ll, obj) { - if(len == index) { - return *obj; - } - len++; - } - return NULL; -} - -uint32_t lv_group_get_count(void) -{ - return lv_ll_get_len(group_ll_p); -} - -lv_group_t * lv_group_by_index(uint32_t index) -{ - uint32_t len = 0; - lv_group_t * group; - - LV_LL_READ_BACK(group_ll_p, group) { - if(len == index) { - return group; - } - len++; - } - - return NULL; -} -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_group_refocus(lv_group_t * g) -{ - /*Refocus must temporarily allow wrapping to work correctly*/ - uint8_t temp_wrap = g->wrap; - g->wrap = 1; - - if(g->refocus_policy == LV_GROUP_REFOCUS_POLICY_NEXT) - lv_group_focus_next(g); - else if(g->refocus_policy == LV_GROUP_REFOCUS_POLICY_PREV) - lv_group_focus_prev(g); - /*Restore wrap property*/ - g->wrap = temp_wrap; -} - -static bool focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *), - void * (*move)(const lv_ll_t *, const void *)) -{ - bool focus_changed = false; - if(group->frozen) return focus_changed; - - lv_obj_t ** obj_next = group->obj_focus; - lv_obj_t ** obj_sentinel = NULL; - bool can_move = true; - bool can_begin = true; - - for(;;) { - if(obj_next == NULL) { - if(group->wrap || obj_sentinel == NULL) { - if(!can_begin) return focus_changed; - obj_next = begin(&group->obj_ll); - can_move = false; - can_begin = false; - } - else { - /*Currently focused object is the last/first in the group, keep it that way*/ - return focus_changed; - } - } - - if(obj_sentinel == NULL) { - obj_sentinel = obj_next; - if(obj_sentinel == NULL) return focus_changed; /*Group is empty*/ - } - - if(can_move) { - obj_next = move(&group->obj_ll, obj_next); - - /*Give up if we walked the entire list and haven't found another visible object*/ - if(obj_next == obj_sentinel) return focus_changed; - } - - can_move = true; - - if(obj_next == NULL) continue; - if(lv_obj_get_state(*obj_next) & LV_STATE_DISABLED) continue; - - /*Hidden objects don't receive focus. - *If any parent is hidden, the object is also hidden)*/ - lv_obj_t * parent = *obj_next; - while(parent) { - if(lv_obj_has_flag(parent, LV_OBJ_FLAG_HIDDEN)) break; - parent = lv_obj_get_parent(parent); - } - - if(parent && lv_obj_has_flag(parent, LV_OBJ_FLAG_HIDDEN)) continue; - - /*If we got her a good candidate is found*/ - break; - } - - if(obj_next == group->obj_focus) return focus_changed; /*There's only one visible object and it's already focused*/ - - if(group->obj_focus) { - lv_result_t res = lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); - if(res != LV_RESULT_OK) return focus_changed; - lv_obj_invalidate(*group->obj_focus); - } - - group->obj_focus = obj_next; - - lv_result_t res = lv_obj_send_event(*group->obj_focus, LV_EVENT_FOCUSED, get_indev(group)); - if(res != LV_RESULT_OK) return focus_changed; - - lv_obj_invalidate(*group->obj_focus); - - if(group->focus_cb) group->focus_cb(group); - focus_changed = true; - return focus_changed; -} - -/** - * Find an indev preferably with POINTER type (because it's the most generic) that uses the given group. - * In other words, find an indev, that is related to the given group. - * In the worst case simply return the latest indev - * @param g a group the find in the indevs - * @return the suggested indev - */ -static lv_indev_t * get_indev(const lv_group_t * g) -{ - lv_indev_t * indev_guess = NULL; - lv_indev_t * indev = lv_indev_get_next(NULL); - - while(indev) { - lv_indev_type_t indev_type = lv_indev_get_type(indev); - /*Prefer POINTER*/ - if(indev_type == LV_INDEV_TYPE_POINTER) return indev; - if(lv_indev_get_group(indev) == g) { - indev_guess = indev; - } - indev = lv_indev_get_next(indev); - } - - return indev_guess; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_group.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_group.h deleted file mode 100644 index e5f267d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_group.h +++ /dev/null @@ -1,245 +0,0 @@ -/** - * @file lv_group.h - * - */ - -#ifndef LV_GROUP_H -#define LV_GROUP_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" - -#include "../misc/lv_types.h" -#include "../misc/lv_ll.h" - -/********************* - * DEFINES - *********************/ -/** Predefined keys to control focused object via lv_group_send(group, c) */ -typedef enum { - LV_KEY_UP = 17, /*0x11*/ - LV_KEY_DOWN = 18, /*0x12*/ - LV_KEY_RIGHT = 19, /*0x13*/ - LV_KEY_LEFT = 20, /*0x14*/ - LV_KEY_ESC = 27, /*0x1B*/ - LV_KEY_DEL = 127, /*0x7F*/ - LV_KEY_BACKSPACE = 8, /*0x08*/ - LV_KEY_ENTER = 10, /*0x0A, '\n'*/ - LV_KEY_NEXT = 9, /*0x09, '\t'*/ - LV_KEY_PREV = 11, /*0x0B, '*/ - LV_KEY_HOME = 2, /*0x02, STX*/ - LV_KEY_END = 3, /*0x03, ETX*/ -} lv_key_t; - -/********************** - * TYPEDEFS - **********************/ - -typedef void (*lv_group_focus_cb_t)(lv_group_t *); -typedef void (*lv_group_edge_cb_t)(lv_group_t *, bool); - -typedef enum { - LV_GROUP_REFOCUS_POLICY_NEXT = 0, - LV_GROUP_REFOCUS_POLICY_PREV = 1 -} lv_group_refocus_policy_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a new object group - * @return pointer to the new object group - */ -lv_group_t * lv_group_create(void); - -/** - * Delete a group object - * @param group pointer to a group - */ -void lv_group_delete(lv_group_t * group); - -/** - * Set a default group. New object are added to this group if it's enabled in their class with `add_to_def_group = true` - * @param group pointer to a group (can be `NULL`) - */ -void lv_group_set_default(lv_group_t * group); - -/** - * Get the default group - * @return pointer to the default group - */ -lv_group_t * lv_group_get_default(void); - -/** - * Add an object to a group - * @param group pointer to a group - * @param obj pointer to an object to add - */ -void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj); - -/** - * Swap 2 object in a group. The object must be in the same group - * @param obj1 pointer to an object - * @param obj2 pointer to another object - */ -void lv_group_swap_obj(lv_obj_t * obj1, lv_obj_t * obj2); - -/** - * Remove an object from its group - * @param obj pointer to an object to remove - */ -void lv_group_remove_obj(lv_obj_t * obj); - -/** - * Remove all objects from a group - * @param group pointer to a group - */ -void lv_group_remove_all_objs(lv_group_t * group); - -/** - * Focus on an object (defocus the current) - * @param obj pointer to an object to focus on - */ -void lv_group_focus_obj(lv_obj_t * obj); - -/** - * Focus the next object in a group (defocus the current) - * @param group pointer to a group - */ -void lv_group_focus_next(lv_group_t * group); - -/** - * Focus the previous object in a group (defocus the current) - * @param group pointer to a group - */ -void lv_group_focus_prev(lv_group_t * group); - -/** - * Do not let to change the focus from the current object - * @param group pointer to a group - * @param en true: freeze, false: release freezing (normal mode) - */ -void lv_group_focus_freeze(lv_group_t * group, bool en); - -/** - * Send a control character to the focuses object of a group - * @param group pointer to a group - * @param c a character (use LV_KEY_.. to navigate) - * @return result of focused object in group. - */ -lv_result_t lv_group_send_data(lv_group_t * group, uint32_t c); - -/** - * Set a function for a group which will be called when a new object is focused - * @param group pointer to a group - * @param focus_cb the call back function or NULL if unused - */ -void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb); - -/** - * Set a function for a group which will be called when a focus edge is reached - * @param group pointer to a group - * @param edge_cb the call back function or NULL if unused - */ -void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb); - -/** - * Set whether the next or previous item in a group is focused if the currently focused obj is - * deleted. - * @param group pointer to a group - * @param policy new refocus policy enum - */ -void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy); - -/** - * Manually set the current mode (edit or navigate). - * @param group pointer to group - * @param edit true: edit mode; false: navigate mode - */ -void lv_group_set_editing(lv_group_t * group, bool edit); - -/** - * Set whether focus next/prev will allow wrapping from first->last or last->first object. - * @param group pointer to group - * @param en true: wrapping enabled; false: wrapping disabled - */ -void lv_group_set_wrap(lv_group_t * group, bool en); - -/** - * Get the focused object or NULL if there isn't one - * @param group pointer to a group - * @return pointer to the focused object - */ -lv_obj_t * lv_group_get_focused(const lv_group_t * group); - -/** - * Get the focus callback function of a group - * @param group pointer to a group - * @return the call back function or NULL if not set - */ -lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group); - -/** - * Get the edge callback function of a group - * @param group pointer to a group - * @return the call back function or NULL if not set - */ -lv_group_edge_cb_t lv_group_get_edge_cb(const lv_group_t * group); - -/** - * Get the current mode (edit or navigate). - * @param group pointer to group - * @return true: edit mode; false: navigate mode - */ -bool lv_group_get_editing(const lv_group_t * group); - -/** - * Get whether focus next/prev will allow wrapping from first->last or last->first object. - * @param group pointer to group - */ -bool lv_group_get_wrap(lv_group_t * group); - -/** - * Get the number of object in the group - * @param group pointer to a group - * @return number of objects in the group - */ -uint32_t lv_group_get_obj_count(lv_group_t * group); - -/** - * Get the nth object within a group - * @param group pointer to a group - * @param index index of object within the group - * @return pointer to the object - */ -lv_obj_t * lv_group_get_obj_by_index(lv_group_t * group, uint32_t index); - -/** - * Get the number of groups - * @return number of groups - */ -uint32_t lv_group_get_count(void); - -/** - * Get a group by its index - * @param index index of the group - * @return pointer to the group - */ -lv_group_t * lv_group_by_index(uint32_t index); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_GROUP_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_group_private.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_group_private.h deleted file mode 100644 index 33b7640..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_group_private.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @file lv_group_private.h - * - */ - -#ifndef LV_GROUP_PRIVATE_H -#define LV_GROUP_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_group.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Groups can be used to logically hold objects so that they can be individually focused. - * They are NOT for laying out objects on a screen (try layouts for that). - */ -struct lv_group_t { - lv_ll_t obj_ll; /**< Linked list to store the objects in the group*/ - lv_obj_t ** obj_focus; /**< The object in focus*/ - - lv_group_focus_cb_t focus_cb; /**< A function to call when a new object is focused (optional)*/ - lv_group_edge_cb_t edge_cb; /**< A function to call when an edge is reached, no more focus - targets are available in this direction (to allow edge feedback - like a sound or a scroll bounce) */ - - void * user_data; - - uint8_t frozen : 1; /**< 1: can't focus to new object*/ - uint8_t editing : 1; /**< 1: Edit mode, 0: Navigate mode*/ - uint8_t refocus_policy : 1; /**< 1: Focus prev if focused on deletion. 0: Focus next if focused on - deletion.*/ - uint8_t wrap : 1; /**< 1: Focus next/prev can wrap at end of list. 0: Focus next/prev stops at end - of list.*/ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Init the group module - * @remarks Internal function, do not call directly. - */ -void lv_group_init(void); - -/** - * Deinit the group module - * @remarks Internal function, do not call directly. - */ -void lv_group_deinit(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_GROUP_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj.c b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj.c deleted file mode 100644 index c58e955..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj.c +++ /dev/null @@ -1,1047 +0,0 @@ -/** - * @file lv_obj.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_obj_private.h" -#include "../misc/lv_event_private.h" -#include "../misc/lv_area_private.h" -#include "lv_obj_style_private.h" -#include "lv_obj_event_private.h" -#include "lv_obj_class_private.h" -#include "../indev/lv_indev.h" -#include "../indev/lv_indev_private.h" -#include "lv_refr.h" -#include "lv_group.h" -#include "../display/lv_display.h" -#include "../display/lv_display_private.h" -#include "../themes/lv_theme.h" -#include "../misc/lv_assert.h" -#include "../misc/lv_math.h" -#include "../misc/lv_log.h" -#include "../misc/lv_types.h" -#include "../tick/lv_tick.h" -#include "../stdlib/lv_string.h" -#include "lv_obj_draw_private.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_obj_class) -#define LV_OBJ_DEF_WIDTH (LV_DPX(100)) -#define LV_OBJ_DEF_HEIGHT (LV_DPX(50)) -#define STYLE_TRANSITION_MAX 32 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_obj_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_obj_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_obj_draw(lv_event_t * e); -static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void draw_scrollbar(lv_obj_t * obj, lv_layer_t * layer); -static lv_result_t scrollbar_init_draw_dsc(lv_obj_t * obj, lv_draw_rect_dsc_t * dsc); -static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find); -static void update_obj_state(lv_obj_t * obj, lv_state_t new_state); -static void null_on_delete_cb(lv_event_t * e); - -#if LV_USE_OBJ_PROPERTY - static lv_result_t lv_obj_set_any(lv_obj_t *, lv_prop_id_t, const lv_property_t *); - static lv_result_t lv_obj_get_any(const lv_obj_t *, lv_prop_id_t, lv_property_t *); -#endif - -/********************** - * STATIC VARIABLES - **********************/ -#if LV_USE_OBJ_PROPERTY -static const lv_property_ops_t properties[] = { - { - .id = LV_PROPERTY_OBJ_PARENT, - .setter = lv_obj_set_parent, - .getter = lv_obj_get_parent, - }, - { - .id = LV_PROPERTY_OBJ_X, - .setter = lv_obj_set_x, - .getter = lv_obj_get_x, - }, - { - .id = LV_PROPERTY_OBJ_Y, - .setter = lv_obj_set_y, - .getter = lv_obj_get_y, - }, - { - .id = LV_PROPERTY_OBJ_W, - .setter = lv_obj_set_width, - .getter = lv_obj_get_width, - }, - { - .id = LV_PROPERTY_OBJ_H, - .setter = lv_obj_set_height, - .getter = lv_obj_get_height, - }, - { - .id = LV_PROPERTY_OBJ_CONTENT_WIDTH, - .setter = lv_obj_set_content_width, - .getter = lv_obj_get_content_width, - }, - { - .id = LV_PROPERTY_OBJ_CONTENT_HEIGHT, - .setter = lv_obj_set_content_height, - .getter = lv_obj_get_content_height, - }, - { - .id = LV_PROPERTY_OBJ_LAYOUT, - .setter = lv_obj_set_layout, - }, - { - .id = LV_PROPERTY_OBJ_ALIGN, - .setter = lv_obj_set_align, - }, - { - .id = LV_PROPERTY_OBJ_SCROLLBAR_MODE, - .setter = lv_obj_set_scrollbar_mode, - .getter = lv_obj_get_scrollbar_mode, - }, - { - .id = LV_PROPERTY_OBJ_SCROLL_DIR, - .setter = lv_obj_set_scroll_dir, - .getter = lv_obj_get_scroll_dir, - }, - { - .id = LV_PROPERTY_OBJ_SCROLL_SNAP_X, - .setter = lv_obj_set_scroll_snap_x, - .getter = lv_obj_get_scroll_snap_x, - }, - { - .id = LV_PROPERTY_OBJ_SCROLL_SNAP_Y, - .setter = lv_obj_set_scroll_snap_y, - .getter = lv_obj_get_scroll_snap_y, - }, - { - .id = LV_PROPERTY_OBJ_SCROLL_TOP, - .getter = lv_obj_get_scroll_top, - }, - { - .id = LV_PROPERTY_OBJ_SCROLL_BOTTOM, - .getter = lv_obj_get_scroll_bottom, - }, - { - .id = LV_PROPERTY_OBJ_SCROLL_LEFT, - .getter = lv_obj_get_scroll_left, - }, - { - .id = LV_PROPERTY_OBJ_SCROLL_RIGHT, - .getter = lv_obj_get_scroll_right, - }, - { - .id = LV_PROPERTY_OBJ_SCROLL_END, - .getter = lv_obj_get_scroll_end, - }, - { - .id = LV_PROPERTY_OBJ_EXT_DRAW_SIZE, - .getter = lv_obj_get_ext_draw_size, - }, - { - .id = LV_PROPERTY_OBJ_EVENT_COUNT, - .getter = lv_obj_get_event_count, - }, - { - .id = LV_PROPERTY_OBJ_SCREEN, - .getter = lv_obj_get_screen, - }, - { - .id = LV_PROPERTY_OBJ_DISPLAY, - .getter = lv_obj_get_display, - }, - { - .id = LV_PROPERTY_OBJ_CHILD_COUNT, - .getter = lv_obj_get_child_count, - }, - { - .id = LV_PROPERTY_OBJ_INDEX, - .getter = lv_obj_get_index, - }, - { - .id = LV_PROPERTY_ID_ANY, - .setter = lv_obj_set_any, - .getter = lv_obj_get_any, - } -}; -#endif - -const lv_obj_class_t lv_obj_class = { - .constructor_cb = lv_obj_constructor, - .destructor_cb = lv_obj_destructor, - .event_cb = lv_obj_event, - .width_def = LV_DPI_DEF, - .height_def = LV_DPI_DEF, - .editable = LV_OBJ_CLASS_EDITABLE_FALSE, - .group_def = LV_OBJ_CLASS_GROUP_DEF_FALSE, - .instance_size = (sizeof(lv_obj_t)), - .base_class = NULL, - .name = "obj", -#if LV_USE_OBJ_PROPERTY - .prop_index_start = LV_PROPERTY_OBJ_START, - .prop_index_end = LV_PROPERTY_OBJ_END, - .properties = properties, - .properties_count = sizeof(properties) / sizeof(properties[0]), - -#if LV_USE_OBJ_PROPERTY_NAME - .property_names = lv_obj_property_names, - .names_count = sizeof(lv_obj_property_names) / sizeof(lv_property_name_t), -#endif - -#endif -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_obj_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - LV_ASSERT_NULL(obj); - if(obj == NULL) return NULL; - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -/*----------------- - * Attribute set - *----------------*/ - -void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - bool was_on_layout = lv_obj_is_layout_positioned(obj); - - /* We must invalidate the area occupied by the object before we hide it as calls to invalidate hidden objects are ignored */ - if(f & LV_OBJ_FLAG_HIDDEN) lv_obj_invalidate(obj); - - obj->flags |= f; - - if(f & LV_OBJ_FLAG_HIDDEN) { - if(lv_obj_has_state(obj, LV_STATE_FOCUSED)) { - lv_group_t * group = lv_obj_get_group(obj); - if(group != NULL) { - lv_group_focus_next(group); - lv_obj_t * next_obj = lv_group_get_focused(group); - if(next_obj != NULL) { - lv_obj_invalidate(next_obj); - } - } - } - } - - if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) { - lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); - lv_obj_mark_layout_as_dirty(obj); - } - - if(f & LV_OBJ_FLAG_SCROLLABLE) { - lv_area_t hor_area, ver_area; - lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); - lv_obj_invalidate_area(obj, &hor_area); - lv_obj_invalidate_area(obj, &ver_area); - } -} - -void lv_obj_remove_flag(lv_obj_t * obj, lv_obj_flag_t f) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - bool was_on_layout = lv_obj_is_layout_positioned(obj); - if(f & LV_OBJ_FLAG_SCROLLABLE) { - lv_area_t hor_area, ver_area; - lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); - lv_obj_invalidate_area(obj, &hor_area); - lv_obj_invalidate_area(obj, &ver_area); - } - - obj->flags &= (~f); - - if(f & LV_OBJ_FLAG_HIDDEN) { - lv_obj_invalidate(obj); - if(lv_obj_is_layout_positioned(obj)) { - lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); - lv_obj_mark_layout_as_dirty(obj); - } - } - - if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) { - lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); - } - -} - -void lv_obj_update_flag(lv_obj_t * obj, lv_obj_flag_t f, bool v) -{ - if(v) lv_obj_add_flag(obj, f); - else lv_obj_remove_flag(obj, f); -} - -void lv_obj_add_state(lv_obj_t * obj, lv_state_t state) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_state_t new_state = obj->state | state; - if(obj->state != new_state) { - - if(new_state & ~obj->state & LV_STATE_DISABLED) { - lv_indev_reset(NULL, obj); - } - - update_obj_state(obj, new_state); - } -} - -void lv_obj_remove_state(lv_obj_t * obj, lv_state_t state) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_state_t new_state = obj->state & (~state); - if(obj->state != new_state) { - update_obj_state(obj, new_state); - } -} - -void lv_obj_set_state(lv_obj_t * obj, lv_state_t state, bool v) -{ - if(v) lv_obj_add_state(obj, state); - else lv_obj_remove_state(obj, state); -} - -/*======================= - * Getter functions - *======================*/ - -bool lv_obj_has_flag(const lv_obj_t * obj, lv_obj_flag_t f) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - return (obj->flags & f) == f; -} - -bool lv_obj_has_flag_any(const lv_obj_t * obj, lv_obj_flag_t f) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - return !!(obj->flags & f); -} - -lv_state_t lv_obj_get_state(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - return obj->state; -} - -bool lv_obj_has_state(const lv_obj_t * obj, lv_state_t state) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - return !!(obj->state & state); -} - -lv_group_t * lv_obj_get_group(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - if(obj->spec_attr) return obj->spec_attr->group_p; - else return NULL; -} - -/*------------------- - * OTHER FUNCTIONS - *------------------*/ - -void lv_obj_allocate_spec_attr(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - if(obj->spec_attr == NULL) { - obj->spec_attr = lv_malloc_zeroed(sizeof(lv_obj_spec_attr_t)); - LV_ASSERT_MALLOC(obj->spec_attr); - if(obj->spec_attr == NULL) return; - - obj->spec_attr->scroll_dir = LV_DIR_ALL; - obj->spec_attr->scrollbar_mode = LV_SCROLLBAR_MODE_AUTO; - } -} - -bool lv_obj_check_type(const lv_obj_t * obj, const lv_obj_class_t * class_p) -{ - if(obj == NULL) return false; - return obj->class_p == class_p; -} - -bool lv_obj_has_class(const lv_obj_t * obj, const lv_obj_class_t * class_p) -{ - const lv_obj_class_t * obj_class = obj->class_p; - while(obj_class) { - if(obj_class == class_p) return true; - obj_class = obj_class->base_class; - } - - return false; -} - -const lv_obj_class_t * lv_obj_get_class(const lv_obj_t * obj) -{ - return obj->class_p; -} - -bool lv_obj_is_valid(const lv_obj_t * obj) -{ - lv_display_t * disp = lv_display_get_next(NULL); - while(disp) { - uint32_t i; - for(i = 0; i < disp->screen_cnt; i++) { - if(disp->screens[i] == obj) return true; - bool found = obj_valid_child(disp->screens[i], obj); - if(found) return true; - } - - disp = lv_display_get_next(disp); - } - - return false; -} - -void lv_obj_null_on_delete(lv_obj_t ** obj_ptr) -{ - lv_obj_add_event_cb(*obj_ptr, null_on_delete_cb, LV_EVENT_DELETE, obj_ptr); -} - -#if LV_USE_OBJ_ID -void * lv_obj_get_id(const lv_obj_t * obj) -{ - LV_ASSERT_NULL(obj); - return obj->id; -} - -lv_obj_t * lv_obj_get_child_by_id(const lv_obj_t * obj, const void * id) -{ - if(obj == NULL) obj = lv_display_get_screen_active(NULL); - if(obj == NULL) return NULL; - - uint32_t i; - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - if(lv_obj_id_compare(child->id, id) == 0) return child; - } - - /*Search children*/ - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - lv_obj_t * found = lv_obj_get_child_by_id(child, id); - if(found != NULL) return found; - } - - return NULL; -} -#endif - -void lv_obj_set_user_data(lv_obj_t * obj, void * user_data) -{ - obj->user_data = user_data; -} - -void * lv_obj_get_user_data(lv_obj_t * obj) -{ - return obj->user_data; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_obj_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_obj_t * parent = obj->parent; - if(parent) { - int32_t sl = lv_obj_get_scroll_left(parent); - int32_t st = lv_obj_get_scroll_top(parent); - - obj->coords.y1 = parent->coords.y1 + lv_obj_get_style_pad_top(parent, LV_PART_MAIN) - st; - obj->coords.y2 = obj->coords.y1 - 1; - obj->coords.x1 = parent->coords.x1 + lv_obj_get_style_pad_left(parent, LV_PART_MAIN) - sl; - obj->coords.x2 = obj->coords.x1 - 1; - } - - /*Set attributes*/ - obj->flags = LV_OBJ_FLAG_CLICKABLE; - obj->flags |= LV_OBJ_FLAG_SNAPPABLE; - if(parent) obj->flags |= LV_OBJ_FLAG_PRESS_LOCK; - if(parent) obj->flags |= LV_OBJ_FLAG_SCROLL_CHAIN; - obj->flags |= LV_OBJ_FLAG_CLICK_FOCUSABLE; - obj->flags |= LV_OBJ_FLAG_SCROLLABLE; - obj->flags |= LV_OBJ_FLAG_SCROLL_ELASTIC; - obj->flags |= LV_OBJ_FLAG_SCROLL_MOMENTUM; - obj->flags |= LV_OBJ_FLAG_SCROLL_WITH_ARROW; - if(parent) obj->flags |= LV_OBJ_FLAG_GESTURE_BUBBLE; - -#if LV_OBJ_ID_AUTO_ASSIGN - lv_obj_assign_id(class_p, obj); -#endif - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_obj_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - - lv_event_mark_deleted(obj); - - /*Remove all style*/ - lv_obj_enable_style_refresh(false); /*No need to refresh the style because the object will be deleted*/ - lv_obj_remove_style_all(obj); - lv_obj_enable_style_refresh(true); - - /*Remove the animations from this object*/ - lv_anim_delete(obj, NULL); - - /*Delete from the group*/ - lv_group_t * group = lv_obj_get_group(obj); - if(group) lv_group_remove_obj(obj); - - if(obj->spec_attr) { - if(obj->spec_attr->children) { - lv_free(obj->spec_attr->children); - obj->spec_attr->children = NULL; - } - - lv_event_remove_all(&obj->spec_attr->event_list); - - lv_free(obj->spec_attr); - obj->spec_attr = NULL; - } - -#if LV_OBJ_ID_AUTO_ASSIGN - lv_obj_free_id(obj); -#endif -} - -static void lv_obj_draw(lv_event_t * e) -{ - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - if(code == LV_EVENT_COVER_CHECK) { - lv_cover_check_info_t * info = lv_event_get_param(e); - if(info->res == LV_COVER_RES_MASKED) return; - if(lv_obj_get_style_clip_corner(obj, LV_PART_MAIN)) { - info->res = LV_COVER_RES_MASKED; - return; - } - - /*Most trivial test. Is the mask fully IN the object? If no it surely doesn't cover it*/ - int32_t r = lv_obj_get_style_radius(obj, LV_PART_MAIN); - int32_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); - int32_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); - lv_area_t coords; - lv_area_copy(&coords, &obj->coords); - lv_area_increase(&coords, w, h); - - if(lv_area_is_in(info->area, &coords, r) == false) { - info->res = LV_COVER_RES_NOT_COVER; - return; - } - - if(lv_obj_get_style_bg_opa(obj, LV_PART_MAIN) < LV_OPA_MAX) { - info->res = LV_COVER_RES_NOT_COVER; - return; - } - - if(lv_obj_get_style_opa(obj, LV_PART_MAIN) < LV_OPA_MAX) { - info->res = LV_COVER_RES_NOT_COVER; - return; - } - - if(lv_obj_get_style_bg_grad_dir(obj, 0) != LV_GRAD_DIR_NONE) { - if(lv_obj_get_style_bg_grad_opa(obj, 0) < LV_OPA_MAX) { - info->res = LV_COVER_RES_NOT_COVER; - return; - } - } - const lv_grad_dsc_t * grad_dsc = lv_obj_get_style_bg_grad(obj, 0); - if(grad_dsc) { - uint32_t i; - for(i = 0; i < grad_dsc->stops_count; i++) { - if(grad_dsc->stops[i].opa < LV_OPA_MAX) { - info->res = LV_COVER_RES_NOT_COVER; - return; - } - } - } - info->res = LV_COVER_RES_COVER; - } - else if(code == LV_EVENT_DRAW_MAIN) { - lv_layer_t * layer = lv_event_get_layer(e); - lv_draw_rect_dsc_t draw_dsc; - lv_draw_rect_dsc_init(&draw_dsc); - - lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &draw_dsc); - /*If the border is drawn later disable loading its properties*/ - if(lv_obj_get_style_border_post(obj, LV_PART_MAIN)) { - draw_dsc.border_post = 1; - } - - int32_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); - int32_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); - lv_area_t coords; - lv_area_copy(&coords, &obj->coords); - lv_area_increase(&coords, w, h); - - lv_draw_rect(layer, &draw_dsc, &coords); - } - else if(code == LV_EVENT_DRAW_POST) { - lv_layer_t * layer = lv_event_get_layer(e); - draw_scrollbar(obj, layer); - - /*If the border is drawn later disable loading other properties*/ - if(lv_obj_get_style_border_post(obj, LV_PART_MAIN)) { - lv_draw_rect_dsc_t draw_dsc; - lv_draw_rect_dsc_init(&draw_dsc); - draw_dsc.bg_opa = LV_OPA_TRANSP; - draw_dsc.bg_image_opa = LV_OPA_TRANSP; - draw_dsc.outline_opa = LV_OPA_TRANSP; - draw_dsc.shadow_opa = LV_OPA_TRANSP; - lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &draw_dsc); - - int32_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); - int32_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); - lv_area_t coords; - lv_area_copy(&coords, &obj->coords); - lv_area_increase(&coords, w, h); - - lv_draw_rect(layer, &draw_dsc, &coords); - } - } -} - -static void draw_scrollbar(lv_obj_t * obj, lv_layer_t * layer) -{ - - lv_area_t hor_area; - lv_area_t ver_area; - lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); - - if(lv_area_get_size(&hor_area) <= 0 && lv_area_get_size(&ver_area) <= 0) return; - - lv_draw_rect_dsc_t draw_dsc; - lv_result_t sb_res = scrollbar_init_draw_dsc(obj, &draw_dsc); - if(sb_res != LV_RESULT_OK) return; - - if(lv_area_get_size(&hor_area) > 0) { - draw_dsc.base.id1 = 0; - lv_draw_rect(layer, &draw_dsc, &hor_area); - } - if(lv_area_get_size(&ver_area) > 0) { - draw_dsc.base.id1 = 1; - lv_draw_rect(layer, &draw_dsc, &ver_area); - } -} - -/** - * Initialize the draw descriptor for the scrollbar - * @param obj pointer to an object - * @param dsc the draw descriptor to initialize - * @return LV_RESULT_OK: the scrollbar is visible; LV_RESULT_INVALID: the scrollbar is not visible - */ -static lv_result_t scrollbar_init_draw_dsc(lv_obj_t * obj, lv_draw_rect_dsc_t * dsc) -{ - lv_draw_rect_dsc_init(dsc); - dsc->bg_opa = lv_obj_get_style_bg_opa(obj, LV_PART_SCROLLBAR); - if(dsc->bg_opa > LV_OPA_MIN) { - dsc->bg_color = lv_obj_get_style_bg_color(obj, LV_PART_SCROLLBAR); - } - - dsc->border_opa = lv_obj_get_style_border_opa(obj, LV_PART_SCROLLBAR); - if(dsc->border_opa > LV_OPA_MIN) { - dsc->border_width = lv_obj_get_style_border_width(obj, LV_PART_SCROLLBAR); - if(dsc->border_width > 0) { - dsc->border_color = lv_obj_get_style_border_color(obj, LV_PART_SCROLLBAR); - } - else { - dsc->border_opa = LV_OPA_TRANSP; - } - } - - dsc->shadow_opa = lv_obj_get_style_shadow_opa(obj, LV_PART_SCROLLBAR); - if(dsc->shadow_opa > LV_OPA_MIN) { - dsc->shadow_width = lv_obj_get_style_shadow_width(obj, LV_PART_SCROLLBAR); - if(dsc->shadow_width > 0) { - dsc->shadow_spread = lv_obj_get_style_shadow_spread(obj, LV_PART_SCROLLBAR); - dsc->shadow_color = lv_obj_get_style_shadow_color(obj, LV_PART_SCROLLBAR); - } - else { - dsc->shadow_opa = LV_OPA_TRANSP; - } - } - - lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, LV_PART_SCROLLBAR); - if(opa < LV_OPA_MAX) { - lv_opa_t v = LV_OPA_MIX2(dsc->bg_opa, opa); - dsc->bg_opa = v; - dsc->border_opa = v; - dsc->shadow_opa = v; - } - - if(dsc->bg_opa != LV_OPA_TRANSP || dsc->border_opa != LV_OPA_TRANSP || dsc->shadow_opa != LV_OPA_TRANSP) { - dsc->radius = lv_obj_get_style_radius(obj, LV_PART_SCROLLBAR); - return LV_RESULT_OK; - } - else { - return LV_RESULT_INVALID; - } -} - -static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - if(code == LV_EVENT_PRESSED) { - lv_obj_add_state(obj, LV_STATE_PRESSED); - } - else if(code == LV_EVENT_RELEASED) { - lv_obj_remove_state(obj, LV_STATE_PRESSED); - void * param = lv_event_get_param(e); - /*Go the checked state if enabled*/ - if(lv_indev_get_scroll_obj(param) == NULL && lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) { - if(!(lv_obj_get_state(obj) & LV_STATE_CHECKED)) lv_obj_add_state(obj, LV_STATE_CHECKED); - else lv_obj_remove_state(obj, LV_STATE_CHECKED); - - lv_result_t res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - if(res != LV_RESULT_OK) return; - } - } - else if(code == LV_EVENT_PRESS_LOST) { - lv_obj_remove_state(obj, LV_STATE_PRESSED); - } - else if(code == LV_EVENT_STYLE_CHANGED) { - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(uint32_t i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - lv_obj_mark_layout_as_dirty(child); - } - } - else if(code == LV_EVENT_KEY) { - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) { - uint32_t c = lv_event_get_key(e); - if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { - lv_obj_add_state(obj, LV_STATE_CHECKED); - } - else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { - lv_obj_remove_state(obj, LV_STATE_CHECKED); - } - - /*With Enter LV_EVENT_RELEASED will send VALUE_CHANGE event*/ - if(c != LV_KEY_ENTER) { - lv_result_t res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - if(res != LV_RESULT_OK) return; - } - } - else if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLLABLE | LV_OBJ_FLAG_SCROLL_WITH_ARROW) && !lv_obj_is_editable(obj)) { - /*scroll by keypad or encoder*/ - lv_anim_enable_t anim_enable = LV_ANIM_OFF; - int32_t sl = lv_obj_get_scroll_left(obj); - int32_t sr = lv_obj_get_scroll_right(obj); - uint32_t c = lv_event_get_key(e); - if(c == LV_KEY_DOWN) { - /*use scroll_to_x/y functions to enforce scroll limits*/ - lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) + lv_obj_get_height(obj) / 4, anim_enable); - } - else if(c == LV_KEY_UP) { - lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) - lv_obj_get_height(obj) / 4, anim_enable); - } - else if(c == LV_KEY_RIGHT) { - /*If the object can't be scrolled horizontally then scroll it vertically*/ - if(!((lv_obj_get_scroll_dir(obj) & LV_DIR_HOR) && (sl > 0 || sr > 0))) - lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) + lv_obj_get_height(obj) / 4, anim_enable); - else - lv_obj_scroll_to_x(obj, lv_obj_get_scroll_x(obj) + lv_obj_get_width(obj) / 4, anim_enable); - } - else if(c == LV_KEY_LEFT) { - /*If the object can't be scrolled horizontally then scroll it vertically*/ - if(!((lv_obj_get_scroll_dir(obj) & LV_DIR_HOR) && (sl > 0 || sr > 0))) - lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) - lv_obj_get_height(obj) / 4, anim_enable); - else - lv_obj_scroll_to_x(obj, lv_obj_get_scroll_x(obj) - lv_obj_get_width(obj) / 4, anim_enable); - } - } - } - else if(code == LV_EVENT_FOCUSED) { - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS)) { - lv_obj_scroll_to_view_recursive(obj, LV_ANIM_ON); - } - - bool editing = false; - editing = lv_group_get_editing(lv_obj_get_group(obj)); - lv_state_t state = LV_STATE_FOCUSED; - - /* Use the indev for then indev handler. - * But if the obj was focused manually it returns NULL so try to - * use the indev from the event*/ - lv_indev_t * indev = lv_indev_active(); - if(indev == NULL) indev = lv_event_get_indev(e); - - lv_indev_type_t indev_type = lv_indev_get_type(indev); - if(indev_type == LV_INDEV_TYPE_KEYPAD || indev_type == LV_INDEV_TYPE_ENCODER) state |= LV_STATE_FOCUS_KEY; - if(editing) { - state |= LV_STATE_EDITED; - lv_obj_add_state(obj, state); - } - else { - lv_obj_add_state(obj, state); - lv_obj_remove_state(obj, LV_STATE_EDITED); - } - } - else if(code == LV_EVENT_SCROLL_BEGIN) { - lv_obj_add_state(obj, LV_STATE_SCROLLED); - } - else if(code == LV_EVENT_SCROLL_END) { - lv_obj_remove_state(obj, LV_STATE_SCROLLED); - if(lv_obj_get_scrollbar_mode(obj) == LV_SCROLLBAR_MODE_ACTIVE) { - lv_area_t hor_area, ver_area; - lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); - lv_obj_invalidate_area(obj, &hor_area); - lv_obj_invalidate_area(obj, &ver_area); - } - } - else if(code == LV_EVENT_DEFOCUSED) { - lv_obj_remove_state(obj, LV_STATE_FOCUSED | LV_STATE_EDITED | LV_STATE_FOCUS_KEY); - } - else if(code == LV_EVENT_SIZE_CHANGED) { - int32_t align = lv_obj_get_style_align(obj, LV_PART_MAIN); - uint16_t layout = lv_obj_get_style_layout(obj, LV_PART_MAIN); - if(layout || align) { - lv_obj_mark_layout_as_dirty(obj); - } - - uint32_t i; - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - lv_obj_mark_layout_as_dirty(child); - } - } - else if(code == LV_EVENT_CHILD_CHANGED) { - int32_t w = lv_obj_get_style_width(obj, LV_PART_MAIN); - int32_t h = lv_obj_get_style_height(obj, LV_PART_MAIN); - int32_t align = lv_obj_get_style_align(obj, LV_PART_MAIN); - uint16_t layout = lv_obj_get_style_layout(obj, LV_PART_MAIN); - if(layout || align || w == LV_SIZE_CONTENT || h == LV_SIZE_CONTENT) { - lv_obj_mark_layout_as_dirty(obj); - } - } - else if(code == LV_EVENT_CHILD_DELETED) { - obj->readjust_scroll_after_layout = 1; - lv_obj_mark_layout_as_dirty(obj); - } - else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - int32_t d = lv_obj_calculate_ext_draw_size(obj, LV_PART_MAIN); - lv_event_set_ext_draw_size(e, d); - } - else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST || code == LV_EVENT_COVER_CHECK) { - lv_obj_draw(e); - } - else if(code == LV_EVENT_INDEV_RESET) { - lv_obj_remove_state(obj, LV_STATE_PRESSED); - lv_obj_remove_state(obj, LV_STATE_SCROLLED); - } - else if(code == LV_EVENT_HOVER_OVER) { - lv_obj_add_state(obj, LV_STATE_HOVERED); - } - else if(code == LV_EVENT_HOVER_LEAVE) { - lv_obj_remove_state(obj, LV_STATE_HOVERED); - } -} - -/** - * Set the state (fully overwrite) of an object. - * If specified in the styles, transition animations will be started from the previous state to the current. - * @param obj pointer to an object - * @param state the new state - */ -static void update_obj_state(lv_obj_t * obj, lv_state_t new_state) -{ - if(obj->state == new_state) return; - - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_state_t prev_state = obj->state; - - lv_style_state_cmp_t cmp_res = lv_obj_style_state_compare(obj, prev_state, new_state); - /*If there is no difference in styles there is nothing else to do*/ - if(cmp_res == LV_STYLE_STATE_CMP_SAME) { - obj->state = new_state; - return; - } - - /*Invalidate the object in their current state*/ - lv_obj_invalidate(obj); - - obj->state = new_state; - lv_obj_update_layer_type(obj); - lv_obj_style_transition_dsc_t * ts = lv_malloc_zeroed(sizeof(lv_obj_style_transition_dsc_t) * STYLE_TRANSITION_MAX); - uint32_t tsi = 0; - uint32_t i; - for(i = 0; i < obj->style_cnt && tsi < STYLE_TRANSITION_MAX; i++) { - lv_obj_style_t * obj_style = &obj->styles[i]; - lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); - lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); - if(state_act & (~new_state)) continue; /*Skip unrelated styles*/ - if(obj_style->is_trans) continue; - - lv_style_value_t v; - if(lv_style_get_prop_inlined(obj_style->style, LV_STYLE_TRANSITION, &v) != LV_STYLE_RES_FOUND) continue; - const lv_style_transition_dsc_t * tr = v.ptr; - - /*Add the props to the set if not added yet or added but with smaller weight*/ - uint32_t j; - for(j = 0; tr->props[j] != 0 && tsi < STYLE_TRANSITION_MAX; j++) { - uint32_t t; - for(t = 0; t < tsi; t++) { - lv_style_selector_t selector = ts[t].selector; - lv_state_t state_ts = lv_obj_style_get_selector_state(selector); - lv_part_t part_ts = lv_obj_style_get_selector_part(selector); - if(ts[t].prop == tr->props[j] && part_ts == part_act && state_ts >= state_act) break; - } - - /*If not found add it*/ - if(t == tsi) { - ts[tsi].time = tr->time; - ts[tsi].delay = tr->delay; - ts[tsi].path_cb = tr->path_xcb; - ts[tsi].prop = tr->props[j]; - ts[tsi].user_data = tr->user_data; - ts[tsi].selector = obj_style->selector; - tsi++; - } - } - } - - for(i = 0; i < tsi; i++) { - lv_part_t part_act = lv_obj_style_get_selector_part(ts[i].selector); - lv_obj_style_create_transition(obj, part_act, prev_state, new_state, &ts[i]); - } - - lv_free(ts); - - if(cmp_res == LV_STYLE_STATE_CMP_DIFF_REDRAW) { - /*Invalidation is not enough, e.g. layer type needs to be updated too*/ - lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); - } - else if(cmp_res == LV_STYLE_STATE_CMP_DIFF_LAYOUT) { - lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); - } - else if(cmp_res == LV_STYLE_STATE_CMP_DIFF_DRAW_PAD) { - lv_obj_invalidate(obj); - lv_obj_refresh_ext_draw_size(obj); - } -} - -static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find) -{ - /*Check all children of `parent`*/ - uint32_t child_cnt = 0; - if(parent->spec_attr) child_cnt = parent->spec_attr->child_cnt; - uint32_t i; - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = parent->spec_attr->children[i]; - if(child == obj_to_find) { - return true; - } - - /*Check the children*/ - bool found = obj_valid_child(child, obj_to_find); - if(found) { - return true; - } - } - return false; -} - -static void null_on_delete_cb(lv_event_t * e) -{ - lv_obj_t ** obj_ptr = lv_event_get_user_data(e); - *obj_ptr = NULL; -} - -#if LV_USE_OBJ_PROPERTY -static lv_result_t lv_obj_set_any(lv_obj_t * obj, lv_prop_id_t id, const lv_property_t * prop) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - if(id >= LV_PROPERTY_OBJ_FLAG_START && id <= LV_PROPERTY_OBJ_FLAG_END) { - lv_obj_flag_t flag = 1L << (id - LV_PROPERTY_OBJ_FLAG_START); - if(prop->num) lv_obj_add_flag(obj, flag); - else lv_obj_remove_flag(obj, flag); - return LV_RESULT_OK; - } - else if(id >= LV_PROPERTY_OBJ_STATE_START && id <= LV_PROPERTY_OBJ_STATE_END) { - lv_state_t state = 1L << (id - LV_PROPERTY_OBJ_STATE_START); - if(id == LV_PROPERTY_OBJ_STATE_ANY) { - state = LV_STATE_ANY; - } - - if(prop->num) lv_obj_add_state(obj, state); - else lv_obj_remove_state(obj, state); - return LV_RESULT_OK; - } - else { - return LV_RESULT_INVALID; - } -} - -static lv_result_t lv_obj_get_any(const lv_obj_t * obj, lv_prop_id_t id, lv_property_t * prop) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - if(id >= LV_PROPERTY_OBJ_FLAG_START && id <= LV_PROPERTY_OBJ_FLAG_END) { - lv_obj_flag_t flag = 1L << (id - LV_PROPERTY_OBJ_FLAG_START); - prop->id = id; - prop->num = obj->flags & flag; - return LV_RESULT_OK; - } - else if(id >= LV_PROPERTY_OBJ_STATE_START && id <= LV_PROPERTY_OBJ_STATE_END) { - prop->id = id; - if(id == LV_PROPERTY_OBJ_STATE_ANY) { - prop->num = obj->state; - } - else { - lv_obj_flag_t flag = 1L << (id - LV_PROPERTY_OBJ_STATE_START); - prop->num = obj->state & flag; - } - return LV_RESULT_OK; - } - else { - return LV_RESULT_INVALID; - } -} -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj.h deleted file mode 100644 index 4ae648f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj.h +++ /dev/null @@ -1,486 +0,0 @@ -/** - * @file lv_obj.h - * - */ - -#ifndef LV_OBJ_H -#define LV_OBJ_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" - -#include "../misc/lv_types.h" -#include "../misc/lv_style.h" -#include "../misc/lv_area.h" -#include "../misc/lv_color.h" -#include "../misc/lv_assert.h" - -#include "lv_obj_tree.h" -#include "lv_obj_pos.h" -#include "lv_obj_scroll.h" -#include "lv_obj_style.h" -#include "lv_obj_draw.h" -#include "lv_obj_class.h" -#include "lv_obj_event.h" -#include "lv_obj_property.h" -#include "lv_group.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Possible states of a widget. - * OR-ed values are possible - */ -enum { - LV_STATE_DEFAULT = 0x0000, - LV_STATE_CHECKED = 0x0001, - LV_STATE_FOCUSED = 0x0002, - LV_STATE_FOCUS_KEY = 0x0004, - LV_STATE_EDITED = 0x0008, - LV_STATE_HOVERED = 0x0010, - LV_STATE_PRESSED = 0x0020, - LV_STATE_SCROLLED = 0x0040, - LV_STATE_DISABLED = 0x0080, - LV_STATE_USER_1 = 0x1000, - LV_STATE_USER_2 = 0x2000, - LV_STATE_USER_3 = 0x4000, - LV_STATE_USER_4 = 0x8000, - - LV_STATE_ANY = 0xFFFF, /**< Special value can be used in some functions to target all states*/ -}; - -/** - * The possible parts of widgets. - * The parts can be considered as the internal building block of the widgets. - * E.g. slider = background + indicator + knob - * Not all parts are used by every widget - */ - -enum { - LV_PART_MAIN = 0x000000, /**< A background like rectangle*/ - LV_PART_SCROLLBAR = 0x010000, /**< The scrollbar(s)*/ - LV_PART_INDICATOR = 0x020000, /**< Indicator, e.g. for slider, bar, switch, or the tick box of the checkbox*/ - LV_PART_KNOB = 0x030000, /**< Like handle to grab to adjust the value*/ - LV_PART_SELECTED = 0x040000, /**< Indicate the currently selected option or section*/ - LV_PART_ITEMS = 0x050000, /**< Used if the widget has multiple similar elements (e.g. table cells)*/ - LV_PART_CURSOR = 0x060000, /**< Mark a specific place e.g. for text area's cursor or on a chart*/ - - LV_PART_CUSTOM_FIRST = 0x080000, /**< Extension point for custom widgets*/ - - LV_PART_ANY = 0x0F0000, /**< Special value can be used in some functions to target all parts*/ -}; - -/** - * On/Off features controlling the object's behavior. - * OR-ed values are possible - * - * Note: update obj flags corresponding properties below - * whenever add/remove flags or change bit definition of flags. - */ -typedef enum { - LV_OBJ_FLAG_HIDDEN = (1L << 0), /**< Make the object hidden. (Like it wasn't there at all)*/ - LV_OBJ_FLAG_CLICKABLE = (1L << 1), /**< Make the object clickable by the input devices*/ - LV_OBJ_FLAG_CLICK_FOCUSABLE = (1L << 2), /**< Add focused state to the object when clicked*/ - LV_OBJ_FLAG_CHECKABLE = (1L << 3), /**< Toggle checked state when the object is clicked*/ - LV_OBJ_FLAG_SCROLLABLE = (1L << 4), /**< Make the object scrollable*/ - LV_OBJ_FLAG_SCROLL_ELASTIC = (1L << 5), /**< Allow scrolling inside but with slower speed*/ - LV_OBJ_FLAG_SCROLL_MOMENTUM = (1L << 6), /**< Make the object scroll further when "thrown"*/ - LV_OBJ_FLAG_SCROLL_ONE = (1L << 7), /**< Allow scrolling only one snappable children*/ - LV_OBJ_FLAG_SCROLL_CHAIN_HOR = (1L << 8), /**< Allow propagating the horizontal scroll to a parent*/ - LV_OBJ_FLAG_SCROLL_CHAIN_VER = (1L << 9), /**< Allow propagating the vertical scroll to a parent*/ - LV_OBJ_FLAG_SCROLL_CHAIN = (LV_OBJ_FLAG_SCROLL_CHAIN_HOR | LV_OBJ_FLAG_SCROLL_CHAIN_VER), - LV_OBJ_FLAG_SCROLL_ON_FOCUS = (1L << 10), /**< Automatically scroll object to make it visible when focused*/ - LV_OBJ_FLAG_SCROLL_WITH_ARROW = (1L << 11), /**< Allow scrolling the focused object with arrow keys*/ - LV_OBJ_FLAG_SNAPPABLE = (1L << 12), /**< If scroll snap is enabled on the parent it can snap to this object*/ - LV_OBJ_FLAG_PRESS_LOCK = (1L << 13), /**< Keep the object pressed even if the press slid from the object*/ - LV_OBJ_FLAG_EVENT_BUBBLE = (1L << 14), /**< Propagate the events to the parent too*/ - LV_OBJ_FLAG_GESTURE_BUBBLE = (1L << 15), /**< Propagate the gestures to the parent*/ - LV_OBJ_FLAG_ADV_HITTEST = (1L << 16), /**< Allow performing more accurate hit (click) test. E.g. consider rounded corners.*/ - LV_OBJ_FLAG_IGNORE_LAYOUT = (1L << 17), /**< Make the object not positioned by the layouts*/ - LV_OBJ_FLAG_FLOATING = (1L << 18), /**< Do not scroll the object when the parent scrolls and ignore layout*/ - LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS = (1L << 19), /**< Send `LV_EVENT_DRAW_TASK_ADDED` events*/ - LV_OBJ_FLAG_OVERFLOW_VISIBLE = (1L << 20),/**< Do not clip the children to the parent's ext draw size*/ -#if LV_USE_FLEX - LV_OBJ_FLAG_FLEX_IN_NEW_TRACK = (1L << 21), /**< Start a new flex track on this item*/ -#endif - - LV_OBJ_FLAG_LAYOUT_1 = (1L << 23), /**< Custom flag, free to use by layouts*/ - LV_OBJ_FLAG_LAYOUT_2 = (1L << 24), /**< Custom flag, free to use by layouts*/ - - LV_OBJ_FLAG_WIDGET_1 = (1L << 25), /**< Custom flag, free to use by widget*/ - LV_OBJ_FLAG_WIDGET_2 = (1L << 26), /**< Custom flag, free to use by widget*/ - LV_OBJ_FLAG_USER_1 = (1L << 27), /**< Custom flag, free to use by user*/ - LV_OBJ_FLAG_USER_2 = (1L << 28), /**< Custom flag, free to use by user*/ - LV_OBJ_FLAG_USER_3 = (1L << 29), /**< Custom flag, free to use by user*/ - LV_OBJ_FLAG_USER_4 = (1L << 30), /**< Custom flag, free to use by user*/ -} lv_obj_flag_t; - -#if LV_USE_OBJ_PROPERTY -enum { - /*OBJ flag properties */ - LV_PROPERTY_ID(OBJ, FLAG_START, LV_PROPERTY_TYPE_INT, 0), - LV_PROPERTY_ID(OBJ, FLAG_HIDDEN, LV_PROPERTY_TYPE_INT, 0), - LV_PROPERTY_ID(OBJ, FLAG_CLICKABLE, LV_PROPERTY_TYPE_INT, 1), - LV_PROPERTY_ID(OBJ, FLAG_CLICK_FOCUSABLE, LV_PROPERTY_TYPE_INT, 2), - LV_PROPERTY_ID(OBJ, FLAG_CHECKABLE, LV_PROPERTY_TYPE_INT, 3), - LV_PROPERTY_ID(OBJ, FLAG_SCROLLABLE, LV_PROPERTY_TYPE_INT, 4), - LV_PROPERTY_ID(OBJ, FLAG_SCROLL_ELASTIC, LV_PROPERTY_TYPE_INT, 5), - LV_PROPERTY_ID(OBJ, FLAG_SCROLL_MOMENTUM, LV_PROPERTY_TYPE_INT, 6), - LV_PROPERTY_ID(OBJ, FLAG_SCROLL_ONE, LV_PROPERTY_TYPE_INT, 7), - LV_PROPERTY_ID(OBJ, FLAG_SCROLL_CHAIN_HOR, LV_PROPERTY_TYPE_INT, 8), - LV_PROPERTY_ID(OBJ, FLAG_SCROLL_CHAIN_VER, LV_PROPERTY_TYPE_INT, 9), - LV_PROPERTY_ID(OBJ, FLAG_SCROLL_ON_FOCUS, LV_PROPERTY_TYPE_INT, 10), - LV_PROPERTY_ID(OBJ, FLAG_SCROLL_WITH_ARROW, LV_PROPERTY_TYPE_INT, 11), - LV_PROPERTY_ID(OBJ, FLAG_SNAPPABLE, LV_PROPERTY_TYPE_INT, 12), - LV_PROPERTY_ID(OBJ, FLAG_PRESS_LOCK, LV_PROPERTY_TYPE_INT, 13), - LV_PROPERTY_ID(OBJ, FLAG_EVENT_BUBBLE, LV_PROPERTY_TYPE_INT, 14), - LV_PROPERTY_ID(OBJ, FLAG_GESTURE_BUBBLE, LV_PROPERTY_TYPE_INT, 15), - LV_PROPERTY_ID(OBJ, FLAG_ADV_HITTEST, LV_PROPERTY_TYPE_INT, 16), - LV_PROPERTY_ID(OBJ, FLAG_IGNORE_LAYOUT, LV_PROPERTY_TYPE_INT, 17), - LV_PROPERTY_ID(OBJ, FLAG_FLOATING, LV_PROPERTY_TYPE_INT, 18), - LV_PROPERTY_ID(OBJ, FLAG_SEND_DRAW_TASK_EVENTS, LV_PROPERTY_TYPE_INT, 19), - LV_PROPERTY_ID(OBJ, FLAG_OVERFLOW_VISIBLE, LV_PROPERTY_TYPE_INT, 20), - LV_PROPERTY_ID(OBJ, FLAG_FLEX_IN_NEW_TRACK, LV_PROPERTY_TYPE_INT, 21), - LV_PROPERTY_ID(OBJ, FLAG_LAYOUT_1, LV_PROPERTY_TYPE_INT, 23), - LV_PROPERTY_ID(OBJ, FLAG_LAYOUT_2, LV_PROPERTY_TYPE_INT, 24), - LV_PROPERTY_ID(OBJ, FLAG_WIDGET_1, LV_PROPERTY_TYPE_INT, 25), - LV_PROPERTY_ID(OBJ, FLAG_WIDGET_2, LV_PROPERTY_TYPE_INT, 26), - LV_PROPERTY_ID(OBJ, FLAG_USER_1, LV_PROPERTY_TYPE_INT, 27), - LV_PROPERTY_ID(OBJ, FLAG_USER_2, LV_PROPERTY_TYPE_INT, 28), - LV_PROPERTY_ID(OBJ, FLAG_USER_3, LV_PROPERTY_TYPE_INT, 29), - LV_PROPERTY_ID(OBJ, FLAG_USER_4, LV_PROPERTY_TYPE_INT, 30), - LV_PROPERTY_ID(OBJ, FLAG_END, LV_PROPERTY_TYPE_INT, 30), - - LV_PROPERTY_ID(OBJ, STATE_START, LV_PROPERTY_TYPE_INT, 31), - LV_PROPERTY_ID(OBJ, STATE_CHECKED, LV_PROPERTY_TYPE_INT, 31), - LV_PROPERTY_ID(OBJ, STATE_FOCUSED, LV_PROPERTY_TYPE_INT, 32), - LV_PROPERTY_ID(OBJ, STATE_FOCUS_KEY, LV_PROPERTY_TYPE_INT, 33), - LV_PROPERTY_ID(OBJ, STATE_EDITED, LV_PROPERTY_TYPE_INT, 34), - LV_PROPERTY_ID(OBJ, STATE_HOVERED, LV_PROPERTY_TYPE_INT, 35), - LV_PROPERTY_ID(OBJ, STATE_PRESSED, LV_PROPERTY_TYPE_INT, 36), - LV_PROPERTY_ID(OBJ, STATE_SCROLLED, LV_PROPERTY_TYPE_INT, 37), - LV_PROPERTY_ID(OBJ, STATE_DISABLED, LV_PROPERTY_TYPE_INT, 38), - /*not used bit8-bit11*/ - LV_PROPERTY_ID(OBJ, STATE_USER_1, LV_PROPERTY_TYPE_INT, 43), - LV_PROPERTY_ID(OBJ, STATE_USER_2, LV_PROPERTY_TYPE_INT, 44), - LV_PROPERTY_ID(OBJ, STATE_USER_3, LV_PROPERTY_TYPE_INT, 45), - LV_PROPERTY_ID(OBJ, STATE_USER_4, LV_PROPERTY_TYPE_INT, 46), - LV_PROPERTY_ID(OBJ, STATE_ANY, LV_PROPERTY_TYPE_INT, 47), - LV_PROPERTY_ID(OBJ, STATE_END, LV_PROPERTY_TYPE_INT, 47), - - /*OBJ normal properties*/ - LV_PROPERTY_ID(OBJ, PARENT, LV_PROPERTY_TYPE_OBJ, 48), - LV_PROPERTY_ID(OBJ, X, LV_PROPERTY_TYPE_INT, 49), - LV_PROPERTY_ID(OBJ, Y, LV_PROPERTY_TYPE_INT, 50), - LV_PROPERTY_ID(OBJ, W, LV_PROPERTY_TYPE_INT, 51), - LV_PROPERTY_ID(OBJ, H, LV_PROPERTY_TYPE_INT, 52), - LV_PROPERTY_ID(OBJ, CONTENT_WIDTH, LV_PROPERTY_TYPE_INT, 53), - LV_PROPERTY_ID(OBJ, CONTENT_HEIGHT, LV_PROPERTY_TYPE_INT, 54), - LV_PROPERTY_ID(OBJ, LAYOUT, LV_PROPERTY_TYPE_INT, 55), - LV_PROPERTY_ID(OBJ, ALIGN, LV_PROPERTY_TYPE_INT, 56), - LV_PROPERTY_ID(OBJ, SCROLLBAR_MODE, LV_PROPERTY_TYPE_INT, 57), - LV_PROPERTY_ID(OBJ, SCROLL_DIR, LV_PROPERTY_TYPE_INT, 58), - LV_PROPERTY_ID(OBJ, SCROLL_SNAP_X, LV_PROPERTY_TYPE_INT, 59), - LV_PROPERTY_ID(OBJ, SCROLL_SNAP_Y, LV_PROPERTY_TYPE_INT, 60), - LV_PROPERTY_ID(OBJ, SCROLL_X, LV_PROPERTY_TYPE_INT, 61), - LV_PROPERTY_ID(OBJ, SCROLL_Y, LV_PROPERTY_TYPE_INT, 62), - LV_PROPERTY_ID(OBJ, SCROLL_TOP, LV_PROPERTY_TYPE_INT, 63), - LV_PROPERTY_ID(OBJ, SCROLL_BOTTOM, LV_PROPERTY_TYPE_INT, 64), - LV_PROPERTY_ID(OBJ, SCROLL_LEFT, LV_PROPERTY_TYPE_INT, 65), - LV_PROPERTY_ID(OBJ, SCROLL_RIGHT, LV_PROPERTY_TYPE_INT, 66), - LV_PROPERTY_ID(OBJ, SCROLL_END, LV_PROPERTY_TYPE_INT, 67), - LV_PROPERTY_ID(OBJ, EXT_DRAW_SIZE, LV_PROPERTY_TYPE_INT, 68), - LV_PROPERTY_ID(OBJ, EVENT_COUNT, LV_PROPERTY_TYPE_INT, 69), - LV_PROPERTY_ID(OBJ, SCREEN, LV_PROPERTY_TYPE_OBJ, 70), - LV_PROPERTY_ID(OBJ, DISPLAY, LV_PROPERTY_TYPE_POINTER, 71), - LV_PROPERTY_ID(OBJ, CHILD_COUNT, LV_PROPERTY_TYPE_INT, 72), - LV_PROPERTY_ID(OBJ, INDEX, LV_PROPERTY_TYPE_INT, 73), - - LV_PROPERTY_OBJ_END, -}; -#endif - -/** - * Make the base object's class publicly available. - */ -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_obj_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a base object (a rectangle) - * @param parent pointer to a parent object. If NULL then a screen will be created. - * @return pointer to the new object - */ -lv_obj_t * lv_obj_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set one or more flags - * @param obj pointer to an object - * @param f OR-ed values from `lv_obj_flag_t` to set. - */ -void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f); - -/** - * Remove one or more flags - * @param obj pointer to an object - * @param f OR-ed values from `lv_obj_flag_t` to clear. - */ -void lv_obj_remove_flag(lv_obj_t * obj, lv_obj_flag_t f); - -/** - * Set add or remove one or more flags. - * @param obj pointer to an object - * @param f OR-ed values from `lv_obj_flag_t` to update. - * @param v true: add the flags; false: remove the flags - */ -void lv_obj_update_flag(lv_obj_t * obj, lv_obj_flag_t f, bool v); - -/** - * Add one or more states to the object. The other state bits will remain unchanged. - * If specified in the styles, transition animation will be started from the previous state to the current. - * @param obj pointer to an object - * @param state the states to add. E.g `LV_STATE_PRESSED | LV_STATE_FOCUSED` - */ -void lv_obj_add_state(lv_obj_t * obj, lv_state_t state); - -/** - * Remove one or more states to the object. The other state bits will remain unchanged. - * If specified in the styles, transition animation will be started from the previous state to the current. - * @param obj pointer to an object - * @param state the states to add. E.g `LV_STATE_PRESSED | LV_STATE_FOCUSED` - */ -void lv_obj_remove_state(lv_obj_t * obj, lv_state_t state); - -/** - * Add or remove one or more states to the object. The other state bits will remain unchanged. - * @param obj pointer to an object - * @param state the states to add. E.g `LV_STATE_PRESSED | LV_STATE_FOCUSED` - * @param v true: add the states; false: remove the states - */ -void lv_obj_set_state(lv_obj_t * obj, lv_state_t state, bool v); - -/** - * Set the user_data field of the object - * @param obj pointer to an object - * @param user_data pointer to the new user_data. - */ -void lv_obj_set_user_data(lv_obj_t * obj, void * user_data); - -/*======================= - * Getter functions - *======================*/ - -/** - * Check if a given flag or all the given flags are set on an object. - * @param obj pointer to an object - * @param f the flag(s) to check (OR-ed values can be used) - * @return true: all flags are set; false: not all flags are set - */ -bool lv_obj_has_flag(const lv_obj_t * obj, lv_obj_flag_t f); - -/** - * Check if a given flag or any of the flags are set on an object. - * @param obj pointer to an object - * @param f the flag(s) to check (OR-ed values can be used) - * @return true: at least one flag is set; false: none of the flags are set - */ -bool lv_obj_has_flag_any(const lv_obj_t * obj, lv_obj_flag_t f); - -/** - * Get the state of an object - * @param obj pointer to an object - * @return the state (OR-ed values from `lv_state_t`) - */ -lv_state_t lv_obj_get_state(const lv_obj_t * obj); - -/** - * Check if the object is in a given state or not. - * @param obj pointer to an object - * @param state a state or combination of states to check - * @return true: `obj` is in `state`; false: `obj` is not in `state` - */ -bool lv_obj_has_state(const lv_obj_t * obj, lv_state_t state); - -/** - * Get the group of the object - * @param obj pointer to an object - * @return the pointer to group of the object - */ -lv_group_t * lv_obj_get_group(const lv_obj_t * obj); - -/** - * Get the user_data field of the object - * @param obj pointer to an object - * @return the pointer to the user_data of the object - */ -void * lv_obj_get_user_data(lv_obj_t * obj); - -/*======================= - * Other functions - *======================*/ - -/** - * Allocate special data for an object if not allocated yet. - * @param obj pointer to an object - */ -void lv_obj_allocate_spec_attr(lv_obj_t * obj); - -/** - * Check the type of obj. - * @param obj pointer to an object - * @param class_p a class to check (e.g. `lv_slider_class`) - * @return true: `class_p` is the `obj` class. - */ -bool lv_obj_check_type(const lv_obj_t * obj, const lv_obj_class_t * class_p); - -/** - * Check if any object has a given class (type). - * It checks the ancestor classes too. - * @param obj pointer to an object - * @param class_p a class to check (e.g. `lv_slider_class`) - * @return true: `obj` has the given class - */ -bool lv_obj_has_class(const lv_obj_t * obj, const lv_obj_class_t * class_p); - -/** - * Get the class (type) of the object - * @param obj pointer to an object - * @return the class (type) of the object - */ -const lv_obj_class_t * lv_obj_get_class(const lv_obj_t * obj); - -/** - * Check if any object is still "alive". - * @param obj pointer to an object - * @return true: valid - */ -bool lv_obj_is_valid(const lv_obj_t * obj); - -/** - * Utility to set an object reference to NULL when it gets deleted. - * The reference should be in a location that will not become invalid - * during the object's lifetime, i.e. static or allocated. - * @param obj_ptr a pointer to a pointer to an object - */ -void lv_obj_null_on_delete(lv_obj_t ** obj_ptr); - -#if LV_USE_OBJ_ID -/** - * Set an id for an object. - * @param obj pointer to an object - * @param id the id of the object - */ -void lv_obj_set_id(lv_obj_t * obj, void * id); - -/** - * Get the id of an object. - * @param obj pointer to an object - * @return the id of the object - */ -void * lv_obj_get_id(const lv_obj_t * obj); - -/** - * Get the child object by its id. - * It will check children and grandchildren recursively. - * Function `lv_obj_id_compare` is used to matched obj id with given id. - * - * @param obj pointer to an object - * @param id the id of the child object - * @return pointer to the child object or NULL if not found - */ -lv_obj_t * lv_obj_get_child_by_id(const lv_obj_t * obj, const void * id); - -/** - * Assign id to object if not previously assigned. - * This function gets called automatically when LV_OBJ_ID_AUTO_ASSIGN is enabled. - * - * Set `LV_USE_OBJ_ID_BUILTIN` to use the builtin method to generate object ID. - * Otherwise, these functions including `lv_obj_[set|assign|free|stringify]_id` and - * `lv_obj_id_compare`should be implemented externally. - * - * @param class_p the class this obj belongs to. Note obj->class_p is the class currently being constructed. - * @param obj pointer to an object - */ -void lv_obj_assign_id(const lv_obj_class_t * class_p, lv_obj_t * obj); - -/** - * Free resources allocated by `lv_obj_assign_id` or `lv_obj_set_id`. - * This function is also called automatically when object is deleted. - * @param obj pointer to an object - */ -void lv_obj_free_id(lv_obj_t * obj); - -/** - * Compare two obj id, return 0 if they are equal. - * - * Set `LV_USE_OBJ_ID_BUILTIN` to use the builtin method for compare. - * Otherwise, it must be implemented externally. - * - * @param id1: the first id - * @param id2: the second id - * @return 0 if they are equal, non-zero otherwise. - */ -int lv_obj_id_compare(const void * id1, const void * id2); - -/** - * Format an object's id into a string. - * @param obj pointer to an object - * @param buf buffer to write the string into - * @param len length of the buffer - */ -const char * lv_obj_stringify_id(lv_obj_t * obj, char * buf, uint32_t len); - -#if LV_USE_OBJ_ID_BUILTIN -/** - * Free resources used by builtin ID generator. - */ -void lv_objid_builtin_destroy(void); -#endif - -#endif /*LV_USE_OBJ_ID*/ - -/********************** - * MACROS - **********************/ - -#if LV_USE_ASSERT_OBJ -# define LV_ASSERT_OBJ(obj_p, obj_class) \ - do { \ - LV_ASSERT_MSG(obj_p != NULL, "The object is NULL"); \ - LV_ASSERT_MSG(lv_obj_has_class(obj_p, obj_class) == true, "Incompatible object type."); \ - LV_ASSERT_MSG(lv_obj_is_valid(obj_p) == true, "The object is invalid, deleted or corrupted?"); \ - } while(0) -# else -# define LV_ASSERT_OBJ(obj_p, obj_class) do{}while(0) -#endif - -#if LV_USE_LOG && LV_LOG_TRACE_OBJ_CREATE -# define LV_TRACE_OBJ_CREATE(...) LV_LOG_TRACE(__VA_ARGS__) -#else -# define LV_TRACE_OBJ_CREATE(...) -#endif - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_class.c b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_class.c deleted file mode 100644 index cb5a396..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_class.c +++ /dev/null @@ -1,204 +0,0 @@ -/** - * @file lv_obj_class.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_obj_class_private.h" -#include "lv_obj_private.h" -#include "../themes/lv_theme.h" -#include "../display/lv_display.h" -#include "../display/lv_display_private.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_obj_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_obj_construct(const lv_obj_class_t * class_p, lv_obj_t * obj); -static uint32_t get_instance_size(const lv_obj_class_t * class_p); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * parent) -{ - LV_TRACE_OBJ_CREATE("Creating object with %p class on %p parent", (void *)class_p, (void *)parent); - uint32_t s = get_instance_size(class_p); - lv_obj_t * obj = lv_malloc_zeroed(s); - if(obj == NULL) return NULL; - obj->class_p = class_p; - obj->parent = parent; - - /*Create a screen*/ - if(parent == NULL) { - LV_TRACE_OBJ_CREATE("creating a screen"); - lv_display_t * disp = lv_display_get_default(); - if(!disp) { - LV_LOG_WARN("No display created yet. No place to assign the new screen"); - lv_free(obj); - return NULL; - } - - if(disp->screens == NULL) { - disp->screen_cnt = 0; - } - - lv_obj_t ** screens = lv_realloc(disp->screens, sizeof(lv_obj_t *) * (disp->screen_cnt + 1)); - LV_ASSERT_MALLOC(screens); - if(screens == NULL) { - lv_free(obj); - return NULL; - } - - disp->screen_cnt++; - disp->screens = screens; - disp->screens[disp->screen_cnt - 1] = obj; - - /*Set coordinates to full screen size*/ - obj->coords.x1 = 0; - obj->coords.y1 = 0; - obj->coords.x2 = lv_display_get_horizontal_resolution(NULL) - 1; - obj->coords.y2 = lv_display_get_vertical_resolution(NULL) - 1; - } - /*Create a normal object*/ - else { - LV_TRACE_OBJ_CREATE("creating normal object"); - LV_ASSERT_OBJ(parent, MY_CLASS); - if(parent->spec_attr == NULL) { - lv_obj_allocate_spec_attr(parent); - } - - parent->spec_attr->child_cnt++; - parent->spec_attr->children = lv_realloc(parent->spec_attr->children, - sizeof(lv_obj_t *) * parent->spec_attr->child_cnt); - parent->spec_attr->children[parent->spec_attr->child_cnt - 1] = obj; - } - - return obj; -} - -void lv_obj_class_init_obj(lv_obj_t * obj) -{ - if(obj == NULL) return; - - lv_obj_mark_layout_as_dirty(obj); - lv_obj_enable_style_refresh(false); - - lv_theme_apply(obj); - lv_obj_construct(obj->class_p, obj); - - lv_obj_enable_style_refresh(true); - lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); - - lv_obj_refresh_self_size(obj); - - lv_group_t * def_group = lv_group_get_default(); - if(def_group && lv_obj_is_group_def(obj)) { - lv_group_add_obj(def_group, obj); - } - - lv_obj_t * parent = lv_obj_get_parent(obj); - if(parent) { - /*Call the ancestor's event handler to the parent to notify it about the new child. - *Also triggers layout update*/ - lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj); - lv_obj_send_event(parent, LV_EVENT_CHILD_CREATED, obj); - - /*Invalidate the area if not screen created*/ - lv_obj_invalidate(obj); - } -} - -void lv_obj_destruct(lv_obj_t * obj) -{ - if(obj->class_p->destructor_cb) obj->class_p->destructor_cb(obj->class_p, obj); - - if(obj->class_p->base_class) { - /*Don't let the descendant methods run during destructing the ancestor type*/ - obj->class_p = obj->class_p->base_class; - - /*Call the base class's destructor too*/ - lv_obj_destruct(obj); - } -} - -bool lv_obj_is_editable(lv_obj_t * obj) -{ - const lv_obj_class_t * class_p = obj->class_p; - - /*Find a base in which editable is set*/ - while(class_p && class_p->editable == LV_OBJ_CLASS_EDITABLE_INHERIT) class_p = class_p->base_class; - - if(class_p == NULL) return false; - - return class_p->editable == LV_OBJ_CLASS_EDITABLE_TRUE; -} - -bool lv_obj_is_group_def(lv_obj_t * obj) -{ - const lv_obj_class_t * class_p = obj->class_p; - - /*Find a base in which group_def is set*/ - while(class_p && class_p->group_def == LV_OBJ_CLASS_GROUP_DEF_INHERIT) class_p = class_p->base_class; - - if(class_p == NULL) return false; - - return class_p->group_def == LV_OBJ_CLASS_GROUP_DEF_TRUE; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_obj_construct(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - if(obj->class_p->base_class) { - const lv_obj_class_t * original_class_p = obj->class_p; - - /*Don't let the descendant methods run during constructing the ancestor type*/ - obj->class_p = obj->class_p->base_class; - - /*Construct the base first*/ - lv_obj_construct(class_p, obj); - - /*Restore the original class*/ - obj->class_p = original_class_p; - } - - if(obj->class_p->constructor_cb) obj->class_p->constructor_cb(class_p, obj); -} - -static uint32_t get_instance_size(const lv_obj_class_t * class_p) -{ - /*Find a base in which instance size is set*/ - const lv_obj_class_t * base = class_p; - while(base && base->instance_size == 0) base = base->base_class; - - if(base == NULL) return 0; /*Never happens: set at least in `lv_obj` class*/ - - return base->instance_size; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_class.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_class.h deleted file mode 100644 index 4c3bdcb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_class.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * @file lv_obj_class.h - * - */ - -#ifndef LV_OBJ_CLASS_H -#define LV_OBJ_CLASS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_types.h" -#include "../misc/lv_area.h" -#include "lv_obj_property.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - LV_OBJ_CLASS_EDITABLE_INHERIT, /**< Check the base class. Must have 0 value to let zero initialized class inherit*/ - LV_OBJ_CLASS_EDITABLE_TRUE, - LV_OBJ_CLASS_EDITABLE_FALSE, -} lv_obj_class_editable_t; - -typedef enum { - LV_OBJ_CLASS_GROUP_DEF_INHERIT, /**< Check the base class. Must have 0 value to let zero initialized class inherit*/ - LV_OBJ_CLASS_GROUP_DEF_TRUE, - LV_OBJ_CLASS_GROUP_DEF_FALSE, -} lv_obj_class_group_def_t; - -typedef enum { - LV_OBJ_CLASS_THEME_INHERITABLE_FALSE, /**< Do not inherit theme from base class. */ - LV_OBJ_CLASS_THEME_INHERITABLE_TRUE, -} lv_obj_class_theme_inheritable_t; - -typedef void (*lv_obj_class_event_cb_t)(lv_obj_class_t * class_p, lv_event_t * e); -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an object form a class descriptor - * @param class_p pointer to a class - * @param parent pointer to an object where the new object should be created - * @return pointer to the created object - */ -lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * parent); - -void lv_obj_class_init_obj(lv_obj_t * obj); - -bool lv_obj_is_editable(lv_obj_t * obj); - -bool lv_obj_is_group_def(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_CLASS_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_class_private.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_class_private.h deleted file mode 100644 index 1279b9c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_class_private.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * @file lv_obj_class_private.h - * - */ - -#ifndef LV_OBJ_CLASS_PRIVATE_H -#define LV_OBJ_CLASS_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_obj_class.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Describe the common methods of every object. - * Similar to a C++ class. - */ -struct lv_obj_class_t { - const lv_obj_class_t * base_class; - /** class_p is the final class while obj->class_p is the class currently being [de]constructed. */ - void (*constructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj); - void (*destructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj); - - /** class_p is the class in which event is being processed. */ - void (*event_cb)(const lv_obj_class_t * class_p, lv_event_t * e); /**< Widget type specific event function*/ - -#if LV_USE_OBJ_PROPERTY - uint32_t prop_index_start; - uint32_t prop_index_end; - const lv_property_ops_t * properties; - uint32_t properties_count; - -#if LV_USE_OBJ_PROPERTY_NAME - /* An array of property ID and name */ - const lv_property_name_t * property_names; - uint32_t names_count; -#endif -#endif - - void * user_data; - const char * name; - int32_t width_def; - int32_t height_def; - uint32_t editable : 2; /**< Value from ::lv_obj_class_editable_t*/ - uint32_t group_def : 2; /**< Value from ::lv_obj_class_group_def_t*/ - uint32_t instance_size : 16; - uint32_t theme_inheritable : 1; /**< Value from ::lv_obj_class_theme_inheritable_t*/ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_obj_destruct(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_CLASS_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_draw.c b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_draw.c deleted file mode 100644 index b3694b9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_draw.c +++ /dev/null @@ -1,326 +0,0 @@ -/** - * @file lv_obj_draw.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_obj_draw_private.h" -#include "lv_obj_private.h" -#include "lv_obj_style.h" -#include "../display/lv_display.h" -#include "../indev/lv_indev.h" -#include "../stdlib/lv_string.h" -#include "../draw/lv_draw_arc.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_obj_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_rect_dsc_t * draw_dsc) -{ - draw_dsc->base.obj = obj; - draw_dsc->base.part = part; - - lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); - if(part != LV_PART_MAIN) { - if(opa <= LV_OPA_MIN) { - draw_dsc->bg_opa = LV_OPA_TRANSP; - draw_dsc->bg_image_opa = LV_OPA_TRANSP; - draw_dsc->border_opa = LV_OPA_TRANSP; - draw_dsc->outline_opa = LV_OPA_TRANSP; - draw_dsc->shadow_opa = LV_OPA_TRANSP; - return; - } - } - - draw_dsc->radius = lv_obj_get_style_radius(obj, part); - - if(draw_dsc->bg_opa != LV_OPA_TRANSP) { - draw_dsc->bg_opa = lv_obj_get_style_bg_opa(obj, part); - if(draw_dsc->bg_opa > LV_OPA_MIN) { - draw_dsc->bg_color = lv_obj_get_style_bg_color_filtered(obj, part); - const lv_grad_dsc_t * grad = lv_obj_get_style_bg_grad(obj, part); - if(grad && grad->dir != LV_GRAD_DIR_NONE) { - lv_memcpy(&draw_dsc->bg_grad, grad, sizeof(*grad)); - } - else { - draw_dsc->bg_grad.dir = lv_obj_get_style_bg_grad_dir(obj, part); - if(draw_dsc->bg_grad.dir != LV_GRAD_DIR_NONE) { - draw_dsc->bg_grad.stops[0].color = lv_obj_get_style_bg_color_filtered(obj, part); - draw_dsc->bg_grad.stops[1].color = lv_obj_get_style_bg_grad_color_filtered(obj, part); - draw_dsc->bg_grad.stops[0].frac = lv_obj_get_style_bg_main_stop(obj, part); - draw_dsc->bg_grad.stops[1].frac = lv_obj_get_style_bg_grad_stop(obj, part); - draw_dsc->bg_grad.stops[0].opa = lv_obj_get_style_bg_main_opa(obj, part); - draw_dsc->bg_grad.stops[1].opa = lv_obj_get_style_bg_grad_opa(obj, part); - } - } - } - } - - if(draw_dsc->border_opa != LV_OPA_TRANSP) { - draw_dsc->border_width = lv_obj_get_style_border_width(obj, part); - if(draw_dsc->border_width) { - draw_dsc->border_opa = lv_obj_get_style_border_opa(obj, part); - if(draw_dsc->border_opa > LV_OPA_MIN) { - draw_dsc->border_side = lv_obj_get_style_border_side(obj, part); - draw_dsc->border_color = lv_obj_get_style_border_color_filtered(obj, part); - } - } - } - - if(draw_dsc->outline_opa != LV_OPA_TRANSP) { - draw_dsc->outline_width = lv_obj_get_style_outline_width(obj, part); - if(draw_dsc->outline_width) { - draw_dsc->outline_opa = lv_obj_get_style_outline_opa(obj, part); - if(draw_dsc->outline_opa > LV_OPA_MIN) { - draw_dsc->outline_pad = lv_obj_get_style_outline_pad(obj, part); - draw_dsc->outline_color = lv_obj_get_style_outline_color_filtered(obj, part); - } - } - } - - if(draw_dsc->bg_image_opa != LV_OPA_TRANSP) { - draw_dsc->bg_image_src = lv_obj_get_style_bg_image_src(obj, part); - if(draw_dsc->bg_image_src) { - draw_dsc->bg_image_opa = lv_obj_get_style_bg_image_opa(obj, part); - if(draw_dsc->bg_image_opa > LV_OPA_MIN) { - if(lv_image_src_get_type(draw_dsc->bg_image_src) == LV_IMAGE_SRC_SYMBOL) { - draw_dsc->bg_image_symbol_font = lv_obj_get_style_text_font(obj, part); - draw_dsc->bg_image_recolor = lv_obj_get_style_text_color_filtered(obj, part); - } - else { - draw_dsc->bg_image_recolor = lv_obj_get_style_bg_image_recolor_filtered(obj, part); - draw_dsc->bg_image_recolor_opa = lv_obj_get_style_bg_image_recolor_opa(obj, part); - draw_dsc->bg_image_tiled = lv_obj_get_style_bg_image_tiled(obj, part); - } - } - } - } - - if(draw_dsc->shadow_opa) { - draw_dsc->shadow_width = lv_obj_get_style_shadow_width(obj, part); - if(draw_dsc->shadow_width) { - if(draw_dsc->shadow_opa > LV_OPA_MIN) { - draw_dsc->shadow_opa = lv_obj_get_style_shadow_opa(obj, part); - if(draw_dsc->shadow_opa > LV_OPA_MIN) { - draw_dsc->shadow_offset_x = lv_obj_get_style_shadow_offset_x(obj, part); - draw_dsc->shadow_offset_y = lv_obj_get_style_shadow_offset_y(obj, part); - draw_dsc->shadow_spread = lv_obj_get_style_shadow_spread(obj, part); - draw_dsc->shadow_color = lv_obj_get_style_shadow_color_filtered(obj, part); - } - } - } - } - - if(opa < LV_OPA_MAX) { - draw_dsc->bg_opa = LV_OPA_MIX2(draw_dsc->bg_opa, opa); - draw_dsc->bg_image_opa = LV_OPA_MIX2(draw_dsc->bg_image_opa, opa); - draw_dsc->border_opa = LV_OPA_MIX2(draw_dsc->border_opa, opa); - draw_dsc->shadow_opa = LV_OPA_MIX2(draw_dsc->shadow_opa, opa); - draw_dsc->outline_opa = LV_OPA_MIX2(draw_dsc->outline_opa, opa); - } -} - -void lv_obj_init_draw_label_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_label_dsc_t * draw_dsc) -{ - draw_dsc->base.obj = obj; - draw_dsc->base.part = part; - - draw_dsc->opa = lv_obj_get_style_text_opa(obj, part); - if(draw_dsc->opa <= LV_OPA_MIN) return; - - lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); - if(opa < LV_OPA_MAX) { - draw_dsc->opa = LV_OPA_MIX2(draw_dsc->opa, opa); - } - if(draw_dsc->opa <= LV_OPA_MIN) return; - - draw_dsc->color = lv_obj_get_style_text_color_filtered(obj, part); - draw_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, part); - draw_dsc->line_space = lv_obj_get_style_text_line_space(obj, part); - draw_dsc->decor = lv_obj_get_style_text_decor(obj, part); - if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part); - - draw_dsc->font = lv_obj_get_style_text_font(obj, part); - -#if LV_USE_BIDI - draw_dsc->bidi_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); -#endif - - draw_dsc->align = lv_obj_get_style_text_align(obj, part); -} - -void lv_obj_init_draw_image_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_image_dsc_t * draw_dsc) -{ - draw_dsc->base.obj = obj; - draw_dsc->base.part = part; - - draw_dsc->opa = lv_obj_get_style_image_opa(obj, part); - if(draw_dsc->opa <= LV_OPA_MIN) return; - - lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); - if(opa < LV_OPA_MAX) { - draw_dsc->opa = LV_OPA_MIX2(draw_dsc->opa, opa); - } - if(draw_dsc->opa <= LV_OPA_MIN) return; - - draw_dsc->rotation = 0; - draw_dsc->scale_x = LV_SCALE_NONE; - draw_dsc->scale_y = LV_SCALE_NONE; - draw_dsc->pivot.x = lv_area_get_width(&obj->coords) / 2; - draw_dsc->pivot.y = lv_area_get_height(&obj->coords) / 2; - - draw_dsc->recolor_opa = lv_obj_get_style_image_recolor_opa(obj, part); - draw_dsc->recolor = lv_obj_get_style_image_recolor_filtered(obj, part); - - if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part); -} - -void lv_obj_init_draw_line_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_line_dsc_t * draw_dsc) -{ - draw_dsc->base.obj = obj; - draw_dsc->base.part = part; - - draw_dsc->opa = lv_obj_get_style_line_opa(obj, part); - if(draw_dsc->opa <= LV_OPA_MIN) return; - - lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); - if(opa < LV_OPA_MAX) { - draw_dsc->opa = LV_OPA_MIX2(draw_dsc->opa, opa); - } - if(draw_dsc->opa <= LV_OPA_MIN) return; - - draw_dsc->width = lv_obj_get_style_line_width(obj, part); - if(draw_dsc->width == 0) return; - - draw_dsc->color = lv_obj_get_style_line_color_filtered(obj, part); - - draw_dsc->dash_width = lv_obj_get_style_line_dash_width(obj, part); - if(draw_dsc->dash_width) { - draw_dsc->dash_gap = lv_obj_get_style_line_dash_gap(obj, part); - } - - draw_dsc->round_start = lv_obj_get_style_line_rounded(obj, part); - draw_dsc->round_end = draw_dsc->round_start; - - if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part); -} - -void lv_obj_init_draw_arc_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_arc_dsc_t * draw_dsc) -{ - draw_dsc->base.obj = obj; - draw_dsc->base.part = part; - - draw_dsc->width = lv_obj_get_style_arc_width(obj, part); - if(draw_dsc->width == 0) return; - - draw_dsc->opa = lv_obj_get_style_arc_opa(obj, part); - if(draw_dsc->opa <= LV_OPA_MIN) return; - - lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); - if(opa < LV_OPA_MAX) { - draw_dsc->opa = LV_OPA_MIX2(draw_dsc->opa, opa); - } - if(draw_dsc->opa <= LV_OPA_MIN) return; - - draw_dsc->color = lv_obj_get_style_arc_color_filtered(obj, part); - draw_dsc->img_src = lv_obj_get_style_arc_image_src(obj, part); - - draw_dsc->rounded = lv_obj_get_style_arc_rounded(obj, part); -} - -int32_t lv_obj_calculate_ext_draw_size(lv_obj_t * obj, lv_part_t part) -{ - int32_t s = 0; - - int32_t sh_width = lv_obj_get_style_shadow_width(obj, part); - if(sh_width) { - lv_opa_t sh_opa = lv_obj_get_style_shadow_opa(obj, part); - if(sh_opa > LV_OPA_MIN) { - sh_width = sh_width / 2 + 1; /*The blur adds only half width*/ - sh_width += lv_obj_get_style_shadow_spread(obj, part); - int32_t sh_ofs_x = lv_obj_get_style_shadow_offset_x(obj, part); - int32_t sh_ofs_y = lv_obj_get_style_shadow_offset_y(obj, part); - sh_width += LV_MAX(LV_ABS(sh_ofs_x), LV_ABS(sh_ofs_y)); - s = LV_MAX(s, sh_width); - } - } - - int32_t outline_width = lv_obj_get_style_outline_width(obj, part); - if(outline_width) { - lv_opa_t outline_opa = lv_obj_get_style_outline_opa(obj, part); - if(outline_opa > LV_OPA_MIN) { - int32_t outline_pad = lv_obj_get_style_outline_pad(obj, part); - s = LV_MAX(s, outline_pad + outline_width); - } - } - - int32_t w = lv_obj_get_style_transform_width(obj, part); - int32_t h = lv_obj_get_style_transform_height(obj, part); - int32_t wh = LV_MAX(w, h); - if(wh > 0) s += wh; - - return s; -} - -void lv_obj_refresh_ext_draw_size(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - int32_t s_old = lv_obj_get_ext_draw_size(obj); - int32_t s_new = 0; - lv_obj_send_event(obj, LV_EVENT_REFR_EXT_DRAW_SIZE, &s_new); - - /*Store the result if the special attrs already allocated*/ - if(obj->spec_attr) { - obj->spec_attr->ext_draw_size = s_new; - } - /*Allocate spec. attrs. only if the result is not zero. - *Zero is the default value if the spec. attr. are not defined.*/ - else if(s_new != 0) { - lv_obj_allocate_spec_attr(obj); - obj->spec_attr->ext_draw_size = s_new; - } - - if(s_new != s_old) lv_obj_invalidate(obj); -} - -int32_t lv_obj_get_ext_draw_size(const lv_obj_t * obj) -{ - if(obj->spec_attr) return obj->spec_attr->ext_draw_size; - else return 0; -} - -lv_layer_type_t lv_obj_get_layer_type(const lv_obj_t * obj) -{ - - if(obj->spec_attr) return (lv_layer_type_t)obj->spec_attr->layer_type; - else return LV_LAYER_TYPE_NONE; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_draw.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_draw.h deleted file mode 100644 index c0dbee4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_draw.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @file lv_obj_draw.h - * - */ - -#ifndef LV_OBJ_DRAW_H -#define LV_OBJ_DRAW_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_types.h" -#include "../draw/lv_draw_rect.h" -#include "../draw/lv_draw_label.h" -#include "../draw/lv_draw_image.h" -#include "../draw/lv_draw_line.h" -#include "../draw/lv_draw_arc.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - LV_LAYER_TYPE_NONE, - LV_LAYER_TYPE_SIMPLE, - LV_LAYER_TYPE_TRANSFORM, -} lv_layer_type_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize a rectangle draw descriptor from an object's styles in its current state - * @param obj pointer to an object - * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc - * @param draw_dsc the descriptor to initialize. - * If an `..._opa` field is set to `LV_OPA_TRANSP` the related properties won't be initialized. - * Should be initialized with `lv_draw_rect_dsc_init(draw_dsc)`. - * @note Only the relevant fields will be set. - * E.g. if `border width == 0` the other border properties won't be evaluated. - */ -void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_rect_dsc_t * draw_dsc); - -/** - * Initialize a label draw descriptor from an object's styles in its current state - * @param obj pointer to an object - * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc - * @param draw_dsc the descriptor to initialize. - * If the `opa` field is set to or the property is equal to `LV_OPA_TRANSP` the rest won't be initialized. - * Should be initialized with `lv_draw_label_dsc_init(draw_dsc)`. - */ -void lv_obj_init_draw_label_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_label_dsc_t * draw_dsc); - -/** - * Initialize an image draw descriptor from an object's styles in its current state - * @param obj pointer to an object - * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc - * @param draw_dsc the descriptor to initialize. - * Should be initialized with `lv_draw_image_dsc_init(draw_dsc)`. - */ -void lv_obj_init_draw_image_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_image_dsc_t * draw_dsc); - -/** - * Initialize a line draw descriptor from an object's styles in its current state - * @param obj pointer to an object - * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc - * @param draw_dsc the descriptor to initialize. - * Should be initialized with `lv_draw_line_dsc_init(draw_dsc)`. - */ -void lv_obj_init_draw_line_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_line_dsc_t * draw_dsc); - -/** - * Initialize an arc draw descriptor from an object's styles in its current state - * @param obj pointer to an object - * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc - * @param draw_dsc the descriptor to initialize. - * Should be initialized with `lv_draw_arc_dsc_init(draw_dsc)`. - */ -void lv_obj_init_draw_arc_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_arc_dsc_t * draw_dsc); - -/** - * Get the required extra size (around the object's part) to draw shadow, outline, value etc. - * @param obj pointer to an object - * @param part part of the object - * @return the extra size required around the object - */ -int32_t lv_obj_calculate_ext_draw_size(lv_obj_t * obj, lv_part_t part); - -/** - * Send a 'LV_EVENT_REFR_EXT_DRAW_SIZE' Call the ancestor's event handler to the object to refresh the value of the extended draw size. - * The result will be saved in `obj`. - * @param obj pointer to an object - */ -void lv_obj_refresh_ext_draw_size(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_DRAW_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_draw_private.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_draw_private.h deleted file mode 100644 index 36c8bff..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_draw_private.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @file lv_obj_draw_private.h - * - */ - -#ifndef LV_OBJ_DRAW_PRIVATE_H -#define LV_OBJ_DRAW_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_obj_draw.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Get the extended draw area of an object. - * @param obj pointer to an object - * @return the size extended draw area around the real coordinates - */ -int32_t lv_obj_get_ext_draw_size(const lv_obj_t * obj); - -lv_layer_type_t lv_obj_get_layer_type(const lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_DRAW_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_event.c b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_event.c deleted file mode 100644 index 3831fee..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_event.c +++ /dev/null @@ -1,419 +0,0 @@ -/** - * @file lv_obj_event.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_event_private.h" -#include "lv_obj_event_private.h" -#include "lv_obj_class_private.h" -#include "lv_obj_private.h" -#include "../indev/lv_indev.h" -#include "../indev/lv_indev_private.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_obj_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_result_t event_send_core(lv_event_t * e); -static bool event_is_bubbled(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ -#if LV_USE_LOG && LV_LOG_TRACE_EVENT - #define LV_TRACE_EVENT(...) LV_LOG_TRACE(__VA_ARGS__) -#else - #define LV_TRACE_EVENT(...) -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_result_t lv_obj_send_event(lv_obj_t * obj, lv_event_code_t event_code, void * param) -{ - if(obj == NULL) return LV_RESULT_OK; - - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_event_t e; - e.current_target = obj; - e.original_target = obj; - e.code = event_code; - e.user_data = NULL; - e.param = param; - e.deleted = 0; - e.stop_bubbling = 0; - e.stop_processing = 0; - - lv_event_push(&e); - - /*Send the event*/ - lv_result_t res = event_send_core(&e); - - /*Remove this element from the list*/ - lv_event_pop(&e); - - return res; -} - -lv_result_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e) -{ - const lv_obj_class_t * base; - if(class_p == NULL) base = ((lv_obj_t *)e->current_target)->class_p; - else base = class_p->base_class; - - /*Find a base in which call the ancestor's event handler_cb if set*/ - while(base && base->event_cb == NULL) base = base->base_class; - - if(base == NULL) return LV_RESULT_OK; - if(base->event_cb == NULL) return LV_RESULT_OK; - - /*Call the actual event callback*/ - e->user_data = NULL; - base->event_cb(base, e); - - lv_result_t res = LV_RESULT_OK; - /*Stop if the object is deleted*/ - if(e->deleted) res = LV_RESULT_INVALID; - - return res; -} - -lv_event_dsc_t * lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_obj_allocate_spec_attr(obj); - - return lv_event_add(&obj->spec_attr->event_list, event_cb, filter, user_data); -} - -uint32_t lv_obj_get_event_count(lv_obj_t * obj) -{ - LV_ASSERT_NULL(obj); - if(obj->spec_attr == NULL) return 0; - return lv_event_get_count(&obj->spec_attr->event_list); -} - -lv_event_dsc_t * lv_obj_get_event_dsc(lv_obj_t * obj, uint32_t index) -{ - LV_ASSERT_NULL(obj); - if(obj->spec_attr == NULL) return NULL; - return lv_event_get_dsc(&obj->spec_attr->event_list, index); -} - -bool lv_obj_remove_event(lv_obj_t * obj, uint32_t index) -{ - LV_ASSERT_NULL(obj); - if(obj->spec_attr == NULL) return false; - return lv_event_remove(&obj->spec_attr->event_list, index); -} - -bool lv_obj_remove_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb) -{ - LV_ASSERT_NULL(obj); - - uint32_t event_cnt = lv_obj_get_event_count(obj); - uint32_t i; - for(i = 0; i < event_cnt; i++) { - lv_event_dsc_t * dsc = lv_obj_get_event_dsc(obj, i); - if(dsc->cb == event_cb) { - lv_obj_remove_event(obj, i); - return true; - } - } - - return false; -} - -bool lv_obj_remove_event_dsc(lv_obj_t * obj, lv_event_dsc_t * dsc) -{ - LV_ASSERT_NULL(obj); - LV_ASSERT_NULL(dsc); - if(obj->spec_attr == NULL) return false; - return lv_event_remove_dsc(&obj->spec_attr->event_list, dsc); -} - -uint32_t lv_obj_remove_event_cb_with_user_data(lv_obj_t * obj, lv_event_cb_t event_cb, void * user_data) -{ - LV_ASSERT_NULL(obj); - - uint32_t event_cnt = lv_obj_get_event_count(obj); - uint32_t removed_count = 0; - int32_t i; - - for(i = event_cnt - 1; i >= 0; i--) { - lv_event_dsc_t * dsc = lv_obj_get_event_dsc(obj, i); - if(dsc && dsc->cb == event_cb && dsc->user_data == user_data) { - lv_obj_remove_event(obj, i); - removed_count ++; - } - } - - return removed_count; -} - -lv_obj_t * lv_event_get_current_target_obj(lv_event_t * e) -{ - return lv_event_get_current_target(e); -} - -lv_obj_t * lv_event_get_target_obj(lv_event_t * e) -{ - return lv_event_get_target(e); -} - -lv_indev_t * lv_event_get_indev(lv_event_t * e) -{ - - if(e->code == LV_EVENT_PRESSED || - e->code == LV_EVENT_PRESSING || - e->code == LV_EVENT_PRESS_LOST || - e->code == LV_EVENT_SHORT_CLICKED || - e->code == LV_EVENT_LONG_PRESSED || - e->code == LV_EVENT_LONG_PRESSED_REPEAT || - e->code == LV_EVENT_CLICKED || - e->code == LV_EVENT_RELEASED || - e->code == LV_EVENT_SCROLL_BEGIN || - e->code == LV_EVENT_SCROLL_END || - e->code == LV_EVENT_SCROLL || - e->code == LV_EVENT_GESTURE || - e->code == LV_EVENT_KEY || - e->code == LV_EVENT_FOCUSED || - e->code == LV_EVENT_DEFOCUSED || - e->code == LV_EVENT_LEAVE || - e->code == LV_EVENT_HOVER_OVER || - e->code == LV_EVENT_HOVER_LEAVE) { - return lv_event_get_param(e); - } - else { - LV_LOG_WARN("Not interpreted with this event code"); - return NULL; - } -} - -lv_layer_t * lv_event_get_layer(lv_event_t * e) -{ - if(e->code == LV_EVENT_DRAW_MAIN || - e->code == LV_EVENT_DRAW_MAIN_BEGIN || - e->code == LV_EVENT_DRAW_MAIN_END || - e->code == LV_EVENT_DRAW_POST || - e->code == LV_EVENT_DRAW_POST_BEGIN || - e->code == LV_EVENT_DRAW_POST_END) { - return lv_event_get_param(e); - } - else { - LV_LOG_WARN("Not interpreted with this event code"); - return NULL; - } -} - -const lv_area_t * lv_event_get_old_size(lv_event_t * e) -{ - if(e->code == LV_EVENT_SIZE_CHANGED) { - return lv_event_get_param(e); - } - else { - LV_LOG_WARN("Not interpreted with this event code"); - return NULL; - } -} - -uint32_t lv_event_get_key(lv_event_t * e) -{ - if(e->code == LV_EVENT_KEY) { - uint32_t * k = lv_event_get_param(e); - if(k) return *k; - else return 0; - } - else { - LV_LOG_WARN("Not interpreted with this event code"); - return 0; - } -} - -int32_t lv_event_get_rotary_diff(lv_event_t * e) -{ - if(e->code == LV_EVENT_ROTARY) { - int32_t * r = lv_event_get_param(e); - if(r) return *r; - else return 0; - } - else { - LV_LOG_WARN("Not interpreted with this event code"); - return 0; - } -} - -lv_anim_t * lv_event_get_scroll_anim(lv_event_t * e) -{ - if(e->code == LV_EVENT_SCROLL_BEGIN) { - return lv_event_get_param(e); - } - else { - LV_LOG_WARN("Not interpreted with this event code"); - return NULL; - } -} - -void lv_event_set_ext_draw_size(lv_event_t * e, int32_t size) -{ - if(e->code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - int32_t * cur_size = lv_event_get_param(e); - *cur_size = LV_MAX(*cur_size, size); - } - else { - LV_LOG_WARN("Not interpreted with this event code"); - } -} - -lv_point_t * lv_event_get_self_size_info(lv_event_t * e) -{ - if(e->code == LV_EVENT_GET_SELF_SIZE) { - return lv_event_get_param(e); - } - else { - LV_LOG_WARN("Not interpreted with this event code"); - return 0; - } -} - -lv_hit_test_info_t * lv_event_get_hit_test_info(lv_event_t * e) -{ - if(e->code == LV_EVENT_HIT_TEST) { - return lv_event_get_param(e); - } - else { - LV_LOG_WARN("Not interpreted with this event code"); - return 0; - } -} - -const lv_area_t * lv_event_get_cover_area(lv_event_t * e) -{ - if(e->code == LV_EVENT_COVER_CHECK) { - lv_cover_check_info_t * p = lv_event_get_param(e); - return p->area; - } - else { - LV_LOG_WARN("Not interpreted with this event code"); - return NULL; - } -} - -void lv_event_set_cover_res(lv_event_t * e, lv_cover_res_t res) -{ - if(e->code == LV_EVENT_COVER_CHECK) { - lv_cover_check_info_t * p = lv_event_get_param(e); - if(res > p->res) p->res = res; /*Save only "stronger" results*/ - } - else { - LV_LOG_WARN("Not interpreted with this event code"); - } -} - -lv_draw_task_t * lv_event_get_draw_task(lv_event_t * e) -{ - if(e->code == LV_EVENT_DRAW_TASK_ADDED) { - return lv_event_get_param(e); - } - else { - LV_LOG_WARN("Not interpreted with this event code"); - return NULL; - } - -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static lv_result_t event_send_core(lv_event_t * e) -{ - LV_TRACE_EVENT("Sending event %d to %p with %p param", e->code, (void *)e->original_target, e->param); - - /*Call the input device's feedback callback if set*/ - lv_indev_t * indev_act = lv_indev_active(); - if(indev_act) { - if(e->stop_processing) return LV_RESULT_OK; - if(e->deleted) return LV_RESULT_INVALID; - } - - lv_obj_t * target = e->current_target; - lv_result_t res = LV_RESULT_OK; - lv_event_list_t * list = target->spec_attr ? &target->spec_attr->event_list : NULL; - - res = lv_event_send(list, e, true); - if(res != LV_RESULT_OK || e->stop_processing) return res; - - res = lv_obj_event_base(NULL, e); - if(res != LV_RESULT_OK || e->stop_processing) return res; - - res = lv_event_send(list, e, false); - if(res != LV_RESULT_OK || e->stop_processing) return res; - - lv_obj_t * parent = lv_obj_get_parent(e->current_target); - if(parent && event_is_bubbled(e)) { - e->current_target = parent; - res = event_send_core(e); - if(res != LV_RESULT_OK || e->stop_processing || e->stop_bubbling) return res; - } - - return res; -} - -static bool event_is_bubbled(lv_event_t * e) -{ - if(e->stop_bubbling) return false; - - /*Event codes that always bubble*/ - switch(e->code) { - case LV_EVENT_CHILD_CREATED: - case LV_EVENT_CHILD_DELETED: - return true; - default: - break; - } - - /*Check other codes only if bubbling is enabled*/ - if(lv_obj_has_flag(e->current_target, LV_OBJ_FLAG_EVENT_BUBBLE) == false) return false; - - switch(e->code) { - case LV_EVENT_HIT_TEST: - case LV_EVENT_COVER_CHECK: - case LV_EVENT_REFR_EXT_DRAW_SIZE: - case LV_EVENT_DRAW_MAIN_BEGIN: - case LV_EVENT_DRAW_MAIN: - case LV_EVENT_DRAW_MAIN_END: - case LV_EVENT_DRAW_POST_BEGIN: - case LV_EVENT_DRAW_POST: - case LV_EVENT_DRAW_POST_END: - case LV_EVENT_DRAW_TASK_ADDED: - case LV_EVENT_REFRESH: - case LV_EVENT_DELETE: - case LV_EVENT_CHILD_CREATED: - case LV_EVENT_CHILD_DELETED: - case LV_EVENT_CHILD_CHANGED: - case LV_EVENT_SIZE_CHANGED: - case LV_EVENT_STYLE_CHANGED: - case LV_EVENT_GET_SELF_SIZE: - return false; - default: - return true; - } -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_event.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_event.h deleted file mode 100644 index 2035f17..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_event.h +++ /dev/null @@ -1,198 +0,0 @@ -/** - * @file lv_obj_event.h - * - */ - -#ifndef LV_OBJ_EVENT_H -#define LV_OBJ_EVENT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_types.h" -#include "../misc/lv_event.h" -#include "../indev/lv_indev.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Cover check results.*/ -typedef enum { - LV_COVER_RES_COVER = 0, - LV_COVER_RES_NOT_COVER = 1, - LV_COVER_RES_MASKED = 2, -} lv_cover_res_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Send an event to the object - * @param obj pointer to an object - * @param event_code the type of the event from `lv_event_t` - * @param param arbitrary data depending on the widget type and the event. (Usually `NULL`) - * @return LV_RESULT_OK: `obj` was not deleted in the event; LV_RESULT_INVALID: `obj` was deleted in the event_code - */ -lv_result_t lv_obj_send_event(lv_obj_t * obj, lv_event_code_t event_code, void * param); - -/** - * Used by the widgets internally to call the ancestor widget types's event handler - * @param class_p pointer to the class of the widget (NOT the ancestor class) - * @param e pointer to the event descriptor - * @return LV_RESULT_OK: the target object was not deleted in the event; LV_RESULT_INVALID: it was deleted in the event_code - */ -lv_result_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e); - -/** - * Get the current target of the event. It's the object which event handler being called. - * If the event is not bubbled it's the same as "original" target. - * @param e pointer to the event descriptor - * @return the target of the event_code - */ -lv_obj_t * lv_event_get_current_target_obj(lv_event_t * e); - -/** - * Get the object originally targeted by the event. It's the same even if the event is bubbled. - * @param e pointer to the event descriptor - * @return pointer to the original target of the event_code - */ -lv_obj_t * lv_event_get_target_obj(lv_event_t * e); - -/** - * Add an event handler function for an object. - * Used by the user to react on event which happens with the object. - * An object can have multiple event handler. They will be called in the same order as they were added. - * @param obj pointer to an object - * @param filter an event code (e.g. `LV_EVENT_CLICKED`) on which the event should be called. `LV_EVENT_ALL` can be used to receive all the events. - * @param event_cb the new event function - * @param user_data custom data will be available in `event_cb` - * @return handler to the event. It can be used in `lv_obj_remove_event_dsc`. - */ -lv_event_dsc_t * lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data); - -uint32_t lv_obj_get_event_count(lv_obj_t * obj); - -lv_event_dsc_t * lv_obj_get_event_dsc(lv_obj_t * obj, uint32_t index); - -bool lv_obj_remove_event(lv_obj_t * obj, uint32_t index); - -bool lv_obj_remove_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb); - -bool lv_obj_remove_event_dsc(lv_obj_t * obj, lv_event_dsc_t * dsc); - -/** - * Remove an event_cb with user_data - * @param obj pointer to a obj - * @param event_cb the event_cb of the event to remove - * @param user_data user_data - * @return the count of the event removed - */ -uint32_t lv_obj_remove_event_cb_with_user_data(lv_obj_t * obj, lv_event_cb_t event_cb, void * user_data); - -/** - * Get the input device passed as parameter to indev related events. - * @param e pointer to an event - * @return the indev that triggered the event or NULL if called on a not indev related event - */ -lv_indev_t * lv_event_get_indev(lv_event_t * e); - -/** - * Get the draw context which should be the first parameter of the draw functions. - * Namely: `LV_EVENT_DRAW_MAIN/POST`, `LV_EVENT_DRAW_MAIN/POST_BEGIN`, `LV_EVENT_DRAW_MAIN/POST_END` - * @param e pointer to an event - * @return pointer to a draw context or NULL if called on an unrelated event - */ -lv_layer_t * lv_event_get_layer(lv_event_t * e); - -/** - * Get the old area of the object before its size was changed. Can be used in `LV_EVENT_SIZE_CHANGED` - * @param e pointer to an event - * @return the old absolute area of the object or NULL if called on an unrelated event - */ -const lv_area_t * lv_event_get_old_size(lv_event_t * e); - -/** - * Get the key passed as parameter to an event. Can be used in `LV_EVENT_KEY` - * @param e pointer to an event - * @return the triggering key or NULL if called on an unrelated event - */ -uint32_t lv_event_get_key(lv_event_t * e); - -/** - * Get the signed rotary encoder diff. passed as parameter to an event. Can be used in `LV_EVENT_ROTARY` - * @param e pointer to an event - * @return the triggering key or NULL if called on an unrelated event - */ -int32_t lv_event_get_rotary_diff(lv_event_t * e); - -/** - * Get the animation descriptor of a scrolling. Can be used in `LV_EVENT_SCROLL_BEGIN` - * @param e pointer to an event - * @return the animation that will scroll the object. (can be modified as required) - */ -lv_anim_t * lv_event_get_scroll_anim(lv_event_t * e); - -/** - * Set the new extra draw size. Can be used in `LV_EVENT_REFR_EXT_DRAW_SIZE` - * @param e pointer to an event - * @param size The new extra draw size - */ -void lv_event_set_ext_draw_size(lv_event_t * e, int32_t size); - -/** - * Get a pointer to an `lv_point_t` variable in which the self size should be saved (width in `point->x` and height `point->y`). - * Can be used in `LV_EVENT_GET_SELF_SIZE` - * @param e pointer to an event - * @return pointer to `lv_point_t` or NULL if called on an unrelated event - */ -lv_point_t * lv_event_get_self_size_info(lv_event_t * e); - -/** - * Get a pointer to an `lv_hit_test_info_t` variable in which the hit test result should be saved. Can be used in `LV_EVENT_HIT_TEST` - * @param e pointer to an event - * @return pointer to `lv_hit_test_info_t` or NULL if called on an unrelated event - */ -lv_hit_test_info_t * lv_event_get_hit_test_info(lv_event_t * e); - -/** - * Get a pointer to an area which should be examined whether the object fully covers it or not. - * Can be used in `LV_EVENT_HIT_TEST` - * @param e pointer to an event - * @return an area with absolute coordinates to check - */ -const lv_area_t * lv_event_get_cover_area(lv_event_t * e); - -/** - * Set the result of cover checking. Can be used in `LV_EVENT_COVER_CHECK` - * @param e pointer to an event - * @param res an element of ::lv_cover_check_info_t - */ -void lv_event_set_cover_res(lv_event_t * e, lv_cover_res_t res); - -/** - * Get the draw task which was just added. - * Can be used in `LV_EVENT_DRAW_TASK_ADDED event` - * @param e pointer to an event - * @return the added draw task - */ -lv_draw_task_t * lv_event_get_draw_task(lv_event_t * e); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_EVENT_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_event_private.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_event_private.h deleted file mode 100644 index 731d332..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_event_private.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @file lv_obj_event_private.h - * - */ - -#ifndef LV_OBJ_EVENT_PRIVATE_H -#define LV_OBJ_EVENT_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_obj_event.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Used as the event parameter of ::LV_EVENT_HIT_TEST to check if an `point` can click the object or not. - * `res` should be set like this: - * - If already set to `false` another event wants that point non clickable. If you want to respect it leave it as `false` or set `true` to overwrite it. - * - If already set `true` and `point` shouldn't be clickable set to `false` - * - If already set to `true` you agree that `point` can click the object leave it as `true` - */ -struct lv_hit_test_info_t { - const lv_point_t * point; /**< A point relative to screen to check if it can click the object or not*/ - bool res; /**< true: `point` can click the object; false: it cannot*/ -}; - -/** - * Used as the event parameter of ::LV_EVENT_COVER_CHECK to check if an area is covered by the object or not. - * In the event use `const lv_area_t * area = lv_event_get_cover_area(e)` to get the area to check - * and `lv_event_set_cover_res(e, res)` to set the result. - */ -struct lv_cover_check_info_t { - lv_cover_res_t res; - const lv_area_t * area; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_EVENT_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_id_builtin.c b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_id_builtin.c deleted file mode 100644 index ed8f745..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_id_builtin.c +++ /dev/null @@ -1,122 +0,0 @@ -/** - * @file lv_obj_id.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_obj_class_private.h" -#include "lv_obj_private.h" -#include "lv_global.h" -#include "../osal/lv_os.h" -#include "../stdlib/lv_sprintf.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -typedef struct _class_info_t { - const lv_obj_class_t * class_p; - uint32_t obj_count; -} class_info_t; - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -#if LV_USE_OBJ_ID && LV_USE_OBJ_ID_BUILTIN - -void lv_obj_assign_id(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_ASSERT(obj && class_p); - - uint32_t i; - uint32_t id = 0; - lv_global_t * global = LV_GLOBAL_DEFAULT(); - class_info_t * info = NULL; - - if(obj == NULL || class_p == NULL) return; - if(global == NULL) return; - - obj->id = NULL; - - for(i = 0; i < global->objid_count; i ++) { - info = ((class_info_t *)global->objid_array) + i; - if(class_p == info->class_p) break; - } - - /*Resize array*/ - if(i == global->objid_count) { - void * array = lv_realloc(global->objid_array, sizeof(class_info_t) * (global->objid_count + 1)); - LV_ASSERT_MALLOC(array); - if(array == NULL) return; - global->objid_array = array; - global->objid_count ++; - info = ((class_info_t *)global->objid_array) + i; - info->obj_count = 0; - info->class_p = class_p; - } - - id = ++info->obj_count; - - obj->id = (void *)(lv_uintptr_t)id; -} - -void lv_obj_set_id(lv_obj_t * obj, void * id) -{ - LV_ASSERT_NULL(obj); - if(obj->id) lv_obj_free_id(obj); - obj->id = id; -} - -void lv_obj_free_id(lv_obj_t * obj) -{ - LV_UNUSED(obj); - obj->id = NULL; -} - -const char * lv_obj_stringify_id(lv_obj_t * obj, char * buf, uint32_t len) -{ - const char * name; - if(obj == NULL || obj->class_p == NULL) return NULL; - if(buf == NULL) return NULL; - - name = obj->class_p->name; - if(name == NULL) name = "nameless"; - - lv_snprintf(buf, len, "%s%" LV_PRIu32 "", name, (uint32_t)(lv_uintptr_t)obj->id); - return buf; -} - -void lv_objid_builtin_destroy(void) -{ - lv_global_t * global = LV_GLOBAL_DEFAULT(); - if(global == NULL) return; - - lv_free(global->objid_array); - global->objid_count = 0; -} - -int lv_obj_id_compare(const void * id1, const void * id2) -{ - return id1 == id2 ? 0 : 1; -} - -#endif /*LV_USE_OBJ_ID_BUILTIN*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_pos.c b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_pos.c deleted file mode 100644 index 0f10d7d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_pos.c +++ /dev/null @@ -1,1183 +0,0 @@ -/** - * @file lv_obj_pos.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_area_private.h" -#include "../layouts/lv_layout_private.h" -#include "lv_obj_event_private.h" -#include "lv_obj_draw_private.h" -#include "lv_obj_private.h" -#include "../display/lv_display.h" -#include "../display/lv_display_private.h" -#include "lv_refr_private.h" -#include "../core/lv_global.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_obj_class) -#define update_layout_mutex LV_GLOBAL_DEFAULT()->layout_update_mutex - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static int32_t calc_content_width(lv_obj_t * obj); -static int32_t calc_content_height(lv_obj_t * obj); -static void layout_update_core(lv_obj_t * obj); -static void transform_point_array(const lv_obj_t * obj, lv_point_t * p, size_t p_count, bool inv); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_obj_set_pos(lv_obj_t * obj, int32_t x, int32_t y) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_set_x(obj, x); - lv_obj_set_y(obj, y); -} - -void lv_obj_set_x(lv_obj_t * obj, int32_t x) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_style_res_t res_x; - lv_style_value_t v_x; - - res_x = lv_obj_get_local_style_prop(obj, LV_STYLE_X, &v_x, 0); - - if((res_x == LV_STYLE_RES_FOUND && v_x.num != x) || res_x == LV_STYLE_RES_NOT_FOUND) { - lv_obj_set_style_x(obj, x, 0); - } -} - -void lv_obj_set_y(lv_obj_t * obj, int32_t y) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_style_res_t res_y; - lv_style_value_t v_y; - - res_y = lv_obj_get_local_style_prop(obj, LV_STYLE_Y, &v_y, 0); - - if((res_y == LV_STYLE_RES_FOUND && v_y.num != y) || res_y == LV_STYLE_RES_NOT_FOUND) { - lv_obj_set_style_y(obj, y, 0); - } -} - -bool lv_obj_refr_size(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - /*If the width or height is set by a layout do not modify them*/ - if(obj->w_layout && obj->h_layout) return false; - - lv_obj_t * parent = lv_obj_get_parent(obj); - if(parent == NULL) return false; - - bool w_is_content = false; - bool w_is_pct = false; - - int32_t w; - if(obj->w_layout) { - w = lv_obj_get_width(obj); - } - else { - w = lv_obj_get_style_width(obj, LV_PART_MAIN); - w_is_content = w == LV_SIZE_CONTENT; - w_is_pct = LV_COORD_IS_PCT(w); - int32_t parent_w = lv_obj_get_content_width(parent); - - if(w_is_content) { - w = calc_content_width(obj); - } - else if(w_is_pct) { - /*If parent has content size and the child has pct size - *a circular dependency will occur. To solve it keep child size at zero */ - if(parent->w_layout == 0 && lv_obj_get_style_width(parent, 0) == LV_SIZE_CONTENT) { - w = lv_obj_get_style_space_left(obj, 0) + lv_obj_get_style_space_right(obj, 0); - } - else { - w = (LV_COORD_GET_PCT(w) * parent_w) / 100; - w -= lv_obj_get_style_margin_left(obj, LV_PART_MAIN) + lv_obj_get_style_margin_right(obj, LV_PART_MAIN); - } - } - - int32_t minw = lv_obj_get_style_min_width(obj, LV_PART_MAIN); - int32_t maxw = lv_obj_get_style_max_width(obj, LV_PART_MAIN); - w = lv_clamp_width(w, minw, maxw, parent_w); - } - - int32_t h; - bool h_is_content = false; - bool h_is_pct = false; - if(obj->h_layout) { - h = lv_obj_get_height(obj); - } - else { - h = lv_obj_get_style_height(obj, LV_PART_MAIN); - h_is_content = h == LV_SIZE_CONTENT; - h_is_pct = LV_COORD_IS_PCT(h); - int32_t parent_h = lv_obj_get_content_height(parent); - - if(h_is_content) { - h = calc_content_height(obj); - } - else if(h_is_pct) { - /*If parent has content size and the child has pct size - *a circular dependency will occur. To solve it keep child size at zero */ - if(parent->h_layout == 0 && lv_obj_get_style_height(parent, 0) == LV_SIZE_CONTENT) { - h = lv_obj_get_style_space_top(obj, 0) + lv_obj_get_style_space_bottom(obj, 0); - } - else { - h = (LV_COORD_GET_PCT(h) * parent_h) / 100; - h -= lv_obj_get_style_margin_top(obj, LV_PART_MAIN) + lv_obj_get_style_margin_bottom(obj, LV_PART_MAIN); - } - } - - int32_t minh = lv_obj_get_style_min_height(obj, LV_PART_MAIN); - int32_t maxh = lv_obj_get_style_max_height(obj, LV_PART_MAIN); - h = lv_clamp_height(h, minh, maxh, parent_h); - } - - /*Do nothing if the size is not changed*/ - /*It is very important else recursive resizing can occur without size change*/ - if(lv_obj_get_width(obj) == w && lv_obj_get_height(obj) == h) return false; - - /*Invalidate the original area*/ - lv_obj_invalidate(obj); - - /*Save the original coordinates*/ - lv_area_t ori; - lv_obj_get_coords(obj, &ori); - - /*Check if the object inside the parent or not*/ - lv_area_t parent_fit_area; - lv_obj_get_content_coords(parent, &parent_fit_area); - - /*If the object is already out of the parent and its position is changes - *surely the scrollbars also changes so invalidate them*/ - bool on1 = lv_area_is_in(&ori, &parent_fit_area, 0); - if(!on1) lv_obj_scrollbar_invalidate(parent); - - /*Set the length and height - *Be sure the content is not scrolled in an invalid position on the new size*/ - obj->coords.y2 = obj->coords.y1 + h - 1; - if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { - obj->coords.x1 = obj->coords.x2 - w + 1; - } - else { - obj->coords.x2 = obj->coords.x1 + w - 1; - } - - /*Call the ancestor's event handler to the object with its new coordinates*/ - lv_obj_send_event(obj, LV_EVENT_SIZE_CHANGED, &ori); - - /*Call the ancestor's event handler to the parent too*/ - lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj); - - /*Invalidate the new area*/ - lv_obj_invalidate(obj); - - obj->readjust_scroll_after_layout = 1; - - /*If the object was out of the parent invalidate the new scrollbar area too. - *If it wasn't out of the parent but out now, also invalidate the scrollbars*/ - bool on2 = lv_area_is_in(&obj->coords, &parent_fit_area, 0); - if(on1 || (!on1 && on2)) lv_obj_scrollbar_invalidate(parent); - - lv_obj_refresh_ext_draw_size(obj); - - return true; -} - -void lv_obj_set_size(lv_obj_t * obj, int32_t w, int32_t h) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_set_width(obj, w); - lv_obj_set_height(obj, h); -} - -void lv_obj_set_width(lv_obj_t * obj, int32_t w) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_style_res_t res_w; - lv_style_value_t v_w; - - res_w = lv_obj_get_local_style_prop(obj, LV_STYLE_WIDTH, &v_w, 0); - - if((res_w == LV_STYLE_RES_FOUND && v_w.num != w) || res_w == LV_STYLE_RES_NOT_FOUND) { - lv_obj_set_style_width(obj, w, 0); - } -} - -void lv_obj_set_height(lv_obj_t * obj, int32_t h) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_style_res_t res_h; - lv_style_value_t v_h; - - res_h = lv_obj_get_local_style_prop(obj, LV_STYLE_HEIGHT, &v_h, 0); - - if((res_h == LV_STYLE_RES_FOUND && v_h.num != h) || res_h == LV_STYLE_RES_NOT_FOUND) { - lv_obj_set_style_height(obj, h, 0); - } -} - -void lv_obj_set_content_width(lv_obj_t * obj, int32_t w) -{ - int32_t left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); - int32_t right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); - lv_obj_set_width(obj, w + left + right); -} - -void lv_obj_set_content_height(lv_obj_t * obj, int32_t h) -{ - int32_t top = lv_obj_get_style_space_top(obj, LV_PART_MAIN); - int32_t bottom = lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); - lv_obj_set_height(obj, h + top + bottom); -} - -void lv_obj_set_layout(lv_obj_t * obj, uint32_t layout) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_set_style_layout(obj, layout, 0); - - lv_obj_mark_layout_as_dirty(obj); -} - -bool lv_obj_is_layout_positioned(const lv_obj_t * obj) -{ - if(lv_obj_has_flag_any(obj, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_FLOATING)) return false; - - lv_obj_t * parent = lv_obj_get_parent(obj); - if(parent == NULL) return false; - - uint32_t layout = lv_obj_get_style_layout(parent, LV_PART_MAIN); - if(layout) return true; - else return false; -} - -void lv_obj_mark_layout_as_dirty(lv_obj_t * obj) -{ - obj->layout_inv = 1; - - /*Mark the screen as dirty too to mark that there is something to do on this screen*/ - lv_obj_t * scr = lv_obj_get_screen(obj); - scr->scr_layout_inv = 1; - - /*Make the display refreshing*/ - lv_display_t * disp = lv_obj_get_display(scr); - lv_display_send_event(disp, LV_EVENT_REFR_REQUEST, NULL); -} - -void lv_obj_update_layout(const lv_obj_t * obj) -{ - if(update_layout_mutex) { - LV_LOG_TRACE("Already running, returning"); - return; - } - LV_PROFILER_BEGIN; - update_layout_mutex = true; - - lv_obj_t * scr = lv_obj_get_screen(obj); - /*Repeat until there are no more layout invalidations*/ - while(scr->scr_layout_inv) { - LV_LOG_TRACE("Layout update begin"); - scr->scr_layout_inv = 0; - layout_update_core(scr); - LV_LOG_TRACE("Layout update end"); - } - - update_layout_mutex = false; - LV_PROFILER_END; -} - -void lv_obj_set_align(lv_obj_t * obj, lv_align_t align) -{ - lv_obj_set_style_align(obj, align, 0); -} - -void lv_obj_align(lv_obj_t * obj, lv_align_t align, int32_t x_ofs, int32_t y_ofs) -{ - lv_obj_set_style_align(obj, align, 0); - lv_obj_set_pos(obj, x_ofs, y_ofs); -} - -void lv_obj_align_to(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, int32_t x_ofs, int32_t y_ofs) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_update_layout(obj); - if(base == NULL) base = lv_obj_get_parent(obj); - - LV_ASSERT_OBJ(base, MY_CLASS); - - int32_t x = 0; - int32_t y = 0; - - lv_obj_t * parent = lv_obj_get_parent(obj); - - LV_ASSERT_OBJ(parent, MY_CLASS); - - int32_t pleft = lv_obj_get_style_space_left(parent, LV_PART_MAIN); - int32_t ptop = lv_obj_get_style_space_top(parent, LV_PART_MAIN); - - int32_t bleft = lv_obj_get_style_space_left(base, LV_PART_MAIN); - int32_t btop = lv_obj_get_style_space_top(base, LV_PART_MAIN); - - if(align == LV_ALIGN_DEFAULT) { - if(lv_obj_get_style_base_dir(base, LV_PART_MAIN) == LV_BASE_DIR_RTL) align = LV_ALIGN_TOP_RIGHT; - else align = LV_ALIGN_TOP_LEFT; - } - - switch(align) { - case LV_ALIGN_CENTER: - x = lv_obj_get_content_width(base) / 2 - lv_obj_get_width(obj) / 2 + bleft; - y = lv_obj_get_content_height(base) / 2 - lv_obj_get_height(obj) / 2 + btop; - break; - - case LV_ALIGN_TOP_LEFT: - x = bleft; - y = btop; - break; - - case LV_ALIGN_TOP_MID: - x = lv_obj_get_content_width(base) / 2 - lv_obj_get_width(obj) / 2 + bleft; - y = btop; - break; - - case LV_ALIGN_TOP_RIGHT: - x = lv_obj_get_content_width(base) - lv_obj_get_width(obj) + bleft; - y = btop; - break; - - case LV_ALIGN_BOTTOM_LEFT: - x = bleft; - y = lv_obj_get_content_height(base) - lv_obj_get_height(obj) + btop; - break; - case LV_ALIGN_BOTTOM_MID: - x = lv_obj_get_content_width(base) / 2 - lv_obj_get_width(obj) / 2 + bleft; - y = lv_obj_get_content_height(base) - lv_obj_get_height(obj) + btop; - break; - - case LV_ALIGN_BOTTOM_RIGHT: - x = lv_obj_get_content_width(base) - lv_obj_get_width(obj) + bleft; - y = lv_obj_get_content_height(base) - lv_obj_get_height(obj) + btop; - break; - - case LV_ALIGN_LEFT_MID: - x = bleft; - y = lv_obj_get_content_height(base) / 2 - lv_obj_get_height(obj) / 2 + btop; - break; - - case LV_ALIGN_RIGHT_MID: - x = lv_obj_get_content_width(base) - lv_obj_get_width(obj) + bleft; - y = lv_obj_get_content_height(base) / 2 - lv_obj_get_height(obj) / 2 + btop; - break; - - case LV_ALIGN_OUT_TOP_LEFT: - x = 0; - y = -lv_obj_get_height(obj); - break; - - case LV_ALIGN_OUT_TOP_MID: - x = lv_obj_get_width(base) / 2 - lv_obj_get_width(obj) / 2; - y = -lv_obj_get_height(obj); - break; - - case LV_ALIGN_OUT_TOP_RIGHT: - x = lv_obj_get_width(base) - lv_obj_get_width(obj); - y = -lv_obj_get_height(obj); - break; - - case LV_ALIGN_OUT_BOTTOM_LEFT: - x = 0; - y = lv_obj_get_height(base); - break; - - case LV_ALIGN_OUT_BOTTOM_MID: - x = lv_obj_get_width(base) / 2 - lv_obj_get_width(obj) / 2; - y = lv_obj_get_height(base); - break; - - case LV_ALIGN_OUT_BOTTOM_RIGHT: - x = lv_obj_get_width(base) - lv_obj_get_width(obj); - y = lv_obj_get_height(base); - break; - - case LV_ALIGN_OUT_LEFT_TOP: - x = -lv_obj_get_width(obj); - y = 0; - break; - - case LV_ALIGN_OUT_LEFT_MID: - x = -lv_obj_get_width(obj); - y = lv_obj_get_height(base) / 2 - lv_obj_get_height(obj) / 2; - break; - - case LV_ALIGN_OUT_LEFT_BOTTOM: - x = -lv_obj_get_width(obj); - y = lv_obj_get_height(base) - lv_obj_get_height(obj); - break; - - case LV_ALIGN_OUT_RIGHT_TOP: - x = lv_obj_get_width(base); - y = 0; - break; - - case LV_ALIGN_OUT_RIGHT_MID: - x = lv_obj_get_width(base); - y = lv_obj_get_height(base) / 2 - lv_obj_get_height(obj) / 2; - break; - - case LV_ALIGN_OUT_RIGHT_BOTTOM: - x = lv_obj_get_width(base); - y = lv_obj_get_height(base) - lv_obj_get_height(obj); - break; - - case LV_ALIGN_DEFAULT: - break; - } - - if(LV_COORD_IS_PCT(x_ofs)) x_ofs = (lv_obj_get_width(base) * LV_COORD_GET_PCT(x_ofs)) / 100; - if(LV_COORD_IS_PCT(y_ofs)) y_ofs = (lv_obj_get_height(base) * LV_COORD_GET_PCT(y_ofs)) / 100; - if(lv_obj_get_style_base_dir(parent, LV_PART_MAIN) == LV_BASE_DIR_RTL) { - x += x_ofs + base->coords.x1 - parent->coords.x1 + lv_obj_get_scroll_right(parent) - pleft; - } - else { - x += x_ofs + base->coords.x1 - parent->coords.x1 + lv_obj_get_scroll_left(parent) - pleft; - } - y += y_ofs + base->coords.y1 - parent->coords.y1 + lv_obj_get_scroll_top(parent) - ptop; - lv_obj_set_style_align(obj, LV_ALIGN_TOP_LEFT, 0); - lv_obj_set_pos(obj, x, y); - -} - -void lv_obj_get_coords(const lv_obj_t * obj, lv_area_t * coords) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_area_copy(coords, &obj->coords); -} - -int32_t lv_obj_get_x(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - int32_t rel_x; - lv_obj_t * parent = lv_obj_get_parent(obj); - if(parent) { - rel_x = obj->coords.x1 - parent->coords.x1; - rel_x += lv_obj_get_scroll_x(parent); - rel_x -= lv_obj_get_style_space_left(parent, LV_PART_MAIN); - } - else { - rel_x = obj->coords.x1; - } - return rel_x; -} - -int32_t lv_obj_get_x2(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - return lv_obj_get_x(obj) + lv_obj_get_width(obj); -} - -int32_t lv_obj_get_y(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - int32_t rel_y; - lv_obj_t * parent = lv_obj_get_parent(obj); - if(parent) { - rel_y = obj->coords.y1 - parent->coords.y1; - rel_y += lv_obj_get_scroll_y(parent); - rel_y -= lv_obj_get_style_space_top(parent, LV_PART_MAIN); - } - else { - rel_y = obj->coords.y1; - } - return rel_y; -} - -int32_t lv_obj_get_y2(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - return lv_obj_get_y(obj) + lv_obj_get_height(obj); -} - -int32_t lv_obj_get_x_aligned(const lv_obj_t * obj) -{ - return lv_obj_get_style_x(obj, LV_PART_MAIN); -} - -int32_t lv_obj_get_y_aligned(const lv_obj_t * obj) -{ - return lv_obj_get_style_y(obj, LV_PART_MAIN); -} - -int32_t lv_obj_get_width(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - return lv_area_get_width(&obj->coords); -} - -int32_t lv_obj_get_height(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - return lv_area_get_height(&obj->coords); -} - -int32_t lv_obj_get_content_width(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - int32_t left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); - int32_t right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); - - return lv_obj_get_width(obj) - left - right; -} - -int32_t lv_obj_get_content_height(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - int32_t top = lv_obj_get_style_space_top(obj, LV_PART_MAIN); - int32_t bottom = lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); - - return lv_obj_get_height(obj) - top - bottom; -} - -void lv_obj_get_content_coords(const lv_obj_t * obj, lv_area_t * area) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_get_coords(obj, area); - area->x1 += lv_obj_get_style_space_left(obj, LV_PART_MAIN); - area->x2 -= lv_obj_get_style_space_right(obj, LV_PART_MAIN); - area->y1 += lv_obj_get_style_space_top(obj, LV_PART_MAIN); - area->y2 -= lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); - -} - -int32_t lv_obj_get_self_width(const lv_obj_t * obj) -{ - lv_point_t p = {0, LV_COORD_MIN}; - lv_obj_send_event((lv_obj_t *)obj, LV_EVENT_GET_SELF_SIZE, &p); - return p.x; -} - -int32_t lv_obj_get_self_height(const lv_obj_t * obj) -{ - lv_point_t p = {LV_COORD_MIN, 0}; - lv_obj_send_event((lv_obj_t *)obj, LV_EVENT_GET_SELF_SIZE, &p); - return p.y; -} - -bool lv_obj_refresh_self_size(lv_obj_t * obj) -{ - int32_t w_set = lv_obj_get_style_width(obj, LV_PART_MAIN); - int32_t h_set = lv_obj_get_style_height(obj, LV_PART_MAIN); - if(w_set != LV_SIZE_CONTENT && h_set != LV_SIZE_CONTENT) return false; - - lv_obj_mark_layout_as_dirty(obj); - return true; -} - -void lv_obj_refr_pos(lv_obj_t * obj) -{ - if(lv_obj_is_layout_positioned(obj)) return; - - lv_obj_t * parent = lv_obj_get_parent(obj); - int32_t x = lv_obj_get_style_x(obj, LV_PART_MAIN); - int32_t y = lv_obj_get_style_y(obj, LV_PART_MAIN); - - if(parent == NULL) { - lv_obj_move_to(obj, x, y); - return; - } - - /*Handle percentage value*/ - int32_t pw = lv_obj_get_content_width(parent); - int32_t ph = lv_obj_get_content_height(parent); - if(LV_COORD_IS_PCT(x)) x = (pw * LV_COORD_GET_PCT(x)) / 100; - if(LV_COORD_IS_PCT(y)) y = (ph * LV_COORD_GET_PCT(y)) / 100; - - /*Handle percentage value of translate*/ - int32_t tr_x = lv_obj_get_style_translate_x(obj, LV_PART_MAIN); - int32_t tr_y = lv_obj_get_style_translate_y(obj, LV_PART_MAIN); - int32_t w = lv_obj_get_width(obj); - int32_t h = lv_obj_get_height(obj); - if(LV_COORD_IS_PCT(tr_x)) tr_x = (w * LV_COORD_GET_PCT(tr_x)) / 100; - if(LV_COORD_IS_PCT(tr_y)) tr_y = (h * LV_COORD_GET_PCT(tr_y)) / 100; - - /*Use the translation*/ - x += tr_x; - y += tr_y; - - lv_align_t align = lv_obj_get_style_align(obj, LV_PART_MAIN); - - if(align == LV_ALIGN_DEFAULT) { - if(lv_obj_get_style_base_dir(parent, LV_PART_MAIN) == LV_BASE_DIR_RTL) align = LV_ALIGN_TOP_RIGHT; - else align = LV_ALIGN_TOP_LEFT; - } - - switch(align) { - case LV_ALIGN_TOP_LEFT: - break; - case LV_ALIGN_TOP_MID: - x += pw / 2 - w / 2; - break; - case LV_ALIGN_TOP_RIGHT: - x += pw - w; - break; - case LV_ALIGN_LEFT_MID: - y += ph / 2 - h / 2; - break; - case LV_ALIGN_BOTTOM_LEFT: - y += ph - h; - break; - case LV_ALIGN_BOTTOM_MID: - x += pw / 2 - w / 2; - y += ph - h; - break; - case LV_ALIGN_BOTTOM_RIGHT: - x += pw - w; - y += ph - h; - break; - case LV_ALIGN_RIGHT_MID: - x += pw - w; - y += ph / 2 - h / 2; - break; - case LV_ALIGN_CENTER: - x += pw / 2 - w / 2; - y += ph / 2 - h / 2; - break; - default: - break; - } - - lv_obj_move_to(obj, x, y); -} - -void lv_obj_move_to(lv_obj_t * obj, int32_t x, int32_t y) -{ - /*Convert x and y to absolute coordinates*/ - lv_obj_t * parent = obj->parent; - - if(parent) { - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_FLOATING)) { - x += parent->coords.x1; - y += parent->coords.y1; - } - else { - x += parent->coords.x1 - lv_obj_get_scroll_x(parent); - y += parent->coords.y1 - lv_obj_get_scroll_y(parent); - } - - x += lv_obj_get_style_space_left(parent, LV_PART_MAIN); - y += lv_obj_get_style_space_top(parent, LV_PART_MAIN); - } - - /*Calculate and set the movement*/ - lv_point_t diff; - diff.x = x - obj->coords.x1; - diff.y = y - obj->coords.y1; - - /*Do nothing if the position is not changed*/ - /*It is very important else recursive positioning can - *occur without position change*/ - if(diff.x == 0 && diff.y == 0) return; - - /*Invalidate the original area*/ - lv_obj_invalidate(obj); - - /*Save the original coordinates*/ - lv_area_t ori; - lv_obj_get_coords(obj, &ori); - - /*Check if the object inside the parent or not*/ - lv_area_t parent_fit_area; - bool on1 = false; - if(parent) { - lv_obj_get_content_coords(parent, &parent_fit_area); - - /*If the object is already out of the parent and its position is changes - *surely the scrollbars also changes so invalidate them*/ - on1 = lv_area_is_in(&ori, &parent_fit_area, 0); - if(!on1) lv_obj_scrollbar_invalidate(parent); - } - - obj->coords.x1 += diff.x; - obj->coords.y1 += diff.y; - obj->coords.x2 += diff.x; - obj->coords.y2 += diff.y; - - lv_obj_move_children_by(obj, diff.x, diff.y, false); - - /*Call the ancestor's event handler to the parent too*/ - if(parent) lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj); - - /*Invalidate the new area*/ - lv_obj_invalidate(obj); - - /*If the object was out of the parent invalidate the new scrollbar area too. - *If it wasn't out of the parent but out now, also invalidate the scrollbars*/ - if(parent) { - bool on2 = lv_area_is_in(&obj->coords, &parent_fit_area, 0); - if(on1 || (!on1 && on2)) lv_obj_scrollbar_invalidate(parent); - } -} - -void lv_obj_move_children_by(lv_obj_t * obj, int32_t x_diff, int32_t y_diff, bool ignore_floating) -{ - uint32_t i; - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - if(ignore_floating && lv_obj_has_flag(child, LV_OBJ_FLAG_FLOATING)) continue; - child->coords.x1 += x_diff; - child->coords.y1 += y_diff; - child->coords.x2 += x_diff; - child->coords.y2 += y_diff; - - lv_obj_move_children_by(child, x_diff, y_diff, false); - } -} - -void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, lv_obj_point_transform_flag_t flags) -{ - lv_obj_transform_point_array(obj, p, 1, flags); -} - -void lv_obj_transform_point_array(const lv_obj_t * obj, lv_point_t points[], size_t count, - lv_obj_point_transform_flag_t flags) -{ - if(obj) { - lv_layer_type_t layer_type = lv_obj_get_layer_type(obj); - bool do_tranf = layer_type == LV_LAYER_TYPE_TRANSFORM; - bool recursive = flags & LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE; - bool inverse = flags & LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE; - if(inverse) { - if(recursive) lv_obj_transform_point_array(lv_obj_get_parent(obj), points, count, flags); - if(do_tranf) transform_point_array(obj, points, count, inverse); - } - else { - if(do_tranf) transform_point_array(obj, points, count, inverse); - if(recursive) lv_obj_transform_point_array(lv_obj_get_parent(obj), points, count, flags); - } - } -} - -void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, lv_obj_point_transform_flag_t flags) -{ - lv_point_t p[4] = { - {area->x1, area->y1}, - {area->x1, area->y2 + 1}, - {area->x2 + 1, area->y1}, - {area->x2 + 1, area->y2 + 1}, - }; - - lv_obj_transform_point_array(obj, p, 4, flags); - - area->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x); - area->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x); - area->y1 = LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y); - area->y2 = LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y); -} - -void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_display_t * disp = lv_obj_get_display(obj); - if(!lv_display_is_invalidation_enabled(disp)) return; - - lv_area_t area_tmp; - lv_area_copy(&area_tmp, area); - - if(!lv_obj_area_is_visible(obj, &area_tmp)) return; -#if LV_DRAW_TRANSFORM_USE_MATRIX - /** - * When using the global matrix, the vertex coordinates of clip_area lose precision after transformation, - * which can be solved by expanding the redrawing area. - */ - lv_area_increase(&area_tmp, 5, 5); -#else - if(obj->spec_attr && obj->spec_attr->layer_type == LV_LAYER_TYPE_TRANSFORM) { - /*Make the area slightly larger to avoid rounding errors. - *5 is an empirical value*/ - lv_area_increase(&area_tmp, 5, 5); - } -#endif - - lv_inv_area(lv_obj_get_display(obj), &area_tmp); -} - -void lv_obj_invalidate(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - /*Truncate the area to the object*/ - lv_area_t obj_coords; - int32_t ext_size = lv_obj_get_ext_draw_size(obj); - lv_area_copy(&obj_coords, &obj->coords); - obj_coords.x1 -= ext_size; - obj_coords.y1 -= ext_size; - obj_coords.x2 += ext_size; - obj_coords.y2 += ext_size; - - lv_obj_invalidate_area(obj, &obj_coords); -} - -bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area) -{ - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return false; - - /*Invalidate the object only if it belongs to the current or previous or one of the layers'*/ - lv_obj_t * obj_scr = lv_obj_get_screen(obj); - lv_display_t * disp = lv_obj_get_display(obj_scr); - if(obj_scr != lv_display_get_screen_active(disp) && - obj_scr != lv_display_get_screen_prev(disp) && - obj_scr != lv_display_get_layer_bottom(disp) && - obj_scr != lv_display_get_layer_top(disp) && - obj_scr != lv_display_get_layer_sys(disp)) { - return false; - } - - /*Truncate the area to the object*/ - lv_area_t obj_coords; - int32_t ext_size = lv_obj_get_ext_draw_size(obj); - lv_area_copy(&obj_coords, &obj->coords); - lv_area_increase(&obj_coords, ext_size, ext_size); - - /*The area is not on the object*/ - if(!lv_area_intersect(area, area, &obj_coords)) return false; - - lv_obj_get_transformed_area(obj, area, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE); - - /*Truncate recursively to the parents*/ - lv_obj_t * parent = lv_obj_get_parent(obj); - while(parent != NULL) { - /*If the parent is hidden then the child is hidden and won't be drawn*/ - if(lv_obj_has_flag(parent, LV_OBJ_FLAG_HIDDEN)) return false; - - /*Truncate to the parent and if no common parts break*/ - lv_area_t parent_coords = parent->coords; - if(lv_obj_has_flag(parent, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { - int32_t parent_ext_size = lv_obj_get_ext_draw_size(parent); - lv_area_increase(&parent_coords, parent_ext_size, parent_ext_size); - } - - lv_obj_get_transformed_area(parent, &parent_coords, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE); - if(!lv_area_intersect(area, area, &parent_coords)) return false; - - parent = lv_obj_get_parent(parent); - } - - return true; -} - -bool lv_obj_is_visible(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_area_t obj_coords; - int32_t ext_size = lv_obj_get_ext_draw_size(obj); - lv_area_copy(&obj_coords, &obj->coords); - obj_coords.x1 -= ext_size; - obj_coords.y1 -= ext_size; - obj_coords.x2 += ext_size; - obj_coords.y2 += ext_size; - - return lv_obj_area_is_visible(obj, &obj_coords); -} - -void lv_obj_set_ext_click_area(lv_obj_t * obj, int32_t size) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_allocate_spec_attr(obj); - obj->spec_attr->ext_click_pad = size; -} - -void lv_obj_get_click_area(const lv_obj_t * obj, lv_area_t * area) -{ - lv_area_copy(area, &obj->coords); - if(obj->spec_attr) { - lv_area_increase(area, obj->spec_attr->ext_click_pad, obj->spec_attr->ext_click_pad); - } -} - -bool lv_obj_hit_test(lv_obj_t * obj, const lv_point_t * point) -{ - if(!lv_obj_has_flag(obj, LV_OBJ_FLAG_CLICKABLE)) return false; - - lv_area_t a; - lv_obj_get_click_area(obj, &a); - bool res = lv_area_is_point_on(&a, point, 0); - if(res == false) return false; - - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_ADV_HITTEST)) { - lv_hit_test_info_t hit_info; - hit_info.point = point; - hit_info.res = true; - lv_obj_send_event(obj, LV_EVENT_HIT_TEST, &hit_info); - return hit_info.res; - } - - return res; -} - -int32_t lv_clamp_width(int32_t width, int32_t min_width, int32_t max_width, int32_t ref_width) -{ - if(LV_COORD_IS_PCT(min_width)) min_width = (ref_width * LV_COORD_GET_PCT(min_width)) / 100; - if(LV_COORD_IS_PCT(max_width)) max_width = (ref_width * LV_COORD_GET_PCT(max_width)) / 100; - return LV_CLAMP(min_width, width, max_width); -} - -int32_t lv_clamp_height(int32_t height, int32_t min_height, int32_t max_height, int32_t ref_height) -{ - if(LV_COORD_IS_PCT(min_height)) min_height = (ref_height * LV_COORD_GET_PCT(min_height)) / 100; - if(LV_COORD_IS_PCT(max_height)) max_height = (ref_height * LV_COORD_GET_PCT(max_height)) / 100; - return LV_CLAMP(min_height, height, max_height); -} - -void lv_obj_center(lv_obj_t * obj) -{ - lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static int32_t calc_content_width(lv_obj_t * obj) -{ - int32_t scroll_x_tmp = lv_obj_get_scroll_x(obj); - if(obj->spec_attr) obj->spec_attr->scroll.x = 0; - - int32_t space_right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); - int32_t space_left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); - - int32_t self_w; - self_w = lv_obj_get_self_width(obj) + space_left + space_right; - - int32_t child_res = LV_COORD_MIN; - uint32_t i; - uint32_t child_cnt = lv_obj_get_child_count(obj); - /*With RTL find the left most coordinate*/ - if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { - for(i = 0; i < child_cnt; i++) { - int32_t child_res_tmp = LV_COORD_MIN; - lv_obj_t * child = obj->spec_attr->children[i]; - if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; - - if(!lv_obj_is_layout_positioned(child)) { - lv_align_t align = lv_obj_get_style_align(child, 0); - switch(align) { - case LV_ALIGN_DEFAULT: - case LV_ALIGN_TOP_RIGHT: - case LV_ALIGN_BOTTOM_RIGHT: - case LV_ALIGN_RIGHT_MID: - /*Normal right aligns. Other are ignored due to possible circular dependencies*/ - child_res_tmp = obj->coords.x2 - child->coords.x1 + 1; - break; - default: - /* Consider other cases only if x=0 and use the width of the object. - * With x!=0 circular dependency could occur. */ - if(lv_obj_get_style_x(child, 0) == 0) { - child_res_tmp = lv_area_get_width(&child->coords) + space_right; - child_res_tmp += lv_obj_get_style_margin_left(child, LV_PART_MAIN); - } - break; - } - } - else { - child_res_tmp = obj->coords.x2 - child->coords.x1 + 1; - } - child_res = LV_MAX(child_res, child_res_tmp + lv_obj_get_style_margin_left(child, LV_PART_MAIN)); - } - if(child_res != LV_COORD_MIN) { - child_res += space_left; - } - } - /*Else find the right most coordinate*/ - else { - for(i = 0; i < child_cnt; i++) { - int32_t child_res_tmp = LV_COORD_MIN; - lv_obj_t * child = obj->spec_attr->children[i]; - if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; - - if(!lv_obj_is_layout_positioned(child)) { - lv_align_t align = lv_obj_get_style_align(child, 0); - switch(align) { - case LV_ALIGN_DEFAULT: - case LV_ALIGN_TOP_LEFT: - case LV_ALIGN_BOTTOM_LEFT: - case LV_ALIGN_LEFT_MID: - /*Normal left aligns.*/ - child_res_tmp = child->coords.x2 - obj->coords.x1 + 1; - break; - default: - /* Consider other cases only if x=0 and use the width of the object. - * With x!=0 circular dependency could occur. */ - if(lv_obj_get_style_x(child, 0) == 0) { - child_res_tmp = lv_area_get_width(&child->coords) + space_left; - child_res_tmp += lv_obj_get_style_margin_right(child, LV_PART_MAIN); - } - break; - } - } - else { - child_res_tmp = child->coords.x2 - obj->coords.x1 + 1; - } - - child_res = LV_MAX(child_res, child_res_tmp + lv_obj_get_style_margin_right(child, LV_PART_MAIN)); - } - - if(child_res != LV_COORD_MIN) { - child_res += space_right; - } - } - - if(obj->spec_attr) obj->spec_attr->scroll.x = -scroll_x_tmp; - - if(child_res == LV_COORD_MIN) return self_w; - return LV_MAX(child_res, self_w); -} - -static int32_t calc_content_height(lv_obj_t * obj) -{ - int32_t scroll_y_tmp = lv_obj_get_scroll_y(obj); - if(obj->spec_attr) obj->spec_attr->scroll.y = 0; - - int32_t space_top = lv_obj_get_style_space_top(obj, LV_PART_MAIN); - int32_t space_bottom = lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); - - int32_t self_h; - self_h = lv_obj_get_self_height(obj) + space_top + space_bottom; - - int32_t child_res = LV_COORD_MIN; - uint32_t i; - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(i = 0; i < child_cnt; i++) { - int32_t child_res_tmp = LV_COORD_MIN; - lv_obj_t * child = obj->spec_attr->children[i]; - if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; - - if(!lv_obj_is_layout_positioned(child)) { - lv_align_t align = lv_obj_get_style_align(child, 0); - switch(align) { - case LV_ALIGN_DEFAULT: - case LV_ALIGN_TOP_RIGHT: - case LV_ALIGN_TOP_MID: - case LV_ALIGN_TOP_LEFT: - /*Normal top aligns. */ - child_res_tmp = child->coords.y2 - obj->coords.y1 + 1; - break; - default: - /* Consider other cases only if y=0 and use the height of the object. - * With y!=0 circular dependency could occur. */ - if(lv_obj_get_style_y(child, 0) == 0) { - child_res_tmp = lv_area_get_height(&child->coords) + space_top; - child_res_tmp += lv_obj_get_style_margin_top(child, LV_PART_MAIN); - } - break; - } - } - else { - child_res_tmp = child->coords.y2 - obj->coords.y1 + 1; - } - - child_res = LV_MAX(child_res, child_res_tmp + lv_obj_get_style_margin_bottom(child, LV_PART_MAIN)); - } - - if(obj->spec_attr) obj->spec_attr->scroll.y = -scroll_y_tmp; - - if(child_res == LV_COORD_MIN) return self_h; - return LV_MAX(self_h, child_res + space_bottom); -} - -static void layout_update_core(lv_obj_t * obj) -{ - uint32_t i; - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - layout_update_core(child); - } - - if(obj->layout_inv) { - obj->layout_inv = 0; - lv_obj_refr_size(obj); - lv_obj_refr_pos(obj); - - if(child_cnt > 0) { - lv_layout_apply(obj); - } - } - - if(obj->readjust_scroll_after_layout) { - obj->readjust_scroll_after_layout = 0; - lv_obj_readjust_scroll(obj, LV_ANIM_OFF); - } -} - -static void transform_point_array(const lv_obj_t * obj, lv_point_t * p, size_t p_count, bool inv) -{ - int32_t angle = lv_obj_get_style_transform_rotation(obj, 0); - int32_t scale_x = lv_obj_get_style_transform_scale_x_safe(obj, 0); - int32_t scale_y = lv_obj_get_style_transform_scale_y_safe(obj, 0); - if(scale_x == 0) scale_x = 1; - if(scale_y == 0) scale_y = 1; - - if(angle == 0 && scale_x == LV_SCALE_NONE && scale_y == LV_SCALE_NONE) return; - - lv_point_t pivot = { - .x = lv_obj_get_style_transform_pivot_x(obj, 0), - .y = lv_obj_get_style_transform_pivot_y(obj, 0) - }; - - if(LV_COORD_IS_PCT(pivot.x)) { - pivot.x = (LV_COORD_GET_PCT(pivot.x) * lv_area_get_width(&obj->coords)) / 100; - } - if(LV_COORD_IS_PCT(pivot.y)) { - pivot.y = (LV_COORD_GET_PCT(pivot.y) * lv_area_get_height(&obj->coords)) / 100; - } - - pivot.x = obj->coords.x1 + pivot.x; - pivot.y = obj->coords.y1 + pivot.y; - - if(inv) { - angle = -angle; - scale_x = (256 * 256 + scale_x - 1) / scale_x; - scale_y = (256 * 256 + scale_y - 1) / scale_y; - } - - lv_point_array_transform(p, p_count, angle, scale_x, scale_y, &pivot, !inv); -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_pos.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_pos.h deleted file mode 100644 index 584f0b7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_pos.h +++ /dev/null @@ -1,451 +0,0 @@ -/** - * @file lv_obj_pos.h - * - */ - -#ifndef LV_OBJ_POS_H -#define LV_OBJ_POS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_area.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - /** No flags */ - LV_OBJ_POINT_TRANSFORM_FLAG_NONE = 0x00, - - /** Consider the transformation properties of the parents too */ - LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE = 0x01, - - /** Execute the inverse of the transformation (-angle and 1/zoom) */ - LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE = 0x02, - - /** Both inverse and recursive*/ - LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE = 0x03, -} lv_obj_point_transform_flag_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Set the position of an object relative to the set alignment. - * @param obj pointer to an object - * @param x new x coordinate - * @param y new y coordinate - * @note With default alignment it's the distance from the top left corner - * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent - * @note The position is interpreted on the content area of the parent - * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)` - */ -void lv_obj_set_pos(lv_obj_t * obj, int32_t x, int32_t y); - -/** - * Set the x coordinate of an object - * @param obj pointer to an object - * @param x new x coordinate - * @note With default alignment it's the distance from the top left corner - * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent - * @note The position is interpreted on the content area of the parent - * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)` - */ -void lv_obj_set_x(lv_obj_t * obj, int32_t x); - -/** - * Set the y coordinate of an object - * @param obj pointer to an object - * @param y new y coordinate - * @note With default alignment it's the distance from the top left corner - * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent - * @note The position is interpreted on the content area of the parent - * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)` - */ -void lv_obj_set_y(lv_obj_t * obj, int32_t y); - -/** - * Set the size of an object. - * @param obj pointer to an object - * @param w the new width - * @param h the new height - * @note possible values are: - * pixel simple set the size accordingly - * LV_SIZE_CONTENT set the size to involve all children in the given direction - * lv_pct(x) to set size in percentage of the parent's content area size (the size without paddings). - * x should be in [0..1000]% range - */ -void lv_obj_set_size(lv_obj_t * obj, int32_t w, int32_t h); - -/** - * Recalculate the size of the object - * @param obj pointer to an object - * @return true: the size has been changed - */ -bool lv_obj_refr_size(lv_obj_t * obj); - -/** - * Set the width of an object - * @param obj pointer to an object - * @param w the new width - * @note possible values are: - * pixel simple set the size accordingly - * LV_SIZE_CONTENT set the size to involve all children in the given direction - * lv_pct(x) to set size in percentage of the parent's content area size (the size without paddings). - * x should be in [0..1000]% range - */ -void lv_obj_set_width(lv_obj_t * obj, int32_t w); - -/** - * Set the height of an object - * @param obj pointer to an object - * @param h the new height - * @note possible values are: - * pixel simple set the size accordingly - * LV_SIZE_CONTENT set the size to involve all children in the given direction - * lv_pct(x) to set size in percentage of the parent's content area size (the size without paddings). - * x should be in [0..1000]% range - */ -void lv_obj_set_height(lv_obj_t * obj, int32_t h); - -/** - * Set the width reduced by the left and right padding and the border width. - * @param obj pointer to an object - * @param w the width without paddings in pixels - */ -void lv_obj_set_content_width(lv_obj_t * obj, int32_t w); - -/** - * Set the height reduced by the top and bottom padding and the border width. - * @param obj pointer to an object - * @param h the height without paddings in pixels - */ -void lv_obj_set_content_height(lv_obj_t * obj, int32_t h); - -/** - * Set a layout for an object - * @param obj pointer to an object - * @param layout pointer to a layout descriptor to set - */ -void lv_obj_set_layout(lv_obj_t * obj, uint32_t layout); - -/** - * Test whether the and object is positioned by a layout or not - * @param obj pointer to an object to test - * @return true: positioned by a layout; false: not positioned by a layout - */ -bool lv_obj_is_layout_positioned(const lv_obj_t * obj); - -/** - * Mark the object for layout update. - * @param obj pointer to an object whose children needs to be updated - */ -void lv_obj_mark_layout_as_dirty(lv_obj_t * obj); - -/** - * Update the layout of an object. - * @param obj pointer to an object whose children needs to be updated - */ -void lv_obj_update_layout(const lv_obj_t * obj); - -/** - * Change the alignment of an object. - * @param obj pointer to an object to align - * @param align type of alignment (see 'lv_align_t' enum) `LV_ALIGN_OUT_...` can't be used. - */ -void lv_obj_set_align(lv_obj_t * obj, lv_align_t align); - -/** - * Change the alignment of an object and set new coordinates. - * Equivalent to: - * lv_obj_set_align(obj, align); - * lv_obj_set_pos(obj, x_ofs, y_ofs); - * @param obj pointer to an object to align - * @param align type of alignment (see 'lv_align_t' enum) `LV_ALIGN_OUT_...` can't be used. - * @param x_ofs x coordinate offset after alignment - * @param y_ofs y coordinate offset after alignment - */ -void lv_obj_align(lv_obj_t * obj, lv_align_t align, int32_t x_ofs, int32_t y_ofs); - -/** - * Align an object to another object. - * @param obj pointer to an object to align - * @param base pointer to another object (if NULL `obj`s parent is used). 'obj' will be aligned to it. - * @param align type of alignment (see 'lv_align_t' enum) - * @param x_ofs x coordinate offset after alignment - * @param y_ofs y coordinate offset after alignment - * @note if the position or size of `base` changes `obj` needs to be aligned manually again - */ -void lv_obj_align_to(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, int32_t x_ofs, - int32_t y_ofs); - -/** - * Align an object to the center on its parent. - * @param obj pointer to an object to align - * @note if the parent size changes `obj` needs to be aligned manually again - */ -void lv_obj_center(lv_obj_t * obj); - -/** - * Copy the coordinates of an object to an area - * @param obj pointer to an object - * @param coords pointer to an area to store the coordinates - */ -void lv_obj_get_coords(const lv_obj_t * obj, lv_area_t * coords); - -/** - * Get the x coordinate of object. - * @param obj pointer to an object - * @return distance of `obj` from the left side of its parent plus the parent's left padding - * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation - * call `lv_obj_update_layout(obj)`. - * @note Zero return value means the object is on the left padding of the parent, and not on the left edge. - * @note Scrolling of the parent doesn't change the returned value. - * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. - */ -int32_t lv_obj_get_x(const lv_obj_t * obj); - -/** - * Get the x2 coordinate of object. - * @param obj pointer to an object - * @return distance of `obj` from the right side of its parent plus the parent's right padding - * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation - * call `lv_obj_update_layout(obj)`. - * @note Zero return value means the object is on the right padding of the parent, and not on the right edge. - * @note Scrolling of the parent doesn't change the returned value. - * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. - */ -int32_t lv_obj_get_x2(const lv_obj_t * obj); - -/** - * Get the y coordinate of object. - * @param obj pointer to an object - * @return distance of `obj` from the top side of its parent plus the parent's top padding - * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation - * call `lv_obj_update_layout(obj)`. - * @note Zero return value means the object is on the top padding of the parent, and not on the top edge. - * @note Scrolling of the parent doesn't change the returned value. - * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. - */ -int32_t lv_obj_get_y(const lv_obj_t * obj); - -/** - * Get the y2 coordinate of object. - * @param obj pointer to an object - * @return distance of `obj` from the bottom side of its parent plus the parent's bottom padding - * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation - * call `lv_obj_update_layout(obj)`. - * @note Zero return value means the object is on the bottom padding of the parent, and not on the bottom edge. - * @note Scrolling of the parent doesn't change the returned value. - * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. - */ -int32_t lv_obj_get_y2(const lv_obj_t * obj); - -/** - * Get the actually set x coordinate of object, i.e. the offset from the set alignment - * @param obj pointer to an object - * @return the set x coordinate - */ -int32_t lv_obj_get_x_aligned(const lv_obj_t * obj); - -/** - * Get the actually set y coordinate of object, i.e. the offset from the set alignment - * @param obj pointer to an object - * @return the set y coordinate - */ -int32_t lv_obj_get_y_aligned(const lv_obj_t * obj); - -/** - * Get the width of an object - * @param obj pointer to an object - * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation - * call `lv_obj_update_layout(obj)`. - * @return the width in pixels - */ -int32_t lv_obj_get_width(const lv_obj_t * obj); - -/** - * Get the height of an object - * @param obj pointer to an object - * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation - * call `lv_obj_update_layout(obj)`. - * @return the height in pixels - */ -int32_t lv_obj_get_height(const lv_obj_t * obj); - -/** - * Get the width reduced by the left and right padding and the border width. - * @param obj pointer to an object - * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation - * call `lv_obj_update_layout(obj)`. - * @return the width which still fits into its parent without causing overflow (making the parent scrollable) - */ -int32_t lv_obj_get_content_width(const lv_obj_t * obj); - -/** - * Get the height reduced by the top and bottom padding and the border width. - * @param obj pointer to an object - * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation - * call `lv_obj_update_layout(obj)`. - * @return the height which still fits into the parent without causing overflow (making the parent scrollable) - */ -int32_t lv_obj_get_content_height(const lv_obj_t * obj); - -/** - * Get the area reduced by the paddings and the border width. - * @param obj pointer to an object - * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation - * call `lv_obj_update_layout(obj)`. - * @param area the area which still fits into the parent without causing overflow (making the parent scrollable) - */ -void lv_obj_get_content_coords(const lv_obj_t * obj, lv_area_t * area); - -/** - * Get the width occupied by the "parts" of the widget. E.g. the width of all columns of a table. - * @param obj pointer to an objects - * @return the width of the virtually drawn content - * @note This size independent from the real size of the widget. - * It just tells how large the internal ("virtual") content is. - */ -int32_t lv_obj_get_self_width(const lv_obj_t * obj); - -/** - * Get the height occupied by the "parts" of the widget. E.g. the height of all rows of a table. - * @param obj pointer to an objects - * @return the width of the virtually drawn content - * @note This size independent from the real size of the widget. - * It just tells how large the internal ("virtual") content is. - */ -int32_t lv_obj_get_self_height(const lv_obj_t * obj); - -/** - * Handle if the size of the internal ("virtual") content of an object has changed. - * @param obj pointer to an object - * @return false: nothing happened; true: refresh happened - */ -bool lv_obj_refresh_self_size(lv_obj_t * obj); - -void lv_obj_refr_pos(lv_obj_t * obj); - -void lv_obj_move_to(lv_obj_t * obj, int32_t x, int32_t y); - -void lv_obj_move_children_by(lv_obj_t * obj, int32_t x_diff, int32_t y_diff, bool ignore_floating); - -/** - * Transform a point using the angle and zoom style properties of an object - * @param obj pointer to an object whose style properties should be used - * @param p a point to transform, the result will be written back here too - * @param flags OR-ed valued of :cpp:enum:`lv_obj_point_transform_flag_t` - */ -void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, lv_obj_point_transform_flag_t flags); - -/** - * Transform an array of points using the angle and zoom style properties of an object - * @param obj pointer to an object whose style properties should be used - * @param points the array of points to transform, the result will be written back here too - * @param count number of points in the array - * @param flags OR-ed valued of :cpp:enum:`lv_obj_point_transform_flag_t` - */ -void lv_obj_transform_point_array(const lv_obj_t * obj, lv_point_t points[], size_t count, - lv_obj_point_transform_flag_t flags); - -/** - * Transform an area using the angle and zoom style properties of an object - * @param obj pointer to an object whose style properties should be used - * @param area an area to transform, the result will be written back here too - * @param flags OR-ed valued of :cpp:enum:`lv_obj_point_transform_flag_t` - */ -void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, lv_obj_point_transform_flag_t flags); - -/** - * Mark an area of an object as invalid. - * The area will be truncated to the object's area and marked for redraw. - * @param obj pointer to an object - * @param area the area to redraw - */ -void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area); - -/** - * Mark the object as invalid to redrawn its area - * @param obj pointer to an object - */ -void lv_obj_invalidate(const lv_obj_t * obj); - -/** - * Tell whether an area of an object is visible (even partially) now or not - * @param obj pointer to an object - * @param area the are to check. The visible part of the area will be written back here. - * @return true visible; false not visible (hidden, out of parent, on other screen, etc) - */ -bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area); - -/** - * Tell whether an object is visible (even partially) now or not - * @param obj pointer to an object - * @return true: visible; false not visible (hidden, out of parent, on other screen, etc) - */ -bool lv_obj_is_visible(const lv_obj_t * obj); - -/** - * Set the size of an extended clickable area - * @param obj pointer to an object - * @param size extended clickable area in all 4 directions [px] - */ -void lv_obj_set_ext_click_area(lv_obj_t * obj, int32_t size); - -/** - * Get the an area where to object can be clicked. - * It's the object's normal area plus the extended click area. - * @param obj pointer to an object - * @param area store the result area here - */ -void lv_obj_get_click_area(const lv_obj_t * obj, lv_area_t * area); - -/** - * Hit-test an object given a particular point in screen space. - * @param obj object to hit-test - * @param point screen-space point (absolute coordinate) - * @return true: if the object is considered under the point - */ -bool lv_obj_hit_test(lv_obj_t * obj, const lv_point_t * point); - -/** - * Clamp a width between min and max width. If the min/max width is in percentage value use the ref_width - * @param width width to clamp - * @param min_width the minimal width - * @param max_width the maximal width - * @param ref_width the reference width used when min/max width is in percentage - * @return the clamped width - */ -int32_t lv_clamp_width(int32_t width, int32_t min_width, int32_t max_width, int32_t ref_width); - -/** - * Clamp a height between min and max height. If the min/max height is in percentage value use the ref_height - * @param height height to clamp - * @param min_height the minimal height - * @param max_height the maximal height - * @param ref_height the reference height used when min/max height is in percentage - * @return the clamped height - */ -int32_t lv_clamp_height(int32_t height, int32_t min_height, int32_t max_height, int32_t ref_height); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_POS_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_private.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_private.h deleted file mode 100644 index d9eee49..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_private.h +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @file lv_obj_private.h - * - */ - -#ifndef LV_OBJ_PRIVATE_H -#define LV_OBJ_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Special, rarely used attributes. - * They are allocated automatically if any elements is set. - */ -struct lv_obj_spec_attr_t { - lv_obj_t ** children; /**< Store the pointer of the children in an array.*/ - lv_group_t * group_p; - lv_event_list_t event_list; - - lv_point_t scroll; /**< The current X/Y scroll offset*/ - - int32_t ext_click_pad; /**< Extra click padding in all direction*/ - int32_t ext_draw_size; /**< EXTend the size in every direction for drawing.*/ - - uint16_t child_cnt; /**< Number of children*/ - uint16_t scrollbar_mode : 2; /**< How to display scrollbars, see `lv_scrollbar_mode_t`*/ - uint16_t scroll_snap_x : 2; /**< Where to align the snappable children horizontally, see `lv_scroll_snap_t`*/ - uint16_t scroll_snap_y : 2; /**< Where to align the snappable children vertically*/ - uint16_t scroll_dir : 4; /**< The allowed scroll direction(s), see `lv_dir_t`*/ - uint16_t layer_type : 2; /**< Cache the layer type here. Element of lv_intermediate_layer_type_t */ -}; - -struct lv_obj_t { - const lv_obj_class_t * class_p; - lv_obj_t * parent; - lv_obj_spec_attr_t * spec_attr; - lv_obj_style_t * styles; -#if LV_OBJ_STYLE_CACHE - uint32_t style_main_prop_is_set; - uint32_t style_other_prop_is_set; -#endif - void * user_data; -#if LV_USE_OBJ_ID - void * id; -#endif - lv_area_t coords; - lv_obj_flag_t flags; - lv_state_t state; - uint16_t layout_inv : 1; - uint16_t readjust_scroll_after_layout : 1; - uint16_t scr_layout_inv : 1; - uint16_t skip_trans : 1; - uint16_t style_cnt : 6; - uint16_t h_layout : 1; - uint16_t w_layout : 1; - uint16_t is_deleting : 1; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_property.c b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_property.c deleted file mode 100644 index 405b006..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_property.c +++ /dev/null @@ -1,302 +0,0 @@ -/** - * @file lv_obj_id.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_obj_private.h" -#include "../core/lv_obj.h" -#include "../stdlib/lv_string.h" -#include "../misc/lv_utils.h" -#include "lv_obj_property.h" -#include "lv_obj_class_private.h" - -#if LV_USE_OBJ_PROPERTY - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef void (*lv_property_set_int_t)(lv_obj_t *, int32_t); -typedef void (*lv_property_set_bool_t)(lv_obj_t *, bool); -typedef void (*lv_property_set_precise_t)(lv_obj_t *, lv_value_precise_t); -typedef void (*lv_property_set_color_t)(lv_obj_t *, lv_color_t); -typedef void (*lv_property_set_point_t)(lv_obj_t *, lv_point_t *); -typedef void (*lv_property_set_pointer_t)(lv_obj_t *, const void *); -typedef lv_result_t (*lv_property_setter_t)(lv_obj_t *, lv_prop_id_t, const lv_property_t *); - -typedef int32_t (*lv_property_get_int_t)(const lv_obj_t *); -typedef bool (*lv_property_get_bool_t)(const lv_obj_t *); -typedef lv_value_precise_t (*lv_property_get_precise_t)(const lv_obj_t *); -typedef lv_color_t (*lv_property_get_color_t)(const lv_obj_t *); -typedef lv_point_t (*lv_property_get_point_t)(lv_obj_t *); -typedef void * (*lv_property_get_pointer_t)(const lv_obj_t *); -typedef lv_result_t (*lv_property_getter_t)(const lv_obj_t *, lv_prop_id_t, lv_property_t *); - -/********************** - * STATIC PROTOTYPES - **********************/ - -static lv_result_t obj_property(lv_obj_t * obj, lv_prop_id_t id, lv_property_t * value, bool set); -static int property_name_compare(const void * ref, const void * element); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_result_t lv_obj_set_property(lv_obj_t * obj, const lv_property_t * value) -{ - LV_ASSERT(obj && value); - - uint32_t index = LV_PROPERTY_ID_INDEX(value->id); - if(value->id == LV_PROPERTY_ID_INVALID || index > LV_PROPERTY_ID_ANY) { - LV_LOG_WARN("Invalid property id set to %p", obj); - return LV_RESULT_INVALID; - } - - if(index < LV_PROPERTY_ID_START) { - lv_obj_set_local_style_prop(obj, index, value->style, value->selector); - return LV_RESULT_OK; - } - - return obj_property(obj, value->id, (lv_property_t *)value, true); -} - -lv_result_t lv_obj_set_properties(lv_obj_t * obj, const lv_property_t * value, uint32_t count) -{ - for(uint32_t i = 0; i < count; i++) { - lv_result_t result = lv_obj_set_property(obj, &value[i]); - if(result != LV_RESULT_OK) { - return result; - } - } - - return LV_RESULT_OK; -} - -lv_property_t lv_obj_get_property(lv_obj_t * obj, lv_prop_id_t id) -{ - lv_result_t result; - lv_property_t value = { 0 }; - - uint32_t index = LV_PROPERTY_ID_INDEX(id); - if(id == LV_PROPERTY_ID_INVALID || index > LV_PROPERTY_ID_ANY) { - LV_LOG_WARN("Invalid property id to get from %p", obj); - value.id = LV_PROPERTY_ID_INVALID; - value.num = 0; - return value; - } - - if(index < LV_PROPERTY_ID_START) { - lv_obj_get_local_style_prop(obj, index, &value.style, 0); - value.id = id; - value.selector = 0; - return value; - } - - result = obj_property(obj, id, &value, false); - if(result != LV_RESULT_OK) - value.id = LV_PROPERTY_ID_INVALID; - - return value; -} - -lv_property_t lv_obj_get_style_property(lv_obj_t * obj, lv_prop_id_t id, uint32_t selector) -{ - lv_property_t value; - uint32_t index = LV_PROPERTY_ID_INDEX(id); - - if(index == LV_PROPERTY_ID_INVALID || index >= LV_PROPERTY_ID_START) { - LV_LOG_WARN("invalid style property id 0x%" LV_PRIx32, id); - value.id = LV_PROPERTY_ID_INVALID; - value.num = 0; - return value; - } - - lv_obj_get_local_style_prop(obj, id, &value.style, selector); - value.id = id; - value.selector = selector; - return value; -} - -lv_prop_id_t lv_style_property_get_id(const char * name) -{ -#if LV_USE_OBJ_PROPERTY_NAME - lv_property_name_t * found; - /*Check style property*/ - found = lv_utils_bsearch(name, lv_style_property_names, sizeof(lv_style_property_names) / sizeof(lv_property_name_t), - sizeof(lv_property_name_t), property_name_compare); - if(found) return found->id; -#else - LV_UNUSED(name); -#endif - return LV_PROPERTY_ID_INVALID; -} - -lv_prop_id_t lv_obj_class_property_get_id(const lv_obj_class_t * clz, const char * name) -{ -#if LV_USE_OBJ_PROPERTY_NAME - const lv_property_name_t * names; - lv_property_name_t * found; - - names = clz->property_names; - if(names == NULL) { - /* try base class*/ - return LV_PROPERTY_ID_INVALID; - } - - found = lv_utils_bsearch(name, names, clz->names_count, sizeof(lv_property_name_t), property_name_compare); - if(found) return found->id; -#else - LV_UNUSED(obj); - LV_UNUSED(name); - LV_UNUSED(property_name_compare); -#endif - return LV_PROPERTY_ID_INVALID; -} - -lv_prop_id_t lv_obj_property_get_id(const lv_obj_t * obj, const char * name) -{ -#if LV_USE_OBJ_PROPERTY_NAME - const lv_obj_class_t * clz; - lv_prop_id_t id; - - for(clz = obj->class_p; clz; clz = clz->base_class) { - id = lv_obj_class_property_get_id(clz, name); - if(id != LV_PROPERTY_ID_INVALID) return id; - } - - /*Check style property*/ - id = lv_style_property_get_id(name); - if(id != LV_PROPERTY_ID_INVALID) return id; -#else - LV_UNUSED(obj); - LV_UNUSED(name); - LV_UNUSED(property_name_compare); -#endif - return LV_PROPERTY_ID_INVALID; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static lv_result_t obj_property(lv_obj_t * obj, lv_prop_id_t id, lv_property_t * value, bool set) -{ - const lv_property_ops_t * properties; - const lv_property_ops_t * prop; - - const lv_obj_class_t * clz; - uint32_t index = LV_PROPERTY_ID_INDEX(id); - - for(clz = obj->class_p ; clz; clz = clz->base_class) { - properties = clz->properties; - if(properties == NULL) { - /* try base class*/ - continue; - } - - if(id != LV_PROPERTY_ID_ANY && (index < clz->prop_index_start || index > clz->prop_index_end)) { - /* try base class*/ - continue; - } - - /*Check if there's setter available for this class*/ - for(uint32_t i = 0; i < clz->properties_count; i++) { - prop = &properties[i]; - - /*pass id and value directly to widget's property method*/ - if(prop->id == LV_PROPERTY_ID_ANY) { - value->id = prop->id; - if(set) return ((lv_property_setter_t)prop->setter)(obj, id, value); - else return ((lv_property_getter_t)prop->getter)(obj, id, value); - } - - /*Not this id, check next*/ - if(prop->id != id) - continue; - - /*id matched but we got null pointer to functions*/ - if(set ? prop->setter == NULL : prop->getter == NULL) { - LV_LOG_WARN("NULL %s provided, id: 0x%" LV_PRIx32, set ? "setter" : "getter", id); - return LV_RESULT_INVALID; - } - - /*Update value id if it's a read*/ - if(!set) value->id = prop->id; - - switch(LV_PROPERTY_ID_TYPE(prop->id)) { - case LV_PROPERTY_TYPE_INT: { - if(set)((lv_property_set_int_t)(prop->setter))(obj, value->num); - else value->num = ((lv_property_get_int_t)(prop->getter))(obj); - break; - } - case LV_PROPERTY_TYPE_BOOL: { - if(set)((lv_property_set_bool_t)(prop->setter))(obj, value->enable); - else value->enable = ((lv_property_get_bool_t)(prop->getter))(obj); - break; - } - - case LV_PROPERTY_TYPE_PRECISE: { - if(set)((lv_property_set_precise_t)(prop->setter))(obj, value->precise); - else value->precise = ((lv_property_get_precise_t)(prop->getter))(obj); - break; - } - case LV_PROPERTY_TYPE_COLOR: { - if(set)((lv_property_set_color_t)prop->setter)(obj, value->color); - else value->color = ((lv_property_get_color_t)(prop->getter))(obj); - break; - } - case LV_PROPERTY_TYPE_POINT: { - lv_point_t * point = &value->point; - if(set)((lv_property_set_point_t)(prop->setter))(obj, point); - else *point = ((lv_property_get_point_t)(prop->getter))(obj); - break; - } - case LV_PROPERTY_TYPE_POINTER: - case LV_PROPERTY_TYPE_IMGSRC: - case LV_PROPERTY_TYPE_TEXT: - case LV_PROPERTY_TYPE_OBJ: - case LV_PROPERTY_TYPE_DISPLAY: - case LV_PROPERTY_TYPE_FONT: { - if(set)((lv_property_set_pointer_t)(prop->setter))(obj, value->ptr); - else value->ptr = ((lv_property_get_pointer_t)(prop->getter))(obj); - break; - } - default: { - LV_LOG_WARN("Unknown property id: 0x%08" LV_PRIx32, prop->id); - return LV_RESULT_INVALID; - } - } - - return LV_RESULT_OK; - } - - /*If no setter found, try base class then*/ - } - - LV_LOG_WARN("Unknown property id: 0x%08" LV_PRIx32, id); - return LV_RESULT_INVALID; -} - -static int property_name_compare(const void * ref, const void * element) -{ - const lv_property_name_t * prop = element; - return lv_strcmp(ref, prop->name); -} - -#endif /*LV_USE_OBJ_PROPERTY*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_property.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_property.h deleted file mode 100644 index 4c8c142..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_property.h +++ /dev/null @@ -1,209 +0,0 @@ -/** - * @file lv_obj_property.h - * - */ - -#ifndef LV_OBJ_PROPERTY_H -#define LV_OBJ_PROPERTY_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_types.h" -#include "../misc/lv_style.h" - -#if LV_USE_OBJ_PROPERTY - -/********************* - * DEFINES - *********************/ - -/*All possible property value types*/ -#define LV_PROPERTY_TYPE_INVALID 0 /*Use default 0 as invalid to detect program outliers*/ -#define LV_PROPERTY_TYPE_INT 1 /*int32_t type*/ -#define LV_PROPERTY_TYPE_PRECISE 2 /*lv_value_precise_t, int32_t or float depending on LV_USE_FLOAT*/ -#define LV_PROPERTY_TYPE_COLOR 3 /*ARGB8888 type*/ -#define LV_PROPERTY_TYPE_POINT 4 /*lv_point_t */ -#define LV_PROPERTY_TYPE_POINTER 5 /*void * pointer*/ -#define LV_PROPERTY_TYPE_IMGSRC 6 /*Special pointer for image*/ -#define LV_PROPERTY_TYPE_TEXT 7 /*Special pointer of char* */ -#define LV_PROPERTY_TYPE_OBJ 8 /*Special pointer of lv_obj_t* */ -#define LV_PROPERTY_TYPE_DISPLAY 9 /*Special pointer of lv_display_t* */ -#define LV_PROPERTY_TYPE_FONT 10 /*Special pointer of lv_font_t* */ -#define LV_PROPERTY_TYPE_BOOL 11 /*int32_t type*/ - -#define LV_PROPERTY_TYPE_SHIFT 28 -#define LV_PROPERTY_ID(clz, name, type, index) LV_PROPERTY_## clz ##_##name = (LV_PROPERTY_## clz ##_START + (index)) | ((type) << LV_PROPERTY_TYPE_SHIFT) - -#define LV_PROPERTY_ID_TYPE(id) ((id) >> LV_PROPERTY_TYPE_SHIFT) -#define LV_PROPERTY_ID_INDEX(id) ((id) & 0xfffffff) - -/*Set properties from an array of lv_property_t*/ -#define LV_OBJ_SET_PROPERTY_ARRAY(obj, array) lv_obj_set_properties(obj, array, sizeof(array)/sizeof(array[0])) - - -/********************** - * TYPEDEFS - **********************/ - -/** - * Group of predefined widget ID start value. - */ -enum { - LV_PROPERTY_ID_INVALID = 0, - - /*ID 0x01 to 0xff are style ID, check lv_style_prop_t*/ - LV_PROPERTY_STYLE_START = 0x00, - - LV_PROPERTY_ID_START = 0x0100, /*ID smaller than 0xff is style ID*/ - /*Define the property ID for every widget here. */ - LV_PROPERTY_OBJ_START = 0x0100, /* lv_obj.c */ - LV_PROPERTY_IMAGE_START = 0x0200, /* lv_image.c */ - LV_PROPERTY_LABEL_START = 0x0300, /* lv_label.c */ - LV_PROPERTY_KEYBOARD_START = 0x0400, /* lv_keyboard.c */ - LV_PROPERTY_TEXTAREA_START = 0x0500, /* lv_textarea.c */ - LV_PROPERTY_ROLLER_START = 0x0600, /* lv_roller.c */ - LV_PROPERTY_DROPDOWN_START = 0x0700, /* lv_dropdown.c */ - - /*Special ID, use it to extend ID and make sure it's unique and compile time determinant*/ - LV_PROPERTY_ID_BUILTIN_LAST = 0xffff, /*ID of 0x10000 ~ 0xfffffff is reserved for user*/ - - LV_PROPERTY_ID_ANY = 0x7ffffffe, /*Special ID used by lvgl to intercept all setter/getter call.*/ -}; - -struct lv_property_name_t { - const char * name; - lv_prop_id_t id; -}; - -typedef struct { - lv_prop_id_t id; - union { - int32_t num; /**< Number integer number (opacity, enums, booleans or "normal" numbers)*/ - bool enable; /**< booleans*/ - const void * ptr; /**< Constant pointers (font, cone text, etc)*/ - lv_color_t color; /**< Colors*/ - lv_value_precise_t precise; /**< float or int for precise value*/ - lv_point_t point; /**< Point*/ - struct { - /** - * Note that place struct member `style` at first place is intended. - * `style` shares same memory with `num`, `ptr`, `color`. - * So we set the style value directly without using `prop.style.num`. - * - * E.g. - * - * static const lv_property_t obj_pos_x = { - * .id = LV_PROPERTY_STYLE_X, - * .num = 123, - * .selector = LV_STATE_PRESSED, - * } - * - * instead of: - * static const lv_property_t obj_pos_x = { - * .id = LV_PROPERTY_STYLE_X, - * .style.num = 123, // note this line. - * .selector = LV_STATE_PRESSED, - * } - */ - lv_style_value_t style; /**< Make sure it's the first element in struct. */ - uint32_t selector; /**< Style selector, lv_part_t | lv_state_t */ - }; - }; -} lv_property_t; - -typedef struct { - lv_prop_id_t id; - - void * setter; /**< Callback used to set property. */ - void * getter; /**< Callback used to get property. */ -} lv_property_ops_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/*===================== - * Setter functions - *====================*/ - -/** - * Set widget property. - * @param obj pointer to an object - * @param value The property value to set - * @return return LV_RESULT_OK if success - */ -lv_result_t lv_obj_set_property(lv_obj_t * obj, const lv_property_t * value); - -/** - * Set multiple widget properties. Helper `LV_OBJ_SET_PROPERTY_ARRAY` can be used for constant property array. - * @param obj pointer to an object - * @param value The property value array to set - * @param count The count of the property value array - * @return return LV_RESULT_OK if success - */ -lv_result_t lv_obj_set_properties(lv_obj_t * obj, const lv_property_t * value, uint32_t count); - -/*===================== - * Getter functions - *====================*/ - -/** - * Read property value from object. - * If id is a style property, the style selector is default to 0. - * @param obj pointer to an object - * @param id ID of which property to read - * @return return the property value read. The returned property ID is set to `LV_PROPERTY_ID_INVALID` if failed. - */ -lv_property_t lv_obj_get_property(lv_obj_t * obj, lv_prop_id_t id); - -/** - * Read a style property value from object - * @param obj pointer to an object - * @param id ID of style property - * @param selector selector for the style property. - * @return return the property value read. The returned property ID is set to `LV_PROPERTY_ID_INVALID` if failed. - */ -lv_property_t lv_obj_get_style_property(lv_obj_t * obj, lv_prop_id_t id, uint32_t selector); - -/** - * Get the property ID by name recursively to base classes. Requires to enable `LV_USE_OBJ_PROPERTY_NAME`. - * @param obj pointer to an object that has specified property or base class has. - * @param name property name - * @return property ID found or `LV_PROPERTY_ID_INVALID` if not found. - */ -lv_prop_id_t lv_obj_property_get_id(const lv_obj_t * obj, const char * name); - -/** - * Get the property ID by name without check base class recursively. Requires to enable `LV_USE_OBJ_PROPERTY_NAME`. - * @param clz pointer to an object class that has specified property or base class has. - * @param name property name - * @return property ID found or `LV_PROPERTY_ID_INVALID` if not found. - */ -lv_prop_id_t lv_obj_class_property_get_id(const lv_obj_class_t * clz, const char * name); - -/** - * Get the style property ID by name. Requires to enable `LV_USE_OBJ_PROPERTY_NAME`. - * @param name property name - * @return property ID found or `LV_PROPERTY_ID_INVALID` if not found. - */ -lv_prop_id_t lv_style_property_get_id(const char * name); - -/********************** - * MACROS - **********************/ - -#include "../widgets/property/lv_obj_property_names.h" -#include "../widgets/property/lv_style_properties.h" - -#endif /*LV_USE_OBJ_PROPERTY*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_PROPERTY_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_scroll.c b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_scroll.c deleted file mode 100644 index fa5e16f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_scroll.c +++ /dev/null @@ -1,799 +0,0 @@ -/** - * @file lv_obj_scroll.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_obj_scroll_private.h" -#include "../misc/lv_anim_private.h" -#include "lv_obj_private.h" -#include "../indev/lv_indev.h" -#include "../indev/lv_indev_scroll.h" -#include "../display/lv_display.h" -#include "../misc/lv_area.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_obj_class) -#define SCROLL_ANIM_TIME_MIN 200 /*ms*/ -#define SCROLL_ANIM_TIME_MAX 400 /*ms*/ -#define SCROLLBAR_MIN_SIZE (LV_DPX(10)) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void scroll_x_anim(void * obj, int32_t v); -static void scroll_y_anim(void * obj, int32_t v); -static void scroll_end_cb(lv_anim_t * a); -static void scroll_area_into_view(const lv_area_t * area, lv_obj_t * child, lv_point_t * scroll_value, - lv_anim_enable_t anim_en); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/*===================== - * Setter functions - *====================*/ - -void lv_obj_set_scrollbar_mode(lv_obj_t * obj, lv_scrollbar_mode_t mode) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_allocate_spec_attr(obj); - - if(obj->spec_attr->scrollbar_mode == mode) return; - obj->spec_attr->scrollbar_mode = mode; - lv_obj_invalidate(obj); -} - -void lv_obj_set_scroll_dir(lv_obj_t * obj, lv_dir_t dir) -{ - lv_obj_allocate_spec_attr(obj); - - if(dir != obj->spec_attr->scroll_dir) { - obj->spec_attr->scroll_dir = dir; - } -} - -void lv_obj_set_scroll_snap_x(lv_obj_t * obj, lv_scroll_snap_t align) -{ - lv_obj_allocate_spec_attr(obj); - obj->spec_attr->scroll_snap_x = align; -} - -void lv_obj_set_scroll_snap_y(lv_obj_t * obj, lv_scroll_snap_t align) -{ - lv_obj_allocate_spec_attr(obj); - obj->spec_attr->scroll_snap_y = align; -} - -/*===================== - * Getter functions - *====================*/ - -lv_scrollbar_mode_t lv_obj_get_scrollbar_mode(const lv_obj_t * obj) -{ - if(obj->spec_attr) return (lv_scrollbar_mode_t) obj->spec_attr->scrollbar_mode; - else return LV_SCROLLBAR_MODE_AUTO; -} - -lv_dir_t lv_obj_get_scroll_dir(const lv_obj_t * obj) -{ - if(obj->spec_attr) return (lv_dir_t) obj->spec_attr->scroll_dir; - else return LV_DIR_ALL; -} - -lv_scroll_snap_t lv_obj_get_scroll_snap_x(const lv_obj_t * obj) -{ - if(obj->spec_attr) return (lv_scroll_snap_t) obj->spec_attr->scroll_snap_x; - else return LV_SCROLL_SNAP_NONE; -} - -lv_scroll_snap_t lv_obj_get_scroll_snap_y(const lv_obj_t * obj) -{ - if(obj->spec_attr) return (lv_scroll_snap_t) obj->spec_attr->scroll_snap_y; - else return LV_SCROLL_SNAP_NONE; -} - -int32_t lv_obj_get_scroll_x(const lv_obj_t * obj) -{ - if(obj->spec_attr == NULL) return 0; - return -obj->spec_attr->scroll.x; -} - -int32_t lv_obj_get_scroll_y(const lv_obj_t * obj) -{ - if(obj->spec_attr == NULL) return 0; - return -obj->spec_attr->scroll.y; -} - -int32_t lv_obj_get_scroll_top(lv_obj_t * obj) -{ - if(obj->spec_attr == NULL) return 0; - return -obj->spec_attr->scroll.y; -} - -int32_t lv_obj_get_scroll_bottom(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - int32_t child_res = LV_COORD_MIN; - uint32_t i; - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; - - int32_t tmp_y = child->coords.y2 + lv_obj_get_style_margin_bottom(child, LV_PART_MAIN); - child_res = LV_MAX(child_res, tmp_y); - } - - int32_t space_top = lv_obj_get_style_space_top(obj, LV_PART_MAIN); - int32_t space_bottom = lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); - - if(child_res != LV_COORD_MIN) { - child_res -= (obj->coords.y2 - space_bottom); - } - - int32_t self_h = lv_obj_get_self_height(obj); - self_h = self_h - (lv_obj_get_height(obj) - space_top - space_bottom); - self_h -= lv_obj_get_scroll_y(obj); - return LV_MAX(child_res, self_h); -} - -int32_t lv_obj_get_scroll_left(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - /*Normally can't scroll the object out on the left. - *So simply use the current scroll position as "left size"*/ - if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { - if(obj->spec_attr == NULL) return 0; - return -obj->spec_attr->scroll.x; - } - - /*With RTL base direction scrolling the left is normal so find the left most coordinate*/ - int32_t space_right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); - int32_t space_left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); - - int32_t child_res = 0; - - uint32_t i; - int32_t x1 = LV_COORD_MAX; - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; - - int32_t tmp_x = child->coords.x1 - lv_obj_get_style_margin_left(child, LV_PART_MAIN); - x1 = LV_MIN(x1, tmp_x); - } - - if(x1 != LV_COORD_MAX) { - child_res = x1; - child_res = (obj->coords.x1 + space_left) - child_res; - } - else { - child_res = LV_COORD_MIN; - } - - int32_t self_w = lv_obj_get_self_width(obj); - self_w = self_w - (lv_obj_get_width(obj) - space_right - space_left); - self_w += lv_obj_get_scroll_x(obj); - - return LV_MAX(child_res, self_w); -} - -int32_t lv_obj_get_scroll_right(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - /*With RTL base dir can't scroll to the object out on the right. - *So simply use the current scroll position as "right size"*/ - if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { - if(obj->spec_attr == NULL) return 0; - return obj->spec_attr->scroll.x; - } - - /*With other base direction (LTR) scrolling to the right is normal so find the right most coordinate*/ - int32_t child_res = LV_COORD_MIN; - uint32_t i; - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; - - int32_t tmp_x = child->coords.x2 + lv_obj_get_style_margin_right(child, LV_PART_MAIN); - child_res = LV_MAX(child_res, tmp_x); - } - - int32_t space_right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); - int32_t space_left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); - - if(child_res != LV_COORD_MIN) { - child_res -= (obj->coords.x2 - space_right); - } - - int32_t self_w; - self_w = lv_obj_get_self_width(obj); - self_w = self_w - (lv_obj_get_width(obj) - space_right - space_left); - self_w -= lv_obj_get_scroll_x(obj); - return LV_MAX(child_res, self_w); -} - -void lv_obj_get_scroll_end(lv_obj_t * obj, lv_point_t * end) -{ - lv_anim_t * a; - a = lv_anim_get(obj, scroll_x_anim); - end->x = a ? -a->end_value : lv_obj_get_scroll_x(obj); - - a = lv_anim_get(obj, scroll_y_anim); - end->y = a ? -a->end_value : lv_obj_get_scroll_y(obj); -} - -/*===================== - * Other functions - *====================*/ - -void lv_obj_scroll_by_bounded(lv_obj_t * obj, int32_t dx, int32_t dy, lv_anim_enable_t anim_en) -{ - if(dx == 0 && dy == 0) return; - - /*We need to know the final sizes for bound check*/ - lv_obj_update_layout(obj); - - /*Don't let scroll more than naturally possible by the size of the content*/ - int32_t x_current = -lv_obj_get_scroll_x(obj); - int32_t x_bounded = x_current + dx; - - if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { - if(x_bounded > 0) x_bounded = 0; - if(x_bounded < 0) { - int32_t scroll_max = lv_obj_get_scroll_left(obj) + lv_obj_get_scroll_right(obj); - if(scroll_max < 0) scroll_max = 0; - - if(x_bounded < -scroll_max) x_bounded = -scroll_max; - } - } - else { - if(x_bounded < 0) x_bounded = 0; - if(x_bounded > 0) { - int32_t scroll_max = lv_obj_get_scroll_left(obj) + lv_obj_get_scroll_right(obj); - if(scroll_max < 0) scroll_max = 0; - - if(x_bounded > scroll_max) x_bounded = scroll_max; - } - } - - /*Don't let scroll more than naturally possible by the size of the content*/ - int32_t y_current = -lv_obj_get_scroll_y(obj); - int32_t y_bounded = y_current + dy; - - if(y_bounded > 0) y_bounded = 0; - if(y_bounded < 0) { - int32_t scroll_max = lv_obj_get_scroll_top(obj) + lv_obj_get_scroll_bottom(obj); - if(scroll_max < 0) scroll_max = 0; - if(y_bounded < -scroll_max) y_bounded = -scroll_max; - } - - dx = x_bounded - x_current; - dy = y_bounded - y_current; - if(dx || dy) { - lv_obj_scroll_by(obj, dx, dy, anim_en); - } -} - -void lv_obj_scroll_by(lv_obj_t * obj, int32_t dx, int32_t dy, lv_anim_enable_t anim_en) -{ - if(dx == 0 && dy == 0) return; - if(anim_en == LV_ANIM_ON) { - lv_display_t * d = lv_obj_get_display(obj); - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, obj); - lv_anim_set_deleted_cb(&a, scroll_end_cb); - - if(dx) { - uint32_t t = lv_anim_speed_clamped((lv_display_get_horizontal_resolution(d)) >> 1, SCROLL_ANIM_TIME_MIN, - SCROLL_ANIM_TIME_MAX); - lv_anim_set_duration(&a, t); - int32_t sx = lv_obj_get_scroll_x(obj); - lv_anim_set_values(&a, -sx, -sx + dx); - lv_anim_set_exec_cb(&a, scroll_x_anim); - lv_anim_set_path_cb(&a, lv_anim_path_ease_out); - - lv_result_t res; - res = lv_obj_send_event(obj, LV_EVENT_SCROLL_BEGIN, &a); - if(res != LV_RESULT_OK) return; - lv_anim_start(&a); - } - - if(dy) { - uint32_t t = lv_anim_speed_clamped((lv_display_get_vertical_resolution(d)) >> 1, SCROLL_ANIM_TIME_MIN, - SCROLL_ANIM_TIME_MAX); - lv_anim_set_duration(&a, t); - int32_t sy = lv_obj_get_scroll_y(obj); - lv_anim_set_values(&a, -sy, -sy + dy); - lv_anim_set_exec_cb(&a, scroll_y_anim); - lv_anim_set_path_cb(&a, lv_anim_path_ease_out); - - lv_result_t res; - res = lv_obj_send_event(obj, LV_EVENT_SCROLL_BEGIN, &a); - if(res != LV_RESULT_OK) return; - lv_anim_start(&a); - } - } - else { - /*Remove pending animations*/ - lv_anim_delete(obj, scroll_y_anim); - lv_anim_delete(obj, scroll_x_anim); - - lv_result_t res; - res = lv_obj_send_event(obj, LV_EVENT_SCROLL_BEGIN, NULL); - if(res != LV_RESULT_OK) return; - - res = lv_obj_scroll_by_raw(obj, dx, dy); - if(res != LV_RESULT_OK) return; - - res = lv_obj_send_event(obj, LV_EVENT_SCROLL_END, NULL); - if(res != LV_RESULT_OK) return; - } -} - -void lv_obj_scroll_to(lv_obj_t * obj, int32_t x, int32_t y, lv_anim_enable_t anim_en) -{ - lv_obj_scroll_to_x(obj, x, anim_en); - lv_obj_scroll_to_y(obj, y, anim_en); -} - -void lv_obj_scroll_to_x(lv_obj_t * obj, int32_t x, lv_anim_enable_t anim_en) -{ - lv_anim_delete(obj, scroll_x_anim); - - int32_t scroll_x = lv_obj_get_scroll_x(obj); - int32_t diff = -x + scroll_x; - - lv_obj_scroll_by_bounded(obj, diff, 0, anim_en); -} - -void lv_obj_scroll_to_y(lv_obj_t * obj, int32_t y, lv_anim_enable_t anim_en) -{ - lv_anim_delete(obj, scroll_y_anim); - - int32_t scroll_y = lv_obj_get_scroll_y(obj); - int32_t diff = -y + scroll_y; - - lv_obj_scroll_by_bounded(obj, 0, diff, anim_en); -} - -void lv_obj_scroll_to_view(lv_obj_t * obj, lv_anim_enable_t anim_en) -{ - /*Be sure the screens layout is correct*/ - lv_obj_update_layout(obj); - - lv_point_t p = {0, 0}; - scroll_area_into_view(&obj->coords, obj, &p, anim_en); -} - -void lv_obj_scroll_to_view_recursive(lv_obj_t * obj, lv_anim_enable_t anim_en) -{ - /*Be sure the screens layout is correct*/ - lv_obj_update_layout(obj); - - lv_point_t p = {0, 0}; - lv_obj_t * child = obj; - lv_obj_t * parent = lv_obj_get_parent(child); - while(parent) { - scroll_area_into_view(&obj->coords, child, &p, anim_en); - child = parent; - parent = lv_obj_get_parent(parent); - } -} - -lv_result_t lv_obj_scroll_by_raw(lv_obj_t * obj, int32_t x, int32_t y) -{ - if(x == 0 && y == 0) return LV_RESULT_OK; - - lv_obj_allocate_spec_attr(obj); - - obj->spec_attr->scroll.x += x; - obj->spec_attr->scroll.y += y; - - lv_obj_move_children_by(obj, x, y, true); - lv_result_t res = lv_obj_send_event(obj, LV_EVENT_SCROLL, NULL); - if(res != LV_RESULT_OK) return res; - lv_obj_invalidate(obj); - return LV_RESULT_OK; -} - -bool lv_obj_is_scrolling(const lv_obj_t * obj) -{ - lv_indev_t * indev = lv_indev_get_next(NULL); - while(indev) { - if(lv_indev_get_scroll_obj(indev) == obj) return true; - indev = lv_indev_get_next(indev); - } - - return false; -} - -void lv_obj_update_snap(lv_obj_t * obj, lv_anim_enable_t anim_en) -{ - lv_obj_update_layout(obj); - lv_point_t p; - lv_indev_scroll_get_snap_dist(obj, &p); - if(p.x == LV_COORD_MAX || p.x == LV_COORD_MIN) p.x = 0; - if(p.y == LV_COORD_MAX || p.y == LV_COORD_MIN) p.y = 0; - lv_obj_scroll_by(obj, p.x, p.y, anim_en); -} - -void lv_obj_get_scrollbar_area(lv_obj_t * obj, lv_area_t * hor_area, lv_area_t * ver_area) -{ - lv_area_set(hor_area, 0, 0, -1, -1); - lv_area_set(ver_area, 0, 0, -1, -1); - - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLLABLE) == false) return; - - lv_scrollbar_mode_t sm = lv_obj_get_scrollbar_mode(obj); - if(sm == LV_SCROLLBAR_MODE_OFF) return; - - /*If there is no indev scrolling this object but `mode==active` return*/ - lv_indev_t * indev = lv_indev_get_next(NULL); - if(sm == LV_SCROLLBAR_MODE_ACTIVE) { - while(indev) { - if(lv_indev_get_scroll_obj(indev) == obj) break; - indev = lv_indev_get_next(indev); - } - if(indev == NULL) return; - } - - int32_t st = lv_obj_get_scroll_top(obj); - int32_t sb = lv_obj_get_scroll_bottom(obj); - int32_t sl = lv_obj_get_scroll_left(obj); - int32_t sr = lv_obj_get_scroll_right(obj); - - lv_dir_t dir = lv_obj_get_scroll_dir(obj); - - bool ver_draw = false; - if((dir & LV_DIR_VER) && - ((sm == LV_SCROLLBAR_MODE_ON) || - (sm == LV_SCROLLBAR_MODE_AUTO && (st > 0 || sb > 0)) || - (sm == LV_SCROLLBAR_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_DIR_VER))) { - ver_draw = true; - } - - bool hor_draw = false; - if((dir & LV_DIR_HOR) && - ((sm == LV_SCROLLBAR_MODE_ON) || - (sm == LV_SCROLLBAR_MODE_AUTO && (sl > 0 || sr > 0)) || - (sm == LV_SCROLLBAR_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_DIR_HOR))) { - hor_draw = true; - } - - if(!hor_draw && !ver_draw) return; - - bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_SCROLLBAR) == LV_BASE_DIR_RTL; - - int32_t top_space = lv_obj_get_style_pad_top(obj, LV_PART_SCROLLBAR); - int32_t bottom_space = lv_obj_get_style_pad_bottom(obj, LV_PART_SCROLLBAR); - int32_t left_space = lv_obj_get_style_pad_left(obj, LV_PART_SCROLLBAR); - int32_t right_space = lv_obj_get_style_pad_right(obj, LV_PART_SCROLLBAR); - int32_t thickness = lv_obj_get_style_width(obj, LV_PART_SCROLLBAR); - - int32_t obj_h = lv_obj_get_height(obj); - int32_t obj_w = lv_obj_get_width(obj); - - /*Space required for the vertical and horizontal scrollbars*/ - int32_t ver_reg_space = ver_draw ? thickness : 0; - int32_t hor_req_space = hor_draw ? thickness : 0; - int32_t rem; - - if(lv_obj_get_style_bg_opa(obj, LV_PART_SCROLLBAR) < LV_OPA_MIN && - lv_obj_get_style_border_opa(obj, LV_PART_SCROLLBAR) < LV_OPA_MIN) { - return; - } - - /*Draw vertical scrollbar if the mode is ON or can be scrolled in this direction*/ - int32_t content_h = obj_h + st + sb; - if(ver_draw && content_h) { - ver_area->y1 = obj->coords.y1; - ver_area->y2 = obj->coords.y2; - if(rtl) { - ver_area->x1 = obj->coords.x1 + left_space; - ver_area->x2 = ver_area->x1 + thickness - 1; - } - else { - ver_area->x2 = obj->coords.x2 - right_space; - ver_area->x1 = ver_area->x2 - thickness + 1; - } - - int32_t sb_h = ((obj_h - top_space - bottom_space - hor_req_space) * obj_h) / content_h; - sb_h = LV_MAX(sb_h, SCROLLBAR_MIN_SIZE); - rem = (obj_h - top_space - bottom_space - hor_req_space) - - sb_h; /*Remaining size from the scrollbar track that is not the scrollbar itself*/ - int32_t scroll_h = content_h - obj_h; /*The size of the content which can be really scrolled*/ - if(scroll_h <= 0) { - ver_area->y1 = obj->coords.y1 + top_space; - ver_area->y2 = obj->coords.y2 - bottom_space - hor_req_space - 1; - } - else { - int32_t sb_y = (rem * sb) / scroll_h; - sb_y = rem - sb_y; - - ver_area->y1 = obj->coords.y1 + sb_y + top_space; - ver_area->y2 = ver_area->y1 + sb_h - 1; - if(ver_area->y1 < obj->coords.y1 + top_space) { - ver_area->y1 = obj->coords.y1 + top_space; - if(ver_area->y1 + SCROLLBAR_MIN_SIZE > ver_area->y2) { - ver_area->y2 = ver_area->y1 + SCROLLBAR_MIN_SIZE; - } - } - if(ver_area->y2 > obj->coords.y2 - hor_req_space - bottom_space) { - ver_area->y2 = obj->coords.y2 - hor_req_space - bottom_space; - if(ver_area->y2 - SCROLLBAR_MIN_SIZE < ver_area->y1) { - ver_area->y1 = ver_area->y2 - SCROLLBAR_MIN_SIZE; - } - } - } - } - - /*Draw horizontal scrollbar if the mode is ON or can be scrolled in this direction*/ - int32_t content_w = obj_w + sl + sr; - if(hor_draw && content_w) { - hor_area->y2 = obj->coords.y2 - bottom_space; - hor_area->y1 = hor_area->y2 - thickness + 1; - hor_area->x1 = obj->coords.x1; - hor_area->x2 = obj->coords.x2; - - int32_t sb_w = ((obj_w - left_space - right_space - ver_reg_space) * obj_w) / content_w; - sb_w = LV_MAX(sb_w, SCROLLBAR_MIN_SIZE); - rem = (obj_w - left_space - right_space - ver_reg_space) - - sb_w; /*Remaining size from the scrollbar track that is not the scrollbar itself*/ - int32_t scroll_w = content_w - obj_w; /*The size of the content which can be really scrolled*/ - if(scroll_w <= 0) { - if(rtl) { - hor_area->x1 = obj->coords.x1 + left_space + ver_reg_space - 1; - hor_area->x2 = obj->coords.x2 - right_space; - } - else { - hor_area->x1 = obj->coords.x1 + left_space; - hor_area->x2 = obj->coords.x2 - right_space - ver_reg_space - 1; - } - } - else { - int32_t sb_x = (rem * sr) / scroll_w; - sb_x = rem - sb_x; - - if(rtl) { - hor_area->x1 = obj->coords.x1 + sb_x + left_space + ver_reg_space; - hor_area->x2 = hor_area->x1 + sb_w - 1; - if(hor_area->x1 < obj->coords.x1 + left_space + ver_reg_space) { - hor_area->x1 = obj->coords.x1 + left_space + ver_reg_space; - if(hor_area->x1 + SCROLLBAR_MIN_SIZE > hor_area->x2) { - hor_area->x2 = hor_area->x1 + SCROLLBAR_MIN_SIZE; - } - } - if(hor_area->x2 > obj->coords.x2 - right_space) { - hor_area->x2 = obj->coords.x2 - right_space; - if(hor_area->x2 - SCROLLBAR_MIN_SIZE < hor_area->x1) { - hor_area->x1 = hor_area->x2 - SCROLLBAR_MIN_SIZE; - } - } - } - else { - hor_area->x1 = obj->coords.x1 + sb_x + left_space; - hor_area->x2 = hor_area->x1 + sb_w - 1; - if(hor_area->x1 < obj->coords.x1 + left_space) { - hor_area->x1 = obj->coords.x1 + left_space; - if(hor_area->x1 + SCROLLBAR_MIN_SIZE > hor_area->x2) { - hor_area->x2 = hor_area->x1 + SCROLLBAR_MIN_SIZE; - } - } - if(hor_area->x2 > obj->coords.x2 - ver_reg_space - right_space) { - hor_area->x2 = obj->coords.x2 - ver_reg_space - right_space; - if(hor_area->x2 - SCROLLBAR_MIN_SIZE < hor_area->x1) { - hor_area->x1 = hor_area->x2 - SCROLLBAR_MIN_SIZE; - } - } - } - } - } -} - -void lv_obj_scrollbar_invalidate(lv_obj_t * obj) -{ - lv_area_t hor_area; - lv_area_t ver_area; - lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); - - if(lv_area_get_size(&hor_area) <= 0 && lv_area_get_size(&ver_area) <= 0) return; - - if(lv_area_get_size(&hor_area) > 0) lv_obj_invalidate_area(obj, &hor_area); - if(lv_area_get_size(&ver_area) > 0) lv_obj_invalidate_area(obj, &ver_area); -} - -void lv_obj_readjust_scroll(lv_obj_t * obj, lv_anim_enable_t anim_en) -{ - /*Be sure the bottom side is not remains scrolled in*/ - /*With snapping the content can't be scrolled in*/ - if(lv_obj_get_scroll_snap_y(obj) == LV_SCROLL_SNAP_NONE) { - int32_t st = lv_obj_get_scroll_top(obj); - int32_t sb = lv_obj_get_scroll_bottom(obj); - if(sb < 0 && st > 0) { - sb = LV_MIN(st, -sb); - lv_obj_scroll_by(obj, 0, sb, anim_en); - } - } - - if(lv_obj_get_scroll_snap_x(obj) == LV_SCROLL_SNAP_NONE) { - int32_t sl = lv_obj_get_scroll_left(obj); - int32_t sr = lv_obj_get_scroll_right(obj); - if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { - /*Be sure the left side is not remains scrolled in*/ - if(sr < 0 && sl > 0) { - sr = LV_MIN(sl, -sr); - lv_obj_scroll_by(obj, sr, 0, anim_en); - } - } - else { - /*Be sure the right side is not remains scrolled in*/ - if(sl < 0 && sr > 0) { - sr = LV_MIN(sr, -sl); - lv_obj_scroll_by(obj, sl, 0, anim_en); - } - } - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void scroll_x_anim(void * obj, int32_t v) -{ - lv_obj_scroll_by_raw(obj, v + lv_obj_get_scroll_x(obj), 0); -} - -static void scroll_y_anim(void * obj, int32_t v) -{ - lv_obj_scroll_by_raw(obj, 0, v + lv_obj_get_scroll_y(obj)); -} - -static void scroll_end_cb(lv_anim_t * a) -{ - /*Do not sent END event if there wasn't a BEGIN*/ - if(a->start_cb_called) lv_obj_send_event(a->var, LV_EVENT_SCROLL_END, NULL); -} - -static void scroll_area_into_view(const lv_area_t * area, lv_obj_t * child, lv_point_t * scroll_value, - lv_anim_enable_t anim_en) -{ - lv_obj_t * parent = lv_obj_get_parent(child); - if(!lv_obj_has_flag(parent, LV_OBJ_FLAG_SCROLLABLE)) return; - - lv_dir_t scroll_dir = lv_obj_get_scroll_dir(parent); - int32_t snap_goal = 0; - int32_t act = 0; - const lv_area_t * area_tmp; - - int32_t y_scroll = 0; - lv_scroll_snap_t snap_y = lv_obj_get_scroll_snap_y(parent); - if(snap_y != LV_SCROLL_SNAP_NONE) area_tmp = &child->coords; - else area_tmp = area; - - int32_t stop = lv_obj_get_style_space_top(parent, LV_PART_MAIN); - int32_t sbottom = lv_obj_get_style_space_bottom(parent, LV_PART_MAIN); - int32_t top_diff = parent->coords.y1 + stop - area_tmp->y1 - scroll_value->y; - int32_t bottom_diff = -(parent->coords.y2 - sbottom - area_tmp->y2 - scroll_value->y); - int32_t parent_h = lv_obj_get_height(parent) - stop - sbottom; - if((top_diff >= 0 && bottom_diff >= 0)) y_scroll = 0; - else if(top_diff > 0) { - y_scroll = top_diff; - /*Do not let scrolling in*/ - int32_t st = lv_obj_get_scroll_top(parent); - if(st - y_scroll < 0) y_scroll = 0; - } - else if(bottom_diff > 0) { - y_scroll = -bottom_diff; - /*Do not let scrolling in*/ - int32_t sb = lv_obj_get_scroll_bottom(parent); - if(sb + y_scroll < 0) y_scroll = 0; - } - - switch(snap_y) { - case LV_SCROLL_SNAP_START: - snap_goal = parent->coords.y1 + stop; - act = area_tmp->y1 + y_scroll; - y_scroll += snap_goal - act; - break; - case LV_SCROLL_SNAP_END: - snap_goal = parent->coords.y2 - sbottom; - act = area_tmp->y2 + y_scroll; - y_scroll += snap_goal - act; - break; - case LV_SCROLL_SNAP_CENTER: - snap_goal = parent->coords.y1 + stop + parent_h / 2; - act = lv_area_get_height(area_tmp) / 2 + area_tmp->y1 + y_scroll; - y_scroll += snap_goal - act; - break; - case LV_SCROLL_SNAP_NONE: - break; - } - - int32_t x_scroll = 0; - lv_scroll_snap_t snap_x = lv_obj_get_scroll_snap_x(parent); - if(snap_x != LV_SCROLL_SNAP_NONE) area_tmp = &child->coords; - else area_tmp = area; - - int32_t sleft = lv_obj_get_style_space_left(parent, LV_PART_MAIN); - int32_t sright = lv_obj_get_style_space_right(parent, LV_PART_MAIN); - int32_t left_diff = parent->coords.x1 + sleft - area_tmp->x1 - scroll_value->x; - int32_t right_diff = -(parent->coords.x2 - sright - area_tmp->x2 - scroll_value->x); - if((left_diff >= 0 && right_diff >= 0)) x_scroll = 0; - else if(left_diff > 0) { - x_scroll = left_diff; - /*Do not let scrolling in*/ - int32_t sl = lv_obj_get_scroll_left(parent); - if(sl - x_scroll < 0) x_scroll = 0; - } - else if(right_diff > 0) { - x_scroll = -right_diff; - /*Do not let scrolling in*/ - int32_t sr = lv_obj_get_scroll_right(parent); - if(sr + x_scroll < 0) x_scroll = 0; - } - - int32_t parent_w = lv_obj_get_width(parent) - sleft - sright; - switch(snap_x) { - case LV_SCROLL_SNAP_START: - snap_goal = parent->coords.x1 + sleft; - act = area_tmp->x1 + x_scroll; - x_scroll += snap_goal - act; - break; - case LV_SCROLL_SNAP_END: - snap_goal = parent->coords.x2 - sright; - act = area_tmp->x2 + x_scroll; - x_scroll += snap_goal - act; - break; - case LV_SCROLL_SNAP_CENTER: - snap_goal = parent->coords.x1 + sleft + parent_w / 2; - act = lv_area_get_width(area_tmp) / 2 + area_tmp->x1 + x_scroll; - x_scroll += snap_goal - act; - break; - case LV_SCROLL_SNAP_NONE: - break; - } - - /*Remove any pending scroll animations.*/ - lv_anim_delete(parent, scroll_y_anim); - lv_anim_delete(parent, scroll_x_anim); - - if((scroll_dir & LV_DIR_LEFT) == 0 && x_scroll < 0) x_scroll = 0; - if((scroll_dir & LV_DIR_RIGHT) == 0 && x_scroll > 0) x_scroll = 0; - if((scroll_dir & LV_DIR_TOP) == 0 && y_scroll < 0) y_scroll = 0; - if((scroll_dir & LV_DIR_BOTTOM) == 0 && y_scroll > 0) y_scroll = 0; - - scroll_value->x += anim_en == LV_ANIM_OFF ? 0 : x_scroll; - scroll_value->y += anim_en == LV_ANIM_OFF ? 0 : y_scroll; - lv_obj_scroll_by(parent, x_scroll, y_scroll, anim_en); -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_scroll.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_scroll.h deleted file mode 100644 index f2cb2f1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_scroll.h +++ /dev/null @@ -1,290 +0,0 @@ -/** - * @file lv_obj_scroll.h - * - */ - -#ifndef LV_OBJ_SCROLL_H -#define LV_OBJ_SCROLL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_area.h" -#include "../misc/lv_anim.h" -#include "../misc/lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*Can't include lv_obj.h because it includes this header file*/ - -/** Scrollbar modes: shows when should the scrollbars be visible*/ -typedef enum { - LV_SCROLLBAR_MODE_OFF, /**< Never show scrollbars*/ - LV_SCROLLBAR_MODE_ON, /**< Always show scrollbars*/ - LV_SCROLLBAR_MODE_ACTIVE, /**< Show scroll bars when object is being scrolled*/ - LV_SCROLLBAR_MODE_AUTO, /**< Show scroll bars when the content is large enough to be scrolled*/ -} lv_scrollbar_mode_t; - -/** Scroll span align options. Tells where to align the snappable children when scroll stops.*/ -typedef enum { - LV_SCROLL_SNAP_NONE, /**< Do not align, leave where it is*/ - LV_SCROLL_SNAP_START, /**< Align to the left/top*/ - LV_SCROLL_SNAP_END, /**< Align to the right/bottom*/ - LV_SCROLL_SNAP_CENTER /**< Align to the center*/ -} lv_scroll_snap_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/*===================== - * Setter functions - *====================*/ - -/** - * Set how the scrollbars should behave. - * @param obj pointer to an object - * @param mode LV_SCROLL_MODE_ON/OFF/AUTO/ACTIVE - */ -void lv_obj_set_scrollbar_mode(lv_obj_t * obj, lv_scrollbar_mode_t mode); - -/** - * Set the object in which directions can be scrolled - * @param obj pointer to an object - * @param dir the allow scroll directions. An element or OR-ed values of `lv_dir_t` - */ -void lv_obj_set_scroll_dir(lv_obj_t * obj, lv_dir_t dir); - -/** - * Set where to snap the children when scrolling ends horizontally - * @param obj pointer to an object - * @param align the snap align to set from `lv_scroll_snap_t` - */ -void lv_obj_set_scroll_snap_x(lv_obj_t * obj, lv_scroll_snap_t align); - -/** - * Set where to snap the children when scrolling ends vertically - * @param obj pointer to an object - * @param align the snap align to set from `lv_scroll_snap_t` - */ -void lv_obj_set_scroll_snap_y(lv_obj_t * obj, lv_scroll_snap_t align); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the current scroll mode (when to hide the scrollbars) - * @param obj pointer to an object - * @return the current scroll mode from `lv_scrollbar_mode_t` - */ -lv_scrollbar_mode_t lv_obj_get_scrollbar_mode(const lv_obj_t * obj); - -/** - * Get the object in which directions can be scrolled - * @param obj pointer to an object - */ -lv_dir_t lv_obj_get_scroll_dir(const lv_obj_t * obj); - -/** - * Get where to snap the children when scrolling ends horizontally - * @param obj pointer to an object - * @return the current snap align from `lv_scroll_snap_t` - */ -lv_scroll_snap_t lv_obj_get_scroll_snap_x(const lv_obj_t * obj); - -/** - * Get where to snap the children when scrolling ends vertically - * @param obj pointer to an object - * @return the current snap align from `lv_scroll_snap_t` - */ -lv_scroll_snap_t lv_obj_get_scroll_snap_y(const lv_obj_t * obj); - -/** - * Get current X scroll position. - * @param obj pointer to an object - * @return the current scroll position from the left edge. - * If the object is not scrolled return 0 - * If scrolled return > 0 - * If scrolled in (elastic scroll) return < 0 - */ -int32_t lv_obj_get_scroll_x(const lv_obj_t * obj); - -/** - * Get current Y scroll position. - * @param obj pointer to an object - * @return the current scroll position from the top edge. - * If the object is not scrolled return 0 - * If scrolled return > 0 - * If scrolled inside return < 0 - */ -int32_t lv_obj_get_scroll_y(const lv_obj_t * obj); - -/** - * Return the height of the area above the object. - * That is the number of pixels the object can be scrolled down. - * Normally positive but can be negative when scrolled inside. - * @param obj pointer to an object - * @return the scrollable area above the object in pixels - */ -int32_t lv_obj_get_scroll_top(lv_obj_t * obj); - -/** - * Return the height of the area below the object. - * That is the number of pixels the object can be scrolled down. - * Normally positive but can be negative when scrolled inside. - * @param obj pointer to an object - * @return the scrollable area below the object in pixels - */ -int32_t lv_obj_get_scroll_bottom(lv_obj_t * obj); - -/** - * Return the width of the area on the left the object. - * That is the number of pixels the object can be scrolled down. - * Normally positive but can be negative when scrolled inside. - * @param obj pointer to an object - * @return the scrollable area on the left the object in pixels - */ -int32_t lv_obj_get_scroll_left(lv_obj_t * obj); - -/** - * Return the width of the area on the right the object. - * That is the number of pixels the object can be scrolled down. - * Normally positive but can be negative when scrolled inside. - * @param obj pointer to an object - * @return the scrollable area on the right the object in pixels - */ -int32_t lv_obj_get_scroll_right(lv_obj_t * obj); - -/** - * Get the X and Y coordinates where the scrolling will end for this object if a scrolling animation is in progress. - * If no scrolling animation, give the current `x` or `y` scroll position. - * @param obj pointer to an object - * @param end pointer to store the result - */ -void lv_obj_get_scroll_end(lv_obj_t * obj, lv_point_t * end); - -/*===================== - * Other functions - *====================*/ - -/** - * Scroll by a given amount of pixels - * @param obj pointer to an object to scroll - * @param x pixels to scroll horizontally - * @param y pixels to scroll vertically - * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately - * @note > 0 value means scroll right/bottom (show the more content on the right/bottom) - * @note e.g. dy = -20 means scroll down 20 px - */ -void lv_obj_scroll_by(lv_obj_t * obj, int32_t x, int32_t y, lv_anim_enable_t anim_en); - -/** - * Scroll by a given amount of pixels. - * `dx` and `dy` will be limited internally to allow scrolling only on the content area. - * @param obj pointer to an object to scroll - * @param dx pixels to scroll horizontally - * @param dy pixels to scroll vertically - * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately - * @note e.g. dy = -20 means scroll down 20 px - */ -void lv_obj_scroll_by_bounded(lv_obj_t * obj, int32_t dx, int32_t dy, lv_anim_enable_t anim_en); - -/** - * Scroll to a given coordinate on an object. - * `x` and `y` will be limited internally to allow scrolling only on the content area. - * @param obj pointer to an object to scroll - * @param x pixels to scroll horizontally - * @param y pixels to scroll vertically - * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately - */ -void lv_obj_scroll_to(lv_obj_t * obj, int32_t x, int32_t y, lv_anim_enable_t anim_en); - -/** - * Scroll to a given X coordinate on an object. - * `x` will be limited internally to allow scrolling only on the content area. - * @param obj pointer to an object to scroll - * @param x pixels to scroll horizontally - * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately - */ -void lv_obj_scroll_to_x(lv_obj_t * obj, int32_t x, lv_anim_enable_t anim_en); - -/** - * Scroll to a given Y coordinate on an object - * `y` will be limited internally to allow scrolling only on the content area. - * @param obj pointer to an object to scroll - * @param y pixels to scroll vertically - * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately - */ -void lv_obj_scroll_to_y(lv_obj_t * obj, int32_t y, lv_anim_enable_t anim_en); - -/** - * Scroll to an object until it becomes visible on its parent - * @param obj pointer to an object to scroll into view - * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately - */ -void lv_obj_scroll_to_view(lv_obj_t * obj, lv_anim_enable_t anim_en); - -/** - * Scroll to an object until it becomes visible on its parent. - * Do the same on the parent's parent, and so on. - * Therefore the object will be scrolled into view even it has nested scrollable parents - * @param obj pointer to an object to scroll into view - * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately - */ -void lv_obj_scroll_to_view_recursive(lv_obj_t * obj, lv_anim_enable_t anim_en); - -/** - * Tell whether an object is being scrolled or not at this moment - * @param obj pointer to an object - * @return true: `obj` is being scrolled - */ -bool lv_obj_is_scrolling(const lv_obj_t * obj); - -/** - * Check the children of `obj` and scroll `obj` to fulfill the scroll_snap settings - * @param obj an object whose children needs to checked and snapped - * @param anim_en LV_ANIM_ON/OFF - */ -void lv_obj_update_snap(lv_obj_t * obj, lv_anim_enable_t anim_en); - -/** - * Get the area of the scrollbars - * @param obj pointer to an object - * @param hor pointer to store the area of the horizontal scrollbar - * @param ver pointer to store the area of the vertical scrollbar - */ -void lv_obj_get_scrollbar_area(lv_obj_t * obj, lv_area_t * hor, lv_area_t * ver); - -/** - * Invalidate the area of the scrollbars - * @param obj pointer to an object - */ -void lv_obj_scrollbar_invalidate(lv_obj_t * obj); - -/** - * Checks if the content is scrolled "in" and adjusts it to a normal position. - * @param obj pointer to an object - * @param anim_en LV_ANIM_ON/OFF - */ -void lv_obj_readjust_scroll(lv_obj_t * obj, lv_anim_enable_t anim_en); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_SCROLL_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_scroll_private.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_scroll_private.h deleted file mode 100644 index 9ae6332..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_scroll_private.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @file lv_obj_scroll_private.h - * - */ - -#ifndef LV_OBJ_SCROLL_PRIVATE_H -#define LV_OBJ_SCROLL_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_obj_scroll.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Low level function to scroll by given x and y coordinates. - * `LV_EVENT_SCROLL` is sent. - * @param obj pointer to an object to scroll - * @param x pixels to scroll horizontally - * @param y pixels to scroll vertically - * @return `LV_RESULT_INVALID`: to object was deleted in `LV_EVENT_SCROLL`; - * `LV_RESULT_OK`: if the object is still valid - */ -lv_result_t lv_obj_scroll_by_raw(lv_obj_t * obj, int32_t x, int32_t y); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_SCROLL_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style.c b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style.c deleted file mode 100644 index 06e3ffe..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style.c +++ /dev/null @@ -1,1126 +0,0 @@ -/** - * @file lv_obj_style.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_obj_private.h" -#include "../misc/lv_anim_private.h" -#include "lv_obj_style_private.h" -#include "lv_obj_class_private.h" -#include "../display/lv_display.h" -#include "../display/lv_display_private.h" -#include "../misc/lv_color.h" -#include "../stdlib/lv_string.h" -#include "../core/lv_global.h" -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_obj_class) -#define style_refr LV_GLOBAL_DEFAULT()->style_refresh -#define style_trans_ll_p &(LV_GLOBAL_DEFAULT()->style_trans_ll) -#define _style_custom_prop_flag_lookup_table LV_GLOBAL_DEFAULT()->style_custom_prop_flag_lookup_table -#define STYLE_PROP_SHIFTED(prop) ((uint32_t)1 << ((prop) >> 3)) - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_obj_t * obj; - lv_style_prop_t prop; - lv_style_selector_t selector; - lv_style_value_t start_value; - lv_style_value_t end_value; -} trans_t; - -typedef enum { - CACHE_ZERO = 0, - CACHE_TRUE = 1, - CACHE_UNSET = 2, - CACHE_255 = 3, - CACHE_NEED_CHECK = 4, -} cache_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector); -static lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_part_t part); -static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop, - lv_style_value_t * v); -static void report_style_change_core(void * style, lv_obj_t * obj); -static void refresh_children_style(lv_obj_t * obj); -static bool trans_delete(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, trans_t * tr_limit); -static void trans_anim_cb(void * _tr, int32_t v); -static void trans_anim_start_cb(lv_anim_t * a); -static void trans_anim_completed_cb(lv_anim_t * a); -static lv_layer_type_t calculate_layer_type(lv_obj_t * obj); -static void full_cache_refresh(lv_obj_t * obj, lv_part_t part); -static void fade_anim_cb(void * obj, int32_t v); -static void fade_in_anim_completed(lv_anim_t * a); -static bool style_has_flag(const lv_style_t * style, uint32_t flag); -static lv_style_res_t get_selector_style_prop(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop, - lv_style_value_t * value_act); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_obj_style_init(void) -{ - lv_ll_init(style_trans_ll_p, sizeof(trans_t)); -} - -void lv_obj_style_deinit(void) -{ - lv_ll_clear(style_trans_ll_p); - if(_style_custom_prop_flag_lookup_table != NULL) { - lv_free(_style_custom_prop_flag_lookup_table); - _style_custom_prop_flag_lookup_table = NULL; - } -} - -void lv_obj_add_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector) -{ - LV_ASSERT(obj->style_cnt < 63); - - trans_delete(obj, selector, LV_STYLE_PROP_ANY, NULL); - - lv_part_t part = lv_obj_style_get_selector_part(selector); - - if(style && part == LV_PART_MAIN && style_has_flag(style, LV_STYLE_PROP_FLAG_TRANSFORM)) { - lv_obj_invalidate(obj); - } - - /*Try removing the style first to be sure it won't be added twice*/ - lv_obj_remove_style(obj, style, selector); - - uint32_t i; - /*Go after the transition and local styles*/ - for(i = 0; i < obj->style_cnt; i++) { - if(obj->styles[i].is_trans) continue; - if(obj->styles[i].is_local) continue; - break; - } - - /*Now `i` is at the first normal style. Insert the new style before this*/ - - /*Allocate space for the new style and shift the rest of the style to the end*/ - obj->style_cnt++; - LV_ASSERT(obj->style_cnt != 0); - obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(lv_obj_style_t)); - LV_ASSERT_MALLOC(obj->styles); - - uint32_t j; - for(j = obj->style_cnt - 1; j > i ; j--) { - obj->styles[j] = obj->styles[j - 1]; - } - - lv_memzero(&obj->styles[i], sizeof(lv_obj_style_t)); - obj->styles[i].style = style; - obj->styles[i].selector = selector; - -#if LV_OBJ_STYLE_CACHE - uint32_t * prop_is_set = part == LV_PART_MAIN ? &obj->style_main_prop_is_set : &obj->style_other_prop_is_set; - if(lv_style_is_const(style)) { - lv_style_const_prop_t * props = style->values_and_props; - for(i = 0; props[i].prop != LV_STYLE_PROP_INV; i++) { - (*prop_is_set) |= STYLE_PROP_SHIFTED(props[i].prop); - } - } - else { - lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); - for(i = 0; i < style->prop_cnt; i++) { - (*prop_is_set) |= STYLE_PROP_SHIFTED(props[i]); - } - } -#endif - - lv_obj_refresh_style(obj, selector, LV_STYLE_PROP_ANY); -} - -bool lv_obj_replace_style(lv_obj_t * obj, const lv_style_t * old_style, const lv_style_t * new_style, - lv_style_selector_t selector) -{ - lv_state_t state = lv_obj_style_get_selector_state(selector); - lv_part_t part = lv_obj_style_get_selector_part(selector); - - /*All objects must exist*/ - if(!obj || !old_style || !new_style || (old_style == new_style)) { - return false; - } - - /*Similar to lv_obj_add_style, delete transition*/ - trans_delete(obj, selector, LV_STYLE_PROP_ANY, NULL); - - bool replaced = false; - uint32_t i; - for(i = 0; i < obj->style_cnt; i++) { - lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); - lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); - - /*Skip local styles and transitions*/ - if(obj->styles[i].is_local || obj->styles[i].is_trans) { - continue; - } - - /*Skip non-matching styles*/ - if((state != LV_STATE_ANY && state_act != state) || - (part != LV_PART_ANY && part_act != part) || - (old_style != obj->styles[i].style)) { - continue; - } - - lv_memzero(&obj->styles[i], sizeof(lv_obj_style_t)); - obj->styles[i].style = new_style; - obj->styles[i].selector = selector; - - replaced = true; - /*Don't break and continue replacing other occurrences*/ - } - if(replaced) { - full_cache_refresh(obj, part); - lv_obj_refresh_style(obj, part, LV_STYLE_PROP_ANY); - } - return replaced; -} - -void lv_obj_remove_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector) -{ - lv_state_t state = lv_obj_style_get_selector_state(selector); - lv_part_t part = lv_obj_style_get_selector_part(selector); - lv_style_prop_t prop = LV_STYLE_PROP_ANY; - if(style && style->prop_cnt == 0) prop = LV_STYLE_PROP_INV; - - if(style && part == LV_PART_MAIN && style_has_flag(style, LV_STYLE_PROP_FLAG_TRANSFORM)) { - lv_obj_invalidate(obj); - } - - uint32_t i = 0; - bool deleted = false; - while(i < obj->style_cnt) { - lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); - lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); - if((state != LV_STATE_ANY && state_act != state) || - (part != LV_PART_ANY && part_act != part) || - (style != NULL && style != obj->styles[i].style)) { - i++; - continue; - } - - if(obj->styles[i].is_trans) { - trans_delete(obj, part, LV_STYLE_PROP_ANY, NULL); - } - - if(obj->styles[i].is_local || obj->styles[i].is_trans) { - if(obj->styles[i].style) lv_style_reset((lv_style_t *)obj->styles[i].style); - lv_free((lv_style_t *)obj->styles[i].style); - obj->styles[i].style = NULL; - } - - /*Shift the styles after `i` by one*/ - uint32_t j; - for(j = i; j < (uint32_t)obj->style_cnt - 1 ; j++) { - obj->styles[j] = obj->styles[j + 1]; - } - - obj->style_cnt--; - obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(lv_obj_style_t)); - - deleted = true; - /*The style from the current `i` index is removed, so `i` points to the next style. - *Therefore it doesn't needs to be incremented*/ - } - - if(deleted && prop != LV_STYLE_PROP_INV) { - full_cache_refresh(obj, part); - lv_obj_refresh_style(obj, part, prop); - } -} - -void lv_obj_remove_style_all(lv_obj_t * obj) -{ - lv_obj_remove_style(obj, NULL, LV_PART_ANY | LV_STATE_ANY); -} - -void lv_obj_report_style_change(lv_style_t * style) -{ - if(!style_refr) return; - lv_display_t * d = lv_display_get_next(NULL); - - while(d) { - uint32_t i; - for(i = 0; i < d->screen_cnt; i++) { - report_style_change_core(style, d->screens[i]); - } - d = lv_display_get_next(d); - } -} - -void lv_obj_refresh_style(lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - if(!style_refr) return; - - lv_obj_invalidate(obj); - - lv_part_t part = lv_obj_style_get_selector_part(selector); - - bool is_layout_refr = lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_LAYOUT_UPDATE); - bool is_ext_draw = lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE); - bool is_inheritable = lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_INHERITABLE); - bool is_layer_refr = lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_LAYER_UPDATE); - - if(is_layout_refr) { - if(part == LV_PART_ANY || - part == LV_PART_MAIN || - lv_obj_get_style_height(obj, 0) == LV_SIZE_CONTENT || - lv_obj_get_style_width(obj, 0) == LV_SIZE_CONTENT) { - lv_obj_send_event(obj, LV_EVENT_STYLE_CHANGED, NULL); - lv_obj_mark_layout_as_dirty(obj); - } - } - if((part == LV_PART_ANY || part == LV_PART_MAIN) && (prop == LV_STYLE_PROP_ANY || is_layout_refr)) { - lv_obj_t * parent = lv_obj_get_parent(obj); - if(parent) lv_obj_mark_layout_as_dirty(parent); - } - - /*Cache the layer type*/ - if((part == LV_PART_ANY || part == LV_PART_MAIN) && is_layer_refr) { - lv_obj_update_layer_type(obj); - } - - if(prop == LV_STYLE_PROP_ANY || is_ext_draw) { - lv_obj_refresh_ext_draw_size(obj); - } - lv_obj_invalidate(obj); - - if(prop == LV_STYLE_PROP_ANY || (is_inheritable && (is_ext_draw || is_layout_refr))) { - if(part != LV_PART_SCROLLBAR) { - refresh_children_style(obj); - } - } -} - -void lv_obj_enable_style_refresh(bool en) -{ - style_refr = en; -} - -lv_style_value_t lv_obj_get_style_prop(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop) -{ - LV_ASSERT_NULL(obj) - - lv_style_selector_t selector = part | obj->state; - lv_style_value_t value_act = { .ptr = NULL }; - lv_style_res_t found; - - found = get_selector_style_prop(obj, selector, prop, &value_act); - if(found == LV_STYLE_RES_FOUND) return value_act; - - return lv_style_prop_get_default(prop); -} - -bool lv_obj_has_style_prop(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop) -{ - LV_ASSERT_NULL(obj) - - lv_style_value_t value_act = { .ptr = NULL }; - lv_style_res_t found; - - found = get_selector_style_prop(obj, selector, prop, &value_act); - if(found == LV_STYLE_RES_FOUND) return true; - - return false; -} - -void lv_obj_set_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t value, - lv_style_selector_t selector) -{ - /*Stop running transitions wit this property */ - trans_delete(obj, lv_obj_style_get_selector_part(selector), prop, NULL); - - lv_style_t * style = get_local_style(obj, selector); - if(selector == LV_PART_MAIN && lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_TRANSFORM)) { - lv_obj_invalidate(obj); - } - - lv_style_set_prop(style, prop, value); - -#if LV_OBJ_STYLE_CACHE - uint32_t prop_shifted = STYLE_PROP_SHIFTED(prop); - if(lv_obj_style_get_selector_part(selector) == LV_PART_MAIN) { - obj->style_main_prop_is_set |= prop_shifted; - } - else { - obj->style_other_prop_is_set |= prop_shifted; - } -#endif - - lv_obj_refresh_style(obj, selector, prop); -} - -lv_style_res_t lv_obj_get_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value, - lv_style_selector_t selector) -{ - uint32_t i; - for(i = 0; i < obj->style_cnt; i++) { - if(obj->styles[i].is_local && - obj->styles[i].selector == selector) { - return lv_style_get_prop(obj->styles[i].style, prop, value); - } - } - - return LV_STYLE_RES_NOT_FOUND; -} - -bool lv_obj_remove_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_selector_t selector) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - uint32_t i; - /*Find the style*/ - for(i = 0; i < obj->style_cnt; i++) { - if(obj->styles[i].is_local && - obj->styles[i].selector == selector) { - break; - } - } - - /*The style is not found*/ - if(i == obj->style_cnt) return false; - - lv_result_t res = lv_style_remove_prop((lv_style_t *)obj->styles[i].style, prop); - if(res == LV_RESULT_OK) { - full_cache_refresh(obj, lv_obj_style_get_selector_part(selector)); - lv_obj_refresh_style(obj, selector, prop); - } - - return res; -} - -void lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, lv_state_t new_state, - const lv_obj_style_transition_dsc_t * tr_dsc) -{ - trans_t * tr; - - /*Get the previous and current values*/ - obj->skip_trans = 1; - obj->state = prev_state; - lv_style_value_t v1 = lv_obj_get_style_prop(obj, part, tr_dsc->prop); - obj->state = new_state; - lv_style_value_t v2 = lv_obj_get_style_prop(obj, part, tr_dsc->prop); - obj->skip_trans = 0; - - if(v1.ptr == v2.ptr && v1.num == v2.num && lv_color_eq(v1.color, v2.color)) return; - obj->state = prev_state; - v1 = lv_obj_get_style_prop(obj, part, tr_dsc->prop); - obj->state = new_state; - - lv_obj_style_t * style_trans = get_trans_style(obj, part); - lv_style_set_prop((lv_style_t *)style_trans->style, tr_dsc->prop, v1); /*Be sure `trans_style` has a valid value*/ - lv_obj_refresh_style(obj, tr_dsc->selector, tr_dsc->prop); - - if(tr_dsc->prop == LV_STYLE_RADIUS) { - if(v1.num == LV_RADIUS_CIRCLE || v2.num == LV_RADIUS_CIRCLE) { - int32_t whalf = lv_obj_get_width(obj) / 2; - int32_t hhalf = lv_obj_get_height(obj) / 2; - if(v1.num == LV_RADIUS_CIRCLE) v1.num = LV_MIN(whalf + 1, hhalf + 1); - if(v2.num == LV_RADIUS_CIRCLE) v2.num = LV_MIN(whalf + 1, hhalf + 1); - } - } - - tr = lv_ll_ins_head(style_trans_ll_p); - LV_ASSERT_MALLOC(tr); - if(tr == NULL) return; - tr->start_value = v1; - tr->end_value = v2; - tr->obj = obj; - tr->prop = tr_dsc->prop; - tr->selector = part; - - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, tr); - lv_anim_set_exec_cb(&a, trans_anim_cb); - lv_anim_set_start_cb(&a, trans_anim_start_cb); - lv_anim_set_completed_cb(&a, trans_anim_completed_cb); - lv_anim_set_values(&a, 0x00, 0xFF); - lv_anim_set_duration(&a, tr_dsc->time); - lv_anim_set_delay(&a, tr_dsc->delay); - lv_anim_set_path_cb(&a, tr_dsc->path_cb); - lv_anim_set_early_apply(&a, false); - lv_anim_set_user_data(&a, tr_dsc->user_data); - lv_anim_start(&a); -} - -lv_style_value_t lv_obj_style_apply_color_filter(const lv_obj_t * obj, lv_part_t part, lv_style_value_t v) -{ - if(obj == NULL) return v; - const lv_color_filter_dsc_t * f = lv_obj_get_style_color_filter_dsc(obj, part); - if(f && f->filter_cb) { - lv_opa_t f_opa = lv_obj_get_style_color_filter_opa(obj, part); - if(f_opa != 0) v.color = f->filter_cb(f, v.color, f_opa); - } - return v; -} - -lv_style_state_cmp_t lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t state1, lv_state_t state2) -{ - lv_style_state_cmp_t res = LV_STYLE_STATE_CMP_SAME; - - /*Are there any new styles for the new state?*/ - uint32_t i; - for(i = 0; i < obj->style_cnt; i++) { - if(obj->styles[i].is_trans) continue; - - lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); - /*The style is valid for a state but not the other*/ - bool valid1 = state_act & (~state1) ? false : true; - bool valid2 = state_act & (~state2) ? false : true; - if(valid1 != valid2) { - const lv_style_t * style = obj->styles[i].style; - lv_style_value_t v; - /*If there is layout difference on the main part, return immediately. There is no more serious difference*/ - bool layout_diff = false; - if(lv_style_get_prop(style, LV_STYLE_PAD_TOP, &v))layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_PAD_BOTTOM, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_PAD_LEFT, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_PAD_RIGHT, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_PAD_COLUMN, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_PAD_ROW, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_LAYOUT, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_TRANSLATE_X, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_TRANSLATE_Y, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_WIDTH, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_HEIGHT, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_MIN_WIDTH, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_MAX_WIDTH, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_MIN_HEIGHT, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_MAX_HEIGHT, &v)) layout_diff = true; - else if(lv_style_get_prop(style, LV_STYLE_BORDER_WIDTH, &v)) layout_diff = true; - - if(layout_diff) { - return LV_STYLE_STATE_CMP_DIFF_LAYOUT; - } - - /*Check for draw pad changes*/ - if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_WIDTH, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_HEIGHT, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_ROTATION, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE_X, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE_Y, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_OPA, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_PAD, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_WIDTH, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_SHADOW_WIDTH, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OPA, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OFFSET_X, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OFFSET_Y, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_SHADOW_SPREAD, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_LINE_WIDTH, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(res == LV_STYLE_STATE_CMP_SAME) res = LV_STYLE_STATE_CMP_DIFF_REDRAW; - } - } - - return res; -} - -void lv_obj_fade_in(lv_obj_t * obj, uint32_t time, uint32_t delay) -{ - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, obj); - lv_anim_set_values(&a, 0, LV_OPA_COVER); - lv_anim_set_exec_cb(&a, fade_anim_cb); - lv_anim_set_completed_cb(&a, fade_in_anim_completed); - lv_anim_set_duration(&a, time); - lv_anim_set_delay(&a, delay); - lv_anim_start(&a); -} - -void lv_obj_fade_out(lv_obj_t * obj, uint32_t time, uint32_t delay) -{ - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, obj); - lv_anim_set_values(&a, lv_obj_get_style_opa(obj, 0), LV_OPA_TRANSP); - lv_anim_set_exec_cb(&a, fade_anim_cb); - lv_anim_set_duration(&a, time); - lv_anim_set_delay(&a, delay); - lv_anim_start(&a); -} - -lv_text_align_t lv_obj_calculate_style_text_align(const lv_obj_t * obj, lv_part_t part, const char * txt) -{ - lv_text_align_t align = lv_obj_get_style_text_align(obj, part); - lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, part); - lv_bidi_calculate_align(&align, &base_dir, txt); - return align; -} - -lv_opa_t lv_obj_get_style_opa_recursive(const lv_obj_t * obj, lv_part_t part) -{ - - lv_opa_t opa_obj = lv_obj_get_style_opa(obj, part); - if(opa_obj <= LV_OPA_MIN) return LV_OPA_TRANSP; - - lv_opa_t opa_final = LV_OPA_COVER; - if(opa_obj < LV_OPA_MAX) { - opa_final = LV_OPA_MIX2(opa_final, opa_obj); - } - - if(part != LV_PART_MAIN) { - part = LV_PART_MAIN; - } - else { - obj = lv_obj_get_parent(obj); - } - - while(obj) { - opa_obj = lv_obj_get_style_opa(obj, part); - if(opa_obj <= LV_OPA_MIN) return LV_OPA_TRANSP; - if(opa_obj < LV_OPA_MAX) { - opa_final = LV_OPA_MIX2(opa_final, opa_obj); - } - - obj = lv_obj_get_parent(obj); - } - - if(opa_final <= LV_OPA_MIN) return LV_OPA_TRANSP; - if(opa_final >= LV_OPA_MAX) return LV_OPA_COVER; - return opa_final; -} - -void lv_obj_update_layer_type(lv_obj_t * obj) -{ - lv_layer_type_t layer_type = calculate_layer_type(obj); - if(obj->spec_attr) obj->spec_attr->layer_type = layer_type; - else if(layer_type != LV_LAYER_TYPE_NONE) { - lv_obj_allocate_spec_attr(obj); - obj->spec_attr->layer_type = layer_type; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Get the local style of an object for a given part and for a given state. - * If the local style for the part-state pair doesn't exist allocate and return it. - * @param obj pointer to an object - * @param selector OR-ed value of parts and state for which the style should be get - * @return pointer to the local style - */ -static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector) -{ - uint32_t i; - for(i = 0; i < obj->style_cnt; i++) { - if(obj->styles[i].is_local && - obj->styles[i].selector == selector) { - return (lv_style_t *)obj->styles[i].style; - } - } - - obj->style_cnt++; - LV_ASSERT(obj->style_cnt != 0); - obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(lv_obj_style_t)); - LV_ASSERT_MALLOC(obj->styles); - - for(i = obj->style_cnt - 1; i > 0 ; i--) { - /*Copy only normal styles (not local and transition). - *The new local style will be added as the last local style*/ - if(obj->styles[i - 1].is_local || obj->styles[i - 1].is_trans) break; - obj->styles[i] = obj->styles[i - 1]; - } - - lv_memzero(&obj->styles[i], sizeof(lv_obj_style_t)); - obj->styles[i].style = lv_malloc(sizeof(lv_style_t)); - lv_style_init((lv_style_t *)obj->styles[i].style); - - obj->styles[i].is_local = 1; - obj->styles[i].selector = selector; - return (lv_style_t *)obj->styles[i].style; -} - -/** - * Get the transition style of an object for a given part and for a given state. - * If the transition style for the part-state pair doesn't exist allocate and return it. - * @param obj pointer to an object - * @param selector OR-ed value of parts and state for which the style should be get - * @return pointer to the transition style - */ -static lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_style_selector_t selector) -{ - uint32_t i; - for(i = 0; i < obj->style_cnt; i++) { - if(obj->styles[i].is_trans && obj->styles[i].selector == selector) break; - } - - /*Already have a transition style for it*/ - if(i != obj->style_cnt) return &obj->styles[i]; - - obj->style_cnt++; - LV_ASSERT(obj->style_cnt != 0); - obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(lv_obj_style_t)); - - for(i = obj->style_cnt - 1; i > 0 ; i--) { - obj->styles[i] = obj->styles[i - 1]; - } - - lv_memzero(&obj->styles[0], sizeof(lv_obj_style_t)); - obj->styles[0].style = lv_malloc(sizeof(lv_style_t)); - lv_style_init((lv_style_t *)obj->styles[0].style); - - obj->styles[0].is_trans = 1; - obj->styles[0].selector = selector; - return &obj->styles[0]; -} - -static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop, - lv_style_value_t * v) -{ - - const uint32_t group = (uint32_t)1 << lv_style_get_prop_group(prop); - const lv_part_t part = lv_obj_style_get_selector_part(selector); - const lv_state_t state = lv_obj_style_get_selector_state(selector); - const lv_state_t state_inv = ~state; - const bool skip_trans = (const bool) obj->skip_trans; - int32_t weight = -1; - lv_style_res_t found; - uint32_t i; - for(i = 0; i < obj->style_cnt; i++) { - lv_obj_style_t * obj_style = &obj->styles[i]; - if(obj_style->is_trans == false) break; - if(skip_trans) continue; - - lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); - - if(part_act != part) continue; - if((obj_style->style->has_group & group) == 0) continue; - found = lv_style_get_prop_inlined(obj_style->style, prop, v); - if(found == LV_STYLE_RES_FOUND) { - return LV_STYLE_RES_FOUND; - } - } - - for(; i < obj->style_cnt; i++) { - if((obj->styles[i].style->has_group & group) == 0) continue; - lv_obj_style_t * obj_style = &obj->styles[i]; - lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); - if(part_act != part) continue; - - /*Be sure the style not specifies other state than the requested. - *E.g. For HOVER+PRESS object state, HOVER style only is OK, but HOVER+FOCUS style is not*/ - lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); - if((state_act & state_inv)) continue; - - /*Check only better candidates*/ - if(state_act <= weight) continue; - - found = lv_style_get_prop_inlined(obj_style->style, prop, v); - if(found == LV_STYLE_RES_FOUND) { - if(state_act == state) { - return LV_STYLE_RES_FOUND; - } - weight = state_act; - } - } - - if(weight >= 0) return LV_STYLE_RES_FOUND; - else return LV_STYLE_RES_NOT_FOUND; -} - -/** - * Refresh the style of all children of an object. (Called recursively) - * @param style refresh objects only with this - * @param obj pointer to an object - */ -static void report_style_change_core(void * style, lv_obj_t * obj) -{ - uint32_t i; - for(i = 0; i < obj->style_cnt; i++) { - if(style == NULL || obj->styles[i].style == style) { - full_cache_refresh(obj, lv_obj_style_get_selector_part(obj->styles[i].selector)); - lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); - break; - } - } - - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(i = 0; i < child_cnt; i++) { - report_style_change_core(style, obj->spec_attr->children[i]); - } -} - -/** - * Recursively refresh the style of the children. Go deeper until a not NULL style is found - * because the NULL styles are inherited from the parent - * @param obj pointer to an object - */ -static void refresh_children_style(lv_obj_t * obj) -{ - uint32_t i; - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - lv_obj_invalidate(child); - lv_obj_send_event(child, LV_EVENT_STYLE_CHANGED, NULL); - lv_obj_invalidate(child); - - refresh_children_style(child); /*Check children too*/ - } -} - -/** - * Remove the transition from object's part's property. - * - Remove the transition from `lv_obj_style_trans_ll` and free it - * - Delete pending transitions - * @param obj pointer to an object which transition(s) should be removed - * @param part a part of object or 0xFF to remove from all parts - * @param prop a property or 0xFF to remove all properties - * @param tr_limit delete transitions only "older" than this. `NULL` if not used - */ -static bool trans_delete(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, trans_t * tr_limit) -{ - trans_t * tr; - trans_t * tr_prev; - bool removed = false; - tr = lv_ll_get_tail(style_trans_ll_p); - while(tr != NULL) { - if(tr == tr_limit) break; - - /*'tr' might be deleted, so get the next object while 'tr' is valid*/ - tr_prev = lv_ll_get_prev(style_trans_ll_p, tr); - - if(tr->obj == obj && (part == tr->selector || part == LV_PART_ANY) && (prop == tr->prop || prop == LV_STYLE_PROP_ANY)) { - /*Remove any transitioned properties from the trans. style - *to allow changing it by normal styles*/ - uint32_t i; - for(i = 0; i < obj->style_cnt; i++) { - if(obj->styles[i].is_trans && (part == LV_PART_ANY || obj->styles[i].selector == part)) { - lv_style_remove_prop((lv_style_t *)obj->styles[i].style, tr->prop); - } - } - - /*Free the transition descriptor too*/ - lv_anim_delete(tr, NULL); - lv_ll_remove(style_trans_ll_p, tr); - lv_free(tr); - removed = true; - - } - tr = tr_prev; - } - return removed; -} - -static void trans_anim_cb(void * _tr, int32_t v) -{ - trans_t * tr = _tr; - lv_obj_t * obj = tr->obj; - - uint32_t i; - for(i = 0; i < obj->style_cnt; i++) { - if(obj->styles[i].is_trans == 0 || obj->styles[i].selector != tr->selector) continue; - - lv_style_value_t value_final = {0}; - switch(tr->prop) { - - case LV_STYLE_BORDER_SIDE: - case LV_STYLE_BORDER_POST: - case LV_STYLE_BLEND_MODE: - if(v < 255) value_final.num = tr->start_value.num; - else value_final.num = tr->end_value.num; - break; - case LV_STYLE_TRANSITION: - case LV_STYLE_TEXT_FONT: - if(v < 255) value_final.ptr = tr->start_value.ptr; - else value_final.ptr = tr->end_value.ptr; - break; - case LV_STYLE_COLOR_FILTER_DSC: - if(tr->start_value.ptr == NULL) value_final.ptr = tr->end_value.ptr; - else if(tr->end_value.ptr == NULL) value_final.ptr = tr->start_value.ptr; - else if(v < 128) value_final.ptr = tr->start_value.ptr; - else value_final.ptr = tr->end_value.ptr; - break; - case LV_STYLE_BG_COLOR: - case LV_STYLE_BG_GRAD_COLOR: - case LV_STYLE_BORDER_COLOR: - case LV_STYLE_TEXT_COLOR: - case LV_STYLE_SHADOW_COLOR: - case LV_STYLE_OUTLINE_COLOR: - case LV_STYLE_IMAGE_RECOLOR: - if(v <= 0) value_final.color = tr->start_value.color; - else if(v >= 255) value_final.color = tr->end_value.color; - else value_final.color = lv_color_mix(tr->end_value.color, tr->start_value.color, v); - break; - - default: - if(v == 0) value_final.num = tr->start_value.num; - else if(v == 255) value_final.num = tr->end_value.num; - else value_final.num = tr->start_value.num + ((int32_t)((int32_t)(tr->end_value.num - tr->start_value.num) * v) >> 8); - break; - } - - lv_style_value_t old_value = {0}; - bool refr = true; - if(lv_style_get_prop(obj->styles[i].style, tr->prop, &old_value)) { - if(value_final.ptr == old_value.ptr && lv_color_eq(value_final.color, old_value.color) && - value_final.num == old_value.num) { - refr = false; - } - } - lv_style_set_prop((lv_style_t *)obj->styles[i].style, tr->prop, value_final); - if(refr) lv_obj_refresh_style(tr->obj, tr->selector, tr->prop); - break; - - } - -} - -static void trans_anim_start_cb(lv_anim_t * a) -{ - trans_t * tr = a->var; - - lv_part_t part = lv_obj_style_get_selector_part(tr->selector); - tr->start_value = lv_obj_get_style_prop(tr->obj, part, tr->prop); - - /*Init prop to an invalid values to be sure `trans_del` won't delete this added `tr`*/ - lv_style_prop_t prop_tmp = tr->prop; - tr->prop = LV_STYLE_PROP_INV; - - /*Delete the related transitions if any*/ - trans_delete(tr->obj, part, prop_tmp, tr); - - tr->prop = prop_tmp; - - lv_obj_style_t * style_trans = get_trans_style(tr->obj, tr->selector); - /*Be sure `trans_style` has a valid value*/ - lv_style_set_prop((lv_style_t *)style_trans->style, tr->prop, tr->start_value); - lv_obj_refresh_style(tr->obj, tr->selector, tr->prop); - -} - -static void trans_anim_completed_cb(lv_anim_t * a) -{ - trans_t * tr = a->var; - lv_obj_t * obj = tr->obj; - lv_style_prop_t prop = tr->prop; - - /*Remove the transitioned property from trans. style - *if there no more transitions for this property - *It allows changing it by normal styles*/ - bool running = false; - trans_t * tr_i; - LV_LL_READ(style_trans_ll_p, tr_i) { - if(tr_i != tr && tr_i->obj == tr->obj && tr_i->selector == tr->selector && tr_i->prop == tr->prop) { - running = true; - break; - } - } - - if(!running) { - uint32_t i; - for(i = 0; i < obj->style_cnt; i++) { - if(obj->styles[i].is_trans && obj->styles[i].selector == tr->selector) { - lv_ll_remove(style_trans_ll_p, tr); - lv_free(tr); - - lv_obj_style_t * obj_style = &obj->styles[i]; - lv_style_remove_prop((lv_style_t *)obj_style->style, prop); - - if(lv_style_is_empty(obj->styles[i].style)) { - lv_obj_remove_style(obj, (lv_style_t *)obj_style->style, obj_style->selector); - - } - break; - } - } - } -} - -static lv_layer_type_t calculate_layer_type(lv_obj_t * obj) -{ - if(lv_obj_get_style_transform_rotation(obj, 0) != 0) return LV_LAYER_TYPE_TRANSFORM; - if(lv_obj_get_style_transform_scale_x(obj, 0) != 256) return LV_LAYER_TYPE_TRANSFORM; - if(lv_obj_get_style_transform_scale_y(obj, 0) != 256) return LV_LAYER_TYPE_TRANSFORM; - if(lv_obj_get_style_transform_skew_x(obj, 0) != 0) return LV_LAYER_TYPE_TRANSFORM; - if(lv_obj_get_style_transform_skew_y(obj, 0) != 0) return LV_LAYER_TYPE_TRANSFORM; - if(lv_obj_get_style_opa_layered(obj, 0) != LV_OPA_COVER) return LV_LAYER_TYPE_SIMPLE; - if(lv_obj_get_style_bitmap_mask_src(obj, 0) != NULL) return LV_LAYER_TYPE_SIMPLE; - if(lv_obj_get_style_blend_mode(obj, 0) != LV_BLEND_MODE_NORMAL) return LV_LAYER_TYPE_SIMPLE; - return LV_LAYER_TYPE_NONE; -} - -static void full_cache_refresh(lv_obj_t * obj, lv_part_t part) -{ -#if LV_OBJ_STYLE_CACHE - uint32_t i; - if(part == LV_PART_MAIN || part == LV_PART_ANY) { - obj->style_main_prop_is_set = 0; - for(i = 0; i < obj->style_cnt; i++) { - if(lv_obj_style_get_selector_part(obj->styles[i].selector) != LV_PART_MAIN) continue; - lv_style_t * style = (lv_style_t *)obj->styles[i].style; - uint32_t j; - if(lv_style_is_const(style)) { - lv_style_const_prop_t * props = style->values_and_props; - for(j = 0; props[j].prop != LV_STYLE_PROP_INV; j++) { - obj->style_main_prop_is_set |= STYLE_PROP_SHIFTED(props[j].prop); - } - } - else { - lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); - for(j = 0; j < style->prop_cnt; j++) { - obj->style_main_prop_is_set |= STYLE_PROP_SHIFTED(props[j]); - } - } - } - } - if(part != LV_PART_MAIN || part == LV_PART_ANY) { - obj->style_other_prop_is_set = 0; - for(i = 0; i < obj->style_cnt; i++) { - if(lv_obj_style_get_selector_part(obj->styles[i].selector) == LV_PART_MAIN) continue; - lv_style_t * style = (lv_style_t *)obj->styles[i].style; - uint32_t j; - if(lv_style_is_const(style)) { - lv_style_const_prop_t * props = style->values_and_props; - for(j = 0; props[j].prop != LV_STYLE_PROP_INV; j++) { - obj->style_other_prop_is_set |= STYLE_PROP_SHIFTED(props[j].prop); - } - } - else { - lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); - for(j = 0; j < style->prop_cnt; j++) { - obj->style_other_prop_is_set |= STYLE_PROP_SHIFTED(props[j]); - } - } - } - } -#else - LV_UNUSED(obj); - LV_UNUSED(part); -#endif -} - -static void fade_anim_cb(void * obj, int32_t v) -{ - lv_obj_set_style_opa(obj, v, 0); -} - -static void fade_in_anim_completed(lv_anim_t * a) -{ - lv_obj_remove_local_style_prop(a->var, LV_STYLE_OPA, 0); -} - -static bool style_has_flag(const lv_style_t * style, uint32_t flag) -{ - if(lv_style_is_const(style)) { - lv_style_const_prop_t * props = style->values_and_props; - uint32_t i; - for(i = 0; props[i].prop != LV_STYLE_PROP_INV; i++) { - if(lv_style_prop_has_flag(props[i].prop, flag)) { - return true; - } - } - } - else { - lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); - uint32_t i; - for(i = 0; i < style->prop_cnt; i++) { - if(lv_style_prop_has_flag(props[i], flag)) { - return true; - } - } - } - return false; -} - -static lv_style_res_t get_selector_style_prop(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop, - lv_style_value_t * value_act) -{ - lv_style_res_t found; - lv_part_t part = lv_obj_style_get_selector_part(selector); - - /*The happy path*/ -#if LV_OBJ_STYLE_CACHE - const uint32_t prop_shifted = STYLE_PROP_SHIFTED(prop); - if((part == LV_PART_MAIN ? obj->style_main_prop_is_set : obj->style_other_prop_is_set) & prop_shifted) -#endif - { - found = get_prop_core(obj, selector, prop, value_act); - if(found == LV_STYLE_RES_FOUND) return LV_STYLE_RES_FOUND; - } - - extern const uint8_t lv_style_builtin_prop_flag_lookup_table[]; - bool inheritable = false; - if(prop < LV_STYLE_NUM_BUILT_IN_PROPS) { - inheritable = lv_style_builtin_prop_flag_lookup_table[prop] & LV_STYLE_PROP_FLAG_INHERITABLE; - } - else { - if(_style_custom_prop_flag_lookup_table != NULL) { - inheritable = _style_custom_prop_flag_lookup_table[prop - LV_STYLE_NUM_BUILT_IN_PROPS] & - LV_STYLE_PROP_FLAG_INHERITABLE; - } - } - - if(inheritable) { - /*If not found, check the `MAIN` style first, if already on the MAIN part go to the parent*/ - if(part != LV_PART_MAIN) part = LV_PART_MAIN; - else obj = obj->parent; - - while(obj) { -#if LV_OBJ_STYLE_CACHE - if(obj->style_main_prop_is_set & prop_shifted) -#endif - { - selector = part | obj->state; - found = get_prop_core(obj, selector, prop, value_act); - if(found == LV_STYLE_RES_FOUND) return LV_STYLE_RES_FOUND; - } - /*Check the parent too.*/ - obj = obj->parent; - } - } - else { - /*Get the width and height from the class. - * WIDTH and HEIGHT are not inherited so add them in the `else` to skip checking them for inherited properties */ - if(part == LV_PART_MAIN && (prop == LV_STYLE_WIDTH || prop == LV_STYLE_HEIGHT)) { - const lv_obj_class_t * cls = obj->class_p; - while(cls) { - if(prop == LV_STYLE_WIDTH) { - if(cls->width_def != 0) { - value_act->num = cls->width_def; - return LV_STYLE_RES_FOUND; - } - } - else { - if(cls->height_def != 0) { - value_act->num = cls->height_def; - return LV_STYLE_RES_FOUND; - } - } - cls = cls->base_class; - } - } - } - - return LV_STYLE_RES_NOT_FOUND; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style.h deleted file mode 100644 index ff4e365..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style.h +++ /dev/null @@ -1,318 +0,0 @@ -/** - * @file lv_obj_style.h - * - */ - -#ifndef LV_OBJ_STYLE_H -#define LV_OBJ_STYLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_bidi.h" -#include "../misc/lv_style.h" -#include "../misc/lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - LV_STYLE_STATE_CMP_SAME, /**< The style properties in the 2 states are identical */ - LV_STYLE_STATE_CMP_DIFF_REDRAW, /**< The differences can be shown with a simple redraw */ - LV_STYLE_STATE_CMP_DIFF_DRAW_PAD, /**< The differences can be shown with a simple redraw */ - LV_STYLE_STATE_CMP_DIFF_LAYOUT, /**< The differences can be shown with a simple redraw */ -} lv_style_state_cmp_t; - -typedef uint32_t lv_style_selector_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Add a style to an object. - * @param obj pointer to an object - * @param style pointer to a style to add - * @param selector OR-ed value of parts and state to which the style should be added - * - * Examples: - * @code - * lv_obj_add_style(btn, &style_btn, 0); //Default button style - * - * lv_obj_add_style(btn, &btn_red, LV_STATE_PRESSED); //Overwrite only some colors to red when pressed - * @endcode - */ -void lv_obj_add_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector); - -/** - * Replaces a style of an object, preserving the order of the style stack (local styles and transitions are ignored). - * @param obj pointer to an object - * @param old_style pointer to a style to replace. - * @param new_style pointer to a style to replace the old style with. - * @param selector OR-ed values of states and a part to replace only styles with matching selectors. LV_STATE_ANY and LV_PART_ANY can be used - * - * Examples: - * @code - * lv_obj_replace_style(obj, &yellow_style, &blue_style, LV_PART_ANY | LV_STATE_ANY); //Replace a specific style - * - * lv_obj_replace_style(obj, &yellow_style, &blue_style, LV_PART_MAIN | LV_STATE_PRESSED); //Replace a specific style assigned to the main part when it is pressed - * @endcode - */ -bool lv_obj_replace_style(lv_obj_t * obj, const lv_style_t * old_style, const lv_style_t * new_style, - lv_style_selector_t selector); - -/** - * Remove a style from an object. - * @param obj pointer to an object - * @param style pointer to a style to remove. Can be NULL to check only the selector - * @param selector OR-ed values of states and a part to remove only styles with matching selectors. LV_STATE_ANY and LV_PART_ANY can be used - * - * Examples: - * @code - * lv_obj_remove_style(obj, &style, LV_PART_ANY | LV_STATE_ANY); //Remove a specific style - * - * lv_obj_remove_style(obj, NULL, LV_PART_MAIN | LV_STATE_ANY); //Remove all styles from the main part - * - * lv_obj_remove_style(obj, NULL, LV_PART_ANY | LV_STATE_ANY); //Remove all styles - * @endcode - */ -void lv_obj_remove_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector); - -/** - * Remove all styles from an object - * @param obj pointer to an object - */ -void lv_obj_remove_style_all(lv_obj_t * obj); - -/** - * Notify all object if a style is modified - * @param style pointer to a style. Only the objects with this style will be notified - * (NULL to notify all objects) - */ -void lv_obj_report_style_change(lv_style_t * style); - -/** - * Notify an object and its children about its style is modified. - * @param obj pointer to an object - * @param part the part whose style was changed. E.g. `LV_PART_ANY`, `LV_PART_MAIN` - * @param prop `LV_STYLE_PROP_ANY` or an `LV_STYLE_...` property. - * It is used to optimize what needs to be refreshed. - * `LV_STYLE_PROP_INV` to perform only a style cache update - */ -void lv_obj_refresh_style(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop); - -/** - * Enable or disable automatic style refreshing when a new style is added/removed to/from an object - * or any other style change happens. - * @param en true: enable refreshing; false: disable refreshing - */ -void lv_obj_enable_style_refresh(bool en); - -/** - * Get the value of a style property. The current state of the object will be considered. - * Inherited properties will be inherited. - * If a property is not set a default value will be returned. - * @param obj pointer to an object - * @param part a part from which the property should be get - * @param prop the property to get - * @return the value of the property. - * Should be read from the correct field of the `lv_style_value_t` according to the type of the property. - */ -lv_style_value_t lv_obj_get_style_prop(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop); - -/** - * Check if an object has a specified style property for a given style selector. - * @param obj pointer to an object - * @param selector the style selector to be checked, defining the scope of the style to be examined. - * @param prop the property to be checked. - * @return true if the object has the specified selector and property, false otherwise. - */ -bool lv_obj_has_style_prop(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop); - -/** - * Set local style property on an object's part and state. - * @param obj pointer to an object - * @param prop the property - * @param value value of the property. The correct element should be set according to the type of the property - * @param selector OR-ed value of parts and state for which the style should be set - */ -void lv_obj_set_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t value, - lv_style_selector_t selector); - -lv_style_res_t lv_obj_get_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value, - lv_style_selector_t selector); - -/** - * Remove a local style property from a part of an object with a given state. - * @param obj pointer to an object - * @param prop a style property to remove. - * @param selector OR-ed value of parts and state for which the style should be removed - * @return true the property was found and removed; false: the property was not found - */ -bool lv_obj_remove_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_selector_t selector); - -/** - * Used internally for color filtering - */ -lv_style_value_t lv_obj_style_apply_color_filter(const lv_obj_t * obj, lv_part_t part, lv_style_value_t v); - -/** - * Fade in an an object and all its children. - * @param obj the object to fade in - * @param time time of fade - * @param delay delay to start the animation - */ -void lv_obj_fade_in(lv_obj_t * obj, uint32_t time, uint32_t delay); - -/** - * Fade out an an object and all its children. - * @param obj the object to fade out - * @param time time of fade - * @param delay delay to start the animation - */ -void lv_obj_fade_out(lv_obj_t * obj, uint32_t time, uint32_t delay); - -static inline lv_state_t lv_obj_style_get_selector_state(lv_style_selector_t selector) -{ - return selector & 0xFFFF; -} - -static inline lv_part_t lv_obj_style_get_selector_part(lv_style_selector_t selector) -{ - return selector & 0xFF0000; -} - -#include "lv_obj_style_gen.h" - -static inline void lv_obj_set_style_pad_all(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_obj_set_style_pad_left(obj, value, selector); - lv_obj_set_style_pad_right(obj, value, selector); - lv_obj_set_style_pad_top(obj, value, selector); - lv_obj_set_style_pad_bottom(obj, value, selector); -} - -static inline void lv_obj_set_style_pad_hor(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_obj_set_style_pad_left(obj, value, selector); - lv_obj_set_style_pad_right(obj, value, selector); -} - -static inline void lv_obj_set_style_pad_ver(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_obj_set_style_pad_top(obj, value, selector); - lv_obj_set_style_pad_bottom(obj, value, selector); -} - -static inline void lv_obj_set_style_margin_all(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_obj_set_style_margin_left(obj, value, selector); - lv_obj_set_style_margin_right(obj, value, selector); - lv_obj_set_style_margin_top(obj, value, selector); - lv_obj_set_style_margin_bottom(obj, value, selector); -} - -static inline void lv_obj_set_style_margin_hor(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_obj_set_style_margin_left(obj, value, selector); - lv_obj_set_style_margin_right(obj, value, selector); -} - -static inline void lv_obj_set_style_margin_ver(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_obj_set_style_margin_top(obj, value, selector); - lv_obj_set_style_margin_bottom(obj, value, selector); -} - -static inline void lv_obj_set_style_pad_gap(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_obj_set_style_pad_row(obj, value, selector); - lv_obj_set_style_pad_column(obj, value, selector); -} - -static inline void lv_obj_set_style_size(lv_obj_t * obj, int32_t width, int32_t height, - lv_style_selector_t selector) -{ - lv_obj_set_style_width(obj, width, selector); - lv_obj_set_style_height(obj, height, selector); -} - -static inline void lv_obj_set_style_transform_scale(lv_obj_t * obj, int32_t value, - lv_style_selector_t selector) -{ - lv_obj_set_style_transform_scale_x(obj, value, selector); - lv_obj_set_style_transform_scale_y(obj, value, selector); -} - -static inline int32_t lv_obj_get_style_space_left(const lv_obj_t * obj, lv_part_t part) -{ - int32_t padding = lv_obj_get_style_pad_left(obj, part); - int32_t border_width = lv_obj_get_style_border_width(obj, part); - lv_border_side_t border_side = lv_obj_get_style_border_side(obj, part); - return (border_side & LV_BORDER_SIDE_LEFT) ? padding + border_width : padding; -} - -static inline int32_t lv_obj_get_style_space_right(const lv_obj_t * obj, lv_part_t part) -{ - int32_t padding = lv_obj_get_style_pad_right(obj, part); - int32_t border_width = lv_obj_get_style_border_width(obj, part); - lv_border_side_t border_side = lv_obj_get_style_border_side(obj, part); - return (border_side & LV_BORDER_SIDE_RIGHT) ? padding + border_width : padding; -} - -static inline int32_t lv_obj_get_style_space_top(const lv_obj_t * obj, lv_part_t part) -{ - int32_t padding = lv_obj_get_style_pad_top(obj, part); - int32_t border_width = lv_obj_get_style_border_width(obj, part); - lv_border_side_t border_side = lv_obj_get_style_border_side(obj, part); - return (border_side & LV_BORDER_SIDE_TOP) ? padding + border_width : padding; -} - -static inline int32_t lv_obj_get_style_space_bottom(const lv_obj_t * obj, lv_part_t part) -{ - int32_t padding = lv_obj_get_style_pad_bottom(obj, part); - int32_t border_width = lv_obj_get_style_border_width(obj, part); - lv_border_side_t border_side = lv_obj_get_style_border_side(obj, part); - return (border_side & LV_BORDER_SIDE_BOTTOM) ? padding + border_width : padding; -} - -lv_text_align_t lv_obj_calculate_style_text_align(const lv_obj_t * obj, lv_part_t part, const char * txt); - -static inline int32_t lv_obj_get_style_transform_scale_x_safe(const lv_obj_t * obj, lv_part_t part) -{ - int32_t scale = lv_obj_get_style_transform_scale_x(obj, part); - return scale > 0 ? scale : 1; -} - -static inline int32_t lv_obj_get_style_transform_scale_y_safe(const lv_obj_t * obj, lv_part_t part) -{ - int32_t scale = lv_obj_get_style_transform_scale_y(obj, part); - return scale > 0 ? scale : 1; -} - -/** - * Get the `opa` style property from all parents and multiply and `>> 8` them. - * @param obj the object whose opacity should be get - * @param part the part whose opacity should be get. Non-MAIN parts will consider the `opa` of the MAIN part too - * @return the final opacity considering the parents' opacity too - */ -lv_opa_t lv_obj_get_style_opa_recursive(const lv_obj_t * obj, lv_part_t part); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_STYLE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style_gen.c b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style_gen.c deleted file mode 100644 index ad97db5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style_gen.c +++ /dev/null @@ -1,897 +0,0 @@ - -/* - ********************************************************************** - * DO NOT EDIT - * This file is automatically generated by "style_api_gen.py" - ********************************************************************** - */ - - -#include "lv_obj.h" - - -void lv_obj_set_style_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_WIDTH, v, selector); -} - -void lv_obj_set_style_min_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_MIN_WIDTH, v, selector); -} - -void lv_obj_set_style_max_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_MAX_WIDTH, v, selector); -} - -void lv_obj_set_style_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_HEIGHT, v, selector); -} - -void lv_obj_set_style_min_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_MIN_HEIGHT, v, selector); -} - -void lv_obj_set_style_max_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_MAX_HEIGHT, v, selector); -} - -void lv_obj_set_style_length(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_LENGTH, v, selector); -} - -void lv_obj_set_style_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_X, v, selector); -} - -void lv_obj_set_style_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_Y, v, selector); -} - -void lv_obj_set_style_align(lv_obj_t * obj, lv_align_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_ALIGN, v, selector); -} - -void lv_obj_set_style_transform_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_WIDTH, v, selector); -} - -void lv_obj_set_style_transform_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_HEIGHT, v, selector); -} - -void lv_obj_set_style_translate_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSLATE_X, v, selector); -} - -void lv_obj_set_style_translate_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSLATE_Y, v, selector); -} - -void lv_obj_set_style_transform_scale_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SCALE_X, v, selector); -} - -void lv_obj_set_style_transform_scale_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SCALE_Y, v, selector); -} - -void lv_obj_set_style_transform_rotation(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_ROTATION, v, selector); -} - -void lv_obj_set_style_transform_pivot_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_PIVOT_X, v, selector); -} - -void lv_obj_set_style_transform_pivot_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_PIVOT_Y, v, selector); -} - -void lv_obj_set_style_transform_skew_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SKEW_X, v, selector); -} - -void lv_obj_set_style_transform_skew_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SKEW_Y, v, selector); -} - -void lv_obj_set_style_pad_top(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_TOP, v, selector); -} - -void lv_obj_set_style_pad_bottom(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_BOTTOM, v, selector); -} - -void lv_obj_set_style_pad_left(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_LEFT, v, selector); -} - -void lv_obj_set_style_pad_right(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_RIGHT, v, selector); -} - -void lv_obj_set_style_pad_row(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_ROW, v, selector); -} - -void lv_obj_set_style_pad_column(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_COLUMN, v, selector); -} - -void lv_obj_set_style_margin_top(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_MARGIN_TOP, v, selector); -} - -void lv_obj_set_style_margin_bottom(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_MARGIN_BOTTOM, v, selector); -} - -void lv_obj_set_style_margin_left(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_MARGIN_LEFT, v, selector); -} - -void lv_obj_set_style_margin_right(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_MARGIN_RIGHT, v, selector); -} - -void lv_obj_set_style_bg_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .color = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_COLOR, v, selector); -} - -void lv_obj_set_style_bg_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_OPA, v, selector); -} - -void lv_obj_set_style_bg_grad_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .color = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_COLOR, v, selector); -} - -void lv_obj_set_style_bg_grad_dir(lv_obj_t * obj, lv_grad_dir_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_DIR, v, selector); -} - -void lv_obj_set_style_bg_main_stop(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_MAIN_STOP, v, selector); -} - -void lv_obj_set_style_bg_grad_stop(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_STOP, v, selector); -} - -void lv_obj_set_style_bg_main_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_MAIN_OPA, v, selector); -} - -void lv_obj_set_style_bg_grad_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_OPA, v, selector); -} - -void lv_obj_set_style_bg_grad(lv_obj_t * obj, const lv_grad_dsc_t * value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD, v, selector); -} - -void lv_obj_set_style_bg_image_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_SRC, v, selector); -} - -void lv_obj_set_style_bg_image_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_OPA, v, selector); -} - -void lv_obj_set_style_bg_image_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .color = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_RECOLOR, v, selector); -} - -void lv_obj_set_style_bg_image_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_RECOLOR_OPA, v, selector); -} - -void lv_obj_set_style_bg_image_tiled(lv_obj_t * obj, bool value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_TILED, v, selector); -} - -void lv_obj_set_style_border_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .color = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_COLOR, v, selector); -} - -void lv_obj_set_style_border_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_OPA, v, selector); -} - -void lv_obj_set_style_border_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_WIDTH, v, selector); -} - -void lv_obj_set_style_border_side(lv_obj_t * obj, lv_border_side_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_SIDE, v, selector); -} - -void lv_obj_set_style_border_post(lv_obj_t * obj, bool value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_POST, v, selector); -} - -void lv_obj_set_style_outline_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_WIDTH, v, selector); -} - -void lv_obj_set_style_outline_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .color = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_COLOR, v, selector); -} - -void lv_obj_set_style_outline_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_OPA, v, selector); -} - -void lv_obj_set_style_outline_pad(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_PAD, v, selector); -} - -void lv_obj_set_style_shadow_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_WIDTH, v, selector); -} - -void lv_obj_set_style_shadow_offset_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_OFFSET_X, v, selector); -} - -void lv_obj_set_style_shadow_offset_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_OFFSET_Y, v, selector); -} - -void lv_obj_set_style_shadow_spread(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_SPREAD, v, selector); -} - -void lv_obj_set_style_shadow_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .color = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_COLOR, v, selector); -} - -void lv_obj_set_style_shadow_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_OPA, v, selector); -} - -void lv_obj_set_style_image_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_IMAGE_OPA, v, selector); -} - -void lv_obj_set_style_image_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .color = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_IMAGE_RECOLOR, v, selector); -} - -void lv_obj_set_style_image_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_IMAGE_RECOLOR_OPA, v, selector); -} - -void lv_obj_set_style_line_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_WIDTH, v, selector); -} - -void lv_obj_set_style_line_dash_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_DASH_WIDTH, v, selector); -} - -void lv_obj_set_style_line_dash_gap(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_DASH_GAP, v, selector); -} - -void lv_obj_set_style_line_rounded(lv_obj_t * obj, bool value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_ROUNDED, v, selector); -} - -void lv_obj_set_style_line_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .color = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_COLOR, v, selector); -} - -void lv_obj_set_style_line_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_OPA, v, selector); -} - -void lv_obj_set_style_arc_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_WIDTH, v, selector); -} - -void lv_obj_set_style_arc_rounded(lv_obj_t * obj, bool value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_ROUNDED, v, selector); -} - -void lv_obj_set_style_arc_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .color = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_COLOR, v, selector); -} - -void lv_obj_set_style_arc_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_OPA, v, selector); -} - -void lv_obj_set_style_arc_image_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_IMAGE_SRC, v, selector); -} - -void lv_obj_set_style_text_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .color = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_COLOR, v, selector); -} - -void lv_obj_set_style_text_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_OPA, v, selector); -} - -void lv_obj_set_style_text_font(lv_obj_t * obj, const lv_font_t * value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_FONT, v, selector); -} - -void lv_obj_set_style_text_letter_space(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_LETTER_SPACE, v, selector); -} - -void lv_obj_set_style_text_line_space(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_LINE_SPACE, v, selector); -} - -void lv_obj_set_style_text_decor(lv_obj_t * obj, lv_text_decor_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_DECOR, v, selector); -} - -void lv_obj_set_style_text_align(lv_obj_t * obj, lv_text_align_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_ALIGN, v, selector); -} - -void lv_obj_set_style_radius(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_RADIUS, v, selector); -} - -void lv_obj_set_style_clip_corner(lv_obj_t * obj, bool value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_CLIP_CORNER, v, selector); -} - -void lv_obj_set_style_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_OPA, v, selector); -} - -void lv_obj_set_style_opa_layered(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_OPA_LAYERED, v, selector); -} - -void lv_obj_set_style_color_filter_dsc(lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_COLOR_FILTER_DSC, v, selector); -} - -void lv_obj_set_style_color_filter_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_COLOR_FILTER_OPA, v, selector); -} - -void lv_obj_set_style_anim(lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM, v, selector); -} - -void lv_obj_set_style_anim_duration(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM_DURATION, v, selector); -} - -void lv_obj_set_style_transition(lv_obj_t * obj, const lv_style_transition_dsc_t * value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSITION, v, selector); -} - -void lv_obj_set_style_blend_mode(lv_obj_t * obj, lv_blend_mode_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BLEND_MODE, v, selector); -} - -void lv_obj_set_style_layout(lv_obj_t * obj, uint16_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_LAYOUT, v, selector); -} - -void lv_obj_set_style_base_dir(lv_obj_t * obj, lv_base_dir_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BASE_DIR, v, selector); -} - -void lv_obj_set_style_bitmap_mask_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BITMAP_MASK_SRC, v, selector); -} - -void lv_obj_set_style_rotary_sensitivity(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_ROTARY_SENSITIVITY, v, selector); -} -#if LV_USE_FLEX - -void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_FLOW, v, selector); -} - -void lv_obj_set_style_flex_main_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_MAIN_PLACE, v, selector); -} - -void lv_obj_set_style_flex_cross_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_CROSS_PLACE, v, selector); -} - -void lv_obj_set_style_flex_track_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_TRACK_PLACE, v, selector); -} - -void lv_obj_set_style_flex_grow(lv_obj_t * obj, uint8_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_GROW, v, selector); -} -#endif /*LV_USE_FLEX*/ - -#if LV_USE_GRID - -void lv_obj_set_style_grid_column_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_COLUMN_DSC_ARRAY, v, selector); -} - -void lv_obj_set_style_grid_column_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_COLUMN_ALIGN, v, selector); -} - -void lv_obj_set_style_grid_row_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_ROW_DSC_ARRAY, v, selector); -} - -void lv_obj_set_style_grid_row_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_ROW_ALIGN, v, selector); -} - -void lv_obj_set_style_grid_cell_column_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_COLUMN_POS, v, selector); -} - -void lv_obj_set_style_grid_cell_x_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_X_ALIGN, v, selector); -} - -void lv_obj_set_style_grid_cell_column_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_COLUMN_SPAN, v, selector); -} - -void lv_obj_set_style_grid_cell_row_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_ROW_POS, v, selector); -} - -void lv_obj_set_style_grid_cell_y_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_Y_ALIGN, v, selector); -} - -void lv_obj_set_style_grid_cell_row_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_ROW_SPAN, v, selector); -} -#endif /*LV_USE_GRID*/ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style_gen.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style_gen.h deleted file mode 100644 index 77cf537..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style_gen.h +++ /dev/null @@ -1,875 +0,0 @@ - -/* - ********************************************************************** - * DO NOT EDIT - * This file is automatically generated by "style_api_gen.py" - ********************************************************************** - */ - - -#ifndef LV_OBJ_STYLE_GEN_H -#define LV_OBJ_STYLE_GEN_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../misc/lv_area.h" -#include "../misc/lv_style.h" -#include "../core/lv_obj_style.h" -#include "../misc/lv_types.h" - -static inline int32_t lv_obj_get_style_width(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_WIDTH); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_min_width(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MIN_WIDTH); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_max_width(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MAX_WIDTH); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_height(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_HEIGHT); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_min_height(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MIN_HEIGHT); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_max_height(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MAX_HEIGHT); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_length(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LENGTH); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_x(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_X); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_y(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_Y); - return (int32_t)v.num; -} - -static inline lv_align_t lv_obj_get_style_align(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ALIGN); - return (lv_align_t)v.num; -} - -static inline int32_t lv_obj_get_style_transform_width(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_WIDTH); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_transform_height(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_HEIGHT); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_translate_x(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSLATE_X); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_translate_y(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSLATE_Y); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_transform_scale_x(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SCALE_X); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_transform_scale_y(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SCALE_Y); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_transform_rotation(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_ROTATION); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_transform_pivot_x(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_PIVOT_X); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_transform_pivot_y(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_PIVOT_Y); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_transform_skew_x(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SKEW_X); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_transform_skew_y(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SKEW_Y); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_pad_top(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_TOP); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_pad_bottom(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_BOTTOM); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_pad_left(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_LEFT); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_pad_right(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_RIGHT); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_pad_row(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_ROW); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_pad_column(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_COLUMN); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_margin_top(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MARGIN_TOP); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_margin_bottom(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MARGIN_BOTTOM); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_margin_left(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MARGIN_LEFT); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_margin_right(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MARGIN_RIGHT); - return (int32_t)v.num; -} - -static inline lv_color_t lv_obj_get_style_bg_color(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_COLOR); - return v.color; -} - -static inline lv_color_t lv_obj_get_style_bg_color_filtered(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_COLOR)); - return v.color; -} - -static inline lv_opa_t lv_obj_get_style_bg_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_OPA); - return (lv_opa_t)v.num; -} - -static inline lv_color_t lv_obj_get_style_bg_grad_color(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_COLOR); - return v.color; -} - -static inline lv_color_t lv_obj_get_style_bg_grad_color_filtered(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, - LV_STYLE_BG_GRAD_COLOR)); - return v.color; -} - -static inline lv_grad_dir_t lv_obj_get_style_bg_grad_dir(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_DIR); - return (lv_grad_dir_t)v.num; -} - -static inline int32_t lv_obj_get_style_bg_main_stop(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_MAIN_STOP); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_bg_grad_stop(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_STOP); - return (int32_t)v.num; -} - -static inline lv_opa_t lv_obj_get_style_bg_main_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_MAIN_OPA); - return (lv_opa_t)v.num; -} - -static inline lv_opa_t lv_obj_get_style_bg_grad_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_OPA); - return (lv_opa_t)v.num; -} - -static inline const lv_grad_dsc_t * lv_obj_get_style_bg_grad(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD); - return (const lv_grad_dsc_t *)v.ptr; -} - -static inline const void * lv_obj_get_style_bg_image_src(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_SRC); - return (const void *)v.ptr; -} - -static inline lv_opa_t lv_obj_get_style_bg_image_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_OPA); - return (lv_opa_t)v.num; -} - -static inline lv_color_t lv_obj_get_style_bg_image_recolor(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_RECOLOR); - return v.color; -} - -static inline lv_color_t lv_obj_get_style_bg_image_recolor_filtered(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, - LV_STYLE_BG_IMAGE_RECOLOR)); - return v.color; -} - -static inline lv_opa_t lv_obj_get_style_bg_image_recolor_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_RECOLOR_OPA); - return (lv_opa_t)v.num; -} - -static inline bool lv_obj_get_style_bg_image_tiled(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_TILED); - return (bool)v.num; -} - -static inline lv_color_t lv_obj_get_style_border_color(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_COLOR); - return v.color; -} - -static inline lv_color_t lv_obj_get_style_border_color_filtered(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, - LV_STYLE_BORDER_COLOR)); - return v.color; -} - -static inline lv_opa_t lv_obj_get_style_border_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_OPA); - return (lv_opa_t)v.num; -} - -static inline int32_t lv_obj_get_style_border_width(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_WIDTH); - return (int32_t)v.num; -} - -static inline lv_border_side_t lv_obj_get_style_border_side(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_SIDE); - return (lv_border_side_t)v.num; -} - -static inline bool lv_obj_get_style_border_post(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_POST); - return (bool)v.num; -} - -static inline int32_t lv_obj_get_style_outline_width(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_WIDTH); - return (int32_t)v.num; -} - -static inline lv_color_t lv_obj_get_style_outline_color(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR); - return v.color; -} - -static inline lv_color_t lv_obj_get_style_outline_color_filtered(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, - LV_STYLE_OUTLINE_COLOR)); - return v.color; -} - -static inline lv_opa_t lv_obj_get_style_outline_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_OPA); - return (lv_opa_t)v.num; -} - -static inline int32_t lv_obj_get_style_outline_pad(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_PAD); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_shadow_width(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_WIDTH); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_shadow_offset_x(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_OFFSET_X); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_shadow_offset_y(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_OFFSET_Y); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_shadow_spread(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_SPREAD); - return (int32_t)v.num; -} - -static inline lv_color_t lv_obj_get_style_shadow_color(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_COLOR); - return v.color; -} - -static inline lv_color_t lv_obj_get_style_shadow_color_filtered(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, - LV_STYLE_SHADOW_COLOR)); - return v.color; -} - -static inline lv_opa_t lv_obj_get_style_shadow_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_OPA); - return (lv_opa_t)v.num; -} - -static inline lv_opa_t lv_obj_get_style_image_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_OPA); - return (lv_opa_t)v.num; -} - -static inline lv_color_t lv_obj_get_style_image_recolor(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_RECOLOR); - return v.color; -} - -static inline lv_color_t lv_obj_get_style_image_recolor_filtered(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, - LV_STYLE_IMAGE_RECOLOR)); - return v.color; -} - -static inline lv_opa_t lv_obj_get_style_image_recolor_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_RECOLOR_OPA); - return (lv_opa_t)v.num; -} - -static inline int32_t lv_obj_get_style_line_width(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_WIDTH); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_line_dash_width(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_DASH_WIDTH); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_line_dash_gap(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_DASH_GAP); - return (int32_t)v.num; -} - -static inline bool lv_obj_get_style_line_rounded(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_ROUNDED); - return (bool)v.num; -} - -static inline lv_color_t lv_obj_get_style_line_color(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_COLOR); - return v.color; -} - -static inline lv_color_t lv_obj_get_style_line_color_filtered(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_COLOR)); - return v.color; -} - -static inline lv_opa_t lv_obj_get_style_line_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_OPA); - return (lv_opa_t)v.num; -} - -static inline int32_t lv_obj_get_style_arc_width(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_WIDTH); - return (int32_t)v.num; -} - -static inline bool lv_obj_get_style_arc_rounded(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_ROUNDED); - return (bool)v.num; -} - -static inline lv_color_t lv_obj_get_style_arc_color(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_COLOR); - return v.color; -} - -static inline lv_color_t lv_obj_get_style_arc_color_filtered(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_COLOR)); - return v.color; -} - -static inline lv_opa_t lv_obj_get_style_arc_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_OPA); - return (lv_opa_t)v.num; -} - -static inline const void * lv_obj_get_style_arc_image_src(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_IMAGE_SRC); - return (const void *)v.ptr; -} - -static inline lv_color_t lv_obj_get_style_text_color(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_COLOR); - return v.color; -} - -static inline lv_color_t lv_obj_get_style_text_color_filtered(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_COLOR)); - return v.color; -} - -static inline lv_opa_t lv_obj_get_style_text_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_OPA); - return (lv_opa_t)v.num; -} - -static inline const lv_font_t * lv_obj_get_style_text_font(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_FONT); - return (const lv_font_t *)v.ptr; -} - -static inline int32_t lv_obj_get_style_text_letter_space(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_LETTER_SPACE); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_text_line_space(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_LINE_SPACE); - return (int32_t)v.num; -} - -static inline lv_text_decor_t lv_obj_get_style_text_decor(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_DECOR); - return (lv_text_decor_t)v.num; -} - -static inline lv_text_align_t lv_obj_get_style_text_align(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_ALIGN); - return (lv_text_align_t)v.num; -} - -static inline int32_t lv_obj_get_style_radius(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_RADIUS); - return (int32_t)v.num; -} - -static inline bool lv_obj_get_style_clip_corner(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_CLIP_CORNER); - return (bool)v.num; -} - -static inline lv_opa_t lv_obj_get_style_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OPA); - return (lv_opa_t)v.num; -} - -static inline lv_opa_t lv_obj_get_style_opa_layered(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OPA_LAYERED); - return (lv_opa_t)v.num; -} - -static inline const lv_color_filter_dsc_t * lv_obj_get_style_color_filter_dsc(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_DSC); - return (const lv_color_filter_dsc_t *)v.ptr; -} - -static inline lv_opa_t lv_obj_get_style_color_filter_opa(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_OPA); - return (lv_opa_t)v.num; -} - -static inline const lv_anim_t * lv_obj_get_style_anim(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ANIM); - return (const lv_anim_t *)v.ptr; -} - -static inline uint32_t lv_obj_get_style_anim_duration(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ANIM_DURATION); - return (uint32_t)v.num; -} - -static inline const lv_style_transition_dsc_t * lv_obj_get_style_transition(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSITION); - return (const lv_style_transition_dsc_t *)v.ptr; -} - -static inline lv_blend_mode_t lv_obj_get_style_blend_mode(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BLEND_MODE); - return (lv_blend_mode_t)v.num; -} - -static inline uint16_t lv_obj_get_style_layout(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LAYOUT); - return (uint16_t)v.num; -} - -static inline lv_base_dir_t lv_obj_get_style_base_dir(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BASE_DIR); - return (lv_base_dir_t)v.num; -} - -static inline const void * lv_obj_get_style_bitmap_mask_src(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BITMAP_MASK_SRC); - return (const void *)v.ptr; -} - -static inline uint32_t lv_obj_get_style_rotary_sensitivity(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ROTARY_SENSITIVITY); - return (uint32_t)v.num; -} - -#if LV_USE_FLEX -static inline lv_flex_flow_t lv_obj_get_style_flex_flow(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_FLOW); - return (lv_flex_flow_t)v.num; -} - -static inline lv_flex_align_t lv_obj_get_style_flex_main_place(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_MAIN_PLACE); - return (lv_flex_align_t)v.num; -} - -static inline lv_flex_align_t lv_obj_get_style_flex_cross_place(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_CROSS_PLACE); - return (lv_flex_align_t)v.num; -} - -static inline lv_flex_align_t lv_obj_get_style_flex_track_place(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_TRACK_PLACE); - return (lv_flex_align_t)v.num; -} - -static inline uint8_t lv_obj_get_style_flex_grow(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_GROW); - return (uint8_t)v.num; -} - -#endif /*LV_USE_FLEX*/ - -#if LV_USE_GRID -static inline const int32_t * lv_obj_get_style_grid_column_dsc_array(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_COLUMN_DSC_ARRAY); - return (const int32_t *)v.ptr; -} - -static inline lv_grid_align_t lv_obj_get_style_grid_column_align(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_COLUMN_ALIGN); - return (lv_grid_align_t)v.num; -} - -static inline const int32_t * lv_obj_get_style_grid_row_dsc_array(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_ROW_DSC_ARRAY); - return (const int32_t *)v.ptr; -} - -static inline lv_grid_align_t lv_obj_get_style_grid_row_align(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_ROW_ALIGN); - return (lv_grid_align_t)v.num; -} - -static inline int32_t lv_obj_get_style_grid_cell_column_pos(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_COLUMN_POS); - return (int32_t)v.num; -} - -static inline lv_grid_align_t lv_obj_get_style_grid_cell_x_align(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_X_ALIGN); - return (lv_grid_align_t)v.num; -} - -static inline int32_t lv_obj_get_style_grid_cell_column_span(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_COLUMN_SPAN); - return (int32_t)v.num; -} - -static inline int32_t lv_obj_get_style_grid_cell_row_pos(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_ROW_POS); - return (int32_t)v.num; -} - -static inline lv_grid_align_t lv_obj_get_style_grid_cell_y_align(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_Y_ALIGN); - return (lv_grid_align_t)v.num; -} - -static inline int32_t lv_obj_get_style_grid_cell_row_span(const lv_obj_t * obj, lv_part_t part) -{ - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_ROW_SPAN); - return (int32_t)v.num; -} - -#endif /*LV_USE_GRID*/ - -void lv_obj_set_style_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_min_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_max_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_min_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_max_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_length(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_align(lv_obj_t * obj, lv_align_t value, lv_style_selector_t selector); -void lv_obj_set_style_transform_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_transform_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_translate_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_translate_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_transform_scale_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_transform_scale_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_transform_rotation(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_transform_pivot_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_transform_pivot_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_transform_skew_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_transform_skew_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_pad_top(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_pad_bottom(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_pad_left(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_pad_right(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_pad_row(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_pad_column(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_margin_top(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_margin_bottom(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_margin_left(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_margin_right(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_bg_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); -void lv_obj_set_style_bg_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_bg_grad_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); -void lv_obj_set_style_bg_grad_dir(lv_obj_t * obj, lv_grad_dir_t value, lv_style_selector_t selector); -void lv_obj_set_style_bg_main_stop(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_bg_grad_stop(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_bg_main_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_bg_grad_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_bg_grad(lv_obj_t * obj, const lv_grad_dsc_t * value, lv_style_selector_t selector); -void lv_obj_set_style_bg_image_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector); -void lv_obj_set_style_bg_image_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_bg_image_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); -void lv_obj_set_style_bg_image_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_bg_image_tiled(lv_obj_t * obj, bool value, lv_style_selector_t selector); -void lv_obj_set_style_border_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); -void lv_obj_set_style_border_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_border_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_border_side(lv_obj_t * obj, lv_border_side_t value, lv_style_selector_t selector); -void lv_obj_set_style_border_post(lv_obj_t * obj, bool value, lv_style_selector_t selector); -void lv_obj_set_style_outline_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_outline_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); -void lv_obj_set_style_outline_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_outline_pad(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_shadow_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_shadow_offset_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_shadow_offset_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_shadow_spread(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_shadow_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); -void lv_obj_set_style_shadow_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_image_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_image_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); -void lv_obj_set_style_image_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_line_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_line_dash_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_line_dash_gap(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_line_rounded(lv_obj_t * obj, bool value, lv_style_selector_t selector); -void lv_obj_set_style_line_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); -void lv_obj_set_style_line_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_arc_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_arc_rounded(lv_obj_t * obj, bool value, lv_style_selector_t selector); -void lv_obj_set_style_arc_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); -void lv_obj_set_style_arc_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_arc_image_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector); -void lv_obj_set_style_text_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); -void lv_obj_set_style_text_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_text_font(lv_obj_t * obj, const lv_font_t * value, lv_style_selector_t selector); -void lv_obj_set_style_text_letter_space(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_text_line_space(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_text_decor(lv_obj_t * obj, lv_text_decor_t value, lv_style_selector_t selector); -void lv_obj_set_style_text_align(lv_obj_t * obj, lv_text_align_t value, lv_style_selector_t selector); -void lv_obj_set_style_radius(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_clip_corner(lv_obj_t * obj, bool value, lv_style_selector_t selector); -void lv_obj_set_style_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_opa_layered(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_color_filter_dsc(lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector); -void lv_obj_set_style_color_filter_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_anim(lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector); -void lv_obj_set_style_anim_duration(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector); -void lv_obj_set_style_transition(lv_obj_t * obj, const lv_style_transition_dsc_t * value, lv_style_selector_t selector); -void lv_obj_set_style_blend_mode(lv_obj_t * obj, lv_blend_mode_t value, lv_style_selector_t selector); -void lv_obj_set_style_layout(lv_obj_t * obj, uint16_t value, lv_style_selector_t selector); -void lv_obj_set_style_base_dir(lv_obj_t * obj, lv_base_dir_t value, lv_style_selector_t selector); -void lv_obj_set_style_bitmap_mask_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector); -void lv_obj_set_style_rotary_sensitivity(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector); -#if LV_USE_FLEX -void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector); -void lv_obj_set_style_flex_main_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); -void lv_obj_set_style_flex_cross_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); -void lv_obj_set_style_flex_track_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); -void lv_obj_set_style_flex_grow(lv_obj_t * obj, uint8_t value, lv_style_selector_t selector); -#endif /*LV_USE_FLEX*/ - -#if LV_USE_GRID -void lv_obj_set_style_grid_column_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector); -void lv_obj_set_style_grid_column_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); -void lv_obj_set_style_grid_row_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector); -void lv_obj_set_style_grid_row_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); -void lv_obj_set_style_grid_cell_column_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_grid_cell_x_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); -void lv_obj_set_style_grid_cell_column_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_grid_cell_row_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -void lv_obj_set_style_grid_cell_y_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); -void lv_obj_set_style_grid_cell_row_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); -#endif /*LV_USE_GRID*/ - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_OBJ_STYLE_GEN_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style_private.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style_private.h deleted file mode 100644 index 7fafc58..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_style_private.h +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @file lv_obj_style_private.h - * - */ - -#ifndef LV_OBJ_STYLE_PRIVATE_H -#define LV_OBJ_STYLE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_obj_style.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_obj_style_t { - const lv_style_t * style; - uint32_t selector : 24; - uint32_t is_local : 1; - uint32_t is_trans : 1; -}; - -struct lv_obj_style_transition_dsc_t { - uint16_t time; - uint16_t delay; - lv_style_selector_t selector; - lv_style_prop_t prop; - lv_anim_path_cb_t path_cb; - void * user_data; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the object related style manager module. - * Called by LVGL in `lv_init()` - */ -void lv_obj_style_init(void); - -/** - * Deinitialize the object related style manager module. - * Called by LVGL in `lv_deinit()` - */ -void lv_obj_style_deinit(void); - -/** - * Used internally to create a style transition - * @param obj - * @param part - * @param prev_state - * @param new_state - * @param tr - */ -void lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, - lv_state_t new_state, const lv_obj_style_transition_dsc_t * tr); - -/** - * Used internally to compare the appearance of an object in 2 states - * @param obj - * @param state1 - * @param state2 - * @return - */ -lv_style_state_cmp_t lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t state1, lv_state_t state2); - -/** - * Update the layer type of a widget bayed on its current styles. - * The result will be stored in `obj->spec_attr->layer_type` - * @param obj the object whose layer should be updated - */ -void lv_obj_update_layer_type(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_STYLE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_tree.c b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_tree.c deleted file mode 100644 index 15c069e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_tree.c +++ /dev/null @@ -1,662 +0,0 @@ -/** - * @file lv_obj_tree.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_obj_private.h" -#include "lv_obj_class_private.h" -#include "../indev/lv_indev.h" -#include "../indev/lv_indev_private.h" -#include "../display/lv_display.h" -#include "../display/lv_display_private.h" -#include "../misc/lv_anim_private.h" -#include "../misc/lv_async.h" -#include "../core/lv_global.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_obj_class) -#define disp_ll_p &(LV_GLOBAL_DEFAULT()->disp_ll) - -#define OBJ_DUMP_STRING_LEN 128 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_obj_delete_async_cb(void * obj); -static void obj_delete_core(lv_obj_t * obj); -static lv_obj_tree_walk_res_t walk_core(lv_obj_t * obj, lv_obj_tree_walk_cb_t cb, void * user_data); -static void dump_tree_core(lv_obj_t * obj, int32_t depth); -static lv_obj_t * lv_obj_get_first_not_deleting_child(lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_obj_delete(lv_obj_t * obj) -{ - if(obj->is_deleting) - return; - - LV_LOG_TRACE("begin (delete %p)", (void *)obj); - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_obj_invalidate(obj); - - lv_obj_t * par = lv_obj_get_parent(obj); - - lv_display_t * disp = NULL; - bool act_screen_del = false; - if(par == NULL) { - disp = lv_obj_get_display(obj); - if(!disp) return; /*Shouldn't happen*/ - if(disp->act_scr == obj) act_screen_del = true; - } - - obj_delete_core(obj); - - /*Call the ancestor's event handler to the parent to notify it about the child delete*/ - if(par && !par->is_deleting) { - lv_obj_scrollbar_invalidate(par); - lv_obj_send_event(par, LV_EVENT_CHILD_CHANGED, NULL); - lv_obj_send_event(par, LV_EVENT_CHILD_DELETED, NULL); - } - - /*Handle if the active screen was deleted*/ - if(act_screen_del) { - LV_LOG_WARN("the active screen was deleted"); - disp->act_scr = NULL; - } - - LV_ASSERT_MEM_INTEGRITY(); - LV_LOG_TRACE("finished (delete %p)", (void *)obj); -} - -void lv_obj_clean(lv_obj_t * obj) -{ - LV_LOG_TRACE("begin (clean %p)", (void *)obj); - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_invalidate(obj); - - uint32_t cnt = lv_obj_get_child_count(obj); - lv_obj_t * child = lv_obj_get_first_not_deleting_child(obj); - while(child) { - obj_delete_core(child); - child = lv_obj_get_first_not_deleting_child(obj); - } - /*Just to remove scroll animations if any*/ - lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF); - if(obj->spec_attr) { - obj->spec_attr->scroll.x = 0; - obj->spec_attr->scroll.y = 0; - } - - if(lv_obj_get_child_count(obj) < cnt) { - lv_obj_send_event(obj, LV_EVENT_CHILD_CHANGED, NULL); - lv_obj_send_event(obj, LV_EVENT_CHILD_DELETED, NULL); - } - - LV_ASSERT_MEM_INTEGRITY(); - - LV_LOG_TRACE("finished (clean %p)", (void *)obj); -} - -void lv_obj_delete_delayed(lv_obj_t * obj, uint32_t delay_ms) -{ - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, obj); - lv_anim_set_exec_cb(&a, NULL); - lv_anim_set_duration(&a, 1); - lv_anim_set_delay(&a, delay_ms); - lv_anim_set_completed_cb(&a, lv_obj_delete_anim_completed_cb); - lv_anim_start(&a); -} - -void lv_obj_delete_anim_completed_cb(lv_anim_t * a) -{ - lv_obj_delete(a->var); -} - -void lv_obj_delete_async(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_async_call(lv_obj_delete_async_cb, obj); -} - -void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_OBJ(parent, MY_CLASS); - - if(obj->parent == NULL) { - LV_LOG_WARN("Can't set the parent of a screen"); - return; - } - - if(parent == NULL) { - LV_LOG_WARN("Can't set parent == NULL to an object"); - return; - } - - if(parent == obj->parent) { - return; - } - - lv_obj_invalidate(obj); - - lv_obj_allocate_spec_attr(parent); - - lv_obj_t * old_parent = obj->parent; - /*Remove the object from the old parent's child list*/ - int32_t i; - for(i = lv_obj_get_index(obj); i <= (int32_t)lv_obj_get_child_count(old_parent) - 2; i++) { - old_parent->spec_attr->children[i] = old_parent->spec_attr->children[i + 1]; - } - old_parent->spec_attr->child_cnt--; - if(old_parent->spec_attr->child_cnt) { - old_parent->spec_attr->children = lv_realloc(old_parent->spec_attr->children, - old_parent->spec_attr->child_cnt * (sizeof(lv_obj_t *))); - } - else { - lv_free(old_parent->spec_attr->children); - old_parent->spec_attr->children = NULL; - } - - /*Add the child to the new parent as the last (newest child)*/ - parent->spec_attr->child_cnt++; - parent->spec_attr->children = lv_realloc(parent->spec_attr->children, - parent->spec_attr->child_cnt * (sizeof(lv_obj_t *))); - parent->spec_attr->children[lv_obj_get_child_count(parent) - 1] = obj; - - obj->parent = parent; - - /*Notify the original parent because one of its children is lost*/ - lv_obj_scrollbar_invalidate(old_parent); - lv_obj_send_event(old_parent, LV_EVENT_CHILD_CHANGED, obj); - lv_obj_send_event(old_parent, LV_EVENT_CHILD_DELETED, NULL); - - /*Notify the new parent about the child*/ - lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj); - lv_obj_send_event(parent, LV_EVENT_CHILD_CREATED, NULL); - - lv_obj_mark_layout_as_dirty(obj); - - lv_obj_invalidate(obj); -} - -void lv_obj_move_to_index(lv_obj_t * obj, int32_t index) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - /* Check parent validity */ - lv_obj_t * parent = lv_obj_get_parent(obj); - if(!parent) { - LV_LOG_WARN("parent is NULL"); - return; - } - - const uint32_t parent_child_count = lv_obj_get_child_count(parent); - /* old_index only can be 0 or greater, this point cannot be reached if the parent is not null */ - const int32_t old_index = lv_obj_get_index(obj); - LV_ASSERT(0 <= old_index); - - if(index < 0) { - index += parent_child_count; - } - - /* Index was negative and the absolute value is greater than parent child count */ - if((index < 0) - /* Index is same or bigger than parent child count */ - || (index >= (int32_t) parent_child_count) - /* If both previous and new index are the same */ - || (index == old_index)) { - - return; - } - - int32_t i = old_index; - if(index < old_index) { - while(i > index) { - parent->spec_attr->children[i] = parent->spec_attr->children[i - 1]; - i--; - } - } - else { - while(i < index) { - parent->spec_attr->children[i] = parent->spec_attr->children[i + 1]; - i++; - } - } - - parent->spec_attr->children[index] = obj; - lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, NULL); - lv_obj_invalidate(parent); -} - -void lv_obj_swap(lv_obj_t * obj1, lv_obj_t * obj2) -{ - LV_ASSERT_OBJ(obj1, MY_CLASS); - LV_ASSERT_OBJ(obj2, MY_CLASS); - - lv_obj_t * parent = lv_obj_get_parent(obj1); - lv_obj_t * parent2 = lv_obj_get_parent(obj2); - - uint_fast32_t index1 = lv_obj_get_index(obj1); - uint_fast32_t index2 = lv_obj_get_index(obj2); - - lv_obj_send_event(parent2, LV_EVENT_CHILD_DELETED, obj2); - lv_obj_send_event(parent, LV_EVENT_CHILD_DELETED, obj1); - - parent->spec_attr->children[index1] = obj2; - obj2->parent = parent; - - parent2->spec_attr->children[index2] = obj1; - obj1->parent = parent2; - - lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj2); - lv_obj_send_event(parent, LV_EVENT_CHILD_CREATED, obj2); - lv_obj_send_event(parent2, LV_EVENT_CHILD_CHANGED, obj1); - lv_obj_send_event(parent2, LV_EVENT_CHILD_CREATED, obj1); - - lv_obj_invalidate(parent); - - if(parent != parent2) { - lv_obj_invalidate(parent2); - } - lv_group_swap_obj(obj1, obj2); -} - -lv_obj_t * lv_obj_get_screen(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - const lv_obj_t * par = obj; - const lv_obj_t * act_par; - - do { - act_par = par; - par = lv_obj_get_parent(act_par); - } while(par != NULL); - - return (lv_obj_t *)act_par; -} - -lv_display_t * lv_obj_get_display(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - const lv_obj_t * scr; - - if(obj->parent == NULL) scr = obj; /*`obj` is a screen*/ - else scr = lv_obj_get_screen(obj); /*get the screen of `obj`*/ - - lv_display_t * d; - lv_ll_t * disp_head = disp_ll_p; - LV_LL_READ(disp_head, d) { - uint32_t i; - for(i = 0; i < d->screen_cnt; i++) { - if(d->screens[i] == scr) return d; - } - } - - LV_LOG_WARN("No screen found"); - return NULL; -} - -lv_obj_t * lv_obj_get_parent(const lv_obj_t * obj) -{ - if(obj == NULL) return NULL; - LV_ASSERT_OBJ(obj, MY_CLASS); - - return obj->parent; -} - -lv_obj_t * lv_obj_get_child(const lv_obj_t * obj, int32_t idx) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - if(obj->spec_attr == NULL) return NULL; - - uint32_t idu; - if(idx < 0) { - idx = obj->spec_attr->child_cnt + idx; - if(idx < 0) return NULL; - idu = (uint32_t) idx; - } - else { - idu = idx; - } - - if(idu >= obj->spec_attr->child_cnt) return NULL; - else return obj->spec_attr->children[idx]; -} - -lv_obj_t * lv_obj_get_child_by_type(const lv_obj_t * obj, int32_t idx, const lv_obj_class_t * class_p) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - if(obj->spec_attr == NULL) return NULL; - - int32_t i; - int32_t cnt = (int32_t)obj->spec_attr->child_cnt; - if(idx >= 0) { - for(i = 0; i < cnt; i++) { - if(obj->spec_attr->children[i]->class_p == class_p) { - if(idx == 0) return obj->spec_attr->children[i]; - else idx--; - } - } - } - else { - idx++; /*-1 means the first child*/ - for(i = cnt - 1; i >= 0; i--) { - if(obj->spec_attr->children[i]->class_p == class_p) { - if(idx == 0) return obj->spec_attr->children[i]; - else idx++; - } - } - } - return NULL; -} - -lv_obj_t * lv_obj_get_sibling(const lv_obj_t * obj, int32_t idx) -{ - lv_obj_t * parent = lv_obj_get_parent(obj); - int32_t sibling_idx = (int32_t)lv_obj_get_index(obj) + idx; - if(sibling_idx < 0) return NULL; - - return lv_obj_get_child(parent, sibling_idx); -} - -lv_obj_t * lv_obj_get_sibling_by_type(const lv_obj_t * obj, int32_t idx, const lv_obj_class_t * class_p) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_t * parent = lv_obj_get_parent(obj); - int32_t sibling_idx = (int32_t)lv_obj_get_index_by_type(obj, class_p) + idx; - if(sibling_idx < 0) return NULL; - - return lv_obj_get_child_by_type(parent, sibling_idx, class_p); -} - -uint32_t lv_obj_get_child_count(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - if(obj->spec_attr == NULL) return 0; - return obj->spec_attr->child_cnt; -} - -uint32_t lv_obj_get_child_count_by_type(const lv_obj_t * obj, const lv_obj_class_t * class_p) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - if(obj->spec_attr == NULL) return 0; - - uint32_t i; - uint32_t cnt = 0; - for(i = 0; i < obj->spec_attr->child_cnt; i++) { - if(obj->spec_attr->children[i]->class_p == class_p) cnt++; - } - return cnt; -} - -int32_t lv_obj_get_index(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_t * parent = lv_obj_get_parent(obj); - if(parent == NULL) return -1; - - int32_t i = 0; - for(i = 0; i < parent->spec_attr->child_cnt; i++) { - if(parent->spec_attr->children[i] == obj) return i; - } - - /*Shouldn't reach this point*/ - LV_ASSERT(0); - return -1; -} - -int32_t lv_obj_get_index_by_type(const lv_obj_t * obj, const lv_obj_class_t * class_p) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_t * parent = lv_obj_get_parent(obj); - if(parent == NULL) return 0xFFFFFFFF; - - uint32_t i = 0; - uint32_t idx = 0; - for(i = 0; i < parent->spec_attr->child_cnt; i++) { - lv_obj_t * child = parent->spec_attr->children[i]; - if(child->class_p == class_p) { - if(child == obj) return idx; - idx++; - } - } - - /*Can happen if there was no children with the given type*/ - return -1; -} - -void lv_obj_tree_walk(lv_obj_t * start_obj, lv_obj_tree_walk_cb_t cb, void * user_data) -{ - walk_core(start_obj, cb, user_data); -} - -void lv_obj_dump_tree(lv_obj_t * start_obj) -{ - if(start_obj == NULL) { - lv_display_t * disp = lv_display_get_next(NULL); - while(disp) { - uint32_t i; - for(i = 0; i < disp->screen_cnt; i++) { - dump_tree_core(disp->screens[i], 0); - } - disp = lv_display_get_next(disp); - } - } - else { - dump_tree_core(start_obj, 0); - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_obj_delete_async_cb(void * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_delete(obj); -} - -static void obj_indev_reset(lv_indev_t * indev, lv_obj_t * obj) -{ - /* If the input device is already in the release state, - * there is no need to wait for the input device to be released - */ - if(lv_indev_get_state(indev) != LV_INDEV_STATE_RELEASED) { - /*Wait for release to avoid accidentally triggering other obj to be clicked*/ - lv_indev_wait_release(indev); - } - - /*Reset the input device*/ - lv_indev_reset(indev, obj); -} - -static void obj_delete_core(lv_obj_t * obj) -{ - if(obj->is_deleting) - return; - - obj->is_deleting = true; - - /*Let the user free the resources used in `LV_EVENT_DELETE`*/ - lv_result_t res = lv_obj_send_event(obj, LV_EVENT_DELETE, NULL); - if(res == LV_RESULT_INVALID) { - obj->is_deleting = false; - return; - } - - /*Clean registered event_cb*/ - if(obj->spec_attr) lv_event_remove_all(&(obj->spec_attr->event_list)); - - /*Recursively delete the children*/ - lv_obj_t * child = lv_obj_get_child(obj, 0); - while(child) { - obj_delete_core(child); - child = lv_obj_get_child(obj, 0); - } - - lv_group_t * group = lv_obj_get_group(obj); - - /*Reset all input devices if the object to delete is used*/ - lv_indev_t * indev = lv_indev_get_next(NULL); - while(indev) { - lv_indev_type_t indev_type = lv_indev_get_type(indev); - if(indev_type == LV_INDEV_TYPE_POINTER || indev_type == LV_INDEV_TYPE_BUTTON) { - if(indev->pointer.act_obj == obj || indev->pointer.last_obj == obj || indev->pointer.scroll_obj == obj) { - obj_indev_reset(indev, obj); - } - if(indev->pointer.last_pressed == obj) { - indev->pointer.last_pressed = NULL; - } - if(indev->pointer.last_hovered == obj) { - indev->pointer.last_hovered = NULL; - } - } - - if(indev->group == group && obj == lv_indev_get_active_obj()) { - obj_indev_reset(indev, obj); - } - indev = lv_indev_get_next(indev); - } - - /*Delete all pending async del-s*/ - lv_result_t async_cancel_res = LV_RESULT_OK; - while(async_cancel_res == LV_RESULT_OK) { - async_cancel_res = lv_async_call_cancel(lv_obj_delete_async_cb, obj); - } - - /*All children deleted. Now clean up the object specific data*/ - lv_obj_destruct(obj); - - /*Remove the screen for the screen list*/ - if(obj->parent == NULL) { - lv_display_t * disp = lv_obj_get_display(obj); - uint32_t i; - /*Find the screen in the list*/ - for(i = 0; i < disp->screen_cnt; i++) { - if(disp->screens[i] == obj) break; - } - - uint32_t id = i; - for(i = id; i < disp->screen_cnt - 1; i++) { - disp->screens[i] = disp->screens[i + 1]; - } - disp->screen_cnt--; - disp->screens = lv_realloc(disp->screens, disp->screen_cnt * sizeof(lv_obj_t *)); - } - /*Remove the object from the child list of its parent*/ - else { - int32_t id = lv_obj_get_index(obj); - uint16_t i; - for(i = id; i < obj->parent->spec_attr->child_cnt - 1; i++) { - obj->parent->spec_attr->children[i] = obj->parent->spec_attr->children[i + 1]; - } - obj->parent->spec_attr->child_cnt--; - obj->parent->spec_attr->children = lv_realloc(obj->parent->spec_attr->children, - obj->parent->spec_attr->child_cnt * sizeof(lv_obj_t *)); - } - - /*Free the object itself*/ - lv_free(obj); -} - -static lv_obj_tree_walk_res_t walk_core(lv_obj_t * obj, lv_obj_tree_walk_cb_t cb, void * user_data) -{ - lv_obj_tree_walk_res_t res = LV_OBJ_TREE_WALK_NEXT; - - if(obj == NULL) { - lv_display_t * disp = lv_display_get_next(NULL); - while(disp) { - uint32_t i; - for(i = 0; i < disp->screen_cnt; i++) { - walk_core(disp->screens[i], cb, user_data); - } - disp = lv_display_get_next(disp); - } - return LV_OBJ_TREE_WALK_END; /*The value doesn't matter as it wasn't called recursively*/ - } - - res = cb(obj, user_data); - - if(res == LV_OBJ_TREE_WALK_END) return LV_OBJ_TREE_WALK_END; - - if(res != LV_OBJ_TREE_WALK_SKIP_CHILDREN) { - uint32_t i; - for(i = 0; i < lv_obj_get_child_count(obj); i++) { - res = walk_core(lv_obj_get_child(obj, i), cb, user_data); - if(res == LV_OBJ_TREE_WALK_END) return LV_OBJ_TREE_WALK_END; - } - } - return LV_OBJ_TREE_WALK_NEXT; -} - -static void dump_tree_core(lv_obj_t * obj, int32_t depth) -{ -#if LV_USE_LOG - const char * id; - -#if LV_USE_OBJ_ID - char buf[OBJ_DUMP_STRING_LEN]; - id = lv_obj_stringify_id(obj, buf, sizeof(buf)); - if(id == NULL) id = "obj0"; -#else - id = "obj0"; -#endif - - /*id of `obj0` is an invalid id for builtin id*/ - LV_LOG_USER("parent:%p, obj:%p, id:%s;", (void *)(obj ? obj->parent : NULL), (void *)obj, id); -#endif /*LV_USE_LOG*/ - - if(obj && obj->spec_attr && obj->spec_attr->child_cnt) { - for(uint32_t i = 0; i < obj->spec_attr->child_cnt; i++) { - dump_tree_core(lv_obj_get_child(obj, i), depth + 1); - } - } -} - -static lv_obj_t * lv_obj_get_first_not_deleting_child(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - if(obj->spec_attr == NULL) return NULL; - - int32_t i; - int32_t cnt = (int32_t)obj->spec_attr->child_cnt; - for(i = 0; i < cnt; i++) { - if(!obj->spec_attr->children[i]->is_deleting) { - return obj->spec_attr->children[i]; - } - } - - return NULL; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_tree.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_tree.h deleted file mode 100644 index 9f679dd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_obj_tree.h +++ /dev/null @@ -1,237 +0,0 @@ -/** - * @file lv_obj_tree.h - * - */ - -#ifndef LV_OBJ_TREE_H -#define LV_OBJ_TREE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_types.h" -#include "../misc/lv_anim.h" -#include "../display/lv_display.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - LV_OBJ_TREE_WALK_NEXT, - LV_OBJ_TREE_WALK_SKIP_CHILDREN, - LV_OBJ_TREE_WALK_END, -} lv_obj_tree_walk_res_t; - -typedef lv_obj_tree_walk_res_t (*lv_obj_tree_walk_cb_t)(lv_obj_t *, void *); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Delete an object and all of its children. - * Also remove the objects from their group and remove all animations (if any). - * Send `LV_EVENT_DELETED` to deleted objects. - * @param obj pointer to an object - */ -void lv_obj_delete(lv_obj_t * obj); - -/** - * Delete all children of an object. - * Also remove the objects from their group and remove all animations (if any). - * Send `LV_EVENT_DELETED` to deleted objects. - * @param obj pointer to an object - */ -void lv_obj_clean(lv_obj_t * obj); - -/** - * Delete an object after some delay - * @param obj pointer to an object - * @param delay_ms time to wait before delete in milliseconds - */ -void lv_obj_delete_delayed(lv_obj_t * obj, uint32_t delay_ms); - -/** - * A function to be easily used in animation ready callback to delete an object when the animation is ready - * @param a pointer to the animation - */ -void lv_obj_delete_anim_completed_cb(lv_anim_t * a); - -/** - * Helper function for asynchronously deleting objects. - * Useful for cases where you can't delete an object directly in an `LV_EVENT_DELETE` handler (i.e. parent). - * @param obj object to delete - * @see lv_async_call - */ -void lv_obj_delete_async(lv_obj_t * obj); - -/** - * Move the parent of an object. The relative coordinates will be kept. - * - * @param obj pointer to an object whose parent needs to be changed - * @param parent pointer to the new parent - */ -void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent); - -/** - * Swap the positions of two objects. - * When used in listboxes, it can be used to sort the listbox items. - * @param obj1 pointer to the first object - * @param obj2 pointer to the second object - */ -void lv_obj_swap(lv_obj_t * obj1, lv_obj_t * obj2); - -/** - * moves the object to the given index in its parent. - * When used in listboxes, it can be used to sort the listbox items. - * @param obj pointer to the object to be moved. - * @param index new index in parent. -1 to count from the back - * @note to move to the background: lv_obj_move_to_index(obj, 0) - * @note to move forward (up): lv_obj_move_to_index(obj, lv_obj_get_index(obj) - 1) - */ -void lv_obj_move_to_index(lv_obj_t * obj, int32_t index); - -/** - * Get the screen of an object - * @param obj pointer to an object - * @return pointer to the object's screen - */ -lv_obj_t * lv_obj_get_screen(const lv_obj_t * obj); - -/** - * Get the display of the object - * @param obj pointer to an object - * @return pointer to the object's display - */ -lv_display_t * lv_obj_get_display(const lv_obj_t * obj); - -/** - * Get the parent of an object - * @param obj pointer to an object - * @return the parent of the object. (NULL if `obj` was a screen) - */ -lv_obj_t * lv_obj_get_parent(const lv_obj_t * obj); - -/** - * Get the child of an object by the child's index. - * @param obj pointer to an object whose child should be get - * @param idx the index of the child. - * 0: the oldest (firstly created) child - * 1: the second oldest - * child count-1: the youngest - * -1: the youngest - * -2: the second youngest - * @return pointer to the child or NULL if the index was invalid - */ -lv_obj_t * lv_obj_get_child(const lv_obj_t * obj, int32_t idx); - -/** - * Get the child of an object by the child's index. Consider the children only with a given type. - * @param obj pointer to an object whose child should be get - * @param idx the index of the child. - * 0: the oldest (firstly created) child - * 1: the second oldest - * child count-1: the youngest - * -1: the youngest - * -2: the second youngest - * @param class_p the type of the children to check - * @return pointer to the child or NULL if the index was invalid - */ -lv_obj_t * lv_obj_get_child_by_type(const lv_obj_t * obj, int32_t idx, - const lv_obj_class_t * class_p); - -/** - * Return a sibling of an object - * @param obj pointer to an object whose sibling should be get - * @param idx 0: `obj` itself - * -1: the first older sibling - * -2: the next older sibling - * 1: the first younger sibling - * 2: the next younger sibling - * etc - * @return pointer to the requested sibling or NULL if there is no such sibling - */ -lv_obj_t * lv_obj_get_sibling(const lv_obj_t * obj, int32_t idx); - -/** - * Return a sibling of an object. Consider the siblings only with a given type. - * @param obj pointer to an object whose sibling should be get - * @param idx 0: `obj` itself - * -1: the first older sibling - * -2: the next older sibling - * 1: the first younger sibling - * 2: the next younger sibling - * etc - * @param class_p the type of the children to check - * @return pointer to the requested sibling or NULL if there is no such sibling - */ -lv_obj_t * lv_obj_get_sibling_by_type(const lv_obj_t * obj, int32_t idx, - const lv_obj_class_t * class_p); - -/** - * Get the number of children - * @param obj pointer to an object - * @return the number of children - */ -uint32_t lv_obj_get_child_count(const lv_obj_t * obj); - -/** - * Get the number of children having a given type. - * @param obj pointer to an object - * @param class_p the type of the children to check - * @return the number of children - */ - -uint32_t lv_obj_get_child_count_by_type(const lv_obj_t * obj, const lv_obj_class_t * class_p); - -/** - * Get the index of a child. - * @param obj pointer to an object - * @return the child index of the object. - * E.g. 0: the oldest (firstly created child). - * (-1 if child could not be found or no parent exists) - */ -int32_t lv_obj_get_index(const lv_obj_t * obj); - -/** - * Get the index of a child. Consider the children only with a given type. - * @param obj pointer to an object - * @param class_p the type of the children to check - * @return the child index of the object. - * E.g. 0: the oldest (firstly created child with the given class). - * (-1 if child could not be found or no parent exists) - */ -int32_t lv_obj_get_index_by_type(const lv_obj_t * obj, const lv_obj_class_t * class_p); - -/** - * Iterate through all children of any object. - * @param start_obj start integrating from this object - * @param cb call this callback on the objects - * @param user_data pointer to any user related data (will be passed to `cb`) - */ -void lv_obj_tree_walk(lv_obj_t * start_obj, lv_obj_tree_walk_cb_t cb, void * user_data); - -/** - * Iterate through all children of any object and print their ID. - * @param start_obj start integrating from this object - */ -void lv_obj_dump_tree(lv_obj_t * start_obj); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBJ_TREE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_refr.c b/software/Power_Pico/Middlewares/LVGL/src/core/lv_refr.c deleted file mode 100644 index e91fc00..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_refr.c +++ /dev/null @@ -1,1239 +0,0 @@ -/** - * @file lv_refr.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_refr_private.h" -#include "lv_obj_draw_private.h" -#include "../misc/lv_area_private.h" -#include "../draw/sw/lv_draw_sw_mask_private.h" -#include "../draw/lv_draw_mask_private.h" -#include "lv_obj_private.h" -#include "lv_obj_event_private.h" -#include "../display/lv_display.h" -#include "../display/lv_display_private.h" -#include "../tick/lv_tick.h" -#include "../misc/lv_timer_private.h" -#include "../misc/lv_math.h" -#include "../misc/lv_profiler.h" -#include "../misc/lv_types.h" -#include "../draw/lv_draw_private.h" -#include "../font/lv_font_fmt_txt.h" -#include "../stdlib/lv_string.h" -#include "lv_global.h" - -/********************* - * DEFINES - *********************/ - -/*Display being refreshed*/ -#define disp_refr LV_GLOBAL_DEFAULT()->disp_refresh - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_refr_join_area(void); -static void refr_invalid_areas(void); -static void refr_sync_areas(void); -static void refr_area(const lv_area_t * area_p); -static void refr_area_part(lv_layer_t * layer); -static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj); -static void refr_obj_and_children(lv_layer_t * layer, lv_obj_t * top_obj); -static void refr_obj(lv_layer_t * layer, lv_obj_t * obj); -static uint32_t get_max_row(lv_display_t * disp, int32_t area_w, int32_t area_h); -static void draw_buf_flush(lv_display_t * disp); -static void call_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); -static void wait_for_flushing(lv_display_t * disp); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ -#if LV_USE_LOG && LV_LOG_TRACE_DISP_REFR - #define LV_TRACE_REFR(...) LV_LOG_TRACE(__VA_ARGS__) -#else - #define LV_TRACE_REFR(...) -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the screen refresh subsystem - */ -void lv_refr_init(void) -{ -} - -void lv_refr_deinit(void) -{ -} - -void lv_refr_now(lv_display_t * disp) -{ - lv_anim_refr_now(); - - if(disp) { - if(disp->refr_timer) lv_display_refr_timer(disp->refr_timer); - } - else { - lv_display_t * d; - d = lv_display_get_next(NULL); - while(d) { - if(d->refr_timer) lv_display_refr_timer(d->refr_timer); - d = lv_display_get_next(d); - } - } -} - -void lv_obj_redraw(lv_layer_t * layer, lv_obj_t * obj) -{ - lv_area_t clip_area_ori = layer->_clip_area; - lv_area_t clip_coords_for_obj; - - /*Truncate the clip area to `obj size + ext size` area*/ - lv_area_t obj_coords_ext; - lv_obj_get_coords(obj, &obj_coords_ext); - int32_t ext_draw_size = lv_obj_get_ext_draw_size(obj); - lv_area_increase(&obj_coords_ext, ext_draw_size, ext_draw_size); - - if(!lv_area_intersect(&clip_coords_for_obj, &clip_area_ori, &obj_coords_ext)) return; - /*If the object is visible on the current clip area*/ - layer->_clip_area = clip_coords_for_obj; - - lv_obj_send_event(obj, LV_EVENT_DRAW_MAIN_BEGIN, layer); - lv_obj_send_event(obj, LV_EVENT_DRAW_MAIN, layer); - lv_obj_send_event(obj, LV_EVENT_DRAW_MAIN_END, layer); -#if LV_USE_REFR_DEBUG - lv_color_t debug_color = lv_color_make(lv_rand(0, 0xFF), lv_rand(0, 0xFF), lv_rand(0, 0xFF)); - lv_draw_rect_dsc_t draw_dsc; - lv_draw_rect_dsc_init(&draw_dsc); - draw_dsc.bg_color = debug_color; - draw_dsc.bg_opa = LV_OPA_20; - draw_dsc.border_width = 1; - draw_dsc.border_opa = LV_OPA_30; - draw_dsc.border_color = debug_color; - lv_draw_rect(layer, &draw_dsc, &obj_coords_ext); -#endif - - const lv_area_t * obj_coords; - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { - obj_coords = &obj_coords_ext; - } - else { - obj_coords = &obj->coords; - } - lv_area_t clip_coords_for_children; - bool refr_children = true; - if(!lv_area_intersect(&clip_coords_for_children, &clip_area_ori, obj_coords)) { - refr_children = false; - } - - if(refr_children) { - uint32_t i; - uint32_t child_cnt = lv_obj_get_child_count(obj); - if(child_cnt == 0) { - /*If the object was visible on the clip area call the post draw events too*/ - layer->_clip_area = clip_coords_for_obj; - /*If all the children are redrawn make 'post draw' draw*/ - lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer); - lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer); - lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer); - } - else { - layer->_clip_area = clip_coords_for_children; - bool clip_corner = lv_obj_get_style_clip_corner(obj, LV_PART_MAIN); - - int32_t radius = 0; - if(clip_corner) { - radius = lv_obj_get_style_radius(obj, LV_PART_MAIN); - if(radius == 0) clip_corner = false; - } - - if(clip_corner == false) { - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - refr_obj(layer, child); - } - - /*If the object was visible on the clip area call the post draw events too*/ - layer->_clip_area = clip_coords_for_obj; - /*If all the children are redrawn make 'post draw' draw*/ - lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer); - lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer); - lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer); - } - else { - lv_layer_t * layer_children; - lv_draw_mask_rect_dsc_t mask_draw_dsc; - lv_draw_mask_rect_dsc_init(&mask_draw_dsc); - mask_draw_dsc.radius = radius; - mask_draw_dsc.area = obj->coords; - - lv_draw_image_dsc_t img_draw_dsc; - lv_draw_image_dsc_init(&img_draw_dsc); - - int32_t short_side = LV_MIN(lv_area_get_width(&obj->coords), lv_area_get_height(&obj->coords)); - int32_t rout = LV_MIN(radius, short_side >> 1); - - lv_area_t bottom = obj->coords; - bottom.y1 = bottom.y2 - rout + 1; - if(lv_area_intersect(&bottom, &bottom, &clip_area_ori)) { - layer_children = lv_draw_layer_create(layer, LV_COLOR_FORMAT_ARGB8888, &bottom); - - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - refr_obj(layer_children, child); - } - - /*If all the children are redrawn send 'post draw' draw*/ - lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer_children); - lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer_children); - lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer_children); - - lv_draw_mask_rect(layer_children, &mask_draw_dsc); - - img_draw_dsc.src = layer_children; - lv_draw_layer(layer, &img_draw_dsc, &bottom); - } - - lv_area_t top = obj->coords; - top.y2 = top.y1 + rout - 1; - if(lv_area_intersect(&top, &top, &clip_area_ori)) { - layer_children = lv_draw_layer_create(layer, LV_COLOR_FORMAT_ARGB8888, &top); - - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - refr_obj(layer_children, child); - } - - /*If all the children are redrawn send 'post draw' draw*/ - lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer_children); - lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer_children); - lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer_children); - - lv_draw_mask_rect(layer_children, &mask_draw_dsc); - - img_draw_dsc.src = layer_children; - lv_draw_layer(layer, &img_draw_dsc, &top); - - } - - lv_area_t mid = obj->coords; - mid.y1 += rout; - mid.y2 -= rout; - if(lv_area_intersect(&mid, &mid, &clip_area_ori)) { - layer->_clip_area = mid; - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - refr_obj(layer, child); - } - - /*If all the children are redrawn make 'post draw' draw*/ - lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer); - lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer); - lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer); - - } - - } - } - } - - layer->_clip_area = clip_area_ori; -} - -void lv_inv_area(lv_display_t * disp, const lv_area_t * area_p) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) return; - if(!lv_display_is_invalidation_enabled(disp)) return; - - /** - * There are two reasons for this issue: - * 1.LVGL API is being used across threads, such as modifying widget properties in another thread - * or within an interrupt handler during the main thread rendering process. - * 2.User-customized widget modify widget properties/styles again within the DRAW event. - * - * Therefore, ensure that LVGL is used in a single-threaded manner, or refer to - * documentation: https://docs.lvgl.io/master/porting/os.html for proper locking mechanisms. - * Additionally, ensure that only drawing-related tasks are performed within the DRAW event, - * and move widget property/style modifications to other events. - */ - LV_ASSERT_MSG(!disp->rendering_in_progress, "Invalidate area is not allowed during rendering."); - - /*Clear the invalidate buffer if the parameter is NULL*/ - if(area_p == NULL) { - disp->inv_p = 0; - return; - } - - lv_area_t scr_area; - scr_area.x1 = 0; - scr_area.y1 = 0; - scr_area.x2 = lv_display_get_horizontal_resolution(disp) - 1; - scr_area.y2 = lv_display_get_vertical_resolution(disp) - 1; - - lv_area_t com_area; - bool suc; - - suc = lv_area_intersect(&com_area, area_p, &scr_area); - if(suc == false) return; /*Out of the screen*/ - - if(disp->color_format == LV_COLOR_FORMAT_I1) { - /*Make sure that the X coordinates start and end on byte boundary. - *E.g. convert 11;27 to 8;31*/ - com_area.x1 &= ~0x7; /*Round down: Nx8*/ - com_area.x2 |= 0x7; /*Round up: Nx8 - 1*/ - } - - /*If there were at least 1 invalid area in full refresh mode, redraw the whole screen*/ - if(disp->render_mode == LV_DISPLAY_RENDER_MODE_FULL) { - disp->inv_areas[0] = scr_area; - disp->inv_p = 1; - lv_display_send_event(disp, LV_EVENT_REFR_REQUEST, NULL); - return; - } - - lv_result_t res = lv_display_send_event(disp, LV_EVENT_INVALIDATE_AREA, &com_area); - if(res != LV_RESULT_OK) return; - - /*Save only if this area is not in one of the saved areas*/ - uint16_t i; - for(i = 0; i < disp->inv_p; i++) { - if(lv_area_is_in(&com_area, &disp->inv_areas[i], 0) != false) return; - } - - /*Save the area*/ - lv_area_t * tmp_area_p = &com_area; - if(disp->inv_p >= LV_INV_BUF_SIZE) { /*If no place for the area add the screen*/ - disp->inv_p = 0; - tmp_area_p = &scr_area; - } - lv_area_copy(&disp->inv_areas[disp->inv_p], tmp_area_p); - disp->inv_p++; - - lv_display_send_event(disp, LV_EVENT_REFR_REQUEST, NULL); -} - -/** - * Get the display which is being refreshed - * @return the display being refreshed - */ -lv_display_t * lv_refr_get_disp_refreshing(void) -{ - return disp_refr; -} - -/** - * Get the display which is being refreshed - * @return the display being refreshed - */ -void lv_refr_set_disp_refreshing(lv_display_t * disp) -{ - disp_refr = disp; -} - -void lv_display_refr_timer(lv_timer_t * tmr) -{ - LV_PROFILER_BEGIN; - LV_TRACE_REFR("begin"); - - if(tmr) { - disp_refr = tmr->user_data; - /* Ensure the timer does not run again automatically. - * This is done before refreshing in case refreshing invalidates something else. - * However if the performance monitor is enabled keep the timer running to count the FPS.*/ -#if !LV_USE_PERF_MONITOR - lv_timer_pause(tmr); -#endif - } - else { - disp_refr = lv_display_get_default(); - } - - if(disp_refr == NULL) { - LV_LOG_WARN("No display registered"); - return; - } - - lv_draw_buf_t * buf_act = disp_refr->buf_act; - if(!(buf_act && buf_act->data && buf_act->data_size)) { - LV_LOG_WARN("No draw buffer"); - return; - } - - lv_display_send_event(disp_refr, LV_EVENT_REFR_START, NULL); - - /*Refresh the screen's layout if required*/ - LV_PROFILER_BEGIN_TAG("layout"); - lv_obj_update_layout(disp_refr->act_scr); - if(disp_refr->prev_scr) lv_obj_update_layout(disp_refr->prev_scr); - - lv_obj_update_layout(disp_refr->bottom_layer); - lv_obj_update_layout(disp_refr->top_layer); - lv_obj_update_layout(disp_refr->sys_layer); - LV_PROFILER_END_TAG("layout"); - - /*Do nothing if there is no active screen*/ - if(disp_refr->act_scr == NULL) { - disp_refr->inv_p = 0; - LV_LOG_WARN("there is no active screen"); - goto refr_finish; - } - - lv_refr_join_area(); - refr_sync_areas(); - refr_invalid_areas(); - - if(disp_refr->inv_p == 0) goto refr_finish; - - /*If refresh happened ...*/ - lv_display_send_event(disp_refr, LV_EVENT_RENDER_READY, NULL); - - /*In double buffered direct mode save the updated areas. - *They will be used on the next call to synchronize the buffers.*/ - if(lv_display_is_double_buffered(disp_refr) && disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_DIRECT) { - uint32_t i; - for(i = 0; i < disp_refr->inv_p; i++) { - if(disp_refr->inv_area_joined[i]) - continue; - - lv_area_t * sync_area = lv_ll_ins_tail(&disp_refr->sync_areas); - *sync_area = disp_refr->inv_areas[i]; - } - } - - lv_memzero(disp_refr->inv_areas, sizeof(disp_refr->inv_areas)); - lv_memzero(disp_refr->inv_area_joined, sizeof(disp_refr->inv_area_joined)); - disp_refr->inv_p = 0; - -refr_finish: - -#if LV_DRAW_SW_COMPLEX == 1 - lv_draw_sw_mask_cleanup(); -#endif - - lv_display_send_event(disp_refr, LV_EVENT_REFR_READY, NULL); - - LV_TRACE_REFR("finished"); - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Join the areas which has got common parts - */ -static void lv_refr_join_area(void) -{ - LV_PROFILER_BEGIN; - uint32_t join_from; - uint32_t join_in; - lv_area_t joined_area; - for(join_in = 0; join_in < disp_refr->inv_p; join_in++) { - if(disp_refr->inv_area_joined[join_in] != 0) continue; - - /*Check all areas to join them in 'join_in'*/ - for(join_from = 0; join_from < disp_refr->inv_p; join_from++) { - /*Handle only unjoined areas and ignore itself*/ - if(disp_refr->inv_area_joined[join_from] != 0 || join_in == join_from) { - continue; - } - - /*Check if the areas are on each other*/ - if(lv_area_is_on(&disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]) == false) { - continue; - } - - lv_area_join(&joined_area, &disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]); - - /*Join two area only if the joined area size is smaller*/ - if(lv_area_get_size(&joined_area) < (lv_area_get_size(&disp_refr->inv_areas[join_in]) + - lv_area_get_size(&disp_refr->inv_areas[join_from]))) { - lv_area_copy(&disp_refr->inv_areas[join_in], &joined_area); - - /*Mark 'join_form' is joined into 'join_in'*/ - disp_refr->inv_area_joined[join_from] = 1; - } - } - } - LV_PROFILER_END; -} - -/** - * Refresh the sync areas - */ -static void refr_sync_areas(void) -{ - /*Do not sync if not direct or double buffered*/ - if(disp_refr->render_mode != LV_DISPLAY_RENDER_MODE_DIRECT) return; - - /*Do not sync if not double buffered*/ - if(!lv_display_is_double_buffered(disp_refr)) return; - - /*Do not sync if no sync areas*/ - if(lv_ll_is_empty(&disp_refr->sync_areas)) return; - - LV_PROFILER_BEGIN; - /*With double buffered direct mode synchronize the rendered areas to the other buffer*/ - /*We need to wait for ready here to not mess up the active screen*/ - wait_for_flushing(disp_refr); - - /*The buffers are already swapped. - *So the active buffer is the off screen buffer where LVGL will render*/ - lv_draw_buf_t * off_screen = disp_refr->buf_act; - lv_draw_buf_t * on_screen = disp_refr->buf_act == disp_refr->buf_1 ? disp_refr->buf_2 : disp_refr->buf_1; - - uint32_t hor_res = lv_display_get_horizontal_resolution(disp_refr); - uint32_t ver_res = lv_display_get_vertical_resolution(disp_refr); - - /*Iterate through invalidated areas to see if sync area should be copied*/ - uint16_t i; - int8_t j; - lv_area_t res[4] = {0}; - int8_t res_c; - lv_area_t * sync_area, * new_area, * next_area; - for(i = 0; i < disp_refr->inv_p; i++) { - /*Skip joined areas*/ - if(disp_refr->inv_area_joined[i]) continue; - - /*Iterate over sync areas*/ - sync_area = lv_ll_get_head(&disp_refr->sync_areas); - while(sync_area != NULL) { - /*Get next sync area*/ - next_area = lv_ll_get_next(&disp_refr->sync_areas, sync_area); - - /*Remove intersect of redraw area from sync area and get remaining areas*/ - res_c = lv_area_diff(res, sync_area, &disp_refr->inv_areas[i]); - - /*New sub areas created after removing intersect*/ - if(res_c != -1) { - /*Replace old sync area with new areas*/ - for(j = 0; j < res_c; j++) { - new_area = lv_ll_ins_prev(&disp_refr->sync_areas, sync_area); - *new_area = res[j]; - } - lv_ll_remove(&disp_refr->sync_areas, sync_area); - lv_free(sync_area); - } - - /*Move on to next sync area*/ - sync_area = next_area; - } - } - - lv_area_t disp_area = {0, 0, (int32_t)hor_res - 1, (int32_t)ver_res - 1}; - /*Copy sync areas (if any remaining)*/ - for(sync_area = lv_ll_get_head(&disp_refr->sync_areas); sync_area != NULL; - sync_area = lv_ll_get_next(&disp_refr->sync_areas, sync_area)) { - /** - * @todo Resize SDL window will trigger crash because of sync_area is larger than disp_area - */ - lv_area_intersect(sync_area, sync_area, &disp_area); - lv_draw_buf_copy(off_screen, sync_area, on_screen, sync_area); - } - - /*Clear sync areas*/ - lv_ll_clear(&disp_refr->sync_areas); - LV_PROFILER_END; -} - -/** - * Refresh the joined areas - */ -static void refr_invalid_areas(void) -{ - if(disp_refr->inv_p == 0) return; - LV_PROFILER_BEGIN; - - /*Find the last area which will be drawn*/ - int32_t i; - int32_t last_i = 0; - for(i = disp_refr->inv_p - 1; i >= 0; i--) { - if(disp_refr->inv_area_joined[i] == 0) { - last_i = i; - break; - } - } - - /*Notify the display driven rendering has started*/ - lv_display_send_event(disp_refr, LV_EVENT_RENDER_START, NULL); - - disp_refr->last_area = 0; - disp_refr->last_part = 0; - disp_refr->rendering_in_progress = true; - - for(i = 0; i < (int32_t)disp_refr->inv_p; i++) { - /*Refresh the unjoined areas*/ - if(disp_refr->inv_area_joined[i] == 0) { - - if(i == last_i) disp_refr->last_area = 1; - disp_refr->last_part = 0; - refr_area(&disp_refr->inv_areas[i]); - } - } - - disp_refr->rendering_in_progress = false; - LV_PROFILER_END; -} - -/** - * Reshape the draw buffer if required - * @param layer pointer to a layer which will be drawn - */ -static void layer_reshape_draw_buf(lv_layer_t * layer, uint32_t stride) -{ - lv_draw_buf_t * ret = lv_draw_buf_reshape( - layer->draw_buf, - layer->color_format, - lv_area_get_width(&layer->buf_area), - lv_area_get_height(&layer->buf_area), - stride); - LV_UNUSED(ret); - LV_ASSERT_NULL(ret); -} - -/** - * Refresh an area if there is Virtual Display Buffer - * @param area_p pointer to an area to refresh - */ -static void refr_area(const lv_area_t * area_p) -{ - LV_PROFILER_BEGIN; - lv_layer_t * layer = disp_refr->layer_head; - layer->draw_buf = disp_refr->buf_act; - -#if LV_DRAW_TRANSFORM_USE_MATRIX - lv_matrix_identity(&layer->matrix); -#endif - - /*With full refresh just redraw directly into the buffer*/ - /*In direct mode draw directly on the absolute coordinates of the buffer*/ - if(disp_refr->render_mode != LV_DISPLAY_RENDER_MODE_PARTIAL) { - layer->buf_area.x1 = 0; - layer->buf_area.y1 = 0; - layer->buf_area.x2 = lv_display_get_horizontal_resolution(disp_refr) - 1; - layer->buf_area.y2 = lv_display_get_vertical_resolution(disp_refr) - 1; - lv_area_t disp_area; - lv_area_set(&disp_area, 0, 0, lv_display_get_horizontal_resolution(disp_refr) - 1, - lv_display_get_vertical_resolution(disp_refr) - 1); - - if(disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_FULL) { - disp_refr->last_part = 1; - layer_reshape_draw_buf(layer, layer->draw_buf->header.stride); - layer->_clip_area = disp_area; - layer->phy_clip_area = disp_area; - refr_area_part(layer); - } - else if(disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_DIRECT) { - disp_refr->last_part = disp_refr->last_area; - layer_reshape_draw_buf(layer, layer->draw_buf->header.stride); - layer->_clip_area = *area_p; - layer->phy_clip_area = *area_p; - refr_area_part(layer); - } - LV_PROFILER_END; - return; - } - - /*Normal refresh: draw the area in parts*/ - /*Calculate the max row num*/ - int32_t w = lv_area_get_width(area_p); - int32_t h = lv_area_get_height(area_p); - int32_t y2 = area_p->y2 >= lv_display_get_vertical_resolution(disp_refr) ? - lv_display_get_vertical_resolution(disp_refr) - 1 : area_p->y2; - - int32_t max_row = get_max_row(disp_refr, w, h); - - int32_t row; - int32_t row_last = 0; - lv_area_t sub_area; - for(row = area_p->y1; row + max_row - 1 <= y2; row += max_row) { - /*Calc. the next y coordinates of draw_buf*/ - sub_area.x1 = area_p->x1; - sub_area.x2 = area_p->x2; - sub_area.y1 = row; - sub_area.y2 = row + max_row - 1; - layer->draw_buf = disp_refr->buf_act; - layer->buf_area = sub_area; - layer->_clip_area = sub_area; - layer->phy_clip_area = sub_area; - layer_reshape_draw_buf(layer, LV_STRIDE_AUTO); - if(sub_area.y2 > y2) sub_area.y2 = y2; - row_last = sub_area.y2; - if(y2 == row_last) disp_refr->last_part = 1; - refr_area_part(layer); - } - - /*If the last y coordinates are not handled yet ...*/ - if(y2 != row_last) { - /*Calc. the next y coordinates of draw_buf*/ - sub_area.x1 = area_p->x1; - sub_area.x2 = area_p->x2; - sub_area.y1 = row; - sub_area.y2 = y2; - layer->draw_buf = disp_refr->buf_act; - layer->buf_area = sub_area; - layer->_clip_area = sub_area; - layer->phy_clip_area = sub_area; - layer_reshape_draw_buf(layer, LV_STRIDE_AUTO); - disp_refr->last_part = 1; - refr_area_part(layer); - } - LV_PROFILER_END; -} - -static void refr_area_part(lv_layer_t * layer) -{ - LV_PROFILER_BEGIN; - disp_refr->refreshed_area = layer->_clip_area; - - /* In single buffered mode wait here until the buffer is freed. - * Else we would draw into the buffer while it's still being transferred to the display*/ - if(!lv_display_is_double_buffered(disp_refr)) { - wait_for_flushing(disp_refr); - } - /*If the screen is transparent initialize it when the flushing is ready*/ - if(lv_color_format_has_alpha(disp_refr->color_format)) { - lv_area_t a = disp_refr->refreshed_area; - if(disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_PARTIAL) { - /*The area always starts at 0;0*/ - lv_area_move(&a, -disp_refr->refreshed_area.x1, -disp_refr->refreshed_area.y1); - } - - lv_draw_buf_clear(layer->draw_buf, &a); - } - - lv_obj_t * top_act_scr = NULL; - lv_obj_t * top_prev_scr = NULL; - - /*Get the most top object which is not covered by others*/ - top_act_scr = lv_refr_get_top_obj(&layer->_clip_area, lv_display_get_screen_active(disp_refr)); - if(disp_refr->prev_scr) { - top_prev_scr = lv_refr_get_top_obj(&layer->_clip_area, disp_refr->prev_scr); - } - - /*Draw a bottom layer background if there is no top object*/ - if(top_act_scr == NULL && top_prev_scr == NULL) { - refr_obj_and_children(layer, lv_display_get_layer_bottom(disp_refr)); - } - - if(disp_refr->draw_prev_over_act) { - if(top_act_scr == NULL) top_act_scr = disp_refr->act_scr; - refr_obj_and_children(layer, top_act_scr); - - /*Refresh the previous screen if any*/ - if(disp_refr->prev_scr) { - if(top_prev_scr == NULL) top_prev_scr = disp_refr->prev_scr; - refr_obj_and_children(layer, top_prev_scr); - } - } - else { - /*Refresh the previous screen if any*/ - if(disp_refr->prev_scr) { - if(top_prev_scr == NULL) top_prev_scr = disp_refr->prev_scr; - refr_obj_and_children(layer, top_prev_scr); - } - - if(top_act_scr == NULL) top_act_scr = disp_refr->act_scr; - refr_obj_and_children(layer, top_act_scr); - } - - /*Also refresh top and sys layer unconditionally*/ - refr_obj_and_children(layer, lv_display_get_layer_top(disp_refr)); - refr_obj_and_children(layer, lv_display_get_layer_sys(disp_refr)); - - draw_buf_flush(disp_refr); - LV_PROFILER_END; -} - -/** - * Search the most top object which fully covers an area - * @param area_p pointer to an area - * @param obj the first object to start the searching (typically a screen) - * @return - */ -static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj) -{ - lv_obj_t * found_p = NULL; - - if(lv_area_is_in(area_p, &obj->coords, 0) == false) return NULL; - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return NULL; - if(lv_obj_get_layer_type(obj) != LV_LAYER_TYPE_NONE) return NULL; - - /*If this object is fully cover the draw area then check the children too*/ - lv_cover_check_info_t info; - info.res = LV_COVER_RES_COVER; - info.area = area_p; - lv_obj_send_event(obj, LV_EVENT_COVER_CHECK, &info); - if(info.res == LV_COVER_RES_MASKED) return NULL; - - int32_t i; - int32_t child_cnt = lv_obj_get_child_count(obj); - for(i = child_cnt - 1; i >= 0; i--) { - lv_obj_t * child = obj->spec_attr->children[i]; - found_p = lv_refr_get_top_obj(area_p, child); - - /*If a children is ok then break*/ - if(found_p != NULL) { - break; - } - } - - /*If no better children use this object*/ - if(found_p == NULL && info.res == LV_COVER_RES_COVER) { - found_p = obj; - } - - return found_p; -} - -/** - * Make the refreshing from an object. Draw all its children and the youngers too. - * @param top_p pointer to an objects. Start the drawing from it. - * @param mask_p pointer to an area, the objects will be drawn only here - */ -static void refr_obj_and_children(lv_layer_t * layer, lv_obj_t * top_obj) -{ - /*Normally always will be a top_obj (at least the screen) - *but in special cases (e.g. if the screen has alpha) it won't. - *In this case use the screen directly*/ - if(top_obj == NULL) top_obj = lv_display_get_screen_active(disp_refr); - if(top_obj == NULL) return; /*Shouldn't happen*/ - - LV_PROFILER_BEGIN; - /*Refresh the top object and its children*/ - refr_obj(layer, top_obj); - - /*Draw the 'younger' sibling objects because they can be on top_obj*/ - lv_obj_t * parent; - lv_obj_t * border_p = top_obj; - - parent = lv_obj_get_parent(top_obj); - - /*Do until not reach the screen*/ - while(parent != NULL) { - bool go = false; - uint32_t i; - uint32_t child_cnt = lv_obj_get_child_count(parent); - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = parent->spec_attr->children[i]; - if(!go) { - if(child == border_p) go = true; - } - else { - /*Refresh the objects*/ - refr_obj(layer, child); - } - } - - /*Call the post draw function of the parents of the to object*/ - lv_obj_send_event(parent, LV_EVENT_DRAW_POST_BEGIN, (void *)layer); - lv_obj_send_event(parent, LV_EVENT_DRAW_POST, (void *)layer); - lv_obj_send_event(parent, LV_EVENT_DRAW_POST_END, (void *)layer); - - /*The new border will be the last parents, - *so the 'younger' brothers of parent will be refreshed*/ - border_p = parent; - /*Go a level deeper*/ - parent = lv_obj_get_parent(parent); - } - LV_PROFILER_END; -} - -static lv_result_t layer_get_area(lv_layer_t * layer, lv_obj_t * obj, lv_layer_type_t layer_type, - lv_area_t * layer_area_out, lv_area_t * obj_draw_size_out) -{ - int32_t ext_draw_size = lv_obj_get_ext_draw_size(obj); - lv_obj_get_coords(obj, obj_draw_size_out); - lv_area_increase(obj_draw_size_out, ext_draw_size, ext_draw_size); - - if(layer_type == LV_LAYER_TYPE_TRANSFORM) { - /*Get the transformed area and clip it to the current clip area. - *This area needs to be updated on the screen.*/ - lv_area_t clip_coords_for_obj; - lv_area_t tranf_coords = *obj_draw_size_out; - lv_obj_get_transformed_area(obj, &tranf_coords, LV_OBJ_POINT_TRANSFORM_FLAG_NONE); - if(!lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, &tranf_coords)) { - return LV_RESULT_INVALID; - } - - /*Transform back (inverse) the transformed area. - *It will tell which area of the non-transformed widget needs to be redrawn - *in order to cover transformed area after transformation.*/ - lv_area_t inverse_clip_coords_for_obj = clip_coords_for_obj; - lv_obj_get_transformed_area(obj, &inverse_clip_coords_for_obj, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE); - if(!lv_area_intersect(&inverse_clip_coords_for_obj, &inverse_clip_coords_for_obj, obj_draw_size_out)) { - return LV_RESULT_INVALID; - } - - *layer_area_out = inverse_clip_coords_for_obj; - lv_area_increase(layer_area_out, 5, 5); /*To avoid rounding error*/ - } - else if(layer_type == LV_LAYER_TYPE_SIMPLE) { - lv_area_t clip_coords_for_obj; - if(!lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, obj_draw_size_out)) { - return LV_RESULT_INVALID; - } - *layer_area_out = clip_coords_for_obj; - } - else { - LV_LOG_WARN("Unhandled layer type"); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; -} - -static bool alpha_test_area_on_obj(lv_obj_t * obj, const lv_area_t * area) -{ - /*Test for alpha by assuming there is no alpha. If it fails, fall back to rendering with alpha*/ - /*If the layer area is not fully on the object, it can't fully cover it*/ - if(!lv_area_is_on(area, &obj->coords)) return true; - - lv_cover_check_info_t info; - info.res = LV_COVER_RES_COVER; - info.area = area; - lv_obj_send_event(obj, LV_EVENT_COVER_CHECK, &info); - if(info.res == LV_COVER_RES_COVER) return false; - else return true; -} - -#if LV_DRAW_TRANSFORM_USE_MATRIX - -static void refr_obj_matrix(lv_layer_t * layer, lv_obj_t * obj) -{ - lv_matrix_t ori_matrix = layer->matrix; - lv_matrix_t obj_matrix; - lv_matrix_identity(&obj_matrix); - - lv_point_t pivot = { - .x = lv_obj_get_style_transform_pivot_x(obj, 0), - .y = lv_obj_get_style_transform_pivot_y(obj, 0) - }; - - pivot.x = obj->coords.x1 + lv_pct_to_px(pivot.x, lv_area_get_width(&obj->coords)); - pivot.y = obj->coords.y1 + lv_pct_to_px(pivot.y, lv_area_get_height(&obj->coords)); - - int32_t rotation = lv_obj_get_style_transform_rotation(obj, 0); - int32_t scale_x = lv_obj_get_style_transform_scale_x(obj, 0); - int32_t scale_y = lv_obj_get_style_transform_scale_y(obj, 0); - int32_t skew_x = lv_obj_get_style_transform_skew_x(obj, 0); - int32_t skew_y = lv_obj_get_style_transform_skew_y(obj, 0); - - if(scale_x <= 0 || scale_y <= 0) { - /* NOT draw if scale is negative or zero */ - return; - } - - /* generate the obj matrix */ - lv_matrix_translate(&obj_matrix, pivot.x, pivot.y); - if(rotation != 0) { - lv_matrix_rotate(&obj_matrix, rotation * 0.1f); - } - - if(scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { - lv_matrix_scale( - &obj_matrix, - (float)scale_x / LV_SCALE_NONE, - (float)scale_y / LV_SCALE_NONE - ); - } - - if(skew_x != 0 || skew_y != 0) { - lv_matrix_skew(&obj_matrix, skew_x, skew_y); - } - - lv_matrix_translate(&obj_matrix, -pivot.x, -pivot.y); - - /* apply the obj matrix */ - lv_matrix_multiply(&layer->matrix, &obj_matrix); - - /* calculate clip area without transform */ - lv_matrix_t matrix_reverse; - lv_matrix_inverse(&matrix_reverse, &obj_matrix); - - lv_area_t clip_area = layer->_clip_area; - lv_area_t clip_area_ori = layer->_clip_area; - clip_area = lv_matrix_transform_area(&matrix_reverse, &clip_area); - - /* increase the clip area by 1 pixel to avoid rounding errors */ - if(!lv_matrix_is_identity_or_translation(&obj_matrix)) { - lv_area_increase(&clip_area, 1, 1); - } - - layer->_clip_area = clip_area; - - /* redraw obj */ - lv_obj_redraw(layer, obj); - - /* restore original matrix */ - layer->matrix = ori_matrix; - /* restore clip area */ - layer->_clip_area = clip_area_ori; -} - -static bool refr_check_obj_clip_overflow(lv_layer_t * layer, lv_obj_t * obj) -{ - if(lv_obj_get_style_transform_rotation(obj, 0) == 0) { - return false; - } - - /*Truncate the area to the object*/ - lv_area_t obj_coords; - int32_t ext_size = lv_obj_get_ext_draw_size(obj); - lv_area_copy(&obj_coords, &obj->coords); - lv_area_increase(&obj_coords, ext_size, ext_size); - - lv_obj_get_transformed_area(obj, &obj_coords, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE); - - lv_area_t clip_coords_for_obj; - if(!lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, &obj_coords)) { - return false; - } - - bool has_clip = lv_memcmp(&clip_coords_for_obj, &obj_coords, sizeof(lv_area_t)) != 0; - return has_clip; -} - -#endif /* LV_DRAW_TRANSFORM_USE_MATRIX */ - -static void refr_obj(lv_layer_t * layer, lv_obj_t * obj) -{ - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return; - - lv_opa_t opa = lv_obj_get_style_opa_layered(obj, 0); - if(opa < LV_OPA_MIN) return; - -#if LV_DRAW_TRANSFORM_USE_MATRIX - /*If the layer opa is full then use the matrix transform*/ - if(opa >= LV_OPA_MAX && !refr_check_obj_clip_overflow(layer, obj)) { - refr_obj_matrix(layer, obj); - return; - } -#endif /* LV_DRAW_TRANSFORM_USE_MATRIX */ - - lv_layer_type_t layer_type = lv_obj_get_layer_type(obj); - if(layer_type == LV_LAYER_TYPE_NONE) { - lv_obj_redraw(layer, obj); - } - else { - lv_area_t layer_area_full; - lv_area_t obj_draw_size; - lv_result_t res = layer_get_area(layer, obj, layer_type, &layer_area_full, &obj_draw_size); - if(res != LV_RESULT_OK) return; - - /*Simple layers can be subdivided into smaller layers*/ - uint32_t max_rgb_row_height = lv_area_get_height(&layer_area_full); - uint32_t max_argb_row_height = lv_area_get_height(&layer_area_full); - if(layer_type == LV_LAYER_TYPE_SIMPLE) { - int32_t w = lv_area_get_width(&layer_area_full); - uint8_t px_size = lv_color_format_get_size(disp_refr->color_format); - max_rgb_row_height = LV_DRAW_LAYER_SIMPLE_BUF_SIZE / w / px_size; - max_argb_row_height = LV_DRAW_LAYER_SIMPLE_BUF_SIZE / w / sizeof(lv_color32_t); - } - - lv_area_t layer_area_act; - layer_area_act.x1 = layer_area_full.x1; - layer_area_act.x2 = layer_area_full.x2; - layer_area_act.y1 = layer_area_full.y1; - layer_area_act.y2 = layer_area_full.y1; - - while(layer_area_act.y2 < layer_area_full.y2) { - /* Test with an RGB layer size (which is larger than the ARGB layer size) - * If it really doesn't need alpha use it. Else switch to the ARGB size*/ - layer_area_act.y2 = layer_area_act.y1 + max_rgb_row_height - 1; - if(layer_area_act.y2 > layer_area_full.y2) layer_area_act.y2 = layer_area_full.y2; - bool area_need_alpha = alpha_test_area_on_obj(obj, &layer_area_act); - if(area_need_alpha) { - layer_area_act.y2 = layer_area_act.y1 + max_argb_row_height - 1; - if(layer_area_act.y2 > layer_area_full.y2) layer_area_act.y2 = layer_area_full.y2; - } - - lv_layer_t * new_layer = lv_draw_layer_create(layer, - area_need_alpha ? LV_COLOR_FORMAT_ARGB8888 : LV_COLOR_FORMAT_NATIVE, &layer_area_act); - lv_obj_redraw(new_layer, obj); - - lv_point_t pivot = { - .x = lv_obj_get_style_transform_pivot_x(obj, 0), - .y = lv_obj_get_style_transform_pivot_y(obj, 0) - }; - - if(LV_COORD_IS_PCT(pivot.x)) { - pivot.x = (LV_COORD_GET_PCT(pivot.x) * lv_area_get_width(&obj->coords)) / 100; - } - if(LV_COORD_IS_PCT(pivot.y)) { - pivot.y = (LV_COORD_GET_PCT(pivot.y) * lv_area_get_height(&obj->coords)) / 100; - } - - lv_draw_image_dsc_t layer_draw_dsc; - lv_draw_image_dsc_init(&layer_draw_dsc); - layer_draw_dsc.pivot.x = obj->coords.x1 + pivot.x - new_layer->buf_area.x1; - layer_draw_dsc.pivot.y = obj->coords.y1 + pivot.y - new_layer->buf_area.y1; - - layer_draw_dsc.opa = opa; - layer_draw_dsc.rotation = lv_obj_get_style_transform_rotation(obj, 0); - while(layer_draw_dsc.rotation > 3600) layer_draw_dsc.rotation -= 3600; - while(layer_draw_dsc.rotation < 0) layer_draw_dsc.rotation += 3600; - layer_draw_dsc.scale_x = lv_obj_get_style_transform_scale_x(obj, 0); - layer_draw_dsc.scale_y = lv_obj_get_style_transform_scale_y(obj, 0); - layer_draw_dsc.skew_x = lv_obj_get_style_transform_skew_x(obj, 0); - layer_draw_dsc.skew_y = lv_obj_get_style_transform_skew_y(obj, 0); - layer_draw_dsc.blend_mode = lv_obj_get_style_blend_mode(obj, 0); - layer_draw_dsc.antialias = disp_refr->antialiasing; - layer_draw_dsc.bitmap_mask_src = lv_obj_get_style_bitmap_mask_src(obj, 0); - layer_draw_dsc.image_area = obj_draw_size; - layer_draw_dsc.src = new_layer; - - lv_draw_layer(layer, &layer_draw_dsc, &layer_area_act); - - layer_area_act.y1 = layer_area_act.y2 + 1; - } - } -} - -static uint32_t get_max_row(lv_display_t * disp, int32_t area_w, int32_t area_h) -{ - lv_color_format_t cf = disp->color_format; - uint32_t stride = lv_draw_buf_width_to_stride(area_w, cf); - uint32_t overhead = LV_COLOR_INDEXED_PALETTE_SIZE(cf) * sizeof(lv_color32_t); - - int32_t max_row = (uint32_t)(disp->buf_act->data_size - overhead) / stride; - - if(max_row > area_h) max_row = area_h; - - /*Round down the lines of draw_buf if rounding is added*/ - lv_area_t tmp; - tmp.x1 = 0; - tmp.x2 = 0; - tmp.y1 = 0; - - int32_t h_tmp = max_row; - do { - tmp.y2 = h_tmp - 1; - lv_display_send_event(disp_refr, LV_EVENT_INVALIDATE_AREA, &tmp); - - /*If this height fits into `max_row` then fine*/ - if(lv_area_get_height(&tmp) <= max_row) break; - - /*Decrement the height of the area until it fits into `max_row` after rounding*/ - h_tmp--; - } while(h_tmp > 0); - - if(h_tmp <= 0) { - LV_LOG_WARN("Can't set draw_buf height using the round function. (Wrong round_cb or too " - "small draw_buf)"); - return 0; - } - else { - max_row = tmp.y2 + 1; - } - - return max_row; -} - -/** - * Flush the content of the draw buffer - */ -static void draw_buf_flush(lv_display_t * disp) -{ - /*Flush the rendered content to the display*/ - lv_layer_t * layer = disp->layer_head; - - while(layer->draw_task_head) { - lv_draw_dispatch_wait_for_request(); - lv_draw_dispatch(); - } - - /* In double buffered mode wait until the other buffer is freed - * and driver is ready to receive the new buffer. - * If we need to wait here it means that the content of one buffer is being sent to display - * and other buffer already contains the new rendered image. */ - if(lv_display_is_double_buffered(disp)) { - wait_for_flushing(disp_refr); - } - - disp->flushing = 1; - - if(disp->last_area && disp->last_part) disp->flushing_last = 1; - else disp->flushing_last = 0; - - bool flushing_last = disp->flushing_last; - - if(disp->flush_cb) { - call_flush_cb(disp, &disp->refreshed_area, layer->draw_buf->data); - } - /*If there are 2 buffers swap them. With direct mode swap only on the last area*/ - if(lv_display_is_double_buffered(disp) && (disp->render_mode != LV_DISPLAY_RENDER_MODE_DIRECT || flushing_last)) { - if(disp->buf_act == disp->buf_1) { - disp->buf_act = disp->buf_2; - } - else { - disp->buf_act = disp->buf_1; - } - } -} - -static void call_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) -{ - LV_PROFILER_BEGIN; - LV_TRACE_REFR("Calling flush_cb on (%d;%d)(%d;%d) area with %p image pointer", - (int)area->x1, (int)area->y1, (int)area->x2, (int)area->y2, (void *)px_map); - - lv_area_t offset_area = { - .x1 = area->x1 + disp->offset_x, - .y1 = area->y1 + disp->offset_y, - .x2 = area->x2 + disp->offset_x, - .y2 = area->y2 + disp->offset_y - }; - - lv_display_send_event(disp, LV_EVENT_FLUSH_START, &offset_area); - - /*For backward compatibility support LV_COLOR_16_SWAP (from v8)*/ -#if defined(LV_COLOR_16_SWAP) && LV_COLOR_16_SWAP - lv_draw_sw_rgb565_swap(px_map, lv_area_get_size(&offset_area)); -#endif - - disp->flush_cb(disp, &offset_area, px_map); - lv_display_send_event(disp, LV_EVENT_FLUSH_FINISH, &offset_area); - - LV_PROFILER_END; -} - -static void wait_for_flushing(lv_display_t * disp) -{ - LV_PROFILER_BEGIN; - LV_LOG_TRACE("begin"); - - lv_display_send_event(disp, LV_EVENT_FLUSH_WAIT_START, NULL); - - if(disp->flush_wait_cb) { - if(disp->flushing) { - disp->flush_wait_cb(disp); - } - disp->flushing = 0; - } - else { - while(disp->flushing); - } - disp->flushing_last = 0; - - lv_display_send_event(disp, LV_EVENT_FLUSH_WAIT_FINISH, NULL); - - LV_LOG_TRACE("end"); - LV_PROFILER_END; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_refr.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_refr.h deleted file mode 100644 index 6b756ed..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_refr.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @file lv_refr.h - * - */ - -#ifndef LV_REFR_H -#define LV_REFR_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_obj.h" -#include "../display/lv_display.h" -#include "../misc/lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Redraw the invalidated areas now. - * Normally the redrawing is periodically executed in `lv_timer_handler` but a long blocking process - * can prevent the call of `lv_timer_handler`. In this case if the GUI is updated in the process - * (e.g. progress bar) this function can be called when the screen should be updated. - * @param disp pointer to display to refresh. NULL to refresh all displays. - */ -void lv_refr_now(lv_display_t * disp); - -/** - * Redrawn on object and all its children using the passed draw context - * @param layer pointer to a layer where to draw. - * @param obj the start object from the redraw should start - */ -void lv_obj_redraw(lv_layer_t * layer, lv_obj_t * obj); - -/********************** - * STATIC FUNCTIONS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_REFR_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/core/lv_refr_private.h b/software/Power_Pico/Middlewares/LVGL/src/core/lv_refr_private.h deleted file mode 100644 index 8f84078..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/core/lv_refr_private.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @file lv_refr_private.h - * - */ - -#ifndef LV_REFR_PRIVATE_H -#define LV_REFR_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_refr.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the screen refresh subsystem - */ -void lv_refr_init(void); - -/** - * Deinitialize the screen refresh subsystem - */ -void lv_refr_deinit(void); - -/** - * Invalidate an area on display to redraw it - * @param area_p pointer to area which should be invalidated (NULL: delete the invalidated areas) - * @param disp pointer to display where the area should be invalidated (NULL can be used if there is - * only one display) - */ -void lv_inv_area(lv_display_t * disp, const lv_area_t * area_p); - -/** - * Get the display which is being refreshed - * @return the display being refreshed - */ -lv_display_t * lv_refr_get_disp_refreshing(void); - -/** - * Set the display which is being refreshed - * @param disp the display being refreshed - */ -void lv_refr_set_disp_refreshing(lv_display_t * disp); - -/** - * Called periodically to handle the refreshing - * @param timer pointer to the timer itself - */ -void lv_display_refr_timer(lv_timer_t * timer); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_REFR_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/display/lv_display.c b/software/Power_Pico/Middlewares/LVGL/src/display/lv_display.c deleted file mode 100644 index df4bb9b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/display/lv_display.c +++ /dev/null @@ -1,1134 +0,0 @@ -/** - * @file lv_disp.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../display/lv_display_private.h" -#include "../misc/lv_event_private.h" -#include "../misc/lv_anim_private.h" -#include "../draw/lv_draw_private.h" -#include "../core/lv_obj_private.h" -#include "lv_display.h" -#include "../misc/lv_math.h" -#include "../core/lv_refr_private.h" -#include "../stdlib/lv_string.h" -#include "../themes/lv_theme.h" -#include "../core/lv_global.h" -#include "../others/sysmon/lv_sysmon.h" - -#if LV_USE_DRAW_SW - #include "../draw/sw/lv_draw_sw.h" -#endif - -/********************* - * DEFINES - *********************/ -#define disp_def LV_GLOBAL_DEFAULT()->disp_default -#define disp_ll_p &(LV_GLOBAL_DEFAULT()->disp_ll) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_obj_tree_walk_res_t invalidate_layout_cb(lv_obj_t * obj, void * user_data); -static void update_resolution(lv_display_t * disp); -static void scr_load_internal(lv_obj_t * scr); -static void scr_load_anim_start(lv_anim_t * a); -static void opa_scale_anim(void * obj, int32_t v); -static void set_x_anim(void * obj, int32_t v); -static void set_y_anim(void * obj, int32_t v); -static void scr_anim_completed(lv_anim_t * a); -static bool is_out_anim(lv_screen_load_anim_t a); -static void disp_event_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_display_create(int32_t hor_res, int32_t ver_res) -{ - lv_display_t * disp = lv_ll_ins_head(disp_ll_p); - LV_ASSERT_MALLOC(disp); - if(!disp) return NULL; - - lv_memzero(disp, sizeof(lv_display_t)); - - disp->hor_res = hor_res; - disp->ver_res = ver_res; - disp->physical_hor_res = -1; - disp->physical_ver_res = -1; - disp->offset_x = 0; - disp->offset_y = 0; - disp->antialiasing = LV_COLOR_DEPTH > 8 ? 1 : 0; - disp->dpi = LV_DPI_DEF; - disp->color_format = LV_COLOR_FORMAT_NATIVE; - - disp->layer_head = lv_malloc_zeroed(sizeof(lv_layer_t)); - LV_ASSERT_MALLOC(disp->layer_head); - if(disp->layer_head == NULL) return NULL; - - if(disp->layer_init) disp->layer_init(disp, disp->layer_head); - disp->layer_head->buf_area.x1 = 0; - disp->layer_head->buf_area.y1 = 0; - disp->layer_head->buf_area.x2 = hor_res - 1; - disp->layer_head->buf_area.y2 = ver_res - 1; - disp->layer_head->color_format = disp->color_format; - - disp->inv_en_cnt = 1; - disp->last_activity_time = lv_tick_get(); - - lv_ll_init(&disp->sync_areas, sizeof(lv_area_t)); - - lv_display_t * disp_def_tmp = disp_def; - disp_def = disp; /*Temporarily change the default screen to create the default screens on the - new display*/ - /*Create a refresh timer*/ - disp->refr_timer = lv_timer_create(lv_display_refr_timer, LV_DEF_REFR_PERIOD, disp); - LV_ASSERT_MALLOC(disp->refr_timer); - if(disp->refr_timer == NULL) { - lv_free(disp); - return NULL; - } - -#if LV_USE_THEME_DEFAULT - if(lv_theme_default_is_inited() == false) { - disp->theme = lv_theme_default_init(disp, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), - LV_THEME_DEFAULT_DARK, LV_FONT_DEFAULT); - } - else { - disp->theme = lv_theme_default_get(); - } -#elif LV_USE_THEME_SIMPLE - if(lv_theme_simple_is_inited() == false) { - disp->theme = lv_theme_simple_init(disp); - } - else { - disp->theme = lv_theme_simple_get(); - } -#endif - - disp->bottom_layer = lv_obj_create(NULL); /*Create bottom layer on the display*/ - disp->act_scr = lv_obj_create(NULL); /*Create a default screen on the display*/ - disp->top_layer = lv_obj_create(NULL); /*Create top layer on the display*/ - disp->sys_layer = lv_obj_create(NULL); /*Create sys layer on the display*/ - lv_obj_remove_style_all(disp->bottom_layer); - lv_obj_remove_style_all(disp->top_layer); - lv_obj_remove_style_all(disp->sys_layer); - lv_obj_remove_flag(disp->top_layer, LV_OBJ_FLAG_CLICKABLE); - lv_obj_remove_flag(disp->sys_layer, LV_OBJ_FLAG_CLICKABLE); - - lv_obj_set_scrollbar_mode(disp->bottom_layer, LV_SCROLLBAR_MODE_OFF); - lv_obj_set_scrollbar_mode(disp->top_layer, LV_SCROLLBAR_MODE_OFF); - lv_obj_set_scrollbar_mode(disp->sys_layer, LV_SCROLLBAR_MODE_OFF); - - lv_obj_invalidate(disp->act_scr); - - disp_def = disp_def_tmp; /*Revert the default display*/ - if(disp_def == NULL) disp_def = disp; /*Initialize the default display*/ - - lv_display_add_event_cb(disp, disp_event_cb, LV_EVENT_REFR_REQUEST, NULL); - - lv_timer_ready(disp->refr_timer); /*Be sure the screen will be refreshed immediately on start up*/ - -#if LV_USE_PERF_MONITOR - lv_sysmon_show_performance(disp); -#endif - -#if LV_USE_MEM_MONITOR - lv_sysmon_show_memory(disp); -#endif - - return disp; -} - -void lv_display_delete(lv_display_t * disp) -{ - bool was_default = false; - bool was_refr = false; - if(disp == lv_display_get_default()) was_default = true; - if(disp == lv_refr_get_disp_refreshing()) was_refr = true; - - lv_display_send_event(disp, LV_EVENT_DELETE, NULL); - lv_event_remove_all(&(disp->event_list)); - - /*Detach the input devices*/ - lv_indev_t * indev; - indev = lv_indev_get_next(NULL); - while(indev) { - if(lv_indev_get_display(indev) == disp) { - lv_indev_set_display(indev, NULL); - } - indev = lv_indev_get_next(indev); - } - - /* Delete screen and other obj */ - if(disp->sys_layer) { - lv_obj_delete(disp->sys_layer); - disp->sys_layer = NULL; - } - if(disp->top_layer) { - lv_obj_delete(disp->top_layer); - disp->top_layer = NULL; - } - - if(disp->bottom_layer) { - lv_obj_delete(disp->bottom_layer); - disp->bottom_layer = NULL; - } - - disp->act_scr = NULL; - - while(disp->screen_cnt != 0) { - /*Delete the screens*/ - lv_obj_delete(disp->screens[0]); - } - - lv_ll_clear(&disp->sync_areas); - lv_ll_remove(disp_ll_p, disp); - if(disp->refr_timer) lv_timer_delete(disp->refr_timer); - - if(disp->layer_deinit) disp->layer_deinit(disp, disp->layer_head); - lv_free(disp->layer_head); - - lv_free(disp); - - if(was_default) lv_display_set_default(lv_ll_get_head(disp_ll_p)); - - if(was_refr) lv_refr_set_disp_refreshing(NULL); -} - -void lv_display_set_default(lv_display_t * disp) -{ - disp_def = disp; -} - -lv_display_t * lv_display_get_default(void) -{ - return disp_def; -} - -lv_display_t * lv_display_get_next(lv_display_t * disp) -{ - if(disp == NULL) - return lv_ll_get_head(disp_ll_p); - else - return lv_ll_get_next(disp_ll_p, disp); -} - -/*--------------------- - * RESOLUTION - *--------------------*/ - -void lv_display_set_resolution(lv_display_t * disp, int32_t hor_res, int32_t ver_res) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return; - - if(disp->hor_res == hor_res && disp->ver_res == ver_res) return; - - disp->hor_res = hor_res; - disp->ver_res = ver_res; - - update_resolution(disp); -} - -void lv_display_set_physical_resolution(lv_display_t * disp, int32_t hor_res, int32_t ver_res) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return; - - disp->physical_hor_res = hor_res; - disp->physical_ver_res = ver_res; - - lv_obj_invalidate(disp->sys_layer); - -} - -void lv_display_set_offset(lv_display_t * disp, int32_t x, int32_t y) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return; - - disp->offset_x = x; - disp->offset_y = y; - - lv_obj_invalidate(disp->sys_layer); - -} - -void lv_display_set_dpi(lv_display_t * disp, int32_t dpi) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return; - - disp->dpi = dpi; -} - -int32_t lv_display_get_horizontal_resolution(const lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - - if(disp == NULL) { - return 0; - } - else { - switch(disp->rotation) { - case LV_DISPLAY_ROTATION_90: - case LV_DISPLAY_ROTATION_270: - return disp->ver_res; - default: - return disp->hor_res; - } - } -} - -int32_t lv_display_get_vertical_resolution(const lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - - if(disp == NULL) { - return 0; - } - else { - switch(disp->rotation) { - case LV_DISPLAY_ROTATION_90: - case LV_DISPLAY_ROTATION_270: - return disp->hor_res; - default: - return disp->ver_res; - } - } -} - -int32_t lv_display_get_physical_horizontal_resolution(const lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - - if(disp == NULL) { - return 0; - } - else { - switch(disp->rotation) { - case LV_DISPLAY_ROTATION_90: - case LV_DISPLAY_ROTATION_270: - return disp->physical_ver_res > 0 ? disp->physical_ver_res : disp->ver_res; - default: - return disp->physical_hor_res > 0 ? disp->physical_hor_res : disp->hor_res; - } - } -} - -int32_t lv_display_get_physical_vertical_resolution(const lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - - if(disp == NULL) { - return 0; - } - else { - switch(disp->rotation) { - case LV_DISPLAY_ROTATION_90: - case LV_DISPLAY_ROTATION_270: - return disp->physical_hor_res > 0 ? disp->physical_hor_res : disp->hor_res; - default: - return disp->physical_ver_res > 0 ? disp->physical_ver_res : disp->ver_res; - } - } -} - -int32_t lv_display_get_offset_x(const lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - - if(disp == NULL) { - return 0; - } - else { - switch(disp->rotation) { - case LV_DISPLAY_ROTATION_90: - return disp->offset_y; - case LV_DISPLAY_ROTATION_180: - return lv_display_get_physical_horizontal_resolution(disp) - disp->offset_x; - case LV_DISPLAY_ROTATION_270: - return lv_display_get_physical_horizontal_resolution(disp) - disp->offset_y; - default: - return disp->offset_x; - } - } -} - -int32_t lv_display_get_offset_y(const lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - - if(disp == NULL) { - return 0; - } - else { - switch(disp->rotation) { - case LV_DISPLAY_ROTATION_90: - return disp->offset_x; - case LV_DISPLAY_ROTATION_180: - return lv_display_get_physical_vertical_resolution(disp) - disp->offset_y; - case LV_DISPLAY_ROTATION_270: - return lv_display_get_physical_vertical_resolution(disp) - disp->offset_x; - default: - return disp->offset_y; - } - } -} - -int32_t lv_display_get_dpi(const lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return LV_DPI_DEF; /*Do not return 0 because it might be a divider*/ - return disp->dpi; -} - -/*--------------------- - * BUFFERING - *--------------------*/ - -void lv_display_set_draw_buffers(lv_display_t * disp, lv_draw_buf_t * buf1, lv_draw_buf_t * buf2) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return; - - disp->buf_1 = buf1; - disp->buf_2 = buf2; - disp->buf_act = disp->buf_1; -} - -void lv_display_set_buffers(lv_display_t * disp, void * buf1, void * buf2, uint32_t buf_size, - lv_display_render_mode_t render_mode) -{ - LV_ASSERT_MSG(buf1 != NULL, "Null buffer"); - lv_color_format_t cf = lv_display_get_color_format(disp); - uint32_t w = lv_display_get_horizontal_resolution(disp); - uint32_t h = lv_display_get_vertical_resolution(disp); - - LV_ASSERT_MSG(w != 0 && h != 0, "display resolution is 0"); - - /* buf1 or buf2 is not aligned according to LV_DRAW_BUF_ALIGN */ - LV_ASSERT_FORMAT_MSG(buf1 == lv_draw_buf_align(buf1, cf), "buf1 is not aligned: %p", buf1); - LV_ASSERT_FORMAT_MSG(buf2 == NULL || buf2 == lv_draw_buf_align(buf2, cf), "buf2 is not aligned: %p", buf2); - - uint32_t stride = lv_draw_buf_width_to_stride(w, cf); - if(render_mode == LV_DISPLAY_RENDER_MODE_PARTIAL) { - /* for partial mode, we calculate the height based on the buf_size and stride */ - h = buf_size / stride; - LV_ASSERT_MSG(h != 0, "the buffer is too small"); - } - else { - LV_ASSERT_FORMAT_MSG(stride * h <= buf_size, "%s mode requires screen sized buffer(s)", - render_mode == LV_DISPLAY_RENDER_MODE_FULL ? "FULL" : "DIRECT"); - } - - lv_draw_buf_init(&disp->_static_buf1, w, h, cf, stride, buf1, buf_size); - lv_draw_buf_init(&disp->_static_buf2, w, h, cf, stride, buf2, buf_size); - lv_display_set_draw_buffers(disp, &disp->_static_buf1, buf2 ? &disp->_static_buf2 : NULL); - lv_display_set_render_mode(disp, render_mode); -} - -void lv_display_set_render_mode(lv_display_t * disp, lv_display_render_mode_t render_mode) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return; - disp->render_mode = render_mode; -} - -void lv_display_set_flush_cb(lv_display_t * disp, lv_display_flush_cb_t flush_cb) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return; - - disp->flush_cb = flush_cb; -} - -void lv_display_set_flush_wait_cb(lv_display_t * disp, lv_display_flush_wait_cb_t wait_cb) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return; - - disp->flush_wait_cb = wait_cb; -} - -void lv_display_set_color_format(lv_display_t * disp, lv_color_format_t color_format) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return; - - disp->color_format = color_format; - disp->layer_head->color_format = color_format; - if(disp->buf_1) disp->buf_1->header.cf = color_format; - if(disp->buf_2) disp->buf_2->header.cf = color_format; - - lv_display_send_event(disp, LV_EVENT_COLOR_FORMAT_CHANGED, NULL); -} - -lv_color_format_t lv_display_get_color_format(lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return LV_COLOR_FORMAT_UNKNOWN; - - return disp->color_format; -} - -void lv_display_set_antialiasing(lv_display_t * disp, bool en) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return; - - disp->antialiasing = en; -} - -bool lv_display_get_antialiasing(lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return false; - - return disp->antialiasing; -} - -LV_ATTRIBUTE_FLUSH_READY void lv_display_flush_ready(lv_display_t * disp) -{ - disp->flushing = 0; -} - -LV_ATTRIBUTE_FLUSH_READY bool lv_display_flush_is_last(lv_display_t * disp) -{ - return disp->flushing_last; -} - -bool lv_display_is_double_buffered(lv_display_t * disp) -{ - return disp->buf_2 != NULL; -} - -/*--------------------- - * SCREENS - *--------------------*/ - -lv_obj_t * lv_display_get_screen_active(lv_display_t * disp) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) { - LV_LOG_WARN("no display registered to get its active screen"); - return NULL; - } - - return disp->act_scr; -} - -lv_obj_t * lv_display_get_screen_prev(lv_display_t * disp) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) { - LV_LOG_WARN("no display registered to get its previous screen"); - return NULL; - } - - return disp->prev_scr; -} - -lv_obj_t * lv_display_get_layer_top(lv_display_t * disp) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) { - LV_LOG_WARN("lv_layer_top: no display registered to get its top layer"); - return NULL; - } - - return disp->top_layer; -} - -lv_obj_t * lv_display_get_layer_sys(lv_display_t * disp) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) { - LV_LOG_WARN("lv_layer_sys: no display registered to get its sys. layer"); - return NULL; - } - - return disp->sys_layer; -} - -lv_obj_t * lv_display_get_layer_bottom(lv_display_t * disp) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) { - LV_LOG_WARN("lv_layer_bottom: no display registered to get its bottom layer"); - return NULL; - } - - return disp->bottom_layer; -} - -void lv_screen_load(struct lv_obj_t * scr) -{ - lv_screen_load_anim(scr, LV_SCR_LOAD_ANIM_NONE, 0, 0, false); -} - -void lv_screen_load_anim(lv_obj_t * new_scr, lv_screen_load_anim_t anim_type, uint32_t time, uint32_t delay, - bool auto_del) -{ - lv_display_t * d = lv_obj_get_display(new_scr); - lv_obj_t * act_scr = d->act_scr; - - if(act_scr == new_scr || d->scr_to_load == new_scr) { - return; - } - - /*If another screen load animation is in progress - *make target screen loaded immediately. */ - if(d->scr_to_load && act_scr != d->scr_to_load) { - lv_anim_delete(d->scr_to_load, NULL); - lv_obj_set_pos(d->scr_to_load, 0, 0); - lv_obj_remove_local_style_prop(d->scr_to_load, LV_STYLE_OPA, 0); - - d->prev_scr = d->act_scr; - act_scr = d->scr_to_load; /*Active screen changed.*/ - - scr_load_internal(d->scr_to_load); - } - - d->scr_to_load = new_scr; - - if(d->prev_scr && d->del_prev) lv_obj_delete(d->prev_scr); - d->prev_scr = NULL; - - d->draw_prev_over_act = is_out_anim(anim_type); - d->del_prev = auto_del; - - /*Be sure there is no other animation on the screens*/ - lv_anim_delete(new_scr, NULL); - if(act_scr) lv_anim_delete(act_scr, NULL); - - /*Be sure both screens are in a normal position*/ - lv_obj_set_pos(new_scr, 0, 0); - if(act_scr) lv_obj_set_pos(act_scr, 0, 0); - lv_obj_remove_local_style_prop(new_scr, LV_STYLE_OPA, 0); - if(act_scr) lv_obj_remove_local_style_prop(act_scr, LV_STYLE_OPA, 0); - - /*Shortcut for immediate load*/ - if(time == 0 && delay == 0) { - scr_load_internal(new_scr); - if(auto_del && act_scr) lv_obj_delete(act_scr); - return; - } - - lv_anim_t a_new; - lv_anim_init(&a_new); - lv_anim_set_var(&a_new, new_scr); - lv_anim_set_start_cb(&a_new, scr_load_anim_start); - lv_anim_set_completed_cb(&a_new, scr_anim_completed); - lv_anim_set_duration(&a_new, time); - lv_anim_set_delay(&a_new, delay); - - lv_anim_t a_old; - lv_anim_init(&a_old); - lv_anim_set_var(&a_old, act_scr); - lv_anim_set_duration(&a_old, time); - lv_anim_set_delay(&a_old, delay); - - switch(anim_type) { - case LV_SCR_LOAD_ANIM_NONE: - /*Create a dummy animation to apply the delay*/ - lv_anim_set_exec_cb(&a_new, set_x_anim); - lv_anim_set_values(&a_new, 0, 0); - break; - case LV_SCR_LOAD_ANIM_OVER_LEFT: - lv_anim_set_exec_cb(&a_new, set_x_anim); - lv_anim_set_values(&a_new, lv_display_get_horizontal_resolution(d), 0); - break; - case LV_SCR_LOAD_ANIM_OVER_RIGHT: - lv_anim_set_exec_cb(&a_new, set_x_anim); - lv_anim_set_values(&a_new, -lv_display_get_horizontal_resolution(d), 0); - break; - case LV_SCR_LOAD_ANIM_OVER_TOP: - lv_anim_set_exec_cb(&a_new, set_y_anim); - lv_anim_set_values(&a_new, lv_display_get_vertical_resolution(d), 0); - break; - case LV_SCR_LOAD_ANIM_OVER_BOTTOM: - lv_anim_set_exec_cb(&a_new, set_y_anim); - lv_anim_set_values(&a_new, -lv_display_get_vertical_resolution(d), 0); - break; - case LV_SCR_LOAD_ANIM_MOVE_LEFT: - lv_anim_set_exec_cb(&a_new, set_x_anim); - lv_anim_set_values(&a_new, lv_display_get_horizontal_resolution(d), 0); - - lv_anim_set_exec_cb(&a_old, set_x_anim); - lv_anim_set_values(&a_old, 0, -lv_display_get_horizontal_resolution(d)); - break; - case LV_SCR_LOAD_ANIM_MOVE_RIGHT: - lv_anim_set_exec_cb(&a_new, set_x_anim); - lv_anim_set_values(&a_new, -lv_display_get_horizontal_resolution(d), 0); - - lv_anim_set_exec_cb(&a_old, set_x_anim); - lv_anim_set_values(&a_old, 0, lv_display_get_horizontal_resolution(d)); - break; - case LV_SCR_LOAD_ANIM_MOVE_TOP: - lv_anim_set_exec_cb(&a_new, set_y_anim); - lv_anim_set_values(&a_new, lv_display_get_vertical_resolution(d), 0); - - lv_anim_set_exec_cb(&a_old, set_y_anim); - lv_anim_set_values(&a_old, 0, -lv_display_get_vertical_resolution(d)); - break; - case LV_SCR_LOAD_ANIM_MOVE_BOTTOM: - lv_anim_set_exec_cb(&a_new, set_y_anim); - lv_anim_set_values(&a_new, -lv_display_get_vertical_resolution(d), 0); - - lv_anim_set_exec_cb(&a_old, set_y_anim); - lv_anim_set_values(&a_old, 0, lv_display_get_vertical_resolution(d)); - break; - case LV_SCR_LOAD_ANIM_FADE_IN: - lv_anim_set_exec_cb(&a_new, opa_scale_anim); - lv_anim_set_values(&a_new, LV_OPA_TRANSP, LV_OPA_COVER); - break; - case LV_SCR_LOAD_ANIM_FADE_OUT: - lv_anim_set_exec_cb(&a_old, opa_scale_anim); - lv_anim_set_values(&a_old, LV_OPA_COVER, LV_OPA_TRANSP); - break; - case LV_SCR_LOAD_ANIM_OUT_LEFT: - lv_anim_set_exec_cb(&a_old, set_x_anim); - lv_anim_set_values(&a_old, 0, -lv_display_get_horizontal_resolution(d)); - break; - case LV_SCR_LOAD_ANIM_OUT_RIGHT: - lv_anim_set_exec_cb(&a_old, set_x_anim); - lv_anim_set_values(&a_old, 0, lv_display_get_horizontal_resolution(d)); - break; - case LV_SCR_LOAD_ANIM_OUT_TOP: - lv_anim_set_exec_cb(&a_old, set_y_anim); - lv_anim_set_values(&a_old, 0, -lv_display_get_vertical_resolution(d)); - break; - case LV_SCR_LOAD_ANIM_OUT_BOTTOM: - lv_anim_set_exec_cb(&a_old, set_y_anim); - lv_anim_set_values(&a_old, 0, lv_display_get_vertical_resolution(d)); - break; - } - - if(act_scr) lv_obj_send_event(act_scr, LV_EVENT_SCREEN_UNLOAD_START, NULL); - - lv_anim_start(&a_new); - if(act_scr) lv_anim_start(&a_old); -} - -/*--------------------- - * OTHERS - *--------------------*/ - -void lv_display_add_event_cb(lv_display_t * disp, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data) -{ - LV_ASSERT_NULL(disp); - - lv_event_add(&disp->event_list, event_cb, filter, user_data); -} - -uint32_t lv_display_get_event_count(lv_display_t * disp) -{ - LV_ASSERT_NULL(disp); - return lv_event_get_count(&disp->event_list); -} - -lv_event_dsc_t * lv_display_get_event_dsc(lv_display_t * disp, uint32_t index) -{ - LV_ASSERT_NULL(disp); - return lv_event_get_dsc(&disp->event_list, index); - -} - -bool lv_display_delete_event(lv_display_t * disp, uint32_t index) -{ - LV_ASSERT_NULL(disp); - - return lv_event_remove(&disp->event_list, index); -} - -uint32_t lv_display_remove_event_cb_with_user_data(lv_display_t * disp, lv_event_cb_t event_cb, void * user_data) -{ - LV_ASSERT_NULL(disp); - - uint32_t event_cnt = lv_display_get_event_count(disp); - uint32_t removed_count = 0; - int32_t i; - - for(i = event_cnt - 1; i >= 0; i--) { - lv_event_dsc_t * dsc = lv_display_get_event_dsc(disp, i); - if(dsc && dsc->cb == event_cb && dsc->user_data == user_data) { - lv_display_delete_event(disp, i); - removed_count ++; - } - } - - return removed_count; -} - -lv_result_t lv_display_send_event(lv_display_t * disp, lv_event_code_t code, void * param) -{ - - lv_event_t e; - lv_memzero(&e, sizeof(e)); - e.code = code; - e.current_target = disp; - e.original_target = disp; - e.param = param; - lv_result_t res; - res = lv_event_send(&disp->event_list, &e, true); - if(res != LV_RESULT_OK) return res; - - res = lv_event_send(&disp->event_list, &e, false); - if(res != LV_RESULT_OK) return res; - - return res; -} - -void lv_display_set_rotation(lv_display_t * disp, lv_display_rotation_t rotation) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return; - - disp->rotation = rotation; - update_resolution(disp); -} - -lv_display_rotation_t lv_display_get_rotation(lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) return LV_DISPLAY_ROTATION_0; - return disp->rotation; -} - -void lv_display_set_theme(lv_display_t * disp, lv_theme_t * th) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) { - LV_LOG_WARN("no display registered"); - return; - } - - disp->theme = th; - - if(disp->screen_cnt == 4 && - lv_obj_get_child_count(disp->screens[0]) == 0 && - lv_obj_get_child_count(disp->screens[1]) == 0 && - lv_obj_get_child_count(disp->screens[2]) == 0) { - lv_theme_apply(disp->screens[0]); - } -} - -lv_theme_t * lv_display_get_theme(lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - return disp->theme; -} - -uint32_t lv_display_get_inactive_time(const lv_display_t * disp) -{ - if(disp) return lv_tick_elaps(disp->last_activity_time); - - lv_display_t * d; - uint32_t t = UINT32_MAX; - d = lv_display_get_next(NULL); - while(d) { - uint32_t elaps = lv_tick_elaps(d->last_activity_time); - t = LV_MIN(t, elaps); - d = lv_display_get_next(d); - } - - return t; -} - -void lv_display_trigger_activity(lv_display_t * disp) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) { - LV_LOG_WARN("lv_display_trigger_activity: no display registered"); - return; - } - - disp->last_activity_time = lv_tick_get(); -} - -void lv_display_enable_invalidation(lv_display_t * disp, bool en) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) { - LV_LOG_WARN("no display registered"); - return; - } - - disp->inv_en_cnt += en ? 1 : -1; -} - -bool lv_display_is_invalidation_enabled(lv_display_t * disp) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) { - LV_LOG_WARN("no display registered"); - return false; - } - - return (disp->inv_en_cnt > 0); -} - -lv_timer_t * lv_display_get_refr_timer(lv_display_t * disp) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) return NULL; - - return disp->refr_timer; -} - -void lv_display_delete_refr_timer(lv_display_t * disp) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp || !disp->refr_timer) return; - - lv_timer_delete(disp->refr_timer); - disp->refr_timer = NULL; -} - -void lv_display_set_user_data(lv_display_t * disp, void * user_data) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) return; - disp->user_data = user_data; -} - -void lv_display_set_driver_data(lv_display_t * disp, void * driver_data) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) return; - - disp->driver_data = driver_data; -} - -void * lv_display_get_user_data(lv_display_t * disp) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) return NULL; - return disp->user_data; -} - -void * lv_display_get_driver_data(lv_display_t * disp) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) return NULL; - - return disp->driver_data; -} - -lv_draw_buf_t * lv_display_get_buf_active(lv_display_t * disp) -{ - if(!disp) disp = lv_display_get_default(); - if(!disp) return NULL; - return disp->buf_act; -} - -void lv_display_rotate_area(lv_display_t * disp, lv_area_t * area) -{ - lv_display_rotation_t rotation = lv_display_get_rotation(disp); - - int32_t w = lv_area_get_width(area); - int32_t h = lv_area_get_height(area); - - switch(rotation) { - case LV_DISPLAY_ROTATION_0: - return; - case LV_DISPLAY_ROTATION_90: - area->y2 = disp->ver_res - area->x1 - 1; - area->x1 = area->y1; - area->x2 = area->x1 + h - 1; - area->y1 = area->y2 - w + 1; - break; - case LV_DISPLAY_ROTATION_180: - area->y2 = disp->ver_res - area->y1 - 1; - area->y1 = area->y2 - h + 1; - area->x2 = disp->hor_res - area->x1 - 1; - area->x1 = area->x2 - w + 1; - break; - case LV_DISPLAY_ROTATION_270: - area->x1 = disp->hor_res - area->y2 - 1; - area->y2 = area->x2; - area->x2 = area->x1 + h - 1; - area->y1 = area->y2 - w + 1; - break; - } -} - -lv_obj_t * lv_screen_active(void) -{ - return lv_display_get_screen_active(lv_display_get_default()); -} - -lv_obj_t * lv_layer_top(void) -{ - return lv_display_get_layer_top(lv_display_get_default()); -} - -lv_obj_t * lv_layer_sys(void) -{ - return lv_display_get_layer_sys(lv_display_get_default()); -} - -lv_obj_t * lv_layer_bottom(void) -{ - return lv_display_get_layer_bottom(lv_display_get_default()); -} - -int32_t lv_dpx(int32_t n) -{ - return LV_DPX(n); -} - -int32_t lv_display_dpx(const lv_display_t * disp, int32_t n) -{ - return LV_DPX_CALC(lv_display_get_dpi(disp), n); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void update_resolution(lv_display_t * disp) -{ - int32_t hor_res = lv_display_get_horizontal_resolution(disp); - int32_t ver_res = lv_display_get_vertical_resolution(disp); - - lv_area_t prev_coords; - lv_obj_get_coords(disp->sys_layer, &prev_coords); - uint32_t i; - for(i = 0; i < disp->screen_cnt; i++) { - lv_area_set_width(&disp->screens[i]->coords, hor_res); - lv_area_set_height(&disp->screens[i]->coords, ver_res); - lv_obj_send_event(disp->screens[i], LV_EVENT_SIZE_CHANGED, &prev_coords); - } - - lv_area_set_width(&disp->top_layer->coords, hor_res); - lv_area_set_height(&disp->top_layer->coords, ver_res); - lv_obj_send_event(disp->top_layer, LV_EVENT_SIZE_CHANGED, &prev_coords); - - lv_area_set_width(&disp->sys_layer->coords, hor_res); - lv_area_set_height(&disp->sys_layer->coords, ver_res); - lv_obj_send_event(disp->sys_layer, LV_EVENT_SIZE_CHANGED, &prev_coords); - - lv_area_set_width(&disp->bottom_layer->coords, hor_res); - lv_area_set_height(&disp->bottom_layer->coords, ver_res); - lv_obj_send_event(disp->bottom_layer, LV_EVENT_SIZE_CHANGED, &prev_coords); - - lv_memzero(disp->inv_areas, sizeof(disp->inv_areas)); - lv_memzero(disp->inv_area_joined, sizeof(disp->inv_area_joined)); - disp->inv_p = 0; - lv_obj_invalidate(disp->sys_layer); - - lv_obj_tree_walk(NULL, invalidate_layout_cb, NULL); - - lv_display_send_event(disp, LV_EVENT_RESOLUTION_CHANGED, NULL); -} - -static lv_obj_tree_walk_res_t invalidate_layout_cb(lv_obj_t * obj, void * user_data) -{ - LV_UNUSED(user_data); - lv_obj_mark_layout_as_dirty(obj); - return LV_OBJ_TREE_WALK_NEXT; -} - -static void scr_load_internal(lv_obj_t * scr) -{ - /*scr must not be NULL, but d->act_scr might be*/ - LV_ASSERT_NULL(scr); - if(scr == NULL) return; - - lv_display_t * d = lv_obj_get_display(scr); - if(!d) return; /*Shouldn't happen, just to be sure*/ - - lv_obj_t * old_scr = d->act_scr; - - if(old_scr) lv_obj_send_event(old_scr, LV_EVENT_SCREEN_UNLOAD_START, NULL); - lv_obj_send_event(scr, LV_EVENT_SCREEN_LOAD_START, NULL); - - d->act_scr = scr; - d->scr_to_load = NULL; - - lv_obj_send_event(scr, LV_EVENT_SCREEN_LOADED, NULL); - if(old_scr) lv_obj_send_event(old_scr, LV_EVENT_SCREEN_UNLOADED, NULL); - - lv_obj_invalidate(scr); -} - -static void scr_load_anim_start(lv_anim_t * a) -{ - lv_display_t * d = lv_obj_get_display(a->var); - - d->prev_scr = d->act_scr; - d->act_scr = a->var; - - lv_obj_send_event(d->act_scr, LV_EVENT_SCREEN_LOAD_START, NULL); -} - -static void opa_scale_anim(void * obj, int32_t v) -{ - lv_obj_set_style_opa(obj, v, 0); -} - -static void set_x_anim(void * obj, int32_t v) -{ - lv_obj_set_x(obj, v); -} - -static void set_y_anim(void * obj, int32_t v) -{ - lv_obj_set_y(obj, v); -} - -static void scr_anim_completed(lv_anim_t * a) -{ - lv_display_t * d = lv_obj_get_display(a->var); - - lv_obj_send_event(d->act_scr, LV_EVENT_SCREEN_LOADED, NULL); - lv_obj_send_event(d->prev_scr, LV_EVENT_SCREEN_UNLOADED, NULL); - - if(d->prev_scr && d->del_prev) lv_obj_delete(d->prev_scr); - d->prev_scr = NULL; - d->draw_prev_over_act = false; - d->scr_to_load = NULL; - lv_obj_remove_local_style_prop(a->var, LV_STYLE_OPA, 0); - lv_obj_invalidate(d->act_scr); -} - -static bool is_out_anim(lv_screen_load_anim_t anim_type) -{ - return anim_type == LV_SCR_LOAD_ANIM_FADE_OUT || - anim_type == LV_SCR_LOAD_ANIM_OUT_LEFT || - anim_type == LV_SCR_LOAD_ANIM_OUT_RIGHT || - anim_type == LV_SCR_LOAD_ANIM_OUT_TOP || - anim_type == LV_SCR_LOAD_ANIM_OUT_BOTTOM; -} - -static void disp_event_cb(lv_event_t * e) -{ - lv_event_code_t code = lv_event_get_code(e); - lv_display_t * disp = lv_event_get_target(e); - switch(code) { - case LV_EVENT_REFR_REQUEST: - if(disp->refr_timer) lv_timer_resume(disp->refr_timer); - break; - - default: - break; - } -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/display/lv_display.h b/software/Power_Pico/Middlewares/LVGL/src/display/lv_display.h deleted file mode 100644 index e3e7c49..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/display/lv_display.h +++ /dev/null @@ -1,593 +0,0 @@ -/** - * @file lv_display.h - * - */ - -#ifndef LV_DISPLAY_H -#define LV_DISPLAY_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_types.h" -#include "../misc/lv_timer.h" -#include "../misc/lv_event.h" -#include "../misc/lv_color.h" -#include "../draw/lv_draw.h" - -/********************* - * DEFINES - *********************/ - -#ifndef LV_ATTRIBUTE_FLUSH_READY -#define LV_ATTRIBUTE_FLUSH_READY -#endif - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - LV_DISPLAY_ROTATION_0 = 0, - LV_DISPLAY_ROTATION_90, - LV_DISPLAY_ROTATION_180, - LV_DISPLAY_ROTATION_270 -} lv_display_rotation_t; - -typedef enum { - /** - * Use the buffer(s) to render the screen is smaller parts. - * This way the buffers can be smaller then the display to save RAM. At least 1/10 screen size buffer(s) are recommended. - */ - LV_DISPLAY_RENDER_MODE_PARTIAL, - - /** - * The buffer(s) has to be screen sized and LVGL will render into the correct location of the buffer. - * This way the buffer always contain the whole image. Only the changed ares will be updated. - * With 2 buffers the buffers' content are kept in sync automatically and in flush_cb only address change is required. - */ - LV_DISPLAY_RENDER_MODE_DIRECT, - - /** - * Always redraw the whole screen even if only one pixel has been changed. - * With 2 buffers in flush_cb only and address change is required. - */ - LV_DISPLAY_RENDER_MODE_FULL, -} lv_display_render_mode_t; - -typedef enum { - LV_SCR_LOAD_ANIM_NONE, - LV_SCR_LOAD_ANIM_OVER_LEFT, - LV_SCR_LOAD_ANIM_OVER_RIGHT, - LV_SCR_LOAD_ANIM_OVER_TOP, - LV_SCR_LOAD_ANIM_OVER_BOTTOM, - LV_SCR_LOAD_ANIM_MOVE_LEFT, - LV_SCR_LOAD_ANIM_MOVE_RIGHT, - LV_SCR_LOAD_ANIM_MOVE_TOP, - LV_SCR_LOAD_ANIM_MOVE_BOTTOM, - LV_SCR_LOAD_ANIM_FADE_IN, - LV_SCR_LOAD_ANIM_FADE_ON = LV_SCR_LOAD_ANIM_FADE_IN, /*For backward compatibility*/ - LV_SCR_LOAD_ANIM_FADE_OUT, - LV_SCR_LOAD_ANIM_OUT_LEFT, - LV_SCR_LOAD_ANIM_OUT_RIGHT, - LV_SCR_LOAD_ANIM_OUT_TOP, - LV_SCR_LOAD_ANIM_OUT_BOTTOM, -} lv_screen_load_anim_t; - -typedef void (*lv_display_flush_cb_t)(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); -typedef void (*lv_display_flush_wait_cb_t)(lv_display_t * disp); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a new display with the given resolution - * @param hor_res horizontal resolution in pixels - * @param ver_res vertical resolution in pixels - * @return pointer to a display object or `NULL` on error - */ -lv_display_t * lv_display_create(int32_t hor_res, int32_t ver_res); - -/** - * Remove a display - * @param disp pointer to display - */ -void lv_display_delete(lv_display_t * disp); - -/** - * Set a default display. The new screens will be created on it by default. - * @param disp pointer to a display - */ -void lv_display_set_default(lv_display_t * disp); - -/** - * Get the default display - * @return pointer to the default display - */ -lv_display_t * lv_display_get_default(void); - -/** - * Get the next display. - * @param disp pointer to the current display. NULL to initialize. - * @return the next display or NULL if no more. Gives the first display when the parameter is NULL. - */ -lv_display_t * lv_display_get_next(lv_display_t * disp); - -/*--------------------- - * RESOLUTION - *--------------------*/ - -/** - * Sets the resolution of a display. `LV_EVENT_RESOLUTION_CHANGED` event will be sent. - * Here the native resolution of the device should be set. If the display will be rotated later with - * `lv_display_set_rotation` LVGL will swap the hor. and ver. resolution automatically. - * @param disp pointer to a display - * @param hor_res the new horizontal resolution - * @param ver_res the new vertical resolution - */ -void lv_display_set_resolution(lv_display_t * disp, int32_t hor_res, int32_t ver_res); - -/** - * It's not mandatory to use the whole display for LVGL, however in some cases physical resolution is important. - * For example the touchpad still sees whole resolution and the values needs to be converted - * to the active LVGL display area. - * @param disp pointer to a display - * @param hor_res the new physical horizontal resolution, or -1 to assume it's the same as the normal hor. res. - * @param ver_res the new physical vertical resolution, or -1 to assume it's the same as the normal hor. res. - */ -void lv_display_set_physical_resolution(lv_display_t * disp, int32_t hor_res, int32_t ver_res); - -/** - * If physical resolution is not the same as the normal resolution - * the offset of the active display area can be set here. - * @param disp pointer to a display - * @param x X offset - * @param y Y offset - */ -void lv_display_set_offset(lv_display_t * disp, int32_t x, int32_t y); - -/** - * Set the rotation of this display. LVGL will swap the horizontal and vertical resolutions internally. - * @param disp pointer to a display (NULL to use the default display) - * @param rotation `LV_DISPLAY_ROTATION_0/90/180/270` - */ -void lv_display_set_rotation(lv_display_t * disp, lv_display_rotation_t rotation); - -/** - * Set the DPI (dot per inch) of the display. - * dpi = sqrt(hor_res^2 + ver_res^2) / diagonal" - * @param disp pointer to a display - * @param dpi the new DPI - */ -void lv_display_set_dpi(lv_display_t * disp, int32_t dpi); - -/** - * Get the horizontal resolution of a display. - * @param disp pointer to a display (NULL to use the default display) - * @return the horizontal resolution of the display. - */ -int32_t lv_display_get_horizontal_resolution(const lv_display_t * disp); - -/** - * Get the vertical resolution of a display - * @param disp pointer to a display (NULL to use the default display) - * @return the vertical resolution of the display - */ -int32_t lv_display_get_vertical_resolution(const lv_display_t * disp); - -/** - * Get the physical horizontal resolution of a display - * @param disp pointer to a display (NULL to use the default display) - * @return the physical horizontal resolution of the display - */ -int32_t lv_display_get_physical_horizontal_resolution(const lv_display_t * disp); - -/** - * Get the physical vertical resolution of a display - * @param disp pointer to a display (NULL to use the default display) - * @return the physical vertical resolution of the display - */ -int32_t lv_display_get_physical_vertical_resolution(const lv_display_t * disp); - -/** - * Get the horizontal offset from the full / physical display - * @param disp pointer to a display (NULL to use the default display) - * @return the horizontal offset from the physical display - */ -int32_t lv_display_get_offset_x(const lv_display_t * disp); - -/** - * Get the vertical offset from the full / physical display - * @param disp pointer to a display (NULL to use the default display) - * @return the horizontal offset from the physical display - */ -int32_t lv_display_get_offset_y(const lv_display_t * disp); - -/** - * Get the current rotation of this display. - * @param disp pointer to a display (NULL to use the default display) - * @return the current rotation - */ -lv_display_rotation_t lv_display_get_rotation(lv_display_t * disp); - -/** - * Get the DPI of the display - * @param disp pointer to a display (NULL to use the default display) - * @return dpi of the display - */ -int32_t lv_display_get_dpi(const lv_display_t * disp); - -/*--------------------- - * BUFFERING - *--------------------*/ - -/** - * Set the buffers for a display, similarly to `lv_display_set_draw_buffers`, but accept the raw buffer pointers. - * For DIRECT/FULL rending modes, the buffer size must be at least - * `hor_res * ver_res * lv_color_format_get_size(lv_display_get_color_format(disp))` - * @param disp pointer to a display - * @param buf1 first buffer - * @param buf2 second buffer (can be `NULL`) - * @param buf_size buffer size in byte - * @param render_mode LV_DISPLAY_RENDER_MODE_PARTIAL/DIRECT/FULL - */ -void lv_display_set_buffers(lv_display_t * disp, void * buf1, void * buf2, uint32_t buf_size, - lv_display_render_mode_t render_mode); - -/** - * Set the buffers for a display, accept a draw buffer pointer. - * Normally use `lv_display_set_buffers` is enough for most cases. - * Use this function when an existing lv_draw_buf_t is available. - * @param disp pointer to a display - * @param buf1 first buffer - * @param buf2 second buffer (can be `NULL`) - */ -void lv_display_set_draw_buffers(lv_display_t * disp, lv_draw_buf_t * buf1, lv_draw_buf_t * buf2); - -/** - * Set display render mode - * @param disp pointer to a display - * @param render_mode LV_DISPLAY_RENDER_MODE_PARTIAL/DIRECT/FULL - */ -void lv_display_set_render_mode(lv_display_t * disp, lv_display_render_mode_t render_mode); - -/** - * Set the flush callback which will be called to copy the rendered image to the display. - * @param disp pointer to a display - * @param flush_cb the flush callback (`px_map` contains the rendered image as raw pixel map and it should be copied to `area` on the display) - */ -void lv_display_set_flush_cb(lv_display_t * disp, lv_display_flush_cb_t flush_cb); - -/** - * Set a callback to be used while LVGL is waiting flushing to be finished. - * It can do any complex logic to wait, including semaphores, mutexes, polling flags, etc. - * If not set the `disp->flushing` flag is used which can be cleared with `lv_display_flush_ready()` - * @param disp pointer to a display - * @param wait_cb a callback to call while LVGL is waiting for flush ready. - * If NULL `lv_display_flush_ready()` can be used to signal that flushing is ready. - */ -void lv_display_set_flush_wait_cb(lv_display_t * disp, lv_display_flush_wait_cb_t wait_cb); - -/** - * Set the color format of the display. - * @param disp pointer to a display - * @param color_format Possible values are - * - LV_COLOR_FORMAT_RGB565 - * - LV_COLOR_FORMAT_RGB888 - * - LV_COLOR_FORMAT_XRGB888 - * - LV_COLOR_FORMAT_ARGB888 - *@note To change the endianness of the rendered image in case of RGB565 format - * (i.e. swap the 2 bytes) call `lv_draw_sw_rgb565_swap` in the flush_cb - */ -void lv_display_set_color_format(lv_display_t * disp, lv_color_format_t color_format); - -/** - * Get the color format of the display - * @param disp pointer to a display - * @return the color format - */ -lv_color_format_t lv_display_get_color_format(lv_display_t * disp); - -/** - * Enable anti-aliasing for the render engine - * @param disp pointer to a display - * @param en true/false - */ -void lv_display_set_antialiasing(lv_display_t * disp, bool en); - -/** - * Get if anti-aliasing is enabled for a display or not - * @param disp pointer to a display (NULL to use the default display) - * @return true/false - */ -bool lv_display_get_antialiasing(lv_display_t * disp); - -//! @cond Doxygen_Suppress - -/** - * Call from the display driver when the flushing is finished - * @param disp pointer to display whose `flush_cb` was called - */ -LV_ATTRIBUTE_FLUSH_READY void lv_display_flush_ready(lv_display_t * disp); - -/** - * Tell if it's the last area of the refreshing process. - * Can be called from `flush_cb` to execute some special display refreshing if needed when all areas area flushed. - * @param disp pointer to display - * @return true: it's the last area to flush; - * false: there are other areas too which will be refreshed soon - */ -LV_ATTRIBUTE_FLUSH_READY bool lv_display_flush_is_last(lv_display_t * disp); - -//! @endcond - -bool lv_display_is_double_buffered(lv_display_t * disp); - -/*--------------------- - * SCREENS - *--------------------*/ - -/** - * Return a pointer to the active screen on a display - * @param disp pointer to display which active screen should be get. - * (NULL to use the default screen) - * @return pointer to the active screen object (loaded by 'lv_screen_load()') - */ -lv_obj_t * lv_display_get_screen_active(lv_display_t * disp); - -/** - * Return with a pointer to the previous screen. Only used during screen transitions. - * @param disp pointer to display which previous screen should be get. - * (NULL to use the default screen) - * @return pointer to the previous screen object or NULL if not used now - */ -lv_obj_t * lv_display_get_screen_prev(lv_display_t * disp); - -/** - * Return the top layer. The top layer is the same on all screens and it is above the normal screen layer. - * @param disp pointer to display which top layer should be get. (NULL to use the default screen) - * @return pointer to the top layer object - */ -lv_obj_t * lv_display_get_layer_top(lv_display_t * disp); - -/** - * Return the sys. layer. The system layer is the same on all screen and it is above the normal screen and the top layer. - * @param disp pointer to display which sys. layer should be retrieved. (NULL to use the default screen) - * @return pointer to the sys layer object - */ -lv_obj_t * lv_display_get_layer_sys(lv_display_t * disp); - -/** - * Return the bottom layer. The bottom layer is the same on all screen and it is under the normal screen layer. - * It's visible only if the screen is transparent. - * @param disp pointer to display (NULL to use the default screen) - * @return pointer to the bottom layer object - */ -lv_obj_t * lv_display_get_layer_bottom(lv_display_t * disp); - -/** - * Load a screen on the default display - * @param scr pointer to a screen - */ -void lv_screen_load(struct lv_obj_t * scr); - -/** - * Switch screen with animation - * @param scr pointer to the new screen to load - * @param anim_type type of the animation from `lv_screen_load_anim_t`, e.g. `LV_SCR_LOAD_ANIM_MOVE_LEFT` - * @param time time of the animation - * @param delay delay before the transition - * @param auto_del true: automatically delete the old screen - */ -void lv_screen_load_anim(lv_obj_t * scr, lv_screen_load_anim_t anim_type, uint32_t time, uint32_t delay, - bool auto_del); - -/** - * Get the active screen of the default display - * @return pointer to the active screen - */ -lv_obj_t * lv_screen_active(void); - -/** - * Get the top layer of the default display - * @return pointer to the top layer - */ -lv_obj_t * lv_layer_top(void); - -/** - * Get the system layer of the default display - * @return pointer to the sys layer - */ -lv_obj_t * lv_layer_sys(void); - -/** - * Get the bottom layer of the default display - * @return pointer to the bottom layer - */ -lv_obj_t * lv_layer_bottom(void); - -/*--------------------- - * OTHERS - *--------------------*/ - -/** - * Add an event handler to the display - * @param disp pointer to a display - * @param event_cb an event callback - * @param filter event code to react or `LV_EVENT_ALL` - * @param user_data optional user_data - */ -void lv_display_add_event_cb(lv_display_t * disp, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data); - -/** - * Get the number of event attached to a display - * @param disp pointer to a display - * @return number of events - */ -uint32_t lv_display_get_event_count(lv_display_t * disp); - -/** - * Get an event descriptor for an event - * @param disp pointer to a display - * @param index the index of the event - * @return the event descriptor - */ -lv_event_dsc_t * lv_display_get_event_dsc(lv_display_t * disp, uint32_t index); - -/** - * Remove an event - * @param disp pointer to a display - * @param index the index of the event to remove - * @return true: and event was removed; false: no event was removed - */ -bool lv_display_delete_event(lv_display_t * disp, uint32_t index); - -/** - * Remove an event_cb with user_data - * @param disp pointer to a display - * @param event_cb the event_cb of the event to remove - * @param user_data user_data - * @return the count of the event removed - */ -uint32_t lv_display_remove_event_cb_with_user_data(lv_display_t * disp, lv_event_cb_t event_cb, void * user_data); - -/** - * Send an event to a display - * @param disp pointer to a display - * @param code an event code. LV_EVENT_... - * @param param optional param - * @return LV_RESULT_OK: disp wasn't deleted in the event. - */ -lv_result_t lv_display_send_event(lv_display_t * disp, lv_event_code_t code, void * param); - -/** - * Set the theme of a display. If there are no user created widgets yet the screens' theme will be updated - * @param disp pointer to a display - * @param th pointer to a theme - */ -void lv_display_set_theme(lv_display_t * disp, lv_theme_t * th); - -/** - * Get the theme of a display - * @param disp pointer to a display - * @return the display's theme (can be NULL) - */ -lv_theme_t * lv_display_get_theme(lv_display_t * disp); - -/** - * Get elapsed time since last user activity on a display (e.g. click) - * @param disp pointer to a display (NULL to get the overall smallest inactivity) - * @return elapsed ticks (milliseconds) since the last activity - */ -uint32_t lv_display_get_inactive_time(const lv_display_t * disp); - -/** - * Manually trigger an activity on a display - * @param disp pointer to a display (NULL to use the default display) - */ -void lv_display_trigger_activity(lv_display_t * disp); - -/** - * Temporarily enable and disable the invalidation of the display. - * @param disp pointer to a display (NULL to use the default display) - * @param en true: enable invalidation; false: invalidation - */ -void lv_display_enable_invalidation(lv_display_t * disp, bool en); - -/** - * Get display invalidation is enabled. - * @param disp pointer to a display (NULL to use the default display) - * @return return true if invalidation is enabled - */ -bool lv_display_is_invalidation_enabled(lv_display_t * disp); - -/** - * Get a pointer to the screen refresher timer to - * modify its parameters with `lv_timer_...` functions. - * @param disp pointer to a display - * @return pointer to the display refresher timer. (NULL on error) - */ -lv_timer_t * lv_display_get_refr_timer(lv_display_t * disp); - -/** - * Delete screen refresher timer - * @param disp pointer to a display - */ -void lv_display_delete_refr_timer(lv_display_t * disp); - -void lv_display_set_user_data(lv_display_t * disp, void * user_data); -void lv_display_set_driver_data(lv_display_t * disp, void * driver_data); -void * lv_display_get_user_data(lv_display_t * disp); -void * lv_display_get_driver_data(lv_display_t * disp); -lv_draw_buf_t * lv_display_get_buf_active(lv_display_t * disp); - -/** - * Rotate an area in-place according to the display's rotation - * @param disp pointer to a display - * @param area pointer to an area to rotate - */ -void lv_display_rotate_area(lv_display_t * disp, lv_area_t * area); - -/********************** - * MACROS - **********************/ - -/*------------------------------------------------ - * To improve backward compatibility - * Recommended only if you have one display - *------------------------------------------------*/ - -#ifndef LV_HOR_RES -/** - * The horizontal resolution of the currently active display. - */ -#define LV_HOR_RES lv_display_get_horizontal_resolution(lv_display_get_default()) -#endif - -#ifndef LV_VER_RES -/** - * The vertical resolution of the currently active display. - */ -#define LV_VER_RES lv_display_get_vertical_resolution(lv_display_get_default()) -#endif - -/** - * Same as Android's DIP. (Different name is chosen to avoid mistype between LV_DPI and LV_DIP) - * 1 dip is 1 px on a 160 DPI screen - * 1 dip is 2 px on a 320 DPI screen - * https://stackoverflow.com/questions/2025282/what-is-the-difference-between-px-dip-dp-and-sp - */ -#define LV_DPX_CALC(dpi, n) ((n) == 0 ? 0 :LV_MAX((( (dpi) * (n) + 80) / 160), 1)) /*+80 for rounding*/ -#define LV_DPX(n) LV_DPX_CALC(lv_display_get_dpi(NULL), n) - -/** - * Scale the given number of pixels (a distance or size) relative to a 160 DPI display - * considering the DPI of the default display. - * It ensures that e.g. `lv_dpx(100)` will have the same physical size regardless to the - * DPI of the display. - * @param n the number of pixels to scale - * @return `n x current_dpi/160` - */ -int32_t lv_dpx(int32_t n); - -/** - * Scale the given number of pixels (a distance or size) relative to a 160 DPI display - * considering the DPI of the given display. - * It ensures that e.g. `lv_dpx(100)` will have the same physical size regardless to the - * DPI of the display. - * @param disp a display whose dpi should be considered - * @param n the number of pixels to scale - * @return `n x current_dpi/160` - */ -int32_t lv_display_dpx(const lv_display_t * disp, int32_t n); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DISPLAY_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/display/lv_display_private.h b/software/Power_Pico/Middlewares/LVGL/src/display/lv_display_private.h deleted file mode 100644 index 7dc9f18..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/display/lv_display_private.h +++ /dev/null @@ -1,181 +0,0 @@ -/** - * @file lv_display_private.h - * - */ - -#ifndef LV_DISPLAY_PRIVATE_H -#define LV_DISPLAY_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_types.h" -#include "../core/lv_obj.h" -#include "../draw/lv_draw.h" -#include "lv_display.h" - -#if LV_USE_SYSMON -#include "../others/sysmon/lv_sysmon_private.h" -#endif - -/********************* - * DEFINES - *********************/ -#ifndef LV_INV_BUF_SIZE -#define LV_INV_BUF_SIZE 32 /**< Buffer size for invalid areas */ -#endif - -/********************** - * TYPEDEFS - **********************/ - -struct lv_display_t { - - /*--------------------- - * Resolution - *--------------------*/ - - /** Horizontal resolution.*/ - int32_t hor_res; - - /** Vertical resolution.*/ - int32_t ver_res; - - /** Horizontal resolution of the full / physical display. Set to -1 for fullscreen mode.*/ - int32_t physical_hor_res; - - /** Vertical resolution of the full / physical display. Set to -1 for fullscreen mode.*/ - int32_t physical_ver_res; - - /** Horizontal offset from the full / physical display. Set to 0 for fullscreen mode.*/ - int32_t offset_x; - - /** Vertical offset from the full / physical display. Set to 0 for fullscreen mode.*/ - int32_t offset_y; - - /** DPI (dot per inch) of the display. Default value is `LV_DPI_DEF`.*/ - uint32_t dpi; - - /*--------------------- - * Buffering - *--------------------*/ - lv_draw_buf_t * buf_1; - lv_draw_buf_t * buf_2; - - /** Internal, used by the library*/ - lv_draw_buf_t * buf_act; - - /** MANDATORY: Write the internal buffer (draw_buf) to the display. 'lv_display_flush_ready()' has to be - * called when finished*/ - lv_display_flush_cb_t flush_cb; - - /** - * Used to wait while flushing is ready. - * It can do any complex logic to wait, including semaphores, mutexes, polling flags, etc. - * If not set `flushing` flag is used which can be cleared with `lv_display_flush_ready()` */ - lv_display_flush_wait_cb_t flush_wait_cb; - - /** 1: flushing is in progress. (It can't be a bit field because when it's cleared from IRQ - * Read-Modify-Write issue might occur) */ - volatile int flushing; - - /** 1: It was the last chunk to flush. (It can't be a bit field because when it's cleared - * from IRQ Read-Modify-Write issue might occur) */ - volatile int flushing_last; - volatile uint32_t last_area : 1; /**< 1: last area is being rendered */ - volatile uint32_t last_part : 1; /**< 1: last part of the current area is being rendered */ - - lv_display_render_mode_t render_mode; - uint32_t antialiasing : 1; /**< 1: anti-aliasing is enabled on this display.*/ - - /** 1: The current screen rendering is in progress*/ - uint32_t rendering_in_progress : 1; - - lv_color_format_t color_format; - - /** Invalidated (marked to redraw) areas*/ - lv_area_t inv_areas[LV_INV_BUF_SIZE]; - uint8_t inv_area_joined[LV_INV_BUF_SIZE]; - uint32_t inv_p; - int32_t inv_en_cnt; - - /** Double buffer sync areas (redrawn during last refresh) */ - lv_ll_t sync_areas; - - lv_draw_buf_t _static_buf1; /**< Used when user pass in a raw buffer as display draw buffer */ - lv_draw_buf_t _static_buf2; - /*--------------------- - * Layer - *--------------------*/ - lv_layer_t * layer_head; - void (*layer_init)(lv_display_t * disp, lv_layer_t * layer); - void (*layer_deinit)(lv_display_t * disp, lv_layer_t * layer); - - /*--------------------- - * Screens - *--------------------*/ - - /** Screens of the display*/ - lv_obj_t ** screens; /**< Array of screen objects.*/ - lv_obj_t * sys_layer; /**< @see lv_display_get_layer_sys*/ - lv_obj_t * top_layer; /**< @see lv_display_get_layer_top*/ - lv_obj_t * act_scr; /**< Currently active screen on this display*/ - lv_obj_t * bottom_layer;/**< @see lv_display_get_layer_bottom*/ - lv_obj_t * prev_scr; /**< Previous screen. Used during screen animations*/ - lv_obj_t * scr_to_load; /**< The screen prepared to load in lv_screen_load_anim*/ - uint32_t screen_cnt; - uint8_t draw_prev_over_act : 1;/** 1: Draw previous screen over active screen*/ - uint8_t del_prev : 1; /** 1: Automatically delete the previous screen when the screen load animation is ready*/ - - /*--------------------- - * Others - *--------------------*/ - - void * driver_data; /**< Custom user data*/ - - void * user_data; /**< Custom user data*/ - - lv_event_list_t event_list; - - uint32_t rotation : 3; /**< Element of lv_display_rotation_t*/ - - lv_theme_t * theme; /**< The theme assigned to the screen*/ - - /** A timer which periodically checks the dirty areas and refreshes them*/ - lv_timer_t * refr_timer; - - /*Miscellaneous data*/ - uint32_t last_activity_time; /**< Last time when there was activity on this display*/ - - /** The area being refreshed*/ - lv_area_t refreshed_area; - -#if LV_USE_PERF_MONITOR - lv_obj_t * perf_label; - lv_sysmon_backend_data_t perf_sysmon_backend; - lv_sysmon_perf_info_t perf_sysmon_info; -#endif - -#if LV_USE_MEM_MONITOR - lv_obj_t * mem_label; -#endif - -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DISPLAY_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw.c b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw.c deleted file mode 100644 index dbaec70..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw.c +++ /dev/null @@ -1,505 +0,0 @@ -/** - * @file lv_draw.c - * - */ - -/** - * Modified by NXP in 2024 - */ - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_area_private.h" -#include "lv_draw_private.h" -#include "sw/lv_draw_sw.h" -#include "../display/lv_display_private.h" -#include "../core/lv_global.h" -#include "../core/lv_refr_private.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define _draw_info LV_GLOBAL_DEFAULT()->draw_info - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool is_independent(lv_layer_t * layer, lv_draw_task_t * t_check); - -static inline uint32_t get_layer_size_kb(uint32_t size_byte) -{ - return size_byte < 1024 ? 1 : size_byte >> 10; -} -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_init(void) -{ -#if LV_USE_OS - lv_thread_sync_init(&_draw_info.sync); -#endif -} - -void lv_draw_deinit(void) -{ -#if LV_USE_OS - lv_thread_sync_delete(&_draw_info.sync); -#endif - - lv_draw_unit_t * u = _draw_info.unit_head; - while(u) { - lv_draw_unit_t * cur_unit = u; - u = u->next; - - if(cur_unit->delete_cb) cur_unit->delete_cb(cur_unit); - lv_free(cur_unit); - } - _draw_info.unit_head = NULL; -} - -void * lv_draw_create_unit(size_t size) -{ - lv_draw_unit_t * new_unit = lv_malloc_zeroed(size); - - new_unit->next = _draw_info.unit_head; - _draw_info.unit_head = new_unit; - _draw_info.unit_cnt++; - - return new_unit; -} - -lv_draw_task_t * lv_draw_add_task(lv_layer_t * layer, const lv_area_t * coords) -{ - LV_PROFILER_BEGIN; - lv_draw_task_t * new_task = lv_malloc_zeroed(sizeof(lv_draw_task_t)); - - new_task->area = *coords; - new_task->_real_area = *coords; - new_task->clip_area = layer->_clip_area; -#if LV_DRAW_TRANSFORM_USE_MATRIX - new_task->matrix = layer->matrix; -#endif - new_task->state = LV_DRAW_TASK_STATE_QUEUED; - - /*Find the tail*/ - if(layer->draw_task_head == NULL) { - layer->draw_task_head = new_task; - } - else { - lv_draw_task_t * tail = layer->draw_task_head; - while(tail->next) tail = tail->next; - - tail->next = new_task; - } - - LV_PROFILER_END; - return new_task; -} - -void lv_draw_finalize_task_creation(lv_layer_t * layer, lv_draw_task_t * t) -{ - LV_PROFILER_BEGIN; - lv_draw_dsc_base_t * base_dsc = t->draw_dsc; - base_dsc->layer = layer; - - lv_draw_global_info_t * info = &_draw_info; - - /*Send LV_EVENT_DRAW_TASK_ADDED and dispatch only on the "main" draw_task - *and not on the draw tasks added in the event. - *Sending LV_EVENT_DRAW_TASK_ADDED events might cause recursive event sends and besides - *dispatching might remove the "main" draw task while it's still being used in the event*/ - - if(info->task_running == false) { - if(base_dsc->obj && lv_obj_has_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS)) { - info->task_running = true; - lv_obj_send_event(base_dsc->obj, LV_EVENT_DRAW_TASK_ADDED, t); - info->task_running = false; - } - - /*Let the draw units set their preference score*/ - t->preference_score = 100; - t->preferred_draw_unit_id = 0; - lv_draw_unit_t * u = info->unit_head; - while(u) { - if(u->evaluate_cb) u->evaluate_cb(u, t); - u = u->next; - } - - lv_draw_dispatch(); - } - else { - /*Let the draw units set their preference score*/ - t->preference_score = 100; - t->preferred_draw_unit_id = 0; - lv_draw_unit_t * u = info->unit_head; - while(u) { - if(u->evaluate_cb) u->evaluate_cb(u, t); - u = u->next; - } - } - LV_PROFILER_END; -} - -void lv_draw_wait_for_finish(void) -{ -#if LV_USE_OS - lv_draw_unit_t * u = _draw_info.unit_head; - while(u) { - if(u->wait_for_finish_cb) - u->wait_for_finish_cb(u); - u = u->next; - } -#endif -} - -void lv_draw_dispatch(void) -{ - LV_PROFILER_BEGIN; - bool task_dispatched = false; - lv_display_t * disp = lv_display_get_next(NULL); - while(disp) { - lv_layer_t * layer = disp->layer_head; - while(layer) { - if(lv_draw_dispatch_layer(disp, layer)) - task_dispatched = true; - layer = layer->next; - } - if(!task_dispatched) { - lv_draw_wait_for_finish(); - lv_draw_dispatch_request(); - } - disp = lv_display_get_next(disp); - } - LV_PROFILER_END; -} - -bool lv_draw_dispatch_layer(lv_display_t * disp, lv_layer_t * layer) -{ - LV_PROFILER_BEGIN; - /*Remove the finished tasks first*/ - lv_draw_task_t * t_prev = NULL; - lv_draw_task_t * t = layer->draw_task_head; - while(t) { - lv_draw_task_t * t_next = t->next; - if(t->state == LV_DRAW_TASK_STATE_READY) { - if(t_prev) t_prev->next = t->next; /*Remove it by assigning the next task to the previous*/ - else layer->draw_task_head = t_next; /*If it was the head, set the next as head*/ - - /*If it was layer drawing free the layer too*/ - if(t->type == LV_DRAW_TASK_TYPE_LAYER) { - lv_draw_image_dsc_t * draw_image_dsc = t->draw_dsc; - lv_layer_t * layer_drawn = (lv_layer_t *)draw_image_dsc->src; - - if(layer_drawn->draw_buf) { - int32_t h = lv_area_get_height(&layer_drawn->buf_area); - uint32_t layer_size_byte = h * layer_drawn->draw_buf->header.stride; - - _draw_info.used_memory_for_layers_kb -= get_layer_size_kb(layer_size_byte); - LV_LOG_INFO("Layer memory used: %" LV_PRIu32 " kB\n", _draw_info.used_memory_for_layers_kb); - lv_draw_buf_destroy(layer_drawn->draw_buf); - layer_drawn->draw_buf = NULL; - } - - /*Remove the layer from the display's*/ - if(disp) { - lv_layer_t * l2 = disp->layer_head; - while(l2) { - if(l2->next == layer_drawn) { - l2->next = layer_drawn->next; - break; - } - l2 = l2->next; - } - - if(disp->layer_deinit) disp->layer_deinit(disp, layer_drawn); - lv_free(layer_drawn); - } - } - lv_draw_label_dsc_t * draw_label_dsc = lv_draw_task_get_label_dsc(t); - if(draw_label_dsc && draw_label_dsc->text_local) { - lv_free((void *)draw_label_dsc->text); - draw_label_dsc->text = NULL; - } - - lv_free(t->draw_dsc); - lv_free(t); - } - else { - t_prev = t; - } - t = t_next; - } - - bool task_dispatched = false; - - /*This layer is ready, enable blending its buffer*/ - if(layer->parent && layer->all_tasks_added && layer->draw_task_head == NULL) { - /*Find a draw task with TYPE_LAYER in the layer where the src is this layer*/ - lv_draw_task_t * t_src = layer->parent->draw_task_head; - while(t_src) { - if(t_src->type == LV_DRAW_TASK_TYPE_LAYER && t_src->state == LV_DRAW_TASK_STATE_WAITING) { - lv_draw_image_dsc_t * draw_dsc = t_src->draw_dsc; - if(draw_dsc->src == layer) { - t_src->state = LV_DRAW_TASK_STATE_QUEUED; - lv_draw_dispatch_request(); - break; - } - } - t_src = t_src->next; - } - } - /*Assign draw tasks to the draw_units*/ - else { - /*Find a draw unit which is not busy and can take at least one task*/ - /*Let all draw units to pick draw tasks*/ - lv_draw_unit_t * u = _draw_info.unit_head; - while(u) { - int32_t taken_cnt = u->dispatch_cb(u, layer); - if(taken_cnt != LV_DRAW_UNIT_IDLE) task_dispatched = true; - u = u->next; - } - } - - LV_PROFILER_END; - return task_dispatched; -} - -void lv_draw_dispatch_wait_for_request(void) -{ -#if LV_USE_OS - lv_thread_sync_wait(&_draw_info.sync); -#else - while(!_draw_info.dispatch_req); - _draw_info.dispatch_req = 0; -#endif -} - -void lv_draw_dispatch_request(void) -{ -#if LV_USE_OS - lv_thread_sync_signal(&_draw_info.sync); -#else - _draw_info.dispatch_req = 1; -#endif -} - -uint32_t lv_draw_get_unit_count(void) -{ - return _draw_info.unit_cnt; -} - -lv_draw_task_t * lv_draw_get_next_available_task(lv_layer_t * layer, lv_draw_task_t * t_prev, uint8_t draw_unit_id) -{ - LV_PROFILER_BEGIN; - - /* If there is only 1 draw unit the task can be consumed linearly as - * they are added in the correct order. However, it can happen that - * there is a `LV_DRAW_TASK_TYPE_LAYER` which can be blended only when - * all its tasks are ready. As other areas might be on top of that - * layer-to-blend don't skip it. Instead stop there, so that the - * draw tasks of that layer can be consumed and can be finished. - * After that this layer-to-blenf will have `LV_DRAW_TASK_STATE_QUEUED` - * so it can be blended normally.*/ - if(_draw_info.unit_cnt <= 1) { - lv_draw_task_t * t = layer->draw_task_head; - while(t) { - /*Mark unsupported draw tasks as ready as no one else will consume them*/ - if(t->state == LV_DRAW_TASK_STATE_QUEUED && - t->preferred_draw_unit_id != LV_DRAW_UNIT_NONE && - t->preferred_draw_unit_id != draw_unit_id) { - t->state = LV_DRAW_TASK_STATE_READY; - } - /*Not queued yet, leave this layer while the first task will be queued*/ - else if(t->state != LV_DRAW_TASK_STATE_QUEUED) { - t = NULL; - break; - } - /*It's a supported and queued task, process it*/ - else { - break; - } - t = t->next; - } - LV_PROFILER_END; - return t; - } - - /*Handle the case of multiply draw units*/ - - /*If the first task is screen sized, there cannot be independent areas*/ - if(layer->draw_task_head) { - int32_t hor_res = lv_display_get_horizontal_resolution(lv_refr_get_disp_refreshing()); - int32_t ver_res = lv_display_get_vertical_resolution(lv_refr_get_disp_refreshing()); - lv_draw_task_t * t = layer->draw_task_head; - if(t->state != LV_DRAW_TASK_STATE_QUEUED && - t->area.x1 <= 0 && t->area.x2 >= hor_res - 1 && - t->area.y1 <= 0 && t->area.y2 >= ver_res - 1) { - LV_PROFILER_END; - return NULL; - } - } - - lv_draw_task_t * t = t_prev ? t_prev->next : layer->draw_task_head; - while(t) { - /*Find a queued and independent task*/ - if(t->state == LV_DRAW_TASK_STATE_QUEUED && - (t->preferred_draw_unit_id == LV_DRAW_UNIT_NONE || t->preferred_draw_unit_id == draw_unit_id) && - is_independent(layer, t)) { - LV_PROFILER_END; - return t; - } - t = t->next; - } - - LV_PROFILER_END; - return NULL; -} - -uint32_t lv_draw_get_dependent_count(lv_draw_task_t * t_check) -{ - if(t_check == NULL) return 0; - if(t_check->next == NULL) return 0; - - LV_PROFILER_BEGIN; - uint32_t cnt = 0; - - lv_draw_task_t * t = t_check->next; - while(t) { - if((t->state == LV_DRAW_TASK_STATE_QUEUED || t->state == LV_DRAW_TASK_STATE_WAITING) && - lv_area_is_on(&t_check->area, &t->area)) { - cnt++; - } - - t = t->next; - } - LV_PROFILER_END; - return cnt; -} - -lv_layer_t * lv_draw_layer_create(lv_layer_t * parent_layer, lv_color_format_t color_format, const lv_area_t * area) -{ - lv_display_t * disp = lv_refr_get_disp_refreshing(); - lv_layer_t * new_layer = lv_malloc_zeroed(sizeof(lv_layer_t)); - LV_ASSERT_MALLOC(new_layer); - if(new_layer == NULL) return NULL; - - new_layer->parent = parent_layer; - new_layer->_clip_area = *area; - new_layer->buf_area = *area; - new_layer->phy_clip_area = *area; - new_layer->color_format = color_format; - -#if LV_DRAW_TRANSFORM_USE_MATRIX - lv_matrix_identity(&new_layer->matrix); -#endif - - if(disp->layer_head) { - lv_layer_t * tail = disp->layer_head; - while(tail->next) tail = tail->next; - tail->next = new_layer; - } - else { - disp->layer_head = new_layer; - } - - return new_layer; -} - -void * lv_draw_layer_alloc_buf(lv_layer_t * layer) -{ - /*If the buffer of the layer is already allocated return it*/ - if(layer->draw_buf != NULL) { - return layer->draw_buf->data; - } - - /*If the buffer of the layer is not allocated yet, allocate it now*/ - int32_t w = lv_area_get_width(&layer->buf_area); - int32_t h = lv_area_get_height(&layer->buf_area); - uint32_t layer_size_byte = h * lv_draw_buf_width_to_stride(w, layer->color_format); - - layer->draw_buf = lv_draw_buf_create(w, h, layer->color_format, 0); - - if(layer->draw_buf == NULL) { - LV_LOG_WARN("Allocating layer buffer failed. Try later"); - return NULL; - } - - _draw_info.used_memory_for_layers_kb += get_layer_size_kb(layer_size_byte); - LV_LOG_INFO("Layer memory used: %" LV_PRIu32 " kB\n", _draw_info.used_memory_for_layers_kb); - - if(lv_color_format_has_alpha(layer->color_format)) { - lv_draw_buf_clear(layer->draw_buf, NULL); - } - - return layer->draw_buf->data; -} - -void * lv_draw_layer_go_to_xy(lv_layer_t * layer, int32_t x, int32_t y) -{ - return lv_draw_buf_goto_xy(layer->draw_buf, x, y); -} - -lv_draw_task_type_t lv_draw_task_get_type(const lv_draw_task_t * t) -{ - return t->type; -} - -void * lv_draw_task_get_draw_dsc(const lv_draw_task_t * t) -{ - return t->draw_dsc; -} - -void lv_draw_task_get_area(const lv_draw_task_t * t, lv_area_t * area) -{ - *area = t->area; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Check if there are older draw task overlapping the area of `t_check` - * @param layer the draw ctx to search in - * @param t_check check this task if it overlaps with the older ones - * @return true: `t_check` is not overlapping with older tasks so it's independent - */ -static bool is_independent(lv_layer_t * layer, lv_draw_task_t * t_check) -{ - LV_PROFILER_BEGIN; - lv_draw_task_t * t = layer->draw_task_head; - - /*If t_check is outside of the older tasks then it's independent*/ - while(t && t != t_check) { - if(t->state != LV_DRAW_TASK_STATE_READY) { - lv_area_t a; - if(lv_area_intersect(&a, &t->_real_area, &t_check->_real_area)) { - LV_PROFILER_END; - return false; - } - } - t = t->next; - } - LV_PROFILER_END; - - return true; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw.h deleted file mode 100644 index 2985267..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw.h +++ /dev/null @@ -1,272 +0,0 @@ -/** - * @file lv_draw.h - * - */ - -/** - * Modified by NXP in 2024 - */ - -#ifndef LV_DRAW_H -#define LV_DRAW_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" - -#include "../misc/lv_types.h" -#include "../misc/lv_style.h" -#include "../misc/lv_text.h" -#include "../misc/lv_profiler.h" -#include "../misc/lv_matrix.h" -#include "lv_image_decoder.h" -#include "../osal/lv_os.h" -#include "lv_draw_buf.h" - -/********************* - * DEFINES - *********************/ -#define LV_DRAW_UNIT_NONE 0 -#define LV_DRAW_UNIT_IDLE -1 /**< The draw unit is idle, new dispatching might be requested to try again */ - -#if LV_DRAW_TRANSFORM_USE_MATRIX -#if !LV_USE_MATRIX -#error "LV_DRAW_TRANSFORM_USE_MATRIX requires LV_USE_MATRIX = 1" -#endif -#endif - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - LV_DRAW_TASK_TYPE_NONE = 0, - LV_DRAW_TASK_TYPE_FILL, - LV_DRAW_TASK_TYPE_BORDER, - LV_DRAW_TASK_TYPE_BOX_SHADOW, - LV_DRAW_TASK_TYPE_LABEL, - LV_DRAW_TASK_TYPE_IMAGE, - LV_DRAW_TASK_TYPE_LAYER, - LV_DRAW_TASK_TYPE_LINE, - LV_DRAW_TASK_TYPE_ARC, - LV_DRAW_TASK_TYPE_TRIANGLE, - LV_DRAW_TASK_TYPE_MASK_RECTANGLE, - LV_DRAW_TASK_TYPE_MASK_BITMAP, - LV_DRAW_TASK_TYPE_VECTOR, -} lv_draw_task_type_t; - -typedef enum { - LV_DRAW_TASK_STATE_WAITING, /*Waiting for something to be finished. E.g. rendering a layer*/ - LV_DRAW_TASK_STATE_QUEUED, - LV_DRAW_TASK_STATE_IN_PROGRESS, - LV_DRAW_TASK_STATE_READY, -} lv_draw_task_state_t; - -struct lv_layer_t { - - /** Target draw buffer of the layer*/ - lv_draw_buf_t * draw_buf; - - /** The absolute coordinates of the buffer */ - lv_area_t buf_area; - - /** The color format of the layer. LV_COLOR_FORMAT_... */ - lv_color_format_t color_format; - - /** - * NEVER USE IT DRAW UNITS. USED INTERNALLY DURING DRAW TASK CREATION. - * The current clip area with absolute coordinates, always the same or smaller than `buf_area` - * Can be set before new draw tasks are added to indicate the clip area of the draw tasks. - * Therefore `lv_draw_add_task()` always saves it in the new draw task to know the clip area when the draw task was added. - * During drawing the draw units also sees the saved clip_area and should use it during drawing. - * During drawing the layer's clip area shouldn't be used as it might be already changed for other draw tasks. - */ - lv_area_t _clip_area; - - /** - * The physical clipping area relative to the display. - */ - lv_area_t phy_clip_area; - -#if LV_DRAW_TRANSFORM_USE_MATRIX - /** Transform matrix to be applied when rendering the layer */ - lv_matrix_t matrix; -#endif - - /** Linked list of draw tasks */ - lv_draw_task_t * draw_task_head; - - lv_layer_t * parent; - lv_layer_t * next; - bool all_tasks_added; - void * user_data; -}; - -typedef struct { - lv_obj_t * obj; - lv_part_t part; - uint32_t id1; - uint32_t id2; - lv_layer_t * layer; - size_t dsc_size; - void * user_data; -} lv_draw_dsc_base_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Used internally to initialize the drawing module - */ -void lv_draw_init(void); - -/** - * Deinitialize the drawing module - */ -void lv_draw_deinit(void); - -/** - * Allocate a new draw unit with the given size and appends it to the list of draw units - * @param size the size to allocate. E.g. `sizeof(my_draw_unit_t)`, - * where the first element of `my_draw_unit_t` is `lv_draw_unit_t`. - */ -void * lv_draw_create_unit(size_t size); - -/** - * Add an empty draw task to the draw task list of a layer. - * @param layer pointer to a layer - * @param coords the coordinates of the draw task - * @return the created draw task which needs to be - * further configured e.g. by added a draw descriptor - */ -lv_draw_task_t * lv_draw_add_task(lv_layer_t * layer, const lv_area_t * coords); - -/** - * Needs to be called when a draw task is created and configured. - * It will send an event about the new draw task to the widget - * and assign it to a draw unit. - * @param layer pointer to a layer - * @param t pointer to a draw task - */ -void lv_draw_finalize_task_creation(lv_layer_t * layer, lv_draw_task_t * t); - -/** - * Try dispatching draw tasks to draw units - */ -void lv_draw_dispatch(void); - -/** - * Used internally to try dispatching draw tasks of a specific layer - * @param disp pointer to a display on which the dispatching was requested - * @param layer pointer to a layer - * @return at least one draw task is being rendered (maybe it was taken earlier) - */ -bool lv_draw_dispatch_layer(lv_display_t * disp, lv_layer_t * layer); - -/** - * Wait for a new dispatch request. - * It's blocking if `LV_USE_OS == 0` else it yields - */ -void lv_draw_dispatch_wait_for_request(void); - -/** - * Wait for draw finish in case of asynchronous task execution. - * If `LV_USE_OS == 0` it just return. - */ -void lv_draw_wait_for_finish(void); - -/** - * When a draw unit finished a draw task it needs to request dispatching - * to let LVGL assign a new draw task to it - */ -void lv_draw_dispatch_request(void); - -/** - * Get the total number of draw units. - */ -uint32_t lv_draw_get_unit_count(void); - -/** - * Find and available draw task - * @param layer the draw ctx to search in - * @param t_prev continue searching from this task - * @param draw_unit_id check the task where `preferred_draw_unit_id` equals this value or `LV_DRAW_UNIT_NONE` - * @return tan available draw task or NULL if there is no any - */ -lv_draw_task_t * lv_draw_get_next_available_task(lv_layer_t * layer, lv_draw_task_t * t_prev, uint8_t draw_unit_id); - -/** - * Tell how many draw task are waiting to be drawn on the area of `t_check`. - * It can be used to determine if a GPU shall combine many draw tasks into one or not. - * If a lot of tasks are waiting for the current ones it makes sense to draw them one-by-one - * to not block the dependent tasks' rendering - * @param t_check the task whose dependent tasks shall be counted - * @return number of tasks depending on `t_check` - */ -uint32_t lv_draw_get_dependent_count(lv_draw_task_t * t_check); - -/** - * Create a new layer on a parent layer - * @param parent_layer the parent layer to which the layer will be merged when it's rendered - * @param color_format the color format of the layer - * @param area the areas of the layer (absolute coordinates) - * @return the new target_layer or NULL on error - */ -lv_layer_t * lv_draw_layer_create(lv_layer_t * parent_layer, lv_color_format_t color_format, const lv_area_t * area); - -/** - * Try to allocate a buffer for the layer. - * @param layer pointer to a layer - * @return pointer to the allocated aligned buffer or NULL on failure - */ -void * lv_draw_layer_alloc_buf(lv_layer_t * layer); - -/** - * Got to a pixel at X and Y coordinate on a layer - * @param layer pointer to a layer - * @param x the target X coordinate - * @param y the target X coordinate - * @return `buf` offset to point to the given X and Y coordinate - */ -void * lv_draw_layer_go_to_xy(lv_layer_t * layer, int32_t x, int32_t y); - -/** - * Get the type of a draw task - * @param t the draw task to get the type of - * @return the draw task type -*/ -lv_draw_task_type_t lv_draw_task_get_type(const lv_draw_task_t * t); - -/** - * Get the draw descriptor of a draw task - * @param t the draw task to get the draw descriptor of - * @return a void pointer to the draw descriptor -*/ -void * lv_draw_task_get_draw_dsc(const lv_draw_task_t * t); - -/** - * Get the draw area of a draw task - * @param t the draw task to get the draw area of - * @param area the destination where the draw area will be stored -*/ -void lv_draw_task_get_area(const lv_draw_task_t * t, lv_area_t * area); - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_arc.c b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_arc.c deleted file mode 100644 index f092ea7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_arc.c +++ /dev/null @@ -1,174 +0,0 @@ -/** - * @file lv_draw_arc.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_private.h" -#include "../core/lv_obj.h" -#include "lv_draw_arc.h" -#include "../core/lv_obj_event.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_arc_dsc_init(lv_draw_arc_dsc_t * dsc) -{ - lv_memzero(dsc, sizeof(lv_draw_arc_dsc_t)); - dsc->width = 1; - dsc->opa = LV_OPA_COVER; - dsc->color = lv_color_black(); - dsc->base.dsc_size = sizeof(lv_draw_arc_dsc_t); -} - -lv_draw_arc_dsc_t * lv_draw_task_get_arc_dsc(lv_draw_task_t * task) -{ - return task->type == LV_DRAW_TASK_TYPE_ARC ? (lv_draw_arc_dsc_t *)task->draw_dsc : NULL; -} - -void lv_draw_arc(lv_layer_t * layer, const lv_draw_arc_dsc_t * dsc) -{ - if(dsc->opa <= LV_OPA_MIN) return; - if(dsc->width == 0) return; - if(dsc->start_angle == dsc->end_angle) return; - - LV_PROFILER_BEGIN; - lv_area_t a; - a.x1 = dsc->center.x - dsc->radius; - a.y1 = dsc->center.y - dsc->radius; - a.x2 = dsc->center.x + dsc->radius - 1; - a.y2 = dsc->center.y + dsc->radius - 1; - lv_draw_task_t * t = lv_draw_add_task(layer, &a); - - t->draw_dsc = lv_malloc(sizeof(*dsc)); - lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); - t->type = LV_DRAW_TASK_TYPE_ARC; - - lv_draw_finalize_task_creation(layer, t); - - LV_PROFILER_END; -} - -void lv_draw_arc_get_area(int32_t x, int32_t y, uint16_t radius, lv_value_precise_t start_angle, - lv_value_precise_t end_angle, - int32_t w, bool rounded, lv_area_t * area) -{ - int32_t rout = radius; - int32_t start_angle_int = (int32_t) start_angle; - int32_t end_angle_int = (int32_t) end_angle; - - /*Special case: full arc invalidation */ - if(end_angle_int == start_angle_int + 360) { - area->x1 = x - rout; - area->y1 = y - rout; - area->x2 = x + rout; - area->y2 = y + rout; - return; - } - - if(start_angle_int > 360) start_angle_int -= 360; - if(end_angle_int > 360) end_angle_int -= 360; - - int32_t rin = radius - w; - int32_t extra_area = rounded ? w / 2 + 1 : 0; - uint8_t start_quarter = start_angle_int / 90; - uint8_t end_quarter = end_angle_int / 90; - - /*360 deg still counts as quarter 3 (360 / 90 would be 4)*/ - if(start_quarter == 4) start_quarter = 3; - if(end_quarter == 4) end_quarter = 3; - - if(start_quarter == end_quarter && start_angle_int <= end_angle_int) { - if(start_quarter == 0) { - area->y1 = y + ((lv_trigo_sin(start_angle_int) * rin) >> LV_TRIGO_SHIFT) - extra_area; - area->x2 = x + ((lv_trigo_sin(start_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; - - area->y2 = y + ((lv_trigo_sin(end_angle_int) * rout) >> LV_TRIGO_SHIFT) + extra_area; - area->x1 = x + ((lv_trigo_sin(end_angle_int + 90) * rin) >> LV_TRIGO_SHIFT) - extra_area; - } - else if(start_quarter == 1) { - area->y2 = y + ((lv_trigo_sin(start_angle_int) * rout) >> LV_TRIGO_SHIFT) + extra_area; - area->x2 = x + ((lv_trigo_sin(start_angle_int + 90) * rin) >> LV_TRIGO_SHIFT) + extra_area; - - area->y1 = y + ((lv_trigo_sin(end_angle_int) * rin) >> LV_TRIGO_SHIFT) - extra_area; - area->x1 = x + ((lv_trigo_sin(end_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; - } - else if(start_quarter == 2) { - area->x1 = x + ((lv_trigo_sin(start_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; - area->y2 = y + ((lv_trigo_sin(start_angle_int) * rin) >> LV_TRIGO_SHIFT) + extra_area; - - area->y1 = y + ((lv_trigo_sin(end_angle_int) * rout) >> LV_TRIGO_SHIFT) - extra_area; - area->x2 = x + ((lv_trigo_sin(end_angle_int + 90) * rin) >> LV_TRIGO_SHIFT) + extra_area; - } - else if(start_quarter == 3) { - area->x1 = x + ((lv_trigo_sin(start_angle_int + 90) * rin) >> LV_TRIGO_SHIFT) - extra_area; - area->y1 = y + ((lv_trigo_sin(start_angle_int) * rout) >> LV_TRIGO_SHIFT) - extra_area; - - area->x2 = x + ((lv_trigo_sin(end_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; - area->y2 = y + ((lv_trigo_sin(end_angle_int) * rin) >> LV_TRIGO_SHIFT) + extra_area; - } - } - else if(start_quarter == 0 && end_quarter == 1) { - area->x1 = x + ((lv_trigo_sin(end_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; - area->y1 = y + ((LV_MIN(lv_trigo_sin(end_angle_int), - lv_trigo_sin(start_angle_int)) * rin) >> LV_TRIGO_SHIFT) - extra_area; - area->x2 = x + ((lv_trigo_sin(start_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; - area->y2 = y + rout + extra_area; - } - else if(start_quarter == 1 && end_quarter == 2) { - area->x1 = x - rout - extra_area; - area->y1 = y + ((lv_trigo_sin(end_angle_int) * rout) >> LV_TRIGO_SHIFT) - extra_area; - area->x2 = x + ((LV_MAX(lv_trigo_sin(start_angle_int + 90), - lv_trigo_sin(end_angle_int + 90)) * rin) >> LV_TRIGO_SHIFT) + extra_area; - area->y2 = y + ((lv_trigo_sin(start_angle_int) * rout) >> LV_TRIGO_SHIFT) + extra_area; - } - else if(start_quarter == 2 && end_quarter == 3) { - area->x1 = x + ((lv_trigo_sin(start_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; - area->y1 = y - rout - extra_area; - area->x2 = x + ((lv_trigo_sin(end_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; - area->y2 = y + (LV_MAX(lv_trigo_sin(end_angle_int) * rin, - lv_trigo_sin(start_angle_int) * rin) >> LV_TRIGO_SHIFT) + extra_area; - } - else if(start_quarter == 3 && end_quarter == 0) { - area->x1 = x + ((LV_MIN(lv_trigo_sin(end_angle_int + 90), - lv_trigo_sin(start_angle_int + 90)) * rin) >> LV_TRIGO_SHIFT) - extra_area; - area->y1 = y + ((lv_trigo_sin(start_angle_int) * rout) >> LV_TRIGO_SHIFT) - extra_area; - area->x2 = x + rout + extra_area; - area->y2 = y + ((lv_trigo_sin(end_angle_int) * rout) >> LV_TRIGO_SHIFT) + extra_area; - - } - else { - area->x1 = x - rout; - area->y1 = y - rout; - area->x2 = x + rout; - area->y2 = y + rout; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_arc.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_arc.h deleted file mode 100644 index 726bd68..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_arc.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - * @file lv_draw_arc.h - * - */ - -#ifndef LV_DRAW_ARC_H -#define LV_DRAW_ARC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "../misc/lv_color.h" -#include "../misc/lv_area.h" -#include "../misc/lv_style.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_draw_dsc_base_t base; - - lv_color_t color; - int32_t width; - lv_value_precise_t start_angle; - lv_value_precise_t end_angle; - lv_point_t center; - uint16_t radius; - const void * img_src; - lv_opa_t opa; - uint8_t rounded : 1; -} lv_draw_arc_dsc_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize an arc draw descriptor. - * @param dsc pointer to a draw descriptor - */ -void lv_draw_arc_dsc_init(lv_draw_arc_dsc_t * dsc); - -/** - * Try to get an arc draw descriptor from a draw task. - * @param task draw task - * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_ARC - */ -lv_draw_arc_dsc_t * lv_draw_task_get_arc_dsc(lv_draw_task_t * task); - -/** - * Create an arc draw task. - * @param layer pointer to a layer - * @param dsc pointer to an initialized draw descriptor variable - */ -void lv_draw_arc(lv_layer_t * layer, const lv_draw_arc_dsc_t * dsc); - -/** - * Get an area the should be invalidated when the arcs angle changed between start_angle and end_ange - * @param x the x coordinate of the center of the arc - * @param y the y coordinate of the center of the arc - * @param radius the radius of the arc - * @param start_angle the start angle of the arc (0 deg on the bottom, 90 deg on the right) - * @param end_angle the end angle of the arc - * @param w width of the arc - * @param rounded true: the arc is rounded - * @param area store the area to invalidate here - */ -void lv_draw_arc_get_area(int32_t x, int32_t y, uint16_t radius, lv_value_precise_t start_angle, - lv_value_precise_t end_angle, - int32_t w, bool rounded, lv_area_t * area); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_ARC_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_buf.c b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_buf.c deleted file mode 100644 index a6dc29b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_buf.c +++ /dev/null @@ -1,669 +0,0 @@ -/** - * @file lv_draw_buf.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_buf_private.h" -#include "../misc/lv_types.h" -#include "../stdlib/lv_string.h" -#include "../core/lv_global.h" -#include "../misc/lv_math.h" -#include "../misc/lv_area_private.h" - -/********************* - * DEFINES - *********************/ -#define default_handlers LV_GLOBAL_DEFAULT()->draw_buf_handlers -#define font_draw_buf_handlers LV_GLOBAL_DEFAULT()->font_draw_buf_handlers -#define image_cache_draw_buf_handlers LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void * buf_malloc(size_t size, lv_color_format_t color_format); -static void buf_free(void * buf); -static void * buf_align(void * buf, lv_color_format_t color_format); -static void * draw_buf_malloc(const lv_draw_buf_handlers_t * handler, size_t size_bytes, - lv_color_format_t color_format); -static void draw_buf_free(const lv_draw_buf_handlers_t * handler, void * buf); -static uint32_t width_to_stride(uint32_t w, lv_color_format_t color_format); -static uint32_t _calculate_draw_buf_size(uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride); -static void draw_buf_get_full_area(const lv_draw_buf_t * draw_buf, lv_area_t * full_area); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_buf_init_handlers(void) -{ - lv_draw_buf_init_with_default_handlers(&default_handlers); - lv_draw_buf_init_with_default_handlers(&font_draw_buf_handlers); - lv_draw_buf_init_with_default_handlers(&image_cache_draw_buf_handlers); -} - -void lv_draw_buf_init_with_default_handlers(lv_draw_buf_handlers_t * handlers) -{ - lv_draw_buf_handlers_init(handlers, buf_malloc, buf_free, buf_align, NULL, NULL, width_to_stride); -} - -void lv_draw_buf_handlers_init(lv_draw_buf_handlers_t * handlers, - lv_draw_buf_malloc_cb buf_malloc_cb, - lv_draw_buf_free_cb buf_free_cb, - lv_draw_buf_align_cb align_pointer_cb, - lv_draw_buf_cache_operation_cb invalidate_cache_cb, - lv_draw_buf_cache_operation_cb flush_cache_cb, - lv_draw_buf_width_to_stride_cb width_to_stride_cb) -{ - lv_memzero(handlers, sizeof(lv_draw_buf_handlers_t)); - handlers->buf_malloc_cb = buf_malloc_cb; - handlers->buf_free_cb = buf_free_cb; - handlers->align_pointer_cb = align_pointer_cb; - handlers->invalidate_cache_cb = invalidate_cache_cb; - handlers->flush_cache_cb = flush_cache_cb; - handlers->width_to_stride_cb = width_to_stride_cb; -} - -lv_draw_buf_handlers_t * lv_draw_buf_get_handlers(void) -{ - return &default_handlers; -} - -lv_draw_buf_handlers_t * lv_draw_buf_get_font_handlers(void) -{ - return &font_draw_buf_handlers; -} - -lv_draw_buf_handlers_t * lv_draw_buf_get_image_handlers(void) -{ - return &image_cache_draw_buf_handlers; -} - -uint32_t lv_draw_buf_width_to_stride(uint32_t w, lv_color_format_t color_format) -{ - return lv_draw_buf_width_to_stride_ex(&default_handlers, w, color_format); -} - -uint32_t lv_draw_buf_width_to_stride_ex(const lv_draw_buf_handlers_t * handlers, uint32_t w, - lv_color_format_t color_format) -{ - if(handlers->width_to_stride_cb) return handlers->width_to_stride_cb(w, color_format); - else return 0; -} - -void * lv_draw_buf_align(void * data, lv_color_format_t color_format) -{ - return lv_draw_buf_align_ex(&default_handlers, data, color_format); -} - -void * lv_draw_buf_align_ex(const lv_draw_buf_handlers_t * handlers, void * data, lv_color_format_t color_format) -{ - if(handlers->align_pointer_cb) return handlers->align_pointer_cb(data, color_format); - else return NULL; -} - -void lv_draw_buf_invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) -{ - LV_ASSERT_NULL(draw_buf); - LV_ASSERT_NULL(draw_buf->handlers); - - const lv_draw_buf_handlers_t * handlers = draw_buf->handlers; - if(!handlers->invalidate_cache_cb) { - return; - } - - lv_area_t full; - if(area == NULL) { - draw_buf_get_full_area(draw_buf, &full); - area = &full; - } - - handlers->invalidate_cache_cb(draw_buf, area); -} - -void lv_draw_buf_flush_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) -{ - LV_ASSERT_NULL(draw_buf); - LV_ASSERT_NULL(draw_buf->handlers); - - const lv_draw_buf_handlers_t * handlers = draw_buf->handlers; - if(!handlers->flush_cache_cb) { - return; - } - - lv_area_t full; - if(area == NULL) { - draw_buf_get_full_area(draw_buf, &full); - area = &full; - } - - handlers->flush_cache_cb(draw_buf, area); -} - -void lv_draw_buf_clear(lv_draw_buf_t * draw_buf, const lv_area_t * a) -{ - LV_ASSERT_NULL(draw_buf); - - const lv_image_header_t * header = &draw_buf->header; - uint32_t stride = header->stride; - - if(a == NULL) { - uint8_t * buf = lv_draw_buf_goto_xy(draw_buf, 0, 0); - lv_memzero(buf, header->h * stride); - return; - } - - lv_area_t a_draw_buf; - a_draw_buf.x1 = 0; - a_draw_buf.y1 = 0; - a_draw_buf.x2 = draw_buf->header.w - 1; - a_draw_buf.y2 = draw_buf->header.h - 1; - - lv_area_t a_clipped; - if(!lv_area_intersect(&a_clipped, a, &a_draw_buf)) return; - if(lv_area_get_width(&a_clipped) <= 0) return; - if(lv_area_get_height(&a_clipped) <= 0) return; - - uint8_t * buf = lv_draw_buf_goto_xy(draw_buf, a_clipped.x1, a_clipped.y1); - uint8_t bpp = lv_color_format_get_bpp(header->cf); - uint32_t line_length = (lv_area_get_width(&a_clipped) * bpp + 7) >> 3; - int32_t y; - for(y = a_clipped.y1; y <= a_clipped.y2; y++) { - lv_memzero(buf, line_length); - buf += stride; - } -} - -void lv_draw_buf_copy(lv_draw_buf_t * dest, const lv_area_t * dest_area, - const lv_draw_buf_t * src, const lv_area_t * src_area) -{ - uint8_t * dest_bufc; - uint8_t * src_bufc; - int32_t line_width; - - /*Source and dest color format must be same. Color conversion is not supported yet.*/ - LV_ASSERT_FORMAT_MSG(dest->header.cf == src->header.cf, "Color format mismatch: %d != %d", - dest->header.cf, src->header.cf); - - if(dest_area == NULL) line_width = dest->header.w; - else line_width = lv_area_get_width(dest_area); - - /* For indexed image, copy the palette if we are copying full image area*/ - if(dest_area == NULL || src_area == NULL) { - if(LV_COLOR_FORMAT_IS_INDEXED(dest->header.cf)) { - lv_memcpy(dest->data, src->data, LV_COLOR_INDEXED_PALETTE_SIZE(dest->header.cf) * sizeof(lv_color32_t)); - } - } - - /*Check source and dest area have same width*/ - if((src_area == NULL && line_width != src->header.w) || \ - (src_area != NULL && line_width != lv_area_get_width(src_area))) { - LV_ASSERT_MSG(0, "Source and destination areas have different width"); - return; - } - - if(src_area) src_bufc = lv_draw_buf_goto_xy(src, src_area->x1, src_area->y1); - else src_bufc = lv_draw_buf_goto_xy(src, 0, 0); - - if(dest_area) dest_bufc = lv_draw_buf_goto_xy(dest, dest_area->x1, dest_area->y1); - else dest_bufc = lv_draw_buf_goto_xy(dest, 0, 0); - - int32_t start_y, end_y; - if(dest_area) { - start_y = dest_area->y1; - end_y = dest_area->y2; - } - else { - start_y = 0; - end_y = dest->header.h - 1; - } - - uint32_t dest_stride = dest->header.stride; - uint32_t src_stride = src->header.stride; - uint32_t line_bytes = (line_width * lv_color_format_get_bpp(dest->header.cf) + 7) >> 3; - - for(; start_y <= end_y; start_y++) { - lv_memcpy(dest_bufc, src_bufc, line_bytes); - dest_bufc += dest_stride; - src_bufc += src_stride; - } -} - -lv_result_t lv_draw_buf_init(lv_draw_buf_t * draw_buf, uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride, - void * data, uint32_t data_size) -{ - LV_ASSERT_NULL(draw_buf); - if(draw_buf == NULL) return LV_RESULT_INVALID; - - lv_memzero(draw_buf, sizeof(lv_draw_buf_t)); - if(stride == 0) stride = lv_draw_buf_width_to_stride(w, cf); - if(stride * h > data_size) { - LV_LOG_WARN("Data size too small, required: %" LV_PRId32 ", provided: %" LV_PRId32, stride * h, - data_size); - return LV_RESULT_INVALID; - } - - lv_image_header_t * header = &draw_buf->header; - header->w = w; - header->h = h; - header->cf = cf; - header->stride = stride; - header->flags = 0; - header->magic = LV_IMAGE_HEADER_MAGIC; - - draw_buf->data = data; - draw_buf->unaligned_data = data; - draw_buf->handlers = &default_handlers; - draw_buf->data_size = data_size; - if(lv_draw_buf_align(data, cf) != draw_buf->unaligned_data) { - LV_LOG_WARN("Data is not aligned, ignored"); - } - return LV_RESULT_OK; -} - -lv_draw_buf_t * lv_draw_buf_create(uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride) -{ - return lv_draw_buf_create_ex(&default_handlers, w, h, cf, stride); -} - -lv_draw_buf_t * lv_draw_buf_create_ex(const lv_draw_buf_handlers_t * handlers, uint32_t w, uint32_t h, - lv_color_format_t cf, uint32_t stride) -{ - lv_draw_buf_t * draw_buf = lv_malloc_zeroed(sizeof(lv_draw_buf_t)); - LV_ASSERT_MALLOC(draw_buf); - if(draw_buf == NULL) return NULL; - if(stride == 0) stride = lv_draw_buf_width_to_stride(w, cf); - - uint32_t size = _calculate_draw_buf_size(w, h, cf, stride); - - void * buf = draw_buf_malloc(handlers, size, cf); - /*Do not assert here as LVGL or the app might just want to try creating a draw_buf*/ - if(buf == NULL) { - LV_LOG_WARN("No memory: %"LV_PRIu32"x%"LV_PRIu32", cf: %d, stride: %"LV_PRIu32", %"LV_PRIu32"Byte, ", - w, h, cf, stride, size); - lv_free(draw_buf); - return NULL; - } - - draw_buf->header.w = w; - draw_buf->header.h = h; - draw_buf->header.cf = cf; - draw_buf->header.flags = LV_IMAGE_FLAGS_MODIFIABLE | LV_IMAGE_FLAGS_ALLOCATED; - draw_buf->header.stride = stride; - draw_buf->header.magic = LV_IMAGE_HEADER_MAGIC; - draw_buf->data = lv_draw_buf_align(buf, cf); - draw_buf->unaligned_data = buf; - draw_buf->data_size = size; - draw_buf->handlers = handlers; - return draw_buf; -} - -lv_draw_buf_t * lv_draw_buf_dup(const lv_draw_buf_t * draw_buf) -{ - return lv_draw_buf_dup_ex(&default_handlers, draw_buf); -} - -lv_draw_buf_t * lv_draw_buf_dup_ex(const lv_draw_buf_handlers_t * handlers, const lv_draw_buf_t * draw_buf) -{ - const lv_image_header_t * header = &draw_buf->header; - lv_draw_buf_t * new_buf = lv_draw_buf_create_ex(handlers, header->w, header->h, header->cf, header->stride); - if(new_buf == NULL) return NULL; - - new_buf->header.flags = draw_buf->header.flags; - new_buf->header.flags |= LV_IMAGE_FLAGS_MODIFIABLE | LV_IMAGE_FLAGS_ALLOCATED; - - /*Choose the smaller size to copy*/ - uint32_t size = LV_MIN(draw_buf->data_size, new_buf->data_size); - - /*Copy image data*/ - lv_memcpy(new_buf->data, draw_buf->data, size); - return new_buf; -} - -lv_draw_buf_t * lv_draw_buf_reshape(lv_draw_buf_t * draw_buf, lv_color_format_t cf, uint32_t w, uint32_t h, - uint32_t stride) -{ - if(draw_buf == NULL) return NULL; - - /*If color format is unknown, keep using the original color format.*/ - if(cf == LV_COLOR_FORMAT_UNKNOWN) cf = draw_buf->header.cf; - if(stride == 0) stride = lv_draw_buf_width_to_stride(w, cf); - - uint32_t size = _calculate_draw_buf_size(w, h, cf, stride); - - if(size > draw_buf->data_size) { - LV_LOG_TRACE("Draw buf too small for new shape"); - return NULL; - } - - draw_buf->header.cf = cf; - draw_buf->header.w = w; - draw_buf->header.h = h; - draw_buf->header.stride = stride; - - return draw_buf; -} - -void lv_draw_buf_destroy(lv_draw_buf_t * draw_buf) -{ - LV_ASSERT_NULL(draw_buf); - if(draw_buf == NULL) return; - - if(draw_buf->header.flags & LV_IMAGE_FLAGS_ALLOCATED) { - LV_ASSERT_NULL(draw_buf->handlers); - - const lv_draw_buf_handlers_t * handlers = draw_buf->handlers; - draw_buf_free(handlers, draw_buf->unaligned_data); - lv_free(draw_buf); - } - else { - LV_LOG_ERROR("draw buffer is not allocated, ignored"); - } -} - -void * lv_draw_buf_goto_xy(const lv_draw_buf_t * buf, uint32_t x, uint32_t y) -{ - LV_ASSERT_NULL(buf); - if(buf == NULL) return NULL; - - uint8_t * data = buf->data; - - /*Skip palette*/ - data += LV_COLOR_INDEXED_PALETTE_SIZE(buf->header.cf) * sizeof(lv_color32_t); - data += buf->header.stride * y; - - if(x == 0) return data; - - return data + x * lv_color_format_get_bpp(buf->header.cf) / 8; -} - -lv_result_t lv_draw_buf_adjust_stride(lv_draw_buf_t * src, uint32_t stride) -{ - LV_ASSERT_NULL(src); - LV_ASSERT_NULL(src->data); - if(src == NULL) return LV_RESULT_INVALID; - if(src->data == NULL) return LV_RESULT_INVALID; - - const lv_image_header_t * header = &src->header; - uint32_t w = header->w; - uint32_t h = header->h; - - if(!lv_draw_buf_has_flag(src, LV_IMAGE_FLAGS_MODIFIABLE)) { - return LV_RESULT_INVALID; - } - - /*Use global stride*/ - if(stride == 0) stride = lv_draw_buf_width_to_stride(w, header->cf); - - /*Check if stride already match*/ - if(header->stride == stride) return LV_RESULT_OK; - - /*Calculate the minimal stride allowed from bpp*/ - uint32_t bpp = lv_color_format_get_bpp(header->cf); - uint32_t min_stride = (w * bpp + 7) >> 3; - if(stride < min_stride) { - LV_LOG_WARN("New stride is too small. min: %" LV_PRId32, min_stride); - return LV_RESULT_INVALID; - } - - /*Check if buffer has enough space. */ - uint32_t new_size = _calculate_draw_buf_size(w, h, header->cf, stride); - if(new_size > src->data_size) { - return LV_RESULT_INVALID; - } - - uint32_t offset = LV_COLOR_INDEXED_PALETTE_SIZE(header->cf) * 4; - - if(stride > header->stride) { - /*Copy from the last line to the first*/ - uint8_t * src_data = src->data + offset + header->stride * (h - 1); - uint8_t * dst_data = src->data + offset + stride * (h - 1); - for(uint32_t y = 0; y < h; y++) { - lv_memmove(dst_data, src_data, min_stride); - src_data -= header->stride; - dst_data -= stride; - } - } - else { - /*Copy from the first line to the last*/ - uint8_t * src_data = src->data + offset; - uint8_t * dst_data = src->data + offset; - for(uint32_t y = 0; y < h; y++) { - lv_memmove(dst_data, src_data, min_stride); - src_data += header->stride; - dst_data += stride; - } - } - - src->header.stride = stride; - - return LV_RESULT_OK; -} - -lv_result_t lv_draw_buf_premultiply(lv_draw_buf_t * draw_buf) -{ - LV_ASSERT_NULL(draw_buf); - if(draw_buf == NULL) return LV_RESULT_INVALID; - - if(draw_buf->header.flags & LV_IMAGE_FLAGS_PREMULTIPLIED) return LV_RESULT_INVALID; - if((draw_buf->header.flags & LV_IMAGE_FLAGS_MODIFIABLE) == 0) { - LV_LOG_WARN("draw buf is not modifiable: 0x%04x", draw_buf->header.flags); - return LV_RESULT_INVALID; - } - - /*Premultiply color with alpha, do case by case by judging color format*/ - lv_color_format_t cf = draw_buf->header.cf; - if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { - int size = LV_COLOR_INDEXED_PALETTE_SIZE(cf); - lv_color32_t * palette = (lv_color32_t *)draw_buf->data; - for(int i = 0; i < size; i++) { - lv_color_premultiply(&palette[i]); - } - } - else if(cf == LV_COLOR_FORMAT_ARGB8888) { - uint32_t h = draw_buf->header.h; - uint32_t w = draw_buf->header.w; - uint32_t stride = draw_buf->header.stride; - uint8_t * line = (uint8_t *)draw_buf->data; - for(uint32_t y = 0; y < h; y++) { - lv_color32_t * pixel = (lv_color32_t *)line; - for(uint32_t x = 0; x < w; x++) { - lv_color_premultiply(pixel); - pixel++; - } - line += stride; - } - } - else if(cf == LV_COLOR_FORMAT_RGB565A8) { - uint32_t h = draw_buf->header.h; - uint32_t w = draw_buf->header.w; - uint32_t stride = draw_buf->header.stride; - uint32_t alpha_stride = stride / 2; - uint8_t * line = (uint8_t *)draw_buf->data; - lv_opa_t * alpha = (lv_opa_t *)(line + stride * h); - for(uint32_t y = 0; y < h; y++) { - lv_color16_t * pixel = (lv_color16_t *)line; - for(uint32_t x = 0; x < w; x++) { - lv_color16_premultiply(pixel, alpha[x]); - pixel++; - } - line += stride; - alpha += alpha_stride; - } - } - else if(cf == LV_COLOR_FORMAT_ARGB8565) { - uint32_t h = draw_buf->header.h; - uint32_t w = draw_buf->header.w; - uint32_t stride = draw_buf->header.stride; - uint8_t * line = (uint8_t *)draw_buf->data; - for(uint32_t y = 0; y < h; y++) { - uint8_t * pixel = line; - for(uint32_t x = 0; x < w; x++) { - uint8_t alpha = pixel[2]; - lv_color16_premultiply((lv_color16_t *)pixel, alpha); - pixel += 3; - } - line += stride; - } - } - else if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf)) { - /*Pass*/ - } - else { - LV_LOG_WARN("draw buf has no alpha, cf: %d", cf); - } - - draw_buf->header.flags |= LV_IMAGE_FLAGS_PREMULTIPLIED; - - return LV_RESULT_OK; -} - -void lv_draw_buf_set_palette(lv_draw_buf_t * draw_buf, uint8_t index, lv_color32_t color) -{ - LV_ASSERT_NULL(draw_buf); - if(draw_buf == NULL) return; - - if(!LV_COLOR_FORMAT_IS_INDEXED(draw_buf->header.cf)) { - LV_LOG_WARN("Not indexed color format"); - return; - } - - lv_color32_t * palette = (lv_color32_t *)draw_buf->data; - palette[index] = color; -} - -bool lv_draw_buf_has_flag(const lv_draw_buf_t * draw_buf, lv_image_flags_t flag) -{ - return draw_buf->header.flags & flag; -} - -void lv_draw_buf_set_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag) -{ - draw_buf->header.flags |= flag; -} - -void lv_draw_buf_clear_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag) -{ - draw_buf->header.flags &= ~flag; -} - -void lv_draw_buf_from_image(lv_draw_buf_t * buf, const lv_image_dsc_t * img) -{ - lv_draw_buf_init(buf, img->header.w, img->header.h, img->header.cf, img->header.stride, - (void *)img->data, img->data_size); - buf->header.flags = img->header.flags; -} - -void lv_draw_buf_to_image(const lv_draw_buf_t * buf, lv_image_dsc_t * img) -{ - lv_memcpy((void *)img, buf, sizeof(lv_image_dsc_t)); -} - -void lv_image_buf_set_palette(lv_image_dsc_t * dsc, uint8_t id, lv_color32_t c) -{ - LV_LOG_WARN("Deprecated API, use lv_draw_buf_set_palette instead."); - lv_draw_buf_set_palette((lv_draw_buf_t *)dsc, id, c); -} - -void lv_image_buf_free(lv_image_dsc_t * dsc) -{ - LV_LOG_WARN("Deprecated API, use lv_draw_buf_destroy instead."); - if(dsc != NULL) { - if(dsc->data != NULL) - lv_free((void *)dsc->data); - - lv_free((void *)dsc); - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void * buf_malloc(size_t size_bytes, lv_color_format_t color_format) -{ - LV_UNUSED(color_format); - - /*Allocate larger memory to be sure it can be aligned as needed*/ - size_bytes += LV_DRAW_BUF_ALIGN - 1; - return lv_malloc(size_bytes); -} - -static void buf_free(void * buf) -{ - lv_free(buf); -} - -static void * buf_align(void * buf, lv_color_format_t color_format) -{ - LV_UNUSED(color_format); - - uint8_t * buf_u8 = buf; - if(buf_u8) { - buf_u8 = (uint8_t *)LV_ROUND_UP((lv_uintptr_t)buf_u8, LV_DRAW_BUF_ALIGN); - } - return buf_u8; -} - -static uint32_t width_to_stride(uint32_t w, lv_color_format_t color_format) -{ - uint32_t width_byte; - width_byte = w * lv_color_format_get_bpp(color_format); - width_byte = (width_byte + 7) >> 3; /*Round up*/ - - return LV_ROUND_UP(width_byte, LV_DRAW_BUF_STRIDE_ALIGN); -} - -static void * draw_buf_malloc(const lv_draw_buf_handlers_t * handlers, size_t size_bytes, - lv_color_format_t color_format) -{ - if(handlers->buf_malloc_cb) return handlers->buf_malloc_cb(size_bytes, color_format); - else return NULL; -} - -static void draw_buf_free(const lv_draw_buf_handlers_t * handlers, void * buf) -{ - if(handlers->buf_free_cb) - handlers->buf_free_cb(buf); -} - -/** - * For given width, height, color format, and stride, calculate the size needed for a new draw buffer. - */ -static uint32_t _calculate_draw_buf_size(uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride) -{ - uint32_t size; - - if(stride == 0) stride = lv_draw_buf_width_to_stride(w, cf); - - size = stride * h; - if(cf == LV_COLOR_FORMAT_RGB565A8) { - size += (stride / 2) * h; /*A8 mask*/ - } - else if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { - /*@todo we have to include palette right before image data*/ - size += LV_COLOR_INDEXED_PALETTE_SIZE(cf) * 4; - } - - return size; -} - -static void draw_buf_get_full_area(const lv_draw_buf_t * draw_buf, lv_area_t * full_area) -{ - const lv_image_header_t * header = &draw_buf->header; - lv_area_set(full_area, 0, 0, header->w - 1, header->h - 1); -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_buf.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_buf.h deleted file mode 100644 index 22b09de..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_buf.h +++ /dev/null @@ -1,356 +0,0 @@ -/** - * @file lv_draw_buf.h - * - */ - -#ifndef LV_DRAW_BUF_H -#define LV_DRAW_BUF_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_types.h" -#include "../misc/lv_area.h" -#include "../misc/lv_color.h" -#include "../stdlib/lv_string.h" -#include "lv_image_dsc.h" - -/********************* - * DEFINES - *********************/ - -/** Use this value to let LVGL calculate stride automatically */ -#define LV_STRIDE_AUTO 0 -LV_EXPORT_CONST_INT(LV_STRIDE_AUTO); - -/** - * Stride alignment for draw buffers. - * It may vary between different color formats and hardware. - * Refine it to suit your needs. - */ - -#define LV_DRAW_BUF_STRIDE(w, cf) \ - LV_ROUND_UP(((w) * LV_COLOR_FORMAT_GET_BPP(cf) + 7) / 8, LV_DRAW_BUF_STRIDE_ALIGN) - -/** Allocate a slightly larger buffer, so we can adjust the start address to meet alignment */ -#define LV_DRAW_BUF_SIZE(w, h, cf) \ - (LV_DRAW_BUF_STRIDE(w, cf) * (h) + LV_DRAW_BUF_ALIGN + \ - LV_COLOR_INDEXED_PALETTE_SIZE(cf) * sizeof(lv_color32_t)) - -/** - * Define a static draw buffer with the given width, height, and color format. - * Stride alignment is set to LV_DRAW_BUF_STRIDE_ALIGN. - * - * For platform that needs special buffer alignment, call LV_DRAW_BUF_INIT_STATIC. - */ -#define LV_DRAW_BUF_DEFINE_STATIC(name, _w, _h, _cf) \ - static uint8_t buf_##name[LV_DRAW_BUF_SIZE(_w, _h, _cf)]; \ - static lv_draw_buf_t name = { \ - .header = { \ - .magic = LV_IMAGE_HEADER_MAGIC, \ - .cf = (_cf), \ - .flags = LV_IMAGE_FLAGS_MODIFIABLE, \ - .w = (_w), \ - .h = (_h), \ - .stride = LV_DRAW_BUF_STRIDE(_w, _cf), \ - .reserved_2 = 0, \ - }, \ - .data_size = sizeof(buf_##name), \ - .data = buf_##name, \ - .unaligned_data = buf_##name, \ - } - -#define LV_DRAW_BUF_INIT_STATIC(name) \ - do { \ - lv_image_header_t * header = &name.header; \ - lv_draw_buf_init(&name, header->w, header->h, (lv_color_format_t)header->cf, header->stride, buf_##name, sizeof(buf_##name)); \ - lv_draw_buf_set_flag(&name, LV_IMAGE_FLAGS_MODIFIABLE); \ - } while(0) - -/********************** - * TYPEDEFS - **********************/ - -typedef void * (*lv_draw_buf_malloc_cb)(size_t size, lv_color_format_t color_format); - -typedef void (*lv_draw_buf_free_cb)(void * draw_buf); - -typedef void * (*lv_draw_buf_align_cb)(void * buf, lv_color_format_t color_format); - -typedef void (*lv_draw_buf_cache_operation_cb)(const lv_draw_buf_t * draw_buf, const lv_area_t * area); - -typedef uint32_t (*lv_draw_buf_width_to_stride_cb)(uint32_t w, lv_color_format_t color_format); - -struct lv_draw_buf_t { - lv_image_header_t header; - uint32_t data_size; /**< Total buf size in bytes */ - uint8_t * data; - void * unaligned_data; /**< Unaligned address of `data`, used internally by lvgl */ - const lv_draw_buf_handlers_t * handlers; /**< draw buffer alloc/free ops. */ -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the draw buffer with the default handlers. - * - * @param handlers the draw buffer handlers to set - */ -void lv_draw_buf_init_with_default_handlers(lv_draw_buf_handlers_t * handlers); - -/** - * Initialize the draw buffer with given handlers. - * - * @param handlers the draw buffer handlers to set - * @param buf_malloc_cb the callback to allocate memory for the buffer - * @param buf_free_cb the callback to free memory of the buffer - * @param align_pointer_cb the callback to align the buffer - * @param invalidate_cache_cb the callback to invalidate the cache of the buffer - * @param flush_cache_cb the callback to flush buffer - * @param width_to_stride_cb the callback to calculate the stride based on the width and color format - */ -void lv_draw_buf_handlers_init(lv_draw_buf_handlers_t * handlers, - lv_draw_buf_malloc_cb buf_malloc_cb, - lv_draw_buf_free_cb buf_free_cb, - lv_draw_buf_align_cb align_pointer_cb, - lv_draw_buf_cache_operation_cb invalidate_cache_cb, - lv_draw_buf_cache_operation_cb flush_cache_cb, - lv_draw_buf_width_to_stride_cb width_to_stride_cb); - -/** - * Get the struct which holds the callbacks for draw buf management. - * Custom callback can be set on the returned value - * @return pointer to the struct of handlers - */ -lv_draw_buf_handlers_t * lv_draw_buf_get_handlers(void); -lv_draw_buf_handlers_t * lv_draw_buf_get_font_handlers(void); -lv_draw_buf_handlers_t * lv_draw_buf_get_image_handlers(void); - - -/** - * Align the address of a buffer. The buffer needs to be large enough for the real data after alignment - * @param buf the data to align - * @param color_format the color format of the buffer - * @return the aligned buffer - */ -void * lv_draw_buf_align(void * buf, lv_color_format_t color_format); - -/** - * Align the address of a buffer with custom draw buffer handlers. - * The buffer needs to be large enough for the real data after alignment - * @param handlers the draw buffer handlers - * @param buf the data to align - * @param color_format the color format of the buffer - * @return the aligned buffer - */ -void * lv_draw_buf_align_ex(const lv_draw_buf_handlers_t * handlers, void * buf, lv_color_format_t color_format); - -/** - * Invalidate the cache of the buffer - * @param draw_buf the draw buffer needs to be invalidated - * @param area the area to invalidate in the buffer, - * use NULL to invalidate the whole draw buffer address range - */ -void lv_draw_buf_invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); - -/** - * Flush the cache of the buffer - * @param draw_buf the draw buffer needs to be flushed - * @param area the area to flush in the buffer, - * use NULL to flush the whole draw buffer address range - */ -void lv_draw_buf_flush_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); - -/** - * Calculate the stride in bytes based on a width and color format - * @param w the width in pixels - * @param color_format the color format - * @return the stride in bytes - */ -uint32_t lv_draw_buf_width_to_stride(uint32_t w, lv_color_format_t color_format); - -/** - * Calculate the stride in bytes based on a width and color format - * @param handlers the draw buffer handlers - * @param w the width in pixels - * @param color_format the color format - * @return the stride in bytes - */ -uint32_t lv_draw_buf_width_to_stride_ex(const lv_draw_buf_handlers_t * handlers, uint32_t w, - lv_color_format_t color_format); - -/** - * Clear an area on the buffer - * @param draw_buf pointer to draw buffer - * @param a the area to clear, or NULL to clear the whole buffer - */ -void lv_draw_buf_clear(lv_draw_buf_t * draw_buf, const lv_area_t * a); - -/** - * Copy an area from a buffer to another - * @param dest pointer to the destination draw buffer - * @param dest_area the area to copy from the destination buffer, if NULL, use the whole buffer - * @param src pointer to the source draw buffer - * @param src_area the area to copy from the destination buffer, if NULL, use the whole buffer - * @note `dest_area` and `src_area` should have the same width and height - * @note `dest` and `src` should have same color format. Color converting is not supported fow now. - */ -void lv_draw_buf_copy(lv_draw_buf_t * dest, const lv_area_t * dest_area, - const lv_draw_buf_t * src, const lv_area_t * src_area); - -/** - * Note: Eventually, lv_draw_buf_malloc/free will be kept as private. - * For now, we use `create` to distinguish with malloc. - * - * Create an draw buf by allocating struct for `lv_draw_buf_t` and allocating a buffer for it - * that meets specified requirements. - * - * @param w the buffer width in pixels - * @param h the buffer height in pixels - * @param cf the color format for image - * @param stride the stride in bytes for image. Use 0 for automatic calculation based on - * w, cf, and global stride alignment configuration. - */ -lv_draw_buf_t * lv_draw_buf_create(uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride); - -/** - * Note: Eventually, lv_draw_buf_malloc/free will be kept as private. - * For now, we use `create` to distinguish with malloc. - * - * Create an draw buf by allocating struct for `lv_draw_buf_t` and allocating a buffer for it - * that meets specified requirements. - * - * @param handlers the draw buffer handlers - * @param w the buffer width in pixels - * @param h the buffer height in pixels - * @param cf the color format for image - * @param stride the stride in bytes for image. Use 0 for automatic calculation based on - * w, cf, and global stride alignment configuration. - */ -lv_draw_buf_t * lv_draw_buf_create_ex(const lv_draw_buf_handlers_t * handlers, uint32_t w, uint32_t h, - lv_color_format_t cf, uint32_t stride); - -/** - * Duplicate a draw buf with same image size, stride and color format. Copy the image data too. - * @param draw_buf the draw buf to duplicate - * @return the duplicated draw buf on success, NULL if failed - */ -lv_draw_buf_t * lv_draw_buf_dup(const lv_draw_buf_t * draw_buf); - -/** - * Duplicate a draw buf with same image size, stride and color format. Copy the image data too. - * @param handlers the draw buffer handlers - * @param draw_buf the draw buf to duplicate - * @return the duplicated draw buf on success, NULL if failed - */ -lv_draw_buf_t * lv_draw_buf_dup_ex(const lv_draw_buf_handlers_t * handlers, const lv_draw_buf_t * draw_buf); - -/** - * Initialize a draw buf with the given buffer and parameters. Clear draw buffer flag to zero. - * @param draw_buf the draw buf to initialize - * @param w the buffer width in pixels - * @param h the buffer height in pixels - * @param cf the color format - * @param stride the stride in bytes. Use 0 for automatic calculation - * @param data the buffer used for drawing. Unaligned `data` will be aligned internally - * @param data_size the size of the buffer in bytes - * @return return LV_RESULT_OK on success, LV_RESULT_INVALID otherwise - */ -lv_result_t lv_draw_buf_init(lv_draw_buf_t * draw_buf, uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride, - void * data, uint32_t data_size); - -/** - * Keep using the existing memory, reshape the draw buffer to the given width and height. - * Return NULL if data_size is smaller than the required size. - * @param draw_buf pointer to a draw buffer - * @param cf the new color format, use 0 or LV_COLOR_FORMAT_UNKNOWN to keep using the original color format. - * @param w the new width in pixels - * @param h the new height in pixels - * @param stride the stride in bytes for image. Use 0 for automatic calculation. - */ -lv_draw_buf_t * lv_draw_buf_reshape(lv_draw_buf_t * draw_buf, lv_color_format_t cf, uint32_t w, uint32_t h, - uint32_t stride); - -/** - * Destroy a draw buf by freeing the actual buffer if it's marked as LV_IMAGE_FLAGS_ALLOCATED in header. - * Then free the lv_draw_buf_t struct. - * - * @param draw_buf the draw buffer to destroy - */ -void lv_draw_buf_destroy(lv_draw_buf_t * draw_buf); - -/** - * Return pointer to the buffer at the given coordinates - */ -void * lv_draw_buf_goto_xy(const lv_draw_buf_t * buf, uint32_t x, uint32_t y); - -/** - * Adjust the stride of a draw buf in place. - * @param src pointer to a draw buffer - * @param stride the new stride in bytes for image. Use LV_STRIDE_AUTO for automatic calculation. - * @return LV_RESULT_OK: success or LV_RESULT_INVALID: failed - */ -lv_result_t lv_draw_buf_adjust_stride(lv_draw_buf_t * src, uint32_t stride); - -/** - * Premultiply draw buffer color with alpha channel. - * If it's already premultiplied, return directly. - * Only color formats with alpha channel will be processed. - * - * @return LV_RESULT_OK: premultiply success - */ -lv_result_t lv_draw_buf_premultiply(lv_draw_buf_t * draw_buf); - -bool lv_draw_buf_has_flag(const lv_draw_buf_t * draw_buf, lv_image_flags_t flag); - -void lv_draw_buf_set_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag); - -void lv_draw_buf_clear_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag); - -/** - * As of now, draw buf share same definition as `lv_image_dsc_t`. - * And is interchangeable with `lv_image_dsc_t`. - */ - -void lv_draw_buf_from_image(lv_draw_buf_t * buf, const lv_image_dsc_t * img); - -void lv_draw_buf_to_image(const lv_draw_buf_t * buf, lv_image_dsc_t * img); - -/** - * Set the palette color of an indexed image. Valid only for `LV_COLOR_FORMAT_I1/2/4/8` - * @param draw_buf pointer to an image descriptor - * @param index the palette color to set: - * - for `LV_COLOR_FORMAT_I1`: 0..1 - * - for `LV_COLOR_FORMAT_I2`: 0..3 - * - for `LV_COLOR_FORMAT_I4`: 0..15 - * - for `LV_COLOR_FORMAT_I8`: 0..255 - * @param color the color to set in lv_color32_t format - */ -void lv_draw_buf_set_palette(lv_draw_buf_t * draw_buf, uint8_t index, lv_color32_t color); - -/** - * @deprecated Use lv_draw_buf_set_palette instead. - */ -void lv_image_buf_set_palette(lv_image_dsc_t * dsc, uint8_t id, lv_color32_t c); - -/** - * @deprecated Use lv_draw_buffer_create/destroy instead. - * Free the data pointer and dsc struct of an image. - */ -void lv_image_buf_free(lv_image_dsc_t * dsc); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_BUF_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_buf_private.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_buf_private.h deleted file mode 100644 index 051f9ba..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_buf_private.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @file lv_draw_buf_private.h - * - */ - -#ifndef LV_DRAW_BUF_PRIVATE_H -#define LV_DRAW_BUF_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_buf.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_draw_buf_handlers_t { - lv_draw_buf_malloc_cb buf_malloc_cb; - lv_draw_buf_free_cb buf_free_cb; - lv_draw_buf_align_cb align_pointer_cb; - lv_draw_buf_cache_operation_cb invalidate_cache_cb; - lv_draw_buf_cache_operation_cb flush_cache_cb; - lv_draw_buf_width_to_stride_cb width_to_stride_cb; -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Called internally to initialize the draw_buf_handlers in lv_global - */ -void lv_draw_buf_init_handlers(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_BUF_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_image.c b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_image.c deleted file mode 100644 index 4580457..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_image.c +++ /dev/null @@ -1,314 +0,0 @@ -/** - * @file lv_draw_img.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_image_private.h" -#include "../misc/lv_area_private.h" -#include "lv_image_decoder_private.h" -#include "lv_draw_private.h" -#include "../display/lv_display.h" -#include "../misc/lv_log.h" -#include "../misc/lv_math.h" -#include "../core/lv_refr.h" -#include "../stdlib/lv_mem.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void img_decode_and_draw(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - lv_image_decoder_dsc_t * decoder_dsc, lv_area_t * relative_decoded_area, - const lv_area_t * img_area, const lv_area_t * clipped_img_area, - lv_draw_image_core_cb draw_core_cb); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_image_dsc_init(lv_draw_image_dsc_t * dsc) -{ - lv_memzero(dsc, sizeof(lv_draw_image_dsc_t)); - dsc->recolor = lv_color_black(); - dsc->opa = LV_OPA_COVER; - dsc->scale_x = LV_SCALE_NONE; - dsc->scale_y = LV_SCALE_NONE; - dsc->antialias = LV_COLOR_DEPTH > 8 ? 1 : 0; - dsc->image_area.x2 = LV_COORD_MIN; /*Indicate invalid area by default by setting a negative size*/ - dsc->base.dsc_size = sizeof(lv_draw_image_dsc_t); -} - -lv_draw_image_dsc_t * lv_draw_task_get_image_dsc(lv_draw_task_t * task) -{ - return task->type == LV_DRAW_TASK_TYPE_IMAGE ? (lv_draw_image_dsc_t *)task->draw_dsc : NULL; -} - -void lv_draw_layer(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords) -{ - if(dsc->scale_x <= 0 || dsc->scale_y <= 0) { - /* NOT draw if scale is negative or zero */ - return; - } - - lv_draw_task_t * t = lv_draw_add_task(layer, coords); - - t->draw_dsc = lv_malloc(sizeof(*dsc)); - lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); - t->type = LV_DRAW_TASK_TYPE_LAYER; - t->state = LV_DRAW_TASK_STATE_WAITING; - - lv_image_buf_get_transformed_area(&t->_real_area, lv_area_get_width(coords), lv_area_get_height(coords), - dsc->rotation, dsc->scale_x, dsc->scale_y, &dsc->pivot); - lv_area_move(&t->_real_area, coords->x1, coords->y1); - - lv_layer_t * layer_to_draw = (lv_layer_t *)dsc->src; - layer_to_draw->all_tasks_added = true; - - lv_draw_finalize_task_creation(layer, t); -} - -void lv_draw_image(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords) -{ - if(dsc->src == NULL) { - LV_LOG_WARN("Image draw: src is NULL"); - return; - } - if(dsc->opa <= LV_OPA_MIN) return; - - if(dsc->scale_x <= 0 || dsc->scale_y <= 0) { - /* NOT draw if scale is negative or zero */ - return; - } - - LV_PROFILER_BEGIN; - - lv_draw_image_dsc_t * new_image_dsc = lv_malloc(sizeof(*dsc)); - lv_memcpy(new_image_dsc, dsc, sizeof(*dsc)); - lv_result_t res = lv_image_decoder_get_info(new_image_dsc->src, &new_image_dsc->header); - if(res != LV_RESULT_OK) { - LV_LOG_WARN("Couldn't get info about the image"); - lv_free(new_image_dsc); - return; - } - - lv_draw_task_t * t = lv_draw_add_task(layer, coords); - t->draw_dsc = new_image_dsc; - t->type = LV_DRAW_TASK_TYPE_IMAGE; - - lv_image_buf_get_transformed_area(&t->_real_area, lv_area_get_width(coords), lv_area_get_height(coords), - dsc->rotation, dsc->scale_x, dsc->scale_y, &dsc->pivot); - lv_area_move(&t->_real_area, coords->x1, coords->y1); - - lv_draw_finalize_task_creation(layer, t); - LV_PROFILER_END; -} - -lv_image_src_t lv_image_src_get_type(const void * src) -{ - if(src == NULL) return LV_IMAGE_SRC_UNKNOWN; - const uint8_t * u8_p = src; - - /*The first byte shows the type of the image source*/ - if(u8_p[0] >= 0x20 && u8_p[0] <= 0x7F) { - return LV_IMAGE_SRC_FILE; /*If it's an ASCII character then it's file name*/ - } - else if(u8_p[0] >= 0x80) { - return LV_IMAGE_SRC_SYMBOL; /*Symbols begins after 0x7F*/ - } - else { - return LV_IMAGE_SRC_VARIABLE; /*`lv_image_dsc_t` is draw to the first byte < 0x20*/ - } -} - -void lv_draw_image_normal_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb) -{ - if(draw_core_cb == NULL) { - LV_LOG_WARN("draw_core_cb is NULL"); - return; - } - - lv_area_t draw_area; - lv_area_copy(&draw_area, coords); - if(draw_dsc->rotation || draw_dsc->scale_x != LV_SCALE_NONE || draw_dsc->scale_y != LV_SCALE_NONE) { - int32_t w = lv_area_get_width(coords); - int32_t h = lv_area_get_height(coords); - - lv_image_buf_get_transformed_area(&draw_area, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, - &draw_dsc->pivot); - - draw_area.x1 += coords->x1; - draw_area.y1 += coords->y1; - draw_area.x2 += coords->x1; - draw_area.y2 += coords->y1; - } - - lv_area_t clipped_img_area; - if(!lv_area_intersect(&clipped_img_area, &draw_area, draw_unit->clip_area)) { - return; - } - - lv_image_decoder_dsc_t decoder_dsc; - lv_result_t res = lv_image_decoder_open(&decoder_dsc, draw_dsc->src, NULL); - if(res != LV_RESULT_OK) { - LV_LOG_ERROR("Failed to open image"); - return; - } - - img_decode_and_draw(draw_unit, draw_dsc, &decoder_dsc, NULL, coords, &clipped_img_area, draw_core_cb); - - lv_image_decoder_close(&decoder_dsc); -} - -void lv_draw_image_tiled_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb) -{ - if(draw_core_cb == NULL) { - LV_LOG_WARN("draw_core_cb is NULL"); - return; - } - - lv_image_decoder_dsc_t decoder_dsc; - lv_result_t res = lv_image_decoder_open(&decoder_dsc, draw_dsc->src, NULL); - if(res != LV_RESULT_OK) { - LV_LOG_ERROR("Failed to open image"); - return; - } - - int32_t img_w = draw_dsc->header.w; - int32_t img_h = draw_dsc->header.h; - - lv_area_t tile_area; - if(lv_area_get_width(&draw_dsc->image_area) >= 0) { - tile_area = draw_dsc->image_area; - } - else { - tile_area = *coords; - } - lv_area_set_width(&tile_area, img_w); - lv_area_set_height(&tile_area, img_h); - - int32_t tile_x_start = tile_area.x1; - - lv_area_t relative_decoded_area = { - .x1 = LV_COORD_MIN, - .y1 = LV_COORD_MIN, - .x2 = LV_COORD_MIN, - .y2 = LV_COORD_MIN, - }; - - while(tile_area.y1 <= coords->y2) { - while(tile_area.x1 <= coords->x2) { - - lv_area_t clipped_img_area; - if(lv_area_intersect(&clipped_img_area, &tile_area, coords)) { - img_decode_and_draw(draw_unit, draw_dsc, &decoder_dsc, &relative_decoded_area, &tile_area, &clipped_img_area, - draw_core_cb); - } - - tile_area.x1 += img_w; - tile_area.x2 += img_w; - } - - tile_area.y1 += img_h; - tile_area.y2 += img_h; - tile_area.x1 = tile_x_start; - tile_area.x2 = tile_x_start + img_w - 1; - } - - lv_image_decoder_close(&decoder_dsc); -} - -void lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle, - uint16_t scale_x, uint16_t scale_y, const lv_point_t * pivot) -{ - if(angle == 0 && scale_x == LV_SCALE_NONE && scale_y == LV_SCALE_NONE) { - res->x1 = 0; - res->y1 = 0; - res->x2 = w - 1; - res->y2 = h - 1; - return; - } - - lv_point_t p[4] = { - {0, 0}, - {w, 0}, - {0, h}, - {w, h}, - }; - lv_point_transform(&p[0], angle, scale_x, scale_y, pivot, true); - lv_point_transform(&p[1], angle, scale_x, scale_y, pivot, true); - lv_point_transform(&p[2], angle, scale_x, scale_y, pivot, true); - lv_point_transform(&p[3], angle, scale_x, scale_y, pivot, true); - res->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x); - res->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x) - 1; - res->y1 = LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y); - res->y2 = LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y) - 1; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void img_decode_and_draw(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - lv_image_decoder_dsc_t * decoder_dsc, lv_area_t * relative_decoded_area, - const lv_area_t * img_area, const lv_area_t * clipped_img_area, - lv_draw_image_core_cb draw_core_cb) -{ - lv_draw_image_sup_t sup; - sup.alpha_color = draw_dsc->recolor; - sup.palette = decoder_dsc->palette; - sup.palette_size = decoder_dsc->palette_size; - - /*The whole image is available, just draw it*/ - if(decoder_dsc->decoded && (relative_decoded_area == NULL || relative_decoded_area->x1 == LV_COORD_MIN)) { - draw_core_cb(draw_unit, draw_dsc, decoder_dsc, &sup, img_area, clipped_img_area); - } - /*Draw in smaller pieces*/ - else { - lv_area_t relative_full_area_to_decode = *clipped_img_area; - lv_area_move(&relative_full_area_to_decode, -img_area->x1, -img_area->y1); - lv_area_t tmp; - if(relative_decoded_area == NULL) relative_decoded_area = &tmp; - relative_decoded_area->x1 = LV_COORD_MIN; - relative_decoded_area->y1 = LV_COORD_MIN; - relative_decoded_area->x2 = LV_COORD_MIN; - relative_decoded_area->y2 = LV_COORD_MIN; - lv_result_t res = LV_RESULT_OK; - - while(res == LV_RESULT_OK) { - res = lv_image_decoder_get_area(decoder_dsc, &relative_full_area_to_decode, relative_decoded_area); - - lv_area_t absolute_decoded_area = *relative_decoded_area; - lv_area_move(&absolute_decoded_area, img_area->x1, img_area->y1); - if(res == LV_RESULT_OK) { - /*Limit draw area to the current decoded area and draw the image*/ - lv_area_t clipped_img_area_sub; - if(lv_area_intersect(&clipped_img_area_sub, clipped_img_area, &absolute_decoded_area)) { - draw_core_cb(draw_unit, draw_dsc, decoder_dsc, &sup, - &absolute_decoded_area, &clipped_img_area_sub); - } - } - } - } -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_image.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_image.h deleted file mode 100644 index a16f6d0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_image.h +++ /dev/null @@ -1,129 +0,0 @@ -/** - * @file lv_draw_image.h - * - */ - -#ifndef LV_DRAW_IMAGE_H -#define LV_DRAW_IMAGE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_draw.h" -#include "lv_image_decoder.h" -#include "lv_draw_buf.h" -#include "../misc/lv_style.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * MACROS - **********************/ - -typedef struct lv_draw_image_dsc_t { - lv_draw_dsc_base_t base; - - const void * src; - lv_image_header_t header; - - int32_t rotation; - int32_t scale_x; - int32_t scale_y; - int32_t skew_x; - int32_t skew_y; - lv_point_t pivot; - - lv_color_t recolor; - lv_opa_t recolor_opa; - - lv_opa_t opa; - lv_blend_mode_t blend_mode : 4; - - uint16_t antialias : 1; - uint16_t tile : 1; - lv_draw_image_sup_t * sup; - - /** Used to indicate the entire original, non-clipped area where the image is to be drawn. - * This is important for: - * 1. Layer rendering, where it might happen that only a smaller area of the layer is rendered. - * 2. Tiled images, where the target draw area is larger than the image to be tiled. - */ - lv_area_t image_area; - - int32_t clip_radius; - - const lv_image_dsc_t * bitmap_mask_src; -} lv_draw_image_dsc_t; - -/** - * PErform the actual rendering of a decoded image - * @param draw_unit pointer to a draw unit - * @param draw_dsc the draw descriptor of the image - * @param decoder_dsc pointer to the decoded image's descriptor - * @param sup supplementary data - * @param img_coords the absolute coordinates of the image - * @param clipped_img_area the absolute clip coordinates - */ -typedef void (*lv_draw_image_core_cb)(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, - const lv_area_t * img_coords, const lv_area_t * clipped_img_area); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize an image draw descriptor. - * @param dsc pointer to a draw descriptor - */ -void lv_draw_image_dsc_init(lv_draw_image_dsc_t * dsc); - -/** - * Try to get an image draw descriptor from a draw task. - * @param task draw task - * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_IMAGE - */ -lv_draw_image_dsc_t * lv_draw_task_get_image_dsc(lv_draw_task_t * task); - -/** - * Create an image draw task - * @param layer pointer to a layer - * @param dsc pointer to an initialized draw descriptor - * @param coords the coordinates of the image - * @note `coords` can be small than the real image area - * (if only a part of the image is rendered) - * or can be larger (in case of tiled images). . - */ -void lv_draw_image(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords); - -/** - * Create a draw task to blend a layer to another layer - * @param layer pointer to a layer - * @param dsc pointer to an initialized draw descriptor - * @param coords the coordinates of the layer. - * @note `coords` can be small than the total widget area from which the layer is created - * (if only a part of the widget was rendered to a layer) - */ -void lv_draw_layer(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords); - -/** - * Get the type of an image source - * @param src pointer to an image source: - * - pointer to an 'lv_image_t' variable (image stored internally and compiled into the code) - * - a path to a file (e.g. "S:/folder/image.bin") - * - or a symbol (e.g. LV_SYMBOL_CLOSE) - * @return type of the image source LV_IMAGE_SRC_VARIABLE/FILE/SYMBOL/UNKNOWN - */ -lv_image_src_t lv_image_src_get_type(const void * src); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_IMAGE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_image_private.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_image_private.h deleted file mode 100644 index a39ee61..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_image_private.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * @file lv_draw_image_private.h - * - */ - -#ifndef LV_DRAW_IMAGE_PRIVATE_H -#define LV_DRAW_IMAGE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_image.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_draw_image_sup_t { - lv_color_t alpha_color; - const lv_color32_t * palette; - uint32_t palette_size : 9; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Can be used by draw units to handle the decoding and - * prepare everything for the actual image rendering - * @param draw_unit pointer to a draw unit - * @param draw_dsc the draw descriptor of the image - * @param coords the absolute coordinates of the image - * @param draw_core_cb a callback to perform the actual rendering - */ -void lv_draw_image_normal_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb); - -/** - * Can be used by draw units for TILED images to handle the decoding and - * prepare everything for the actual image rendering - * @param draw_unit pointer to a draw unit - * @param draw_dsc the draw descriptor of the image - * @param coords the absolute coordinates of the image - * @param draw_core_cb a callback to perform the actual rendering - */ -void lv_draw_image_tiled_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb); - -/** - * Get the area of a rectangle if its rotated and scaled - * @param res store the coordinates here - * @param w width of the rectangle to transform - * @param h height of the rectangle to transform - * @param angle angle of rotation - * @param scale_x zoom in x direction, (256 no zoom) - * @param scale_y zoom in y direction, (256 no zoom) - * @param pivot x,y pivot coordinates of rotation - */ -void lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle, - uint16_t scale_x, uint16_t scale_y, const lv_point_t * pivot); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_IMAGE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_label.c b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_label.c deleted file mode 100644 index e733c40..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_label.c +++ /dev/null @@ -1,446 +0,0 @@ -/** - * @file lv_draw_label.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_label_private.h" -#include "lv_draw_private.h" -#include "../misc/lv_area_private.h" -#include "lv_draw_vector_private.h" -#include "lv_draw_rect_private.h" -#include "../core/lv_obj.h" -#include "../misc/lv_math.h" -#include "../core/lv_obj_event.h" -#include "../misc/lv_bidi_private.h" -#include "../misc/lv_text_private.h" -#include "../misc/lv_assert.h" -#include "../stdlib/lv_mem.h" -#include "../stdlib/lv_string.h" -#include "../core/lv_global.h" - -/********************* - * DEFINES - *********************/ -#define LABEL_RECOLOR_PAR_LENGTH 6 -#define LV_LABEL_HINT_UPDATE_TH 1024 /*Update the "hint" if the label's y coordinates have changed more then this*/ - -#define font_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->font_draw_buf_handlers) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void draw_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * dsc, const lv_point_t * pos, - const lv_font_t * font, uint32_t letter, lv_draw_glyph_cb_t cb); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc) -{ - lv_memzero(dsc, sizeof(lv_draw_label_dsc_t)); - dsc->opa = LV_OPA_COVER; - dsc->color = lv_color_black(); - dsc->font = LV_FONT_DEFAULT; - dsc->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; - dsc->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; - dsc->sel_color = lv_color_black(); - dsc->sel_bg_color = lv_palette_main(LV_PALETTE_BLUE); - dsc->bidi_dir = LV_BASE_DIR_LTR; - dsc->base.dsc_size = sizeof(lv_draw_label_dsc_t); -} - -lv_draw_label_dsc_t * lv_draw_task_get_label_dsc(lv_draw_task_t * task) -{ - return task->type == LV_DRAW_TASK_TYPE_LABEL ? (lv_draw_label_dsc_t *)task->draw_dsc : NULL; -} - -void lv_draw_glyph_dsc_init(lv_draw_glyph_dsc_t * dsc) -{ - lv_memzero(dsc, sizeof(lv_draw_glyph_dsc_t)); -} - -void LV_ATTRIBUTE_FAST_MEM lv_draw_label(lv_layer_t * layer, const lv_draw_label_dsc_t * dsc, - const lv_area_t * coords) -{ - if(dsc->opa <= LV_OPA_MIN) return; - if(dsc->text == NULL || dsc->text[0] == '\0') return; - if(dsc->font == NULL) { - LV_LOG_WARN("dsc->font == NULL"); - return; - } - - LV_PROFILER_BEGIN; - lv_draw_task_t * t = lv_draw_add_task(layer, coords); - - t->draw_dsc = lv_malloc(sizeof(*dsc)); - lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); - t->type = LV_DRAW_TASK_TYPE_LABEL; - - /*The text is stored in a local variable so malloc memory for it*/ - if(dsc->text_local) { - lv_draw_label_dsc_t * new_dsc = t->draw_dsc; - new_dsc->text = lv_strdup(dsc->text); - } - - lv_draw_finalize_task_creation(layer, t); - LV_PROFILER_END; -} - -void LV_ATTRIBUTE_FAST_MEM lv_draw_character(lv_layer_t * layer, lv_draw_label_dsc_t * dsc, - const lv_point_t * point, uint32_t unicode_letter) -{ - if(dsc->opa <= LV_OPA_MIN) return; - if(dsc->font == NULL) { - LV_LOG_WARN("dsc->font == NULL"); - return; - } - - if(lv_text_is_marker(unicode_letter)) return; - - LV_PROFILER_BEGIN; - - lv_font_glyph_dsc_t g; - lv_font_get_glyph_dsc(dsc->font, &g, unicode_letter, 0); - - lv_area_t a; - a.x1 = point->x; - a.y1 = point->y; - a.x2 = a.x1 + g.adv_w; - a.y2 = a.y1 + lv_font_get_line_height(g.resolved_font ? g.resolved_font : dsc->font); - - /*lv_draw_label needs UTF8 text so convert the Unicode character to an UTF8 string */ - uint32_t letter_buf[2]; - letter_buf[0] = lv_text_unicode_to_encoded(unicode_letter); - letter_buf[1] = '\0'; - - const char * letter_buf_char = (const char *)letter_buf; - -#if LV_BIG_ENDIAN_SYSTEM - while(*letter_buf_char == 0) ++letter_buf_char; -#endif - - dsc->text = letter_buf_char; - dsc->text_local = 1; - - lv_draw_label(layer, dsc, &a); - LV_PROFILER_END; -} - -void lv_draw_label_iterate_characters(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, - const lv_area_t * coords, - lv_draw_glyph_cb_t cb) -{ - const lv_font_t * font = dsc->font; - int32_t w; - - lv_area_t clipped_area; - bool clip_ok = lv_area_intersect(&clipped_area, coords, draw_unit->clip_area); - if(!clip_ok) return; - - lv_text_align_t align = dsc->align; - lv_base_dir_t base_dir = dsc->bidi_dir; - - lv_bidi_calculate_align(&align, &base_dir, dsc->text); - - if((dsc->flag & LV_TEXT_FLAG_EXPAND) == 0) { - /*Normally use the label's width as width*/ - w = lv_area_get_width(coords); - } - else { - /*If EXPAND is enabled then not limit the text's width to the object's width*/ - lv_point_t p; - lv_text_get_size(&p, dsc->text, dsc->font, dsc->letter_space, dsc->line_space, LV_COORD_MAX, - dsc->flag); - w = p.x; - } - - int32_t line_height_font = lv_font_get_line_height(font); - int32_t line_height = line_height_font + dsc->line_space; - - /*Init variables for the first line*/ - int32_t line_width = 0; - lv_point_t pos; - lv_point_set(&pos, coords->x1, coords->y1); - - int32_t x_ofs = 0; - int32_t y_ofs = 0; - x_ofs = dsc->ofs_x; - y_ofs = dsc->ofs_y; - pos.y += y_ofs; - - uint32_t line_start = 0; - int32_t last_line_start = -1; - - /*Check the hint to use the cached info*/ - if(dsc->hint && y_ofs == 0 && coords->y1 < 0) { - /*If the label changed too much recalculate the hint.*/ - if(LV_ABS(dsc->hint->coord_y - coords->y1) > LV_LABEL_HINT_UPDATE_TH - 2 * line_height) { - dsc->hint->line_start = -1; - } - last_line_start = dsc->hint->line_start; - } - - /*Use the hint if it's valid*/ - if(dsc->hint && last_line_start >= 0) { - line_start = last_line_start; - pos.y += dsc->hint->y; - } - - uint32_t line_end = line_start + lv_text_get_next_line(&dsc->text[line_start], font, dsc->letter_space, w, NULL, - dsc->flag); - - /*Go the first visible line*/ - while(pos.y + line_height_font < draw_unit->clip_area->y1) { - /*Go to next line*/ - line_start = line_end; - line_end += lv_text_get_next_line(&dsc->text[line_start], font, dsc->letter_space, w, NULL, dsc->flag); - pos.y += line_height; - - /*Save at the threshold coordinate*/ - if(dsc->hint && pos.y >= -LV_LABEL_HINT_UPDATE_TH && dsc->hint->line_start < 0) { - dsc->hint->line_start = line_start; - dsc->hint->y = pos.y - coords->y1; - dsc->hint->coord_y = coords->y1; - } - - if(dsc->text[line_start] == '\0') return; - } - - /*Align to middle*/ - if(align == LV_TEXT_ALIGN_CENTER) { - line_width = lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, dsc->letter_space); - - pos.x += (lv_area_get_width(coords) - line_width) / 2; - - } - /*Align to the right*/ - else if(align == LV_TEXT_ALIGN_RIGHT) { - line_width = lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, dsc->letter_space); - pos.x += lv_area_get_width(coords) - line_width; - } - - uint32_t sel_start = dsc->sel_start; - uint32_t sel_end = dsc->sel_end; - if(sel_start > sel_end) { - uint32_t tmp = sel_start; - sel_start = sel_end; - sel_end = tmp; - } - - lv_area_t bg_coords; - lv_draw_glyph_dsc_t draw_letter_dsc; - lv_draw_glyph_dsc_init(&draw_letter_dsc); - draw_letter_dsc.opa = dsc->opa; - draw_letter_dsc.bg_coords = &bg_coords; - draw_letter_dsc.color = dsc->color; - - lv_draw_fill_dsc_t fill_dsc; - lv_draw_fill_dsc_init(&fill_dsc); - fill_dsc.opa = dsc->opa; - int32_t underline_width = font->underline_thickness ? font->underline_thickness : 1; - int32_t line_start_x; - uint32_t i; - int32_t letter_w; - - /*Write out all lines*/ - while(dsc->text[line_start] != '\0') { - pos.x += x_ofs; - line_start_x = pos.x; - - /*Write all letter of a line*/ - i = 0; -#if LV_USE_BIDI - char * bidi_txt = lv_malloc(line_end - line_start + 1); - LV_ASSERT_MALLOC(bidi_txt); - lv_bidi_process_paragraph(dsc->text + line_start, bidi_txt, line_end - line_start, base_dir, NULL, 0); -#else - const char * bidi_txt = dsc->text + line_start; -#endif - - while(i < line_end - line_start) { - uint32_t logical_char_pos = 0; - if(sel_start != 0xFFFF && sel_end != 0xFFFF) { -#if LV_USE_BIDI - logical_char_pos = lv_text_encoded_get_char_id(dsc->text, line_start); - uint32_t t = lv_text_encoded_get_char_id(bidi_txt, i); - logical_char_pos += lv_bidi_get_logical_pos(bidi_txt, NULL, line_end - line_start, base_dir, t, NULL); -#else - logical_char_pos = lv_text_encoded_get_char_id(dsc->text, line_start + i); -#endif - } - - uint32_t letter; - uint32_t letter_next; - lv_text_encoded_letter_next_2(bidi_txt, &letter, &letter_next, &i); - - letter_w = lv_font_get_glyph_width(font, letter, letter_next); - - /*Always set the bg_coordinates for placeholder drawing*/ - bg_coords.x1 = pos.x; - bg_coords.y1 = pos.y; - bg_coords.x2 = pos.x + letter_w - 1; - bg_coords.y2 = pos.y + line_height - 1; - - if(i >= line_end - line_start) { - if(dsc->decor & LV_TEXT_DECOR_UNDERLINE) { - lv_area_t fill_area; - fill_area.x1 = line_start_x; - fill_area.x2 = pos.x + letter_w - 1; - fill_area.y1 = pos.y + font->line_height - font->base_line - font->underline_position; - fill_area.y2 = fill_area.y1 + underline_width - 1; - - fill_dsc.color = dsc->color; - cb(draw_unit, NULL, &fill_dsc, &fill_area); - } - if(dsc->decor & LV_TEXT_DECOR_STRIKETHROUGH) { - lv_area_t fill_area; - fill_area.x1 = line_start_x; - fill_area.x2 = pos.x + letter_w - 1; - fill_area.y1 = pos.y + (font->line_height - font->base_line) * 2 / 3 + font->underline_thickness / 2; - fill_area.y2 = fill_area.y1 + underline_width - 1; - - fill_dsc.color = dsc->color; - cb(draw_unit, NULL, &fill_dsc, &fill_area); - } - } - - if(sel_start != 0xFFFF && sel_end != 0xFFFF && logical_char_pos >= sel_start && logical_char_pos < sel_end) { - draw_letter_dsc.color = dsc->sel_color; - fill_dsc.color = dsc->sel_bg_color; - cb(draw_unit, NULL, &fill_dsc, &bg_coords); - } - else { - draw_letter_dsc.color = dsc->color; - } - - draw_letter(draw_unit, &draw_letter_dsc, &pos, font, letter, cb); - - if(letter_w > 0) { - pos.x += letter_w + dsc->letter_space; - } - } - -#if LV_USE_BIDI - lv_free(bidi_txt); - bidi_txt = NULL; -#endif - /*Go to next line*/ - line_start = line_end; - line_end += lv_text_get_next_line(&dsc->text[line_start], font, dsc->letter_space, w, NULL, dsc->flag); - - pos.x = coords->x1; - /*Align to middle*/ - if(align == LV_TEXT_ALIGN_CENTER) { - line_width = - lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, dsc->letter_space); - - pos.x += (lv_area_get_width(coords) - line_width) / 2; - } - /*Align to the right*/ - else if(align == LV_TEXT_ALIGN_RIGHT) { - line_width = - lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, dsc->letter_space); - pos.x += lv_area_get_width(coords) - line_width; - } - - /*Go the next line position*/ - pos.y += line_height; - - if(pos.y > draw_unit->clip_area->y2) break; - } - - if(draw_letter_dsc._draw_buf) lv_draw_buf_destroy(draw_letter_dsc._draw_buf); - - LV_ASSERT_MEM_INTEGRITY(); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void draw_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * dsc, const lv_point_t * pos, - const lv_font_t * font, uint32_t letter, lv_draw_glyph_cb_t cb) -{ - lv_font_glyph_dsc_t g; - - if(lv_text_is_marker(letter)) /*Markers are valid letters but should not be rendered.*/ - return; - - LV_PROFILER_BEGIN; - bool g_ret = lv_font_get_glyph_dsc(font, &g, letter, '\0'); - if(g_ret == false) { - /*Add warning if the dsc is not found*/ - LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" LV_PRIX32, letter); - } - - /*Don't draw anything if the character is empty. E.g. space*/ - if((g.box_h == 0) || (g.box_w == 0)) { - LV_PROFILER_END; - return; - } - - lv_area_t letter_coords; - letter_coords.x1 = pos->x + g.ofs_x; - letter_coords.x2 = letter_coords.x1 + g.box_w - 1; - letter_coords.y1 = pos->y + (font->line_height - font->base_line) - g.box_h - g.ofs_y; - letter_coords.y2 = letter_coords.y1 + g.box_h - 1; - - /*If the letter is completely out of mask don't draw it*/ - if(lv_area_is_out(&letter_coords, draw_unit->clip_area, 0) && - lv_area_is_out(dsc->bg_coords, draw_unit->clip_area, 0)) { - LV_PROFILER_END; - return; - } - - if(g.resolved_font) { - lv_draw_buf_t * draw_buf = NULL; - if(LV_FONT_GLYPH_FORMAT_NONE < g.format && g.format < LV_FONT_GLYPH_FORMAT_IMAGE) { - /*Only check draw buf for bitmap glyph*/ - draw_buf = lv_draw_buf_reshape(dsc->_draw_buf, 0, g.box_w, g.box_h, LV_STRIDE_AUTO); - if(draw_buf == NULL) { - if(dsc->_draw_buf) lv_draw_buf_destroy(dsc->_draw_buf); - - uint32_t h = g.box_h; - if(h * g.box_w < 64) h *= 2; /*Alloc a slightly larger buffer*/ - draw_buf = lv_draw_buf_create_ex(font_draw_buf_handlers, g.box_w, h, LV_COLOR_FORMAT_A8, LV_STRIDE_AUTO); - LV_ASSERT_MALLOC(draw_buf); - draw_buf->header.h = g.box_h; - dsc->_draw_buf = draw_buf; - } - } - - dsc->glyph_data = (void *) lv_font_get_glyph_bitmap(&g, draw_buf); - dsc->format = dsc->glyph_data ? g.format : LV_FONT_GLYPH_FORMAT_NONE; - } - else { - dsc->format = LV_FONT_GLYPH_FORMAT_NONE; - } - - dsc->letter_coords = &letter_coords; - dsc->g = &g; - cb(draw_unit, dsc, NULL, NULL); - - lv_font_glyph_release_draw_data(&g); - - LV_PROFILER_END; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_label.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_label.h deleted file mode 100644 index 67afaf5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_label.h +++ /dev/null @@ -1,140 +0,0 @@ -/** - * @file lv_draw_label.h - * - */ - -#ifndef LV_DRAW_LABEL_H -#define LV_DRAW_LABEL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_draw.h" -#include "lv_draw_rect.h" -#include "../misc/lv_bidi.h" -#include "../misc/lv_text.h" -#include "../misc/lv_color.h" -#include "../misc/lv_style.h" - -/********************* - * DEFINES - *********************/ -#define LV_DRAW_LABEL_NO_TXT_SEL (0xFFFF) - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_draw_dsc_base_t base; - - const char * text; - const lv_font_t * font; - uint32_t sel_start; - uint32_t sel_end; - lv_color_t color; - lv_color_t sel_color; - lv_color_t sel_bg_color; - int32_t line_space; - int32_t letter_space; - int32_t ofs_x; - int32_t ofs_y; - lv_opa_t opa; - lv_base_dir_t bidi_dir; - lv_text_align_t align; - lv_text_flag_t flag; - lv_text_decor_t decor : 3; - lv_blend_mode_t blend_mode : 3; - /** - * < 1: malloc buffer and copy `text` there. - * 0: `text` is const and it's pointer will be valid during rendering.*/ - uint8_t text_local : 1; - lv_draw_label_hint_t * hint; -} lv_draw_label_dsc_t; - -/** - * Passed as a parameter to `lv_draw_label_iterate_characters` to - * draw the characters one by one - * @param draw_unit pointer to a draw unit - * @param dsc pointer to `lv_draw_glyph_dsc_t` to describe the character to draw - * if NULL don't draw character - * @param fill_dsc pointer to a fill descriptor to draw a background for the character or - * underline or strike through - * if NULL do not fill anything - * @param fill_area the area to fill - * if NULL do not fill anything - */ -typedef void(*lv_draw_glyph_cb_t)(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * dsc, lv_draw_fill_dsc_t * fill_dsc, - const lv_area_t * fill_area); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize a label draw descriptor - * @param dsc pointer to a draw descriptor - */ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc); - -/** - * Try to get a label draw descriptor from a draw task. - * @param task draw task - * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_LABEL - */ -lv_draw_label_dsc_t * lv_draw_task_get_label_dsc(lv_draw_task_t * task); - -/** - * Initialize a glyph draw descriptor. - * Used internally. - * @param dsc pointer to a draw descriptor - */ -void lv_draw_glyph_dsc_init(lv_draw_glyph_dsc_t * dsc); - -/** - * Crate a draw task to render a text - * @param layer pointer to a layer - * @param dsc pointer to draw descriptor - * @param coords coordinates of the character - */ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label(lv_layer_t * layer, const lv_draw_label_dsc_t * dsc, - const lv_area_t * coords); - -/** - * Crate a draw task to render a single character - * @param layer pointer to a layer - * @param dsc pointer to draw descriptor - * @param point position of the label - * @param unicode_letter the letter to draw - */ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_character(lv_layer_t * layer, lv_draw_label_dsc_t * dsc, - const lv_point_t * point, uint32_t unicode_letter); - -/** - * Should be used during rendering the characters to get the position and other - * parameters of the characters - * @param draw_unit pointer to a draw unit - * @param dsc pointer to draw descriptor - * @param coords coordinates of the label - * @param cb a callback to call to draw each glyphs one by one - */ -void lv_draw_label_iterate_characters(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, - const lv_area_t * coords, lv_draw_glyph_cb_t cb); - -/*********************** - * GLOBAL VARIABLES - ***********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_LABEL_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_label_private.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_label_private.h deleted file mode 100644 index 163651d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_label_private.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @file lv_draw_label_private.h - * - */ - -#ifndef LV_DRAW_LABEL_PRIVATE_H -#define LV_DRAW_LABEL_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_label.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Store some info to speed up drawing of very large texts - * It takes a lot of time to get the first visible character because - * all the previous characters needs to be checked to calculate the positions. - * This structure stores an earlier (e.g. at -1000 px) coordinate and the index of that line. - * Therefore the calculations can start from here.*/ -struct lv_draw_label_hint_t { - /** Index of the line at `y` coordinate*/ - int32_t line_start; - - /** Give the `y` coordinate of the first letter at `line start` index. Relative to the label's coordinates*/ - int32_t y; - - /** The 'y1' coordinate of the label when the hint was saved. - * Used to invalidate the hint if the label has moved too much.*/ - int32_t coord_y; -}; - -struct lv_draw_glyph_dsc_t { - void * glyph_data; /**< Depends on `format` field, it could be image source or draw buf of bitmap or vector data. */ - lv_font_glyph_format_t format; - const lv_area_t * letter_coords; - const lv_area_t * bg_coords; - const lv_font_glyph_dsc_t * g; - lv_color_t color; - lv_opa_t opa; - lv_draw_buf_t * _draw_buf; /**< a shared draw buf for get_bitmap, do not use it directly, use glyph_data instead */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_LABEL_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_line.c b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_line.c deleted file mode 100644 index 00fc203..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_line.c +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @file lv_draw_line.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_private.h" -#include "../core/lv_refr.h" -#include "../misc/lv_math.h" -#include "../misc/lv_types.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void LV_ATTRIBUTE_FAST_MEM lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc) -{ - lv_memzero(dsc, sizeof(lv_draw_line_dsc_t)); - dsc->width = 1; - dsc->opa = LV_OPA_COVER; - dsc->color = lv_color_black(); - dsc->base.dsc_size = sizeof(lv_draw_line_dsc_t); -} - -lv_draw_line_dsc_t * lv_draw_task_get_line_dsc(lv_draw_task_t * task) -{ - return task->type == LV_DRAW_TASK_TYPE_LINE ? (lv_draw_line_dsc_t *)task->draw_dsc : NULL; -} - -void LV_ATTRIBUTE_FAST_MEM lv_draw_line(lv_layer_t * layer, const lv_draw_line_dsc_t * dsc) -{ - if(dsc->width == 0) return; - if(dsc->opa <= LV_OPA_MIN) return; - - LV_PROFILER_BEGIN; - lv_area_t a; - a.x1 = (int32_t)LV_MIN(dsc->p1.x, dsc->p2.x) - dsc->width; - a.x2 = (int32_t)LV_MAX(dsc->p1.x, dsc->p2.x) + dsc->width; - a.y1 = (int32_t)LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width; - a.y2 = (int32_t)LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width; - - lv_draw_task_t * t = lv_draw_add_task(layer, &a); - - t->draw_dsc = lv_malloc(sizeof(*dsc)); - lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); - t->type = LV_DRAW_TASK_TYPE_LINE; - - lv_draw_finalize_task_creation(layer, t); - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_line.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_line.h deleted file mode 100644 index 72430fa..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_line.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - * @file lv_draw_line.h - * - */ - -#ifndef LV_DRAW_LINE_H -#define LV_DRAW_LINE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "../misc/lv_color.h" -#include "../misc/lv_area.h" -#include "../misc/lv_style.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_draw_dsc_base_t base; - - lv_point_precise_t p1; - lv_point_precise_t p2; - lv_color_t color; - int32_t width; - int32_t dash_width; - int32_t dash_gap; - lv_opa_t opa; - lv_blend_mode_t blend_mode : 2; - uint8_t round_start : 1; - uint8_t round_end : 1; - uint8_t raw_end : 1; /**< Do not bother with perpendicular line ending if it's not visible for any reason */ -} lv_draw_line_dsc_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize a line draw descriptor - * @param dsc pointer to a draw descriptor - */ -void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc); - -/** - * Try to get a line draw descriptor from a draw task. - * @param task draw task - * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_LINE - */ -lv_draw_line_dsc_t * lv_draw_task_get_line_dsc(lv_draw_task_t * task); - -/** - * Create a line draw task - * @param layer pointer to a layer - * @param dsc pointer to an initialized `lv_draw_line_dsc_t` variable - */ -void lv_draw_line(lv_layer_t * layer, const lv_draw_line_dsc_t * dsc); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_LINE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_mask.c b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_mask.c deleted file mode 100644 index 3ee6b62..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_mask.c +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @file lv_draw_mask.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_mask_private.h" -#include "lv_draw_private.h" -#include "../core/lv_refr.h" -#include "../misc/lv_math.h" -#include "../misc/lv_types.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void LV_ATTRIBUTE_FAST_MEM lv_draw_mask_rect_dsc_init(lv_draw_mask_rect_dsc_t * dsc) -{ - lv_memzero(dsc, sizeof(lv_draw_mask_rect_dsc_t)); -} - -lv_draw_mask_rect_dsc_t * lv_draw_task_get_mask_rect_dsc(lv_draw_task_t * task) -{ - return task->type == LV_DRAW_TASK_TYPE_MASK_RECTANGLE ? (lv_draw_mask_rect_dsc_t *)task->draw_dsc : NULL; -} - -void LV_ATTRIBUTE_FAST_MEM lv_draw_mask_rect(lv_layer_t * layer, const lv_draw_mask_rect_dsc_t * dsc) -{ - if(!lv_color_format_has_alpha(layer->color_format)) { - LV_LOG_WARN("Only layers with alpha channel can be masked"); - return; - } - LV_PROFILER_BEGIN; - - lv_draw_task_t * t = lv_draw_add_task(layer, &layer->buf_area); - - t->draw_dsc = lv_malloc(sizeof(*dsc)); - lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); - t->type = LV_DRAW_TASK_TYPE_MASK_RECTANGLE; - - lv_draw_dsc_base_t * base_dsc = t->draw_dsc; - base_dsc->layer = layer; - - if(base_dsc->obj && lv_obj_has_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS)) { - /*Disable sending LV_EVENT_DRAW_TASK_ADDED first to avoid triggering recursive - *event calls due draw task adds in the event*/ - lv_obj_remove_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); - lv_obj_send_event(dsc->base.obj, LV_EVENT_DRAW_TASK_ADDED, t); - lv_obj_add_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); - } - - lv_draw_finalize_task_creation(layer, t); - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_mask.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_mask.h deleted file mode 100644 index 6dfed79..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_mask.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @file lv_draw_mask.h - * - */ - -#ifndef LV_DRAW_MASK_H -#define LV_DRAW_MASK_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_color.h" -#include "../misc/lv_area.h" -#include "../misc/lv_style.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize a rectangle mask draw descriptor. - * @param dsc pointer to a draw descriptor - */ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_rect_dsc_init(lv_draw_mask_rect_dsc_t * dsc); - -/** - * Try to get a rectangle mask draw descriptor from a draw task. - * @param task draw task - * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_MASK_RECTANGLE - */ -lv_draw_mask_rect_dsc_t * lv_draw_task_get_mask_rect_dsc(lv_draw_task_t * task); - -/** - * Create a draw task to mask a rectangle from the buffer - * @param layer pointer to a layer - * @param dsc pointer to a draw descriptor - */ -void lv_draw_mask_rect(lv_layer_t * layer, const lv_draw_mask_rect_dsc_t * dsc); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_MASK_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_mask_private.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_mask_private.h deleted file mode 100644 index 040df7e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_mask_private.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @file lv_draw_mask_private.h - * - */ - -#ifndef LV_DRAW_MASK_PRIVATE_H -#define LV_DRAW_MASK_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_mask.h" -#include "lv_draw.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ -struct lv_draw_mask_rect_dsc_t { - lv_draw_dsc_base_t base; - - lv_area_t area; - int32_t radius; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_MASK_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_private.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_private.h deleted file mode 100644 index d8244f7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_private.h +++ /dev/null @@ -1,196 +0,0 @@ -/** - * @file lv_draw_private.h - * - */ - -/** - * Modified by NXP in 2024 - */ - -#ifndef LV_DRAW_PRIVATE_H -#define LV_DRAW_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_draw_task_t { - lv_draw_task_t * next; - - lv_draw_task_type_t type; - - /** - * The area where to draw - */ - lv_area_t area; - - /** - * The real draw area. E.g. for shadow, outline, or transformed images it's different from `area` - */ - lv_area_t _real_area; - - /** The original area which is updated*/ - lv_area_t clip_area_original; - - /** - * The clip area of the layer is saved here when the draw task is created. - * As the clip area of the layer can be changed as new draw tasks are added its current value needs to be saved. - * Therefore during drawing the layer's clip area shouldn't be used as it might be already changed for other draw tasks. - */ - lv_area_t clip_area; - -#if LV_DRAW_TRANSFORM_USE_MATRIX - /** Transform matrix to be applied when rendering the layer */ - lv_matrix_t matrix; -#endif - - volatile int state; /** int instead of lv_draw_task_state_t to be sure its atomic */ - - void * draw_dsc; - - /** - * The ID of the draw_unit which should take this task - */ - uint8_t preferred_draw_unit_id; - - /** - * Set to which extent `preferred_draw_unit_id` is good at this task. - * 80: means 20% better (faster) than software rendering - * 100: the default value - * 110: means 10% worse (slower) than software rendering - */ - uint8_t preference_score; - -}; - -struct lv_draw_mask_t { - void * user_data; -}; - -struct lv_draw_unit_t { - lv_draw_unit_t * next; - - /** - * The target_layer on which drawing should happen - */ - lv_layer_t * target_layer; - - const lv_area_t * clip_area; - - /** - * Called to try to assign a draw task to itself. - * `lv_draw_get_next_available_task` can be used to get an independent draw task. - * A draw task should be assign only if the draw unit can draw it too - * @param draw_unit pointer to the draw unit - * @param layer pointer to a layer on which the draw task should be drawn - * @return >=0: The number of taken draw task: - * 0 means the task has not yet been completed. - * 1 means a new task has been accepted. - * -1: The draw unit wanted to work on a task but couldn't do that - * due to some errors (e.g. out of memory). - * It signals that LVGL should call the dispatcher later again - * to let draw unit try to start the rendering again. - */ - int32_t (*dispatch_cb)(lv_draw_unit_t * draw_unit, lv_layer_t * layer); - - /** - * - * @param draw_unit - * @param task - * @return - */ - int32_t (*evaluate_cb)(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); - - /** - * Called to signal the unit to complete all tasks in order to return their ready status. - * This callback can be implemented in case of asynchronous task processing. - * Below is an example to show the difference between synchronous and asynchronous: - * - * Synchronous: - * LVGL thread DRAW thread HW - * - * task1 --> submit --> Receive task1 - * wait_for_finish() - * <-- task1->state = READY <-- Complete task1 - * task2 --> submit --> Receive task2 - * wait_for_finish() - * task2->state = READY <-- Complete task2 - * task3 --> submit --> Receive task3 - * wait_for_finish() - * <-- task3->state = READY <-- Complete task3 - * task4 --> submit --> Receive task4 - * wait_for_finish() - * <-- task4->state = READY <-- Complete task4 - * NO MORE TASKS - * - * - * Asynchronous: - * LVGL thread DRAW thread HW - * is IDLE - * task1 --> queue task1 - * submit --> Receive task1 - * task2 --> queue task2 is BUSY (with task1) - * task3 --> queue task3 still BUSY (with task1) - * task4 --> queue task4 becomes IDLE - * <-- task1->state = READY <-- Complete task1 - * submit --> Receive task2, task3, task4 - * NO MORE TASKS - * wait_for_finish_cb() wait_for_finish() - * <-- Complete task2, task3, task4 - * <-- task2->state = READY <-- - * <-- task3->state = READY <-- - * <-- task4->state = READY <-- - * - * @param draw_unit - * @return - */ - int32_t (*wait_for_finish_cb)(lv_draw_unit_t * draw_unit); - - /** - * Called to delete draw unit. - * @param draw_unit - * @return - */ - int32_t (*delete_cb)(lv_draw_unit_t * draw_unit); -}; - -typedef struct { - lv_draw_unit_t * unit_head; - uint32_t unit_cnt; - uint32_t used_memory_for_layers_kb; -#if LV_USE_OS - lv_thread_sync_t sync; -#else - int dispatch_req; -#endif - lv_mutex_t circle_cache_mutex; - bool task_running; -} lv_draw_global_info_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_rect.c b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_rect.c deleted file mode 100644 index ec2acc5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_rect.c +++ /dev/null @@ -1,302 +0,0 @@ -/** - * @file lv_draw_rect.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_rect_private.h" -#include "lv_draw_private.h" -#include "../core/lv_obj.h" -#include "../misc/lv_assert.h" -#include "../core/lv_obj_event.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void LV_ATTRIBUTE_FAST_MEM lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc) -{ - lv_memzero(dsc, sizeof(lv_draw_rect_dsc_t)); - dsc->bg_color = lv_color_white(); - dsc->bg_grad.stops[0].color = lv_color_white(); - dsc->bg_grad.stops[1].color = lv_color_black(); - dsc->bg_grad.stops[1].frac = 0xFF; - dsc->bg_grad.stops_count = 2; - dsc->border_color = lv_color_black(); - dsc->shadow_color = lv_color_black(); - dsc->bg_image_symbol_font = LV_FONT_DEFAULT; - dsc->bg_opa = LV_OPA_COVER; - dsc->bg_image_opa = LV_OPA_COVER; - dsc->outline_opa = LV_OPA_COVER; - dsc->border_opa = LV_OPA_COVER; - dsc->shadow_opa = LV_OPA_COVER; - dsc->border_side = LV_BORDER_SIDE_FULL; -} - -void lv_draw_fill_dsc_init(lv_draw_fill_dsc_t * dsc) -{ - lv_memzero(dsc, sizeof(*dsc)); - dsc->opa = LV_OPA_COVER; - dsc->base.dsc_size = sizeof(lv_draw_fill_dsc_t); -} - -lv_draw_fill_dsc_t * lv_draw_task_get_fill_dsc(lv_draw_task_t * task) -{ - return task->type == LV_DRAW_TASK_TYPE_FILL ? (lv_draw_fill_dsc_t *)task->draw_dsc : NULL; -} - -void lv_draw_border_dsc_init(lv_draw_border_dsc_t * dsc) -{ - lv_memzero(dsc, sizeof(*dsc)); - dsc->opa = LV_OPA_COVER; - dsc->side = LV_BORDER_SIDE_FULL; - dsc->base.dsc_size = sizeof(lv_draw_border_dsc_t); -} - -lv_draw_border_dsc_t * lv_draw_task_get_border_dsc(lv_draw_task_t * task) -{ - return task->type == LV_DRAW_TASK_TYPE_BORDER ? (lv_draw_border_dsc_t *)task->draw_dsc : NULL; -} - -void lv_draw_box_shadow_dsc_init(lv_draw_box_shadow_dsc_t * dsc) -{ - lv_memzero(dsc, sizeof(*dsc)); - dsc->opa = LV_OPA_COVER; - dsc->base.dsc_size = sizeof(lv_draw_box_shadow_dsc_t); -} - -lv_draw_box_shadow_dsc_t * lv_draw_task_get_box_shadow_dsc(lv_draw_task_t * task) -{ - return task->type == LV_DRAW_TASK_TYPE_BOX_SHADOW ? (lv_draw_box_shadow_dsc_t *)task->draw_dsc : NULL; -} - -void lv_draw_rect(lv_layer_t * layer, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) -{ - - LV_PROFILER_BEGIN; - bool has_shadow; - bool has_fill; - bool has_border; - bool has_outline; - bool has_bg_img; - - if(dsc->shadow_width == 0 || - dsc->shadow_opa <= LV_OPA_MIN || - (dsc->shadow_width == 1 && dsc->shadow_spread <= 0 && - dsc->shadow_offset_x == 0 && dsc->shadow_offset_y == 0)) { - has_shadow = false; - } - else { - has_shadow = true; - } - - if(dsc->bg_opa <= LV_OPA_MIN) has_fill = false; - else has_fill = true; - - if(dsc->bg_image_opa <= LV_OPA_MIN || dsc->bg_image_src == NULL) has_bg_img = false; - else has_bg_img = true; - - if(dsc->border_opa <= LV_OPA_MIN - || dsc->border_width == 0 - || dsc->border_post == true - || dsc->border_side == LV_BORDER_SIDE_NONE) has_border = false; - else has_border = true; - - if(dsc->outline_opa <= LV_OPA_MIN || dsc->outline_width == 0) has_outline = false; - else has_outline = true; - - bool bg_cover = true; - if(dsc->bg_opa < LV_OPA_COVER) bg_cover = false; - else if(dsc->bg_grad.dir != LV_GRAD_DIR_NONE) { - uint32_t s; - for(s = 0; s < dsc->bg_grad.stops_count; s++) { - if(dsc->bg_grad.stops[s].opa != LV_OPA_COVER) { - bg_cover = false; - break; - } - } - } - - lv_draw_task_t * t; - - /*Shadow*/ - if(has_shadow) { - /*Check whether the shadow is visible*/ - t = lv_draw_add_task(layer, coords); - lv_draw_box_shadow_dsc_t * shadow_dsc = lv_malloc(sizeof(lv_draw_box_shadow_dsc_t)); - t->draw_dsc = shadow_dsc; - lv_area_increase(&t->_real_area, dsc->shadow_spread, dsc->shadow_spread); - lv_area_increase(&t->_real_area, dsc->shadow_width, dsc->shadow_width); - lv_area_move(&t->_real_area, dsc->shadow_offset_x, dsc->shadow_offset_y); - shadow_dsc->base = dsc->base; - shadow_dsc->base.dsc_size = sizeof(lv_draw_box_shadow_dsc_t); - shadow_dsc->radius = dsc->radius; - shadow_dsc->color = dsc->shadow_color; - shadow_dsc->width = dsc->shadow_width; - shadow_dsc->spread = dsc->shadow_spread; - shadow_dsc->opa = dsc->shadow_opa; - shadow_dsc->ofs_x = dsc->shadow_offset_x; - shadow_dsc->ofs_y = dsc->shadow_offset_y; - shadow_dsc->bg_cover = bg_cover; - t->type = LV_DRAW_TASK_TYPE_BOX_SHADOW; - lv_draw_finalize_task_creation(layer, t); - } - - /*Background*/ - if(has_fill) { - lv_area_t bg_coords = *coords; - /*If the border fully covers make the bg area 1px smaller to avoid artifacts on the corners*/ - if(dsc->border_width > 1 && dsc->border_opa >= LV_OPA_MAX && dsc->radius != 0) { - bg_coords.x1 += (dsc->border_side & LV_BORDER_SIDE_LEFT) ? 1 : 0; - bg_coords.y1 += (dsc->border_side & LV_BORDER_SIDE_TOP) ? 1 : 0; - bg_coords.x2 -= (dsc->border_side & LV_BORDER_SIDE_RIGHT) ? 1 : 0; - bg_coords.y2 -= (dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? 1 : 0; - } - - t = lv_draw_add_task(layer, &bg_coords); - lv_draw_fill_dsc_t * bg_dsc = lv_malloc(sizeof(lv_draw_fill_dsc_t)); - lv_draw_fill_dsc_init(bg_dsc); - t->draw_dsc = bg_dsc; - bg_dsc->base = dsc->base; - bg_dsc->base.dsc_size = sizeof(lv_draw_fill_dsc_t); - bg_dsc->radius = dsc->radius; - bg_dsc->color = dsc->bg_color; - bg_dsc->grad = dsc->bg_grad; - bg_dsc->opa = dsc->bg_opa; - t->type = LV_DRAW_TASK_TYPE_FILL; - - lv_draw_finalize_task_creation(layer, t); - } - - /*Background image*/ - if(has_bg_img) { - lv_image_src_t src_type = lv_image_src_get_type(dsc->bg_image_src); - lv_result_t res = LV_RESULT_OK; - lv_image_header_t header; - if(src_type == LV_IMAGE_SRC_VARIABLE || src_type == LV_IMAGE_SRC_FILE) { - res = lv_image_decoder_get_info(dsc->bg_image_src, &header); - } - else if(src_type == LV_IMAGE_SRC_UNKNOWN) { - res = LV_RESULT_INVALID; - } - else { - lv_memzero(&header, sizeof(header)); - } - - if(res == LV_RESULT_OK) { - if(src_type == LV_IMAGE_SRC_VARIABLE || src_type == LV_IMAGE_SRC_FILE) { - - if(dsc->bg_image_tiled) { - t = lv_draw_add_task(layer, coords); - } - else { - lv_area_t a = {0, 0, header.w - 1, header.h - 1}; - lv_area_align(coords, &a, LV_ALIGN_CENTER, 0, 0); - t = lv_draw_add_task(layer, &a); - } - - lv_draw_image_dsc_t * bg_image_dsc = lv_malloc(sizeof(lv_draw_image_dsc_t)); - lv_draw_image_dsc_init(bg_image_dsc); - t->draw_dsc = bg_image_dsc; - bg_image_dsc->base = dsc->base; - bg_image_dsc->base.dsc_size = sizeof(lv_draw_image_dsc_t); - bg_image_dsc->src = dsc->bg_image_src; - bg_image_dsc->opa = dsc->bg_image_opa; - bg_image_dsc->recolor = dsc->bg_image_recolor; - bg_image_dsc->recolor_opa = dsc->bg_image_recolor_opa; - bg_image_dsc->tile = dsc->bg_image_tiled; - bg_image_dsc->header = header; - bg_image_dsc->clip_radius = dsc->radius; - t->type = LV_DRAW_TASK_TYPE_IMAGE; - lv_draw_finalize_task_creation(layer, t); - } - else { - lv_point_t s; - lv_text_get_size(&s, dsc->bg_image_src, dsc->bg_image_symbol_font, 0, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); - - lv_area_t a = {0, 0, s.x - 1, s.y - 1}; - lv_area_align(coords, &a, LV_ALIGN_CENTER, 0, 0); - t = lv_draw_add_task(layer, &a); - - lv_draw_label_dsc_t * bg_label_dsc = lv_malloc(sizeof(lv_draw_label_dsc_t)); - lv_draw_label_dsc_init(bg_label_dsc); - t->draw_dsc = bg_label_dsc; - bg_label_dsc->base = dsc->base; - bg_label_dsc->base.dsc_size = sizeof(lv_draw_label_dsc_t); - bg_label_dsc->color = dsc->bg_image_recolor; - bg_label_dsc->font = dsc->bg_image_symbol_font; - bg_label_dsc->text = dsc->bg_image_src; - t->type = LV_DRAW_TASK_TYPE_LABEL; - lv_draw_finalize_task_creation(layer, t); - } - } - } - - /*Border*/ - if(has_border) { - t = lv_draw_add_task(layer, coords); - lv_draw_border_dsc_t * border_dsc = lv_malloc(sizeof(lv_draw_border_dsc_t)); - t->draw_dsc = border_dsc; - border_dsc->base = dsc->base; - border_dsc->base.dsc_size = sizeof(lv_draw_border_dsc_t); - border_dsc->radius = dsc->radius; - border_dsc->color = dsc->border_color; - border_dsc->opa = dsc->border_opa; - border_dsc->width = dsc->border_width; - border_dsc->side = dsc->border_side; - t->type = LV_DRAW_TASK_TYPE_BORDER; - lv_draw_finalize_task_creation(layer, t); - } - - /*Outline*/ - if(has_outline) { - lv_area_t outline_coords = *coords; - lv_area_increase(&outline_coords, dsc->outline_width + dsc->outline_pad, dsc->outline_width + dsc->outline_pad); - t = lv_draw_add_task(layer, &outline_coords); - lv_draw_border_dsc_t * outline_dsc = lv_malloc(sizeof(lv_draw_border_dsc_t)); - t->draw_dsc = outline_dsc; - lv_area_increase(&t->_real_area, dsc->outline_width, dsc->outline_width); - lv_area_increase(&t->_real_area, dsc->outline_pad, dsc->outline_pad); - outline_dsc->base = dsc->base; - outline_dsc->base.dsc_size = sizeof(lv_draw_border_dsc_t); - outline_dsc->radius = dsc->radius == LV_RADIUS_CIRCLE ? LV_RADIUS_CIRCLE : dsc->radius + dsc->outline_width + - dsc->outline_pad; - outline_dsc->color = dsc->outline_color; - outline_dsc->opa = dsc->outline_opa; - outline_dsc->width = dsc->outline_width; - outline_dsc->side = LV_BORDER_SIDE_FULL; - t->type = LV_DRAW_TASK_TYPE_BORDER; - lv_draw_finalize_task_creation(layer, t); - } - - LV_ASSERT_MEM_INTEGRITY(); - - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_rect.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_rect.h deleted file mode 100644 index 6fe3a82..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_rect.h +++ /dev/null @@ -1,174 +0,0 @@ -/** - * @file lv_draw_rect.h - * - */ - -#ifndef LV_DRAW_RECT_H -#define LV_DRAW_RECT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_draw.h" -#include "../misc/lv_color.h" -#include "../misc/lv_area.h" -#include "../misc/lv_style.h" -#include "sw/lv_draw_sw_gradient.h" - -/********************* - * DEFINES - *********************/ -#define LV_RADIUS_CIRCLE 0x7FFF /**< A very big radius to always draw as circle*/ -LV_EXPORT_CONST_INT(LV_RADIUS_CIRCLE); - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_draw_dsc_base_t base; - - int32_t radius; - - /*Background*/ - lv_opa_t bg_opa; - lv_color_t bg_color; /**< First element of a gradient is a color, so it maps well here*/ - lv_grad_dsc_t bg_grad; - - /*Background img*/ - const void * bg_image_src; - const void * bg_image_symbol_font; - lv_color_t bg_image_recolor; - lv_opa_t bg_image_opa; - lv_opa_t bg_image_recolor_opa; - uint8_t bg_image_tiled; - - /*Border*/ - lv_color_t border_color; - int32_t border_width; - lv_opa_t border_opa; - lv_border_side_t border_side : 5; - uint8_t border_post : 1; /*The border will be drawn later*/ - - /*Outline*/ - lv_color_t outline_color; - int32_t outline_width; - int32_t outline_pad; - lv_opa_t outline_opa; - - /*Shadow*/ - lv_color_t shadow_color; - int32_t shadow_width; - int32_t shadow_offset_x; - int32_t shadow_offset_y; - int32_t shadow_spread; - lv_opa_t shadow_opa; -} lv_draw_rect_dsc_t; - -typedef struct { - lv_draw_dsc_base_t base; - - int32_t radius; - - lv_opa_t opa; - lv_color_t color; - lv_grad_dsc_t grad; -} lv_draw_fill_dsc_t; - -typedef struct { - lv_draw_dsc_base_t base; - - int32_t radius; - - lv_color_t color; - int32_t width; - lv_opa_t opa; - lv_border_side_t side : 5; - -} lv_draw_border_dsc_t; - -typedef struct { - lv_draw_dsc_base_t base; - - int32_t radius; - - lv_color_t color; - int32_t width; - int32_t spread; - int32_t ofs_x; - int32_t ofs_y; - lv_opa_t opa; - uint8_t bg_cover : 1; -} lv_draw_box_shadow_dsc_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize a rectangle draw descriptor. - * @param dsc pointer to a draw descriptor - */ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc); - -/** - * Initialize a fill draw descriptor. - * @param dsc pointer to a draw descriptor - */ -void lv_draw_fill_dsc_init(lv_draw_fill_dsc_t * dsc); - -/** - * Try to get a fill draw descriptor from a draw task. - * @param task draw task - * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_FILL - */ -lv_draw_fill_dsc_t * lv_draw_task_get_fill_dsc(lv_draw_task_t * task); - -/** - * Initialize a border draw descriptor. - * @param dsc pointer to a draw descriptor - */ -void lv_draw_border_dsc_init(lv_draw_border_dsc_t * dsc); - -/** - * Try to get a border draw descriptor from a draw task. - * @param task draw task - * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_BORDER - */ -lv_draw_border_dsc_t * lv_draw_task_get_border_dsc(lv_draw_task_t * task); - -/** - * Initialize a box shadow draw descriptor. - * @param dsc pointer to a draw descriptor - */ -void lv_draw_box_shadow_dsc_init(lv_draw_box_shadow_dsc_t * dsc); - -/** - * Try to get a box shadow draw descriptor from a draw task. - * @param task draw task - * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_BOX_SHADOW - */ -lv_draw_box_shadow_dsc_t * lv_draw_task_get_box_shadow_dsc(lv_draw_task_t * task); - -/** - * The rectangle is a wrapper for fill, border, bg. image and box shadow. - * Internally fill, border, image and box shadow draw tasks will be created. - * @param layer pointer to a layer - * @param dsc pointer to an initialized draw descriptor variable - * @param coords the coordinates of the rectangle - */ -void lv_draw_rect(lv_layer_t * layer, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_RECT_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_rect_private.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_rect_private.h deleted file mode 100644 index ad75b53..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_rect_private.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file lv_draw_rect_private.h - * - */ - -#ifndef LV_DRAW_RECT_PRIVATE_H -#define LV_DRAW_RECT_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_rect.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_RECT_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_triangle.c b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_triangle.c deleted file mode 100644 index 6bf1c7c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_triangle.c +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @file lv_draw_triangle.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_triangle_private.h" -#include "lv_draw_private.h" -#include "../core/lv_obj.h" -#include "../misc/lv_math.h" -#include "../stdlib/lv_mem.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_triangle_dsc_init(lv_draw_triangle_dsc_t * dsc) -{ - LV_PROFILER_BEGIN; - lv_memzero(dsc, sizeof(lv_draw_triangle_dsc_t)); - dsc->bg_color = lv_color_white(); - dsc->bg_grad.stops[0].color = lv_color_white(); - dsc->bg_grad.stops[1].color = lv_color_black(); - dsc->bg_grad.stops[1].frac = 0xFF; - dsc->bg_grad.stops_count = 2; - dsc->bg_opa = LV_OPA_COVER; - dsc->base.dsc_size = sizeof(lv_draw_triangle_dsc_t); - LV_PROFILER_END; -} - -lv_draw_triangle_dsc_t * lv_draw_task_get_triangle_dsc(lv_draw_task_t * task) -{ - return task->type == LV_DRAW_TASK_TYPE_TRIANGLE ? (lv_draw_triangle_dsc_t *)task->draw_dsc : NULL; -} - -void lv_draw_triangle(lv_layer_t * layer, const lv_draw_triangle_dsc_t * dsc) -{ - if(dsc->bg_opa <= LV_OPA_MIN) return; - - LV_PROFILER_BEGIN; - lv_area_t a; - a.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); - a.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); - a.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); - a.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); - - lv_draw_task_t * t = lv_draw_add_task(layer, &a); - - t->draw_dsc = lv_malloc(sizeof(*dsc)); - lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); - t->type = LV_DRAW_TASK_TYPE_TRIANGLE; - - lv_draw_finalize_task_creation(layer, t); - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_triangle.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_triangle.h deleted file mode 100644 index b1ad8e5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_triangle.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @file lv_draw_triangle.h - * - */ - -#ifndef LV_DRAW_TRIANGLE_H -#define LV_DRAW_TRIANGLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_rect.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_draw_dsc_base_t base; - - lv_opa_t bg_opa; - lv_color_t bg_color; - lv_grad_dsc_t bg_grad; - - lv_point_precise_t p[3]; -} lv_draw_triangle_dsc_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize a triangle draw descriptor - * @param draw_dsc pointer to a draw descriptor - */ -void lv_draw_triangle_dsc_init(lv_draw_triangle_dsc_t * draw_dsc); - -/** - * Try to get a triangle draw descriptor from a draw task. - * @param task draw task - * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_TRIANGLE - */ -lv_draw_triangle_dsc_t * lv_draw_task_get_triangle_dsc(lv_draw_task_t * task); - -/** - * Create a triangle draw task - * @param layer pointer to a layer - * @param draw_dsc pointer to an initialized `lv_draw_triangle_dsc_t` object - */ -void lv_draw_triangle(lv_layer_t * layer, const lv_draw_triangle_dsc_t * draw_dsc); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_TRIANGLE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_triangle_private.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_triangle_private.h deleted file mode 100644 index 7fc8ed5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_triangle_private.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @file lv_draw_triangle_private.h - * - */ - -#ifndef LV_DRAW_TRIANGLE_PRIVATE_H -#define LV_DRAW_TRIANGLE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_triangle.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_TRIANGLE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_vector.c b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_vector.c deleted file mode 100644 index 28a08f2..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_vector.c +++ /dev/null @@ -1,804 +0,0 @@ -/** -* @file lv_draw_vector.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_vector_private.h" -#include "../misc/lv_area_private.h" -#include "lv_draw_private.h" - -#if LV_USE_VECTOR_GRAPHIC - -#include "../misc/lv_ll.h" -#include "../misc/lv_types.h" -#include "../stdlib/lv_string.h" -#include -#include - -#define MATH_PI 3.14159265358979323846f -#define MATH_HALF_PI 1.57079632679489661923f - -#define DEG_TO_RAD 0.017453292519943295769236907684886f -#define RAD_TO_DEG 57.295779513082320876798154814105f - -#define MATH_RADIANS(deg) ((deg) * DEG_TO_RAD) -#define MATH_DEGREES(rad) ((rad) * RAD_TO_DEG) - -/********************* - * DEFINES - *********************/ - -#ifndef M_PI - #define M_PI 3.1415926f -#endif - -#define CHECK_AND_RESIZE_PATH_CONTAINER(P, N) \ - do { \ - if ((lv_array_size(&(P)->ops) + (N)) > lv_array_capacity(&(P)->ops)) { \ - lv_array_resize(&(P)->ops, ((P)->ops.capacity << 1)); \ - } \ - if ((lv_array_size(&(P)->points) + (N)) > lv_array_capacity(&(P)->points)) { \ - lv_array_resize(&(P)->points, ((P)->points.capacity << 1)); \ - } \ - } while(0) - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_vector_path_t * path; - lv_vector_draw_dsc_t dsc; -} lv_vector_draw_task; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void _copy_draw_dsc(lv_vector_draw_dsc_t * dst, const lv_vector_draw_dsc_t * src) -{ - lv_memcpy(&(dst->fill_dsc), &(src->fill_dsc), sizeof(lv_vector_fill_dsc_t)); - - dst->stroke_dsc.style = src->stroke_dsc.style; - dst->stroke_dsc.color = src->stroke_dsc.color; - dst->stroke_dsc.opa = src->stroke_dsc.opa; - dst->stroke_dsc.width = src->stroke_dsc.width; - dst->stroke_dsc.cap = src->stroke_dsc.cap; - dst->stroke_dsc.join = src->stroke_dsc.join; - dst->stroke_dsc.miter_limit = src->stroke_dsc.miter_limit; - lv_array_copy(&(dst->stroke_dsc.dash_pattern), &(src->stroke_dsc.dash_pattern)); - dst->stroke_dsc.gradient.style = src->stroke_dsc.gradient.style; - dst->stroke_dsc.gradient.cx = src->stroke_dsc.gradient.cx; - dst->stroke_dsc.gradient.cy = src->stroke_dsc.gradient.cy; - dst->stroke_dsc.gradient.cr = src->stroke_dsc.gradient.cr; - dst->stroke_dsc.gradient.spread = src->fill_dsc.gradient.spread; - lv_memcpy(&(dst->stroke_dsc.gradient), &(src->stroke_dsc.gradient), sizeof(lv_vector_gradient_t)); - lv_memcpy(&(dst->stroke_dsc.matrix), &(src->stroke_dsc.matrix), sizeof(lv_matrix_t)); - - dst->blend_mode = src->blend_mode; - lv_memcpy(&(dst->matrix), &(src->matrix), sizeof(lv_matrix_t)); - lv_area_copy(&(dst->scissor_area), &(src->scissor_area)); -} -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_matrix_transform_point(const lv_matrix_t * matrix, lv_fpoint_t * point) -{ - float x = point->x; - float y = point->y; - - point->x = x * matrix->m[0][0] + y * matrix->m[1][0] + matrix->m[0][2]; - point->y = x * matrix->m[0][1] + y * matrix->m[1][1] + matrix->m[1][2]; -} - -void lv_matrix_transform_path(const lv_matrix_t * matrix, lv_vector_path_t * path) -{ - lv_fpoint_t * pt = lv_array_front(&path->points); - uint32_t size = lv_array_size(&path->points); - for(uint32_t i = 0; i < size; i++) { - lv_matrix_transform_point(matrix, &pt[i]); - } -} - -/* path functions */ -lv_vector_path_t * lv_vector_path_create(lv_vector_path_quality_t quality) -{ - lv_vector_path_t * path = lv_malloc(sizeof(lv_vector_path_t)); - LV_ASSERT_MALLOC(path); - lv_memzero(path, sizeof(lv_vector_path_t)); - path->quality = quality; - lv_array_init(&path->ops, 8, sizeof(lv_vector_path_op_t)); - lv_array_init(&path->points, 8, sizeof(lv_fpoint_t)); - return path; -} - -void lv_vector_path_copy(lv_vector_path_t * target_path, const lv_vector_path_t * path) -{ - target_path->quality = path->quality; - lv_array_copy(&target_path->ops, &path->ops); - lv_array_copy(&target_path->points, &path->points); -} - -void lv_vector_path_clear(lv_vector_path_t * path) -{ - lv_array_clear(&path->ops); - lv_array_clear(&path->points); -} - -void lv_vector_path_delete(lv_vector_path_t * path) -{ - lv_array_deinit(&path->ops); - lv_array_deinit(&path->points); - lv_free(path); -} - -void lv_vector_path_move_to(lv_vector_path_t * path, const lv_fpoint_t * p) -{ - CHECK_AND_RESIZE_PATH_CONTAINER(path, 1); - - lv_vector_path_op_t op = LV_VECTOR_PATH_OP_MOVE_TO; - lv_array_push_back(&path->ops, &op); - lv_array_push_back(&path->points, p); -} - -void lv_vector_path_line_to(lv_vector_path_t * path, const lv_fpoint_t * p) -{ - if(lv_array_is_empty(&path->ops)) { - /*first op must be move_to*/ - return; - } - - CHECK_AND_RESIZE_PATH_CONTAINER(path, 1); - - lv_vector_path_op_t op = LV_VECTOR_PATH_OP_LINE_TO; - lv_array_push_back(&path->ops, &op); - lv_array_push_back(&path->points, p); -} - -void lv_vector_path_quad_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2) -{ - if(lv_array_is_empty(&path->ops)) { - /*first op must be move_to*/ - return; - } - - CHECK_AND_RESIZE_PATH_CONTAINER(path, 2); - - lv_vector_path_op_t op = LV_VECTOR_PATH_OP_QUAD_TO; - lv_array_push_back(&path->ops, &op); - lv_array_push_back(&path->points, p1); - lv_array_push_back(&path->points, p2); -} - -void lv_vector_path_cubic_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2, - const lv_fpoint_t * p3) -{ - if(lv_array_is_empty(&path->ops)) { - /*first op must be move_to*/ - return; - } - - CHECK_AND_RESIZE_PATH_CONTAINER(path, 3); - - lv_vector_path_op_t op = LV_VECTOR_PATH_OP_CUBIC_TO; - lv_array_push_back(&path->ops, &op); - lv_array_push_back(&path->points, p1); - lv_array_push_back(&path->points, p2); - lv_array_push_back(&path->points, p3); -} - -void lv_vector_path_close(lv_vector_path_t * path) -{ - if(lv_array_is_empty(&path->ops)) { - /*first op must be move_to*/ - return; - } - - CHECK_AND_RESIZE_PATH_CONTAINER(path, 1); - - lv_vector_path_op_t op = LV_VECTOR_PATH_OP_CLOSE; - lv_array_push_back(&path->ops, &op); -} - -void lv_vector_path_get_bounding(const lv_vector_path_t * path, lv_area_t * area) -{ - LV_ASSERT_NULL(path); - LV_ASSERT_NULL(area); - - uint32_t len = lv_array_size(&path->points); - if(len == 0) { - lv_memzero(area, sizeof(lv_area_t)); - return; - } - - lv_fpoint_t * p = lv_array_front(&path->points); - float x1 = p[0].x; - float x2 = p[0].x; - float y1 = p[0].y; - float y2 = p[0].y; - - for(uint32_t i = 1; i < len; i++) { - if(p[i].x < x1) x1 = p[i].x; - if(p[i].y < y1) y1 = p[i].y; - if(p[i].x > x2) x2 = p[i].x; - if(p[i].y > y2) y2 = p[i].y; - } - - area->x1 = (int32_t)x1; - area->y1 = (int32_t)y1; - area->x2 = (int32_t)x2; - area->y2 = (int32_t)y2; -} - -void lv_vector_path_append_rect(lv_vector_path_t * path, const lv_area_t * rect, float rx, float ry) -{ - float x = rect->x1; - float y = rect->y1; - float w = (float)lv_area_get_width(rect); - float h = (float)lv_area_get_height(rect); - - float hw = w * 0.5f; - float hh = h * 0.5f; - - if(rx > hw) rx = hw; - if(ry > hh) ry = hh; - - if(rx == 0 && ry == 0) { - lv_fpoint_t pt = {x, y}; - lv_vector_path_move_to(path, &pt); - pt.x += w; - lv_vector_path_line_to(path, &pt); - pt.y += h; - lv_vector_path_line_to(path, &pt); - pt.x -= w; - lv_vector_path_line_to(path, &pt); - lv_vector_path_close(path); - } - else if(rx == hw && ry == hh) { - lv_fpoint_t pt = {x + w * 0.5f, y + h * 0.5f}; - lv_vector_path_append_circle(path, &pt, rx, ry); - } - else { - float hrx = rx * 0.5f; - float hry = ry * 0.5f; - lv_fpoint_t pt, pt2, pt3; - - pt.x = x + rx; - pt.y = y; - lv_vector_path_move_to(path, &pt); - - pt.x = x + w - rx; - pt.y = y; - lv_vector_path_line_to(path, &pt); - - pt.x = x + w - rx + hrx; - pt.y = y; - pt2.x = x + w; - pt2.y = y + ry - hry; - pt3.x = x + w; - pt3.y = y + ry; - lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); - - pt.x = x + w; - pt.y = y + h - ry; - lv_vector_path_line_to(path, &pt); - - pt.x = x + w; - pt.y = y + h - ry + hry; - pt2.x = x + w - rx + hrx; - pt2.y = y + h; - pt3.x = x + w - rx; - pt3.y = y + h; - lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); - - pt.x = x + rx; - pt.y = y + h; - lv_vector_path_line_to(path, &pt); - - pt.x = x + rx - hrx; - pt.y = y + h; - pt2.x = x; - pt2.y = y + h - ry + hry; - pt3.x = x; - pt3.y = y + h - ry; - lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); - - pt.x = x; - pt.y = y + ry; - lv_vector_path_line_to(path, &pt); - - pt.x = x; - pt.y = y + ry - hry; - pt2.x = x + rx - hrx; - pt2.y = y; - pt3.x = x + rx; - pt3.y = y; - lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); - lv_vector_path_close(path); - } -} - -void lv_vector_path_append_circle(lv_vector_path_t * path, const lv_fpoint_t * c, float rx, float ry) -{ - float krx = rx * 0.552284f; - float kry = ry * 0.552284f; - float cx = c->x; - float cy = c->y; - - lv_fpoint_t pt, pt2, pt3; - pt.x = cx; - pt.y = cy - ry; - lv_vector_path_move_to(path, &pt); - - pt.x = cx + krx; - pt.y = cy - ry; - pt2.x = cx + rx; - pt2.y = cy - kry; - pt3.x = cx + rx; - pt3.y = cy; - lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); - - pt.x = cx + rx; - pt.y = cy + kry; - pt2.x = cx + krx; - pt2.y = cy + ry; - pt3.x = cx; - pt3.y = cy + ry; - lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); - - pt.x = cx - krx; - pt.y = cy + ry; - pt2.x = cx - rx; - pt2.y = cy + kry; - pt3.x = cx - rx; - pt3.y = cy; - lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); - - pt.x = cx - rx; - pt.y = cy - kry; - pt2.x = cx - krx; - pt2.y = cy - ry; - pt3.x = cx; - pt3.y = cy - ry; - lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); - - lv_vector_path_close(path); -} - -/** - * Add a arc to the path - * @param path pointer to a path - * @param c pointer to a `lv_fpoint_t` variable for center of the circle - * @param radius the radius for arc - * @param start_angle the start angle for arc - * @param sweep the sweep angle for arc, could be negative - * @param pie true: draw a pie, false: draw a arc - */ -void lv_vector_path_append_arc(lv_vector_path_t * path, const lv_fpoint_t * c, float radius, float start_angle, - float sweep, bool pie) -{ - float cx = c->x; - float cy = c->y; - - /* just circle */ - if(sweep >= 360.0f || sweep <= -360.0f) { - lv_vector_path_append_circle(path, c, radius, radius); - return; - } - - start_angle = MATH_RADIANS(start_angle); - sweep = MATH_RADIANS(sweep); - - int n_curves = (int)ceil(fabsf(sweep / MATH_HALF_PI)); - float sweep_sign = sweep < 0 ? -1.f : 1.f; - float fract = fmodf(sweep, MATH_HALF_PI); - fract = (fabsf(fract) < FLT_EPSILON) ? MATH_HALF_PI * sweep_sign : fract; - - /* Start from here */ - lv_fpoint_t start = { - .x = radius * cosf(start_angle), - .y = radius * sinf(start_angle), - }; - - if(pie) { - lv_vector_path_move_to(path, &(lv_fpoint_t) { - cx, cy - }); - lv_vector_path_line_to(path, &(lv_fpoint_t) { - start.x + cx, start.y + cy - }); - } - - for(int i = 0; i < n_curves; ++i) { - float end_angle = start_angle + ((i != n_curves - 1) ? MATH_HALF_PI * sweep_sign : fract); - float end_x = radius * cosf(end_angle); - float end_y = radius * sinf(end_angle); - - /* variables needed to calculate bezier control points */ - - /** get bezier control points using article: - * (http://itc.ktu.lt/index.php/ITC/article/view/11812/6479) - */ - float ax = start.x; - float ay = start.y; - float bx = end_x; - float by = end_y; - float q1 = ax * ax + ay * ay; - float q2 = ax * bx + ay * by + q1; - float k2 = (4.0f / 3.0f) * ((sqrtf(2 * q1 * q2) - q2) / (ax * by - ay * bx)); - - /* Next start point is the current end point */ - start.x = end_x; - start.y = end_y; - - end_x += cx; - end_y += cy; - - lv_fpoint_t ctrl1 = {ax - k2 * ay + cx, ay + k2 * ax + cy}; - lv_fpoint_t ctrl2 = {bx + k2 * by + cx, by - k2 * bx + cy}; - lv_fpoint_t end = {end_x, end_y}; - lv_vector_path_cubic_to(path, &ctrl1, &ctrl2, &end); - start_angle = end_angle; - } - - if(pie) { - lv_vector_path_close(path); - } -} - -void lv_vector_path_append_path(lv_vector_path_t * path, const lv_vector_path_t * subpath) -{ - uint32_t ops_size = lv_array_size(&path->ops); - uint32_t nops_size = lv_array_size(&subpath->ops); - uint32_t point_size = lv_array_size(&path->points); - uint32_t npoint_size = lv_array_size(&subpath->points); - - lv_array_concat(&path->ops, &subpath->ops); - path->ops.size = ops_size + nops_size; - - lv_array_concat(&path->points, &subpath->points); - path->points.size = point_size + npoint_size; -} - -/* draw dsc functions */ - -lv_vector_dsc_t * lv_vector_dsc_create(lv_layer_t * layer) -{ - lv_vector_dsc_t * dsc = lv_malloc(sizeof(lv_vector_dsc_t)); - LV_ASSERT_MALLOC(dsc); - lv_memzero(dsc, sizeof(lv_vector_dsc_t)); - - dsc->layer = layer; - - lv_vector_fill_dsc_t * fill_dsc = &(dsc->current_dsc.fill_dsc); - fill_dsc->style = LV_VECTOR_DRAW_STYLE_SOLID; - fill_dsc->color = lv_color_to_32(lv_color_black(), 0xFF); - fill_dsc->opa = LV_OPA_COVER; - fill_dsc->fill_rule = LV_VECTOR_FILL_NONZERO; - lv_matrix_identity(&(fill_dsc->matrix)); /*identity matrix*/ - - lv_vector_stroke_dsc_t * stroke_dsc = &(dsc->current_dsc.stroke_dsc); - stroke_dsc->style = LV_VECTOR_DRAW_STYLE_SOLID; - stroke_dsc->color = lv_color_to_32(lv_color_black(), 0xFF); - stroke_dsc->opa = LV_OPA_0; /*default no stroke*/ - stroke_dsc->width = 1.0f; - stroke_dsc->cap = LV_VECTOR_STROKE_CAP_BUTT; - stroke_dsc->join = LV_VECTOR_STROKE_JOIN_MITER; - stroke_dsc->miter_limit = 4.0f; - lv_matrix_identity(&(stroke_dsc->matrix)); /*identity matrix*/ - - dsc->current_dsc.blend_mode = LV_VECTOR_BLEND_SRC_OVER; - dsc->current_dsc.scissor_area = layer->_clip_area; - lv_matrix_identity(&(dsc->current_dsc.matrix)); /*identity matrix*/ - dsc->tasks.task_list = NULL; - return dsc; -} - -void lv_vector_dsc_delete(lv_vector_dsc_t * dsc) -{ - if(dsc->tasks.task_list) { - lv_ll_t * task_list = dsc->tasks.task_list; - lv_vector_for_each_destroy_tasks(task_list, NULL, NULL); - dsc->tasks.task_list = NULL; - } - lv_array_deinit(&(dsc->current_dsc.stroke_dsc.dash_pattern)); - lv_free(dsc); -} - -void lv_vector_dsc_set_blend_mode(lv_vector_dsc_t * dsc, lv_vector_blend_t blend) -{ - dsc->current_dsc.blend_mode = blend; -} - -void lv_vector_dsc_set_transform(lv_vector_dsc_t * dsc, const lv_matrix_t * matrix) -{ - lv_memcpy(&(dsc->current_dsc.matrix), matrix, sizeof(lv_matrix_t)); -} - -void lv_vector_dsc_set_fill_color(lv_vector_dsc_t * dsc, lv_color_t color) -{ - dsc->current_dsc.fill_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; - dsc->current_dsc.fill_dsc.color = lv_color_to_32(color, 0xFF); -} - -void lv_vector_dsc_set_fill_color32(lv_vector_dsc_t * dsc, lv_color32_t color) -{ - dsc->current_dsc.fill_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; - dsc->current_dsc.fill_dsc.color = color; -} - -void lv_vector_dsc_set_fill_opa(lv_vector_dsc_t * dsc, lv_opa_t opa) -{ - dsc->current_dsc.fill_dsc.opa = opa; -} - -void lv_vector_dsc_set_fill_rule(lv_vector_dsc_t * dsc, lv_vector_fill_t rule) -{ - dsc->current_dsc.fill_dsc.fill_rule = rule; -} - -void lv_vector_dsc_set_fill_image(lv_vector_dsc_t * dsc, const lv_draw_image_dsc_t * img_dsc) -{ - dsc->current_dsc.fill_dsc.style = LV_VECTOR_DRAW_STYLE_PATTERN; - lv_memcpy(&(dsc->current_dsc.fill_dsc.img_dsc), img_dsc, sizeof(lv_draw_image_dsc_t)); -} - -void lv_vector_dsc_set_fill_linear_gradient(lv_vector_dsc_t * dsc, float x1, float y1, float x2, float y2) -{ - dsc->current_dsc.fill_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; - dsc->current_dsc.fill_dsc.gradient.style = LV_VECTOR_GRADIENT_STYLE_LINEAR; - dsc->current_dsc.fill_dsc.gradient.x1 = x1; - dsc->current_dsc.fill_dsc.gradient.y1 = y1; - dsc->current_dsc.fill_dsc.gradient.x2 = x2; - dsc->current_dsc.fill_dsc.gradient.y2 = y2; -} - -void lv_vector_dsc_set_fill_radial_gradient(lv_vector_dsc_t * dsc, float cx, float cy, float radius) -{ - dsc->current_dsc.fill_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; - dsc->current_dsc.fill_dsc.gradient.style = LV_VECTOR_GRADIENT_STYLE_RADIAL; - dsc->current_dsc.fill_dsc.gradient.cx = cx; - dsc->current_dsc.fill_dsc.gradient.cy = cy; - dsc->current_dsc.fill_dsc.gradient.cr = radius; -} - -void lv_vector_dsc_set_fill_gradient_spread(lv_vector_dsc_t * dsc, lv_vector_gradient_spread_t spread) -{ - dsc->current_dsc.fill_dsc.gradient.spread = spread; -} - -void lv_vector_dsc_set_fill_gradient_color_stops(lv_vector_dsc_t * dsc, const lv_gradient_stop_t * stops, - uint16_t count) -{ - if(count > LV_GRADIENT_MAX_STOPS) { - LV_LOG_WARN("Gradient stops limited: %d, max: %d", count, LV_GRADIENT_MAX_STOPS); - count = LV_GRADIENT_MAX_STOPS; - } - - lv_memcpy(&(dsc->current_dsc.fill_dsc.gradient.stops), stops, sizeof(lv_gradient_stop_t) * count); - dsc->current_dsc.fill_dsc.gradient.stops_count = count; -} - -void lv_vector_dsc_set_fill_transform(lv_vector_dsc_t * dsc, const lv_matrix_t * matrix) -{ - lv_memcpy(&(dsc->current_dsc.fill_dsc.matrix), matrix, sizeof(lv_matrix_t)); -} - -void lv_vector_dsc_set_stroke_transform(lv_vector_dsc_t * dsc, const lv_matrix_t * matrix) -{ - lv_memcpy(&(dsc->current_dsc.stroke_dsc.matrix), matrix, sizeof(lv_matrix_t)); -} - -void lv_vector_dsc_set_stroke_color32(lv_vector_dsc_t * dsc, lv_color32_t color) -{ - dsc->current_dsc.stroke_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; - dsc->current_dsc.stroke_dsc.color = color; -} - -void lv_vector_dsc_set_stroke_color(lv_vector_dsc_t * dsc, lv_color_t color) -{ - dsc->current_dsc.stroke_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; - dsc->current_dsc.stroke_dsc.color = lv_color_to_32(color, 0xFF); -} - -void lv_vector_dsc_set_stroke_opa(lv_vector_dsc_t * dsc, lv_opa_t opa) -{ - dsc->current_dsc.stroke_dsc.opa = opa; -} - -void lv_vector_dsc_set_stroke_width(lv_vector_dsc_t * dsc, float width) -{ - dsc->current_dsc.stroke_dsc.width = width; -} - -void lv_vector_dsc_set_stroke_dash(lv_vector_dsc_t * dsc, float * dash_pattern, uint16_t dash_count) -{ - lv_array_t * dash_array = &(dsc->current_dsc.stroke_dsc.dash_pattern); - if(dash_pattern) { - lv_array_clear(dash_array); - if(lv_array_capacity(dash_array) == 0) { - lv_array_init(dash_array, dash_count, sizeof(float)); - } - else { - lv_array_resize(dash_array, dash_count); - } - for(uint16_t i = 0; i < dash_count; i++) { - lv_array_push_back(dash_array, &dash_pattern[i]); - } - } - else { /*clear dash*/ - lv_array_clear(dash_array); - } -} - -void lv_vector_dsc_set_stroke_cap(lv_vector_dsc_t * dsc, lv_vector_stroke_cap_t cap) -{ - dsc->current_dsc.stroke_dsc.cap = cap; -} - -void lv_vector_dsc_set_stroke_join(lv_vector_dsc_t * dsc, lv_vector_stroke_join_t join) -{ - dsc->current_dsc.stroke_dsc.join = join; -} - -void lv_vector_dsc_set_stroke_miter_limit(lv_vector_dsc_t * dsc, uint16_t miter_limit) -{ - dsc->current_dsc.stroke_dsc.miter_limit = miter_limit; -} - -void lv_vector_dsc_set_stroke_linear_gradient(lv_vector_dsc_t * dsc, float x1, float y1, float x2, float y2) -{ - dsc->current_dsc.stroke_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; - dsc->current_dsc.stroke_dsc.gradient.style = LV_VECTOR_GRADIENT_STYLE_LINEAR; - dsc->current_dsc.stroke_dsc.gradient.x1 = x1; - dsc->current_dsc.stroke_dsc.gradient.y1 = y1; - dsc->current_dsc.stroke_dsc.gradient.x2 = x2; - dsc->current_dsc.stroke_dsc.gradient.y2 = y2; -} - -void lv_vector_dsc_set_stroke_radial_gradient(lv_vector_dsc_t * dsc, float cx, float cy, float radius) -{ - dsc->current_dsc.stroke_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; - dsc->current_dsc.stroke_dsc.gradient.style = LV_VECTOR_GRADIENT_STYLE_RADIAL; - dsc->current_dsc.stroke_dsc.gradient.cx = cx; - dsc->current_dsc.stroke_dsc.gradient.cy = cy; - dsc->current_dsc.stroke_dsc.gradient.cr = radius; -} - -void lv_vector_dsc_set_stroke_gradient_spread(lv_vector_dsc_t * dsc, lv_vector_gradient_spread_t spread) -{ - dsc->current_dsc.stroke_dsc.gradient.spread = spread; -} - -void lv_vector_dsc_set_stroke_gradient_color_stops(lv_vector_dsc_t * dsc, const lv_gradient_stop_t * stops, - uint16_t count) -{ - if(count > LV_GRADIENT_MAX_STOPS) { - LV_LOG_WARN("Gradient stops limited: %d, max: %d", count, LV_GRADIENT_MAX_STOPS); - count = LV_GRADIENT_MAX_STOPS; - } - - lv_memcpy(&(dsc->current_dsc.stroke_dsc.gradient.stops), stops, sizeof(lv_gradient_stop_t) * count); - dsc->current_dsc.stroke_dsc.gradient.stops_count = count; -} - -/* draw functions */ -void lv_vector_dsc_add_path(lv_vector_dsc_t * dsc, const lv_vector_path_t * path) -{ - lv_area_t rect; - if(!lv_area_intersect(&rect, &(dsc->layer->_clip_area), &(dsc->current_dsc.scissor_area))) { - return; - } - - if(dsc->current_dsc.fill_dsc.opa == 0 - && dsc->current_dsc.stroke_dsc.opa == 0) { - return; - } - - if(!dsc->tasks.task_list) { - dsc->tasks.task_list = lv_malloc(sizeof(lv_ll_t)); - LV_ASSERT_MALLOC(dsc->tasks.task_list); - lv_ll_init(dsc->tasks.task_list, sizeof(lv_vector_draw_task)); - } - - lv_vector_draw_task * new_task = (lv_vector_draw_task *)lv_ll_ins_tail(dsc->tasks.task_list); - lv_memset(new_task, 0, sizeof(lv_vector_draw_task)); - - new_task->path = lv_vector_path_create(0); - - _copy_draw_dsc(&(new_task->dsc), &(dsc->current_dsc)); - lv_vector_path_copy(new_task->path, path); - new_task->dsc.scissor_area = rect; -} - -void lv_vector_clear_area(lv_vector_dsc_t * dsc, const lv_area_t * rect) -{ - lv_area_t r; - if(!lv_area_intersect(&r, &(dsc->layer->_clip_area), &(dsc->current_dsc.scissor_area))) { - return; - } - - if(!dsc->tasks.task_list) { - dsc->tasks.task_list = lv_malloc(sizeof(lv_ll_t)); - LV_ASSERT_MALLOC(dsc->tasks.task_list); - lv_ll_init(dsc->tasks.task_list, sizeof(lv_vector_draw_task)); - } - - lv_vector_draw_task * new_task = (lv_vector_draw_task *)lv_ll_ins_tail(dsc->tasks.task_list); - lv_memset(new_task, 0, sizeof(lv_vector_draw_task)); - - new_task->dsc.fill_dsc.color = dsc->current_dsc.fill_dsc.color; - new_task->dsc.fill_dsc.opa = dsc->current_dsc.fill_dsc.opa; - lv_area_copy(&(new_task->dsc.scissor_area), rect); -} - -void lv_draw_vector(lv_vector_dsc_t * dsc) -{ - if(!dsc->tasks.task_list) { - return; - } - - lv_layer_t * layer = dsc->layer; - - lv_draw_task_t * t = lv_draw_add_task(layer, &(layer->_clip_area)); - t->type = LV_DRAW_TASK_TYPE_VECTOR; - t->draw_dsc = lv_malloc(sizeof(lv_draw_vector_task_dsc_t)); - lv_memcpy(t->draw_dsc, &(dsc->tasks), sizeof(lv_draw_vector_task_dsc_t)); - lv_draw_finalize_task_creation(layer, t); - dsc->tasks.task_list = NULL; -} - -/* draw dsc transform */ -void lv_vector_dsc_identity(lv_vector_dsc_t * dsc) -{ - lv_matrix_identity(&(dsc->current_dsc.matrix)); /*identity matrix*/ -} - -void lv_vector_dsc_scale(lv_vector_dsc_t * dsc, float scale_x, float scale_y) -{ - lv_matrix_scale(&(dsc->current_dsc.matrix), scale_x, scale_y); -} - -void lv_vector_dsc_rotate(lv_vector_dsc_t * dsc, float degree) -{ - lv_matrix_rotate(&(dsc->current_dsc.matrix), degree); -} - -void lv_vector_dsc_translate(lv_vector_dsc_t * dsc, float tx, float ty) -{ - lv_matrix_translate(&(dsc->current_dsc.matrix), tx, ty); -} - -void lv_vector_dsc_skew(lv_vector_dsc_t * dsc, float skew_x, float skew_y) -{ - lv_matrix_skew(&(dsc->current_dsc.matrix), skew_x, skew_y); -} - -void lv_vector_for_each_destroy_tasks(lv_ll_t * task_list, vector_draw_task_cb cb, void * data) -{ - lv_vector_draw_task * task = lv_ll_get_head(task_list); - lv_vector_draw_task * next_task = NULL; - - while(task != NULL) { - next_task = lv_ll_get_next(task_list, task); - lv_ll_remove(task_list, task); - - if(cb) { - cb(data, task->path, &(task->dsc)); - } - - if(task->path) { - lv_vector_path_delete(task->path); - } - lv_array_deinit(&(task->dsc.stroke_dsc.dash_pattern)); - - lv_free(task); - task = next_task; - } - lv_free(task_list); -} -#endif /* LV_USE_VECTOR_GRAPHIC */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_vector.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_vector.h deleted file mode 100644 index 38ce78a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_vector.h +++ /dev/null @@ -1,489 +0,0 @@ -/** - * @file lv_draw_vector.h - * - */ - -#ifndef LV_DRAW_VECTOR_H -#define LV_DRAW_VECTOR_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../misc/lv_array.h" -#include "../misc/lv_matrix.h" -#include "lv_draw_image.h" - -#if LV_USE_VECTOR_GRAPHIC - -#if !LV_USE_MATRIX -#error "lv_draw_vector needs LV_USE_MATRIX = 1" -#endif - -/********************** - * TYPEDEFS - **********************/ -typedef enum { - LV_VECTOR_FILL_NONZERO = 0, - LV_VECTOR_FILL_EVENODD, -} lv_vector_fill_t; - -typedef enum { - LV_VECTOR_STROKE_CAP_BUTT = 0, - LV_VECTOR_STROKE_CAP_SQUARE, - LV_VECTOR_STROKE_CAP_ROUND, -} lv_vector_stroke_cap_t; - -typedef enum { - LV_VECTOR_STROKE_JOIN_MITER = 0, - LV_VECTOR_STROKE_JOIN_BEVEL, - LV_VECTOR_STROKE_JOIN_ROUND, -} lv_vector_stroke_join_t; - -typedef enum { - LV_VECTOR_PATH_QUALITY_MEDIUM = 0, /* default*/ - LV_VECTOR_PATH_QUALITY_HIGH, - LV_VECTOR_PATH_QUALITY_LOW, -} lv_vector_path_quality_t; - -typedef enum { - LV_VECTOR_BLEND_SRC_OVER = 0, - LV_VECTOR_BLEND_SRC_IN, - LV_VECTOR_BLEND_DST_OVER, - LV_VECTOR_BLEND_DST_IN, - LV_VECTOR_BLEND_SCREEN, - LV_VECTOR_BLEND_MULTIPLY, - LV_VECTOR_BLEND_NONE, - LV_VECTOR_BLEND_ADDITIVE, - LV_VECTOR_BLEND_SUBTRACTIVE, -} lv_vector_blend_t; - -typedef enum { - LV_VECTOR_PATH_OP_MOVE_TO = 0, - LV_VECTOR_PATH_OP_LINE_TO, - LV_VECTOR_PATH_OP_QUAD_TO, - LV_VECTOR_PATH_OP_CUBIC_TO, - LV_VECTOR_PATH_OP_CLOSE, -} lv_vector_path_op_t; - -typedef enum { - LV_VECTOR_DRAW_STYLE_SOLID = 0, - LV_VECTOR_DRAW_STYLE_PATTERN, - LV_VECTOR_DRAW_STYLE_GRADIENT, -} lv_vector_draw_style_t; - -typedef enum { - LV_VECTOR_GRADIENT_SPREAD_PAD = 0, - LV_VECTOR_GRADIENT_SPREAD_REPEAT, - LV_VECTOR_GRADIENT_SPREAD_REFLECT, -} lv_vector_gradient_spread_t; - -typedef enum { - LV_VECTOR_GRADIENT_STYLE_LINEAR = 0, - LV_VECTOR_GRADIENT_STYLE_RADIAL, -} lv_vector_gradient_style_t; - -struct lv_fpoint_t { - float x; - float y; -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Transform the coordinates of a point using given matrix - * @param matrix pointer to a matrix - * @param point pointer to a point - */ -void lv_matrix_transform_point(const lv_matrix_t * matrix, lv_fpoint_t * point); - -/** - * Transform all the coordinates of a path using given matrix - * @param matrix pointer to a matrix - * @param path pointer to a path - */ -void lv_matrix_transform_path(const lv_matrix_t * matrix, lv_vector_path_t * path); - -/** - * Create a vector graphic path object - * @param quality the quality hint of path - * @return pointer to the created path object - */ -lv_vector_path_t * lv_vector_path_create(lv_vector_path_quality_t quality); - -/** - * Copy a path data to another - * @param target_path pointer to a path - * @param path pointer to source path - */ -void lv_vector_path_copy(lv_vector_path_t * target_path, const lv_vector_path_t * path); - -/** - * Clear path data - * @param path pointer to a path - */ -void lv_vector_path_clear(lv_vector_path_t * path); - -/** - * Delete the graphic path object - * @param path pointer to a path - */ -void lv_vector_path_delete(lv_vector_path_t * path); - -/** - * Begin a new sub path and set a point to path - * @param path pointer to a path - * @param p pointer to a `lv_fpoint_t` variable - */ -void lv_vector_path_move_to(lv_vector_path_t * path, const lv_fpoint_t * p); - -/** - * Add a line to the path from last point to the point - * @param path pointer to a path - * @param p pointer to a `lv_fpoint_t` variable - */ -void lv_vector_path_line_to(lv_vector_path_t * path, const lv_fpoint_t * p); - -/** - * Add a quadratic bezier line to the path from last point to the point - * @param path pointer to a path - * @param p1 pointer to a `lv_fpoint_t` variable for control point - * @param p2 pointer to a `lv_fpoint_t` variable for end point - */ -void lv_vector_path_quad_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2); - -/** - * Add a cubic bezier line to the path from last point to the point - * @param path pointer to a path - * @param p1 pointer to a `lv_fpoint_t` variable for first control point - * @param p2 pointer to a `lv_fpoint_t` variable for second control point - * @param p3 pointer to a `lv_fpoint_t` variable for end point - */ -void lv_vector_path_cubic_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2, - const lv_fpoint_t * p3); - -/** - * Close the sub path - * @param path pointer to a path - */ -void lv_vector_path_close(lv_vector_path_t * path); - -/** - * Get the bounding box of a path - * @param path pointer to a path - * @param area pointer to a `lv_area_t` variable for bounding box - */ -void lv_vector_path_get_bounding(const lv_vector_path_t * path, lv_area_t * area); - -/** - * Add a rectangle to the path - * @param path pointer to a path - * @param rect pointer to a `lv_area_t` variable - * @param rx the horizontal radius for rounded rectangle - * @param ry the vertical radius for rounded rectangle - */ -void lv_vector_path_append_rect(lv_vector_path_t * path, const lv_area_t * rect, float rx, float ry); - -/** - * Add a circle to the path - * @param path pointer to a path - * @param c pointer to a `lv_fpoint_t` variable for center of the circle - * @param rx the horizontal radius for circle - * @param ry the vertical radius for circle - */ -void lv_vector_path_append_circle(lv_vector_path_t * path, const lv_fpoint_t * c, float rx, float ry); - -/** - * Add a arc to the path - * @param path pointer to a path - * @param c pointer to a `lv_fpoint_t` variable for center of the circle - * @param radius the radius for arc - * @param start_angle the start angle for arc - * @param sweep the sweep angle for arc, could be negative - * @param pie true: draw a pie, false: draw a arc - */ -void lv_vector_path_append_arc(lv_vector_path_t * path, const lv_fpoint_t * c, float radius, float start_angle, - float sweep, bool pie); - -/** - * Add an sub path to the path - * @param path pointer to a path - * @param subpath pointer to another path which will be added - */ -void lv_vector_path_append_path(lv_vector_path_t * path, const lv_vector_path_t * subpath); - -/** - * Create a vector graphic descriptor - * @param layer pointer to a layer - * @return pointer to the created descriptor - */ -lv_vector_dsc_t * lv_vector_dsc_create(lv_layer_t * layer); - -/** - * Delete the vector graphic descriptor - * @param dsc pointer to a vector graphic descriptor - */ -void lv_vector_dsc_delete(lv_vector_dsc_t * dsc); - -/** - * Set a matrix to current transformation matrix - * @param dsc pointer to a vector graphic descriptor - * @param matrix pointer to a matrix - */ -void lv_vector_dsc_set_transform(lv_vector_dsc_t * dsc, const lv_matrix_t * matrix); - -/** - * Set blend mode for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param blend the blend mode to be set in `lv_vector_blend_t` - */ -void lv_vector_dsc_set_blend_mode(lv_vector_dsc_t * dsc, lv_vector_blend_t blend); - -/** - * Set fill color for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param color the color to be set in lv_color32_t format - */ -void lv_vector_dsc_set_fill_color32(lv_vector_dsc_t * dsc, lv_color32_t color); - -/** - * Set fill color for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param color the color to be set in lv_color_t format - */ -void lv_vector_dsc_set_fill_color(lv_vector_dsc_t * dsc, lv_color_t color); - -/** - * Set fill opacity for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param opa the opacity to be set in lv_opa_t format - */ -void lv_vector_dsc_set_fill_opa(lv_vector_dsc_t * dsc, lv_opa_t opa); - -/** - * Set fill rule for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param rule the fill rule to be set in lv_vector_fill_t format - */ -void lv_vector_dsc_set_fill_rule(lv_vector_dsc_t * dsc, lv_vector_fill_t rule); - -/** - * Set fill image for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param img_dsc pointer to a `lv_draw_image_dsc_t` variable - */ -void lv_vector_dsc_set_fill_image(lv_vector_dsc_t * dsc, const lv_draw_image_dsc_t * img_dsc); - -/** - * Set fill linear gradient for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param x1 the x for start point - * @param y1 the y for start point - * @param x2 the x for end point - * @param y2 the y for end point - */ -void lv_vector_dsc_set_fill_linear_gradient(lv_vector_dsc_t * dsc, float x1, float y1, float x2, float y2); - -/** - - * Set fill radial gradient radius for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param cx the x for center of the circle - * @param cy the y for center of the circle - * @param radius the radius for circle - */ -void lv_vector_dsc_set_fill_radial_gradient(lv_vector_dsc_t * dsc, float cx, float cy, float radius); - -/** - * Set fill radial gradient spread for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param spread the gradient spread to be set in lv_vector_gradient_spread_t format - */ -void lv_vector_dsc_set_fill_gradient_spread(lv_vector_dsc_t * dsc, lv_vector_gradient_spread_t spread); - -/** - * Set fill gradient color stops for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param stops an array of `lv_gradient_stop_t` variables - * @param count the number of stops in the array, range: 0..LV_GRADIENT_MAX_STOPS - */ -void lv_vector_dsc_set_fill_gradient_color_stops(lv_vector_dsc_t * dsc, const lv_gradient_stop_t * stops, - uint16_t count); - -/** - * Set a matrix to current fill transformation matrix - * @param dsc pointer to a vector graphic descriptor - * @param matrix pointer to a matrix - */ -void lv_vector_dsc_set_fill_transform(lv_vector_dsc_t * dsc, const lv_matrix_t * matrix); - -/** - * Set stroke color for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param color the color to be set in lv_color32_t format - */ -void lv_vector_dsc_set_stroke_color32(lv_vector_dsc_t * dsc, lv_color32_t color); - -/** - * Set stroke color for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param color the color to be set in lv_color_t format - */ -void lv_vector_dsc_set_stroke_color(lv_vector_dsc_t * dsc, lv_color_t color); - -/** - * Set stroke opacity for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param opa the opacity to be set in lv_opa_t format - */ -void lv_vector_dsc_set_stroke_opa(lv_vector_dsc_t * dsc, lv_opa_t opa); - -/** - * Set stroke line width for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param width the stroke line width - */ -void lv_vector_dsc_set_stroke_width(lv_vector_dsc_t * dsc, float width); - -/** - * Set stroke line dash pattern for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param dash_pattern an array of values that specify the segments of dash line - * @param dash_count the length of dash pattern array - */ -void lv_vector_dsc_set_stroke_dash(lv_vector_dsc_t * dsc, float * dash_pattern, uint16_t dash_count); - -/** - * Set stroke line cap style for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param cap the line cap to be set in lv_vector_stroke_cap_t format - */ -void lv_vector_dsc_set_stroke_cap(lv_vector_dsc_t * dsc, lv_vector_stroke_cap_t cap); - -/** - * Set stroke line join style for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param join the line join to be set in lv_vector_stroke_join_t format - */ -void lv_vector_dsc_set_stroke_join(lv_vector_dsc_t * dsc, lv_vector_stroke_join_t join); - -/** - * Set stroke miter limit for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param miter_limit the stroke miter_limit - */ -void lv_vector_dsc_set_stroke_miter_limit(lv_vector_dsc_t * dsc, uint16_t miter_limit); - -/** - * Set stroke linear gradient for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param x1 the x for start point - * @param y1 the y for start point - * @param x2 the x for end point - * @param y2 the y for end point - */ -void lv_vector_dsc_set_stroke_linear_gradient(lv_vector_dsc_t * dsc, float x1, float y1, float x2, float y2); -/** - * Set stroke radial gradient for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param cx the x for center of the circle - * @param cy the y for center of the circle - * @param radius the radius for circle - */ -void lv_vector_dsc_set_stroke_radial_gradient(lv_vector_dsc_t * dsc, float cx, float cy, float radius); - -/** - * Set stroke color stops for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param spread the gradient spread to be set in lv_vector_gradient_spread_t format - */ -void lv_vector_dsc_set_stroke_gradient_spread(lv_vector_dsc_t * dsc, lv_vector_gradient_spread_t spread); - -/** - * Set stroke color stops for descriptor - * @param dsc pointer to a vector graphic descriptor - * @param stops an array of `lv_gradient_stop_t` variables - * @param count the number of stops in the array - */ -void lv_vector_dsc_set_stroke_gradient_color_stops(lv_vector_dsc_t * dsc, const lv_gradient_stop_t * stops, - uint16_t count); - -/** - * Set a matrix to current stroke transformation matrix - * @param dsc pointer to a vector graphic descriptor - * @param matrix pointer to a matrix - */ -void lv_vector_dsc_set_stroke_transform(lv_vector_dsc_t * dsc, const lv_matrix_t * matrix); - -/** - * Set current transformation matrix to identity matrix - * @param dsc pointer to a vector graphic descriptor - */ -void lv_vector_dsc_identity(lv_vector_dsc_t * dsc); - -/** - * Change the scale factor of current transformation matrix - * @param dsc pointer to a vector graphic descriptor - * @param scale_x the scale factor for the X direction - * @param scale_y the scale factor for the Y direction - */ -void lv_vector_dsc_scale(lv_vector_dsc_t * dsc, float scale_x, float scale_y); - -/** - * Rotate current transformation matrix with origin - * @param dsc pointer to a vector graphic descriptor - * @param degree angle to rotate - */ -void lv_vector_dsc_rotate(lv_vector_dsc_t * dsc, float degree); - -/** - * Translate current transformation matrix to new position - * @param dsc pointer to a vector graphic descriptor - * @param tx the amount of translate in x direction - * @param tx the amount of translate in y direction - */ -void lv_vector_dsc_translate(lv_vector_dsc_t * dsc, float tx, float ty); - -/** - * Change the skew factor of current transformation matrix - * @param dsc pointer to a vector graphic descriptor - * @param skew_x the skew factor for x direction - * @param skew_y the skew factor for y direction - */ -void lv_vector_dsc_skew(lv_vector_dsc_t * dsc, float skew_x, float skew_y); - -/** - * Add a graphic path to the draw list - * @param dsc pointer to a vector graphic descriptor - * @param path pointer to a path - */ -void lv_vector_dsc_add_path(lv_vector_dsc_t * dsc, const lv_vector_path_t * path); - -/** - * Clear a rectangle area use current fill color - * @param dsc pointer to a vector graphic descriptor - * @param rect the area to clear in the buffer - */ -void lv_vector_clear_area(lv_vector_dsc_t * dsc, const lv_area_t * rect); - -/** - * Draw all the vector graphic paths - * @param dsc pointer to a vector graphic descriptor - */ -void lv_draw_vector(lv_vector_dsc_t * dsc); - -/* Traverser for task list */ -typedef void (*vector_draw_task_cb)(void * ctx, const lv_vector_path_t * path, const lv_vector_draw_dsc_t * dsc); - -#endif /* LV_USE_VECTOR_GRAPHIC */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_DRAW_VECTOR_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_vector_private.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_vector_private.h deleted file mode 100644 index 5257a30..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_draw_vector_private.h +++ /dev/null @@ -1,109 +0,0 @@ -/** - * @file lv_draw_vector_private.h - * - */ - -#ifndef LV_DRAW_VECTOR_PRIVATE_H -#define LV_DRAW_VECTOR_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vector.h" - -#if LV_USE_VECTOR_GRAPHIC - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_vector_path_t { - lv_vector_path_quality_t quality; - lv_array_t ops; - lv_array_t points; -}; - -struct lv_vector_gradient_t { - lv_vector_gradient_style_t style; - lv_gradient_stop_t stops[LV_GRADIENT_MAX_STOPS]; /**< A gradient stop array */ - uint16_t stops_count; /**< The number of used stops in the array */ - float x1; - float y1; - float x2; - float y2; - float cx; - float cy; - float cr; - lv_vector_gradient_spread_t spread; -}; - -struct lv_vector_fill_dsc_t { - lv_vector_draw_style_t style; - lv_color32_t color; - lv_opa_t opa; - lv_vector_fill_t fill_rule; - lv_draw_image_dsc_t img_dsc; - lv_vector_gradient_t gradient; - lv_matrix_t matrix; -}; - -struct lv_vector_stroke_dsc_t { - lv_vector_draw_style_t style; - lv_color32_t color; - lv_opa_t opa; - float width; - lv_array_t dash_pattern; - lv_vector_stroke_cap_t cap; - lv_vector_stroke_join_t join; - uint16_t miter_limit; - lv_vector_gradient_t gradient; - lv_matrix_t matrix; -}; - -struct lv_vector_draw_dsc_t { - lv_vector_fill_dsc_t fill_dsc; - lv_vector_stroke_dsc_t stroke_dsc; - lv_matrix_t matrix; - lv_vector_blend_t blend_mode; - lv_area_t scissor_area; -}; - -struct lv_draw_vector_task_dsc_t { - lv_draw_dsc_base_t base; - lv_ll_t * task_list; /*draw task list.*/ -}; - -struct lv_vector_dsc_t { - lv_layer_t * layer; - lv_vector_draw_dsc_t current_dsc; - /* private data */ - lv_draw_vector_task_dsc_t tasks; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_vector_for_each_destroy_tasks(lv_ll_t * task_list, vector_draw_task_cb cb, void * data); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_VECTOR_GRAPHIC */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_VECTOR_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_image_decoder.c b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_image_decoder.c deleted file mode 100644 index 90934c1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_image_decoder.c +++ /dev/null @@ -1,415 +0,0 @@ -/** - * @file lv_image_decoder.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_image_decoder_private.h" -#include "../misc/lv_assert.h" -#include "../draw/lv_draw_image.h" -#include "../misc/lv_ll.h" -#include "../stdlib/lv_string.h" -#include "../core/lv_global.h" - -/********************* - * DEFINES - *********************/ -#define img_decoder_ll_p &(LV_GLOBAL_DEFAULT()->img_decoder_ll) -#define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache) -#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache) -#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static uint32_t img_width_to_stride(lv_image_header_t * header); - -/** - * Get the header info of an image source, and return the a pointer to the decoder that can open it. - * @param dsc Image descriptor containing the source and type of the image and other info. - * @param header The header of the image - * @return The decoder that can open the image source or NULL if not found (or can't open it). - */ -static lv_image_decoder_t * image_decoder_get_info(lv_image_decoder_dsc_t * dsc, lv_image_header_t * header); - -static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the image decoder module - */ -void lv_image_decoder_init(uint32_t image_cache_size, uint32_t image_header_count) -{ - lv_ll_init(img_decoder_ll_p, sizeof(lv_image_decoder_t)); - - /*Initialize the cache*/ - lv_image_cache_init(image_cache_size); - lv_image_header_cache_init(image_header_count); -} - -/** - * Deinitialize the image decoder module - */ -void lv_image_decoder_deinit(void) -{ - lv_cache_destroy(img_cache_p, NULL); - lv_cache_destroy(img_header_cache_p, NULL); - - lv_ll_clear(img_decoder_ll_p); -} - -lv_result_t lv_image_decoder_get_info(const void * src, lv_image_header_t * header) -{ - lv_image_decoder_dsc_t dsc; - lv_memzero(&dsc, sizeof(lv_image_decoder_dsc_t)); - dsc.src = src; - dsc.src_type = lv_image_src_get_type(src); - - lv_image_decoder_t * decoder = image_decoder_get_info(&dsc, header); - if(decoder == NULL) return LV_RESULT_INVALID; - - return LV_RESULT_OK; -} - -lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src, const lv_image_decoder_args_t * args) -{ - lv_memzero(dsc, sizeof(lv_image_decoder_dsc_t)); - - if(src == NULL) return LV_RESULT_INVALID; - dsc->src = src; - dsc->src_type = lv_image_src_get_type(src); - - if(lv_image_cache_is_enabled()) { - dsc->cache = img_cache_p; - /*Try cache first, unless we are told to ignore cache.*/ - if(!(args && args->no_cache)) { - /* - * Check the cache first - * If the image is found in the cache, just return it.*/ - if(try_cache(dsc) == LV_RESULT_OK) return LV_RESULT_OK; - } - } - - /*Find the decoder that can open the image source, and get the header info in the same time.*/ - dsc->decoder = image_decoder_get_info(dsc, &dsc->header); - if(dsc->decoder == NULL) return LV_RESULT_INVALID; - - /*Make a copy of args*/ - dsc->args = args ? *args : (lv_image_decoder_args_t) { - .stride_align = LV_DRAW_BUF_STRIDE_ALIGN != 1, - .premultiply = false, - .no_cache = false, - .use_indexed = false, - .flush_cache = false, - }; - - /* - * We assume that if a decoder can get the info, it can open the image. - * If decoder open failed, free the source and return error. - * If decoder open succeed, add the image to cache if enabled. - * */ - lv_result_t res = dsc->decoder->open_cb(dsc->decoder, dsc); - - /* Flush the D-Cache if enabled and the image was successfully opened */ - if(dsc->args.flush_cache && res == LV_RESULT_OK && dsc->decoded != NULL) { - lv_draw_buf_flush_cache(dsc->decoded, NULL); - LV_LOG_INFO("Flushed D-cache: src %p (%s) (W%d x H%d, data: %p cf: %d)", - src, - dsc->src_type == LV_IMAGE_SRC_FILE ? (const char *)src : "c-array", - dsc->decoded->header.w, - dsc->decoded->header.h, - (void *)dsc->decoded->data, - dsc->decoded->header.cf); - } - - return res; -} - -lv_result_t lv_image_decoder_get_area(lv_image_decoder_dsc_t * dsc, const lv_area_t * full_area, - lv_area_t * decoded_area) -{ - lv_result_t res = LV_RESULT_INVALID; - if(dsc->decoder->get_area_cb) res = dsc->decoder->get_area_cb(dsc->decoder, dsc, full_area, decoded_area); - - return res; -} - -void lv_image_decoder_close(lv_image_decoder_dsc_t * dsc) -{ - if(dsc->decoder) { - if(dsc->decoder->close_cb) dsc->decoder->close_cb(dsc->decoder, dsc); - - if(lv_image_cache_is_enabled() && dsc->cache && dsc->cache_entry) { - /*Decoded data is in cache, release it from cache's callback*/ - lv_cache_release(dsc->cache, dsc->cache_entry, NULL); - } - } -} - -/** - * Create a new image decoder - * @return pointer to the new image decoder - */ -lv_image_decoder_t * lv_image_decoder_create(void) -{ - lv_image_decoder_t * decoder; - decoder = lv_ll_ins_head(img_decoder_ll_p); - LV_ASSERT_MALLOC(decoder); - if(decoder == NULL) return NULL; - - lv_memzero(decoder, sizeof(lv_image_decoder_t)); - - return decoder; -} - -void lv_image_decoder_delete(lv_image_decoder_t * decoder) -{ - lv_ll_remove(img_decoder_ll_p, decoder); - lv_free(decoder); -} - -lv_image_decoder_t * lv_image_decoder_get_next(lv_image_decoder_t * decoder) -{ - if(decoder == NULL) - return lv_ll_get_head(img_decoder_ll_p); - else - return lv_ll_get_next(img_decoder_ll_p, decoder); -} - -void lv_image_decoder_set_info_cb(lv_image_decoder_t * decoder, lv_image_decoder_info_f_t info_cb) -{ - decoder->info_cb = info_cb; -} - -void lv_image_decoder_set_open_cb(lv_image_decoder_t * decoder, lv_image_decoder_open_f_t open_cb) -{ - decoder->open_cb = open_cb; -} - -void lv_image_decoder_set_get_area_cb(lv_image_decoder_t * decoder, lv_image_decoder_get_area_cb_t get_area_cb) -{ - decoder->get_area_cb = get_area_cb; -} - -void lv_image_decoder_set_close_cb(lv_image_decoder_t * decoder, lv_image_decoder_close_f_t close_cb) -{ - decoder->close_cb = close_cb; -} - -lv_cache_entry_t * lv_image_decoder_add_to_cache(lv_image_decoder_t * decoder, - lv_image_cache_data_t * search_key, - const lv_draw_buf_t * decoded, void * user_data) -{ - lv_cache_entry_t * cache_entry = lv_cache_add(img_cache_p, search_key, NULL); - if(cache_entry == NULL) { - return NULL; - } - - lv_image_cache_data_t * cached_data; - cached_data = lv_cache_entry_get_data(cache_entry); - - /*Set the cache entry to decoder data*/ - cached_data->decoded = decoded; - if(cached_data->src_type == LV_IMAGE_SRC_FILE) { - cached_data->src = lv_strdup(cached_data->src); - } - cached_data->user_data = user_data; /*Need to free data on cache invalidate instead of decoder_close*/ - cached_data->decoder = decoder; - - return cache_entry; -} - -lv_draw_buf_t * lv_image_decoder_post_process(lv_image_decoder_dsc_t * dsc, lv_draw_buf_t * decoded) -{ - if(decoded == NULL) return NULL; /*No need to adjust*/ - - lv_image_decoder_args_t * args = &dsc->args; - if(args->stride_align && decoded->header.cf != LV_COLOR_FORMAT_RGB565A8) { - uint32_t stride_expect = lv_draw_buf_width_to_stride(decoded->header.w, decoded->header.cf); - if(decoded->header.stride != stride_expect) { - LV_LOG_TRACE("Stride mismatch"); - lv_result_t res = lv_draw_buf_adjust_stride(decoded, stride_expect); - if(res != LV_RESULT_OK) { - lv_draw_buf_t * aligned = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, decoded->header.w, decoded->header.h, - decoded->header.cf, stride_expect); - if(aligned == NULL) { - LV_LOG_ERROR("No memory for Stride adjust."); - return NULL; - } - - lv_draw_buf_copy(aligned, NULL, decoded, NULL); - decoded = aligned; - } - } - } - - /*Premultiply alpha channel*/ - if(args->premultiply - && !LV_COLOR_FORMAT_IS_ALPHA_ONLY(decoded->header.cf) - && lv_color_format_has_alpha(decoded->header.cf) - && !lv_draw_buf_has_flag(decoded, LV_IMAGE_FLAGS_PREMULTIPLIED) /*Hasn't done yet*/ - ) { - LV_LOG_TRACE("Alpha premultiply."); - if(lv_draw_buf_has_flag(decoded, LV_IMAGE_FLAGS_MODIFIABLE)) { - /*Do it directly*/ - lv_draw_buf_premultiply(decoded); - } - else { - decoded = lv_draw_buf_dup_ex(image_cache_draw_buf_handlers, decoded); - if(decoded == NULL) { - LV_LOG_ERROR("No memory for premultiplying."); - return NULL; - } - - lv_draw_buf_premultiply(decoded); - } - } - - return decoded; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static lv_image_decoder_t * image_decoder_get_info(lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) -{ - lv_memzero(header, sizeof(lv_image_header_t)); - - const void * src = dsc->src; - lv_image_src_t src_type = dsc->src_type; - - if(src_type == LV_IMAGE_SRC_VARIABLE) { - const lv_image_dsc_t * img_dsc = src; - if(img_dsc->data == NULL) return NULL; - } - - if(src_type == LV_IMAGE_SRC_FILE) LV_LOG_TRACE("Try to find decoder for %s", (const char *)src); - else LV_LOG_TRACE("Try to find decoder for %p", src); - - lv_image_decoder_t * decoder; - bool is_header_cache_enabled = lv_image_header_cache_is_enabled(); - - if(is_header_cache_enabled && src_type == LV_IMAGE_SRC_FILE) { - lv_image_header_cache_data_t search_key; - search_key.src_type = src_type; - search_key.src = src; - - lv_cache_entry_t * entry = lv_cache_acquire(img_header_cache_p, &search_key, NULL); - - if(entry) { - lv_image_header_cache_data_t * cached_data = lv_cache_entry_get_data(entry); - *header = cached_data->header; - decoder = cached_data->decoder; - lv_cache_release(img_header_cache_p, entry, NULL); - - LV_LOG_TRACE("Found decoder %s in header cache", decoder->name); - return decoder; - } - } - - if(src_type == LV_IMAGE_SRC_FILE) { - lv_fs_res_t fs_res = lv_fs_open(&dsc->file, src, LV_FS_MODE_RD); - if(fs_res != LV_FS_RES_OK) { - LV_LOG_ERROR("File open failed: %" LV_PRIu32, (uint32_t)fs_res); - return NULL; - } - } - - /*Search the decoders*/ - lv_image_decoder_t * decoder_prev = NULL; - LV_LL_READ(img_decoder_ll_p, decoder) { - /*Info and Open callbacks are required*/ - if(decoder->info_cb && decoder->open_cb) { - lv_fs_seek(&dsc->file, 0, LV_FS_SEEK_SET); - lv_result_t res = decoder->info_cb(decoder, dsc, header); - - if(decoder_prev) LV_LOG_TRACE("Can't open image with decoder %s. Trying next decoder.", decoder_prev->name); - - if(res == LV_RESULT_OK) { - if(header->stride == 0) { - LV_LOG_INFO("Image decoder didn't set stride. Calculate it from width."); - header->stride = img_width_to_stride(header); - } - break; - } - - decoder_prev = decoder; - } - } - - if(decoder == NULL) LV_LOG_TRACE("No decoder found"); - else LV_LOG_TRACE("Found decoder %s", decoder->name); - - if(src_type == LV_IMAGE_SRC_FILE) { - lv_fs_close(&dsc->file); - } - - if(is_header_cache_enabled && src_type == LV_IMAGE_SRC_FILE && decoder) { - lv_cache_entry_t * entry; - lv_image_header_cache_data_t search_key; - search_key.src_type = src_type; - search_key.src = lv_strdup(src); - search_key.decoder = decoder; - search_key.header = *header; - entry = lv_cache_add(img_header_cache_p, &search_key, NULL); - - if(entry == NULL) { - if(src_type == LV_IMAGE_SRC_FILE) lv_free((void *)search_key.src); - return NULL; - } - - lv_cache_release(img_header_cache_p, entry, NULL); - } - - return decoder; -} - -static uint32_t img_width_to_stride(lv_image_header_t * header) -{ - if(header->cf == LV_COLOR_FORMAT_RGB565A8) { - return header->w * 2; - } - else { - return ((uint32_t)header->w * lv_color_format_get_bpp(header->cf) + 7) >> 3; - } -} - -static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc) -{ - lv_cache_t * cache = dsc->cache; - - lv_image_cache_data_t search_key; - search_key.src_type = dsc->src_type; - search_key.src = dsc->src; - - lv_cache_entry_t * entry = lv_cache_acquire(cache, &search_key, NULL); - - if(entry) { - lv_image_cache_data_t * cached_data = lv_cache_entry_get_data(entry); - dsc->decoded = cached_data->decoded; - dsc->decoder = (lv_image_decoder_t *)cached_data->decoder; - dsc->cache_entry = entry; /*Save the cache to release it in decoder_close*/ - return LV_RESULT_OK; - } - - return LV_RESULT_INVALID; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_image_decoder.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_image_decoder.h deleted file mode 100644 index e898edc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_image_decoder.h +++ /dev/null @@ -1,194 +0,0 @@ -/** - * @file lv_image_decoder.h - * - */ - -#ifndef LV_IMAGE_DECODER_H -#define LV_IMAGE_DECODER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" - -#include "lv_draw_buf.h" -#include "../misc/lv_fs.h" -#include "../misc/lv_types.h" -#include "../misc/lv_area.h" -#include "../misc/cache/lv_cache.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Source of image.*/ -typedef enum { - LV_IMAGE_SRC_VARIABLE, /** Binary/C variable*/ - LV_IMAGE_SRC_FILE, /** File in filesystem*/ - LV_IMAGE_SRC_SYMBOL, /** Symbol (@ref lv_symbol_def.h)*/ - LV_IMAGE_SRC_UNKNOWN, /** Unknown source*/ -} lv_image_src_t; - -/** - * Get info from an image and store in the `header` - * @param decoder pointer to decoder object - * @param dsc pointer to decoder descriptor - * @param header store the info here - * @return LV_RESULT_OK: info written correctly; LV_RESULT_INVALID: failed - */ -typedef lv_result_t (*lv_image_decoder_info_f_t)(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, - lv_image_header_t * header); - -/** - * Open an image for decoding. Prepare it as it is required to read it later - * @param decoder pointer to the decoder the function associated with - * @param dsc pointer to decoder descriptor. `src`, `color` are already initialized in it. - */ -typedef lv_result_t (*lv_image_decoder_open_f_t)(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); - -/** - * Decode `full_area` pixels incrementally by calling in a loop. Set `decoded_area` values to `LV_COORD_MIN` on first call. - * Required only if the "open" function can't return with the whole decoded pixel array. - * @param decoder pointer to the decoder the function associated with - * @param dsc pointer to decoder descriptor - * @param full_area input parameter. the full area to decode after enough subsequent calls - * @param decoded_area input+output parameter. set the values to `LV_COORD_MIN` for the first call and to reset decoding. - * the decoded area is stored here after each call. - * @return LV_RESULT_OK: ok; LV_RESULT_INVALID: failed or there is nothing left to decode - */ -typedef lv_result_t (*lv_image_decoder_get_area_cb_t)(lv_image_decoder_t * decoder, - lv_image_decoder_dsc_t * dsc, - const lv_area_t * full_area, lv_area_t * decoded_area); - -/** - * Close the pending decoding. Free resources etc. - * @param decoder pointer to the decoder the function associated with - * @param dsc pointer to decoder descriptor - */ -typedef void (*lv_image_decoder_close_f_t)(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Get information about an image. - * Try the created image decoder one by one. Once one is able to get info that info will be used. - * @param src the image source. Can be - * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register()`) - * 2) Variable: Pointer to an `lv_image_dsc_t` variable - * 3) Symbol: E.g. `LV_SYMBOL_OK` - * @param header the image info will be stored here - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: wasn't able to get info about the image - */ -lv_result_t lv_image_decoder_get_info(const void * src, lv_image_header_t * header); - -/** - * Open an image. - * Try the created image decoders one by one. Once one is able to open the image that decoder is saved in `dsc` - * @param dsc describes a decoding session. Simply a pointer to an `lv_image_decoder_dsc_t` variable. - * @param src the image source. Can be - * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register())`) - * 2) Variable: Pointer to an `lv_image_dsc_t` variable - * 3) Symbol: E.g. `LV_SYMBOL_OK` - * @param args args about how the image should be opened. - * @return LV_RESULT_OK: opened the image. `dsc->decoded` and `dsc->header` are set. - * LV_RESULT_INVALID: none of the registered image decoders were able to open the image. - */ -lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src, const lv_image_decoder_args_t * args); - -/** - * Decode `full_area` pixels incrementally by calling in a loop. Set `decoded_area` to `LV_COORD_MIN` on first call. - * @param dsc image decoder descriptor - * @param full_area input parameter. the full area to decode after enough subsequent calls - * @param decoded_area input+output parameter. set the values to `LV_COORD_MIN` for the first call and to reset decoding. - * the decoded area is stored here after each call. - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: an error occurred or there is nothing left to decode - */ -lv_result_t lv_image_decoder_get_area(lv_image_decoder_dsc_t * dsc, const lv_area_t * full_area, - lv_area_t * decoded_area); - -/** - * Close a decoding session - * @param dsc pointer to `lv_image_decoder_dsc_t` used in `lv_image_decoder_open` - */ -void lv_image_decoder_close(lv_image_decoder_dsc_t * dsc); - -/** - * Create a new image decoder - * @return pointer to the new image decoder - */ -lv_image_decoder_t * lv_image_decoder_create(void); - -/** - * Delete an image decoder - * @param decoder pointer to an image decoder - */ -void lv_image_decoder_delete(lv_image_decoder_t * decoder); - -/** - * Get the next image decoder in the linked list of image decoders - * @param decoder pointer to an image decoder or NULL to get the first one - * @return the next image decoder or NULL if no more image decoder exists - */ -lv_image_decoder_t * lv_image_decoder_get_next(lv_image_decoder_t * decoder); - -/** - * Set a callback to get information about the image - * @param decoder pointer to an image decoder - * @param info_cb a function to collect info about an image (fill an `lv_image_header_t` struct) - */ -void lv_image_decoder_set_info_cb(lv_image_decoder_t * decoder, lv_image_decoder_info_f_t info_cb); - -/** - * Set a callback to open an image - * @param decoder pointer to an image decoder - * @param open_cb a function to open an image - */ -void lv_image_decoder_set_open_cb(lv_image_decoder_t * decoder, lv_image_decoder_open_f_t open_cb); - -/** - * Set a callback to a decoded line of an image - * @param decoder pointer to an image decoder - * @param read_line_cb a function to read a line of an image - */ -void lv_image_decoder_set_get_area_cb(lv_image_decoder_t * decoder, lv_image_decoder_get_area_cb_t read_line_cb); - -/** - * Set a callback to close a decoding session. E.g. close files and free other resources. - * @param decoder pointer to an image decoder - * @param close_cb a function to close a decoding session - */ -void lv_image_decoder_set_close_cb(lv_image_decoder_t * decoder, lv_image_decoder_close_f_t close_cb); - -lv_cache_entry_t * lv_image_decoder_add_to_cache(lv_image_decoder_t * decoder, - lv_image_cache_data_t * search_key, - const lv_draw_buf_t * decoded, void * user_data); - -/** - * Check the decoded image, make any modification if decoder `args` requires. - * @note A new draw buf will be allocated if provided `decoded` is not modifiable or stride mismatch etc. - * @param dsc pointer to a decoder descriptor - * @param decoded pointer to a decoded image to post process to meet dsc->args requirement. - * @return post processed draw buffer, when it differs with `decoded`, it's newly allocated. - */ -lv_draw_buf_t * lv_image_decoder_post_process(lv_image_decoder_dsc_t * dsc, lv_draw_buf_t * decoded); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_IMAGE_DECODER_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_image_decoder_private.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_image_decoder_private.h deleted file mode 100644 index 27ef261..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_image_decoder_private.h +++ /dev/null @@ -1,142 +0,0 @@ -/** - * @file lv_image_decoder_private.h - * - */ - -#ifndef LV_IMAGE_DECODER_PRIVATE_H -#define LV_IMAGE_DECODER_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_image_decoder.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Image decoder args. - * It determines how to decoder an image, e.g. whether to premultiply the alpha or not. - * It should be passed to lv_img_decoder_open() function. If NULL is provided, default - * args are used. - * - * Default args: - * all field are zero or false. - */ -struct lv_image_decoder_args_t { - bool stride_align; /**< Whether stride should be aligned */ - bool premultiply; /**< Whether image should be premultiplied or not after decoding */ - bool no_cache; /**< When set, decoded image won't be put to cache, and decoder open will also ignore cache. */ - bool use_indexed; /**< Decoded indexed image as is. Convert to ARGB8888 if false. */ - bool flush_cache; /**< Whether to flush the data cache after decoding */ -}; - -struct lv_image_decoder_t { - lv_image_decoder_info_f_t info_cb; - lv_image_decoder_open_f_t open_cb; - lv_image_decoder_get_area_cb_t get_area_cb; - lv_image_decoder_close_f_t close_cb; - - const char * name; - - void * user_data; -}; - -struct lv_image_cache_data_t { - lv_cache_slot_size_t slot; - - const void * src; - lv_image_src_t src_type; - - const lv_draw_buf_t * decoded; - const lv_image_decoder_t * decoder; - void * user_data; -}; - -struct lv_image_header_cache_data_t { - const void * src; - lv_image_src_t src_type; - - lv_image_header_t header; - lv_image_decoder_t * decoder; -}; - -/**Describe an image decoding session. Stores data about the decoding*/ -struct lv_image_decoder_dsc_t { - /**The decoder which was able to open the image source*/ - lv_image_decoder_t * decoder; - - /**A copy of parameters of how this image is decoded*/ - lv_image_decoder_args_t args; - - /**The image source. A file path like "S:my_img.png" or pointer to an `lv_image_dsc_t` variable*/ - const void * src; - - /**Type of the source: file or variable. Can be set in `open` function if required*/ - lv_image_src_t src_type; - - lv_fs_file_t file; - - /**Info about the opened image: color format, size, etc. MUST be set in `open` function*/ - lv_image_header_t header; - - /** Pointer to a draw buffer where the image's data (pixels) are stored in a decoded, plain format. - * MUST be set in `open` or `get_area_cb`function*/ - const lv_draw_buf_t * decoded; - - const lv_color32_t * palette; - uint32_t palette_size; - - /** How much time did it take to open the image. [ms] - * If not set `lv_image_cache` will measure and set the time to open*/ - uint32_t time_to_open; - - /**A text to display instead of the image when the image can't be opened. - * Can be set in `open` function or set NULL.*/ - const char * error_msg; - - lv_cache_t * cache; - - /**Point to cache entry information*/ - lv_cache_entry_t * cache_entry; - - /**Store any custom data here is required*/ - void * user_data; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the image decoder module - * @param image_cache_size Image cache size in bytes. 0 to disable cache. - * @param image_header_count Number of header cache entries. 0 to disable header cache. - */ -void lv_image_decoder_init(uint32_t image_cache_size, uint32_t image_header_count); - -/** - * Deinitialize the image decoder module - */ -void lv_image_decoder_deinit(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_IMAGE_DECODER_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_image_dsc.h b/software/Power_Pico/Middlewares/LVGL/src/draw/lv_image_dsc.h deleted file mode 100644 index ecd5088..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/lv_image_dsc.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * @file lv_image_dsc.h - * - */ - -#ifndef LV_IMAGE_DSC_H -#define LV_IMAGE_DSC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" - -/********************* - * DEFINES - *********************/ - -/** Magic number for lvgl image, 9 means lvgl version 9 - * It must be neither a valid ASCII character nor larger than 0x80. See `lv_image_src_get_type`. - */ -#define LV_IMAGE_HEADER_MAGIC (0x19) -LV_EXPORT_CONST_INT(LV_IMAGE_HEADER_MAGIC); - -/********************** - * TYPEDEFS - **********************/ - -typedef enum lv_image_flags_t { - /** - * For RGB map of the image data, mark if it's pre-multiplied with alpha. - * For indexed image, this bit indicated palette data is pre-multiplied with alpha. - */ - LV_IMAGE_FLAGS_PREMULTIPLIED = 0x0001, - /** - * The image data is compressed, so decoder needs to decode image firstly. - * If this flag is set, the whole image will be decompressed upon decode, and - * `get_area_cb` won't be necessary. - */ - LV_IMAGE_FLAGS_COMPRESSED = 0x0008, - - /*Below flags are applicable only for draw buffer header.*/ - - /** - * The image is allocated from heap, thus should be freed after use. - */ - LV_IMAGE_FLAGS_ALLOCATED = 0x0010, - - /** - * If the image data is malloced and can be processed in place. - * In image decoder post processing, this flag means we modify it in-place. - */ - LV_IMAGE_FLAGS_MODIFIABLE = 0x0020, - - /** - * Flags reserved for user, lvgl won't use these bits. - */ - LV_IMAGE_FLAGS_USER1 = 0x0100, - LV_IMAGE_FLAGS_USER2 = 0x0200, - LV_IMAGE_FLAGS_USER3 = 0x0400, - LV_IMAGE_FLAGS_USER4 = 0x0800, - LV_IMAGE_FLAGS_USER5 = 0x1000, - LV_IMAGE_FLAGS_USER6 = 0x2000, - LV_IMAGE_FLAGS_USER7 = 0x4000, - LV_IMAGE_FLAGS_USER8 = 0x8000, -} lv_image_flags_t; - -typedef enum { - LV_IMAGE_COMPRESS_NONE = 0, - LV_IMAGE_COMPRESS_RLE, /**< LVGL custom RLE compression */ - LV_IMAGE_COMPRESS_LZ4, -} lv_image_compress_t; - -#if LV_BIG_ENDIAN_SYSTEM -typedef struct { - uint32_t reserved_2: 16; /**< Reserved to be used later*/ - uint32_t stride: 16; /**< Number of bytes in a row*/ - uint32_t h: 16; - uint32_t w: 16; - uint32_t flags: 16; /**< Image flags, see `lv_image_flags_t`*/ - uint32_t cf : 8; /**< Color format: See `lv_color_format_t`*/ - uint32_t magic: 8; /**< Magic number. Must be LV_IMAGE_HEADER_MAGIC*/ -} lv_image_header_t; -#else -typedef struct { - uint32_t magic: 8; /**< Magic number. Must be LV_IMAGE_HEADER_MAGIC*/ - uint32_t cf : 8; /**< Color format: See `lv_color_format_t`*/ - uint32_t flags: 16; /**< Image flags, see `lv_image_flags_t`*/ - - uint32_t w: 16; - uint32_t h: 16; - uint32_t stride: 16; /**< Number of bytes in a row*/ - uint32_t reserved_2: 16; /**< Reserved to be used later*/ -} lv_image_header_t; -#endif - -typedef struct { - void * buf; - uint32_t stride; /**< Number of bytes in a row*/ -} lv_yuv_plane_t; - -typedef union { - lv_yuv_plane_t yuv; /**< packed format*/ - struct { - lv_yuv_plane_t y; - lv_yuv_plane_t u; - lv_yuv_plane_t v; - } planar; /**< planar format with 3 plane*/ - struct { - lv_yuv_plane_t y; - lv_yuv_plane_t uv; - } semi_planar; /**< planar format with 2 plane*/ -} lv_yuv_buf_t; - -/** - * Struct to describe a constant image resource. - * It's similar to lv_draw_buf_t, but the data is constant. - */ -typedef struct { - lv_image_header_t header; /**< A header describing the basics of the image*/ - uint32_t data_size; /**< Size of the image in bytes*/ - const uint8_t * data; /**< Pointer to the data of the image*/ - const void * reserved; /**< A reserved field to make it has same size as lv_draw_buf_t*/ -} lv_image_dsc_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_IMAGE_DSC_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_buf_pxp.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_buf_pxp.c deleted file mode 100644 index 9819cfc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_buf_pxp.c +++ /dev/null @@ -1,117 +0,0 @@ -/** - * @file lv_draw_buf_pxp.c - * - */ - -/** - * Copyright 2023-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_pxp.h" - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP -#include "../../lv_draw_buf_private.h" -#include "lv_pxp_cfg.h" -#include "lv_pxp_utils.h" - -#include "lvgl_support.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_buf_pxp_init_handlers(void) -{ - lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); - lv_draw_buf_handlers_t * font_handlers = lv_draw_buf_get_font_handlers(); - lv_draw_buf_handlers_t * image_handlers = lv_draw_buf_get_image_handlers(); - - handlers->invalidate_cache_cb = _invalidate_cache; - font_handlers->invalidate_cache_cb = _invalidate_cache; - image_handlers->invalidate_cache_cb = _invalidate_cache; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) -{ - const lv_image_header_t * header = &draw_buf->header; - uint32_t stride = header->stride; - lv_color_format_t cf = header->cf; - - if(area->y1 == 0) { - uint32_t size = stride * lv_area_get_height(area); - - /* Invalidate full buffer. */ - DEMO_CleanInvalidateCacheByAddr((void *)draw_buf->data, size); - return; - } - - const uint8_t * buf_u8 = draw_buf->data; - /* ARM require a 32 byte aligned address. */ - uint8_t align_bytes = 32; - uint8_t bits_per_pixel = lv_color_format_get_bpp(cf); - - uint16_t align_pixels = align_bytes * 8 / bits_per_pixel; - uint16_t offset_x = 0; - - if(area->x1 >= (int32_t)(area->x1 % align_pixels)) { - uint16_t shift_x = area->x1 - (area->x1 % align_pixels); - - offset_x = area->x1 - shift_x; - buf_u8 += (shift_x * bits_per_pixel) / 8; - } - - if(area->y1) { - uint16_t shift_y = area->y1; - - buf_u8 += shift_y * stride; - } - - /* Area to clear can start from a different offset in buffer. - * Invalidate the area line by line. - */ - uint16_t line_pixels = offset_x + lv_area_get_width(area); - uint16_t line_size = (line_pixels * bits_per_pixel) / 8; - uint16_t area_height = lv_area_get_height(area); - - for(uint16_t y = 0; y < area_height; y++) { - const void * line_addr = buf_u8 + y * stride; - - DEMO_CleanInvalidateCacheByAddr((void *)line_addr, line_size); - } -} - -#endif /*LV_USE_DRAW_PXP*/ -#endif /*LV_USE_PXP*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp.c deleted file mode 100644 index 636fe43..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp.c +++ /dev/null @@ -1,498 +0,0 @@ -/** - * @file lv_draw_pxp.c - * - */ - -/** - * Copyright 2022-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_pxp.h" - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP -#include "lv_pxp_cfg.h" -#include "lv_pxp_utils.h" - -#if LV_USE_PARALLEL_DRAW_DEBUG - #include "../../../core/lv_global.h" -#endif - -/********************* - * DEFINES - *********************/ - -#define DRAW_UNIT_ID_PXP 3 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/* - * Evaluate a task and set the score and preferred PXP unit. - * Return 1 if task is preferred, 0 otherwise (task is not supported). - */ -static int32_t _pxp_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); - -/* - * Dispatch a task to the PXP unit. - * Return 1 if task was dispatched, 0 otherwise (task not supported). - */ -static int32_t _pxp_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); - -/* - * Delete the PXP draw unit. - */ -static int32_t _pxp_delete(lv_draw_unit_t * draw_unit); - -#if LV_USE_PXP_DRAW_THREAD - static void _pxp_render_thread_cb(void * ptr); -#endif - -static void _pxp_execute_drawing(lv_draw_pxp_unit_t * u); - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -#if LV_USE_PARALLEL_DRAW_DEBUG - #define _draw_info LV_GLOBAL_DEFAULT()->draw_info -#endif - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_pxp_init(void) -{ - lv_pxp_init(); - -#if LV_USE_DRAW_PXP - lv_draw_buf_pxp_init_handlers(); - - lv_draw_pxp_unit_t * draw_pxp_unit = lv_draw_create_unit(sizeof(lv_draw_pxp_unit_t)); - draw_pxp_unit->base_unit.evaluate_cb = _pxp_evaluate; - draw_pxp_unit->base_unit.dispatch_cb = _pxp_dispatch; - draw_pxp_unit->base_unit.delete_cb = _pxp_delete; - -#if LV_USE_PXP_DRAW_THREAD - lv_thread_init(&draw_pxp_unit->thread, LV_THREAD_PRIO_HIGH, _pxp_render_thread_cb, 2 * 1024, draw_pxp_unit); -#endif -#endif /*LV_USE_DRAW_PXP*/ -} - -void lv_draw_pxp_deinit(void) -{ - lv_pxp_deinit(); -} - -void lv_draw_pxp_rotate(const void * src_buf, void * dest_buf, int32_t src_width, int32_t src_height, - int32_t src_stride, int32_t dest_stride, lv_display_rotation_t rotation, - lv_color_format_t cf) -{ - lv_pxp_reset(); - - /* Convert rotation angle - * To be in sync with CPU, the received angle is counterclockwise - * and the PXP constants are for clockwise rotation - * - * counterclockwise clockwise - * LV_DISPLAY_ROTATION_90 -> kPXP_Rotate270 - * LV_DISPLAY_ROTATION_270 -> kPXP_Rotate90 - */ - pxp_rotate_degree_t pxp_rotation; - switch(rotation) { - case LV_DISPLAY_ROTATION_0: - pxp_rotation = kPXP_Rotate0; - break; - case LV_DISPLAY_ROTATION_270: - pxp_rotation = kPXP_Rotate90; - break; - case LV_DISPLAY_ROTATION_180: - pxp_rotation = kPXP_Rotate180; - break; - case LV_DISPLAY_ROTATION_90: - pxp_rotation = kPXP_Rotate270; - break; - default: - pxp_rotation = kPXP_Rotate0; - break; - } - PXP_SetRotateConfig(PXP_ID, kPXP_RotateOutputBuffer, pxp_rotation, kPXP_FlipDisable); - - /*Simple blit, no effect - Disable PS buffer*/ - PXP_SetProcessSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); - - /*AS buffer - source image*/ - pxp_as_buffer_config_t asBufferConfig = { - .pixelFormat = pxp_get_as_px_format(cf), - .bufferAddr = (uint32_t)src_buf, - .pitchBytes = src_stride - }; - PXP_SetAlphaSurfaceBufferConfig(PXP_ID, &asBufferConfig); - PXP_SetAlphaSurfacePosition(PXP_ID, 0U, 0U, src_width - 1U, src_height - 1U); - PXP_EnableAlphaSurfaceOverlayColorKey(PXP_ID, false); - - /*Output buffer.*/ - pxp_output_buffer_config_t outputBufferConfig = { - .pixelFormat = pxp_get_out_px_format(cf), - .interlacedMode = kPXP_OutputProgressive, - .buffer0Addr = (uint32_t)dest_buf, - .buffer1Addr = (uint32_t)0U, - .pitchBytes = dest_stride, - .width = src_width, - .height = src_height - }; - PXP_SetOutputBufferConfig(PXP_ID, &outputBufferConfig); - - lv_pxp_run(); -} - -/********************** - * STATIC FUNCTIONS - **********************/ -#if LV_USE_DRAW_PXP -static inline bool _pxp_src_cf_supported(lv_color_format_t cf) -{ - bool is_cf_supported = false; - - switch(cf) { - case LV_COLOR_FORMAT_RGB565: - case LV_COLOR_FORMAT_ARGB8888: - case LV_COLOR_FORMAT_XRGB8888: - is_cf_supported = true; - break; - default: - break; - } - - return is_cf_supported; -} - -static inline bool _pxp_dest_cf_supported(lv_color_format_t cf) -{ - bool is_cf_supported = false; - - switch(cf) { - case LV_COLOR_FORMAT_RGB565: - case LV_COLOR_FORMAT_RGB888: - case LV_COLOR_FORMAT_ARGB8888: - case LV_COLOR_FORMAT_XRGB8888: - is_cf_supported = true; - break; - default: - break; - } - - return is_cf_supported; -} - -static bool _pxp_draw_img_supported(const lv_draw_image_dsc_t * draw_dsc) -{ - const lv_image_dsc_t * img_dsc = draw_dsc->src; - - bool has_recolor = (draw_dsc->recolor_opa > LV_OPA_MIN); - bool has_transform = (draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || - draw_dsc->scale_y != LV_SCALE_NONE); - - /* Recolor and transformation are not supported at the same time. */ - if(has_recolor && has_transform) - return false; - - bool has_opa = (draw_dsc->opa < (lv_opa_t)LV_OPA_MAX); - bool src_has_alpha = (img_dsc->header.cf == LV_COLOR_FORMAT_ARGB8888); - - /* - * Recolor or transformation for images w/ opa or alpha channel can't - * be obtained in a single PXP configuration. Two steps are required. - */ - if((has_recolor || has_transform) && (has_opa || src_has_alpha)) - return false; - - /* PXP can only rotate at 90x angles. */ - if(draw_dsc->rotation % 900) - return false; - - /* - * PXP is set to process 16x16 blocks to optimize the system for memory - * bandwidth and image processing time. - * The output engine essentially truncates any output pixels after the - * desired number of pixels has been written. - * When rotating a source image and the output is not divisible by the block - * size, the incorrect pixels could be truncated and the final output image - * can look shifted. - * - * No combination of rotate with flip, scaling or decimation is possible - * if buffer is unaligned. - */ - if(has_transform && (img_dsc->header.w % 16 || img_dsc->header.h % 16)) - return false; - - return true; -} - -static int32_t _pxp_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t) -{ - LV_UNUSED(u); - - const lv_draw_dsc_base_t * draw_dsc_base = (lv_draw_dsc_base_t *) t->draw_dsc; - - if(!_pxp_dest_cf_supported(draw_dsc_base->layer->color_format)) - return 0; - - switch(t->type) { - case LV_DRAW_TASK_TYPE_FILL: { - const lv_draw_fill_dsc_t * draw_dsc = (lv_draw_fill_dsc_t *) t->draw_dsc; - - /* Most simple case: just a plain rectangle (no radius, no gradient). */ - if((draw_dsc->radius != 0) || (draw_dsc->grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE)) - return 0; - - if(t->preference_score > 70) { - t->preference_score = 70; - t->preferred_draw_unit_id = DRAW_UNIT_ID_PXP; - } - return 1; - } - - case LV_DRAW_TASK_TYPE_LAYER: { - const lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc; - lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; - - if(!_pxp_src_cf_supported(layer_to_draw->color_format)) - return 0; - - if(!_pxp_draw_img_supported(draw_dsc)) - return 0; - - if(t->preference_score > 70) { - t->preference_score = 70; - t->preferred_draw_unit_id = DRAW_UNIT_ID_PXP; - } - return 1; - } - - case LV_DRAW_TASK_TYPE_IMAGE: { - lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc; - const lv_image_dsc_t * img_dsc = draw_dsc->src; - - if(draw_dsc->tile) - return 0; - - if((!_pxp_src_cf_supported(img_dsc->header.cf)) || - (!pxp_buf_aligned(img_dsc->data, img_dsc->header.stride))) - return 0; - - if(!_pxp_draw_img_supported(draw_dsc)) - return 0; - - if(t->preference_score > 70) { - t->preference_score = 70; - t->preferred_draw_unit_id = DRAW_UNIT_ID_PXP; - } - return 1; - } - default: - return 0; - } - - return 0; -} - -static int32_t _pxp_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) -{ - lv_draw_pxp_unit_t * draw_pxp_unit = (lv_draw_pxp_unit_t *) draw_unit; - - /* Return immediately if it's busy with draw task. */ - if(draw_pxp_unit->task_act) - return 0; - - /* Try to get an ready to draw. */ - lv_draw_task_t * t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_PXP); - - if(t == NULL || t->preferred_draw_unit_id != DRAW_UNIT_ID_PXP) - return LV_DRAW_UNIT_IDLE; - - if(lv_draw_layer_alloc_buf(layer) == NULL) - return LV_DRAW_UNIT_IDLE; - - t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; - draw_pxp_unit->base_unit.target_layer = layer; - draw_pxp_unit->base_unit.clip_area = &t->clip_area; - draw_pxp_unit->task_act = t; - -#if LV_USE_PXP_DRAW_THREAD - /* Let the render thread work. */ - if(draw_pxp_unit->inited) - lv_thread_sync_signal(&draw_pxp_unit->sync); -#else - _pxp_execute_drawing(draw_pxp_unit); - - draw_pxp_unit->task_act->state = LV_DRAW_TASK_STATE_READY; - draw_pxp_unit->task_act = NULL; - - /* The draw unit is free now. Request a new dispatching as it can get a new task. */ - lv_draw_dispatch_request(); -#endif - - return 1; -} - -static int32_t _pxp_delete(lv_draw_unit_t * draw_unit) -{ -#if LV_USE_PXP_DRAW_THREAD - lv_draw_pxp_unit_t * draw_pxp_unit = (lv_draw_pxp_unit_t *) draw_unit; - - LV_LOG_INFO("Cancel PXP draw thread."); - draw_pxp_unit->exit_status = true; - - if(draw_pxp_unit->inited) - lv_thread_sync_signal(&draw_pxp_unit->sync); - - lv_result_t res = lv_thread_delete(&draw_pxp_unit->thread); - - return res; -#else - LV_UNUSED(draw_unit); - - return 0; -#endif -} - -static void _pxp_execute_drawing(lv_draw_pxp_unit_t * u) -{ - lv_draw_task_t * t = u->task_act; - lv_draw_unit_t * draw_unit = (lv_draw_unit_t *)u; - lv_layer_t * layer = draw_unit->target_layer; - lv_draw_buf_t * draw_buf = layer->draw_buf; - - lv_area_t draw_area; - if(!lv_area_intersect(&draw_area, &t->area, draw_unit->clip_area)) - return; /*Fully clipped, nothing to do*/ - - /* Make area relative to the buffer */ - lv_area_move(&draw_area, -layer->buf_area.x1, -layer->buf_area.y1); - - /* Invalidate only the drawing area */ - lv_draw_buf_invalidate_cache(draw_buf, &draw_area); - - switch(t->type) { - case LV_DRAW_TASK_TYPE_FILL: - lv_draw_pxp_fill(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_IMAGE: - lv_draw_pxp_img(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_LAYER: - lv_draw_pxp_layer(draw_unit, t->draw_dsc, &t->area); - break; - default: - break; - } - -#if LV_USE_PARALLEL_DRAW_DEBUG - /*Layers manage it for themselves*/ - if(t->type != LV_DRAW_TASK_TYPE_LAYER) { - lv_area_t draw_area; - if(!lv_area_intersect(&draw_area, &t->area, u->base_unit.clip_area)) - return; - - int32_t idx = 0; - lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head; - while(draw_unit_tmp != (lv_draw_unit_t *)u) { - draw_unit_tmp = draw_unit_tmp->next; - idx++; - } - lv_draw_rect_dsc_t rect_dsc; - lv_draw_rect_dsc_init(&rect_dsc); - rect_dsc.bg_color = lv_palette_main(idx % LV_PALETTE_LAST); - rect_dsc.border_color = rect_dsc.bg_color; - rect_dsc.bg_opa = LV_OPA_10; - rect_dsc.border_opa = LV_OPA_80; - rect_dsc.border_width = 1; - lv_draw_sw_fill((lv_draw_unit_t *)u, &rect_dsc, &draw_area); - - lv_point_t txt_size; - lv_text_get_size(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); - - lv_area_t txt_area; - txt_area.x1 = draw_area.x1; - txt_area.y1 = draw_area.y1; - txt_area.x2 = draw_area.x1 + txt_size.x - 1; - txt_area.y2 = draw_area.y1 + txt_size.y - 1; - - lv_draw_rect_dsc_init(&rect_dsc); - rect_dsc.bg_color = lv_color_white(); - lv_draw_sw_fill((lv_draw_unit_t *)u, &rect_dsc, &txt_area); - - char buf[8]; - lv_snprintf(buf, sizeof(buf), "%d", idx); - lv_draw_label_dsc_t label_dsc; - lv_draw_label_dsc_init(&label_dsc); - label_dsc.color = lv_color_black(); - label_dsc.text = buf; - lv_draw_sw_label((lv_draw_unit_t *)u, &label_dsc, &txt_area); - } -#endif -} - -#if LV_USE_PXP_DRAW_THREAD -static void _pxp_render_thread_cb(void * ptr) -{ - lv_draw_pxp_unit_t * u = ptr; - - lv_thread_sync_init(&u->sync); - u->inited = true; - - while(1) { - /* Wait for sync if there is no task set. */ - while(u->task_act == NULL) { - if(u->exit_status) - break; - - lv_thread_sync_wait(&u->sync); - } - - if(u->exit_status) { - LV_LOG_INFO("Ready to exit PXP draw thread."); - break; - } - - _pxp_execute_drawing(u); - - /* Signal the ready state to dispatcher. */ - u->task_act->state = LV_DRAW_TASK_STATE_READY; - - /* Cleanup. */ - u->task_act = NULL; - - /* The draw unit is free now. Request a new dispatching as it can get a new task. */ - lv_draw_dispatch_request(); - } - - u->inited = false; - lv_thread_sync_delete(&u->sync); - LV_LOG_INFO("Exit PXP draw thread."); -} -#endif -#endif /*LV_USE_DRAW_PXP*/ -#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ -#endif /*LV_USE_PXP*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp.h b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp.h deleted file mode 100644 index d34ad3f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @file lv_draw_pxp.h - * - */ - -/** - * Copyright 2022-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -#ifndef LV_DRAW_PXP_H -#define LV_DRAW_PXP_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../../lv_conf_internal.h" - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP -#include "../../sw/lv_draw_sw_private.h" -#include "../../../misc/lv_area_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef lv_draw_sw_unit_t lv_draw_pxp_unit_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_draw_pxp_init(void); - -void lv_draw_pxp_deinit(void); - -void lv_draw_pxp_rotate(const void * src_buf, void * dest_buf, int32_t src_width, int32_t src_height, - int32_t src_stride, int32_t dest_stride, lv_display_rotation_t rotation, - lv_color_format_t cf); - -#if LV_USE_DRAW_PXP -void lv_draw_buf_pxp_init_handlers(void); - -void lv_draw_pxp_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_pxp_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_pxp_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords); - -/********************** - * MACROS - **********************/ -#endif /*LV_USE_DRAW_PXP*/ -#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ -#endif /*LV_USE_PXP*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_PXP_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp_fill.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp_fill.c deleted file mode 100644 index 33b8047..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp_fill.c +++ /dev/null @@ -1,149 +0,0 @@ -/** - * @file lv_draw_pxp_fill.c - * - */ - -/** - * Copyright 2020-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_pxp.h" - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP -#include "lv_pxp_cfg.h" -#include "lv_pxp_utils.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void _pxp_fill(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, - lv_color_format_t dest_cf, const lv_draw_fill_dsc_t * dsc); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_pxp_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, - const lv_area_t * coords) -{ - if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) - return; - - lv_layer_t * layer = draw_unit->target_layer; - lv_draw_buf_t * draw_buf = layer->draw_buf; - - lv_area_t rel_coords; - lv_area_copy(&rel_coords, coords); - lv_area_move(&rel_coords, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_area_t rel_clip_area; - lv_area_copy(&rel_clip_area, draw_unit->clip_area); - lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_area_t blend_area; - if(!lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) - return; /*Fully clipped, nothing to do*/ - - _pxp_fill(draw_buf->data, &blend_area, draw_buf->header.stride, draw_buf->header.cf, dsc); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void _pxp_fill(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, - lv_color_format_t dest_cf, const lv_draw_fill_dsc_t * dsc) -{ - int32_t dest_w = lv_area_get_width(dest_area); - int32_t dest_h = lv_area_get_height(dest_area); - - lv_pxp_reset(); - - uint8_t px_size = lv_color_format_get_size(dest_cf); - - /*OUT buffer configure*/ - pxp_output_buffer_config_t outputConfig = { - .pixelFormat = pxp_get_out_px_format(dest_cf), - .interlacedMode = kPXP_OutputProgressive, - .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + px_size * dest_area->x1), - .buffer1Addr = (uint32_t)NULL, - .pitchBytes = dest_stride, - .width = dest_w, - .height = dest_h - }; - - PXP_SetOutputBufferConfig(PXP_ID, &outputConfig); - - if(dsc->opa >= (lv_opa_t)LV_OPA_MAX) { - /*Simple color fill without opacity - AS disabled*/ - PXP_SetAlphaSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); - - } - else { - /*Fill with opacity - AS used as source (same as OUT)*/ - pxp_as_buffer_config_t asBufferConfig = { - .pixelFormat = pxp_get_as_px_format(dest_cf), - .bufferAddr = outputConfig.buffer0Addr, - .pitchBytes = outputConfig.pitchBytes - }; - - PXP_SetAlphaSurfaceBufferConfig(PXP_ID, &asBufferConfig); - PXP_SetAlphaSurfacePosition(PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); - } - - /*Disable PS, use as color generator*/ - PXP_SetProcessSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); - PXP_SetProcessSurfaceBackGroundColor(PXP_ID, lv_color_to_u32(dsc->color)); - - /** - * Configure Porter-Duff blending - src settings are unused for fill without opacity (opa = 0xff). - * - * Note: srcFactorMode and dstFactorMode are inverted in fsl_pxp.h: - * srcFactorMode is actually applied on PS alpha value - * dstFactorMode is actually applied on AS alpha value - */ - pxp_porter_duff_config_t pdConfig = { - .enable = 1, - .dstColorMode = kPXP_PorterDuffColorNoAlpha, - .srcColorMode = kPXP_PorterDuffColorNoAlpha, - .dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha, - .srcGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha, - .dstFactorMode = kPXP_PorterDuffFactorStraight, - .srcFactorMode = (dsc->opa >= (lv_opa_t)LV_OPA_MAX) ? kPXP_PorterDuffFactorStraight : kPXP_PorterDuffFactorInversed, - .dstGlobalAlpha = dsc->opa, - .srcGlobalAlpha = dsc->opa, - .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/ - .srcAlphaMode = kPXP_PorterDuffAlphaStraight /*don't care*/ - }; - - PXP_SetPorterDuffConfig(PXP_ID, &pdConfig); - - lv_pxp_run(); -} - -#endif /*LV_USE_DRAW_PXP*/ -#endif /*LV_USE_PXP*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp_img.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp_img.c deleted file mode 100644 index 79f3790..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp_img.c +++ /dev/null @@ -1,367 +0,0 @@ -/** - * @file lv_draw_pxp_img.c - * - */ - -/** - * Copyright 2020-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_pxp.h" - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP -#include "lv_pxp_cfg.h" -#include "lv_pxp_utils.h" - -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/* Blit w/ recolor for images w/o opa and alpha channel */ -static void _pxp_blit_recolor(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, - lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, - int32_t src_stride, lv_color_format_t src_cf, const lv_draw_image_dsc_t * dsc); - -/* Blit w/ transformation for images w/o opa and alpha channel */ -static void _pxp_blit_transform(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, - lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, - int32_t src_stride, lv_color_format_t src_cf, const lv_draw_image_dsc_t * dsc); - -/* Blit simple w/ opa and alpha channel */ -static void _pxp_blit(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, - lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, - int32_t src_stride, lv_color_format_t src_cf, lv_opa_t opa); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_pxp_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, - const lv_area_t * coords) -{ - if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) - return; - - lv_layer_t * layer = draw_unit->target_layer; - lv_draw_buf_t * draw_buf = layer->draw_buf; - const lv_image_dsc_t * img_dsc = dsc->src; - - lv_area_t rel_coords; - lv_area_copy(&rel_coords, coords); - lv_area_move(&rel_coords, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_area_t rel_clip_area; - lv_area_copy(&rel_clip_area, draw_unit->clip_area); - lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_area_t blend_area; - bool has_transform = (dsc->rotation != 0 || dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); - if(has_transform) - lv_area_copy(&blend_area, &rel_coords); - else if(!lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) - return; /*Fully clipped, nothing to do*/ - - const uint8_t * src_buf = img_dsc->data; - - lv_area_t src_area; - src_area.x1 = blend_area.x1 - (coords->x1 - layer->buf_area.x1); - src_area.y1 = blend_area.y1 - (coords->y1 - layer->buf_area.y1); - src_area.x2 = src_area.x1 + lv_area_get_width(coords) - 1; - src_area.y2 = src_area.y1 + lv_area_get_height(coords) - 1; - int32_t src_stride = img_dsc->header.stride; - lv_color_format_t src_cf = img_dsc->header.cf; - - uint8_t * dest_buf = draw_buf->data; - int32_t dest_stride = draw_buf->header.stride; - lv_color_format_t dest_cf = draw_buf->header.cf; - bool has_recolor = (dsc->recolor_opa > LV_OPA_MIN); - - if(has_recolor && !has_transform) - _pxp_blit_recolor(dest_buf, &blend_area, dest_stride, dest_cf, - src_buf, &src_area, src_stride, src_cf, dsc); - else if(has_transform) - _pxp_blit_transform(dest_buf, &blend_area, dest_stride, dest_cf, - src_buf, &src_area, src_stride, src_cf, dsc); - else - _pxp_blit(dest_buf, &blend_area, dest_stride, dest_cf, - src_buf, &src_area, src_stride, src_cf, dsc->opa); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void _pxp_blit_recolor(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, - lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, - int32_t src_stride, lv_color_format_t src_cf, const lv_draw_image_dsc_t * dsc) -{ - - int32_t dest_w = lv_area_get_width(dest_area); - int32_t dest_h = lv_area_get_height(dest_area); - int32_t src_w = lv_area_get_width(src_area); - int32_t src_h = lv_area_get_height(src_area); - - bool src_has_alpha = (src_cf == LV_COLOR_FORMAT_ARGB8888); - uint8_t src_px_size = lv_color_format_get_size(src_cf); - uint8_t dest_px_size = lv_color_format_get_size(dest_cf); - - lv_pxp_reset(); - - /*AS buffer - source image*/ - pxp_as_buffer_config_t asBufferConfig = { - .pixelFormat = pxp_get_as_px_format(src_cf), - .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_px_size * src_area->x1), - .pitchBytes = src_stride - }; - PXP_SetAlphaSurfaceBufferConfig(PXP_ID, &asBufferConfig); - PXP_SetAlphaSurfacePosition(PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U); - - /*Disable PS, use as color generator*/ - PXP_SetProcessSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); - PXP_SetProcessSurfaceBackGroundColor(PXP_ID, lv_color_to_u32(dsc->recolor)); - - /*Output buffer*/ - pxp_output_buffer_config_t outputBufferConfig = { - .pixelFormat = pxp_get_out_px_format(dest_cf), - .interlacedMode = kPXP_OutputProgressive, - .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_px_size * dest_area->x1), - .buffer1Addr = (uint32_t)0U, - .pitchBytes = dest_stride, - .width = dest_w, - .height = dest_h - }; - PXP_SetOutputBufferConfig(PXP_ID, &outputBufferConfig); - - /** - * Configure Porter-Duff blending. - * - * Note: srcFactorMode and dstFactorMode are inverted in fsl_pxp.h: - * srcFactorMode is actually applied on PS alpha value - * dstFactorMode is actually applied on AS alpha value - */ - pxp_porter_duff_config_t pdConfig = { - .enable = 1, - .dstColorMode = kPXP_PorterDuffColorWithAlpha, - .srcColorMode = kPXP_PorterDuffColorWithAlpha, - .dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha, - .srcGlobalAlphaMode = src_has_alpha ? kPXP_PorterDuffLocalAlpha : kPXP_PorterDuffGlobalAlpha, - .dstFactorMode = kPXP_PorterDuffFactorStraight, - .srcFactorMode = kPXP_PorterDuffFactorInversed, - .dstGlobalAlpha = dsc->recolor_opa, - .srcGlobalAlpha = 0xff, - .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/ - .srcAlphaMode = kPXP_PorterDuffAlphaStraight - }; - PXP_SetPorterDuffConfig(PXP_ID, &pdConfig); - - lv_pxp_run(); -} - -static void _pxp_blit_transform(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, - lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, - int32_t src_stride, lv_color_format_t src_cf, const lv_draw_image_dsc_t * dsc) -{ - int32_t src_w = lv_area_get_width(src_area); - int32_t src_h = lv_area_get_height(src_area); - int32_t dest_w = lv_area_get_width(dest_area); - int32_t dest_h = lv_area_get_height(dest_area); - - lv_point_t pivot = dsc->pivot; - /*The offsets are now relative to the transformation result with pivot ULC*/ - int32_t piv_offset_x = 0; - int32_t piv_offset_y = 0; - - int32_t trim_x = 0; - int32_t trim_y = 0; - - bool has_rotation = (dsc->rotation != 0); - bool has_scale = (dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); - uint8_t src_px_size = lv_color_format_get_size(src_cf); - uint8_t dest_px_size = lv_color_format_get_size(dest_cf); - - lv_pxp_reset(); - - if(has_rotation) { - /*Convert rotation angle and calculate offsets caused by pivot*/ - pxp_rotate_degree_t pxp_angle; - switch(dsc->rotation) { - case 0: - pxp_angle = kPXP_Rotate0; - piv_offset_x = 0; - piv_offset_y = 0; - break; - case 900: - pxp_angle = kPXP_Rotate90; - piv_offset_x = pivot.x + pivot.y - src_h; - piv_offset_y = pivot.y - pivot.x; - break; - case 1800: - pxp_angle = kPXP_Rotate180; - piv_offset_x = 2 * pivot.x - src_w; - piv_offset_y = 2 * pivot.y - src_h; - break; - case 2700: - pxp_angle = kPXP_Rotate270; - piv_offset_x = pivot.x - pivot.y; - piv_offset_y = pivot.x + pivot.y - src_w; - break; - default: - pxp_angle = kPXP_Rotate0; - piv_offset_x = 0; - piv_offset_y = 0; - } - /*PS buffer rotation and decimation does not function at the same time*/ - PXP_SetRotateConfig(PXP_ID, kPXP_RotateOutputBuffer, pxp_angle, kPXP_FlipDisable); - } - - if(has_scale) { - float fp_scale_x = (float)dsc->scale_x / LV_SCALE_NONE; - float fp_scale_y = (float)dsc->scale_y / LV_SCALE_NONE; - int32_t int_scale_x = (int32_t)fp_scale_x; - int32_t int_scale_y = (int32_t)fp_scale_y; - - /*Any scale_factor in (k, k + 1] will result in a trim equal to k*/ - trim_x = (fp_scale_x == int_scale_x) ? int_scale_x - 1 : int_scale_x; - trim_y = (fp_scale_y == int_scale_y) ? int_scale_y - 1 : int_scale_y; - - dest_w = src_w * fp_scale_x + trim_x; - dest_h = src_h * fp_scale_y + trim_y; - - /*Final pivot offset = scale_factor * rotation_pivot_offset + scaling_pivot_offset*/ - piv_offset_x = floorf(fp_scale_x * piv_offset_x) - floorf((fp_scale_x - 1) * pivot.x); - piv_offset_y = floorf(fp_scale_y * piv_offset_y) - floorf((fp_scale_y - 1) * pivot.y); - } - - /*PS buffer - source image*/ - pxp_ps_buffer_config_t psBufferConfig = { - .pixelFormat = pxp_get_ps_px_format(src_cf), - .swapByte = false, - .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_px_size * src_area->x1), - .bufferAddrU = 0, - .bufferAddrV = 0, - .pitchBytes = src_stride - }; - PXP_SetProcessSurfaceBufferConfig(PXP_ID, &psBufferConfig); - PXP_SetProcessSurfacePosition(PXP_ID, 0U, 0U, dest_w - trim_x - 1U, dest_h - trim_y - 1U); - - if(has_scale) - PXP_SetProcessSurfaceScaler(PXP_ID, src_w, src_h, dest_w, dest_h); - - /*AS disabled */ - PXP_SetAlphaSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); - - /*Output buffer*/ - pxp_output_buffer_config_t outputBufferConfig = { - .pixelFormat = pxp_get_out_px_format(dest_cf), - .interlacedMode = kPXP_OutputProgressive, - .buffer0Addr = (uint32_t)(dest_buf + dest_stride * (dest_area->y1 + piv_offset_y) + dest_px_size * (dest_area->x1 + piv_offset_x)), - .buffer1Addr = (uint32_t)0U, - .pitchBytes = dest_stride, - .width = dest_w - trim_x, - .height = dest_h - trim_y - }; - PXP_SetOutputBufferConfig(PXP_ID, &outputBufferConfig); - - lv_pxp_run(); -} - -static void _pxp_blit(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, - lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, - int32_t src_stride, lv_color_format_t src_cf, lv_opa_t opa) -{ - int32_t dest_w = lv_area_get_width(dest_area); - int32_t dest_h = lv_area_get_height(dest_area); - int32_t src_w = lv_area_get_width(src_area); - int32_t src_h = lv_area_get_height(src_area); - - bool src_has_alpha = (src_cf == LV_COLOR_FORMAT_ARGB8888); - uint8_t src_px_size = lv_color_format_get_size(src_cf); - uint8_t dest_px_size = lv_color_format_get_size(dest_cf); - - lv_pxp_reset(); - - pxp_as_blend_config_t asBlendConfig = { - .alpha = opa, - .invertAlpha = false, - .alphaMode = kPXP_AlphaRop, - .ropMode = kPXP_RopMergeAs - }; - - if(opa >= (lv_opa_t)LV_OPA_MAX && !src_has_alpha) { - /*Simple blit, no effect - Disable PS buffer*/ - PXP_SetProcessSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); - } - else { - /*PS must be enabled to fetch background pixels. - PS and OUT buffers are the same, blend will be done in-place*/ - pxp_ps_buffer_config_t psBufferConfig = { - .pixelFormat = pxp_get_ps_px_format(dest_cf), - .swapByte = false, - .bufferAddr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_px_size * dest_area->x1), - .bufferAddrU = 0U, - .bufferAddrV = 0U, - .pitchBytes = dest_stride - }; - - if(opa >= (lv_opa_t)LV_OPA_MAX) - asBlendConfig.alphaMode = src_has_alpha ? kPXP_AlphaEmbedded : kPXP_AlphaOverride; - else - asBlendConfig.alphaMode = src_has_alpha ? kPXP_AlphaMultiply : kPXP_AlphaOverride; - - PXP_SetProcessSurfaceBufferConfig(PXP_ID, &psBufferConfig); - PXP_SetProcessSurfacePosition(PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); - } - - /*AS buffer - source image*/ - pxp_as_buffer_config_t asBufferConfig = { - .pixelFormat = pxp_get_as_px_format(src_cf), - .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_px_size * src_area->x1), - .pitchBytes = src_stride - }; - PXP_SetAlphaSurfaceBufferConfig(PXP_ID, &asBufferConfig); - PXP_SetAlphaSurfacePosition(PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U); - PXP_SetAlphaSurfaceBlendConfig(PXP_ID, &asBlendConfig); - PXP_EnableAlphaSurfaceOverlayColorKey(PXP_ID, false); - - /*Output buffer.*/ - pxp_output_buffer_config_t outputBufferConfig = { - .pixelFormat = pxp_get_out_px_format(dest_cf), - .interlacedMode = kPXP_OutputProgressive, - .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_px_size * dest_area->x1), - .buffer1Addr = (uint32_t)0U, - .pitchBytes = dest_stride, - .width = dest_w, - .height = dest_h - }; - PXP_SetOutputBufferConfig(PXP_ID, &outputBufferConfig); - - lv_pxp_run(); -} - -#endif /*LV_USE_DRAW_PXP*/ -#endif /*LV_USE_PXP*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp_layer.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp_layer.c deleted file mode 100644 index 34cb285..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_draw_pxp_layer.c +++ /dev/null @@ -1,158 +0,0 @@ -/** - * @file lv_draw_pxp_layer.c - * - */ - -/** - * Copyright 2023-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_pxp.h" - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP - -#include "../../../stdlib/lv_string.h" -#if LV_USE_PARALLEL_DRAW_DEBUG - #include "../../../core/lv_global.h" -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -#if LV_USE_PARALLEL_DRAW_DEBUG - #define _draw_info LV_GLOBAL_DEFAULT()->draw_info -#endif - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_pxp_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords) -{ - lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; - const lv_draw_buf_t * draw_buf = layer_to_draw->draw_buf; - - /* It can happen that nothing was draw on a layer and therefore its buffer is not allocated. - * In this case just return. - */ - if(draw_buf == NULL) - return; - - const lv_area_t area_to_draw = { - .x1 = 0, - .y1 = 0, - .x2 = draw_buf->header.w - 1, - .y2 = draw_buf->header.h - 1 - }; - lv_draw_buf_invalidate_cache(draw_buf, &area_to_draw); - - lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; - new_draw_dsc.src = draw_buf; - lv_draw_pxp_img(draw_unit, &new_draw_dsc, coords); - -#if LV_USE_LAYER_DEBUG || LV_USE_PARALLEL_DRAW_DEBUG - lv_area_t area_rot; - lv_area_copy(&area_rot, coords); - if(draw_dsc->rotation || draw_dsc->scale_x != LV_SCALE_NONE || draw_dsc->scale_y != LV_SCALE_NONE) { - int32_t w = lv_area_get_width(coords); - int32_t h = lv_area_get_height(coords); - - lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, - &draw_dsc->pivot); - - area_rot.x1 += coords->x1; - area_rot.y1 += coords->y1; - area_rot.x2 += coords->x1; - area_rot.y2 += coords->y1; - } - lv_area_t draw_area; - if(!lv_area_intersect(&draw_area, &area_rot, draw_unit->clip_area)) return; -#endif - -#if LV_USE_LAYER_DEBUG - lv_draw_fill_dsc_t fill_dsc; - lv_draw_fill_dsc_init(&fill_dsc); - fill_dsc.color = lv_color_hex(layer_to_draw->color_format == LV_COLOR_FORMAT_ARGB8888 ? 0xff0000 : 0x00ff00); - fill_dsc.opa = LV_OPA_20; - lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); - - lv_draw_border_dsc_t border_dsc; - lv_draw_border_dsc_init(&border_dsc); - border_dsc.color = fill_dsc.color; - border_dsc.opa = LV_OPA_60; - border_dsc.width = 2; - lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); - -#endif - -#if LV_USE_PARALLEL_DRAW_DEBUG - uint32_t idx = 0; - lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head; - while(draw_unit_tmp != draw_unit) { - draw_unit_tmp = draw_unit_tmp->next; - idx++; - } - - lv_draw_fill_dsc_t fill_dsc; - lv_draw_rect_dsc_init(&fill_dsc); - fill_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); - fill_dsc.opa = LV_OPA_10; - lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); - - lv_draw_border_dsc_t border_dsc; - lv_draw_border_dsc_init(&border_dsc); - border_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); - border_dsc.opa = LV_OPA_100; - border_dsc.width = 2; - lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); - - lv_point_t txt_size; - lv_text_get_size(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); - - lv_area_t txt_area; - txt_area.x1 = draw_area.x1; - txt_area.x2 = draw_area.x1 + txt_size.x - 1; - txt_area.y2 = draw_area.y2; - txt_area.y1 = draw_area.y2 - txt_size.y + 1; - - lv_draw_fill_dsc_init(&fill_dsc); - fill_dsc.color = lv_color_black(); - lv_draw_sw_fill(draw_unit, &fill_dsc, &txt_area); - - char buf[8]; - lv_snprintf(buf, sizeof(buf), "%d", idx); - lv_draw_label_dsc_t label_dsc; - lv_draw_label_dsc_init(&label_dsc); - label_dsc.color = lv_color_white(); - label_dsc.text = buf; - lv_draw_sw_label(draw_unit, &label_dsc, &txt_area); -#endif -} - -#endif /*LV_USE_DRAW_PXP*/ -#endif /*LV_USE_PXP*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_cfg.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_cfg.c deleted file mode 100644 index 675c1d0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_cfg.c +++ /dev/null @@ -1,93 +0,0 @@ -/** - * @file lv_pxp_cfg.c - * - */ - -/** - * Copyright 2020-2023 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_pxp_cfg.h" - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP -#include "lv_pxp_osa.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -static pxp_cfg_t * _pxp_cfg; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_pxp_init(void) -{ - _pxp_cfg = pxp_get_default_cfg(); - - PXP_Init(PXP_ID); - - PXP_EnableCsc1(PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ - PXP_SetProcessBlockSize(PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/ - - PXP_EnableInterrupts(PXP_ID, kPXP_CompleteInterruptEnable); - - _pxp_cfg->pxp_interrupt_init(); -} - -void lv_pxp_deinit(void) -{ - _pxp_cfg->pxp_interrupt_deinit(); - PXP_DisableInterrupts(PXP_ID, kPXP_CompleteInterruptEnable); - PXP_Deinit(PXP_ID); -} - -void lv_pxp_reset(void) -{ - PXP_ResetControl(PXP_ID); - - PXP_EnableCsc1(PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ - PXP_SetProcessBlockSize(PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/ -} - -void lv_pxp_run(void) -{ - _pxp_cfg->pxp_run(); - _pxp_cfg->pxp_wait(); -} - -void lv_pxp_wait(void) -{ - _pxp_cfg->pxp_wait(); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ -#endif /*LV_USE_PXP*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_cfg.h b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_cfg.h deleted file mode 100644 index 67d1358..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_cfg.h +++ /dev/null @@ -1,104 +0,0 @@ -/** - * @file lv_pxp_cfg.h - * - */ - -/** - * Copyright 2020-2023 NXP - * - * SPDX-License-Identifier: MIT - */ - -#ifndef LV_PXP_CFG_H -#define LV_PXP_CFG_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../../lv_conf_internal.h" - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP -#include "fsl_cache.h" -#include "fsl_pxp.h" - -#include "../../../misc/lv_log.h" - -/********************* - * DEFINES - *********************/ - -/** PXP module instance to use*/ -#define PXP_ID PXP - -/** PXP interrupt line ID*/ -#define PXP_IRQ_ID PXP_IRQn - -/********************** - * TYPEDEFS - **********************/ - -/** - * NXP PXP device configuration. - */ -typedef struct { - /** Callback for PXP interrupt initialization*/ - void (*pxp_interrupt_init)(void); - - /** Callback for PXP interrupt de-initialization*/ - void (*pxp_interrupt_deinit)(void); - - /** Callback for PXP start*/ - void (*pxp_run)(void); - - /** Callback for waiting of PXP completion*/ - void (*pxp_wait)(void); -} pxp_cfg_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Reset and initialize PXP device. This function should be called as a part - * of display init sequence. - */ -void lv_pxp_init(void); - -/** - * Disable PXP device. Should be called during display deinit sequence. - */ -void lv_pxp_deinit(void); - -/** - * Reset PXP device. - */ -void lv_pxp_reset(void); - -/** - * Clear cache and start PXP. - */ -void lv_pxp_run(void); - -/** - * Wait for PXP completion. - */ -void lv_pxp_wait(void); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ -#endif /*LV_USE_PXP*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_PXP_CFG_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_osa.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_osa.c deleted file mode 100644 index 43dd815..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_osa.c +++ /dev/null @@ -1,188 +0,0 @@ -/** - * @file lv_pxp_osa.c - * - */ - -/** - * Copyright 2020, 2022-2023 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_pxp_osa.h" - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP -#include "lv_pxp_utils.h" -#include "../../../misc/lv_log.h" -#include "../../../osal/lv_os.h" -#include "fsl_pxp.h" - -#if defined(SDK_OS_FREE_RTOS) - #include "FreeRTOS.h" -#endif - -#if defined(__ZEPHYR__) - #include - #include -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/** - * PXP interrupt initialization. - */ -static void _pxp_interrupt_init(void); - -/** - * PXP interrupt de-initialization. - */ -static void _pxp_interrupt_deinit(void); - -/** - * Start the PXP job. - */ -static void _pxp_run(void); - -/** - * Wait for PXP completion. - */ -static void _pxp_wait(void); - -#if defined(__ZEPHYR__) - /** - * Interrupt handler for Zephyr IRQ - */ - static void _pxp_zephyr_irq_handler(void *); -#endif - -/********************** - * STATIC VARIABLES - **********************/ - -#if LV_USE_OS - static lv_thread_sync_t pxp_sync; -#endif -static volatile bool ucPXPIdle; - -static pxp_cfg_t _pxp_default_cfg = { - .pxp_interrupt_init = _pxp_interrupt_init, - .pxp_interrupt_deinit = _pxp_interrupt_deinit, - .pxp_run = _pxp_run, - .pxp_wait = _pxp_wait, -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void PXP_IRQHandler(void) -{ - if(kPXP_CompleteFlag & PXP_GetStatusFlags(PXP_ID)) { - PXP_ClearStatusFlags(PXP_ID, kPXP_CompleteFlag); -#if LV_USE_OS - lv_thread_sync_signal_isr(&pxp_sync); -#else - ucPXPIdle = true; -#endif - } -} - -pxp_cfg_t * pxp_get_default_cfg(void) -{ - return &_pxp_default_cfg; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#if defined(__ZEPHYR__) -static void _pxp_zephyr_irq_handler(void *) -{ - PXP_IRQHandler(); -} -#endif - -static void _pxp_interrupt_init(void) -{ -#if LV_USE_OS - if(lv_thread_sync_init(&pxp_sync) != LV_RESULT_OK) { - PXP_ASSERT_MSG(false, "Failed to init thread_sync."); - } -#endif - -#if defined(__ZEPHYR__) - IRQ_CONNECT(DT_IRQN(DT_NODELABEL(pxp)), CONFIG_LV_Z_PXP_INTERRUPT_PRIORITY, _pxp_zephyr_irq_handler, NULL, 0); - irq_enable(DT_IRQN(DT_NODELABEL(pxp))); -#elif defined(SDK_OS_FREE_RTOS) - NVIC_SetPriority(PXP_IRQ_ID, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1); -#endif - -#if !defined(__ZEPHYR__) - NVIC_EnableIRQ(PXP_IRQ_ID); -#endif - - ucPXPIdle = true; -} - -static void _pxp_interrupt_deinit(void) -{ -#if defined(__ZEPHYR__) - irq_disable(DT_IRQN(DT_NODELABEL(pxp))); -#else - NVIC_DisableIRQ(PXP_IRQ_ID); -#endif - -#if LV_USE_OS - lv_thread_sync_delete(&pxp_sync); -#endif -} - -/** - * Function to start PXP job. - */ -static void _pxp_run(void) -{ - ucPXPIdle = false; - - PXP_EnableInterrupts(PXP_ID, kPXP_CompleteInterruptEnable); - PXP_Start(PXP_ID); -} - -/** - * Function to wait for PXP completion. - */ -static void _pxp_wait(void) -{ - if(ucPXPIdle == true) - return; -#if LV_USE_OS - if(lv_thread_sync_wait(&pxp_sync) == LV_RESULT_OK) - ucPXPIdle = true; -#else - while(ucPXPIdle == false) { - } -#endif -} - -#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ -#endif /*LV_USE_PXP*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_osa.h b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_osa.h deleted file mode 100644 index 5e3d666..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_osa.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @file lv_pxp_osa.h - * - */ - -/** - * Copyright 2020, 2022-2023 NXP - * - * SPDX-License-Identifier: MIT - */ - -#ifndef LV_PXP_OSA_H -#define LV_PXP_OSA_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../../lv_conf_internal.h" - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP -#include "lv_pxp_cfg.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * PXP device interrupt handler. Used to check PXP task completion status. - */ -void PXP_IRQHandler(void); - -/** - * Get the PXP default configuration. - */ -pxp_cfg_t * pxp_get_default_cfg(void); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ -#endif /*LV_USE_PXP*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_PXP_OSA_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_utils.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_utils.c deleted file mode 100644 index 26acf6c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_utils.c +++ /dev/null @@ -1,149 +0,0 @@ -/** - * @file lv_pxp_utils.c - * - */ - -/** - * Copyright 2023-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_pxp_utils.h" - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -pxp_output_pixel_format_t pxp_get_out_px_format(lv_color_format_t cf) -{ - pxp_output_pixel_format_t out_px_format = kPXP_OutputPixelFormatRGB565; - - switch(cf) { - case LV_COLOR_FORMAT_RGB565: - out_px_format = kPXP_OutputPixelFormatRGB565; - break; - case LV_COLOR_FORMAT_RGB888: - out_px_format = kPXP_OutputPixelFormatRGB888P; - break; - case LV_COLOR_FORMAT_ARGB8888: - out_px_format = kPXP_OutputPixelFormatARGB8888; - break; - case LV_COLOR_FORMAT_XRGB8888: - out_px_format = kPXP_OutputPixelFormatRGB888; - break; - - default: - PXP_ASSERT_MSG(false, "Unsupported color format."); - break; - } - - return out_px_format; -} - -pxp_as_pixel_format_t pxp_get_as_px_format(lv_color_format_t cf) -{ - pxp_as_pixel_format_t as_px_format = kPXP_AsPixelFormatRGB565; - - switch(cf) { - case LV_COLOR_FORMAT_RGB565: - as_px_format = kPXP_AsPixelFormatRGB565; - break; - case LV_COLOR_FORMAT_RGB888: - PXP_ASSERT_MSG(false, "Unsupported color format."); - break; - case LV_COLOR_FORMAT_ARGB8888: - as_px_format = kPXP_AsPixelFormatARGB8888; - break; - case LV_COLOR_FORMAT_XRGB8888: - as_px_format = kPXP_AsPixelFormatRGB888; - break; - - default: - PXP_ASSERT_MSG(false, "Unsupported color format."); - break; - } - - return as_px_format; -} - -#if LV_USE_DRAW_PXP -pxp_ps_pixel_format_t pxp_get_ps_px_format(lv_color_format_t cf) -{ - pxp_ps_pixel_format_t ps_px_format = kPXP_PsPixelFormatRGB565; - - switch(cf) { - case LV_COLOR_FORMAT_RGB565: - ps_px_format = kPXP_PsPixelFormatRGB565; - break; - case LV_COLOR_FORMAT_RGB888: - PXP_ASSERT_MSG(false, "Unsupported color format."); - break; - case LV_COLOR_FORMAT_ARGB8888: -#if (!(defined(FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT) && FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT)) && \ - (!(defined(FSL_FEATURE_PXP_V3) && FSL_FEATURE_PXP_V3)) - ps_px_format = kPXP_PsPixelFormatARGB8888; -#else - PXP_ASSERT_MSG(false, "Unsupported color format."); -#endif - break; - case LV_COLOR_FORMAT_XRGB8888: -#if (!(defined(FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT) && FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT)) && \ - (!(defined(FSL_FEATURE_PXP_V3) && FSL_FEATURE_PXP_V3)) - ps_px_format = kPXP_PsPixelFormatARGB8888; -#else - ps_px_format = kPXP_PsPixelFormatRGB888; -#endif - break; - - default: - PXP_ASSERT_MSG(false, "Unsupported color format."); - break; - } - - return ps_px_format; -} - -bool pxp_buf_aligned(const void * buf, uint32_t stride) -{ - /* Test for pointer alignment */ - if((uintptr_t)buf % 64) - return false; - - /* Test for invalid stride (no stride alignment required) */ - if(stride == 0) - return false; - - return true; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_PXP*/ -#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ -#endif /*LV_USE_PXP*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_utils.h b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_utils.h deleted file mode 100644 index c9ba7ba..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/pxp/lv_pxp_utils.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @file lv_pxp_utils.h - * - */ - -/** - * Copyright 2023-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -#ifndef LV_PXP_UTILS_H -#define LV_PXP_UTILS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../../lv_conf_internal.h" - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP -#include "fsl_pxp.h" -#include "../../../misc/lv_color.h" - -/********************* - * DEFINES - *********************/ - -#if LV_USE_PXP_ASSERT -#define PXP_ASSERT(expr) LV_ASSERT(expr) -#else -#define PXP_ASSERT(expr) -#endif - -#define PXP_ASSERT_MSG(expr, msg) \ - do { \ - if(!(expr)) { \ - LV_LOG_ERROR(msg); \ - PXP_ASSERT(false); \ - } \ - } while(0) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -pxp_output_pixel_format_t pxp_get_out_px_format(lv_color_format_t cf); - -pxp_as_pixel_format_t pxp_get_as_px_format(lv_color_format_t cf); - -#if LV_USE_DRAW_PXP -pxp_ps_pixel_format_t pxp_get_ps_px_format(lv_color_format_t cf); - -bool pxp_buf_aligned(const void * buf, uint32_t stride); - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_PXP*/ -#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ -#endif /*LV_USE_PXP*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_PXP_UTILS_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_buf_vglite.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_buf_vglite.c deleted file mode 100644 index 8540395..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_buf_vglite.c +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @file lv_draw_buf_vglite.c - * - */ - -/** - * Copyright 2023-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vglite.h" - -#if LV_USE_DRAW_VGLITE -#include "../../lv_draw_buf_private.h" -#include "lv_vglite_buf.h" -#include "lv_vglite_utils.h" - -#include "lvgl_support.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); -static uint32_t _width_to_stride(uint32_t w, lv_color_format_t cf); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_buf_vglite_init_handlers(void) -{ - lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); - lv_draw_buf_handlers_t * font_handlers = lv_draw_buf_get_font_handlers(); - lv_draw_buf_handlers_t * image_handlers = lv_draw_buf_get_image_handlers(); - - handlers->invalidate_cache_cb = _invalidate_cache; - font_handlers->invalidate_cache_cb = _invalidate_cache; - image_handlers->invalidate_cache_cb = _invalidate_cache; - - handlers->width_to_stride_cb = _width_to_stride; - font_handlers->width_to_stride_cb = _width_to_stride; - image_handlers->width_to_stride_cb = _width_to_stride; - -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) -{ - const lv_image_header_t * header = &draw_buf->header; - uint32_t stride = header->stride; - lv_color_format_t cf = header->cf; - - if(area->y1 == 0) { - uint32_t size = stride * lv_area_get_height(area); - - /* Invalidate full buffer. */ - DEMO_CleanInvalidateCacheByAddr((void *)draw_buf->data, size); - return; - } - - const uint8_t * buf_u8 = draw_buf->data; - /* ARM require a 32 byte aligned address. */ - uint8_t align_bytes = 32; - uint8_t bits_per_pixel = lv_color_format_get_bpp(cf); - - uint16_t align_pixels = align_bytes * 8 / bits_per_pixel; - uint16_t offset_x = 0; - - if(area->x1 >= (int32_t)(area->x1 % align_pixels)) { - uint16_t shift_x = area->x1 - (area->x1 % align_pixels); - - offset_x = area->x1 - shift_x; - buf_u8 += (shift_x * bits_per_pixel) / 8; - } - - if(area->y1) { - uint16_t shift_y = area->y1; - - buf_u8 += shift_y * stride; - } - - /* Area to clear can start from a different offset in buffer. - * Invalidate the area line by line. - */ - uint16_t line_pixels = offset_x + lv_area_get_width(area); - uint16_t line_size = (line_pixels * bits_per_pixel) / 8; - uint16_t area_height = lv_area_get_height(area); - - for(uint16_t y = 0; y < area_height; y++) { - const void * line_addr = buf_u8 + y * stride; - - DEMO_CleanInvalidateCacheByAddr((void *)line_addr, line_size); - } -} - -static uint32_t _width_to_stride(uint32_t w, lv_color_format_t cf) -{ - uint8_t bits_per_pixel = lv_color_format_get_bpp(cf); - uint32_t width_bits = (w * bits_per_pixel + 7) & ~7; - uint32_t width_bytes = width_bits / 8; - uint8_t align_bytes = vglite_get_stride_alignment(cf); - - return (width_bytes + align_bytes - 1) & ~(align_bytes - 1); -} - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite.c deleted file mode 100644 index c6fc016..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite.c +++ /dev/null @@ -1,594 +0,0 @@ -/** - * @file lv_draw_vglite.c - * - */ - -/** - * Copyright 2023-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vglite.h" - -#if LV_USE_DRAW_VGLITE -#include "lv_vglite_buf.h" -#include "lv_vglite_utils.h" - -#include "../../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ - -#define DRAW_UNIT_ID_VGLITE 2 - -#if LV_USE_VGLITE_DRAW_ASYNC - #define VGLITE_TASK_BUF_SIZE 100 -#endif - -/********************** - * TYPEDEFS - **********************/ - -#if LV_USE_VGLITE_DRAW_ASYNC -/** - * Structure of pending vglite draw task - */ -typedef struct _vglite_draw_task_t { - lv_draw_task_t * task; - bool flushed; -} vglite_draw_tasks_t; -#endif - -/********************** - * STATIC PROTOTYPES - **********************/ - -/* - * Evaluate a task and set the score and preferred VGLite draw unit. - * Return 1 if task is preferred, 0 otherwise (task is not supported). - */ -static int32_t _vglite_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); - -/* - * Dispatch (assign) a task to VGLite draw unit (itself). - * Return 1 if task was dispatched, 0 otherwise (task not supported). - */ -static int32_t _vglite_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); - -/* - * Wait for VG-Lite draw unit to finish. - */ -#if LV_USE_VGLITE_DRAW_ASYNC - static int32_t _vglite_wait_for_finish(lv_draw_unit_t * draw_unit); -#endif - -/* - * Delete the VGLite draw unit. - */ -static int32_t _vglite_delete(lv_draw_unit_t * draw_unit); - -#if LV_USE_VGLITE_DRAW_THREAD - static void _vglite_render_thread_cb(void * ptr); -#endif - -static void _vglite_execute_drawing(lv_draw_vglite_unit_t * u); - -/********************** - * STATIC VARIABLES - **********************/ - -#define _draw_info LV_GLOBAL_DEFAULT()->draw_info - -#if LV_USE_VGLITE_DRAW_ASYNC - /* - * Circular buffer to hold the queued and the flushed tasks. - * Two indexes, _head and _tail, are used to signal the beginning - * and the end of the valid tasks that are pending. - */ - static vglite_draw_tasks_t _draw_task_buf[VGLITE_TASK_BUF_SIZE]; - static volatile int _head = 0; - static volatile int _tail = 0; -#endif - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vglite_init(void) -{ - lv_draw_buf_vglite_init_handlers(); - - lv_draw_vglite_unit_t * draw_vglite_unit = lv_draw_create_unit(sizeof(lv_draw_vglite_unit_t)); - draw_vglite_unit->base_unit.evaluate_cb = _vglite_evaluate; - draw_vglite_unit->base_unit.dispatch_cb = _vglite_dispatch; -#if LV_USE_VGLITE_DRAW_ASYNC - draw_vglite_unit->base_unit.wait_for_finish_cb = _vglite_wait_for_finish; -#endif - draw_vglite_unit->base_unit.delete_cb = _vglite_delete; - -#if LV_USE_VGLITE_DRAW_THREAD - lv_thread_init(&draw_vglite_unit->thread, LV_THREAD_PRIO_HIGH, _vglite_render_thread_cb, 2 * 1024, draw_vglite_unit); -#endif -} - -void lv_draw_vglite_deinit(void) -{ -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static inline bool _vglite_src_cf_supported(lv_color_format_t cf) -{ - bool is_cf_supported = false; - - switch(cf) { -#if CHIPID == 0x255 || CHIPID == 0x555 - case LV_COLOR_FORMAT_I1: - case LV_COLOR_FORMAT_I2: - case LV_COLOR_FORMAT_I4: - case LV_COLOR_FORMAT_I8: -#endif - case LV_COLOR_FORMAT_A4: - case LV_COLOR_FORMAT_A8: - case LV_COLOR_FORMAT_L8: - case LV_COLOR_FORMAT_RGB565: -#if CHIPID == 0x555 - case LV_COLOR_FORMAT_RGB565A8: - case LV_COLOR_FORMAT_RGB888: -#endif - case LV_COLOR_FORMAT_ARGB8888: - case LV_COLOR_FORMAT_XRGB8888: - is_cf_supported = true; - break; - default: - break; - } - - return is_cf_supported; -} - -static inline bool _vglite_dest_cf_supported(lv_color_format_t cf) -{ - bool is_cf_supported = false; - - switch(cf) { - case LV_COLOR_FORMAT_A8: -#if CHIPID == 0x255 || CHIPID == 0x555 - case LV_COLOR_FORMAT_L8: -#endif - case LV_COLOR_FORMAT_RGB565: -#if CHIPID == 0x555 - case LV_COLOR_FORMAT_RGB565A8: - case LV_COLOR_FORMAT_RGB888: -#endif - case LV_COLOR_FORMAT_ARGB8888: - case LV_COLOR_FORMAT_XRGB8888: - is_cf_supported = true; - break; - default: - break; - } - - return is_cf_supported; -} - -static int32_t _vglite_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t) -{ - LV_UNUSED(u); - - const lv_draw_dsc_base_t * draw_dsc_base = (lv_draw_dsc_base_t *) t->draw_dsc; - - if(!_vglite_dest_cf_supported(draw_dsc_base->layer->color_format)) - return 0; - - switch(t->type) { - case LV_DRAW_TASK_TYPE_FILL: - if(t->preference_score > 80) { - t->preference_score = 80; - t->preferred_draw_unit_id = DRAW_UNIT_ID_VGLITE; - } - return 1; - - case LV_DRAW_TASK_TYPE_LINE: - case LV_DRAW_TASK_TYPE_ARC: - case LV_DRAW_TASK_TYPE_TRIANGLE: - if(t->preference_score > 90) { - t->preference_score = 90; - t->preferred_draw_unit_id = DRAW_UNIT_ID_VGLITE; - } - return 1; - - case LV_DRAW_TASK_TYPE_LABEL: - if(t->preference_score > 95) { - t->preference_score = 95; - t->preferred_draw_unit_id = DRAW_UNIT_ID_VGLITE; - } - return 1; - - case LV_DRAW_TASK_TYPE_BORDER: { - if(t->preference_score > 90) { - t->preference_score = 90; - t->preferred_draw_unit_id = DRAW_UNIT_ID_VGLITE; - } - return 1; - } - - case LV_DRAW_TASK_TYPE_LAYER: { - const lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc; - lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; - -#if LV_USE_VGLITE_BLIT_SPLIT - bool has_transform = (draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || - draw_dsc->scale_y != LV_SCALE_NONE); -#endif - if(!_vglite_src_cf_supported(layer_to_draw->color_format) -#if LV_USE_VGLITE_BLIT_SPLIT - || has_transform -#endif - ) - return 0; - - if(t->preference_score > 80) { - t->preference_score = 80; - t->preferred_draw_unit_id = DRAW_UNIT_ID_VGLITE; - } - return 1; - } - - case LV_DRAW_TASK_TYPE_IMAGE: { - lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc; - const lv_image_dsc_t * img_dsc = draw_dsc->src; - -#if LV_USE_VGLITE_BLIT_SPLIT - bool has_transform = (draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || - draw_dsc->scale_y != LV_SCALE_NONE); -#endif - - if((!_vglite_src_cf_supported(img_dsc->header.cf)) -#if LV_USE_VGLITE_BLIT_SPLIT - || has_transform -#endif - || (!vglite_src_buf_aligned(img_dsc->data, img_dsc->header.stride, img_dsc->header.cf)) - ) - return 0; - - if(t->preference_score > 80) { - t->preference_score = 80; - t->preferred_draw_unit_id = DRAW_UNIT_ID_VGLITE; - } - return 1; - } - default: - return 0; - } - - return 0; -} - -static int32_t _vglite_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) -{ - lv_draw_vglite_unit_t * draw_vglite_unit = (lv_draw_vglite_unit_t *) draw_unit; - - /* Return immediately if it's busy with draw task. */ - if(draw_vglite_unit->task_act) - return 0; - - /* Try to get an ready to draw. */ - lv_draw_task_t * t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_VGLITE); - - if(t == NULL) - return LV_DRAW_UNIT_IDLE; - - if(t->preferred_draw_unit_id != DRAW_UNIT_ID_VGLITE) { - /* Let the preferred known unit to draw this task. */ - if(t->preferred_draw_unit_id != LV_DRAW_UNIT_NONE) { - return LV_DRAW_UNIT_IDLE; - } - else { - /* Fake unsupported tasks as ready. */ - t->state = LV_DRAW_TASK_STATE_READY; - /* Request a new dispatching as it can get a new task. */ - lv_draw_dispatch_request(); - - return 1; - } - } - - if(lv_draw_layer_alloc_buf(layer) == NULL) - return LV_DRAW_UNIT_IDLE; - - t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; - draw_vglite_unit->base_unit.target_layer = layer; - draw_vglite_unit->base_unit.clip_area = &t->clip_area; - draw_vglite_unit->task_act = t; - -#if LV_USE_VGLITE_DRAW_THREAD - /* Let the render thread work. */ - if(draw_vglite_unit->inited) - lv_thread_sync_signal(&draw_vglite_unit->sync); -#else - _vglite_execute_drawing(draw_vglite_unit); - - draw_vglite_unit->task_act->state = LV_DRAW_TASK_STATE_READY; - draw_vglite_unit->task_act = NULL; - - /* The draw unit is free now. Request a new dispatching as it can get a new task. */ - lv_draw_dispatch_request(); -#endif - - return 1; -} - -#if LV_USE_VGLITE_DRAW_ASYNC -static int32_t _vglite_wait_for_finish(lv_draw_unit_t * draw_unit) -{ - lv_draw_vglite_unit_t * draw_vglite_unit = (lv_draw_vglite_unit_t *) draw_unit; - draw_vglite_unit->wait_for_finish = true; - - /* Signal draw unit to finish its tasks and return READY state after completion. */ - if(draw_vglite_unit->inited) - lv_thread_sync_signal(&draw_vglite_unit->sync); - - /* Wait for finish now. */ - lv_draw_dispatch_wait_for_request(); - - return 1; -} -#endif - -static int32_t _vglite_delete(lv_draw_unit_t * draw_unit) -{ -#if LV_USE_VGLITE_DRAW_THREAD - lv_draw_vglite_unit_t * draw_vglite_unit = (lv_draw_vglite_unit_t *) draw_unit; - - LV_LOG_INFO("Cancel VGLite draw thread."); - draw_vglite_unit->exit_status = true; - - if(draw_vglite_unit->inited) - lv_thread_sync_signal(&draw_vglite_unit->sync); - - lv_result_t res = lv_thread_delete(&draw_vglite_unit->thread); - - return res; -#else - LV_UNUSED(draw_unit); - - return 1; -#endif -} - -static void _vglite_execute_drawing(lv_draw_vglite_unit_t * u) -{ - lv_draw_task_t * t = u->task_act; - lv_draw_unit_t * draw_unit = (lv_draw_unit_t *)u; - lv_layer_t * layer = draw_unit->target_layer; - lv_draw_buf_t * draw_buf = layer->draw_buf; - - /* Set target buffer */ - vglite_set_dest_buf(draw_buf->data, draw_buf->header.w, draw_buf->header.h, draw_buf->header.stride, - draw_buf->header.cf); - - lv_area_t clip_area; - lv_area_copy(&clip_area, draw_unit->clip_area); - lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_area_t draw_area; - lv_area_copy(&draw_area, &t->area); - lv_area_move(&draw_area, -layer->buf_area.x1, -layer->buf_area.y1); - - if(!lv_area_intersect(&draw_area, &draw_area, &clip_area)) - return; /*Fully clipped, nothing to do*/ - - if(_draw_info.unit_cnt > 1) - lv_draw_buf_invalidate_cache(draw_buf, &draw_area); - - /* Set scissor area, excluding the split blit case */ -#if LV_USE_VGLITE_BLIT_SPLIT - if(t->type != LV_DRAW_TASK_TYPE_IMAGE || t->type != LV_DRAW_TASK_TYPE_LAYER) -#endif - vglite_set_scissor(&clip_area); - - switch(t->type) { - case LV_DRAW_TASK_TYPE_LABEL: - lv_draw_vglite_label(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_FILL: - lv_draw_vglite_fill(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_BORDER: - lv_draw_vglite_border(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_IMAGE: - lv_draw_vglite_img(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_ARC: - lv_draw_vglite_arc(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_LINE: - lv_draw_vglite_line(draw_unit, t->draw_dsc); - break; - case LV_DRAW_TASK_TYPE_LAYER: - lv_draw_vglite_layer(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_TRIANGLE: - lv_draw_vglite_triangle(draw_unit, t->draw_dsc); - break; - default: - break; - } - - /* Disable scissor */ - vglite_set_scissor(&layer->buf_area); - -#if LV_USE_PARALLEL_DRAW_DEBUG - /*Layers manage it for themselves*/ - if(t->type != LV_DRAW_TASK_TYPE_LAYER) { - lv_area_t draw_area; - if(!lv_area_intersect(&draw_area, &t->area, u->base_unit.clip_area)) - return; - - int32_t idx = 0; - lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head; - while(draw_unit_tmp != (lv_draw_unit_t *)u) { - draw_unit_tmp = draw_unit_tmp->next; - idx++; - } - lv_draw_rect_dsc_t rect_dsc; - lv_draw_rect_dsc_init(&rect_dsc); - rect_dsc.bg_color = lv_palette_main(idx % LV_PALETTE_LAST); - rect_dsc.border_color = rect_dsc.bg_color; - rect_dsc.bg_opa = LV_OPA_10; - rect_dsc.border_opa = LV_OPA_80; - rect_dsc.border_width = 1; - lv_draw_sw_fill((lv_draw_unit_t *)u, &rect_dsc, &draw_area); - - lv_point_t txt_size; - lv_text_get_size(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); - - lv_area_t txt_area; - txt_area.x1 = draw_area.x1; - txt_area.y1 = draw_area.y1; - txt_area.x2 = draw_area.x1 + txt_size.x - 1; - txt_area.y2 = draw_area.y1 + txt_size.y - 1; - - lv_draw_rect_dsc_init(&rect_dsc); - rect_dsc.bg_color = lv_color_white(); - lv_draw_sw_fill((lv_draw_unit_t *)u, &rect_dsc, &txt_area); - - char buf[8]; - lv_snprintf(buf, sizeof(buf), "%d", idx); - lv_draw_label_dsc_t label_dsc; - lv_draw_label_dsc_init(&label_dsc); - label_dsc.color = lv_color_black(); - label_dsc.text = buf; - lv_draw_sw_label((lv_draw_unit_t *)u, &label_dsc, &txt_area); - } -#endif -} - -#if LV_USE_VGLITE_DRAW_ASYNC -static inline void _vglite_queue_task(lv_draw_task_t * task) -{ - VGLITE_ASSERT_MSG(((_tail + 1) % VGLITE_TASK_BUF_SIZE) != _head, "VGLite task buffer full."); - - _draw_task_buf[_tail].task = task; - _draw_task_buf[_tail].flushed = false; - _tail = (_tail + 1) % VGLITE_TASK_BUF_SIZE; -} - -static inline void _vglite_signal_task_ready(lv_draw_task_t * task) -{ - /* Signal the ready state to dispatcher. */ - task->state = LV_DRAW_TASK_STATE_READY; - _head = (_head + 1) % VGLITE_TASK_BUF_SIZE; - - /* No need to cleanup the tasks in buffer as we advance with the _head. */ -} - -static inline void _vglite_signal_all_task_ready(void) -{ - int end = (_head <= _tail) ? _tail : _tail + VGLITE_TASK_BUF_SIZE; - - for(int i = _head; i < end; i++) { - lv_draw_task_t * task = _draw_task_buf[i % VGLITE_TASK_BUF_SIZE].task; - - _vglite_signal_task_ready(task); - } -} - -static inline void _vglite_signal_flushed_task_ready(void) -{ - if(vglite_cmd_buf_is_flushed()) { - int end = (_head <= _tail) ? _tail : _tail + VGLITE_TASK_BUF_SIZE; - - for(int i = _head; i < end; i++) { - if(_draw_task_buf[i % VGLITE_TASK_BUF_SIZE].flushed) { - lv_draw_task_t * task = _draw_task_buf[i % VGLITE_TASK_BUF_SIZE].task; - - _vglite_signal_task_ready(task); - - } - else { - /* Those tasks have been flushed now. */ - _draw_task_buf[i % VGLITE_TASK_BUF_SIZE].flushed = true; - } - } - } -} -#endif - -#if LV_USE_VGLITE_DRAW_THREAD -static void _vglite_render_thread_cb(void * ptr) -{ - lv_draw_vglite_unit_t * u = ptr; - - lv_thread_sync_init(&u->sync); - u->inited = true; - - while(1) { - /* Wait for sync if there is no task set. */ - while(u->task_act == NULL -#if LV_USE_VGLITE_DRAW_ASYNC - /* - * Wait for sync if _draw_task_buf is empty. - * The thread will have to run to complete any pending tasks. - */ - && !u->wait_for_finish -#endif - ) { - if(u->exit_status) - break; - - lv_thread_sync_wait(&u->sync); - } - - if(u->exit_status) { - LV_LOG_INFO("Ready to exit VGLite draw thread."); - break; - } - - if(u->task_act) { -#if LV_USE_VGLITE_DRAW_ASYNC - _vglite_queue_task((void *)u->task_act); -#endif - _vglite_execute_drawing(u); - } -#if LV_USE_VGLITE_DRAW_ASYNC - if(u->wait_for_finish) { - u->wait_for_finish = false; - vglite_wait_for_finish(); - _vglite_signal_all_task_ready(); - } - else { /* u->task_act */ - _vglite_signal_flushed_task_ready(); - } -#else - /* Signal the ready state to dispatcher. */ - u->task_act->state = LV_DRAW_TASK_STATE_READY; -#endif - /* Cleanup. */ - u->task_act = NULL; - - /* The draw unit is free now. Request a new dispatching as it can get a new task. */ - lv_draw_dispatch_request(); - } - - u->inited = false; - lv_thread_sync_delete(&u->sync); - LV_LOG_INFO("Exit VGLite draw thread."); -} -#endif - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite.h b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite.h deleted file mode 100644 index 93b18cd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite.h +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @file lv_draw_vglite.h - * - */ - -/** - * Copyright 2023-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -#ifndef LV_DRAW_VGLITE_H -#define LV_DRAW_VGLITE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../../lv_conf_internal.h" - -#if LV_USE_DRAW_VGLITE -#include "../../lv_draw_private.h" -#include "../../sw/lv_draw_sw_private.h" -#include "../../../misc/lv_area_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct lv_draw_vglite_unit { - lv_draw_sw_unit_t; -#if LV_USE_VGLITE_DRAW_ASYNC - volatile bool wait_for_finish; -#endif -} lv_draw_vglite_unit_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_draw_buf_vglite_init_handlers(void); - -void lv_draw_vglite_init(void); - -void lv_draw_vglite_deinit(void); - -void lv_draw_vglite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_vglite_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_vglite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_vglite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_vglite_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_vglite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords); - -void lv_draw_vglite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); - -void lv_draw_vglite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc); - -/********************** - * MACROS - **********************/ -#endif /*LV_USE_DRAW_VGLITE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_VGLITE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_arc.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_arc.c deleted file mode 100644 index 6b0d4fe..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_arc.c +++ /dev/null @@ -1,686 +0,0 @@ -/** - * @file lv_draw_vglite_arc.c - * - */ - -/** - * Copyright 2021-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vglite.h" - -#if LV_USE_DRAW_VGLITE -#include "lv_vglite_buf.h" -#include "lv_vglite_path.h" -#include "lv_vglite_utils.h" - -#include "../../../stdlib/lv_string.h" -#include - -/********************* - * DEFINES - *********************/ - -#define T_FRACTION 16384.0f - -#define DICHOTO_ITER 5 - -static const uint16_t TperDegree[90] = { - 0, 174, 348, 522, 697, 873, 1049, 1226, 1403, 1581, - 1759, 1938, 2117, 2297, 2477, 2658, 2839, 3020, 3202, 3384, - 3567, 3749, 3933, 4116, 4300, 4484, 4668, 4852, 5037, 5222, - 5407, 5592, 5777, 5962, 6148, 6334, 6519, 6705, 6891, 7077, - 7264, 7450, 7636, 7822, 8008, 8193, 8378, 8564, 8750, 8936, - 9122, 9309, 9495, 9681, 9867, 10052, 10238, 10424, 10609, 10794, - 10979, 11164, 11349, 11534, 11718, 11902, 12086, 12270, 12453, 12637, - 12819, 13002, 13184, 13366, 13547, 13728, 13909, 14089, 14269, 14448, - 14627, 14805, 14983, 15160, 15337, 15513, 15689, 15864, 16038, 16212 -}; - -/********************** - * TYPEDEFS - **********************/ - -/* intermediate arc params */ -typedef struct _vg_arc { - int32_t angle; /* angle <90deg */ - int32_t quarter; /* 0-3 counter-clockwise */ - int32_t rad; /* radius */ - int32_t p0x; /* point P0 */ - int32_t p0y; - int32_t p1x; /* point P1 */ - int32_t p1y; - int32_t p2x; /* point P2 */ - int32_t p2y; - int32_t p3x; /* point P3 */ - int32_t p3y; -} vg_arc; - -typedef struct _cubic_cont_pt { - float p0; - float p1; - float p2; - float p3; -} cubic_cont_pt; - -/********************** - * STATIC PROTOTYPES - **********************/ - -/** - * Draw arc shape with effects - * - * @param[in] center Arc center with relative coordinates - * @param[in] clip_area Clip area with relative coordinates to dest buff - * @param[in] dsc Arc description structure (width, rounded ending, opacity) - * - */ -static void _vglite_draw_arc(const lv_point_t * center, const lv_area_t * clip_area, - const lv_draw_arc_dsc_t * dsc); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vglite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, - const lv_area_t * coords) -{ - LV_UNUSED(coords); - - if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) - return; - if(dsc->width == 0) - return; - if(dsc->start_angle == dsc->end_angle) - return; - - lv_layer_t * layer = draw_unit->target_layer; - lv_point_t center = {dsc->center.x - layer->buf_area.x1, dsc->center.y - layer->buf_area.y1}; - - lv_area_t clip_area; - lv_area_copy(&clip_area, draw_unit->clip_area); - lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); - - _vglite_draw_arc(¢er, &clip_area, dsc); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void _copy_arc(vg_arc * dst, vg_arc * src) -{ - dst->quarter = src->quarter; - dst->rad = src->rad; - dst->angle = src->angle; - dst->p0x = src->p0x; - dst->p1x = src->p1x; - dst->p2x = src->p2x; - dst->p3x = src->p3x; - dst->p0y = src->p0y; - dst->p1y = src->p1y; - dst->p2y = src->p2y; - dst->p3y = src->p3y; -} - -/** - * Rotate the point according given rotation angle rotation center is 0,0 - */ -static void _rotate_point(int32_t angle, int32_t * x, int32_t * y) -{ - int32_t ori_x = *x; - int32_t ori_y = *y; - int16_t alpha = (int16_t)angle; - *x = ((lv_trigo_cos(alpha) * ori_x) / LV_TRIGO_SIN_MAX) - ((lv_trigo_sin(alpha) * ori_y) / LV_TRIGO_SIN_MAX); - *y = ((lv_trigo_sin(alpha) * ori_x) / LV_TRIGO_SIN_MAX) + ((lv_trigo_cos(alpha) * ori_y) / LV_TRIGO_SIN_MAX); -} - -/** - * Set full arc control points depending on quarter. - * Control points match the best approximation of a circle. - * Arc Quarter position is: - * Q2 | Q3 - * ---+--- - * Q1 | Q0 - */ -static void _set_full_arc(vg_arc * fullarc) -{ - /* the tangent length for the bezier circle approx */ - float tang = ((float)fullarc->rad) * BEZIER_OPTIM_CIRCLE; - switch(fullarc->quarter) { - case 0: - /* first quarter */ - fullarc->p0x = fullarc->rad; - fullarc->p0y = 0; - fullarc->p1x = fullarc->rad; - fullarc->p1y = (int32_t)tang; - fullarc->p2x = (int32_t)tang; - fullarc->p2y = fullarc->rad; - fullarc->p3x = 0; - fullarc->p3y = fullarc->rad; - break; - case 1: - /* second quarter */ - fullarc->p0x = 0; - fullarc->p0y = fullarc->rad; - fullarc->p1x = 0 - (int32_t)tang; - fullarc->p1y = fullarc->rad; - fullarc->p2x = 0 - fullarc->rad; - fullarc->p2y = (int32_t)tang; - fullarc->p3x = 0 - fullarc->rad; - fullarc->p3y = 0; - break; - case 2: - /* third quarter */ - fullarc->p0x = 0 - fullarc->rad; - fullarc->p0y = 0; - fullarc->p1x = 0 - fullarc->rad; - fullarc->p1y = 0 - (int32_t)tang; - fullarc->p2x = 0 - (int32_t)tang; - fullarc->p2y = 0 - fullarc->rad; - fullarc->p3x = 0; - fullarc->p3y = 0 - fullarc->rad; - break; - case 3: - /* fourth quarter */ - fullarc->p0x = 0; - fullarc->p0y = 0 - fullarc->rad; - fullarc->p1x = (int32_t)tang; - fullarc->p1y = 0 - fullarc->rad; - fullarc->p2x = fullarc->rad; - fullarc->p2y = 0 - (int32_t)tang; - fullarc->p3x = fullarc->rad; - fullarc->p3y = 0; - break; - default: - VGLITE_ASSERT_MSG(false, "Invalid arc quarter."); - break; - } -} - -/** - * Linear interpolation between two points 'a' and 'b' - * 't' parameter is the proportion ratio expressed in range [0 ; T_FRACTION ] - */ -static inline float _lerp(float coord_a, float coord_b, uint16_t t) -{ - float tf = (float)t; - return ((T_FRACTION - tf) * coord_a + tf * coord_b) / T_FRACTION; -} - -/** - * Computes a point of bezier curve given 't' param - */ -static inline float _comp_bezier_point(float t, cubic_cont_pt cp) -{ - float t_sq = t * t; - float inv_t_sq = (1.0f - t) * (1.0f - t); - float apt = (1.0f - t) * inv_t_sq * cp.p0 + 3.0f * inv_t_sq * t * cp.p1 + 3.0f * (1.0f - t) * t_sq * cp.p2 + t * t_sq * - cp.p3; - return apt; -} - -/** - * Find parameter 't' in curve at point 'pt' - * proceed by dichotomy on only 1 dimension, - * works only if the curve is monotonic - * bezier curve is defined by control points [p0 p1 p2 p3] - * 'dec' tells if curve is decreasing (true) or increasing (false) - */ -static uint16_t _get_bez_t_from_pos(float pt, cubic_cont_pt cp, bool dec) -{ - /* initialize dichotomy with boundary 't' values */ - float t_low = 0.0f; - float t_mid = 0.5f; - float t_hig = 1.0f; - float a_pt; - /* dichotomy loop */ - for(int i = 0; i < DICHOTO_ITER; i++) { - a_pt = _comp_bezier_point(t_mid, cp); - /* check mid-point position on bezier curve versus targeted point */ - if((a_pt > pt) != dec) { - t_hig = t_mid; - } - else { - t_low = t_mid; - } - /* define new 't' param for mid-point */ - t_mid = (t_low + t_hig) / 2.0f; - } - /* return parameter 't' in integer range [0 ; T_FRACTION] */ - return (uint16_t)floorf(t_mid * T_FRACTION + 0.5f); -} - -/** - * Gives relative coords of the control points - * for the sub-arc starting at angle with given angle span - */ -static void _get_subarc_control_points(vg_arc * arc, int32_t span) -{ - vg_arc fullarc = {0}; - fullarc.angle = arc->angle; - fullarc.quarter = arc->quarter; - fullarc.rad = arc->rad; - _set_full_arc(&fullarc); - - /* special case of full arc */ - if(arc->angle == 90) { - _copy_arc(arc, &fullarc); - return; - } - - /* compute 1st arc using the geometric construction of curve */ - uint16_t t2 = TperDegree[arc->angle + span]; - - /* lerp for A */ - float a2x = _lerp((float)fullarc.p0x, (float)fullarc.p1x, t2); - float a2y = _lerp((float)fullarc.p0y, (float)fullarc.p1y, t2); - /* lerp for B */ - float b2x = _lerp((float)fullarc.p1x, (float)fullarc.p2x, t2); - float b2y = _lerp((float)fullarc.p1y, (float)fullarc.p2y, t2); - /* lerp for C */ - float c2x = _lerp((float)fullarc.p2x, (float)fullarc.p3x, t2); - float c2y = _lerp((float)fullarc.p2y, (float)fullarc.p3y, t2); - - /* lerp for D */ - float d2x = _lerp(a2x, b2x, t2); - float d2y = _lerp(a2y, b2y, t2); - /* lerp for E */ - float e2x = _lerp(b2x, c2x, t2); - float e2y = _lerp(b2y, c2y, t2); - - float pt2x = _lerp(d2x, e2x, t2); - float pt2y = _lerp(d2y, e2y, t2); - - /* compute sub-arc using the geometric construction of curve */ - uint16_t t1 = TperDegree[arc->angle]; - - /* lerp for A */ - float a1x = _lerp((float)fullarc.p0x, (float)fullarc.p1x, t1); - float a1y = _lerp((float)fullarc.p0y, (float)fullarc.p1y, t1); - /* lerp for B */ - float b1x = _lerp((float)fullarc.p1x, (float)fullarc.p2x, t1); - float b1y = _lerp((float)fullarc.p1y, (float)fullarc.p2y, t1); - /* lerp for C */ - float c1x = _lerp((float)fullarc.p2x, (float)fullarc.p3x, t1); - float c1y = _lerp((float)fullarc.p2y, (float)fullarc.p3y, t1); - - /* lerp for D */ - float d1x = _lerp(a1x, b1x, t1); - float d1y = _lerp(a1y, b1y, t1); - /* lerp for E */ - float e1x = _lerp(b1x, c1x, t1); - float e1y = _lerp(b1y, c1y, t1); - - float pt1x = _lerp(d1x, e1x, t1); - float pt1y = _lerp(d1y, e1y, t1); - - /* find the 't3' parameter for point P(t1) on the sub-arc [P0 A2 D2 P(t2)] using dichotomy - * use position of x axis only */ - uint16_t t3; - t3 = _get_bez_t_from_pos(pt1x, - (cubic_cont_pt) { - .p0 = ((float)fullarc.p0x), .p1 = a2x, .p2 = d2x, .p3 = pt2x - }, - (bool)(pt2x < (float)fullarc.p0x)); - - /* lerp for B */ - float b3x = _lerp(a2x, d2x, t3); - float b3y = _lerp(a2y, d2y, t3); - /* lerp for C */ - float c3x = _lerp(d2x, pt2x, t3); - float c3y = _lerp(d2y, pt2y, t3); - - /* lerp for E */ - float e3x = _lerp(b3x, c3x, t3); - float e3y = _lerp(b3y, c3y, t3); - - arc->p0x = (int32_t)floorf(0.5f + pt1x); - arc->p0y = (int32_t)floorf(0.5f + pt1y); - arc->p1x = (int32_t)floorf(0.5f + e3x); - arc->p1y = (int32_t)floorf(0.5f + e3y); - arc->p2x = (int32_t)floorf(0.5f + c3x); - arc->p2y = (int32_t)floorf(0.5f + c3y); - arc->p3x = (int32_t)floorf(0.5f + pt2x); - arc->p3y = (int32_t)floorf(0.5f + pt2y); -} - -/** - * Gives relative coords of the control points - */ -static void _get_arc_control_points(vg_arc * arc, bool start) -{ - vg_arc fullarc = {0}; - fullarc.angle = arc->angle; - fullarc.quarter = arc->quarter; - fullarc.rad = arc->rad; - _set_full_arc(&fullarc); - - /* special case of full arc */ - if(arc->angle == 90) { - _copy_arc(arc, &fullarc); - return; - } - - /* compute sub-arc using the geometric construction of curve */ - uint16_t t = TperDegree[arc->angle]; - /* lerp for A */ - float ax = _lerp((float)fullarc.p0x, (float)fullarc.p1x, t); - float ay = _lerp((float)fullarc.p0y, (float)fullarc.p1y, t); - /* lerp for B */ - float bx = _lerp((float)fullarc.p1x, (float)fullarc.p2x, t); - float by = _lerp((float)fullarc.p1y, (float)fullarc.p2y, t); - /* lerp for C */ - float cx = _lerp((float)fullarc.p2x, (float)fullarc.p3x, t); - float cy = _lerp((float)fullarc.p2y, (float)fullarc.p3y, t); - - /* lerp for D */ - float dx = _lerp(ax, bx, t); - float dy = _lerp(ay, by, t); - /* lerp for E */ - float ex = _lerp(bx, cx, t); - float ey = _lerp(by, cy, t); - - /* sub-arc's control points are tangents of DeCasteljau's algorithm */ - if(start) { - arc->p0x = (int32_t)floorf(0.5f + _lerp(dx, ex, t)); - arc->p0y = (int32_t)floorf(0.5f + _lerp(dy, ey, t)); - arc->p1x = (int32_t)floorf(0.5f + ex); - arc->p1y = (int32_t)floorf(0.5f + ey); - arc->p2x = (int32_t)floorf(0.5f + cx); - arc->p2y = (int32_t)floorf(0.5f + cy); - arc->p3x = fullarc.p3x; - arc->p3y = fullarc.p3y; - } - else { - arc->p0x = fullarc.p0x; - arc->p0y = fullarc.p0y; - arc->p1x = (int32_t)floorf(0.5f + ax); - arc->p1y = (int32_t)floorf(0.5f + ay); - arc->p2x = (int32_t)floorf(0.5f + dx); - arc->p2y = (int32_t)floorf(0.5f + dy); - arc->p3x = (int32_t)floorf(0.5f + _lerp(dx, ex, t)); - arc->p3y = (int32_t)floorf(0.5f + _lerp(dy, ey, t)); - } -} - -/** - * Add the arc control points into the path data for vglite, - * taking into account the real center of the arc (translation). - * arc_path: (in/out) the path data array for vglite - * pidx: (in/out) index of last element added in arc_path - * q_arc: (in) the arc data containing control points - * center: (in) the center of the circle in draw coordinates - * cw: (in) true if arc is clockwise - */ -static void _add_split_arc_path(int32_t * arc_path, int * pidx, vg_arc * q_arc, const lv_point_t * center, bool cw) -{ - /* assumes first control point already in array arc_path[] */ - int idx = *pidx; - if(cw) { -#if BEZIER_DBG_CONTROL_POINTS - arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p1x + center->x; - arc_path[idx++] = q_arc->p1y + center->y; - arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p2x + center->x; - arc_path[idx++] = q_arc->p2y + center->y; - arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p3x + center->x; - arc_path[idx++] = q_arc->p3y + center->y; -#else - arc_path[idx++] = VLC_OP_CUBIC; - arc_path[idx++] = q_arc->p1x + center->x; - arc_path[idx++] = q_arc->p1y + center->y; - arc_path[idx++] = q_arc->p2x + center->x; - arc_path[idx++] = q_arc->p2y + center->y; - arc_path[idx++] = q_arc->p3x + center->x; - arc_path[idx++] = q_arc->p3y + center->y; -#endif - } - else { /* reverse points order when counter-clockwise */ -#if BEZIER_DBG_CONTROL_POINTS - arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p2x + center->x; - arc_path[idx++] = q_arc->p2y + center->y; - arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p1x + center->x; - arc_path[idx++] = q_arc->p1y + center->y; - arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p0x + center->x; - arc_path[idx++] = q_arc->p0y + center->y; -#else - arc_path[idx++] = VLC_OP_CUBIC; - arc_path[idx++] = q_arc->p2x + center->x; - arc_path[idx++] = q_arc->p2y + center->y; - arc_path[idx++] = q_arc->p1x + center->x; - arc_path[idx++] = q_arc->p1y + center->y; - arc_path[idx++] = q_arc->p0x + center->x; - arc_path[idx++] = q_arc->p0y + center->y; -#endif - } - /* update index i n path array*/ - *pidx = idx; -} - -static void _add_arc_path(int32_t * arc_path, int * pidx, int32_t radius, - int32_t start_angle, int32_t end_angle, const lv_point_t * center, bool cw) -{ - /* set number of arcs to draw */ - vg_arc q_arc; - int32_t start_arc_angle = start_angle % 90; - int32_t end_arc_angle = end_angle % 90; - int32_t inv_start_arc_angle = (start_arc_angle > 0) ? (90 - start_arc_angle) : 0; - int32_t nbarc = (end_angle - start_angle - inv_start_arc_angle - end_arc_angle) / 90; - q_arc.rad = radius; - - /* handle special case of start & end point in the same quarter */ - if(((start_angle / 90) == (end_angle / 90)) && (nbarc <= 0)) { - q_arc.quarter = (start_angle / 90) % 4; - q_arc.angle = start_arc_angle; - _get_subarc_control_points(&q_arc, end_arc_angle - start_arc_angle); - _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); - return; - } - - if(cw) { - /* partial starting arc */ - if(start_arc_angle > 0) { - q_arc.quarter = (start_angle / 90) % 4; - q_arc.angle = start_arc_angle; - /* get cubic points relative to center */ - _get_arc_control_points(&q_arc, true); - /* put cubic points in arc_path */ - _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); - } - /* full arcs */ - for(int32_t q = 0; q < nbarc ; q++) { - q_arc.quarter = (q + ((start_angle + 89) / 90)) % 4; - q_arc.angle = 90; - /* get cubic points relative to center */ - _get_arc_control_points(&q_arc, true); /* 2nd parameter 'start' ignored */ - /* put cubic points in arc_path */ - _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); - } - /* partial ending arc */ - if(end_arc_angle > 0) { - q_arc.quarter = (end_angle / 90) % 4; - q_arc.angle = end_arc_angle; - /* get cubic points relative to center */ - _get_arc_control_points(&q_arc, false); - /* put cubic points in arc_path */ - _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); - } - - } - else { /* counter clockwise */ - - /* partial ending arc */ - if(end_arc_angle > 0) { - q_arc.quarter = (end_angle / 90) % 4; - q_arc.angle = end_arc_angle; - /* get cubic points relative to center */ - _get_arc_control_points(&q_arc, false); - /* put cubic points in arc_path */ - _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); - } - /* full arcs */ - for(int32_t q = nbarc - 1; q >= 0; q--) { - q_arc.quarter = (q + ((start_angle + 89) / 90)) % 4; - q_arc.angle = 90; - /* get cubic points relative to center */ - _get_arc_control_points(&q_arc, true); /* 2nd parameter 'start' ignored */ - /* put cubic points in arc_path */ - _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); - } - /* partial starting arc */ - if(start_arc_angle > 0) { - q_arc.quarter = (start_angle / 90) % 4; - q_arc.angle = start_arc_angle; - /* get cubic points relative to center */ - _get_arc_control_points(&q_arc, true); - /* put cubic points in arc_path */ - _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); - } - } -} - -static void _vglite_draw_arc(const lv_point_t * center, const lv_area_t * clip_area, - const lv_draw_arc_dsc_t * dsc) -{ - vg_lite_path_t path; - uint16_t start_angle = dsc->start_angle; - uint16_t end_angle = dsc->end_angle; - - /* be sure end_angle > start_angle */ - if(end_angle < start_angle) - end_angle += 360; - - bool donut = ((end_angle - start_angle) % 360 == 0) ? true : false; - vg_lite_buffer_t * vgbuf = vglite_get_dest_buf(); - - int32_t arc_path[ARC_PATH_DATA_MAX_SIZE]; - lv_memzero(arc_path, sizeof(arc_path)); - - /*** Init path ***/ - int32_t width = dsc->width; /* inner arc radius = outer arc radius - width */ - uint16_t radius = dsc->radius; - - if(width > radius) - width = radius; - - int pidx = 0; - int32_t cp_x, cp_y; /* control point coords */ - - /* first control point of curve */ - cp_x = radius; - cp_y = 0; - _rotate_point(start_angle, &cp_x, &cp_y); - arc_path[pidx++] = VLC_OP_MOVE; - arc_path[pidx++] = center->x + cp_x; - arc_path[pidx++] = center->y + cp_y; - - /* draw 1-5 outer quarters */ - _add_arc_path(arc_path, &pidx, radius, start_angle, end_angle, center, true); - - if(donut) { - /* close outer circle */ - cp_x = radius; - cp_y = 0; - _rotate_point(start_angle, &cp_x, &cp_y); - arc_path[pidx++] = VLC_OP_LINE; - arc_path[pidx++] = center->x + cp_x; - arc_path[pidx++] = center->y + cp_y; - /* start inner circle */ - cp_x = radius - width; - cp_y = 0; - _rotate_point(start_angle, &cp_x, &cp_y); - arc_path[pidx++] = VLC_OP_MOVE; - arc_path[pidx++] = center->x + cp_x; - arc_path[pidx++] = center->y + cp_y; - - } - else if(dsc->rounded != 0U) { /* 1st rounded arc ending */ - cp_x = radius - width / 2; - cp_y = 0; - _rotate_point(end_angle, &cp_x, &cp_y); - lv_point_t round_center = {center->x + cp_x, center->y + cp_y}; - _add_arc_path(arc_path, &pidx, width / 2, end_angle, (end_angle + 180), - &round_center, true); - - } - else { /* 1st flat ending */ - cp_x = radius - width; - cp_y = 0; - _rotate_point(end_angle, &cp_x, &cp_y); - arc_path[pidx++] = VLC_OP_LINE; - arc_path[pidx++] = center->x + cp_x; - arc_path[pidx++] = center->y + cp_y; - } - - /* draw 1-5 inner quarters */ - _add_arc_path(arc_path, &pidx, radius - width, start_angle, end_angle, center, false); - - /* last control point of curve */ - if(donut) { /* close the loop */ - cp_x = radius - width; - cp_y = 0; - _rotate_point(start_angle, &cp_x, &cp_y); - arc_path[pidx++] = VLC_OP_LINE; - arc_path[pidx++] = center->x + cp_x; - arc_path[pidx++] = center->y + cp_y; - - } - else if(dsc->rounded != 0U) { /* 2nd rounded arc ending */ - cp_x = radius - width / 2; - cp_y = 0; - _rotate_point(start_angle, &cp_x, &cp_y); - lv_point_t round_center = {center->x + cp_x, center->y + cp_y}; - _add_arc_path(arc_path, &pidx, width / 2, (start_angle + 180), (start_angle + 360), - &round_center, true); - - } - else { /* 2nd flat ending */ - cp_x = radius; - cp_y = 0; - _rotate_point(start_angle, &cp_x, &cp_y); - arc_path[pidx++] = VLC_OP_LINE; - arc_path[pidx++] = center->x + cp_x; - arc_path[pidx++] = center->y + cp_y; - } - - arc_path[pidx++] = VLC_OP_END; - - VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, (uint32_t)pidx * sizeof(int32_t), arc_path, - (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, - ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f)); - - lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); - vg_lite_color_t vgcol = vglite_get_color(col32, false); - - vg_lite_matrix_t matrix; - vg_lite_identity(&matrix); - - /*** Draw arc ***/ - VGLITE_CHECK_ERROR(vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol)); - - vglite_run(); - - VGLITE_CHECK_ERROR(vg_lite_clear_path(&path)); -} - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_border.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_border.c deleted file mode 100644 index db762fb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_border.c +++ /dev/null @@ -1,203 +0,0 @@ -/** - * @file lv_draw_vglite_border.c - * - */ - -/** - * Copyright 2022-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vglite.h" - -#if LV_USE_DRAW_VGLITE -#include "lv_vglite_buf.h" -#include "lv_vglite_path.h" -#include "lv_vglite_utils.h" - -#include - -/********************* - * DEFINES - *********************/ - -/********************* - * DEFINES - *********************/ - -/*** Define maximum numbers of rectangles needed to clip partial borders ***/ -#define MAX_NUM_RECTANGLES 4 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/** - * Draw rectangle border/outline shape with effects (rounded corners, opacity) - * - * @param[in] coords Coordinates of the rectangle border/outline (relative to dest buff) - * @param[in] clip_area Clip area with relative coordinates to dest buff - * @param[in] dsc Description of the rectangle border/outline - * - */ -static void _vglite_draw_border(const lv_area_t * coords, const lv_area_t * clip_area, - const lv_draw_border_dsc_t * dsc); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vglite_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, - const lv_area_t * coords) -{ - if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) - return; - if(dsc->width == 0) - return; - if(dsc->side == (lv_border_side_t)LV_BORDER_SIDE_NONE) - return; - - lv_layer_t * layer = draw_unit->target_layer; - lv_area_t inward_coords; - int32_t width = dsc->width; - - /* Move border inwards to align with software rendered border */ - inward_coords.x1 = coords->x1 + ceil(width / 2.0f); - inward_coords.x2 = coords->x2 - floor(width / 2.0f); - inward_coords.y1 = coords->y1 + ceil(width / 2.0f); - inward_coords.y2 = coords->y2 - floor(width / 2.0f); - - lv_area_move(&inward_coords, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_area_t clip_area; - lv_area_copy(&clip_area, draw_unit->clip_area); - lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_area_t clipped_coords; - if(!lv_area_intersect(&clipped_coords, &inward_coords, &clip_area)) - return; /*Fully clipped, nothing to do*/ - - _vglite_draw_border(&inward_coords, &clip_area, dsc); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void _vglite_draw_border(const lv_area_t * coords, const lv_area_t * clip_area, - const lv_draw_border_dsc_t * dsc) -{ - int32_t radius = dsc->radius; - vg_lite_buffer_t * vgbuf = vglite_get_dest_buf(); - - if(radius < 0) - return; - - int32_t border_half = (int32_t)floor(dsc->width / 2.0f); - if(radius > border_half) - radius = radius - border_half; - - vg_lite_cap_style_t cap_style = (radius) ? VG_LITE_CAP_ROUND : VG_LITE_CAP_BUTT; - vg_lite_join_style_t join_style = (radius) ? VG_LITE_JOIN_ROUND : VG_LITE_JOIN_MITER; - - /*** Init path ***/ - int32_t path_data[RECT_PATH_DATA_MAX_SIZE]; - uint32_t path_data_size; - vglite_create_rect_path_data(path_data, &path_data_size, radius, coords); - vg_lite_quality_t path_quality = radius > 0 ? VG_LITE_HIGH : VG_LITE_MEDIUM; - - vg_lite_path_t path; - VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, path_quality, path_data_size, path_data, - (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, - ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f)); - - lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); - vg_lite_color_t vgcol = vglite_get_color(col32, false); - - vg_lite_matrix_t matrix; - vg_lite_identity(&matrix); - - int32_t line_width = dsc->width; - lv_border_side_t border_side = dsc->side; - - if(border_side == LV_BORDER_SIDE_FULL) - border_side = LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_LEFT | LV_BORDER_SIDE_RIGHT; - - uint32_t num_rect = 0; - vg_lite_rectangle_t rect[MAX_NUM_RECTANGLES]; - int32_t rect_width = coords->x2 - coords->x1; - int32_t rect_height = coords->y2 - coords->y1; - int32_t shortest_side = LV_MIN(rect_width, rect_height); - int32_t final_radius = LV_MIN(radius, shortest_side / 2); - - if(border_side & LV_BORDER_SIDE_TOP) { - rect[num_rect].x = coords->x1 - ceil(line_width / 2.0f); - rect[num_rect].y = coords->y1 - ceil(line_width / 2.0f); - rect[num_rect].width = coords->x2 - coords->x1 + line_width; - rect[num_rect].height = final_radius + ceil(line_width / 2.0f); - num_rect++; - } - - if(border_side & LV_BORDER_SIDE_LEFT) { - rect[num_rect].x = coords->x1 - ceil(line_width / 2.0f); - rect[num_rect].y = coords->y1 - ceil(line_width / 2.0f); - rect[num_rect].width = final_radius + ceil(line_width / 2.0f); - rect[num_rect].height = coords->y2 - coords->y1 + line_width + 1; - num_rect++; - } - - if(border_side & LV_BORDER_SIDE_RIGHT) { - rect[num_rect].x = coords->x2 - final_radius + 1; - rect[num_rect].y = coords->y1 - ceil(line_width / 2.0f); - rect[num_rect].width = final_radius + ceil(line_width / 2.0f); - rect[num_rect].height = coords->y2 - coords->y1 + line_width + 1; - num_rect++; - } - - if(border_side & LV_BORDER_SIDE_BOTTOM) { - rect[num_rect].x = coords->x1 - ceil(line_width / 2.0f); - rect[num_rect].y = coords->y2 - final_radius + 1; - rect[num_rect].width = coords->x2 - coords->x1 + line_width; - rect[num_rect].height = final_radius + ceil(line_width / 2.0f); - num_rect++; - } - - /*** Enable scissor and apply scissor rects ***/ - VGLITE_CHECK_ERROR(vg_lite_enable_scissor()); - VGLITE_CHECK_ERROR(vg_lite_scissor_rects(vgbuf, num_rect, rect)); - - /*** Draw border ***/ - VGLITE_CHECK_ERROR(vg_lite_set_draw_path_type(&path, VG_LITE_DRAW_STROKE_PATH)); - - VGLITE_CHECK_ERROR(vg_lite_set_stroke(&path, cap_style, join_style, line_width, 8, NULL, 0, 0, vgcol)); - - VGLITE_CHECK_ERROR(vg_lite_update_stroke(&path)); - - VGLITE_CHECK_ERROR(vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol)); - - vglite_run(); - - VGLITE_CHECK_ERROR(vg_lite_clear_path(&path)); - - /*** Disable scissor ***/ - VGLITE_CHECK_ERROR(vg_lite_disable_scissor()); -} - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_fill.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_fill.c deleted file mode 100644 index 97089ce..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_fill.c +++ /dev/null @@ -1,237 +0,0 @@ -/** - * @file lv_draw_vglite_fill.c - * - */ - -/** - * Copyright 2020-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vglite.h" - -#if LV_USE_DRAW_VGLITE -#include "lv_vglite_buf.h" -#include "lv_vglite_path.h" -#include "lv_vglite_utils.h" - -#include "../../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/** - * Fill area, with optional opacity. - * - * @param[in] dest_area Area with relative coordinates of destination buffer - * @param[in] dsc Description of the area to fill (color, opa) - * - */ -static void _vglite_fill(const lv_area_t * dest_area, const lv_draw_fill_dsc_t * dsc); - -/** - * Draw rectangle background with effects (rounded corners, gradient) - * - * @param[in] coords Coordinates of the rectangle background (relative to dest buff) - * @param[in] clip_area Clip area with relative coordinates to dest buff - * @param[in] dsc Description of the rectangle background - * - */ -static void _vglite_draw_rect(const lv_area_t * coords, const lv_area_t * clip_area, - const lv_draw_fill_dsc_t * dsc); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vglite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, - const lv_area_t * coords) -{ - if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) - return; - - lv_layer_t * layer = draw_unit->target_layer; - lv_area_t relative_coords; - lv_area_copy(&relative_coords, coords); - lv_area_move(&relative_coords, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_area_t clip_area; - lv_area_copy(&clip_area, draw_unit->clip_area); - lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_area_t clipped_coords; - if(!lv_area_intersect(&clipped_coords, &relative_coords, &clip_area)) - return; /*Fully clipped, nothing to do*/ - - /* - * Most simple case: just a plain rectangle (no radius, no gradient) - */ - if((dsc->radius == 0) && (dsc->grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE)) - _vglite_fill(&clipped_coords, dsc); - else - _vglite_draw_rect(&relative_coords, &clip_area, dsc); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void _vglite_fill(const lv_area_t * dest_area, const lv_draw_fill_dsc_t * dsc) -{ - vg_lite_buffer_t * vgbuf = vglite_get_dest_buf(); - - lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); - vg_lite_color_t vgcol = vglite_get_color(col32, false); - - if(dsc->opa >= (lv_opa_t)LV_OPA_MAX) { /*Opaque fill*/ - vg_lite_rectangle_t rect = { - .x = dest_area->x1, - .y = dest_area->y1, - .width = lv_area_get_width(dest_area), - .height = lv_area_get_height(dest_area) - }; - - VGLITE_CHECK_ERROR(vg_lite_clear(vgbuf, &rect, vgcol)); - - vglite_run(); - } - else { /*fill with transparency*/ - - vg_lite_path_t path; - int32_t path_data[] = { /*VG rectangular path*/ - VLC_OP_MOVE, dest_area->x1, dest_area->y1, - VLC_OP_LINE, dest_area->x2 + 1, dest_area->y1, - VLC_OP_LINE, dest_area->x2 + 1, dest_area->y2 + 1, - VLC_OP_LINE, dest_area->x1, dest_area->y2 + 1, - VLC_OP_LINE, dest_area->x1, dest_area->y1, - VLC_OP_END - }; - - VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_MEDIUM, sizeof(path_data), path_data, - (vg_lite_float_t) dest_area->x1, (vg_lite_float_t) dest_area->y1, - ((vg_lite_float_t) dest_area->x2) + 1.0f, ((vg_lite_float_t) dest_area->y2) + 1.0f)); - - vg_lite_matrix_t matrix; - vg_lite_identity(&matrix); - - /*Draw rectangle*/ - VGLITE_CHECK_ERROR(vg_lite_draw(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol)); - - vglite_run(); - - VGLITE_CHECK_ERROR(vg_lite_clear_path(&path)); - } -} - -static void _vglite_draw_rect(const lv_area_t * coords, const lv_area_t * clip_area, - const lv_draw_fill_dsc_t * dsc) -{ - int32_t width = lv_area_get_width(coords); - int32_t height = lv_area_get_height(coords); - int32_t radius = dsc->radius; - lv_opa_t opa = dsc->opa; - vg_lite_buffer_t * vgbuf = vglite_get_dest_buf(); - - if(dsc->radius < 0) - return; - - /*** Init path ***/ - int32_t path_data[RECT_PATH_DATA_MAX_SIZE]; - uint32_t path_data_size; - vglite_create_rect_path_data(path_data, &path_data_size, radius, coords); - vg_lite_quality_t path_quality = dsc->radius > 0 ? VG_LITE_HIGH : VG_LITE_MEDIUM; - - vg_lite_path_t path; - VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, path_quality, path_data_size, path_data, - (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, - ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f)); - - vg_lite_matrix_t matrix; - vg_lite_identity(&matrix); - - /*** Init Color ***/ - lv_color32_t col32 = lv_color_to_32(dsc->color, opa); - vg_lite_color_t vgcol = vglite_get_color(col32, false); - - vg_lite_linear_gradient_t gradient; - bool has_gradient = (dsc->grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE); - - /*** Init Gradient ***/ - if(has_gradient) { - vg_lite_matrix_t * grad_matrix; - - vg_lite_uint32_t colors[LV_GRADIENT_MAX_STOPS]; - vg_lite_uint32_t stops[LV_GRADIENT_MAX_STOPS]; - lv_color32_t col32[LV_GRADIENT_MAX_STOPS]; - - /* Gradient setup */ - vg_lite_uint32_t cnt = LV_MAX(dsc->grad.stops_count, LV_GRADIENT_MAX_STOPS); - lv_opa_t opa; - - for(uint8_t i = 0; i < cnt; i++) { - stops[i] = dsc->grad.stops[i].frac; - - opa = LV_OPA_MIX2(dsc->grad.stops[i].opa, dsc->opa); - - col32[i] = lv_color_to_32(dsc->grad.stops[i].color, opa); - colors[i] = vglite_get_color(col32[i], true); - } - - lv_memzero(&gradient, sizeof(vg_lite_linear_gradient_t)); - - VGLITE_CHECK_ERROR(vg_lite_init_grad(&gradient)); - - VGLITE_CHECK_ERROR(vg_lite_set_grad(&gradient, cnt, colors, stops)); - - VGLITE_CHECK_ERROR(vg_lite_update_grad(&gradient)); - - grad_matrix = vg_lite_get_grad_matrix(&gradient); - vg_lite_identity(grad_matrix); - vg_lite_translate((float)coords->x1, (float)coords->y1, grad_matrix); - - if(dsc->grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_VER) { - vg_lite_scale(1.0f, (float)height / 256.0f, grad_matrix); - vg_lite_rotate(90.0f, grad_matrix); - } - else { /*LV_GRAD_DIR_HOR*/ - vg_lite_scale((float)width / 256.0f, 1.0f, grad_matrix); - } - - VGLITE_CHECK_ERROR(vg_lite_draw_gradient(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, &gradient, - VG_LITE_BLEND_SRC_OVER)); - } - else { - VGLITE_CHECK_ERROR(vg_lite_draw(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol)); - } - - vglite_run(); - - VGLITE_CHECK_ERROR(vg_lite_clear_path(&path)); - - if(has_gradient) - VGLITE_CHECK_ERROR(vg_lite_clear_grad(&gradient)); -} - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_img.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_img.c deleted file mode 100644 index 49fdffa..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_img.c +++ /dev/null @@ -1,443 +0,0 @@ -/** - * @file lv_draw_vglite_blend.c - * - */ - -/** - * Copyright 2020-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vglite.h" - -#if LV_USE_DRAW_VGLITE -#include "lv_vglite_buf.h" -#include "lv_vglite_matrix.h" -#include "lv_vglite_utils.h" -#include "lv_vglite_path.h" - -#include "../../../misc/lv_log.h" - -/********************* - * DEFINES - *********************/ - -#if LV_USE_VGLITE_BLIT_SPLIT -/** -* BLIT split threshold - BLITs with width or height higher than this value will -* be done in multiple steps. Value must be multiple of stride alignment in px. -* For most color formats the alignment is 16px (except the index formats). -*/ -#define VGLITE_BLIT_SPLIT_THR 352 - -/* Enable for logging debug traces. */ -#define VGLITE_LOG_TRACE 0 - -#if VGLITE_LOG_TRACE -#define VGLITE_TRACE(fmt, ...) \ - do { \ - LV_LOG(fmt, ##__VA_ARGS__); \ - } while (0) -#else -#define VGLITE_TRACE(fmt, ...) \ - do { \ - } while (0) -#endif -#endif /*LV_USE_VGLITE_BLIT_SPLIT*/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -#if LV_USE_VGLITE_BLIT_SPLIT -/** - * Move buffer pointer as close as possible to area, but with respect to alignment requirements. - * - * @param[in] buf Buffer address pointer - * @param[in] area Area with relative coordinates to the buffer - * @param[in] stride Stride of buffer in bytes - * @param[in] cf Color format of buffer - */ -static void _move_buf_close_to_area(void ** buf, lv_area_t * area, uint32_t stride, lv_color_format_t cf); - -/** - * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects. - * By default, image is copied directly, with optional opacity. - * - * @param dest_buf Destination buffer - * @param[in] dest_area Destination area with relative coordinates to dest buffer - * @param[in] dest_stride Stride of destination buffer in bytes - * @param[in] dest_cf Color format of destination buffer - * @param[in] src_buf Source buffer - * @param[in] src_area Source area with relative coordinates to src buffer - * @param[in] src_stride Stride of source buffer in bytes - * @param[in] src_cf Color format of source buffer - * @param[in] dsc Image descriptor - * - */ -static void _vglite_blit_split(void * dest_buf, lv_area_t * dest_area, uint32_t dest_stride, lv_color_format_t dest_cf, - const void * src_buf, lv_area_t * src_area, uint32_t src_stride, lv_color_format_t src_cf, - const lv_draw_image_dsc_t * dsc); -#endif /*LV_USE_VGLITE_BLIT_SPLIT*/ - -/** - * VGlite blit - fill a path with an image pattern - * - * - * @param[in] dest_area Destination area with relative coordinates to dest buffer - * @param[in] clip_area Clip area with relative coordinates to dest buff - * @param[in] coords Coordinates of the image (relative to dest buff) - * @param[in] dsc Image descriptor - * - */ -static void _vglite_draw_pattern(const lv_area_t * clip_area, const lv_area_t * coords, - const lv_draw_image_dsc_t * dsc); - -/** - * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with or without effects. - * - * @param[in] src_area Source area with relative coordinates to src buffer - * @param[in] dsc Image descriptor - * - */ -static void _vglite_blit(const lv_area_t * src_area, const lv_draw_image_dsc_t * dsc); - -static vg_lite_color_t _vglite_recolor(const lv_draw_image_dsc_t * dsc); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vglite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, - const lv_area_t * coords) -{ - if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) - return; - - lv_layer_t * layer = draw_unit->target_layer; - const lv_image_dsc_t * img_dsc = dsc->src; - - lv_area_t relative_coords; - lv_area_copy(&relative_coords, coords); - lv_area_move(&relative_coords, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_area_t clip_area; - lv_area_copy(&clip_area, draw_unit->clip_area); - lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_area_t blend_area; - bool has_transform = (dsc->rotation != 0 || dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); - if(has_transform) - lv_area_copy(&blend_area, &relative_coords); - else if(!lv_area_intersect(&blend_area, &relative_coords, &clip_area)) - return; /*Fully clipped, nothing to do*/ - - const void * src_buf = img_dsc->data; - - lv_area_t src_area; - src_area.x1 = blend_area.x1 - (coords->x1 - layer->buf_area.x1); - src_area.y1 = blend_area.y1 - (coords->y1 - layer->buf_area.y1); - src_area.x2 = img_dsc->header.w - 1; - src_area.y2 = img_dsc->header.h - 1; - - lv_color_format_t src_cf = img_dsc->header.cf; - uint32_t src_stride = img_dsc->header.stride; - - /* Set src_vgbuf structure. */ - vglite_set_src_buf(src_buf, img_dsc->header.w, img_dsc->header.h, src_stride, src_cf); - -#if LV_USE_VGLITE_BLIT_SPLIT - void * dest_buf = layer->draw_buf->data; - uint32_t dest_stride = layer->draw_buf->header.stride; - lv_color_format_t dest_cf = layer->draw_buf->header.cf; - - if(!has_transform) - _vglite_blit_split(dest_buf, &blend_area, dest_stride, dest_cf, - src_buf, &src_area, src_stride, src_cf, dsc); -#else - vglite_set_transformation_matrix(&blend_area, dsc); - bool is_tiled = dsc->tile; - if(is_tiled) - _vglite_draw_pattern(&clip_area, &relative_coords, dsc); - else - _vglite_blit(&src_area, dsc); -#endif /*LV_USE_VGLITE_BLIT_SPLIT*/ -} - -/********************** - * STATIC FUNCTIONS - **********************/ -static void _vglite_blit(const lv_area_t * src_area, const lv_draw_image_dsc_t * dsc) -{ - vg_lite_buffer_t * dst_vgbuf = vglite_get_dest_buf(); - vg_lite_buffer_t * src_vgbuf = vglite_get_src_buf(); - - vg_lite_rectangle_t rect = { - .x = (vg_lite_int32_t)src_area->x1, - .y = (vg_lite_int32_t)src_area->y1, - .width = (vg_lite_int32_t)lv_area_get_width(src_area), - .height = (vg_lite_int32_t)lv_area_get_height(src_area) - }; - - src_vgbuf->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; - src_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT; - - vg_lite_color_t vgcol = _vglite_recolor(dsc); - - vg_lite_matrix_t * vgmatrix = vglite_get_matrix(); - vg_lite_blend_t vgblend = vglite_get_blend_mode(dsc->blend_mode); - - VGLITE_CHECK_ERROR(vg_lite_blit_rect(dst_vgbuf, src_vgbuf, &rect, vgmatrix, vgblend, vgcol, VG_LITE_FILTER_POINT)); - - vglite_run(); -} - -#if LV_USE_VGLITE_BLIT_SPLIT -static void _move_buf_close_to_area(void ** buf, lv_area_t * area, uint32_t stride, lv_color_format_t cf) -{ - uint8_t ** buf_u8 = (uint8_t **)buf; - uint8_t align_bytes = vglite_get_stride_alignment(cf); - uint8_t bits_per_pixel = lv_color_format_get_bpp(cf); - - uint16_t align_pixels = align_bytes * 8 / bits_per_pixel; - - if(area->x1 >= (int32_t)(area->x1 % align_pixels)) { - uint16_t shift_x = area->x1 - (area->x1 % align_pixels); - - area->x1 -= shift_x; - area->x2 -= shift_x; - *buf_u8 += (shift_x * bits_per_pixel) / 8; - } - - if(area->y1) { - uint16_t shift_y = area->y1; - - area->y1 -= shift_y; - area->y2 -= shift_y; - *buf_u8 += shift_y * stride; - } -} - -static void _vglite_blit_split(void * dest_buf, lv_area_t * dest_area, uint32_t dest_stride, lv_color_format_t dest_cf, - const void * src_buf, lv_area_t * src_area, uint32_t src_stride, lv_color_format_t src_cf, - const lv_draw_image_dsc_t * dsc) -{ - VGLITE_TRACE("Blit " - "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " - "Size: ([%dx%d] -> [%dx%d]) | " - "Addr: (0x%x -> 0x%x)", - src_area->x1, src_area->y1, src_area->x2, src_area->y2, - dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2, - lv_area_get_width(src_area), lv_area_get_height(src_area), - lv_area_get_width(dest_area), lv_area_get_height(dest_area), - (uintptr_t)src_buf, (uintptr_t)dest_buf); - - /* Move starting pointers as close as possible to [x1, y1], so coordinates are as small as possible */ - _move_buf_close_to_area((void **)&src_buf, src_area, src_stride, src_cf); - _move_buf_close_to_area(&dest_buf, dest_area, dest_stride, dest_cf); - - /* Set clip area */ - vglite_set_scissor(dest_area); - - /* If we're in limit, do a single BLIT */ - if((src_area->x2 < VGLITE_BLIT_SPLIT_THR) && - (src_area->y2 < VGLITE_BLIT_SPLIT_THR)) { - - /* Set new dest_vgbuf and src_vgbuf memory addresses */ - vglite_set_dest_buf_ptr(dest_buf); - vglite_set_src_buf_ptr(src_buf); - - vglite_set_transformation_matrix(dest_area, dsc); - _vglite_blit(src_area, dsc); - - VGLITE_TRACE("Single " - "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " - "Size: ([%dx%d] -> [%dx%d]) | " - "Addr: (0x%x -> 0x%x)", - src_area->x1, src_area->y1, src_area->x2, src_area->y2, - dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2, - lv_area_get_width(src_area), lv_area_get_height(src_area), - lv_area_get_width(dest_area), lv_area_get_height(dest_area), - (uintptr_t)src_buf, (uintptr_t)dest_buf); - - return; - }; - - /* Split the BLIT into multiple tiles */ - VGLITE_TRACE("Split " - "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " - "Size: ([%dx%d] -> [%dx%d]) | " - "Addr: (0x%x -> 0x%x)", - src_area->x1, src_area->y1, src_area->x2, src_area->y2, - dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2, - lv_area_get_width(src_area), lv_area_get_height(src_area), - lv_area_get_width(dest_area), lv_area_get_height(dest_area), - (uintptr_t)src_buf, (uintptr_t)dest_buf); - - int32_t width = LV_MIN(lv_area_get_width(src_area), lv_area_get_width(dest_area)); - int32_t height = LV_MIN(lv_area_get_height(src_area), lv_area_get_height(dest_area)); - - /* Number of tiles needed */ - uint8_t total_tiles_x = (src_area->x1 + width + VGLITE_BLIT_SPLIT_THR - 1) / - VGLITE_BLIT_SPLIT_THR; - uint8_t total_tiles_y = (src_area->y1 + height + VGLITE_BLIT_SPLIT_THR - 1) / - VGLITE_BLIT_SPLIT_THR; - - uint16_t shift_src_x = src_area->x1; - uint16_t shift_dest_x = dest_area->x1; - - VGLITE_TRACE("X shift: src: %d, dst: %d", shift_src_x, shift_dest_x); - - uint8_t * tile_dest_buf; - lv_area_t tile_dest_area; - const uint8_t * tile_src_buf; - lv_area_t tile_src_area; - - for(uint8_t y = 0; y < total_tiles_y; y++) { - /* y1 always start from 0 */ - tile_src_area.y1 = 0; - - /* Calculate y2 coordinates */ - if(y < total_tiles_y - 1) - tile_src_area.y2 = VGLITE_BLIT_SPLIT_THR - 1; - else - tile_src_area.y2 = height - y * VGLITE_BLIT_SPLIT_THR - 1; - - /* No vertical shift, dest y is always in sync with src y */ - tile_dest_area.y1 = tile_src_area.y1; - tile_dest_area.y2 = tile_src_area.y2; - - /* Advance start pointer for every tile, except the first column (y = 0) */ - tile_src_buf = (uint8_t *)src_buf + y * VGLITE_BLIT_SPLIT_THR * src_stride; - tile_dest_buf = (uint8_t *)dest_buf + y * VGLITE_BLIT_SPLIT_THR * dest_stride; - - for(uint8_t x = 0; x < total_tiles_x; x++) { - /* x1 always start from the same shift */ - tile_src_area.x1 = shift_src_x; - tile_dest_area.x1 = shift_dest_x; - if(x > 0) { - /* Advance start pointer for every tile, except the first raw (x = 0) */ - tile_src_buf += VGLITE_BLIT_SPLIT_THR * lv_color_format_get_bpp(src_cf) / 8; - tile_dest_buf += VGLITE_BLIT_SPLIT_THR * lv_color_format_get_bpp(dest_cf) / 8; - } - - /* Calculate x2 coordinates */ - if(x < total_tiles_x - 1) - tile_src_area.x2 = VGLITE_BLIT_SPLIT_THR - 1; - else - tile_src_area.x2 = width - x * VGLITE_BLIT_SPLIT_THR - 1; - - tile_dest_area.x2 = tile_src_area.x2; - - /* Shift x2 coordinates */ - tile_src_area.x2 += shift_src_x; - tile_dest_area.x2 += shift_dest_x; - - /* Set new dest_vgbuf and src_vgbuf memory addresses */ - vglite_set_dest_buf_ptr(tile_dest_buf); - vglite_set_src_buf_ptr(tile_src_buf); - - vglite_set_transformation_matrix(&tile_dest_area, dsc); - _vglite_blit(&tile_src_area, dsc); - - VGLITE_TRACE("Tile [%d, %d] " - "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " - "Size: ([%dx%d] -> [%dx%d]) | " - "Addr: (0x%x -> 0x%x)", - x, y, - tile_src_area.x1, tile_src_area.y1, tile_src_area.x2, tile_src_area.y2, - tile_dest_area.x1, tile_dest_area.y1, tile_dest_area.x2, tile_dest_area.y2, - lv_area_get_width(&tile_src_area), lv_area_get_height(&tile_src_area), - lv_area_get_width(&tile_dest_area), lv_area_get_height(&tile_dest_area), - (uintptr_t)tile_src_buf, (uintptr_t)tile_dest_buf); - } - } -} -#endif /*LV_USE_VGLITE_BLIT_SPLIT*/ - -static void _vglite_draw_pattern(const lv_area_t * clip_area, const lv_area_t * coords, - const lv_draw_image_dsc_t * dsc) -{ - /* Target buffer */ - vg_lite_buffer_t * dst_vgbuf = vglite_get_dest_buf(); - - /* Path to draw */ - int32_t path_data[RECT_PATH_DATA_MAX_SIZE]; - uint32_t path_data_size; - vglite_create_rect_path_data(path_data, &path_data_size, dsc->clip_radius, coords); - vg_lite_quality_t path_quality = VG_LITE_MEDIUM; - - vg_lite_path_t path; - VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, path_quality, path_data_size, path_data, - (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, - ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f)); - - /* Path Matrix */ - vg_lite_matrix_t path_matrix; - vg_lite_identity(&path_matrix); - - /* Pattern Image */ - vg_lite_buffer_t * src_vgbuf = vglite_get_src_buf(); - src_vgbuf->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; - src_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT; - - /* Pattern matrix */ - vg_lite_matrix_t vgmatrix; - vg_lite_identity(&vgmatrix); - vg_lite_translate((vg_lite_float_t)dsc->image_area.x1, (vg_lite_float_t)dsc->image_area.y1, &vgmatrix); - - /* Blend mode */ - vg_lite_blend_t vgblend = vglite_get_blend_mode(dsc->blend_mode); - - vg_lite_color_t vgcol = _vglite_recolor(dsc); - - /* Filter */ - bool has_transform = (dsc->rotation != 0 || dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); - vg_lite_filter_t filter = has_transform ? VG_LITE_FILTER_BI_LINEAR : VG_LITE_FILTER_POINT; - - /* Draw Pattern */ - VGLITE_CHECK_ERROR(vg_lite_draw_pattern(dst_vgbuf, &path, VG_LITE_FILL_NON_ZERO, &path_matrix, - src_vgbuf, &vgmatrix, vgblend, VG_LITE_PATTERN_REPEAT, - 0, vgcol, filter)); -} - -static vg_lite_color_t _vglite_recolor(const lv_draw_image_dsc_t * dsc) -{ - lv_color_t color; - lv_opa_t opa; - - bool has_recolor = (dsc->recolor_opa > LV_OPA_MIN); - if(has_recolor) { - color = dsc->recolor; - opa = LV_OPA_MIX2(dsc->recolor_opa, dsc->opa); - } - else { - color.red = 0xFF; - color.green = 0xFF; - color.blue = 0xFF; - opa = dsc->opa; - } - - lv_color32_t col32 = lv_color_to_32(color, opa); - - return vglite_get_color(col32, false); -} - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_label.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_label.c deleted file mode 100644 index 9af7c68..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_label.c +++ /dev/null @@ -1,180 +0,0 @@ -/** - * @file lv_draw_vglite_label.c - * - */ - -/** - * Copyright 2023-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vglite.h" - -#if LV_USE_DRAW_VGLITE -#include "lv_vglite_buf.h" -#include "lv_vglite_matrix.h" -#include "lv_vglite_utils.h" - -#include "../../lv_draw_label_private.h" -#include "../../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void _draw_vglite_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, - lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); - -/** - * Draw letter (character bitmap blend) with optional color and opacity - * - * @param[in] mask_area Mask area with relative coordinates of source buffer - * @param[in] color Color - * @param[in] opa Opacity - * - */ -static void _vglite_draw_letter(const lv_area_t * mask_area, lv_color_t color, lv_opa_t opa); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vglite_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, - const lv_area_t * coords) -{ - if(dsc->opa <= LV_OPA_MIN) return; - - lv_draw_label_iterate_characters(draw_unit, dsc, coords, _draw_vglite_letter); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void _draw_vglite_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, - lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) -{ - if(glyph_draw_dsc) { - switch(glyph_draw_dsc->format) { - - case LV_FONT_GLYPH_FORMAT_NONE: { -#if LV_USE_FONT_PLACEHOLDER - /* Draw a placeholder rectangle*/ - lv_draw_border_dsc_t border_draw_dsc; - lv_draw_border_dsc_init(&border_draw_dsc); - border_draw_dsc.opa = glyph_draw_dsc->opa; - border_draw_dsc.color = glyph_draw_dsc->color; - border_draw_dsc.width = 1; - lv_draw_vglite_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords); -#endif - } - break; - case LV_FONT_GLYPH_FORMAT_A1 ... LV_FONT_GLYPH_FORMAT_A8: { - /*Do not draw transparent things*/ - if(glyph_draw_dsc->opa <= LV_OPA_MIN) - return; - - lv_layer_t * layer = draw_unit->target_layer; - - lv_area_t blend_area; - if(!lv_area_intersect(&blend_area, glyph_draw_dsc->letter_coords, draw_unit->clip_area)) - return; - lv_area_move(&blend_area, -layer->buf_area.x1, -layer->buf_area.y1); - - const lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data; - const void * mask_buf = draw_buf->data; - - uint32_t mask_width = lv_area_get_width(glyph_draw_dsc->letter_coords); - uint32_t mask_height = lv_area_get_height(glyph_draw_dsc->letter_coords); - uint32_t mask_stride = draw_buf->header.stride; - - lv_area_t mask_area; - mask_area.x1 = blend_area.x1 - (glyph_draw_dsc->letter_coords->x1 - layer->buf_area.x1); - mask_area.y1 = blend_area.y1 - (glyph_draw_dsc->letter_coords->y1 - layer->buf_area.y1); - mask_area.x2 = mask_width - 1; - mask_area.y2 = mask_height - 1; - - /* Set src_vgbuf structure. */ - vglite_set_src_buf(mask_buf, mask_width, mask_height, mask_stride, LV_COLOR_FORMAT_A8); - - /* Set vgmatrix. */ - vglite_set_translation_matrix(&blend_area); - - lv_draw_buf_invalidate_cache(draw_buf, &mask_area); - - _vglite_draw_letter(&mask_area, glyph_draw_dsc->color, glyph_draw_dsc->opa); - } - break; - case LV_FONT_GLYPH_FORMAT_IMAGE: { -#if LV_USE_IMGFONT - lv_draw_image_dsc_t img_dsc; - lv_draw_image_dsc_init(&img_dsc); - img_dsc.opa = glyph_draw_dsc->opa; - img_dsc.src = glyph_draw_dsc->glyph_data; - lv_draw_vglite_img(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords); -#endif - } - break; - default: - break; - } - } - - if(fill_draw_dsc && fill_area) { - lv_draw_vglite_fill(draw_unit, fill_draw_dsc, fill_area); - } -} - -static void _vglite_draw_letter(const lv_area_t * mask_area, lv_color_t color, lv_opa_t opa) -{ - vg_lite_buffer_t * dst_vgbuf = vglite_get_dest_buf(); - vg_lite_buffer_t * mask_vgbuf = vglite_get_src_buf(); - - mask_vgbuf->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; - mask_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT; - - vg_lite_rectangle_t rect = { - .x = (vg_lite_int32_t)mask_area->x1, - .y = (vg_lite_int32_t)mask_area->y1, - .width = (vg_lite_int32_t)lv_area_get_width(mask_area), - .height = (vg_lite_int32_t)lv_area_get_height(mask_area) - }; - - lv_color32_t col32 = lv_color_to_32(color, opa); - vg_lite_color_t vgcol = vglite_get_color(col32, false); - - vg_lite_matrix_t * vgmatrix = vglite_get_matrix(); - - /*Blit with font color as paint color*/ - VGLITE_CHECK_ERROR(vg_lite_blit_rect(dst_vgbuf, mask_vgbuf, &rect, vgmatrix, VG_LITE_BLEND_SRC_OVER, vgcol, - VG_LITE_FILTER_POINT)); - - vglite_run(); -} - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_layer.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_layer.c deleted file mode 100644 index ce3f59e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_layer.c +++ /dev/null @@ -1,157 +0,0 @@ -/** - * @file lv_draw_vglite_layer.c - * - */ - -/** - * Copyright 2023-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vglite.h" - -#if LV_USE_DRAW_VGLITE - -#include "../../../stdlib/lv_string.h" -#include "../../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -#define _draw_info LV_GLOBAL_DEFAULT()->draw_info - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vglite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords) -{ - lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; - const lv_draw_buf_t * draw_buf = layer_to_draw->draw_buf; - - /* It can happen that nothing was draw on a layer and therefore its buffer is not allocated. - * In this case just return. - */ - if(draw_buf == NULL) - return; - - if(_draw_info.unit_cnt > 1) { - const lv_area_t area_to_draw = { - .x1 = 0, - .y1 = 0, - .x2 = draw_buf->header.w - 1, - .y2 = draw_buf->header.h - 1 - }; - lv_draw_buf_invalidate_cache(draw_buf, &area_to_draw); - } - - lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; - new_draw_dsc.src = draw_buf; - lv_draw_vglite_img(draw_unit, &new_draw_dsc, coords); - -#if LV_USE_LAYER_DEBUG || LV_USE_PARALLEL_DRAW_DEBUG - lv_area_t area_rot; - lv_area_copy(&area_rot, coords); - bool has_transform = (draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || - draw_dsc->scale_y != LV_SCALE_NONE); - - if(has_transform) { - int32_t w = lv_area_get_width(coords); - int32_t h = lv_area_get_height(coords); - - lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, - &draw_dsc->pivot); - - area_rot.x1 += coords->x1; - area_rot.y1 += coords->y1; - area_rot.x2 += coords->x1; - area_rot.y2 += coords->y1; - } - lv_area_t draw_area; - if(!lv_area_intersect(&draw_area, &area_rot, draw_unit->clip_area)) return; -#endif - -#if LV_USE_LAYER_DEBUG - lv_draw_fill_dsc_t fill_dsc; - lv_draw_fill_dsc_init(&fill_dsc); - fill_dsc.color = lv_color_hex(layer_to_draw->color_format == LV_COLOR_FORMAT_ARGB8888 ? 0xff0000 : 0x00ff00); - fill_dsc.opa = LV_OPA_20; - lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); - - lv_draw_border_dsc_t border_dsc; - lv_draw_border_dsc_init(&border_dsc); - border_dsc.color = fill_dsc.color; - border_dsc.opa = LV_OPA_60; - border_dsc.width = 2; - lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); - -#endif - -#if LV_USE_PARALLEL_DRAW_DEBUG - uint32_t idx = 0; - lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head; - while(draw_unit_tmp != draw_unit) { - draw_unit_tmp = draw_unit_tmp->next; - idx++; - } - - lv_draw_fill_dsc_t fill_dsc; - lv_draw_rect_dsc_init(&fill_dsc); - fill_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); - fill_dsc.opa = LV_OPA_10; - lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); - - lv_draw_border_dsc_t border_dsc; - lv_draw_border_dsc_init(&border_dsc); - border_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); - border_dsc.opa = LV_OPA_100; - border_dsc.width = 2; - lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); - - lv_point_t txt_size; - lv_text_get_size(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); - - lv_area_t txt_area; - txt_area.x1 = draw_area.x1; - txt_area.x2 = draw_area.x1 + txt_size.x - 1; - txt_area.y2 = draw_area.y2; - txt_area.y1 = draw_area.y2 - txt_size.y + 1; - - lv_draw_fill_dsc_init(&fill_dsc); - fill_dsc.color = lv_color_black(); - lv_draw_sw_fill(draw_unit, &fill_dsc, &txt_area); - - char buf[8]; - lv_snprintf(buf, sizeof(buf), "%d", idx); - lv_draw_label_dsc_t label_dsc; - lv_draw_label_dsc_init(&label_dsc); - label_dsc.color = lv_color_white(); - label_dsc.text = buf; - lv_draw_sw_label(draw_unit, &label_dsc, &txt_area); -#endif -} - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_line.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_line.c deleted file mode 100644 index f70c02b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_line.c +++ /dev/null @@ -1,145 +0,0 @@ -/** - * @file lv_draw_vglite_line.c - * - */ - -/** - * Copyright 2022-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vglite.h" - -#if LV_USE_DRAW_VGLITE -#include "lv_vglite_buf.h" -#include "lv_vglite_utils.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/** - * Draw line shape with effects - * - * @param[in] point1 Starting point with relative coordinates - * @param[in] point2 Ending point with relative coordinates - * @param[in] clip_area Clip area with relative coordinates to dest buff - * @param[in] dsc Line description structure (width, rounded ending, opacity, ...) - * - */ -static void _vglite_draw_line(const lv_point_t * point1, const lv_point_t * point2, - const lv_area_t * clip_area, const lv_draw_line_dsc_t * dsc); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vglite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) -{ - if(dsc->width == 0) - return; - if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) - return; - if(dsc->p1.x == dsc->p2.x && dsc->p1.y == dsc->p2.y) - return; - - lv_layer_t * layer = draw_unit->target_layer; - lv_area_t clip_area; - clip_area.x1 = LV_MIN(dsc->p1.x, dsc->p2.x) - dsc->width / 2; - clip_area.x2 = LV_MAX(dsc->p1.x, dsc->p2.x) + dsc->width / 2; - clip_area.y1 = LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width / 2; - clip_area.y2 = LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width / 2; - - if(!lv_area_intersect(&clip_area, &clip_area, draw_unit->clip_area)) - return; /*Fully clipped, nothing to do*/ - - lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_point_t point1 = {dsc->p1.x - layer->buf_area.x1, dsc->p1.y - layer->buf_area.y1}; - lv_point_t point2 = {dsc->p2.x - layer->buf_area.x1, dsc->p2.y - layer->buf_area.y1}; - - _vglite_draw_line(&point1, &point2, &clip_area, dsc); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void _vglite_draw_line(const lv_point_t * point1, const lv_point_t * point2, - const lv_area_t * clip_area, const lv_draw_line_dsc_t * dsc) -{ - vg_lite_path_t path; - vg_lite_buffer_t * vgbuf = vglite_get_dest_buf(); - vg_lite_cap_style_t cap_style = (dsc->round_start || dsc->round_end) ? VG_LITE_CAP_ROUND : VG_LITE_CAP_BUTT; - vg_lite_join_style_t join_style = (dsc->round_start || dsc->round_end) ? VG_LITE_JOIN_ROUND : VG_LITE_JOIN_MITER; - - bool is_dashed = (dsc->dash_width && dsc->dash_gap); - - vg_lite_float_t stroke_dash_pattern[2] = {0, 0}; - uint32_t stroke_dash_count = 0; - vg_lite_float_t stroke_dash_phase = 0; - if(is_dashed) { - stroke_dash_pattern[0] = (vg_lite_float_t)dsc->dash_width; - stroke_dash_pattern[1] = (vg_lite_float_t)dsc->dash_gap; - stroke_dash_count = sizeof(stroke_dash_pattern) / sizeof(vg_lite_float_t); - stroke_dash_phase = (vg_lite_float_t)dsc->dash_width / 2; - } - - vg_lite_blend_t vgblend = vglite_get_blend_mode(dsc->blend_mode); - - /*** Init path ***/ - int32_t width = dsc->width; - - int32_t line_path[] = { /*VG line path*/ - VLC_OP_MOVE, point1->x, point1->y, - VLC_OP_LINE, point2->x, point2->y, - VLC_OP_END - }; - - VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(line_path), line_path, - (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, - ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f)); - - lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); - vg_lite_color_t vgcol = vglite_get_color(col32, false); - - vg_lite_matrix_t matrix; - vg_lite_identity(&matrix); - - /*** Draw line ***/ - VGLITE_CHECK_ERROR(vg_lite_set_draw_path_type(&path, VG_LITE_DRAW_STROKE_PATH)); - - VGLITE_CHECK_ERROR(vg_lite_set_stroke(&path, cap_style, join_style, width, 8, stroke_dash_pattern, stroke_dash_count, - stroke_dash_phase, vgcol)); - - VGLITE_CHECK_ERROR(vg_lite_update_stroke(&path)); - - VGLITE_CHECK_ERROR(vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, vgblend, vgcol)); - - vglite_run(); - - VGLITE_CHECK_ERROR(vg_lite_clear_path(&path)); -} - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_triangle.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_triangle.c deleted file mode 100644 index 8556fdf..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_draw_vglite_triangle.c +++ /dev/null @@ -1,182 +0,0 @@ -/** - * @file lv_draw_vglite_triangle.c - * - */ - -/** - * Copyright 2023-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vglite.h" - -#if LV_USE_DRAW_VGLITE -#include "lv_vglite_buf.h" -#include "lv_vglite_path.h" -#include "lv_vglite_utils.h" - -#include "../../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/** - * Draw triangle shape with effects (opacity, gradient) - * - * @param[in] coords Coordinates of the triangle (relative to dest buff) - * @param[in] clip_area Clipping area with relative coordinates to dest buff - * @param[in] dsc Description of the triangle - * - */ -static void _vglite_draw_triangle(const lv_area_t * coords, const lv_area_t * clip_area, - const lv_draw_triangle_dsc_t * dsc); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vglite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc) -{ - if(dsc->bg_opa <= (lv_opa_t)LV_OPA_MIN) - return; - - lv_layer_t * layer = draw_unit->target_layer; - lv_area_t clip_area; - lv_area_copy(&clip_area, draw_unit->clip_area); - lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_area_t coords; - coords.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); - coords.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); - coords.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); - coords.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); - - lv_area_move(&coords, -layer->buf_area.x1, -layer->buf_area.y1); - - lv_area_t clipped_coords; - if(!lv_area_intersect(&clipped_coords, &coords, &clip_area)) - return; /* Fully clipped, nothing to do */ - - _vglite_draw_triangle(&coords, &clip_area, dsc); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void _vglite_draw_triangle(const lv_area_t * coords, const lv_area_t * clip_area, - const lv_draw_triangle_dsc_t * dsc) -{ - vg_lite_buffer_t * vgbuf = vglite_get_dest_buf(); - - lv_area_t tri_area; - tri_area.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); - tri_area.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); - tri_area.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); - tri_area.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); - - uint32_t width = lv_area_get_width(&tri_area); - uint32_t height = lv_area_get_height(&tri_area); - - /* Init path */ - int32_t triangle_path[] = { /*VG line path*/ - VLC_OP_MOVE, dsc->p[0].x, dsc->p[0].y, - VLC_OP_LINE, dsc->p[1].x, dsc->p[1].y, - VLC_OP_LINE, dsc->p[2].x, dsc->p[2].y, - VLC_OP_LINE, dsc->p[0].x, dsc->p[0].y, - VLC_OP_END - }; - - vg_lite_path_t path; - VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(triangle_path), triangle_path, - (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, - ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f)); - - vg_lite_matrix_t matrix; - vg_lite_identity(&matrix); - - /* Init Color */ - lv_color32_t col32 = lv_color_to_32(dsc->bg_color, dsc->bg_opa); - vg_lite_color_t vgcol = vglite_get_color(col32, false); - - vg_lite_linear_gradient_t gradient; - bool has_gradient = (dsc->bg_grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE); - - /* Init Gradient*/ - if(has_gradient) { - vg_lite_matrix_t * grad_matrix; - - vg_lite_uint32_t colors[LV_GRADIENT_MAX_STOPS]; - vg_lite_uint32_t stops[LV_GRADIENT_MAX_STOPS]; - lv_color32_t col32[LV_GRADIENT_MAX_STOPS]; - - /* Gradient Setup */ - vg_lite_uint32_t cnt = LV_MAX(dsc->bg_grad.stops_count, LV_GRADIENT_MAX_STOPS); - lv_opa_t bg_opa; - - for(uint8_t i = 0; i < cnt; i++) { - stops[i] = dsc->bg_grad.stops[i].frac; - bg_opa = LV_OPA_MIX2(dsc->bg_grad.stops[i].opa, dsc->bg_opa); - - col32[i] = lv_color_to_32(dsc->bg_grad.stops[i].color, bg_opa); - colors[i] = vglite_get_color(col32[i], true); - } - - lv_memzero(&gradient, sizeof(vg_lite_linear_gradient_t)); - - VGLITE_CHECK_ERROR(vg_lite_init_grad(&gradient)); - - VGLITE_CHECK_ERROR(vg_lite_set_grad(&gradient, cnt, colors, stops)); - - VGLITE_CHECK_ERROR(vg_lite_update_grad(&gradient)); - - grad_matrix = vg_lite_get_grad_matrix(&gradient); - vg_lite_identity(grad_matrix); - vg_lite_translate((float)coords->x1, (float)coords->y1, grad_matrix); - - if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_VER) { - vg_lite_scale(1.0f, (float)height / 256.0f, grad_matrix); - vg_lite_rotate(90.0f, grad_matrix); - } - else { /*LV_GRAD_DIR_HOR*/ - vg_lite_scale((float)width / 256.0f, 1.0f, grad_matrix); - } - - VGLITE_CHECK_ERROR(vg_lite_draw_gradient(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, &gradient, - VG_LITE_BLEND_SRC_OVER)); - } - else { - VGLITE_CHECK_ERROR(vg_lite_draw(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol)); - } - - vglite_run(); - - VGLITE_CHECK_ERROR(vg_lite_clear_path(&path)); - - if(has_gradient) - VGLITE_CHECK_ERROR(vg_lite_clear_grad(&gradient)); -} - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_buf.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_buf.c deleted file mode 100644 index a72c8e5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_buf.c +++ /dev/null @@ -1,116 +0,0 @@ -/** - * @file lv_vglite_buf.c - * - */ - -/** - * Copyright 2023 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_vglite_buf.h" - -#if LV_USE_DRAW_VGLITE -#include "lv_vglite_utils.h" - -#include "../../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static inline void _set_vgbuf_ptr(vg_lite_buffer_t * vgbuf, void * buf); - -/********************** - * STATIC VARIABLES - **********************/ - -static vg_lite_buffer_t _dest_vgbuf; -static vg_lite_buffer_t _src_vgbuf; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -vg_lite_buffer_t * vglite_get_dest_buf(void) -{ - return &_dest_vgbuf; -} - -vg_lite_buffer_t * vglite_get_src_buf(void) -{ - return &_src_vgbuf; -} - -void vglite_set_dest_buf_ptr(void * buf) -{ - _set_vgbuf_ptr(&_dest_vgbuf, buf); -} - -void vglite_set_src_buf_ptr(const void * buf) -{ - _set_vgbuf_ptr(&_src_vgbuf, (void *)buf); -} - -void vglite_set_dest_buf(const void * buf, uint32_t width, uint32_t height, uint32_t stride, - lv_color_format_t cf) -{ - vglite_set_buf(&_dest_vgbuf, (void *)buf, width, height, stride, cf); -} - -void vglite_set_src_buf(const void * buf, uint32_t width, uint32_t height, uint32_t stride, - lv_color_format_t cf) -{ - vglite_set_buf(&_src_vgbuf, (void *)buf, width, height, stride, cf); -} - -void vglite_set_buf(vg_lite_buffer_t * vgbuf, void * buf, - uint32_t width, uint32_t height, uint32_t stride, - lv_color_format_t cf) -{ - vg_lite_buffer_format_t vgformat = vglite_get_buf_format(cf); - - vgbuf->format = vgformat; - vgbuf->tiled = VG_LITE_LINEAR; - vgbuf->image_mode = VG_LITE_NORMAL_IMAGE_MODE; - vgbuf->transparency_mode = VG_LITE_IMAGE_OPAQUE; - - vgbuf->width = (int32_t)width; - vgbuf->height = (int32_t)height; - vgbuf->stride = (int32_t)stride; - - lv_memzero(&vgbuf->yuv, sizeof(vgbuf->yuv)); - - vgbuf->memory = buf; - vgbuf->address = (uint32_t)vgbuf->memory; - vgbuf->handle = NULL; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static inline void _set_vgbuf_ptr(vg_lite_buffer_t * vgbuf, void * buf) -{ - vgbuf->memory = buf; - vgbuf->address = (uint32_t)vgbuf->memory; -} - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_buf.h b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_buf.h deleted file mode 100644 index 3ef4347..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_buf.h +++ /dev/null @@ -1,124 +0,0 @@ -/** - * @file lv_vglite_buf.h - * - */ - -/** - * Copyright 2023 NXP - * - * SPDX-License-Identifier: MIT - */ - -#ifndef LV_VGLITE_BUF_H -#define LV_VGLITE_BUF_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../../lv_conf_internal.h" - -#if LV_USE_DRAW_VGLITE -#include "../../sw/lv_draw_sw.h" - -#include "vg_lite.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Get vglite destination buffer pointer. - * - * @retval The vglite destination buffer - * - */ -vg_lite_buffer_t * vglite_get_dest_buf(void); - -/** - * Get vglite source buffer pointer. - * - * @retval The vglite source buffer - * - */ -vg_lite_buffer_t * vglite_get_src_buf(void); - -/** - * Set vglite destination buffer address only. - * - * @param[in] buf Destination buffer address (does not require alignment for VG_LITE_LINEAR mode) - * - */ -void vglite_set_dest_buf_ptr(void * buf); - -/** - * Set vglite source buffer address only. - * - * @param[in] buf Source buffer address - * - */ -void vglite_set_src_buf_ptr(const void * buf); - -/** - * Set vglite destination buffer. - * - * @param[in] buf Destination buffer address - * @param[in] width Destination buffer width - * @param[in] height Destination buffer height - * @param[in] stride Destination buffer stride in bytes - * @param[in] cf Destination buffer color format - * - */ -void vglite_set_dest_buf(const void * buf, uint32_t width, uint32_t height, uint32_t stride, - lv_color_format_t cf); - -/** - * Set vglite source buffer. - * - * @param[in] buf Source buffer address - * @param[in] width Source buffer width - * @param[in] height Source buffer height - * @param[in] stride Source buffer stride in bytes - * @param[in] cf Source buffer color format - * - */ -void vglite_set_src_buf(const void * buf, uint32_t width, uint32_t height, uint32_t stride, - lv_color_format_t cf); - -/** - * Set vglite buffer. - * - * @param[in] vgbuf Address of the VGLite buffer object - * @param[in] buf Address of the memory for the VGLite buffer - * @param[in] width Buffer width - * @param[in] height Buffer height - * @param[in] stride Buffer stride in bytes - * @param[in] cf Buffer color format - * - */ -void vglite_set_buf(vg_lite_buffer_t * vgbuf, void * buf, - uint32_t width, uint32_t height, uint32_t stride, - lv_color_format_t cf); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_VGLITE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_VGLITE_BUF_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_matrix.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_matrix.c deleted file mode 100644 index 0594b53..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_matrix.c +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @file lv_vglite_matrix.c - * - */ - -/** - * Copyright 2023 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_vglite_matrix.h" - -#if LV_USE_DRAW_VGLITE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -static vg_lite_matrix_t _vgmatrix; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -vg_lite_matrix_t * vglite_get_matrix(void) -{ - return &_vgmatrix; -} - -void vglite_set_translation_matrix(const lv_area_t * dest_area) -{ - vg_lite_identity(&_vgmatrix); - vg_lite_translate((vg_lite_float_t)dest_area->x1, (vg_lite_float_t)dest_area->y1, &_vgmatrix); -} - -void vglite_set_transformation_matrix(const lv_area_t * dest_area, const lv_draw_image_dsc_t * dsc) -{ - vglite_set_translation_matrix(dest_area); - - bool has_scale = (dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); - bool has_rotation = (dsc->rotation != 0); - - if(has_scale || has_rotation) { - vg_lite_translate(dsc->pivot.x, dsc->pivot.y, &_vgmatrix); - if(has_rotation) - vg_lite_rotate(dsc->rotation / 10.0f, &_vgmatrix); /* angle is 1/10 degree */ - if(has_scale) { - vg_lite_float_t scale_x = 1.0f * dsc->scale_x / LV_SCALE_NONE; - vg_lite_float_t scale_y = 1.0f * dsc->scale_y / LV_SCALE_NONE; - vg_lite_scale(scale_x, scale_y, &_vgmatrix); - } - vg_lite_translate(0.0f - dsc->pivot.x, 0.0f - dsc->pivot.y, &_vgmatrix); - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_matrix.h b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_matrix.h deleted file mode 100644 index 832cd86..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_matrix.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * @file lv_vglite_matrix.h - * - */ - -/** - * Copyright 2023 NXP - * - * SPDX-License-Identifier: MIT - */ - -#ifndef LV_VGLITE_MATRIX_H -#define LV_VGLITE_MATRIX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../../lv_conf_internal.h" - -#if LV_USE_DRAW_VGLITE -#include "../../sw/lv_draw_sw.h" - -#include "vg_lite.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -vg_lite_matrix_t * vglite_get_matrix(void); - -/** - * Creates matrix that translates to origin of given destination area. - * - * @param[in] dest_area Area with relative coordinates of destination buffer - * - */ -void vglite_set_translation_matrix(const lv_area_t * dest_area); - -/** - * Creates matrix that translates to origin of given destination area with transformation (scale or rotate). - * - * @param[in] dest_area Area with relative coordinates of destination buffer - * @param[in] dsc Image descriptor - * - */ -void vglite_set_transformation_matrix(const lv_area_t * dest_area, const lv_draw_image_dsc_t * dsc); - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VGLITE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_VGLITE_MATRIX_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_path.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_path.c deleted file mode 100644 index 6f8b759..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_path.c +++ /dev/null @@ -1,217 +0,0 @@ -/** - * @file lv_vglite_path.c - * - */ - -/** - * Copyright 2023 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_vglite_path.h" - -#if LV_USE_DRAW_VGLITE -#include "vg_lite.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void vglite_create_rect_path_data(int32_t * path_data, uint32_t * path_data_size, - int32_t radius, - const lv_area_t * coords) -{ - int32_t rect_width = lv_area_get_width(coords); - int32_t rect_height = lv_area_get_height(coords); - - /* Get the final radius. Can't be larger than the half of the shortest side */ - int32_t shortest_side = LV_MIN(rect_width, rect_height); - int32_t final_radius = LV_MIN(radius, shortest_side / 2); - - /* Path data element index */ - uint8_t pidx = 0; - - if((radius == (int32_t)LV_RADIUS_CIRCLE) && (rect_width == rect_height)) { - - /* Get the control point offset for rounded cases */ - int32_t cpoff = (int32_t)((float)final_radius * BEZIER_OPTIM_CIRCLE); - - /* Circle case */ - /* Starting point */ - path_data[pidx++] = VLC_OP_MOVE; - path_data[pidx++] = coords->x1 + final_radius; - path_data[pidx++] = coords->y1; - - /* Top-right arc */ - path_data[pidx++] = VLC_OP_CUBIC_REL; - path_data[pidx++] = cpoff; - path_data[pidx++] = 0; - path_data[pidx++] = final_radius; - path_data[pidx++] = final_radius - cpoff; - path_data[pidx++] = final_radius; - path_data[pidx++] = final_radius; - - /* Bottom-right arc*/ - path_data[pidx++] = VLC_OP_CUBIC_REL; - path_data[pidx++] = 0; - path_data[pidx++] = cpoff; - path_data[pidx++] = cpoff - final_radius; - path_data[pidx++] = final_radius; - path_data[pidx++] = 0 - final_radius; - path_data[pidx++] = final_radius; - - /* Bottom-left arc */ - path_data[pidx++] = VLC_OP_CUBIC_REL; - path_data[pidx++] = 0 - cpoff; - path_data[pidx++] = 0; - path_data[pidx++] = 0 - final_radius; - path_data[pidx++] = cpoff - final_radius; - path_data[pidx++] = 0 - final_radius; - path_data[pidx++] = 0 - final_radius; - - /* Top-left arc*/ - path_data[pidx++] = VLC_OP_CUBIC_REL; - path_data[pidx++] = 0; - path_data[pidx++] = 0 - cpoff; - path_data[pidx++] = final_radius - cpoff; - path_data[pidx++] = 0 - final_radius; - path_data[pidx++] = final_radius; - path_data[pidx++] = 0 - final_radius; - - /* Ending point */ - path_data[pidx++] = VLC_OP_END; - } - else if(radius > 0) { - /* Get the control point offset for rounded cases */ - int32_t cpoff = (int32_t)((float)final_radius * BEZIER_OPTIM_CIRCLE); - - /* Rounded rectangle case */ - /* Starting point */ - path_data[pidx++] = VLC_OP_MOVE; - path_data[pidx++] = coords->x1 + final_radius; - path_data[pidx++] = coords->y1; - - /* Top side */ - path_data[pidx++] = VLC_OP_LINE; - path_data[pidx++] = coords->x2 - final_radius + 1; /*Extended for VGLite*/ - path_data[pidx++] = coords->y1; - - /* Top-right corner */ - path_data[pidx++] = VLC_OP_CUBIC_REL; - path_data[pidx++] = cpoff; - path_data[pidx++] = 0; - path_data[pidx++] = final_radius; - path_data[pidx++] = final_radius - cpoff; - path_data[pidx++] = final_radius; - path_data[pidx++] = final_radius; - - /* Right side */ - path_data[pidx++] = VLC_OP_LINE; - path_data[pidx++] = coords->x2 + 1; /*Extended for VGLite*/ - path_data[pidx++] = coords->y2 - final_radius + 1; /*Extended for VGLite*/ - - /* Bottom-right corner*/ - path_data[pidx++] = VLC_OP_CUBIC_REL; - path_data[pidx++] = 0; - path_data[pidx++] = cpoff; - path_data[pidx++] = cpoff - final_radius; - path_data[pidx++] = final_radius; - path_data[pidx++] = 0 - final_radius; - path_data[pidx++] = final_radius; - - /* Bottom side */ - path_data[pidx++] = VLC_OP_LINE; - path_data[pidx++] = coords->x1 + final_radius; - path_data[pidx++] = coords->y2 + 1; /*Extended for VGLite*/ - - /* Bottom-left corner */ - path_data[pidx++] = VLC_OP_CUBIC_REL; - path_data[pidx++] = 0 - cpoff; - path_data[pidx++] = 0; - path_data[pidx++] = 0 - final_radius; - path_data[pidx++] = cpoff - final_radius; - path_data[pidx++] = 0 - final_radius; - path_data[pidx++] = 0 - final_radius; - - /* Left side*/ - path_data[pidx++] = VLC_OP_LINE; - path_data[pidx++] = coords->x1; - path_data[pidx++] = coords->y1 + final_radius; - - /* Top-left corner */ - path_data[pidx++] = VLC_OP_CUBIC_REL; - path_data[pidx++] = 0; - path_data[pidx++] = 0 - cpoff; - path_data[pidx++] = final_radius - cpoff; - path_data[pidx++] = 0 - final_radius; - path_data[pidx++] = final_radius; - path_data[pidx++] = 0 - final_radius; - - /* Ending point */ - path_data[pidx++] = VLC_OP_END; - } - else { - /* Non-rounded rectangle case */ - /* Starting point */ - path_data[pidx++] = VLC_OP_MOVE; - path_data[pidx++] = coords->x1; - path_data[pidx++] = coords->y1; - - /* Top side */ - path_data[pidx++] = VLC_OP_LINE; - path_data[pidx++] = coords->x2 + 1; /*Extended for VGLite*/ - path_data[pidx++] = coords->y1; - - /* Right side */ - path_data[pidx++] = VLC_OP_LINE; - path_data[pidx++] = coords->x2 + 1; /*Extended for VGLite*/ - path_data[pidx++] = coords->y2 + 1; /*Extended for VGLite*/ - - /* Bottom side */ - path_data[pidx++] = VLC_OP_LINE; - path_data[pidx++] = coords->x1; - path_data[pidx++] = coords->y2 + 1; /*Extended for VGLite*/ - - /* Left side*/ - path_data[pidx++] = VLC_OP_LINE; - path_data[pidx++] = coords->x1; - path_data[pidx++] = coords->y1; - - /* Ending point */ - path_data[pidx++] = VLC_OP_END; - } - - /* Resulting path size */ - *path_data_size = pidx * sizeof(int32_t); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_path.h b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_path.h deleted file mode 100644 index f38593a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_path.h +++ /dev/null @@ -1,97 +0,0 @@ -/** - * @file lv_vglite_path.h - * - */ - -/** - * Copyright 2023 NXP - * - * SPDX-License-Identifier: MIT - */ - -#ifndef LV_VGLITE_PATH_H -#define LV_VGLITE_PATH_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../../lv_conf_internal.h" - -#if LV_USE_DRAW_VGLITE -#include "../../sw/lv_draw_sw.h" - -/********************* - * DEFINES - *********************/ - -/* The optimal Bezier control point offset for radial unit - * see: https://spencermortensen.com/articles/bezier-circle/ - **/ -#define BEZIER_OPTIM_CIRCLE 0.551915024494f - -/* Draw lines for control points of Bezier curves */ -#define BEZIER_DBG_CONTROL_POINTS 0 - -/* Path data sizes for different elements */ -#define CUBIC_PATH_DATA_SIZE 7 /* 1 opcode, 6 arguments */ -#define LINE_PATH_DATA_SIZE 3 /* 1 opcode, 2 arguments */ -#define MOVE_PATH_DATA_SIZE 3 /* 1 opcode, 2 arguments */ -#define END_PATH_DATA_SIZE 1 /* 1 opcode, 0 arguments */ -/* Maximum possible rectangle path size - * is in the rounded rectangle case: - * - 1 move for the path start - * - 4 cubics for the corners - * - 4 lines for the sides - * - 1 end for the path end */ -#define RECT_PATH_DATA_MAX_SIZE (1 * MOVE_PATH_DATA_SIZE + 4 * CUBIC_PATH_DATA_SIZE + 4 * LINE_PATH_DATA_SIZE + 1 * END_PATH_DATA_SIZE) - -/* Maximum possible arc path size - * is in the rounded arc case: - * - 1 move for the path start - * - 16 cubics for the arc (5 inner, 5 outer) and corners (3 per corner) - * - 1 end for the path end */ -#define ARC_PATH_DATA_MAX_SIZE (1 * MOVE_PATH_DATA_SIZE + 16 * CUBIC_PATH_DATA_SIZE + 1 * END_PATH_DATA_SIZE) -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Generates path data for rectangle drawing. - * - * @param[in/out] path The path data to initialize - * @param[in/out] path_size The resulting size of the created path data - * @param[in] dsc The style descriptor for the rectangle to be drawn - * @param[in] coords The coordinates of the rectangle to be drawn - * - */ -void vglite_create_rect_path_data(int32_t * path_data, uint32_t * path_data_size, - int32_t radius, - const lv_area_t * coords); - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VGLITE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_VGLITE_PATH_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_utils.c b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_utils.c deleted file mode 100644 index b3afa5a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_utils.c +++ /dev/null @@ -1,282 +0,0 @@ -/** - * @file lv_vglite_utils.c - * - */ - -/** - * Copyright 2022-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_vglite_utils.h" - -#if LV_USE_DRAW_VGLITE -#include "lv_vglite_buf.h" - -#include "../../../core/lv_refr.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -#if LV_USE_VGLITE_DRAW_ASYNC - static volatile bool _cmd_buf_flushed = false; -#endif - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -const char * vglite_error_to_string(vg_lite_error_t error) -{ - switch(error) { - ENUM_TO_STRING(VG_LITE_SUCCESS); - ENUM_TO_STRING(VG_LITE_INVALID_ARGUMENT); - ENUM_TO_STRING(VG_LITE_OUT_OF_MEMORY); - ENUM_TO_STRING(VG_LITE_NO_CONTEXT); - ENUM_TO_STRING(VG_LITE_TIMEOUT); - ENUM_TO_STRING(VG_LITE_OUT_OF_RESOURCES); - ENUM_TO_STRING(VG_LITE_GENERIC_IO); - ENUM_TO_STRING(VG_LITE_NOT_SUPPORT); - ENUM_TO_STRING(VG_LITE_ALREADY_EXISTS); - ENUM_TO_STRING(VG_LITE_NOT_ALIGNED); - ENUM_TO_STRING(VG_LITE_FLEXA_TIME_OUT); - ENUM_TO_STRING(VG_LITE_FLEXA_HANDSHAKE_FAIL); - default: - break; - } - - return "VG_LITE_UKNOWN_ERROR"; -} - -#if LV_USE_VGLITE_DRAW_ASYNC -bool vglite_cmd_buf_is_flushed(void) -{ - return _cmd_buf_flushed; -} -#endif - -void vglite_run(void) -{ -#if LV_USE_VGLITE_DRAW_ASYNC - vg_lite_uint32_t gpu_idle = 0; - - VGLITE_CHECK_ERROR(vg_lite_get_parameter(VG_LITE_GPU_IDLE_STATE, 1, (vg_lite_pointer)&gpu_idle)); - - if(!gpu_idle) { - _cmd_buf_flushed = false; - - return; - } -#endif - - /* - * If LV_USE_VGLITE_DRAW_ASYNC is enabled, simply flush the command buffer and the - * vglite draw thread will signal asynchronous the dispatcher for completed tasks. - * Without draw async, process the tasks and signal them as complete one by one. - */ -#if LV_USE_VGLITE_DRAW_ASYNC - VGLITE_CHECK_ERROR(vg_lite_flush()); - _cmd_buf_flushed = true; -#else - VGLITE_CHECK_ERROR(vg_lite_finish()); -#endif -} - -#if LV_USE_VGLITE_DRAW_ASYNC -void vglite_wait_for_finish(void) -{ - VGLITE_CHECK_ERROR(vg_lite_finish()); -} -#endif - -vg_lite_color_t vglite_get_color(lv_color32_t lv_col32, bool gradient) -{ - vg_lite_color_t vg_col32; - - /* Pre-multiply alpha */ - lv_col32.red = LV_UDIV255(lv_col32.red * lv_col32.alpha); - lv_col32.green = LV_UDIV255(lv_col32.green * lv_col32.alpha); - lv_col32.blue = LV_UDIV255(lv_col32.blue * lv_col32.alpha); - - if(!gradient) - /* The color is in ABGR8888 format with red channel in the lower 8 bits. */ - vg_col32 = ((vg_lite_color_t)lv_col32.alpha << 24) | ((vg_lite_color_t)lv_col32.blue << 16) | - ((vg_lite_color_t)lv_col32.green << 8) | (vg_lite_color_t)lv_col32.red; - else - /* The gradient color is in ARGB8888 format with blue channel in the lower 8 bits. */ - vg_col32 = ((vg_lite_color_t)lv_col32.alpha << 24) | ((vg_lite_color_t)lv_col32.red << 16) | - ((vg_lite_color_t)lv_col32.green << 8) | (vg_lite_color_t)lv_col32.blue; - - return vg_col32; -} - -vg_lite_blend_t vglite_get_blend_mode(lv_blend_mode_t lv_blend_mode) -{ - vg_lite_blend_t vg_blend_mode = VG_LITE_BLEND_NONE; - - if(vg_lite_query_feature(gcFEATURE_BIT_VG_LVGL_SUPPORT)) { - switch(lv_blend_mode) { - case LV_BLEND_MODE_NORMAL: - vg_blend_mode = VG_LITE_BLEND_NORMAL_LVGL; - break; - case LV_BLEND_MODE_ADDITIVE: - vg_blend_mode = VG_LITE_BLEND_ADDITIVE_LVGL; - break; - case LV_BLEND_MODE_SUBTRACTIVE: - vg_blend_mode = VG_LITE_BLEND_SUBTRACT_LVGL; - break; - case LV_BLEND_MODE_MULTIPLY: - vg_blend_mode = VG_LITE_BLEND_MULTIPLY_LVGL; - break; - default: - VGLITE_ASSERT_MSG(false, "Unsupported blend mode."); - break; - } - } - else { - switch(lv_blend_mode) { - case LV_BLEND_MODE_NORMAL: - vg_blend_mode = VG_LITE_BLEND_SRC_OVER; - break; - case LV_BLEND_MODE_ADDITIVE: - vg_blend_mode = VG_LITE_BLEND_ADDITIVE; - break; - case LV_BLEND_MODE_SUBTRACTIVE: - vg_blend_mode = VG_LITE_BLEND_SUBTRACT; - break; - case LV_BLEND_MODE_MULTIPLY: - vg_blend_mode = VG_LITE_BLEND_MULTIPLY; - break; - default: - VGLITE_ASSERT_MSG(false, "Unsupported blend mode."); - break; - } - } - - return vg_blend_mode; -} - -vg_lite_buffer_format_t vglite_get_buf_format(lv_color_format_t cf) -{ - vg_lite_buffer_format_t vg_buffer_format = VG_LITE_BGR565; - - switch(cf) { - case LV_COLOR_FORMAT_L8: - vg_buffer_format = VG_LITE_L8; - break; - case LV_COLOR_FORMAT_A8: - vg_buffer_format = VG_LITE_A8; - break; - case LV_COLOR_FORMAT_I1: - vg_buffer_format = VG_LITE_INDEX_1; - break; - case LV_COLOR_FORMAT_I2: - vg_buffer_format = VG_LITE_INDEX_2; - break; - case LV_COLOR_FORMAT_I4: - vg_buffer_format = VG_LITE_INDEX_4; - break; - case LV_COLOR_FORMAT_I8: - vg_buffer_format = VG_LITE_INDEX_8; - break; - case LV_COLOR_FORMAT_RGB565: - vg_buffer_format = VG_LITE_BGR565; - break; - case LV_COLOR_FORMAT_RGB565A8: - vg_buffer_format = VG_LITE_ABGR8565; - break; - case LV_COLOR_FORMAT_RGB888: - vg_buffer_format = VG_LITE_BGR888; - break; - case LV_COLOR_FORMAT_ARGB8888: - vg_buffer_format = VG_LITE_BGRA8888; - break; - case LV_COLOR_FORMAT_XRGB8888: - vg_buffer_format = VG_LITE_BGRX8888; - break; - - default: - VGLITE_ASSERT_MSG(false, "Unsupported color format."); - break; - } - - return vg_buffer_format; -} - -uint8_t vglite_get_stride_alignment(lv_color_format_t cf) -{ - uint8_t align_bytes = LV_COLOR_DEPTH / 8 * 16; /*16 pixels*/ - - switch(cf) { - case LV_COLOR_FORMAT_I1: - case LV_COLOR_FORMAT_I2: - case LV_COLOR_FORMAT_I4: - align_bytes = 8; - break; - case LV_COLOR_FORMAT_I8: - case LV_COLOR_FORMAT_A8: - case LV_COLOR_FORMAT_L8: - align_bytes = 16; - break; - case LV_COLOR_FORMAT_RGB565: - align_bytes = 32; - break; - case LV_COLOR_FORMAT_RGB565A8: - case LV_COLOR_FORMAT_RGB888: - align_bytes = 48; - break; - case LV_COLOR_FORMAT_ARGB8888: - case LV_COLOR_FORMAT_XRGB8888: - align_bytes = 64; - break; - - default: - VGLITE_ASSERT_MSG(false, "Unsupported buffer format."); - break; - } - - return align_bytes; -} - -bool vglite_src_buf_aligned(const void * buf, uint32_t stride, lv_color_format_t cf) -{ - /* No alignment requirement for destination buffer when using mode VG_LITE_LINEAR */ - - /* Test for pointer alignment */ - if((uintptr_t)buf % LV_ATTRIBUTE_MEM_ALIGN_SIZE) - return false; - - /* Test for stride alignment */ - if(stride == 0 || stride % vglite_get_stride_alignment(cf)) - return false; - - return true; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_utils.h b/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_utils.h deleted file mode 100644 index 6615c4c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/nxp/vglite/lv_vglite_utils.h +++ /dev/null @@ -1,179 +0,0 @@ -/** - * @file lv_vglite_utils.h - * - */ - -/** - * Copyright 2022-2024 NXP - * - * SPDX-License-Identifier: MIT - */ - -#ifndef LV_VGLITE_UTILS_H -#define LV_VGLITE_UTILS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../../lv_conf_internal.h" - -#if LV_USE_DRAW_VGLITE -#include "../../sw/lv_draw_sw.h" - -#include "vg_lite.h" -#include "vg_lite_options.h" - -/********************* - * DEFINES - *********************/ - -#define ENUM_TO_STRING(e) \ - case (e): \ - return #e - -#if LV_USE_VGLITE_ASSERT -#define VGLITE_ASSERT(expr) LV_ASSERT(expr) -#else -#define VGLITE_ASSERT(expr) -#endif - -#define VGLITE_ASSERT_MSG(expr, msg) \ - do { \ - if(!(expr)) { \ - LV_LOG_ERROR(msg); \ - VGLITE_ASSERT(false); \ - } \ - } while(0) - -#define VGLITE_CHECK_ERROR(function) \ - do { \ - vg_lite_error_t error = function; \ - if(error != VG_LITE_SUCCESS) { \ - LV_LOG_ERROR("Execute '" #function "' error(%d): %s", \ - (int)error, vglite_error_to_string(error)); \ - VGLITE_ASSERT(false); \ - } \ - } while (0) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/** - * Set the clipping box. - * - * @param[in] clip_area Clip area with relative coordinates of destination buffer - * - */ -static inline void vglite_set_scissor(const lv_area_t * clip_area); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -const char * vglite_error_to_string(vg_lite_error_t error); - -#if LV_USE_VGLITE_DRAW_ASYNC -/** - * Get VG-Lite command buffer flushed status. - * - */ -bool vglite_cmd_buf_is_flushed(void); -#endif - -/** - * Flush command to VG-Lite. - * - */ -void vglite_run(void); - -/** - * Wait for VG-Lite finish. - * - */ -#if LV_USE_VGLITE_DRAW_ASYNC -void vglite_wait_for_finish(void); -#endif - -/** - * Get vglite color. Premultiplies (if not hw already) and swizzles the given - * LVGL 32bit color to obtain vglite color. - * - * @param[in] lv_col32 The initial LVGL 32bit color - * @param[in] gradient True for gradient color - * - * @retval The vglite 32-bit color value: - * - */ -vg_lite_color_t vglite_get_color(lv_color32_t lv_col32, bool gradient); - -/** - * Get vglite blend mode. - * - * @param[in] lv_blend_mode The LVGL blend mode - * - * @retval The vglite blend mode - * - */ -vg_lite_blend_t vglite_get_blend_mode(lv_blend_mode_t lv_blend_mode); - -/** - * Get vglite buffer format. - * - * @param[in] cf Color format - * - * @retval The vglite buffer format - * - */ -vg_lite_buffer_format_t vglite_get_buf_format(lv_color_format_t cf); - -/** - * Get vglite stride alignment. - * - * @param[in] cf Color format - * - * @retval Alignment requirement in bytes - * - */ -uint8_t vglite_get_stride_alignment(lv_color_format_t cf); - -/** - * Check source start address and stride alignment. - * - * @param[in] buf Buffer address - * @param[in] stride Stride of buffer in bytes - * @param[in] cf Color format - to calculate the expected alignment - * - * @retval true Alignment OK - * - */ -bool vglite_src_buf_aligned(const void * buf, uint32_t stride, lv_color_format_t cf); - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static inline void vglite_set_scissor(const lv_area_t * clip_area) -{ - vg_lite_set_scissor(clip_area->x1, clip_area->y1, clip_area->x2 + 1, clip_area->y2 + 1); -} - -#endif /*LV_USE_DRAW_VGLITE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_VGLITE_UTILS_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d.c b/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d.c deleted file mode 100644 index 08a814c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d.c +++ /dev/null @@ -1,597 +0,0 @@ -/** - * @file lv_draw_dave2d.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_dave2d.h" -#if LV_USE_DRAW_DAVE2D -#include "../../lv_draw_buf_private.h" -#include "../../../misc/lv_area_private.h" - -/********************* - * DEFINES - *********************/ -#define DRAW_UNIT_ID_DAVE2D 4 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -#if LV_USE_OS - static void _dave2d_render_thread_cb(void * ptr); -#endif - -static void execute_drawing(lv_draw_dave2d_unit_t * u); - -#if defined(RENESAS_CORTEX_M85) - #if (BSP_CFG_DCACHE_ENABLED) - static void _dave2d_buf_invalidate_cache_cb(const lv_draw_buf_t * draw_buf, const lv_area_t * area); - #endif -#endif - -static int32_t _dave2d_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); - -static int32_t lv_draw_dave2d_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); - -static d2_s32 lv_dave2d_init(void); - -static void lv_draw_buf_dave2d_init_handlers(void); - -void dave2d_execute_dlist_and_flush(void); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -d2_device * _d2_handle; -d2_renderbuffer * _renderbuffer; -d2_renderbuffer * _blit_renderbuffer; - -lv_ll_t _ll_Dave2D_Tasks; - -#if LV_USE_OS - lv_mutex_t xd2Semaphore; -#endif - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_dave2d_init(void) -{ - d2_s32 result = D2_OK; - - lv_draw_buf_dave2d_init_handlers(); - - lv_draw_dave2d_unit_t * draw_dave2d_unit = lv_draw_create_unit(sizeof(lv_draw_dave2d_unit_t)); - draw_dave2d_unit->base_unit.dispatch_cb = lv_draw_dave2d_dispatch; - draw_dave2d_unit->base_unit.evaluate_cb = _dave2d_evaluate; - draw_dave2d_unit->idx = DRAW_UNIT_ID_DAVE2D; - - result = lv_dave2d_init(); - LV_ASSERT(D2_OK == result); - -#if LV_USE_OS - lv_result_t res; - res = lv_mutex_init(&xd2Semaphore); - LV_ASSERT(LV_RESULT_OK == res); - - draw_dave2d_unit->pd2Mutex = &xd2Semaphore; -#endif - - draw_dave2d_unit->d2_handle = _d2_handle; - draw_dave2d_unit->renderbuffer = _renderbuffer; - lv_ll_init(&_ll_Dave2D_Tasks, 4); - -#if LV_USE_OS - lv_thread_init(&draw_dave2d_unit->thread, LV_THREAD_PRIO_HIGH, _dave2d_render_thread_cb, 8 * 1024, draw_dave2d_unit); -#endif - -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_draw_buf_dave2d_init_handlers(void) -{ - -#if defined(RENESAS_CORTEX_M85) -#if (BSP_CFG_DCACHE_ENABLED) - lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); - handlers->invalidate_cache_cb = _dave2d_buf_invalidate_cache_cb; -#endif -#endif -} - -#if defined(RENESAS_CORTEX_M85) -#if (BSP_CFG_DCACHE_ENABLED) -static void _dave2d_buf_invalidate_cache_cb(const lv_draw_buf_t * draw_buf, const lv_area_t * area) -{ - const lv_image_header_t * header = &draw_buf->header; - uint32_t stride = header->stride; - lv_color_format_t cf = header->cf; - - uint8_t * address = draw_buf->data; - int32_t i = 0; - uint32_t bytes_per_pixel = lv_color_format_get_size(cf); - int32_t width = lv_area_get_width(area); - int32_t lines = lv_area_get_height(area); - int32_t bytes_to_flush_per_line = (int32_t)width * (int32_t)bytes_per_pixel; - - /* Stride is in bytes, not pixels */ - address = address + (area->x1 * (int32_t)bytes_per_pixel) + (stride * (uint32_t)area->y1); - - for(i = 0; i < lines; i++) { - SCB_CleanInvalidateDCache_by_Addr(address, bytes_to_flush_per_line); - address += stride; - } -} -#endif -#endif - -/** - * @todo - * LVGL needs to use hardware acceleration for buf_copy and do not affect GPU rendering. - */ -#if 0 -static void _dave2d_buf_copy(void * dest_buf, uint32_t dest_w, uint32_t dest_h, const lv_area_t * dest_area, - void * src_buf, uint32_t src_w, uint32_t src_h, const lv_area_t * src_area, lv_color_format_t color_format) -{ - d2_s32 result; - -#if LV_USE_OS - lv_result_t status; - - status = lv_mutex_lock(&xd2Semaphore); - LV_ASSERT(LV_RESULT_OK == status); -#endif - - d2_u32 src_blend_mode = d2_getblendmodesrc(_d2_handle); - d2_u32 dst_blend_mode = d2_getblendmodedst(_d2_handle); - - result = d2_selectrenderbuffer(_d2_handle, _blit_renderbuffer); - LV_ASSERT(D2_OK == result); - - result = d2_setblendmode(_d2_handle, d2_bm_one, d2_bm_zero); - LV_ASSERT(D2_OK == result); - - // Generate render operations - result = d2_framebuffer(_d2_handle, (uint16_t *)dest_buf, DISPLAY_HSIZE_INPUT0, DISPLAY_BUFFER_STRIDE_PIXELS_INPUT0, - DISPLAY_VSIZE_INPUT0, lv_draw_dave2d_cf_fb_get()); - LV_ASSERT(D2_OK == result); - - result = d2_cliprect(_d2_handle, (d2_border)dest_area->x1, (d2_border)dest_area->y1, (d2_border)dest_area->x2, - (d2_border)dest_area->y2); - LV_ASSERT(D2_OK == result); - - result = d2_setblitsrc(_d2_handle, (void *) src_buf, (d2_s32)src_w, (d2_s32)src_w, (d2_s32)src_h, - lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(color_format)); - LV_ASSERT(D2_OK == result); - - result = d2_blitcopy(_d2_handle, (d2_s32)src_w, (d2_s32)src_h, (d2_blitpos)src_area->x1, (d2_blitpos)src_area->y1, - D2_FIX4(dest_w), D2_FIX4(dest_h), - D2_FIX4(dest_area->x1), D2_FIX4(dest_area->y1), 0); - LV_ASSERT(D2_OK == result); - - // Execute render operations - result = d2_executerenderbuffer(_d2_handle, _blit_renderbuffer, 0); - LV_ASSERT(D2_OK == result) ; - - result = d2_flushframe(_d2_handle); - LV_ASSERT(D2_OK == result); - - result = d2_selectrenderbuffer(_d2_handle, _renderbuffer); - LV_ASSERT(D2_OK == result); - - result = d2_setblendmode(_d2_handle, src_blend_mode, dst_blend_mode); - LV_ASSERT(D2_OK != result); - -#if LV_USE_OS - status = lv_mutex_unlock(&xd2Semaphore); - LV_ASSERT(LV_RESULT_OK == status); -#endif - -} -#endif - -#define USE_D2 (1) - -static int32_t _dave2d_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t) -{ - LV_UNUSED(u); - int32_t ret = 0; - - switch(t->type) { - case LV_DRAW_TASK_TYPE_FILL: { -#if USE_D2 - lv_draw_fill_dsc_t * dsc = t->draw_dsc; - if(dsc->grad.dir == LV_GRAD_DIR_NONE - || ((dsc->grad.dir != LV_GRAD_DIR_NONE) - && ((dsc->grad.stops[0].color.blue == dsc->grad.stops[dsc->grad.stops_count - 1].color.blue) - && (dsc->grad.stops[0].color.red == dsc->grad.stops[dsc->grad.stops_count - 1].color.red) - && (dsc->grad.stops[0].color.green == dsc->grad.stops[dsc->grad.stops_count - 1].color.green)))) { - - t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; - t->preference_score = 0; - - } - else -#endif - { - } - ret = 0; - break; - } - case LV_DRAW_TASK_TYPE_LAYER: { - ret = 0; - break; - } - - case LV_DRAW_TASK_TYPE_IMAGE: { -#if USE_D2 - t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; - t->preference_score = 0; -#endif - ret = 0; - break; - } - - case LV_DRAW_TASK_TYPE_BORDER: { -#if USE_D2 - t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; - t->preference_score = 0; -#endif - ret = 0; - break; - } - - case LV_DRAW_TASK_TYPE_BOX_SHADOW: { - ret = 0; - break; - } - - case LV_DRAW_TASK_TYPE_LABEL: { -#if USE_D2 - t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; - t->preference_score = 0; -#endif - ret = 0; - break; - } - - case LV_DRAW_TASK_TYPE_LINE: { -#if USE_D2 - t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; - t->preference_score = 0; -#endif - ret = 0; - break; - } - - case LV_DRAW_TASK_TYPE_ARC: { -#if USE_D2 - t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; - t->preference_score = 0; -#endif - ret = 0; - break; - } - - case LV_DRAW_TASK_TYPE_TRIANGLE: { -#if USE_D2 - lv_draw_fill_dsc_t * dsc = t->draw_dsc; - if(dsc->grad.dir == LV_GRAD_DIR_NONE - || ((dsc->grad.dir != LV_GRAD_DIR_NONE) - && ((dsc->grad.stops[0].color.blue == dsc->grad.stops[dsc->grad.stops_count - 1].color.blue) - && (dsc->grad.stops[0].color.red == dsc->grad.stops[dsc->grad.stops_count - 1].color.red) - && (dsc->grad.stops[0].color.green == dsc->grad.stops[dsc->grad.stops_count - 1].color.green)))) { - t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; - t->preference_score = 0; - } - else { - } -#endif - ret = 0; - break; - } - - case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: { -#if 0//USE_D2 - t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; - t->preference_score = 0; -#endif - ret = 0; - break; - } - - case LV_DRAW_TASK_TYPE_MASK_BITMAP: { - ret = 0; - break; - } - - default: - ret = 0; - break; - } - - return ret; -} - -#define DAVE2D_REFERRING_WATERMARK 10 - -static int32_t lv_draw_dave2d_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) -{ - lv_draw_dave2d_unit_t * draw_dave2d_unit = (lv_draw_dave2d_unit_t *) draw_unit; -#if (0 == D2_RENDER_EACH_OPERATION) - static uint32_t ref_count = 0; -#endif - - /*Return immediately if it's busy with draw task*/ - if(draw_dave2d_unit->task_act) return 0; - - lv_draw_task_t * t = NULL; - t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_DAVE2D); - while(t && t->preferred_draw_unit_id != DRAW_UNIT_ID_DAVE2D) { - t->state = LV_DRAW_TASK_STATE_READY; - t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_DAVE2D); - } - - if(t == NULL) { -#if (0 == D2_RENDER_EACH_OPERATION) - if(false == lv_ll_is_empty(&_ll_Dave2D_Tasks)) { - ref_count = 0; - dave2d_execute_dlist_and_flush(); - } -#endif - return LV_DRAW_UNIT_IDLE; /*Couldn't start rendering*/ - } - - void * buf = lv_draw_layer_alloc_buf(layer); - if(buf == NULL) { - return LV_DRAW_UNIT_IDLE; /*Couldn't start rendering*/ - } - -#if (0 == D2_RENDER_EACH_OPERATION) - ref_count += lv_draw_get_dependent_count(t); - - if(DAVE2D_REFERRING_WATERMARK < ref_count) { - ref_count = 0; - dave2d_execute_dlist_and_flush(); - } - - lv_draw_task_t ** p_new_list_entry; - p_new_list_entry = lv_ll_ins_tail(&_ll_Dave2D_Tasks); - *p_new_list_entry = t; -#endif - - t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; - draw_dave2d_unit->base_unit.target_layer = layer; - draw_dave2d_unit->base_unit.clip_area = &t->clip_area; - draw_dave2d_unit->task_act = t; - -#if LV_USE_OS - /*Let the render thread work*/ - lv_thread_sync_signal(&draw_dave2d_unit->sync); -#else - execute_drawing(draw_dave2d_unit); -#if (D2_RENDER_EACH_OPERATION) - draw_dave2d_unit->task_act->state = LV_DRAW_TASK_STATE_READY; -#endif - draw_dave2d_unit->task_act = NULL; - - /*The draw unit is free now. Request a new dispatching as it can get a new task*/ - lv_draw_dispatch_request(); - -#endif - return 1; -} - -#if LV_USE_OS -static void _dave2d_render_thread_cb(void * ptr) -{ - lv_draw_dave2d_unit_t * u = ptr; - - lv_thread_sync_init(&u->sync); - - while(1) { - while(u->task_act == NULL) { - lv_thread_sync_wait(&u->sync); - } - - execute_drawing(u); - - /*Cleanup*/ -#if (D2_RENDER_EACH_OPERATION) - u->task_act->state = LV_DRAW_TASK_STATE_READY; -#endif - u->task_act = NULL; - - /*The draw unit is free now. Request a new dispatching as it can get a new task*/ - lv_draw_dispatch_request(); - } -} -#endif - -static void execute_drawing(lv_draw_dave2d_unit_t * u) -{ - /*Render the draw task*/ - lv_draw_task_t * t = u->task_act; - -#if defined(RENESAS_CORTEX_M85) -#if (BSP_CFG_DCACHE_ENABLED) - lv_layer_t * layer = u->base_unit.target_layer; - lv_area_t clipped_area; - int32_t x; - int32_t y; - - lv_area_intersect(&clipped_area, &t->area, u->base_unit.clip_area); - - x = 0 - u->base_unit.target_layer->buf_area.x1; - y = 0 - u->base_unit.target_layer->buf_area.y1; - - lv_area_move(&clipped_area, x, y); - - /* Invalidate cache */ - lv_draw_buf_invalidate_cache(layer->draw_buf, &clipped_area); -#endif -#endif - - switch(t->type) { - case LV_DRAW_TASK_TYPE_FILL: - lv_draw_dave2d_fill(u, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_BORDER: - lv_draw_dave2d_border(u, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_BOX_SHADOW: - //lv_draw_dave2d_box_shadow(u, t->draw_dsc, &t->area); - break; -#if 0 - case LV_DRAW_TASK_TYPE_BG_IMG: - //lv_draw_dave2d_bg_image(u, t->draw_dsc, &t->area); - break; -#endif - case LV_DRAW_TASK_TYPE_LABEL: - lv_draw_dave2d_label(u, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_IMAGE: - lv_draw_dave2d_image(u, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_LINE: - lv_draw_dave2d_line(u, t->draw_dsc); - break; - case LV_DRAW_TASK_TYPE_ARC: - lv_draw_dave2d_arc(u, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_TRIANGLE: - lv_draw_dave2d_triangle(u, t->draw_dsc); - break; - case LV_DRAW_TASK_TYPE_LAYER: - //lv_draw_dave2d_layer(u, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: - //lv_draw_dave2d_mask_rect(u, t->draw_dsc, &t->area); - break; - default: - break; - } - -} - -static d2_s32 lv_dave2d_init(void) -{ - d2_s32 result = D2_OK; - - if(_d2_handle != NULL) { - return D2_NOMEMORY; - } - - _d2_handle = d2_opendevice(0); - if(_d2_handle == NULL) { - return D2_NOMEMORY; - } - - /* bind the hardware */ - result = d2_inithw(_d2_handle, 0); - if(result != D2_OK) { - LV_LOG_ERROR("Could NOT d2_inithw"); - d2_closedevice(_d2_handle); - return result; - } - - // - // Set various D2 parameters - // - result = d2_setblendmode(_d2_handle, d2_bm_alpha, d2_bm_one_minus_alpha); - result = d2_setalphamode(_d2_handle, d2_am_constant); - result = d2_setalpha(_d2_handle, UINT8_MAX); - result = d2_setantialiasing(_d2_handle, 1); - result = d2_setlinecap(_d2_handle, d2_lc_butt); - result = d2_setlinejoin(_d2_handle, d2_lj_miter); - - /* set blocksize for default displaylist */ - result = d2_setdlistblocksize(_d2_handle, 25); - if(D2_OK != result) { - LV_LOG_ERROR("Could NOT d2_setdlistblocksize"); - d2_closedevice(_d2_handle); - return result; - } - - _blit_renderbuffer = d2_newrenderbuffer(_d2_handle, 20, 20); - if(!_blit_renderbuffer) { - LV_LOG_ERROR("NO renderbuffer"); - d2_closedevice(_d2_handle); - - return D2_NOMEMORY; - } - - _renderbuffer = d2_newrenderbuffer(_d2_handle, 20, 20); - if(!_renderbuffer) { - LV_LOG_ERROR("NO renderbuffer"); - d2_closedevice(_d2_handle); - - return D2_NOMEMORY; - } - - result = d2_selectrenderbuffer(_d2_handle, _renderbuffer); - if(D2_OK != result) { - LV_LOG_ERROR("Could NOT d2_selectrenderbuffer"); - d2_closedevice(_d2_handle); - } - - return result; -} - -void dave2d_execute_dlist_and_flush(void) -{ -#if LV_USE_OS - lv_result_t status; - - status = lv_mutex_lock(&xd2Semaphore); - LV_ASSERT(LV_RESULT_OK == status); -#endif - - d2_s32 result; - lv_draw_task_t ** p_list_entry; - lv_draw_task_t * p_list_entry1; - - // Execute render operations - result = d2_executerenderbuffer(_d2_handle, _renderbuffer, 0); - LV_ASSERT(D2_OK == result); - - result = d2_flushframe(_d2_handle); - LV_ASSERT(D2_OK == result); - - result = d2_selectrenderbuffer(_d2_handle, _renderbuffer); - LV_ASSERT(D2_OK == result); - - while(false == lv_ll_is_empty(&_ll_Dave2D_Tasks)) { - p_list_entry = lv_ll_get_tail(&_ll_Dave2D_Tasks); - p_list_entry1 = *p_list_entry; - p_list_entry1->state = LV_DRAW_TASK_STATE_READY; - lv_ll_remove(&_ll_Dave2D_Tasks, p_list_entry); - lv_free(p_list_entry); - } - -#if LV_USE_OS - status = lv_mutex_unlock(&xd2Semaphore); - LV_ASSERT(LV_RESULT_OK == status); -#endif -} - -#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d.h b/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d.h deleted file mode 100644 index 2deaeb4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d.h +++ /dev/null @@ -1,105 +0,0 @@ -/** - * @file lv_draw_dave2d.h - * - */ - -#ifndef LV_DRAW_DAVE2D_H -#define LV_DRAW_DAVE2D_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../../lv_conf_internal.h" -#if LV_USE_DRAW_DAVE2D -#include "../../lv_draw.h" -#include "../../lv_draw_private.h" -#include "hal_data.h" -#include "lv_draw_dave2d_utils.h" -#include "../../lv_draw_rect.h" -#include "../../lv_draw_line.h" -#include "../../lv_draw_arc.h" -#include "../../lv_draw_label.h" -#include "../../lv_draw_image.h" -#include "../../lv_draw_triangle.h" -#include "../../lv_draw_buf.h" - -/********************* - * DEFINES - *********************/ - -#define D2_RENDER_EACH_OPERATION (1) - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_draw_unit_t base_unit; - lv_draw_task_t * task_act; -#if LV_USE_OS - lv_thread_sync_t sync; - lv_thread_t thread; -#endif - uint32_t idx; - d2_device * d2_handle; - d2_renderbuffer * renderbuffer; -#if LV_USE_OS - lv_mutex_t * pd2Mutex; -#endif -} lv_draw_dave2d_unit_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_draw_dave2d_init(void); - -void lv_draw_dave2d_image(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords); - -void lv_draw_dave2d_fill(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); - -void lv_draw_dave2d_border(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_dave2d_box_shadow(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_dave2d_label(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords); - -void lv_draw_dave2d_arc(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords); - -void lv_draw_dave2d_line(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); - -void lv_draw_dave2d_layer(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords); - -void lv_draw_dave2d_triangle(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc); - -void lv_draw_dave2d_mask_rect(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_dave2d_transform(lv_draw_dave2d_unit_t * draw_unit, const lv_area_t * dest_area, const void * src_buf, - int32_t src_w, int32_t src_h, int32_t src_stride, - const lv_draw_image_dsc_t * draw_dsc, const lv_draw_image_sup_t * sup, lv_color_format_t cf, void * dest_buf); - -/*********************** - * GLOBAL VARIABLES - ***********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_DAVE2D*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_arc.c b/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_arc.c deleted file mode 100644 index 71e03af..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_arc.c +++ /dev/null @@ -1,188 +0,0 @@ -#include "lv_draw_dave2d.h" -#if LV_USE_DRAW_DAVE2D - -#include "../../../misc/lv_area_private.h" - -void lv_draw_dave2d_arc(lv_draw_dave2d_unit_t * u, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) -{ - - uint32_t flags = 0; - int32_t sin_start; - int32_t cos_start; - int32_t sin_end; - int32_t cos_end; - d2_s32 result; - lv_area_t clipped_area; - lv_area_t buffer_area; - lv_point_t arc_centre; - int32_t x; - int32_t y; - - if(!lv_area_intersect(&clipped_area, coords, u->base_unit.clip_area)) return; - - x = 0 - u->base_unit.target_layer->buf_area.x1; - y = 0 - u->base_unit.target_layer->buf_area.y1; - - buffer_area = u->base_unit.target_layer->buf_area; - - arc_centre = dsc->center; - arc_centre.x = arc_centre.x - buffer_area.x1; - arc_centre.y = arc_centre.y - buffer_area.y1; - - lv_area_move(&clipped_area, x, y); - lv_area_move(&buffer_area, x, y); - - // - // If both angles are equal (e.g. 0 and 0 or 180 and 180) nothing has to be done - // - if(dsc->start_angle == dsc->end_angle) { - return; // Nothing to do, no angle - no arc - } - -#if LV_USE_OS - lv_result_t status; - status = lv_mutex_lock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif - -#if D2_RENDER_EACH_OPERATION - d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); -#endif - - // - // Generate render operations - // - d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); - - d2_setalpha(u->d2_handle, dsc->opa); - - d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->color)); - - result = d2_cliprect(u->d2_handle, (d2_border)clipped_area.x1, (d2_border)clipped_area.y1, (d2_border)clipped_area.x2, - (d2_border)clipped_area.y2); - LV_ASSERT(D2_OK == result); - - if(360 <= LV_ABS(dsc->start_angle - dsc->end_angle)) { - d2_rendercircle(u->d2_handle, - (d2_point)D2_FIX4(arc_centre.x), - (d2_point) D2_FIX4(arc_centre.y), - (d2_width) D2_FIX4(dsc->radius - dsc->width / 2), - (d2_width) D2_FIX4(dsc->width)); - } - else { //An ARC, not a full circle - // - // If the difference between both is larger than 180 degrees we must use the concave flag - // - /** Set d2_wf_concave flag if the pie object to draw is concave shape. */ - if((LV_ABS(dsc->start_angle - dsc->end_angle) > 180) || ((dsc->end_angle < dsc->start_angle) && - (LV_ABS(dsc->start_angle - (dsc->end_angle + 360)) > 180))) { - flags = d2_wf_concave; - } - else { - flags = 0; - } - - sin_start = lv_trigo_sin((int16_t)dsc->start_angle); - cos_start = lv_trigo_cos((int16_t)dsc->start_angle); - - sin_end = lv_trigo_sin((int16_t)dsc->end_angle); - cos_end = lv_trigo_cos((int16_t)dsc->end_angle); - - bool draw_arc; - lv_area_t arc_area; - lv_area_t clip_arc; - lv_point_t start_point; - lv_point_t end_point; - - start_point.x = arc_centre.x + (int16_t)(((dsc->radius) * cos_start) >> LV_TRIGO_SHIFT); - start_point.y = arc_centre.y + (int16_t)(((dsc->radius) * sin_start) >> LV_TRIGO_SHIFT); - - end_point.x = arc_centre.x + (int16_t)(((dsc->radius) * cos_end) >> LV_TRIGO_SHIFT); - end_point.y = arc_centre.y + (int16_t)(((dsc->radius) * sin_end) >> LV_TRIGO_SHIFT); - - arc_area.x1 = LV_MIN3(start_point.x, end_point.x, arc_centre.x); - arc_area.y1 = LV_MIN3(start_point.y, end_point.y, arc_centre.y); - - arc_area.x2 = LV_MAX3(start_point.x, end_point.x, arc_centre.x); - arc_area.y2 = LV_MAX3(start_point.y, end_point.y, arc_centre.y); - - /* 0 degrees */ - if((dsc->end_angle < dsc->start_angle) || ((dsc->start_angle < 360) && (dsc->end_angle > 360))) { - arc_area.x2 = arc_centre.x + dsc->radius; - } - - /* 90 degrees */ - if(((dsc->end_angle > 90) && (dsc->start_angle < 90)) || ((dsc->start_angle < 90) && - (dsc->end_angle < dsc->start_angle))) { - arc_area.y2 = arc_centre.y + dsc->radius; - } - - /* 180 degrees */ - if(((dsc->end_angle > 180) && (dsc->start_angle < 180)) || ((dsc->start_angle < 180) && - (dsc->end_angle < dsc->start_angle))) { - arc_area.x1 = arc_centre.x - dsc->radius; - } - - /* 270 degrees */ - if(((dsc->end_angle > 270) && (dsc->start_angle < 270)) || ((dsc->start_angle < 270) && - (dsc->end_angle < dsc->start_angle))) { - arc_area.y1 = arc_centre.y - dsc->radius; - } - - draw_arc = lv_area_intersect(&clip_arc, &arc_area, &clipped_area); - - if(draw_arc) { - - result = d2_renderwedge(u->d2_handle, - (d2_point)D2_FIX4(arc_centre.x), - (d2_point) D2_FIX4(arc_centre.y), - (d2_width) D2_FIX4(dsc->radius - dsc->width / 2), - (d2_width) D2_FIX4(dsc->width), - -(d2_s32)(sin_start << 1), - (d2_s32)(cos_start << 1), - (d2_s32)(sin_end << 1), - -(d2_s32)(cos_end << 1), - flags); - LV_ASSERT(D2_OK == result); - - if(dsc->rounded) { - lv_point_t start_coord; - lv_point_t end_coord; - - start_coord.x = arc_centre.x + (int16_t)(((dsc->radius - dsc->width / 2) * cos_start) >> LV_TRIGO_SHIFT); - start_coord.y = arc_centre.y + (int16_t)(((dsc->radius - dsc->width / 2) * sin_start) >> LV_TRIGO_SHIFT); - - /** Render a circle. */ - d2_rendercircle(u->d2_handle, - (d2_point) D2_FIX4((uint16_t)(start_coord.x)), - (d2_point) D2_FIX4((uint16_t)(start_coord.y)), - (d2_width) D2_FIX4(dsc->width / 2), 0); - - end_coord.x = arc_centre.x + (int16_t)(((dsc->radius - dsc->width / 2) * cos_end) >> LV_TRIGO_SHIFT); - end_coord.y = arc_centre.y + (int16_t)(((dsc->radius - dsc->width / 2) * sin_end) >> LV_TRIGO_SHIFT); - - /** Render a circle. */ - d2_rendercircle(u->d2_handle, - (d2_point) D2_FIX4((uint16_t)(end_coord.x)), - (d2_point) D2_FIX4((uint16_t)(end_coord.y)), - (d2_width) D2_FIX4(dsc->width / 2), 0); - } - } - } - - // - // Execute render operations - // - -#if D2_RENDER_EACH_OPERATION - d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); - d2_flushframe(u->d2_handle); -#endif - -#if LV_USE_OS - status = lv_mutex_unlock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif -} - -#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_border.c b/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_border.c deleted file mode 100644 index e402e7f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_border.c +++ /dev/null @@ -1,417 +0,0 @@ -#include "lv_draw_dave2d.h" -#if LV_USE_DRAW_DAVE2D - -#include "../../../misc/lv_area_private.h" - -static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * draw_unit, const lv_area_t * outer_area, - const lv_area_t * inner_area, - int32_t rout, int32_t rin, lv_color_t color, lv_opa_t opa); - -static void dave2d_draw_border_simple(lv_draw_dave2d_unit_t * draw_unit, const lv_area_t * outer_area, - const lv_area_t * inner_area, - lv_color_t color, lv_opa_t opa); - -void lv_draw_dave2d_border(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, - const lv_area_t * coords) -{ - if(dsc->opa <= LV_OPA_MIN) return; - if(dsc->width == 0) return; - if(dsc->side == LV_BORDER_SIDE_NONE) return; - - int32_t coords_w = lv_area_get_width(coords); - int32_t coords_h = lv_area_get_height(coords); - int32_t rout = dsc->radius; - int32_t short_side = LV_MIN(coords_w, coords_h); - if(rout > short_side >> 1) rout = short_side >> 1; - - /*Get the inner area*/ - lv_area_t area_inner; - lv_area_copy(&area_inner, coords); - area_inner.x1 += ((dsc->side & LV_BORDER_SIDE_LEFT) ? dsc->width : - (dsc->width + rout)); - area_inner.x2 -= ((dsc->side & LV_BORDER_SIDE_RIGHT) ? dsc->width : - (dsc->width + rout)); - area_inner.y1 += ((dsc->side & LV_BORDER_SIDE_TOP) ? dsc->width : - (dsc->width + rout)); - area_inner.y2 -= ((dsc->side & LV_BORDER_SIDE_BOTTOM) ? dsc->width : - (dsc->width + rout)); - - int32_t rin = rout - dsc->width; - if(rin < 0) rin = 0; - - if(rout == 0 && rin == 0) { - dave2d_draw_border_simple(draw_unit, coords, &area_inner, dsc->color, dsc->opa); - } - else { - dave2d_draw_border_complex(draw_unit, coords, &area_inner, rout, rin, dsc->color, dsc->opa); - } - -} - -static void dave2d_draw_border_simple(lv_draw_dave2d_unit_t * u, const lv_area_t * outer_area, - const lv_area_t * inner_area, - lv_color_t color, lv_opa_t opa) - -{ - - lv_area_t clip_area; - lv_area_t local_outer_area; - lv_area_t local_inner_area; - int32_t x; - int32_t y; - bool is_common; - - is_common = lv_area_intersect(&clip_area, outer_area, u->base_unit.clip_area); - if(!is_common) return; - -#if LV_USE_OS - lv_result_t status; - status = lv_mutex_lock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif - - local_outer_area = *outer_area; - local_inner_area = *inner_area; - - x = 0 - u->base_unit.target_layer->buf_area.x1; - y = 0 - u->base_unit.target_layer->buf_area.y1; - - lv_area_move(&clip_area, x, y); - lv_area_move(&local_outer_area, x, y); - lv_area_move(&local_inner_area, x, y); - -#if D2_RENDER_EACH_OPERATION - d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); -#endif - // - // Generate render operations - // - - d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); - - d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(color)); - d2_setalpha(u->d2_handle, opa); - d2_cliprect(u->d2_handle, (d2_border)clip_area.x1, (d2_border)clip_area.y1, (d2_border)clip_area.x2, - (d2_border)clip_area.y2); - - lv_area_t a; - - bool top_side = local_outer_area.y1 <= local_inner_area.y1; - bool bottom_side = local_outer_area.y2 >= local_inner_area.y2; - bool left_side = local_outer_area.x1 <= local_inner_area.x1; - bool right_side = local_outer_area.x2 >= local_inner_area.x2; - - /*Top*/ - a.x1 = local_outer_area.x1; - a.x2 = local_outer_area.x2; - a.y1 = local_outer_area.y1; - a.y2 = local_inner_area.y1 - 1; - if(top_side) { - d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(a.x1), - (d2_point)D2_FIX4(a.y1), - (d2_point)D2_FIX4(lv_area_get_width(&a)), - (d2_point)D2_FIX4(lv_area_get_height(&a))); - } - - /*Bottom*/ - a.y1 = local_inner_area.y2 + 1; - a.y2 = local_outer_area.y2; - if(bottom_side) { - d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(a.x1), - (d2_point)D2_FIX4(a.y1), - (d2_point)D2_FIX4(lv_area_get_width(&a)), - (d2_point)D2_FIX4(lv_area_get_height(&a))); - } - - /*Left*/ - a.x1 = local_outer_area.x1; - a.x2 = local_inner_area.x1 - 1; - a.y1 = (top_side) ? local_inner_area.y1 : local_outer_area.y1; - a.y2 = (bottom_side) ? local_inner_area.y2 : local_outer_area.y2; - if(left_side) { - d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(a.x1), - (d2_point)D2_FIX4(a.y1), - (d2_point)D2_FIX4(lv_area_get_width(&a)), - (d2_point)D2_FIX4(lv_area_get_height(&a))); - } - - /*Right*/ - a.x1 = local_inner_area.x2 + 1; - a.x2 = local_outer_area.x2; - if(right_side) { - d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(a.x1), - (d2_point)D2_FIX4(a.y1), - (d2_point)D2_FIX4(lv_area_get_width(&a)), - (d2_point)D2_FIX4(lv_area_get_height(&a))); - } - - // - // Execute render operations - // -#if D2_RENDER_EACH_OPERATION - d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); - d2_flushframe(u->d2_handle); -#endif - -#if LV_USE_OS - status = lv_mutex_unlock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif -} - -static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * u, const lv_area_t * orig_outer_area, - const lv_area_t * orig_inner_area, - int32_t rout, int32_t rin, lv_color_t color, lv_opa_t opa) -{ - /*Get clipped draw area which is the real draw area. - *It is always the same or inside `coords`*/ - lv_area_t draw_area; - lv_area_t outer_area; - lv_area_t inner_area; - int32_t x; - int32_t y; - d2_s32 result; - d2_u32 flags = 0; - - outer_area = *orig_outer_area; - inner_area = *orig_inner_area; - - if(!lv_area_intersect(&draw_area, &outer_area, u->base_unit.clip_area)) return; - -#if LV_USE_OS - lv_result_t status; - status = lv_mutex_lock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif - - x = 0 - u->base_unit.target_layer->buf_area.x1; - y = 0 - u->base_unit.target_layer->buf_area.y1; - - lv_area_move(&draw_area, x, y); - lv_area_move(&outer_area, x, y); - lv_area_move(&inner_area, x, y); - -#if D2_RENDER_EACH_OPERATION - d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); -#endif - // - // Generate render operations - // - - d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); - - d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(color)); - d2_setalpha(u->d2_handle, opa); - d2_cliprect(u->d2_handle, (d2_border)draw_area.x1, (d2_border)draw_area.y1, (d2_border)draw_area.x2, - (d2_border)draw_area.y2); - - lv_area_t blend_area; - /*Calculate the x and y coordinates where the straight parts area are */ - lv_area_t core_area; - core_area.x1 = LV_MAX(outer_area.x1 + rout, inner_area.x1); - core_area.x2 = LV_MIN(outer_area.x2 - rout, inner_area.x2); - core_area.y1 = LV_MAX(outer_area.y1 + rout, inner_area.y1); - core_area.y2 = LV_MIN(outer_area.y2 - rout, inner_area.y2); - - bool top_side = outer_area.y1 <= inner_area.y1; - bool bottom_side = outer_area.y2 >= inner_area.y2; - - /*No masks*/ - bool left_side = outer_area.x1 <= inner_area.x1; - bool right_side = outer_area.x2 >= inner_area.x2; - - /*Draw the straight lines first */ - if(top_side) { - blend_area.x1 = core_area.x1; - blend_area.x2 = core_area.x2; - blend_area.y1 = outer_area.y1; - blend_area.y2 = inner_area.y1 - 1; - d2_renderbox(u->d2_handle, - (d2_point)D2_FIX4(blend_area.x1), - (d2_point)D2_FIX4(blend_area.y1), - (d2_point)D2_FIX4(lv_area_get_width(&blend_area)), - (d2_point)D2_FIX4(lv_area_get_height(&blend_area))); - } - - if(bottom_side) { - blend_area.x1 = core_area.x1; - blend_area.x2 = core_area.x2; - blend_area.y1 = inner_area.y2 + 1; - blend_area.y2 = outer_area.y2; - d2_renderbox(u->d2_handle, - (d2_point)D2_FIX4(blend_area.x1), - (d2_point)D2_FIX4(blend_area.y1), - (d2_point)D2_FIX4(lv_area_get_width(&blend_area)), - (d2_point)D2_FIX4(lv_area_get_height(&blend_area))); - } - - if(left_side) { - blend_area.x1 = outer_area.x1; - blend_area.x2 = inner_area.x1 - 1; - blend_area.y1 = core_area.y1; - blend_area.y2 = core_area.y2; - d2_renderbox(u->d2_handle, - (d2_point)D2_FIX4(blend_area.x1), - (d2_point)D2_FIX4(blend_area.y1), - (d2_point)D2_FIX4(lv_area_get_width(&blend_area)), - (d2_point)D2_FIX4(lv_area_get_height(&blend_area))); - } - - if(right_side) { - blend_area.x1 = inner_area.x2 + 1; - blend_area.x2 = outer_area.x2; - blend_area.y1 = core_area.y1; - blend_area.y2 = core_area.y2; - d2_renderbox(u->d2_handle, - (d2_point)D2_FIX4(blend_area.x1), - (d2_point)D2_FIX4(blend_area.y1), - (d2_point)D2_FIX4(lv_area_get_width(&blend_area)), - (d2_point)D2_FIX4(lv_area_get_height(&blend_area))); - } - - /*Draw the corners*/ - int32_t blend_w; - /*Left corners*/ - blend_area.x1 = draw_area.x1; - blend_area.x2 = LV_MIN(draw_area.x2, core_area.x1 - 1); - - blend_w = lv_area_get_width(&blend_area); - - if(blend_w > 0) { - d2_s32 aa; - aa = d2_getantialiasing(u->d2_handle); - d2_setantialiasing(u->d2_handle, 0); //Don't blend with the background according to coverage value - - if(left_side || top_side) { - lv_area_t arc_area; - lv_area_t clip_arc; - - arc_area.x1 = core_area.x1 - rout; - arc_area.y1 = core_area.y1 - rout; - arc_area.x2 = core_area.x1; - arc_area.y2 = core_area.y1; - - if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { - d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, - (d2_border)clip_arc.y2); - result = d2_renderwedge(u->d2_handle, - (d2_point)D2_FIX4(core_area.x1), - (d2_point) D2_FIX4(core_area.y1), - (d2_width) D2_FIX4(rout), - (d2_width) D2_FIX4((rout - rin)), - (d2_s32) D2_FIX16(0), // 180 Degrees - (d2_s32) D2_FIX16((int16_t) -1), - (d2_s32) D2_FIX16((int16_t) -1),//( 270 Degrees - (d2_s32) D2_FIX16(0), - flags); - LV_ASSERT(D2_OK == result); - } - - } - - if(left_side || bottom_side) { - lv_area_t arc_area; - lv_area_t clip_arc; - - arc_area.x1 = core_area.x1 - rout; - arc_area.y1 = core_area.y2; - arc_area.x2 = core_area.x1; - arc_area.y2 = core_area.y2 + rout; - - if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { - - d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, - (d2_border)clip_arc.y2); - result = d2_renderwedge(u->d2_handle, - (d2_point)D2_FIX4(core_area.x1), - (d2_point) D2_FIX4(core_area.y2), - (d2_width) D2_FIX4(rout), - (d2_width) D2_FIX4((rout - rin)), - (d2_s32) D2_FIX16((int16_t) -1), //90 degrees - (d2_s32) D2_FIX16(0), - (d2_s32) D2_FIX16(0), //180 degrees - (d2_s32) D2_FIX16(1), - flags); - LV_ASSERT(D2_OK == result); - } - } - - /*Right corners*/ - blend_area.x1 = LV_MAX(draw_area.x1, blend_area.x2 + 1); /*To not overlap with the left side*/ - blend_area.x1 = LV_MAX(draw_area.x1, core_area.x2 + 1); - - blend_area.x2 = draw_area.x2; - blend_w = lv_area_get_width(&blend_area); - - if(blend_w > 0) { - if(right_side || top_side) { - - lv_area_t arc_area; - lv_area_t clip_arc; - - arc_area.x1 = core_area.x2; - arc_area.y1 = core_area.y1 - rout; - arc_area.x2 = core_area.x2 + rout; - arc_area.y2 = core_area.y1; - - if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { - - d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, - (d2_border)clip_arc.y2); - result = d2_renderwedge(u->d2_handle, - (d2_point)D2_FIX4(core_area.x2), - (d2_point) D2_FIX4(core_area.y1), - (d2_width) D2_FIX4(rout), - (d2_width) D2_FIX4((rout - rin)), - (d2_s32) D2_FIX16((int16_t)1), // 270 Degrees - (d2_s32) D2_FIX16(0), - (d2_s32) D2_FIX16(0),// 0 degrees - (d2_s32) D2_FIX16(-1), - flags); - LV_ASSERT(D2_OK == result); - } - - } - - if(right_side || bottom_side) { - lv_area_t arc_area; - lv_area_t clip_arc; - - arc_area.x1 = core_area.x2; - arc_area.y1 = core_area.y2; - arc_area.x2 = core_area.x2 + rout; - arc_area.y2 = core_area.y2 + rout; - - if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { - - d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, - (d2_border)clip_arc.y2); - result = d2_renderwedge(u->d2_handle, - (d2_point)D2_FIX4(core_area.x2), - (d2_point) D2_FIX4(core_area.y2), - (d2_width) D2_FIX4(rout), - (d2_width) D2_FIX4((rout - rin)), - (d2_s32) D2_FIX16(0),// 0 degrees - (d2_s32) D2_FIX16(1), - (d2_s32) D2_FIX16(1),// 90 degrees - (d2_s32) D2_FIX16(0), - flags); - LV_ASSERT(D2_OK == result); - } - } - } - d2_setantialiasing(u->d2_handle, aa); //restore original setting - } - - // - // Execute render operations - // -#if D2_RENDER_EACH_OPERATION - d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); - d2_flushframe(u->d2_handle); -#endif - -#if LV_USE_OS - status = lv_mutex_unlock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif - -} - -#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_fill.c b/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_fill.c deleted file mode 100644 index 546dac3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_fill.c +++ /dev/null @@ -1,310 +0,0 @@ -#include "lv_draw_dave2d.h" -#if LV_USE_DRAW_DAVE2D - -#include "../../../misc/lv_area_private.h" - -void lv_draw_dave2d_fill(lv_draw_dave2d_unit_t * u, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) -{ - lv_area_t draw_area; - lv_area_t coordinates; - bool is_common; - int32_t x; - int32_t y; - d2_u8 current_alpha_mode = 0; - d2_s32 result; - d2_u32 flags = 0; - - lv_point_t arc_centre; - - is_common = lv_area_intersect(&draw_area, coords, u->base_unit.clip_area); - if(!is_common) return; - -#if LV_USE_OS - lv_result_t status; - status = lv_mutex_lock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif - - lv_area_copy(&coordinates, coords); - - x = 0 - u->base_unit.target_layer->buf_area.x1; - y = 0 - u->base_unit.target_layer->buf_area.y1; - - lv_area_move(&draw_area, x, y); - lv_area_move(&coordinates, x, y); - - // - // Generate render operations - // -#if D2_RENDER_EACH_OPERATION - d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); -#endif - - d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); - - if(LV_GRAD_DIR_NONE != dsc->grad.dir) { - float a1; - float a2; - - float y1; - float y2; - - float y3; - float y0; - int16_t y0_i ; - int16_t y3_i ; - - if(LV_GRAD_DIR_VER == dsc->grad.dir) { - a1 = dsc->grad.stops[0].opa; - a2 = dsc->grad.stops[dsc->grad.stops_count - 1].opa; - - y1 = (float)LV_MIN(coordinates.y1, coordinates.y2); - y2 = (float)LV_MAX(coordinates.y1, coordinates.y2); - - if(a1 < a2) { - /* TODO */ - LV_ASSERT(0); - y0 = 0.0f;//silence the compiler warning - y3 = 0.0f; - - } - else { - y0 = y2 - ((y2 - y1) / (a2 - a1) * (a2)); //point where alpha is 0 - y3 = y1 + ((y2 - y1) / (a2 - a1) * (255 - a1)); //point where alpha is 255 - } - - y0_i = (int16_t)y0; - y3_i = (int16_t)y3; - - d2_setalphagradient(u->d2_handle, 0, (d2_point)D2_FIX4(0), (d2_point)D2_FIX4(y0_i), (d2_point)D2_FIX4(0), - (d2_point)D2_FIX4((y3_i - y0_i))); - } - else if(LV_GRAD_DIR_HOR == dsc->grad.dir) { - /* TODO */ - LV_ASSERT(0); - - float x1; - float x2; - - float x3; - float x0; - int16_t x0_i ; - int16_t x3_i ; - - a1 = dsc->grad.stops[0].opa; - a2 = dsc->grad.stops[dsc->grad.stops_count - 1].opa; - - x1 = (float)LV_MIN(coordinates.x1, coordinates.x2); - x2 = (float)LV_MAX(coordinates.x1, coordinates.x2); - - if(a1 < a2) { - /* TODO */ - LV_ASSERT(0); - x0 = 0.0f;//silence the compiler warning - x3 = 0.0f; - - } - else { - x0 = x2 - ((x2 - x1) / (a2 - a1) * (a2)); //point where alpha is 0 - x3 = x1 + ((x2 - x1) / (a2 - a1) * (255 - a1)); //point where alpha is 255 - } - - x0_i = (int16_t)x0; - x3_i = (int16_t)x3; - - d2_setalphagradient(u->d2_handle, 0, (d2_point)D2_FIX4(x0_i), (d2_point)D2_FIX4(0), (d2_point)D2_FIX4(x3_i - x0_i), - (d2_point)D2_FIX4((0))); - } - - current_alpha_mode = d2_getalphamode(u->d2_handle); - d2_setfillmode(u->d2_handle, d2_fm_color); - d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->grad.stops[0].color)); - d2_setalphamode(u->d2_handle, d2_am_gradient1); - } - else { - d2_setfillmode(u->d2_handle, d2_fm_color); //default - d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->color)); - d2_setalpha(u->d2_handle, dsc->opa); - } - - d2_cliprect(u->d2_handle, (d2_border)draw_area.x1, (d2_border)draw_area.y1, (d2_border)draw_area.x2, - (d2_border)draw_area.y2); - - if(dsc->radius == 0) { - - d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(coordinates.x1), - (d2_point)D2_FIX4(coordinates.y1), - (d2_point)D2_FIX4(lv_area_get_width(&coordinates)), - (d2_point)D2_FIX4(lv_area_get_height(&coordinates))); - } - else { - /*Get the real radius. Can't be larger than the half of the shortest side */ - int32_t coords_bg_w = lv_area_get_width(&coordinates); - int32_t coords_bg_h = lv_area_get_height(&coordinates); - int32_t short_side = LV_MIN(coords_bg_w, coords_bg_h); - int32_t radius = LV_MIN(dsc->radius, short_side >> 1); - - arc_centre.x = coordinates.x1 + radius; - arc_centre.y = coordinates.y1 + radius; - - if(((2 * radius) == coords_bg_w) && ((2 * radius) == coords_bg_h)) { - result = d2_rendercircle(u->d2_handle, - (d2_point)D2_FIX4(arc_centre.x), - (d2_point) D2_FIX4(arc_centre.y), - (d2_width) D2_FIX4(radius), - (d2_width) D2_FIX4(0)); - LV_ASSERT(D2_OK == result); - } - else { - - lv_area_t arc_area; - lv_area_t clip_arc; - arc_centre.x = coordinates.x1 + radius; - arc_centre.y = coordinates.y1 + radius; - - arc_area.x1 = coordinates.x1; - arc_area.y1 = coordinates.y1; - arc_area.x2 = coordinates.x1 + radius; - arc_area.y2 = coordinates.y1 + radius; - - if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { - - d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, - (d2_border)clip_arc.y2); - - // d2_renderwedge internally changes the clip rectangle, only draw it if it is in side the current clip rectangle - result = d2_renderwedge(u->d2_handle, - (d2_point)D2_FIX4(arc_centre.x), - (d2_point) D2_FIX4(arc_centre.y), - (d2_width) D2_FIX4(radius), - (d2_width) D2_FIX4(0), - (d2_s32) D2_FIX16(0), // 180 Degrees - (d2_s32) D2_FIX16((int16_t) -1), - (d2_s32) D2_FIX16((int16_t) -1),//( 270 Degrees - (d2_s32) D2_FIX16(0), - flags); - LV_ASSERT(D2_OK == result); - } - - arc_centre.x = coordinates.x2 - radius; - arc_centre.y = coordinates.y1 + radius; - - arc_area.x1 = coordinates.x2 - radius; - arc_area.y1 = coordinates.y1; - arc_area.x2 = coordinates.x2; - arc_area.y2 = coordinates.y1 + radius; - - if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { - d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, - (d2_border)clip_arc.y2); - - result = d2_renderwedge(u->d2_handle, - (d2_point)D2_FIX4(arc_centre.x), - (d2_point) D2_FIX4(arc_centre.y), - (d2_width) D2_FIX4(radius), - (d2_width) D2_FIX4(0), - (d2_s32) D2_FIX16((int16_t)1), // 270 Degrees - (d2_s32) D2_FIX16(0), - (d2_s32) D2_FIX16(0),// 0 degrees - (d2_s32) D2_FIX16(-1), - flags); - LV_ASSERT(D2_OK == result); - } - - arc_centre.x = coordinates.x2 - radius; - arc_centre.y = coordinates.y2 - radius; - - arc_area.x1 = coordinates.x2 - radius; - arc_area.y1 = coordinates.y2 - radius; - arc_area.x2 = coordinates.x2; - arc_area.y2 = coordinates.y2; - - if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { - d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, - (d2_border)clip_arc.y2); - - result = d2_renderwedge(u->d2_handle, - (d2_point)D2_FIX4(arc_centre.x), - (d2_point) D2_FIX4(arc_centre.y), - (d2_width) D2_FIX4(radius), - (d2_width) D2_FIX4(0), - (d2_s32) D2_FIX16(0),// 0 degrees - (d2_s32) D2_FIX16(1), - (d2_s32) D2_FIX16(1),// 90 degrees - (d2_s32) D2_FIX16(0), - flags); - LV_ASSERT(D2_OK == result); - } - - arc_centre.x = coordinates.x1 + radius; - arc_centre.y = coordinates.y2 - radius; - - arc_area.x1 = coordinates.x1; - arc_area.y1 = coordinates.y2 - radius; - arc_area.x2 = coordinates.x1 + radius; - arc_area.y2 = coordinates.y2; - - if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { - d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, - (d2_border)clip_arc.y2); - - result = d2_renderwedge(u->d2_handle, - (d2_point)D2_FIX4(arc_centre.x), - (d2_point) D2_FIX4(arc_centre.y), - (d2_width) D2_FIX4(radius), - (d2_width) D2_FIX4(0), - (d2_s32) D2_FIX16((int16_t) -1), //90 degrees - (d2_s32) D2_FIX16(0), - (d2_s32) D2_FIX16(0), //180 degrees - (d2_s32) D2_FIX16(1), - flags); - LV_ASSERT(D2_OK == result); - } - - /* reset the clip rectangle */ - d2_cliprect(u->d2_handle, (d2_border)draw_area.x1, (d2_border)draw_area.y1, (d2_border)draw_area.x2, - (d2_border)draw_area.y2); - - result = d2_renderbox(u->d2_handle, - (d2_width)D2_FIX4(coordinates.x1 + radius), - (d2_width)D2_FIX4(coordinates.y1), - (d2_width)D2_FIX4(lv_area_get_width(&coordinates) - (2 * radius)), - (d2_width)D2_FIX4(lv_area_get_height(&coordinates))); - LV_ASSERT(D2_OK == result); - - result = d2_renderbox(u->d2_handle, - (d2_width)D2_FIX4(coordinates.x1), - (d2_width)D2_FIX4(coordinates.y1 + radius), - (d2_width)D2_FIX4(radius), - (d2_width)D2_FIX4(lv_area_get_height(&coordinates) - (2 * radius))); - LV_ASSERT(D2_OK == result); - - result = d2_renderbox(u->d2_handle, - (d2_width)D2_FIX4(coordinates.x2 - radius), - (d2_width)D2_FIX4(coordinates.y1 + radius), - (d2_width)D2_FIX4(radius), - (d2_width)D2_FIX4(lv_area_get_height(&coordinates) - (2 * radius))); - LV_ASSERT(D2_OK == result); - } - } - - // - // Execute render operations - // -#if D2_RENDER_EACH_OPERATION - d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); - d2_flushframe(u->d2_handle); -#endif - - if(LV_GRAD_DIR_NONE != dsc->grad.dir) { - d2_setalphamode(u->d2_handle, current_alpha_mode); - d2_setfillmode(u->d2_handle, d2_fm_color); //default - } - -#if LV_USE_OS - status = lv_mutex_unlock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif -} - -#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_image.c b/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_image.c deleted file mode 100644 index ee24380..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_image.c +++ /dev/null @@ -1,328 +0,0 @@ -/** - * @file lv_draw_dave2d_image.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_dave2d.h" -#if LV_USE_DRAW_DAVE2D - -#include "../../lv_image_decoder_private.h" -#include "../../lv_draw_image_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void img_draw_core(lv_draw_unit_t * u_base, const lv_draw_image_dsc_t * draw_dsc, - const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, - const lv_area_t * img_coords, const lv_area_t * clipped_img_area); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_dave2d_image(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords) -{ - if(!draw_dsc->tile) { - lv_draw_image_normal_helper((lv_draw_unit_t *)draw_unit, draw_dsc, coords, img_draw_core); - } - else { - lv_draw_image_tiled_helper((lv_draw_unit_t *)draw_unit, draw_dsc, coords, img_draw_core); - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void img_draw_core(lv_draw_unit_t * u_base, const lv_draw_image_dsc_t * draw_dsc, - const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, - const lv_area_t * img_coords, const lv_area_t * clipped_img_area) -{ - - lv_draw_dave2d_unit_t * u = (lv_draw_dave2d_unit_t *)u_base; - - (void)sup; //remove warning about unused parameter - - bool transformed = draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || - draw_dsc->scale_y != LV_SCALE_NONE ? true : false; - - const lv_draw_buf_t * decoded = decoder_dsc->decoded; - const uint8_t * src_buf = decoded->data; - const lv_image_header_t * header = &decoded->header; - uint32_t img_stride = decoded->header.stride; - lv_color_format_t cf = decoded->header.cf; - lv_area_t buffer_area; - lv_area_t draw_area; - lv_area_t clipped_area; - int32_t x; - int32_t y; - d2_u8 a_texture_op = d2_to_one; - d2_u8 r_texture_op = d2_to_copy; - d2_u8 g_texture_op = d2_to_copy; - d2_u8 b_texture_op = d2_to_copy; - d2_u8 current_fill_mode; - d2_u32 src_blend_mode; - d2_u32 dst_blend_mode; - void * p_intermediate_buf = NULL; - -#if LV_USE_OS - lv_result_t status; - status = lv_mutex_lock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif - - buffer_area = u->base_unit.target_layer->buf_area; - draw_area = *img_coords; - clipped_area = *clipped_img_area; - - x = 0 - u->base_unit.target_layer->buf_area.x1; - y = 0 - u->base_unit.target_layer->buf_area.y1; - - lv_area_move(&draw_area, x, y); - lv_area_move(&buffer_area, x, y); - lv_area_move(&clipped_area, x, y); - - /* Generate render operations*/ -#if D2_RENDER_EACH_OPERATION - d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); -#endif - - current_fill_mode = d2_getfillmode(u->d2_handle); - a_texture_op = d2_gettextureoperationa(u->d2_handle); - r_texture_op = d2_gettextureoperationr(u->d2_handle); - g_texture_op = d2_gettextureoperationg(u->d2_handle); - b_texture_op = d2_gettextureoperationb(u->d2_handle); - src_blend_mode = d2_getblendmodesrc(u->d2_handle); - dst_blend_mode = d2_getblendmodedst(u->d2_handle); - -#if defined(RENESAS_CORTEX_M85) -#if (BSP_CFG_DCACHE_ENABLED) - d1_cacheblockflush(u->d2_handle, 0, src_buf, - img_stride * header->h); //Stride is in bytes, not pixels/texels -#endif -#endif - - if(LV_COLOR_FORMAT_RGB565A8 == cf) { - - lv_point_t p1[4] = { //Points in clockwise order - {0, 0}, - {header->w - 1, 0}, - {header->w - 1, header->h - 1}, - {0, header->h - 1}, - }; - - d2_s32 dxu1 = D2_FIX16(1); - d2_s32 dxv1 = D2_FIX16(0); - d2_s32 dyu1 = D2_FIX16(0); - d2_s32 dyv1 = D2_FIX16(1); - - uint32_t size = header->h * (header->w * lv_color_format_get_size(LV_COLOR_FORMAT_ARGB8888)); - p_intermediate_buf = lv_malloc(size); - - d2_framebuffer(u->d2_handle, - p_intermediate_buf, - (d2_s32)header->w, - (d2_u32)header->w, - (d2_u32)header->h, - lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(LV_COLOR_FORMAT_ARGB8888)); - - d2_cliprect(u->d2_handle, (d2_border)0, (d2_border)0, (d2_border)header->w - 1, - (d2_border)header->h - 1); - - d2_settexopparam(u->d2_handle, d2_cc_alpha, draw_dsc->opa, 0); - - d2_settextureoperation(u->d2_handle, d2_to_replace, d2_to_copy, d2_to_copy, d2_to_copy); - - d2_settexturemapping(u->d2_handle, D2_FIX4(p1[0].x), D2_FIX4(p1[0].y), D2_FIX16(0), D2_FIX16(0), dxu1, dxv1, dyu1, - dyv1); - d2_settexturemode(u->d2_handle, d2_tm_filter); - d2_setfillmode(u->d2_handle, d2_fm_texture); - - d2_settexture(u->d2_handle, (void *)src_buf, - (d2_s32)(img_stride / lv_color_format_get_size(LV_COLOR_FORMAT_RGB565)), - header->w, header->h, lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(LV_COLOR_FORMAT_RGB565)); - - d2_setblendmode(u->d2_handle, d2_bm_one, d2_bm_zero); - - d2_renderquad(u->d2_handle, - (d2_point)D2_FIX4(p1[0].x), - (d2_point)D2_FIX4(p1[0].y), - (d2_point)D2_FIX4(p1[1].x), - (d2_point)D2_FIX4(p1[1].y), - (d2_point)D2_FIX4(p1[2].x), - (d2_point)D2_FIX4(p1[2].y), - (d2_point)D2_FIX4(p1[3].x), - (d2_point)D2_FIX4(p1[3].y), - 0); - - d2_setblendmode(u->d2_handle, d2_bm_zero, d2_bm_one); //Keep the RGB data in the intermediate buffer - - d2_setalphablendmode(u->d2_handle, d2_bm_one, d2_bm_zero); //Write SRC alpha, i.e. A8 data - - d2_settextureoperation(u->d2_handle, d2_to_copy, d2_to_copy, d2_to_copy, d2_to_copy); - - d2_settexture(u->d2_handle, (void *)(src_buf + header->h * (header->w * lv_color_format_get_size( - LV_COLOR_FORMAT_RGB565))), - (d2_s32)(img_stride / lv_color_format_get_size(LV_COLOR_FORMAT_RGB565)), - header->w, header->h, lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(LV_COLOR_FORMAT_A8)); - - d2_renderquad(u->d2_handle, - (d2_point)D2_FIX4(p1[0].x), - (d2_point)D2_FIX4(p1[0].y), - (d2_point)D2_FIX4(p1[1].x), - (d2_point)D2_FIX4(p1[1].y), - (d2_point)D2_FIX4(p1[2].x), - (d2_point)D2_FIX4(p1[2].y), - (d2_point)D2_FIX4(p1[3].x), - (d2_point)D2_FIX4(p1[3].y), - 0); - - cf = LV_COLOR_FORMAT_ARGB8888; - src_buf = p_intermediate_buf; - img_stride = header->w * lv_color_format_get_size(cf); - - } - - d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); - - d2_cliprect(u->d2_handle, (d2_border)clipped_area.x1, (d2_border)clipped_area.y1, (d2_border)clipped_area.x2, - (d2_border)clipped_area.y2); - - d2_settexopparam(u->d2_handle, d2_cc_alpha, draw_dsc->opa, 0); - - if(LV_COLOR_FORMAT_RGB565 == cf) { - d2_settextureoperation(u->d2_handle, d2_to_replace, d2_to_copy, d2_to_copy, d2_to_copy); - } - else { //Formats with an alpha channel, - d2_settextureoperation(u->d2_handle, d2_to_copy, d2_to_copy, d2_to_copy, d2_to_copy); - } - - if(LV_BLEND_MODE_NORMAL == draw_dsc->blend_mode) { /**< Simply mix according to the opacity value*/ - d2_setblendmode(u->d2_handle, d2_bm_alpha, d2_bm_one_minus_alpha); //direct linear blend - } - else if(LV_BLEND_MODE_ADDITIVE == draw_dsc->blend_mode) { /**< Add the respective color channels*/ - /* TODO */ - d2_setblendmode(u->d2_handle, d2_bm_alpha, d2_bm_one); //Additive blending - } - else if(LV_BLEND_MODE_SUBTRACTIVE == draw_dsc->blend_mode) { /**< Subtract the foreground from the background*/ - /* TODO */ - } - else { //LV_BLEND_MODE_MULTIPLY, /**< Multiply the foreground and background*/ - /* TODO */ - } - - lv_point_t p[4] = { //Points in clockwise order - {0, 0}, - {header->w - 1, 0}, - {header->w - 1, header->h - 1}, - {0, header->h - 1}, - }; - - d2_settexture(u->d2_handle, (void *)src_buf, - (d2_s32)(img_stride / lv_color_format_get_size(cf)), - header->w, header->h, lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(cf)); - - d2_settexturemode(u->d2_handle, d2_tm_filter); - d2_setfillmode(u->d2_handle, d2_fm_texture); - - d2_s32 dxu = D2_FIX16(1); - d2_s32 dxv = D2_FIX16(0); - d2_s32 dyu = D2_FIX16(0); - d2_s32 dyv = D2_FIX16(1); - - if(transformed) { - lv_point_transform(&p[0], draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, &draw_dsc->pivot, true); - lv_point_transform(&p[1], draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, &draw_dsc->pivot, true); - lv_point_transform(&p[2], draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, &draw_dsc->pivot, true); - lv_point_transform(&p[3], draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, &draw_dsc->pivot, true); - - int32_t angle_limited = draw_dsc->rotation; - if(angle_limited > 3600) angle_limited -= 3600; - if(angle_limited < 0) angle_limited += 3600; - - int32_t angle_low = angle_limited / 10; - - if(0 != angle_low) { - /* LV_TRIGO_SHIFT is 15, so only need to shift by 1 to get 16:16 fixed point */ - dxv = (d2_s32)((1 << 1) * lv_trigo_sin((int16_t)angle_low)); - dxu = (d2_s32)((1 << 1) * lv_trigo_cos((int16_t)angle_low)); - dyv = (d2_s32)((1 << 1) * lv_trigo_sin((int16_t)angle_low + 90)); - dyu = (d2_s32)((1 << 1) * lv_trigo_cos((int16_t)angle_low + 90)); - } - - if(LV_SCALE_NONE != draw_dsc->scale_x) { - dxu = (dxu * LV_SCALE_NONE) / draw_dsc->scale_x; - dxv = (dxv * LV_SCALE_NONE) / draw_dsc->scale_x; - } - if(LV_SCALE_NONE != draw_dsc->scale_y) { - dyu = (dyu * LV_SCALE_NONE) / draw_dsc->scale_y; - dyv = (dyv * LV_SCALE_NONE) / draw_dsc->scale_y; - } - } - - p[0].x += draw_area.x1; - p[0].y += draw_area.y1; - p[1].x += draw_area.x1; - p[1].y += draw_area.y1; - p[2].x += draw_area.x1; - p[2].y += draw_area.y1; - p[3].x += draw_area.x1; - p[3].y += draw_area.y1; - - d2_settexturemapping(u->d2_handle, D2_FIX4(p[0].x), D2_FIX4(p[0].y), D2_FIX16(0), D2_FIX16(0), dxu, dxv, dyu, dyv); - - d2_renderquad(u->d2_handle, - (d2_point)D2_FIX4(p[0].x), - (d2_point)D2_FIX4(p[0].y), - (d2_point)D2_FIX4(p[1].x), - (d2_point)D2_FIX4(p[1].y), - (d2_point)D2_FIX4(p[2].x), - (d2_point)D2_FIX4(p[2].y), - (d2_point)D2_FIX4(p[3].x), - (d2_point)D2_FIX4(p[3].y), - 0); - - // - // Execute render operations - // -#if D2_RENDER_EACH_OPERATION - d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); - d2_flushframe(u->d2_handle); -#endif - - d2_setfillmode(u->d2_handle, current_fill_mode); - d2_settextureoperation(u->d2_handle, a_texture_op, r_texture_op, g_texture_op, b_texture_op); - d2_setblendmode(u->d2_handle, src_blend_mode, dst_blend_mode); - - if(NULL != p_intermediate_buf) { - lv_free(p_intermediate_buf); - } - -#if LV_USE_OS - status = lv_mutex_unlock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif - -} - -#endif //LV_USE_DRAW_DAVE2D diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_label.c b/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_label.c deleted file mode 100644 index abc4173..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_label.c +++ /dev/null @@ -1,163 +0,0 @@ -#include "lv_draw_dave2d.h" -#if LV_USE_DRAW_DAVE2D - -#include "../../lv_draw_label_private.h" -#include "../../../misc/lv_area_private.h" - -static void lv_draw_dave2d_draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, - lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); - -static lv_draw_dave2d_unit_t * unit = NULL; - -void lv_draw_dave2d_label(lv_draw_dave2d_unit_t * u, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords) -{ - if(dsc->opa <= LV_OPA_MIN) return; - - unit = u; - - lv_draw_label_iterate_characters(&u->base_unit, dsc, coords, lv_draw_dave2d_draw_letter_cb); - -} - -static void lv_draw_dave2d_draw_letter_cb(lv_draw_unit_t * u, lv_draw_glyph_dsc_t * glyph_draw_dsc, - lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) -{ - - d2_u8 current_fillmode; - lv_area_t clip_area; - lv_area_t letter_coords; - - int32_t x; - int32_t y; - - letter_coords = *glyph_draw_dsc->letter_coords; - - bool is_common; - is_common = lv_area_intersect(&clip_area, glyph_draw_dsc->letter_coords, u->clip_area); - if(!is_common) return; - - x = 0 - unit->base_unit.target_layer->buf_area.x1; - y = 0 - unit->base_unit.target_layer->buf_area.y1; - - lv_area_move(&clip_area, x, y); - lv_area_move(&letter_coords, x, y); - -#if LV_USE_OS - lv_result_t status; - status = lv_mutex_lock(unit->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif - -#if D2_RENDER_EACH_OPERATION - d2_selectrenderbuffer(unit->d2_handle, unit->renderbuffer); -#endif - - // - // Generate render operations - // - - d2_framebuffer_from_layer(unit->d2_handle, unit->base_unit.target_layer); - - current_fillmode = d2_getfillmode(unit->d2_handle); - - d2_cliprect(unit->d2_handle, (d2_border)clip_area.x1, (d2_border)clip_area.y1, (d2_border)clip_area.x2, - (d2_border)clip_area.y2); - - if(glyph_draw_dsc) { - switch(glyph_draw_dsc->format) { - case LV_FONT_GLYPH_FORMAT_NONE: { -#if LV_USE_FONT_PLACEHOLDER - /* Draw a placeholder rectangle*/ - lv_draw_border_dsc_t border_draw_dsc; - lv_draw_border_dsc_init(&border_draw_dsc); - border_draw_dsc.opa = glyph_draw_dsc->opa; - border_draw_dsc.color = glyph_draw_dsc->color; - border_draw_dsc.width = 1; - //lv_draw_sw_border(u, &border_draw_dsc, glyph_draw_dsc->bg_coords); - lv_draw_dave2d_border(unit, &border_draw_dsc, glyph_draw_dsc->bg_coords); -#endif - } - break; - case LV_FONT_GLYPH_FORMAT_A1 ... LV_FONT_GLYPH_FORMAT_A8: { - lv_area_t mask_area = letter_coords; - mask_area.x2 = mask_area.x1 + lv_draw_buf_width_to_stride(lv_area_get_width(&mask_area), LV_COLOR_FORMAT_A8) - 1; - // lv_draw_sw_blend_dsc_t blend_dsc; - // lv_memzero(&blend_dsc, sizeof(blend_dsc)); - // blend_dsc.color = glyph_draw_dsc->color; - // blend_dsc.opa = glyph_draw_dsc->opa; - // blend_dsc.mask_buf = glyph_draw_dsc->glyph_data; - // blend_dsc.mask_area = &mask_area; - // blend_dsc.blend_area = glyph_draw_dsc->letter_coords; - // blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - //lv_draw_sw_blend(u, &blend_dsc); - - lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data; - -#if defined(RENESAS_CORTEX_M85) -#if (BSP_CFG_DCACHE_ENABLED) - d1_cacheblockflush(unit->d2_handle, 0, draw_buf->data, draw_buf->data_size); -#endif -#endif - d2_settexture(unit->d2_handle, (void *)draw_buf->data, - (d2_s32)lv_draw_buf_width_to_stride((uint32_t)lv_area_get_width(&letter_coords), LV_COLOR_FORMAT_A8), - lv_area_get_width(&letter_coords), lv_area_get_height(&letter_coords), d2_mode_alpha8); - d2_settexopparam(unit->d2_handle, d2_cc_red, glyph_draw_dsc->color.red, 0); - d2_settexopparam(unit->d2_handle, d2_cc_green, glyph_draw_dsc->color.green, 0); - d2_settexopparam(unit->d2_handle, d2_cc_blue, glyph_draw_dsc->color.blue, 0); - d2_settexopparam(unit->d2_handle, d2_cc_alpha, glyph_draw_dsc->opa, 0); - - d2_settextureoperation(unit->d2_handle, d2_to_multiply, d2_to_multiply, d2_to_multiply, d2_to_multiply); - - d2_settexturemapping(unit->d2_handle, D2_FIX4(letter_coords.x1), D2_FIX4(letter_coords.y1), D2_FIX16(0), D2_FIX16(0), - D2_FIX16(1), D2_FIX16(0), D2_FIX16(0), D2_FIX16(1)); - - d2_settexturemode(unit->d2_handle, d2_tm_filter); - - d2_setfillmode(unit->d2_handle, d2_fm_texture); - - d2_renderbox(unit->d2_handle, (d2_point)D2_FIX4(letter_coords.x1), - (d2_point)D2_FIX4(letter_coords.y1), - (d2_point)D2_FIX4(lv_area_get_width(&letter_coords)), - (d2_point)D2_FIX4(lv_area_get_height(&letter_coords))); - - d2_setfillmode(unit->d2_handle, current_fillmode); - } - break; - case LV_FONT_GLYPH_FORMAT_IMAGE: { -#if LV_USE_IMGFONT - lv_draw_image_dsc_t img_dsc; - lv_draw_image_dsc_init(&img_dsc); - img_dsc.rotation = 0; - img_dsc.scale_x = LV_SCALE_NONE; - img_dsc.scale_y = LV_SCALE_NONE; - img_dsc.opa = glyph_draw_dsc->opa; - img_dsc.src = glyph_draw_dsc->glyph_data; - //lv_draw_sw_image(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords); -#endif - } - break; - default: - break; - } - } - - // - // Execute render operations - // -#if D2_RENDER_EACH_OPERATION - d2_executerenderbuffer(unit->d2_handle, unit->renderbuffer, 0); - d2_flushframe(unit->d2_handle); -#endif - - if(fill_draw_dsc && fill_area) { - //lv_draw_sw_fill(u, fill_draw_dsc, fill_area); - lv_draw_dave2d_fill(unit, fill_draw_dsc, fill_area); - } - -#if LV_USE_OS - status = lv_mutex_unlock(unit->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif -} - -#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_line.c b/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_line.c deleted file mode 100644 index 3771926..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_line.c +++ /dev/null @@ -1,93 +0,0 @@ -#include "lv_draw_dave2d.h" -#if LV_USE_DRAW_DAVE2D - -#include "../../../misc/lv_area_private.h" - -void lv_draw_dave2d_line(lv_draw_dave2d_unit_t * u, const lv_draw_line_dsc_t * dsc) -{ - - lv_area_t clip_line; - d2_u32 mode; - lv_area_t buffer_area; - lv_value_precise_t p1_x; - lv_value_precise_t p1_y; - lv_value_precise_t p2_x; - lv_value_precise_t p2_y; - int32_t x; - int32_t y; - - clip_line.x1 = LV_MIN(dsc->p1.x, dsc->p2.x) - dsc->width / 2; - clip_line.x2 = LV_MAX(dsc->p1.x, dsc->p2.x) + dsc->width / 2; - clip_line.y1 = LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width / 2; - clip_line.y2 = LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width / 2; - - bool is_common; - is_common = lv_area_intersect(&clip_line, &clip_line, u->base_unit.clip_area); - if(!is_common) return; - -#if LV_USE_OS - lv_result_t status; - status = lv_mutex_lock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif - - buffer_area = u->base_unit.target_layer->buf_area; - p1_x = dsc->p1.x - buffer_area.x1; - p1_y = dsc->p1.y - buffer_area.y1; - p2_x = dsc->p2.x - buffer_area.x1; - p2_y = dsc->p2.y - buffer_area.y1; - - x = 0 - u->base_unit.target_layer->buf_area.x1; - y = 0 - u->base_unit.target_layer->buf_area.y1; - - lv_area_move(&clip_line, x, y); - lv_area_move(&buffer_area, x, y); - - bool dashed = dsc->dash_gap && dsc->dash_width; - - if(dashed) { - /* TODO */ - LV_ASSERT(0); - } - -#if D2_RENDER_EACH_OPERATION - d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); -#endif - // - // Generate render operations - // - d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); - - d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->color)); - - d2_setalpha(u->d2_handle, dsc->opa); - - d2_cliprect(u->d2_handle, clip_line.x1, clip_line.y1, clip_line.x2, clip_line.y2); - - if((dsc->round_end == 1) || (dsc->round_start == 1)) { - mode = d2_lc_round; - } - else { - mode = d2_lc_butt; // lines end directly at endpoints - } - - d2_setlinecap(u->d2_handle, mode); - - d2_renderline(u->d2_handle, D2_FIX4(p1_x), D2_FIX4(p1_y), D2_FIX4(p2_x), - D2_FIX4(p2_y), D2_FIX4(dsc->width), d2_le_exclude_none); - - // - // Execute render operations - // -#if D2_RENDER_EACH_OPERATION - d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); - d2_flushframe(u->d2_handle); -#endif - -#if LV_USE_OS - status = lv_mutex_unlock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif -} - -#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_mask_rectangle.c b/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_mask_rectangle.c deleted file mode 100644 index 57dbce8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_mask_rectangle.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "lv_draw_dave2d.h" -#if LV_USE_DRAW_DAVE2D - -#include "../../../misc/lv_area_private.h" - -void lv_draw_dave2d_mask_rect(lv_draw_dave2d_unit_t * u, const lv_draw_mask_rect_dsc_t * dsc, const lv_area_t * coords) -{ - lv_area_t clipped_area; - lv_area_t coordinates; - int32_t x; - int32_t y; - - if(!lv_area_intersect(&clipped_area, coords, u->base_unit.clip_area)) return; - - x = 0 - u->base_unit.target_layer->buf_area.x1; - y = 0 - u->base_unit.target_layer->buf_area.y1; - - coordinates = *coords; - - lv_area_move(&clipped_area, x, y); - lv_area_move(&coordinates, x, y); - -#if LV_USE_OS - lv_result_t status; - status = lv_mutex_lock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif - -#ifdef D2_RENDER_EACH_OPERATION - d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); -#endif - - d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); - - d2_cliprect(u->d2_handle, (d2_border)clipped_area.x1, (d2_border)clipped_area.y1, (d2_border)clipped_area.x2, - (d2_border)clipped_area.y2); - - d2_renderbox(u->d2_handle, - (d2_point) D2_FIX4(coordinates.x1), - (d2_point) D2_FIX4(coordinates.y1), - (d2_width) D2_FIX4(lv_area_get_width(&coordinates)), - (d2_width) D2_FIX4(lv_area_get_height(&coordinates))); - - // - // Execute render operations - // -#ifdef D2_RENDER_EACH_OPERATION - d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); - d2_flushframe(u->d2_handle); -#endif - -#if LV_USE_OS - status = lv_mutex_unlock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif -} -#endif //LV_USE_DRAW_DAVE2D diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_triangle.c b/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_triangle.c deleted file mode 100644 index c6f3bac..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_triangle.c +++ /dev/null @@ -1,176 +0,0 @@ -#include "lv_draw_dave2d.h" -#if LV_USE_DRAW_DAVE2D - -#include "../../../misc/lv_area_private.h" - -void lv_draw_dave2d_triangle(lv_draw_dave2d_unit_t * u, const lv_draw_triangle_dsc_t * dsc) -{ - lv_area_t clipped_area; - d2_u32 flags = 0; - d2_u8 current_alpha_mode = 0; - int32_t x; - int32_t y; - - lv_area_t tri_area; - tri_area.x1 = LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); - tri_area.y1 = LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); - tri_area.x2 = LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); - tri_area.y2 = LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); - - if(!lv_area_intersect(&clipped_area, &tri_area, u->base_unit.clip_area)) return; - -#if LV_USE_OS - lv_result_t status; - status = lv_mutex_lock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif - - x = 0 - u->base_unit.target_layer->buf_area.x1; - y = 0 - u->base_unit.target_layer->buf_area.y1; - - lv_area_move(&clipped_area, x, y); - -#if D2_RENDER_EACH_OPERATION - d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); -#endif - - lv_point_precise_t p[3]; - p[0] = dsc->p[0]; - p[1] = dsc->p[1]; - p[2] = dsc->p[2]; - - /*Order the points like this: - * [0]: top - * [1]: right bottom - * [2]: left bottom */ - - if(dsc->p[0].y <= dsc->p[1].y && dsc->p[0].y <= dsc->p[2].y) { - p[0] = dsc->p[0]; - if(dsc->p[1].x < dsc->p[2].x) { - p[2] = dsc->p[1]; - p[1] = dsc->p[2]; - } - else { - p[2] = dsc->p[2]; - p[1] = dsc->p[1]; - } - } - else if(dsc->p[1].y <= dsc->p[0].y && dsc->p[1].y <= dsc->p[2].y) { - p[0] = dsc->p[1]; - if(dsc->p[0].x < dsc->p[2].x) { - p[2] = dsc->p[0]; - p[1] = dsc->p[2]; - } - else { - p[2] = dsc->p[2]; - p[1] = dsc->p[0]; - } - } - else { - p[0] = dsc->p[2]; - if(dsc->p[0].x < dsc->p[1].x) { - p[2] = dsc->p[0]; - p[1] = dsc->p[1]; - } - else { - p[2] = dsc->p[1]; - p[1] = dsc->p[0]; - } - } - - p[0].x -= u->base_unit.target_layer->buf_area.x1; - p[1].x -= u->base_unit.target_layer->buf_area.x1; - p[2].x -= u->base_unit.target_layer->buf_area.x1; - - p[0].y -= u->base_unit.target_layer->buf_area.y1; - p[1].y -= u->base_unit.target_layer->buf_area.y1; - p[2].y -= u->base_unit.target_layer->buf_area.y1; - - p[1].y -= 1; - p[2].y -= 1; - - current_alpha_mode = d2_getalphamode(u->d2_handle); - - if(LV_GRAD_DIR_NONE != dsc->bg_grad.dir) { - float a1; - float a2; - - float y1; - float y2; - - float y3; - float y0; - int32_t y0_i ; - int32_t y3_i ; - - if(LV_GRAD_DIR_VER == dsc->bg_grad.dir) { - a1 = dsc->bg_grad.stops[0].opa; - a2 = dsc->bg_grad.stops[dsc->bg_grad.stops_count - 1].opa; - - y1 = LV_MIN3(p[0].y, p[1].y, p[2].y); - y2 = LV_MAX3(p[0].y, p[1].y, p[2].y); - - if(a1 < a2) { - /* TODO */ - LV_ASSERT(0); - y0 = 0.0f;//silence the compiler warning - y3 = 0.0f; - - } - else { - y0 = y2 - ((y2 - y1) / (a2 - a1) * (a2)); //point where alpha is 0 - y3 = y1 + ((y2 - y1) / (a2 - a1) * (255 - a1)); //point where alpha is 255 - } - - y0_i = (int16_t)y0; - y3_i = (int16_t)y3; - - d2_setalphagradient(u->d2_handle, 0, D2_FIX4(0), D2_FIX4(y0_i), D2_FIX4(0), D2_FIX4((y3_i - y0_i))); - } - else if(LV_GRAD_DIR_HOR == dsc->bg_grad.dir) { - /* TODO */ - LV_ASSERT(0); - } - - d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->bg_grad.stops[0].color)); - d2_setalphamode(u->d2_handle, d2_am_gradient1); - } - else { - d2_setalpha(u->d2_handle, dsc->bg_opa); - d2_setalphamode(u->d2_handle, d2_am_constant); - d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->bg_color)); - - } - - d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); - - d2_cliprect(u->d2_handle, (d2_border)clipped_area.x1, (d2_border)clipped_area.y1, (d2_border)clipped_area.x2, - (d2_border)clipped_area.y2); - - d2_rendertri(u->d2_handle, - (d2_point) D2_FIX4(p[0].x), - (d2_point) D2_FIX4(p[0].y), - (d2_point) D2_FIX4(p[1].x), - (d2_point) D2_FIX4(p[1].y), - (d2_point) D2_FIX4(p[2].x), - (d2_point) D2_FIX4(p[2].y), - flags); - - // - // Execute render operations - // -#if D2_RENDER_EACH_OPERATION - d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); - d2_flushframe(u->d2_handle); -#endif - - d2_setalphamode(u->d2_handle, current_alpha_mode); - -#if LV_USE_OS - status = lv_mutex_unlock(u->pd2Mutex); - LV_ASSERT(LV_RESULT_OK == status); -#endif - -} - -#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_utils.c b/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_utils.c deleted file mode 100644 index 98fb806..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_utils.c +++ /dev/null @@ -1,140 +0,0 @@ -/** - * @file lv_draw_dave2d_utils.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_dave2d.h" - -#if LV_USE_DRAW_DAVE2D - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -d2_color lv_draw_dave2d_lv_colour_to_d2_colour(lv_color_t color) -{ - uint8_t alpha, red, green, blue; - - alpha = 0x00; - red = color.red ; - green = color.green ; - blue = color.blue; - /*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ - switch(LV_COLOR_DEPTH) { - case(8): - LV_ASSERT(0); - break; - case(16): - break; - case(24): - break; - case(32): - break; - - default: - break; - } - - return (alpha) << 24UL - | (red) << 16UL - | (green) << 8UL - | (blue) << 0UL; -} - -d2_s32 lv_draw_dave2d_cf_fb_get(void) -{ - d2_s32 d2_fb_mode = 0; - switch(g_display0_cfg.input->format) { - case DISPLAY_IN_FORMAT_16BITS_RGB565: ///< RGB565, 16 bits - d2_fb_mode = d2_mode_rgb565; - break; - case DISPLAY_IN_FORMAT_32BITS_ARGB8888: ///< ARGB8888, 32 bits - d2_fb_mode = d2_mode_argb8888; - break; - case DISPLAY_IN_FORMAT_32BITS_RGB888: ///< RGB888, 32 bits - d2_fb_mode = d2_mode_rgb888; - break; - case DISPLAY_IN_FORMAT_16BITS_ARGB4444: ///< ARGB4444, 16 bits - d2_fb_mode = d2_mode_argb4444; - break; - case DISPLAY_IN_FORMAT_16BITS_ARGB1555: ///< ARGB1555, 16 bits - case DISPLAY_IN_FORMAT_CLUT8 : ///< CLUT8 - case DISPLAY_IN_FORMAT_CLUT4 : ///< CLUT4 - case DISPLAY_IN_FORMAT_CLUT1 : ///< CLUT1 - //Not supported as a FB format by Dave2D - break; - - default: - break; - } - - return d2_fb_mode; -} - -d2_u32 lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(lv_color_format_t colour_format) -{ - d2_u32 d2_lvgl_mode = 0; - - switch(colour_format) { - case(LV_COLOR_FORMAT_A8): - d2_lvgl_mode = d2_mode_alpha8; //? - break; - case(LV_COLOR_FORMAT_RGB565): - d2_lvgl_mode = d2_mode_rgb565; - break; - case(LV_COLOR_FORMAT_RGB888): - d2_lvgl_mode = d2_mode_argb8888; //? - break; - case(LV_COLOR_FORMAT_ARGB8888): - d2_lvgl_mode = d2_mode_argb8888; - break; - - default: - LV_ASSERT(0); - break; - - } - return d2_lvgl_mode; -} - -void d2_framebuffer_from_layer(d2_device * handle, lv_layer_t * layer) -{ - lv_draw_buf_t * draw_buf = layer->draw_buf; - lv_area_t buffer_area = layer->buf_area; - lv_area_move(&buffer_area, -layer->buf_area.x1, -layer->buf_area.y1); - - d2_framebuffer(handle, draw_buf->data, - (d2_s32) draw_buf->header.stride / lv_color_format_get_size(layer->color_format), - (d2_u32)lv_area_get_width(&buffer_area), - (d2_u32)lv_area_get_height(&buffer_area), - lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(layer->color_format)); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_utils.h b/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_utils.h deleted file mode 100644 index 67c5102..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/renesas/dave2d/lv_draw_dave2d_utils.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file lv_draw_dave2d_utils.h - * - */ - -#ifndef LV_DRAW_DAVE2D_UTILS_H -#define LV_DRAW_DAVE2D_UTILS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -d2_color lv_draw_dave2d_lv_colour_to_d2_colour(lv_color_t color); - -d2_s32 lv_draw_dave2d_cf_fb_get(void); - -d2_u32 lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(lv_color_format_t colour_format); - -void d2_framebuffer_from_layer(d2_device * handle, lv_layer_t * layer); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_DAVE2D_UTILS_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sdl/lv_draw_sdl.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sdl/lv_draw_sdl.c deleted file mode 100644 index c155ac1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sdl/lv_draw_sdl.c +++ /dev/null @@ -1,469 +0,0 @@ -/** - * @file lv_draw_sdl.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../lv_draw_private.h" -#if LV_USE_DRAW_SDL -#include LV_SDL_INCLUDE_PATH -#include "lv_draw_sdl.h" -#include "../../core/lv_refr_private.h" -#include "../../display/lv_display_private.h" -#include "../../stdlib/lv_string.h" -#include "../../drivers/sdl/lv_sdl_window.h" -#include "../../misc/cache/lv_cache_entry_private.h" -#include "../../misc/lv_area_private.h" - -/********************* - * DEFINES - *********************/ -#define DRAW_UNIT_ID_SDL 100 - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_draw_dsc_base_t * draw_dsc; - int32_t w; - int32_t h; - SDL_Texture * texture; -} cache_data_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void execute_drawing(lv_draw_sdl_unit_t * u); - -static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); - -static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); -static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data); - -/********************** - * GLOBAL PROTOTYPES - **********************/ -static uint8_t sdl_render_buf[2048 * 1024 * 4]; - -/********************** - * STATIC VARIABLES - **********************/ -static SDL_Texture * layer_get_texture(lv_layer_t * layer); - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ -static bool sdl_texture_cache_create_cb(cache_data_t * cached_data, void * user_data) -{ - return draw_to_texture((lv_draw_sdl_unit_t *)user_data, cached_data); -} - -static void sdl_texture_cache_free_cb(cache_data_t * cached_data, void * user_data) -{ - LV_UNUSED(user_data); - - lv_free(cached_data->draw_dsc); - SDL_DestroyTexture(cached_data->texture); - cached_data->draw_dsc = NULL; - cached_data->texture = NULL; -} - -static lv_cache_compare_res_t sdl_texture_cache_compare_cb(const cache_data_t * lhs, const cache_data_t * rhs) -{ - if(lhs == rhs) return 0; - - if(lhs->w != rhs->w) { - return lhs->w > rhs->w ? 1 : -1; - } - if(lhs->h != rhs->h) { - return lhs->h > rhs->h ? 1 : -1; - } - - uint32_t lhs_dsc_size = lhs->draw_dsc->dsc_size; - uint32_t rhs_dsc_size = rhs->draw_dsc->dsc_size; - - if(lhs_dsc_size != rhs_dsc_size) { - return lhs_dsc_size > rhs_dsc_size ? 1 : -1; - } - - const uint8_t * left_draw_dsc = (const uint8_t *)lhs->draw_dsc; - const uint8_t * right_draw_dsc = (const uint8_t *)rhs->draw_dsc; - left_draw_dsc += sizeof(lv_draw_dsc_base_t); - right_draw_dsc += sizeof(lv_draw_dsc_base_t); - - int cmp_res = lv_memcmp(left_draw_dsc, right_draw_dsc, lhs->draw_dsc->dsc_size - sizeof(lv_draw_dsc_base_t)); - - if(cmp_res != 0) { - return cmp_res > 0 ? 1 : -1; - } - - return 0; -} - -void lv_draw_sdl_init(void) -{ - lv_draw_sdl_unit_t * draw_sdl_unit = lv_draw_create_unit(sizeof(lv_draw_sdl_unit_t)); - draw_sdl_unit->base_unit.dispatch_cb = dispatch; - draw_sdl_unit->base_unit.evaluate_cb = evaluate; - draw_sdl_unit->texture_cache = lv_cache_create(&lv_cache_class_lru_rb_count, - sizeof(cache_data_t), 128, (lv_cache_ops_t) { - .compare_cb = (lv_cache_compare_cb_t)sdl_texture_cache_compare_cb, - .create_cb = (lv_cache_create_cb_t)sdl_texture_cache_create_cb, - .free_cb = (lv_cache_free_cb_t)sdl_texture_cache_free_cb, - }); - lv_cache_set_name(draw_sdl_unit->texture_cache, "SDL_TEXTURE"); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) -{ - lv_draw_sdl_unit_t * draw_sdl_unit = (lv_draw_sdl_unit_t *) draw_unit; - - /*Return immediately if it's busy with a draw task*/ - if(draw_sdl_unit->task_act) return 0; - - lv_draw_task_t * t = NULL; - t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_SDL); - if(t == NULL) return -1; - - lv_display_t * disp = lv_refr_get_disp_refreshing(); - SDL_Texture * texture = layer_get_texture(layer); - if(layer != disp->layer_head && texture == NULL) { - void * buf = lv_draw_layer_alloc_buf(layer); - if(buf == NULL) return -1; - - SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); - int32_t w = lv_area_get_width(&layer->buf_area); - int32_t h = lv_area_get_height(&layer->buf_area); - layer->user_data = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, - SDL_TEXTUREACCESS_TARGET, w, h); - } - - t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; - draw_sdl_unit->base_unit.target_layer = layer; - draw_sdl_unit->base_unit.clip_area = &t->clip_area; - draw_sdl_unit->task_act = t; - - execute_drawing(draw_sdl_unit); - - draw_sdl_unit->task_act->state = LV_DRAW_TASK_STATE_READY; - draw_sdl_unit->task_act = NULL; - - /*The draw unit is free now. Request a new dispatching as it can get a new task*/ - lv_draw_dispatch_request(); - return 1; -} - -static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) -{ - LV_UNUSED(draw_unit); - - if(((lv_draw_dsc_base_t *)task->draw_dsc)->user_data == NULL) { - task->preference_score = 0; - task->preferred_draw_unit_id = DRAW_UNIT_ID_SDL; - } - return 0; -} - -static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) -{ - lv_draw_task_t * task = u->task_act; - - lv_layer_t dest_layer; - lv_memzero(&dest_layer, sizeof(dest_layer)); - - int32_t texture_w = lv_area_get_width(&task->_real_area); - int32_t texture_h = lv_area_get_height(&task->_real_area); - - lv_draw_buf_t draw_buf; - dest_layer.draw_buf = &draw_buf; - lv_draw_buf_init(dest_layer.draw_buf, texture_w, texture_h, - LV_COLOR_FORMAT_ARGB8888, LV_STRIDE_AUTO, sdl_render_buf, sizeof(sdl_render_buf)); - dest_layer.color_format = LV_COLOR_FORMAT_ARGB8888; - - dest_layer.buf_area = task->_real_area; - dest_layer._clip_area = task->_real_area; - dest_layer.phy_clip_area = task->_real_area; - lv_memzero(sdl_render_buf, lv_area_get_size(&dest_layer.buf_area) * 4 + 100); - - lv_display_t * disp = lv_refr_get_disp_refreshing(); - - lv_obj_t * obj = ((lv_draw_dsc_base_t *)task->draw_dsc)->obj; - bool original_send_draw_task_event = false; - if(obj) { - original_send_draw_task_event = lv_obj_has_flag(obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); - } - - switch(task->type) { - case LV_DRAW_TASK_TYPE_FILL: { - lv_draw_fill_dsc_t * fill_dsc = task->draw_dsc; - lv_draw_rect_dsc_t rect_dsc; - lv_draw_rect_dsc_init(&rect_dsc); - rect_dsc.base.user_data = lv_sdl_window_get_renderer(disp); - rect_dsc.bg_color = fill_dsc->color; - rect_dsc.bg_grad = fill_dsc->grad; - rect_dsc.radius = fill_dsc->radius; - rect_dsc.bg_opa = fill_dsc->opa; - - lv_draw_rect(&dest_layer, &rect_dsc, &task->area); - } - break; - case LV_DRAW_TASK_TYPE_BORDER: { - lv_draw_border_dsc_t * border_dsc = task->draw_dsc; - lv_draw_rect_dsc_t rect_dsc; - lv_draw_rect_dsc_init(&rect_dsc); - rect_dsc.base.user_data = lv_sdl_window_get_renderer(disp); - rect_dsc.bg_opa = LV_OPA_TRANSP; - rect_dsc.radius = border_dsc->radius; - rect_dsc.border_color = border_dsc->color; - rect_dsc.border_opa = border_dsc->opa; - rect_dsc.border_side = border_dsc->side; - rect_dsc.border_width = border_dsc->width; - lv_draw_rect(&dest_layer, &rect_dsc, &task->area); - break; - } - case LV_DRAW_TASK_TYPE_BOX_SHADOW: { - lv_draw_box_shadow_dsc_t * box_shadow_dsc = task->draw_dsc; - lv_draw_rect_dsc_t rect_dsc; - lv_draw_rect_dsc_init(&rect_dsc); - rect_dsc.base.user_data = lv_sdl_window_get_renderer(disp); - rect_dsc.bg_opa = LV_OPA_0; - rect_dsc.radius = box_shadow_dsc->radius; - rect_dsc.bg_color = box_shadow_dsc->color; - rect_dsc.shadow_opa = box_shadow_dsc->opa; - rect_dsc.shadow_width = box_shadow_dsc->width; - rect_dsc.shadow_spread = box_shadow_dsc->spread; - rect_dsc.shadow_offset_x = box_shadow_dsc->ofs_x; - rect_dsc.shadow_offset_y = box_shadow_dsc->ofs_y; - lv_draw_rect(&dest_layer, &rect_dsc, &task->area); - break; - } - case LV_DRAW_TASK_TYPE_LABEL: { - lv_draw_label_dsc_t label_dsc; - lv_memcpy(&label_dsc, task->draw_dsc, sizeof(label_dsc)); - label_dsc.base.user_data = lv_sdl_window_get_renderer(disp); - lv_draw_label(&dest_layer, &label_dsc, &task->area); - } - break; - case LV_DRAW_TASK_TYPE_ARC: { - lv_draw_arc_dsc_t arc_dsc; - lv_memcpy(&arc_dsc, task->draw_dsc, sizeof(arc_dsc)); - arc_dsc.base.user_data = lv_sdl_window_get_renderer(disp); - lv_draw_arc(&dest_layer, &arc_dsc); - } - break; - case LV_DRAW_TASK_TYPE_LINE: { - lv_draw_line_dsc_t line_dsc; - lv_memcpy(&line_dsc, task->draw_dsc, sizeof(line_dsc)); - line_dsc.base.user_data = lv_sdl_window_get_renderer(disp); - lv_draw_line(&dest_layer, &line_dsc); - } - break; - case LV_DRAW_TASK_TYPE_TRIANGLE: { - lv_draw_triangle_dsc_t triangle_dsc; - lv_memcpy(&triangle_dsc, task->draw_dsc, sizeof(triangle_dsc)); - triangle_dsc.base.user_data = lv_sdl_window_get_renderer(disp); - lv_draw_triangle(&dest_layer, &triangle_dsc); - } - break; - case LV_DRAW_TASK_TYPE_IMAGE: { - lv_draw_image_dsc_t image_dsc; - lv_memcpy(&image_dsc, task->draw_dsc, sizeof(image_dsc)); - image_dsc.base.user_data = lv_sdl_window_get_renderer(disp); - lv_draw_image(&dest_layer, &image_dsc, &task->area); - break; - } - default: - return false; - } - - while(dest_layer.draw_task_head) { - lv_draw_dispatch_layer(disp, &dest_layer); - if(dest_layer.draw_task_head) { - lv_draw_dispatch_wait_for_request(); - } - } - - SDL_Texture * texture = SDL_CreateTexture(lv_sdl_window_get_renderer(disp), SDL_PIXELFORMAT_ARGB8888, - SDL_TEXTUREACCESS_STATIC, texture_w, texture_h); - SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); - SDL_UpdateTexture(texture, NULL, sdl_render_buf, texture_w * 4); - - lv_draw_dsc_base_t * base_dsc = task->draw_dsc; - - cache_data->draw_dsc = lv_malloc(base_dsc->dsc_size); - lv_memcpy((void *)cache_data->draw_dsc, base_dsc, base_dsc->dsc_size); - cache_data->w = texture_w; - cache_data->h = texture_h; - cache_data->texture = texture; - - if(obj) { - lv_obj_update_flag(obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS, original_send_draw_task_event); - } - - return true; -} - -static void blend_texture_layer(lv_draw_sdl_unit_t * u) -{ - lv_display_t * disp = lv_refr_get_disp_refreshing(); - SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); - - SDL_Rect clip_rect; - clip_rect.x = u->base_unit.clip_area->x1; - clip_rect.y = u->base_unit.clip_area->y1; - clip_rect.w = lv_area_get_width(u->base_unit.clip_area); - clip_rect.h = lv_area_get_height(u->base_unit.clip_area); - - lv_draw_task_t * t = u->task_act; - lv_draw_image_dsc_t * draw_dsc = t->draw_dsc; - SDL_Rect rect; - rect.w = (lv_area_get_width(&t->area) * draw_dsc->scale_x) / 256; - rect.h = (lv_area_get_height(&t->area) * draw_dsc->scale_y) / 256; - - rect.x = -draw_dsc->pivot.x; - rect.y = -draw_dsc->pivot.y; - rect.x = (rect.x * draw_dsc->scale_x) / 256; - rect.y = (rect.y * draw_dsc->scale_y) / 256; - rect.x += t->area.x1 + draw_dsc->pivot.x; - rect.y += t->area.y1 + draw_dsc->pivot.y; - - lv_layer_t * src_layer = (lv_layer_t *)draw_dsc->src; - SDL_Texture * src_texture = layer_get_texture(src_layer); - - SDL_SetTextureAlphaMod(src_texture, draw_dsc->opa); - SDL_SetTextureBlendMode(src_texture, SDL_BLENDMODE_BLEND); - SDL_SetRenderTarget(renderer, layer_get_texture(u->base_unit.target_layer)); - SDL_RenderSetClipRect(renderer, &clip_rect); - - SDL_Point center = {draw_dsc->pivot.x, draw_dsc->pivot.y}; - SDL_RenderCopyEx(renderer, src_texture, NULL, &rect, draw_dsc->rotation / 10, ¢er, SDL_FLIP_NONE); - // SDL_RenderCopy(renderer, src_texture, NULL, &rect); - - SDL_DestroyTexture(src_texture); - SDL_RenderSetClipRect(renderer, NULL); -} - -static void draw_from_cached_texture(lv_draw_sdl_unit_t * u) -{ - lv_draw_task_t * t = u->task_act; - - cache_data_t data_to_find; - data_to_find.draw_dsc = (lv_draw_dsc_base_t *)t->draw_dsc; - - data_to_find.w = lv_area_get_width(&t->_real_area); - data_to_find.h = lv_area_get_height(&t->_real_area); - data_to_find.texture = NULL; - - /*user_data stores the renderer to differentiate it from SW rendered tasks. - *However the cached texture is independent from the renderer so use NULL user_data*/ - void * user_data_saved = data_to_find.draw_dsc->user_data; - data_to_find.draw_dsc->user_data = NULL; - - /*img_dsc->image_area is an absolute coordinate so it's different - *for the same image on a different position. So make it relative before using for cache. */ - if(t->type == LV_DRAW_TASK_TYPE_IMAGE) { - lv_draw_image_dsc_t * img_dsc = (lv_draw_image_dsc_t *)data_to_find.draw_dsc; - lv_area_move(&img_dsc->image_area, -t->area.x1, -t->area.y1); - } - - lv_cache_entry_t * entry_cached = lv_cache_acquire_or_create(u->texture_cache, &data_to_find, u); - if(t->type == LV_DRAW_TASK_TYPE_IMAGE) { - lv_draw_image_dsc_t * img_dsc = (lv_draw_image_dsc_t *)data_to_find.draw_dsc; - lv_area_move(&img_dsc->image_area, t->area.x1, t->area.y1); - } - - if(!entry_cached) { - return; - } - - - data_to_find.draw_dsc->user_data = user_data_saved; - - cache_data_t * data_cached = lv_cache_entry_get_data(entry_cached); - SDL_Texture * texture = data_cached->texture; - lv_display_t * disp = lv_refr_get_disp_refreshing(); - SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); - - lv_layer_t * dest_layer = u->base_unit.target_layer; - SDL_Rect clip_rect; - clip_rect.x = u->base_unit.clip_area->x1 - dest_layer->buf_area.x1; - clip_rect.y = u->base_unit.clip_area->y1 - dest_layer->buf_area.y1; - clip_rect.w = lv_area_get_width(u->base_unit.clip_area); - clip_rect.h = lv_area_get_height(u->base_unit.clip_area); - - SDL_Rect rect; - - SDL_SetRenderTarget(renderer, layer_get_texture(dest_layer)); - - rect.x = t->_real_area.x1 - dest_layer->buf_area.x1; - rect.y = t->_real_area.y1 - dest_layer->buf_area.y1; - rect.w = data_cached->w; - rect.h = data_cached->h; - - SDL_RenderSetClipRect(renderer, &clip_rect); - SDL_RenderCopy(renderer, texture, NULL, &rect); - - SDL_RenderSetClipRect(renderer, NULL); - - lv_cache_release(u->texture_cache, entry_cached, u); - - /*Do not cache label's with local text as the text will be freed*/ - if(t->type == LV_DRAW_TASK_TYPE_LABEL) { - lv_draw_label_dsc_t * label_dsc = t->draw_dsc; - if(label_dsc->text_local) { - lv_cache_drop(u->texture_cache, &data_to_find, NULL); - } - } -} - -static void execute_drawing(lv_draw_sdl_unit_t * u) -{ - lv_draw_task_t * t = u->task_act; - - if(t->type == LV_DRAW_TASK_TYPE_FILL) { - lv_draw_fill_dsc_t * fill_dsc = t->draw_dsc; - if(fill_dsc->radius == 0 && fill_dsc->grad.dir == LV_GRAD_DIR_NONE) { - SDL_Rect rect; - lv_layer_t * layer = u->base_unit.target_layer; - lv_area_t fill_area = t->area; - lv_area_intersect(&fill_area, &fill_area, u->base_unit.clip_area); - - rect.x = fill_area.x1 - layer->buf_area.x1; - rect.y = fill_area.y1 - layer->buf_area.y1; - rect.w = lv_area_get_width(&fill_area); - rect.h = lv_area_get_height(&fill_area); - lv_display_t * disp = lv_refr_get_disp_refreshing(); - SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); - SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); - SDL_SetRenderDrawColor(renderer, fill_dsc->color.red, fill_dsc->color.green, fill_dsc->color.blue, fill_dsc->opa); - SDL_RenderSetClipRect(renderer, NULL); - SDL_RenderFillRect(renderer, &rect); - return; - } - } - - if(t->type == LV_DRAW_TASK_TYPE_LAYER) { - blend_texture_layer(u); - return; - } - - draw_from_cached_texture(u); -} - -static SDL_Texture * layer_get_texture(lv_layer_t * layer) -{ - return layer->user_data; -} - -#endif /*LV_USE_DRAW_SDL*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sdl/lv_draw_sdl.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sdl/lv_draw_sdl.h deleted file mode 100644 index d9b061d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sdl/lv_draw_sdl.h +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @file lv_draw_sdl.h - * - */ - -#ifndef LV_DRAW_SDL_H -#define LV_DRAW_SDL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_draw.h" - -#if LV_USE_DRAW_SDL - -#include "../../misc/cache/lv_cache.h" -#include "../../misc/lv_area.h" -#include "../../misc/lv_color.h" -#include "../../display/lv_display.h" -#include "../../osal/lv_os.h" -#include "../../draw/lv_draw_label.h" -#include "../../draw/lv_draw_rect.h" -#include "../../draw/lv_draw_arc.h" -#include "../../draw/lv_draw_image.h" -#include "../../draw/lv_draw_triangle.h" -#include "../../draw/lv_draw_line.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_draw_unit_t base_unit; - lv_draw_task_t * task_act; - uint32_t texture_cache_data_type; - lv_cache_t * texture_cache; -} lv_draw_sdl_unit_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_draw_sdl_init(void); - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sdl_image(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords); - -void lv_draw_sdl_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); - -void lv_draw_sdl_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords); - -void lv_draw_sdl_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords); - -void lv_draw_sdl_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords); - -void lv_draw_sdl_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords); - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sdl_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); - -void lv_draw_sdl_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords); - -void lv_draw_sdl_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc); - -void lv_draw_sdl_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, const lv_area_t * coords); - -/*********************** - * GLOBAL VARIABLES - ***********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_SDL*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SDL_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/arm2d/lv_draw_sw_arm2d.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/arm2d/lv_draw_sw_arm2d.h deleted file mode 100644 index 77c6cc4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/arm2d/lv_draw_sw_arm2d.h +++ /dev/null @@ -1,589 +0,0 @@ -/** - * @file lv_draw_sw_arm2d.h - * - */ - -#ifndef LV_DRAW_SW_ARM2D_H -#define LV_DRAW_SW_ARM2D_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* *INDENT-OFF* */ - -/********************* - * INCLUDES - *********************/ - -#include "../../../lv_conf_internal.h" -#include "../../../misc/lv_area_private.h" - -#if LV_USE_DRAW_ARM2D_SYNC - -#define __ARM_2D_IMPL__ -#include "arm_2d.h" -#include "__arm_2d_impl.h" - -#if defined(__IS_COMPILER_ARM_COMPILER_5__) -#pragma diag_suppress 174,177,188,68,513,144,1296 -#elif defined(__IS_COMPILER_IAR__) -#pragma diag_suppress=Pa093 -#elif defined(__IS_COMPILER_GCC__) -#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers" -#endif - -/********************* - * DEFINES - *********************/ -#ifndef LV_DRAW_SW_RGB565_SWAP - #define LV_DRAW_SW_RGB565_SWAP(__buf_ptr, __buf_size_px) \ - lv_draw_sw_rgb565_swap_helium((__buf_ptr), (__buf_size_px)) -#endif - -#ifndef LV_DRAW_SW_IMAGE - #define LV_DRAW_SW_IMAGE(__transformed, \ - __cf, \ - __src_buf, \ - __img_coords, \ - __src_stride, \ - __blend_area, \ - __draw_unit, \ - __draw_dsc) \ - lv_draw_sw_image_helium( (__transformed), \ - (__cf), \ - (uint8_t *)(__src_buf), \ - (__img_coords), \ - (__src_stride), \ - (__blend_area), \ - (__draw_unit), \ - (__draw_dsc)) -#endif - -#ifndef LV_DRAW_SW_RGB565_RECOLOR - #define LV_DRAW_SW_RGB565_RECOLOR(__src_buf, __blend_area, __color, __opa) \ - lv_draw_sw_image_recolor_rgb565( (__src_buf), \ - &(__blend_area), \ - (__color), \ - (__opa)) -#endif - -#ifndef LV_DRAW_SW_RGB888_RECOLOR - #define LV_DRAW_SW_RGB888_RECOLOR( __src_buf, \ - __blend_area, \ - __color, \ - __opa, \ - __cf) \ - lv_draw_sw_image_recolor_rgb888( (__src_buf), \ - &(__blend_area), \ - (__color), \ - (__opa), \ - (__cf)) -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ -extern void arm_2d_helper_swap_rgb16(uint16_t * phwBuffer, uint32_t wCount); - -/********************** - * MACROS - **********************/ - -#define __RECOLOUR_BEGIN() \ - do { \ - lv_color_t *rgb_tmp_buf = NULL; \ - if(draw_dsc->recolor_opa > LV_OPA_MIN) { \ - if(LV_COLOR_FORMAT_RGB565 == des_cf) { \ - rgb_tmp_buf \ - = lv_malloc(src_w * src_h * sizeof(uint16_t)); \ - if (NULL == rgb_tmp_buf) { \ - LV_LOG_WARN( \ - "Failed to allocate memory for accelerating recolor, " \ - "use normal route instead."); \ - break; \ - } \ - lv_memcpy( rgb_tmp_buf, \ - src_buf, \ - src_w * src_h * sizeof(uint16_t)); \ - arm_2d_size_t copy_size = { \ - .iWidth = src_w, \ - .iHeight = src_h, \ - }; \ - /* apply re-color */ \ - __arm_2d_impl_rgb565_colour_filling_with_opacity( \ - (uint16_t *)rgb_tmp_buf, \ - src_w, \ - ©_size, \ - lv_color_to_u16(draw_dsc->recolor), \ - draw_dsc->recolor_opa); \ - \ - /* replace src_buf for the following operation */ \ - src_buf = (const uint8_t *)rgb_tmp_buf; \ - } \ - else if(LV_COLOR_FORMAT_XRGB8888 == des_cf) { \ - rgb_tmp_buf \ - = lv_malloc(src_w * src_h * sizeof(uint32_t)); \ - if (NULL == rgb_tmp_buf) { \ - LV_LOG_WARN( \ - "Failed to allocate memory for accelerating recolor, " \ - "use normal route instead."); \ - break; \ - } \ - lv_memcpy( rgb_tmp_buf, \ - src_buf, \ - src_w * src_h * sizeof(uint32_t)); \ - arm_2d_size_t copy_size = { \ - .iWidth = src_w, \ - .iHeight = src_h, \ - }; \ - /* apply re-color */ \ - __arm_2d_impl_cccn888_colour_filling_with_opacity( \ - (uint32_t *)rgb_tmp_buf, \ - src_w, \ - ©_size, \ - lv_color_to_u32(draw_dsc->recolor), \ - draw_dsc->recolor_opa); \ - \ - /* replace src_buf for the following operation */ \ - src_buf = (const uint8_t *)rgb_tmp_buf; \ - } \ - } \ - do { - -#define __RECOLOUR_END() \ - } while(0); \ - if (NULL != rgb_tmp_buf) { \ - lv_free(rgb_tmp_buf); \ - } \ - } while(0); - -static inline lv_result_t lv_draw_sw_rgb565_swap_helium(void * buf, uint32_t buf_size_px) -{ - arm_2d_helper_swap_rgb16((uint16_t *)buf, buf_size_px); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_draw_sw_image_helium( - bool is_transform, - lv_color_format_t src_cf, - const uint8_t *src_buf, - const lv_area_t * coords, - int32_t src_stride, - const lv_area_t * des_area, - lv_draw_unit_t * draw_unit, - const lv_draw_image_dsc_t * draw_dsc) -{ - lv_result_t result = LV_RESULT_INVALID; - lv_layer_t * layer = draw_unit->target_layer; - lv_color_format_t des_cf = layer->color_format; - static bool arm_2d_initialized = false; - - if (!arm_2d_initialized) { - arm_2d_initialized = true; - arm_2d_init(); - } - - do { - if (!is_transform) { - break; - } - if(draw_dsc->scale_x != draw_dsc->scale_y) { - break; - } - /* filter the unsupported colour format combination */ - if((LV_COLOR_FORMAT_RGB565 == des_cf) - && !( (LV_COLOR_FORMAT_RGB565 == src_cf) - || (LV_COLOR_FORMAT_RGB565A8 == src_cf))) { - break; - } - #if 0 /* a temporary patch */ - if((LV_COLOR_FORMAT_XRGB8888 == des_cf) - && !( (LV_COLOR_FORMAT_ARGB8888 == src_cf) - || (LV_COLOR_FORMAT_XRGB8888 == src_cf))) { - break; - } - #else - if((LV_COLOR_FORMAT_XRGB8888 == des_cf) - || (LV_COLOR_FORMAT_RGB888 == des_cf) - || (LV_COLOR_FORMAT_ARGB8888 == des_cf)) { - break; - } - #endif - - /* ------------- prepare parameters for arm-2d APIs - BEGIN --------- */ - - lv_area_t blend_area; - if(!lv_area_intersect(&blend_area, des_area, draw_unit->clip_area)) { - break; - } - - int32_t src_w = lv_area_get_width(coords); - int32_t src_h = lv_area_get_height(coords); - - arm_2d_size_t src_size = { - .iWidth = (int16_t)src_w, - .iHeight = (int16_t)src_h, - }; - -// arm_2d_size_t des_size; - -// do{ -// int32_t des_w = lv_area_get_width(&blend_area); -// int32_t des_h = lv_area_get_height(&blend_area); - -// LV_ASSERT(des_w <= INT16_MAX); -// LV_ASSERT(des_h <= INT16_MAX); - -// des_size.iWidth = (int16_t)des_w; -// des_size.iHeight = (int16_t)des_h; -// } while(0); -// -// arm_2d_size_t copy_size = { -// .iWidth = MIN(des_size.iWidth, src_size.iWidth), -// .iHeight = MIN(des_size.iHeight, src_size.iHeight), -// }; -// -// int32_t des_stride = lv_draw_buf_width_to_stride( -// lv_area_get_width(&layer->buf_area), -// des_cf); -// uint8_t *des_buf_moved = (uint8_t *)lv_draw_layer_go_to_xy( -// layer, -// blend_area.x1 - layer->buf_area.x1, -// blend_area.y1 - layer->buf_area.y1); - uint8_t *des_buf = (uint8_t *)lv_draw_layer_go_to_xy(layer, 0, 0); - uint8_t opa = draw_dsc->opa; - - /* ------------- prepare parameters for arm-2d APIs - END ----------- */ - __RECOLOUR_BEGIN() - - static arm_2d_tile_t target_tile_origin; - static arm_2d_tile_t target_tile; - arm_2d_region_t clip_region; - static arm_2d_region_t target_region; - - target_region = (arm_2d_region_t) { - .tLocation = { - .iX = (int16_t)(coords->x1 - draw_unit->clip_area->x1), - .iY = (int16_t)(coords->y1 - draw_unit->clip_area->y1), - }, - .tSize = src_size, - }; - - target_tile_origin = (arm_2d_tile_t) { - .tRegion = { - .tSize = { - .iWidth = (int16_t)lv_area_get_width(&layer->buf_area), - .iHeight = (int16_t)lv_area_get_height(&layer->buf_area), - }, - }, - .tInfo = { - .bIsRoot = true, - }, - .phwBuffer = (uint16_t *)des_buf, - }; - - clip_region = (arm_2d_region_t) { - .tLocation = { - .iX = (int16_t)(draw_unit->clip_area->x1 - layer->buf_area.x1), - .iY = (int16_t)(draw_unit->clip_area->y1 - layer->buf_area.y1), - }, - .tSize = { - .iWidth = (int16_t)lv_area_get_width(draw_unit->clip_area), - .iHeight = (int16_t)lv_area_get_height(draw_unit->clip_area), - }, - }; - - arm_2d_tile_generate_child(&target_tile_origin, - &clip_region, - &target_tile, - false); - - static arm_2d_tile_t source_tile; - - source_tile = (arm_2d_tile_t) { - .tRegion = { - .tSize = { - .iWidth = (int16_t)src_w, - .iHeight = (int16_t)src_h, - }, - }, - .tInfo = { - .bIsRoot = true, - }, - .pchBuffer = (uint8_t *)src_buf, - }; - - static arm_2d_location_t source_center, target_center; - source_center.iX = draw_dsc->pivot.x; - source_center.iY = draw_dsc->pivot.y; - target_center = target_region.tLocation; - target_center.iX += draw_dsc->pivot.x; - target_center.iY += draw_dsc->pivot.y; - - if(LV_COLOR_FORMAT_A8 == src_cf) { - - source_tile.tInfo.bHasEnforcedColour = true; - source_tile.tInfo.tColourInfo.chScheme = ARM_2D_COLOUR_GRAY8; - - if(LV_COLOR_FORMAT_RGB565 == des_cf) { - - arm_2d_rgb565_fill_colour_with_mask_opacity_and_transform( - &source_tile, - &target_tile, - NULL, - source_center, - ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), - draw_dsc->scale_x / 256.0f, - lv_color_to_u16(draw_dsc->recolor), - opa, - &target_center - ); - - } - else if(LV_COLOR_FORMAT_XRGB8888 == des_cf) { - arm_2d_cccn888_fill_colour_with_mask_opacity_and_transform( - &source_tile, - &target_tile, - NULL, - source_center, - ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), - draw_dsc->scale_x / 256.0f, - lv_color_to_int(draw_dsc->recolor), - opa, - &target_center - ); - } - else { - break; - } - - } - else if(LV_COLOR_FORMAT_RGB565A8 == src_cf) { - LV_ASSERT(LV_COLOR_FORMAT_RGB565 == des_cf); - - /* mask_buf = src_buf + src_stride * src_w / header->w * src_h; */ - const uint8_t *mask_buf = src_buf + src_stride * src_h; - int32_t mask_stride = src_stride / 2; - - static arm_2d_tile_t mask_tile; - mask_tile = source_tile; - - mask_tile.tInfo.bHasEnforcedColour = true; - mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_COLOUR_GRAY8; - mask_tile.pchBuffer = (uint8_t *)mask_buf; - - if(opa >= LV_OPA_MAX) { - arm_2d_rgb565_tile_transform_with_src_mask( - &source_tile, - &mask_tile, - &target_tile, - NULL, - source_center, - ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), - draw_dsc->scale_x / 256.0f, - &target_center - ); - } - else { - arm_2d_rgb565_tile_transform_with_src_mask_and_opacity( - &source_tile, - &mask_tile, - &target_tile, - NULL, - source_center, - ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), - draw_dsc->scale_x / 256.0f, - opa, - &target_center - ); - } - - } - else if(LV_COLOR_FORMAT_RGB565 == src_cf) { - LV_ASSERT(LV_COLOR_FORMAT_RGB565 == des_cf); - - if(opa >= LV_OPA_MAX) { - #if ARM_2D_VERSION >= 10106 - arm_2d_rgb565_tile_transform_only( - &source_tile, - &target_tile, - NULL, - source_center, - ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), - draw_dsc->scale_x / 256.0f, - &target_center); - #else - - arm_2dp_rgb565_tile_transform_only_prepare( - NULL, - &source_tile, - source_center, - ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), - (float)(draw_dsc->scale_x / 256.0f)); - - arm_2dp_tile_transform(NULL, - &target_tile, - NULL, - &target_center); - #endif - } - else { - arm_2d_rgb565_tile_transform_only_with_opacity( - &source_tile, - &target_tile, - NULL, - source_center, - ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), - draw_dsc->scale_x / 256.0f, - opa, - &target_center - ); - } - - } - #if 0 /* a temporary patch */ - else if(LV_COLOR_FORMAT_ARGB8888 == src_cf) { - LV_ASSERT(LV_COLOR_FORMAT_XRGB8888 == des_cf); - - static arm_2d_tile_t mask_tile; - mask_tile = source_tile; - - mask_tile.tInfo.bHasEnforcedColour = true; - mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_CHANNEL_8in32; - mask_tile.pchBuffer = (uint8_t *)src_buf + 3; - - if(opa >= LV_OPA_MAX) { - arm_2d_cccn888_tile_transform_with_src_mask( - &source_tile, - &mask_tile, - &target_tile, - NULL, - source_center, - ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), - draw_dsc->scale_x / 256.0f, - &target_center - ); - } - else { - arm_2d_cccn888_tile_transform_with_src_mask_and_opacity( - &source_tile, - &mask_tile, - &target_tile, - NULL, - source_center, - ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), - draw_dsc->scale_x / 256.0f, - opa, - &target_center - ); - } - - } - else if(LV_COLOR_FORMAT_XRGB8888 == src_cf) { - LV_ASSERT(LV_COLOR_FORMAT_XRGB8888 == des_cf); - - if(opa >= LV_OPA_MAX) { - arm_2d_cccn888_tile_transform_only( - &source_tile, - &target_tile, - NULL, - source_center, - ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), - draw_dsc->scale_x / 256.0f, - &target_center - ); - } - else { - arm_2d_cccn888_tile_transform_only_with_opacity( - &source_tile, - &target_tile, - NULL, - source_center, - ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), - draw_dsc->scale_x / 256.0f, - opa, - &target_center - ); - } - - } - #endif - else { - break; - } - - result = LV_RESULT_OK; - - __RECOLOUR_END() - } while(0); - - return result; -} - -static inline lv_result_t lv_draw_sw_image_recolor_rgb565( - const uint8_t *src_buf, - const lv_area_t * blend_area, - lv_color_t color, - lv_opa_t opa) -{ - int32_t src_w = lv_area_get_width(blend_area); - int32_t src_h = lv_area_get_height(blend_area); - - arm_2d_size_t copy_size = { - .iWidth = (int16_t)src_w, - .iHeight = (int16_t)src_h, - }; - - __arm_2d_impl_rgb565_colour_filling_with_opacity( - (uint16_t *)src_buf, - src_w, - ©_size, - lv_color_to_u16(color), - opa); - - return LV_RESULT_OK; -} - -static inline lv_result_t lv_draw_sw_image_recolor_rgb888( - const uint8_t *src_buf, - const lv_area_t * blend_area, - lv_color_t color, - lv_opa_t opa, - lv_color_format_t src_cf) -{ - if(LV_COLOR_FORMAT_XRGB8888 != src_cf) { - return LV_RESULT_INVALID; - } - - int32_t src_w = lv_area_get_width(blend_area); - int32_t src_h = lv_area_get_height(blend_area); - - arm_2d_size_t copy_size = { - .iWidth = (int16_t)src_w, - .iHeight = (int16_t)src_h, - }; - - __arm_2d_impl_cccn888_colour_filling_with_opacity( - (uint32_t *)src_buf, - src_w, - ©_size, - lv_color_to_u32(color), - opa); - - return LV_RESULT_OK; -} - -#endif /* LV_USE_DRAW_ARM2D_SYNC */ - -/* *INDENT-ON* */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_ARM2D_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/arm2d/lv_draw_sw_helium.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/arm2d/lv_draw_sw_helium.h deleted file mode 100644 index c35a06e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/arm2d/lv_draw_sw_helium.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file lv_draw_sw_helium.h - * - */ - -#ifndef LV_DRAW_SW_HELIUM_H -#define LV_DRAW_SW_HELIUM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* *INDENT-OFF* */ - -/********************* - * INCLUDES - *********************/ - -#include "../../../lv_conf_internal.h" - -/* detect whether helium is available based on arm compilers' standard */ -#if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE - -#ifdef LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE -#include LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************* - * POST INCLUDES - *********************/ -/* use arm-2d as the default helium acceleration */ -#include "lv_draw_sw_arm2d.h" - -#endif /* defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_HELIUM_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/arm2d/lv_blend_arm2d.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/arm2d/lv_blend_arm2d.h deleted file mode 100644 index 0eb29b8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/arm2d/lv_blend_arm2d.h +++ /dev/null @@ -1,937 +0,0 @@ -/** - * @file lv_blend_arm2d.h - * - */ - -#ifndef LV_BLEND_ARM2D_H -#define LV_BLEND_ARM2D_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../../../lv_conf_internal.h" - -#if LV_USE_DRAW_ARM2D_SYNC - -#define __ARM_2D_IMPL__ -#include "arm_2d.h" -#include "__arm_2d_impl.h" - -#if defined(__IS_COMPILER_ARM_COMPILER_5__) -#pragma diag_suppress 174,177,188,68,513,144,1296 -#elif defined(__IS_COMPILER_IAR__) -#pragma diag_suppress=Pa093 -#elif defined(__IS_COMPILER_GCC__) -#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers" -#endif - - -#if ARM_2D_VERSION < 10106ul -#error Please upgrade to Arm-2D v1.1.6 or above -#endif - -#ifndef LV_ARM2D_XRGB888_ALPHA_ALWAYS_FF -#define LV_ARM2D_XRGB888_ALPHA_ALWAYS_FF 1 -#endif - -/********************* - * DEFINES - *********************/ - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) \ - lv_color_blend_to_rgb565_arm2d(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) \ - lv_color_blend_to_rgb565_with_opa_arm2d(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) \ - lv_color_blend_to_rgb565_with_mask_arm2d(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) \ - lv_color_blend_to_rgb565_mix_mask_opa_arm2d(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) \ - lv_rgb565_blend_normal_to_rgb565_arm2d(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ - lv_rgb565_blend_normal_to_rgb565_with_opa_arm2d(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ - lv_rgb565_blend_normal_to_rgb565_with_mask_arm2d(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ - lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_rgb565_arm2d(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_rgb565_with_opa_arm2d(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_rgb565_with_mask_arm2d(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) \ - lv_argb8888_blend_normal_to_rgb565_arm2d(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ - lv_argb8888_blend_normal_to_rgb565_with_opa_arm2d(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ - lv_argb8888_blend_normal_to_rgb565_with_mask_arm2d(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ - lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dst_px_size) \ - lv_color_blend_to_rgb888_arm2d(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - lv_color_blend_to_rgb888_with_opa_arm2d(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - lv_color_blend_to_rgb888_with_mask_arm2d(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - lv_color_blend_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ - lv_rgb565_blend_normal_to_rgb888_arm2d(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - lv_rgb565_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - lv_rgb565_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size, src_px_size) \ - lv_rgb888_blend_normal_to_rgb888_arm2d(dsc, dst_px_size, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size, src_px_size) \ - lv_rgb888_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size, src_px_size) \ - lv_rgb888_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size, src_px_size) \ - lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size, src_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ - lv_argb8888_blend_normal_to_rgb888_arm2d(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - lv_argb8888_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - lv_argb8888_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -static inline lv_result_t lv_color_blend_to_rgb565_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); - __arm_2d_impl_rgb16_colour_filling((uint16_t *)dsc->dest_buf, - stride, - &draw_size, - lv_color_to_u16(dsc->color)); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_color_blend_to_rgb565_with_opa_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); - __arm_2d_impl_rgb565_colour_filling_with_opacity((uint16_t *)dsc->dest_buf, - stride, - &draw_size, - lv_color_to_u16(dsc->color), - dsc->opa); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_color_blend_to_rgb565_with_mask_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); - __arm_2d_impl_rgb565_colour_filling_mask((uint16_t *)dsc->dest_buf, - stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - lv_color_to_u16(dsc->color)); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_color_blend_to_rgb565_mix_mask_opa_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); - __arm_2d_impl_rgb565_colour_filling_mask_opacity((uint16_t *)dsc->dest_buf, - stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - lv_color_to_u16(dsc->color), - dsc->opa); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) -{ - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); - int16_t src_stride = dsc->src_stride / sizeof(uint16_t); - __arm_2d_impl_rgb16_copy((uint16_t *)dsc->src_buf, - src_stride, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) -{ - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); - int16_t src_stride = dsc->src_stride / sizeof(uint16_t); - __arm_2d_impl_rgb565_tile_copy_opacity((uint16_t *)dsc->src_buf, - src_stride, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) -{ - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); - int16_t src_stride = dsc->src_stride / sizeof(uint16_t); - __arm_2d_impl_rgb565_src_msk_copy((uint16_t *)dsc->src_buf, - src_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) -{ - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); - int16_t src_stride = dsc->src_stride / sizeof(uint16_t); - - __arm_2d_impl_rgb565_tile_copy_with_src_mask_and_opacity((uint16_t *)dsc->src_buf, - src_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - if(src_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, - src_stride, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size); - - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - if(src_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - uint16_t * tmp_buf = (uint16_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); - if(NULL == tmp_buf) { - return LV_RESULT_INVALID; - } - -#if !LV_ARM2D_XRGB888_ALPHA_ALWAYS_FF - __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, - src_stride, - (uint16_t *)tmp_buf, - des_stride, - &draw_size); - - __arm_2d_impl_rgb565_tile_copy_opacity(tmp_buf, - des_stride, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); -#else - __arm_2d_impl_ccca8888_tile_copy_to_rgb565_with_opacity((uint32_t *)dsc->src_buf, - src_stride, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); -#endif - lv_free(tmp_buf); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - if(src_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - uint16_t * tmp_buf = (uint16_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); - if(NULL == tmp_buf) { - return LV_RESULT_INVALID; - } - -#if !LV_ARM2D_XRGB888_ALPHA_ALWAYS_FF - __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, - src_stride, - (uint16_t *)tmp_buf, - des_stride, - &draw_size); - - __arm_2d_impl_rgb565_src_msk_copy(tmp_buf, - des_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size); -#else - __arm_2d_impl_ccca8888_tile_copy_to_rgb565_with_src_mask((uint32_t *)dsc->src_buf, - src_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size); -#endif - - lv_free(tmp_buf); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - if(src_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - uint16_t * tmp_buf = (uint16_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); - if(NULL == tmp_buf) { - return LV_RESULT_INVALID; - } - -#if !LV_ARM2D_XRGB888_ALPHA_ALWAYS_FF - __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, - src_stride, - (uint16_t *)tmp_buf, - des_stride, - &draw_size); - - __arm_2d_impl_rgb565_tile_copy_with_src_mask_and_opacity(tmp_buf, - des_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); -#else - __arm_2d_impl_ccca8888_tile_copy_to_rgb565_with_src_mask_and_opacity((uint32_t *)dsc->src_buf, - src_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); -#endif - - lv_free(tmp_buf); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) -{ - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - __arm_2d_impl_ccca8888_to_rgb565((uint32_t *)dsc->src_buf, - src_stride, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size); - - return LV_RESULT_OK; -} - -static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) -{ - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - __arm_2d_impl_ccca8888_tile_copy_to_rgb565_with_opacity((uint32_t *)dsc->src_buf, - src_stride, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); - - return LV_RESULT_OK; -} - -static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) -{ - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - __arm_2d_impl_ccca8888_tile_copy_to_rgb565_with_src_mask((uint32_t *)dsc->src_buf, - src_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size); - - return LV_RESULT_OK; -} - -static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) -{ - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - __arm_2d_impl_ccca8888_tile_copy_to_rgb565_with_src_mask_and_opacity((uint32_t *)dsc->src_buf, - src_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint16_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); - - return LV_RESULT_OK; -} - -static inline lv_result_t lv_color_blend_to_rgb888_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) -{ - if(dst_px_size == 3) { - return LV_RESULT_INVALID; - } - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t stride = (dsc->dest_stride) / sizeof(uint32_t); - __arm_2d_impl_rgb32_colour_filling((uint32_t *)dsc->dest_buf, - stride, - &draw_size, - lv_color_to_u32(dsc->color)); - return LV_RESULT_OK; - -} - -static inline lv_result_t lv_color_blend_to_rgb888_with_opa_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) -{ - if(dst_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t stride = (dsc->dest_stride) / sizeof(uint32_t); - __arm_2d_impl_cccn888_colour_filling_with_opacity((uint32_t *)dsc->dest_buf, - stride, - &draw_size, - lv_color_to_u32(dsc->color), - dsc->opa); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_color_blend_to_rgb888_with_mask_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) -{ - - if(dst_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t stride = (dsc->dest_stride) / sizeof(uint32_t); - __arm_2d_impl_cccn888_colour_filling_mask((uint32_t *)dsc->dest_buf, - stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - lv_color_to_u32(dsc->color)); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_color_blend_to_rgb888_mix_mask_opa_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) -{ - - if(dst_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t stride = (dsc->dest_stride) / sizeof(uint32_t); - __arm_2d_impl_cccn888_colour_filling_mask_opacity((uint32_t *)dsc->dest_buf, - stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - lv_color_to_u32(dsc->color), - dsc->opa); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - - if(dst_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); - int16_t src_stride = dsc->src_stride / sizeof(uint16_t); - - __arm_2d_impl_rgb565_to_cccn888((uint16_t *)dsc->src_buf, - src_stride, - (uint32_t *)dsc->dest_buf, - des_stride, - &draw_size); - - return LV_RESULT_OK; - -} - -static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - - if(dst_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); - int16_t src_stride = dsc->src_stride / sizeof(uint16_t); - - uint32_t * tmp_buf = (uint32_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); - if(NULL == tmp_buf) { - return LV_RESULT_INVALID; - } - - /* get rgb565 */ - __arm_2d_impl_rgb565_to_cccn888((uint16_t *)dsc->src_buf, - src_stride, - (uint32_t *)tmp_buf, - des_stride, - &draw_size); - - __arm_2d_impl_cccn888_tile_copy_opacity(tmp_buf, - des_stride, - (uint32_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); - - lv_free(tmp_buf); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - - if(dst_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); - int16_t src_stride = dsc->src_stride / sizeof(uint16_t); - - uint32_t * tmp_buf = (uint32_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); - if(NULL == tmp_buf) { - return LV_RESULT_INVALID; - } - - __arm_2d_impl_rgb565_to_cccn888((uint16_t *)dsc->src_buf, - src_stride, - (uint32_t *)tmp_buf, - des_stride, - &draw_size); - - __arm_2d_impl_cccn888_src_msk_copy(tmp_buf, - des_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint32_t *)dsc->dest_buf, - des_stride, - &draw_size); - - lv_free(tmp_buf); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - - if(dst_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); - int16_t src_stride = dsc->src_stride / sizeof(uint16_t); - - uint32_t * tmp_buf = (uint32_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); - if(NULL == tmp_buf) { - return LV_RESULT_INVALID; - } - - __arm_2d_impl_rgb565_to_cccn888((uint16_t *)dsc->src_buf, - src_stride, - (uint32_t *)tmp_buf, - des_stride, - &draw_size); - - __arm_2d_impl_cccn888_tile_copy_with_src_mask_and_opacity(tmp_buf, - des_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint32_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); - - lv_free(tmp_buf); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, - uint32_t src_px_size) -{ - if((dst_px_size == 3) || (src_px_size == 3)) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - __arm_2d_impl_rgb32_copy((uint32_t *)dsc->src_buf, - src_stride, - (uint32_t *)dsc->dest_buf, - des_stride, - &draw_size); - - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) -{ - if((dst_px_size == 3) || (src_px_size == 3)) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - __arm_2d_impl_cccn888_tile_copy_opacity((uint32_t *)dsc->src_buf, - src_stride, - (uint32_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); - - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) -{ - if((dst_px_size == 3) || (src_px_size == 3)) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - __arm_2d_impl_cccn888_src_msk_copy((uint32_t *)dsc->src_buf, - src_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint32_t *)dsc->dest_buf, - des_stride, - &draw_size); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) -{ - if((dst_px_size == 3) || (src_px_size == 3)) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - __arm_2d_impl_cccn888_tile_copy_with_src_mask_and_opacity((uint32_t *)dsc->src_buf, - src_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint32_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); - return LV_RESULT_OK; -} - -static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - - if(dst_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - __arm_2d_impl_ccca8888_to_cccn888((uint32_t *)dsc->src_buf, - src_stride, - (uint32_t *)dsc->dest_buf, - des_stride, - &draw_size); - - return LV_RESULT_OK; -} - -static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - if(dst_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - __arm_2d_impl_ccca8888_tile_copy_to_cccn888_with_opacity((uint32_t *)dsc->src_buf, - src_stride, - (uint32_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); - - return LV_RESULT_OK; -} - -static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - - if(dst_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - __arm_2d_impl_ccca8888_tile_copy_to_cccn888_with_src_mask((uint32_t *)dsc->src_buf, - src_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint32_t *)dsc->dest_buf, - des_stride, - &draw_size); - - return LV_RESULT_OK; -} - -static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - if(dst_px_size == 3) { - return LV_RESULT_INVALID; - } - - arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; - int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); - int16_t src_stride = dsc->src_stride / sizeof(uint32_t); - - __arm_2d_impl_ccca8888_tile_copy_to_cccn888_with_src_mask_and_opacity((uint32_t *)dsc->src_buf, - src_stride, - (uint8_t *)dsc->mask_buf, - dsc->mask_stride, - &draw_size, - (uint32_t *)dsc->dest_buf, - des_stride, - &draw_size, - dsc->opa); - - return LV_RESULT_OK; -} - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_DRAW_ARM2D_SYNC */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_BLEND_ARM2D_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/helium/lv_blend_helium.S b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/helium/lv_blend_helium.S deleted file mode 100644 index 4304d74..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/helium/lv_blend_helium.S +++ /dev/null @@ -1,701 +0,0 @@ -/** - * @file lv_blend_helium.S - * - */ - -#ifndef __ASSEMBLY__ -#define __ASSEMBLY__ -#endif - -#include "lv_blend_helium.h" - -#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM && defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE && LV_USE_NATIVE_HELIUM_ASM - -.data -reciprocal: -.byte 0xFF, 0xE2, 0xCC, 0xB9, 0xAA, 0x9C, 0x91, 0x88 - -.text -.syntax unified -.p2align 2 - -TMP .req r0 -DST_ADDR .req r1 -DST_W .req r2 -DST_H .req r3 -DST_STRIDE .req r4 -SRC_ADDR .req r5 -SRC_STRIDE .req r6 -MASK_ADDR .req r7 -MASK_STRIDE .req r8 -H .req r9 -OPA .req r10 -RCP .req r11 - -S_B .req q0 -S_G .req q1 -S_R .req q2 -S_A .req q3 -D_B .req q4 -D_G .req q5 -D_R .req q6 -D_A .req q7 -N .req q0 -V .req q1 -R .req q2 -L .req q4 -S_565 .req q0 -D_565 .req q1 -S_L .req q2 -D_L .req q4 -D_T .req q5 -BITMASK .req q6 - -.macro ldst st, op, bpp, mem, reg, areg, cvt, alt_index, wb, aligned -.if \bpp == 0 -.if \cvt - ldr TMP, [\mem\()_ADDR] - bfi TMP, TMP, #2, #8 - bfi TMP, TMP, #3, #16 - lsr TMP, TMP, #8 - vdup.16 \reg\()_565, TMP -.else - ldr TMP, [\mem\()_ADDR] - vdup.8 \reg\()_B, TMP - lsr TMP, #8 - vdup.8 \reg\()_G, TMP - lsr TMP, #8 - vdup.8 \reg\()_R, TMP -.endif -.elseif \bpp == 8 -.if \cvt - v\op\()rb.u16 \reg\()_A, [\mem\()_ADDR], #8 -.else - v\op\()rb.8 \reg\()_A, [\mem\()_ADDR], #16 -.endif -.elseif \bpp == 16 -.if \cvt -.if \st - vsri.8 \reg\()_R, \reg\()_G, #5 - vshr.u8 \reg\()_G, \reg\()_G, #2 - vshr.u8 \reg\()_B, \reg\()_B, #3 - vsli.8 \reg\()_B, \reg\()_G, #5 -.endif -.if \alt_index - v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, S_B] - v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, S_G] -.else - v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, \reg\()_A] - add \mem\()_ADDR, #1 - v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, \reg\()_A] -.endif -.if \st == 0 - vshl.u8 \reg\()_G, \reg\()_R, #5 - vsri.u8 \reg\()_G, \reg\()_B, #3 - vshl.u8 \reg\()_B, \reg\()_B, #3 - vsri.u8 \reg\()_R, \reg\()_R, #5 - vsri.u8 \reg\()_G, \reg\()_G, #6 - vsri.u8 \reg\()_B, \reg\()_B, #5 -.endif -.ifc \wb, ! -.if \alt_index - add \mem\()_ADDR, #32 -.else - add \mem\()_ADDR, #31 -.endif -.elseif \alt_index == 0 - sub \mem\()_ADDR, #1 -.endif -.else @ cvt -.ifc \wb, ! - v\op\()rh.16 \reg\()_565, [\mem\()_ADDR], #16 -.else - v\op\()rh.16 \reg\()_565, [\mem\()_ADDR] -.endif -.endif -.elseif \bpp == 24 -.if \alt_index == 1 - v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, S_B] - v\op\()rb.8 \reg\()_G, [\mem\()_ADDR, S_G] - v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, S_R] -.elseif \alt_index == 2 - v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, S_R] - v\op\()rb.8 \reg\()_G, [\mem\()_ADDR, S_A] - v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, D_A] -.else - v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, \reg\()_A] - add \mem\()_ADDR, #1 - v\op\()rb.8 \reg\()_G, [\mem\()_ADDR, \reg\()_A] - add \mem\()_ADDR, #1 - v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, \reg\()_A] -.endif -.ifc \wb, ! -.if \alt_index - add \mem\()_ADDR, #48 -.else - add \mem\()_ADDR, #46 -.endif -.elseif \alt_index == 0 - sub \mem\()_ADDR, #2 -.endif -.elseif \aligned - v\op\()40.8 {\reg\()_B, \reg\()_G, \reg\()_R, \reg\()_A}, [\mem\()_ADDR] - v\op\()41.8 {\reg\()_B, \reg\()_G, \reg\()_R, \reg\()_A}, [\mem\()_ADDR] - v\op\()42.8 {\reg\()_B, \reg\()_G, \reg\()_R, \reg\()_A}, [\mem\()_ADDR] - v\op\()43.8 {\reg\()_B, \reg\()_G, \reg\()_R, \reg\()_A}, [\mem\()_ADDR]\wb -.else - v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, \areg\()_A] - add \mem\()_ADDR, #1 - v\op\()rb.8 \reg\()_G, [\mem\()_ADDR, \areg\()_A] - add \mem\()_ADDR, #1 - v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, \areg\()_A] -.if (\bpp == 32) || (\bpp == 31) && \st - add \mem\()_ADDR, #1 - v\op\()rb.8 \reg\()_A, [\mem\()_ADDR, \areg\()_A] -.endif -.ifc \wb, ! - .if (\bpp == 32) || (\bpp == 31) && \st - add \mem\()_ADDR, #61 - .else - add \mem\()_ADDR, #62 - .endif -.else - .if (\bpp == 32) || (\bpp == 31) && \st - sub \mem\()_ADDR, #3 - .else - sub \mem\()_ADDR, #2 - .endif -.endif -.endif -.endm - -.macro load_index bpp, reg, areg, aligned -.if (\bpp > 0) && ((\bpp < 31) || (\aligned == 0)) - mov TMP, #0 -.if \bpp == 8 - vidup.u8 \reg\()_A, TMP, #1 -.elseif \bpp == 16 - vidup.u8 \reg\()_A, TMP, #2 -.elseif \bpp == 24 - vidup.u8 \reg\()_A, TMP, #1 - mov TMP, #3 - vmul.u8 \reg\()_A, \reg\()_A, TMP -.else - vidup.u8 \areg\()_A, TMP, #4 -.endif -.endif -.endm - -.macro init src_bpp, dst_bpp, mask, opa - ldr DST_ADDR, [r0, #4] - ldr DST_W, [r0, #8] - ldr DST_H, [r0, #12] - ldr DST_STRIDE, [r0, #16] - ldr SRC_ADDR, [r0, #20] -.if \src_bpp > 0 - ldr SRC_STRIDE, [r0, #24] -.endif -.if \mask - ldr MASK_ADDR, [r0, #28] - ldr MASK_STRIDE, [r0, #32] -.endif -.if \opa - ldr OPA, [r0] -.endif -.if (\src_bpp <= 16) && (\dst_bpp == 16) -.if \opa || \mask - mov TMP, #0xF81F - movt TMP, #0x7E0 - vdup.32 BITMASK, TMP -.endif - add TMP, DST_W, #0x7 - bic TMP, TMP, #0x7 -.else - add TMP, DST_W, #0xF - bic TMP, TMP, #0xF -.endif -.if \dst_bpp == 32 - ldr RCP, =(reciprocal - 8) -.endif - -.if \dst_bpp == 16 - sub DST_STRIDE, DST_STRIDE, TMP, lsl #1 -.elseif \dst_bpp == 24 - sub DST_STRIDE, DST_STRIDE, TMP - sub DST_STRIDE, DST_STRIDE, TMP, lsl #1 -.elseif \dst_bpp >= 31 - sub DST_STRIDE, DST_STRIDE, TMP, lsl #2 -.endif -.if \mask - sub MASK_STRIDE, MASK_STRIDE, TMP -.endif -.if \src_bpp == 0 -.if \mask || \opa - .if \dst_bpp > 16 - ldst 0, ld, \src_bpp, SRC, S, D, 0, 0 - vmov.u8 S_A, #0xFF - .else - ldst 0, ld, \src_bpp, SRC, S, D, 1, 0 - vmovlb.u16 S_L, S_565 - vsli.32 S_L, S_L, #16 - vand S_L, S_L, BITMASK - .endif -.else - .if \dst_bpp > 16 - ldst 0, ld, \src_bpp, SRC, D, S, 0, 0 - .else - ldst 0, ld, \src_bpp, SRC, D, S, 1, 0 - .endif -.endif -.else - .if \src_bpp == 16 - sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #1 - .elseif \src_bpp == 24 - sub SRC_STRIDE, SRC_STRIDE, TMP - sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #1 - .elseif \src_bpp >= 31 - sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #2 - .endif -.endif -.if (\src_bpp < 32) && (\mask == 0) && (\opa == 0) && !((\src_bpp <= 16) && (\dst_bpp == 16)) -@ 16 to 31/32 or reverse: index @ q0, q1 -@ 24 to 31/32 or reverse: index @ q0, q1, q2 -@ 16 to 24 or reverse: 16 index @ q0, q1, 24 index @ q2, q3, q7 -@ 31 to 31/32: index @ q3 (tail only) - mov TMP, #0 -.if (\src_bpp == 16) || (\dst_bpp == 16) - vidup.u8 S_B, TMP, #2 - mov TMP, #1 - vadd.u8 S_G, S_B, TMP -.if (\src_bpp == 24) || (\dst_bpp == 24) - vshl.u8 S_R, S_B, #1 - vadd.u8 S_R, S_R, S_B - vshr.u8 S_R, S_R, #1 - vadd.u8 S_A, S_R, TMP - vadd.u8 D_A, S_A, TMP -.endif -.elseif (\src_bpp == 24) || (\dst_bpp == 24) - vidup.u8 S_B, TMP, #1 - mov TMP, #3 - vmul.u8 S_B, S_B, TMP - mov TMP, #1 - vadd.u8 S_G, S_B, TMP - vadd.u8 S_R, S_G, TMP -.endif -.if \dst_bpp >= 31 - load_index \dst_bpp, D, S, 0 - vmov.u8 D_A, #0xFF -.endif -.endif -.endm - -.macro vqrdmulh_u8 Qd, Qn, Qm @ 1 bit precision loss - vmulh.u8 \Qd, \Qn, \Qm - vqshl.u8 \Qd, \Qd, #1 -.endm - -.macro premult mem, alpha - vrmulh.u8 \mem\()_B, \mem\()_B, \alpha - vrmulh.u8 \mem\()_G, \mem\()_G, \alpha - vrmulh.u8 \mem\()_R, \mem\()_R, \alpha -.endm - -.macro blend_565 p - vmovl\p\().u16 D_L, D_565 - vsli.32 D_L, D_L, #16 - vand D_L, D_L, BITMASK - vsub.u32 D_T, S_L, D_L - vmovl\p\().u16 D_A, S_A - vmul.u32 D_T, D_T, D_A - vshr.u32 D_T, D_T, #5 - vadd.u32 D_L, D_L, D_T - vand D_L, D_L, BITMASK - vshr.u32 D_T, D_L, #16 - vorr D_L, D_L, D_T - vmovn\p\().u32 D_565, D_L -.endm - -.macro late_init src_bpp, dst_bpp, mask, opa, mode -.if (\src_bpp <= 16) && (\dst_bpp == 16) && (\mask == 0) -.if \opa == 2 - mov TMP, #0x7BEF - vdup.16 BITMASK, TMP -.if \src_bpp == 0 - vshr.u16 S_L, S_565, #1 - vand S_L, S_L, BITMASK -.endif -.elseif \opa == 1 - vdup.16 S_A, OPA - mov TMP, #4 - vadd.u16 S_A, S_A, TMP - vshr.u16 S_A, S_A, #3 -.endif -.endif -.endm - -.macro blend src_bpp, dst_bpp, mask, opa, mode -.if (\mask == 0) && (\opa == 2) -.if (\src_bpp <= 16) && (\dst_bpp == 16) -.if \src_bpp > 0 - vshr.u16 S_L, S_565, #1 - vand S_L, S_L, BITMASK -.endif - vshr.u16 D_L, D_565, #1 - vand D_L, D_L, BITMASK - vadd.u16 D_565, S_L, D_L -.else - vhadd.u8 D_B, D_B, S_B - vhadd.u8 D_G, D_G, S_G - vhadd.u8 D_R, D_R, S_R -.endif -.elseif (\src_bpp <= 16) && (\dst_bpp == 16) - lsl lr, #1 -.if \src_bpp > 0 - vmovlb.u16 S_L, S_565 - vsli.32 S_L, S_L, #16 - vand S_L, S_L, BITMASK -.endif - blend_565 b -.if \src_bpp > 0 - vmovlt.u16 S_L, S_565 - vsli.32 S_L, S_L, #16 - vand S_L, S_L, BITMASK -.endif - blend_565 t - lsr lr, #1 -.else -.if \dst_bpp < 32 -.if (\opa == 0) && (\mask == 0) - vmov.u8 D_A, #0xFF - mov TMP, #0 - vabav.u8 TMP, S_A, D_A - cbnz TMP, 91f - vmov D_B, S_B - vmov D_G, S_G - vmov D_R, S_R - b 88f -91: -.endif - vmvn D_A, S_A - premult S, S_A - premult D, D_A -.else - vpush {d0-d5} - vmov.u8 S_B, #0xFF - vmov.u8 S_G, #0 - mov TMP, #0 - vabav.u8 TMP, S_A, S_B - cbz TMP, 91f @ if(fg.alpha == 255 - mov TMP, #0 - vabav.u8 TMP, D_A, S_G - cbnz TMP, 90f @ || bg.alpha == 0) -91: - vpop {d8-d13} @ return fg; - vmov.u8 D_A, #0xFF - b 88f -90: - mov TMP, #0 - vabav.u8 TMP, S_A, S_G - cmp TMP, #2 @ if(fg.alpha <= LV_OPA_MIN) - itt le @ return bg; - vpople {d0-d5} - ble 88f - mov TMP, #0 - vabav.u8 TMP, D_A, S_B @ if (bg.alpha == 255) - cbnz TMP, 89f @ return lv_color_mix32(fg, bg); - vpop {d0-d5} - vmvn D_A, S_A - premult S, S_A - premult D, D_A - vqadd.u8 D_B, D_B, S_B - vqadd.u8 D_G, D_G, S_G - vqadd.u8 D_R, D_R, S_R - vmov.u8 D_A, #0xFF - b 88f -89: - vmvn N, S_A - vmvn D_A, D_A - vrmulh.u8 D_A, N, D_A - vmvn D_A, D_A @ D_A = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg.alpha) - vclz.i8 N, D_A @ n = clz(D_A) - vshl.u8 V, D_A, N @ v = D_A << n - vshl.u8 S_A, S_A, N - vshr.u8 N, V, #4 @ N is used as tmp from now on - vldrb.u8 R, [RCP, N] @ r = reciprocal[(v >> 4) - 8] - vrmulh.u8 N, V, R @ r = newton(v,r) - vmvn N, N @ = vqrdmulh.u8(vmvn(vrmulh(v, r)), r) - vqrdmulh_u8 R, N, R @ but vqrdmulh does not support u8, so we implement one - vrmulh.u8 N, V, R @ and do it twice - vmvn N, N - vqrdmulh_u8 R, N, R - vqrdmulh_u8 S_A, S_A, R @ S_A' = S_A * 255 / D_A = vrdmulh(S_A << n, r) - vpop {d0-d5} - premult S, S_A - vmvn S_A, S_A - premult D, S_A -.endif - vqadd.u8 D_B, D_B, S_B - vqadd.u8 D_G, D_G, S_G - vqadd.u8 D_R, D_R, S_R -.endif -.if \dst_bpp == 31 - vmov.u8 D_A, #0xFF -.endif -88: -.endm - -.macro blend_line src_bpp, dst_bpp, mask, opa, mode -.if (\src_bpp < 31) && (\dst_bpp < 31) - blend_block \src_bpp, \dst_bpp, \mask, \opa, \mode, DST_W, 0 -.else - bics TMP, DST_W, #0xF - beq 87f - blend_block \src_bpp, \dst_bpp, \mask, \opa, \mode, TMP, 1 -87: - ands TMP, DST_W, #0xF - beq 86f - blend_block \src_bpp, \dst_bpp, \mask, \opa, \mode, TMP, 0 -86: -.endif -.endm - -.macro blend_block src_bpp, dst_bpp, mask, opa, mode, w, aligned -.if (\src_bpp <= 16) && (\dst_bpp == 16) - wlstp.16 lr, \w, 1f -.else - wlstp.8 lr, \w, 1f -.endif -2: -.if (\src_bpp < 32) && (\mask == 0) && (\opa == 0) -@ no blend - .if \src_bpp == 0 - ldst 1, st, \dst_bpp, DST, D, S, 0, 1, !, \aligned - .elseif (\src_bpp == \dst_bpp) || (\src_bpp == 31) && (\dst_bpp == 32) - .if \dst_bpp < 31 - .if \src_bpp < 31 - ldst 0, ld, \src_bpp, SRC, D, S, 0, 1, !, \aligned - .else - ldst 0, ld, \src_bpp, SRC, D, S, 0, 1, !, \aligned - .endif - ldst 1, st, \dst_bpp, DST, D, S, 0, 1, !, \aligned - .else - ldst 0, ld, \src_bpp, SRC, D, S, 0, 1, !, \aligned - ldst 1, st, \dst_bpp, DST, D, S, 0, 1, !, \aligned - .endif - .else - .if (\dst_bpp < 31) && (\src_bpp < 31) - ldst 0, ld, \src_bpp, SRC, D, S, 1, 2, !, \aligned - ldst 1, st, \dst_bpp, DST, D, S, 1, 2, !, \aligned - .else - ldst 0, ld, \src_bpp, SRC, D, S, 1, 1, !, \aligned - ldst 1, st, \dst_bpp, DST, D, S, 1, 1, !, \aligned - .endif - .endif -.elseif (\src_bpp <= 16) && (\dst_bpp == 16) - .if \src_bpp > 0 - ldst 0, ld, \src_bpp, SRC, S, D, 0, 0, !, \aligned - .endif - ldst 0, ld, \dst_bpp, DST, D, S, 0, 0, , \aligned - .if \mask - ldst 0, ld, 8, MASK, S, D, 1, 0, ! - .if \opa == 2 - vshr.u16 S_A, S_A, #1 - .elseif \opa == 1 - vmul.u16 S_A, S_A, OPA - vshr.u16 S_A, S_A, #8 - .endif - mov TMP, #4 - vadd.u16 S_A, S_A, TMP - vshr.u16 S_A, S_A, #3 - .endif - blend \src_bpp, \dst_bpp, \mask, \opa, \mode - ldst 1, st, \dst_bpp, DST, D, S, 0, 0, !, \aligned -.elseif \src_bpp < 32 -@ no src_a -.if \src_bpp > 0 - load_index \src_bpp, S, D, \aligned - ldst 0, ld, \src_bpp, SRC, S, D, 1, 0, !, \aligned -.elseif (\opa == 1) || \mask - vpush {d0-d5} -.endif - load_index \dst_bpp, D, S, \aligned - ldst 0, ld, \dst_bpp, DST, D, S, 1, 0, , \aligned - .if \mask - ldst 0, ld, 8, MASK, S, D, 0, 0, !, \aligned - .if \opa == 2 - vshr.u8 S_A, S_A, #1 - .elseif \opa == 1 - .if \dst_bpp == 32 - vpush {d14-d15} - .endif - vdup.8 D_A, OPA - vrmulh.u8 S_A, S_A, D_A - .if \dst_bpp == 32 - vpop {d14-d15} - .endif - .endif - .elseif \opa == 1 - vdup.8 S_A, OPA - .endif - blend \src_bpp, \dst_bpp, \mask, \opa, \mode -.if (\src_bpp == 0) && ((\opa == 1) || \mask) - vpop {d0-d5} -.endif - .if (\dst_bpp == 32) || \mask || (\opa == 1) - load_index \dst_bpp, D, S, \aligned - .endif - ldst 1, st, \dst_bpp, DST, D, S, 1, 0, !, \aligned -.else -@ src_a (+\mask) (+\opa) - load_index \dst_bpp, D, S, \aligned - ldst 0, ld, \dst_bpp, DST, D, S, 1, 0, , \aligned - .if (\dst_bpp == 32) && (\mask || \opa || (\aligned == 0)) - vpush {d14-d15} - .endif - load_index \src_bpp, S, D, \aligned - ldst 0, ld, \src_bpp, SRC, S, D, 1, 0, !, \aligned - .if \mask == 0 - .if \opa - vdup.8 D_A, OPA - vrmulh.u8 S_A, S_A, D_A - .endif - .else - ldst 0, ld, 8, MASK, D, S, 0, 0, !, \aligned - vrmulh.u8 S_A, S_A, D_A - .if \opa - vdup.8 D_A, OPA - vrmulh.u8 S_A, S_A, D_A - .endif - .endif - .if (\dst_bpp == 32) && (\mask || \opa || (\aligned == 0)) - vpop {d14-d15} - .endif - blend \src_bpp, \dst_bpp, \mask, \opa, \mode - load_index \dst_bpp, D, S, \aligned - ldst 1, st, \dst_bpp, DST, D, S, 1, 0, !, \aligned -.endif - letp lr, 2b -1: -.endm - -.macro enter complex - push {r4-r11, lr} -.if \complex - vpush {d8-d15} -.endif -.endm - -.macro exit complex -.if \complex - vpop {d8-d15} -.endif - pop {r4-r11, pc} -.endm - -.macro preload mem, bpp -.if \bpp >= 31 - pld [\mem\()_ADDR, DST_W, lsl #2] -.elseif \bpp == 24 - add TMP, DST_W, DST_W, lsl #1 - pld [\mem\()_ADDR, TMP] -.elseif \bpp == 16 - pld [\mem\()_ADDR, DST_W, lsl #1] -.elseif \bpp == 8 - pld [\mem\()_ADDR, DST_W] -.endif -.endm - -.macro next src_bpp, mask - add DST_ADDR, DST_ADDR, DST_STRIDE -.if \src_bpp > 0 - add SRC_ADDR, SRC_ADDR, SRC_STRIDE -.endif -.if \mask - add MASK_ADDR, MASK_ADDR, MASK_STRIDE -.endif -.endm - -.macro blender src_bpp, dst_bpp, mask, opa, mode -.if (\src_bpp <= 16) && (\dst_bpp == 16) && (\opa == 0) && (\mask == 0) - enter 0 -.else - enter 1 -.endif - init \src_bpp, \dst_bpp, \mask, \opa - movs H, DST_H - beq 0f - preload SRC, \src_bpp -.if \mask || \opa || (\src_bpp == 32) - preload DST, \dst_bpp -.endif -.if \opa && (\src_bpp < 32) && (\dst_bpp < 32) -4: -@ 50% OPA can be accelerated (OPA == 0x7F/0x80) - add TMP, OPA, #1 - tst TMP, #0x7E - bne 3f - late_init \src_bpp, \dst_bpp, \mask, 2, \mode - blend_line \src_bpp, \dst_bpp, \mask, 2, \mode - next \src_bpp, \mask - subs H, #1 - bne 4b - b 0f -.endif -3: - late_init \src_bpp, \dst_bpp, \mask, \opa, \mode - blend_line \src_bpp, \dst_bpp, \mask, \opa, \mode - next \src_bpp, \mask - subs H, #1 - bne 3b -0: -.if (\src_bpp <= 16) && (\dst_bpp == 16) && (\opa == 0) && (\mask == 0) - exit 0 -.else - exit 1 -.endif -.ltorg -.endm - -.macro export name, src_bpp, dst_bpp, mask, opa, mode -.thumb_func -.global \name -\name\(): - blender \src_bpp, \dst_bpp, \mask, \opa, \mode -.endm - -.macro export_set src, dst, src_bpp, dst_bpp, mode -.ifc \src, color - export lv_\src\()_blend_to_\dst\()_helium, \src_bpp, \dst_bpp, 0, 0, \mode - export lv_\src\()_blend_to_\dst\()_with_opa_helium, \src_bpp, \dst_bpp, 0, 1, \mode - export lv_\src\()_blend_to_\dst\()_with_mask_helium, \src_bpp, \dst_bpp, 1, 0, \mode - export lv_\src\()_blend_to_\dst\()_mix_mask_opa_helium, \src_bpp, \dst_bpp, 1, 1, \mode -.else - export lv_\src\()_blend_\mode\()_to_\dst\()_helium, \src_bpp, \dst_bpp, 0, 0, \mode - export lv_\src\()_blend_\mode\()_to_\dst\()_with_opa_helium, \src_bpp, \dst_bpp, 0, 1, \mode - export lv_\src\()_blend_\mode\()_to_\dst\()_with_mask_helium, \src_bpp, \dst_bpp, 1, 0, \mode - export lv_\src\()_blend_\mode\()_to_\dst\()_mix_mask_opa_helium, \src_bpp, \dst_bpp, 1, 1, \mode -.endif -.endm - -export_set color, rgb565, 0, 16, normal -export_set rgb565, rgb565, 16, 16, normal -export_set rgb888, rgb565, 24, 16, normal -export_set xrgb8888, rgb565, 31, 16, normal -export_set argb8888, rgb565, 32, 16, normal -export_set color, rgb888, 0, 24, normal -export_set rgb565, rgb888, 16, 24, normal -export_set rgb888, rgb888, 24, 24, normal -export_set xrgb8888, rgb888, 31, 24, normal -export_set argb8888, rgb888, 32, 24, normal -export_set color, xrgb8888, 0, 31, normal -export_set rgb565, xrgb8888, 16, 31, normal -export_set rgb888, xrgb8888, 24, 31, normal -export_set xrgb8888, xrgb8888, 31, 31, normal -export_set argb8888, xrgb8888, 32, 31, normal -export_set color, argb8888, 0, 32, normal -export_set rgb565, argb8888, 16, 32, normal -export_set rgb888, argb8888, 24, 32, normal -export_set xrgb8888, argb8888, 31, 32, normal -export_set argb8888, argb8888, 32, 32, normal - -#endif /*LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM && defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE && LV_USE_NATIVE_HELIUM_ASM*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/helium/lv_blend_helium.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/helium/lv_blend_helium.h deleted file mode 100644 index 69b999e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/helium/lv_blend_helium.h +++ /dev/null @@ -1,1313 +0,0 @@ -/** - * @file lv_blend_helium.h - * - */ - -#ifndef LV_BLEND_HELIUM_H -#define LV_BLEND_HELIUM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#if defined(_RTE_) -#include "Pre_Include_Global.h" -#include "lv_conf_cmsis.h" -#endif - -#include "../../../../lv_conf_internal.h" - -/* detect whether helium is available based on arm compilers' standard */ -#if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE - -#ifdef LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE -#include LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE -#endif - -#if !defined(__ASSEMBLY__) - -/* Use arm2d functions if present */ -#include "../arm2d/lv_blend_arm2d.h" - -/********************* - * DEFINES - *********************/ - -#if LV_USE_NATIVE_HELIUM_ASM - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) \ - lv_color_blend_to_rgb565_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) \ - lv_color_blend_to_rgb565_with_opa_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) \ - lv_color_blend_to_rgb565_with_mask_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) \ - lv_color_blend_to_rgb565_mix_mask_opa_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) \ - lv_rgb565_blend_normal_to_rgb565_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ - lv_rgb565_blend_normal_to_rgb565_with_opa_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ - lv_rgb565_blend_normal_to_rgb565_with_mask_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ - lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_rgb565_helium(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_rgb565_with_opa_helium(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_rgb565_with_mask_helium(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) \ - lv_argb8888_blend_normal_to_rgb565_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ - lv_argb8888_blend_normal_to_rgb565_with_opa_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ - lv_argb8888_blend_normal_to_rgb565_with_mask_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ - lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dst_px_size) \ - lv_color_blend_to_rgb888_helium(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - lv_color_blend_to_rgb888_with_opa_helium(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - lv_color_blend_to_rgb888_with_mask_helium(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - lv_color_blend_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ - lv_rgb565_blend_normal_to_rgb888_helium(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - lv_rgb565_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - lv_rgb565_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size, src_px_size) \ - lv_rgb888_blend_normal_to_rgb888_helium(dsc, dst_px_size, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size, src_px_size) \ - lv_rgb888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size, src_px_size) \ - lv_rgb888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size, src_px_size) \ - lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size, src_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ - lv_argb8888_blend_normal_to_rgb888_helium(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - lv_argb8888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - lv_argb8888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888 -#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(dsc) \ - lv_color_blend_to_argb8888_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(dsc) \ - lv_color_blend_to_argb8888_with_opa_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK -#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(dsc) \ - lv_color_blend_to_argb8888_with_mask_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(dsc) \ - lv_color_blend_to_argb8888_mix_mask_opa_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888 -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc) \ - lv_rgb565_blend_normal_to_argb8888_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ - lv_rgb565_blend_normal_to_argb8888_with_opa_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ - lv_rgb565_blend_normal_to_argb8888_with_mask_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ - lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888 -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_argb8888_helium(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_argb8888_with_opa_helium(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_argb8888_with_mask_helium(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888 -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(dsc) \ - lv_argb8888_blend_normal_to_argb8888_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ - lv_argb8888_blend_normal_to_argb8888_with_opa_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ - lv_argb8888_blend_normal_to_argb8888_with_mask_helium(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ - lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc) -#endif - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - uint32_t opa; - void * dst_buf; - uint32_t dst_w; - uint32_t dst_h; - uint32_t dst_stride; - const void * src_buf; - uint32_t src_stride; - const lv_opa_t * mask_buf; - uint32_t mask_stride; -} asm_dsc_t; -/********************** - * GLOBAL PROTOTYPES - **********************/ - -extern void lv_color_blend_to_rgb565_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb565_helium(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color - }; - - lv_color_blend_to_rgb565_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_color_blend_to_rgb565_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb565_with_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color - }; - lv_color_blend_to_rgb565_with_opa_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_color_blend_to_rgb565_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb565_with_mask_helium(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - lv_color_blend_to_rgb565_with_mask_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_color_blend_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb565_mix_mask_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - lv_color_blend_to_rgb565_mix_mask_opa_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_rgb565_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - lv_rgb565_blend_normal_to_rgb565_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_rgb565_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - lv_rgb565_blend_normal_to_rgb565_with_opa_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_rgb565_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - lv_rgb565_blend_normal_to_rgb565_with_mask_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_rgb888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_rgb565_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_rgb565_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_rgb888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_rgb565_with_opa_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_rgb565_with_opa_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_rgb888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_rgb565_with_mask_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_rgb565_with_mask_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_argb8888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - lv_argb8888_blend_normal_to_rgb565_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_argb8888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - lv_argb8888_blend_normal_to_rgb565_with_opa_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_argb8888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - lv_argb8888_blend_normal_to_rgb565_with_mask_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_color_blend_to_rgb888_helium(asm_dsc_t * dsc); -extern void lv_color_blend_to_xrgb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb888_helium(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color - }; - if(dst_px_size == 3) { - lv_color_blend_to_rgb888_helium(&asm_dsc); - } - else { - lv_color_blend_to_xrgb8888_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_color_blend_to_rgb888_with_opa_helium(asm_dsc_t * dsc); -extern void lv_color_blend_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb888_with_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color - }; - if(dst_px_size == 3) { - lv_color_blend_to_rgb888_with_opa_helium(&asm_dsc); - } - else { - lv_color_blend_to_xrgb8888_with_opa_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_color_blend_to_rgb888_with_mask_helium(asm_dsc_t * dsc); -extern void lv_color_blend_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb888_with_mask_helium(lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - lv_color_blend_to_rgb888_with_mask_helium(&asm_dsc); - } - else { - lv_color_blend_to_xrgb8888_with_mask_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_color_blend_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); -extern void lv_color_blend_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb888_mix_mask_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - lv_color_blend_to_rgb888_mix_mask_opa_helium(&asm_dsc); - } - else { - lv_color_blend_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_rgb565_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); -extern void lv_rgb565_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(dst_px_size == 3) { - lv_rgb565_blend_normal_to_rgb888_helium(&asm_dsc); - } - else { - lv_rgb565_blend_normal_to_xrgb8888_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_rgb565_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); -extern void lv_rgb565_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(dst_px_size == 3) { - lv_rgb565_blend_normal_to_rgb888_with_opa_helium(&asm_dsc); - } - else { - lv_rgb565_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_rgb565_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); -extern void lv_rgb565_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - lv_rgb565_blend_normal_to_rgb888_with_mask_helium(&asm_dsc); - } - else { - lv_rgb565_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); -extern void lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc); - } - else { - lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_rgb888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); -extern void lv_rgb888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(dst_px_size == 3) { - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_rgb888_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_rgb888_helium(&asm_dsc); - } - } - else { - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_xrgb8888_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_xrgb8888_helium(&asm_dsc); - } - } - return LV_RESULT_OK; -} - -extern void lv_rgb888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); -extern void lv_rgb888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(dst_px_size == 3) { - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_rgb888_with_opa_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_rgb888_with_opa_helium(&asm_dsc); - } - } - else { - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc); - } - } - return LV_RESULT_OK; -} - -extern void lv_rgb888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); -extern void lv_rgb888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_rgb888_with_mask_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_rgb888_with_mask_helium(&asm_dsc); - } - } - else { - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc); - } - } - return LV_RESULT_OK; -} - -extern void lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); -extern void lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc); - } - } - else { - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); - } - } - return LV_RESULT_OK; -} - -extern void lv_argb8888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); -extern void lv_argb8888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(dst_px_size == 3) { - lv_argb8888_blend_normal_to_rgb888_helium(&asm_dsc); - } - else { - lv_argb8888_blend_normal_to_xrgb8888_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_argb8888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); -extern void lv_argb8888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(dst_px_size == 3) { - lv_argb8888_blend_normal_to_rgb888_with_opa_helium(&asm_dsc); - } - else { - lv_argb8888_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_argb8888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); -extern void lv_argb8888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - lv_argb8888_blend_normal_to_rgb888_with_mask_helium(&asm_dsc); - } - else { - lv_argb8888_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); -extern void lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc); - } - else { - lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_color_blend_to_argb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_argb8888_helium(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color - }; - - lv_color_blend_to_argb8888_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_color_blend_to_argb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_argb8888_with_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color - }; - lv_color_blend_to_argb8888_with_opa_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_color_blend_to_argb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_argb8888_with_mask_helium(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - lv_color_blend_to_argb8888_with_mask_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_color_blend_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_argb8888_mix_mask_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - lv_color_blend_to_argb8888_mix_mask_opa_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_rgb565_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - lv_rgb565_blend_normal_to_argb8888_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_rgb565_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - lv_rgb565_blend_normal_to_argb8888_with_opa_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_rgb565_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - lv_rgb565_blend_normal_to_argb8888_with_mask_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_rgb888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_argb8888_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_argb8888_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_rgb888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_rgb888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -extern void lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(src_px_size == 3) { - lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc); - } - else { - lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern void lv_argb8888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - lv_argb8888_blend_normal_to_argb8888_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_argb8888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - lv_argb8888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_argb8888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - lv_argb8888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc); - return LV_RESULT_OK; -} - -extern void lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc); - return LV_RESULT_OK; -} - -#endif /* LV_USE_NATIVE_HELIUM_ASM */ - -#endif /* !defined(__ASSEMBLY__) */ - -#endif /* defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE */ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_BLEND_HELIUM_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend.c deleted file mode 100644 index 6f48eba..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend.c +++ /dev/null @@ -1,228 +0,0 @@ -/** - * @file lv_draw_sw_blend.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../../misc/lv_area_private.h" -#include "lv_draw_sw_blend_private.h" -#include "../../lv_draw_private.h" -#include "../lv_draw_sw.h" -#if LV_DRAW_SW_SUPPORT_L8 - #include "lv_draw_sw_blend_to_l8.h" -#endif -#if LV_DRAW_SW_SUPPORT_AL88 - #include "lv_draw_sw_blend_to_al88.h" -#endif -#if LV_DRAW_SW_SUPPORT_RGB565 - #include "lv_draw_sw_blend_to_rgb565.h" -#endif -#if LV_DRAW_SW_SUPPORT_ARGB8888 - #include "lv_draw_sw_blend_to_argb8888.h" -#endif -#if LV_DRAW_SW_SUPPORT_RGB888 - #include "lv_draw_sw_blend_to_rgb888.h" -#endif -#if LV_DRAW_SW_SUPPORT_I1 - #include "lv_draw_sw_blend_to_i1.h" -#endif -#if LV_USE_DRAW_SW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_sw_blend(lv_draw_unit_t * draw_unit, const lv_draw_sw_blend_dsc_t * blend_dsc) -{ - /*Do not draw transparent things*/ - if(blend_dsc->opa <= LV_OPA_MIN) return; - if(blend_dsc->mask_buf && blend_dsc->mask_res == LV_DRAW_SW_MASK_RES_TRANSP) return; - - lv_area_t blend_area; - if(!lv_area_intersect(&blend_area, blend_dsc->blend_area, draw_unit->clip_area)) return; - - LV_PROFILER_BEGIN; - lv_layer_t * layer = draw_unit->target_layer; - uint32_t layer_stride_byte = layer->draw_buf->header.stride; - - if(blend_dsc->src_buf == NULL) { - lv_draw_sw_blend_fill_dsc_t fill_dsc; - fill_dsc.dest_w = lv_area_get_width(&blend_area); - fill_dsc.dest_h = lv_area_get_height(&blend_area); - fill_dsc.dest_stride = layer_stride_byte; - fill_dsc.opa = blend_dsc->opa; - fill_dsc.color = blend_dsc->color; - - if(blend_dsc->mask_buf == NULL) fill_dsc.mask_buf = NULL; - else if(blend_dsc->mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) fill_dsc.mask_buf = NULL; - else fill_dsc.mask_buf = blend_dsc->mask_buf; - - - fill_dsc.relative_area = blend_area; - lv_area_move(&fill_dsc.relative_area, -layer->buf_area.x1, -layer->buf_area.y1); - fill_dsc.dest_buf = lv_draw_layer_go_to_xy(layer, blend_area.x1 - layer->buf_area.x1, - blend_area.y1 - layer->buf_area.y1); - if(fill_dsc.mask_buf) { - fill_dsc.mask_stride = blend_dsc->mask_stride == 0 ? lv_area_get_width(blend_dsc->mask_area) : blend_dsc->mask_stride; - fill_dsc.mask_buf += fill_dsc.mask_stride * (blend_area.y1 - blend_dsc->mask_area->y1) + - (blend_area.x1 - blend_dsc->mask_area->x1); - } - - switch(layer->color_format) { -#if LV_DRAW_SW_SUPPORT_RGB565 - case LV_COLOR_FORMAT_RGB565: - lv_draw_sw_blend_color_to_rgb565(&fill_dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_ARGB8888 - case LV_COLOR_FORMAT_ARGB8888: - lv_draw_sw_blend_color_to_argb8888(&fill_dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB888 - case LV_COLOR_FORMAT_RGB888: - lv_draw_sw_blend_color_to_rgb888(&fill_dsc, 3); - break; -#endif -#if LV_DRAW_SW_SUPPORT_XRGB8888 - case LV_COLOR_FORMAT_XRGB8888: - lv_draw_sw_blend_color_to_rgb888(&fill_dsc, 4); - break; -#endif -#if LV_DRAW_SW_SUPPORT_L8 - case LV_COLOR_FORMAT_L8: - lv_draw_sw_blend_color_to_l8(&fill_dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_AL88 - case LV_COLOR_FORMAT_AL88: - lv_draw_sw_blend_color_to_al88(&fill_dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_I1 - case LV_COLOR_FORMAT_I1: - lv_draw_sw_blend_color_to_i1(&fill_dsc); - break; -#endif - default: - break; - } - } - else { - if(!lv_area_intersect(&blend_area, &blend_area, blend_dsc->src_area)) { - LV_PROFILER_END; - return; - } - - if(blend_dsc->mask_area && !lv_area_intersect(&blend_area, &blend_area, blend_dsc->mask_area)) { - LV_PROFILER_END; - return; - } - - lv_draw_sw_blend_image_dsc_t image_dsc; - image_dsc.dest_w = lv_area_get_width(&blend_area); - image_dsc.dest_h = lv_area_get_height(&blend_area); - image_dsc.dest_stride = layer_stride_byte; - - image_dsc.opa = blend_dsc->opa; - image_dsc.blend_mode = blend_dsc->blend_mode; - image_dsc.src_stride = blend_dsc->src_stride; - image_dsc.src_color_format = blend_dsc->src_color_format; - - const uint8_t * src_buf = blend_dsc->src_buf; - uint32_t src_px_size = lv_color_format_get_bpp(blend_dsc->src_color_format); - src_buf += image_dsc.src_stride * (blend_area.y1 - blend_dsc->src_area->y1); - src_buf += ((blend_area.x1 - blend_dsc->src_area->x1) * src_px_size) >> 3; - image_dsc.src_buf = src_buf; - - - if(blend_dsc->mask_buf == NULL) image_dsc.mask_buf = NULL; - else if(blend_dsc->mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) image_dsc.mask_buf = NULL; - else image_dsc.mask_buf = blend_dsc->mask_buf; - - if(image_dsc.mask_buf) { - image_dsc.mask_buf = blend_dsc->mask_buf; - image_dsc.mask_stride = blend_dsc->mask_stride ? blend_dsc->mask_stride : lv_area_get_width(blend_dsc->mask_area); - image_dsc.mask_buf += image_dsc.mask_stride * (blend_area.y1 - blend_dsc->mask_area->y1) + - (blend_area.x1 - blend_dsc->mask_area->x1); - } - - image_dsc.relative_area = blend_area; - lv_area_move(&image_dsc.relative_area, -layer->buf_area.x1, -layer->buf_area.y1); - - image_dsc.src_area = *blend_dsc->src_area; - lv_area_move(&image_dsc.src_area, -layer->buf_area.x1, -layer->buf_area.y1); - - image_dsc.dest_buf = lv_draw_layer_go_to_xy(layer, blend_area.x1 - layer->buf_area.x1, - blend_area.y1 - layer->buf_area.y1); - - switch(layer->color_format) { -#if LV_DRAW_SW_SUPPORT_RGB565 - case LV_COLOR_FORMAT_RGB565: - case LV_COLOR_FORMAT_RGB565A8: - lv_draw_sw_blend_image_to_rgb565(&image_dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_ARGB8888 - case LV_COLOR_FORMAT_ARGB8888: - lv_draw_sw_blend_image_to_argb8888(&image_dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB888 - case LV_COLOR_FORMAT_RGB888: - lv_draw_sw_blend_image_to_rgb888(&image_dsc, 3); - break; -#endif -#if LV_DRAW_SW_SUPPORT_XRGB8888 - case LV_COLOR_FORMAT_XRGB8888: - lv_draw_sw_blend_image_to_rgb888(&image_dsc, 4); - break; -#endif -#if LV_DRAW_SW_SUPPORT_L8 - case LV_COLOR_FORMAT_L8: - lv_draw_sw_blend_image_to_l8(&image_dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_AL88 - case LV_COLOR_FORMAT_AL88: - lv_draw_sw_blend_image_to_al88(&image_dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_I1 - case LV_COLOR_FORMAT_I1: - lv_draw_sw_blend_image_to_i1(&image_dsc); - break; -#endif - default: - break; - } - } - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend.h deleted file mode 100644 index 1528cac..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file lv_draw_sw_blend.h - * - */ - -#ifndef LV_DRAW_SW_BLEND_H -#define LV_DRAW_SW_BLEND_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_draw_sw_mask.h" -#if LV_USE_DRAW_SW - -#include "../../../misc/lv_color.h" -#include "../../../misc/lv_area.h" -#include "../../../misc/lv_style.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Call the blend function of the `layer`. - * @param draw_unit pointer to a draw unit - * @param dsc pointer to an initialized blend descriptor - */ -void lv_draw_sw_blend(lv_draw_unit_t * draw_unit, const lv_draw_sw_blend_dsc_t * dsc); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_SW*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_BLEND_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_private.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_private.h deleted file mode 100644 index 532f4c9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_private.h +++ /dev/null @@ -1,92 +0,0 @@ -/** - * @file lv_draw_sw_blend_private.h - * - */ - -#ifndef LV_DRAW_SW_BLEND_PRIVATE_H -#define LV_DRAW_SW_BLEND_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_sw_blend.h" - -#if LV_USE_DRAW_SW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_draw_sw_blend_dsc_t { - const lv_area_t * blend_area; /**< The area with absolute coordinates to draw on `layer->buf` - * will be clipped to `layer->clip_area` */ - const void * src_buf; /**< Pointer to an image to blend. If set `fill_color` is ignored */ - uint32_t src_stride; - lv_color_format_t src_color_format; - const lv_area_t * src_area; - lv_opa_t opa; /**< The overall opacity*/ - lv_color_t color; /**< Fill color*/ - const lv_opa_t * mask_buf; /**< NULL if ignored, or an alpha mask to apply on `blend_area`*/ - lv_draw_sw_mask_res_t mask_res; /**< The result of the previous mask operation */ - const lv_area_t * mask_area; /**< The area of `mask_buf` with absolute coordinates*/ - int32_t mask_stride; - lv_blend_mode_t blend_mode; /**< E.g. LV_BLEND_MODE_ADDITIVE*/ -}; - -struct lv_draw_sw_blend_fill_dsc_t { - void * dest_buf; - int32_t dest_w; - int32_t dest_h; - int32_t dest_stride; - const lv_opa_t * mask_buf; - int32_t mask_stride; - lv_color_t color; - lv_opa_t opa; - lv_area_t relative_area; -}; - -struct lv_draw_sw_blend_image_dsc_t { - void * dest_buf; - int32_t dest_w; - int32_t dest_h; - int32_t dest_stride; - const lv_opa_t * mask_buf; - int32_t mask_stride; - const void * src_buf; - int32_t src_stride; - lv_color_format_t src_color_format; - lv_opa_t opa; - lv_blend_mode_t blend_mode; - lv_area_t relative_area; /**< The blend area relative to the layer's buffer area. */ - lv_area_t src_area; /**< The original src area. */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_DRAW_SW */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_BLEND_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c deleted file mode 100644 index 9c3194c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c +++ /dev/null @@ -1,1036 +0,0 @@ -/** - * @file lv_draw_sw_blend_al88.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_sw_blend_to_al88.h" -#if LV_USE_DRAW_SW - -#if LV_DRAW_SW_SUPPORT_AL88 - -#include "lv_draw_sw_blend_private.h" -#include "../../../misc/lv_math.h" -#include "../../../display/lv_display.h" -#include "../../../core/lv_refr.h" -#include "../../../misc/lv_color.h" -#include "../../../stdlib/lv_string.h" - -#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON - #include "neon/lv_blend_neon.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM - #include "helium/lv_blend_helium.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM - #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_color16a_t fg_saved; - lv_color16a_t bg_saved; - lv_color16a_t res_saved; - lv_opa_t res_alpha_saved; - lv_opa_t ratio_saved; -} lv_color_mix_alpha_cache_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -#if LV_DRAW_SW_SUPPORT_L8 - static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -#if LV_DRAW_SW_SUPPORT_I1 - static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); - - static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); -#endif - -static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); - -#if LV_DRAW_SW_SUPPORT_RGB565 - static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -#if LV_DRAW_SW_SUPPORT_RGB888 -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, - const uint8_t src_px_size); -#endif - -#if LV_DRAW_SW_SUPPORT_ARGB8888 - static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -static void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache); - -static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(lv_color16a_t * dest, lv_color16a_t src, - lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache); - -static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); - -static inline bool lv_color16a_eq(lv_color16a_t c1, lv_color16a_t c2); - -static inline lv_color16a_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_mix16a(lv_color16a_t fg, lv_color16a_t bg); - -static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_16a_16a_mix(lv_color16a_t src, lv_color16a_t * dest, - lv_color_mix_alpha_cache_t * cache); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_AL88 - #define LV_DRAW_SW_COLOR_BLEND_TO_AL88(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_AL88_WITH_OPA - #define LV_DRAW_SW_COLOR_BLEND_TO_AL88_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_AL88_WITH_MASK - #define LV_DRAW_SW_COLOR_BLEND_TO_AL88_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_AL88_MIX_MASK_OPA - #define LV_DRAW_SW_COLOR_BLEND_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88 - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_WITH_OPA - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_WITH_MASK - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88 - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_WITH_OPA - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_WITH_MASK - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88 - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_WITH_OPA - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_WITH_MASK - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88 - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_OPA - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_MASK - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88 - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_OPA - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_MASK - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_al88(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - const lv_opa_t * mask = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - int32_t dest_stride = dsc->dest_stride; - - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - - int32_t x; - int32_t y; - - LV_UNUSED(w); - LV_UNUSED(h); - LV_UNUSED(x); - LV_UNUSED(y); - LV_UNUSED(opa); - LV_UNUSED(mask); - LV_UNUSED(mask_stride); - LV_UNUSED(dest_stride); - - /*Simple fill*/ - if(mask == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_AL88(dsc)) { - lv_color16a_t color16a; - color16a.lumi = lv_color_luminance(dsc->color); - color16a.alpha = 255; - lv_color16a_t * dest_buf = dsc->dest_buf; - for(y = 0; y < h; y++) { - for(x = 0; x < w - 16; x += 16) { - dest_buf[x + 0] = color16a; - dest_buf[x + 1] = color16a; - dest_buf[x + 2] = color16a; - dest_buf[x + 3] = color16a; - - dest_buf[x + 4] = color16a; - dest_buf[x + 5] = color16a; - dest_buf[x + 6] = color16a; - dest_buf[x + 7] = color16a; - - dest_buf[x + 8] = color16a; - dest_buf[x + 9] = color16a; - dest_buf[x + 10] = color16a; - dest_buf[x + 11] = color16a; - - dest_buf[x + 12] = color16a; - dest_buf[x + 13] = color16a; - dest_buf[x + 14] = color16a; - dest_buf[x + 15] = color16a; - } - for(; x < w; x ++) { - dest_buf[x] = color16a; - } - - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - } - } - } - /*Opacity only*/ - else if(mask == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_AL88_WITH_OPA(dsc)) { - lv_color16a_t color16a; - color16a.lumi = lv_color_luminance(dsc->color); - color16a.alpha = opa; - lv_color16a_t * dest_buf = dsc->dest_buf; - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color_16a_16a_mix(color16a, &dest_buf[x], &cache); - } - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - } - } - - } - /*Masked with full opacity*/ - else if(mask && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_AL88_WITH_MASK(dsc)) { - lv_color16a_t color16a; - color16a.lumi = lv_color_luminance(dsc->color); - lv_color16a_t * dest_buf = (lv_color16a_t *)dsc->dest_buf; - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - color16a.alpha = mask[x]; - lv_color_16a_16a_mix(color16a, &dest_buf[x], &cache); - } - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - mask += mask_stride; - } - } - - } - /*Masked with opacity*/ - else { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_AL88_MIX_MASK_OPA(dsc)) { - lv_color16a_t color16a; - color16a.lumi = lv_color_luminance(dsc->color); - lv_color16a_t * dest_buf = (lv_color16a_t *)dsc->dest_buf; - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - color16a.alpha = LV_OPA_MIX2(mask[x], opa); - lv_color_16a_16a_mix(color16a, &dest_buf[x], &cache); - } - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - mask += mask_stride; - } - } - } -} - -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_al88(lv_draw_sw_blend_image_dsc_t * dsc) -{ - switch(dsc->src_color_format) { -#if LV_DRAW_SW_SUPPORT_RGB565 - case LV_COLOR_FORMAT_RGB565: - rgb565_image_blend(dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB888 - case LV_COLOR_FORMAT_RGB888: - rgb888_image_blend(dsc, 3); - break; -#endif -#if LV_DRAW_SW_SUPPORT_XRGB8888 - case LV_COLOR_FORMAT_XRGB8888: - rgb888_image_blend(dsc, 4); - break; -#endif -#if LV_DRAW_SW_SUPPORT_ARGB8888 - case LV_COLOR_FORMAT_ARGB8888: - argb8888_image_blend(dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_L8 - case LV_COLOR_FORMAT_L8: - l8_image_blend(dsc); - break; -#endif - case LV_COLOR_FORMAT_AL88: - al88_image_blend(dsc); - break; -#if LV_DRAW_SW_SUPPORT_I1 - case LV_COLOR_FORMAT_I1: - i1_image_blend(dsc); - break; -#endif - default: - LV_LOG_WARN("Not supported source color format"); - break; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ -#if LV_DRAW_SW_SUPPORT_I1 -static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - lv_color16a_t * dest_buf_al88 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_i1 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - - int32_t x, y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - dest_buf_al88[x].lumi = get_bit(src_buf_i1, x) * 255; - dest_buf_al88[x].alpha = 255; - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = get_bit(src_buf_i1, x) * 255; - src_color.alpha = opa; - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = get_bit(src_buf_i1, x) * 255; - src_color.alpha = mask_buf[x]; - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = get_bit(src_buf_i1, x) * 255; - src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - mask_buf += mask_stride; - } - } - } - else { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = get_bit(src_buf_i1, x) * 255; - if(mask_buf == NULL) src_color.alpha = opa; - else src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); - blend_non_normal_pixel(&dest_buf_al88[x], src_color, dsc->blend_mode, &cache); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } - } -} -#endif - -#if LV_DRAW_SW_SUPPORT_L8 -static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - lv_color16a_t * dest_buf_al88 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_l8 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - - int32_t x, y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - dest_buf_al88[x].lumi = src_buf_l8[x]; - dest_buf_al88[x].alpha = 255; - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = src_buf_l8[x]; - src_color.alpha = opa; - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = src_buf_l8[x]; - src_color.alpha = mask_buf[x]; - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = src_buf_l8[x]; - src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = src_buf_l8[x]; - if(mask_buf == NULL) src_color.alpha = opa; - else src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); - blend_non_normal_pixel(&dest_buf_al88[x], src_color, dsc->blend_mode, &cache); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } -} - -#endif - -static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - lv_color16a_t * dest_buf_al88 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color16a_t * src_buf_al88 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - - int32_t x, y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color_16a_16a_mix(src_buf_al88[x], &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color = src_buf_al88[x]; - src_color.alpha = LV_OPA_MIX2(src_color.alpha, opa); - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color = src_buf_al88[x]; - src_color.alpha = LV_OPA_MIX2(src_color.alpha, mask_buf[x]); - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color = src_buf_al88[x]; - src_color.alpha = LV_OPA_MIX3(src_color.alpha, mask_buf[x], opa); - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color = src_buf_al88[x]; - if(mask_buf == NULL) src_color.alpha = LV_OPA_MIX2(src_color.alpha, opa); - else src_color.alpha = LV_OPA_MIX3(src_color.alpha, mask_buf[x], opa); - blend_non_normal_pixel(&dest_buf_al88[x], src_color, dsc->blend_mode, &cache); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } -} - -#if LV_DRAW_SW_SUPPORT_RGB565 - -static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - lv_color16a_t * dest_buf_al88 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color16_t * src_buf_c16 = (const lv_color16_t *)dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - - int32_t x, y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - dest_buf_al88[x].lumi = lv_color16_luminance(src_buf_c16[x]); - dest_buf_al88[x].alpha = 255; - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_WITH_OPA(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = lv_color16_luminance(src_buf_c16[x]); - src_color.alpha = opa; - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_WITH_MASK(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = lv_color16_luminance(src_buf_c16[x]); - src_color.alpha = mask_buf[x]; - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - mask_buf += mask_stride; - } - } - } - else { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = lv_color16_luminance(src_buf_c16[x]); - src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = lv_color16_luminance(src_buf_c16[x]); - if(mask_buf == NULL) src_color.alpha = opa; - else src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); - blend_non_normal_pixel(&dest_buf_al88[x], src_color, dsc->blend_mode, &cache); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_RGB888 - -static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, - const uint8_t src_px_size) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - lv_color16a_t * dest_buf_al88 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_u8 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - /*Special case*/ - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88(dsc, src_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - dest_buf_al88[dest_x].lumi = lv_color24_luminance(&src_buf_u8[src_x]); - dest_buf_al88[dest_x].alpha = 255; - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_u8 += src_stride; - } - } - } - if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_WITH_OPA(dsc, dest_px_size, src_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - lv_color16a_t src_color; - src_color.lumi = lv_color24_luminance(&src_buf_u8[src_x]); - src_color.alpha = opa; - lv_color_16a_16a_mix(src_color, &dest_buf_al88[dest_x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_u8 += src_stride; - } - } - } - if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_WITH_MASK(dsc, dest_px_size, src_px_size)) { - uint32_t mask_x; - for(y = 0; y < h; y++) { - for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { - lv_color16a_t src_color; - src_color.lumi = lv_color24_luminance(&src_buf_u8[src_x]); - src_color.alpha = mask_buf[mask_x]; - lv_color_16a_16a_mix(src_color, &dest_buf_al88[dest_x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_u8 += src_stride; - mask_buf += mask_stride; - } - } - } - if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(dsc, dest_px_size, src_px_size)) { - uint32_t mask_x; - for(y = 0; y < h; y++) { - for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { - lv_color16a_t src_color; - src_color.lumi = lv_color24_luminance(&src_buf_u8[src_x]); - src_color.alpha = LV_OPA_MIX2(mask_buf[mask_x], opa); - lv_color_16a_16a_mix(src_color, &dest_buf_al88[dest_x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_u8 += src_stride; - mask_buf += mask_stride; - } - } - } - } - else { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - lv_color16a_t src_color; - src_color.lumi = lv_color24_luminance(&src_buf_u8[src_x]); - if(mask_buf == NULL) src_color.alpha = opa; - else src_color.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); - - blend_non_normal_pixel(&dest_buf_al88[dest_x], src_color, dsc->blend_mode, &cache); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_u8 += src_stride; - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_ARGB8888 - -static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - lv_color16a_t * dest_buf_al88 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color32_t * src_buf_c32 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - - int32_t x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = lv_color32_luminance(src_buf_c32[x]); - src_color.alpha = src_buf_c32[x].alpha; - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = lv_color32_luminance(src_buf_c32[x]); - src_color.alpha = LV_OPA_MIX2(src_buf_c32[x].alpha, opa); - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = lv_color32_luminance(src_buf_c32[x]); - src_color.alpha = LV_OPA_MIX2(src_buf_c32[x].alpha, mask_buf[x]); - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = lv_color32_luminance(src_buf_c32[x]); - src_color.alpha = LV_OPA_MIX3(src_buf_c32[x].alpha, mask_buf[x], opa); - lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); - } - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color16a_t src_color; - src_color.lumi = lv_color32_luminance(src_buf_c32[x]); - src_color.alpha = src_buf_c32[x].alpha; - if(mask_buf == NULL) src_color.alpha = LV_OPA_MIX2(src_color.alpha, opa); - else src_color.alpha = LV_OPA_MIX3(src_color.alpha, mask_buf[x], opa); - blend_non_normal_pixel(&dest_buf_al88[x], src_color, dsc->blend_mode, &cache); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } -} - -#endif - -/** - * Check if two AL88 colors are equal - * @param c1 the first color - * @param c2 the second color - * @return true: equal - */ -static inline bool lv_color16a_eq(lv_color16a_t c1, lv_color16a_t c2) -{ - return *((uint16_t *)&c1) == *((uint16_t *)&c2); -} - -static inline lv_color16a_t LV_ATTRIBUTE_FAST_MEM lv_color_mix16a(lv_color16a_t fg, lv_color16a_t bg) -{ -#if 0 - if(fg.alpha >= LV_OPA_MAX) { - fg.alpha = bg.alpha; - return fg; - } - if(fg.alpha <= LV_OPA_MIN) { - return bg; - } -#endif - bg.lumi = (uint32_t)((uint32_t)fg.lumi * fg.alpha + (uint32_t)bg.lumi * (255 - fg.alpha)) >> 8; - return bg; -} - -static inline void LV_ATTRIBUTE_FAST_MEM lv_color_16a_16a_mix(lv_color16a_t fg, lv_color16a_t * bg, - lv_color_mix_alpha_cache_t * cache) -{ - /*Pick the foreground if it's fully opaque or the Background is fully transparent*/ - if(fg.alpha >= LV_OPA_MAX || bg->alpha <= LV_OPA_MIN) { - *bg = fg; - } - /*Transparent foreground: use the Background*/ - else if(fg.alpha <= LV_OPA_MIN) { - /* no need to copy */ - } - /*Opaque background: use simple mix*/ - else if(bg->alpha == 255) { - *bg = lv_color_mix16a(fg, *bg); - } - /*Both colors have alpha. Expensive calculation needs to be applied*/ - else { - /*Save the parameters and the result. If they will be asked again don't compute again*/ - - /*Update the ratio and the result alpha value if the input alpha values change*/ - if(bg->alpha != cache->bg_saved.alpha || fg.alpha != cache->fg_saved.alpha) { - /*Info: - * https://en.wikipedia.org/wiki/Alpha_compositing#Analytical_derivation_of_the_over_operator*/ - cache->res_alpha_saved = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg->alpha); - LV_ASSERT(cache->res_alpha_saved != 0); - cache->ratio_saved = (uint32_t)((uint32_t)fg.alpha * 255) / cache->res_alpha_saved; - } - - if(!lv_color16a_eq(*bg, cache->bg_saved) || !lv_color16a_eq(fg, cache->fg_saved)) { - cache->fg_saved = fg; - cache->bg_saved = *bg; - fg.alpha = cache->ratio_saved; - cache->res_saved = lv_color_mix16a(fg, *bg); - cache->res_saved.alpha = cache->res_alpha_saved; - } - - *bg = cache->res_saved; - } -} - -void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache) -{ - lv_memzero(&cache->fg_saved, sizeof(lv_color16a_t)); - lv_memzero(&cache->bg_saved, sizeof(lv_color16a_t)); - lv_memzero(&cache->res_saved, sizeof(lv_color16a_t)); - cache->res_alpha_saved = 255; - cache->ratio_saved = 255; -} - -#if LV_DRAW_SW_SUPPORT_I1 - -static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) -{ - return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; -} - -#endif - -static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(lv_color16a_t * dest, lv_color16a_t src, - lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache) -{ - lv_color16a_t res; - switch(mode) { - case LV_BLEND_MODE_ADDITIVE: - res.lumi = LV_MIN(dest->lumi + src.lumi, 255); - break; - case LV_BLEND_MODE_SUBTRACTIVE: - res.lumi = LV_MAX(dest->lumi - src.lumi, 0); - break; - case LV_BLEND_MODE_MULTIPLY: - res.lumi = (dest->lumi * src.lumi) >> 8; - break; - default: - LV_LOG_WARN("Not supported blend mode: %d", mode); - return; - } - res.alpha = src.alpha; - lv_color_16a_16a_mix(res, dest, cache); -} - -static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) -{ - return (void *)((uint8_t *)buf + stride); -} - -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_al88.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_al88.h deleted file mode 100644 index b83523b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_al88.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file lv_draw_sw_blend_to_al88.h - * - */ - -#ifndef LV_DRAW_SW_BLEND_TO_AL88_H -#define LV_DRAW_SW_BLEND_TO_AL88_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_draw_sw.h" -#if LV_USE_DRAW_SW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_al88(lv_draw_sw_blend_fill_dsc_t * dsc); - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_al88(lv_draw_sw_blend_image_dsc_t * dsc); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_SW*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_BLEND_TO_AL88_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c deleted file mode 100644 index 4bf3ef4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c +++ /dev/null @@ -1,1064 +0,0 @@ -/** - * @file lv_draw_sw_blend.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_sw_blend_to_argb8888.h" -#if LV_USE_DRAW_SW - -#if LV_DRAW_SW_SUPPORT_ARGB8888 - -#include "lv_draw_sw_blend_private.h" -#include "../../../misc/lv_math.h" -#include "../../../display/lv_display.h" -#include "../../../core/lv_refr.h" -#include "../../../misc/lv_color.h" -#include "../../../stdlib/lv_string.h" - -#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON - #include "neon/lv_blend_neon.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM - #include "helium/lv_blend_helium.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM - #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_color32_t fg_saved; - lv_color32_t bg_saved; - lv_color32_t res_saved; - lv_opa_t res_alpha_saved; - lv_opa_t ratio_saved; -} lv_color_mix_alpha_cache_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -#if LV_DRAW_SW_SUPPORT_AL88 - static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -#if LV_DRAW_SW_SUPPORT_I1 - static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); - - static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); -#endif - -#if LV_DRAW_SW_SUPPORT_L8 - static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -#if LV_DRAW_SW_SUPPORT_RGB565 - static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -#if LV_DRAW_SW_SUPPORT_RGB888 -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, - const uint8_t src_px_size); -#endif - -static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); - -static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_32_mix(const uint8_t src, lv_color32_t * dest, uint8_t mix); - -static inline lv_color32_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_32_32_mix(lv_color32_t fg, lv_color32_t bg, - lv_color_mix_alpha_cache_t * cache); - -static void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache); - -static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(lv_color32_t * dest, lv_color32_t src, - lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache); -static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888 - #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA - #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK - #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA - #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888 - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_WITH_OPA - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_WITH_MASK - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888 - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_WITH_OPA - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_WITH_MASK - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888 - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888 - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888 - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888 - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_OPA - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_MASK - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_argb8888(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - const lv_opa_t * mask = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - int32_t dest_stride = dsc->dest_stride; - - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - - int32_t x; - int32_t y; - - LV_UNUSED(w); - LV_UNUSED(h); - LV_UNUSED(x); - LV_UNUSED(y); - LV_UNUSED(opa); - LV_UNUSED(mask); - LV_UNUSED(mask_stride); - LV_UNUSED(dest_stride); - - /*Simple fill*/ - if(mask == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(dsc)) { - uint32_t color32 = lv_color_to_u32(dsc->color); - uint32_t * dest_buf = dsc->dest_buf; - for(y = 0; y < h; y++) { - for(x = 0; x < w - 16; x += 16) { - dest_buf[x + 0] = color32; - dest_buf[x + 1] = color32; - dest_buf[x + 2] = color32; - dest_buf[x + 3] = color32; - - dest_buf[x + 4] = color32; - dest_buf[x + 5] = color32; - dest_buf[x + 6] = color32; - dest_buf[x + 7] = color32; - - dest_buf[x + 8] = color32; - dest_buf[x + 9] = color32; - dest_buf[x + 10] = color32; - dest_buf[x + 11] = color32; - - dest_buf[x + 12] = color32; - dest_buf[x + 13] = color32; - dest_buf[x + 14] = color32; - dest_buf[x + 15] = color32; - } - for(; x < w; x ++) { - dest_buf[x] = color32; - } - - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - } - } - - } - /*Opacity only*/ - else if(mask == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(dsc)) { - lv_color32_t color_argb = lv_color_to_32(dsc->color, opa); - lv_color32_t * dest_buf = dsc->dest_buf; - - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - dest_buf[x] = lv_color_32_32_mix(color_argb, dest_buf[x], &cache); - } - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - } - } - - } - /*Masked with full opacity*/ - else if(mask && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(dsc)) { - lv_color32_t color_argb = lv_color_to_32(dsc->color, 0xff); - lv_color32_t * dest_buf = dsc->dest_buf; - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - color_argb.alpha = mask[x]; - dest_buf[x] = lv_color_32_32_mix(color_argb, dest_buf[x], &cache); - } - - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - mask += mask_stride; - } - } - - } - /*Masked with opacity*/ - else { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(dsc)) { - lv_color32_t color_argb = lv_color_to_32(dsc->color, opa); - lv_color32_t * dest_buf = dsc->dest_buf; - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - color_argb.alpha = LV_OPA_MIX2(mask[x], opa); - dest_buf[x] = lv_color_32_32_mix(color_argb, dest_buf[x], &cache); - } - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - mask += mask_stride; - } - } - } -} - -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_argb8888(lv_draw_sw_blend_image_dsc_t * dsc) -{ - switch(dsc->src_color_format) { -#if LV_DRAW_SW_SUPPORT_RGB565 - case LV_COLOR_FORMAT_RGB565: - rgb565_image_blend(dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB888 - case LV_COLOR_FORMAT_RGB888: - rgb888_image_blend(dsc, 3); - break; -#endif -#if LV_DRAW_SW_SUPPORT_XRGB8888 - case LV_COLOR_FORMAT_XRGB8888: - rgb888_image_blend(dsc, 4); - break; -#endif - case LV_COLOR_FORMAT_ARGB8888: - argb8888_image_blend(dsc); - break; -#if LV_DRAW_SW_SUPPORT_L8 - case LV_COLOR_FORMAT_L8: - l8_image_blend(dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_AL88 - case LV_COLOR_FORMAT_AL88: - al88_image_blend(dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_I1 - case LV_COLOR_FORMAT_I1: - i1_image_blend(dsc); - break; -#endif - default: - LV_LOG_WARN("Not supported source color format"); - break; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#if LV_DRAW_SW_SUPPORT_I1 -static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - lv_color32_t * dest_buf_c32 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_i1 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - dest_buf_c32[dest_x].alpha = chan_val; - dest_buf_c32[dest_x].red = chan_val; - dest_buf_c32[dest_x].green = chan_val; - dest_buf_c32[dest_x].blue = chan_val; - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - lv_color_8_32_mix(chan_val, &dest_buf_c32[dest_x], opa); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - lv_color_8_32_mix(chan_val, &dest_buf_c32[dest_x], mask_buf[src_x]); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - lv_color_8_32_mix(chan_val, &dest_buf_c32[dest_x], LV_OPA_MIX2(mask_buf[src_x], opa)); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - src_argb.red = get_bit(src_buf_i1, src_x) * 255; - src_argb.green = src_argb.red; - src_argb.blue = src_argb.red; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); - blend_non_normal_pixel(&dest_buf_c32[dest_x], src_argb, dsc->blend_mode, &cache); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } -} -#endif - -#if LV_DRAW_SW_SUPPORT_AL88 -static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - lv_color32_t * dest_buf_c32 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color16a_t * src_buf_al88 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - /* - dest_buf_c32[dest_x].alpha = src_buf_al88[src_x].alpha; - dest_buf_c32[dest_x].red = src_buf_al88[src_x].lumi; - dest_buf_c32[dest_x].green = src_buf_al88[src_x].lumi; - dest_buf_c32[dest_x].blue = src_buf_al88[src_x].lumi; - */ - lv_color_8_32_mix(src_buf_al88[src_x].lumi, &dest_buf_c32[dest_x], src_buf_al88[src_x].alpha); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_32_mix(src_buf_al88[src_x].lumi, &dest_buf_c32[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa)); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_32_mix(src_buf_al88[src_x].lumi, &dest_buf_c32[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, - mask_buf[src_x])); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_32_mix(src_buf_al88[src_x].lumi, &dest_buf_c32[dest_x], LV_OPA_MIX3(src_buf_al88[src_x].alpha, - mask_buf[src_x], opa)); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - src_argb.red = src_buf_al88[src_x].lumi; - src_argb.green = src_buf_al88[src_x].lumi; - src_argb.blue = src_buf_al88[src_x].lumi; - if(mask_buf == NULL) src_argb.alpha = LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa); - else src_argb.alpha = LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[dest_x], opa); - blend_non_normal_pixel(&dest_buf_c32[dest_x], src_argb, dsc->blend_mode, &cache); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_L8 - -static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - lv_color32_t * dest_buf_c32 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_l8 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - dest_buf_c32[dest_x].alpha = src_buf_l8[src_x]; - dest_buf_c32[dest_x].red = src_buf_l8[src_x]; - dest_buf_c32[dest_x].green = src_buf_l8[src_x]; - dest_buf_c32[dest_x].blue = src_buf_l8[src_x]; - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_32_mix(src_buf_l8[src_x], &dest_buf_c32[dest_x], opa); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_32_mix(src_buf_l8[src_x], &dest_buf_c32[dest_x], mask_buf[src_x]); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_32_mix(src_buf_l8[src_x], &dest_buf_c32[dest_x], LV_OPA_MIX2(mask_buf[src_x], opa)); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - src_argb.red = src_buf_l8[src_x]; - src_argb.green = src_buf_l8[src_x]; - src_argb.blue = src_buf_l8[src_x]; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); - blend_non_normal_pixel(&dest_buf_c32[dest_x], src_argb, dsc->blend_mode, &cache); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_RGB565 - -static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - lv_color32_t * dest_buf_c32 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color16_t * src_buf_c16 = (const lv_color16_t *) dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - lv_color32_t color_argb; - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - - int32_t x; - int32_t y; - - LV_UNUSED(color_argb); - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL) { - lv_result_t accelerated; - if(opa >= LV_OPA_MAX) { - accelerated = LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc); - } - else { - accelerated = LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc); - } - if(LV_RESULT_INVALID == accelerated) { - color_argb.alpha = opa; - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - color_argb.red = (src_buf_c16[x].red * 2106) >> 8; /*To make it rounded*/ - color_argb.green = (src_buf_c16[x].green * 1037) >> 8; - color_argb.blue = (src_buf_c16[x].blue * 2106) >> 8; - dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - color_argb.alpha = mask_buf[x]; - color_argb.red = (src_buf_c16[x].red * 2106) >> 8; /*To make it rounded*/ - color_argb.green = (src_buf_c16[x].green * 1037) >> 8; - color_argb.blue = (src_buf_c16[x].blue * 2106) >> 8; - dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - mask_buf += mask_stride; - } - } - } - else { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - color_argb.alpha = LV_OPA_MIX2(mask_buf[x], opa); - color_argb.red = (src_buf_c16[x].red * 2106) >> 8; /*To make it rounded*/ - color_argb.green = (src_buf_c16[x].green * 1037) >> 8; - color_argb.blue = (src_buf_c16[x].blue * 2106) >> 8; - dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - src_argb.red = (src_buf_c16[x].red * 2106) >> 8; - src_argb.green = (src_buf_c16[x].green * 1037) >> 8; - src_argb.blue = (src_buf_c16[x].blue * 2106) >> 8; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[x], opa); - blend_non_normal_pixel(&dest_buf_c32[x], src_argb, dsc->blend_mode, &cache); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_RGB888 - -static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) -{ - - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - lv_color32_t * dest_buf_c32 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - lv_color32_t color_argb; - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - - int32_t dest_x; - int32_t src_x; - int32_t y; - - LV_UNUSED(color_argb); - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - /*Special case*/ - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(dsc, src_px_size)) { - if(src_px_size == 4) { - uint32_t line_in_bytes = w * 4; - for(y = 0; y < h; y++) { - lv_memcpy(dest_buf_c32, src_buf, line_in_bytes); - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf = drawbuf_next_row(src_buf, src_stride); - } - } - else if(src_px_size == 3) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 3) { - dest_buf_c32[dest_x].red = src_buf[src_x + 2]; - dest_buf_c32[dest_x].green = src_buf[src_x + 1]; - dest_buf_c32[dest_x].blue = src_buf[src_x + 0]; - dest_buf_c32[dest_x].alpha = 0xff; - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf = drawbuf_next_row(src_buf, src_stride); - } - } - } - - } - if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc, src_px_size)) { - color_argb.alpha = opa; - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - color_argb.red = src_buf[src_x + 2]; - color_argb.green = src_buf[src_x + 1]; - color_argb.blue = src_buf[src_x + 0]; - dest_buf_c32[dest_x] = lv_color_32_32_mix(color_argb, dest_buf_c32[dest_x], &cache); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf = drawbuf_next_row(src_buf, src_stride); - } - } - - } - if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc, src_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - color_argb.alpha = mask_buf[dest_x]; - color_argb.red = src_buf[src_x + 2]; - color_argb.green = src_buf[src_x + 1]; - color_argb.blue = src_buf[src_x + 0]; - dest_buf_c32[dest_x] = lv_color_32_32_mix(color_argb, dest_buf_c32[dest_x], &cache); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf = drawbuf_next_row(src_buf, src_stride); - mask_buf += mask_stride; - } - } - } - if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc, src_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - color_argb.alpha = (opa * mask_buf[dest_x]) >> 8; - color_argb.red = src_buf[src_x + 2]; - color_argb.green = src_buf[src_x + 1]; - color_argb.blue = src_buf[src_x + 0]; - dest_buf_c32[dest_x] = lv_color_32_32_mix(color_argb, dest_buf_c32[dest_x], &cache); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf = drawbuf_next_row(src_buf, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - src_argb.red = src_buf[src_x + 2]; - src_argb.green = src_buf[src_x + 1]; - src_argb.blue = src_buf[src_x + 0]; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); - - blend_non_normal_pixel(&dest_buf_c32[dest_x], src_argb, dsc->blend_mode, &cache); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf = drawbuf_next_row(src_buf, src_stride); - } - } -} - -#endif - -static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - lv_color32_t * dest_buf_c32 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color32_t * src_buf_c32 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - lv_color32_t color_argb; - lv_color_mix_alpha_cache_t cache; - lv_color_mix_with_alpha_cache_init(&cache); - - int32_t x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - dest_buf_c32[x] = lv_color_32_32_mix(src_buf_c32[x], dest_buf_c32[x], &cache); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - color_argb = src_buf_c32[x]; - color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); - dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - color_argb = src_buf_c32[x]; - color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, mask_buf[x]); - dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - color_argb = src_buf_c32[x]; - color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, opa, mask_buf[x]); - dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); - } - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - color_argb = src_buf_c32[x]; - if(mask_buf == NULL) color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); - else color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, mask_buf[x], opa); - blend_non_normal_pixel(&dest_buf_c32[x], color_argb, dsc->blend_mode, &cache); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } -} - -static inline void LV_ATTRIBUTE_FAST_MEM lv_color_8_32_mix(const uint8_t src, lv_color32_t * dest, uint8_t mix) -{ - - if(mix == 0) return; - - dest->alpha = 255; - if(mix >= LV_OPA_MAX) { - dest->red = src; - dest->green = src; - dest->blue = src; - } - else { - lv_opa_t mix_inv = 255 - mix; - dest->red = (uint32_t)((uint32_t)src * mix + dest->red * mix_inv) >> 8; - dest->green = (uint32_t)((uint32_t)src * mix + dest->green * mix_inv) >> 8; - dest->blue = (uint32_t)((uint32_t)src * mix + dest->blue * mix_inv) >> 8; - } -} - -static inline lv_color32_t LV_ATTRIBUTE_FAST_MEM lv_color_32_32_mix(lv_color32_t fg, lv_color32_t bg, - lv_color_mix_alpha_cache_t * cache) -{ - /*Pick the foreground if it's fully opaque or the Background is fully transparent*/ - if(fg.alpha >= LV_OPA_MAX || bg.alpha <= LV_OPA_MIN) { - return fg; - } - /*Transparent foreground: use the Background*/ - else if(fg.alpha <= LV_OPA_MIN) { - return bg; - } - /*Opaque background: use simple mix*/ - else if(bg.alpha == 255) { - return lv_color_mix32(fg, bg); - } - /*Both colors have alpha. Expensive calculation need to be applied*/ - else { - /*Save the parameters and the result. If they will be asked again don't compute again*/ - - /*Update the ratio and the result alpha value if the input alpha values change*/ - if(bg.alpha != cache->bg_saved.alpha || fg.alpha != cache->fg_saved.alpha) { - /*Info: - * https://en.wikipedia.org/wiki/Alpha_compositing#Analytical_derivation_of_the_over_operator*/ - cache->res_alpha_saved = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg.alpha); - LV_ASSERT(cache->res_alpha_saved != 0); - cache->ratio_saved = (uint32_t)((uint32_t)fg.alpha * 255) / cache->res_alpha_saved; - } - - if(!lv_color32_eq(bg, cache->bg_saved) || !lv_color32_eq(fg, cache->fg_saved)) { - cache->fg_saved = fg; - cache->bg_saved = bg; - fg.alpha = cache->ratio_saved; - cache->res_saved = lv_color_mix32(fg, bg); - cache->res_saved.alpha = cache->res_alpha_saved; - } - - return cache->res_saved; - } -} - -void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache) -{ - lv_memzero(&cache->fg_saved, sizeof(lv_color32_t)); - lv_memzero(&cache->bg_saved, sizeof(lv_color32_t)); - lv_memzero(&cache->res_saved, sizeof(lv_color32_t)); - cache->res_alpha_saved = 255; - cache->ratio_saved = 255; -} - -#if LV_DRAW_SW_SUPPORT_I1 - -static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) -{ - return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; -} - -#endif - -static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(lv_color32_t * dest, lv_color32_t src, - lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache) -{ - lv_color32_t res; - switch(mode) { - case LV_BLEND_MODE_ADDITIVE: - res.red = LV_MIN(dest->red + src.red, 255); - res.green = LV_MIN(dest->green + src.green, 255); - res.blue = LV_MIN(dest->blue + src.blue, 255); - break; - case LV_BLEND_MODE_SUBTRACTIVE: - res.red = LV_MAX(dest->red - src.red, 0); - res.green = LV_MAX(dest->green - src.green, 0); - res.blue = LV_MAX(dest->blue - src.blue, 0); - break; - case LV_BLEND_MODE_MULTIPLY: - res.red = (dest->red * src.red) >> 8; - res.green = (dest->green * src.green) >> 8; - res.blue = (dest->blue * src.blue) >> 8; - break; - default: - LV_LOG_WARN("Not supported blend mode: %d", mode); - return; - } - res.alpha = src.alpha; - *dest = lv_color_32_32_mix(res, *dest, cache); -} - -static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) -{ - return (void *)((uint8_t *)buf + stride); -} - -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h deleted file mode 100644 index 2046c23..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file lv_draw_sw_blend_to_argb8888.h - * - */ - -#ifndef LV_DRAW_SW_BLEND_TO_ARGB8888_H -#define LV_DRAW_SW_BLEND_TO_ARGB8888_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_draw_sw.h" -#if LV_USE_DRAW_SW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_argb8888(lv_draw_sw_blend_fill_dsc_t * dsc); - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_argb8888(lv_draw_sw_blend_image_dsc_t * dsc); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_SW*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_BLEND_TO_ARGB8888_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c deleted file mode 100644 index 1e056ee..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c +++ /dev/null @@ -1,1117 +0,0 @@ -/** - * @file lv_draw_sw_blend_to_i1.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_sw_blend_to_i1.h" -#if LV_USE_DRAW_SW - -#include "lv_draw_sw_blend_private.h" -#include "../../../misc/lv_math.h" -#include "../../../display/lv_display.h" -#include "../../../core/lv_refr.h" -#include "../../../misc/lv_color.h" -#include "../../../stdlib/lv_string.h" - -#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON - #include "neon/lv_blend_neon.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM - #include "helium/lv_blend_helium.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM - #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); - -#if LV_DRAW_SW_SUPPORT_L8 - static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -#if LV_DRAW_SW_SUPPORT_AL88 - static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -#if LV_DRAW_SW_SUPPORT_RGB565 - static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -#if LV_DRAW_SW_SUPPORT_RGB888 -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, - const uint8_t src_px_size); -#endif - -#if LV_DRAW_SW_SUPPORT_ARGB8888 - static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_8_mix(const uint8_t src, uint8_t * dest, uint8_t mix); - -static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(uint8_t * dest_buf, int32_t dest_x, - lv_color32_t src, - lv_blend_mode_t mode); - - -static inline void /* LV_ATTRIBUTE_FAST_MEM */ set_bit(uint8_t * buf, int32_t bit_idx); - -static inline void /* LV_ATTRIBUTE_FAST_MEM */ clear_bit(uint8_t * buf, int32_t bit_idx); - -static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); - -static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -#define I1_LUM_THRESHOLD 127 - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1 - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_OPA - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_MASK - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_MIX_MASK_OPA - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_I1 - #define LV_DRAW_SW_COLOR_BLEND_TO_I1(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_OPA - #define LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_MASK - #define LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_I1_MIX_MASK_OPA - #define LV_DRAW_SW_COLOR_BLEND_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1 - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_OPA - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_MASK - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_MIX_MASK_OPA - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1 - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_OPA - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_MASK - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1 - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_OPA - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_MASK - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_MIX_MASK_OPA - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1 - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_OPA - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_MASK - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_MIX_MASK_OPA - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1 - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_OPA - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_MASK - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_i1(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - const lv_opa_t * mask = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - int32_t dest_stride = dsc->dest_stride; - - uint8_t src_color = lv_color_luminance(dsc->color) / (I1_LUM_THRESHOLD + 1); - uint8_t * dest_buf = dsc->dest_buf; - - int32_t bit_ofs = dsc->relative_area.x1 % 8; - - /* Simple fill */ - if(mask == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_I1(dsc)) { - for(int32_t y = 0; y < h; y++) { - for(int32_t x = 0; x < w; x++) { - if(src_color) { - set_bit(dest_buf, x + bit_ofs); - } - else { - clear_bit(dest_buf, x + bit_ofs); - } - } - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - } - } - } - /* Opacity only */ - else if(mask == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_OPA(dsc)) { - for(int32_t y = 0; y < h; y++) { - for(int32_t x = 0; x < w; x++) { - uint8_t * dest_bit = &dest_buf[(x + bit_ofs) / 8]; - uint8_t current_bit = (*dest_bit >> (7 - ((x + bit_ofs) % 8))) & 0x01; - uint8_t new_bit = (opa * src_color + (255 - opa) * current_bit) / 255; - if(new_bit) { - set_bit(dest_buf, x + bit_ofs); - } - else { - clear_bit(dest_buf, x + bit_ofs); - } - } - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - } - } - } - /* Masked with full opacity */ - else if(mask && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_MASK(dsc)) { - for(int32_t y = 0; y < h; y++) { - for(int32_t x = 0; x < w; x++) { - uint8_t mask_val = mask[x]; - if(mask_val == LV_OPA_TRANSP) continue; - if(mask_val == LV_OPA_COVER) { - if(src_color) { - set_bit(dest_buf, x + bit_ofs); - } - else { - clear_bit(dest_buf, x + bit_ofs); - } - } - else { - uint8_t * dest_bit = &dest_buf[(x + bit_ofs) / 8]; - uint8_t current_bit = (*dest_bit >> (7 - ((x + bit_ofs) % 8))) & 0x01; - uint8_t new_bit = (mask_val * src_color + (255 - mask_val) * current_bit) / 255; - if(new_bit) { - set_bit(dest_buf, x + bit_ofs); - } - else { - clear_bit(dest_buf, x + bit_ofs); - } - } - } - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - mask += mask_stride; - } - } - } - /* Masked with opacity */ - else { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_I1_MIX_MASK_OPA(dsc)) { - for(int32_t y = 0; y < h; y++) { - for(int32_t x = 0; x < w; x++) { - uint8_t mask_val = mask[x]; - if(mask_val == LV_OPA_TRANSP) continue; - uint8_t * dest_bit = &dest_buf[(x + bit_ofs) / 8]; - uint8_t current_bit = (*dest_bit >> (7 - ((x + bit_ofs) % 8))) & 0x01; - uint8_t blended_opa = (mask_val * opa) / 255; - uint8_t new_bit = (blended_opa * src_color + (255 - blended_opa) * current_bit) / 255; - if(new_bit) { - set_bit(dest_buf, x + bit_ofs); - } - else { - clear_bit(dest_buf, x + bit_ofs); - } - } - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - mask += mask_stride; - } - } - } -} - -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_i1(lv_draw_sw_blend_image_dsc_t * dsc) -{ - switch(dsc->src_color_format) { -#if LV_DRAW_SW_SUPPORT_RGB565 - case LV_COLOR_FORMAT_RGB565: - rgb565_image_blend(dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB888 - case LV_COLOR_FORMAT_RGB888: - rgb888_image_blend(dsc, 3); - break; -#endif -#if LV_DRAW_SW_SUPPORT_XRGB8888 - case LV_COLOR_FORMAT_XRGB8888: - rgb888_image_blend(dsc, 4); - break; -#endif -#if LV_DRAW_SW_SUPPORT_ARGB8888 - case LV_COLOR_FORMAT_ARGB8888: - argb8888_image_blend(dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_L8 - case LV_COLOR_FORMAT_L8: - l8_image_blend(dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_AL88 - case LV_COLOR_FORMAT_AL88: - al88_image_blend(dsc); - break; -#endif - case LV_COLOR_FORMAT_I1: - i1_image_blend(dsc); - break; - default: - LV_LOG_WARN("Not supported source color format"); - break; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_i1 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_i1 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - int32_t bit_ofs = dsc->relative_area.x1 % 8; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - if(get_bit(src_buf_i1, src_x)) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t src = get_bit(src_buf_i1, src_x); - uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs); - uint8_t blended = (src * opa + dest * (255 - opa)); - if(blended > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t mask_val = mask_buf[src_x]; - uint8_t src = get_bit(src_buf_i1, src_x); - uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs); - uint8_t blended = (src * mask_val + dest * (255 - mask_val)); - if(blended > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t mask_val = mask_buf[src_x]; - if(mask_val == LV_OPA_TRANSP) continue; - uint8_t src = get_bit(src_buf_i1, src_x); - uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs); - uint8_t blend_opa = LV_OPA_MIX2(mask_val, opa); - uint8_t blended = (src * blend_opa + dest * (255 - blend_opa)); - if(blended > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - src_argb.red = get_bit(src_buf_i1, src_x) * 255; - src_argb.green = src_argb.red; - src_argb.blue = src_argb.red; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); - blend_non_normal_pixel(dest_buf_i1, dest_x + bit_ofs, src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } -} - -#if LV_DRAW_SW_SUPPORT_L8 -static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_i1 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_l8 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t src_x, dest_x; - int32_t y; - - int32_t bit_ofs = dsc->relative_area.x1 % 8; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - if(src_buf_l8[src_x] > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; - lv_color_8_8_mix(src_buf_l8[src_x], &dest_val, opa); - if(dest_val > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t src_luminance = src_buf_l8[src_x]; - uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; - lv_color_8_8_mix(src_luminance, &dest_val, mask_buf[src_x]); - if(dest_val > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t src_luminance = src_buf_l8[src_x]; - uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; - lv_color_8_8_mix(src_luminance, &dest_val, LV_OPA_MIX2(mask_buf[src_x], opa)); - if(dest_val > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(src_x = 0; src_x < w; src_x++) { - src_argb.red = src_buf_l8[src_x]; - src_argb.green = src_buf_l8[src_x]; - src_argb.blue = src_buf_l8[src_x]; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); - blend_non_normal_pixel(dest_buf_i1, src_x + bit_ofs, src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } -} -#endif - -#if LV_DRAW_SW_SUPPORT_AL88 -static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_i1 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color16a_t * src_buf_al88 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - int32_t bit_ofs = dsc->relative_area.x1 % 8; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; - lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_val, src_buf_al88[src_x].alpha); - if(dest_val > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; - lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_val, LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa)); - if(dest_val > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; - lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_val, LV_OPA_MIX2(src_buf_al88[src_x].alpha, mask_buf[src_x])); - if(dest_val > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; - lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_val, LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[src_x], opa)); - if(dest_val > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - src_argb.red = src_buf_al88[src_x].lumi; - src_argb.green = src_buf_al88[src_x].lumi; - src_argb.blue = src_buf_al88[src_x].lumi; - if(mask_buf == NULL) src_argb.alpha = LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa); - else src_argb.alpha = LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[src_x], opa); - blend_non_normal_pixel(dest_buf_i1, dest_x + bit_ofs, src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } -} -#endif - -#if LV_DRAW_SW_SUPPORT_ARGB8888 -static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_i1 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color32_t * src_buf_c32 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t x; - int32_t y; - - int32_t bit_ofs = dsc->relative_area.x1 % 8; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - uint8_t src = lv_color32_luminance(src_buf_c32[x]); - uint8_t dest = get_bit(dest_buf_i1, x + bit_ofs) * 255; - lv_color_8_8_mix(src, &dest, src_buf_c32[x].alpha); - if(dest > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - uint8_t src = lv_color32_luminance(src_buf_c32[x]); - uint8_t dest = get_bit(dest_buf_i1, x + bit_ofs) * 255; - lv_color_8_8_mix(src, &dest, LV_OPA_MIX2(opa, src_buf_c32[x].alpha)); - if(dest > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - uint8_t src = lv_color32_luminance(src_buf_c32[x]); - uint8_t dest = get_bit(dest_buf_i1, x + bit_ofs) * 255; - lv_color_8_8_mix(src, &dest, LV_OPA_MIX2(mask_buf[x], src_buf_c32[x].alpha)); - if(dest > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - uint8_t src = lv_color32_luminance(src_buf_c32[x]); - uint8_t dest = get_bit(dest_buf_i1, x + bit_ofs) * 255; - lv_color_8_8_mix(src, &dest, LV_OPA_MIX3(opa, mask_buf[x], src_buf_c32[x].alpha)); - if(dest > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color32_t color_argb = src_buf_c32[x]; - if(mask_buf == NULL) color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); - else color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, mask_buf[x], opa); - blend_non_normal_pixel(dest_buf_i1, x + bit_ofs, color_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } -} -#endif - -#if LV_DRAW_SW_SUPPORT_RGB888 -static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, - const uint8_t src_px_size) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_i1 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_rgb888 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - - int32_t bit_ofs = dsc->relative_area.x1 % 8; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - /*Special case*/ - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - uint8_t src = lv_color24_luminance(&src_buf_rgb888[src_x]); - if(src > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - uint8_t src = lv_color24_luminance(&src_buf_rgb888[src_x]); - uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; - lv_color_8_8_mix(src, &dest, opa); - if(dest > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { - uint32_t mask_x; - for(y = 0; y < h; y++) { - for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { - uint8_t src = lv_color24_luminance(&src_buf_rgb888[src_x]); - uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; - lv_color_8_8_mix(src, &dest, mask_buf[mask_x]); - if(dest > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { - uint32_t mask_x; - for(y = 0; y < h; y++) { - for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { - uint8_t src = lv_color24_luminance(&src_buf_rgb888[src_x]); - uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; - lv_color_8_8_mix(src, &dest, LV_OPA_MIX2(mask_buf[mask_x], opa)); - if(dest > I1_LUM_THRESHOLD) { - set_bit(dest_buf_i1, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_i1, dest_x + bit_ofs); - } - } - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); - mask_buf += mask_stride; - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - src_argb.red = src_buf_rgb888[src_x + 2]; - src_argb.green = src_buf_rgb888[src_x + 1]; - src_argb.blue = src_buf_rgb888[src_x + 0]; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); - - blend_non_normal_pixel(dest_buf_i1, dest_x + bit_ofs, src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); - src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); - } - } - } -} -#endif - -#if LV_DRAW_SW_SUPPORT_RGB565 -static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_u8 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color16_t * src_buf_c16 = (const lv_color16_t *)dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - int32_t bit_ofs = dsc->relative_area.x1 % 8; - - int32_t src_x; - int32_t dest_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1(dsc)) { - for(y = 0; y < h; y++) { - for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t src = lv_color16_luminance(src_buf_c16[src_x]); - if(src > I1_LUM_THRESHOLD) { - set_bit(dest_buf_u8, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_u8, dest_x + bit_ofs); - } - } - dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t src = lv_color16_luminance(src_buf_c16[src_x]); - uint8_t dest = get_bit(dest_buf_u8, dest_x + bit_ofs) * 255; - lv_color_8_8_mix(src, &dest, opa); - if(dest > I1_LUM_THRESHOLD) { - set_bit(dest_buf_u8, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_u8, dest_x + bit_ofs); - } - } - dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { - uint32_t mask_x; - for(y = 0; y < h; y++) { - for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x++) { - uint8_t src = lv_color16_luminance(src_buf_c16[src_x]); - uint8_t dest = get_bit(dest_buf_u8, dest_x + bit_ofs) * 255; - lv_color_8_8_mix(src, &dest, mask_buf[mask_x]); - if(dest > I1_LUM_THRESHOLD) { - set_bit(dest_buf_u8, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_u8, dest_x + bit_ofs); - } - } - dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { - uint32_t mask_x; - for(y = 0; y < h; y++) { - for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x++) { - uint8_t src = lv_color16_luminance(src_buf_c16[src_x]); - uint8_t dest = get_bit(dest_buf_u8, dest_x + bit_ofs) * 255; - lv_color_8_8_mix(src, &dest, LV_OPA_MIX2(mask_buf[mask_x], opa)); - if(dest > I1_LUM_THRESHOLD) { - set_bit(dest_buf_u8, dest_x + bit_ofs); - } - else { - clear_bit(dest_buf_u8, dest_x + bit_ofs); - } - } - dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(src_x = 0, dest_x = 0; src_x < w; src_x++, dest_x++) { - src_argb.red = (src_buf_c16[src_x].red * 2106) >> 8; - src_argb.green = (src_buf_c16[src_x].green * 1037) >> 8; - src_argb.blue = (src_buf_c16[src_x].blue * 2106) >> 8; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); - - blend_non_normal_pixel(dest_buf_u8, dest_x + bit_ofs, src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } -} -#endif - -static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(uint8_t * dest_buf, int32_t dest_x, lv_color32_t src, - lv_blend_mode_t mode) -{ - uint8_t res; - int32_t src_lumi = lv_color32_luminance(src); - uint8_t dest_lumi = get_bit(dest_buf, dest_x) * 255; - switch(mode) { - case LV_BLEND_MODE_ADDITIVE: - res = LV_MIN(dest_lumi + src_lumi, 255); - break; - case LV_BLEND_MODE_SUBTRACTIVE: - res = LV_MAX(dest_lumi - src_lumi, 0); - break; - case LV_BLEND_MODE_MULTIPLY: - res = (dest_lumi * src_lumi) >> 8; - break; - default: - LV_LOG_WARN("Not supported blend mode: %d", mode); - return; - } - - lv_color_8_8_mix(res, &dest_lumi, src.alpha); - if(dest_lumi > I1_LUM_THRESHOLD) { - set_bit(dest_buf, dest_x); - } - else { - clear_bit(dest_buf, dest_x); - } -} - -static inline void LV_ATTRIBUTE_FAST_MEM lv_color_8_8_mix(const uint8_t src, uint8_t * dest, uint8_t mix) -{ - - if(mix == 0) return; - - if(mix >= LV_OPA_MAX) { - *dest = src; - } - else { - lv_opa_t mix_inv = 255 - mix; - *dest = (uint32_t)((uint32_t)src * mix + dest[0] * mix_inv) >> 8; - } -} - -static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) -{ - return (void *)((uint8_t *)buf + stride); -} - -static inline void LV_ATTRIBUTE_FAST_MEM set_bit(uint8_t * buf, int32_t bit_idx) -{ - buf[bit_idx / 8] |= (1 << (7 - (bit_idx % 8))); -} - -static inline void LV_ATTRIBUTE_FAST_MEM clear_bit(uint8_t * buf, int32_t bit_idx) -{ - buf[bit_idx / 8] &= ~(1 << (7 - (bit_idx % 8))); -} - -static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) -{ - return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h deleted file mode 100644 index 5d72523..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file lv_draw_sw_blend_to_i1.h - * - */ - -#ifndef LV_DRAW_SW_BLEND_TO_I1_H -#define LV_DRAW_SW_BLEND_TO_I1_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_draw_sw.h" -#if LV_USE_DRAW_SW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_i1(lv_draw_sw_blend_fill_dsc_t * dsc); - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_i1(lv_draw_sw_blend_image_dsc_t * dsc); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_SW*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_BLEND_TO_I1_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c deleted file mode 100644 index fa9c025..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c +++ /dev/null @@ -1,897 +0,0 @@ -/** - * @file lv_draw_sw_blend_l8.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_sw_blend_to_l8.h" -#if LV_USE_DRAW_SW - -#if LV_DRAW_SW_SUPPORT_L8 - -#include "lv_draw_sw_blend_private.h" -#include "../../../misc/lv_math.h" -#include "../../../display/lv_display.h" -#include "../../../core/lv_refr.h" -#include "../../../misc/lv_color.h" -#include "../../../stdlib/lv_string.h" - -#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON - #include "neon/lv_blend_neon.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM - #include "helium/lv_blend_helium.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM - #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -#if LV_DRAW_SW_SUPPORT_I1 - static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); - - static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); -#endif - -static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); - -#if LV_DRAW_SW_SUPPORT_AL88 - static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -#if LV_DRAW_SW_SUPPORT_RGB565 - static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -#if LV_DRAW_SW_SUPPORT_RGB888 -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, - const uint8_t src_px_size); -#endif - -#if LV_DRAW_SW_SUPPORT_ARGB8888 - static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_8_mix(const uint8_t src, uint8_t * dest, uint8_t mix); - -static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, - lv_blend_mode_t mode); - -static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_L8 - #define LV_DRAW_SW_COLOR_BLEND_TO_L8(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_L8_WITH_OPA - #define LV_DRAW_SW_COLOR_BLEND_TO_L8_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_L8_WITH_MASK - #define LV_DRAW_SW_COLOR_BLEND_TO_L8_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_L8_MIX_MASK_OPA - #define LV_DRAW_SW_COLOR_BLEND_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8 - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_OPA - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_MASK - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_MIX_MASK_OPA - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8 - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_WITH_OPA - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_WITH_MASK - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_MIX_MASK_OPA - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8 - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_OPA - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_MASK - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_MIX_MASK_OPA - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8 - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_WITH_OPA - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_WITH_MASK - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_MIX_MASK_OPA - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8 - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_OPA - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_MASK - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_MIX_MASK_OPA - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_l8(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - const lv_opa_t * mask = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - int32_t dest_stride = dsc->dest_stride; - - int32_t x; - int32_t y; - - LV_UNUSED(w); - LV_UNUSED(h); - LV_UNUSED(x); - LV_UNUSED(y); - LV_UNUSED(opa); - LV_UNUSED(mask); - LV_UNUSED(mask_stride); - LV_UNUSED(dest_stride); - - /*Simple fill*/ - if(mask == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_L8(dsc)) { - uint8_t color8 = lv_color_luminance(dsc->color); - uint8_t * dest_buf = dsc->dest_buf; - for(y = 0; y < h; y++) { - for(x = 0; x < w - 16; x += 16) { - dest_buf[x + 0] = color8; - dest_buf[x + 1] = color8; - dest_buf[x + 2] = color8; - dest_buf[x + 3] = color8; - - dest_buf[x + 4] = color8; - dest_buf[x + 5] = color8; - dest_buf[x + 6] = color8; - dest_buf[x + 7] = color8; - - dest_buf[x + 8] = color8; - dest_buf[x + 9] = color8; - dest_buf[x + 10] = color8; - dest_buf[x + 11] = color8; - - dest_buf[x + 12] = color8; - dest_buf[x + 13] = color8; - dest_buf[x + 14] = color8; - dest_buf[x + 15] = color8; - } - for(; x < w; x ++) { - dest_buf[x] = color8; - } - - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - } - } - } - /*Opacity only*/ - else if(mask == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_L8_WITH_OPA(dsc)) { - uint8_t color8 = lv_color_luminance(dsc->color); - uint8_t * dest_buf = dsc->dest_buf; - - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color_8_8_mix(color8, &dest_buf[x], opa); - } - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - } - } - - } - /*Masked with full opacity*/ - else if(mask && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_L8_WITH_MASK(dsc)) { - uint8_t color8 = lv_color_luminance(dsc->color); - uint8_t * dest_buf = dsc->dest_buf; - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color_8_8_mix(color8, &dest_buf[x], mask[x]); - } - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - mask += mask_stride; - } - } - - } - /*Masked with opacity*/ - else { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_L8_MIX_MASK_OPA(dsc)) { - uint8_t color8 = lv_color_luminance(dsc->color); - uint8_t * dest_buf = dsc->dest_buf; - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color_8_8_mix(color8, &dest_buf[x], LV_OPA_MIX2(mask[x], opa)); - } - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - mask += mask_stride; - } - } - } -} - -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_l8(lv_draw_sw_blend_image_dsc_t * dsc) -{ - switch(dsc->src_color_format) { -#if LV_DRAW_SW_SUPPORT_RGB565 - case LV_COLOR_FORMAT_RGB565: - rgb565_image_blend(dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB888 - case LV_COLOR_FORMAT_RGB888: - rgb888_image_blend(dsc, 3); - break; -#endif -#if LV_DRAW_SW_SUPPORT_XRGB8888 - case LV_COLOR_FORMAT_XRGB8888: - rgb888_image_blend(dsc, 4); - break; -#endif -#if LV_DRAW_SW_SUPPORT_ARGB8888 - case LV_COLOR_FORMAT_ARGB8888: - argb8888_image_blend(dsc); - break; -#endif - case LV_COLOR_FORMAT_L8: - l8_image_blend(dsc); - break; -#if LV_DRAW_SW_SUPPORT_AL88 - case LV_COLOR_FORMAT_AL88: - al88_image_blend(dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_I1 - case LV_COLOR_FORMAT_I1: - i1_image_blend(dsc); - break; -#endif - default: - LV_LOG_WARN("Not supported source color format"); - break; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#if LV_DRAW_SW_SUPPORT_I1 -static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_l8 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_i1 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - lv_color_8_8_mix(chan_val, &dest_buf_l8[dest_x], opa); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - lv_color_8_8_mix(chan_val, &dest_buf_l8[dest_x], opa); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - lv_color_8_8_mix(chan_val, &dest_buf_l8[dest_x], mask_buf[src_x]); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - lv_color_8_8_mix(chan_val, &dest_buf_l8[dest_x], LV_OPA_MIX2(mask_buf[src_x], opa)); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - src_argb.red = get_bit(src_buf_i1, src_x) * 255; - src_argb.green = src_argb.red; - src_argb.blue = src_argb.red; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); - blend_non_normal_pixel(&dest_buf_l8[dest_x], src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } -} -#endif - -static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_l8 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_l8 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8(dsc)) { - for(y = 0; y < h; y++) { - lv_memcpy(dest_buf_l8, src_buf_l8, w); - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_8_mix(src_buf_l8[src_x], &dest_buf_l8[dest_x], opa); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_8_mix(src_buf_l8[src_x], &dest_buf_l8[dest_x], mask_buf[src_x]); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_8_mix(src_buf_l8[src_x], &dest_buf_l8[dest_x], LV_OPA_MIX2(mask_buf[src_x], opa)); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - src_argb.red = src_buf_l8[src_x]; - src_argb.green = src_buf_l8[src_x]; - src_argb.blue = src_buf_l8[src_x]; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); - blend_non_normal_pixel(&dest_buf_l8[dest_x], src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } -} - -#if LV_DRAW_SW_SUPPORT_AL88 - -static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_l8 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color16a_t * src_buf_al88 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_buf_l8[dest_x], src_buf_al88[src_x].alpha); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_buf_l8[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa)); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_buf_l8[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, - mask_buf[src_x])); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_buf_l8[dest_x], LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[src_x], - opa)); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { - src_argb.red = src_buf_al88[src_x].lumi; - src_argb.green = src_buf_al88[src_x].lumi; - src_argb.blue = src_buf_al88[src_x].lumi; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); - blend_non_normal_pixel(&dest_buf_l8[dest_x], src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_RGB565 - -static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_u8 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color16_t * src_buf_c16 = (const lv_color16_t *)dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t src_x; - int32_t dest_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8(dsc)) { - for(y = 0; y < h; y++) { - for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { - dest_buf_u8[dest_x] = lv_color16_luminance(src_buf_c16[src_x]); - } - dest_buf_u8 += dest_stride; - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_OPA(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_8_mix(lv_color16_luminance(src_buf_c16[src_x]), &dest_buf_u8[dest_x], opa); - } - dest_buf_u8 += dest_stride; - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_MASK(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_8_mix(lv_color16_luminance(src_buf_c16[src_x]), &dest_buf_u8[dest_x], mask_buf[src_x]); - } - dest_buf_u8 += dest_stride; - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - mask_buf += mask_stride; - } - } - } - else { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { - lv_color_8_8_mix(lv_color16_luminance(src_buf_c16[src_x]), &dest_buf_u8[dest_x], LV_OPA_MIX2(opa, mask_buf[src_x])); - } - dest_buf_u8 += dest_stride; - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(src_x = 0, dest_x = 0; src_x < w; src_x++, dest_x++) { - src_argb.red = (src_buf_c16[src_x].red * 2106) >> 8; - src_argb.green = (src_buf_c16[src_x].green * 1037) >> 8; - src_argb.blue = (src_buf_c16[src_x].blue * 2106) >> 8; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); - blend_non_normal_pixel(&dest_buf_u8[dest_x], src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_u8 += dest_stride; - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_RGB888 - -static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, - const uint8_t src_px_size) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_l8 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_u8 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - /*Special case*/ - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8(dsc, src_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - dest_buf_l8[dest_x] = lv_color24_luminance(&src_buf_u8[src_x]); - } - dest_buf_l8 += dest_stride; - src_buf_u8 += src_stride; - } - } - } - if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_WITH_OPA(dsc, dest_px_size, src_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - lv_color_8_8_mix(lv_color24_luminance(&src_buf_u8[src_x]), &dest_buf_l8[dest_x], opa); - } - dest_buf_l8 += dest_stride; - src_buf_u8 += src_stride; - } - } - } - if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_WITH_MASK(dsc, dest_px_size, src_px_size)) { - uint32_t mask_x; - for(y = 0; y < h; y++) { - for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { - lv_color_8_8_mix(lv_color24_luminance(&src_buf_u8[src_x]), &dest_buf_l8[dest_x], mask_buf[mask_x]); - } - dest_buf_l8 += dest_stride; - src_buf_u8 += src_stride; - mask_buf += mask_stride; - } - } - } - if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc, dest_px_size, src_px_size)) { - uint32_t mask_x; - for(y = 0; y < h; y++) { - for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { - lv_color_8_8_mix(lv_color24_luminance(&src_buf_u8[src_x]), &dest_buf_l8[dest_x], LV_OPA_MIX2(opa, mask_buf[mask_x])); - } - dest_buf_l8 += dest_stride; - src_buf_u8 += src_stride; - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - src_argb.red = src_buf_u8[src_x + 2]; - src_argb.green = src_buf_u8[src_x + 1]; - src_argb.blue = src_buf_u8[src_x + 0]; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); - - blend_non_normal_pixel(&dest_buf_l8[dest_x], src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_l8 += dest_stride; - src_buf_u8 += src_stride; - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_ARGB8888 - -static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_l8 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color32_t * src_buf_c32 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color_8_8_mix(lv_color32_luminance(src_buf_c32[x]), &dest_buf_l8[x], src_buf_c32[x].alpha); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color_8_8_mix(lv_color32_luminance(src_buf_c32[x]), &dest_buf_l8[x], LV_OPA_MIX2(src_buf_c32[x].alpha, opa)); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color_8_8_mix(lv_color32_luminance(src_buf_c32[x]), &dest_buf_l8[x], LV_OPA_MIX2(src_buf_c32[x].alpha, mask_buf[x])); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color_8_8_mix(lv_color32_luminance(src_buf_c32[x]), &dest_buf_l8[x], LV_OPA_MIX3(src_buf_c32[x].alpha, opa, - mask_buf[x])); - } - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - lv_color32_t color_argb = src_buf_c32[x]; - if(mask_buf == NULL) color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); - else color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, mask_buf[x], opa); - blend_non_normal_pixel(&dest_buf_l8[x], color_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } -} - -#endif - -static inline void LV_ATTRIBUTE_FAST_MEM lv_color_8_8_mix(const uint8_t src, uint8_t * dest, uint8_t mix) -{ - - if(mix == 0) return; - - if(mix >= LV_OPA_MAX) { - *dest = src; - } - else { - lv_opa_t mix_inv = 255 - mix; - *dest = (uint32_t)((uint32_t)src * mix + dest[0] * mix_inv) >> 8; - } -} - - -#if LV_DRAW_SW_SUPPORT_I1 - -static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) -{ - return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; -} - -#endif - -static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, lv_blend_mode_t mode) -{ - uint8_t res; - int32_t src_lumi = lv_color32_luminance(src); - switch(mode) { - case LV_BLEND_MODE_ADDITIVE: - res = LV_MIN(*dest + src_lumi, 255); - break; - case LV_BLEND_MODE_SUBTRACTIVE: - res = LV_MAX(*dest - src_lumi, 0); - break; - case LV_BLEND_MODE_MULTIPLY: - res = (*dest * src_lumi) >> 8; - break; - default: - LV_LOG_WARN("Not supported blend mode: %d", mode); - return; - } - lv_color_8_8_mix(res, dest, src.alpha); -} - -static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) -{ - return (void *)((uint8_t *)buf + stride); -} - -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_l8.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_l8.h deleted file mode 100644 index 079218e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_l8.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file lv_draw_sw_blend_to_l8.h - * - */ - -#ifndef LV_DRAW_SW_BLEND_TO_L8_H -#define LV_DRAW_SW_BLEND_TO_L8_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_draw_sw.h" -#if LV_USE_DRAW_SW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_l8(lv_draw_sw_blend_fill_dsc_t * dsc); - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_l8(lv_draw_sw_blend_image_dsc_t * dsc); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_SW*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_BLEND_TO_L8_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c deleted file mode 100644 index 1fa8c06..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c +++ /dev/null @@ -1,1150 +0,0 @@ -/** - * @file lv_draw_sw_blend_to_rgb565.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_sw_blend_to_rgb565.h" -#if LV_USE_DRAW_SW - -#if LV_DRAW_SW_SUPPORT_RGB565 - -#include "lv_draw_sw_blend_private.h" -#include "../../../misc/lv_math.h" -#include "../../../display/lv_display.h" -#include "../../../core/lv_refr.h" -#include "../../../misc/lv_color.h" -#include "../../../stdlib/lv_string.h" - -#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON - #include "neon/lv_blend_neon.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM - #include "helium/lv_blend_helium.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM - #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -#if LV_DRAW_SW_SUPPORT_AL88 - static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -#if LV_DRAW_SW_SUPPORT_I1 - static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); - - static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); -#endif - -#if LV_DRAW_SW_SUPPORT_L8 - static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); - -#if LV_DRAW_SW_SUPPORT_RGB888 -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, - const uint8_t src_px_size); -#endif - -#if LV_DRAW_SW_SUPPORT_ARGB8888 - static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); -#endif - -static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ l8_to_rgb565(const uint8_t c1); - -static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_16_mix(const uint8_t c1, uint16_t c2, uint8_t mix); - -static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix); - -static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 - #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA - #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK - #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA - #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565 - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_OPA - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_MASK - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565 - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_OPA - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_MASK - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA - #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565 - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_OPA - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_MASK - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Fill an area with a color. - * Supports normal fill, fill with opacity, fill with mask, and fill with mask and opacity. - * dest_buf and color have native color depth. (RGB565, RGB888, XRGB8888) - * The background (dest_buf) cannot have alpha channel - * @param dest_buf - * @param dest_area - * @param dest_stride - * @param color - * @param opa - * @param mask - * @param mask_stride - */ -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb565(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - uint16_t color16 = lv_color_to_u16(dsc->color); - lv_opa_t opa = dsc->opa; - const lv_opa_t * mask = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - uint16_t * dest_buf_u16 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - - int32_t x; - int32_t y; - - LV_UNUSED(w); - LV_UNUSED(h); - LV_UNUSED(x); - LV_UNUSED(y); - LV_UNUSED(opa); - LV_UNUSED(mask); - LV_UNUSED(color16); - LV_UNUSED(mask_stride); - LV_UNUSED(dest_stride); - LV_UNUSED(dest_buf_u16); - - /*Simple fill*/ - if(mask == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc)) { - for(y = 0; y < h; y++) { - uint16_t * dest_end_final = dest_buf_u16 + w; - uint32_t * dest_end_mid = (uint32_t *)((uint16_t *) dest_buf_u16 + ((w - 1) & ~(0xF))); - if((lv_uintptr_t)&dest_buf_u16[0] & 0x3) { - dest_buf_u16[0] = color16; - dest_buf_u16++; - } - - uint32_t c32 = (uint32_t)color16 + ((uint32_t)color16 << 16); - uint32_t * dest32 = (uint32_t *)dest_buf_u16; - while(dest32 < dest_end_mid) { - dest32[0] = c32; - dest32[1] = c32; - dest32[2] = c32; - dest32[3] = c32; - dest32[4] = c32; - dest32[5] = c32; - dest32[6] = c32; - dest32[7] = c32; - dest32 += 8; - } - - dest_buf_u16 = (uint16_t *)dest32; - - while(dest_buf_u16 < dest_end_final) { - *dest_buf_u16 = color16; - dest_buf_u16++; - } - - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - dest_buf_u16 -= w; - } - } - - } - /*Opacity only*/ - else if(mask == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc)) { - uint32_t last_dest32_color = dest_buf_u16[0] + 1; /*Set to value which is not equal to the first pixel*/ - uint32_t last_res32_color = 0; - - for(y = 0; y < h; y++) { - x = 0; - if((lv_uintptr_t)&dest_buf_u16[0] & 0x3) { - dest_buf_u16[0] = lv_color_16_16_mix(color16, dest_buf_u16[0], opa); - x = 1; - } - - for(; x < w - 2; x += 2) { - if(dest_buf_u16[x] != dest_buf_u16[x + 1]) { - dest_buf_u16[x + 0] = lv_color_16_16_mix(color16, dest_buf_u16[x + 0], opa); - dest_buf_u16[x + 1] = lv_color_16_16_mix(color16, dest_buf_u16[x + 1], opa); - } - else { - volatile uint32_t * dest32 = (uint32_t *)&dest_buf_u16[x]; - if(last_dest32_color == *dest32) { - *dest32 = last_res32_color; - } - else { - last_dest32_color = *dest32; - - dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x + 0], opa); - dest_buf_u16[x + 1] = dest_buf_u16[x]; - - last_res32_color = *dest32; - } - } - } - - for(; x < w ; x++) { - dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x], opa); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - } - } - - } - - /*Masked with full opacity*/ - else if(mask && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - x = 0; - if((lv_uintptr_t)(mask) & 0x1) { - dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x], mask[x]); - x++; - } - - for(; x <= w - 2; x += 2) { - uint16_t mask16 = *((uint16_t *)&mask[x]); - if(mask16 == 0xFFFF) { - dest_buf_u16[x + 0] = color16; - dest_buf_u16[x + 1] = color16; - } - else if(mask16 != 0) { - dest_buf_u16[x + 0] = lv_color_16_16_mix(color16, dest_buf_u16[x + 0], mask[x + 0]); - dest_buf_u16[x + 1] = lv_color_16_16_mix(color16, dest_buf_u16[x + 1], mask[x + 1]); - } - } - - for(; x < w ; x++) { - dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x], mask[x]); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - mask += mask_stride; - } - } - - } - /*Masked with opacity*/ - else if(mask && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x], LV_OPA_MIX2(mask[x], opa)); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - mask += mask_stride; - } - } - } -} - -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc) -{ - switch(dsc->src_color_format) { - case LV_COLOR_FORMAT_RGB565: - rgb565_image_blend(dsc); - break; -#if LV_DRAW_SW_SUPPORT_RGB888 - case LV_COLOR_FORMAT_RGB888: - rgb888_image_blend(dsc, 3); - break; -#endif -#if LV_DRAW_SW_SUPPORT_XRGB8888 - case LV_COLOR_FORMAT_XRGB8888: - rgb888_image_blend(dsc, 4); - break; -#endif -#if LV_DRAW_SW_SUPPORT_ARGB8888 - case LV_COLOR_FORMAT_ARGB8888: - argb8888_image_blend(dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_L8 - case LV_COLOR_FORMAT_L8: - l8_image_blend(dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_AL88 - case LV_COLOR_FORMAT_AL88: - al88_image_blend(dsc); - break; -#endif -#if LV_DRAW_SW_SUPPORT_I1 - case LV_COLOR_FORMAT_I1: - i1_image_blend(dsc); - break; -#endif - default: - LV_LOG_WARN("Not supported source color format"); - break; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#if LV_DRAW_SW_SUPPORT_I1 -static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint16_t * dest_buf_u16 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_i1 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - dest_buf_u16[dest_x] = l8_to_rgb565(chan_val); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - dest_buf_u16[dest_x] = lv_color_8_16_mix(chan_val, dest_buf_u16[dest_x], opa); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { - - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - dest_buf_u16[dest_x] = lv_color_8_16_mix(chan_val, dest_buf_u16[dest_x], mask_buf[dest_x]); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - dest_buf_u16[dest_x] = lv_color_8_16_mix(chan_val, dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { - uint16_t res = 0; - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - switch(dsc->blend_mode) { - case LV_BLEND_MODE_ADDITIVE: - // Additive blending mode - res = (LV_MIN(dest_buf_u16[dest_x] + l8_to_rgb565(chan_val), 0xFFFF)); - break; - case LV_BLEND_MODE_SUBTRACTIVE: - // Subtractive blending mode - res = (LV_MAX(dest_buf_u16[dest_x] - l8_to_rgb565(chan_val), 0)); - break; - case LV_BLEND_MODE_MULTIPLY: - // Multiply blending mode - res = ((((dest_buf_u16[dest_x] >> 11) * (l8_to_rgb565(chan_val) >> 3)) & 0x1F) << 11) | - ((((dest_buf_u16[dest_x] >> 5) & 0x3F) * ((l8_to_rgb565(chan_val) >> 2) & 0x3F) >> 6) << 5) | - (((dest_buf_u16[dest_x] & 0x1F) * (l8_to_rgb565(chan_val) & 0x1F)) >> 5); - break; - default: - LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); - return; - } - - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - dest_buf_u16[dest_x] = res; - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], opa); - } - else { - if(opa >= LV_OPA_MAX) - dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); - else - dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); - } - } - - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - if(mask_buf) mask_buf += mask_stride; - } - } -} -#endif - -#if LV_DRAW_SW_SUPPORT_AL88 -static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint16_t * dest_buf_u16 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color16a_t * src_buf_al88 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { - dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_al88[src_x].lumi, dest_buf_u16[dest_x], src_buf_al88[src_x].alpha); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { - dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_al88[src_x].lumi, dest_buf_u16[dest_x], - LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa)); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { - dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_al88[src_x].lumi, dest_buf_u16[dest_x], - LV_OPA_MIX2(src_buf_al88[src_x].alpha, mask_buf[dest_x])); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { - dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_al88[src_x].lumi, dest_buf_u16[dest_x], - LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[dest_x], opa)); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - uint16_t res = 0; - for(y = 0; y < h; y++) { - lv_color16_t * dest_buf_c16 = (lv_color16_t *)dest_buf_u16; - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { - uint8_t rb = src_buf_al88[src_x].lumi >> 3; - uint8_t g = src_buf_al88[src_x].lumi >> 2; - switch(dsc->blend_mode) { - case LV_BLEND_MODE_ADDITIVE: - res = (LV_MIN(dest_buf_c16[dest_x].red + rb, 31)) << 11; - res += (LV_MIN(dest_buf_c16[dest_x].green + g, 63)) << 5; - res += LV_MIN(dest_buf_c16[dest_x].blue + rb, 31); - break; - case LV_BLEND_MODE_SUBTRACTIVE: - res = (LV_MAX(dest_buf_c16[dest_x].red - rb, 0)) << 11; - res += (LV_MAX(dest_buf_c16[dest_x].green - g, 0)) << 5; - res += LV_MAX(dest_buf_c16[dest_x].blue - rb, 0); - break; - case LV_BLEND_MODE_MULTIPLY: - res = ((dest_buf_c16[dest_x].red * rb) >> 5) << 11; - res += ((dest_buf_c16[dest_x].green * g) >> 6) << 5; - res += (dest_buf_c16[dest_x].blue * rb) >> 5; - break; - default: - LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); - return; - } - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], src_buf_al88[src_x].alpha); - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(opa, src_buf_al88[src_x].alpha)); - } - else { - if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); - else dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX3(mask_buf[dest_x], opa, - src_buf_al88[src_x].alpha)); - } - } - - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - if(mask_buf) mask_buf += mask_stride; - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_L8 - -static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint16_t * dest_buf_u16 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_l8 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { - dest_buf_u16[dest_x] = l8_to_rgb565(src_buf_l8[src_x]); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_l8 += src_stride; - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { - dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_l8[src_x], dest_buf_u16[dest_x], opa); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_l8 += src_stride; - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { - dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_l8[src_x], dest_buf_u16[dest_x], mask_buf[dest_x]); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_l8 += src_stride; - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { - dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_l8[src_x], dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_l8 += src_stride; - mask_buf += mask_stride; - } - } - } - } - else { - uint16_t res = 0; - for(y = 0; y < h; y++) { - lv_color16_t * dest_buf_c16 = (lv_color16_t *)dest_buf_u16; - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { - uint8_t rb = src_buf_l8[src_x] >> 3; - uint8_t g = src_buf_l8[src_x] >> 2; - switch(dsc->blend_mode) { - case LV_BLEND_MODE_ADDITIVE: - res = (LV_MIN(dest_buf_c16[dest_x].red + rb, 31)) << 11; - res += (LV_MIN(dest_buf_c16[dest_x].green + g, 63)) << 5; - res += LV_MIN(dest_buf_c16[dest_x].blue + rb, 31); - break; - case LV_BLEND_MODE_SUBTRACTIVE: - res = (LV_MAX(dest_buf_c16[dest_x].red - rb, 0)) << 11; - res += (LV_MAX(dest_buf_c16[dest_x].green - g, 0)) << 5; - res += LV_MAX(dest_buf_c16[dest_x].blue - rb, 0); - break; - case LV_BLEND_MODE_MULTIPLY: - res = ((dest_buf_c16[dest_x].red * rb) >> 5) << 11; - res += ((dest_buf_c16[dest_x].green * g) >> 6) << 5; - res += (dest_buf_c16[dest_x].blue * rb) >> 5; - break; - default: - LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); - return; - } - - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - dest_buf_u16[dest_x] = res; - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], opa); - } - else { - if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); - else dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); - } - } - - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_l8 += src_stride; - if(mask_buf) mask_buf += mask_stride; - } - } -} - -#endif - -static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint16_t * dest_buf_u16 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint16_t * src_buf_u16 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc)) { - uint32_t line_in_bytes = w * 2; - for(y = 0; y < h; y++) { - lv_memcpy(dest_buf_u16, src_buf_u16, line_in_bytes); - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - dest_buf_u16[x] = lv_color_16_16_mix(src_buf_u16[x], dest_buf_u16[x], opa); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - dest_buf_u16[x] = lv_color_16_16_mix(src_buf_u16[x], dest_buf_u16[x], mask_buf[x]); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); - mask_buf += mask_stride; - } - } - } - else { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - dest_buf_u16[x] = lv_color_16_16_mix(src_buf_u16[x], dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa)); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - uint16_t res = 0; - for(y = 0; y < h; y++) { - lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; - lv_color16_t * src_buf_c16 = (lv_color16_t *) src_buf_u16; - for(x = 0; x < w; x++) { - switch(dsc->blend_mode) { - case LV_BLEND_MODE_ADDITIVE: - if(src_buf_u16[x] == 0x0000) continue; /*Do not add pure black*/ - res = (LV_MIN(dest_buf_c16[x].red + src_buf_c16[x].red, 31)) << 11; - res += (LV_MIN(dest_buf_c16[x].green + src_buf_c16[x].green, 63)) << 5; - res += LV_MIN(dest_buf_c16[x].blue + src_buf_c16[x].blue, 31); - break; - case LV_BLEND_MODE_SUBTRACTIVE: - if(src_buf_u16[x] == 0x0000) continue; /*Do not subtract pure black*/ - res = (LV_MAX(dest_buf_c16[x].red - src_buf_c16[x].red, 0)) << 11; - res += (LV_MAX(dest_buf_c16[x].green - src_buf_c16[x].green, 0)) << 5; - res += LV_MAX(dest_buf_c16[x].blue - src_buf_c16[x].blue, 0); - break; - case LV_BLEND_MODE_MULTIPLY: - if(src_buf_u16[x] == 0xffff) continue; /*Do not multiply with pure white (considered as 1)*/ - res = ((dest_buf_c16[x].red * src_buf_c16[x].red) >> 5) << 11; - res += ((dest_buf_c16[x].green * src_buf_c16[x].green) >> 6) << 5; - res += (dest_buf_c16[x].blue * src_buf_c16[x].blue) >> 5; - break; - default: - LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); - return; - } - - if(mask_buf == NULL) { - dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], opa); - } - else { - if(opa >= LV_OPA_MAX) dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], mask_buf[x]); - else dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa)); - } - } - - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); - if(mask_buf) mask_buf += mask_stride; - } - } -} - -#if LV_DRAW_SW_SUPPORT_RGB888 - -static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint16_t * dest_buf_u16 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_u8 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - dest_buf_u16[dest_x] = ((src_buf_u8[src_x + 2] & 0xF8) << 8) + - ((src_buf_u8[src_x + 1] & 0xFC) << 3) + - ((src_buf_u8[src_x + 0] & 0xF8) >> 3); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u8 += src_stride; - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], opa); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u8 += src_stride; - } - } - } - if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], mask_buf[dest_x]); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u8 += src_stride; - mask_buf += mask_stride; - } - } - } - if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u8 += src_stride; - mask_buf += mask_stride; - } - } - } - } - else { - uint16_t res = 0; - for(y = 0; y < h; y++) { - lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { - switch(dsc->blend_mode) { - case LV_BLEND_MODE_ADDITIVE: - res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; - res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; - res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); - break; - case LV_BLEND_MODE_SUBTRACTIVE: - res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; - res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; - res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); - break; - case LV_BLEND_MODE_MULTIPLY: - res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; - res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; - res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; - break; - default: - LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); - return; - } - - if(mask_buf == NULL) { - dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], opa); - } - else { - if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); - else dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); - } - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u8 += src_stride; - if(mask_buf) mask_buf += mask_stride; - } - - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_ARGB8888 - -static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint16_t * dest_buf_u16 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_u8 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { - dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], src_buf_u8[src_x + 3]); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u8 += src_stride; - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { - dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], LV_OPA_MIX2(src_buf_u8[src_x + 3], - opa)); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u8 += src_stride; - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { - dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], - LV_OPA_MIX2(src_buf_u8[src_x + 3], mask_buf[dest_x])); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u8 += src_stride; - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { - dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], - LV_OPA_MIX3(src_buf_u8[src_x + 3], mask_buf[dest_x], opa)); - } - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u8 += src_stride; - mask_buf += mask_stride; - } - } - } - } - else { - uint16_t res = 0; - for(y = 0; y < h; y++) { - lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; - for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { - switch(dsc->blend_mode) { - case LV_BLEND_MODE_ADDITIVE: - res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; - res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; - res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); - break; - case LV_BLEND_MODE_SUBTRACTIVE: - res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; - res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; - res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); - break; - case LV_BLEND_MODE_MULTIPLY: - res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; - res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; - res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; - break; - default: - LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); - return; - } - - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], src_buf_u8[src_x + 3]); - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(opa, src_buf_u8[src_x + 3])); - } - else { - if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); - else dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX3(mask_buf[dest_x], opa, - src_buf_u8[src_x + 3])); - } - } - - dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); - src_buf_u8 += src_stride; - if(mask_buf) mask_buf += mask_stride; - } - } -} - -#endif - -static inline uint16_t LV_ATTRIBUTE_FAST_MEM l8_to_rgb565(const uint8_t c1) -{ - return ((c1 & 0xF8) << 8) + ((c1 & 0xFC) << 3) + ((c1 & 0xF8) >> 3); -} - -static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_8_16_mix(const uint8_t c1, uint16_t c2, uint8_t mix) -{ - - if(mix == 0) { - return c2; - } - else if(mix == 255) { - return ((c1 & 0xF8) << 8) + ((c1 & 0xFC) << 3) + ((c1 & 0xF8) >> 3); - } - else { - lv_opa_t mix_inv = 255 - mix; - - return ((((c1 >> 3) * mix + ((c2 >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + - ((((c1 >> 2) * mix + ((c2 >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + - (((c1 >> 3) * mix + (c2 & 0x1F) * mix_inv) >> 8); - } -} - -static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix) -{ - if(mix == 0) { - return c2; - } - else if(mix == 255) { - return ((c1[2] & 0xF8) << 8) + ((c1[1] & 0xFC) << 3) + ((c1[0] & 0xF8) >> 3); - } - else { - lv_opa_t mix_inv = 255 - mix; - - return ((((c1[2] >> 3) * mix + ((c2 >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + - ((((c1[1] >> 2) * mix + ((c2 >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + - (((c1[0] >> 3) * mix + (c2 & 0x1F) * mix_inv) >> 8); - } -} - -#if LV_DRAW_SW_SUPPORT_I1 - -static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) -{ - return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; -} - -#endif - -static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) -{ - return (void *)((uint8_t *)buf + stride); -} - -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h deleted file mode 100644 index d14bfd9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file lv_draw_sw_blend_to_rgb565.h - * - */ - -#ifndef LV_DRAW_SW_BLEND_TO_RGB565_H -#define LV_DRAW_SW_BLEND_TO_RGB565_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_draw_sw.h" -#if LV_USE_DRAW_SW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_rgb565(lv_draw_sw_blend_fill_dsc_t * dsc); - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_SW*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_BLEND_TO_RGB565_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c deleted file mode 100644 index e29e934..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c +++ /dev/null @@ -1,985 +0,0 @@ -/** - * @file lv_draw_sw_blend_to_rgb888.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_sw_blend_to_rgb888.h" -#if LV_USE_DRAW_SW - -#if LV_DRAW_SW_SUPPORT_RGB888 - -#include "lv_draw_sw_blend_private.h" -#include "../../../misc/lv_math.h" -#include "../../../display/lv_display.h" -#include "../../../core/lv_refr.h" -#include "../../../misc/lv_color.h" -#include "../../../stdlib/lv_string.h" - -#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON - #include "neon/lv_blend_neon.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM - #include "helium/lv_blend_helium.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM - #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -#if LV_DRAW_SW_SUPPORT_AL88 - static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); -#endif - -#if LV_DRAW_SW_SUPPORT_I1 - static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); - - static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); -#endif - -#if LV_DRAW_SW_SUPPORT_L8 - static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); -#endif - -#if LV_DRAW_SW_SUPPORT_RGB565 - static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); -#endif - -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, - const uint8_t dest_px_size, - uint32_t src_px_size); - -#if LV_DRAW_SW_SUPPORT_ARGB8888 -static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dest_px_size); -#endif - -static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_24_mix(const uint8_t src, uint8_t * dest, uint8_t mix); - -static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_24_24_mix(const uint8_t * src, uint8_t * dest, uint8_t mix); - -static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, - lv_blend_mode_t mode); -static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 - #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA - #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK - #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA - #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888 - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_OPA - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_MASK - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA - #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA - #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA - #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA - #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_888 - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_OPA - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_OPA(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_MASK - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_MASK(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_MIX_MASK_OPA - #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_MIX_MASK_OPA(...) LV_RESULT_INVALID -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb888(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - const lv_opa_t * mask = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - int32_t dest_stride = dsc->dest_stride; - - int32_t x; - int32_t y; - - LV_UNUSED(w); - LV_UNUSED(h); - LV_UNUSED(x); - LV_UNUSED(y); - LV_UNUSED(opa); - LV_UNUSED(mask); - LV_UNUSED(mask_stride); - LV_UNUSED(dest_stride); - - /*Simple fill*/ - if(mask == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dest_px_size)) { - if(dest_px_size == 3) { - uint8_t * dest_buf_u8 = dsc->dest_buf; - uint8_t * dest_buf_ori = dsc->dest_buf; - w *= dest_px_size; - - for(x = 0; x < w; x += 3) { - dest_buf_u8[x + 0] = dsc->color.blue; - dest_buf_u8[x + 1] = dsc->color.green; - dest_buf_u8[x + 2] = dsc->color.red; - } - - dest_buf_u8 += dest_stride; - - for(y = 1; y < h; y++) { - lv_memcpy(dest_buf_u8, dest_buf_ori, w); - dest_buf_u8 += dest_stride; - } - } - if(dest_px_size == 4) { - uint32_t color32 = lv_color_to_u32(dsc->color); - uint32_t * dest_buf_u32 = dsc->dest_buf; - for(y = 0; y < h; y++) { - for(x = 0; x <= w - 16; x += 16) { - dest_buf_u32[x + 0] = color32; - dest_buf_u32[x + 1] = color32; - dest_buf_u32[x + 2] = color32; - dest_buf_u32[x + 3] = color32; - - dest_buf_u32[x + 4] = color32; - dest_buf_u32[x + 5] = color32; - dest_buf_u32[x + 6] = color32; - dest_buf_u32[x + 7] = color32; - - dest_buf_u32[x + 8] = color32; - dest_buf_u32[x + 9] = color32; - dest_buf_u32[x + 10] = color32; - dest_buf_u32[x + 11] = color32; - - dest_buf_u32[x + 12] = color32; - dest_buf_u32[x + 13] = color32; - dest_buf_u32[x + 14] = color32; - dest_buf_u32[x + 15] = color32; - } - for(; x < w; x ++) { - dest_buf_u32[x] = color32; - } - - dest_buf_u32 = drawbuf_next_row(dest_buf_u32, dest_stride); - } - } - } - } - /*Opacity only*/ - else if(mask == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { - uint32_t color32 = lv_color_to_u32(dsc->color); - uint8_t * dest_buf = dsc->dest_buf; - w *= dest_px_size; - for(y = 0; y < h; y++) { - for(x = 0; x < w; x += dest_px_size) { - lv_color_24_24_mix((const uint8_t *)&color32, &dest_buf[x], opa); - } - - dest_buf = drawbuf_next_row(dest_buf, dest_stride); - } - } - } - /*Masked with full opacity*/ - else if(mask && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { - uint32_t color32 = lv_color_to_u32(dsc->color); - uint8_t * dest_buf = dsc->dest_buf; - w *= dest_px_size; - - for(y = 0; y < h; y++) { - uint32_t mask_x; - for(x = 0, mask_x = 0; x < w; x += dest_px_size, mask_x++) { - lv_color_24_24_mix((const uint8_t *)&color32, &dest_buf[x], mask[mask_x]); - } - dest_buf += dest_stride; - mask += mask_stride; - } - } - } - /*Masked with opacity*/ - else { - if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { - uint32_t color32 = lv_color_to_u32(dsc->color); - uint8_t * dest_buf = dsc->dest_buf; - w *= dest_px_size; - - for(y = 0; y < h; y++) { - uint32_t mask_x; - for(x = 0, mask_x = 0; x < w; x += dest_px_size, mask_x++) { - lv_color_24_24_mix((const uint8_t *) &color32, &dest_buf[x], LV_OPA_MIX2(opa, mask[mask_x])); - } - dest_buf += dest_stride; - mask += mask_stride; - } - } - } -} - -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) -{ - - switch(dsc->src_color_format) { -#if LV_DRAW_SW_SUPPORT_RGB565 - case LV_COLOR_FORMAT_RGB565: - rgb565_image_blend(dsc, dest_px_size); - break; -#endif - case LV_COLOR_FORMAT_RGB888: - rgb888_image_blend(dsc, dest_px_size, 3); - break; -#if LV_DRAW_SW_SUPPORT_XRGB8888 - case LV_COLOR_FORMAT_XRGB8888: - rgb888_image_blend(dsc, dest_px_size, 4); - break; -#endif -#if LV_DRAW_SW_SUPPORT_ARGB8888 - case LV_COLOR_FORMAT_ARGB8888: - argb8888_image_blend(dsc, dest_px_size); - break; -#endif -#if LV_DRAW_SW_SUPPORT_L8 - case LV_COLOR_FORMAT_L8: - l8_image_blend(dsc, dest_px_size); - break; -#endif -#if LV_DRAW_SW_SUPPORT_AL88 - case LV_COLOR_FORMAT_AL88: - al88_image_blend(dsc, dest_px_size); - break; -#endif -#if LV_DRAW_SW_SUPPORT_I1 - case LV_COLOR_FORMAT_I1: - i1_image_blend(dsc, dest_px_size); - break; -#endif - default: - LV_LOG_WARN("Not supported source color format"); - break; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#if LV_DRAW_SW_SUPPORT_I1 -static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_u8 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_i1 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_888(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - dest_buf_u8[dest_x + 2] = chan_val; - dest_buf_u8[dest_x + 1] = chan_val; - dest_buf_u8[dest_x + 0] = chan_val; - } - dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - lv_color_8_24_mix(chan_val, &dest_buf_u8[dest_x], opa); - } - dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_MASK(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - lv_color_8_24_mix(chan_val, &dest_buf_u8[dest_x], mask_buf[src_x]); - } - dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_MIX_MASK_OPA(dsc)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; - lv_color_8_24_mix(chan_val, &dest_buf_u8[dest_x], LV_OPA_MIX2(opa, mask_buf[src_x])); - } - dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - lv_color32_t src_argb; - src_argb.red = get_bit(src_buf_i1, src_x) * 255; - src_argb.green = src_argb.red; - src_argb.blue = src_argb.red; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); - blend_non_normal_pixel(&dest_buf_u8[dest_x], src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); - src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); - } - } -} -#endif - -#if LV_DRAW_SW_SUPPORT_AL88 -static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_u8 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color16a_t * src_buf_al88 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - lv_color_8_24_mix(src_buf_al88[src_x].lumi, &dest_buf_u8[dest_x], src_buf_al88[src_x].alpha); - } - dest_buf_u8 += dest_stride; - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - lv_color_8_24_mix(src_buf_al88[src_x].lumi, &dest_buf_u8[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa)); - } - dest_buf_u8 += dest_stride; - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - lv_color_8_24_mix(src_buf_al88[src_x].lumi, &dest_buf_u8[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, - mask_buf[src_x])); - } - dest_buf_u8 += dest_stride; - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - lv_color_8_24_mix(src_buf_al88[src_x].lumi, &dest_buf_u8[dest_x], LV_OPA_MIX3(src_buf_al88[src_x].alpha, - mask_buf[src_x], opa)); - } - dest_buf_u8 += dest_stride; - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - lv_color32_t src_argb; - src_argb.red = src_argb.green = src_argb.blue = src_buf_al88[src_x].lumi; - if(mask_buf == NULL) src_argb.alpha = LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa); - else src_argb.alpha = LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[dest_x], opa); - blend_non_normal_pixel(&dest_buf_u8[dest_x], src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_u8 += dest_stride; - src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_L8 - -static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_u8 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf_l8 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - dest_buf_u8[dest_x + 2] = src_buf_l8[src_x]; - dest_buf_u8[dest_x + 1] = src_buf_l8[src_x]; - dest_buf_u8[dest_x + 0] = src_buf_l8[src_x]; - } - dest_buf_u8 += dest_stride; - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - lv_color_8_24_mix(src_buf_l8[src_x], &dest_buf_u8[dest_x], opa); - } - dest_buf_u8 += dest_stride; - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - lv_color_8_24_mix(src_buf_l8[src_x], &dest_buf_u8[dest_x], mask_buf[src_x]); - } - dest_buf_u8 += dest_stride; - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - lv_color_8_24_mix(src_buf_l8[src_x], &dest_buf_u8[dest_x], LV_OPA_MIX2(opa, mask_buf[src_x])); - } - dest_buf_u8 += dest_stride; - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - src_argb.red = src_buf_l8[src_x]; - src_argb.green = src_buf_l8[src_x]; - src_argb.blue = src_buf_l8[src_x]; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); - blend_non_normal_pixel(&dest_buf_u8[dest_x], src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_u8 += dest_stride; - src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_RGB565 - -static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf_u8 = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color16_t * src_buf_c16 = (const lv_color16_t *) dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t src_x; - int32_t dest_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(src_x = 0, dest_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - dest_buf_u8[dest_x + 2] = (src_buf_c16[src_x].red * 2106) >> 8; /*To make it rounded*/ - dest_buf_u8[dest_x + 1] = (src_buf_c16[src_x].green * 1037) >> 8; - dest_buf_u8[dest_x + 0] = (src_buf_c16[src_x].blue * 2106) >> 8; - } - dest_buf_u8 += dest_stride; - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { - uint8_t res[3]; - for(y = 0; y < h; y++) { - for(src_x = 0, dest_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - res[2] = (src_buf_c16[src_x].red * 2106) >> 8; /*To make it rounded*/ - res[1] = (src_buf_c16[src_x].green * 1037) >> 8; - res[0] = (src_buf_c16[src_x].blue * 2106) >> 8; - lv_color_24_24_mix(res, &dest_buf_u8[dest_x], opa); - } - dest_buf_u8 += dest_stride; - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { - uint8_t res[3]; - for(y = 0; y < h; y++) { - for(src_x = 0, dest_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - res[2] = (src_buf_c16[src_x].red * 2106) >> 8; /*To make it rounded*/ - res[1] = (src_buf_c16[src_x].green * 1037) >> 8; - res[0] = (src_buf_c16[src_x].blue * 2106) >> 8; - lv_color_24_24_mix(res, &dest_buf_u8[dest_x], mask_buf[src_x]); - } - dest_buf_u8 += dest_stride; - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - mask_buf += mask_stride; - } - } - } - else { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { - uint8_t res[3]; - for(y = 0; y < h; y++) { - for(src_x = 0, dest_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - res[2] = (src_buf_c16[src_x].red * 2106) >> 8; /*To make it rounded*/ - res[1] = (src_buf_c16[src_x].green * 1037) >> 8; - res[0] = (src_buf_c16[src_x].blue * 2106) >> 8; - lv_color_24_24_mix(res, &dest_buf_u8[dest_x], LV_OPA_MIX2(opa, mask_buf[src_x])); - } - dest_buf_u8 += dest_stride; - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(src_x = 0, dest_x = 0; src_x < w; src_x++, dest_x += dest_px_size) { - src_argb.red = (src_buf_c16[src_x].red * 2106) >> 8; - src_argb.green = (src_buf_c16[src_x].green * 1037) >> 8; - src_argb.blue = (src_buf_c16[src_x].blue * 2106) >> 8; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); - blend_non_normal_pixel(&dest_buf_u8[dest_x], src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf_u8 += dest_stride; - src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); - } - } -} - -#endif - -static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t dest_px_size, - uint32_t src_px_size) -{ - int32_t w = dsc->dest_w * dest_px_size; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const uint8_t * src_buf = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - /*Special case*/ - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size, src_px_size)) { - if(src_px_size == dest_px_size) { - for(y = 0; y < h; y++) { - lv_memcpy(dest_buf, src_buf, w); - dest_buf += dest_stride; - src_buf += src_stride; - } - } - else { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x += dest_px_size, src_x += src_px_size) { - dest_buf[dest_x + 0] = src_buf[src_x + 0]; - dest_buf[dest_x + 1] = src_buf[src_x + 1]; - dest_buf[dest_x + 2] = src_buf[src_x + 2]; - } - dest_buf += dest_stride; - src_buf += src_stride; - } - } - } - } - if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size, src_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x += dest_px_size, src_x += src_px_size) { - lv_color_24_24_mix(&src_buf[src_x], &dest_buf[dest_x], opa); - } - dest_buf += dest_stride; - src_buf += src_stride; - } - } - } - if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size, src_px_size)) { - uint32_t mask_x; - for(y = 0; y < h; y++) { - for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x += dest_px_size, src_x += src_px_size) { - lv_color_24_24_mix(&src_buf[src_x], &dest_buf[dest_x], mask_buf[mask_x]); - } - dest_buf += dest_stride; - src_buf += src_stride; - mask_buf += mask_stride; - } - } - } - if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size, src_px_size)) { - uint32_t mask_x; - for(y = 0; y < h; y++) { - for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x += dest_px_size, src_x += src_px_size) { - lv_color_24_24_mix(&src_buf[src_x], &dest_buf[dest_x], LV_OPA_MIX2(opa, mask_buf[mask_x])); - } - dest_buf += dest_stride; - src_buf += src_stride; - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; dest_x < w; dest_x += dest_px_size, src_x += src_px_size) { - src_argb.red = src_buf[src_x + 2]; - src_argb.green = src_buf[src_x + 1]; - src_argb.blue = src_buf[src_x + 0]; - if(mask_buf == NULL) src_argb.alpha = opa; - else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); - - blend_non_normal_pixel(&dest_buf[dest_x], src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf += dest_stride; - src_buf += src_stride; - } - } -} - -#if LV_DRAW_SW_SUPPORT_ARGB8888 - -static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) -{ - int32_t w = dsc->dest_w; - int32_t h = dsc->dest_h; - lv_opa_t opa = dsc->opa; - uint8_t * dest_buf = dsc->dest_buf; - int32_t dest_stride = dsc->dest_stride; - const lv_color32_t * src_buf_c32 = dsc->src_buf; - int32_t src_stride = dsc->src_stride; - const lv_opa_t * mask_buf = dsc->mask_buf; - int32_t mask_stride = dsc->mask_stride; - - int32_t dest_x; - int32_t src_x; - int32_t y; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { - if(mask_buf == NULL && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - lv_color_24_24_mix((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], src_buf_c32[src_x].alpha); - } - dest_buf += dest_stride; - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } - } - else if(mask_buf == NULL && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - lv_color_24_24_mix((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], LV_OPA_MIX2(src_buf_c32[src_x].alpha, opa)); - } - dest_buf += dest_stride; - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } - } - else if(mask_buf && opa >= LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - lv_color_24_24_mix((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], - LV_OPA_MIX2(src_buf_c32[src_x].alpha, mask_buf[src_x])); - } - dest_buf += dest_stride; - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - mask_buf += mask_stride; - } - } - } - else if(mask_buf && opa < LV_OPA_MAX) { - if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { - lv_color_24_24_mix((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], - LV_OPA_MIX3(src_buf_c32[src_x].alpha, mask_buf[src_x], opa)); - } - dest_buf += dest_stride; - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - mask_buf += mask_stride; - } - } - } - } - else { - lv_color32_t src_argb; - for(y = 0; y < h; y++) { - for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x ++) { - src_argb = src_buf_c32[src_x]; - if(mask_buf == NULL) src_argb.alpha = LV_OPA_MIX2(src_argb.alpha, opa); - else src_argb.alpha = LV_OPA_MIX3(src_argb.alpha, mask_buf[dest_x], opa); - - blend_non_normal_pixel(&dest_buf[dest_x], src_argb, dsc->blend_mode); - } - if(mask_buf) mask_buf += mask_stride; - dest_buf += dest_stride; - src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); - } - } -} - -#endif - -static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, lv_blend_mode_t mode) -{ - uint8_t res[3] = {0, 0, 0}; - switch(mode) { - case LV_BLEND_MODE_ADDITIVE: - res[0] = LV_MIN(dest[0] + src.blue, 255); - res[1] = LV_MIN(dest[1] + src.green, 255); - res[2] = LV_MIN(dest[2] + src.red, 255); - break; - case LV_BLEND_MODE_SUBTRACTIVE: - res[0] = LV_MAX(dest[0] - src.blue, 0); - res[1] = LV_MAX(dest[1] - src.green, 0); - res[2] = LV_MAX(dest[2] - src.red, 0); - break; - case LV_BLEND_MODE_MULTIPLY: - res[0] = (dest[0] * src.blue) >> 8; - res[1] = (dest[1] * src.green) >> 8; - res[2] = (dest[2] * src.red) >> 8; - break; - default: - LV_LOG_WARN("Not supported blend mode: %d", mode); - return; - } - lv_color_24_24_mix(res, dest, src.alpha); -} - -static inline void LV_ATTRIBUTE_FAST_MEM lv_color_8_24_mix(const uint8_t src, uint8_t * dest, uint8_t mix) -{ - - if(mix == 0) return; - - if(mix >= LV_OPA_MAX) { - dest[0] = src; - dest[1] = src; - dest[2] = src; - } - else { - lv_opa_t mix_inv = 255 - mix; - dest[0] = (uint32_t)((uint32_t)src * mix + dest[0] * mix_inv) >> 8; - dest[1] = (uint32_t)((uint32_t)src * mix + dest[1] * mix_inv) >> 8; - dest[2] = (uint32_t)((uint32_t)src * mix + dest[2] * mix_inv) >> 8; - } -} - -static inline void LV_ATTRIBUTE_FAST_MEM lv_color_24_24_mix(const uint8_t * src, uint8_t * dest, uint8_t mix) -{ - - if(mix == 0) return; - - if(mix >= LV_OPA_MAX) { - dest[0] = src[0]; - dest[1] = src[1]; - dest[2] = src[2]; - } - else { - lv_opa_t mix_inv = 255 - mix; - dest[0] = (uint32_t)((uint32_t)src[0] * mix + dest[0] * mix_inv) >> 8; - dest[1] = (uint32_t)((uint32_t)src[1] * mix + dest[1] * mix_inv) >> 8; - dest[2] = (uint32_t)((uint32_t)src[2] * mix + dest[2] * mix_inv) >> 8; - } -} - -#if LV_DRAW_SW_SUPPORT_I1 - -static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) -{ - return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; -} - -#endif - - -static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) -{ - return (void *)((uint8_t *)buf + stride); -} - -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h deleted file mode 100644 index 441c0d3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @file lv_draw_sw_blend_to_rgb888.h - * - */ - -#ifndef LV_DRAW_SW_BLEND_TO_RGB888_H -#define LV_DRAW_SW_BLEND_TO_RGB888_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_draw_sw.h" -#if LV_USE_DRAW_SW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_rgb888(lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dest_px_size); - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dest_px_size); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_SW*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_BLEND_TO_RGB888_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/neon/lv_blend_neon.S b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/neon/lv_blend_neon.S deleted file mode 100644 index e821204..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/neon/lv_blend_neon.S +++ /dev/null @@ -1,685 +0,0 @@ -/** - * @file lv_blend_neon.S - * - */ - -#ifndef __ASSEMBLY__ -#define __ASSEMBLY__ -#endif - -#include "lv_blend_neon.h" - -#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON - -.text -.fpu neon -.arch armv7a -.syntax unified -.altmacro -.p2align 2 - -@ d0 ~ d3 : src B,G,R,A -@ d4 ~ d7 : dst B,G,R,A -@ q8 : src RGB565 raw -@ q9 : dst RGB565 raw -@ q10 ~ q12: pre-multiplied src -@ d26~29 : temp -@ d30 : mask -@ d31 : opa - -FG_MASK .req r0 -BG_MASK .req r1 -DST_ADDR .req r2 -DST_W .req r3 -DST_H .req r4 -DST_STRIDE .req r5 -SRC_ADDR .req r6 -SRC_STRIDE .req r7 -MASK_ADDR .req r8 -MASK_STRIDE .req r9 -W .req r10 -H .req r11 -S_8888_L .qn q0 -S_8888_H .qn q1 -D_8888_L .qn q2 -D_8888_H .qn q3 - S_B .dn d0 - S_G .dn d1 - S_R .dn d2 - S_A .dn d3 - D_B .dn d4 - D_G .dn d5 - D_R .dn d6 - D_A .dn d7 -S_565 .qn q8 -D_565 .qn q9 - S_565_L .dn d16 - S_565_H .dn d17 - D_565_L .dn d18 - D_565_H .dn d19 -PREMULT_B .qn q10 -PREMULT_G .qn q11 -PREMULT_R .qn q12 -TMP_Q0 .qn q13 - TMP_D0 .dn d26 - TMP_D1 .dn d27 -TMP_Q1 .qn q14 - TMP_D2 .dn d28 - TMP_D3 .dn d29 - M_A .dn d30 - OPA .dn d31 - -.macro convert reg, bpp, intlv -.if bpp >= 31 - .if intlv - vzip.8 reg&_B, reg&_R @ BRBRBRBR GGGGGGGG BRBRBRBR AAAAAAAA - vzip.8 reg&_G, reg&_A @ BRBRBRBR GAGAGAGA BRBRBRBR GAGAGAGA - vzip.8 reg&_R, reg&_A @ BRBRBRBR GAGAGAGA BGRABGRA BGRABGRA - vzip.8 reg&_B, reg&_G @ BGRABGRA BGRABGRA BGRABGRA BGRABGRA - .else - vuzp.8 reg&_B, reg&_G @ BRBRBRBR GAGAGAGA BGRABGRA BGRABGRA - vuzp.8 reg&_R, reg&_A @ BRBRBRBR GAGAGAGA BRBRBRBR GAGAGAGA - vuzp.8 reg&_G, reg&_A @ BRBRBRBR GGGGGGGG BRBRBRBR AAAAAAAA - vuzp.8 reg&_B, reg&_R @ BBBBBBBB GGGGGGGG RRRRRRRR AAAAAAAA - .endif -.elseif bpp == 24 - .if intlv @ for init only (same B,G,R for all channel) - vzip.8 reg&_B, reg&_G @ BGBGBGBG BGBGBGBG RRRRRRRR - vzip.16 reg&_B, reg&_R @ BGRRBGRR BGBGBGBG BGRRBGRR - vsli.64 reg&_8888_L, reg&_8888_L, #24 @ BGRBGRRB BGBBGBGB - vsli.64 reg&_B, reg&_G, #48 @ BGRBGRBG - vsri.64 reg&_R, reg&_B, #8 @ GRBGRBGR - vsri.64 reg&_G, reg&_R, #8 @ RBGRBGRB - .endif -.elseif bpp == 16 - .if intlv - vshll.u8 reg&_565, reg&_R, #8 @ RRRrrRRR 00000000 - vshll.u8 TMP_Q0, reg&_G, #8 @ GGGgggGG 00000000 - vshll.u8 TMP_Q1, reg&_B, #8 @ BBBbbBBB 00000000 - vsri.16 reg&_565, TMP_Q0, #5 @ RRRrrGGG gggGG000 - vsri.16 reg&_565, TMP_Q1, #11 @ RRRrrGGG gggBBBbb - .else - vshr.u8 TMP_Q0, reg&_565, #3 @ 000RRRrr 000gggBB - vshrn.i16 reg&_G, reg&_565, #5 @ rrGGGggg - vshrn.i16 reg&_R, TMP_Q0, #5 @ RRRrr000 - vshl.i8 reg&_G, reg&_G, #2 @ GGGggg00 - vshl.i16 TMP_Q1, reg&_565, #3 @ rrGGGggg BBBbb000 - vsri.8 reg&_R, reg&_R, #5 @ RRRrrRRR - vmovn.i16 reg&_B, TMP_Q1 @ BBBbb000 - vsri.8 reg&_G, reg&_G, #6 @ GGGgggGG - vsri.8 reg&_B, reg&_B, #5 @ BBBbbBBB - .endif -.endif -.endm - -.macro ldst op, bpp, len, mem, reg, cvt, wb -.if bpp >= 31 - .if len == 8 - .if cvt - v&op&4.8 {reg&_B, reg&_G, reg&_R, reg&_A}, [mem&_ADDR]&wb - .else - v&op&1.32 {reg&_8888_L, reg&_8888_H}, [mem&_ADDR]&wb - .endif - .else - .if (op == st) && cvt - convert reg, bpp, 1 - .endif - .if len == 7 - v&op&1.32 {reg&_8888_L}, [mem&_ADDR]! - v&op&1.32 {reg&_R}, [mem&_ADDR]! - v&op&1.32 {reg&_A[0]}, [mem&_ADDR]! - .elseif len == 6 - v&op&1.32 {reg&_8888_L}, [mem&_ADDR]! - v&op&1.32 {reg&_R}, [mem&_ADDR]! - .elseif len == 5 - v&op&1.32 {reg&_8888_L}, [mem&_ADDR]! - v&op&1.32 {reg&_R[0]}, [mem&_ADDR]! - .elseif len == 4 - v&op&1.32 {reg&_8888_L}, [mem&_ADDR]&wb - .elseif len == 3 - v&op&1.32 {reg&_B}, [mem&_ADDR]! - v&op&1.32 {reg&_G[0]}, [mem&_ADDR]! - .elseif len == 2 - v&op&1.32 {reg&_B}, [mem&_ADDR]&wb - .elseif len == 1 - v&op&1.32 {reg&_B[0]}, [mem&_ADDR]&wb - .else - .error "[32bpp]len should be 1~8" - .endif - .if (op == ld) && cvt - convert reg, bpp, 0 - .endif - .if (wb&1) && (len != 4) && (len != 2) && (len != 1) - sub mem&_ADDR, #4*len - .endif - .endif -.elseif bpp == 24 - .if len == 8 - .if cvt - v&op&3.8 {reg&_B, reg&_G, reg&_R}, [mem&_ADDR]&wb - .else - v&op&1.8 {reg&_B, reg&_G, reg&_R}, [mem&_ADDR]&wb - .endif - .elseif (len < 8) && (len > 0) - .if cvt - v&op&3.8 {reg&_B[0], reg&_G[0], reg&_R[0]}, [mem&_ADDR]! - .if len > 1 - v&op&3.8 {reg&_B[1], reg&_G[1], reg&_R[1]}, [mem&_ADDR]! - .endif - .if len > 2 - v&op&3.8 {reg&_B[2], reg&_G[2], reg&_R[2]}, [mem&_ADDR]! - .endif - .if len > 3 - v&op&3.8 {reg&_B[3], reg&_G[3], reg&_R[3]}, [mem&_ADDR]! - .endif - .if len > 4 - v&op&3.8 {reg&_B[4], reg&_G[4], reg&_R[4]}, [mem&_ADDR]! - .endif - .if len > 5 - v&op&3.8 {reg&_B[5], reg&_G[5], reg&_R[5]}, [mem&_ADDR]! - .endif - .if len > 6 - v&op&3.8 {reg&_B[6], reg&_G[6], reg&_R[6]}, [mem&_ADDR]! - .endif - .if wb&1 - sub mem&_ADDR, #3*len - .endif - .else - .if len == 7 - v&op&1.32 {reg&_8888_L}, [mem&_ADDR]! - v&op&1.32 {reg&_R[0]}, [mem&_ADDR]! - v&op&1.8 {reg&_R[4]}, [mem&_ADDR]! - .elseif len == 6 - v&op&1.32 {reg&_8888_L}, [mem&_ADDR]! - v&op&1.16 {reg&_R[0]}, [mem&_ADDR]! - .elseif len == 5 - v&op&1.32 {reg&_B}, [mem&_ADDR]! - v&op&1.32 {reg&_G[0]}, [mem&_ADDR]! - v&op&1.16 {reg&_G[2]}, [mem&_ADDR]! - v&op&1.8 {reg&_G[6]}, [mem&_ADDR]! - .elseif len == 4 - v&op&1.32 {reg&_B}, [mem&_ADDR]! - v&op&1.32 {reg&_G[0]}, [mem&_ADDR]! - .elseif len == 3 - v&op&1.32 {reg&_B}, [mem&_ADDR]! - v&op&1.8 {reg&_G[0]}, [mem&_ADDR]! - .elseif len == 2 - v&op&1.32 {reg&_B[0]}, [mem&_ADDR]! - v&op&1.16 {reg&_B[2]}, [mem&_ADDR]! - .elseif len == 1 - v&op&1.16 {reg&_B[0]}, [mem&_ADDR]! - v&op&1.8 {reg&_B[2]}, [mem&_ADDR]! - .endif - .if wb&1 - sub mem&_ADDR, #3*len - .endif - .endif - .else - .error "[24bpp]len should be 1~8" - .endif -.elseif bpp == 16 - .if (op == st) && cvt - convert reg, bpp, 1 - .endif - .if len == 8 - v&op&1.16 {reg&_565}, [mem&_ADDR]&wb - .elseif len == 7 - v&op&1.16 {reg&_565_L}, [mem&_ADDR]! - v&op&1.32 {reg&_565_H[0]}, [mem&_ADDR]! - v&op&1.16 {reg&_565_H[2]}, [mem&_ADDR]! - .if wb&1 - sub mem&_ADDR, #14 - .endif - .elseif len == 6 - v&op&1.16 {reg&_565_L}, [mem&_ADDR]! - v&op&1.32 {reg&_565_H[0]}, [mem&_ADDR]! - .if wb&1 - sub mem&_ADDR, #12 - .endif - .elseif len == 5 - v&op&1.16 {reg&_565_L}, [mem&_ADDR]! - v&op&1.16 {reg&_565_H[0]}, [mem&_ADDR]! - .if wb&1 - sub mem&_ADDR, #10 - .endif - .elseif len == 4 - v&op&1.16 {reg&_565_L}, [mem&_ADDR]&wb - .elseif len == 3 - v&op&1.32 {reg&_565_L[0]}, [mem&_ADDR]! - v&op&1.16 {reg&_565_L[2]}, [mem&_ADDR]! - .if wb&1 - sub mem&_ADDR, #6 - .endif - .elseif len == 2 - v&op&1.32 {reg&_565_L[0]}, [mem&_ADDR]&wb - .elseif len == 1 - v&op&1.16 {reg&_565_L[0]}, [mem&_ADDR]&wb - .else - .error "[16bpp]len should be 1~8" - .endif - .if (op == ld) && cvt - convert reg, bpp, 0 - .endif -.elseif bpp == 8 - .if len == 8 - v&op&1.8 {reg&_A}, [mem&_ADDR]&wb - .elseif len == 7 - v&op&1.32 {reg&_A[0]}, [mem&_ADDR]! - v&op&1.16 {reg&_A[2]}, [mem&_ADDR]! - v&op&1.8 {reg&_A[6]}, [mem&_ADDR]! - .if wb&1 - sub mem&_ADDR, #7 - .endif - .elseif len == 6 - v&op&1.32 {reg&_A[0]}, [mem&_ADDR]! - v&op&1.16 {reg&_A[2]}, [mem&_ADDR]! - .if wb&1 - sub mem&_ADDR, #6 - .endif - .elseif len == 5 - v&op&1.32 {reg&_A[0]}, [mem&_ADDR]! - v&op&1.8 {reg&_A[4]}, [mem&_ADDR]! - .if wb&1 - sub mem&_ADDR, #5 - .endif - .elseif len == 4 - v&op&1.32 {reg&_A[0]}, [mem&_ADDR]&wb - .elseif len == 3 - v&op&1.16 {reg&_A[0]}, [mem&_ADDR]! - v&op&1.8 {reg&_A[2]}, [mem&_ADDR]! - .if wb&1 - sub mem&_ADDR, #3 - .endif - .elseif len == 2 - v&op&1.16 {reg&_A[0]}, [mem&_ADDR]&wb - .elseif len == 1 - v&op&1.8 {reg&_A[0]}, [mem&_ADDR]&wb - .else - .error "[8bpp]len should be 1~8" - .endif -.elseif (bpp == 0) && wb&1 - .if len == 8 - v&op&3.8 {reg&_B[], reg&_G[], reg&_R[]}, [mem&_ADDR] - .else - .error "[color]len should be 8" - .endif -.endif -.if (op == ld) && cvt && (bpp > 8) && (bpp < 32) - vmov.u8 reg&_A, #0xFF -.endif -.endm - -.macro premult alpha - vmull.u8 PREMULT_B, S_B, alpha - vmull.u8 PREMULT_G, S_G, alpha - vmull.u8 PREMULT_R, S_R, alpha -.endm - -.macro init src_bpp, dst_bpp, mask, opa - ldr DST_ADDR, [r0, #4] - ldr DST_W, [r0, #8] - ldr DST_H, [r0, #12] - ldr DST_STRIDE, [r0, #16] - ldr SRC_ADDR, [r0, #20] -.if src_bpp > 0 - ldr SRC_STRIDE, [r0, #24] -.endif -.if mask - ldr MASK_ADDR, [r0, #28] - ldr MASK_STRIDE, [r0, #32] - sub MASK_STRIDE, MASK_STRIDE, DST_W -.endif -.if opa - vld1.8 {OPA[]}, [r0] -.else - vmov.u8 OPA, #0xFF -.endif - - vmvn D_A, OPA -.if dst_bpp == 16 - sub DST_STRIDE, DST_STRIDE, DST_W, lsl #1 -.elseif dst_bpp == 24 - sub DST_STRIDE, DST_STRIDE, DST_W - sub DST_STRIDE, DST_STRIDE, DST_W, lsl #1 -.elseif dst_bpp >= 31 - sub DST_STRIDE, DST_STRIDE, DST_W, lsl #2 -.endif -.if src_bpp == 0 - .if mask || opa - ldst ld, src_bpp, 8, SRC, S, 1 - vmov.u8 S_A, #0xFF - premult OPA - .else - ldst ld, src_bpp, 8, SRC, D, 1 - vmov.u8 D_A, #0xFF - convert D, dst_bpp, 1 - .endif -.else -.if src_bpp == 16 - sub SRC_STRIDE, SRC_STRIDE, DST_W, lsl #1 -.elseif src_bpp == 24 - sub SRC_STRIDE, SRC_STRIDE, DST_W - sub SRC_STRIDE, SRC_STRIDE, DST_W, lsl #1 -.elseif src_bpp >= 31 - sub SRC_STRIDE, SRC_STRIDE, DST_W, lsl #2 -.endif -.endif - mvn FG_MASK, #0 - mvn BG_MASK, #0 -.endm - -@ input: M_A = 255 - fg.alpha -.macro calc_alpha len - vmov.u8 TMP_D0, #0xFD - vmvn D_A, D_A - vcge.u8 TMP_D1, S_A, TMP_D0 @ if (fg.alpha >= LV_OPA_MAX - vcge.u8 TMP_D2, D_A, TMP_D0 @ || bg.alpha <= LV_OPA_MIN) - vorr TMP_D2, TMP_D1 - vcge.u8 TMP_D3, M_A, TMP_D0 @ elseif (fg.alpha <= LV_OPA_MIN) - vmvn TMP_Q1, TMP_Q1 - vshrn.i16 TMP_D0, TMP_Q1, #4 - vmov FG_MASK, BG_MASK, TMP_D0 - cbz FG_MASK, 99f @ return fg; - vmull.u8 TMP_Q0, M_A, D_A @ D_A = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg.alpha) - vqrshrn.u16 M_A, TMP_Q0, #8 - vbif M_A, D_A, TMP_D3 @ insert original D_A when fg.alpha <= LV_OPA_MIN - vmvn D_A, M_A - cbz BG_MASK, 99f @ return bg; - vmov.u8 TMP_D2, #0xFF - vmovl.u8 TMP_Q0, D_A - .if len > 4 - vmovl.u16 S_565, TMP_D1 - .endif - vmovl.u16 TMP_Q0, TMP_D0 - vmull.u8 TMP_Q1, S_A, TMP_D2 - vcvt.f32.u32 TMP_Q0, TMP_Q0 - .if len > 4 - vmovl.u16 D_565, TMP_D3 - vcvt.f32.u32 S_565, S_565 - .endif - vmovl.u16 TMP_Q1, TMP_D2 - vrecpe.f32 TMP_Q0, TMP_Q0 - vcvt.f32.u32 TMP_Q1, TMP_Q1 - .if len > 4 - vcvt.f32.u32 D_565, D_565 - vrecpe.f32 S_565, S_565 - .endif - vmul.f32 TMP_Q0, TMP_Q0, TMP_Q1 - .if len > 4 - vmul.f32 S_565, S_565, D_565 - .endif - vcvt.u32.f32 TMP_Q0, TMP_Q0 - .if len > 4 - vcvt.u32.f32 S_565, S_565 - .endif - vmovn.u32 TMP_D0, TMP_Q0 - .if len > 4 - vmovn.u32 TMP_D1, S_565 - .endif - vmovn.u16 TMP_D0, TMP_Q0 - premult TMP_D0 - vmvn M_A, TMP_D0 -99: -.endm - -.macro blend mode, dst_bpp -.if dst_bpp == 32 - vmov TMP_D0, FG_MASK, BG_MASK - vmovl.s8 TMP_Q0, TMP_D0 - vsli.8 TMP_Q0, TMP_Q0, #4 - cbz FG_MASK, 98f -.endif -.if mode == normal -.if dst_bpp == 32 - cbz BG_MASK, 97f - mvns BG_MASK, BG_MASK - beq 96f - vmov S_565_L, D_B - vmov S_565_H, D_G - vmov D_565_L, D_R -.endif -96: - vmlal.u8 PREMULT_B, D_B, M_A - vmlal.u8 PREMULT_G, D_G, M_A - vmlal.u8 PREMULT_R, D_R, M_A - vqrshrn.u16 D_B, PREMULT_B, #8 - vqrshrn.u16 D_G, PREMULT_G, #8 - vqrshrn.u16 D_R, PREMULT_R, #8 -.if dst_bpp == 32 - beq 97f - vbif D_B, S_565_L, TMP_D1 - vbif D_G, S_565_H, TMP_D1 - vbif D_R, D_565_L, TMP_D1 -97: - mvns FG_MASK, FG_MASK - beq 99f -.endif -.else - .error "blend mode is unsupported" -.endif -.if dst_bpp == 32 -98: - vbif D_B, S_B, TMP_D0 - vbif D_G, S_G, TMP_D0 - vbif D_R, S_R, TMP_D0 - vbif D_A, S_A, TMP_D0 -99: -.endif -.endm - -.macro process len, src_bpp, dst_bpp, mask, opa, mode -.if (src_bpp < 32) && (mask == 0) && (opa == 0) -@ no blend - .if src_bpp == 0 || src_bpp == dst_bpp - ldst ld, src_bpp, len, SRC, D, 0, ! - ldst st, dst_bpp, len, DST, D, 0, ! - .else - ldst ld, src_bpp, len, SRC, D, 1, ! - ldst st, dst_bpp, len, DST, D, 1, ! - .endif -.elseif src_bpp < 32 -@ no src_a - .if src_bpp > 0 - ldst ld, src_bpp, len, SRC, S, 1, ! - .endif - ldst ld, dst_bpp, len, DST, D, 1 - .if mask - ldst ld, 8, len, MASK, S, 1, ! - .if opa - vmull.u8 TMP_Q0, S_A, OPA - vqrshrn.u16 S_A, TMP_Q0, #8 - .endif - vmvn M_A, S_A - .if dst_bpp < 32 - premult S_A - .else - calc_alpha len - .endif - .else - vmvn M_A, OPA - .if dst_bpp < 32 - premult OPA - .else - vmov S_A, OPA - calc_alpha len - .endif - .endif - blend mode, dst_bpp - ldst st, dst_bpp, len, DST, D, 1, ! -.else -@ src_a (+mask) (+opa) - ldst ld, src_bpp, len, SRC, S, 1, ! - ldst ld, dst_bpp, len, DST, D, 1 - .if mask == 0 - .if opa - vmull.u8 TMP_Q0, S_A, OPA - vqrshrn.u16 S_A, TMP_Q0, #8 - .endif - .else - ldst ld, 8, len, MASK, M, 1, ! - vmull.u8 TMP_Q0, S_A, M_A - vqrshrn.u16 S_A, TMP_Q0, #8 - .if opa - vmull.u8 TMP_Q0, S_A, OPA - vqrshrn.u16 S_A, TMP_Q0, #8 - .endif - .endif - vmvn M_A, S_A - .if dst_bpp < 32 - premult S_A - .else - calc_alpha len - .endif - blend mode, dst_bpp - ldst st, dst_bpp, len, DST, D, 1, ! -.endif -.endm - -.macro tail src_bpp, dst_bpp, mask, opa, mode - tst DST_W, #4 - beq 3f - tst DST_W, #2 - beq 5f - tst DST_W, #1 - beq 6f - process 7, src_bpp, dst_bpp, mask, opa, mode - b 0f -6: - process 6, src_bpp, dst_bpp, mask, opa, mode - b 0f -5: - tst DST_W, #1 - beq 4f - process 5, src_bpp, dst_bpp, mask, opa, mode - b 0f -4: - process 4, src_bpp, dst_bpp, mask, opa, mode - b 0f -3: - tst DST_W, #2 - beq 1f - tst DST_W, #1 - beq 2f - process 3, src_bpp, dst_bpp, mask, opa, mode - b 0f -2: - process 2, src_bpp, dst_bpp, mask, opa, mode - b 0f -1: - process 1, src_bpp, dst_bpp, mask, opa, mode -0: -.endm - -.macro next src_bpp, mask - add DST_ADDR, DST_ADDR, DST_STRIDE -.if src_bpp - add SRC_ADDR, SRC_ADDR, SRC_STRIDE -.endif -.if mask - add MASK_ADDR, MASK_ADDR, MASK_STRIDE -.endif -.endm - -.macro enter - push {r4-r11, lr} -.endm - -.macro exit - pop {r4-r11, pc} -.endm - -.macro preload mem, bpp -.if bpp >= 31 - pld [mem&_ADDR, DST_W, lsl #2] -.elseif bpp == 24 - add W, DST_W, DST_W, lsl #1 - pld [mem&_ADDR, W] -.elseif bpp == 16 - pld [mem&_ADDR, DST_W, lsl #1] -.elseif bpp == 8 - pld [mem&_ADDR, DST_W] -.endif -.endm - -.macro blender src_bpp, dst_bpp, mask, opa, mode - enter - init src_bpp, dst_bpp, mask, opa - movs H, DST_H - beq 0f - preload SRC, src_bpp -.if mask || opa || (src_bpp == 32) - preload DST, dst_bpp -.endif - subs W, DST_W, #8 - blt 7f -9: - process 8, src_bpp, dst_bpp, mask, opa, mode - subs W, W, #8 - bge 9b - tst DST_W, #7 - beq 8f - tail src_bpp, dst_bpp, mask, opa, mode -8: - next src_bpp, mask - preload SRC, src_bpp -.if mask || opa || (src_bpp == 32) - preload DST, dst_bpp -.endif - sub W, DST_W, #8 - subs H, H, #1 - bgt 9b - exit -7: - tail src_bpp, dst_bpp, mask, opa, mode - next src_bpp, mask - subs H, H, #1 - bgt 7b - exit -.endm - -.macro export name, src_bpp, dst_bpp, mask, opa, mode -.thumb_func -.func name -.global name -.hidden name -name&: - blender src_bpp, dst_bpp, mask, opa, mode -.endfunc -.endm - -.macro export_set src, dst, src_bpp, dst_bpp, mode -.if src == color - export _lv_&src&_blend_to_&dst&_neon, src_bpp, dst_bpp, 0, 0, mode - export _lv_&src&_blend_to_&dst&_with_opa_neon, src_bpp, dst_bpp, 0, 1, mode - export _lv_&src&_blend_to_&dst&_with_mask_neon, src_bpp, dst_bpp, 1, 0, mode - export _lv_&src&_blend_to_&dst&_mix_mask_opa_neon, src_bpp, dst_bpp, 1, 1, mode -.else - export _lv_&src&_blend_&mode&_to_&dst&_neon, src_bpp, dst_bpp, 0, 0, mode - export _lv_&src&_blend_&mode&_to_&dst&_with_opa_neon, src_bpp, dst_bpp, 0, 1, mode - export _lv_&src&_blend_&mode&_to_&dst&_with_mask_neon, src_bpp, dst_bpp, 1, 0, mode - export _lv_&src&_blend_&mode&_to_&dst&_mix_mask_opa_neon, src_bpp, dst_bpp, 1, 1, mode -.endif -.endm - -export_set color, rgb565, 0, 16, normal -export_set rgb565, rgb565, 16, 16, normal -export_set rgb888, rgb565, 24, 16, normal -export_set xrgb8888, rgb565, 31, 16, normal -export_set argb8888, rgb565, 32, 16, normal -export_set color, rgb888, 0, 24, normal -export_set rgb565, rgb888, 16, 24, normal -export_set rgb888, rgb888, 24, 24, normal -export_set xrgb8888, rgb888, 31, 24, normal -export_set argb8888, rgb888, 32, 24, normal -export_set color, xrgb8888, 0, 31, normal -export_set rgb565, xrgb8888, 16, 31, normal -export_set rgb888, xrgb8888, 24, 31, normal -export_set xrgb8888, xrgb8888, 31, 31, normal -export_set argb8888, xrgb8888, 32, 31, normal -export_set color, argb8888, 0, 32, normal -export_set rgb565, argb8888, 16, 32, normal -export_set rgb888, argb8888, 24, 32, normal -export_set xrgb8888, argb8888, 31, 32, normal -export_set argb8888, argb8888, 32, 32, normal - -#endif /*LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/neon/lv_blend_neon.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/neon/lv_blend_neon.h deleted file mode 100644 index fd52647..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/blend/neon/lv_blend_neon.h +++ /dev/null @@ -1,1301 +0,0 @@ -/** - * @file lv_blend_neon.h - * - */ - -#ifndef LV_BLEND_NEON_H -#define LV_BLEND_NEON_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../../../lv_conf_internal.h" - -#ifdef LV_DRAW_SW_NEON_CUSTOM_INCLUDE -#include LV_DRAW_SW_NEON_CUSTOM_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ -#if !defined(__ASSEMBLY__) - -#if __GNUC__ >= 4 -#define LVGL_HIDDEN __attribute__((visibility("hidden"))) -#else -#define LVGL_HIDDEN -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) \ - lv_color_blend_to_rgb565_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) \ - lv_color_blend_to_rgb565_with_opa_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) \ - lv_color_blend_to_rgb565_with_mask_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) \ - lv_color_blend_to_rgb565_mix_mask_opa_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) \ - lv_rgb565_blend_normal_to_rgb565_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ - lv_rgb565_blend_normal_to_rgb565_with_opa_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ - lv_rgb565_blend_normal_to_rgb565_with_mask_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ - lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_rgb565_neon(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_rgb565_with_opa_neon(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_rgb565_with_mask_neon(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) \ - lv_argb8888_blend_normal_to_rgb565_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ - lv_argb8888_blend_normal_to_rgb565_with_opa_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ - lv_argb8888_blend_normal_to_rgb565_with_mask_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ - lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dst_px_size) \ - lv_color_blend_to_rgb888_neon(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - lv_color_blend_to_rgb888_with_opa_neon(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - lv_color_blend_to_rgb888_with_mask_neon(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - lv_color_blend_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ - lv_rgb565_blend_normal_to_rgb888_neon(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - lv_rgb565_blend_normal_to_rgb888_with_opa_neon(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - lv_rgb565_blend_normal_to_rgb888_with_mask_neon(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size, src_px_size) \ - lv_rgb888_blend_normal_to_rgb888_neon(dsc, dst_px_size, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size, src_px_size) \ - lv_rgb888_blend_normal_to_rgb888_with_opa_neon(dsc, dst_px_size, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size, src_px_size) \ - lv_rgb888_blend_normal_to_rgb888_with_mask_neon(dsc, dst_px_size, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size, src_px_size) \ - lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size, src_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ - lv_argb8888_blend_normal_to_rgb888_neon(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - lv_argb8888_blend_normal_to_rgb888_with_opa_neon(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - lv_argb8888_blend_normal_to_rgb888_with_mask_neon(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888 -#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(dsc) \ - lv_color_blend_to_argb8888_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(dsc) \ - lv_color_blend_to_argb8888_with_opa_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK -#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(dsc) \ - lv_color_blend_to_argb8888_with_mask_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA -#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(dsc) \ - lv_color_blend_to_argb8888_mix_mask_opa_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888 -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc) \ - lv_rgb565_blend_normal_to_argb8888_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ - lv_rgb565_blend_normal_to_argb8888_with_opa_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ - lv_rgb565_blend_normal_to_argb8888_with_mask_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA -#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ - lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888 -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_argb8888_neon(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_argb8888_with_opa_neon(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_argb8888_with_mask_neon(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA -#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc, src_px_size) \ - lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon(dsc, src_px_size) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888 -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(dsc) \ - lv_argb8888_blend_normal_to_argb8888_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ - lv_argb8888_blend_normal_to_argb8888_with_opa_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ - lv_argb8888_blend_normal_to_argb8888_with_mask_neon(dsc) -#endif - -#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA -#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ - lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neon(dsc) -#endif - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - uint32_t opa; - void * dst_buf; - uint32_t dst_w; - uint32_t dst_h; - uint32_t dst_stride; - const void * src_buf; - uint32_t src_stride; - const lv_opa_t * mask_buf; - uint32_t mask_stride; -} asm_dsc_t; -/********************** - * GLOBAL PROTOTYPES - **********************/ - -extern LVGL_HIDDEN void _lv_color_blend_to_rgb565_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb565_neon(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color - }; - - _lv_color_blend_to_rgb565_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_color_blend_to_rgb565_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb565_with_opa_neon(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color - }; - _lv_color_blend_to_rgb565_with_opa_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_color_blend_to_rgb565_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb565_with_mask_neon(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - _lv_color_blend_to_rgb565_with_mask_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_color_blend_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb565_mix_mask_opa_neon(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - _lv_color_blend_to_rgb565_mix_mask_opa_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb565_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - _lv_rgb565_blend_normal_to_rgb565_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb565_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - _lv_rgb565_blend_normal_to_rgb565_with_opa_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb565_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - _lv_rgb565_blend_normal_to_rgb565_with_mask_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb565_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb565_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_rgb565_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_rgb565_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb565_with_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb565_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_rgb565_with_opa_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_rgb565_with_opa_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb565_with_mask_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb565_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_rgb565_with_mask_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_rgb565_with_mask_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb565_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - _lv_argb8888_blend_normal_to_rgb565_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb565_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - _lv_argb8888_blend_normal_to_rgb565_with_opa_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb565_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - _lv_argb8888_blend_normal_to_rgb565_with_mask_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_color_blend_to_rgb888_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_color_blend_to_xrgb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb888_neon(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color - }; - if(dst_px_size == 3) { - _lv_color_blend_to_rgb888_neon(&asm_dsc); - } - else { - _lv_color_blend_to_xrgb8888_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_color_blend_to_rgb888_with_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_color_blend_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb888_with_opa_neon(lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color - }; - if(dst_px_size == 3) { - _lv_color_blend_to_rgb888_with_opa_neon(&asm_dsc); - } - else { - _lv_color_blend_to_xrgb8888_with_opa_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_color_blend_to_rgb888_with_mask_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_color_blend_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb888_with_mask_neon(lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - _lv_color_blend_to_rgb888_with_mask_neon(&asm_dsc); - } - else { - _lv_color_blend_to_xrgb8888_with_mask_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_color_blend_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_color_blend_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_rgb888_mix_mask_opa_neon(lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - _lv_color_blend_to_rgb888_mix_mask_opa_neon(&asm_dsc); - } - else { - _lv_color_blend_to_xrgb8888_mix_mask_opa_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb888_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_xrgb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(dst_px_size == 3) { - _lv_rgb565_blend_normal_to_rgb888_neon(&asm_dsc); - } - else { - _lv_rgb565_blend_normal_to_xrgb8888_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb888_with_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(dst_px_size == 3) { - _lv_rgb565_blend_normal_to_rgb888_with_opa_neon(&asm_dsc); - } - else { - _lv_rgb565_blend_normal_to_xrgb8888_with_opa_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb888_with_mask_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - _lv_rgb565_blend_normal_to_rgb888_with_mask_neon(&asm_dsc); - } - else { - _lv_rgb565_blend_normal_to_xrgb8888_with_mask_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_neon(&asm_dsc); - } - else { - _lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb888_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_xrgb8888_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb888_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_xrgb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(dst_px_size == 3) { - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_rgb888_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_rgb888_neon(&asm_dsc); - } - } - else { - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_xrgb8888_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_xrgb8888_neon(&asm_dsc); - } - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb888_with_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb888_with_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(dst_px_size == 3) { - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_rgb888_with_opa_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_rgb888_with_opa_neon(&asm_dsc); - } - } - else { - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_xrgb8888_with_opa_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_neon(&asm_dsc); - } - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb888_with_mask_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb888_with_mask_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_rgb888_with_mask_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_rgb888_with_mask_neon(&asm_dsc); - } - } - else { - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_xrgb8888_with_mask_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_neon(&asm_dsc); - } - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_neon(&asm_dsc); - } - } - else { - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_neon(&asm_dsc); - } - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb888_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_xrgb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(dst_px_size == 3) { - _lv_argb8888_blend_normal_to_rgb888_neon(&asm_dsc); - } - else { - _lv_argb8888_blend_normal_to_xrgb8888_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb888_with_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(dst_px_size == 3) { - _lv_argb8888_blend_normal_to_rgb888_with_opa_neon(&asm_dsc); - } - else { - _lv_argb8888_blend_normal_to_xrgb8888_with_opa_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb888_with_mask_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - _lv_argb8888_blend_normal_to_rgb888_with_mask_neon(&asm_dsc); - } - else { - _lv_argb8888_blend_normal_to_xrgb8888_with_mask_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(dst_px_size == 3) { - _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon(&asm_dsc); - } - else { - _lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_color_blend_to_argb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_argb8888_neon(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color - }; - - _lv_color_blend_to_argb8888_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_color_blend_to_argb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_argb8888_with_opa_neon(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color - }; - _lv_color_blend_to_argb8888_with_opa_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_color_blend_to_argb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_argb8888_with_mask_neon(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - _lv_color_blend_to_argb8888_with_mask_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_color_blend_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_color_blend_to_argb8888_mix_mask_opa_neon(lv_draw_sw_blend_fill_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = &dsc->color, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - _lv_color_blend_to_argb8888_mix_mask_opa_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_argb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - _lv_rgb565_blend_normal_to_argb8888_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_argb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - _lv_rgb565_blend_normal_to_argb8888_with_opa_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_argb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - _lv_rgb565_blend_normal_to_argb8888_with_mask_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_argb8888_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_argb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_argb8888_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_argb8888_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_argb8888_with_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_argb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_argb8888_with_opa_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_argb8888_with_opa_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_argb8888_with_mask_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_argb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_argb8888_with_mask_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_argb8888_with_mask_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - if(src_px_size == 3) { - _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon(&asm_dsc); - } - else { - _lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_neon(&asm_dsc); - } - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_argb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - _lv_argb8888_blend_normal_to_argb8888_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_argb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride - }; - _lv_argb8888_blend_normal_to_argb8888_with_opa_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_argb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - _lv_argb8888_blend_normal_to_argb8888_with_mask_neon(&asm_dsc); - return LV_RESULT_OK; -} - -extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) -{ - asm_dsc_t asm_dsc = { - .opa = dsc->opa, - .dst_buf = dsc->dest_buf, - .dst_w = dsc->dest_w, - .dst_h = dsc->dest_h, - .dst_stride = dsc->dest_stride, - .src_buf = dsc->src_buf, - .src_stride = dsc->src_stride, - .mask_buf = dsc->mask_buf, - .mask_stride = dsc->mask_stride - }; - _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neon(&asm_dsc); - return LV_RESULT_OK; -} - -#endif /* !defined(__ASSEMBLY__) */ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_BLEND_NEON_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw.c deleted file mode 100644 index 4e144b1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw.c +++ /dev/null @@ -1,834 +0,0 @@ -/** - * @file lv_draw_sw.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_sw_private.h" -#include "../lv_draw_private.h" -#if LV_USE_DRAW_SW - -#include "../../core/lv_refr.h" -#include "../../display/lv_display_private.h" -#include "../../stdlib/lv_string.h" -#include "../../core/lv_global.h" -#include "../../misc/lv_area_private.h" - -#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG - #if LV_USE_THORVG_EXTERNAL - #include - #else - #include "../../libs/thorvg/thorvg_capi.h" - #endif -#endif - -#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM - #include "arm2d/lv_draw_sw_helium.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM - #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE -#endif - -#if LV_DRAW_SW_DRAW_UNIT_CNT > 1 && LV_USE_OS == LV_OS_NONE - #error "OS support is required when more than one SW rendering units are enabled" -#endif - -/********************* - * DEFINES - *********************/ -#define DRAW_UNIT_ID_SW 1 - -#ifndef LV_DRAW_SW_RGB565_SWAP - #define LV_DRAW_SW_RGB565_SWAP(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ROTATE90_ARGB8888 - #define LV_DRAW_SW_ROTATE90_ARGB8888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ROTATE180_ARGB8888 - #define LV_DRAW_SW_ROTATE180_ARGB8888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ROTATE270_ARGB8888 - #define LV_DRAW_SW_ROTATE270_ARGB8888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ROTATE90_RGB888 - #define LV_DRAW_SW_ROTATE90_RGB888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ROTATE180_RGB888 - #define LV_DRAW_SW_ROTATE180_RGB888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ROTATE270_RGB888 - #define LV_DRAW_SW_ROTATE270_RGB888(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ROTATE90_RGB565 - #define LV_DRAW_SW_ROTATE90_RGB565(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ROTATE180_RGB565 - #define LV_DRAW_SW_ROTATE180_RGB565(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ROTATE270_RGB565 - #define LV_DRAW_SW_ROTATE270_RGB565(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ROTATE90_L8 - #define LV_DRAW_SW_ROTATE90_L8(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ROTATE180_L8 - #define LV_DRAW_SW_ROTATE180_L8(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_ROTATE270_L8 - #define LV_DRAW_SW_ROTATE270_L8(...) LV_RESULT_INVALID -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -#if LV_USE_OS - static void render_thread_cb(void * ptr); -#endif - -static void execute_drawing(lv_draw_sw_unit_t * u); - -static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); -static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); -static int32_t lv_draw_sw_delete(lv_draw_unit_t * draw_unit); - -#if LV_DRAW_SW_SUPPORT_ARGB8888 -static void rotate90_argb8888(const uint32_t * src, uint32_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, - int32_t dst_stride); -static void rotate180_argb8888(const uint32_t * src, uint32_t * dst, int32_t width, int32_t height, int32_t src_stride, - int32_t dest_stride); -static void rotate270_argb8888(const uint32_t * src, uint32_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, - int32_t dst_stride); -#endif -#if LV_DRAW_SW_SUPPORT_RGB888 -static void rotate90_rgb888(const uint8_t * src, uint8_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, - int32_t dst_stride); -static void rotate180_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, - int32_t dest_stride); -static void rotate270_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, - int32_t dst_stride); -#endif -#if LV_DRAW_SW_SUPPORT_RGB565 -static void rotate90_rgb565(const uint16_t * src, uint16_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, - int32_t dst_stride); -static void rotate180_rgb565(const uint16_t * src, uint16_t * dst, int32_t width, int32_t height, int32_t src_stride, - int32_t dest_stride); -static void rotate270_rgb565(const uint16_t * src, uint16_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, - int32_t dst_stride); -#endif - -#if LV_DRAW_SW_SUPPORT_L8 - -static void rotate90_l8(const uint8_t * src, uint8_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, - int32_t dst_stride); -static void rotate180_l8(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, - int32_t dest_stride); -static void rotate270_l8(const uint8_t * src, uint8_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, - int32_t dst_stride); -#endif -/********************** - * STATIC VARIABLES - **********************/ -#define _draw_info LV_GLOBAL_DEFAULT()->draw_info - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_sw_init(void) -{ - -#if LV_DRAW_SW_COMPLEX == 1 - lv_draw_sw_mask_init(); -#endif - - uint32_t i; - for(i = 0; i < LV_DRAW_SW_DRAW_UNIT_CNT; i++) { - lv_draw_sw_unit_t * draw_sw_unit = lv_draw_create_unit(sizeof(lv_draw_sw_unit_t)); - draw_sw_unit->base_unit.dispatch_cb = dispatch; - draw_sw_unit->base_unit.evaluate_cb = evaluate; - draw_sw_unit->idx = i; - draw_sw_unit->base_unit.delete_cb = LV_USE_OS ? lv_draw_sw_delete : NULL; - -#if LV_USE_OS - lv_thread_init(&draw_sw_unit->thread, LV_THREAD_PRIO_HIGH, render_thread_cb, LV_DRAW_THREAD_STACK_SIZE, draw_sw_unit); -#endif - } - -#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG - tvg_engine_init(TVG_ENGINE_SW, 0); -#endif -} - -void lv_draw_sw_deinit(void) -{ -#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG - tvg_engine_term(TVG_ENGINE_SW); -#endif - -#if LV_DRAW_SW_COMPLEX == 1 - lv_draw_sw_mask_deinit(); -#endif -} - -static int32_t lv_draw_sw_delete(lv_draw_unit_t * draw_unit) -{ -#if LV_USE_OS - lv_draw_sw_unit_t * draw_sw_unit = (lv_draw_sw_unit_t *) draw_unit; - - LV_LOG_INFO("cancel software rendering thread"); - draw_sw_unit->exit_status = true; - - if(draw_sw_unit->inited) { - lv_thread_sync_signal(&draw_sw_unit->sync); - } - - return lv_thread_delete(&draw_sw_unit->thread); -#else - LV_UNUSED(draw_unit); - return 0; -#endif -} - -void lv_draw_sw_rgb565_swap(void * buf, uint32_t buf_size_px) -{ - if(LV_DRAW_SW_RGB565_SWAP(buf, buf_size_px) == LV_RESULT_OK) return; - - uint32_t u32_cnt = buf_size_px / 2; - uint16_t * buf16 = buf; - uint32_t * buf32 = buf; - - while(u32_cnt >= 8) { - buf32[0] = ((buf32[0] & 0xff00ff00) >> 8) | ((buf32[0] & 0x00ff00ff) << 8); - buf32[1] = ((buf32[1] & 0xff00ff00) >> 8) | ((buf32[1] & 0x00ff00ff) << 8); - buf32[2] = ((buf32[2] & 0xff00ff00) >> 8) | ((buf32[2] & 0x00ff00ff) << 8); - buf32[3] = ((buf32[3] & 0xff00ff00) >> 8) | ((buf32[3] & 0x00ff00ff) << 8); - buf32[4] = ((buf32[4] & 0xff00ff00) >> 8) | ((buf32[4] & 0x00ff00ff) << 8); - buf32[5] = ((buf32[5] & 0xff00ff00) >> 8) | ((buf32[5] & 0x00ff00ff) << 8); - buf32[6] = ((buf32[6] & 0xff00ff00) >> 8) | ((buf32[6] & 0x00ff00ff) << 8); - buf32[7] = ((buf32[7] & 0xff00ff00) >> 8) | ((buf32[7] & 0x00ff00ff) << 8); - buf32 += 8; - u32_cnt -= 8; - } - - while(u32_cnt) { - *buf32 = ((*buf32 & 0xff00ff00) >> 8) | ((*buf32 & 0x00ff00ff) << 8); - buf32++; - u32_cnt--; - } - - if(buf_size_px & 0x1) { - uint32_t e = buf_size_px - 1; - buf16[e] = ((buf16[e] & 0xff00) >> 8) | ((buf16[e] & 0x00ff) << 8); - } - -} - -void lv_draw_sw_i1_invert(void * buf, uint32_t buf_size) -{ - if(buf == NULL) return; - - uint8_t * byte_buf = (uint8_t *)buf; - uint32_t i; - - /*Make the buffer aligned*/ - while(((uintptr_t)(byte_buf) & (sizeof(int) - 1)) && buf_size > 0) { - *byte_buf = ~(*byte_buf); - byte_buf++; - buf_size--; - } - - if(buf_size >= sizeof(uint32_t)) { - uint32_t * aligned_addr = (uint32_t *)byte_buf; - uint32_t word_count = buf_size / 4; - - for(i = 0; i < word_count; ++i) { - aligned_addr[i] = ~aligned_addr[i]; - } - - byte_buf = (uint8_t *)(aligned_addr + word_count); - buf_size = buf_size % sizeof(uint32_t); - } - - for(i = 0; i < buf_size; ++i) { - byte_buf[i] = ~byte_buf[i]; - } -} - -void lv_draw_sw_rotate(const void * src, void * dest, int32_t src_width, int32_t src_height, int32_t src_stride, - int32_t dest_stride, lv_display_rotation_t rotation, lv_color_format_t color_format) -{ - if(rotation == LV_DISPLAY_ROTATION_90) { - switch(color_format) { -#if LV_DRAW_SW_SUPPORT_L8 - case LV_COLOR_FORMAT_L8: - rotate90_l8(src, dest, src_width, src_height, src_stride, dest_stride); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB565 - case LV_COLOR_FORMAT_RGB565: - rotate90_rgb565(src, dest, src_width, src_height, src_stride, dest_stride); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB888 - case LV_COLOR_FORMAT_RGB888: - rotate90_rgb888(src, dest, src_width, src_height, src_stride, dest_stride); - break; -#endif -#if LV_DRAW_SW_SUPPORT_ARGB8888 || LV_DRAW_SW_SUPPORT_XRGB8888 - case LV_COLOR_FORMAT_XRGB8888: - case LV_COLOR_FORMAT_ARGB8888: - rotate90_argb8888(src, dest, src_width, src_height, src_stride, dest_stride); - break; -#endif - default: - break; - } - - return; - } - - if(rotation == LV_DISPLAY_ROTATION_180) { - switch(color_format) { -#if LV_DRAW_SW_SUPPORT_L8 - case LV_COLOR_FORMAT_L8: - rotate180_l8(src, dest, src_width, src_height, src_stride, dest_stride); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB565 - case LV_COLOR_FORMAT_RGB565: - rotate180_rgb565(src, dest, src_width, src_height, src_stride, dest_stride); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB888 - case LV_COLOR_FORMAT_RGB888: - rotate180_rgb888(src, dest, src_width, src_height, src_stride, dest_stride); - break; -#endif -#if LV_DRAW_SW_SUPPORT_ARGB8888 || LV_DRAW_SW_SUPPORT_XRGB8888 - case LV_COLOR_FORMAT_XRGB8888: - case LV_COLOR_FORMAT_ARGB8888: - rotate180_argb8888(src, dest, src_width, src_height, src_stride, dest_stride); - break; -#endif - default: - break; - } - - return; - } - - if(rotation == LV_DISPLAY_ROTATION_270) { - switch(color_format) { -#if LV_DRAW_SW_SUPPORT_L8 - case LV_COLOR_FORMAT_L8: - rotate270_l8(src, dest, src_width, src_height, src_stride, dest_stride); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB565 - case LV_COLOR_FORMAT_RGB565: - rotate270_rgb565(src, dest, src_width, src_height, src_stride, dest_stride); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB888 - case LV_COLOR_FORMAT_RGB888: - rotate270_rgb888(src, dest, src_width, src_height, src_stride, dest_stride); - break; -#endif -#if LV_DRAW_SW_SUPPORT_ARGB8888 || LV_DRAW_SW_SUPPORT_XRGB8888 - case LV_COLOR_FORMAT_XRGB8888: - case LV_COLOR_FORMAT_ARGB8888: - rotate270_argb8888(src, dest, src_width, src_height, src_stride, dest_stride); - break; -#endif - default: - break; - } - - return; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ -static inline void execute_drawing_unit(lv_draw_sw_unit_t * u) -{ - execute_drawing(u); - - u->task_act->state = LV_DRAW_TASK_STATE_READY; - u->task_act = NULL; - - /*The draw unit is free now. Request a new dispatching as it can get a new task*/ - lv_draw_dispatch_request(); -} - -static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) -{ - LV_UNUSED(draw_unit); - - switch(task->type) { - case LV_DRAW_TASK_TYPE_IMAGE: - case LV_DRAW_TASK_TYPE_LAYER: { - lv_draw_image_dsc_t * draw_dsc = task->draw_dsc; - - /* not support skew */ - if(draw_dsc->skew_x != 0 || draw_dsc->skew_y != 0) { - return 0; - } - - bool transformed = draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || - draw_dsc->scale_y != LV_SCALE_NONE ? true : false; - - bool masked = draw_dsc->bitmap_mask_src != NULL; - if(masked && transformed) return 0; - - lv_color_format_t cf = draw_dsc->header.cf; - if(masked && (cf == LV_COLOR_FORMAT_A8 || cf == LV_COLOR_FORMAT_RGB565A8)) { - return 0; - } - } - break; - default: - break; - } - - if(task->preference_score >= 100) { - task->preference_score = 100; - task->preferred_draw_unit_id = DRAW_UNIT_ID_SW; - } - - return 0; -} - -static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) -{ - LV_PROFILER_BEGIN; - lv_draw_sw_unit_t * draw_sw_unit = (lv_draw_sw_unit_t *) draw_unit; - - /*Return immediately if it's busy with draw task*/ - if(draw_sw_unit->task_act) { - LV_PROFILER_END; - return 0; - } - - lv_draw_task_t * t = NULL; - t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_SW); - if(t == NULL) { - LV_PROFILER_END; - return LV_DRAW_UNIT_IDLE; /*Couldn't start rendering*/ - } - - void * buf = lv_draw_layer_alloc_buf(layer); - if(buf == NULL) { - LV_PROFILER_END; - return LV_DRAW_UNIT_IDLE; /*Couldn't start rendering*/ - } - - t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; - draw_sw_unit->base_unit.target_layer = layer; - draw_sw_unit->base_unit.clip_area = &t->clip_area; - draw_sw_unit->task_act = t; - -#if LV_USE_OS - /*Let the render thread work*/ - if(draw_sw_unit->inited) lv_thread_sync_signal(&draw_sw_unit->sync); -#else - execute_drawing_unit(draw_sw_unit); -#endif - LV_PROFILER_END; - return 1; -} - -#if LV_USE_OS -static void render_thread_cb(void * ptr) -{ - lv_draw_sw_unit_t * u = ptr; - - lv_thread_sync_init(&u->sync); - u->inited = true; - - while(1) { - while(u->task_act == NULL) { - if(u->exit_status) { - break; - } - lv_thread_sync_wait(&u->sync); - } - - if(u->exit_status) { - LV_LOG_INFO("ready to exit software rendering thread"); - break; - } - - execute_drawing_unit(u); - } - - u->inited = false; - lv_thread_sync_delete(&u->sync); - LV_LOG_INFO("exit software rendering thread"); -} -#endif - -static void execute_drawing(lv_draw_sw_unit_t * u) -{ - LV_PROFILER_BEGIN; - /*Render the draw task*/ - lv_draw_task_t * t = u->task_act; - switch(t->type) { - case LV_DRAW_TASK_TYPE_FILL: - lv_draw_sw_fill((lv_draw_unit_t *)u, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_BORDER: - lv_draw_sw_border((lv_draw_unit_t *)u, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_BOX_SHADOW: - lv_draw_sw_box_shadow((lv_draw_unit_t *)u, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_LABEL: - lv_draw_sw_label((lv_draw_unit_t *)u, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_IMAGE: - lv_draw_sw_image((lv_draw_unit_t *)u, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_ARC: - lv_draw_sw_arc((lv_draw_unit_t *)u, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_LINE: - lv_draw_sw_line((lv_draw_unit_t *)u, t->draw_dsc); - break; - case LV_DRAW_TASK_TYPE_TRIANGLE: - lv_draw_sw_triangle((lv_draw_unit_t *)u, t->draw_dsc); - break; - case LV_DRAW_TASK_TYPE_LAYER: - lv_draw_sw_layer((lv_draw_unit_t *)u, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: - lv_draw_sw_mask_rect((lv_draw_unit_t *)u, t->draw_dsc, &t->area); - break; -#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG - case LV_DRAW_TASK_TYPE_VECTOR: - lv_draw_sw_vector((lv_draw_unit_t *)u, t->draw_dsc); - break; -#endif - default: - break; - } - -#if LV_USE_PARALLEL_DRAW_DEBUG - /*Layers manage it for themselves*/ - if(t->type != LV_DRAW_TASK_TYPE_LAYER) { - lv_area_t draw_area; - if(!lv_area_intersect(&draw_area, &t->area, u->base_unit.clip_area)) return; - - int32_t idx = 0; - lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head; - while(draw_unit_tmp != (lv_draw_unit_t *)u) { - draw_unit_tmp = draw_unit_tmp->next; - idx++; - } - - lv_draw_fill_dsc_t fill_dsc; - lv_draw_fill_dsc_init(&fill_dsc); - fill_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); - fill_dsc.opa = LV_OPA_10; - lv_draw_sw_fill((lv_draw_unit_t *)u, &fill_dsc, &draw_area); - - lv_point_t txt_size; - lv_text_get_size(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); - - lv_area_t txt_area; - txt_area.x1 = draw_area.x1; - txt_area.y1 = draw_area.y1; - txt_area.x2 = draw_area.x1 + txt_size.x - 1; - txt_area.y2 = draw_area.y1 + txt_size.y - 1; - - lv_draw_fill_dsc_init(&fill_dsc); - fill_dsc.color = lv_color_white(); - lv_draw_sw_fill((lv_draw_unit_t *)u, &fill_dsc, &txt_area); - - char buf[8]; - lv_snprintf(buf, sizeof(buf), "%d", idx); - lv_draw_label_dsc_t label_dsc; - lv_draw_label_dsc_init(&label_dsc); - label_dsc.color = lv_color_black(); - label_dsc.text = buf; - lv_draw_sw_label((lv_draw_unit_t *)u, &label_dsc, &txt_area); - } -#endif - LV_PROFILER_END; -} - -#if LV_DRAW_SW_SUPPORT_ARGB8888 - -static void rotate270_argb8888(const uint32_t * src, uint32_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, - int32_t dst_stride) -{ - if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_ARGB8888(src, dst, src_width, src_height, src_stride, dst_stride)) { - return ; - } - - src_stride /= sizeof(uint32_t); - dst_stride /= sizeof(uint32_t); - - for(int32_t x = 0; x < src_width; ++x) { - int32_t dstIndex = x * dst_stride; - int32_t srcIndex = x; - for(int32_t y = 0; y < src_height; ++y) { - dst[dstIndex + (src_height - y - 1)] = src[srcIndex]; - srcIndex += src_stride; - } - } -} - -static void rotate180_argb8888(const uint32_t * src, uint32_t * dst, int32_t width, int32_t height, int32_t src_stride, - int32_t dest_stride) -{ - LV_UNUSED(dest_stride); - if(LV_RESULT_OK == LV_DRAW_SW_ROTATE180_ARGB8888(src, dst, src_width, src_height, src_stride, dst_stride)) { - return ; - } - - src_stride /= sizeof(uint32_t); - - for(int32_t y = 0; y < height; ++y) { - int32_t dstIndex = (height - y - 1) * src_stride; - int32_t srcIndex = y * src_stride; - for(int32_t x = 0; x < width; ++x) { - dst[dstIndex + width - x - 1] = src[srcIndex + x]; - } - } -} - -static void rotate90_argb8888(const uint32_t * src, uint32_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, int32_t dst_stride) -{ - if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_ARGB8888(src, dst, src_width, src_height, src_stride, dst_stride)) { - return ; - } - - src_stride /= sizeof(uint32_t); - dst_stride /= sizeof(uint32_t); - - for(int32_t x = 0; x < src_width; ++x) { - int32_t dstIndex = (src_width - x - 1); - int32_t srcIndex = x; - for(int32_t y = 0; y < src_height; ++y) { - dst[dstIndex * dst_stride + y] = src[srcIndex]; - srcIndex += src_stride; - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_RGB888 - -static void rotate90_rgb888(const uint8_t * src, uint8_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, - int32_t dst_stride) -{ - if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_RGB888(src, dst, src_width, src_height, src_stride, dst_stride)) { - return ; - } - - for(int32_t x = 0; x < src_width; ++x) { - for(int32_t y = 0; y < src_height; ++y) { - int32_t srcIndex = y * src_stride + x * 3; - int32_t dstIndex = (src_width - x - 1) * dst_stride + y * 3; - dst[dstIndex] = src[srcIndex]; /*Red*/ - dst[dstIndex + 1] = src[srcIndex + 1]; /*Green*/ - dst[dstIndex + 2] = src[srcIndex + 2]; /*Blue*/ - } - } -} - -static void rotate180_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, - int32_t dest_stride) -{ - if(LV_RESULT_OK == LV_DRAW_SW_ROTATE180_RGB888(src, dst, src_width, src_height, src_stride, dst_stride)) { - return ; - } - - for(int32_t y = 0; y < height; ++y) { - for(int32_t x = 0; x < width; ++x) { - int32_t srcIndex = y * src_stride + x * 3; - int32_t dstIndex = (height - y - 1) * dest_stride + (width - x - 1) * 3; - dst[dstIndex] = src[srcIndex]; - dst[dstIndex + 1] = src[srcIndex + 1]; - dst[dstIndex + 2] = src[srcIndex + 2]; - } - } -} - -static void rotate270_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, - int32_t dst_stride) -{ - if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_RGB888(src, dst, src_width, src_height, src_stride, dst_stride)) { - return ; - } - - for(int32_t x = 0; x < width; ++x) { - for(int32_t y = 0; y < height; ++y) { - int32_t srcIndex = y * src_stride + x * 3; - int32_t dstIndex = x * dst_stride + (height - y - 1) * 3; - dst[dstIndex] = src[srcIndex]; /*Red*/ - dst[dstIndex + 1] = src[srcIndex + 1]; /*Green*/ - dst[dstIndex + 2] = src[srcIndex + 2]; /*Blue*/ - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_RGB565 - -static void rotate270_rgb565(const uint16_t * src, uint16_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, - int32_t dst_stride) -{ - if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_RGB565(src, dst, src_width, src_height, src_stride, dst_stride)) { - return ; - } - - src_stride /= sizeof(uint16_t); - dst_stride /= sizeof(uint16_t); - - for(int32_t x = 0; x < src_width; ++x) { - int32_t dstIndex = x * dst_stride; - int32_t srcIndex = x; - for(int32_t y = 0; y < src_height; ++y) { - dst[dstIndex + (src_height - y - 1)] = src[srcIndex]; - srcIndex += src_stride; - } - } -} - -static void rotate180_rgb565(const uint16_t * src, uint16_t * dst, int32_t width, int32_t height, int32_t src_stride, - int32_t dest_stride) -{ - if(LV_RESULT_OK == LV_DRAW_SW_ROTATE180_RGB565(src, dst, width, height, src_stride)) { - return ; - } - - src_stride /= sizeof(uint16_t); - dest_stride /= sizeof(uint16_t); - - for(int32_t y = 0; y < height; ++y) { - int32_t dstIndex = (height - y - 1) * dest_stride; - int32_t srcIndex = y * src_stride; - for(int32_t x = 0; x < width; ++x) { - dst[dstIndex + width - x - 1] = src[srcIndex + x]; - } - } -} - -static void rotate90_rgb565(const uint16_t * src, uint16_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, - int32_t dst_stride) -{ - if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_RGB565(src, dst, src_width, src_height, src_stride, dst_stride)) { - return ; - } - - src_stride /= sizeof(uint16_t); - dst_stride /= sizeof(uint16_t); - - for(int32_t x = 0; x < src_width; ++x) { - int32_t dstIndex = (src_width - x - 1); - int32_t srcIndex = x; - for(int32_t y = 0; y < src_height; ++y) { - dst[dstIndex * dst_stride + y] = src[srcIndex]; - srcIndex += src_stride; - } - } -} - -#endif - - -#if LV_DRAW_SW_SUPPORT_L8 - -static void rotate90_l8(const uint8_t * src, uint8_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, - int32_t dst_stride) -{ - if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_L8(src, dst, src_width, src_height, src_stride, dst_stride)) { - return ; - } - - for(int32_t x = 0; x < src_width; ++x) { - int32_t dstIndex = (src_width - x - 1); - int32_t srcIndex = x; - for(int32_t y = 0; y < src_height; ++y) { - dst[dstIndex * dst_stride + y] = src[srcIndex]; - srcIndex += src_stride; - } - } -} - -static void rotate180_l8(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, - int32_t dest_stride) -{ - if(LV_RESULT_OK == LV_DRAW_SW_ROTATE180_L8(src, dst, width, height, src_stride)) { - return ; - } - - for(int32_t y = 0; y < height; ++y) { - int32_t dstIndex = (height - y - 1) * dest_stride; - int32_t srcIndex = y * src_stride; - for(int32_t x = 0; x < width; ++x) { - dst[dstIndex + width - x - 1] = src[srcIndex + x]; - } - } -} - -static void rotate270_l8(const uint8_t * src, uint8_t * dst, int32_t src_width, int32_t src_height, - int32_t src_stride, - int32_t dst_stride) -{ - if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_L8(src, dst, src_width, src_height, src_stride, dst_stride)) { - return ; - } - - for(int32_t x = 0; x < src_width; ++x) { - int32_t dstIndex = x * dst_stride; - int32_t srcIndex = x; - for(int32_t y = 0; y < src_height; ++y) { - dst[dstIndex + (src_height - y - 1)] = src[srcIndex]; - srcIndex += src_stride; - } - } -} - -#endif - -#endif /*LV_USE_DRAW_SW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw.h deleted file mode 100644 index 6463afd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw.h +++ /dev/null @@ -1,204 +0,0 @@ -/** - * @file lv_draw_sw.h - * - */ - -#ifndef LV_DRAW_SW_H -#define LV_DRAW_SW_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_draw.h" -#if LV_USE_DRAW_SW - -#include "../../misc/lv_area.h" -#include "../../misc/lv_color.h" -#include "../../display/lv_display.h" -#include "../../osal/lv_os.h" - -#include "../lv_draw_vector.h" -#include "../lv_draw_triangle.h" -#include "../lv_draw_label.h" -#include "../lv_draw_image.h" -#include "../lv_draw_line.h" -#include "../lv_draw_arc.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the SW renderer. Called in internally. - * It creates as many SW renderers as defined in LV_DRAW_SW_DRAW_UNIT_CNT - */ -void lv_draw_sw_init(void); - -/** - * Deinitialize the SW renderers - */ -void lv_draw_sw_deinit(void); - -/** - * Fill an area using SW render. Handle gradient and radius. - * @param draw_unit pointer to a draw unit - * @param dsc the draw descriptor - * @param coords the coordinates of the rectangle - */ -void lv_draw_sw_fill(lv_draw_unit_t * draw_unit, lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); - -/** - * Draw border with SW render. - * @param draw_unit pointer to a draw unit - * @param dsc the draw descriptor - * @param coords the coordinates of the rectangle - */ -void lv_draw_sw_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords); - -/** - * Draw box shadow with SW render. - * @param draw_unit pointer to a draw unit - * @param dsc the draw descriptor - * @param coords the coordinates of the rectangle for which the box shadow should be drawn - */ -void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords); - -/** - * Draw an image with SW render. It handles image decoding, tiling, transformations, and recoloring. - * @param draw_unit pointer to a draw unit - * @param draw_dsc the draw descriptor - * @param coords the coordinates of the image - */ -void lv_draw_sw_image(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords); - -/** - * Draw a label with SW render. - * @param draw_unit pointer to a draw unit - * @param dsc the draw descriptor - * @param coords the coordinates of the label - */ -void lv_draw_sw_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords); - -/** - * Draw an arc with SW render. - * @param draw_unit pointer to a draw unit - * @param dsc the draw descriptor - * @param coords the coordinates of the arc - */ -void lv_draw_sw_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords); - -/** - * Draw a line with SW render. - * @param draw_unit pointer to a draw unit - * @param dsc the draw descriptor - */ -void lv_draw_sw_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); - -/** - * Blend a layer with SW render - * @param draw_unit pointer to a draw unit - * @param draw_dsc the draw descriptor - * @param coords the coordinates of the layer - */ -void lv_draw_sw_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords); - -/** - * Draw a triangle with SW render. - * @param draw_unit pointer to a draw unit - * @param dsc the draw descriptor - */ -void lv_draw_sw_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc); - -/** - * Mask out a rectangle with radius from a current layer - * @param draw_unit pointer to a draw unit - * @param dsc the draw descriptor - * @param coords the coordinates of the mask - */ -void lv_draw_sw_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, const lv_area_t * coords); - -/** - * Used internally to get a transformed are of an image - * @param draw_unit pointer to a draw unit - * @param dest_area area to calculate, i.e. get this area from the transformed image - * @param src_buf source buffer - * @param src_w source buffer width in pixels - * @param src_h source buffer height in pixels - * @param src_stride source buffer stride in bytes - * @param draw_dsc draw descriptor - * @param sup supplementary data - * @param cf color format of the source buffer - * @param dest_buf the destination buffer - */ -void lv_draw_sw_transform(lv_draw_unit_t * draw_unit, const lv_area_t * dest_area, const void * src_buf, - int32_t src_w, int32_t src_h, int32_t src_stride, - const lv_draw_image_dsc_t * draw_dsc, const lv_draw_image_sup_t * sup, lv_color_format_t cf, void * dest_buf); - -#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG -/** - * Draw vector graphics with SW render. - * @param draw_unit pointer to a draw unit - * @param dsc the draw descriptor - */ -void lv_draw_sw_vector(lv_draw_unit_t * draw_unit, const lv_draw_vector_task_dsc_t * dsc); -#endif - -/** - * Swap the upper and lower byte of an RGB565 buffer. - * Might be required if a 8bit parallel port or an SPI port send the bytes in the wrong order. - * The bytes will be swapped in place. - * @param buf pointer to buffer - * @param buf_size_px number of pixels in the buffer - */ -void lv_draw_sw_rgb565_swap(void * buf, uint32_t buf_size_px); - -/** - * Invert a draw buffer in the I1 color format. - * Conventionally, a bit is set to 1 during blending if the luminance is greater than 127. - * Depending on the display controller used, you might want to have different behavior. - * The inversion will be performed in place. - * @param buf pointer to the buffer to be inverted - * @param buf_size size of the buffer in bytes - */ -void lv_draw_sw_i1_invert(void * buf, uint32_t buf_size); - -/** - * Rotate a buffer into another buffer - * @param src the source buffer - * @param dest the destination buffer - * @param src_width source width in pixels - * @param src_height source height in pixels - * @param src_stride source stride in bytes (number of bytes in a row) - * @param dest_stride destination stride in bytes (number of bytes in a row) - * @param rotation LV_DISPLAY_ROTATION_0/90/180/270 - * @param color_format LV_COLOR_FORMAT_RGB565/RGB888/XRGB8888/ARGB8888 - */ -void lv_draw_sw_rotate(const void * src, void * dest, int32_t src_width, int32_t src_height, int32_t src_stride, - int32_t dest_stride, lv_display_rotation_t rotation, lv_color_format_t color_format); - -/*********************** - * GLOBAL VARIABLES - ***********************/ - -/********************** - * MACROS - **********************/ - -#include "blend/lv_draw_sw_blend.h" - -#endif /*LV_USE_DRAW_SW*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_arc.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_arc.c deleted file mode 100644 index ec2fb2f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_arc.c +++ /dev/null @@ -1,316 +0,0 @@ -/** - * @file lv_draw_sw_arc.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_area_private.h" -#include "lv_draw_sw_mask_private.h" -#include "blend/lv_draw_sw_blend_private.h" -#include "../lv_image_decoder_private.h" -#include "lv_draw_sw.h" -#if LV_USE_DRAW_SW -#if LV_DRAW_SW_COMPLEX - -#include "../../misc/lv_math.h" -#include "../../misc/lv_log.h" -#include "../../stdlib/lv_mem.h" -#include "../../stdlib/lv_string.h" -#include "../lv_draw_private.h" - -static void add_circle(const lv_opa_t * circle_mask, const lv_area_t * blend_area, const lv_area_t * circle_area, - lv_opa_t * mask_buf, int32_t width); -static void get_rounded_area(int16_t angle, int32_t radius, uint8_t thickness, lv_area_t * res_area); - -/********************* - * DEFINES - *********************/ -#define SPLIT_RADIUS_LIMIT 10 /*With radius greater than this the arc will drawn in quarters. A quarter is drawn only if there is arc in it*/ -#define SPLIT_ANGLE_GAP_LIMIT 60 /*With small gaps in the arc don't bother with splitting because there is nothing to skip.*/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_sw_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) -{ -#if LV_DRAW_SW_COMPLEX - if(dsc->opa <= LV_OPA_MIN) return; - if(dsc->width == 0) return; - if(dsc->start_angle == dsc->end_angle) return; - - int32_t width = dsc->width; - if(width > dsc->radius) width = dsc->radius; - - lv_area_t area_out = *coords; - lv_area_t clipped_area; - if(!lv_area_intersect(&clipped_area, &area_out, draw_unit->clip_area)) return; - - /*Draw a full ring*/ - if(dsc->img_src == NULL && - (dsc->start_angle + 360 == dsc->end_angle || dsc->start_angle == dsc->end_angle + 360)) { - lv_draw_border_dsc_t cir_dsc; - lv_draw_border_dsc_init(&cir_dsc); - cir_dsc.opa = dsc->opa; - cir_dsc.color = dsc->color; - cir_dsc.width = width; - cir_dsc.radius = LV_RADIUS_CIRCLE; - cir_dsc.side = LV_BORDER_SIDE_FULL; - lv_draw_sw_border(draw_unit, &cir_dsc, &area_out); - return; - } - - lv_area_t area_in; - lv_area_copy(&area_in, &area_out); - area_in.x1 += dsc->width; - area_in.y1 += dsc->width; - area_in.x2 -= dsc->width; - area_in.y2 -= dsc->width; - - int32_t start_angle = (int32_t)dsc->start_angle; - int32_t end_angle = (int32_t)dsc->end_angle; - while(start_angle >= 360) start_angle -= 360; - while(end_angle >= 360) end_angle -= 360; - - void * mask_list[4] = {0}; - /*Create an angle mask*/ - lv_draw_sw_mask_angle_param_t mask_angle_param; - lv_draw_sw_mask_angle_init(&mask_angle_param, dsc->center.x, dsc->center.y, start_angle, end_angle); - mask_list[0] = &mask_angle_param; - - /*Create an outer mask*/ - lv_draw_sw_mask_radius_param_t mask_out_param; - lv_draw_sw_mask_radius_init(&mask_out_param, &area_out, LV_RADIUS_CIRCLE, false); - mask_list[1] = &mask_out_param; - - /*Create inner the mask*/ - lv_draw_sw_mask_radius_param_t mask_in_param; - bool mask_in_param_valid = false; - if(lv_area_get_width(&area_in) > 0 && lv_area_get_height(&area_in) > 0) { - lv_draw_sw_mask_radius_init(&mask_in_param, &area_in, LV_RADIUS_CIRCLE, true); - mask_list[2] = &mask_in_param; - mask_in_param_valid = true; - } - - int32_t blend_h = lv_area_get_height(&clipped_area); - int32_t blend_w = lv_area_get_width(&clipped_area); - int32_t h; - lv_opa_t * mask_buf = lv_malloc(blend_w); - - lv_area_t blend_area = clipped_area; - lv_area_t img_area; - lv_draw_sw_blend_dsc_t blend_dsc = {0}; - blend_dsc.mask_buf = mask_buf; - blend_dsc.opa = dsc->opa; - blend_dsc.blend_area = &blend_area; - blend_dsc.mask_area = &blend_area; - - const uint8_t * img_mask = NULL; - lv_image_decoder_dsc_t decoder_dsc; - if(dsc->img_src == NULL) { - blend_dsc.color = dsc->color; - } - else { - lv_result_t res = lv_image_decoder_open(&decoder_dsc, dsc->img_src, NULL); - if(res == LV_RESULT_INVALID || decoder_dsc.decoded == NULL) { - LV_LOG_WARN("Can't decode the background image"); - blend_dsc.color = dsc->color; - } - else { - img_area.x1 = 0; - img_area.y1 = 0; - img_area.x2 = decoder_dsc.decoded->header.w - 1; - img_area.y2 = decoder_dsc.decoded->header.h - 1; - int32_t ofs = decoder_dsc.decoded->header.w / 2; - lv_area_move(&img_area, dsc->center.x - ofs, dsc->center.y - ofs); - blend_dsc.src_area = &img_area; - blend_dsc.src_buf = decoder_dsc.decoded->data; - blend_dsc.src_stride = decoder_dsc.decoded->header.stride; - blend_dsc.src_color_format = decoder_dsc.decoded->header.cf; - if(blend_dsc.src_color_format == LV_COLOR_FORMAT_RGB565A8) { - blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB565; - img_mask = (uint8_t *)blend_dsc.src_buf + blend_dsc.src_stride * lv_area_get_height(blend_dsc.src_area); - } - } - } - - lv_opa_t * circle_mask = NULL; - lv_area_t round_area_1; - lv_area_t round_area_2; - if(dsc->rounded) { - circle_mask = lv_malloc(width * width); - lv_memset(circle_mask, 0xff, width * width); - lv_area_t circle_area = {0, 0, width - 1, width - 1}; - lv_draw_sw_mask_radius_param_t circle_mask_param; - lv_draw_sw_mask_radius_init(&circle_mask_param, &circle_area, width / 2, false); - void * circle_mask_list[2] = {&circle_mask_param, NULL}; - - lv_opa_t * circle_mask_tmp = circle_mask; - for(h = 0; h < width; h++) { - lv_draw_sw_mask_res_t res = lv_draw_sw_mask_apply(circle_mask_list, circle_mask_tmp, 0, h, width); - if(res == LV_DRAW_SW_MASK_RES_TRANSP) { - lv_memzero(circle_mask_tmp, width); - } - - circle_mask_tmp += width; - } - get_rounded_area(start_angle, dsc->radius, width, &round_area_1); - lv_area_move(&round_area_1, dsc->center.x, dsc->center.y); - get_rounded_area(end_angle, dsc->radius, width, &round_area_2); - lv_area_move(&round_area_2, dsc->center.x, dsc->center.y); - - } - - blend_area.y2 = blend_area.y1; - for(h = 0; h < blend_h; h++) { - lv_memset(mask_buf, 0xff, blend_w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, blend_area.y1, blend_w); - - if(dsc->rounded) { - if(blend_area.y1 >= round_area_1.y1 && blend_area.y1 <= round_area_1.y2) { - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { - lv_memzero(mask_buf, blend_w); - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - add_circle(circle_mask, &blend_area, &round_area_1, mask_buf, width); - } - if(blend_area.y1 >= round_area_2.y1 && blend_area.y1 <= round_area_2.y2) { - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { - lv_memzero(mask_buf, blend_w); - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - add_circle(circle_mask, &blend_area, &round_area_2, mask_buf, width); - } - } - - /*If it was an RGB565A8 image use consider its A8 part on the mask*/ - if(img_mask && blend_dsc.mask_res != LV_DRAW_SW_MASK_RES_TRANSP) { - const uint8_t * img_mask_tmp = img_mask; - img_mask_tmp += blend_dsc.src_stride / 2 * (blend_area.y1 - blend_dsc.src_area->y1); - img_mask_tmp += blend_area.x1 - blend_dsc.src_area->x1; - - int32_t i; - for(i = 0; i < blend_w; i++) { - mask_buf[i] = LV_OPA_MIX2(mask_buf[i], img_mask_tmp[i]); - } - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) { - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - } - - lv_draw_sw_blend(draw_unit, &blend_dsc); - - blend_area.y1 ++; - blend_area.y2 ++; - } - - lv_draw_sw_mask_free_param(&mask_angle_param); - lv_draw_sw_mask_free_param(&mask_out_param); - if(mask_in_param_valid) { - lv_draw_sw_mask_free_param(&mask_in_param); - } - - lv_free(mask_buf); - if(dsc->img_src) lv_image_decoder_close(&decoder_dsc); - if(circle_mask) lv_free(circle_mask); -#else - LV_LOG_WARN("Can't draw arc with LV_DRAW_SW_COMPLEX == 0"); - LV_UNUSED(center); - LV_UNUSED(radius); - LV_UNUSED(start_angle); - LV_UNUSED(end_angle); - LV_UNUSED(layer); - LV_UNUSED(dsc); -#endif /*LV_DRAW_SW_COMPLEX*/ -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void add_circle(const lv_opa_t * circle_mask, const lv_area_t * blend_area, const lv_area_t * circle_area, - lv_opa_t * mask_buf, int32_t width) -{ - lv_area_t circle_common_area; - if(lv_area_intersect(&circle_common_area, circle_area, blend_area)) { - const lv_opa_t * circle_mask_tmp = circle_mask + width * (circle_common_area.y1 - circle_area->y1); - circle_mask_tmp += circle_common_area.x1 - circle_area->x1; - - lv_opa_t * mask_buf_tmp = mask_buf + circle_common_area.x1 - blend_area->x1; - - uint32_t x; - uint32_t w = lv_area_get_width(&circle_common_area); - for(x = 0; x < w; x++) { - uint32_t res = mask_buf_tmp[x] + circle_mask_tmp[x]; - mask_buf_tmp[x] = res > 255 ? 255 : res; - } - } - -} - -static void get_rounded_area(int16_t angle, int32_t radius, uint8_t thickness, lv_area_t * res_area) -{ - int32_t thick_half = thickness / 2; - uint8_t thick_corr = (thickness & 0x01) ? 0 : 1; - - int32_t cir_x; - int32_t cir_y; - - cir_x = ((radius - thick_half) * lv_trigo_cos(angle)) >> (LV_TRIGO_SHIFT - 8); - cir_y = ((radius - thick_half) * lv_trigo_sin(angle)) >> (LV_TRIGO_SHIFT - 8); - - /*The center of the pixel need to be calculated so apply 1/2 px offset*/ - if(cir_x > 0) { - cir_x = (cir_x - 128) >> 8; - res_area->x1 = cir_x - thick_half + thick_corr; - res_area->x2 = cir_x + thick_half; - } - else { - cir_x = (cir_x + 128) >> 8; - res_area->x1 = cir_x - thick_half; - res_area->x2 = cir_x + thick_half - thick_corr; - } - - if(cir_y > 0) { - cir_y = (cir_y - 128) >> 8; - res_area->y1 = cir_y - thick_half + thick_corr; - res_area->y2 = cir_y + thick_half; - } - else { - cir_y = (cir_y + 128) >> 8; - res_area->y1 = cir_y - thick_half; - res_area->y2 = cir_y + thick_half - thick_corr; - } -} - -#else /*LV_DRAW_SW_COMPLEX*/ - -void lv_draw_sw_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) -{ - LV_UNUSED(draw_unit); - LV_UNUSED(dsc); - LV_UNUSED(coords); - - LV_LOG_WARN("LV_DRAW_SW_COMPLEX needs to be enabled"); -} - -#endif /*LV_DRAW_SW_COMPLEX*/ -#endif /*LV_USE_DRAW_SW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_border.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_border.c deleted file mode 100644 index 07eb18c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_border.c +++ /dev/null @@ -1,336 +0,0 @@ -/** - * @file lv_draw_sw_border.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_area_private.h" -#include "lv_draw_sw_mask_private.h" -#include "../lv_draw_private.h" -#include "../lv_draw_private.h" -#include "lv_draw_sw.h" -#if LV_USE_DRAW_SW - -#include "blend/lv_draw_sw_blend_private.h" -#include "../../misc/lv_math.h" -#include "../../misc/lv_text_ap.h" -#include "../../core/lv_refr.h" -#include "../../misc/lv_assert.h" -#include "../../stdlib/lv_string.h" -#include "../lv_draw_mask.h" - -/********************* - * DEFINES - *********************/ -#define SPLIT_LIMIT 50 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void draw_border_complex(lv_draw_unit_t * draw_unit, const lv_area_t * outer_area, const lv_area_t * inner_area, - int32_t rout, int32_t rin, lv_color_t color, lv_opa_t opa); - -static void draw_border_simple(lv_draw_unit_t * draw_unit, const lv_area_t * outer_area, const lv_area_t * inner_area, - lv_color_t color, lv_opa_t opa); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_sw_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords) -{ - if(dsc->opa <= LV_OPA_MIN) return; - if(dsc->width == 0) return; - if(dsc->side == LV_BORDER_SIDE_NONE) return; - - int32_t coords_w = lv_area_get_width(coords); - int32_t coords_h = lv_area_get_height(coords); - int32_t rout = dsc->radius; - int32_t short_side = LV_MIN(coords_w, coords_h); - if(rout > short_side >> 1) rout = short_side >> 1; - - /*Get the inner area*/ - lv_area_t area_inner; - lv_area_copy(&area_inner, coords); - area_inner.x1 += ((dsc->side & LV_BORDER_SIDE_LEFT) ? dsc->width : - (dsc->width + rout)); - area_inner.x2 -= ((dsc->side & LV_BORDER_SIDE_RIGHT) ? dsc->width : - (dsc->width + rout)); - area_inner.y1 += ((dsc->side & LV_BORDER_SIDE_TOP) ? dsc->width : - (dsc->width + rout)); - area_inner.y2 -= ((dsc->side & LV_BORDER_SIDE_BOTTOM) ? dsc->width : - (dsc->width + rout)); - - int32_t rin = rout - dsc->width; - if(rin < 0) rin = 0; - - if(rout == 0 && rin == 0) { - draw_border_simple(draw_unit, coords, &area_inner, dsc->color, dsc->opa); - } - else { - draw_border_complex(draw_unit, coords, &area_inner, rout, rin, dsc->color, dsc->opa); - } - -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -void draw_border_complex(lv_draw_unit_t * draw_unit, const lv_area_t * outer_area, const lv_area_t * inner_area, - int32_t rout, int32_t rin, lv_color_t color, lv_opa_t opa) -{ -#if LV_DRAW_SW_COMPLEX - /*Get clipped draw area which is the real draw area. - *It is always the same or inside `coords`*/ - lv_area_t draw_area; - if(!lv_area_intersect(&draw_area, outer_area, draw_unit->clip_area)) return; - int32_t draw_area_w = lv_area_get_width(&draw_area); - - lv_draw_sw_blend_dsc_t blend_dsc; - lv_memzero(&blend_dsc, sizeof(blend_dsc)); - lv_opa_t * mask_buf = lv_malloc(draw_area_w); - blend_dsc.mask_buf = mask_buf; - - void * mask_list[3] = {0}; - - /*Create mask for the inner mask*/ - lv_draw_sw_mask_radius_param_t mask_rin_param; - lv_draw_sw_mask_radius_init(&mask_rin_param, inner_area, rin, true); - mask_list[0] = &mask_rin_param; - - /*Create mask for the outer area*/ - lv_draw_sw_mask_radius_param_t mask_rout_param; - if(rout > 0) { - lv_draw_sw_mask_radius_init(&mask_rout_param, outer_area, rout, false); - mask_list[1] = &mask_rout_param; - } - - int32_t h; - lv_area_t blend_area; - blend_dsc.blend_area = &blend_area; - blend_dsc.mask_area = &blend_area; - blend_dsc.color = color; - blend_dsc.opa = opa; - - /*Calculate the x and y coordinates where the straight parts area is*/ - lv_area_t core_area; - core_area.x1 = LV_MAX(outer_area->x1 + rout, inner_area->x1); - core_area.x2 = LV_MIN(outer_area->x2 - rout, inner_area->x2); - core_area.y1 = LV_MAX(outer_area->y1 + rout, inner_area->y1); - core_area.y2 = LV_MIN(outer_area->y2 - rout, inner_area->y2); - int32_t core_w = lv_area_get_width(&core_area); - - bool top_side = outer_area->y1 <= inner_area->y1; - bool bottom_side = outer_area->y2 >= inner_area->y2; - - /*No masks*/ - bool left_side = outer_area->x1 <= inner_area->x1; - bool right_side = outer_area->x2 >= inner_area->x2; - - bool split_hor = true; - if(left_side && right_side && top_side && bottom_side && - core_w < SPLIT_LIMIT) { - split_hor = false; - } - - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_FULL_COVER; - /*Draw the straight lines first if they are long enough*/ - if(top_side && split_hor) { - blend_area.x1 = core_area.x1; - blend_area.x2 = core_area.x2; - blend_area.y1 = outer_area->y1; - blend_area.y2 = inner_area->y1 - 1; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - - if(bottom_side && split_hor) { - blend_area.x1 = core_area.x1; - blend_area.x2 = core_area.x2; - blend_area.y1 = inner_area->y2 + 1; - blend_area.y2 = outer_area->y2; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - - /*If the border is very thick and the vertical sides overlap horizontally draw a single rectangle*/ - if(inner_area->x1 >= inner_area->x2 && left_side && right_side) { - blend_area.x1 = outer_area->x1; - blend_area.x2 = outer_area->x2; - blend_area.y1 = core_area.y1; - blend_area.y2 = core_area.y2; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - else { - if(left_side) { - blend_area.x1 = outer_area->x1; - blend_area.x2 = inner_area->x1 - 1; - blend_area.y1 = core_area.y1; - blend_area.y2 = core_area.y2; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - - if(right_side) { - blend_area.x1 = inner_area->x2 + 1; - blend_area.x2 = outer_area->x2; - blend_area.y1 = core_area.y1; - blend_area.y2 = core_area.y2; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - } - - /*Draw the corners*/ - int32_t blend_w; - - /*Left and right corner together if they are close to each other*/ - if(!split_hor) { - /*Calculate the top corner and mirror it to the bottom*/ - blend_area.x1 = draw_area.x1; - blend_area.x2 = draw_area.x2; - int32_t max_h = LV_MAX(rout, inner_area->y1 - outer_area->y1); - for(h = 0; h < max_h; h++) { - int32_t top_y = outer_area->y1 + h; - int32_t bottom_y = outer_area->y2 - h; - if(top_y < draw_area.y1 && bottom_y > draw_area.y2) continue; /*This line is clipped now*/ - - lv_memset(mask_buf, 0xff, draw_area_w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, top_y, draw_area_w); - - if(top_y >= draw_area.y1) { - blend_area.y1 = top_y; - blend_area.y2 = top_y; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - - if(bottom_y <= draw_area.y2) { - blend_area.y1 = bottom_y; - blend_area.y2 = bottom_y; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - } - } - else { - /*Left corners*/ - blend_area.x1 = draw_area.x1; - blend_area.x2 = LV_MIN(draw_area.x2, core_area.x1 - 1); - blend_w = lv_area_get_width(&blend_area); - if(blend_w > 0) { - if(left_side || top_side) { - for(h = draw_area.y1; h < core_area.y1; h++) { - blend_area.y1 = h; - blend_area.y2 = h; - - lv_memset(mask_buf, 0xff, blend_w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, h, blend_w); - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - } - - if(left_side || bottom_side) { - for(h = core_area.y2 + 1; h <= draw_area.y2; h++) { - blend_area.y1 = h; - blend_area.y2 = h; - - lv_memset(mask_buf, 0xff, blend_w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, h, blend_w); - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - } - } - - /*Right corners*/ - blend_area.x1 = LV_MAX(draw_area.x1, blend_area.x2 + 1); /*To not overlap with the left side*/ - blend_area.x1 = LV_MAX(draw_area.x1, core_area.x2 + 1); - - blend_area.x2 = draw_area.x2; - blend_w = lv_area_get_width(&blend_area); - - if(blend_w > 0) { - if(right_side || top_side) { - for(h = draw_area.y1; h < core_area.y1; h++) { - blend_area.y1 = h; - blend_area.y2 = h; - - lv_memset(mask_buf, 0xff, blend_w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, h, blend_w); - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - } - - if(right_side || bottom_side) { - for(h = core_area.y2 + 1; h <= draw_area.y2; h++) { - blend_area.y1 = h; - blend_area.y2 = h; - - lv_memset(mask_buf, 0xff, blend_w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, h, blend_w); - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - } - } - } - - lv_draw_sw_mask_free_param(&mask_rin_param); - if(rout > 0) lv_draw_sw_mask_free_param(&mask_rout_param); - lv_free(mask_buf); - -#endif /*LV_DRAW_SW_COMPLEX*/ -} -static void draw_border_simple(lv_draw_unit_t * draw_unit, const lv_area_t * outer_area, const lv_area_t * inner_area, - lv_color_t color, lv_opa_t opa) -{ - lv_area_t a; - lv_draw_sw_blend_dsc_t blend_dsc; - lv_memzero(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t)); - blend_dsc.blend_area = &a; - blend_dsc.color = color; - blend_dsc.opa = opa; - - bool top_side = outer_area->y1 <= inner_area->y1; - bool bottom_side = outer_area->y2 >= inner_area->y2; - bool left_side = outer_area->x1 <= inner_area->x1; - bool right_side = outer_area->x2 >= inner_area->x2; - - /*Top*/ - a.x1 = outer_area->x1; - a.x2 = outer_area->x2; - a.y1 = outer_area->y1; - a.y2 = inner_area->y1 - 1; - if(top_side) { - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - - /*Bottom*/ - a.y1 = inner_area->y2 + 1; - a.y2 = outer_area->y2; - if(bottom_side) { - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - - /*Left*/ - a.x1 = outer_area->x1; - a.x2 = inner_area->x1 - 1; - a.y1 = (top_side) ? inner_area->y1 : outer_area->y1; - a.y2 = (bottom_side) ? inner_area->y2 : outer_area->y2; - if(left_side) { - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - - /*Right*/ - a.x1 = inner_area->x2 + 1; - a.x2 = outer_area->x2; - if(right_side) { - lv_draw_sw_blend(draw_unit, &blend_dsc); - } -} - -#endif /*LV_USE_DRAW_SW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_box_shadow.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_box_shadow.c deleted file mode 100644 index f802875..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_box_shadow.c +++ /dev/null @@ -1,743 +0,0 @@ -/** - * @file lv_draw_sw_box_shadow.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_area_private.h" -#include "lv_draw_sw_mask_private.h" -#include "../lv_draw_private.h" -#include "lv_draw_sw.h" -#if LV_USE_DRAW_SW - -#if LV_DRAW_SW_COMPLEX - -#include "blend/lv_draw_sw_blend_private.h" -#include "../../core/lv_global.h" -#include "../../misc/lv_math.h" -#include "../../core/lv_refr.h" -#include "../../misc/lv_assert.h" -#include "../../stdlib/lv_string.h" -#include "../lv_draw_mask.h" - -/********************* - * DEFINES - *********************/ -#define SHADOW_UPSCALE_SHIFT 6 -#define SHADOW_ENHANCE 1 - -#if defined(LV_DRAW_SW_SHADOW_CACHE_SIZE) && LV_DRAW_SW_SHADOW_CACHE_SIZE > 0 - #define shadow_cache LV_GLOBAL_DEFAULT()->sw_shadow_cache -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, int32_t s, - int32_t r); -static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_blur_corner(int32_t size, int32_t sw, uint16_t * sh_ups_buf); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords) -{ - /*Calculate the rectangle which is blurred to get the shadow in `shadow_area`*/ - lv_area_t core_area; - core_area.x1 = coords->x1 + dsc->ofs_x - dsc->spread; - core_area.x2 = coords->x2 + dsc->ofs_x + dsc->spread; - core_area.y1 = coords->y1 + dsc->ofs_y - dsc->spread; - core_area.y2 = coords->y2 + dsc->ofs_y + dsc->spread; - - /*Calculate the bounding box of the shadow*/ - lv_area_t shadow_area; - shadow_area.x1 = core_area.x1 - dsc->width / 2 - 1; - shadow_area.x2 = core_area.x2 + dsc->width / 2 + 1; - shadow_area.y1 = core_area.y1 - dsc->width / 2 - 1; - shadow_area.y2 = core_area.y2 + dsc->width / 2 + 1; - - lv_opa_t opa = dsc->opa; - if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; - - /*Get clipped draw area which is the real draw area. - *It is always the same or inside `shadow_area`*/ - lv_area_t draw_area; - if(!lv_area_intersect(&draw_area, &shadow_area, draw_unit->clip_area)) return; - - /*Consider 1 px smaller bg to be sure the edge will be covered by the shadow*/ - lv_area_t bg_area; - lv_area_copy(&bg_area, coords); - lv_area_increase(&bg_area, -1, -1); - - /*Get the clamped radius*/ - int32_t r_bg = dsc->radius; - int32_t short_side = LV_MIN(lv_area_get_width(&bg_area), lv_area_get_height(&bg_area)); - if(r_bg > short_side >> 1) r_bg = short_side >> 1; - - /*Get the clamped radius*/ - int32_t r_sh = dsc->radius; - short_side = LV_MIN(lv_area_get_width(&core_area), lv_area_get_height(&core_area)); - if(r_sh > short_side >> 1) r_sh = short_side >> 1; - - /*Get how many pixels are affected by the blur on the corners*/ - int32_t corner_size = dsc->width + r_sh; - - lv_opa_t * sh_buf; - -#if LV_DRAW_SW_SHADOW_CACHE_SIZE - lv_draw_sw_shadow_cache_t * cache = &shadow_cache; - if(cache->cache_size == corner_size && cache->cache_r == r_sh) { - /*Use the cache if available*/ - sh_buf = lv_malloc(corner_size * corner_size); - lv_memcpy(sh_buf, cache->cache, corner_size * corner_size); - } - else { - /*A larger buffer is required for calculation*/ - sh_buf = lv_malloc(corner_size * corner_size * sizeof(uint16_t)); - shadow_draw_corner_buf(&core_area, (uint16_t *)sh_buf, dsc->width, r_sh); - - /*Cache the corner if it fits into the cache size*/ - if((uint32_t)corner_size * corner_size < sizeof(cache->cache)) { - lv_memcpy(cache->cache, sh_buf, corner_size * corner_size); - cache->cache_size = corner_size; - cache->cache_r = r_sh; - } - } -#else - sh_buf = lv_malloc(corner_size * corner_size * sizeof(uint16_t)); - shadow_draw_corner_buf(&core_area, (uint16_t *)sh_buf, dsc->width, r_sh); -#endif /*LV_DRAW_SW_SHADOW_CACHE_SIZE*/ - - /*Skip a lot of masking if the background will cover the shadow that would be masked out*/ - bool simple = dsc->bg_cover; - - /*Create a radius mask to clip remove shadow on the bg area*/ - - lv_draw_sw_mask_radius_param_t mask_rout_param; - void * masks[2] = {0}; - if(!simple) { - lv_draw_sw_mask_radius_init(&mask_rout_param, &bg_area, r_bg, true); - masks[0] = &mask_rout_param; - } - - lv_opa_t * mask_buf = lv_malloc(lv_area_get_width(&shadow_area)); - lv_area_t blend_area; - lv_area_t clip_area_sub; - lv_opa_t * sh_buf_tmp; - int32_t y; - bool simple_sub; - - lv_draw_sw_blend_dsc_t blend_dsc; - lv_memzero(&blend_dsc, sizeof(blend_dsc)); - blend_dsc.blend_area = &blend_area; - blend_dsc.mask_area = &blend_area; - blend_dsc.mask_buf = mask_buf; - blend_dsc.color = dsc->color; - blend_dsc.opa = dsc->opa; - - int32_t w_half = shadow_area.x1 + lv_area_get_width(&shadow_area) / 2; - int32_t h_half = shadow_area.y1 + lv_area_get_height(&shadow_area) / 2; - - /*Draw the corners if they are on the current clip area and not fully covered by the bg*/ - - /*Top right corner*/ - blend_area.x2 = shadow_area.x2; - blend_area.x1 = shadow_area.x2 - corner_size + 1; - blend_area.y1 = shadow_area.y1; - blend_area.y2 = shadow_area.y1 + corner_size - 1; - /*Do not overdraw the other top corners*/ - blend_area.x1 = LV_MAX(blend_area.x1, w_half); - blend_area.y2 = LV_MIN(blend_area.y2, h_half); - - if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { - int32_t w = lv_area_get_width(&clip_area_sub); - sh_buf_tmp = sh_buf; - sh_buf_tmp += (clip_area_sub.y1 - shadow_area.y1) * corner_size; - sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); - - /*Do not mask if out of the bg*/ - if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; - else simple_sub = simple; - if(w > 0) { - blend_dsc.mask_buf = mask_buf; - blend_area.x1 = clip_area_sub.x1; - blend_area.x2 = clip_area_sub.x2; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ - for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { - blend_area.y1 = y; - blend_area.y2 = y; - - if(!simple_sub) { - lv_memcpy(mask_buf, sh_buf_tmp, corner_size); - blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - else { - blend_dsc.mask_buf = sh_buf_tmp; - } - lv_draw_sw_blend(draw_unit, &blend_dsc); - sh_buf_tmp += corner_size; - } - } - } - - /*Bottom right corner. - *Almost the same as top right just read the lines of `sh_buf` from then end*/ - blend_area.x2 = shadow_area.x2; - blend_area.x1 = shadow_area.x2 - corner_size + 1; - blend_area.y1 = shadow_area.y2 - corner_size + 1; - blend_area.y2 = shadow_area.y2; - /*Do not overdraw the other corners*/ - blend_area.x1 = LV_MAX(blend_area.x1, w_half); - blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); - - if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { - int32_t w = lv_area_get_width(&clip_area_sub); - sh_buf_tmp = sh_buf; - sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; - sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); - /*Do not mask if out of the bg*/ - if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; - else simple_sub = simple; - - if(w > 0) { - blend_dsc.mask_buf = mask_buf; - blend_area.x1 = clip_area_sub.x1; - blend_area.x2 = clip_area_sub.x2; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ - for(y = clip_area_sub.y2; y >= clip_area_sub.y1; y--) { - blend_area.y1 = y; - blend_area.y2 = y; - - if(!simple_sub) { - lv_memcpy(mask_buf, sh_buf_tmp, corner_size); - blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - else { - blend_dsc.mask_buf = sh_buf_tmp; - } - lv_draw_sw_blend(draw_unit, &blend_dsc); - sh_buf_tmp += corner_size; - } - } - } - - /*Top side*/ - blend_area.x1 = shadow_area.x1 + corner_size; - blend_area.x2 = shadow_area.x2 - corner_size; - blend_area.y1 = shadow_area.y1; - blend_area.y2 = shadow_area.y1 + corner_size - 1; - blend_area.y2 = LV_MIN(blend_area.y2, h_half); - - if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { - int32_t w = lv_area_get_width(&clip_area_sub); - sh_buf_tmp = sh_buf; - sh_buf_tmp += (clip_area_sub.y1 - blend_area.y1) * corner_size; - - /*Do not mask if out of the bg*/ - if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; - else simple_sub = simple; - - if(w > 0) { - if(!simple_sub) { - blend_dsc.mask_buf = mask_buf; - } - else { - blend_dsc.mask_buf = NULL; - } - blend_area.x1 = clip_area_sub.x1; - blend_area.x2 = clip_area_sub.x2; - - for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { - blend_area.y1 = y; - blend_area.y2 = y; - - if(!simple_sub) { - lv_memset(mask_buf, sh_buf_tmp[0], w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - else { - blend_dsc.opa = opa == LV_OPA_COVER ? sh_buf_tmp[0] : LV_OPA_MIX2(sh_buf_tmp[0], dsc->opa); - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - sh_buf_tmp += corner_size; - } - } - } - blend_dsc.opa = dsc->opa; /*Restore*/ - - /*Bottom side*/ - blend_area.x1 = shadow_area.x1 + corner_size; - blend_area.x2 = shadow_area.x2 - corner_size; - blend_area.y1 = shadow_area.y2 - corner_size + 1; - blend_area.y2 = shadow_area.y2; - blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); - - if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { - int32_t w = lv_area_get_width(&clip_area_sub); - sh_buf_tmp = sh_buf; - sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; - if(w > 0) { - /*Do not mask if out of the bg*/ - if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; - else simple_sub = simple; - - if(!simple_sub) { - blend_dsc.mask_buf = mask_buf; - } - else { - blend_dsc.mask_buf = NULL; - } - blend_area.x1 = clip_area_sub.x1; - blend_area.x2 = clip_area_sub.x2; - - for(y = clip_area_sub.y2; y >= clip_area_sub.y1; y--) { - blend_area.y1 = y; - blend_area.y2 = y; - - /*Do not mask if out of the bg*/ - if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; - else simple_sub = simple; - - if(!simple_sub) { - lv_memset(mask_buf, sh_buf_tmp[0], w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - else { - blend_dsc.opa = opa == LV_OPA_COVER ? sh_buf_tmp[0] : (sh_buf_tmp[0] * dsc->opa) >> 8; - lv_draw_sw_blend(draw_unit, &blend_dsc); - - } - sh_buf_tmp += corner_size; - } - } - } - - blend_dsc.opa = dsc->opa; /*Restore*/ - - /*Right side*/ - blend_area.x1 = shadow_area.x2 - corner_size + 1; - blend_area.x2 = shadow_area.x2; - blend_area.y1 = shadow_area.y1 + corner_size; - blend_area.y2 = shadow_area.y2 - corner_size; - /*Do not overdraw the other corners*/ - blend_area.y1 = LV_MIN(blend_area.y1, h_half + 1); - blend_area.y2 = LV_MAX(blend_area.y2, h_half); - blend_area.x1 = LV_MAX(blend_area.x1, w_half); - - if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { - int32_t w = lv_area_get_width(&clip_area_sub); - sh_buf_tmp = sh_buf; - sh_buf_tmp += (corner_size - 1) * corner_size; - sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); - - /*Do not mask if out of the bg*/ - if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; - else simple_sub = simple; - blend_dsc.mask_buf = simple_sub ? sh_buf_tmp : mask_buf; - - if(w > 0) { - blend_area.x1 = clip_area_sub.x1; - blend_area.x2 = clip_area_sub.x2; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ - for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { - blend_area.y1 = y; - blend_area.y2 = y; - - if(!simple_sub) { - lv_memcpy(mask_buf, sh_buf_tmp, w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - } - } - - /*Mirror the shadow corner buffer horizontally*/ - sh_buf_tmp = sh_buf ; - for(y = 0; y < corner_size; y++) { - int32_t x; - lv_opa_t * start = sh_buf_tmp; - lv_opa_t * end = sh_buf_tmp + corner_size - 1; - for(x = 0; x < corner_size / 2; x++) { - lv_opa_t tmp = *start; - *start = *end; - *end = tmp; - - start++; - end--; - } - sh_buf_tmp += corner_size; - } - - /*Left side*/ - blend_area.x1 = shadow_area.x1; - blend_area.x2 = shadow_area.x1 + corner_size - 1; - blend_area.y1 = shadow_area.y1 + corner_size; - blend_area.y2 = shadow_area.y2 - corner_size; - /*Do not overdraw the other corners*/ - blend_area.y1 = LV_MIN(blend_area.y1, h_half + 1); - blend_area.y2 = LV_MAX(blend_area.y2, h_half); - blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); - - if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { - int32_t w = lv_area_get_width(&clip_area_sub); - sh_buf_tmp = sh_buf; - sh_buf_tmp += (corner_size - 1) * corner_size; - sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; - - /*Do not mask if out of the bg*/ - if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; - else simple_sub = simple; - blend_dsc.mask_buf = simple_sub ? sh_buf_tmp : mask_buf; - if(w > 0) { - blend_area.x1 = clip_area_sub.x1; - blend_area.x2 = clip_area_sub.x2; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ - for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { - blend_area.y1 = y; - blend_area.y2 = y; - - if(!simple_sub) { - lv_memcpy(mask_buf, sh_buf_tmp, w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - } - } - - /*Top left corner*/ - blend_area.x1 = shadow_area.x1; - blend_area.x2 = shadow_area.x1 + corner_size - 1; - blend_area.y1 = shadow_area.y1; - blend_area.y2 = shadow_area.y1 + corner_size - 1; - /*Do not overdraw the other corners*/ - blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); - blend_area.y2 = LV_MIN(blend_area.y2, h_half); - - if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { - int32_t w = lv_area_get_width(&clip_area_sub); - sh_buf_tmp = sh_buf; - sh_buf_tmp += (clip_area_sub.y1 - blend_area.y1) * corner_size; - sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; - - /*Do not mask if out of the bg*/ - if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; - else simple_sub = simple; - blend_dsc.mask_buf = mask_buf; - - if(w > 0) { - blend_area.x1 = clip_area_sub.x1; - blend_area.x2 = clip_area_sub.x2; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ - for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { - blend_area.y1 = y; - blend_area.y2 = y; - - if(!simple_sub) { - lv_memcpy(mask_buf, sh_buf_tmp, corner_size); - blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - else { - blend_dsc.mask_buf = sh_buf_tmp; - } - - lv_draw_sw_blend(draw_unit, &blend_dsc); - sh_buf_tmp += corner_size; - } - } - } - - /*Bottom left corner. - *Almost the same as bottom right just read the lines of `sh_buf` from then end*/ - blend_area.x1 = shadow_area.x1 ; - blend_area.x2 = shadow_area.x1 + corner_size - 1; - blend_area.y1 = shadow_area.y2 - corner_size + 1; - blend_area.y2 = shadow_area.y2; - /*Do not overdraw the other corners*/ - blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); - blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); - - if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { - int32_t w = lv_area_get_width(&clip_area_sub); - sh_buf_tmp = sh_buf; - sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; - sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; - - /*Do not mask if out of the bg*/ - if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; - else simple_sub = simple; - blend_dsc.mask_buf = mask_buf; - if(w > 0) { - blend_area.x1 = clip_area_sub.x1; - blend_area.x2 = clip_area_sub.x2; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ - for(y = clip_area_sub.y2; y >= clip_area_sub.y1; y--) { - blend_area.y1 = y; - blend_area.y2 = y; - - if(!simple_sub) { - lv_memcpy(mask_buf, sh_buf_tmp, corner_size); - blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - else { - blend_dsc.mask_buf = sh_buf_tmp; - } - lv_draw_sw_blend(draw_unit, &blend_dsc); - sh_buf_tmp += corner_size; - } - } - } - - /*Draw the center rectangle.*/ - blend_area.x1 = shadow_area.x1 + corner_size ; - blend_area.x2 = shadow_area.x2 - corner_size; - blend_area.y1 = shadow_area.y1 + corner_size; - blend_area.y2 = shadow_area.y2 - corner_size; - blend_area.y1 = LV_MIN(blend_area.y1, h_half + 1); - blend_area.y2 = LV_MAX(blend_area.y2, h_half); - blend_dsc.mask_buf = mask_buf; - - if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { - int32_t w = lv_area_get_width(&clip_area_sub); - if(w > 0) { - blend_area.x1 = clip_area_sub.x1; - blend_area.x2 = clip_area_sub.x2; - for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { - blend_area.y1 = y; - blend_area.y2 = y; - - lv_memset(mask_buf, 0xff, w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - } - } - - if(!simple) { - lv_draw_sw_mask_free_param(&mask_rout_param); - } - lv_free(sh_buf); - lv_free(mask_buf); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Calculate a blurred corner - * @param coords Coordinates of the shadow - * @param sh_buf a buffer to store the result. Its size should be `(sw + r)^2 * 2` - * @param sw shadow width - * @param r radius - */ -static void LV_ATTRIBUTE_FAST_MEM shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, int32_t sw, - int32_t r) -{ - int32_t sw_ori = sw; - int32_t size = sw_ori + r; - - lv_area_t sh_area; - lv_area_copy(&sh_area, coords); - sh_area.x2 = sw / 2 + r - 1 - ((sw & 1) ? 0 : 1); - sh_area.y1 = sw / 2 + 1; - - sh_area.x1 = sh_area.x2 - lv_area_get_width(coords); - sh_area.y2 = sh_area.y1 + lv_area_get_height(coords); - - lv_draw_sw_mask_radius_param_t mask_param; - lv_draw_sw_mask_radius_init(&mask_param, &sh_area, r, false); - -#if SHADOW_ENHANCE - /*Set half shadow width because blur will be repeated*/ - if(sw_ori == 1) sw = 1; - else sw = sw_ori >> 1; -#endif /*SHADOW_ENHANCE*/ - - int32_t y; - lv_opa_t * mask_line = lv_malloc(size); - uint16_t * sh_ups_tmp_buf = (uint16_t *)sh_buf; - for(y = 0; y < size; y++) { - lv_memset(mask_line, 0xff, size); - lv_draw_sw_mask_res_t mask_res = mask_param.dsc.cb(mask_line, 0, y, size, &mask_param); - if(mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { - lv_memzero(sh_ups_tmp_buf, size * sizeof(sh_ups_tmp_buf[0])); - } - else { - int32_t i; - sh_ups_tmp_buf[0] = (mask_line[0] << SHADOW_UPSCALE_SHIFT) / sw; - for(i = 1; i < size; i++) { - if(mask_line[i] == mask_line[i - 1]) sh_ups_tmp_buf[i] = sh_ups_tmp_buf[i - 1]; - else sh_ups_tmp_buf[i] = (mask_line[i] << SHADOW_UPSCALE_SHIFT) / sw; - } - } - - sh_ups_tmp_buf += size; - } - lv_free(mask_line); - - lv_draw_sw_mask_free_param(&mask_param); - - if(sw == 1) { - int32_t i; - lv_opa_t * res_buf = (lv_opa_t *)sh_buf; - for(i = 0; i < size * size; i++) { - res_buf[i] = (sh_buf[i] >> SHADOW_UPSCALE_SHIFT); - } - return; - } - - shadow_blur_corner(size, sw, sh_buf); - -#if SHADOW_ENHANCE == 0 - /*The result is required in lv_opa_t not uint16_t*/ - uint32_t x; - lv_opa_t * res_buf = (lv_opa_t *)sh_buf; - for(x = 0; x < size * size; x++) { - res_buf[x] = sh_buf[x]; - } -#else - sw += sw_ori & 1; - if(sw > 1) { - uint32_t i; - uint32_t max_v_div = (LV_OPA_COVER << SHADOW_UPSCALE_SHIFT) / sw; - for(i = 0; i < (uint32_t)size * size; i++) { - if(sh_buf[i] == 0) continue; - else if(sh_buf[i] == LV_OPA_COVER) sh_buf[i] = max_v_div; - else sh_buf[i] = (sh_buf[i] << SHADOW_UPSCALE_SHIFT) / sw; - } - - shadow_blur_corner(size, sw, sh_buf); - } - int32_t x; - lv_opa_t * res_buf = (lv_opa_t *)sh_buf; - for(x = 0; x < size * size; x++) { - res_buf[x] = (lv_opa_t) sh_buf[x]; - } -#endif - -} - -static void LV_ATTRIBUTE_FAST_MEM shadow_blur_corner(int32_t size, int32_t sw, uint16_t * sh_ups_buf) -{ - int32_t s_left = sw >> 1; - int32_t s_right = (sw >> 1); - if((sw & 1) == 0) s_left--; - - /*Horizontal blur*/ - uint16_t * sh_ups_blur_buf = lv_malloc(size * sizeof(uint16_t)); - - int32_t x; - int32_t y; - - uint16_t * sh_ups_tmp_buf = sh_ups_buf; - - for(y = 0; y < size; y++) { - int32_t v = sh_ups_tmp_buf[size - 1] * sw; - for(x = size - 1; x >= 0; x--) { - sh_ups_blur_buf[x] = v; - - /*Forget the right pixel*/ - uint32_t right_val = 0; - if(x + s_right < size) right_val = sh_ups_tmp_buf[x + s_right]; - v -= right_val; - - /*Add the left pixel*/ - uint32_t left_val; - if(x - s_left - 1 < 0) left_val = sh_ups_tmp_buf[0]; - else left_val = sh_ups_tmp_buf[x - s_left - 1]; - v += left_val; - } - lv_memcpy(sh_ups_tmp_buf, sh_ups_blur_buf, size * sizeof(uint16_t)); - sh_ups_tmp_buf += size; - } - - /*Vertical blur*/ - uint32_t i; - uint32_t max_v = LV_OPA_COVER << SHADOW_UPSCALE_SHIFT; - uint32_t max_v_div = max_v / sw; - for(i = 0; i < (uint32_t)size * size; i++) { - if(sh_ups_buf[i] == 0) continue; - else if(sh_ups_buf[i] == max_v) sh_ups_buf[i] = max_v_div; - else sh_ups_buf[i] = sh_ups_buf[i] / sw; - } - - for(x = 0; x < size; x++) { - sh_ups_tmp_buf = &sh_ups_buf[x]; - int32_t v = sh_ups_tmp_buf[0] * sw; - for(y = 0; y < size ; y++, sh_ups_tmp_buf += size) { - sh_ups_blur_buf[y] = v < 0 ? 0 : (v >> SHADOW_UPSCALE_SHIFT); - - /*Forget the top pixel*/ - uint32_t top_val; - if(y - s_right <= 0) top_val = sh_ups_tmp_buf[0]; - else top_val = sh_ups_buf[(y - s_right) * size + x]; - v -= top_val; - - /*Add the bottom pixel*/ - uint32_t bottom_val; - if(y + s_left + 1 < size) bottom_val = sh_ups_buf[(y + s_left + 1) * size + x]; - else bottom_val = sh_ups_buf[(size - 1) * size + x]; - v += bottom_val; - } - - /*Write back the result into `sh_ups_buf`*/ - sh_ups_tmp_buf = &sh_ups_buf[x]; - for(y = 0; y < size; y++, sh_ups_tmp_buf += size) { - (*sh_ups_tmp_buf) = sh_ups_blur_buf[y]; - } - } - - lv_free(sh_ups_blur_buf); -} - -#else /*LV_DRAW_SW_COMPLEX*/ - -void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords) -{ - LV_UNUSED(draw_unit); - LV_UNUSED(dsc); - LV_UNUSED(coords); - - LV_LOG_WARN("LV_DRAW_SW_COMPLEX needs to be enabled"); -} - -#endif /*LV_DRAW_SW_COMPLEX*/ - -#endif /*LV_DRAW_USE_SW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_fill.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_fill.c deleted file mode 100644 index 0aeb559..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_fill.c +++ /dev/null @@ -1,342 +0,0 @@ -/** - * @file lv_draw_sw_fill.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_area_private.h" -#include "lv_draw_sw_mask_private.h" -#include "../lv_draw_private.h" -#include "lv_draw_sw.h" -#if LV_USE_DRAW_SW - -#include "blend/lv_draw_sw_blend_private.h" -#include "lv_draw_sw_gradient_private.h" -#include "../../misc/lv_math.h" -#include "../../misc/lv_text_ap.h" -#include "../../core/lv_refr.h" -#include "../../misc/lv_assert.h" -#include "../../stdlib/lv_string.h" -#include "../lv_draw_mask.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_sw_fill(lv_draw_unit_t * draw_unit, lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) -{ - if(dsc->opa <= LV_OPA_MIN) return; - - lv_area_t bg_coords; - lv_area_copy(&bg_coords, coords); - - lv_area_t clipped_coords; - if(!lv_area_intersect(&clipped_coords, &bg_coords, draw_unit->clip_area)) return; - - lv_grad_dir_t grad_dir = dsc->grad.dir; - lv_color_t bg_color = grad_dir == LV_GRAD_DIR_NONE ? dsc->color : dsc->grad.stops[0].color; - - lv_draw_sw_blend_dsc_t blend_dsc = {0}; - blend_dsc.color = bg_color; - - /*Most simple case: just a plain rectangle*/ - if(dsc->radius == 0 && (grad_dir == LV_GRAD_DIR_NONE)) { - blend_dsc.blend_area = &bg_coords; - blend_dsc.opa = dsc->opa; - lv_draw_sw_blend(draw_unit, &blend_dsc); - return; - } - - /*Complex case: there is gradient, mask, or radius*/ -#if LV_DRAW_SW_COMPLEX == 0 - LV_LOG_WARN("Can't draw complex rectangle because LV_DRAW_SW_COMPLEX = 0"); -#else - lv_opa_t opa = dsc->opa >= LV_OPA_MAX ? LV_OPA_COVER : dsc->opa; - - /*Get the real radius. Can't be larger than the half of the shortest side */ - int32_t coords_bg_w = lv_area_get_width(&bg_coords); - int32_t coords_bg_h = lv_area_get_height(&bg_coords); - int32_t short_side = LV_MIN(coords_bg_w, coords_bg_h); - int32_t rout = LV_MIN(dsc->radius, short_side >> 1); - - /*Add a radius mask if there is a radius*/ - int32_t clipped_w = lv_area_get_width(&clipped_coords); - lv_opa_t * mask_buf = NULL; - lv_draw_sw_mask_radius_param_t mask_rout_param; - void * mask_list[2] = {NULL, NULL}; - if(rout > 0) { - mask_buf = lv_malloc(clipped_w); - lv_draw_sw_mask_radius_init(&mask_rout_param, &bg_coords, rout, false); - mask_list[0] = &mask_rout_param; - } - - int32_t h; - - lv_area_t blend_area; - blend_area.x1 = clipped_coords.x1; - blend_area.x2 = clipped_coords.x2; - - blend_dsc.mask_buf = mask_buf; - blend_dsc.blend_area = &blend_area; - blend_dsc.mask_area = &blend_area; - blend_dsc.opa = LV_OPA_COVER; - - /*Get gradient if appropriate*/ - lv_grad_t * grad = lv_gradient_get(&dsc->grad, coords_bg_w, coords_bg_h); - lv_opa_t * grad_opa_map = NULL; - bool transp = false; - if(grad && grad_dir >= LV_GRAD_DIR_HOR) { - blend_dsc.src_area = &blend_area; - blend_dsc.src_buf = grad->color_map + clipped_coords.x1 - bg_coords.x1; - uint32_t s; - for(s = 0; s < dsc->grad.stops_count; s++) { - if(dsc->grad.stops[s].opa != LV_OPA_COVER) { - transp = true; - break; - } - } - if(grad_dir == LV_GRAD_DIR_HOR) { - if(transp) grad_opa_map = grad->opa_map + clipped_coords.x1 - bg_coords.x1; - } - blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB888; - } - -#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS - - /*Prepare complex gradient*/ - if(grad_dir >= LV_GRAD_DIR_LINEAR) { - switch(grad_dir) { - case LV_GRAD_DIR_LINEAR: - lv_gradient_linear_setup(&dsc->grad, coords); - break; - case LV_GRAD_DIR_RADIAL: - lv_gradient_radial_setup(&dsc->grad, coords); - break; - case LV_GRAD_DIR_CONICAL: - lv_gradient_conical_setup(&dsc->grad, coords); - break; - default: - LV_LOG_WARN("Gradient type is not supported"); - return; - } - blend_dsc.src_area = &blend_area; - /* For complex gradients we reuse the color map buffer for the pixel data */ - blend_dsc.src_buf = grad->color_map; - grad_opa_map = grad->opa_map; - } -#endif - - /* Draw the top of the rectangle line by line and mirror it to the bottom. */ - for(h = 0; h < rout; h++) { - int32_t top_y = bg_coords.y1 + h; - int32_t bottom_y = bg_coords.y2 - h; - if(top_y < clipped_coords.y1 && bottom_y > clipped_coords.y2) continue; /*This line is clipped now*/ - - bool preblend = false; - - /* Initialize the mask to opa instead of 0xFF and blend with LV_OPA_COVER. - * It saves calculating the final opa in lv_draw_sw_blend*/ - lv_memset(mask_buf, opa, clipped_w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, top_y, clipped_w); - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - - bool hor_grad_processed = false; - if(top_y >= clipped_coords.y1) { - blend_area.y1 = top_y; - blend_area.y2 = top_y; - - switch(grad_dir) { - case LV_GRAD_DIR_VER: - blend_dsc.color = grad->color_map[top_y - bg_coords.y1]; - blend_dsc.opa = grad->opa_map[top_y - bg_coords.y1]; - break; - case LV_GRAD_DIR_HOR: - hor_grad_processed = true; - preblend = grad_opa_map != NULL; - break; -#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS - case LV_GRAD_DIR_LINEAR: - lv_gradient_linear_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, top_y - bg_coords.y1, coords_bg_w, grad); - preblend = true; - break; - case LV_GRAD_DIR_RADIAL: - lv_gradient_radial_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, top_y - bg_coords.y1, coords_bg_w, grad); - preblend = true; - break; - case LV_GRAD_DIR_CONICAL: - lv_gradient_conical_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, top_y - bg_coords.y1, coords_bg_w, grad); - preblend = true; - break; -#endif - default: - break; - } - /* pre-blend the mask */ - if(preblend) { - int32_t i; - for(i = 0; i < clipped_w; i++) { - if(grad_opa_map[i] < LV_OPA_MAX) mask_buf[i] = (mask_buf[i] * grad_opa_map[i]) >> 8; - } - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - - if(bottom_y <= clipped_coords.y2) { - blend_area.y1 = bottom_y; - blend_area.y2 = bottom_y; - - switch(grad_dir) { - case LV_GRAD_DIR_VER: - blend_dsc.color = grad->color_map[bottom_y - bg_coords.y1]; - blend_dsc.opa = grad->opa_map[bottom_y - bg_coords.y1]; - break; - case LV_GRAD_DIR_HOR: - preblend = !hor_grad_processed && (grad_opa_map != NULL); - break; -#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS - case LV_GRAD_DIR_LINEAR: - lv_gradient_linear_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, bottom_y - bg_coords.y1, coords_bg_w, grad); - preblend = true; - break; - case LV_GRAD_DIR_RADIAL: - lv_gradient_radial_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, bottom_y - bg_coords.y1, coords_bg_w, grad); - preblend = true; - break; - case LV_GRAD_DIR_CONICAL: - lv_gradient_conical_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, bottom_y - bg_coords.y1, coords_bg_w, grad); - preblend = true; - break; -#endif - default: - break; - } - /* pre-blend the mask */ - if(preblend) { - int32_t i; - if(grad_dir >= LV_GRAD_DIR_LINEAR) { - /*Need to generate the mask again, because we have mixed in the upper part of the gradient*/ - lv_memset(mask_buf, opa, clipped_w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, top_y, clipped_w); - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - for(i = 0; i < clipped_w; i++) { - if(grad_opa_map[i] < LV_OPA_MAX) mask_buf[i] = (mask_buf[i] * grad_opa_map[i]) >> 8; - } - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - } - - /* Draw the center of the rectangle.*/ - - /*If no gradient, the center is a simple rectangle*/ - if(grad_dir == LV_GRAD_DIR_NONE) { - blend_area.y1 = bg_coords.y1 + rout; - blend_area.y2 = bg_coords.y2 - rout; - blend_dsc.opa = opa; - blend_dsc.mask_buf = NULL; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - /*With gradient draw line by line*/ - else { - blend_dsc.opa = opa; - switch(grad_dir) { - case LV_GRAD_DIR_VER: - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_FULL_COVER; - break; - case LV_GRAD_DIR_HOR: - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - blend_dsc.mask_buf = grad_opa_map; - break; - case LV_GRAD_DIR_LINEAR: - case LV_GRAD_DIR_RADIAL: - case LV_GRAD_DIR_CONICAL: - blend_dsc.mask_res = transp ? LV_DRAW_SW_MASK_RES_CHANGED : LV_DRAW_SW_MASK_RES_FULL_COVER; - blend_dsc.mask_buf = grad_opa_map; - default: - break; - } - - int32_t h_start = LV_MAX(bg_coords.y1 + rout, clipped_coords.y1); - int32_t h_end = LV_MIN(bg_coords.y2 - rout, clipped_coords.y2); - for(h = h_start; h <= h_end; h++) { - blend_area.y1 = h; - blend_area.y2 = h; - - switch(grad_dir) { - case LV_GRAD_DIR_VER: - blend_dsc.color = grad->color_map[h - bg_coords.y1]; - if(opa >= LV_OPA_MAX) blend_dsc.opa = grad->opa_map[h - bg_coords.y1]; - else blend_dsc.opa = LV_OPA_MIX2(grad->opa_map[h - bg_coords.y1], opa); - break; -#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS - case LV_GRAD_DIR_LINEAR: - lv_gradient_linear_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, h - bg_coords.y1, coords_bg_w, grad); - break; - case LV_GRAD_DIR_RADIAL: - lv_gradient_radial_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, h - bg_coords.y1, coords_bg_w, grad); - break; - case LV_GRAD_DIR_CONICAL: - lv_gradient_conical_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, h - bg_coords.y1, coords_bg_w, grad); - break; -#endif - default: - break; - } - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - } - - if(mask_buf) { - lv_free(mask_buf); - lv_draw_sw_mask_free_param(&mask_rout_param); - } - if(grad) { - lv_gradient_cleanup(grad); - } -#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS - if(grad_dir >= LV_GRAD_DIR_LINEAR) { - switch(grad_dir) { - case LV_GRAD_DIR_LINEAR: - lv_gradient_linear_cleanup(&dsc->grad); - break; - case LV_GRAD_DIR_RADIAL: - lv_gradient_radial_cleanup(&dsc->grad); - break; - case LV_GRAD_DIR_CONICAL: - lv_gradient_conical_cleanup(&dsc->grad); - break; - default: - break; - } - } -#endif - -#endif -} - -#endif /*LV_USE_DRAW_SW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_gradient.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_gradient.c deleted file mode 100644 index 9262710..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_gradient.c +++ /dev/null @@ -1,668 +0,0 @@ -/** - * @file lv_draw_sw_gradient.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_sw_gradient_private.h" -#if LV_USE_DRAW_SW - -#include "../../misc/lv_types.h" -#include "../../osal/lv_os.h" -#include "../../misc/lv_math.h" - -/********************* - * DEFINES - *********************/ -#define GRAD_CM(r,g,b) lv_color_make(r,g,b) -#define GRAD_CONV(t, x) t = x - -#undef ALIGN -#if defined(LV_ARCH_64) - #define ALIGN(X) (((X) + 7) & ~7) -#else - #define ALIGN(X) (((X) + 3) & ~3) -#endif - -/********************** - * TYPEDEFS - **********************/ - -#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS - -typedef struct { - /* w = (-b(xp, yp) + sqrt(sqr(b(xp, yp)) - 4 * a * c(xp, yp))) / (2 * a) */ - int32_t x0; /* center of the start circle */ - int32_t y0; /* center of the start circle */ - int32_t r0; /* radius of the start circle */ - int32_t inv_dr; /* 1 / (r1 - r0) */ - int32_t a4; /* 4 * a */ - int32_t inv_a4; /* 1 / (4 * a) */ - int32_t dx; - /* b(xp, yp) = xp * bpx + yp * bpy + bc */ - int32_t bpx; - int32_t bpy; - int32_t bc; - lv_area_t clip_area; - lv_grad_t * cgrad; /*256 element cache buffer containing the gradient color map*/ -} lv_grad_radial_state_t; - -typedef struct { - /* w = a * xp + b * yp + c */ - int32_t a; - int32_t b; - int32_t c; - lv_grad_t * cgrad; /*256 element cache buffer containing the gradient color map*/ -} lv_grad_linear_state_t; - -typedef struct { - /* w = a * xp + b * yp + c */ - int32_t x0; - int32_t y0; - int32_t a; - int32_t da; - int32_t inv_da; - lv_grad_t * cgrad; /*256 element cache buffer containing the gradient color map*/ -} lv_grad_conical_state_t; - -#endif - -/********************** - * STATIC PROTOTYPES - **********************/ -typedef lv_result_t (*op_cache_t)(lv_grad_t * c, void * ctx); -static lv_grad_t * allocate_item(const lv_grad_dsc_t * g, int32_t w, int32_t h); - -#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS - - static inline int32_t extend_w(int32_t w, lv_grad_extend_t extend); - -#endif - -/********************** - * STATIC VARIABLE - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static lv_grad_t * allocate_item(const lv_grad_dsc_t * g, int32_t w, int32_t h) -{ - int32_t size; - switch(g->dir) { - case LV_GRAD_DIR_HOR: - case LV_GRAD_DIR_LINEAR: - case LV_GRAD_DIR_RADIAL: - case LV_GRAD_DIR_CONICAL: - size = w; - break; - case LV_GRAD_DIR_VER: - size = h; - break; - default: - size = 64; - } - - size_t req_size = ALIGN(sizeof(lv_grad_t)) + ALIGN(size * sizeof(lv_color_t)) + ALIGN(size * sizeof(lv_opa_t)); - lv_grad_t * item = lv_malloc(req_size); - LV_ASSERT_MALLOC(item); - if(item == NULL) return NULL; - - uint8_t * p = (uint8_t *)item; - item->color_map = (lv_color_t *)(p + ALIGN(sizeof(*item))); - item->opa_map = (lv_opa_t *)(p + ALIGN(sizeof(*item)) + ALIGN(size * sizeof(lv_color_t))); - item->size = size; - return item; -} - -#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS - -static inline int32_t extend_w(int32_t w, lv_grad_extend_t extend) -{ - if(extend == LV_GRAD_EXTEND_PAD) { /**< Repeat the same color*/ - return w < 0 ? 0 : LV_MIN(w, 255); - } - if(extend == LV_GRAD_EXTEND_REPEAT) { /**< Repeat the pattern*/ - return w & 255; - } - /*LV_GRAD_EXTEND_REFLECT*/ - w &= 511; - if(w > 255) - w ^= 511; /* 511 - w */ - return w; -} - -#endif - -/********************** - * FUNCTIONS - **********************/ - -lv_grad_t * lv_gradient_get(const lv_grad_dsc_t * g, int32_t w, int32_t h) -{ - /* No gradient, no cache */ - if(g->dir == LV_GRAD_DIR_NONE) return NULL; - - /* Step 1: Search cache for the given key */ - lv_grad_t * item = allocate_item(g, w, h); - if(item == NULL) { - LV_LOG_WARN("Failed to allocate item for the gradient"); - return item; - } - - /* Step 3: Fill it with the gradient, as expected */ - uint32_t i; - for(i = 0; i < item->size; i++) { - lv_gradient_color_calculate(g, item->size, i, &item->color_map[i], &item->opa_map[i]); - } - return item; -} - -void LV_ATTRIBUTE_FAST_MEM lv_gradient_color_calculate(const lv_grad_dsc_t * dsc, int32_t range, - int32_t frac, lv_grad_color_t * color_out, lv_opa_t * opa_out) -{ - lv_grad_color_t tmp; - /*Clip out-of-bounds first*/ - int32_t min = (dsc->stops[0].frac * range) >> 8; - if(frac <= min) { - GRAD_CONV(tmp, dsc->stops[0].color); - *color_out = tmp; - *opa_out = dsc->stops[0].opa; - return; - } - - int32_t max = (dsc->stops[dsc->stops_count - 1].frac * range) >> 8; - if(frac >= max) { - GRAD_CONV(tmp, dsc->stops[dsc->stops_count - 1].color); - *color_out = tmp; - *opa_out = dsc->stops[dsc->stops_count - 1].opa; - return; - } - - /*Find the 2 closest stop now*/ - int32_t d = 0; - int32_t found_i = 0; - for(uint8_t i = 1; i < dsc->stops_count; i++) { - int32_t cur = (dsc->stops[i].frac * range) >> 8; - if(frac <= cur) { - found_i = i; - break; - } - } - - LV_ASSERT(found_i != 0); - - lv_color_t one, two; - one = dsc->stops[found_i - 1].color; - two = dsc->stops[found_i].color; - min = (dsc->stops[found_i - 1].frac * range) >> 8; - max = (dsc->stops[found_i].frac * range) >> 8; - d = max - min; - - /*Then interpolate*/ - frac -= min; - lv_opa_t mix = (frac * 255) / d; - lv_opa_t imix = 255 - mix; - - *color_out = GRAD_CM(LV_UDIV255(two.red * mix + one.red * imix), - LV_UDIV255(two.green * mix + one.green * imix), - LV_UDIV255(two.blue * mix + one.blue * imix)); - - *opa_out = LV_UDIV255(dsc->stops[found_i].opa * mix + dsc->stops[found_i - 1].opa * imix); -} - -void lv_gradient_cleanup(lv_grad_t * grad) -{ - lv_free(grad); -} - -void lv_gradient_init_stops(lv_grad_dsc_t * grad, const lv_color_t colors[], const lv_opa_t opa[], - const uint8_t fracs[], int num_stops) -{ - LV_ASSERT(num_stops <= LV_GRADIENT_MAX_STOPS); - grad->stops_count = num_stops; - for(int i = 0; i < num_stops; i++) { - grad->stops[i].color = colors[i]; - grad->stops[i].opa = opa != NULL ? opa[i] : LV_OPA_COVER; - grad->stops[i].frac = fracs != NULL ? fracs[i] : 255 * i / (num_stops - 1); - } -} - -#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS - -/* - Calculate radial gradient based on the following equation: - - | P - (C1 - C0)w - C0 | = (r1 - r0)w + r0, where - - P: {xp, yp} is the point of interest - C0: {x0, y0} is the center of the start circle - C1: {x1, y1} is the center of the end circle - r0 is the radius of the start circle - r1 is the radius of the end circle - w is the unknown variable - || is the length of the vector - - The above equation can be rewritten as: - - ((r1-r0)^2 - (x1-x0)^2 - (y1-y0)^2) * w^2 + 2*((xp-x0)*(x1-x0) + (yp-y0)*(y1-y0)) * w + (-(xp-x0)^2 - (yp-y0)^) = 0 - - The roots of the quadratical equation can be obtained using the well-known formula (-b +- sqrt(b^2 - 4ac)) / 2a - We only need the more positive root. - - Let's denote - dx = x1 - x0 - dy = y1 - y0 - dr = r1 - r0 - - Thus: - - w = (-b(xp, yp) + sqrt(sqr(b(xp, yp)) - 4 * a * c(xp, yp))) / (2 * a), where - - b(xp, yp) = 2dx * xp + 2dy * yp + 2(r0 * dr - x0 * dx - y0 * dy) - c(xp, yp) = r0^2 - (xp - x0)^2 - (yp - y0)^2 - - Rewrite b(xp, yp) as: - - b(xp, yp) = xp * bpx + yp * bpy + bc, where - - bpx = 2dx - bpy = 2dy - bc = 2(r0 * dr - x0 * dx - y0 * dy) - - We can pre-calculate the constants, because they do not depend on the pixel coordinates. - -*/ - -void lv_gradient_radial_setup(lv_grad_dsc_t * dsc, const lv_area_t * coords) -{ - lv_point_t start = dsc->params.radial.focal; - lv_point_t end = dsc->params.radial.end; - lv_point_t start_extent = dsc->params.radial.focal_extent; - lv_point_t end_extent = dsc->params.radial.end_extent; - lv_grad_radial_state_t * state = lv_malloc(sizeof(lv_grad_radial_state_t)); - dsc->state = state; - - /* Convert from percentage coordinates */ - int32_t wdt = lv_area_get_width(coords); - int32_t hgt = lv_area_get_height(coords); - - start.x = lv_pct_to_px(start.x, wdt); - end.x = lv_pct_to_px(end.x, wdt); - start_extent.x = lv_pct_to_px(start_extent.x, wdt); - end_extent.x = lv_pct_to_px(end_extent.x, wdt); - start.y = lv_pct_to_px(start.y, hgt); - end.y = lv_pct_to_px(end.y, hgt); - start_extent.y = lv_pct_to_px(start_extent.y, hgt); - end_extent.y = lv_pct_to_px(end_extent.y, hgt); - - /* Calculate radii */ - int16_t r_start = lv_sqrt32(lv_sqr(start_extent.x - start.x) + lv_sqr(start_extent.y - start.y)); - int16_t r_end = lv_sqrt32(lv_sqr(end_extent.x - end.x) + lv_sqr(end_extent.y - end.y)); - LV_ASSERT(r_end != 0); - - /* Create gradient color map */ - state->cgrad = lv_gradient_get(dsc, 256, 0); - - state->x0 = start.x; - state->y0 = start.y; - state->r0 = r_start; - int32_t dr = r_end - r_start; - if(end.x == start.x && end.y == start.y) { - LV_ASSERT(dr != 0); - state->a4 = lv_sqr(dr) << 2; - state->bpx = 0; - state->bpy = 0; - state->bc = (state->r0 * dr) << 1; - state->dx = 0; - state->inv_dr = (1 << (8 + 16)) / dr; - } - else { - int32_t dx = end.x - start.x; - int32_t dy = end.y - start.y; - state->dx = dx; /* needed for incremental calculation */ - state->a4 = (lv_sqr(dr) - lv_sqr(dx) - lv_sqr(dy)) << 2; - /* b(xp, yp) = xp * bpx + yp * bpy + bc */ - state->bpx = dx << 1; - state->bpy = dy << 1; - state->bc = (state->r0 * dr - state->x0 * dx - state->y0 * dy) << 1; - } - state->inv_a4 = state->a4 != 0 ? (1 << (13 + 16)) / state->a4 : 0; - /* check for possible clipping */ - if(dsc->extend == LV_GRAD_EXTEND_PAD && - /* if extend mode is 'pad', then we can clip to the end circle's bounding box, if the start circle is entirely within the end circle */ - (lv_sqr(start.x - end.x) + lv_sqr(start.y - end.y) < lv_sqr(r_end - r_start))) { - if(r_end > r_start) { - lv_area_set(&state->clip_area, end.x - r_end, end.y - r_end, end.x + r_end, end.y + r_end); - } - else { - lv_area_set(&state->clip_area, start.x - r_start, start.y - r_start, start.x + r_start, start.y + r_start); - } - } - else { - state->clip_area.x1 = -0x7fffffff; - } -} - -void lv_gradient_radial_cleanup(lv_grad_dsc_t * dsc) -{ - lv_grad_radial_state_t * state = dsc->state; - if(state == NULL) - return; - if(state->cgrad) - lv_gradient_cleanup(state->cgrad); - lv_free(state); -} - -void LV_ATTRIBUTE_FAST_MEM lv_gradient_radial_get_line(lv_grad_dsc_t * dsc, int32_t xp, int32_t yp, - int32_t width, lv_grad_t * result) -{ - lv_grad_radial_state_t * state = (lv_grad_radial_state_t *)dsc->state; - lv_color_t * buf = result->color_map; - lv_opa_t * opa = result->opa_map; - lv_grad_t * grad = state->cgrad; - - int32_t w; /* the result: this is an offset into the 256 element gradient color table */ - int32_t b, db, c, dc; - - /* check for possible clipping */ - if(state->clip_area.x1 != -0x7fffffff) { - /* fill line with end color for pixels outside the clipped region */ - lv_color_t * _buf = buf; - lv_opa_t * _opa = opa; - lv_color_t _c = grad->color_map[255]; - lv_opa_t _o = grad->opa_map[255]; - int32_t _w = width; - for(; _w > 0; _w--) { - *_buf++ = _c; - *_opa++ = _o; - } - /* is this line fully outside the clip area? */ - if(yp < state->clip_area.y1 || - yp >= state->clip_area.y2 || - xp >= state->clip_area.x2 || - xp + width < state->clip_area.x1) { - return; - } - else { /* not fully outside: clip line to the bounding box */ - int32_t _x1 = LV_MAX(xp, state->clip_area.x1); - int32_t _x2 = LV_MIN(xp + width, state->clip_area.x2); - buf += _x1 - xp; - opa += _x1 - xp; - xp = _x1; - width = _x2 - _x1; - } - } - - b = xp * state->bpx + yp * state->bpy + state->bc; - c = lv_sqr(state->r0) - lv_sqr(xp - state->x0) - lv_sqr(yp - state->y0); - /* We can save some calculations by using the previous values of b and c */ - db = state->dx << 1; - dc = ((xp - state->x0) << 1) + 1; - - if(state->a4 == 0) { /* not a quadratic equation: solve linear equation: w = -c/b */ - for(; width > 0; width--) { - w = extend_w(b == 0 ? 0 : -(c << 8) / b, dsc->extend); - *buf++ = grad->color_map[w]; - *opa++ = grad->opa_map[w]; - b += db; - c -= dc; - dc += 2; - } - } - else { /* solve quadratical equation */ - if(state->bpx || - state->bpy) { /* general case (circles are not concentric): w = (-b + sqrt(b^2 - 4ac))/2a (we only need the more positive root)*/ - int32_t a4 = state->a4 >> 4; - for(; width > 0; width--) { - int32_t det = lv_sqr(b >> 4) - (a4 * (c >> 4)); /* b^2 shifted down by 2*4=8, 4ac shifted down by 8 */ - /* check determinant: if negative, then there is no solution: use starting color */ - w = det < 0 ? 0 : extend_w(((lv_sqrt32(det) - (b >> 4)) * state->inv_a4) >> 16, - dsc->extend); /* square root shifted down by 4 (includes *256 to set output range) */ - *buf++ = grad->color_map[w]; - *opa++ = grad->opa_map[w]; - b += db; - c -= dc; - dc += 2; - } - } - else { /* special case: concentric circles: w = (sqrt((xp-x0)^2 + (yx-y0)^2)-r0)/(r1-r0) */ - c = lv_sqr(xp - state->x0) + lv_sqr(yp - state->y0); - for(; width > 0; width--) { - w = extend_w((((lv_sqrt32(c) - state->r0)) * state->inv_dr) >> 16, dsc->extend); - *buf++ = grad->color_map[w]; - *opa++ = grad->opa_map[w]; - c += dc; - dc += 2; - } - } - } -} - -/* - Calculate linear gradient based on the following equation: - - w = ((P - C0) x (C1 - C0)) / | C1 - C0 |^2, where - - P: {xp, yp} is the point of interest - C0: {x0, y0} is the start point of the gradient vector - C1: {x1, y1} is the end point of the gradient vector - w is the unknown variable - - || is the length of the vector - x is a dot product - - The above equation can be rewritten as: - - w = xp * (dx / (dx^2 + dy^2)) + yp * (dy / (dx^2 + dy^2)) - (x0 * dx + y0 * dy) / (dx^2 + dy^2), where - - dx = x1 - x0 - dy = y1 - y0 - - We can pre-calculate the constants, because they do not depend on the pixel coordinates. - -*/ - -void lv_gradient_linear_setup(lv_grad_dsc_t * dsc, const lv_area_t * coords) -{ - lv_point_t start = dsc->params.linear.start; - lv_point_t end = dsc->params.linear.end; - lv_grad_linear_state_t * state = lv_malloc(sizeof(lv_grad_linear_state_t)); - dsc->state = state; - - /* Create gradient color map */ - state->cgrad = lv_gradient_get(dsc, 256, 0); - - /* Convert from percentage coordinates */ - int32_t wdt = lv_area_get_width(coords); - int32_t hgt = lv_area_get_height(coords); - - start.x = lv_pct_to_px(start.x, wdt); - end.x = lv_pct_to_px(end.x, wdt); - start.y = lv_pct_to_px(start.y, hgt); - end.y = lv_pct_to_px(end.y, hgt); - - /* Precalculate constants */ - int32_t dx = end.x - start.x; - int32_t dy = end.y - start.y; - - int32_t l2 = lv_sqr(dx) + lv_sqr(dy); - state->a = (dx << 16) / l2; - state->b = (dy << 16) / l2; - state->c = ((start.x * dx + start.y * dy) << 16) / l2; -} - -void lv_gradient_linear_cleanup(lv_grad_dsc_t * dsc) -{ - lv_grad_linear_state_t * state = dsc->state; - if(state == NULL) - return; - if(state->cgrad) - lv_free(state->cgrad); - lv_free(state); -} - -void LV_ATTRIBUTE_FAST_MEM lv_gradient_linear_get_line(lv_grad_dsc_t * dsc, int32_t xp, int32_t yp, - int32_t width, lv_grad_t * result) -{ - lv_grad_linear_state_t * state = (lv_grad_linear_state_t *)dsc->state; - lv_color_t * buf = result->color_map; - lv_opa_t * opa = result->opa_map; - lv_grad_t * grad = state->cgrad; - - int32_t w; /* the result: this is an offset into the 256 element gradient color table */ - int32_t x, d; - - x = xp * state->a + yp * state->b - state->c; - d = state->a; - - for(; width > 0; width--) { - w = extend_w(x >> 8, dsc->extend); - *buf++ = grad->color_map[w]; - *opa++ = grad->opa_map[w]; - x += d; - } -} - -/* - Calculate conical gradient based on the following equation: - - w = (atan((yp - y0)/(xp - x0)) - alpha) / (beta - alpha), where - - P: {xp, yp} is the point of interest - C0: {x0, y0} is the center of the gradient - alpha is the start angle - beta is the end angle - w is the unknown variable -*/ - -void lv_gradient_conical_setup(lv_grad_dsc_t * dsc, const lv_area_t * coords) -{ - lv_point_t c0 = dsc->params.conical.center; - int32_t alpha = dsc->params.conical.start_angle % 360; - int32_t beta = dsc->params.conical.end_angle % 360; - lv_grad_conical_state_t * state = lv_malloc(sizeof(lv_grad_conical_state_t)); - dsc->state = state; - - /* Create gradient color map */ - state->cgrad = lv_gradient_get(dsc, 256, 0); - - /* Convert from percentage coordinates */ - int32_t wdt = lv_area_get_width(coords); - int32_t hgt = lv_area_get_height(coords); - - c0.x = lv_pct_to_px(c0.x, wdt); - c0.y = lv_pct_to_px(c0.y, hgt); - - /* Precalculate constants */ - if(beta <= alpha) - beta += 360; - state->x0 = c0.x; - state->y0 = c0.y; - state->a = alpha; - state->da = beta - alpha; - state->inv_da = (1 << 16) / (beta - alpha); -} - -void lv_gradient_conical_cleanup(lv_grad_dsc_t * dsc) -{ - lv_grad_conical_state_t * state = dsc->state; - if(state == NULL) - return; - if(state->cgrad) - lv_free(state->cgrad); - lv_free(state); -} - -void LV_ATTRIBUTE_FAST_MEM lv_gradient_conical_get_line(lv_grad_dsc_t * dsc, int32_t xp, int32_t yp, - int32_t width, lv_grad_t * result) -{ - lv_grad_conical_state_t * state = (lv_grad_conical_state_t *)dsc->state; - lv_color_t * buf = result->color_map; - lv_opa_t * opa = result->opa_map; - lv_grad_t * grad = state->cgrad; - - int32_t w; /* the result: this is an offset into the 256 element gradient color table */ - int32_t dx = xp - state->x0; - int32_t dy = yp - state->y0; - - if(dy == 0) { /* we will eventually go through the center of the conical: need an extra test in the loop to avoid both dx and dy being zero in atan2 */ - for(; width > 0; width--) { - if(dx == 0) { - w = 0; - } - else { - int32_t d = lv_atan2(dy, dx) - state->a; - if(d < 0) - d += 360; - w = extend_w((d * state->inv_da) >> 8, dsc->extend); - } - *buf++ = grad->color_map[w]; - *opa++ = grad->opa_map[w]; - dx++; - } - } - else { - for(; width > 0; width--) { - int32_t d = lv_atan2(dy, dx) - state->a; - if(d < 0) - d += 360; - w = extend_w((d * state->inv_da) >> 8, dsc->extend); - *buf++ = grad->color_map[w]; - *opa++ = grad->opa_map[w]; - dx++; - } - } -} - -void lv_grad_linear_init(lv_grad_dsc_t * dsc, int32_t from_x, int32_t from_y, int32_t to_x, int32_t to_y, - lv_grad_extend_t extend) -{ - dsc->dir = LV_GRAD_DIR_LINEAR; - dsc->params.linear.start.x = from_x; - dsc->params.linear.start.y = from_y; - dsc->params.linear.end.x = to_x; - dsc->params.linear.end.y = to_y; - dsc->extend = extend; -} - -void lv_grad_radial_init(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t to_x, int32_t to_y, - lv_grad_extend_t extend) -{ - dsc->dir = LV_GRAD_DIR_RADIAL; - dsc->params.radial.focal.x = center_x; - dsc->params.radial.focal.y = center_y; - dsc->params.radial.focal_extent.x = center_x; - dsc->params.radial.focal_extent.y = center_y; - dsc->params.radial.end.x = center_x; - dsc->params.radial.end.y = center_y; - dsc->params.radial.end_extent.x = to_x; - dsc->params.radial.end_extent.y = to_y; - dsc->extend = extend; -} - -void lv_grad_conical_init(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t start_angle, - int32_t end_angle, lv_grad_extend_t extend) -{ - dsc->dir = LV_GRAD_DIR_CONICAL; - dsc->params.conical.center.x = center_x; - dsc->params.conical.center.y = center_y; - dsc->params.conical.start_angle = start_angle; - dsc->params.conical.end_angle = end_angle; - dsc->extend = extend; -} - -void lv_grad_radial_set_focal(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t radius) -{ - dsc->params.radial.focal.x = center_x; - dsc->params.radial.focal.y = center_y; - dsc->params.radial.focal_extent.x = center_x + radius; - dsc->params.radial.focal_extent.y = center_y; -} - -#endif /* LV_USE_DRAW_SW_COMPLEX_GRADIENTS */ - -#endif /*LV_USE_DRAW_SW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_gradient.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_gradient.h deleted file mode 100644 index 01029cb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_gradient.h +++ /dev/null @@ -1,203 +0,0 @@ -/** - * @file lv_draw_sw_gradient.h - * - */ - -#ifndef LV_DRAW_SW_GRADIENT_H -#define LV_DRAW_SW_GRADIENT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_color.h" -#include "../../misc/lv_style.h" - -#if LV_USE_DRAW_SW - -/********************* - * DEFINES - *********************/ -#if LV_GRADIENT_MAX_STOPS < 2 -#error LVGL needs at least 2 stops for gradients. Please increase the LV_GRADIENT_MAX_STOPS -#endif - -#define LV_GRAD_LEFT LV_PCT(0) -#define LV_GRAD_RIGHT LV_PCT(100) -#define LV_GRAD_TOP LV_PCT(0) -#define LV_GRAD_BOTTOM LV_PCT(100) -#define LV_GRAD_CENTER LV_PCT(50) - -/********************** - * TYPEDEFS - **********************/ -typedef lv_color_t lv_grad_color_t; - -/********************** - * PROTOTYPES - **********************/ -/** Compute the color in the given gradient and fraction - * Gradient are specified in a virtual [0-255] range, so this function scales the virtual range to the given range - * @param dsc The gradient descriptor to use - * @param range The range to use in computation. - * @param frac The current part used in the range. frac is in [0; range] - * @param color_out Calculated gradient color - * @param opa_out Calculated opacity - */ - -void /* LV_ATTRIBUTE_FAST_MEM */ lv_gradient_color_calculate(const lv_grad_dsc_t * dsc, int32_t range, - int32_t frac, lv_grad_color_t * color_out, lv_opa_t * opa_out); - -/** Get a gradient cache from the given parameters */ -lv_grad_t * lv_gradient_get(const lv_grad_dsc_t * gradient, int32_t w, int32_t h); - -/** - * Clean up the gradient item after it was get with `lv_grad_get_from_cache`. - * @param grad pointer to a gradient - */ -void lv_gradient_cleanup(lv_grad_t * grad); - -/** - * Initialize gradient color map from a table - * @param grad pointer to a gradient descriptor - * @param colors color array - * @param fracs position array (0..255): if NULL, then colors are distributed evenly - * @param opa opacity array: if NULL, then LV_OPA_COVER is assumed - * @param num_stops number of gradient stops (1..LV_GRADIENT_MAX_STOPS) - */ -void lv_gradient_init_stops(lv_grad_dsc_t * grad, const lv_color_t colors[], const lv_opa_t opa[], - const uint8_t fracs[], int num_stops); - -#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS - -/** - * Helper function to initialize linear gradient - * @param dsc gradient descriptor - * @param from_x start x position: can be a coordinate or an lv_pct() value - * predefined constants LV_GRAD_LEFT, LV_GRAD_RIGHT, LV_GRAD_TOP, LV_GRAD_BOTTOM, LV_GRAD_CENTER can be used as well - * @param from_y start y position - * @param to_x end x position - * @param to_y end y position - * @param extend one of LV_GRAD_EXTEND_PAD, LV_GRAD_EXTEND_REPEAT or LV_GRAD_EXTEND_REFLECT - */ -void lv_grad_linear_init(lv_grad_dsc_t * dsc, int32_t from_x, int32_t from_y, int32_t to_x, int32_t to_y, - lv_grad_extend_t extend); - -/** - * Helper function to initialize radial gradient - * @param dsc gradient descriptor - * @param center_x center x position: can be a coordinate or an lv_pct() value - * predefined constants LV_GRAD_LEFT, LV_GRAD_RIGHT, LV_GRAD_TOP, LV_GRAD_BOTTOM, LV_GRAD_CENTER can be used as well - * @param center_y center y position - * @param to_x point on the end circle x position - * @param to_y point on the end circle y position - * @param extend one of LV_GRAD_EXTEND_PAD, LV_GRAD_EXTEND_REPEAT or LV_GRAD_EXTEND_REFLECT - */ -void lv_grad_radial_init(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t to_x, int32_t to_y, - lv_grad_extend_t extend); - -/** - * Set focal (starting) circle of a radial gradient - * @param dsc gradient descriptor - * @param center_x center x position: can be a coordinate or an lv_pct() value - * predefined constants LV_GRAD_LEFT, LV_GRAD_RIGHT, LV_GRAD_TOP, LV_GRAD_BOTTOM, LV_GRAD_CENTER can be used as well - * @param center_y center y position - * @param radius radius of the starting circle (NOTE: this must be a scalar number, not percentage) - */ -void lv_grad_radial_set_focal(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t radius); - -/** - * Helper function to initialize conical gradient - * @param dsc gradient descriptor - * @param center_x center x position: can be a coordinate or an lv_pct() value - * predefined constants LV_GRAD_LEFT, LV_GRAD_RIGHT, LV_GRAD_TOP, LV_GRAD_BOTTOM, LV_GRAD_CENTER can be used as well - * @param center_y center y position - * @param start_angle start angle in degrees - * @param end_angle end angle in degrees - * @param extend one of LV_GRAD_EXTEND_PAD, LV_GRAD_EXTEND_REPEAT or LV_GRAD_EXTEND_REFLECT - */ -void lv_grad_conical_init(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t start_angle, - int32_t end_angle, lv_grad_extend_t extend); - -/** - * Calculate constants from the given parameters that are used during rendering - * @param dsc gradient descriptor - */ -void lv_gradient_linear_setup(lv_grad_dsc_t * dsc, const lv_area_t * coords); - -/** - * Free up the allocated memory for the gradient calculation - * @param dsc gradient descriptor - */ -void lv_gradient_linear_cleanup(lv_grad_dsc_t * dsc); - -/** - * Calculate a line segment of a linear gradient - * @param dsc gradient descriptor - * @param xp starting point x coordinate in gradient space - * @param yp starting point y coordinate in gradient space - * @param width width of the line segment in pixels - * @param result color buffer for the resulting line segment - */ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_gradient_linear_get_line(lv_grad_dsc_t * dsc, int32_t xp, int32_t yp, int32_t width, - lv_grad_t * result); - -/** - * Calculate constants from the given parameters that are used during rendering - * @param dsc gradient descriptor - */ -void lv_gradient_radial_setup(lv_grad_dsc_t * dsc, const lv_area_t * coords); - -/** - * Free up the allocated memory for the gradient calculation - * @param dsc gradient descriptor - */ -void lv_gradient_radial_cleanup(lv_grad_dsc_t * dsc); - -/** - * Calculate a line segment of a radial gradient - * @param dsc gradient descriptor - * @param xp starting point x coordinate in gradient space - * @param yp starting point y coordinate in gradient space - * @param width width of the line segment in pixels - * @param result color buffer for the resulting line segment - */ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_gradient_radial_get_line(lv_grad_dsc_t * dsc, int32_t xp, int32_t yp, int32_t width, - lv_grad_t * result); - -/** - * Calculate constants from the given parameters that are used during rendering - * @param dsc gradient descriptor - */ -void lv_gradient_conical_setup(lv_grad_dsc_t * dsc, const lv_area_t * coords); - -/** - * Free up the allocated memory for the gradient calculation - * @param dsc gradient descriptor - */ -void lv_gradient_conical_cleanup(lv_grad_dsc_t * dsc); - -/** - * Calculate a line segment of a conical gradient - * @param dsc gradient descriptor - * @param xp starting point x coordinate in gradient space - * @param yp starting point y coordinate in gradient space - * @param width width of the line segment in pixels - * @param result color buffer for the resulting line segment - */ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_gradient_conical_get_line(lv_grad_dsc_t * dsc, int32_t xp, int32_t yp, - int32_t width, - lv_grad_t * result); - -#endif /*LV_USE_DRAW_SW_COMPLEX_GRADIENTS*/ - -#endif /*LV_USE_DRAW_SW*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_GRADIENT_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_gradient_private.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_gradient_private.h deleted file mode 100644 index 7e2f2ab..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_gradient_private.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @file lv_draw_sw_gradient_private.h - * - */ - -#ifndef LV_DRAW_SW_GRADIENT_PRIVATE_H -#define LV_DRAW_SW_GRADIENT_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_sw_gradient.h" - -#if LV_USE_DRAW_SW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_grad_t { - lv_color_t * color_map; - lv_opa_t * opa_map; - uint32_t size; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_DRAW_SW */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_GRADIENT_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_img.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_img.c deleted file mode 100644 index b7341cc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_img.c +++ /dev/null @@ -1,467 +0,0 @@ -/** - * @file lv_draw_sw_img.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_area_private.h" -#include "blend/lv_draw_sw_blend_private.h" -#include "../lv_image_decoder_private.h" -#include "../lv_draw_image_private.h" -#include "../lv_draw_private.h" -#include "lv_draw_sw.h" -#if LV_USE_DRAW_SW - -#include "../../display/lv_display.h" -#include "../../display/lv_display_private.h" -#include "../../misc/lv_log.h" -#include "../../core/lv_refr_private.h" -#include "../../stdlib/lv_mem.h" -#include "../../misc/lv_math.h" -#include "../../misc/lv_color.h" -#include "../../stdlib/lv_string.h" -#include "../../core/lv_global.h" - -#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM - #include "arm2d/lv_draw_sw_helium.h" -#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM - #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ -#define MAX_BUF_SIZE (uint32_t) (4 * lv_display_get_horizontal_resolution(lv_refr_get_disp_refreshing()) * lv_color_format_get_size(lv_display_get_color_format(lv_refr_get_disp_refreshing()))) - -#ifndef LV_DRAW_SW_IMAGE - #define LV_DRAW_SW_IMAGE(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB565_RECOLOR - #define LV_DRAW_SW_RGB565_RECOLOR(...) LV_RESULT_INVALID -#endif - -#ifndef LV_DRAW_SW_RGB888_RECOLOR - #define LV_DRAW_SW_RGB888_RECOLOR(...) LV_RESULT_INVALID -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void img_draw_core(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, - const lv_area_t * img_coords, const lv_area_t * clipped_img_area); - -/********************** - * STATIC VARIABLES - **********************/ -#define _draw_info LV_GLOBAL_DEFAULT()->draw_info - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_sw_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords) -{ - lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; - - /*It can happen that nothing was draw on a layer and therefore its buffer is not allocated. - *In this case just return. */ - if(layer_to_draw->draw_buf == NULL) return; - - lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; - new_draw_dsc.src = layer_to_draw->draw_buf; - lv_draw_sw_image(draw_unit, &new_draw_dsc, coords); -#if LV_USE_LAYER_DEBUG || LV_USE_PARALLEL_DRAW_DEBUG - lv_area_t area_rot; - lv_area_copy(&area_rot, coords); - if(draw_dsc->rotation || draw_dsc->scale_x != LV_SCALE_NONE || draw_dsc->scale_y != LV_SCALE_NONE) { - int32_t w = lv_area_get_width(coords); - int32_t h = lv_area_get_height(coords); - - lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, - &draw_dsc->pivot); - - area_rot.x1 += coords->x1; - area_rot.y1 += coords->y1; - area_rot.x2 += coords->x1; - area_rot.y2 += coords->y1; - } - lv_area_t draw_area; - if(!lv_area_intersect(&draw_area, &area_rot, draw_unit->clip_area)) return; -#endif - -#if LV_USE_LAYER_DEBUG - { - lv_draw_fill_dsc_t fill_dsc; - lv_draw_fill_dsc_init(&fill_dsc); - fill_dsc.color = lv_color_hex(layer_to_draw->color_format == LV_COLOR_FORMAT_ARGB8888 ? 0xff0000 : 0x00ff00); - fill_dsc.opa = LV_OPA_20; - lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); - - lv_draw_border_dsc_t border_dsc; - lv_draw_border_dsc_init(&border_dsc); - border_dsc.color = fill_dsc.color; - border_dsc.opa = LV_OPA_60; - border_dsc.width = 2; - lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); - } -#endif - -#if LV_USE_PARALLEL_DRAW_DEBUG - { - uint32_t idx = 0; - lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head; - while(draw_unit_tmp != draw_unit) { - draw_unit_tmp = draw_unit_tmp->next; - idx++; - } - lv_draw_fill_dsc_t fill_dsc; - lv_draw_fill_dsc_init(&fill_dsc); - fill_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); - fill_dsc.opa = LV_OPA_10; - lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); - - lv_draw_border_dsc_t border_dsc; - lv_draw_border_dsc_init(&border_dsc); - border_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); - border_dsc.opa = LV_OPA_100; - border_dsc.width = 2; - lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); - - lv_point_t txt_size; - lv_text_get_size(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); - - lv_area_t txt_area; - txt_area.x1 = draw_area.x1; - txt_area.x2 = draw_area.x1 + txt_size.x - 1; - txt_area.y2 = draw_area.y2; - txt_area.y1 = draw_area.y2 - txt_size.y + 1; - - lv_draw_fill_dsc_init(&fill_dsc); - fill_dsc.color = lv_color_black(); - lv_draw_sw_fill(draw_unit, &fill_dsc, &txt_area); - - char buf[8]; - lv_snprintf(buf, sizeof(buf), "%d", idx); - lv_draw_label_dsc_t label_dsc; - lv_draw_label_dsc_init(&label_dsc); - label_dsc.color = lv_color_white(); - label_dsc.text = buf; - lv_draw_sw_label(draw_unit, &label_dsc, &txt_area); - } -#endif -} - -void lv_draw_sw_image(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords) -{ - if(!draw_dsc->tile) { - lv_draw_image_normal_helper(draw_unit, draw_dsc, coords, img_draw_core); - } - else { - lv_draw_image_tiled_helper(draw_unit, draw_dsc, coords, img_draw_core); - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void img_draw_core(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, - const lv_area_t * img_coords, const lv_area_t * clipped_img_area) -{ - bool transformed = draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || - draw_dsc->scale_y != LV_SCALE_NONE ? true : false; - - bool masked = draw_dsc->bitmap_mask_src != NULL; - - lv_draw_sw_blend_dsc_t blend_dsc; - const lv_draw_buf_t * decoded = decoder_dsc->decoded; - const uint8_t * src_buf = decoded->data; - const lv_image_header_t * header = &decoded->header; - uint32_t img_stride = decoded->header.stride; - lv_color_format_t cf = decoded->header.cf; - - lv_memzero(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t)); - blend_dsc.opa = draw_dsc->opa; - blend_dsc.blend_mode = draw_dsc->blend_mode; - blend_dsc.src_stride = img_stride; - - if(!transformed && !masked && cf == LV_COLOR_FORMAT_A8) { - lv_area_t clipped_coords; - if(!lv_area_intersect(&clipped_coords, img_coords, draw_unit->clip_area)) return; - - blend_dsc.mask_buf = (lv_opa_t *)src_buf; - blend_dsc.mask_area = img_coords; - blend_dsc.mask_stride = img_stride; - blend_dsc.src_buf = NULL; - blend_dsc.color = draw_dsc->recolor; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - - blend_dsc.blend_area = img_coords; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - else if(!transformed && !masked && cf == LV_COLOR_FORMAT_RGB565A8 && draw_dsc->recolor_opa <= LV_OPA_MIN) { - int32_t src_h = lv_area_get_height(img_coords); - int32_t src_w = lv_area_get_width(img_coords); - blend_dsc.src_area = img_coords; - blend_dsc.src_buf = src_buf; - blend_dsc.mask_buf = (lv_opa_t *)src_buf; - blend_dsc.mask_buf += img_stride * src_w / header->w * src_h; - /** - * Note, for RGB565A8, lacking of stride parameter, we always use - * always half of RGB map stride as alpha map stride. The image should - * be generated in this way too. - */ - blend_dsc.mask_stride = img_stride / 2; - blend_dsc.blend_area = img_coords; - blend_dsc.mask_area = img_coords; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB565; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - /*The simplest case just copy the pixels into the draw_buf. Blending will convert the colors if needed*/ - else if(!transformed && !masked && draw_dsc->recolor_opa <= LV_OPA_MIN) { - blend_dsc.src_area = img_coords; - blend_dsc.src_buf = src_buf; - blend_dsc.blend_area = img_coords; - blend_dsc.src_color_format = cf; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - /*Handle masked RGB565, RGB888, XRGB888, or ARGB8888 images*/ - else if(!transformed && masked && draw_dsc->recolor_opa <= LV_OPA_MIN) { - lv_image_decoder_dsc_t mask_decoder_dsc; - lv_area_t mask_area; - lv_result_t decoder_res = lv_image_decoder_open(&mask_decoder_dsc, draw_dsc->bitmap_mask_src, NULL); - if(decoder_res == LV_RESULT_OK && mask_decoder_dsc.decoded) { - if(mask_decoder_dsc.decoded->header.cf == LV_COLOR_FORMAT_A8 || - mask_decoder_dsc.decoded->header.cf == LV_COLOR_FORMAT_L8) { - const lv_draw_buf_t * mask_img = mask_decoder_dsc.decoded; - blend_dsc.mask_buf = mask_img->data; - blend_dsc.mask_stride = mask_img->header.stride; - - const lv_area_t * image_area; - if(lv_area_get_width(&draw_dsc->image_area) < 0) image_area = img_coords; - else image_area = &draw_dsc->image_area; - lv_area_set(&mask_area, 0, 0, mask_img->header.w - 1, mask_img->header.h - 1); - lv_area_align(image_area, &mask_area, LV_ALIGN_CENTER, 0, 0); - blend_dsc.mask_area = &mask_area; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - else { - LV_LOG_WARN("The mask image is not A8/L8 format. Drawing the image without mask."); - } - } - else { - LV_LOG_WARN("Couldn't decode the mask image. Drawing the image without mask."); - } - - blend_dsc.src_area = img_coords; - blend_dsc.src_buf = src_buf; - blend_dsc.blend_area = img_coords; - blend_dsc.src_color_format = cf; - lv_draw_sw_blend(draw_unit, &blend_dsc); - - if(decoder_res == LV_RESULT_OK) lv_image_decoder_close(&mask_decoder_dsc); - } - /* check whether it is possible to accelerate the operation in synchronous mode */ - else if(LV_RESULT_INVALID == LV_DRAW_SW_IMAGE(transformed, /* whether require transform */ - cf, /* image format */ - src_buf, /* image buffer */ - img_coords, /* src_h, src_w, src_x1, src_y1 */ - img_stride, /* image stride */ - clipped_img_area, /* blend area */ - draw_unit, /* target buffer, buffer width, buffer height, buffer stride */ - draw_dsc)) { /* opa, recolour_opa and colour */ - /*In the other cases every pixel need to be checked one-by-one*/ - - lv_area_t blend_area = *clipped_img_area; - blend_dsc.blend_area = &blend_area; - - int32_t src_w = lv_area_get_width(img_coords); - int32_t src_h = lv_area_get_height(img_coords); - int32_t blend_w = lv_area_get_width(&blend_area); - int32_t blend_h = lv_area_get_height(&blend_area); - - lv_color_format_t cf_final = cf; - if((cf == LV_COLOR_FORMAT_L8) && (draw_dsc->recolor_opa > LV_OPA_MIN)) { - cf_final = LV_COLOR_FORMAT_ARGB8888; - } - if(transformed) { - if(cf_final == LV_COLOR_FORMAT_RGB888 || cf_final == LV_COLOR_FORMAT_XRGB8888) cf_final = LV_COLOR_FORMAT_ARGB8888; - else if(cf_final == LV_COLOR_FORMAT_RGB565) cf_final = LV_COLOR_FORMAT_RGB565A8; - else if(cf_final == LV_COLOR_FORMAT_L8) cf_final = LV_COLOR_FORMAT_AL88; - } - - uint8_t * tmp_buf; - uint32_t px_size = lv_color_format_get_size(cf_final); - int32_t buf_h; - if(cf_final == LV_COLOR_FORMAT_RGB565A8) { - uint32_t buf_stride = blend_w * 3; - buf_h = MAX_BUF_SIZE / buf_stride; - if(buf_h > blend_h) buf_h = blend_h; - tmp_buf = lv_malloc(buf_stride * buf_h); - } - else { - uint32_t buf_stride = blend_w * lv_color_format_get_size(cf_final); - buf_h = MAX_BUF_SIZE / buf_stride; - if(buf_h > blend_h) buf_h = blend_h; - tmp_buf = lv_malloc(buf_stride * buf_h); - } - LV_ASSERT_MALLOC(tmp_buf); - - blend_dsc.src_buf = tmp_buf; - blend_dsc.src_color_format = cf_final; - int32_t y_last = blend_area.y2; - blend_area.y2 = blend_area.y1 + buf_h - 1; - - blend_dsc.src_area = &blend_area; - if(cf_final == LV_COLOR_FORMAT_RGB565A8) { - /*RGB565A8 images will blended as RGB565 + mask - *Therefore the stride can be different. */ - blend_dsc.src_stride = blend_w * 2; - blend_dsc.mask_buf = tmp_buf + blend_w * 2 * buf_h; - blend_dsc.mask_stride = blend_w; - blend_dsc.mask_area = &blend_area; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB565; - } - else if(cf_final == LV_COLOR_FORMAT_A8) { - blend_dsc.mask_buf = blend_dsc.src_buf; - blend_dsc.mask_stride = blend_w; - blend_dsc.mask_area = &blend_area; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - blend_dsc.color = draw_dsc->recolor; - blend_dsc.src_buf = NULL; - } - else { - blend_dsc.src_stride = blend_w * lv_color_format_get_size(cf_final); - } - - while(blend_area.y1 <= y_last) { - /*Apply transformations if any or separate the channels*/ - lv_area_t relative_area; - lv_area_copy(&relative_area, &blend_area); - lv_area_move(&relative_area, -img_coords->x1, -img_coords->y1); - if(transformed) { - lv_draw_sw_transform(draw_unit, &relative_area, src_buf, src_w, src_h, img_stride, - draw_dsc, sup, cf, tmp_buf); - } - else if(draw_dsc->recolor_opa >= LV_OPA_MIN) { - int32_t h = lv_area_get_height(&relative_area); - if(cf == LV_COLOR_FORMAT_L8) { - /* L8 is recolored, but not transformed: copy L8 image into ARGB8888 temporary buffer */ - const uint8_t * src_buf_tmp = src_buf + img_stride * relative_area.y1 + relative_area.x1 * 1; - lv_color32_t * dest_buf_tmp = (lv_color32_t *)tmp_buf; - int32_t i, x; - for(i = 0; i < h; i++) { - for(x = 0; x < blend_w; x++) { - dest_buf_tmp[x].red = src_buf_tmp[x]; - dest_buf_tmp[x].green = src_buf_tmp[x]; - dest_buf_tmp[x].blue = src_buf_tmp[x]; - dest_buf_tmp[x].alpha = 255; - } - dest_buf_tmp += blend_w; - src_buf_tmp += img_stride; - } - } - else if(cf_final == LV_COLOR_FORMAT_RGB565A8) { - uint32_t stride_px = img_stride / 2; - const uint8_t * rgb_src_buf = src_buf + stride_px * 2 * relative_area.y1 + relative_area.x1 * 2; - const uint8_t * a_src_buf = src_buf + stride_px * 2 * src_h + stride_px * relative_area.y1 + - relative_area.x1; - uint8_t * rgb_dest_buf = tmp_buf; - uint8_t * a_dest_buf = (uint8_t *)blend_dsc.mask_buf; - int32_t i; - for(i = 0; i < h; i++) { - lv_memcpy(rgb_dest_buf, rgb_src_buf, blend_w * 2); - lv_memcpy(a_dest_buf, a_src_buf, blend_w); - rgb_src_buf += stride_px * 2; - a_src_buf += stride_px; - rgb_dest_buf += blend_w * 2; - a_dest_buf += blend_w; - } - } - else if(cf_final != LV_COLOR_FORMAT_A8) { - const uint8_t * src_buf_tmp = src_buf + img_stride * relative_area.y1 + relative_area.x1 * px_size; - uint8_t * dest_buf_tmp = tmp_buf; - int32_t i; - for(i = 0; i < h; i++) { - lv_memcpy(dest_buf_tmp, src_buf_tmp, blend_w * px_size); - dest_buf_tmp += blend_w * px_size; - src_buf_tmp += img_stride; - } - } - } - - /*Apply recolor*/ - if(draw_dsc->recolor_opa > LV_OPA_MIN) { - lv_color_t color = draw_dsc->recolor; - lv_opa_t mix = draw_dsc->recolor_opa; - lv_opa_t mix_inv = 255 - mix; - if(cf_final == LV_COLOR_FORMAT_RGB565A8 || cf_final == LV_COLOR_FORMAT_RGB565) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_RECOLOR(tmp_buf, blend_area, color, mix)) { - uint16_t c_mult[3]; - c_mult[0] = (color.blue >> 3) * mix; - c_mult[1] = (color.green >> 2) * mix; - c_mult[2] = (color.red >> 3) * mix; - uint16_t * buf16 = (uint16_t *)tmp_buf; - int32_t i; - int32_t size = lv_area_get_size(&blend_area); - for(i = 0; i < size; i++) { - buf16[i] = (((c_mult[2] + ((buf16[i] >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + - (((c_mult[1] + ((buf16[i] >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + - ((c_mult[0] + (buf16[i] & 0x1F) * mix_inv) >> 8); - } - } - } - else if(cf_final != LV_COLOR_FORMAT_A8) { - if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_RECOLOR(tmp_buf, blend_area, color, mix, cf_final)) { - uint32_t size = lv_area_get_size(&blend_area); - uint32_t i; - uint16_t c_mult[3]; - c_mult[0] = color.blue * mix; - c_mult[1] = color.green * mix; - c_mult[2] = color.red * mix; - uint8_t * tmp_buf_2 = tmp_buf; - for(i = 0; i < (uint32_t)(size * px_size); i += px_size) { - tmp_buf_2[i + 0] = (c_mult[0] + (tmp_buf_2[i + 0] * mix_inv)) >> 8; - tmp_buf_2[i + 1] = (c_mult[1] + (tmp_buf_2[i + 1] * mix_inv)) >> 8; - tmp_buf_2[i + 2] = (c_mult[2] + (tmp_buf_2[i + 2] * mix_inv)) >> 8; - } - } - } - } - - /*Blend*/ - lv_draw_sw_blend(draw_unit, &blend_dsc); - - /*Go to the next area*/ - blend_area.y1 = blend_area.y2 + 1; - blend_area.y2 = blend_area.y1 + buf_h - 1; - if(blend_area.y2 > y_last) { - blend_area.y2 = y_last; - if(cf_final == LV_COLOR_FORMAT_RGB565A8) { - blend_dsc.mask_buf = tmp_buf + blend_w * 2 * lv_area_get_height(&blend_area); - } - } - } - - lv_free(tmp_buf); - } -} - -#endif /*LV_USE_DRAW_SW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_letter.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_letter.c deleted file mode 100644 index 3dec220..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_letter.c +++ /dev/null @@ -1,128 +0,0 @@ -/** - * @file lv_draw_sw_letter.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "blend/lv_draw_sw_blend_private.h" -#include "../lv_draw_label_private.h" -#include "lv_draw_sw.h" -#if LV_USE_DRAW_SW - -#include "../../display/lv_display.h" -#include "../../misc/lv_math.h" -#include "../../misc/lv_assert.h" -#include "../../misc/lv_area.h" -#include "../../misc/lv_style.h" -#include "../../font/lv_font.h" -#include "../../core/lv_refr_private.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void /* LV_ATTRIBUTE_FAST_MEM */ draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, - lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_sw_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords) -{ - if(dsc->opa <= LV_OPA_MIN) return; - - LV_PROFILER_BEGIN; - lv_draw_label_iterate_characters(draw_unit, dsc, coords, draw_letter_cb); - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void LV_ATTRIBUTE_FAST_MEM draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, - lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) -{ - if(glyph_draw_dsc) { - switch(glyph_draw_dsc->format) { - case LV_FONT_GLYPH_FORMAT_NONE: { -#if LV_USE_FONT_PLACEHOLDER - /* Draw a placeholder rectangle*/ - lv_draw_border_dsc_t border_draw_dsc; - lv_draw_border_dsc_init(&border_draw_dsc); - border_draw_dsc.opa = glyph_draw_dsc->opa; - border_draw_dsc.color = glyph_draw_dsc->color; - border_draw_dsc.width = 1; - lv_draw_sw_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords); -#endif - } - break; - case LV_FONT_GLYPH_FORMAT_A1: - case LV_FONT_GLYPH_FORMAT_A2: - case LV_FONT_GLYPH_FORMAT_A4: - case LV_FONT_GLYPH_FORMAT_A8: { - lv_area_t mask_area = *glyph_draw_dsc->letter_coords; - mask_area.x2 = mask_area.x1 + lv_draw_buf_width_to_stride(lv_area_get_width(&mask_area), LV_COLOR_FORMAT_A8) - 1; - lv_draw_sw_blend_dsc_t blend_dsc; - lv_memzero(&blend_dsc, sizeof(blend_dsc)); - blend_dsc.color = glyph_draw_dsc->color; - blend_dsc.opa = glyph_draw_dsc->opa; - lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data; - blend_dsc.mask_buf = draw_buf->data; - blend_dsc.mask_area = &mask_area; - blend_dsc.mask_stride = draw_buf->header.stride; - blend_dsc.blend_area = glyph_draw_dsc->letter_coords; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - break; - case LV_FONT_GLYPH_FORMAT_IMAGE: { -#if LV_USE_IMGFONT - lv_draw_image_dsc_t img_dsc; - lv_draw_image_dsc_init(&img_dsc); - img_dsc.rotation = 0; - img_dsc.scale_x = LV_SCALE_NONE; - img_dsc.scale_y = LV_SCALE_NONE; - img_dsc.opa = glyph_draw_dsc->opa; - img_dsc.src = glyph_draw_dsc->glyph_data; - lv_draw_sw_image(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords); -#endif - } - break; - default: - break; - } - - } - - if(fill_draw_dsc && fill_area) { - lv_draw_sw_fill(draw_unit, fill_draw_dsc, fill_area); - } -} - -#endif /*LV_USE_DRAW_SW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_line.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_line.c deleted file mode 100644 index be3b191..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_line.c +++ /dev/null @@ -1,408 +0,0 @@ -/** - * @file lv_draw_sw_line.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_area_private.h" -#include "lv_draw_sw_mask_private.h" -#include "blend/lv_draw_sw_blend_private.h" -#include "../lv_draw_private.h" -#include "lv_draw_sw.h" - -#if LV_USE_DRAW_SW - -#include "../../misc/lv_math.h" -#include "../../misc/lv_types.h" -#include "../../core/lv_refr_private.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_skew(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); -static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_hor(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); -static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_ver(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_sw_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) -{ - if(dsc->width == 0) return; - if(dsc->opa <= LV_OPA_MIN) return; - - if(dsc->p1.x == dsc->p2.x && dsc->p1.y == dsc->p2.y) return; - - lv_area_t clip_line; - clip_line.x1 = (int32_t)LV_MIN(dsc->p1.x, dsc->p2.x) - dsc->width / 2; - clip_line.x2 = (int32_t)LV_MAX(dsc->p1.x, dsc->p2.x) + dsc->width / 2; - clip_line.y1 = (int32_t)LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width / 2; - clip_line.y2 = (int32_t)LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width / 2; - - bool is_common; - is_common = lv_area_intersect(&clip_line, &clip_line, draw_unit->clip_area); - if(!is_common) return; - - LV_PROFILER_BEGIN; - if(dsc->p1.y == dsc->p2.y) draw_line_hor(draw_unit, dsc); - else if(dsc->p1.x == dsc->p2.x) draw_line_ver(draw_unit, dsc); - else draw_line_skew(draw_unit, dsc); - - if(dsc->round_end || dsc->round_start) { - lv_draw_fill_dsc_t cir_dsc; - lv_draw_fill_dsc_init(&cir_dsc); - cir_dsc.color = dsc->color; - cir_dsc.radius = LV_RADIUS_CIRCLE; - cir_dsc.opa = dsc->opa; - - int32_t r = (dsc->width >> 1); - int32_t r_corr = (dsc->width & 1) ? 0 : 1; - lv_area_t cir_area; - - if(dsc->round_start) { - cir_area.x1 = (int32_t)dsc->p1.x - r; - cir_area.y1 = (int32_t)dsc->p1.y - r; - cir_area.x2 = (int32_t)dsc->p1.x + r - r_corr; - cir_area.y2 = (int32_t)dsc->p1.y + r - r_corr ; - lv_draw_sw_fill(draw_unit, &cir_dsc, &cir_area); - } - - if(dsc->round_end) { - cir_area.x1 = (int32_t)dsc->p2.x - r; - cir_area.y1 = (int32_t)dsc->p2.y - r; - cir_area.x2 = (int32_t)dsc->p2.x + r - r_corr; - cir_area.y2 = (int32_t)dsc->p2.y + r - r_corr ; - lv_draw_sw_fill(draw_unit, &cir_dsc, &cir_area); - } - } - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ -static void LV_ATTRIBUTE_FAST_MEM draw_line_hor(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) -{ - int32_t w = dsc->width - 1; - int32_t w_half0 = w >> 1; - int32_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ - - lv_area_t blend_area; - blend_area.x1 = (int32_t)LV_MIN(dsc->p1.x, dsc->p2.x); - blend_area.x2 = (int32_t)LV_MAX(dsc->p1.x, dsc->p2.x) - 1; - blend_area.y1 = (int32_t)dsc->p1.y - w_half1; - blend_area.y2 = (int32_t)dsc->p1.y + w_half0; - - bool is_common; - is_common = lv_area_intersect(&blend_area, &blend_area, draw_unit->clip_area); - if(!is_common) return; - - bool dashed = dsc->dash_gap && dsc->dash_width; - - lv_draw_sw_blend_dsc_t blend_dsc; - lv_memzero(&blend_dsc, sizeof(blend_dsc)); - blend_dsc.blend_area = &blend_area; - blend_dsc.color = dsc->color; - blend_dsc.opa = dsc->opa; - - /*If there is no mask then simply draw a rectangle*/ - if(!dashed) { - lv_draw_sw_blend(draw_unit, &blend_dsc); - } -#if LV_DRAW_SW_COMPLEX - /*If there other mask apply it*/ - else { - - int32_t blend_area_w = lv_area_get_width(&blend_area); - - int32_t y2 = blend_area.y2; - blend_area.y2 = blend_area.y1; - - int32_t dash_start = blend_area.x1 % (dsc->dash_gap + dsc->dash_width); - - lv_opa_t * mask_buf = lv_malloc(blend_area_w); - blend_dsc.mask_buf = mask_buf; - blend_dsc.mask_area = &blend_area; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - int32_t h; - for(h = blend_area.y1; h <= y2; h++) { - lv_memset(mask_buf, 0xff, blend_area_w); - - int32_t dash_cnt = dash_start; - int32_t i; - for(i = 0; i < blend_area_w; i++, dash_cnt++) { - if(dash_cnt <= dsc->dash_width) { - int16_t diff = dsc->dash_width - dash_cnt; - i += diff; - dash_cnt += diff; - } - else if(dash_cnt > dsc->dash_gap + dsc->dash_width) { - dash_cnt = 0; - } - else { - mask_buf[i] = 0x00; - } - - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - - lv_draw_sw_blend(draw_unit, &blend_dsc); - - blend_area.y1++; - blend_area.y2++; - } - lv_free(mask_buf); - } -#endif /*LV_DRAW_SW_COMPLEX*/ -} - -static void LV_ATTRIBUTE_FAST_MEM draw_line_ver(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) -{ - int32_t w = dsc->width - 1; - int32_t w_half0 = w >> 1; - int32_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ - - lv_area_t blend_area; - blend_area.x1 = (int32_t)dsc->p1.x - w_half1; - blend_area.x2 = (int32_t)dsc->p1.x + w_half0; - blend_area.y1 = (int32_t)LV_MIN(dsc->p1.y, dsc->p2.y); - blend_area.y2 = (int32_t)LV_MAX(dsc->p1.y, dsc->p2.y) - 1; - - bool is_common; - is_common = lv_area_intersect(&blend_area, &blend_area, draw_unit->clip_area); - if(!is_common) return; - - bool dashed = dsc->dash_gap && dsc->dash_width; - - lv_draw_sw_blend_dsc_t blend_dsc; - lv_memzero(&blend_dsc, sizeof(blend_dsc)); - blend_dsc.blend_area = &blend_area; - blend_dsc.color = dsc->color; - blend_dsc.opa = dsc->opa; - - /*If there is no mask then simply draw a rectangle*/ - if(!dashed) { - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - -#if LV_DRAW_SW_COMPLEX - /*If there other mask apply it*/ - else { - int32_t draw_area_w = lv_area_get_width(&blend_area); - - int32_t y2 = blend_area.y2; - blend_area.y2 = blend_area.y1; - - lv_opa_t * mask_buf = lv_malloc(draw_area_w); - blend_dsc.mask_buf = mask_buf; - blend_dsc.mask_area = &blend_area; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - int32_t dash_start = (blend_area.y1) % (dsc->dash_gap + dsc->dash_width); - - int32_t dash_cnt = dash_start; - - int32_t h; - for(h = blend_area.y1; h <= y2; h++) { - lv_memset(mask_buf, 0xff, draw_area_w); - - if(dash_cnt > dsc->dash_width) { - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_TRANSP; - } - else { - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_FULL_COVER; - } - - if(dash_cnt >= dsc->dash_gap + dsc->dash_width) { - dash_cnt = 0; - } - dash_cnt ++; - - lv_draw_sw_blend(draw_unit, &blend_dsc); - - blend_area.y1++; - blend_area.y2++; - } - lv_free(mask_buf); - } -#endif /*LV_DRAW_SW_COMPLEX*/ -} - -static void LV_ATTRIBUTE_FAST_MEM draw_line_skew(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) -{ -#if LV_DRAW_SW_COMPLEX - /*Keep the great y in p1*/ - lv_point_t p1; - lv_point_t p2; - if(dsc->p1.y < dsc->p2.y) { - p1 = lv_point_from_precise(&dsc->p1); - p2 = lv_point_from_precise(&dsc->p2); - } - else { - p1 = lv_point_from_precise(&dsc->p2); - p2 = lv_point_from_precise(&dsc->p1); - } - - int32_t xdiff = p2.x - p1.x; - int32_t ydiff = p2.y - p1.y; - bool flat = LV_ABS(xdiff) > LV_ABS(ydiff); - - static const uint8_t wcorr[] = { - 128, 128, 128, 129, 129, 130, 130, 131, - 132, 133, 134, 135, 137, 138, 140, 141, - 143, 145, 147, 149, 151, 153, 155, 158, - 160, 162, 165, 167, 170, 173, 175, 178, - 181, - }; - - int32_t w = dsc->width; - int32_t wcorr_i = 0; - if(flat) wcorr_i = (LV_ABS(ydiff) << 5) / LV_ABS(xdiff); - else wcorr_i = (LV_ABS(xdiff) << 5) / LV_ABS(ydiff); - - w = (w * wcorr[wcorr_i] + 63) >> 7; /*+ 63 for rounding*/ - int32_t w_half0 = w >> 1; - int32_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ - - lv_area_t blend_area; - blend_area.x1 = LV_MIN(p1.x, p2.x) - w; - blend_area.x2 = LV_MAX(p1.x, p2.x) + w; - blend_area.y1 = LV_MIN(p1.y, p2.y) - w; - blend_area.y2 = LV_MAX(p1.y, p2.y) + w; - - /*Get the union of `coords` and `clip`*/ - /*`clip` is already truncated to the `draw_buf` size - *in 'lv_refr_area' function*/ - bool is_common = lv_area_intersect(&blend_area, &blend_area, draw_unit->clip_area); - if(is_common == false) return; - - lv_draw_sw_mask_line_param_t mask_left_param; - lv_draw_sw_mask_line_param_t mask_right_param; - lv_draw_sw_mask_line_param_t mask_top_param; - lv_draw_sw_mask_line_param_t mask_bottom_param; - - void * masks[5] = {&mask_left_param, & mask_right_param, NULL, NULL, NULL}; - - if(flat) { - if(xdiff > 0) { - lv_draw_sw_mask_line_points_init(&mask_left_param, p1.x, p1.y - w_half0, p2.x, p2.y - w_half0, - LV_DRAW_SW_MASK_LINE_SIDE_LEFT); - lv_draw_sw_mask_line_points_init(&mask_right_param, p1.x, p1.y + w_half1, p2.x, p2.y + w_half1, - LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); - } - else { - lv_draw_sw_mask_line_points_init(&mask_left_param, p1.x, p1.y + w_half1, p2.x, p2.y + w_half1, - LV_DRAW_SW_MASK_LINE_SIDE_LEFT); - lv_draw_sw_mask_line_points_init(&mask_right_param, p1.x, p1.y - w_half0, p2.x, p2.y - w_half0, - LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); - } - } - else { - lv_draw_sw_mask_line_points_init(&mask_left_param, p1.x + w_half1, p1.y, p2.x + w_half1, p2.y, - LV_DRAW_SW_MASK_LINE_SIDE_LEFT); - lv_draw_sw_mask_line_points_init(&mask_right_param, p1.x - w_half0, p1.y, p2.x - w_half0, p2.y, - LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); - - } - - /*Use the normal vector for the endings*/ - - if(!dsc->raw_end) { - lv_draw_sw_mask_line_points_init(&mask_top_param, p1.x, p1.y, p1.x - ydiff, p1.y + xdiff, - LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM); - lv_draw_sw_mask_line_points_init(&mask_bottom_param, p2.x, p2.y, p2.x - ydiff, p2.y + xdiff, - LV_DRAW_SW_MASK_LINE_SIDE_TOP); - masks[2] = &mask_top_param; - masks[3] = &mask_bottom_param; - } - - /*The real draw area is around the line. - *It's easy to calculate with steep lines, but the area can be very wide with very flat lines. - *So deal with it only with steep lines.*/ - int32_t draw_area_w = lv_area_get_width(&blend_area); - - /*Draw the background line by line*/ - int32_t h; - uint32_t hor_res = (uint32_t)lv_display_get_horizontal_resolution(lv_refr_get_disp_refreshing()); - size_t mask_buf_size = LV_MIN(lv_area_get_size(&blend_area), hor_res); - lv_opa_t * mask_buf = lv_malloc(mask_buf_size); - - int32_t y2 = blend_area.y2; - blend_area.y2 = blend_area.y1; - - uint32_t mask_p = 0; - lv_memset(mask_buf, 0xff, mask_buf_size); - - lv_draw_sw_blend_dsc_t blend_dsc; - lv_memzero(&blend_dsc, sizeof(blend_dsc)); - blend_dsc.blend_area = &blend_area; - blend_dsc.color = dsc->color; - blend_dsc.opa = dsc->opa; - blend_dsc.mask_buf = mask_buf; - blend_dsc.mask_area = &blend_area; - - /*Fill the first row with 'color'*/ - for(h = blend_area.y1; h <= y2; h++) { - blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, &mask_buf[mask_p], blend_area.x1, h, draw_area_w); - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { - lv_memzero(&mask_buf[mask_p], draw_area_w); - } - - mask_p += draw_area_w; - if((uint32_t) mask_p + draw_area_w < mask_buf_size) { - blend_area.y2 ++; - } - else { - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - lv_draw_sw_blend(draw_unit, &blend_dsc); - - blend_area.y1 = blend_area.y2 + 1; - blend_area.y2 = blend_area.y1; - mask_p = 0; - lv_memset(mask_buf, 0xff, mask_buf_size); - } - } - - /*Flush the last part*/ - if(blend_area.y1 != blend_area.y2) { - blend_area.y2--; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - - lv_free(mask_buf); - - lv_draw_sw_mask_free_param(&mask_left_param); - lv_draw_sw_mask_free_param(&mask_right_param); - if(!dsc->raw_end) { - lv_draw_sw_mask_free_param(&mask_top_param); - lv_draw_sw_mask_free_param(&mask_bottom_param); - } -#else - LV_UNUSED(draw_unit); - LV_UNUSED(dsc); - LV_LOG_WARN("Can't draw skewed line with LV_DRAW_SW_COMPLEX == 0"); -#endif /*LV_DRAW_SW_COMPLEX*/ -} - -#endif /*LV_USE_DRAW_SW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_mask.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_mask.c deleted file mode 100644 index c4fd792..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_mask.c +++ /dev/null @@ -1,1236 +0,0 @@ -/** - * @file lv_draw_sw_mask.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_sw_mask_private.h" -#include "../lv_draw_mask_private.h" -#include "../lv_draw.h" - -#if LV_DRAW_SW_COMPLEX -#include "../../core/lv_global.h" -#include "../../misc/lv_math.h" -#include "../../misc/lv_log.h" -#include "../../misc/lv_assert.h" -#include "../../osal/lv_os.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define CIRCLE_CACHE_LIFE_MAX 1000 -#define CIRCLE_CACHE_AGING(life, r) life = LV_MIN(life + (r < 16 ? 1 : (r >> 4)), 1000) -#define circle_cache_mutex LV_GLOBAL_DEFAULT()->draw_info.circle_cache_mutex -#define _circle_cache LV_GLOBAL_DEFAULT()->sw_circle_cache - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_line(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, int32_t len, - lv_draw_sw_mask_line_param_t * param); -static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_radius(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, int32_t len, - lv_draw_sw_mask_radius_param_t * param); -static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_angle(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, int32_t len, - lv_draw_sw_mask_angle_param_t * param); -static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_fade(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, int32_t len, - lv_draw_sw_mask_fade_param_t * param); -static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_map(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, int32_t len, - lv_draw_sw_mask_map_param_t * param); - -static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_flat(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, - int32_t len, - lv_draw_sw_mask_line_param_t * p); -static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_steep(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, - int32_t len, - lv_draw_sw_mask_line_param_t * p); - -static void circ_init(lv_point_t * c, int32_t * tmp, int32_t radius); -static bool circ_cont(lv_point_t * c); -static void circ_next(lv_point_t * c, int32_t * tmp); -static void circ_calc_aa4(lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t radius); -static lv_opa_t * get_next_line(lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t y, int32_t * len, - int32_t * x_start); -static inline lv_opa_t /* LV_ATTRIBUTE_FAST_MEM */ mask_mix(lv_opa_t mask_act, lv_opa_t mask_new); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_sw_mask_init(void) -{ - lv_mutex_init(&circle_cache_mutex); -} - -void lv_draw_sw_mask_deinit(void) -{ - lv_mutex_delete(&circle_cache_mutex); -} - -lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_sw_mask_apply(void * masks[], lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, - int32_t len) -{ - bool changed = false; - lv_draw_sw_mask_common_dsc_t * dsc; - - uint32_t i; - for(i = 0; masks[i]; i++) { - dsc = masks[i]; - lv_draw_sw_mask_res_t res = LV_DRAW_SW_MASK_RES_FULL_COVER; - res = dsc->cb(mask_buf, abs_x, abs_y, len, masks[i]); - if(res == LV_DRAW_SW_MASK_RES_TRANSP) return LV_DRAW_SW_MASK_RES_TRANSP; - else if(res == LV_DRAW_SW_MASK_RES_CHANGED) changed = true; - } - - return changed ? LV_DRAW_SW_MASK_RES_CHANGED : LV_DRAW_SW_MASK_RES_FULL_COVER; -} - -void lv_draw_sw_mask_free_param(void * p) -{ - lv_mutex_lock(&circle_cache_mutex); - lv_draw_sw_mask_common_dsc_t * pdsc = p; - if(pdsc->type == LV_DRAW_SW_MASK_TYPE_RADIUS) { - lv_draw_sw_mask_radius_param_t * radius_p = (lv_draw_sw_mask_radius_param_t *) p; - if(radius_p->circle) { - if(radius_p->circle->life < 0) { - lv_free(radius_p->circle->cir_opa); - lv_free(radius_p->circle); - } - else { - radius_p->circle->used_cnt--; - } - } - } - - lv_mutex_unlock(&circle_cache_mutex); -} - -void lv_draw_sw_mask_cleanup(void) -{ - uint8_t i; - for(i = 0; i < LV_DRAW_SW_CIRCLE_CACHE_SIZE; i++) { - if(_circle_cache[i].buf) { - lv_free(_circle_cache[i].buf); - } - lv_memzero(&(_circle_cache[i]), sizeof(_circle_cache[i])); - } -} - -void lv_draw_sw_mask_line_points_init(lv_draw_sw_mask_line_param_t * param, int32_t p1x, int32_t p1y, - int32_t p2x, - int32_t p2y, lv_draw_sw_mask_line_side_t side) -{ - lv_memzero(param, sizeof(lv_draw_sw_mask_line_param_t)); - - if(p1y == p2y && side == LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM) { - p1y--; - p2y--; - } - - if(p1y > p2y) { - int32_t t; - t = p2x; - p2x = p1x; - p1x = t; - - t = p2y; - p2y = p1y; - p1y = t; - } - - lv_point_set(¶m->cfg.p1, p1x, p1y); - lv_point_set(¶m->cfg.p2, p2x, p2y); - param->cfg.side = side; - - lv_point_set(¶m->origo, p1x, p1y); - param->flat = (LV_ABS(p2x - p1x) > LV_ABS(p2y - p1y)) ? 1 : 0; - param->yx_steep = 0; - param->xy_steep = 0; - param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_line; - param->dsc.type = LV_DRAW_SW_MASK_TYPE_LINE; - - int32_t dx = p2x - p1x; - int32_t dy = p2y - p1y; - - if(param->flat) { - /*Normalize the steep. Delta x should be relative to delta x = 1024*/ - int32_t m; - - if(dx) { - m = (1L << 20) / dx; /*m is multiplier to normalize y (upscaled by 1024)*/ - param->yx_steep = (m * dy) >> 10; - } - - if(dy) { - m = (1L << 20) / dy; /*m is multiplier to normalize x (upscaled by 1024)*/ - param->xy_steep = (m * dx) >> 10; - } - param->steep = param->yx_steep; - } - else { - /*Normalize the steep. Delta y should be relative to delta x = 1024*/ - int32_t m; - - if(dy) { - m = (1L << 20) / dy; /*m is multiplier to normalize x (upscaled by 1024)*/ - param->xy_steep = (m * dx) >> 10; - } - - if(dx) { - m = (1L << 20) / dx; /*m is multiplier to normalize x (upscaled by 1024)*/ - param->yx_steep = (m * dy) >> 10; - } - param->steep = param->xy_steep; - } - - if(param->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_LEFT) param->inv = 0; - else if(param->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_RIGHT) param->inv = 1; - else if(param->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_TOP) { - if(param->steep > 0) param->inv = 1; - else param->inv = 0; - } - else if(param->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM) { - if(param->steep > 0) param->inv = 0; - else param->inv = 1; - } - - param->spx = param->steep >> 2; - if(param->steep < 0) param->spx = -param->spx; -} - -void lv_draw_sw_mask_line_angle_init(lv_draw_sw_mask_line_param_t * param, int32_t p1x, int32_t py, int16_t angle, - lv_draw_sw_mask_line_side_t side) -{ - /*Find an optimal degree. - *lv_mask_line_points_init will swap the points to keep the smaller y in p1 - *Theoretically a line with `angle` or `angle+180` is the same only the points are swapped - *Find the degree which keeps the origo in place*/ - if(angle > 180) angle -= 180; /*> 180 will swap the origo*/ - - int32_t p2x; - int32_t p2y; - - p2x = (lv_trigo_sin(angle + 90) >> 5) + p1x; - p2y = (lv_trigo_sin(angle) >> 5) + py; - - lv_draw_sw_mask_line_points_init(param, p1x, py, p2x, p2y, side); -} - -void lv_draw_sw_mask_angle_init(lv_draw_sw_mask_angle_param_t * param, int32_t vertex_x, int32_t vertex_y, - int32_t start_angle, int32_t end_angle) -{ - lv_draw_sw_mask_line_side_t start_side; - lv_draw_sw_mask_line_side_t end_side; - - /*Constrain the input angles*/ - if(start_angle < 0) - start_angle = 0; - else if(start_angle > 359) - start_angle = 359; - - if(end_angle < 0) - end_angle = 0; - else if(end_angle > 359) - end_angle = 359; - - if(end_angle < start_angle) { - param->delta_deg = 360 - start_angle + end_angle; - } - else { - param->delta_deg = LV_ABS(end_angle - start_angle); - } - - param->cfg.start_angle = start_angle; - param->cfg.end_angle = end_angle; - lv_point_set(¶m->cfg.vertex_p, vertex_x, vertex_y); - param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_angle; - param->dsc.type = LV_DRAW_SW_MASK_TYPE_ANGLE; - - LV_ASSERT_MSG(start_angle >= 0 && start_angle <= 360, "Unexpected start angle"); - - if(start_angle >= 0 && start_angle < 180) { - start_side = LV_DRAW_SW_MASK_LINE_SIDE_LEFT; - } - else - start_side = LV_DRAW_SW_MASK_LINE_SIDE_RIGHT; /*silence compiler*/ - - LV_ASSERT_MSG(end_angle >= 0 && start_angle <= 360, "Unexpected end angle"); - - if(end_angle >= 0 && end_angle < 180) { - end_side = LV_DRAW_SW_MASK_LINE_SIDE_RIGHT; - } - else if(end_angle >= 180 && end_angle < 360) { - end_side = LV_DRAW_SW_MASK_LINE_SIDE_LEFT; - } - else - end_side = LV_DRAW_SW_MASK_LINE_SIDE_RIGHT; /*silence compiler*/ - - lv_draw_sw_mask_line_angle_init(¶m->start_line, vertex_x, vertex_y, start_angle, start_side); - lv_draw_sw_mask_line_angle_init(¶m->end_line, vertex_x, vertex_y, end_angle, end_side); -} - -void lv_draw_sw_mask_radius_init(lv_draw_sw_mask_radius_param_t * param, const lv_area_t * rect, int32_t radius, - bool inv) -{ - int32_t w = lv_area_get_width(rect); - int32_t h = lv_area_get_height(rect); - int32_t short_side = LV_MIN(w, h); - if(radius > short_side >> 1) radius = short_side >> 1; - if(radius < 0) radius = 0; - - lv_area_copy(¶m->cfg.rect, rect); - param->cfg.radius = radius; - param->cfg.outer = inv ? 1 : 0; - param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_radius; - param->dsc.type = LV_DRAW_SW_MASK_TYPE_RADIUS; - - if(radius == 0) { - param->circle = NULL; - return; - } - - lv_mutex_lock(&circle_cache_mutex); - - uint32_t i; - - /*Try to reuse a circle cache entry*/ - for(i = 0; i < LV_DRAW_SW_CIRCLE_CACHE_SIZE; i++) { - if(_circle_cache[i].radius == radius) { - _circle_cache[i].used_cnt++; - CIRCLE_CACHE_AGING(_circle_cache[i].life, radius); - param->circle = &(_circle_cache[i]); - lv_mutex_unlock(&circle_cache_mutex); - return; - } - } - - /*If not cached use the free entry with lowest life*/ - lv_draw_sw_mask_radius_circle_dsc_t * entry = NULL; - for(i = 0; i < LV_DRAW_SW_CIRCLE_CACHE_SIZE; i++) { - if(_circle_cache[i].used_cnt == 0) { - if(!entry) entry = &(_circle_cache[i]); - else if(_circle_cache[i].life < entry->life) entry = &(_circle_cache[i]); - } - } - - /*There is no unused entry. Allocate one temporarily*/ - if(!entry) { - entry = lv_malloc_zeroed(sizeof(lv_draw_sw_mask_radius_circle_dsc_t)); - LV_ASSERT_MALLOC(entry); - entry->life = -1; - } - else { - entry->used_cnt++; - entry->life = 0; - CIRCLE_CACHE_AGING(entry->life, radius); - } - - param->circle = entry; - - circ_calc_aa4(param->circle, radius); - lv_mutex_unlock(&circle_cache_mutex); - -} - -void lv_draw_sw_mask_fade_init(lv_draw_sw_mask_fade_param_t * param, const lv_area_t * coords, lv_opa_t opa_top, - int32_t y_top, - lv_opa_t opa_bottom, int32_t y_bottom) -{ - lv_area_copy(¶m->cfg.coords, coords); - param->cfg.opa_top = opa_top; - param->cfg.opa_bottom = opa_bottom; - param->cfg.y_top = y_top; - param->cfg.y_bottom = y_bottom; - param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_fade; - param->dsc.type = LV_DRAW_SW_MASK_TYPE_FADE; -} - -void lv_draw_sw_mask_map_init(lv_draw_sw_mask_map_param_t * param, const lv_area_t * coords, const lv_opa_t * map) -{ - lv_area_copy(¶m->cfg.coords, coords); - param->cfg.map = map; - param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_map; - param->dsc.type = LV_DRAW_SW_MASK_TYPE_MAP; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_line(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, int32_t len, - lv_draw_sw_mask_line_param_t * p) -{ - /*Make to points relative to the vertex*/ - abs_y -= p->origo.y; - abs_x -= p->origo.x; - - /*Handle special cases*/ - if(p->steep == 0) { - /*Horizontal*/ - if(p->flat) { - /*Non sense: Can't be on the right/left of a horizontal line*/ - if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_LEFT || - p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_RIGHT) return LV_DRAW_SW_MASK_RES_FULL_COVER; - else if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_TOP && abs_y < 0) return LV_DRAW_SW_MASK_RES_FULL_COVER; - else if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM && abs_y > 0) return LV_DRAW_SW_MASK_RES_FULL_COVER; - else { - return LV_DRAW_SW_MASK_RES_TRANSP; - } - } - /*Vertical*/ - else { - /*Non sense: Can't be on the top/bottom of a vertical line*/ - if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_TOP || - p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM) return LV_DRAW_SW_MASK_RES_FULL_COVER; - else if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_RIGHT && abs_x > 0) return LV_DRAW_SW_MASK_RES_FULL_COVER; - else if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_LEFT) { - if(abs_x + len < 0) return LV_DRAW_SW_MASK_RES_FULL_COVER; - else { - int32_t k = - abs_x; - if(k < 0) return LV_DRAW_SW_MASK_RES_TRANSP; - if(k >= 0 && k < len) lv_memzero(&mask_buf[k], len - k); - return LV_DRAW_SW_MASK_RES_CHANGED; - } - } - else { - if(abs_x + len < 0) return LV_DRAW_SW_MASK_RES_TRANSP; - else { - int32_t k = - abs_x; - if(k < 0) k = 0; - if(k >= len) return LV_DRAW_SW_MASK_RES_TRANSP; - else if(k >= 0 && k < len) lv_memzero(&mask_buf[0], k); - return LV_DRAW_SW_MASK_RES_CHANGED; - } - } - } - } - - lv_draw_sw_mask_res_t res; - if(p->flat) { - res = line_mask_flat(mask_buf, abs_x, abs_y, len, p); - } - else { - res = line_mask_steep(mask_buf, abs_x, abs_y, len, p); - } - - return res; -} - -static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_flat(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, - int32_t len, - lv_draw_sw_mask_line_param_t * p) -{ - - int32_t y_at_x; - y_at_x = (int32_t)((int32_t)p->yx_steep * abs_x) >> 10; - - if(p->yx_steep > 0) { - if(y_at_x > abs_y) { - if(p->inv) { - return LV_DRAW_SW_MASK_RES_FULL_COVER; - } - else { - return LV_DRAW_SW_MASK_RES_TRANSP; - } - } - } - else { - if(y_at_x < abs_y) { - if(p->inv) { - return LV_DRAW_SW_MASK_RES_FULL_COVER; - } - else { - return LV_DRAW_SW_MASK_RES_TRANSP; - } - } - } - - /*At the end of the mask if the limit line is smaller than the mask's y. - *Then the mask is in the "good" area*/ - y_at_x = (int32_t)((int32_t)p->yx_steep * (abs_x + len)) >> 10; - if(p->yx_steep > 0) { - if(y_at_x < abs_y) { - if(p->inv) { - return LV_DRAW_SW_MASK_RES_TRANSP; - } - else { - return LV_DRAW_SW_MASK_RES_FULL_COVER; - } - } - } - else { - if(y_at_x > abs_y) { - if(p->inv) { - return LV_DRAW_SW_MASK_RES_TRANSP; - } - else { - return LV_DRAW_SW_MASK_RES_FULL_COVER; - } - } - } - - int32_t xe; - if(p->yx_steep > 0) xe = ((abs_y * 256) * p->xy_steep) >> 10; - else xe = (((abs_y + 1) * 256) * p->xy_steep) >> 10; - - int32_t xei = xe >> 8; - int32_t xef = xe & 0xFF; - - int32_t px_h; - if(xef == 0) px_h = 255; - else px_h = 255 - (((255 - xef) * p->spx) >> 8); - int32_t k = xei - abs_x; - lv_opa_t m; - - if(xef) { - if(k >= 0 && k < len) { - m = 255 - (((255 - xef) * (255 - px_h)) >> 9); - if(p->inv) m = 255 - m; - mask_buf[k] = mask_mix(mask_buf[k], m); - } - k++; - } - - while(px_h > p->spx) { - if(k >= 0 && k < len) { - m = px_h - (p->spx >> 1); - if(p->inv) m = 255 - m; - mask_buf[k] = mask_mix(mask_buf[k], m); - } - px_h -= p->spx; - k++; - if(k >= len) break; - } - - if(k < len && k >= 0) { - int32_t x_inters = (px_h * p->xy_steep) >> 10; - m = (x_inters * px_h) >> 9; - if(p->yx_steep < 0) m = 255 - m; - if(p->inv) m = 255 - m; - mask_buf[k] = mask_mix(mask_buf[k], m); - } - - if(p->inv) { - k = xei - abs_x; - if(k > len) { - return LV_DRAW_SW_MASK_RES_TRANSP; - } - if(k >= 0) { - lv_memzero(&mask_buf[0], k); - } - } - else { - k++; - if(k < 0) { - return LV_DRAW_SW_MASK_RES_TRANSP; - } - if(k <= len) { - lv_memzero(&mask_buf[k], len - k); - } - } - - return LV_DRAW_SW_MASK_RES_CHANGED; -} - -static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_steep(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, - int32_t len, - lv_draw_sw_mask_line_param_t * p) -{ - int32_t k; - int32_t x_at_y; - /*At the beginning of the mask if the limit line is greater than the mask's y. - *Then the mask is in the "wrong" area*/ - x_at_y = (int32_t)((int32_t)p->xy_steep * abs_y) >> 10; - if(p->xy_steep > 0) x_at_y++; - if(x_at_y < abs_x) { - if(p->inv) { - return LV_DRAW_SW_MASK_RES_FULL_COVER; - } - else { - return LV_DRAW_SW_MASK_RES_TRANSP; - } - } - - /*At the end of the mask if the limit line is smaller than the mask's y. - *Then the mask is in the "good" area*/ - x_at_y = (int32_t)((int32_t)p->xy_steep * (abs_y)) >> 10; - if(x_at_y > abs_x + len) { - if(p->inv) { - return LV_DRAW_SW_MASK_RES_TRANSP; - } - else { - return LV_DRAW_SW_MASK_RES_FULL_COVER; - } - } - - /*X start*/ - int32_t xs = ((abs_y * 256) * p->xy_steep) >> 10; - int32_t xsi = xs >> 8; - int32_t xsf = xs & 0xFF; - - /*X end*/ - int32_t xe = (((abs_y + 1) * 256) * p->xy_steep) >> 10; - int32_t xei = xe >> 8; - int32_t xef = xe & 0xFF; - - lv_opa_t m; - - k = xsi - abs_x; - if(xsi != xei && (p->xy_steep < 0 && xsf == 0)) { - xsf = 0xFF; - xsi = xei; - k--; - } - - if(xsi == xei) { - if(k >= 0 && k < len) { - m = (xsf + xef) >> 1; - if(p->inv) m = 255 - m; - mask_buf[k] = mask_mix(mask_buf[k], m); - } - k++; - - if(p->inv) { - k = xsi - abs_x; - if(k >= len) { - return LV_DRAW_SW_MASK_RES_TRANSP; - } - if(k >= 0) lv_memzero(&mask_buf[0], k); - - } - else { - if(k > len) k = len; - if(k == 0) return LV_DRAW_SW_MASK_RES_TRANSP; - else if(k > 0) lv_memzero(&mask_buf[k], len - k); - } - - } - else { - int32_t y_inters; - if(p->xy_steep < 0) { - y_inters = (xsf * (-p->yx_steep)) >> 10; - if(k >= 0 && k < len) { - m = (y_inters * xsf) >> 9; - if(p->inv) m = 255 - m; - mask_buf[k] = mask_mix(mask_buf[k], m); - } - k--; - - int32_t x_inters = ((255 - y_inters) * (-p->xy_steep)) >> 10; - - if(k >= 0 && k < len) { - m = 255 - (((255 - y_inters) * x_inters) >> 9); - if(p->inv) m = 255 - m; - mask_buf[k] = mask_mix(mask_buf[k], m); - } - - k += 2; - - if(p->inv) { - k = xsi - abs_x - 1; - - if(k > len) k = len; - else if(k > 0) lv_memzero(&mask_buf[0], k); - - } - else { - if(k > len) return LV_DRAW_SW_MASK_RES_FULL_COVER; - if(k >= 0) lv_memzero(&mask_buf[k], len - k); - } - - } - else { - y_inters = ((255 - xsf) * p->yx_steep) >> 10; - if(k >= 0 && k < len) { - m = 255 - ((y_inters * (255 - xsf)) >> 9); - if(p->inv) m = 255 - m; - mask_buf[k] = mask_mix(mask_buf[k], m); - } - - k++; - - int32_t x_inters = ((255 - y_inters) * p->xy_steep) >> 10; - if(k >= 0 && k < len) { - m = ((255 - y_inters) * x_inters) >> 9; - if(p->inv) m = 255 - m; - mask_buf[k] = mask_mix(mask_buf[k], m); - } - k++; - - if(p->inv) { - k = xsi - abs_x; - if(k > len) return LV_DRAW_SW_MASK_RES_TRANSP; - if(k >= 0) lv_memzero(&mask_buf[0], k); - - } - else { - if(k > len) k = len; - if(k == 0) return LV_DRAW_SW_MASK_RES_TRANSP; - else if(k > 0) lv_memzero(&mask_buf[k], len - k); - } - } - } - - return LV_DRAW_SW_MASK_RES_CHANGED; -} - -static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_angle(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, int32_t len, - lv_draw_sw_mask_angle_param_t * p) -{ - int32_t rel_y = abs_y - p->cfg.vertex_p.y; - int32_t rel_x = abs_x - p->cfg.vertex_p.x; - - if(p->cfg.start_angle < 180 && p->cfg.end_angle < 180 && - p->cfg.start_angle != 0 && p->cfg.end_angle != 0 && - p->cfg.start_angle > p->cfg.end_angle) { - - if(abs_y < p->cfg.vertex_p.y) { - return LV_DRAW_SW_MASK_RES_FULL_COVER; - } - - /*Start angle mask can work only from the end of end angle mask*/ - int32_t end_angle_first = (rel_y * p->end_line.xy_steep) >> 10; - int32_t start_angle_last = ((rel_y + 1) * p->start_line.xy_steep) >> 10; - - /*Do not let the line end cross the vertex else it will affect the opposite part*/ - if(p->cfg.start_angle > 270 && p->cfg.start_angle <= 359 && start_angle_last < 0) start_angle_last = 0; - else if(p->cfg.start_angle > 0 && p->cfg.start_angle <= 90 && start_angle_last < 0) start_angle_last = 0; - else if(p->cfg.start_angle > 90 && p->cfg.start_angle < 270 && start_angle_last > 0) start_angle_last = 0; - - if(p->cfg.end_angle > 270 && p->cfg.end_angle <= 359 && start_angle_last < 0) start_angle_last = 0; - else if(p->cfg.end_angle > 0 && p->cfg.end_angle <= 90 && start_angle_last < 0) start_angle_last = 0; - else if(p->cfg.end_angle > 90 && p->cfg.end_angle < 270 && start_angle_last > 0) start_angle_last = 0; - - int32_t dist = (end_angle_first - start_angle_last) >> 1; - - lv_draw_sw_mask_res_t res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; - lv_draw_sw_mask_res_t res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; - - int32_t tmp = start_angle_last + dist - rel_x; - if(tmp > len) tmp = len; - if(tmp > 0) { - res1 = lv_draw_mask_line(&mask_buf[0], abs_x, abs_y, tmp, &p->start_line); - if(res1 == LV_DRAW_SW_MASK_RES_TRANSP) { - lv_memzero(&mask_buf[0], tmp); - } - } - - if(tmp > len) tmp = len; - if(tmp < 0) tmp = 0; - res2 = lv_draw_mask_line(&mask_buf[tmp], abs_x + tmp, abs_y, len - tmp, &p->end_line); - if(res2 == LV_DRAW_SW_MASK_RES_TRANSP) { - lv_memzero(&mask_buf[tmp], len - tmp); - } - if(res1 == res2) return res1; - else return LV_DRAW_SW_MASK_RES_CHANGED; - } - else if(p->cfg.start_angle > 180 && p->cfg.end_angle > 180 && p->cfg.start_angle > p->cfg.end_angle) { - - if(abs_y > p->cfg.vertex_p.y) { - return LV_DRAW_SW_MASK_RES_FULL_COVER; - } - - /*Start angle mask can work only from the end of end angle mask*/ - int32_t end_angle_first = (rel_y * p->end_line.xy_steep) >> 10; - int32_t start_angle_last = ((rel_y + 1) * p->start_line.xy_steep) >> 10; - - /*Do not let the line end cross the vertex else it will affect the opposite part*/ - if(p->cfg.start_angle > 270 && p->cfg.start_angle <= 359 && start_angle_last < 0) start_angle_last = 0; - else if(p->cfg.start_angle > 0 && p->cfg.start_angle <= 90 && start_angle_last < 0) start_angle_last = 0; - else if(p->cfg.start_angle > 90 && p->cfg.start_angle < 270 && start_angle_last > 0) start_angle_last = 0; - - if(p->cfg.end_angle > 270 && p->cfg.end_angle <= 359 && start_angle_last < 0) start_angle_last = 0; - else if(p->cfg.end_angle > 0 && p->cfg.end_angle <= 90 && start_angle_last < 0) start_angle_last = 0; - else if(p->cfg.end_angle > 90 && p->cfg.end_angle < 270 && start_angle_last > 0) start_angle_last = 0; - - int32_t dist = (end_angle_first - start_angle_last) >> 1; - - lv_draw_sw_mask_res_t res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; - lv_draw_sw_mask_res_t res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; - - int32_t tmp = start_angle_last + dist - rel_x; - if(tmp > len) tmp = len; - if(tmp > 0) { - res1 = lv_draw_mask_line(&mask_buf[0], abs_x, abs_y, tmp, (lv_draw_sw_mask_line_param_t *)&p->end_line); - if(res1 == LV_DRAW_SW_MASK_RES_TRANSP) { - lv_memzero(&mask_buf[0], tmp); - } - } - - if(tmp > len) tmp = len; - if(tmp < 0) tmp = 0; - res2 = lv_draw_mask_line(&mask_buf[tmp], abs_x + tmp, abs_y, len - tmp, (lv_draw_sw_mask_line_param_t *)&p->start_line); - if(res2 == LV_DRAW_SW_MASK_RES_TRANSP) { - lv_memzero(&mask_buf[tmp], len - tmp); - } - if(res1 == res2) return res1; - else return LV_DRAW_SW_MASK_RES_CHANGED; - } - else { - - lv_draw_sw_mask_res_t res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; - lv_draw_sw_mask_res_t res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; - - if(p->cfg.start_angle == 180) { - if(abs_y < p->cfg.vertex_p.y) res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; - else res1 = LV_DRAW_SW_MASK_RES_UNKNOWN; - } - else if(p->cfg.start_angle == 0) { - if(abs_y < p->cfg.vertex_p.y) res1 = LV_DRAW_SW_MASK_RES_UNKNOWN; - else res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; - } - else if((p->cfg.start_angle < 180 && abs_y < p->cfg.vertex_p.y) || - (p->cfg.start_angle > 180 && abs_y >= p->cfg.vertex_p.y)) { - res1 = LV_DRAW_SW_MASK_RES_UNKNOWN; - } - else { - res1 = lv_draw_mask_line(mask_buf, abs_x, abs_y, len, &p->start_line); - } - - if(p->cfg.end_angle == 180) { - if(abs_y < p->cfg.vertex_p.y) res2 = LV_DRAW_SW_MASK_RES_UNKNOWN; - else res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; - } - else if(p->cfg.end_angle == 0) { - if(abs_y < p->cfg.vertex_p.y) res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; - else res2 = LV_DRAW_SW_MASK_RES_UNKNOWN; - } - else if((p->cfg.end_angle < 180 && abs_y < p->cfg.vertex_p.y) || - (p->cfg.end_angle > 180 && abs_y >= p->cfg.vertex_p.y)) { - res2 = LV_DRAW_SW_MASK_RES_UNKNOWN; - } - else { - res2 = lv_draw_mask_line(mask_buf, abs_x, abs_y, len, &p->end_line); - } - - if(res1 == LV_DRAW_SW_MASK_RES_TRANSP || res2 == LV_DRAW_SW_MASK_RES_TRANSP) return LV_DRAW_SW_MASK_RES_TRANSP; - else if(res1 == LV_DRAW_SW_MASK_RES_UNKNOWN && res2 == LV_DRAW_SW_MASK_RES_UNKNOWN) return LV_DRAW_SW_MASK_RES_TRANSP; - else if(res1 == LV_DRAW_SW_MASK_RES_FULL_COVER && - res2 == LV_DRAW_SW_MASK_RES_FULL_COVER) return LV_DRAW_SW_MASK_RES_FULL_COVER; - else return LV_DRAW_SW_MASK_RES_CHANGED; - } -} - -static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_radius(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, int32_t len, - lv_draw_sw_mask_radius_param_t * p) -{ - bool outer = p->cfg.outer; - int32_t radius = p->cfg.radius; - lv_area_t rect; - lv_area_copy(&rect, &p->cfg.rect); - - if(outer == false) { - if((abs_y < rect.y1 || abs_y > rect.y2)) { - return LV_DRAW_SW_MASK_RES_TRANSP; - } - } - else { - if(abs_y < rect.y1 || abs_y > rect.y2) { - return LV_DRAW_SW_MASK_RES_FULL_COVER; - } - } - - if((abs_x >= rect.x1 + radius && abs_x + len <= rect.x2 - radius) || - (abs_y >= rect.y1 + radius && abs_y <= rect.y2 - radius)) { - if(outer == false) { - /*Remove the edges*/ - int32_t last = rect.x1 - abs_x; - if(last > len) return LV_DRAW_SW_MASK_RES_TRANSP; - if(last >= 0) { - lv_memzero(&mask_buf[0], last); - } - - int32_t first = rect.x2 - abs_x + 1; - if(first <= 0) return LV_DRAW_SW_MASK_RES_TRANSP; - else if(first < len) { - lv_memzero(&mask_buf[first], len - first); - } - if(last == 0 && first == len) return LV_DRAW_SW_MASK_RES_FULL_COVER; - else return LV_DRAW_SW_MASK_RES_CHANGED; - } - else { - int32_t first = rect.x1 - abs_x; - if(first < 0) first = 0; - if(first <= len) { - int32_t last = rect.x2 - abs_x - first + 1; - if(first + last > len) last = len - first; - if(last >= 0) { - lv_memzero(&mask_buf[first], last); - } - } - } - return LV_DRAW_SW_MASK_RES_CHANGED; - } - - int32_t k = rect.x1 - abs_x; /*First relevant coordinate on the of the mask*/ - int32_t w = lv_area_get_width(&rect); - int32_t h = lv_area_get_height(&rect); - abs_x -= rect.x1; - abs_y -= rect.y1; - - int32_t aa_len; - int32_t x_start; - int32_t cir_y; - if(abs_y < radius) { - cir_y = radius - abs_y - 1; - } - else { - cir_y = abs_y - (h - radius); - } - lv_opa_t * aa_opa = get_next_line(p->circle, cir_y, &aa_len, &x_start); - int32_t cir_x_right = k + w - radius + x_start; - int32_t cir_x_left = k + radius - x_start - 1; - int32_t i; - - if(outer == false) { - for(i = 0; i < aa_len; i++) { - lv_opa_t opa = aa_opa[aa_len - i - 1]; - if(cir_x_right + i >= 0 && cir_x_right + i < len) { - mask_buf[cir_x_right + i] = mask_mix(opa, mask_buf[cir_x_right + i]); - } - if(cir_x_left - i >= 0 && cir_x_left - i < len) { - mask_buf[cir_x_left - i] = mask_mix(opa, mask_buf[cir_x_left - i]); - } - } - - /*Clean the right side*/ - cir_x_right = LV_CLAMP(0, cir_x_right + i, len); - lv_memzero(&mask_buf[cir_x_right], len - cir_x_right); - - /*Clean the left side*/ - cir_x_left = LV_CLAMP(0, cir_x_left - aa_len + 1, len); - lv_memzero(&mask_buf[0], cir_x_left); - } - else { - for(i = 0; i < aa_len; i++) { - lv_opa_t opa = 255 - (aa_opa[aa_len - 1 - i]); - if(cir_x_right + i >= 0 && cir_x_right + i < len) { - mask_buf[cir_x_right + i] = mask_mix(opa, mask_buf[cir_x_right + i]); - } - if(cir_x_left - i >= 0 && cir_x_left - i < len) { - mask_buf[cir_x_left - i] = mask_mix(opa, mask_buf[cir_x_left - i]); - } - } - - int32_t clr_start = LV_CLAMP(0, cir_x_left + 1, len); - int32_t clr_len = LV_CLAMP(0, cir_x_right - clr_start, len - clr_start); - lv_memzero(&mask_buf[clr_start], clr_len); - } - - return LV_DRAW_SW_MASK_RES_CHANGED; -} - -static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_fade(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, int32_t len, - lv_draw_sw_mask_fade_param_t * p) -{ - if(abs_y < p->cfg.coords.y1) return LV_DRAW_SW_MASK_RES_FULL_COVER; - if(abs_y > p->cfg.coords.y2) return LV_DRAW_SW_MASK_RES_FULL_COVER; - if(abs_x + len < p->cfg.coords.x1) return LV_DRAW_SW_MASK_RES_FULL_COVER; - if(abs_x > p->cfg.coords.x2) return LV_DRAW_SW_MASK_RES_FULL_COVER; - - if(abs_x + len > p->cfg.coords.x2) len -= abs_x + len - p->cfg.coords.x2 - 1; - - if(abs_x < p->cfg.coords.x1) { - int32_t x_ofs = 0; - x_ofs = p->cfg.coords.x1 - abs_x; - len -= x_ofs; - mask_buf += x_ofs; - } - - int32_t i; - - if(abs_y <= p->cfg.y_top) { - for(i = 0; i < len; i++) { - mask_buf[i] = mask_mix(mask_buf[i], p->cfg.opa_top); - } - return LV_DRAW_SW_MASK_RES_CHANGED; - } - else if(abs_y >= p->cfg.y_bottom) { - for(i = 0; i < len; i++) { - mask_buf[i] = mask_mix(mask_buf[i], p->cfg.opa_bottom); - } - return LV_DRAW_SW_MASK_RES_CHANGED; - } - else { - /*Calculate the opa proportionally*/ - int16_t opa_diff = p->cfg.opa_bottom - p->cfg.opa_top; - int32_t y_diff = p->cfg.y_bottom - p->cfg.y_top + 1; - lv_opa_t opa_act = LV_OPA_MIX2(abs_y - p->cfg.y_top, opa_diff) / y_diff; - opa_act += p->cfg.opa_top; - - for(i = 0; i < len; i++) { - mask_buf[i] = mask_mix(mask_buf[i], opa_act); - } - return LV_DRAW_SW_MASK_RES_CHANGED; - } -} - -static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_map(lv_opa_t * mask_buf, int32_t abs_x, - int32_t abs_y, int32_t len, - lv_draw_sw_mask_map_param_t * p) -{ - /*Handle out of the mask cases*/ - if(abs_y < p->cfg.coords.y1) return LV_DRAW_SW_MASK_RES_FULL_COVER; - if(abs_y > p->cfg.coords.y2) return LV_DRAW_SW_MASK_RES_FULL_COVER; - if(abs_x + len < p->cfg.coords.x1) return LV_DRAW_SW_MASK_RES_FULL_COVER; - if(abs_x > p->cfg.coords.x2) return LV_DRAW_SW_MASK_RES_FULL_COVER; - - /*Got to the current row in the map*/ - const lv_opa_t * map_tmp = p->cfg.map; - map_tmp += (abs_y - p->cfg.coords.y1) * lv_area_get_width(&p->cfg.coords); - - if(abs_x + len > p->cfg.coords.x2) len -= abs_x + len - p->cfg.coords.x2 - 1; - - if(abs_x < p->cfg.coords.x1) { - int32_t x_ofs = 0; - x_ofs = p->cfg.coords.x1 - abs_x; - len -= x_ofs; - mask_buf += x_ofs; - } - else { - map_tmp += (abs_x - p->cfg.coords.x1); - } - - int32_t i; - for(i = 0; i < len; i++) { - mask_buf[i] = mask_mix(mask_buf[i], map_tmp[i]); - } - - return LV_DRAW_SW_MASK_RES_CHANGED; -} - -/** - * Initialize the circle drawing - * @param c pointer to a point. The coordinates will be calculated here - * @param tmp point to a variable. It will store temporary data - * @param radius radius of the circle - */ -static void circ_init(lv_point_t * c, int32_t * tmp, int32_t radius) -{ - c->x = radius; - c->y = 0; - *tmp = 1 - radius; -} - -/** - * Test the circle drawing is ready or not - * @param c same as in circ_init - * @return true if the circle is not ready yet - */ -static bool circ_cont(lv_point_t * c) -{ - return c->y <= c->x; -} - -/** - * Get the next point from the circle - * @param c same as in circ_init. The next point stored here. - * @param tmp same as in circ_init. - */ -static void circ_next(lv_point_t * c, int32_t * tmp) -{ - - if(*tmp <= 0) { - (*tmp) += 2 * c->y + 3; /*Change in decision criterion for y -> y+1*/ - } - else { - (*tmp) += 2 * (c->y - c->x) + 5; /*Change for y -> y+1, x -> x-1*/ - c->x--; - } - c->y++; -} - -static void circ_calc_aa4(lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t radius) -{ - if(radius == 0) return; - c->radius = radius; - - /*Allocate buffers*/ - if(c->buf) lv_free(c->buf); - - c->buf = lv_malloc(radius * 6 + 6); /*Use uint16_t for opa_start_on_y and x_start_on_y*/ - LV_ASSERT_MALLOC(c->buf); - c->cir_opa = c->buf; - c->opa_start_on_y = (uint16_t *)(c->buf + 2 * radius + 2); - c->x_start_on_y = (uint16_t *)(c->buf + 4 * radius + 4); - - /*Special case, handle manually*/ - if(radius == 1) { - c->cir_opa[0] = 180; - c->opa_start_on_y[0] = 0; - c->opa_start_on_y[1] = 1; - c->x_start_on_y[0] = 0; - return; - } - - const size_t cir_xy_size = (radius + 1) * 2 * 2 * sizeof(int32_t); - int32_t * cir_x = lv_malloc_zeroed(cir_xy_size); - int32_t * cir_y = &cir_x[(radius + 1) * 2]; - - uint32_t y_8th_cnt = 0; - lv_point_t cp; - int32_t tmp; - circ_init(&cp, &tmp, radius * 4); /*Upscale by 4*/ - int32_t i; - - uint32_t x_int[4]; - uint32_t x_fract[4]; - int32_t cir_size = 0; - x_int[0] = cp.x >> 2; - x_fract[0] = 0; - - /*Calculate an 1/8 circle*/ - while(circ_cont(&cp)) { - /*Calculate 4 point of the circle */ - for(i = 0; i < 4; i++) { - circ_next(&cp, &tmp); - if(circ_cont(&cp) == false) break; - x_int[i] = cp.x >> 2; - x_fract[i] = cp.x & 0x3; - } - if(i != 4) break; - - /*All lines on the same x when downscaled*/ - if(x_int[0] == x_int[3]) { - cir_x[cir_size] = x_int[0]; - cir_y[cir_size] = y_8th_cnt; - c->cir_opa[cir_size] = x_fract[0] + x_fract[1] + x_fract[2] + x_fract[3]; - c->cir_opa[cir_size] *= 16; - cir_size++; - } - /*Second line on new x when downscaled*/ - else if(x_int[0] != x_int[1]) { - cir_x[cir_size] = x_int[0]; - cir_y[cir_size] = y_8th_cnt; - c->cir_opa[cir_size] = x_fract[0]; - c->cir_opa[cir_size] *= 16; - cir_size++; - - cir_x[cir_size] = x_int[0] - 1; - cir_y[cir_size] = y_8th_cnt; - c->cir_opa[cir_size] = 1 * 4 + x_fract[1] + x_fract[2] + x_fract[3];; - c->cir_opa[cir_size] *= 16; - cir_size++; - } - /*Third line on new x when downscaled*/ - else if(x_int[0] != x_int[2]) { - cir_x[cir_size] = x_int[0]; - cir_y[cir_size] = y_8th_cnt; - c->cir_opa[cir_size] = x_fract[0] + x_fract[1]; - c->cir_opa[cir_size] *= 16; - cir_size++; - - cir_x[cir_size] = x_int[0] - 1; - cir_y[cir_size] = y_8th_cnt; - c->cir_opa[cir_size] = 2 * 4 + x_fract[2] + x_fract[3];; - c->cir_opa[cir_size] *= 16; - cir_size++; - } - /*Forth line on new x when downscaled*/ - else { - cir_x[cir_size] = x_int[0]; - cir_y[cir_size] = y_8th_cnt; - c->cir_opa[cir_size] = x_fract[0] + x_fract[1] + x_fract[2]; - c->cir_opa[cir_size] *= 16; - cir_size++; - - cir_x[cir_size] = x_int[0] - 1; - cir_y[cir_size] = y_8th_cnt; - c->cir_opa[cir_size] = 3 * 4 + x_fract[3];; - c->cir_opa[cir_size] *= 16; - cir_size++; - } - - y_8th_cnt++; - } - - /*The point on the 1/8 circle is special, calculate it manually*/ - int32_t mid = radius * 723; - int32_t mid_int = mid >> 10; - if(cir_x[cir_size - 1] != mid_int || cir_y[cir_size - 1] != mid_int) { - int32_t tmp_val = mid - (mid_int << 10); - if(tmp_val <= 512) { - tmp_val = tmp_val * tmp_val * 2; - tmp_val = tmp_val >> (10 + 6); - } - else { - tmp_val = 1024 - tmp_val; - tmp_val = tmp_val * tmp_val * 2; - tmp_val = tmp_val >> (10 + 6); - tmp_val = 15 - tmp_val; - } - - cir_x[cir_size] = mid_int; - cir_y[cir_size] = mid_int; - c->cir_opa[cir_size] = tmp_val; - c->cir_opa[cir_size] *= 16; - cir_size++; - } - - /*Build the second octet by mirroring the first*/ - for(i = cir_size - 2; i >= 0; i--, cir_size++) { - cir_x[cir_size] = cir_y[i]; - cir_y[cir_size] = cir_x[i]; - c->cir_opa[cir_size] = c->cir_opa[i]; - } - - int32_t y = 0; - i = 0; - c->opa_start_on_y[0] = 0; - while(i < cir_size) { - c->opa_start_on_y[y] = i; - c->x_start_on_y[y] = cir_x[i]; - for(; cir_y[i] == y && i < (int32_t)cir_size; i++) { - c->x_start_on_y[y] = LV_MIN(c->x_start_on_y[y], cir_x[i]); - } - y++; - } - - lv_free(cir_x); -} - -static lv_opa_t * get_next_line(lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t y, int32_t * len, - int32_t * x_start) -{ - *len = c->opa_start_on_y[y + 1] - c->opa_start_on_y[y]; - *x_start = c->x_start_on_y[y]; - return &c->cir_opa[c->opa_start_on_y[y]]; -} - -static inline lv_opa_t LV_ATTRIBUTE_FAST_MEM mask_mix(lv_opa_t mask_act, lv_opa_t mask_new) -{ - if(mask_new >= LV_OPA_MAX) return mask_act; - if(mask_new <= LV_OPA_MIN) return 0; - - return LV_UDIV255(mask_act * mask_new); -} - -#endif /*LV_DRAW_SW_COMPLEX*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_mask.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_mask.h deleted file mode 100644 index 3f7b306..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_mask.h +++ /dev/null @@ -1,185 +0,0 @@ -/** - * @file lv_draw_sw_mask.h - * - */ - -#ifndef LV_DRAW_SW_MASK_H -#define LV_DRAW_SW_MASK_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_area.h" -#include "../../misc/lv_color.h" -#include "../../misc/lv_math.h" -#include "../../misc/lv_types.h" - -/********************* - * DEFINES - *********************/ -#define LV_MASK_ID_INV (-1) -#if LV_DRAW_SW_COMPLEX -# define LV_MASK_MAX_NUM 16 -#else -# define LV_MASK_MAX_NUM 1 -#endif - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - LV_DRAW_SW_MASK_RES_TRANSP, - LV_DRAW_SW_MASK_RES_FULL_COVER, - LV_DRAW_SW_MASK_RES_CHANGED, - LV_DRAW_SW_MASK_RES_UNKNOWN -} lv_draw_sw_mask_res_t; - -#if LV_DRAW_SW_COMPLEX - -typedef enum { - LV_DRAW_SW_MASK_TYPE_LINE, - LV_DRAW_SW_MASK_TYPE_ANGLE, - LV_DRAW_SW_MASK_TYPE_RADIUS, - LV_DRAW_SW_MASK_TYPE_FADE, - LV_DRAW_SW_MASK_TYPE_MAP, -} lv_draw_sw_mask_type_t; - -typedef enum { - LV_DRAW_SW_MASK_LINE_SIDE_LEFT = 0, - LV_DRAW_SW_MASK_LINE_SIDE_RIGHT, - LV_DRAW_SW_MASK_LINE_SIDE_TOP, - LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM, -} lv_draw_sw_mask_line_side_t; - -/** - * A common callback type for every mask type. - * Used internally by the library. - */ -typedef lv_draw_sw_mask_res_t (*lv_draw_sw_mask_xcb_t)(lv_opa_t * mask_buf, int32_t abs_x, int32_t abs_y, - int32_t len, - void * p); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_draw_sw_mask_init(void); - -void lv_draw_sw_mask_deinit(void); - -//! @cond Doxygen_Suppress - -/** - * Apply the added buffers on a line. Used internally by the library's drawing routines. - * @param masks the masks list to apply, must be ended with NULL pointer in array. - * @param mask_buf store the result mask here. Has to be `len` byte long. Should be initialized with `0xFF`. - * @param abs_x absolute X coordinate where the line to calculate start - * @param abs_y absolute Y coordinate where the line to calculate start - * @param len length of the line to calculate (in pixel count) - * @return One of these values: - * - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero - * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged - * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line - */ -lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_mask_apply(void * masks[], lv_opa_t * mask_buf, - int32_t abs_x, - int32_t abs_y, - int32_t len); - -//! @endcond - -/** - * Free the data from the parameter. - * It's called inside `lv_draw_sw_mask_remove_id` and `lv_draw_sw_mask_remove_custom` - * Needs to be called only in special cases when the mask is not added by `lv_draw_mask_add` - * and not removed by `lv_draw_mask_remove_id` or `lv_draw_mask_remove_custom` - * @param p pointer to a mask parameter - */ -void lv_draw_sw_mask_free_param(void * p); - -/** - *Initialize a line mask from two points. - * @param param pointer to a `lv_draw_mask_param_t` to initialize - * @param p1x X coordinate of the first point of the line - * @param p1y Y coordinate of the first point of the line - * @param p2x X coordinate of the second point of the line - * @param p2y y coordinate of the second point of the line - * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. - * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept - * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept - */ -void lv_draw_sw_mask_line_points_init(lv_draw_sw_mask_line_param_t * param, int32_t p1x, int32_t p1y, - int32_t p2x, - int32_t p2y, lv_draw_sw_mask_line_side_t side); - -/** - *Initialize a line mask from a point and an angle. - * @param param pointer to a `lv_draw_mask_param_t` to initialize - * @param px X coordinate of a point of the line - * @param py X coordinate of a point of the line - * @param angle right 0 deg, bottom: 90 - * @param side an element of `lv_draw_mask_line_side_t` to describe which side to keep. - * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept - * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept - */ -void lv_draw_sw_mask_line_angle_init(lv_draw_sw_mask_line_param_t * param, int32_t px, int32_t py, int16_t angle, - lv_draw_sw_mask_line_side_t side); - -/** - * Initialize an angle mask. - * @param param pointer to a `lv_draw_mask_param_t` to initialize - * @param vertex_x X coordinate of the angle vertex (absolute coordinates) - * @param vertex_y Y coordinate of the angle vertex (absolute coordinates) - * @param start_angle start angle in degrees. 0 deg on the right, 90 deg, on the bottom - * @param end_angle end angle - */ -void lv_draw_sw_mask_angle_init(lv_draw_sw_mask_angle_param_t * param, int32_t vertex_x, int32_t vertex_y, - int32_t start_angle, int32_t end_angle); - -/** - * Initialize a fade mask. - * @param param pointer to an `lv_draw_mask_radius_param_t` to initialize - * @param rect coordinates of the rectangle to affect (absolute coordinates) - * @param radius radius of the rectangle - * @param inv true: keep the pixels inside the rectangle; keep the pixels outside of the rectangle - */ -void lv_draw_sw_mask_radius_init(lv_draw_sw_mask_radius_param_t * param, const lv_area_t * rect, int32_t radius, - bool inv); - -/** - * Initialize a fade mask. - * @param param pointer to a `lv_draw_mask_param_t` to initialize - * @param coords coordinates of the area to affect (absolute coordinates) - * @param opa_top opacity on the top - * @param y_top at which coordinate start to change to opacity to `opa_bottom` - * @param opa_bottom opacity at the bottom - * @param y_bottom at which coordinate reach `opa_bottom`. - */ -void lv_draw_sw_mask_fade_init(lv_draw_sw_mask_fade_param_t * param, const lv_area_t * coords, lv_opa_t opa_top, - int32_t y_top, - lv_opa_t opa_bottom, int32_t y_bottom); - -/** - * Initialize a map mask. - * @param param pointer to a `lv_draw_mask_param_t` to initialize - * @param coords coordinates of the map (absolute coordinates) - * @param map array of bytes with the mask values - */ -void lv_draw_sw_mask_map_init(lv_draw_sw_mask_map_param_t * param, const lv_area_t * coords, const lv_opa_t * map); - -#endif /*LV_DRAW_SW_COMPLEX*/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_MASK_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_mask_private.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_mask_private.h deleted file mode 100644 index aeae9b8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_mask_private.h +++ /dev/null @@ -1,157 +0,0 @@ -/** - * @file lv_draw_sw_mask_private.h - * - */ - -#ifndef LV_DRAW_SW_MASK_PRIVATE_H -#define LV_DRAW_SW_MASK_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_sw_mask.h" - -#if LV_DRAW_SW_COMPLEX - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - uint8_t * buf; - lv_opa_t * cir_opa; /**< Opacity of values on the circumference of an 1/4 circle */ - uint16_t * x_start_on_y; /**< The x coordinate of the circle for each y value */ - uint16_t * opa_start_on_y; /**< The index of `cir_opa` for each y value */ - int32_t life; /**< How many times the entry way used */ - uint32_t used_cnt; /**< Like a semaphore to count the referencing masks */ - int32_t radius; /**< The radius of the entry */ -} lv_draw_sw_mask_radius_circle_dsc_t; - -struct lv_draw_sw_mask_common_dsc_t { - lv_draw_sw_mask_xcb_t cb; - lv_draw_sw_mask_type_t type; -}; - -struct lv_draw_sw_mask_line_param_t { - /** The first element must be the common descriptor */ - lv_draw_sw_mask_common_dsc_t dsc; - - struct { - /*First point*/ - lv_point_t p1; - - /*Second point*/ - lv_point_t p2; - - /*Which side to keep?*/ - lv_draw_sw_mask_line_side_t side : 2; - } cfg; - - /** A point of the line */ - lv_point_t origo; - - /** X / (1024*Y) steepness (X is 0..1023 range). What is the change of X in 1024 Y? */ - int32_t xy_steep; - - /** Y / (1024*X) steepness (Y is 0..1023 range). What is the change of Y in 1024 X? */ - int32_t yx_steep; - - /** Helper which stores yx_steep for flat lines and xy_steep for steep (non flat) lines */ - int32_t steep; - - /** Steepness in 1 px in 0..255 range. Used only by flat lines. */ - int32_t spx; - - /** 1: It's a flat line? (Near to horizontal) */ - uint8_t flat : 1; - - /** Invert the mask. The default is: Keep the left part. - *It is used to select left/right/top/bottom */ - uint8_t inv: 1; -}; - -struct lv_draw_sw_mask_angle_param_t { - /** The first element must be the common descriptor */ - lv_draw_sw_mask_common_dsc_t dsc; - - struct { - lv_point_t vertex_p; - int32_t start_angle; - int32_t end_angle; - } cfg; - - lv_draw_sw_mask_line_param_t start_line; - lv_draw_sw_mask_line_param_t end_line; - uint16_t delta_deg; -}; - -struct lv_draw_sw_mask_radius_param_t { - /** The first element must be the common descriptor */ - lv_draw_sw_mask_common_dsc_t dsc; - - struct { - lv_area_t rect; - int32_t radius; - /** Invert the mask. 0: Keep the pixels inside. */ - uint8_t outer: 1; - } cfg; - - lv_draw_sw_mask_radius_circle_dsc_t * circle; -}; - -struct lv_draw_sw_mask_fade_param_t { - /** The first element must be the common descriptor */ - lv_draw_sw_mask_common_dsc_t dsc; - - struct { - lv_area_t coords; - int32_t y_top; - int32_t y_bottom; - lv_opa_t opa_top; - lv_opa_t opa_bottom; - } cfg; - -}; - -struct lv_draw_sw_mask_map_param_t { - /** The first element must be the common descriptor */ - lv_draw_sw_mask_common_dsc_t dsc; - - struct { - lv_area_t coords; - const lv_opa_t * map; - } cfg; -}; - -typedef lv_draw_sw_mask_radius_circle_dsc_t lv_draw_sw_mask_radius_circle_dsc_arr_t[LV_DRAW_SW_CIRCLE_CACHE_SIZE]; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Called by LVGL the rendering of a screen is ready to clean up - * the temporal (cache) data of the masks - */ -void lv_draw_sw_mask_cleanup(void); - -/********************** - * MACROS - **********************/ - -#endif /*LV_DRAW_SW_COMPLEX*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_MASK_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_mask_rect.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_mask_rect.c deleted file mode 100644 index bd28d0d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_mask_rect.c +++ /dev/null @@ -1,134 +0,0 @@ -/** - * @file lv_draw_sw_mask_rect.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_area_private.h" -#include "../lv_draw_mask_private.h" -#include "../lv_draw_private.h" -#if LV_USE_DRAW_SW -#if LV_DRAW_SW_COMPLEX - -#include "../../misc/lv_math.h" -#include "../../misc/lv_log.h" -#include "../../stdlib/lv_mem.h" -#include "../../stdlib/lv_string.h" -#include "lv_draw_sw.h" -#include "lv_draw_sw_mask_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_sw_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, const lv_area_t * coords) -{ - LV_UNUSED(coords); - - lv_area_t draw_area; - if(!lv_area_intersect(&draw_area, &dsc->area, draw_unit->clip_area)) { - return; - } - - lv_layer_t * target_layer = draw_unit->target_layer; - lv_area_t * buf_area = &target_layer->buf_area; - lv_area_t clear_area; - - void * draw_buf = target_layer->draw_buf; - - /*Clear the top part*/ - lv_area_set(&clear_area, draw_unit->clip_area->x1, draw_unit->clip_area->y1, draw_unit->clip_area->x2, - dsc->area.y1 - 1); - lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1); - lv_draw_buf_clear(draw_buf, &clear_area); - - /*Clear the bottom part*/ - lv_area_set(&clear_area, draw_unit->clip_area->x1, dsc->area.y2 + 1, draw_unit->clip_area->x2, - draw_unit->clip_area->y2); - lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1); - lv_draw_buf_clear(draw_buf, &clear_area); - - /*Clear the left part*/ - lv_area_set(&clear_area, draw_unit->clip_area->x1, dsc->area.y1, dsc->area.x1 - 1, dsc->area.y2); - lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1); - lv_draw_buf_clear(draw_buf, &clear_area); - - /*Clear the right part*/ - lv_area_set(&clear_area, dsc->area.x2 + 1, dsc->area.y1, draw_unit->clip_area->x2, dsc->area.y2); - lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1); - lv_draw_buf_clear(draw_buf, &clear_area); - - lv_draw_sw_mask_radius_param_t param; - lv_draw_sw_mask_radius_init(¶m, &dsc->area, dsc->radius, false); - - void * masks[2] = {0}; - masks[0] = ¶m; - - uint32_t area_w = lv_area_get_width(&draw_area); - lv_opa_t * mask_buf = lv_malloc(area_w); - - int32_t y; - for(y = draw_area.y1; y <= draw_area.y2; y++) { - lv_memset(mask_buf, 0xff, area_w); - lv_draw_sw_mask_res_t res = lv_draw_sw_mask_apply(masks, mask_buf, draw_area.x1, y, area_w); - if(res == LV_DRAW_SW_MASK_RES_FULL_COVER) continue; - - lv_color32_t * c32_buf = lv_draw_layer_go_to_xy(target_layer, draw_area.x1 - buf_area->x1, - y - buf_area->y1); - - if(res == LV_DRAW_SW_MASK_RES_TRANSP) { - lv_memzero(c32_buf, area_w * sizeof(lv_color32_t)); - } - else { - uint32_t i; - for(i = 0; i < area_w; i++) { - if(mask_buf[i] != LV_OPA_COVER) { - c32_buf[i].alpha = LV_OPA_MIX2(c32_buf[i].alpha, mask_buf[i]); - } - } - } - } - - lv_free(mask_buf); - lv_draw_sw_mask_free_param(¶m); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#else /*LV_DRAW_SW_COMPLEX*/ - -void lv_draw_sw_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, const lv_area_t * coords) -{ - LV_UNUSED(draw_unit); - LV_UNUSED(dsc); - LV_UNUSED(coords); - - LV_LOG_WARN("LV_DRAW_SW_COMPLEX needs to be enabled"); -} - -#endif /*LV_DRAW_SW_COMPLEX*/ -#endif /*LV_USE_DRAW_SW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_private.h b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_private.h deleted file mode 100644 index 38ba3b4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_private.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @file lv_draw_sw_private.h - * - */ - -#ifndef LV_DRAW_SW_PRIVATE_H -#define LV_DRAW_SW_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_sw.h" -#include "../lv_draw_private.h" - -#if LV_USE_DRAW_SW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_draw_sw_unit_t { - lv_draw_unit_t base_unit; - lv_draw_task_t * task_act; -#if LV_USE_OS - lv_thread_sync_t sync; - lv_thread_t thread; - volatile bool inited; - volatile bool exit_status; -#endif - uint32_t idx; -}; - -#if LV_DRAW_SW_SHADOW_CACHE_SIZE -typedef struct { - uint8_t cache[LV_DRAW_SW_SHADOW_CACHE_SIZE * LV_DRAW_SW_SHADOW_CACHE_SIZE]; - int32_t cache_size; - int32_t cache_r; -} lv_draw_sw_shadow_cache_t; -#endif - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_DRAW_SW */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_SW_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_transform.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_transform.c deleted file mode 100644 index 41036d4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_transform.c +++ /dev/null @@ -1,870 +0,0 @@ -/** - * @file lv_draw_sw_transform.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_sw.h" -#if LV_USE_DRAW_SW - -#include "../../misc/lv_assert.h" -#include "../../misc/lv_area.h" -#include "../../core/lv_refr.h" -#include "../../misc/lv_color.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - int32_t x_in; - int32_t y_in; - int32_t x_out; - int32_t y_out; - int32_t sinma; - int32_t cosma; - int32_t scale_x; - int32_t scale_y; - int32_t angle; - int32_t pivot_x_256; - int32_t pivot_y_256; - lv_point_t pivot; -} point_transform_dsc_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -/** - * Transform a point with 1/256 precision (the output coordinates are upscaled by 256) - * @param t pointer to n initialized `point_transform_dsc_t` structure - * @param xin X coordinate to rotate - * @param yin Y coordinate to rotate - * @param xout upscaled, transformed X - * @param yout upscaled, transformed Y - */ -static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int32_t yin, int32_t * xout, - int32_t * yout); - -#if LV_DRAW_SW_SUPPORT_RGB888 -static void transform_rgb888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, - int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, - int32_t x_end, uint8_t * dest_buf, bool aa, uint32_t px_size); -#endif - -#if LV_DRAW_SW_SUPPORT_ARGB8888 -static void transform_argb8888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, - int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, - int32_t x_end, uint8_t * dest_buf, bool aa); -#endif - -#if LV_DRAW_SW_SUPPORT_RGB565A8 -static void transform_rgb565a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, - int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, - int32_t x_end, uint16_t * cbuf, uint8_t * abuf, bool src_has_a8, bool aa); -#endif - -#if LV_DRAW_SW_SUPPORT_A8 -static void transform_a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, - int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, - int32_t x_end, uint8_t * abuf, bool aa); -#endif - -#if LV_DRAW_SW_SUPPORT_L8 -static void transform_l8_to_al88(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, - int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, - int32_t x_end, uint8_t * abuf, bool aa); - -static void transform_l8_to_argb8888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, - int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, - int32_t x_end, uint8_t * abuf, bool aa); -#endif - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_sw_transform(lv_draw_unit_t * draw_unit, const lv_area_t * dest_area, const void * src_buf, - int32_t src_w, int32_t src_h, int32_t src_stride, - const lv_draw_image_dsc_t * draw_dsc, const lv_draw_image_sup_t * sup, lv_color_format_t src_cf, void * dest_buf) -{ - LV_UNUSED(draw_unit); - LV_UNUSED(sup); - - point_transform_dsc_t tr_dsc; - tr_dsc.angle = -draw_dsc->rotation; - tr_dsc.scale_x = draw_dsc->scale_x; - tr_dsc.scale_y = draw_dsc->scale_y; - tr_dsc.pivot = draw_dsc->pivot; - - int32_t angle_low = tr_dsc.angle / 10; - int32_t angle_high = angle_low + 1; - int32_t angle_rem = tr_dsc.angle - (angle_low * 10); - - int32_t s1 = lv_trigo_sin(angle_low); - int32_t s2 = lv_trigo_sin(angle_high); - - int32_t c1 = lv_trigo_sin(angle_low + 90); - int32_t c2 = lv_trigo_sin(angle_high + 90); - - tr_dsc.sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10; - tr_dsc.cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10; - tr_dsc.sinma = tr_dsc.sinma >> (LV_TRIGO_SHIFT - 10); - tr_dsc.cosma = tr_dsc.cosma >> (LV_TRIGO_SHIFT - 10); - tr_dsc.pivot_x_256 = tr_dsc.pivot.x * 256; - tr_dsc.pivot_y_256 = tr_dsc.pivot.y * 256; - - int32_t dest_w = lv_area_get_width(dest_area); - int32_t dest_h = lv_area_get_height(dest_area); - - int32_t dest_stride_a8 = dest_w; - int32_t dest_stride; - if(src_cf == LV_COLOR_FORMAT_L8) { - dest_stride = dest_w * ((draw_dsc->recolor_opa >= LV_OPA_MIN) ? 4 : 2); - } - else if(src_cf == LV_COLOR_FORMAT_RGB888) { - dest_stride = dest_w * lv_color_format_get_size(LV_COLOR_FORMAT_ARGB8888); - } - else if((src_cf == LV_COLOR_FORMAT_RGB565A8) || (src_cf == LV_COLOR_FORMAT_L8)) { - dest_stride = dest_w * 2; - } - else { - dest_stride = dest_w * lv_color_format_get_size(src_cf); - } - - uint8_t * alpha_buf; - if(src_cf == LV_COLOR_FORMAT_RGB565 || src_cf == LV_COLOR_FORMAT_RGB565A8) { - alpha_buf = dest_buf; - alpha_buf += dest_stride * dest_h; - } - else { - alpha_buf = NULL; - } - - bool aa = (bool) draw_dsc->antialias; - bool is_rotated = draw_dsc->rotation; - - int32_t xs_ups = 0, ys_ups = 0, ys_ups_start = 0, ys_step_256_original = 0; - int32_t xs_step_256 = 0, ys_step_256 = 0; - - /*When some of the color formats are disabled, these variables could be unused, avoid warning here*/ - LV_UNUSED(aa); - LV_UNUSED(xs_ups); - LV_UNUSED(ys_ups); - LV_UNUSED(xs_step_256); - LV_UNUSED(ys_step_256); - - /*If scaled only make some simplification to avoid rounding errors. - *For example if there is a 100x100 image zoomed to 300% - *The destination area in X will be x1=0; x2=299 - *When the step is calculated below it will think that stepping - *1/3 pixels on the original image will result in 300% zoom. - *However this way the last pixel will be on the 99.67 coordinate. - *As it's larger than 99.5 LVGL will start to mix the next coordinate - *which is out of the image, so will make the pixel more transparent. - *To avoid it in case of scale only limit the coordinates to the 0..297 range, - *that is to 0..(src_w-1)*zoom */ - if(is_rotated == false) { - int32_t xs1_ups, ys1_ups, xs2_ups, ys2_ups; - - int32_t x_max = (((src_w - 1 - draw_dsc->pivot.x) * draw_dsc->scale_x) >> 8) + draw_dsc->pivot.x; - int32_t y_max = (((src_h - 1 - draw_dsc->pivot.y) * draw_dsc->scale_y) >> 8) + draw_dsc->pivot.y; - - lv_area_t dest_area_limited; - dest_area_limited.x1 = dest_area->x1 > x_max ? x_max : dest_area->x1; - dest_area_limited.x2 = dest_area->x2 > x_max ? x_max : dest_area->x2; - dest_area_limited.y1 = dest_area->y1 > y_max ? y_max : dest_area->y1; - dest_area_limited.y2 = dest_area->y2 > y_max ? y_max : dest_area->y2; - - transform_point_upscaled(&tr_dsc, dest_area_limited.x1, dest_area_limited.y1, &xs1_ups, &ys1_ups); - transform_point_upscaled(&tr_dsc, dest_area_limited.x2, dest_area_limited.y2, &xs2_ups, &ys2_ups); - - int32_t xs_diff = xs2_ups - xs1_ups; - int32_t ys_diff = ys2_ups - ys1_ups; - xs_step_256 = 0; - ys_step_256_original = 0; - if(dest_w > 1) { - xs_step_256 = (256 * xs_diff) / (dest_w - 1); - } - if(dest_h > 1) { - ys_step_256_original = (256 * ys_diff) / (dest_h - 1); - } - - xs_ups = xs1_ups + 0x80; - ys_ups_start = ys1_ups + 0x80; - } - - int32_t y; - for(y = 0; y < dest_h; y++) { - if(is_rotated == false) { - ys_ups = ys_ups_start + ((ys_step_256_original * y) >> 8); - ys_step_256 = 0; - } - else { - int32_t xs1_ups, ys1_ups, xs2_ups, ys2_ups; - transform_point_upscaled(&tr_dsc, dest_area->x1, dest_area->y1 + y, &xs1_ups, &ys1_ups); - transform_point_upscaled(&tr_dsc, dest_area->x2, dest_area->y1 + y, &xs2_ups, &ys2_ups); - - int32_t xs_diff = xs2_ups - xs1_ups; - int32_t ys_diff = ys2_ups - ys1_ups; - xs_step_256 = 0; - ys_step_256 = 0; - if(dest_w > 1) { - xs_step_256 = (256 * xs_diff) / (dest_w - 1); - ys_step_256 = (256 * ys_diff) / (dest_w - 1); - } - - xs_ups = xs1_ups + 0x80; - ys_ups = ys1_ups + 0x80; - } - - switch(src_cf) { -#if LV_DRAW_SW_SUPPORT_XRGB8888 - case LV_COLOR_FORMAT_XRGB8888: - transform_rgb888(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, aa, - 4); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB888 - case LV_COLOR_FORMAT_RGB888: - transform_rgb888(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, aa, - 3); - break; -#endif -#if LV_DRAW_SW_SUPPORT_A8 - case LV_COLOR_FORMAT_A8: - transform_a8(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, aa); - break; -#endif -#if LV_DRAW_SW_SUPPORT_ARGB8888 - case LV_COLOR_FORMAT_ARGB8888: - transform_argb8888(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, - aa); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB565 && LV_DRAW_SW_SUPPORT_RGB565A8 - case LV_COLOR_FORMAT_RGB565: - transform_rgb565a8(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, - alpha_buf, false, aa); - break; -#endif -#if LV_DRAW_SW_SUPPORT_RGB565A8 - case LV_COLOR_FORMAT_RGB565A8: - transform_rgb565a8(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, - (uint16_t *)dest_buf, - alpha_buf, true, aa); - break; -#endif -#if LV_DRAW_SW_SUPPORT_L8 - case LV_COLOR_FORMAT_L8: - if(draw_dsc->recolor_opa >= LV_OPA_MIN) - transform_l8_to_argb8888(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, - aa); - else - transform_l8_to_al88(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, aa); - break; -#endif - default: - break; - } - - dest_buf = (uint8_t *)dest_buf + dest_stride; - if(alpha_buf) alpha_buf += dest_stride_a8; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#if LV_DRAW_SW_SUPPORT_RGB888 - -static void transform_rgb888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, - int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, - int32_t x_end, uint8_t * dest_buf, bool aa, uint32_t px_size) -{ - int32_t xs_ups_start = xs_ups; - int32_t ys_ups_start = ys_ups; - lv_color32_t * dest_c32 = (lv_color32_t *) dest_buf; - - int32_t x; - for(x = 0; x < x_end; x++) { - xs_ups = xs_ups_start + ((xs_step * x) >> 8); - ys_ups = ys_ups_start + ((ys_step * x) >> 8); - - int32_t xs_int = xs_ups >> 8; - int32_t ys_int = ys_ups >> 8; - - /*Fully out of the image*/ - if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { - dest_c32[x].alpha = 0x00; - continue; - } - - /*Get the direction the hor and ver neighbor - *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ - int32_t xs_fract = xs_ups & 0xFF; - int32_t ys_fract = ys_ups & 0xFF; - - int32_t x_next; - int32_t y_next; - if(xs_fract < 0x80) { - x_next = -1; - xs_fract = 0x7F - xs_fract; - } - else { - x_next = 1; - xs_fract = xs_fract - 0x80; - } - if(ys_fract < 0x80) { - y_next = -1; - ys_fract = 0x7F - ys_fract; - } - else { - y_next = 1; - ys_fract = ys_fract - 0x80; - } - - const uint8_t * src_u8 = &src[ys_int * src_stride + xs_int * px_size]; - - dest_c32[x].red = src_u8[2]; - dest_c32[x].green = src_u8[1]; - dest_c32[x].blue = src_u8[0]; - dest_c32[x].alpha = 0xff; - - if(aa && - xs_int + x_next >= 0 && - xs_int + x_next <= src_w - 1 && - ys_int + y_next >= 0 && - ys_int + y_next <= src_h - 1) { - const uint8_t * px_hor_u8 = src_u8 + (int32_t)(x_next * px_size); - lv_color32_t px_hor; - px_hor.red = px_hor_u8[2]; - px_hor.green = px_hor_u8[1]; - px_hor.blue = px_hor_u8[0]; - px_hor.alpha = 0xff; - - const uint8_t * px_ver_u8 = src_u8 + (int32_t)(y_next * src_stride); - lv_color32_t px_ver; - px_ver.red = px_ver_u8[2]; - px_ver.green = px_ver_u8[1]; - px_ver.blue = px_ver_u8[0]; - px_ver.alpha = 0xff; - - if(!lv_color32_eq(dest_c32[x], px_ver)) { - px_ver.alpha = ys_fract; - dest_c32[x] = lv_color_mix32(px_ver, dest_c32[x]); - } - - if(!lv_color32_eq(dest_c32[x], px_hor)) { - px_hor.alpha = xs_fract; - dest_c32[x] = lv_color_mix32(px_hor, dest_c32[x]); - } - } - /*Partially out of the image*/ - else { - lv_opa_t a = 0xff; - - if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { - dest_c32[x].alpha = (a * (0xFF - xs_fract)) >> 8; - } - else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { - dest_c32[x].alpha = (a * (0xFF - ys_fract)) >> 8; - } - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_ARGB8888 - -static void transform_argb8888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, - int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, - int32_t x_end, uint8_t * dest_buf, bool aa) -{ - int32_t xs_ups_start = xs_ups; - int32_t ys_ups_start = ys_ups; - lv_color32_t * dest_c32 = (lv_color32_t *) dest_buf; - - int32_t x; - for(x = 0; x < x_end; x++) { - xs_ups = xs_ups_start + ((xs_step * x) >> 8); - ys_ups = ys_ups_start + ((ys_step * x) >> 8); - - int32_t xs_int = xs_ups >> 8; - int32_t ys_int = ys_ups >> 8; - - /*Fully out of the image*/ - if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { - ((uint32_t *)dest_buf)[x] = 0x00000000; - continue; - } - - /*Get the direction the hor and ver neighbor - *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ - int32_t xs_fract = xs_ups & 0xFF; - int32_t ys_fract = ys_ups & 0xFF; - - int32_t x_next; - int32_t y_next; - if(xs_fract < 0x80) { - x_next = -1; - xs_fract = 0x7F - xs_fract; - } - else { - x_next = 1; - xs_fract = xs_fract - 0x80; - } - if(ys_fract < 0x80) { - y_next = -1; - ys_fract = 0x7F - ys_fract; - } - else { - y_next = 1; - ys_fract = ys_fract - 0x80; - } - - const lv_color32_t * src_c32 = (const lv_color32_t *)(src + ys_int * src_stride + xs_int * 4); - - dest_c32[x] = src_c32[0]; - - if(aa && - xs_int + x_next >= 0 && - xs_int + x_next <= src_w - 1 && - ys_int + y_next >= 0 && - ys_int + y_next <= src_h - 1) { - - lv_color32_t px_hor = src_c32[x_next]; - lv_color32_t px_ver = *(const lv_color32_t *)((uint8_t *)src_c32 + y_next * src_stride); - - if(px_ver.alpha == 0) { - dest_c32[x].alpha = (dest_c32[x].alpha * (0xFF - ys_fract)) >> 8; - } - else if(!lv_color32_eq(dest_c32[x], px_ver)) { - if(dest_c32[x].alpha) dest_c32[x].alpha = ((px_ver.alpha * ys_fract) + (dest_c32[x].alpha * (0xFF - ys_fract))) >> 8; - px_ver.alpha = ys_fract; - dest_c32[x] = lv_color_mix32(px_ver, dest_c32[x]); - } - - if(px_hor.alpha == 0) { - dest_c32[x].alpha = (dest_c32[x].alpha * (0xFF - xs_fract)) >> 8; - } - else if(!lv_color32_eq(dest_c32[x], px_hor)) { - if(dest_c32[x].alpha) dest_c32[x].alpha = ((px_hor.alpha * xs_fract) + (dest_c32[x].alpha * (0xFF - xs_fract))) >> 8; - px_hor.alpha = xs_fract; - dest_c32[x] = lv_color_mix32(px_hor, dest_c32[x]); - } - } - /*Partially out of the image*/ - else { - if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { - dest_c32[x].alpha = (dest_c32[x].alpha * (0x7F - xs_fract)) >> 7; - } - else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { - dest_c32[x].alpha = (dest_c32[x].alpha * (0x7F - ys_fract)) >> 7; - } - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_RGB565A8 - -static void transform_rgb565a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, - int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, - int32_t x_end, uint16_t * cbuf, uint8_t * abuf, bool src_has_a8, bool aa) -{ - int32_t xs_ups_start = xs_ups; - int32_t ys_ups_start = ys_ups; - - const lv_opa_t * src_alpha = src + src_stride * src_h; - - /*Must be signed type, because we would use negative array index calculated from stride*/ - int32_t alpha_stride = src_stride / 2; /*alpha map stride is always half of RGB map stride*/ - - int32_t x; - for(x = 0; x < x_end; x++) { - xs_ups = xs_ups_start + ((xs_step * x) >> 8); - ys_ups = ys_ups_start + ((ys_step * x) >> 8); - - int32_t xs_int = xs_ups >> 8; - int32_t ys_int = ys_ups >> 8; - - /*Fully out of the image*/ - if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { - abuf[x] = 0x00; - continue; - } - - /*Get the direction the hor and ver neighbor - *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ - int32_t xs_fract = xs_ups & 0xFF; - int32_t ys_fract = ys_ups & 0xFF; - - int32_t x_next; - int32_t y_next; - if(xs_fract < 0x80) { - x_next = -1; - xs_fract = (0x7F - xs_fract) * 2; - } - else { - x_next = 1; - xs_fract = (xs_fract - 0x80) * 2; - } - if(ys_fract < 0x80) { - y_next = -1; - ys_fract = (0x7F - ys_fract) * 2; - } - else { - y_next = 1; - ys_fract = (ys_fract - 0x80) * 2; - } - - const uint16_t * src_tmp_u16 = (const uint16_t *)(src + (ys_int * src_stride) + xs_int * 2); - cbuf[x] = src_tmp_u16[0]; - - if(aa && - xs_int + x_next >= 0 && - xs_int + x_next <= src_w - 1 && - ys_int + y_next >= 0 && - ys_int + y_next <= src_h - 1) { - - uint16_t px_hor = src_tmp_u16[x_next]; - uint16_t px_ver = *(const uint16_t *)((uint8_t *)src_tmp_u16 + (y_next * src_stride)); - - if(src_has_a8) { - const lv_opa_t * src_alpha_tmp = src_alpha; - src_alpha_tmp += (ys_int * alpha_stride) + xs_int; - abuf[x] = src_alpha_tmp[0]; - - lv_opa_t a_hor = src_alpha_tmp[x_next]; - lv_opa_t a_ver = src_alpha_tmp[y_next * alpha_stride]; - - if(a_ver != abuf[x]) a_ver = ((a_ver * ys_fract) + (abuf[x] * (0x100 - ys_fract))) >> 8; - if(a_hor != abuf[x]) a_hor = ((a_hor * xs_fract) + (abuf[x] * (0x100 - xs_fract))) >> 8; - abuf[x] = (a_ver + a_hor) >> 1; - - if(abuf[x] == 0x00) continue; - } - else { - abuf[x] = 0xff; - } - - if(cbuf[x] != px_ver || cbuf[x] != px_hor) { - uint16_t v = lv_color_16_16_mix(px_ver, cbuf[x], ys_fract); - uint16_t h = lv_color_16_16_mix(px_hor, cbuf[x], xs_fract); - cbuf[x] = lv_color_16_16_mix(h, v, LV_OPA_50); - } - } - /*Partially out of the image*/ - else { - lv_opa_t a; - if(src_has_a8) { - const lv_opa_t * src_alpha_tmp = src_alpha; - src_alpha_tmp += (ys_int * alpha_stride) + xs_int; - a = src_alpha_tmp[0]; - } - else { - a = 0xff; - } - - if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { - abuf[x] = (a * (0xFF - xs_fract)) >> 8; - } - else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { - abuf[x] = (a * (0xFF - ys_fract)) >> 8; - } - else { - abuf[x] = a; - } - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_A8 - -static void transform_a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, - int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, - int32_t x_end, uint8_t * abuf, bool aa) -{ - int32_t xs_ups_start = xs_ups; - int32_t ys_ups_start = ys_ups; - - int32_t x; - for(x = 0; x < x_end; x++) { - xs_ups = xs_ups_start + ((xs_step * x) >> 8); - ys_ups = ys_ups_start + ((ys_step * x) >> 8); - - int32_t xs_int = xs_ups >> 8; - int32_t ys_int = ys_ups >> 8; - - /*Fully out of the image*/ - if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { - abuf[x] = 0x00; - continue; - } - - /*Get the direction the hor and ver neighbor - *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ - int32_t xs_fract = xs_ups & 0xFF; - int32_t ys_fract = ys_ups & 0xFF; - - int32_t x_next; - int32_t y_next; - if(xs_fract < 0x80) { - x_next = -1; - xs_fract = (0x7F - xs_fract) * 2; - } - else { - x_next = 1; - xs_fract = (xs_fract - 0x80) * 2; - } - if(ys_fract < 0x80) { - y_next = -1; - ys_fract = (0x7F - ys_fract) * 2; - } - else { - y_next = 1; - ys_fract = (ys_fract - 0x80) * 2; - } - - const uint8_t * src_tmp = src; - src_tmp += ys_int * src_stride + xs_int; - abuf[x] = src_tmp[0]; - - if(aa && - xs_int + x_next >= 0 && - xs_int + x_next <= src_w - 1 && - ys_int + y_next >= 0 && - ys_int + y_next <= src_h - 1) { - - lv_opa_t a_ver = src_tmp[x_next]; - lv_opa_t a_hor = src_tmp[y_next * src_stride]; - - if(a_ver != abuf[x]) a_ver = ((a_ver * ys_fract) + (abuf[x] * (0x100 - ys_fract))) >> 8; - if(a_hor != abuf[x]) a_hor = ((a_hor * xs_fract) + (abuf[x] * (0x100 - xs_fract))) >> 8; - abuf[x] = (a_ver + a_hor) >> 1; - } - else { - /*Partially out of the image*/ - if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { - abuf[x] = (src_tmp[0] * (0xFF - xs_fract)) >> 8; - } - else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { - abuf[x] = (src_tmp[0] * (0xFF - ys_fract)) >> 8; - } - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_L8 - -#if LV_DRAW_SW_SUPPORT_AL88 - -/* L8 will be transformed into an AL88 buffer, because it will not be recolored */ -static void transform_l8_to_al88(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, - int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, - int32_t x_end, uint8_t * dest_buf, bool aa) -{ - int32_t xs_ups_start = xs_ups; - int32_t ys_ups_start = ys_ups; - lv_color16a_t * dest_al88 = (lv_color16a_t *)dest_buf; - - int32_t x; - for(x = 0; x < x_end; x++) { - xs_ups = xs_ups_start + ((xs_step * x) >> 8); - ys_ups = ys_ups_start + ((ys_step * x) >> 8); - - int32_t xs_int = xs_ups >> 8; - int32_t ys_int = ys_ups >> 8; - - /*Fully out of the image*/ - if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { - dest_al88[x].lumi = 0x00; - dest_al88[x].alpha = 0x00; - continue; - } - - /*Get the direction the hor and ver neighbor - *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ - int32_t xs_fract = xs_ups & 0xFF; - int32_t ys_fract = ys_ups & 0xFF; - - int32_t x_next; - int32_t y_next; - if(xs_fract < 0x80) { - x_next = -1; - xs_fract = (0x7F - xs_fract) * 2; - } - else { - x_next = 1; - xs_fract = (xs_fract - 0x80) * 2; - } - if(ys_fract < 0x80) { - y_next = -1; - ys_fract = (0x7F - ys_fract) * 2; - } - else { - y_next = 1; - ys_fract = (ys_fract - 0x80) * 2; - } - - const uint8_t * src_tmp = src; - src_tmp += ys_int * src_stride + xs_int; - dest_al88[x].lumi = src_tmp[0]; - dest_al88[x].alpha = 255; - if(aa && - xs_int + x_next >= 0 && - xs_int + x_next <= src_w - 1 && - ys_int + y_next >= 0 && - ys_int + y_next <= src_h - 1) { - - lv_opa_t a_ver = src_tmp[x_next]; - lv_opa_t a_hor = src_tmp[y_next * src_stride]; - - if(a_ver != dest_al88[x].lumi) a_ver = ((a_ver * ys_fract) + (dest_al88[x].lumi * (0x100 - ys_fract))) >> 8; - if(a_hor != dest_al88[x].lumi) a_hor = ((a_hor * xs_fract) + (dest_al88[x].lumi * (0x100 - xs_fract))) >> 8; - dest_al88[x].lumi = (a_ver + a_hor) >> 1; - } - else { - /*Partially out of the image*/ - if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { - dest_al88[x].alpha = (src_tmp[0] * (0xFF - xs_fract)) >> 8; - } - else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { - dest_al88[x].alpha = (src_tmp[0] * (0xFF - ys_fract)) >> 8; - } - } - } -} - -#endif - -#if LV_DRAW_SW_SUPPORT_ARGB8888 - -/* L8 has to be transformed into an ARGB8888 buffer, because it will be recolored as well */ -static void transform_l8_to_argb8888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, - int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, - int32_t x_end, uint8_t * dest_buf, bool aa) -{ - int32_t xs_ups_start = xs_ups; - int32_t ys_ups_start = ys_ups; - lv_color32_t * dest_c32 = (lv_color32_t *)dest_buf; - - int32_t x; - for(x = 0; x < x_end; x++) { - xs_ups = xs_ups_start + ((xs_step * x) >> 8); - ys_ups = ys_ups_start + ((ys_step * x) >> 8); - - int32_t xs_int = xs_ups >> 8; - int32_t ys_int = ys_ups >> 8; - - /*Fully out of the image*/ - if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { - *((uint32_t *)&dest_c32[x]) = 0L; - continue; - } - - /*Get the direction the hor and ver neighbor - *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ - int32_t xs_fract = xs_ups & 0xFF; - int32_t ys_fract = ys_ups & 0xFF; - - int32_t x_next; - int32_t y_next; - if(xs_fract < 0x80) { - x_next = -1; - xs_fract = (0x7F - xs_fract) * 2; - } - else { - x_next = 1; - xs_fract = (xs_fract - 0x80) * 2; - } - if(ys_fract < 0x80) { - y_next = -1; - ys_fract = (0x7F - ys_fract) * 2; - } - else { - y_next = 1; - ys_fract = (ys_fract - 0x80) * 2; - } - - const uint8_t * src_tmp = src; - src_tmp += ys_int * src_stride + xs_int; - dest_c32[x].red = dest_c32[x].green = dest_c32[x].blue = src_tmp[0]; - dest_c32[x].alpha = 255; - if(aa && - xs_int + x_next >= 0 && - xs_int + x_next <= src_w - 1 && - ys_int + y_next >= 0 && - ys_int + y_next <= src_h - 1) { - - lv_opa_t a_ver = src_tmp[x_next]; - lv_opa_t a_hor = src_tmp[y_next * src_stride]; - - if(a_ver != src_tmp[0]) a_ver = ((a_ver * ys_fract) + (src_tmp[0] * (0x100 - ys_fract))) >> 8; - if(a_hor != src_tmp[0]) a_hor = ((a_hor * xs_fract) + (src_tmp[0] * (0x100 - xs_fract))) >> 8; - dest_c32[x].red = dest_c32[x].green = dest_c32[x].blue = (a_ver + a_hor) >> 1; - } - else { - /*Partially out of the image*/ - if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { - dest_c32[x].alpha = (src_tmp[0] * (0xFF - xs_fract)) >> 8; - } - else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { - dest_c32[x].alpha = (src_tmp[0] * (0xFF - ys_fract)) >> 8; - } - } - } -} - -#endif - -#endif - -static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int32_t yin, int32_t * xout, - int32_t * yout) -{ - if(t->angle == 0 && t->scale_x == LV_SCALE_NONE && t->scale_y == LV_SCALE_NONE) { - *xout = xin * 256; - *yout = yin * 256; - return; - } - - xin -= t->pivot.x; - yin -= t->pivot.y; - - if(t->angle == 0) { - *xout = ((int32_t)(xin * 256 * 256 / t->scale_x)) + (t->pivot_x_256); - *yout = ((int32_t)(yin * 256 * 256 / t->scale_y)) + (t->pivot_y_256); - } - else if(t->scale_x == LV_SCALE_NONE && t->scale_y == LV_SCALE_NONE) { - *xout = ((t->cosma * xin - t->sinma * yin) >> 2) + (t->pivot_x_256); - *yout = ((t->sinma * xin + t->cosma * yin) >> 2) + (t->pivot_y_256); - } - else { - *xout = (((t->cosma * xin - t->sinma * yin) * 256 / t->scale_x) >> 2) + (t->pivot_x_256); - *yout = (((t->sinma * xin + t->cosma * yin) * 256 / t->scale_y) >> 2) + (t->pivot_y_256); - } -} - -#endif /*LV_USE_DRAW_SW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_triangle.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_triangle.c deleted file mode 100644 index 4d42c4e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_triangle.c +++ /dev/null @@ -1,200 +0,0 @@ -/** - * @file lv_draw_sw_triangle.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_sw_mask_private.h" -#include "blend/lv_draw_sw_blend_private.h" -#include "../lv_draw_private.h" -#include "lv_draw_sw.h" -#if LV_USE_DRAW_SW - -#include "../../misc/lv_math.h" -#include "../../stdlib/lv_mem.h" -#include "../../misc/lv_area_private.h" -#include "../../misc/lv_color.h" -#include "../../stdlib/lv_string.h" -#include "../lv_draw_triangle_private.h" -#include "lv_draw_sw_gradient_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_sw_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc) -{ -#if LV_DRAW_SW_COMPLEX - lv_area_t tri_area; - tri_area.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); - tri_area.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); - tri_area.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); - tri_area.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); - - bool is_common; - lv_area_t draw_area; - is_common = lv_area_intersect(&draw_area, &tri_area, draw_unit->clip_area); - if(!is_common) return; - - lv_point_t p[3]; - /*If there is a vertical side use it as p[0] and p[1]*/ - if(dsc->p[0].x == dsc->p[1].x) { - p[0] = lv_point_from_precise(&dsc->p[0]); - p[1] = lv_point_from_precise(&dsc->p[1]); - p[2] = lv_point_from_precise(&dsc->p[2]); - } - else if(dsc->p[0].x == dsc->p[2].x) { - p[0] = lv_point_from_precise(&dsc->p[0]); - p[1] = lv_point_from_precise(&dsc->p[2]); - p[2] = lv_point_from_precise(&dsc->p[1]); - } - else if(dsc->p[1].x == dsc->p[2].x) { - p[0] = lv_point_from_precise(&dsc->p[1]); - p[1] = lv_point_from_precise(&dsc->p[2]); - p[2] = lv_point_from_precise(&dsc->p[0]); - } - else { - p[0] = lv_point_from_precise(&dsc->p[0]); - p[1] = lv_point_from_precise(&dsc->p[1]); - p[2] = lv_point_from_precise(&dsc->p[2]); - - /*Set the smallest y as p[0]*/ - if(p[0].y > p[1].y) lv_point_swap(&p[0], &p[1]); - if(p[0].y > p[2].y) lv_point_swap(&p[0], &p[2]); - - /*Set the greatest y as p[1]*/ - if(p[1].y < p[2].y) lv_point_swap(&p[1], &p[2]); - } - - /*Be sure p[0] is on the top*/ - if(p[0].y > p[1].y) lv_point_swap(&p[0], &p[1]); - - /*If right == true p[2] is on the right side of the p[0] p[1] line*/ - bool right = ((p[1].x - p[0].x) * (p[2].y - p[0].y) - (p[1].y - p[0].y) * (p[2].x - p[0].x)) < 0; - - void * masks[4] = {0}; - lv_draw_sw_mask_line_param_t mask_left; - lv_draw_sw_mask_line_param_t mask_right; - lv_draw_sw_mask_line_param_t mask_bottom; - - lv_draw_sw_mask_line_points_init(&mask_left, p[0].x, p[0].y, - p[1].x, p[1].y, - right ? LV_DRAW_SW_MASK_LINE_SIDE_RIGHT : LV_DRAW_SW_MASK_LINE_SIDE_LEFT); - - lv_draw_sw_mask_line_points_init(&mask_right, p[0].x, p[0].y, - p[2].x, p[2].y, - right ? LV_DRAW_SW_MASK_LINE_SIDE_LEFT : LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); - - if(p[1].y == p[2].y) { - lv_draw_sw_mask_line_points_init(&mask_bottom, p[1].x, p[1].y, - p[2].x, p[2].y, LV_DRAW_SW_MASK_LINE_SIDE_TOP); - } - else { - lv_draw_sw_mask_line_points_init(&mask_bottom, p[1].x, p[1].y, - p[2].x, p[2].y, - right ? LV_DRAW_SW_MASK_LINE_SIDE_LEFT : LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); - } - - masks[0] = &mask_left; - masks[1] = &mask_right; - masks[2] = &mask_bottom; - int32_t area_w = lv_area_get_width(&draw_area); - lv_opa_t * mask_buf = lv_malloc(area_w); - - lv_area_t blend_area = draw_area; - blend_area.y2 = blend_area.y1; - lv_draw_sw_blend_dsc_t blend_dsc; - blend_dsc.color = dsc->bg_color; - blend_dsc.opa = dsc->bg_opa; - blend_dsc.mask_buf = mask_buf; - blend_dsc.blend_area = &blend_area; - blend_dsc.mask_area = &blend_area; - blend_dsc.blend_mode = LV_BLEND_MODE_NORMAL; - blend_dsc.src_buf = NULL; - - lv_grad_dir_t grad_dir = dsc->bg_grad.dir; - - lv_grad_t * grad = lv_gradient_get(&dsc->bg_grad, lv_area_get_width(&tri_area), lv_area_get_height(&tri_area)); - lv_opa_t * grad_opa_map = NULL; - if(grad && grad_dir == LV_GRAD_DIR_HOR) { - blend_dsc.src_area = &blend_area; - blend_dsc.src_buf = grad->color_map + draw_area.x1 - tri_area.x1; - grad_opa_map = grad->opa_map + draw_area.x1 - tri_area.x1; - blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB888; - } - - int32_t y; - for(y = draw_area.y1; y <= draw_area.y2; y++) { - blend_area.y1 = y; - blend_area.y2 = y; - lv_memset(mask_buf, 0xff, area_w); - blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, draw_area.x1, y, area_w); - if(grad_dir == LV_GRAD_DIR_VER) { - blend_dsc.color = grad->color_map[y - tri_area.y1]; - blend_dsc.opa = grad->opa_map[y - tri_area.y1]; - if(dsc->bg_opa < LV_OPA_MAX) blend_dsc.opa = LV_OPA_MIX2(blend_dsc.opa, dsc->bg_opa); - } - else if(grad_dir == LV_GRAD_DIR_HOR) { - if(grad_opa_map) { - int32_t i; - if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_CHANGED) { - blend_dsc.mask_buf = mask_buf; - for(i = 0; i < area_w; i++) { - if(grad_opa_map[i] < LV_OPA_MAX) mask_buf[i] = LV_OPA_MIX2(mask_buf[i], grad_opa_map[i]); - } - } - else if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) { - blend_dsc.mask_buf = grad_opa_map; - blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; - } - else if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { - continue; - } - } - } - lv_draw_sw_blend(draw_unit, &blend_dsc); - } - - lv_free(mask_buf); - lv_draw_sw_mask_free_param(&mask_bottom); - lv_draw_sw_mask_free_param(&mask_left); - lv_draw_sw_mask_free_param(&mask_right); - - if(grad) { - lv_gradient_cleanup(grad); - } - -#else - LV_UNUSED(draw_unit); - LV_UNUSED(dsc); - LV_LOG_WARN("Can't draw triangles with LV_DRAW_SW_COMPLEX == 0"); -#endif /*LV_DRAW_SW_COMPLEX*/ -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_SW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_vector.c b/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_vector.c deleted file mode 100644 index 4b99a47..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/sw/lv_draw_sw_vector.c +++ /dev/null @@ -1,453 +0,0 @@ -/** - * @file lv_draw_img.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../lv_image_decoder_private.h" -#include "../lv_draw_vector_private.h" -#include "../lv_draw_private.h" -#include "lv_draw_sw.h" - -#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG -#if LV_USE_THORVG_EXTERNAL - #include -#else - #include "../../libs/thorvg/thorvg_capi.h" -#endif -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - float x; - float y; - float w; - float h; -} _tvg_rect; - -typedef struct { - uint8_t r; - uint8_t g; - uint8_t b; - uint8_t a; -} _tvg_color; - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -static void lv_area_to_tvg(_tvg_rect * rect, const lv_area_t * area) -{ - rect->x = area->x1; - rect->y = area->y1; - rect->w = lv_area_get_width(area) - 1; - rect->h = lv_area_get_height(area) - 1; -} - -static void lv_color_to_tvg(_tvg_color * color, const lv_color32_t * c, lv_opa_t opa) -{ - color->r = c->red; - color->g = c->green; - color->b = c->blue; - color->a = LV_OPA_MIX2(c->alpha, opa); -} - -static void lv_matrix_to_tvg(Tvg_Matrix * tm, const lv_matrix_t * m) -{ - tm->e11 = m->m[0][0]; - tm->e12 = m->m[0][1]; - tm->e13 = m->m[0][2]; - tm->e21 = m->m[1][0]; - tm->e22 = m->m[1][1]; - tm->e23 = m->m[1][2]; - tm->e31 = m->m[2][0]; - tm->e32 = m->m[2][1]; - tm->e33 = m->m[2][2]; -} - -static void _set_paint_matrix(Tvg_Paint * obj, const Tvg_Matrix * m) -{ - tvg_paint_set_transform(obj, m); -} - -static void _set_paint_shape(Tvg_Paint * obj, const lv_vector_path_t * p) -{ - uint32_t pidx = 0; - lv_vector_path_op_t * op = lv_array_front(&p->ops); - uint32_t size = lv_array_size(&p->ops); - for(uint32_t i = 0; i < size; i++) { - switch(op[i]) { - case LV_VECTOR_PATH_OP_MOVE_TO: { - lv_fpoint_t * pt = lv_array_at(&p->points, pidx); - tvg_shape_move_to(obj, pt->x, pt->y); - pidx += 1; - } - break; - case LV_VECTOR_PATH_OP_LINE_TO: { - lv_fpoint_t * pt = lv_array_at(&p->points, pidx); - tvg_shape_line_to(obj, pt->x, pt->y); - pidx += 1; - } - break; - case LV_VECTOR_PATH_OP_QUAD_TO: { - lv_fpoint_t * pt1 = lv_array_at(&p->points, pidx); - lv_fpoint_t * pt2 = lv_array_at(&p->points, pidx + 1); - - lv_fpoint_t * last_pt = lv_array_at(&p->points, pidx - 1); - - lv_fpoint_t cp[2]; - cp[0].x = (last_pt->x + 2 * pt1->x) * (1.0f / 3.0f); - cp[0].y = (last_pt->y + 2 * pt1->y) * (1.0f / 3.0f); - cp[1].x = (pt2->x + 2 * pt1->x) * (1.0f / 3.0f); - cp[1].y = (pt2->y + 2 * pt1->y) * (1.0f / 3.0f); - - tvg_shape_cubic_to(obj, cp[0].x, cp[0].y, cp[1].x, cp[1].y, pt2->x, pt2->y); - pidx += 2; - } - break; - case LV_VECTOR_PATH_OP_CUBIC_TO: { - lv_fpoint_t * pt1 = lv_array_at(&p->points, pidx); - lv_fpoint_t * pt2 = lv_array_at(&p->points, pidx + 1); - lv_fpoint_t * pt3 = lv_array_at(&p->points, pidx + 2); - - tvg_shape_cubic_to(obj, pt1->x, pt1->y, pt2->x, pt2->y, pt3->x, pt3->y); - pidx += 3; - } - break; - case LV_VECTOR_PATH_OP_CLOSE: { - tvg_shape_close(obj); - } - break; - } - } -} - -static Tvg_Stroke_Cap lv_stroke_cap_to_tvg(lv_vector_stroke_cap_t cap) -{ - switch(cap) { - case LV_VECTOR_STROKE_CAP_SQUARE: - return TVG_STROKE_CAP_SQUARE; - case LV_VECTOR_STROKE_CAP_ROUND: - return TVG_STROKE_CAP_ROUND; - case LV_VECTOR_STROKE_CAP_BUTT: - return TVG_STROKE_CAP_BUTT; - default: - return TVG_STROKE_CAP_SQUARE; - } -} - -static Tvg_Stroke_Join lv_stroke_join_to_tvg(lv_vector_stroke_join_t join) -{ - switch(join) { - case LV_VECTOR_STROKE_JOIN_BEVEL: - return TVG_STROKE_JOIN_BEVEL; - case LV_VECTOR_STROKE_JOIN_ROUND: - return TVG_STROKE_JOIN_ROUND; - case LV_VECTOR_STROKE_JOIN_MITER: - return TVG_STROKE_JOIN_MITER; - default: - return TVG_STROKE_JOIN_BEVEL; - } -} - -static Tvg_Stroke_Fill lv_spread_to_tvg(lv_vector_gradient_spread_t sp) -{ - switch(sp) { - case LV_VECTOR_GRADIENT_SPREAD_PAD: - return TVG_STROKE_FILL_PAD; - case LV_VECTOR_GRADIENT_SPREAD_REPEAT: - return TVG_STROKE_FILL_REPEAT; - case LV_VECTOR_GRADIENT_SPREAD_REFLECT: - return TVG_STROKE_FILL_REFLECT; - default: - return TVG_STROKE_FILL_PAD; - } -} - -static void _setup_gradient(Tvg_Gradient * gradient, const lv_vector_gradient_t * grad, - const lv_matrix_t * matrix) -{ - Tvg_Color_Stop * stops = (Tvg_Color_Stop *)lv_malloc(sizeof(Tvg_Color_Stop) * grad->stops_count); - LV_ASSERT_MALLOC(stops); - for(uint16_t i = 0; i < grad->stops_count; i++) { - const lv_gradient_stop_t * s = &(grad->stops[i]); - - stops[i].offset = s->frac / 255.0f; - stops[i].r = s->color.red; - stops[i].g = s->color.green; - stops[i].b = s->color.blue; - stops[i].a = s->opa; - } - - tvg_gradient_set_color_stops(gradient, stops, grad->stops_count); - tvg_gradient_set_spread(gradient, lv_spread_to_tvg(grad->spread)); - Tvg_Matrix mtx; - lv_matrix_to_tvg(&mtx, matrix); - tvg_gradient_set_transform(gradient, &mtx); - lv_free(stops); -} - -static void _set_paint_stroke_gradient(Tvg_Paint * obj, const lv_vector_gradient_t * g, const lv_matrix_t * m) -{ - Tvg_Gradient * grad = NULL; - if(g->style == LV_VECTOR_GRADIENT_STYLE_RADIAL) { - grad = tvg_radial_gradient_new(); - tvg_radial_gradient_set(grad, g->cx, g->cy, g->cr); - _setup_gradient(grad, g, m); - tvg_shape_set_stroke_radial_gradient(obj, grad); - } - else { - grad = tvg_linear_gradient_new(); - tvg_linear_gradient_set(grad, g->x1, g->y1, g->x2, g->y2); - _setup_gradient(grad, g, m); - tvg_shape_set_stroke_linear_gradient(obj, grad); - } -} - -static void _set_paint_stroke(Tvg_Paint * obj, const lv_vector_stroke_dsc_t * dsc) -{ - if(dsc->style == LV_VECTOR_DRAW_STYLE_SOLID) { - _tvg_color c; - lv_color_to_tvg(&c, &dsc->color, dsc->opa); - tvg_shape_set_stroke_color(obj, c.r, c.g, c.b, c.a); - } - else { /*gradient*/ - _set_paint_stroke_gradient(obj, &dsc->gradient, &dsc->matrix); - } - - tvg_shape_set_stroke_width(obj, dsc->width); - tvg_shape_set_stroke_miterlimit(obj, dsc->miter_limit); - tvg_shape_set_stroke_cap(obj, lv_stroke_cap_to_tvg(dsc->cap)); - tvg_shape_set_stroke_join(obj, lv_stroke_join_to_tvg(dsc->join)); - - if(!lv_array_is_empty(&dsc->dash_pattern)) { - float * dash_array = lv_array_front(&dsc->dash_pattern); - tvg_shape_set_stroke_dash(obj, dash_array, dsc->dash_pattern.size); - } -} - -static Tvg_Fill_Rule lv_fill_rule_to_tvg(lv_vector_fill_t rule) -{ - switch(rule) { - case LV_VECTOR_FILL_NONZERO: - return TVG_FILL_RULE_WINDING; - case LV_VECTOR_FILL_EVENODD: - return TVG_FILL_RULE_EVEN_ODD; - default: - return TVG_FILL_RULE_WINDING; - } -} - -static void _set_paint_fill_gradient(Tvg_Paint * obj, const lv_vector_gradient_t * g, const lv_matrix_t * m) -{ - Tvg_Gradient * grad = NULL; - if(g->style == LV_VECTOR_GRADIENT_STYLE_RADIAL) { - grad = tvg_radial_gradient_new(); - tvg_radial_gradient_set(grad, g->cx, g->cy, g->cr); - _setup_gradient(grad, g, m); - tvg_shape_set_radial_gradient(obj, grad); - } - else { - grad = tvg_linear_gradient_new(); - tvg_linear_gradient_set(grad, g->x1, g->y1, g->x2, g->y2); - _setup_gradient(grad, g, m); - tvg_shape_set_linear_gradient(obj, grad); - } -} - -static void _set_paint_fill_pattern(Tvg_Paint * obj, Tvg_Canvas * canvas, const lv_draw_image_dsc_t * p, - const lv_matrix_t * m) -{ - lv_image_decoder_dsc_t decoder_dsc; - lv_image_decoder_args_t args = { 0 }; - args.premultiply = 1; - lv_result_t res = lv_image_decoder_open(&decoder_dsc, p->src, &args); - if(res != LV_RESULT_OK) { - LV_LOG_ERROR("Failed to open image"); - return; - } - - if(!decoder_dsc.decoded) { - lv_image_decoder_close(&decoder_dsc); - LV_LOG_ERROR("Image not ready"); - return; - } - - const uint8_t * src_buf = decoder_dsc.decoded->data; - const lv_image_header_t * header = &decoder_dsc.decoded->header; - lv_color_format_t cf = header->cf; - - if(cf != LV_COLOR_FORMAT_ARGB8888) { - lv_image_decoder_close(&decoder_dsc); - LV_LOG_ERROR("Not support image format"); - return; - } - - Tvg_Paint * img = tvg_picture_new(); - tvg_picture_load_raw(img, (uint32_t *)src_buf, header->w, header->h, true); - Tvg_Paint * clip_path = tvg_paint_duplicate(obj); - tvg_paint_set_composite_method(img, clip_path, TVG_COMPOSITE_METHOD_CLIP_PATH); - tvg_paint_set_opacity(img, p->opa); - - Tvg_Matrix mtx; - lv_matrix_to_tvg(&mtx, m); - tvg_paint_set_transform(img, &mtx); - tvg_canvas_push(canvas, img); - lv_image_decoder_close(&decoder_dsc); -} - -static void _set_paint_fill(Tvg_Paint * obj, Tvg_Canvas * canvas, const lv_vector_fill_dsc_t * dsc, - const lv_matrix_t * matrix) -{ - tvg_shape_set_fill_rule(obj, lv_fill_rule_to_tvg(dsc->fill_rule)); - - if(dsc->style == LV_VECTOR_DRAW_STYLE_SOLID) { - _tvg_color c; - lv_color_to_tvg(&c, &dsc->color, dsc->opa); - tvg_shape_set_fill_color(obj, c.r, c.g, c.b, c.a); - } - else if(dsc->style == LV_VECTOR_DRAW_STYLE_PATTERN) { - float x, y, w, h; - tvg_paint_get_bounds(obj, &x, &y, &w, &h, false); - - lv_matrix_t imx; - lv_memcpy(&imx, matrix, sizeof(lv_matrix_t)); - lv_matrix_translate(&imx, x, y); - lv_matrix_multiply(&imx, &dsc->matrix); - _set_paint_fill_pattern(obj, canvas, &dsc->img_dsc, &imx); - } - else if(dsc->style == LV_VECTOR_DRAW_STYLE_GRADIENT) { - _set_paint_fill_gradient(obj, &dsc->gradient, &dsc->matrix); - } -} - -static Tvg_Blend_Method lv_blend_to_tvg(lv_vector_blend_t blend) -{ - switch(blend) { - case LV_VECTOR_BLEND_SRC_OVER: - return TVG_BLEND_METHOD_NORMAL; - case LV_VECTOR_BLEND_SCREEN: - return TVG_BLEND_METHOD_SCREEN; - case LV_VECTOR_BLEND_MULTIPLY: - return TVG_BLEND_METHOD_MULTIPLY; - case LV_VECTOR_BLEND_NONE: - return TVG_BLEND_METHOD_SRCOVER; - case LV_VECTOR_BLEND_ADDITIVE: - return TVG_BLEND_METHOD_ADD; - case LV_VECTOR_BLEND_SRC_IN: - case LV_VECTOR_BLEND_DST_OVER: - case LV_VECTOR_BLEND_DST_IN: - case LV_VECTOR_BLEND_SUBTRACTIVE: - /*not support yet.*/ - default: - return TVG_BLEND_METHOD_NORMAL; - } -} - -static void _set_paint_blend_mode(Tvg_Paint * obj, lv_vector_blend_t blend) -{ - tvg_paint_set_blend_method(obj, lv_blend_to_tvg(blend)); -} - -static void _task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_draw_dsc_t * dsc) -{ - Tvg_Canvas * canvas = (Tvg_Canvas *)ctx; - - Tvg_Paint * obj = tvg_shape_new(); - - if(!path) { /*clear*/ - _tvg_rect rc; - lv_area_to_tvg(&rc, &dsc->scissor_area); - - _tvg_color c; - lv_color_to_tvg(&c, &dsc->fill_dsc.color, dsc->fill_dsc.opa); - - Tvg_Matrix mtx = { - 1.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 1.0f, - }; - _set_paint_matrix(obj, &mtx); - tvg_shape_append_rect(obj, rc.x, rc.y, rc.w, rc.h, 0, 0); - tvg_shape_set_fill_color(obj, c.r, c.g, c.b, c.a); - } - else { - Tvg_Matrix mtx; - lv_matrix_to_tvg(&mtx, &dsc->matrix); - _set_paint_matrix(obj, &mtx); - - _set_paint_shape(obj, path); - - _set_paint_fill(obj, canvas, &dsc->fill_dsc, &dsc->matrix); - _set_paint_stroke(obj, &dsc->stroke_dsc); - _set_paint_blend_mode(obj, dsc->blend_mode); - } - - tvg_canvas_push(canvas, obj); -} - -/********************** - * GLOBAL FUNCTIONS - **********************/ -void lv_draw_sw_vector(lv_draw_unit_t * draw_unit, const lv_draw_vector_task_dsc_t * dsc) -{ - LV_UNUSED(draw_unit); - - if(dsc->task_list == NULL) - return; - - lv_layer_t * layer = dsc->base.layer; - lv_draw_buf_t * draw_buf = layer->draw_buf; - if(draw_buf == NULL) - return; - - lv_color_format_t cf = draw_buf->header.cf; - - if(cf != LV_COLOR_FORMAT_ARGB8888 && \ - cf != LV_COLOR_FORMAT_XRGB8888) { - LV_LOG_ERROR("unsupported layer color: %d", cf); - return; - } - - void * buf = draw_buf->data; - int32_t width = lv_area_get_width(&layer->buf_area) - 1; - int32_t height = lv_area_get_height(&layer->buf_area) - 1; - uint32_t stride = draw_buf->header.stride; - Tvg_Canvas * canvas = tvg_swcanvas_create(); - tvg_swcanvas_set_target(canvas, buf, stride / 4, width, height, TVG_COLORSPACE_ARGB8888); - - _tvg_rect rc; - lv_area_to_tvg(&rc, draw_unit->clip_area); - tvg_canvas_set_viewport(canvas, (int32_t)rc.x, (int32_t)rc.y, (int32_t)rc.w, (int32_t)rc.h); - - lv_ll_t * task_list = dsc->task_list; - lv_vector_for_each_destroy_tasks(task_list, _task_draw_cb, canvas); - - if(tvg_canvas_draw(canvas) == TVG_RESULT_SUCCESS) { - tvg_canvas_sync(canvas); - } - - tvg_canvas_destroy(canvas); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_SW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_buf_vg_lite.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_buf_vg_lite.c deleted file mode 100644 index de0b4b9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_buf_vg_lite.c +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file lv_draw_buf_vg_lite.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vg_lite.h" - -#if LV_USE_DRAW_VG_LITE - -#include "../lv_draw_buf_private.h" -#include "lv_vg_lite_utils.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static uint32_t width_to_stride(uint32_t w, lv_color_format_t color_format); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_buf_vg_lite_init_handlers(void) -{ - lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); - handlers->width_to_stride_cb = width_to_stride; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static uint32_t width_to_stride(uint32_t w, lv_color_format_t color_format) -{ - return lv_vg_lite_width_to_stride(w, lv_vg_lite_vg_fmt(color_format)); -} - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite.c deleted file mode 100644 index 1a991ce..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite.c +++ /dev/null @@ -1,281 +0,0 @@ -/** - * @file lv_vg_lite_draw.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vg_lite.h" - -#if LV_USE_DRAW_VG_LITE - -#include "../lv_draw_private.h" -#include "lv_draw_vg_lite_type.h" -#include "lv_vg_lite_path.h" -#include "lv_vg_lite_utils.h" -#include "lv_vg_lite_decoder.h" -#include "lv_vg_lite_grad.h" -#include "lv_vg_lite_pending.h" -#include "lv_vg_lite_stroke.h" - -/********************* - * DEFINES - *********************/ - -#define VG_LITE_DRAW_UNIT_ID 2 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static int32_t draw_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); - -static int32_t draw_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); - -static int32_t draw_delete(lv_draw_unit_t * draw_unit); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vg_lite_init(void) -{ -#if LV_VG_LITE_USE_GPU_INIT - extern void gpu_init(void); - static bool inited = false; - if(!inited) { - gpu_init(); - inited = true; - } -#endif - - lv_vg_lite_dump_info(); - - lv_draw_buf_vg_lite_init_handlers(); - - lv_draw_vg_lite_unit_t * unit = lv_draw_create_unit(sizeof(lv_draw_vg_lite_unit_t)); - unit->base_unit.dispatch_cb = draw_dispatch; - unit->base_unit.evaluate_cb = draw_evaluate; - unit->base_unit.delete_cb = draw_delete; - - lv_vg_lite_image_dsc_init(unit); -#if LV_USE_VECTOR_GRAPHIC - lv_vg_lite_grad_init(unit, LV_VG_LITE_GRAD_CACHE_CNT); - lv_vg_lite_stroke_init(unit, LV_VG_LITE_STROKE_CACHE_CNT); -#endif - lv_vg_lite_path_init(unit); - lv_vg_lite_decoder_init(); -} - -void lv_draw_vg_lite_deinit(void) -{ -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static bool check_image_is_supported(const lv_draw_image_dsc_t * dsc) -{ - lv_image_header_t header; - lv_result_t res = lv_image_decoder_get_info(dsc->src, &header); - if(res != LV_RESULT_OK) { - LV_LOG_TRACE("get image info failed"); - return false; - } - - return lv_vg_lite_is_src_cf_supported(header.cf); -} - -static void draw_execute(lv_draw_vg_lite_unit_t * u) -{ - lv_draw_task_t * t = u->task_act; - lv_draw_unit_t * draw_unit = (lv_draw_unit_t *)u; - - lv_layer_t * layer = u->base_unit.target_layer; - - lv_vg_lite_buffer_from_draw_buf(&u->target_buffer, layer->draw_buf); - - /* VG-Lite will output premultiplied image, set the flag correspondingly. */ - lv_draw_buf_set_flag(layer->draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED); - - vg_lite_identity(&u->global_matrix); - if(layer->buf_area.x1 || layer->buf_area.y1) { - vg_lite_translate(-layer->buf_area.x1, -layer->buf_area.y1, &u->global_matrix); - } - -#if LV_DRAW_TRANSFORM_USE_MATRIX - vg_lite_matrix_t layer_matrix; - lv_vg_lite_matrix(&layer_matrix, &t->matrix); - lv_vg_lite_matrix_multiply(&u->global_matrix, &layer_matrix); - - /* Crop out extra pixels drawn due to scaling accuracy issues */ - if(vg_lite_query_feature(gcFEATURE_BIT_VG_SCISSOR)) { - lv_area_t scissor_area = layer->phy_clip_area; - lv_area_move(&scissor_area, -layer->buf_area.x1, -layer->buf_area.y1); - lv_vg_lite_set_scissor_area(&scissor_area); - } -#endif - - switch(t->type) { - case LV_DRAW_TASK_TYPE_LABEL: - lv_draw_vg_lite_label(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_FILL: - lv_draw_vg_lite_fill(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_BORDER: - lv_draw_vg_lite_border(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_BOX_SHADOW: - lv_draw_vg_lite_box_shadow(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_IMAGE: - lv_draw_vg_lite_img(draw_unit, t->draw_dsc, &t->area, false); - break; - case LV_DRAW_TASK_TYPE_ARC: - lv_draw_vg_lite_arc(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_LINE: - lv_draw_vg_lite_line(draw_unit, t->draw_dsc); - break; - case LV_DRAW_TASK_TYPE_LAYER: - lv_draw_vg_lite_layer(draw_unit, t->draw_dsc, &t->area); - break; - case LV_DRAW_TASK_TYPE_TRIANGLE: - lv_draw_vg_lite_triangle(draw_unit, t->draw_dsc); - break; - case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: - lv_draw_vg_lite_mask_rect(draw_unit, t->draw_dsc, &t->area); - break; -#if LV_USE_VECTOR_GRAPHIC - case LV_DRAW_TASK_TYPE_VECTOR: - lv_draw_vg_lite_vector(draw_unit, t->draw_dsc); - break; -#endif - default: - break; - } - - lv_vg_lite_flush(u); -} - -static int32_t draw_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) -{ - lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; - - /* Return immediately if it's busy with draw task. */ - if(u->task_act) { - return 0; - } - - /* Try to get an ready to draw. */ - lv_draw_task_t * t = lv_draw_get_next_available_task(layer, NULL, VG_LITE_DRAW_UNIT_ID); - - /* Return 0 is no selection, some tasks can be supported by other units. */ - if(!t || t->preferred_draw_unit_id != VG_LITE_DRAW_UNIT_ID) { - lv_vg_lite_finish(u); - return LV_DRAW_UNIT_IDLE; - } - - /* Return if target buffer format is not supported. */ - if(!lv_vg_lite_is_dest_cf_supported(layer->color_format)) { - return LV_DRAW_UNIT_IDLE; - } - - void * buf = lv_draw_layer_alloc_buf(layer); - if(!buf) { - return LV_DRAW_UNIT_IDLE; - } - - t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; - u->base_unit.target_layer = layer; - u->base_unit.clip_area = &t->clip_area; - u->task_act = t; - - draw_execute(u); - - u->task_act->state = LV_DRAW_TASK_STATE_READY; - u->task_act = NULL; - - /*The draw unit is free now. Request a new dispatching as it can get a new task*/ - lv_draw_dispatch_request(); - - return 1; -} - -static int32_t draw_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) -{ - LV_UNUSED(draw_unit); - - /* Return if target buffer format is not supported. */ - const lv_draw_dsc_base_t * base_dsc = task->draw_dsc; - if(!lv_vg_lite_is_dest_cf_supported(base_dsc->layer->color_format)) { - return -1; - } - - switch(task->type) { - case LV_DRAW_TASK_TYPE_LABEL: - case LV_DRAW_TASK_TYPE_FILL: - case LV_DRAW_TASK_TYPE_BORDER: -#if LV_VG_LITE_USE_BOX_SHADOW - case LV_DRAW_TASK_TYPE_BOX_SHADOW: -#endif - case LV_DRAW_TASK_TYPE_LAYER: - case LV_DRAW_TASK_TYPE_LINE: - case LV_DRAW_TASK_TYPE_ARC: - case LV_DRAW_TASK_TYPE_TRIANGLE: - case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: - -#if LV_USE_VECTOR_GRAPHIC - case LV_DRAW_TASK_TYPE_VECTOR: -#endif - break; - - case LV_DRAW_TASK_TYPE_IMAGE: { - if(!check_image_is_supported(task->draw_dsc)) { - return 0; - } - } - break; - - default: - /*The draw unit is not able to draw this task. */ - return 0; - } - - /* The draw unit is able to draw this task. */ - task->preference_score = 80; - task->preferred_draw_unit_id = VG_LITE_DRAW_UNIT_ID; - return 1; -} - -static int32_t draw_delete(lv_draw_unit_t * draw_unit) -{ - lv_draw_vg_lite_unit_t * unit = (lv_draw_vg_lite_unit_t *)draw_unit; - - lv_vg_lite_image_dsc_deinit(unit); -#if LV_USE_VECTOR_GRAPHIC - lv_vg_lite_grad_deinit(unit); - lv_vg_lite_stroke_deinit(unit); -#endif - lv_vg_lite_path_deinit(unit); - lv_vg_lite_decoder_deinit(); - return 1; -} - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite.h b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite.h deleted file mode 100644 index 63ff7f5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - * @file lv_draw_vg_lite.h - * - */ - -#ifndef LV_DRAW_VG_LITE_H -#define LV_DRAW_VG_LITE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" - -#if LV_USE_DRAW_VG_LITE - -#include "../lv_draw.h" -#include "../../draw/lv_draw_vector.h" -#include "../../draw/lv_draw_arc.h" -#include "../../draw/lv_draw_rect.h" -#include "../../draw/lv_draw_image.h" -#include "../../draw/lv_draw_label.h" -#include "../../draw/lv_draw_line.h" -#include "../../draw/lv_draw_triangle.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_draw_buf_vg_lite_init_handlers(void); - -void lv_draw_vg_lite_init(void); - -void lv_draw_vg_lite_deinit(void); - -void lv_draw_vg_lite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_vg_lite_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_vg_lite_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_vg_lite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, - const lv_area_t * coords, bool no_cache); - -void lv_draw_vg_lite_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, - const lv_area_t * coords); - -void lv_draw_vg_lite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords); - -void lv_draw_vg_lite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); - -void lv_draw_vg_lite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc); - -void lv_draw_vg_lite_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, - const lv_area_t * coords); - -#if LV_USE_VECTOR_GRAPHIC -void lv_draw_vg_lite_vector(lv_draw_unit_t * draw_unit, const lv_draw_vector_task_dsc_t * dsc); -#endif - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_VG_LITE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_arc.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_arc.c deleted file mode 100644 index be995ce..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_arc.c +++ /dev/null @@ -1,209 +0,0 @@ -/** - * @file lv_draw_vg_lite_arc.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../misc/lv_area_private.h" -#include "../lv_image_decoder_private.h" -#include "../lv_draw_private.h" -#include "lv_draw_vg_lite.h" - -#if LV_USE_DRAW_VG_LITE - -#include "lv_draw_vg_lite_type.h" -#include "lv_vg_lite_math.h" -#include "lv_vg_lite_path.h" -#include "lv_vg_lite_pending.h" -#include "lv_vg_lite_utils.h" -#include - -/********************* - * DEFINES - *********************/ - -#define PI 3.1415926535897932384626433832795f -#define TWO_PI 6.283185307179586476925286766559f -#define DEG_TO_RAD 0.017453292519943295769236907684886f -#define RAD_TO_DEG 57.295779513082320876798154814105f -#define radians(deg) ((deg) * DEG_TO_RAD) -#define degrees(rad) ((rad) * RAD_TO_DEG) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vg_lite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, - const lv_area_t * coords) -{ - lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; - - lv_area_t clip_area; - if(!lv_area_intersect(&clip_area, coords, draw_unit->clip_area)) { - /*Fully clipped, nothing to do*/ - return; - } - - float start_angle = dsc->start_angle; - float end_angle = dsc->end_angle; - float sweep_angle = end_angle - start_angle; - - while(sweep_angle < 0) { - sweep_angle += 360; - } - - while(sweep_angle > 360) { - sweep_angle -= 360; - } - - /*If the angles are the same then there is nothing to draw*/ - if(math_zero(sweep_angle)) { - return; - } - - LV_PROFILER_BEGIN; - - lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); - lv_vg_lite_path_set_quality(path, VG_LITE_HIGH); - lv_vg_lite_path_set_bonding_box_area(path, &clip_area); - - float radius_out = dsc->radius; - float radius_in = dsc->radius - dsc->width; - float half_width = dsc->width * 0.5f; - float radius_center = radius_out - half_width; - float cx = dsc->center.x; - float cy = dsc->center.y; - - vg_lite_fill_t fill = VG_LITE_FILL_NON_ZERO; - - if(math_equal(sweep_angle, 360)) { - lv_vg_lite_path_append_circle(path, cx, cy, radius_out, radius_out); - lv_vg_lite_path_append_circle(path, cx, cy, radius_in, radius_in); - fill = VG_LITE_FILL_EVEN_ODD; - } - else { - /* radius_out start point */ - float start_angle_rad = MATH_RADIANS(start_angle); - float start_x = radius_out * MATH_COSF(start_angle_rad) + cx; - float start_y = radius_out * MATH_SINF(start_angle_rad) + cy; - - /* radius_in start point */ - float end_angle_rad = MATH_RADIANS(end_angle); - float end_x = radius_in * MATH_COSF(end_angle_rad) + cx; - float end_y = radius_in * MATH_SINF(end_angle_rad) + cy; - - lv_vg_lite_path_move_to(path, start_x, start_y); - - /* radius_out arc */ - lv_vg_lite_path_append_arc(path, - cx, cy, - radius_out, - start_angle, - sweep_angle, - false); - - /* line to radius_in */ - lv_vg_lite_path_line_to(path, end_x, end_y); - - /* radius_in arc */ - lv_vg_lite_path_append_arc(path, - cx, cy, - radius_in, - end_angle, - -sweep_angle, - false); - - /* close arc */ - lv_vg_lite_path_close(path); - - /* draw round */ - if(dsc->rounded && half_width > 0) { - float rcx1 = cx + radius_center * MATH_COSF(end_angle_rad); - float rcy1 = cy + radius_center * MATH_SINF(end_angle_rad); - lv_vg_lite_path_append_circle(path, rcx1, rcy1, half_width, half_width); - - float rcx2 = cx + radius_center * MATH_COSF(start_angle_rad); - float rcy2 = cy + radius_center * MATH_SINF(start_angle_rad); - lv_vg_lite_path_append_circle(path, rcx2, rcy2, half_width, half_width); - } - } - - lv_vg_lite_path_end(path); - - vg_lite_matrix_t matrix = u->global_matrix; - - vg_lite_color_t color = lv_vg_lite_color(dsc->color, dsc->opa, true); - - vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); - - LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); - LV_VG_LITE_ASSERT_PATH(vg_lite_path); - LV_VG_LITE_ASSERT_MATRIX(&matrix); - - LV_PROFILER_BEGIN_TAG("vg_lite_draw"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw( - &u->target_buffer, - vg_lite_path, - fill, - &matrix, - VG_LITE_BLEND_SRC_OVER, - color)); - LV_PROFILER_END_TAG("vg_lite_draw"); - - if(dsc->img_src) { - vg_lite_buffer_t src_buf; - lv_image_decoder_dsc_t decoder_dsc; - if(lv_vg_lite_buffer_open_image(&src_buf, &decoder_dsc, dsc->img_src, false, true)) { - vg_lite_matrix_t path_matrix = u->global_matrix; - - /* move image to center */ - vg_lite_translate(cx - radius_out, cy - radius_out, &matrix); - - LV_VG_LITE_ASSERT_MATRIX(&path_matrix); - - LV_PROFILER_BEGIN_TAG("vg_lite_draw_pattern"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw_pattern( - &u->target_buffer, - vg_lite_path, - fill, - &path_matrix, - &src_buf, - &matrix, - VG_LITE_BLEND_SRC_OVER, - VG_LITE_PATTERN_COLOR, - 0, - color, - VG_LITE_FILTER_BI_LINEAR)); - LV_PROFILER_END_TAG("vg_lite_draw_pattern"); - lv_vg_lite_pending_add(u->image_dsc_pending, &decoder_dsc); - } - } - - lv_vg_lite_path_drop(u, path); - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_border.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_border.c deleted file mode 100644 index 5860baa..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_border.c +++ /dev/null @@ -1,114 +0,0 @@ -/** - * @file lv_draw_vg_lite_border.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../misc/lv_area_private.h" -#include "../lv_draw_private.h" -#include "lv_draw_vg_lite.h" - -#if LV_USE_DRAW_VG_LITE - -#include "lv_draw_vg_lite_type.h" -#include "lv_vg_lite_utils.h" -#include "lv_vg_lite_path.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vg_lite_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, - const lv_area_t * coords) -{ - lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; - - lv_area_t clip_area; - if(!lv_area_intersect(&clip_area, coords, draw_unit->clip_area)) { - /*Fully clipped, nothing to do*/ - return; - } - - LV_PROFILER_BEGIN; - - int32_t w = lv_area_get_width(coords); - int32_t h = lv_area_get_height(coords); - float r_out = dsc->radius; - if(dsc->radius) { - float r_short = LV_MIN(w, h) / 2.0f; - r_out = LV_MIN(r_out, r_short); - } - - int32_t border_w = dsc->width; - float r_in = LV_MAX(0, r_out - border_w); - - lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); - lv_vg_lite_path_set_quality(path, dsc->radius == 0 ? VG_LITE_LOW : VG_LITE_HIGH); - lv_vg_lite_path_set_bonding_box_area(path, &clip_area); - - /* outer rect */ - lv_vg_lite_path_append_rect(path, - coords->x1, coords->y1, - w, h, - r_out); - - /* inner rect */ - lv_vg_lite_path_append_rect(path, - coords->x1 + border_w, coords->y1 + border_w, - w - border_w * 2, h - border_w * 2, - r_in); - - lv_vg_lite_path_end(path); - - vg_lite_matrix_t matrix = u->global_matrix; - - vg_lite_color_t color = lv_vg_lite_color(dsc->color, dsc->opa, true); - - vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); - - LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); - LV_VG_LITE_ASSERT_PATH(vg_lite_path); - LV_VG_LITE_ASSERT_MATRIX(&matrix); - - LV_PROFILER_BEGIN_TAG("vg_lite_draw"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw( - &u->target_buffer, - vg_lite_path, - VG_LITE_FILL_EVEN_ODD, - &matrix, - VG_LITE_BLEND_SRC_OVER, - color)); - LV_PROFILER_END_TAG("vg_lite_draw"); - - lv_vg_lite_path_drop(u, path); - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c deleted file mode 100644 index cad9500..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @file lv_draw_vg_lite_box_shadow.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../misc/lv_area_private.h" -#include "lv_draw_vg_lite.h" - -#if LV_USE_DRAW_VG_LITE - -#include "lv_draw_vg_lite_type.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vg_lite_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, - const lv_area_t * coords) -{ - /*Calculate the rectangle which is blurred to get the shadow in `shadow_area`*/ - lv_area_t core_area; - core_area.x1 = coords->x1 + dsc->ofs_x - dsc->spread; - core_area.x2 = coords->x2 + dsc->ofs_x + dsc->spread; - core_area.y1 = coords->y1 + dsc->ofs_y - dsc->spread; - core_area.y2 = coords->y2 + dsc->ofs_y + dsc->spread; - - /*Calculate the bounding box of the shadow*/ - lv_area_t shadow_area; - shadow_area.x1 = core_area.x1 - dsc->width / 2 - 1; - shadow_area.x2 = core_area.x2 + dsc->width / 2 + 1; - shadow_area.y1 = core_area.y1 - dsc->width / 2 - 1; - shadow_area.y2 = core_area.y2 + dsc->width / 2 + 1; - - /*Get clipped draw area which is the real draw area. - *It is always the same or inside `shadow_area`*/ - lv_area_t draw_area; - if(!lv_area_intersect(&draw_area, &shadow_area, draw_unit->clip_area)) return; - - LV_PROFILER_BEGIN; - - lv_draw_border_dsc_t border_dsc; - lv_draw_border_dsc_init(&border_dsc); - border_dsc.width = 3; - border_dsc.color = dsc->color; - border_dsc.radius = dsc->radius; - - lv_area_move(&draw_area, dsc->ofs_x, dsc->ofs_y); - draw_area = core_area; - int32_t half_w = dsc->width / 2; - - for(int32_t w = 0; w < half_w; w++) { - border_dsc.opa = lv_map(w, 0, half_w, dsc->opa / 4, LV_OPA_0); - border_dsc.radius++; - lv_area_increase(&draw_area, 1, 1); - lv_draw_vg_lite_border(draw_unit, &border_dsc, &draw_area); - - /* fill center */ - if(dsc->ofs_x || dsc->ofs_y) { - lv_draw_fill_dsc_t fill_dsc; - lv_draw_fill_dsc_init(&fill_dsc); - fill_dsc.radius = dsc->radius; - fill_dsc.opa = dsc->opa; - fill_dsc.color = dsc->color; - lv_draw_vg_lite_fill(draw_unit, &fill_dsc, &core_area); - } - } - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_fill.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_fill.c deleted file mode 100644 index dbfd63d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_fill.c +++ /dev/null @@ -1,114 +0,0 @@ -/** - * @file lv_draw_vg_lite_fill.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../misc/lv_area_private.h" -#include "lv_draw_vg_lite.h" - -#if LV_USE_DRAW_VG_LITE - -#include "lv_draw_vg_lite_type.h" -#include "lv_vg_lite_path.h" -#include "lv_vg_lite_utils.h" -#include "lv_vg_lite_grad.h" - -/********************* - * DEFINES - *********************/ - -#if LV_GRADIENT_MAX_STOPS > VLC_MAX_GRADIENT_STOPS - #error "LV_GRADIENT_MAX_STOPS must be equal or less than VLC_MAX_GRADIENT_STOPS" -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vg_lite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) -{ - lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; - - lv_area_t clip_area; - if(!lv_area_intersect(&clip_area, coords, draw_unit->clip_area)) { - /*Fully clipped, nothing to do*/ - return; - } - - LV_PROFILER_BEGIN; - - vg_lite_matrix_t matrix = u->global_matrix; - - lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); - lv_vg_lite_path_set_quality(path, dsc->radius == 0 ? VG_LITE_LOW : VG_LITE_HIGH); - lv_vg_lite_path_set_bonding_box_area(path, &clip_area); - lv_vg_lite_path_append_rect(path, - coords->x1, coords->y1, - lv_area_get_width(coords), lv_area_get_height(coords), - dsc->radius); - lv_vg_lite_path_end(path); - - vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); - - LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); - LV_VG_LITE_ASSERT_PATH(vg_lite_path); - LV_VG_LITE_ASSERT_MATRIX(&matrix); - - if(dsc->grad.dir != LV_GRAD_DIR_NONE) { -#if LV_USE_VECTOR_GRAPHIC - lv_vg_lite_draw_grad_helper( - u, - &u->target_buffer, - vg_lite_path, - coords, - &dsc->grad, - &matrix, - VG_LITE_FILL_EVEN_ODD, - VG_LITE_BLEND_SRC_OVER); -#else - LV_LOG_WARN("Gradient fill is not supported without VECTOR_GRAPHIC"); -#endif - } - else { /* normal fill */ - vg_lite_color_t color = lv_vg_lite_color(dsc->color, dsc->opa, true); - LV_PROFILER_BEGIN_TAG("vg_lite_draw"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw( - &u->target_buffer, - vg_lite_path, - VG_LITE_FILL_EVEN_ODD, - &matrix, - VG_LITE_BLEND_SRC_OVER, - color)); - LV_PROFILER_END_TAG("vg_lite_draw"); - } - - lv_vg_lite_path_drop(u, path); - - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_img.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_img.c deleted file mode 100644 index 86e4337..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_img.c +++ /dev/null @@ -1,199 +0,0 @@ -/** - * @file lv_draw_vg_lite_img.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../misc/lv_area_private.h" -#include "../lv_image_decoder_private.h" -#include "../lv_draw_image_private.h" -#include "../lv_draw_private.h" -#include "lv_draw_vg_lite.h" - -#if LV_USE_DRAW_VG_LITE - -#include "lv_draw_vg_lite_type.h" -#include "lv_vg_lite_decoder.h" -#include "lv_vg_lite_path.h" -#include "lv_vg_lite_pending.h" -#include "lv_vg_lite_utils.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, - const lv_area_t * coords, bool no_cache) -{ - lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; - - /* The coordinates passed in by coords are not transformed, - * so the transformed area needs to be calculated once. - */ - lv_area_t image_tf_area; - lv_image_buf_get_transformed_area( - &image_tf_area, - lv_area_get_width(coords), - lv_area_get_height(coords), - dsc->rotation, - dsc->scale_x, - dsc->scale_y, - &dsc->pivot); - lv_area_move(&image_tf_area, coords->x1, coords->y1); - - lv_area_t clip_area; - if(!lv_area_intersect(&clip_area, &image_tf_area, draw_unit->clip_area)) { - /*Fully clipped, nothing to do*/ - return; - } - - LV_PROFILER_BEGIN; - - vg_lite_buffer_t src_buf; - lv_image_decoder_dsc_t decoder_dsc; - - /* if not support blend normal, premultiply alpha */ - bool premultiply = !lv_vg_lite_support_blend_normal(); - if(!lv_vg_lite_buffer_open_image(&src_buf, &decoder_dsc, dsc->src, no_cache, premultiply)) { - LV_PROFILER_END; - return; - } - - vg_lite_color_t color = 0; - if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(decoder_dsc.decoded->header.cf) || dsc->recolor_opa > LV_OPA_TRANSP) { - /* alpha image and image recolor */ - src_buf.image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; - color = lv_vg_lite_color(dsc->recolor, LV_OPA_MIX2(dsc->opa, dsc->recolor_opa), true); - } - else if(dsc->opa < LV_OPA_COVER) { - /* normal image opa */ - src_buf.image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; - lv_memset(&color, dsc->opa, sizeof(color)); - } - - /* convert the blend mode to vg-lite blend mode, considering the premultiplied alpha */ - bool has_pre_mul = lv_draw_buf_has_flag(decoder_dsc.decoded, LV_IMAGE_FLAGS_PREMULTIPLIED); - vg_lite_blend_t blend = lv_vg_lite_blend_mode(dsc->blend_mode, has_pre_mul); - - /* original image matrix */ - vg_lite_matrix_t image_matrix; - vg_lite_identity(&image_matrix); - lv_vg_lite_image_matrix(&image_matrix, coords->x1, coords->y1, dsc); - - /* image drawing matrix */ - vg_lite_matrix_t matrix = u->global_matrix; - lv_vg_lite_matrix_multiply(&matrix, &image_matrix); - - LV_VG_LITE_ASSERT_SRC_BUFFER(&src_buf); - LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); - LV_VG_LITE_ASSERT_MATRIX(&matrix); - - bool no_transform = lv_matrix_is_identity_or_translation((const lv_matrix_t *)&matrix); - vg_lite_filter_t filter = no_transform ? VG_LITE_FILTER_POINT : VG_LITE_FILTER_BI_LINEAR; - - /* If clipping is not required, blit directly */ - if(lv_area_is_in(&image_tf_area, draw_unit->clip_area, false) && dsc->clip_radius <= 0) { - /* The image area is the coordinates relative to the image itself */ - lv_area_t src_area = *coords; - lv_area_move(&src_area, -coords->x1, -coords->y1); - - /* rect is used to crop the pixel-aligned padding area */ - vg_lite_rectangle_t rect; - lv_vg_lite_rect(&rect, &src_area); - - LV_PROFILER_BEGIN_TAG("vg_lite_blit_rect"); - LV_VG_LITE_CHECK_ERROR(vg_lite_blit_rect( - &u->target_buffer, - &src_buf, - &rect, - &matrix, - blend, - color, - filter)); - LV_PROFILER_END_TAG("vg_lite_blit_rect"); - } - else { - lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); - - /** - * When the image is transformed or rounded, create a path around - * the image and follow the image_matrix for coordinate transformation - */ - if(!no_transform || dsc->clip_radius) { - /* apply the image transform to the path */ - lv_vg_lite_path_set_transform(path, &image_matrix); - lv_vg_lite_path_append_rect( - path, - 0, 0, - lv_area_get_width(coords), lv_area_get_height(coords), - dsc->clip_radius); - lv_vg_lite_path_set_transform(path, NULL); - } - else { - /* append normal rect to the path */ - lv_vg_lite_path_append_rect( - path, - clip_area.x1, clip_area.y1, - lv_area_get_width(&clip_area), lv_area_get_height(&clip_area), - 0); - } - - lv_vg_lite_path_set_bonding_box_area(path, &clip_area); - lv_vg_lite_path_end(path); - - vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); - LV_VG_LITE_ASSERT_PATH(vg_lite_path); - - vg_lite_matrix_t path_matrix = u->global_matrix; - LV_VG_LITE_ASSERT_MATRIX(&path_matrix); - - LV_PROFILER_BEGIN_TAG("vg_lite_draw_pattern"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw_pattern( - &u->target_buffer, - vg_lite_path, - VG_LITE_FILL_EVEN_ODD, - &path_matrix, - &src_buf, - &matrix, - blend, - VG_LITE_PATTERN_COLOR, - 0, - color, - filter)); - LV_PROFILER_END_TAG("vg_lite_draw_pattern"); - - lv_vg_lite_path_drop(u, path); - } - - lv_vg_lite_pending_add(u->image_dsc_pending, &decoder_dsc); - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_label.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_label.c deleted file mode 100644 index 6c4c365..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_label.c +++ /dev/null @@ -1,362 +0,0 @@ -/** - * @file lv_draw_vg_lite_label.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../misc/lv_area_private.h" -#include "../../libs/freetype/lv_freetype_private.h" -#include "../lv_draw_label_private.h" -#include "lv_draw_vg_lite.h" - -#include "../../lvgl.h" - -#if LV_USE_DRAW_VG_LITE - -#include "lv_vg_lite_utils.h" -#include "lv_vg_lite_path.h" -#include "lv_draw_vg_lite_type.h" - -/********************* - * DEFINES - *********************/ - -#define PATH_QUALITY VG_LITE_HIGH -#define PATH_DATA_COORD_FORMAT VG_LITE_S16 -#define FT_F26DOT6_SHIFT 6 - -/** After converting the font reference size, it is also necessary to scale the 26dot6 data - * in the path to the real physical size - */ -#define FT_F26DOT6_TO_PATH_SCALE(x) (LV_FREETYPE_F26DOT6_TO_FLOAT(x) / (1 << FT_F26DOT6_SHIFT)) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, - lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); - -static void draw_letter_bitmap(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_dsc_t * dsc); - -#if LV_USE_FREETYPE - static void freetype_outline_event_cb(lv_event_t * e); - static void draw_letter_outline(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_dsc_t * dsc); -#endif /* LV_USE_FREETYPE */ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vg_lite_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, - const lv_area_t * coords) -{ - LV_PROFILER_BEGIN; - -#if LV_USE_FREETYPE - static bool is_init = false; - if(!is_init) { - lv_freetype_outline_add_event(freetype_outline_event_cb, LV_EVENT_ALL, draw_unit); - is_init = true; - } -#endif /* LV_USE_FREETYPE */ - - lv_draw_label_iterate_characters(draw_unit, dsc, coords, draw_letter_cb); - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, - lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) -{ - lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; - if(glyph_draw_dsc) { - switch(glyph_draw_dsc->format) { - case LV_FONT_GLYPH_FORMAT_A1: - case LV_FONT_GLYPH_FORMAT_A2: - case LV_FONT_GLYPH_FORMAT_A4: - case LV_FONT_GLYPH_FORMAT_A8: { - draw_letter_bitmap(u, glyph_draw_dsc); - } - break; - -#if LV_USE_FREETYPE - case LV_FONT_GLYPH_FORMAT_VECTOR: { - if(lv_freetype_is_outline_font(glyph_draw_dsc->g->resolved_font)) { - draw_letter_outline(u, glyph_draw_dsc); - } - } - break; -#endif /* LV_USE_FREETYPE */ - - case LV_FONT_GLYPH_FORMAT_IMAGE: { - lv_draw_image_dsc_t image_dsc; - lv_draw_image_dsc_init(&image_dsc); - image_dsc.opa = glyph_draw_dsc->opa; - image_dsc.src = glyph_draw_dsc->glyph_data; - lv_draw_vg_lite_img(draw_unit, &image_dsc, glyph_draw_dsc->letter_coords, false); - } - break; - -#if LV_USE_FONT_PLACEHOLDER - case LV_FONT_GLYPH_FORMAT_NONE: { - /* Draw a placeholder rectangle*/ - lv_draw_border_dsc_t border_draw_dsc; - lv_draw_border_dsc_init(&border_draw_dsc); - border_draw_dsc.opa = glyph_draw_dsc->opa; - border_draw_dsc.color = glyph_draw_dsc->color; - border_draw_dsc.width = 1; - lv_draw_vg_lite_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords); - } - break; -#endif /* LV_USE_FONT_PLACEHOLDER */ - - default: - break; - } - } - - if(fill_draw_dsc && fill_area) { - lv_draw_vg_lite_fill(draw_unit, fill_draw_dsc, fill_area); - } -} - -static void draw_letter_bitmap(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_dsc_t * dsc) -{ - lv_area_t clip_area; - if(!lv_area_intersect(&clip_area, u->base_unit.clip_area, dsc->letter_coords)) { - return; - } - - LV_PROFILER_BEGIN; - - lv_area_t image_area = *dsc->letter_coords; - - vg_lite_matrix_t matrix = u->global_matrix; - vg_lite_translate(image_area.x1, image_area.y1, &matrix); - - vg_lite_buffer_t src_buf; - lv_draw_buf_t * draw_buf = dsc->glyph_data; - lv_vg_lite_buffer_from_draw_buf(&src_buf, draw_buf); - - vg_lite_color_t color; - color = lv_vg_lite_color(dsc->color, dsc->opa, true); - - LV_VG_LITE_ASSERT_SRC_BUFFER(&src_buf); - LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); - - /* If clipping is not required, blit directly */ - if(lv_area_is_in(&image_area, u->base_unit.clip_area, false)) { - /* The image area is the coordinates relative to the image itself */ - lv_area_t src_area = image_area; - lv_area_move(&src_area, -image_area.x1, -image_area.y1); - - /* rect is used to crop the pixel-aligned padding area */ - vg_lite_rectangle_t rect; - lv_vg_lite_rect(&rect, &src_area); - LV_PROFILER_BEGIN_TAG("vg_lite_blit_rect"); - LV_VG_LITE_CHECK_ERROR(vg_lite_blit_rect( - &u->target_buffer, - &src_buf, - &rect, - &matrix, - VG_LITE_BLEND_SRC_OVER, - color, - VG_LITE_FILTER_LINEAR)); - LV_PROFILER_END_TAG("vg_lite_blit_rect"); - } - else { - lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_S16); - lv_vg_lite_path_append_rect( - path, - clip_area.x1, clip_area.y1, - lv_area_get_width(&clip_area), lv_area_get_height(&clip_area), - 0); - lv_vg_lite_path_set_bonding_box_area(path, &clip_area); - lv_vg_lite_path_end(path); - - vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); - LV_VG_LITE_ASSERT_PATH(vg_lite_path); - - vg_lite_matrix_t path_matrix = u->global_matrix; - LV_VG_LITE_ASSERT_MATRIX(&path_matrix); - - LV_PROFILER_BEGIN_TAG("vg_lite_draw_pattern"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw_pattern( - &u->target_buffer, - vg_lite_path, - VG_LITE_FILL_EVEN_ODD, - &path_matrix, - &src_buf, - &matrix, - VG_LITE_BLEND_SRC_OVER, - VG_LITE_PATTERN_COLOR, - 0, - color, - VG_LITE_FILTER_LINEAR)); - LV_PROFILER_END_TAG("vg_lite_draw_pattern"); - - lv_vg_lite_path_drop(u, path); - } - - /* TODO: The temporary buffer of the built-in font is reused. - * You need to wait for the GPU to finish using the buffer before releasing it. - * Later, use the font cache for management to improve efficiency. - */ - lv_vg_lite_finish(u); - LV_PROFILER_END; -} - -#if LV_USE_FREETYPE - -static void draw_letter_outline(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_dsc_t * dsc) -{ - /* get clip area */ - lv_area_t path_clip_area; - if(!lv_area_intersect(&path_clip_area, u->base_unit.clip_area, dsc->letter_coords)) { - return; - } - - LV_PROFILER_BEGIN; - - /* vg-lite bounding_box will crop the pixels on the edge, so +1px is needed here */ - path_clip_area.x2++; - path_clip_area.y2++; - - lv_vg_lite_path_t * outline = (lv_vg_lite_path_t *)dsc->glyph_data; - lv_point_t pos = {dsc->letter_coords->x1, dsc->letter_coords->y1}; - /* scale size */ - float scale = FT_F26DOT6_TO_PATH_SCALE(lv_freetype_outline_get_scale(dsc->g->resolved_font)); - - /* calc convert matrix */ - vg_lite_matrix_t matrix; - vg_lite_identity(&matrix); - - /* matrix for drawing, different from matrix for calculating the bonding box */ - vg_lite_matrix_t draw_matrix = u->global_matrix; - - /* convert to vg-lite coordinate */ - vg_lite_translate(pos.x - dsc->g->ofs_x, pos.y + dsc->g->box_h + dsc->g->ofs_y, &draw_matrix); - vg_lite_translate(pos.x - dsc->g->ofs_x, pos.y + dsc->g->box_h + dsc->g->ofs_y, &matrix); - - vg_lite_scale(scale, scale, &draw_matrix); - vg_lite_scale(scale, scale, &matrix); - - /* calc inverse matrix */ - vg_lite_matrix_t result; - if(!lv_vg_lite_matrix_inverse(&result, &matrix)) { - LV_LOG_ERROR("no inverse matrix"); - LV_PROFILER_END; - return; - } - - lv_point_precise_t p1 = { path_clip_area.x1, path_clip_area.y1 }; - lv_point_precise_t p1_res = lv_vg_lite_matrix_transform_point(&result, &p1); - - lv_point_precise_t p2 = { path_clip_area.x2, path_clip_area.y2 }; - lv_point_precise_t p2_res = lv_vg_lite_matrix_transform_point(&result, &p2); - - /* Since the font uses Cartesian coordinates, the y coordinates need to be reversed */ - lv_vg_lite_path_set_bonding_box(outline, p1_res.x, p2_res.y, p2_res.x, p1_res.y); - - vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(outline); - - LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); - LV_VG_LITE_ASSERT_PATH(vg_lite_path); - LV_VG_LITE_ASSERT_MATRIX(&draw_matrix); - - LV_PROFILER_BEGIN_TAG("vg_lite_draw"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw( - &u->target_buffer, vg_lite_path, VG_LITE_FILL_NON_ZERO, - &draw_matrix, VG_LITE_BLEND_SRC_OVER, lv_vg_lite_color(dsc->color, dsc->opa, true))); - LV_PROFILER_END_TAG("vg_lite_draw"); - - /* Flush in time to avoid accumulation of drawing commands */ - lv_vg_lite_flush(u); - - LV_PROFILER_END; -} - -static void vg_lite_outline_push(const lv_freetype_outline_event_param_t * param) -{ - LV_PROFILER_BEGIN; - lv_vg_lite_path_t * outline = param->outline; - LV_ASSERT_NULL(outline); - - lv_freetype_outline_type_t type = param->type; - switch(type) { - - /** - * Reverse the Y-axis coordinate direction to achieve - * the conversion from Cartesian coordinate system to LCD coordinate system - */ - case LV_FREETYPE_OUTLINE_END: - lv_vg_lite_path_end(outline); - break; - case LV_FREETYPE_OUTLINE_MOVE_TO: - lv_vg_lite_path_move_to(outline, param->to.x, -param->to.y); - break; - case LV_FREETYPE_OUTLINE_LINE_TO: - lv_vg_lite_path_line_to(outline, param->to.x, -param->to.y); - break; - case LV_FREETYPE_OUTLINE_CUBIC_TO: - lv_vg_lite_path_cubic_to(outline, param->control1.x, -param->control1.y, - param->control2.x, -param->control2.y, - param->to.x, -param->to.y); - break; - case LV_FREETYPE_OUTLINE_CONIC_TO: - lv_vg_lite_path_quad_to(outline, param->control1.x, -param->control1.y, - param->to.x, -param->to.y); - break; - default: - LV_LOG_ERROR("unknown point type: %d", type); - LV_ASSERT(false); - break; - } - LV_PROFILER_END; -} - -static void freetype_outline_event_cb(lv_event_t * e) -{ - LV_PROFILER_BEGIN; - lv_event_code_t code = lv_event_get_code(e); - lv_freetype_outline_event_param_t * param = lv_event_get_param(e); - switch(code) { - case LV_EVENT_CREATE: - param->outline = lv_vg_lite_path_create(PATH_DATA_COORD_FORMAT); - lv_vg_lite_path_set_quality(param->outline, PATH_QUALITY); - break; - case LV_EVENT_DELETE: - lv_vg_lite_path_destroy(param->outline); - break; - case LV_EVENT_INSERT: - vg_lite_outline_push(param); - break; - default: - LV_LOG_WARN("unknown event code: %d", code); - break; - } - LV_PROFILER_END; -} - -#endif /* LV_USE_FREETYPE */ - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_layer.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_layer.c deleted file mode 100644 index 8f2a17e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_layer.c +++ /dev/null @@ -1,74 +0,0 @@ -/** - * @file lv_draw_vg_lite_layer.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vg_lite.h" - -#if LV_USE_DRAW_VG_LITE - -#include "lv_vg_lite_utils.h" -#include "lv_draw_vg_lite_type.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vg_lite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords) -{ - lv_layer_t * layer = (lv_layer_t *)draw_dsc->src; - struct lv_draw_vg_lite_unit_t * u = (struct lv_draw_vg_lite_unit_t *)draw_unit; - - /*It can happen that nothing was draw on a layer and therefore its buffer is not allocated. - *In this case just return. */ - if(layer->draw_buf == NULL) - return; - - LV_PROFILER_BEGIN; - - /* The GPU output should already be premultiplied RGB */ - if(!lv_draw_buf_has_flag(layer->draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED)) { - LV_LOG_WARN("Non-premultiplied layer buffer for GPU to draw."); - } - - lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; - new_draw_dsc.src = layer->draw_buf; - lv_draw_vg_lite_img(draw_unit, &new_draw_dsc, coords, true); - - /* Wait for the GPU drawing to complete here, - * otherwise it may cause the drawing to fail. */ - lv_vg_lite_finish(u); - - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_line.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_line.c deleted file mode 100644 index e1ba695..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_line.c +++ /dev/null @@ -1,212 +0,0 @@ -/** - * @file lv_draw_vg_lite_line.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../misc/lv_area_private.h" -#include "lv_draw_vg_lite.h" - -#if LV_USE_DRAW_VG_LITE - -#include "lv_draw_vg_lite_type.h" -#include "lv_vg_lite_math.h" -#include "lv_vg_lite_path.h" -#include "lv_vg_lite_utils.h" - -/********************* - * DEFINES - *********************/ - -#define SQ(x) ((x) * (x)) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vg_lite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) -{ - float p1_x = dsc->p1.x; - float p1_y = dsc->p1.y; - float p2_x = dsc->p2.x; - float p2_y = dsc->p2.y; - - if(p1_x == p2_x && p1_y == p2_y) - return; - - float half_w = dsc->width * 0.5f; - - lv_area_t rel_clip_area; - rel_clip_area.x1 = (int32_t)(LV_MIN(p1_x, p2_x) - half_w); - rel_clip_area.x2 = (int32_t)(LV_MAX(p1_x, p2_x) + half_w); - rel_clip_area.y1 = (int32_t)(LV_MIN(p1_y, p2_y) - half_w); - rel_clip_area.y2 = (int32_t)(LV_MAX(p1_y, p2_y) + half_w); - - if(!lv_area_intersect(&rel_clip_area, &rel_clip_area, draw_unit->clip_area)) { - return; /*Fully clipped, nothing to do*/ - } - - LV_PROFILER_BEGIN; - - lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; - - int32_t dash_width = dsc->dash_width; - int32_t dash_gap = dsc->dash_gap; - int32_t dash_l = dash_width + dash_gap; - - float dx = p2_x - p1_x; - float dy = p2_y - p1_y; - float inv_dl = math_fast_inv_sqrtf(SQ(dx) + SQ(dy)); - float w_dx = dsc->width * dy * inv_dl; - float w_dy = dsc->width * dx * inv_dl; - float w2_dx = w_dx / 2; - float w2_dy = w_dy / 2; - - int32_t ndash = 0; - if(dash_width && dash_l * inv_dl < 1.0f) { - ndash = (int32_t)((1.0f / inv_dl + dash_l - 1) / dash_l); - } - - lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); - lv_vg_lite_path_set_quality(path, VG_LITE_MEDIUM); - lv_vg_lite_path_set_bonding_box_area(path, &rel_clip_area); - - /* head point */ - float head_start_x = p1_x + w2_dx; - float head_start_y = p1_y - w2_dy; - float head_end_x = p1_x - w2_dx; - float head_end_y = p1_y + w2_dy; - - /* tail point */ - float tail_start_x = p2_x - w2_dx; - float tail_start_y = p2_y + w2_dy; - float tail_end_x = p2_x + w2_dx; - float tail_end_y = p2_y - w2_dy; - - /* - head_start tail_end - *-----------------* - /| |\ - / | | \ - arc_c *( *p1 p2* )* arc_c - \ | | / - \| |/ - *-----------------* - head_end tail_start - */ - - /* move to start point */ - lv_vg_lite_path_move_to(path, head_start_x, head_start_y); - - /* draw line head */ - if(dsc->round_start) { - float arc_cx = p1_x - w2_dy; - float arc_cy = p1_y - w2_dx; - - /* start 90deg arc */ - lv_vg_lite_path_append_arc_right_angle(path, - head_start_x, head_start_y, - p1_x, p1_y, - arc_cx, arc_cy); - - /* end 90deg arc */ - lv_vg_lite_path_append_arc_right_angle(path, - arc_cx, arc_cy, - p1_x, p1_y, - head_end_x, head_end_y); - } - else { - lv_vg_lite_path_line_to(path, head_end_x, head_end_y); - } - - /* draw line body */ - lv_vg_lite_path_line_to(path, tail_start_x, tail_start_y); - - /* draw line tail */ - if(dsc->round_end) { - float arc_cx = p2_x + w2_dy; - float arc_cy = p2_y + w2_dx; - lv_vg_lite_path_append_arc_right_angle(path, - tail_start_x, tail_start_y, - p2_x, p2_y, - arc_cx, arc_cy); - lv_vg_lite_path_append_arc_right_angle(path, - arc_cx, arc_cy, - p2_x, p2_y, - tail_end_x, tail_end_y); - } - else { - lv_vg_lite_path_line_to(path, tail_end_x, tail_end_y); - } - - /* close draw line body */ - lv_vg_lite_path_line_to(path, head_start_x, head_start_y); - - for(int32_t i = 0; i < ndash; i++) { - float start_x = p1_x - w2_dx + dx * (i * dash_l + dash_width) * inv_dl; - float start_y = p1_y + w2_dy + dy * (i * dash_l + dash_width) * inv_dl; - - lv_vg_lite_path_move_to(path, start_x, start_y); - lv_vg_lite_path_line_to(path, - p1_x + w2_dx + dx * (i * dash_l + dash_width) * inv_dl, - p1_y - w2_dy + dy * (i * dash_l + dash_width) * inv_dl); - lv_vg_lite_path_line_to(path, - p1_x + w2_dx + dx * (i + 1) * dash_l * inv_dl, - p1_y - w2_dy + dy * (i + 1) * dash_l * inv_dl); - lv_vg_lite_path_line_to(path, - p1_x - w2_dx + dx * (i + 1) * dash_l * inv_dl, - p1_y + w2_dy + dy * (i + 1) * dash_l * inv_dl); - lv_vg_lite_path_line_to(path, start_x, start_y); - } - - lv_vg_lite_path_end(path); - - vg_lite_matrix_t matrix = u->global_matrix; - - vg_lite_color_t color = lv_vg_lite_color(dsc->color, dsc->opa, true); - - vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); - - LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); - LV_VG_LITE_ASSERT_PATH(vg_lite_path); - LV_VG_LITE_ASSERT_MATRIX(&matrix); - - LV_PROFILER_BEGIN_TAG("vg_lite_draw"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw( - &u->target_buffer, - vg_lite_path, - VG_LITE_FILL_EVEN_ODD, - &matrix, - VG_LITE_BLEND_SRC_OVER, - color)); - LV_PROFILER_END_TAG("vg_lite_draw"); - - lv_vg_lite_path_drop(u, path); - - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c deleted file mode 100644 index 3d24b23..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c +++ /dev/null @@ -1,144 +0,0 @@ -/** - * @file lv_draw_vg_lite_rect.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../misc/lv_area_private.h" -#include "../sw/lv_draw_sw_mask_private.h" -#include "../lv_draw_mask_private.h" -#include "lv_draw_vg_lite.h" - -#if LV_USE_DRAW_VG_LITE - -#include "lv_vg_lite_utils.h" -#include "lv_draw_vg_lite_type.h" -#include "lv_vg_lite_path.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vg_lite_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, - const lv_area_t * coords) -{ - LV_UNUSED(coords); - - lv_area_t draw_area; - if(!lv_area_intersect(&draw_area, &dsc->area, draw_unit->clip_area)) { - return; - } - - LV_PROFILER_BEGIN; - -#if LV_USE_VG_LITE_THORVG - /** - * ThorVG does not yet support simulating the VG_LITE_BLEND_DST_IN blend mode, - * and uses software rendering to achieve this - */ - lv_draw_sw_mask_radius_param_t param; - lv_draw_sw_mask_radius_init(¶m, &dsc->area, dsc->radius, false); - - void * masks[2] = {0}; - masks[0] = ¶m; - - uint32_t area_w = lv_area_get_width(&draw_area); - lv_opa_t * mask_buf = lv_malloc(area_w); - - int32_t y; - for(y = draw_area.y1; y <= draw_area.y2; y++) { - lv_memset(mask_buf, 0xff, area_w); - lv_draw_sw_mask_res_t res = lv_draw_sw_mask_apply(masks, mask_buf, draw_area.x1, y, area_w); - if(res == LV_DRAW_SW_MASK_RES_FULL_COVER) continue; - - lv_layer_t * target_layer = draw_unit->target_layer; - lv_color32_t * c32_buf = lv_draw_layer_go_to_xy(target_layer, draw_area.x1 - target_layer->buf_area.x1, - y - target_layer->buf_area.y1); - - if(res == LV_DRAW_SW_MASK_RES_TRANSP) { - lv_memzero(c32_buf, area_w * sizeof(lv_color32_t)); - } - else { - uint32_t i; - for(i = 0; i < area_w; i++) { - if(mask_buf[i] != LV_OPA_COVER) { - c32_buf[i].alpha = LV_OPA_MIX2(c32_buf[i].alpha, mask_buf[i]); - } - - /*Pre-multiply the alpha*/ - lv_color_premultiply(&c32_buf[i]); - } - } - } - - lv_free(mask_buf); - lv_draw_sw_mask_free_param(¶m); -#else - /* Using hardware rendering masks */ - lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; - - int32_t w = lv_area_get_width(&dsc->area); - int32_t h = lv_area_get_height(&dsc->area); - - lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); - lv_vg_lite_path_set_quality(path, VG_LITE_HIGH); - lv_vg_lite_path_set_bonding_box_area(path, &draw_area); - - /* Use rounded rectangles and normal rectangles of the same size to nest the cropped area */ - lv_vg_lite_path_append_rect(path, dsc->area.x1, dsc->area.y1, w, h, dsc->radius); - lv_vg_lite_path_append_rect(path, dsc->area.x1, dsc->area.y1, w, h, 0); - lv_vg_lite_path_end(path); - - vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); - - vg_lite_matrix_t matrix = u->global_matrix; - - LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); - LV_VG_LITE_ASSERT_PATH(vg_lite_path); - LV_VG_LITE_ASSERT_MATRIX(&matrix); - - /* Use VG_LITE_BLEND_DST_IN (Sa * D) blending mode to make the corners transparent */ - LV_PROFILER_BEGIN_TAG("vg_lite_draw"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw( - &u->target_buffer, - vg_lite_path, - VG_LITE_FILL_EVEN_ODD, - &matrix, - VG_LITE_BLEND_DST_IN, - 0)); - LV_PROFILER_END_TAG("vg_lite_draw"); - - lv_vg_lite_path_drop(u, path); -#endif /*LV_USE_VG_LITE_THORVG*/ - - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_triangle.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_triangle.c deleted file mode 100644 index 6360913..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_triangle.c +++ /dev/null @@ -1,114 +0,0 @@ -/** - * @file lv_draw_vg_lite_triangle.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../misc/lv_area_private.h" -#include "lv_draw_vg_lite.h" - -#if LV_USE_DRAW_VG_LITE - -#include "lv_vg_lite_utils.h" -#include "lv_vg_lite_path.h" -#include "lv_draw_vg_lite_type.h" -#include "lv_vg_lite_grad.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vg_lite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc) -{ - lv_area_t tri_area; - tri_area.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); - tri_area.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); - tri_area.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); - tri_area.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); - - bool is_common; - lv_area_t clip_area; - is_common = lv_area_intersect(&clip_area, &tri_area, draw_unit->clip_area); - if(!is_common) return; - - LV_PROFILER_BEGIN; - - lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; - - lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); - lv_vg_lite_path_set_bonding_box_area(path, &clip_area); - lv_vg_lite_path_move_to(path, dsc->p[0].x, dsc->p[0].y); - lv_vg_lite_path_line_to(path, dsc->p[1].x, dsc->p[1].y); - lv_vg_lite_path_line_to(path, dsc->p[2].x, dsc->p[2].y); - lv_vg_lite_path_close(path); - lv_vg_lite_path_end(path); - - vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); - - LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); - LV_VG_LITE_ASSERT_PATH(vg_lite_path); - - vg_lite_matrix_t matrix = u->global_matrix; - LV_VG_LITE_ASSERT_MATRIX(&matrix); - - if(dsc->bg_grad.dir != LV_GRAD_DIR_NONE) { -#if LV_USE_VECTOR_GRAPHIC - lv_vg_lite_draw_grad_helper( - u, - &u->target_buffer, - vg_lite_path, - &tri_area, - &dsc->bg_grad, - &matrix, - VG_LITE_FILL_EVEN_ODD, - VG_LITE_BLEND_SRC_OVER); -#else - LV_LOG_WARN("Gradient fill is not supported without VECTOR_GRAPHIC"); -#endif - } - else { /* normal fill */ - vg_lite_color_t color = lv_vg_lite_color(dsc->bg_color, dsc->bg_opa, true); - LV_PROFILER_BEGIN_TAG("vg_lite_draw"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw( - &u->target_buffer, - vg_lite_path, - VG_LITE_FILL_EVEN_ODD, - &matrix, - VG_LITE_BLEND_SRC_OVER, - color)); - LV_PROFILER_END_TAG("vg_lite_draw"); - } - - lv_vg_lite_path_drop(u, path); - - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_type.h b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_type.h deleted file mode 100644 index d325be5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_type.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * @file lv_draw_vg_lite_type.h - * - */ - -#ifndef LV_DRAW_VG_LITE_TYPE_H -#define LV_DRAW_VG_LITE_TYPE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" - -#if LV_USE_DRAW_VG_LITE - -#include "../lv_draw_private.h" -#include "../../misc/lv_array.h" - -#if LV_USE_VG_LITE_THORVG -#include "../../others/vg_lite_tvg/vg_lite.h" -#else -#include -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_vg_lite_pending_t; - -struct lv_draw_vg_lite_unit_t { - lv_draw_unit_t base_unit; - lv_draw_task_t * task_act; - - struct lv_vg_lite_pending_t * image_dsc_pending; - - lv_cache_t * grad_cache; - struct lv_vg_lite_pending_t * grad_pending; - - lv_cache_t * stroke_cache; - - uint16_t flush_count; - vg_lite_buffer_t target_buffer; - vg_lite_matrix_t global_matrix; - struct lv_vg_lite_path_t * global_path; - bool path_in_use; -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_VG_LITE_TYPE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_vector.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_vector.c deleted file mode 100644 index 481be5c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_draw_vg_lite_vector.c +++ /dev/null @@ -1,435 +0,0 @@ -/** - * @file lv_draw_vg_lite_vector.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../lv_image_decoder_private.h" -#include "../lv_draw_vector_private.h" -#include "lv_draw_vg_lite.h" - -#if LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC - -#include "lv_draw_vg_lite_type.h" -#include "lv_vg_lite_path.h" -#include "lv_vg_lite_pending.h" -#include "lv_vg_lite_utils.h" -#include "lv_vg_lite_grad.h" -#include "lv_vg_lite_stroke.h" -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef void * path_drop_data_t; -typedef void (*path_drop_func_t)(struct lv_draw_vg_lite_unit_t *, path_drop_data_t); - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_draw_dsc_t * dsc); -static void lv_path_to_vg(lv_vg_lite_path_t * dest, const lv_vector_path_t * src); -static vg_lite_path_type_t lv_path_opa_to_path_type(const lv_vector_draw_dsc_t * dsc); -static vg_lite_blend_t lv_blend_to_vg(lv_vector_blend_t blend); -static vg_lite_fill_t lv_fill_to_vg(lv_vector_fill_t fill_rule); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_vg_lite_vector(lv_draw_unit_t * draw_unit, const lv_draw_vector_task_dsc_t * dsc) -{ - if(dsc->task_list == NULL) - return; - - lv_layer_t * layer = dsc->base.layer; - if(layer->draw_buf == NULL) - return; - - LV_PROFILER_BEGIN; - lv_vector_for_each_destroy_tasks(dsc->task_list, task_draw_cb, draw_unit); - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static vg_lite_color_t lv_color32_to_vg(lv_color32_t color, lv_opa_t opa) -{ - uint8_t a = LV_OPA_MIX2(color.alpha, opa); - if(a < LV_OPA_COVER) { - color.red = LV_UDIV255(color.red * a); - color.green = LV_UDIV255(color.green * a); - color.blue = LV_UDIV255(color.blue * a); - } - return (uint32_t)a << 24 | (uint32_t)color.blue << 16 | (uint32_t)color.green << 8 | color.red; -} - -static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_draw_dsc_t * dsc) -{ - LV_PROFILER_BEGIN; - lv_draw_vg_lite_unit_t * u = ctx; - LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); - - /* clear area */ - if(!path) { - /* clear color needs to ignore fill_dsc.opa */ - vg_lite_color_t c = lv_color32_to_vg(dsc->fill_dsc.color, LV_OPA_COVER); - vg_lite_rectangle_t rect; - lv_vg_lite_rect(&rect, &dsc->scissor_area); - LV_PROFILER_BEGIN_TAG("vg_lite_clear"); - LV_VG_LITE_CHECK_ERROR(vg_lite_clear(&u->target_buffer, &rect, c)); - LV_PROFILER_END_TAG("vg_lite_clear"); - LV_PROFILER_END; - return; - } - - /* convert color */ - vg_lite_color_t vg_color = lv_color32_to_vg(dsc->fill_dsc.color, dsc->fill_dsc.opa); - - /* transform matrix */ - vg_lite_matrix_t matrix; - lv_vg_lite_matrix(&matrix, &dsc->matrix); - LV_VG_LITE_ASSERT_MATRIX(&matrix); - - /* convert path */ - lv_vg_lite_path_t * lv_vg_path = lv_vg_lite_path_get(u, VG_LITE_FP32); - lv_path_to_vg(lv_vg_path, path); - - /* get path bounds */ - float min_x, min_y, max_x, max_y; - lv_vg_lite_path_get_bonding_box(lv_vg_path, &min_x, &min_y, &max_x, &max_y); - - /* convert path type */ - vg_lite_path_type_t path_type = lv_path_opa_to_path_type(dsc); - - /* convert blend mode and fill rule */ - vg_lite_blend_t blend = lv_blend_to_vg(dsc->blend_mode); - vg_lite_fill_t fill = lv_fill_to_vg(dsc->fill_dsc.fill_rule); - - /* set default path drop function and data */ - path_drop_func_t path_drop_func = (path_drop_func_t)lv_vg_lite_path_drop; - path_drop_data_t path_drop_data = lv_vg_path; - - /* If it is fill mode, the end op code should be added */ - if(path_type == VG_LITE_DRAW_ZERO - || path_type == VG_LITE_DRAW_FILL_PATH - || path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { - lv_vg_lite_path_end(lv_vg_path); - } - - /* convert stroke style */ - if(path_type == VG_LITE_DRAW_STROKE_PATH - || path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { - lv_cache_entry_t * stroke_cache_entey = lv_vg_lite_stroke_get(u, lv_vg_path, &dsc->stroke_dsc); - - if(!stroke_cache_entey) { - LV_LOG_ERROR("convert stroke failed"); - - /* drop original path */ - lv_vg_lite_path_drop(u, lv_vg_path); - return; - } - - lv_vg_lite_path_t * ori_path = lv_vg_path; - const vg_lite_path_t * ori_vg_path = lv_vg_lite_path_get_path(ori_path); - - lv_vg_lite_path_t * stroke_path = lv_vg_lite_stroke_get_path(stroke_cache_entey); - vg_lite_path_t * vg_path = lv_vg_lite_path_get_path(stroke_path); - - /* set stroke params */ - LV_VG_LITE_CHECK_ERROR(vg_lite_set_path_type(vg_path, path_type)); - vg_path->stroke_color = lv_color32_to_vg(dsc->stroke_dsc.color, dsc->stroke_dsc.opa); - vg_path->quality = ori_vg_path->quality; - lv_memcpy(vg_path->bounding_box, ori_vg_path->bounding_box, sizeof(ori_vg_path->bounding_box)); - - /* change path to stroke path */ - LV_LOG_TRACE("change path to stroke path: %p -> %p", (void *)lv_vg_path, (void *)stroke_path); - lv_vg_path = stroke_path; - path_drop_func = (path_drop_func_t)lv_vg_lite_stroke_drop; - path_drop_data = stroke_cache_entey; - - /* drop original path */ - lv_vg_lite_path_drop(u, ori_path); - } - - vg_lite_path_t * vg_path = lv_vg_lite_path_get_path(lv_vg_path); - LV_VG_LITE_ASSERT_PATH(vg_path); - - if(vg_lite_query_feature(gcFEATURE_BIT_VG_SCISSOR)) { - /* set scissor area */ - lv_vg_lite_set_scissor_area(&dsc->scissor_area); - } - else { - /* calc inverse matrix */ - vg_lite_matrix_t result; - if(!lv_vg_lite_matrix_inverse(&result, &matrix)) { - LV_LOG_ERROR("no inverse matrix"); - path_drop_func(u, path_drop_data); - LV_PROFILER_END; - return; - } - - /* Reverse the clip area on the source */ - lv_point_precise_t p1 = { dsc->scissor_area.x1, dsc->scissor_area.y1 }; - lv_point_precise_t p1_res = lv_vg_lite_matrix_transform_point(&result, &p1); - - /* vg-lite bounding_box will crop the pixels on the edge, so +1px is needed here */ - lv_point_precise_t p2 = { dsc->scissor_area.x2 + 1, dsc->scissor_area.y2 + 1 }; - lv_point_precise_t p2_res = lv_vg_lite_matrix_transform_point(&result, &p2); - - lv_vg_lite_path_set_bonding_box(lv_vg_path, p1_res.x, p1_res.y, p2_res.x, p2_res.y); - } - - switch(dsc->fill_dsc.style) { - case LV_VECTOR_DRAW_STYLE_SOLID: { - /* normal draw shape */ - LV_PROFILER_BEGIN_TAG("vg_lite_draw"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw( - &u->target_buffer, - vg_path, - fill, - &matrix, - blend, - vg_color)); - LV_PROFILER_END_TAG("vg_lite_draw"); - } - break; - case LV_VECTOR_DRAW_STYLE_PATTERN: { - /* draw image */ - vg_lite_buffer_t image_buffer; - lv_image_decoder_dsc_t decoder_dsc; - if(lv_vg_lite_buffer_open_image(&image_buffer, &decoder_dsc, dsc->fill_dsc.img_dsc.src, false, true)) { - /* Calculate pattern matrix. Should start from path bond box, and also apply fill matrix. */ - lv_matrix_t m = dsc->matrix; - lv_matrix_translate(&m, min_x, min_y); - lv_matrix_multiply(&m, &dsc->fill_dsc.matrix); - - vg_lite_matrix_t pattern_matrix; - lv_vg_lite_matrix(&pattern_matrix, &m); - - vg_lite_color_t recolor = lv_vg_lite_color(dsc->fill_dsc.img_dsc.recolor, dsc->fill_dsc.img_dsc.recolor_opa, true); - - LV_VG_LITE_ASSERT_MATRIX(&pattern_matrix); - - LV_PROFILER_BEGIN_TAG("vg_lite_draw_pattern"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw_pattern( - &u->target_buffer, - vg_path, - fill, - &matrix, - &image_buffer, - &pattern_matrix, - blend, - VG_LITE_PATTERN_COLOR, - vg_color, - recolor, - VG_LITE_FILTER_BI_LINEAR)); - LV_PROFILER_END_TAG("vg_lite_draw_pattern"); - - lv_vg_lite_pending_add(u->image_dsc_pending, &decoder_dsc); - } - } - break; - case LV_VECTOR_DRAW_STYLE_GRADIENT: { - vg_lite_matrix_t grad_matrix; - vg_lite_identity(&grad_matrix); - -#if !LV_USE_VG_LITE_THORVG - /* Workaround inconsistent matrix behavior between device and ThorVG */ - lv_vg_lite_matrix_multiply(&grad_matrix, &matrix); -#endif - vg_lite_matrix_t fill_matrix; - lv_vg_lite_matrix(&fill_matrix, &dsc->fill_dsc.matrix); - lv_vg_lite_matrix_multiply(&grad_matrix, &fill_matrix); - - lv_vg_lite_draw_grad( - u, - &u->target_buffer, - vg_path, - &dsc->fill_dsc.gradient, - &grad_matrix, - &matrix, - fill, - blend); - } - break; - default: - LV_LOG_WARN("unknown style: %d", dsc->fill_dsc.style); - break; - } - - /* Flush in time to avoid accumulation of drawing commands */ - lv_vg_lite_flush(u); - - /* drop path */ - path_drop_func(u, path_drop_data); - - if(vg_lite_query_feature(gcFEATURE_BIT_VG_SCISSOR)) { - /* disable scissor */ - lv_vg_lite_disable_scissor(); - } - - LV_PROFILER_END; -} - -static vg_lite_quality_t lv_quality_to_vg(lv_vector_path_quality_t quality) -{ - switch(quality) { - case LV_VECTOR_PATH_QUALITY_LOW: - return VG_LITE_LOW; - case LV_VECTOR_PATH_QUALITY_MEDIUM: - return VG_LITE_MEDIUM; - case LV_VECTOR_PATH_QUALITY_HIGH: - return VG_LITE_HIGH; - default: - return VG_LITE_MEDIUM; - } -} - -static void lv_path_to_vg(lv_vg_lite_path_t * dest, const lv_vector_path_t * src) -{ - LV_PROFILER_BEGIN; - lv_vg_lite_path_set_quality(dest, lv_quality_to_vg(src->quality)); - - /* init bounds */ - float min_x = FLT_MAX; - float min_y = FLT_MAX; - float max_x = FLT_MIN; - float max_y = FLT_MIN; - -#define CMP_BOUNDS(point) \ - do { \ - if((point)->x < min_x) min_x = (point)->x; \ - if((point)->y < min_y) min_y = (point)->y; \ - if((point)->x > max_x) max_x = (point)->x; \ - if((point)->y > max_y) max_y = (point)->y; \ - } while(0) - - uint32_t pidx = 0; - lv_vector_path_op_t * op = lv_array_front(&src->ops); - uint32_t size = lv_array_size(&src->ops); - for(uint32_t i = 0; i < size; i++) { - switch(op[i]) { - case LV_VECTOR_PATH_OP_MOVE_TO: { - const lv_fpoint_t * pt = lv_array_at(&src->points, pidx); - CMP_BOUNDS(pt); - lv_vg_lite_path_move_to(dest, pt->x, pt->y); - pidx += 1; - } - break; - case LV_VECTOR_PATH_OP_LINE_TO: { - const lv_fpoint_t * pt = lv_array_at(&src->points, pidx); - CMP_BOUNDS(pt); - lv_vg_lite_path_line_to(dest, pt->x, pt->y); - pidx += 1; - } - break; - case LV_VECTOR_PATH_OP_QUAD_TO: { - const lv_fpoint_t * pt1 = lv_array_at(&src->points, pidx); - const lv_fpoint_t * pt2 = lv_array_at(&src->points, pidx + 1); - CMP_BOUNDS(pt1); - CMP_BOUNDS(pt2); - lv_vg_lite_path_quad_to(dest, pt1->x, pt1->y, pt2->x, pt2->y); - pidx += 2; - } - break; - case LV_VECTOR_PATH_OP_CUBIC_TO: { - const lv_fpoint_t * pt1 = lv_array_at(&src->points, pidx); - const lv_fpoint_t * pt2 = lv_array_at(&src->points, pidx + 1); - const lv_fpoint_t * pt3 = lv_array_at(&src->points, pidx + 2); - CMP_BOUNDS(pt1); - CMP_BOUNDS(pt2); - CMP_BOUNDS(pt3); - lv_vg_lite_path_cubic_to(dest, pt1->x, pt1->y, pt2->x, pt2->y, pt3->x, pt3->y); - pidx += 3; - } - break; - case LV_VECTOR_PATH_OP_CLOSE: { - lv_vg_lite_path_close(dest); - } - break; - } - } - - lv_vg_lite_path_set_bonding_box(dest, min_x, min_y, max_x, max_y); - LV_PROFILER_END; -} - -static vg_lite_path_type_t lv_path_opa_to_path_type(const lv_vector_draw_dsc_t * dsc) -{ - lv_opa_t fill_opa = dsc->fill_dsc.opa; - lv_opa_t stroke_opa = dsc->stroke_dsc.opa; - - if(fill_opa > LV_OPA_0 && stroke_opa > LV_OPA_0) { - return VG_LITE_DRAW_FILL_STROKE_PATH; - } - - if(fill_opa == LV_OPA_0 && stroke_opa > LV_OPA_0) { - return VG_LITE_DRAW_STROKE_PATH; - } - - if(fill_opa > LV_OPA_0) { - return VG_LITE_DRAW_FILL_PATH; - } - - return VG_LITE_DRAW_ZERO; -} - -static vg_lite_blend_t lv_blend_to_vg(lv_vector_blend_t blend) -{ - switch(blend) { - case LV_VECTOR_BLEND_SRC_OVER: - return VG_LITE_BLEND_SRC_OVER; - case LV_VECTOR_BLEND_SCREEN: - return VG_LITE_BLEND_SCREEN; - case LV_VECTOR_BLEND_MULTIPLY: - return VG_LITE_BLEND_MULTIPLY; - case LV_VECTOR_BLEND_NONE: - return VG_LITE_BLEND_NONE; - case LV_VECTOR_BLEND_ADDITIVE: - return VG_LITE_BLEND_ADDITIVE; - case LV_VECTOR_BLEND_SRC_IN: - return VG_LITE_BLEND_SRC_IN; - case LV_VECTOR_BLEND_DST_OVER: - return VG_LITE_BLEND_DST_OVER; - case LV_VECTOR_BLEND_DST_IN: - return VG_LITE_BLEND_DST_IN; - case LV_VECTOR_BLEND_SUBTRACTIVE: - return VG_LITE_BLEND_SUBTRACT; - default: - return VG_LITE_BLEND_SRC_OVER; - } -} - -static vg_lite_fill_t lv_fill_to_vg(lv_vector_fill_t fill_rule) -{ - switch(fill_rule) { - case LV_VECTOR_FILL_NONZERO: - return VG_LITE_FILL_NON_ZERO; - case LV_VECTOR_FILL_EVENODD: - return VG_LITE_FILL_EVEN_ODD; - default: - return VG_LITE_FILL_NON_ZERO; - } -} - -#endif /*LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_decoder.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_decoder.c deleted file mode 100644 index bb7a784..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_decoder.c +++ /dev/null @@ -1,393 +0,0 @@ -/** - * @file lv_vg_lite_decoder.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../lv_image_decoder_private.h" -#include "lv_vg_lite_decoder.h" - -#if LV_USE_DRAW_VG_LITE - -#include "lv_vg_lite_utils.h" -#include -#include -#include "../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ - -#define DECODER_NAME "VG_LITE" - -#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) - -/* VG_LITE_INDEX1, 2, and 4 require endian flipping + bit flipping, - * so for simplicity, they are uniformly converted to I8 for display. - */ -#define DEST_IMG_FORMAT LV_COLOR_FORMAT_I8 -#define IS_CONV_INDEX_FORMAT(cf) (cf == LV_COLOR_FORMAT_I1 || cf == LV_COLOR_FORMAT_I2 || cf == LV_COLOR_FORMAT_I4) - -/* Since the palette and index image are next to each other, - * the palette size needs to be aligned to ensure that the image is aligned. - */ -#define DEST_IMG_OFFSET \ - LV_VG_LITE_ALIGN(LV_COLOR_INDEXED_PALETTE_SIZE(DEST_IMG_FORMAT) * sizeof(lv_color32_t), LV_DRAW_BUF_ALIGN) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * src, lv_image_header_t * header); -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -static void image_color32_pre_mul(lv_color32_t * img_data, uint32_t px_size); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_vg_lite_decoder_init(void) -{ - lv_image_decoder_t * decoder = lv_image_decoder_create(); - lv_image_decoder_set_info_cb(decoder, decoder_info); - lv_image_decoder_set_open_cb(decoder, decoder_open); - lv_image_decoder_set_close_cb(decoder, decoder_close); - - decoder->name = DECODER_NAME; -} - -void lv_vg_lite_decoder_deinit(void) -{ - lv_image_decoder_t * dec = NULL; - while((dec = lv_image_decoder_get_next(dec)) != NULL) { - if(dec->info_cb == decoder_info) { - lv_image_decoder_delete(dec); - break; - } - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void image_color32_pre_mul(lv_color32_t * img_data, uint32_t px_size) -{ - while(px_size--) { - lv_color_premultiply(img_data); - img_data++; - } -} - -static uint32_t image_stride(const lv_image_header_t * header) -{ - /* use stride in header */ - if(header->stride) { - return header->stride; - } - - /* guess stride */ - uint32_t ori_stride = header->w * lv_color_format_get_bpp(header->cf); - ori_stride = (ori_stride + 7) >> 3; /*Round up*/ - return ori_stride; -} - -static void image_decode_to_index8_line(uint8_t * dest, const uint8_t * src, int32_t w_px, - lv_color_format_t color_format) -{ - uint8_t px_size; - uint16_t mask; - - int8_t shift = 0; - switch(color_format) { - case LV_COLOR_FORMAT_I1: - px_size = 1; - shift = 7; - break; - case LV_COLOR_FORMAT_I2: - px_size = 2; - shift = 6; - break; - case LV_COLOR_FORMAT_I4: - px_size = 4; - shift = 4; - break; - case LV_COLOR_FORMAT_I8: - lv_memcpy(dest, src, w_px); - return; - default: - LV_ASSERT_FORMAT_MSG(false, "Unsupported color format: %d", color_format); - return; - } - - mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/ - - for(int32_t i = 0; i < w_px; i++) { - uint8_t val_act = (*src >> shift) & mask; - dest[i] = val_act; - - shift -= px_size; - if(shift < 0) { - shift = 8 - px_size; - src++; - } - } -} - -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) -{ - lv_result_t res = lv_bin_decoder_info(decoder, dsc, header); - if(res != LV_RESULT_OK) { - return res; - } - - if(!IS_CONV_INDEX_FORMAT(header->cf)) { - return LV_RESULT_INVALID; - } - - if(header->flags & LV_IMAGE_FLAGS_COMPRESSED) { - LV_LOG_WARN("NOT Supported compressed index format: %d", header->cf); - return LV_RESULT_INVALID; - } - - header->cf = DEST_IMG_FORMAT; - return LV_RESULT_OK; -} - -static lv_result_t decoder_open_variable(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); /*Unused*/ - - lv_draw_buf_t src_img_buf; - lv_draw_buf_from_image(&src_img_buf, dsc->src); - - /* Since dsc->header.cf is uniformly set to I8, - * the original format is obtained from src for conversion. - */ - lv_color_format_t src_cf = src_img_buf.header.cf; - - int32_t width = dsc->header.w; - int32_t height = dsc->header.h; - - /* create draw buf */ - lv_draw_buf_t * draw_buf = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, width, height, DEST_IMG_FORMAT, - LV_STRIDE_AUTO); - if(draw_buf == NULL) { - return LV_RESULT_INVALID; - } - - lv_draw_buf_clear(draw_buf, NULL); - dsc->decoded = draw_buf; - - uint32_t src_stride = image_stride(&src_img_buf.header); - uint32_t dest_stride = draw_buf->header.stride; - - /*In case of uncompressed formats the image stored in the ROM/RAM. - *So simply give its pointer*/ - const uint8_t * src = ((lv_image_dsc_t *)dsc->src)->data; - uint8_t * dest = draw_buf->data; - - /* index format only */ - uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(src_cf); - LV_ASSERT(palette_size > 0); - - uint32_t palette_size_bytes = palette_size * sizeof(lv_color32_t); - - /* copy palette */ - lv_memcpy(dest, src, palette_size_bytes); - - if(dsc->args.premultiply) { - /* pre-multiply palette */ - image_color32_pre_mul((lv_color32_t *)dest, palette_size); - draw_buf->header.flags |= LV_IMAGE_FLAGS_PREMULTIPLIED; - } - - /* move to index image map */ - src += palette_size_bytes; - dest += DEST_IMG_OFFSET; - - /* copy index image */ - for(int32_t y = 0; y < height; y++) { - image_decode_to_index8_line(dest, src, width, src_cf); - src += src_stride; - dest += dest_stride; - } - - return LV_RESULT_OK; -} - -static lv_result_t decoder_open_file(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); /*Unused*/ - - uint32_t width = dsc->header.w; - uint32_t height = dsc->header.h; - const char * path = dsc->src; - uint8_t * src_temp = NULL; - - lv_fs_file_t file; - lv_fs_res_t res = lv_fs_open(&file, path, LV_FS_MODE_RD); - if(res != LV_FS_RES_OK) { - LV_LOG_ERROR("open %s failed", path); - return LV_RESULT_INVALID; - } - - /* get real src header */ - lv_image_header_t src_header; - uint32_t header_br = 0; - res = lv_fs_read(&file, &src_header, sizeof(src_header), &header_br); - if(res != LV_FS_RES_OK || header_br != sizeof(src_header)) { - LV_LOG_ERROR("read %s lv_image_header_t failed", path); - lv_fs_close(&file); - return LV_RESULT_INVALID; - } - - lv_draw_buf_t * draw_buf = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, width, height, DEST_IMG_FORMAT, - LV_STRIDE_AUTO); - if(draw_buf == NULL) { - lv_fs_close(&file); - return LV_RESULT_INVALID; - } - - lv_draw_buf_clear(draw_buf, NULL); - - /* get stride */ - uint32_t src_stride = image_stride(&src_header); - uint32_t dest_stride = draw_buf->header.stride; - - dsc->decoded = draw_buf; - uint8_t * dest = draw_buf->data; - - /* index format only */ - uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(src_header.cf); - if(palette_size == 0) { - LV_LOG_ERROR("file %s invalid palette size: %" LV_PRIu32, path, palette_size); - goto failed; - } - - uint32_t palette_size_bytes = palette_size * sizeof(lv_color32_t); - - /* read palette */ - uint32_t palette_br = 0; - res = lv_fs_read(&file, dest, palette_size_bytes, &palette_br); - if(res != LV_FS_RES_OK || palette_br != palette_size_bytes) { - LV_LOG_ERROR("read %s (palette: %" LV_PRIu32 ", br: %" LV_PRIu32 ") failed", - path, palette_size_bytes, palette_br); - goto failed; - } - - if(dsc->args.premultiply) { - /* pre-multiply palette */ - image_color32_pre_mul((lv_color32_t *)dest, palette_size); - draw_buf->header.flags |= LV_IMAGE_FLAGS_PREMULTIPLIED; - } - - src_temp = lv_malloc(src_stride); - if(src_temp == NULL) { - LV_LOG_ERROR("malloc src_temp failed"); - goto failed; - } - - /* move to index image map */ - dest += DEST_IMG_OFFSET; - - for(uint32_t y = 0; y < height; y++) { - uint32_t br = 0; - res = lv_fs_read(&file, src_temp, src_stride, &br); - if(res != LV_FS_RES_OK || br != src_stride) { - LV_LOG_ERROR("read %s (y: %" LV_PRIu32 ", src_stride: %" LV_PRIu32 ", br: %" LV_PRIu32 ") failed", - path, y, src_stride, br); - goto failed; - } - - /* convert to index8 */ - image_decode_to_index8_line(dest, src_temp, width, src_header.cf); - dest += dest_stride; - } - - lv_free(src_temp); - - lv_fs_close(&file); - return LV_RESULT_OK; - -failed: - if(src_temp) { - lv_free(src_temp); - } - lv_fs_close(&file); - lv_draw_buf_destroy(draw_buf); - dsc->decoded = NULL; - - return LV_RESULT_INVALID; -} - -/** - * Decode an image using the vg_lite gpu. - * @param decoder pointer to the decoder - * @param dsc pointer to the decoder descriptor - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image - */ -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - lv_result_t res = LV_RESULT_INVALID; - - switch(dsc->src_type) { - case LV_IMAGE_SRC_VARIABLE: - res = decoder_open_variable(decoder, dsc); - break; - case LV_IMAGE_SRC_FILE: - res = decoder_open_file(decoder, dsc); - break; - default: - break; - } - - if(dsc->args.no_cache) return res; - - /*If the image cache is disabled, just return the decoded image*/ - if(!lv_image_cache_is_enabled()) return res; - - /*Add the decoded image to the cache*/ - if(res == LV_RESULT_OK) { - lv_image_cache_data_t search_key; - search_key.src_type = dsc->src_type; - search_key.src = dsc->src; - search_key.slot.size = dsc->decoded->data_size; - - lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, dsc->decoded, NULL); - - if(entry == NULL) { - lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); - dsc->decoded = NULL; - return LV_RESULT_INVALID; - } - dsc->cache_entry = entry; - } - - return res; -} - -static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); /*Unused*/ - - if(dsc->args.no_cache || !lv_image_cache_is_enabled()) lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); -} - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_decoder.h b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_decoder.h deleted file mode 100644 index 9bab540..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_decoder.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @file lv_vg_lite_decoder.h - * - */ - -#ifndef LV_VG_LITE_DECODER_H -#define LV_VG_LITE_DECODER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../lv_image_decoder.h" - -#if LV_USE_DRAW_VG_LITE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_vg_lite_decoder_init(void); - -void lv_vg_lite_decoder_deinit(void); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_VG_LITE_DECODER_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_grad.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_grad.c deleted file mode 100644 index 5158d05..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_grad.c +++ /dev/null @@ -1,687 +0,0 @@ -/** - * @file lv_vg_lite_grad.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../lv_draw_vector_private.h" -#include "lv_vg_lite_grad.h" - -#if LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC - -#include "lv_draw_vg_lite_type.h" -#include "lv_vg_lite_pending.h" -#include "lv_vg_lite_math.h" -#include "../../misc/lv_types.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -#define SQUARE(x) ((x)*(x)) - -#ifndef M_PI - #define M_PI 3.1415926f -#endif - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - GRAD_TYPE_UNKNOWN, - GRAD_TYPE_LINEAR, - GRAD_TYPE_LINEAR_EXT, - GRAD_TYPE_RADIAL, -} grad_type_t; - -typedef struct { - grad_type_t type; - lv_vector_gradient_t lv; - union { - vg_lite_linear_gradient_t linear; - vg_lite_ext_linear_gradient_t linear_ext; - vg_lite_radial_gradient_t radial; - } vg; -} grad_item_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static grad_item_t * grad_get(struct lv_draw_vg_lite_unit_t * u, const lv_vector_gradient_t * grad); -static void grad_cache_release_cb(void * entry, void * user_data); -static bool grad_create_cb(grad_item_t * item, void * user_data); -static void grad_free_cb(grad_item_t * item, void * user_data); -static lv_cache_compare_res_t grad_compare_cb(const grad_item_t * lhs, const grad_item_t * rhs); - -static grad_type_t lv_grad_style_to_type(lv_vector_gradient_style_t style); -static void grad_point_to_matrix(vg_lite_matrix_t * grad_matrix, float x1, float y1, float x2, float y2); -static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t spread); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_vg_lite_grad_init(struct lv_draw_vg_lite_unit_t * u, uint32_t cache_cnt) -{ - LV_ASSERT_NULL(u); - - lv_cache_ops_t ops = { - .compare_cb = (lv_cache_compare_cb_t)grad_compare_cb, - .create_cb = (lv_cache_create_cb_t)grad_create_cb, - .free_cb = (lv_cache_free_cb_t)grad_free_cb, - }; - - u->grad_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(grad_item_t), cache_cnt, ops); - lv_cache_set_name(u->grad_cache, "VG_GRAD"); - u->grad_pending = lv_vg_lite_pending_create(sizeof(lv_cache_entry_t *), 4); - lv_vg_lite_pending_set_free_cb(u->grad_pending, grad_cache_release_cb, u->grad_cache); -} - -void lv_vg_lite_grad_deinit(struct lv_draw_vg_lite_unit_t * u) -{ - LV_ASSERT_NULL(u); - LV_ASSERT_NULL(u->grad_pending) - lv_vg_lite_pending_destroy(u->grad_pending); - u->grad_pending = NULL; - lv_cache_destroy(u->grad_cache, NULL); - u->grad_cache = NULL; -} - -bool lv_vg_lite_draw_grad( - struct lv_draw_vg_lite_unit_t * u, - vg_lite_buffer_t * buffer, - vg_lite_path_t * path, - const lv_vector_gradient_t * grad, - const vg_lite_matrix_t * grad_matrix, - const vg_lite_matrix_t * matrix, - vg_lite_fill_t fill, - vg_lite_blend_t blend) -{ - LV_ASSERT_NULL(u); - LV_VG_LITE_ASSERT_DEST_BUFFER(buffer); - LV_VG_LITE_ASSERT_PATH(path); - LV_ASSERT_NULL(grad); - LV_VG_LITE_ASSERT_MATRIX(grad_matrix); - LV_VG_LITE_ASSERT_MATRIX(matrix); - - /* check radial gradient is supported */ - if(grad->style == LV_VECTOR_GRADIENT_STYLE_RADIAL) { - if(!vg_lite_query_feature(gcFEATURE_BIT_VG_RADIAL_GRADIENT)) { - LV_LOG_INFO("radial gradient is not supported"); - return false; - } - - /* check if the radius is valid */ - if(grad->cr <= 0) { - LV_LOG_INFO("radius: %f is not valid", grad->cr); - return false; - } - } - - /* check spread mode is supported */ - if(grad->spread == LV_VECTOR_GRADIENT_SPREAD_REPEAT || grad->spread == LV_VECTOR_GRADIENT_SPREAD_REFLECT) { - if(!vg_lite_query_feature(gcFEATURE_BIT_VG_IM_REPEAT_REFLECT)) { - LV_LOG_INFO("repeat/reflect spread(%d) is not supported", grad->spread); - return false; - } - } - - LV_PROFILER_BEGIN_TAG("grad_get"); - grad_item_t * grad_item = grad_get(u, grad); - LV_PROFILER_END_TAG("grad_get"); - if(!grad_item) { - LV_LOG_WARN("Failed to get gradient, style: %d", grad->style); - return false; - } - LV_ASSERT(grad_item->lv.style == grad->style); - - switch(grad_item->type) { - case GRAD_TYPE_LINEAR: { - vg_lite_linear_gradient_t * linear_grad = &grad_item->vg.linear; - vg_lite_matrix_t * grad_mat_p = vg_lite_get_grad_matrix(linear_grad); - LV_ASSERT_NULL(grad_mat_p); - vg_lite_identity(grad_mat_p); - lv_vg_lite_matrix_multiply(grad_mat_p, grad_matrix); - grad_point_to_matrix(grad_mat_p, grad->x1, grad->y1, grad->x2, grad->y2); - - LV_VG_LITE_ASSERT_SRC_BUFFER(&linear_grad->image); - - LV_PROFILER_BEGIN_TAG("vg_lite_draw_grad"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw_grad( - buffer, - path, - fill, - (vg_lite_matrix_t *)matrix, - linear_grad, - blend)); - LV_PROFILER_END_TAG("vg_lite_draw_grad"); - } - break; - case GRAD_TYPE_LINEAR_EXT: { - vg_lite_ext_linear_gradient_t * linear_grad = &grad_item->vg.linear_ext; - vg_lite_matrix_t * grad_mat_p = vg_lite_get_linear_grad_matrix(linear_grad); - LV_ASSERT_NULL(grad_mat_p); - *grad_mat_p = *grad_matrix; - - LV_VG_LITE_ASSERT_SRC_BUFFER(&linear_grad->image); - - LV_PROFILER_BEGIN_TAG("vg_lite_draw_linear_grad"); - LV_VG_LITE_CHECK_ERROR(vg_lite_draw_linear_grad( - buffer, - path, - fill, - (vg_lite_matrix_t *)matrix, - linear_grad, - 0, - blend, - VG_LITE_FILTER_LINEAR)); - LV_PROFILER_END_TAG("vg_lite_draw_linear_grad"); - } - break; - - case GRAD_TYPE_RADIAL: { - vg_lite_radial_gradient_t * radial = &grad_item->vg.radial; - vg_lite_matrix_t * grad_mat_p = vg_lite_get_radial_grad_matrix(radial); - LV_ASSERT_NULL(grad_mat_p); - *grad_mat_p = *grad_matrix; - - LV_VG_LITE_ASSERT_SRC_BUFFER(&grad_item->vg.radial.image); - - LV_PROFILER_BEGIN_TAG("vg_lite_draw_radial_grad"); - LV_VG_LITE_CHECK_ERROR( - vg_lite_draw_radial_grad( - buffer, - path, - fill, - (vg_lite_matrix_t *)matrix, - &grad_item->vg.radial, - 0, - blend, - VG_LITE_FILTER_LINEAR)); - LV_PROFILER_END_TAG("vg_lite_draw_radial_grad"); - } - break; - - default: - LV_LOG_ERROR("Unsupported gradient type: %d", grad_item->type); - return false; - } - - return true; -} - -bool lv_vg_lite_draw_grad_helper( - struct lv_draw_vg_lite_unit_t * u, - vg_lite_buffer_t * buffer, - vg_lite_path_t * path, - const lv_area_t * area, - const lv_grad_dsc_t * grad_dsc, - const vg_lite_matrix_t * matrix, - vg_lite_fill_t fill, - vg_lite_blend_t blend) -{ - LV_ASSERT_NULL(u); - LV_VG_LITE_ASSERT_DEST_BUFFER(buffer); - LV_VG_LITE_ASSERT_PATH(path); - LV_ASSERT_NULL(area); - LV_ASSERT_NULL(grad_dsc); - LV_VG_LITE_ASSERT_MATRIX(matrix); - - lv_vector_gradient_t grad; - lv_memzero(&grad, sizeof(grad)); - - grad.style = LV_VECTOR_GRADIENT_STYLE_LINEAR; - grad.stops_count = grad_dsc->stops_count; - lv_memcpy(grad.stops, grad_dsc->stops, sizeof(lv_gradient_stop_t) * grad_dsc->stops_count); - - /*convert to spread mode*/ -#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS - switch(grad_dsc->extend) { - case LV_GRAD_EXTEND_PAD: - grad.spread = LV_VECTOR_GRADIENT_SPREAD_PAD; - break; - case LV_GRAD_EXTEND_REPEAT: - grad.spread = LV_VECTOR_GRADIENT_SPREAD_REPEAT; - break; - case LV_GRAD_EXTEND_REFLECT: - grad.spread = LV_VECTOR_GRADIENT_SPREAD_REFLECT; - break; - default: - LV_LOG_WARN("Unsupported gradient extend mode: %d", grad_dsc->extend); - grad.spread = LV_VECTOR_GRADIENT_SPREAD_PAD; - break; - } -#else - grad.spread = LV_VECTOR_GRADIENT_SPREAD_PAD; -#endif - - switch(grad_dsc->dir) { - case LV_GRAD_DIR_VER: - grad.x1 = area->x1; - grad.y1 = area->y1; - grad.x2 = area->x1; - grad.y2 = area->y2 + 1; - break; - - case LV_GRAD_DIR_HOR: - grad.x1 = area->x1; - grad.y1 = area->y1; - grad.x2 = area->x2 + 1; - grad.y2 = area->y1; - break; - -#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS - case LV_GRAD_DIR_LINEAR: { - int32_t w = lv_area_get_width(area); - int32_t h = lv_area_get_height(area); - - grad.x1 = lv_pct_to_px(grad_dsc->params.linear.start.x, w) + area->x1; - grad.y1 = lv_pct_to_px(grad_dsc->params.linear.start.y, h) + area->y1; - grad.x2 = lv_pct_to_px(grad_dsc->params.linear.end.x, w) + area->x1; - grad.y2 = lv_pct_to_px(grad_dsc->params.linear.end.y, h) + area->y1; - } - break; - - case LV_GRAD_DIR_RADIAL: { - grad.style = LV_VECTOR_GRADIENT_STYLE_RADIAL; - int32_t w = lv_area_get_width(area); - int32_t h = lv_area_get_height(area); - - grad.cx = lv_pct_to_px(grad_dsc->params.radial.focal.x, w) + area->x1; - grad.cy = lv_pct_to_px(grad_dsc->params.radial.focal.y, h) + area->y1; - int32_t end_extent_x = lv_pct_to_px(grad_dsc->params.radial.end_extent.x, w) + area->x1; - int32_t end_extent_y = lv_pct_to_px(grad_dsc->params.radial.end_extent.y, h) + area->y1; - grad.cr = LV_MAX(end_extent_x - grad.cx, end_extent_y - grad.cy); - } - break; -#endif - - default: - LV_LOG_WARN("Unsupported gradient direction: %d", grad_dsc->dir); - return false; - } - - return lv_vg_lite_draw_grad(u, buffer, path, &grad, matrix, matrix, fill, blend); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static grad_item_t * grad_get(struct lv_draw_vg_lite_unit_t * u, const lv_vector_gradient_t * grad) -{ - LV_ASSERT_NULL(u); - LV_ASSERT_NULL(grad); - - grad_item_t search_key; - lv_memzero(&search_key, sizeof(search_key)); - search_key.type = lv_grad_style_to_type(grad->style); - search_key.lv = *grad; - - lv_cache_entry_t * cache_node_entry = lv_cache_acquire(u->grad_cache, &search_key, NULL); - if(cache_node_entry == NULL) { - /* check if the cache is full */ - size_t free_size = lv_cache_get_free_size(u->grad_cache, NULL); - if(free_size == 0) { - LV_LOG_INFO("grad cache is full, release all pending cache entries"); - lv_vg_lite_finish(u); - } - - cache_node_entry = lv_cache_acquire_or_create(u->grad_cache, &search_key, NULL); - if(cache_node_entry == NULL) { - LV_LOG_ERROR("grad cache creating failed"); - return NULL; - } - } - - /* Add the new entry to the pending list */ - lv_vg_lite_pending_add(u->grad_pending, &cache_node_entry); - - return lv_cache_entry_get_data(cache_node_entry); -} - -static void grad_cache_release_cb(void * entry, void * user_data) -{ - lv_cache_entry_t ** entry_p = entry; - lv_cache_t * cache = user_data; - lv_cache_release(cache, * entry_p, NULL); -} - -static vg_lite_color_ramp_t * grad_create_color_ramp(const lv_vector_gradient_t * grad) -{ - LV_ASSERT_NULL(grad); - - vg_lite_color_ramp_t * color_ramp = lv_malloc(sizeof(vg_lite_color_ramp_t) * grad->stops_count); - LV_ASSERT_MALLOC(color_ramp); - if(!color_ramp) { - LV_LOG_ERROR("malloc failed for color_ramp"); - return NULL; - } - - for(uint16_t i = 0; i < grad->stops_count; i++) { - color_ramp[i].stop = grad->stops[i].frac / 255.0f; - lv_color_t c = grad->stops[i].color; - - color_ramp[i].red = c.red / 255.0f; - color_ramp[i].green = c.green / 255.0f; - color_ramp[i].blue = c.blue / 255.0f; - color_ramp[i].alpha = grad->stops[i].opa / 255.0f; - } - - return color_ramp; -} - -static bool linear_grad_create(grad_item_t * item) -{ - LV_PROFILER_BEGIN; - - vg_lite_error_t err = vg_lite_init_grad(&item->vg.linear); - if(err != VG_LITE_SUCCESS) { - LV_PROFILER_END; - LV_LOG_ERROR("init grad error(%d): %s", (int)err, lv_vg_lite_error_string(err)); - return false; - } - - vg_lite_uint32_t colors[VLC_MAX_GRADIENT_STOPS]; - vg_lite_uint32_t stops[VLC_MAX_GRADIENT_STOPS]; - - /* Gradient setup */ - if(item->lv.stops_count > VLC_MAX_GRADIENT_STOPS) { - LV_LOG_WARN("Gradient stops limited: %d, max: %d", item->lv.stops_count, VLC_MAX_GRADIENT_STOPS); - item->lv.stops_count = VLC_MAX_GRADIENT_STOPS; - } - - for(uint16_t i = 0; i < item->lv.stops_count; i++) { - stops[i] = item->lv.stops[i].frac; - const lv_color_t * c = &item->lv.stops[i].color; - lv_opa_t opa = item->lv.stops[i].opa; - - /* lvgl color -> gradient color */ - lv_color_t grad_color = lv_color_make(c->blue, c->green, c->red); - colors[i] = lv_vg_lite_color(grad_color, opa, true); - } - - LV_VG_LITE_CHECK_ERROR(vg_lite_set_grad(&item->vg.linear, item->lv.stops_count, colors, stops)); - - LV_PROFILER_BEGIN_TAG("vg_lite_update_grad"); - LV_VG_LITE_CHECK_ERROR(vg_lite_update_grad(&item->vg.linear)); - LV_PROFILER_END_TAG("vg_lite_update_grad"); - - LV_PROFILER_END; - return true; -} - -static bool linear_ext_grad_create(grad_item_t * item) -{ - LV_PROFILER_BEGIN; - - if(item->lv.stops_count > VLC_MAX_COLOR_RAMP_STOPS) { - LV_LOG_WARN("Gradient stops limited: %d, max: %d", item->lv.stops_count, VLC_MAX_GRADIENT_STOPS); - item->lv.stops_count = VLC_MAX_COLOR_RAMP_STOPS; - } - - vg_lite_color_ramp_t * color_ramp = grad_create_color_ramp(&item->lv); - if(!color_ramp) { - LV_PROFILER_END; - return false; - } - - const vg_lite_linear_gradient_parameter_t grad_param = { - .X0 = item->lv.x1, - .Y0 = item->lv.y1, - .X1 = item->lv.x2, - .Y1 = item->lv.y2, - }; - - vg_lite_ext_linear_gradient_t linear_grad; - lv_memzero(&linear_grad, sizeof(linear_grad)); - - LV_PROFILER_BEGIN_TAG("vg_lite_set_linear_grad"); - LV_VG_LITE_CHECK_ERROR( - vg_lite_set_linear_grad( - &linear_grad, - item->lv.stops_count, - color_ramp, - grad_param, - lv_spread_to_vg(item->lv.spread), - 1)); - LV_PROFILER_END_TAG("vg_lite_set_linear_grad"); - - LV_PROFILER_BEGIN_TAG("vg_lite_update_linear_grad"); - vg_lite_error_t err = vg_lite_update_linear_grad(&linear_grad); - LV_PROFILER_END_TAG("vg_lite_update_linear_grad"); - if(err == VG_LITE_SUCCESS) { - item->vg.linear_ext = linear_grad; - } - else { - LV_LOG_ERROR("update grad error(%d): %s", (int)err, lv_vg_lite_error_string(err)); - } - - lv_free(color_ramp); - - LV_PROFILER_END; - return err == VG_LITE_SUCCESS; -} - -static bool radial_grad_create(grad_item_t * item) -{ - LV_PROFILER_BEGIN; - - if(item->lv.stops_count > VLC_MAX_COLOR_RAMP_STOPS) { - LV_LOG_WARN("Gradient stops limited: %d, max: %d", item->lv.stops_count, VLC_MAX_GRADIENT_STOPS); - item->lv.stops_count = VLC_MAX_COLOR_RAMP_STOPS; - } - - vg_lite_color_ramp_t * color_ramp = grad_create_color_ramp(&item->lv); - if(!color_ramp) { - LV_PROFILER_END; - return false; - } - - const vg_lite_radial_gradient_parameter_t grad_param = { - .cx = item->lv.cx, - .cy = item->lv.cy, - .r = item->lv.cr, - .fx = item->lv.cx, - .fy = item->lv.cy, - }; - - vg_lite_radial_gradient_t radial_grad; - lv_memzero(&radial_grad, sizeof(radial_grad)); - - LV_PROFILER_BEGIN_TAG("vg_lite_set_radial_grad"); - LV_VG_LITE_CHECK_ERROR( - vg_lite_set_radial_grad( - &radial_grad, - item->lv.stops_count, - color_ramp, - grad_param, - lv_spread_to_vg(item->lv.spread), - 1)); - LV_PROFILER_END_TAG("vg_lite_set_radial_grad"); - - LV_PROFILER_BEGIN_TAG("vg_lite_update_radial_grad"); - vg_lite_error_t err = vg_lite_update_radial_grad(&radial_grad); - LV_PROFILER_END_TAG("vg_lite_update_radial_grad"); - if(err == VG_LITE_SUCCESS) { - item->vg.radial = radial_grad; - } - else { - LV_LOG_ERROR("update radial grad error(%d): %s", (int)err, lv_vg_lite_error_string(err)); - } - - lv_free(color_ramp); - - LV_PROFILER_END; - return err == VG_LITE_SUCCESS; -} - -static grad_type_t lv_grad_style_to_type(lv_vector_gradient_style_t style) -{ - if(style == LV_VECTOR_GRADIENT_STYLE_LINEAR) { - return vg_lite_query_feature(gcFEATURE_BIT_VG_LINEAR_GRADIENT_EXT) ? GRAD_TYPE_LINEAR_EXT : GRAD_TYPE_LINEAR; - } - - if(style == LV_VECTOR_GRADIENT_STYLE_RADIAL) { - return GRAD_TYPE_RADIAL; - } - - LV_LOG_WARN("unknown gradient style: %d", style); - return GRAD_TYPE_UNKNOWN; -} - -static void grad_point_to_matrix(vg_lite_matrix_t * grad_matrix, float x1, float y1, float x2, float y2) -{ - vg_lite_translate(x1, y1, grad_matrix); - - float angle = atan2f(y2 - y1, x2 - x1) * 180.0f / (float)M_PI; - vg_lite_rotate(angle, grad_matrix); - float length = sqrtf(SQUARE(x2 - x1) + SQUARE(y2 - y1)); - vg_lite_scale(length / 256.0f, 1, grad_matrix); -} - -static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t spread) -{ - switch(spread) { - case LV_VECTOR_GRADIENT_SPREAD_PAD: - return VG_LITE_GRADIENT_SPREAD_PAD; - case LV_VECTOR_GRADIENT_SPREAD_REPEAT: - return VG_LITE_GRADIENT_SPREAD_REPEAT; - case LV_VECTOR_GRADIENT_SPREAD_REFLECT: - return VG_LITE_GRADIENT_SPREAD_REFLECT; - default: - LV_LOG_WARN("unknown spread mode: %d", spread); - break; - } - - return VG_LITE_GRADIENT_SPREAD_FILL; -} - -static bool grad_create_cb(grad_item_t * item, void * user_data) -{ - LV_UNUSED(user_data); - item->type = lv_grad_style_to_type(item->lv.style); - switch(item->type) { - case GRAD_TYPE_LINEAR: - return linear_grad_create(item); - - case GRAD_TYPE_LINEAR_EXT: - return linear_ext_grad_create(item); - - case GRAD_TYPE_RADIAL: - return radial_grad_create(item); - - default: - LV_LOG_ERROR("unknown gradient type: %d", item->type); - break; - } - - return false; -} - -static void grad_free_cb(grad_item_t * item, void * user_data) -{ - LV_UNUSED(user_data); - switch(item->type) { - case GRAD_TYPE_LINEAR: - LV_VG_LITE_CHECK_ERROR(vg_lite_clear_grad(&item->vg.linear)); - break; - - case GRAD_TYPE_LINEAR_EXT: - LV_VG_LITE_CHECK_ERROR(vg_lite_clear_linear_grad(&item->vg.linear_ext)); - break; - - case GRAD_TYPE_RADIAL: - LV_VG_LITE_CHECK_ERROR(vg_lite_clear_radial_grad(&item->vg.radial)); - break; - - default: - LV_LOG_ERROR("unknown gradient type: %d", item->type); - break; - } -} - -static lv_cache_compare_res_t grad_compare_cb(const grad_item_t * lhs, const grad_item_t * rhs) -{ - /* compare type first */ - if(lhs->type != rhs->type) { - return lhs->type > rhs->type ? 1 : -1; - } - - /* compare spread mode */ - if(lhs->lv.spread != rhs->lv.spread) { - return lhs->lv.spread > rhs->lv.spread ? 1 : -1; - } - - /* compare gradient parameters */ - switch(lhs->type) { - case GRAD_TYPE_LINEAR: - /* no extra compare needed */ - break; - - case GRAD_TYPE_LINEAR_EXT: - if(!math_equal(lhs->lv.x1, rhs->lv.x1)) { - return lhs->lv.x1 > rhs->lv.x1 ? 1 : -1; - } - - if(!math_equal(lhs->lv.y1, rhs->lv.y1)) { - return lhs->lv.y1 > rhs->lv.y1 ? 1 : -1; - } - - if(!math_equal(lhs->lv.x2, rhs->lv.x2)) { - return lhs->lv.x2 > rhs->lv.x2 ? 1 : -1; - } - - if(!math_equal(lhs->lv.y2, rhs->lv.y2)) { - return lhs->lv.y2 > rhs->lv.y2 ? 1 : -1; - } - break; - - case GRAD_TYPE_RADIAL: - if(!math_equal(lhs->lv.cx, rhs->lv.cx)) { - return lhs->lv.cx > rhs->lv.cx ? 1 : -1; - } - - if(!math_equal(lhs->lv.cy, rhs->lv.cy)) { - return lhs->lv.cy > rhs->lv.cy ? 1 : -1; - } - - if(!math_equal(lhs->lv.cr, rhs->lv.cr)) { - return lhs->lv.cr > rhs->lv.cr ? 1 : -1; - } - break; - - default: - LV_LOG_ERROR("unknown gradient type: %d", lhs->type); - break; - } - - /* compare stops count and stops */ - if(lhs->lv.stops_count != rhs->lv.stops_count) { - return lhs->lv.stops_count > rhs->lv.stops_count ? 1 : -1; - } - - int cmp_res = lv_memcmp(lhs->lv.stops, rhs->lv.stops, - sizeof(lv_gradient_stop_t) * lhs->lv.stops_count); - if(cmp_res != 0) { - return cmp_res > 0 ? 1 : -1; - } - - return 0; -} - -#endif /*LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_grad.h b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_grad.h deleted file mode 100644 index d8b9d1f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_grad.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - * @file lv_vg_lite_grad.h - * - */ - -#ifndef LV_VG_LITE_GRAD_H -#define LV_VG_LITE_GRAD_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lvgl.h" - -#if LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC - -#include "lv_vg_lite_utils.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_vg_lite_grad_init(struct lv_draw_vg_lite_unit_t * u, uint32_t cache_cnt); - -void lv_vg_lite_grad_deinit(struct lv_draw_vg_lite_unit_t * u); - -bool lv_vg_lite_draw_grad( - struct lv_draw_vg_lite_unit_t * u, - vg_lite_buffer_t * buffer, - vg_lite_path_t * path, - const lv_vector_gradient_t * grad, - const vg_lite_matrix_t * grad_matrix, - const vg_lite_matrix_t * matrix, - vg_lite_fill_t fill, - vg_lite_blend_t blend); - -bool lv_vg_lite_draw_grad_helper( - struct lv_draw_vg_lite_unit_t * u, - vg_lite_buffer_t * buffer, - vg_lite_path_t * path, - const lv_area_t * area, - const lv_grad_dsc_t * grad_dsc, - const vg_lite_matrix_t * matrix, - vg_lite_fill_t fill, - vg_lite_blend_t blend); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_VG_LITE_GRAD_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_math.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_math.c deleted file mode 100644 index 52b4bb9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_math.c +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @file lv_vg_lite_math.h - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_vg_lite_math.h" - -#if LV_USE_DRAW_VG_LITE - -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -float math_fast_inv_sqrtf(float number) -{ - int32_t i; - float x2, y; - const float threehalfs = 1.5f; - - x2 = number * 0.5f; - y = number; - i = *(int32_t *)&y; /* evil floating point bit level hacking */ - i = 0x5f3759df /* floating-point representation of an approximation of {\sqrt {2^{127}}}} see https://en.wikipedia.org/wiki/Fast_inverse_square_root. */ - - (i >> - 1); - y = *(float *)&i; - y = y * (threehalfs - (x2 * y * y)); /* 1st iteration */ - - return y; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_math.h b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_math.h deleted file mode 100644 index 3b4b45d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_math.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @file lv_vg_lite_math.h - * - */ - -#ifndef LV_VG_LITE_MATH_H -#define LV_VG_LITE_MATH_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" - -#if LV_USE_DRAW_VG_LITE - -#include -#include -#include - -/********************* - * DEFINES - *********************/ - -#define MATH_PI 3.14159265358979323846f -#define MATH_HALF_PI 1.57079632679489661923f -#define MATH_TWO_PI 6.28318530717958647692f -#define DEG_TO_RAD 0.017453292519943295769236907684886f -#define RAD_TO_DEG 57.295779513082320876798154814105f - -#define MATH_TANF(x) tanf(x) -#define MATH_SINF(x) sinf(x) -#define MATH_COSF(x) cosf(x) -#define MATH_ASINF(x) asinf(x) -#define MATH_FABSF(x) fabsf(x) -#define MATH_SQRTF(x) sqrtf(x) - -#define MATH_RADIANS(deg) ((deg) * DEG_TO_RAD) -#define MATH_DEGREES(rad) ((rad) * RAD_TO_DEG) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -static inline bool math_zero(float a) -{ - return (MATH_FABSF(a) < FLT_EPSILON); -} - -static inline bool math_equal(float a, float b) -{ - return math_zero(a - b); -} - -float math_fast_inv_sqrtf(float number); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_VG_LITE_MATH_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_path.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_path.c deleted file mode 100644 index 9a9346b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_path.c +++ /dev/null @@ -1,647 +0,0 @@ -/** - * @file lv_vg_lite_path.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_vg_lite_path.h" - -#if LV_USE_DRAW_VG_LITE - -#include "lv_draw_vg_lite_type.h" -#include "lv_vg_lite_math.h" -#include - -/********************* - * DEFINES - *********************/ - -#define PATH_KAPPA 0.552284f - -/* Magic number from https://spencermortensen.com/articles/bezier-circle/ */ -#define PATH_ARC_MAGIC 0.55191502449351f - -#define SIGN(x) (math_zero(x) ? 0 : ((x) > 0 ? 1 : -1)) - -#define VLC_OP_ARG_LEN(OP, LEN) \ - case VLC_OP_##OP: \ - return (LEN) - -/********************** - * TYPEDEFS - **********************/ - -struct lv_vg_lite_path_t { - vg_lite_path_t base; - vg_lite_matrix_t matrix; - size_t mem_size; - uint8_t format_len; - bool has_transform; -}; - -typedef struct { - float min_x; - float min_y; - float max_x; - float max_y; -} lv_vg_lite_path_bounds_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_vg_lite_path_init(struct lv_draw_vg_lite_unit_t * unit) -{ - LV_ASSERT_NULL(unit); - unit->global_path = lv_vg_lite_path_create(VG_LITE_FP32); - unit->path_in_use = false; -} - -void lv_vg_lite_path_deinit(struct lv_draw_vg_lite_unit_t * unit) -{ - LV_ASSERT_NULL(unit); - LV_ASSERT(!unit->path_in_use); - lv_vg_lite_path_destroy(unit->global_path); - unit->global_path = NULL; -} - -lv_vg_lite_path_t * lv_vg_lite_path_create(vg_lite_format_t data_format) -{ - LV_PROFILER_BEGIN; - lv_vg_lite_path_t * path = lv_malloc_zeroed(sizeof(lv_vg_lite_path_t)); - LV_ASSERT_MALLOC(path); - path->format_len = lv_vg_lite_path_format_len(data_format); - LV_ASSERT(vg_lite_init_path( - &path->base, - data_format, - VG_LITE_MEDIUM, - 0, - NULL, - 0, 0, 0, 0) - == VG_LITE_SUCCESS); - LV_PROFILER_END; - return path; -} - -void lv_vg_lite_path_destroy(lv_vg_lite_path_t * path) -{ - LV_PROFILER_BEGIN; - LV_ASSERT_NULL(path); - if(path->base.path != NULL) { - lv_free(path->base.path); - path->base.path = NULL; - - /* clear remaining path data */ - LV_VG_LITE_CHECK_ERROR(vg_lite_clear_path(&path->base)); - } - lv_free(path); - LV_PROFILER_END; -} - -lv_vg_lite_path_t * lv_vg_lite_path_get(struct lv_draw_vg_lite_unit_t * unit, vg_lite_format_t data_format) -{ - LV_ASSERT_NULL(unit); - LV_ASSERT_NULL(unit->global_path); - LV_ASSERT(!unit->path_in_use); - lv_vg_lite_path_reset(unit->global_path, data_format); - unit->path_in_use = true; - return unit->global_path; -} - -void lv_vg_lite_path_drop(struct lv_draw_vg_lite_unit_t * unit, lv_vg_lite_path_t * path) -{ - LV_ASSERT_NULL(unit); - LV_ASSERT_NULL(path); - LV_ASSERT(unit->global_path == path); - LV_ASSERT(unit->path_in_use); - unit->path_in_use = false; -} - -void lv_vg_lite_path_reset(lv_vg_lite_path_t * path, vg_lite_format_t data_format) -{ - LV_ASSERT_NULL(path); - path->base.path_length = 0; - path->base.format = data_format; - path->base.quality = VG_LITE_MEDIUM; - path->base.path_type = VG_LITE_DRAW_ZERO; - path->format_len = lv_vg_lite_path_format_len(data_format); - path->has_transform = false; -} - -vg_lite_path_t * lv_vg_lite_path_get_path(lv_vg_lite_path_t * path) -{ - LV_ASSERT_NULL(path); - return &path->base; -} - -void lv_vg_lite_path_set_bonding_box(lv_vg_lite_path_t * path, - float min_x, float min_y, - float max_x, float max_y) -{ - LV_ASSERT_NULL(path); - path->base.bounding_box[0] = min_x; - path->base.bounding_box[1] = min_y; - path->base.bounding_box[2] = max_x; - path->base.bounding_box[3] = max_y; -} - -void lv_vg_lite_path_set_bonding_box_area(lv_vg_lite_path_t * path, const lv_area_t * area) -{ - LV_ASSERT_NULL(path); - LV_ASSERT_NULL(area); - lv_vg_lite_path_set_bonding_box(path, area->x1, area->y1, area->x2 + 1, area->y2 + 1); -} - -void lv_vg_lite_path_get_bonding_box(lv_vg_lite_path_t * path, - float * min_x, float * min_y, - float * max_x, float * max_y) -{ - LV_ASSERT_NULL(path); - if(min_x) *min_x = path->base.bounding_box[0]; - if(min_y) *min_y = path->base.bounding_box[1]; - if(max_x) *max_x = path->base.bounding_box[2]; - if(max_y) *max_y = path->base.bounding_box[3]; -} - -static void path_bounds_iter_cb(void * user_data, uint8_t op_code, const float * data, uint32_t len) -{ - LV_UNUSED(op_code); - - if(len == 0) { - return; - } - - typedef struct { - float x; - float y; - } point_t; - - const int pt_len = sizeof(point_t) / sizeof(float); - - LV_ASSERT(len % pt_len == 0); - - const point_t * pt = (point_t *)data; - len /= pt_len; - - lv_vg_lite_path_bounds_t * bounds = user_data; - - for(uint32_t i = 0; i < len; i++) { - if(pt[i].x < bounds->min_x) bounds->min_x = pt[i].x; - if(pt[i].y < bounds->min_y) bounds->min_y = pt[i].y; - if(pt[i].x > bounds->max_x) bounds->max_x = pt[i].x; - if(pt[i].y > bounds->max_y) bounds->max_y = pt[i].y; - } -} - -bool lv_vg_lite_path_update_bonding_box(lv_vg_lite_path_t * path) -{ - LV_ASSERT_NULL(path); - - if(!path->format_len) { - return false; - } - - LV_PROFILER_BEGIN; - - lv_vg_lite_path_bounds_t bounds; - - /* init bounds */ - bounds.min_x = FLT_MAX; - bounds.min_y = FLT_MAX; - bounds.max_x = FLT_MIN; - bounds.max_y = FLT_MIN; - - /* calc bounds */ - lv_vg_lite_path_for_each_data(lv_vg_lite_path_get_path(path), path_bounds_iter_cb, &bounds); - - /* set bounds */ - lv_vg_lite_path_set_bonding_box(path, bounds.min_x, bounds.min_y, bounds.max_x, bounds.max_y); - - LV_PROFILER_END; - - return true; -} - -void lv_vg_lite_path_set_transform(lv_vg_lite_path_t * path, const vg_lite_matrix_t * matrix) -{ - LV_ASSERT_NULL(path); - if(matrix) { - path->matrix = *matrix; - } - - path->has_transform = matrix ? true : false; -} - -void lv_vg_lite_path_set_quality(lv_vg_lite_path_t * path, vg_lite_quality_t quality) -{ - LV_ASSERT_NULL(path); - path->base.quality = quality; -} - -static void lv_vg_lite_path_append_data(lv_vg_lite_path_t * path, const void * data, size_t len) -{ - LV_ASSERT_NULL(path); - LV_ASSERT_NULL(data); - - if(path->base.path_length + len > path->mem_size) { - if(path->mem_size == 0) { - path->mem_size = len; - } - else { - path->mem_size *= 2; - } - path->base.path = lv_realloc(path->base.path, path->mem_size); - LV_ASSERT_MALLOC(path->base.path); - } - - lv_memcpy((uint8_t *)path->base.path + path->base.path_length, data, len); - path->base.path_length += len; -} - -static void lv_vg_lite_path_append_op(lv_vg_lite_path_t * path, uint32_t op) -{ - lv_vg_lite_path_append_data(path, &op, path->format_len); -} - -static void lv_vg_lite_path_append_point(lv_vg_lite_path_t * path, float x, float y) -{ - if(path->has_transform) { - LV_VG_LITE_ASSERT_MATRIX(&path->matrix); - /* transform point */ - float ori_x = x; - float ori_y = y; - x = ori_x * path->matrix.m[0][0] + ori_y * path->matrix.m[0][1] + path->matrix.m[0][2]; - y = ori_x * path->matrix.m[1][0] + ori_y * path->matrix.m[1][1] + path->matrix.m[1][2]; - } - - if(path->base.format == VG_LITE_FP32) { - lv_vg_lite_path_append_data(path, &x, sizeof(x)); - lv_vg_lite_path_append_data(path, &y, sizeof(y)); - return; - } - - int32_t ix = (int32_t)(x); - int32_t iy = (int32_t)(y); - lv_vg_lite_path_append_data(path, &ix, path->format_len); - lv_vg_lite_path_append_data(path, &iy, path->format_len); -} - -void lv_vg_lite_path_move_to(lv_vg_lite_path_t * path, - float x, float y) -{ - LV_ASSERT_NULL(path); - lv_vg_lite_path_append_op(path, VLC_OP_MOVE); - lv_vg_lite_path_append_point(path, x, y); -} - -void lv_vg_lite_path_line_to(lv_vg_lite_path_t * path, - float x, float y) -{ - LV_ASSERT_NULL(path); - lv_vg_lite_path_append_op(path, VLC_OP_LINE); - lv_vg_lite_path_append_point(path, x, y); -} - -void lv_vg_lite_path_quad_to(lv_vg_lite_path_t * path, - float cx, float cy, - float x, float y) -{ - LV_ASSERT_NULL(path); - lv_vg_lite_path_append_op(path, VLC_OP_QUAD); - lv_vg_lite_path_append_point(path, cx, cy); - lv_vg_lite_path_append_point(path, x, y); -} - -void lv_vg_lite_path_cubic_to(lv_vg_lite_path_t * path, - float cx1, float cy1, - float cx2, float cy2, - float x, float y) -{ - LV_ASSERT_NULL(path); - lv_vg_lite_path_append_op(path, VLC_OP_CUBIC); - lv_vg_lite_path_append_point(path, cx1, cy1); - lv_vg_lite_path_append_point(path, cx2, cy2); - lv_vg_lite_path_append_point(path, x, y); -} - -void lv_vg_lite_path_close(lv_vg_lite_path_t * path) -{ - LV_ASSERT_NULL(path); - lv_vg_lite_path_append_op(path, VLC_OP_CLOSE); -} - -void lv_vg_lite_path_end(lv_vg_lite_path_t * path) -{ - LV_ASSERT_NULL(path); - lv_vg_lite_path_append_op(path, VLC_OP_END); - path->base.add_end = 1; -} - -void lv_vg_lite_path_append_rect( - lv_vg_lite_path_t * path, - float x, float y, - float w, float h, - float r) -{ - LV_PROFILER_BEGIN; - const float half_w = w / 2.0f; - const float half_h = h / 2.0f; - - /*clamping cornerRadius by minimum size*/ - const float r_max = LV_MIN(half_w, half_h); - if(r > r_max) - r = r_max; - - /*rectangle*/ - if(r <= 0) { - lv_vg_lite_path_move_to(path, x, y); - lv_vg_lite_path_line_to(path, x + w, y); - lv_vg_lite_path_line_to(path, x + w, y + h); - lv_vg_lite_path_line_to(path, x, y + h); - lv_vg_lite_path_close(path); - LV_PROFILER_END; - return; - } - - /*circle*/ - if(math_equal(r, half_w) && math_equal(r, half_h)) { - lv_vg_lite_path_append_circle(path, x + half_w, y + half_h, r, r); - LV_PROFILER_END; - return; - } - - /* Get the control point offset for rounded cases */ - const float offset = r * PATH_ARC_MAGIC; - - /* Rounded rectangle case */ - /* Starting point */ - lv_vg_lite_path_move_to(path, x + r, y); - - /* Top side */ - lv_vg_lite_path_line_to(path, x + w - r, y); - - /* Top-right corner */ - lv_vg_lite_path_cubic_to(path, x + w - r + offset, y, x + w, y + r - offset, x + w, y + r); - - /* Right side */ - lv_vg_lite_path_line_to(path, x + w, y + h - r); - - /* Bottom-right corner*/ - lv_vg_lite_path_cubic_to(path, x + w, y + h - r + offset, x + w - r + offset, y + h, x + w - r, y + h); - - /* Bottom side */ - lv_vg_lite_path_line_to(path, x + r, y + h); - - /* Bottom-left corner */ - lv_vg_lite_path_cubic_to(path, x + r - offset, y + h, x, y + h - r + offset, x, y + h - r); - - /* Left side*/ - lv_vg_lite_path_line_to(path, x, y + r); - - /* Top-left corner */ - lv_vg_lite_path_cubic_to(path, x, y + r - offset, x + r - offset, y, x + r, y); - - /* Ending point */ - lv_vg_lite_path_close(path); - LV_PROFILER_END; -} - -void lv_vg_lite_path_append_circle( - lv_vg_lite_path_t * path, - float cx, float cy, - float rx, float ry) -{ - LV_PROFILER_BEGIN; - /* https://learn.microsoft.com/zh-cn/xamarin/xamarin-forms/user-interface/graphics/skiasharp/curves/beziers */ - float rx_kappa = rx * PATH_KAPPA; - float ry_kappa = ry * PATH_KAPPA; - - lv_vg_lite_path_move_to(path, cx, cy - ry); - lv_vg_lite_path_cubic_to(path, cx + rx_kappa, cy - ry, cx + rx, cy - ry_kappa, cx + rx, cy); - lv_vg_lite_path_cubic_to(path, cx + rx, cy + ry_kappa, cx + rx_kappa, cy + ry, cx, cy + ry); - lv_vg_lite_path_cubic_to(path, cx - rx_kappa, cy + ry, cx - rx, cy + ry_kappa, cx - rx, cy); - lv_vg_lite_path_cubic_to(path, cx - rx, cy - ry_kappa, cx - rx_kappa, cy - ry, cx, cy - ry); - lv_vg_lite_path_close(path); - LV_PROFILER_END; -} - -void lv_vg_lite_path_append_arc_right_angle(lv_vg_lite_path_t * path, - float start_x, float start_y, - float center_x, float center_y, - float end_x, float end_y) -{ - LV_PROFILER_BEGIN; - float dx1 = center_x - start_x; - float dy1 = center_y - start_y; - float dx2 = end_x - center_x; - float dy2 = end_y - center_y; - - float c = SIGN(dx1 * dy2 - dx2 * dy1) * PATH_ARC_MAGIC; - - lv_vg_lite_path_cubic_to(path, - start_x - c * dy1, start_y + c * dx1, - end_x - c * dy2, end_y + c * dx2, - end_x, end_y); - LV_PROFILER_END; -} - -void lv_vg_lite_path_append_arc(lv_vg_lite_path_t * path, - float cx, float cy, - float radius, - float start_angle, - float sweep, - bool pie) -{ - LV_PROFILER_BEGIN; - /* just circle */ - if(sweep >= 360.0f || sweep <= -360.0f) { - lv_vg_lite_path_append_circle(path, cx, cy, radius, radius); - LV_PROFILER_END; - return; - } - - start_angle = MATH_RADIANS(start_angle); - sweep = MATH_RADIANS(sweep); - - int n_curves = (int)ceil(MATH_FABSF(sweep / MATH_HALF_PI)); - float sweep_sign = sweep < 0 ? -1.f : 1.f; - float fract = fmodf(sweep, MATH_HALF_PI); - fract = (math_zero(fract)) ? MATH_HALF_PI * sweep_sign : fract; - - /* Start from here */ - float start_x = radius * MATH_COSF(start_angle); - float start_y = radius * MATH_SINF(start_angle); - - if(pie) { - lv_vg_lite_path_move_to(path, cx, cy); - lv_vg_lite_path_line_to(path, start_x + cx, start_y + cy); - } - - for(int i = 0; i < n_curves; ++i) { - float end_angle = start_angle + ((i != n_curves - 1) ? MATH_HALF_PI * sweep_sign : fract); - float end_x = radius * MATH_COSF(end_angle); - float end_y = radius * MATH_SINF(end_angle); - - /* variables needed to calculate bezier control points */ - - /** get bezier control points using article: - * (http://itc.ktu.lt/index.php/ITC/article/view/11812/6479) - */ - float ax = start_x; - float ay = start_y; - float bx = end_x; - float by = end_y; - float q1 = ax * ax + ay * ay; - float q2 = ax * bx + ay * by + q1; - float k2 = (4.0f / 3.0f) * ((MATH_SQRTF(2 * q1 * q2) - q2) / (ax * by - ay * bx)); - - /* Next start point is the current end point */ - start_x = end_x; - start_y = end_y; - - end_x += cx; - end_y += cy; - - float ctrl1_x = ax - k2 * ay + cx; - float ctrl1_y = ay + k2 * ax + cy; - float ctrl2_x = bx + k2 * by + cx; - float ctrl2_y = by - k2 * bx + cy; - - lv_vg_lite_path_cubic_to(path, ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, end_x, end_y); - start_angle = end_angle; - } - - if(pie) { - lv_vg_lite_path_close(path); - } - - LV_PROFILER_END; -} - -uint8_t lv_vg_lite_vlc_op_arg_len(uint8_t vlc_op) -{ - switch(vlc_op) { - VLC_OP_ARG_LEN(END, 0); - VLC_OP_ARG_LEN(CLOSE, 0); - VLC_OP_ARG_LEN(MOVE, 2); - VLC_OP_ARG_LEN(MOVE_REL, 2); - VLC_OP_ARG_LEN(LINE, 2); - VLC_OP_ARG_LEN(LINE_REL, 2); - VLC_OP_ARG_LEN(QUAD, 4); - VLC_OP_ARG_LEN(QUAD_REL, 4); - VLC_OP_ARG_LEN(CUBIC, 6); - VLC_OP_ARG_LEN(CUBIC_REL, 6); - VLC_OP_ARG_LEN(SCCWARC, 5); - VLC_OP_ARG_LEN(SCCWARC_REL, 5); - VLC_OP_ARG_LEN(SCWARC, 5); - VLC_OP_ARG_LEN(SCWARC_REL, 5); - VLC_OP_ARG_LEN(LCCWARC, 5); - VLC_OP_ARG_LEN(LCCWARC_REL, 5); - VLC_OP_ARG_LEN(LCWARC, 5); - VLC_OP_ARG_LEN(LCWARC_REL, 5); - default: - break; - } - - LV_LOG_ERROR("UNKNOW_VLC_OP: 0x%x", vlc_op); - LV_ASSERT(false); - return 0; -} - -uint8_t lv_vg_lite_path_format_len(vg_lite_format_t format) -{ - switch(format) { - case VG_LITE_S8: - return 1; - case VG_LITE_S16: - return 2; - case VG_LITE_S32: - return 4; - case VG_LITE_FP32: - return 4; - default: - break; - } - - LV_LOG_ERROR("UNKNOW_FORMAT: %d", format); - LV_ASSERT(false); - return 0; -} - -void lv_vg_lite_path_for_each_data(const vg_lite_path_t * path, lv_vg_lite_path_iter_cb_t cb, void * user_data) -{ - LV_ASSERT_NULL(path); - LV_ASSERT_NULL(cb); - - uint8_t fmt_len = lv_vg_lite_path_format_len(path->format); - uint8_t * cur = path->path; - uint8_t * end = cur + path->path_length; - float tmp_data[8]; - - while(cur < end) { - /* get op code */ - uint8_t op_code = VLC_GET_OP_CODE(cur); - - /* get arguments length */ - uint8_t arg_len = lv_vg_lite_vlc_op_arg_len(op_code); - - /* skip op code */ - cur += fmt_len; - - /* print arguments */ - for(uint8_t i = 0; i < arg_len; i++) { - switch(path->format) { - case VG_LITE_S8: - tmp_data[i] = *((int8_t *)cur); - break; - case VG_LITE_S16: - tmp_data[i] = *((int16_t *)cur); - break; - case VG_LITE_S32: - tmp_data[i] = *((int32_t *)cur); - break; - case VG_LITE_FP32: - tmp_data[i] = *((float *)cur); - break; - default: - LV_LOG_ERROR("UNKNOW_FORMAT(%d)", path->format); - LV_ASSERT(false); - break; - } - - cur += fmt_len; - } - - cb(user_data, op_code, tmp_data, arg_len); - } -} - -void lv_vg_lite_path_append_path(lv_vg_lite_path_t * dest, const lv_vg_lite_path_t * src) -{ - LV_ASSERT_NULL(dest); - LV_ASSERT_NULL(src); - - LV_ASSERT(dest->base.format == dest->base.format); - lv_vg_lite_path_append_data(dest, src->base.path, src->base.path_length); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_path.h b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_path.h deleted file mode 100644 index b1ef3f8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_path.h +++ /dev/null @@ -1,128 +0,0 @@ -/** - * @file lv_vg_lite_path.h - * - */ - -#ifndef LV_VG_LITE_PATH_H -#define LV_VG_LITE_PATH_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_vg_lite_utils.h" - -#if LV_USE_DRAW_VG_LITE - -/********************* - * DEFINES - *********************/ - -typedef struct lv_vg_lite_path_t lv_vg_lite_path_t; -typedef struct lv_draw_vg_lite_unit_t lv_draw_vg_lite_unit_t; - -typedef void (*lv_vg_lite_path_iter_cb_t)(void * user_data, uint8_t op_code, const float * data, uint32_t len); - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_vg_lite_path_init(lv_draw_vg_lite_unit_t * unit); - -void lv_vg_lite_path_deinit(lv_draw_vg_lite_unit_t * unit); - -lv_vg_lite_path_t * lv_vg_lite_path_create(vg_lite_format_t data_format); - -void lv_vg_lite_path_destroy(lv_vg_lite_path_t * path); - -lv_vg_lite_path_t * lv_vg_lite_path_get(lv_draw_vg_lite_unit_t * unit, vg_lite_format_t data_format); - -void lv_vg_lite_path_drop(lv_draw_vg_lite_unit_t * unit, lv_vg_lite_path_t * path); - -void lv_vg_lite_path_reset(lv_vg_lite_path_t * path, vg_lite_format_t data_format); - -void lv_vg_lite_path_set_bonding_box_area(lv_vg_lite_path_t * path, const lv_area_t * area); - -void lv_vg_lite_path_set_bonding_box(lv_vg_lite_path_t * path, - float min_x, float min_y, - float max_x, float max_y); - -void lv_vg_lite_path_get_bonding_box(lv_vg_lite_path_t * path, - float * min_x, float * min_y, - float * max_x, float * max_y); - -bool lv_vg_lite_path_update_bonding_box(lv_vg_lite_path_t * path); - -void lv_vg_lite_path_set_transform(lv_vg_lite_path_t * path, const vg_lite_matrix_t * matrix); - -void lv_vg_lite_path_set_quality(lv_vg_lite_path_t * path, vg_lite_quality_t quality); - -vg_lite_path_t * lv_vg_lite_path_get_path(lv_vg_lite_path_t * path); - -void lv_vg_lite_path_move_to(lv_vg_lite_path_t * path, - float x, float y); - -void lv_vg_lite_path_line_to(lv_vg_lite_path_t * path, - float x, float y); - -void lv_vg_lite_path_quad_to(lv_vg_lite_path_t * path, - float cx, float cy, - float x, float y); - -void lv_vg_lite_path_cubic_to(lv_vg_lite_path_t * path, - float cx1, float cy1, - float cx2, float cy2, - float x, float y); - -void lv_vg_lite_path_close(lv_vg_lite_path_t * path); - -void lv_vg_lite_path_end(lv_vg_lite_path_t * path); - -void lv_vg_lite_path_append_rect(lv_vg_lite_path_t * path, - float x, float y, - float w, float h, - float r); - -void lv_vg_lite_path_append_circle(lv_vg_lite_path_t * path, - float cx, float cy, - float rx, float ry); - -void lv_vg_lite_path_append_arc_right_angle(lv_vg_lite_path_t * path, - float start_x, float start_y, - float center_x, float center_y, - float end_x, float end_y); - -void lv_vg_lite_path_append_arc(lv_vg_lite_path_t * path, - float cx, float cy, - float radius, - float start_angle, - float sweep, - bool pie); - -void lv_vg_lite_path_append_path(lv_vg_lite_path_t * dest, const lv_vg_lite_path_t * src); - -uint8_t lv_vg_lite_vlc_op_arg_len(uint8_t vlc_op); - -uint8_t lv_vg_lite_path_format_len(vg_lite_format_t format); - -void lv_vg_lite_path_for_each_data(const vg_lite_path_t * path, lv_vg_lite_path_iter_cb_t cb, void * user_data); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_VG_LITE_PATH_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_pending.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_pending.c deleted file mode 100644 index b8429f0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_pending.c +++ /dev/null @@ -1,99 +0,0 @@ -/** - * @file lv_vg_lite_pending.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_vg_lite_pending.h" - -#if LV_USE_DRAW_VG_LITE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_vg_lite_pending_t { - lv_array_t objs; - lv_vg_lite_pending_free_cb_t free_cb; - void * user_data; -}; - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_vg_lite_pending_t * lv_vg_lite_pending_create(size_t obj_size, uint32_t capacity_default) -{ - lv_vg_lite_pending_t * pending = lv_malloc_zeroed(sizeof(lv_vg_lite_pending_t)); - LV_ASSERT_MALLOC(pending); - lv_array_init(&pending->objs, capacity_default, obj_size); - return pending; -} - -void lv_vg_lite_pending_destroy(lv_vg_lite_pending_t * pending) -{ - LV_ASSERT_NULL(pending); - lv_vg_lite_pending_remove_all(pending); - lv_array_deinit(&pending->objs); - lv_memzero(pending, sizeof(lv_vg_lite_pending_t)); - lv_free(pending); -} - -void lv_vg_lite_pending_set_free_cb(lv_vg_lite_pending_t * pending, lv_vg_lite_pending_free_cb_t free_cb, - void * user_data) -{ - LV_ASSERT_NULL(pending); - LV_ASSERT_NULL(free_cb); - pending->free_cb = free_cb; - pending->user_data = user_data; -} - -void lv_vg_lite_pending_add(lv_vg_lite_pending_t * pending, void * obj) -{ - LV_ASSERT_NULL(pending); - LV_ASSERT_NULL(obj); - lv_array_push_back(&pending->objs, obj); -} - -void lv_vg_lite_pending_remove_all(lv_vg_lite_pending_t * pending) -{ - LV_ASSERT_NULL(pending); - LV_ASSERT_NULL(pending->free_cb); - - uint32_t size = lv_array_size(&pending->objs); - if(size == 0) { - return; - } - - /* remove all the pending objects */ - for(uint32_t i = 0; i < size; i++) { - pending->free_cb(lv_array_at(&pending->objs, i), pending->user_data); - } - - lv_array_clear(&pending->objs); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_pending.h b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_pending.h deleted file mode 100644 index bf439b7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_pending.h +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @file lv_vg_lite_pending.h - * - */ - -#ifndef LV_VG_LITE_PENDING_H -#define LV_VG_LITE_PENDING_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lvgl.h" - -#if LV_USE_DRAW_VG_LITE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct lv_vg_lite_pending_t lv_vg_lite_pending_t; - -typedef void (*lv_vg_lite_pending_free_cb_t)(void * obj, void * user_data); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a pending list - * @param obj_size the size of the objects in the list - * @param capacity_default the default capacity of the list - * @return a pointer to the pending list - */ -lv_vg_lite_pending_t * lv_vg_lite_pending_create(size_t obj_size, uint32_t capacity_default); - -/** - * Destroy a pending list - * @param pending pointer to the pending list - */ -void lv_vg_lite_pending_destroy(lv_vg_lite_pending_t * pending); - -/** - * Set a free callback for the pending list - * @param pending pointer to the pending list - * @param free_cb the free callback - * @param user_data user data to pass to the free callback - */ -void lv_vg_lite_pending_set_free_cb(lv_vg_lite_pending_t * pending, lv_vg_lite_pending_free_cb_t free_cb, - void * user_data); - -/** - * Add an object to the pending list - * @param pending pointer to the pending list - * @param obj pointer to the object to add - */ -void lv_vg_lite_pending_add(lv_vg_lite_pending_t * pending, void * obj); - -/** - * Remove all objects from the pending list - * @param pending pointer to the pending list - */ -void lv_vg_lite_pending_remove_all(lv_vg_lite_pending_t * pending); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_VG_LITE_PENDING_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_stroke.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_stroke.c deleted file mode 100644 index 1b8a202..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_stroke.c +++ /dev/null @@ -1,310 +0,0 @@ -/** - * @file lv_vg_lite_stroke.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_vg_lite_stroke.h" - -#if LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC - -#include "lv_vg_lite_path.h" -#include "lv_draw_vg_lite_type.h" -#include "lv_vg_lite_math.h" -#include "../lv_draw_vector_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - /* stroke path */ - lv_vg_lite_path_t * path; - - /* stroke parameters */ - float width; - lv_vector_stroke_cap_t cap; - lv_vector_stroke_join_t join; - uint16_t miter_limit; - lv_array_t dash_pattern; -} stroke_item_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static bool stroke_create_cb(stroke_item_t * item, void * user_data); -static void stroke_free_cb(stroke_item_t * item, void * user_data); -static lv_cache_compare_res_t stroke_compare_cb(const stroke_item_t * lhs, const stroke_item_t * rhs); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_vg_lite_stroke_init(struct lv_draw_vg_lite_unit_t * unit, uint32_t cache_cnt) -{ - LV_ASSERT_NULL(unit); - - const lv_cache_ops_t ops = { - .compare_cb = (lv_cache_compare_cb_t)stroke_compare_cb, - .create_cb = (lv_cache_create_cb_t)stroke_create_cb, - .free_cb = (lv_cache_free_cb_t)stroke_free_cb, - }; - - unit->stroke_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(stroke_item_t), cache_cnt, ops); - lv_cache_set_name(unit->stroke_cache, "VG_STROKE"); -} - -void lv_vg_lite_stroke_deinit(struct lv_draw_vg_lite_unit_t * unit) -{ - LV_ASSERT_NULL(unit); - LV_ASSERT_NULL(unit->stroke_cache); - lv_cache_destroy(unit->stroke_cache, NULL); - unit->stroke_cache = NULL; -} - -static vg_lite_cap_style_t lv_stroke_cap_to_vg(lv_vector_stroke_cap_t cap) -{ - switch(cap) { - case LV_VECTOR_STROKE_CAP_SQUARE: - return VG_LITE_CAP_SQUARE; - case LV_VECTOR_STROKE_CAP_ROUND: - return VG_LITE_CAP_ROUND; - case LV_VECTOR_STROKE_CAP_BUTT: - return VG_LITE_CAP_BUTT; - default: - return VG_LITE_CAP_SQUARE; - } -} - -static vg_lite_join_style_t lv_stroke_join_to_vg(lv_vector_stroke_join_t join) -{ - switch(join) { - case LV_VECTOR_STROKE_JOIN_BEVEL: - return VG_LITE_JOIN_BEVEL; - case LV_VECTOR_STROKE_JOIN_ROUND: - return VG_LITE_JOIN_ROUND; - case LV_VECTOR_STROKE_JOIN_MITER: - return VG_LITE_JOIN_MITER; - default: - return VG_LITE_JOIN_BEVEL; - } -} - -lv_cache_entry_t * lv_vg_lite_stroke_get(struct lv_draw_vg_lite_unit_t * unit, - struct lv_vg_lite_path_t * path, - const lv_vector_stroke_dsc_t * dsc) -{ - LV_ASSERT_NULL(unit); - LV_ASSERT_NULL(path); - LV_ASSERT_NULL(dsc); - - vg_lite_path_t * vg_path = lv_vg_lite_path_get_path(path); - - if(vg_path->format != VG_LITE_FP32) { - LV_LOG_ERROR("only support VG_LITE_FP32 format"); - return NULL; - } - - /* prepare search key */ - stroke_item_t search_key; - lv_memzero(&search_key, sizeof(search_key)); - search_key.cap = dsc->cap; - search_key.join = dsc->join; - search_key.width = dsc->width; - search_key.miter_limit = dsc->miter_limit; - - /* A one-time read-only array that only copies the pointer but not the content */ - search_key.dash_pattern = dsc->dash_pattern; - search_key.path = path; - - lv_cache_entry_t * cache_node_entry = lv_cache_acquire(unit->stroke_cache, &search_key, &search_key); - if(cache_node_entry) { - return cache_node_entry; - } - - cache_node_entry = lv_cache_acquire_or_create(unit->stroke_cache, &search_key, &search_key); - if(cache_node_entry == NULL) { - LV_LOG_ERROR("stroke cache creating failed"); - return NULL; - } - - return cache_node_entry; -} - -struct lv_vg_lite_path_t * lv_vg_lite_stroke_get_path(lv_cache_entry_t * cache_entry) -{ - LV_ASSERT_NULL(cache_entry); - - stroke_item_t * stroke_item = lv_cache_entry_get_data(cache_entry); - LV_ASSERT_NULL(stroke_item); - return stroke_item->path; -} - -void lv_vg_lite_stroke_drop(struct lv_draw_vg_lite_unit_t * unit, - lv_cache_entry_t * cache_entry) -{ - LV_ASSERT_NULL(unit); - LV_ASSERT_NULL(cache_entry); - lv_cache_release(unit->stroke_cache, cache_entry, NULL); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static bool stroke_create_cb(stroke_item_t * item, void * user_data) -{ - LV_ASSERT_NULL(item); - - stroke_item_t * src = user_data; - LV_ASSERT_NULL(src); - - lv_memzero(item, sizeof(stroke_item_t)); - - /* copy path */ - item->path = lv_vg_lite_path_create(VG_LITE_FP32); - lv_vg_lite_path_append_path(item->path, src->path); - - /* copy parameters */ - item->cap = src->cap; - item->join = src->join; - item->width = src->width; - item->miter_limit = src->miter_limit; - - /* copy dash pattern */ - uint32_t size = lv_array_size(&src->dash_pattern); - if(size) { - lv_array_init(&item->dash_pattern, size, sizeof(float)); - lv_array_copy(&item->dash_pattern, &src->dash_pattern); - } - - /* update parameters */ - vg_lite_path_t * vg_path = lv_vg_lite_path_get_path(item->path); - LV_VG_LITE_CHECK_ERROR(vg_lite_set_path_type(vg_path, VG_LITE_DRAW_STROKE_PATH)); - - vg_lite_error_t error = vg_lite_set_stroke( - vg_path, - lv_stroke_cap_to_vg(item->cap), - lv_stroke_join_to_vg(item->join), - item->width, - item->miter_limit, - lv_array_front(&item->dash_pattern), - size, - item->width / 2, - 0); - - if(error != VG_LITE_SUCCESS) { - LV_LOG_ERROR("vg_lite_set_stroke failed: %d(%s)", (int)error, lv_vg_lite_error_string(error)); - stroke_free_cb(item, NULL); - return false; - } - - const vg_lite_pointer * ori_path = vg_path->path; - const vg_lite_uint32_t ori_path_length = vg_path->path_length; - - LV_PROFILER_BEGIN_TAG("vg_lite_update_stroke"); - error = vg_lite_update_stroke(vg_path); - LV_PROFILER_END_TAG("vg_lite_update_stroke"); - - /* check if path is changed */ - LV_ASSERT_MSG(vg_path->path_length == ori_path_length, "vg_path->path_length should not change"); - LV_ASSERT_MSG(vg_path->path == ori_path, "vg_path->path should not change"); - - if(error != VG_LITE_SUCCESS) { - LV_LOG_ERROR("vg_lite_update_stroke failed: %d(%s)", (int)error, lv_vg_lite_error_string(error)); - stroke_free_cb(item, NULL); - return false; - } - - return true; -} - -static void stroke_free_cb(stroke_item_t * item, void * user_data) -{ - LV_UNUSED(user_data); - LV_ASSERT_NULL(item); - - lv_array_deinit(&item->dash_pattern); - lv_vg_lite_path_destroy(item->path); - lv_memzero(item, sizeof(stroke_item_t)); -} - -static lv_cache_compare_res_t path_compare(const vg_lite_path_t * lhs, const vg_lite_path_t * rhs) -{ - LV_VG_LITE_ASSERT_PATH(lhs); - LV_VG_LITE_ASSERT_PATH(rhs); - - LV_ASSERT(lhs->format == VG_LITE_FP32); - LV_ASSERT(rhs->format == VG_LITE_FP32); - - if(lhs->path_length != rhs->path_length) { - return lhs->path_length > rhs->path_length ? 1 : -1; - } - - int cmp_res = lv_memcmp(lhs->path, rhs->path, lhs->path_length); - if(cmp_res != 0) { - return cmp_res > 0 ? 1 : -1; - } - - return 0; -} - -static lv_cache_compare_res_t stroke_compare_cb(const stroke_item_t * lhs, const stroke_item_t * rhs) -{ - if(lhs->width != lhs->width) { - return lhs->width > lhs->width ? 1 : -1; - } - - if(lhs->cap != rhs->cap) { - return lhs->cap > rhs->cap ? 1 : -1; - } - - if(lhs->join != rhs->join) { - return lhs->join > rhs->join ? 1 : -1; - } - - if(lhs->miter_limit != rhs->miter_limit) { - return lhs->miter_limit > rhs->miter_limit ? 1 : -1; - } - - uint32_t lhs_dash_pattern_size = lv_array_size(&lhs->dash_pattern); - uint32_t rhs_dash_pattern_size = lv_array_size(&rhs->dash_pattern); - - if(lhs_dash_pattern_size != rhs_dash_pattern_size) { - return lhs_dash_pattern_size > rhs_dash_pattern_size ? 1 : -1; - } - - if(lhs_dash_pattern_size > 0 && rhs_dash_pattern_size > 0) { - LV_ASSERT(lhs->dash_pattern.element_size == sizeof(float)); - LV_ASSERT(rhs->dash_pattern.element_size == sizeof(float)); - - const float * lhs_dash_pattern = lv_array_front(&lhs->dash_pattern); - const float * rhs_dash_pattern = lv_array_front(&rhs->dash_pattern); - - /* compare dash pattern */ - int cmp_res = lv_memcmp(lhs_dash_pattern, rhs_dash_pattern, lhs_dash_pattern_size * sizeof(float)); - if(cmp_res != 0) { - return cmp_res > 0 ? 1 : -1; - } - } - - return path_compare(lv_vg_lite_path_get_path(lhs->path), lv_vg_lite_path_get_path(rhs->path)); -} - -#endif /*LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_stroke.h b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_stroke.h deleted file mode 100644 index 4a0602d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_stroke.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @file lv_vg_lite_stroke.h - * - */ - -#ifndef LV_VG_LITE_STROKE_H -#define LV_VG_LITE_STROKE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_vg_lite_utils.h" - -#if LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_vg_lite_path_t; - -struct lv_draw_vg_lite_unit_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the stroke module - * @param unit pointer to the unit - */ -void lv_vg_lite_stroke_init(struct lv_draw_vg_lite_unit_t * unit, uint32_t cache_cnt); - -/** - * Deinitialize the stroke module - * @param unit pointer to the unit - */ -void lv_vg_lite_stroke_deinit(struct lv_draw_vg_lite_unit_t * unit); - -/** - * Get the stroke cache entry - * @param unit pointer to the unit - * @param path pointer to the path - * @param dsc pointer to the stroke descriptor - * @return pointer to the stroke cache entry - */ -lv_cache_entry_t * lv_vg_lite_stroke_get(struct lv_draw_vg_lite_unit_t * unit, - struct lv_vg_lite_path_t * path, - const lv_vector_stroke_dsc_t * dsc); - -/** - * Get the path of a stroke - * @param cache_entry pointer to the stroke cache entry - * @return pointer to the path - */ -struct lv_vg_lite_path_t * lv_vg_lite_stroke_get_path(lv_cache_entry_t * cache_entry); - -/** - * Drop the stroke cache entry - * @param unit pointer to the unit - * @param stroke pointer to the stroke - */ -void lv_vg_lite_stroke_drop(struct lv_draw_vg_lite_unit_t * unit, lv_cache_entry_t * cache_entry); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_VG_LITE_STROKE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_utils.c b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_utils.c deleted file mode 100644 index 116cbde..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_utils.c +++ /dev/null @@ -1,1217 +0,0 @@ -/** - * @file vg_lite_utils.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../lv_image_decoder_private.h" -#include "lv_vg_lite_utils.h" - -#if LV_USE_DRAW_VG_LITE - -#include "lv_vg_lite_decoder.h" -#include "lv_vg_lite_path.h" -#include "lv_vg_lite_pending.h" -#include "lv_vg_lite_grad.h" -#include "lv_draw_vg_lite_type.h" -#include -#include - -/********************* - * DEFINES - *********************/ - -#define ENUM_TO_STRING(e) \ - case (e): \ - return #e - -#define VG_LITE_ENUM_TO_STRING(e) \ - case (VG_LITE_##e): \ - return #e - -#define VLC_OP_ENUM_TO_STRING(e) \ - case (VLC_OP_##e): \ - return #e - -#define FEATURE_ENUM_TO_STRING(e) \ - case (gcFEATURE_BIT_VG_##e): \ - return #e - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void image_dsc_free_cb(void * dsc, void * user_data); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_vg_lite_dump_info(void) -{ - char name[64]; - vg_lite_uint32_t chip_id; - vg_lite_uint32_t chip_rev; - vg_lite_uint32_t cid; - vg_lite_get_product_info(name, &chip_id, &chip_rev); - vg_lite_get_register(0x30, &cid); - LV_LOG_USER("Product Info: %s" - " | Chip ID: 0x%" LV_PRIx32 - " | Revision: 0x%" LV_PRIx32 - " | CID: 0x%" LV_PRIx32, - name, (uint32_t)chip_id, (uint32_t)chip_rev, (uint32_t)cid); - - vg_lite_info_t info; - vg_lite_get_info(&info); - LV_LOG_USER("VGLite API version: 0x%" LV_PRIx32, (uint32_t)info.api_version); - LV_LOG_USER("VGLite API header version: 0x%" LV_PRIx32, (uint32_t)info.header_version); - LV_LOG_USER("VGLite release version: 0x%" LV_PRIx32, (uint32_t)info.release_version); - - for(int feature = 0; feature < gcFEATURE_COUNT; feature++) { - vg_lite_uint32_t ret = vg_lite_query_feature((vg_lite_feature_t)feature); - LV_UNUSED(ret); - LV_LOG_USER("Feature-%d: %s\t - %s", - feature, lv_vg_lite_feature_string((vg_lite_feature_t)feature), - ret ? "YES" : "NO"); - } - - vg_lite_uint32_t mem_avail = 0; - vg_lite_get_mem_size(&mem_avail); - LV_LOG_USER("Memory Available: %" LV_PRId32 " Bytes", (uint32_t)mem_avail); -} - -const char * lv_vg_lite_error_string(vg_lite_error_t error) -{ - switch(error) { - VG_LITE_ENUM_TO_STRING(SUCCESS); - VG_LITE_ENUM_TO_STRING(INVALID_ARGUMENT); - VG_LITE_ENUM_TO_STRING(OUT_OF_MEMORY); - VG_LITE_ENUM_TO_STRING(NO_CONTEXT); - VG_LITE_ENUM_TO_STRING(TIMEOUT); - VG_LITE_ENUM_TO_STRING(OUT_OF_RESOURCES); - VG_LITE_ENUM_TO_STRING(GENERIC_IO); - VG_LITE_ENUM_TO_STRING(NOT_SUPPORT); - VG_LITE_ENUM_TO_STRING(ALREADY_EXISTS); - VG_LITE_ENUM_TO_STRING(NOT_ALIGNED); - VG_LITE_ENUM_TO_STRING(FLEXA_TIME_OUT); - VG_LITE_ENUM_TO_STRING(FLEXA_HANDSHAKE_FAIL); - default: - break; - } - return "UNKNOW_ERROR"; -} - -const char * lv_vg_lite_feature_string(vg_lite_feature_t feature) -{ - switch(feature) { - FEATURE_ENUM_TO_STRING(IM_INDEX_FORMAT); - FEATURE_ENUM_TO_STRING(SCISSOR); - FEATURE_ENUM_TO_STRING(BORDER_CULLING); - FEATURE_ENUM_TO_STRING(RGBA2_FORMAT); - FEATURE_ENUM_TO_STRING(QUALITY_8X); - FEATURE_ENUM_TO_STRING(IM_FASTCLAER); - FEATURE_ENUM_TO_STRING(RADIAL_GRADIENT); - FEATURE_ENUM_TO_STRING(GLOBAL_ALPHA); - FEATURE_ENUM_TO_STRING(RGBA8_ETC2_EAC); - FEATURE_ENUM_TO_STRING(COLOR_KEY); - FEATURE_ENUM_TO_STRING(DOUBLE_IMAGE); - FEATURE_ENUM_TO_STRING(YUV_OUTPUT); - FEATURE_ENUM_TO_STRING(FLEXA); - FEATURE_ENUM_TO_STRING(24BIT); - FEATURE_ENUM_TO_STRING(DITHER); - FEATURE_ENUM_TO_STRING(USE_DST); - FEATURE_ENUM_TO_STRING(PE_CLEAR); - FEATURE_ENUM_TO_STRING(IM_INPUT); - FEATURE_ENUM_TO_STRING(DEC_COMPRESS); - FEATURE_ENUM_TO_STRING(LINEAR_GRADIENT_EXT); - FEATURE_ENUM_TO_STRING(MASK); - FEATURE_ENUM_TO_STRING(MIRROR); - FEATURE_ENUM_TO_STRING(GAMMA); - FEATURE_ENUM_TO_STRING(NEW_BLEND_MODE); - FEATURE_ENUM_TO_STRING(STENCIL); - FEATURE_ENUM_TO_STRING(SRC_PREMULTIPLIED); /*! Valid only if FEATURE_ENUM_TO_STRING(HW_PREMULTIPLY is 0 */ - FEATURE_ENUM_TO_STRING(HW_PREMULTIPLY); /*! HW multiplier can accept either premultiplied or not */ - FEATURE_ENUM_TO_STRING(COLOR_TRANSFORMATION); - FEATURE_ENUM_TO_STRING(LVGL_SUPPORT); - FEATURE_ENUM_TO_STRING(INDEX_ENDIAN); - FEATURE_ENUM_TO_STRING(24BIT_PLANAR); - FEATURE_ENUM_TO_STRING(PIXEL_MATRIX); - FEATURE_ENUM_TO_STRING(NEW_IMAGE_INDEX); - FEATURE_ENUM_TO_STRING(PARALLEL_PATHS); - FEATURE_ENUM_TO_STRING(STRIPE_MODE); - FEATURE_ENUM_TO_STRING(IM_DEC_INPUT); - FEATURE_ENUM_TO_STRING(GAUSSIAN_BLUR); - FEATURE_ENUM_TO_STRING(RECTANGLE_TILED_OUT); - FEATURE_ENUM_TO_STRING(TESSELLATION_TILED_OUT); - FEATURE_ENUM_TO_STRING(IM_REPEAT_REFLECT); - FEATURE_ENUM_TO_STRING(YUY2_INPUT); - FEATURE_ENUM_TO_STRING(YUV_INPUT); - FEATURE_ENUM_TO_STRING(YUV_TILED_INPUT); - FEATURE_ENUM_TO_STRING(AYUV_INPUT); - FEATURE_ENUM_TO_STRING(16PIXELS_ALIGN); - FEATURE_ENUM_TO_STRING(DEC_COMPRESS_2_0); - default: - break; - } - return "UNKNOW_FEATURE"; -} - -const char * lv_vg_lite_buffer_format_string(vg_lite_buffer_format_t format) -{ - switch(format) { - VG_LITE_ENUM_TO_STRING(RGBA8888); - VG_LITE_ENUM_TO_STRING(BGRA8888); - VG_LITE_ENUM_TO_STRING(RGBX8888); - VG_LITE_ENUM_TO_STRING(BGRX8888); - VG_LITE_ENUM_TO_STRING(RGB565); - VG_LITE_ENUM_TO_STRING(BGR565); - VG_LITE_ENUM_TO_STRING(RGBA4444); - VG_LITE_ENUM_TO_STRING(BGRA4444); - VG_LITE_ENUM_TO_STRING(BGRA5551); - VG_LITE_ENUM_TO_STRING(A4); - VG_LITE_ENUM_TO_STRING(A8); - VG_LITE_ENUM_TO_STRING(L8); - VG_LITE_ENUM_TO_STRING(YUYV); - VG_LITE_ENUM_TO_STRING(YUY2); - VG_LITE_ENUM_TO_STRING(NV12); - VG_LITE_ENUM_TO_STRING(ANV12); - VG_LITE_ENUM_TO_STRING(AYUY2); - VG_LITE_ENUM_TO_STRING(YV12); - VG_LITE_ENUM_TO_STRING(YV24); - VG_LITE_ENUM_TO_STRING(YV16); - VG_LITE_ENUM_TO_STRING(NV16); - VG_LITE_ENUM_TO_STRING(YUY2_TILED); - VG_LITE_ENUM_TO_STRING(NV12_TILED); - VG_LITE_ENUM_TO_STRING(ANV12_TILED); - VG_LITE_ENUM_TO_STRING(AYUY2_TILED); - VG_LITE_ENUM_TO_STRING(INDEX_1); - VG_LITE_ENUM_TO_STRING(INDEX_2); - VG_LITE_ENUM_TO_STRING(INDEX_4); - VG_LITE_ENUM_TO_STRING(INDEX_8); - VG_LITE_ENUM_TO_STRING(RGBA2222); - VG_LITE_ENUM_TO_STRING(BGRA2222); - VG_LITE_ENUM_TO_STRING(ABGR2222); - VG_LITE_ENUM_TO_STRING(ARGB2222); - VG_LITE_ENUM_TO_STRING(ABGR4444); - VG_LITE_ENUM_TO_STRING(ARGB4444); - VG_LITE_ENUM_TO_STRING(ABGR8888); - VG_LITE_ENUM_TO_STRING(ARGB8888); - VG_LITE_ENUM_TO_STRING(ABGR1555); - VG_LITE_ENUM_TO_STRING(RGBA5551); - VG_LITE_ENUM_TO_STRING(ARGB1555); - VG_LITE_ENUM_TO_STRING(XBGR8888); - VG_LITE_ENUM_TO_STRING(XRGB8888); - VG_LITE_ENUM_TO_STRING(RGBA8888_ETC2_EAC); - VG_LITE_ENUM_TO_STRING(RGB888); - VG_LITE_ENUM_TO_STRING(BGR888); - VG_LITE_ENUM_TO_STRING(ABGR8565); - VG_LITE_ENUM_TO_STRING(BGRA5658); - VG_LITE_ENUM_TO_STRING(ARGB8565); - VG_LITE_ENUM_TO_STRING(RGBA5658); - default: - break; - } - return "UNKNOW_BUFFER_FORMAT"; -} - -const char * lv_vg_lite_vlc_op_string(uint8_t vlc_op) -{ - switch(vlc_op) { - VLC_OP_ENUM_TO_STRING(END); - VLC_OP_ENUM_TO_STRING(CLOSE); - VLC_OP_ENUM_TO_STRING(MOVE); - VLC_OP_ENUM_TO_STRING(MOVE_REL); - VLC_OP_ENUM_TO_STRING(LINE); - VLC_OP_ENUM_TO_STRING(LINE_REL); - VLC_OP_ENUM_TO_STRING(QUAD); - VLC_OP_ENUM_TO_STRING(QUAD_REL); - VLC_OP_ENUM_TO_STRING(CUBIC); - VLC_OP_ENUM_TO_STRING(CUBIC_REL); - - VLC_OP_ENUM_TO_STRING(SCCWARC); - VLC_OP_ENUM_TO_STRING(SCCWARC_REL); - VLC_OP_ENUM_TO_STRING(SCWARC); - VLC_OP_ENUM_TO_STRING(SCWARC_REL); - VLC_OP_ENUM_TO_STRING(LCCWARC); - VLC_OP_ENUM_TO_STRING(LCCWARC_REL); - VLC_OP_ENUM_TO_STRING(LCWARC); - VLC_OP_ENUM_TO_STRING(LCWARC_REL); - default: - break; - } - return "UNKNOW_VLC_OP"; -} - -static void path_data_print_cb(void * user_data, uint8_t op_code, const float * data, uint32_t len) -{ - LV_UNUSED(user_data); - - LV_LOG("%s, ", lv_vg_lite_vlc_op_string(op_code)); - for(uint32_t i = 0; i < len; i++) { - LV_LOG("%0.2f, ", data[i]); - } - LV_LOG("\n"); -} - -void lv_vg_lite_path_dump_info(const vg_lite_path_t * path) -{ - LV_ASSERT(path != NULL); - LV_ASSERT(path->path != NULL); - uint8_t fmt_len = lv_vg_lite_path_format_len(path->format); - size_t len = path->path_length / fmt_len; - - LV_ASSERT(len > 0); - - LV_LOG_USER("address: %p", (void *)path->path); - LV_LOG_USER("length: %d", (int)len); - LV_LOG_USER("bonding box: (%0.2f, %0.2f) - (%0.2f, %0.2f)", - path->bounding_box[0], path->bounding_box[1], - path->bounding_box[2], path->bounding_box[3]); - LV_LOG_USER("format: %d", (int)path->format); - LV_LOG_USER("quality: %d", (int)path->quality); - LV_LOG_USER("path_changed: %d", (int)path->path_changed); - LV_LOG_USER("pdata_internal: %d", (int)path->pdata_internal); - LV_LOG_USER("type: %d", (int)path->path_type); - LV_LOG_USER("add_end: %d", (int)path->add_end); - - lv_vg_lite_path_for_each_data(path, path_data_print_cb, NULL); - - if(path->stroke) { - LV_LOG_USER("stroke_path: %p", (void *)path->stroke_path); - LV_LOG_USER("stroke_size: %d", (int)path->stroke_size); - LV_LOG_USER("stroke_color: 0x%X", (int)path->stroke_color); - lv_vg_lite_stroke_dump_info(path->stroke); - } -} - -void lv_vg_lite_stroke_dump_info(const vg_lite_stroke_t * stroke) -{ - LV_ASSERT(stroke != NULL); - LV_LOG_USER("stroke: %p", (void *)stroke); - - /* Stroke parameters */ - LV_LOG_USER("cap_style: 0x%X", (int)stroke->cap_style); - LV_LOG_USER("join_style: 0x%X", (int)stroke->join_style); - LV_LOG_USER("line_width: %f", stroke->line_width); - LV_LOG_USER("miter_limit: %f", stroke->miter_limit); - - LV_LOG_USER("dash_pattern: %p", (void *)stroke->dash_pattern); - LV_LOG_USER("pattern_count: %d", (int)stroke->pattern_count); - if(stroke->dash_pattern) { - for(int i = 0; i < (int)stroke->pattern_count; i++) { - LV_LOG_USER("dash_pattern[%d]: %f", i, stroke->dash_pattern[i]); - } - } - - LV_LOG_USER("dash_phase: %f", stroke->dash_phase); - LV_LOG_USER("dash_length: %f", stroke->dash_length); - LV_LOG_USER("dash_index: %d", (int)stroke->dash_index); - LV_LOG_USER("half_width: %f", stroke->half_width); - - /* Total length of stroke dash patterns. */ - LV_LOG_USER("pattern_length: %f", stroke->pattern_length); - - /* For fast checking. */ - LV_LOG_USER("miter_square: %f", stroke->miter_square); - - /* Temp storage of stroke subPath. */ - LV_LOG_USER("path_points: %p", (void *)stroke->path_points); - LV_LOG_USER("path_end: %p", (void *)stroke->path_end); - LV_LOG_USER("point_count: %d", (int)stroke->point_count); - - LV_LOG_USER("left_point: %p", (void *)stroke->left_point); - LV_LOG_USER("right_point: %p", (void *)stroke->right_point); - LV_LOG_USER("stroke_points: %p", (void *)stroke->stroke_points); - LV_LOG_USER("stroke_end: %p", (void *)stroke->stroke_end); - LV_LOG_USER("stroke_count: %d", (int)stroke->stroke_count); - - /* Divide stroke path according to move or move_rel for avoiding implicit closure. */ - LV_LOG_USER("path_list_divide: %p", (void *)stroke->path_list_divide); - - /* pointer to current divided path data. */ - LV_LOG_USER("cur_list: %p", (void *)stroke->cur_list); - - /* Flag that add end_path in driver. */ - LV_LOG_USER("add_end: %d", (int)stroke->add_end); - LV_LOG_USER("dash_reset: %d", (int)stroke->dash_reset); - - /* Sub path list. */ - LV_LOG_USER("stroke_paths: %p", (void *)stroke->stroke_paths); - - /* Last sub path. */ - LV_LOG_USER("last_stroke: %p", (void *)stroke->last_stroke); - - /* Swing area handling. */ - LV_LOG_USER("swing_handling: %d", (int)stroke->swing_handling); - LV_LOG_USER("swing_deltax: %f", stroke->swing_deltax); - LV_LOG_USER("swing_deltay: %f", stroke->swing_deltay); - LV_LOG_USER("swing_start: %p", (void *)stroke->swing_start); - LV_LOG_USER("swing_stroke: %p", (void *)stroke->swing_stroke); - LV_LOG_USER("swing_length: %f", stroke->swing_length); - LV_LOG_USER("swing_centlen: %f", stroke->swing_centlen); - LV_LOG_USER("swing_count: %d", (int)stroke->swing_count); - LV_LOG_USER("need_swing: %d", (int)stroke->need_swing); - LV_LOG_USER("swing_ccw: %d", (int)stroke->swing_ccw); - - LV_LOG_USER("stroke_length: %f", stroke->stroke_length); - LV_LOG_USER("stroke_size: %d", (int)stroke->stroke_size); - - LV_LOG_USER("fattened: %d", (int)stroke->fattened); - LV_LOG_USER("closed: %d", (int)stroke->closed); -} - -void lv_vg_lite_buffer_dump_info(const vg_lite_buffer_t * buffer) -{ - LV_LOG_USER("memory: %p", (buffer)->memory); - LV_LOG_USER("address: 0x%08x", (int)(buffer)->address); - LV_LOG_USER("size: W%d x H%d", (int)((buffer)->width), (int)((buffer)->height)); - LV_LOG_USER("stride: %d", (int)((buffer)->stride)); - LV_LOG_USER("format: %d (%s)", - (int)((buffer)->format), - lv_vg_lite_buffer_format_string((buffer)->format)); - LV_LOG_USER("tiled: %d", (int)((buffer)->tiled)); -} - -void lv_vg_lite_matrix_dump_info(const vg_lite_matrix_t * matrix) -{ - for(int i = 0; i < 3; i++) { - LV_LOG_USER("| %f, %f, %f |", - (matrix)->m[i][0], (matrix)->m[i][1], (matrix)->m[i][2]); - } -} - -bool lv_vg_lite_is_dest_cf_supported(lv_color_format_t cf) -{ - switch(cf) { - case LV_COLOR_FORMAT_RGB565: - case LV_COLOR_FORMAT_ARGB8888: - case LV_COLOR_FORMAT_XRGB8888: - return true; - - case LV_COLOR_FORMAT_ARGB8565: - case LV_COLOR_FORMAT_RGB888: - return vg_lite_query_feature(gcFEATURE_BIT_VG_24BIT) ? true : false; - - default: - break; - } - - return false; -} - -bool lv_vg_lite_is_src_cf_supported(lv_color_format_t cf) -{ - switch(cf) { - case LV_COLOR_FORMAT_A4: - case LV_COLOR_FORMAT_A8: - case LV_COLOR_FORMAT_RGB565: - case LV_COLOR_FORMAT_ARGB8888: - case LV_COLOR_FORMAT_XRGB8888: - return true; - - case LV_COLOR_FORMAT_I1: - case LV_COLOR_FORMAT_I2: - case LV_COLOR_FORMAT_I4: - case LV_COLOR_FORMAT_I8: - return vg_lite_query_feature(gcFEATURE_BIT_VG_IM_INDEX_FORMAT) ? true : false; - - case LV_COLOR_FORMAT_ARGB8565: - case LV_COLOR_FORMAT_RGB888: - return vg_lite_query_feature(gcFEATURE_BIT_VG_24BIT) ? true : false; - - case LV_COLOR_FORMAT_NV12: - return vg_lite_query_feature(gcFEATURE_BIT_VG_YUV_INPUT) ? true : false; - - default: - break; - } - - return false; -} - -vg_lite_buffer_format_t lv_vg_lite_vg_fmt(lv_color_format_t cf) -{ - switch(cf) { - case LV_COLOR_FORMAT_A4: - return VG_LITE_A4; - - case LV_COLOR_FORMAT_A8: - return VG_LITE_A8; - - case LV_COLOR_FORMAT_L8: - return VG_LITE_L8; - - case LV_COLOR_FORMAT_I1: - return VG_LITE_INDEX_1; - - case LV_COLOR_FORMAT_I2: - return VG_LITE_INDEX_2; - - case LV_COLOR_FORMAT_I4: - return VG_LITE_INDEX_4; - - case LV_COLOR_FORMAT_I8: - return VG_LITE_INDEX_8; - - case LV_COLOR_FORMAT_RGB565: - return VG_LITE_BGR565; - - case LV_COLOR_FORMAT_ARGB8565: - return VG_LITE_BGRA5658; - - case LV_COLOR_FORMAT_RGB888: - return VG_LITE_BGR888; - - case LV_COLOR_FORMAT_ARGB8888: - return VG_LITE_BGRA8888; - - case LV_COLOR_FORMAT_XRGB8888: - return VG_LITE_BGRX8888; - - case LV_COLOR_FORMAT_NV12: - return VG_LITE_NV12; - - default: - LV_LOG_ERROR("unsupported color format: %d", cf); - break; - } - - LV_ASSERT(false); - return 0; -} - -void lv_vg_lite_buffer_format_bytes( - vg_lite_buffer_format_t format, - uint32_t * mul, - uint32_t * div, - uint32_t * bytes_align) -{ - /* Get the bpp information of a color format. */ - *mul = *div = 1; - *bytes_align = 4; - switch(format) { - case VG_LITE_L8: - case VG_LITE_A8: - case VG_LITE_RGBA8888_ETC2_EAC: - break; - case VG_LITE_A4: - *div = 2; - break; - case VG_LITE_ABGR1555: - case VG_LITE_ARGB1555: - case VG_LITE_BGRA5551: - case VG_LITE_RGBA5551: - case VG_LITE_RGBA4444: - case VG_LITE_BGRA4444: - case VG_LITE_ABGR4444: - case VG_LITE_ARGB4444: - case VG_LITE_RGB565: - case VG_LITE_BGR565: - case VG_LITE_YUYV: - case VG_LITE_YUY2: - case VG_LITE_YUY2_TILED: - /* AYUY2 buffer memory = YUY2 + alpha. */ - case VG_LITE_AYUY2: - case VG_LITE_AYUY2_TILED: - *mul = 2; - break; - case VG_LITE_RGBA8888: - case VG_LITE_BGRA8888: - case VG_LITE_ABGR8888: - case VG_LITE_ARGB8888: - case VG_LITE_RGBX8888: - case VG_LITE_BGRX8888: - case VG_LITE_XBGR8888: - case VG_LITE_XRGB8888: - *mul = 4; - break; - case VG_LITE_NV12: - case VG_LITE_NV12_TILED: - *mul = 1; - break; - case VG_LITE_ANV12: - case VG_LITE_ANV12_TILED: - *mul = 4; - break; - case VG_LITE_INDEX_1: - *div = 8; - *bytes_align = 8; - break; - case VG_LITE_INDEX_2: - *div = 4; - *bytes_align = 8; - break; - case VG_LITE_INDEX_4: - *div = 2; - *bytes_align = 8; - break; - case VG_LITE_INDEX_8: - *bytes_align = 1; - break; - case VG_LITE_RGBA2222: - case VG_LITE_BGRA2222: - case VG_LITE_ABGR2222: - case VG_LITE_ARGB2222: - *mul = 1; - break; - case VG_LITE_RGB888: - case VG_LITE_BGR888: - case VG_LITE_ABGR8565: - case VG_LITE_BGRA5658: - case VG_LITE_ARGB8565: - case VG_LITE_RGBA5658: - *mul = 3; - break; - default: - LV_LOG_ERROR("unsupported color format: 0x%" PRIx32, (uint32_t)format); - LV_ASSERT(false); - break; - } -} - -uint32_t lv_vg_lite_width_to_stride(uint32_t w, vg_lite_buffer_format_t color_format) -{ - w = lv_vg_lite_width_align(w); - - uint32_t mul, div, align; - lv_vg_lite_buffer_format_bytes(color_format, &mul, &div, &align); - return LV_VG_LITE_ALIGN(((w * mul + div - 1) / div), align); -} - -uint32_t lv_vg_lite_width_align(uint32_t w) -{ - if(lv_vg_lite_16px_align()) { - w = LV_VG_LITE_ALIGN(w, 16); - } - - return w; -} - -void lv_vg_lite_buffer_init( - vg_lite_buffer_t * buffer, - const void * ptr, - int32_t width, - int32_t height, - uint32_t stride, - vg_lite_buffer_format_t format, - bool tiled) -{ - uint32_t mul; - uint32_t div; - uint32_t align; - LV_ASSERT_NULL(buffer); - LV_ASSERT_NULL(ptr); - - lv_memzero(buffer, sizeof(vg_lite_buffer_t)); - - buffer->format = format; - if(tiled || format == VG_LITE_RGBA8888_ETC2_EAC) { - buffer->tiled = VG_LITE_TILED; - } - else { - buffer->tiled = VG_LITE_LINEAR; - } - buffer->image_mode = VG_LITE_NORMAL_IMAGE_MODE; - buffer->transparency_mode = VG_LITE_IMAGE_OPAQUE; - buffer->width = width; - buffer->height = height; - if(stride == LV_STRIDE_AUTO) { - lv_vg_lite_buffer_format_bytes(buffer->format, &mul, &div, &align); - buffer->stride = LV_VG_LITE_ALIGN((buffer->width * mul / div), align); - } - else { - buffer->stride = stride; - } - - if(format == VG_LITE_NV12) { - lv_yuv_buf_t * frame_p = (lv_yuv_buf_t *)ptr; - buffer->memory = (void *)frame_p->semi_planar.y.buf; - buffer->address = (uintptr_t)frame_p->semi_planar.y.buf; - buffer->yuv.swizzle = VG_LITE_SWIZZLE_UV; - buffer->yuv.alpha_stride = buffer->stride; - buffer->yuv.uv_height = buffer->height / 2; - buffer->yuv.uv_memory = (void *)frame_p->semi_planar.uv.buf; - buffer->yuv.uv_planar = (uint32_t)(uintptr_t)frame_p->semi_planar.uv.buf; - buffer->yuv.uv_stride = frame_p->semi_planar.uv.stride; - } - else { - buffer->memory = (void *)ptr; - buffer->address = (uintptr_t)ptr; - } -} - -void lv_vg_lite_buffer_from_draw_buf(vg_lite_buffer_t * buffer, const lv_draw_buf_t * draw_buf) -{ - LV_ASSERT_NULL(buffer); - LV_ASSERT_NULL(draw_buf); - - const uint8_t * ptr = draw_buf->data; - int32_t width = draw_buf->header.w; - int32_t height = draw_buf->header.h; - uint32_t stride = draw_buf->header.stride; - vg_lite_buffer_format_t format = lv_vg_lite_vg_fmt(draw_buf->header.cf); - - if(LV_COLOR_FORMAT_IS_INDEXED(draw_buf->header.cf)) { - uint32_t palette_size_bytes = LV_COLOR_INDEXED_PALETTE_SIZE(draw_buf->header.cf) * sizeof(uint32_t); - - /* Skip palette */ - ptr += LV_VG_LITE_ALIGN(palette_size_bytes, LV_DRAW_BUF_ALIGN); - } - - width = lv_vg_lite_width_align(width); - - lv_vg_lite_buffer_init(buffer, ptr, width, height, stride, format, false); - - /* Alpha image need to be multiplied by color */ - if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(draw_buf->header.cf)) { - buffer->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; - } -} - -void lv_vg_lite_image_matrix(vg_lite_matrix_t * matrix, int32_t x, int32_t y, const lv_draw_image_dsc_t * dsc) -{ - LV_ASSERT_NULL(matrix); - LV_ASSERT_NULL(dsc); - - int32_t rotation = dsc->rotation; - int32_t scale_x = dsc->scale_x; - int32_t scale_y = dsc->scale_y; - - vg_lite_translate(x, y, matrix); - - if(rotation != 0 || scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { - lv_point_t pivot = dsc->pivot; - vg_lite_translate(pivot.x, pivot.y, matrix); - - if(rotation != 0) { - vg_lite_rotate(rotation * 0.1f, matrix); - } - - if(scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { - vg_lite_scale( - (vg_lite_float_t)scale_x / LV_SCALE_NONE, - (vg_lite_float_t)scale_y / LV_SCALE_NONE, - matrix); - } - - vg_lite_translate(-pivot.x, -pivot.y, matrix); - } -} - -bool lv_vg_lite_buffer_open_image(vg_lite_buffer_t * buffer, lv_image_decoder_dsc_t * decoder_dsc, const void * src, - bool no_cache, bool premultiply) -{ - LV_ASSERT_NULL(buffer); - LV_ASSERT_NULL(decoder_dsc); - LV_ASSERT_NULL(src); - - lv_image_decoder_args_t args; - lv_memzero(&args, sizeof(lv_image_decoder_args_t)); - args.premultiply = premultiply; - args.stride_align = true; - args.use_indexed = true; - args.no_cache = no_cache; - args.flush_cache = true; - - lv_result_t res = lv_image_decoder_open(decoder_dsc, src, &args); - if(res != LV_RESULT_OK) { - LV_LOG_ERROR("Failed to open image"); - return false; - } - - const lv_draw_buf_t * decoded = decoder_dsc->decoded; - if(decoded == NULL || decoded->data == NULL) { - lv_image_decoder_close(decoder_dsc); - LV_LOG_ERROR("image data is NULL"); - return false; - } - - if(!lv_vg_lite_is_src_cf_supported(decoded->header.cf)) { - LV_LOG_ERROR("unsupported color format: %d", decoded->header.cf); - lv_image_decoder_close(decoder_dsc); - return false; - } - - if(LV_COLOR_FORMAT_IS_INDEXED(decoded->header.cf)) { - uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(decoded->header.cf); - LV_PROFILER_BEGIN_TAG("vg_lite_set_CLUT"); - LV_VG_LITE_CHECK_ERROR(vg_lite_set_CLUT(palette_size, (vg_lite_uint32_t *)decoded->data)); - LV_PROFILER_END_TAG("vg_lite_set_CLUT"); - } - - lv_vg_lite_buffer_from_draw_buf(buffer, decoded); - return true; -} - -void lv_vg_lite_image_dsc_init(struct lv_draw_vg_lite_unit_t * unit) -{ - unit->image_dsc_pending = lv_vg_lite_pending_create(sizeof(lv_image_decoder_dsc_t), 4); - lv_vg_lite_pending_set_free_cb(unit->image_dsc_pending, image_dsc_free_cb, NULL); -} - -void lv_vg_lite_image_dsc_deinit(struct lv_draw_vg_lite_unit_t * unit) -{ - lv_vg_lite_pending_destroy(unit->image_dsc_pending); - unit->image_dsc_pending = NULL; -} - -void lv_vg_lite_rect(vg_lite_rectangle_t * rect, const lv_area_t * area) -{ - rect->x = area->x1; - rect->y = area->y1; - rect->width = lv_area_get_width(area); - rect->height = lv_area_get_height(area); -} - -void lv_vg_lite_matrix(vg_lite_matrix_t * dest, const lv_matrix_t * src) -{ - lv_memcpy(dest, src, sizeof(lv_matrix_t)); -} - -uint32_t lv_vg_lite_get_palette_size(vg_lite_buffer_format_t format) -{ - uint32_t size = 0; - switch(format) { - case VG_LITE_INDEX_1: - size = 1 << 1; - break; - case VG_LITE_INDEX_2: - size = 1 << 2; - break; - case VG_LITE_INDEX_4: - size = 1 << 4; - break; - case VG_LITE_INDEX_8: - size = 1 << 8; - break; - default: - break; - } - return size; -} - -vg_lite_color_t lv_vg_lite_color(lv_color_t color, lv_opa_t opa, bool pre_mul) -{ - if(pre_mul && opa < LV_OPA_COVER) { - color.red = LV_UDIV255(color.red * opa); - color.green = LV_UDIV255(color.green * opa); - color.blue = LV_UDIV255(color.blue * opa); - } - return (uint32_t)opa << 24 | (uint32_t)color.blue << 16 | (uint32_t)color.green << 8 | color.red; -} - -vg_lite_blend_t lv_vg_lite_blend_mode(lv_blend_mode_t blend_mode, bool has_pre_mul) -{ - if(!has_pre_mul && vg_lite_query_feature(gcFEATURE_BIT_VG_LVGL_SUPPORT)) { - switch(blend_mode) { - case LV_BLEND_MODE_NORMAL: /**< Simply mix according to the opacity value*/ - return VG_LITE_BLEND_NORMAL_LVGL; - - case LV_BLEND_MODE_ADDITIVE: /**< Add the respective color channels*/ - return VG_LITE_BLEND_ADDITIVE_LVGL; - - case LV_BLEND_MODE_SUBTRACTIVE: /**< Subtract the foreground from the background*/ - return VG_LITE_BLEND_SUBTRACT_LVGL; - - case LV_BLEND_MODE_MULTIPLY: /**< Multiply the foreground and background*/ - return VG_LITE_BLEND_MULTIPLY_LVGL; - - default: - return VG_LITE_BLEND_NONE; - } - } - - switch(blend_mode) { - case LV_BLEND_MODE_NORMAL: /**< Simply mix according to the opacity value*/ - if(!has_pre_mul && vg_lite_query_feature(gcFEATURE_BIT_VG_HW_PREMULTIPLY)) { - return VG_LITE_BLEND_PREMULTIPLY_SRC_OVER; - } - return VG_LITE_BLEND_SRC_OVER; - - case LV_BLEND_MODE_ADDITIVE: /**< Add the respective color channels*/ - return VG_LITE_BLEND_ADDITIVE; - - case LV_BLEND_MODE_SUBTRACTIVE: /**< Subtract the foreground from the background*/ - return VG_LITE_BLEND_SUBTRACT; - - case LV_BLEND_MODE_MULTIPLY: /**< Multiply the foreground and background*/ - return VG_LITE_BLEND_MULTIPLY; - - default: - return VG_LITE_BLEND_NONE; - } -} - -bool lv_vg_lite_buffer_check(const vg_lite_buffer_t * buffer, bool is_src) -{ - uint32_t mul; - uint32_t div; - uint32_t align; - int32_t stride; - - if(!buffer) { - LV_LOG_ERROR("buffer is NULL"); - return false; - } - - if(buffer->width < 1) { - LV_LOG_ERROR("buffer width(%d) < 1", (int)buffer->width); - return false; - } - - if(buffer->height < 1) { - LV_LOG_ERROR("buffer height(%d) < 1", (int)buffer->height); - return false; - } - - if(!(buffer->tiled == VG_LITE_LINEAR || buffer->tiled == VG_LITE_TILED)) { - LV_LOG_ERROR("buffer tiled(%d) is invalid", (int)buffer->tiled); - return false; - } - - if(buffer->memory == NULL) { - LV_LOG_ERROR("buffer memory is NULL"); - return false; - } - - if(is_src && buffer->width != (vg_lite_int32_t)lv_vg_lite_width_align(buffer->width)) { - LV_LOG_ERROR("buffer width(%d) is not aligned", (int)buffer->width); - return false; - } - - if(!LV_VG_LITE_IS_ALIGNED(buffer->memory, LV_DRAW_BUF_ALIGN)) { - LV_LOG_ERROR("buffer address(%p) is not aligned to %d", buffer->memory, LV_DRAW_BUF_ALIGN); - return false; - } - - lv_vg_lite_buffer_format_bytes(buffer->format, &mul, &div, &align); - stride = LV_VG_LITE_ALIGN((buffer->width * mul / div), align); - - if(buffer->stride != stride) { - LV_LOG_ERROR("buffer stride(%d) != %d", (int)buffer->stride, (int)stride); - return false; - } - - switch(buffer->image_mode) { - case VG_LITE_ZERO: - case VG_LITE_NORMAL_IMAGE_MODE: - case VG_LITE_MULTIPLY_IMAGE_MODE: - case VG_LITE_STENCIL_MODE: - case VG_LITE_NONE_IMAGE_MODE: - case VG_LITE_RECOLOR_MODE: - break; - default: - LV_LOG_ERROR("buffer image_mode(%d) is invalid", (int)buffer->image_mode); - return false; - } - - switch(buffer->transparency_mode) { - case VG_LITE_IMAGE_OPAQUE: - case VG_LITE_IMAGE_TRANSPARENT: - break; - default: - LV_LOG_ERROR("buffer transparency_mode(%d) is invalid", - (int)buffer->transparency_mode); - return false; - } - - return true; -} - -bool lv_vg_lite_path_check(const vg_lite_path_t * path) -{ - if(path == NULL) { - LV_LOG_ERROR("path is NULL"); - return false; - } - - if(path->path == NULL) { - LV_LOG_ERROR("path->path is NULL"); - return false; - } - - uint8_t fmt_len = lv_vg_lite_path_format_len(path->format); - if(!fmt_len) { - LV_LOG_ERROR("path format(%d) is invalid", (int)path->format); - return false; - } - - size_t len = path->path_length / fmt_len; - - if(len < 1) { - LV_LOG_ERROR("path length(%d) error", (int)path->path_length); - return false; - } - - const uint8_t * cur = path->path; - const uint8_t * end = cur + path->path_length; - - while(cur < end) { - /* get op code */ - uint8_t op_code = VLC_GET_OP_CODE(cur); - - /* get arguments length */ - uint8_t arg_len = lv_vg_lite_vlc_op_arg_len(op_code); - - /* get next op code */ - cur += (fmt_len * (1 + arg_len)) ; - - /* break if end */ - if(op_code == VLC_OP_END) { - break; - } - } - - if(cur != end) { - LV_LOG_ERROR("path length(%d) error", (int)path->path_length); - return false; - } - - switch(path->path_type) { - case VG_LITE_DRAW_ZERO: - case VG_LITE_DRAW_FILL_PATH: - case VG_LITE_DRAW_FILL_STROKE_PATH: { - /* Check end op code */ - uint8_t end_op_code = VLC_GET_OP_CODE(end - fmt_len); - if(end_op_code != VLC_OP_END) { - LV_LOG_ERROR("%d (%s) -> is NOT VLC_OP_END", end_op_code, lv_vg_lite_vlc_op_string(end_op_code)); - return false; - } - } - break; - - case VG_LITE_DRAW_STROKE_PATH: - /* No need to check stroke path end */ - break; - - default: - LV_LOG_ERROR("path type(%d) is invalid", (int)path->path_type); - return false; - } - - return true; -} - -bool lv_vg_lite_matrix_check(const vg_lite_matrix_t * matrix) -{ - if(matrix == NULL) { - LV_LOG_ERROR("matrix is NULL"); - return false; - } - - vg_lite_matrix_t result; - if(!lv_vg_lite_matrix_inverse(&result, matrix)) { - LV_LOG_ERROR("matrix is not invertible"); - lv_vg_lite_matrix_dump_info(matrix); - return false; - } - - return true; -} - -bool lv_vg_lite_support_blend_normal(void) -{ - if(vg_lite_query_feature(gcFEATURE_BIT_VG_HW_PREMULTIPLY)) { - return true; - } - - if(vg_lite_query_feature(gcFEATURE_BIT_VG_LVGL_SUPPORT)) { - return true; - } - - return false; -} - -bool lv_vg_lite_16px_align(void) -{ - return vg_lite_query_feature(gcFEATURE_BIT_VG_16PIXELS_ALIGN); -} - -void lv_vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult) -{ - vg_lite_matrix_t temp; - int row, column; - vg_lite_float_t (*m)[3] = matrix->m; - - /* Process all rows. */ - for(row = 0; row < 3; row++) { - /* Process all columns. */ - for(column = 0; column < 3; column++) { - /* Compute matrix entry. */ - temp.m[row][column] = (m[row][0] * mult->m[0][column]) - + (m[row][1] * mult->m[1][column]) - + (m[row][2] * mult->m[2][column]); - } - } - - /* Copy temporary matrix into result. */ - lv_memcpy(matrix, &temp, sizeof(temp)); -} - -bool lv_vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix) -{ - vg_lite_float_t det00, det01, det02; - vg_lite_float_t d; - bool is_affine; - - /* Test for identity matrix. */ - if(matrix == NULL) { - result->m[0][0] = 1.0f; - result->m[0][1] = 0.0f; - result->m[0][2] = 0.0f; - result->m[1][0] = 0.0f; - result->m[1][1] = 1.0f; - result->m[1][2] = 0.0f; - result->m[2][0] = 0.0f; - result->m[2][1] = 0.0f; - result->m[2][2] = 1.0f; - - /* Success. */ - return true; - } - - const vg_lite_float_t (*m)[3] = matrix->m; - - det00 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; - det01 = m[2][0] * m[1][2] - m[1][0] * m[2][2]; - det02 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; - - /* Compute determinant. */ - d = m[0][0] * det00 + m[0][1] * det01 + m[0][2] * det02; - - /* Return 0 if there is no inverse matrix. */ - if(d == 0.0f) - return false; - - /* Compute reciprocal. */ - d = 1.0f / d; - - /* Determine if the matrix is affine. */ - is_affine = (m[2][0] == 0.0f) && (m[2][1] == 0.0f) && (m[2][2] == 1.0f); - - result->m[0][0] = d * det00; - result->m[0][1] = d * ((m[2][1] * m[0][2]) - (m[0][1] * m[2][2])); - result->m[0][2] = d * ((m[0][1] * m[1][2]) - (m[1][1] * m[0][2])); - result->m[1][0] = d * det01; - result->m[1][1] = d * ((m[0][0] * m[2][2]) - (m[2][0] * m[0][2])); - result->m[1][2] = d * ((m[1][0] * m[0][2]) - (m[0][0] * m[1][2])); - result->m[2][0] = is_affine ? 0.0f : d * det02; - result->m[2][1] = is_affine ? 0.0f : d * ((m[2][0] * m[0][1]) - (m[0][0] * m[2][1])); - result->m[2][2] = is_affine ? 1.0f : d * ((m[0][0] * m[1][1]) - (m[1][0] * m[0][1])); - - /* Success. */ - return true; -} - -lv_point_precise_t lv_vg_lite_matrix_transform_point(const vg_lite_matrix_t * matrix, const lv_point_precise_t * point) -{ - lv_point_precise_t p; - const vg_lite_float_t (*m)[3] = matrix->m; - p.x = (lv_value_precise_t)roundf(point->x * m[0][0] + point->y * m[0][1] + m[0][2]); - p.y = (lv_value_precise_t)roundf(point->x * m[1][0] + point->y * m[1][1] + m[1][2]); - return p; -} - -void lv_vg_lite_set_scissor_area(const lv_area_t * area) -{ -#if VGLITE_RELEASE_VERSION <= VGLITE_MAKE_VERSION(4,0,57) - /** - * In the new version of VG-Lite, vg_lite_set_scissor no longer needs to call vg_lite_enable_scissor and - * vg_lite_disable_scissor APIs. - * - * Original description in the manual: - * Description: This is a legacy scissor API function that can be used to set and enable a single scissor rectangle - * for the render target. This scissor API is supported by a different hardware mechanism other than the mask layer, - * and it is not enabled/disabled by vg_lite_enable_scissor and vg_lite_disable_scissor APIs. - */ - LV_VG_LITE_CHECK_ERROR(vg_lite_enable_scissor()); -#endif - LV_VG_LITE_CHECK_ERROR(vg_lite_set_scissor( - area->x1, - area->y1, - area->x2 + 1, - area->y2 + 1)); -} - -void lv_vg_lite_disable_scissor(void) -{ - /* Restore full screen scissor */ - LV_VG_LITE_CHECK_ERROR(vg_lite_set_scissor( - 0, - 0, - LV_HOR_RES, - LV_VER_RES)); -} - -void lv_vg_lite_flush(struct lv_draw_vg_lite_unit_t * u) -{ - LV_ASSERT_NULL(u); - LV_PROFILER_BEGIN; - - u->flush_count++; - -#if LV_VG_LITE_FLUSH_MAX_COUNT - if(u->flush_count < LV_VG_LITE_FLUSH_MAX_COUNT) { - /* Do not flush too often */ - LV_PROFILER_END; - return; - } -#else - vg_lite_uint32_t is_gpu_idle = 0; - LV_VG_LITE_CHECK_ERROR(vg_lite_get_parameter(VG_LITE_GPU_IDLE_STATE, 1, (vg_lite_pointer)&is_gpu_idle)); - if(!is_gpu_idle) { - /* Do not flush if GPU is busy */ - LV_PROFILER_END; - return; - } -#endif - - LV_VG_LITE_CHECK_ERROR(vg_lite_flush()); - u->flush_count = 0; - LV_PROFILER_END; -} - -void lv_vg_lite_finish(struct lv_draw_vg_lite_unit_t * u) -{ - LV_ASSERT_NULL(u); - LV_PROFILER_BEGIN; - - LV_VG_LITE_CHECK_ERROR(vg_lite_finish()); - - /* Clear all gradient caches reference */ - if(u->grad_pending) { - lv_vg_lite_pending_remove_all(u->grad_pending); - } - - /* Clear image decoder dsc reference */ - lv_vg_lite_pending_remove_all(u->image_dsc_pending); - u->flush_count = 0; - LV_PROFILER_END; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void image_dsc_free_cb(void * dsc, void * user_data) -{ - LV_UNUSED(user_data); - lv_image_decoder_close(dsc); -} - -#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_utils.h b/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_utils.h deleted file mode 100644 index becbce8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/draw/vg_lite/lv_vg_lite_utils.h +++ /dev/null @@ -1,188 +0,0 @@ -/** - * @file lv_vg_lite_utils.h - * - */ - -#ifndef LV_VG_LITE_UTILS_H -#define LV_VG_LITE_UTILS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lvgl.h" - -#if LV_USE_DRAW_VG_LITE - -#include "../../misc/lv_profiler.h" - -#include -#if LV_USE_VG_LITE_THORVG -#include "../../others/vg_lite_tvg/vg_lite.h" -#else -#include -#endif - -/********************* - * DEFINES - *********************/ - -#define LV_VG_LITE_IS_ERROR(err) (err > 0) - -#define VLC_GET_OP_CODE(ptr) (*((uint8_t*)ptr)) - -#if LV_VG_LITE_USE_ASSERT -#define LV_VG_LITE_ASSERT(expr) LV_ASSERT(expr) -#else -#define LV_VG_LITE_ASSERT(expr) -#endif - -#define LV_VG_LITE_CHECK_ERROR(expr) \ - do { \ - vg_lite_error_t error = expr; \ - if (LV_VG_LITE_IS_ERROR(error)) { \ - LV_LOG_ERROR("Execute '" #expr "' error(%d): %s", \ - (int)error, lv_vg_lite_error_string(error)); \ - LV_VG_LITE_ASSERT(false); \ - } \ - } while (0) - -#define LV_VG_LITE_ASSERT_PATH(path) LV_VG_LITE_ASSERT(lv_vg_lite_path_check(path)) -#define LV_VG_LITE_ASSERT_SRC_BUFFER(buffer) LV_VG_LITE_ASSERT(lv_vg_lite_buffer_check(buffer, true)) -#define LV_VG_LITE_ASSERT_DEST_BUFFER(buffer) LV_VG_LITE_ASSERT(lv_vg_lite_buffer_check(buffer, false)) -#define LV_VG_LITE_ASSERT_MATRIX(matrix) LV_VG_LITE_ASSERT(lv_vg_lite_matrix_check(matrix)) - -#define LV_VG_LITE_ALIGN(number, align_bytes) \ - (((number) + ((align_bytes)-1)) & ~((align_bytes)-1)) - -#define LV_VG_LITE_IS_ALIGNED(num, align) (((uintptr_t)(num) & ((align)-1)) == 0) - -#define LV_VG_LITE_IS_INDEX_FMT(fmt) \ - ((fmt) == VG_LITE_INDEX_1 \ - || (fmt) == VG_LITE_INDEX_2 \ - || (fmt) == VG_LITE_INDEX_4 \ - || (fmt) == VG_LITE_INDEX_8) - -/********************** - * TYPEDEFS - **********************/ - -struct lv_draw_vg_lite_unit_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/* Print info */ - -void lv_vg_lite_dump_info(void); - -const char * lv_vg_lite_error_string(vg_lite_error_t error); - -const char * lv_vg_lite_feature_string(vg_lite_feature_t feature); - -const char * lv_vg_lite_buffer_format_string(vg_lite_buffer_format_t format); - -const char * lv_vg_lite_vlc_op_string(uint8_t vlc_op); - -void lv_vg_lite_path_dump_info(const vg_lite_path_t * path); - -void lv_vg_lite_stroke_dump_info(const vg_lite_stroke_t * stroke); - -void lv_vg_lite_buffer_dump_info(const vg_lite_buffer_t * buffer); - -void lv_vg_lite_matrix_dump_info(const vg_lite_matrix_t * matrix); - -bool lv_vg_lite_is_dest_cf_supported(lv_color_format_t cf); - -bool lv_vg_lite_is_src_cf_supported(lv_color_format_t cf); - -/* Converter */ - -vg_lite_buffer_format_t lv_vg_lite_vg_fmt(lv_color_format_t cf); - -void lv_vg_lite_buffer_format_bytes( - vg_lite_buffer_format_t format, - uint32_t * mul, - uint32_t * div, - uint32_t * bytes_align); - -uint32_t lv_vg_lite_width_to_stride(uint32_t w, vg_lite_buffer_format_t color_format); - -uint32_t lv_vg_lite_width_align(uint32_t w); - -void lv_vg_lite_buffer_init( - vg_lite_buffer_t * buffer, - const void * ptr, - int32_t width, - int32_t height, - uint32_t stride, - vg_lite_buffer_format_t format, - bool tiled); - -void lv_vg_lite_buffer_from_draw_buf(vg_lite_buffer_t * buffer, const lv_draw_buf_t * draw_buf); - -void lv_vg_lite_image_matrix(vg_lite_matrix_t * matrix, int32_t x, int32_t y, const lv_draw_image_dsc_t * dsc); - -void lv_vg_lite_image_dec_init(vg_lite_matrix_t * matrix, int32_t x, int32_t y, const lv_draw_image_dsc_t * dsc); - -bool lv_vg_lite_buffer_open_image(vg_lite_buffer_t * buffer, lv_image_decoder_dsc_t * decoder_dsc, const void * src, - bool no_cache, bool premultiply); - -void lv_vg_lite_image_dsc_init(struct lv_draw_vg_lite_unit_t * unit); - -void lv_vg_lite_image_dsc_deinit(struct lv_draw_vg_lite_unit_t * unit); - -vg_lite_blend_t lv_vg_lite_blend_mode(lv_blend_mode_t blend_mode, bool has_pre_mul); - -uint32_t lv_vg_lite_get_palette_size(vg_lite_buffer_format_t format); - -vg_lite_color_t lv_vg_lite_color(lv_color_t color, lv_opa_t opa, bool pre_mul); - -void lv_vg_lite_rect(vg_lite_rectangle_t * rect, const lv_area_t * area); - -void lv_vg_lite_matrix(vg_lite_matrix_t * dest, const lv_matrix_t * src); - -/* Param checker */ - -bool lv_vg_lite_buffer_check(const vg_lite_buffer_t * buffer, bool is_src); - -bool lv_vg_lite_path_check(const vg_lite_path_t * path); - -bool lv_vg_lite_matrix_check(const vg_lite_matrix_t * matrix); - -/* Wrapper */ - -bool lv_vg_lite_support_blend_normal(void); - -bool lv_vg_lite_16px_align(void); - -void lv_vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult); - -bool lv_vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix); - -lv_point_precise_t lv_vg_lite_matrix_transform_point(const vg_lite_matrix_t * matrix, const lv_point_precise_t * point); - -void lv_vg_lite_set_scissor_area(const lv_area_t * area); - -void lv_vg_lite_disable_scissor(void); - -void lv_vg_lite_flush(struct lv_draw_vg_lite_unit_t * u); - -void lv_vg_lite_finish(struct lv_draw_vg_lite_unit_t * u); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DRAW_VG_LITE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*VG_LITE_UTILS_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/README.md b/software/Power_Pico/Middlewares/LVGL/src/drivers/README.md deleted file mode 100644 index f755a3a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/README.md +++ /dev/null @@ -1 +0,0 @@ -High level drivers for display controllers, frame buffers, etc \ No newline at end of file diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/drm/lv_linux_drm.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/drm/lv_linux_drm.c deleted file mode 100644 index 29e0168..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/drm/lv_linux_drm.c +++ /dev/null @@ -1,852 +0,0 @@ -/** - * @file lv_linux_drm.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_linux_drm.h" -#if LV_USE_LINUX_DRM - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -/********************* - * DEFINES - *********************/ -#if LV_COLOR_DEPTH == 32 - #define DRM_FOURCC DRM_FORMAT_XRGB8888 -#elif LV_COLOR_DEPTH == 16 - #define DRM_FOURCC DRM_FORMAT_RGB565 -#else - #error LV_COLOR_DEPTH not supported -#endif - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - uint32_t handle; - uint32_t pitch; - uint32_t offset; - unsigned long int size; - uint8_t * map; - uint32_t fb_handle; -} drm_buffer_t; - -typedef struct { - int fd; - uint32_t conn_id, enc_id, crtc_id, plane_id, crtc_idx; - uint32_t width, height; - uint32_t mmWidth, mmHeight; - uint32_t fourcc; - drmModeModeInfo mode; - uint32_t blob_id; - drmModeCrtc * saved_crtc; - drmModeAtomicReq * req; - drmEventContext drm_event_ctx; - drmModePlane * plane; - drmModeCrtc * crtc; - drmModeConnector * conn; - uint32_t count_plane_props; - uint32_t count_crtc_props; - uint32_t count_conn_props; - drmModePropertyPtr plane_props[128]; - drmModePropertyPtr crtc_props[128]; - drmModePropertyPtr conn_props[128]; - drm_buffer_t drm_bufs[2]; /*DUMB buffers*/ -} drm_dev_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static uint32_t get_plane_property_id(drm_dev_t * drm_dev, const char * name); -static uint32_t get_crtc_property_id(drm_dev_t * drm_dev, const char * name); -static uint32_t get_conn_property_id(drm_dev_t * drm_dev, const char * name); -static void page_flip_handler(int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, - void * user_data); -static int drm_get_plane_props(drm_dev_t * drm_dev); -static int drm_get_crtc_props(drm_dev_t * drm_dev); -static int drm_get_conn_props(drm_dev_t * drm_dev); -static int drm_add_plane_property(drm_dev_t * drm_dev, const char * name, uint64_t value); -static int drm_add_crtc_property(drm_dev_t * drm_dev, const char * name, uint64_t value); -static int drm_add_conn_property(drm_dev_t * drm_dev, const char * name, uint64_t value); -static int drm_dmabuf_set_plane(drm_dev_t * drm_dev, drm_buffer_t * buf); -static int find_plane(drm_dev_t * drm_dev, unsigned int fourcc, uint32_t * plane_id, uint32_t crtc_id, - uint32_t crtc_idx); -static int drm_find_connector(drm_dev_t * drm_dev, int64_t connector_id); -static int drm_open(const char * path); -static int drm_setup(drm_dev_t * drm_dev, const char * device_path, int64_t connector_id, unsigned int fourcc); -static int drm_allocate_dumb(drm_dev_t * drm_dev, drm_buffer_t * buf); -static int drm_setup_buffers(drm_dev_t * drm_dev); -static void drm_flush_wait(lv_display_t * drm_dev); -static void drm_flush(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); - -static uint32_t tick_get_cb(void); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ -#ifndef DIV_ROUND_UP - #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_linux_drm_create(void) -{ - lv_tick_set_cb(tick_get_cb); - - drm_dev_t * drm_dev = lv_malloc_zeroed(sizeof(drm_dev_t)); - LV_ASSERT_MALLOC(drm_dev); - if(drm_dev == NULL) return NULL; - - lv_display_t * disp = lv_display_create(800, 480); - if(disp == NULL) { - lv_free(drm_dev); - return NULL; - } - drm_dev->fd = -1; - lv_display_set_driver_data(disp, drm_dev); - lv_display_set_flush_wait_cb(disp, drm_flush_wait); - lv_display_set_flush_cb(disp, drm_flush); - - return disp; -} - -void lv_linux_drm_set_file(lv_display_t * disp, const char * file, int64_t connector_id) -{ - drm_dev_t * drm_dev = lv_display_get_driver_data(disp); - int ret; - - ret = drm_setup(drm_dev, file, connector_id, DRM_FOURCC); - if(ret) { - close(drm_dev->fd); - drm_dev->fd = -1; - return; - } - - ret = drm_setup_buffers(drm_dev); - if(ret) { - LV_LOG_ERROR("DRM buffer allocation failed"); - close(drm_dev->fd); - drm_dev->fd = -1; - return; - } - - LV_LOG_INFO("DRM subsystem and buffer mapped successfully"); - - int32_t hor_res = drm_dev->width; - int32_t ver_res = drm_dev->height; - int32_t width = drm_dev->mmWidth; - - size_t buf_size = LV_MIN(drm_dev->drm_bufs[1].size, drm_dev->drm_bufs[0].size); - /* Resolution must be set first because if the screen is smaller than the size passed - * to lv_display_create then the buffers aren't big enough for LV_DISPLAY_RENDER_MODE_DIRECT. - */ - lv_display_set_resolution(disp, hor_res, ver_res); - lv_display_set_buffers(disp, drm_dev->drm_bufs[1].map, drm_dev->drm_bufs[0].map, buf_size, - LV_DISPLAY_RENDER_MODE_DIRECT); - - if(width) { - lv_display_set_dpi(disp, DIV_ROUND_UP(hor_res * 25400, width * 1000)); - } - - LV_LOG_INFO("Resolution is set to %" LV_PRId32 "x%" LV_PRId32 " at %" LV_PRId32 "dpi", - hor_res, ver_res, lv_display_get_dpi(disp)); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static uint32_t get_plane_property_id(drm_dev_t * drm_dev, const char * name) -{ - uint32_t i; - - LV_LOG_TRACE("Find plane property: %s", name); - - for(i = 0; i < drm_dev->count_plane_props; ++i) - if(!lv_strcmp(drm_dev->plane_props[i]->name, name)) - return drm_dev->plane_props[i]->prop_id; - - LV_LOG_TRACE("Unknown plane property: %s", name); - - return 0; -} - -static uint32_t get_crtc_property_id(drm_dev_t * drm_dev, const char * name) -{ - uint32_t i; - - LV_LOG_TRACE("Find crtc property: %s", name); - - for(i = 0; i < drm_dev->count_crtc_props; ++i) - if(!lv_strcmp(drm_dev->crtc_props[i]->name, name)) - return drm_dev->crtc_props[i]->prop_id; - - LV_LOG_TRACE("Unknown crtc property: %s", name); - - return 0; -} - -static uint32_t get_conn_property_id(drm_dev_t * drm_dev, const char * name) -{ - uint32_t i; - - LV_LOG_TRACE("Find conn property: %s", name); - - for(i = 0; i < drm_dev->count_conn_props; ++i) - if(!lv_strcmp(drm_dev->conn_props[i]->name, name)) - return drm_dev->conn_props[i]->prop_id; - - LV_LOG_TRACE("Unknown conn property: %s", name); - - return 0; -} - -static void page_flip_handler(int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, - void * user_data) -{ - LV_UNUSED(fd); - LV_UNUSED(sequence); - LV_UNUSED(tv_sec); - LV_UNUSED(tv_usec); - LV_LOG_TRACE("flip"); - drm_dev_t * drm_dev = user_data; - if(drm_dev->req) { - drmModeAtomicFree(drm_dev->req); - drm_dev->req = NULL; - } -} - -static int drm_get_plane_props(drm_dev_t * drm_dev) -{ - uint32_t i; - - drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(drm_dev->fd, drm_dev->plane_id, - DRM_MODE_OBJECT_PLANE); - if(!props) { - LV_LOG_ERROR("drmModeObjectGetProperties failed"); - return -1; - } - LV_LOG_TRACE("Found %u plane props", props->count_props); - drm_dev->count_plane_props = props->count_props; - for(i = 0; i < props->count_props; i++) { - drm_dev->plane_props[i] = drmModeGetProperty(drm_dev->fd, props->props[i]); - LV_LOG_TRACE("Added plane prop %u:%s", drm_dev->plane_props[i]->prop_id, drm_dev->plane_props[i]->name); - } - drmModeFreeObjectProperties(props); - - return 0; -} - -static int drm_get_crtc_props(drm_dev_t * drm_dev) -{ - uint32_t i; - - drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(drm_dev->fd, drm_dev->crtc_id, - DRM_MODE_OBJECT_CRTC); - if(!props) { - LV_LOG_ERROR("drmModeObjectGetProperties failed"); - return -1; - } - LV_LOG_TRACE("Found %u crtc props", props->count_props); - drm_dev->count_crtc_props = props->count_props; - for(i = 0; i < props->count_props; i++) { - drm_dev->crtc_props[i] = drmModeGetProperty(drm_dev->fd, props->props[i]); - LV_LOG_TRACE("Added crtc prop %u:%s", drm_dev->crtc_props[i]->prop_id, drm_dev->crtc_props[i]->name); - } - drmModeFreeObjectProperties(props); - - return 0; -} - -static int drm_get_conn_props(drm_dev_t * drm_dev) -{ - uint32_t i; - - drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(drm_dev->fd, drm_dev->conn_id, - DRM_MODE_OBJECT_CONNECTOR); - if(!props) { - LV_LOG_ERROR("drmModeObjectGetProperties failed"); - return -1; - } - LV_LOG_TRACE("Found %u connector props", props->count_props); - drm_dev->count_conn_props = props->count_props; - for(i = 0; i < props->count_props; i++) { - drm_dev->conn_props[i] = drmModeGetProperty(drm_dev->fd, props->props[i]); - LV_LOG_TRACE("Added connector prop %u:%s", drm_dev->conn_props[i]->prop_id, drm_dev->conn_props[i]->name); - } - drmModeFreeObjectProperties(props); - - return 0; -} - -static int drm_add_plane_property(drm_dev_t * drm_dev, const char * name, uint64_t value) -{ - int ret; - uint32_t prop_id = get_plane_property_id(drm_dev, name); - - if(!prop_id) { - LV_LOG_ERROR("Couldn't find plane prop %s", name); - return -1; - } - - ret = drmModeAtomicAddProperty(drm_dev->req, drm_dev->plane_id, get_plane_property_id(drm_dev, name), value); - if(ret < 0) { - LV_LOG_ERROR("drmModeAtomicAddProperty (%s:%" PRIu64 ") failed: %d", name, value, ret); - return ret; - } - - return 0; -} - -static int drm_add_crtc_property(drm_dev_t * drm_dev, const char * name, uint64_t value) -{ - int ret; - uint32_t prop_id = get_crtc_property_id(drm_dev, name); - - if(!prop_id) { - LV_LOG_ERROR("Couldn't find crtc prop %s", name); - return -1; - } - - ret = drmModeAtomicAddProperty(drm_dev->req, drm_dev->crtc_id, get_crtc_property_id(drm_dev, name), value); - if(ret < 0) { - LV_LOG_ERROR("drmModeAtomicAddProperty (%s:%" PRIu64 ") failed: %d", name, value, ret); - return ret; - } - - return 0; -} - -static int drm_add_conn_property(drm_dev_t * drm_dev, const char * name, uint64_t value) -{ - int ret; - uint32_t prop_id = get_conn_property_id(drm_dev, name); - - if(!prop_id) { - LV_LOG_ERROR("Couldn't find conn prop %s", name); - return -1; - } - - ret = drmModeAtomicAddProperty(drm_dev->req, drm_dev->conn_id, get_conn_property_id(drm_dev, name), value); - if(ret < 0) { - LV_LOG_ERROR("drmModeAtomicAddProperty (%s:%" PRIu64 ") failed: %d", name, value, ret); - return ret; - } - - return 0; -} - -static int drm_dmabuf_set_plane(drm_dev_t * drm_dev, drm_buffer_t * buf) -{ - int ret; - static int first = 1; - uint32_t flags = DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK; - - drm_dev->req = drmModeAtomicAlloc(); - - /* On first Atomic commit, do a modeset */ - if(first) { - drm_add_conn_property(drm_dev, "CRTC_ID", drm_dev->crtc_id); - - drm_add_crtc_property(drm_dev, "MODE_ID", drm_dev->blob_id); - drm_add_crtc_property(drm_dev, "ACTIVE", 1); - - flags |= DRM_MODE_ATOMIC_ALLOW_MODESET; - - first = 0; - } - - drm_add_plane_property(drm_dev, "FB_ID", buf->fb_handle); - drm_add_plane_property(drm_dev, "CRTC_ID", drm_dev->crtc_id); - drm_add_plane_property(drm_dev, "SRC_X", 0); - drm_add_plane_property(drm_dev, "SRC_Y", 0); - drm_add_plane_property(drm_dev, "SRC_W", drm_dev->width << 16); - drm_add_plane_property(drm_dev, "SRC_H", drm_dev->height << 16); - drm_add_plane_property(drm_dev, "CRTC_X", 0); - drm_add_plane_property(drm_dev, "CRTC_Y", 0); - drm_add_plane_property(drm_dev, "CRTC_W", drm_dev->width); - drm_add_plane_property(drm_dev, "CRTC_H", drm_dev->height); - - ret = drmModeAtomicCommit(drm_dev->fd, drm_dev->req, flags, drm_dev); - if(ret) { - LV_LOG_ERROR("drmModeAtomicCommit failed: %s (%d)", strerror(errno), errno); - drmModeAtomicFree(drm_dev->req); - return ret; - } - - return 0; -} - -static int find_plane(drm_dev_t * drm_dev, unsigned int fourcc, uint32_t * plane_id, uint32_t crtc_id, - uint32_t crtc_idx) -{ - LV_UNUSED(crtc_id); - drmModePlaneResPtr planes; - drmModePlanePtr plane; - unsigned int i; - unsigned int j; - int ret = 0; - unsigned int format = fourcc; - - planes = drmModeGetPlaneResources(drm_dev->fd); - if(!planes) { - LV_LOG_ERROR("drmModeGetPlaneResources failed"); - return -1; - } - - LV_LOG_TRACE("drm: found planes %u", planes->count_planes); - - for(i = 0; i < planes->count_planes; ++i) { - plane = drmModeGetPlane(drm_dev->fd, planes->planes[i]); - if(!plane) { - LV_LOG_ERROR("drmModeGetPlane failed: %s", strerror(errno)); - break; - } - - if(!(plane->possible_crtcs & (1 << crtc_idx))) { - drmModeFreePlane(plane); - continue; - } - - for(j = 0; j < plane->count_formats; ++j) { - if(plane->formats[j] == format) - break; - } - - if(j == plane->count_formats) { - drmModeFreePlane(plane); - continue; - } - - *plane_id = plane->plane_id; - drmModeFreePlane(plane); - - LV_LOG_TRACE("found plane %d", *plane_id); - - break; - } - - if(i == planes->count_planes) - ret = -1; - - drmModeFreePlaneResources(planes); - - return ret; -} - -static int drm_find_connector(drm_dev_t * drm_dev, int64_t connector_id) -{ - drmModeConnector * conn = NULL; - drmModeEncoder * enc = NULL; - drmModeRes * res; - int i; - - if((res = drmModeGetResources(drm_dev->fd)) == NULL) { - LV_LOG_ERROR("drmModeGetResources() failed"); - return -1; - } - - if(res->count_crtcs <= 0) { - LV_LOG_ERROR("no Crtcs"); - goto free_res; - } - - /* find all available connectors */ - for(i = 0; i < res->count_connectors; i++) { - conn = drmModeGetConnector(drm_dev->fd, res->connectors[i]); - if(!conn) - continue; - - if(connector_id >= 0 && conn->connector_id != connector_id) { - drmModeFreeConnector(conn); - continue; - } - - if(conn->connection == DRM_MODE_CONNECTED) { - LV_LOG_TRACE("drm: connector %d: connected", conn->connector_id); - } - else if(conn->connection == DRM_MODE_DISCONNECTED) { - LV_LOG_TRACE("drm: connector %d: disconnected", conn->connector_id); - } - else if(conn->connection == DRM_MODE_UNKNOWNCONNECTION) { - LV_LOG_TRACE("drm: connector %d: unknownconnection", conn->connector_id); - } - else { - LV_LOG_TRACE("drm: connector %d: unknown", conn->connector_id); - } - - if(conn->connection == DRM_MODE_CONNECTED && conn->count_modes > 0) - break; - - drmModeFreeConnector(conn); - conn = NULL; - }; - - if(!conn) { - LV_LOG_ERROR("suitable connector not found"); - goto free_res; - } - - drm_dev->conn_id = conn->connector_id; - LV_LOG_TRACE("conn_id: %d", drm_dev->conn_id); - drm_dev->mmWidth = conn->mmWidth; - drm_dev->mmHeight = conn->mmHeight; - - lv_memcpy(&drm_dev->mode, &conn->modes[0], sizeof(drmModeModeInfo)); - - if(drmModeCreatePropertyBlob(drm_dev->fd, &drm_dev->mode, sizeof(drm_dev->mode), - &drm_dev->blob_id)) { - LV_LOG_ERROR("error creating mode blob"); - goto free_res; - } - - drm_dev->width = conn->modes[0].hdisplay; - drm_dev->height = conn->modes[0].vdisplay; - - for(i = 0 ; i < res->count_encoders; i++) { - enc = drmModeGetEncoder(drm_dev->fd, res->encoders[i]); - if(!enc) - continue; - - LV_LOG_TRACE("enc%d enc_id %d conn enc_id %d", i, enc->encoder_id, conn->encoder_id); - - if(enc->encoder_id == conn->encoder_id) - break; - - drmModeFreeEncoder(enc); - enc = NULL; - } - - if(enc) { - drm_dev->enc_id = enc->encoder_id; - LV_LOG_TRACE("enc_id: %d", drm_dev->enc_id); - drm_dev->crtc_id = enc->crtc_id; - LV_LOG_TRACE("crtc_id: %d", drm_dev->crtc_id); - drmModeFreeEncoder(enc); - } - else { - /* Encoder hasn't been associated yet, look it up */ - for(i = 0; i < conn->count_encoders; i++) { - int crtc, crtc_id = -1; - - enc = drmModeGetEncoder(drm_dev->fd, conn->encoders[i]); - if(!enc) - continue; - - for(crtc = 0 ; crtc < res->count_crtcs; crtc++) { - uint32_t crtc_mask = 1 << crtc; - - crtc_id = res->crtcs[crtc]; - - LV_LOG_TRACE("enc_id %d crtc%d id %d mask %x possible %x", enc->encoder_id, crtc, crtc_id, crtc_mask, - enc->possible_crtcs); - - if(enc->possible_crtcs & crtc_mask) - break; - } - - if(crtc_id > 0) { - drm_dev->enc_id = enc->encoder_id; - LV_LOG_TRACE("enc_id: %d", drm_dev->enc_id); - drm_dev->crtc_id = crtc_id; - LV_LOG_TRACE("crtc_id: %d", drm_dev->crtc_id); - break; - } - - drmModeFreeEncoder(enc); - enc = NULL; - } - - if(!enc) { - LV_LOG_ERROR("suitable encoder not found"); - goto free_res; - } - - drmModeFreeEncoder(enc); - } - - drm_dev->crtc_idx = UINT32_MAX; - - for(i = 0; i < res->count_crtcs; ++i) { - if(drm_dev->crtc_id == res->crtcs[i]) { - drm_dev->crtc_idx = i; - break; - } - } - - if(drm_dev->crtc_idx == UINT32_MAX) { - LV_LOG_ERROR("drm: CRTC not found"); - goto free_res; - } - - LV_LOG_TRACE("crtc_idx: %d", drm_dev->crtc_idx); - - return 0; - -free_res: - drmModeFreeResources(res); - - return -1; -} - -static int drm_open(const char * path) -{ - int fd, flags; - uint64_t has_dumb; - int ret; - - fd = open(path, O_RDWR); - if(fd < 0) { - LV_LOG_ERROR("cannot open \"%s\"", path); - return -1; - } - - /* set FD_CLOEXEC flag */ - if((flags = fcntl(fd, F_GETFD)) < 0 || - fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) { - LV_LOG_ERROR("fcntl FD_CLOEXEC failed"); - goto err; - } - - /* check capability */ - ret = drmGetCap(fd, DRM_CAP_DUMB_BUFFER, &has_dumb); - if(ret < 0 || has_dumb == 0) { - LV_LOG_ERROR("drmGetCap DRM_CAP_DUMB_BUFFER failed or \"%s\" doesn't have dumb " - "buffer", path); - goto err; - } - - return fd; -err: - close(fd); - return -1; -} - -static int drm_setup(drm_dev_t * drm_dev, const char * device_path, int64_t connector_id, unsigned int fourcc) -{ - int ret; - - drm_dev->fd = drm_open(device_path); - if(drm_dev->fd < 0) - return -1; - - ret = drmSetClientCap(drm_dev->fd, DRM_CLIENT_CAP_ATOMIC, 1); - if(ret) { - LV_LOG_ERROR("No atomic modesetting support: %s", strerror(errno)); - goto err; - } - - ret = drm_find_connector(drm_dev, connector_id); - if(ret) { - LV_LOG_ERROR("available drm devices not found"); - goto err; - } - - ret = find_plane(drm_dev, fourcc, &drm_dev->plane_id, drm_dev->crtc_id, drm_dev->crtc_idx); - if(ret) { - LV_LOG_ERROR("Cannot find plane"); - goto err; - } - - drm_dev->plane = drmModeGetPlane(drm_dev->fd, drm_dev->plane_id); - if(!drm_dev->plane) { - LV_LOG_ERROR("Cannot get plane"); - goto err; - } - - drm_dev->crtc = drmModeGetCrtc(drm_dev->fd, drm_dev->crtc_id); - if(!drm_dev->crtc) { - LV_LOG_ERROR("Cannot get crtc"); - goto err; - } - - drm_dev->conn = drmModeGetConnector(drm_dev->fd, drm_dev->conn_id); - if(!drm_dev->conn) { - LV_LOG_ERROR("Cannot get connector"); - goto err; - } - - ret = drm_get_plane_props(drm_dev); - if(ret) { - LV_LOG_ERROR("Cannot get plane props"); - goto err; - } - - ret = drm_get_crtc_props(drm_dev); - if(ret) { - LV_LOG_ERROR("Cannot get crtc props"); - goto err; - } - - ret = drm_get_conn_props(drm_dev); - if(ret) { - LV_LOG_ERROR("Cannot get connector props"); - goto err; - } - - drm_dev->drm_event_ctx.version = DRM_EVENT_CONTEXT_VERSION; - drm_dev->drm_event_ctx.page_flip_handler = page_flip_handler; - drm_dev->fourcc = fourcc; - - LV_LOG_INFO("drm: Found plane_id: %u connector_id: %d crtc_id: %d", - drm_dev->plane_id, drm_dev->conn_id, drm_dev->crtc_id); - - LV_LOG_INFO("drm: %dx%d (%dmm X% dmm) pixel format %c%c%c%c", - drm_dev->width, drm_dev->height, drm_dev->mmWidth, drm_dev->mmHeight, - (fourcc >> 0) & 0xff, (fourcc >> 8) & 0xff, (fourcc >> 16) & 0xff, (fourcc >> 24) & 0xff); - - return 0; - -err: - close(drm_dev->fd); - return -1; -} - -static int drm_allocate_dumb(drm_dev_t * drm_dev, drm_buffer_t * buf) -{ - struct drm_mode_create_dumb creq; - struct drm_mode_map_dumb mreq; - uint32_t handles[4] = {0}, pitches[4] = {0}, offsets[4] = {0}; - int ret; - - /* create dumb buffer */ - lv_memzero(&creq, sizeof(creq)); - creq.width = drm_dev->width; - creq.height = drm_dev->height; - creq.bpp = LV_COLOR_DEPTH; - ret = drmIoctl(drm_dev->fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq); - if(ret < 0) { - LV_LOG_ERROR("DRM_IOCTL_MODE_CREATE_DUMB fail"); - return -1; - } - - buf->handle = creq.handle; - buf->pitch = creq.pitch; - buf->size = creq.size; - - /* prepare buffer for memory mapping */ - lv_memzero(&mreq, sizeof(mreq)); - mreq.handle = creq.handle; - ret = drmIoctl(drm_dev->fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq); - if(ret) { - LV_LOG_ERROR("DRM_IOCTL_MODE_MAP_DUMB fail"); - return -1; - } - - buf->offset = mreq.offset; - LV_LOG_INFO("size %lu pitch %u offset %u", buf->size, buf->pitch, buf->offset); - - /* perform actual memory mapping */ - buf->map = mmap(0, creq.size, PROT_READ | PROT_WRITE, MAP_SHARED, drm_dev->fd, mreq.offset); - if(buf->map == MAP_FAILED) { - LV_LOG_ERROR("mmap fail"); - return -1; - } - - /* clear the framebuffer to 0 (= full transparency in ARGB8888) */ - lv_memzero(buf->map, creq.size); - - /* create framebuffer object for the dumb-buffer */ - handles[0] = creq.handle; - pitches[0] = creq.pitch; - offsets[0] = 0; - ret = drmModeAddFB2(drm_dev->fd, drm_dev->width, drm_dev->height, drm_dev->fourcc, - handles, pitches, offsets, &buf->fb_handle, 0); - if(ret) { - LV_LOG_ERROR("drmModeAddFB fail"); - return -1; - } - - return 0; -} - -static int drm_setup_buffers(drm_dev_t * drm_dev) -{ - int ret; - - /*Allocate DUMB buffers*/ - ret = drm_allocate_dumb(drm_dev, &drm_dev->drm_bufs[0]); - if(ret) - return ret; - - ret = drm_allocate_dumb(drm_dev, &drm_dev->drm_bufs[1]); - if(ret) - return ret; - - return 0; -} - -static void drm_flush_wait(lv_display_t * disp) -{ - drm_dev_t * drm_dev = lv_display_get_driver_data(disp); - - struct pollfd pfd; - pfd.fd = drm_dev->fd; - pfd.events = POLLIN; - - while(drm_dev->req) { - int ret; - do { - ret = poll(&pfd, 1, -1); - } while(ret == -1 && errno == EINTR); - - if(ret > 0) - drmHandleEvent(drm_dev->fd, &drm_dev->drm_event_ctx); - else { - LV_LOG_ERROR("poll failed: %s", strerror(errno)); - return; - } - } -} - -static void drm_flush(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) -{ - if(!lv_display_flush_is_last(disp)) return; - - LV_UNUSED(area); - LV_UNUSED(px_map); - drm_dev_t * drm_dev = lv_display_get_driver_data(disp); - - for(int idx = 0; idx < 2; idx++) { - if(drm_dev->drm_bufs[idx].map == px_map) { - /*Request buffer swap*/ - if(drm_dmabuf_set_plane(drm_dev, &drm_dev->drm_bufs[idx])) { - LV_LOG_ERROR("Flush fail"); - return; - } - else - LV_LOG_TRACE("Flush done"); - } - } -} - -static uint32_t tick_get_cb(void) -{ - struct timespec t; - clock_gettime(CLOCK_MONOTONIC, &t); - uint64_t time_ms = t.tv_sec * 1000 + (t.tv_nsec / 1000000); - return time_ms; -} - -#endif /*LV_USE_LINUX_DRM*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/drm/lv_linux_drm.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/drm/lv_linux_drm.h deleted file mode 100644 index ee32466..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/drm/lv_linux_drm.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @file lv_linux_drm.h - * - */ - -#ifndef LV_LINUX_DRM_H -#define LV_LINUX_DRM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../../display/lv_display.h" - -#if LV_USE_LINUX_DRM - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ -lv_display_t * lv_linux_drm_create(void); - -void lv_linux_drm_set_file(lv_display_t * disp, const char * file, int64_t connector_id); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_LINUX_DRM */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_LINUX_DRM_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/fb/lv_linux_fbdev.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/fb/lv_linux_fbdev.c deleted file mode 100644 index 076ada4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/fb/lv_linux_fbdev.c +++ /dev/null @@ -1,359 +0,0 @@ -/** - * @file lv_linux_fbdev.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_linux_fbdev.h" -#if LV_USE_LINUX_FBDEV - -#include -#include -#include -#include -#include -#include -#include -#include - -#if LV_LINUX_FBDEV_BSD - #include - #include - #include -#else - #include -#endif /* LV_LINUX_FBDEV_BSD */ - -#include "../../../display/lv_display_private.h" -#include "../../../draw/sw/lv_draw_sw.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -struct bsd_fb_var_info { - uint32_t xoffset; - uint32_t yoffset; - uint32_t xres; - uint32_t yres; - int bits_per_pixel; -}; - -struct bsd_fb_fix_info { - long int line_length; - long int smem_len; -}; - -typedef struct { - const char * devname; - lv_color_format_t color_format; -#if LV_LINUX_FBDEV_BSD - struct bsd_fb_var_info vinfo; - struct bsd_fb_fix_info finfo; -#else - struct fb_var_screeninfo vinfo; - struct fb_fix_screeninfo finfo; -#endif /* LV_LINUX_FBDEV_BSD */ - char * fbp; - uint8_t * rotated_buf; - size_t rotated_buf_size; - long int screensize; - int fbfd; - bool force_refresh; -} lv_linux_fb_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); -static uint32_t tick_get_cb(void); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -#if LV_LINUX_FBDEV_BSD - #define FBIOBLANK FBIO_BLANK -#endif /* LV_LINUX_FBDEV_BSD */ - -#ifndef DIV_ROUND_UP - #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_linux_fbdev_create(void) -{ - lv_tick_set_cb(tick_get_cb); - - lv_linux_fb_t * dsc = lv_malloc_zeroed(sizeof(lv_linux_fb_t)); - LV_ASSERT_MALLOC(dsc); - if(dsc == NULL) return NULL; - - lv_display_t * disp = lv_display_create(800, 480); - if(disp == NULL) { - lv_free(dsc); - return NULL; - } - dsc->fbfd = -1; - lv_display_set_driver_data(disp, dsc); - lv_display_set_flush_cb(disp, flush_cb); - - return disp; -} - -void lv_linux_fbdev_set_file(lv_display_t * disp, const char * file) -{ - char * devname = lv_malloc(lv_strlen(file) + 1); - LV_ASSERT_MALLOC(devname); - if(devname == NULL) return; - lv_strcpy(devname, file); - - lv_linux_fb_t * dsc = lv_display_get_driver_data(disp); - dsc->devname = devname; - - if(dsc->fbfd > 0) close(dsc->fbfd); - - /* Open the file for reading and writing*/ - dsc->fbfd = open(dsc->devname, O_RDWR); - if(dsc->fbfd == -1) { - perror("Error: cannot open framebuffer device"); - return; - } - LV_LOG_INFO("The framebuffer device was opened successfully"); - - /* Make sure that the display is on.*/ - if(ioctl(dsc->fbfd, FBIOBLANK, FB_BLANK_UNBLANK) != 0) { - perror("ioctl(FBIOBLANK)"); - /* Don't return. Some framebuffer drivers like efifb or simplefb don't implement FBIOBLANK.*/ - } - -#if LV_LINUX_FBDEV_BSD - struct fbtype fb; - unsigned line_length; - - /*Get fb type*/ - if(ioctl(dsc->fbfd, FBIOGTYPE, &fb) != 0) { - perror("ioctl(FBIOGTYPE)"); - return; - } - - /*Get screen width*/ - if(ioctl(dsc->fbfd, FBIO_GETLINEWIDTH, &line_length) != 0) { - perror("ioctl(FBIO_GETLINEWIDTH)"); - return; - } - - dsc->vinfo.xres = (unsigned) fb.fb_width; - dsc->vinfo.yres = (unsigned) fb.fb_height; - dsc->vinfo.bits_per_pixel = fb.fb_depth; - dsc->vinfo.xoffset = 0; - dsc->vinfo.yoffset = 0; - dsc->finfo.line_length = line_length; - dsc->finfo.smem_len = dsc->finfo.line_length * dsc->vinfo.yres; -#else /* LV_LINUX_FBDEV_BSD */ - - /* Get fixed screen information*/ - if(ioctl(dsc->fbfd, FBIOGET_FSCREENINFO, &dsc->finfo) == -1) { - perror("Error reading fixed information"); - return; - } - - /* Get variable screen information*/ - if(ioctl(dsc->fbfd, FBIOGET_VSCREENINFO, &dsc->vinfo) == -1) { - perror("Error reading variable information"); - return; - } -#endif /* LV_LINUX_FBDEV_BSD */ - - LV_LOG_INFO("%dx%d, %dbpp", dsc->vinfo.xres, dsc->vinfo.yres, dsc->vinfo.bits_per_pixel); - - /* Figure out the size of the screen in bytes*/ - dsc->screensize = dsc->finfo.smem_len;/*finfo.line_length * vinfo.yres;*/ - - /* Map the device to memory*/ - dsc->fbp = (char *)mmap(0, dsc->screensize, PROT_READ | PROT_WRITE, MAP_SHARED, dsc->fbfd, 0); - if((intptr_t)dsc->fbp == -1) { - perror("Error: failed to map framebuffer device to memory"); - return; - } - - /* Don't initialise the memory to retain what's currently displayed / avoid clearing the screen. - * This is important for applications that only draw to a subsection of the full framebuffer.*/ - - LV_LOG_INFO("The framebuffer device was mapped to memory successfully"); - - switch(dsc->vinfo.bits_per_pixel) { - case 16: - lv_display_set_color_format(disp, LV_COLOR_FORMAT_RGB565); - break; - case 24: - lv_display_set_color_format(disp, LV_COLOR_FORMAT_RGB888); - break; - case 32: - lv_display_set_color_format(disp, LV_COLOR_FORMAT_XRGB8888); - break; - default: - LV_LOG_WARN("Not supported color format (%d bits)", dsc->vinfo.bits_per_pixel); - return; - } - - int32_t hor_res = dsc->vinfo.xres; - int32_t ver_res = dsc->vinfo.yres; - int32_t width = dsc->vinfo.width; - uint32_t draw_buf_size = hor_res * (dsc->vinfo.bits_per_pixel >> 3); - if(LV_LINUX_FBDEV_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { - draw_buf_size *= LV_LINUX_FBDEV_BUFFER_SIZE; - } - else { - draw_buf_size *= ver_res; - } - - uint8_t * draw_buf = NULL; - uint8_t * draw_buf_2 = NULL; - draw_buf = malloc(draw_buf_size); - - if(LV_LINUX_FBDEV_BUFFER_COUNT == 2) { - draw_buf_2 = malloc(draw_buf_size); - } - - lv_display_set_resolution(disp, hor_res, ver_res); - lv_display_set_buffers(disp, draw_buf, draw_buf_2, draw_buf_size, LV_LINUX_FBDEV_RENDER_MODE); - - if(width > 0) { - lv_display_set_dpi(disp, DIV_ROUND_UP(hor_res * 254, width * 10)); - } - - LV_LOG_INFO("Resolution is set to %" LV_PRId32 "x%" LV_PRId32 " at %" LV_PRId32 "dpi", - hor_res, ver_res, lv_display_get_dpi(disp)); -} - -void lv_linux_fbdev_set_force_refresh(lv_display_t * disp, bool enabled) -{ - lv_linux_fb_t * dsc = lv_display_get_driver_data(disp); - dsc->force_refresh = enabled; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p) -{ - lv_linux_fb_t * dsc = lv_display_get_driver_data(disp); - - if(dsc->fbp == NULL) { - lv_display_flush_ready(disp); - return; - } - - int32_t w = lv_area_get_width(area); - int32_t h = lv_area_get_height(area); - lv_color_format_t cf = lv_display_get_color_format(disp); - uint32_t px_size = lv_color_format_get_size(cf); - - lv_area_t rotated_area; - lv_display_rotation_t rotation = lv_display_get_rotation(disp); - - /* Not all framebuffer kernel drivers support hardware rotation, so we need to handle it in software here */ - if(rotation != LV_DISPLAY_ROTATION_0 && LV_LINUX_FBDEV_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { - /* (Re)allocate temporary buffer if needed */ - size_t buf_size = w * h * px_size; - if(!dsc->rotated_buf || dsc->rotated_buf_size != buf_size) { - dsc->rotated_buf = realloc(dsc->rotated_buf, buf_size); - dsc->rotated_buf_size = buf_size; - } - - /* Rotate the pixel buffer */ - uint32_t w_stride = lv_draw_buf_width_to_stride(w, cf); - uint32_t h_stride = lv_draw_buf_width_to_stride(h, cf); - - switch(rotation) { - case LV_DISPLAY_ROTATION_0: - break; - case LV_DISPLAY_ROTATION_90: - lv_draw_sw_rotate(color_p, dsc->rotated_buf, w, h, w_stride, h_stride, rotation, cf); - break; - case LV_DISPLAY_ROTATION_180: - lv_draw_sw_rotate(color_p, dsc->rotated_buf, w, h, w_stride, w_stride, rotation, cf); - break; - case LV_DISPLAY_ROTATION_270: - lv_draw_sw_rotate(color_p, dsc->rotated_buf, w, h, w_stride, h_stride, rotation, cf); - break; - } - color_p = dsc->rotated_buf; - - /* Rotate the area */ - rotated_area = *area; - lv_display_rotate_area(disp, &rotated_area); - area = &rotated_area; - - if(rotation != LV_DISPLAY_ROTATION_180) { - w = lv_area_get_width(area); - h = lv_area_get_height(area); - } - } - - /* Ensure that we're within the framebuffer's bounds */ - if(area->x2 < 0 || area->y2 < 0 || area->x1 > (int32_t)dsc->vinfo.xres - 1 || area->y1 > (int32_t)dsc->vinfo.yres - 1) { - lv_display_flush_ready(disp); - return; - } - - uint32_t fb_pos = - (area->x1 + dsc->vinfo.xoffset) * px_size + - (area->y1 + dsc->vinfo.yoffset) * dsc->finfo.line_length; - - uint8_t * fbp = (uint8_t *)dsc->fbp; - int32_t y; - if(LV_LINUX_FBDEV_RENDER_MODE == LV_DISPLAY_RENDER_MODE_DIRECT) { - uint32_t color_pos = - area->x1 * px_size + - area->y1 * disp->hor_res * px_size; - - for(y = area->y1; y <= area->y2; y++) { - lv_memcpy(&fbp[fb_pos], &color_p[color_pos], w * px_size); - fb_pos += dsc->finfo.line_length; - color_pos += disp->hor_res * px_size; - } - } - else { - w = lv_area_get_width(area); - for(y = area->y1; y <= area->y2; y++) { - lv_memcpy(&fbp[fb_pos], color_p, w * px_size); - fb_pos += dsc->finfo.line_length; - color_p += w * px_size; - } - } - - if(dsc->force_refresh) { - dsc->vinfo.activate |= FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; - if(ioctl(dsc->fbfd, FBIOPUT_VSCREENINFO, &(dsc->vinfo)) == -1) { - perror("Error setting var screen info"); - } - } - - lv_display_flush_ready(disp); -} - -static uint32_t tick_get_cb(void) -{ - struct timespec t; - clock_gettime(CLOCK_MONOTONIC, &t); - uint64_t time_ms = t.tv_sec * 1000 + (t.tv_nsec / 1000000); - return time_ms; -} - -#endif /*LV_USE_LINUX_FBDEV*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/fb/lv_linux_fbdev.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/fb/lv_linux_fbdev.h deleted file mode 100644 index 2c41aec..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/fb/lv_linux_fbdev.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file lv_linux_fbdev.h - * - */ - -#ifndef LV_LINUX_FBDEV_H -#define LV_LINUX_FBDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../../display/lv_display.h" - -#if LV_USE_LINUX_FBDEV - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ -lv_display_t * lv_linux_fbdev_create(void); - -void lv_linux_fbdev_set_file(lv_display_t * disp, const char * file); - -/** - * Force the display to be refreshed on every change. - * Expected to be used with LV_DISPLAY_RENDER_MODE_DIRECT or LV_DISPLAY_RENDER_MODE_FULL. - */ -void lv_linux_fbdev_set_force_refresh(lv_display_t * disp, bool enabled); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_LINUX_FBDEV */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_LINUX_FBDEV_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/ili9341/lv_ili9341.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/ili9341/lv_ili9341.c deleted file mode 100644 index a6b2acf..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/ili9341/lv_ili9341.c +++ /dev/null @@ -1,117 +0,0 @@ -/** - * @file lv_ili9341.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_ili9341.h" - -#if LV_USE_ILI9341 - -/********************* - * DEFINES - *********************/ - -#define CMD_FRMCTR1 0xB1 /* Frame Rate Control (In Normal Mode/Full Colors) */ -#define CMD_FRMCTR2 0xB2 /* Frame Rate Control (In Idle Mode/8 colors) */ -#define CMD_FRMCTR3 0xB3 /* Frame Rate control (In Partial Mode/Full Colors) */ -#define CMD_INVCTR 0xB4 /* Display Inversion Control */ -#define CMD_DFUNCTR 0xB6 /* Display Function Control */ -#define CMD_PWCTR1 0xC0 /* Power Control 1 */ -#define CMD_PWCTR2 0xC1 /* Power Control 2 */ -#define CMD_VMCTR1 0xC5 /* VCOM Control 1 */ -#define CMD_VMCTR2 0xC7 /* VCOM Control 2 */ -#define CMD_PWCTRA 0xCB /* Power Control A */ -#define CMD_PWCTRB 0xCF /* Power Control B */ -#define CMD_GMCTRP1 0xE0 /* Positive Gamma Correction */ -#define CMD_GMCTRN1 0xE1 /* Negative Gamma Correction */ -#define CMD_DTCTRA 0xE8 /* Driver timing control A */ -#define CMD_DTCTRB 0xEA /* Driver timing control B */ -#define CMD_PONSEQ 0xED /* Power On Sequence */ -#define CMD_RDINDEX 0xD9 /* ili9341 */ -#define CMD_IDXRD 0xDD /* ILI9341 only, indexed control register read */ -#define CMD_ENA3G 0xF2 /* Enable 3 Gamma control */ -#define CMD_IFCTR 0xF6 /* Interface Control */ -#define CMD_PRCTR 0xF7 /* Pump ratio control */ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC CONSTANTS - **********************/ - -/* init commands based on LovyanGFX ILI9341 driver */ -static const uint8_t init_cmd_list[] = { - CMD_PWCTRB, 3, 0x00, 0xC1, 0x30, - CMD_PONSEQ, 4, 0x64, 0x03, 0x12, 0x81, - CMD_DTCTRA, 3, 0x85, 0x00, 0x78, - CMD_PWCTRA, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, - CMD_PRCTR, 1, 0x20, - CMD_DTCTRB, 2, 0x00, 0x00, - CMD_PWCTR1, 1, 0x23, - CMD_PWCTR2, 1, 0x10, - CMD_VMCTR1, 2, 0x3e, 0x28, - CMD_VMCTR2, 1, 0x86, - CMD_FRMCTR1, 2, 0x00, 0x13, - CMD_DFUNCTR, 2, 0x0A, 0xA2, - CMD_IFCTR, 3, 0x09, 0x30, 0x00, - CMD_ENA3G, 1, 0x00, - LV_LCD_CMD_SET_GAMMA_CURVE, 1, 0x01, - CMD_GMCTRP1, 15, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00, - CMD_GMCTRN1, 15, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F, - LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF -}; - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_ili9341_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, - lv_ili9341_send_cmd_cb_t send_cmd_cb, lv_ili9341_send_color_cb_t send_color_cb) -{ - lv_display_t * disp = lv_lcd_generic_mipi_create(hor_res, ver_res, flags, send_cmd_cb, send_color_cb); - lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list); - return disp; -} - -void lv_ili9341_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) -{ - lv_lcd_generic_mipi_set_gap(disp, x, y); -} - -void lv_ili9341_set_invert(lv_display_t * disp, bool invert) -{ - lv_lcd_generic_mipi_set_invert(disp, invert); -} - -void lv_ili9341_set_gamma_curve(lv_display_t * disp, uint8_t gamma) -{ - lv_lcd_generic_mipi_set_gamma_curve(disp, gamma); -} - -void lv_ili9341_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) -{ - lv_lcd_generic_mipi_send_cmd_list(disp, cmd_list); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_ILI9341*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/ili9341/lv_ili9341.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/ili9341/lv_ili9341.h deleted file mode 100644 index 78e9030..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/ili9341/lv_ili9341.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - * @file lv_ili9341.h - * - * This driver is just a wrapper around the generic MIPI compatible LCD controller driver - * - */ - -#ifndef LV_ILI9341_H -#define LV_ILI9341_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../lcd/lv_lcd_generic_mipi.h" - -#if LV_USE_ILI9341 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef lv_lcd_send_cmd_cb_t lv_ili9341_send_cmd_cb_t; -typedef lv_lcd_send_color_cb_t lv_ili9341_send_color_cb_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an LCD display with ILI9341 driver - * @param hor_res horizontal resolution - * @param ver_res vertical resolution - * @param flags default configuration settings (mirror, RGB ordering, etc.) - * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) - * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) - * @return pointer to the created display - */ -lv_display_t * lv_ili9341_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, - lv_ili9341_send_cmd_cb_t send_cmd_cb, lv_ili9341_send_color_cb_t send_color_cb); - -/** - * Set gap, i.e., the offset of the (0,0) pixel in the VRAM - * @param disp display object - * @param x x offset - * @param y y offset - */ -void lv_ili9341_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); - -/** - * Set color inversion - * @param disp display object - * @param invert false: normal, true: invert - */ -void lv_ili9341_set_invert(lv_display_t * disp, bool invert); - -/** - * Set gamma curve - * @param disp display object - * @param gamma gamma curve - */ -void lv_ili9341_set_gamma_curve(lv_display_t * disp, uint8_t gamma); - -/** - * Send list of commands. - * @param disp display object - * @param cmd_list controller and panel-specific commands - */ -void lv_ili9341_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); - -/********************** - * OTHERS - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_USE_ILI9341*/ - -#endif /* LV_ILI9341_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/lcd/lv_lcd_generic_mipi.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/lcd/lv_lcd_generic_mipi.c deleted file mode 100644 index e27e4c8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/lcd/lv_lcd_generic_mipi.c +++ /dev/null @@ -1,340 +0,0 @@ -/** - * @file lv_lcd_generic_mipi.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_lcd_generic_mipi.h" - -#if LV_USE_GENERIC_MIPI - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void send_cmd(lv_lcd_generic_mipi_driver_t * drv, uint8_t cmd, uint8_t * param, size_t param_size); -static void send_color(lv_lcd_generic_mipi_driver_t * drv, uint8_t cmd, uint8_t * param, size_t param_size); -static void init(lv_lcd_generic_mipi_driver_t * drv, lv_lcd_flag_t flags); -static void set_mirror(lv_lcd_generic_mipi_driver_t * drv, bool mirror_x, bool mirror_y); -static void set_swap_xy(lv_lcd_generic_mipi_driver_t * drv, bool swap); -static void set_rotation(lv_lcd_generic_mipi_driver_t * drv, lv_display_rotation_t rot); -static void res_chg_event_cb(lv_event_t * e); -static lv_lcd_generic_mipi_driver_t * get_driver(lv_display_t * disp); -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_lcd_generic_mipi_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, - lv_lcd_send_cmd_cb_t send_cmd_cb, lv_lcd_send_color_cb_t send_color_cb) -{ - lv_display_t * disp = lv_display_create(hor_res, ver_res); - if(disp == NULL) { - return NULL; - } - - lv_lcd_generic_mipi_driver_t * drv = (lv_lcd_generic_mipi_driver_t *)lv_malloc(sizeof(lv_lcd_generic_mipi_driver_t)); - if(drv == NULL) { - lv_display_delete(disp); - return NULL; - } - - /* init driver struct */ - drv->disp = disp; - drv->send_cmd = send_cmd_cb; - drv->send_color = send_color_cb; - lv_display_set_driver_data(disp, (void *)drv); - - /* init controller */ - init(drv, flags); - - /* register resolution change callback (NOTE: this handles screen rotation as well) */ - lv_display_add_event_cb(disp, res_chg_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); - - /* register flush callback */ - lv_display_set_flush_cb(disp, flush_cb); - - return disp; -} - -void lv_lcd_generic_mipi_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) -{ - lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); - drv->x_gap = x; - drv->y_gap = y; -} - -void lv_lcd_generic_mipi_set_invert(lv_display_t * disp, bool invert) -{ - lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); - send_cmd(drv, invert ? LV_LCD_CMD_ENTER_INVERT_MODE : LV_LCD_CMD_EXIT_INVERT_MODE, NULL, 0); -} - -void lv_lcd_generic_mipi_set_address_mode(lv_display_t * disp, bool mirror_x, bool mirror_y, bool swap_xy, bool bgr) -{ - lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); - uint8_t mad = drv->madctl_reg & ~(LV_LCD_MASK_RGB_ORDER); - if(bgr) { - mad |= LV_LCD_BIT_RGB_ORDER__BGR; - } - drv->madctl_reg = mad; - drv->mirror_x = mirror_x; - drv->mirror_y = mirror_y; - drv->swap_xy = swap_xy; - set_rotation(drv, lv_display_get_rotation(disp)); /* update screen */ -} - -void lv_lcd_generic_mipi_set_gamma_curve(lv_display_t * disp, uint8_t gamma) -{ - lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); - send_cmd(drv, LV_LCD_CMD_SET_GAMMA_CURVE, (uint8_t[]) { - gamma, - }, 1); -} - -void lv_lcd_generic_mipi_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) -{ - lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); - while(1) { - uint8_t cmd = *cmd_list++; - uint8_t num = *cmd_list++; - if(cmd == LV_LCD_CMD_DELAY_MS) { - if(num == LV_LCD_CMD_EOF) /* end of list */ - break; - else { /* delay in 10 ms units*/ - lv_delay_ms((uint32_t)(num) * 10); - } - } - else { - drv->send_cmd(drv->disp, &cmd, 1, cmd_list, num); - cmd_list += num; - } - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Helper function to call the user-supplied 'send_cmd' function - * @param drv LCD driver object - * @param cmd command byte - * @param param parameter buffer - * @param param_size number of bytes of the parameters - */ -static void send_cmd(lv_lcd_generic_mipi_driver_t * drv, uint8_t cmd, uint8_t * param, size_t param_size) -{ - uint8_t cmdbuf = cmd; /* MIPI uses 8 bit commands */ - drv->send_cmd(drv->disp, &cmdbuf, 1, param, param_size); -} - -/** - * Helper function to call the user-supplied 'send_color' function - * @param drv LCD driver object - * @param cmd command byte - * @param param parameter buffer - * @param param_size number of bytes of the parameters - */ -static void send_color(lv_lcd_generic_mipi_driver_t * drv, uint8_t cmd, uint8_t * param, size_t param_size) -{ - uint8_t cmdbuf = cmd; /* MIPI uses 8 bit commands */ - drv->send_color(drv->disp, &cmdbuf, 1, param, param_size); -} - -/** - * Initialize LCD driver after a hard reset - * @param drv LCD driver object - */ -static void init(lv_lcd_generic_mipi_driver_t * drv, lv_lcd_flag_t flags) -{ - drv->x_gap = 0; - drv->y_gap = 0; - - /* init color mode and RGB order */ - drv->madctl_reg = flags & LV_LCD_FLAG_BGR ? LV_LCD_BIT_RGB_ORDER__BGR : LV_LCD_BIT_RGB_ORDER__RGB; - drv->colmod_reg = flags & LV_LCD_FLAG_RGB666 ? LV_LCD_PIXEL_FORMAT_RGB666 : LV_LCD_PIXEL_FORMAT_RGB565; - - /* init orientation */ - drv->mirror_x = flags & LV_LCD_FLAG_MIRROR_X; - drv->mirror_y = flags & LV_LCD_FLAG_MIRROR_Y; - drv->swap_xy = false; - /* update madctl_reg */ - set_swap_xy(drv, drv->swap_xy); - set_mirror(drv, drv->mirror_x, drv->mirror_y); - - /* enter sleep mode first */ - send_cmd(drv, LV_LCD_CMD_ENTER_SLEEP_MODE, NULL, 0); - lv_delay_ms(10); - - /* perform software reset */ - send_cmd(drv, LV_LCD_CMD_SOFT_RESET, NULL, 0); - lv_delay_ms(200); - - /* LCD goes into sleep mode and display will be turned off after power on reset, exit sleep mode first */ - send_cmd(drv, LV_LCD_CMD_EXIT_SLEEP_MODE, NULL, 0); - lv_delay_ms(300); - - send_cmd(drv, LV_LCD_CMD_ENTER_NORMAL_MODE, NULL, 0); - - send_cmd(drv, LV_LCD_CMD_SET_ADDRESS_MODE, (uint8_t[]) { - drv->madctl_reg, - }, 1); - send_cmd(drv, LV_LCD_CMD_SET_PIXEL_FORMAT, (uint8_t[]) { - drv->colmod_reg, - }, 1); - send_cmd(drv, LV_LCD_CMD_SET_DISPLAY_ON, NULL, 0); -} - -/** - * Set readout directions (used for rotating the display) - * @param drv LCD driver object - * @param mirror_x false: normal, true: mirrored - * @param mirror_y false: normal, true: mirrored - */ -static void set_mirror(lv_lcd_generic_mipi_driver_t * drv, bool mirror_x, bool mirror_y) -{ - uint8_t mad = drv->madctl_reg & ~(LV_LCD_MASK_COLUMN_ADDRESS_ORDER | LV_LCD_MASK_PAGE_ADDRESS_ORDER); - if(mirror_x) { - mad |= LV_LCD_BIT_COLUMN_ADDRESS_ORDER__RTOL; - } - if(mirror_y) { - mad |= LV_LCD_BIT_PAGE_ADDRESS_ORDER__BTOT; - } - drv->madctl_reg = mad; -} - -/** - * Swap horizontal and vertical readout (used for rotating the display) - * @param drv LCD driver object - * @param swap false: normal, true: swapped - */ -static void set_swap_xy(lv_lcd_generic_mipi_driver_t * drv, bool swap) -{ - uint8_t mad = drv->madctl_reg & ~(LV_LCD_MASK_PAGE_COLUMN_ORDER); - if(swap) { - mad |= LV_LCD_BIT_PAGE_COLUMN_ORDER__REVERSE; - } - drv->madctl_reg = mad; -} - -/** - * Flush display buffer to the LCD - * @param disp display object - * @param hor_res horizontal resolution - * @param area area stored in the buffer - * @param px_map buffer containing pixel data - * @note transfers pixel data to the LCD controller using the callbacks 'send_cmd' and 'send_color', which were - * passed to the 'lv_st7789_create()' function - */ -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) -{ - lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); - - int32_t x_start = area->x1; - int32_t x_end = area->x2 + 1; - int32_t y_start = area->y1; - int32_t y_end = area->y2 + 1; - - LV_ASSERT((x_start < x_end) && (y_start < y_end) && "start position must be smaller than end position"); - - x_start += drv->x_gap; - x_end += drv->x_gap; - y_start += drv->y_gap; - y_end += drv->y_gap; - - /* define an area of frame memory where MCU can access */ - send_cmd(drv, LV_LCD_CMD_SET_COLUMN_ADDRESS, (uint8_t[]) { - (x_start >> 8) & 0xFF, - x_start & 0xFF, - ((x_end - 1) >> 8) & 0xFF, - (x_end - 1) & 0xFF, - }, 4); - send_cmd(drv, LV_LCD_CMD_SET_PAGE_ADDRESS, (uint8_t[]) { - (y_start >> 8) & 0xFF, - y_start & 0xFF, - ((y_end - 1) >> 8) & 0xFF, - (y_end - 1) & 0xFF, - }, 4); - /* transfer frame buffer */ - size_t len = (x_end - x_start) * (y_end - y_start) * lv_color_format_get_size(lv_display_get_color_format(disp)); - send_color(drv, LV_LCD_CMD_WRITE_MEMORY_START, px_map, len); -} - -/** - * Set rotation taking into account the current mirror and swap settings - * @param drv LCD driver object - * @param rot rotation - */ -static void set_rotation(lv_lcd_generic_mipi_driver_t * drv, lv_display_rotation_t rot) -{ - switch(rot) { - case LV_DISPLAY_ROTATION_0: - set_swap_xy(drv, drv->swap_xy); - set_mirror(drv, drv->mirror_x, drv->mirror_y); - break; - case LV_DISPLAY_ROTATION_90: - set_swap_xy(drv, !drv->swap_xy); - set_mirror(drv, drv->mirror_x, !drv->mirror_y); - break; - case LV_DISPLAY_ROTATION_180: - set_swap_xy(drv, drv->swap_xy); - set_mirror(drv, !drv->mirror_x, !drv->mirror_y); - break; - case LV_DISPLAY_ROTATION_270: - set_swap_xy(drv, !drv->swap_xy); - set_mirror(drv, !drv->mirror_x, drv->mirror_y); - break; - } - send_cmd(drv, LV_LCD_CMD_SET_ADDRESS_MODE, (uint8_t[]) { - drv->madctl_reg - }, 1); -} - -/** - * Handle LV_EVENT_RESOLUTION_CHANGED event (handles both resolution and rotation change) - * @param e LV_EVENT_RESOLUTION_CHANGED event - */ -static void res_chg_event_cb(lv_event_t * e) -{ - lv_display_t * disp = lv_event_get_current_target(e); - lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); - - uint16_t hor_res = lv_display_get_horizontal_resolution(disp); - uint16_t ver_res = lv_display_get_vertical_resolution(disp); - lv_display_rotation_t rot = lv_display_get_rotation(disp); - - /* TODO: implement resolution change */ - LV_UNUSED(hor_res); - LV_UNUSED(ver_res); - - /* handle rotation */ - set_rotation(drv, rot); -} - -static lv_lcd_generic_mipi_driver_t * get_driver(lv_display_t * disp) -{ - return (lv_lcd_generic_mipi_driver_t *)lv_display_get_driver_data(disp); -} - -#endif /*LV_USE_GENERIC_MIPI*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/lcd/lv_lcd_generic_mipi.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/lcd/lv_lcd_generic_mipi.h deleted file mode 100644 index 8daa5e0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/lcd/lv_lcd_generic_mipi.h +++ /dev/null @@ -1,241 +0,0 @@ -/** - * @file lv_lcd_generic_mipi.h - * - * Generic driver for controllers adhering to the MIPI DBI/DCS specification - * - * Works with: - * - * ST7735 - * ST7789 - * ST7796 - * ILI9341 - * ILI9488 (NOTE: in SPI mode ILI9488 only supports RGB666 mode, which is currently not supported) - * - * any probably many more - * - */ - -#ifndef LV_LCD_GENERIC_MIPI_H -#define LV_LCD_GENERIC_MIPI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../../display/lv_display.h" - -#if LV_USE_GENERIC_MIPI - -/********************* - * DEFINES - *********************/ - -/* MIPI DCS (Display Command Set) v1.02.00 User Command Set */ -#define LV_LCD_CMD_NOP 0x00 /* No Operation */ -#define LV_LCD_CMD_SOFT_RESET 0x01 /* Software Reset */ -#define LV_LCD_CMD_GET_POWER_MODE 0x0A /* Get the current power mode */ -#define LV_LCD_CMD_GET_ADDRESS_MODE 0x0B /* Get the data order for transfers from the Host to the display module and from the frame memory to the display device */ -#define LV_LCD_CMD_GET_PIXEL_FORMAT 0x0C /* Get the current pixel format */ -#define LV_LCD_CMD_GET_DISPLAY_MODE 0x0D /* Get the current display mode from the peripheral */ -#define LV_LCD_CMD_GET_SIGNAL_MODE 0x0E /* Get display module signaling mode */ -#define LV_LCD_CMD_GET_DIAGNOSTIC_RESULT 0x0F /* Get Peripheral Self-Diagnostic Result */ -#define LV_LCD_CMD_ENTER_SLEEP_MODE 0x10 /* Power for the display panel is off */ -#define LV_LCD_CMD_EXIT_SLEEP_MODE 0x11 /* Power for the display panel is on */ -#define LV_LCD_CMD_ENTER_PARTIAL_MODE 0x12 /* Part of the display area is used for image display */ -#define LV_LCD_CMD_ENTER_NORMAL_MODE 0x13 /* The whole display area is used for image display */ -#define LV_LCD_CMD_EXIT_INVERT_MODE 0x20 /* Displayed image colors are not inverted */ -#define LV_LCD_CMD_ENTER_INVERT_MODE 0x21 /* Displayed image colors are inverted */ -#define LV_LCD_CMD_SET_GAMMA_CURVE 0x26 /* Selects the gamma curve used by the display device */ -#define LV_LCD_CMD_SET_DISPLAY_OFF 0x28 /* Blanks the display device */ -#define LV_LCD_CMD_SET_DISPLAY_ON 0x29 /* Show the image on the display device */ -#define LV_LCD_CMD_SET_COLUMN_ADDRESS 0x2A /* Set the column extent */ -#define LV_LCD_CMD_SET_PAGE_ADDRESS 0x2B /* Set the page extent */ -#define LV_LCD_CMD_WRITE_MEMORY_START 0x2C /* Transfer image data from the Host Processor to the peripheral starting at the location provided by set_column_address and set_page_address */ -#define LV_LCD_CMD_READ_MEMORY_START 0x2E /* Transfer image data from the peripheral to the Host Processor interface starting at the location provided by set_column_address and set_page_address */ -#define LV_LCD_CMD_SET_PARTIAL_ROWS 0x30 /* Defines the number of rows in the partial display area on the display device */ -#define LV_LCD_CMD_SET_PARTIAL_COLUMNS 0x31 /* Defines the number of columns in the partial display area on the display device */ -#define LV_LCD_CMD_SET_SCROLL_AREA 0x33 /* Defines the vertical scrolling and fixed area on display device */ -#define LV_LCD_CMD_SET_TEAR_OFF 0x34 /* Synchronization information is not sent from the display module to the host processor */ -#define LV_LCD_CMD_SET_TEAR_ON 0x35 /* Synchronization information is sent from the display module to the host processor at the start of VFP */ -#define LV_LCD_CMD_SET_ADDRESS_MODE 0x36 /* Set the data order for transfers from the Host to the display module and from the frame memory to the display device */ -#define LV_LCD_CMD_SET_SCROLL_START 0x37 /* Defines the vertical scrolling starting point */ -#define LV_LCD_CMD_EXIT_IDLE_MODE 0x38 /* Full color depth is used on the display panel */ -#define LV_LCD_CMD_ENTER_IDLE_MODE 0x39 /* Reduced color depth is used on the display panel */ -#define LV_LCD_CMD_SET_PIXEL_FORMAT 0x3A /* Defines how many bits per pixel are used in the interface */ -#define LV_LCD_CMD_WRITE_MEMORY_CONTINUE 0x3C /* Transfer image information from the Host Processor interface to the peripheral from the last written location */ -#define LV_LCD_CMD_READ_MEMORY_CONTINUE 0x3E /* Read image data from the peripheral continuing after the last read_memory_continue or read_memory_start */ -#define LV_LCD_CMD_SET_TEAR_SCANLINE 0x44 /* Synchronization information is sent from the display module to the host processor when the display device refresh reaches the provided scanline */ -#define LV_LCD_CMD_GET_SCANLINE 0x45 /* Get the current scanline */ -#define LV_LCD_CMD_READ_DDB_CONTINUE 0xA8 /* Continue reading the DDB from the last read location */ -#define LV_LCD_CMD_READ_DDB_START 0xA1 /* Read the DDB from the provided location */ - -/* address mode flag masks */ -#define LV_LCD_MASK_FLIP_VERTICAL (1 << 0) /* This bit flips the image shown on the display device top to bottom. No change is made to the frame memory */ -#define LV_LCD_MASK_FLIP_HORIZONTAL (1 << 1) /* This bit flips the image shown on the display device left to right. No change is made to the frame memory */ -#define LV_LCD_MASK_DATA_LATCH_DATA_ORDER (1 << 2) /* Display Data Latch Order */ -#define LV_LCD_MASK_RGB_ORDER (1 << 3) /* RGB/BGR Order */ -#define LV_LCD_MASK_LINE_ADDRESS_ORDER (1 << 4) /* Line Address Order */ -#define LV_LCD_MASK_PAGE_COLUMN_ORDER (1 << 5) /* Page/Column Order */ -#define LV_LCD_MASK_COLUMN_ADDRESS_ORDER (1 << 6) /* Column Address Order */ -#define LV_LCD_MASK_PAGE_ADDRESS_ORDER (1 << 7) /* Page Address Order */ - -#define LV_LCD_BIT_FLIP_VERTICAL__NOT_FLIPPED 0 -#define LV_LCD_BIT_FLIP_VERTICAL__FLIPPED LV_LCD_MASK_FLIP_VERTICAL /* This bit flips the image shown on the display device top to bottom. No change is made to the frame memory */ -#define LV_LCD_BIT_FLIP_HORIZONTAL__NOT_FLIPPED 0 -#define LV_LCD_BIT_FLIP_HORIZONTAL__FLIPPED LV_LCD_MASK_FLIP_HORIZONTAL /* This bit flips the image shown on the display device left to right. No change is made to the frame memory */ -#define LV_LCD_BIT_DATA_LATCH_DATA_ORDER__LTOR 0 /* Display Data Latch Order: LCD Refresh Left to Right */ -#define LV_LCD_BIT_DATA_LATCH_DATA_ORDER__RTOL LV_LCD_MASK_DATA_LATCH_DATA_ORDER /* Display Data Latch Order: LCD Refresh Right to Left */ -#define LV_LCD_BIT_RGB_ORDER__RGB 0 /* RGB/BGR Order: RGB */ -#define LV_LCD_BIT_RGB_ORDER__BGR LV_LCD_MASK_RGB_ORDER /* RGB/BGR Order: BGR */ -#define LV_LCD_BIT_LINE_ADDRESS_ORDER__TTOB 0 /* Line Address Order: LCD Refresh Top to Bottom */ -#define LV_LCD_BIT_LINE_ADDRESS_ORDER__BTOT LV_LCD_MASK_LINE_ADDRESS_ORDER /* Line Address Order: LCD Refresh Bottom to Top */ -#define LV_LCD_BIT_PAGE_COLUMN_ORDER__NORMAL 0 /* Page/Column Order: Normal Mode */ -#define LV_LCD_BIT_PAGE_COLUMN_ORDER__REVERSE LV_LCD_MASK_PAGE_COLUMN_ORDER /* Page/Column Order: Reverse Mode */ -#define LV_LCD_BIT_COLUMN_ADDRESS_ORDER__LTOR 0 /* Column Address Order: Left to Right */ -#define LV_LCD_BIT_COLUMN_ADDRESS_ORDER__RTOL LV_LCD_MASK_COLUMN_ADDRESS_ORDER /* Column Address Order: Right to Left */ -#define LV_LCD_BIT_PAGE_ADDRESS_ORDER__TTOB 0 /* Page Address Order: Top to Bottom */ -#define LV_LCD_BIT_PAGE_ADDRESS_ORDER__BTOT LV_LCD_MASK_PAGE_ADDRESS_ORDER /* Page Address Order: Bottom to Top */ - -/* predefined gamma curves */ -#define LV_LCD_GAMMA_2_2 0x01 /* 2.2 */ -#define LV_LCD_GAMMA_1_8 0x02 /* 1.8 */ -#define LV_LCD_GAMMA_2_5 0x04 /* 2.5 */ -#define LV_LCD_GAMMA_1_0 0x08 /* 1.0 */ - -/* common pixel formats */ -#define LV_LCD_PIXEL_FORMAT_RGB565 0x55 /* bus: 16 bits, pixel: 16 bits */ -#define LV_LCD_PIXEL_FORMAT_RGB666 0x66 /* bus: 18 bits, pixel: 18 bits */ - -/* flags for lv_lcd_xxx_create() */ -#define LV_LCD_FLAG_NONE 0x00000000UL -#define LV_LCD_FLAG_MIRROR_X 0x00000001UL -#define LV_LCD_FLAG_MIRROR_Y 0x00000002UL -#define LV_LCD_FLAG_BGR 0x00000008UL -#define LV_LCD_FLAG_RGB666 0x00000010UL - -/* command list */ -#define LV_LCD_CMD_DELAY_MS 0xff -#define LV_LCD_CMD_EOF 0xff - -/********************** - * TYPEDEFS - **********************/ - -/** - * Configuration flags for lv_lcd_xxx_create() - * - */ -typedef uint32_t lv_lcd_flag_t; - -/** - * Prototype of a platform-dependent callback to transfer commands and data to the LCD controller. - * @param disp display object - * @param cmd command buffer (can handle 16 bit commands as well) - * @param cmd_size number of bytes of the command - * @param param parameter buffer - * @param param_size number of bytes of the parameters - */ -typedef void (*lv_lcd_send_cmd_cb_t)(lv_display_t * disp, const uint8_t * cmd, size_t cmd_size, const uint8_t * param, - size_t param_size); - -/** - * Prototype of a platform-dependent callback to transfer pixel data to the LCD controller. - * @param disp display object - * @param cmd command buffer (can handle 16 bit commands as well) - * @param cmd_size number of bytes of the command - * @param param parameter buffer - * @param param_size number of bytes of the parameters - */ -typedef void (*lv_lcd_send_color_cb_t)(lv_display_t * disp, const uint8_t * cmd, size_t cmd_size, uint8_t * param, - size_t param_size); - -/** - * Generic MIPI compatible LCD driver - */ -typedef struct { - lv_display_t * disp; /* the associated LVGL display object */ - lv_lcd_send_cmd_cb_t send_cmd; /* platform-specific implementation to send a command to the LCD controller */ - lv_lcd_send_color_cb_t send_color; /* platform-specific implementation to send pixel data to the LCD controller */ - uint16_t x_gap; /* x offset of the (0,0) pixel in VRAM */ - uint16_t y_gap; /* y offset of the (0,0) pixel in VRAM */ - uint8_t madctl_reg; /* current value of MADCTL register */ - uint8_t colmod_reg; /* current value of COLMOD register */ - bool mirror_x; - bool mirror_y; - bool swap_xy; -} lv_lcd_generic_mipi_driver_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a MIPI DCS compatible LCD display - * @param hor_res horizontal resolution - * @param ver_res vertical resolution - * @param flags default configuration settings (mirror, RGB ordering, etc.) - * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) - * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) - * @return pointer to the created display - */ -lv_display_t * lv_lcd_generic_mipi_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, - lv_lcd_send_cmd_cb_t send_cmd_cb, lv_lcd_send_color_cb_t send_color_cb); - -/** - * Set gap, i.e., the offset of the (0,0) pixel in the VRAM - * @param disp display object - * @param x x offset - * @param y y offset - */ -void lv_lcd_generic_mipi_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); - -/** - * Set color inversion - * @param disp display object - * @param invert false: normal, true: invert - */ -void lv_lcd_generic_mipi_set_invert(lv_display_t * disp, bool invert); - -/** - * Set address mode - * @param disp display object - * @param mirror_x horizontal mirror (false: normal, true: mirrored) - * @param mirror_y vertical mirror (false: normal, true: mirrored) - * @param swap_xy swap axes (false: normal, true: swap) - * @param bgr RGB/BGR order (false: RGB, true: BGR) - */ -void lv_lcd_generic_mipi_set_address_mode(lv_display_t * disp, bool mirror_x, bool mirror_y, bool swap_xy, bool bgr); - -/** - * Set gamma curve - * @param disp display object - * @param gamma gamma curve - */ -void lv_lcd_generic_mipi_set_gamma_curve(lv_display_t * disp, uint8_t gamma); - -/** - * Send list of commands. - * @param disp display object - * @param cmd_list controller and panel-specific commands - */ -void lv_lcd_generic_mipi_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); - -/********************** - * OTHERS - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_USE_GENERIC_MIPI*/ - -#endif /* LV_LCD_GENERIC_MIPI_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.c deleted file mode 100644 index 15b6784..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.c +++ /dev/null @@ -1,360 +0,0 @@ -/** - * @file lv_renesas_glcdc.c - * - */ - -/********************* - *PLATFORM ABSTRACTION - *********************/ - -#ifdef _RENESAS_RA_ - #define USE_FREE_RTOS (BSP_CFG_RTOS == 2) -#else // RX with SMC code generation - #ifndef _RENESAS_RX_ - #define _RENESAS_RX_ 1 - #endif - #define USE_FREE_RTOS 1 - #define DISPLAY_HSIZE_INPUT0 LCD_CH0_IN_GR2_HSIZE - #define DISPLAY_VSIZE_INPUT0 LCD_CH0_IN_GR2_VSIZE -#endif /*_RENESAS_RA_*/ - -/********************* - * INCLUDES - *********************/ -#include "lv_renesas_glcdc.h" - -#if LV_USE_RENESAS_GLCDC - -#ifdef _RENESAS_RA_ - #include "LVGL_thread.h" -#else /* RX */ - #include "hal_data.h" - #include "platform.h" - #include "r_glcdc_rx_if.h" - #include "r_glcdc_rx_pinset.h" -#endif /*_RENESAS_RA_*/ - -#include -#include "../../../display/lv_display_private.h" -#include "../../../draw/sw/lv_draw_sw.h" - -/********************* - * DEFINES - *********************/ -#define BYTES_PER_PIXEL 2 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_display_t * glcdc_create(void * buf1, void * buf2, uint32_t buf_size, lv_display_render_mode_t render_mode); -static void glcdc_init(void); -static void give_vsync_sem_and_yield(void); -static void flush_direct(lv_display_t * display, const lv_area_t * area, uint8_t * px_map); -static void flush_partial(lv_display_t * display, const lv_area_t * area, uint8_t * px_map); -static void flush_wait_direct(lv_display_t * display); -static void flush_wait_partial(lv_display_t * display); - -#ifdef _RENESAS_RX_ - static void enable_dave2d_drw_interrupt(void); -#endif /*_RENESAS_RX_*/ - -/********************** - * STATIC VARIABLES - **********************/ - -#ifdef _RENESAS_RX_ -static uint8_t fb_background[2][LCD_CH0_IN_GR2_HSIZE * LCD_CH0_IN_GR2_VSIZE * BYTES_PER_PIXEL]__attribute__(( - section(".framebuffer"), aligned(64), used)); -static SemaphoreHandle_t _SemaphoreVsync = NULL; -static glcdc_cfg_t g_config; -static glcdc_runtime_cfg_t g_layer_change; - -/* A global variable that Dave 2D driver relies on. (Being auto generated on RA platforms)*/ -display_t g_display0_cfg; -#endif /*_RENESAS_RX_*/ - -static void * rotation_buffer = NULL; -static uint32_t partial_buffer_size = 0; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_renesas_glcdc_direct_create(void) -{ - return glcdc_create(&fb_background[0][0], &fb_background[1][0], sizeof(fb_background[0]), - LV_DISPLAY_RENDER_MODE_DIRECT); -} - -lv_display_t * lv_renesas_glcdc_partial_create(void * buf1, void * buf2, size_t buf_size) -{ - partial_buffer_size = buf_size; - return glcdc_create(buf1, buf2, buf_size, LV_DISPLAY_RENDER_MODE_PARTIAL); -} - -/*This function is declared in and being used by FSP generated code modules*/ -#ifdef _RENESAS_RA_ -void glcdc_callback(display_callback_args_t * p_args) -{ - if(DISPLAY_EVENT_LINE_DETECTION == p_args->event) { - give_vsync_sem_and_yield(); - } - else if(DISPLAY_EVENT_GR1_UNDERFLOW == p_args->event) { - __BKPT(0); /*Layer 1 Underrun*/ - } - else if(DISPLAY_EVENT_GR2_UNDERFLOW == p_args->event) { - __BKPT(0); /*Layer 2 Underrun*/ - } - else { /*DISPLAY_EVENT_FRAME_END*/ - __BKPT(0); - } -} -#else /* RX */ -void glcdc_callback(glcdc_callback_args_t * p_args) -{ - if(GLCDC_EVENT_LINE_DETECTION == p_args->event) { - give_vsync_sem_and_yield(); - } - else if(GLCDC_EVENT_GR1_UNDERFLOW == p_args->event) { - while(1); /*Layer 1 Underrun*/ - } - else if(GLCDC_EVENT_GR2_UNDERFLOW == p_args->event) { - while(1); /*Layer 2 Underrun*/ - } - else {/*DISPLAY_EVENT_FRAME_END*/ - while(1); - } -} -#endif /*_RENESAS_RA_*/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static lv_display_t * glcdc_create(void * buf1, void * buf2, uint32_t buf_size, lv_display_render_mode_t render_mode) -{ -#ifdef _RENESAS_RA_ - glcdc_init(); -#else - g_display0_cfg.input->format = LCD_CH0_IN_GR2_FORMAT; - _SemaphoreVsync = xSemaphoreCreateBinary(); - - glcdc_init(); - enable_dave2d_drw_interrupt(); -#endif /*_RENESAS_RA_*/ - - lv_display_t * display = lv_display_create(DISPLAY_HSIZE_INPUT0, DISPLAY_VSIZE_INPUT0); - - if(render_mode == LV_DISPLAY_RENDER_MODE_DIRECT) { - lv_display_set_flush_cb(display, flush_direct); - lv_display_set_flush_wait_cb(display, flush_wait_direct); - } - else if(render_mode == LV_DISPLAY_RENDER_MODE_PARTIAL) { - lv_display_set_flush_cb(display, flush_partial); - lv_display_set_flush_wait_cb(display, flush_wait_partial); - } - else { - LV_ASSERT(0); - } - - lv_display_set_buffers(display, buf1, buf2, buf_size, render_mode); - - return display; -} - -static void give_vsync_sem_and_yield(void) -{ -#if USE_FREE_RTOS - BaseType_t context_switch; - - /*Set Vsync semaphore*/ - xSemaphoreGiveFromISR(_SemaphoreVsync, &context_switch); - - /*Return to the highest priority available task*/ - portYIELD_FROM_ISR(context_switch); -#else -#endif /*USE_FREE_RTOS*/ -} - -static void glcdc_init(void) -{ - /* Fill the Frame buffer with black colour (0x0000 in RGB565), for a clean start after previous runs */ - lv_memzero(fb_background, sizeof(fb_background)); - -#ifdef _RENESAS_RA_ - /* Initialize GLCDC driver */ - uint8_t * p_fb = &fb_background[1][0]; - fsp_err_t err; - - err = R_GLCDC_Open(&g_display0_ctrl, &g_display0_cfg); - if(FSP_SUCCESS != err) { - __BKPT(0); - } - - err = R_GLCDC_Start(&g_display0_ctrl); - if(FSP_SUCCESS != err) { - __BKPT(0); - } - - do { - err = - R_GLCDC_BufferChange(&g_display0_ctrl, - (uint8_t *) p_fb, - (display_frame_layer_t) 0); - } while(FSP_ERR_INVALID_UPDATE_TIMING == err); -#else /* RX */ - glcdc_err_t err; - glcdc_runtime_cfg_t layer_change; - - R_GLCDC_PinSet(); - - err = R_GLCDC_Open(&g_config); - if(GLCDC_SUCCESS != err) { - while(1); - } - - err = R_GLCDC_Control(GLCDC_CMD_START_DISPLAY, &g_config); - if(GLCDC_SUCCESS != err) { - while(1); - } - - g_layer_change.input = g_config.input[GLCDC_FRAME_LAYER_2]; - g_layer_change.chromakey = g_config.chromakey[GLCDC_FRAME_LAYER_2]; - g_layer_change.blend = g_config.blend[GLCDC_FRAME_LAYER_2]; - - layer_change.input.p_base = (uint32_t *)&fb_background[1][0]; - - do { - err = R_GLCDC_LayerChange(GLCDC_FRAME_LAYER_2, &g_layer_change); - } while(GLCDC_ERR_INVALID_UPDATE_TIMING == err); -#endif /*_RENESAS_RA_*/ -} - -static void flush_direct(lv_display_t * display, const lv_area_t * area, uint8_t * px_map) -{ - FSP_PARAMETER_NOT_USED(area); - /*Display the frame buffer pointed by px_map*/ - - if(!lv_display_flush_is_last(display)) return; - -#if defined(RENESAS_CORTEX_M85) && (BSP_CFG_DCACHE_ENABLED) - /* Invalidate cache - so the HW can access any data written by the CPU */ - SCB_CleanInvalidateDCache_by_Addr(px_map, sizeof(fb_background[0])); -#endif - -#ifdef _RENESAS_RA_ - R_GLCDC_BufferChange(&g_display0_ctrl, - (uint8_t *) px_map, - (display_frame_layer_t) 0); -#else /* RX */ - glcdc_err_t err; - - g_layer_change.input.p_base = (uint32_t *)px_map; - - do { - err = R_GLCDC_LayerChange(GLCDC_FRAME_LAYER_2, &g_layer_change); - } while(GLCDC_ERR_INVALID_UPDATE_TIMING == err); -#endif /*_RENESAS_RA_*/ -} - -static void flush_wait_direct(lv_display_t * display) -{ - if(!lv_display_flush_is_last(display)) return; - -#if USE_FREE_RTOS - /*If Vsync semaphore has already been set, clear it then wait to avoid tearing*/ - if(uxSemaphoreGetCount(_SemaphoreVsync)) { - xSemaphoreTake(_SemaphoreVsync, 10); - } - - xSemaphoreTake(_SemaphoreVsync, portMAX_DELAY); -#endif /*USE_FREE_RTOS*/ - -} - -static void flush_partial(lv_display_t * display, const lv_area_t * area, uint8_t * px_map) -{ - uint16_t * img = (uint16_t *)px_map; - - lv_area_t rotated_area; - lv_color_format_t cf = lv_display_get_color_format(display); - lv_display_rotation_t rotation = lv_display_get_rotation(display); - - if(rotation != LV_DISPLAY_ROTATION_0) { - int32_t w = lv_area_get_width(area); - int32_t h = lv_area_get_height(area); - uint32_t w_stride = lv_draw_buf_width_to_stride(w, cf); - uint32_t h_stride = lv_draw_buf_width_to_stride(h, cf); - - // only allocate if rotation is actually being used - if(!rotation_buffer) { - rotation_buffer = lv_malloc(partial_buffer_size); - LV_ASSERT_MALLOC(rotation_buffer); - } - - if(rotation == LV_DISPLAY_ROTATION_180) - lv_draw_sw_rotate(img, rotation_buffer, w, h, w_stride, w_stride, rotation, cf); - else /* 90 or 270 */ - lv_draw_sw_rotate(img, rotation_buffer, w, h, w_stride, h_stride, rotation, cf); - - img = rotation_buffer; - - rotated_area = *area; - lv_display_rotate_area(display, &rotated_area); - area = &rotated_area; - } - - int32_t w = lv_area_get_width(area); - int32_t h = lv_area_get_height(area); - - uint16_t * fb = (uint16_t *)fb_background[1]; - - fb = fb + area->y1 * DISPLAY_HSIZE_INPUT0; - fb = fb + area->x1; - - int32_t i; - for(i = 0; i < h; i++) { - lv_memcpy(fb, img, w * BYTES_PER_PIXEL); - -#if defined(RENESAS_CORTEX_M85) && (BSP_CFG_DCACHE_ENABLED) - SCB_CleanInvalidateDCache_by_Addr(fb, w * BYTES_PER_PIXEL); -#endif - fb += DISPLAY_HSIZE_INPUT0; - img += w; - } -} - -static void flush_wait_partial(lv_display_t * display) -{ - LV_UNUSED(display); - - return; -} - -#ifdef _RENESAS_RX_ -extern void drw_int_isr(void); - -static void enable_dave2d_drw_interrupt(void) -{ - bsp_int_ctrl_t grpal1; - - /* Specify the priority of the group interrupt. */ - grpal1.ipl = 5; - - /* Use the BSP API to register the interrupt handler for DRW2D. */ - R_BSP_InterruptWrite(BSP_INT_SRC_AL1_DRW2D_DRW_IRQ, (bsp_int_cb_t)drw_int_isr); - - /* Use the BSP API to enable the group interrupt. */ - R_BSP_InterruptControl(BSP_INT_SRC_AL1_DRW2D_DRW_IRQ, BSP_INT_CMD_GROUP_INTERRUPT_ENABLE, (void *)&grpal1); -} -#endif /*_RENESAS_RX_*/ - -#endif /*LV_USE_RENESAS_GLCDC*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.h deleted file mode 100644 index 0558614..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @file lv_renesas_glcdc.h - * - */ - -#ifndef LV_RENESAS_GLCDC_H -#define LV_RENESAS_GLCDC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../../display/lv_display.h" - -#if LV_USE_RENESAS_GLCDC - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a display using Renesas' GLCDC peripherial in DIRECT render mode - * @return pointer to the created display - */ -lv_display_t * lv_renesas_glcdc_direct_create(void); - -/** - * Create a display using Renesas' GLCDC peripherial in PARTIAL render mode - * @param buf1 first buffer - * @param buf2 second buffer (can be `NULL`) - * @param buf_size buffer size in byte - * @return pointer to the created display - */ -lv_display_t * lv_renesas_glcdc_partial_create(void * buf1, void * buf2, size_t buf_size); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_RENESAS_GLCDC */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_RENESAS_GLCDC_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7735/lv_st7735.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7735/lv_st7735.c deleted file mode 100644 index 6b5e62d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7735/lv_st7735.c +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @file lv_st7735.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_st7735.h" - -#if LV_USE_ST7735 - -/********************* - * DEFINES - *********************/ - -#define CMD_GAMSET 0x26 - -#define CMD_FRMCTR1 0xB1 -#define CMD_FRMCTR2 0xB2 -#define CMD_FRMCTR3 0xB3 -#define CMD_INVCTR 0xB4 -#define CMD_DISSET5 0xB6 - -#define CMD_PWCTR1 0xC0 -#define CMD_PWCTR2 0xC1 -#define CMD_PWCTR3 0xC2 -#define CMD_PWCTR4 0xC3 -#define CMD_PWCTR5 0xC4 -#define CMD_VMCTR1 0xC5 -#define CMD_VMOFCTR 0xC7 - -#define CMD_NVFCTR1 0xD9 - -#define CMD_GMCTRP1 0xE0 -#define CMD_GMCTRN1 0xE1 - -#define CMD_PWCTR6 0xFC - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC CONSTANTS - **********************/ - -/* init commands for buydisplay.com ER-TFTM018-3 */ -static const uint8_t init_cmd_list[] = { - 0xB1, 3, 0x05, 0x3C, 0x3C, - 0xB2, 3, 0x05, 0x3C, 0x3C, - 0xB3, 6, 0x05, 0x3C, 0x3C, 0x05, 0x3C, 0x3C, - 0xB4, 1, 0x03, - 0xC0, 3, 0x28, 0x08, 0x04, - 0xC1, 1, 0XC0, - 0xC2, 2, 0x0D, 0x00, - 0xC3, 2, 0x8D, 0x2A, - 0xC4, 2, 0x8D, 0xEE, - 0xC5, 1, 0x10, - 0xE0, 16, 0x04, 0x22, 0x07, 0x0A, 0x2E, 0x30, 0x25, 0x2A, 0x28, 0x26, 0x2E, 0x3A, 0x00, 0x01, 0x03, 0x13, - 0xE1, 16, 0x04, 0x16, 0x06, 0x0D, 0x2D, 0x26, 0x23, 0x27, 0x27, 0x25, 0x2D, 0x3B, 0x00, 0x01, 0x04, 0x13, - LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF -}; - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_st7735_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, - lv_st7735_send_cmd_cb_t send_cmd_cb, lv_st7735_send_color_cb_t send_color_cb) -{ - lv_display_t * disp = lv_lcd_generic_mipi_create(hor_res, ver_res, flags, send_cmd_cb, send_color_cb); - lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list); - return disp; -} - -void lv_st7735_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) -{ - lv_lcd_generic_mipi_set_gap(disp, x, y); -} - -void lv_st7735_set_invert(lv_display_t * disp, bool invert) -{ - lv_lcd_generic_mipi_set_invert(disp, invert); -} - -void lv_st7735_set_gamma_curve(lv_display_t * disp, uint8_t gamma) -{ - lv_lcd_generic_mipi_set_gamma_curve(disp, gamma); -} - -void lv_st7735_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) -{ - lv_lcd_generic_mipi_send_cmd_list(disp, cmd_list); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_ST7735*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7735/lv_st7735.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7735/lv_st7735.h deleted file mode 100644 index 72dd1a9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7735/lv_st7735.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - * @file lv_st7735.h - * - * This driver is just a wrapper around the generic MIPI compatible LCD controller driver - * - */ - -#ifndef LV_ST7735_H -#define LV_ST7735_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../lcd/lv_lcd_generic_mipi.h" - -#if LV_USE_ST7735 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef lv_lcd_send_cmd_cb_t lv_st7735_send_cmd_cb_t; -typedef lv_lcd_send_color_cb_t lv_st7735_send_color_cb_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an LCD display with ST7735 driver - * @param hor_res horizontal resolution - * @param ver_res vertical resolution - * @param flags default configuration settings (mirror, RGB ordering, etc.) - * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) - * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) - * @return pointer to the created display - */ -lv_display_t * lv_st7735_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, - lv_st7735_send_cmd_cb_t send_cmd_cb, lv_st7735_send_color_cb_t send_color_cb); - -/** - * Set gap, i.e., the offset of the (0,0) pixel in the VRAM - * @param disp display object - * @param x x offset - * @param y y offset - */ -void lv_st7735_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); - -/** - * Set color inversion - * @param disp display object - * @param invert false: normal, true: invert - */ -void lv_st7735_set_invert(lv_display_t * disp, bool invert); - -/** - * Set gamma curve - * @param disp display object - * @param gamma gamma curve - */ -void lv_st7735_set_gamma_curve(lv_display_t * disp, uint8_t gamma); - -/** - * Send list of commands. - * @param disp display object - * @param cmd_list controller and panel-specific commands - */ -void lv_st7735_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); - -/********************** - * OTHERS - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_ST7735*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /* LV_ST7735_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7789/lv_st7789.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7789/lv_st7789.c deleted file mode 100644 index 76d08bf..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7789/lv_st7789.c +++ /dev/null @@ -1,116 +0,0 @@ -/** - * @file lv_st7789.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_st7789.h" - -#if LV_USE_ST7789 - -/********************* - * DEFINES - *********************/ - -#define CMD_FRMCTR1 0xB1 -#define CMD_FRMCTR2 0xB2 -#define CMD_FRMCTR3 0xB3 -#define CMD_INVCTR 0xB4 -#define CMD_DFUNCTR 0xB6 -#define CMD_ETMOD 0xB7 -#define CMD_PWCTR1 0xC0 -#define CMD_PWCTR2 0xC1 -#define CMD_PWCTR3 0xC2 -#define CMD_PWCTR4 0xC3 -#define CMD_PWCTR5 0xC4 -#define CMD_VMCTR 0xC5 -#define CMD_GMCTRP1 0xE0 -#define CMD_GMCTRN1 0xE1 -#define CMD_DOCA 0xE8 -#define CMD_CSCON 0xF0 - -#define CMD_RAMCTRL 0xB0 -#define CMD_PORCTRL 0xB2 /* Porch control */ -#define CMD_GCTRL 0xB7 /* Gate control */ -#define CMD_VCOMS 0xBB /* VCOMS setting */ -#define CMD_LCMCTRL 0xC0 /* LCM control */ -#define CMD_VDVVRHEN 0xC2 /* VDV and VRH command enable */ -#define CMD_VRHS 0xC3 /* VRH set */ -#define CMD_VDVSET 0xC4 /* VDV setting */ -#define CMD_FRCTR2 0xC6 /* FR Control 2 */ -#define CMD_PWCTRL1 0xD0 /* Power control 1 */ -#define CMD_PVGAMCTRL 0xE0 /* Positive Gamma Correction */ -#define CMD_NVGAMCTRL 0xE1 /* Negative Gamma Correction */ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC CONSTANTS - **********************/ - -/* init commands based on LovyanGFX ST7789 driver */ -static const uint8_t init_cmd_list[] = { - CMD_GCTRL, 1, 0x44, /* GCTRL -- panel dependent */ - CMD_VCOMS, 1, 0x24, /* VCOMS -- panel dependent */ - CMD_VRHS, 1, 0x13, /* VRHS - panel dependent */ - CMD_PWCTRL1, 2, 0xa4, 0xa1, - CMD_RAMCTRL, 2, 0x00, 0xC0, /* controls mapping of RGB565 to RGB666 */ - CMD_PVGAMCTRL, 14, 0xd0, 0x00, 0x02, 0x07, 0x0a, 0x28, 0x32, 0x44, 0x42, 0x06, 0x0e, 0x12, 0x14, 0x17, - CMD_NVGAMCTRL, 14, 0xd0, 0x00, 0x02, 0x07, 0x0a, 0x28, 0x31, 0x54, 0x47, 0x0e, 0x1c, 0x17, 0x1b, 0x1e, - LV_LCD_CMD_SET_GAMMA_CURVE, 1, 0x01, - LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF -}; - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_st7789_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, - lv_st7789_send_cmd_cb_t send_cmd_cb, lv_st7789_send_color_cb_t send_color_cb) -{ - lv_display_t * disp = lv_lcd_generic_mipi_create(hor_res, ver_res, flags, send_cmd_cb, send_color_cb); - lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list); - return disp; -} - -void lv_st7789_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) -{ - lv_lcd_generic_mipi_set_gap(disp, x, y); -} - -void lv_st7789_set_invert(lv_display_t * disp, bool invert) -{ - lv_lcd_generic_mipi_set_invert(disp, invert); -} - -void lv_st7789_set_gamma_curve(lv_display_t * disp, uint8_t gamma) -{ - lv_lcd_generic_mipi_set_gamma_curve(disp, gamma); -} - -void lv_st7789_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) -{ - lv_lcd_generic_mipi_send_cmd_list(disp, cmd_list); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_ST7789*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7789/lv_st7789.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7789/lv_st7789.h deleted file mode 100644 index 5f1acad..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7789/lv_st7789.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - * @file lv_st7789.h - * - * This driver is just a wrapper around the generic MIPI compatible LCD controller driver - * - */ - -#ifndef LV_ST7789_H -#define LV_ST7789_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../lcd/lv_lcd_generic_mipi.h" - -#if LV_USE_ST7789 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef lv_lcd_send_cmd_cb_t lv_st7789_send_cmd_cb_t; -typedef lv_lcd_send_color_cb_t lv_st7789_send_color_cb_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an LCD display with ST7789 driver - * @param hor_res horizontal resolution - * @param ver_res vertical resolution - * @param flags default configuration settings (mirror, RGB ordering, etc.) - * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) - * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) - * @return pointer to the created display - */ -lv_display_t * lv_st7789_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, - lv_st7789_send_cmd_cb_t send_cmd_cb, lv_st7789_send_color_cb_t send_color_cb); - -/** - * Set gap, i.e., the offset of the (0,0) pixel in the VRAM - * @param disp display object - * @param x x offset - * @param y y offset - */ -void lv_st7789_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); - -/** - * Set color inversion - * @param disp display object - * @param invert false: normal, true: invert - */ -void lv_st7789_set_invert(lv_display_t * disp, bool invert); - -/** - * Set gamma curve - * @param disp display object - * @param gamma gamma curve - */ -void lv_st7789_set_gamma_curve(lv_display_t * disp, uint8_t gamma); - -/** - * Send list of commands. - * @param disp display object - * @param cmd_list controller and panel-specific commands - */ -void lv_st7789_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); - -/********************** - * OTHERS - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_USE_ST7789*/ - -#endif //LV_ST7789_H diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7796/lv_st7796.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7796/lv_st7796.c deleted file mode 100644 index 985b39f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7796/lv_st7796.c +++ /dev/null @@ -1,121 +0,0 @@ -/** - * @file lv_st7796.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_st7796.h" - -#if LV_USE_ST7796 - -/********************* - * DEFINES - *********************/ - -#define CMD_FRMCTR1 0xB1 -#define CMD_FRMCTR2 0xB2 -#define CMD_FRMCTR3 0xB3 -#define CMD_INVCTR 0xB4 -#define CMD_DFUNCTR 0xB6 -#define CMD_ETMOD 0xB7 -#define CMD_PWCTR1 0xC0 -#define CMD_PWCTR2 0xC1 -#define CMD_PWCTR3 0xC2 -#define CMD_PWCTR4 0xC3 -#define CMD_PWCTR5 0xC4 -#define CMD_VMCTR 0xC5 -#define CMD_GMCTRP1 0xE0 -#define CMD_GMCTRN1 0xE1 -#define CMD_DOCA 0xE8 -#define CMD_CSCON 0xF0 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC CONSTANTS - **********************/ - -/* init commands based on LovyanGFX */ -static const uint8_t init_cmd_list[] = { - CMD_CSCON, 1, 0xC3, /* Enable extension command 2 partI */ - CMD_CSCON, 1, 0x96, /* Enable extension command 2 partII */ - CMD_INVCTR, 1, 0x01, /* 1-dot inversion */ - CMD_DFUNCTR, 3, 0x80, /* Display Function Control: Bypass */ - 0x22, /* Source Output Scan from S1 to S960, Gate Output scan from G1 to G480, scan cycle = 2 */ - 0x3B, /* LCD Drive Line = 8 * (59 + 1) */ - CMD_DOCA, 8, 0x40, 0x8A, 0x00, 0x00, - 0x29, /* Source equalizing period time = 22.5 us */ - 0x19, /* Timing for "Gate start" = 25 (Tclk) */ - 0xA5, /* Timing for "Gate End" = 37 (Tclk), Gate driver EQ function ON */ - 0x33, - CMD_PWCTR2, 1, 0x06, /* Power control2: VAP(GVDD) = 3.85 + (vcom + vcom offset), VAN(GVCL) = -3.85 + (vcom + vcom offset) */ - CMD_PWCTR3, 1, 0xA7, /* Power control 3: Source driving current level = low, Gamma driving current level = High */ - CMD_VMCTR, 1, 0x18, /* VCOM Control: VCOM = 0.9 */ - LV_LCD_CMD_DELAY_MS, 12, /* delay 120 ms */ - CMD_GMCTRP1, 14, /* Gamma */ - 0xF0, 0x09, 0x0B, 0x06, 0x04, 0x15, 0x2F, - 0x54, 0x42, 0x3C, 0x17, 0x14, 0x18, 0x1B, - CMD_GMCTRN1, 14, - 0xE0, 0x09, 0x0B, 0x06, 0x04, 0x03, 0x2B, - 0x43, 0x42, 0x3B, 0x16, 0x14, 0x17, 0x1B, - LV_LCD_CMD_DELAY_MS, 12, /* delay 120 ms */ - CMD_CSCON, 1, 0x3C, /* Disable extension command 2 partI */ - CMD_CSCON, 1, 0x69, /* Disable extension command 2 partII */ - LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF -}; - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_st7796_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, - lv_st7796_send_cmd_cb_t send_cmd_cb, lv_st7796_send_color_cb_t send_color_cb) -{ - lv_display_t * disp = lv_lcd_generic_mipi_create(hor_res, ver_res, flags, send_cmd_cb, send_color_cb); - lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list); - return disp; -} - -void lv_st7796_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) -{ - lv_lcd_generic_mipi_set_gap(disp, x, y); -} - -void lv_st7796_set_invert(lv_display_t * disp, bool invert) -{ - lv_lcd_generic_mipi_set_invert(disp, invert); -} - -void lv_st7796_set_gamma_curve(lv_display_t * disp, uint8_t gamma) -{ - /* NOTE: the generic method is not supported on ST7796, TODO: implement gamma tables */ - LV_UNUSED(disp); - LV_UNUSED(gamma); -} - -void lv_st7796_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) -{ - lv_lcd_generic_mipi_send_cmd_list(disp, cmd_list); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_ST7796*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7796/lv_st7796.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7796/lv_st7796.h deleted file mode 100644 index 924eecb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/st7796/lv_st7796.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - * @file lv_st7796.h - * - * This driver is just a wrapper around the generic MIPI compatible LCD controller driver - * - */ - -#ifndef LV_ST7796_H -#define LV_ST7796_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../lcd/lv_lcd_generic_mipi.h" - -#if LV_USE_ST7796 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef lv_lcd_send_cmd_cb_t lv_st7796_send_cmd_cb_t; -typedef lv_lcd_send_color_cb_t lv_st7796_send_color_cb_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an LCD display with ST7796 driver - * @param hor_res horizontal resolution - * @param ver_res vertical resolution - * @param flags default configuration settings (mirror, RGB ordering, etc.) - * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) - * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) - * @return pointer to the created display - */ -lv_display_t * lv_st7796_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, - lv_st7796_send_cmd_cb_t send_cmd_cb, lv_st7796_send_color_cb_t send_color_cb); - -/** - * Set gap, i.e., the offset of the (0,0) pixel in the VRAM - * @param disp display object - * @param x x offset - * @param y y offset - */ -void lv_st7796_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); - -/** - * Set color inversion - * @param disp display object - * @param invert false: normal, true: invert - */ -void lv_st7796_set_invert(lv_display_t * disp, bool invert); - -/** - * Set gamma curve - * @param disp display object - * @param gamma gamma curve - */ -void lv_st7796_set_gamma_curve(lv_display_t * disp, uint8_t gamma); - -/** - * Send list of commands. - * @param disp display object - * @param cmd_list controller and panel-specific commands - */ -void lv_st7796_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); - -/********************** - * OTHERS - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_USE_ST7796*/ - -#endif /* LV_ST7796_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/tft_espi/lv_tft_espi.cpp b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/tft_espi/lv_tft_espi.cpp deleted file mode 100644 index 1cb7b45..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/tft_espi/lv_tft_espi.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @file lv_tft_espi.cpp - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_tft_espi.h" -#if LV_USE_TFT_ESPI - -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - TFT_eSPI * tft; -} lv_tft_espi_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); -static void resolution_changed_event_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_tft_espi_create(uint32_t hor_res, uint32_t ver_res, void * buf, uint32_t buf_size_bytes) -{ - lv_tft_espi_t * dsc = (lv_tft_espi_t *)lv_malloc_zeroed(sizeof(lv_tft_espi_t)); - LV_ASSERT_MALLOC(dsc); - if(dsc == NULL) return NULL; - - lv_display_t * disp = lv_display_create(hor_res, ver_res); - if(disp == NULL) { - lv_free(dsc); - return NULL; - } - - dsc->tft = new TFT_eSPI(hor_res, ver_res); - dsc->tft->begin(); /* TFT init */ - dsc->tft->setRotation(0); - lv_display_set_driver_data(disp, (void *)dsc); - lv_display_set_flush_cb(disp, flush_cb); - lv_display_add_event_cb(disp, resolution_changed_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); - lv_display_set_buffers(disp, (void *)buf, NULL, buf_size_bytes, LV_DISPLAY_RENDER_MODE_PARTIAL); - return disp; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) -{ - lv_tft_espi_t * dsc = (lv_tft_espi_t *)lv_display_get_driver_data(disp); - - uint32_t w = (area->x2 - area->x1 + 1); - uint32_t h = (area->y2 - area->y1 + 1); - - dsc->tft->startWrite(); - dsc->tft->setAddrWindow(area->x1, area->y1, w, h); - dsc->tft->pushColors((uint16_t *)px_map, w * h, true); - dsc->tft->endWrite(); - - lv_display_flush_ready(disp); - -} - -static void resolution_changed_event_cb(lv_event_t * e) -{ - lv_display_t * disp = (lv_display_t *)lv_event_get_target(e); - lv_tft_espi_t * dsc = (lv_tft_espi_t *)lv_display_get_driver_data(disp); - int32_t hor_res = lv_display_get_horizontal_resolution(disp); - int32_t ver_res = lv_display_get_vertical_resolution(disp); - lv_display_rotation_t rot = lv_display_get_rotation(disp); - - /* handle rotation */ - switch(rot) { - case LV_DISPLAY_ROTATION_0: - dsc->tft->setRotation(0); /* Portrait orientation */ - break; - case LV_DISPLAY_ROTATION_90: - dsc->tft->setRotation(1); /* Landscape orientation */ - break; - case LV_DISPLAY_ROTATION_180: - dsc->tft->setRotation(2); /* Portrait orientation, flipped */ - break; - case LV_DISPLAY_ROTATION_270: - dsc->tft->setRotation(3); /* Landscape orientation, flipped */ - break; - } -} - -#endif /*LV_USE_TFT_ESPI*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/tft_espi/lv_tft_espi.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/display/tft_espi/lv_tft_espi.h deleted file mode 100644 index a8f49f8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/display/tft_espi/lv_tft_espi.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @file lv_tft_espi.h - * - */ - -#ifndef LV_TFT_ESPI_H -#define LV_TFT_ESPI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../../display/lv_display.h" - -#if LV_USE_TFT_ESPI - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ -lv_display_t * lv_tft_espi_create(uint32_t hor_res, uint32_t ver_res, void * buf, uint32_t buf_size_bytes); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_TFT_ESPI */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_TFT_ESPI_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/evdev/lv_evdev.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/evdev/lv_evdev.c deleted file mode 100644 index e7d31ec..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/evdev/lv_evdev.c +++ /dev/null @@ -1,244 +0,0 @@ -/** - * @file lv_evdev.c - * - */ - -/********************** - * INCLUDES - **********************/ -#include "lv_evdev.h" -#if LV_USE_EVDEV - -#include -#include -#include -#include -#include /*To detect BSD*/ -#ifdef BSD - #include -#else - #include -#endif /*BSD*/ -#include "../../misc/lv_assert.h" -#include "../../misc/lv_math.h" -#include "../../stdlib/lv_mem.h" -#include "../../stdlib/lv_string.h" -#include "../../display/lv_display.h" - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - /*Device*/ - int fd; - /*Config*/ - bool swap_axes; - int min_x; - int min_y; - int max_x; - int max_y; - /*State*/ - int root_x; - int root_y; - int key; - lv_indev_state_t state; -} lv_evdev_t; - -/********************** - * STATIC FUNCTIONS - **********************/ - -static int _evdev_process_key(uint16_t code) -{ - switch(code) { - case KEY_UP: - return LV_KEY_UP; - case KEY_DOWN: - return LV_KEY_DOWN; - case KEY_RIGHT: - return LV_KEY_RIGHT; - case KEY_LEFT: - return LV_KEY_LEFT; - case KEY_ESC: - return LV_KEY_ESC; - case KEY_DELETE: - return LV_KEY_DEL; - case KEY_BACKSPACE: - return LV_KEY_BACKSPACE; - case KEY_ENTER: - return LV_KEY_ENTER; - case KEY_NEXT: - case KEY_TAB: - return LV_KEY_NEXT; - case KEY_PREVIOUS: - return LV_KEY_PREV; - case KEY_HOME: - return LV_KEY_HOME; - case KEY_END: - return LV_KEY_END; - default: - return 0; - } -} - -static int _evdev_calibrate(int v, int in_min, int in_max, int out_min, int out_max) -{ - if(in_min != in_max) v = (v - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; - return LV_CLAMP(out_min, v, out_max); -} - -static lv_point_t _evdev_process_pointer(lv_indev_t * indev, int x, int y) -{ - lv_display_t * disp = lv_indev_get_display(indev); - lv_evdev_t * dsc = lv_indev_get_driver_data(indev); - LV_ASSERT_NULL(dsc); - - int swapped_x = dsc->swap_axes ? y : x; - int swapped_y = dsc->swap_axes ? x : y; - - int offset_x = lv_display_get_offset_x(disp); - int offset_y = lv_display_get_offset_y(disp); - int width = lv_display_get_horizontal_resolution(disp); - int height = lv_display_get_vertical_resolution(disp); - - lv_point_t p; - p.x = _evdev_calibrate(swapped_x, dsc->min_x, dsc->max_x, offset_x, offset_x + width - 1); - p.y = _evdev_calibrate(swapped_y, dsc->min_y, dsc->max_y, offset_y, offset_y + height - 1); - return p; -} - -static void _evdev_read(lv_indev_t * indev, lv_indev_data_t * data) -{ - lv_evdev_t * dsc = lv_indev_get_driver_data(indev); - LV_ASSERT_NULL(dsc); - - /*Update dsc with buffered events*/ - struct input_event in = { 0 }; - while(read(dsc->fd, &in, sizeof(in)) > 0) { - if(in.type == EV_REL) { - if(in.code == REL_X) dsc->root_x += in.value; - else if(in.code == REL_Y) dsc->root_y += in.value; - } - else if(in.type == EV_ABS) { - if(in.code == ABS_X || in.code == ABS_MT_POSITION_X) dsc->root_x = in.value; - else if(in.code == ABS_Y || in.code == ABS_MT_POSITION_Y) dsc->root_y = in.value; - else if(in.code == ABS_MT_TRACKING_ID) { - if(in.value == -1) dsc->state = LV_INDEV_STATE_RELEASED; - else if(in.value == 0) dsc->state = LV_INDEV_STATE_PRESSED; - } - } - else if(in.type == EV_KEY) { - if(in.code == BTN_MOUSE || in.code == BTN_TOUCH) { - if(in.value == 0) dsc->state = LV_INDEV_STATE_RELEASED; - else if(in.value == 1) dsc->state = LV_INDEV_STATE_PRESSED; - } - else { - dsc->key = _evdev_process_key(in.code); - if(dsc->key) { - dsc->state = in.value ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; - data->continue_reading = true; /*Keep following events in buffer for now*/ - break; - } - } - } - } - - /*Process and store in data*/ - switch(lv_indev_get_type(indev)) { - case LV_INDEV_TYPE_KEYPAD: - data->state = dsc->state; - data->key = dsc->key; - break; - case LV_INDEV_TYPE_POINTER: - data->state = dsc->state; - data->point = _evdev_process_pointer(indev, dsc->root_x, dsc->root_y); - break; - default: - break; - } -} - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_indev_t * lv_evdev_create(lv_indev_type_t indev_type, const char * dev_path) -{ - lv_evdev_t * dsc = lv_malloc_zeroed(sizeof(lv_evdev_t)); - LV_ASSERT_MALLOC(dsc); - if(dsc == NULL) return NULL; - - dsc->fd = open(dev_path, O_RDONLY | O_NOCTTY | O_CLOEXEC); - if(dsc->fd < 0) { - LV_LOG_ERROR("open failed: %s", strerror(errno)); - goto err_after_malloc; - } - - if(fcntl(dsc->fd, F_SETFL, O_NONBLOCK) < 0) { - LV_LOG_ERROR("fcntl failed: %s", strerror(errno)); - goto err_after_open; - } - - /* Detect the minimum and maximum values of the input device for calibration. */ - - if(indev_type == LV_INDEV_TYPE_POINTER) { - struct input_absinfo absinfo; - if(ioctl(dsc->fd, EVIOCGABS(ABS_X), &absinfo) == 0) { - dsc->min_x = absinfo.minimum; - dsc->max_x = absinfo.maximum; - } - else { - LV_LOG_ERROR("ioctl EVIOCGABS(ABS_X) failed: %s", strerror(errno)); - } - if(ioctl(dsc->fd, EVIOCGABS(ABS_Y), &absinfo) == 0) { - dsc->min_y = absinfo.minimum; - dsc->max_y = absinfo.maximum; - } - else { - LV_LOG_ERROR("ioctl EVIOCGABS(ABS_Y) failed: %s", strerror(errno)); - } - } - - lv_indev_t * indev = lv_indev_create(); - if(indev == NULL) goto err_after_open; - lv_indev_set_type(indev, indev_type); - lv_indev_set_read_cb(indev, _evdev_read); - lv_indev_set_driver_data(indev, dsc); - return indev; - -err_after_open: - close(dsc->fd); -err_after_malloc: - lv_free(dsc); - return NULL; -} - -void lv_evdev_set_swap_axes(lv_indev_t * indev, bool swap_axes) -{ - lv_evdev_t * dsc = lv_indev_get_driver_data(indev); - LV_ASSERT_NULL(dsc); - dsc->swap_axes = swap_axes; -} - -void lv_evdev_set_calibration(lv_indev_t * indev, int min_x, int min_y, int max_x, int max_y) -{ - lv_evdev_t * dsc = lv_indev_get_driver_data(indev); - LV_ASSERT_NULL(dsc); - dsc->min_x = min_x; - dsc->min_y = min_y; - dsc->max_x = max_x; - dsc->max_y = max_y; -} - -void lv_evdev_delete(lv_indev_t * indev) -{ - lv_evdev_t * dsc = lv_indev_get_driver_data(indev); - LV_ASSERT_NULL(dsc); - close(dsc->fd); - lv_free(dsc); - - lv_indev_delete(indev); -} - -#endif /*LV_USE_EVDEV*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/evdev/lv_evdev.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/evdev/lv_evdev.h deleted file mode 100644 index 95ab154..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/evdev/lv_evdev.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @file lv_evdev.h - * - */ - -#ifndef LV_EVDEV_H -#define LV_EVDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../indev/lv_indev.h" - -#if LV_USE_EVDEV - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create evdev input device. - * @param type LV_INDEV_TYPE_POINTER or LV_INDEV_TYPE_KEYPAD - * @param dev_path device path, e.g., /dev/input/event0 - * @return pointer to input device or NULL if opening failed - */ -lv_indev_t * lv_evdev_create(lv_indev_type_t indev_type, const char * dev_path); - -/** - * Set whether coordinates of pointer device should be swapped. Defaults to - * false. - * @param indev evdev input device - * @param swap_axes whether to swap x and y axes - */ -void lv_evdev_set_swap_axes(lv_indev_t * indev, bool swap_axes); - -/** - * Configure a coordinate transformation for pointer devices. Applied after - * axis swap, if any. Defaults to apply no transformation. - * @param indev evdev input device - * @param min_x pointer coordinate mapped to min x of display - * @param min_y pointer coordinate mapped to min y of display - * @param max_x pointer coordinate mapped to max x of display - * @param max_y pointer coordinate mapped to max y of display - */ -void lv_evdev_set_calibration(lv_indev_t * indev, int min_x, int min_y, int max_x, int max_y); - -/** - * Remove evdev input device. - * @param indev evdev input device to close and free - */ -void lv_evdev_delete(lv_indev_t * indev); - -#endif /*LV_USE_EVDEV*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_EVDEV_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_glfw_window.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_glfw_window.c deleted file mode 100644 index 849cbf5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_glfw_window.c +++ /dev/null @@ -1,391 +0,0 @@ -/** - * @file lv_glfw_window.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_glfw_window_private.h" -#if LV_USE_OPENGLES -#include -#include "../../core/lv_refr.h" -#include "../../stdlib/lv_string.h" -#include "../../core/lv_global.h" -#include "../../display/lv_display_private.h" -#include "../../indev/lv_indev.h" -#include "../../lv_init.h" -#include "../../misc/lv_area_private.h" - -#include -#include - -#include "lv_opengles_driver.h" -#include "lv_opengles_texture.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void window_update_handler(lv_timer_t * t); -static uint32_t lv_glfw_tick_count_callback(void); -static lv_glfw_window_t * lv_glfw_get_lv_window_from_window(GLFWwindow * window); -static void glfw_error_cb(int error, const char * description); -static int lv_glfw_init(void); -static int lv_glew_init(void); -static void lv_glfw_timer_init(void); -static void lv_glfw_window_config(GLFWwindow * window, bool use_mouse_indev); -static void lv_glfw_window_quit(void); -static void window_close_callback(GLFWwindow * window); -static void key_callback(GLFWwindow * window, int key, int scancode, int action, int mods); -static void mouse_button_callback(GLFWwindow * window, int button, int action, int mods); -static void mouse_move_callback(GLFWwindow * window, double xpos, double ypos); -static void proc_mouse(lv_glfw_window_t * window); -static void indev_read_cb(lv_indev_t * indev, lv_indev_data_t * data); -static void framebuffer_size_callback(GLFWwindow * window, int width, int height); - -/********************** - * STATIC VARIABLES - **********************/ -static bool glfw_inited; -static bool glew_inited; -static lv_timer_t * update_handler_timer; -static lv_ll_t glfw_window_ll; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_glfw_window_t * lv_glfw_window_create(int32_t hor_res, int32_t ver_res, bool use_mouse_indev) -{ - if(lv_glfw_init() != 0) { - return NULL; - } - - lv_glfw_window_t * window = lv_ll_ins_tail(&glfw_window_ll); - LV_ASSERT_MALLOC(window); - if(window == NULL) return NULL; - lv_memzero(window, sizeof(*window)); - - /* Create window with graphics context */ - lv_glfw_window_t * existing_window = lv_ll_get_head(&glfw_window_ll); - window->window = glfwCreateWindow(hor_res, ver_res, "LVGL Simulator", NULL, - existing_window ? existing_window->window : NULL); - if(window->window == NULL) { - LV_LOG_ERROR("glfwCreateWindow fail."); - lv_ll_remove(&glfw_window_ll, window); - lv_free(window); - return NULL; - } - - window->hor_res = hor_res; - window->ver_res = ver_res; - lv_ll_init(&window->textures, sizeof(lv_glfw_texture_t)); - window->use_indev = use_mouse_indev; - - glfwSetWindowUserPointer(window->window, window); - lv_glfw_timer_init(); - lv_glfw_window_config(window->window, use_mouse_indev); - lv_glew_init(); - glfwMakeContextCurrent(window->window); - lv_opengles_init(); - - return window; -} - -void lv_glfw_window_delete(lv_glfw_window_t * window) -{ - glfwDestroyWindow(window->window); - if(window->use_indev) { - lv_glfw_texture_t * texture; - LV_LL_READ(&window->textures, texture) { - lv_indev_delete(texture->indev); - } - } - lv_ll_clear(&window->textures); - lv_ll_remove(&glfw_window_ll, window); - lv_free(window); - - if(lv_ll_is_empty(&glfw_window_ll)) { - lv_glfw_window_quit(); - } -} - -lv_glfw_texture_t * lv_glfw_window_add_texture(lv_glfw_window_t * window, unsigned int texture_id, int32_t w, int32_t h) -{ - lv_glfw_texture_t * texture = lv_ll_ins_tail(&window->textures); - LV_ASSERT_MALLOC(texture); - if(texture == NULL) return NULL; - lv_memzero(texture, sizeof(*texture)); - texture->window = window; - texture->texture_id = texture_id; - lv_area_set(&texture->area, 0, 0, w - 1, h - 1); - texture->opa = LV_OPA_COVER; - - if(window->use_indev) { - lv_display_t * texture_disp = lv_opengles_texture_get_from_texture_id(texture_id); - if(texture_disp != NULL) { - lv_indev_t * indev = lv_indev_create(); - if(indev == NULL) { - lv_ll_remove(&window->textures, texture); - lv_free(texture); - return NULL; - } - texture->indev = indev; - lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); - lv_indev_set_read_cb(indev, indev_read_cb); - lv_indev_set_driver_data(indev, texture); - lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); - lv_indev_set_display(indev, texture_disp); - } - } - - return texture; -} - -void lv_glfw_texture_remove(lv_glfw_texture_t * texture) -{ - if(texture->indev != NULL) { - lv_indev_delete(texture->indev); - } - lv_ll_remove(&texture->window->textures, texture); - lv_free(texture); -} - -void lv_glfw_texture_set_x(lv_glfw_texture_t * texture, int32_t x) -{ - lv_area_set_pos(&texture->area, x, texture->area.y1); -} - -void lv_glfw_texture_set_y(lv_glfw_texture_t * texture, int32_t y) -{ - lv_area_set_pos(&texture->area, texture->area.x1, y); -} - -void lv_glfw_texture_set_opa(lv_glfw_texture_t * texture, lv_opa_t opa) -{ - texture->opa = opa; -} - -lv_indev_t * lv_glfw_texture_get_mouse_indev(lv_glfw_texture_t * texture) -{ - return texture->indev; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static int lv_glfw_init(void) -{ - if(glfw_inited) { - return 0; - } - - glfwSetErrorCallback(glfw_error_cb); - - int ret = glfwInit(); - if(ret == 0) { - LV_LOG_ERROR("glfwInit fail."); - return 1; - } - - lv_ll_init(&glfw_window_ll, sizeof(lv_glfw_window_t)); - - glfw_inited = true; - return 0; -} - -static int lv_glew_init(void) -{ - if(glew_inited) { - return 0; - } - - GLenum ret = glewInit(); - if(ret != GLEW_OK) { - LV_LOG_ERROR("glewInit fail: %d.", ret); - return ret; - } - - LV_LOG_INFO("GL version: %s", glGetString(GL_VERSION)); - LV_LOG_INFO("GLSL version: %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); - - glew_inited = true; - - return 0; -} - -static void lv_glfw_timer_init(void) -{ - if(update_handler_timer == NULL) { - update_handler_timer = lv_timer_create(window_update_handler, LV_DEF_REFR_PERIOD, NULL); - lv_tick_set_cb(lv_glfw_tick_count_callback); - } -} - -static void lv_glfw_window_config(GLFWwindow * window, bool use_mouse_indev) -{ - glfwMakeContextCurrent(window); - - glfwSwapInterval(1); - - glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); - - if(use_mouse_indev) { - glfwSetMouseButtonCallback(window, mouse_button_callback); - glfwSetCursorPosCallback(window, mouse_move_callback); - } - - glfwSetKeyCallback(window, key_callback); - - glfwSetWindowCloseCallback(window, window_close_callback); -} - -static void lv_glfw_window_quit(void) -{ - lv_timer_delete(update_handler_timer); - update_handler_timer = NULL; - - glfwTerminate(); - glfw_inited = false; - - lv_deinit(); - - exit(0); -} - -static void window_update_handler(lv_timer_t * t) -{ - LV_UNUSED(t); - - lv_glfw_window_t * window; - - glfwPollEvents(); - - /* delete windows that are ready to close */ - window = lv_ll_get_head(&glfw_window_ll); - while(window) { - lv_glfw_window_t * window_to_delete = window->closing ? window : NULL; - window = lv_ll_get_next(&glfw_window_ll, window); - if(window_to_delete) { - glfwSetWindowShouldClose(window_to_delete->window, GLFW_TRUE); - lv_glfw_window_delete(window_to_delete); - } - } - - /* render each window */ - LV_LL_READ(&glfw_window_ll, window) { - glfwMakeContextCurrent(window->window); - lv_opengles_viewport(0, 0, window->hor_res, window->ver_res); - lv_opengles_render_clear(); - - /* render each texture in the window */ - lv_glfw_texture_t * texture; - LV_LL_READ(&window->textures, texture) { - /* if the added texture is an LVGL opengles texture display, refresh it before rendering it */ - lv_display_t * texture_disp = lv_opengles_texture_get_from_texture_id(texture->texture_id); - if(texture_disp != NULL) { - lv_refr_now(texture_disp); - } - - lv_opengles_render_texture(texture->texture_id, &texture->area, texture->opa, window->hor_res, window->ver_res); - } - - /* Swap front and back buffers */ - glfwSwapBuffers(window->window); - } -} - -static void glfw_error_cb(int error, const char * description) -{ - LV_LOG_ERROR("GLFW Error %d: %s", error, description); -} - -static lv_glfw_window_t * lv_glfw_get_lv_window_from_window(GLFWwindow * window) -{ - return glfwGetWindowUserPointer(window); -} - -static void window_close_callback(GLFWwindow * window) -{ - lv_glfw_window_t * lv_window = lv_glfw_get_lv_window_from_window(window); - lv_window->closing = 1; -} - -static void key_callback(GLFWwindow * window, int key, int scancode, int action, int mods) -{ - LV_UNUSED(scancode); - LV_UNUSED(mods); - if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) { - lv_glfw_window_t * lv_window = lv_glfw_get_lv_window_from_window(window); - lv_window->closing = 1; - } -} - -static void mouse_button_callback(GLFWwindow * window, int button, int action, int mods) -{ - LV_UNUSED(mods); - if(button == GLFW_MOUSE_BUTTON_LEFT) { - lv_glfw_window_t * lv_window = lv_glfw_get_lv_window_from_window(window); - lv_window->mouse_last_state = action == GLFW_PRESS ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; - proc_mouse(lv_window); - } -} - -static void mouse_move_callback(GLFWwindow * window, double xpos, double ypos) -{ - lv_glfw_window_t * lv_window = lv_glfw_get_lv_window_from_window(window); - lv_window->mouse_last_point.x = (int32_t)xpos; - lv_window->mouse_last_point.y = (int32_t)ypos; - proc_mouse(lv_window); -} - -static void proc_mouse(lv_glfw_window_t * window) -{ - /* mouse activity will affect the topmost LVGL display texture */ - lv_glfw_texture_t * texture; - LV_LL_READ_BACK(&window->textures, texture) { - if(lv_area_is_point_on(&texture->area, &window->mouse_last_point, 0)) { - /* adjust the mouse pointer coordinates so that they are relative to the texture */ - texture->indev_last_point.x = window->mouse_last_point.x - texture->area.x1; - texture->indev_last_point.y = window->mouse_last_point.y - texture->area.y1; - texture->indev_last_state = window->mouse_last_state; - lv_indev_read(texture->indev); - break; - } - } -} - -static void indev_read_cb(lv_indev_t * indev, lv_indev_data_t * data) -{ - lv_glfw_texture_t * texture = lv_indev_get_driver_data(indev); - data->point = texture->indev_last_point; - data->state = texture->indev_last_state; -} - -static void framebuffer_size_callback(GLFWwindow * window, int width, int height) -{ - lv_glfw_window_t * lv_window = lv_glfw_get_lv_window_from_window(window); - lv_window->hor_res = width; - lv_window->ver_res = height; -} - -static uint32_t lv_glfw_tick_count_callback(void) -{ - double tick = glfwGetTime() * 1000.0; - return (uint32_t)tick; -} - -#endif /*LV_USE_OPENGLES*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_glfw_window.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_glfw_window.h deleted file mode 100644 index e8e5161..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_glfw_window.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @file lv_glfw_window.h - * - */ - -#ifndef LV_GLFW_WINDOW_H -#define LV_GLFW_WINDOW_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" -#if LV_USE_OPENGLES - -#include "../../misc/lv_types.h" -#include "../../display/lv_display.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a GLFW window with no textures and initialize OpenGL - * @param hor_res width in pixels of the window - * @param ver_res height in pixels of the window - * @param use_mouse_indev send pointer indev input to LVGL display textures - * @return the new GLFW window handle - */ -lv_glfw_window_t * lv_glfw_window_create(int32_t hor_res, int32_t ver_res, bool use_mouse_indev); - -/** - * Delete a GLFW window. If it is the last one, the process will exit - * @param window GLFW window to delete - */ -void lv_glfw_window_delete(lv_glfw_window_t * window); - -/** - * Add a texture to the GLFW window. It can be an LVGL display texture, or any OpenGL texture - * @param window GLFW window - * @param texture_id OpenGL texture ID - * @param w width in pixels of the texture - * @param h height in pixels of the texture - * @return the new texture handle - */ -lv_glfw_texture_t * lv_glfw_window_add_texture(lv_glfw_window_t * window, unsigned int texture_id, int32_t w, - int32_t h); - -/** - * Remove a texture from its GLFW window and delete it - * @param texture handle of a GLFW window texture - */ -void lv_glfw_texture_remove(lv_glfw_texture_t * texture); - -/** - * Set the x position of a texture within its GLFW window - * @param texture handle of a GLFW window texture - * @param x new x position of the texture - */ -void lv_glfw_texture_set_x(lv_glfw_texture_t * texture, int32_t x); - -/** - * Set the y position of a texture within its GLFW window - * @param texture handle of a GLFW window texture - * @param y new y position of the texture - */ -void lv_glfw_texture_set_y(lv_glfw_texture_t * texture, int32_t y); - -/** - * Set the opacity of a texture in a GLFW window - * @param texture handle of a GLFW window texture - * @param opa new opacity of the texture - */ -void lv_glfw_texture_set_opa(lv_glfw_texture_t * texture, lv_opa_t opa); - -/** - * Get the mouse indev associated with a texture in a GLFW window, if it exists - * @param texture handle of a GLFW window texture - * @return the indev or `NULL` - * @note there will only be an indev if the texture is based on an - * LVGL display texture and the window was created with - * `use_mouse_indev` as `true` - */ -lv_indev_t * lv_glfw_texture_get_mouse_indev(lv_glfw_texture_t * texture); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_OPENGLES */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_GLFW_WINDOW_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_glfw_window_private.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_glfw_window_private.h deleted file mode 100644 index a8149c2..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_glfw_window_private.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @file lv_glfw_window_private.h - * - */ - -#ifndef LV_GLFW_WINDOW_PRIVATE_H -#define LV_GLFW_WINDOW_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_glfw_window.h" -#if LV_USE_OPENGLES - -#include -#include - -#include "../../misc/lv_area.h" -#include "../../display/lv_display.h" -#include "../../indev/lv_indev.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_glfw_window_t { - GLFWwindow * window; - int32_t hor_res; - int32_t ver_res; - lv_ll_t textures; - lv_point_t mouse_last_point; - lv_indev_state_t mouse_last_state; - uint8_t use_indev : 1; - uint8_t closing : 1; -}; - -struct lv_glfw_texture_t { - lv_glfw_window_t * window; - unsigned int texture_id; - lv_area_t area; - lv_opa_t opa; - lv_indev_t * indev; - lv_point_t indev_last_point; - lv_indev_state_t indev_last_state; -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_OPENGLES*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_GLFW_WINDOW_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_debug.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_debug.c deleted file mode 100644 index 5bf6d02..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_debug.c +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file lv_opengles_debug.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_opengles_debug.h" -#if LV_USE_OPENGLES - -#include "../../misc/lv_log.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void GLClearError() -{ - while(glGetError() != GL_NO_ERROR); -} - -bool GLLogCall(const char * function, const char * file, int line) -{ - GLenum error; - while((error = glGetError()) != GL_NO_ERROR) { - LV_LOG_ERROR("[OpenGL Error] (%d) %s %s:%d", error, function, file, line); - return false; - } - return true; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /* LV_USE_OPENGLES */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_debug.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_debug.h deleted file mode 100644 index ddde0eb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_debug.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @file lv_opengles_debug.h - * - */ - -#ifndef LV_OPENGLES_DEBUG_H -#define LV_OPENGLES_DEBUG_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../../lv_conf_internal.h" -#if LV_USE_OPENGLES - -#include -#include -#include - -void GLClearError(void); - -bool GLLogCall(const char * function, const char * file, int line); - -#if LV_USE_OPENGLES_DEBUG -#define GL_CALL(x) GLClearError();\ - x;\ - GLLogCall(#x, __FILE__, __LINE__) -#else -#define GL_CALL(x) x -#endif - -#endif /* LV_USE_OPENGLES */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_OPENGLES_DEBUG_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_driver.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_driver.c deleted file mode 100644 index 110e714..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_driver.c +++ /dev/null @@ -1,409 +0,0 @@ -/** - * @file lv_opengles_driver.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../display/lv_display.h" - -#if LV_USE_OPENGLES - -#include "lv_opengles_debug.h" -#include "lv_opengles_driver.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_opengles_enable_blending(void); -static void lv_opengles_vertex_buffer_init(const void * data, unsigned int size); -static void lv_opengles_vertex_buffer_deinit(void); -static void lv_opengles_vertex_buffer_bind(void); -static void lv_opengles_vertex_buffer_unbind(void); -static void lv_opengles_vertex_array_init(void); -static void lv_opengles_vertex_array_deinit(void); -static void lv_opengles_vertex_array_bind(void); -static void lv_opengles_vertex_array_unbind(void); -static void lv_opengles_vertex_array_add_buffer(void); -static void lv_opengles_index_buffer_init(const unsigned int * data, unsigned int count); -static void lv_opengles_index_buffer_deinit(void); -static unsigned int lv_opengles_index_buffer_get_count(void); -static void lv_opengles_index_buffer_bind(void); -static void lv_opengles_index_buffer_unbind(void); -static unsigned int lv_opengles_shader_compile(unsigned int type, const char * source); -static unsigned int lv_opengles_shader_create(const char * vertexShader, const char * fragmentShader); -static void lv_opengles_shader_init(void); -static void lv_opengles_shader_deinit(void); -static void lv_opengles_shader_bind(void); -static void lv_opengles_shader_unbind(void); -static int lv_opengles_shader_get_uniform_location(const char * name); -static void lv_opengles_shader_set_uniform1i(const char * name, int value); -static void lv_opengles_shader_set_uniformmatrix3fv(const char * name, int count, bool transpose, const float * values); -static void lv_opengles_shader_set_uniform1f(const char * name, float value); -static void lv_opengles_render_draw(void); - -/*********************** - * GLOBAL PROTOTYPES - ***********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static bool is_init; - -static unsigned int vertex_buffer_id = 0; - -static unsigned int vertex_array_id = 0; - -static unsigned int index_buffer_id = 0; -static unsigned int index_buffer_count = 0; - -static unsigned int shader_id; - -static const char * shader_names[] = { "u_Texture", "u_ColorDepth", "u_VertexTransform", "u_Opa" }; -static int shader_location[] = { 0, 0, 0, 0 }; - -static const char * vertex_shader = - "#version 300 es\n" - "\n" - "in vec4 position;\n" - "in vec2 texCoord;\n" - "\n" - "out vec2 v_TexCoord;\n" - "\n" - "uniform mat3 u_VertexTransform;\n" - "\n" - "void main()\n" - "{\n" - " gl_Position = vec4((u_VertexTransform * vec3(position.xy, 1)).xy, position.zw);\n" - " v_TexCoord = texCoord;\n" - "};\n"; - -static const char * fragment_shader = - "#version 300 es\n" - "\n" - "precision mediump float;\n" - "\n" - "layout(location = 0) out vec4 color;\n" - "\n" - "in vec2 v_TexCoord;\n" - "\n" - "uniform sampler2D u_Texture;\n" - "uniform int u_ColorDepth;\n" - "uniform float u_Opa;\n" - "\n" - "void main()\n" - "{\n" - " vec4 texColor = texture(u_Texture, v_TexCoord);\n" - " if (u_ColorDepth == 8) {\n" - " float gray = texColor.r;\n" - " color = vec4(gray, gray, gray, u_Opa);\n" - " } else {\n" - " color = vec4(texColor.rgb, texColor.a * u_Opa);\n" - " }\n" - "};\n"; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_opengles_init(void) -{ - if(is_init) return; - - lv_opengles_enable_blending(); - - float positions[] = { - -1.0f, 1.0f, 0.0f, 0.0f, - 1.0f, 1.0f, 1.0f, 0.0f, - 1.0f, -1.0f, 1.0f, 1.0f, - -1.0f, -1.0f, 0.0f, 1.0f - }; - - unsigned int indices[] = { - 0, 1, 2, - 2, 3, 0 - }; - - lv_opengles_vertex_buffer_init(positions, sizeof(positions)); - - lv_opengles_vertex_array_init(); - lv_opengles_vertex_array_add_buffer(); - - lv_opengles_index_buffer_init(indices, 6); - - lv_opengles_shader_init(); - lv_opengles_shader_bind(); - - /* unbind everything */ - lv_opengles_vertex_array_unbind(); - lv_opengles_vertex_buffer_unbind(); - lv_opengles_index_buffer_unbind(); - lv_opengles_shader_unbind(); - - is_init = true; -} - -void lv_opengles_deinit(void) -{ - if(!is_init) return; - - lv_opengles_shader_deinit(); - lv_opengles_index_buffer_deinit(); - lv_opengles_vertex_buffer_deinit(); - lv_opengles_vertex_array_deinit(); - - is_init = false; -} - -void lv_opengles_render_texture(unsigned int texture, const lv_area_t * texture_area, lv_opa_t opa, int32_t disp_w, - int32_t disp_h) -{ - GL_CALL(glActiveTexture(GL_TEXTURE0)); - GL_CALL(glBindTexture(GL_TEXTURE_2D, texture)); - - float hor_scale = (float)lv_area_get_width(texture_area) / (float)disp_w; - float ver_scale = (float)lv_area_get_height(texture_area) / (float)disp_h; - float hor_translate = (float)texture_area->x1 / (float)disp_w * 2.0f - (1.0f - hor_scale); - float ver_translate = -((float)texture_area->y1 / (float)disp_h * 2.0f - (1.0f - ver_scale)); - float matrix[9] = { - hor_scale, 0.0f, hor_translate, - 0.0f, ver_scale, ver_translate, - 0.0f, 0.0f, 1.0f - }; - - lv_opengles_shader_bind(); - lv_opengles_shader_set_uniform1i("u_ColorDepth", LV_COLOR_DEPTH); - lv_opengles_shader_set_uniform1i("u_Texture", 0); - lv_opengles_shader_set_uniformmatrix3fv("u_VertexTransform", 1, true, matrix); - lv_opengles_shader_set_uniform1f("u_Opa", (float)opa / (float)LV_OPA_100); - lv_opengles_render_draw(); -} - -void lv_opengles_render_clear(void) -{ - GL_CALL(glClear(GL_COLOR_BUFFER_BIT)); -} - -void lv_opengles_viewport(int32_t x, int32_t y, int32_t w, int32_t h) -{ - glViewport(x, y, w, h); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_opengles_enable_blending(void) -{ - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -} - -static void lv_opengles_vertex_buffer_init(const void * data, unsigned int size) -{ - GL_CALL(glGenBuffers(1, &vertex_buffer_id)); - GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id)); - GL_CALL(glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW)); -} - -static void lv_opengles_vertex_buffer_deinit(void) -{ - GL_CALL(glDeleteBuffers(1, &vertex_buffer_id)); -} - -static void lv_opengles_vertex_buffer_bind(void) -{ - GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id)); -} - -static void lv_opengles_vertex_buffer_unbind(void) -{ - GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, 0)); -} - -static void lv_opengles_vertex_array_init(void) -{ - GL_CALL(glGenVertexArrays(1, &vertex_array_id)); -} - -static void lv_opengles_vertex_array_deinit(void) -{ - GL_CALL(glDeleteVertexArrays(1, &vertex_array_id)); -} - -static void lv_opengles_vertex_array_bind(void) -{ - GL_CALL(glBindVertexArray(vertex_array_id)); -} - -static void lv_opengles_vertex_array_unbind(void) -{ - GL_CALL(glBindVertexArray(0)); -} - -static void lv_opengles_vertex_array_add_buffer(void) -{ - lv_opengles_vertex_buffer_bind(); - intptr_t offset = 0; - - for(unsigned int i = 0; i < 2; i++) { - lv_opengles_vertex_array_bind(); - GL_CALL(glEnableVertexAttribArray(i)); - GL_CALL(glVertexAttribPointer(i, 2, GL_FLOAT, GL_FALSE, 16, (const void *)offset)); - offset += 2 * 4; - } -} - -static void lv_opengles_index_buffer_init(const unsigned int * data, unsigned int count) -{ - index_buffer_count = count; - GL_CALL(glGenBuffers(1, &index_buffer_id)); - - GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_id)); - - GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * sizeof(GLuint), data, GL_STATIC_DRAW)); -} - -static void lv_opengles_index_buffer_deinit(void) -{ - GL_CALL(glDeleteBuffers(1, &index_buffer_id)); -} - -static unsigned int lv_opengles_index_buffer_get_count(void) -{ - return index_buffer_count; -} - -static void lv_opengles_index_buffer_bind(void) -{ - GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_id)); -} - -static void lv_opengles_index_buffer_unbind(void) -{ - GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); -} - -static unsigned int lv_opengles_shader_compile(unsigned int type, const char * source) -{ - GL_CALL(unsigned int id = glCreateShader(type)); - const char * src = source; - GL_CALL(glShaderSource(id, 1, &src, NULL)); - GL_CALL(glCompileShader(id)); - - int result; - GL_CALL(glGetShaderiv(id, GL_COMPILE_STATUS, &result)); - if(result == GL_FALSE) { - int length; - GL_CALL(glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length)); - char * message = lv_malloc_zeroed(length * sizeof(char)); - GL_CALL(glGetShaderInfoLog(id, length, &length, message)); - LV_LOG_ERROR("Failed to compile %s shader!", type == GL_VERTEX_SHADER ? "vertex" : "fragment"); - LV_LOG_ERROR("%s", message); - GL_CALL(glDeleteShader(id)); - return 0; - } - - return id; -} - -static unsigned int lv_opengles_shader_create(const char * vertexShader, const char * fragmentShader) -{ - GL_CALL(unsigned int program = glCreateProgram()); - unsigned int vs = lv_opengles_shader_compile(GL_VERTEX_SHADER, vertexShader); - unsigned int fs = lv_opengles_shader_compile(GL_FRAGMENT_SHADER, fragmentShader); - - GL_CALL(glAttachShader(program, vs)); - GL_CALL(glAttachShader(program, fs)); - GL_CALL(glLinkProgram(program)); - GL_CALL(glValidateProgram(program)); - - GL_CALL(glDeleteShader(vs)); - GL_CALL(glDeleteShader(fs)); - - return program; -} - -static void lv_opengles_shader_init(void) -{ - shader_id = lv_opengles_shader_create(vertex_shader, fragment_shader); -} - -static void lv_opengles_shader_deinit(void) -{ - GL_CALL(glDeleteProgram(shader_id)); -} - -static void lv_opengles_shader_bind(void) -{ - GL_CALL(glUseProgram(shader_id)); -} - -static void lv_opengles_shader_unbind(void) -{ - GL_CALL(glUseProgram(0)); -} - -static int lv_opengles_shader_get_uniform_location(const char * name) -{ - int id = -1; - for(size_t i = 0; i < sizeof(shader_location) / sizeof(int); i++) { - if(lv_strcmp(shader_names[i], name) == 0) { - id = i; - } - } - if(id == -1) { - return -1; - } - - if(shader_location[id] != 0) { - return shader_location[id]; - } - - GL_CALL(int location = glGetUniformLocation(shader_id, name)); - if(location == -1) - LV_LOG_WARN("Warning: uniform '%s' doesn't exist!", name); - - shader_location[id] = location; - return location; -} - -static void lv_opengles_shader_set_uniform1i(const char * name, int value) -{ - GL_CALL(glUniform1i(lv_opengles_shader_get_uniform_location(name), value)); -} - -static void lv_opengles_shader_set_uniformmatrix3fv(const char * name, int count, bool transpose, const float * values) -{ - GL_CALL(glUniformMatrix3fv(lv_opengles_shader_get_uniform_location(name), count, transpose, values)); -} - -static void lv_opengles_shader_set_uniform1f(const char * name, float value) -{ - GL_CALL(glUniform1f(lv_opengles_shader_get_uniform_location(name), value)); -} - -static void lv_opengles_render_draw(void) -{ - lv_opengles_shader_bind(); - lv_opengles_vertex_array_bind(); - lv_opengles_index_buffer_bind(); - unsigned int count = lv_opengles_index_buffer_get_count(); - GL_CALL(glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_INT, NULL)); -} - -#endif /* LV_USE_OPENGLES */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_driver.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_driver.h deleted file mode 100644 index e539feb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_driver.h +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @file lv_opengles_driver.h - * - */ - -#ifndef LV_OPENGLES_DRIVER_H -#define LV_OPENGLES_DRIVER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" -#if LV_USE_OPENGLES - -#include "../../misc/lv_area.h" -#include "../../misc/lv_color.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize OpenGL - * @note it is not necessary to call this if you use `lv_glfw_window_create` - */ -void lv_opengles_init(void); - -/** - * Deinitialize OpenGL - * @note it is not necessary to call this if you use `lv_glfw_window_create` - */ -void lv_opengles_deinit(void); - -/** - * Render a texture - * @param texture OpenGL texture ID - * @param texture_area the area in the window to render the texture in - * @param opa opacity to blend the texture with existing contents - * @param disp_w width of the window being rendered to - * @param disp_h height of the window being rendered to - */ -void lv_opengles_render_texture(unsigned int texture, const lv_area_t * texture_area, lv_opa_t opa, int32_t disp_w, - int32_t disp_h); - -/** - * Clear the window/display - */ -void lv_opengles_render_clear(void); - -/** - * Set the OpenGL viewport - * @param x x position of the viewport - * @param y y position of the viewport - * @param w width of the viewport - * @param h height of the viewport - */ -void lv_opengles_viewport(int32_t x, int32_t y, int32_t w, int32_t h); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_OPENGLES */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_OPENGLES_DRIVER_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_texture.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_texture.c deleted file mode 100644 index 02c9dfa..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_texture.c +++ /dev/null @@ -1,151 +0,0 @@ -/** - * @file lv_opengles_texture.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_opengles_texture.h" -#if LV_USE_OPENGLES - -#include "lv_opengles_debug.h" -#include "../../display/lv_display_private.h" -#include -#include -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - unsigned int texture_id; - uint8_t * fb1; -} lv_opengles_texture_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); -static void release_disp_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_opengles_texture_create(int32_t w, int32_t h) -{ - lv_display_t * disp = lv_display_create(w, h); - if(disp == NULL) { - return NULL; - } - lv_opengles_texture_t * dsc = lv_malloc_zeroed(sizeof(lv_opengles_texture_t)); - LV_ASSERT_MALLOC(dsc); - if(dsc == NULL) { - lv_display_delete(disp); - return NULL; - } - uint32_t stride = lv_draw_buf_width_to_stride(w, lv_display_get_color_format(disp)); - uint32_t buf_size = stride * h; - dsc->fb1 = malloc(buf_size); - if(dsc->fb1 == NULL) { - lv_free(dsc); - lv_display_delete(disp); - return NULL; - } - - GL_CALL(glGenTextures(1, &dsc->texture_id)); - GL_CALL(glBindTexture(GL_TEXTURE_2D, dsc->texture_id)); - GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); - GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); - GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); - GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); - GL_CALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); - - lv_display_set_buffers(disp, dsc->fb1, NULL, buf_size, LV_DISPLAY_RENDER_MODE_DIRECT); - lv_display_set_flush_cb(disp, flush_cb); - lv_display_set_driver_data(disp, dsc); - lv_display_add_event_cb(disp, release_disp_cb, LV_EVENT_DELETE, disp); - - return disp; -} - -unsigned int lv_opengles_texture_get_texture_id(lv_display_t * disp) -{ - if(disp->flush_cb != flush_cb) { - return 0; - } - lv_opengles_texture_t * dsc = lv_display_get_driver_data(disp); - return dsc->texture_id; -} - -lv_display_t * lv_opengles_texture_get_from_texture_id(unsigned int texture_id) -{ - lv_display_t * disp = NULL; - while(NULL != (disp = lv_display_get_next(disp))) { - unsigned int disp_texture_id = lv_opengles_texture_get_texture_id(disp); - if(disp_texture_id == texture_id) { - return disp; - } - } - return NULL; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) -{ - LV_UNUSED(area); - LV_UNUSED(px_map); - - if(lv_display_flush_is_last(disp)) { - - lv_opengles_texture_t * dsc = lv_display_get_driver_data(disp); - - GL_CALL(glBindTexture(GL_TEXTURE_2D, dsc->texture_id)); - - GL_CALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); - /*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ -#if LV_COLOR_DEPTH == 8 - GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, disp->hor_res, disp->ver_res, 0, GL_RED, GL_UNSIGNED_BYTE, dsc->fb1)); -#elif LV_COLOR_DEPTH == 16 - GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB565, disp->hor_res, disp->ver_res, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, - dsc->fb1)); -#elif LV_COLOR_DEPTH == 24 - GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, disp->hor_res, disp->ver_res, 0, GL_BGR, GL_UNSIGNED_BYTE, dsc->fb1)); -#elif LV_COLOR_DEPTH == 32 - GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, disp->hor_res, disp->ver_res, 0, GL_BGRA, GL_UNSIGNED_BYTE, dsc->fb1)); -#else -#error("Unsupported color format") -#endif - } - - lv_display_flush_ready(disp); -} - -static void release_disp_cb(lv_event_t * e) -{ - lv_display_t * disp = lv_event_get_user_data(e); - lv_opengles_texture_t * dsc = lv_display_get_driver_data(disp); - free(dsc->fb1); - lv_free(dsc); -} - -#endif /*LV_USE_OPENGLES*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_texture.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_texture.h deleted file mode 100644 index 0d53b2b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/glfw/lv_opengles_texture.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @file lv_opengles_texture.h - * - */ - -#ifndef LV_OPENGLES_TEXTURE_H -#define LV_OPENGLES_TEXTURE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" -#if LV_USE_OPENGLES - -#include "../../display/lv_display.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a display that flushes to an OpenGL texture - * @param w width in pixels of the texture - * @param h height in pixels of the texture - * @return the new display - */ -lv_display_t * lv_opengles_texture_create(int32_t w, int32_t h); - -/** - * Get the OpenGL texture ID of the display - * @param disp display - * @return texture ID - */ -unsigned int lv_opengles_texture_get_texture_id(lv_display_t * disp); - -/** - * Get the display of an OpenGL texture if it is associated with one - * @param texture_id OpenGL texture ID - * @return display or `NULL` if there no display with that texture ID - */ -lv_display_t * lv_opengles_texture_get_from_texture_id(unsigned int texture_id); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_OPENGLES */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OPENGLES_TEXTURE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_libinput.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_libinput.c deleted file mode 100644 index 7410f40..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_libinput.c +++ /dev/null @@ -1,672 +0,0 @@ -/** - * @file lv_libinput.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../indev/lv_indev_private.h" -#include "lv_libinput_private.h" - -#if LV_USE_LIBINPUT - -#include "../../display/lv_display_private.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if LV_LIBINPUT_BSD - #include -#else - #include -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_libinput_device { - lv_libinput_capability capabilities; - char * path; -}; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static bool _rescan_devices(void); -static bool _add_scanned_device(char * path, lv_libinput_capability capabilities); -static void _reset_scanned_devices(void); - -static void * _poll_thread(void * data); - -lv_libinput_event_t * _get_event(lv_libinput_t * state); -bool _event_pending(lv_libinput_t * state); -lv_libinput_event_t * _create_event(lv_libinput_t * state); - -static void _read(lv_indev_t * indev, lv_indev_data_t * data); -static void _read_pointer(lv_libinput_t * state, struct libinput_event * event); -static void _read_keypad(lv_libinput_t * state, struct libinput_event * event); - -static int _open_restricted(const char * path, int flags, void * user_data); -static void _close_restricted(int fd, void * user_data); - -static void _delete(lv_libinput_t * dsc); - -/********************** - * STATIC VARIABLES - **********************/ - -static struct lv_libinput_device * devices = NULL; -static size_t num_devices = 0; - -static const int timeout = 100; // ms -static const nfds_t nfds = 1; - -static const struct libinput_interface interface = { - .open_restricted = _open_restricted, - .close_restricted = _close_restricted, -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_libinput_capability lv_libinput_query_capability(struct libinput_device * device) -{ - lv_libinput_capability capability = LV_LIBINPUT_CAPABILITY_NONE; - if(libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD) - && (libinput_device_keyboard_has_key(device, KEY_ENTER) || libinput_device_keyboard_has_key(device, KEY_KPENTER))) { - capability |= LV_LIBINPUT_CAPABILITY_KEYBOARD; - } - if(libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER)) { - capability |= LV_LIBINPUT_CAPABILITY_POINTER; - } - if(libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TOUCH)) { - capability |= LV_LIBINPUT_CAPABILITY_TOUCH; - } - return capability; -} - -char * lv_libinput_find_dev(lv_libinput_capability capabilities, bool force_rescan) -{ - char * path = NULL; - lv_libinput_find_devs(capabilities, &path, 1, force_rescan); - return path; -} - -size_t lv_libinput_find_devs(lv_libinput_capability capabilities, char ** found, size_t count, bool force_rescan) -{ - if((!devices || force_rescan) && !_rescan_devices()) { - return 0; - } - - size_t num_found = 0; - - for(size_t i = 0; i < num_devices && num_found < count; ++i) { - if(devices[i].capabilities & capabilities) { - found[num_found] = devices[i].path; - num_found++; - } - } - - return num_found; -} - -lv_indev_t * lv_libinput_create(lv_indev_type_t indev_type, const char * dev_path) -{ - lv_libinput_t * dsc = lv_malloc_zeroed(sizeof(lv_libinput_t)); - LV_ASSERT_MALLOC(dsc); - if(dsc == NULL) return NULL; - - dsc->libinput_context = libinput_path_create_context(&interface, NULL); - if(!dsc->libinput_context) { - LV_LOG_ERROR("libinput_path_create_context failed: %s", strerror(errno)); - _delete(dsc); - return NULL; - } - - dsc->libinput_device = libinput_path_add_device(dsc->libinput_context, dev_path); - if(!dsc->libinput_device) { - _delete(dsc); - return NULL; - } - - dsc->libinput_device = libinput_device_ref(dsc->libinput_device); - if(!dsc->libinput_device) { - _delete(dsc); - return NULL; - } - - dsc->fd = libinput_get_fd(dsc->libinput_context); - - /* Prepare poll */ - dsc->fds[0].fd = dsc->fd; - dsc->fds[0].events = POLLIN; - dsc->fds[0].revents = 0; - -#if LV_LIBINPUT_XKB - struct xkb_rule_names names = LV_LIBINPUT_XKB_KEY_MAP; - lv_xkb_init(&(dsc->xkb), names); -#endif /* LV_LIBINPUT_XKB */ - - /* Create indev */ - lv_indev_t * indev = lv_indev_create(); - if(!indev) { - _delete(dsc); - return NULL; - } - lv_indev_set_type(indev, indev_type); - lv_indev_set_read_cb(indev, _read); - lv_indev_set_driver_data(indev, dsc); - - /* Set up thread & lock */ - pthread_mutex_init(&dsc->event_lock, NULL); - pthread_create(&dsc->worker_thread, NULL, _poll_thread, dsc); - - return indev; -} - -void lv_libinput_delete(lv_indev_t * indev) -{ - _delete(lv_indev_get_driver_data(indev)); - lv_indev_delete(indev); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * rescan all attached evdev devices and store capable ones into the static devices array for quick later filtering - * @return true if the operation succeeded - */ -static bool _rescan_devices(void) -{ - _reset_scanned_devices(); - - DIR * dir; - struct dirent * ent; - if(!(dir = opendir("/dev/input"))) { - perror("unable to open directory /dev/input"); - return false; - } - - struct libinput * context = libinput_path_create_context(&interface, NULL); - - while((ent = readdir(dir))) { - if(strncmp(ent->d_name, "event", 5) != 0) { - continue; - } - - /* 11 characters for /dev/input/ + length of name + 1 NUL terminator */ - char * path = malloc((11 + strlen(ent->d_name) + 1) * sizeof(char)); - if(!path) { - perror("could not allocate memory for device node path"); - libinput_unref(context); - _reset_scanned_devices(); - return false; - } - strcpy(path, "/dev/input/"); - strcat(path, ent->d_name); - - struct libinput_device * device = libinput_path_add_device(context, path); - if(!device) { - perror("unable to add device to libinput context"); - free(path); - continue; - } - - /* The device pointer is guaranteed to be valid until the next libinput_dispatch. Since we're not dispatching events - * as part of this function, we don't have to increase its reference count to keep it alive. - * https://wayland.freedesktop.org/libinput/doc/latest/api/group__base.html#gaa797496f0150b482a4e01376bd33a47b */ - - lv_libinput_capability capabilities = lv_libinput_query_capability(device); - - libinput_path_remove_device(device); - - if(capabilities == LV_LIBINPUT_CAPABILITY_NONE) { - free(path); - continue; - } - - if(!_add_scanned_device(path, capabilities)) { - free(path); - libinput_unref(context); - _reset_scanned_devices(); - return false; - } - } - - libinput_unref(context); - return true; -} - -/** - * add a new scanned device to the static devices array, growing its size when necessary - * @param path device file path - * @param capabilities device input capabilities - * @return true if the operation succeeded - */ -static bool _add_scanned_device(char * path, lv_libinput_capability capabilities) -{ - /* Double array size every 2^n elements */ - if((num_devices & (num_devices + 1)) == 0) { - struct lv_libinput_device * tmp = realloc(devices, (2 * num_devices + 1) * sizeof(struct lv_libinput_device)); - if(!tmp) { - perror("could not reallocate memory for devices array"); - return false; - } - devices = tmp; - } - - devices[num_devices].path = path; - devices[num_devices].capabilities = capabilities; - num_devices++; - - return true; -} - -/** - * reset the array of scanned devices and free any dynamically allocated memory - */ -static void _reset_scanned_devices(void) -{ - if(!devices) { - return; - } - - for(size_t i = 0; i < num_devices; ++i) { - free(devices[i].path); - } - free(devices); - - devices = NULL; - num_devices = 0; -} - -static void * _poll_thread(void * data) -{ - lv_libinput_t * dsc = (lv_libinput_t *)data; - struct libinput_event * event; - int rc = 0; - - LV_LOG_INFO("libinput: poll worker started"); - - while(true) { - rc = poll(dsc->fds, nfds, timeout); - switch(rc) { - case -1: - perror(NULL); - __attribute__((fallthrough)); - case 0: - if(dsc->deinit) { - dsc->deinit = false; /* Signal that we're done */ - return NULL; - } - continue; - default: - break; - } - libinput_dispatch(dsc->libinput_context); - pthread_mutex_lock(&dsc->event_lock); - while((event = libinput_get_event(dsc->libinput_context)) != NULL) { - _read_pointer(dsc, event); - _read_keypad(dsc, event); - libinput_event_destroy(event); - } - pthread_mutex_unlock(&dsc->event_lock); - LV_LOG_INFO("libinput: event read"); - } - - return NULL; -} - -lv_libinput_event_t * _get_event(lv_libinput_t * dsc) -{ - if(dsc->start == dsc->end) { - return NULL; - } - - lv_libinput_event_t * evt = &dsc->points[dsc->start]; - - if(++dsc->start == LV_LIBINPUT_MAX_EVENTS) - dsc->start = 0; - - return evt; -} - -bool _event_pending(lv_libinput_t * dsc) -{ - return dsc->start != dsc->end; -} - -lv_libinput_event_t * _create_event(lv_libinput_t * dsc) -{ - lv_libinput_event_t * evt = &dsc->points[dsc->end]; - - if(++dsc->end == LV_LIBINPUT_MAX_EVENTS) - dsc->end = 0; - - /* We have overflowed the buffer, start overwriting - * old events. - */ - if(dsc->end == dsc->start) { - LV_LOG_INFO("libinput: overflowed event buffer!"); - if(++dsc->start == LV_LIBINPUT_MAX_EVENTS) - dsc->start = 0; - } - - memset(evt, 0, sizeof(lv_libinput_event_t)); - - return evt; -} - -static void _read(lv_indev_t * indev, lv_indev_data_t * data) -{ - lv_libinput_t * dsc = lv_indev_get_driver_data(indev); - LV_ASSERT_NULL(dsc); - - pthread_mutex_lock(&dsc->event_lock); - - lv_libinput_event_t * evt = _get_event(dsc); - - if(!evt) - evt = &dsc->last_event; /* indev expects us to report the most recent state */ - - data->point = evt->point; - data->state = evt->pressed; - data->key = evt->key_val; - data->continue_reading = _event_pending(dsc); - - dsc->last_event = *evt; /* Remember the last event for the next call */ - - pthread_mutex_unlock(&dsc->event_lock); - - if(evt) - LV_LOG_TRACE("libinput_read: (%04d, %04d): %d continue_reading? %d", data->point.x, data->point.y, data->state, - data->continue_reading); -} - -static void _read_pointer(lv_libinput_t * dsc, struct libinput_event * event) -{ - struct libinput_event_touch * touch_event = NULL; - struct libinput_event_pointer * pointer_event = NULL; - lv_libinput_event_t * evt = NULL; - enum libinput_event_type type = libinput_event_get_type(event); - int slot = 0; - - switch(type) { - case LIBINPUT_EVENT_TOUCH_MOTION: - case LIBINPUT_EVENT_TOUCH_DOWN: - case LIBINPUT_EVENT_TOUCH_UP: - touch_event = libinput_event_get_touch_event(event); - break; - case LIBINPUT_EVENT_POINTER_MOTION: - case LIBINPUT_EVENT_POINTER_BUTTON: - case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: - pointer_event = libinput_event_get_pointer_event(event); - break; - default: - return; /* We don't care about this events */ - } - - /* We need to read unrotated display dimensions directly from the driver because libinput won't account - * for any rotation inside of LVGL */ - lv_display_t * disp = lv_display_get_default(); - - /* ignore more than 2 fingers as it will only confuse LVGL */ - if(touch_event && (slot = libinput_event_touch_get_slot(touch_event)) > 1) - return; - - evt = _create_event(dsc); - - const int32_t hor_res = disp->physical_hor_res > 0 ? disp->physical_hor_res : disp->hor_res; - const int32_t ver_res = disp->physical_ver_res > 0 ? disp->physical_ver_res : disp->ver_res; - - switch(type) { - case LIBINPUT_EVENT_TOUCH_MOTION: - case LIBINPUT_EVENT_TOUCH_DOWN: { - lv_point_t point; - point.x = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_touch_get_x_transformed(touch_event, hor_res) - disp->offset_x, - INT32_MAX); - point.y = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_touch_get_y_transformed(touch_event, ver_res) - disp->offset_y, - INT32_MAX); - if(point.x < 0 || point.x > disp->hor_res || point.y < 0 || point.y > disp->ver_res) { - break; /* ignore touches that are out of bounds */ - } - evt->point = point; - evt->pressed = LV_INDEV_STATE_PRESSED; - dsc->slots[slot].point = evt->point; - dsc->slots[slot].pressed = evt->pressed; - break; - } - case LIBINPUT_EVENT_TOUCH_UP: - /* - * We don't support "multitouch", but libinput does. To make fast typing with two thumbs - * on a keyboard feel good, it's necessary to handle two fingers individually. The edge - * case here is if you press a key with one finger and then press a second key with another - * finger. No matter which finger you release, it will count as the second finger releasing - * and ignore the first because LVGL only stores a single (the latest) pressed state. - * - * To work around this, we detect the case where one finger is released while the other is - * still pressed and insert dummy events so that both release events trigger at the correct - * position. - */ - if(slot == 0 && dsc->slots[1].pressed == LV_INDEV_STATE_PRESSED) { - /* The first finger is released while the second finger is still pressed. - * We turn P1 > P2 > R1 > R2 into P1 > P2 > (P1) > R1 > (P2) > R2. - */ - - /* Inject the dummy press event for the first finger */ - lv_libinput_event_t * synth_evt = evt; - synth_evt->pressed = LV_INDEV_STATE_PRESSED; - synth_evt->point = dsc->slots[0].point; - - /* Append the real release event for the first finger */ - evt = _create_event(dsc); - evt->pressed = LV_INDEV_STATE_RELEASED; - evt->point = dsc->slots[0].point; - - /* Inject the dummy press event for the second finger */ - synth_evt = _create_event(dsc); - synth_evt->pressed = LV_INDEV_STATE_PRESSED; - synth_evt->point = dsc->slots[1].point; - } - else if(slot == 1 && dsc->slots[0].pressed == LV_INDEV_STATE_PRESSED) { - /* The second finger is released while the first finger is still pressed. - * We turn P1 > P2 > R2 > R1 into P1 > P2 > R2 > (P1) > R1. - */ - - /* Append the real release event for the second finger */ - evt->pressed = LV_INDEV_STATE_RELEASED; - evt->point = dsc->slots[1].point; - - /* Inject the dummy press event for the first finger */ - lv_libinput_event_t * synth_evt = _create_event(dsc); - synth_evt->pressed = LV_INDEV_STATE_PRESSED; - synth_evt->point = dsc->slots[0].point; - } - else { - evt->pressed = LV_INDEV_STATE_RELEASED; - evt->point = dsc->slots[slot].point; - } - - dsc->slots[slot].pressed = evt->pressed; - break; - case LIBINPUT_EVENT_POINTER_MOTION: - dsc->pointer_position.x = (int32_t)LV_CLAMP(0, dsc->pointer_position.x + libinput_event_pointer_get_dx(pointer_event), - disp->hor_res - 1); - dsc->pointer_position.y = (int32_t)LV_CLAMP(0, dsc->pointer_position.y + libinput_event_pointer_get_dy(pointer_event), - disp->ver_res - 1); - evt->point.x = dsc->pointer_position.x; - evt->point.y = dsc->pointer_position.y; - evt->pressed = dsc->pointer_button_down; - break; - case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: { - lv_point_t point; - point.x = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_pointer_get_absolute_x_transformed(pointer_event, - hor_res) - disp->offset_x, INT32_MAX); - point.y = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_pointer_get_absolute_y_transformed(pointer_event, - ver_res) - disp->offset_y, INT32_MAX); - if(point.x < 0 || point.x > disp->hor_res || point.y < 0 || point.y > disp->ver_res) { - break; /* ignore pointer events that are out of bounds */ - } - evt->point = point; - evt->pressed = dsc->pointer_button_down; - break; - } - case LIBINPUT_EVENT_POINTER_BUTTON: { - enum libinput_button_state button_state = libinput_event_pointer_get_button_state(pointer_event); - dsc->pointer_button_down = button_state == LIBINPUT_BUTTON_STATE_RELEASED ? LV_INDEV_STATE_RELEASED : - LV_INDEV_STATE_PRESSED; - evt->point.x = dsc->pointer_position.x; - evt->point.y = dsc->pointer_position.y; - evt->pressed = dsc->pointer_button_down; - } - default: - break; - } -} - -static void _read_keypad(lv_libinput_t * dsc, struct libinput_event * event) -{ - struct libinput_event_keyboard * keyboard_event = NULL; - enum libinput_event_type type = libinput_event_get_type(event); - lv_libinput_event_t * evt = NULL; - switch(type) { - case LIBINPUT_EVENT_KEYBOARD_KEY: - evt = _create_event(dsc); - keyboard_event = libinput_event_get_keyboard_event(event); - enum libinput_key_state key_state = libinput_event_keyboard_get_key_state(keyboard_event); - uint32_t code = libinput_event_keyboard_get_key(keyboard_event); -#if LV_LIBINPUT_XKB - evt->key_val = lv_xkb_process_key(&(dsc->xkb), code, key_state == LIBINPUT_KEY_STATE_PRESSED); -#else - switch(code) { - case KEY_BACKSPACE: - evt->key_val = LV_KEY_BACKSPACE; - break; - case KEY_ENTER: - evt->key_val = LV_KEY_ENTER; - break; - case KEY_PREVIOUS: - evt->key_val = LV_KEY_PREV; - break; - case KEY_NEXT: - evt->key_val = LV_KEY_NEXT; - break; - case KEY_UP: - evt->key_val = LV_KEY_UP; - break; - case KEY_LEFT: - evt->key_val = LV_KEY_LEFT; - break; - case KEY_RIGHT: - evt->key_val = LV_KEY_RIGHT; - break; - case KEY_DOWN: - evt->key_val = LV_KEY_DOWN; - break; - case KEY_TAB: - evt->key_val = LV_KEY_NEXT; - break; - case KEY_HOME: - evt->key_val = LV_KEY_HOME; - break; - case KEY_END: - evt->key_val = LV_KEY_END; - break; - default: - evt->key_val = 0; - break; - } -#endif /* LV_LIBINPUT_XKB */ - if(evt->key_val != 0) { - /* Only record button state when actual output is produced to prevent widgets from refreshing */ - evt->pressed = (key_state == LIBINPUT_KEY_STATE_RELEASED) ? LV_INDEV_STATE_RELEASED : LV_INDEV_STATE_PRESSED; - - // just release the key immediately after it got pressed. - // but don't handle special keys where holding a key makes sense - if(evt->key_val != LV_KEY_BACKSPACE && - evt->key_val != LV_KEY_UP && - evt->key_val != LV_KEY_LEFT && - evt->key_val != LV_KEY_RIGHT && - evt->key_val != LV_KEY_DOWN && - key_state == LIBINPUT_KEY_STATE_PRESSED) { - lv_libinput_event_t * release_evt = _create_event(dsc); - release_evt->pressed = LV_INDEV_STATE_RELEASED; - release_evt->key_val = evt->key_val; - } - } - break; - default: - break; - } -} - -static int _open_restricted(const char * path, int flags, void * user_data) -{ - LV_UNUSED(user_data); - int fd = open(path, flags); - return fd < 0 ? -errno : fd; -} - -static void _close_restricted(int fd, void * user_data) -{ - LV_UNUSED(user_data); - close(fd); -} - -static void _delete(lv_libinput_t * dsc) -{ - if(dsc->fd) - dsc->deinit = true; - - /* Give worker thread a whole second to quit */ - for(int i = 0; i < 100; i++) { - if(!dsc->deinit) - break; - usleep(10000); - } - - if(dsc->deinit) { - LV_LOG_ERROR("libinput worker thread did not quit in time, cancelling it"); - pthread_cancel(dsc->worker_thread); - } - - if(dsc->libinput_device) { - libinput_path_remove_device(dsc->libinput_device); - libinput_device_unref(dsc->libinput_device); - } - - if(dsc->libinput_context) { - libinput_unref(dsc->libinput_context); - } - -#if LV_LIBINPUT_XKB - lv_xkb_deinit(&(dsc->xkb)); -#endif /* LV_LIBINPUT_XKB */ - - lv_free(dsc); -} - -#endif /* LV_USE_LIBINPUT */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_libinput.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_libinput.h deleted file mode 100644 index ce19a33..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_libinput.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * @file lv_libinput.h - * - */ - -#ifndef LV_LIBINPUT_H -#define LV_LIBINPUT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../indev/lv_indev.h" - -#if LV_USE_LIBINPUT - -#include -#include - -#if LV_LIBINPUT_XKB -#include "lv_xkb.h" -#endif /* LV_LIBINPUT_XKB */ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef enum { - LV_LIBINPUT_CAPABILITY_NONE = 0, - LV_LIBINPUT_CAPABILITY_KEYBOARD = 1U << 0, - LV_LIBINPUT_CAPABILITY_POINTER = 1U << 1, - LV_LIBINPUT_CAPABILITY_TOUCH = 1U << 2 -} lv_libinput_capability; - -struct libinput_device; - -#define LV_LIBINPUT_MAX_EVENTS 32 - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Determine the capabilities of a specific libinput device. - * @param device the libinput device to query - * @return the supported input capabilities - */ -lv_libinput_capability lv_libinput_query_capability(struct libinput_device * device); - -/** - * Find connected input device with specific capabilities - * @param capabilities required device capabilities - * @param force_rescan erase the device cache (if any) and rescan the file system for available devices - * @return device node path (e.g. /dev/input/event0) for the first matching device or NULL if no device was found. - * The pointer is safe to use until the next forceful device search. - */ -char * lv_libinput_find_dev(lv_libinput_capability capabilities, bool force_rescan); - -/** - * Find connected input devices with specific capabilities - * @param capabilities required device capabilities - * @param devices pre-allocated array to store the found device node paths (e.g. /dev/input/event0). The pointers are - * safe to use until the next forceful device search. - * @param count maximum number of devices to find (the devices array should be at least this long) - * @param force_rescan erase the device cache (if any) and rescan the file system for available devices - * @return number of devices that were found - */ -size_t lv_libinput_find_devs(lv_libinput_capability capabilities, char ** found, size_t count, bool force_rescan); - -/** - * Create a new libinput input device - * @param type LV_INDEV_TYPE_POINTER or LV_INDEV_TYPE_KEYPAD - * @param dev_path device path, e.g. /dev/input/event0 - * @return pointer to input device or NULL if opening failed - */ -lv_indev_t * lv_libinput_create(lv_indev_type_t indev_type, const char * dev_path); - -/** - * Delete a libinput input device - * @param indev pointer to input device - */ -void lv_libinput_delete(lv_indev_t * indev); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_LIBINPUT */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_LIBINPUT_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_libinput_private.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_libinput_private.h deleted file mode 100644 index bced3e2..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_libinput_private.h +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @file lv_libinput_private.h - * - */ - -#ifndef LV_LIBINPUT_PRIVATE_H -#define LV_LIBINPUT_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_libinput.h" - -#if LV_USE_LIBINPUT - -#if LV_LIBINPUT_XKB -#include "lv_xkb_private.h" -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_libinput_event_t { - lv_indev_state_t pressed; - int key_val; - lv_point_t point; -}; - -struct lv_libinput_t { - int fd; - struct pollfd fds[1]; - - /* The points array is implemented as a circular LIFO queue */ - lv_libinput_event_t points[LV_LIBINPUT_MAX_EVENTS]; /* Event buffer */ - lv_libinput_event_t slots[2]; /* Realtime state of up to 2 fingers to handle multitouch */ - - /* Pointer devices work a bit differently in libinput which requires us to store their last known state */ - lv_point_t pointer_position; - bool pointer_button_down; - - int start; /* Index of start of event queue */ - int end; /* Index of end of queue*/ - lv_libinput_event_t last_event; /* Report when no new events - * to keep indev state consistent - */ - bool deinit; /* Tell worker thread to quit */ - pthread_mutex_t event_lock; - pthread_t worker_thread; - - struct libinput * libinput_context; - struct libinput_device * libinput_device; - -#if LV_LIBINPUT_XKB - lv_xkb_t xkb; -#endif /* LV_LIBINPUT_XKB */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_LIBINPUT */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LIBINPUT_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_xkb.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_xkb.c deleted file mode 100644 index 1e8ddb1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_xkb.c +++ /dev/null @@ -1,180 +0,0 @@ -/** - * @file lv_xkb.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_xkb_private.h" - -#if defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB - -#include "../../core/lv_group.h" -#include "../../misc/lv_log.h" - -#include -#include -#include -#include -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static bool _set_keymap(lv_xkb_t * dsc, struct xkb_rule_names names); - -/********************** - * STATIC VARIABLES - **********************/ - -static struct xkb_context * context = NULL; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -bool lv_xkb_init(lv_xkb_t * dsc, struct xkb_rule_names names) -{ - if(!context) { - context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); - if(!context) { - LV_LOG_ERROR("xkb_context_new failed: %s", strerror(errno)); - return false; - } - } - - return _set_keymap(dsc, names); -} - -void lv_xkb_deinit(lv_xkb_t * dsc) -{ - if(dsc->state) { - xkb_state_unref(dsc->state); - dsc->state = NULL; - } - - if(dsc->keymap) { - xkb_keymap_unref(dsc->keymap); - dsc->keymap = NULL; - } -} - -uint32_t lv_xkb_process_key(lv_xkb_t * dsc, uint32_t scancode, bool down) -{ - /* Offset the evdev scancode by 8, see https://xkbcommon.org/doc/current/xkbcommon_8h.html#ac29aee92124c08d1953910ab28ee1997 */ - xkb_keycode_t keycode = scancode + 8; - - uint32_t result = 0; - - switch(xkb_state_key_get_one_sym(dsc->state, keycode)) { - case XKB_KEY_BackSpace: - result = LV_KEY_BACKSPACE; - break; - case XKB_KEY_Return: - case XKB_KEY_KP_Enter: - result = LV_KEY_ENTER; - break; - case XKB_KEY_Prior: - case XKB_KEY_KP_Prior: - result = LV_KEY_PREV; - break; - case XKB_KEY_Next: - case XKB_KEY_KP_Next: - result = LV_KEY_NEXT; - break; - case XKB_KEY_Up: - case XKB_KEY_KP_Up: - result = LV_KEY_UP; - break; - case XKB_KEY_Left: - case XKB_KEY_KP_Left: - result = LV_KEY_LEFT; - break; - case XKB_KEY_Right: - case XKB_KEY_KP_Right: - result = LV_KEY_RIGHT; - break; - case XKB_KEY_Down: - case XKB_KEY_KP_Down: - result = LV_KEY_DOWN; - break; - case XKB_KEY_Tab: - case XKB_KEY_KP_Tab: - result = LV_KEY_NEXT; - break; - case XKB_KEY_ISO_Left_Tab: /* Sent on SHIFT + TAB */ - result = LV_KEY_PREV; - break; - case XKB_KEY_Home: - case XKB_KEY_KP_Home: - result = LV_KEY_HOME; - break; - case XKB_KEY_End: - case XKB_KEY_KP_End: - result = LV_KEY_END; - break; - default: - break; - } - - if(result == 0) { - char buffer[4] = { 0, 0, 0, 0 }; - int size = xkb_state_key_get_utf8(dsc->state, keycode, NULL, 0) + 1; - if(size > 1) { - xkb_state_key_get_utf8(dsc->state, keycode, buffer, size); - memcpy(&result, buffer, 4); - } - } - - xkb_state_update_key(dsc->state, keycode, down ? XKB_KEY_DOWN : XKB_KEY_UP); - - return result; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static bool _set_keymap(lv_xkb_t * dsc, struct xkb_rule_names names) -{ - if(dsc->keymap) { - xkb_keymap_unref(dsc->keymap); - dsc->keymap = NULL; - } - - dsc->keymap = xkb_keymap_new_from_names(context, &names, XKB_KEYMAP_COMPILE_NO_FLAGS); - if(!dsc->keymap) { - LV_LOG_ERROR("xkb_keymap_new_from_names failed: %s", strerror(errno)); - return false; - } - - if(dsc->state) { - xkb_state_unref(dsc->state); - dsc->state = NULL; - } - - dsc->state = xkb_state_new(dsc->keymap); - if(!dsc->state) { - LV_LOG_ERROR("xkb_state_new failed: %s", strerror(errno)); - return false; - } - - return true; -} - -#endif /* defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_xkb.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_xkb.h deleted file mode 100644 index 3f9fd86..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_xkb.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @file lv_xkb.h - * - */ - -#ifndef LV_XKB_H -#define LV_XKB_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" - -#if defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB - -#include "../../misc/lv_types.h" -#include -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialise an XKB descriptor. - * @return true if the initialisation was successful - */ -bool lv_xkb_init(lv_xkb_t * dsc, struct xkb_rule_names names); - -/** - * De-initialise an XKB descriptor. - * @param dsc Pointer to descriptor - */ -void lv_xkb_deinit(lv_xkb_t * dsc); - -/** - * Process an evdev scancode using a specific XKB descriptor. - * @param state XKB descriptor to use - * @param scancode evdev scancode to process - * @param down true if the key was pressed, false if it was releases - * @return the (first) UTF-8 character produced by the event or 0 if no output was produced - */ -uint32_t lv_xkb_process_key(lv_xkb_t * dsc, uint32_t scancode, bool down); - -/********************** - * MACROS - **********************/ - -#endif /* LV_LIBINPUT_XKB */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_xkb_private.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_xkb_private.h deleted file mode 100644 index 3157625..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/libinput/lv_xkb_private.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @file lv_xkb_private.h - * - */ - -#ifndef LV_XKB_PRIVATE_H -#define LV_XKB_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_xkb.h" - -#if defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_xkb_t { - struct xkb_keymap * keymap; - struct xkb_state * state; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_XKB_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/lv_drivers.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/lv_drivers.h deleted file mode 100644 index 08c76e7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/lv_drivers.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @file lv_drivers.h - * - */ - -#ifndef LV_DRIVERS_H -#define LV_DRIVERS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "sdl/lv_sdl_window.h" -#include "sdl/lv_sdl_mouse.h" -#include "sdl/lv_sdl_mousewheel.h" -#include "sdl/lv_sdl_keyboard.h" - -#include "x11/lv_x11.h" - -#include "display/drm/lv_linux_drm.h" -#include "display/fb/lv_linux_fbdev.h" - -#include "display/tft_espi/lv_tft_espi.h" - -#include "nuttx/lv_nuttx_entry.h" -#include "nuttx/lv_nuttx_fbdev.h" -#include "nuttx/lv_nuttx_touchscreen.h" -#include "nuttx/lv_nuttx_lcd.h" -#include "nuttx/lv_nuttx_libuv.h" - -#include "evdev/lv_evdev.h" -#include "libinput/lv_libinput.h" - -#include "windows/lv_windows_input.h" -#include "windows/lv_windows_display.h" - -#include "glfw/lv_glfw_window.h" -#include "glfw/lv_opengles_texture.h" -#include "glfw/lv_opengles_driver.h" - -#include "qnx/lv_qnx.h" - -#include "wayland/lv_wayland.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRIVERS_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_cache.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_cache.c deleted file mode 100644 index 273f49e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_cache.c +++ /dev/null @@ -1,96 +0,0 @@ -/** - * @file lv_nuttx_cache.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_nuttx_cache.h" -#include "../../../lvgl.h" - -#if LV_USE_NUTTX - -#include "../../draw/lv_draw_buf_private.h" -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); -static void flush_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_nuttx_cache_init(void) -{ - lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); - handlers->invalidate_cache_cb = invalidate_cache; - handlers->flush_cache_cb = flush_cache; -} - -void lv_nuttx_cache_deinit(void) -{ - lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); - handlers->invalidate_cache_cb = NULL; - handlers->flush_cache_cb = NULL; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void draw_buf_to_region( - const lv_draw_buf_t * draw_buf, const lv_area_t * area, - lv_uintptr_t * start, lv_uintptr_t * end) -{ - LV_ASSERT_NULL(draw_buf); - LV_ASSERT_NULL(area); - LV_ASSERT_NULL(start); - LV_ASSERT_NULL(end); - - void * buf = draw_buf->data; - uint32_t stride = draw_buf->header.stride; - - int32_t h = lv_area_get_height(area); - *start = (lv_uintptr_t)buf + area->y1 * stride; - *end = *start + h * stride; -} - -static void invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) -{ - lv_uintptr_t start; - lv_uintptr_t end; - draw_buf_to_region(draw_buf, area, &start, &end); - up_invalidate_dcache(start, end); -} - -static void flush_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) -{ - lv_uintptr_t start; - lv_uintptr_t end; - draw_buf_to_region(draw_buf, area, &start, &end); - up_flush_dcache(start, end); -} - -#endif /* LV_USE_NUTTX */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_cache.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_cache.h deleted file mode 100644 index 74be6d3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_cache.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @file lv_nuttx_cache.h - * - */ - -#ifndef LV_NUTTX_CACHE_H -#define LV_NUTTX_CACHE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_nuttx_cache_init(void); - -void lv_nuttx_cache_deinit(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_NUTTX_CACHE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_entry.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_entry.c deleted file mode 100644 index 57a4d28..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_entry.c +++ /dev/null @@ -1,306 +0,0 @@ -/** - * @file lv_nuttx_entry.h - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_nuttx_entry.h" - -#if LV_USE_NUTTX - -#include -#include -#include -#include -#include -#include "lv_nuttx_cache.h" -#include "lv_nuttx_image_cache.h" -#include "../../core/lv_global.h" -#include "lv_nuttx_profiler.h" - -#include "../../../lvgl.h" - -/********************* - * DEFINES - *********************/ - -#define nuttx_ctx_p (LV_GLOBAL_DEFAULT()->nuttx_ctx) - -#if (LV_USE_FREETYPE || LV_USE_THORVG) - #define LV_NUTTX_MIN_STACK_SIZE (32 * 1024) -#else - #define LV_NUTTX_MIN_STACK_SIZE (8 * 1024) -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static uint32_t millis(void); -#if LV_USE_LOG - static void syslog_print(lv_log_level_t level, const char * buf); -#endif -static void check_stack_size(void); - -#ifdef CONFIG_LV_USE_NUTTX_LIBUV - static void lv_nuttx_uv_loop(lv_nuttx_result_t * result); -#endif - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -#if LV_ENABLE_GLOBAL_CUSTOM - -static void lv_global_free(void * data) -{ - if(data) { - free(data); - } -} - -lv_global_t * lv_global_default(void) -{ - static int index = -1; - lv_global_t * data = NULL; - - if(index < 0) { - index = task_tls_alloc(lv_global_free); - } - - if(index >= 0) { - data = (lv_global_t *)task_tls_get_value(index); - if(data == NULL) { - data = (lv_global_t *)calloc(1, sizeof(lv_global_t)); - task_tls_set_value(index, (uintptr_t)data); - } - } - return data; -} -#endif - -void lv_nuttx_dsc_init(lv_nuttx_dsc_t * dsc) -{ - if(dsc == NULL) - return; - - lv_memzero(dsc, sizeof(lv_nuttx_dsc_t)); - dsc->fb_path = "/dev/fb0"; - dsc->input_path = "/dev/input0"; - -#ifdef CONFIG_UINPUT_TOUCH - dsc->utouch_path = "/dev/utouch"; -#endif -} - -void lv_nuttx_init(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result) -{ - nuttx_ctx_p = lv_malloc_zeroed(sizeof(lv_nuttx_ctx_t)); - LV_ASSERT_MALLOC(nuttx_ctx_p); - -#if LV_USE_LOG - lv_log_register_print_cb(syslog_print); -#endif - lv_tick_set_cb(millis); - - check_stack_size(); - - lv_nuttx_cache_init(); - - lv_nuttx_image_cache_init(); - -#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN - lv_nuttx_profiler_init(); -#endif - - if(result) { - lv_memzero(result, sizeof(lv_nuttx_result_t)); - } - -#if !LV_USE_NUTTX_CUSTOM_INIT - - if(dsc && dsc->fb_path) { - lv_display_t * disp = NULL; - -#if LV_USE_NUTTX_LCD - disp = lv_nuttx_lcd_create(dsc->fb_path); -#else - disp = lv_nuttx_fbdev_create(); - if(lv_nuttx_fbdev_set_file(disp, dsc->fb_path) != 0) { - lv_display_delete(disp); - disp = NULL; - } -#endif - if(result) { - result->disp = disp; - } - } - - if(dsc) { -#if LV_USE_NUTTX_TOUCHSCREEN - if(dsc->input_path) { - lv_indev_t * indev = lv_nuttx_touchscreen_create(dsc->input_path); - if(result) { - result->indev = indev; - } - } - - if(dsc->utouch_path) { - lv_indev_t * indev = lv_nuttx_touchscreen_create(dsc->utouch_path); - if(result) { - result->utouch_indev = indev; - } - } -#endif - } - -#else - - lv_nuttx_init_custom(dsc, result); -#endif -} - -void lv_nuttx_run(lv_nuttx_result_t * result) -{ -#ifdef CONFIG_LV_USE_NUTTX_LIBUV - lv_nuttx_uv_loop(&ui_loop, result); -#else - while(1) { - uint32_t idle; - idle = lv_timer_handler(); - - /* Minimum sleep of 1ms */ - idle = idle ? idle : 1; - usleep(idle * 1000); - } -#endif -} - -#ifdef CONFIG_SCHED_CPULOAD - -uint32_t lv_nuttx_get_idle(void) -{ - struct cpuload_s cpuload; - int ret = clock_cpuload(0, &cpuload); - if(ret < 0) { - LV_LOG_WARN("clock_cpuload failed: %d", ret); - return 0; - } - - uint32_t idle = cpuload.active * 100 / cpuload.total; - LV_LOG_TRACE("active = %" LV_PRIu32 ", total = %" LV_PRIu32, - cpuload.active, cpuload.total); - - return idle; -} - -#endif - -void lv_nuttx_deinit(lv_nuttx_result_t * result) -{ -#if !LV_USE_NUTTX_CUSTOM_INIT - if(result) { - if(result->disp) { - lv_display_delete(result->disp); - result->disp = NULL; - } - - if(result->indev) { - lv_indev_delete(result->indev); - result->indev = NULL; - } - - if(result->utouch_indev) { - lv_indev_delete(result->utouch_indev); - result->utouch_indev = NULL; - } - } -#else - lv_nuttx_deinit_custom(result); -#endif - - if(nuttx_ctx_p) { - lv_nuttx_cache_deinit(); - lv_nuttx_image_cache_deinit(); - - lv_free(nuttx_ctx_p); - nuttx_ctx_p = NULL; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static uint32_t millis(void) -{ - struct timespec ts; - - clock_gettime(CLOCK_MONOTONIC, &ts); - uint32_t tick = ts.tv_sec * 1000 + ts.tv_nsec / 1000000; - - return tick; -} - -#if LV_USE_LOG -static void syslog_print(lv_log_level_t level, const char * buf) -{ - static const int priority[LV_LOG_LEVEL_NUM] = { - LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERR, LOG_CRIT - }; - - syslog(priority[level], "[LVGL] %s", buf); -} -#endif - -#ifdef CONFIG_LV_USE_NUTTX_LIBUV -static void lv_nuttx_uv_loop(lv_nuttx_result_t * result) -{ - uv_loop_t loop; - lv_nuttx_uv_t uv_info; - void * data; - - uv_loop_init(&loop); - - lv_memzero(&uv_info, sizeof(uv_info)); - uv_info.loop = &loop; - uv_info.disp = result->disp; - uv_info.indev = result->indev; -#ifdef CONFIG_UINPUT_TOUCH - uv_info.uindev = result->utouch_indev; -#endif - - data = lv_nuttx_uv_init(&uv_info); - uv_run(loop, UV_RUN_DEFAULT); - lv_nuttx_uv_deinit(&data); -} -#endif - -static void check_stack_size(void) -{ - pthread_t tid = pthread_self(); - ssize_t stack_size = pthread_get_stacksize_np(tid); - LV_LOG_USER("tid: %d, Stack size : %zd", (int)tid, stack_size); - - if(stack_size < LV_NUTTX_MIN_STACK_SIZE) { - LV_LOG_ERROR("Stack size is too small. Please increase it to %d bytes or more.", - LV_NUTTX_MIN_STACK_SIZE); - } -} - -#endif /*LV_USE_NUTTX*/ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_entry.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_entry.h deleted file mode 100644 index 64ece99..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_entry.h +++ /dev/null @@ -1,112 +0,0 @@ -/** - * @file lv_nuttx_entry.h - * - */ - -/********************* - * INCLUDES - *********************/ - -#ifndef LV_NUTTX_ENTRY_H -#define LV_NUTTX_ENTRY_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" -#include "../../display/lv_display.h" -#include "../../indev/lv_indev.h" - -#if LV_USE_NUTTX - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - const char * fb_path; - const char * input_path; - const char * utouch_path; -} lv_nuttx_dsc_t; - -typedef struct { - lv_display_t * disp; - lv_indev_t * indev; - lv_indev_t * utouch_indev; -} lv_nuttx_result_t; - -typedef struct lv_nuttx_ctx_t { - void * image_cache; -} lv_nuttx_ctx_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the lv_nuttx_dsc_t structure with default values for the NuttX port of LVGL. - * @param dsc Pointer to the lv_nuttx_dsc_t structure to be initialized. - */ -void lv_nuttx_dsc_init(lv_nuttx_dsc_t * dsc); - -/** - * Initialize the LVGL display driver for NuttX using the provided configuration information. - * @param dsc Pointer to the lv_nuttx_dsc_t structure containing the configuration information for the display driver. - * @param result Pointer to the lv_nuttx_result_t structure containing display and input device handler. - */ -void lv_nuttx_init(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result); - -/** - * Deinitialize the LVGL display driver for NuttX. - * @param result Pointer to the lv_nuttx_result_t structure containing display and input device handler. - */ -void lv_nuttx_deinit(lv_nuttx_result_t * result); - -#if LV_USE_NUTTX_CUSTOM_INIT -/** - * Initialize the LVGL display driver for NuttX using the provided custom configuration information. - * @param dsc Pointer to the lv_nuttx_dsc_t structure containing the custom configuration for the display driver. - * @param result Pointer to the lv_nuttx_result_t structure containing display and input device handler. - */ -void lv_nuttx_init_custom(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result); - -/** - * Deinitialize the LVGL display driver for NuttX using the provided custom configuration information. - * @param result Pointer to the lv_nuttx_result_t structure containing display and input device handler. - */ -void lv_nuttx_deinit_custom(lv_nuttx_result_t * result); -#endif /* LV_USE_NUTTX_CUSTOM_INIT */ - -/** - * Call `lv_timer_handler()` (LVGL's super loop) in an endless loop. - * If LV_USE_NUTTX_LIBUV is enabled an UV timer will be created, - * else `lv_timer_handler()` will be called in a loop with some sleep. - * @param result pointer to a variable initialized by `lv_nuttx_init()` or `lv_nuttx_init_custom()` - */ -void lv_nuttx_run(lv_nuttx_result_t * result); - -/** - * Get the idle percentage of the system. - * @return The idle percentage of the system. - */ -uint32_t lv_nuttx_get_idle(void); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_NUTTX*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_NUTTX_ENTRY_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_fbdev.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_fbdev.c deleted file mode 100644 index 5ff500e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_fbdev.c +++ /dev/null @@ -1,407 +0,0 @@ -/** - * @file lv_nuttx_fbdev.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_nuttx_fbdev.h" -#if LV_USE_NUTTX - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../../../lvgl.h" -#include "../../lvgl_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - /* fd should be defined at the beginning */ - int fd; - struct fb_videoinfo_s vinfo; - struct fb_planeinfo_s pinfo; - - void * mem; - void * mem2; - void * mem_off_screen; - uint32_t mem2_yoffset; - - lv_draw_buf_t buf1; - lv_draw_buf_t buf2; -} lv_nuttx_fb_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); -static lv_color_format_t fb_fmt_to_color_format(int fmt); -static int fbdev_get_pinfo(int fd, struct fb_planeinfo_s * pinfo); -static int fbdev_init_mem2(lv_nuttx_fb_t * dsc); -static void display_refr_timer_cb(lv_timer_t * tmr); -static void display_release_cb(lv_event_t * e); -#if defined(CONFIG_FB_UPDATE) - static void fbdev_join_inv_areas(lv_display_t * disp, lv_area_t * final_inv_area); -#endif - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_nuttx_fbdev_create(void) -{ - lv_nuttx_fb_t * dsc = lv_malloc_zeroed(sizeof(lv_nuttx_fb_t)); - LV_ASSERT_MALLOC(dsc); - if(dsc == NULL) return NULL; - - lv_display_t * disp = lv_display_create(800, 480); - if(disp == NULL) { - lv_free(dsc); - return NULL; - } - dsc->fd = -1; - lv_display_set_driver_data(disp, dsc); - lv_display_add_event_cb(disp, display_release_cb, LV_EVENT_DELETE, disp); - lv_display_set_flush_cb(disp, flush_cb); - return disp; -} - -int lv_nuttx_fbdev_set_file(lv_display_t * disp, const char * file) -{ - int ret; - LV_ASSERT(disp && file); - lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp); - - if(dsc->fd >= 0) close(dsc->fd); - - /* Open the file for reading and writing*/ - - dsc->fd = open(file, O_RDWR); - if(dsc->fd < 0) { - LV_LOG_ERROR("Error: cannot open framebuffer device"); - return -errno; - } - LV_LOG_USER("The framebuffer device was opened successfully"); - - if(ioctl(dsc->fd, FBIOGET_VIDEOINFO, (unsigned long)((uintptr_t)&dsc->vinfo)) < 0) { - LV_LOG_ERROR("ioctl(FBIOGET_VIDEOINFO) failed: %d", errno); - ret = -errno; - goto errout; - } - - LV_LOG_USER("VideoInfo:"); - LV_LOG_USER(" fmt: %u", dsc->vinfo.fmt); - LV_LOG_USER(" xres: %u", dsc->vinfo.xres); - LV_LOG_USER(" yres: %u", dsc->vinfo.yres); - LV_LOG_USER(" nplanes: %u", dsc->vinfo.nplanes); - - if((ret = fbdev_get_pinfo(dsc->fd, &dsc->pinfo)) < 0) { - goto errout; - } - - lv_color_format_t color_format = fb_fmt_to_color_format(dsc->vinfo.fmt); - if(color_format == LV_COLOR_FORMAT_UNKNOWN) { - goto errout; - } - - dsc->mem = mmap(NULL, dsc->pinfo.fblen, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_FILE, dsc->fd, 0); - if(dsc->mem == MAP_FAILED) { - LV_LOG_ERROR("ioctl(FBIOGET_PLANEINFO) failed: %d", errno); - ret = -errno; - goto errout; - } - - uint32_t w = dsc->vinfo.xres; - uint32_t h = dsc->vinfo.yres; - uint32_t stride = dsc->pinfo.stride; - uint32_t data_size = h * stride; - lv_draw_buf_init(&dsc->buf1, w, h, color_format, stride, dsc->mem, data_size); - - /* Check buffer mode */ - bool double_buffer = dsc->pinfo.yres_virtual == (dsc->vinfo.yres * 2); - if(double_buffer) { - if((ret = fbdev_init_mem2(dsc)) < 0) { - goto errout; - } - - lv_draw_buf_init(&dsc->buf2, w, h, color_format, stride, dsc->mem2, data_size); - lv_display_set_draw_buffers(disp, &dsc->buf1, &dsc->buf2); - } - else { - dsc->mem_off_screen = malloc(data_size); - LV_ASSERT_MALLOC(dsc->mem_off_screen); - if(!dsc->mem_off_screen) { - ret = -ENOMEM; - LV_LOG_ERROR("Failed to allocate memory for off-screen buffer"); - goto errout; - } - - LV_LOG_USER("Use off-screen mode, memory: %p, size: %" LV_PRIu32, dsc->mem_off_screen, data_size); - lv_draw_buf_init(&dsc->buf2, w, h, color_format, stride, dsc->mem_off_screen, data_size); - lv_display_set_draw_buffers(disp, &dsc->buf2, NULL); - } - - lv_display_set_color_format(disp, color_format); - lv_display_set_render_mode(disp, LV_DISPLAY_RENDER_MODE_DIRECT); - lv_display_set_resolution(disp, dsc->vinfo.xres, dsc->vinfo.yres); - lv_timer_set_cb(disp->refr_timer, display_refr_timer_cb); - - LV_LOG_USER("Resolution is set to %dx%d at %" LV_PRId32 "dpi", - dsc->vinfo.xres, dsc->vinfo.yres, lv_display_get_dpi(disp)); - return 0; - -errout: - close(dsc->fd); - dsc->fd = -1; - return ret; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#if defined(CONFIG_FB_UPDATE) -static void fbdev_join_inv_areas(lv_display_t * disp, lv_area_t * final_inv_area) -{ - uint16_t inv_index; - - bool area_joined = false; - - for(inv_index = 0; inv_index < disp->inv_p; inv_index++) { - if(disp->inv_area_joined[inv_index] == 0) { - const lv_area_t * area_p = &disp->inv_areas[inv_index]; - - /* Join to final_area */ - - if(!area_joined) { - /* copy first area */ - lv_area_copy(final_inv_area, area_p); - area_joined = true; - } - else { - lv_area_join(final_inv_area, - final_inv_area, - area_p); - } - } - } -} -#endif - -static void display_refr_timer_cb(lv_timer_t * tmr) -{ - lv_display_t * disp = lv_timer_get_user_data(tmr); - lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp); - struct pollfd pfds[1]; - - lv_memzero(pfds, sizeof(pfds)); - pfds[0].fd = dsc->fd; - pfds[0].events = POLLOUT; - - /* Query free fb to draw */ - - if(poll(pfds, 1, 0) < 0) { - return; - } - - if(pfds[0].revents & POLLOUT) { - lv_display_refr_timer(tmr); - } -} - -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p) -{ - LV_UNUSED(color_p); - lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp); - - if(dsc->mem_off_screen) { - /* When rendering in off-screen mode, copy the drawing buffer to fb */ - /* buf2(off-screen buffer) -> buf1(fbmem)*/ - lv_draw_buf_copy(&dsc->buf1, area, &dsc->buf2, area); - } - - /* Skip the non-last flush */ - - if(!lv_display_flush_is_last(disp)) { - lv_display_flush_ready(disp); - return; - } - -#if defined(CONFIG_FB_UPDATE) - /*May be some direct update command is required*/ - int yoffset = disp->buf_act == disp->buf_1 ? - 0 : dsc->mem2_yoffset; - - /* Join the areas to update */ - lv_area_t final_inv_area; - lv_memzero(&final_inv_area, sizeof(final_inv_area)); - fbdev_join_inv_areas(disp, &final_inv_area); - - struct fb_area_s fb_area; - fb_area.x = final_inv_area.x1; - fb_area.y = final_inv_area.y1 + yoffset; - fb_area.w = lv_area_get_width(&final_inv_area); - fb_area.h = lv_area_get_height(&final_inv_area); - if(ioctl(dsc->fd, FBIO_UPDATE, (unsigned long)((uintptr_t)&fb_area)) < 0) { - LV_LOG_ERROR("ioctl(FBIO_UPDATE) failed: %d", errno); - } -#endif - - /* double framebuffer */ - - if(dsc->mem2 != NULL) { - if(disp->buf_act == disp->buf_1) { - dsc->pinfo.yoffset = 0; - } - else { - dsc->pinfo.yoffset = dsc->mem2_yoffset; - } - - if(ioctl(dsc->fd, FBIOPAN_DISPLAY, (unsigned long)((uintptr_t) & (dsc->pinfo))) < 0) { - LV_LOG_ERROR("ioctl(FBIOPAN_DISPLAY) failed: %d", errno); - } - } - lv_display_flush_ready(disp); -} - -static lv_color_format_t fb_fmt_to_color_format(int fmt) -{ - switch(fmt) { - case FB_FMT_RGB16_565: - return LV_COLOR_FORMAT_RGB565; - case FB_FMT_RGB24: - return LV_COLOR_FORMAT_RGB888; - case FB_FMT_RGB32: - return LV_COLOR_FORMAT_XRGB8888; - case FB_FMT_RGBA32: - return LV_COLOR_FORMAT_ARGB8888; - default: - break; - } - - LV_LOG_ERROR("Unsupported color format: %d", fmt); - - return LV_COLOR_FORMAT_UNKNOWN; -} - -static int fbdev_get_pinfo(int fd, FAR struct fb_planeinfo_s * pinfo) -{ - if(ioctl(fd, FBIOGET_PLANEINFO, (unsigned long)((uintptr_t)pinfo)) < 0) { - LV_LOG_ERROR("ERROR: ioctl(FBIOGET_PLANEINFO) failed: %d", errno); - return -errno; - } - - LV_LOG_USER("PlaneInfo (plane %d):", pinfo->display); - LV_LOG_USER(" mem: %p", pinfo->fbmem); - LV_LOG_USER(" fblen: %zu", pinfo->fblen); - LV_LOG_USER(" stride: %u", pinfo->stride); - LV_LOG_USER(" display: %u", pinfo->display); - LV_LOG_USER(" bpp: %u", pinfo->bpp); - - return 0; -} - -static int fbdev_init_mem2(lv_nuttx_fb_t * dsc) -{ - uintptr_t buf_offset; - struct fb_planeinfo_s pinfo; - int ret; - - lv_memzero(&pinfo, sizeof(pinfo)); - - /* Get display[1] planeinfo */ - - pinfo.display = dsc->pinfo.display + 1; - - if((ret = fbdev_get_pinfo(dsc->fd, &pinfo)) < 0) { - return ret; - } - - /* Check bpp */ - - if(pinfo.bpp != dsc->pinfo.bpp) { - LV_LOG_WARN("mem2 is incorrect"); - return -EINVAL; - } - - /* Check the buffer address offset, - * It needs to be divisible by pinfo.stride - */ - - buf_offset = pinfo.fbmem - dsc->mem; - - if((buf_offset % dsc->pinfo.stride) != 0) { - LV_LOG_WARN("It is detected that buf_offset(%" PRIuPTR ") " - "and stride(%d) are not divisible, please ensure " - "that the driver handles the address offset by itself.", - buf_offset, dsc->pinfo.stride); - } - - /* Calculate the address and yoffset of mem2 */ - - if(buf_offset == 0) { - dsc->mem2_yoffset = dsc->vinfo.yres; - dsc->mem2 = pinfo.fbmem + dsc->mem2_yoffset * pinfo.stride; - LV_LOG_USER("Use consecutive mem2 = %p, yoffset = %" LV_PRIu32, - dsc->mem2, dsc->mem2_yoffset); - } - else { - dsc->mem2_yoffset = buf_offset / dsc->pinfo.stride; - dsc->mem2 = pinfo.fbmem; - LV_LOG_USER("Use non-consecutive mem2 = %p, yoffset = %" LV_PRIu32, - dsc->mem2, dsc->mem2_yoffset); - } - - return 0; -} - -static void display_release_cb(lv_event_t * e) -{ - lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e); - lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp); - if(dsc) { - lv_display_set_driver_data(disp, NULL); - lv_display_set_flush_cb(disp, NULL); - - if(dsc->fd >= 0) { - close(dsc->fd); - dsc->fd = -1; - } - - if(dsc->mem_off_screen) { - /* Free the off-screen buffer */ - free(dsc->mem_off_screen); - dsc->mem_off_screen = NULL; - } - - lv_free(dsc); - } - LV_LOG_USER("Done"); -} - -#endif /*LV_USE_NUTTX*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_fbdev.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_fbdev.h deleted file mode 100644 index 4310aa9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_fbdev.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @file lv_nuttx_fbdev.h - * - */ - -#ifndef LV_NUTTX_FBDEV_H -#define LV_NUTTX_FBDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../display/lv_display.h" - -#if LV_USE_NUTTX - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a new display with NuttX backend. - */ -lv_display_t * lv_nuttx_fbdev_create(void); - -/** - * Initialize display with specified framebuffer device - * @param disp pointer to display with NuttX backend - * @param file the name of framebuffer device - */ -int lv_nuttx_fbdev_set_file(lv_display_t * disp, const char * file); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_NUTTX */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_NUTTX_FBDEV_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_image_cache.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_image_cache.c deleted file mode 100644 index 93f59ed..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_image_cache.c +++ /dev/null @@ -1,176 +0,0 @@ -/** - * @file lv_nuttx_image_cache.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_nuttx_image_cache.h" -#include "../../core/lv_global.h" -#include "../../../lvgl.h" - -#if LV_USE_NUTTX - -#include "../../draw/lv_draw_buf_private.h" -#include - -/********************* - * DEFINES - *********************/ - -#define HEAP_NAME "GImageCache" - -#define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache) -#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache) -#define ctx (*(lv_nuttx_ctx_image_cache_t **)&LV_GLOBAL_DEFAULT()->nuttx_ctx->image_cache) -#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - uint8_t * mem; - uint32_t mem_size; - - char name[sizeof(HEAP_NAME) + 10]; /**< +10 characters to store task pid. */ - - struct mm_heap_s * heap; - uint32_t heap_size; - - bool initialized; -} lv_nuttx_ctx_image_cache_t; -/********************** - * STATIC PROTOTYPES - **********************/ - -static void * malloc_cb(size_t size_bytes, lv_color_format_t color_format); -static void free_cb(void * draw_buf); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_nuttx_image_cache_init(void) -{ - lv_draw_buf_handlers_t * handlers = image_cache_draw_buf_handlers; - handlers->buf_malloc_cb = malloc_cb; - handlers->buf_free_cb = free_cb; - - ctx = lv_malloc_zeroed(sizeof(lv_nuttx_ctx_image_cache_t)); - LV_ASSERT_MALLOC(ctx); - - ctx->initialized = false; -} - -void lv_nuttx_image_cache_deinit(void) -{ - if(ctx->initialized == false) goto FREE_CONTEXT; - - mm_uninitialize(ctx->heap); - free(ctx->mem); - -FREE_CONTEXT: - lv_free(ctx); - - ctx = NULL; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static bool defer_init(void) -{ - if(ctx->mem != NULL && ctx->heap != NULL) { - return true; - } - - if(lv_image_cache_is_enabled() == false) { - LV_LOG_INFO("Image cache is not initialized yet. Skipping deferred initialization. Because max_size is 0."); - return false; - } - - ctx->mem_size = img_cache_p->max_size; - ctx->mem = malloc(ctx->mem_size); - LV_ASSERT_MALLOC(ctx->mem); - - if(ctx->mem == NULL) { - LV_LOG_ERROR("Failed to allocate memory for image cache"); - ctx->initialized = false; - return false; - } - - lv_snprintf(ctx->name, sizeof(ctx->name), HEAP_NAME "[%-4" LV_PRIu32 "]", (uint32_t)gettid()); - - ctx->heap = mm_initialize( - ctx->name, - ctx->mem, - ctx->mem_size - ); - - struct mallinfo info = mm_mallinfo(ctx->heap); - ctx->heap_size = info.arena; - - LV_LOG_USER("heap info:"); - LV_LOG_USER(" heap: %p", ctx->heap); - LV_LOG_USER(" mem: %p", ctx->mem); - LV_LOG_USER(" mem_size: %" LV_PRIu32, ctx->mem_size); - LV_LOG_USER(" arena: %d", info.arena); - LV_LOG_USER(" ordblks: %d", info.ordblks); - LV_LOG_USER(" aordblks: %d", info.aordblks); - LV_LOG_USER(" mxordblk: %d", info.mxordblk); - LV_LOG_USER(" uordblks: %d", info.uordblks); - LV_LOG_USER(" fordblks: %d", info.fordblks); - - ctx->initialized = true; - return true; -} - -static void * malloc_cb(size_t size_bytes, lv_color_format_t color_format) -{ - LV_UNUSED(color_format); - - if(ctx->initialized == false) { - if(defer_init() == false) return NULL; - } - - /*Allocate larger memory to be sure it can be aligned as needed*/ - size_bytes += LV_DRAW_BUF_ALIGN - 1; - uint32_t cache_max_size = lv_cache_get_max_size(img_cache_p, NULL); - - if(size_bytes > cache_max_size) { - LV_LOG_ERROR("data size (%" LV_PRIu32 ") is larger than max size (%" LV_PRIu32 ")", - (uint32_t)size_bytes, - cache_max_size); - return NULL; - } - - while(1) { - void * mem = mm_malloc(ctx->heap, size_bytes); - if(mem) return mem; - LV_LOG_INFO("appears to be out of memory. attempting to evict one cache entry. with allocated size %" LV_PRIu32, - (uint32_t)size_bytes); - bool evict_res = lv_cache_evict_one(img_cache_p, NULL); - if(evict_res == false) { - LV_LOG_ERROR("failed to evict one cache entry"); - return NULL; - } - } -} - -static void free_cb(void * draw_buf) -{ - mm_free(ctx->heap, draw_buf); -} - -#endif /* LV_USE_NUTTX */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_image_cache.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_image_cache.h deleted file mode 100644 index 105779f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_image_cache.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @file lv_nuttx_image_cache.h - * - */ - -#ifndef LV_NUTTX_IMAGE_CACHE_H -#define LV_NUTTX_IMAGE_CACHE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_nuttx_image_cache_init(void); - -void lv_nuttx_image_cache_deinit(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_NUTTX_IMAGE_CACHE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_lcd.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_lcd.c deleted file mode 100644 index af49cd4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_lcd.c +++ /dev/null @@ -1,238 +0,0 @@ -/** - * @file lv_nuttx_lcd.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_nuttx_lcd.h" - -#if LV_USE_NUTTX - -#if LV_USE_NUTTX_LCD - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../../../lvgl.h" -#include "../../lvgl_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - /* fd should be defined at the beginning */ - int fd; - lv_display_t * disp; - struct lcddev_area_s area; - struct lcddev_area_align_s align_info; -} lv_nuttx_lcd_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static int32_t align_round_up(int32_t v, uint16_t align); -static void rounder_cb(lv_event_t * e); -static void flush_cb(lv_display_t * disp, const lv_area_t * area_p, - uint8_t * color_p); -static lv_display_t * lcd_init(int fd, int hor_res, int ver_res); -static void display_release_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_nuttx_lcd_create(const char * dev_path) -{ - struct fb_videoinfo_s vinfo; - struct lcd_planeinfo_s pinfo; - lv_display_t * disp; - int fd; - int ret; - - LV_ASSERT_NULL(dev_path); - - LV_LOG_USER("lcd %s opening", dev_path); - fd = open(dev_path, 0); - if(fd < 0) { - perror("Error: cannot open lcd device"); - return NULL; - } - - LV_LOG_USER("lcd %s open success", dev_path); - - ret = ioctl(fd, LCDDEVIO_GETVIDEOINFO, - (unsigned long)((uintptr_t)&vinfo)); - if(ret < 0) { - perror("Error: ioctl(LCDDEVIO_GETVIDEOINFO) failed"); - close(fd); - return NULL; - } - - ret = ioctl(fd, LCDDEVIO_GETPLANEINFO, - (unsigned long)((uintptr_t)&pinfo)); - if(ret < 0) { - perror("ERROR: ioctl(LCDDEVIO_GETPLANEINFO) failed"); - close(fd); - return NULL; - } - - disp = lcd_init(fd, vinfo.xres, vinfo.yres); - if(disp == NULL) { - close(fd); - } - - return disp; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static int32_t align_round_up(int32_t v, uint16_t align) -{ - return (v + align - 1) & ~(align - 1); -} - -static void rounder_cb(lv_event_t * e) -{ - lv_nuttx_lcd_t * lcd = lv_event_get_user_data(e); - lv_area_t * area = lv_event_get_param(e); - struct lcddev_area_align_s * align_info = &lcd->align_info; - int32_t w; - int32_t h; - - area->x1 &= ~(align_info->col_start_align - 1); - area->y1 &= ~(align_info->row_start_align - 1); - - w = align_round_up(lv_area_get_width(area), align_info->width_align); - h = align_round_up(lv_area_get_height(area), align_info->height_align); - - area->x2 = area->x1 + w - 1; - area->y2 = area->y1 + h - 1; -} - -static void flush_cb(lv_display_t * disp, const lv_area_t * area_p, - uint8_t * color_p) -{ - lv_nuttx_lcd_t * lcd = disp->driver_data; - - lcd->area.row_start = area_p->y1; - lcd->area.row_end = area_p->y2; - lcd->area.col_start = area_p->x1; - lcd->area.col_end = area_p->x2; - lcd->area.data = (uint8_t *)color_p; - ioctl(lcd->fd, LCDDEVIO_PUTAREA, (unsigned long) & (lcd->area)); - lv_display_flush_ready(disp); -} - -static lv_display_t * lcd_init(int fd, int hor_res, int ver_res) -{ - uint8_t * draw_buf = NULL; - uint8_t * draw_buf_2 = NULL; - lv_nuttx_lcd_t * lcd = lv_malloc_zeroed(sizeof(lv_nuttx_lcd_t)); - LV_ASSERT_MALLOC(lcd); - if(lcd == NULL) { - LV_LOG_ERROR("lv_nuttx_lcd_t malloc failed"); - return NULL; - } - - lv_display_t * disp = lv_display_create(hor_res, ver_res); - if(disp == NULL) { - lv_free(lcd); - return NULL; - } - - uint32_t px_size = lv_color_format_get_size(lv_display_get_color_format(disp)); -#if LV_NUTTX_LCD_BUFFER_COUNT > 0 - uint32_t buf_size = hor_res * ver_res * px_size; - lv_display_render_mode_t render_mode = LV_DISPLAY_RENDER_MODE_FULL; -#else - uint32_t buf_size = hor_res * LV_NUTTX_LCD_BUFFER_SIZE * px_size; - lv_display_render_mode_t render_mode = LV_DISPLAY_RENDER_MODE_PARTIAL; -#endif - - draw_buf = lv_malloc(buf_size); - if(draw_buf == NULL) { - LV_LOG_ERROR("display draw_buf malloc failed"); - lv_free(lcd); - return NULL; - } - -#if LV_NUTTX_LCD_BUFFER_COUNT == 2 - draw_buf_2 = lv_malloc(buf_size); - if(draw_buf_2 == NULL) { - LV_LOG_ERROR("display draw_buf_2 malloc failed"); - lv_free(lcd); - lv_free(draw_buf); - return NULL; - } -#endif - - lcd->fd = fd; - if(ioctl(fd, LCDDEVIO_GETAREAALIGN, &lcd->align_info) < 0) { - perror("Error: ioctl(LCDDEVIO_GETAREAALIGN) failed"); - } - - lcd->disp = disp; - lv_display_set_buffers(lcd->disp, draw_buf, draw_buf_2, buf_size, render_mode); - lv_display_set_flush_cb(lcd->disp, flush_cb); - lv_display_add_event_cb(lcd->disp, rounder_cb, LV_EVENT_INVALIDATE_AREA, lcd); - lv_display_add_event_cb(lcd->disp, display_release_cb, LV_EVENT_DELETE, lcd->disp); - lv_display_set_driver_data(lcd->disp, lcd); - - return lcd->disp; -} - -static void display_release_cb(lv_event_t * e) -{ - lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e); - lv_nuttx_lcd_t * dsc = lv_display_get_driver_data(disp); - if(dsc) { - lv_display_set_driver_data(disp, NULL); - lv_display_set_flush_cb(disp, NULL); - - /* clear display buffer */ - if(disp->buf_1) { - lv_free(disp->buf_1->data); - disp->buf_1 = NULL; - } - if(disp->buf_2) { - lv_free(disp->buf_2->data); - disp->buf_2 = NULL; - } - - /* close device fb */ - if(dsc->fd >= 0) { - close(dsc->fd); - dsc->fd = -1; - } - lv_free(dsc); - LV_LOG_USER("Done"); - } -} -#endif /*LV_USE_NUTTX_LCD*/ - -#endif /* LV_USE_NUTTX*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_lcd.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_lcd.h deleted file mode 100644 index 16e24ff..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_lcd.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @file lv_nuttx_lcd.h - * - */ - -#ifndef LV_NUTTX_LCD_H -#define LV_NUTTX_LCD_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../display/lv_display.h" - -#if LV_USE_NUTTX - -#if LV_USE_NUTTX_LCD - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -lv_display_t * lv_nuttx_lcd_create(const char * dev_path); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_NUTTX_LCD */ - -#endif /* LV_USE_NUTTX*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_NUTTX_LCD_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_libuv.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_libuv.c deleted file mode 100644 index 12b8c43..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_libuv.c +++ /dev/null @@ -1,340 +0,0 @@ -/** - * @file lv_nuttx_libuv.c - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_nuttx_libuv.h" - -#include "../../../lvgl.h" -#include "../../lvgl_private.h" - -#if LV_USE_NUTTX -#include - -#if LV_USE_NUTTX_LIBUV -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - int fd; - bool polling; - uv_poll_t fb_poll; - uv_poll_t vsync_poll; -} lv_nuttx_uv_fb_ctx_t; - -typedef struct { - int fd; - uv_poll_t input_poll; - lv_indev_t * indev; -} lv_nuttx_uv_input_ctx_t; - -typedef struct { - uv_timer_t uv_timer; - lv_nuttx_uv_fb_ctx_t fb_ctx; - lv_nuttx_uv_input_ctx_t input_ctx; - int32_t ref_count; -} lv_nuttx_uv_ctx_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void lv_nuttx_uv_timer_cb(uv_timer_t * handle); -static int lv_nuttx_uv_timer_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx); -static void lv_nuttx_uv_timer_deinit(lv_nuttx_uv_ctx_t * uv_ctx); - -static void lv_nuttx_uv_vsync_poll_cb(uv_poll_t * handle, int status, int events); -static void lv_nuttx_uv_disp_poll_cb(uv_poll_t * handle, int status, int events); -static void lv_nuttx_uv_disp_refr_req_cb(lv_event_t * e); -static int lv_nuttx_uv_fb_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx); -static void lv_nuttx_uv_fb_deinit(lv_nuttx_uv_ctx_t * uv_ctx); - -static void lv_nuttx_uv_input_poll_cb(uv_poll_t * handle, int status, int events); -static int lv_nuttx_uv_input_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx); -static void lv_nuttx_uv_input_deinit(lv_nuttx_uv_ctx_t * uv_ctx); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void * lv_nuttx_uv_init(lv_nuttx_uv_t * uv_info) -{ - lv_nuttx_uv_ctx_t * uv_ctx; - int ret; - - uv_ctx = lv_malloc_zeroed(sizeof(lv_nuttx_uv_ctx_t)); - LV_ASSERT_MALLOC(uv_ctx); - if(uv_ctx == NULL) return NULL; - - if((ret = lv_nuttx_uv_timer_init(uv_info, uv_ctx)) < 0) { - LV_LOG_ERROR("lv_nuttx_uv_timer_init fail : %d", ret); - goto err_out; - } - - if((ret = lv_nuttx_uv_fb_init(uv_info, uv_ctx)) < 0) { - LV_LOG_ERROR("lv_nuttx_uv_fb_init fail : %d", ret); - goto err_out; - } - - if((ret = lv_nuttx_uv_input_init(uv_info, uv_ctx)) < 0) { - LV_LOG_ERROR("lv_nuttx_uv_input_init fail : %d", ret); - goto err_out; - } - - return uv_ctx; - -err_out: - lv_free(uv_ctx); - return NULL; -} - -void lv_nuttx_uv_deinit(void ** data) -{ - lv_nuttx_uv_ctx_t * uv_ctx = *data; - - if(uv_ctx == NULL) return; - lv_nuttx_uv_input_deinit(uv_ctx); - lv_nuttx_uv_fb_deinit(uv_ctx); - lv_nuttx_uv_timer_deinit(uv_ctx); - *data = NULL; - LV_LOG_USER("Done"); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_nuttx_uv_timer_cb(uv_timer_t * handle) -{ - uint32_t sleep_ms; - - sleep_ms = lv_timer_handler(); - - if(sleep_ms == LV_NO_TIMER_READY) { - uv_timer_stop(handle); - return; - } - - /* Prevent busy loops. */ - - if(sleep_ms == 0) { - sleep_ms = 1; - } - - LV_LOG_TRACE("sleep_ms = %" LV_PRIu32, sleep_ms); - uv_timer_start(handle, lv_nuttx_uv_timer_cb, sleep_ms, 0); -} - -static void lv_nuttx_uv_timer_resume(void * data) -{ - uv_timer_t * timer = (uv_timer_t *)data; - if(timer) - uv_timer_start(timer, lv_nuttx_uv_timer_cb, 0, 0); -} - -static int lv_nuttx_uv_timer_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx) -{ - uv_loop_t * loop = uv_info->loop; - - LV_ASSERT_NULL(uv_ctx); - LV_ASSERT_NULL(loop); - - uv_ctx->uv_timer.data = uv_ctx; - uv_timer_init(loop, &uv_ctx->uv_timer); - uv_ctx->ref_count++; - uv_timer_start(&uv_ctx->uv_timer, lv_nuttx_uv_timer_cb, 1, 1); - - lv_timer_handler_set_resume_cb(lv_nuttx_uv_timer_resume, &uv_ctx->uv_timer); - return 0; -} - -static void lv_nuttx_uv_deinit_cb(uv_handle_t * handle) -{ - lv_nuttx_uv_ctx_t * uv_ctx = handle->data; - if(--uv_ctx->ref_count <= 0) { - LV_LOG_USER("Done"); - lv_free(uv_ctx); - } -} - -static void lv_nuttx_uv_timer_deinit(lv_nuttx_uv_ctx_t * uv_ctx) -{ - lv_timer_handler_set_resume_cb(NULL, NULL); - uv_close((uv_handle_t *)&uv_ctx->uv_timer, lv_nuttx_uv_deinit_cb); - LV_LOG_USER("Done"); -} - -static void lv_nuttx_uv_vsync_poll_cb(uv_poll_t * handle, int status, int events) -{ - LV_UNUSED(handle); - LV_UNUSED(status); - LV_UNUSED(events); - - lv_display_t * d; - d = lv_display_get_next(NULL); - while(d) { - lv_display_send_event(d, LV_EVENT_VSYNC, NULL); - d = lv_display_get_next(d); - } -} - -static void lv_nuttx_uv_disp_poll_cb(uv_poll_t * handle, int status, int events) -{ - lv_nuttx_uv_fb_ctx_t * fb_ctx = &((lv_nuttx_uv_ctx_t *)(handle->data))->fb_ctx; - - LV_UNUSED(status); - LV_UNUSED(events); - uv_poll_stop(handle); - lv_display_refr_timer(NULL); - fb_ctx->polling = false; -} - -static void lv_nuttx_uv_disp_refr_req_cb(lv_event_t * e) -{ - lv_nuttx_uv_fb_ctx_t * fb_ctx = lv_event_get_user_data(e); - - if(fb_ctx->polling) { - return; - } - fb_ctx->polling = true; - uv_poll_start(&fb_ctx->fb_poll, UV_WRITABLE, lv_nuttx_uv_disp_poll_cb); -} - -static int lv_nuttx_uv_fb_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx) -{ - uv_loop_t * loop = uv_info->loop; - lv_display_t * disp = uv_info->disp; - - LV_ASSERT_NULL(uv_ctx); - LV_ASSERT_NULL(disp); - LV_ASSERT_NULL(loop); - - lv_nuttx_uv_fb_ctx_t * fb_ctx = &uv_ctx->fb_ctx; - fb_ctx->fd = *(int *)lv_display_get_driver_data(disp); - - if(fb_ctx->fd <= 0) { - LV_LOG_USER("skip uv fb init."); - return 0; - } - - if(!disp->refr_timer) { - LV_LOG_ERROR("disp->refr_timer is NULL"); - return -EINVAL; - } - - /* Remove default refr timer. */ - - lv_timer_delete(disp->refr_timer); - disp->refr_timer = NULL; - - fb_ctx->fb_poll.data = uv_ctx; - uv_poll_init(loop, &fb_ctx->fb_poll, fb_ctx->fd); - uv_ctx->ref_count++; - uv_poll_start(&fb_ctx->fb_poll, UV_WRITABLE, lv_nuttx_uv_disp_poll_cb); - - fb_ctx->vsync_poll.data = uv_ctx; - uv_poll_init(loop, &fb_ctx->vsync_poll, fb_ctx->fd); - uv_ctx->ref_count++; - uv_poll_start(&fb_ctx->vsync_poll, UV_PRIORITIZED, lv_nuttx_uv_vsync_poll_cb); - - LV_LOG_USER("lvgl fb loop start OK"); - - /* Register for the invalidate area event */ - - lv_event_add(&disp->event_list, lv_nuttx_uv_disp_refr_req_cb, LV_EVENT_REFR_REQUEST, fb_ctx); - - return 0; -} - -static void lv_nuttx_uv_fb_deinit(lv_nuttx_uv_ctx_t * uv_ctx) -{ - /* should remove event */ - lv_nuttx_uv_fb_ctx_t * fb_ctx = &uv_ctx->fb_ctx; - if(fb_ctx->fd > 0) { - uv_close((uv_handle_t *)&fb_ctx->fb_poll, lv_nuttx_uv_deinit_cb); - uv_close((uv_handle_t *)&fb_ctx->vsync_poll, lv_nuttx_uv_deinit_cb); - } - LV_LOG_USER("Done"); -} - -static void lv_nuttx_uv_input_poll_cb(uv_poll_t * handle, int status, int events) -{ - lv_indev_t * indev = ((lv_nuttx_uv_ctx_t *)(handle->data))->input_ctx.indev; - - if(status < 0) { - LV_LOG_WARN("input poll error: %s ", uv_strerror(status)); - return; - } - - if(events & UV_READABLE) { - lv_indev_read(indev); - } -} - -static int lv_nuttx_uv_input_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx) -{ - uv_loop_t * loop = uv_info->loop; - lv_indev_t * indev = uv_info->indev; - - if(indev == NULL) { - LV_LOG_USER("skip uv input init."); - return 0; - } - - LV_ASSERT_NULL(uv_ctx); - LV_ASSERT_NULL(loop); - - if(lv_indev_get_mode(indev) == LV_INDEV_MODE_EVENT) { - LV_LOG_ERROR("input device has been running in event-driven mode"); - return -EINVAL; - } - - lv_nuttx_uv_input_ctx_t * input_ctx = &uv_ctx->input_ctx; - input_ctx->fd = *(int *)lv_indev_get_driver_data(indev); - if(input_ctx->fd <= 0) { - LV_LOG_ERROR("can't get valid input fd"); - return 0; - } - - input_ctx->indev = indev; - lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); - - input_ctx->input_poll.data = uv_ctx; - uv_poll_init(loop, &input_ctx->input_poll, input_ctx->fd); - uv_ctx->ref_count++; - uv_poll_start(&input_ctx->input_poll, UV_READABLE, lv_nuttx_uv_input_poll_cb); - - LV_LOG_USER("lvgl input loop start OK"); - - return 0; -} - -static void lv_nuttx_uv_input_deinit(lv_nuttx_uv_ctx_t * uv_ctx) -{ - lv_nuttx_uv_input_ctx_t * input_ctx = &uv_ctx->input_ctx; - if(input_ctx->fd > 0) { - uv_close((uv_handle_t *)&input_ctx->input_poll, lv_nuttx_uv_deinit_cb); - } - LV_LOG_USER("Done"); -} - -#endif /*LV_USE_NUTTX_LIBUV*/ - -#endif /*LV_USE_NUTTX*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_libuv.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_libuv.h deleted file mode 100644 index 0799e67..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_libuv.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @file lv_nuttx_libuv.h - * - */ - -#ifndef LV_NUTTX_LIBUV_H -#define LV_NUTTX_LIBUV_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../display/lv_display.h" -#include "../../indev/lv_indev.h" - -#if LV_USE_NUTTX - -#if LV_USE_NUTTX_LIBUV - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - void * loop; - lv_display_t * disp; - lv_indev_t * indev; -} lv_nuttx_uv_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the uv_loop using the provided configuration information. - * @param uv_info Pointer to the lv_nuttx_uv_t structure to be initialized. - */ -void * lv_nuttx_uv_init(lv_nuttx_uv_t * uv_info); - -/** - * Deinitialize the uv_loop configuration for NuttX porting layer. - * @param data Pointer to user data. - */ -void lv_nuttx_uv_deinit(void ** data); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_NUTTX_LIBUV*/ - -#endif /*LV_USE_NUTTX*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_NUTTX_LIBUV_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_profiler.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_profiler.c deleted file mode 100644 index a17c3a5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_profiler.c +++ /dev/null @@ -1,96 +0,0 @@ -/** - * @file lv_nuttx_profiler.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_nuttx_profiler.h" -#include "../../../lvgl.h" - -#if LV_USE_NUTTX && LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN - -#include -#include - -/********************* - * DEFINES - *********************/ - -#define TICK_TO_USEC(tick) ((tick) / cpu_freq) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static uint32_t cpu_freq = 0; /* MHz */ - -/********************** - * STATIC VARIABLES - **********************/ - -static uint32_t tick_get_cb(void); -static void flush_cb(const char * buf); - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_nuttx_profiler_init(void) -{ - cpu_freq = (uint32_t)up_perf_getfreq() / 1000000; - if(cpu_freq == 0) { - LV_LOG_ERROR("Failed to get CPU frequency"); - return; - } - LV_LOG_USER("CPU frequency: %" LV_PRIu32 " MHz", cpu_freq); - - lv_profiler_builtin_config_t config; - lv_profiler_builtin_config_init(&config); - config.tick_per_sec = 1000000; /* 1 sec = 1000000 usec */ - config.tick_get_cb = tick_get_cb; - config.flush_cb = flush_cb; - lv_profiler_builtin_init(&config); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static uint32_t tick_get_cb(void) -{ - static uint32_t prev_tick = 0; - static uint32_t cur_tick_us = 0; - uint32_t act_time = up_perf_gettime(); - uint32_t elaps; - - /*If there is no overflow in sys_time simple subtract*/ - if(act_time >= prev_tick) { - elaps = act_time - prev_tick; - } - else { - elaps = UINT32_MAX - prev_tick + 1; - elaps += act_time; - } - - cur_tick_us += TICK_TO_USEC(elaps); - prev_tick = act_time; - return cur_tick_us; -} - -static void flush_cb(const char * buf) -{ - printf("%s", buf); -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_profiler.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_profiler.h deleted file mode 100644 index 8b8cf65..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_profiler.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file lv_nuttx_profiler.h - * - */ - -#ifndef LV_NUTTX_PROFILER_H -#define LV_NUTTX_PROFILER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_nuttx_profiler_init(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_NUTTX_PROFILER_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_touchscreen.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_touchscreen.c deleted file mode 100644 index d49f765..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_touchscreen.c +++ /dev/null @@ -1,200 +0,0 @@ -/** - * @file lv_nuttx_touchscreen.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_nuttx_touchscreen.h" - -#if LV_USE_NUTTX - -#if LV_USE_NUTTX_TOUCHSCREEN - -#include -#include -#include -#include -#include -#include -#include -#include -#include "../../lvgl_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - /* fd should be defined at the beginning */ - int fd; - struct touch_sample_s last_sample; - bool has_last_sample; - lv_indev_state_t last_state; - lv_indev_t * indev_drv; -} lv_nuttx_touchscreen_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void touchscreen_read(lv_indev_t * drv, lv_indev_data_t * data); -static void touchscreen_delete_cb(lv_event_t * e); -static lv_indev_t * touchscreen_init(int fd); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_indev_t * lv_nuttx_touchscreen_create(const char * dev_path) -{ - lv_indev_t * indev; - int fd; - - LV_ASSERT_NULL(dev_path); - LV_LOG_USER("touchscreen %s opening", dev_path); - fd = open(dev_path, O_RDONLY | O_NONBLOCK); - if(fd < 0) { - perror("Error: cannot open touchscreen device"); - return NULL; - } - - LV_LOG_USER("touchscreen %s open success", dev_path); - - indev = touchscreen_init(fd); - - if(indev == NULL) { - close(fd); - } - - return indev; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void conv_touch_sample(lv_indev_t * drv, - lv_indev_data_t * data, - struct touch_sample_s * sample) -{ - lv_nuttx_touchscreen_t * touchscreen = drv->driver_data; - uint8_t touch_flags = sample->point[0].flags; - - if(touch_flags & (TOUCH_DOWN | TOUCH_MOVE)) { - lv_display_t * disp = lv_indev_get_display(drv); - int32_t hor_max = lv_display_get_horizontal_resolution(disp) - 1; - int32_t ver_max = lv_display_get_vertical_resolution(disp) - 1; - - data->point.x = LV_CLAMP(0, sample->point[0].x, hor_max); - data->point.y = LV_CLAMP(0, sample->point[0].y, ver_max); - touchscreen->last_state = LV_INDEV_STATE_PRESSED; - } - else if(touch_flags & TOUCH_UP) { - touchscreen->last_state = LV_INDEV_STATE_RELEASED; - } -} - -static bool touchscreen_read_sample(int fd, struct touch_sample_s * sample) -{ - int nbytes = read(fd, sample, sizeof(struct touch_sample_s)); - return nbytes == sizeof(struct touch_sample_s); -} - -static void touchscreen_read(lv_indev_t * drv, lv_indev_data_t * data) -{ - lv_nuttx_touchscreen_t * touchscreen = drv->driver_data; - struct touch_sample_s sample; - - /* - * Note: Since it is necessary to avoid multi-processing click events - * caused by redundant continue_reading, a two-unit sample sliding window - * algorithm is used here. continue_reading is only activated when there - * are two points in the window. - */ - - /* If has last sample, use it first */ - if(touchscreen->has_last_sample) { - conv_touch_sample(drv, data, &touchscreen->last_sample); - } - else { - /* Read first sample */ - if(!touchscreen_read_sample(touchscreen->fd, &sample)) { - /* No sample available, return last state */ - data->state = touchscreen->last_state; - return; - } - - conv_touch_sample(drv, data, &sample); - } - - /* Try to read next sample */ - if(touchscreen_read_sample(touchscreen->fd, &sample)) { - /* Save last sample and let lvgl continue reading */ - touchscreen->last_sample = sample; - touchscreen->has_last_sample = true; - data->continue_reading = true; - } - else { - /* No more sample available, clear last sample flag */ - touchscreen->has_last_sample = false; - } - - data->state = touchscreen->last_state; -} - -static void touchscreen_delete_cb(lv_event_t * e) -{ - lv_indev_t * indev = (lv_indev_t *) lv_event_get_user_data(e); - lv_nuttx_touchscreen_t * touchscreen = lv_indev_get_driver_data(indev); - if(touchscreen) { - lv_indev_set_driver_data(indev, NULL); - lv_indev_set_read_cb(indev, NULL); - - if(touchscreen->fd >= 0) { - close(touchscreen->fd); - touchscreen->fd = -1; - } - lv_free(touchscreen); - LV_LOG_USER("done"); - } -} - -static lv_indev_t * touchscreen_init(int fd) -{ - lv_nuttx_touchscreen_t * touchscreen; - lv_indev_t * indev = NULL; - - touchscreen = lv_malloc_zeroed(sizeof(lv_nuttx_touchscreen_t)); - if(touchscreen == NULL) { - LV_LOG_ERROR("touchscreen_s malloc failed"); - return NULL; - } - - touchscreen->fd = fd; - touchscreen->last_state = LV_INDEV_STATE_RELEASED; - touchscreen->indev_drv = indev = lv_indev_create(); - - lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); - lv_indev_set_read_cb(indev, touchscreen_read); - lv_indev_set_driver_data(indev, touchscreen); - lv_indev_add_event_cb(indev, touchscreen_delete_cb, LV_EVENT_DELETE, indev); - return indev; -} - -#endif /*LV_USE_NUTTX_TOUCHSCREEN*/ - -#endif /* LV_USE_NUTTX*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_touchscreen.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_touchscreen.h deleted file mode 100644 index e0dd1f1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/nuttx/lv_nuttx_touchscreen.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @file lv_nuttx_touchscreen.h - * - */ - -/********************* - * INCLUDES - *********************/ - -#ifndef LV_NUTTX_TOUCHSCREEN_H -#define LV_NUTTX_TOUCHSCREEN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../indev/lv_indev.h" - -#if LV_USE_NUTTX - -#if LV_USE_NUTTX_TOUCHSCREEN - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize indev with specified input device. - * @param dev_path path of input device - */ -lv_indev_t * lv_nuttx_touchscreen_create(const char * dev_path); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_NUTTX_TOUCHSCREEN */ - -#endif /* LV_USE_NUTTX*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_NUTTX_TOUCHSCREEN_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/qnx/lv_qnx.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/qnx/lv_qnx.c deleted file mode 100644 index f31e727..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/qnx/lv_qnx.c +++ /dev/null @@ -1,542 +0,0 @@ -/** - * @file lv_qnx.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_qnx.h" -#if LV_USE_QNX -#include -#include "../../core/lv_refr.h" -#include "../../stdlib/lv_string.h" -#include "../../core/lv_global.h" -#include "../../display/lv_display_private.h" -#include "../../lv_init.h" -#include -#include -#include -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - screen_window_t window; - screen_buffer_t buffers[LV_QNX_BUF_COUNT]; - int bufidx; - bool managed; - lv_indev_t * pointer; - lv_indev_t * keyboard; -} lv_qnx_window_t; - -typedef struct { - int pos[2]; - int buttons; -} lv_qnx_pointer_t; - -typedef struct { - int key; - int flags; -} lv_qnx_keyboard_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static uint32_t get_ticks(void); -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); -static bool window_create(lv_display_t * disp); -static bool init_display_from_window(lv_display_t * disp); -static void get_pointer(lv_indev_t * indev, lv_indev_data_t * data); -static void get_key(lv_indev_t * indev, lv_indev_data_t * data); -static bool handle_pointer_event(lv_display_t * disp, screen_event_t event); -static bool handle_keyboard_event(lv_display_t * disp, screen_event_t event); -static void release_disp_cb(lv_event_t * e); -static void refresh_cb(lv_timer_t * timer); - -/*********************** - * GLOBAL PROTOTYPES - ***********************/ - -static screen_context_t context; - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_qnx_window_create(int32_t hor_res, int32_t ver_res) -{ - static bool inited = false; - - if(!inited) { - if(screen_create_context(&context, - SCREEN_APPLICATION_CONTEXT) != 0) { - LV_LOG_ERROR("screen_create_context: %s", strerror(errno)); - return NULL; - } - - lv_tick_set_cb(get_ticks); - inited = true; - } - - lv_qnx_window_t * dsc = lv_malloc_zeroed(sizeof(lv_qnx_window_t)); - LV_ASSERT_MALLOC(dsc); - if(dsc == NULL) return NULL; - - lv_display_t * disp = lv_display_create(hor_res, ver_res); - if(disp == NULL) { - lv_free(dsc); - return NULL; - } - lv_display_add_event_cb(disp, release_disp_cb, LV_EVENT_DELETE, disp); - lv_display_set_driver_data(disp, dsc); - if(!window_create(disp)) { - lv_free(dsc); - return NULL; - } - - lv_display_set_flush_cb(disp, flush_cb); - - if(!init_display_from_window(disp)) { - screen_destroy_window(dsc->window); - lv_free(dsc); - return NULL; - } - - /*Replace the default refresh timer handler, so that we can run it on - *demand instead of constantly.*/ - lv_timer_t * refr_timer = lv_display_get_refr_timer(disp); - lv_timer_set_cb(refr_timer, refresh_cb); - - return disp; -} - -void lv_qnx_window_set_title(lv_display_t * disp, const char * title) -{ - lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); - if(!dsc->managed) { - /*Can't set title if there is no window manager*/ - return; - } - - screen_event_t event; - screen_create_event(&event); - - char title_buf[64]; - lv_snprintf(title_buf, sizeof(title_buf), "Title=%s", title); - - int type = SCREEN_EVENT_MANAGER; - screen_set_event_property_iv(event, SCREEN_PROPERTY_TYPE, &type); - screen_set_event_property_cv(event, SCREEN_PROPERTY_USER_DATA, - sizeof(title_buf), title_buf); - screen_set_event_property_pv(event, SCREEN_PROPERTY_WINDOW, - (void **)&dsc->window); - screen_set_event_property_pv(event, SCREEN_PROPERTY_CONTEXT, - (void **)&context); - - screen_inject_event(NULL, event); -} - -bool lv_qnx_add_pointer_device(lv_display_t * disp) -{ - lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); - if(dsc->pointer != NULL) { - /*Only one pointer device per display*/ - return false; - } - - lv_qnx_pointer_t * ptr_dsc = lv_malloc_zeroed(sizeof(lv_qnx_pointer_t)); - LV_ASSERT_MALLOC(ptr_dsc); - if(ptr_dsc == NULL) { - return false; - } - - dsc->pointer = lv_indev_create(); - if(dsc->pointer == NULL) { - lv_free(ptr_dsc); - return false; - } - - lv_indev_set_type(dsc->pointer, LV_INDEV_TYPE_POINTER); - lv_indev_set_read_cb(dsc->pointer, get_pointer); - lv_indev_set_driver_data(dsc->pointer, ptr_dsc); - lv_indev_set_mode(dsc->pointer, LV_INDEV_MODE_EVENT); - return true; -} - -bool lv_qnx_add_keyboard_device(lv_display_t * disp) -{ - lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); - if(dsc->keyboard != NULL) { - /*Only one keyboard device per display*/ - return false; - } - - lv_qnx_keyboard_t * kbd_dsc = lv_malloc_zeroed(sizeof(lv_qnx_keyboard_t)); - LV_ASSERT_MALLOC(kbd_dsc); - if(dsc == NULL) { - return false; - } - - dsc->keyboard = lv_indev_create(); - if(dsc->keyboard == NULL) { - lv_free(kbd_dsc); - return false; - } - - lv_indev_set_type(dsc->keyboard, LV_INDEV_TYPE_KEYPAD); - lv_indev_set_read_cb(dsc->keyboard, get_key); - lv_indev_set_driver_data(dsc->keyboard, kbd_dsc); - lv_indev_set_mode(dsc->keyboard, LV_INDEV_MODE_EVENT); - return true; -} - -int lv_qnx_event_loop(lv_display_t * disp) -{ - lv_refr_now(disp); - - /*Run the event loop*/ - screen_event_t event; - if(screen_create_event(&event) != 0) { - LV_LOG_ERROR("screen_create_event: %s", strerror(errno)); - return EXIT_FAILURE; - } - - uint64_t timeout_ns = 0; - for(;;) { - /*Wait for an event, timing out after 16ms if animations are running*/ - if(screen_get_event(context, event, timeout_ns) != 0) { - LV_LOG_ERROR("screen_get_event: %s", strerror(errno)); - return EXIT_FAILURE; - } - - /*Get the event's type*/ - int type; - if(screen_get_event_property_iv(event, SCREEN_PROPERTY_TYPE, &type) - != 0) { - LV_LOG_ERROR("screen_get_event_property_iv(TYPE): %s", strerror(errno)); - return EXIT_FAILURE; - } - - if(type == SCREEN_EVENT_POINTER) { - if(!handle_pointer_event(disp, event)) { - return EXIT_FAILURE; - } - } - else if(type == SCREEN_EVENT_KEYBOARD) { - if(!handle_keyboard_event(disp, event)) { - return EXIT_FAILURE; - } - } - else if(type == SCREEN_EVENT_MANAGER) { - /*Only sub-type supported is closing the window*/ - break; - } - - /*Calculate the next timeout*/ - uint32_t timeout_ms = lv_timer_handler(); - if(timeout_ms == LV_NO_TIMER_READY) { - timeout_ns = -1ULL; - } - else { - timeout_ns = (uint64_t)timeout_ms * 1000000UL; - } - } - - return EXIT_SUCCESS; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static uint32_t get_ticks(void) -{ - uint64_t const ns = clock_gettime_mon_ns(); - return (uint32_t)(ns / 1000000UL); -} - -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) -{ - lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); - if(screen_post_window(dsc->window, dsc->buffers[dsc->bufidx], 0, NULL, 0) - != 0) { - LV_LOG_ERROR("screen_post_window: %s", strerror(errno)); - } - -#if (LV_QNX_BUF_COUNT > 1) - dsc->bufidx = 1 - dsc->bufidx; -#endif - - lv_display_flush_ready(disp); -} - -static bool window_create(lv_display_t * disp) -{ - /*Create a window*/ - lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); - if(screen_create_window(&dsc->window, context) != 0) { - LV_LOG_ERROR("screen_create_window: %s", strerror(errno)); - return false; - } - - /*Set window properties*/ - int rect[] = { 0, 0, disp->hor_res, disp->ver_res }; - if(screen_set_window_property_iv(dsc->window, SCREEN_PROPERTY_POSITION, - &rect[0]) != 0) { - LV_LOG_ERROR("screen_window_set_property_iv(POSITION): %s", strerror(errno)); - return false; - } - - if(screen_set_window_property_iv(dsc->window, SCREEN_PROPERTY_SIZE, - &rect[2]) != 0) { - LV_LOG_ERROR("screen_window_set_property_iv(SIZE): %s", strerror(errno)); - return false; - } - - if(screen_set_window_property_iv(dsc->window, SCREEN_PROPERTY_SOURCE_SIZE, - &rect[2]) != 0) { - LV_LOG_ERROR("screen_window_set_property_iv(SOURCE_SIZE): %s", strerror(errno)); - return NULL; - } - - int usage = SCREEN_USAGE_WRITE; - if(screen_set_window_property_iv(dsc->window, SCREEN_PROPERTY_USAGE, - &usage) != 0) { - LV_LOG_ERROR("screen_window_set_property_iv(USAGE): %s", strerror(errno)); - return NULL; - } - - int format = SCREEN_FORMAT_RGBA8888; - if(screen_set_window_property_iv(dsc->window, SCREEN_PROPERTY_FORMAT, - &format) != 0) { - LV_LOG_ERROR("screen_window_set_property_iv(USAGE): %s", strerror(errno)); - return NULL; - } - - /*Initialize window buffers*/ - if(screen_create_window_buffers(dsc->window, LV_QNX_BUF_COUNT) != 0) { - LV_LOG_ERROR("screen_create_window_buffers: %s", strerror(errno)); - return false; - } - - if(screen_get_window_property_pv(dsc->window, SCREEN_PROPERTY_BUFFERS, - (void **)&dsc->buffers) != 0) { - LV_LOG_ERROR("screen_get_window_property_pv(BUFFERS): %s", strerror(errno)); - return false; - } - - /*Connect to the window manager. Can legitimately fail if one is not running*/ - if(screen_manage_window(dsc->window, "Frame=Y") == 0) { - dsc->managed = true; - } - else { - dsc->managed = false; - } - - int visible = 1; - if(screen_set_window_property_iv(dsc->window, SCREEN_PROPERTY_VISIBLE, - &visible) != 0) { - LV_LOG_ERROR("screen_set_window_property_iv(VISIBLE): %s", strerror(errno)); - return false; - } - - return true; -} - -static bool init_display_from_window(lv_display_t * disp) -{ - lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); - - int bufsize; - if(screen_get_buffer_property_iv(dsc->buffers[0], SCREEN_PROPERTY_SIZE, - &bufsize) == -1) { - LV_LOG_ERROR("screen_get_buffer_property_iv(SIZE): %s", strerror(errno)); - return false; - } - - void * ptr1 = NULL; - if(screen_get_buffer_property_pv(dsc->buffers[0], SCREEN_PROPERTY_POINTER, - &ptr1) == -1) { - LV_LOG_ERROR("screen_get_buffer_property_pv(POINTER): %s", strerror(errno)); - return false; - } - - void * ptr2 = NULL; -#if (LV_QNX_BUF_COUNT > 1) - if(screen_get_buffer_property_pv(dsc->buffers[1], SCREEN_PROPERTY_POINTER, - &ptr2) == -1) { - LV_LOG_ERROR("screen_get_buffer_property_pv(POINTER): %s", strerror(errno)); - return false; - } -#endif - - lv_display_set_buffers(disp, ptr1, ptr2, bufsize, LV_DISPLAY_RENDER_MODE_FULL); - return true; -} - -static void release_disp_cb(lv_event_t * e) -{ - lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e); - lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); - - if(dsc->window != NULL) { - screen_destroy_window(dsc->window); - } - - if(dsc->pointer != NULL) { - lv_free(dsc->pointer); - } - - if(dsc->keyboard != NULL) { - lv_free(dsc->keyboard); - } - - lv_free(dsc); - lv_display_set_driver_data(disp, NULL); -} - -static void get_pointer(lv_indev_t * indev, lv_indev_data_t * data) -{ - lv_qnx_pointer_t * dsc = lv_indev_get_driver_data(indev); - - data->point.x = dsc->pos[0]; - data->point.y = dsc->pos[1]; - if((dsc->buttons & SCREEN_LEFT_MOUSE_BUTTON) != 0) { - data->state = LV_INDEV_STATE_PRESSED; - } - else { - data->state = LV_INDEV_STATE_RELEASED; - } -} - -static bool handle_pointer_event(lv_display_t * disp, screen_event_t event) -{ - lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); - if(dsc->pointer == NULL) return true; - - lv_qnx_pointer_t * ptr_dsc = lv_indev_get_driver_data(dsc->pointer); - - if(screen_get_event_property_iv(event, SCREEN_PROPERTY_SOURCE_POSITION, - ptr_dsc->pos) - != 0) { - LV_LOG_ERROR("screen_get_event_property_iv(SOURCE_POSITION): %s", strerror(errno)); - return false; - } - - if(screen_get_event_property_iv(event, SCREEN_PROPERTY_BUTTONS, - &ptr_dsc->buttons) - != 0) { - LV_LOG_ERROR("screen_get_event_property_iv(BUTTONS): %s", strerror(errno)); - return false; - } - - lv_indev_read(dsc->pointer); - return true; -} - -static void get_key(lv_indev_t * indev, lv_indev_data_t * data) -{ - lv_qnx_keyboard_t * dsc = lv_indev_get_driver_data(indev); - - if((dsc->flags & KEY_DOWN) != 0) { - data->state = LV_INDEV_STATE_PRESSED; - data->key = dsc->key; - } - else { - data->state = LV_INDEV_STATE_RELEASED; - } -} - -static bool handle_keyboard_event(lv_display_t * disp, screen_event_t event) -{ - lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); - if(dsc->keyboard == NULL) return true; - - lv_qnx_keyboard_t * kbd_dsc = lv_indev_get_driver_data(dsc->keyboard); - - /*Get event data*/ - if(screen_get_event_property_iv(event, SCREEN_PROPERTY_FLAGS, - &kbd_dsc->flags) - != 0) { - LV_LOG_ERROR("screen_get_event_property_iv(FLAGS): %s", strerror(errno)); - return false; - } - - if(screen_get_event_property_iv(event, SCREEN_PROPERTY_SYM, - &kbd_dsc->key) - != 0) { - LV_LOG_ERROR("screen_get_event_property_iv(SYM): %s", strerror(errno)); - return false; - } - - /*Translate special keys*/ - switch(kbd_dsc->key) { - case KEYCODE_UP: - kbd_dsc->key = LV_KEY_UP; - break; - - case KEYCODE_DOWN: - kbd_dsc->key = LV_KEY_DOWN; - break; - - case KEYCODE_LEFT: - kbd_dsc->key = LV_KEY_LEFT; - break; - - case KEYCODE_RIGHT: - kbd_dsc->key = LV_KEY_RIGHT; - break; - - case KEYCODE_RETURN: - kbd_dsc->key = LV_KEY_ENTER; - break; - - case KEYCODE_BACKSPACE: - kbd_dsc->key = LV_KEY_BACKSPACE; - break; - - case KEYCODE_HOME: - kbd_dsc->key = LV_KEY_HOME; - break; - - case KEYCODE_END: - kbd_dsc->key = LV_KEY_END; - break; - - case KEYCODE_DELETE: - kbd_dsc->key = LV_KEY_DEL; - break; - - default: - /*Ignore other non-ASCII keys, including modifiers*/ - if(kbd_dsc->key > 0xff) return true; - } - - lv_indev_read(dsc->keyboard); - return true; -} - -static void refresh_cb(lv_timer_t * timer) -{ - /*Refresh the window on timeout, but disable the timer. Any callback can - *re-enable it.*/ - lv_display_t * disp = timer->user_data; - lv_refr_now(disp); - lv_timer_pause(timer); -} - -#endif /*LV_USE_QNX*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/qnx/lv_qnx.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/qnx/lv_qnx.h deleted file mode 100644 index bb8f940..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/qnx/lv_qnx.h +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @file lv_qnx.h - * @brief LVGL driver for the QNX Screen compositing window manager - */ - -#ifndef LV_QNX_H -#define LV_QNX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../display/lv_display.h" -#include "../../indev/lv_indev.h" - -#if LV_USE_QNX - -#include -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a window to use as a display for LVGL. - * @param hor_res The horizontal resolution (size) of the window - * @param ver_res The vertical resolution (size) of the window - * @return A pointer to a new display object if successful, NULL otherwise - */ -lv_display_t * lv_qnx_window_create(int32_t hor_res, int32_t ver_res); - -/** - * Set the title of the window identified by the given display. - * @param disp The display object for the window - * @param title The new title to set - */ -void lv_qnx_window_set_title(lv_display_t * disp, const char * title); - -/** - * Create a pointer input device for the display. - * Only one pointer object is currently supported. - * @param disp The display object associated with the device - * @return true if successful, false otherwise - */ -bool lv_qnx_add_pointer_device(lv_display_t * disp); - -/** - * Create a keyboard input device for the display. - * Only one keyboard object is currently supported. - * @param disp The display object associated with the device - * @return true if successful, false otherwise - */ -bool lv_qnx_add_keyboard_device(lv_display_t * disp); - -/** - * Runs the event loop for the display. - * The function only returns in response to a close event. - * @param disp The display for the event loop - * @return Exit code - */ -int lv_qnx_event_loop(lv_display_t * disp); - -/********************** - * MACROS - **********************/ - -#endif /* LV_DRV_QNX */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_QNX_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_keyboard.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_keyboard.c deleted file mode 100644 index 0bb94d6..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_keyboard.c +++ /dev/null @@ -1,218 +0,0 @@ -/** - * @file lv_sdl_keyboard.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_sdl_keyboard.h" -#if LV_USE_SDL - -#include "../../core/lv_group.h" -#include "../../stdlib/lv_string.h" -#include "lv_sdl_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - char buf[KEYBOARD_BUFFER_SIZE]; - bool dummy_read; -} lv_sdl_keyboard_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void sdl_keyboard_read(lv_indev_t * indev, lv_indev_data_t * data); -static uint32_t keycode_to_ctrl_key(SDL_Keycode sdl_key); -static void release_indev_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_indev_t * lv_sdl_keyboard_create(void) -{ - lv_sdl_keyboard_t * dsc = lv_malloc_zeroed(sizeof(lv_sdl_keyboard_t)); - LV_ASSERT_MALLOC(dsc); - if(dsc == NULL) return NULL; - - lv_indev_t * indev = lv_indev_create(); - LV_ASSERT_MALLOC(indev); - if(indev == NULL) { - lv_free(dsc); - return NULL; - } - - lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD); - lv_indev_set_read_cb(indev, sdl_keyboard_read); - lv_indev_set_driver_data(indev, dsc); - lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); - lv_indev_add_event_cb(indev, release_indev_cb, LV_EVENT_DELETE, indev); - - return indev; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void sdl_keyboard_read(lv_indev_t * indev, lv_indev_data_t * data) -{ - lv_sdl_keyboard_t * dev = lv_indev_get_driver_data(indev); - - const size_t len = lv_strlen(dev->buf); - - /*Send a release manually*/ - if(dev->dummy_read) { - dev->dummy_read = false; - data->state = LV_INDEV_STATE_RELEASED; - } - /*Send the pressed character*/ - else if(len > 0) { - dev->dummy_read = true; - data->state = LV_INDEV_STATE_PRESSED; - data->key = dev->buf[0]; - lv_memmove(dev->buf, dev->buf + 1, len); - } -} - -static void release_indev_cb(lv_event_t * e) -{ - lv_indev_t * indev = (lv_indev_t *) lv_event_get_user_data(e); - lv_sdl_keyboard_t * dev = lv_indev_get_driver_data(indev); - if(dev) { - lv_indev_set_driver_data(indev, NULL); - lv_indev_set_read_cb(indev, NULL); - lv_free(dev); - LV_LOG_INFO("done"); - } -} - -void lv_sdl_keyboard_handler(SDL_Event * event) -{ - uint32_t win_id = UINT32_MAX; - switch(event->type) { - case SDL_KEYDOWN: - win_id = event->key.windowID; - break; - case SDL_TEXTINPUT: - win_id = event->text.windowID; - break; - default: - return; - } - - lv_display_t * disp = lv_sdl_get_disp_from_win_id(win_id); - - - /*Find a suitable indev*/ - lv_indev_t * indev = lv_indev_get_next(NULL); - while(indev) { - if(lv_indev_get_type(indev) == LV_INDEV_TYPE_KEYPAD) { - /*If disp is NULL for any reason use the first indev with the correct type*/ - if(disp == NULL || lv_indev_get_display(indev) == disp) break; - } - indev = lv_indev_get_next(indev); - } - if(indev == NULL) return; - lv_sdl_keyboard_t * dsc = lv_indev_get_driver_data(indev); - - /* We only care about SDL_KEYDOWN and SDL_TEXTINPUT events */ - switch(event->type) { - case SDL_KEYDOWN: { /*Button press*/ - const uint32_t ctrl_key = keycode_to_ctrl_key(event->key.keysym.sym); - if(ctrl_key == '\0') - return; - const size_t len = lv_strlen(dsc->buf); - if(len < KEYBOARD_BUFFER_SIZE - 1) { - dsc->buf[len] = ctrl_key; - dsc->buf[len + 1] = '\0'; - } - break; - } - case SDL_TEXTINPUT: { /*Text input*/ - const size_t len = lv_strlen(dsc->buf) + lv_strlen(event->text.text); - if(len < KEYBOARD_BUFFER_SIZE - 1) - strcat(dsc->buf, event->text.text); - } - break; - default: - break; - - } - - size_t len = lv_strlen(dsc->buf); - while(len) { - lv_indev_read(indev); - - /*Call again to handle dummy read in `sdl_keyboard_read`*/ - lv_indev_read(indev); - len--; - } -} - -/** - * Convert a SDL key code to it's LV_KEY_* counterpart or return '\0' if it's not a control character. - * @param sdl_key the key code - * @return LV_KEY_* control character or '\0' - */ -static uint32_t keycode_to_ctrl_key(SDL_Keycode sdl_key) -{ - /*Remap some key to LV_KEY_... to manage groups*/ - switch(sdl_key) { - case SDLK_RIGHT: - case SDLK_KP_PLUS: - return LV_KEY_RIGHT; - - case SDLK_LEFT: - case SDLK_KP_MINUS: - return LV_KEY_LEFT; - - case SDLK_UP: - return LV_KEY_UP; - - case SDLK_DOWN: - return LV_KEY_DOWN; - - case SDLK_ESCAPE: - return LV_KEY_ESC; - - case SDLK_BACKSPACE: - return LV_KEY_BACKSPACE; - - case SDLK_DELETE: - return LV_KEY_DEL; - - case SDLK_KP_ENTER: - case '\r': - return LV_KEY_ENTER; - - case SDLK_TAB: - case SDLK_PAGEDOWN: - return LV_KEY_NEXT; - - case SDLK_PAGEUP: - return LV_KEY_PREV; - - case SDLK_HOME: - return LV_KEY_HOME; - - case SDLK_END: - return LV_KEY_END; - - default: - return '\0'; - } -} - -#endif /*LV_USE_SDL*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_keyboard.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_keyboard.h deleted file mode 100644 index a18b09d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_keyboard.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @file lv_sdl_keyboard.h - * - */ - -#ifndef LV_SDL_KEYBOARD_H -#define LV_SDL_KEYBOARD_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_sdl_window.h" -#if LV_USE_SDL - -/********************* - * DEFINES - *********************/ -#ifndef KEYBOARD_BUFFER_SIZE -#define KEYBOARD_BUFFER_SIZE 32 -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -lv_indev_t * lv_sdl_keyboard_create(void); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_SDL*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_SDL_KEYBOARD_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_mouse.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_mouse.c deleted file mode 100644 index 98b4f69..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_mouse.c +++ /dev/null @@ -1,204 +0,0 @@ -/** - * @file lv_sdl_mouse.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_sdl_mouse.h" -#if LV_USE_SDL - -#include "../../core/lv_group.h" -#include "../../stdlib/lv_string.h" -#include "lv_sdl_private.h" - -/********************* - * DEFINES - *********************/ - -#ifndef KEYBOARD_BUFFER_SIZE - #define KEYBOARD_BUFFER_SIZE 32 -#endif - -/********************** - * STATIC PROTOTYPES - **********************/ -static void sdl_mouse_read(lv_indev_t * indev, lv_indev_data_t * data); -static void release_indev_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -typedef struct { - int16_t last_x; - int16_t last_y; - bool left_button_down; -#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN - int32_t diff; -#endif -} lv_sdl_mouse_t; - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_indev_t * lv_sdl_mouse_create(void) -{ - lv_sdl_mouse_t * dsc = lv_malloc_zeroed(sizeof(lv_sdl_mouse_t)); - LV_ASSERT_MALLOC(dsc); - if(dsc == NULL) return NULL; - - lv_indev_t * indev = lv_indev_create(); - LV_ASSERT_MALLOC(indev); - if(indev == NULL) { - lv_free(dsc); - return NULL; - } - - lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); - lv_indev_set_read_cb(indev, sdl_mouse_read); - lv_indev_set_driver_data(indev, dsc); - - lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); - lv_indev_add_event_cb(indev, release_indev_cb, LV_EVENT_DELETE, indev); - - return indev; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void sdl_mouse_read(lv_indev_t * indev, lv_indev_data_t * data) -{ - lv_sdl_mouse_t * dsc = lv_indev_get_driver_data(indev); - - /*Store the collected data*/ - data->point.x = dsc->last_x; - data->point.y = dsc->last_y; - data->state = dsc->left_button_down ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; -#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN - data->enc_diff = dsc->diff; - dsc->diff = 0; -#endif -} - -static void release_indev_cb(lv_event_t * e) -{ - lv_indev_t * indev = (lv_indev_t *) lv_event_get_user_data(e); - lv_sdl_mouse_t * dsc = lv_indev_get_driver_data(indev); - if(dsc) { - lv_indev_set_driver_data(indev, NULL); - lv_indev_set_read_cb(indev, NULL); - lv_free(dsc); - LV_LOG_INFO("done"); - } -} - -void lv_sdl_mouse_handler(SDL_Event * event) -{ - uint32_t win_id = UINT32_MAX; - switch(event->type) { - case SDL_MOUSEBUTTONUP: - case SDL_MOUSEBUTTONDOWN: - win_id = event->button.windowID; - break; - case SDL_MOUSEMOTION: - win_id = event->motion.windowID; - break; -#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN - case SDL_MOUSEWHEEL: - win_id = event->wheel.windowID; - break; -#endif - case SDL_FINGERUP: - case SDL_FINGERDOWN: - case SDL_FINGERMOTION: -#if SDL_VERSION_ATLEAST(2,0,12) - win_id = event->tfinger.windowID; -#endif - break; - case SDL_WINDOWEVENT: - win_id = event->window.windowID; - break; - default: - return; - } - - lv_display_t * disp = lv_sdl_get_disp_from_win_id(win_id); - - /*Find a suitable indev*/ - lv_indev_t * indev = lv_indev_get_next(NULL); - while(indev) { - if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER) { - /*If disp is NULL for any reason use the first indev with the correct type*/ - if(disp == NULL || lv_indev_get_display(indev) == disp) break; - } - indev = lv_indev_get_next(indev); - } - - if(indev == NULL) return; - lv_sdl_mouse_t * indev_dev = lv_indev_get_driver_data(indev); - if(indev_dev == NULL) return; - - int32_t hor_res = lv_display_get_horizontal_resolution(disp); - int32_t ver_res = lv_display_get_vertical_resolution(disp); - uint8_t zoom = lv_sdl_window_get_zoom(disp); - - switch(event->type) { - case SDL_WINDOWEVENT: - if(event->window.event == SDL_WINDOWEVENT_LEAVE) { - indev_dev->left_button_down = false; - } - break; - case SDL_MOUSEBUTTONUP: - if(event->button.button == SDL_BUTTON_LEFT) - indev_dev->left_button_down = false; - break; - case SDL_WINDOWEVENT_LEAVE: - indev_dev->left_button_down = false; - break; - case SDL_MOUSEBUTTONDOWN: - if(event->button.button == SDL_BUTTON_LEFT) { - indev_dev->left_button_down = true; - indev_dev->last_x = event->motion.x / zoom; - indev_dev->last_y = event->motion.y / zoom; - } - break; - case SDL_MOUSEMOTION: - indev_dev->last_x = event->motion.x / zoom; - indev_dev->last_y = event->motion.y / zoom; - break; - - case SDL_FINGERUP: - indev_dev->left_button_down = false; - indev_dev->last_x = (int16_t)((float)hor_res * event->tfinger.x / zoom); - indev_dev->last_y = (int16_t)((float)ver_res * event->tfinger.y / zoom); - break; - case SDL_FINGERDOWN: - indev_dev->left_button_down = true; - indev_dev->last_x = (int16_t)((float)hor_res * event->tfinger.x / zoom); - indev_dev->last_y = (int16_t)((float)ver_res * event->tfinger.y / zoom); - break; - case SDL_FINGERMOTION: - indev_dev->last_x = (int16_t)((float)hor_res * event->tfinger.x / zoom); - indev_dev->last_y = (int16_t)((float)ver_res * event->tfinger.y / zoom); - break; - case SDL_MOUSEWHEEL: -#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN -#ifdef __EMSCRIPTEN__ - /*Emscripten scales it wrong*/ - if(event->wheel.y < 0) dsc->diff++; - if(event->wheel.y > 0) dsc->diff--; -#else - indev_dev->diff = -event->wheel.y; -#endif /*__EMSCRIPTEN__*/ -#endif /*LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN*/ - break; - } - lv_indev_read(indev); -} - -#endif /*LV_USE_SDL*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_mouse.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_mouse.h deleted file mode 100644 index ef60685..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_mouse.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @file lv_sdl_mouse.h - * - */ - -#ifndef LV_SDL_MOUSE_H -#define LV_SDL_MOUSE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_sdl_window.h" -#if LV_USE_SDL - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -lv_indev_t * lv_sdl_mouse_create(void); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_SDL*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_SDL_MOUSE_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_mousewheel.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_mousewheel.c deleted file mode 100644 index b31a723..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_mousewheel.c +++ /dev/null @@ -1,142 +0,0 @@ -/** - * @file lv_sdl_mousewheel.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_sdl_mousewheel.h" -#if LV_USE_SDL && LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_ENCODER - -#include "../../core/lv_group.h" -#include "../../stdlib/lv_string.h" -#include "lv_sdl_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void sdl_mousewheel_read(lv_indev_t * indev, lv_indev_data_t * data); -static void release_indev_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -typedef struct { - int16_t diff; - lv_indev_state_t state; -} lv_sdl_mousewheel_t; - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_indev_t * lv_sdl_mousewheel_create(void) -{ - lv_sdl_mousewheel_t * dsc = lv_malloc_zeroed(sizeof(lv_sdl_mousewheel_t)); - LV_ASSERT_MALLOC(dsc); - if(dsc == NULL) return NULL; - - lv_indev_t * indev = lv_indev_create(); - if(indev == NULL) { - lv_free(dsc); - return NULL; - } - - lv_indev_set_type(indev, LV_INDEV_TYPE_ENCODER); - lv_indev_set_read_cb(indev, sdl_mousewheel_read); - lv_indev_set_driver_data(indev, dsc); - - lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); - lv_indev_add_event_cb(indev, release_indev_cb, LV_EVENT_DELETE, indev); - - return indev; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void sdl_mousewheel_read(lv_indev_t * indev, lv_indev_data_t * data) -{ - lv_sdl_mousewheel_t * dsc = lv_indev_get_driver_data(indev); - - data->state = dsc->state; - data->enc_diff = dsc->diff; - dsc->diff = 0; -} - -static void release_indev_cb(lv_event_t * e) -{ - lv_indev_t * indev = (lv_indev_t *) lv_event_get_user_data(e); - lv_sdl_mousewheel_t * dsc = lv_indev_get_driver_data(indev); - if(dsc) { - lv_indev_set_driver_data(indev, NULL); - lv_indev_set_read_cb(indev, NULL); - lv_free(dsc); - LV_LOG_INFO("done"); - } -} - -void lv_sdl_mousewheel_handler(SDL_Event * event) -{ - uint32_t win_id = UINT32_MAX; - switch(event->type) { - case SDL_MOUSEWHEEL: - win_id = event->wheel.windowID; - break; - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - win_id = event->button.windowID; - break; - default: - return; - } - - lv_display_t * disp = lv_sdl_get_disp_from_win_id(win_id); - - /*Find a suitable indev*/ - lv_indev_t * indev = lv_indev_get_next(NULL); - while(indev) { - if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER) { - /*If disp is NULL for any reason use the first indev with the correct type*/ - if(disp == NULL || lv_indev_get_display(indev) == disp) break; - } - indev = lv_indev_get_next(indev); - } - - if(indev == NULL) return; - lv_sdl_mousewheel_t * dsc = lv_indev_get_driver_data(indev); - - switch(event->type) { - case SDL_MOUSEWHEEL: -#ifdef __EMSCRIPTEN__ - /*Emscripten scales it wrong*/ - if(event->wheel.y < 0) dsc->diff++; - if(event->wheel.y > 0) dsc->diff--; -#else - dsc->diff = -event->wheel.y; -#endif - break; - case SDL_MOUSEBUTTONDOWN: - if(event->button.button == SDL_BUTTON_MIDDLE) { - dsc->state = LV_INDEV_STATE_PRESSED; - } - break; - case SDL_MOUSEBUTTONUP: - if(event->button.button == SDL_BUTTON_MIDDLE) { - dsc->state = LV_INDEV_STATE_RELEASED; - } - break; - default: - break; - } - lv_indev_read(indev); -} - -#endif /*LV_USE_SDL*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_mousewheel.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_mousewheel.h deleted file mode 100644 index 7ca34bd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_mousewheel.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @file lv_sdl_mousewheel.h - * - */ - -#ifndef LV_SDL_MOUSEWHEEL_H -#define LV_SDL_MOUSEWHEEL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_sdl_window.h" -#if LV_USE_SDL && LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_ENCODER - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -lv_indev_t * lv_sdl_mousewheel_create(void); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_SDL*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_DEV_SDL_MOUSEWHEEL_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_private.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_private.h deleted file mode 100644 index 1fd519b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_private.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @file lv_sdl_private.h - * - */ - -#ifndef LV_SDL_PRIVATE_H -#define LV_SDL_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_types.h" - -#if LV_USE_SDL - -#include LV_SDL_INCLUDE_PATH - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_sdl_keyboard_handler(SDL_Event * event); -void lv_sdl_mouse_handler(SDL_Event * event); -void lv_sdl_mousewheel_handler(SDL_Event * event); -lv_display_t * lv_sdl_get_disp_from_win_id(uint32_t win_id); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_SDL*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_SDL_PRIVATE_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_window.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_window.c deleted file mode 100644 index df8a28e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_window.c +++ /dev/null @@ -1,495 +0,0 @@ -/** - * @file lv_sdl_window.h - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_sdl_window.h" -#if LV_USE_SDL -#include -#include "../../core/lv_refr.h" -#include "../../stdlib/lv_string.h" -#include "../../core/lv_global.h" -#include "../../display/lv_display_private.h" -#include "../../lv_init.h" -#include "../../draw/lv_draw_buf.h" - -/* for aligned_alloc */ -#ifndef __USE_ISOC11 - #define __USE_ISOC11 -#endif -#include - -#define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/ -#include "lv_sdl_private.h" - -/********************* - * DEFINES - *********************/ -#define lv_deinit_in_progress LV_GLOBAL_DEFAULT()->deinit_in_progress - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - SDL_Window * window; - SDL_Renderer * renderer; -#if LV_USE_DRAW_SDL == 0 - SDL_Texture * texture; - uint8_t * fb1; - uint8_t * fb2; - uint8_t * fb_act; - uint8_t * buf1; - uint8_t * buf2; - uint8_t * rotated_buf; - size_t rotated_buf_size; -#endif - uint8_t zoom; - uint8_t ignore_size_chg; -} lv_sdl_window_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static inline int sdl_render_mode(void); -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); -static void window_create(lv_display_t * disp); -static void window_update(lv_display_t * disp); -#if LV_USE_DRAW_SDL == 0 - static void texture_resize(lv_display_t * disp); - static void * sdl_draw_buf_realloc_aligned(void * ptr, size_t new_size); - static void sdl_draw_buf_free(void * ptr); -#endif -static void sdl_event_handler(lv_timer_t * t); -static void release_disp_cb(lv_event_t * e); -static void res_chg_event_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ -static bool inited = false; -static lv_timer_t * event_handler_timer; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_sdl_window_create(int32_t hor_res, int32_t ver_res) -{ - if(!inited) { - SDL_Init(SDL_INIT_VIDEO); - SDL_StartTextInput(); - event_handler_timer = lv_timer_create(sdl_event_handler, 5, NULL); - lv_tick_set_cb(SDL_GetTicks); - - inited = true; - } - - lv_sdl_window_t * dsc = lv_malloc_zeroed(sizeof(lv_sdl_window_t)); - LV_ASSERT_MALLOC(dsc); - if(dsc == NULL) return NULL; - - lv_display_t * disp = lv_display_create(hor_res, ver_res); - if(disp == NULL) { - lv_free(dsc); - return NULL; - } - lv_display_add_event_cb(disp, release_disp_cb, LV_EVENT_DELETE, disp); - lv_display_set_driver_data(disp, dsc); - window_create(disp); - - lv_display_set_flush_cb(disp, flush_cb); - -#if LV_USE_DRAW_SDL == 0 - if(sdl_render_mode() == LV_DISPLAY_RENDER_MODE_PARTIAL) { - dsc->buf1 = sdl_draw_buf_realloc_aligned(NULL, 32 * 1024); -#if LV_SDL_BUF_COUNT == 2 - dsc->buf2 = sdl_draw_buf_realloc_aligned(NULL, 32 * 1024); -#endif - lv_display_set_buffers(disp, dsc->buf1, dsc->buf2, - 32 * 1024, LV_DISPLAY_RENDER_MODE_PARTIAL); - } - /*LV_DISPLAY_RENDER_MODE_DIRECT or FULL */ - else { - uint32_t stride = lv_draw_buf_width_to_stride(disp->hor_res, - lv_display_get_color_format(disp)); - lv_display_set_buffers(disp, dsc->fb1, dsc->fb2, stride * disp->ver_res, - LV_SDL_RENDER_MODE); - } -#else /*LV_USE_DRAW_SDL == 1*/ - /*It will render directly to default Texture, so the buffer is not used, so just set something*/ - static lv_draw_buf_t draw_buf; - static uint8_t dummy_buf; /*It won't be used as it will render to the SDL textures directly*/ - lv_draw_buf_init(&draw_buf, 4096, 4096, LV_COLOR_FORMAT_ARGB8888, 4096 * 4, &dummy_buf, 4096 * 4096 * 4); - - lv_display_set_draw_buffers(disp, &draw_buf, NULL); - lv_display_set_render_mode(disp, LV_DISPLAY_RENDER_MODE_DIRECT); -#endif /*LV_USE_DRAW_SDL == 0*/ - lv_display_add_event_cb(disp, res_chg_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); - - /*Process the initial events*/ - sdl_event_handler(NULL); - - return disp; -} - -void lv_sdl_window_set_resizeable(lv_display_t * disp, bool value) -{ - lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); - SDL_SetWindowResizable(dsc->window, value); -} - -void lv_sdl_window_set_zoom(lv_display_t * disp, uint8_t zoom) -{ - lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); - dsc->zoom = zoom; - lv_display_send_event(disp, LV_EVENT_RESOLUTION_CHANGED, NULL); - lv_refr_now(disp); -} - -uint8_t lv_sdl_window_get_zoom(lv_display_t * disp) -{ - lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); - return dsc->zoom; -} - -lv_display_t * lv_sdl_get_disp_from_win_id(uint32_t win_id) -{ - lv_display_t * disp = lv_display_get_next(NULL); - if(win_id == UINT32_MAX) return disp; - - while(disp) { - lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); - if(dsc != NULL && SDL_GetWindowID(dsc->window) == win_id) { - return disp; - } - disp = lv_display_get_next(disp); - } - return NULL; -} - -void lv_sdl_window_set_title(lv_display_t * disp, const char * title) -{ - lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); - SDL_SetWindowTitle(dsc->window, title); -} - -void * lv_sdl_window_get_renderer(lv_display_t * disp) -{ - lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); - return dsc->renderer; -} - -void lv_sdl_quit(void) -{ - if(inited) { - SDL_Quit(); - lv_timer_delete(event_handler_timer); - event_handler_timer = NULL; - inited = false; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static inline int sdl_render_mode(void) -{ - return LV_SDL_RENDER_MODE; -} - -static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) -{ -#if LV_USE_DRAW_SDL == 0 - lv_area_t rotated_area; - lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); - lv_color_format_t cf = lv_display_get_color_format(disp); - - if(sdl_render_mode() == LV_DISPLAY_RENDER_MODE_PARTIAL) { - lv_display_rotation_t rotation = lv_display_get_rotation(disp); - uint32_t px_size = lv_color_format_get_size(cf); - - if(rotation != LV_DISPLAY_ROTATION_0) { - int32_t w = lv_area_get_width(area); - int32_t h = lv_area_get_height(area); - uint32_t w_stride = lv_draw_buf_width_to_stride(w, cf); - uint32_t h_stride = lv_draw_buf_width_to_stride(h, cf); - size_t buf_size = w * h * px_size; - - /* (Re)allocate temporary buffer if needed */ - if(!dsc->rotated_buf || dsc->rotated_buf_size != buf_size) { - dsc->rotated_buf = sdl_draw_buf_realloc_aligned(dsc->rotated_buf, buf_size); - dsc->rotated_buf_size = buf_size; - } - - switch(rotation) { - case LV_DISPLAY_ROTATION_0: - break; - case LV_DISPLAY_ROTATION_90: - lv_draw_sw_rotate(px_map, dsc->rotated_buf, w, h, w_stride, h_stride, rotation, cf); - break; - case LV_DISPLAY_ROTATION_180: - lv_draw_sw_rotate(px_map, dsc->rotated_buf, w, h, w_stride, w_stride, rotation, cf); - break; - case LV_DISPLAY_ROTATION_270: - lv_draw_sw_rotate(px_map, dsc->rotated_buf, w, h, w_stride, h_stride, rotation, cf); - break; - } - - px_map = dsc->rotated_buf; - - rotated_area = *area; - lv_display_rotate_area(disp, &rotated_area); - area = &rotated_area; - } - - uint32_t px_map_stride = lv_draw_buf_width_to_stride(lv_area_get_width(area), cf); - uint32_t px_map_line_bytes = lv_area_get_width(area) * px_size; - - uint8_t * fb_tmp = dsc->fb_act; - uint32_t fb_stride = disp->hor_res * px_size; - fb_tmp += area->y1 * fb_stride; - fb_tmp += area->x1 * px_size; - - int32_t y; - for(y = area->y1; y <= area->y2; y++) { - lv_memcpy(fb_tmp, px_map, px_map_line_bytes); - px_map += px_map_stride; - fb_tmp += fb_stride; - } - } - - /* TYPICALLY YOU DO NOT NEED THIS - * If it was the last part to refresh update the texture of the window.*/ - if(lv_display_flush_is_last(disp)) { - if(sdl_render_mode() != LV_DISPLAY_RENDER_MODE_PARTIAL) { - dsc->fb_act = px_map; - } - window_update(disp); - } -#else - LV_UNUSED(area); - LV_UNUSED(px_map); - if(lv_display_flush_is_last(disp)) { - window_update(disp); - } -#endif /*LV_USE_DRAW_SDL == 0*/ - - /*IMPORTANT! It must be called to tell the system the flush is ready*/ - lv_display_flush_ready(disp); -} - -/** - * SDL main thread. All SDL related task have to be handled here! - * It initializes SDL, handles drawing and the mouse. - */ -static void sdl_event_handler(lv_timer_t * t) -{ - LV_UNUSED(t); - - /*Refresh handling*/ - SDL_Event event; - while(SDL_PollEvent(&event)) { - lv_sdl_mouse_handler(&event); -#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_ENCODER - lv_sdl_mousewheel_handler(&event); -#endif - lv_sdl_keyboard_handler(&event); - - if(event.type == SDL_WINDOWEVENT) { - lv_display_t * disp = lv_sdl_get_disp_from_win_id(event.window.windowID); - if(disp == NULL) continue; - lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); - switch(event.window.event) { -#if SDL_VERSION_ATLEAST(2, 0, 5) - case SDL_WINDOWEVENT_TAKE_FOCUS: -#endif - case SDL_WINDOWEVENT_EXPOSED: - window_update(disp); - break; - case SDL_WINDOWEVENT_RESIZED: - dsc->ignore_size_chg = 1; - lv_display_set_resolution(disp, event.window.data1 / dsc->zoom, event.window.data2 / dsc->zoom); - dsc->ignore_size_chg = 0; - lv_refr_now(disp); - break; - case SDL_WINDOWEVENT_CLOSE: - lv_display_delete(disp); - break; - default: - break; - } - } - if(event.type == SDL_QUIT) { - SDL_Quit(); - lv_deinit(); - inited = false; -#if LV_SDL_DIRECT_EXIT - exit(0); -#endif - } - } -} - -static void window_create(lv_display_t * disp) -{ - lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); - dsc->zoom = 1; - - int flag = SDL_WINDOW_RESIZABLE; -#if LV_SDL_FULLSCREEN - flag |= SDL_WINDOW_FULLSCREEN; -#endif - - int32_t hor_res = disp->hor_res; - int32_t ver_res = disp->ver_res; - dsc->window = SDL_CreateWindow("LVGL Simulator", - SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, - hor_res * dsc->zoom, ver_res * dsc->zoom, flag); /*last param. SDL_WINDOW_BORDERLESS to hide borders*/ - - dsc->renderer = SDL_CreateRenderer(dsc->window, -1, - LV_SDL_ACCELERATED ? SDL_RENDERER_ACCELERATED : SDL_RENDERER_SOFTWARE); -#if LV_USE_DRAW_SDL == 0 - texture_resize(disp); - - uint32_t px_size = lv_color_format_get_size(lv_display_get_color_format(disp)); - lv_memset(dsc->fb1, 0xff, hor_res * ver_res * px_size); -#if LV_SDL_BUF_COUNT == 2 - lv_memset(dsc->fb2, 0xff, hor_res * ver_res * px_size); -#endif -#endif /*LV_USE_DRAW_SDL == 0*/ - /*Some platforms (e.g. Emscripten) seem to require setting the size again */ - SDL_SetWindowSize(dsc->window, hor_res * dsc->zoom, ver_res * dsc->zoom); -#if LV_USE_DRAW_SDL == 0 - texture_resize(disp); -#endif /*LV_USE_DRAW_SDL == 0*/ -} - -static void window_update(lv_display_t * disp) -{ - lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); -#if LV_USE_DRAW_SDL == 0 - int32_t hor_res = disp->hor_res; - uint32_t stride = lv_draw_buf_width_to_stride(hor_res, lv_display_get_color_format(disp)); - SDL_UpdateTexture(dsc->texture, NULL, dsc->fb_act, stride); - - SDL_RenderClear(dsc->renderer); - - /*Update the renderer with the texture containing the rendered image*/ - SDL_RenderCopy(dsc->renderer, dsc->texture, NULL, NULL); -#endif - SDL_RenderPresent(dsc->renderer); -} - -#if LV_USE_DRAW_SDL == 0 -static void texture_resize(lv_display_t * disp) -{ - uint32_t stride = lv_draw_buf_width_to_stride(disp->hor_res, lv_display_get_color_format(disp)); - lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); - - dsc->fb1 = sdl_draw_buf_realloc_aligned(dsc->fb1, stride * disp->ver_res); - lv_memzero(dsc->fb1, stride * disp->ver_res); - - if(sdl_render_mode() == LV_DISPLAY_RENDER_MODE_PARTIAL) { - dsc->fb_act = dsc->fb1; - } - else { -#if LV_SDL_BUF_COUNT == 2 - dsc->fb2 = sdl_draw_buf_realloc_aligned(dsc->fb2, stride * disp->ver_res); - memset(dsc->fb2, 0x00, stride * disp->ver_res); -#endif - lv_display_set_buffers(disp, dsc->fb1, dsc->fb2, stride * disp->ver_res, LV_SDL_RENDER_MODE); - } - if(dsc->texture) SDL_DestroyTexture(dsc->texture); - -#if LV_COLOR_DEPTH == 32 - SDL_PixelFormatEnum px_format = - SDL_PIXELFORMAT_RGB888; /*same as SDL_PIXELFORMAT_RGB888, but it's not supported in older versions*/ -#elif LV_COLOR_DEPTH == 24 - SDL_PixelFormatEnum px_format = SDL_PIXELFORMAT_BGR24; -#elif LV_COLOR_DEPTH == 16 - SDL_PixelFormatEnum px_format = SDL_PIXELFORMAT_RGB565; -#else -#error("Unsupported color format") -#endif - // px_format = SDL_PIXELFORMAT_BGR24; - - dsc->texture = SDL_CreateTexture(dsc->renderer, px_format, - SDL_TEXTUREACCESS_STATIC, disp->hor_res, disp->ver_res); - SDL_SetTextureBlendMode(dsc->texture, SDL_BLENDMODE_BLEND); -} - -static void * sdl_draw_buf_realloc_aligned(void * ptr, size_t new_size) -{ - if(ptr) { - sdl_draw_buf_free(ptr); - } - - /* No need copy for drawing buffer */ - -#ifndef _WIN32 - /* Size must be multiple of align, See: https://en.cppreference.com/w/c/memory/aligned_alloc */ - -#define BUF_ALIGN (LV_DRAW_BUF_ALIGN < sizeof(void *) ? sizeof(void *) : LV_DRAW_BUF_ALIGN) - return aligned_alloc(BUF_ALIGN, LV_ALIGN_UP(new_size, BUF_ALIGN)); -#else - return _aligned_malloc(LV_ALIGN_UP(new_size, LV_DRAW_BUF_ALIGN), LV_DRAW_BUF_ALIGN); -#endif /* _WIN32 */ -} - -static void sdl_draw_buf_free(void * ptr) -{ -#ifndef _WIN32 - free(ptr); -#else - _aligned_free(ptr); -#endif /* _WIN32 */ -} -#endif - -static void res_chg_event_cb(lv_event_t * e) -{ - lv_display_t * disp = lv_event_get_current_target(e); - - lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); - if(dsc->ignore_size_chg == false) { - SDL_SetWindowSize(dsc->window, disp->hor_res * dsc->zoom, disp->ver_res * dsc->zoom); - } - -#if LV_USE_DRAW_SDL == 0 - texture_resize(disp); -#endif -} - -static void release_disp_cb(lv_event_t * e) -{ - if(lv_deinit_in_progress) { - lv_sdl_quit(); - } - - lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e); - - lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); -#if LV_USE_DRAW_SDL == 0 - SDL_DestroyTexture(dsc->texture); -#endif - SDL_DestroyRenderer(dsc->renderer); - SDL_DestroyWindow(dsc->window); -#if LV_USE_DRAW_SDL == 0 - if(dsc->fb1) sdl_draw_buf_free(dsc->fb1); - if(dsc->fb2) sdl_draw_buf_free(dsc->fb2); - if(dsc->buf1) sdl_draw_buf_free(dsc->buf1); - if(dsc->buf2) sdl_draw_buf_free(dsc->buf2); -#endif - lv_free(dsc); - lv_display_set_driver_data(disp, NULL); -} - -#endif /*LV_USE_SDL*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_window.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_window.h deleted file mode 100644 index f2e243c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/sdl/lv_sdl_window.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @file lv_sdl_window.h - * - */ - -#ifndef LV_SDL_WINDOW_H -#define LV_SDL_WINDOW_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../display/lv_display.h" -#include "../../indev/lv_indev.h" - -#if LV_USE_SDL - -/********************* - * DEFINES - *********************/ - -/* Possible values of LV_SDL_MOUSEWHEEL_MODE */ -#define LV_SDL_MOUSEWHEEL_MODE_ENCODER 0 /* The mousewheel emulates an encoder input device*/ -#define LV_SDL_MOUSEWHEEL_MODE_CROWN 1 /* The mousewheel emulates a smart watch crown*/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -lv_display_t * lv_sdl_window_create(int32_t hor_res, int32_t ver_res); - -void lv_sdl_window_set_resizeable(lv_display_t * disp, bool value); - -void lv_sdl_window_set_zoom(lv_display_t * disp, uint8_t zoom); - -uint8_t lv_sdl_window_get_zoom(lv_display_t * disp); - -void lv_sdl_window_set_title(lv_display_t * disp, const char * title); - -void * lv_sdl_window_get_renderer(lv_display_t * disp); - -void lv_sdl_quit(void); - -/********************** - * MACROS - **********************/ - -#endif /* LV_DRV_SDL */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_SDL_WINDOW_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/wayland/lv_wayland.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/wayland/lv_wayland.c deleted file mode 100644 index dc71f66..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/wayland/lv_wayland.c +++ /dev/null @@ -1,2860 +0,0 @@ -/******************************************************************* - * - * @file lv_wayland.c - The Wayland client for LVGL applications - * - * Based on the original file from the repository. - * - * Porting to LVGL 9.1 - * EDGEMTech Ltd. by Erik Tagirov (erik.tagirov@edgemtech.ch) - * - * See LICENCE.txt for details - * - ******************************************************************/ - -typedef int dummy_t; /* Make GCC on windows happy, avoid empty translation unit */ - -#ifndef _WIN32 - -/********************* - * INCLUDES - *********************/ -#include "lv_wayland.h" -#include "lv_wayland_smm.h" - -#if LV_USE_WAYLAND - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "lvgl.h" - - -#if !LV_WAYLAND_WL_SHELL - #include "wayland_xdg_shell.h" - #define LV_WAYLAND_XDG_SHELL 1 -#else - #define LV_WAYLAND_XDG_SHELL 0 -#endif - - -/********************* - * DEFINES - *********************/ - -#define LVGL_DRAW_BUFFER_DIV (8) -#define DMG_CACHE_CAPACITY (32) -#define TAG_LOCAL (0) -#define TAG_BUFFER_DAMAGE (1) - -#if LV_WAYLAND_WINDOW_DECORATIONS - #define TITLE_BAR_HEIGHT 24 - #define BORDER_SIZE 2 - #define BUTTON_MARGIN LV_MAX((TITLE_BAR_HEIGHT / 6), BORDER_SIZE) - #define BUTTON_PADDING LV_MAX((TITLE_BAR_HEIGHT / 8), BORDER_SIZE) - #define BUTTON_SIZE (TITLE_BAR_HEIGHT - (2 * BUTTON_MARGIN)) -#endif - -#ifndef LV_WAYLAND_CYCLE_PERIOD - #define LV_WAYLAND_CYCLE_PERIOD LV_MIN(LV_DEF_REFR_PERIOD,1) -#endif - -#define SHM_FORMAT_UNKNOWN 0xFFFFFF - -#if (LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1) - #error [wayland] Unsupported LV_COLOR_DEPTH -#endif - -/********************** - * TYPEDEFS - **********************/ - -enum object_type { - OBJECT_TITLEBAR = 0, - OBJECT_BUTTON_CLOSE, -#if LV_WAYLAND_XDG_SHELL - OBJECT_BUTTON_MAXIMIZE, - OBJECT_BUTTON_MINIMIZE, -#endif - OBJECT_BORDER_TOP, - OBJECT_BORDER_BOTTOM, - OBJECT_BORDER_LEFT, - OBJECT_BORDER_RIGHT, - OBJECT_WINDOW, -}; - -#define FIRST_DECORATION (OBJECT_TITLEBAR) -#define LAST_DECORATION (OBJECT_BORDER_RIGHT) -#define NUM_DECORATIONS (LAST_DECORATION-FIRST_DECORATION+1) - -struct window; -struct input { - struct { - uint32_t x; - uint32_t y; - lv_indev_state_t left_button; - lv_indev_state_t right_button; - lv_indev_state_t wheel_button; - int16_t wheel_diff; - } pointer; - - struct { - lv_key_t key; - lv_indev_state_t state; - } keyboard; - - struct { - uint32_t x; - uint32_t y; - lv_indev_state_t state; - } touch; -}; - -struct seat { - struct wl_touch * wl_touch; - struct wl_pointer * wl_pointer; - struct wl_keyboard * wl_keyboard; - - struct { - struct xkb_keymap * keymap; - struct xkb_state * state; - } xkb; -}; - -struct graphic_object { - struct window * window; - - struct wl_surface * surface; - bool surface_configured; - smm_buffer_t * pending_buffer; - smm_group_t * buffer_group; - struct wl_subsurface * subsurface; - - enum object_type type; - int width; - int height; - - struct input input; -}; - -struct application { - struct wl_display * display; - struct wl_registry * registry; - struct wl_compositor * compositor; - struct wl_subcompositor * subcompositor; - struct wl_shm * shm; - struct wl_seat * wl_seat; - - struct wl_cursor_theme * cursor_theme; - struct wl_surface * cursor_surface; - -#if LV_WAYLAND_WL_SHELL - struct wl_shell * wl_shell; -#endif - -#if LV_WAYLAND_XDG_SHELL - struct xdg_wm_base * xdg_wm; -#endif - - const char * xdg_runtime_dir; - -#ifdef LV_WAYLAND_WINDOW_DECORATIONS - bool opt_disable_decorations; -#endif - - uint32_t shm_format; - - struct xkb_context * xkb_context; - - struct seat seat; - - struct graphic_object * touch_obj; - struct graphic_object * pointer_obj; - struct graphic_object * keyboard_obj; - - lv_ll_t window_ll; - lv_timer_t * cycle_timer; - - bool cursor_flush_pending; - struct pollfd wayland_pfd; -}; - -struct window { - lv_display_t * lv_disp; - lv_draw_buf_t * lv_disp_draw_buf; - - lv_indev_t * lv_indev_pointer; - lv_indev_t * lv_indev_pointeraxis; - lv_indev_t * lv_indev_touch; - lv_indev_t * lv_indev_keyboard; - - lv_wayland_display_close_f_t close_cb; - - struct application * application; - -#if LV_WAYLAND_WL_SHELL - struct wl_shell_surface * wl_shell_surface; -#endif - -#if LV_WAYLAND_XDG_SHELL - struct xdg_surface * xdg_surface; - struct xdg_toplevel * xdg_toplevel; - uint32_t wm_capabilities; -#endif - - struct graphic_object * body; - struct { - lv_area_t cache[DMG_CACHE_CAPACITY]; - unsigned char start; - unsigned char end; - unsigned size; - } dmg_cache; - -#if LV_WAYLAND_WINDOW_DECORATIONS - struct graphic_object * decoration[NUM_DECORATIONS]; -#endif - - int width; - int height; - - bool resize_pending; - int resize_width; - int resize_height; - - bool flush_pending; - bool shall_close; - bool closed; - bool maximized; - bool fullscreen; - uint32_t frame_counter; - bool frame_done; -}; - -/********************************* - * STATIC VARIABLES and FUNTIONS - *********************************/ - -static struct application application; - -static void color_fill(void * pixels, lv_color_t color, uint32_t width, uint32_t height); -static void color_fill_XRGB8888(void * pixels, lv_color_t color, uint32_t width, uint32_t height); -static void color_fill_RGB565(void * pixels, lv_color_t color, uint32_t width, uint32_t height); - -static const struct wl_callback_listener wl_surface_frame_listener; -static bool resize_window(struct window * window, int width, int height); -static struct graphic_object * create_graphic_obj(struct application * app, struct window * window, - enum object_type type, - struct graphic_object * parent); - -static uint32_t tick_get_cb(void); - -static void wayland_init(void); -static void wayland_deinit(void); - -/** - * The frame callback called when the compositor has finished rendering - * a frame.It increments the frame counter and sets up the callback - * for the next frame the frame counter is used to avoid needlessly - * committing frames too fast on a slow system - * - * NOTE: this function is invoked by the wayland-server library within the compositor - * the event is added to the queue, and then upon the next timer call it's - * called indirectly from _lv_wayland_handle_input (via wl_display_dispatch_queue) - * @param void data the user object defined that was tied to this event during - * the configuration of the callback - * @param struct wl_callback The callback that needs to be destroyed and re-created - * @param time Timestamp of the event (unused) - */ -static void graphic_obj_frame_done(void * data, struct wl_callback * cb, uint32_t time) -{ - struct graphic_object * obj; - struct window * window; - - LV_UNUSED(time); - - wl_callback_destroy(cb); - - obj = (struct graphic_object *)data; - window = obj->window; - window->frame_counter++; - - LV_LOG_TRACE("frame: %d done, new frame: %d", - window->frame_counter - 1, window->frame_counter); - - window->frame_done = true; - -} - -static const struct wl_callback_listener wl_surface_frame_listener = { - .done = graphic_obj_frame_done, -}; - -static inline bool _is_digit(char ch) -{ - return (ch >= '0') && (ch <= '9'); -} - -/* - * shm_format - * @description called by the compositor to advertise the supported - * color formats for SHM buffers, there is a call per supported format - */ -static void shm_format(void * data, struct wl_shm * wl_shm, uint32_t format) -{ - struct application * app = data; - - LV_UNUSED(wl_shm); - - LV_LOG_TRACE("Supported color space fourcc.h code: %08X", format); - - if(LV_COLOR_DEPTH == 32 && format == WL_SHM_FORMAT_ARGB8888) { - - /* Wayland compositors MUST support ARGB8888 */ - app->shm_format = format; - - } - else if(LV_COLOR_DEPTH == 32 && - format == WL_SHM_FORMAT_XRGB8888 && - app->shm_format != WL_SHM_FORMAT_ARGB8888) { - - /* Select XRGB only if the compositor doesn't support transprancy */ - app->shm_format = format; - - } - else if(LV_COLOR_DEPTH == 16 && format == WL_SHM_FORMAT_RGB565) { - - app->shm_format = format; - - } -} - -static const struct wl_shm_listener shm_listener = { - shm_format -}; - -static void pointer_handle_enter(void * data, struct wl_pointer * pointer, - uint32_t serial, struct wl_surface * surface, - wl_fixed_t sx, wl_fixed_t sy) -{ - struct application * app = data; - const char * cursor = "left_ptr"; - int pos_x = wl_fixed_to_int(sx); - int pos_y = wl_fixed_to_int(sy); - - if(!surface) { - app->pointer_obj = NULL; - return; - } - - app->pointer_obj = wl_surface_get_user_data(surface); - - app->pointer_obj->input.pointer.x = pos_x; - app->pointer_obj->input.pointer.y = pos_y; - -#if (LV_WAYLAND_WINDOW_DECORATIONS && LV_WAYLAND_XDG_SHELL) - if(!app->pointer_obj->window->xdg_toplevel || app->opt_disable_decorations) { - return; - } - - struct window * window = app->pointer_obj->window; - - switch(app->pointer_obj->type) { - case OBJECT_BORDER_TOP: - if(window->maximized) { - // do nothing - } - else if(pos_x < (BORDER_SIZE * 5)) { - cursor = "top_left_corner"; - } - else if(pos_x >= (window->width + BORDER_SIZE - (BORDER_SIZE * 5))) { - cursor = "top_right_corner"; - } - else { - cursor = "top_side"; - } - break; - case OBJECT_BORDER_BOTTOM: - if(window->maximized) { - // do nothing - } - else if(pos_x < (BORDER_SIZE * 5)) { - cursor = "bottom_left_corner"; - } - else if(pos_x >= (window->width + BORDER_SIZE - (BORDER_SIZE * 5))) { - cursor = "bottom_right_corner"; - } - else { - cursor = "bottom_side"; - } - break; - case OBJECT_BORDER_LEFT: - if(window->maximized) { - // do nothing - } - else if(pos_y < (BORDER_SIZE * 5)) { - cursor = "top_left_corner"; - } - else if(pos_y >= (window->height + BORDER_SIZE - (BORDER_SIZE * 5))) { - cursor = "bottom_left_corner"; - } - else { - cursor = "left_side"; - } - break; - case OBJECT_BORDER_RIGHT: - if(window->maximized) { - // do nothing - } - else if(pos_y < (BORDER_SIZE * 5)) { - cursor = "top_right_corner"; - } - else if(pos_y >= (window->height + BORDER_SIZE - (BORDER_SIZE * 5))) { - cursor = "bottom_right_corner"; - } - else { - cursor = "right_side"; - } - break; - default: - break; - } -#endif - - if(app->cursor_surface) { - struct wl_cursor_image * cursor_image = wl_cursor_theme_get_cursor(app->cursor_theme, cursor)->images[0]; - wl_pointer_set_cursor(pointer, serial, app->cursor_surface, cursor_image->hotspot_x, cursor_image->hotspot_y); - wl_surface_attach(app->cursor_surface, wl_cursor_image_get_buffer(cursor_image), 0, 0); - wl_surface_damage(app->cursor_surface, 0, 0, cursor_image->width, cursor_image->height); - wl_surface_commit(app->cursor_surface); - app->cursor_flush_pending = true; - } -} - -static void pointer_handle_leave(void * data, struct wl_pointer * pointer, - uint32_t serial, struct wl_surface * surface) -{ - struct application * app = data; - - LV_UNUSED(pointer); - LV_UNUSED(serial); - - if(!surface || (app->pointer_obj == wl_surface_get_user_data(surface))) { - app->pointer_obj = NULL; - } -} - -static void pointer_handle_motion(void * data, struct wl_pointer * pointer, - uint32_t time, wl_fixed_t sx, wl_fixed_t sy) -{ - struct application * app = data; - - LV_UNUSED(pointer); - LV_UNUSED(time); - - if(!app->pointer_obj) { - return; - } - - app->pointer_obj->input.pointer.x = LV_MAX(0, LV_MIN(wl_fixed_to_int(sx), app->pointer_obj->width - 1)); - app->pointer_obj->input.pointer.y = LV_MAX(0, LV_MIN(wl_fixed_to_int(sy), app->pointer_obj->height - 1)); -} - -static void pointer_handle_button(void * data, struct wl_pointer * wl_pointer, - uint32_t serial, uint32_t time, uint32_t button, - uint32_t state) -{ - struct application * app = data; - - LV_UNUSED(serial); - LV_UNUSED(wl_pointer); - LV_UNUSED(time); - - const lv_indev_state_t lv_state = - (state == WL_POINTER_BUTTON_STATE_PRESSED) ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; - - if(!app->pointer_obj) { - return; - } - - -#if LV_WAYLAND_WINDOW_DECORATIONS - struct window * window; - window = app->pointer_obj->window; - int pos_x = app->pointer_obj->input.pointer.x; - int pos_y = app->pointer_obj->input.pointer.y; -#endif - - switch(app->pointer_obj->type) { - case OBJECT_WINDOW: - switch(button) { - case BTN_LEFT: - app->pointer_obj->input.pointer.left_button = lv_state; - break; - case BTN_RIGHT: - app->pointer_obj->input.pointer.right_button = lv_state; - break; - case BTN_MIDDLE: - app->pointer_obj->input.pointer.wheel_button = lv_state; - break; - default: - break; - } - - break; -#if LV_WAYLAND_WINDOW_DECORATIONS - case OBJECT_TITLEBAR: - if((button == BTN_LEFT) && (state == WL_POINTER_BUTTON_STATE_PRESSED)) { -#if LV_WAYLAND_XDG_SHELL - if(window->xdg_toplevel) { - xdg_toplevel_move(window->xdg_toplevel, app->wl_seat, serial); - window->flush_pending = true; - } -#endif -#if LV_WAYLAND_WL_SHELL - if(window->wl_shell_surface) { - wl_shell_surface_move(window->wl_shell_surface, app->wl_seat, serial); - window->flush_pending = true; - } -#endif - } - break; - case OBJECT_BUTTON_CLOSE: - if((button == BTN_LEFT) && (state == WL_POINTER_BUTTON_STATE_RELEASED)) { - window->shall_close = true; - } - break; -#if LV_WAYLAND_XDG_SHELL - case OBJECT_BUTTON_MAXIMIZE: - if((button == BTN_LEFT) && (state == WL_POINTER_BUTTON_STATE_RELEASED)) { - if(window->xdg_toplevel) { - if(window->maximized) { - xdg_toplevel_unset_maximized(window->xdg_toplevel); - } - else { - xdg_toplevel_set_maximized(window->xdg_toplevel); - } - window->maximized ^= true; - window->flush_pending = true; - } - } - break; - case OBJECT_BUTTON_MINIMIZE: - if((button == BTN_LEFT) && (state == WL_POINTER_BUTTON_STATE_RELEASED)) { - if(window->xdg_toplevel) { - xdg_toplevel_set_minimized(window->xdg_toplevel); - window->flush_pending = true; - } - } - break; - case OBJECT_BORDER_TOP: - if((button == BTN_LEFT) && (state == WL_POINTER_BUTTON_STATE_PRESSED)) { - if(window->xdg_toplevel && !window->maximized) { - uint32_t edge; - if(pos_x < (BORDER_SIZE * 5)) { - edge = XDG_TOPLEVEL_RESIZE_EDGE_TOP_LEFT; - } - else if(pos_x >= (window->width + BORDER_SIZE - (BORDER_SIZE * 5))) { - edge = XDG_TOPLEVEL_RESIZE_EDGE_TOP_RIGHT; - } - else { - edge = XDG_TOPLEVEL_RESIZE_EDGE_TOP; - } - xdg_toplevel_resize(window->xdg_toplevel, - window->application->wl_seat, serial, edge); - window->flush_pending = true; - } - } - break; - case OBJECT_BORDER_BOTTOM: - if((button == BTN_LEFT) && (state == WL_POINTER_BUTTON_STATE_PRESSED)) { - if(window->xdg_toplevel && !window->maximized) { - uint32_t edge; - if(pos_x < (BORDER_SIZE * 5)) { - edge = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT; - } - else if(pos_x >= (window->width + BORDER_SIZE - (BORDER_SIZE * 5))) { - edge = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT; - } - else { - edge = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM; - } - xdg_toplevel_resize(window->xdg_toplevel, - window->application->wl_seat, serial, edge); - window->flush_pending = true; - } - } - break; - case OBJECT_BORDER_LEFT: - if((button == BTN_LEFT) && (state == WL_POINTER_BUTTON_STATE_PRESSED)) { - if(window->xdg_toplevel && !window->maximized) { - uint32_t edge; - if(pos_y < (BORDER_SIZE * 5)) { - edge = XDG_TOPLEVEL_RESIZE_EDGE_TOP_LEFT; - } - else if(pos_y >= (window->height + BORDER_SIZE - (BORDER_SIZE * 5))) { - edge = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT; - } - else { - edge = XDG_TOPLEVEL_RESIZE_EDGE_LEFT; - } - xdg_toplevel_resize(window->xdg_toplevel, - window->application->wl_seat, serial, edge); - window->flush_pending = true; - } - } - break; - case OBJECT_BORDER_RIGHT: - if((button == BTN_LEFT) && (state == WL_POINTER_BUTTON_STATE_PRESSED)) { - if(window->xdg_toplevel && !window->maximized) { - uint32_t edge; - if(pos_y < (BORDER_SIZE * 5)) { - edge = XDG_TOPLEVEL_RESIZE_EDGE_TOP_RIGHT; - } - else if(pos_y >= (window->height + BORDER_SIZE - (BORDER_SIZE * 5))) { - edge = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT; - } - else { - edge = XDG_TOPLEVEL_RESIZE_EDGE_RIGHT; - } - xdg_toplevel_resize(window->xdg_toplevel, - window->application->wl_seat, serial, edge); - window->flush_pending = true; - } - } - break; -#endif // LV_WAYLAND_XDG_SHELL -#endif // LV_WAYLAND_WINDOW_DECORATIONS - default: - break; - } -} - -static void pointer_handle_axis(void * data, struct wl_pointer * wl_pointer, - uint32_t time, uint32_t axis, wl_fixed_t value) -{ - struct application * app = data; - const int diff = wl_fixed_to_int(value); - - LV_UNUSED(time); - LV_UNUSED(wl_pointer); - - if(!app->pointer_obj) { - return; - } - - if(axis == 0) { - if(diff > 0) { - app->pointer_obj->input.pointer.wheel_diff++; - } - else if(diff < 0) { - app->pointer_obj->input.pointer.wheel_diff--; - } - } -} - -static const struct wl_pointer_listener pointer_listener = { - .enter = pointer_handle_enter, - .leave = pointer_handle_leave, - .motion = pointer_handle_motion, - .button = pointer_handle_button, - .axis = pointer_handle_axis, -}; - -static lv_key_t keycode_xkb_to_lv(xkb_keysym_t xkb_key) -{ - lv_key_t key = 0; - - if(((xkb_key >= XKB_KEY_space) && (xkb_key <= XKB_KEY_asciitilde))) { - key = xkb_key; - } - else if(((xkb_key >= XKB_KEY_KP_0) && (xkb_key <= XKB_KEY_KP_9))) { - key = (xkb_key & 0x003f); - } - else { - switch(xkb_key) { - case XKB_KEY_BackSpace: - key = LV_KEY_BACKSPACE; - break; - case XKB_KEY_Return: - case XKB_KEY_KP_Enter: - key = LV_KEY_ENTER; - break; - case XKB_KEY_Escape: - key = LV_KEY_ESC; - break; - case XKB_KEY_Delete: - case XKB_KEY_KP_Delete: - key = LV_KEY_DEL; - break; - case XKB_KEY_Home: - case XKB_KEY_KP_Home: - key = LV_KEY_HOME; - break; - case XKB_KEY_Left: - case XKB_KEY_KP_Left: - key = LV_KEY_LEFT; - break; - case XKB_KEY_Up: - case XKB_KEY_KP_Up: - key = LV_KEY_UP; - break; - case XKB_KEY_Right: - case XKB_KEY_KP_Right: - key = LV_KEY_RIGHT; - break; - case XKB_KEY_Down: - case XKB_KEY_KP_Down: - key = LV_KEY_DOWN; - break; - case XKB_KEY_Prior: - case XKB_KEY_KP_Prior: - key = LV_KEY_PREV; - break; - case XKB_KEY_Next: - case XKB_KEY_KP_Next: - case XKB_KEY_Tab: - case XKB_KEY_KP_Tab: - key = LV_KEY_NEXT; - break; - case XKB_KEY_End: - case XKB_KEY_KP_End: - key = LV_KEY_END; - break; - default: - break; - } - } - - return key; -} - -static void keyboard_handle_keymap(void * data, struct wl_keyboard * keyboard, - uint32_t format, int fd, uint32_t size) -{ - struct application * app = data; - - struct xkb_keymap * keymap; - struct xkb_state * state; - char * map_str; - - LV_UNUSED(keyboard); - - if(format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) { - close(fd); - return; - } - - map_str = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); - if(map_str == MAP_FAILED) { - close(fd); - return; - } - - /* Set up XKB keymap */ - keymap = xkb_keymap_new_from_string(app->xkb_context, map_str, - XKB_KEYMAP_FORMAT_TEXT_V1, 0); - munmap(map_str, size); - close(fd); - - if(!keymap) { - LV_LOG_ERROR("failed to compile keymap"); - return; - } - - /* Set up XKB state */ - state = xkb_state_new(keymap); - if(!state) { - LV_LOG_ERROR("failed to create XKB state"); - xkb_keymap_unref(keymap); - return; - } - - xkb_keymap_unref(app->seat.xkb.keymap); - xkb_state_unref(app->seat.xkb.state); - app->seat.xkb.keymap = keymap; - app->seat.xkb.state = state; -} - -static void keyboard_handle_enter(void * data, struct wl_keyboard * keyboard, - uint32_t serial, struct wl_surface * surface, - struct wl_array * keys) -{ - struct application * app = data; - - LV_UNUSED(keyboard); - LV_UNUSED(serial); - LV_UNUSED(keys); - - if(!surface) { - app->keyboard_obj = NULL; - } - else { - app->keyboard_obj = wl_surface_get_user_data(surface); - } -} - -static void keyboard_handle_leave(void * data, struct wl_keyboard * keyboard, - uint32_t serial, struct wl_surface * surface) -{ - struct application * app = data; - - LV_UNUSED(serial); - LV_UNUSED(keyboard); - - if(!surface || (app->keyboard_obj == wl_surface_get_user_data(surface))) { - app->keyboard_obj = NULL; - } -} - -static void keyboard_handle_key(void * data, struct wl_keyboard * keyboard, - uint32_t serial, uint32_t time, uint32_t key, - uint32_t state) -{ - struct application * app = data; - const uint32_t code = (key + 8); - const xkb_keysym_t * syms; - xkb_keysym_t sym = XKB_KEY_NoSymbol; - - LV_UNUSED(serial); - LV_UNUSED(time); - LV_UNUSED(keyboard); - - if(!app->keyboard_obj || !app->seat.xkb.state) { - return; - } - - if(xkb_state_key_get_syms(app->seat.xkb.state, code, &syms) == 1) { - sym = syms[0]; - } - - const lv_key_t lv_key = keycode_xkb_to_lv(sym); - const lv_indev_state_t lv_state = - (state == WL_KEYBOARD_KEY_STATE_PRESSED) ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; - - if(lv_key != 0) { - app->keyboard_obj->input.keyboard.key = lv_key; - app->keyboard_obj->input.keyboard.state = lv_state; - } -} - -static void keyboard_handle_modifiers(void * data, struct wl_keyboard * keyboard, - uint32_t serial, uint32_t mods_depressed, - uint32_t mods_latched, uint32_t mods_locked, - uint32_t group) -{ - struct application * app = data; - - LV_UNUSED(serial); - LV_UNUSED(keyboard); - - /* If we're not using a keymap, then we don't handle PC-style modifiers */ - if(!app->seat.xkb.keymap) { - return; - } - - xkb_state_update_mask(app->seat.xkb.state, - mods_depressed, mods_latched, mods_locked, 0, 0, group); -} - -static const struct wl_keyboard_listener keyboard_listener = { - .keymap = keyboard_handle_keymap, - .enter = keyboard_handle_enter, - .leave = keyboard_handle_leave, - .key = keyboard_handle_key, - .modifiers = keyboard_handle_modifiers, -}; - -static void touch_handle_down(void * data, struct wl_touch * wl_touch, - uint32_t serial, uint32_t time, struct wl_surface * surface, - int32_t id, wl_fixed_t x_w, wl_fixed_t y_w) -{ - struct application * app = data; - - LV_UNUSED(id); - LV_UNUSED(time); - LV_UNUSED(serial); - LV_UNUSED(wl_touch); - - if(!surface) { - app->touch_obj = NULL; - return; - } - - app->touch_obj = wl_surface_get_user_data(surface); - - app->touch_obj->input.touch.x = wl_fixed_to_int(x_w); - app->touch_obj->input.touch.y = wl_fixed_to_int(y_w); - app->touch_obj->input.touch.state = LV_INDEV_STATE_PRESSED; - -#if LV_WAYLAND_WINDOW_DECORATIONS - struct window * window = app->touch_obj->window; - switch(app->touch_obj->type) { - case OBJECT_TITLEBAR: -#if LV_WAYLAND_XDG_SHELL - if(window->xdg_toplevel) { - xdg_toplevel_move(window->xdg_toplevel, app->wl_seat, serial); - window->flush_pending = true; - } -#endif -#if LV_WAYLAND_WL_SHELL - if(window->wl_shell_surface) { - wl_shell_surface_move(window->wl_shell_surface, app->wl_seat, serial); - window->flush_pending = true; - } -#endif - break; - default: - break; - } -#endif -} - -static void touch_handle_up(void * data, struct wl_touch * wl_touch, - uint32_t serial, uint32_t time, int32_t id) -{ - struct application * app = data; - - LV_UNUSED(serial); - LV_UNUSED(time); - LV_UNUSED(id); - LV_UNUSED(wl_touch); - - if(!app->touch_obj) { - return; - } - - app->touch_obj->input.touch.state = LV_INDEV_STATE_RELEASED; - -#if LV_WAYLAND_WINDOW_DECORATIONS - struct window * window = app->touch_obj->window; - switch(app->touch_obj->type) { - case OBJECT_BUTTON_CLOSE: - window->shall_close = true; - break; -#if LV_WAYLAND_XDG_SHELL - case OBJECT_BUTTON_MAXIMIZE: - if(window->xdg_toplevel) { - if(window->maximized) { - xdg_toplevel_unset_maximized(window->xdg_toplevel); - } - else { - xdg_toplevel_set_maximized(window->xdg_toplevel); - } - window->maximized ^= true; - } - break; - case OBJECT_BUTTON_MINIMIZE: - if(window->xdg_toplevel) { - xdg_toplevel_set_minimized(window->xdg_toplevel); - window->flush_pending = true; - } -#endif // LV_WAYLAND_XDG_SHELL - default: - break; - } -#endif // LV_WAYLAND_WINDOW_DECORATIONS - - app->touch_obj = NULL; -} - -static void touch_handle_motion(void * data, struct wl_touch * wl_touch, - uint32_t time, int32_t id, wl_fixed_t x_w, wl_fixed_t y_w) -{ - struct application * app = data; - - LV_UNUSED(time); - LV_UNUSED(id); - LV_UNUSED(wl_touch); - - if(!app->touch_obj) { - return; - } - - app->touch_obj->input.touch.x = wl_fixed_to_int(x_w); - app->touch_obj->input.touch.y = wl_fixed_to_int(y_w); -} - -static void touch_handle_frame(void * data, struct wl_touch * wl_touch) -{ - LV_UNUSED(wl_touch); - LV_UNUSED(data); - -} - -static void touch_handle_cancel(void * data, struct wl_touch * wl_touch) -{ - LV_UNUSED(wl_touch); - LV_UNUSED(data); -} - -static const struct wl_touch_listener touch_listener = { - .down = touch_handle_down, - .up = touch_handle_up, - .motion = touch_handle_motion, - .frame = touch_handle_frame, - .cancel = touch_handle_cancel, -}; - -static void seat_handle_capabilities(void * data, struct wl_seat * wl_seat, enum wl_seat_capability caps) -{ - struct application * app = data; - struct seat * seat = &app->seat; - - if((caps & WL_SEAT_CAPABILITY_POINTER) && !seat->wl_pointer) { - seat->wl_pointer = wl_seat_get_pointer(wl_seat); - wl_pointer_add_listener(seat->wl_pointer, &pointer_listener, app); - app->cursor_surface = wl_compositor_create_surface(app->compositor); - if(!app->cursor_surface) { - LV_LOG_WARN("failed to create cursor surface"); - } - } - else if(!(caps & WL_SEAT_CAPABILITY_POINTER) && seat->wl_pointer) { - wl_pointer_destroy(seat->wl_pointer); - if(app->cursor_surface) { - wl_surface_destroy(app->cursor_surface); - } - seat->wl_pointer = NULL; - } - - if((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !seat->wl_keyboard) { - seat->wl_keyboard = wl_seat_get_keyboard(wl_seat); - wl_keyboard_add_listener(seat->wl_keyboard, &keyboard_listener, app); - } - else if(!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && seat->wl_keyboard) { - wl_keyboard_destroy(seat->wl_keyboard); - seat->wl_keyboard = NULL; - } - - if((caps & WL_SEAT_CAPABILITY_TOUCH) && !seat->wl_touch) { - seat->wl_touch = wl_seat_get_touch(wl_seat); - wl_touch_add_listener(seat->wl_touch, &touch_listener, app); - } - else if(!(caps & WL_SEAT_CAPABILITY_TOUCH) && seat->wl_touch) { - wl_touch_destroy(seat->wl_touch); - seat->wl_touch = NULL; - } -} - -static const struct wl_seat_listener seat_listener = { - .capabilities = seat_handle_capabilities, -}; - -static void draw_window(struct window * window, uint32_t width, uint32_t height) -{ - -#if LV_WAYLAND_WINDOW_DECORATIONS - if(application.opt_disable_decorations == false) { - int d; - for(d = 0; d < NUM_DECORATIONS; d++) { - window->decoration[d] = create_graphic_obj(&application, window, (FIRST_DECORATION + d), window->body); - if(!window->decoration[d]) { - LV_LOG_ERROR("Failed to create decoration %d", d); - } - } - } -#endif - - /* First resize */ - if(!resize_window(window, width, height)) { - LV_LOG_ERROR("Failed to resize window"); -#if LV_WAYLAND_XDG_SHELL - if(window->xdg_toplevel) { - xdg_toplevel_destroy(window->xdg_toplevel); - } -#endif - } - - lv_refr_now(window->lv_disp); - -} - -#if LV_WAYLAND_WL_SHELL -static void wl_shell_handle_ping(void * data, struct wl_shell_surface * shell_surface, uint32_t serial) -{ - return wl_shell_surface_pong(shell_surface, serial); -} - -static void wl_shell_handle_configure(void * data, struct wl_shell_surface * shell_surface, - uint32_t edges, int32_t width, int32_t height) -{ - struct window * window = (struct window *)data; - - LV_UNUSED(edges); - - if((width <= 0) || (height <= 0)) { - return; - } - else if((width != window->width) || (height != window->height)) { - window->resize_width = width; - window->resize_height = height; - window->resize_pending = true; - } -} - -static const struct wl_shell_surface_listener shell_surface_listener = { - .ping = wl_shell_handle_ping, - .configure = wl_shell_handle_configure, -}; -#endif - -#if LV_WAYLAND_XDG_SHELL -static void xdg_surface_handle_configure(void * data, struct xdg_surface * xdg_surface, uint32_t serial) -{ - struct window * window = (struct window *)data; - - xdg_surface_ack_configure(xdg_surface, serial); - - if(window->body->surface_configured == false) { - /* This branch is executed at launch */ - if(window->resize_pending == false) { - /* Use the size passed to the create_window function */ - draw_window(window, window->width, window->height); - } - else { - - /* Handle early maximization or fullscreen, */ - /* by using the size communicated by the compositor */ - /* when the initial xdg configure event arrives */ - draw_window(window, window->resize_width, window->resize_height); - window->width = window->resize_width; - window->height = window->resize_height; - window->resize_pending = false; - } - } - window->body->surface_configured = true; -} - -static const struct xdg_surface_listener xdg_surface_listener = { - .configure = xdg_surface_handle_configure, -}; - -static void xdg_toplevel_handle_configure(void * data, struct xdg_toplevel * xdg_toplevel, - int32_t width, int32_t height, struct wl_array * states) -{ - struct window * window = (struct window *)data; - - LV_UNUSED(xdg_toplevel); - LV_UNUSED(states); - LV_UNUSED(width); - LV_UNUSED(height); - - LV_LOG_TRACE("w:%d h:%d", width, height); - LV_LOG_TRACE("current body w:%d h:%d", window->body->width, window->body->height); - LV_LOG_TRACE("window w:%d h:%d", window->width, window->height); - - - if((width <= 0) || (height <= 0)) { - LV_LOG_TRACE("will not resize to w:%d h:%d", width, height); - return; - } - - if((width != window->width) || (height != window->height)) { - window->resize_width = width; - window->resize_height = height; - window->resize_pending = true; - LV_LOG_TRACE("resize_pending is set, will resize to w:%d h:%d", width, height); - } - else { - LV_LOG_TRACE("resize_pending not set w:%d h:%d", width, height); - } -} - -static void xdg_toplevel_handle_close(void * data, struct xdg_toplevel * xdg_toplevel) -{ - struct window * window = (struct window *)data; - window->shall_close = true; - - LV_UNUSED(xdg_toplevel); -} - -static void xdg_toplevel_handle_configure_bounds(void * data, struct xdg_toplevel * xdg_toplevel, - int32_t width, int32_t height) -{ - - LV_UNUSED(width); - LV_UNUSED(height); - LV_UNUSED(data); - LV_UNUSED(xdg_toplevel); - - /* Optional: Could set window width/height upper bounds, however, currently - * we'll honor the set width/height. - */ -} - -static const struct xdg_toplevel_listener xdg_toplevel_listener = { - .configure = xdg_toplevel_handle_configure, - .close = xdg_toplevel_handle_close, - .configure_bounds = xdg_toplevel_handle_configure_bounds -}; - -static void xdg_wm_base_ping(void * data, struct xdg_wm_base * xdg_wm_base, uint32_t serial) -{ - LV_UNUSED(data); - - xdg_wm_base_pong(xdg_wm_base, serial); - - return; -} - -static const struct xdg_wm_base_listener xdg_wm_base_listener = { - .ping = xdg_wm_base_ping -}; -#endif - - -static void handle_global(void * data, struct wl_registry * registry, - uint32_t name, const char * interface, uint32_t version) -{ - struct application * app = data; - - LV_UNUSED(version); - LV_UNUSED(data); - - if(strcmp(interface, wl_compositor_interface.name) == 0) { - app->compositor = wl_registry_bind(registry, name, &wl_compositor_interface, 1); - } - else if(strcmp(interface, wl_subcompositor_interface.name) == 0) { - app->subcompositor = wl_registry_bind(registry, name, &wl_subcompositor_interface, 1); - } - else if(strcmp(interface, wl_shm_interface.name) == 0) { - app->shm = wl_registry_bind(registry, name, &wl_shm_interface, 1); - wl_shm_add_listener(app->shm, &shm_listener, app); - app->cursor_theme = wl_cursor_theme_load(NULL, 32, app->shm); - } - else if(strcmp(interface, wl_seat_interface.name) == 0) { - app->wl_seat = wl_registry_bind(app->registry, name, &wl_seat_interface, 1); - wl_seat_add_listener(app->wl_seat, &seat_listener, app); - } -#if LV_WAYLAND_WL_SHELL - else if(strcmp(interface, wl_shell_interface.name) == 0) { - app->wl_shell = wl_registry_bind(registry, name, &wl_shell_interface, 1); - } -#endif -#if LV_WAYLAND_XDG_SHELL - else if(strcmp(interface, xdg_wm_base_interface.name) == 0) { - /* Explicitly support version 4 of the xdg protocol */ - app->xdg_wm = wl_registry_bind(app->registry, name, &xdg_wm_base_interface, 4); - xdg_wm_base_add_listener(app->xdg_wm, &xdg_wm_base_listener, app); - } -#endif -} - -static void handle_global_remove(void * data, struct wl_registry * registry, uint32_t name) -{ - - LV_UNUSED(data); - LV_UNUSED(registry); - LV_UNUSED(name); - -} - -static const struct wl_registry_listener registry_listener = { - .global = handle_global, - .global_remove = handle_global_remove -}; - -static void handle_wl_buffer_release(void * data, struct wl_buffer * wl_buffer) -{ - const struct smm_buffer_properties * props; - struct graphic_object * obj; - struct window * window; - smm_buffer_t * buf; - - buf = (smm_buffer_t *)data; - props = SMM_BUFFER_PROPERTIES(buf); - obj = SMM_GROUP_PROPERTIES(props->group)->tag[TAG_LOCAL]; - window = obj->window; - - LV_LOG_TRACE("releasing buffer %p wl_buffer %p w:%d h:%d frame: %d", (smm_buffer_t *)data, (void *)wl_buffer, - obj->width, - obj->height, window->frame_counter); - smm_release((smm_buffer_t *)data); -} - -static const struct wl_buffer_listener wl_buffer_listener = { - .release = handle_wl_buffer_release, -}; - -static void cache_clear(struct window * window) -{ - window->dmg_cache.start = window->dmg_cache.end; - window->dmg_cache.size = 0; -} - -static void cache_purge(struct window * window, smm_buffer_t * buf) -{ - lv_area_t * next_dmg; - smm_buffer_t * next_buf = smm_next(buf); - - /* Remove all damage areas up until start of next buffers damage */ - if(next_buf == NULL) { - cache_clear(window); - } - else { - next_dmg = SMM_BUFFER_PROPERTIES(next_buf)->tag[TAG_BUFFER_DAMAGE]; - while((window->dmg_cache.cache + window->dmg_cache.start) != next_dmg) { - window->dmg_cache.start++; - window->dmg_cache.start %= DMG_CACHE_CAPACITY; - window->dmg_cache.size--; - } - } -} - -static void cache_add_area(struct window * window, smm_buffer_t * buf, const lv_area_t * area) -{ - if(SMM_BUFFER_PROPERTIES(buf)->tag[TAG_BUFFER_DAMAGE] == NULL) { - /* Buffer damage beyond cache capacity */ - goto done; - } - - if((window->dmg_cache.start == window->dmg_cache.end) && - (window->dmg_cache.size)) { - /* This buffer has more damage then the cache's capacity, so - * clear cache and leave buffer damage unrecorded - */ - cache_clear(window); - SMM_TAG(buf, TAG_BUFFER_DAMAGE, NULL); - goto done; - } - - /* Add damage area to cache */ - memcpy(window->dmg_cache.cache + window->dmg_cache.end, - area, - sizeof(lv_area_t)); - window->dmg_cache.end++; - window->dmg_cache.end %= DMG_CACHE_CAPACITY; - window->dmg_cache.size++; - -done: - return; -} - -static void cache_apply_areas(struct window * window, void * dest, void * src, smm_buffer_t * src_buf) -{ - unsigned long offset; - unsigned char start; - int32_t y; - lv_area_t * dmg; - lv_area_t * next_dmg; - smm_buffer_t * next_buf = smm_next(src_buf); - const struct smm_buffer_properties * props = SMM_BUFFER_PROPERTIES(src_buf); - struct graphic_object * obj = SMM_GROUP_PROPERTIES(props->group)->tag[TAG_LOCAL]; - uint8_t bpp; - - if(next_buf == NULL) { - next_dmg = (window->dmg_cache.cache + window->dmg_cache.end); - } - else { - next_dmg = SMM_BUFFER_PROPERTIES(next_buf)->tag[TAG_BUFFER_DAMAGE]; - } - - bpp = lv_color_format_get_size(LV_COLOR_FORMAT_NATIVE); - - /* Apply all buffer damage areas */ - start = ((lv_area_t *)SMM_BUFFER_PROPERTIES(src_buf)->tag[TAG_BUFFER_DAMAGE] - window->dmg_cache.cache); - while((window->dmg_cache.cache + start) != next_dmg) { - /* Copy an area from source to destination (line-by-line) */ - dmg = (window->dmg_cache.cache + start); - for(y = dmg->y1; y <= dmg->y2; y++) { - offset = (dmg->x1 + (y * obj->width)) * bpp; - - memcpy(((char *)dest) + offset, - ((char *)src) + offset, - ((dmg->x2 - dmg->x1 + 1) * bpp)); - } - - - start++; - start %= DMG_CACHE_CAPACITY; - } - -} - -static bool sme_new_pool(void * ctx, smm_pool_t * pool) -{ - struct wl_shm_pool * wl_pool; - struct application * app = ctx; - const struct smm_pool_properties * props = SMM_POOL_PROPERTIES(pool); - - LV_UNUSED(ctx); - - wl_pool = wl_shm_create_pool(app->shm, - props->fd, - props->size); - - SMM_TAG(pool, TAG_LOCAL, wl_pool); - return (wl_pool == NULL); -} - -static void sme_expand_pool(void * ctx, smm_pool_t * pool) -{ - const struct smm_pool_properties * props = SMM_POOL_PROPERTIES(pool); - - LV_UNUSED(ctx); - - wl_shm_pool_resize(props->tag[TAG_LOCAL], props->size); -} - -static void sme_free_pool(void * ctx, smm_pool_t * pool) -{ - struct wl_shm_pool * wl_pool = SMM_POOL_PROPERTIES(pool)->tag[TAG_LOCAL]; - - LV_UNUSED(ctx); - - wl_shm_pool_destroy(wl_pool); -} - -static bool sme_new_buffer(void * ctx, smm_buffer_t * buf) -{ - struct wl_buffer * wl_buf; - bool fail_alloc = true; - const struct smm_buffer_properties * props = SMM_BUFFER_PROPERTIES(buf); - struct wl_shm_pool * wl_pool = SMM_POOL_PROPERTIES(props->pool)->tag[TAG_LOCAL]; - struct application * app = ctx; - struct graphic_object * obj = SMM_GROUP_PROPERTIES(props->group)->tag[TAG_LOCAL]; - uint8_t bpp; - - LV_LOG_TRACE("create new buffer of width %d height %d", obj->width, obj->height); - - bpp = lv_color_format_get_size(LV_COLOR_FORMAT_NATIVE); - wl_buf = wl_shm_pool_create_buffer(wl_pool, - props->offset, - obj->width, - obj->height, - obj->width * bpp, - app->shm_format); - - if(wl_buf != NULL) { - wl_buffer_add_listener(wl_buf, &wl_buffer_listener, buf); - SMM_TAG(buf, TAG_LOCAL, wl_buf); - SMM_TAG(buf, TAG_BUFFER_DAMAGE, NULL); - fail_alloc = false; - } - - return fail_alloc; -} - -static bool sme_init_buffer(void * ctx, smm_buffer_t * buf) -{ - smm_buffer_t * src; - void * src_base; - bool fail_init = true; - bool dmg_missing = false; - void * buf_base = smm_map(buf); - const struct smm_buffer_properties * props = SMM_BUFFER_PROPERTIES(buf); - struct graphic_object * obj = SMM_GROUP_PROPERTIES(props->group)->tag[TAG_LOCAL]; - uint8_t bpp; - - LV_UNUSED(ctx); - - if(buf_base == NULL) { - LV_LOG_ERROR("cannot map in buffer to initialize"); - goto done; - } - - /* Determine if all subsequent buffers damage is recorded */ - for(src = smm_next(buf); src != NULL; src = smm_next(src)) { - if(SMM_BUFFER_PROPERTIES(src)->tag[TAG_BUFFER_DAMAGE] == NULL) { - dmg_missing = true; - break; - } - } - - bpp = lv_color_format_get_size(LV_COLOR_FORMAT_NATIVE); - - if((smm_next(buf) == NULL) || dmg_missing) { - /* Missing subsequent buffer damage, initialize by copying the most - * recently acquired buffers data - */ - src = smm_latest(props->group); - if((src != NULL) && - (src != buf)) { - /* Map and copy latest buffer data */ - src_base = smm_map(src); - if(src_base == NULL) { - LV_LOG_ERROR("cannot map most recent buffer to copy"); - goto done; - } - - memcpy(buf_base, - src_base, - (obj->width * bpp) * obj->height); - } - } - else { - /* All subsequent buffers damage is recorded, initialize by applying - * their damage to this buffer - */ - for(src = smm_next(buf); src != NULL; src = smm_next(src)) { - src_base = smm_map(src); - if(src_base == NULL) { - LV_LOG_ERROR("cannot map source buffer to copy from"); - goto done; - } - - cache_apply_areas(obj->window, buf_base, src_base, src); - } - - /* Purge out-of-date cached damage (up to and including next buffer) */ - src = smm_next(buf); - if(src == NULL) { - cache_purge(obj->window, src); - } - } - - fail_init = false; -done: - return fail_init; -} - -static void sme_free_buffer(void * ctx, smm_buffer_t * buf) -{ - struct wl_buffer * wl_buf = SMM_BUFFER_PROPERTIES(buf)->tag[TAG_LOCAL]; - - LV_UNUSED(ctx); - - wl_buffer_destroy(wl_buf); -} - -static struct graphic_object * create_graphic_obj(struct application * app, struct window * window, - enum object_type type, - struct graphic_object * parent) -{ - struct graphic_object * obj; - - LV_UNUSED(parent); - - obj = lv_malloc(sizeof(*obj)); - LV_ASSERT_MALLOC(obj); - if(!obj) { - goto err_out; - } - - lv_memset(obj, 0x00, sizeof(struct graphic_object)); - - obj->surface = wl_compositor_create_surface(app->compositor); - if(!obj->surface) { - LV_LOG_ERROR("cannot create surface for graphic object"); - goto err_free; - } - - obj->buffer_group = smm_create(); - if(obj->buffer_group == NULL) { - LV_LOG_ERROR("cannot create buffer group for graphic object"); - goto err_destroy_surface; - } - - obj->window = window; - obj->type = type; - obj->surface_configured = true; - obj->pending_buffer = NULL; - wl_surface_set_user_data(obj->surface, obj); - SMM_TAG(obj->buffer_group, TAG_LOCAL, obj); - - return obj; - -err_destroy_surface: - wl_surface_destroy(obj->surface); - -err_free: - lv_free(obj); - -err_out: - return NULL; -} - -static void destroy_graphic_obj(struct graphic_object * obj) -{ - if(obj->subsurface) { - wl_subsurface_destroy(obj->subsurface); - } - - wl_surface_destroy(obj->surface); - smm_destroy(obj->buffer_group); - lv_free(obj); -} - -#if LV_WAYLAND_WINDOW_DECORATIONS -static bool attach_decoration(struct window * window, struct graphic_object * decoration, - smm_buffer_t * decoration_buffer, struct graphic_object * parent) -{ - struct wl_buffer * wl_buf = SMM_BUFFER_PROPERTIES(decoration_buffer)->tag[TAG_LOCAL]; - - int pos_x, pos_y; - - switch(decoration->type) { - case OBJECT_TITLEBAR: - pos_x = 0; - pos_y = -TITLE_BAR_HEIGHT; - break; - case OBJECT_BUTTON_CLOSE: - pos_x = parent->width - 1 * (BUTTON_MARGIN + BUTTON_SIZE); - pos_y = -1 * (BUTTON_MARGIN + BUTTON_SIZE + (BORDER_SIZE / 2)); - break; -#if LV_WAYLAND_XDG_SHELL - case OBJECT_BUTTON_MAXIMIZE: - pos_x = parent->width - 2 * (BUTTON_MARGIN + BUTTON_SIZE); - pos_y = -1 * (BUTTON_MARGIN + BUTTON_SIZE + (BORDER_SIZE / 2)); - break; - case OBJECT_BUTTON_MINIMIZE: - pos_x = parent->width - 3 * (BUTTON_MARGIN + BUTTON_SIZE); - pos_y = -1 * (BUTTON_MARGIN + BUTTON_SIZE + (BORDER_SIZE / 2)); - break; -#endif - case OBJECT_BORDER_TOP: - pos_x = -BORDER_SIZE; - pos_y = -(BORDER_SIZE + TITLE_BAR_HEIGHT); - break; - case OBJECT_BORDER_BOTTOM: - pos_x = -BORDER_SIZE; - pos_y = parent->height; - break; - case OBJECT_BORDER_LEFT: - pos_x = -BORDER_SIZE; - pos_y = -TITLE_BAR_HEIGHT; - break; - case OBJECT_BORDER_RIGHT: - pos_x = parent->width; - pos_y = -TITLE_BAR_HEIGHT; - break; - default: - LV_ASSERT_MSG(0, "Invalid object type"); - return false; - } - - /* Enable this, to make it function on weston 10.0.2 */ - /* It's not elegant but it forces weston to size the surfaces before */ - /* the conversion to a subsurface takes place */ - - /* Likely related to this issue, some patches were merged into 10.0.0 */ - /* https://gitlab.freedesktop.org/wayland/weston/-/issues/446 */ - /* Moreover, it crashes on GNOME */ - -#if 0 - wl_surface_attach(decoration->surface, wl_buf, 0, 0); - wl_surface_commit(decoration->surface); -#endif - - if(decoration->subsurface == NULL) { - /* Create the subsurface only once */ - - decoration->subsurface = wl_subcompositor_get_subsurface(window->application->subcompositor, - decoration->surface, - parent->surface); - if(!decoration->subsurface) { - LV_LOG_ERROR("cannot get subsurface for decoration"); - goto err_destroy_surface; - } - } - - wl_subsurface_set_position(decoration->subsurface, pos_x, pos_y); - wl_surface_attach(decoration->surface, wl_buf, 0, 0); - wl_surface_commit(decoration->surface); - - return true; - -err_destroy_surface: - wl_surface_destroy(decoration->surface); - decoration->surface = NULL; - - return false; -} - -/* - * Fills a buffer with a color - * @description Used to draw the decorations, by writing directly to the SHM buffer, - * most wayland compositors support the ARGB8888, XRGB8888, RGB565 formats - * - * For color depths usually not natively supported by wayland i.e RGB332, Grayscale - * A conversion is performed to match the format of the SHM buffer read by the compositor. - * - * This function can also be used as a visual debugging aid to see how damage is applied - * - * @param pixels pointer to the buffer to fill - * @param lv_color_t color the color that will be used for the fill - * @param width width of the filled area - * @param height height of the filled area - * - */ -static void color_fill(void * pixels, lv_color_t color, uint32_t width, uint32_t height) -{ - - switch(application.shm_format) { - case WL_SHM_FORMAT_ARGB8888: - color_fill_XRGB8888(pixels, color, width, height); - break; - case WL_SHM_FORMAT_RGB565: - color_fill_RGB565(pixels, color, width, height); - break; - default: - LV_ASSERT_MSG(0, "Unsupported WL_SHM_FORMAT"); - break; - } -} - -static void color_fill_XRGB8888(void * pixels, lv_color_t color, uint32_t width, uint32_t height) -{ - unsigned char * buf = pixels; - unsigned char * buf_end; - - buf_end = (unsigned char *)((uint32_t *)buf + width * height); - - while(buf < buf_end) { - *(buf++) = color.blue; - *(buf++) = color.green; - *(buf++) = color.red; - *(buf++) = 0xFF; - } - -} - -static void color_fill_RGB565(void * pixels, lv_color_t color, uint32_t width, uint32_t height) -{ - uint16_t * buf = pixels; - uint16_t * buf_end; - - buf_end = (uint16_t *)buf + width * height; - - while(buf < buf_end) { - *(buf++) = lv_color_to_u16(color); - } -} - -static bool create_decoration(struct window * window, - struct graphic_object * decoration, - int window_width, int window_height) -{ - smm_buffer_t * buf; - void * buf_base; - int x, y; - lv_color_t * pixel; - uint8_t bpp; - - switch(decoration->type) { - case OBJECT_TITLEBAR: - decoration->width = window_width; - decoration->height = TITLE_BAR_HEIGHT; - break; - case OBJECT_BUTTON_CLOSE: - decoration->width = BUTTON_SIZE; - decoration->height = BUTTON_SIZE; - break; -#if LV_WAYLAND_XDG_SHELL - case OBJECT_BUTTON_MAXIMIZE: - decoration->width = BUTTON_SIZE; - decoration->height = BUTTON_SIZE; - break; - case OBJECT_BUTTON_MINIMIZE: - decoration->width = BUTTON_SIZE; - decoration->height = BUTTON_SIZE; - break; -#endif - case OBJECT_BORDER_TOP: - decoration->width = window_width + 2 * (BORDER_SIZE); - decoration->height = BORDER_SIZE; - break; - case OBJECT_BORDER_BOTTOM: - decoration->width = window_width + 2 * (BORDER_SIZE); - decoration->height = BORDER_SIZE; - break; - case OBJECT_BORDER_LEFT: - decoration->width = BORDER_SIZE; - decoration->height = window_height + TITLE_BAR_HEIGHT; - break; - case OBJECT_BORDER_RIGHT: - decoration->width = BORDER_SIZE; - decoration->height = window_height + TITLE_BAR_HEIGHT; - break; - default: - LV_ASSERT_MSG(0, "Invalid object type"); - return false; - } - - bpp = lv_color_format_get_size(LV_COLOR_FORMAT_NATIVE); - - LV_LOG_TRACE("decoration window %dx%d", decoration->width, decoration->height); - - smm_resize(decoration->buffer_group, - (decoration->width * bpp) * decoration->height); - - buf = smm_acquire(decoration->buffer_group); - - if(buf == NULL) { - LV_LOG_ERROR("cannot allocate buffer for decoration"); - return false; - } - - buf_base = smm_map(buf); - if(buf_base == NULL) { - LV_LOG_ERROR("cannot map in allocated decoration buffer"); - smm_release(buf); - return false; - } - - switch(decoration->type) { - case OBJECT_TITLEBAR: - color_fill(buf_base, lv_color_make(0x66, 0x66, 0x66), decoration->width, decoration->height); - break; - case OBJECT_BUTTON_CLOSE: - color_fill(buf_base, lv_color_make(0xCC, 0xCC, 0xCC), decoration->width, decoration->height); - for(y = 0; y < decoration->height; y++) { - for(x = 0; x < decoration->width; x++) { - pixel = (lv_color_t *)((unsigned char *)buf_base + (y * (decoration->width * bpp)) + x * bpp); - if((x >= BUTTON_PADDING) && (x < decoration->width - BUTTON_PADDING)) { - if((x == y) || (x == decoration->width - 1 - y)) { - color_fill(pixel, lv_color_make(0x33, 0x33, 0x33), 1, 1); - } - else if((x == y - 1) || (x == decoration->width - y)) { - color_fill(pixel, lv_color_make(0x66, 0x66, 0x66), 1, 1); - } - } - } - } - break; -#if LV_WAYLAND_XDG_SHELL - case OBJECT_BUTTON_MAXIMIZE: - color_fill(buf_base, lv_color_make(0xCC, 0xCC, 0xCC), decoration->width, decoration->height); - for(y = 0; y < decoration->height; y++) { - for(x = 0; x < decoration->width; x++) { - pixel = (lv_color_t *)((unsigned char *)buf_base + (y * (decoration->width * bpp)) + x * bpp); - if(((x == BUTTON_PADDING) && (y >= BUTTON_PADDING) && (y < decoration->height - BUTTON_PADDING)) || - ((x == (decoration->width - BUTTON_PADDING)) && (y >= BUTTON_PADDING) && (y <= decoration->height - BUTTON_PADDING)) || - ((y == BUTTON_PADDING) && (x >= BUTTON_PADDING) && (x < decoration->width - BUTTON_PADDING)) || - ((y == (BUTTON_PADDING + 1)) && (x >= BUTTON_PADDING) && (x < decoration->width - BUTTON_PADDING)) || - ((y == (decoration->height - BUTTON_PADDING)) && (x >= BUTTON_PADDING) && (x < decoration->width - BUTTON_PADDING))) { - color_fill(pixel, lv_color_make(0x33, 0x33, 0x33), 1, 1); - } - } - } - break; - case OBJECT_BUTTON_MINIMIZE: - color_fill(buf_base, lv_color_make(0xCC, 0xCC, 0xCC), decoration->width, decoration->height); - for(y = 0; y < decoration->height; y++) { - for(x = 0; x < decoration->width; x++) { - pixel = (lv_color_t *)((unsigned char *)buf_base + (y * (decoration->width * bpp)) + x * bpp); - if((x >= BUTTON_PADDING) && (x < decoration->width - BUTTON_PADDING) && - (y > decoration->height - (2 * BUTTON_PADDING)) && (y < decoration->height - BUTTON_PADDING)) { - color_fill(pixel, lv_color_make(0x33, 0x33, 0x33), 1, 1); - } - } - } - break; -#endif - case OBJECT_BORDER_TOP: - /* fallthrough */ - case OBJECT_BORDER_BOTTOM: - /* fallthrough */ - case OBJECT_BORDER_LEFT: - /* fallthrough */ - case OBJECT_BORDER_RIGHT: - color_fill(buf_base, lv_color_make(0x66, 0x66, 0x66), decoration->width, decoration->height); - break; - default: - LV_ASSERT_MSG(0, "Invalid object type"); - return false; - } - - return attach_decoration(window, decoration, buf, window->body); -} - -static void detach_decoration(struct window * window, - struct graphic_object * decoration) -{ - - LV_UNUSED(window); - - if(decoration->subsurface) { - wl_subsurface_destroy(decoration->subsurface); - decoration->subsurface = NULL; - } -} -#endif - -static bool resize_window(struct window * window, int width, int height) -{ - struct smm_buffer_t * body_buf1; - struct smm_buffer_t * body_buf2; - uint32_t stride; - uint8_t bpp; -#if LV_WAYLAND_WINDOW_DECORATIONS - int b; -#endif - - - window->width = width; - window->height = height; - -#if LV_WAYLAND_WINDOW_DECORATIONS - if(!window->application->opt_disable_decorations && !window->fullscreen) { - width -= (2 * BORDER_SIZE); - height -= (TITLE_BAR_HEIGHT + (2 * BORDER_SIZE)); - } -#endif - - bpp = lv_color_format_get_size(LV_COLOR_FORMAT_NATIVE); - - /* Update size for newly allocated buffers */ - smm_resize(window->body->buffer_group, ((width * bpp) * height) * 2); - - window->body->width = width; - window->body->height = height; - - /* Pre-allocate two buffers for the window body here */ - body_buf1 = smm_acquire(window->body->buffer_group); - body_buf2 = smm_acquire(window->body->buffer_group); - - if(smm_map(body_buf2) == NULL) { - LV_LOG_ERROR("Cannot pre-allocate backing buffers for window body"); - wl_surface_destroy(window->body->surface); - return false; - } - - /* Moves the buffers to the the unused list of the group */ - smm_release(body_buf1); - smm_release(body_buf2); - - -#if LV_WAYLAND_WINDOW_DECORATIONS - if(!window->application->opt_disable_decorations && !window->fullscreen) { - for(b = 0; b < NUM_DECORATIONS; b++) { - if(!create_decoration(window, window->decoration[b], - window->body->width, window->body->height)) { - LV_LOG_ERROR("failed to create decoration %d", b); - } - } - - } - else if(!window->application->opt_disable_decorations) { - /* Entering fullscreen, detach decorations to prevent xdg_wm_base error 4 */ - /* requested geometry larger than the configured fullscreen state */ - for(b = 0; b < NUM_DECORATIONS; b++) { - detach_decoration(window, window->decoration[b]); - } - - } -#endif - - LV_LOG_TRACE("resize window:%dx%d body:%dx%d frame: %d rendered: %d", - window->width, window->height, - window->body->width, window->body->height, - window->frame_counter, window->frame_done); - - width = window->body->width; - height = window->body->height; - - if(window->lv_disp != NULL) { - /* Resize draw buffer */ - stride = lv_draw_buf_width_to_stride(width, - lv_display_get_color_format(window->lv_disp)); - - window->lv_disp_draw_buf = lv_draw_buf_reshape( - window->lv_disp_draw_buf, - lv_display_get_color_format(window->lv_disp), - width, height / LVGL_DRAW_BUFFER_DIV, stride); - - lv_display_set_resolution(window->lv_disp, width, height); - - window->body->input.pointer.x = LV_MIN((int32_t)window->body->input.pointer.x, (width - 1)); - window->body->input.pointer.y = LV_MIN((int32_t)window->body->input.pointer.y, (height - 1)); - } - - return true; -} - -/* Create a window - * @description Creates the graphical context for the window body, and then create a toplevel - * wayland surface and commit it to obtain an XDG configuration event - * @param width the height of the window w/decorations - * @param height the width of the window w/decorations -*/ -static struct window * create_window(struct application * app, int width, int height, const char * title) -{ - struct window * window; - - window = lv_ll_ins_tail(&app->window_ll); - LV_ASSERT_MALLOC(window); - if(!window) { - return NULL; - } - - lv_memset(window, 0x00, sizeof(struct window)); - - window->application = app; - - // Create wayland buffer and surface - window->body = create_graphic_obj(app, window, OBJECT_WINDOW, NULL); - window->width = width; - window->height = height; - - if(!window->body) { - LV_LOG_ERROR("cannot create window body"); - goto err_free_window; - } - - // Create shell surface - if(0) { - // Needed for #if madness below - } -#if LV_WAYLAND_XDG_SHELL - else if(app->xdg_wm) { - window->xdg_surface = xdg_wm_base_get_xdg_surface(app->xdg_wm, window->body->surface); - if(!window->xdg_surface) { - LV_LOG_ERROR("cannot create XDG surface"); - goto err_destroy_surface; - } - - xdg_surface_add_listener(window->xdg_surface, &xdg_surface_listener, window); - - window->xdg_toplevel = xdg_surface_get_toplevel(window->xdg_surface); - if(!window->xdg_toplevel) { - LV_LOG_ERROR("cannot get XDG toplevel surface"); - goto err_destroy_shell_surface; - } - - xdg_toplevel_add_listener(window->xdg_toplevel, &xdg_toplevel_listener, window); - xdg_toplevel_set_title(window->xdg_toplevel, title); - xdg_toplevel_set_app_id(window->xdg_toplevel, title); - - // XDG surfaces need to be configured before a buffer can be attached. - // An (XDG) surface commit (without an attached buffer) triggers this - // configure event - window->body->surface_configured = false; - } -#endif -#if LV_WAYLAND_WL_SHELL - else if(app->wl_shell) { - window->wl_shell_surface = wl_shell_get_shell_surface(app->wl_shell, window->body->surface); - if(!window->wl_shell_surface) { - LV_LOG_ERROR("cannot create WL shell surface"); - goto err_destroy_surface; - } - - wl_shell_surface_add_listener(window->wl_shell_surface, &shell_surface_listener, window); - wl_shell_surface_set_toplevel(window->wl_shell_surface); - wl_shell_surface_set_title(window->wl_shell_surface, title); - - /* For wl_shell, just draw the window, weston doesn't send it */ - draw_window(window, window->width, window->height); - } -#endif - else { - LV_LOG_ERROR("No shell available"); - goto err_destroy_surface; - } - - - return window; - -err_destroy_shell_surface: -#if LV_WAYLAND_WL_SHELL - if(window->wl_shell_surface) { - wl_shell_surface_destroy(window->wl_shell_surface); - } -#endif -#if LV_WAYLAND_XDG_SHELL - if(window->xdg_surface) { - xdg_surface_destroy(window->xdg_surface); - } -#endif - -err_destroy_surface: - wl_surface_destroy(window->body->surface); - -err_free_window: - lv_ll_remove(&app->window_ll, window); - lv_free(window); - return NULL; -} - -static void destroy_window(struct window * window) -{ - if(!window) { - return; - } - -#if LV_WAYLAND_WL_SHELL - if(window->wl_shell_surface) { - wl_shell_surface_destroy(window->wl_shell_surface); - } -#endif -#if LV_WAYLAND_XDG_SHELL - if(window->xdg_toplevel) { - xdg_toplevel_destroy(window->xdg_toplevel); - xdg_surface_destroy(window->xdg_surface); - } -#endif - -#if LV_WAYLAND_WINDOW_DECORATIONS - int b; - for(b = 0; b < NUM_DECORATIONS; b++) { - if(window->decoration[b]) { - destroy_graphic_obj(window->decoration[b]); - window->decoration[b] = NULL; - } - } -#endif - - destroy_graphic_obj(window->body); -} - -static void _lv_wayland_flush(lv_display_t * disp, const lv_area_t * area, unsigned char * color_p) -{ - unsigned long offset; - void * buf_base; - struct wl_buffer * wl_buf; - uint32_t src_width; - uint32_t src_height; - struct window * window; - smm_buffer_t * buf; - struct wl_callback * cb; - lv_display_rotation_t rot; - uint8_t bpp; - int32_t y; - int32_t w; - int32_t h; - int32_t hres; - int32_t vres; - - window = lv_display_get_user_data(disp); - buf = window->body->pending_buffer; - src_width = (area->x2 - area->x1 + 1); - src_height = (area->y2 - area->y1 + 1); - bpp = lv_color_format_get_size(LV_COLOR_FORMAT_NATIVE); - - rot = lv_display_get_rotation(disp); - w = lv_display_get_horizontal_resolution(disp); - h = lv_display_get_vertical_resolution(disp); - - /* TODO actually test what happens if the rotation is 90 or 270 or 180 ? */ - hres = (rot == LV_DISPLAY_ROTATION_0) ? w : h; - vres = (rot == LV_DISPLAY_ROTATION_0) ? h : w; - - /* If window has been / is being closed, or is not visible, skip flush */ - if(window->closed || window->shall_close) { - goto skip; - } - /* Skip if the area is out the screen */ - else if((area->x2 < 0) || (area->y2 < 0) || (area->x1 > hres - 1) || (area->y1 > vres - 1)) { - goto skip; - } - - /* Acquire and map a buffer to attach/commit to surface */ - if(buf == NULL) { - buf = smm_acquire(window->body->buffer_group); - if(buf == NULL) { - LV_LOG_ERROR("cannot acquire a window body buffer"); - goto skip; - } - - window->body->pending_buffer = buf; - SMM_TAG(buf, - TAG_BUFFER_DAMAGE, - window->dmg_cache.cache + window->dmg_cache.end); - } - - buf_base = smm_map(buf); - if(buf_base == NULL) { - LV_LOG_ERROR("cannot map in window body buffer"); - goto skip; - } - - /* Modify specified area in buffer */ - for(y = area->y1; y <= area->y2; y++) { - offset = ((area->x1 + (y * hres)) * bpp); - memcpy(((char *)buf_base) + offset, - color_p, - src_width * bpp); - color_p += src_width * bpp; - } - - /* Mark surface damage */ - wl_surface_damage(window->body->surface, - area->x1, - area->y1, - src_width, - src_height); - - cache_add_area(window, buf, area); - - - if(lv_display_flush_is_last(disp)) { - /* Finally, attach buffer and commit to surface */ - wl_buf = SMM_BUFFER_PROPERTIES(buf)->tag[TAG_LOCAL]; - wl_surface_attach(window->body->surface, wl_buf, 0, 0); - wl_surface_commit(window->body->surface); - window->body->pending_buffer = NULL; - window->frame_done = false; - - cb = wl_surface_frame(window->body->surface); - wl_callback_add_listener(cb, &wl_surface_frame_listener, window->body); - LV_LOG_TRACE("last flush frame: %d", window->frame_counter); - - window->flush_pending = true; - } - - lv_display_flush_ready(disp); - return; -skip: - if(buf != NULL) { - /* Cleanup any intermediate state (in the event that this flush being - * skipped is in the middle of a flush sequence) - */ - cache_clear(window); - SMM_TAG(buf, TAG_BUFFER_DAMAGE, NULL); - smm_release(buf); - window->body->pending_buffer = NULL; - } -} - -static void _lv_wayland_handle_input(void) -{ - int prepare_read = wl_display_prepare_read(application.display); - while(prepare_read != 0) { - wl_display_dispatch_pending(application.display); - } - - wl_display_read_events(application.display); - wl_display_dispatch_pending(application.display); -} - -static void _lv_wayland_handle_output(void) -{ - struct window * window; - bool shall_flush = application.cursor_flush_pending; - - LV_LL_READ(&application.window_ll, window) { - if((window->shall_close) && (window->close_cb != NULL)) { - window->shall_close = window->close_cb(window->lv_disp); - } - - if(window->closed) { - continue; - } - else if(window->shall_close) { - window->closed = true; - window->shall_close = false; - shall_flush = true; - - window->body->input.touch.x = 0; - window->body->input.touch.y = 0; - window->body->input.touch.state = LV_INDEV_STATE_RELEASED; - if(window->application->touch_obj == window->body) { - window->application->touch_obj = NULL; - } - - window->body->input.pointer.x = 0; - window->body->input.pointer.y = 0; - window->body->input.pointer.left_button = LV_INDEV_STATE_RELEASED; - window->body->input.pointer.right_button = LV_INDEV_STATE_RELEASED; - window->body->input.pointer.wheel_button = LV_INDEV_STATE_RELEASED; - window->body->input.pointer.wheel_diff = 0; - if(window->application->pointer_obj == window->body) { - window->application->pointer_obj = NULL; - } - - window->body->input.keyboard.key = 0; - window->body->input.keyboard.state = LV_INDEV_STATE_RELEASED; - if(window->application->keyboard_obj == window->body) { - window->application->keyboard_obj = NULL; - } - destroy_window(window); - } - - shall_flush |= window->flush_pending; - } - - if(shall_flush) { - if(wl_display_flush(application.display) == -1) { - if(errno != EAGAIN) { - LV_LOG_ERROR("failed to flush wayland display"); - } - } - else { - /* All data flushed */ - application.cursor_flush_pending = false; - LV_LL_READ(&application.window_ll, window) { - window->flush_pending = false; - } - } - } -} - -static void _lv_wayland_pointer_read(lv_indev_t * drv, lv_indev_data_t * data) -{ - struct window * window = lv_display_get_user_data(lv_indev_get_display(drv)); - - if(!window || window->closed) { - return; - } - - data->point.x = window->body->input.pointer.x; - data->point.y = window->body->input.pointer.y; - data->state = window->body->input.pointer.left_button; -} - -static void _lv_wayland_pointeraxis_read(lv_indev_t * drv, lv_indev_data_t * data) -{ - struct window * window = lv_display_get_user_data(lv_indev_get_display(drv)); - - if(!window || window->closed) { - return; - } - - data->state = window->body->input.pointer.wheel_button; - data->enc_diff = window->body->input.pointer.wheel_diff; - - window->body->input.pointer.wheel_diff = 0; -} - -static void _lv_wayland_keyboard_read(lv_indev_t * drv, lv_indev_data_t * data) -{ - struct window * window = lv_display_get_user_data(lv_indev_get_display(drv)); - if(!window || window->closed) { - return; - } - - data->key = window->body->input.keyboard.key; - data->state = window->body->input.keyboard.state; -} - -static void _lv_wayland_touch_read(lv_indev_t * drv, lv_indev_data_t * data) -{ - struct window * window = lv_display_get_user_data(lv_indev_get_display(drv)); - if(!window || window->closed) { - return; - } - - data->point.x = window->body->input.touch.x; - data->point.y = window->body->input.touch.y; - data->state = window->body->input.touch.state; -} - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize Wayland driver - */ -static void wayland_init(void) -{ - struct smm_events evs = { - NULL, - sme_new_pool, - sme_expand_pool, - sme_free_pool, - sme_new_buffer, - sme_init_buffer, - sme_free_buffer - }; - - application.xdg_runtime_dir = getenv("XDG_RUNTIME_DIR"); - LV_ASSERT_MSG(application.xdg_runtime_dir, "cannot get XDG_RUNTIME_DIR"); - - // Create XKB context - application.xkb_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); - LV_ASSERT_MSG(application.xkb_context, "failed to create XKB context"); - if(application.xkb_context == NULL) { - return; - } - - // Connect to Wayland display - application.display = wl_display_connect(NULL); - LV_ASSERT_MSG(application.display, "failed to connect to Wayland server"); - if(application.display == NULL) { - return; - } - - /* Add registry listener and wait for registry reception */ - application.shm_format = SHM_FORMAT_UNKNOWN; - application.registry = wl_display_get_registry(application.display); - wl_registry_add_listener(application.registry, ®istry_listener, &application); - wl_display_dispatch(application.display); - wl_display_roundtrip(application.display); - - LV_ASSERT_MSG(application.compositor, "Wayland compositor not available"); - if(application.compositor == NULL) { - return; - } - - LV_ASSERT_MSG(application.shm, "Wayland SHM not available"); - if(application.shm == NULL) { - return; - } - - LV_ASSERT_MSG((application.shm_format != SHM_FORMAT_UNKNOWN), "WL_SHM_FORMAT not available"); - if(application.shm_format == SHM_FORMAT_UNKNOWN) { - LV_LOG_TRACE("Unable to match a suitable SHM format for selected LVGL color depth"); - return; - } - - smm_init(&evs); - smm_setctx(&application); - -#ifdef LV_WAYLAND_WINDOW_DECORATIONS - const char * env_disable_decorations = getenv("LV_WAYLAND_DISABLE_WINDOWDECORATION"); - application.opt_disable_decorations = ((env_disable_decorations != NULL) && - (env_disable_decorations[0] != '0')); -#endif - - lv_ll_init(&application.window_ll, sizeof(struct window)); - - lv_tick_set_cb(tick_get_cb); - - /* Used to wait for events when the window is minimized or hidden */ - application.wayland_pfd.fd = wl_display_get_fd(application.display); - application.wayland_pfd.events = POLLIN; - -} - -/** - * De-initialize Wayland driver - */ -static void wayland_deinit(void) -{ - struct window * window = NULL; - - LV_LL_READ(&application.window_ll, window) { - if(!window->closed) { - destroy_window(window); - } - } - - smm_deinit(); - - if(application.shm) { - wl_shm_destroy(application.shm); - } - -#if LV_WAYLAND_XDG_SHELL - if(application.xdg_wm) { - xdg_wm_base_destroy(application.xdg_wm); - } -#endif - -#if LV_WAYLAND_WL_SHELL - if(application.wl_shell) { - wl_shell_destroy(application.wl_shell); - } -#endif - - if(application.wl_seat) { - wl_seat_destroy(application.wl_seat); - } - - if(application.subcompositor) { - wl_subcompositor_destroy(application.subcompositor); - } - - if(application.compositor) { - wl_compositor_destroy(application.compositor); - } - - wl_registry_destroy(application.registry); - wl_display_flush(application.display); - wl_display_disconnect(application.display); - - lv_ll_clear(&application.window_ll); - -} - -static uint32_t tick_get_cb(void) -{ - struct timespec t; - clock_gettime(CLOCK_MONOTONIC, &t); - uint64_t time_ms = t.tv_sec * 1000 + (t.tv_nsec / 1000000); - return time_ms; -} - -/** - * Get Wayland display file descriptor - * @return Wayland display file descriptor - */ -int lv_wayland_get_fd(void) -{ - return wl_display_get_fd(application.display); -} - -/** - * Create wayland window - * @param hor_res initial horizontal window body size in pixels - * @param ver_res initial vertical window body size in pixels - * @param title window title - * @param close_cb function to be called when the window gets closed by the user (optional) - * @return new display backed by a Wayland window, or NULL on error - */ -lv_display_t * lv_wayland_window_create(uint32_t hor_res, uint32_t ver_res, char * title, - lv_wayland_display_close_f_t close_cb) -{ - struct window * window; - int32_t window_width; - int32_t window_height; - int32_t stride; - - wayland_init(); - - window_width = hor_res; - window_height = ver_res; - -#if LV_WAYLAND_WINDOW_DECORATIONS - - /* Decorations are enabled, caculate the body size */ - if(!application.opt_disable_decorations) { - window_width = hor_res + (2 * BORDER_SIZE); - window_height = ver_res + (TITLE_BAR_HEIGHT + (2 * BORDER_SIZE)); - } - -#endif - - window = create_window(&application, window_width, window_height, title); - if(!window) { - LV_LOG_ERROR("failed to create wayland window"); - return NULL; - } - - window->close_cb = close_cb; - - /* Initialize display driver */ - window->lv_disp = lv_display_create(hor_res, ver_res); - if(window->lv_disp == NULL) { - LV_LOG_ERROR("failed to create lvgl display"); - return NULL; - } - - stride = lv_draw_buf_width_to_stride(hor_res, - lv_display_get_color_format(window->lv_disp)); - - window->lv_disp_draw_buf = lv_draw_buf_create( - hor_res, - ver_res / LVGL_DRAW_BUFFER_DIV, - lv_display_get_color_format(window->lv_disp), - stride); - - - lv_display_set_draw_buffers(window->lv_disp, window->lv_disp_draw_buf, NULL); - lv_display_set_render_mode(window->lv_disp, LV_DISPLAY_RENDER_MODE_PARTIAL); - lv_display_set_flush_cb(window->lv_disp, _lv_wayland_flush); - lv_display_set_user_data(window->lv_disp, window); - - /* Register input */ - window->lv_indev_pointer = lv_indev_create(); - lv_indev_set_type(window->lv_indev_pointer, LV_INDEV_TYPE_POINTER); - lv_indev_set_read_cb(window->lv_indev_pointer, _lv_wayland_pointer_read); - lv_indev_set_display(window->lv_indev_pointer, window->lv_disp); - - if(!window->lv_indev_pointer) { - LV_LOG_ERROR("failed to register pointer indev"); - } - - window->lv_indev_pointeraxis = lv_indev_create(); - lv_indev_set_type(window->lv_indev_pointeraxis, LV_INDEV_TYPE_ENCODER); - lv_indev_set_read_cb(window->lv_indev_pointeraxis, _lv_wayland_pointeraxis_read); - lv_indev_set_display(window->lv_indev_pointeraxis, window->lv_disp); - - if(!window->lv_indev_pointeraxis) { - LV_LOG_ERROR("failed to register pointeraxis indev"); - } - - window->lv_indev_touch = lv_indev_create(); - lv_indev_set_type(window->lv_indev_touch, LV_INDEV_TYPE_POINTER); - lv_indev_set_read_cb(window->lv_indev_touch, _lv_wayland_touch_read); - lv_indev_set_display(window->lv_indev_touch, window->lv_disp); - - if(!window->lv_indev_touch) { - LV_LOG_ERROR("failed to register touch indev"); - } - - window->lv_indev_keyboard = lv_indev_create(); - lv_indev_set_type(window->lv_indev_keyboard, LV_INDEV_TYPE_KEYPAD); - lv_indev_set_read_cb(window->lv_indev_keyboard, _lv_wayland_keyboard_read); - lv_indev_set_display(window->lv_indev_keyboard, window->lv_disp); - - if(!window->lv_indev_keyboard) { - LV_LOG_ERROR("failed to register keyboard indev"); - } - - return window->lv_disp; -} - -/** - * Close wayland window - * @param disp LVGL display using window to be closed - */ -void lv_wayland_window_close(lv_display_t * disp) -{ - struct window * window = lv_display_get_user_data(disp); - if(!window || window->closed) { - return; - } - window->shall_close = true; - window->close_cb = NULL; - wayland_deinit(); -} - -/** - * Check if a Wayland window is open on the specified display. Otherwise (if - * argument is NULL), check if any Wayland window is open. - * @return true if window open, false otherwise - */ -bool lv_wayland_window_is_open(lv_display_t * disp) -{ - struct window * window; - bool open = false; - - if(disp == NULL) { - LV_LL_READ(&application.window_ll, window) { - if(!window->closed) { - open = true; - break; - } - } - } - else { - window = lv_display_get_user_data(disp); - open = (!window->closed); - } - - return open; -} -/** - * Set/unset window maximization mode - * @description Maximization is nearly the same as fullscreen, except - * window decorations and the compositor's panels must remain visible - * @param disp LVGL display using window to be set/unset maximization - * @param Maximization requested status (true = maximized) - */ -void lv_wayland_window_set_maximized(lv_display_t * disp, bool maximized) -{ - struct window * window = lv_display_get_user_data(disp); - if(!window || window->closed) { - return; - } - - if(window->maximized != maximized) { - -#if LV_WAYLAND_WL_SHELL - if(window->wl_shell_surface) { - if(maximized) { - /* Maximizing the wl_shell is possible, but requires binding to wl_output */ - /* The wl_shell has been deperacted */ - //wl_shell_surface_set_maximized(window->wl_shell_surface); - } - else { - wl_shell_surface_set_toplevel(window->wl_shell_surface); - } - window->maximized = maximized; - window->flush_pending = true; - } -#endif - -#if LV_WAYLAND_XDG_SHELL - if(window->xdg_toplevel) { - if(maximized) { - xdg_toplevel_set_maximized(window->xdg_toplevel); - } - else { - xdg_toplevel_unset_maximized(window->xdg_toplevel); - } - - window->maximized = maximized; - window->flush_pending = true; - } -#endif - } -} - -/** - * Set/unset window fullscreen mode - * @param disp LVGL display using window to be set/unset fullscreen - * @param fullscreen requested status (true = fullscreen) - */ -void lv_wayland_window_set_fullscreen(lv_display_t * disp, bool fullscreen) -{ - struct window * window = lv_display_get_user_data(disp); - if(!window || window->closed) { - return; - } - - if(window->fullscreen != fullscreen) { - if(0) { - // Needed for #if madness below - } -#if LV_WAYLAND_XDG_SHELL - else if(window->xdg_toplevel) { - if(fullscreen) { - xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL); - } - else { - xdg_toplevel_unset_fullscreen(window->xdg_toplevel); - } - window->fullscreen = fullscreen; - window->flush_pending = true; - } -#endif -#if LV_WAYLAND_WL_SHELL - else if(window->wl_shell_surface) { - if(fullscreen) { - wl_shell_surface_set_fullscreen(window->wl_shell_surface, - WL_SHELL_SURFACE_FULLSCREEN_METHOD_SCALE, - 0, NULL); - } - else { - wl_shell_surface_set_toplevel(window->wl_shell_surface); - } - window->fullscreen = fullscreen; - window->flush_pending = true; - } -#endif - else { - LV_LOG_WARN("Wayland fullscreen mode not supported"); - } - } -} - -/** - * Get pointer input device for given LVGL display - * @param disp LVGL display - * @return input device connected to pointer events, or NULL on error - */ -lv_indev_t * lv_wayland_get_pointer(lv_display_t * disp) -{ - struct window * window = lv_display_get_user_data(disp); - if(!window) { - return NULL; - } - return window->lv_indev_pointer; -} - -/** - * Get pointer axis input device for given LVGL display - * @param disp LVGL display - * @return input device connected to pointer axis events, or NULL on error - */ -lv_indev_t * lv_wayland_get_pointeraxis(lv_display_t * disp) -{ - struct window * window = lv_display_get_user_data(disp); - if(!window) { - return NULL; - } - return window->lv_indev_pointeraxis; -} - -/** - * Get keyboard input device for given LVGL display - * @param disp LVGL display - * @return input device connected to keyboard, or NULL on error - */ -lv_indev_t * lv_wayland_get_keyboard(lv_display_t * disp) -{ - struct window * window = lv_display_get_user_data(disp); - if(!window) { - return NULL; - } - return window->lv_indev_keyboard; -} - -/** - * Get touchscreen input device for given LVGL display - * @param disp LVGL display - * @return input device connected to touchscreen, or NULL on error - */ -lv_indev_t * lv_wayland_get_touchscreen(lv_display_t * disp) -{ - struct window * window = lv_display_get_user_data(disp); - if(!window) { - return NULL; - } - return window->lv_indev_touch; -} - -/** - * Wayland specific timer handler (use in place of LVGL lv_timer_handler) - */ -bool lv_wayland_timer_handler(void) -{ - struct window * window; - - /* Wayland input handling - it will also trigger the frame done handler */ - _lv_wayland_handle_input(); - - /* Ready input timers (to probe for any input received) */ - LV_LL_READ(&application.window_ll, window) { - LV_LOG_TRACE("handle timer frame: %d", window->frame_counter); - - if(window != NULL && window->frame_done == false - && window->frame_counter > 0) { - /* The last frame was not rendered */ - LV_LOG_TRACE("The window is hidden or minimized"); - - /* Simply blocks until a frame done message arrives */ - poll(&application.wayland_pfd, 1, -1); - - /* Resume lvgl on the next cycle */ - return false; - - } - else if(window != NULL && window->body->surface_configured == false) { - /* Initial commit to trigger the configure event */ - /* Manually dispatching the queue is necessary, */ - /* to emit the configure event straight away */ - wl_surface_commit(window->body->surface); - wl_display_dispatch(application.display); - } - else if(window != NULL && window->resize_pending) { - if(resize_window(window, window->resize_width, window->resize_height)) { - window->resize_width = window->width; - window->resize_height = window->height; - window->resize_pending = false; - - } - else { - - LV_LOG_TRACE("Failed to resize window frame: %d", - window->frame_counter); - } - } - else if(window->shall_close == true) { - - /* Destroy graphical context and execute close_cb */ - _lv_wayland_handle_output(); - wayland_deinit(); - return false; - } - } - - /* LVGL handling */ - lv_timer_handler(); - - /* Wayland output handling */ - _lv_wayland_handle_output(); - - /* Set 'errno' if a Wayland flush is outstanding (i.e. data still needs to - * be sent to the compositor, but the compositor pipe/connection is unable - * to take more data at this time). - */ - LV_LL_READ(&application.window_ll, window) { - if(window->flush_pending) { - errno = EAGAIN; - break; - } - } - - return true; -} - -#endif /* LV_USE_WAYLAND */ -#endif /* _WIN32 */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/wayland/lv_wayland.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/wayland/lv_wayland.h deleted file mode 100644 index f3d340b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/wayland/lv_wayland.h +++ /dev/null @@ -1,142 +0,0 @@ -/******************************************************************* - * - * @file lv_wayland.h - Public functions of the LVGL Wayland client - * - * Based on the original file from the repository. - * - * Porting to LVGL 9.1 - * 2024 EDGEMTech Ltd. - * - * See LICENCE.txt for details - * - * Author(s): EDGEMTech Ltd, Erik Tagirov (erik.tagirov@edgemtech.ch) - * - ******************************************************************/ -#ifndef LV_WAYLAND_H -#define LV_WAYLAND_H - -#ifndef _WIN32 - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../display/lv_display.h" -#include "../../indev/lv_indev.h" - -#if LV_USE_WAYLAND - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef bool (*lv_wayland_display_close_f_t)(lv_display_t * disp); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Retrieves the file descriptor of the wayland socket - */ -int lv_wayland_get_fd(void); - -/** - * Creates a window - * @param hor_res The width of the window in pixels - * @param ver_res The height of the window in pixels - * @param title The title of the window - * @param close_cb The callback that will be execute when the user closes the window - * @return The LVGL display associated to the window - */ -lv_display_t * lv_wayland_window_create(uint32_t hor_res, uint32_t ver_res, char * title, - lv_wayland_display_close_f_t close_cb); - -/** - * Closes the window programmatically - * @param disp Reference to the LVGL display associated to the window - */ -void lv_wayland_window_close(lv_display_t * disp); - -/** - * Check if the window is open - * @param disp Reference to the LVGL display associated to the window - * @return true: The window is open - */ -bool lv_wayland_window_is_open(lv_display_t * disp); - -/** - * Sets the fullscreen state of the window - * @param disp Reference to the LVGL display associated to the window - * @param fullscreen If true the window enters fullscreen - */ -void lv_wayland_window_set_fullscreen(lv_display_t * disp, bool fullscreen); - -/** - * Sets the maximized state of the window - * @param disp Reference to the LVGL display associated to the window - * @param fullscreen If true the window is maximized - */ -void lv_wayland_window_set_maximized(lv_display_t * disp, bool maximize); - -/** - * Obtains the input device of the mouse pointer - * @note It is used to create an input group on application start - * @param disp Reference to the LVGL display associated to the window - * @return The input device - */ -lv_indev_t * lv_wayland_get_pointer(lv_display_t * disp); - -/** - * Obtains the input device of the encoder - * @note It is used to create an input group on application start - * @param disp Reference to the LVGL display associated to the window - * @return The input device - */ -lv_indev_t * lv_wayland_get_pointeraxis(lv_display_t * disp); - -/** - * Obtains the input device of the keyboard - * @note It is used to create an input group on application start - * @param disp Reference to the LVGL display associated to the window - * @return The input device - */ -lv_indev_t * lv_wayland_get_keyboard(lv_display_t * disp); - -/** - * Obtains the input device of the touch screen - * @note It is used to create an input group on application start - * @param disp Reference to the LVGL display associated to the window - * @return The input device - */ -lv_indev_t * lv_wayland_get_touchscreen(lv_display_t * disp); - -/** - * Wrapper around lv_timer_handler - * @note Must be called in the application run loop instead of the - * regular lv_timer_handler provided by LVGL - * @return true: if the cycle was completed, false if the application - * went to sleep because the last frame wasn't completed - */ -bool lv_wayland_timer_handler(void); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_WAYLAND */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* _WIN32 */ -#endif /* WAYLAND_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/wayland/lv_wayland_smm.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/wayland/lv_wayland_smm.c deleted file mode 100644 index 7cb982a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/wayland/lv_wayland_smm.c +++ /dev/null @@ -1,675 +0,0 @@ -/** - * @file lv_wayland_smm.c - * - */ - -typedef int dummy_t; /* Make GCC on windows happy, avoid empty translation unit */ - -#ifndef _WIN32 - -#include "lv_wayland_smm.h" -#include "../../display/lv_display.h" - -#if LV_USE_WAYLAND - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_NAME_ATTEMPTS (5) -#define PREFER_NUM_BUFFERS (3) - -#define ROUND_UP(n, b) (((((n) ? (n) : 1) + (b) - 1) / (b)) * (b)) -#define LLHEAD(type) \ - struct { \ - struct type *first; \ - struct type *last; \ - } - -#define LLLINK(type) \ - struct { \ - struct type *next; \ - struct type *prev; \ - } - -#define LL_FIRST(head) ((head)->first) -#define LL_LAST(head) ((head)->last) -#define LL_IS_EMPTY(head) (LL_FIRST(head) == NULL) -#define LL_NEXT(src, member) ((src)->member.next) -#define LL_PREV(src, member) ((src)->member.prev) - -#define LL_INIT(head) do { \ - (head)->first = NULL; \ - (head)->last = NULL; \ - } while (0) - -#define LL_ENQUEUE(head, src, member) do { \ - (src)->member.next = NULL; \ - (src)->member.prev = (head)->last; \ - if ((head)->last == NULL) { \ - (head)->first = (src); \ - } else { \ - (head)->last->member.next = (src); \ - } \ - (head)->last = (src); \ - } while (0) - -#define LL_DEQUEUE(entry, head, member) do { \ - (entry) = LL_FIRST(head); \ - LL_REMOVE(head, entry, member); \ - } while (0) - -#define LL_INSERT_AFTER(head, dest, src, member) do { \ - (src)->member.prev = (dest); \ - (src)->member.next = (dest)->member.next; \ - if ((dest)->member.next != NULL) { \ - (dest)->member.next->member.prev = (src); \ - } else { \ - (head)->last = (src); \ - } \ - (dest)->member.next = (src); \ - } while (0) - -#define LL_REMOVE(head, src, member) do { \ - if ((src)->member.prev != NULL) { \ - (src)->member.prev->member.next = (src)->member.next; \ - } else { \ - (head)->first = (src)->member.next; \ - } \ - if ((src)->member.next != NULL) { \ - (src)->member.next->member.prev = (src)->member.prev; \ - } else { \ - (head)->last = (src)->member.prev; \ - } \ - } while (0) - -#define LL_FOREACH(entry, head, member) \ - for ((entry) = LL_FIRST(head); \ - (entry) != NULL; \ - (entry) = LL_NEXT(entry, member)) - -#define WAYLAND_FD_NAME "/" SMM_FD_NAME "-XXXXX" - -struct smm_pool { - struct smm_pool_properties props; - LLHEAD(smm_buffer) allocd; - void * map; - size_t map_size; - bool map_outdated; -}; - -struct smm_buffer { - struct smm_buffer_properties props; - bool group_resized; - LLLINK(smm_buffer) pool; - LLLINK(smm_buffer) use; - LLLINK(smm_buffer) age; -}; - -struct smm_group { - struct smm_group_properties props; - size_t size; - unsigned char num_buffers; - LLHEAD(smm_buffer) unused; - LLHEAD(smm_buffer) inuse; - LLHEAD(smm_buffer) history; - LLLINK(smm_group) link; -}; - -static size_t calc_buffer_size(struct smm_buffer * buf); -static void purge_history(struct smm_buffer * buf); -static struct smm_buffer * get_from_pool(struct smm_group * grp); -static void return_to_pool(struct smm_buffer * buf); -static struct smm_pool * alloc_pool(void); -static void free_pool(struct smm_pool * pool); -static struct smm_buffer * alloc_buffer(struct smm_buffer * last, size_t offset); -static void free_buffer(struct smm_buffer * buf); - -static struct { - unsigned long page_sz; - struct smm_events cbs; - struct smm_pool * active; - LLHEAD(smm_group) groups; - struct { - size_t active_used; - } statistics; -} smm_instance; - - -void smm_init(struct smm_events * evs) -{ - memcpy(&smm_instance.cbs, evs, sizeof(struct smm_events)); - srand((unsigned int)clock()); - smm_instance.page_sz = (unsigned long)sysconf(_SC_PAGESIZE); - LL_INIT(&smm_instance.groups); -} - - -void smm_deinit(void) -{ - struct smm_group * grp; - - /* Destroy all buffer groups */ - while(!LL_IS_EMPTY(&smm_instance.groups)) { - LL_DEQUEUE(grp, &smm_instance.groups, link); - smm_destroy(grp); - } -} - - -void smm_setctx(void * ctx) -{ - smm_instance.cbs.ctx = ctx; -} - - -smm_group_t * smm_create(void) -{ - struct smm_group * grp; - - /* Allocate and intialize a new buffer group */ - grp = malloc(sizeof(struct smm_group)); - if(grp != NULL) { - grp->size = smm_instance.page_sz; - grp->num_buffers = 0; - LL_INIT(&grp->unused); - LL_INIT(&grp->inuse); - LL_INIT(&grp->history); - - /* Add to instance groups queue */ - LL_ENQUEUE(&smm_instance.groups, grp, link); - } - - return grp; -} - - -void smm_resize(smm_group_t * grp, size_t sz) -{ - struct smm_buffer * buf; - struct smm_group * rgrp = grp; - - /* Round allocation size up to a sysconf(_SC_PAGE_SIZE) boundary */ - rgrp->size = ROUND_UP(sz, smm_instance.page_sz); - - /* Return all unused buffers to pool (to be re-allocated at the new size) */ - while(!LL_IS_EMPTY(&rgrp->unused)) { - LL_DEQUEUE(buf, &rgrp->unused, use); - return_to_pool(buf); - } - - /* Mark all buffers in use to be freed to pool when possible */ - LL_FOREACH(buf, &rgrp->inuse, use) { - buf->group_resized = true; - purge_history(buf); - } -} - - -void smm_destroy(smm_group_t * grp) -{ - struct smm_buffer * buf; - struct smm_group * dgrp = grp; - - /* Return unused buffers */ - while(!LL_IS_EMPTY(&dgrp->unused)) { - LL_DEQUEUE(buf, &dgrp->unused, use); - return_to_pool(buf); - } - - /* Return buffers that are still in use (ideally this queue should be empty - * at this time) - */ - while(!LL_IS_EMPTY(&dgrp->inuse)) { - LL_DEQUEUE(buf, &dgrp->inuse, use); - return_to_pool(buf); - } - - /* Remove from instance groups queue */ - LL_REMOVE(&smm_instance.groups, dgrp, link); - free(dgrp); -} - - -smm_buffer_t * smm_acquire(smm_group_t * grp) -{ - struct smm_buffer * buf; - struct smm_group * agrp = grp; - - if(LL_IS_EMPTY(&agrp->unused)) { - /* No unused buffer available, so get a new one from pool */ - buf = get_from_pool(agrp); - } - else { - /* Otherwise, reuse an unused buffer */ - LL_DEQUEUE(buf, &agrp->unused, use); - } - - if(buf != NULL) { - /* Add buffer to in-use queue */ - LL_ENQUEUE(&agrp->inuse, buf, use); - - /* Emit 'init buffer' event */ - if(smm_instance.cbs.init_buffer != NULL) { - if(smm_instance.cbs.init_buffer(smm_instance.cbs.ctx, &buf->props)) { - smm_release(buf); - buf = NULL; - } - } - - if(buf != NULL) { - /* Remove from history */ - purge_history(buf); - - /* Add to history a-new */ - LL_ENQUEUE(&agrp->history, buf, age); - } - } - - return buf; -} - - -void * smm_map(smm_buffer_t * buf) -{ - struct smm_buffer * mbuf = buf; - struct smm_pool * pool = mbuf->props.pool; - void * map = pool->map; - - if(pool->map_outdated) { - /* Update mapping to current pool size */ - if(pool->map != NULL) { - munmap(pool->map, pool->map_size); - } - - map = mmap(NULL, - pool->props.size, - PROT_READ | PROT_WRITE, - MAP_SHARED, - pool->props.fd, - 0); - - if(map == MAP_FAILED) { - map = NULL; - pool->map = NULL; - } - else { - pool->map = map; - pool->map_size = pool->props.size; - pool->map_outdated = false; - } - } - - /* Calculate buffer mapping (from offset in pool) */ - if(map != NULL) { - map = (((char *)map) + mbuf->props.offset); - } - - return map; -} - - -void smm_release(smm_buffer_t * buf) -{ - struct smm_buffer * rbuf = buf; - struct smm_group * grp = rbuf->props.group; - - /* Remove from in-use queue */ - LL_REMOVE(&grp->inuse, rbuf, use); - - if(rbuf->group_resized) { - /* Buffer group was resized while this buffer was in-use, thus it must be - * returned to it's pool - */ - rbuf->group_resized = false; - return_to_pool(rbuf); - } - else { - /* Move to unused queue */ - LL_ENQUEUE(&grp->unused, rbuf, use); - - /* Try to limit total number of buffers to preferred number */ - while((grp->num_buffers > PREFER_NUM_BUFFERS) && - (!LL_IS_EMPTY(&grp->unused))) { - LL_DEQUEUE(rbuf, &grp->unused, use); - return_to_pool(rbuf); - } - } -} - - -smm_buffer_t * smm_latest(smm_group_t * grp) -{ - struct smm_group * lgrp = grp; - - return LL_LAST(&lgrp->history); -} - - -smm_buffer_t * smm_next(smm_buffer_t * buf) -{ - struct smm_buffer * ibuf; - struct smm_buffer * nbuf = buf; - struct smm_group * grp = nbuf->props.group; - - LL_FOREACH(ibuf, &grp->history, age) { - if(ibuf == nbuf) { - ibuf = LL_NEXT(ibuf, age); - break; - } - } - - return ibuf; -} - -void purge_history(struct smm_buffer * buf) -{ - struct smm_buffer * ibuf; - struct smm_group * grp = buf->props.group; - - /* Remove from history (and any older) */ - LL_FOREACH(ibuf, &grp->history, age) { - if(ibuf == buf) { - do { - LL_DEQUEUE(ibuf, &grp->history, age); - } while(ibuf != buf); - break; - } - } -} - - -size_t calc_buffer_size(struct smm_buffer * buf) -{ - size_t buf_sz; - struct smm_pool * buf_pool = buf->props.pool; - - if(buf == LL_LAST(&buf_pool->allocd)) { - buf_sz = (buf_pool->props.size - buf->props.offset); - } - else { - buf_sz = (LL_NEXT(buf, pool)->props.offset - buf->props.offset); - } - - return buf_sz; -} - - -struct smm_buffer * get_from_pool(struct smm_group * grp) -{ - int ret; - size_t buf_sz; - struct smm_buffer * buf; - struct smm_buffer * last = NULL; - - /* TODO: Determine when to allocate a new active pool (i.e. memory shrink) */ - - if(smm_instance.active == NULL) { - /* Allocate a new active pool */ - smm_instance.active = alloc_pool(); - smm_instance.statistics.active_used = 0; - } - - if(smm_instance.active == NULL) { - buf = NULL; - } - else { - /* Search for a free buffer large enough for allocation */ - LL_FOREACH(buf, &smm_instance.active->allocd, pool) { - last = buf; - if(buf->props.group == NULL) { - buf_sz = calc_buffer_size(buf); - if(buf_sz == grp->size) { - break; - } - else if(buf_sz > grp->size) { - if((buf != LL_LAST(&smm_instance.active->allocd)) && - (LL_NEXT(buf, pool)->props.group == NULL)) { - /* Pull back next buffer to use unallocated size */ - LL_NEXT(buf, pool)->props.offset -= (buf_sz - grp->size); - } - else { - /* Allocate another buffer to hold unallocated size */ - alloc_buffer(buf, buf->props.offset + grp->size); - } - - break; - } - } - } - - if(buf == NULL) { - /* No buffer found to meet allocation size, expand pool */ - if((last != NULL) && - (last->props.group == NULL)) { - /* Use last free buffer */ - buf_sz = (grp->size - buf_sz); - } - else { - /* Allocate new buffer */ - buf_sz = grp->size; - if(last == NULL) { - buf = alloc_buffer(NULL, 0); - } - else { - buf = alloc_buffer(last, smm_instance.active->props.size); - } - last = buf; - } - - if(last != NULL) { - /* Expand pool backing memory */ - ret = ftruncate(smm_instance.active->props.fd, - smm_instance.active->props.size + buf_sz); - if(ret) { - if(buf != NULL) { - free_buffer(buf); - buf = NULL; - } - } - else { - smm_instance.active->props.size += buf_sz; - smm_instance.active->map_outdated = true; - buf = last; - - if(!(smm_instance.active->props.size - buf_sz)) { - /* Emit 'new pool' event */ - if((smm_instance.cbs.new_pool != NULL) && - (smm_instance.cbs.new_pool(smm_instance.cbs.ctx, - &smm_instance.active->props))) { - free_buffer(buf); - free_pool(smm_instance.active); - smm_instance.active = NULL; - buf = NULL; - } - } - else { - /* Emit 'expand pool' event */ - if(smm_instance.cbs.expand_pool != NULL) { - smm_instance.cbs.expand_pool(smm_instance.cbs.ctx, - &smm_instance.active->props); - } - } - } - } - } - } - - if(buf != NULL) { - /* Set buffer group */ - memcpy((void *)&buf->props.group, &grp, sizeof(struct smm_group *)); - - /* Emit 'new buffer' event */ - if(smm_instance.cbs.new_buffer != NULL) { - if(smm_instance.cbs.new_buffer(smm_instance.cbs.ctx, &buf->props)) { - grp = NULL; - memcpy((void *)&buf->props.group, &grp, sizeof(struct smm_group *)); - buf = NULL; - } - } - - if(buf != NULL) { - /* Update active pool usage statistic */ - smm_instance.statistics.active_used += grp->size; - grp->num_buffers++; - } - } - - return buf; -} - - -void return_to_pool(struct smm_buffer * buf) -{ - struct smm_group * grp = buf->props.group; - struct smm_pool * pool = buf->props.pool; - - /* Emit 'free buffer' event */ - if(smm_instance.cbs.free_buffer != NULL) { - smm_instance.cbs.free_buffer(smm_instance.cbs.ctx, &buf->props); - } - - /* Buffer is no longer part of history */ - purge_history(buf); - - /* Buffer is no longer part of group */ - grp->num_buffers--; - grp = NULL; - memcpy((void *)&buf->props.group, &grp, sizeof(struct smm_group *)); - - /* Update active pool usage statistic */ - if(smm_instance.active == pool) { - smm_instance.statistics.active_used -= calc_buffer_size(buf); - } - - /* Coalesce with ungrouped buffers beside this one */ - if((buf != LL_LAST(&pool->allocd)) && - (LL_NEXT(buf, pool)->props.group == NULL)) { - free_buffer(LL_NEXT(buf, pool)); - } - if((buf != LL_FIRST(&pool->allocd)) && - (LL_PREV(buf, pool)->props.group == NULL)) { - buf = LL_PREV(buf, pool); - pool = buf->props.pool; - free_buffer(LL_NEXT(buf, pool)); - } - - /* Free buffer (and pool), if only remaining buffer in pool */ - if((buf == LL_FIRST(&pool->allocd)) && - (buf == LL_LAST(&pool->allocd))) { - free_buffer(buf); - - /* Emit 'free pool' event */ - if(smm_instance.cbs.free_pool != NULL) { - smm_instance.cbs.free_pool(smm_instance.cbs.ctx, &pool->props); - } - - free_pool(pool); - if(smm_instance.active == pool) { - smm_instance.active = NULL; - } - } -} - - -struct smm_pool * alloc_pool(void) -{ - struct smm_pool * pool; - char name[] = WAYLAND_FD_NAME; - unsigned char attempts = 0; - bool opened = false; - - pool = malloc(sizeof(struct smm_pool)); - if(pool != NULL) { - do { - /* A randomized pool name should help reduce collisions */ - sprintf(name + sizeof(SMM_FD_NAME) + 1, "%05X", rand() & 0xFFFF); - pool->props.fd = shm_open(name, - O_RDWR | O_CREAT | O_EXCL, - S_IRUSR | S_IWUSR); - if(pool->props.fd >= 0) { - shm_unlink(name); - pool->props.size = 0; - pool->map = NULL; - pool->map_size = 0; - pool->map_outdated = false; - LL_INIT(&pool->allocd); - opened = true; - break; - } - else { - if(errno != EEXIST) { - break; - } - attempts++; - } - } while(attempts < MAX_NAME_ATTEMPTS); - - if(!opened) { - free(pool); - pool = NULL; - } - } - - return pool; -} - - -void free_pool(struct smm_pool * pool) -{ - if(pool->map != NULL) { - munmap(pool->map, pool->map_size); - } - - close(pool->props.fd); - free(pool); -} - - -struct smm_buffer * alloc_buffer(struct smm_buffer * last, size_t offset) -{ - struct smm_buffer * buf; - struct smm_buffer_properties initial_props = { - {NULL}, - NULL, - smm_instance.active, - offset - }; - - /* Allocate and intialize a new buffer (including linking in to pool) */ - buf = malloc(sizeof(struct smm_buffer)); - if(buf != NULL) { - memcpy(&buf->props, &initial_props, sizeof(struct smm_buffer_properties)); - buf->group_resized = false; - - if(last == NULL) { - LL_ENQUEUE(&smm_instance.active->allocd, buf, pool); - } - else { - LL_INSERT_AFTER(&smm_instance.active->allocd, last, buf, pool); - } - } - - return buf; -} - - -void free_buffer(struct smm_buffer * buf) -{ - struct smm_pool * buf_pool = buf->props.pool; - - /* Remove from pool */ - LL_REMOVE(&buf_pool->allocd, buf, pool); - free(buf); -} - -#endif /* LV_USE_WAYLAND */ -#endif /* _WIN32 */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/wayland/lv_wayland_smm.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/wayland/lv_wayland_smm.h deleted file mode 100644 index 617244f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/wayland/lv_wayland_smm.h +++ /dev/null @@ -1,105 +0,0 @@ -/** - * @file lv_wayland_smm.h - * - */ -#ifndef LV_WAYLAND_SMM_H -#define LV_WAYLAND_SMM_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _WIN32 - -/********************* - * INCLUDES - *********************/ - -#include "../../display/lv_display.h" -#include LV_STDDEF_INCLUDE -#include LV_STDBOOL_INCLUDE - -#if LV_USE_WAYLAND - -/********************* - * DEFINES - *********************/ - -#define SMM_FD_NAME "lvgl-wayland" -#define SMM_POOL_TAGS (1) -#define SMM_BUFFER_TAGS (2) -#define SMM_GROUP_TAGS (1) - -/********************** - * TYPEDEFS - **********************/ - -typedef void smm_pool_t; -typedef void smm_buffer_t; -typedef void smm_group_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -struct smm_events { - void * ctx; - bool (*new_pool)(void * ctx, smm_pool_t * pool); - void (*expand_pool)(void * ctx, smm_pool_t * pool); - void (*free_pool)(void * ctx, smm_pool_t * pool); - bool (*new_buffer)(void * ctx, smm_buffer_t * buf); - bool (*init_buffer)(void * ctx, smm_buffer_t * buf); - void (*free_buffer)(void * ctx, smm_buffer_t * buf); -}; - -struct smm_pool_properties { - void * tag[SMM_POOL_TAGS]; - size_t size; - int fd; -}; - -struct smm_buffer_properties { - void * tag[SMM_BUFFER_TAGS]; - smm_group_t * const group; - smm_pool_t * const pool; - size_t offset; -}; - -struct smm_group_properties { - void * tag[SMM_GROUP_TAGS]; -}; - -void smm_init(struct smm_events * evs); -void smm_setctx(void * ctx); -void smm_deinit(void); -smm_group_t * smm_create(void); -void smm_resize(smm_group_t * grp, size_t sz); -void smm_destroy(smm_group_t * grp); -smm_buffer_t * smm_acquire(smm_group_t * grp); -void * smm_map(smm_buffer_t * buf); -void smm_release(smm_buffer_t * buf); -smm_buffer_t * smm_latest(smm_group_t * grp); -smm_buffer_t * smm_next(smm_buffer_t * buf); - -/********************** - * MACROS - **********************/ - -#define SMM_POOL_PROPERTIES(p) ((const struct smm_pool_properties *)(p)) -#define SMM_BUFFER_PROPERTIES(b) ((const struct smm_buffer_properties *)(b)) -#define SMM_GROUP_PROPERTIES(g) ((const struct smm_group_properties *)(g)) -#define SMM_TAG(o, n, v) \ - do { \ - void **smm_tag = (void **)((char *)o + (n * sizeof(void *))); \ - *smm_tag = (v); \ - } while(0) - - -#endif /* LV_USE_WAYLAND */ -#endif /* _WIN32 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /* LV_WAYLAND_SMM_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_context.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_context.c deleted file mode 100644 index 7bf2038..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_context.c +++ /dev/null @@ -1,720 +0,0 @@ -/** - * @file lv_windows_context.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_windows_context.h" -#if LV_USE_WINDOWS - -#ifdef __GNUC__ - #pragma GCC diagnostic ignored "-Wcast-function-type" -#endif - -#include "lv_windows_display.h" -#include "lv_windows_input_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static uint32_t lv_windows_tick_count_callback(void); - -static void lv_windows_delay_callback(uint32_t ms); - -static void lv_windows_check_display_existence_timer_callback( - lv_timer_t * timer); - -static bool lv_windows_window_message_callback_nolock( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT * plResult); - -static LRESULT CALLBACK lv_windows_window_message_callback( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_windows_platform_init(void) -{ - lv_tick_set_cb(lv_windows_tick_count_callback); - - lv_delay_set_cb(lv_windows_delay_callback); - - lv_timer_create( - lv_windows_check_display_existence_timer_callback, - 200, - NULL); - - // Try to ensure the default group exists. - { - lv_group_t * default_group = lv_group_get_default(); - if(!default_group) { - default_group = lv_group_create(); - if(default_group) { - lv_group_set_default(default_group); - } - } - } - - WNDCLASSEXW window_class; - lv_memzero(&window_class, sizeof(WNDCLASSEXW)); - window_class.cbSize = sizeof(WNDCLASSEXW); - window_class.style = 0; - window_class.lpfnWndProc = lv_windows_window_message_callback; - window_class.cbClsExtra = 0; - window_class.cbWndExtra = 0; - window_class.hInstance = NULL; - window_class.hIcon = NULL; - window_class.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW); - window_class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); - window_class.lpszMenuName = NULL; - window_class.lpszClassName = L"LVGL.Window"; - window_class.hIconSm = NULL; - LV_ASSERT(RegisterClassExW(&window_class)); -} - -lv_windows_window_context_t * lv_windows_get_window_context( - HWND window_handle) -{ - return (lv_windows_window_context_t *)( - GetPropW(window_handle, L"LVGL.Window.Context")); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static uint32_t lv_windows_tick_count_callback(void) -{ - LARGE_INTEGER Frequency; - if(QueryPerformanceFrequency(&Frequency)) { - LARGE_INTEGER PerformanceCount; - if(QueryPerformanceCounter(&PerformanceCount)) { - return (uint32_t)(PerformanceCount.QuadPart * 1000 / Frequency.QuadPart); - } - } - - return (uint32_t)GetTickCount64(); -} - -static void lv_windows_delay_callback(uint32_t ms) -{ - HANDLE timer_handle = CreateWaitableTimerExW( - NULL, - NULL, - CREATE_WAITABLE_TIMER_MANUAL_RESET | - CREATE_WAITABLE_TIMER_HIGH_RESOLUTION, - TIMER_ALL_ACCESS); - if(timer_handle) { - LARGE_INTEGER due_time; - due_time.QuadPart = -((int64_t)ms) * 1000 * 10; - SetWaitableTimer(timer_handle, &due_time, 0, NULL, NULL, FALSE); - WaitForSingleObject(timer_handle, INFINITE); - - CloseHandle(timer_handle); - } -} - -static void lv_windows_check_display_existence_timer_callback( - lv_timer_t * timer) -{ - LV_UNUSED(timer); - if(!lv_display_get_next(NULL)) { - // Don't use lv_deinit() due to it will cause exception when parallel - // rendering is enabled. - exit(0); - } -} - -static HDC lv_windows_create_frame_buffer( - HWND window_handle, - LONG width, - LONG height, - UINT32 ** pixel_buffer, - SIZE_T * pixel_buffer_size) -{ - HDC frame_buffer_dc_handle = NULL; - - LV_ASSERT_NULL(pixel_buffer); - LV_ASSERT_NULL(pixel_buffer_size); - - HDC window_dc_handle = GetDC(window_handle); - if(window_dc_handle) { - frame_buffer_dc_handle = CreateCompatibleDC(window_dc_handle); - ReleaseDC(window_handle, window_dc_handle); - } - - if(frame_buffer_dc_handle) { -#if (LV_COLOR_DEPTH == 32) || (LV_COLOR_DEPTH == 24) - BITMAPINFO bitmap_info = { 0 }; -#elif (LV_COLOR_DEPTH == 16) - typedef struct _BITMAPINFO_16BPP { - BITMAPINFOHEADER bmiHeader; - DWORD bmiColorMask[3]; - } BITMAPINFO_16BPP; - - BITMAPINFO_16BPP bitmap_info = { 0 }; -#else -#error [lv_windows] Unsupported LV_COLOR_DEPTH. -#endif - - bitmap_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bitmap_info.bmiHeader.biWidth = width; - bitmap_info.bmiHeader.biHeight = -height; - bitmap_info.bmiHeader.biPlanes = 1; - bitmap_info.bmiHeader.biBitCount = lv_color_format_get_bpp( - LV_COLOR_FORMAT_NATIVE); -#if (LV_COLOR_DEPTH == 32) || (LV_COLOR_DEPTH == 24) - bitmap_info.bmiHeader.biCompression = BI_RGB; -#elif (LV_COLOR_DEPTH == 16) - bitmap_info.bmiHeader.biCompression = BI_BITFIELDS; - bitmap_info.bmiColorMask[0] = 0xF800; - bitmap_info.bmiColorMask[1] = 0x07E0; - bitmap_info.bmiColorMask[2] = 0x001F; -#else -#error [lv_windows] Unsupported LV_COLOR_DEPTH. -#endif - - HBITMAP hBitmap = CreateDIBSection( - frame_buffer_dc_handle, - (PBITMAPINFO)(&bitmap_info), - DIB_RGB_COLORS, - (void **)pixel_buffer, - NULL, - 0); - if(hBitmap) { - *pixel_buffer_size = width * height; - *pixel_buffer_size *= lv_color_format_get_size( - LV_COLOR_FORMAT_NATIVE); - - DeleteObject(SelectObject(frame_buffer_dc_handle, hBitmap)); - DeleteObject(hBitmap); - } - else { - DeleteDC(frame_buffer_dc_handle); - frame_buffer_dc_handle = NULL; - } - } - - return frame_buffer_dc_handle; -} - -static void lv_windows_display_timer_callback(lv_timer_t * timer) -{ - lv_windows_window_context_t * context = lv_timer_get_user_data(timer); - LV_ASSERT_NULL(context); - - if(!context->display_resolution_changed) { - return; - } - - lv_display_set_resolution( - context->display_device_object, - context->requested_display_resolution.x, - context->requested_display_resolution.y); - - int32_t hor_res = lv_display_get_horizontal_resolution( - context->display_device_object); - int32_t ver_res = lv_display_get_vertical_resolution( - context->display_device_object); - - HWND window_handle = lv_windows_get_display_window_handle( - context->display_device_object); - if(window_handle) { - if(context->display_framebuffer_context_handle) { - context->display_framebuffer_base = NULL; - context->display_framebuffer_size = 0; - DeleteDC(context->display_framebuffer_context_handle); - context->display_framebuffer_context_handle = NULL; - } - - context->display_framebuffer_context_handle = - lv_windows_create_frame_buffer( - window_handle, - hor_res, - ver_res, - &context->display_framebuffer_base, - &context->display_framebuffer_size); - if(context->display_framebuffer_context_handle) { - lv_display_set_buffers( - context->display_device_object, - context->display_framebuffer_base, - NULL, - (uint32_t)context->display_framebuffer_size, - LV_DISPLAY_RENDER_MODE_DIRECT); - } - } - - context->display_resolution_changed = false; - context->requested_display_resolution.x = 0; - context->requested_display_resolution.y = 0; -} - -static void lv_windows_display_driver_flush_callback( - lv_display_t * display, - const lv_area_t * area, - uint8_t * px_map) -{ - LV_UNUSED(area); - - HWND window_handle = lv_windows_get_display_window_handle(display); - if(!window_handle) { - lv_display_flush_ready(display); - return; - } - - lv_windows_window_context_t * context = lv_windows_get_window_context( - window_handle); - if(!context) { - lv_display_flush_ready(display); - return; - } - - if(lv_display_flush_is_last(display)) { -#if (LV_COLOR_DEPTH == 32) || \ - (LV_COLOR_DEPTH == 24) || \ - (LV_COLOR_DEPTH == 16) - UNREFERENCED_PARAMETER(px_map); -#else -#error [lv_windows] Unsupported LV_COLOR_DEPTH. -#endif - - HDC hdc = GetDC(window_handle); - if(hdc) { - SetStretchBltMode(hdc, HALFTONE); - - RECT client_rect; - GetClientRect(window_handle, &client_rect); - - int32_t width = lv_windows_zoom_to_logical( - client_rect.right - client_rect.left, - context->zoom_level); - int32_t height = lv_windows_zoom_to_logical( - client_rect.bottom - client_rect.top, - context->zoom_level); - if(context->simulator_mode) { - width = lv_windows_dpi_to_logical(width, context->window_dpi); - height = lv_windows_dpi_to_logical(height, context->window_dpi); - } - - StretchBlt( - hdc, - client_rect.left, - client_rect.top, - client_rect.right - client_rect.left, - client_rect.bottom - client_rect.top, - context->display_framebuffer_context_handle, - 0, - 0, - width, - height, - SRCCOPY); - - ReleaseDC(window_handle, hdc); - } - } - - lv_display_flush_ready(display); -} - -static UINT lv_windows_get_dpi_for_window(HWND window_handle) -{ - UINT result = (UINT)(-1); - - HMODULE module_handle = LoadLibraryW(L"SHCore.dll"); - if(module_handle) { - typedef enum MONITOR_DPI_TYPE_PRIVATE { - MDT_EFFECTIVE_DPI = 0, - MDT_ANGULAR_DPI = 1, - MDT_RAW_DPI = 2, - MDT_DEFAULT = MDT_EFFECTIVE_DPI - } MONITOR_DPI_TYPE_PRIVATE; - - typedef HRESULT(WINAPI * function_type)( - HMONITOR, MONITOR_DPI_TYPE_PRIVATE, UINT *, UINT *); - - function_type function = (function_type)( - GetProcAddress(module_handle, "GetDpiForMonitor")); - if(function) { - HMONITOR MonitorHandle = MonitorFromWindow( - window_handle, - MONITOR_DEFAULTTONEAREST); - - UINT dpiX = 0; - UINT dpiY = 0; - if(SUCCEEDED(function( - MonitorHandle, - MDT_EFFECTIVE_DPI, - &dpiX, - &dpiY))) { - result = dpiX; - } - } - - FreeLibrary(module_handle); - } - - if(result == (UINT)(-1)) { - HDC hWindowDC = GetDC(window_handle); - if(hWindowDC) { - result = GetDeviceCaps(hWindowDC, LOGPIXELSX); - ReleaseDC(window_handle, hWindowDC); - } - } - - if(result == (UINT)(-1)) { - result = USER_DEFAULT_SCREEN_DPI; - } - - return result; -} - -static BOOL lv_windows_register_touch_window( - HWND window_handle, - ULONG flags) -{ - HMODULE module_handle = GetModuleHandleW(L"user32.dll"); - if(!module_handle) { - return FALSE; - } - - typedef BOOL(WINAPI * function_type)(HWND, ULONG); - - function_type function = (function_type)( - GetProcAddress(module_handle, "RegisterTouchWindow")); - if(!function) { - return FALSE; - } - - return function(window_handle, flags); -} - -static BOOL lv_windows_enable_child_window_dpi_message( - HWND WindowHandle) -{ - // The private Per-Monitor DPI Awareness support extension is Windows 10 - // only. We don't need the private Per-Monitor DPI Awareness support - // extension if the Per-Monitor (V2) DPI Awareness exists. - OSVERSIONINFOEXW os_version_info_ex = { 0 }; - os_version_info_ex.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW); - os_version_info_ex.dwMajorVersion = 10; - os_version_info_ex.dwMinorVersion = 0; - os_version_info_ex.dwBuildNumber = 14986; - if(!VerifyVersionInfoW( - &os_version_info_ex, - VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER, - VerSetConditionMask( - VerSetConditionMask( - VerSetConditionMask( - 0, - VER_MAJORVERSION, - VER_GREATER_EQUAL), - VER_MINORVERSION, - VER_GREATER_EQUAL), - VER_BUILDNUMBER, - VER_LESS))) { - return FALSE; - } - - HMODULE module_handle = GetModuleHandleW(L"user32.dll"); - if(!module_handle) { - return FALSE; - } - - typedef BOOL(WINAPI * function_type)(HWND, BOOL); - - function_type function = (function_type)( - GetProcAddress(module_handle, "EnableChildWindowDpiMessage")); - if(!function) { - return FALSE; - } - - return function(WindowHandle, TRUE); -} - -static bool lv_windows_window_message_callback_nolock( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT * plResult) -{ - switch(uMsg) { - case WM_CREATE: { - // Note: Return -1 directly because WM_DESTROY message will be sent - // when destroy the window automatically. We free the resource when - // processing the WM_DESTROY message of this window. - - lv_windows_create_display_data_t * data = - (lv_windows_create_display_data_t *)( - ((LPCREATESTRUCTW)(lParam))->lpCreateParams); - if(!data) { - return -1; - } - - lv_windows_window_context_t * context = - (lv_windows_window_context_t *)(HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - sizeof(lv_windows_window_context_t))); - if(!context) { - return -1; - } - - if(!SetPropW(hWnd, L"LVGL.Window.Context", (HANDLE)(context))) { - return -1; - } - - context->window_dpi = lv_windows_get_dpi_for_window(hWnd); - context->zoom_level = data->zoom_level; - context->allow_dpi_override = data->allow_dpi_override; - context->simulator_mode = data->simulator_mode; - - context->display_timer_object = lv_timer_create( - lv_windows_display_timer_callback, - LV_DEF_REFR_PERIOD, - context); - - context->display_resolution_changed = false; - context->requested_display_resolution.x = 0; - context->requested_display_resolution.y = 0; - - context->display_device_object = lv_display_create(0, 0); - if(!context->display_device_object) { - return -1; - } - RECT request_content_size; - GetWindowRect(hWnd, &request_content_size); - lv_display_set_resolution( - context->display_device_object, - request_content_size.right - request_content_size.left, - request_content_size.bottom - request_content_size.top); - lv_display_set_flush_cb( - context->display_device_object, - lv_windows_display_driver_flush_callback); - lv_display_set_driver_data( - context->display_device_object, - hWnd); - if(!context->allow_dpi_override) { - lv_display_set_dpi( - context->display_device_object, - context->window_dpi); - } - - if(context->simulator_mode) { - context->display_resolution_changed = true; - context->requested_display_resolution.x = - lv_display_get_horizontal_resolution( - context->display_device_object); - context->requested_display_resolution.y = - lv_display_get_vertical_resolution( - context->display_device_object); - } - - lv_windows_register_touch_window(hWnd, 0); - - lv_windows_enable_child_window_dpi_message(hWnd); - - break; - } - case WM_SIZE: { - if(wParam != SIZE_MINIMIZED) { - lv_windows_window_context_t * context = (lv_windows_window_context_t *)( - lv_windows_get_window_context(hWnd)); - if(context) { - if(!context->simulator_mode) { - context->display_resolution_changed = true; - context->requested_display_resolution.x = LOWORD(lParam); - context->requested_display_resolution.y = HIWORD(lParam); - } - else { - int32_t window_width = lv_windows_dpi_to_physical( - lv_windows_zoom_to_physical( - lv_display_get_horizontal_resolution( - context->display_device_object), - context->zoom_level), - context->window_dpi); - int32_t window_height = lv_windows_dpi_to_physical( - lv_windows_zoom_to_physical( - lv_display_get_vertical_resolution( - context->display_device_object), - context->zoom_level), - context->window_dpi); - - RECT window_rect; - GetWindowRect(hWnd, &window_rect); - - RECT client_rect; - GetClientRect(hWnd, &client_rect); - - int32_t original_window_width = - window_rect.right - window_rect.left; - int32_t original_window_height = - window_rect.bottom - window_rect.top; - - int32_t original_client_width = - client_rect.right - client_rect.left; - int32_t original_client_height = - client_rect.bottom - client_rect.top; - - int32_t reserved_width = - original_window_width - original_client_width; - int32_t reserved_height = - original_window_height - original_client_height; - - SetWindowPos( - hWnd, - NULL, - 0, - 0, - reserved_width + window_width, - reserved_height + window_height, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); - } - } - } - break; - } - case WM_DPICHANGED: { - lv_windows_window_context_t * context = (lv_windows_window_context_t *)( - lv_windows_get_window_context(hWnd)); - if(context) { - context->window_dpi = HIWORD(wParam); - - if(!context->allow_dpi_override) { - lv_display_set_dpi( - context->display_device_object, - context->window_dpi); - } - - LPRECT suggested_rect = (LPRECT)lParam; - - SetWindowPos( - hWnd, - NULL, - suggested_rect->left, - suggested_rect->top, - suggested_rect->right, - suggested_rect->bottom, - SWP_NOZORDER | SWP_NOACTIVATE); - } - - break; - } - case WM_ERASEBKGND: { - return TRUE; - } - case WM_DESTROY: { - lv_windows_window_context_t * context = (lv_windows_window_context_t *)( - RemovePropW(hWnd, L"LVGL.Window.Context")); - if(context) { - lv_display_t * display_device_object = - context->display_device_object; - context->display_device_object = NULL; - lv_display_delete(display_device_object); - DeleteDC(context->display_framebuffer_context_handle); - - lv_timer_delete(context->display_timer_object); - - HeapFree(GetProcessHeap(), 0, context); - } - - PostQuitMessage(0); - - break; - } - default: { - lv_windows_window_context_t * context = (lv_windows_window_context_t *)( - lv_windows_get_window_context(hWnd)); - if(context) { - if(context->pointer.indev && - lv_windows_pointer_device_window_message_handler( - hWnd, - uMsg, - wParam, - lParam, - plResult)) { - // Handled - return true; - } - else if(context->keypad.indev && - lv_windows_keypad_device_window_message_handler( - hWnd, - uMsg, - wParam, - lParam, - plResult)) { - // Handled - return true; - } - else if(context->encoder.indev && - lv_windows_encoder_device_window_message_handler( - hWnd, - uMsg, - wParam, - lParam, - plResult)) { - // Handled - return true; - } - } - - // Not Handled - return false; - } - } - - // Handled - *plResult = 0; - return true; -} - -static LRESULT CALLBACK lv_windows_window_message_callback( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - lv_lock(); - - LRESULT lResult = 0; - bool Handled = lv_windows_window_message_callback_nolock( - hWnd, - uMsg, - wParam, - lParam, - &lResult); - - lv_unlock(); - - return Handled ? lResult : DefWindowProcW(hWnd, uMsg, wParam, lParam); -} - -#endif // LV_USE_WINDOWS diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_context.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_context.h deleted file mode 100644 index c4fc941..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_context.h +++ /dev/null @@ -1,134 +0,0 @@ -/** - * @file lv_windows_context.h - * - */ - -#ifndef LV_WINDOWS_CONTEXT_H -#define LV_WINDOWS_CONTEXT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../display/lv_display.h" -#include "../../indev/lv_indev.h" - -#if LV_USE_WINDOWS - -#if LV_USE_OS != LV_OS_WINDOWS -#error [lv_windows] LV_OS_WINDOWS is required. Enable it in lv_conf.h (LV_USE_OS LV_OS_WINDOWS) -#endif - -#include - -#ifndef CREATE_WAITABLE_TIMER_MANUAL_RESET -#define CREATE_WAITABLE_TIMER_MANUAL_RESET 0x00000001 -#endif - -#ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION -#define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct lv_windows_pointer_context_t { - lv_indev_state_t state; - lv_point_t point; - lv_indev_t * indev; -} lv_windows_pointer_context_t; - -typedef struct lv_windows_keypad_queue_item_t { - uint32_t key; - lv_indev_state_t state; -} lv_windows_keypad_queue_item_t; - -typedef struct lv_windows_keypad_context_t { - lv_ll_t queue; - uint16_t utf16_high_surrogate; - uint16_t utf16_low_surrogate; - lv_indev_t * indev; -} lv_windows_keypad_context_t; - -typedef struct lv_windows_encoder_context_t { - lv_indev_state_t state; - int16_t enc_diff; - lv_indev_t * indev; -} lv_windows_encoder_context_t; - -typedef struct lv_windows_window_context_t { - lv_display_t * display_device_object; - lv_timer_t * display_timer_object; - - int32_t window_dpi; - int32_t zoom_level; - bool allow_dpi_override; - bool simulator_mode; - bool display_resolution_changed; - lv_point_t requested_display_resolution; - - HDC display_framebuffer_context_handle; - uint32_t * display_framebuffer_base; - size_t display_framebuffer_size; - - lv_windows_pointer_context_t pointer; - lv_windows_keypad_context_t keypad; - lv_windows_encoder_context_t encoder; - -} lv_windows_window_context_t; - -typedef struct lv_windows_create_display_data_t { - const wchar_t * title; - int32_t hor_res; - int32_t ver_res; - int32_t zoom_level; - bool allow_dpi_override; - bool simulator_mode; - HANDLE mutex; - lv_display_t * display; -} lv_windows_create_display_data_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * @brief Initialize the LVGL Windows backend. - * @remark This is a private API which is used for LVGL Windows backend - * implementation. LVGL users shouldn't use that because the - * LVGL has already used it in lv_init. -*/ -void lv_windows_platform_init(void); - -/** - * @brief Get the window context from specific LVGL display window. - * @param window_handle The window handle of specific LVGL display window. - * @return The window context from specific LVGL display window. - * @remark This is a private API which is used for LVGL Windows backend - * implementation. LVGL users shouldn't use that because the - * maintainer doesn't promise the application binary interface - * compatibility for this API. -*/ -lv_windows_window_context_t * lv_windows_get_window_context( - HWND window_handle); - -/********************** - * MACROS - **********************/ - -#endif // LV_USE_WINDOWS - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_WINDOWS_CONTEXT_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_display.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_display.c deleted file mode 100644 index 958338e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_display.c +++ /dev/null @@ -1,170 +0,0 @@ -/** - * @file lv_windows_display.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_windows_display.h" -#if LV_USE_WINDOWS - -#include "lv_windows_context.h" - -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static unsigned int __stdcall lv_windows_display_thread_entrypoint( - void * parameter); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_windows_create_display( - const wchar_t * title, - int32_t hor_res, - int32_t ver_res, - int32_t zoom_level, - bool allow_dpi_override, - bool simulator_mode) -{ - lv_windows_create_display_data_t data; - - lv_memzero(&data, sizeof(lv_windows_create_display_data_t)); - data.title = title; - data.hor_res = hor_res; - data.ver_res = ver_res; - data.zoom_level = zoom_level; - data.allow_dpi_override = allow_dpi_override; - data.simulator_mode = simulator_mode; - data.mutex = CreateEventExW(NULL, NULL, 0, EVENT_ALL_ACCESS); - data.display = NULL; - if(!data.mutex) { - return NULL; - } - - HANDLE thread = (HANDLE)_beginthreadex( - NULL, - 0, - lv_windows_display_thread_entrypoint, - &data, - 0, - NULL); - LV_ASSERT(thread); - - WaitForSingleObjectEx(data.mutex, INFINITE, FALSE); - - if(thread) { - CloseHandle(thread); - } - - if(data.mutex) { - CloseHandle(data.mutex); - } - - return data.display; -} - -HWND lv_windows_get_display_window_handle(lv_display_t * display) -{ - return (HWND)lv_display_get_driver_data(display); -} - -int32_t lv_windows_zoom_to_logical(int32_t physical, int32_t zoom_level) -{ - return MulDiv(physical, LV_WINDOWS_ZOOM_BASE_LEVEL, zoom_level); -} - -int32_t lv_windows_zoom_to_physical(int32_t logical, int32_t zoom_level) -{ - return MulDiv(logical, zoom_level, LV_WINDOWS_ZOOM_BASE_LEVEL); -} - -int32_t lv_windows_dpi_to_logical(int32_t physical, int32_t dpi) -{ - return MulDiv(physical, USER_DEFAULT_SCREEN_DPI, dpi); -} - -int32_t lv_windows_dpi_to_physical(int32_t logical, int32_t dpi) -{ - return MulDiv(logical, dpi, USER_DEFAULT_SCREEN_DPI); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static unsigned int __stdcall lv_windows_display_thread_entrypoint( - void * parameter) -{ - lv_windows_create_display_data_t * data = parameter; - LV_ASSERT_NULL(data); - - DWORD window_style = WS_OVERLAPPEDWINDOW; - if(data->simulator_mode) { - window_style &= ~(WS_SIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME); - } - - HWND window_handle = CreateWindowExW( - WS_EX_CLIENTEDGE, - L"LVGL.Window", - data->title, - window_style, - CW_USEDEFAULT, - 0, - data->hor_res, - data->ver_res, - NULL, - NULL, - NULL, - data); - if(!window_handle) { - return 0; - } - - lv_windows_window_context_t * context = lv_windows_get_window_context( - window_handle); - if(!context) { - return 0; - } - - data->display = context->display_device_object; - - ShowWindow(window_handle, SW_SHOW); - UpdateWindow(window_handle); - - LV_ASSERT(SetEvent(data->mutex)); - - data = NULL; - - MSG message; - while(GetMessageW(&message, NULL, 0, 0)) { - TranslateMessage(&message); - DispatchMessageW(&message); - } - - return 0; -} - -#endif // LV_USE_WINDOWS diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_display.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_display.h deleted file mode 100644 index b9c6f8e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_display.h +++ /dev/null @@ -1,127 +0,0 @@ -/** - * @file lv_windows_display.h - * - */ - -#ifndef LV_WINDOWS_DISPLAY_H -#define LV_WINDOWS_DISPLAY_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../display/lv_display.h" -#include "../../indev/lv_indev.h" - -#if LV_USE_WINDOWS - -#include - -/********************* - * DEFINES - *********************/ - -#define LV_WINDOWS_ZOOM_BASE_LEVEL 100 - -#ifndef USER_DEFAULT_SCREEN_DPI -#define USER_DEFAULT_SCREEN_DPI 96 -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * @brief Create a LVGL display object. - * @param title The window title of LVGL display. - * @param hor_res The horizontal resolution value of LVGL display. - * @param ver_res The vertical resolution value of LVGL display. - * @param zoom_level The zoom level value. Base value is 100 a.k.a 100%. - * @param allow_dpi_override Allow DPI override if true, or follow the - * Windows DPI scaling setting dynamically. - * @param simulator_mode Create simulator mode display if true, or create - * application mode display. - * @return The created LVGL display object. -*/ -lv_display_t * lv_windows_create_display( - const wchar_t * title, - int32_t hor_res, - int32_t ver_res, - int32_t zoom_level, - bool allow_dpi_override, - bool simulator_mode); - -/** - * @brief Get the window handle from specific LVGL display object. - * @param display The specific LVGL display object. - * @return The window handle from specific LVGL display object. -*/ -HWND lv_windows_get_display_window_handle(lv_display_t * display); - -/** - * @brief Get logical pixel value from physical pixel value taken account - * with zoom level. - * @param physical The physical pixel value taken account with zoom level. - * @param zoom_level The zoom level value. Base value is 100 a.k.a 100%. - * @return The logical pixel value. - * @remark It uses the same calculation style as Windows OS implementation. - * It will be useful for integrate LVGL Windows backend to other - * Windows applications. -*/ -int32_t lv_windows_zoom_to_logical(int32_t physical, int32_t zoom_level); - -/** - * @brief Get physical pixel value taken account with zoom level from - * logical pixel value. - * @param logical The logical pixel value. - * @param zoom_level The zoom level value. Base value is 100 a.k.a 100%. - * @return The physical pixel value taken account with zoom level. - * @remark It uses the same calculation style as Windows OS implementation. - * It will be useful for integrate LVGL Windows backend to other - * Windows applications. -*/ -int32_t lv_windows_zoom_to_physical(int32_t logical, int32_t zoom_level); - -/** - * @brief Get logical pixel value from physical pixel value taken account - * with DPI scaling. - * @param physical The physical pixel value taken account with DPI scaling. - * @param dpi The DPI scaling value. Base value is USER_DEFAULT_SCREEN_DPI. - * @return The logical pixel value. - * @remark It uses the same calculation style as Windows OS implementation. - * It will be useful for integrate LVGL Windows backend to other - * Windows applications. -*/ -int32_t lv_windows_dpi_to_logical(int32_t physical, int32_t dpi); - -/** - * @brief Get physical pixel value taken account with DPI scaling from - * logical pixel value. - * @param logical The logical pixel value. - * @param dpi The DPI scaling value. Base value is USER_DEFAULT_SCREEN_DPI. - * @return The physical pixel value taken account with DPI scaling. - * @remark It uses the same calculation style as Windows OS implementation. - * It will be useful for integrate LVGL Windows backend to other - * Windows applications. -*/ -int32_t lv_windows_dpi_to_physical(int32_t logical, int32_t dpi); - -/********************** - * MACROS - **********************/ - -#endif // LV_USE_WINDOWS - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_WINDOWS_DISPLAY_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_input.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_input.c deleted file mode 100644 index d3b7816..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_input.c +++ /dev/null @@ -1,825 +0,0 @@ -/** - * @file lv_windows_input.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_windows_input.h" -#if LV_USE_WINDOWS - -#ifdef __GNUC__ - #pragma GCC diagnostic ignored "-Wcast-function-type" -#endif - -#include "lv_windows_context.h" -#include "lv_windows_display.h" -#include "lv_windows_input_private.h" -#include "../../misc/lv_text_private.h" -#include "../../core/lv_obj_private.h" - -#include - -#include "../../widgets/textarea/lv_textarea_private.h" -#include "../../widgets/keyboard/lv_keyboard.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void lv_windows_pointer_driver_read_callback( - lv_indev_t * indev, - lv_indev_data_t * data); - -static void lv_windows_release_pointer_device_event_callback(lv_event_t * e); - -static void lv_windows_keypad_driver_read_callback( - lv_indev_t * indev, - lv_indev_data_t * data); - -static void lv_windows_release_keypad_device_event_callback(lv_event_t * e); - -static void lv_windows_encoder_driver_read_callback( - lv_indev_t * indev, - lv_indev_data_t * data); - -static void lv_windows_release_encoder_device_event_callback(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -HWND lv_windows_get_indev_window_handle(lv_indev_t * indev) -{ - return lv_windows_get_display_window_handle(lv_indev_get_display(indev)); -} - -lv_indev_t * lv_windows_acquire_pointer_indev(lv_display_t * display) -{ - HWND window_handle = lv_windows_get_display_window_handle(display); - if(!window_handle) { - return NULL; - } - - lv_windows_window_context_t * context = lv_windows_get_window_context( - window_handle); - if(!context) { - return NULL; - } - - if(!context->pointer.indev) { - context->pointer.state = LV_INDEV_STATE_RELEASED; - context->pointer.point.x = 0; - context->pointer.point.y = 0; - - context->pointer.indev = lv_indev_create(); - if(context->pointer.indev) { - lv_indev_set_type( - context->pointer.indev, - LV_INDEV_TYPE_POINTER); - lv_indev_set_read_cb( - context->pointer.indev, - lv_windows_pointer_driver_read_callback); - lv_indev_set_display( - context->pointer.indev, - context->display_device_object); - lv_indev_add_event_cb( - context->pointer.indev, - lv_windows_release_pointer_device_event_callback, - LV_EVENT_DELETE, - context->pointer.indev); - lv_indev_set_group( - context->pointer.indev, - lv_group_get_default()); - } - } - - return context->pointer.indev; -} - -lv_indev_t * lv_windows_acquire_keypad_indev(lv_display_t * display) -{ - HWND window_handle = lv_windows_get_display_window_handle(display); - if(!window_handle) { - return NULL; - } - - lv_windows_window_context_t * context = lv_windows_get_window_context( - window_handle); - if(!context) { - return NULL; - } - - if(!context->keypad.indev) { - lv_ll_init( - &context->keypad.queue, - sizeof(lv_windows_keypad_queue_item_t)); - context->keypad.utf16_high_surrogate = 0; - context->keypad.utf16_low_surrogate = 0; - - context->keypad.indev = lv_indev_create(); - if(context->keypad.indev) { - lv_indev_set_type( - context->keypad.indev, - LV_INDEV_TYPE_KEYPAD); - lv_indev_set_read_cb( - context->keypad.indev, - lv_windows_keypad_driver_read_callback); - lv_indev_set_display( - context->keypad.indev, - context->display_device_object); - lv_indev_add_event_cb( - context->keypad.indev, - lv_windows_release_keypad_device_event_callback, - LV_EVENT_DELETE, - context->keypad.indev); - lv_indev_set_group( - context->keypad.indev, - lv_group_get_default()); - } - } - - return context->keypad.indev; -} - -lv_indev_t * lv_windows_acquire_encoder_indev(lv_display_t * display) -{ - HWND window_handle = lv_windows_get_display_window_handle(display); - if(!window_handle) { - return NULL; - } - - lv_windows_window_context_t * context = lv_windows_get_window_context( - window_handle); - if(!context) { - return NULL; - } - - if(!context->encoder.indev) { - context->encoder.state = LV_INDEV_STATE_RELEASED; - context->encoder.enc_diff = 0; - - context->encoder.indev = lv_indev_create(); - if(context->encoder.indev) { - lv_indev_set_type( - context->encoder.indev, - LV_INDEV_TYPE_ENCODER); - lv_indev_set_read_cb( - context->encoder.indev, - lv_windows_encoder_driver_read_callback); - lv_indev_set_display( - context->encoder.indev, - context->display_device_object); - lv_indev_add_event_cb( - context->encoder.indev, - lv_windows_release_encoder_device_event_callback, - LV_EVENT_DELETE, - context->encoder.indev); - lv_indev_set_group( - context->encoder.indev, - lv_group_get_default()); - } - } - - return context->encoder.indev; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_windows_pointer_driver_read_callback( - lv_indev_t * indev, - lv_indev_data_t * data) -{ - lv_windows_window_context_t * context = lv_windows_get_window_context( - lv_windows_get_indev_window_handle(indev)); - if(!context) { - return; - } - - data->state = context->pointer.state; - data->point = context->pointer.point; -} - -static void lv_windows_release_pointer_device_event_callback(lv_event_t * e) -{ - lv_indev_t * indev = (lv_indev_t *)lv_event_get_user_data(e); - if(!indev) { - return; - } - - HWND window_handle = lv_windows_get_indev_window_handle(indev); - if(!window_handle) { - return; - } - - lv_windows_window_context_t * context = lv_windows_get_window_context( - window_handle); - if(!context) { - return; - } - - context->pointer.state = LV_INDEV_STATE_RELEASED; - context->pointer.point.x = 0; - context->pointer.point.y = 0; - - context->pointer.indev = NULL; -} - -static BOOL lv_windows_get_touch_input_info( - HTOUCHINPUT touch_input_handle, - UINT input_count, - PTOUCHINPUT inputs, - int item_size) -{ - HMODULE module_handle = GetModuleHandleW(L"user32.dll"); - if(!module_handle) { - return FALSE; - } - - typedef BOOL(WINAPI * function_type)(HTOUCHINPUT, UINT, PTOUCHINPUT, int); - - function_type function = (function_type)( - GetProcAddress(module_handle, "GetTouchInputInfo")); - if(!function) { - return FALSE; - } - - return function(touch_input_handle, input_count, inputs, item_size); -} - -static BOOL lv_windows_close_touch_input_handle( - HTOUCHINPUT touch_input_handle) -{ - HMODULE module_handle = GetModuleHandleW(L"user32.dll"); - if(!module_handle) { - return FALSE; - } - - typedef BOOL(WINAPI * function_type)(HTOUCHINPUT); - - function_type function = (function_type)( - GetProcAddress(module_handle, "CloseTouchInputHandle")); - if(!function) { - return FALSE; - } - - return function(touch_input_handle); -} - -bool lv_windows_pointer_device_window_message_handler( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT * plResult) -{ - switch(uMsg) { - case WM_MOUSEMOVE: { - lv_windows_window_context_t * context = (lv_windows_window_context_t *)( - lv_windows_get_window_context(hWnd)); - if(context) { - int32_t hor_res = lv_display_get_horizontal_resolution( - context->display_device_object); - int32_t ver_res = lv_display_get_vertical_resolution( - context->display_device_object); - - context->pointer.point.x = lv_windows_zoom_to_logical( - GET_X_LPARAM(lParam), - context->zoom_level); - context->pointer.point.y = lv_windows_zoom_to_logical( - GET_Y_LPARAM(lParam), - context->zoom_level); - if(context->simulator_mode) { - context->pointer.point.x = lv_windows_dpi_to_logical( - context->pointer.point.x, - context->window_dpi); - context->pointer.point.y = lv_windows_dpi_to_logical( - context->pointer.point.y, - context->window_dpi); - } - if(context->pointer.point.x < 0) { - context->pointer.point.x = 0; - } - if(context->pointer.point.x > hor_res - 1) { - context->pointer.point.x = hor_res - 1; - } - if(context->pointer.point.y < 0) { - context->pointer.point.y = 0; - } - if(context->pointer.point.y > ver_res - 1) { - context->pointer.point.y = ver_res - 1; - } - } - - break; - } - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: { - lv_windows_window_context_t * context = (lv_windows_window_context_t *)( - lv_windows_get_window_context(hWnd)); - if(context) { - context->pointer.state = ( - uMsg == WM_LBUTTONDOWN - ? LV_INDEV_STATE_PRESSED - : LV_INDEV_STATE_RELEASED); - } - - break; - } - case WM_TOUCH: { - lv_windows_window_context_t * context = (lv_windows_window_context_t *)( - lv_windows_get_window_context(hWnd)); - if(context) { - UINT input_count = LOWORD(wParam); - HTOUCHINPUT touch_input_handle = (HTOUCHINPUT)(lParam); - - PTOUCHINPUT inputs = malloc(input_count * sizeof(TOUCHINPUT)); - if(inputs) { - if(lv_windows_get_touch_input_info( - touch_input_handle, - input_count, - inputs, - sizeof(TOUCHINPUT))) { - for(UINT i = 0; i < input_count; ++i) { - POINT Point; - Point.x = TOUCH_COORD_TO_PIXEL(inputs[i].x); - Point.y = TOUCH_COORD_TO_PIXEL(inputs[i].y); - if(!ScreenToClient(hWnd, &Point)) { - continue; - } - - context->pointer.point.x = lv_windows_zoom_to_logical( - Point.x, - context->zoom_level); - context->pointer.point.y = lv_windows_zoom_to_logical( - Point.y, - context->zoom_level); - if(context->simulator_mode) { - context->pointer.point.x = lv_windows_dpi_to_logical( - context->pointer.point.x, - context->window_dpi); - context->pointer.point.y = lv_windows_dpi_to_logical( - context->pointer.point.y, - context->window_dpi); - } - - DWORD MousePressedMask = - TOUCHEVENTF_MOVE | TOUCHEVENTF_DOWN; - - context->pointer.state = ( - inputs[i].dwFlags & MousePressedMask - ? LV_INDEV_STATE_PRESSED - : LV_INDEV_STATE_RELEASED); - } - } - - free(inputs); - } - - lv_windows_close_touch_input_handle(touch_input_handle); - } - - break; - } - default: - // Not Handled - return false; - } - - // Handled - *plResult = 0; - return true; -} - -static void lv_windows_keypad_driver_read_callback( - lv_indev_t * indev, - lv_indev_data_t * data) -{ - lv_windows_window_context_t * context = lv_windows_get_window_context( - lv_windows_get_indev_window_handle(indev)); - if(!context) { - return; - } - - lv_windows_keypad_queue_item_t * current = (lv_windows_keypad_queue_item_t *)( - lv_ll_get_head(&context->keypad.queue)); - if(current) { - data->key = current->key; - data->state = current->state; - - lv_ll_remove(&context->keypad.queue, current); - lv_free(current); - - data->continue_reading = true; - } -} - -static void lv_windows_release_keypad_device_event_callback(lv_event_t * e) -{ - lv_indev_t * indev = (lv_indev_t *)lv_event_get_user_data(e); - if(!indev) { - return; - } - - HWND window_handle = lv_windows_get_indev_window_handle(indev); - if(!window_handle) { - return; - } - - lv_windows_window_context_t * context = lv_windows_get_window_context( - window_handle); - if(!context) { - return; - } - - lv_ll_clear(&context->keypad.queue); - context->keypad.utf16_high_surrogate = 0; - context->keypad.utf16_low_surrogate = 0; - - context->keypad.indev = NULL; -} - -static void lv_windows_push_key_to_keyboard_queue( - lv_windows_window_context_t * context, - uint32_t key, - lv_indev_state_t state) -{ - lv_windows_keypad_queue_item_t * current = (lv_windows_keypad_queue_item_t *)( - lv_ll_ins_tail(&context->keypad.queue)); - if(current) { - current->key = key; - current->state = state; - } -} - -static HIMC lv_windows_imm_get_context( - HWND window_handle) -{ - HMODULE module_handle = GetModuleHandleW(L"imm32.dll"); - if(!module_handle) { - return FALSE; - } - - typedef HIMC(WINAPI * function_type)(HWND); - - function_type function = (function_type)( - GetProcAddress(module_handle, "ImmGetContext")); - if(!function) { - return FALSE; - } - - return function(window_handle); -} - -static BOOL lv_windows_imm_release_context( - HWND window_handle, - HIMC imm_context_handle) -{ - HMODULE module_handle = GetModuleHandleW(L"imm32.dll"); - if(!module_handle) { - return FALSE; - } - - typedef BOOL(WINAPI * function_type)(HWND, HIMC); - - function_type function = (function_type)( - GetProcAddress(module_handle, "ImmReleaseContext")); - if(!function) { - return FALSE; - } - - return function(window_handle, imm_context_handle); -} - -static HIMC lv_windows_imm_associate_context( - HWND window_handle, - HIMC imm_context_handle) -{ - HMODULE module_handle = GetModuleHandleW(L"imm32.dll"); - if(!module_handle) { - return FALSE; - } - - typedef HIMC(WINAPI * function_type)(HWND, HIMC); - - function_type function = (function_type)( - GetProcAddress(module_handle, "ImmAssociateContext")); - if(!function) { - return FALSE; - } - - return function(window_handle, imm_context_handle); -} - -static BOOL lv_windows_imm_set_composition_window( - HIMC imm_context_handle, - LPCOMPOSITIONFORM composition_form) -{ - HMODULE module_handle = GetModuleHandleW(L"imm32.dll"); - if(!module_handle) { - return FALSE; - } - - typedef BOOL(WINAPI * function_type)(HIMC, LPCOMPOSITIONFORM); - - function_type function = (function_type)( - GetProcAddress(module_handle, "ImmSetCompositionWindow")); - if(!function) { - return FALSE; - } - - return function(imm_context_handle, composition_form); -} - -bool lv_windows_keypad_device_window_message_handler( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT * plResult) -{ - LV_UNUSED(lParam); - - switch(uMsg) { - case WM_KEYDOWN: - case WM_KEYUP: { - lv_windows_window_context_t * context = (lv_windows_window_context_t *)( - lv_windows_get_window_context(hWnd)); - if(context) { - bool skip_translation = false; - uint32_t translated_key = 0; - - switch(wParam) { - case VK_UP: - translated_key = LV_KEY_UP; - break; - case VK_DOWN: - translated_key = LV_KEY_DOWN; - break; - case VK_LEFT: - translated_key = LV_KEY_LEFT; - break; - case VK_RIGHT: - translated_key = LV_KEY_RIGHT; - break; - case VK_ESCAPE: - translated_key = LV_KEY_ESC; - break; - case VK_DELETE: - translated_key = LV_KEY_DEL; - break; - case VK_BACK: - translated_key = LV_KEY_BACKSPACE; - break; - case VK_RETURN: - translated_key = LV_KEY_ENTER; - break; - case VK_TAB: - case VK_NEXT: - translated_key = LV_KEY_NEXT; - break; - case VK_PRIOR: - translated_key = LV_KEY_PREV; - break; - case VK_HOME: - translated_key = LV_KEY_HOME; - break; - case VK_END: - translated_key = LV_KEY_END; - break; - default: - skip_translation = true; - break; - } - - if(!skip_translation) { - lv_windows_push_key_to_keyboard_queue( - context, - translated_key, - ((uMsg == WM_KEYUP) - ? LV_INDEV_STATE_RELEASED - : LV_INDEV_STATE_PRESSED)); - } - } - - break; - } - case WM_CHAR: { - lv_windows_window_context_t * context = (lv_windows_window_context_t *)( - lv_windows_get_window_context(hWnd)); - if(context) { - uint16_t raw_code_point = (uint16_t)(wParam); - - if(raw_code_point >= 0x20 && raw_code_point != 0x7F) { - if(IS_HIGH_SURROGATE(raw_code_point)) { - context->keypad.utf16_high_surrogate = raw_code_point; - } - else if(IS_LOW_SURROGATE(raw_code_point)) { - context->keypad.utf16_low_surrogate = raw_code_point; - } - - uint32_t code_point = raw_code_point; - - if(context->keypad.utf16_high_surrogate && - context->keypad.utf16_low_surrogate) { - uint16_t high_surrogate = - context->keypad.utf16_high_surrogate; - uint16_t low_surrogate = - context->keypad.utf16_low_surrogate; - - code_point = (low_surrogate & 0x03FF); - code_point += (((high_surrogate & 0x03FF) + 0x40) << 10); - - context->keypad.utf16_high_surrogate = 0; - context->keypad.utf16_low_surrogate = 0; - } - - uint32_t lvgl_code_point = - lv_text_unicode_to_encoded(code_point); - - lv_windows_push_key_to_keyboard_queue( - context, - lvgl_code_point, - LV_INDEV_STATE_PRESSED); - lv_windows_push_key_to_keyboard_queue( - context, - lvgl_code_point, - LV_INDEV_STATE_RELEASED); - } - } - - break; - } - case WM_IME_SETCONTEXT: { - if(wParam == TRUE) { - HIMC imm_context_handle = lv_windows_imm_get_context(hWnd); - if(imm_context_handle) { - lv_windows_imm_associate_context( - hWnd, - imm_context_handle); - lv_windows_imm_release_context( - hWnd, - imm_context_handle); - } - } - - *plResult = DefWindowProcW(hWnd, uMsg, wParam, wParam); - break; - } - case WM_IME_STARTCOMPOSITION: { - HIMC imm_context_handle = lv_windows_imm_get_context(hWnd); - if(imm_context_handle) { - lv_obj_t * textarea_object = NULL; - lv_obj_t * focused_object = lv_group_get_focused( - lv_group_get_default()); - if(focused_object) { - const lv_obj_class_t * object_class = lv_obj_get_class( - focused_object); - - if(object_class == &lv_textarea_class) { - textarea_object = focused_object; - } - else if(object_class == &lv_keyboard_class) { - textarea_object = lv_keyboard_get_textarea(focused_object); - } - } - - COMPOSITIONFORM composition_form; - composition_form.dwStyle = CFS_POINT; - composition_form.ptCurrentPos.x = 0; - composition_form.ptCurrentPos.y = 0; - - if(textarea_object) { - lv_textarea_t * textarea = (lv_textarea_t *)(textarea_object); - lv_obj_t * label_object = lv_textarea_get_label(textarea_object); - - composition_form.ptCurrentPos.x = - label_object->coords.x1 + textarea->cursor.area.x1; - composition_form.ptCurrentPos.y = - label_object->coords.y1 + textarea->cursor.area.y1; - } - - lv_windows_imm_set_composition_window( - imm_context_handle, - &composition_form); - lv_windows_imm_release_context( - hWnd, - imm_context_handle); - } - - *plResult = DefWindowProcW(hWnd, uMsg, wParam, wParam); - break; - } - default: - // Not Handled - return false; - } - - // Handled - *plResult = 0; - return true; -} - -static void lv_windows_encoder_driver_read_callback( - lv_indev_t * indev, - lv_indev_data_t * data) -{ - lv_windows_window_context_t * context = lv_windows_get_window_context( - lv_windows_get_indev_window_handle(indev)); - if(!context) { - return; - } - - data->state = context->encoder.state; - data->enc_diff = context->encoder.enc_diff; - context->encoder.enc_diff = 0; -} - -static void lv_windows_release_encoder_device_event_callback(lv_event_t * e) -{ - lv_indev_t * indev = (lv_indev_t *)lv_event_get_user_data(e); - if(!indev) { - return; - } - - HWND window_handle = lv_windows_get_indev_window_handle(indev); - if(!window_handle) { - return; - } - - lv_windows_window_context_t * context = lv_windows_get_window_context( - window_handle); - if(!context) { - return; - } - - context->encoder.state = LV_INDEV_STATE_RELEASED; - context->encoder.enc_diff = 0; - - context->encoder.indev = NULL; -} - -bool lv_windows_encoder_device_window_message_handler( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT * plResult) -{ - LV_UNUSED(lParam); - - switch(uMsg) { - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: { - lv_windows_window_context_t * context = (lv_windows_window_context_t *)( - lv_windows_get_window_context(hWnd)); - if(context) { - context->encoder.state = ( - uMsg == WM_MBUTTONDOWN - ? LV_INDEV_STATE_PRESSED - : LV_INDEV_STATE_RELEASED); - } - - break; - } - case WM_MOUSEWHEEL: { - lv_windows_window_context_t * context = (lv_windows_window_context_t *)( - lv_windows_get_window_context(hWnd)); - if(context) { - context->encoder.enc_diff = - -(GET_WHEEL_DELTA_WPARAM(wParam) / WHEEL_DELTA); - } - - break; - } - default: - // Not Handled - return false; - } - - // Handled - *plResult = 0; - return true; -} - -#endif // LV_USE_WINDOWS diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_input.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_input.h deleted file mode 100644 index 892014e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_input.h +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @file lv_windows_input.h - * - */ - -#ifndef LV_WINDOWS_INPUT_H -#define LV_WINDOWS_INPUT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../display/lv_display.h" -#include "../../indev/lv_indev.h" - -#if LV_USE_WINDOWS - -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * @brief Get the window handle from specific LVGL input device object. - * @param indev The specific LVGL input device object. - * @return The window handle from specific LVGL input device object. -*/ -HWND lv_windows_get_indev_window_handle(lv_indev_t * indev); - -/** - * @brief Open a LVGL pointer input device object for the specific LVGL - * display object, or create it if the LVGL pointer input device - * object is not created or removed before. - * @param display The specific LVGL display object. - * @return The LVGL pointer input device object for the specific LVGL - * display object. -*/ -lv_indev_t * lv_windows_acquire_pointer_indev(lv_display_t * display); - -/** - * @brief Open a LVGL keypad input device object for the specific LVGL - * display object, or create it if the LVGL keypad input device - * object is not created or removed before. - * @param display The specific LVGL display object. - * @return The LVGL keypad input device object for the specific LVGL - * display object. -*/ -lv_indev_t * lv_windows_acquire_keypad_indev(lv_display_t * display); - -/** - * @brief Open a LVGL encoder input device object for the specific LVGL - * display object, or create it if the LVGL encoder input device - * object is not created or removed before. - * @param display The specific LVGL display object. - * @return The LVGL encoder input device object for the specific LVGL - * display object. -*/ -lv_indev_t * lv_windows_acquire_encoder_indev(lv_display_t * display); - -/********************** - * MACROS - **********************/ - -#endif // LV_USE_WINDOWS - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_WINDOWS_INPUT_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_input_private.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_input_private.h deleted file mode 100644 index 7d1096e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/windows/lv_windows_input_private.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @file lv_windows_input_private.h - * - */ - -#ifndef LV_WINDOWS_INPUT_PRIVATE_H -#define LV_WINDOWS_INPUT_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#if LV_USE_WINDOWS - -#include -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -bool lv_windows_pointer_device_window_message_handler( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT * plResult); - -bool lv_windows_keypad_device_window_message_handler( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT * plResult); - -bool lv_windows_encoder_device_window_message_handler( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT * plResult); - -/********************** - * MACROS - **********************/ - -#endif // LV_USE_WINDOWS - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_WINDOWS_INPUT_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/x11/lv_x11.h b/software/Power_Pico/Middlewares/LVGL/src/drivers/x11/lv_x11.h deleted file mode 100644 index 7daabe3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/x11/lv_x11.h +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @file lv_x11.h - * - */ - -#ifndef LV_X11_H -#define LV_X11_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../display/lv_display.h" -#include "../../indev/lv_indev.h" - -#if LV_USE_X11 - -/********************* - * DEFINES - *********************/ - -/** Header of private display driver user data - for internal use only */ -typedef struct { - struct _XDisplay * display; /**< X11 display object */ - struct _x11_inp_data * inp_data; /**< input user data object */ -} _x11_user_hdr_t; - -/** optional window close callback function type - * @see lv_x11_window_set_close_cb -*/ -typedef void(*lv_x11_close_cb)(void * user_data); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * create and add keyboard, mouse and scrollwheel objects and connect them to x11 display. - * - * This is a convenience method handling the typical input initialisation of an X11 window: - * - create keyboard (lv_x11_keyboard_create) - * - create mouse (with scrollwheel, lv_x11_mouse_create lv_x11_mousewheel_create) - * - * @param[in] disp the created X11 display object from @ref lv_x11_window_create - * @param[in] mouse_img optional image description for the mouse cursor (NULL for no/invisible mouse cursor) - */ -void lv_x11_inputs_create(lv_display_t * disp, lv_image_dsc_t const * mouse_img); - -/** - * create the X11 display - * - * The minimal initialisation for initializing the X11 display driver with keyboard/mouse support: - * @code - * lv_display_t* disp = lv_x11_window_create("My Window Title", window_width, window_width); - * lv_x11_inputs_create(disp, NULL); - * @endcode - * or with mouse cursor icon: - * @code - * lv_image_dsc_t mouse_symbol = {.....}; - * lv_display_t* disp = lv_x11_window_create("My Window Title", window_width, window_width); - * lv_x11_inputs_create(disp, &mouse_symbol); - * @endcode - * - * @param[in] title title of the created X11 window - * @param[in] hor_res horizontal resolution (=width) of the X11 window - * @param[in] ver_res vertical resolution (=height) of the X11 window - * @return pointer to the display object - */ -lv_display_t * lv_x11_window_create(char const * title, int32_t hor_res, int32_t ver_res); - -#endif /* LV_USE_X11 */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_X11_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/x11/lv_x11_display.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/x11/lv_x11_display.c deleted file mode 100644 index 1a2b83c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/x11/lv_x11_display.c +++ /dev/null @@ -1,394 +0,0 @@ -/** - * @file lv_x11_display.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_x11.h" - -#if LV_USE_X11 - -#include -#include -#include -#include -#include -#include -#include "../../core/lv_obj_pos.h" - -/********************* - * DEFINES - *********************/ -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#define MAX(A, B) ((A) > (B) ? (A) : (B)) - -#if LV_X11_RENDER_MODE_PARTIAL - #define LV_X11_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL -#elif defined LV_X11_RENDER_MODE_DIRECT - #define LV_X11_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT -#elif defined LV_X11_RENDER_MODE_FULL - #define LV_X11_RENDER_MODE LV_DISPLAY_RENDER_MODE_FULL -#endif - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - /* header (containing X Display + input user data pointer - keep aligned with x11_input module!) */ - _x11_user_hdr_t hdr; - /* X11 related information */ - Window window; /**< X11 window object */ - GC gc; /**< X11 graphics context object */ - Visual * visual; /**< X11 visual */ - int dplanes; /**< X11 display depth */ - XImage * ximage; /**< X11 XImage cache object for updating window content */ - Atom wmDeleteMessage; /**< X11 atom to window object */ - void * xdata; /**< allocated data for XImage */ - /* LVGL related information */ - lv_timer_t * timer; /**< timer object for @ref x11_event_handler */ - uint8_t * buffer[2]; /**< (double) lv display buffers, depending on @ref LV_X11_RENDER_MODE */ - lv_area_t flush_area; /**< integrated area for a display update */ - /* systemtick by thread related information */ - pthread_t thr_tick; /**< pthread for SysTick simulation */ - bool terminated; /**< flag to germinate SysTick simulation thread */ -} x11_disp_data_t; - -/********************** - * STATIC VARIABLES - **********************/ -#if LV_X11_DIRECT_EXIT - static unsigned int count_windows = 0; -#endif - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -#if LV_COLOR_DEPTH == 32 -typedef lv_color32_t color_t; -static inline lv_color32_t get_px(color_t p) -{ - return (lv_color32_t)p; -} -#elif LV_COLOR_DEPTH == 24 -typedef lv_color_t color_t; -static inline lv_color32_t get_px(color_t p) -{ - lv_color32_t out = { .red = p.red, .green = p.green, .blue = p.blue }; - return out; -} -#elif LV_COLOR_DEPTH == 16 -typedef lv_color16_t color_t; -static inline lv_color32_t get_px(color_t p) -{ - lv_color32_t out = { .red = p.red << 3, .green = p.green << 2, .blue = p.blue << 3 }; - return out; -} -#elif LV_COLOR_DEPTH == 8 -typedef uint8_t color_t; -static inline lv_color32_t get_px(color_t p) -{ - lv_color32_t out = { .red = p, .green = p, .blue = p }; - return out; -} -#warning ("LV_COLOR_DEPTH=8 delivers black data only - open issue in lvgl?") -#else -#error ("Unsupported LV_COLOR_DEPTH") -#endif - -/** - * Flush the content of the internal buffer the specific area on the display. - * @param[in] disp the created X11 display object from @lv_x11_window_create - * @param[in] area area to be updated - * @param[in] px_map contains the rendered image as raw pixel map and it should be copied to `area` on the display. - * @note @ref lv_display_flush_ready has to be called when it's finished. - */ -static void x11_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) -{ - x11_disp_data_t * xd = lv_display_get_driver_data(disp); - LV_ASSERT_NULL(xd); - - static const lv_area_t inv_area = { .x1 = 0xFFFF, - .x2 = 0, - .y1 = 0xFFFF, - .y2 = 0 - }; - - /* build display update area until lv_display_flush_is_last */ - xd->flush_area.x1 = MIN(xd->flush_area.x1, area->x1); - xd->flush_area.x2 = MAX(xd->flush_area.x2, area->x2); - xd->flush_area.y1 = MIN(xd->flush_area.y1, area->y1); - xd->flush_area.y2 = MAX(xd->flush_area.y2, area->y2); - - int32_t hor_res = lv_display_get_horizontal_resolution(disp); - - uint32_t dst_offs; - lv_color32_t * dst_data; - color_t * src_data = (color_t *)px_map + (LV_X11_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL ? 0 : hor_res * - area->y1 + area->x1); - for(int16_t y = area->y1; y <= area->y2; y++) { - dst_offs = area->x1 + y * hor_res; - dst_data = &((lv_color32_t *)(xd->xdata))[dst_offs]; - for(int16_t x = area->x1; x <= area->x2; x++, src_data++, dst_data++) { - *dst_data = get_px(*src_data); - } - src_data += (LV_X11_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL ? 0 : hor_res - (area->x2 - area->x1 + 1)); - } - - if(lv_display_flush_is_last(disp)) { - LV_LOG_TRACE("(%d/%d), %dx%d)", xd->flush_area.x1, xd->flush_area.y1, xd->flush_area.x2 + 1 - xd->flush_area.x1, - xd->flush_area.y2 + 1 - xd->flush_area.y1); - - /* refresh collected display update area only */ - int16_t upd_w = xd->flush_area.x2 - xd->flush_area.x1 + 1; - int16_t upd_h = xd->flush_area.y2 - xd->flush_area.y1 + 1; - XPutImage(xd->hdr.display, xd->window, xd->gc, xd->ximage, xd->flush_area.x1, xd->flush_area.y1, xd->flush_area.x1, - xd->flush_area.y1, upd_w, upd_h); - - /* invalidate collected area */ - xd->flush_area = inv_area; - } - /* Inform the graphics library that you are ready with the flushing */ - lv_display_flush_ready(disp); -} - -/** - * event called by lvgl display if resolution has been changed (@ref lv_display_set_resolution has been called) - * @param[in] e event data, containing lv_display_t object - */ -static void x11_resolution_evt_cb(lv_event_t * e) -{ - lv_display_t * disp = lv_event_get_user_data(e); - x11_disp_data_t * xd = lv_display_get_driver_data(disp); - LV_ASSERT_NULL(xd); - - int32_t hor_res = lv_display_get_horizontal_resolution(disp); - int32_t ver_res = lv_display_get_vertical_resolution(disp); - - if(LV_X11_RENDER_MODE != LV_DISPLAY_RENDER_MODE_PARTIAL) { - /* update lvgl full-screen display draw buffers for new display size */ - int sz_buffers = (hor_res * ver_res * (LV_COLOR_DEPTH + 7) / 8); - xd->buffer[0] = realloc(xd->buffer[0], sz_buffers); - xd->buffer[1] = (LV_X11_DOUBLE_BUFFER ? realloc(xd->buffer[1], sz_buffers) : NULL); - lv_display_set_buffers(disp, xd->buffer[0], xd->buffer[1], sz_buffers, LV_X11_RENDER_MODE); - } - - /* re-create cache image with new size */ - XDestroyImage(xd->ximage); - size_t sz_buffers = hor_res * ver_res * sizeof(lv_color32_t); - xd->xdata = malloc(sz_buffers); /* use clib method here, x11 memory not part of device footprint */ - xd->ximage = XCreateImage(xd->hdr.display, xd->visual, xd->dplanes, ZPixmap, 0, xd->xdata, - hor_res, ver_res, lv_color_format_get_bpp(LV_COLOR_FORMAT_ARGB8888), 0); -} - -/** - * event called by lvgl display if display has been closed (@ref lv_display_delete has been called) - * @param[in] e event data, containing lv_display_t object - */ -static void x11_disp_delete_evt_cb(lv_event_t * e) -{ - lv_display_t * disp = lv_event_get_user_data(e); - x11_disp_data_t * xd = lv_display_get_driver_data(disp); - - lv_timer_delete(xd->timer); - - free(xd->buffer[0]); - if(LV_X11_DOUBLE_BUFFER) { - free(xd->buffer[1]); - } - - XDestroyImage(xd->ximage); - XFreeGC(xd->hdr.display, xd->gc); - XUnmapWindow(xd->hdr.display, xd->window); - XDestroyWindow(xd->hdr.display, xd->window); - XFlush(xd->hdr.display); - - lv_free(xd); -#if LV_X11_DIRECT_EXIT - if(0 == --count_windows) { - exit(0); - } -#endif -} - -static void x11_hide_cursor(lv_display_t * disp) -{ - x11_disp_data_t * xd = lv_display_get_driver_data(disp); - LV_ASSERT_NULL(xd); - - XColor black = { .red = 0, .green = 0, .blue = 0 }; - char empty_data[] = { 0 }; - - Pixmap empty_bitmap = XCreateBitmapFromData(xd->hdr.display, xd->window, empty_data, 1, 1); - Cursor inv_cursor = XCreatePixmapCursor(xd->hdr.display, empty_bitmap, empty_bitmap, &black, &black, 0, 0); - XDefineCursor(xd->hdr.display, xd->window, inv_cursor); - XFreeCursor(xd->hdr.display, inv_cursor); - XFreePixmap(xd->hdr.display, empty_bitmap); -} - -/** - * X11 input event handler, predicated to fetch and handle only display related events - * (Window changes) - */ -static int is_disp_event(Display * disp, XEvent * event, XPointer arg) -{ - LV_UNUSED(disp); - LV_UNUSED(arg); - return (event->type == Expose - || (event->type >= DestroyNotify && event->type <= CirculateNotify) /* events from StructureNotifyMask */ - || event->type == ClientMessage); -} -static void x11_event_handler(lv_timer_t * t) -{ - lv_display_t * disp = lv_timer_get_user_data(t); - x11_disp_data_t * xd = lv_display_get_driver_data(disp); - LV_ASSERT_NULL(xd); - - /* handle all outstanding X events */ - XEvent event; - while(XCheckIfEvent(xd->hdr.display, &event, is_disp_event, NULL)) { - LV_LOG_TRACE("Display Event %d", event.type); - switch(event.type) { - case Expose: - if(event.xexpose.count == 0) { - XPutImage(xd->hdr.display, xd->window, xd->gc, xd->ximage, 0, 0, 0, 0, event.xexpose.width, event.xexpose.height); - } - break; - case ConfigureNotify: - if(event.xconfigure.width != lv_display_get_horizontal_resolution(disp) - || event.xconfigure.height != lv_display_get_vertical_resolution(disp)) { - lv_display_set_resolution(disp, event.xconfigure.width, event.xconfigure.height); - } - break; - case ClientMessage: - if(event.xclient.data.l[0] == (long)xd->wmDeleteMessage) { - xd->terminated = true; - void * ret = NULL; - pthread_join(xd->thr_tick, &ret); - lv_display_delete(disp); - return; - } - break; - case MapNotify: - case ReparentNotify: - /*suppress unhandled warning*/ - break; - default: - LV_LOG_WARN("unhandled x11 event: %d", event.type); - } - } -} - -static void * x11_tick_thread(void * data) -{ - x11_disp_data_t * xd = data; - LV_ASSERT_NULL(xd); - - while(!xd->terminated) { - usleep(5000); - lv_tick_inc(5); - } - return NULL; -} - -static void x11_window_create(lv_display_t * disp, char const * title) -{ - x11_disp_data_t * xd = lv_display_get_driver_data(disp); - LV_ASSERT_NULL(xd); - - /* setup display/screen */ - xd->hdr.display = XOpenDisplay(NULL); - int screen = XDefaultScreen(xd->hdr.display); - xd->visual = XDefaultVisual(xd->hdr.display, screen); - - /* create window */ - int32_t hor_res = lv_display_get_horizontal_resolution(disp); - int32_t ver_res = lv_display_get_vertical_resolution(disp); -#if 0 - /* drawing contexts for an window */ - unsigned long col_fg = BlackPixel(xd->hdr.display, screen); - unsigned long col_bg = WhitePixel(xd->hdr.display, screen); - - xd->window = XCreateSimpleWindow(xd->hdr.display, DefaultRootWindow(xd->hdr.display), - 0, 0, hor_res, ver_res, 0, col_fg, col_bg); -#else - xd->window = XCreateWindow(xd->hdr.display, XDefaultRootWindow(xd->hdr.display), - 0, 0, hor_res, ver_res, 0, - XDefaultDepth(xd->hdr.display, screen), InputOutput, - xd->visual, 0, NULL); -#endif - /* window manager properties (yes, use of StdProp is obsolete) */ - XSetStandardProperties(xd->hdr.display, xd->window, title, NULL, None, NULL, 0, NULL); - xd->gc = XCreateGC(xd->hdr.display, xd->window, 0, 0); - - /* allow receiving mouse, keyboard and window change/close events */ - XSelectInput(xd->hdr.display, xd->window, - PointerMotionMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask | ExposureMask | - StructureNotifyMask); - xd->wmDeleteMessage = XInternAtom(xd->hdr.display, "WM_DELETE_WINDOW", False); - XSetWMProtocols(xd->hdr.display, xd->window, &xd->wmDeleteMessage, 1); - - x11_hide_cursor(disp); - - /* create cache XImage */ - size_t sz_buffers = hor_res * ver_res * sizeof(lv_color32_t); - xd->dplanes = XDisplayPlanes(xd->hdr.display, screen); - xd->xdata = malloc(sz_buffers); /* use clib method here, x11 memory not part of device footprint */ - xd->ximage = XCreateImage(xd->hdr.display, xd->visual, xd->dplanes, ZPixmap, 0, xd->xdata, - hor_res, ver_res, lv_color_format_get_bpp(LV_COLOR_FORMAT_ARGB8888), 0); - - /* finally bring window on top of the other windows */ - XMapRaised(xd->hdr.display, xd->window); - -#if LV_X11_DIRECT_EXIT - count_windows++; -#endif -} - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_display_t * lv_x11_window_create(char const * title, int32_t hor_res, int32_t ver_res) -{ - x11_disp_data_t * xd = lv_malloc_zeroed(sizeof(x11_disp_data_t)); - LV_ASSERT_MALLOC(xd); - if(NULL == xd) return NULL; - - lv_display_t * disp = lv_display_create(hor_res, ver_res); - if(NULL == disp) { - lv_free(xd); - return NULL; - } - lv_display_set_driver_data(disp, xd); - lv_display_set_flush_cb(disp, x11_flush_cb); - lv_display_add_event_cb(disp, x11_resolution_evt_cb, LV_EVENT_RESOLUTION_CHANGED, disp); - lv_display_add_event_cb(disp, x11_disp_delete_evt_cb, LV_EVENT_DELETE, disp); - - x11_window_create(disp, title); - - int sz_buffers = (hor_res * ver_res * (LV_COLOR_DEPTH + 7) / 8); - if(LV_X11_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { - sz_buffers /= 10; - } - xd->buffer[0] = malloc(sz_buffers); - xd->buffer[1] = (LV_X11_DOUBLE_BUFFER ? malloc(sz_buffers) : NULL); - lv_display_set_buffers(disp, xd->buffer[0], xd->buffer[1], sz_buffers, LV_X11_RENDER_MODE); - - xd->timer = lv_timer_create(x11_event_handler, 5, disp); - - /* initialize Tick simulation */ - xd->terminated = false; - pthread_create(&xd->thr_tick, NULL, x11_tick_thread, xd); - - return disp; -} - -#endif /*LV_USE_X11*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/drivers/x11/lv_x11_input.c b/software/Power_Pico/Middlewares/LVGL/src/drivers/x11/lv_x11_input.c deleted file mode 100644 index ecbd8d4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/drivers/x11/lv_x11_input.c +++ /dev/null @@ -1,324 +0,0 @@ -/** - * @file lv_x11_input.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_x11.h" - -#if LV_USE_X11 - -#include -#include -#include -#include -#include "../../widgets/image/lv_image.h" - -/********************* - * DEFINES - *********************/ -#define MIN(A, B) ((A) < (B) ? (A) : (B)) - -/********************** - * TYPEDEFS - **********************/ - -typedef struct _x11_inp_data { - /* LVGL related information */ - lv_group_t * inp_group; /**< input group for X input elements */ - lv_indev_t * keyboard; /**< keyboard input device object */ - lv_indev_t * mousepointer; /**< mouse input device object */ - lv_indev_t * mousewheel; /**< encoder input device object */ - lv_timer_t * timer; /**< timer object for @ref x11_event_handler */ - /* user input related information */ - char kb_buffer[32]; /**< keyboard buffer for X keyboard inputs */ - lv_point_t mouse_pos; /**< current reported mouse position */ - bool left_mouse_btn; /**< current state of left mouse button */ - bool right_mouse_btn; /**< current state of right mouse button */ - bool wheel_mouse_btn; /**< current state of wheel (=middle) mouse button */ - int16_t wheel_cnt; /**< mouse wheel increments */ -} x11_inp_data_t; - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * X11 input event handler, predicated to fetch and handle only input related events - * (MotionNotify, ButtonPress/Release, KeyPress/Release) - */ -static int is_inp_event(Display * disp, XEvent * event, XPointer arg) -{ - LV_UNUSED(disp); - LV_UNUSED(arg); - return !(event->type == Expose - || (event->type >= DestroyNotify && event->type <= CirculateNotify) /* events from StructureNotifyMask */ - || event->type == ClientMessage); -} -static void x11_inp_event_handler(lv_timer_t * t) -{ - lv_display_t * disp = lv_timer_get_user_data(t); - _x11_user_hdr_t * disp_hdr = lv_display_get_driver_data(disp); - x11_inp_data_t * xd = disp_hdr->inp_data; - - /* handle all outstanding X events */ - XEvent event; - while(XCheckIfEvent(disp_hdr->display, &event, is_inp_event, NULL)) { - LV_LOG_TRACE("Input Event %d", event.type); - switch(event.type) { - case MotionNotify: - xd->mouse_pos.x = event.xmotion.x; - xd->mouse_pos.y = event.xmotion.y; - break; - case ButtonPress: - switch(event.xbutton.button) { - case Button1: - xd->left_mouse_btn = true; - break; - case Button2: - xd->wheel_mouse_btn = true; - break; - case Button3: - xd->right_mouse_btn = true; - break; - case Button4: /* Scrolled up */ - xd->wheel_cnt--; - break; - case Button5: /* Scrolled down */ - xd->wheel_cnt++; - break; - default: - LV_LOG_WARN("unhandled button press : %d", event.xbutton.button); - } - break; - case ButtonRelease: - switch(event.xbutton.button) { - case Button1: - xd->left_mouse_btn = false; - break; - case Button2: - xd->wheel_mouse_btn = false; - break; - case Button3: - xd->right_mouse_btn = false; - break; - } - break; - case KeyPress: { - size_t len = strlen(xd->kb_buffer); - if(len < (sizeof(xd->kb_buffer) - 2 /* space for 1 char + '\0' */)) { - KeySym key; - int n = XLookupString(&event.xkey, &xd->kb_buffer[len], sizeof(xd->kb_buffer) - (len + 1), &key, NULL); - n += !!key; - switch(key) { - case XK_Home: - case XK_KP_Home: - xd->kb_buffer[len] = LV_KEY_HOME; - break; - case XK_Left: - case XK_KP_Left: - xd->kb_buffer[len] = LV_KEY_LEFT; - break; - case XK_Up: - case XK_KP_Up: - xd->kb_buffer[len] = LV_KEY_UP; - break; - case XK_Right: - case XK_KP_Right: - xd->kb_buffer[len] = LV_KEY_RIGHT; - break; - case XK_Down: - case XK_KP_Down: - xd->kb_buffer[len] = LV_KEY_DOWN; - break; - case XK_Prior: - case XK_KP_Prior: - xd->kb_buffer[len] = LV_KEY_PREV; - break; - case XK_Next: - case XK_KP_Next: - xd->kb_buffer[len] = LV_KEY_NEXT; - break; - case XK_End: - case XK_KP_End: - xd->kb_buffer[len] = LV_KEY_END; - break; - case XK_BackSpace: - xd->kb_buffer[len] = LV_KEY_BACKSPACE; - break; - case XK_Escape: - xd->kb_buffer[len] = LV_KEY_ESC; - break; - case XK_Delete: - case XK_KP_Delete: - xd->kb_buffer[len] = LV_KEY_DEL; - break; - case XK_KP_Enter: - xd->kb_buffer[len] = LV_KEY_ENTER; - break; - } - xd->kb_buffer[len + n] = '\0'; - } - } - break; - case KeyRelease: - break; - default: - LV_LOG_WARN("unhandled x11 event: %d", event.type); - } - } -} - -/** - * event called by lvgl display if display has been closed (@ref lv_display_delete has been called) - * @param[in] e event data, containing lv_display_t object - */ -static void x11_inp_delete_evt_cb(lv_event_t * e) -{ - x11_inp_data_t * xd = (x11_inp_data_t *)lv_event_get_user_data(e); - - lv_timer_delete(xd->timer); - lv_free(xd); -} - -/** - * create the local data/timers for the X11 input functionality. - * extracts the user data information from lv_display_t object and initializes the input user object on 1st use. - * @param[in] disp the created X11 display object from @lv_x11_window_create - * @return pointer to the local user data object @x11_inp_data_t - */ -static x11_inp_data_t * x11_input_get_user_data(lv_display_t * disp) -{ - _x11_user_hdr_t * disp_hdr = lv_display_get_driver_data(disp); - LV_ASSERT_NULL(disp_hdr); - x11_inp_data_t ** inp_data = &disp_hdr->inp_data; - - /* create input data set if initial call */ - if(NULL == *inp_data) { - *inp_data = lv_malloc_zeroed(sizeof(x11_inp_data_t)); - LV_ASSERT_MALLOC(*inp_data); - if(NULL != *inp_data) { - /* initialize timer callback for X11 kb/mouse input event reading */ - (*inp_data)->timer = lv_timer_create(x11_inp_event_handler, 1, disp); - lv_display_add_event_cb(disp, x11_inp_delete_evt_cb, LV_EVENT_DELETE, *inp_data); - } - } - return *inp_data; -} - -static void x11_keyboard_read_cb(lv_indev_t * indev, lv_indev_data_t * data) -{ - lv_display_t * disp = lv_indev_get_driver_data(indev); - x11_inp_data_t * xd = x11_input_get_user_data(disp); - - size_t len = strlen(xd->kb_buffer); - if(len > 0) { - data->state = LV_INDEV_STATE_PRESSED; - data->key = xd->kb_buffer[0]; - memmove(xd->kb_buffer, xd->kb_buffer + 1, len); - data->continue_reading = (len > 0); - } - else { - data->state = LV_INDEV_STATE_RELEASED; - } -} - -static void x11_mouse_read_cb(lv_indev_t * indev, lv_indev_data_t * data) -{ - lv_display_t * disp = lv_indev_get_driver_data(indev); - x11_inp_data_t * xd = x11_input_get_user_data(disp); - - int32_t hor_res = lv_display_get_horizontal_resolution(disp); - int32_t ver_res = lv_display_get_vertical_resolution(disp); - - xd->mouse_pos.x = MIN(xd->mouse_pos.x, hor_res - 1); - xd->mouse_pos.y = MIN(xd->mouse_pos.y, ver_res - 1); - - data->point = xd->mouse_pos; - data->state = xd->left_mouse_btn ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; -} - -static void x11_mousewheel_read_cb(lv_indev_t * indev, lv_indev_data_t * data) -{ - lv_display_t * disp = lv_indev_get_driver_data(indev); - x11_inp_data_t * xd = x11_input_get_user_data(disp); - - data->state = xd->wheel_mouse_btn ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; - data->enc_diff = xd->wheel_cnt; - xd->wheel_cnt = 0; -} - -static lv_indev_t * lv_x11_keyboard_create(lv_display_t * disp) -{ - lv_indev_t * indev = lv_indev_create(); - LV_ASSERT_NULL(indev); - if(NULL != indev) { - lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD); - lv_indev_set_read_cb(indev, x11_keyboard_read_cb); - lv_indev_set_driver_data(indev, disp); - } - return indev; -} - -static lv_indev_t * lv_x11_mouse_create(lv_display_t * disp, lv_image_dsc_t const * symb) -{ - lv_indev_t * indev = lv_indev_create(); - if(NULL != indev) { - lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); - lv_indev_set_read_cb(indev, x11_mouse_read_cb); - lv_indev_set_driver_data(indev, disp); - - /* optional mouse cursor symbol */ - if(NULL != symb) { - lv_obj_t * mouse_cursor = lv_image_create(lv_screen_active()); - lv_image_set_src(mouse_cursor, symb); - lv_indev_set_cursor(indev, mouse_cursor); - } - } - return indev; -} - -static lv_indev_t * lv_x11_mousewheel_create(lv_display_t * disp) -{ - lv_indev_t * indev = lv_indev_create(); - if(NULL != indev) { - lv_indev_set_type(indev, LV_INDEV_TYPE_ENCODER); - lv_indev_set_read_cb(indev, x11_mousewheel_read_cb); - lv_indev_set_driver_data(indev, disp); - } - return indev; -} - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_x11_inputs_create(lv_display_t * disp, lv_image_dsc_t const * mouse_img) -{ - x11_inp_data_t * xd = x11_input_get_user_data(disp); - LV_ASSERT_NULL(xd); - - xd->inp_group = lv_group_create(); - lv_group_set_default(xd->inp_group); - - xd->mousepointer = lv_x11_mouse_create(disp, mouse_img); - lv_indev_set_group(xd->mousepointer, xd->inp_group); - - xd->mousewheel = lv_x11_mousewheel_create(disp); - lv_indev_set_group(xd->mousewheel, xd->inp_group); - - xd->keyboard = lv_x11_keyboard_create(disp); - lv_indev_set_group(xd->keyboard, xd->inp_group); -} - -#endif /*LV_USE_X11*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_binfont_loader.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_binfont_loader.c deleted file mode 100644 index 4746026..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_binfont_loader.c +++ /dev/null @@ -1,658 +0,0 @@ -/** - * @file lv_binfont_loader.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_font_fmt_txt_private.h" -#include "../lvgl.h" -#include "../misc/lv_fs_private.h" -#include "../misc/lv_types.h" -#include "../stdlib/lv_string.h" -#include "lv_binfont_loader.h" - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_fs_file_t * fp; - int8_t bit_pos; - uint8_t byte_value; -} bit_iterator_t; - -typedef struct font_header_bin { - uint32_t version; - uint16_t tables_count; - uint16_t font_size; - uint16_t ascent; - int16_t descent; - uint16_t typo_ascent; - int16_t typo_descent; - uint16_t typo_line_gap; - int16_t min_y; - int16_t max_y; - uint16_t default_advance_width; - uint16_t kerning_scale; - uint8_t index_to_loc_format; - uint8_t glyph_id_format; - uint8_t advance_width_format; - uint8_t bits_per_pixel; - uint8_t xy_bits; - uint8_t wh_bits; - uint8_t advance_width_bits; - uint8_t compression_id; - uint8_t subpixels_mode; - uint8_t padding; - int16_t underline_position; - uint16_t underline_thickness; -} font_header_bin_t; - -typedef struct cmap_table_bin { - uint32_t data_offset; - uint32_t range_start; - uint16_t range_length; - uint16_t glyph_id_start; - uint16_t data_entries_count; - uint8_t format_type; - uint8_t padding; -} cmap_table_bin_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static bit_iterator_t init_bit_iterator(lv_fs_file_t * fp); -static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font); -int32_t load_kern(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint8_t format, uint32_t start); - -static int read_bits_signed(bit_iterator_t * it, int n_bits, lv_fs_res_t * res); -static unsigned int read_bits(bit_iterator_t * it, int n_bits, lv_fs_res_t * res); - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_font_t * lv_binfont_create(const char * path) -{ - LV_ASSERT_NULL(path); - - lv_fs_file_t file; - lv_fs_res_t fs_res = lv_fs_open(&file, path, LV_FS_MODE_RD); - if(fs_res != LV_FS_RES_OK) return NULL; - - lv_font_t * font = lv_malloc_zeroed(sizeof(lv_font_t)); - LV_ASSERT_MALLOC(font); - - if(!lvgl_load_font(&file, font)) { - LV_LOG_WARN("Error loading font file: %s", path); - /* - * When `lvgl_load_font` fails it can leak some pointers. - * All non-null pointers can be assumed as allocated and - * `lv_binfont_destroy` should free them correctly. - */ - lv_binfont_destroy(font); - font = NULL; - } - - lv_fs_close(&file); - - return font; -} - -#if LV_USE_FS_MEMFS -lv_font_t * lv_binfont_create_from_buffer(void * buffer, uint32_t size) -{ - lv_fs_path_ex_t mempath; - - lv_fs_make_path_from_buffer(&mempath, LV_FS_MEMFS_LETTER, buffer, size); - return lv_binfont_create((const char *)&mempath); -} -#endif - -void lv_binfont_destroy(lv_font_t * font) -{ - if(font == NULL) return; - - const lv_font_fmt_txt_dsc_t * dsc = font->dsc; - if(dsc == NULL) return; - - if(dsc->kern_classes == 0) { - const lv_font_fmt_txt_kern_pair_t * kern_dsc = dsc->kern_dsc; - if(NULL != kern_dsc) { - lv_free((void *)kern_dsc->glyph_ids); - lv_free((void *)kern_dsc->values); - lv_free((void *)kern_dsc); - } - } - else { - const lv_font_fmt_txt_kern_classes_t * kern_dsc = dsc->kern_dsc; - if(NULL != kern_dsc) { - lv_free((void *)kern_dsc->class_pair_values); - lv_free((void *)kern_dsc->left_class_mapping); - lv_free((void *)kern_dsc->right_class_mapping); - lv_free((void *)kern_dsc); - } - } - - const lv_font_fmt_txt_cmap_t * cmaps = dsc->cmaps; - if(NULL != cmaps) { - for(int i = 0; i < dsc->cmap_num; ++i) { - lv_free((void *)cmaps[i].glyph_id_ofs_list); - lv_free((void *)cmaps[i].unicode_list); - } - lv_free((void *)cmaps); - } - - lv_free((void *)dsc->glyph_bitmap); - lv_free((void *)dsc->glyph_dsc); - lv_free((void *)dsc); - lv_free(font); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static bit_iterator_t init_bit_iterator(lv_fs_file_t * fp) -{ - bit_iterator_t it; - it.fp = fp; - it.bit_pos = -1; - it.byte_value = 0; - return it; -} - -static unsigned int read_bits(bit_iterator_t * it, int n_bits, lv_fs_res_t * res) -{ - unsigned int value = 0; - while(n_bits--) { - it->byte_value = it->byte_value << 1; - it->bit_pos--; - - if(it->bit_pos < 0) { - it->bit_pos = 7; - *res = lv_fs_read(it->fp, &(it->byte_value), 1, NULL); - if(*res != LV_FS_RES_OK) { - return 0; - } - } - int8_t bit = (it->byte_value & 0x80) ? 1 : 0; - - value |= (bit << n_bits); - } - *res = LV_FS_RES_OK; - return value; -} - -static int read_bits_signed(bit_iterator_t * it, int n_bits, lv_fs_res_t * res) -{ - unsigned int value = read_bits(it, n_bits, res); - if(value & (1 << (n_bits - 1))) { - value |= ~0u << n_bits; - } - return value; -} - -static int read_label(lv_fs_file_t * fp, int start, const char * label) -{ - lv_fs_seek(fp, start, LV_FS_SEEK_SET); - - uint32_t length; - char buf[4]; - - if(lv_fs_read(fp, &length, 4, NULL) != LV_FS_RES_OK - || lv_fs_read(fp, buf, 4, NULL) != LV_FS_RES_OK - || lv_memcmp(label, buf, 4) != 0) { - LV_LOG_WARN("Error reading '%s' label.", label); - return -1; - } - - return length; -} - -static bool load_cmaps_tables(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, - uint32_t cmaps_start, cmap_table_bin_t * cmap_table) -{ - if(lv_fs_read(fp, cmap_table, font_dsc->cmap_num * sizeof(cmap_table_bin_t), NULL) != LV_FS_RES_OK) { - return false; - } - - for(unsigned int i = 0; i < font_dsc->cmap_num; ++i) { - lv_fs_res_t res = lv_fs_seek(fp, cmaps_start + cmap_table[i].data_offset, LV_FS_SEEK_SET); - if(res != LV_FS_RES_OK) { - return false; - } - - lv_font_fmt_txt_cmap_t * cmap = (lv_font_fmt_txt_cmap_t *) & (font_dsc->cmaps[i]); - - cmap->range_start = cmap_table[i].range_start; - cmap->range_length = cmap_table[i].range_length; - cmap->glyph_id_start = cmap_table[i].glyph_id_start; - cmap->type = cmap_table[i].format_type; - - switch(cmap_table[i].format_type) { - case LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL: { - uint8_t ids_size = (uint8_t)(sizeof(uint8_t) * cmap_table[i].data_entries_count); - uint8_t * glyph_id_ofs_list = lv_malloc(ids_size); - - cmap->glyph_id_ofs_list = glyph_id_ofs_list; - - if(lv_fs_read(fp, glyph_id_ofs_list, ids_size, NULL) != LV_FS_RES_OK) { - return false; - } - - cmap->list_length = cmap->range_length; - break; - } - case LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY: - break; - case LV_FONT_FMT_TXT_CMAP_SPARSE_FULL: - case LV_FONT_FMT_TXT_CMAP_SPARSE_TINY: { - uint32_t list_size = sizeof(uint16_t) * cmap_table[i].data_entries_count; - uint16_t * unicode_list = (uint16_t *)lv_malloc(list_size); - - cmap->unicode_list = unicode_list; - cmap->list_length = cmap_table[i].data_entries_count; - - if(lv_fs_read(fp, unicode_list, list_size, NULL) != LV_FS_RES_OK) { - return false; - } - - if(cmap_table[i].format_type == LV_FONT_FMT_TXT_CMAP_SPARSE_FULL) { - uint16_t * buf = lv_malloc(sizeof(uint16_t) * cmap->list_length); - - cmap->glyph_id_ofs_list = buf; - - if(lv_fs_read(fp, buf, sizeof(uint16_t) * cmap->list_length, NULL) != LV_FS_RES_OK) { - return false; - } - } - break; - } - default: - LV_LOG_WARN("Unknown cmaps format type %d.", cmap_table[i].format_type); - return false; - } - } - return true; -} - -static int32_t load_cmaps(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint32_t cmaps_start) -{ - int32_t cmaps_length = read_label(fp, cmaps_start, "cmap"); - if(cmaps_length < 0) { - return -1; - } - - uint32_t cmaps_subtables_count; - if(lv_fs_read(fp, &cmaps_subtables_count, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { - return -1; - } - - lv_font_fmt_txt_cmap_t * cmaps = - lv_malloc(cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t)); - - lv_memset(cmaps, 0, cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t)); - - font_dsc->cmaps = cmaps; - font_dsc->cmap_num = cmaps_subtables_count; - - cmap_table_bin_t * cmaps_tables = lv_malloc(sizeof(cmap_table_bin_t) * font_dsc->cmap_num); - - bool success = load_cmaps_tables(fp, font_dsc, cmaps_start, cmaps_tables); - - lv_free(cmaps_tables); - - return success ? cmaps_length : -1; -} - -static int32_t load_glyph(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, - uint32_t start, uint32_t * glyph_offset, uint32_t loca_count, font_header_bin_t * header) -{ - int32_t glyph_length = read_label(fp, start, "glyf"); - if(glyph_length < 0) { - return -1; - } - - lv_font_fmt_txt_glyph_dsc_t * glyph_dsc = (lv_font_fmt_txt_glyph_dsc_t *) - lv_malloc(loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t)); - - lv_memset(glyph_dsc, 0, loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t)); - - font_dsc->glyph_dsc = glyph_dsc; - - int cur_bmp_size = 0; - - for(unsigned int i = 0; i < loca_count; ++i) { - lv_font_fmt_txt_glyph_dsc_t * gdsc = &glyph_dsc[i]; - - lv_fs_res_t res = lv_fs_seek(fp, start + glyph_offset[i], LV_FS_SEEK_SET); - if(res != LV_FS_RES_OK) { - return -1; - } - - bit_iterator_t bit_it = init_bit_iterator(fp); - - if(header->advance_width_bits == 0) { - gdsc->adv_w = header->default_advance_width; - } - else { - gdsc->adv_w = read_bits(&bit_it, header->advance_width_bits, &res); - if(res != LV_FS_RES_OK) { - return -1; - } - } - - if(header->advance_width_format == 0) { - gdsc->adv_w *= 16; - } - - gdsc->ofs_x = read_bits_signed(&bit_it, header->xy_bits, &res); - if(res != LV_FS_RES_OK) { - return -1; - } - - gdsc->ofs_y = read_bits_signed(&bit_it, header->xy_bits, &res); - if(res != LV_FS_RES_OK) { - return -1; - } - - gdsc->box_w = read_bits(&bit_it, header->wh_bits, &res); - if(res != LV_FS_RES_OK) { - return -1; - } - - gdsc->box_h = read_bits(&bit_it, header->wh_bits, &res); - if(res != LV_FS_RES_OK) { - return -1; - } - - int nbits = header->advance_width_bits + 2 * header->xy_bits + 2 * header->wh_bits; - int next_offset = (i < loca_count - 1) ? glyph_offset[i + 1] : (uint32_t)glyph_length; - int bmp_size = next_offset - glyph_offset[i] - nbits / 8; - - if(i == 0) { - gdsc->adv_w = 0; - gdsc->box_w = 0; - gdsc->box_h = 0; - gdsc->ofs_x = 0; - gdsc->ofs_y = 0; - } - - gdsc->bitmap_index = cur_bmp_size; - if(gdsc->box_w * gdsc->box_h != 0) { - cur_bmp_size += bmp_size; - } - } - - uint8_t * glyph_bmp = (uint8_t *)lv_malloc(sizeof(uint8_t) * cur_bmp_size); - - font_dsc->glyph_bitmap = glyph_bmp; - - cur_bmp_size = 0; - - for(unsigned int i = 1; i < loca_count; ++i) { - lv_fs_res_t res = lv_fs_seek(fp, start + glyph_offset[i], LV_FS_SEEK_SET); - if(res != LV_FS_RES_OK) { - return -1; - } - bit_iterator_t bit_it = init_bit_iterator(fp); - - int nbits = header->advance_width_bits + 2 * header->xy_bits + 2 * header->wh_bits; - - read_bits(&bit_it, nbits, &res); - if(res != LV_FS_RES_OK) { - return -1; - } - - if(glyph_dsc[i].box_w * glyph_dsc[i].box_h == 0) { - continue; - } - - int next_offset = (i < loca_count - 1) ? glyph_offset[i + 1] : (uint32_t)glyph_length; - int bmp_size = next_offset - glyph_offset[i] - nbits / 8; - - if(nbits % 8 == 0) { /*Fast path*/ - if(lv_fs_read(fp, &glyph_bmp[cur_bmp_size], bmp_size, NULL) != LV_FS_RES_OK) { - return -1; - } - } - else { - for(int k = 0; k < bmp_size - 1; ++k) { - glyph_bmp[cur_bmp_size + k] = read_bits(&bit_it, 8, &res); - if(res != LV_FS_RES_OK) { - return -1; - } - } - glyph_bmp[cur_bmp_size + bmp_size - 1] = read_bits(&bit_it, 8 - nbits % 8, &res); - if(res != LV_FS_RES_OK) { - return -1; - } - - /*The last fragment should be on the MSB but read_bits() will place it to the LSB*/ - glyph_bmp[cur_bmp_size + bmp_size - 1] = glyph_bmp[cur_bmp_size + bmp_size - 1] << (nbits % 8); - - } - - cur_bmp_size += bmp_size; - } - return glyph_length; -} - -/* - * Loads a `lv_font_t` from a binary file, given a `lv_fs_file_t`. - * - * Memory allocations on `lvgl_load_font` should be immediately zeroed and - * the pointer should be set on the `lv_font_t` data before any possible return. - * - * When something fails, it returns `false` and the memory on the `lv_font_t` - * still needs to be freed using `lv_binfont_destroy`. - * - * `lv_binfont_destroy` will assume that all non-null pointers are allocated and - * should be freed. - */ -static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font) -{ - lv_font_fmt_txt_dsc_t * font_dsc = (lv_font_fmt_txt_dsc_t *) - lv_malloc(sizeof(lv_font_fmt_txt_dsc_t)); - - lv_memset(font_dsc, 0, sizeof(lv_font_fmt_txt_dsc_t)); - - font->dsc = font_dsc; - - /*header*/ - int32_t header_length = read_label(fp, 0, "head"); - if(header_length < 0) { - return false; - } - - font_header_bin_t font_header; - if(lv_fs_read(fp, &font_header, sizeof(font_header_bin_t), NULL) != LV_FS_RES_OK) { - return false; - } - - font->base_line = -font_header.descent; - font->line_height = font_header.ascent - font_header.descent; - font->get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt; - font->get_glyph_bitmap = lv_font_get_bitmap_fmt_txt; - font->subpx = font_header.subpixels_mode; - font->underline_position = (int8_t) font_header.underline_position; - font->underline_thickness = (int8_t) font_header.underline_thickness; - - font_dsc->bpp = font_header.bits_per_pixel; - font_dsc->kern_scale = font_header.kerning_scale; - font_dsc->bitmap_format = font_header.compression_id; - - /*cmaps*/ - uint32_t cmaps_start = header_length; - int32_t cmaps_length = load_cmaps(fp, font_dsc, cmaps_start); - if(cmaps_length < 0) { - return false; - } - - /*loca*/ - uint32_t loca_start = cmaps_start + cmaps_length; - int32_t loca_length = read_label(fp, loca_start, "loca"); - if(loca_length < 0) { - return false; - } - - uint32_t loca_count; - if(lv_fs_read(fp, &loca_count, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { - return false; - } - - bool failed = false; - uint32_t * glyph_offset = lv_malloc(sizeof(uint32_t) * (loca_count + 1)); - - if(font_header.index_to_loc_format == 0) { - for(unsigned int i = 0; i < loca_count; ++i) { - uint16_t offset; - if(lv_fs_read(fp, &offset, sizeof(uint16_t), NULL) != LV_FS_RES_OK) { - failed = true; - break; - } - glyph_offset[i] = offset; - } - } - else if(font_header.index_to_loc_format == 1) { - if(lv_fs_read(fp, glyph_offset, loca_count * sizeof(uint32_t), NULL) != LV_FS_RES_OK) { - failed = true; - } - } - else { - LV_LOG_WARN("Unknown index_to_loc_format: %d.", font_header.index_to_loc_format); - failed = true; - } - - if(failed) { - lv_free(glyph_offset); - return false; - } - - /*glyph*/ - uint32_t glyph_start = loca_start + loca_length; - int32_t glyph_length = load_glyph( - fp, font_dsc, glyph_start, glyph_offset, loca_count, &font_header); - - lv_free(glyph_offset); - - if(glyph_length < 0) { - return false; - } - - /*kerning*/ - if(font_header.tables_count < 4) { - font_dsc->kern_dsc = NULL; - font_dsc->kern_classes = 0; - font_dsc->kern_scale = 0; - return true; - } - - uint32_t kern_start = glyph_start + glyph_length; - - int32_t kern_length = load_kern(fp, font_dsc, font_header.glyph_id_format, kern_start); - - return kern_length >= 0; -} - -int32_t load_kern(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint8_t format, uint32_t start) -{ - int32_t kern_length = read_label(fp, start, "kern"); - if(kern_length < 0) { - return -1; - } - - uint8_t kern_format_type; - int32_t padding; - if(lv_fs_read(fp, &kern_format_type, sizeof(uint8_t), NULL) != LV_FS_RES_OK || - lv_fs_read(fp, &padding, 3 * sizeof(uint8_t), NULL) != LV_FS_RES_OK) { - return -1; - } - - if(0 == kern_format_type) { /*sorted pairs*/ - lv_font_fmt_txt_kern_pair_t * kern_pair = lv_malloc(sizeof(lv_font_fmt_txt_kern_pair_t)); - - lv_memset(kern_pair, 0, sizeof(lv_font_fmt_txt_kern_pair_t)); - - font_dsc->kern_dsc = kern_pair; - font_dsc->kern_classes = 0; - - uint32_t glyph_entries; - if(lv_fs_read(fp, &glyph_entries, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { - return -1; - } - - int ids_size; - if(format == 0) { - ids_size = sizeof(int8_t) * 2 * glyph_entries; - } - else { - ids_size = sizeof(int16_t) * 2 * glyph_entries; - } - - uint8_t * glyph_ids = lv_malloc(ids_size); - int8_t * values = lv_malloc(glyph_entries); - - kern_pair->glyph_ids_size = format; - kern_pair->pair_cnt = glyph_entries; - kern_pair->glyph_ids = glyph_ids; - kern_pair->values = values; - - if(lv_fs_read(fp, glyph_ids, ids_size, NULL) != LV_FS_RES_OK) { - return -1; - } - - if(lv_fs_read(fp, values, glyph_entries, NULL) != LV_FS_RES_OK) { - return -1; - } - } - else if(3 == kern_format_type) { /*array M*N of classes*/ - - lv_font_fmt_txt_kern_classes_t * kern_classes = lv_malloc(sizeof(lv_font_fmt_txt_kern_classes_t)); - - lv_memset(kern_classes, 0, sizeof(lv_font_fmt_txt_kern_classes_t)); - - font_dsc->kern_dsc = kern_classes; - font_dsc->kern_classes = 1; - - uint16_t kern_class_mapping_length; - uint8_t kern_table_rows; - uint8_t kern_table_cols; - - if(lv_fs_read(fp, &kern_class_mapping_length, sizeof(uint16_t), NULL) != LV_FS_RES_OK || - lv_fs_read(fp, &kern_table_rows, sizeof(uint8_t), NULL) != LV_FS_RES_OK || - lv_fs_read(fp, &kern_table_cols, sizeof(uint8_t), NULL) != LV_FS_RES_OK) { - return -1; - } - - int kern_values_length = sizeof(int8_t) * kern_table_rows * kern_table_cols; - - uint8_t * kern_left = lv_malloc(kern_class_mapping_length); - uint8_t * kern_right = lv_malloc(kern_class_mapping_length); - int8_t * kern_values = lv_malloc(kern_values_length); - - kern_classes->left_class_mapping = kern_left; - kern_classes->right_class_mapping = kern_right; - kern_classes->left_class_cnt = kern_table_rows; - kern_classes->right_class_cnt = kern_table_cols; - kern_classes->class_pair_values = kern_values; - - if(lv_fs_read(fp, kern_left, kern_class_mapping_length, NULL) != LV_FS_RES_OK || - lv_fs_read(fp, kern_right, kern_class_mapping_length, NULL) != LV_FS_RES_OK || - lv_fs_read(fp, kern_values, kern_values_length, NULL) != LV_FS_RES_OK) { - return -1; - } - } - else { - LV_LOG_WARN("Unknown kern_format_type: %d", kern_format_type); - return -1; - } - - return kern_length; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_binfont_loader.h b/software/Power_Pico/Middlewares/LVGL/src/font/lv_binfont_loader.h deleted file mode 100644 index 25e7b83..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_binfont_loader.h +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @file lv_binfont_loader.h - * - */ - -#ifndef LV_BINFONT_LOADER_H -#define LV_BINFONT_LOADER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Loads a `lv_font_t` object from a binary font file - * @param path path to font file - * @return pointer to font where to load - */ -lv_font_t * lv_binfont_create(const char * path); - -#if LV_USE_FS_MEMFS -/** - * Loads a `lv_font_t` object from a memory buffer containing the binary font file. - * Requires LV_USE_FS_MEMFS - * @param buffer address of the font file in the memory - * @param size size of the font file buffer - * @return pointer to font where to load - */ -lv_font_t * lv_binfont_create_from_buffer(void * buffer, uint32_t size); -#endif - -/** - * Frees the memory allocated by the `lv_binfont_create()` function - * @param font lv_font_t object created by the lv_binfont_create function - */ -void lv_binfont_destroy(lv_font_t * font); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /* LV_BINFONT_LOADER_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font.c deleted file mode 100644 index 35ae352..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font.c +++ /dev/null @@ -1,149 +0,0 @@ -/** - * @file lv_font.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_font.h" -#include "../misc/lv_text_private.h" -#include "../misc/lv_utils.h" -#include "../misc/lv_log.h" -#include "../misc/lv_assert.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -const void * lv_font_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf) -{ - const lv_font_t * font_p = g_dsc->resolved_font; - LV_ASSERT_NULL(font_p); - return font_p->get_glyph_bitmap(g_dsc, draw_buf); -} - -void lv_font_glyph_release_draw_data(lv_font_glyph_dsc_t * g_dsc) -{ - const lv_font_t * font = g_dsc->resolved_font; - - if(font != NULL && font->release_glyph) { - font->release_glyph(font, g_dsc); - } -} - -bool lv_font_get_glyph_dsc(const lv_font_t * font_p, lv_font_glyph_dsc_t * dsc_out, uint32_t letter, - uint32_t letter_next) -{ - - LV_ASSERT_NULL(font_p); - LV_ASSERT_NULL(dsc_out); - -#if LV_USE_FONT_PLACEHOLDER - const lv_font_t * placeholder_font = NULL; -#endif - - const lv_font_t * f = font_p; - - dsc_out->resolved_font = NULL; - - while(f) { - bool found = f->get_glyph_dsc(f, dsc_out, letter, f->kerning == LV_FONT_KERNING_NONE ? 0 : letter_next); - if(found) { - if(!dsc_out->is_placeholder) { - dsc_out->resolved_font = f; - return true; - } -#if LV_USE_FONT_PLACEHOLDER - else if(placeholder_font == NULL) { - placeholder_font = f; - } -#endif - } - f = f->fallback; - } - -#if LV_USE_FONT_PLACEHOLDER - if(placeholder_font != NULL) { - placeholder_font->get_glyph_dsc(placeholder_font, dsc_out, letter, - placeholder_font->kerning == LV_FONT_KERNING_NONE ? 0 : letter_next); - dsc_out->resolved_font = placeholder_font; - return true; - } -#endif - -#if LV_USE_FONT_PLACEHOLDER - dsc_out->box_w = font_p->line_height / 2; - dsc_out->adv_w = dsc_out->box_w + 2; -#else - dsc_out->box_w = 0; - dsc_out->adv_w = 0; -#endif - - dsc_out->resolved_font = NULL; - dsc_out->box_h = font_p->line_height; - dsc_out->ofs_x = 0; - dsc_out->ofs_y = 0; - dsc_out->format = LV_FONT_GLYPH_FORMAT_A1; - dsc_out->is_placeholder = true; - - return false; -} - -uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32_t letter_next) -{ - LV_ASSERT_NULL(font); - lv_font_glyph_dsc_t g; - - /*Return zero if letter is marker*/ - if(lv_text_is_marker(letter)) return 0; - - lv_font_get_glyph_dsc(font, &g, letter, letter_next); - return g.adv_w; -} - -void lv_font_set_kerning(lv_font_t * font, lv_font_kerning_t kerning) -{ - LV_ASSERT_NULL(font); - font->kerning = kerning; -} - -int32_t lv_font_get_line_height(const lv_font_t * font) -{ - return font->line_height; -} - -const lv_font_t * lv_font_default(void) -{ - return LV_FONT_DEFAULT; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font.h b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font.h deleted file mode 100644 index 2f172b9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font.h +++ /dev/null @@ -1,296 +0,0 @@ -/** - * @file lv_font.h - * - */ - -#ifndef LV_FONT_H -#define LV_FONT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "../misc/lv_types.h" - -#include "lv_symbol_def.h" -#include "../draw/lv_draw_buf.h" -#include "../misc/lv_area.h" -#include "../misc/cache/lv_cache.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*------------------ - * General types - *-----------------*/ - -/** The font format.*/ -typedef enum { - LV_FONT_GLYPH_FORMAT_NONE = 0, /**< Maybe not visible*/ - - /**< Legacy simple formats*/ - LV_FONT_GLYPH_FORMAT_A1 = 0x01, /**< 1 bit per pixel*/ - LV_FONT_GLYPH_FORMAT_A2 = 0x02, /**< 2 bit per pixel*/ - LV_FONT_GLYPH_FORMAT_A4 = 0x04, /**< 4 bit per pixel*/ - LV_FONT_GLYPH_FORMAT_A8 = 0x08, /**< 8 bit per pixel*/ - - LV_FONT_GLYPH_FORMAT_IMAGE = 0x09, /**< Image format*/ - - /**< Advanced formats*/ - LV_FONT_GLYPH_FORMAT_VECTOR = 0x0A, /**< Vectorial format*/ - LV_FONT_GLYPH_FORMAT_SVG = 0x0B, /**< SVG format*/ - LV_FONT_GLYPH_FORMAT_CUSTOM = 0xFF, /**< Custom format*/ -} lv_font_glyph_format_t; - -/** Describes the properties of a glyph.*/ -typedef struct { - const lv_font_t * - resolved_font; /**< Pointer to a font where the glyph was actually found after handling fallbacks*/ - uint16_t adv_w; /**< The glyph needs this space. Draw the next glyph after this width.*/ - uint16_t box_w; /**< Width of the glyph's bounding box*/ - uint16_t box_h; /**< Height of the glyph's bounding box*/ - int16_t ofs_x; /**< x offset of the bounding box*/ - int16_t ofs_y; /**< y offset of the bounding box*/ - lv_font_glyph_format_t format; /**< Font format of the glyph see lv_font_glyph_format_t */ - uint8_t is_placeholder: 1; /**< Glyph is missing. But placeholder will still be displayed*/ - - union { - uint32_t index; /**< Unicode code point*/ - const void * src; /**< Pointer to the source data used by image fonts*/ - } gid; /**< The index of the glyph in the font file. Used by the font cache*/ - lv_cache_entry_t * entry; /**< The cache entry of the glyph draw data. Used by the font cache*/ -} lv_font_glyph_dsc_t; - -/** The bitmaps might be upscaled by 3 to achieve subpixel rendering.*/ -typedef enum { - LV_FONT_SUBPX_NONE, - LV_FONT_SUBPX_HOR, - LV_FONT_SUBPX_VER, - LV_FONT_SUBPX_BOTH, -} lv_font_subpx_t; - -/** Adjust letter spacing for specific character pairs.*/ -typedef enum { - LV_FONT_KERNING_NORMAL, - LV_FONT_KERNING_NONE, -} lv_font_kerning_t; - -/** Describe the properties of a font*/ -struct lv_font_t { - /** Get a glyph's descriptor from a font*/ - bool (*get_glyph_dsc)(const lv_font_t *, lv_font_glyph_dsc_t *, uint32_t letter, uint32_t letter_next); - - /** Get a glyph's bitmap from a font*/ - const void * (*get_glyph_bitmap)(lv_font_glyph_dsc_t *, lv_draw_buf_t *); - - /** Release a glyph*/ - void (*release_glyph)(const lv_font_t *, lv_font_glyph_dsc_t *); - - /*Pointer to the font in a font pack (must have the same line height)*/ - int32_t line_height; /**< The real line height where any text fits*/ - int32_t base_line; /**< Base line measured from the bottom of the line_height*/ - uint8_t subpx : 2; /**< An element of `lv_font_subpx_t`*/ - uint8_t kerning : 1; /**< An element of `lv_font_kerning_t`*/ - - int8_t underline_position; /**< Distance between the top of the underline and base line (< 0 means below the base line)*/ - int8_t underline_thickness; /**< Thickness of the underline*/ - - const void * dsc; /**< Store implementation specific or run_time data or caching here*/ - const lv_font_t * fallback; /**< Fallback font for missing glyph. Resolved recursively */ - void * user_data; /**< Custom user data for font.*/ -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Return with the bitmap of a font. - * @note You must call lv_font_get_glyph_dsc() to get `g_dsc` (lv_font_glyph_dsc_t) before you can call this function. - * @param g_dsc the glyph descriptor including which font to use, which supply the glyph_index and the format. - * @param draw_buf a draw buffer that can be used to store the bitmap of the glyph, it's OK not to use it. - * @return pointer to the glyph's data. It can be a draw buffer for bitmap fonts or an image source for imgfonts. - */ -const void * lv_font_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf); - -/** - * Get the descriptor of a glyph - * @param font pointer to font - * @param dsc_out store the result descriptor here - * @param letter a UNICODE letter code - * @param letter_next the next letter after `letter`. Used for kerning - * @return true: descriptor is successfully loaded into `dsc_out`. - * false: the letter was not found, no data is loaded to `dsc_out` - */ -bool lv_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t letter, - uint32_t letter_next); - -/** - * Release the bitmap of a font. - * @note You must call lv_font_get_glyph_dsc() to get `g_dsc` (lv_font_glyph_dsc_t) before you can call this function. - * @param g_dsc the glyph descriptor including which font to use, which supply the glyph_index and the format. - */ -void lv_font_glyph_release_draw_data(lv_font_glyph_dsc_t * g_dsc); - -/** - * Get the width of a glyph with kerning - * @param font pointer to a font - * @param letter a UNICODE letter - * @param letter_next the next letter after `letter`. Used for kerning - * @return the width of the glyph - */ -uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32_t letter_next); - -/** - * Get the line height of a font. All characters fit into this height - * @param font pointer to a font - * @return the height of a font - */ -int32_t lv_font_get_line_height(const lv_font_t * font); - -/** - * Configure the use of kerning information stored in a font - * @param font pointer to a font - * @param kerning `LV_FONT_KERNING_NORMAL` (default) or `LV_FONT_KERNING_NONE` - */ -void lv_font_set_kerning(lv_font_t * font, lv_font_kerning_t kerning); - -/********************** - * MACROS - **********************/ - -#define LV_FONT_DECLARE(font_name) LV_ATTRIBUTE_EXTERN_DATA extern const lv_font_t font_name; - -#if LV_FONT_MONTSERRAT_8 -LV_FONT_DECLARE(lv_font_montserrat_8) -#endif - -#if LV_FONT_MONTSERRAT_10 -LV_FONT_DECLARE(lv_font_montserrat_10) -#endif - -#if LV_FONT_MONTSERRAT_12 -LV_FONT_DECLARE(lv_font_montserrat_12) -#endif - -#if LV_FONT_MONTSERRAT_14 -LV_FONT_DECLARE(lv_font_montserrat_14) -#endif - -#if LV_FONT_MONTSERRAT_16 -LV_FONT_DECLARE(lv_font_montserrat_16) -#endif - -#if LV_FONT_MONTSERRAT_18 -LV_FONT_DECLARE(lv_font_montserrat_18) -#endif - -#if LV_FONT_MONTSERRAT_20 -LV_FONT_DECLARE(lv_font_montserrat_20) -#endif - -#if LV_FONT_MONTSERRAT_22 -LV_FONT_DECLARE(lv_font_montserrat_22) -#endif - -#if LV_FONT_MONTSERRAT_24 -LV_FONT_DECLARE(lv_font_montserrat_24) -#endif - -#if LV_FONT_MONTSERRAT_26 -LV_FONT_DECLARE(lv_font_montserrat_26) -#endif - -#if LV_FONT_MONTSERRAT_28 -LV_FONT_DECLARE(lv_font_montserrat_28) -#endif - -#if LV_FONT_MONTSERRAT_30 -LV_FONT_DECLARE(lv_font_montserrat_30) -#endif - -#if LV_FONT_MONTSERRAT_32 -LV_FONT_DECLARE(lv_font_montserrat_32) -#endif - -#if LV_FONT_MONTSERRAT_34 -LV_FONT_DECLARE(lv_font_montserrat_34) -#endif - -#if LV_FONT_MONTSERRAT_36 -LV_FONT_DECLARE(lv_font_montserrat_36) -#endif - -#if LV_FONT_MONTSERRAT_38 -LV_FONT_DECLARE(lv_font_montserrat_38) -#endif - -#if LV_FONT_MONTSERRAT_40 -LV_FONT_DECLARE(lv_font_montserrat_40) -#endif - -#if LV_FONT_MONTSERRAT_42 -LV_FONT_DECLARE(lv_font_montserrat_42) -#endif - -#if LV_FONT_MONTSERRAT_44 -LV_FONT_DECLARE(lv_font_montserrat_44) -#endif - -#if LV_FONT_MONTSERRAT_46 -LV_FONT_DECLARE(lv_font_montserrat_46) -#endif - -#if LV_FONT_MONTSERRAT_48 -LV_FONT_DECLARE(lv_font_montserrat_48) -#endif - -#if LV_FONT_MONTSERRAT_28_COMPRESSED -LV_FONT_DECLARE(lv_font_montserrat_28_compressed) -#endif - -#if LV_FONT_DEJAVU_16_PERSIAN_HEBREW -LV_FONT_DECLARE(lv_font_dejavu_16_persian_hebrew) -#endif - -#if LV_FONT_SIMSUN_14_CJK -LV_FONT_DECLARE(lv_font_simsun_14_cjk) -#endif - -#if LV_FONT_SIMSUN_16_CJK -LV_FONT_DECLARE(lv_font_simsun_16_cjk) -#endif - -#if LV_FONT_UNSCII_8 -LV_FONT_DECLARE(lv_font_unscii_8) -#endif - -#if LV_FONT_UNSCII_16 -LV_FONT_DECLARE(lv_font_unscii_16) -#endif - -/*Declare the custom (user defined) fonts*/ -#ifdef LV_FONT_CUSTOM_DECLARE -LV_FONT_CUSTOM_DECLARE -#endif - -/** - * Just a wrapper around LV_FONT_DEFAULT because it might be more convenient to use a function in some cases - * @return pointer to LV_FONT_DEFAULT - */ -const lv_font_t * lv_font_default(void); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*USE_FONT*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_dejavu_16_persian_hebrew.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_dejavu_16_persian_hebrew.c deleted file mode 100644 index 02a9573..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_dejavu_16_persian_hebrew.c +++ /dev/null @@ -1,6605 +0,0 @@ -/******************************************************************************* - * Size: 16 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font DejaVuSans.ttf -r 0x20-0x7f,0x5d0-0x5ea,0x600-0x6FF,0xFB50-0xFDFF,0xFE70-0xFEFF --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_dejavu_16_persian_hebrew.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_DEJAVU_16_PERSIAN_HEBREW - #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 1 -#endif - -#if LV_FONT_DEJAVU_16_PERSIAN_HEBREW - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x8f, 0x8e, 0x6d, - 0x0, 0x0, 0x9f, 0x9f, - - /* U+0022 "\"" */ - 0x7e, 0x8, 0xd7, 0xe0, 0x8d, 0x7e, 0x8, 0xd7, - 0xe0, 0x8d, 0x24, 0x2, 0x40, - - /* U+0023 "#" */ - 0x0, 0x0, 0x5e, 0x0, 0xc7, 0x0, 0x0, 0x0, - 0x8b, 0x0, 0xf3, 0x0, 0x0, 0x0, 0xb8, 0x3, - 0xf0, 0x0, 0x0, 0x0, 0xf4, 0x6, 0xd0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2, 0x38, - 0xd3, 0x3e, 0x73, 0x30, 0x0, 0xa, 0x90, 0x1f, - 0x20, 0x0, 0x0, 0xe, 0x50, 0x5e, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0x40, 0x23, 0x8d, - 0x33, 0xe7, 0x33, 0x0, 0x0, 0xa9, 0x2, 0xf1, - 0x0, 0x0, 0x0, 0xf4, 0x6, 0xd0, 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x6, 0x60, 0x0, 0x0, 0x6, 0x60, 0x0, - 0x5, 0xce, 0xfd, 0xa1, 0x5f, 0x77, 0x84, 0x91, - 0x9d, 0x6, 0x60, 0x0, 0x8f, 0x36, 0x60, 0x0, - 0x1c, 0xfe, 0xc6, 0x10, 0x0, 0x3a, 0xde, 0xe3, - 0x0, 0x6, 0x60, 0xdb, 0x0, 0x6, 0x60, 0xac, - 0x98, 0x47, 0x87, 0xf7, 0x4a, 0xef, 0xfd, 0x70, - 0x0, 0x6, 0x60, 0x0, 0x0, 0x6, 0x60, 0x0, - 0x0, 0x3, 0x30, 0x0, - - /* U+0025 "%" */ - 0x2, 0xbf, 0xc3, 0x0, 0x0, 0xa9, 0x0, 0x0, - 0xca, 0x7, 0xe0, 0x0, 0x4e, 0x0, 0x0, 0xf, - 0x30, 0xf, 0x30, 0xd, 0x50, 0x0, 0x0, 0xf2, - 0x0, 0xf3, 0x8, 0xb0, 0x0, 0x0, 0xc, 0x90, - 0x7e, 0x2, 0xf2, 0x0, 0x0, 0x0, 0x2b, 0xfc, - 0x30, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5e, 0x1, 0xbe, 0xc3, 0x0, 0x0, 0x0, 0xe, - 0x50, 0xba, 0x6, 0xe0, 0x0, 0x0, 0x8, 0xb0, - 0xf, 0x30, 0xf, 0x40, 0x0, 0x2, 0xf2, 0x0, - 0xf3, 0x0, 0xf4, 0x0, 0x0, 0xc7, 0x0, 0xb, - 0xa0, 0x7e, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x1b, - 0xfd, 0x40, - - /* U+0026 "&" */ - 0x0, 0x5d, 0xfe, 0xa0, 0x0, 0x0, 0x4f, 0xa4, - 0x6c, 0x10, 0x0, 0x9, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0x10, 0x0, 0x0, 0x0, 0x2, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0xae, 0xfa, 0x0, 0x0, - 0x41, 0x7f, 0x35, 0xfa, 0x0, 0x2f, 0x4d, 0xa0, - 0x5, 0xf9, 0x6, 0xf0, 0xf9, 0x0, 0x6, 0xf9, - 0xd9, 0xc, 0xd0, 0x0, 0x6, 0xff, 0x10, 0x3f, - 0xb3, 0x13, 0xaf, 0xf8, 0x0, 0x3b, 0xef, 0xd9, - 0x27, 0xf7, - - /* U+0027 "'" */ - 0x7e, 0x7e, 0x7e, 0x7e, 0x24, - - /* U+0028 "(" */ - 0x0, 0x8b, 0x2, 0xf3, 0x9, 0xc0, 0xe, 0x70, - 0x3f, 0x30, 0x7f, 0x0, 0x9f, 0x0, 0x9e, 0x0, - 0x8f, 0x0, 0x5f, 0x10, 0x2f, 0x50, 0xc, 0xa0, - 0x5, 0xf0, 0x0, 0xd7, 0x0, 0x36, - - /* U+0029 ")" */ - 0x7c, 0x0, 0xe, 0x50, 0x9, 0xc0, 0x3, 0xf3, - 0x0, 0xf7, 0x0, 0xcb, 0x0, 0xbc, 0x0, 0xad, - 0x0, 0xbc, 0x0, 0xe9, 0x1, 0xf5, 0x6, 0xf0, - 0xb, 0x90, 0x3f, 0x10, 0x45, 0x0, - - /* U+002A "*" */ - 0x0, 0x7, 0x70, 0x0, 0x24, 0x7, 0x70, 0x42, - 0x2b, 0xb8, 0x9a, 0xb2, 0x0, 0x4f, 0xf4, 0x0, - 0x5, 0xcb, 0xcc, 0x50, 0x4a, 0x17, 0x71, 0x94, - 0x0, 0x7, 0x70, 0x0, 0x0, 0x2, 0x20, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, - 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x1, 0x11, - 0x1f, 0x61, 0x11, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x14, 0x44, 0x4f, 0x84, 0x44, 0x30, 0x0, - 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0xf, 0x50, 0x0, 0x0, - - /* U+002C "," */ - 0x1d, 0x72, 0xf7, 0x6f, 0x1a, 0x80, - - /* U+002D "-" */ - 0x1, 0x11, 0x13, 0xff, 0xff, 0x3, 0x33, 0x30, - - /* U+002E "." */ - 0x4f, 0x54, 0xf5, - - /* U+002F "/" */ - 0x0, 0x1, 0xf3, 0x0, 0x6, 0xe0, 0x0, 0xb, - 0x90, 0x0, 0xf, 0x40, 0x0, 0x5f, 0x0, 0x0, - 0xaa, 0x0, 0x0, 0xf5, 0x0, 0x4, 0xf1, 0x0, - 0x9, 0xb0, 0x0, 0xe, 0x60, 0x0, 0x3f, 0x10, - 0x0, 0x8c, 0x0, 0x0, 0xd7, 0x0, 0x0, - - /* U+0030 "0" */ - 0x1, 0xae, 0xfb, 0x20, 0x0, 0xde, 0x65, 0xde, - 0x10, 0x5f, 0x40, 0x1, 0xf8, 0xa, 0xe0, 0x0, - 0xb, 0xd0, 0xdb, 0x0, 0x0, 0x8f, 0xe, 0xa0, - 0x0, 0x7, 0xf1, 0xea, 0x0, 0x0, 0x7f, 0x1d, - 0xb0, 0x0, 0x8, 0xf0, 0xae, 0x0, 0x0, 0xbd, - 0x6, 0xf3, 0x0, 0x1f, 0x80, 0xd, 0xe6, 0x5d, - 0xe1, 0x0, 0x1a, 0xef, 0xb2, 0x0, - - /* U+0031 "1" */ - 0x19, 0xcf, 0xf2, 0x0, 0x3e, 0xbb, 0xf2, 0x0, - 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, - 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, - 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, - 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, - 0x5, 0x59, 0xf6, 0x53, 0xf, 0xff, 0xff, 0xfb, - - /* U+0032 "2" */ - 0x49, 0xdf, 0xd9, 0x10, 0xcc, 0x75, 0x8f, 0xd0, - 0x20, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x1, 0xf7, - 0x0, 0x0, 0x5, 0xf5, 0x0, 0x0, 0x1e, 0xc0, - 0x0, 0x0, 0xce, 0x20, 0x0, 0xb, 0xf3, 0x0, - 0x0, 0xbf, 0x30, 0x0, 0xa, 0xf3, 0x0, 0x0, - 0x9f, 0x95, 0x55, 0x53, 0xdf, 0xff, 0xff, 0xf9, - - /* U+0033 "3" */ - 0x3b, 0xef, 0xeb, 0x30, 0x5a, 0x75, 0x7d, 0xf3, - 0x0, 0x0, 0x1, 0xf8, 0x0, 0x0, 0x0, 0xf8, - 0x0, 0x0, 0x2a, 0xf2, 0x0, 0xcf, 0xfe, 0x30, - 0x0, 0x23, 0x5c, 0xe3, 0x0, 0x0, 0x0, 0xeb, - 0x0, 0x0, 0x0, 0xbe, 0x0, 0x0, 0x1, 0xeb, - 0xb9, 0x65, 0x8e, 0xf3, 0x6c, 0xef, 0xda, 0x20, - - /* U+0034 "4" */ - 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, 0x0, 0x4e, - 0xfa, 0x0, 0x0, 0x0, 0xe6, 0xfa, 0x0, 0x0, - 0x9, 0xc0, 0xfa, 0x0, 0x0, 0x3f, 0x20, 0xfa, - 0x0, 0x0, 0xc8, 0x0, 0xfa, 0x0, 0x7, 0xe0, - 0x0, 0xfa, 0x0, 0x1f, 0x61, 0x11, 0xfa, 0x10, - 0x3f, 0xff, 0xff, 0xff, 0xf4, 0x4, 0x44, 0x44, - 0xfb, 0x41, 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xfa, 0x0, - - /* U+0035 "5" */ - 0x4f, 0xff, 0xff, 0xe0, 0x4f, 0x75, 0x55, 0x40, - 0x4f, 0x20, 0x0, 0x0, 0x4f, 0x20, 0x0, 0x0, - 0x4f, 0xff, 0xfa, 0x20, 0x39, 0x54, 0x7f, 0xe1, - 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, 0xeb, - 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x4, 0xf8, - 0xb9, 0x66, 0x9f, 0xe1, 0x7c, 0xef, 0xe9, 0x10, - - /* U+0036 "6" */ - 0x0, 0x4c, 0xff, 0xc3, 0x0, 0x6f, 0xb7, 0x69, - 0x50, 0x2f, 0x90, 0x0, 0x0, 0x8, 0xf1, 0x0, - 0x0, 0x0, 0xbc, 0x6e, 0xfe, 0x70, 0xd, 0xfe, - 0x64, 0x9f, 0x70, 0xdf, 0x50, 0x0, 0xbe, 0xc, - 0xf0, 0x0, 0x7, 0xf2, 0x9f, 0x0, 0x0, 0x7f, - 0x24, 0xf5, 0x0, 0xc, 0xe0, 0xb, 0xf7, 0x5a, - 0xf6, 0x0, 0x9, 0xef, 0xd5, 0x0, - - /* U+0037 "7" */ - 0xbf, 0xff, 0xff, 0xfc, 0x35, 0x55, 0x57, 0xf8, - 0x0, 0x0, 0x8, 0xf2, 0x0, 0x0, 0xe, 0xc0, - 0x0, 0x0, 0x4f, 0x60, 0x0, 0x0, 0xaf, 0x0, - 0x0, 0x0, 0xfa, 0x0, 0x0, 0x6, 0xf4, 0x0, - 0x0, 0xc, 0xe0, 0x0, 0x0, 0x2f, 0x80, 0x0, - 0x0, 0x8f, 0x20, 0x0, 0x0, 0xdc, 0x0, 0x0, - - /* U+0038 "8" */ - 0x3, 0xbe, 0xfc, 0x50, 0x3, 0xfc, 0x55, 0xbf, - 0x50, 0x8f, 0x10, 0x0, 0xeb, 0x9, 0xf0, 0x0, - 0xd, 0xb0, 0x2f, 0x91, 0x17, 0xf4, 0x0, 0x3e, - 0xff, 0xf5, 0x0, 0x2e, 0xb4, 0x49, 0xf5, 0xb, - 0xe0, 0x0, 0xb, 0xe0, 0xeb, 0x0, 0x0, 0x8f, - 0x1c, 0xe0, 0x0, 0xb, 0xf0, 0x5f, 0xc5, 0x5a, - 0xf8, 0x0, 0x4c, 0xef, 0xc6, 0x0, - - /* U+0039 "9" */ - 0x3, 0xcf, 0xea, 0x10, 0x3, 0xfc, 0x56, 0xed, - 0x0, 0xbe, 0x0, 0x2, 0xf7, 0xe, 0xa0, 0x0, - 0xe, 0xc0, 0xfa, 0x0, 0x0, 0xdf, 0xc, 0xd0, - 0x0, 0x1f, 0xf0, 0x6f, 0x91, 0x2b, 0xff, 0x0, - 0x7f, 0xff, 0xbb, 0xe0, 0x0, 0x2, 0x10, 0xdb, - 0x0, 0x0, 0x0, 0x6f, 0x40, 0x39, 0x66, 0xaf, - 0x90, 0x2, 0xbe, 0xfd, 0x60, 0x0, - - /* U+003A ":" */ - 0x2f, 0x81, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0x82, 0xf8, - - /* U+003B ";" */ - 0x2f, 0x81, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0x72, 0xf7, 0x6f, 0x1a, 0x80, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x28, 0xeb, 0x0, 0x0, 0x16, 0xcf, 0xe8, - 0x20, 0x5, 0xbf, 0xe9, 0x30, 0x0, 0x3f, 0xfa, - 0x50, 0x0, 0x0, 0x3, 0xef, 0xb5, 0x0, 0x0, - 0x0, 0x0, 0x4a, 0xff, 0xa4, 0x0, 0x0, 0x0, - 0x0, 0x5b, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x1, - 0x7d, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, - - /* U+003D "=" */ - 0x1, 0x11, 0x11, 0x11, 0x11, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x14, 0x44, 0x44, 0x44, 0x44, - 0x20, 0x11, 0x11, 0x11, 0x11, 0x10, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xb1, 0x44, 0x44, 0x44, 0x44, - 0x42, - - /* U+003E ">" */ - 0x11, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfa, 0x40, - 0x0, 0x0, 0x0, 0x6, 0xbf, 0xe9, 0x30, 0x0, - 0x0, 0x0, 0x17, 0xcf, 0xd7, 0x20, 0x0, 0x0, - 0x0, 0x28, 0xef, 0x90, 0x0, 0x0, 0x3, 0x9e, - 0xf8, 0x0, 0x2, 0x8d, 0xfc, 0x61, 0x0, 0x7c, - 0xfe, 0x82, 0x0, 0x0, 0x4f, 0x94, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x4b, 0xef, 0xb3, 0xd, 0xa5, 0x6e, 0xe1, 0x20, - 0x0, 0x4f, 0x40, 0x0, 0x6, 0xf3, 0x0, 0x3, - 0xfa, 0x0, 0x2, 0xeb, 0x0, 0x0, 0xbd, 0x0, - 0x0, 0xe, 0x90, 0x0, 0x0, 0xc8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0xf, - 0xa0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x7b, 0xee, 0xd8, 0x20, 0x0, 0x0, - 0x3e, 0xd6, 0x43, 0x5a, 0xf6, 0x0, 0x3, 0xf6, - 0x0, 0x0, 0x0, 0x3e, 0x60, 0xe, 0x60, 0x0, - 0x0, 0x0, 0x3, 0xf2, 0x6c, 0x0, 0x1a, 0xed, - 0x6c, 0x50, 0xa8, 0xb6, 0x0, 0xbc, 0x44, 0xcf, - 0x50, 0x6c, 0xe3, 0x2, 0xf2, 0x0, 0x2f, 0x50, - 0x4d, 0xe3, 0x4, 0xf0, 0x0, 0xf, 0x50, 0x5c, - 0xc5, 0x2, 0xf1, 0x0, 0x1f, 0x50, 0xb8, 0x8a, - 0x0, 0xda, 0x11, 0xaf, 0x68, 0xe1, 0x1f, 0x30, - 0x2d, 0xff, 0x9c, 0xfa, 0x10, 0x6, 0xe3, 0x0, - 0x11, 0x1, 0x0, 0x0, 0x0, 0x7f, 0x83, 0x0, - 0x16, 0xd4, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xfb, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, - 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, 0xf, - 0xfe, 0x0, 0x0, 0x0, 0x5, 0xfb, 0xf4, 0x0, - 0x0, 0x0, 0xbe, 0x1f, 0xa0, 0x0, 0x0, 0x1f, - 0x90, 0xaf, 0x10, 0x0, 0x7, 0xf3, 0x4, 0xf6, - 0x0, 0x0, 0xdd, 0x0, 0xe, 0xc0, 0x0, 0x3f, - 0x81, 0x11, 0x9f, 0x20, 0x9, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0xec, 0x44, 0x44, 0x4c, 0xe0, 0x5f, - 0x50, 0x0, 0x0, 0x6f, 0x4b, 0xf0, 0x0, 0x0, - 0x0, 0xfa, - - /* U+0042 "B" */ - 0x6f, 0xff, 0xfe, 0xa2, 0x6, 0xf6, 0x44, 0x7e, - 0xe0, 0x6f, 0x20, 0x0, 0x5f, 0x46, 0xf2, 0x0, - 0x4, 0xf4, 0x6f, 0x30, 0x3, 0xce, 0x6, 0xff, - 0xff, 0xfd, 0x20, 0x6f, 0x53, 0x35, 0xce, 0x26, - 0xf2, 0x0, 0x1, 0xfa, 0x6f, 0x20, 0x0, 0xd, - 0xc6, 0xf2, 0x0, 0x1, 0xfb, 0x6f, 0x64, 0x46, - 0xdf, 0x46, 0xff, 0xff, 0xeb, 0x40, - - /* U+0043 "C" */ - 0x0, 0x3, 0xae, 0xfe, 0xb5, 0x0, 0x6, 0xfd, - 0x75, 0x6a, 0xf4, 0x3, 0xfa, 0x0, 0x0, 0x2, - 0x30, 0xaf, 0x10, 0x0, 0x0, 0x0, 0xf, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0xf, 0x90, 0x0, 0x0, 0x0, 0x0, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x23, 0x0, - 0x6f, 0xd7, 0x56, 0xaf, 0x40, 0x0, 0x3a, 0xef, - 0xeb, 0x40, - - /* U+0044 "D" */ - 0x6f, 0xff, 0xfd, 0xa5, 0x0, 0x6, 0xf6, 0x45, - 0x7b, 0xfb, 0x0, 0x6f, 0x20, 0x0, 0x6, 0xf9, - 0x6, 0xf2, 0x0, 0x0, 0xb, 0xf0, 0x6f, 0x20, - 0x0, 0x0, 0x6f, 0x36, 0xf2, 0x0, 0x0, 0x4, - 0xf5, 0x6f, 0x20, 0x0, 0x0, 0x5f, 0x56, 0xf2, - 0x0, 0x0, 0x6, 0xf3, 0x6f, 0x20, 0x0, 0x0, - 0xbf, 0x6, 0xf2, 0x0, 0x0, 0x6f, 0x80, 0x6f, - 0x64, 0x57, 0xbf, 0xb0, 0x6, 0xff, 0xff, 0xea, - 0x50, 0x0, - - /* U+0045 "E" */ - 0x6f, 0xff, 0xff, 0xff, 0x6, 0xf6, 0x55, 0x55, - 0x50, 0x6f, 0x20, 0x0, 0x0, 0x6, 0xf2, 0x0, - 0x0, 0x0, 0x6f, 0x31, 0x11, 0x10, 0x6, 0xff, - 0xff, 0xff, 0xb0, 0x6f, 0x54, 0x44, 0x42, 0x6, - 0xf2, 0x0, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, - 0x6, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0x65, 0x55, - 0x55, 0x6, 0xff, 0xff, 0xff, 0xf1, - - /* U+0046 "F" */ - 0x6f, 0xff, 0xff, 0xf4, 0x6f, 0x65, 0x55, 0x51, - 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, - 0x6f, 0x31, 0x11, 0x0, 0x6f, 0xff, 0xff, 0xc0, - 0x6f, 0x54, 0x44, 0x30, 0x6f, 0x20, 0x0, 0x0, - 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, - 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x3, 0xae, 0xff, 0xc8, 0x10, 0x0, 0x6f, - 0xd7, 0x55, 0x9e, 0xc0, 0x3, 0xfa, 0x0, 0x0, - 0x1, 0x70, 0xb, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x90, - 0x0, 0x0, 0x0, 0x0, 0xf, 0x90, 0x0, 0xf, - 0xff, 0xf1, 0xf, 0xb0, 0x0, 0x3, 0x39, 0xf1, - 0xb, 0xf1, 0x0, 0x0, 0x7, 0xf1, 0x3, 0xfa, - 0x0, 0x0, 0x7, 0xf1, 0x0, 0x6f, 0xd7, 0x55, - 0x8d, 0xf1, 0x0, 0x3, 0xae, 0xff, 0xc7, 0x10, - - /* U+0048 "H" */ - 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, 0x20, 0x0, - 0x1, 0xf7, 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, - 0x20, 0x0, 0x1, 0xf7, 0x6f, 0x31, 0x11, 0x12, - 0xf7, 0x6f, 0xff, 0xff, 0xff, 0xf7, 0x6f, 0x54, - 0x44, 0x45, 0xf7, 0x6f, 0x20, 0x0, 0x1, 0xf7, - 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, 0x20, 0x0, - 0x1, 0xf7, 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, - 0x20, 0x0, 0x1, 0xf7, - - /* U+0049 "I" */ - 0x6f, 0x26, 0xf2, 0x6f, 0x26, 0xf2, 0x6f, 0x26, - 0xf2, 0x6f, 0x26, 0xf2, 0x6f, 0x26, 0xf2, 0x6f, - 0x26, 0xf2, - - /* U+004A "J" */ - 0x0, 0x6f, 0x20, 0x6, 0xf2, 0x0, 0x6f, 0x20, - 0x6, 0xf2, 0x0, 0x6f, 0x20, 0x6, 0xf2, 0x0, - 0x6f, 0x20, 0x6, 0xf2, 0x0, 0x6f, 0x20, 0x6, - 0xf2, 0x0, 0x6f, 0x20, 0x7, 0xf2, 0x0, 0xaf, - 0x4, 0x8f, 0xa0, 0xde, 0x90, 0x0, - - /* U+004B "K" */ - 0x6f, 0x20, 0x0, 0x3e, 0xd1, 0x6f, 0x20, 0x3, - 0xec, 0x10, 0x6f, 0x20, 0x3f, 0xc0, 0x0, 0x6f, - 0x24, 0xfb, 0x0, 0x0, 0x6f, 0x7f, 0xb0, 0x0, - 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x6f, 0xbf, - 0x80, 0x0, 0x0, 0x6f, 0x29, 0xf7, 0x0, 0x0, - 0x6f, 0x20, 0xaf, 0x70, 0x0, 0x6f, 0x20, 0xa, - 0xf6, 0x0, 0x6f, 0x20, 0x0, 0xaf, 0x60, 0x6f, - 0x20, 0x0, 0xb, 0xf5, - - /* U+004C "L" */ - 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, - 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, - 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, - 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, - 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, - 0x6f, 0x65, 0x55, 0x54, 0x6f, 0xff, 0xff, 0xfd, - - /* U+004D "M" */ - 0x6f, 0xf1, 0x0, 0x0, 0x4f, 0xf4, 0x6f, 0xf7, - 0x0, 0x0, 0xaf, 0xf4, 0x6f, 0xad, 0x0, 0x0, - 0xf9, 0xf4, 0x6f, 0x4f, 0x30, 0x6, 0xe5, 0xf4, - 0x6f, 0x1c, 0x90, 0xc, 0x94, 0xf4, 0x6f, 0x16, - 0xe0, 0x2f, 0x34, 0xf4, 0x6f, 0x11, 0xf4, 0x7d, - 0x4, 0xf4, 0x6f, 0x10, 0xba, 0xd8, 0x4, 0xf4, - 0x6f, 0x10, 0x5f, 0xf2, 0x4, 0xf4, 0x6f, 0x10, - 0xa, 0x90, 0x4, 0xf4, 0x6f, 0x10, 0x0, 0x0, - 0x4, 0xf4, 0x6f, 0x10, 0x0, 0x0, 0x4, 0xf4, - - /* U+004E "N" */ - 0x6f, 0xe0, 0x0, 0x2, 0xf6, 0x6f, 0xf7, 0x0, - 0x2, 0xf6, 0x6f, 0xbe, 0x0, 0x2, 0xf6, 0x6f, - 0x3f, 0x80, 0x2, 0xf6, 0x6f, 0x19, 0xf1, 0x2, - 0xf6, 0x6f, 0x11, 0xf8, 0x2, 0xf6, 0x6f, 0x10, - 0x8f, 0x12, 0xf6, 0x6f, 0x10, 0x1f, 0x92, 0xf6, - 0x6f, 0x10, 0x8, 0xf3, 0xf6, 0x6f, 0x10, 0x1, - 0xfb, 0xf6, 0x6f, 0x10, 0x0, 0x7f, 0xf6, 0x6f, - 0x10, 0x0, 0xe, 0xf6, - - /* U+004F "O" */ - 0x0, 0x4, 0xbe, 0xfd, 0x91, 0x0, 0x0, 0x7f, - 0xc6, 0x58, 0xee, 0x20, 0x3, 0xfa, 0x0, 0x0, - 0x2f, 0xd0, 0xa, 0xf1, 0x0, 0x0, 0x7, 0xf4, - 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, 0xf, 0x90, - 0x0, 0x0, 0x0, 0xfa, 0xf, 0x90, 0x0, 0x0, - 0x0, 0xfa, 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, - 0xb, 0xf1, 0x0, 0x0, 0x7, 0xf4, 0x3, 0xfa, - 0x0, 0x0, 0x2e, 0xd0, 0x0, 0x7f, 0xc6, 0x58, - 0xee, 0x20, 0x0, 0x4, 0xbe, 0xfd, 0x91, 0x0, - - /* U+0050 "P" */ - 0x6f, 0xff, 0xfc, 0x60, 0x6, 0xf6, 0x45, 0xbf, - 0x80, 0x6f, 0x20, 0x0, 0xdf, 0x6, 0xf2, 0x0, - 0x9, 0xf1, 0x6f, 0x20, 0x0, 0xbf, 0x6, 0xf3, - 0x1, 0x7f, 0xa0, 0x6f, 0xff, 0xff, 0xa1, 0x6, - 0xf5, 0x32, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, - 0x6, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0x20, 0x0, - 0x0, 0x6, 0xf2, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x4, 0xbe, 0xfd, 0x81, 0x0, 0x0, 0x7f, - 0xc6, 0x58, 0xee, 0x20, 0x3, 0xfa, 0x0, 0x0, - 0x2f, 0xc0, 0xa, 0xf1, 0x0, 0x0, 0x8, 0xf4, - 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, 0xf, 0x90, - 0x0, 0x0, 0x0, 0xfa, 0xf, 0x90, 0x0, 0x0, - 0x0, 0xfa, 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, - 0xb, 0xf1, 0x0, 0x0, 0x7, 0xf4, 0x3, 0xfa, - 0x0, 0x0, 0x2e, 0xd0, 0x0, 0x7f, 0xc6, 0x47, - 0xef, 0x30, 0x0, 0x4, 0xbe, 0xff, 0xd2, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0x30, - - /* U+0052 "R" */ - 0x6f, 0xff, 0xfd, 0x80, 0x0, 0x6f, 0x64, 0x5a, - 0xf8, 0x0, 0x6f, 0x20, 0x0, 0xcf, 0x0, 0x6f, - 0x20, 0x0, 0x9f, 0x10, 0x6f, 0x20, 0x0, 0xbe, - 0x0, 0x6f, 0x30, 0x16, 0xf6, 0x0, 0x6f, 0xff, - 0xff, 0x90, 0x0, 0x6f, 0x53, 0x5c, 0xf5, 0x0, - 0x6f, 0x20, 0x0, 0xde, 0x0, 0x6f, 0x20, 0x0, - 0x5f, 0x70, 0x6f, 0x20, 0x0, 0xc, 0xe0, 0x6f, - 0x20, 0x0, 0x4, 0xf6, - - /* U+0053 "S" */ - 0x4, 0xbe, 0xfd, 0xa4, 0x6, 0xfc, 0x65, 0x7b, - 0x80, 0xdd, 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, - 0x0, 0x0, 0xaf, 0x71, 0x0, 0x0, 0x1, 0xcf, - 0xfe, 0xa4, 0x0, 0x0, 0x27, 0xbf, 0xf7, 0x0, - 0x0, 0x0, 0x1c, 0xf1, 0x0, 0x0, 0x0, 0x6f, - 0x32, 0x0, 0x0, 0x9, 0xf2, 0xec, 0x75, 0x5a, - 0xfb, 0x5, 0xad, 0xff, 0xd7, 0x0, - - /* U+0054 "T" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x55, 0x55, - 0xec, 0x55, 0x54, 0x0, 0x0, 0xe, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xeb, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xeb, 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xeb, - 0x0, 0x0, - - /* U+0055 "U" */ - 0x9f, 0x0, 0x0, 0x4, 0xf5, 0x9f, 0x0, 0x0, - 0x4, 0xf5, 0x9f, 0x0, 0x0, 0x4, 0xf5, 0x9f, - 0x0, 0x0, 0x4, 0xf5, 0x9f, 0x0, 0x0, 0x4, - 0xf5, 0x9f, 0x0, 0x0, 0x4, 0xf5, 0x9f, 0x0, - 0x0, 0x4, 0xf5, 0x9f, 0x0, 0x0, 0x4, 0xf5, - 0x8f, 0x10, 0x0, 0x6, 0xf3, 0x4f, 0x70, 0x0, - 0xb, 0xe0, 0xb, 0xf9, 0x56, 0xbf, 0x60, 0x0, - 0x8d, 0xff, 0xc5, 0x0, - - /* U+0056 "V" */ - 0xbe, 0x0, 0x0, 0x0, 0xf, 0xa5, 0xf5, 0x0, - 0x0, 0x6, 0xf4, 0xe, 0xb0, 0x0, 0x0, 0xbe, - 0x0, 0x9f, 0x10, 0x0, 0x1f, 0x80, 0x3, 0xf6, - 0x0, 0x7, 0xf2, 0x0, 0xd, 0xc0, 0x0, 0xdc, - 0x0, 0x0, 0x7f, 0x20, 0x3f, 0x60, 0x0, 0x1, - 0xf8, 0x9, 0xf1, 0x0, 0x0, 0xb, 0xe0, 0xea, - 0x0, 0x0, 0x0, 0x5f, 0x8f, 0x40, 0x0, 0x0, - 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xf8, - 0x0, 0x0, - - /* U+0057 "W" */ - 0x5f, 0x30, 0x0, 0x1f, 0xe0, 0x0, 0x6, 0xf2, - 0x1f, 0x70, 0x0, 0x5f, 0xf2, 0x0, 0xa, 0xe0, - 0xd, 0xb0, 0x0, 0x9b, 0xd6, 0x0, 0xe, 0xb0, - 0x9, 0xf0, 0x0, 0xd7, 0xaa, 0x0, 0x2f, 0x70, - 0x6, 0xf3, 0x1, 0xf3, 0x6e, 0x0, 0x6f, 0x30, - 0x2, 0xf7, 0x4, 0xf0, 0x2f, 0x20, 0xaf, 0x0, - 0x0, 0xeb, 0x8, 0xb0, 0xe, 0x50, 0xdb, 0x0, - 0x0, 0xae, 0xc, 0x80, 0xa, 0x91, 0xf7, 0x0, - 0x0, 0x6f, 0x3f, 0x40, 0x7, 0xd5, 0xf3, 0x0, - 0x0, 0x2f, 0xbf, 0x0, 0x3, 0xfb, 0xf0, 0x0, - 0x0, 0xe, 0xfc, 0x0, 0x0, 0xff, 0xb0, 0x0, - 0x0, 0xa, 0xf8, 0x0, 0x0, 0xbf, 0x70, 0x0, - - /* U+0058 "X" */ - 0xa, 0xe1, 0x0, 0x0, 0xcd, 0x0, 0x1e, 0xa0, - 0x0, 0x7f, 0x30, 0x0, 0x5f, 0x50, 0x2f, 0x90, - 0x0, 0x0, 0xbe, 0x1c, 0xe0, 0x0, 0x0, 0x1, - 0xfd, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, 0x0, - 0x9f, 0x4f, 0x90, 0x0, 0x0, 0x4f, 0x70, 0x7f, - 0x30, 0x0, 0xd, 0xc0, 0x0, 0xdd, 0x0, 0x8, - 0xf2, 0x0, 0x3, 0xf8, 0x3, 0xf8, 0x0, 0x0, - 0x8, 0xf2, - - /* U+0059 "Y" */ - 0xb, 0xe1, 0x0, 0x0, 0x3f, 0x70, 0x1f, 0xa0, - 0x0, 0xd, 0xc0, 0x0, 0x6f, 0x40, 0x8, 0xf3, - 0x0, 0x0, 0xbe, 0x12, 0xf8, 0x0, 0x0, 0x2, - 0xfa, 0xcd, 0x0, 0x0, 0x0, 0x6, 0xff, 0x30, - 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xeb, 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xeb, - 0x0, 0x0, - - /* U+005A "Z" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0x10, 0x55, 0x55, - 0x55, 0x7f, 0xc0, 0x0, 0x0, 0x0, 0xc, 0xe2, - 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, - 0x6, 0xf7, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x0, - 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, - 0xbf, 0x30, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, - 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x1e, - 0xe5, 0x55, 0x55, 0x55, 0x14, 0xff, 0xff, 0xff, - 0xff, 0xf4, - - /* U+005B "[" */ - 0xaf, 0xfb, 0xad, 0x21, 0xad, 0x0, 0xad, 0x0, - 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, - 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, - 0xad, 0x0, 0xaf, 0xfa, 0x12, 0x21, - - /* U+005C "\\" */ - 0xd7, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x3f, 0x10, - 0x0, 0xe, 0x60, 0x0, 0x9, 0xb0, 0x0, 0x4, - 0xf1, 0x0, 0x0, 0xf5, 0x0, 0x0, 0xaa, 0x0, - 0x0, 0x5f, 0x0, 0x0, 0xf, 0x40, 0x0, 0xb, - 0x90, 0x0, 0x6, 0xe0, 0x0, 0x1, 0xf3, - - /* U+005D "]" */ - 0x7f, 0xfe, 0x2, 0xae, 0x0, 0x9e, 0x0, 0x9e, - 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, - 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, - 0x0, 0x9e, 0x6f, 0xfe, 0x2, 0x21, - - /* U+005E "^" */ - 0x0, 0x0, 0x28, 0x50, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0x60, 0x0, 0x0, 0x1d, 0xd1, 0x8f, 0x50, - 0x0, 0x1d, 0xc1, 0x0, 0x7f, 0x50, 0xc, 0xc0, - 0x0, 0x0, 0x6f, 0x40, - - /* U+005F "_" */ - 0x2f, 0xff, 0xff, 0xff, 0xf2, 0x2, 0x22, 0x22, - 0x22, 0x20, - - /* U+0060 "`" */ - 0x4f, 0x40, 0x0, 0x6e, 0x10, 0x0, 0x8b, 0x0, - - /* U+0061 "a" */ - 0x2, 0xae, 0xfd, 0x90, 0x0, 0x48, 0x53, 0x6d, - 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x20, 0x7, 0xce, - 0xff, 0xf5, 0x8, 0xf6, 0x32, 0x3f, 0x50, 0xe8, - 0x0, 0x3, 0xf5, 0xf, 0x70, 0x0, 0x8f, 0x50, - 0xbd, 0x20, 0x6e, 0xf5, 0x1, 0xae, 0xfb, 0x3f, - 0x50, - - /* U+0062 "b" */ - 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, - 0x0, 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe3, 0xcf, - 0xe7, 0x0, 0x8f, 0xe6, 0x49, 0xf6, 0x8, 0xf5, - 0x0, 0xa, 0xe0, 0x8f, 0x0, 0x0, 0x5f, 0x28, - 0xe0, 0x0, 0x3, 0xf3, 0x8f, 0x0, 0x0, 0x5f, - 0x28, 0xf5, 0x0, 0xa, 0xe0, 0x8f, 0xe6, 0x49, - 0xf6, 0x8, 0xe3, 0xcf, 0xe7, 0x0, - - /* U+0063 "c" */ - 0x0, 0x2a, 0xef, 0xd7, 0x3, 0xfd, 0x54, 0x69, - 0xb, 0xe0, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, - 0x1f, 0x70, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, - 0xb, 0xe0, 0x0, 0x0, 0x3, 0xfd, 0x64, 0x69, - 0x0, 0x3b, 0xff, 0xd7, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, - 0xbb, 0x0, 0x0, 0x0, 0xb, 0xb0, 0x5, 0xdf, - 0xd5, 0xbb, 0x4, 0xfb, 0x45, 0xee, 0xb0, 0xcd, - 0x0, 0x3, 0xfb, 0xf, 0x80, 0x0, 0xd, 0xb1, - 0xf6, 0x0, 0x0, 0xcb, 0xf, 0x70, 0x0, 0xd, - 0xb0, 0xcb, 0x0, 0x2, 0xfb, 0x4, 0xf7, 0x2, - 0xcf, 0xb0, 0x5, 0xdf, 0xd6, 0xbb, - - /* U+0065 "e" */ - 0x0, 0x2b, 0xff, 0xc3, 0x0, 0x2f, 0xc5, 0x4a, - 0xf3, 0xb, 0xe0, 0x0, 0xd, 0xa0, 0xf8, 0x0, - 0x0, 0x8e, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0xf9, - 0x22, 0x22, 0x22, 0xb, 0xd0, 0x0, 0x0, 0x0, - 0x2f, 0xc6, 0x45, 0x88, 0x0, 0x2a, 0xef, 0xeb, - 0x40, - - /* U+0066 "f" */ - 0x0, 0x5d, 0xff, 0x1, 0xf9, 0x33, 0x3, 0xf3, - 0x0, 0xaf, 0xff, 0xf9, 0x15, 0xf4, 0x21, 0x4, - 0xf3, 0x0, 0x4, 0xf3, 0x0, 0x4, 0xf3, 0x0, - 0x4, 0xf3, 0x0, 0x4, 0xf3, 0x0, 0x4, 0xf3, - 0x0, 0x4, 0xf3, 0x0, - - /* U+0067 "g" */ - 0x0, 0x5d, 0xfd, 0x5b, 0xb0, 0x4f, 0xa4, 0x5d, - 0xeb, 0xc, 0xc0, 0x0, 0x2f, 0xb0, 0xf7, 0x0, - 0x0, 0xdb, 0x1f, 0x60, 0x0, 0xc, 0xb0, 0xf7, - 0x0, 0x0, 0xdb, 0xc, 0xc0, 0x0, 0x2f, 0xb0, - 0x4f, 0xa4, 0x5d, 0xeb, 0x0, 0x5d, 0xfd, 0x5c, - 0xa0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x94, 0x35, - 0xde, 0x10, 0xb, 0xef, 0xea, 0x20, - - /* U+0068 "h" */ - 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, - 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x2b, 0xfd, 0x60, - 0x8f, 0xd7, 0x49, 0xf4, 0x8f, 0x40, 0x0, 0xda, - 0x8f, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, - 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, - 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, - - /* U+0069 "i" */ - 0x7f, 0x6c, 0x0, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, - - /* U+006A "j" */ - 0x0, 0x7f, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x7f, - 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, - 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, - 0x0, 0x8e, 0x14, 0xda, 0x4f, 0xb2, - - /* U+006B "k" */ - 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, - 0x0, 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, - 0x6f, 0x70, 0x8e, 0x0, 0x7f, 0x60, 0x8, 0xe0, - 0x9f, 0x40, 0x0, 0x8e, 0xae, 0x30, 0x0, 0x8, - 0xff, 0xb0, 0x0, 0x0, 0x8e, 0x3f, 0xa0, 0x0, - 0x8, 0xe0, 0x3f, 0xa0, 0x0, 0x8e, 0x0, 0x3f, - 0xa0, 0x8, 0xe0, 0x0, 0x3f, 0xb0, - - /* U+006C "l" */ - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, - - /* U+006D "m" */ - 0x8e, 0x3c, 0xfd, 0x50, 0x6d, 0xfb, 0x10, 0x8f, - 0xd6, 0x4b, 0xf8, 0xc5, 0x5e, 0xb0, 0x8f, 0x40, - 0x1, 0xfe, 0x0, 0x6, 0xf1, 0x8f, 0x0, 0x0, - 0xea, 0x0, 0x3, 0xf3, 0x8e, 0x0, 0x0, 0xe9, - 0x0, 0x3, 0xf3, 0x8e, 0x0, 0x0, 0xe9, 0x0, - 0x3, 0xf3, 0x8e, 0x0, 0x0, 0xe9, 0x0, 0x3, - 0xf3, 0x8e, 0x0, 0x0, 0xe9, 0x0, 0x3, 0xf3, - 0x8e, 0x0, 0x0, 0xe9, 0x0, 0x3, 0xf3, - - /* U+006E "n" */ - 0x8e, 0x3c, 0xfd, 0x60, 0x8f, 0xc4, 0x16, 0xf4, - 0x8f, 0x30, 0x0, 0xda, 0x8f, 0x0, 0x0, 0xac, - 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, - 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, - 0x8e, 0x0, 0x0, 0xac, - - /* U+006F "o" */ - 0x0, 0x4c, 0xff, 0xb2, 0x0, 0x4f, 0xb4, 0x5d, - 0xe1, 0xc, 0xd0, 0x0, 0x1f, 0x90, 0xf8, 0x0, - 0x0, 0xbd, 0x1f, 0x60, 0x0, 0xa, 0xe0, 0xf8, - 0x0, 0x0, 0xbd, 0xc, 0xd0, 0x0, 0x1f, 0x90, - 0x4f, 0xb5, 0x5d, 0xe1, 0x0, 0x4c, 0xff, 0xb2, - 0x0, - - /* U+0070 "p" */ - 0x8e, 0x4d, 0xfe, 0x70, 0x8, 0xfd, 0x30, 0x6f, - 0x60, 0x8f, 0x40, 0x0, 0x9e, 0x8, 0xf0, 0x0, - 0x4, 0xf2, 0x8e, 0x0, 0x0, 0x3f, 0x38, 0xf0, - 0x0, 0x5, 0xf2, 0x8f, 0x60, 0x0, 0xbe, 0x8, - 0xfe, 0x74, 0x9f, 0x60, 0x8e, 0x3c, 0xfe, 0x70, - 0x8, 0xe0, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, - 0x0, 0x8, 0xe0, 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x5d, 0xfd, 0x5b, 0xb0, 0x4f, 0xa4, 0x5e, - 0xeb, 0xc, 0xd0, 0x0, 0x3f, 0xb0, 0xf7, 0x0, - 0x0, 0xdb, 0x1f, 0x60, 0x0, 0xc, 0xb0, 0xf7, - 0x0, 0x0, 0xdb, 0xc, 0xd0, 0x0, 0x3f, 0xb0, - 0x4f, 0xb4, 0x5e, 0xeb, 0x0, 0x5d, 0xfd, 0x5b, - 0xb0, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, - 0xb, 0xb0, 0x0, 0x0, 0x0, 0xbb, - - /* U+0072 "r" */ - 0x0, 0x0, 0x0, 0x8e, 0x4c, 0xf9, 0x8f, 0xd4, - 0x12, 0x8f, 0x40, 0x0, 0x8f, 0x0, 0x0, 0x8e, - 0x0, 0x0, 0x8e, 0x0, 0x0, 0x8e, 0x0, 0x0, - 0x8e, 0x0, 0x0, 0x8e, 0x0, 0x0, - - /* U+0073 "s" */ - 0x1, 0xae, 0xfe, 0xb0, 0xc, 0xd5, 0x35, 0x91, - 0xf, 0x60, 0x0, 0x0, 0xc, 0xe6, 0x20, 0x0, - 0x1, 0x9e, 0xfe, 0x70, 0x0, 0x0, 0x28, 0xf5, - 0x0, 0x0, 0x0, 0xf8, 0x1c, 0x64, 0x49, 0xf3, - 0x9, 0xdf, 0xfc, 0x40, - - /* U+0074 "t" */ - 0x4, 0x70, 0x0, 0x8, 0xf0, 0x0, 0x8, 0xf0, - 0x0, 0x9f, 0xff, 0xfe, 0x19, 0xf2, 0x21, 0x8, - 0xf0, 0x0, 0x8, 0xf0, 0x0, 0x8, 0xf0, 0x0, - 0x8, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x5, 0xf6, - 0x32, 0x0, 0x9e, 0xfe, - - /* U+0075 "u" */ - 0xac, 0x0, 0x0, 0xcb, 0xac, 0x0, 0x0, 0xcb, - 0xac, 0x0, 0x0, 0xcb, 0xac, 0x0, 0x0, 0xcb, - 0xac, 0x0, 0x0, 0xcb, 0x9d, 0x0, 0x0, 0xcb, - 0x7e, 0x0, 0x1, 0xfb, 0x2f, 0x81, 0x2b, 0xfb, - 0x5, 0xdf, 0xd5, 0xcb, - - /* U+0076 "v" */ - 0x5f, 0x20, 0x0, 0xb, 0xd0, 0xf8, 0x0, 0x1, - 0xf7, 0x9, 0xe0, 0x0, 0x7f, 0x10, 0x3f, 0x40, - 0xc, 0xb0, 0x0, 0xda, 0x2, 0xf5, 0x0, 0x8, - 0xf0, 0x8f, 0x0, 0x0, 0x2f, 0x5e, 0xa0, 0x0, - 0x0, 0xce, 0xf4, 0x0, 0x0, 0x6, 0xfe, 0x0, - 0x0, - - /* U+0077 "w" */ - 0x3f, 0x30, 0x6, 0xf8, 0x0, 0x2f, 0x40, 0xe7, - 0x0, 0xaf, 0xc0, 0x6, 0xf0, 0xb, 0xb0, 0xe, - 0x8f, 0x0, 0xac, 0x0, 0x6f, 0x3, 0xf1, 0xf4, - 0xe, 0x80, 0x2, 0xf4, 0x7c, 0xb, 0x82, 0xf4, - 0x0, 0xe, 0x8b, 0x80, 0x7c, 0x6f, 0x0, 0x0, - 0xac, 0xf4, 0x3, 0xfb, 0xc0, 0x0, 0x6, 0xff, - 0x0, 0xf, 0xf8, 0x0, 0x0, 0x2f, 0xc0, 0x0, - 0xbf, 0x40, 0x0, - - /* U+0078 "x" */ - 0xd, 0xc0, 0x0, 0x4f, 0x60, 0x3f, 0x80, 0x1e, - 0xb0, 0x0, 0x7f, 0x4b, 0xe1, 0x0, 0x0, 0xbf, - 0xf4, 0x0, 0x0, 0x5, 0xfc, 0x0, 0x0, 0x1, - 0xec, 0xf6, 0x0, 0x0, 0xbe, 0x18, 0xf2, 0x0, - 0x7f, 0x30, 0xc, 0xd0, 0x3f, 0x80, 0x0, 0x2f, - 0x90, - - /* U+0079 "y" */ - 0x4f, 0x30, 0x0, 0xb, 0xc0, 0xe9, 0x0, 0x2, - 0xf6, 0x7, 0xf0, 0x0, 0x8f, 0x0, 0x1f, 0x60, - 0xe, 0x90, 0x0, 0xac, 0x5, 0xf2, 0x0, 0x3, - 0xf3, 0xcc, 0x0, 0x0, 0xd, 0xcf, 0x50, 0x0, - 0x0, 0x6f, 0xe0, 0x0, 0x0, 0x1, 0xf8, 0x0, - 0x0, 0x0, 0x6f, 0x20, 0x0, 0x2, 0x4e, 0xb0, - 0x0, 0x0, 0xbf, 0xc1, 0x0, 0x0, - - /* U+007A "z" */ - 0x1f, 0xff, 0xff, 0xfb, 0x2, 0x22, 0x26, 0xf8, - 0x0, 0x0, 0x1e, 0xb0, 0x0, 0x0, 0xcd, 0x10, - 0x0, 0xa, 0xe2, 0x0, 0x0, 0x8f, 0x40, 0x0, - 0x5, 0xf6, 0x0, 0x0, 0x2f, 0xb2, 0x22, 0x21, - 0x5f, 0xff, 0xff, 0xfb, - - /* U+007B "{" */ - 0x0, 0x9, 0xef, 0x30, 0x6, 0xf6, 0x20, 0x0, - 0x8e, 0x0, 0x0, 0x9, 0xe0, 0x0, 0x0, 0x9d, - 0x0, 0x0, 0xa, 0xd0, 0x0, 0x2, 0xe9, 0x0, - 0xf, 0xfc, 0x10, 0x0, 0x25, 0xf8, 0x0, 0x0, - 0xa, 0xd0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x9, - 0xe0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x6, 0xf3, - 0x0, 0x0, 0x1c, 0xff, 0x20, 0x0, 0x1, 0x20, - - /* U+007C "|" */ - 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, - 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, - - /* U+007D "}" */ - 0xfe, 0xb1, 0x0, 0x2, 0x4f, 0x80, 0x0, 0x0, - 0xbb, 0x0, 0x0, 0xb, 0xc0, 0x0, 0x0, 0xbc, - 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x7f, 0x40, - 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x5f, 0x73, 0x0, - 0xa, 0xd0, 0x0, 0x0, 0xac, 0x0, 0x0, 0xb, - 0xc0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x1e, 0x90, - 0x0, 0xff, 0xd2, 0x0, 0x2, 0x10, 0x0, 0x0, - - /* U+007E "~" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xfe, - 0xa5, 0x12, 0x7a, 0x4d, 0x64, 0x6b, 0xff, 0xfd, - 0x31, 0x0, 0x0, 0x0, 0x31, 0x0, - - /* U+05D0 "א" */ - 0x3f, 0x80, 0x0, 0x3f, 0x40, 0x8f, 0x30, 0x3, - 0xf3, 0x0, 0xdd, 0x0, 0x3f, 0x20, 0x1b, 0xf8, - 0x6, 0xf0, 0xc, 0xb8, 0xf6, 0xe8, 0x4, 0xf1, - 0xc, 0xf7, 0x0, 0x7e, 0x0, 0x2f, 0x80, 0x8, - 0xe0, 0x0, 0x7f, 0x30, 0x8e, 0x0, 0x0, 0xcd, - 0x0, - - /* U+05D1 "ב" */ - 0x5f, 0xff, 0xe8, 0x0, 0x0, 0x11, 0x25, 0xea, - 0x0, 0x0, 0x0, 0x6, 0xf1, 0x0, 0x0, 0x0, - 0x3f, 0x30, 0x0, 0x0, 0x3, 0xf4, 0x0, 0x0, - 0x0, 0x3f, 0x40, 0x0, 0x0, 0x3, 0xf4, 0x0, - 0x22, 0x22, 0x4f, 0x51, 0x5f, 0xff, 0xff, 0xff, - 0x90, - - /* U+05D2 "ג" */ - 0x1f, 0xd8, 0x0, 0x0, 0x14, 0xf7, 0x0, 0x0, - 0x9, 0xd0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, - 0xf0, 0x0, 0x0, 0x9f, 0x10, 0x0, 0xd, 0xf4, - 0x1, 0x4a, 0xbe, 0x80, 0x4f, 0xc1, 0x9e, 0x0, - - /* U+05D3 "ד" */ - 0x5f, 0xff, 0xff, 0xff, 0x30, 0x11, 0x11, 0xda, - 0x10, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x0, - 0xda, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, - 0x0, 0xda, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x0, - 0x0, 0x0, 0xda, 0x0, 0x0, 0x0, 0xd, 0xa0, - 0x0, - - /* U+05D4 "ה" */ - 0x8f, 0xff, 0xfd, 0x70, 0x1, 0x11, 0x26, 0xf6, - 0x0, 0x0, 0x0, 0x9c, 0x4, 0x0, 0x0, 0x7f, - 0x5f, 0x10, 0x0, 0x7f, 0x6f, 0x10, 0x0, 0x7f, - 0x6f, 0x10, 0x0, 0x7f, 0x6f, 0x10, 0x0, 0x7f, - 0x6f, 0x10, 0x0, 0x7f, - - /* U+05D5 "ו" */ - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, - - /* U+05D6 "ז" */ - 0x5f, 0xff, 0xd0, 0x1c, 0x81, 0x3, 0xf2, 0x0, - 0x6f, 0x10, 0x6, 0xf0, 0x0, 0x6f, 0x0, 0x6, - 0xf0, 0x0, 0x6f, 0x0, 0x6, 0xf0, 0x0, - - /* U+05D7 "ח" */ - 0x8f, 0xff, 0xfd, 0x70, 0x8e, 0x11, 0x26, 0xf7, - 0x8e, 0x0, 0x0, 0x9d, 0x8e, 0x0, 0x0, 0x7f, - 0x8e, 0x0, 0x0, 0x7f, 0x8e, 0x0, 0x0, 0x7f, - 0x8e, 0x0, 0x0, 0x7f, 0x8e, 0x0, 0x0, 0x7f, - 0x8e, 0x0, 0x0, 0x7f, - - /* U+05D8 "ט" */ - 0x8e, 0x0, 0xcf, 0xd4, 0x8, 0xe0, 0x4, 0x3b, - 0xe0, 0x8e, 0x0, 0x0, 0x3f, 0x48, 0xe0, 0x0, - 0x0, 0xf7, 0x8e, 0x0, 0x0, 0xf, 0x77, 0xf0, - 0x0, 0x0, 0xf6, 0x4f, 0x30, 0x0, 0x4f, 0x40, - 0xde, 0x63, 0x6e, 0xc0, 0x1, 0xae, 0xfe, 0x91, - 0x0, - - /* U+05D9 "י" */ - 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0x40, - - /* U+05DA "ך" */ - 0x5f, 0xff, 0xd7, 0x0, 0x1, 0x13, 0x8f, 0x70, - 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, 0x6, 0xf1, - 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, - 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, - 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, - 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, - - /* U+05DB "כ" */ - 0x5f, 0xff, 0xd8, 0x0, 0x1, 0x12, 0x5d, 0xa0, - 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0xf7, - 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xf7, - 0x0, 0x0, 0x4, 0xf3, 0x1, 0x12, 0x5d, 0xa0, - 0x5f, 0xff, 0xd8, 0x0, - - /* U+05DC "ל" */ - 0x28, 0x10, 0x0, 0x0, 0x5f, 0x20, 0x0, 0x0, - 0x5f, 0x20, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfd, - 0x1, 0x11, 0x12, 0xf9, 0x0, 0x0, 0x6, 0xf2, - 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0x2f, 0x50, - 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0xf8, 0x0, - 0x0, 0x6, 0xf2, 0x0, 0x0, 0xc, 0xb0, 0x0, - - /* U+05DD "ם" */ - 0x8f, 0xff, 0xfe, 0x90, 0x8, 0xe1, 0x12, 0x5e, - 0x90, 0x8e, 0x0, 0x0, 0x7f, 0x8, 0xe0, 0x0, - 0x4, 0xf2, 0x8e, 0x0, 0x0, 0x4f, 0x28, 0xe0, - 0x0, 0x4, 0xf2, 0x8e, 0x0, 0x0, 0x4f, 0x28, - 0xe2, 0x22, 0x25, 0xf2, 0x8f, 0xff, 0xff, 0xff, - 0x20, - - /* U+05DE "מ" */ - 0x1f, 0x90, 0xae, 0xfc, 0x20, 0x9, 0xea, 0xc2, - 0x1c, 0xd0, 0x3, 0xff, 0x20, 0x4, 0xf3, 0x0, - 0xfc, 0x0, 0x1, 0xf6, 0x0, 0xf8, 0x0, 0x0, - 0xf6, 0x2, 0xf5, 0x0, 0x0, 0xf6, 0x5, 0xf2, - 0x0, 0x0, 0xf6, 0x8, 0xf0, 0x1, 0x12, 0xf6, - 0xb, 0xc0, 0xf, 0xff, 0xf6, - - /* U+05DF "ן" */ - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, 0x8e, 0x8e, - - /* U+05E0 "נ" */ - 0x1f, 0xea, 0x10, 0x14, 0xea, 0x0, 0x9, 0xe0, - 0x0, 0x8e, 0x0, 0x8, 0xf0, 0x0, 0x8f, 0x0, - 0x8, 0xf0, 0x22, 0x9f, 0x5f, 0xff, 0xf0, - - /* U+05E1 "ס" */ - 0x8f, 0xff, 0xfe, 0x91, 0x8, 0xe3, 0x33, 0x6e, - 0xd0, 0x8e, 0x0, 0x0, 0x3f, 0x48, 0xe0, 0x0, - 0x0, 0xf7, 0x8e, 0x0, 0x0, 0xf, 0x77, 0xf0, - 0x0, 0x1, 0xf6, 0x3f, 0x50, 0x0, 0x6f, 0x30, - 0xcf, 0x64, 0x7f, 0xb0, 0x1, 0x9e, 0xfe, 0x90, - 0x0, - - /* U+05E2 "ע" */ - 0x2f, 0x50, 0x0, 0xf, 0x90, 0xea, 0x0, 0x0, - 0xf9, 0x9, 0xe0, 0x0, 0xf, 0x80, 0x4f, 0x30, - 0x0, 0xf7, 0x0, 0xf7, 0x0, 0x2f, 0x50, 0xb, - 0xc0, 0x6, 0xf1, 0x0, 0x6f, 0x2, 0xe9, 0x0, - 0x2, 0xfa, 0xea, 0x0, 0x5, 0xbf, 0xd5, 0x0, - 0x4, 0xe9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+05E3 "ף" */ - 0x8f, 0xff, 0xfc, 0x50, 0x8e, 0x11, 0x39, 0xf3, - 0x8e, 0x0, 0x0, 0xe9, 0x7f, 0x20, 0x0, 0xbc, - 0x1d, 0xfe, 0x0, 0xac, 0x0, 0x21, 0x0, 0xac, - 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0xac, - 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0xac, - 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0xac, - - /* U+05E4 "פ" */ - 0x8f, 0xff, 0xeb, 0x30, 0x8, 0xe1, 0x24, 0xbf, - 0x30, 0x8e, 0x0, 0x0, 0xbc, 0x6, 0xf2, 0x0, - 0x6, 0xf0, 0x1d, 0xfe, 0x0, 0x5f, 0x10, 0x2, - 0x10, 0x6, 0xf0, 0x0, 0x0, 0x0, 0xcc, 0x0, - 0x11, 0x24, 0xaf, 0x30, 0x8f, 0xff, 0xfb, 0x30, - 0x0, - - /* U+05E5 "ץ" */ - 0x1e, 0xa0, 0x0, 0x7f, 0x4, 0xf5, 0x0, 0x8e, - 0x0, 0x9e, 0x10, 0xbb, 0x0, 0x1e, 0x86, 0xf3, - 0x0, 0x9, 0xfe, 0x50, 0x0, 0x6, 0xf1, 0x0, - 0x0, 0x5, 0xf1, 0x0, 0x0, 0x5, 0xf1, 0x0, - 0x0, 0x5, 0xf1, 0x0, 0x0, 0x5, 0xf1, 0x0, - 0x0, 0x5, 0xf1, 0x0, 0x0, 0x5, 0xf1, 0x0, - - /* U+05E6 "צ" */ - 0x1e, 0xb0, 0x0, 0x6f, 0x0, 0x5f, 0x60, 0x6, - 0xf0, 0x0, 0xaf, 0x10, 0x7e, 0x0, 0x1, 0xeb, - 0xa, 0xb0, 0x0, 0x5, 0xfb, 0xf3, 0x0, 0x0, - 0xa, 0xf4, 0x0, 0x0, 0x0, 0x1e, 0xb0, 0x0, - 0x11, 0x11, 0x7f, 0x60, 0x5f, 0xff, 0xff, 0xff, - 0x0, - - /* U+05E7 "ק" */ - 0x8f, 0xff, 0xff, 0xff, 0xf2, 0x1, 0x11, 0x11, - 0x1c, 0xd0, 0x0, 0x0, 0x0, 0x1f, 0x70, 0x4, - 0x0, 0x0, 0x8f, 0x10, 0x5f, 0x10, 0x0, 0xea, - 0x0, 0x5f, 0x10, 0x4, 0xf3, 0x0, 0x5f, 0x10, - 0xb, 0xd0, 0x0, 0x5f, 0x10, 0x1f, 0x60, 0x0, - 0x5f, 0x10, 0x8f, 0x0, 0x0, 0x5f, 0x10, 0x0, - 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, 0x5f, - 0x10, 0x0, 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, - 0x0, - - /* U+05E8 "ר" */ - 0x5f, 0xff, 0xd9, 0x10, 0x1, 0x12, 0x5e, 0xc0, - 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x0, 0xf7, - 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xe9, - 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xe9, - 0x0, 0x0, 0x0, 0xe9, - - /* U+05E9 "ש" */ - 0x3f, 0x30, 0xf, 0x50, 0xd, 0x91, 0xf5, 0x1, - 0xf4, 0x0, 0xf7, 0xf, 0x70, 0x4f, 0x10, 0x1f, - 0x40, 0xda, 0x1b, 0xc0, 0x4, 0xf1, 0xb, 0xff, - 0xd2, 0x0, 0x8d, 0x0, 0x9e, 0x10, 0x0, 0xd, - 0x80, 0x7, 0xf0, 0x0, 0x9, 0xf1, 0x0, 0x5f, - 0x42, 0x5c, 0xf4, 0x0, 0x2, 0xff, 0xfd, 0x82, - 0x0, 0x0, - - /* U+05EA "ת" */ - 0x7f, 0xff, 0xff, 0xd8, 0x0, 0x3, 0xf6, 0x12, - 0x6f, 0x70, 0x2, 0xf5, 0x0, 0x9, 0xe0, 0x2, - 0xf5, 0x0, 0x6, 0xf0, 0x2, 0xf5, 0x0, 0x6, - 0xf0, 0x2, 0xf5, 0x0, 0x6, 0xf1, 0x2, 0xf4, - 0x0, 0x6, 0xf1, 0x17, 0xf1, 0x0, 0x6, 0xf1, - 0xde, 0x70, 0x0, 0x6, 0xf1, - - /* U+0606 "؆" */ - 0x0, 0x1, 0x51, 0x53, 0x30, 0x0, 0x0, 0xe7, - 0xb8, 0x50, 0xd9, 0x0, 0x9f, 0xcc, 0x10, 0xd, - 0x0, 0x58, 0x0, 0x0, 0x7, 0x60, 0x3a, 0x0, - 0x0, 0x1, 0xc0, 0x2b, 0x0, 0x0, 0x0, 0xb2, - 0x14, 0x0, 0x0, 0x0, 0x58, 0x0, 0x5, 0x50, - 0x0, 0xd, 0x0, 0xe, 0xa5, 0x0, 0x9, 0x40, - 0x4f, 0x10, 0x0, 0x2, 0xa0, 0xab, 0x0, 0x0, - 0x0, 0xc2, 0xf5, 0x0, 0x0, 0x0, 0x6d, 0xf0, - 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, 0x0, 0x0, - 0xa, 0x30, 0x0, - - /* U+0607 "؇" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0xa, - 0xb2, 0x0, 0xc9, 0x0, 0x3c, 0x10, 0x0, 0xc, - 0x0, 0x3d, 0x90, 0x0, 0x7, 0x60, 0xb4, 0x1, - 0x0, 0x1, 0xc0, 0x3c, 0xca, 0x0, 0x0, 0xb2, - 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, 0xb, 0xd5, - 0x0, 0xd, 0x0, 0x1f, 0x51, 0x0, 0x8, 0x50, - 0x6f, 0x0, 0x0, 0x2, 0xb0, 0xca, 0x0, 0x0, - 0x0, 0xc4, 0xf4, 0x0, 0x0, 0x0, 0x6e, 0xe0, - 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, 0x0, 0x0, - 0xa, 0x30, 0x0, - - /* U+0609 "؉" */ - 0xd9, 0x0, 0xe, 0x40, 0x0, 0xc8, 0x0, 0x7c, - 0x0, 0x0, 0x0, 0x1, 0xe3, 0x0, 0x0, 0x0, - 0x8, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0x30, 0x0, - 0x0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0x2, 0xf2, - 0x0, 0x0, 0x0, 0xa, 0x90, 0x0, 0x0, 0x0, - 0x2f, 0x10, 0xe, 0x60, 0x6e, 0xb8, 0x0, 0xf, - 0x70, 0x7f, - - /* U+060A "؊" */ - 0xd9, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0xc8, - 0x0, 0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0x10, 0xe, 0x60, 0x6e, 0x0, 0xe7, 0xb8, - 0x0, 0xf, 0x70, 0x7f, 0x0, 0xf7, - - /* U+060C "،" */ - 0x2, 0xc0, 0xba, 0x2f, 0x64, 0xf5, - - /* U+0615 "ؕ" */ - 0x0, 0x0, 0x0, 0x6, 0x60, 0x0, 0x6, 0x65, - 0x50, 0x6, 0xd6, 0xe0, 0xd, 0xdc, 0x70, - - /* U+061B "؛" */ - 0x4, 0xd0, 0xc9, 0x3f, 0x63, 0xd4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0x54, 0xf5, - - /* U+061F "؟" */ - 0x8, 0xef, 0xd8, 0x17, 0xf9, 0x57, 0xd6, 0xcd, - 0x0, 0x0, 0x1b, 0xe0, 0x0, 0x0, 0x3f, 0xa0, - 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x5f, 0x30, - 0x0, 0x1, 0xf6, 0x0, 0x0, 0xd, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0x70, 0x0, 0x1, - 0xf7, 0x0, - - /* U+0621 "ء" */ - 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x6f, 0x95, - 0x40, 0xad, 0x0, 0x0, 0x8f, 0x40, 0x11, 0x1a, - 0xff, 0xf3, 0x5c, 0xfe, 0x70, 0x9a, 0x40, 0x0, - - /* U+0622 "آ" */ - 0x19, 0x40, 0x19, 0x8, 0x5a, 0xdb, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, - 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, - 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, - 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, 0xf0, - 0x0, 0x0, 0x7f, 0x0, 0x0, - - /* U+0623 "أ" */ - 0x9, 0xc3, 0x1b, 0x0, 0xd, 0xb6, 0x17, 0x30, - 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, - 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, - 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, - - /* U+0624 "ؤ" */ - 0x0, 0x5, 0xc7, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x9, 0xa7, 0x0, 0x0, 0xb, 0x94, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xed, 0x40, - 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, - 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, - 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, - 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, - 0x34, 0x20, 0x0, 0x0, - - /* U+0625 "إ" */ - 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, - 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, - 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, - 0x9, 0xc3, 0x1b, 0x0, 0xd, 0xb6, 0x16, 0x20, - - /* U+0626 "ئ" */ - 0x1, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xeb, 0x20, 0x0, 0x0, - 0x0, 0x35, 0x20, 0x6d, 0xfe, 0x70, 0x0, 0x0, - 0x4f, 0x94, 0x7f, 0x40, 0x0, 0x5, 0xf7, 0x0, - 0x10, 0x12, 0x0, 0x9, 0xfe, 0x80, 0xc, 0xa0, - 0x0, 0x2, 0x7e, 0xb0, 0xf7, 0x0, 0x0, 0x0, - 0xaf, 0xd, 0xc0, 0x0, 0x2, 0x9f, 0x90, 0x4f, - 0xfc, 0xcf, 0xff, 0x90, 0x0, 0x28, 0xba, 0x85, - 0x10, 0x0, - - /* U+0627 "ا" */ - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, - - /* U+0628 "ب" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, - 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, - 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, - - /* U+0629 "ة" */ - 0xf, 0x3f, 0x10, 0x0, 0x20, 0x20, 0x0, 0x0, - 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, 0x5a, - 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, 0x3f, - 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, 0x0, - - /* U+062A "ت" */ - 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x5, 0x70, - 0x1, 0x11, 0x10, 0x0, 0x9c, 0xe8, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, 0x0, 0x0, - 0x7, 0xf7, 0x7f, 0xd8, 0x66, 0x79, 0xcf, 0xf8, - 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, 0x0, - - /* U+062B "ث" */ - 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, - 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, - 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, - 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, - 0xfe, 0xc9, 0x61, 0x0, - - /* U+062C "ج" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, - 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, - 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, - 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, - 0x2, 0x0, 0x0, 0x6f, 0x0, 0xf, 0x30, 0x0, - 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, - 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, - 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, - 0x0, - - /* U+062D "ح" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, - 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, - 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, - 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, 0x6f, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, - 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, 0xf9, 0x31, - 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x13, 0x31, 0x0, - - /* U+062E "خ" */ - 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, - 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, - 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, - 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, - 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, - 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, - 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, - 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, - - /* U+062F "د" */ - 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, - 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, - 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, - 0x0, - - /* U+0630 "ذ" */ - 0x0, 0x7b, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, - 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, - 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, - 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, - 0xdf, 0xe8, 0x0, - - /* U+0631 "ر" */ - 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0xba, - 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0xca, - 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x4e, 0xd0, - 0x14, 0x6c, 0xfd, 0x20, 0xaf, 0xfc, 0x60, 0x0, - 0x33, 0x10, 0x0, 0x0, - - /* U+0632 "ز" */ - 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7, - 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, 0xab, - 0x0, 0x0, 0x0, 0xda, 0x0, 0x0, 0x4, 0xf5, - 0x0, 0x0, 0x4f, 0xd0, 0x14, 0x6c, 0xfd, 0x20, - 0xaf, 0xfc, 0x60, 0x0, 0x33, 0x10, 0x0, 0x0, - - /* U+0633 "س" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xf3, 0x0, 0x0, 0x0, 0xd, 0x90, 0x4, 0xf2, - 0x3, 0xf3, 0x0, 0x0, 0x0, 0x9, 0xd0, 0x6, - 0xf3, 0x4, 0xf3, 0x5f, 0x10, 0x0, 0x6, 0xf3, - 0xa, 0xf8, 0x6, 0xf1, 0xcb, 0x0, 0x0, 0x6, - 0xfe, 0xbf, 0xcf, 0xbf, 0xc0, 0xe8, 0x0, 0x0, - 0x9, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, 0xf8, 0x0, - 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbe, - 0x52, 0x27, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x2d, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x24, 0x41, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0634 "ش" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x4e, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x2, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, - 0x10, 0x0, 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, - 0xc, 0x90, 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, - 0x0, 0x8, 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, - 0x10, 0x0, 0x6, 0xf3, 0xa, 0xf9, 0x7, 0xf1, - 0xca, 0x0, 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, - 0xb0, 0xe8, 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, - 0xfb, 0x10, 0xe8, 0x0, 0x0, 0x4f, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0xbe, 0x52, 0x27, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x41, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0635 "ص" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, - 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, - 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, - 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, - 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, - 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, - 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0636 "ض" */ - 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, - 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, - 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, - 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, - 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, - 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, - 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0637 "ط" */ - 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, - 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, - 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, - 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, - 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, - - /* U+0638 "ظ" */ - 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x70, 0x5c, 0x0, 0x0, - 0x0, 0x0, 0xf7, 0x1, 0x20, 0x0, 0x0, 0x0, - 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, - 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, - 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, - 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, - 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, - - /* U+0639 "ع" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, - 0x20, 0x0, 0x0, 0xce, 0x75, 0x0, 0x0, 0x4, - 0xf2, 0x0, 0x0, 0x0, 0x4, 0xf4, 0x26, 0xbd, - 0x0, 0x0, 0xaf, 0xff, 0xd9, 0x0, 0x0, 0xbf, - 0x92, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, - 0xf, 0x80, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, - 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0x6, - 0xf9, 0x31, 0x13, 0x95, 0x0, 0x6d, 0xff, 0xff, - 0xd3, 0x0, 0x0, 0x13, 0x31, 0x0, - - /* U+063A "غ" */ - 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xef, 0x20, 0x0, 0x0, - 0xce, 0x75, 0x0, 0x0, 0x4, 0xf2, 0x0, 0x0, - 0x0, 0x4, 0xf4, 0x26, 0xbd, 0x0, 0x0, 0xaf, - 0xff, 0xd9, 0x0, 0x0, 0xbf, 0x92, 0x0, 0x0, - 0x9, 0xf4, 0x0, 0x0, 0x0, 0xf, 0x80, 0x0, - 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, 0xe, - 0x90, 0x0, 0x0, 0x0, 0x6, 0xf9, 0x31, 0x13, - 0x95, 0x0, 0x6d, 0xff, 0xff, 0xd3, 0x0, 0x0, - 0x13, 0x31, 0x0, - - /* U+0640 "ـ" */ - 0x17, 0x77, 0x75, 0x2f, 0xff, 0xfd, - - /* U+0641 "ف" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xfd, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xf9, 0xee, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xda, 0x5, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xd1, 0x8f, 0x3b, 0xa0, 0x0, 0x0, - 0x0, 0x4f, 0xfe, 0xf1, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xbc, 0xb, 0xf8, 0x32, 0x12, 0x24, - 0x6a, 0xfe, 0x20, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xc7, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, - 0x0, 0x0, - - /* U+0642 "ق" */ - 0x0, 0x0, 0x0, 0x5c, 0x6c, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x12, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0xaf, 0x9e, 0xa0, - 0x0, 0x0, 0x0, 0xf9, 0x7, 0xf0, 0x0, 0x0, - 0x0, 0xdc, 0x19, 0xf2, 0x3, 0x50, 0x0, 0x5f, - 0xfe, 0xf3, 0xc, 0x90, 0x0, 0x1, 0x24, 0xf1, - 0xf, 0x50, 0x0, 0x0, 0x9, 0xd0, 0x2f, 0x40, - 0x0, 0x0, 0x3f, 0x60, 0xf, 0x70, 0x0, 0x4, - 0xeb, 0x0, 0xb, 0xe5, 0x35, 0xaf, 0xb0, 0x0, - 0x1, 0xdf, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x3, - 0x43, 0x0, 0x0, 0x0, - - /* U+0643 "ك" */ - 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, - 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, - 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, - 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, - 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, - 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, - 0xb4, 0x0, - - /* U+0644 "ل" */ - 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, - 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, - 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, - 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, - 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, - 0x0, 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, - 0x5, 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, - 0x0, 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, - 0x20, 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, - 0x30, 0x0, 0x0, - - /* U+0645 "م" */ - 0x0, 0x2, 0x87, 0x10, 0x0, 0x2f, 0xff, 0xf3, - 0x0, 0xae, 0x11, 0xea, 0x3, 0xdd, 0x32, 0xea, - 0x5f, 0xbe, 0xff, 0xe3, 0xcb, 0x0, 0x23, 0x0, - 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, - 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, - - /* U+0646 "ن" */ - 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf2, 0x23, - 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x0, - 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, 0xc9, 0x0, - 0x0, 0x3, 0xf5, 0xad, 0x0, 0x0, 0xa, 0xe0, - 0x3f, 0xa4, 0x24, 0xaf, 0x60, 0x5, 0xef, 0xff, - 0xe5, 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, - - /* U+0647 "ه" */ - 0x0, 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, - 0x5a, 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, - 0x3f, 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, - 0x0, - - /* U+0648 "و" */ - 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, - 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, - 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, - 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, - 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, - - /* U+0649 "ى" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, - 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, - 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, - 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, - 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, - 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, - - /* U+064A "ي" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, - 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, - 0x8, 0xff, 0xa1, 0xc, 0xa0, 0x0, 0x0, 0x5e, - 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xb, 0xd1, - 0x0, 0x4, 0xaf, 0x70, 0x1c, 0xfd, 0xef, 0xfb, - 0x40, 0x0, 0x3, 0x55, 0x30, 0x0, 0x0, 0x0, - 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, - 0x0, 0x0, - - /* U+064B "ً" */ - 0x0, 0x0, 0x0, 0x5, 0x9c, 0xd3, 0x27, 0x41, - 0x21, 0x17, 0xbd, 0xb2, 0x25, 0x20, 0x0, - - /* U+064C "ٌ" */ - 0x0, 0x5d, 0x60, 0x0, 0xa7, 0xc0, 0x36, 0x1c, - 0xe3, 0x2a, 0x1c, 0x10, 0x9, 0xc3, 0x0, - - /* U+064D "ٍ" */ - 0x1, 0x48, 0xb3, 0x3c, 0x85, 0x10, 0x3, 0x6a, - 0xd3, 0x3a, 0x63, 0x0, - - /* U+064E "َ" */ - 0x0, 0x0, 0x21, 0x17, 0xbd, 0xb2, 0x25, 0x20, - 0x0, - - /* U+064F "ُ" */ - 0x0, 0x5d, 0x60, 0x0, 0xa7, 0xc0, 0x0, 0x3e, - 0xe3, 0x1, 0x8b, 0x0, 0x3c, 0x60, 0x0, - - /* U+0650 "ِ" */ - 0x0, 0x14, 0x82, 0x3d, 0xc9, 0x50, 0x0, 0x0, - 0x0, - - /* U+0651 "ّ" */ - 0x0, 0x0, 0x32, 0x12, 0x66, 0x56, 0x66, 0x67, - 0x66, 0x66, 0x9c, 0xd3, 0x2e, 0x92, 0x30, - - /* U+0652 "ْ" */ - 0x5, 0xdd, 0x50, 0xe, 0x12, 0xe0, 0xe, 0x22, - 0xe0, 0x5, 0xed, 0x50, - - /* U+0653 "ٓ" */ - 0x2a, 0x20, 0x28, 0x94, 0xbd, 0xa3, 0x0, 0x0, - 0x0, - - /* U+0654 "ٔ" */ - 0x1b, 0xb1, 0x57, 0x0, 0x2e, 0xb3, 0x35, 0x20, - - /* U+0655 "ٕ" */ - 0x1b, 0xb1, 0x57, 0x0, 0x2e, 0xb3, 0x35, 0x20, - - /* U+0657 "ٗ" */ - 0x0, 0x5, 0xc3, 0x0, 0xa8, 0x10, 0x3e, 0xe3, - 0x0, 0xc, 0x7a, 0x0, 0x6, 0xe5, 0x0, - - /* U+065A "ٚ" */ - 0x7, 0x11, 0x70, 0x7, 0xaa, 0x70, 0x0, 0xdd, - 0x0, - - /* U+0660 "٠" */ - 0x8f, 0x29, 0xf2, - - /* U+0661 "١" */ - 0xae, 0x0, 0x4f, 0x30, 0xe, 0x90, 0x9, 0xd0, - 0x5, 0xf1, 0x2, 0xf4, 0x0, 0xf6, 0x0, 0xf6, - 0x0, 0xf7, 0x0, 0xf7, - - /* U+0662 "٢" */ - 0x2f, 0x70, 0x0, 0xac, 0xc, 0xf7, 0x26, 0xf7, - 0x6, 0xff, 0xff, 0xc0, 0x2, 0xf7, 0x33, 0x0, - 0x0, 0xea, 0x0, 0x0, 0x0, 0xbc, 0x0, 0x0, - 0x0, 0x9d, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, - 0x0, 0x7e, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, - - /* U+0663 "٣" */ - 0x3f, 0x40, 0xf6, 0x4f, 0x20, 0xda, 0xf, 0x97, - 0xf1, 0x7, 0xfd, 0xff, 0xfc, 0x0, 0x2f, 0x91, - 0x33, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xb, - 0xb0, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, - 0x9, 0xd0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, - 0x0, 0x8, 0xe0, 0x0, 0x0, - - /* U+0664 "٤" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x9e, 0x40, 0x4, - 0xfd, 0x71, 0x0, 0xda, 0x0, 0x0, 0xa, 0xe4, - 0x0, 0x0, 0x2e, 0xf6, 0x0, 0x1e, 0xd6, 0x10, - 0x8, 0xe0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x3, - 0xfb, 0x79, 0xd5, 0x5, 0xdf, 0xd9, 0x10, - - /* U+0665 "٥" */ - 0x0, 0x1, 0x0, 0x0, 0x1d, 0xf9, 0x0, 0xb, - 0xd8, 0xf5, 0x3, 0xf4, 0xb, 0xc0, 0x8e, 0x0, - 0x4f, 0x2c, 0xa0, 0x0, 0xf6, 0xe8, 0x0, 0xe, - 0x8e, 0x80, 0x0, 0xe8, 0xcc, 0x0, 0x2f, 0x67, - 0xfa, 0x8d, 0xf1, 0x8, 0xef, 0xd4, 0x0, - - /* U+0666 "٦" */ - 0x25, 0x21, 0x24, 0x40, 0x4f, 0xff, 0xff, 0xa0, - 0x1, 0x34, 0x3c, 0xa0, 0x0, 0x0, 0xb, 0xb0, - 0x0, 0x0, 0xa, 0xc0, 0x0, 0x0, 0x8, 0xe0, - 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x4, 0xf2, - 0x0, 0x0, 0x2, 0xf5, 0x0, 0x0, 0x0, 0xf8, - 0x0, 0x0, 0x0, 0xbc, - - /* U+0667 "٧" */ - 0x4f, 0x30, 0x0, 0xad, 0x0, 0xda, 0x0, 0x1f, - 0x60, 0x6, 0xf1, 0x7, 0xe0, 0x0, 0x1f, 0x70, - 0xd9, 0x0, 0x0, 0xbc, 0x2f, 0x40, 0x0, 0x5, - 0xf9, 0xf0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0xdf, 0x70, 0x0, 0x0, 0x9, 0xf4, 0x0, - 0x0, 0x0, 0x7f, 0x10, 0x0, - - /* U+0668 "٨" */ - 0x0, 0x7, 0xf1, 0x0, 0x0, 0x0, 0x9f, 0x40, - 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x1, 0xff, - 0xb0, 0x0, 0x0, 0x5f, 0x9f, 0x0, 0x0, 0xb, - 0xc2, 0xf4, 0x0, 0x1, 0xf6, 0xd, 0x90, 0x0, - 0x6f, 0x10, 0x7e, 0x0, 0xd, 0xa0, 0x1, 0xf6, - 0x4, 0xf3, 0x0, 0xa, 0xd0, - - /* U+0669 "٩" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf7, 0x0, - 0xd, 0xc5, 0xaf, 0x40, 0x2f, 0x40, 0xd, 0x90, - 0xe, 0xb4, 0x2b, 0xc0, 0x3, 0xdf, 0xff, 0xd0, - 0x0, 0x2, 0x49, 0xf0, 0x0, 0x0, 0x5, 0xf2, - 0x0, 0x0, 0x2, 0xf5, 0x0, 0x0, 0x0, 0xf8, - 0x0, 0x0, 0x0, 0xbc, - - /* U+066A "٪" */ - 0xd9, 0x0, 0xe, 0x4c, 0x80, 0x7, 0xc0, 0x0, - 0x1, 0xe3, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x1f, - 0x30, 0x0, 0x9, 0xa0, 0x0, 0x2, 0xf2, 0x0, - 0x0, 0xa9, 0x0, 0x0, 0x2f, 0x10, 0xe, 0x6b, - 0x80, 0x0, 0xf7, - - /* U+066B "٫" */ - 0x0, 0x6, 0x80, 0x0, 0x6c, 0x0, 0x8, 0xb0, - 0x0, 0xc7, 0x0, 0x6f, 0x21, 0x7f, 0x60, 0xfe, - 0x60, 0x2, 0x0, 0x0, - - /* U+066C "٬" */ - 0xa, 0x70, 0xf9, 0x3f, 0x27, 0xa0, - - /* U+066D "٭" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0x5, 0xf1, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0x60, 0x0, 0x5f, 0xfe, 0x20, 0x0, 0x5, - 0xfd, 0xf1, 0x0, 0x0, 0x94, 0x8, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+066E "ٮ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, - 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, - 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, - - /* U+066F "ٯ" */ - 0x0, 0x0, 0x0, 0x1b, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0xaf, 0x9e, 0xa0, 0x0, 0x0, 0x0, 0xf9, - 0x7, 0xf0, 0x0, 0x0, 0x0, 0xdc, 0x19, 0xf2, - 0x3, 0x50, 0x0, 0x5f, 0xfe, 0xf3, 0xc, 0x90, - 0x0, 0x1, 0x24, 0xf1, 0xf, 0x50, 0x0, 0x0, - 0x9, 0xd0, 0x2f, 0x40, 0x0, 0x0, 0x3f, 0x60, - 0xf, 0x70, 0x0, 0x4, 0xeb, 0x0, 0xb, 0xe5, - 0x35, 0xaf, 0xb0, 0x0, 0x1, 0xdf, 0xff, 0xe7, - 0x0, 0x0, 0x0, 0x3, 0x43, 0x0, 0x0, 0x0, - - /* U+0670 "ٰ" */ - 0x33, 0x67, 0x67, 0x67, 0x67, - - /* U+0674 "ٴ" */ - 0x8, 0xc5, 0xc, 0x0, 0xc, 0xc7, 0x6, 0x30, - - /* U+0679 "ٹ" */ - 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, - 0x66, 0x0, 0x0, 0x0, 0x0, 0x5, 0xe7, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0xbb, 0xa6, 0x0, 0x1, - 0x18, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xe7, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, - 0x0, 0x0, 0x18, 0xf6, 0x6f, 0xd8, 0x66, 0x7a, - 0xcf, 0xf7, 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, - 0x0, - - /* U+067A "ٺ" */ - 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x90, 0x0, 0x0, 0x5, 0x70, 0x0, 0x11, 0x0, - 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, - 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, - 0xfe, 0xc9, 0x61, 0x0, - - /* U+067B "ٻ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, - 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, - 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, - - /* U+067C "ټ" */ - 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x5, 0x70, - 0x1, 0x11, 0x10, 0x0, 0x9c, 0xe8, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, 0x0, 0x0, - 0x7, 0xf7, 0x7f, 0xd8, 0x66, 0x79, 0xcf, 0xf8, - 0x0, 0x4a, 0xef, 0xff, 0xd9, 0x61, 0x0, 0x0, - 0x0, 0x87, 0x69, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x76, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd3, - 0x0, 0x0, 0x0, - - /* U+067D "ٽ" */ - 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x89, 0x0, - 0x0, 0x9b, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, - 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, - 0xfe, 0xc9, 0x61, 0x0, - - /* U+067E "پ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, - 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, - 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, - - /* U+067F "ٿ" */ - 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8a, - 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, - 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, - 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, - 0xfe, 0xc9, 0x61, 0x0, - - /* U+0680 "ڀ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, - 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, - 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xa9, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x11, 0x11, 0x0, 0x0, 0x0, - - /* U+0681 "ځ" */ - 0x0, 0xa, 0xc2, 0x0, 0x0, 0x0, 0x38, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xa4, 0x0, 0x0, 0x0, - 0x38, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9e, 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, - 0xe8, 0x41, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, - 0xc, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, - 0x0, 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0x10, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, - 0x0, 0x8, 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, - 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, - - /* U+0682 "ڂ" */ - 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, - 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9e, 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, - 0xe8, 0x41, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, - 0xc, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, - 0x0, 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0x10, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, - 0x0, 0x8, 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, - 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, - - /* U+0683 "ڃ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, - 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, - 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, - 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, - 0x20, 0x20, 0x0, 0x6f, 0x0, 0xe4, 0xf3, 0x0, - 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, - 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, - 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, - 0x0, - - /* U+0684 "ڄ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, - 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, - 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, - 0x0, 0x3f, 0x30, 0xe, 0x30, 0x0, 0x6f, 0x0, - 0x2, 0x0, 0x0, 0x5f, 0x10, 0xf, 0x30, 0x0, - 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, - 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x13, 0x31, 0x0, - - /* U+0685 "څ" */ - 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0x7a, 0x8a, 0x0, 0x0, 0x0, - 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9e, 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, - 0xe8, 0x41, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, - 0xc, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, - 0x0, 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0x10, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, - 0x0, 0x8, 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, - 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, - - /* U+0686 "چ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, - 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, - 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, - 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, - 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd, 0x50, 0x0, - 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, - 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x13, 0x31, 0x0, - - /* U+0687 "ڇ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, - 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, - 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, - 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, - 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd5, 0xe4, 0x0, - 0x1f, 0x80, 0x21, 0x20, 0x0, 0x8, 0xf9, 0x31, - 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x13, 0x31, 0x0, - - /* U+0688 "ڈ" */ - 0x0, 0xc0, 0x0, 0x0, 0xc, 0x26, 0x10, 0x0, - 0xda, 0x98, 0x0, 0x6e, 0xcc, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xb7, 0x0, 0x0, 0x5, 0xf5, - 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x5f, 0x20, - 0x0, 0x7, 0xf1, 0x9, 0x6a, 0xfc, 0x0, 0xdf, - 0xe9, 0x10, - - /* U+0689 "ډ" */ - 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, - 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, - 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xff, 0xf1, - 0x0, 0xa, 0x58, 0x80, 0x0, 0xb5, 0x88, 0x0, - 0x3, 0xdc, 0x10, - - /* U+068A "ڊ" */ - 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, - 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, - 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, - 0x0, 0x11, 0x0, - - /* U+068B "ڋ" */ - 0x0, 0xc0, 0x0, 0x0, 0xc, 0x26, 0x10, 0x0, - 0xda, 0x98, 0x0, 0x6e, 0xcc, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xb7, 0x0, 0x0, 0x5, 0xf5, - 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x5f, 0x20, - 0x0, 0x7, 0xf1, 0x9, 0x6a, 0xfc, 0x0, 0xdf, - 0xe9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7, - 0x0, 0x0, 0x1, 0x10, 0x0, - - /* U+068C "ڌ" */ - 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, - 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, - 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, - 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, - 0xdf, 0xe8, 0x0, - - /* U+068D "ڍ" */ - 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, - 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, - 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, - 0x1, 0x11, 0x10, - - /* U+068E "ڎ" */ - 0x0, 0xf, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, - 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, 0x13, - 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, 0xf8, - 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, 0x20, - 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, 0xdf, - 0xe8, 0x0, - - /* U+068F "ڏ" */ - 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, - 0xf, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, 0x2b, - 0x60, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0xad, - 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x7f, 0x10, - 0x96, 0xaf, 0xc0, 0xd, 0xfe, 0x91, 0x0, - - /* U+0690 "ڐ" */ - 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, - 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, 0x13, - 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, 0xf8, - 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, 0x20, - 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, 0xdf, - 0xe8, 0x0, - - /* U+0691 "ڑ" */ - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0xc, 0x27, 0x10, 0x0, 0x0, - 0xda, 0x97, 0x0, 0x0, 0x7e, 0xcb, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x70, 0x0, 0x0, 0x0, 0xbb, - 0x0, 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, - 0xd9, 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, - 0x4f, 0xd0, 0x1, 0x46, 0xcf, 0xd1, 0x0, 0xaf, - 0xfc, 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, - - /* U+0692 "ڒ" */ - 0x0, 0x0, 0x47, 0x8, 0x40, 0x0, 0x0, 0xd8, - 0xd0, 0x0, 0x0, 0x4, 0xd3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0xba, 0x0, - 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xca, - 0x0, 0x0, 0x0, 0x3f, 0x60, 0x0, 0x0, 0x4e, - 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, - 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, - - /* U+0693 "ړ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe8, 0x0, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, - 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0x0, 0xe9, - 0x0, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, 0x1, - 0x9f, 0xfe, 0x90, 0x59, 0xbf, 0xfc, 0xd1, 0xf0, - 0xae, 0xb7, 0x10, 0xbe, 0x90, - - /* U+0694 "ڔ" */ - 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0xb, - 0xa0, 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, - 0xc, 0xa0, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, - 0x2, 0xed, 0x0, 0x1, 0x4a, 0xfd, 0x20, 0xa, - 0xff, 0xc6, 0x0, 0x98, 0x33, 0x10, 0x0, 0x0, - 0x0, - - /* U+0695 "ڕ" */ - 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0xab, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xca, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0xd3, 0x0, 0x20, 0x14, 0x6c, 0xfd, 0x2a, - 0x86, 0xb0, 0xaf, 0xfc, 0x60, 0x1, 0xee, 0x20, - 0x33, 0x10, 0x0, 0x0, 0x33, 0x0, - - /* U+0696 "ږ" */ - 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, - 0xb0, 0x0, 0x11, 0x0, 0xbb, 0x0, 0x9, 0x90, - 0xe, 0x90, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, - 0x4b, 0xfa, 0x0, 0x7c, 0xef, 0xf9, 0x6, 0x5a, - 0xec, 0x72, 0x0, 0x54, - - /* U+0697 "ڗ" */ - 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x20, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, - 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, 0x0, - 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, 0xd0, - 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, 0x60, - 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, - - /* U+0698 "ژ" */ - 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, - 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, - 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, - 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, - 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, - 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, - - /* U+0699 "ڙ" */ - 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x20, - 0x20, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, - 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, - 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, - 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, - 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, - 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, - - /* U+069A "ښ" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, - 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, 0xc, 0x90, - 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, 0x0, 0x8, - 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, 0x10, 0x0, - 0x6, 0xf3, 0xa, 0xf9, 0x7, 0xf1, 0xca, 0x0, - 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, 0xb0, 0xe8, - 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, - 0xe8, 0x0, 0x0, 0x4f, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xbe, 0x52, 0x27, 0xfe, 0x20, 0x1f, 0x10, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb2, 0x0, 0x2, - 0x0, 0x0, 0x0, 0x0, 0x24, 0x41, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+069B "ڛ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xf3, 0x0, 0x0, 0x0, 0xd, 0x90, 0x4, 0xf2, - 0x3, 0xf3, 0x0, 0x0, 0x0, 0x8, 0xd0, 0x6, - 0xf3, 0x4, 0xf3, 0x6f, 0x10, 0x0, 0x6, 0xf3, - 0xa, 0xf8, 0x6, 0xf1, 0xca, 0x0, 0x0, 0x6, - 0xfe, 0xbf, 0xcf, 0xbf, 0xc0, 0xe8, 0x0, 0x0, - 0xa, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, 0xe8, 0x0, - 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0x85, 0x59, 0xfe, 0x20, 0xb2, 0xb0, 0x0, 0x0, - 0x1b, 0xff, 0xff, 0x91, 0x0, 0x1f, 0x10, 0x0, - 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+069C "ڜ" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x4e, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x2, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, - 0x10, 0x0, 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, - 0xc, 0x90, 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, - 0x0, 0x8, 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, - 0x10, 0x0, 0x5, 0xf3, 0xa, 0xf9, 0x7, 0xf1, - 0xca, 0x0, 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, - 0xb0, 0xe8, 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, - 0xfb, 0x10, 0xe8, 0x0, 0x0, 0x5f, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0x85, 0x59, 0xfe, 0x20, - 0xb2, 0xb0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0x91, - 0x0, 0x1f, 0x10, 0x0, 0x0, 0x0, 0x1, 0x20, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - - /* U+069D "ڝ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, - 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, - 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, - 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, - 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, - 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, - 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0xf3, 0xf0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x20, - 0x20, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+069E "ڞ" */ - 0x0, 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xaf, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, - 0xa, 0x43, 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, - 0x0, 0xc, 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, - 0x0, 0x0, 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, - 0xd9, 0x0, 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, - 0x0, 0xf7, 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+069F "ڟ" */ - 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, - 0xf, 0x20, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x20, - 0x0, 0x0, 0x0, 0xf, 0x70, 0xf3, 0xf2, 0x0, - 0x0, 0x0, 0xf7, 0x2, 0x2, 0x10, 0x0, 0x0, - 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, - 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, - 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, - 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, - 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, - - /* U+06A0 "ڠ" */ - 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, 0x0, 0x0, - 0x11, 0x11, 0x0, 0x0, 0x0, 0x8, 0xef, 0x20, - 0x0, 0x0, 0xce, 0x75, 0x0, 0x0, 0x4, 0xf2, - 0x0, 0x0, 0x0, 0x4, 0xf4, 0x26, 0xbd, 0x0, - 0x0, 0xaf, 0xff, 0xd9, 0x0, 0x0, 0xbf, 0x92, - 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, 0xf, - 0x80, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, - 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0x6, 0xf9, - 0x31, 0x13, 0x95, 0x0, 0x6d, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x13, 0x31, 0x0, - - /* U+06A1 "ڡ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0x9e, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xcd, 0x18, 0xf3, 0xba, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xef, 0x1f, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x3b, 0xc0, 0xbf, 0x83, 0x21, - 0x22, 0x46, 0xaf, 0xe2, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xfc, 0x70, 0x0, 0x0, 0x2, 0x44, 0x43, - 0x10, 0x0, 0x0, 0x0, - - /* U+06A2 "ڢ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, - 0x0, 0x0, 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, - 0x35, 0x8d, 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, - 0xff, 0xb6, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, - - /* U+06A3 "ڣ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, - 0x8d, 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, - 0xb6, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, - - /* U+06A4 "ڤ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, - 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, - 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, - 0x0, - - /* U+06A5 "ڥ" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xd2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0x9d, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xc1, 0x6f, 0x3b, 0xb0, - 0x0, 0x0, 0x0, 0x5f, 0xfe, 0xf3, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x12, 0x6f, 0x1e, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xc0, 0x7f, 0xa4, 0x21, - 0x23, 0x58, 0xdf, 0xe2, 0x0, 0x6e, 0xff, 0xff, - 0xff, 0xfc, 0x70, 0x0, 0x0, 0x2, 0x44, 0x43, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf3, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, - - /* U+06A6 "ڦ" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, - 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, - 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, - 0x0, - - /* U+06A7 "ڧ" */ - 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0xaf, 0x9e, 0xa0, - 0x0, 0x0, 0x0, 0xf9, 0x7, 0xf0, 0x0, 0x0, - 0x0, 0xdc, 0x19, 0xf2, 0x3, 0x50, 0x0, 0x5f, - 0xfe, 0xf3, 0xc, 0x90, 0x0, 0x1, 0x24, 0xf1, - 0xf, 0x50, 0x0, 0x0, 0x9, 0xd0, 0x2f, 0x40, - 0x0, 0x0, 0x3f, 0x60, 0xf, 0x70, 0x0, 0x4, - 0xeb, 0x0, 0xb, 0xe5, 0x35, 0xaf, 0xb0, 0x0, - 0x1, 0xdf, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x3, - 0x43, 0x0, 0x0, 0x0, - - /* U+06A8 "ڨ" */ - 0x0, 0x0, 0x0, 0x6, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5c, - 0x6c, 0x0, 0x0, 0x0, 0x0, 0x2, 0x12, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x0, 0xeb, - 0x19, 0xe0, 0x0, 0x0, 0x0, 0xeb, 0x18, 0xf2, - 0x3, 0x50, 0x0, 0x5f, 0xfe, 0xf3, 0xc, 0x90, - 0x0, 0x1, 0x24, 0xf2, 0xf, 0x50, 0x0, 0x0, - 0x9, 0xe0, 0x2f, 0x40, 0x0, 0x0, 0x3f, 0x80, - 0xf, 0x70, 0x0, 0x3, 0xec, 0x0, 0xb, 0xe4, - 0x35, 0xaf, 0xc1, 0x0, 0x1, 0xdf, 0xff, 0xe7, - 0x0, 0x0, 0x0, 0x3, 0x43, 0x0, 0x0, 0x0, - - /* U+06A9 "ک" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x7d, 0xf4, 0x0, 0x0, - 0x0, 0x2, 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, - 0x3f, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, - 0x79, 0x0, 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, - 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, - 0x0, 0x0, 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, - 0x49, 0xef, 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, - 0x92, 0x0, 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, - 0x0, 0x0, - - /* U+06AA "ڪ" */ - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xe6, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xcf, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfe, - 0xc9, 0x74, 0x10, 0x0, 0x0, 0x0, 0x5, 0x8b, - 0xdf, 0xff, 0xfc, 0x91, 0x89, 0x0, 0x0, 0x0, - 0x2, 0x57, 0xaf, 0xce, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xe9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xd8, 0xf9, 0x42, 0x11, 0x11, 0x24, - 0x9f, 0xf5, 0x7, 0xef, 0xff, 0xff, 0xff, 0xfd, - 0x81, 0x0, 0x0, 0x24, 0x44, 0x44, 0x31, 0x0, - 0x0, - - /* U+06AB "ګ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x7e, 0xf4, 0x0, 0x0, - 0x0, 0x3, 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xe2, 0xd0, 0x0, 0x0, 0x0, 0x9f, - 0x45, 0xa2, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0x20, - 0xbe, 0x50, 0x0, 0x0, 0x0, 0x9, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, - 0x35, 0x0, 0x0, 0x0, 0x1e, 0x90, 0x0, 0xd9, - 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0xe8, 0x0, - 0x0, 0x0, 0xb, 0xf0, 0x0, 0x9f, 0x94, 0x22, - 0x49, 0xff, 0x70, 0x0, 0x8, 0xef, 0xff, 0xfe, - 0x93, 0x0, 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, - 0x0, 0x0, - - /* U+06AC "ڬ" */ - 0x0, 0x0, 0x2f, 0x0, 0xe, 0x90, 0x0, 0x0, - 0x20, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, - 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, - 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, - 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, - 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, - 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, - 0xb4, 0x0, - - /* U+06AD "ڭ" */ - 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf0, 0xe, - 0x90, 0x0, 0x2, 0x2, 0x0, 0xe9, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x90, 0x0, 0x2, 0x96, 0x0, - 0xe9, 0x0, 0x0, 0x76, 0x0, 0xe, 0x90, 0x0, - 0x0, 0x58, 0x0, 0xe9, 0x0, 0x2, 0xab, 0x20, - 0xe, 0x90, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x54, - 0x0, 0x0, 0x0, 0xf, 0x7d, 0xa0, 0x0, 0x0, - 0x9, 0xf3, 0x8f, 0xb7, 0x55, 0x8e, 0xf8, 0x0, - 0x5c, 0xef, 0xfe, 0xb4, 0x0, - - /* U+06AE "ڮ" */ - 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, - 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, - 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, - 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, - 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, - 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, - 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4d, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x20, 0x0, 0x0, 0x0, 0x5, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - - /* U+06AF "گ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x73, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xaf, 0xb2, 0x0, 0x0, - 0x0, 0x6, 0xde, 0x81, 0x42, 0x0, 0x0, 0x0, - 0x6b, 0x51, 0x7d, 0xf4, 0x0, 0x0, 0x0, 0x2, - 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x3f, 0xd6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, 0x79, 0x0, - 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, 0x0, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, - 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, - 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, - 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, - - /* U+06B0 "ڰ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x84, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xaf, 0xa2, 0x0, 0x0, - 0x0, 0x17, 0xde, 0x71, 0x43, 0x0, 0x0, 0x0, - 0x6b, 0x41, 0x7e, 0xf4, 0x0, 0x0, 0x0, 0x3, - 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xe2, 0xd0, 0x0, 0x0, 0x0, 0x9f, 0x45, 0xa2, - 0xe0, 0x0, 0x0, 0x0, 0x5f, 0x20, 0xbe, 0x50, - 0x0, 0x0, 0x0, 0x9, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x35, 0x0, - 0x0, 0x0, 0x1e, 0x90, 0x0, 0xd9, 0x0, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0xe8, 0x0, 0x0, 0x0, - 0xb, 0xf0, 0x0, 0x9f, 0x94, 0x22, 0x49, 0xff, - 0x70, 0x0, 0x8, 0xef, 0xff, 0xfe, 0x93, 0x0, - 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, - - /* U+06B1 "ڱ" */ - 0x0, 0x0, 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, - 0x0, 0x0, 0x20, 0x25, 0xbf, 0xa1, 0x0, 0x0, - 0x0, 0x17, 0xdd, 0x71, 0x53, 0x0, 0x0, 0x0, - 0x6b, 0x41, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, - 0xaf, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xd6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x78, 0x0, - 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, - 0x1b, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xff, - 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, - 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, - - /* U+06B2 "ڲ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x94, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xcf, 0x91, 0x0, 0x0, - 0x0, 0x18, 0xed, 0x61, 0x63, 0x0, 0x0, 0x0, - 0x6a, 0x32, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, - 0xbf, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xc5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x8a, 0x0, - 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, - 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, - 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x82, 0x0, - 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xd5, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, - - /* U+06B3 "ڳ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x94, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xcf, 0x91, 0x0, 0x0, - 0x0, 0x18, 0xed, 0x61, 0x63, 0x0, 0x0, 0x0, - 0x6a, 0x32, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, - 0xbf, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xc5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x8a, 0x0, - 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, - 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, - 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x82, 0x0, - 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, 0x0, - - /* U+06B4 "ڴ" */ - 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, 0x0, 0x0, - 0x20, 0x25, 0xbf, 0xa1, 0x0, 0x0, 0x0, 0x17, - 0xdd, 0x71, 0x53, 0x0, 0x0, 0x0, 0x6b, 0x41, - 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xe8, - 0x20, 0x0, 0x0, 0x0, 0x4f, 0xd6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0x20, 0x0, 0x78, 0x0, 0x0, 0x0, - 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x7, - 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x1b, 0xe0, - 0x0, 0x8f, 0x94, 0x22, 0x49, 0xff, 0x60, 0x0, - 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, 0x0, 0x0, - 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, - - /* U+06B5 "ڵ" */ - 0x0, 0x0, 0x0, 0x34, 0x5, 0x30, 0x0, 0x0, - 0x1, 0xe5, 0xe0, 0x0, 0x0, 0x0, 0x6, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0x30, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0x30, 0x0, 0x0, 0x0, 0x4, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4f, 0x30, 0x0, - 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0x30, 0x0, 0x0, 0x0, 0x4, 0xf2, 0x3, - 0x60, 0x0, 0x0, 0x5f, 0x20, 0xcb, 0x0, 0x0, - 0x8, 0xf0, 0xd, 0x90, 0x0, 0x2, 0xeb, 0x0, - 0x9f, 0x61, 0x37, 0xef, 0x20, 0x0, 0xaf, 0xff, - 0xfa, 0x20, 0x0, 0x0, 0x13, 0x30, 0x0, 0x0, - 0x0, - - /* U+06B6 "ڶ" */ - 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, - 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, - 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, - 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, - 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, - 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, 0x5, - 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, 0x0, - 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, 0x20, - 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, 0x30, - 0x0, 0x0, - - /* U+06B7 "ڷ" */ - 0x0, 0x0, 0x0, 0x3, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x2f, 0x3e, 0x0, - 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x4, - 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, - 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, - 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, - 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, - 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, - 0xf2, 0x36, 0x0, 0x0, 0x5, 0xf2, 0xcb, 0x0, - 0x0, 0x8, 0xf0, 0xd9, 0x0, 0x0, 0x2e, 0xb0, - 0x9f, 0x61, 0x37, 0xef, 0x20, 0xa, 0xff, 0xff, - 0xa2, 0x0, 0x0, 0x13, 0x30, 0x0, 0x0, - - /* U+06B8 "ڸ" */ - 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, - 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, - 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, - 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, - 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, - 0x0, 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, - 0x5, 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, - 0x0, 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, - 0x20, 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, - 0x30, 0x0, 0x0, 0x0, 0xb, 0x7b, 0x60, 0x0, - 0x0, 0x1, 0x12, 0x10, 0x0, 0x0, 0x0, 0xb7, - 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, - - /* U+06B9 "ڹ" */ - 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x4, 0x60, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x58, - 0x0, 0x0, 0x0, 0xf6, 0xcb, 0x0, 0x0, 0x0, - 0xe8, 0xd9, 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, - 0x0, 0x9, 0xf1, 0x5f, 0x94, 0x23, 0x9f, 0x80, - 0x6, 0xef, 0xff, 0xe7, 0x0, 0x0, 0x3, 0x42, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, - - /* U+06BA "ں" */ - 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, - 0x7, 0xf1, 0x12, 0x0, 0x0, 0x1, 0xf5, 0xbc, - 0x0, 0x0, 0x0, 0xf7, 0xda, 0x0, 0x0, 0x0, - 0xf8, 0xd9, 0x0, 0x0, 0x2, 0xf5, 0xac, 0x0, - 0x0, 0xa, 0xf0, 0x4f, 0xa4, 0x24, 0xaf, 0x60, - 0x5, 0xef, 0xff, 0xe6, 0x0, 0x0, 0x3, 0x42, - 0x0, 0x0, - - /* U+06BB "ڻ" */ - 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x38, 0x20, 0x0, 0x0, - 0xd, 0xb8, 0x80, 0x0, 0x0, 0x5d, 0xcc, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, - 0x0, 0x3, 0xf4, 0x7a, 0x0, 0x0, 0x0, 0xf7, - 0xca, 0x0, 0x0, 0x0, 0xe8, 0xd9, 0x0, 0x0, - 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x9, 0xf1, 0x5f, - 0xa4, 0x24, 0xaf, 0x80, 0x6, 0xef, 0xff, 0xe6, - 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, - - /* U+06BC "ڼ" */ - 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf2, 0x23, - 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x0, - 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, 0xd9, 0x0, - 0x0, 0x3, 0xf5, 0xac, 0x0, 0x0, 0xa, 0xe0, - 0x4f, 0xa4, 0x24, 0xaf, 0x60, 0x5, 0xef, 0xff, - 0xe5, 0x0, 0x0, 0xa, 0xfd, 0x70, 0x0, 0x0, - 0xa, 0x66, 0xa0, 0x0, 0x0, 0x3, 0xdd, 0x30, - 0x0, - - /* U+06BD "ڽ" */ - 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, - 0x2, 0x2, 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, - 0xf2, 0x23, 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, - 0x0, 0x0, 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, - 0xc9, 0x0, 0x0, 0x3, 0xf5, 0xad, 0x0, 0x0, - 0xa, 0xe0, 0x3f, 0xa4, 0x24, 0xaf, 0x60, 0x5, - 0xef, 0xff, 0xe5, 0x0, 0x0, 0x3, 0x42, 0x0, - 0x0, - - /* U+06BE "ھ" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xc3, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x0, 0x0, - 0xe, 0xbc, 0xf9, 0x0, 0x0, 0x2f, 0x34, 0xff, - 0x60, 0x0, 0xf, 0x57, 0xe7, 0xe0, 0xda, 0xb, - 0xde, 0x92, 0xf2, 0xce, 0x8b, 0xff, 0x99, 0xf1, - 0x2a, 0xfe, 0x8a, 0xee, 0x70, - - /* U+06BF "ڿ" */ - 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, - 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, - 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, - 0x0, 0x0, 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, - 0x6f, 0x0, 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd, - 0x50, 0x0, 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, - 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, - 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, - - /* U+06C6 "ۆ" */ - 0x0, 0xd, 0x36, 0xb0, 0x0, 0x4, 0xde, 0x20, - 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, - 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, - 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, - 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, - 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, - - /* U+06C7 "ۇ" */ - 0x0, 0x2, 0xda, 0x0, 0x0, 0x6, 0x9d, 0x10, - 0x0, 0x1, 0xcf, 0x70, 0x0, 0x5, 0xc2, 0x0, - 0x0, 0xd8, 0x10, 0x0, 0x0, 0x8, 0xed, 0x40, - 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, - 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, - 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, - 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, - 0x34, 0x20, 0x0, 0x0, - - /* U+06C8 "ۈ" */ - 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x94, 0x0, - 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x94, 0x0, - 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, - 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, - 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, - 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, - 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, - - /* U+06CB "ۋ" */ - 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, - 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, - 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, - 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, - 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, - 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, - - /* U+06CC "ی" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, - 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, - 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, - 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, - 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, - 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, - - /* U+06CE "ێ" */ - 0xc, 0x47, 0xa0, 0x0, 0x0, 0x0, 0x2e, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x21, 0x6, 0xdf, 0xe7, - 0x0, 0x0, 0x4, 0xf9, 0x48, 0xf4, 0x0, 0x0, - 0x5f, 0x60, 0x2, 0x10, 0x10, 0x0, 0xbf, 0xe7, - 0x0, 0xbb, 0x0, 0x0, 0x39, 0xfa, 0xf, 0x70, - 0x0, 0x0, 0xa, 0xf0, 0xeb, 0x0, 0x0, 0x17, - 0xfb, 0x6, 0xfd, 0xab, 0xdf, 0xfc, 0x10, 0x5, - 0xdf, 0xfd, 0x94, 0x0, 0x0, - - /* U+06D0 "ې" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x84, 0x7f, - 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, - 0x7, 0xff, 0xa2, 0xd, 0xa0, 0x0, 0x0, 0x5d, - 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbe, 0xb, 0xd2, - 0x0, 0x14, 0xbf, 0x60, 0x1b, 0xfe, 0xff, 0xea, - 0x30, 0x0, 0x1, 0x43, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, - - /* U+06D5 "ە" */ - 0x0, 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, - 0x5a, 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, - 0x3f, 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, - 0x0, - - /* U+06F0 "۰" */ - 0x8f, 0x29, 0xf2, - - /* U+06F1 "۱" */ - 0xae, 0x0, 0x4f, 0x30, 0xe, 0x90, 0x9, 0xd0, - 0x5, 0xf1, 0x2, 0xf4, 0x0, 0xf6, 0x0, 0xf6, - 0x0, 0xf7, 0x0, 0xf7, - - /* U+06F2 "۲" */ - 0x2f, 0x70, 0x0, 0xac, 0xc, 0xf7, 0x26, 0xf7, - 0x6, 0xff, 0xff, 0xc0, 0x2, 0xf7, 0x33, 0x0, - 0x0, 0xea, 0x0, 0x0, 0x0, 0xbc, 0x0, 0x0, - 0x0, 0x9d, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, - 0x0, 0x7e, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, - - /* U+06F3 "۳" */ - 0x3f, 0x40, 0xf6, 0x4f, 0x20, 0xda, 0xf, 0x97, - 0xf1, 0x7, 0xfd, 0xff, 0xfc, 0x0, 0x2f, 0x91, - 0x33, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xb, - 0xb0, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, - 0x9, 0xd0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, - 0x0, 0x8, 0xe0, 0x0, 0x0, - - /* U+06F4 "۴" */ - 0x2f, 0x60, 0x9e, 0xd1, 0xc, 0xc6, 0xf5, 0x40, - 0x6, 0xff, 0xf4, 0x22, 0x2, 0xfe, 0xff, 0xf8, - 0x0, 0xe7, 0x24, 0x41, 0x0, 0xbb, 0x0, 0x0, - 0x0, 0x9d, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, - 0x0, 0x7e, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, - - /* U+06F5 "۵" */ - 0x0, 0x4, 0x81, 0x0, 0x0, 0x5f, 0xfd, 0x0, - 0x0, 0xe9, 0x2e, 0x80, 0x7, 0xf1, 0x7, 0xf1, - 0xc, 0xb0, 0x1, 0xf6, 0xf, 0x60, 0x0, 0xd9, - 0x1f, 0x40, 0x0, 0xbb, 0x2f, 0x40, 0x0, 0xab, - 0xf, 0x67, 0xd1, 0xca, 0xc, 0xde, 0xfc, 0xf6, - 0x4, 0xed, 0x6f, 0xc0, - - /* U+06F6 "۶" */ - 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0x80, 0x5, - 0xf7, 0x45, 0x0, 0xac, 0x0, 0x0, 0x9, 0xe1, - 0x0, 0x0, 0x2e, 0xfe, 0xf2, 0x0, 0x2f, 0xe7, - 0x0, 0xc, 0xd1, 0x0, 0x6, 0xf2, 0x0, 0x0, - 0xd9, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, - - /* U+06F7 "۷" */ - 0x4f, 0x30, 0x0, 0xad, 0x0, 0xda, 0x0, 0x1f, - 0x60, 0x6, 0xf1, 0x7, 0xe0, 0x0, 0x1f, 0x70, - 0xd9, 0x0, 0x0, 0xbc, 0x2f, 0x40, 0x0, 0x5, - 0xf9, 0xf0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0xdf, 0x70, 0x0, 0x0, 0x9, 0xf4, 0x0, - 0x0, 0x0, 0x7f, 0x10, 0x0, - - /* U+06F8 "۸" */ - 0x0, 0x7, 0xf1, 0x0, 0x0, 0x0, 0x9f, 0x40, - 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x1, 0xff, - 0xb0, 0x0, 0x0, 0x5f, 0x9f, 0x0, 0x0, 0xb, - 0xc2, 0xf4, 0x0, 0x1, 0xf6, 0xd, 0x90, 0x0, - 0x6f, 0x10, 0x7e, 0x0, 0xd, 0xa0, 0x1, 0xf6, - 0x4, 0xf3, 0x0, 0xa, 0xd0, - - /* U+06F9 "۹" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf7, 0x0, - 0xd, 0xc5, 0xaf, 0x40, 0x2f, 0x40, 0xd, 0x90, - 0xe, 0xb4, 0x2b, 0xc0, 0x3, 0xdf, 0xff, 0xd0, - 0x0, 0x2, 0x49, 0xf0, 0x0, 0x0, 0x5, 0xf2, - 0x0, 0x0, 0x2, 0xf5, 0x0, 0x0, 0x0, 0xf8, - 0x0, 0x0, 0x0, 0xbc, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, - 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, - 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, - 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, - 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F008 "" */ - 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, - 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, - 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, - 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, - 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, - 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, - 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, - 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, - - /* U+F00B "" */ - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, - 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, - 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, - 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, - 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, - 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, - 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, - 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, - 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, - 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, - 0x4, 0xa1, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, - 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, - 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, - 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, - 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, - 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, - 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, - 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, - 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, - 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, - 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, - 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, - 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, - 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, - 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, - 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, - 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, - 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, - 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, - 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, - 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, - 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, - 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, - 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, - 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, - 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, - 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, - 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, - 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F01C "" */ - 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, - 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, - - /* U+F021 "" */ - 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, - 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, - 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, - 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, - 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, - 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, - 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, - 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, - 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, - 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, - 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, - 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, - 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, - 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, - 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, - 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, - 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, - 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, - 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, - 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, - 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, - 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, - 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, - 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, - 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, - - /* U+F03E "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, - 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, - 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, - 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F043 "" */ - 0x0, 0x0, 0x4e, 0x40, 0x0, 0x0, 0x0, 0xb, - 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0x30, 0x0, 0xc, 0xff, 0xff, 0xfc, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xf2, 0xbf, 0xff, - 0xff, 0xfe, 0x9f, 0xa1, 0xbf, 0xff, 0xff, 0x92, - 0xff, 0xa2, 0x2f, 0xff, 0xf2, 0x4, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x2, 0x9e, 0xfe, 0x92, 0x0, - - /* U+F048 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, - 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, - 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, - 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, - 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, - 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, - 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, - 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, - 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, - 0xf7, - - /* U+F04D "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, - - /* U+F051 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, - 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, - 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, - 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, - 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, - 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, - 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, - 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, - 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, - 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, - 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, - 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, - 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, - - /* U+F054 "" */ - 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, - 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, - 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, - 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, - 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, - 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, - 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, - 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, - 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, - 0x0, 0x0, - - /* U+F068 "" */ - 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xb7, - - /* U+F06E "" */ - 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, - 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, - 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, - 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, - 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, - 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, - 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, - 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, - 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, - 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, - 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, - 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, - 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, - 0xda, 0x50, 0x0, 0x0, - - /* U+F070 "" */ - 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, - 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, - 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, - 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, - 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, - 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, - 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, - 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, - 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, - 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, - 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, - 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, - 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, - 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, - 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, - 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, - 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, - 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, - 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, - 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, - 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, - 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, - 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, - 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, - 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, - 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F078 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, - 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, - 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, - 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, - 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, - 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, - 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, - 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, - 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, - 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, - 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, - 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, - 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, - 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, - 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, - 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, - 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, - 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, - 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, - 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, - 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, - 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, - 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, - 0x10, - - /* U+F0C5 "" */ - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, - 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, - 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, - - /* U+F0C9 "" */ - 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x21, - - /* U+F0E0 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xd2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2d, - 0xff, 0x62, 0xcf, 0xff, 0xff, 0xfc, 0x26, 0xff, - 0xff, 0xfa, 0x18, 0xff, 0xff, 0x81, 0xaf, 0xff, - 0xff, 0xff, 0xe3, 0x4d, 0xd4, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x81, 0x18, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F0E7 "" */ - 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, - 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, - 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, - 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, - 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, - 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, - 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, - - /* U+F11C "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, - 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, - 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, - 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, - 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, - 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, - 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F15B "" */ - 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, - 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, - 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, - 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, - 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, - 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, - 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, - 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, - 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, - 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, - 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, - 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F241 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F242 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F243 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F244 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, - 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, - 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, - 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, - 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, - 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, - 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, - 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, - 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, - 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, - 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, - 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, - 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, - 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, - 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, - 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, - 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, - 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, - 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, - 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, - 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, - 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, - 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, - 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, - 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, - 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, - 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, - 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, - 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, - 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, - 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, - 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, - 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, - - /* U+F7C2 "" */ - 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, - 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, - 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, - 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, - 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+FB52 "ﭒ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, - 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, - 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, - - /* U+FB53 "ﭓ" */ - 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, - 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, - 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, - 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x0, 0x0, - - /* U+FB54 "ﭔ" */ - 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, - 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0x0, 0x0, 0x20, 0x0, 0x3e, 0x0, 0x0, - 0x20, - - /* U+FB55 "ﭕ" */ - 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, - 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, - - /* U+FB56 "ﭖ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, - 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, - 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, - - /* U+FB57 "ﭗ" */ - 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, - 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, - 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, - 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, - 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x0, 0x0, - - /* U+FB58 "ﭘ" */ - 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, - 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, - 0xf4, 0xe0, 0x2, 0x2, 0x0, 0x3e, 0x0, 0x0, - 0x20, - - /* U+FB59 "ﭙ" */ - 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, - 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, - 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, - 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, - - /* U+FB5A "ﭚ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, - 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, - 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xa9, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x11, 0x11, 0x0, 0x0, 0x0, - - /* U+FB5B "ﭛ" */ - 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, - 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, - 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, - 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, - 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x99, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x10, - 0x0, 0x0, 0x0, - - /* U+FB5C "ﭜ" */ - 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, - 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, - 0xf4, 0xe0, 0x2, 0x2, 0x3, 0xf4, 0xe0, 0x2, - 0x2, - - /* U+FB5D "ﭝ" */ - 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, - 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, - 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, - 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, - - /* U+FB5E "ﭞ" */ - 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x90, 0x0, 0x0, 0x5, 0x70, 0x0, 0x11, 0x0, - 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, - 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, - 0xfe, 0xc9, 0x61, 0x0, - - /* U+FB5F "ﭟ" */ - 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x5, 0x70, - 0x0, 0x11, 0x0, 0x0, 0x9c, 0x0, 0xe8, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, 0x0, - 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, 0x77, - 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, 0xfe, - 0xca, 0x51, 0x4, 0xed, - - /* U+FB60 "ﭠ" */ - 0x0, 0x3e, 0x0, 0x0, 0x20, 0x0, 0x3e, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, - 0x6f, 0x0, 0x7, 0xf0, 0x18, 0xec, 0x2, 0xfc, - 0x20, - - /* U+FB61 "ﭡ" */ - 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x0, 0x3e, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, - 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, - - /* U+FB62 "ﭢ" */ - 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8a, - 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, - 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, - 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, - 0xfe, 0xc9, 0x61, 0x0, - - /* U+FB63 "ﭣ" */ - 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x5, 0x70, - 0x1, 0x11, 0x10, 0x0, 0x9c, 0x0, 0xe8, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, 0x0, - 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, 0x77, - 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, 0xfe, - 0xca, 0x51, 0x4, 0xed, - - /* U+FB64 "ﭤ" */ - 0x3, 0xf4, 0xe0, 0x2, 0x2, 0x3, 0xf4, 0xe0, - 0x2, 0x2, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, - 0x6f, 0x0, 0x7, 0xf0, 0x18, 0xec, 0x2, 0xfc, - 0x20, - - /* U+FB65 "ﭥ" */ - 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, 0x3, 0xf4, - 0xe0, 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, - 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, - - /* U+FB66 "ﭦ" */ - 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, - 0x66, 0x0, 0x0, 0x0, 0x0, 0x5, 0xe7, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0xbb, 0xa6, 0x0, 0x1, - 0x18, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xe7, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, - 0x0, 0x0, 0x18, 0xf6, 0x6f, 0xd8, 0x66, 0x7a, - 0xcf, 0xf7, 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, - 0x0, - - /* U+FB67 "ﭧ" */ - 0x0, 0x0, 0x57, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x75, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5d, 0x7e, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xba, 0x60, 0x0, 0x12, 0x0, 0x89, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xc0, 0xe, 0x70, 0x0, - 0x0, 0x0, 0x0, 0xbe, 0x0, 0xeb, 0x0, 0x0, - 0x0, 0x2, 0xbf, 0xf1, 0x6, 0xfe, 0x97, 0x78, - 0xad, 0xff, 0x7f, 0xc6, 0x3, 0xae, 0xff, 0xec, - 0x95, 0x0, 0x4e, 0xd0, - - /* U+FB68 "ﭨ" */ - 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, - 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x0, - 0x0, 0x7f, 0x0, 0x18, 0xeb, 0x0, 0x2f, 0xc2, - 0x0, - - /* U+FB69 "ﭩ" */ - 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, - 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x10, - 0x0, 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, - 0xef, - - /* U+FB6A "ﭪ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, - 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, - 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, - 0x0, - - /* U+FB6B "ﭫ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xc2, 0x0, - 0x11, 0x0, 0x0, 0x0, 0xb, 0xf9, 0xee, 0x0, - 0xca, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x20, - 0xf8, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x6f, 0x0, - 0xaf, 0x83, 0x22, 0x22, 0x35, 0xfd, 0xfd, 0x75, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xfb, - 0x0, 0x3, 0x44, 0x43, 0x32, 0x0, 0x0, 0x0, - - /* U+FB6C "ﭬ" */ - 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, - 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, - 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, - 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, - 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, - - /* U+FB6D "ﭭ" */ - 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x11, - 0x0, 0x0, 0x0, 0x8, 0xa8, 0x90, 0x0, 0x0, - 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, - 0xb9, 0xf4, 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, - 0x0, 0x2f, 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, - 0xf7, 0x71, 0x2f, 0xfe, 0xba, 0xef, 0xf4, - - /* U+FB6E "ﭮ" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, - 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, - 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, - 0x0, - - /* U+FB6F "ﭯ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xc2, 0x0, - 0x11, 0x0, 0x0, 0x0, 0xb, 0xf9, 0xee, 0x0, - 0xca, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x20, - 0xf8, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x6f, 0x0, - 0xaf, 0x83, 0x22, 0x22, 0x35, 0xfd, 0xfd, 0x75, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xfb, - 0x0, 0x3, 0x44, 0x43, 0x32, 0x0, 0x0, 0x0, - - /* U+FB70 "ﭰ" */ - 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, - 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, - 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, - 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, - 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, - 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, - - /* U+FB71 "ﭱ" */ - 0x0, 0x8, 0xa8, 0x90, 0x0, 0x0, 0x1, 0x11, - 0x10, 0x0, 0x0, 0x8, 0xa8, 0x90, 0x0, 0x0, - 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, - 0xb9, 0xf4, 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, - 0x0, 0x2f, 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, - 0xf7, 0x71, 0x2f, 0xfe, 0xba, 0xef, 0xf4, - - /* U+FB72 "ﭲ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, - 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, - 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, - 0x0, 0x3f, 0x30, 0xe, 0x30, 0x0, 0x6f, 0x0, - 0x2, 0x0, 0x0, 0x5f, 0x10, 0xf, 0x30, 0x0, - 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, - 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x13, 0x31, 0x0, - - /* U+FB73 "ﭳ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, - 0xd8, 0x0, 0x98, 0x5b, 0xff, 0xe7, 0x0, 0x0, - 0xbf, 0x88, 0xd0, 0x0, 0x7, 0xf4, 0x1, 0xf3, - 0x0, 0xf, 0x90, 0x0, 0xac, 0x0, 0x4f, 0x20, - 0xb7, 0x1e, 0xc3, 0x6f, 0x0, 0x11, 0x3, 0xd7, - 0x5f, 0x20, 0xb7, 0x0, 0x0, 0x1f, 0x90, 0x21, - 0x0, 0x0, 0x7, 0xfa, 0x31, 0x14, 0xa4, 0x0, - 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, - 0x0, - - /* U+FB74 "ﭴ" */ - 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, - 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, - 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, - 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, - 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, - - /* U+FB75 "ﭵ" */ - 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, - 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, - 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, - 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - - /* U+FB76 "ﭶ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, - 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, - 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, - 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, - 0x20, 0x20, 0x0, 0x6f, 0x0, 0xe4, 0xf3, 0x0, - 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, - 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, - 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, - 0x0, - - /* U+FB77 "ﭷ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, - 0xd8, 0x0, 0x97, 0x5b, 0xff, 0xe6, 0x0, 0x0, - 0xce, 0x67, 0xe0, 0x0, 0xa, 0xe2, 0x1, 0xf4, - 0x0, 0x2f, 0x60, 0x0, 0x9d, 0x10, 0x5f, 0x12, - 0x12, 0x2e, 0xe5, 0x6f, 0x1b, 0x7c, 0x63, 0xd7, - 0x2f, 0x70, 0x0, 0x0, 0x0, 0x9, 0xf9, 0x31, - 0x13, 0x83, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x13, 0x31, 0x0, - - /* U+FB78 "ﭸ" */ - 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, - 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, - 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, - 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, - 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x20, - 0x20, 0x0, - - /* U+FB79 "ﭹ" */ - 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, - 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, - 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, - 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x20, 0x0, 0x0, - - /* U+FB7A "ﭺ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, - 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, - 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, - 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, - 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd, 0x50, 0x0, - 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, - 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x13, 0x31, 0x0, - - /* U+FB7B "ﭻ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, - 0xd8, 0x0, 0xa8, 0x6b, 0xff, 0xe7, 0x0, 0x0, - 0xcf, 0x89, 0xd0, 0x0, 0xa, 0xf3, 0x1, 0xf3, - 0x0, 0x2f, 0x60, 0x0, 0xaa, 0x0, 0x5f, 0x12, - 0x12, 0x2f, 0x71, 0x6f, 0x1c, 0x6d, 0x53, 0xd7, - 0x2f, 0x70, 0xd5, 0x0, 0x0, 0x9, 0xf9, 0x52, - 0x13, 0x73, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x13, 0x31, 0x0, - - /* U+FB7C "ﭼ" */ - 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, - 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, - 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, - 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, - 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x20, - 0x20, 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, - - /* U+FB7D "ﭽ" */ - 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, - 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, - 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, - 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - - /* U+FB7E "ﭾ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, - 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, - 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, - 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, - 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd5, 0xe4, 0x0, - 0x1f, 0x80, 0x21, 0x20, 0x0, 0x8, 0xf9, 0x31, - 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x13, 0x31, 0x0, - - /* U+FB7F "ﭿ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, - 0xd8, 0x0, 0xa8, 0x6b, 0xff, 0xe7, 0x0, 0x0, - 0xcf, 0x89, 0xd0, 0x0, 0xa, 0xf3, 0x1, 0xf3, - 0x0, 0x2f, 0x60, 0x0, 0xaa, 0x0, 0x5f, 0x12, - 0x12, 0x2f, 0x71, 0x6f, 0x1c, 0x6d, 0x53, 0xd7, - 0x2f, 0x7c, 0x6d, 0x50, 0x0, 0x9, 0xfb, 0x43, - 0x23, 0x73, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x13, 0x31, 0x0, - - /* U+FB80 "ﮀ" */ - 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, - 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, - 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, - 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, - 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x20, - 0x20, 0x0, 0x0, 0x0, 0xd4, 0xe3, 0x0, 0x0, - 0x0, 0x20, 0x20, 0x0, - - /* U+FB81 "ﮁ" */ - 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, - 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, - 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, - 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0xd4, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, 0x0, - - /* U+FB82 "ﮂ" */ - 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, - 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, - 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, - 0x1, 0x11, 0x10, - - /* U+FB83 "ﮃ" */ - 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0x60, - 0x0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x0, 0x5, - 0xf2, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, 0x66, - 0xaf, 0xef, 0x83, 0xf, 0xfe, 0x80, 0xaf, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, - 0x0, 0x1, 0x11, 0x10, 0x0, - - /* U+FB84 "ﮄ" */ - 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, - 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, - 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, - 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, - 0xdf, 0xe8, 0x0, - - /* U+FB85 "ﮅ" */ - 0x0, 0xf3, 0xf1, 0x0, 0x0, 0x2, 0x2, 0x0, - 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, 0xdb, - 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, 0x0, - 0x9, 0xe0, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, - 0x0, 0x8, 0xf6, 0x0, 0x6, 0x6a, 0xfe, 0xf8, - 0x30, 0xff, 0xe8, 0xa, 0xf9, - - /* U+FB86 "ﮆ" */ - 0x0, 0xf, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, - 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, 0x13, - 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, 0xf8, - 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, 0x20, - 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, 0xdf, - 0xe8, 0x0, - - /* U+FB87 "ﮇ" */ - 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, 0xf3, 0xf1, 0x0, 0x0, 0x2, 0x2, - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, - 0xdb, 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, - 0x0, 0x9, 0xe0, 0x0, 0x0, 0x0, 0x4f, 0x20, - 0x0, 0x0, 0x8, 0xf6, 0x0, 0x6, 0x6a, 0xfe, - 0xf8, 0x30, 0xff, 0xe8, 0xa, 0xf9, - - /* U+FB88 "ﮈ" */ - 0x0, 0xc0, 0x0, 0x0, 0xc, 0x26, 0x10, 0x0, - 0xda, 0x98, 0x0, 0x6e, 0xcc, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xb7, 0x0, 0x0, 0x5, 0xf5, - 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x5f, 0x20, - 0x0, 0x7, 0xf1, 0x9, 0x6a, 0xfc, 0x0, 0xdf, - 0xe9, 0x10, - - /* U+FB89 "ﮉ" */ - 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, 0x26, 0x10, - 0x0, 0x0, 0xda, 0x98, 0x0, 0x0, 0x6e, 0xcc, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xb5, 0x0, 0x0, 0x0, 0x5, 0xf3, 0x0, 0x0, - 0x0, 0xa, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0x10, - 0x0, 0x0, 0x7, 0xf6, 0x0, 0x6, 0x6a, 0xfe, - 0xf8, 0x30, 0xff, 0xe8, 0xa, 0xf9, - - /* U+FB8A "ﮊ" */ - 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, - 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, - 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, - 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, - 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, - 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, - - /* U+FB8B "ﮋ" */ - 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, - 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, - 0x0, 0xbd, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xa7, - 0x0, 0x0, 0x0, 0xdd, 0xef, 0x0, 0x0, 0x5, - 0xf3, 0x0, 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x13, - 0x6b, 0xfb, 0x0, 0x0, 0xaf, 0xfb, 0x50, 0x0, - 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, - - /* U+FB8C "ﮌ" */ - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0xc, 0x27, 0x10, 0x0, 0x0, - 0xda, 0x97, 0x0, 0x0, 0x7e, 0xcb, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x70, 0x0, 0x0, 0x0, 0xbb, - 0x0, 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, - 0xd9, 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, - 0x4f, 0xd0, 0x1, 0x46, 0xcf, 0xd1, 0x0, 0xaf, - 0xfc, 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, - - /* U+FB8D "ﮍ" */ - 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x38, 0x10, 0x0, - 0x0, 0xe, 0xa9, 0x70, 0x0, 0x0, 0x7e, 0xcb, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, - 0x0, 0x0, 0x0, 0xbd, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xa7, 0x0, 0x0, 0x0, 0xdd, 0xef, 0x0, - 0x0, 0x5, 0xf3, 0x0, 0x0, 0x0, 0x5f, 0xb0, - 0x0, 0x13, 0x6b, 0xfb, 0x0, 0x0, 0xaf, 0xfb, - 0x50, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, - - /* U+FB8E "ﮎ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x7d, 0xf4, 0x0, 0x0, - 0x0, 0x2, 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, - 0x3f, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, - 0x79, 0x0, 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, - 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, - 0x0, 0x0, 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, - 0x49, 0xef, 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, - 0x92, 0x0, 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, - 0x0, 0x0, - - /* U+FB8F "ﮏ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x6d, 0xfd, 0x60, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xa3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xc0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, - 0x1e, 0xa0, 0x0, 0xe, 0x80, 0x0, 0x0, 0x0, - 0x7f, 0x60, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x30, 0x9, 0xf9, 0x31, 0x24, 0x8e, 0xfa, - 0xde, 0x84, 0x8, 0xef, 0xff, 0xfe, 0xa4, 0x1, - 0xbf, 0xb0, 0x0, 0x24, 0x32, 0x0, 0x0, 0x0, - 0x0, - - /* U+FB90 "ﮐ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xb9, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x8, 0xff, - 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, 0x3f, - 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, 0x0, - 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, 0x0, - 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, 0x3f, - 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, 0xff, - 0xd4, 0x0, 0x0, - - /* U+FB91 "ﮑ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4b, 0x90, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x0, - 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, 0x10, 0x0, - 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, 0x0, 0x0, - 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x17, - 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, 0xd4, 0x8, - 0xef, - - /* U+FB92 "ﮒ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x73, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xaf, 0xb2, 0x0, 0x0, - 0x0, 0x6, 0xde, 0x81, 0x42, 0x0, 0x0, 0x0, - 0x6b, 0x51, 0x7d, 0xf4, 0x0, 0x0, 0x0, 0x2, - 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x3f, 0xd6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, 0x79, 0x0, - 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, 0x0, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, - 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, - 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, - 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, - - /* U+FB93 "ﮓ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x16, 0xde, 0x30, 0x0, - 0x0, 0x0, 0x3, 0x9f, 0xb5, 0x11, 0x0, 0x0, - 0x0, 0x6, 0xe8, 0x23, 0xaf, 0x50, 0x0, 0x0, - 0x0, 0x11, 0x6d, 0xfd, 0x60, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xc0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, 0x1e, - 0xa0, 0x0, 0xe, 0x80, 0x0, 0x0, 0x0, 0x7f, - 0x60, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x30, 0x9, 0xf9, 0x31, 0x24, 0x8e, 0xfa, 0xde, - 0x84, 0x8, 0xef, 0xff, 0xfe, 0xa4, 0x1, 0xbf, - 0xb0, 0x0, 0x24, 0x32, 0x0, 0x0, 0x0, 0x0, - - /* U+FB94 "ﮔ" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x17, - 0xd9, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1d, 0xe8, - 0x14, 0xb9, 0x1, 0x51, 0x7d, 0xfc, 0x40, 0x8, - 0xff, 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, - 0x3f, 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, - 0x0, 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, - 0x0, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, - 0x3f, 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, - 0xff, 0xd4, 0x0, 0x0, - - /* U+FB95 "ﮕ" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, - 0x7d, 0x90, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1, - 0xde, 0x81, 0x4b, 0x90, 0x1, 0x51, 0x7d, 0xfc, - 0x40, 0x0, 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, - 0x10, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, - 0x0, 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, - 0x0, 0x17, 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, - 0xd4, 0x8, 0xef, - - /* U+FB96 "ﮖ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x94, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xcf, 0x91, 0x0, 0x0, - 0x0, 0x18, 0xed, 0x61, 0x63, 0x0, 0x0, 0x0, - 0x6a, 0x32, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, - 0xbf, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xc5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x8a, 0x0, - 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, - 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, - 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x82, 0x0, - 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, 0x0, - - /* U+FB97 "ﮗ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x16, 0xde, 0x30, 0x0, - 0x0, 0x0, 0x3, 0x9f, 0xb5, 0x11, 0x0, 0x0, - 0x0, 0x6, 0xe8, 0x23, 0xaf, 0x50, 0x0, 0x0, - 0x0, 0x11, 0x6d, 0xfd, 0x60, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xc0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, 0x1e, - 0xa0, 0x0, 0xe, 0x80, 0x0, 0x0, 0x0, 0x7f, - 0x60, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x30, 0x9, 0xf9, 0x31, 0x24, 0x8e, 0xfa, 0xde, - 0x84, 0x8, 0xef, 0xff, 0xfe, 0xa4, 0x1, 0xbf, - 0xb0, 0x0, 0x24, 0x32, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+FB98 "ﮘ" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x17, - 0xd9, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1d, 0xe8, - 0x14, 0xb9, 0x1, 0x51, 0x7d, 0xfc, 0x40, 0x8, - 0xff, 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, - 0x3f, 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, - 0x0, 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, - 0x0, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, - 0x3f, 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, - 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x11, - 0x0, 0x0, - - /* U+FB99 "ﮙ" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, - 0x7d, 0x90, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1, - 0xde, 0x81, 0x4b, 0x90, 0x1, 0x51, 0x7d, 0xfc, - 0x40, 0x0, 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, - 0x10, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, - 0x0, 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, - 0x0, 0x17, 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, - 0xd4, 0x8, 0xef, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, - 0x1, 0x10, 0x0, 0x0, - - /* U+FB9A "ﮚ" */ - 0x0, 0x0, 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, - 0x0, 0x0, 0x20, 0x25, 0xbf, 0xa1, 0x0, 0x0, - 0x0, 0x17, 0xdd, 0x71, 0x53, 0x0, 0x0, 0x0, - 0x6b, 0x41, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, - 0xaf, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xd6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x78, 0x0, - 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, - 0x1b, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xff, - 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, - 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, - - /* U+FB9B "ﮛ" */ - 0x0, 0x0, 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, - 0x0, 0x0, 0x2, 0x3, 0x6b, 0xf9, 0x10, 0x0, - 0x0, 0x0, 0x18, 0xec, 0x61, 0x63, 0x0, 0x0, - 0x0, 0x5, 0x93, 0x4a, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x7, 0xef, 0xc6, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xe9, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x3, - 0xf6, 0x0, 0x0, 0xca, 0x0, 0x0, 0x0, 0x8, - 0xf4, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0xaf, - 0xf3, 0x0, 0xaf, 0x83, 0x12, 0x48, 0xef, 0xad, - 0xe8, 0x40, 0x9f, 0xff, 0xff, 0xfa, 0x40, 0x1b, - 0xfb, 0x0, 0x2, 0x43, 0x20, 0x0, 0x0, 0x0, - 0x0, - - /* U+FB9C "ﮜ" */ - 0x6, 0xc7, 0xb0, 0x16, 0x70, 0x12, 0x15, 0xaf, - 0xb4, 0x0, 0x6d, 0xe8, 0x24, 0x60, 0x1b, 0x42, - 0x8e, 0xf7, 0x0, 0x3b, 0xfe, 0x81, 0x0, 0x1f, - 0xc5, 0x0, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, - 0xc, 0xe1, 0x0, 0x0, 0x0, 0x1e, 0xd0, 0x0, - 0x0, 0x0, 0x2f, 0xa0, 0x0, 0x0, 0x0, 0x5f, - 0x30, 0x0, 0x0, 0x2, 0xf5, 0x0, 0x17, 0x77, - 0xdf, 0x10, 0x2, 0xff, 0xfd, 0x40, 0x0, - - /* U+FB9D "ﮝ" */ - 0x6, 0xc7, 0xb0, 0x16, 0x70, 0x1, 0x21, 0x5a, - 0xfb, 0x40, 0x0, 0x6d, 0xe8, 0x24, 0x60, 0x1, - 0xb4, 0x28, 0xef, 0x70, 0x0, 0x3b, 0xfe, 0x81, - 0x0, 0x1, 0xfc, 0x50, 0x0, 0x0, 0x4, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0xce, 0x10, 0x0, 0x0, - 0x0, 0x1e, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0x90, 0x0, 0x0, - 0x0, 0x2f, 0xf7, 0x0, 0x17, 0x77, 0xdf, 0xaf, - 0x97, 0x2f, 0xff, 0xd4, 0x8, 0xef, - - /* U+FB9E "ﮞ" */ - 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, - 0x7, 0xf1, 0x12, 0x0, 0x0, 0x1, 0xf5, 0xbc, - 0x0, 0x0, 0x0, 0xf7, 0xda, 0x0, 0x0, 0x0, - 0xf8, 0xd9, 0x0, 0x0, 0x2, 0xf5, 0xac, 0x0, - 0x0, 0xa, 0xf0, 0x4f, 0xa4, 0x24, 0xaf, 0x60, - 0x5, 0xef, 0xff, 0xe6, 0x0, 0x0, 0x3, 0x42, - 0x0, 0x0, - - /* U+FB9F "ﮟ" */ - 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xf2, 0x0, 0x47, 0x0, 0x0, 0x0, - 0xf9, 0x0, 0xbb, 0x0, 0x0, 0x0, 0xef, 0x82, - 0xc9, 0x0, 0x0, 0x0, 0xfe, 0xf5, 0xc9, 0x0, - 0x0, 0x3, 0xf5, 0x0, 0xad, 0x0, 0x0, 0xa, - 0xe0, 0x0, 0x3f, 0xa4, 0x24, 0xaf, 0x40, 0x0, - 0x4, 0xef, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x3, - 0x42, 0x0, 0x0, 0x0, - - /* U+FBA0 "ﮠ" */ - 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x38, 0x20, 0x0, 0x0, - 0xd, 0xb8, 0x80, 0x0, 0x0, 0x5d, 0xcc, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, - 0x0, 0x3, 0xf4, 0x7a, 0x0, 0x0, 0x0, 0xf7, - 0xca, 0x0, 0x0, 0x0, 0xe8, 0xd9, 0x0, 0x0, - 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x9, 0xf1, 0x5f, - 0xa4, 0x24, 0xaf, 0x80, 0x6, 0xef, 0xff, 0xe6, - 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, - - /* U+FBA1 "ﮡ" */ - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x16, 0x10, 0x0, 0x0, 0x0, 0xd, 0xa8, 0x80, - 0x0, 0x0, 0x0, 0x5d, 0xcc, 0x33, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xf1, 0x0, 0x35, 0x0, - 0x0, 0x1, 0xf8, 0x0, 0xac, 0x0, 0x0, 0x0, - 0xef, 0x82, 0xca, 0x0, 0x0, 0x0, 0xfe, 0xf5, - 0xc9, 0x0, 0x0, 0x2, 0xf5, 0x0, 0xad, 0x0, - 0x0, 0xa, 0xe0, 0x0, 0x3f, 0xa4, 0x24, 0xaf, - 0x40, 0x0, 0x5, 0xef, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x3, 0x42, 0x0, 0x0, 0x0, - - /* U+FBA2 "ﮢ" */ - 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, - 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x0, - 0x0, 0x7f, 0x0, 0x18, 0xeb, 0x0, 0x2f, 0xc2, - 0x0, - - /* U+FBA3 "ﮣ" */ - 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, - 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x10, - 0x0, 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, - 0xef, - - /* U+FBAA "ﮪ" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xc3, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x0, 0x0, - 0xe, 0xbc, 0xf9, 0x0, 0x0, 0x2f, 0x34, 0xff, - 0x60, 0x0, 0xf, 0x57, 0xe7, 0xe0, 0xda, 0xb, - 0xde, 0x92, 0xf2, 0xce, 0x8b, 0xff, 0x99, 0xf1, - 0x2a, 0xfe, 0x8a, 0xee, 0x70, - - /* U+FBAB "ﮫ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xe3, 0x0, 0x0, 0x6, 0xf7, 0xbb, 0x0, 0x0, - 0xd, 0xb0, 0x9c, 0x0, 0xc9, 0xf, 0x75, 0xf8, - 0x0, 0xce, 0x8f, 0xcf, 0xf8, 0x71, 0x2b, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0xf, 0x74, 0xd4, 0x0, - 0x0, 0xb, 0xe3, 0xad, 0x0, 0x0, 0x1, 0xcf, - 0xf7, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, - - /* U+FBAC "ﮬ" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x9, 0xe6, 0x0, - 0x0, 0x0, 0x2e, 0xfb, 0x0, 0x0, 0xa, 0xda, - 0xfc, 0x0, 0x0, 0xe7, 0xf, 0xfa, 0x0, 0xd, - 0xa4, 0xf7, 0xf3, 0x0, 0x9f, 0xee, 0xe, 0x71, - 0x7a, 0xff, 0xa5, 0xe6, 0x2f, 0xea, 0xae, 0xfa, - 0x0, - - /* U+FBAD "ﮭ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xf8, - 0x0, 0x0, 0x3f, 0x98, 0xf1, 0x0, 0x9, 0xd0, - 0x9e, 0x0, 0x17, 0xdd, 0xbf, 0x97, 0x32, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xbb, 0x6f, 0x60, 0x0, - 0x9, 0xe0, 0x7f, 0x0, 0x0, 0x3f, 0x77, 0xf0, - 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x12, - 0x0, 0x0, - - /* U+FBD3 "ﯓ" */ - 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf0, 0xe, - 0x90, 0x0, 0x2, 0x2, 0x0, 0xe9, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x90, 0x0, 0x2, 0x96, 0x0, - 0xe9, 0x0, 0x0, 0x76, 0x0, 0xe, 0x90, 0x0, - 0x0, 0x58, 0x0, 0xe9, 0x0, 0x2, 0xab, 0x20, - 0xe, 0x90, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x54, - 0x0, 0x0, 0x0, 0xf, 0x7d, 0xa0, 0x0, 0x0, - 0x9, 0xf3, 0x8f, 0xb7, 0x55, 0x8e, 0xf8, 0x0, - 0x5c, 0xef, 0xfe, 0xb4, 0x0, - - /* U+FBD4 "ﯔ" */ - 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf3, - 0xf0, 0xe, 0x90, 0x0, 0x0, 0x2, 0x2, 0x0, - 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, - 0x0, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, - 0x0, 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, - 0x58, 0x0, 0xe9, 0x0, 0x0, 0x2, 0xab, 0x20, - 0xe, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe9, - 0x0, 0x22, 0x0, 0x0, 0x0, 0xf, 0x90, 0xd, - 0xa0, 0x0, 0x0, 0x9, 0xfa, 0x0, 0x9f, 0xb7, - 0x55, 0x8e, 0xfd, 0xf8, 0x40, 0x6c, 0xff, 0xfe, - 0xa4, 0x9, 0xfa, - - /* U+FBD5 "ﯕ" */ - 0x0, 0x6b, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, - 0x0, 0x6, 0xc7, 0xb0, 0x0, 0x10, 0x12, 0x11, - 0x5, 0xca, 0x0, 0x1, 0x8e, 0xfa, 0x30, 0x9, - 0xfe, 0x81, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, - 0x3f, 0x70, 0x0, 0x0, 0x0, 0x9f, 0x40, 0x0, - 0x0, 0x0, 0xce, 0x20, 0x0, 0x0, 0x1, 0xec, - 0x0, 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x0, - 0x3f, 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, - 0xff, 0xd4, 0x0, 0x0, - - /* U+FBD6 "ﯖ" */ - 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, - 0x0, 0x0, 0x6, 0xc7, 0xb0, 0x0, 0x10, 0x1, - 0x21, 0x10, 0x5c, 0xa0, 0x0, 0x1, 0x8e, 0xfa, - 0x30, 0x0, 0x9f, 0xe8, 0x10, 0x0, 0x3, 0xf8, - 0x0, 0x0, 0x0, 0x3, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, - 0x0, 0x0, 0x0, 0x1, 0xed, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, - 0x0, 0x17, 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, - 0xd4, 0x8, 0xef, - - /* U+FBD7 "ﯗ" */ - 0x0, 0x2, 0xda, 0x0, 0x0, 0x6, 0x9d, 0x10, - 0x0, 0x1, 0xcf, 0x70, 0x0, 0x5, 0xc2, 0x0, - 0x0, 0xd8, 0x10, 0x0, 0x0, 0x8, 0xed, 0x40, - 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, - 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, - 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, - 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, - 0x34, 0x20, 0x0, 0x0, - - /* U+FBD8 "ﯘ" */ - 0x0, 0x2, 0xda, 0x0, 0x0, 0x0, 0x6, 0x9d, - 0x10, 0x0, 0x0, 0x1, 0xcf, 0x70, 0x0, 0x0, - 0x5, 0xc2, 0x0, 0x0, 0x0, 0xd8, 0x10, 0x0, - 0x0, 0x0, 0x8, 0xed, 0x40, 0x0, 0x0, 0x6f, - 0xac, 0xf1, 0x0, 0x0, 0xae, 0x1, 0xf6, 0x0, - 0x0, 0x6f, 0xa7, 0xfb, 0x73, 0x0, 0x8, 0xef, - 0xff, 0xf6, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, - 0x0, 0x2e, 0xc0, 0x0, 0x12, 0x48, 0xee, 0x20, - 0x0, 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x34, 0x20, - 0x0, 0x0, 0x0, - - /* U+FBD9 "ﯙ" */ - 0x0, 0xd, 0x36, 0xb0, 0x0, 0x4, 0xde, 0x20, - 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, - 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, - 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, - 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, - 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, - - /* U+FBDA "ﯚ" */ - 0x0, 0xd, 0x36, 0xb0, 0x0, 0x0, 0x4, 0xde, - 0x20, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xee, 0x40, - 0x0, 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x0, 0xae, - 0x1, 0xf6, 0x0, 0x0, 0x6f, 0xa7, 0xfb, 0x73, - 0x0, 0x8, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x4, - 0xf3, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x12, - 0x48, 0xee, 0x20, 0x0, 0xaf, 0xff, 0xa1, 0x0, - 0x0, 0x34, 0x20, 0x0, 0x0, 0x0, - - /* U+FBDB "ﯛ" */ - 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x94, 0x0, - 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x94, 0x0, - 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, - 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, - 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, - 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, - 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, - - /* U+FBDC "ﯜ" */ - 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, 0x94, - 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, - 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x60, 0x0, 0x0, 0x7f, 0xac, 0xf2, 0x0, - 0x0, 0xae, 0x1, 0xf6, 0x0, 0x0, 0x6f, 0xa7, - 0xfb, 0x73, 0x0, 0x8, 0xef, 0xff, 0xf6, 0x0, - 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x2e, 0xc0, - 0x0, 0x12, 0x48, 0xee, 0x20, 0x0, 0xaf, 0xff, - 0xa1, 0x0, 0x0, 0x34, 0x20, 0x0, 0x0, 0x0, - - /* U+FBDE "ﯞ" */ - 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, - 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, - 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, - 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, - 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, - 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, - - /* U+FBDF "ﯟ" */ - 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x11, - 0x0, 0x0, 0x0, 0xa, 0x8b, 0x70, 0x0, 0x0, - 0x1, 0x11, 0x10, 0x0, 0x0, 0x4, 0xaa, 0x20, - 0x0, 0x0, 0x5f, 0xac, 0xe1, 0x0, 0x0, 0xae, - 0x1, 0xf6, 0x0, 0x0, 0x6f, 0xa7, 0xfb, 0x73, - 0x0, 0x8, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x4, - 0xf3, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x12, - 0x48, 0xee, 0x20, 0x0, 0xaf, 0xff, 0xa1, 0x0, - 0x0, 0x34, 0x20, 0x0, 0x0, 0x0, - - /* U+FBE4 "ﯤ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x84, 0x7f, - 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, - 0x7, 0xff, 0xa2, 0xd, 0xa0, 0x0, 0x0, 0x5d, - 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbe, 0xb, 0xd2, - 0x0, 0x14, 0xbf, 0x60, 0x1b, 0xfe, 0xff, 0xea, - 0x30, 0x0, 0x1, 0x43, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, - - /* U+FBE5 "ﯥ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, - 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, - 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, - 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, - 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, - 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - - /* U+FBE6 "ﯦ" */ - 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, - 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0x0, 0x0, 0x20, 0x0, 0x3e, 0x0, 0x0, - 0x20, - - /* U+FBE7 "ﯧ" */ - 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, - 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, - - /* U+FBE8 "ﯨ" */ - 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, - 0x7e, 0xc0, 0x2f, 0xd3, 0x0, - - /* U+FBE9 "ﯩ" */ - 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, - 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, - - /* U+FBFC "ﯼ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, - 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, - 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, - 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, - 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, - 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, - - /* U+FBFD "ﯽ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, - 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, - 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, - 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, - 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, - 0x42, 0x0, 0x0, 0x0, - - /* U+FBFE "ﯾ" */ - 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, - 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, - 0xf4, 0xe0, 0x2, 0x2, - - /* U+FBFF "ﯿ" */ - 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, - 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, - 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, - - /* U+FE70 "ﹰ" */ - 0x0, 0x0, 0x14, 0x8b, 0xd7, 0x85, 0x21, 0x26, - 0xad, 0xc6, 0x63, 0x0, 0x0, - - /* U+FE71 "ﹱ" */ - 0x0, 0x0, 0x1, 0x4, 0x8b, 0xd7, 0x8, 0x52, - 0x12, 0x6, 0xad, 0xc6, 0x6, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, - 0xff, 0xfd, - - /* U+FE72 "ﹲ" */ - 0x1, 0xdb, 0x0, 0x4a, 0xc2, 0xa0, 0x9f, 0x8b, - 0x1a, 0x50, 0x4d, 0x70, 0x0, - - /* U+FE73 "ﹳ" */ - 0x2f, 0x50, 0x0, 0xee, 0x72, 0x3, 0xdf, 0x50, - - /* U+FE74 "ﹴ" */ - 0x3, 0x7a, 0x8c, 0xa6, 0x30, 0x25, 0x9c, 0x8a, - 0x84, 0x10, - - /* U+FE76 "ﹶ" */ - 0x0, 0x1, 0x26, 0xad, 0xc6, 0x63, 0x0, 0x0, - - /* U+FE77 "ﹷ" */ - 0x0, 0x0, 0x12, 0x6, 0xad, 0xc6, 0x6, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, - 0x75, 0x2f, 0xff, 0xfd, - - /* U+FE78 "ﹸ" */ - 0x1, 0xdb, 0x0, 0x5a, 0xc2, 0x0, 0xbf, 0x80, - 0x5d, 0x20, 0xc8, 0x10, 0x0, - - /* U+FE79 "ﹹ" */ - 0x0, 0x1d, 0xb0, 0x0, 0x5a, 0xc1, 0x0, 0xc, - 0xe8, 0x0, 0x5c, 0x20, 0xc, 0x81, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, - 0xff, 0xfd, - - /* U+FE7A "ﹺ" */ - 0x0, 0x36, 0x6b, 0xda, 0x62, 0x10, 0x0, 0x0, - - /* U+FE7B "ﹻ" */ - 0x17, 0x77, 0x75, 0x2f, 0xff, 0xfd, 0x0, 0x3, - 0x66, 0xb, 0xda, 0x62, 0x1, 0x0, 0x0, - - /* U+FE7C "ﹼ" */ - 0x0, 0x0, 0x5, 0x4, 0xb, 0xc, 0xb, 0xc, - 0x1c, 0x1c, 0x3e, 0xc8, 0xb, 0xd2, 0x50, - - /* U+FE7D "ﹽ" */ - 0x0, 0x5, 0xb, 0xb, 0xc, 0xc, 0x1b, 0x1f, - 0x6a, 0xe, 0xb7, 0xb2, 0x2, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, - 0xff, 0xfd, - - /* U+FE7E "ﹾ" */ - 0x2c, 0xe9, 0xb, 0x60, 0xb5, 0xb6, 0xb, 0x52, - 0xce, 0x90, - - /* U+FE7F "ﹿ" */ - 0x2, 0xce, 0x90, 0xb, 0x60, 0xb5, 0xb, 0x60, - 0xb5, 0x2, 0xce, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, - 0xff, 0xfd, - - /* U+FE80 "ﺀ" */ - 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x6f, 0x95, - 0x40, 0xad, 0x0, 0x0, 0x8f, 0x40, 0x11, 0x1a, - 0xff, 0xf3, 0x5c, 0xfe, 0x70, 0x9a, 0x40, 0x0, - - /* U+FE81 "ﺁ" */ - 0x19, 0x40, 0x19, 0x8, 0x5a, 0xdb, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, - 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, - 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, - 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, 0xf0, - 0x0, 0x0, 0x7f, 0x0, 0x0, - - /* U+FE82 "ﺂ" */ - 0x19, 0x40, 0x19, 0x8, 0x5a, 0xdb, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, - 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, - 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, - 0xf0, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x3, 0xfb, - 0x70, 0x0, 0x7, 0xef, 0x0, - - /* U+FE83 "ﺃ" */ - 0x8, 0xc3, 0x1b, 0x0, 0xd, 0x85, 0x2d, 0x93, - 0x0, 0x0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, - 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, - 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, - 0x7, 0xf0, - - /* U+FE84 "ﺄ" */ - 0x8, 0xc3, 0x0, 0x1b, 0x0, 0x0, 0xd, 0x85, - 0x0, 0x2d, 0x93, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, - 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, - 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, - 0xf0, 0x0, 0x6, 0xf0, 0x0, 0x3, 0xfb, 0x70, - 0x0, 0x7e, 0xf0, - - /* U+FE85 "ﺅ" */ - 0x0, 0x5, 0xc7, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x9, 0xa7, 0x0, 0x0, 0xb, 0x94, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xed, 0x40, - 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, - 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, - 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, - 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, - 0x34, 0x20, 0x0, 0x0, - - /* U+FE86 "ﺆ" */ - 0x0, 0x5, 0xc7, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xb8, 0x0, 0x0, 0x0, - 0x8, 0x62, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0x80, 0x0, 0x0, 0x8f, - 0xac, 0xf2, 0x0, 0x0, 0xae, 0x1, 0xf6, 0x0, - 0x0, 0x6f, 0xa7, 0xfb, 0x73, 0x0, 0x8, 0xef, - 0xff, 0xf6, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, - 0x0, 0x2e, 0xc0, 0x0, 0x12, 0x48, 0xee, 0x20, - 0x0, 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x34, 0x20, - 0x0, 0x0, 0x0, - - /* U+FE87 "ﺇ" */ - 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, - 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, - 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, - 0x9, 0xc3, 0x1b, 0x0, 0xd, 0xb6, 0x16, 0x20, - - /* U+FE88 "ﺈ" */ - 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, - 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, - 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, - 0x7, 0xf0, 0x0, 0x6, 0xf0, 0x0, 0x3, 0xfb, - 0x70, 0x0, 0x7e, 0xf0, 0x9, 0xc3, 0x0, 0x1b, - 0x0, 0x0, 0xd, 0xb6, 0x0, 0x16, 0x20, 0x0, - - /* U+FE89 "ﺉ" */ - 0x1, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xeb, 0x20, 0x0, 0x0, - 0x0, 0x35, 0x20, 0x6d, 0xfe, 0x70, 0x0, 0x0, - 0x4f, 0x94, 0x7f, 0x40, 0x0, 0x5, 0xf7, 0x0, - 0x10, 0x12, 0x0, 0x9, 0xfe, 0x80, 0xc, 0xa0, - 0x0, 0x2, 0x7e, 0xb0, 0xf7, 0x0, 0x0, 0x0, - 0xaf, 0xd, 0xc0, 0x0, 0x2, 0x9f, 0x90, 0x4f, - 0xfc, 0xcf, 0xff, 0x90, 0x0, 0x28, 0xba, 0x85, - 0x10, 0x0, - - /* U+FE8A "ﺊ" */ - 0x0, 0x3c, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x8, 0x95, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0x80, - 0xb, 0xb0, 0x0, 0x0, 0xcd, 0x7f, 0x40, 0xe7, - 0x0, 0x0, 0xb, 0xf4, 0x9e, 0x3e, 0x90, 0x0, - 0x0, 0x1d, 0xb0, 0xb7, 0x8f, 0x83, 0x12, 0x49, - 0xf6, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xd6, 0x0, - 0x0, 0x0, 0x3, 0x44, 0x20, 0x0, 0x0, 0x0, - - /* U+FE8B "ﺋ" */ - 0x0, 0x8c, 0x50, 0xc, 0x0, 0x0, 0xcb, 0x70, - 0x7, 0x30, 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, - 0x6f, 0x0, 0x7, 0xf0, 0x17, 0xec, 0x2, 0xfc, - 0x20, - - /* U+FE8C "ﺌ" */ - 0x0, 0x8c, 0x50, 0x0, 0xc0, 0x0, 0x0, 0xcb, - 0x70, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4b, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, - 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, - - /* U+FE8D "ﺍ" */ - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, - - /* U+FE8E "ﺎ" */ - 0x7f, 0x0, 0x7, 0xf0, 0x0, 0x7f, 0x0, 0x7, - 0xf0, 0x0, 0x7f, 0x0, 0x7, 0xf0, 0x0, 0x7f, - 0x0, 0x7, 0xf0, 0x0, 0x7f, 0x0, 0x6, 0xf0, - 0x0, 0x3f, 0xb7, 0x0, 0x7e, 0xf0, - - /* U+FE8F "ﺏ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, - 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, - 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, - - /* U+FE90 "ﺐ" */ - 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, - 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, - 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, - 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0x0, - - /* U+FE91 "ﺑ" */ - 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, - 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0x0, 0x0, 0x20, - - /* U+FE92 "ﺒ" */ - 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, - 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, - - /* U+FE93 "ﺓ" */ - 0xf, 0x3f, 0x10, 0x0, 0x20, 0x20, 0x0, 0x0, - 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, 0x5a, - 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, 0x3f, - 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, 0x0, - - /* U+FE94 "ﺔ" */ - 0x4, 0xe4, 0xd0, 0x0, 0x0, 0x20, 0x20, 0x0, - 0x0, 0x3, 0xb1, 0x0, 0x4, 0xcf, 0xf3, 0x0, - 0x5f, 0x82, 0xf6, 0x0, 0xc9, 0x0, 0xda, 0x0, - 0xae, 0xbd, 0xff, 0x85, 0x4, 0x75, 0x8, 0xfb, - - /* U+FE95 "ﺕ" */ - 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x5, 0x70, - 0x1, 0x11, 0x10, 0x0, 0x9c, 0xe8, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, 0x0, 0x0, - 0x7, 0xf7, 0x7f, 0xd8, 0x66, 0x79, 0xcf, 0xf8, - 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, 0x0, - - /* U+FE96 "ﺖ" */ - 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x5, - 0x70, 0x1, 0x11, 0x10, 0x0, 0x9c, 0x0, 0xe8, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, - 0x0, 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, - 0x77, 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, - 0xfe, 0xca, 0x51, 0x4, 0xed, - - /* U+FE97 "ﺗ" */ - 0x3, 0xf4, 0xe0, 0x2, 0x2, 0x0, 0x0, 0x0, - 0x4, 0xc0, 0x0, 0x6f, 0x0, 0x7, 0xf0, 0x18, - 0xec, 0x2, 0xfc, 0x20, - - /* U+FE98 "ﺘ" */ - 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, - 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, - - /* U+FE99 "ﺙ" */ - 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, - 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, - 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, - 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, - 0xfe, 0xc9, 0x61, 0x0, - - /* U+FE9A "ﺚ" */ - 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x5, 0x70, - 0x1, 0x11, 0x10, 0x0, 0x9c, 0x0, 0xe8, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, 0x0, - 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, 0x77, - 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, 0xfe, - 0xca, 0x51, 0x4, 0xed, - - /* U+FE9B "ﺛ" */ - 0x0, 0x3e, 0x0, 0x0, 0x20, 0x3, 0xf4, 0xe0, - 0x2, 0x2, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, - 0x6f, 0x0, 0x7, 0xf0, 0x18, 0xec, 0x2, 0xfc, - 0x20, - - /* U+FE9C "ﺜ" */ - 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x3, 0xf4, - 0xe0, 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, - 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, - - /* U+FE9D "ﺝ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, - 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, - 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, - 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, - 0x2, 0x0, 0x0, 0x6f, 0x0, 0xf, 0x30, 0x0, - 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, - 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, - 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, - 0x0, - - /* U+FE9E "ﺞ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, - 0xd8, 0x0, 0x98, 0x6b, 0xff, 0xe6, 0x0, 0x0, - 0xcf, 0x78, 0xe0, 0x0, 0xa, 0xe2, 0x1, 0xf4, - 0x0, 0x2f, 0x60, 0x0, 0x9c, 0x0, 0x5f, 0x10, - 0x11, 0x1e, 0xc3, 0x6f, 0x10, 0x8a, 0x3, 0xd7, - 0x2f, 0x70, 0x0, 0x0, 0x0, 0x9, 0xf9, 0x31, - 0x13, 0x83, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x13, 0x31, 0x0, - - /* U+FE9F "ﺟ" */ - 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, - 0xb7, 0x20, 0x0, 0x45, 0x68, 0xbe, 0xf9, 0x0, - 0x0, 0x0, 0x6e, 0xe6, 0x0, 0x0, 0x1a, 0xf9, - 0x0, 0x17, 0x8a, 0xfe, 0x40, 0x0, 0x2f, 0xec, - 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+FEA0 "ﺠ" */ - 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x68, 0xbe, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe6, 0x0, - 0x0, 0x0, 0x1a, 0xfd, 0xf2, 0x0, 0x17, 0x8a, - 0xfe, 0x41, 0xef, 0x83, 0x2f, 0xec, 0x71, 0x0, - 0x2b, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, - - /* U+FEA1 "ﺡ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, - 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, - 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, - 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, 0x6f, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, - 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, 0xf9, 0x31, - 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x13, 0x31, 0x0, - - /* U+FEA2 "ﺢ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, - 0xd8, 0x0, 0x98, 0x5b, 0xff, 0xe6, 0x0, 0x0, - 0xbf, 0x78, 0xe0, 0x0, 0x7, 0xf4, 0x1, 0xf4, - 0x0, 0xf, 0x80, 0x0, 0x9c, 0x0, 0x4f, 0x20, - 0x0, 0x1e, 0xc3, 0x6f, 0x0, 0x0, 0x3, 0xd7, - 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, - 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, - 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, - 0x0, - - /* U+FEA3 "ﺣ" */ - 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, - 0xb7, 0x20, 0x0, 0x45, 0x68, 0xbe, 0xf9, 0x0, - 0x0, 0x0, 0x6e, 0xe6, 0x0, 0x0, 0x1a, 0xf9, - 0x0, 0x17, 0x8a, 0xfe, 0x40, 0x0, 0x2f, 0xec, - 0x71, 0x0, 0x0, - - /* U+FEA4 "ﺤ" */ - 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x68, 0xbe, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe6, 0x0, - 0x0, 0x0, 0x1a, 0xfd, 0xf2, 0x0, 0x17, 0x8a, - 0xfe, 0x41, 0xef, 0x83, 0x2f, 0xec, 0x71, 0x0, - 0x2b, 0xf7, - - /* U+FEA5 "ﺥ" */ - 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, - 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, - 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, - 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, - 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, - 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, - 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, - 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, - - /* U+FEA6 "ﺦ" */ - 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x20, - 0x0, 0x0, 0x7c, 0xff, 0xff, 0xd8, 0x0, 0x98, - 0x5b, 0xff, 0xe6, 0x0, 0x0, 0xbf, 0x78, 0xe0, - 0x0, 0x7, 0xf4, 0x1, 0xf4, 0x0, 0xf, 0x80, - 0x0, 0x9c, 0x0, 0x4f, 0x20, 0x0, 0x1e, 0xc3, - 0x6f, 0x0, 0x0, 0x3, 0xd7, 0x5f, 0x20, 0x0, - 0x0, 0x0, 0x1f, 0x90, 0x0, 0x0, 0x0, 0x7, - 0xfa, 0x41, 0x14, 0xa4, 0x0, 0x5d, 0xff, 0xff, - 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, - - /* U+FEA7 "ﺧ" */ - 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, - 0xcf, 0xfe, 0xb7, 0x20, 0x0, 0x45, 0x68, 0xbe, - 0xf9, 0x0, 0x0, 0x0, 0x6e, 0xe6, 0x0, 0x0, - 0x1a, 0xf9, 0x0, 0x17, 0x8a, 0xfe, 0x40, 0x0, - 0x2f, 0xec, 0x71, 0x0, 0x0, - - /* U+FEA8 "ﺨ" */ - 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xfe, 0xb7, 0x20, 0x0, - 0x0, 0x45, 0x68, 0xbe, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x6e, 0xe6, 0x0, 0x0, 0x0, 0x1a, 0xfd, - 0xf2, 0x0, 0x17, 0x8a, 0xfe, 0x41, 0xef, 0x83, - 0x2f, 0xec, 0x71, 0x0, 0x2b, 0xf7, - - /* U+FEA9 "ﺩ" */ - 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, - 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, - 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, - 0x0, - - /* U+FEAA "ﺪ" */ - 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0x60, - 0x0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x0, 0x5, - 0xf2, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, 0x66, - 0xaf, 0xef, 0x83, 0xf, 0xfe, 0x80, 0xaf, 0x90, - - /* U+FEAB "ﺫ" */ - 0x0, 0x7b, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, - 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, - 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, - 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, - 0xdf, 0xe8, 0x0, - - /* U+FEAC "ﺬ" */ - 0x0, 0x7b, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, - 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, 0xdb, - 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, 0x0, - 0x9, 0xe0, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, - 0x0, 0x8, 0xf6, 0x0, 0x6, 0x6a, 0xfe, 0xf8, - 0x30, 0xff, 0xe8, 0xa, 0xf9, - - /* U+FEAD "ﺭ" */ - 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0xba, - 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0xca, - 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x4e, 0xd0, - 0x14, 0x6c, 0xfd, 0x20, 0xaf, 0xfc, 0x60, 0x0, - 0x33, 0x10, 0x0, 0x0, - - /* U+FEAE "ﺮ" */ - 0x0, 0x0, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, - 0xc9, 0x0, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xb7, 0x0, 0x0, 0x0, 0xed, - 0xef, 0x0, 0x0, 0x6, 0xf3, 0x0, 0x0, 0x0, - 0x6f, 0xb0, 0x0, 0x13, 0x6c, 0xfb, 0x0, 0x0, - 0xaf, 0xfb, 0x50, 0x0, 0x0, 0x33, 0x0, 0x0, - 0x0, 0x0, - - /* U+FEAF "ﺯ" */ - 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7, - 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, 0xab, - 0x0, 0x0, 0x0, 0xda, 0x0, 0x0, 0x4, 0xf5, - 0x0, 0x0, 0x4f, 0xd0, 0x14, 0x6c, 0xfd, 0x20, - 0xaf, 0xfc, 0x60, 0x0, 0x33, 0x10, 0x0, 0x0, - - /* U+FEB0 "ﺰ" */ - 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xbd, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xa7, 0x0, 0x0, - 0x0, 0xdd, 0xef, 0x0, 0x0, 0x5, 0xf3, 0x0, - 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x13, 0x6b, 0xfb, - 0x0, 0x0, 0xaf, 0xfb, 0x50, 0x0, 0x0, 0x33, - 0x0, 0x0, 0x0, 0x0, - - /* U+FEB1 "ﺱ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xf3, 0x0, 0x0, 0x0, 0xd, 0x90, 0x4, 0xf2, - 0x3, 0xf3, 0x0, 0x0, 0x0, 0x9, 0xd0, 0x6, - 0xf3, 0x4, 0xf3, 0x5f, 0x10, 0x0, 0x6, 0xf3, - 0xa, 0xf8, 0x6, 0xf1, 0xcb, 0x0, 0x0, 0x6, - 0xfe, 0xbf, 0xcf, 0xbf, 0xc0, 0xe8, 0x0, 0x0, - 0x9, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, 0xf8, 0x0, - 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbe, - 0x52, 0x27, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x2d, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x24, 0x41, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+FEB2 "ﺲ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x2, - 0x81, 0x3, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xb0, 0x5, 0xf2, 0x4, 0xf3, 0x0, 0x5f, 0x10, - 0x0, 0x7, 0xf1, 0x8, 0xf6, 0x5, 0xf6, 0x0, - 0xbc, 0x0, 0x0, 0x5, 0xfc, 0x8f, 0xde, 0x7d, - 0xff, 0x83, 0xd9, 0x0, 0x0, 0x6, 0xfd, 0xfa, - 0x1b, 0xfc, 0x6c, 0xf9, 0xf7, 0x0, 0x0, 0xa, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, - 0x0, 0x4f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0x63, 0x27, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+FEB3 "ﺳ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf1, 0x0, - 0x6, 0x40, 0x3, 0x80, 0x5, 0xf1, 0x0, 0xd, - 0x90, 0x7, 0xf0, 0x6, 0xf1, 0x0, 0xf, 0xd0, - 0xa, 0xf4, 0x7, 0xf0, 0x17, 0xcf, 0xfa, 0x9f, - 0xee, 0x7e, 0xa0, 0x2f, 0xe6, 0x7e, 0xe9, 0x2c, - 0xfa, 0x10, - - /* U+FEB4 "ﺴ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf1, 0x0, - 0x0, 0xd, 0x90, 0x6, 0xf0, 0x5, 0xf1, 0x0, - 0x0, 0xd, 0xa0, 0x8, 0xf1, 0x6, 0xf1, 0x0, - 0x0, 0x2f, 0xe0, 0xc, 0xf6, 0x8, 0xf6, 0x0, - 0x1b, 0xef, 0xfd, 0xdf, 0xcf, 0xbf, 0xff, 0xb4, - 0x2f, 0xe4, 0x4e, 0xe8, 0x1b, 0xfa, 0x3c, 0xf7, - - /* U+FEB5 "ﺵ" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x4e, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x2, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, - 0x10, 0x0, 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, - 0xc, 0x90, 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, - 0x0, 0x8, 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, - 0x10, 0x0, 0x6, 0xf3, 0xa, 0xf9, 0x7, 0xf1, - 0xca, 0x0, 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, - 0xb0, 0xe8, 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, - 0xfb, 0x10, 0xe8, 0x0, 0x0, 0x4f, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0xbe, 0x52, 0x27, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x41, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+FEB6 "ﺶ" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x2, 0x0, 0x1, 0x81, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x30, 0x1, 0x61, 0x3, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, 0xb0, 0x5, - 0xf2, 0x3, 0xf3, 0x0, 0x2a, 0x10, 0x0, 0x7, - 0xf1, 0x8, 0xf6, 0x5, 0xf5, 0x0, 0x9d, 0x0, - 0x0, 0x5, 0xfc, 0x8f, 0xee, 0x7d, 0xfe, 0x73, - 0xd9, 0x0, 0x0, 0x6, 0xfd, 0xfb, 0x1b, 0xfc, - 0x6c, 0xf9, 0xf7, 0x0, 0x0, 0xa, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x4f, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x63, - 0x27, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+FEB7 "ﺷ" */ - 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe3, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x20, 0x2, 0x80, 0x0, 0x5, 0x40, 0x2, - 0x60, 0x5, 0xf1, 0x0, 0xd, 0x90, 0x7, 0xf0, - 0x5, 0xf1, 0x0, 0xf, 0xd0, 0xa, 0xf4, 0x7, - 0xf0, 0x17, 0xcf, 0xfa, 0x9f, 0xee, 0x7e, 0xb0, - 0x2f, 0xe6, 0x7e, 0xe9, 0x2c, 0xfb, 0x10, - - /* U+FEB8 "ﺸ" */ - 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe3, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x20, 0x20, 0x2, 0x60, 0x0, - 0x0, 0x2, 0x10, 0x1, 0x20, 0x5, 0xf1, 0x0, - 0x0, 0xd, 0x90, 0x7, 0xf0, 0x5, 0xf1, 0x0, - 0x0, 0xd, 0xa0, 0x8, 0xf1, 0x6, 0xf1, 0x0, - 0x0, 0x2f, 0xe1, 0xc, 0xf7, 0x9, 0xf7, 0x0, - 0x1b, 0xef, 0xfd, 0xcf, 0xcf, 0xbf, 0xff, 0xb4, - 0x2f, 0xe4, 0x4e, 0xe8, 0x1b, 0xfa, 0x3c, 0xf7, - - /* U+FEB9 "ﺹ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, - 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, - 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, - 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, - 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, - 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, - 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+FEBA "ﺺ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, - 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0xa4, 0x3f, 0xb0, 0x0, 0x5f, 0x10, 0x4e, 0x10, - 0x0, 0xc, 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xa, - 0xc0, 0x0, 0x0, 0xaf, 0xf8, 0x78, 0xbf, 0xff, - 0x95, 0xd9, 0x0, 0x0, 0xb, 0xde, 0xff, 0xed, - 0x83, 0xaf, 0xcf, 0x70, 0x0, 0x0, 0xd9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x5f, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf6, 0x32, - 0x8f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x34, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+FEBB "ﺻ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x50, 0x0, 0x4, - 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, 0xd, 0xa1, - 0xdd, 0x20, 0x1, 0xf5, 0x0, 0x1f, 0xec, 0xe1, - 0x0, 0x1a, 0xf3, 0x17, 0xcf, 0xff, 0xa7, 0x8a, - 0xff, 0x80, 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa3, - 0x0, - - /* U+FEBC "ﺼ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x60, 0x0, - 0x0, 0x4, 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, - 0x0, 0xd, 0xa1, 0xdd, 0x20, 0x1, 0xf6, 0x0, - 0x0, 0x1f, 0xec, 0xe1, 0x0, 0x1a, 0xf4, 0x0, - 0x17, 0xcf, 0xff, 0xa7, 0x8a, 0xff, 0xfb, 0x70, - 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa4, 0x7e, 0xf0, - - /* U+FEBD "ﺽ" */ - 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, - 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, - 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, - 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, - 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, - 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, - 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+FEBE "ﺾ" */ - 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, - 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0xa4, 0x3f, 0xb0, 0x0, 0x5f, 0x10, 0x4e, 0x10, - 0x0, 0xc, 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xa, - 0xc0, 0x0, 0x0, 0xaf, 0xf8, 0x78, 0xbf, 0xff, - 0x95, 0xd9, 0x0, 0x0, 0xb, 0xde, 0xff, 0xed, - 0x83, 0xaf, 0xcf, 0x70, 0x0, 0x0, 0xd9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x5f, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf6, 0x32, - 0x8f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x34, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+FEBF "ﺿ" */ - 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x50, 0x0, 0x4, - 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, 0xd, 0xa1, - 0xdd, 0x20, 0x1, 0xf5, 0x0, 0x1f, 0xec, 0xe1, - 0x0, 0x1a, 0xf3, 0x17, 0xcf, 0xff, 0xa7, 0x8a, - 0xff, 0x80, 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa3, - 0x0, - - /* U+FEC0 "ﻀ" */ - 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x60, 0x0, - 0x0, 0x4, 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, - 0x0, 0xd, 0xa1, 0xdd, 0x20, 0x1, 0xf6, 0x0, - 0x0, 0x1f, 0xec, 0xe1, 0x0, 0x1a, 0xf4, 0x0, - 0x17, 0xcf, 0xff, 0xa7, 0x8a, 0xff, 0xfb, 0x70, - 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa4, 0x7e, 0xf0, - - /* U+FEC1 "ﻁ" */ - 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, - 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, - 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, - 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, - 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, - - /* U+FEC2 "ﻂ" */ - 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, - 0x6, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0xf7, 0xb, - 0xfa, 0x46, 0xf7, 0x0, 0x0, 0xf, 0x7b, 0xf6, - 0x0, 0xc, 0xb0, 0x0, 0x0, 0xfd, 0xf5, 0x0, - 0x6, 0xf9, 0x0, 0x67, 0x7f, 0xfd, 0x77, 0x9d, - 0xff, 0xe7, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xb6, - 0x4d, 0xf5, - - /* U+FEC3 "ﻃ" */ - 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0x60, 0x6, 0xef, 0xf9, 0x0, 0x1, 0xf6, - 0xc, 0xf9, 0x47, 0xf6, 0x0, 0x1f, 0x6b, 0xf5, - 0x0, 0xd, 0x90, 0x1, 0xfd, 0xf4, 0x0, 0x7, - 0xf7, 0x17, 0x7f, 0xfd, 0x77, 0x9e, 0xfc, 0x2, - 0xff, 0xff, 0xff, 0xfd, 0xb5, 0x0, - - /* U+FEC4 "ﻄ" */ - 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, - 0x6, 0xef, 0xf9, 0x0, 0x0, 0x1, 0xf6, 0xc, - 0xf9, 0x47, 0xf6, 0x0, 0x0, 0x1f, 0x6b, 0xf5, - 0x0, 0xd, 0xa0, 0x0, 0x1, 0xfd, 0xf4, 0x0, - 0x7, 0xf8, 0x0, 0x17, 0x7f, 0xfd, 0x77, 0x9e, - 0xff, 0xd7, 0x12, 0xff, 0xff, 0xff, 0xfe, 0xb5, - 0x5d, 0xf4, - - /* U+FEC5 "ﻅ" */ - 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x70, 0x5c, 0x0, 0x0, - 0x0, 0x0, 0xf7, 0x1, 0x20, 0x0, 0x0, 0x0, - 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, - 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, - 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, - 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, - 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, - - /* U+FEC6 "ﻆ" */ - 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0x70, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, - 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, - 0x6, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0xf7, 0xb, - 0xfa, 0x46, 0xf7, 0x0, 0x0, 0xf, 0x7b, 0xf6, - 0x0, 0xc, 0xb0, 0x0, 0x0, 0xfd, 0xf5, 0x0, - 0x6, 0xf9, 0x0, 0x67, 0x7f, 0xfd, 0x77, 0x9d, - 0xff, 0xe7, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xb6, - 0x4d, 0xf5, - - /* U+FEC7 "ﻇ" */ - 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0x60, 0x6b, 0x0, 0x0, - 0x0, 0x1, 0xf6, 0x1, 0x20, 0x0, 0x0, 0x0, - 0x1f, 0x60, 0x6, 0xef, 0xf9, 0x0, 0x1, 0xf6, - 0xc, 0xf9, 0x47, 0xf6, 0x0, 0x1f, 0x6b, 0xf5, - 0x0, 0xd, 0x90, 0x1, 0xfd, 0xf4, 0x0, 0x7, - 0xf7, 0x17, 0x7f, 0xfd, 0x77, 0x9e, 0xfc, 0x2, - 0xff, 0xff, 0xff, 0xfd, 0xb5, 0x0, - - /* U+FEC8 "ﻈ" */ - 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0x60, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, - 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, - 0x6, 0xef, 0xf9, 0x0, 0x0, 0x1, 0xf6, 0xc, - 0xf9, 0x47, 0xf6, 0x0, 0x0, 0x1f, 0x6b, 0xf5, - 0x0, 0xd, 0xa0, 0x0, 0x1, 0xfd, 0xf4, 0x0, - 0x7, 0xf8, 0x0, 0x17, 0x7f, 0xfd, 0x77, 0x9e, - 0xff, 0xd7, 0x12, 0xff, 0xff, 0xff, 0xfe, 0xb5, - 0x5d, 0xf4, - - /* U+FEC9 "ﻉ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, - 0x20, 0x0, 0x0, 0xce, 0x75, 0x0, 0x0, 0x4, - 0xf2, 0x0, 0x0, 0x0, 0x4, 0xf4, 0x26, 0xbd, - 0x0, 0x0, 0xaf, 0xff, 0xd9, 0x0, 0x0, 0xbf, - 0x92, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, - 0xf, 0x80, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, - 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0x6, - 0xf9, 0x31, 0x13, 0x95, 0x0, 0x6d, 0xff, 0xff, - 0xd3, 0x0, 0x0, 0x13, 0x31, 0x0, - - /* U+FECA "ﻊ" */ - 0x0, 0x1, 0x10, 0x0, 0x0, 0x1, 0xcf, 0xfc, - 0x20, 0x0, 0x8, 0xf9, 0x8f, 0x90, 0x0, 0x4, - 0xfc, 0xdf, 0x50, 0x0, 0x1, 0xdf, 0xf4, 0x0, - 0x0, 0xa, 0xf7, 0xef, 0x97, 0x40, 0xf, 0x80, - 0x18, 0xdf, 0xa0, 0xf, 0x50, 0x0, 0x0, 0x0, - 0xd, 0xa0, 0x0, 0x0, 0x0, 0x6, 0xfa, 0x31, - 0x13, 0x96, 0x0, 0x5d, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x13, 0x31, 0x0, - - /* U+FECB "ﻋ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, - 0x20, 0x0, 0xc, 0xe7, 0x40, 0x0, 0x3, 0xf3, - 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, 0x2, - 0xf8, 0x1, 0x8d, 0x0, 0x5, 0xff, 0xfe, 0x61, - 0x79, 0xdf, 0xd5, 0x0, 0x2f, 0xd9, 0x30, 0x0, - 0x0, - - /* U+FECC "ﻌ" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x3, 0xdf, 0xfb, - 0x10, 0x0, 0xbf, 0x7a, 0xf7, 0x0, 0x5, 0xfa, - 0xde, 0x20, 0x0, 0x8, 0xff, 0x40, 0x1, 0x79, - 0xfd, 0xee, 0x86, 0x2f, 0xe8, 0x2, 0xaf, 0xe0, - - /* U+FECD "ﻍ" */ - 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xef, 0x20, 0x0, 0x0, - 0xce, 0x75, 0x0, 0x0, 0x4, 0xf2, 0x0, 0x0, - 0x0, 0x4, 0xf4, 0x26, 0xbd, 0x0, 0x0, 0xaf, - 0xff, 0xd9, 0x0, 0x0, 0xbf, 0x92, 0x0, 0x0, - 0x9, 0xf4, 0x0, 0x0, 0x0, 0xf, 0x80, 0x0, - 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, 0xe, - 0x90, 0x0, 0x0, 0x0, 0x6, 0xf9, 0x31, 0x13, - 0x95, 0x0, 0x6d, 0xff, 0xff, 0xd3, 0x0, 0x0, - 0x13, 0x31, 0x0, - - /* U+FECE "ﻎ" */ - 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x1, - 0xcf, 0xfc, 0x20, 0x0, 0x8, 0xf9, 0x8f, 0x90, - 0x0, 0x4, 0xfc, 0xdf, 0x50, 0x0, 0x1, 0xdf, - 0xf4, 0x0, 0x0, 0xa, 0xf7, 0xef, 0x97, 0x40, - 0xf, 0x80, 0x18, 0xdf, 0xa0, 0xf, 0x50, 0x0, - 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x0, 0x6, - 0xfa, 0x31, 0x13, 0x96, 0x0, 0x5d, 0xff, 0xff, - 0xd3, 0x0, 0x0, 0x13, 0x31, 0x0, - - /* U+FECF "ﻏ" */ - 0x0, 0x0, 0xf1, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, - 0xef, 0x20, 0x0, 0xc, 0xe7, 0x40, 0x0, 0x3, - 0xf3, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, - 0x2, 0xf8, 0x1, 0x8d, 0x0, 0x5, 0xff, 0xfe, - 0x61, 0x79, 0xdf, 0xd5, 0x0, 0x2f, 0xd9, 0x30, - 0x0, 0x0, - - /* U+FED0 "ﻐ" */ - 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x3, 0xdf, - 0xfb, 0x10, 0x0, 0xbf, 0x7a, 0xf7, 0x0, 0x5, - 0xfa, 0xde, 0x20, 0x0, 0x8, 0xff, 0x40, 0x1, - 0x79, 0xfd, 0xee, 0x86, 0x2f, 0xe8, 0x2, 0xaf, - 0xe0, - - /* U+FED1 "ﻑ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xfd, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xf9, 0xee, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xda, 0x5, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xd1, 0x8f, 0x3b, 0xa0, 0x0, 0x0, - 0x0, 0x4f, 0xfe, 0xf1, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xbc, 0xb, 0xf8, 0x32, 0x12, 0x24, - 0x6a, 0xfe, 0x20, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xc7, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, - 0x0, 0x0, - - /* U+FED2 "ﻒ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xc2, 0x0, - 0x11, 0x0, 0x0, 0x0, 0xb, 0xf9, 0xee, 0x0, - 0xca, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x20, - 0xf8, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x6f, 0x0, - 0xaf, 0x83, 0x22, 0x22, 0x35, 0xfd, 0xfd, 0x75, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xfb, - 0x0, 0x3, 0x44, 0x43, 0x32, 0x0, 0x0, 0x0, - - /* U+FED3 "ﻓ" */ - 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, - 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, - 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, - 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, - - /* U+FED4 "ﻔ" */ - 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x11, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, 0xb9, 0xf4, - 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, 0x0, 0x2f, - 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, 0xf7, 0x71, - 0x2f, 0xfe, 0xba, 0xef, 0xf4, - - /* U+FED5 "ﻕ" */ - 0x0, 0x0, 0x0, 0x5c, 0x6c, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x12, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0xaf, 0x9e, 0xa0, - 0x0, 0x0, 0x0, 0xf9, 0x7, 0xf0, 0x0, 0x0, - 0x0, 0xdc, 0x19, 0xf2, 0x3, 0x50, 0x0, 0x5f, - 0xfe, 0xf3, 0xc, 0x90, 0x0, 0x1, 0x24, 0xf1, - 0xf, 0x50, 0x0, 0x0, 0x9, 0xd0, 0x2f, 0x40, - 0x0, 0x0, 0x3f, 0x60, 0xf, 0x70, 0x0, 0x4, - 0xeb, 0x0, 0xb, 0xe5, 0x35, 0xaf, 0xb0, 0x0, - 0x1, 0xdf, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x3, - 0x43, 0x0, 0x0, 0x0, - - /* U+FED6 "ﻖ" */ - 0x0, 0x0, 0x0, 0xf, 0x3f, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0x9e, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf8, - 0x6, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xed, 0x33, - 0xf2, 0x0, 0x9, 0x70, 0x0, 0x8f, 0xfe, 0xf8, - 0x73, 0xf, 0x60, 0x0, 0x8, 0xff, 0xff, 0xf8, - 0x2f, 0x40, 0x0, 0x0, 0xc, 0xd0, 0x0, 0xf, - 0x70, 0x0, 0x0, 0x9f, 0x40, 0x0, 0xb, 0xe6, - 0x23, 0x6d, 0xf6, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xfc, 0x30, 0x0, 0x0, 0x0, 0x2, 0x44, 0x10, - 0x0, 0x0, 0x0, - - /* U+FED7 "ﻗ" */ - 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, - 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, - 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, - 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, - 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, - - /* U+FED8 "ﻘ" */ - 0x0, 0x8, 0x99, 0x80, 0x0, 0x0, 0x1, 0x11, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, 0xb9, 0xf4, - 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, 0x0, 0x2f, - 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, 0xf7, 0x71, - 0x2f, 0xfe, 0xba, 0xef, 0xf4, - - /* U+FED9 "ﻙ" */ - 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, - 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, - 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, - 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, - 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, - 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, - 0xb4, 0x0, - - /* U+FEDA "ﻚ" */ - 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x90, 0x0, 0x0, 0x2, 0x96, 0x0, - 0xe9, 0x0, 0x0, 0x0, 0x76, 0x0, 0xe, 0x90, - 0x0, 0x0, 0x0, 0x58, 0x0, 0xe9, 0x0, 0x0, - 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe9, 0x0, 0x22, 0x0, 0x0, 0x0, - 0xf, 0x90, 0xd, 0xa0, 0x0, 0x0, 0x9, 0xfa, - 0x0, 0x9f, 0xb7, 0x55, 0x8e, 0xfd, 0xf8, 0x40, - 0x6c, 0xff, 0xfe, 0xa4, 0x9, 0xfa, - - /* U+FEDB "ﻛ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xb9, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x8, 0xff, - 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, 0x3f, - 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, 0x0, - 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, 0x0, - 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, 0x3f, - 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, 0xff, - 0xd4, 0x0, 0x0, - - /* U+FEDC "ﻜ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4b, 0x90, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x0, - 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, 0x10, 0x0, - 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, 0x0, 0x0, - 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x17, - 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, 0xd4, 0x8, - 0xef, - - /* U+FEDD "ﻝ" */ - 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, - 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, - 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, - 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, - 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, - 0x0, 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, - 0x5, 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, - 0x0, 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, - 0x20, 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, - 0x30, 0x0, 0x0, - - /* U+FEDE "ﻞ" */ - 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x25, 0x0, - 0x0, 0x5, 0xf4, 0x0, 0xbb, 0x0, 0x0, 0x8, - 0xfd, 0x71, 0xd9, 0x0, 0x0, 0x2e, 0xed, 0xf4, - 0x9f, 0x61, 0x37, 0xef, 0x30, 0x0, 0x1a, 0xff, - 0xff, 0xa2, 0x0, 0x0, 0x0, 0x13, 0x30, 0x0, - 0x0, 0x0, - - /* U+FEDF "ﻟ" */ - 0x0, 0x1f, 0x60, 0x1, 0xf6, 0x0, 0x1f, 0x60, - 0x1, 0xf6, 0x0, 0x1f, 0x60, 0x1, 0xf6, 0x0, - 0x1f, 0x60, 0x1, 0xf6, 0x0, 0x1f, 0x60, 0x2, - 0xf5, 0x17, 0xcf, 0x12, 0xfe, 0x60, - - /* U+FEE0 "ﻠ" */ - 0x0, 0x1f, 0x60, 0x0, 0x1, 0xf6, 0x0, 0x0, - 0x1f, 0x60, 0x0, 0x1, 0xf6, 0x0, 0x0, 0x1f, - 0x60, 0x0, 0x1, 0xf6, 0x0, 0x0, 0x1f, 0x60, - 0x0, 0x1, 0xf6, 0x0, 0x0, 0x1f, 0x60, 0x0, - 0x2, 0xf7, 0x0, 0x17, 0xcf, 0xe7, 0x32, 0xfe, - 0x8c, 0xf7, - - /* U+FEE1 "ﻡ" */ - 0x0, 0x2, 0x87, 0x10, 0x0, 0x2f, 0xff, 0xf3, - 0x0, 0xae, 0x11, 0xea, 0x3, 0xdd, 0x32, 0xea, - 0x5f, 0xbe, 0xff, 0xe3, 0xcb, 0x0, 0x23, 0x0, - 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, - 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, - - /* U+FEE2 "ﻢ" */ - 0x0, 0x7, 0xee, 0x60, 0x0, 0x0, 0x5f, 0xbb, - 0xf5, 0x0, 0x0, 0xbc, 0x0, 0xdc, 0x0, 0x5, - 0xee, 0x77, 0xff, 0xb7, 0x6f, 0x7a, 0xef, 0xdd, - 0xfd, 0xca, 0x0, 0x0, 0x0, 0x0, 0xea, 0x0, - 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, 0x0, - 0xc9, 0x0, 0x0, 0x0, 0x0, - - /* U+FEE3 "ﻣ" */ - 0x0, 0x1, 0xbf, 0xd5, 0x0, 0x0, 0xce, 0x9d, - 0xf1, 0x0, 0x1f, 0x50, 0x3f, 0x41, 0x7c, 0xfb, - 0x7b, 0xf2, 0x2f, 0xe9, 0xdf, 0xe6, 0x0, - - /* U+FEE4 "ﻤ" */ - 0x0, 0x1, 0xbf, 0xc3, 0x0, 0x0, 0x0, 0xce, - 0x9d, 0xe1, 0x0, 0x0, 0x1f, 0x50, 0x4f, 0x50, - 0x1, 0x7c, 0xfb, 0x7a, 0xfe, 0x72, 0x2f, 0xe9, - 0xdf, 0xfb, 0xef, 0x60, - - /* U+FEE5 "ﻥ" */ - 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf2, 0x23, - 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x0, - 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, 0xc9, 0x0, - 0x0, 0x3, 0xf5, 0xad, 0x0, 0x0, 0xa, 0xe0, - 0x3f, 0xa4, 0x24, 0xaf, 0x60, 0x5, 0xef, 0xff, - 0xe5, 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, - - /* U+FEE6 "ﻦ" */ - 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x10, 0x7, 0xf0, 0x0, 0x24, 0x0, 0x0, 0x1, - 0xf7, 0x0, 0xac, 0x0, 0x0, 0x0, 0xff, 0x82, - 0xca, 0x0, 0x0, 0x0, 0xfe, 0xf5, 0xc9, 0x0, - 0x0, 0x2, 0xf5, 0x0, 0xad, 0x0, 0x0, 0x9, - 0xe0, 0x0, 0x3f, 0xa4, 0x24, 0xaf, 0x40, 0x0, - 0x5, 0xef, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x3, - 0x42, 0x0, 0x0, 0x0, - - /* U+FEE7 "ﻧ" */ - 0x0, 0x3e, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x4, 0xc0, 0x0, 0x6f, 0x0, 0x7, 0xf0, 0x18, - 0xec, 0x2, 0xfc, 0x20, - - /* U+FEE8 "ﻨ" */ - 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, - 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, - - /* U+FEE9 "ﻩ" */ - 0x0, 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, - 0x5a, 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, - 0x3f, 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, - 0x0, - - /* U+FEEA "ﻪ" */ - 0x0, 0x17, 0xf2, 0x0, 0x7, 0xfe, 0xf3, 0x0, - 0x7f, 0x50, 0xf6, 0x0, 0xd9, 0x0, 0xda, 0x0, - 0x9f, 0xdf, 0xff, 0x95, 0x4, 0x75, 0x8, 0xfb, - - /* U+FEEB "ﻫ" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x9, 0xe6, 0x0, - 0x0, 0x0, 0x2e, 0xfb, 0x0, 0x0, 0xa, 0xda, - 0xfc, 0x0, 0x0, 0xe7, 0xf, 0xfa, 0x0, 0xd, - 0xa4, 0xf7, 0xf3, 0x0, 0x9f, 0xee, 0xe, 0x71, - 0x7a, 0xff, 0xa5, 0xe6, 0x2f, 0xea, 0xae, 0xfa, - 0x0, - - /* U+FEEC "ﻬ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xf8, - 0x0, 0x0, 0x3f, 0x98, 0xf1, 0x0, 0x9, 0xd0, - 0x9e, 0x0, 0x17, 0xdd, 0xbf, 0x97, 0x32, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xbb, 0x6f, 0x60, 0x0, - 0x9, 0xe0, 0x7f, 0x0, 0x0, 0x3f, 0x77, 0xf0, - 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x12, - 0x0, 0x0, - - /* U+FEED "ﻭ" */ - 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, - 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, - 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, - 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, - 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, - - /* U+FEEE "ﻮ" */ - 0x0, 0x8, 0xee, 0x40, 0x0, 0x0, 0x6f, 0xac, - 0xf1, 0x0, 0x0, 0xae, 0x1, 0xf6, 0x0, 0x0, - 0x6f, 0xa7, 0xfb, 0x73, 0x0, 0x8, 0xef, 0xff, - 0xf6, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, - 0x2e, 0xc0, 0x0, 0x12, 0x48, 0xee, 0x20, 0x0, - 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x34, 0x20, 0x0, - 0x0, 0x0, - - /* U+FEEF "ﻯ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, - 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, - 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, - 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, - 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, - 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, - - /* U+FEF0 "ﻰ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, - 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, - 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, - 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, - 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, - 0x42, 0x0, 0x0, 0x0, - - /* U+FEF1 "ﻱ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, - 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, - 0x8, 0xff, 0xa1, 0xc, 0xa0, 0x0, 0x0, 0x5e, - 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xb, 0xd1, - 0x0, 0x4, 0xaf, 0x70, 0x1c, 0xfd, 0xef, 0xfb, - 0x40, 0x0, 0x3, 0x55, 0x30, 0x0, 0x0, 0x0, - 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, - 0x0, 0x0, - - /* U+FEF2 "ﻲ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, - 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, - 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, - 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, - 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, - 0x42, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, 0x0, - 0x0, - - /* U+FEF3 "ﻳ" */ - 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, - 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, - 0xf4, 0xe0, 0x2, 0x2, - - /* U+FEF4 "ﻴ" */ - 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, - 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, - 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, - - /* U+FEF5 "ﻵ" */ - 0x1a, 0x30, 0x19, 0x0, 0x0, 0x85, 0xad, 0xb4, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0xf8, 0x0, - 0x1f, 0x50, 0x0, 0xf8, 0x0, 0x9, 0xc0, 0x0, - 0xf8, 0x0, 0x2, 0xf3, 0x0, 0xf8, 0x0, 0x0, - 0xba, 0x0, 0xf8, 0x0, 0x0, 0x4f, 0x20, 0xf7, - 0x0, 0x0, 0xc, 0x90, 0xf6, 0x0, 0x0, 0x5, - 0xf4, 0xf3, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, - 0x0, 0x0, 0xbf, 0x50, 0x0, 0x8, 0x7c, 0xf7, - 0x0, 0x0, 0xb, 0xfc, 0x40, 0x0, - - /* U+FEF6 "ﻶ" */ - 0x1a, 0x30, 0x19, 0x0, 0x0, 0x0, 0x85, 0xad, - 0xb4, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0xf8, 0x0, 0x0, 0x1f, 0x50, 0x0, 0xf8, 0x0, - 0x0, 0x9, 0xc0, 0x0, 0xf8, 0x0, 0x0, 0x2, - 0xf3, 0x0, 0xf8, 0x0, 0x0, 0x0, 0xba, 0x0, - 0xf8, 0x0, 0x0, 0x0, 0x4f, 0x20, 0xf8, 0x0, - 0x0, 0x0, 0xc, 0x90, 0xf8, 0x0, 0x0, 0x0, - 0x5, 0xf4, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xcd, 0x0, - 0x0, 0x8, 0x7c, 0xf6, 0x3f, 0xa4, 0x0, 0xb, - 0xfc, 0x40, 0x7, 0xfb, - - /* U+FEF7 "ﻷ" */ - 0x9, 0xc3, 0x0, 0x0, 0x2, 0xa0, 0x0, 0x0, - 0x0, 0x1d, 0x52, 0x0, 0x0, 0x2, 0xed, 0x50, - 0x0, 0x0, 0x2, 0x0, 0x0, 0xf, 0x80, 0x2e, - 0x30, 0x0, 0xf8, 0x0, 0xbb, 0x0, 0xf, 0x80, - 0x3, 0xf2, 0x0, 0xf8, 0x0, 0xc, 0x90, 0xf, - 0x80, 0x0, 0x5f, 0x10, 0xf7, 0x0, 0x0, 0xd8, - 0xf, 0x60, 0x0, 0x6, 0xe4, 0xf3, 0x0, 0x0, - 0xe, 0xee, 0x0, 0x0, 0x0, 0xbf, 0x50, 0x0, - 0x87, 0xcf, 0x70, 0x0, 0xb, 0xfc, 0x40, 0x0, - - /* U+FEF8 "ﻸ" */ - 0x9, 0xc3, 0x0, 0x0, 0x0, 0x2, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0x52, 0x0, 0x0, 0x0, - 0x2, 0xed, 0x50, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0xf, 0x80, 0x0, 0x2e, 0x30, 0x0, 0xf8, - 0x0, 0x0, 0xbb, 0x0, 0xf, 0x80, 0x0, 0x3, - 0xf2, 0x0, 0xf8, 0x0, 0x0, 0xc, 0x90, 0xf, - 0x80, 0x0, 0x0, 0x5f, 0x10, 0xf8, 0x0, 0x0, - 0x0, 0xd8, 0xf, 0x80, 0x0, 0x0, 0x6, 0xe4, - 0xf8, 0x0, 0x0, 0x0, 0xe, 0xef, 0x90, 0x0, - 0x0, 0x0, 0xbf, 0xdd, 0x0, 0x0, 0x87, 0xcf, - 0x73, 0xfa, 0x40, 0xb, 0xfc, 0x40, 0x7, 0xfb, - - /* U+FEF9 "ﻹ" */ - 0x0, 0x0, 0x0, 0xf8, 0x2e, 0x30, 0x0, 0xf8, - 0xb, 0xb0, 0x0, 0xf8, 0x3, 0xf2, 0x0, 0xf8, - 0x0, 0xc9, 0x0, 0xf8, 0x0, 0x5f, 0x10, 0xf7, - 0x0, 0xd, 0x80, 0xf6, 0x0, 0x6, 0xe4, 0xf3, - 0x0, 0x0, 0xee, 0xe0, 0x0, 0x0, 0xbf, 0x50, - 0x8, 0x7c, 0xf7, 0x0, 0xb, 0xfc, 0x40, 0x0, - 0x5c, 0x70, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0x9d, 0xa0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, - - /* U+FEFA "ﻺ" */ - 0x0, 0x0, 0x0, 0xf8, 0x0, 0x2e, 0x30, 0x0, - 0xf8, 0x0, 0xb, 0xb0, 0x0, 0xf8, 0x0, 0x3, - 0xf2, 0x0, 0xf8, 0x0, 0x0, 0xc9, 0x0, 0xf8, - 0x0, 0x0, 0x5f, 0x10, 0xf8, 0x0, 0x0, 0xd, - 0x80, 0xf8, 0x0, 0x0, 0x6, 0xe4, 0xf8, 0x0, - 0x0, 0x0, 0xee, 0xf9, 0x0, 0x0, 0x0, 0xbf, - 0xdd, 0x0, 0x8, 0x7c, 0xf7, 0x3f, 0xa4, 0xb, - 0xfc, 0x40, 0x7, 0xfb, 0x5c, 0x70, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x9d, 0xa0, - 0x0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, - - /* U+FEFB "ﻻ" */ - 0x0, 0x0, 0x0, 0xf8, 0x2e, 0x30, 0x0, 0xf8, - 0xb, 0xb0, 0x0, 0xf8, 0x3, 0xf2, 0x0, 0xf8, - 0x0, 0xc9, 0x0, 0xf8, 0x0, 0x5f, 0x10, 0xf7, - 0x0, 0xd, 0x80, 0xf6, 0x0, 0x6, 0xe4, 0xf3, - 0x0, 0x0, 0xee, 0xe0, 0x0, 0x0, 0xbf, 0x50, - 0x8, 0x7c, 0xf7, 0x0, 0xb, 0xfc, 0x40, 0x0, - - /* U+FEFC "ﻼ" */ - 0x0, 0x0, 0x0, 0xf8, 0x0, 0x2e, 0x30, 0x0, - 0xf8, 0x0, 0xb, 0xb0, 0x0, 0xf8, 0x0, 0x3, - 0xf2, 0x0, 0xf8, 0x0, 0x0, 0xc9, 0x0, 0xf8, - 0x0, 0x0, 0x5f, 0x10, 0xf8, 0x0, 0x0, 0xd, - 0x80, 0xf8, 0x0, 0x0, 0x6, 0xe4, 0xf8, 0x0, - 0x0, 0x0, 0xee, 0xf9, 0x0, 0x0, 0x0, 0xbf, - 0xdd, 0x0, 0x8, 0x7c, 0xf7, 0x3f, 0xa4, 0xb, - 0xfc, 0x40, 0x7, 0xfb, - - /* U+FEFF "" */ - -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 81, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 103, .box_w = 2, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12, .adv_w = 118, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 25, .adv_w = 215, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 97, .adv_w = 163, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 157, .adv_w = 243, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 247, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 313, .adv_w = 70, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 318, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 348, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 378, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 410, .adv_w = 215, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 471, .adv_w = 81, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 477, .adv_w = 92, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 485, .adv_w = 81, .box_w = 3, .box_h = 2, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 488, .adv_w = 86, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 527, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 581, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 629, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 677, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 725, .adv_w = 163, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 785, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 833, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 887, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 935, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 989, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1043, .adv_w = 86, .box_w = 3, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1055, .adv_w = 86, .box_w = 3, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1070, .adv_w = 215, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1125, .adv_w = 215, .box_w = 11, .box_h = 6, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 1158, .adv_w = 215, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1213, .adv_w = 136, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1255, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1360, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1426, .adv_w = 176, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1480, .adv_w = 179, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1546, .adv_w = 197, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1612, .adv_w = 162, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1666, .adv_w = 147, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1714, .adv_w = 198, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1786, .adv_w = 193, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1846, .adv_w = 76, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1864, .adv_w = 76, .box_w = 5, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 1902, .adv_w = 168, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1962, .adv_w = 143, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2010, .adv_w = 221, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2082, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2142, .adv_w = 202, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2214, .adv_w = 154, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2268, .adv_w = 202, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2352, .adv_w = 178, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2412, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2466, .adv_w = 156, .box_w = 11, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2532, .adv_w = 187, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2592, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2658, .adv_w = 253, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2754, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2820, .adv_w = 156, .box_w = 11, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2886, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2952, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 2982, .adv_w = 86, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3021, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 3051, .adv_w = 215, .box_w = 11, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 3079, .adv_w = 128, .box_w = 10, .box_h = 2, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 3089, .adv_w = 128, .box_w = 5, .box_h = 3, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 3097, .adv_w = 157, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3138, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3192, .adv_w = 141, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3228, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3282, .adv_w = 158, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3323, .adv_w = 90, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3359, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3413, .adv_w = 162, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3461, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3473, .adv_w = 71, .box_w = 4, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 3503, .adv_w = 148, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3557, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3569, .adv_w = 249, .box_w = 14, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3632, .adv_w = 162, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3668, .adv_w = 157, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3709, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 3763, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3817, .adv_w = 105, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3847, .adv_w = 133, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3883, .adv_w = 100, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3919, .adv_w = 162, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3955, .adv_w = 152, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3996, .adv_w = 209, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4055, .adv_w = 152, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4096, .adv_w = 152, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 4150, .adv_w = 134, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4186, .adv_w = 163, .box_w = 7, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 4242, .adv_w = 86, .box_w = 2, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 4258, .adv_w = 163, .box_w = 7, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 4314, .adv_w = 215, .box_w = 11, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 4336, .adv_w = 171, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4377, .adv_w = 148, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4418, .adv_w = 106, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4450, .adv_w = 140, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4491, .adv_w = 167, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4527, .adv_w = 70, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4536, .adv_w = 89, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4559, .adv_w = 167, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4595, .adv_w = 166, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4636, .adv_w = 57, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 4642, .adv_w = 138, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 4690, .adv_w = 135, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4726, .adv_w = 146, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4774, .adv_w = 170, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4815, .adv_w = 174, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4860, .adv_w = 70, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 4872, .adv_w = 103, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4895, .adv_w = 166, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4936, .adv_w = 160, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4986, .adv_w = 164, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 5034, .adv_w = 160, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5075, .adv_w = 138, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 5123, .adv_w = 152, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5164, .adv_w = 182, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 5229, .adv_w = 145, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5265, .adv_w = 181, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5315, .adv_w = 168, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5360, .adv_w = 163, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5435, .adv_w = 163, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5510, .adv_w = 194, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5560, .adv_w = 250, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5630, .adv_w = 83, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5636, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 5651, .adv_w = 81, .box_w = 3, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5666, .adv_w = 136, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5708, .adv_w = 120, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 5732, .adv_w = 71, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 5785, .adv_w = 71, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5817, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 5877, .adv_w = 71, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 5909, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 5975, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5987, .adv_w = 241, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 6046, .adv_w = 134, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6078, .adv_w = 241, .box_w = 13, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6117, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6169, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 6234, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 6294, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 6364, .adv_w = 114, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6389, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6424, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 6460, .adv_w = 124, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 6508, .adv_w = 313, .box_w = 18, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 6598, .adv_w = 313, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 6724, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 6832, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 6940, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7018, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7096, .adv_w = 153, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 7166, .adv_w = 153, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 7241, .adv_w = 75, .box_w = 6, .box_h = 2, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 7247, .adv_w = 265, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7337, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 7421, .adv_w = 211, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7487, .adv_w = 186, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 7562, .adv_w = 159, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 7602, .adv_w = 188, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 7657, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7682, .adv_w = 124, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 7722, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 7777, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 7843, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 7858, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 7873, .adv_w = 0, .box_w = 6, .box_h = 4, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 7885, .adv_w = 0, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 7894, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 7909, .adv_w = 0, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 7918, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 7933, .adv_w = 0, .box_w = 6, .box_h = 4, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 7945, .adv_w = 0, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 7954, .adv_w = 0, .box_w = 4, .box_h = 4, .ofs_x = 2, .ofs_y = 9}, - {.bitmap_index = 7962, .adv_w = 0, .box_w = 4, .box_h = 4, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 7970, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 7985, .adv_w = 128, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 7994, .adv_w = 138, .box_w = 3, .box_h = 2, .ofs_x = 3, .ofs_y = 4}, - {.bitmap_index = 7997, .adv_w = 138, .box_w = 4, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8017, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8057, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8102, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8141, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8180, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8224, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8269, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8314, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8358, .adv_w = 138, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8393, .adv_w = 83, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 8413, .adv_w = 81, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 8419, .adv_w = 140, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 8455, .adv_w = 241, .box_w = 13, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8494, .adv_w = 199, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 8566, .adv_w = 0, .box_w = 2, .box_h = 5, .ofs_x = 3, .ofs_y = 10}, - {.bitmap_index = 8571, .adv_w = 75, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 8579, .adv_w = 241, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8644, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8696, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 8768, .adv_w = 241, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 8827, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8879, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 8951, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9003, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 9075, .adv_w = 165, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 9155, .adv_w = 165, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 9235, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 9300, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 9360, .adv_w = 165, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 9440, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 9500, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 9560, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9602, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9637, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9672, .adv_w = 114, .box_w = 7, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9725, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9760, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9795, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9837, .adv_w = 114, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9876, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9918, .adv_w = 124, .box_w = 9, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 9990, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 10053, .adv_w = 128, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 10098, .adv_w = 136, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 10139, .adv_w = 156, .box_w = 12, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 10193, .adv_w = 136, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 10229, .adv_w = 124, .box_w = 9, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 10283, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 10346, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 10409, .adv_w = 313, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 10517, .adv_w = 313, .box_w = 18, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 10607, .adv_w = 313, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 10733, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 10841, .adv_w = 310, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 10967, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11045, .adv_w = 153, .box_w = 10, .box_h = 17, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 11130, .adv_w = 265, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 11198, .adv_w = 265, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 11288, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 11393, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 11498, .adv_w = 265, .box_w = 15, .box_h = 13, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 11596, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 11701, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 11785, .adv_w = 199, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 11881, .adv_w = 229, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 11979, .adv_w = 270, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 12084, .adv_w = 229, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 12182, .adv_w = 211, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 12248, .adv_w = 211, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 12325, .adv_w = 211, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 12419, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 12531, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 12643, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 12755, .adv_w = 229, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 12881, .adv_w = 229, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 13021, .adv_w = 229, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 13147, .adv_w = 186, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 13252, .adv_w = 186, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 13342, .adv_w = 186, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 13437, .adv_w = 186, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 13532, .adv_w = 188, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 13597, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 13647, .adv_w = 188, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 13717, .adv_w = 188, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 13782, .adv_w = 188, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 13847, .adv_w = 179, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 13892, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 13962, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 14018, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 14078, .adv_w = 124, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 14142, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 14198, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 14253, .adv_w = 200, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 14314, .adv_w = 200, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 14391, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 14416, .adv_w = 138, .box_w = 3, .box_h = 2, .ofs_x = 3, .ofs_y = 4}, - {.bitmap_index = 14419, .adv_w = 138, .box_w = 4, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14439, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14479, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14524, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14564, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14608, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 14647, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14692, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14737, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14781, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14917, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15013, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 15125, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15221, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15287, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15415, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15543, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 15669, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15797, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15905, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16033, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 16089, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 16173, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16317, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16413, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16501, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 16581, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 16707, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 16812, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 16910, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 16990, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 17102, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 17172, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 17242, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 17340, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 17368, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17476, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17636, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 17796, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17924, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 17994, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 18064, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 18204, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 18300, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18428, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 18573, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 18678, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18790, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 18888, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 18986, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 19082, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 19178, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19290, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19402, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 19510, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 19672, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19768, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 19918, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 20018, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 20118, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 20218, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 20318, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 20418, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 20565, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 20661, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20773, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 20918, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 21038, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21134, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 21228, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 21300, .adv_w = 251, .box_w = 15, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 21375, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 21400, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 21430, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 21502, .adv_w = 251, .box_w = 15, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 21577, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 21602, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 21632, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 21704, .adv_w = 251, .box_w = 15, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 21779, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 21804, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 21834, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 21886, .adv_w = 251, .box_w = 15, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 21946, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 21971, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 22001, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 22053, .adv_w = 251, .box_w = 15, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 22113, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 22138, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 22168, .adv_w = 241, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 22233, .adv_w = 251, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 22301, .adv_w = 71, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 22334, .adv_w = 77, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 22367, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 22472, .adv_w = 265, .box_w = 16, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 22568, .adv_w = 122, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 22616, .adv_w = 130, .box_w = 10, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 22671, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 22776, .adv_w = 265, .box_w = 16, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 22872, .adv_w = 122, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 22920, .adv_w = 130, .box_w = 10, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 22975, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 23035, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 23100, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 23160, .adv_w = 165, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 23232, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 23297, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 23357, .adv_w = 158, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 23407, .adv_w = 165, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 23467, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 23527, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 23587, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 23647, .adv_w = 165, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 23719, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 23779, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 23839, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 23899, .adv_w = 165, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 23971, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 24006, .adv_w = 134, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 24051, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 24086, .adv_w = 134, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 24131, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 24173, .adv_w = 134, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 24227, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 24269, .adv_w = 134, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 24323, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 24386, .adv_w = 141, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 24456, .adv_w = 124, .box_w = 9, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 24528, .adv_w = 141, .box_w = 10, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 24608, .adv_w = 229, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 24706, .adv_w = 229, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 24811, .adv_w = 122, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 24870, .adv_w = 141, .box_w = 10, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 24935, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 25047, .adv_w = 229, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 25167, .adv_w = 122, .box_w = 9, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 25235, .adv_w = 141, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 25310, .adv_w = 229, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 25450, .adv_w = 229, .box_w = 15, .box_h = 21, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 25608, .adv_w = 122, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 25698, .adv_w = 141, .box_w = 10, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 25798, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 25910, .adv_w = 229, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 26023, .adv_w = 122, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 26086, .adv_w = 141, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 26156, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 26206, .adv_w = 195, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 26266, .adv_w = 188, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 26336, .adv_w = 195, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 26414, .adv_w = 71, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 26447, .adv_w = 77, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 26480, .adv_w = 179, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 26525, .adv_w = 162, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 26580, .adv_w = 135, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 26621, .adv_w = 118, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 26671, .adv_w = 211, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 26748, .adv_w = 216, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 26839, .adv_w = 122, .box_w = 9, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 26907, .adv_w = 141, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 26982, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 27042, .adv_w = 132, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 27117, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 27173, .adv_w = 132, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 27243, .adv_w = 124, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 27307, .adv_w = 132, .box_w = 10, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 27387, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 27443, .adv_w = 132, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 27513, .adv_w = 200, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 27590, .adv_w = 213, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 27668, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 27693, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 27723, .adv_w = 71, .box_w = 5, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 27736, .adv_w = 77, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 27751, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 27806, .adv_w = 213, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 27858, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 27878, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 27902, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 27915, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 27957, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 27970, .adv_w = 67, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 27978, .adv_w = 75, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 27988, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 27996, .adv_w = 75, .box_w = 6, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 28032, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 28045, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 28087, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 28095, .adv_w = 75, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 28110, .adv_w = 75, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = 10}, - {.bitmap_index = 28125, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 28167, .adv_w = 75, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 28177, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 28219, .adv_w = 120, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 28243, .adv_w = 71, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 28296, .adv_w = 78, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 28349, .adv_w = 71, .box_w = 4, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 28383, .adv_w = 78, .box_w = 6, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 28434, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 28494, .adv_w = 132, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 28569, .adv_w = 71, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 28601, .adv_w = 78, .box_w = 6, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 28649, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 28715, .adv_w = 213, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 28787, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 28812, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 28842, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 28854, .adv_w = 78, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 28884, .adv_w = 241, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 28943, .adv_w = 251, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 29011, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 29031, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 29055, .adv_w = 134, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 29087, .adv_w = 137, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 29119, .adv_w = 241, .box_w = 13, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 29158, .adv_w = 251, .box_w = 15, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 29203, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 29223, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 29247, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 29299, .adv_w = 251, .box_w = 15, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 29359, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 29384, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 29414, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 29479, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 29539, .adv_w = 158, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 29589, .adv_w = 165, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 29649, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 29709, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 29774, .adv_w = 158, .box_w = 10, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 29809, .adv_w = 165, .box_w = 12, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 29851, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 29921, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 29991, .adv_w = 158, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 30036, .adv_w = 165, .box_w = 12, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 30090, .adv_w = 114, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 30115, .adv_w = 134, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 30147, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 30182, .adv_w = 134, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 30227, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 30263, .adv_w = 141, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 30313, .adv_w = 124, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 30361, .adv_w = 141, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 30421, .adv_w = 313, .box_w = 18, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 30511, .adv_w = 326, .box_w = 20, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 30621, .adv_w = 215, .box_w = 14, .box_h = 6, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 30663, .adv_w = 228, .box_w = 16, .box_h = 6, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 30711, .adv_w = 313, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 30837, .adv_w = 326, .box_w = 20, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 30977, .adv_w = 215, .box_w = 14, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 31040, .adv_w = 228, .box_w = 16, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 31120, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 31228, .adv_w = 314, .box_w = 19, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 31342, .adv_w = 217, .box_w = 14, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 31391, .adv_w = 222, .box_w = 16, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 31447, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 31555, .adv_w = 314, .box_w = 19, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 31669, .adv_w = 217, .box_w = 14, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 31718, .adv_w = 222, .box_w = 16, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 31774, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 31852, .adv_w = 243, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 31942, .adv_w = 204, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 32020, .adv_w = 210, .box_w = 15, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 32110, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 32188, .adv_w = 243, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 32278, .adv_w = 204, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 32356, .adv_w = 210, .box_w = 15, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 32446, .adv_w = 153, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 32516, .adv_w = 136, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 32576, .adv_w = 153, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 32617, .adv_w = 124, .box_w = 9, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 32649, .adv_w = 153, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 32724, .adv_w = 136, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 32794, .adv_w = 134, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 32844, .adv_w = 124, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 32885, .adv_w = 265, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 32975, .adv_w = 265, .box_w = 16, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 33055, .adv_w = 122, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 33095, .adv_w = 130, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 33140, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 33224, .adv_w = 214, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 33315, .adv_w = 122, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 33355, .adv_w = 130, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 33400, .adv_w = 211, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 33466, .adv_w = 216, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 33544, .adv_w = 122, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 33603, .adv_w = 141, .box_w = 10, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 33668, .adv_w = 186, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 33743, .adv_w = 194, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 33833, .adv_w = 78, .box_w = 5, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 33863, .adv_w = 85, .box_w = 7, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 33905, .adv_w = 159, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 33945, .adv_w = 170, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 33990, .adv_w = 137, .box_w = 9, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 34013, .adv_w = 148, .box_w = 11, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 34041, .adv_w = 188, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 34096, .adv_w = 195, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 34156, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 34176, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 34200, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 34225, .adv_w = 137, .box_w = 8, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 34249, .adv_w = 135, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 34290, .adv_w = 118, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 34340, .adv_w = 124, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 34380, .adv_w = 132, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 34430, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 34485, .adv_w = 213, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 34537, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 34603, .adv_w = 213, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 34668, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 34688, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 34712, .adv_w = 146, .box_w = 10, .box_h = 14, .ofs_x = -2, .ofs_y = 0}, - {.bitmap_index = 34782, .adv_w = 153, .box_w = 12, .box_h = 14, .ofs_x = -2, .ofs_y = 0}, - {.bitmap_index = 34866, .adv_w = 146, .box_w = 9, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 34938, .adv_w = 153, .box_w = 11, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 35026, .adv_w = 146, .box_w = 8, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 35090, .adv_w = 153, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 35170, .adv_w = 146, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 35218, .adv_w = 153, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 35278, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_2[] = { - 0x0, 0x1, 0x3, 0x4, 0x6, 0xf, 0x15, 0x19 -}; - -static const uint8_t glyph_id_ofs_list_5[] = { - 0, 0, 0, 1, 0, 0, 0, 0, - 0, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 0, 0, 0, 19 -}; - -static const uint16_t unicode_list_7[] = { - 0x0, 0x1, 0x2, 0x5, 0x6, 0x8, 0xa, 0xf, - 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, - 0x32, 0x33, 0xe93b, 0xe942, 0xe945, 0xe946, 0xe947, 0xe94b, - 0xe94d, 0xe94f, 0xe953, 0xe956, 0xe95b, 0xe960, 0xe961, 0xe962, - 0xe978, 0xe97d, 0xe982, 0xe985, 0xe986, 0xe987, 0xe98b, 0xe98c, - 0xe98d, 0xe98e, 0xe9a1, 0xe9a2, 0xe9a8, 0xe9aa, 0xe9ab, 0xe9ae, - 0xe9b1, 0xe9b2, 0xe9b3, 0xe9b5, 0xe9cd, 0xe9cf, 0xe9fe, 0xe9ff, - 0xea01, 0xea03, 0xea1a, 0xea21, 0xea24, 0xea2d, 0xea56, 0xea5e, - 0xea95, 0xeb25, 0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d, 0xeb7e, 0xebc1, - 0xebcd, 0xec27, 0xec3e, 0xee94, 0xf0fc, 0xf1dc -}; - -static const uint16_t unicode_list_9[] = { - 0x0, 0x1, 0x2, 0x3, 0x29, 0x2a, 0x2b, 0x2c, - 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x34, 0x35, - 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x52, 0x53, - 0x54, 0x55, 0x2c6, 0x2c7, 0x2c8, 0x2c9, 0x2ca -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 1488, .range_length = 27, .glyph_id_start = 96, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 1542, .range_length = 26, .glyph_id_start = 123, - .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 8, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - }, - { - .range_start = 1569, .range_length = 26, .glyph_id_start = 131, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 1600, .range_length = 22, .glyph_id_start = 157, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 1623, .range_length = 30, .glyph_id_start = 179, - .unicode_list = NULL, .glyph_id_ofs_list = glyph_id_ofs_list_5, .list_length = 30, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL - }, - { - .range_start = 1657, .range_length = 71, .glyph_id_start = 199, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 1734, .range_length = 61917, .glyph_id_start = 270, - .unicode_list = unicode_list_7, .glyph_id_ofs_list = NULL, .list_length = 78, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - }, - { - .range_start = 64338, .range_length = 82, .glyph_id_start = 348, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 64426, .range_length = 715, .glyph_id_start = 430, - .unicode_list = unicode_list_9, .glyph_id_ofs_list = NULL, .list_length = 31, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - }, - { - .range_start = 65142, .range_length = 135, .glyph_id_start = 461, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 65279, .range_length = 1, .glyph_id_start = 596, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - } -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = NULL, - .kern_scale = 0, - .cmap_num = 12, - .bpp = 4, - .kern_classes = 0, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_dejavu_16_persian_hebrew = { -#else -lv_font_t lv_font_dejavu_16_persian_hebrew = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 24, /*The maximum line height required by the font*/ - .base_line = 7, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -1, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_DEJAVU_16_PERSIAN_HEBREW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_fmt_txt.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_fmt_txt.c deleted file mode 100644 index 5d01304..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_fmt_txt.c +++ /dev/null @@ -1,555 +0,0 @@ -/** - * @file lv_font_fmt_txt.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_font.h" -#include "lv_font_fmt_txt_private.h" -#include "../core/lv_global.h" -#include "../misc/lv_assert.h" -#include "../misc/lv_types.h" -#include "../misc/lv_log.h" -#include "../misc/lv_utils.h" -#include "../stdlib/lv_mem.h" - -/********************* - * DEFINES - *********************/ -#if LV_USE_FONT_COMPRESSED - #define font_rle LV_GLOBAL_DEFAULT()->font_fmt_rle -#endif /*LV_USE_FONT_COMPRESSED*/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - uint32_t gid_left; - uint32_t gid_right; -} kern_pair_ref_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter); -static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t gid_right); -static int unicode_list_compare(const void * ref, const void * element); -static int kern_pair_8_compare(const void * ref, const void * element); -static int kern_pair_16_compare(const void * ref, const void * element); - -#if LV_USE_FONT_COMPRESSED - static void decompress(const uint8_t * in, uint8_t * out, int32_t w, int32_t h, uint8_t bpp, bool prefilter); - static inline void decompress_line(uint8_t * out, int32_t w); - static inline uint8_t get_bits(const uint8_t * in, uint32_t bit_pos, uint8_t len); - static inline void rle_init(const uint8_t * in, uint8_t bpp); - static inline uint8_t rle_next(void); -#endif /*LV_USE_FONT_COMPRESSED*/ - -/********************** - * STATIC VARIABLES - **********************/ - -static const uint8_t opa4_table[16] = {0, 17, 34, 51, - 68, 85, 102, 119, - 136, 153, 170, 187, - 204, 221, 238, 255 - }; - -#if LV_USE_FONT_COMPRESSED -static const uint8_t opa3_table[8] = {0, 36, 73, 109, 146, 182, 218, 255}; -#endif - -static const uint8_t opa2_table[4] = {0, 85, 170, 255}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -const void * lv_font_get_bitmap_fmt_txt(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf) -{ - const lv_font_t * font = g_dsc->resolved_font; - uint8_t * bitmap_out = draw_buf->data; - - lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; - uint32_t gid = g_dsc->gid.index; - if(!gid) return NULL; - - const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[gid]; - - int32_t gsize = (int32_t) gdsc->box_w * gdsc->box_h; - if(gsize == 0) return NULL; - - if(fdsc->bitmap_format == LV_FONT_FMT_TXT_PLAIN) { - const uint8_t * bitmap_in = &fdsc->glyph_bitmap[gdsc->bitmap_index]; - uint8_t * bitmap_out_tmp = bitmap_out; - int32_t i = 0; - int32_t x, y; - uint32_t stride = lv_draw_buf_width_to_stride(gdsc->box_w, LV_COLOR_FORMAT_A8); - - if(fdsc->bpp == 1) { - for(y = 0; y < gdsc->box_h; y ++) { - for(x = 0; x < gdsc->box_w; x++, i++) { - i = i & 0x7; - if(i == 0) bitmap_out_tmp[x] = (*bitmap_in) & 0x80 ? 0xff : 0x00; - else if(i == 1) bitmap_out_tmp[x] = (*bitmap_in) & 0x40 ? 0xff : 0x00; - else if(i == 2) bitmap_out_tmp[x] = (*bitmap_in) & 0x20 ? 0xff : 0x00; - else if(i == 3) bitmap_out_tmp[x] = (*bitmap_in) & 0x10 ? 0xff : 0x00; - else if(i == 4) bitmap_out_tmp[x] = (*bitmap_in) & 0x08 ? 0xff : 0x00; - else if(i == 5) bitmap_out_tmp[x] = (*bitmap_in) & 0x04 ? 0xff : 0x00; - else if(i == 6) bitmap_out_tmp[x] = (*bitmap_in) & 0x02 ? 0xff : 0x00; - else if(i == 7) { - bitmap_out_tmp[x] = (*bitmap_in) & 0x01 ? 0xff : 0x00; - bitmap_in++; - } - } - bitmap_out_tmp += stride; - } - } - else if(fdsc->bpp == 2) { - for(y = 0; y < gdsc->box_h; y ++) { - for(x = 0; x < gdsc->box_w; x++, i++) { - i = i & 0x3; - if(i == 0) bitmap_out_tmp[x] = opa2_table[(*bitmap_in) >> 6]; - else if(i == 1) bitmap_out_tmp[x] = opa2_table[((*bitmap_in) >> 4) & 0x3]; - else if(i == 2) bitmap_out_tmp[x] = opa2_table[((*bitmap_in) >> 2) & 0x3]; - else if(i == 3) { - bitmap_out_tmp[x] = opa2_table[((*bitmap_in) >> 0) & 0x3]; - bitmap_in++; - } - } - bitmap_out_tmp += stride; - } - - } - else if(fdsc->bpp == 4) { - for(y = 0; y < gdsc->box_h; y ++) { - for(x = 0; x < gdsc->box_w; x++, i++) { - i = i & 0x1; - if(i == 0) { - bitmap_out_tmp[x] = opa4_table[(*bitmap_in) >> 4]; - } - else if(i == 1) { - bitmap_out_tmp[x] = opa4_table[(*bitmap_in) & 0xF]; - bitmap_in++; - } - } - bitmap_out_tmp += stride; - } - } - return draw_buf; - } - /*Handle compressed bitmap*/ - else { -#if LV_USE_FONT_COMPRESSED - bool prefilter = fdsc->bitmap_format == LV_FONT_FMT_TXT_COMPRESSED; - decompress(&fdsc->glyph_bitmap[gdsc->bitmap_index], bitmap_out, gdsc->box_w, gdsc->box_h, - (uint8_t)fdsc->bpp, prefilter); - return draw_buf; -#else /*!LV_USE_FONT_COMPRESSED*/ - LV_LOG_WARN("Compressed fonts is used but LV_USE_FONT_COMPRESSED is not enabled in lv_conf.h"); - return NULL; -#endif - } - - /*If not returned earlier then the letter is not found in this font*/ - return NULL; -} - -bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, - uint32_t unicode_letter_next) -{ - /*It fixes a strange compiler optimization issue: https://github.com/lvgl/lvgl/issues/4370*/ - bool is_tab = unicode_letter == '\t'; - if(is_tab) { - unicode_letter = ' '; - } - lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; - uint32_t gid = get_glyph_dsc_id(font, unicode_letter); - if(!gid) return false; - - int8_t kvalue = 0; - if(fdsc->kern_dsc) { - uint32_t gid_next = get_glyph_dsc_id(font, unicode_letter_next); - if(gid_next) { - kvalue = get_kern_value(font, gid, gid_next); - } - } - - /*Put together a glyph dsc*/ - const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[gid]; - - int32_t kv = ((int32_t)((int32_t)kvalue * fdsc->kern_scale) >> 4); - - uint32_t adv_w = gdsc->adv_w; - if(is_tab) adv_w *= 2; - - adv_w += kv; - adv_w = (adv_w + (1 << 3)) >> 4; - - dsc_out->adv_w = adv_w; - dsc_out->box_h = gdsc->box_h; - dsc_out->box_w = gdsc->box_w; - dsc_out->ofs_x = gdsc->ofs_x; - dsc_out->ofs_y = gdsc->ofs_y; - dsc_out->format = (uint8_t)fdsc->bpp; - dsc_out->is_placeholder = false; - dsc_out->gid.index = gid; - - if(is_tab) dsc_out->box_w = dsc_out->box_w * 2; - - return true; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter) -{ - if(letter == '\0') return 0; - - lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; - - uint16_t i; - for(i = 0; i < fdsc->cmap_num; i++) { - - /*Relative code point*/ - uint32_t rcp = letter - fdsc->cmaps[i].range_start; - if(rcp >= fdsc->cmaps[i].range_length) continue; - uint32_t glyph_id = 0; - if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY) { - glyph_id = fdsc->cmaps[i].glyph_id_start + rcp; - } - else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL) { - const uint8_t * gid_ofs_8 = fdsc->cmaps[i].glyph_id_ofs_list; - glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_8[rcp]; - } - else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_TINY) { - uint16_t key = rcp; - uint16_t * p = lv_utils_bsearch(&key, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, - sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); - - if(p) { - lv_uintptr_t ofs = p - fdsc->cmaps[i].unicode_list; - glyph_id = fdsc->cmaps[i].glyph_id_start + (uint32_t) ofs; - } - } - else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_FULL) { - uint16_t key = rcp; - uint16_t * p = lv_utils_bsearch(&key, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, - sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); - - if(p) { - lv_uintptr_t ofs = p - fdsc->cmaps[i].unicode_list; - const uint16_t * gid_ofs_16 = fdsc->cmaps[i].glyph_id_ofs_list; - glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_16[ofs]; - } - } - - return glyph_id; - } - - return 0; - -} - -static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t gid_right) -{ - lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; - - int8_t value = 0; - - if(fdsc->kern_classes == 0) { - /*Kern pairs*/ - const lv_font_fmt_txt_kern_pair_t * kdsc = fdsc->kern_dsc; - if(kdsc->glyph_ids_size == 0) { - /*Use binary search to find the kern value. - *The pairs are ordered left_id first, then right_id secondly.*/ - const uint16_t * g_ids = kdsc->glyph_ids; - kern_pair_ref_t g_id_both = {gid_left, gid_right}; - uint16_t * kid_p = lv_utils_bsearch(&g_id_both, g_ids, kdsc->pair_cnt, 2, kern_pair_8_compare); - - /*If the `g_id_both` were found get its index from the pointer*/ - if(kid_p) { - lv_uintptr_t ofs = kid_p - g_ids; - value = kdsc->values[ofs]; - } - } - else if(kdsc->glyph_ids_size == 1) { - /*Use binary search to find the kern value. - *The pairs are ordered left_id first, then right_id secondly.*/ - const uint32_t * g_ids = kdsc->glyph_ids; - kern_pair_ref_t g_id_both = {gid_left, gid_right}; - uint32_t * kid_p = lv_utils_bsearch(&g_id_both, g_ids, kdsc->pair_cnt, 4, kern_pair_16_compare); - - /*If the `g_id_both` were found get its index from the pointer*/ - if(kid_p) { - lv_uintptr_t ofs = kid_p - g_ids; - value = kdsc->values[ofs]; - } - - } - else { - /*Invalid value*/ - } - } - else { - /*Kern classes*/ - const lv_font_fmt_txt_kern_classes_t * kdsc = fdsc->kern_dsc; - uint8_t left_class = kdsc->left_class_mapping[gid_left]; - uint8_t right_class = kdsc->right_class_mapping[gid_right]; - - /*If class = 0, kerning not exist for that glyph - *else got the value form `class_pair_values` 2D array*/ - if(left_class > 0 && right_class > 0) { - value = kdsc->class_pair_values[(left_class - 1) * kdsc->right_class_cnt + (right_class - 1)]; - } - - } - return value; -} - -static int kern_pair_8_compare(const void * ref, const void * element) -{ - const kern_pair_ref_t * ref8_p = ref; - const uint8_t * element8_p = element; - - /*If the MSB is different it will matter. If not return the diff. of the LSB*/ - if(ref8_p->gid_left != element8_p[0]) return ref8_p->gid_left - element8_p[0]; - else return ref8_p->gid_right - element8_p[1]; -} - -static int kern_pair_16_compare(const void * ref, const void * element) -{ - const kern_pair_ref_t * ref16_p = ref; - const uint16_t * element16_p = element; - - /*If the MSB is different it will matter. If not return the diff. of the LSB*/ - if(ref16_p->gid_left != element16_p[0]) return ref16_p->gid_left - element16_p[0]; - else return ref16_p->gid_right - element16_p[1]; -} - -#if LV_USE_FONT_COMPRESSED - -/** - * The compress a glyph's bitmap - * @param in the compressed bitmap - * @param out buffer to store the result - * @param px_num number of pixels in the glyph (width * height) - * @param bpp bit per pixel (bpp = 3 will be converted to bpp = 4) - * @param prefilter true: the lines are XORed - */ -static void decompress(const uint8_t * in, uint8_t * out, int32_t w, int32_t h, uint8_t bpp, bool prefilter) -{ - const lv_opa_t * opa_table; - switch(bpp) { - case 2: - opa_table = opa2_table; - break; - case 3: - opa_table = opa3_table; - break; - case 4: - opa_table = opa4_table; - break; - default: - LV_LOG_WARN("%d bpp is not handled", bpp); - return; - } - - rle_init(in, bpp); - - uint8_t * line_buf1 = lv_malloc(w); - - uint8_t * line_buf2 = NULL; - - if(prefilter) { - line_buf2 = lv_malloc(w); - } - - decompress_line(line_buf1, w); - - int32_t y; - int32_t x; - uint32_t stride = lv_draw_buf_width_to_stride(w, LV_COLOR_FORMAT_A8); - - for(x = 0; x < w; x++) { - out[x] = opa_table[line_buf1[x]]; - } - out += stride; - - for(y = 1; y < h; y++) { - if(prefilter) { - decompress_line(line_buf2, w); - - for(x = 0; x < w; x++) { - line_buf1[x] = line_buf2[x] ^ line_buf1[x]; - out[x] = opa_table[line_buf1[x]]; - } - } - else { - decompress_line(line_buf1, w); - - for(x = 0; x < w; x++) { - out[x] = opa_table[line_buf1[x]]; - } - } - out += stride; - } - - lv_free(line_buf1); - lv_free(line_buf2); -} - -/** - * Decompress one line. Store one pixel per byte - * @param out output buffer - * @param w width of the line in pixel count - */ -static inline void decompress_line(uint8_t * out, int32_t w) -{ - int32_t i; - for(i = 0; i < w; i++) { - out[i] = rle_next(); - } -} - -/** - * Read bits from an input buffer. The read can cross byte boundary. - * @param in the input buffer to read from. - * @param bit_pos index of the first bit to read. - * @param len number of bits to read (must be <= 8). - * @return the read bits - */ -static inline uint8_t get_bits(const uint8_t * in, uint32_t bit_pos, uint8_t len) -{ - uint8_t bit_mask; - switch(len) { - case 1: - bit_mask = 0x1; - break; - case 2: - bit_mask = 0x3; - break; - case 3: - bit_mask = 0x7; - break; - case 4: - bit_mask = 0xF; - break; - case 8: - bit_mask = 0xFF; - break; - default: - bit_mask = (uint16_t)((uint16_t) 1 << len) - 1; - } - - uint32_t byte_pos = bit_pos >> 3; - bit_pos = bit_pos & 0x7; - - if(bit_pos + len >= 8) { - uint16_t in16 = (in[byte_pos] << 8) + in[byte_pos + 1]; - return (in16 >> (16 - bit_pos - len)) & bit_mask; - } - else { - return (in[byte_pos] >> (8 - bit_pos - len)) & bit_mask; - } -} - -static inline void rle_init(const uint8_t * in, uint8_t bpp) -{ - lv_font_fmt_rle_t * rle = &font_rle; - rle->in = in; - rle->bpp = bpp; - rle->state = RLE_STATE_SINGLE; - rle->rdp = 0; - rle->prev_v = 0; - rle->count = 0; -} - -static inline uint8_t rle_next(void) -{ - uint8_t v = 0; - uint8_t ret = 0; - lv_font_fmt_rle_t * rle = &font_rle; - - if(rle->state == RLE_STATE_SINGLE) { - ret = get_bits(rle->in, rle->rdp, rle->bpp); - if(rle->rdp != 0 && rle->prev_v == ret) { - rle->count = 0; - rle->state = RLE_STATE_REPEATED; - } - - rle->prev_v = ret; - rle->rdp += rle->bpp; - } - else if(rle->state == RLE_STATE_REPEATED) { - v = get_bits(rle->in, rle->rdp, 1); - rle->count++; - rle->rdp += 1; - if(v == 1) { - ret = rle->prev_v; - if(rle->count == 11) { - rle->count = get_bits(rle->in, rle->rdp, 6); - rle->rdp += 6; - if(rle->count != 0) { - rle->state = RLE_STATE_COUNTER; - } - else { - ret = get_bits(rle->in, rle->rdp, rle->bpp); - rle->prev_v = ret; - rle->rdp += rle->bpp; - rle->state = RLE_STATE_SINGLE; - } - } - } - else { - ret = get_bits(rle->in, rle->rdp, rle->bpp); - rle->prev_v = ret; - rle->rdp += rle->bpp; - rle->state = RLE_STATE_SINGLE; - } - - } - else if(rle->state == RLE_STATE_COUNTER) { - ret = rle->prev_v; - rle->count--; - if(rle->count == 0) { - ret = get_bits(rle->in, rle->rdp, rle->bpp); - rle->prev_v = ret; - rle->rdp += rle->bpp; - rle->state = RLE_STATE_SINGLE; - } - } - - return ret; -} -#endif /*LV_USE_FONT_COMPRESSED*/ - -/** Code Comparator. - * - * Compares the value of both input arguments. - * - * @param[in] pRef Pointer to the reference. - * @param[in] pElement Pointer to the element to compare. - * - * @return Result of comparison. - * @retval < 0 Reference is less than element. - * @retval = 0 Reference is equal to element. - * @retval > 0 Reference is greater than element. - * - */ -static int unicode_list_compare(const void * ref, const void * element) -{ - return (*(uint16_t *)ref) - (*(uint16_t *)element); -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_fmt_txt.h b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_fmt_txt.h deleted file mode 100644 index 4eeb0c6..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_fmt_txt.h +++ /dev/null @@ -1,224 +0,0 @@ -/** - * @file lv_font_fmt_txt.h - * - */ - -#ifndef LV_FONT_FMT_TXT_H -#define LV_FONT_FMT_TXT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_font.h" -#include "../misc/lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** This describes a glyph.*/ -typedef struct { -#if LV_FONT_FMT_TXT_LARGE == 0 - uint32_t bitmap_index : 20; /**< Start index of the bitmap. A font can be max 1 MB.*/ - uint32_t adv_w : 12; /**< Draw the next glyph after this width. 8.4 format (real_value * 16 is stored).*/ - uint8_t box_w; /**< Width of the glyph's bounding box*/ - uint8_t box_h; /**< Height of the glyph's bounding box*/ - int8_t ofs_x; /**< x offset of the bounding box*/ - int8_t ofs_y; /**< y offset of the bounding box. Measured from the top of the line*/ -#else - uint32_t bitmap_index; /**< Start index of the bitmap. A font can be max 4 GB.*/ - uint32_t adv_w; /**< Draw the next glyph after this width. 28.4 format (real_value * 16 is stored).*/ - uint16_t box_w; /**< Width of the glyph's bounding box*/ - uint16_t box_h; /**< Height of the glyph's bounding box*/ - int16_t ofs_x; /**< x offset of the bounding box*/ - int16_t ofs_y; /**< y offset of the bounding box. Measured from the top of the line*/ -#endif -} lv_font_fmt_txt_glyph_dsc_t; - -/** Format of font character map.*/ -typedef enum { - LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL, - LV_FONT_FMT_TXT_CMAP_SPARSE_FULL, - LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY, - LV_FONT_FMT_TXT_CMAP_SPARSE_TINY, -} lv_font_fmt_txt_cmap_type_t; - -/** - * Map codepoints to a `glyph_dsc`s - * Several formats are supported to optimize memory usage - * See https://github.com/lvgl/lv_font_conv/blob/master/doc/font_spec.md - */ -typedef struct { - /** First Unicode character for this range*/ - uint32_t range_start; - - /** Number of Unicode characters related to this range. - * Last Unicode character = range_start + range_length - 1*/ - uint16_t range_length; - - /** First glyph ID (array index of `glyph_dsc`) for this range*/ - uint16_t glyph_id_start; - - /* - According the specification there are 4 formats: - https://github.com/lvgl/lv_font_conv/blob/master/doc/font_spec.md - - For simplicity introduce "relative code point": - rcp = codepoint - range_start - - and a search function: - search a "value" in an "array" and returns the index of "value". - - Format 0 tiny - unicode_list == NULL && glyph_id_ofs_list == NULL - glyph_id = glyph_id_start + rcp - - Format 0 full - unicode_list == NULL && glyph_id_ofs_list != NULL - glyph_id = glyph_id_start + glyph_id_ofs_list[rcp] - - Sparse tiny - unicode_list != NULL && glyph_id_ofs_list == NULL - glyph_id = glyph_id_start + search(unicode_list, rcp) - - Sparse full - unicode_list != NULL && glyph_id_ofs_list != NULL - glyph_id = glyph_id_start + glyph_id_ofs_list[search(unicode_list, rcp)] - */ - - const uint16_t * unicode_list; - - /** if(type == LV_FONT_FMT_TXT_CMAP_FORMAT0_...) it's `uint8_t *` - * if(type == LV_FONT_FMT_TXT_CMAP_SPARSE_...) it's `uint16_t *` - */ - const void * glyph_id_ofs_list; - - /** Length of `unicode_list` and/or `glyph_id_ofs_list`*/ - uint16_t list_length; - - /** Type of this character map*/ - lv_font_fmt_txt_cmap_type_t type; -} lv_font_fmt_txt_cmap_t; - -/** A simple mapping of kern values from pairs*/ -typedef struct { - /*To get a kern value of two code points: - 1. Get the `glyph_id_left` and `glyph_id_right` from `lv_font_fmt_txt_cmap_t - 2. for(i = 0; i < pair_cnt * 2; i += 2) - if(glyph_ids[i] == glyph_id_left && - glyph_ids[i+1] == glyph_id_right) - return values[i / 2]; - */ - const void * glyph_ids; - const int8_t * values; - uint32_t pair_cnt : 30; - uint32_t glyph_ids_size : 2; /**< 0: `glyph_ids` is stored as `uint8_t`; 1: as `uint16_t` */ -} lv_font_fmt_txt_kern_pair_t; - -/** More complex but more optimal class based kern value storage*/ -typedef struct { - /*To get a kern value of two code points: - 1. Get the `glyph_id_left` and `glyph_id_right` from `lv_font_fmt_txt_cmap_t - 2. Get the class of the left and right glyphs as `left_class` and `right_class` - left_class = left_class_mapping[glyph_id_left]; - right_class = right_class_mapping[glyph_id_right]; - 3. value = class_pair_values[(left_class-1)*right_class_cnt + (right_class-1)] - */ - - const int8_t * class_pair_values; /**< left_class_cnt * right_class_cnt value */ - const uint8_t * left_class_mapping; /**< Map the glyph_ids to classes: index -> glyph_id -> class_id */ - const uint8_t * right_class_mapping; /**< Map the glyph_ids to classes: index -> glyph_id -> class_id */ - uint8_t left_class_cnt; - uint8_t right_class_cnt; -} lv_font_fmt_txt_kern_classes_t; - -/** Bitmap formats*/ -typedef enum { - LV_FONT_FMT_TXT_PLAIN = 0, - LV_FONT_FMT_TXT_COMPRESSED = 1, - LV_FONT_FMT_TXT_COMPRESSED_NO_PREFILTER = 1, -} lv_font_fmt_txt_bitmap_format_t; - -/** Describe store for additional data for fonts */ -typedef struct { - /** The bitmaps of all glyphs */ - const uint8_t * glyph_bitmap; - - /** Describe the glyphs */ - const lv_font_fmt_txt_glyph_dsc_t * glyph_dsc; - - /** Map the glyphs to Unicode characters. - *Array of `lv_font_cmap_fmt_txt_t` variables */ - const lv_font_fmt_txt_cmap_t * cmaps; - - /** - * Store kerning values. - * Can be `lv_font_fmt_txt_kern_pair_t * or `lv_font_kern_classes_fmt_txt_t *` - * depending on `kern_classes` - */ - const void * kern_dsc; - - /** Scale kern values in 12.4 format */ - uint16_t kern_scale; - - /** Number of cmap tables */ - uint16_t cmap_num : 9; - - /** Bit per pixel: 1, 2, 3, 4, 8 */ - uint16_t bpp : 4; - - /** Type of `kern_dsc` */ - uint16_t kern_classes : 1; - - /** - * storage format of the bitmap - * from `lv_font_fmt_txt_bitmap_format_t` - */ - uint16_t bitmap_format : 2; -} lv_font_fmt_txt_dsc_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Used as `get_glyph_bitmap` callback in lvgl's native font format if the font is uncompressed. - * @param g_dsc the glyph descriptor including which font to use, which supply the glyph_index and format. - * @param draw_buf a draw buffer that can be used to store the bitmap of the glyph, it's OK not to use it. - * @return pointer to an A8 bitmap (not necessarily bitmap_out) or NULL if `unicode_letter` not found - */ -const void * lv_font_get_bitmap_fmt_txt(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf); - -/** - * Used as `get_glyph_dsc` callback in lvgl's native font format if the font is uncompressed. - * @param font pointer to font - * @param dsc_out store the result descriptor here - * @param unicode_letter a UNICODE letter code - * @param unicode_letter_next the unicode letter succeeding the letter under test - * @return true: descriptor is successfully loaded into `dsc_out`. - * false: the letter was not found, no data is loaded to `dsc_out` - */ -bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, - uint32_t unicode_letter_next); - -/********************** - * MACROS - **********************/ - -/********************** - * ADD BUILT IN FONTS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_FONT_FMT_TXT_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_fmt_txt_private.h b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_fmt_txt_private.h deleted file mode 100644 index 66df402..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_fmt_txt_private.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @file lv_font_fmt_txt_private.h - * - */ - -#ifndef LV_FONT_FMT_TXT_PRIVATE_H -#define LV_FONT_FMT_TXT_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_font_fmt_txt.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -#if LV_USE_FONT_COMPRESSED -typedef enum { - RLE_STATE_SINGLE = 0, - RLE_STATE_REPEATED, - RLE_STATE_COUNTER, -} lv_font_fmt_rle_state_t; - -typedef struct { - uint32_t rdp; - const uint8_t * in; - uint8_t bpp; - uint8_t prev_v; - uint8_t count; - lv_font_fmt_rle_state_t state; -} lv_font_fmt_rle_t; -#endif - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_FONT_FMT_TXT_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_10.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_10.c deleted file mode 100644 index 80fe261..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_10.c +++ /dev/null @@ -1,1654 +0,0 @@ -/******************************************************************************* - * Size: 10 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 10 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_10.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_10 - #define LV_FONT_MONTSERRAT_10 1 -#endif - -#if LV_FONT_MONTSERRAT_10 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x3e, 0x2d, 0x2c, 0x1c, 0x5, 0x1, 0x2d, - - /* U+0022 "\"" */ - 0x57, 0x84, 0x56, 0x83, 0x23, 0x41, - - /* U+0023 "#" */ - 0x0, 0xb0, 0x28, 0x0, 0xb, 0x4, 0x60, 0x4a, - 0xea, 0xdc, 0x80, 0x28, 0x8, 0x20, 0x8c, 0xdb, - 0xeb, 0x40, 0x64, 0xb, 0x0, 0x8, 0x30, 0xb0, - 0x0, - - /* U+0024 "$" */ - 0x0, 0x13, 0x0, 0x8, 0xde, 0xc3, 0x5b, 0x27, - 0x11, 0x4d, 0x57, 0x0, 0x6, 0xce, 0x80, 0x0, - 0x29, 0x9a, 0x32, 0x27, 0x5b, 0x3c, 0xde, 0xb2, - 0x0, 0x27, 0x0, - - /* U+0025 "%" */ - 0x29, 0x92, 0x2, 0x90, 0x9, 0x11, 0x90, 0xa1, - 0x0, 0x82, 0x28, 0x74, 0x0, 0x1, 0x88, 0x49, - 0x68, 0x40, 0x0, 0xb, 0x29, 0xa, 0x0, 0x8, - 0x32, 0x80, 0xa0, 0x3, 0x80, 0x8, 0x87, 0x0, - - /* U+0026 "&" */ - 0x3, 0xcb, 0x70, 0x0, 0xa4, 0xd, 0x0, 0x5, - 0xba, 0x60, 0x0, 0x7c, 0xc0, 0x10, 0x5a, 0x7, - 0xbb, 0x37, 0x80, 0xa, 0xe0, 0xa, 0xcc, 0x97, - 0x70, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0x57, 0x56, 0x23, - - /* U+0028 "(" */ - 0x2, 0xc0, 0x9, 0x60, 0xd, 0x10, 0xe, 0x0, - 0xe, 0x0, 0xe, 0x0, 0xd, 0x10, 0x9, 0x60, - 0x2, 0xc0, - - /* U+0029 ")" */ - 0x68, 0x0, 0xe0, 0xb, 0x30, 0x95, 0x8, 0x60, - 0x95, 0xb, 0x30, 0xe0, 0x68, 0x0, - - /* U+002A "*" */ - 0x24, 0x42, 0x4d, 0xd4, 0x79, 0x97, 0x2, 0x20, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x0, 0x85, 0x0, 0x3b, 0xdc, - 0xb1, 0x0, 0x85, 0x0, 0x0, 0x85, 0x0, - - /* U+002C "," */ - 0x35, 0x4a, 0x55, - - /* U+002D "-" */ - 0x5c, 0xc3, - - /* U+002E "." */ - 0x2, 0x6a, - - /* U+002F "/" */ - 0x0, 0x2, 0xb0, 0x0, 0x85, 0x0, 0xd, 0x0, - 0x4, 0x90, 0x0, 0xa3, 0x0, 0xd, 0x0, 0x5, - 0x80, 0x0, 0xb2, 0x0, 0x1c, 0x0, 0x0, - - /* U+0030 "0" */ - 0x4, 0xdd, 0xb1, 0x1, 0xe2, 0x6, 0xb0, 0x69, - 0x0, 0xe, 0x17, 0x80, 0x0, 0xd2, 0x69, 0x0, - 0xe, 0x11, 0xe2, 0x6, 0xb0, 0x4, 0xdd, 0xb1, - 0x0, - - /* U+0031 "1" */ - 0xbe, 0xa0, 0x5a, 0x5, 0xa0, 0x5a, 0x5, 0xa0, - 0x5a, 0x5, 0xa0, - - /* U+0032 "2" */ - 0x4c, 0xdd, 0x50, 0x42, 0x1, 0xf0, 0x0, 0x0, - 0xf0, 0x0, 0xa, 0x80, 0x0, 0xa9, 0x0, 0xb, - 0x80, 0x0, 0x8f, 0xdd, 0xd5, - - /* U+0033 "3" */ - 0x8d, 0xde, 0xe0, 0x0, 0xc, 0x40, 0x0, 0x98, - 0x0, 0x0, 0xbd, 0x90, 0x0, 0x0, 0xd3, 0x51, - 0x1, 0xe2, 0x6d, 0xdd, 0x60, - - /* U+0034 "4" */ - 0x0, 0x7, 0xa0, 0x0, 0x5, 0xc0, 0x0, 0x3, - 0xd1, 0x31, 0x1, 0xd2, 0xb, 0x30, 0x8d, 0xcc, - 0xfd, 0x70, 0x0, 0xb, 0x30, 0x0, 0x0, 0xb3, - 0x0, - - /* U+0035 "5" */ - 0xf, 0xdd, 0xd0, 0x1d, 0x0, 0x0, 0x2c, 0x0, - 0x0, 0x3e, 0xdc, 0x60, 0x0, 0x1, 0xd4, 0x31, - 0x0, 0xc4, 0x5c, 0xdd, 0x80, - - /* U+0036 "6" */ - 0x2, 0xbd, 0xd4, 0x1e, 0x40, 0x0, 0x6a, 0x0, - 0x0, 0x7a, 0xab, 0xa1, 0x6e, 0x10, 0x5c, 0x1d, - 0x0, 0x3c, 0x4, 0xcc, 0xb2, - - /* U+0037 "7" */ - 0xbd, 0xdd, 0xe8, 0xb4, 0x0, 0xd3, 0x0, 0x4, - 0xc0, 0x0, 0xc, 0x40, 0x0, 0x3d, 0x0, 0x0, - 0xa6, 0x0, 0x1, 0xe0, 0x0, - - /* U+0038 "8" */ - 0x7, 0xcc, 0xb2, 0x3d, 0x0, 0x6a, 0x2d, 0x0, - 0x79, 0xb, 0xec, 0xf2, 0x6a, 0x0, 0x4d, 0x79, - 0x0, 0x3e, 0x9, 0xcb, 0xc4, - - /* U+0039 "9" */ - 0x1a, 0xcc, 0x60, 0x96, 0x0, 0xb3, 0x97, 0x0, - 0xc9, 0x9, 0xbb, 0x8a, 0x0, 0x0, 0x88, 0x0, - 0x2, 0xe2, 0x2d, 0xdc, 0x40, - - /* U+003A ":" */ - 0x6a, 0x1, 0x0, 0x2, 0x6a, - - /* U+003B ";" */ - 0x6a, 0x1, 0x0, 0x0, 0x6a, 0x38, 0x32, - - /* U+003C "<" */ - 0x0, 0x0, 0x10, 0x0, 0x5a, 0xa1, 0x3e, 0x61, - 0x0, 0x6, 0xb9, 0x30, 0x0, 0x2, 0x81, - - /* U+003D "=" */ - 0x3b, 0xbb, 0xb1, 0x0, 0x0, 0x0, 0x3b, 0xbb, - 0xb1, - - /* U+003E ">" */ - 0x10, 0x0, 0x0, 0x2b, 0xa4, 0x0, 0x0, 0x18, - 0xe1, 0x4, 0xab, 0x50, 0x37, 0x10, 0x0, - - /* U+003F "?" */ - 0x3c, 0xdd, 0x50, 0x52, 0x1, 0xf0, 0x0, 0x3, - 0xd0, 0x0, 0x3d, 0x20, 0x0, 0x85, 0x0, 0x0, - 0x10, 0x0, 0x0, 0xb4, 0x0, - - /* U+0040 "@" */ - 0x0, 0x4a, 0x99, 0xa7, 0x0, 0x6, 0x90, 0x0, - 0x3, 0xa0, 0x1b, 0x7, 0xcb, 0x9b, 0x47, 0x65, - 0x4b, 0x0, 0x8b, 0xa, 0x73, 0x77, 0x0, 0x3b, - 0xa, 0x65, 0x3b, 0x0, 0x8b, 0xa, 0x1b, 0x6, - 0xcb, 0x6c, 0xb3, 0x6, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x4a, 0x9a, 0xa2, 0x0, - - /* U+0041 "A" */ - 0x0, 0x1, 0xf6, 0x0, 0x0, 0x0, 0x88, 0xc0, - 0x0, 0x0, 0xd, 0x9, 0x40, 0x0, 0x6, 0x70, - 0x2b, 0x0, 0x0, 0xdc, 0xcc, 0xe3, 0x0, 0x59, - 0x0, 0x4, 0xa0, 0xc, 0x30, 0x0, 0xd, 0x10, - - /* U+0042 "B" */ - 0xfc, 0xcc, 0xb2, 0xf, 0x0, 0x7, 0xa0, 0xf0, - 0x0, 0x88, 0xf, 0xcc, 0xdf, 0x30, 0xf0, 0x0, - 0x2e, 0xf, 0x0, 0x1, 0xf0, 0xfc, 0xcc, 0xc5, - 0x0, - - /* U+0043 "C" */ - 0x1, 0x9d, 0xdc, 0x30, 0xd6, 0x0, 0x35, 0x5b, - 0x0, 0x0, 0x7, 0x80, 0x0, 0x0, 0x5b, 0x0, - 0x0, 0x0, 0xd6, 0x0, 0x35, 0x1, 0x9d, 0xdc, - 0x30, - - /* U+0044 "D" */ - 0xfd, 0xdd, 0xb3, 0xf, 0x0, 0x3, 0xe2, 0xf0, - 0x0, 0x6, 0x9f, 0x0, 0x0, 0x4b, 0xf0, 0x0, - 0x6, 0x9f, 0x0, 0x3, 0xe2, 0xfd, 0xdd, 0xb3, - 0x0, - - /* U+0045 "E" */ - 0xfd, 0xdd, 0xc0, 0xf0, 0x0, 0x0, 0xf0, 0x0, - 0x0, 0xfc, 0xcc, 0x70, 0xf0, 0x0, 0x0, 0xf0, - 0x0, 0x0, 0xfd, 0xdd, 0xd1, - - /* U+0046 "F" */ - 0xfd, 0xdd, 0xcf, 0x0, 0x0, 0xf0, 0x0, 0xf, - 0xdd, 0xd7, 0xf0, 0x0, 0xf, 0x0, 0x0, 0xf0, - 0x0, 0x0, - - /* U+0047 "G" */ - 0x1, 0x9d, 0xdc, 0x40, 0xd7, 0x0, 0x25, 0x5b, - 0x0, 0x0, 0x7, 0x80, 0x0, 0x7, 0x5b, 0x0, - 0x1, 0xd0, 0xd6, 0x0, 0x3d, 0x1, 0x9d, 0xdc, - 0x50, - - /* U+0048 "H" */ - 0xf0, 0x0, 0xf, 0x1f, 0x0, 0x0, 0xf1, 0xf0, - 0x0, 0xf, 0x1f, 0xdd, 0xdd, 0xf1, 0xf0, 0x0, - 0xf, 0x1f, 0x0, 0x0, 0xf1, 0xf0, 0x0, 0xf, - 0x10, - - /* U+0049 "I" */ - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - - /* U+004A "J" */ - 0x4, 0xdd, 0xf2, 0x0, 0x0, 0xd2, 0x0, 0x0, - 0xd2, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xd2, 0x6, - 0x1, 0xe0, 0x8, 0xdd, 0x60, - - /* U+004B "K" */ - 0xf0, 0x0, 0xa8, 0xf, 0x0, 0x99, 0x0, 0xf0, - 0x99, 0x0, 0xf, 0x9f, 0x40, 0x0, 0xfb, 0x4e, - 0x20, 0xf, 0x10, 0x5d, 0x10, 0xf0, 0x0, 0x6b, - 0x0, - - /* U+004C "L" */ - 0xf0, 0x0, 0xf, 0x0, 0x0, 0xf0, 0x0, 0xf, - 0x0, 0x0, 0xf0, 0x0, 0xf, 0x0, 0x0, 0xfd, - 0xdd, 0xa0, - - /* U+004D "M" */ - 0xf2, 0x0, 0x0, 0x97, 0xfc, 0x0, 0x3, 0xf7, - 0xfa, 0x50, 0xc, 0xa7, 0xf1, 0xd0, 0x69, 0x77, - 0xf0, 0x79, 0xd1, 0x77, 0xf0, 0xd, 0x60, 0x77, - 0xf0, 0x1, 0x0, 0x77, - - /* U+004E "N" */ - 0xf4, 0x0, 0xf, 0x1f, 0xe2, 0x0, 0xf1, 0xf6, - 0xd0, 0xf, 0x1f, 0x9, 0xa0, 0xf1, 0xf0, 0xb, - 0x7f, 0x1f, 0x0, 0x1d, 0xf1, 0xf0, 0x0, 0x3f, - 0x10, - - /* U+004F "O" */ - 0x1, 0x9d, 0xdc, 0x40, 0xd, 0x60, 0x2, 0xd4, - 0x5b, 0x0, 0x0, 0x4b, 0x78, 0x0, 0x0, 0x1e, - 0x5b, 0x0, 0x0, 0x4b, 0xd, 0x60, 0x2, 0xd4, - 0x1, 0x9d, 0xdc, 0x40, - - /* U+0050 "P" */ - 0xfd, 0xdd, 0x90, 0xf0, 0x0, 0xa7, 0xf0, 0x0, - 0x5a, 0xf0, 0x0, 0xb6, 0xfd, 0xdc, 0x70, 0xf0, - 0x0, 0x0, 0xf0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x1, 0x9d, 0xdc, 0x40, 0x0, 0xc7, 0x0, 0x3d, - 0x40, 0x5b, 0x0, 0x0, 0x4b, 0x7, 0x80, 0x0, - 0x1, 0xe0, 0x5a, 0x0, 0x0, 0x4c, 0x0, 0xd6, - 0x0, 0x2d, 0x40, 0x1, 0xad, 0xdd, 0x40, 0x0, - 0x0, 0x4, 0xab, 0xa0, - - /* U+0052 "R" */ - 0xfd, 0xdd, 0x90, 0xf0, 0x0, 0xa7, 0xf0, 0x0, - 0x5a, 0xf0, 0x0, 0xb7, 0xfc, 0xcf, 0x90, 0xf0, - 0x5, 0xb0, 0xf0, 0x0, 0x97, - - /* U+0053 "S" */ - 0x8, 0xdc, 0xc3, 0x5b, 0x0, 0x11, 0x4d, 0x20, - 0x0, 0x6, 0xde, 0x90, 0x0, 0x1, 0x9a, 0x33, - 0x0, 0x5b, 0x3b, 0xcc, 0xb2, - - /* U+0054 "T" */ - 0xcd, 0xee, 0xda, 0x0, 0x97, 0x0, 0x0, 0x97, - 0x0, 0x0, 0x97, 0x0, 0x0, 0x97, 0x0, 0x0, - 0x97, 0x0, 0x0, 0x97, 0x0, - - /* U+0055 "U" */ - 0xf, 0x0, 0x1, 0xe0, 0xf0, 0x0, 0x1e, 0xf, - 0x0, 0x1, 0xe0, 0xf0, 0x0, 0x1e, 0xe, 0x0, - 0x2, 0xd0, 0xa7, 0x0, 0x98, 0x1, 0xad, 0xd9, - 0x0, - - /* U+0056 "V" */ - 0xc, 0x40, 0x0, 0x1d, 0x0, 0x5b, 0x0, 0x8, - 0x70, 0x0, 0xe2, 0x0, 0xe1, 0x0, 0x7, 0x90, - 0x69, 0x0, 0x0, 0x1e, 0x1d, 0x20, 0x0, 0x0, - 0x9c, 0xb0, 0x0, 0x0, 0x2, 0xf4, 0x0, 0x0, - - /* U+0057 "W" */ - 0x88, 0x0, 0xf, 0x40, 0x2, 0xc3, 0xd0, 0x5, - 0xea, 0x0, 0x86, 0xd, 0x20, 0xa4, 0xe0, 0xd, - 0x10, 0x88, 0xd, 0xa, 0x43, 0xc0, 0x2, 0xd5, - 0x90, 0x4a, 0x86, 0x0, 0xd, 0xd3, 0x0, 0xed, - 0x10, 0x0, 0x8e, 0x0, 0xa, 0xc0, 0x0, - - /* U+0058 "X" */ - 0x5c, 0x0, 0x1d, 0x10, 0x98, 0xb, 0x50, 0x0, - 0xda, 0x90, 0x0, 0x6, 0xf2, 0x0, 0x1, 0xd7, - 0xc0, 0x0, 0xc5, 0xa, 0x80, 0x8a, 0x0, 0xd, - 0x30, - - /* U+0059 "Y" */ - 0xb, 0x50, 0x0, 0xc3, 0x2, 0xd0, 0x6, 0x90, - 0x0, 0x88, 0x1d, 0x10, 0x0, 0xd, 0xb6, 0x0, - 0x0, 0x5, 0xd0, 0x0, 0x0, 0x4, 0xb0, 0x0, - 0x0, 0x4, 0xb0, 0x0, - - /* U+005A "Z" */ - 0x6d, 0xdd, 0xdf, 0x10, 0x0, 0xb, 0x70, 0x0, - 0x8, 0xa0, 0x0, 0x4, 0xd0, 0x0, 0x2, 0xe2, - 0x0, 0x0, 0xd4, 0x0, 0x0, 0x8f, 0xdd, 0xdd, - 0x30, - - /* U+005B "[" */ - 0xfb, 0x1f, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, - 0x0, 0xf0, 0xf, 0x0, 0xfb, 0x10, - - /* U+005C "\\" */ - 0x3a, 0x0, 0x0, 0xc1, 0x0, 0x7, 0x60, 0x0, - 0x1c, 0x0, 0x0, 0xb2, 0x0, 0x5, 0x80, 0x0, - 0xd, 0x0, 0x0, 0xa3, 0x0, 0x4, 0x90, - - /* U+005D "]" */ - 0x9e, 0x40, 0xb4, 0xb, 0x40, 0xb4, 0xb, 0x40, - 0xb4, 0xb, 0x40, 0xb4, 0x9e, 0x40, - - /* U+005E "^" */ - 0x0, 0xa8, 0x0, 0x2, 0x9b, 0x0, 0x9, 0x25, - 0x60, 0x1b, 0x0, 0xb0, - - /* U+005F "_" */ - 0x99, 0x99, 0x90, - - /* U+0060 "`" */ - 0x3a, 0x30, - - /* U+0061 "a" */ - 0x1b, 0xcd, 0x60, 0x1, 0x0, 0xe0, 0x1a, 0xaa, - 0xf1, 0x78, 0x0, 0xe1, 0x2c, 0xaa, 0xe1, - - /* U+0062 "b" */ - 0x1e, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x1e, - 0xac, 0xd6, 0x1, 0xf3, 0x1, 0xe2, 0x1e, 0x0, - 0xa, 0x51, 0xf4, 0x1, 0xe2, 0x1d, 0x9c, 0xd5, - 0x0, - - /* U+0063 "c" */ - 0x7, 0xdd, 0xa0, 0x5c, 0x0, 0x40, 0x87, 0x0, - 0x0, 0x5c, 0x0, 0x41, 0x7, 0xdd, 0xa0, - - /* U+0064 "d" */ - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x8, 0xdc, - 0x9e, 0x5c, 0x0, 0x7e, 0x87, 0x0, 0x1e, 0x5b, - 0x0, 0x6e, 0x8, 0xdb, 0x8e, - - /* U+0065 "e" */ - 0x8, 0xcc, 0x90, 0x5a, 0x0, 0x87, 0x8c, 0xaa, - 0xa8, 0x5b, 0x0, 0x20, 0x7, 0xdc, 0xb1, - - /* U+0066 "f" */ - 0x7, 0xc9, 0xe, 0x0, 0x9f, 0xb6, 0xf, 0x0, - 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, - - /* U+0067 "g" */ - 0x8, 0xdc, 0x9e, 0x5b, 0x0, 0x5f, 0x87, 0x0, - 0xf, 0x5c, 0x0, 0x6f, 0x7, 0xdc, 0x9f, 0x3, - 0x0, 0x4c, 0x1a, 0xcc, 0xb2, - - /* U+0068 "h" */ - 0x1e, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x1e, 0xac, - 0xd4, 0x1f, 0x30, 0x3d, 0x1e, 0x0, 0xe, 0x1e, - 0x0, 0xf, 0x1e, 0x0, 0xf, - - /* U+0069 "i" */ - 0x2d, 0x0, 0x10, 0x1e, 0x1, 0xe0, 0x1e, 0x1, - 0xe0, 0x1e, 0x0, - - /* U+006A "j" */ - 0x1, 0xe0, 0x0, 0x10, 0x0, 0xe0, 0x0, 0xe0, - 0x0, 0xe0, 0x0, 0xe0, 0x0, 0xe0, 0x1, 0xe0, - 0xad, 0x60, - - /* U+006B "k" */ - 0x1e, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x1e, - 0x1, 0xb6, 0x1, 0xe2, 0xd5, 0x0, 0x1f, 0xde, - 0x20, 0x1, 0xf2, 0x5d, 0x0, 0x1e, 0x0, 0x7b, - 0x0, - - /* U+006C "l" */ - 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, - - /* U+006D "m" */ - 0x1e, 0xab, 0xc5, 0xbb, 0xc2, 0x1f, 0x20, 0x5f, - 0x10, 0x69, 0x1e, 0x0, 0x2c, 0x0, 0x4b, 0x1e, - 0x0, 0x2c, 0x0, 0x4b, 0x1e, 0x0, 0x2c, 0x0, - 0x4b, - - /* U+006E "n" */ - 0x1e, 0xab, 0xc4, 0x1f, 0x20, 0x3d, 0x1e, 0x0, - 0xe, 0x1e, 0x0, 0xf, 0x1e, 0x0, 0xf, - - /* U+006F "o" */ - 0x7, 0xdd, 0xb1, 0x5c, 0x0, 0x7b, 0x87, 0x0, - 0x1e, 0x5c, 0x0, 0x7b, 0x7, 0xdd, 0xb1, - - /* U+0070 "p" */ - 0x1e, 0xab, 0xd6, 0x1, 0xf3, 0x1, 0xd2, 0x1e, - 0x0, 0xa, 0x51, 0xf4, 0x1, 0xe2, 0x1e, 0xac, - 0xd5, 0x1, 0xe0, 0x0, 0x0, 0x1e, 0x0, 0x0, - 0x0, - - /* U+0071 "q" */ - 0x8, 0xdc, 0x8e, 0x5c, 0x0, 0x7e, 0x87, 0x0, - 0x1e, 0x5c, 0x0, 0x7e, 0x8, 0xdc, 0x8e, 0x0, - 0x0, 0xe, 0x0, 0x0, 0xe, - - /* U+0072 "r" */ - 0x1d, 0xaa, 0x1f, 0x30, 0x1e, 0x0, 0x1e, 0x0, - 0x1e, 0x0, - - /* U+0073 "s" */ - 0x2c, 0xcc, 0x48, 0x80, 0x0, 0x2a, 0xca, 0x21, - 0x0, 0x6a, 0x6c, 0xcc, 0x30, - - /* U+0074 "t" */ - 0xf, 0x0, 0x9f, 0xb6, 0xf, 0x0, 0xf, 0x0, - 0xe, 0x10, 0x7, 0xd9, - - /* U+0075 "u" */ - 0x2d, 0x0, 0x1d, 0x2d, 0x0, 0x1d, 0x2d, 0x0, - 0x1d, 0xe, 0x10, 0x6d, 0x6, 0xdb, 0x9d, - - /* U+0076 "v" */ - 0xc, 0x30, 0x9, 0x50, 0x5a, 0x1, 0xd0, 0x0, - 0xd2, 0x86, 0x0, 0x6, 0x9d, 0x0, 0x0, 0xe, - 0x80, 0x0, - - /* U+0077 "w" */ - 0xb2, 0x1, 0xf1, 0x2, 0xb5, 0x80, 0x7b, 0x80, - 0x85, 0xd, 0xd, 0x1d, 0xd, 0x0, 0x89, 0x90, - 0x99, 0x80, 0x2, 0xf2, 0x2, 0xf2, 0x0, - - /* U+0078 "x" */ - 0x5b, 0x3, 0xc0, 0x8, 0x9c, 0x10, 0x0, 0xe7, - 0x0, 0xa, 0x7c, 0x20, 0x79, 0x2, 0xd1, - - /* U+0079 "y" */ - 0xc, 0x30, 0x9, 0x50, 0x5a, 0x1, 0xd0, 0x0, - 0xd2, 0x77, 0x0, 0x6, 0x9d, 0x0, 0x0, 0xe, - 0x80, 0x0, 0x0, 0xd1, 0x0, 0xc, 0xd6, 0x0, - 0x0, - - /* U+007A "z" */ - 0x6b, 0xbe, 0xb0, 0x2, 0xd1, 0x1, 0xd2, 0x0, - 0xc4, 0x0, 0x8e, 0xbb, 0x90, - - /* U+007B "{" */ - 0x4, 0xd3, 0x9, 0x50, 0xa, 0x50, 0xa, 0x40, - 0x5f, 0x10, 0xa, 0x40, 0xa, 0x50, 0x9, 0x50, - 0x4, 0xd3, - - /* U+007C "|" */ - 0xee, 0xee, 0xee, 0xee, 0xe0, - - /* U+007D "}" */ - 0xab, 0x0, 0xd2, 0xd, 0x20, 0xc2, 0x9, 0xc0, - 0xc2, 0xd, 0x20, 0xd2, 0xab, 0x0, - - /* U+007E "~" */ - 0x1a, 0x91, 0x62, 0x44, 0x29, 0x90, - - /* U+00B0 "°" */ - 0x7, 0x81, 0x62, 0x8, 0x62, 0x8, 0x7, 0x81, - - /* U+2022 "•" */ - 0x19, 0x23, 0xe4, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x4, 0x9c, 0x10, 0x0, 0x16, - 0xbf, 0xff, 0xf2, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0x20, 0x5, 0xff, 0xd9, 0x41, 0xf2, 0x0, 0x5f, - 0x20, 0x0, 0x1f, 0x20, 0x5, 0xe0, 0x0, 0x1, - 0xf2, 0x0, 0x5e, 0x0, 0x7, 0x9f, 0x20, 0x48, - 0xe0, 0x7, 0xff, 0xf2, 0xaf, 0xfe, 0x0, 0x2b, - 0xd8, 0x7, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, - 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+F008 "" */ - 0x41, 0x88, 0x88, 0x88, 0x14, 0xeb, 0xe7, 0x77, - 0x7e, 0xbe, 0xa2, 0xd0, 0x0, 0xd, 0x2a, 0xeb, - 0xe3, 0x33, 0x3e, 0xbe, 0xb4, 0xfb, 0xbb, 0xbf, - 0x4b, 0xd9, 0xd0, 0x0, 0xd, 0x9d, 0xb5, 0xd0, - 0x0, 0xd, 0x5b, 0xb7, 0xff, 0xff, 0xff, 0x7b, - - /* U+F00B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xd6, 0xff, - 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0x67, - 0x52, 0x77, 0x77, 0x76, 0xef, 0xc6, 0xff, 0xff, - 0xfe, 0xff, 0xe7, 0xff, 0xff, 0xff, 0x67, 0x52, - 0x77, 0x77, 0x76, 0xef, 0xc6, 0xff, 0xff, 0xfe, - 0xff, 0xe7, 0xff, 0xff, 0xff, 0x78, 0x63, 0x88, - 0x88, 0x87, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, - 0x6, 0xfd, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0x7c, - 0x10, 0x6, 0xff, 0x70, 0xdf, 0xd1, 0x6f, 0xf7, - 0x0, 0x1d, 0xfe, 0xff, 0x70, 0x0, 0x1, 0xdf, - 0xf7, 0x0, 0x0, 0x0, 0x1c, 0x60, 0x0, 0x0, - - /* U+F00D "" */ - 0x0, 0x0, 0x0, 0xc, 0xd1, 0x2, 0xea, 0xaf, - 0xd4, 0xef, 0x80, 0xaf, 0xff, 0x80, 0x2, 0xff, - 0xf1, 0x2, 0xef, 0xdf, 0xd1, 0xdf, 0x80, 0xaf, - 0xb6, 0x70, 0x0, 0x85, - - /* U+F011 "" */ - 0x0, 0x0, 0xa6, 0x0, 0x0, 0x2, 0xa0, 0xea, - 0x29, 0x0, 0xe, 0xe1, 0xea, 0x5f, 0xa0, 0x7f, - 0x40, 0xea, 0x8, 0xf3, 0xbd, 0x0, 0xea, 0x1, - 0xf7, 0xcc, 0x0, 0xb7, 0x0, 0xf8, 0xaf, 0x0, - 0x0, 0x4, 0xf6, 0x4f, 0xa0, 0x0, 0x1d, 0xf1, - 0x9, 0xfd, 0x89, 0xef, 0x50, 0x0, 0x6d, 0xff, - 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x1, 0x88, 0x10, 0x0, 0x0, 0x5, 0xff, - 0x40, 0x0, 0x1e, 0xcf, 0xff, 0xfc, 0xd0, 0x7f, - 0xff, 0xdd, 0xff, 0xf7, 0x2d, 0xfa, 0x0, 0xbf, - 0xd1, 0xb, 0xf7, 0x0, 0x8f, 0xa0, 0x6f, 0xfe, - 0x55, 0xef, 0xf6, 0x4f, 0xff, 0xff, 0xff, 0xf3, - 0x6, 0x3a, 0xff, 0xa3, 0x60, 0x0, 0x3, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0x90, 0xf8, 0x0, 0x0, 0x9, 0xf8, 0xec, - 0xf8, 0x0, 0x1, 0xbe, 0x5a, 0x5c, 0xf8, 0x0, - 0x2d, 0xd5, 0xef, 0xf6, 0xaf, 0x50, 0xda, 0x6f, - 0xff, 0xff, 0x87, 0xf1, 0x11, 0xff, 0xff, 0xff, - 0xf5, 0x10, 0x2, 0xff, 0xc3, 0x9f, 0xf6, 0x0, - 0x2, 0xff, 0xb0, 0x7f, 0xf6, 0x0, 0x1, 0xbb, - 0x70, 0x4b, 0xb3, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x88, 0x20, 0x0, 0x0, 0x1, 0xff, - 0x60, 0x0, 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, - 0x1, 0xff, 0x60, 0x0, 0x1, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x5, - 0xff, 0xb0, 0x0, 0x8b, 0xb9, 0x8b, 0x8b, 0xb9, - 0xdf, 0xff, 0xff, 0xfe, 0xdf, 0xcf, 0xff, 0xff, - 0xfc, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F01C "" */ - 0x0, 0x24, 0x44, 0x44, 0x30, 0x0, 0x1, 0xef, - 0xff, 0xff, 0xf4, 0x0, 0xb, 0xc0, 0x0, 0x0, - 0x8e, 0x10, 0x6e, 0x10, 0x0, 0x0, 0xc, 0xa0, - 0xee, 0xcb, 0x10, 0xa, 0xcd, 0xf2, 0xff, 0xff, - 0xb8, 0x9f, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, - - /* U+F021 "" */ - 0x0, 0x4, 0x87, 0x30, 0x5f, 0x2, 0xdf, 0xfe, - 0xfc, 0x7f, 0x1e, 0xd3, 0x0, 0x3c, 0xff, 0x9f, - 0x10, 0x5, 0xfe, 0xff, 0x44, 0x0, 0x2, 0x66, - 0x66, 0x12, 0x22, 0x0, 0x0, 0x11, 0xff, 0xff, - 0x50, 0x0, 0xda, 0xff, 0xa3, 0x10, 0x8, 0xf4, - 0xfc, 0xfb, 0x66, 0xbf, 0x80, 0xf5, 0x5c, 0xff, - 0xd5, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x70, 0x0, 0xbf, 0xab, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x3e, 0xf0, 0x0, 0x2c, - - /* U+F027 "" */ - 0x0, 0x0, 0x70, 0x0, 0x0, 0xb, 0xf0, 0x0, - 0xab, 0xdf, 0xf0, 0x20, 0xff, 0xff, 0xf0, 0xa6, - 0xff, 0xff, 0xf0, 0x59, 0xff, 0xff, 0xf0, 0x92, - 0x0, 0x3e, 0xf0, 0x0, 0x0, 0x2, 0xc0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - 0x70, 0x0, 0xaa, 0x0, 0x0, 0xb, 0xf0, 0xa, - 0x4a, 0x70, 0xab, 0xdf, 0xf0, 0x23, 0xe2, 0xe0, - 0xff, 0xff, 0xf0, 0xa6, 0x95, 0xc2, 0xff, 0xff, - 0xf0, 0x59, 0x76, 0xc3, 0xff, 0xff, 0xf0, 0x92, - 0xc3, 0xe1, 0x0, 0x3e, 0xf0, 0x9, 0xa6, 0xb0, - 0x0, 0x2, 0xc0, 0x3, 0x3e, 0x20, 0x0, 0x0, - 0x0, 0x0, 0xc3, 0x0, - - /* U+F03E "" */ - 0x24, 0x44, 0x44, 0x44, 0x42, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xf3, 0xd, 0xff, 0xef, 0xff, 0xf8, - 0x4e, 0xfe, 0x25, 0xff, 0xff, 0x9d, 0xe2, 0x0, - 0x6f, 0xf9, 0x1, 0x20, 0x0, 0x4f, 0xf7, 0x44, - 0x44, 0x44, 0x7f, 0xcf, 0xff, 0xff, 0xff, 0xfc, - - /* U+F043 "" */ - 0x0, 0x1a, 0x0, 0x0, 0x7, 0xf5, 0x0, 0x0, - 0xef, 0xc0, 0x0, 0x8f, 0xff, 0x60, 0x3f, 0xff, - 0xff, 0x1b, 0xff, 0xff, 0xf9, 0xfb, 0xff, 0xff, - 0xdd, 0x6e, 0xff, 0xfc, 0x7e, 0x59, 0xff, 0x60, - 0x9f, 0xff, 0x80, 0x0, 0x13, 0x10, 0x0, - - /* U+F048 "" */ - 0x0, 0x0, 0x0, 0xe, 0x70, 0x3, 0xe4, 0xe7, - 0x4, 0xff, 0x5e, 0x75, 0xff, 0xf5, 0xec, 0xff, - 0xff, 0x5e, 0xff, 0xff, 0xf5, 0xea, 0xef, 0xff, - 0x5e, 0x71, 0xdf, 0xf5, 0xe7, 0x1, 0xcf, 0x59, - 0x50, 0x0, 0x92, - - /* U+F04B "" */ - 0x88, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x50, 0x0, - 0x0, 0xff, 0xff, 0xc3, 0x0, 0xf, 0xff, 0xff, - 0xf9, 0x10, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, - 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf8, 0xf, - 0xff, 0xff, 0xb2, 0x0, 0xff, 0xfd, 0x40, 0x0, - 0xe, 0xf7, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, - 0x0, 0x0, - - /* U+F04C "" */ - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x90, 0xdf, - 0xf9, 0xff, 0xfc, 0xf, 0xff, 0xcf, 0xff, 0xc0, - 0xff, 0xfc, 0xff, 0xfc, 0xf, 0xff, 0xcf, 0xff, - 0xc0, 0xff, 0xfc, 0xff, 0xfc, 0xf, 0xff, 0xcf, - 0xff, 0xc0, 0xff, 0xfc, 0xff, 0xfb, 0xf, 0xff, - 0xb8, 0xbb, 0x50, 0x8b, 0xb5, - - /* U+F04D "" */ - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xf9, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xb8, 0xbb, 0xbb, 0xbb, 0xb5, - - /* U+F051 "" */ - 0x0, 0x0, 0x0, 0xb, 0xa0, 0x0, 0xe7, 0xcf, - 0xb0, 0xe, 0x7c, 0xff, 0xc1, 0xe7, 0xcf, 0xff, - 0xdf, 0x7c, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0x9e, - 0x7c, 0xff, 0x70, 0xe7, 0xcf, 0x60, 0xe, 0x77, - 0x50, 0x0, 0x95, - - /* U+F052 "" */ - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0x60, 0x0, 0x0, 0x9, 0xff, 0xf5, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0x40, 0x6, 0xff, 0xff, 0xff, - 0xf3, 0xe, 0xff, 0xff, 0xff, 0xfa, 0x3, 0x66, - 0x66, 0x66, 0x62, 0xd, 0xff, 0xff, 0xff, 0xf9, - 0xf, 0xff, 0xff, 0xff, 0xfb, 0x6, 0x88, 0x88, - 0x88, 0x84, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0xc7, 0x0, 0x1d, - 0xf5, 0x1, 0xdf, 0x50, 0x1d, 0xf5, 0x0, 0x4f, - 0xd0, 0x0, 0x6, 0xfc, 0x0, 0x0, 0x6f, 0xc0, - 0x0, 0x6, 0xf9, 0x0, 0x0, 0x51, - - /* U+F054 "" */ - 0x0, 0x0, 0x0, 0x3e, 0x30, 0x0, 0x2e, 0xf3, - 0x0, 0x2, 0xef, 0x30, 0x0, 0x2e, 0xe3, 0x0, - 0x9, 0xf8, 0x0, 0x8f, 0xa0, 0x8, 0xfa, 0x0, - 0x5f, 0xa0, 0x0, 0x6, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x8f, 0x40, - 0x0, 0x0, 0x9, 0xf5, 0x0, 0x0, 0x0, 0x9f, - 0x50, 0x0, 0x9b, 0xbd, 0xfc, 0xbb, 0x6f, 0xff, - 0xff, 0xff, 0xfb, 0x13, 0x3a, 0xf7, 0x33, 0x10, - 0x0, 0x9f, 0x50, 0x0, 0x0, 0x9, 0xf5, 0x0, - 0x0, 0x0, 0x39, 0x10, 0x0, - - /* U+F068 "" */ - 0xbd, 0xdd, 0xdd, 0xdd, 0x8e, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F06E "" */ - 0x0, 0x4, 0x8a, 0x95, 0x0, 0x0, 0x1, 0xcf, - 0x84, 0x6e, 0xe3, 0x0, 0x1e, 0xf5, 0x8, 0x72, - 0xff, 0x40, 0xbf, 0xe0, 0x2d, 0xf5, 0xbf, 0xe0, - 0xdf, 0xe3, 0xff, 0xf6, 0xaf, 0xf1, 0x4f, 0xf3, - 0xaf, 0xd1, 0xef, 0x70, 0x5, 0xfd, 0x31, 0x2b, - 0xf7, 0x0, 0x0, 0x19, 0xdf, 0xea, 0x30, 0x0, - - /* U+F070 "" */ - 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfa, - 0x16, 0xaa, 0x83, 0x0, 0x0, 0x3, 0xef, 0xe6, - 0x49, 0xfb, 0x0, 0x0, 0x1, 0xbe, 0x49, 0x28, - 0xfd, 0x0, 0x1d, 0x40, 0x8f, 0xfe, 0x1f, 0xf9, - 0x4, 0xff, 0x50, 0x5f, 0xf1, 0xff, 0xb0, 0xa, - 0xfc, 0x0, 0x2d, 0xdf, 0xf2, 0x0, 0xa, 0xfa, - 0x10, 0x1b, 0xf7, 0x0, 0x0, 0x4, 0xbe, 0xe4, - 0x8, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+F071 "" */ - 0x0, 0x0, 0x2, 0xe6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, 0xe7, 0xcf, - 0x20, 0x0, 0x0, 0x7, 0xfc, 0x8, 0xfb, 0x0, - 0x0, 0x1, 0xef, 0xd0, 0x9f, 0xf4, 0x0, 0x0, - 0x9f, 0xff, 0x5c, 0xff, 0xd0, 0x0, 0x2f, 0xff, - 0xe1, 0xaf, 0xff, 0x60, 0xb, 0xff, 0xfe, 0x2b, - 0xff, 0xfe, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x1, 0x33, 0x33, 0x33, 0x33, 0x32, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xc1, 0xef, 0xd1, 0x3, 0xef, 0xfc, 0x99, - 0xfb, 0x2e, 0xec, 0xf8, 0x0, 0x54, 0xde, 0x25, - 0x70, 0x0, 0xc, 0xf4, 0x1, 0x10, 0x0, 0xbf, - 0x5c, 0x78, 0xd1, 0xff, 0xf6, 0xa, 0xff, 0xfd, - 0x78, 0x60, 0x0, 0x7c, 0xf6, 0x0, 0x0, 0x0, - 0x5, 0x60, - - /* U+F077 "" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0xaf, 0x60, - 0x0, 0x0, 0xaf, 0xef, 0x60, 0x0, 0xaf, 0x90, - 0xcf, 0x60, 0x9f, 0x80, 0x0, 0xcf, 0x57, 0x80, - 0x0, 0x0, 0xa4, - - /* U+F078 "" */ - 0x11, 0x0, 0x0, 0x2, 0xc, 0xe2, 0x0, 0x5, - 0xf8, 0x3f, 0xe2, 0x5, 0xfd, 0x10, 0x3f, 0xe7, - 0xfd, 0x10, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, - 0x3b, 0x10, 0x0, - - /* U+F079 "" */ - 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xc3, 0xff, 0xff, 0xf5, 0x0, 0xbe, 0xfe, 0xb3, - 0x44, 0x4e, 0x60, 0x4, 0x3f, 0x34, 0x0, 0x0, - 0xd6, 0x0, 0x2, 0xf2, 0x0, 0x0, 0xd, 0x60, - 0x0, 0x2f, 0x20, 0x0, 0x8c, 0xea, 0xf1, 0x1, - 0xff, 0xff, 0xf7, 0xdf, 0xf7, 0x0, 0x4, 0x44, - 0x44, 0x11, 0xc7, 0x0, - - /* U+F07B "" */ - 0x58, 0x88, 0x20, 0x0, 0x0, 0xff, 0xff, 0xe4, - 0x44, 0x41, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfc, - - /* U+F093 "" */ - 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x3, 0xff, - 0x40, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x2, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x36, 0xff, 0x63, - 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x4, - 0xff, 0x40, 0x0, 0x9a, 0xa5, 0xff, 0x5a, 0xa9, - 0xff, 0xff, 0xdd, 0xfe, 0xdf, 0xff, 0xff, 0xff, - 0xfc, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0xa8, 0x40, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0x50, 0x0, 0x0, 0x0, 0x5f, - 0xd0, 0x0, 0x39, 0x10, 0x4f, 0xf4, 0x0, 0xbf, - 0xfc, 0x9f, 0xf6, 0x0, 0xd, 0xff, 0xff, 0xe4, - 0x0, 0x0, 0x9f, 0xfd, 0x81, 0x0, 0x0, 0x1, - 0x31, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C4 "" */ - 0x0, 0x0, 0x0, 0x0, 0x6, 0xfe, 0x30, 0x5, - 0xc6, 0xe7, 0xbb, 0x5, 0xff, 0x4d, 0xbd, 0xb4, - 0xff, 0x40, 0x3c, 0xff, 0xff, 0x40, 0x0, 0x8, - 0xff, 0xb0, 0x0, 0x6f, 0xff, 0xdf, 0x80, 0xe, - 0x7b, 0xb2, 0xef, 0x80, 0xdb, 0xd9, 0x2, 0xef, - 0x73, 0xca, 0x10, 0x2, 0x72, - - /* U+F0C5 "" */ - 0x0, 0x5d, 0xdd, 0x48, 0x0, 0x8, 0xff, 0xf6, - 0xf8, 0xcc, 0x8f, 0xff, 0x84, 0x3f, 0xe8, 0xff, - 0xff, 0xfc, 0xfe, 0x8f, 0xff, 0xff, 0xcf, 0xe8, - 0xff, 0xff, 0xfc, 0xfe, 0x8f, 0xff, 0xff, 0xcf, - 0xe7, 0xff, 0xff, 0xfc, 0xff, 0x46, 0x66, 0x66, - 0x3f, 0xff, 0xff, 0xf4, 0x0, 0x34, 0x44, 0x43, - 0x0, 0x0, - - /* U+F0C7 "" */ - 0x2, 0x22, 0x22, 0x0, 0xe, 0xff, 0xff, 0xfe, - 0x20, 0xf5, 0x22, 0x22, 0xfe, 0x1f, 0x40, 0x0, - 0xe, 0xf8, 0xf7, 0x44, 0x44, 0xff, 0x9f, 0xff, - 0xff, 0xff, 0xf9, 0xff, 0xf6, 0xc, 0xff, 0x9f, - 0xff, 0x20, 0x9f, 0xf9, 0xff, 0xfc, 0x7f, 0xff, - 0x9a, 0xdd, 0xdd, 0xdd, 0xd4, - - /* U+F0C9 "" */ - 0x67, 0x77, 0x77, 0x77, 0x4e, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0x77, - 0x77, 0x74, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x45, 0x55, 0x55, 0x55, 0x3f, - 0xff, 0xff, 0xff, 0xfb, 0x11, 0x11, 0x11, 0x11, - 0x0, - - /* U+F0E0 "" */ - 0x58, 0x88, 0x88, 0x88, 0x84, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xf6, 0xc5, - 0xdf, 0xff, 0xfd, 0x5c, 0xfe, 0x6a, 0xff, 0xa5, - 0xef, 0xff, 0xf9, 0x55, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfc, - - /* U+F0E7 "" */ - 0x3, 0xaa, 0xa2, 0x0, 0x7, 0xff, 0xf2, 0x0, - 0x9, 0xff, 0xd0, 0x0, 0xb, 0xff, 0xd8, 0x81, - 0xe, 0xff, 0xff, 0xe1, 0xe, 0xff, 0xff, 0x60, - 0x0, 0x5, 0xfd, 0x0, 0x0, 0x9, 0xf4, 0x0, - 0x0, 0xd, 0xa0, 0x0, 0x0, 0xf, 0x20, 0x0, - 0x0, 0x2, 0x0, 0x0, - - /* U+F0EA "" */ - 0x1, 0x79, 0x11, 0x0, 0xf, 0xfc, 0x9f, 0xf4, - 0x0, 0xff, 0xfd, 0xcc, 0x30, 0xf, 0xfa, 0x79, - 0x93, 0x40, 0xff, 0x8e, 0xff, 0x6f, 0x5f, 0xf8, - 0xef, 0xf7, 0x64, 0xff, 0x8e, 0xff, 0xff, 0xcf, - 0xf8, 0xef, 0xff, 0xfc, 0x46, 0x3e, 0xff, 0xff, - 0xc0, 0x0, 0xdf, 0xff, 0xfc, 0x0, 0x2, 0x44, - 0x44, 0x20, - - /* U+F0F3 "" */ - 0x0, 0x1, 0x90, 0x0, 0x0, 0x2, 0xaf, 0x81, - 0x0, 0x2, 0xff, 0xff, 0xd0, 0x0, 0x9f, 0xff, - 0xff, 0x50, 0xc, 0xff, 0xff, 0xf8, 0x0, 0xef, - 0xff, 0xff, 0xa0, 0x3f, 0xff, 0xff, 0xfe, 0xd, - 0xff, 0xff, 0xff, 0xf9, 0x46, 0x66, 0x66, 0x66, - 0x20, 0x0, 0xbf, 0x70, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x0, - - /* U+F11C "" */ - 0x24, 0x44, 0x44, 0x44, 0x44, 0x30, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xf4, 0xa0, 0xa0, 0xb0, - 0xb0, 0xf4, 0xff, 0xbe, 0xae, 0xae, 0xaf, 0xf4, - 0xff, 0x3a, 0xa, 0xa, 0xf, 0xf4, 0xfb, 0xea, - 0xaa, 0xaa, 0xea, 0xf4, 0xf7, 0xb4, 0x44, 0x44, - 0xc4, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x29, 0x70, 0x0, 0x0, - 0x0, 0x3a, 0xff, 0xe0, 0x0, 0x0, 0x4b, 0xff, - 0xff, 0x70, 0x0, 0x5d, 0xff, 0xff, 0xff, 0x10, - 0xc, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xa, 0xee, - 0xef, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x0, - 0x0, 0x0, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+F15B "" */ - 0xef, 0xff, 0x5b, 0x0, 0xff, 0xff, 0x6f, 0xb0, - 0xff, 0xff, 0x68, 0x83, 0xff, 0xff, 0xfd, 0xd6, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, - - /* U+F1EB "" */ - 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x5, - 0xbf, 0xff, 0xfd, 0x81, 0x0, 0x2c, 0xfe, 0xa8, - 0x78, 0xcf, 0xf7, 0xd, 0xf7, 0x0, 0x0, 0x0, - 0x3c, 0xf5, 0x22, 0x5, 0xbe, 0xfd, 0x81, 0x5, - 0x0, 0x9, 0xfe, 0xa9, 0xcf, 0xe2, 0x0, 0x0, - 0x37, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, - 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x10, 0x0, - 0x0, - - /* U+F240 "" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, - 0x55, 0x55, 0x55, 0x5a, 0xf2, 0xf6, 0xff, 0xff, - 0xff, 0xfd, 0x4f, 0x5f, 0x6f, 0xff, 0xff, 0xff, - 0xd1, 0xf5, 0xf5, 0x77, 0x77, 0x77, 0x76, 0x8f, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, - 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, - - /* U+F241 "" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, - 0x55, 0x55, 0x54, 0x4a, 0xf2, 0xf6, 0xff, 0xff, - 0xff, 0x0, 0x4f, 0x5f, 0x6f, 0xff, 0xff, 0xf0, - 0x1, 0xf5, 0xf5, 0x77, 0x77, 0x77, 0x0, 0x8f, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, - 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, - - /* U+F242 "" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, - 0x55, 0x54, 0x44, 0x4a, 0xf2, 0xf6, 0xff, 0xff, - 0x20, 0x0, 0x4f, 0x5f, 0x6f, 0xff, 0xf2, 0x0, - 0x1, 0xf5, 0xf5, 0x77, 0x77, 0x10, 0x0, 0x8f, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, - 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, - - /* U+F243 "" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, - 0x54, 0x44, 0x44, 0x4a, 0xf2, 0xf6, 0xff, 0x50, - 0x0, 0x0, 0x4f, 0x5f, 0x6f, 0xf5, 0x0, 0x0, - 0x1, 0xf5, 0xf5, 0x77, 0x20, 0x0, 0x0, 0x8f, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, - 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, - - /* U+F244 "" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0x74, - 0x44, 0x44, 0x44, 0x4a, 0xf2, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0x5f, 0x40, 0x0, 0x0, 0x0, - 0x1, 0xf5, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, - 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x5b, 0x10, 0x0, 0x0, 0x0, - 0x3, 0xbd, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa1, - 0x3, 0x0, 0x0, 0xa, 0xf7, 0x39, 0x0, 0x0, - 0x7, 0x60, 0xff, 0xea, 0xbf, 0xaa, 0xaa, 0xdf, - 0x45, 0xa3, 0x0, 0x93, 0x0, 0x4, 0x10, 0x0, - 0x0, 0x1, 0xb8, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x9f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x6b, 0xca, 0x40, 0x0, 0x9f, 0xf6, 0xff, - 0x40, 0x1f, 0xff, 0x26, 0xfb, 0x4, 0xf6, 0xb4, - 0x6b, 0xf0, 0x6f, 0xf4, 0x6, 0xff, 0x6, 0xff, - 0x90, 0xbf, 0xf0, 0x5f, 0x95, 0x34, 0xcf, 0x2, - 0xfb, 0xf3, 0x4d, 0xc0, 0xc, 0xff, 0x3d, 0xf7, - 0x0, 0x1b, 0xfe, 0xf9, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+F2ED "" */ - 0x12, 0x3b, 0xca, 0x22, 0x1f, 0xff, 0xff, 0xff, - 0xfb, 0x36, 0x66, 0x66, 0x66, 0x16, 0xff, 0xff, - 0xff, 0xf2, 0x6f, 0x6f, 0x6f, 0x7f, 0x26, 0xf6, - 0xf6, 0xf7, 0xf2, 0x6f, 0x6f, 0x6f, 0x7f, 0x26, - 0xf6, 0xf6, 0xf7, 0xf2, 0x6f, 0x6f, 0x6f, 0x7f, - 0x24, 0xff, 0xff, 0xff, 0xf1, 0x3, 0x44, 0x44, - 0x42, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, 0xa5, 0xef, - 0xe0, 0x0, 0x0, 0xbf, 0xe5, 0xd4, 0x0, 0x0, - 0xbf, 0xff, 0xe0, 0x0, 0x0, 0xbf, 0xff, 0xf4, - 0x0, 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x0, 0xaf, - 0xff, 0xf4, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x2, - 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+F55A "" */ - 0x0, 0x5, 0x88, 0x88, 0x88, 0x86, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x8, 0xff, 0xf9, - 0x6f, 0x69, 0xff, 0x88, 0xff, 0xff, 0xc1, 0x21, - 0xcf, 0xf8, 0xdf, 0xff, 0xff, 0x50, 0x5f, 0xff, - 0x82, 0xef, 0xff, 0x71, 0x91, 0x7f, 0xf8, 0x2, - 0xef, 0xfe, 0xdf, 0xde, 0xff, 0x70, 0x2, 0xdf, - 0xff, 0xff, 0xff, 0xe3, - - /* U+F7C2 "" */ - 0x1, 0xdf, 0xff, 0xe5, 0x1d, 0x6c, 0x5a, 0xab, - 0xdf, 0x3b, 0x18, 0x8b, 0xff, 0xdf, 0xde, 0xeb, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, - 0xff, 0xff, 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x8, 0x10, - 0x0, 0x7, 0xf0, 0xb, 0xf2, 0x0, 0x0, 0x8f, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xfa, - 0x99, 0x99, 0x99, 0x0, 0x6f, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 43, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7, .adv_w = 63, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 13, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 38, .adv_w = 99, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 65, .adv_w = 135, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 97, .adv_w = 110, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 125, .adv_w = 34, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 128, .adv_w = 54, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 146, .adv_w = 54, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 160, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 168, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 183, .adv_w = 36, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 186, .adv_w = 61, .box_w = 4, .box_h = 1, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 188, .adv_w = 36, .box_w = 2, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 190, .adv_w = 56, .box_w = 5, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 213, .adv_w = 107, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 238, .adv_w = 59, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 249, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 270, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 291, .adv_w = 107, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 316, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 337, .adv_w = 99, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 358, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 379, .adv_w = 103, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 400, .adv_w = 99, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 421, .adv_w = 36, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 426, .adv_w = 36, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 433, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 448, .adv_w = 93, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 457, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 472, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 493, .adv_w = 165, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 538, .adv_w = 117, .box_w = 9, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 570, .adv_w = 121, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 595, .adv_w = 116, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 620, .adv_w = 132, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 645, .adv_w = 107, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 666, .adv_w = 102, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 684, .adv_w = 124, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 709, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 734, .adv_w = 50, .box_w = 2, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 741, .adv_w = 82, .box_w = 6, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 762, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 787, .adv_w = 95, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 805, .adv_w = 153, .box_w = 8, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 833, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 858, .adv_w = 134, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 886, .adv_w = 116, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 907, .adv_w = 134, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 943, .adv_w = 116, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 964, .adv_w = 99, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 985, .adv_w = 94, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1006, .adv_w = 127, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1031, .adv_w = 114, .box_w = 9, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1063, .adv_w = 180, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1102, .adv_w = 108, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1127, .adv_w = 104, .box_w = 8, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1155, .adv_w = 105, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1180, .adv_w = 53, .box_w = 3, .box_h = 9, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1194, .adv_w = 56, .box_w = 5, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 1217, .adv_w = 53, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1231, .adv_w = 93, .box_w = 6, .box_h = 4, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 1243, .adv_w = 80, .box_w = 5, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1246, .adv_w = 96, .box_w = 3, .box_h = 1, .ofs_x = 1, .ofs_y = 6}, - {.bitmap_index = 1248, .adv_w = 96, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1263, .adv_w = 109, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1288, .adv_w = 91, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1303, .adv_w = 109, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1324, .adv_w = 98, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1339, .adv_w = 56, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1353, .adv_w = 110, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1374, .adv_w = 109, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1395, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1406, .adv_w = 45, .box_w = 4, .box_h = 9, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 1424, .adv_w = 99, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1449, .adv_w = 45, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1456, .adv_w = 169, .box_w = 10, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1481, .adv_w = 109, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1496, .adv_w = 102, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1511, .adv_w = 109, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1536, .adv_w = 109, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1557, .adv_w = 66, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1567, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1580, .adv_w = 66, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1592, .adv_w = 108, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1607, .adv_w = 89, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1625, .adv_w = 144, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1648, .adv_w = 88, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1663, .adv_w = 89, .box_w = 7, .box_h = 7, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 1688, .adv_w = 83, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1701, .adv_w = 56, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1719, .adv_w = 48, .box_w = 1, .box_h = 9, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1724, .adv_w = 56, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1738, .adv_w = 93, .box_w = 6, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 1744, .adv_w = 67, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 1752, .adv_w = 50, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 1755, .adv_w = 160, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1816, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1856, .adv_w = 160, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1906, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1946, .adv_w = 110, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1974, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2029, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2084, .adv_w = 180, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2144, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2199, .adv_w = 180, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2247, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2302, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2322, .adv_w = 120, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2354, .adv_w = 180, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2414, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2454, .adv_w = 110, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2493, .adv_w = 140, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2528, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2578, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2623, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2668, .adv_w = 140, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2703, .adv_w = 140, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 2753, .adv_w = 100, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2783, .adv_w = 100, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2813, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2858, .adv_w = 140, .box_w = 9, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 2872, .adv_w = 180, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2920, .adv_w = 200, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2992, .adv_w = 180, .box_w = 13, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 3064, .adv_w = 160, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3114, .adv_w = 140, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3141, .adv_w = 140, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3168, .adv_w = 200, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3220, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3260, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3315, .adv_w = 160, .box_w = 11, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 3376, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3421, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3471, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3516, .adv_w = 140, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3557, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3597, .adv_w = 100, .box_w = 8, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 3641, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3691, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3741, .adv_w = 180, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3789, .adv_w = 160, .box_w = 12, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 3855, .adv_w = 120, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3899, .adv_w = 200, .box_w = 13, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3964, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4010, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4056, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4102, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4148, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4194, .adv_w = 200, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4253, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4303, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4353, .adv_w = 160, .box_w = 11, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 4414, .adv_w = 200, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4466, .adv_w = 120, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4510, .adv_w = 161, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 4, -4, 0, 0, - 0, 0, -9, -10, 1, 8, 4, 3, - -6, 1, 8, 0, 7, 2, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 1, -1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 0, -5, 0, 0, 0, 0, - 0, -3, 3, 3, 0, 0, -2, 0, - -1, 2, 0, -2, 0, -2, -1, -3, - 0, 0, 0, 0, -2, 0, 0, -2, - -2, 0, 0, -2, 0, -3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - -2, 0, -2, 0, -4, 0, -19, 0, - 0, -3, 0, 3, 5, 0, 0, -3, - 2, 2, 5, 3, -3, 3, 0, 0, - -9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -4, -2, -8, 0, -6, - -1, 0, 0, 0, 0, 0, 6, 0, - -5, -1, 0, 0, 0, -3, 0, 0, - -1, -12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -13, -1, 6, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 5, - 0, 2, 0, 0, -3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 1, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, - 3, 2, 5, -2, 0, 0, 3, -2, - -5, -22, 1, 4, 3, 0, -2, 0, - 6, 0, 5, 0, 5, 0, -15, 0, - -2, 5, 0, 5, -2, 3, 2, 0, - 0, 0, -2, 0, 0, -3, 13, 0, - 13, 0, 5, 0, 7, 2, 3, 5, - 0, 0, 0, -6, 0, 0, 0, 0, - 0, -1, 0, 1, -3, -2, -3, 1, - 0, -2, 0, 0, 0, -6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -10, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -9, 0, -10, 0, 0, 0, - 0, -1, 0, 16, -2, -2, 2, 2, - -1, 0, -2, 2, 0, 0, -8, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -16, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -10, 0, 10, 0, 0, -6, 0, - 5, 0, -11, -16, -11, -3, 5, 0, - 0, -11, 0, 2, -4, 0, -2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 5, -20, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 1, 0, 0, 0, - 0, 0, 1, 1, -2, -3, 0, 0, - 0, -2, 0, 0, -1, 0, 0, 0, - -3, 0, -1, 0, -4, -3, 0, -4, - -5, -5, -3, 0, -3, 0, -3, 0, - 0, 0, 0, -1, 0, 0, 2, 0, - 1, -2, 0, 0, 0, 0, 0, 2, - -1, 0, 0, 0, -1, 2, 2, 0, - 0, 0, 0, -3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, -1, 0, - -2, 0, -3, 0, 0, -1, 0, 5, - 0, 0, -2, 0, 0, 0, 0, 0, - 0, 0, -1, -1, 0, 0, -2, 0, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, -1, 0, -2, -2, 0, - 0, 0, 0, 0, 0, 0, 0, -1, - 0, -2, -2, -2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -1, 0, 0, - 0, 0, -1, -2, 0, -2, 0, -5, - -1, -5, 3, 0, 0, -3, 2, 3, - 4, 0, -4, 0, -2, 0, 0, -8, - 2, -1, 1, -8, 2, 0, 0, 0, - -8, 0, -8, -1, -14, -1, 0, -8, - 0, 3, 4, 0, 2, 0, 0, 0, - 0, 0, 0, -3, -2, 0, -5, 0, - 0, 0, -2, 0, 0, 0, -2, 0, - 0, 0, 0, 0, -1, -1, 0, -1, - -2, 0, 0, 0, 0, 0, 0, 0, - -2, -2, 0, -1, -2, -1, 0, 0, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -1, -1, 0, -2, - 0, -1, 0, -3, 2, 0, 0, -2, - 1, 2, 2, 0, 0, 0, 0, 0, - 0, -1, 0, 0, 0, 0, 0, 1, - 0, 0, -2, 0, -2, -1, -2, 0, - 0, 0, 0, 0, 0, 0, 1, 0, - -1, 0, 0, 0, 0, -2, -2, 0, - -3, 0, 5, -1, 0, -5, 0, 0, - 4, -8, -8, -7, -3, 2, 0, -1, - -10, -3, 0, -3, 0, -3, 2, -3, - -10, 0, -4, 0, 0, 1, 0, 1, - -1, 0, 2, 0, -5, -6, 0, -8, - -4, -3, -4, -5, -2, -4, 0, -3, - -4, 1, 0, 0, 0, -2, 0, 0, - 0, 1, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - 0, -1, 0, 0, -2, 0, -3, -4, - -4, 0, 0, -5, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 1, - -1, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -1, 0, 0, 0, - -3, 0, 0, 0, 0, -8, -5, 0, - 0, 0, -2, -8, 0, 0, -2, 2, - 0, -4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, 0, -3, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, -3, 0, - 0, 0, 0, 2, 0, 1, -3, -3, - 0, -2, -2, -2, 0, 0, 0, 0, - 0, 0, -5, 0, -2, 0, -2, -2, - 0, -4, -4, -5, -1, 0, -3, 0, - -5, 0, 0, 0, 0, 13, 0, 0, - 1, 0, 0, -2, 0, 2, 0, -7, - 0, 0, 0, 0, 0, -15, -3, 5, - 5, -1, -7, 0, 2, -2, 0, -8, - -1, -2, 2, -11, -2, 2, 0, 2, - -6, -2, -6, -5, -7, 0, 0, -10, - 0, 9, 0, 0, -1, 0, 0, 0, - -1, -1, -2, -4, -5, 0, -15, 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, -2, 0, -1, -2, -2, 0, 0, - -3, 0, -2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, 0, 3, - 0, 2, 0, -4, 2, -1, 0, -4, - -2, 0, -2, -2, -1, 0, -2, -3, - 0, 0, -1, 0, -1, -3, -2, 0, - 0, -2, 0, 2, -1, 0, -4, 0, - 0, 0, -3, 0, -3, 0, -3, -3, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, -3, 2, 0, -2, 0, -1, -2, - -5, -1, -1, -1, 0, -1, -2, 0, - 0, 0, 0, 0, 0, -2, -1, -1, - 0, 0, 0, 0, 2, -1, 0, -1, - 0, 0, 0, -1, -2, -1, -1, -2, - -1, 0, 1, 6, 0, 0, -4, 0, - -1, 3, 0, -2, -7, -2, 2, 0, - 0, -8, -3, 2, -3, 1, 0, -1, - -1, -5, 0, -2, 1, 0, 0, -3, - 0, 0, 0, 2, 2, -3, -3, 0, - -3, -2, -2, -2, -2, 0, -3, 1, - -3, -3, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 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, - -1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -1, -2, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, 0, -2, - 0, 0, -2, -2, 0, 0, 0, 0, - -2, 0, 0, 0, 0, -1, 0, 0, - 0, 0, 0, -1, 0, 0, 0, 0, - -2, 0, -3, 0, 0, 0, -5, 0, - 1, -4, 3, 0, -1, -8, 0, 0, - -4, -2, 0, -6, -4, -4, 0, 0, - -7, -2, -6, -6, -8, 0, -4, 0, - 1, 11, -2, 0, -4, -2, 0, -2, - -3, -4, -3, -6, -7, -4, -2, 0, - 0, -1, 0, 0, 0, 0, -11, -1, - 5, 4, -4, -6, 0, 0, -5, 0, - -8, -1, -2, 3, -15, -2, 0, 0, - 0, -10, -2, -8, -2, -12, 0, 0, - -11, 0, 9, 0, 0, -1, 0, 0, - 0, 0, -1, -1, -6, -1, 0, -10, - 0, 0, 0, 0, -5, 0, -1, 0, - 0, -4, -8, 0, 0, -1, -2, -5, - -2, 0, -1, 0, 0, 0, 0, -7, - -2, -5, -5, -1, -3, -4, -2, -3, - 0, -3, -1, -5, -2, 0, -2, -3, - -2, -3, 0, 1, 0, -1, -5, 0, - 3, 0, -3, 0, 0, 0, 0, 2, - 0, 1, -3, 7, 0, -2, -2, -2, - 0, 0, 0, 0, 0, 0, -5, 0, - -2, 0, -2, -2, 0, -4, -4, -5, - -1, 0, -3, 1, 6, 0, 0, 0, - 0, 13, 0, 0, 1, 0, 0, -2, - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -1, -3, 0, 0, 0, 0, 0, -1, - 0, 0, 0, -2, -2, 0, 0, -3, - -2, 0, 0, -3, 0, 3, -1, 0, - 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 2, 3, 1, -1, 0, -5, - -3, 0, 5, -5, -5, -3, -3, 6, - 3, 2, -14, -1, 3, -2, 0, -2, - 2, -2, -6, 0, -2, 2, -2, -1, - -5, -1, 0, 0, 5, 3, 0, -4, - 0, -9, -2, 5, -2, -6, 0, -2, - -5, -5, -2, 6, 2, 0, -2, 0, - -4, 0, 1, 5, -4, -6, -6, -4, - 5, 0, 0, -12, -1, 2, -3, -1, - -4, 0, -4, -6, -2, -2, -1, 0, - 0, -4, -3, -2, 0, 5, 4, -2, - -9, 0, -9, -2, 0, -6, -9, 0, - -5, -3, -5, -4, 4, 0, 0, -2, - 0, -3, -1, 0, -2, -3, 0, 3, - -5, 2, 0, 0, -8, 0, -2, -4, - -3, -1, -5, -4, -5, -4, 0, -5, - -2, -4, -3, -5, -2, 0, 0, 0, - 8, -3, 0, -5, -2, 0, -2, -3, - -4, -4, -4, -6, -2, -3, 3, 0, - -2, 0, -8, -2, 1, 3, -5, -6, - -3, -5, 5, -2, 1, -15, -3, 3, - -4, -3, -6, 0, -5, -7, -2, -2, - -1, -2, -3, -5, 0, 0, 0, 5, - 4, -1, -10, 0, -10, -4, 4, -6, - -11, -3, -6, -7, -8, -5, 3, 0, - 0, 0, 0, -2, 0, 0, 2, -2, - 3, 1, -3, 3, 0, 0, -5, 0, - 0, 0, 0, 0, 0, -1, 0, 0, - 0, 0, 0, 0, -2, 0, 0, 0, - 0, 1, 5, 0, 0, -2, 0, 0, - 0, 0, -1, -1, -2, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 1, 0, - -1, 0, 6, 0, 3, 0, 0, -2, - 0, 3, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -10, 0, -2, 3, 0, 5, - 0, 0, 16, 2, -3, -3, 2, 2, - -1, 0, -8, 0, 0, 8, -10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -11, 6, 22, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -10, 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, -3, 0, 0, -3, - -1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -1, 0, -4, 0, - 0, 0, 0, 0, 2, 21, -3, -1, - 5, 4, -4, 2, 0, 0, 2, 2, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -21, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - 0, 0, 0, -4, 0, 0, 0, 0, - -4, -1, 0, 0, 0, -4, 0, -2, - 0, -8, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -2, 0, 0, -3, 0, -2, 0, - -4, 0, 0, 0, -3, 2, -2, 0, - 0, -4, -2, -4, 0, 0, -4, 0, - -2, 0, -8, 0, -2, 0, 0, -13, - -3, -6, -2, -6, 0, 0, -11, 0, - -4, -1, 0, 0, 0, 0, 0, 0, - 0, 0, -2, -3, -1, -3, 0, 0, - 0, 0, -4, 0, -4, 2, -2, 3, - 0, -1, -4, -1, -3, -3, 0, -2, - -1, -1, 1, -4, 0, 0, 0, 0, - -14, -1, -2, 0, -4, 0, -1, -8, - -1, 0, 0, -1, -1, 0, 0, 0, - 0, 1, 0, -1, -3, -1, 3, 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, 2, 0, 0, 0, 0, 0, - 0, -4, 0, -1, 0, 0, 0, -3, - 2, 0, 0, 0, -4, -2, -3, 0, - 0, -4, 0, -2, 0, -8, 0, 0, - 0, 0, -16, 0, -3, -6, -8, 0, - 0, -11, 0, -1, -2, 0, 0, 0, - 0, 0, 0, 0, 0, -2, -2, -1, - -2, 0, 0, 0, 3, -2, 0, 5, - 8, -2, -2, -5, 2, 8, 3, 4, - -4, 2, 7, 2, 5, 4, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 8, -3, -2, 0, -1, - 13, 7, 13, 0, 0, 0, 2, 0, - 0, 6, 0, 0, -3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -1, 0, - 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, -13, -2, -1, -7, - -8, 0, 0, -11, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -1, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, -13, -2, -1, - -7, -8, 0, 0, -6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -1, 0, 0, 0, -4, 2, 0, -2, - 1, 3, 2, -5, 0, 0, -1, 2, - 0, 1, 0, 0, 0, 0, -4, 0, - -1, -1, -3, 0, -1, -6, 0, 10, - -2, 0, -4, -1, 0, -1, -3, 0, - -2, -4, -3, -2, 0, 0, 0, -3, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, -13, - -2, -1, -7, -8, 0, 0, -11, 0, - 0, 0, 0, 0, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -3, 0, -5, -2, -1, 5, -1, -2, - -6, 0, -1, 0, -1, -4, 0, 4, - 0, 1, 0, 1, -4, -6, -2, 0, - -6, -3, -4, -7, -6, 0, -3, -3, - -2, -2, -1, -1, -2, -1, 0, -1, - 0, 2, 0, 2, -1, 0, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -1, -2, -2, 0, 0, - -4, 0, -1, 0, -3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, -2, 0, -2, - 0, 0, 0, 0, -1, 0, 0, -3, - -2, 2, 0, -3, -3, -1, 0, -5, - -1, -4, -1, -2, 0, -3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -11, 0, 5, 0, 0, -3, 0, - 0, 0, 0, -2, 0, -2, 0, 0, - -1, 0, 0, -1, 0, -4, 0, 0, - 7, -2, -5, -5, 1, 2, 2, 0, - -4, 1, 2, 1, 5, 1, 5, -1, - -4, 0, 0, -6, 0, 0, -5, -4, - 0, 0, -3, 0, -2, -3, 0, -2, - 0, -2, 0, -1, 2, 0, -1, -5, - -2, 6, 0, 0, -1, 0, -3, 0, - 0, 2, -4, 0, 2, -2, 1, 0, - 0, -5, 0, -1, 0, 0, -2, 2, - -1, 0, 0, 0, -7, -2, -4, 0, - -5, 0, 0, -8, 0, 6, -2, 0, - -3, 0, 1, 0, -2, 0, -2, -5, - 0, -2, 2, 0, 0, 0, 0, -1, - 0, 0, 2, -2, 0, 0, 0, -2, - -1, 0, -2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -10, 0, 4, 0, - 0, -1, 0, 0, 0, 0, 0, 0, - -2, -2, 0, 0, 0, 3, 0, 4, - 0, 0, 0, 0, 0, -10, -9, 0, - 7, 5, 3, -6, 1, 7, 0, 6, - 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_10 = { -#else -lv_font_t lv_font_montserrat_10 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 11, /*The maximum line height required by the font*/ - .base_line = 2, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -1, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_10*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_12.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_12.c deleted file mode 100644 index 6e5c1ea..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_12.c +++ /dev/null @@ -1,1915 +0,0 @@ -/******************************************************************************* - * Size: 12 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 12 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_12.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_12 - #define LV_FONT_MONTSERRAT_12 1 -#endif - -#if LV_FONT_MONTSERRAT_12 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0xf, 0x40, 0xf3, 0xf, 0x30, 0xf2, 0xe, 0x20, - 0xd1, 0x3, 0x0, 0x81, 0x1e, 0x30, - - /* U+0022 "\"" */ - 0x3c, 0x1e, 0x3b, 0xe, 0x3b, 0xe, 0x15, 0x7, - - /* U+0023 "#" */ - 0x0, 0x48, 0x3, 0xa0, 0x0, 0x6, 0x60, 0x58, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0x10, 0xa, 0x20, - 0x84, 0x0, 0x0, 0xc1, 0xa, 0x30, 0x0, 0xd, - 0x0, 0xb1, 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x0, - 0x1c, 0x0, 0xd0, 0x0, 0x3, 0xa0, 0x1c, 0x0, - 0x0, - - /* U+0024 "$" */ - 0x0, 0x9, 0x20, 0x0, 0x0, 0x92, 0x0, 0x3, - 0xcf, 0xfb, 0x31, 0xf7, 0xa5, 0x74, 0x4e, 0x9, - 0x20, 0x1, 0xf9, 0xb2, 0x0, 0x2, 0xbf, 0xe8, - 0x0, 0x0, 0x97, 0xda, 0x0, 0x9, 0x24, 0xe5, - 0xb4, 0xa5, 0xba, 0x8, 0xef, 0xfa, 0x10, 0x0, - 0x92, 0x0, 0x0, 0x4, 0x10, 0x0, - - /* U+0025 "%" */ - 0xa, 0xc8, 0x0, 0xc, 0x10, 0x66, 0xa, 0x20, - 0x76, 0x0, 0x83, 0x7, 0x42, 0xc0, 0x0, 0x57, - 0xa, 0x2b, 0x20, 0x0, 0x9, 0xc6, 0x68, 0x5c, - 0x90, 0x0, 0x1, 0xc1, 0xc0, 0x67, 0x0, 0xa, - 0x43, 0x90, 0x2a, 0x0, 0x49, 0x1, 0xb0, 0x47, - 0x0, 0xc1, 0x0, 0x7b, 0xb1, - - /* U+0026 "&" */ - 0x0, 0x9e, 0xd4, 0x0, 0x0, 0x5c, 0x3, 0xd0, - 0x0, 0x4, 0xc0, 0x5c, 0x0, 0x0, 0xc, 0xbd, - 0x20, 0x0, 0x3, 0xde, 0x80, 0x10, 0x1, 0xe3, - 0x1d, 0x78, 0x80, 0x6b, 0x0, 0x1d, 0xf2, 0x4, - 0xf4, 0x13, 0xcf, 0x60, 0x6, 0xdf, 0xd6, 0x2b, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0x3c, 0x3b, 0x3b, 0x15, - - /* U+0028 "(" */ - 0xa, 0x71, 0xf1, 0x5c, 0x9, 0x80, 0xb6, 0xc, - 0x40, 0xd4, 0xc, 0x40, 0xb6, 0x9, 0x80, 0x5b, - 0x1, 0xf1, 0xa, 0x70, - - /* U+0029 ")" */ - 0x6b, 0x0, 0xf2, 0xb, 0x60, 0x7a, 0x5, 0xc0, - 0x4d, 0x3, 0xe0, 0x4d, 0x5, 0xc0, 0x7a, 0xb, - 0x60, 0xf1, 0x6b, 0x0, - - /* U+002A "*" */ - 0x0, 0xb0, 0x8, 0x9c, 0xb5, 0xb, 0xf8, 0x8, - 0x7c, 0x95, 0x0, 0xa0, 0x0, - - /* U+002B "+" */ - 0x0, 0xb, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, - 0xf, 0x0, 0x2, 0xee, 0xfe, 0xe2, 0x1, 0x1f, - 0x11, 0x0, 0x0, 0xf0, 0x0, - - /* U+002C "," */ - 0x18, 0x4, 0xf1, 0xd, 0x3, 0x80, - - /* U+002D "-" */ - 0x4f, 0xfd, 0x2, 0x22, - - /* U+002E "." */ - 0x2a, 0x4, 0xd0, - - /* U+002F "/" */ - 0x0, 0x0, 0x34, 0x0, 0x0, 0xb5, 0x0, 0x0, - 0xf0, 0x0, 0x5, 0xb0, 0x0, 0xa, 0x60, 0x0, - 0xe, 0x10, 0x0, 0x4c, 0x0, 0x0, 0x97, 0x0, - 0x0, 0xe2, 0x0, 0x3, 0xd0, 0x0, 0x8, 0x70, - 0x0, 0xd, 0x20, 0x0, 0x2d, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x9e, 0xe9, 0x0, 0xa, 0xd4, 0x4d, 0xa0, - 0x1f, 0x20, 0x2, 0xf1, 0x5e, 0x0, 0x0, 0xd5, - 0x6c, 0x0, 0x0, 0xc6, 0x5e, 0x0, 0x0, 0xd5, - 0x1f, 0x20, 0x2, 0xf1, 0xa, 0xd4, 0x4d, 0xa0, - 0x0, 0x9e, 0xe9, 0x0, - - /* U+0031 "1" */ - 0xef, 0xf3, 0x22, 0xf3, 0x0, 0xf3, 0x0, 0xf3, - 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf3, - 0x0, 0xf3, - - /* U+0032 "2" */ - 0x19, 0xef, 0xc2, 0x8, 0xb4, 0x3a, 0xe0, 0x0, - 0x0, 0x2f, 0x10, 0x0, 0x5, 0xe0, 0x0, 0x2, - 0xe5, 0x0, 0x1, 0xd7, 0x0, 0x1, 0xd8, 0x0, - 0x1, 0xda, 0x22, 0x21, 0x8f, 0xff, 0xff, 0x70, - - /* U+0033 "3" */ - 0x9f, 0xff, 0xff, 0x1, 0x22, 0x2d, 0x80, 0x0, - 0x9, 0xb0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x7c, - 0xf8, 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0xe, - 0x4b, 0x94, 0x39, 0xf1, 0x3b, 0xff, 0xc3, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x9b, 0x0, 0x0, 0x4, 0xe1, 0x0, - 0x0, 0x1e, 0x50, 0x0, 0x0, 0xaa, 0x0, 0x0, - 0x5, 0xe1, 0xd, 0x40, 0x1e, 0x40, 0xd, 0x40, - 0x8f, 0xff, 0xff, 0xfd, 0x12, 0x22, 0x2e, 0x62, - 0x0, 0x0, 0xe, 0x40, - - /* U+0035 "5" */ - 0xc, 0xff, 0xff, 0x0, 0xe5, 0x22, 0x20, 0xf, - 0x10, 0x0, 0x1, 0xff, 0xeb, 0x30, 0x2, 0x23, - 0x9f, 0x10, 0x0, 0x0, 0xd6, 0x0, 0x0, 0xd, - 0x69, 0xb4, 0x38, 0xf1, 0x2a, 0xef, 0xc4, 0x0, - - /* U+0036 "6" */ - 0x0, 0x6d, 0xfd, 0x50, 0x8, 0xd5, 0x23, 0x20, - 0x1f, 0x20, 0x0, 0x0, 0x4d, 0x6d, 0xea, 0x10, - 0x6f, 0xc4, 0x3c, 0xa0, 0x5f, 0x30, 0x2, 0xf0, - 0x2f, 0x20, 0x2, 0xf0, 0xa, 0xc3, 0x2b, 0xa0, - 0x1, 0xaf, 0xfa, 0x10, - - /* U+0037 "7" */ - 0xaf, 0xff, 0xff, 0xba, 0x92, 0x22, 0xd7, 0x76, - 0x0, 0x3f, 0x10, 0x0, 0xa, 0x90, 0x0, 0x1, - 0xf2, 0x0, 0x0, 0x7c, 0x0, 0x0, 0xe, 0x50, - 0x0, 0x5, 0xe0, 0x0, 0x0, 0xc8, 0x0, 0x0, - - /* U+0038 "8" */ - 0x3, 0xcf, 0xea, 0x10, 0xe, 0x81, 0x2c, 0xa0, - 0x2f, 0x10, 0x5, 0xd0, 0xe, 0x70, 0x1b, 0x90, - 0x6, 0xff, 0xff, 0x20, 0x3f, 0x50, 0x18, 0xe0, - 0x6c, 0x0, 0x0, 0xf2, 0x3f, 0x61, 0x29, 0xe0, - 0x5, 0xcf, 0xfb, 0x20, - - /* U+0039 "9" */ - 0x7, 0xef, 0xc3, 0x6, 0xe3, 0x15, 0xe1, 0x98, - 0x0, 0xb, 0x87, 0xd2, 0x3, 0xfb, 0xa, 0xff, - 0xd9, 0xc0, 0x0, 0x10, 0x8b, 0x0, 0x0, 0xd, - 0x70, 0x62, 0x4b, 0xd0, 0x1c, 0xfe, 0xa1, 0x0, - - /* U+003A ":" */ - 0x4e, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xa0, 0x4d, 0x0, - - /* U+003B ";" */ - 0x4e, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x80, 0x4f, 0x10, 0xd0, 0x38, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x2, 0x10, 0x0, 0x4b, 0xe1, 0x7, - 0xdc, 0x50, 0x3, 0xf8, 0x0, 0x0, 0x4, 0xbe, - 0x71, 0x0, 0x0, 0x29, 0xe2, 0x0, 0x0, 0x0, - 0x0, - - /* U+003D "=" */ - 0x3f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xee, 0xee, 0xe2, 0x1, 0x11, - 0x11, 0x0, - - /* U+003E ">" */ - 0x12, 0x0, 0x0, 0x2, 0xeb, 0x40, 0x0, 0x0, - 0x5c, 0xd6, 0x0, 0x0, 0x8, 0xf2, 0x1, 0x7e, - 0xb4, 0x2, 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+003F "?" */ - 0x1a, 0xef, 0xc3, 0x9, 0xa3, 0x2a, 0xe0, 0x0, - 0x0, 0x3f, 0x0, 0x0, 0xa, 0xa0, 0x0, 0x9, - 0xc0, 0x0, 0x2, 0xf1, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x2, 0x80, 0x0, 0x0, 0x4d, 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x4, 0xbd, 0xdd, 0x81, 0x0, 0x0, 0x9b, - 0x30, 0x0, 0x6d, 0x30, 0x7, 0xa0, 0x8e, 0xe8, - 0xd5, 0xd1, 0xd, 0x7, 0xd2, 0x19, 0xf3, 0x77, - 0x4a, 0xd, 0x40, 0x0, 0xf3, 0x1b, 0x58, 0xf, - 0x20, 0x0, 0xd3, 0xc, 0x58, 0xd, 0x40, 0x0, - 0xf3, 0x1b, 0x3a, 0x7, 0xd2, 0x1a, 0xf5, 0x77, - 0xd, 0x0, 0x8e, 0xe8, 0x5f, 0xb0, 0x6, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9b, 0x30, 0x2, - 0x40, 0x0, 0x0, 0x5, 0xbd, 0xed, 0x60, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x6f, 0x30, 0x0, 0x0, 0x0, 0xdd, - 0x90, 0x0, 0x0, 0x4, 0xe3, 0xf1, 0x0, 0x0, - 0xb, 0x80, 0xc7, 0x0, 0x0, 0x1f, 0x20, 0x6e, - 0x0, 0x0, 0x8c, 0x0, 0x1f, 0x50, 0x0, 0xef, - 0xee, 0xef, 0xb0, 0x6, 0xe2, 0x11, 0x14, 0xf2, - 0xc, 0x70, 0x0, 0x0, 0xb9, - - /* U+0042 "B" */ - 0xbf, 0xff, 0xfb, 0x20, 0xb7, 0x11, 0x2a, 0xd0, - 0xb7, 0x0, 0x3, 0xf0, 0xb7, 0x0, 0x8, 0xc0, - 0xbf, 0xff, 0xff, 0x50, 0xb8, 0x22, 0x26, 0xf2, - 0xb7, 0x0, 0x0, 0xc7, 0xb7, 0x11, 0x15, 0xf4, - 0xbf, 0xff, 0xfd, 0x60, - - /* U+0043 "C" */ - 0x0, 0x3b, 0xef, 0xb3, 0x0, 0x5f, 0x93, 0x38, - 0xe0, 0xe, 0x60, 0x0, 0x0, 0x4, 0xe0, 0x0, - 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x4, 0xe0, - 0x0, 0x0, 0x0, 0xe, 0x60, 0x0, 0x0, 0x0, - 0x5f, 0x93, 0x38, 0xe0, 0x0, 0x3b, 0xff, 0xb3, - 0x0, - - /* U+0044 "D" */ - 0xbf, 0xff, 0xea, 0x30, 0xb, 0x82, 0x23, 0x9f, - 0x40, 0xb7, 0x0, 0x0, 0x7e, 0xb, 0x70, 0x0, - 0x0, 0xf3, 0xb7, 0x0, 0x0, 0xe, 0x5b, 0x70, - 0x0, 0x0, 0xf3, 0xb7, 0x0, 0x0, 0x7e, 0xb, - 0x82, 0x23, 0x9f, 0x40, 0xbf, 0xff, 0xeb, 0x30, - 0x0, - - /* U+0045 "E" */ - 0xbf, 0xff, 0xff, 0x3b, 0x82, 0x22, 0x20, 0xb7, - 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xbf, 0xff, - 0xfa, 0xb, 0x82, 0x22, 0x10, 0xb7, 0x0, 0x0, - 0xb, 0x82, 0x22, 0x20, 0xbf, 0xff, 0xff, 0x50, - - /* U+0046 "F" */ - 0xbf, 0xff, 0xff, 0x3b, 0x82, 0x22, 0x20, 0xb7, - 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xbf, 0xff, - 0xfa, 0xb, 0x82, 0x22, 0x10, 0xb7, 0x0, 0x0, - 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x3b, 0xef, 0xc4, 0x0, 0x5f, 0x94, 0x38, - 0xe1, 0xe, 0x70, 0x0, 0x0, 0x4, 0xe0, 0x0, - 0x0, 0x0, 0x6c, 0x0, 0x0, 0x8, 0x24, 0xe0, - 0x0, 0x0, 0xe3, 0xe, 0x60, 0x0, 0xe, 0x30, - 0x5f, 0x93, 0x37, 0xf3, 0x0, 0x3b, 0xef, 0xc4, - 0x0, - - /* U+0048 "H" */ - 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, - 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, - 0xbf, 0xff, 0xff, 0xf7, 0xb8, 0x22, 0x22, 0xc7, - 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, - 0xb7, 0x0, 0x0, 0xb7, - - /* U+0049 "I" */ - 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, - 0xb7, - - /* U+004A "J" */ - 0x4, 0xff, 0xff, 0x0, 0x22, 0x5f, 0x0, 0x0, - 0x3f, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x3f, 0x0, - 0x0, 0x3f, 0x0, 0x0, 0x4e, 0xd, 0x52, 0xba, - 0x5, 0xdf, 0xb2, - - /* U+004B "K" */ - 0xb7, 0x0, 0x7, 0xd1, 0xb7, 0x0, 0x5e, 0x20, - 0xb7, 0x4, 0xe3, 0x0, 0xb7, 0x3e, 0x40, 0x0, - 0xb9, 0xef, 0x20, 0x0, 0xbf, 0x89, 0xd0, 0x0, - 0xba, 0x0, 0xca, 0x0, 0xb7, 0x0, 0x1e, 0x70, - 0xb7, 0x0, 0x3, 0xf3, - - /* U+004C "L" */ - 0xb7, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, - 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, - 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, 0x0, - 0xb, 0x82, 0x22, 0x20, 0xbf, 0xff, 0xff, 0x0, - - /* U+004D "M" */ - 0xb8, 0x0, 0x0, 0x1, 0xf3, 0xbf, 0x10, 0x0, - 0x9, 0xf3, 0xbe, 0xa0, 0x0, 0x2e, 0xf3, 0xb7, - 0xe3, 0x0, 0xb7, 0xf3, 0xb6, 0x7b, 0x4, 0xd0, - 0xf3, 0xb6, 0xd, 0x4c, 0x50, 0xf3, 0xb6, 0x5, - 0xfc, 0x0, 0xf3, 0xb6, 0x0, 0xb3, 0x0, 0xf3, - 0xb6, 0x0, 0x0, 0x0, 0xf3, - - /* U+004E "N" */ - 0xb9, 0x0, 0x0, 0xb7, 0xbf, 0x50, 0x0, 0xb7, - 0xbc, 0xf2, 0x0, 0xb7, 0xb7, 0xad, 0x0, 0xb7, - 0xb7, 0xd, 0x90, 0xb7, 0xb7, 0x2, 0xf5, 0xb7, - 0xb7, 0x0, 0x6f, 0xd7, 0xb7, 0x0, 0xa, 0xf7, - 0xb7, 0x0, 0x0, 0xd7, - - /* U+004F "O" */ - 0x0, 0x3b, 0xef, 0xb4, 0x0, 0x5, 0xf9, 0x33, - 0x8f, 0x60, 0xe, 0x60, 0x0, 0x5, 0xf1, 0x4e, - 0x0, 0x0, 0x0, 0xd5, 0x6c, 0x0, 0x0, 0x0, - 0xb7, 0x4e, 0x0, 0x0, 0x0, 0xd5, 0xe, 0x60, - 0x0, 0x5, 0xf1, 0x5, 0xf9, 0x33, 0x8f, 0x60, - 0x0, 0x3b, 0xef, 0xb4, 0x0, - - /* U+0050 "P" */ - 0xbf, 0xff, 0xd8, 0x0, 0xb8, 0x22, 0x5d, 0x90, - 0xb7, 0x0, 0x4, 0xe0, 0xb7, 0x0, 0x3, 0xf0, - 0xb7, 0x0, 0x2c, 0xa0, 0xbf, 0xff, 0xfa, 0x10, - 0xb8, 0x22, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, - 0xb7, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x3b, 0xef, 0xb4, 0x0, 0x4, 0xf9, 0x33, - 0x8f, 0x60, 0xe, 0x60, 0x0, 0x5, 0xf1, 0x4e, - 0x0, 0x0, 0x0, 0xd5, 0x6c, 0x0, 0x0, 0x0, - 0xb7, 0x4e, 0x0, 0x0, 0x0, 0xd6, 0xf, 0x60, - 0x0, 0x5, 0xf1, 0x5, 0xf8, 0x32, 0x7f, 0x60, - 0x0, 0x4c, 0xff, 0xc5, 0x0, 0x0, 0x0, 0xc, - 0xb0, 0x28, 0x0, 0x0, 0x1, 0xbf, 0xe5, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0052 "R" */ - 0xbf, 0xff, 0xd8, 0x0, 0xb8, 0x22, 0x5d, 0x90, - 0xb7, 0x0, 0x4, 0xe0, 0xb7, 0x0, 0x3, 0xf0, - 0xb7, 0x0, 0x1b, 0xb0, 0xbf, 0xff, 0xfb, 0x10, - 0xb8, 0x22, 0xb9, 0x0, 0xb7, 0x0, 0x1f, 0x30, - 0xb7, 0x0, 0x7, 0xd0, - - /* U+0053 "S" */ - 0x3, 0xcf, 0xeb, 0x31, 0xf7, 0x23, 0x74, 0x4e, - 0x0, 0x0, 0x1, 0xf9, 0x20, 0x0, 0x2, 0xbf, - 0xd7, 0x0, 0x0, 0x4, 0xca, 0x0, 0x0, 0x4, - 0xe5, 0xb4, 0x23, 0xbb, 0x8, 0xdf, 0xea, 0x10, - - /* U+0054 "T" */ - 0xff, 0xff, 0xff, 0xf2, 0x23, 0xf3, 0x22, 0x0, - 0x1f, 0x10, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, - 0x10, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, 0x10, - 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, 0x10, 0x0, - - /* U+0055 "U" */ - 0xd6, 0x0, 0x0, 0xe4, 0xd6, 0x0, 0x0, 0xe4, - 0xd6, 0x0, 0x0, 0xe4, 0xd6, 0x0, 0x0, 0xe4, - 0xd6, 0x0, 0x0, 0xe4, 0xc7, 0x0, 0x0, 0xf3, - 0x9a, 0x0, 0x2, 0xf1, 0x2f, 0x83, 0x5d, 0xa0, - 0x4, 0xcf, 0xd8, 0x0, - - /* U+0056 "V" */ - 0xc, 0x70, 0x0, 0x0, 0xd5, 0x6, 0xe0, 0x0, - 0x4, 0xe0, 0x0, 0xf4, 0x0, 0xa, 0x80, 0x0, - 0x9b, 0x0, 0x1f, 0x20, 0x0, 0x2f, 0x20, 0x7b, - 0x0, 0x0, 0xc, 0x80, 0xe4, 0x0, 0x0, 0x5, - 0xe5, 0xe0, 0x0, 0x0, 0x0, 0xee, 0x70, 0x0, - 0x0, 0x0, 0x8f, 0x10, 0x0, - - /* U+0057 "W" */ - 0x7c, 0x0, 0x0, 0xe8, 0x0, 0x2, 0xf0, 0x2f, - 0x10, 0x3, 0xfd, 0x0, 0x7, 0xa0, 0xd, 0x60, - 0x8, 0x9f, 0x20, 0xc, 0x50, 0x8, 0xb0, 0xe, - 0x3b, 0x70, 0x1f, 0x0, 0x3, 0xf0, 0x3e, 0x6, - 0xc0, 0x6b, 0x0, 0x0, 0xe5, 0x89, 0x1, 0xf1, - 0xb6, 0x0, 0x0, 0x9a, 0xd4, 0x0, 0xb7, 0xf1, - 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x6f, 0xc0, 0x0, - 0x0, 0xf, 0xa0, 0x0, 0x1f, 0x70, 0x0, - - /* U+0058 "X" */ - 0x5f, 0x10, 0x0, 0xe5, 0xa, 0xb0, 0x9, 0xa0, - 0x1, 0xe6, 0x4e, 0x10, 0x0, 0x4f, 0xe4, 0x0, - 0x0, 0xd, 0xe0, 0x0, 0x0, 0x7d, 0xd8, 0x0, - 0x2, 0xf3, 0x2f, 0x30, 0xc, 0x80, 0x7, 0xd0, - 0x8d, 0x0, 0x0, 0xc9, - - /* U+0059 "Y" */ - 0xc, 0x80, 0x0, 0xa, 0x80, 0x3f, 0x10, 0x3, - 0xe0, 0x0, 0xaa, 0x0, 0xc6, 0x0, 0x1, 0xf3, - 0x5d, 0x0, 0x0, 0x7, 0xce, 0x40, 0x0, 0x0, - 0xe, 0xb0, 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, - 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0xb7, 0x0, - 0x0, - - /* U+005A "Z" */ - 0x6f, 0xff, 0xff, 0xf5, 0x2, 0x22, 0x29, 0xd0, - 0x0, 0x0, 0x3f, 0x30, 0x0, 0x1, 0xe6, 0x0, - 0x0, 0xb, 0xa0, 0x0, 0x0, 0x8d, 0x0, 0x0, - 0x4, 0xf2, 0x0, 0x0, 0x1e, 0x82, 0x22, 0x21, - 0x7f, 0xff, 0xff, 0xf8, - - /* U+005B "[" */ - 0xbf, 0xcb, 0x60, 0xb6, 0xb, 0x60, 0xb6, 0xb, - 0x60, 0xb6, 0xb, 0x60, 0xb6, 0xb, 0x60, 0xb6, - 0xb, 0x60, 0xbf, 0xc0, - - /* U+005C "\\" */ - 0x35, 0x0, 0x0, 0x2e, 0x0, 0x0, 0xd, 0x30, - 0x0, 0x8, 0x80, 0x0, 0x3, 0xd0, 0x0, 0x0, - 0xd2, 0x0, 0x0, 0x87, 0x0, 0x0, 0x3c, 0x0, - 0x0, 0xe, 0x10, 0x0, 0x9, 0x70, 0x0, 0x4, - 0xc0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xa6, - - /* U+005D "]" */ - 0xcf, 0xb0, 0x7b, 0x6, 0xb0, 0x6b, 0x6, 0xb0, - 0x6b, 0x6, 0xb0, 0x6b, 0x6, 0xb0, 0x6b, 0x6, - 0xb0, 0x7b, 0xcf, 0xb0, - - /* U+005E "^" */ - 0x0, 0x7, 0x0, 0x0, 0x5, 0xe5, 0x0, 0x0, - 0xb4, 0xb0, 0x0, 0x2c, 0xc, 0x20, 0x8, 0x60, - 0x68, 0x0, 0xd0, 0x0, 0xd0, - - /* U+005F "_" */ - 0xdd, 0xdd, 0xdd, - - /* U+0060 "`" */ - 0x27, 0x10, 0x5, 0xc1, - - /* U+0061 "a" */ - 0x8, 0xdf, 0xc3, 0x0, 0xa4, 0x29, 0xd0, 0x0, - 0x0, 0x1f, 0x10, 0x8d, 0xee, 0xf2, 0x4e, 0x10, - 0xf, 0x24, 0xe0, 0x7, 0xf2, 0x9, 0xed, 0x8f, - 0x20, - - /* U+0062 "b" */ - 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, - 0x0, 0x0, 0xe, 0x7c, 0xfc, 0x40, 0xef, 0x52, - 0x8f, 0x2e, 0x60, 0x0, 0xb8, 0xe4, 0x0, 0x8, - 0xae, 0x60, 0x0, 0xb8, 0xef, 0x52, 0x8f, 0x2e, - 0x6d, 0xfc, 0x40, - - /* U+0063 "c" */ - 0x2, 0xbf, 0xe8, 0x0, 0xda, 0x24, 0xc3, 0x5d, - 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x5d, 0x0, - 0x0, 0x0, 0xda, 0x24, 0xd3, 0x2, 0xbf, 0xe8, - 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1, 0xf1, - 0x0, 0x0, 0x1, 0xf1, 0x2, 0xbf, 0xd6, 0xf1, - 0xe, 0x92, 0x3d, 0xf1, 0x5d, 0x0, 0x4, 0xf1, - 0x7b, 0x0, 0x1, 0xf1, 0x5d, 0x0, 0x3, 0xf1, - 0xe, 0x91, 0x2d, 0xf1, 0x2, 0xbf, 0xe6, 0xf1, - - /* U+0065 "e" */ - 0x2, 0xbf, 0xd5, 0x0, 0xe8, 0x14, 0xe4, 0x5c, - 0x0, 0x6, 0xb7, 0xfe, 0xee, 0xec, 0x5d, 0x0, - 0x0, 0x0, 0xe9, 0x23, 0xa2, 0x2, 0xbf, 0xe9, - 0x0, - - /* U+0066 "f" */ - 0x1, 0xcf, 0x60, 0x9a, 0x11, 0xb, 0x60, 0xd, - 0xff, 0xf3, 0xb, 0x60, 0x0, 0xb6, 0x0, 0xb, - 0x60, 0x0, 0xb6, 0x0, 0xb, 0x60, 0x0, 0xb6, - 0x0, - - /* U+0067 "g" */ - 0x2, 0xbf, 0xe6, 0xe2, 0xe, 0xa2, 0x3c, 0xf2, - 0x5d, 0x0, 0x2, 0xf2, 0x7b, 0x0, 0x0, 0xf2, - 0x5d, 0x0, 0x2, 0xf2, 0xe, 0xa2, 0x3d, 0xf2, - 0x2, 0xbf, 0xe5, 0xf2, 0x0, 0x0, 0x2, 0xf0, - 0xc, 0x62, 0x3b, 0xa0, 0x6, 0xdf, 0xea, 0x10, - - /* U+0068 "h" */ - 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, - 0x0, 0x0, 0xe, 0x7d, 0xfc, 0x20, 0xee, 0x42, - 0xac, 0xe, 0x60, 0x2, 0xf0, 0xe4, 0x0, 0xf, - 0x1e, 0x40, 0x0, 0xf2, 0xe4, 0x0, 0xf, 0x2e, - 0x40, 0x0, 0xf2, - - /* U+0069 "i" */ - 0xd, 0x40, 0x82, 0x0, 0x0, 0xe4, 0xe, 0x40, - 0xe4, 0xe, 0x40, 0xe4, 0xe, 0x40, 0xe4, - - /* U+006A "j" */ - 0x0, 0xd, 0x50, 0x0, 0x72, 0x0, 0x0, 0x0, - 0x0, 0xd4, 0x0, 0xd, 0x40, 0x0, 0xd4, 0x0, - 0xd, 0x40, 0x0, 0xd4, 0x0, 0xd, 0x40, 0x0, - 0xd4, 0x0, 0xd, 0x40, 0x22, 0xf2, 0xd, 0xf8, - 0x0, - - /* U+006B "k" */ - 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, - 0x0, 0x0, 0xe, 0x40, 0xb, 0xa0, 0xe4, 0xb, - 0xb0, 0xe, 0x4b, 0xc0, 0x0, 0xee, 0xfd, 0x0, - 0xe, 0xc1, 0xd9, 0x0, 0xe4, 0x2, 0xf4, 0xe, - 0x40, 0x6, 0xe1, - - /* U+006C "l" */ - 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, - 0xe4, 0xe4, - - /* U+006D "m" */ - 0xe7, 0xdf, 0xb2, 0x9e, 0xe8, 0xe, 0xd3, 0x2c, - 0xfb, 0x23, 0xe5, 0xe6, 0x0, 0x4f, 0x10, 0x9, - 0x9e, 0x40, 0x3, 0xf0, 0x0, 0x8a, 0xe4, 0x0, - 0x3f, 0x0, 0x8, 0xae, 0x40, 0x3, 0xf0, 0x0, - 0x8a, 0xe4, 0x0, 0x3f, 0x0, 0x8, 0xa0, - - /* U+006E "n" */ - 0xe6, 0xdf, 0xc2, 0xe, 0xe4, 0x1a, 0xc0, 0xe6, - 0x0, 0x1f, 0xe, 0x40, 0x0, 0xf1, 0xe4, 0x0, - 0xf, 0x2e, 0x40, 0x0, 0xf2, 0xe4, 0x0, 0xf, - 0x20, - - /* U+006F "o" */ - 0x2, 0xbf, 0xe8, 0x0, 0xe, 0xa2, 0x3e, 0x80, - 0x5d, 0x0, 0x4, 0xf0, 0x7b, 0x0, 0x1, 0xf1, - 0x5d, 0x0, 0x4, 0xf0, 0xd, 0xa2, 0x3e, 0x80, - 0x2, 0xbf, 0xe8, 0x0, - - /* U+0070 "p" */ - 0xe7, 0xdf, 0xc4, 0xe, 0xf4, 0x16, 0xf2, 0xe6, - 0x0, 0xa, 0x8e, 0x40, 0x0, 0x8a, 0xe7, 0x0, - 0xb, 0x8e, 0xf5, 0x28, 0xf2, 0xe6, 0xcf, 0xc4, - 0xe, 0x40, 0x0, 0x0, 0xe4, 0x0, 0x0, 0xe, - 0x40, 0x0, 0x0, - - /* U+0071 "q" */ - 0x2, 0xbf, 0xd5, 0xf1, 0xe, 0xa2, 0x3e, 0xf1, - 0x5d, 0x0, 0x4, 0xf1, 0x7b, 0x0, 0x1, 0xf1, - 0x5d, 0x0, 0x4, 0xf1, 0xe, 0xa2, 0x3e, 0xf1, - 0x2, 0xbf, 0xd5, 0xf1, 0x0, 0x0, 0x1, 0xf1, - 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1, 0xf1, - - /* U+0072 "r" */ - 0xe6, 0xd8, 0xee, 0x61, 0xe7, 0x0, 0xe4, 0x0, - 0xe4, 0x0, 0xe4, 0x0, 0xe4, 0x0, - - /* U+0073 "s" */ - 0x9, 0xef, 0xc2, 0x6d, 0x22, 0x61, 0x7d, 0x20, - 0x0, 0x9, 0xfe, 0x91, 0x0, 0x2, 0xc9, 0x56, - 0x22, 0xb8, 0x4c, 0xfe, 0xa0, - - /* U+0074 "t" */ - 0x5, 0x30, 0x0, 0xb6, 0x0, 0xdf, 0xff, 0x30, - 0xb6, 0x0, 0xb, 0x60, 0x0, 0xb6, 0x0, 0xb, - 0x60, 0x0, 0xaa, 0x11, 0x2, 0xdf, 0x60, - - /* U+0075 "u" */ - 0xf3, 0x0, 0x2f, 0xf, 0x30, 0x2, 0xf0, 0xf3, - 0x0, 0x2f, 0xf, 0x30, 0x2, 0xf0, 0xe4, 0x0, - 0x4f, 0xa, 0xb2, 0x2c, 0xf0, 0x1b, 0xfe, 0x6f, - 0x0, - - /* U+0076 "v" */ - 0xd, 0x50, 0x0, 0x98, 0x6, 0xc0, 0x0, 0xf2, - 0x1, 0xf2, 0x6, 0xb0, 0x0, 0xa8, 0xc, 0x50, - 0x0, 0x3e, 0x3e, 0x0, 0x0, 0xd, 0xd8, 0x0, - 0x0, 0x6, 0xf2, 0x0, - - /* U+0077 "w" */ - 0xc5, 0x0, 0x3f, 0x10, 0x7, 0x86, 0xa0, 0x9, - 0xf6, 0x0, 0xd3, 0x1f, 0x0, 0xe7, 0xb0, 0x2d, - 0x0, 0xb5, 0x4c, 0xe, 0x18, 0x80, 0x6, 0xa9, - 0x60, 0xa6, 0xd3, 0x0, 0x1f, 0xe1, 0x4, 0xed, - 0x0, 0x0, 0xbb, 0x0, 0xe, 0x80, 0x0, - - /* U+0078 "x" */ - 0x5d, 0x0, 0x4e, 0x10, 0xa9, 0x1e, 0x40, 0x1, - 0xed, 0x90, 0x0, 0x8, 0xf1, 0x0, 0x2, 0xeb, - 0xa0, 0x0, 0xc7, 0xd, 0x60, 0x7c, 0x0, 0x3f, - 0x20, - - /* U+0079 "y" */ - 0xd, 0x50, 0x0, 0x98, 0x7, 0xb0, 0x0, 0xe2, - 0x1, 0xf2, 0x5, 0xc0, 0x0, 0xa7, 0xb, 0x50, - 0x0, 0x4d, 0x1e, 0x0, 0x0, 0xe, 0xb9, 0x0, - 0x0, 0x8, 0xf3, 0x0, 0x0, 0x5, 0xd0, 0x0, - 0x5, 0x2c, 0x60, 0x0, 0x1c, 0xf9, 0x0, 0x0, - - /* U+007A "z" */ - 0x7f, 0xff, 0xfb, 0x0, 0x2, 0xf3, 0x0, 0xc, - 0x70, 0x0, 0x9b, 0x0, 0x4, 0xe1, 0x0, 0x1e, - 0x50, 0x0, 0x8f, 0xff, 0xfd, - - /* U+007B "{" */ - 0x0, 0xbf, 0x4, 0xe1, 0x5, 0xc0, 0x5, 0xc0, - 0x5, 0xc0, 0x6, 0xc0, 0x4f, 0x60, 0x8, 0xc0, - 0x5, 0xc0, 0x5, 0xc0, 0x5, 0xc0, 0x4, 0xe1, - 0x0, 0xbf, - - /* U+007C "|" */ - 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, - 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, - - /* U+007D "}" */ - 0xcd, 0x10, 0xc, 0x70, 0x9, 0x90, 0x9, 0x90, - 0x9, 0x90, 0x8, 0xa0, 0x3, 0xf7, 0x8, 0xb0, - 0x9, 0x90, 0x9, 0x90, 0x9, 0x90, 0xc, 0x80, - 0xcd, 0x20, - - /* U+007E "~" */ - 0xb, 0xe8, 0xa, 0x33, 0x91, 0x8d, 0xa0, - - /* U+00B0 "°" */ - 0x6, 0xb7, 0x3, 0x80, 0x84, 0x64, 0x3, 0x73, - 0x80, 0x84, 0x6, 0xb7, 0x0, - - /* U+2022 "•" */ - 0x4, 0x22, 0xfe, 0xd, 0xa0, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, - 0x0, 0x3, 0x7c, 0xff, 0x0, 0x0, 0x59, 0xef, - 0xff, 0xff, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xf, 0xff, 0xfd, 0x84, 0x8f, 0x0, 0xf, - 0xd7, 0x20, 0x0, 0x8f, 0x0, 0xf, 0x80, 0x0, - 0x0, 0x8f, 0x0, 0xf, 0x80, 0x0, 0x0, 0x8f, - 0x0, 0xf, 0x80, 0x0, 0x7b, 0xdf, 0x2, 0x3f, - 0x80, 0x6, 0xff, 0xff, 0xaf, 0xff, 0x80, 0x2, - 0xef, 0xf9, 0xef, 0xff, 0x60, 0x0, 0x2, 0x10, - 0x29, 0xa7, 0x0, 0x0, 0x0, 0x0, - - /* U+F008 "" */ - 0xb4, 0xdf, 0xff, 0xff, 0xfd, 0x4b, 0xe8, 0xe7, - 0x22, 0x22, 0x7e, 0x8e, 0xc0, 0xc5, 0x0, 0x0, - 0x6c, 0xc, 0xfc, 0xf6, 0x11, 0x11, 0x7f, 0xcf, - 0xc0, 0xcf, 0xff, 0xff, 0xfb, 0xc, 0xfc, 0xf6, - 0x11, 0x11, 0x7f, 0xcf, 0xc0, 0xc5, 0x0, 0x0, - 0x6c, 0xc, 0xe8, 0xe7, 0x22, 0x22, 0x7e, 0x8e, - 0xb4, 0xdf, 0xff, 0xff, 0xfd, 0x4b, - - /* U+F00B "" */ - 0xdf, 0xf6, 0x9f, 0xff, 0xff, 0xfd, 0xff, 0xf8, - 0xcf, 0xff, 0xff, 0xff, 0xef, 0xf6, 0xaf, 0xff, - 0xff, 0xfe, 0x13, 0x20, 0x3, 0x33, 0x33, 0x31, - 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, - 0xff, 0xff, 0x13, 0x20, 0x3, 0x33, 0x33, 0x31, - 0xef, 0xf6, 0xaf, 0xff, 0xff, 0xfe, 0xff, 0xf8, - 0xcf, 0xff, 0xff, 0xff, 0xdf, 0xf6, 0xaf, 0xff, - 0xff, 0xfd, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0xd4, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf4, 0x4d, 0x30, 0x0, 0x3f, 0xff, 0x40, - 0xef, 0xf3, 0x3, 0xff, 0xf4, 0x0, 0x4f, 0xff, - 0x6f, 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x3, 0xd3, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x14, 0x0, 0x0, 0x22, 0xd, 0xf7, 0x0, 0x4f, - 0xf1, 0x9f, 0xf7, 0x4f, 0xfd, 0x0, 0xaf, 0xff, - 0xfd, 0x10, 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x4f, - 0xff, 0xf7, 0x0, 0x4f, 0xfd, 0xaf, 0xf7, 0xe, - 0xfd, 0x10, 0xaf, 0xf2, 0x5b, 0x10, 0x0, 0x99, - 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x7, 0x70, 0x0, 0x0, 0x0, 0x32, - 0xf, 0xf0, 0x24, 0x0, 0x5, 0xfc, 0xf, 0xf0, - 0xcf, 0x50, 0x1f, 0xf4, 0xf, 0xf0, 0x5f, 0xf1, - 0x7f, 0x80, 0xf, 0xf0, 0x8, 0xf7, 0xbf, 0x20, - 0xf, 0xf0, 0x2, 0xfb, 0xcf, 0x10, 0xe, 0xe0, - 0x1, 0xfc, 0xaf, 0x40, 0x1, 0x10, 0x4, 0xfa, - 0x5f, 0xb0, 0x0, 0x0, 0xb, 0xf6, 0xd, 0xfa, - 0x10, 0x1, 0xaf, 0xd0, 0x2, 0xdf, 0xfc, 0xcf, - 0xfd, 0x20, 0x0, 0x8, 0xef, 0xfe, 0x91, 0x0, - 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x14, 0x41, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf7, 0x0, 0x0, 0x3, 0x43, 0xdf, 0xfd, - 0x34, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x6f, 0xff, 0xfb, 0xbf, 0xff, 0xf6, 0x1b, 0xff, - 0x70, 0x7, 0xff, 0xb1, 0x7, 0xff, 0x20, 0x2, - 0xff, 0x70, 0x1b, 0xff, 0x70, 0x7, 0xff, 0xb1, - 0x6f, 0xff, 0xfb, 0xbf, 0xff, 0xf6, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x3, 0x42, 0xcf, 0xfc, - 0x23, 0x30, 0x0, 0x0, 0x7f, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x41, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x73, 0x3, 0x83, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0x67, 0xf7, 0x0, 0x0, 0x3, - 0xee, 0x5a, 0xfe, 0xf7, 0x0, 0x0, 0x6f, 0xd3, - 0xb5, 0x7f, 0xf7, 0x0, 0x9, 0xfb, 0x3d, 0xff, - 0x85, 0xfe, 0x30, 0xbf, 0x95, 0xff, 0xff, 0xfb, - 0x3e, 0xf4, 0x76, 0x6f, 0xff, 0xff, 0xff, 0xd2, - 0xa1, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xfa, 0x2, 0xff, 0xf4, 0x0, 0x0, - 0xcf, 0xfa, 0x2, 0xff, 0xf4, 0x0, 0x0, 0xaf, - 0xf8, 0x1, 0xff, 0xf3, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x27, 0x72, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, - 0x23, 0x33, 0x5f, 0xf5, 0x33, 0x32, 0xff, 0xff, - 0xa4, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x8f, - 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, - - /* U+F01C "" */ - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, - 0xed, 0x88, 0x88, 0x89, 0xf8, 0x0, 0xa, 0xf2, - 0x0, 0x0, 0x0, 0xaf, 0x30, 0x5f, 0x70, 0x0, - 0x0, 0x0, 0x1e, 0xc0, 0xef, 0x88, 0x60, 0x0, - 0x28, 0x8b, 0xf6, 0xff, 0xff, 0xf3, 0x0, 0xbf, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - - /* U+F021 "" */ - 0x0, 0x0, 0x1, 0x10, 0x0, 0x59, 0x0, 0x19, - 0xef, 0xfd, 0x70, 0x9f, 0x3, 0xef, 0xda, 0x9d, - 0xfe, 0xbf, 0xe, 0xf6, 0x0, 0x0, 0x5f, 0xff, - 0x7f, 0x70, 0x0, 0x3f, 0xff, 0xff, 0x69, 0x0, - 0x0, 0x2a, 0xaa, 0xa9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaa, 0xaa, 0xa2, 0x0, 0x0, 0xa6, - 0xff, 0xfe, 0xf3, 0x0, 0x7, 0xf7, 0xff, 0xf5, - 0x0, 0x0, 0x7f, 0xe0, 0xfb, 0xef, 0xd9, 0xad, - 0xfe, 0x30, 0xfa, 0x8, 0xef, 0xfe, 0x91, 0x0, - 0x95, 0x0, 0x1, 0x10, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x2a, 0x0, 0x2, 0xef, 0x78, 0x8e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0xff, 0x0, 0x7, 0xff, - 0x0, 0x0, 0x7f, 0x0, 0x0, 0x1, - - /* U+F027 "" */ - 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x2e, 0xf0, - 0x0, 0x78, 0x8e, 0xff, 0x3, 0xf, 0xff, 0xff, - 0xf0, 0xba, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, - 0xff, 0xf0, 0xaa, 0xdf, 0xff, 0xff, 0x4, 0x0, - 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x0, 0x8f, 0x0, - 0x0, 0x0, 0x0, 0x10, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xd2, 0x0, 0x0, 0x0, - 0x2a, 0x0, 0x11, 0x8e, 0x10, 0x0, 0x2, 0xef, - 0x0, 0x7d, 0x2b, 0x90, 0x78, 0x8e, 0xff, 0x3, - 0xa, 0xb3, 0xf0, 0xff, 0xff, 0xff, 0xb, 0xa1, - 0xf1, 0xe3, 0xff, 0xff, 0xff, 0x3, 0xf0, 0xe3, - 0xc5, 0xff, 0xff, 0xff, 0xb, 0xa1, 0xf1, 0xe3, - 0xdf, 0xff, 0xff, 0x3, 0xa, 0xb3, 0xf0, 0x0, - 0x7, 0xff, 0x0, 0x7d, 0x2b, 0x90, 0x0, 0x0, - 0x7f, 0x0, 0x11, 0x9e, 0x10, 0x0, 0x0, 0x1, - 0x0, 0x6, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfd, 0x5b, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x1, 0xff, 0xff, - 0xef, 0xff, 0xfb, 0x18, 0xff, 0xf6, 0x1c, 0xff, - 0xff, 0xfc, 0xff, 0x60, 0x1, 0xdf, 0xff, 0x60, - 0x96, 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xfc, 0x88, 0x88, 0x88, 0x88, 0xcf, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+F043 "" */ - 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0xcf, 0x10, - 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0xa, 0xff, - 0xe0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, 0xef, - 0xff, 0xff, 0x30, 0x8f, 0xff, 0xff, 0xfc, 0xe, - 0xff, 0xff, 0xff, 0xf2, 0xf9, 0xcf, 0xff, 0xff, - 0x3d, 0xc5, 0xff, 0xff, 0xf1, 0x6f, 0xa3, 0xbf, - 0xfa, 0x0, 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x26, - 0x74, 0x0, 0x0, - - /* U+F048 "" */ - 0x58, 0x0, 0x0, 0x35, 0x9f, 0x10, 0x5, 0xfe, - 0x9f, 0x10, 0x6f, 0xfe, 0x9f, 0x17, 0xff, 0xfe, - 0x9f, 0x9f, 0xff, 0xfe, 0x9f, 0xff, 0xff, 0xfe, - 0x9f, 0xef, 0xff, 0xfe, 0x9f, 0x2d, 0xff, 0xfe, - 0x9f, 0x10, 0xcf, 0xfe, 0x9f, 0x10, 0xb, 0xfe, - 0x8f, 0x0, 0x0, 0x9b, 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x46, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x40, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xfd, 0x50, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xb1, 0xff, 0xff, 0xff, 0xfd, - 0x40, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, - 0xff, 0xa1, 0x0, 0x0, 0xf, 0xfd, 0x40, 0x0, - 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0xaf, 0xfe, 0x30, 0xaf, 0xfe, 0x3f, 0xff, 0xf7, - 0xf, 0xff, 0xf7, 0xff, 0xff, 0x80, 0xff, 0xff, - 0x8f, 0xff, 0xf8, 0xf, 0xff, 0xf8, 0xff, 0xff, - 0x80, 0xff, 0xff, 0x8f, 0xff, 0xf8, 0xf, 0xff, - 0xf8, 0xff, 0xff, 0x80, 0xff, 0xff, 0x8f, 0xff, - 0xf8, 0xf, 0xff, 0xf8, 0xff, 0xff, 0x80, 0xff, - 0xff, 0x8f, 0xff, 0xf7, 0xf, 0xff, 0xf7, 0x48, - 0x98, 0x10, 0x48, 0x98, 0x10, - - /* U+F04D "" */ - 0x48, 0x88, 0x88, 0x88, 0x88, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, - 0xff, 0xff, 0xff, 0xfe, 0x30, - - /* U+F051 "" */ - 0x26, 0x0, 0x0, 0x58, 0x7f, 0xa0, 0x0, 0xbf, - 0x8f, 0xfb, 0x0, 0xbf, 0x8f, 0xff, 0xc1, 0xbf, - 0x8f, 0xff, 0xfd, 0xcf, 0x8f, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xef, 0x8f, 0xff, 0xf4, 0xbf, - 0x8f, 0xff, 0x40, 0xbf, 0x8f, 0xe3, 0x0, 0xbf, - 0x5d, 0x20, 0x0, 0xae, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xfa, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0x90, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf8, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x1, 0x34, 0x44, 0x44, 0x44, 0x30, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xf5, - - /* U+F053 "" */ - 0x0, 0x0, 0x3, 0x10, 0x0, 0x5, 0xfb, 0x0, - 0x5, 0xff, 0x40, 0x5, 0xff, 0x40, 0x5, 0xff, - 0x50, 0x3, 0xff, 0x50, 0x0, 0xb, 0xfc, 0x10, - 0x0, 0xb, 0xfc, 0x10, 0x0, 0xc, 0xfc, 0x10, - 0x0, 0xc, 0xfb, 0x0, 0x0, 0xa, 0x50, - - /* U+F054 "" */ - 0x3, 0x10, 0x0, 0x3, 0xfc, 0x10, 0x0, 0xb, - 0xfc, 0x10, 0x0, 0xb, 0xfc, 0x10, 0x0, 0xb, - 0xfc, 0x10, 0x0, 0xd, 0xfb, 0x0, 0x5, 0xff, - 0x50, 0x5, 0xff, 0x50, 0x5, 0xff, 0x50, 0x3, - 0xff, 0x50, 0x0, 0xa, 0x50, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x69, 0x10, 0x0, 0x0, 0x0, 0xd, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, 0x0, - 0x0, 0x0, 0xe, 0xf6, 0x0, 0x0, 0x58, 0x88, - 0xff, 0xb8, 0x88, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x9b, 0xbb, 0xff, 0xdb, 0xbb, 0x30, 0x0, - 0xe, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, - 0x0, 0x0, 0x0, 0xe, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x9d, 0x20, 0x0, 0x0, - - /* U+F068 "" */ - 0x46, 0x66, 0x66, 0x66, 0x66, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, - 0x40, - - /* U+F06E "" */ - 0x0, 0x3, 0xad, 0xff, 0xc7, 0x0, 0x0, 0x0, - 0x9f, 0xe6, 0x24, 0xaf, 0xe3, 0x0, 0xb, 0xff, - 0x20, 0x77, 0x9, 0xff, 0x40, 0x7f, 0xf9, 0x0, - 0xcf, 0xa1, 0xff, 0xe1, 0xef, 0xf6, 0x7f, 0xff, - 0xf0, 0xef, 0xf7, 0x8f, 0xf9, 0x3f, 0xff, 0xc1, - 0xff, 0xe1, 0xb, 0xff, 0x26, 0xca, 0x19, 0xff, - 0x40, 0x0, 0x9f, 0xe6, 0x24, 0xaf, 0xe3, 0x0, - 0x0, 0x3, 0x9d, 0xff, 0xc7, 0x0, 0x0, - - /* U+F070 "" */ - 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xf8, 0x4a, 0xef, 0xeb, 0x50, 0x0, 0x0, - 0x0, 0x9f, 0xfd, 0x52, 0x5d, 0xfc, 0x10, 0x0, - 0x0, 0x5, 0xfe, 0x4a, 0x70, 0xcf, 0xe1, 0x0, - 0xb, 0x80, 0x2d, 0xff, 0xf7, 0x4f, 0xfb, 0x0, - 0x2f, 0xfb, 0x0, 0xaf, 0xfb, 0x2f, 0xff, 0x30, - 0xb, 0xff, 0x50, 0x7, 0xfe, 0x7f, 0xfb, 0x0, - 0x1, 0xdf, 0xc0, 0x0, 0x3e, 0xff, 0xe1, 0x0, - 0x0, 0x1b, 0xfc, 0x42, 0x1, 0xbf, 0xa0, 0x0, - 0x0, 0x0, 0x5b, 0xef, 0xb0, 0x8, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xfd, 0xef, 0xa0, 0x0, 0x0, 0x0, 0xb, - 0xfb, 0x3, 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, - 0xc0, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0xdf, 0xfd, - 0x5, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xf8, - 0xcf, 0xff, 0xe1, 0x0, 0x1f, 0xff, 0xfc, 0x4, - 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xd2, 0x7f, - 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x87, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xc1, 0xff, 0xf8, 0x0, 0x2e, - 0xff, 0xfc, 0xcd, 0xff, 0x62, 0xef, 0xdf, 0xf9, - 0x0, 0x2c, 0x4e, 0xf9, 0xf, 0x90, 0x0, 0x2, - 0xef, 0x90, 0x7, 0x0, 0x0, 0x2e, 0xf8, 0x88, - 0xf, 0xa0, 0xcd, 0xff, 0x80, 0xdf, 0xdf, 0xf9, - 0xff, 0xf8, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x10, - - /* U+F077 "" */ - 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xf9, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf9, 0x0, - 0x0, 0x2e, 0xf9, 0x2e, 0xf9, 0x0, 0x2e, 0xf9, - 0x0, 0x2e, 0xf9, 0xb, 0xf9, 0x0, 0x0, 0x2e, - 0xf4, 0x27, 0x0, 0x0, 0x0, 0x27, 0x0, - - /* U+F078 "" */ - 0x27, 0x0, 0x0, 0x0, 0x27, 0xb, 0xf9, 0x0, - 0x0, 0x2e, 0xf4, 0x2e, 0xf9, 0x0, 0x2e, 0xf9, - 0x0, 0x2e, 0xf9, 0x2e, 0xf9, 0x0, 0x0, 0x2e, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x2e, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xc0, 0x7, 0x77, 0x77, 0x72, 0x0, - 0x3, 0xff, 0xfc, 0x2e, 0xff, 0xff, 0xf9, 0x0, - 0xf, 0xcf, 0xcf, 0xa0, 0x0, 0x0, 0xe9, 0x0, - 0x4, 0x1e, 0x93, 0x20, 0x0, 0x0, 0xe9, 0x0, - 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0xe9, 0x0, - 0x0, 0xe, 0x90, 0x0, 0x0, 0xb5, 0xe9, 0x97, - 0x0, 0xe, 0xc7, 0x77, 0x73, 0xbf, 0xff, 0xf6, - 0x0, 0xd, 0xff, 0xff, 0xfd, 0xb, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, - - /* U+F07B "" */ - 0xbf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x98, 0x88, 0x74, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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, 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+F093 "" */ - 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xe3, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfe, - 0x30, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, - 0x23, 0x32, 0x8f, 0xf8, 0x23, 0x32, 0xff, 0xfe, - 0x39, 0x93, 0xef, 0xff, 0xff, 0xff, 0xc9, 0x9c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x8f, - 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x62, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x1, - 0x0, 0x9, 0xff, 0x40, 0x1, 0x8e, 0xe1, 0x1a, - 0xff, 0x70, 0x0, 0xef, 0xff, 0xde, 0xff, 0x90, - 0x0, 0xc, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x8f, 0xff, 0xe9, 0x10, 0x0, 0x0, 0x2, 0x76, - 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C4 "" */ - 0x7, 0x93, 0x0, 0x0, 0x22, 0xa, 0xff, 0xf2, - 0x0, 0x8f, 0xf5, 0xf9, 0x1f, 0x70, 0x8f, 0xf9, - 0xc, 0xfc, 0xf8, 0x8f, 0xf9, 0x0, 0x1a, 0xef, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0xef, 0xfc, 0x0, - 0x0, 0x7, 0xbf, 0xff, 0xf6, 0x0, 0xa, 0xff, - 0xfa, 0xbf, 0xf6, 0x0, 0xf9, 0x1f, 0x70, 0xbf, - 0xf6, 0xc, 0xfc, 0xf4, 0x0, 0xbf, 0xf4, 0x1a, - 0xc6, 0x0, 0x0, 0x56, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x3, 0x44, 0x41, 0x20, 0x0, 0x0, 0xff, - 0xff, 0x5e, 0x40, 0x24, 0x1f, 0xff, 0xf5, 0xee, - 0x2f, 0xf4, 0xff, 0xff, 0xc8, 0x82, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0x5f, 0xf4, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0x4f, 0xff, 0xff, 0xff, 0x5f, 0xf4, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0x5f, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0x93, 0x44, 0x44, 0x43, 0xf, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x68, 0x88, 0x88, 0x71, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x48, 0x88, 0x88, 0x87, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0xf8, 0x0, 0x0, 0xb, 0xfb, - 0xf, 0x80, 0x0, 0x0, 0xbf, 0xf3, 0xfb, 0x77, - 0x77, 0x7d, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0x42, 0xdf, 0xff, 0x4f, 0xff, - 0xc0, 0x8, 0xff, 0xf4, 0xff, 0xfe, 0x0, 0xaf, - 0xff, 0x4f, 0xff, 0xfc, 0xaf, 0xff, 0xf4, 0xaf, - 0xff, 0xff, 0xff, 0xfd, 0x10, - - /* U+F0C9 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x99, - 0x99, 0x99, 0x99, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x12, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9a, 0xaa, 0xaa, 0xaa, - 0xaa, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0E0 "" */ - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0xc3, 0xbf, 0xff, 0xff, 0xfb, 0x3c, - 0xff, 0x57, 0xff, 0xff, 0x75, 0xff, 0xff, 0xf9, - 0x3d, 0xd3, 0x9f, 0xff, 0xff, 0xff, 0xd5, 0x5d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+F0E7 "" */ - 0x1, 0xbb, 0xba, 0x10, 0x0, 0x5f, 0xff, 0xf1, - 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, - 0x60, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, - 0xff, 0xff, 0xf1, 0xe, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, 0xff, 0x50, - 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x7, 0xf3, - 0x0, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x2a, 0x50, 0x0, 0x0, 0xe, 0xff, 0x8f, - 0xff, 0x20, 0x0, 0xff, 0xf8, 0xff, 0xf4, 0x0, - 0xf, 0xff, 0xeb, 0xbb, 0x30, 0x0, 0xff, 0xf4, - 0x99, 0x92, 0x60, 0xf, 0xff, 0x5f, 0xff, 0x4f, - 0xa0, 0xff, 0xf5, 0xff, 0xf5, 0x56, 0x1f, 0xff, - 0x5f, 0xff, 0xff, 0xf4, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0x4e, 0xff, 0x5f, 0xff, 0xff, 0xf4, 0x0, - 0x5, 0xff, 0xff, 0xff, 0x40, 0x0, 0x5f, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x44, 0x44, 0x44, 0x0, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xf1, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xf7, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0x50, 0x6f, 0xff, 0xff, 0xff, - 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x24, - 0x44, 0x44, 0x44, 0x43, 0x0, 0x0, 0x2f, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xfc, - 0x8e, 0x8e, 0x8e, 0x88, 0xe8, 0xf7, 0xf8, 0xc, - 0xc, 0xb, 0x0, 0xb0, 0xf8, 0xff, 0xec, 0xfc, - 0xec, 0xee, 0xcf, 0xf8, 0xff, 0xa0, 0xc0, 0xa0, - 0x77, 0x2f, 0xf8, 0xff, 0xec, 0xfc, 0xec, 0xee, - 0xcf, 0xf8, 0xf8, 0xc, 0x0, 0x0, 0x0, 0xb0, - 0xf8, 0xfc, 0x8e, 0x88, 0x88, 0x88, 0xe8, 0xf7, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x18, 0xef, 0xe0, 0x0, 0x0, - 0x0, 0x29, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3a, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x4c, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x1, 0x34, 0x44, 0xdf, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, - 0x0, 0x0, 0x0, - - /* U+F15B "" */ - 0x9b, 0xbb, 0xb2, 0x70, 0xf, 0xff, 0xff, 0x4f, - 0x90, 0xff, 0xff, 0xf4, 0xff, 0x9f, 0xff, 0xff, - 0x54, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x44, - 0x44, 0x44, 0x30, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x9b, 0xcb, 0x95, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xef, - 0xfa, 0x53, 0x23, 0x5a, 0xff, 0xe3, 0xdf, 0xa1, - 0x0, 0x0, 0x0, 0x1, 0xaf, 0xd2, 0x60, 0x5, - 0xbe, 0xfe, 0xb5, 0x0, 0x52, 0x0, 0x1c, 0xff, - 0xfe, 0xff, 0xfc, 0x10, 0x0, 0x2, 0xec, 0x40, - 0x0, 0x4c, 0xe2, 0x0, 0x0, 0x1, 0x0, 0x1, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd6, 0x0, - 0x0, 0x0, - - /* U+F240 "" */ - 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, - 0x34, 0x44, 0x44, 0x44, 0x44, 0x4f, 0xdf, 0x8c, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0xcf, 0xf8, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0x8, 0xff, 0x89, 0xcc, - 0xcc, 0xcc, 0xcc, 0xc3, 0xff, 0xfb, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F241 "" */ - 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, - 0x34, 0x44, 0x44, 0x43, 0x0, 0x4f, 0xdf, 0x8c, - 0xff, 0xff, 0xff, 0xc0, 0x2, 0xcf, 0xf8, 0xcf, - 0xff, 0xff, 0xfc, 0x0, 0x8, 0xff, 0x89, 0xcc, - 0xcc, 0xcc, 0x90, 0x3, 0xff, 0xfb, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F242 "" */ - 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, - 0x34, 0x44, 0x42, 0x0, 0x0, 0x4f, 0xdf, 0x8c, - 0xff, 0xff, 0x80, 0x0, 0x2, 0xcf, 0xf8, 0xcf, - 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0x89, 0xcc, - 0xcc, 0x60, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F243 "" */ - 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, - 0x34, 0x41, 0x0, 0x0, 0x0, 0x4f, 0xdf, 0x8c, - 0xff, 0x40, 0x0, 0x0, 0x2, 0xcf, 0xf8, 0xcf, - 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0x89, 0xcc, - 0x30, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F244 "" */ - 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xdf, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x25, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xcb, 0xfe, 0x0, 0x0, 0x0, - 0x1, 0x0, 0xd, 0x10, 0x42, 0x0, 0x0, 0x0, - 0x9f, 0xd1, 0x68, 0x0, 0x0, 0x0, 0x68, 0x0, - 0xff, 0xfe, 0xee, 0xed, 0xdd, 0xdd, 0xef, 0xc0, - 0x9f, 0xd1, 0x0, 0xb3, 0x0, 0x0, 0x68, 0x0, - 0x1, 0x0, 0x0, 0x3b, 0x5, 0x74, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xbe, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x34, 0x20, 0x0, 0x0, 0x6e, 0xfe, - 0xfd, 0x20, 0x4, 0xff, 0xf3, 0xff, 0xd0, 0xc, - 0xff, 0xf0, 0x4f, 0xf5, 0xf, 0xd5, 0xf2, 0x95, - 0xf8, 0x2f, 0xf7, 0x41, 0x3c, 0xfa, 0x3f, 0xff, - 0x60, 0xaf, 0xfb, 0x3f, 0xfe, 0x20, 0x4f, 0xfb, - 0x2f, 0xe2, 0x92, 0x75, 0xfa, 0xf, 0xeb, 0xf1, - 0x49, 0xf8, 0x9, 0xff, 0xf0, 0x9f, 0xf2, 0x1, - 0xdf, 0xf9, 0xff, 0x90, 0x0, 0x6, 0xab, 0x95, - 0x0, - - /* U+F2ED "" */ - 0x0, 0x4, 0x88, 0x70, 0x0, 0xb, 0xcc, 0xff, - 0xff, 0xdc, 0xc5, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, - 0x52, 0x88, 0x88, 0x88, 0x88, 0x60, 0x4f, 0xff, - 0xff, 0xff, 0xfc, 0x4, 0xfa, 0xae, 0x6f, 0x5f, - 0xc0, 0x4f, 0xaa, 0xe6, 0xf4, 0xfc, 0x4, 0xfa, - 0xae, 0x6f, 0x4f, 0xc0, 0x4f, 0xaa, 0xe6, 0xf4, - 0xfc, 0x4, 0xfa, 0xae, 0x6f, 0x4f, 0xc0, 0x4f, - 0xaa, 0xe6, 0xf5, 0xfc, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x6, 0x88, 0x88, 0x88, 0x72, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x71, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xd1, 0x0, 0x0, 0x0, - 0x1, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xea, - 0x5f, 0xfd, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x5d, - 0x20, 0x0, 0x2, 0xef, 0xff, 0xf8, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x2, 0xef, - 0xff, 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0xd, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x6, 0x64, - 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+F55A "" */ - 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5, - 0xff, 0xff, 0x91, 0xdd, 0x19, 0xff, 0xf5, 0xff, - 0xff, 0xfd, 0x11, 0x11, 0xdf, 0xff, 0xef, 0xff, - 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xf5, 0xff, 0xff, - 0xfd, 0x11, 0x11, 0xdf, 0xff, 0x5, 0xff, 0xff, - 0x91, 0xdd, 0x19, 0xff, 0xf0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F7C2 "" */ - 0x0, 0x17, 0x88, 0x87, 0x20, 0x2d, 0xff, 0xff, - 0xfd, 0x2e, 0xa0, 0xb3, 0x78, 0xfe, 0xfa, 0xb, - 0x37, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0x4, 0x44, - 0x44, 0x44, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xf0, 0x0, 0x69, 0x0, - 0x0, 0x0, 0xdf, 0x0, 0x7f, 0xc0, 0x0, 0x0, - 0xd, 0xf0, 0x8f, 0xff, 0xdd, 0xdd, 0xdd, 0xff, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 52, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 51, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14, .adv_w = 75, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 22, .adv_w = 135, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 63, .adv_w = 119, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 109, .adv_w = 162, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 154, .adv_w = 132, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 199, .adv_w = 40, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 203, .adv_w = 65, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 223, .adv_w = 65, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 243, .adv_w = 77, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 256, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 277, .adv_w = 44, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 283, .adv_w = 74, .box_w = 4, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 287, .adv_w = 44, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 290, .adv_w = 68, .box_w = 6, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 329, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 365, .adv_w = 71, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 383, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 415, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 447, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 483, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 515, .adv_w = 118, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 551, .adv_w = 115, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 583, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 619, .adv_w = 118, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 651, .adv_w = 44, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 662, .adv_w = 44, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 676, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 701, .adv_w = 112, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 719, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 744, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 776, .adv_w = 199, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 848, .adv_w = 141, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 893, .adv_w = 145, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 929, .adv_w = 139, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 970, .adv_w = 159, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1011, .adv_w = 129, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1043, .adv_w = 122, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1075, .adv_w = 148, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1116, .adv_w = 156, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1152, .adv_w = 60, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1161, .adv_w = 98, .box_w = 6, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1188, .adv_w = 138, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1224, .adv_w = 114, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1256, .adv_w = 183, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1301, .adv_w = 156, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1337, .adv_w = 161, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1382, .adv_w = 139, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1418, .adv_w = 161, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1478, .adv_w = 140, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1514, .adv_w = 119, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1546, .adv_w = 113, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1578, .adv_w = 152, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1614, .adv_w = 137, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1659, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1722, .adv_w = 129, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1758, .adv_w = 124, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1799, .adv_w = 126, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1835, .adv_w = 64, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1855, .adv_w = 68, .box_w = 6, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 1894, .adv_w = 64, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1914, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 1935, .adv_w = 96, .box_w = 6, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1938, .adv_w = 115, .box_w = 4, .box_h = 2, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 1942, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1967, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2002, .adv_w = 110, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2027, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2067, .adv_w = 118, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2092, .adv_w = 68, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2117, .adv_w = 132, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2157, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2192, .adv_w = 54, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2207, .adv_w = 55, .box_w = 5, .box_h = 13, .ofs_x = -2, .ofs_y = -3}, - {.bitmap_index = 2240, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2275, .adv_w = 54, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2285, .adv_w = 203, .box_w = 11, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2324, .adv_w = 131, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2349, .adv_w = 122, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2377, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 2412, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2452, .adv_w = 79, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2466, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2487, .adv_w = 79, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2510, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2535, .adv_w = 107, .box_w = 8, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2563, .adv_w = 173, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2602, .adv_w = 106, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2627, .adv_w = 107, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 2667, .adv_w = 100, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2688, .adv_w = 67, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2714, .adv_w = 57, .box_w = 2, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 2727, .adv_w = 67, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2753, .adv_w = 112, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 2760, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 2773, .adv_w = 60, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 2778, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2856, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2910, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2976, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3030, .adv_w = 132, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3071, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3149, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3227, .adv_w = 216, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3304, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3382, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3445, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3523, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3553, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3598, .adv_w = 216, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3689, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3743, .adv_w = 132, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3802, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 3850, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3922, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3983, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4044, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 4092, .adv_w = 168, .box_w = 12, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 4158, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4197, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4236, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4297, .adv_w = 168, .box_w = 11, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 4314, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4377, .adv_w = 240, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4481, .adv_w = 216, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 4579, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4645, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 4684, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 4723, .adv_w = 240, .box_w = 16, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 4803, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4857, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4935, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 5020, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5081, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5153, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5214, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5275, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5329, .adv_w = 120, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 5388, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5460, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5532, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5595, .adv_w = 192, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 5686, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5745, .adv_w = 240, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5835, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5903, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5971, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6039, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6107, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6175, .adv_w = 240, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6263, .adv_w = 168, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6328, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6400, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 6485, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6553, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6612, .adv_w = 193, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 2, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 9, 0, 5, -4, 0, 0, - 0, 0, -11, -12, 1, 9, 4, 3, - -8, 1, 9, 1, 8, 2, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 12, 2, -1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, -6, 0, 0, 0, 0, - 0, -4, 3, 4, 0, 0, -2, 0, - -1, 2, 0, -2, 0, -2, -1, -4, - 0, 0, 0, 0, -2, 0, 0, -2, - -3, 0, 0, -2, 0, -4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - -2, 0, -3, 0, -5, 0, -23, 0, - 0, -4, 0, 4, 6, 0, 0, -4, - 2, 2, 6, 4, -3, 4, 0, 0, - -11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -5, -2, -9, 0, -8, - -1, 0, 0, 0, 0, 0, 7, 0, - -6, -2, -1, 1, 0, -3, 0, 0, - -1, -14, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -15, -2, 7, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, - 0, 2, 0, 0, -4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 2, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, - 4, 2, 6, -2, 0, 0, 4, -2, - -6, -26, 1, 5, 4, 0, -2, 0, - 7, 0, 6, 0, 6, 0, -18, 0, - -2, 6, 0, 6, -2, 4, 2, 0, - 0, 1, -2, 0, 0, -3, 15, 0, - 15, 0, 6, 0, 8, 2, 3, 6, - 0, 0, 0, -7, 0, 0, 0, 0, - 1, -1, 0, 1, -3, -2, -4, 1, - 0, -2, 0, 0, 0, -8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, -11, 0, -12, 0, 0, 0, - 0, -1, 0, 19, -2, -2, 2, 2, - -2, 0, -2, 2, 0, 0, -10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -19, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -12, 0, 12, 0, 0, -7, 0, - 6, 0, -13, -19, -13, -4, 6, 0, - 0, -13, 0, 2, -4, 0, -3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 6, -23, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 1, 0, 0, 0, - 0, 0, 1, 1, -2, -4, 0, -1, - -1, -2, 0, 0, -1, 0, 0, 0, - -4, 0, -2, 0, -4, -4, 0, -5, - -6, -6, -4, 0, -4, 0, -4, 0, - 0, 0, 0, -2, 0, 0, 2, 0, - 1, -2, 0, 1, 0, 0, 0, 2, - -1, 0, 0, 0, -1, 2, 2, -1, - 0, 0, 0, -4, 0, -1, 0, 0, - 0, 0, 0, 1, 0, 2, -1, 0, - -2, 0, -3, 0, 0, -1, 0, 6, - 0, 0, -2, 0, 0, 0, 0, 0, - -1, 1, -1, -1, 0, 0, -2, 0, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, -1, 0, -2, -2, 0, - 0, 0, 0, 0, 1, 0, 0, -1, - 0, -2, -2, -2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -1, 0, 0, - 0, 0, -1, -2, 0, -3, 0, -6, - -1, -6, 4, 0, 0, -4, 2, 4, - 5, 0, -5, -1, -2, 0, -1, -9, - 2, -1, 1, -10, 2, 0, 0, 1, - -10, 0, -10, -2, -17, -1, 0, -10, - 0, 4, 5, 0, 2, 0, 0, 0, - 0, 0, 0, -3, -2, 0, -6, 0, - 0, 0, -2, 0, 0, 0, -2, 0, - 0, 0, 0, 0, -1, -1, 0, -1, - -2, 0, 0, 0, 0, 0, 0, 0, - -2, -2, 0, -1, -2, -2, 0, 0, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, -2, 0, -2, - 0, -1, 0, -4, 2, 0, 0, -2, - 1, 2, 2, 0, 0, 0, 0, 0, - 0, -1, 0, 0, 0, 0, 0, 1, - 0, 0, -2, 0, -2, -1, -2, 0, - 0, 0, 0, 0, 0, 0, 2, 0, - -2, 0, 0, 0, 0, -2, -3, 0, - -4, 0, 6, -1, 1, -6, 0, 0, - 5, -10, -10, -8, -4, 2, 0, -2, - -12, -3, 0, -3, 0, -4, 3, -3, - -12, 0, -5, 0, 0, 1, -1, 2, - -1, 0, 2, 0, -6, -7, 0, -10, - -5, -4, -5, -6, -2, -5, 0, -4, - -5, 1, 0, 1, 0, -2, 0, 0, - 0, 1, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - 0, -1, 0, -1, -2, 0, -3, -4, - -4, -1, 0, -6, 0, 0, 0, 0, - 0, 0, -2, 0, 0, 0, 0, 1, - -1, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -1, 0, 0, 0, - -4, 0, 0, 0, 0, -10, -6, 0, - 0, 0, -3, -10, 0, 0, -2, 2, - 0, -5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, 0, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, -3, 0, - 0, 0, 0, 2, 0, 1, -4, -4, - 0, -2, -2, -2, 0, 0, 0, 0, - 0, 0, -6, 0, -2, 0, -3, -2, - 0, -4, -5, -6, -2, 0, -4, 0, - -6, 0, 0, 0, 0, 15, 0, 0, - 1, 0, 0, -2, 0, 2, 0, -8, - 0, 0, 0, 0, 0, -18, -3, 6, - 6, -2, -8, 0, 2, -3, 0, -10, - -1, -2, 2, -13, -2, 2, 0, 3, - -7, -3, -7, -6, -8, 0, 0, -12, - 0, 11, 0, 0, -1, 0, 0, 0, - -1, -1, -2, -5, -6, 0, -18, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -2, 0, -1, -2, -3, 0, 0, - -4, 0, -2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, -4, 0, 0, 4, - -1, 2, 0, -4, 2, -1, -1, -5, - -2, 0, -2, -2, -1, 0, -3, -3, - 0, 0, -2, -1, -1, -3, -2, 0, - 0, -2, 0, 2, -1, 0, -4, 0, - 0, 0, -4, 0, -3, 0, -3, -3, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, -4, 2, 0, -3, 0, -1, -2, - -6, -1, -1, -1, -1, -1, -2, -1, - 0, 0, 0, 0, 0, -2, -2, -2, - 0, 0, 0, 0, 2, -1, 0, -1, - 0, 0, 0, -1, -2, -1, -2, -2, - -2, 0, 2, 8, -1, 0, -5, 0, - -1, 4, 0, -2, -8, -2, 3, 0, - 0, -9, -3, 2, -3, 1, 0, -1, - -2, -6, 0, -3, 1, 0, 0, -3, - 0, 0, 0, 2, 2, -4, -4, 0, - -3, -2, -3, -2, -2, 0, -3, 1, - -4, -3, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 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, - -1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2, -2, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, 0, -2, - 0, 0, -2, -2, 0, 0, 0, 0, - -2, 0, 0, 0, 0, -1, 0, 0, - 0, 0, 0, -1, 0, 0, 0, 0, - -3, 0, -4, 0, 0, 0, -6, 0, - 1, -4, 4, 0, -1, -9, 0, 0, - -4, -2, 0, -8, -5, -5, 0, 0, - -8, -2, -8, -7, -9, 0, -5, 0, - 2, 13, -2, 0, -4, -2, -1, -2, - -3, -5, -3, -7, -8, -4, -2, 0, - 0, -1, 0, 1, 0, 0, -13, -2, - 6, 4, -4, -7, 0, 1, -6, 0, - -10, -1, -2, 4, -18, -2, 1, 0, - 0, -12, -2, -10, -2, -14, 0, 0, - -13, 0, 11, 1, 0, -1, 0, 0, - 0, 0, -1, -1, -7, -1, 0, -12, - 0, 0, 0, 0, -6, 0, -2, 0, - -1, -5, -9, 0, 0, -1, -3, -6, - -2, 0, -1, 0, 0, 0, 0, -9, - -2, -6, -6, -2, -3, -5, -2, -3, - 0, -4, -2, -6, -3, 0, -2, -4, - -2, -4, 0, 1, 0, -1, -6, 0, - 4, 0, -3, 0, 0, 0, 0, 2, - 0, 1, -4, 8, 0, -2, -2, -2, - 0, 0, 0, 0, 0, 0, -6, 0, - -2, 0, -3, -2, 0, -4, -5, -6, - -2, 0, -4, 2, 8, 0, 0, 0, - 0, 15, 0, 0, 1, 0, 0, -2, - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -1, -4, 0, 0, 0, 0, 0, -1, - 0, 0, 0, -2, -2, 0, 0, -4, - -2, 0, 0, -4, 0, 3, -1, 0, - 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 3, 4, 2, -2, 0, -6, - -3, 0, 6, -6, -6, -4, -4, 8, - 3, 2, -17, -1, 4, -2, 0, -2, - 2, -2, -7, 0, -2, 2, -2, -2, - -6, -2, 0, 0, 6, 4, 0, -5, - 0, -11, -2, 6, -2, -7, 1, -2, - -6, -6, -2, 8, 2, 0, -3, 0, - -5, 0, 2, 6, -4, -7, -8, -5, - 6, 0, 1, -14, -2, 2, -3, -1, - -4, 0, -4, -7, -3, -3, -2, 0, - 0, -4, -4, -2, 0, 6, 4, -2, - -11, 0, -11, -3, 0, -7, -11, -1, - -6, -3, -6, -5, 5, 0, 0, -2, - 0, -4, -2, 0, -2, -3, 0, 3, - -6, 2, 0, 0, -10, 0, -2, -4, - -3, -1, -6, -5, -6, -4, 0, -6, - -2, -4, -4, -6, -2, 0, 0, 1, - 9, -3, 0, -6, -2, 0, -2, -4, - -4, -5, -5, -7, -2, -4, 4, 0, - -3, 0, -10, -2, 1, 4, -6, -7, - -4, -6, 6, -2, 1, -18, -3, 4, - -4, -3, -7, 0, -6, -8, -2, -2, - -2, -2, -4, -6, -1, 0, 0, 6, - 5, -1, -12, 0, -12, -4, 5, -7, - -13, -4, -7, -8, -10, -6, 4, 0, - 0, 0, 0, -2, 0, 0, 2, -2, - 4, 1, -4, 4, 0, 0, -6, -1, - 0, -1, 0, 1, 1, -2, 0, 0, - 0, 0, 0, 0, -2, 0, 0, 0, - 0, 2, 6, 0, 0, -2, 0, 0, - 0, 0, -1, -1, -2, 0, 0, 0, - 1, 2, 0, 0, 0, 0, 2, 0, - -2, 0, 7, 0, 3, 1, 1, -2, - 0, 4, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -12, 0, -2, 3, 0, 6, - 0, 0, 19, 2, -4, -4, 2, 2, - -1, 1, -10, 0, 0, 9, -12, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -13, 7, 27, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -12, 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, -3, 0, 0, -4, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -1, 0, -5, 0, - 0, 1, 0, 0, 2, 25, -4, -2, - 6, 5, -5, 2, 0, 0, 2, 2, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -25, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -5, - 0, 0, 0, -5, 0, 0, 0, 0, - -4, -1, 0, 0, 0, -4, 0, -2, - 0, -9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -13, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, -2, 0, 0, -4, 0, -3, 0, - -5, 0, 0, 0, -3, 2, -2, 0, - 0, -5, -2, -4, 0, 0, -5, 0, - -2, 0, -9, 0, -2, 0, 0, -16, - -4, -8, -2, -7, 0, 0, -13, 0, - -5, -1, 0, 0, 0, 0, 0, 0, - 0, 0, -3, -3, -2, -3, 0, 0, - 0, 0, -4, 0, -4, 2, -2, 4, - 0, -1, -4, -1, -3, -4, 0, -2, - -1, -1, 1, -5, -1, 0, 0, 0, - -17, -2, -3, 0, -4, 0, -1, -9, - -2, 0, 0, -1, -2, 0, 0, 0, - 0, 1, 0, -1, -3, -1, 3, 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, 2, 0, 0, 0, 0, 0, - 0, -4, 0, -1, 0, 0, 0, -4, - 2, 0, 0, 0, -5, -2, -4, 0, - 0, -5, 0, -2, 0, -9, 0, 0, - 0, 0, -19, 0, -4, -7, -10, 0, - 0, -13, 0, -1, -3, 0, 0, 0, - 0, 0, 0, 0, 0, -2, -3, -1, - -3, 1, 0, 0, 3, -2, 0, 6, - 9, -2, -2, -6, 2, 9, 3, 4, - -5, 2, 8, 2, 6, 4, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 12, 9, -3, -2, 0, -2, - 15, 8, 15, 0, 0, 0, 2, 0, - 0, 7, 0, 0, -3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -1, 0, - 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, -16, -2, -2, -8, - -9, 0, 0, -13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -1, - 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, -16, -2, -2, - -8, -9, 0, 0, -8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -2, 0, 0, 0, -4, 2, 0, -2, - 2, 3, 2, -6, 0, 0, -2, 2, - 0, 2, 0, 0, 0, 0, -5, 0, - -2, -1, -4, 0, -2, -8, 0, 12, - -2, 0, -4, -1, 0, -1, -3, 0, - -2, -5, -4, -2, 0, 0, 0, -3, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, -16, - -2, -2, -8, -9, 0, 0, -13, 0, - 0, 0, 0, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -3, 0, -6, -2, -2, 6, -2, -2, - -8, 1, -1, 1, -1, -5, 0, 4, - 0, 2, 1, 2, -5, -8, -2, 0, - -7, -4, -5, -8, -7, 0, -3, -4, - -2, -2, -2, -1, -2, -1, 0, -1, - -1, 3, 0, 3, -1, 0, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -1, -2, -2, 0, 0, - -5, 0, -1, 0, -3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -12, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, -2, 0, -2, - 0, 0, 0, 0, -2, 0, 0, -3, - -2, 2, 0, -3, -4, -1, 0, -6, - -1, -4, -1, -2, 0, -3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -13, 0, 6, 0, 0, -3, 0, - 0, 0, 0, -2, 0, -2, 0, 0, - -1, 0, 0, -1, 0, -4, 0, 0, - 8, -2, -6, -6, 1, 2, 2, 0, - -5, 1, 3, 1, 6, 1, 6, -1, - -5, 0, 0, -8, 0, 0, -6, -5, - 0, 0, -4, 0, -2, -3, 0, -3, - 0, -3, 0, -1, 3, 0, -2, -6, - -2, 7, 0, 0, -2, 0, -4, 0, - 0, 2, -4, 0, 2, -2, 2, 0, - 0, -6, 0, -1, -1, 0, -2, 2, - -2, 0, 0, 0, -8, -2, -4, 0, - -6, 0, 0, -9, 0, 7, -2, 0, - -3, 0, 1, 0, -2, 0, -2, -6, - 0, -2, 2, 0, 0, 0, 0, -1, - 0, 0, 2, -2, 1, 0, 0, -2, - -1, 0, -2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -12, 0, 4, 0, - 0, -2, 0, 0, 0, 0, 0, 0, - -2, -2, 0, 0, 0, 4, 0, 4, - 0, 0, 0, 0, 0, -12, -11, 1, - 8, 6, 3, -8, 1, 8, 0, 7, - 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_12 = { -#else -lv_font_t lv_font_montserrat_12 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 15, /*The maximum line height required by the font*/ - .base_line = 3, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -1, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_12*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_14.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_14.c deleted file mode 100644 index 2ba984e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_14.c +++ /dev/null @@ -1,2191 +0,0 @@ -/******************************************************************************* - * Size: 14 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 14 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_14.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_14 - #define LV_FONT_MONTSERRAT_14 1 -#endif - -#if LV_FONT_MONTSERRAT_14 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0xe, 0xa0, 0xd9, 0xd, 0x90, 0xc8, 0xc, 0x80, - 0xb7, 0xa, 0x60, 0x11, 0xb, 0x80, 0xd9, - - /* U+0022 "\"" */ - 0x1f, 0x9, 0x91, 0xf0, 0x88, 0x1f, 0x8, 0x80, - 0xf0, 0x88, 0x0, 0x0, 0x0, - - /* U+0023 "#" */ - 0x0, 0xd, 0x20, 0x3c, 0x0, 0x0, 0xf, 0x0, - 0x69, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf7, 0x1, - 0x5c, 0x11, 0xa6, 0x10, 0x0, 0x69, 0x0, 0xc3, - 0x0, 0x0, 0x88, 0x0, 0xd2, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xf0, 0x12, 0xc5, 0x23, 0xe2, 0x20, - 0x0, 0xd2, 0x3, 0xc0, 0x0, 0x0, 0xf0, 0x4, - 0xb0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x19, 0xef, - 0xea, 0x30, 0xc, 0xd6, 0xe6, 0xa7, 0x2, 0xf4, - 0xe, 0x0, 0x0, 0x1f, 0x80, 0xe0, 0x0, 0x0, - 0x6f, 0xef, 0x50, 0x0, 0x0, 0x16, 0xff, 0xe5, - 0x0, 0x0, 0xe, 0xa, 0xf0, 0x1, 0x0, 0xe0, - 0x5f, 0x13, 0xf8, 0x5e, 0x6e, 0xb0, 0x5, 0xcf, - 0xfe, 0x91, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, - 0x0, 0x70, 0x0, 0x0, - - /* U+0025 "%" */ - 0x8, 0xdd, 0x30, 0x0, 0xa7, 0x0, 0x4b, 0x2, - 0xd0, 0x4, 0xc0, 0x0, 0x77, 0x0, 0xd0, 0x1d, - 0x20, 0x0, 0x4b, 0x3, 0xd0, 0xa7, 0x0, 0x0, - 0x7, 0xdc, 0x34, 0xc4, 0xcc, 0x30, 0x0, 0x0, - 0x1d, 0x2d, 0x22, 0xd0, 0x0, 0x0, 0xa6, 0x3b, - 0x0, 0xb3, 0x0, 0x5, 0xc0, 0x3a, 0x0, 0xa3, - 0x0, 0x1d, 0x20, 0xd, 0x0, 0xd0, 0x0, 0xa6, - 0x0, 0x4, 0xcc, 0x40, - - /* U+0026 "&" */ - 0x0, 0x4d, 0xfc, 0x30, 0x0, 0x0, 0xf7, 0x18, - 0xc0, 0x0, 0x1, 0xf2, 0x5, 0xd0, 0x0, 0x0, - 0xbb, 0x6e, 0x40, 0x0, 0x0, 0x5f, 0xf3, 0x0, - 0x0, 0x7, 0xe6, 0xdb, 0x3, 0x80, 0x2f, 0x30, - 0x1d, 0xba, 0xa0, 0x5f, 0x0, 0x1, 0xdf, 0x40, - 0x1f, 0xb4, 0x48, 0xfe, 0xc0, 0x3, 0xbf, 0xfc, - 0x40, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0x1f, 0x1, 0xf0, 0x1f, 0x0, 0xf0, 0x0, 0x0, - - /* U+0028 "(" */ - 0x3, 0xf1, 0xb, 0x90, 0xf, 0x40, 0x4f, 0x0, - 0x7d, 0x0, 0x9b, 0x0, 0xaa, 0x0, 0xaa, 0x0, - 0x9b, 0x0, 0x7d, 0x0, 0x4f, 0x0, 0xf, 0x40, - 0xb, 0x90, 0x3, 0xf1, - - /* U+0029 ")" */ - 0x5e, 0x0, 0xe, 0x60, 0x8, 0xc0, 0x4, 0xf0, - 0x1, 0xf3, 0x0, 0xf5, 0x0, 0xe6, 0x0, 0xe6, - 0x0, 0xf5, 0x1, 0xf3, 0x4, 0xf0, 0x8, 0xc0, - 0xe, 0x60, 0x5e, 0x0, - - /* U+002A "*" */ - 0x0, 0x93, 0x0, 0x88, 0xa6, 0xc2, 0x9, 0xfe, - 0x40, 0x4d, 0xdd, 0xb1, 0x42, 0x93, 0x50, 0x0, - 0x52, 0x0, - - /* U+002B "+" */ - 0x0, 0x4, 0x50, 0x0, 0x0, 0x8, 0xa0, 0x0, - 0x0, 0x8, 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xf3, - 0x3, 0x39, 0xb3, 0x30, 0x0, 0x8, 0xa0, 0x0, - 0x0, 0x8, 0xa0, 0x0, - - /* U+002C "," */ - 0x1, 0x3, 0xf6, 0x1e, 0x60, 0xe1, 0x2c, 0x0, - - /* U+002D "-" */ - 0x0, 0x0, 0x3, 0xff, 0xf9, 0x3, 0x33, 0x10, - - /* U+002E "." */ - 0x0, 0x3, 0xf5, 0x2e, 0x40, - - /* U+002F "/" */ - 0x0, 0x0, 0xe, 0x40, 0x0, 0x4, 0xe0, 0x0, - 0x0, 0x9a, 0x0, 0x0, 0xe, 0x40, 0x0, 0x4, - 0xf0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0xe, 0x40, - 0x0, 0x3, 0xf0, 0x0, 0x0, 0x9a, 0x0, 0x0, - 0xe, 0x50, 0x0, 0x3, 0xf0, 0x0, 0x0, 0x9a, - 0x0, 0x0, 0xe, 0x50, 0x0, 0x3, 0xf0, 0x0, - 0x0, - - /* U+0030 "0" */ - 0x0, 0x4c, 0xfe, 0x70, 0x0, 0x4f, 0xb6, 0x8f, - 0x90, 0xd, 0xb0, 0x0, 0x5f, 0x32, 0xf4, 0x0, - 0x0, 0xe7, 0x4f, 0x20, 0x0, 0xc, 0xa4, 0xf2, - 0x0, 0x0, 0xca, 0x2f, 0x40, 0x0, 0xe, 0x70, - 0xdb, 0x0, 0x5, 0xf2, 0x4, 0xfb, 0x68, 0xf9, - 0x0, 0x4, 0xcf, 0xe7, 0x0, - - /* U+0031 "1" */ - 0xef, 0xfb, 0x44, 0xcb, 0x0, 0xab, 0x0, 0xab, - 0x0, 0xab, 0x0, 0xab, 0x0, 0xab, 0x0, 0xab, - 0x0, 0xab, 0x0, 0xab, - - /* U+0032 "2" */ - 0x7, 0xdf, 0xea, 0x10, 0x8e, 0x85, 0x7e, 0xc0, - 0x1, 0x0, 0x6, 0xf1, 0x0, 0x0, 0x6, 0xf0, - 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0xcc, 0x0, - 0x0, 0x1c, 0xc0, 0x0, 0x1, 0xdb, 0x0, 0x0, - 0x1d, 0xe5, 0x44, 0x42, 0x7f, 0xff, 0xff, 0xf9, - - /* U+0033 "3" */ - 0x7f, 0xff, 0xff, 0xf0, 0x24, 0x44, 0x5f, 0x90, - 0x0, 0x0, 0xbc, 0x0, 0x0, 0x9, 0xe1, 0x0, - 0x0, 0x3f, 0xd8, 0x10, 0x0, 0x4, 0x6d, 0xd0, - 0x0, 0x0, 0x2, 0xf4, 0x10, 0x0, 0x2, 0xf4, - 0xbd, 0x75, 0x7d, 0xd0, 0x19, 0xdf, 0xea, 0x10, - - /* U+0034 "4" */ - 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x0, 0xac, - 0x0, 0x0, 0x0, 0x7, 0xe1, 0x0, 0x0, 0x0, - 0x4f, 0x40, 0x10, 0x0, 0x2, 0xf6, 0x0, 0xf5, - 0x0, 0x1d, 0xa0, 0x0, 0xf5, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xf3, 0x13, 0x33, 0x33, 0xf7, 0x30, - 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0xf5, 0x0, - - /* U+0035 "5" */ - 0x9, 0xff, 0xff, 0xf0, 0xa, 0xb4, 0x44, 0x40, - 0xc, 0x80, 0x0, 0x0, 0xe, 0x70, 0x0, 0x0, - 0xf, 0xff, 0xfc, 0x40, 0x3, 0x34, 0x5c, 0xf2, - 0x0, 0x0, 0x0, 0xf7, 0x10, 0x0, 0x0, 0xf7, - 0x8e, 0x85, 0x6c, 0xf1, 0x8, 0xdf, 0xfb, 0x30, - - /* U+0036 "6" */ - 0x0, 0x2a, 0xef, 0xd5, 0x0, 0x3f, 0xd6, 0x57, - 0x40, 0xc, 0xc0, 0x0, 0x0, 0x2, 0xf4, 0x0, - 0x0, 0x0, 0x4f, 0x5b, 0xff, 0xa1, 0x4, 0xfe, - 0x84, 0x5d, 0xd0, 0x3f, 0x80, 0x0, 0x3f, 0x30, - 0xe8, 0x0, 0x3, 0xf2, 0x6, 0xf8, 0x45, 0xdc, - 0x0, 0x5, 0xdf, 0xe9, 0x10, - - /* U+0037 "7" */ - 0x9f, 0xff, 0xff, 0xfd, 0x9d, 0x44, 0x44, 0xe9, - 0x9c, 0x0, 0x4, 0xf2, 0x0, 0x0, 0xb, 0xb0, - 0x0, 0x0, 0x2f, 0x40, 0x0, 0x0, 0xad, 0x0, - 0x0, 0x1, 0xf6, 0x0, 0x0, 0x8, 0xe0, 0x0, - 0x0, 0xe, 0x80, 0x0, 0x0, 0x6f, 0x10, 0x0, - - /* U+0038 "8" */ - 0x1, 0x9e, 0xfe, 0x91, 0x0, 0xbe, 0x63, 0x6e, - 0xc0, 0xf, 0x60, 0x0, 0x6f, 0x0, 0xcc, 0x20, - 0x2b, 0xc0, 0x2, 0xef, 0xff, 0xe2, 0x0, 0xdc, - 0x42, 0x4c, 0xd0, 0x5f, 0x20, 0x0, 0x1f, 0x55, - 0xf2, 0x0, 0x2, 0xf5, 0xe, 0xd5, 0x35, 0xde, - 0x0, 0x1a, 0xef, 0xea, 0x10, - - /* U+0039 "9" */ - 0x3, 0xbf, 0xea, 0x20, 0x2f, 0xa4, 0x4b, 0xe1, - 0x8e, 0x0, 0x0, 0xe9, 0x9d, 0x0, 0x0, 0xdd, - 0x4f, 0x71, 0x29, 0xff, 0x7, 0xff, 0xfc, 0x9e, - 0x0, 0x2, 0x10, 0xac, 0x0, 0x0, 0x2, 0xf6, - 0x7, 0x65, 0x8f, 0xb0, 0xa, 0xef, 0xd7, 0x0, - - /* U+003A ":" */ - 0x2e, 0x53, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0x52, 0xe4, - - /* U+003B ";" */ - 0x2e, 0x53, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0x52, 0xf6, 0xd, 0x21, 0xd0, 0x1, - 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x6c, 0xf2, - 0x1, 0x8e, 0xd6, 0x0, 0xf, 0xc3, 0x0, 0x0, - 0xa, 0xfb, 0x40, 0x0, 0x0, 0x17, 0xee, 0x70, - 0x0, 0x0, 0x5, 0xc3, 0x0, 0x0, 0x0, 0x0, - - /* U+003D "=" */ - 0x1f, 0xff, 0xff, 0xf3, 0x3, 0x33, 0x33, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xf3, 0x3, 0x33, 0x33, 0x30, - - /* U+003E ">" */ - 0x4, 0x0, 0x0, 0x0, 0xe, 0xd7, 0x10, 0x0, - 0x0, 0x5c, 0xf9, 0x20, 0x0, 0x0, 0x2a, 0xf2, - 0x0, 0x3, 0xaf, 0xb1, 0x6, 0xde, 0x82, 0x0, - 0x1c, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x7, 0xdf, 0xea, 0x10, 0x9e, 0x74, 0x6e, 0xc0, - 0x1, 0x0, 0x6, 0xf0, 0x0, 0x0, 0x9, 0xc0, - 0x0, 0x0, 0x8e, 0x20, 0x0, 0x6, 0xf2, 0x0, - 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x80, 0x0, 0x0, 0xc, 0x90, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x6c, 0xef, 0xda, 0x40, 0x0, 0x0, - 0x3d, 0xa4, 0x10, 0x16, 0xd9, 0x0, 0x1, 0xe5, - 0x9, 0xee, 0x98, 0xca, 0x90, 0xa, 0x80, 0xbd, - 0x43, 0xaf, 0xc0, 0xd3, 0xf, 0x13, 0xf2, 0x0, - 0xc, 0xc0, 0x69, 0x3c, 0x6, 0xd0, 0x0, 0x7, - 0xc0, 0x3b, 0x4b, 0x6, 0xd0, 0x0, 0x7, 0xc0, - 0x2c, 0x3c, 0x3, 0xf2, 0x0, 0xc, 0xc0, 0x4a, - 0xf, 0x10, 0xbd, 0x43, 0x9e, 0xe3, 0xc5, 0xa, - 0x80, 0x9, 0xee, 0x91, 0xcf, 0x90, 0x1, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xa4, - 0x10, 0x28, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xef, - 0xd9, 0x10, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0xc, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xd7, 0x0, 0x0, 0x0, 0x0, 0xb9, 0x6e, - 0x0, 0x0, 0x0, 0x2, 0xf2, 0xe, 0x50, 0x0, - 0x0, 0x9, 0xa0, 0x7, 0xd0, 0x0, 0x0, 0x1f, - 0x30, 0x0, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0xe7, 0x33, 0x33, 0x4f, 0x20, - 0x5, 0xf0, 0x0, 0x0, 0xc, 0x90, 0xc, 0x90, - 0x0, 0x0, 0x6, 0xf1, - - /* U+0042 "B" */ - 0x8f, 0xff, 0xfe, 0xc4, 0x8, 0xe3, 0x33, 0x4b, - 0xf2, 0x8e, 0x0, 0x0, 0x1f, 0x58, 0xe0, 0x0, - 0x18, 0xf1, 0x8f, 0xff, 0xff, 0xf8, 0x8, 0xe3, - 0x33, 0x37, 0xf6, 0x8e, 0x0, 0x0, 0x9, 0xc8, - 0xe0, 0x0, 0x0, 0x9d, 0x8e, 0x33, 0x34, 0x7f, - 0x78, 0xff, 0xff, 0xfd, 0x70, - - /* U+0043 "C" */ - 0x0, 0x7, 0xcf, 0xfb, 0x40, 0x0, 0xcf, 0x96, - 0x6a, 0xf5, 0xa, 0xe2, 0x0, 0x0, 0x30, 0x1f, - 0x60, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, 0x0, - 0x0, 0x4f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x60, - 0x0, 0x0, 0x0, 0xa, 0xe2, 0x0, 0x0, 0x30, - 0x1, 0xcf, 0x96, 0x6a, 0xf5, 0x0, 0x7, 0xdf, - 0xfb, 0x40, - - /* U+0044 "D" */ - 0x8f, 0xff, 0xfe, 0xa4, 0x0, 0x8e, 0x44, 0x46, - 0xcf, 0x70, 0x8e, 0x0, 0x0, 0x7, 0xf3, 0x8e, - 0x0, 0x0, 0x0, 0xda, 0x8e, 0x0, 0x0, 0x0, - 0x9d, 0x8e, 0x0, 0x0, 0x0, 0x9d, 0x8e, 0x0, - 0x0, 0x0, 0xda, 0x8e, 0x0, 0x0, 0x7, 0xf3, - 0x8e, 0x44, 0x46, 0xbf, 0x70, 0x8f, 0xff, 0xfe, - 0xa4, 0x0, - - /* U+0045 "E" */ - 0x8f, 0xff, 0xff, 0xf6, 0x8e, 0x44, 0x44, 0x41, - 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xc0, 0x8e, 0x33, 0x33, 0x20, - 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, - 0x8e, 0x44, 0x44, 0x42, 0x8f, 0xff, 0xff, 0xf9, - - /* U+0046 "F" */ - 0x8f, 0xff, 0xff, 0xf6, 0x8e, 0x44, 0x44, 0x41, - 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, - 0x8e, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, - 0x8e, 0x33, 0x33, 0x20, 0x8e, 0x0, 0x0, 0x0, - 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x7, 0xcf, 0xfc, 0x50, 0x0, 0xcf, 0x96, - 0x6a, 0xf6, 0xa, 0xe2, 0x0, 0x0, 0x20, 0x1f, - 0x60, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, 0x0, - 0x0, 0x4f, 0x20, 0x0, 0x0, 0xb9, 0x1f, 0x60, - 0x0, 0x0, 0xb9, 0xa, 0xe3, 0x0, 0x0, 0xb9, - 0x0, 0xcf, 0x96, 0x6a, 0xf8, 0x0, 0x7, 0xdf, - 0xfc, 0x60, - - /* U+0048 "H" */ - 0x8e, 0x0, 0x0, 0x8, 0xe8, 0xe0, 0x0, 0x0, - 0x8e, 0x8e, 0x0, 0x0, 0x8, 0xe8, 0xe0, 0x0, - 0x0, 0x8e, 0x8f, 0xff, 0xff, 0xff, 0xe8, 0xe3, - 0x33, 0x33, 0x9e, 0x8e, 0x0, 0x0, 0x8, 0xe8, - 0xe0, 0x0, 0x0, 0x8e, 0x8e, 0x0, 0x0, 0x8, - 0xe8, 0xe0, 0x0, 0x0, 0x8e, - - /* U+0049 "I" */ - 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, - 0x8e, 0x8e, - - /* U+004A "J" */ - 0x2, 0xff, 0xff, 0xc0, 0x4, 0x44, 0xbc, 0x0, - 0x0, 0x9, 0xc0, 0x0, 0x0, 0x9c, 0x0, 0x0, - 0x9, 0xc0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x9, - 0xc0, 0x20, 0x0, 0xba, 0xe, 0xb5, 0x8f, 0x60, - 0x3c, 0xfe, 0x80, - - /* U+004B "K" */ - 0x8e, 0x0, 0x0, 0x4f, 0x50, 0x8e, 0x0, 0x4, - 0xf6, 0x0, 0x8e, 0x0, 0x3f, 0x70, 0x0, 0x8e, - 0x3, 0xf8, 0x0, 0x0, 0x8e, 0x2e, 0xc0, 0x0, - 0x0, 0x8e, 0xec, 0xf6, 0x0, 0x0, 0x8f, 0xb0, - 0x7f, 0x30, 0x0, 0x8e, 0x0, 0xa, 0xe1, 0x0, - 0x8e, 0x0, 0x0, 0xcc, 0x0, 0x8e, 0x0, 0x0, - 0x1e, 0xa0, - - /* U+004C "L" */ - 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, - 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, - 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, - 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, - 0x8e, 0x44, 0x44, 0x40, 0x8f, 0xff, 0xff, 0xf2, - - /* U+004D "M" */ - 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe8, 0xf7, 0x0, - 0x0, 0x2, 0xfe, 0x8f, 0xf1, 0x0, 0x0, 0xbf, - 0xe8, 0xdc, 0xa0, 0x0, 0x4f, 0x9e, 0x8d, 0x2f, - 0x30, 0xd, 0x87, 0xe8, 0xd0, 0x9c, 0x6, 0xe0, - 0x7e, 0x8d, 0x1, 0xe7, 0xe5, 0x7, 0xe8, 0xd0, - 0x6, 0xfc, 0x0, 0x7e, 0x8d, 0x0, 0xa, 0x20, - 0x7, 0xe8, 0xd0, 0x0, 0x0, 0x0, 0x7e, - - /* U+004E "N" */ - 0x8e, 0x10, 0x0, 0x8, 0xe8, 0xfc, 0x0, 0x0, - 0x8e, 0x8f, 0xf9, 0x0, 0x8, 0xe8, 0xe6, 0xf6, - 0x0, 0x8e, 0x8e, 0x9, 0xf3, 0x8, 0xe8, 0xe0, - 0xc, 0xe1, 0x8e, 0x8e, 0x0, 0x1e, 0xb8, 0xe8, - 0xe0, 0x0, 0x3f, 0xee, 0x8e, 0x0, 0x0, 0x6f, - 0xe8, 0xe0, 0x0, 0x0, 0xae, - - /* U+004F "O" */ - 0x0, 0x7, 0xcf, 0xeb, 0x50, 0x0, 0x0, 0xcf, - 0x96, 0x6b, 0xf9, 0x0, 0xa, 0xe2, 0x0, 0x0, - 0x5f, 0x60, 0x1f, 0x60, 0x0, 0x0, 0xa, 0xd0, - 0x4f, 0x20, 0x0, 0x0, 0x6, 0xf0, 0x4f, 0x20, - 0x0, 0x0, 0x6, 0xf0, 0x1f, 0x60, 0x0, 0x0, - 0xa, 0xd0, 0xa, 0xe2, 0x0, 0x0, 0x5f, 0x60, - 0x0, 0xcf, 0x96, 0x6b, 0xfa, 0x0, 0x0, 0x7, - 0xdf, 0xeb, 0x50, 0x0, - - /* U+0050 "P" */ - 0x8f, 0xff, 0xfd, 0x70, 0x8, 0xe4, 0x45, 0x8f, - 0xb0, 0x8e, 0x0, 0x0, 0x5f, 0x38, 0xe0, 0x0, - 0x1, 0xf5, 0x8e, 0x0, 0x0, 0x3f, 0x48, 0xe0, - 0x1, 0x4d, 0xd0, 0x8f, 0xff, 0xff, 0xb2, 0x8, - 0xe3, 0x33, 0x10, 0x0, 0x8e, 0x0, 0x0, 0x0, - 0x8, 0xe0, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x7, 0xcf, 0xeb, 0x50, 0x0, 0x0, 0xcf, - 0x96, 0x6b, 0xf9, 0x0, 0xa, 0xe2, 0x0, 0x0, - 0x5f, 0x60, 0x1f, 0x60, 0x0, 0x0, 0xa, 0xd0, - 0x4f, 0x20, 0x0, 0x0, 0x6, 0xf0, 0x4f, 0x20, - 0x0, 0x0, 0x5, 0xf0, 0x1f, 0x60, 0x0, 0x0, - 0xa, 0xd0, 0xa, 0xe2, 0x0, 0x0, 0x5f, 0x60, - 0x1, 0xdf, 0x85, 0x5a, 0xfa, 0x0, 0x0, 0x8, - 0xdf, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x1, 0xec, - 0x21, 0x94, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, - - /* U+0052 "R" */ - 0x8f, 0xff, 0xfd, 0x70, 0x8, 0xe4, 0x45, 0x8f, - 0xb0, 0x8e, 0x0, 0x0, 0x5f, 0x38, 0xe0, 0x0, - 0x1, 0xf5, 0x8e, 0x0, 0x0, 0x3f, 0x38, 0xe0, - 0x1, 0x4d, 0xd0, 0x8f, 0xff, 0xff, 0xc2, 0x8, - 0xe3, 0x33, 0xda, 0x0, 0x8e, 0x0, 0x2, 0xf6, - 0x8, 0xe0, 0x0, 0x5, 0xf3, - - /* U+0053 "S" */ - 0x1, 0x9e, 0xfd, 0xa2, 0x0, 0xce, 0x64, 0x6b, - 0x70, 0x2f, 0x40, 0x0, 0x0, 0x1, 0xf8, 0x0, - 0x0, 0x0, 0x6, 0xfd, 0x95, 0x0, 0x0, 0x1, - 0x6a, 0xee, 0x50, 0x0, 0x0, 0x0, 0x9f, 0x0, - 0x20, 0x0, 0x5, 0xf1, 0x3f, 0xa5, 0x47, 0xeb, - 0x0, 0x4b, 0xef, 0xe9, 0x10, - - /* U+0054 "T" */ - 0xff, 0xff, 0xff, 0xff, 0x24, 0x44, 0xbd, 0x44, - 0x40, 0x0, 0x9, 0xc0, 0x0, 0x0, 0x0, 0x9c, - 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, 0x0, - 0x9c, 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, - 0x0, 0x9c, 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, - 0x0, 0x0, 0x9c, 0x0, 0x0, - - /* U+0055 "U" */ - 0x9c, 0x0, 0x0, 0xb, 0xa9, 0xc0, 0x0, 0x0, - 0xba, 0x9c, 0x0, 0x0, 0xb, 0xa9, 0xc0, 0x0, - 0x0, 0xba, 0x9c, 0x0, 0x0, 0xb, 0xa9, 0xc0, - 0x0, 0x0, 0xba, 0x8e, 0x0, 0x0, 0xd, 0x94, - 0xf4, 0x0, 0x3, 0xf5, 0xc, 0xf8, 0x68, 0xfd, - 0x0, 0x9, 0xef, 0xe9, 0x10, - - /* U+0056 "V" */ - 0xc, 0xb0, 0x0, 0x0, 0xa, 0xc0, 0x5f, 0x20, - 0x0, 0x1, 0xf5, 0x0, 0xe9, 0x0, 0x0, 0x8e, - 0x0, 0x8, 0xf0, 0x0, 0xe, 0x70, 0x0, 0x1f, - 0x60, 0x5, 0xf1, 0x0, 0x0, 0xad, 0x0, 0xc9, - 0x0, 0x0, 0x3, 0xf4, 0x3f, 0x30, 0x0, 0x0, - 0xc, 0xba, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0xee, 0x0, 0x0, - - /* U+0057 "W" */ - 0x6f, 0x10, 0x0, 0xd, 0xb0, 0x0, 0x2, 0xf2, - 0x1f, 0x60, 0x0, 0x3f, 0xf1, 0x0, 0x8, 0xd0, - 0xb, 0xb0, 0x0, 0x8b, 0xe6, 0x0, 0xd, 0x70, - 0x6, 0xf0, 0x0, 0xe6, 0x9b, 0x0, 0x2f, 0x20, - 0x1, 0xf5, 0x3, 0xf1, 0x4f, 0x10, 0x8d, 0x0, - 0x0, 0xca, 0x9, 0xb0, 0xe, 0x60, 0xd8, 0x0, - 0x0, 0x6f, 0xe, 0x60, 0x9, 0xb2, 0xf3, 0x0, - 0x0, 0x1f, 0x9f, 0x10, 0x4, 0xf9, 0xd0, 0x0, - 0x0, 0xc, 0xfb, 0x0, 0x0, 0xef, 0x80, 0x0, - 0x0, 0x7, 0xf6, 0x0, 0x0, 0x9f, 0x30, 0x0, - - /* U+0058 "X" */ - 0x3f, 0x50, 0x0, 0xd, 0xa0, 0x8, 0xf2, 0x0, - 0x9d, 0x0, 0x0, 0xcc, 0x4, 0xf3, 0x0, 0x0, - 0x2f, 0x9e, 0x70, 0x0, 0x0, 0x6, 0xfc, 0x0, - 0x0, 0x0, 0x9, 0xfe, 0x10, 0x0, 0x0, 0x4f, - 0x4d, 0xb0, 0x0, 0x1, 0xe8, 0x2, 0xf7, 0x0, - 0xb, 0xd0, 0x0, 0x7f, 0x20, 0x7f, 0x20, 0x0, - 0xb, 0xd0, - - /* U+0059 "Y" */ - 0xc, 0xb0, 0x0, 0x0, 0x9c, 0x0, 0x2f, 0x50, - 0x0, 0x2f, 0x30, 0x0, 0x9e, 0x0, 0xc, 0x90, - 0x0, 0x0, 0xe8, 0x5, 0xf1, 0x0, 0x0, 0x5, - 0xf3, 0xe6, 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0x40, 0x0, 0x0, 0x0, - 0x2, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, - 0x0, 0x0, 0x0, 0x2, 0xf3, 0x0, 0x0, - - /* U+005A "Z" */ - 0x4f, 0xff, 0xff, 0xff, 0x91, 0x44, 0x44, 0x4a, - 0xf3, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x1, - 0xea, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0x9e, 0x10, 0x0, 0x0, 0x6f, 0x40, 0x0, 0x0, - 0x3f, 0x70, 0x0, 0x0, 0x1e, 0xd4, 0x44, 0x44, - 0x36, 0xff, 0xff, 0xff, 0xfc, - - /* U+005B "[" */ - 0x8f, 0xf6, 0x8d, 0x31, 0x8d, 0x0, 0x8d, 0x0, - 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, - 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, - 0x8d, 0x31, 0x8f, 0xf6, - - /* U+005C "\\" */ - 0x5d, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0xb, - 0x80, 0x0, 0x0, 0x6d, 0x0, 0x0, 0x1, 0xf2, - 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x6d, 0x0, - 0x0, 0x1, 0xf2, 0x0, 0x0, 0xb, 0x70, 0x0, - 0x0, 0x6d, 0x0, 0x0, 0x1, 0xf2, 0x0, 0x0, - 0xb, 0x70, 0x0, 0x0, 0x6d, 0x0, 0x0, 0x1, - 0xf2, - - /* U+005D "]" */ - 0xbf, 0xf3, 0x25, 0xf3, 0x2, 0xf3, 0x2, 0xf3, - 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, - 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, - 0x25, 0xf3, 0xbf, 0xf3, - - /* U+005E "^" */ - 0x0, 0xad, 0x0, 0x0, 0x1e, 0xc4, 0x0, 0x8, - 0x85, 0xa0, 0x0, 0xe2, 0xe, 0x10, 0x5b, 0x0, - 0x97, 0xb, 0x50, 0x2, 0xe0, - - /* U+005F "_" */ - 0xee, 0xee, 0xee, 0xe0, - - /* U+0060 "`" */ - 0xb, 0xc0, 0x0, 0x9, 0xb0, - - /* U+0061 "a" */ - 0x4, 0xcf, 0xea, 0x10, 0xb, 0x74, 0x5d, 0xb0, - 0x0, 0x0, 0x4, 0xf0, 0x4, 0xce, 0xee, 0xf2, - 0x1f, 0x82, 0x14, 0xf2, 0x4f, 0x10, 0x4, 0xf2, - 0x1f, 0x70, 0x3d, 0xf2, 0x4, 0xdf, 0xd7, 0xf2, - - /* U+0062 "b" */ - 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, - 0xba, 0x0, 0x0, 0x0, 0xba, 0x8e, 0xfc, 0x30, - 0xbf, 0xd5, 0x4b, 0xf3, 0xbe, 0x10, 0x0, 0xca, - 0xba, 0x0, 0x0, 0x7e, 0xba, 0x0, 0x0, 0x7e, - 0xbe, 0x10, 0x0, 0xca, 0xbf, 0xd5, 0x5b, 0xf3, - 0xb9, 0x8e, 0xfc, 0x30, - - /* U+0063 "c" */ - 0x0, 0x7d, 0xfd, 0x60, 0x9, 0xf7, 0x48, 0xf4, - 0x2f, 0x50, 0x0, 0x20, 0x5f, 0x0, 0x0, 0x0, - 0x5f, 0x0, 0x0, 0x0, 0x2f, 0x50, 0x0, 0x20, - 0x9, 0xf7, 0x48, 0xf4, 0x0, 0x7d, 0xfd, 0x60, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, 0x1, - 0xf4, 0x0, 0x0, 0x0, 0x1f, 0x40, 0x8, 0xef, - 0xc4, 0xf4, 0xa, 0xf7, 0x48, 0xff, 0x42, 0xf5, - 0x0, 0x7, 0xf4, 0x5f, 0x0, 0x0, 0x2f, 0x45, - 0xf0, 0x0, 0x1, 0xf4, 0x2f, 0x50, 0x0, 0x6f, - 0x40, 0xae, 0x63, 0x7e, 0xf4, 0x0, 0x8e, 0xfc, - 0x4f, 0x40, - - /* U+0065 "e" */ - 0x0, 0x8e, 0xfc, 0x40, 0xa, 0xd5, 0x38, 0xf4, - 0x2f, 0x20, 0x0, 0x8c, 0x5f, 0xee, 0xee, 0xff, - 0x5f, 0x21, 0x11, 0x11, 0x2f, 0x70, 0x0, 0x10, - 0x9, 0xf8, 0x46, 0xe4, 0x0, 0x7d, 0xfe, 0x80, - - /* U+0066 "f" */ - 0x0, 0x9e, 0xe3, 0x5, 0xf4, 0x41, 0x8, 0xc0, - 0x0, 0xcf, 0xff, 0xf0, 0x29, 0xd3, 0x20, 0x8, - 0xd0, 0x0, 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, - 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, 0x8, 0xd0, - 0x0, - - /* U+0067 "g" */ - 0x0, 0x7e, 0xfc, 0x4e, 0x60, 0xaf, 0x74, 0x7f, - 0xf6, 0x2f, 0x50, 0x0, 0x5f, 0x65, 0xf0, 0x0, - 0x0, 0xf6, 0x5f, 0x0, 0x0, 0xf, 0x62, 0xf6, - 0x0, 0x6, 0xf6, 0x9, 0xf7, 0x47, 0xff, 0x50, - 0x7, 0xef, 0xc4, 0xf5, 0x0, 0x0, 0x0, 0x3f, - 0x20, 0xcb, 0x64, 0x6e, 0xb0, 0x3, 0xae, 0xfd, - 0x80, 0x0, - - /* U+0068 "h" */ - 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, - 0xba, 0x0, 0x0, 0x0, 0xba, 0x8e, 0xfb, 0x20, - 0xbf, 0xc5, 0x6d, 0xd0, 0xbe, 0x0, 0x3, 0xf2, - 0xba, 0x0, 0x0, 0xf4, 0xba, 0x0, 0x0, 0xf5, - 0xba, 0x0, 0x0, 0xf5, 0xba, 0x0, 0x0, 0xf5, - 0xba, 0x0, 0x0, 0xf5, - - /* U+0069 "i" */ - 0xba, 0xa8, 0x0, 0xba, 0xba, 0xba, 0xba, 0xba, - 0xba, 0xba, 0xba, - - /* U+006A "j" */ - 0x0, 0xa, 0xb0, 0x0, 0x99, 0x0, 0x0, 0x0, - 0x0, 0xab, 0x0, 0xa, 0xb0, 0x0, 0xab, 0x0, - 0xa, 0xb0, 0x0, 0xab, 0x0, 0xa, 0xb0, 0x0, - 0xab, 0x0, 0xa, 0xb0, 0x0, 0xaa, 0x6, 0x4e, - 0x71, 0xdf, 0xa0, - - /* U+006B "k" */ - 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, - 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x1c, 0xc0, - 0xba, 0x1, 0xcc, 0x0, 0xba, 0x1c, 0xd1, 0x0, - 0xbb, 0xcf, 0x60, 0x0, 0xbf, 0xdb, 0xe1, 0x0, - 0xbd, 0x11, 0xdc, 0x0, 0xba, 0x0, 0x3f, 0x70, - 0xba, 0x0, 0x7, 0xf3, - - /* U+006C "l" */ - 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, - 0xba, 0xba, 0xba, - - /* U+006D "m" */ - 0xb9, 0x9e, 0xfa, 0x15, 0xdf, 0xd4, 0xb, 0xfb, - 0x45, 0xed, 0xe6, 0x4a, 0xf2, 0xbe, 0x0, 0x6, - 0xf6, 0x0, 0xe, 0x7b, 0xa0, 0x0, 0x4f, 0x20, - 0x0, 0xc9, 0xba, 0x0, 0x3, 0xf1, 0x0, 0xc, - 0x9b, 0xa0, 0x0, 0x3f, 0x10, 0x0, 0xc9, 0xba, - 0x0, 0x3, 0xf1, 0x0, 0xc, 0x9b, 0xa0, 0x0, - 0x3f, 0x10, 0x0, 0xc9, - - /* U+006E "n" */ - 0xb9, 0x9e, 0xfb, 0x20, 0xbf, 0xb4, 0x5d, 0xd0, - 0xbe, 0x0, 0x3, 0xf2, 0xba, 0x0, 0x0, 0xf4, - 0xba, 0x0, 0x0, 0xf5, 0xba, 0x0, 0x0, 0xf5, - 0xba, 0x0, 0x0, 0xf5, 0xba, 0x0, 0x0, 0xf5, - - /* U+006F "o" */ - 0x0, 0x7d, 0xfd, 0x60, 0x0, 0x9f, 0x74, 0x8f, - 0x70, 0x2f, 0x50, 0x0, 0x7f, 0x5, 0xf0, 0x0, - 0x1, 0xf3, 0x5f, 0x0, 0x0, 0x2f, 0x32, 0xf5, - 0x0, 0x7, 0xf0, 0x9, 0xf7, 0x48, 0xf7, 0x0, - 0x7, 0xdf, 0xd6, 0x0, - - /* U+0070 "p" */ - 0xb9, 0x8e, 0xfc, 0x30, 0xbf, 0xc4, 0x3a, 0xf3, - 0xbe, 0x10, 0x0, 0xca, 0xba, 0x0, 0x0, 0x7e, - 0xba, 0x0, 0x0, 0x7e, 0xbe, 0x10, 0x0, 0xca, - 0xbf, 0xd5, 0x5b, 0xf3, 0xba, 0x7e, 0xfc, 0x30, - 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, - 0xba, 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x8e, 0xfc, 0x3f, 0x40, 0xaf, 0x74, 0x8e, - 0xf4, 0x2f, 0x50, 0x0, 0x7f, 0x45, 0xf0, 0x0, - 0x1, 0xf4, 0x5f, 0x0, 0x0, 0x2f, 0x42, 0xf5, - 0x0, 0x7, 0xf4, 0xa, 0xf7, 0x48, 0xff, 0x40, - 0x8, 0xef, 0xc4, 0xf4, 0x0, 0x0, 0x0, 0x1f, - 0x40, 0x0, 0x0, 0x1, 0xf4, 0x0, 0x0, 0x0, - 0x1f, 0x40, - - /* U+0072 "r" */ - 0xb9, 0x8e, 0x4b, 0xfd, 0x71, 0xbe, 0x10, 0xb, - 0xb0, 0x0, 0xba, 0x0, 0xb, 0xa0, 0x0, 0xba, - 0x0, 0xb, 0xa0, 0x0, - - /* U+0073 "s" */ - 0x5, 0xdf, 0xea, 0x13, 0xf7, 0x35, 0xa0, 0x6f, - 0x0, 0x0, 0x1, 0xee, 0x96, 0x10, 0x1, 0x6a, - 0xef, 0x30, 0x0, 0x0, 0xd9, 0x6c, 0x64, 0x6f, - 0x62, 0xae, 0xfd, 0x70, - - /* U+0074 "t" */ - 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, 0xcf, 0xff, - 0xf0, 0x29, 0xd3, 0x20, 0x8, 0xd0, 0x0, 0x8, - 0xd0, 0x0, 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, - 0x5, 0xf5, 0x51, 0x0, 0x9f, 0xe3, - - /* U+0075 "u" */ - 0xc8, 0x0, 0x2, 0xf3, 0xc8, 0x0, 0x2, 0xf3, - 0xc8, 0x0, 0x2, 0xf3, 0xc8, 0x0, 0x2, 0xf3, - 0xc9, 0x0, 0x3, 0xf3, 0xab, 0x0, 0x7, 0xf3, - 0x5f, 0x83, 0x7e, 0xf3, 0x6, 0xdf, 0xc5, 0xf3, - - /* U+0076 "v" */ - 0xd, 0x90, 0x0, 0xa, 0xa0, 0x6e, 0x0, 0x1, - 0xf3, 0x0, 0xf5, 0x0, 0x7d, 0x0, 0x9, 0xc0, - 0xe, 0x60, 0x0, 0x3f, 0x24, 0xf0, 0x0, 0x0, - 0xc8, 0xb9, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, - 0x0, 0xf, 0xc0, 0x0, - - /* U+0077 "w" */ - 0xc8, 0x0, 0x6, 0xf1, 0x0, 0xd, 0x56, 0xd0, - 0x0, 0xcf, 0x60, 0x3, 0xf0, 0x1f, 0x30, 0x2f, - 0x9c, 0x0, 0x9a, 0x0, 0xb8, 0x7, 0xb2, 0xf1, - 0xe, 0x40, 0x5, 0xe0, 0xd6, 0xc, 0x74, 0xe0, - 0x0, 0xf, 0x6f, 0x0, 0x7c, 0x99, 0x0, 0x0, - 0xaf, 0xa0, 0x1, 0xff, 0x40, 0x0, 0x5, 0xf4, - 0x0, 0xb, 0xe0, 0x0, - - /* U+0078 "x" */ - 0x4f, 0x30, 0x7, 0xe1, 0x9, 0xd0, 0x2f, 0x40, - 0x0, 0xd9, 0xd9, 0x0, 0x0, 0x3f, 0xd0, 0x0, - 0x0, 0x4f, 0xe1, 0x0, 0x1, 0xe7, 0xbb, 0x0, - 0xb, 0xb0, 0x1e, 0x70, 0x7e, 0x10, 0x5, 0xf3, - - /* U+0079 "y" */ - 0xd, 0x90, 0x0, 0xa, 0xa0, 0x6f, 0x0, 0x1, - 0xf3, 0x0, 0xf6, 0x0, 0x7d, 0x0, 0x9, 0xc0, - 0xd, 0x60, 0x0, 0x2f, 0x34, 0xf0, 0x0, 0x0, - 0xc9, 0xa9, 0x0, 0x0, 0x5, 0xff, 0x20, 0x0, - 0x0, 0xe, 0xc0, 0x0, 0x0, 0x0, 0xe5, 0x0, - 0x0, 0x94, 0xad, 0x0, 0x0, 0x1b, 0xfc, 0x20, - 0x0, 0x0, - - /* U+007A "z" */ - 0x5f, 0xff, 0xff, 0xa1, 0x33, 0x37, 0xf4, 0x0, - 0x1, 0xe7, 0x0, 0x0, 0xcb, 0x0, 0x0, 0x8e, - 0x10, 0x0, 0x4f, 0x40, 0x0, 0x1e, 0xa3, 0x33, - 0x26, 0xff, 0xff, 0xfc, - - /* U+007B "{" */ - 0x0, 0x6e, 0xa0, 0xf, 0x92, 0x1, 0xf4, 0x0, - 0x1f, 0x40, 0x1, 0xf4, 0x0, 0x3f, 0x30, 0x3f, - 0xc0, 0x0, 0x6f, 0x30, 0x1, 0xf4, 0x0, 0x1f, - 0x40, 0x1, 0xf4, 0x0, 0x1f, 0x40, 0x0, 0xfa, - 0x20, 0x5, 0xea, - - /* U+007C "|" */ - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, - - /* U+007D "}" */ - 0xbe, 0x50, 0x2, 0xae, 0x0, 0x5, 0xf0, 0x0, - 0x5f, 0x0, 0x5, 0xf0, 0x0, 0x4f, 0x10, 0x0, - 0xdf, 0x10, 0x4f, 0x50, 0x5, 0xf0, 0x0, 0x5f, - 0x0, 0x5, 0xf0, 0x0, 0x5f, 0x0, 0x2a, 0xe0, - 0xb, 0xe4, 0x0, - - /* U+007E "~" */ - 0x7, 0xec, 0x40, 0xb4, 0x1e, 0x25, 0xdf, 0xc0, - 0x1, 0x0, 0x0, 0x0, - - /* U+00B0 "°" */ - 0x4, 0xcc, 0x30, 0x2b, 0x1, 0xc0, 0x57, 0x0, - 0x93, 0x2b, 0x1, 0xc0, 0x5, 0xcc, 0x30, - - /* U+2022 "•" */ - 0x6, 0xa1, 0xf, 0xf6, 0xb, 0xe2, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xfb, 0x0, - 0x0, 0x0, 0x4, 0x9d, 0xff, 0xff, 0xd0, 0x0, - 0x3, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xdf, 0xd0, 0x0, 0xa, - 0xff, 0xff, 0xb6, 0x10, 0xed, 0x0, 0x0, 0xaf, - 0x94, 0x0, 0x0, 0xe, 0xd0, 0x0, 0xa, 0xf1, - 0x0, 0x0, 0x0, 0xed, 0x0, 0x0, 0xaf, 0x10, - 0x0, 0x0, 0xe, 0xd0, 0x0, 0xa, 0xf1, 0x0, - 0x0, 0x45, 0xfd, 0x0, 0x0, 0xaf, 0x10, 0x1, - 0xef, 0xff, 0xd0, 0x17, 0x9d, 0xf1, 0x0, 0x5f, - 0xff, 0xfc, 0xe, 0xff, 0xff, 0x10, 0x0, 0xaf, - 0xfd, 0x31, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x1, - 0x0, 0x3, 0xbd, 0xa3, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F008 "" */ - 0x50, 0x18, 0x88, 0x88, 0x88, 0x84, 0x5, 0xfa, - 0xbf, 0xdd, 0xdd, 0xdd, 0xfd, 0xaf, 0xe4, 0x7f, - 0x10, 0x0, 0x0, 0xca, 0x4e, 0xe0, 0x4f, 0x10, - 0x0, 0x0, 0xc8, 0xe, 0xfe, 0xef, 0x10, 0x0, - 0x0, 0xcf, 0xef, 0xe0, 0x3f, 0xee, 0xee, 0xee, - 0xf8, 0xe, 0xf6, 0x8f, 0x76, 0x66, 0x66, 0xeb, - 0x6f, 0xf8, 0xaf, 0x10, 0x0, 0x0, 0xcc, 0x8f, - 0xe0, 0x3f, 0x10, 0x0, 0x0, 0xc8, 0xe, 0xfc, - 0xdf, 0x65, 0x55, 0x55, 0xee, 0xcf, 0xc2, 0x5f, - 0xff, 0xff, 0xff, 0xf9, 0x2c, - - /* U+F00B "" */ - 0x57, 0x75, 0x5, 0x77, 0x77, 0x77, 0x75, 0xff, - 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xe, - 0xff, 0xff, 0xff, 0xfe, 0x1, 0x10, 0x0, 0x11, - 0x11, 0x11, 0x10, 0xef, 0xfe, 0xe, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0x68, 0x87, 0x7, 0x88, 0x88, 0x88, 0x86, 0x68, - 0x87, 0x7, 0x88, 0x88, 0x88, 0x86, 0xff, 0xff, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xd, 0xff, - 0xff, 0xff, 0xfd, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xe2, 0x2d, 0x60, 0x0, 0x1, - 0xdf, 0xfe, 0x20, 0xdf, 0xf7, 0x0, 0x1d, 0xff, - 0xe2, 0x0, 0x8f, 0xff, 0x71, 0xdf, 0xfe, 0x20, - 0x0, 0x8, 0xff, 0xfe, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7d, 0x20, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, - 0xb, 0xe2, 0xef, 0xf6, 0x0, 0xbf, 0xf8, 0x4f, - 0xff, 0x6b, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x5f, 0xff, 0xe1, 0x0, 0x0, 0xbf, - 0xff, 0xf6, 0x0, 0xb, 0xff, 0xdf, 0xff, 0x60, - 0xbf, 0xfd, 0x14, 0xff, 0xf5, 0xcf, 0xd1, 0x0, - 0x4f, 0xf6, 0x17, 0x10, 0x0, 0x3, 0x60, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0x21, 0xff, 0x12, 0xf7, 0x0, 0x6, 0xff, 0x61, - 0xff, 0x16, 0xff, 0x60, 0x1f, 0xf9, 0x1, 0xff, - 0x10, 0x9f, 0xf1, 0x6f, 0xe0, 0x1, 0xff, 0x10, - 0xe, 0xf6, 0xaf, 0x80, 0x1, 0xff, 0x10, 0x8, - 0xfa, 0xcf, 0x60, 0x1, 0xff, 0x10, 0x6, 0xfc, - 0xaf, 0x80, 0x0, 0xaa, 0x0, 0x8, 0xfb, 0x7f, - 0xd0, 0x0, 0x0, 0x0, 0xd, 0xf7, 0x1f, 0xf8, - 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x7, 0xff, 0x91, - 0x0, 0x2a, 0xff, 0x70, 0x0, 0x9f, 0xff, 0xee, - 0xff, 0xf9, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xfd, - 0x50, 0x0, 0x0, 0x0, 0x2, 0x44, 0x20, 0x0, - 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xd6, 0xdf, - 0xff, 0xfd, 0x6d, 0x30, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x5f, 0xff, 0xff, 0xaa, 0xff, - 0xff, 0xf5, 0x1a, 0xff, 0xf4, 0x0, 0x4f, 0xff, - 0xa1, 0x3, 0xff, 0xd0, 0x0, 0xd, 0xff, 0x30, - 0x4, 0xff, 0xf0, 0x0, 0xf, 0xff, 0x40, 0x4f, - 0xff, 0xfb, 0x22, 0xbf, 0xff, 0xf4, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9, 0xfe, 0xff, - 0xff, 0xff, 0xef, 0x90, 0x0, 0x50, 0x5e, 0xff, - 0xe5, 0x5, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x77, 0x40, 0x0, - 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x3, 0x10, 0x3, 0x41, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xf5, 0xd, 0xf5, 0x0, - 0x0, 0x0, 0x1b, 0xfd, 0xff, 0x8d, 0xf5, 0x0, - 0x0, 0x2, 0xdf, 0xb1, 0x2d, 0xff, 0xf5, 0x0, - 0x0, 0x4f, 0xf8, 0x3e, 0xc2, 0xbf, 0xf5, 0x0, - 0x7, 0xff, 0x55, 0xff, 0xfe, 0x39, 0xfe, 0x40, - 0x9f, 0xe3, 0x8f, 0xff, 0xff, 0xf5, 0x6f, 0xf6, - 0xac, 0x2a, 0xff, 0xff, 0xff, 0xff, 0x73, 0xe6, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x6f, 0xff, 0xd7, 0x7f, 0xff, 0xf2, 0x0, - 0x0, 0x6f, 0xff, 0x90, 0xd, 0xff, 0xf2, 0x0, - 0x0, 0x6f, 0xff, 0x90, 0xd, 0xff, 0xf2, 0x0, - 0x0, 0x4f, 0xff, 0x70, 0xb, 0xff, 0xe1, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x0, 0x79, 0x99, - 0x82, 0xde, 0x28, 0x99, 0x97, 0xff, 0xff, 0xfb, - 0x22, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xb3, 0xcf, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xca, - - /* U+F01C "" */ - 0x0, 0x6, 0xbb, 0xbb, 0xbb, 0xba, 0x30, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0xef, 0x30, 0x0, 0x0, 0x6, 0xfb, 0x0, - 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x50, - 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe1, - 0xdf, 0x84, 0x42, 0x0, 0x0, 0x34, 0x4b, 0xf9, - 0xff, 0xff, 0xfd, 0x0, 0x1, 0xff, 0xff, 0xfb, - 0xff, 0xff, 0xff, 0x98, 0x8b, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, - 0x1, 0x8d, 0xff, 0xc6, 0x0, 0xef, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xe4, 0xdf, 0x4, 0xff, 0xb3, - 0x0, 0x4c, 0xff, 0xff, 0xe, 0xf9, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x6f, 0xc0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0x8e, 0x50, 0x0, 0x1, 0xde, 0xee, - 0xed, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x21, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x8, 0xf8, 0xff, 0xfb, - 0xbc, 0x10, 0x0, 0x1e, 0xf4, 0xff, 0xfc, 0x10, - 0x0, 0x1, 0xdf, 0xc0, 0xfe, 0xef, 0xe8, 0x44, - 0x8e, 0xfe, 0x10, 0xfe, 0x1a, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0xfd, 0x0, 0x28, 0xbb, 0x94, 0x0, - 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x2, 0x70, 0x0, 0x2, 0xef, 0x0, - 0x2, 0xef, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x34, 0x47, 0xff, 0xf0, - 0x0, 0x5, 0xff, 0x0, 0x0, 0x5, 0xc0, 0x0, - 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x2, - 0xef, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0x2, 0x20, 0xff, 0xff, - 0xff, 0xf0, 0x8e, 0x1f, 0xff, 0xff, 0xff, 0x0, - 0xe7, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x5f, 0xff, - 0xff, 0xff, 0x8, 0x90, 0x34, 0x47, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x0, - 0x0, 0x0, 0x2, 0x70, 0x0, 0x5, 0xfa, 0x0, - 0x0, 0x0, 0x2e, 0xf0, 0x0, 0x81, 0x4f, 0x60, - 0x0, 0x2, 0xef, 0xf0, 0x1, 0xdd, 0x7, 0xf0, - 0xdf, 0xff, 0xff, 0xf0, 0x32, 0x1e, 0x80, 0xf6, - 0xff, 0xff, 0xff, 0xf0, 0x8e, 0x27, 0xe0, 0xb9, - 0xff, 0xff, 0xff, 0xf0, 0xe, 0x73, 0xf1, 0x9b, - 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x54, 0xf0, 0x9a, - 0xff, 0xff, 0xff, 0xf0, 0x89, 0xa, 0xc0, 0xd8, - 0x34, 0x47, 0xff, 0xf0, 0x0, 0x7f, 0x43, 0xf3, - 0x0, 0x0, 0x5f, 0xf0, 0x2, 0xf6, 0xc, 0xb0, - 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0xbf, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, - - /* U+F03E "" */ - 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0x32, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x7f, - 0xff, 0xfd, 0xff, 0xff, 0xfd, 0x10, 0xcf, 0xff, - 0xa0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x7, 0xff, 0xff, 0xf3, 0x5f, 0xa0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x3, 0x0, 0x0, 0x0, 0xcf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, - - /* U+F043 "" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0xfa, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, 0x0, - 0xd, 0xff, 0x70, 0x0, 0x0, 0x6f, 0xff, 0xf1, - 0x0, 0x1, 0xef, 0xff, 0xfa, 0x0, 0xb, 0xff, - 0xff, 0xff, 0x60, 0x5f, 0xff, 0xff, 0xff, 0xe0, - 0xcf, 0xff, 0xff, 0xff, 0xf6, 0xfe, 0xbf, 0xff, - 0xff, 0xf9, 0xfd, 0x4f, 0xff, 0xff, 0xf9, 0xbf, - 0x49, 0xff, 0xff, 0xf5, 0x3f, 0xe5, 0x2e, 0xff, - 0xd0, 0x6, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x28, - 0xba, 0x60, 0x0, - - /* U+F048 "" */ - 0x4, 0x30, 0x0, 0x0, 0x31, 0x1f, 0xe0, 0x0, - 0x6, 0xf9, 0x1f, 0xe0, 0x0, 0x7f, 0xfa, 0x1f, - 0xe0, 0x9, 0xff, 0xfa, 0x1f, 0xe0, 0xaf, 0xff, - 0xfa, 0x1f, 0xeb, 0xff, 0xff, 0xfa, 0x1f, 0xff, - 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, 0xff, 0xfa, - 0x1f, 0xe6, 0xff, 0xff, 0xfa, 0x1f, 0xe0, 0x5f, - 0xff, 0xfa, 0x1f, 0xe0, 0x4, 0xff, 0xfa, 0x1f, - 0xe0, 0x0, 0x3e, 0xfa, 0xf, 0xd0, 0x0, 0x2, - 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfb, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xe6, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe6, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xf, - 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0x6a, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F04C "" */ - 0x14, 0x44, 0x20, 0x1, 0x44, 0x42, 0xd, 0xff, - 0xff, 0x10, 0xdf, 0xff, 0xf1, 0xff, 0xff, 0xf3, - 0xf, 0xff, 0xff, 0x3f, 0xff, 0xff, 0x40, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, - 0x4f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xf4, 0xf, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0x40, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xf4, 0xf, - 0xff, 0xff, 0x4f, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0x30, 0xff, 0xff, 0xf3, 0x9f, 0xff, - 0xc0, 0x9, 0xff, 0xfc, 0x0, - - /* U+F04D "" */ - 0x14, 0x44, 0x44, 0x44, 0x44, 0x42, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, - - /* U+F051 "" */ - 0x2, 0x10, 0x0, 0x0, 0x42, 0xf, 0xe2, 0x0, - 0x3, 0xfb, 0xf, 0xfe, 0x30, 0x4, 0xfb, 0xf, - 0xff, 0xf4, 0x4, 0xfb, 0xf, 0xff, 0xff, 0x54, - 0xfb, 0xf, 0xff, 0xff, 0xfa, 0xfb, 0xf, 0xff, - 0xff, 0xff, 0xfb, 0xf, 0xff, 0xff, 0xff, 0xfb, - 0xf, 0xff, 0xff, 0xd6, 0xfb, 0xf, 0xff, 0xfd, - 0x14, 0xfb, 0xf, 0xff, 0xc1, 0x4, 0xfb, 0xf, - 0xfb, 0x0, 0x4, 0xfb, 0xc, 0xa0, 0x0, 0x3, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x3, 0x99, 0x99, 0x99, 0x99, 0x99, 0x50, 0x5, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd1, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0x90, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x3f, - 0xfd, 0x10, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x3f, - 0xfd, 0x10, 0x0, 0x1f, 0xfd, 0x10, 0x0, 0x0, - 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xcf, - 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, - 0x0, 0xa4, 0x0, - - /* U+F054 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0x10, 0x0, - 0x0, 0x1f, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xfd, - 0x10, 0x0, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, - 0x3f, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xfd, 0x0, - 0x0, 0x8, 0xff, 0x90, 0x0, 0x8, 0xff, 0x90, - 0x0, 0x8, 0xff, 0x90, 0x0, 0x8, 0xff, 0x90, - 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x7, 0x80, - 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, - 0x6, 0x99, 0x9a, 0xff, 0xc9, 0x99, 0x80, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x1, 0x11, 0x3f, 0xf7, - 0x11, 0x10, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xd3, 0x0, 0x0, 0x0, - - /* U+F068 "" */ - 0x69, 0x99, 0x99, 0x99, 0x99, 0x98, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F06E "" */ - 0x0, 0x0, 0x1, 0x56, 0x64, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xbf, 0xfe, 0xef, 0xf9, 0x10, 0x0, - 0x0, 0x7f, 0xfa, 0x10, 0x3, 0xdf, 0xe4, 0x0, - 0x8, 0xff, 0xa0, 0x9, 0xb4, 0x1e, 0xff, 0x50, - 0x4f, 0xff, 0x20, 0xb, 0xff, 0x26, 0xff, 0xe1, - 0xef, 0xff, 0x9, 0xcf, 0xff, 0x63, 0xff, 0xfa, - 0xbf, 0xff, 0x9, 0xff, 0xff, 0x54, 0xff, 0xf6, - 0x1e, 0xff, 0x51, 0xdf, 0xfb, 0x9, 0xff, 0xb0, - 0x3, 0xef, 0xe2, 0x4, 0x30, 0x5f, 0xfc, 0x10, - 0x0, 0x2c, 0xff, 0x95, 0x6a, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x49, 0xdf, 0xfd, 0x92, 0x0, 0x0, - - /* U+F070 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x14, 0x66, 0x40, - 0x0, 0x0, 0x0, 0x4, 0xef, 0xac, 0xff, 0xef, - 0xff, 0x91, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xa1, - 0x0, 0x4d, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9f, - 0xf5, 0xab, 0x31, 0xef, 0xf4, 0x0, 0x7, 0xb1, - 0x5, 0xff, 0xff, 0xe1, 0x7f, 0xfe, 0x10, 0xf, - 0xfe, 0x30, 0x2d, 0xff, 0xf5, 0x4f, 0xff, 0x90, - 0xc, 0xff, 0xe0, 0x0, 0xaf, 0xf6, 0x5f, 0xff, - 0x60, 0x2, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xef, - 0xfb, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, 0x3e, - 0xff, 0xc0, 0x0, 0x0, 0x2, 0xdf, 0xe8, 0x54, - 0x1, 0xbf, 0xe3, 0x0, 0x0, 0x0, 0x5, 0xae, - 0xff, 0x60, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa1, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfc, 0xcf, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x0, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, - 0xf, 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xfd, - 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0xdf, 0xff, - 0xe0, 0x2f, 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0x9b, 0xff, 0xff, 0xf3, 0x0, 0x1f, 0xff, - 0xff, 0xb0, 0xe, 0xff, 0xff, 0xc0, 0xa, 0xff, - 0xff, 0xfe, 0x24, 0xff, 0xff, 0xff, 0x60, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x6, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x30, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0x80, 0xdd, 0xdb, - 0x0, 0x0, 0x8d, 0xef, 0xf8, 0xff, 0xff, 0xb0, - 0x7, 0xff, 0xff, 0xfd, 0x55, 0x6f, 0xf4, 0x6f, - 0xf8, 0xaf, 0xe2, 0x0, 0x5, 0x74, 0xff, 0x90, - 0x7e, 0x20, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xb2, 0x50, 0x4a, 0x0, - 0x1, 0x2e, 0xfd, 0x1d, 0xf4, 0x8f, 0xb0, 0xff, - 0xff, 0xd1, 0xb, 0xff, 0xff, 0xfb, 0xff, 0xfe, - 0x20, 0x0, 0xcf, 0xff, 0xfb, 0x12, 0x21, 0x0, - 0x0, 0x2, 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5b, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, 0x95, 0xff, - 0xb0, 0x0, 0x8, 0xff, 0x90, 0x5, 0xff, 0xb0, - 0x7, 0xff, 0x90, 0x0, 0x5, 0xff, 0xb0, 0x9f, - 0x90, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x40, 0x0, - 0x0, 0x0, 0x3, 0x10, - - /* U+F078 "" */ - 0x4c, 0x20, 0x0, 0x0, 0x0, 0xb6, 0xb, 0xfe, - 0x20, 0x0, 0x0, 0xcf, 0xf0, 0x2e, 0xfe, 0x20, - 0x0, 0xcf, 0xf4, 0x0, 0x2e, 0xfe, 0x20, 0xcf, - 0xf4, 0x0, 0x0, 0x2e, 0xfe, 0xcf, 0xf4, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x13, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xf3, 0x8, 0xbb, 0xbb, 0xbb, - 0x90, 0x0, 0xb, 0xff, 0xff, 0x39, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x8f, 0xcf, 0xcf, 0xf0, 0x0, - 0x0, 0xa, 0xf1, 0x0, 0x38, 0x2f, 0x94, 0x80, - 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x2f, 0x90, - 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x2f, - 0x90, 0x0, 0x0, 0x3, 0xa, 0xf1, 0x30, 0x0, - 0x2f, 0x90, 0x0, 0x0, 0x1f, 0xcb, 0xf8, 0xf8, - 0x0, 0x2f, 0xeb, 0xbb, 0xbb, 0x39, 0xff, 0xff, - 0xe2, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xb0, 0x9f, - 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xd1, 0x0, - - /* U+F07B "" */ - 0x37, 0x88, 0x87, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xfd, 0xcc, 0xcc, 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, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x1, 0x1c, 0xff, 0xc1, 0x10, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x79, 0x99, - 0x3b, 0xff, 0xb3, 0x99, 0x97, 0xff, 0xff, 0xb2, - 0x44, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdd, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xb3, 0xcf, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xca, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xf3, 0x0, 0x0, 0x4a, 0x30, 0x2, - 0xdf, 0xf8, 0x0, 0x5, 0xdf, 0xfe, 0x15, 0xef, - 0xfb, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa2, 0x0, 0x0, - 0x0, 0x2, 0xba, 0x85, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x4, 0x86, 0x0, 0x0, 0x0, 0x10, 0x6, 0xff, - 0xfa, 0x0, 0x2, 0xdf, 0xd1, 0xef, 0x3c, 0xf1, - 0x1, 0xdf, 0xfa, 0xe, 0xe0, 0xaf, 0x21, 0xdf, - 0xfa, 0x0, 0x9f, 0xef, 0xf6, 0xdf, 0xfa, 0x0, - 0x0, 0x8d, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x48, 0xef, - 0xff, 0xf6, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0xff, - 0xf6, 0x0, 0xe, 0xf3, 0xcf, 0x23, 0xff, 0xf6, - 0x0, 0xee, 0xa, 0xf2, 0x4, 0xff, 0xf6, 0x9, - 0xfe, 0xfc, 0x0, 0x4, 0xff, 0xf1, 0x8, 0xda, - 0x10, 0x0, 0x2, 0x62, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf9, 0x87, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x98, 0xf7, 0x8, 0xa6, 0x8f, 0xff, 0xf9, - 0x59, 0x90, 0xff, 0xa8, 0xff, 0xff, 0xfc, 0xcc, - 0xf, 0xfa, 0x8f, 0xff, 0xff, 0xff, 0xf1, 0xff, - 0xa8, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfa, 0x8f, - 0xff, 0xff, 0xff, 0xf1, 0xff, 0xa8, 0xff, 0xff, - 0xff, 0xff, 0x1f, 0xfa, 0x8f, 0xff, 0xff, 0xff, - 0xf1, 0xff, 0xa8, 0xff, 0xff, 0xff, 0xff, 0x1f, - 0xfa, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xe3, - 0x12, 0x22, 0x22, 0x21, 0xf, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0xac, 0xcc, 0xcc, 0xcb, 0x50, - 0x0, 0x0, - - /* U+F0C7 "" */ - 0x49, 0x99, 0x99, 0x99, 0x95, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0xfd, 0x22, 0x22, - 0x22, 0x4f, 0xf6, 0xf, 0xc0, 0x0, 0x0, 0x1, - 0xff, 0xf3, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x6f, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xdc, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x5, - 0xff, 0xff, 0x6f, 0xff, 0xf6, 0x0, 0xf, 0xff, - 0xf6, 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0x6f, - 0xff, 0xff, 0xed, 0xff, 0xff, 0xf6, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, - - /* U+F0C9 "" */ - 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x12, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xde, - 0xee, 0xee, 0xee, 0xee, 0xee, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0E0 "" */ - 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0xd2, 0x8f, 0xff, 0xff, - 0xff, 0xf8, 0x2d, 0xff, 0x64, 0xef, 0xff, 0xfe, - 0x45, 0xff, 0xff, 0xfa, 0x2b, 0xff, 0xb2, 0xaf, - 0xff, 0xff, 0xff, 0xd3, 0x55, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, - - /* U+F0E7 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xf0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x6, - 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0x30, - 0x0, 0xa, 0xff, 0xff, 0xaa, 0xa6, 0xc, 0xff, - 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xe1, - 0xb, 0xdd, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x4f, - 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, - 0x0, 0xbf, 0xa0, 0x0, 0x0, 0x0, 0xff, 0x10, - 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, 0x3, - 0xc0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x4, 0x55, - 0xef, 0xb5, 0x52, 0x0, 0x0, 0xff, 0xfd, 0x1f, - 0xff, 0xb0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0xff, 0xff, 0x53, 0x33, 0x20, 0x0, - 0xf, 0xff, 0x97, 0xff, 0xfb, 0x57, 0x0, 0xff, - 0xf8, 0xaf, 0xff, 0xc6, 0xf8, 0xf, 0xff, 0x8a, - 0xff, 0xfc, 0x4a, 0xa1, 0xff, 0xf8, 0xaf, 0xff, - 0xe3, 0x22, 0xf, 0xff, 0x8a, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xf8, 0xaf, 0xff, 0xff, 0xff, 0x4f, - 0xff, 0x8a, 0xff, 0xff, 0xff, 0xf4, 0x35, 0x52, - 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xfe, 0x20, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, - 0xfa, 0x30, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0x50, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x2, 0x22, - 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x8, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xa2, 0x0, - 0x0, 0x0, - - /* U+F11C "" */ - 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xfc, 0xc, 0x30, 0xe1, 0x1d, 0xd, 0x11, 0xfc, - 0xfc, 0xb, 0x30, 0xe0, 0x1d, 0xd, 0x10, 0xfc, - 0xff, 0xfe, 0xff, 0xef, 0xfe, 0xfe, 0xef, 0xfc, - 0xff, 0xf1, 0x5a, 0x8, 0x70, 0xa0, 0x5f, 0xfc, - 0xff, 0xf3, 0x7b, 0x29, 0x92, 0xc2, 0x7f, 0xfc, - 0xff, 0xbf, 0xcb, 0xbb, 0xbb, 0xbf, 0xcb, 0xfc, - 0xfc, 0xb, 0x20, 0x0, 0x0, 0xd, 0x0, 0xfc, - 0xff, 0xcf, 0xcc, 0xcc, 0xcc, 0xcf, 0xcc, 0xfb, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x4, 0x9a, 0xaa, 0xaf, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xb3, 0x0, 0x0, 0x0, - - /* U+F15B "" */ - 0x35, 0x55, 0x55, 0x2, 0x0, 0xf, 0xff, 0xff, - 0xf2, 0xf4, 0x0, 0xff, 0xff, 0xff, 0x2f, 0xf4, - 0xf, 0xff, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0x32, 0x22, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8a, 0xaa, 0xaa, - 0xaa, 0xaa, 0x30, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x24, 0x55, 0x31, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xc7, - 0x0, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0xde, 0xff, - 0xff, 0xf6, 0x0, 0x5f, 0xff, 0xb5, 0x10, 0x0, - 0x3, 0x8e, 0xff, 0xb0, 0xdf, 0xd3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x18, 0x0, 0x5, - 0xae, 0xfe, 0xc8, 0x10, 0x4, 0x60, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x95, 0x34, 0x7d, 0xff, 0x40, 0x0, - 0x0, 0x2, 0xa2, 0x0, 0x0, 0x0, 0x77, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x96, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xda, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x22, 0x22, - 0x22, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x2c, 0xfa, 0xfc, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x21, 0xfa, 0xfc, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x27, 0xfa, 0xfc, 0x26, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x1f, 0xfa, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F241 "" */ - 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x22, 0x21, - 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x7, 0xfa, 0xfc, 0x26, - 0x66, 0x66, 0x66, 0x63, 0x0, 0xf, 0xfa, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F242 "" */ - 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x10, 0x0, - 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x26, - 0x66, 0x66, 0x50, 0x0, 0x0, 0xf, 0xfa, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F243 "" */ - 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xfc, 0x12, 0x22, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x26, - 0x66, 0x10, 0x0, 0x0, 0x0, 0xf, 0xfa, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F244 "" */ - 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xf7, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x7, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xdf, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa9, 0x3d, 0xf5, - 0x0, 0x0, 0x0, 0x4, 0x40, 0x2, 0xe0, 0x0, - 0x10, 0x0, 0x0, 0x0, 0xaf, 0xf8, 0xb, 0x60, - 0x0, 0x0, 0x0, 0x6c, 0x30, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xaf, 0xf9, - 0x0, 0xc, 0x50, 0x0, 0x0, 0x6d, 0x40, 0x5, - 0x50, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc4, 0x3e, 0xe8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xef, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x7, - 0xef, 0xff, 0xb3, 0x0, 0x0, 0xaf, 0xfd, 0x8f, - 0xff, 0x20, 0x4, 0xff, 0xfd, 0x9, 0xff, 0xb0, - 0xa, 0xfe, 0xfd, 0x12, 0xaf, 0xf0, 0xe, 0xf5, - 0x5d, 0x2c, 0xe, 0xf3, 0xf, 0xff, 0x33, 0x12, - 0x9f, 0xf5, 0xf, 0xff, 0xf3, 0x7, 0xff, 0xf6, - 0xf, 0xff, 0xe2, 0x6, 0xff, 0xf6, 0xf, 0xfe, - 0x24, 0x13, 0x7f, 0xf5, 0xd, 0xf5, 0x7d, 0x2c, - 0xd, 0xf3, 0xa, 0xff, 0xfd, 0x11, 0xbf, 0xf0, - 0x3, 0xff, 0xfe, 0xb, 0xff, 0xa0, 0x0, 0x7f, - 0xfe, 0xbf, 0xfe, 0x10, 0x0, 0x3, 0xac, 0xdc, - 0x81, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x34, 0x43, 0x0, 0x0, 0x5, 0x66, - 0x7f, 0xff, 0xf9, 0x66, 0x50, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x35, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x50, 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xc4, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2f, - 0xf3, 0xfb, 0x7f, 0x6d, 0xf6, 0x2, 0xff, 0x2f, - 0xb7, 0xf5, 0xdf, 0x60, 0x2f, 0xf2, 0xfb, 0x7f, - 0x5d, 0xf6, 0x2, 0xff, 0x2f, 0xb7, 0xf5, 0xdf, - 0x60, 0x2f, 0xf2, 0xfb, 0x7f, 0x5d, 0xf6, 0x2, - 0xff, 0x2f, 0xb7, 0xf5, 0xdf, 0x60, 0x2f, 0xf3, - 0xfb, 0x7f, 0x6d, 0xf6, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x7, 0xbc, 0xcc, 0xcc, 0xcc, - 0x90, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x4, 0x39, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x39, 0xff, 0xa0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x39, 0xb0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xa8, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, 0x87, - 0x40, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x3e, 0xff, 0xff, 0xcf, 0xff, - 0xcf, 0xff, 0xf7, 0x3, 0xef, 0xff, 0xf9, 0x8, - 0xf8, 0x9, 0xff, 0xf8, 0x3e, 0xff, 0xff, 0xfe, - 0x20, 0x40, 0x2e, 0xff, 0xf8, 0xdf, 0xff, 0xff, - 0xff, 0xe1, 0x1, 0xef, 0xff, 0xf8, 0x9f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x8f, 0xff, 0xf8, 0x9, - 0xff, 0xff, 0xf9, 0x2, 0xc2, 0x9, 0xff, 0xf8, - 0x0, 0x9f, 0xff, 0xfe, 0x4e, 0xfe, 0x4e, 0xff, - 0xf8, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc1, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xe2, 0x3, 0xfb, 0xfb, 0xce, 0xbf, - 0xa4, 0xff, 0x1d, 0x3, 0xa1, 0xfa, 0xff, 0xf1, - 0xd0, 0x3a, 0x1f, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x29, 0xaa, 0xaa, - 0xaa, 0xa8, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf1, 0x0, - 0x8, 0x20, 0x0, 0x0, 0x1, 0xff, 0x10, 0xb, - 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0xc, 0xff, - 0x94, 0x44, 0x44, 0x45, 0xff, 0x1b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x7f, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 60, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 60, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15, .adv_w = 88, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 28, .adv_w = 157, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 78, .adv_w = 139, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 146, .adv_w = 189, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 206, .adv_w = 154, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 261, .adv_w = 47, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 269, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 297, .adv_w = 76, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 325, .adv_w = 90, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 343, .adv_w = 130, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 371, .adv_w = 51, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 379, .adv_w = 86, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 387, .adv_w = 51, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 392, .adv_w = 79, .box_w = 7, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 441, .adv_w = 149, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 486, .adv_w = 83, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 506, .adv_w = 129, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 546, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 586, .adv_w = 150, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 636, .adv_w = 129, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 676, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 721, .adv_w = 134, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 761, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 806, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 846, .adv_w = 51, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 858, .adv_w = 51, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 875, .adv_w = 130, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 907, .adv_w = 130, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 931, .adv_w = 130, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 963, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1003, .adv_w = 232, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1094, .adv_w = 164, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1154, .adv_w = 170, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1199, .adv_w = 162, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1249, .adv_w = 185, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1299, .adv_w = 150, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1339, .adv_w = 142, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1379, .adv_w = 173, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1429, .adv_w = 182, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1474, .adv_w = 69, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1484, .adv_w = 115, .box_w = 7, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1519, .adv_w = 161, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1569, .adv_w = 133, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1609, .adv_w = 214, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1664, .adv_w = 182, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1709, .adv_w = 188, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1769, .adv_w = 162, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1814, .adv_w = 188, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1892, .adv_w = 163, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1937, .adv_w = 139, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1982, .adv_w = 131, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2027, .adv_w = 177, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2072, .adv_w = 159, .box_w = 11, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2127, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2207, .adv_w = 151, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2257, .adv_w = 145, .box_w = 11, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2312, .adv_w = 147, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2357, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 2385, .adv_w = 79, .box_w = 7, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 2434, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2462, .adv_w = 131, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 2483, .adv_w = 112, .box_w = 7, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2487, .adv_w = 134, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 2492, .adv_w = 134, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2524, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2568, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2600, .adv_w = 153, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2650, .adv_w = 137, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2682, .adv_w = 79, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2715, .adv_w = 155, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2765, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2809, .adv_w = 62, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2820, .adv_w = 64, .box_w = 5, .box_h = 14, .ofs_x = -2, .ofs_y = -3}, - {.bitmap_index = 2855, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2899, .adv_w = 62, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2910, .adv_w = 237, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2962, .adv_w = 153, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2994, .adv_w = 142, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3030, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 3074, .adv_w = 153, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3124, .adv_w = 92, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3144, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3172, .adv_w = 93, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3202, .adv_w = 152, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3234, .adv_w = 125, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3270, .adv_w = 201, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3322, .adv_w = 124, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3354, .adv_w = 125, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 3404, .adv_w = 117, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3432, .adv_w = 79, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3467, .adv_w = 67, .box_w = 2, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 3481, .adv_w = 79, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3516, .adv_w = 130, .box_w = 8, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 3528, .adv_w = 94, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 3543, .adv_w = 70, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 3549, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 3662, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3739, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3830, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3907, .adv_w = 154, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3962, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4067, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4172, .adv_w = 252, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4276, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4381, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4469, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4574, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4616, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4682, .adv_w = 252, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4794, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4871, .adv_w = 154, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4946, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 5016, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5114, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5199, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5284, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 5354, .adv_w = 196, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 5445, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5504, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5563, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5648, .adv_w = 196, .box_w = 13, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 5674, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5762, .adv_w = 280, .box_w = 18, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5897, .adv_w = 252, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 6025, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6116, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 6168, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 6220, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6319, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6396, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6501, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 6614, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6699, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6797, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6882, .adv_w = 196, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6960, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7037, .adv_w = 140, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 7112, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7210, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7308, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7396, .adv_w = 224, .box_w = 16, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 7516, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7599, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7716, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7806, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7896, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7986, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8076, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8166, .adv_w = 280, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8274, .adv_w = 196, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8364, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8462, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 8575, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8674, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8757, .adv_w = 225, .box_w = 15, .box_h = 10, .ofs_x = 0, .ofs_y = 0} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 2, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 10, 0, 6, -5, 0, 0, - 0, 0, -12, -13, 2, 11, 5, 4, - -9, 2, 11, 1, 9, 2, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 13, 2, -2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, -7, 0, 0, 0, 0, - 0, -4, 4, 4, 0, 0, -2, 0, - -2, 2, 0, -2, 0, -2, -1, -4, - 0, 0, 0, 0, -2, 0, 0, -3, - -3, 0, 0, -2, 0, -4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - -2, 0, -3, 0, -6, 0, -27, 0, - 0, -4, 0, 4, 7, 0, 0, -4, - 2, 2, 7, 4, -4, 4, 0, 0, - -13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -6, -3, -11, 0, -9, - -2, 0, 0, 0, 0, 0, 9, 0, - -7, -2, -1, 1, 0, -4, 0, 0, - -2, -17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -18, -2, 9, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, - 0, 2, 0, 0, -4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 2, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, - 4, 2, 7, -2, 0, 0, 4, -2, - -7, -31, 2, 6, 4, 0, -3, 0, - 8, 0, 7, 0, 7, 0, -21, 0, - -3, 7, 0, 7, -2, 4, 2, 0, - 0, 1, -2, 0, 0, -4, 18, 0, - 18, 0, 7, 0, 9, 3, 4, 7, - 0, 0, 0, -8, 0, 0, 0, 0, - 1, -2, 0, 2, -4, -3, -4, 2, - 0, -2, 0, 0, 0, -9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, -12, 0, -14, 0, 0, 0, - 0, -2, 0, 22, -3, -3, 2, 2, - -2, 0, -3, 2, 0, 0, -12, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -22, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -14, 0, 13, 0, 0, -8, 0, - 7, 0, -15, -22, -15, -4, 7, 0, - 0, -15, 0, 3, -5, 0, -3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 7, -27, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 11, 0, 2, 0, 0, 0, - 0, 0, 2, 2, -3, -4, 0, -1, - -1, -2, 0, 0, -2, 0, 0, 0, - -4, 0, -2, 0, -5, -4, 0, -6, - -7, -7, -4, 0, -4, 0, -4, 0, - 0, 0, 0, -2, 0, 0, 2, 0, - 2, -2, 0, 1, 0, 0, 0, 2, - -2, 0, 0, 0, -2, 2, 2, -1, - 0, 0, 0, -4, 0, -1, 0, 0, - 0, 0, 0, 1, 0, 3, -2, 0, - -3, 0, -4, 0, 0, -2, 0, 7, - 0, 0, -2, 0, 0, 0, 0, 0, - -1, 1, -2, -2, 0, 0, -2, 0, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, -1, 0, -2, -3, 0, - 0, 0, 0, 0, 1, 0, 0, -2, - 0, -2, -2, -2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -1, 0, 0, - 0, 0, -2, -3, 0, -3, 0, -7, - -2, -7, 4, 0, 0, -4, 2, 4, - 6, 0, -6, -1, -3, 0, -1, -11, - 2, -2, 2, -12, 2, 0, 0, 1, - -12, 0, -12, -2, -19, -2, 0, -11, - 0, 4, 6, 0, 3, 0, 0, 0, - 0, 0, 0, -4, -3, 0, -7, 0, - 0, 0, -2, 0, 0, 0, -2, 0, - 0, 0, 0, 0, -1, -1, 0, -1, - -3, 0, 0, 0, 0, 0, 0, 0, - -2, -2, 0, -2, -3, -2, 0, 0, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, -2, 0, -3, - 0, -2, 0, -4, 2, 0, 0, -3, - 1, 2, 2, 0, 0, 0, 0, 0, - 0, -2, 0, 0, 0, 0, 0, 2, - 0, 0, -2, 0, -2, -2, -3, 0, - 0, 0, 0, 0, 0, 0, 2, 0, - -2, 0, 0, 0, 0, -2, -3, 0, - -4, 0, 7, -2, 1, -7, 0, 0, - 6, -11, -12, -9, -4, 2, 0, -2, - -15, -4, 0, -4, 0, -4, 3, -4, - -14, 0, -6, 0, 0, 1, -1, 2, - -2, 0, 2, 0, -7, -9, 0, -11, - -5, -5, -5, -7, -3, -6, 0, -4, - -6, 1, 0, 1, 0, -2, 0, 0, - 0, 2, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - 0, -1, 0, -1, -2, 0, -4, -5, - -5, -1, 0, -7, 0, 0, 0, 0, - 0, 0, -2, 0, 0, 0, 0, 1, - -1, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 11, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, 0, 0, - -4, 0, 0, 0, 0, -11, -7, 0, - 0, 0, -3, -11, 0, 0, -2, 2, - 0, -6, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, 0, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, -4, 0, - 0, 0, 0, 3, 0, 2, -4, -4, - 0, -2, -2, -3, 0, 0, 0, 0, - 0, 0, -7, 0, -2, 0, -3, -2, - 0, -5, -6, -7, -2, 0, -4, 0, - -7, 0, 0, 0, 0, 18, 0, 0, - 1, 0, 0, -3, 0, 2, 0, -10, - 0, 0, 0, 0, 0, -21, -4, 7, - 7, -2, -9, 0, 2, -3, 0, -11, - -1, -3, 2, -16, -2, 3, 0, 3, - -8, -3, -8, -7, -9, 0, 0, -13, - 0, 13, 0, 0, -1, 0, 0, 0, - -1, -1, -2, -6, -7, 0, -21, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -2, 0, -1, -2, -3, 0, 0, - -4, 0, -2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, -4, 0, 0, 4, - -1, 3, 0, -5, 2, -2, -1, -6, - -2, 0, -3, -2, -2, 0, -3, -4, - 0, 0, -2, -1, -2, -4, -3, 0, - 0, -2, 0, 2, -2, 0, -5, 0, - 0, 0, -4, 0, -4, 0, -4, -4, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, -4, 2, 0, -3, 0, -2, -3, - -7, -2, -2, -2, -1, -2, -3, -1, - 0, 0, 0, 0, 0, -2, -2, -2, - 0, 0, 0, 0, 3, -2, 0, -2, - 0, 0, 0, -2, -3, -2, -2, -3, - -2, 0, 2, 9, -1, 0, -6, 0, - -2, 4, 0, -2, -9, -3, 3, 0, - 0, -11, -4, 2, -4, 2, 0, -2, - -2, -7, 0, -3, 1, 0, 0, -4, - 0, 0, 0, 2, 2, -4, -4, 0, - -4, -2, -3, -2, -2, 0, -4, 1, - -4, -4, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 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, - -2, 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, -2, -2, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, 0, -3, - 0, 0, -2, -2, 0, 0, 0, 0, - -2, 0, 0, 0, 0, -1, 0, 0, - 0, 0, 0, -2, 0, 0, 0, 0, - -3, 0, -4, 0, 0, 0, -7, 0, - 2, -5, 4, 0, -2, -11, 0, 0, - -5, -2, 0, -9, -6, -6, 0, 0, - -10, -2, -9, -9, -11, 0, -6, 0, - 2, 15, -3, 0, -5, -2, -1, -2, - -4, -6, -4, -8, -9, -5, -2, 0, - 0, -2, 0, 1, 0, 0, -16, -2, - 7, 5, -5, -8, 0, 1, -7, 0, - -11, -2, -2, 4, -21, -3, 1, 0, - 0, -15, -3, -12, -2, -16, 0, 0, - -16, 0, 13, 1, 0, -2, 0, 0, - 0, 0, -1, -2, -9, -2, 0, -15, - 0, 0, 0, 0, -7, 0, -2, 0, - -1, -6, -11, 0, 0, -1, -3, -7, - -2, 0, -2, 0, 0, 0, 0, -10, - -2, -7, -7, -2, -4, -6, -2, -4, - 0, -4, -2, -7, -3, 0, -3, -4, - -2, -4, 0, 1, 0, -2, -7, 0, - 4, 0, -4, 0, 0, 0, 0, 3, - 0, 2, -4, 9, 0, -2, -2, -3, - 0, 0, 0, 0, 0, 0, -7, 0, - -2, 0, -3, -2, 0, -5, -6, -7, - -2, 0, -4, 2, 9, 0, 0, 0, - 0, 18, 0, 0, 1, 0, 0, -3, - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -2, -4, 0, 0, 0, 0, 0, -1, - 0, 0, 0, -2, -2, 0, 0, -4, - -2, 0, 0, -4, 0, 4, -1, 0, - 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 3, 4, 2, -2, 0, -7, - -4, 0, 7, -7, -7, -4, -4, 9, - 4, 2, -19, -2, 4, -2, 0, -2, - 2, -2, -8, 0, -2, 2, -3, -2, - -7, -2, 0, 0, 7, 4, 0, -6, - 0, -12, -3, 6, -3, -9, 1, -3, - -7, -7, -2, 9, 2, 0, -3, 0, - -6, 0, 2, 7, -5, -8, -9, -6, - 7, 0, 1, -16, -2, 2, -4, -2, - -5, 0, -5, -8, -3, -3, -2, 0, - 0, -5, -5, -2, 0, 7, 5, -2, - -12, 0, -12, -3, 0, -8, -13, -1, - -7, -4, -7, -6, 6, 0, 0, -3, - 0, -4, -2, 0, -2, -4, 0, 4, - -7, 2, 0, 0, -12, 0, -2, -5, - -4, -2, -7, -6, -7, -5, 0, -7, - -2, -5, -4, -7, -2, 0, 0, 1, - 11, -4, 0, -7, -2, 0, -2, -4, - -5, -6, -6, -9, -3, -4, 4, 0, - -3, 0, -11, -3, 1, 4, -7, -8, - -4, -7, 7, -2, 1, -21, -4, 4, - -5, -4, -8, 0, -7, -9, -3, -2, - -2, -2, -5, -7, -1, 0, 0, 7, - 6, -2, -15, 0, -13, -5, 5, -9, - -15, -4, -8, -9, -11, -7, 4, 0, - 0, 0, 0, -3, 0, 0, 2, -3, - 4, 2, -4, 4, 0, 0, -7, -1, - 0, -1, 0, 1, 1, -2, 0, 0, - 0, 0, 0, 0, -2, 0, 0, 0, - 0, 2, 7, 0, 0, -3, 0, 0, - 0, 0, -2, -2, -3, 0, 0, 0, - 1, 2, 0, 0, 0, 0, 2, 0, - -2, 0, 9, 0, 4, 1, 1, -3, - 0, 4, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 0, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -13, 0, -2, 4, 0, 7, - 0, 0, 22, 3, -4, -4, 2, 2, - -2, 1, -11, 0, 0, 11, -13, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -15, 9, 31, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -13, 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, -4, 0, 0, -4, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, -6, 0, - 0, 1, 0, 0, 2, 29, -4, -2, - 7, 6, -6, 2, 0, 0, 2, 2, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -29, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -6, - 0, 0, 0, -6, 0, 0, 0, 0, - -5, -1, 0, 0, 0, -5, 0, -3, - 0, -11, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -15, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, -2, 0, 0, -4, 0, -3, 0, - -6, 0, 0, 0, -4, 2, -3, 0, - 0, -6, -2, -5, 0, 0, -6, 0, - -2, 0, -11, 0, -2, 0, 0, -18, - -4, -9, -2, -8, 0, 0, -15, 0, - -6, -1, 0, 0, 0, 0, 0, 0, - 0, 0, -3, -4, -2, -4, 0, 0, - 0, 0, -5, 0, -5, 3, -2, 4, - 0, -2, -5, -2, -4, -4, 0, -3, - -1, -2, 2, -6, -1, 0, 0, 0, - -20, -2, -3, 0, -5, 0, -2, -11, - -2, 0, 0, -2, -2, 0, 0, 0, - 0, 2, 0, -2, -4, -2, 4, 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, 3, 0, 0, 0, 0, 0, - 0, -5, 0, -2, 0, 0, 0, -4, - 2, 0, 0, 0, -6, -2, -4, 0, - 0, -6, 0, -2, 0, -11, 0, 0, - 0, 0, -22, 0, -4, -8, -11, 0, - 0, -15, 0, -2, -3, 0, 0, 0, - 0, 0, 0, 0, 0, -2, -3, -1, - -3, 1, 0, 0, 4, -3, 0, 7, - 11, -2, -2, -7, 3, 11, 4, 5, - -6, 3, 9, 3, 6, 5, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 14, 11, -4, -2, 0, -2, - 18, 10, 18, 0, 0, 0, 2, 0, - 0, 8, 0, 0, -4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2, 0, - 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, -19, -3, -2, -9, - -11, 0, 0, -15, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, -19, -3, -2, - -9, -11, 0, 0, -9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -2, 0, 0, 0, -5, 2, 0, -2, - 2, 4, 2, -7, 0, 0, -2, 2, - 0, 2, 0, 0, 0, 0, -6, 0, - -2, -2, -4, 0, -2, -9, 0, 14, - -2, 0, -5, -2, 0, -2, -4, 0, - -2, -6, -4, -3, 0, 0, 0, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -2, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, -19, - -3, -2, -9, -11, 0, 0, -15, 0, - 0, 0, 0, 0, 0, 11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -4, 0, -7, -3, -2, 7, -2, -2, - -9, 1, -1, 1, -2, -6, 0, 5, - 0, 2, 1, 2, -5, -9, -3, 0, - -9, -4, -6, -9, -9, 0, -4, -4, - -3, -3, -2, -2, -3, -2, 0, -2, - -1, 3, 0, 3, -2, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -2, -2, -2, 0, 0, - -6, 0, -1, 0, -4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, -2, 0, -3, - 0, 0, 0, 0, -2, 0, 0, -4, - -2, 2, 0, -4, -4, -2, 0, -6, - -2, -5, -2, -3, 0, -4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -15, 0, 7, 0, 0, -4, 0, - 0, 0, 0, -3, 0, -2, 0, 0, - -1, 0, 0, -2, 0, -5, 0, 0, - 9, -3, -7, -7, 2, 2, 2, 0, - -6, 2, 3, 2, 7, 2, 7, -2, - -6, 0, 0, -9, 0, 0, -7, -6, - 0, 0, -4, 0, -3, -4, 0, -3, - 0, -3, 0, -2, 3, 0, -2, -7, - -2, 8, 0, 0, -2, 0, -4, 0, - 0, 3, -5, 0, 2, -2, 2, 0, - 0, -7, 0, -2, -1, 0, -2, 2, - -2, 0, 0, 0, -9, -3, -5, 0, - -7, 0, 0, -11, 0, 8, -2, 0, - -4, 0, 1, 0, -2, 0, -2, -7, - 0, -2, 2, 0, 0, 0, 0, -2, - 0, 0, 2, -3, 1, 0, 0, -3, - -2, 0, -3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -14, 0, 5, 0, - 0, -2, 0, 0, 0, 0, 0, 0, - -2, -2, 0, 0, 0, 4, 0, 5, - 0, 0, 0, 0, 0, -14, -13, 1, - 10, 7, 4, -9, 2, 9, 0, 8, - 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_14 = { -#else -lv_font_t lv_font_montserrat_14 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 16, /*The maximum line height required by the font*/ - .base_line = 3, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -1, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_14*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_16.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_16.c deleted file mode 100644 index 36cdea4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_16.c +++ /dev/null @@ -1,2460 +0,0 @@ -/******************************************************************************* - * Size: 16 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_16.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_16 - #define LV_FONT_MONTSERRAT_16 1 -#endif - -#if LV_FONT_MONTSERRAT_16 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0xbf, 0xb, 0xf0, 0xaf, 0xa, 0xe0, 0x9e, 0x8, - 0xd0, 0x8c, 0x7, 0xc0, 0x0, 0x0, 0x10, 0xbf, - 0x1a, 0xe0, - - /* U+0022 "\"" */ - 0xf5, 0x1f, 0x3f, 0x51, 0xf3, 0xe4, 0xf, 0x3e, - 0x40, 0xf2, 0x72, 0x8, 0x10, - - /* U+0023 "#" */ - 0x0, 0x5, 0xc0, 0x3, 0xe0, 0x0, 0x0, 0x7a, - 0x0, 0x5c, 0x0, 0x0, 0x9, 0x80, 0x7, 0xa0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3, 0x3e, - 0x73, 0x3c, 0x83, 0x30, 0x0, 0xf2, 0x0, 0xc5, - 0x0, 0x0, 0xf, 0x10, 0xe, 0x30, 0x0, 0x2, - 0xf0, 0x0, 0xf2, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0x41, 0x38, 0xc3, 0x36, 0xe3, 0x30, 0x0, - 0x89, 0x0, 0x5c, 0x0, 0x0, 0xa, 0x70, 0x7, - 0xa0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x0, 0x79, - 0x0, 0x0, 0x0, 0x5c, 0xff, 0xe9, 0x20, 0x6, - 0xfc, 0xbc, 0x9e, 0x90, 0xe, 0xb0, 0x79, 0x0, - 0x10, 0xf, 0x80, 0x79, 0x0, 0x0, 0xd, 0xf5, - 0x79, 0x0, 0x0, 0x3, 0xef, 0xfd, 0x50, 0x0, - 0x0, 0x6, 0xcf, 0xfe, 0x40, 0x0, 0x0, 0x79, - 0x5e, 0xf1, 0x0, 0x0, 0x79, 0x5, 0xf3, 0x7, - 0x0, 0x79, 0x7, 0xf1, 0x2f, 0xe9, 0xbc, 0xaf, - 0xa0, 0x3, 0xae, 0xff, 0xd7, 0x0, 0x0, 0x0, - 0x79, 0x0, 0x0, 0x0, 0x0, 0x79, 0x0, 0x0, - - /* U+0025 "%" */ - 0x3, 0xde, 0x80, 0x0, 0x5, 0xd0, 0x0, 0xe4, - 0xc, 0x50, 0x1, 0xe3, 0x0, 0x4c, 0x0, 0x5a, - 0x0, 0xa9, 0x0, 0x6, 0xa0, 0x4, 0xc0, 0x4e, - 0x0, 0x0, 0x4c, 0x0, 0x5a, 0xd, 0x50, 0x0, - 0x0, 0xe4, 0x1c, 0x58, 0xa0, 0x0, 0x0, 0x3, - 0xce, 0x73, 0xe1, 0x3c, 0xe9, 0x0, 0x0, 0x0, - 0xd6, 0xe, 0x40, 0xa8, 0x0, 0x0, 0x7c, 0x3, - 0xc0, 0x3, 0xd0, 0x0, 0x2e, 0x20, 0x3c, 0x0, - 0x3d, 0x0, 0xb, 0x70, 0x0, 0xe2, 0x9, 0x80, - 0x6, 0xd0, 0x0, 0x4, 0xdd, 0xa0, - - /* U+0026 "&" */ - 0x0, 0x9, 0xef, 0xb1, 0x0, 0x0, 0x9, 0xe4, - 0x3c, 0xa0, 0x0, 0x0, 0xd9, 0x0, 0x7d, 0x0, - 0x0, 0xc, 0xc0, 0x1c, 0xa0, 0x0, 0x0, 0x3f, - 0xae, 0xc1, 0x0, 0x0, 0x1, 0xdf, 0xc0, 0x0, - 0x0, 0x3, 0xeb, 0x8f, 0x70, 0x18, 0x0, 0xdb, - 0x0, 0x7f, 0x65, 0xf0, 0x3f, 0x40, 0x0, 0x8f, - 0xea, 0x3, 0xf7, 0x0, 0x0, 0xcf, 0x70, 0xb, - 0xf9, 0x66, 0xcf, 0xbf, 0x40, 0x8, 0xdf, 0xea, - 0x30, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0xf5, 0xf5, 0xe4, 0xe4, 0x72, - - /* U+0028 "(" */ - 0x0, 0xda, 0x5, 0xf2, 0xb, 0xc0, 0xf, 0x70, - 0x3f, 0x40, 0x5f, 0x20, 0x6f, 0x10, 0x7f, 0x0, - 0x6f, 0x10, 0x5f, 0x20, 0x3f, 0x40, 0xf, 0x70, - 0xb, 0xc0, 0x5, 0xf2, 0x0, 0xda, - - /* U+0029 ")" */ - 0x3f, 0x30, 0xc, 0xb0, 0x6, 0xf1, 0x1, 0xf6, - 0x0, 0xe9, 0x0, 0xbc, 0x0, 0xad, 0x0, 0xae, - 0x0, 0xad, 0x0, 0xbc, 0x0, 0xe9, 0x1, 0xf6, - 0x6, 0xf1, 0xc, 0xb0, 0x3f, 0x30, - - /* U+002A "*" */ - 0x0, 0x4a, 0x0, 0x6, 0x74, 0xa4, 0xa0, 0x2b, - 0xff, 0xe5, 0x0, 0x7f, 0xfb, 0x20, 0x7b, 0x6b, - 0x8d, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x13, 0x0, - 0x0, - - /* U+002B "+" */ - 0x0, 0x5, 0x10, 0x0, 0x0, 0xf, 0x50, 0x0, - 0x0, 0xf, 0x50, 0x0, 0x1, 0x1f, 0x51, 0x10, - 0xef, 0xff, 0xff, 0xf3, 0x34, 0x4f, 0x74, 0x40, - 0x0, 0xf, 0x50, 0x0, 0x0, 0xf, 0x50, 0x0, - - /* U+002C "," */ - 0x9, 0x52, 0xfd, 0xb, 0xa0, 0xc5, 0xf, 0x0, - - /* U+002D "-" */ - 0x1, 0x11, 0x10, 0x1f, 0xff, 0xf3, 0x4, 0x44, - 0x40, - - /* U+002E "." */ - 0x3, 0x12, 0xfc, 0x1e, 0x90, - - /* U+002F "/" */ - 0x0, 0x0, 0x5, 0xf1, 0x0, 0x0, 0xa, 0xb0, - 0x0, 0x0, 0xf, 0x60, 0x0, 0x0, 0x5f, 0x10, - 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0xf6, 0x0, - 0x0, 0x5, 0xf1, 0x0, 0x0, 0xa, 0xb0, 0x0, - 0x0, 0xf, 0x60, 0x0, 0x0, 0x4f, 0x10, 0x0, - 0x0, 0xac, 0x0, 0x0, 0x0, 0xf6, 0x0, 0x0, - 0x4, 0xf1, 0x0, 0x0, 0xa, 0xc0, 0x0, 0x0, - 0xe, 0x60, 0x0, 0x0, 0x4f, 0x10, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x8, 0xef, 0xc5, 0x0, 0x0, 0xcf, 0xa8, - 0xcf, 0x70, 0x7, 0xf5, 0x0, 0xa, 0xf2, 0xd, - 0xc0, 0x0, 0x1, 0xf8, 0x1f, 0x80, 0x0, 0x0, - 0xdc, 0x3f, 0x60, 0x0, 0x0, 0xbd, 0x3f, 0x60, - 0x0, 0x0, 0xbd, 0x1f, 0x80, 0x0, 0x0, 0xdc, - 0xd, 0xc0, 0x0, 0x1, 0xf8, 0x7, 0xf5, 0x0, - 0xa, 0xf2, 0x0, 0xcf, 0xa8, 0xcf, 0x70, 0x0, - 0x8, 0xef, 0xc5, 0x0, - - /* U+0031 "1" */ - 0xef, 0xff, 0x36, 0x7a, 0xf3, 0x0, 0x5f, 0x30, - 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, - 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, - 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, - - /* U+0032 "2" */ - 0x4, 0xbe, 0xfd, 0x70, 0x7, 0xfd, 0x98, 0xcf, - 0x90, 0x28, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, - 0x7, 0xf2, 0x0, 0x0, 0x0, 0xaf, 0x0, 0x0, - 0x0, 0x4f, 0x80, 0x0, 0x0, 0x3f, 0xc0, 0x0, - 0x0, 0x3e, 0xc1, 0x0, 0x0, 0x2e, 0xc1, 0x0, - 0x0, 0x2e, 0xd1, 0x0, 0x0, 0x2e, 0xf8, 0x77, - 0x77, 0x46, 0xff, 0xff, 0xff, 0xfa, - - /* U+0033 "3" */ - 0x6f, 0xff, 0xff, 0xff, 0x2, 0x77, 0x77, 0x9f, - 0xb0, 0x0, 0x0, 0xc, 0xe1, 0x0, 0x0, 0x9, - 0xf3, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, - 0xdf, 0xe9, 0x10, 0x0, 0x4, 0x59, 0xfd, 0x0, - 0x0, 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0x3f, - 0x64, 0x40, 0x0, 0x8, 0xf3, 0xbf, 0xc9, 0x8c, - 0xfb, 0x0, 0x7c, 0xff, 0xd7, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x1, 0xeb, 0x0, 0x0, 0x0, 0x0, - 0xbe, 0x10, 0x0, 0x0, 0x0, 0x6f, 0x50, 0x0, - 0x0, 0x0, 0x2f, 0x90, 0x0, 0x0, 0x0, 0xc, - 0xd0, 0x0, 0x0, 0x0, 0x8, 0xf3, 0x1, 0xd5, - 0x0, 0x3, 0xf8, 0x0, 0x2f, 0x60, 0x0, 0xed, - 0x22, 0x23, 0xf7, 0x21, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0x81, 0x55, 0x55, 0x56, 0xf9, 0x52, 0x0, - 0x0, 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0x2, - 0xf6, 0x0, - - /* U+0035 "5" */ - 0x5, 0xff, 0xff, 0xff, 0x0, 0x7f, 0x77, 0x77, - 0x70, 0x8, 0xe0, 0x0, 0x0, 0x0, 0xad, 0x0, - 0x0, 0x0, 0xb, 0xc2, 0x10, 0x0, 0x0, 0xdf, - 0xff, 0xfb, 0x30, 0x4, 0x55, 0x68, 0xff, 0x20, - 0x0, 0x0, 0x4, 0xf8, 0x0, 0x0, 0x0, 0xf, - 0x92, 0x50, 0x0, 0x5, 0xf6, 0x8f, 0xd9, 0x8a, - 0xfd, 0x10, 0x5b, 0xef, 0xe9, 0x10, - - /* U+0036 "6" */ - 0x0, 0x5, 0xce, 0xfc, 0x60, 0x0, 0x9f, 0xc8, - 0x8b, 0x70, 0x5, 0xf8, 0x0, 0x0, 0x0, 0xc, - 0xd0, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, - 0x0, 0x2f, 0x68, 0xef, 0xfa, 0x10, 0x3f, 0xee, - 0x64, 0x8f, 0xd0, 0x2f, 0xf1, 0x0, 0x6, 0xf4, - 0xe, 0xc0, 0x0, 0x2, 0xf6, 0x9, 0xf1, 0x0, - 0x6, 0xf3, 0x1, 0xde, 0x86, 0x9f, 0xb0, 0x0, - 0x19, 0xef, 0xd8, 0x0, - - /* U+0037 "7" */ - 0x8f, 0xff, 0xff, 0xff, 0xe8, 0xf7, 0x77, 0x77, - 0xfc, 0x8f, 0x0, 0x0, 0x4f, 0x55, 0x90, 0x0, - 0xb, 0xe0, 0x0, 0x0, 0x2, 0xf8, 0x0, 0x0, - 0x0, 0x9f, 0x10, 0x0, 0x0, 0xf, 0xb0, 0x0, - 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0xdd, 0x0, - 0x0, 0x0, 0x3f, 0x70, 0x0, 0x0, 0xa, 0xf1, - 0x0, 0x0, 0x1, 0xf9, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x5c, 0xff, 0xd7, 0x0, 0x6, 0xfc, 0x76, - 0xaf, 0xa0, 0xc, 0xd0, 0x0, 0x9, 0xf1, 0xd, - 0xc0, 0x0, 0x7, 0xf2, 0x7, 0xf7, 0x11, 0x5e, - 0xc0, 0x0, 0xbf, 0xff, 0xfe, 0x10, 0x9, 0xf9, - 0x54, 0x7e, 0xd0, 0x2f, 0x80, 0x0, 0x4, 0xf6, - 0x4f, 0x50, 0x0, 0x0, 0xf8, 0x1f, 0xa0, 0x0, - 0x5, 0xf6, 0x9, 0xfb, 0x76, 0xaf, 0xd0, 0x0, - 0x6c, 0xff, 0xd8, 0x10, - - /* U+0039 "9" */ - 0x0, 0x8e, 0xfd, 0x80, 0x0, 0xc, 0xf8, 0x68, - 0xfc, 0x0, 0x5f, 0x50, 0x0, 0x3f, 0x70, 0x8f, - 0x0, 0x0, 0xe, 0xc0, 0x7f, 0x30, 0x0, 0x1f, - 0xf0, 0x1f, 0xd4, 0x13, 0xcf, 0xf1, 0x4, 0xef, - 0xff, 0xa9, 0xf0, 0x0, 0x2, 0x31, 0xa, 0xf0, - 0x0, 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0x0, - 0x9f, 0x30, 0x9, 0xa7, 0x8d, 0xf7, 0x0, 0x7, - 0xdf, 0xeb, 0x40, 0x0, - - /* U+003A ":" */ - 0x1e, 0x92, 0xfc, 0x3, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x12, 0xfc, 0x1e, 0x90, - - /* U+003B ";" */ - 0x1e, 0x92, 0xfc, 0x3, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xe9, 0x1f, 0xd0, 0xa8, 0xe, - 0x30, 0xa0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x42, 0x0, 0x1, 0x7d, 0xf3, - 0x3, 0x9f, 0xe8, 0x10, 0xbf, 0xb5, 0x0, 0x0, - 0xee, 0x81, 0x0, 0x0, 0x17, 0xdf, 0xb4, 0x0, - 0x0, 0x4, 0xaf, 0xd2, 0x0, 0x0, 0x1, 0x82, - - /* U+003D "=" */ - 0xef, 0xff, 0xff, 0xf3, 0x45, 0x55, 0x55, 0x51, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x10, - 0xef, 0xff, 0xff, 0xf3, 0x34, 0x44, 0x44, 0x40, - - /* U+003E ">" */ - 0x50, 0x0, 0x0, 0x0, 0xef, 0x92, 0x0, 0x0, - 0x6, 0xcf, 0xb5, 0x0, 0x0, 0x3, 0x9f, 0xe2, - 0x0, 0x0, 0x6c, 0xf3, 0x2, 0x9e, 0xe9, 0x20, - 0xbf, 0xc6, 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x4, 0xbe, 0xfd, 0x70, 0x7, 0xfc, 0x77, 0xbf, - 0xa0, 0x27, 0x0, 0x0, 0xcf, 0x0, 0x0, 0x0, - 0x9, 0xf0, 0x0, 0x0, 0x1, 0xea, 0x0, 0x0, - 0x1, 0xdd, 0x10, 0x0, 0x0, 0xce, 0x10, 0x0, - 0x0, 0x3f, 0x60, 0x0, 0x0, 0x1, 0x30, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x6, 0xf5, - 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x17, 0xce, 0xfd, 0xb5, 0x0, 0x0, - 0x0, 0x5, 0xfb, 0x53, 0x23, 0x7d, 0xc2, 0x0, - 0x0, 0x6e, 0x40, 0x0, 0x0, 0x0, 0x8e, 0x10, - 0x2, 0xf4, 0x1, 0xae, 0xfa, 0x3f, 0x49, 0xb0, - 0xa, 0x90, 0x1e, 0xe6, 0x5b, 0xef, 0x40, 0xe3, - 0xf, 0x30, 0x8f, 0x10, 0x0, 0xaf, 0x40, 0x98, - 0x1f, 0x0, 0xd9, 0x0, 0x0, 0x3f, 0x40, 0x6a, - 0x3f, 0x0, 0xe8, 0x0, 0x0, 0x1f, 0x40, 0x5c, - 0x1f, 0x0, 0xd9, 0x0, 0x0, 0x3f, 0x40, 0x6a, - 0xf, 0x30, 0x8f, 0x10, 0x0, 0xaf, 0x40, 0x98, - 0xa, 0x90, 0x1e, 0xd6, 0x5a, 0xde, 0xa6, 0xf2, - 0x3, 0xf3, 0x1, 0xaf, 0xfa, 0x16, 0xee, 0x50, - 0x0, 0x6e, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xfb, 0x53, 0x23, 0x75, 0x0, 0x0, - 0x0, 0x0, 0x17, 0xce, 0xfd, 0xa3, 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x2, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xf, - 0x9e, 0xb0, 0x0, 0x0, 0x0, 0x6, 0xf2, 0x7f, - 0x20, 0x0, 0x0, 0x0, 0xdc, 0x1, 0xf8, 0x0, - 0x0, 0x0, 0x4f, 0x60, 0xb, 0xe0, 0x0, 0x0, - 0xb, 0xf0, 0x0, 0x4f, 0x60, 0x0, 0x1, 0xfa, - 0x11, 0x11, 0xed, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0xe, 0xc4, 0x44, 0x44, 0x4f, - 0xa0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0x10, - 0xcd, 0x0, 0x0, 0x0, 0x2, 0xf8, - - /* U+0042 "B" */ - 0x5f, 0xff, 0xff, 0xeb, 0x40, 0x5, 0xf8, 0x55, - 0x57, 0xdf, 0x40, 0x5f, 0x40, 0x0, 0x1, 0xfa, - 0x5, 0xf4, 0x0, 0x0, 0xf, 0xa0, 0x5f, 0x51, - 0x11, 0x3a, 0xf4, 0x5, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x5f, 0x74, 0x44, 0x59, 0xfa, 0x5, 0xf4, - 0x0, 0x0, 0x8, 0xf2, 0x5f, 0x40, 0x0, 0x0, - 0x5f, 0x45, 0xf4, 0x0, 0x0, 0x9, 0xf2, 0x5f, - 0x85, 0x55, 0x6a, 0xfb, 0x5, 0xff, 0xff, 0xff, - 0xd7, 0x0, - - /* U+0043 "C" */ - 0x0, 0x2, 0x8d, 0xfe, 0xb4, 0x0, 0x4, 0xff, - 0xb8, 0x9d, 0xf9, 0x2, 0xfd, 0x20, 0x0, 0x8, - 0x50, 0xbf, 0x20, 0x0, 0x0, 0x0, 0xf, 0xa0, - 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0x0, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xd2, 0x0, 0x0, 0x85, 0x0, - 0x5f, 0xfb, 0x89, 0xdf, 0x80, 0x0, 0x29, 0xdf, - 0xeb, 0x40, - - /* U+0044 "D" */ - 0x5f, 0xff, 0xff, 0xea, 0x30, 0x0, 0x5f, 0x97, - 0x77, 0x9e, 0xf8, 0x0, 0x5f, 0x40, 0x0, 0x0, - 0xaf, 0x60, 0x5f, 0x40, 0x0, 0x0, 0xd, 0xe0, - 0x5f, 0x40, 0x0, 0x0, 0x6, 0xf4, 0x5f, 0x40, - 0x0, 0x0, 0x3, 0xf6, 0x5f, 0x40, 0x0, 0x0, - 0x3, 0xf6, 0x5f, 0x40, 0x0, 0x0, 0x6, 0xf4, - 0x5f, 0x40, 0x0, 0x0, 0xd, 0xe0, 0x5f, 0x40, - 0x0, 0x0, 0xaf, 0x60, 0x5f, 0x97, 0x77, 0x9e, - 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xea, 0x30, 0x0, - - /* U+0045 "E" */ - 0x5f, 0xff, 0xff, 0xff, 0x95, 0xf9, 0x77, 0x77, - 0x74, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, - 0x0, 0x0, 0x5f, 0x51, 0x11, 0x11, 0x5, 0xff, - 0xff, 0xff, 0xe0, 0x5f, 0x74, 0x44, 0x44, 0x5, - 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, - 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x97, 0x77, - 0x77, 0x65, 0xff, 0xff, 0xff, 0xfd, - - /* U+0046 "F" */ - 0x5f, 0xff, 0xff, 0xff, 0x95, 0xf9, 0x77, 0x77, - 0x74, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, - 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf5, - 0x22, 0x22, 0x10, 0x5f, 0xff, 0xff, 0xfe, 0x5, - 0xf8, 0x55, 0x55, 0x40, 0x5f, 0x40, 0x0, 0x0, - 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, - 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x4f, - 0xfb, 0x89, 0xdf, 0xb0, 0x2, 0xfd, 0x20, 0x0, - 0x6, 0x60, 0xb, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0x60, 0x0, 0x0, - 0x9, 0xf0, 0xf, 0xa0, 0x0, 0x0, 0x9, 0xf0, - 0xb, 0xf2, 0x0, 0x0, 0x9, 0xf0, 0x2, 0xfd, - 0x20, 0x0, 0xa, 0xf0, 0x0, 0x4f, 0xfb, 0x89, - 0xdf, 0xc0, 0x0, 0x2, 0x8d, 0xfe, 0xc6, 0x0, - - /* U+0048 "H" */ - 0x5f, 0x40, 0x0, 0x0, 0x4f, 0x55, 0xf4, 0x0, - 0x0, 0x4, 0xf5, 0x5f, 0x40, 0x0, 0x0, 0x4f, - 0x55, 0xf4, 0x0, 0x0, 0x4, 0xf5, 0x5f, 0x52, - 0x22, 0x22, 0x5f, 0x55, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x5f, 0x85, 0x55, 0x55, 0x8f, 0x55, 0xf4, - 0x0, 0x0, 0x4, 0xf5, 0x5f, 0x40, 0x0, 0x0, - 0x4f, 0x55, 0xf4, 0x0, 0x0, 0x4, 0xf5, 0x5f, - 0x40, 0x0, 0x0, 0x4f, 0x55, 0xf4, 0x0, 0x0, - 0x4, 0xf5, - - /* U+0049 "I" */ - 0x5f, 0x45, 0xf4, 0x5f, 0x45, 0xf4, 0x5f, 0x45, - 0xf4, 0x5f, 0x45, 0xf4, 0x5f, 0x45, 0xf4, 0x5f, - 0x45, 0xf4, - - /* U+004A "J" */ - 0x0, 0xff, 0xff, 0xfa, 0x0, 0x77, 0x77, 0xfa, - 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, - 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, - 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, - 0x0, 0x0, 0x0, 0xf9, 0x7, 0x20, 0x3, 0xf6, - 0xd, 0xe9, 0x8e, 0xf1, 0x1, 0xae, 0xfb, 0x30, - - /* U+004B "K" */ - 0x5f, 0x40, 0x0, 0x2, 0xeb, 0x5, 0xf4, 0x0, - 0x1, 0xec, 0x0, 0x5f, 0x40, 0x1, 0xde, 0x10, - 0x5, 0xf4, 0x0, 0xce, 0x20, 0x0, 0x5f, 0x40, - 0xbf, 0x30, 0x0, 0x5, 0xf4, 0x9f, 0x90, 0x0, - 0x0, 0x5f, 0xcf, 0xef, 0x40, 0x0, 0x5, 0xff, - 0x91, 0xee, 0x10, 0x0, 0x5f, 0xa0, 0x3, 0xfc, - 0x0, 0x5, 0xf4, 0x0, 0x6, 0xf8, 0x0, 0x5f, - 0x40, 0x0, 0x9, 0xf5, 0x5, 0xf4, 0x0, 0x0, - 0xc, 0xf2, - - /* U+004C "L" */ - 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, - 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, - 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, - 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, - 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, - 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x97, 0x77, - 0x77, 0x25, 0xff, 0xff, 0xff, 0xf5, - - /* U+004D "M" */ - 0x5f, 0x40, 0x0, 0x0, 0x0, 0x1e, 0x95, 0xfc, - 0x0, 0x0, 0x0, 0x8, 0xf9, 0x5f, 0xf5, 0x0, - 0x0, 0x2, 0xff, 0x95, 0xfd, 0xe0, 0x0, 0x0, - 0xae, 0xf9, 0x5f, 0x5f, 0x70, 0x0, 0x3f, 0x5f, - 0x95, 0xf3, 0x8f, 0x10, 0xb, 0xc0, 0xf9, 0x5f, - 0x31, 0xe9, 0x4, 0xf3, 0xf, 0x95, 0xf3, 0x7, - 0xf2, 0xdb, 0x0, 0xf9, 0x5f, 0x30, 0xd, 0xef, - 0x20, 0xf, 0x95, 0xf3, 0x0, 0x5f, 0x90, 0x0, - 0xf9, 0x5f, 0x30, 0x0, 0x71, 0x0, 0xf, 0x95, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0xf9, - - /* U+004E "N" */ - 0x5f, 0x50, 0x0, 0x0, 0x4f, 0x55, 0xff, 0x20, - 0x0, 0x4, 0xf5, 0x5f, 0xfd, 0x0, 0x0, 0x4f, - 0x55, 0xfa, 0xf9, 0x0, 0x4, 0xf5, 0x5f, 0x4a, - 0xf5, 0x0, 0x4f, 0x55, 0xf4, 0xd, 0xf2, 0x4, - 0xf5, 0x5f, 0x40, 0x2f, 0xd0, 0x4f, 0x55, 0xf4, - 0x0, 0x6f, 0x94, 0xf5, 0x5f, 0x40, 0x0, 0xaf, - 0xaf, 0x55, 0xf4, 0x0, 0x0, 0xdf, 0xf5, 0x5f, - 0x40, 0x0, 0x2, 0xff, 0x55, 0xf4, 0x0, 0x0, - 0x6, 0xf5, - - /* U+004F "O" */ - 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x4, - 0xff, 0xb8, 0x9e, 0xfa, 0x0, 0x2, 0xfd, 0x20, - 0x0, 0x8, 0xf9, 0x0, 0xbf, 0x20, 0x0, 0x0, - 0xa, 0xf2, 0xf, 0xa0, 0x0, 0x0, 0x0, 0x3f, - 0x72, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xf9, 0x2f, - 0x60, 0x0, 0x0, 0x0, 0xf, 0x90, 0xfa, 0x0, - 0x0, 0x0, 0x3, 0xf7, 0xb, 0xf2, 0x0, 0x0, - 0x0, 0xaf, 0x20, 0x2f, 0xd2, 0x0, 0x0, 0x8f, - 0x90, 0x0, 0x4f, 0xfb, 0x89, 0xef, 0xa0, 0x0, - 0x0, 0x28, 0xdf, 0xeb, 0x50, 0x0, - - /* U+0050 "P" */ - 0x5f, 0xff, 0xff, 0xd7, 0x0, 0x5f, 0x97, 0x78, - 0xbf, 0xc0, 0x5f, 0x40, 0x0, 0x7, 0xf6, 0x5f, - 0x40, 0x0, 0x0, 0xfa, 0x5f, 0x40, 0x0, 0x0, - 0xfa, 0x5f, 0x40, 0x0, 0x3, 0xf8, 0x5f, 0x62, - 0x23, 0x6e, 0xf1, 0x5f, 0xff, 0xff, 0xfd, 0x30, - 0x5f, 0x85, 0x54, 0x20, 0x0, 0x5f, 0x40, 0x0, - 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x0, 0x5f, - 0x40, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x0, - 0x4e, 0xfb, 0x89, 0xef, 0xa0, 0x0, 0x2, 0xfd, - 0x20, 0x0, 0x8, 0xf9, 0x0, 0xa, 0xf2, 0x0, - 0x0, 0x0, 0xaf, 0x20, 0xf, 0xa0, 0x0, 0x0, - 0x0, 0x3f, 0x70, 0x2f, 0x60, 0x0, 0x0, 0x0, - 0xf, 0x90, 0x2f, 0x60, 0x0, 0x0, 0x0, 0xf, - 0x90, 0x1f, 0x90, 0x0, 0x0, 0x0, 0x2f, 0x70, - 0xb, 0xf1, 0x0, 0x0, 0x0, 0xaf, 0x20, 0x3, - 0xfc, 0x10, 0x0, 0x7, 0xf9, 0x0, 0x0, 0x6f, - 0xfa, 0x78, 0xdf, 0xb0, 0x0, 0x0, 0x3, 0xae, - 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xd4, 0x15, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xbf, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0x31, - 0x0, - - /* U+0052 "R" */ - 0x5f, 0xff, 0xff, 0xd7, 0x0, 0x5f, 0x97, 0x78, - 0xbf, 0xc0, 0x5f, 0x40, 0x0, 0x7, 0xf6, 0x5f, - 0x40, 0x0, 0x0, 0xfa, 0x5f, 0x40, 0x0, 0x0, - 0xfa, 0x5f, 0x40, 0x0, 0x3, 0xf8, 0x5f, 0x52, - 0x23, 0x6e, 0xe1, 0x5f, 0xff, 0xff, 0xfc, 0x30, - 0x5f, 0x85, 0x55, 0xf9, 0x0, 0x5f, 0x40, 0x0, - 0x7f, 0x40, 0x5f, 0x40, 0x0, 0xc, 0xe0, 0x5f, - 0x40, 0x0, 0x2, 0xf9, - - /* U+0053 "S" */ - 0x0, 0x5c, 0xef, 0xd9, 0x20, 0x7, 0xfc, 0x87, - 0xaf, 0x90, 0xe, 0xc0, 0x0, 0x1, 0x10, 0xf, - 0x80, 0x0, 0x0, 0x0, 0xd, 0xf5, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xea, 0x50, 0x0, 0x0, 0x5, - 0xae, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x4e, 0xf1, - 0x0, 0x0, 0x0, 0x5, 0xf3, 0x8, 0x0, 0x0, - 0x8, 0xf2, 0x2f, 0xfa, 0x77, 0xbf, 0xa0, 0x2, - 0x9d, 0xff, 0xc7, 0x0, - - /* U+0054 "T" */ - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x67, 0x78, 0xfb, - 0x77, 0x72, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, - 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, - 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, - 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, - 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, - 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, - 0x1, 0xf7, 0x0, 0x0, - - /* U+0055 "U" */ - 0x6f, 0x30, 0x0, 0x0, 0x8f, 0x16, 0xf3, 0x0, - 0x0, 0x8, 0xf1, 0x6f, 0x30, 0x0, 0x0, 0x8f, - 0x16, 0xf3, 0x0, 0x0, 0x8, 0xf1, 0x6f, 0x30, - 0x0, 0x0, 0x8f, 0x16, 0xf3, 0x0, 0x0, 0x8, - 0xf1, 0x6f, 0x30, 0x0, 0x0, 0x8f, 0x5, 0xf4, - 0x0, 0x0, 0x9, 0xf0, 0x3f, 0x70, 0x0, 0x0, - 0xcd, 0x0, 0xde, 0x20, 0x0, 0x5f, 0x80, 0x4, - 0xff, 0xa8, 0xbf, 0xd0, 0x0, 0x3, 0xbe, 0xfd, - 0x81, 0x0, - - /* U+0056 "V" */ - 0xc, 0xe0, 0x0, 0x0, 0x0, 0x6f, 0x30, 0x6f, - 0x50, 0x0, 0x0, 0xc, 0xc0, 0x0, 0xfb, 0x0, - 0x0, 0x3, 0xf6, 0x0, 0x9, 0xf2, 0x0, 0x0, - 0xae, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x1f, 0x90, - 0x0, 0x0, 0xce, 0x0, 0x7, 0xf2, 0x0, 0x0, - 0x5, 0xf6, 0x0, 0xdb, 0x0, 0x0, 0x0, 0xe, - 0xc0, 0x4f, 0x50, 0x0, 0x0, 0x0, 0x8f, 0x3b, - 0xe0, 0x0, 0x0, 0x0, 0x2, 0xfb, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x0, - - /* U+0057 "W" */ - 0x5f, 0x40, 0x0, 0x0, 0xdf, 0x0, 0x0, 0x2, - 0xf5, 0xf, 0x90, 0x0, 0x2, 0xff, 0x40, 0x0, - 0x7, 0xf0, 0xb, 0xe0, 0x0, 0x7, 0xfe, 0x90, - 0x0, 0xc, 0xb0, 0x6, 0xf3, 0x0, 0xc, 0xaa, - 0xe0, 0x0, 0x1f, 0x60, 0x1, 0xf8, 0x0, 0x1f, - 0x54, 0xf3, 0x0, 0x6f, 0x10, 0x0, 0xcd, 0x0, - 0x7f, 0x10, 0xf8, 0x0, 0xcc, 0x0, 0x0, 0x7f, - 0x20, 0xcb, 0x0, 0xad, 0x1, 0xf7, 0x0, 0x0, - 0x2f, 0x71, 0xf6, 0x0, 0x5f, 0x26, 0xf2, 0x0, - 0x0, 0xd, 0xc6, 0xf1, 0x0, 0xf, 0x7b, 0xd0, - 0x0, 0x0, 0x8, 0xfd, 0xc0, 0x0, 0xb, 0xdf, - 0x80, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, 0x6, - 0xff, 0x30, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, - 0x1, 0xfe, 0x0, 0x0, - - /* U+0058 "X" */ - 0x3f, 0x90, 0x0, 0x0, 0xcd, 0x0, 0x8f, 0x40, - 0x0, 0x7f, 0x30, 0x0, 0xde, 0x10, 0x2f, 0x80, - 0x0, 0x3, 0xfa, 0xc, 0xd0, 0x0, 0x0, 0x7, - 0xfb, 0xf3, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xc0, 0x0, 0x0, 0x0, - 0xbf, 0x7f, 0x70, 0x0, 0x0, 0x6f, 0x60, 0xaf, - 0x20, 0x0, 0x2f, 0xb0, 0x1, 0xed, 0x0, 0xc, - 0xf1, 0x0, 0x4, 0xf8, 0x7, 0xf6, 0x0, 0x0, - 0x9, 0xf3, - - /* U+0059 "Y" */ - 0xc, 0xe0, 0x0, 0x0, 0x7, 0xf2, 0x3, 0xf7, - 0x0, 0x0, 0x1f, 0x90, 0x0, 0xaf, 0x10, 0x0, - 0x9e, 0x10, 0x0, 0x1f, 0xa0, 0x2, 0xf6, 0x0, - 0x0, 0x8, 0xf3, 0xb, 0xd0, 0x0, 0x0, 0x0, - 0xec, 0x4f, 0x40, 0x0, 0x0, 0x0, 0x5f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, - - /* U+005A "Z" */ - 0x3f, 0xff, 0xff, 0xff, 0xfd, 0x1, 0x77, 0x77, - 0x77, 0xbf, 0x90, 0x0, 0x0, 0x0, 0x1e, 0xc0, - 0x0, 0x0, 0x0, 0xc, 0xf2, 0x0, 0x0, 0x0, - 0x8, 0xf5, 0x0, 0x0, 0x0, 0x4, 0xf9, 0x0, - 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0x20, 0x0, 0x0, 0x0, 0x8f, 0x50, 0x0, - 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x1e, - 0xf8, 0x77, 0x77, 0x77, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xf0, - - /* U+005B "[" */ - 0x5f, 0xff, 0x5, 0xf7, 0x50, 0x5f, 0x30, 0x5, - 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, - 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, - 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, - 0x5, 0xf7, 0x50, 0x5f, 0xff, 0x0, - - /* U+005C "\\" */ - 0x7e, 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, - 0xc, 0x90, 0x0, 0x0, 0x7, 0xe0, 0x0, 0x0, - 0x2, 0xf4, 0x0, 0x0, 0x0, 0xc9, 0x0, 0x0, - 0x0, 0x7e, 0x0, 0x0, 0x0, 0x2f, 0x40, 0x0, - 0x0, 0xc, 0x90, 0x0, 0x0, 0x7, 0xe0, 0x0, - 0x0, 0x2, 0xf3, 0x0, 0x0, 0x0, 0xd9, 0x0, - 0x0, 0x0, 0x7e, 0x0, 0x0, 0x0, 0x2f, 0x30, - 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x7, 0xe0, - - /* U+005D "]" */ - 0xbf, 0xfa, 0x35, 0xea, 0x0, 0xea, 0x0, 0xea, - 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, - 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, - 0x0, 0xea, 0x35, 0xea, 0xbf, 0xfa, - - /* U+005E "^" */ - 0x0, 0x2f, 0x80, 0x0, 0x0, 0x9d, 0xe0, 0x0, - 0x0, 0xf3, 0xd5, 0x0, 0x6, 0xd0, 0x7b, 0x0, - 0xc, 0x60, 0x1f, 0x20, 0x3f, 0x10, 0xb, 0x80, - 0x9a, 0x0, 0x4, 0xe0, - - /* U+005F "_" */ - 0xff, 0xff, 0xff, 0xff, 0x11, 0x11, 0x11, 0x11, - - /* U+0060 "`" */ - 0x7, 0xf6, 0x0, 0x3, 0xe7, - - /* U+0061 "a" */ - 0x1, 0x9e, 0xfd, 0x80, 0x0, 0xce, 0x87, 0xaf, - 0x90, 0x2, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x0, - 0x6, 0xf2, 0x2, 0xbe, 0xff, 0xff, 0x20, 0xec, - 0x42, 0x27, 0xf2, 0x2f, 0x50, 0x0, 0x7f, 0x20, - 0xec, 0x42, 0x7f, 0xf2, 0x2, 0xbf, 0xfb, 0x6f, - 0x20, - - /* U+0062 "b" */ - 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0x2b, 0xfe, 0xb3, 0x0, 0x8f, 0xec, 0x78, 0xef, - 0x30, 0x8f, 0xa0, 0x0, 0x1e, 0xc0, 0x8f, 0x20, - 0x0, 0x7, 0xf1, 0x8f, 0x0, 0x0, 0x5, 0xf3, - 0x8f, 0x20, 0x0, 0x7, 0xf1, 0x8f, 0xa0, 0x0, - 0x1e, 0xd0, 0x8f, 0xec, 0x78, 0xef, 0x30, 0x8e, - 0x2b, 0xfe, 0xb3, 0x0, - - /* U+0063 "c" */ - 0x0, 0x3a, 0xef, 0xc4, 0x0, 0x4f, 0xd8, 0x7c, - 0xf4, 0xd, 0xd0, 0x0, 0x7, 0x13, 0xf6, 0x0, - 0x0, 0x0, 0x4f, 0x30, 0x0, 0x0, 0x3, 0xf6, - 0x0, 0x0, 0x0, 0xd, 0xd0, 0x0, 0x6, 0x10, - 0x4f, 0xd7, 0x7c, 0xf4, 0x0, 0x3a, 0xef, 0xc4, - 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, - 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, - 0x3b, 0xff, 0xa3, 0xf7, 0x4, 0xfd, 0x87, 0xce, - 0xf7, 0xe, 0xd0, 0x0, 0xb, 0xf7, 0x3f, 0x60, - 0x0, 0x3, 0xf7, 0x4f, 0x30, 0x0, 0x1, 0xf7, - 0x3f, 0x50, 0x0, 0x3, 0xf7, 0xe, 0xc0, 0x0, - 0xa, 0xf7, 0x4, 0xfc, 0x65, 0xbe, 0xf7, 0x0, - 0x3b, 0xff, 0xb2, 0xf7, - - /* U+0065 "e" */ - 0x0, 0x3b, 0xfe, 0xa2, 0x0, 0x4, 0xfc, 0x67, - 0xee, 0x20, 0xe, 0xc0, 0x0, 0x1e, 0xa0, 0x3f, - 0x50, 0x0, 0x7, 0xf0, 0x4f, 0xff, 0xff, 0xff, - 0xf1, 0x3f, 0x72, 0x22, 0x22, 0x20, 0xe, 0xc0, - 0x0, 0x2, 0x0, 0x4, 0xfd, 0x87, 0xaf, 0x50, - 0x0, 0x3a, 0xef, 0xd6, 0x0, - - /* U+0066 "f" */ - 0x0, 0x5d, 0xfc, 0x0, 0x2f, 0xb5, 0x70, 0x4, - 0xf3, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x48, 0xf7, - 0x53, 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, - 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, 0x0, - 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, 0x0, 0x5f, - 0x30, 0x0, - - /* U+0067 "g" */ - 0x0, 0x3b, 0xff, 0xb2, 0xe9, 0x4, 0xfe, 0x87, - 0xcf, 0xf9, 0xe, 0xd1, 0x0, 0xa, 0xf9, 0x3f, - 0x60, 0x0, 0x1, 0xf9, 0x4f, 0x40, 0x0, 0x0, - 0xf9, 0x3f, 0x60, 0x0, 0x1, 0xf9, 0xe, 0xd0, - 0x0, 0x9, 0xf9, 0x4, 0xfd, 0x87, 0xcf, 0xf8, - 0x0, 0x3b, 0xff, 0xb3, 0xf7, 0x0, 0x0, 0x0, - 0x5, 0xf4, 0x9, 0xe9, 0x77, 0xaf, 0xb0, 0x1, - 0x7c, 0xff, 0xd8, 0x0, - - /* U+0068 "h" */ - 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, - 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf2, 0xbf, - 0xea, 0x10, 0x8f, 0xfb, 0x89, 0xfd, 0x8, 0xf8, - 0x0, 0x6, 0xf4, 0x8f, 0x10, 0x0, 0x1f, 0x78, - 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, - 0x88, 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, - 0xf, 0x88, 0xf0, 0x0, 0x0, 0xf8, - - /* U+0069 "i" */ - 0x9e, 0x1a, 0xf2, 0x0, 0x8, 0xf0, 0x8f, 0x8, - 0xf0, 0x8f, 0x8, 0xf0, 0x8f, 0x8, 0xf0, 0x8f, - 0x8, 0xf0, - - /* U+006A "j" */ - 0x0, 0x7, 0xe2, 0x0, 0x9, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, - 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, - 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x7, - 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x8, 0xf0, 0x18, - 0x6e, 0xc0, 0x3e, 0xfc, 0x20, - - /* U+006B "k" */ - 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, - 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, - 0x1d, 0xd1, 0x8f, 0x0, 0x1d, 0xe2, 0x8, 0xf0, - 0x1d, 0xe2, 0x0, 0x8f, 0x2d, 0xf3, 0x0, 0x8, - 0xfe, 0xff, 0x70, 0x0, 0x8f, 0xe2, 0xbf, 0x30, - 0x8, 0xf2, 0x1, 0xee, 0x10, 0x8f, 0x0, 0x3, - 0xfb, 0x8, 0xf0, 0x0, 0x7, 0xf7, - - /* U+006C "l" */ - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, - - /* U+006D "m" */ - 0x8e, 0x3c, 0xfe, 0x91, 0x3b, 0xfe, 0xa2, 0x8, - 0xff, 0x96, 0x9f, 0xcf, 0xc6, 0x8f, 0xd0, 0x8f, - 0x70, 0x0, 0x9f, 0xc0, 0x0, 0x5f, 0x58, 0xf1, - 0x0, 0x5, 0xf6, 0x0, 0x1, 0xf7, 0x8f, 0x0, - 0x0, 0x4f, 0x40, 0x0, 0xf, 0x88, 0xf0, 0x0, - 0x4, 0xf4, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, - 0x4f, 0x40, 0x0, 0xf, 0x88, 0xf0, 0x0, 0x4, - 0xf4, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0x4f, - 0x40, 0x0, 0xf, 0x80, - - /* U+006E "n" */ - 0x8e, 0x3b, 0xfe, 0xa1, 0x8, 0xff, 0xa6, 0x8f, - 0xd0, 0x8f, 0x80, 0x0, 0x6f, 0x48, 0xf1, 0x0, - 0x1, 0xf7, 0x8f, 0x0, 0x0, 0xf, 0x88, 0xf0, - 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, 0x88, - 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, - 0x80, - - /* U+006F "o" */ - 0x0, 0x3b, 0xef, 0xc4, 0x0, 0x4, 0xfd, 0x87, - 0xcf, 0x60, 0xe, 0xd0, 0x0, 0xb, 0xf1, 0x3f, - 0x60, 0x0, 0x3, 0xf5, 0x4f, 0x30, 0x0, 0x1, - 0xf7, 0x3f, 0x60, 0x0, 0x3, 0xf5, 0xe, 0xd0, - 0x0, 0xb, 0xf1, 0x4, 0xfd, 0x77, 0xcf, 0x60, - 0x0, 0x3b, 0xef, 0xc4, 0x0, - - /* U+0070 "p" */ - 0x8e, 0x3b, 0xfe, 0xb3, 0x0, 0x8f, 0xfb, 0x57, - 0xdf, 0x30, 0x8f, 0x90, 0x0, 0xd, 0xc0, 0x8f, - 0x10, 0x0, 0x7, 0xf1, 0x8f, 0x0, 0x0, 0x5, - 0xf3, 0x8f, 0x20, 0x0, 0x7, 0xf1, 0x8f, 0xa0, - 0x0, 0x1e, 0xd0, 0x8f, 0xec, 0x78, 0xef, 0x30, - 0x8f, 0x2b, 0xfe, 0xb3, 0x0, 0x8f, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0x0, 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x3b, 0xff, 0xa2, 0xf7, 0x4, 0xfd, 0x87, - 0xde, 0xf7, 0xe, 0xd0, 0x0, 0xb, 0xf7, 0x3f, - 0x60, 0x0, 0x3, 0xf7, 0x4f, 0x30, 0x0, 0x1, - 0xf7, 0x3f, 0x60, 0x0, 0x3, 0xf7, 0xe, 0xd0, - 0x0, 0xb, 0xf7, 0x4, 0xfd, 0x77, 0xce, 0xf7, - 0x0, 0x3b, 0xff, 0xa3, 0xf7, 0x0, 0x0, 0x0, - 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, - 0x0, 0x0, 0x1, 0xf7, - - /* U+0072 "r" */ - 0x8e, 0x2b, 0xf0, 0x8f, 0xed, 0x90, 0x8f, 0xa0, - 0x0, 0x8f, 0x20, 0x0, 0x8f, 0x0, 0x0, 0x8f, - 0x0, 0x0, 0x8f, 0x0, 0x0, 0x8f, 0x0, 0x0, - 0x8f, 0x0, 0x0, - - /* U+0073 "s" */ - 0x2, 0xae, 0xfd, 0x91, 0x1e, 0xd7, 0x69, 0xd0, - 0x4f, 0x30, 0x0, 0x0, 0x2f, 0xb4, 0x10, 0x0, - 0x6, 0xef, 0xfd, 0x60, 0x0, 0x1, 0x5b, 0xf5, - 0x1, 0x0, 0x0, 0xf7, 0x5f, 0xa7, 0x6b, 0xf3, - 0x19, 0xdf, 0xec, 0x40, - - /* U+0074 "t" */ - 0x5, 0xf3, 0x0, 0x0, 0x5f, 0x30, 0x0, 0xcf, - 0xff, 0xfa, 0x4, 0x8f, 0x75, 0x30, 0x5, 0xf3, - 0x0, 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, - 0x0, 0x5f, 0x30, 0x0, 0x4, 0xf4, 0x0, 0x0, - 0x1f, 0xc6, 0x80, 0x0, 0x5d, 0xfc, 0x10, - - /* U+0075 "u" */ - 0xae, 0x0, 0x0, 0x2f, 0x5a, 0xe0, 0x0, 0x2, - 0xf5, 0xae, 0x0, 0x0, 0x2f, 0x5a, 0xe0, 0x0, - 0x2, 0xf5, 0xae, 0x0, 0x0, 0x2f, 0x59, 0xf0, - 0x0, 0x4, 0xf5, 0x6f, 0x30, 0x0, 0xaf, 0x51, - 0xee, 0x76, 0xbf, 0xf5, 0x2, 0xbe, 0xfb, 0x3f, - 0x50, - - /* U+0076 "v" */ - 0xd, 0xc0, 0x0, 0x0, 0xcb, 0x6, 0xf2, 0x0, - 0x2, 0xf5, 0x0, 0xf9, 0x0, 0x9, 0xe0, 0x0, - 0x9e, 0x0, 0xf, 0x80, 0x0, 0x2f, 0x60, 0x6f, - 0x10, 0x0, 0xc, 0xc0, 0xcb, 0x0, 0x0, 0x5, - 0xf6, 0xf4, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, - 0x0, 0x0, 0x8f, 0x70, 0x0, - - /* U+0077 "w" */ - 0xbb, 0x0, 0x0, 0x9f, 0x10, 0x0, 0x4f, 0x16, - 0xf1, 0x0, 0xe, 0xf6, 0x0, 0x9, 0xc0, 0xf, - 0x60, 0x5, 0xfc, 0xb0, 0x0, 0xf6, 0x0, 0xac, - 0x0, 0xab, 0x5f, 0x10, 0x5f, 0x10, 0x5, 0xf1, - 0xf, 0x50, 0xf7, 0xa, 0xb0, 0x0, 0xf, 0x76, - 0xf0, 0x9, 0xc0, 0xf5, 0x0, 0x0, 0xac, 0xba, - 0x0, 0x4f, 0x8f, 0x0, 0x0, 0x4, 0xff, 0x40, - 0x0, 0xef, 0xa0, 0x0, 0x0, 0xe, 0xe0, 0x0, - 0x8, 0xf4, 0x0, 0x0, - - /* U+0078 "x" */ - 0x4f, 0x70, 0x0, 0x9f, 0x20, 0x8f, 0x30, 0x5f, - 0x50, 0x0, 0xcd, 0x2e, 0x90, 0x0, 0x2, 0xff, - 0xd0, 0x0, 0x0, 0xa, 0xf6, 0x0, 0x0, 0x4, - 0xfd, 0xe1, 0x0, 0x1, 0xeb, 0xd, 0xc0, 0x0, - 0xbe, 0x10, 0x3f, 0x80, 0x6f, 0x40, 0x0, 0x7f, - 0x40, - - /* U+0079 "y" */ - 0xd, 0xc0, 0x0, 0x0, 0xcb, 0x6, 0xf3, 0x0, - 0x2, 0xf4, 0x0, 0xea, 0x0, 0x9, 0xd0, 0x0, - 0x8f, 0x10, 0x1f, 0x70, 0x0, 0x1f, 0x70, 0x7f, - 0x10, 0x0, 0xa, 0xe0, 0xd9, 0x0, 0x0, 0x3, - 0xf9, 0xf2, 0x0, 0x0, 0x0, 0xcf, 0xb0, 0x0, - 0x0, 0x0, 0x6f, 0x40, 0x0, 0x0, 0x0, 0xad, - 0x0, 0x0, 0x1c, 0x79, 0xf5, 0x0, 0x0, 0x1a, - 0xee, 0x70, 0x0, 0x0, - - /* U+007A "z" */ - 0x4f, 0xff, 0xff, 0xf9, 0x15, 0x55, 0x5b, 0xf4, - 0x0, 0x0, 0x4f, 0x80, 0x0, 0x1, 0xec, 0x0, - 0x0, 0xb, 0xe1, 0x0, 0x0, 0x8f, 0x40, 0x0, - 0x4, 0xf7, 0x0, 0x0, 0x1e, 0xe5, 0x55, 0x53, - 0x5f, 0xff, 0xff, 0xfc, - - /* U+007B "{" */ - 0x0, 0x2c, 0xf5, 0x0, 0xaf, 0x61, 0x0, 0xcc, - 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, 0x0, 0x0, - 0xdb, 0x0, 0x2, 0xea, 0x0, 0x1f, 0xf4, 0x0, - 0x5, 0xfa, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, - 0x0, 0x0, 0xdb, 0x0, 0x0, 0xcc, 0x0, 0x0, - 0xaf, 0x61, 0x0, 0x2c, 0xf5, - - /* U+007C "|" */ - 0x5f, 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x15, - 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, - 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x10, - - /* U+007D "}" */ - 0xbe, 0x80, 0x3, 0xaf, 0x40, 0x1, 0xf6, 0x0, - 0x1f, 0x70, 0x1, 0xf7, 0x0, 0x1f, 0x70, 0x0, - 0xf9, 0x0, 0xa, 0xfb, 0x0, 0xfb, 0x20, 0x1f, - 0x70, 0x1, 0xf7, 0x0, 0x1f, 0x70, 0x1, 0xf6, - 0x3, 0xaf, 0x40, 0xbe, 0x90, 0x0, - - /* U+007E "~" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xe4, 0x0, - 0xb5, 0xc, 0x86, 0xf5, 0x1e, 0x20, 0xf0, 0x3, - 0xef, 0x90, 0x2, 0x0, 0x0, 0x10, 0x0, - - /* U+00B0 "°" */ - 0x2, 0xce, 0x90, 0xd, 0x40, 0x89, 0x3b, 0x0, - 0xe, 0x3b, 0x0, 0xe, 0xd, 0x40, 0x89, 0x2, - 0xce, 0x90, - - /* U+2022 "•" */ - 0x0, 0x8, 0xf8, 0xef, 0xe7, 0xf7, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, - 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, - 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, - 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, - 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F008 "" */ - 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, - 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, - 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, - 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, - 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, - 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, - 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, - 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, - - /* U+F00B "" */ - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, - 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, - 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, - 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, - 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, - 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, - 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, - 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, - 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, - 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, - 0x4, 0xa1, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, - 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, - 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, - 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, - 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, - 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, - 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, - 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, - 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, - 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, - 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, - 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, - 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, - 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, - 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, - 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, - 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, - 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, - 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, - 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, - 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, - 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, - 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, - 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, - 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, - 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, - 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, - 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, - 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F01C "" */ - 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, - 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, - - /* U+F021 "" */ - 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, - 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, - 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, - 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, - 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, - 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, - 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, - 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, - 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, - 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, - 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, - 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, - 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, - 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, - 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, - 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, - 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, - 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, - 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, - 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, - 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, - 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, - 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, - 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, - 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, - - /* U+F03E "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, - 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, - 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, - 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F043 "" */ - 0x0, 0x0, 0x4e, 0x40, 0x0, 0x0, 0x0, 0xb, - 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0x30, 0x0, 0xc, 0xff, 0xff, 0xfc, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xf2, 0xbf, 0xff, - 0xff, 0xfe, 0x9f, 0xa1, 0xbf, 0xff, 0xff, 0x92, - 0xff, 0xa2, 0x2f, 0xff, 0xf2, 0x4, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x2, 0x9e, 0xfe, 0x92, 0x0, - - /* U+F048 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, - 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, - 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, - 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, - 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, - 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, - 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, - 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, - 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, - 0xf7, - - /* U+F04D "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, - - /* U+F051 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, - 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, - 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, - 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, - 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, - 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, - 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, - 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, - 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, - 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, - 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, - 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, - 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, - - /* U+F054 "" */ - 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, - 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, - 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, - 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, - 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, - 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, - 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, - 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, - 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, - 0x0, 0x0, - - /* U+F068 "" */ - 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xb7, - - /* U+F06E "" */ - 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, - 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, - 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, - 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, - 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, - 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, - 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, - 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, - 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, - 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, - 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, - 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, - 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, - 0xda, 0x50, 0x0, 0x0, - - /* U+F070 "" */ - 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, - 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, - 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, - 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, - 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, - 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, - 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, - 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, - 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, - 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, - 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, - 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, - 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, - 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, - 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, - 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, - 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, - 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, - 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, - 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, - 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, - 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, - 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, - 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, - 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, - 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F078 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, - 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, - 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, - 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, - 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, - 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, - 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, - 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, - 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, - 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, - 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, - 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, - 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, - 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, - 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, - 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, - 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, - 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, - 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, - 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, - 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, - 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, - 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, - 0x10, - - /* U+F0C5 "" */ - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, - 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, - 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, - - /* U+F0C9 "" */ - 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x21, - - /* U+F0E0 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xd2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2d, - 0xff, 0x62, 0xcf, 0xff, 0xff, 0xfc, 0x26, 0xff, - 0xff, 0xfa, 0x18, 0xff, 0xff, 0x81, 0xaf, 0xff, - 0xff, 0xff, 0xe3, 0x4d, 0xd4, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x81, 0x18, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F0E7 "" */ - 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, - 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, - 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, - 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, - 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, - 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, - 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, - - /* U+F11C "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, - 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, - 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, - 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, - 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, - 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, - 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F15B "" */ - 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, - 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, - 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, - 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, - 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, - 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, - 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, - 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, - 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, - 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, - 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, - 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F241 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F242 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F243 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F244 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, - 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, - 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, - 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, - 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, - 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, - 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, - 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, - 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, - 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, - 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, - 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, - 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, - 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, - 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, - 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, - 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, - 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, - 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, - 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, - 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, - 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, - 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, - 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, - 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, - 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, - 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, - 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, - 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, - 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, - 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, - 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, - 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, - - /* U+F7C2 "" */ - 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, - 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, - 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, - 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, - 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 69, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 69, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 18, .adv_w = 100, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 31, .adv_w = 180, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 97, .adv_w = 159, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 177, .adv_w = 216, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 255, .adv_w = 176, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 327, .adv_w = 54, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 332, .adv_w = 86, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 362, .adv_w = 87, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 392, .adv_w = 102, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 417, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 449, .adv_w = 58, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 457, .adv_w = 98, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 466, .adv_w = 58, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 471, .adv_w = 90, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 535, .adv_w = 171, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 595, .adv_w = 95, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 625, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 679, .adv_w = 146, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 733, .adv_w = 171, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 799, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 853, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 913, .adv_w = 153, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 967, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1027, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1087, .adv_w = 58, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1101, .adv_w = 58, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1119, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 1151, .adv_w = 149, .box_w = 8, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 1175, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 1207, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1261, .adv_w = 265, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1381, .adv_w = 187, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1459, .adv_w = 194, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1525, .adv_w = 185, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1591, .adv_w = 211, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1663, .adv_w = 172, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1717, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1771, .adv_w = 198, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1843, .adv_w = 208, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1909, .adv_w = 79, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1927, .adv_w = 131, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1975, .adv_w = 184, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2041, .adv_w = 152, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2095, .adv_w = 244, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2173, .adv_w = 208, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2239, .adv_w = 215, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2317, .adv_w = 185, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2377, .adv_w = 215, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2482, .adv_w = 186, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2542, .adv_w = 159, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2602, .adv_w = 150, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2662, .adv_w = 202, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2728, .adv_w = 182, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2806, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2914, .adv_w = 172, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2980, .adv_w = 166, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3052, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3118, .adv_w = 85, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 3156, .adv_w = 90, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 3220, .adv_w = 85, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3250, .adv_w = 149, .box_w = 8, .box_h = 7, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 3278, .adv_w = 128, .box_w = 8, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3286, .adv_w = 154, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 3291, .adv_w = 153, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3332, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3392, .adv_w = 146, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3433, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3493, .adv_w = 157, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3538, .adv_w = 90, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3580, .adv_w = 177, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3640, .adv_w = 174, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3694, .adv_w = 71, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3712, .adv_w = 73, .box_w = 6, .box_h = 15, .ofs_x = -2, .ofs_y = -3}, - {.bitmap_index = 3757, .adv_w = 158, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3811, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3823, .adv_w = 271, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3891, .adv_w = 174, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3932, .adv_w = 163, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3977, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 4037, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 4097, .adv_w = 105, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4124, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4160, .adv_w = 106, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4199, .adv_w = 173, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4240, .adv_w = 143, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 4285, .adv_w = 230, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4353, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4394, .adv_w = 143, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 4454, .adv_w = 133, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4490, .adv_w = 90, .box_w = 6, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 4535, .adv_w = 77, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 4558, .adv_w = 90, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 4596, .adv_w = 149, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 4619, .adv_w = 107, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 4637, .adv_w = 80, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 4643, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4779, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4875, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4987, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5083, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5149, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5277, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5405, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5531, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5659, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5767, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5895, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5951, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6035, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6179, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6275, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6363, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 6443, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 6569, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6674, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6772, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 6852, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 6964, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7034, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7104, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7202, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 7230, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7338, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7498, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 7658, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7786, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 7856, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 7926, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8066, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8162, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8290, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 8435, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8540, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8652, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8750, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8848, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8944, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 9040, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9152, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9264, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9372, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 9534, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9630, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 9780, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 9880, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 9980, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 10080, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 10180, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 10280, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10427, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 10523, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10635, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 10780, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10900, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10996, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 3, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 12, 0, 7, -6, 0, 0, - 0, 0, -14, -15, 2, 12, 6, 4, - -10, 2, 13, 1, 11, 3, 8, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 15, 2, -2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 0, -8, 0, 0, 0, 0, - 0, -5, 4, 5, 0, 0, -3, 0, - -2, 3, 0, -3, 0, -3, -1, -5, - 0, 0, 0, 0, -3, 0, 0, -3, - -4, 0, 0, -3, 0, -5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - -3, 0, -4, 0, -7, 0, -31, 0, - 0, -5, 0, 5, 8, 0, 0, -5, - 3, 3, 8, 5, -4, 5, 0, 0, - -15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -7, -3, -13, 0, -10, - -2, 0, 0, 0, 0, 1, 10, 0, - -8, -2, -1, 1, 0, -4, 0, 0, - -2, -19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -20, -2, 10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 8, - 0, 3, 0, 0, -5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 10, 2, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, - 5, 3, 8, -3, 0, 0, 5, -3, - -8, -35, 2, 7, 5, 1, -3, 0, - 9, 0, 8, 0, 8, 0, -24, 0, - -3, 8, 0, 8, -3, 5, 3, 0, - 0, 1, -3, 0, 0, -4, 20, 0, - 20, 0, 8, 0, 11, 3, 4, 8, - 0, 0, 0, -9, 0, 0, 0, 0, - 1, -2, 0, 2, -5, -3, -5, 2, - 0, -3, 0, 0, 0, -10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, -14, 0, -16, 0, 0, 0, - 0, -2, 0, 25, -3, -3, 3, 3, - -2, 0, -3, 3, 0, 0, -14, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -25, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -16, 0, 15, 0, 0, -9, 0, - 8, 0, -17, -25, -17, -5, 8, 0, - 0, -17, 0, 3, -6, 0, -4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 8, -31, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 12, 0, 2, 0, 0, 0, - 0, 0, 2, 2, -3, -5, 0, -1, - -1, -3, 0, 0, -2, 0, 0, 0, - -5, 0, -2, 0, -6, -5, 0, -6, - -8, -8, -5, 0, -5, 0, -5, 0, - 0, 0, 0, -2, 0, 0, 3, 0, - 2, -3, 0, 1, 0, 0, 0, 3, - -2, 0, 0, 0, -2, 3, 3, -1, - 0, 0, 0, -5, 0, -1, 0, 0, - 0, 0, 0, 1, 0, 3, -2, 0, - -3, 0, -4, 0, 0, -2, 0, 8, - 0, 0, -3, 0, 0, 0, 0, 0, - -1, 1, -2, -2, 0, 0, -3, 0, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, -1, 0, -3, -3, 0, - 0, 0, 0, 0, 1, 0, 0, -2, - 0, -3, -3, -3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -2, 0, 0, - 0, 0, -2, -3, 0, -4, 0, -8, - -2, -8, 5, 0, 0, -5, 3, 5, - 7, 0, -6, -1, -3, 0, -1, -12, - 3, -2, 2, -14, 3, 0, 0, 1, - -13, 0, -14, -2, -22, -2, 0, -13, - 0, 5, 7, 0, 3, 0, 0, 0, - 0, 1, 0, -5, -3, 0, -8, 0, - 0, 0, -3, 0, 0, 0, -3, 0, - 0, 0, 0, 0, -1, -1, 0, -1, - -3, 0, 0, 0, 0, 0, 0, 0, - -3, -3, 0, -2, -3, -2, 0, 0, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, -2, 0, -3, - 0, -2, 0, -5, 3, 0, 0, -3, - 1, 3, 3, 0, 0, 0, 0, 0, - 0, -2, 0, 0, 0, 0, 0, 2, - 0, 0, -3, 0, -3, -2, -3, 0, - 0, 0, 0, 0, 0, 0, 2, 0, - -2, 0, 0, 0, 0, -3, -4, 0, - -5, 0, 8, -2, 1, -8, 0, 0, - 7, -13, -13, -11, -5, 3, 0, -2, - -17, -5, 0, -5, 0, -5, 4, -5, - -16, 0, -7, 0, 0, 1, -1, 2, - -2, 0, 3, 0, -8, -10, 0, -13, - -6, -5, -6, -8, -3, -7, -1, -5, - -7, 2, 0, 1, 0, -3, 0, 0, - 0, 2, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - 0, -1, 0, -1, -3, 0, -4, -6, - -6, -1, 0, -8, 0, 0, 0, 0, - 0, 0, -2, 0, 0, 0, 0, 1, - -2, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, 0, 0, - -5, 0, 0, 0, 0, -13, -8, 0, - 0, 0, -4, -13, 0, 0, -3, 3, - 0, -7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, 0, -5, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, -5, 0, - 0, 0, 0, 3, 0, 2, -5, -5, - 0, -3, -3, -3, 0, 0, 0, 0, - 0, 0, -8, 0, -3, 0, -4, -3, - 0, -6, -6, -8, -2, 0, -5, 0, - -8, 0, 0, 0, 0, 20, 0, 0, - 1, 0, 0, -3, 0, 3, 0, -11, - 0, 0, 0, 0, 0, -24, -5, 8, - 8, -2, -11, 0, 3, -4, 0, -13, - -1, -3, 3, -18, -3, 3, 0, 4, - -9, -4, -9, -8, -11, 0, 0, -15, - 0, 15, 0, 0, -1, 0, 0, 0, - -1, -1, -3, -7, -8, -1, -24, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -3, 0, -1, -3, -4, 0, 0, - -5, 0, -3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, -5, 0, 0, 5, - -1, 3, 0, -6, 3, -2, -1, -7, - -3, 0, -3, -3, -2, 0, -4, -4, - 0, 0, -2, -1, -2, -4, -3, 0, - 0, -3, 0, 3, -2, 0, -6, 0, - 0, 0, -5, 0, -4, 0, -4, -4, - 3, 0, 0, 0, 0, 0, 0, 0, - 0, -5, 3, 0, -4, 0, -2, -3, - -8, -2, -2, -2, -1, -2, -3, -1, - 0, 0, 0, 0, 0, -3, -2, -2, - 0, 0, 0, 0, 3, -2, 0, -2, - 0, 0, 0, -2, -3, -2, -2, -3, - -2, 0, 2, 10, -1, 0, -7, 0, - -2, 5, 0, -3, -11, -3, 4, 0, - 0, -12, -4, 3, -4, 2, 0, -2, - -2, -8, 0, -4, 1, 0, 0, -4, - 0, 0, 0, 3, 3, -5, -5, 0, - -4, -3, -4, -3, -3, 0, -4, 1, - -5, -4, 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 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, - -2, 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, -2, -3, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, 0, -3, - 0, 0, -3, -3, 0, 0, 0, 0, - -3, 0, 0, 0, 0, -1, 0, 0, - 0, 0, 0, -2, 0, 0, 0, 0, - -4, 0, -5, 0, 0, 0, -8, 0, - 2, -6, 5, 1, -2, -12, 0, 0, - -6, -3, 0, -10, -6, -7, 0, 0, - -11, -3, -10, -10, -12, 0, -7, 0, - 2, 17, -3, 0, -6, -3, -1, -3, - -4, -7, -5, -9, -10, -6, -3, 0, - 0, -2, 0, 1, 0, 0, -18, -2, - 8, 6, -6, -9, 0, 1, -8, 0, - -13, -2, -3, 5, -24, -3, 1, 0, - 0, -17, -3, -13, -3, -19, 0, 0, - -18, 0, 15, 1, 0, -2, 0, 0, - 0, 0, -1, -2, -10, -2, 0, -17, - 0, 0, 0, 0, -8, 0, -2, 0, - -1, -7, -12, 0, 0, -1, -4, -8, - -3, 0, -2, 0, 0, 0, 0, -12, - -3, -8, -8, -2, -4, -6, -3, -4, - 0, -5, -2, -8, -4, 0, -3, -5, - -3, -5, 0, 1, 0, -2, -8, 0, - 5, 0, -5, 0, 0, 0, 0, 3, - 0, 2, -5, 10, 0, -3, -3, -3, - 0, 0, 0, 0, 0, 0, -8, 0, - -3, 0, -4, -3, 0, -6, -6, -8, - -2, 0, -5, 2, 10, 0, 0, 0, - 0, 20, 0, 0, 1, 0, 0, -3, - 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -2, -5, 0, 0, 0, 0, 0, -1, - 0, 0, 0, -3, -3, 0, 0, -5, - -3, 0, 0, -5, 0, 4, -1, 0, - 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 4, 5, 2, -2, 0, -8, - -4, 0, 8, -8, -8, -5, -5, 10, - 5, 3, -22, -2, 5, -3, 0, -3, - 3, -3, -9, 0, -3, 3, -3, -2, - -8, -2, 0, 0, 8, 5, 0, -7, - 0, -14, -3, 7, -3, -10, 1, -3, - -8, -8, -3, 10, 3, 0, -4, 0, - -7, 0, 2, 8, -6, -9, -10, -6, - 8, 0, 1, -19, -2, 3, -4, -2, - -6, 0, -6, -9, -4, -4, -2, 0, - 0, -6, -5, -3, 0, 8, 6, -3, - -14, 0, -14, -4, 0, -9, -15, -1, - -8, -4, -8, -7, 7, 0, 0, -3, - 0, -5, -2, 0, -3, -5, 0, 4, - -8, 3, 0, 0, -14, 0, -3, -6, - -4, -2, -8, -6, -8, -6, 0, -8, - -3, -6, -5, -8, -3, 0, 0, 1, - 12, -4, 0, -8, -3, 0, -3, -5, - -6, -7, -7, -10, -3, -5, 5, 0, - -4, 0, -13, -3, 2, 5, -8, -9, - -5, -8, 8, -3, 1, -24, -5, 5, - -6, -4, -9, 0, -8, -11, -3, -3, - -2, -3, -5, -8, -1, 0, 0, 8, - 7, -2, -17, 0, -15, -6, 6, -10, - -17, -5, -9, -11, -13, -8, 5, 0, - 0, 0, 0, -3, 0, 0, 3, -3, - 5, 2, -5, 5, 0, 0, -8, -1, - 0, -1, 0, 1, 1, -2, 0, 0, - 0, 0, 0, 0, -3, 0, 0, 0, - 0, 2, 8, 1, 0, -3, 0, 0, - 0, 0, -2, -2, -3, 0, 0, 0, - 1, 2, 0, 0, 0, 0, 2, 0, - -2, 0, 10, 0, 5, 1, 1, -3, - 0, 5, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -15, 0, -3, 4, 0, 8, - 0, 0, 25, 3, -5, -5, 3, 3, - -2, 1, -13, 0, 0, 12, -15, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -17, 10, 36, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -15, 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, -4, 0, 0, -5, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, -7, 0, - 0, 1, 0, 0, 3, 33, -5, -2, - 8, 7, -7, 3, 0, 0, 3, 3, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -33, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -7, - 0, 0, 0, -7, 0, 0, 0, 0, - -6, -1, 0, 0, 0, -6, 0, -3, - 0, -12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -17, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, -3, 0, 0, -5, 0, -4, 0, - -7, 0, 0, 0, -4, 3, -3, 0, - 0, -7, -3, -6, 0, 0, -7, 0, - -3, 0, -12, 0, -3, 0, 0, -21, - -5, -10, -3, -9, 0, 0, -17, 0, - -7, -1, 0, 0, 0, 0, 0, 0, - 0, 0, -4, -5, -2, -4, 0, 0, - 0, 0, -6, 0, -6, 3, -3, 5, - 0, -2, -6, -2, -4, -5, 0, -3, - -1, -2, 2, -7, -1, 0, 0, 0, - -23, -2, -4, 0, -6, 0, -2, -12, - -2, 0, 0, -2, -2, 0, 0, 0, - 0, 2, 0, -2, -4, -2, 4, 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, 3, 0, 0, 0, 0, 0, - 0, -6, 0, -2, 0, 0, 0, -5, - 3, 0, 0, 0, -7, -3, -5, 0, - 0, -7, 0, -3, 0, -12, 0, 0, - 0, 0, -25, 0, -5, -9, -13, 0, - 0, -17, 0, -2, -4, 0, 0, 0, - 0, 0, 0, 0, 0, -3, -4, -1, - -4, 1, 0, 0, 4, -3, 0, 8, - 13, -3, -3, -8, 3, 13, 4, 6, - -7, 3, 11, 3, 7, 6, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 16, 12, -5, -3, 0, -2, - 20, 11, 20, 0, 0, 0, 3, 0, - 0, 9, 0, 0, -4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2, 0, - 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 0, -22, -3, -2, -10, - -13, 0, 0, -17, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, -22, -3, -2, - -10, -13, 0, 0, -10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -2, 0, 0, 0, -6, 3, 0, -3, - 2, 5, 3, -8, 0, -1, -2, 3, - 0, 2, 0, 0, 0, 0, -6, 0, - -2, -2, -5, 0, -2, -10, 0, 16, - -3, 0, -6, -2, 0, -2, -4, 0, - -3, -7, -5, -3, 0, 0, 0, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -2, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 0, -22, - -3, -2, -10, -13, 0, 0, -17, 0, - 0, 0, 0, 0, 0, 13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -4, 0, -8, -3, -2, 8, -2, -3, - -10, 1, -2, 1, -2, -7, 1, 6, - 1, 2, 1, 2, -6, -10, -3, 0, - -10, -5, -7, -11, -10, 0, -4, -5, - -3, -3, -2, -2, -3, -2, 0, -2, - -1, 4, 0, 4, -2, 0, 8, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -2, -3, -3, 0, 0, - -7, 0, -1, 0, -4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, -3, 0, -3, - 0, 0, 0, 0, -2, 0, 0, -4, - -3, 3, 0, -4, -5, -2, 0, -7, - -2, -6, -2, -3, 0, -4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -17, 0, 8, 0, 0, -5, 0, - 0, 0, 0, -3, 0, -3, 0, 0, - -1, 0, 0, -2, 0, -6, 0, 0, - 11, -3, -8, -8, 2, 3, 3, -1, - -7, 2, 4, 2, 8, 2, 8, -2, - -7, 0, 0, -10, 0, 0, -8, -7, - 0, 0, -5, 0, -3, -4, 0, -4, - 0, -4, 0, -2, 4, 0, -2, -8, - -3, 9, 0, 0, -2, 0, -5, 0, - 0, 3, -6, 0, 3, -3, 2, 0, - 0, -8, 0, -2, -1, 0, -3, 3, - -2, 0, 0, 0, -10, -3, -6, 0, - -8, 0, 0, -12, 0, 9, -3, 0, - -5, 0, 2, 0, -3, 0, -3, -8, - 0, -3, 3, 0, 0, 0, 0, -2, - 0, 0, 3, -3, 1, 0, 0, -3, - -2, 0, -3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -16, 0, 6, 0, - 0, -2, 0, 0, 0, 0, 1, 0, - -3, -3, 0, 0, 0, 5, 0, 6, - 0, 0, 0, 0, 0, -16, -15, 1, - 11, 8, 4, -10, 2, 11, 0, 9, - 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 14, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_16 = { -#else -lv_font_t lv_font_montserrat_16 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 18, /*The maximum line height required by the font*/ - .base_line = 3, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -1, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_16*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_18.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_18.c deleted file mode 100644 index de73390..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_18.c +++ /dev/null @@ -1,2860 +0,0 @@ -/******************************************************************************* - * Size: 18 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 18 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_18.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_18 - #define LV_FONT_MONTSERRAT_18 1 -#endif - -#if LV_FONT_MONTSERRAT_18 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x9f, 0x68, 0xf6, 0x8f, 0x57, 0xf4, 0x6f, 0x46, - 0xf3, 0x5f, 0x35, 0xf2, 0x4f, 0x10, 0x0, 0x15, - 0xa, 0xf7, 0x7f, 0x40, - - /* U+0022 "\"" */ - 0xda, 0x9, 0xed, 0x90, 0x9d, 0xd9, 0x8, 0xdc, - 0x80, 0x8d, 0xc8, 0x8, 0xc0, 0x0, 0x0, - - /* U+0023 "#" */ - 0x0, 0x0, 0xe5, 0x0, 0x4f, 0x0, 0x0, 0x0, - 0xf, 0x30, 0x6, 0xe0, 0x0, 0x0, 0x2, 0xf1, - 0x0, 0x8c, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x5, 0x5a, 0xe5, 0x55, 0xda, 0x55, - 0x0, 0x0, 0x9b, 0x0, 0xe, 0x60, 0x0, 0x0, - 0xb, 0x90, 0x0, 0xf4, 0x0, 0x0, 0x11, 0xd8, - 0x11, 0x3f, 0x31, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x2, 0x45, 0xf6, 0x44, 0x8e, 0x44, - 0x20, 0x0, 0x2f, 0x10, 0x7, 0xc0, 0x0, 0x0, - 0x4, 0xf0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0x5e, - 0x0, 0xb, 0x90, 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xe4, 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, - 0x0, 0x2, 0xad, 0xff, 0xd9, 0x20, 0x3, 0xff, - 0xbf, 0xcd, 0xfc, 0x0, 0xbf, 0x40, 0xe4, 0x3, - 0x30, 0xe, 0xd0, 0xe, 0x40, 0x0, 0x0, 0xdf, - 0x30, 0xe4, 0x0, 0x0, 0x5, 0xff, 0xaf, 0x50, - 0x0, 0x0, 0x4, 0xbf, 0xff, 0xd7, 0x0, 0x0, - 0x0, 0x1e, 0xbe, 0xfb, 0x0, 0x0, 0x0, 0xe4, - 0xb, 0xf4, 0x0, 0x0, 0xe, 0x40, 0x6f, 0x60, - 0xb4, 0x0, 0xe4, 0xb, 0xf3, 0x1e, 0xfd, 0xaf, - 0xbe, 0xfa, 0x0, 0x17, 0xcf, 0xff, 0xc6, 0x0, - 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xe4, 0x0, 0x0, - - /* U+0025 "%" */ - 0x1, 0xbf, 0xc3, 0x0, 0x0, 0x2f, 0x40, 0x0, - 0xc9, 0x16, 0xe0, 0x0, 0xc, 0x90, 0x0, 0x2f, - 0x0, 0xc, 0x50, 0x7, 0xe0, 0x0, 0x4, 0xd0, - 0x0, 0xa7, 0x2, 0xf4, 0x0, 0x0, 0x3f, 0x0, - 0xc, 0x60, 0xc9, 0x0, 0x0, 0x0, 0xd7, 0x4, - 0xf1, 0x7e, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xe4, - 0x2f, 0x41, 0xae, 0xb2, 0x0, 0x0, 0x10, 0xc, - 0x90, 0xc9, 0x28, 0xe0, 0x0, 0x0, 0x6, 0xe1, - 0x3f, 0x0, 0xd, 0x50, 0x0, 0x2, 0xf4, 0x4, - 0xd0, 0x0, 0xa7, 0x0, 0x0, 0xba, 0x0, 0x3e, - 0x0, 0xc, 0x50, 0x0, 0x6e, 0x10, 0x0, 0xd7, - 0x5, 0xe1, 0x0, 0x1f, 0x50, 0x0, 0x2, 0xbf, - 0xc3, 0x0, - - /* U+0026 "&" */ - 0x0, 0x4, 0xcf, 0xe9, 0x0, 0x0, 0x0, 0x3, - 0xfb, 0x57, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0x0, - 0xa, 0xd0, 0x0, 0x0, 0x8, 0xf1, 0x0, 0xdb, - 0x0, 0x0, 0x0, 0x2f, 0xb3, 0xce, 0x20, 0x0, - 0x0, 0x0, 0x6f, 0xfc, 0x20, 0x0, 0x0, 0x0, - 0x4e, 0xef, 0xb0, 0x0, 0x10, 0x0, 0x5f, 0xa0, - 0x6f, 0xb0, 0x1f, 0x50, 0xe, 0xc0, 0x0, 0x6f, - 0xb7, 0xf2, 0x2, 0xf8, 0x0, 0x0, 0x6f, 0xfb, - 0x0, 0xf, 0xd0, 0x0, 0x1, 0xdf, 0xb0, 0x0, - 0x8f, 0xe9, 0x8a, 0xfe, 0x8f, 0xb0, 0x0, 0x5c, - 0xff, 0xd9, 0x10, 0x68, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0xda, 0xd9, 0xd9, 0xc8, 0xc8, 0x0, - - /* U+0028 "(" */ - 0x0, 0x6f, 0x40, 0xd, 0xc0, 0x4, 0xf6, 0x0, - 0x9f, 0x10, 0xd, 0xd0, 0x0, 0xfb, 0x0, 0x2f, - 0x80, 0x3, 0xf7, 0x0, 0x4f, 0x60, 0x4, 0xf6, - 0x0, 0x3f, 0x70, 0x2, 0xf8, 0x0, 0xf, 0xb0, - 0x0, 0xdd, 0x0, 0x8, 0xf1, 0x0, 0x3f, 0x60, - 0x0, 0xdc, 0x0, 0x6, 0xf4, - - /* U+0029 ")" */ - 0x3f, 0x70, 0x0, 0xbe, 0x0, 0x5, 0xf5, 0x0, - 0x1f, 0xa0, 0x0, 0xce, 0x0, 0x9, 0xf1, 0x0, - 0x7f, 0x30, 0x6, 0xf4, 0x0, 0x5f, 0x50, 0x5, - 0xf5, 0x0, 0x6f, 0x40, 0x7, 0xf3, 0x0, 0x9f, - 0x10, 0xc, 0xe0, 0x1, 0xfa, 0x0, 0x5f, 0x50, - 0xb, 0xe0, 0x3, 0xf7, 0x0, - - /* U+002A "*" */ - 0x0, 0xe, 0x20, 0x3, 0x60, 0xe2, 0x56, 0x4d, - 0xdf, 0xce, 0x60, 0x1d, 0xff, 0x30, 0x4e, 0xcf, - 0xbf, 0x63, 0x60, 0xe2, 0x45, 0x0, 0xe, 0x20, - 0x0, - - /* U+002B "+" */ - 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x8f, 0x0, - 0x0, 0x0, 0x8, 0xf0, 0x0, 0x1, 0x22, 0x9f, - 0x22, 0x20, 0xcf, 0xff, 0xff, 0xff, 0x44, 0x55, - 0xaf, 0x55, 0x51, 0x0, 0x8, 0xf0, 0x0, 0x0, - 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, - 0x0, - - /* U+002C "," */ - 0x1, 0x10, 0xe, 0xf1, 0xf, 0xf2, 0x7, 0xe0, - 0xb, 0x90, 0xe, 0x40, - - /* U+002D "-" */ - 0x88, 0x88, 0x7f, 0xff, 0xfe, - - /* U+002E "." */ - 0x5, 0x60, 0x1f, 0xf2, 0xc, 0xd0, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x57, 0x0, 0x0, 0x0, 0xea, - 0x0, 0x0, 0x3, 0xf5, 0x0, 0x0, 0x9, 0xf0, - 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0x4f, 0x40, - 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0xe9, 0x0, - 0x0, 0x4, 0xf4, 0x0, 0x0, 0x9, 0xe0, 0x0, - 0x0, 0xe, 0x90, 0x0, 0x0, 0x4f, 0x40, 0x0, - 0x0, 0xae, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, - 0x5, 0xf3, 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, - 0xf, 0x90, 0x0, 0x0, 0x5f, 0x30, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x4, 0xbe, 0xeb, 0x40, 0x0, 0x0, 0x6f, - 0xfb, 0xbf, 0xf6, 0x0, 0x2, 0xfd, 0x10, 0x1, - 0xdf, 0x20, 0xa, 0xf3, 0x0, 0x0, 0x3f, 0xa0, - 0xe, 0xe0, 0x0, 0x0, 0xe, 0xe0, 0xf, 0xb0, - 0x0, 0x0, 0xb, 0xf0, 0x1f, 0xa0, 0x0, 0x0, - 0xa, 0xf1, 0xf, 0xb0, 0x0, 0x0, 0xb, 0xf0, - 0xe, 0xe0, 0x0, 0x0, 0xe, 0xe0, 0x9, 0xf3, - 0x0, 0x0, 0x3f, 0x90, 0x2, 0xfd, 0x10, 0x1, - 0xdf, 0x20, 0x0, 0x6f, 0xfb, 0xbf, 0xf6, 0x0, - 0x0, 0x4, 0xbe, 0xeb, 0x40, 0x0, - - /* U+0031 "1" */ - 0xdf, 0xff, 0xc8, 0xaa, 0xfc, 0x0, 0xf, 0xc0, - 0x0, 0xfc, 0x0, 0xf, 0xc0, 0x0, 0xfc, 0x0, - 0xf, 0xc0, 0x0, 0xfc, 0x0, 0xf, 0xc0, 0x0, - 0xfc, 0x0, 0xf, 0xc0, 0x0, 0xfc, 0x0, 0xf, - 0xc0, - - /* U+0032 "2" */ - 0x1, 0x8d, 0xfe, 0xc5, 0x0, 0x4f, 0xfd, 0xac, - 0xff, 0x70, 0x3c, 0x30, 0x0, 0x2f, 0xf0, 0x0, - 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, 0xc, - 0xf1, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, - 0x2, 0xee, 0x20, 0x0, 0x0, 0x2e, 0xf3, 0x0, - 0x0, 0x2, 0xef, 0x30, 0x0, 0x0, 0x2e, 0xf3, - 0x0, 0x0, 0x2, 0xef, 0x30, 0x0, 0x0, 0x2e, - 0xfc, 0xaa, 0xaa, 0xa7, 0x5f, 0xff, 0xff, 0xff, - 0xfb, - - /* U+0033 "3" */ - 0x5f, 0xff, 0xff, 0xff, 0xf0, 0x3a, 0xaa, 0xaa, - 0xcf, 0xc0, 0x0, 0x0, 0x1, 0xee, 0x10, 0x0, - 0x0, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x9f, 0x60, - 0x0, 0x0, 0x4, 0xfe, 0x61, 0x0, 0x0, 0x5, - 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x3e, 0xf2, - 0x0, 0x0, 0x0, 0x7, 0xf6, 0x0, 0x0, 0x0, - 0x6, 0xf6, 0x69, 0x10, 0x0, 0x1d, 0xf2, 0x9f, - 0xfc, 0xbc, 0xff, 0x80, 0x4, 0xae, 0xfe, 0xb5, - 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x0, 0x0, - 0x1, 0xed, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, 0x0, - 0x0, 0x5, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xc0, 0x3, 0xc5, 0x0, 0x0, 0xde, 0x10, 0x4, - 0xf7, 0x0, 0xb, 0xf4, 0x0, 0x4, 0xf7, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x39, 0x99, - 0x99, 0x9b, 0xfc, 0x98, 0x0, 0x0, 0x0, 0x5, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, - - /* U+0035 "5" */ - 0x2, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xfc, 0xaa, - 0xaa, 0xa0, 0x5, 0xf5, 0x0, 0x0, 0x0, 0x7, - 0xf3, 0x0, 0x0, 0x0, 0x9, 0xf1, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xc7, 0x0, 0x7, 0xaa, - 0xab, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xb, 0xf6, - 0x0, 0x0, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, - 0x3, 0xfa, 0x3c, 0x20, 0x0, 0xb, 0xf6, 0x6f, - 0xfd, 0xbb, 0xef, 0xb0, 0x3, 0x9d, 0xff, 0xc7, - 0x0, - - /* U+0036 "6" */ - 0x0, 0x1, 0x8d, 0xfe, 0xc6, 0x0, 0x4, 0xef, - 0xca, 0xad, 0x90, 0x1, 0xee, 0x40, 0x0, 0x0, - 0x0, 0x8f, 0x40, 0x0, 0x0, 0x0, 0xe, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0xfb, 0x2a, 0xef, 0xd7, - 0x0, 0x1f, 0xdf, 0xd9, 0x9d, 0xfb, 0x1, 0xff, - 0xa0, 0x0, 0xa, 0xf5, 0xf, 0xf2, 0x0, 0x0, - 0x3f, 0x90, 0xbf, 0x20, 0x0, 0x3, 0xf8, 0x4, - 0xfa, 0x0, 0x0, 0xaf, 0x40, 0x9, 0xfd, 0x99, - 0xdf, 0xa0, 0x0, 0x5, 0xcf, 0xfc, 0x60, 0x0, - - /* U+0037 "7" */ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7, 0xfb, 0xaa, - 0xaa, 0xaf, 0xe0, 0x7f, 0x40, 0x0, 0x5, 0xf8, - 0x6, 0xf4, 0x0, 0x0, 0xcf, 0x10, 0x0, 0x0, - 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xf3, - 0x0, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0x50, 0x0, 0x0, 0x0, 0xe, 0xe0, - 0x0, 0x0, 0x0, 0x6, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0x10, 0x0, 0x0, 0x0, 0x4f, 0x90, - 0x0, 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x2a, 0xef, 0xfc, 0x70, 0x0, 0x3f, 0xfb, - 0x89, 0xdf, 0xb0, 0xa, 0xf5, 0x0, 0x0, 0xbf, - 0x30, 0xbf, 0x10, 0x0, 0x8, 0xf4, 0x4, 0xfc, - 0x42, 0x26, 0xfd, 0x0, 0x6, 0xff, 0xff, 0xfe, - 0x10, 0x5, 0xfe, 0x85, 0x6a, 0xfd, 0x10, 0xee, - 0x10, 0x0, 0x7, 0xf8, 0x2f, 0xa0, 0x0, 0x0, - 0x1f, 0xb2, 0xfb, 0x0, 0x0, 0x2, 0xfb, 0xd, - 0xf4, 0x0, 0x0, 0xaf, 0x70, 0x3f, 0xfb, 0x89, - 0xdf, 0xc0, 0x0, 0x29, 0xdf, 0xfc, 0x60, 0x0, - - /* U+0039 "9" */ - 0x0, 0x6c, 0xff, 0xc6, 0x0, 0x0, 0xaf, 0xd9, - 0x8c, 0xfa, 0x0, 0x3f, 0xb0, 0x0, 0x7, 0xf6, - 0x7, 0xf5, 0x0, 0x0, 0xf, 0xd0, 0x6f, 0x60, - 0x0, 0x2, 0xff, 0x11, 0xff, 0x51, 0x4, 0xdf, - 0xf2, 0x4, 0xef, 0xff, 0xfb, 0x9f, 0x30, 0x0, - 0x57, 0x73, 0xa, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xa0, 0x0, - 0x0, 0x0, 0x3e, 0xf2, 0x0, 0x8e, 0xba, 0xcf, - 0xf5, 0x0, 0x5, 0xbe, 0xfd, 0x92, 0x0, 0x0, - - /* U+003A ":" */ - 0xc, 0xd0, 0x1f, 0xf2, 0x5, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, - 0x1f, 0xf2, 0xc, 0xd0, - - /* U+003B ";" */ - 0xc, 0xd0, 0x1f, 0xf2, 0x5, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0xe, 0xf1, 0xf, 0xf2, 0x7, 0xe0, 0xb, 0x90, - 0xe, 0x40, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x5, 0x20, 0x0, 0x1, 0x8e, - 0xf4, 0x0, 0x4b, 0xff, 0x93, 0x6, 0xdf, 0xc6, - 0x0, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x5, 0xcf, - 0xe7, 0x10, 0x0, 0x0, 0x39, 0xff, 0xb4, 0x0, - 0x0, 0x1, 0x6d, 0xf4, 0x0, 0x0, 0x0, 0x4, - 0x20, - - /* U+003D "=" */ - 0xcf, 0xff, 0xff, 0xff, 0x46, 0x77, 0x77, 0x77, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0xc, 0xff, - 0xff, 0xff, 0xf4, 0x45, 0x55, 0x55, 0x55, 0x10, - - /* U+003E ">" */ - 0x62, 0x0, 0x0, 0x0, 0xc, 0xfb, 0x40, 0x0, - 0x0, 0x6, 0xcf, 0xe7, 0x10, 0x0, 0x0, 0x39, - 0xff, 0xa1, 0x0, 0x0, 0x2, 0xdf, 0x40, 0x0, - 0x4b, 0xff, 0x91, 0x18, 0xef, 0xc6, 0x0, 0xc, - 0xfa, 0x30, 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, - 0x0, - - /* U+003F "?" */ - 0x2, 0x9d, 0xfe, 0xc5, 0x0, 0x4f, 0xfb, 0x9b, - 0xff, 0x80, 0x4c, 0x20, 0x0, 0x2f, 0xf0, 0x0, - 0x0, 0x0, 0xc, 0xf0, 0x0, 0x0, 0x0, 0x1f, - 0xc0, 0x0, 0x0, 0x1, 0xcf, 0x30, 0x0, 0x0, - 0x1d, 0xf4, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, - 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, - 0x1, 0xff, 0x10, 0x0, 0x0, 0x0, 0xcd, 0x0, - 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x2, 0x9d, 0xff, 0xec, 0x71, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xc7, 0x54, 0x58, 0xdf, - 0x60, 0x0, 0x0, 0xc, 0xe4, 0x0, 0x0, 0x0, - 0x6, 0xf9, 0x0, 0x0, 0xae, 0x10, 0x3b, 0xef, - 0xb2, 0xbd, 0x3f, 0x60, 0x4, 0xf4, 0x4, 0xfe, - 0x97, 0xcf, 0xed, 0x6, 0xe0, 0xa, 0xc0, 0xe, - 0xe1, 0x0, 0x8, 0xfd, 0x0, 0xe5, 0xe, 0x60, - 0x4f, 0x60, 0x0, 0x0, 0xfd, 0x0, 0xa9, 0x1f, - 0x40, 0x6f, 0x30, 0x0, 0x0, 0xcd, 0x0, 0x8b, - 0x2f, 0x30, 0x6f, 0x30, 0x0, 0x0, 0xcd, 0x0, - 0x8b, 0x1f, 0x40, 0x3f, 0x60, 0x0, 0x0, 0xfd, - 0x0, 0x99, 0xe, 0x60, 0xe, 0xe1, 0x0, 0x8, - 0xfe, 0x0, 0xe5, 0xa, 0xc0, 0x4, 0xfe, 0x87, - 0xbf, 0xaf, 0x9b, 0xe0, 0x4, 0xf4, 0x0, 0x3b, - 0xff, 0xb3, 0x1b, 0xfc, 0x30, 0x0, 0x9e, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xc7, 0x54, 0x6a, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x9d, 0xff, 0xdb, 0x50, 0x0, - 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xf6, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdd, 0xb, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0x60, 0x4f, 0x70, 0x0, 0x0, 0x0, 0xb, - 0xe0, 0x0, 0xdd, 0x0, 0x0, 0x0, 0x2, 0xf8, - 0x0, 0x6, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0x10, - 0x0, 0xe, 0xc0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x7, 0xf8, 0x88, 0x88, - 0x88, 0xfa, 0x0, 0x0, 0xed, 0x0, 0x0, 0x0, - 0xb, 0xf1, 0x0, 0x5f, 0x60, 0x0, 0x0, 0x0, - 0x4f, 0x80, 0xc, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0xee, 0x0, - - /* U+0042 "B" */ - 0x1f, 0xff, 0xff, 0xfe, 0xb4, 0x0, 0x1f, 0xd8, - 0x88, 0x8a, 0xff, 0x70, 0x1f, 0xb0, 0x0, 0x0, - 0x2f, 0xf0, 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, - 0x1f, 0xb0, 0x0, 0x0, 0x2f, 0xc0, 0x1f, 0xd8, - 0x88, 0x8a, 0xfe, 0x30, 0x1f, 0xff, 0xff, 0xff, - 0xfd, 0x40, 0x1f, 0xb0, 0x0, 0x1, 0x4d, 0xf3, - 0x1f, 0xb0, 0x0, 0x0, 0x4, 0xf9, 0x1f, 0xb0, - 0x0, 0x0, 0x2, 0xfb, 0x1f, 0xb0, 0x0, 0x0, - 0x8, 0xf8, 0x1f, 0xd8, 0x88, 0x89, 0xcf, 0xe1, - 0x1f, 0xff, 0xff, 0xff, 0xd9, 0x10, - - /* U+0043 "C" */ - 0x0, 0x0, 0x4a, 0xef, 0xeb, 0x50, 0x0, 0x1, - 0xbf, 0xfc, 0xac, 0xff, 0xb0, 0x0, 0xbf, 0xb2, - 0x0, 0x1, 0x9c, 0x0, 0x6f, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xb2, 0x0, 0x1, 0xac, 0x10, - 0x1, 0xbf, 0xfc, 0xbc, 0xff, 0xb0, 0x0, 0x0, - 0x4b, 0xef, 0xeb, 0x50, 0x0, - - /* U+0044 "D" */ - 0x1f, 0xff, 0xff, 0xfd, 0xa4, 0x0, 0x1, 0xfe, - 0xaa, 0xaa, 0xcf, 0xfa, 0x0, 0x1f, 0xb0, 0x0, - 0x0, 0x2b, 0xfa, 0x1, 0xfb, 0x0, 0x0, 0x0, - 0xc, 0xf4, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x3f, - 0xb1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xee, 0x1f, - 0xb0, 0x0, 0x0, 0x0, 0xd, 0xf1, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xee, 0x1f, 0xb0, 0x0, 0x0, - 0x0, 0x3f, 0xb1, 0xfb, 0x0, 0x0, 0x0, 0xc, - 0xf4, 0x1f, 0xb0, 0x0, 0x0, 0x2b, 0xfa, 0x1, - 0xfe, 0xaa, 0xaa, 0xcf, 0xfa, 0x0, 0x1f, 0xff, - 0xff, 0xfd, 0xa4, 0x0, 0x0, - - /* U+0045 "E" */ - 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1, 0xfe, 0xaa, - 0xaa, 0xaa, 0x70, 0x1f, 0xb0, 0x0, 0x0, 0x0, - 0x1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, - 0x0, 0x0, 0x0, 0x1, 0xfd, 0x99, 0x99, 0x99, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, - 0x0, 0x1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xb0, 0x0, 0x0, 0x0, 0x1, 0xfe, 0xaa, 0xaa, - 0xaa, 0xa0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x0, - - /* U+0046 "F" */ - 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xea, 0xaa, - 0xaa, 0xa7, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, - 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, - 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xf0, 0x1f, 0xe9, 0x99, 0x99, 0x90, - 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, - 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, - 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, - 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x60, 0x0, 0x1, - 0xbf, 0xfc, 0xbb, 0xff, 0xc1, 0x0, 0xbf, 0xb2, - 0x0, 0x0, 0x7d, 0x10, 0x6f, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xa0, 0x0, 0x0, 0x0, 0x39, 0x30, 0xfc, 0x0, - 0x0, 0x0, 0x6, 0xf5, 0xc, 0xf1, 0x0, 0x0, - 0x0, 0x6f, 0x50, 0x6f, 0xb0, 0x0, 0x0, 0x6, - 0xf5, 0x0, 0xbf, 0xb2, 0x0, 0x0, 0x9f, 0x50, - 0x0, 0xaf, 0xfd, 0xbc, 0xff, 0xd2, 0x0, 0x0, - 0x4a, 0xef, 0xeb, 0x60, 0x0, - - /* U+0048 "H" */ - 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, - 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, - 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, - 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xea, - 0xaa, 0xaa, 0xaa, 0xfb, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, - 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, - 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, - 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, - 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, - - /* U+0049 "I" */ - 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, - 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, - 0xb1, 0xfb, 0x1f, 0xb0, - - /* U+004A "J" */ - 0x0, 0xef, 0xff, 0xff, 0x70, 0x8, 0xaa, 0xab, - 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, - 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, - 0x0, 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, - 0x0, 0x0, 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, - 0x70, 0x0, 0x0, 0x6, 0xf6, 0xa, 0x70, 0x0, - 0xcf, 0x30, 0xcf, 0xda, 0xdf, 0xc0, 0x0, 0x8d, - 0xfe, 0x90, 0x0, - - /* U+004B "K" */ - 0x1f, 0xb0, 0x0, 0x0, 0x1d, 0xe2, 0x1f, 0xb0, - 0x0, 0x1, 0xdf, 0x30, 0x1f, 0xb0, 0x0, 0xc, - 0xf4, 0x0, 0x1f, 0xb0, 0x0, 0xbf, 0x50, 0x0, - 0x1f, 0xb0, 0xb, 0xf7, 0x0, 0x0, 0x1f, 0xb0, - 0xaf, 0x80, 0x0, 0x0, 0x1f, 0xb9, 0xff, 0xb0, - 0x0, 0x0, 0x1f, 0xff, 0xbb, 0xf8, 0x0, 0x0, - 0x1f, 0xfb, 0x1, 0xdf, 0x50, 0x0, 0x1f, 0xd0, - 0x0, 0x2f, 0xf2, 0x0, 0x1f, 0xb0, 0x0, 0x4, - 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, 0x7f, 0xb0, - 0x1f, 0xb0, 0x0, 0x0, 0x9, 0xf8, - - /* U+004C "L" */ - 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, - 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, - 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, - 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, - 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, - 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, - 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, - 0xea, 0xaa, 0xaa, 0xa5, 0x1f, 0xff, 0xff, 0xff, - 0xf8, - - /* U+004D "M" */ - 0x1f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x41, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, 0xf4, 0x1f, - 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, 0x41, 0xff, - 0xf5, 0x0, 0x0, 0x2, 0xfe, 0xf4, 0x1f, 0xad, - 0xe0, 0x0, 0x0, 0xbe, 0x8f, 0x41, 0xfa, 0x4f, - 0x80, 0x0, 0x4f, 0x67, 0xf4, 0x1f, 0xa0, 0xaf, - 0x20, 0xd, 0xd0, 0x7f, 0x41, 0xfa, 0x2, 0xfa, - 0x7, 0xf4, 0x7, 0xf4, 0x1f, 0xa0, 0x8, 0xf5, - 0xea, 0x0, 0x7f, 0x41, 0xfa, 0x0, 0xe, 0xff, - 0x20, 0x6, 0xf4, 0x1f, 0xa0, 0x0, 0x5f, 0x80, - 0x0, 0x6f, 0x41, 0xfa, 0x0, 0x0, 0x60, 0x0, - 0x6, 0xf4, 0x1f, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0x40, - - /* U+004E "N" */ - 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xf8, - 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xff, 0x50, 0x0, - 0x1, 0xfb, 0x1f, 0xdf, 0xf2, 0x0, 0x1, 0xfb, - 0x1f, 0xb6, 0xfd, 0x0, 0x1, 0xfb, 0x1f, 0xb0, - 0x9f, 0xa0, 0x1, 0xfb, 0x1f, 0xb0, 0xc, 0xf6, - 0x1, 0xfb, 0x1f, 0xb0, 0x1, 0xef, 0x31, 0xfb, - 0x1f, 0xb0, 0x0, 0x4f, 0xe2, 0xfb, 0x1f, 0xb0, - 0x0, 0x7, 0xfd, 0xfb, 0x1f, 0xb0, 0x0, 0x0, - 0xbf, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1d, 0xfb, - 0x1f, 0xb0, 0x0, 0x0, 0x2, 0xfb, - - /* U+004F "O" */ - 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x50, 0x0, 0x0, - 0x0, 0xaf, 0xfc, 0xbc, 0xff, 0xc1, 0x0, 0x0, - 0xbf, 0xb2, 0x0, 0x1, 0xaf, 0xd0, 0x0, 0x6f, - 0xb0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0xc, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0xfe, 0x0, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xf2, 0x1f, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0x30, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xf2, 0xc, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xfe, 0x0, 0x6f, 0xb0, 0x0, 0x0, - 0x0, 0x9f, 0x80, 0x0, 0xbf, 0xb2, 0x0, 0x1, - 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xfc, 0xbc, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x4a, 0xef, 0xeb, 0x50, - 0x0, 0x0, - - /* U+0050 "P" */ - 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xea, - 0xaa, 0xbe, 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, - 0x9f, 0x90, 0x1f, 0xb0, 0x0, 0x0, 0xe, 0xf0, - 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, 0x1f, 0xb0, - 0x0, 0x0, 0xe, 0xf0, 0x1f, 0xb0, 0x0, 0x0, - 0x9f, 0x90, 0x1f, 0xea, 0xaa, 0xbe, 0xfd, 0x10, - 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x50, 0x0, 0x0, - 0x0, 0xaf, 0xfc, 0xbc, 0xff, 0xc1, 0x0, 0x0, - 0xbf, 0xb2, 0x0, 0x1, 0xaf, 0xd0, 0x0, 0x6f, - 0xb0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0xc, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0xfe, 0x0, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xf1, 0x1f, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0x30, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xf2, 0xd, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xfe, 0x0, 0x7f, 0xa0, 0x0, 0x0, - 0x0, 0x8f, 0x80, 0x0, 0xcf, 0xa1, 0x0, 0x0, - 0x9f, 0xd0, 0x0, 0x1, 0xcf, 0xfb, 0xab, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x6c, 0xef, 0xfd, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xe6, 0x34, - 0xa7, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xfe, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, 0x43, 0x0, - - /* U+0052 "R" */ - 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xea, - 0xaa, 0xbe, 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, - 0x9f, 0x90, 0x1f, 0xb0, 0x0, 0x0, 0xe, 0xf0, - 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, 0x1f, 0xb0, - 0x0, 0x0, 0xe, 0xe0, 0x1f, 0xb0, 0x0, 0x0, - 0x9f, 0x90, 0x1f, 0xd9, 0x99, 0xae, 0xfd, 0x10, - 0x1f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1f, 0xb0, - 0x0, 0x1f, 0xd0, 0x0, 0x1f, 0xb0, 0x0, 0x6, - 0xf9, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0xbf, 0x40, - 0x1f, 0xb0, 0x0, 0x0, 0x1e, 0xe0, - - /* U+0053 "S" */ - 0x0, 0x29, 0xdf, 0xfd, 0x81, 0x0, 0x3f, 0xfc, - 0x9a, 0xdf, 0xc0, 0xb, 0xf4, 0x0, 0x0, 0x23, - 0x0, 0xed, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x61, 0x0, - 0x0, 0x0, 0x3b, 0xff, 0xfd, 0x70, 0x0, 0x0, - 0x0, 0x48, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0x40, 0x0, 0x0, 0x0, 0x6, 0xf6, 0xb, - 0x50, 0x0, 0x0, 0xcf, 0x31, 0xdf, 0xeb, 0x9a, - 0xef, 0x90, 0x0, 0x6b, 0xef, 0xeb, 0x50, 0x0, - - /* U+0054 "T" */ - 0xef, 0xff, 0xff, 0xff, 0xff, 0x89, 0xaa, 0xad, - 0xfb, 0xaa, 0xa5, 0x0, 0x0, 0x9f, 0x20, 0x0, - 0x0, 0x0, 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0x20, 0x0, 0x0, 0x0, 0x9, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, - 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x20, - 0x0, 0x0, 0x0, 0x9, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, 0x9, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0x20, 0x0, 0x0, - - /* U+0055 "U" */ - 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, - 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, - 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, - 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, - 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, - 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf6, - 0x2f, 0xb0, 0x0, 0x0, 0x7, 0xf5, 0xe, 0xf0, - 0x0, 0x0, 0xb, 0xf2, 0x8, 0xfa, 0x0, 0x0, - 0x7f, 0xb0, 0x0, 0xcf, 0xfb, 0xbe, 0xfe, 0x20, - 0x0, 0x7, 0xcf, 0xfd, 0x81, 0x0, - - /* U+0056 "V" */ - 0xc, 0xf2, 0x0, 0x0, 0x0, 0x2, 0xf9, 0x6, - 0xf8, 0x0, 0x0, 0x0, 0x9, 0xf3, 0x0, 0xef, - 0x0, 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x8f, 0x60, - 0x0, 0x0, 0x7f, 0x50, 0x0, 0x1f, 0xd0, 0x0, - 0x0, 0xee, 0x0, 0x0, 0xa, 0xf4, 0x0, 0x5, - 0xf7, 0x0, 0x0, 0x3, 0xfb, 0x0, 0xc, 0xf1, - 0x0, 0x0, 0x0, 0xdf, 0x20, 0x2f, 0xa0, 0x0, - 0x0, 0x0, 0x6f, 0x80, 0x9f, 0x30, 0x0, 0x0, - 0x0, 0xe, 0xe1, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xfc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0x80, 0x0, 0x0, - - /* U+0057 "W" */ - 0x4f, 0x90, 0x0, 0x0, 0xc, 0xf3, 0x0, 0x0, - 0x2, 0xf8, 0xe, 0xe0, 0x0, 0x0, 0x2f, 0xf8, - 0x0, 0x0, 0x8, 0xf3, 0x9, 0xf3, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0xd, 0xd0, 0x4, 0xf8, - 0x0, 0x0, 0xcd, 0x8f, 0x20, 0x0, 0x2f, 0x80, - 0x0, 0xfe, 0x0, 0x2, 0xf8, 0x3f, 0x80, 0x0, - 0x7f, 0x30, 0x0, 0xaf, 0x30, 0x7, 0xf3, 0xe, - 0xd0, 0x0, 0xde, 0x0, 0x0, 0x5f, 0x80, 0xc, - 0xd0, 0x8, 0xf2, 0x2, 0xf9, 0x0, 0x0, 0xf, - 0xd0, 0x2f, 0x80, 0x3, 0xf7, 0x7, 0xf4, 0x0, - 0x0, 0xa, 0xf2, 0x7f, 0x30, 0x0, 0xed, 0xc, - 0xe0, 0x0, 0x0, 0x5, 0xf7, 0xdd, 0x0, 0x0, - 0x9f, 0x4f, 0x90, 0x0, 0x0, 0x0, 0xfe, 0xf8, - 0x0, 0x0, 0x3f, 0xdf, 0x40, 0x0, 0x0, 0x0, - 0xbf, 0xf3, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xe0, 0x0, 0x0, 0x9, 0xfa, - 0x0, 0x0, - - /* U+0058 "X" */ - 0x2f, 0xd0, 0x0, 0x0, 0xb, 0xf3, 0x6, 0xfa, - 0x0, 0x0, 0x7f, 0x70, 0x0, 0xbf, 0x50, 0x2, - 0xfc, 0x0, 0x0, 0x1e, 0xe1, 0xd, 0xf2, 0x0, - 0x0, 0x5, 0xfb, 0x8f, 0x50, 0x0, 0x0, 0x0, - 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x10, 0x0, - 0x0, 0x9, 0xf6, 0x5f, 0xa0, 0x0, 0x0, 0x4f, - 0xb0, 0xa, 0xf6, 0x0, 0x1, 0xee, 0x10, 0x1, - 0xef, 0x20, 0xb, 0xf5, 0x0, 0x0, 0x4f, 0xc0, - 0x6f, 0xa0, 0x0, 0x0, 0x8, 0xf8, - - /* U+0059 "Y" */ - 0xc, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0x60, 0x3f, - 0xb0, 0x0, 0x0, 0xe, 0xd0, 0x0, 0x9f, 0x50, - 0x0, 0x8, 0xf3, 0x0, 0x1, 0xee, 0x0, 0x2, - 0xfa, 0x0, 0x0, 0x6, 0xf8, 0x0, 0xbf, 0x10, - 0x0, 0x0, 0xc, 0xf1, 0x4f, 0x70, 0x0, 0x0, - 0x0, 0x3f, 0xbd, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xfb, 0x0, 0x0, 0x0, - - /* U+005A "Z" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xa, 0xaa, - 0xaa, 0xaa, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0x20, 0x0, 0x0, 0x0, 0xc, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, - 0x5, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0x30, 0x0, 0x0, - 0x0, 0xa, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xa0, 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xfb, 0xaa, 0xaa, 0xaa, 0xa2, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf4, - - /* U+005B "[" */ - 0x1f, 0xff, 0xa1, 0xfc, 0x74, 0x1f, 0xa0, 0x1, - 0xfa, 0x0, 0x1f, 0xa0, 0x1, 0xfa, 0x0, 0x1f, - 0xa0, 0x1, 0xfa, 0x0, 0x1f, 0xa0, 0x1, 0xfa, - 0x0, 0x1f, 0xa0, 0x1, 0xfa, 0x0, 0x1f, 0xa0, - 0x1, 0xfa, 0x0, 0x1f, 0xa0, 0x1, 0xfa, 0x0, - 0x1f, 0xc7, 0x41, 0xff, 0xfa, - - /* U+005C "\\" */ - 0x47, 0x0, 0x0, 0x0, 0x5f, 0x30, 0x0, 0x0, - 0xf, 0x80, 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, - 0x5, 0xf3, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, - 0x0, 0xae, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, - 0x0, 0xf, 0x90, 0x0, 0x0, 0xa, 0xe0, 0x0, - 0x0, 0x4, 0xf4, 0x0, 0x0, 0x0, 0xe9, 0x0, - 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x4f, 0x40, - 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0x9, 0xf0, - 0x0, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, 0xea, - - /* U+005D "]" */ - 0xaf, 0xff, 0x14, 0x7c, 0xf1, 0x0, 0xaf, 0x10, - 0xa, 0xf1, 0x0, 0xaf, 0x10, 0xa, 0xf1, 0x0, - 0xaf, 0x10, 0xa, 0xf1, 0x0, 0xaf, 0x10, 0xa, - 0xf1, 0x0, 0xaf, 0x10, 0xa, 0xf1, 0x0, 0xaf, - 0x10, 0xa, 0xf1, 0x0, 0xaf, 0x10, 0xa, 0xf1, - 0x47, 0xcf, 0x1a, 0xff, 0xf1, - - /* U+005E "^" */ - 0x0, 0xa, 0xf2, 0x0, 0x0, 0x1, 0xfe, 0x90, - 0x0, 0x0, 0x7d, 0x5e, 0x0, 0x0, 0xd, 0x70, - 0xf5, 0x0, 0x4, 0xf1, 0x9, 0xc0, 0x0, 0xab, - 0x0, 0x3f, 0x20, 0x1f, 0x50, 0x0, 0xd8, 0x7, - 0xe0, 0x0, 0x6, 0xe0, - - /* U+005F "_" */ - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x22, 0x22, 0x22, - 0x22, - - /* U+0060 "`" */ - 0x48, 0x40, 0x0, 0xaf, 0x40, 0x0, 0x7f, 0x40, - - /* U+0061 "a" */ - 0x1, 0x7c, 0xff, 0xd6, 0x0, 0x9, 0xfc, 0x99, - 0xef, 0x80, 0x1, 0x30, 0x0, 0xd, 0xf0, 0x0, - 0x0, 0x0, 0x9, 0xf2, 0x1, 0x9e, 0xff, 0xff, - 0xf3, 0xa, 0xf8, 0x43, 0x3a, 0xf3, 0xf, 0xb0, - 0x0, 0x8, 0xf3, 0xf, 0xb0, 0x0, 0xe, 0xf3, - 0x9, 0xf9, 0x46, 0xdf, 0xf3, 0x0, 0x8d, 0xfe, - 0x87, 0xf3, - - /* U+0062 "b" */ - 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, - 0x5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x56, - 0xdf, 0xea, 0x20, 0x5, 0xfd, 0xfc, 0x9b, 0xff, - 0x30, 0x5f, 0xf5, 0x0, 0x4, 0xfe, 0x5, 0xfa, - 0x0, 0x0, 0x8, 0xf4, 0x5f, 0x60, 0x0, 0x0, - 0x4f, 0x75, 0xf6, 0x0, 0x0, 0x4, 0xf7, 0x5f, - 0xa0, 0x0, 0x0, 0x8f, 0x45, 0xff, 0x50, 0x0, - 0x4f, 0xe0, 0x5f, 0xcf, 0xc9, 0xbf, 0xf3, 0x5, - 0xf4, 0x6d, 0xfe, 0xa2, 0x0, - - /* U+0063 "c" */ - 0x0, 0x7, 0xdf, 0xeb, 0x30, 0x0, 0xcf, 0xd9, - 0xaf, 0xf4, 0x9, 0xf7, 0x0, 0x2, 0xc3, 0xf, - 0xd0, 0x0, 0x0, 0x0, 0x3f, 0x80, 0x0, 0x0, - 0x0, 0x3f, 0x80, 0x0, 0x0, 0x0, 0xf, 0xc0, - 0x0, 0x0, 0x0, 0x9, 0xf7, 0x0, 0x2, 0xc3, - 0x0, 0xcf, 0xd9, 0xaf, 0xf3, 0x0, 0x7, 0xdf, - 0xeb, 0x30, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x0, - 0x0, 0x1, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xa0, 0x0, 0x0, 0x0, 0x1, 0xfa, 0x0, 0x8, - 0xdf, 0xe8, 0x2f, 0xa0, 0x1d, 0xfd, 0x9b, 0xfd, - 0xfa, 0xa, 0xf8, 0x0, 0x2, 0xef, 0xa0, 0xfd, - 0x0, 0x0, 0x6, 0xfa, 0x3f, 0x80, 0x0, 0x0, - 0x2f, 0xa3, 0xf8, 0x0, 0x0, 0x2, 0xfa, 0xf, - 0xc0, 0x0, 0x0, 0x5f, 0xa0, 0xaf, 0x60, 0x0, - 0x1e, 0xfa, 0x1, 0xdf, 0xb7, 0x9e, 0xdf, 0xa0, - 0x0, 0x8d, 0xfe, 0x91, 0xfa, - - /* U+0065 "e" */ - 0x0, 0x8, 0xdf, 0xe9, 0x10, 0x0, 0x1d, 0xfb, - 0x8a, 0xfe, 0x20, 0xa, 0xf3, 0x0, 0x3, 0xfb, - 0x0, 0xfa, 0x0, 0x0, 0x9, 0xf1, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0x33, 0xfa, 0x33, 0x33, 0x33, - 0x30, 0xf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0x90, 0x0, 0x9, 0x10, 0x0, 0xdf, 0xda, 0xae, - 0xf6, 0x0, 0x0, 0x7d, 0xff, 0xc5, 0x0, - - /* U+0066 "f" */ - 0x0, 0x1a, 0xee, 0x90, 0xa, 0xf9, 0x88, 0x0, - 0xfb, 0x0, 0x0, 0x1f, 0x90, 0x0, 0xbf, 0xff, - 0xff, 0x55, 0x8f, 0xc7, 0x72, 0x1, 0xfa, 0x0, - 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, - 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, 0x1f, - 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, 0x1f, 0xa0, - 0x0, - - /* U+0067 "g" */ - 0x0, 0x8, 0xdf, 0xe9, 0x1e, 0xc0, 0x1d, 0xfd, - 0x9b, 0xfe, 0xec, 0xa, 0xf8, 0x0, 0x1, 0xdf, - 0xc0, 0xfd, 0x0, 0x0, 0x4, 0xfc, 0x3f, 0x90, - 0x0, 0x0, 0xf, 0xc3, 0xf8, 0x0, 0x0, 0x0, - 0xfc, 0xf, 0xd0, 0x0, 0x0, 0x4f, 0xc0, 0xaf, - 0x80, 0x0, 0x1d, 0xfc, 0x1, 0xdf, 0xd9, 0xaf, - 0xdf, 0xc0, 0x0, 0x8d, 0xfe, 0x91, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0x90, 0x27, 0x0, 0x0, - 0xb, 0xf4, 0x7, 0xff, 0xb9, 0xae, 0xfa, 0x0, - 0x4, 0xae, 0xff, 0xc6, 0x0, - - /* U+0068 "h" */ - 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, - 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5f, - 0x50, 0x0, 0x0, 0x0, 0x5f, 0x56, 0xdf, 0xea, - 0x10, 0x5f, 0xef, 0xca, 0xdf, 0xd0, 0x5f, 0xf4, - 0x0, 0xa, 0xf6, 0x5f, 0x90, 0x0, 0x2, 0xf9, - 0x5f, 0x60, 0x0, 0x0, 0xfa, 0x5f, 0x50, 0x0, - 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, - 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, - 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, - - /* U+0069 "i" */ - 0x6f, 0x69, 0xf9, 0x4, 0x0, 0x0, 0x5f, 0x55, - 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, - 0x55, 0xf5, 0x5f, 0x55, 0xf5, - - /* U+006A "j" */ - 0x0, 0x4, 0xf7, 0x0, 0x7, 0xfa, 0x0, 0x0, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf7, 0x0, - 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, - 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, - 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, - 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x6, 0xf5, - 0x4b, 0x9f, 0xe1, 0x5e, 0xfc, 0x30, - - /* U+006B "k" */ - 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, - 0x5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x50, - 0x0, 0x1d, 0xf3, 0x5, 0xf5, 0x0, 0x2d, 0xf3, - 0x0, 0x5f, 0x50, 0x2e, 0xf4, 0x0, 0x5, 0xf5, - 0x2e, 0xf4, 0x0, 0x0, 0x5f, 0x9e, 0xfe, 0x0, - 0x0, 0x5, 0xff, 0xfa, 0xfa, 0x0, 0x0, 0x5f, - 0xe3, 0xc, 0xf6, 0x0, 0x5, 0xf6, 0x0, 0x1e, - 0xf3, 0x0, 0x5f, 0x50, 0x0, 0x4f, 0xd0, 0x5, - 0xf5, 0x0, 0x0, 0x7f, 0xa0, - - /* U+006C "l" */ - 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, - 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, - 0x55, 0xf5, 0x5f, 0x55, 0xf5, - - /* U+006D "m" */ - 0x5f, 0x58, 0xdf, 0xe8, 0x0, 0x8d, 0xfe, 0x80, - 0x5, 0xfe, 0xfa, 0x9d, 0xfb, 0xdf, 0xa9, 0xdf, - 0xb0, 0x5f, 0xf2, 0x0, 0xd, 0xff, 0x30, 0x0, - 0xcf, 0x35, 0xf9, 0x0, 0x0, 0x7f, 0xa0, 0x0, - 0x6, 0xf6, 0x5f, 0x60, 0x0, 0x5, 0xf7, 0x0, - 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, 0x5f, 0x60, - 0x0, 0x4, 0xf7, 0x5f, 0x50, 0x0, 0x5, 0xf6, - 0x0, 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, 0x5f, - 0x60, 0x0, 0x4, 0xf7, 0x5f, 0x50, 0x0, 0x5, - 0xf6, 0x0, 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, - 0x5f, 0x60, 0x0, 0x4, 0xf7, - - /* U+006E "n" */ - 0x5f, 0x57, 0xdf, 0xea, 0x10, 0x5f, 0xef, 0xa8, - 0xcf, 0xd0, 0x5f, 0xf3, 0x0, 0x9, 0xf6, 0x5f, - 0x90, 0x0, 0x2, 0xf9, 0x5f, 0x60, 0x0, 0x0, - 0xfa, 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, - 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, - 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, - 0x0, 0xfb, - - /* U+006F "o" */ - 0x0, 0x7, 0xdf, 0xea, 0x30, 0x0, 0xd, 0xfd, - 0x9a, 0xff, 0x50, 0x9, 0xf7, 0x0, 0x2, 0xef, - 0x10, 0xfd, 0x0, 0x0, 0x6, 0xf7, 0x3f, 0x80, - 0x0, 0x0, 0x2f, 0x93, 0xf8, 0x0, 0x0, 0x2, - 0xf9, 0xf, 0xd0, 0x0, 0x0, 0x6f, 0x60, 0x9f, - 0x80, 0x0, 0x2e, 0xf1, 0x0, 0xcf, 0xd9, 0xaf, - 0xf4, 0x0, 0x0, 0x7d, 0xfe, 0xa3, 0x0, - - /* U+0070 "p" */ - 0x5f, 0x46, 0xdf, 0xea, 0x20, 0x5, 0xfd, 0xfa, - 0x8a, 0xff, 0x30, 0x5f, 0xf4, 0x0, 0x3, 0xfe, - 0x5, 0xfa, 0x0, 0x0, 0x8, 0xf4, 0x5f, 0x60, - 0x0, 0x0, 0x4f, 0x75, 0xf6, 0x0, 0x0, 0x4, - 0xf7, 0x5f, 0xa0, 0x0, 0x0, 0x9f, 0x45, 0xff, - 0x50, 0x0, 0x4f, 0xe0, 0x5f, 0xdf, 0xc9, 0xbf, - 0xf3, 0x5, 0xf5, 0x6d, 0xfe, 0xa2, 0x0, 0x5f, - 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, - 0xf5, 0x0, 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x8, 0xdf, 0xe8, 0x1f, 0xa0, 0x1d, 0xfd, - 0x9b, 0xfc, 0xfa, 0xa, 0xf7, 0x0, 0x2, 0xef, - 0xa0, 0xfd, 0x0, 0x0, 0x6, 0xfa, 0x3f, 0x80, - 0x0, 0x0, 0x2f, 0xa3, 0xf8, 0x0, 0x0, 0x2, - 0xfa, 0xf, 0xd0, 0x0, 0x0, 0x6f, 0xa0, 0xaf, - 0x80, 0x0, 0x2e, 0xfa, 0x1, 0xdf, 0xd9, 0xaf, - 0xdf, 0xa0, 0x0, 0x8d, 0xfe, 0x82, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x0, 0x0, - 0x1, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xa0, - 0x0, 0x0, 0x0, 0x1, 0xfa, - - /* U+0072 "r" */ - 0x5f, 0x46, 0xdb, 0x5f, 0xcf, 0xd9, 0x5f, 0xf5, - 0x0, 0x5f, 0xa0, 0x0, 0x5f, 0x70, 0x0, 0x5f, - 0x50, 0x0, 0x5f, 0x50, 0x0, 0x5f, 0x50, 0x0, - 0x5f, 0x50, 0x0, 0x5f, 0x50, 0x0, - - /* U+0073 "s" */ - 0x1, 0x8d, 0xfe, 0xc7, 0x0, 0xcf, 0xb8, 0xad, - 0xd0, 0x3f, 0x90, 0x0, 0x1, 0x2, 0xfb, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xb8, 0x40, 0x0, 0x5, - 0x9c, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x9f, 0x60, - 0x50, 0x0, 0x5, 0xf7, 0x5f, 0xea, 0x9a, 0xfe, - 0x10, 0x6c, 0xef, 0xd9, 0x20, - - /* U+0074 "t" */ - 0x1, 0xfa, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0xbf, - 0xff, 0xff, 0x55, 0x8f, 0xc7, 0x72, 0x1, 0xfa, - 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, - 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, - 0xf, 0xc0, 0x0, 0x0, 0xbf, 0xa9, 0x90, 0x1, - 0xbe, 0xe9, - - /* U+0075 "u" */ - 0x7f, 0x40, 0x0, 0x3, 0xf8, 0x7f, 0x40, 0x0, - 0x3, 0xf8, 0x7f, 0x40, 0x0, 0x3, 0xf8, 0x7f, - 0x40, 0x0, 0x3, 0xf8, 0x7f, 0x40, 0x0, 0x3, - 0xf8, 0x7f, 0x40, 0x0, 0x4, 0xf8, 0x6f, 0x60, - 0x0, 0x6, 0xf8, 0x2f, 0xc0, 0x0, 0x1e, 0xf8, - 0xa, 0xfd, 0x89, 0xee, 0xf8, 0x0, 0x8d, 0xfe, - 0x92, 0xf8, - - /* U+0076 "v" */ - 0xd, 0xe0, 0x0, 0x0, 0xd, 0xd0, 0x6, 0xf6, - 0x0, 0x0, 0x3f, 0x70, 0x0, 0xfc, 0x0, 0x0, - 0xaf, 0x10, 0x0, 0x9f, 0x30, 0x1, 0xf9, 0x0, - 0x0, 0x2f, 0x90, 0x7, 0xf3, 0x0, 0x0, 0xb, - 0xf0, 0xe, 0xc0, 0x0, 0x0, 0x5, 0xf6, 0x5f, - 0x50, 0x0, 0x0, 0x0, 0xed, 0xbe, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xf1, 0x0, 0x0, - - /* U+0077 "w" */ - 0xbe, 0x0, 0x0, 0xc, 0xf1, 0x0, 0x0, 0xae, - 0x5, 0xf4, 0x0, 0x2, 0xff, 0x60, 0x0, 0xf, - 0x80, 0xf, 0x90, 0x0, 0x8f, 0xeb, 0x0, 0x5, - 0xf2, 0x0, 0xae, 0x0, 0xd, 0xb8, 0xf1, 0x0, - 0xbd, 0x0, 0x4, 0xf4, 0x3, 0xf5, 0x2f, 0x70, - 0x1f, 0x70, 0x0, 0xe, 0xa0, 0x9e, 0x0, 0xcc, - 0x6, 0xf1, 0x0, 0x0, 0x9f, 0x1e, 0x90, 0x6, - 0xf2, 0xcc, 0x0, 0x0, 0x3, 0xfa, 0xf3, 0x0, - 0x1f, 0xaf, 0x60, 0x0, 0x0, 0xd, 0xfd, 0x0, - 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x8f, 0x70, - 0x0, 0x5, 0xfb, 0x0, 0x0, - - /* U+0078 "x" */ - 0x3f, 0xb0, 0x0, 0xc, 0xf2, 0x7, 0xf7, 0x0, - 0x7f, 0x60, 0x0, 0xbf, 0x33, 0xfa, 0x0, 0x0, - 0x1e, 0xde, 0xd0, 0x0, 0x0, 0x4, 0xff, 0x30, - 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, 0x3f, - 0xbc, 0xf2, 0x0, 0x0, 0xde, 0x12, 0xfc, 0x0, - 0xa, 0xf4, 0x0, 0x5f, 0x90, 0x6f, 0x80, 0x0, - 0xa, 0xf5, - - /* U+0079 "y" */ - 0xd, 0xe0, 0x0, 0x0, 0xc, 0xd0, 0x6, 0xf6, - 0x0, 0x0, 0x3f, 0x70, 0x0, 0xfc, 0x0, 0x0, - 0x9f, 0x10, 0x0, 0x9f, 0x30, 0x1, 0xfa, 0x0, - 0x0, 0x2f, 0x90, 0x6, 0xf3, 0x0, 0x0, 0xc, - 0xf0, 0xd, 0xc0, 0x0, 0x0, 0x5, 0xf6, 0x3f, - 0x60, 0x0, 0x0, 0x0, 0xed, 0xae, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xf, 0xb0, - 0x0, 0x0, 0x1, 0x0, 0x7f, 0x40, 0x0, 0x0, - 0x1f, 0xaa, 0xfb, 0x0, 0x0, 0x0, 0x19, 0xee, - 0xa1, 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0x2f, 0xff, 0xff, 0xff, 0x91, 0x77, 0x77, 0x7e, - 0xf4, 0x0, 0x0, 0x6, 0xf8, 0x0, 0x0, 0x3, - 0xfc, 0x0, 0x0, 0x1, 0xee, 0x10, 0x0, 0x0, - 0xbf, 0x40, 0x0, 0x0, 0x8f, 0x70, 0x0, 0x0, - 0x4f, 0xb0, 0x0, 0x0, 0x1e, 0xf8, 0x77, 0x77, - 0x54, 0xff, 0xff, 0xff, 0xfb, - - /* U+007B "{" */ - 0x0, 0x7e, 0xf0, 0x3f, 0xd7, 0x7, 0xf4, 0x0, - 0x8f, 0x30, 0x8, 0xf3, 0x0, 0x8f, 0x30, 0x8, - 0xf3, 0x0, 0x9f, 0x20, 0x8e, 0xe0, 0xf, 0xfa, - 0x0, 0xb, 0xf2, 0x0, 0x8f, 0x30, 0x8, 0xf3, - 0x0, 0x8f, 0x30, 0x8, 0xf3, 0x0, 0x7f, 0x40, - 0x4, 0xfd, 0x70, 0x8, 0xef, - - /* U+007C "|" */ - 0x1f, 0x71, 0xf7, 0x1f, 0x71, 0xf7, 0x1f, 0x71, - 0xf7, 0x1f, 0x71, 0xf7, 0x1f, 0x71, 0xf7, 0x1f, - 0x71, 0xf7, 0x1f, 0x71, 0xf7, 0x1f, 0x71, 0xf7, - 0x1f, 0x71, 0xf7, - - /* U+007D "}" */ - 0xaf, 0xa1, 0x0, 0x4b, 0xf9, 0x0, 0x0, 0xed, - 0x0, 0x0, 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, - 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, 0xde, 0x0, - 0x0, 0xaf, 0x92, 0x0, 0x5f, 0xf4, 0x0, 0xcf, - 0x10, 0x0, 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, - 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, 0xed, 0x0, - 0x4a, 0xf9, 0x0, 0xaf, 0xb1, 0x0, - - /* U+007E "~" */ - 0x0, 0x0, 0x0, 0x1, 0x1, 0xdf, 0xc1, 0x0, - 0xc5, 0xac, 0x5c, 0xe3, 0x4f, 0x2d, 0x40, 0x9, - 0xff, 0x90, 0x30, 0x0, 0x2, 0x10, 0x0, - - /* U+00B0 "°" */ - 0x1, 0xaf, 0xd5, 0x0, 0xb8, 0x3, 0xe4, 0x1e, - 0x0, 0x6, 0xa2, 0xe0, 0x0, 0x6a, 0xc, 0x70, - 0x1d, 0x50, 0x2c, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, - - /* U+2022 "•" */ - 0x5, 0x30, 0x9f, 0xf3, 0xcf, 0xf6, 0x4e, 0xc1, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, - 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, - 0xdf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1, 0x6a, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x7c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x3f, - 0xf2, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x95, 0x0, - 0x1, 0xff, 0x20, 0x0, 0x5, 0xff, 0x73, 0x0, - 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, 0x5f, 0xe0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0x20, 0x0, 0x5, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf2, 0x0, - 0x0, 0x5f, 0xe0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0x20, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x0, 0x69, - 0x8f, 0xf2, 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0x20, 0x3, 0x58, 0xfe, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xf2, 0x2d, 0xff, 0xff, - 0xe0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0xb, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x4, 0xbd, 0xc8, 0x10, - 0xaf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xb1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F008 "" */ - 0x51, 0x6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x30, - 0x15, 0xf7, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb6, 0x8f, 0xfd, 0xcf, 0xf3, 0x33, 0x33, 0x33, - 0x6f, 0xec, 0xdf, 0xf2, 0xc, 0xe0, 0x0, 0x0, - 0x0, 0x3f, 0x70, 0x2f, 0xf2, 0xc, 0xe0, 0x0, - 0x0, 0x0, 0x3f, 0x80, 0x2f, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf4, 0x2d, - 0xf9, 0x99, 0x99, 0x99, 0xbf, 0x92, 0x4f, 0xf2, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x2f, - 0xfb, 0xaf, 0xf1, 0x11, 0x11, 0x11, 0x5f, 0xda, - 0xbf, 0xf9, 0x8e, 0xe0, 0x0, 0x0, 0x0, 0x3f, - 0xc8, 0x9f, 0xf2, 0xc, 0xe0, 0x0, 0x0, 0x0, - 0x3f, 0x70, 0x2f, 0xf6, 0x4d, 0xe0, 0x0, 0x0, - 0x0, 0x3f, 0xa4, 0x6f, 0xfe, 0xef, 0xfb, 0xbb, - 0xbb, 0xbb, 0xcf, 0xfe, 0xef, 0xc2, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x2c, - - /* U+F00B "" */ - 0x58, 0x88, 0x70, 0x28, 0x88, 0x88, 0x88, 0x88, - 0x85, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xd1, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xe1, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x58, 0x88, 0x60, 0x27, 0x88, 0x88, - 0x88, 0x88, 0x85, 0x47, 0x77, 0x50, 0x17, 0x77, - 0x77, 0x77, 0x77, 0x74, 0xff, 0xff, 0xf3, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, - 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x90, 0x9, 0xd2, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x9f, 0xfe, - 0x20, 0x0, 0x8, 0xff, 0xff, 0x90, 0x0, 0xdf, - 0xff, 0xe2, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x0, - 0x2e, 0xff, 0xfe, 0x28, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x2d, 0xb0, 0x0, 0x0, 0x6, 0xe6, 0xd, 0xff, - 0xc0, 0x0, 0x6, 0xff, 0xf3, 0xcf, 0xff, 0xc0, - 0x6, 0xff, 0xff, 0x31, 0xdf, 0xff, 0xc7, 0xff, - 0xff, 0x50, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x6, 0xff, 0xff, 0xdf, - 0xff, 0xc0, 0x6, 0xff, 0xff, 0x51, 0xdf, 0xff, - 0xc0, 0xff, 0xff, 0x50, 0x1, 0xdf, 0xff, 0x58, - 0xff, 0x50, 0x0, 0x1, 0xdf, 0xd0, 0x5, 0x30, - 0x0, 0x0, 0x1, 0x61, 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0xcd, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xe3, 0x3, 0xff, - 0xa0, 0xb, 0xc1, 0x0, 0x0, 0x8, 0xff, 0xb0, - 0x3f, 0xfa, 0x4, 0xff, 0xd1, 0x0, 0x4, 0xff, - 0xf6, 0x3, 0xff, 0xa0, 0x1e, 0xff, 0xa0, 0x0, - 0xdf, 0xf7, 0x0, 0x3f, 0xfa, 0x0, 0x2e, 0xff, - 0x40, 0x3f, 0xfc, 0x0, 0x3, 0xff, 0xa0, 0x0, - 0x6f, 0xfa, 0x8, 0xff, 0x60, 0x0, 0x3f, 0xfa, - 0x0, 0x0, 0xef, 0xf0, 0xaf, 0xf2, 0x0, 0x3, - 0xff, 0xa0, 0x0, 0xb, 0xff, 0x1b, 0xff, 0x10, - 0x0, 0x1f, 0xf8, 0x0, 0x0, 0xbf, 0xf1, 0x9f, - 0xf3, 0x0, 0x0, 0x24, 0x0, 0x0, 0xd, 0xff, - 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xd0, 0x1f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xf8, 0x0, 0x9f, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x9f, 0xfe, 0x10, 0x0, 0xcf, 0xfe, - 0x71, 0x0, 0x4, 0xcf, 0xff, 0x50, 0x0, 0x1, - 0xdf, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x28, 0xce, 0xfd, 0xa5, - 0x0, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x4, 0x66, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x78, 0x17, 0xff, 0xff, - 0xff, 0x71, 0x87, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x3f, 0xff, - 0xff, 0xfe, 0x88, 0xef, 0xff, 0xff, 0xf3, 0x8, - 0xff, 0xff, 0xd0, 0x0, 0xd, 0xff, 0xff, 0x80, - 0x0, 0xaf, 0xff, 0x50, 0x0, 0x5, 0xff, 0xfa, - 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x3, 0xff, - 0xfb, 0x0, 0x1, 0xcf, 0xff, 0x80, 0x0, 0x8, - 0xff, 0xfc, 0x10, 0x3e, 0xff, 0xff, 0xf6, 0x0, - 0x6f, 0xff, 0xff, 0xe3, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xdf, - 0x8e, 0xff, 0xff, 0xff, 0xe8, 0xfd, 0x0, 0x0, - 0x11, 0x1, 0x9f, 0xff, 0xf9, 0x10, 0x11, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2c, 0xee, 0xd2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x8, 0x92, 0x0, 0x6b, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0xe4, 0xa, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0xff, 0xff, 0xf6, 0xaf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xfe, 0x31, 0xcf, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x25, 0x70, - 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x1, 0xbf, 0xfa, - 0x8, 0xff, 0xb0, 0x7f, 0xff, 0x40, 0x0, 0x2, - 0xdf, 0xf8, 0xa, 0xff, 0xff, 0xd2, 0x5f, 0xff, - 0x50, 0x4, 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, - 0xe4, 0x2e, 0xff, 0x70, 0xdf, 0xe3, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x1c, 0xff, 0x13, 0xb1, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, - 0x60, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, - 0x88, 0xbf, 0xff, 0xfe, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x70, 0x3, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x3f, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x70, - 0x3, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf5, 0x0, 0x2f, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x9, 0xaa, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xee, 0xef, 0xff, 0xfe, 0xee, 0xc0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x24, 0x44, 0x44, 0x7, - 0xff, 0x70, 0x44, 0x44, 0x42, 0xff, 0xff, 0xff, - 0xc1, 0x66, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x66, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xc4, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F01C "" */ - 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x41, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x6, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xa0, 0x0, 0x1, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0x50, 0x0, 0xbf, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x10, 0x6f, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xfa, 0xe, 0xff, 0xcc, 0xcc, 0x20, 0x0, 0x0, - 0xbc, 0xcc, 0xef, 0xf2, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xf8, 0x88, 0x8e, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x15, 0x66, 0x40, 0x0, 0x5, - 0xcb, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0x92, - 0x7, 0xff, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x66, 0xff, 0x0, 0x8f, 0xff, 0xa4, 0x12, - 0x5b, 0xff, 0xfd, 0xff, 0x4, 0xff, 0xe4, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xd, 0xff, 0x30, - 0x0, 0x0, 0x45, 0x46, 0xff, 0xff, 0x4f, 0xf7, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x8f, - 0xf1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0x2, 0x10, 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, - 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x67, 0x77, 0x77, 0x75, 0x0, 0x0, - 0x0, 0x6, 0x73, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x3f, 0xf6, 0xff, 0xff, 0xee, 0xfd, - 0x0, 0x0, 0x0, 0xcf, 0xf1, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0xff, 0xff, - 0xfb, 0x20, 0x0, 0x2, 0xbf, 0xfe, 0x10, 0xff, - 0x8d, 0xff, 0xfc, 0xa9, 0xcf, 0xff, 0xe2, 0x0, - 0xff, 0x61, 0x9f, 0xff, 0xff, 0xff, 0xfb, 0x10, - 0x0, 0xff, 0x70, 0x1, 0x7c, 0xee, 0xd9, 0x30, - 0x0, 0x0, 0x56, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x2, - 0xef, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, 0x3, - 0xef, 0xff, 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, 0x7b, 0xbb, 0xdf, - 0xff, 0xf0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, - 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0xbe, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xf0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xf0, 0x7, 0x10, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x3f, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, - 0xf5, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xf7, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, 0xf3, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x70, 0x8b, 0xbb, - 0xdf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x40, 0x0, 0x0, 0x2d, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0x0, 0x0, 0x40, 0x1c, - 0xf4, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, - 0x5f, 0xb0, 0x1e, 0xe1, 0x0, 0x0, 0x3, 0xef, - 0xff, 0x0, 0x0, 0xaf, 0xa0, 0x6f, 0x70, 0xdf, - 0xff, 0xff, 0xff, 0xf0, 0x7, 0x10, 0xbf, 0x30, - 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0x3, 0xfd, - 0x3, 0xf9, 0xa, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x7, 0xf5, 0xe, 0xc0, 0x8f, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x4f, 0x70, 0xdd, 0x7, - 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1d, 0xf3, - 0xf, 0xb0, 0x9f, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0x3, 0xf7, 0x7, 0xf6, 0xc, 0xf0, 0x7b, 0xbb, - 0xdf, 0xff, 0xf0, 0x0, 0x3, 0xfe, 0x12, 0xfa, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x3, 0xff, - 0x40, 0xaf, 0x30, 0x0, 0x0, 0x0, 0xbf, 0xf0, - 0x0, 0x3c, 0x30, 0x6f, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xbe, 0x0, 0x0, 0x0, 0x6f, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x90, 0x0, 0x0, - - /* U+F03E "" */ - 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xa3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xd5, 0x6e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x50, 0x7, - 0xff, 0xff, 0xf5, 0x8, 0xff, 0xff, 0xff, 0xfb, - 0xbf, 0xff, 0xff, 0x50, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xcb, 0xff, 0xf5, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xfc, 0x0, 0xaf, 0x50, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xc0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x74, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - - /* U+F043 "" */ - 0x0, 0x0, 0x6, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, - 0xfb, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x4a, - 0xff, 0xff, 0xff, 0xff, 0x2c, 0xf8, 0x4f, 0xff, - 0xff, 0xff, 0xf0, 0x7f, 0xf2, 0x5c, 0xff, 0xff, - 0xfb, 0x0, 0xef, 0xe5, 0x8, 0xff, 0xff, 0x30, - 0x2, 0xef, 0xff, 0xff, 0xff, 0x50, 0x0, 0x1, - 0xaf, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x3, - 0x31, 0x0, 0x0, 0x0, - - /* U+F048 "" */ - 0x6b, 0x90, 0x0, 0x0, 0x3, 0xa2, 0x9f, 0xe0, - 0x0, 0x0, 0x4f, 0xf9, 0x9f, 0xe0, 0x0, 0x5, - 0xff, 0xfa, 0x9f, 0xe0, 0x0, 0x6f, 0xff, 0xfa, - 0x9f, 0xe0, 0x7, 0xff, 0xff, 0xfa, 0x9f, 0xe0, - 0x8f, 0xff, 0xff, 0xfa, 0x9f, 0xe9, 0xff, 0xff, - 0xff, 0xfa, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xfe, - 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xe1, 0xdf, 0xff, - 0xff, 0xfa, 0x9f, 0xe0, 0x1c, 0xff, 0xff, 0xfa, - 0x9f, 0xe0, 0x0, 0xbf, 0xff, 0xfa, 0x9f, 0xe0, - 0x0, 0xa, 0xff, 0xfa, 0x9f, 0xe0, 0x0, 0x0, - 0x9f, 0xfa, 0x9f, 0xe0, 0x0, 0x0, 0x8, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x3a, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x3a, 0xbb, 0xb9, 0x10, 0x3, 0xab, 0xbb, 0x91, - 0xef, 0xff, 0xff, 0xa0, 0xe, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xff, 0xfb, - 0x7f, 0xff, 0xfe, 0x40, 0x7, 0xff, 0xff, 0xe4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04D "" */ - 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x91, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F051 "" */ - 0x4a, 0x20, 0x0, 0x0, 0xa, 0xb4, 0xbf, 0xe3, - 0x0, 0x0, 0xf, 0xf8, 0xcf, 0xff, 0x40, 0x0, - 0xf, 0xf8, 0xcf, 0xff, 0xf5, 0x0, 0xf, 0xf8, - 0xcf, 0xff, 0xff, 0x60, 0xf, 0xf8, 0xcf, 0xff, - 0xff, 0xf7, 0xf, 0xf8, 0xcf, 0xff, 0xff, 0xff, - 0x9f, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, - 0xff, 0xff, 0xdf, 0xf8, 0xcf, 0xff, 0xff, 0xfc, - 0x1f, 0xf8, 0xcf, 0xff, 0xff, 0xb0, 0xf, 0xf8, - 0xcf, 0xff, 0xfa, 0x0, 0xf, 0xf8, 0xcf, 0xff, - 0x80, 0x0, 0xf, 0xf8, 0xbf, 0xf7, 0x0, 0x0, - 0xf, 0xf8, 0x7f, 0x60, 0x0, 0x0, 0xf, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x2, 0xca, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x42, 0x0, 0x3, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x10, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xd0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x20, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, - 0x9f, 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, 0x50, - 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x9f, - 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0x20, 0x0, 0x0, 0x0, 0x3c, 0x60, - - /* U+F054 "" */ - 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xc1, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0x20, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, - 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, - 0x50, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, - 0x9f, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x3d, 0x50, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x39, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, - 0x36, 0x77, 0x77, 0xef, 0xfc, 0x77, 0x77, 0x61, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, - 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, - - /* U+F068 "" */ - 0x36, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x3, 0x68, 0x87, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, - 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x4, 0xef, - 0xfd, 0x63, 0x25, 0xbf, 0xff, 0x70, 0x0, 0x0, - 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xa0, 0x0, 0x6, 0xff, 0xfd, 0x0, 0x8, 0xfc, - 0x20, 0x9f, 0xff, 0xa0, 0x2, 0xff, 0xff, 0x50, - 0x0, 0x8f, 0xfe, 0x12, 0xff, 0xff, 0x60, 0xcf, - 0xff, 0xf2, 0x16, 0x7f, 0xff, 0xf5, 0xe, 0xff, - 0xfe, 0x1e, 0xff, 0xff, 0x12, 0xff, 0xff, 0xff, - 0x70, 0xdf, 0xff, 0xf2, 0x6f, 0xff, 0xf3, 0xe, - 0xff, 0xff, 0xf3, 0xf, 0xff, 0xfb, 0x0, 0xbf, - 0xff, 0x90, 0x4f, 0xff, 0xf8, 0x5, 0xff, 0xfe, - 0x10, 0x1, 0xdf, 0xff, 0x40, 0x28, 0x84, 0x1, - 0xef, 0xff, 0x30, 0x0, 0x1, 0xbf, 0xff, 0x60, - 0x0, 0x4, 0xef, 0xfd, 0x30, 0x0, 0x0, 0x0, - 0x6e, 0xff, 0xfb, 0xbe, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x71, - 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x4a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x60, 0x0, 0x15, 0x78, 0x74, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xa6, 0xdf, 0xff, - 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xe8, 0x32, 0x5b, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf6, 0x0, 0x10, - 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xf8, 0x7f, 0xd3, 0x9, 0xff, 0xfb, 0x0, - 0x0, 0x1e, 0x70, 0x1, 0xbf, 0xfe, 0xff, 0xf2, - 0x1f, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xa0, 0x0, - 0x8f, 0xff, 0xff, 0x70, 0xdf, 0xff, 0xf1, 0x0, - 0xcf, 0xff, 0xd1, 0x0, 0x5f, 0xff, 0xf9, 0xc, - 0xff, 0xff, 0x30, 0x5, 0xff, 0xff, 0x60, 0x0, - 0x2d, 0xff, 0xb0, 0xef, 0xff, 0xb0, 0x0, 0xa, - 0xff, 0xfc, 0x0, 0x0, 0xa, 0xff, 0xef, 0xff, - 0xe1, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf8, 0x10, 0x0, 0x3, 0xef, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xcb, 0x80, - 0x1, 0xbf, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x5a, 0xdf, 0xfe, 0x70, 0x0, 0x8f, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0xcd, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x33, - 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf9, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, 0x6f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, - 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xfc, 0x0, 0x8f, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xfd, 0x0, 0x9f, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xcb, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x8f, 0xff, 0xff, - 0xfc, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, 0xff, - 0xff, 0xfe, 0x42, 0xcf, 0xff, 0xff, 0xff, 0xe0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x23, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xf9, 0x0, 0x12, 0x22, 0x10, 0x0, 0x0, 0x1, - 0x29, 0xff, 0x90, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfe, 0x20, - 0x5, 0xff, 0xff, 0xff, 0xfd, 0x9a, 0xad, 0xff, - 0xd0, 0x5f, 0xff, 0xbd, 0xff, 0xe2, 0x0, 0x0, - 0xcf, 0x44, 0xff, 0xf9, 0x8, 0xfe, 0x20, 0x0, - 0x0, 0x4, 0x4f, 0xff, 0x90, 0x4, 0xd2, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa1, 0x91, 0x6, - 0xf6, 0x0, 0x0, 0x2, 0xef, 0xfb, 0xc, 0xfc, - 0x8, 0xff, 0x60, 0xef, 0xff, 0xff, 0xb0, 0x1d, - 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xfc, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xfe, 0xdd, 0xdd, 0xb0, - 0x0, 0x0, 0x2d, 0xde, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xe3, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfa, 0xcf, 0xfe, 0x30, 0x0, - 0x0, 0x6f, 0xff, 0x90, 0xc, 0xff, 0xe3, 0x0, - 0x6, 0xff, 0xf9, 0x0, 0x0, 0xcf, 0xfe, 0x30, - 0x5f, 0xff, 0x90, 0x0, 0x0, 0xc, 0xff, 0xe2, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf6, - 0x1b, 0x80, 0x0, 0x0, 0x0, 0x0, 0xb, 0x90, - - /* U+F078 "" */ - 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, - 0x6f, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf2, - 0xaf, 0xfe, 0x20, 0x0, 0x0, 0x5, 0xff, 0xf6, - 0x1c, 0xff, 0xe3, 0x0, 0x0, 0x5f, 0xff, 0x90, - 0x1, 0xcf, 0xfe, 0x30, 0x5, 0xff, 0xf9, 0x0, - 0x0, 0x1c, 0xff, 0xe3, 0x5f, 0xff, 0x90, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1b, 0x90, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xa0, - 0x0, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xfa, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xa0, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0xe, 0xfd, 0xef, 0xcf, 0xf8, 0x0, 0x0, 0x0, - 0x5, 0xfe, 0x0, 0x0, 0xb, 0xe2, 0xdf, 0x67, - 0xf5, 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0x0, 0x4, - 0x15, 0xfe, 0x3, 0x20, 0x0, 0x0, 0xdf, 0x60, - 0x0, 0x0, 0x0, 0x6f, 0xd6, 0xfe, 0x4f, 0xf1, - 0x0, 0x0, 0xdf, 0x94, 0x44, 0x44, 0x41, 0x3f, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0x24, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, - - /* U+F07B "" */ - 0x17, 0x88, 0x88, 0x84, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x44, - 0x44, 0x44, 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x11, 0x2f, 0xff, 0xf7, 0x11, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x24, 0x44, 0x42, 0x1f, - 0xff, 0xf6, 0x24, 0x44, 0x42, 0xff, 0xff, 0xfc, - 0x8, 0xbb, 0xa2, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa5, 0x55, 0x5a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xc4, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb8, - 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, - 0x0, 0x0, 0x4, 0xa5, 0x0, 0x0, 0xaf, 0xff, - 0xd0, 0x0, 0x0, 0x7d, 0xff, 0xf4, 0x2, 0xcf, - 0xff, 0xe2, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xe9, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x83, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x23, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C4 "" */ - 0x0, 0x35, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xfa, 0x0, 0x0, 0x1, 0x9c, 0xa1, - 0xaf, 0xfe, 0xff, 0x60, 0x0, 0x2e, 0xff, 0xf9, - 0xef, 0x60, 0xaf, 0xb0, 0x3, 0xef, 0xff, 0xb0, - 0xef, 0x92, 0xcf, 0x90, 0x3e, 0xff, 0xfa, 0x0, - 0x7f, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xa0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x36, 0xef, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0xaf, 0xfe, 0xff, 0xc2, 0xdf, 0xff, 0xd1, 0x0, - 0xef, 0x60, 0xaf, 0xa0, 0x1c, 0xff, 0xfd, 0x20, - 0xef, 0x92, 0xcf, 0xa0, 0x0, 0xcf, 0xff, 0xe2, - 0x7f, 0xff, 0xff, 0x40, 0x0, 0xb, 0xff, 0xf9, - 0x8, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x58, 0x50, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf1, 0x68, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf1, 0x7f, 0x80, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf1, 0x7f, 0xf8, - 0x36, 0x62, 0xaf, 0xff, 0xff, 0xf1, 0x36, 0x66, - 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xf6, 0x22, 0x22, - 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xf7, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x14, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x5, 0x66, 0x66, 0x66, 0x66, 0x64, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0xff, 0xed, 0xdd, 0xdd, 0xdd, 0xef, 0xf9, 0x0, - 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0x90, - 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, - 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf9, - 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xc5, 0x7f, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xfe, 0x0, 0x5, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xfa, 0x0, 0x1, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xfd, 0x0, 0x4, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0x93, 0x4d, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, - - /* U+F0C9 "" */ - 0x79, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x95, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0E0 "" */ - 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x30, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa1, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x3d, 0xfe, 0x42, - 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x26, 0xff, 0xff, - 0xf9, 0x19, 0xff, 0xff, 0xff, 0x91, 0xbf, 0xff, - 0xff, 0xff, 0xd3, 0x5f, 0xff, 0xe5, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x71, 0x99, 0x17, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x77, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - - /* U+F0E7 "" */ - 0x0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xa5, 0x55, 0x40, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x1, 0x22, 0x23, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x8d, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x8b, 0xbc, 0xfa, 0xfd, 0xbb, 0x90, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0xcf, 0xff, 0xf1, 0x0, 0x0, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x95, 0xff, 0xff, 0xf1, 0x79, 0x0, - 0xff, 0xff, 0x88, 0xff, 0xff, 0xf1, 0x7f, 0xb0, - 0xff, 0xff, 0x88, 0xff, 0xff, 0xf1, 0x7f, 0xfa, - 0xff, 0xff, 0x88, 0xff, 0xff, 0xf2, 0x2, 0x21, - 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xdd, 0xdc, - 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x7a, 0xaa, 0x58, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xcf, 0xfa, 0x40, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x41, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, - 0xf4, 0x4, 0xd0, 0x2f, 0x0, 0xf3, 0x3, 0xf0, - 0xf, 0xf4, 0xff, 0x40, 0x5d, 0x2, 0xf0, 0xf, - 0x40, 0x4f, 0x0, 0xff, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0x22, 0xb7, 0x29, 0xa2, 0x4f, 0x42, 0xcf, - 0xff, 0x4f, 0xff, 0xf0, 0xa, 0x60, 0x79, 0x2, - 0xf2, 0xb, 0xff, 0xf4, 0xff, 0xff, 0xdd, 0xfe, - 0xdf, 0xfd, 0xef, 0xed, 0xff, 0xff, 0x4f, 0xf8, - 0x48, 0xe4, 0x44, 0x44, 0x44, 0x47, 0xf4, 0x5f, - 0xf4, 0xff, 0x40, 0x4d, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0x0, 0xff, 0x4f, 0xf7, 0x48, 0xe4, 0x44, - 0x44, 0x44, 0x47, 0xf4, 0x4f, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x8b, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xaf, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x17, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x29, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x56, - 0x66, 0x66, 0x7f, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+F15B "" */ - 0x58, 0x88, 0x88, 0x87, 0x6, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xfe, 0xf, 0x90, 0x0, 0xff, 0xff, - 0xff, 0xfe, 0xf, 0xf9, 0x0, 0xff, 0xff, 0xff, - 0xfe, 0xf, 0xff, 0x90, 0xff, 0xff, 0xff, 0xfe, - 0xf, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0x32, - 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x14, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x30, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, - 0x89, 0xa9, 0x74, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x29, 0xef, 0xff, 0xff, 0xff, 0xff, 0xc6, - 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x6, 0xff, - 0xff, 0xfc, 0x75, 0x43, 0x46, 0x9e, 0xff, 0xff, - 0xb1, 0x8, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xcf, 0xff, 0xe2, 0xcf, 0xfa, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0x40, 0xb6, 0x0, 0x0, 0x59, 0xde, 0xfe, 0xc7, - 0x20, 0x0, 0x1b, 0x50, 0x0, 0x0, 0x5, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xfe, 0xde, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfc, 0x40, - 0x0, 0x2, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x1, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x4a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, - 0xff, 0x5f, 0xf4, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x3f, 0xf5, 0xff, 0x4a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xef, - 0x5f, 0xf4, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xf5, 0xff, 0x45, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0xf, 0xff, 0x5f, - 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, - - /* U+F241 "" */ - 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x4d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0xf, - 0xff, 0x5f, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x4d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xef, - 0x5f, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x30, 0x0, 0xf, 0xff, 0x5f, - 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, - - /* U+F242 "" */ - 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x4c, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x5f, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x4c, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, - 0x5f, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x46, 0x88, 0x88, - 0x88, 0x80, 0x0, 0x0, 0x0, 0xf, 0xff, 0x5f, - 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, - - /* U+F243 "" */ - 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x49, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x5f, 0xf4, 0x9f, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x49, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0x5f, 0xf4, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x44, 0x88, 0x87, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x5f, - 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, - - /* U+F244 "" */ - 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x5f, - 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x26, 0x9f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xef, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x80, - 0x2e, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x6, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xe3, 0x0, 0xd7, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xa1, 0x0, 0xcf, 0xff, 0xd4, - 0x9f, 0x55, 0x55, 0x55, 0x55, 0x55, 0x7f, 0xf7, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xa0, 0x0, - 0xb, 0xb0, 0x0, 0x0, 0x0, 0x3f, 0xb2, 0x0, - 0x9c, 0x90, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, - 0x1, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbb, 0x2, 0xbb, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xf9, 0x9f, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xbd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x1, 0x7b, 0xdd, 0xb8, 0x20, 0x0, 0x0, - 0x5f, 0xff, 0xdf, 0xff, 0xf6, 0x0, 0x4, 0xff, - 0xff, 0x68, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, - 0x60, 0x9f, 0xff, 0xd0, 0x4f, 0xff, 0xff, 0x60, - 0x9, 0xff, 0xf3, 0x8f, 0xf6, 0xbf, 0x61, 0xc0, - 0x9f, 0xf7, 0xbf, 0xf6, 0xb, 0x60, 0xe2, 0x5f, - 0xf9, 0xdf, 0xff, 0x50, 0x20, 0x33, 0xff, 0xfb, - 0xef, 0xff, 0xf5, 0x0, 0x2e, 0xff, 0xfc, 0xef, - 0xff, 0xfc, 0x0, 0x7f, 0xff, 0xfc, 0xdf, 0xff, - 0xd1, 0x0, 0x9, 0xff, 0xfc, 0xcf, 0xfc, 0x14, - 0x50, 0x90, 0xaf, 0xfb, 0xaf, 0xf2, 0x4f, 0x60, - 0xf3, 0x2f, 0xf9, 0x6f, 0xfd, 0xff, 0x70, 0x52, - 0xef, 0xf6, 0x1f, 0xff, 0xff, 0x70, 0x2e, 0xff, - 0xf1, 0x9, 0xff, 0xff, 0x72, 0xef, 0xff, 0x90, - 0x0, 0xbf, 0xff, 0xae, 0xff, 0xfd, 0x10, 0x0, - 0x5, 0xcf, 0xff, 0xfd, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x0, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x5, 0x88, 0x88, 0x30, 0x0, 0x0, - 0x56, 0x66, 0x7f, 0xff, 0xff, 0xe6, 0x66, 0x63, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, - 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0xe, 0xff, 0x1f, 0xf6, 0xaf, 0xc4, 0xff, 0xa0, - 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, - 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, - 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, - 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, - 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, - 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, - 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, - 0xe, 0xff, 0x1f, 0xf6, 0xaf, 0xc4, 0xff, 0xa0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x31, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x34, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0x44, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x44, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0x44, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0x41, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x31, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x57, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x72, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0xbf, 0xff, 0xff, 0xf8, - 0xaf, 0xff, 0xa8, 0xff, 0xff, 0xf8, 0x0, 0xbf, - 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xa0, 0xa, 0xff, - 0xff, 0x80, 0xbf, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x60, 0x3, 0xff, 0xff, 0xf8, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x3, 0xff, 0xff, 0xff, - 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x9f, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, - 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x3, 0xe3, 0x0, - 0xbf, 0xff, 0xf8, 0x0, 0x4f, 0xff, 0xff, 0xfe, - 0x23, 0xff, 0xf3, 0x2e, 0xff, 0xff, 0x80, 0x0, - 0x4f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, - - /* U+F7C2 "" */ - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xfe, 0x60, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xcf, - 0x47, 0xf4, 0xd8, 0x4f, 0xf5, 0xc, 0xff, 0x3, - 0xe0, 0xc5, 0xe, 0xf5, 0xcf, 0xff, 0x3, 0xe0, - 0xc5, 0xe, 0xf5, 0xff, 0xff, 0x24, 0xe2, 0xc6, - 0x2e, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1, 0x34, - 0x44, 0x44, 0x44, 0x42, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0x10, 0x0, 0x3e, 0x90, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x4f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, - 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x3e, 0xff, 0xfe, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 0x0, 0x2e, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 77, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 77, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 20, .adv_w = 113, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 35, .adv_w = 202, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 120, .adv_w = 179, .box_w = 11, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 219, .adv_w = 243, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 317, .adv_w = 198, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 408, .adv_w = 60, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 414, .adv_w = 97, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 459, .adv_w = 97, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 504, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 529, .adv_w = 168, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 570, .adv_w = 65, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 582, .adv_w = 110, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 587, .adv_w = 65, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 593, .adv_w = 101, .box_w = 8, .box_h = 18, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 665, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 743, .adv_w = 107, .box_w = 5, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 776, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 841, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 906, .adv_w = 193, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 984, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1049, .adv_w = 178, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1121, .adv_w = 172, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1193, .adv_w = 185, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1265, .adv_w = 178, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1337, .adv_w = 65, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1357, .adv_w = 65, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1383, .adv_w = 168, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 1424, .adv_w = 168, .box_w = 9, .box_h = 7, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 1456, .adv_w = 168, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 1497, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1562, .adv_w = 298, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 1715, .adv_w = 211, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1813, .adv_w = 218, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1891, .adv_w = 208, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1976, .adv_w = 238, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2061, .adv_w = 193, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2133, .adv_w = 183, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2198, .adv_w = 222, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2283, .adv_w = 234, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2361, .adv_w = 89, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2381, .adv_w = 148, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2440, .adv_w = 207, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2518, .adv_w = 171, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2583, .adv_w = 275, .box_w = 15, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2681, .adv_w = 234, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2759, .adv_w = 242, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2857, .adv_w = 208, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2935, .adv_w = 242, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3055, .adv_w = 209, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3133, .adv_w = 179, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3205, .adv_w = 169, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3277, .adv_w = 228, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3355, .adv_w = 205, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3446, .adv_w = 324, .box_w = 20, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3576, .adv_w = 194, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3654, .adv_w = 186, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3739, .adv_w = 189, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3817, .adv_w = 96, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 3862, .adv_w = 101, .box_w = 8, .box_h = 18, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 3934, .adv_w = 96, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 3979, .adv_w = 168, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 4015, .adv_w = 144, .box_w = 9, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4024, .adv_w = 173, .box_w = 5, .box_h = 3, .ofs_x = 2, .ofs_y = 11}, - {.bitmap_index = 4032, .adv_w = 172, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4082, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4159, .adv_w = 164, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4209, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4286, .adv_w = 176, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4341, .adv_w = 102, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4390, .adv_w = 199, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 4467, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4537, .adv_w = 80, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4558, .adv_w = 82, .box_w = 6, .box_h = 18, .ofs_x = -2, .ofs_y = -4}, - {.bitmap_index = 4612, .adv_w = 177, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4689, .adv_w = 80, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4710, .adv_w = 304, .box_w = 17, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4795, .adv_w = 196, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4845, .adv_w = 183, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4900, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 4977, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 5054, .adv_w = 118, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5084, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5129, .adv_w = 119, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5171, .adv_w = 195, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5221, .adv_w = 161, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 5281, .adv_w = 259, .box_w = 17, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5366, .adv_w = 159, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5416, .adv_w = 161, .box_w = 12, .box_h = 14, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 5500, .adv_w = 150, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5545, .adv_w = 101, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 5590, .adv_w = 86, .box_w = 3, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 5617, .adv_w = 101, .box_w = 6, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 5671, .adv_w = 168, .box_w = 9, .box_h = 5, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 5694, .adv_w = 121, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 5719, .adv_w = 90, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 5727, .adv_w = 288, .box_w = 19, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 5908, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6034, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6187, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6313, .adv_w = 198, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6398, .adv_w = 288, .box_w = 19, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6569, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 6740, .adv_w = 324, .box_w = 21, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6919, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7090, .adv_w = 324, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7237, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7408, .adv_w = 144, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7476, .adv_w = 216, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7581, .adv_w = 324, .box_w = 21, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7770, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7896, .adv_w = 198, .box_w = 13, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 8020, .adv_w = 252, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 8122, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 8274, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8410, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8546, .adv_w = 252, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 8648, .adv_w = 252, .box_w = 18, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 8801, .adv_w = 180, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8889, .adv_w = 180, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8977, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9113, .adv_w = 252, .box_w = 16, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 9145, .adv_w = 324, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9292, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9511, .adv_w = 324, .box_w = 22, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 9720, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9873, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 9953, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 10033, .adv_w = 360, .box_w = 24, .box_h = 15, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 10213, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10339, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10510, .adv_w = 288, .box_w = 19, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 10691, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10827, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10979, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11115, .adv_w = 252, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 11235, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11361, .adv_w = 180, .box_w = 13, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 11485, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11637, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11789, .adv_w = 324, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11936, .adv_w = 288, .box_w = 20, .box_h = 20, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 12136, .adv_w = 216, .box_w = 14, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12269, .adv_w = 360, .box_w = 23, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12476, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 12614, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 12752, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 12890, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 13028, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 13166, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 13339, .adv_w = 252, .box_w = 14, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 13472, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 13624, .adv_w = 288, .box_w = 19, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 13805, .adv_w = 360, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13966, .adv_w = 216, .box_w = 14, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14099, .adv_w = 290, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 1} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 3, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 13, 0, 8, -6, 0, 0, - 0, 0, -16, -17, 2, 14, 6, 5, - -12, 2, 14, 1, 12, 3, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 2, -2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 0, -9, 0, 0, 0, 0, - 0, -6, 5, 6, 0, 0, -3, 0, - -2, 3, 0, -3, 0, -3, -1, -6, - 0, 0, 0, 0, -3, 0, 0, -4, - -4, 0, 0, -3, 0, -6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - -3, 0, -4, 0, -8, 0, -35, 0, - 0, -6, 0, 6, 9, 0, 0, -6, - 3, 3, 10, 6, -5, 6, 0, 0, - -16, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -8, -3, -14, 0, -12, - -2, 0, 0, 0, 0, 1, 11, 0, - -9, -2, -1, 1, 0, -5, 0, 0, - -2, -21, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -23, -2, 11, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 10, - 0, 3, 0, 0, -6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 11, 2, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, - 6, 3, 9, -3, 0, 0, 6, -3, - -10, -39, 2, 8, 6, 1, -4, 0, - 10, 0, 9, 0, 9, 0, -27, 0, - -3, 9, 0, 10, -3, 6, 3, 0, - 0, 1, -3, 0, 0, -5, 23, 0, - 23, 0, 9, 0, 12, 4, 5, 9, - 0, 0, 0, -11, 0, 0, 0, 0, - 1, -2, 0, 2, -5, -4, -6, 2, - 0, -3, 0, 0, 0, -12, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, -16, 0, -18, 0, 0, 0, - 0, -2, 0, 29, -3, -4, 3, 3, - -3, 0, -4, 3, 0, 0, -15, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -28, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -18, 0, 17, 0, 0, -11, 0, - 10, 0, -20, -28, -20, -6, 9, 0, - 0, -19, 0, 3, -7, 0, -4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, -35, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 14, 0, 2, 0, 0, 0, - 0, 0, 2, 2, -3, -6, 0, -1, - -1, -3, 0, 0, -2, 0, 0, 0, - -6, 0, -2, 0, -7, -6, 0, -7, - -10, -10, -5, 0, -6, 0, -6, 0, - 0, 0, 0, -2, 0, 0, 3, 0, - 2, -3, 0, 1, 0, 0, 0, 3, - -2, 0, 0, 0, -2, 3, 3, -1, - 0, 0, 0, -5, 0, -1, 0, 0, - 0, 0, 0, 1, 0, 4, -2, 0, - -3, 0, -5, 0, 0, -2, 0, 9, - 0, 0, -3, 0, 0, 0, 0, 0, - -1, 1, -2, -2, 0, 0, -3, 0, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, -1, 0, -3, -3, 0, - 0, 0, 0, 0, 1, 0, 0, -2, - 0, -3, -3, -3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -2, 0, 0, - 0, 0, -2, -4, 0, -4, 0, -9, - -2, -9, 6, 0, 0, -6, 3, 6, - 8, 0, -7, -1, -3, 0, -1, -14, - 3, -2, 2, -15, 3, 0, 0, 1, - -15, 0, -15, -2, -25, -2, 0, -14, - 0, 6, 8, 0, 4, 0, 0, 0, - 0, 1, 0, -5, -4, 0, -9, 0, - 0, 0, -3, 0, 0, 0, -3, 0, - 0, 0, 0, 0, -1, -1, 0, -1, - -4, 0, 0, 0, 0, 0, 0, 0, - -3, -3, 0, -2, -3, -2, 0, 0, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, -2, 0, -3, - 0, -2, 0, -6, 3, 0, 0, -3, - 1, 3, 3, 0, 0, 0, 0, 0, - 0, -2, 0, 0, 0, 0, 0, 2, - 0, 0, -3, 0, -3, -2, -3, 0, - 0, 0, 0, 0, 0, 0, 2, 0, - -2, 0, 0, 0, 0, -3, -4, 0, - -5, 0, 9, -2, 1, -9, 0, 0, - 8, -14, -15, -12, -6, 3, 0, -2, - -19, -5, 0, -5, 0, -6, 4, -5, - -18, 0, -8, 0, 0, 1, -1, 2, - -2, 0, 3, 0, -9, -11, 0, -14, - -7, -6, -7, -9, -3, -8, -1, -5, - -8, 2, 0, 1, 0, -3, 0, 0, - 0, 2, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - 0, -1, 0, -1, -3, 0, -5, -6, - -6, -1, 0, -9, 0, 0, 0, 0, - 0, 0, -2, 0, 0, 0, 0, 1, - -2, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 14, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, 0, 0, - -5, 0, 0, 0, 0, -14, -9, 0, - 0, 0, -4, -14, 0, 0, -3, 3, - 0, -8, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, 0, -5, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, -5, 0, - 0, 0, 0, 3, 0, 2, -6, -6, - 0, -3, -3, -3, 0, 0, 0, 0, - 0, 0, -9, 0, -3, 0, -4, -3, - 0, -6, -7, -9, -2, 0, -6, 0, - -9, 0, 0, 0, 0, 23, 0, 0, - 1, 0, 0, -4, 0, 3, 0, -12, - 0, 0, 0, 0, 0, -27, -5, 10, - 9, -2, -12, 0, 3, -4, 0, -14, - -1, -4, 3, -20, -3, 4, 0, 4, - -10, -4, -11, -10, -12, 0, 0, -17, - 0, 16, 0, 0, -1, 0, 0, 0, - -1, -1, -3, -8, -10, -1, -27, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -3, 0, -1, -3, -4, 0, 0, - -6, 0, -3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, -6, 0, 0, 6, - -1, 4, 0, -6, 3, -2, -1, -7, - -3, 0, -4, -3, -2, 0, -4, -5, - 0, 0, -2, -1, -2, -5, -3, 0, - 0, -3, 0, 3, -2, 0, -6, 0, - 0, 0, -6, 0, -5, 0, -5, -5, - 3, 0, 0, 0, 0, 0, 0, 0, - 0, -6, 3, 0, -4, 0, -2, -3, - -9, -2, -2, -2, -1, -2, -3, -1, - 0, 0, 0, 0, 0, -3, -2, -2, - 0, 0, 0, 0, 3, -2, 0, -2, - 0, 0, 0, -2, -3, -2, -3, -3, - -3, 0, 2, 12, -1, 0, -8, 0, - -2, 6, 0, -3, -12, -4, 4, 0, - 0, -14, -5, 3, -5, 2, 0, -2, - -2, -9, 0, -4, 1, 0, 0, -5, - 0, 0, 0, 3, 3, -6, -5, 0, - -5, -3, -4, -3, -3, 0, -5, 1, - -5, -5, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 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, - -2, 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, -2, -3, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, 0, -4, - 0, 0, -3, -3, 0, 0, 0, 0, - -3, 0, 0, 0, 0, -1, 0, 0, - 0, 0, 0, -2, 0, 0, 0, 0, - -4, 0, -6, 0, 0, 0, -10, 0, - 2, -6, 6, 1, -2, -14, 0, 0, - -6, -3, 0, -12, -7, -8, 0, 0, - -12, -3, -12, -11, -14, 0, -7, 0, - 2, 19, -4, 0, -7, -3, -1, -3, - -5, -8, -5, -11, -12, -7, -3, 0, - 0, -2, 0, 1, 0, 0, -20, -3, - 9, 6, -6, -11, 0, 1, -9, 0, - -14, -2, -3, 6, -26, -4, 1, 0, - 0, -19, -3, -15, -3, -21, 0, 0, - -20, 0, 17, 1, 0, -2, 0, 0, - 0, 0, -1, -2, -11, -2, 0, -19, - 0, 0, 0, 0, -9, 0, -3, 0, - -1, -8, -14, 0, 0, -1, -4, -9, - -3, 0, -2, 0, 0, 0, 0, -13, - -3, -10, -9, -2, -5, -7, -3, -5, - 0, -6, -3, -10, -4, 0, -3, -5, - -3, -5, 0, 1, 0, -2, -10, 0, - 6, 0, -5, 0, 0, 0, 0, 3, - 0, 2, -6, 12, 0, -3, -3, -3, - 0, 0, 0, 0, 0, 0, -9, 0, - -3, 0, -4, -3, 0, -6, -7, -9, - -2, 0, -6, 2, 12, 0, 0, 0, - 0, 23, 0, 0, 1, 0, 0, -4, - 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -2, -6, 0, 0, 0, 0, 0, -1, - 0, 0, 0, -3, -3, 0, 0, -6, - -3, 0, 0, -6, 0, 5, -1, 0, - 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 4, 6, 2, -3, 0, -9, - -5, 0, 9, -10, -9, -6, -6, 12, - 5, 3, -25, -2, 6, -3, 0, -3, - 3, -3, -10, 0, -3, 3, -4, -2, - -9, -2, 0, 0, 9, 6, 0, -8, - 0, -16, -4, 8, -4, -11, 1, -4, - -10, -10, -3, 12, 3, 0, -4, 0, - -8, 0, 2, 10, -7, -11, -12, -7, - 9, 0, 1, -21, -2, 3, -5, -2, - -7, 0, -6, -11, -4, -4, -2, 0, - 0, -7, -6, -3, 0, 9, 7, -3, - -16, 0, -16, -4, 0, -10, -17, -1, - -9, -5, -10, -8, 8, 0, 0, -4, - 0, -6, -3, 0, -3, -5, 0, 5, - -10, 3, 0, 0, -15, 0, -3, -6, - -5, -2, -9, -7, -10, -7, 0, -9, - -3, -7, -5, -9, -3, 0, 0, 1, - 14, -5, 0, -9, -3, 0, -3, -6, - -7, -8, -8, -11, -4, -6, 6, 0, - -4, 0, -14, -3, 2, 6, -9, -11, - -6, -10, 10, -3, 1, -27, -5, 6, - -6, -5, -11, 0, -9, -12, -3, -3, - -2, -3, -6, -9, -1, 0, 0, 9, - 8, -2, -19, 0, -17, -7, 7, -11, - -20, -6, -10, -12, -14, -10, 6, 0, - 0, 0, 0, -3, 0, 0, 3, -3, - 6, 2, -5, 6, 0, 0, -9, -1, - 0, -1, 0, 1, 1, -2, 0, 0, - 0, 0, 0, 0, -3, 0, 0, 0, - 0, 2, 9, 1, 0, -3, 0, 0, - 0, 0, -2, -2, -3, 0, 0, 0, - 1, 2, 0, 0, 0, 0, 2, 0, - -2, 0, 11, 0, 5, 1, 1, -4, - 0, 6, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 0, 8, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -17, 0, -3, 5, 0, 9, - 0, 0, 29, 3, -6, -6, 3, 3, - -2, 1, -14, 0, 0, 14, -17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -20, 11, 40, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -17, 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, -5, 0, 0, -5, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, -8, 0, - 0, 1, 0, 0, 3, 37, -6, -2, - 9, 8, -8, 3, 0, 0, 3, 3, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -37, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -8, - 0, 0, 0, -8, 0, 0, 0, 0, - -6, -1, 0, 0, 0, -6, 0, -3, - 0, -14, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -19, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, -3, 0, 0, -5, 0, -4, 0, - -8, 0, 0, 0, -5, 3, -3, 0, - 0, -8, -3, -7, 0, 0, -8, 0, - -3, 0, -14, 0, -3, 0, 0, -23, - -5, -12, -3, -10, 0, 0, -19, 0, - -8, -1, 0, 0, 0, 0, 0, 0, - 0, 0, -4, -5, -2, -5, 0, 0, - 0, 0, -6, 0, -6, 4, -3, 6, - 0, -2, -7, -2, -5, -5, 0, -3, - -1, -2, 2, -8, -1, 0, 0, 0, - -25, -2, -4, 0, -6, 0, -2, -14, - -3, 0, 0, -2, -2, 0, 0, 0, - 0, 2, 0, -2, -5, -2, 5, 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, 4, 0, 0, 0, 0, 0, - 0, -6, 0, -2, 0, 0, 0, -6, - 3, 0, 0, 0, -8, -3, -6, 0, - 0, -8, 0, -3, 0, -14, 0, 0, - 0, 0, -28, 0, -6, -11, -14, 0, - 0, -19, 0, -2, -4, 0, 0, 0, - 0, 0, 0, 0, 0, -3, -4, -1, - -4, 1, 0, 0, 5, -4, 0, 9, - 14, -3, -3, -9, 3, 14, 5, 6, - -8, 3, 12, 3, 8, 6, 8, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 14, -5, -3, 0, -2, - 23, 12, 23, 0, 0, 0, 3, 0, - 0, 11, 0, 0, -5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2, 0, - 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 0, -24, -3, -2, -12, - -14, 0, 0, -19, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, -24, -3, -2, - -12, -14, 0, 0, -12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -2, 0, 0, 0, -7, 3, 0, -3, - 2, 5, 3, -9, 0, -1, -2, 3, - 0, 2, 0, 0, 0, 0, -7, 0, - -3, -2, -6, 0, -3, -12, 0, 18, - -3, 0, -6, -2, 0, -2, -5, 0, - -3, -8, -6, -3, 0, 0, 0, -5, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -2, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 0, -24, - -3, -2, -12, -14, 0, 0, -19, 0, - 0, 0, 0, 0, 0, 14, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -5, 0, -9, -3, -3, 9, -3, -3, - -12, 1, -2, 1, -2, -8, 1, 6, - 1, 2, 1, 2, -7, -12, -3, 0, - -11, -5, -8, -12, -11, 0, -5, -6, - -3, -4, -2, -2, -3, -2, 0, -2, - -1, 4, 0, 4, -2, 0, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -2, -3, -3, 0, 0, - -8, 0, -1, 0, -5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -17, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, -3, 0, -4, - 0, 0, 0, 0, -2, 0, 0, -5, - -3, 3, 0, -5, -5, -2, 0, -8, - -2, -6, -2, -3, 0, -5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -19, 0, 9, 0, 0, -5, 0, - 0, 0, 0, -4, 0, -3, 0, 0, - -1, 0, 0, -2, 0, -7, 0, 0, - 12, -4, -10, -9, 2, 3, 3, -1, - -8, 2, 4, 2, 9, 2, 10, -2, - -8, 0, 0, -12, 0, 0, -9, -8, - 0, 0, -6, 0, -4, -5, 0, -4, - 0, -4, 0, -2, 4, 0, -2, -9, - -3, 11, 0, 0, -3, 0, -6, 0, - 0, 4, -7, 0, 3, -3, 2, 0, - 0, -10, 0, -2, -1, 0, -3, 3, - -2, 0, 0, 0, -12, -3, -6, 0, - -9, 0, 0, -14, 0, 11, -3, 0, - -5, 0, 2, 0, -3, 0, -3, -9, - 0, -3, 3, 0, 0, 0, 0, -2, - 0, 0, 3, -4, 1, 0, 0, -3, - -2, 0, -3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -18, 0, 6, 0, - 0, -2, 0, 0, 0, 0, 1, 0, - -3, -3, 0, 0, 0, 6, 0, 7, - 0, 0, 0, 0, 0, -18, -16, 1, - 12, 9, 5, -12, 2, 12, 0, 11, - 0, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_18 = { -#else -lv_font_t lv_font_montserrat_18 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 21, /*The maximum line height required by the font*/ - .base_line = 4, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -1, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_18*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_20.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_20.c deleted file mode 100644 index de7e49d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_20.c +++ /dev/null @@ -1,3217 +0,0 @@ -/******************************************************************************* - * Size: 20 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 20 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_20.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_20 - #define LV_FONT_MONTSERRAT_20 1 -#endif - -#if LV_FONT_MONTSERRAT_20 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x6f, 0xc6, 0xfc, 0x5f, 0xb4, 0xfa, 0x4f, 0xa3, - 0xf9, 0x3f, 0x92, 0xf8, 0x2f, 0x71, 0xd6, 0x0, - 0x1, 0x94, 0x9f, 0xe4, 0xf9, - - /* U+0022 "\"" */ - 0xbe, 0x1, 0xf8, 0xbe, 0x1, 0xf8, 0xad, 0x1, - 0xf7, 0xad, 0x0, 0xf7, 0xad, 0x0, 0xf7, 0x57, - 0x0, 0x83, - - /* U+0023 "#" */ - 0x0, 0x0, 0x7f, 0x0, 0x4, 0xf2, 0x0, 0x0, - 0x0, 0xac, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x0, - 0xca, 0x0, 0x9, 0xd0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x6, 0x88, 0xfb, 0x88, - 0x8e, 0xc8, 0x84, 0x0, 0x2, 0xf4, 0x0, 0xf, - 0x70, 0x0, 0x0, 0x3, 0xf2, 0x0, 0xf, 0x50, - 0x0, 0x0, 0x5, 0xf1, 0x0, 0x2f, 0x40, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0x4f, 0x20, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x38, 0x8d, - 0xd8, 0x88, 0xcf, 0x88, 0x70, 0x0, 0xd, 0x90, - 0x0, 0xac, 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, - 0xca, 0x0, 0x0, 0x0, 0x1f, 0x50, 0x0, 0xe8, - 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x5, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf0, - 0x0, 0x0, 0x0, 0x7, 0xcf, 0xff, 0xc8, 0x10, - 0x1, 0xdf, 0xfe, 0xfd, 0xff, 0xd0, 0x8, 0xfc, - 0x15, 0xf0, 0x6, 0x60, 0xc, 0xf3, 0x5, 0xf0, - 0x0, 0x0, 0xc, 0xf5, 0x5, 0xf0, 0x0, 0x0, - 0x6, 0xfe, 0x76, 0xf0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf9, 0x40, 0x0, 0x0, 0x2, 0x7c, 0xff, - 0xfe, 0x40, 0x0, 0x0, 0x5, 0xf4, 0xaf, 0xf2, - 0x0, 0x0, 0x5, 0xf0, 0x9, 0xf7, 0x1, 0x0, - 0x5, 0xf0, 0x6, 0xf8, 0xc, 0x92, 0x5, 0xf0, - 0x2d, 0xf4, 0xc, 0xff, 0xed, 0xfd, 0xff, 0xa0, - 0x0, 0x4a, 0xef, 0xff, 0xc6, 0x0, 0x0, 0x0, - 0x5, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x70, 0x0, 0x0, - - /* U+0025 "%" */ - 0x0, 0x9e, 0xe9, 0x0, 0x0, 0x0, 0xda, 0x0, - 0x0, 0xad, 0x44, 0xda, 0x0, 0x0, 0x9e, 0x10, - 0x0, 0x1f, 0x40, 0x4, 0xf1, 0x0, 0x4f, 0x40, - 0x0, 0x3, 0xf1, 0x0, 0x1f, 0x30, 0x1e, 0x90, - 0x0, 0x0, 0x2f, 0x30, 0x3, 0xf1, 0xa, 0xd0, - 0x0, 0x0, 0x0, 0xcb, 0x11, 0xbb, 0x5, 0xf3, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xfc, 0x11, 0xe8, - 0x1a, 0xfe, 0x70, 0x0, 0x0, 0x11, 0x0, 0xad, - 0xa, 0xd4, 0x5f, 0x60, 0x0, 0x0, 0x0, 0x5f, - 0x32, 0xf3, 0x0, 0x7e, 0x0, 0x0, 0x0, 0x1f, - 0x70, 0x4f, 0x0, 0x4, 0xf0, 0x0, 0x0, 0xb, - 0xc0, 0x4, 0xf0, 0x0, 0x3f, 0x0, 0x0, 0x6, - 0xf2, 0x0, 0x2f, 0x20, 0x6, 0xe0, 0x0, 0x2, - 0xf7, 0x0, 0x0, 0xbb, 0x23, 0xe6, 0x0, 0x0, - 0xcc, 0x0, 0x0, 0x1, 0xaf, 0xe8, 0x0, - - /* U+0026 "&" */ - 0x0, 0x1, 0x9d, 0xfd, 0x70, 0x0, 0x0, 0x0, - 0xd, 0xf9, 0x7b, 0xf7, 0x0, 0x0, 0x0, 0x4f, - 0x90, 0x0, 0xdc, 0x0, 0x0, 0x0, 0x5f, 0x70, - 0x0, 0xec, 0x0, 0x0, 0x0, 0x1f, 0xe1, 0x1b, - 0xf4, 0x0, 0x0, 0x0, 0x5, 0xfd, 0xef, 0x50, - 0x0, 0x0, 0x0, 0x4, 0xef, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xc7, 0xfd, 0x20, 0x8, 0x30, - 0x7, 0xf9, 0x0, 0x5f, 0xe2, 0x1f, 0x80, 0xe, - 0xe0, 0x0, 0x5, 0xfe, 0xaf, 0x30, 0xf, 0xd0, - 0x0, 0x0, 0x4f, 0xfc, 0x0, 0xd, 0xf7, 0x0, - 0x0, 0x5e, 0xff, 0x30, 0x4, 0xff, 0xeb, 0xbe, - 0xfe, 0x6f, 0xf2, 0x0, 0x29, 0xdf, 0xfc, 0x70, - 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0027 "'" */ - 0xbe, 0xbe, 0xad, 0xad, 0xad, 0x57, - - /* U+0028 "(" */ - 0x0, 0xe, 0xd0, 0x0, 0x7f, 0x60, 0x0, 0xef, - 0x0, 0x3, 0xfa, 0x0, 0x8, 0xf5, 0x0, 0xb, - 0xf2, 0x0, 0xe, 0xf0, 0x0, 0xf, 0xe0, 0x0, - 0xf, 0xd0, 0x0, 0x1f, 0xc0, 0x0, 0xf, 0xd0, - 0x0, 0xf, 0xe0, 0x0, 0xe, 0xf0, 0x0, 0xb, - 0xf2, 0x0, 0x8, 0xf5, 0x0, 0x3, 0xfa, 0x0, - 0x0, 0xee, 0x0, 0x0, 0x7f, 0x60, 0x0, 0xe, - 0xd0, - - /* U+0029 ")" */ - 0x2f, 0xb0, 0x0, 0xaf, 0x30, 0x3, 0xfa, 0x0, - 0xe, 0xf0, 0x0, 0x9f, 0x40, 0x6, 0xf7, 0x0, - 0x3f, 0xa0, 0x2, 0xfb, 0x0, 0x1f, 0xc0, 0x0, - 0xfd, 0x0, 0x1f, 0xc0, 0x2, 0xfb, 0x0, 0x3f, - 0xa0, 0x6, 0xf7, 0x0, 0x9f, 0x40, 0xe, 0xf0, - 0x3, 0xfa, 0x0, 0xaf, 0x30, 0x2f, 0xb0, 0x0, - - /* U+002A "*" */ - 0x0, 0x9, 0x90, 0x0, 0x26, 0x9, 0x90, 0x62, - 0x5f, 0xcb, 0xbc, 0xf5, 0x2, 0xbf, 0xfb, 0x20, - 0x7, 0xef, 0xfe, 0x70, 0x6f, 0x69, 0x96, 0xf6, - 0x1, 0x9, 0x90, 0x10, 0x0, 0x6, 0x60, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xfa, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, 0x6a, 0xaa, - 0xfd, 0xaa, 0xa2, 0x0, 0x0, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xfa, - 0x0, 0x0, - - /* U+002C "," */ - 0x6, 0xa1, 0xf, 0xf8, 0xa, 0xf7, 0x5, 0xf2, - 0x9, 0xc0, 0xd, 0x70, - - /* U+002D "-" */ - 0x9b, 0xbb, 0xb5, 0xdf, 0xff, 0xf8, - - /* U+002E "." */ - 0x7, 0xb2, 0xf, 0xf8, 0xa, 0xe4, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x7, 0x50, 0x0, 0x0, 0x4, - 0xf7, 0x0, 0x0, 0x0, 0xaf, 0x10, 0x0, 0x0, - 0xf, 0xc0, 0x0, 0x0, 0x4, 0xf6, 0x0, 0x0, - 0x0, 0xaf, 0x10, 0x0, 0x0, 0xf, 0xc0, 0x0, - 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, 0xaf, 0x10, - 0x0, 0x0, 0xf, 0xb0, 0x0, 0x0, 0x5, 0xf6, - 0x0, 0x0, 0x0, 0xaf, 0x10, 0x0, 0x0, 0xf, - 0xb0, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, - 0xbf, 0x10, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, - 0x6, 0xf5, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, - 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x6, 0xf5, 0x0, - 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x1, 0x8d, 0xfe, 0xa3, 0x0, 0x0, 0x2, - 0xef, 0xfd, 0xef, 0xf6, 0x0, 0x0, 0xdf, 0xa1, - 0x0, 0x6f, 0xf2, 0x0, 0x6f, 0xc0, 0x0, 0x0, - 0x7f, 0xb0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xff, - 0x0, 0xef, 0x10, 0x0, 0x0, 0xc, 0xf3, 0xf, - 0xf0, 0x0, 0x0, 0x0, 0xaf, 0x50, 0xff, 0x0, - 0x0, 0x0, 0xa, 0xf5, 0xe, 0xf1, 0x0, 0x0, - 0x0, 0xcf, 0x30, 0xbf, 0x40, 0x0, 0x0, 0xf, - 0xf0, 0x6, 0xfc, 0x0, 0x0, 0x7, 0xfb, 0x0, - 0xd, 0xfa, 0x10, 0x6, 0xff, 0x20, 0x0, 0x2e, - 0xff, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x18, 0xdf, - 0xea, 0x30, 0x0, - - /* U+0031 "1" */ - 0xdf, 0xff, 0xf4, 0xac, 0xce, 0xf4, 0x0, 0xb, - 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, - 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, - 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, - 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, - 0xb, 0xf4, - - /* U+0032 "2" */ - 0x0, 0x6c, 0xef, 0xea, 0x30, 0x2, 0xdf, 0xfe, - 0xdf, 0xff, 0x50, 0x5f, 0x91, 0x0, 0x9, 0xfe, - 0x0, 0x10, 0x0, 0x0, 0xe, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0x20, 0x0, 0x0, 0x0, 0x2f, - 0xd0, 0x0, 0x0, 0x0, 0x1d, 0xf5, 0x0, 0x0, - 0x0, 0x1c, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xf8, - 0x0, 0x0, 0x0, 0x1d, 0xf8, 0x0, 0x0, 0x0, - 0x2e, 0xf7, 0x0, 0x0, 0x0, 0x2e, 0xf6, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xcc, 0xcc, 0xcc, 0x94, - 0xff, 0xff, 0xff, 0xff, 0xfc, - - /* U+0033 "3" */ - 0x4f, 0xff, 0xff, 0xff, 0xff, 0x3, 0xcc, 0xcc, - 0xcc, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x2f, 0xe2, - 0x0, 0x0, 0x0, 0x1d, 0xf4, 0x0, 0x0, 0x0, - 0xc, 0xf6, 0x0, 0x0, 0x0, 0x9, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xfe, 0x80, 0x0, 0x0, - 0x6, 0x68, 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0x50, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x1, - 0x0, 0x0, 0x0, 0xaf, 0x77, 0xe6, 0x10, 0x0, - 0x6f, 0xf2, 0x7f, 0xff, 0xee, 0xff, 0xf6, 0x0, - 0x28, 0xcf, 0xfe, 0xa3, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x7, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0x30, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x2e, 0xf2, 0x0, 0x6f, 0x70, - 0x0, 0x0, 0xcf, 0x50, 0x0, 0x6f, 0x70, 0x0, - 0x9, 0xf9, 0x0, 0x0, 0x6f, 0x70, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x2c, 0xcc, - 0xcc, 0xcc, 0xdf, 0xec, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0x70, 0x0, - - /* U+0035 "5" */ - 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfc, - 0xcc, 0xcc, 0xc0, 0x2, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x6, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xec, 0xca, 0x72, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x2, 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xa0, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x2, - 0x0, 0x0, 0x0, 0x6f, 0xa3, 0xf8, 0x20, 0x0, - 0x5f, 0xf4, 0x4f, 0xff, 0xed, 0xff, 0xf9, 0x0, - 0x17, 0xce, 0xfe, 0xb5, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x5b, 0xef, 0xeb, 0x60, 0x0, 0xb, - 0xff, 0xec, 0xdf, 0xb0, 0x0, 0xaf, 0xb2, 0x0, - 0x1, 0x10, 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf0, - 0x6c, 0xff, 0xc6, 0x0, 0xf, 0xfa, 0xfd, 0xbc, - 0xff, 0xa0, 0xf, 0xff, 0x60, 0x0, 0x2e, 0xf5, - 0xf, 0xfa, 0x0, 0x0, 0x5, 0xfa, 0xc, 0xf7, - 0x0, 0x0, 0x3, 0xfc, 0x7, 0xfa, 0x0, 0x0, - 0x5, 0xfa, 0x1, 0xef, 0x60, 0x0, 0x2e, 0xf4, - 0x0, 0x4f, 0xfe, 0xbc, 0xff, 0x80, 0x0, 0x1, - 0x9d, 0xfe, 0xb4, 0x0, - - /* U+0037 "7" */ - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x6f, 0xec, - 0xcc, 0xcc, 0xdf, 0xf1, 0x6f, 0x80, 0x0, 0x0, - 0x6f, 0xa0, 0x6f, 0x80, 0x0, 0x0, 0xdf, 0x30, - 0x14, 0x20, 0x0, 0x4, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x60, 0x0, - 0x0, 0x0, 0x2, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, 0x0, 0x6, - 0xfb, 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x6, 0xce, 0xfe, 0xb5, 0x0, 0x0, 0xcf, - 0xfc, 0xac, 0xff, 0xb0, 0x6, 0xfc, 0x10, 0x0, - 0x2d, 0xf4, 0x9, 0xf6, 0x0, 0x0, 0x8, 0xf7, - 0x6, 0xfb, 0x0, 0x0, 0x1d, 0xf4, 0x0, 0xaf, - 0xea, 0x9a, 0xff, 0x80, 0x0, 0x5e, 0xff, 0xff, - 0xfe, 0x40, 0x6, 0xfe, 0x61, 0x2, 0x7f, 0xf4, - 0xe, 0xf3, 0x0, 0x0, 0x5, 0xfc, 0x1f, 0xe0, - 0x0, 0x0, 0x0, 0xff, 0xf, 0xf1, 0x0, 0x0, - 0x3, 0xfe, 0xa, 0xfb, 0x10, 0x0, 0x2d, 0xf8, - 0x1, 0xdf, 0xfc, 0xbc, 0xff, 0xc0, 0x0, 0x7, - 0xce, 0xfe, 0xb6, 0x0, - - /* U+0039 "9" */ - 0x0, 0x3a, 0xef, 0xeb, 0x40, 0x0, 0x6, 0xff, - 0xda, 0xcf, 0xf8, 0x0, 0x1f, 0xf4, 0x0, 0x1, - 0xcf, 0x50, 0x5f, 0x90, 0x0, 0x0, 0x2f, 0xd0, - 0x6f, 0x90, 0x0, 0x0, 0x3f, 0xf1, 0x2f, 0xf4, - 0x0, 0x1, 0xcf, 0xf4, 0x8, 0xff, 0xda, 0xbf, - 0xec, 0xf5, 0x0, 0x4b, 0xef, 0xd9, 0x1a, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0x90, 0x0, 0x40, 0x0, 0x1a, 0xfe, 0x10, - 0x6, 0xfe, 0xdd, 0xff, 0xe3, 0x0, 0x3, 0xad, - 0xfe, 0xc7, 0x10, 0x0, - - /* U+003A ":" */ - 0xa, 0xe4, 0xf, 0xf8, 0x7, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xb2, 0xf, 0xf8, 0xa, 0xe4, - - /* U+003B ";" */ - 0xa, 0xe4, 0xf, 0xf8, 0x7, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xa1, 0xf, 0xf8, 0xa, 0xf7, 0x5, 0xf2, - 0x9, 0xc0, 0xd, 0x70, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x2, - 0x9f, 0xf4, 0x0, 0x5, 0xcf, 0xfb, 0x40, 0x28, - 0xef, 0xe8, 0x10, 0x0, 0xaf, 0xc4, 0x0, 0x0, - 0x0, 0x8f, 0xfa, 0x40, 0x0, 0x0, 0x2, 0x9e, - 0xfd, 0x71, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xb2, - 0x0, 0x0, 0x0, 0x39, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x1, - - /* U+003D "=" */ - 0xaf, 0xff, 0xff, 0xff, 0xf4, 0x6a, 0xaa, 0xaa, - 0xaa, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, 0x6a, 0xaa, - 0xaa, 0xaa, 0xa2, - - /* U+003E ">" */ - 0x63, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd6, 0x10, - 0x0, 0x0, 0x17, 0xdf, 0xf9, 0x30, 0x0, 0x0, - 0x3, 0xaf, 0xfc, 0x60, 0x0, 0x0, 0x1, 0x6e, - 0xf4, 0x0, 0x0, 0x6, 0xcf, 0xf3, 0x0, 0x39, - 0xff, 0xd6, 0x0, 0x5d, 0xff, 0xa3, 0x0, 0x0, - 0xad, 0x71, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x7c, 0xef, 0xda, 0x30, 0x2, 0xef, 0xfc, - 0xce, 0xff, 0x60, 0x6f, 0x80, 0x0, 0x8, 0xfe, - 0x0, 0x10, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, - 0x0, 0x1, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0x60, 0x0, 0x0, 0x1, 0xcf, 0x80, 0x0, 0x0, - 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0xc0, - 0x0, 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x93, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, - 0x0, 0x6, 0xf8, 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xc9, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfd, 0x97, 0x67, - 0x9e, 0xfb, 0x10, 0x0, 0x0, 0x5, 0xfd, 0x30, - 0x0, 0x0, 0x0, 0x4d, 0xe3, 0x0, 0x0, 0x3f, - 0xa0, 0x0, 0x58, 0x85, 0x3, 0x94, 0xbe, 0x10, - 0x0, 0xec, 0x0, 0x2d, 0xff, 0xff, 0xd7, 0xf5, - 0x1d, 0xb0, 0x6, 0xf3, 0x1, 0xef, 0x71, 0x4, - 0xdf, 0xf5, 0x5, 0xf2, 0xb, 0xd0, 0x8, 0xf7, - 0x0, 0x0, 0x1e, 0xf5, 0x0, 0xe7, 0xe, 0x90, - 0xc, 0xf0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0xca, - 0xf, 0x70, 0xe, 0xe0, 0x0, 0x0, 0x6, 0xf5, - 0x0, 0xab, 0xf, 0x70, 0xd, 0xf0, 0x0, 0x0, - 0x6, 0xf5, 0x0, 0xba, 0xe, 0x90, 0xa, 0xf3, - 0x0, 0x0, 0xb, 0xf5, 0x0, 0xd8, 0xb, 0xd0, - 0x3, 0xfd, 0x10, 0x0, 0x7f, 0xf7, 0x3, 0xf4, - 0x6, 0xf3, 0x0, 0x7f, 0xfa, 0x9d, 0xf7, 0xfe, - 0xae, 0xc0, 0x0, 0xec, 0x0, 0x4, 0xcf, 0xfb, - 0x40, 0x5e, 0xfa, 0x10, 0x0, 0x3f, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3d, 0xfd, 0x97, 0x68, 0xaf, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfd, - 0xb7, 0x10, 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0xe, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xaf, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xfa, 0x1f, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xf3, 0xa, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xc0, 0x3, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0x50, 0x0, 0xcf, 0x30, 0x0, - 0x0, 0x1, 0xfe, 0x0, 0x0, 0x5f, 0xb0, 0x0, - 0x0, 0x8, 0xf7, 0x0, 0x0, 0xe, 0xf2, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x6f, 0xda, 0xaa, 0xaa, 0xaa, 0xff, 0x10, - 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, 0x9f, 0x80, - 0x5, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe0, - 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf6, - - /* U+0042 "B" */ - 0xef, 0xff, 0xff, 0xfe, 0xb5, 0x0, 0xe, 0xfb, - 0xaa, 0xab, 0xdf, 0xfa, 0x0, 0xef, 0x10, 0x0, - 0x0, 0x4f, 0xf3, 0xe, 0xf1, 0x0, 0x0, 0x0, - 0xaf, 0x60, 0xef, 0x10, 0x0, 0x0, 0xc, 0xf4, - 0xe, 0xf1, 0x0, 0x0, 0x29, 0xfc, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0xe, 0xfb, 0xaa, - 0xaa, 0xce, 0xfd, 0x10, 0xef, 0x10, 0x0, 0x0, - 0x8, 0xfb, 0xe, 0xf1, 0x0, 0x0, 0x0, 0xf, - 0xf0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xff, 0x1e, - 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xe0, 0xef, 0xba, - 0xaa, 0xab, 0xef, 0xf4, 0xe, 0xff, 0xff, 0xff, - 0xfd, 0x92, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x17, 0xce, 0xfe, 0xb5, 0x0, 0x0, - 0x5, 0xef, 0xff, 0xde, 0xff, 0xc1, 0x0, 0x5f, - 0xf9, 0x20, 0x0, 0x3b, 0xf5, 0x2, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x30, 0x8, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x30, 0x0, 0x5f, 0xfa, - 0x30, 0x0, 0x3b, 0xf5, 0x0, 0x5, 0xef, 0xff, - 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x17, 0xce, 0xfe, - 0xb5, 0x0, - - /* U+0044 "D" */ - 0xef, 0xff, 0xff, 0xfd, 0xa4, 0x0, 0x0, 0xef, - 0xdc, 0xcc, 0xdf, 0xff, 0xb1, 0x0, 0xef, 0x10, - 0x0, 0x0, 0x5d, 0xfd, 0x0, 0xef, 0x10, 0x0, - 0x0, 0x0, 0xcf, 0xa0, 0xef, 0x10, 0x0, 0x0, - 0x0, 0x1f, 0xf1, 0xef, 0x10, 0x0, 0x0, 0x0, - 0xa, 0xf6, 0xef, 0x10, 0x0, 0x0, 0x0, 0x8, - 0xf8, 0xef, 0x10, 0x0, 0x0, 0x0, 0x7, 0xf8, - 0xef, 0x10, 0x0, 0x0, 0x0, 0xa, 0xf6, 0xef, - 0x10, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0xef, 0x10, - 0x0, 0x0, 0x0, 0xbf, 0xa0, 0xef, 0x10, 0x0, - 0x0, 0x5d, 0xfd, 0x10, 0xef, 0xcc, 0xcc, 0xdf, - 0xff, 0xb1, 0x0, 0xef, 0xff, 0xff, 0xfd, 0xa4, - 0x0, 0x0, - - /* U+0045 "E" */ - 0xef, 0xff, 0xff, 0xff, 0xff, 0xe, 0xfd, 0xcc, - 0xcc, 0xcc, 0xc0, 0xef, 0x10, 0x0, 0x0, 0x0, - 0xe, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0x10, - 0x0, 0x0, 0x0, 0xe, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xf2, 0xe, 0xfc, - 0xcc, 0xcc, 0xcc, 0x10, 0xef, 0x10, 0x0, 0x0, - 0x0, 0xe, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, - 0x10, 0x0, 0x0, 0x0, 0xe, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xcc, 0xcc, 0xcc, 0xcc, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xf4, - - /* U+0046 "F" */ - 0xef, 0xff, 0xff, 0xff, 0xff, 0xef, 0xdc, 0xcc, - 0xcc, 0xcc, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, - 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, - 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0xcc, - 0xcc, 0xcc, 0xc1, 0xef, 0xff, 0xff, 0xff, 0xf2, - 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, - 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, - 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, - 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x16, 0xce, 0xfe, 0xb6, 0x0, 0x0, - 0x5, 0xef, 0xff, 0xde, 0xff, 0xd2, 0x0, 0x5f, - 0xf9, 0x20, 0x0, 0x29, 0xf7, 0x2, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x20, 0x8, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x11, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x3, 0xfb, - 0xd, 0xf3, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x8, - 0xfa, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x1, 0xff, - 0x60, 0x0, 0x0, 0x3, 0xfb, 0x0, 0x5f, 0xfa, - 0x30, 0x0, 0x2a, 0xfb, 0x0, 0x4, 0xef, 0xff, - 0xdf, 0xff, 0xe4, 0x0, 0x0, 0x17, 0xce, 0xfe, - 0xb6, 0x0, - - /* U+0048 "H" */ - 0xef, 0x10, 0x0, 0x0, 0x0, 0xdf, 0x2e, 0xf1, - 0x0, 0x0, 0x0, 0xd, 0xf2, 0xef, 0x10, 0x0, - 0x0, 0x0, 0xdf, 0x2e, 0xf1, 0x0, 0x0, 0x0, - 0xd, 0xf2, 0xef, 0x10, 0x0, 0x0, 0x0, 0xdf, - 0x2e, 0xf1, 0x0, 0x0, 0x0, 0xd, 0xf2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x2e, 0xfd, 0xcc, - 0xcc, 0xcc, 0xcf, 0xf2, 0xef, 0x10, 0x0, 0x0, - 0x0, 0xdf, 0x2e, 0xf1, 0x0, 0x0, 0x0, 0xd, - 0xf2, 0xef, 0x10, 0x0, 0x0, 0x0, 0xdf, 0x2e, - 0xf1, 0x0, 0x0, 0x0, 0xd, 0xf2, 0xef, 0x10, - 0x0, 0x0, 0x0, 0xdf, 0x2e, 0xf1, 0x0, 0x0, - 0x0, 0xd, 0xf2, - - /* U+0049 "I" */ - 0xef, 0x1e, 0xf1, 0xef, 0x1e, 0xf1, 0xef, 0x1e, - 0xf1, 0xef, 0x1e, 0xf1, 0xef, 0x1e, 0xf1, 0xef, - 0x1e, 0xf1, 0xef, 0x1e, 0xf1, - - /* U+004A "J" */ - 0x0, 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x9c, 0xcc, - 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, - 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, - 0xf4, 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, - 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xf4, - 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, - 0xb, 0xf4, 0x1, 0x0, 0x0, 0xd, 0xf2, 0xc, - 0xc2, 0x0, 0x6f, 0xe0, 0xa, 0xff, 0xde, 0xff, - 0x60, 0x0, 0x6c, 0xff, 0xc5, 0x0, - - /* U+004B "K" */ - 0xef, 0x10, 0x0, 0x0, 0xb, 0xf8, 0xe, 0xf1, - 0x0, 0x0, 0xb, 0xf8, 0x0, 0xef, 0x10, 0x0, - 0xb, 0xf9, 0x0, 0xe, 0xf1, 0x0, 0xb, 0xfa, - 0x0, 0x0, 0xef, 0x10, 0xa, 0xfb, 0x0, 0x0, - 0xe, 0xf1, 0xa, 0xfb, 0x0, 0x0, 0x0, 0xef, - 0x19, 0xff, 0x30, 0x0, 0x0, 0xe, 0xfa, 0xfe, - 0xfe, 0x10, 0x0, 0x0, 0xef, 0xfd, 0x1a, 0xfc, - 0x0, 0x0, 0xe, 0xfd, 0x10, 0xc, 0xfa, 0x0, - 0x0, 0xef, 0x20, 0x0, 0x1e, 0xf7, 0x0, 0xe, - 0xf1, 0x0, 0x0, 0x2f, 0xf4, 0x0, 0xef, 0x10, - 0x0, 0x0, 0x4f, 0xf2, 0xe, 0xf1, 0x0, 0x0, - 0x0, 0x6f, 0xd1, - - /* U+004C "L" */ - 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, - 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, - 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, - 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, - 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, - 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, - 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, - 0x10, 0x0, 0x0, 0x0, 0xef, 0xcc, 0xcc, 0xcc, - 0xc8, 0xef, 0xff, 0xff, 0xff, 0xfb, - - /* U+004D "M" */ - 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xef, - 0xf3, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xef, 0x9f, - 0x60, 0x0, 0x0, 0x4f, 0xaf, 0xfe, 0xf1, 0xee, - 0x10, 0x0, 0xd, 0xf1, 0xff, 0xef, 0x6, 0xf9, - 0x0, 0x7, 0xf7, 0xe, 0xfe, 0xf0, 0xc, 0xf3, - 0x1, 0xfd, 0x0, 0xef, 0xef, 0x0, 0x3f, 0xc0, - 0xaf, 0x40, 0xe, 0xfe, 0xf0, 0x0, 0x9f, 0x9f, - 0xa0, 0x0, 0xef, 0xef, 0x0, 0x1, 0xef, 0xf1, - 0x0, 0xe, 0xfe, 0xf0, 0x0, 0x6, 0xf7, 0x0, - 0x0, 0xef, 0xef, 0x0, 0x0, 0x4, 0x0, 0x0, - 0xe, 0xfe, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, - - /* U+004E "N" */ - 0xef, 0x20, 0x0, 0x0, 0x0, 0xdf, 0x2e, 0xfd, - 0x10, 0x0, 0x0, 0xd, 0xf2, 0xef, 0xfb, 0x0, - 0x0, 0x0, 0xdf, 0x2e, 0xfe, 0xf8, 0x0, 0x0, - 0xd, 0xf2, 0xef, 0x4f, 0xf5, 0x0, 0x0, 0xdf, - 0x2e, 0xf1, 0x5f, 0xf3, 0x0, 0xd, 0xf2, 0xef, - 0x10, 0x8f, 0xe1, 0x0, 0xdf, 0x2e, 0xf1, 0x0, - 0xbf, 0xc0, 0xd, 0xf2, 0xef, 0x10, 0x1, 0xdf, - 0x90, 0xdf, 0x2e, 0xf1, 0x0, 0x2, 0xff, 0x6d, - 0xf2, 0xef, 0x10, 0x0, 0x5, 0xff, 0xff, 0x2e, - 0xf1, 0x0, 0x0, 0x8, 0xff, 0xf2, 0xef, 0x10, - 0x0, 0x0, 0xb, 0xff, 0x2e, 0xf1, 0x0, 0x0, - 0x0, 0xd, 0xf2, - - /* U+004F "O" */ - 0x0, 0x0, 0x16, 0xce, 0xfe, 0xb5, 0x0, 0x0, - 0x0, 0x4, 0xef, 0xfe, 0xdf, 0xff, 0xd3, 0x0, - 0x0, 0x5f, 0xf9, 0x20, 0x0, 0x3b, 0xff, 0x20, - 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x9f, 0xd0, - 0x8, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf5, - 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfa, - 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfc, - 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfc, - 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfa, - 0x8, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf5, - 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x9f, 0xd0, - 0x0, 0x5f, 0xfa, 0x20, 0x0, 0x3b, 0xff, 0x20, - 0x0, 0x4, 0xef, 0xff, 0xdf, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x17, 0xce, 0xfe, 0xb5, 0x0, 0x0, - - /* U+0050 "P" */ - 0xef, 0xff, 0xff, 0xec, 0x70, 0x0, 0xef, 0xdc, - 0xcd, 0xef, 0xfd, 0x20, 0xef, 0x10, 0x0, 0x2, - 0xbf, 0xc0, 0xef, 0x10, 0x0, 0x0, 0xe, 0xf3, - 0xef, 0x10, 0x0, 0x0, 0xa, 0xf5, 0xef, 0x10, - 0x0, 0x0, 0xb, 0xf5, 0xef, 0x10, 0x0, 0x0, - 0x2f, 0xf2, 0xef, 0x10, 0x0, 0x15, 0xdf, 0xa0, - 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xef, 0xcc, - 0xcc, 0xb9, 0x40, 0x0, 0xef, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, 0xef, 0x10, - 0x0, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x16, 0xce, 0xfe, 0xb5, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xfd, 0xff, 0xfd, 0x30, - 0x0, 0x0, 0x5f, 0xfa, 0x20, 0x0, 0x4b, 0xff, - 0x20, 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0x9, - 0xfd, 0x0, 0x8, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xf5, 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xa0, 0xf, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xfc, 0x0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xc0, 0xd, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xfa, 0x0, 0x9f, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0x50, 0x2, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x0, 0x6, 0xff, - 0x92, 0x0, 0x3, 0xbf, 0xf3, 0x0, 0x0, 0x6, - 0xff, 0xfe, 0xce, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x2, 0x8d, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xe2, 0x0, 0x1a, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0xbf, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xef, 0xb3, - 0x0, - - /* U+0052 "R" */ - 0xef, 0xff, 0xff, 0xec, 0x70, 0x0, 0xef, 0xdc, - 0xcd, 0xef, 0xfd, 0x20, 0xef, 0x10, 0x0, 0x2, - 0xbf, 0xc0, 0xef, 0x10, 0x0, 0x0, 0xe, 0xf3, - 0xef, 0x10, 0x0, 0x0, 0xa, 0xf5, 0xef, 0x10, - 0x0, 0x0, 0xb, 0xf5, 0xef, 0x10, 0x0, 0x0, - 0x2f, 0xf2, 0xef, 0x10, 0x0, 0x15, 0xdf, 0xa0, - 0xef, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, 0xcc, - 0xcb, 0xdf, 0x90, 0x0, 0xef, 0x10, 0x0, 0x1e, - 0xf2, 0x0, 0xef, 0x10, 0x0, 0x4, 0xfd, 0x0, - 0xef, 0x10, 0x0, 0x0, 0x9f, 0x90, 0xef, 0x10, - 0x0, 0x0, 0xd, 0xf4, - - /* U+0053 "S" */ - 0x0, 0x6, 0xce, 0xfe, 0xc7, 0x10, 0x0, 0xcf, - 0xfd, 0xcd, 0xff, 0xd0, 0x8, 0xfc, 0x20, 0x0, - 0x17, 0x60, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0x71, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd9, - 0x40, 0x0, 0x0, 0x1, 0x6a, 0xef, 0xfe, 0x40, - 0x0, 0x0, 0x0, 0x3, 0xaf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xf7, 0x1, 0x0, 0x0, 0x0, - 0x7, 0xf8, 0xd, 0xb3, 0x0, 0x0, 0x3e, 0xf4, - 0xa, 0xff, 0xfc, 0xce, 0xff, 0x90, 0x0, 0x39, - 0xdf, 0xfe, 0xa4, 0x0, - - /* U+0054 "T" */ - 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbc, 0xcc, - 0xdf, 0xfc, 0xcc, 0xc8, 0x0, 0x0, 0x2f, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xd0, 0x0, 0x0, - - /* U+0055 "U" */ - 0xf, 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0xff, - 0x0, 0x0, 0x0, 0x2, 0xfd, 0xf, 0xf0, 0x0, - 0x0, 0x0, 0x2f, 0xd0, 0xff, 0x0, 0x0, 0x0, - 0x2, 0xfd, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x2f, - 0xd0, 0xff, 0x0, 0x0, 0x0, 0x2, 0xfd, 0xf, - 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0xff, 0x0, - 0x0, 0x0, 0x2, 0xfc, 0xf, 0xf0, 0x0, 0x0, - 0x0, 0x2f, 0xc0, 0xdf, 0x30, 0x0, 0x0, 0x5, - 0xfa, 0x9, 0xf9, 0x0, 0x0, 0x0, 0xcf, 0x60, - 0x2f, 0xf8, 0x0, 0x1, 0xaf, 0xe0, 0x0, 0x5f, - 0xff, 0xde, 0xff, 0xe3, 0x0, 0x0, 0x29, 0xdf, - 0xfd, 0x81, 0x0, - - /* U+0056 "V" */ - 0xc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf1, - 0x5, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x90, - 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0xdf, 0x20, - 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x4, 0xfb, 0x0, - 0x0, 0x1f, 0xf2, 0x0, 0x0, 0xb, 0xf4, 0x0, - 0x0, 0x9, 0xf8, 0x0, 0x0, 0x2f, 0xd0, 0x0, - 0x0, 0x2, 0xff, 0x0, 0x0, 0x9f, 0x60, 0x0, - 0x0, 0x0, 0xbf, 0x60, 0x1, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xd0, 0x7, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xf4, 0xe, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xfb, 0x5f, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xef, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, 0x0, - - /* U+0057 "W" */ - 0x3f, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0x60, 0x0, - 0x0, 0x2, 0xfb, 0xd, 0xf3, 0x0, 0x0, 0x1, - 0xff, 0xc0, 0x0, 0x0, 0x8, 0xf5, 0x8, 0xf8, - 0x0, 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, 0xd, - 0xf1, 0x3, 0xfd, 0x0, 0x0, 0xc, 0xf8, 0xf7, - 0x0, 0x0, 0x3f, 0xb0, 0x0, 0xdf, 0x30, 0x0, - 0x2f, 0xb2, 0xfc, 0x0, 0x0, 0x8f, 0x50, 0x0, - 0x8f, 0x80, 0x0, 0x7f, 0x50, 0xcf, 0x10, 0x0, - 0xdf, 0x0, 0x0, 0x3f, 0xd0, 0x0, 0xdf, 0x0, - 0x7f, 0x70, 0x3, 0xfb, 0x0, 0x0, 0xd, 0xf3, - 0x2, 0xfa, 0x0, 0x2f, 0xc0, 0x8, 0xf5, 0x0, - 0x0, 0x8, 0xf8, 0x8, 0xf5, 0x0, 0xc, 0xf2, - 0xe, 0xf0, 0x0, 0x0, 0x3, 0xfd, 0xd, 0xf0, - 0x0, 0x7, 0xf7, 0x3f, 0xb0, 0x0, 0x0, 0x0, - 0xdf, 0x6f, 0xa0, 0x0, 0x1, 0xfc, 0x8f, 0x50, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, - 0xcf, 0xef, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x1f, 0xf5, - 0x0, 0x0, - - /* U+0058 "X" */ - 0x1f, 0xf3, 0x0, 0x0, 0x0, 0xbf, 0x70, 0x5, - 0xfe, 0x10, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x9f, - 0xa0, 0x0, 0x2f, 0xe1, 0x0, 0x0, 0xd, 0xf6, - 0x0, 0xdf, 0x40, 0x0, 0x0, 0x3, 0xff, 0x29, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xef, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0x9f, 0xf3, 0x0, 0x0, 0x0, - 0x7, 0xfc, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x3f, - 0xf2, 0x0, 0xaf, 0xa0, 0x0, 0x0, 0xdf, 0x50, - 0x0, 0xd, 0xf5, 0x0, 0xa, 0xfa, 0x0, 0x0, - 0x3, 0xff, 0x20, 0x5f, 0xd0, 0x0, 0x0, 0x0, - 0x7f, 0xc0, - - /* U+0059 "Y" */ - 0xc, 0xf5, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, - 0x2f, 0xe1, 0x0, 0x0, 0x0, 0xdf, 0x20, 0x0, - 0x8f, 0x90, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x0, - 0xef, 0x30, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x5, - 0xfc, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, - 0xf6, 0x5, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xe1, 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xef, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xf7, 0x0, 0x0, - 0x0, - - /* U+005A "Z" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xcc, - 0xcc, 0xcc, 0xcc, 0xef, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, - 0xef, 0x50, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfe, - 0xcc, 0xcc, 0xcc, 0xcc, 0x72, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, - - /* U+005B "[" */ - 0xef, 0xff, 0x4e, 0xfa, 0xa2, 0xef, 0x0, 0xe, - 0xf0, 0x0, 0xef, 0x0, 0xe, 0xf0, 0x0, 0xef, - 0x0, 0xe, 0xf0, 0x0, 0xef, 0x0, 0xe, 0xf0, - 0x0, 0xef, 0x0, 0xe, 0xf0, 0x0, 0xef, 0x0, - 0xe, 0xf0, 0x0, 0xef, 0x0, 0xe, 0xf0, 0x0, - 0xef, 0x0, 0xe, 0xfa, 0xa2, 0xef, 0xff, 0x40, - - /* U+005C "\\" */ - 0x57, 0x0, 0x0, 0x0, 0x6, 0xf5, 0x0, 0x0, - 0x0, 0x1f, 0xa0, 0x0, 0x0, 0x0, 0xcf, 0x0, - 0x0, 0x0, 0x6, 0xf5, 0x0, 0x0, 0x0, 0x1f, - 0xa0, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, - 0x6, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, - 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x6, 0xf5, - 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, - 0xbf, 0x10, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, - 0x0, 0xf, 0xb0, 0x0, 0x0, 0x0, 0xaf, 0x10, - 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, 0xf, - 0xb0, 0x0, 0x0, 0x0, 0xaf, 0x10, 0x0, 0x0, - 0x5, 0xf6, - - /* U+005D "]" */ - 0xaf, 0xff, 0x96, 0xac, 0xf9, 0x0, 0x5f, 0x90, - 0x5, 0xf9, 0x0, 0x5f, 0x90, 0x5, 0xf9, 0x0, - 0x5f, 0x90, 0x5, 0xf9, 0x0, 0x5f, 0x90, 0x5, - 0xf9, 0x0, 0x5f, 0x90, 0x5, 0xf9, 0x0, 0x5f, - 0x90, 0x5, 0xf9, 0x0, 0x5f, 0x90, 0x5, 0xf9, - 0x0, 0x5f, 0x96, 0xac, 0xf9, 0xaf, 0xff, 0x90, - - /* U+005E "^" */ - 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x5, 0xff, - 0x10, 0x0, 0x0, 0xc, 0xbf, 0x70, 0x0, 0x0, - 0x3f, 0x49, 0xd0, 0x0, 0x0, 0x9d, 0x3, 0xf4, - 0x0, 0x1, 0xf7, 0x0, 0xcb, 0x0, 0x7, 0xf1, - 0x0, 0x6f, 0x20, 0xd, 0xa0, 0x0, 0xf, 0x80, - 0x4f, 0x30, 0x0, 0x9, 0xe0, - - /* U+005F "_" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x33, 0x33, 0x33, 0x33, 0x33, - - /* U+0060 "`" */ - 0x27, 0x70, 0x0, 0x5, 0xfc, 0x10, 0x0, 0x2d, - 0xd1, - - /* U+0061 "a" */ - 0x5, 0xbe, 0xfe, 0xb4, 0x0, 0x7f, 0xfd, 0xbd, - 0xff, 0x50, 0x2a, 0x10, 0x0, 0x7f, 0xe0, 0x0, - 0x0, 0x0, 0xd, 0xf2, 0x0, 0x1, 0x11, 0x1c, - 0xf3, 0x8, 0xef, 0xff, 0xff, 0xf3, 0x9f, 0xc6, - 0x44, 0x4c, 0xf3, 0xff, 0x0, 0x0, 0xb, 0xf3, - 0xef, 0x10, 0x0, 0x3f, 0xf3, 0x8f, 0xd7, 0x69, - 0xfe, 0xf3, 0x6, 0xcf, 0xfc, 0x59, 0xf3, - - /* U+0062 "b" */ - 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xb1, 0x9e, 0xfd, 0x92, 0x0, 0x3f, 0xde, - 0xfd, 0xce, 0xfe, 0x40, 0x3f, 0xfe, 0x30, 0x0, - 0x8f, 0xe1, 0x3f, 0xf3, 0x0, 0x0, 0xa, 0xf7, - 0x3f, 0xd0, 0x0, 0x0, 0x4, 0xfa, 0x3f, 0xb0, - 0x0, 0x0, 0x2, 0xfc, 0x3f, 0xd0, 0x0, 0x0, - 0x4, 0xfa, 0x3f, 0xf3, 0x0, 0x0, 0xa, 0xf7, - 0x3f, 0xfe, 0x30, 0x0, 0x8f, 0xe1, 0x3f, 0xce, - 0xfd, 0xce, 0xff, 0x40, 0x3f, 0xa1, 0x9e, 0xfe, - 0x92, 0x0, - - /* U+0063 "c" */ - 0x0, 0x3, 0xae, 0xfe, 0x91, 0x0, 0x7, 0xff, - 0xdc, 0xef, 0xe2, 0x4, 0xfe, 0x40, 0x0, 0x7f, - 0x60, 0xcf, 0x40, 0x0, 0x0, 0x10, 0xf, 0xe0, - 0x0, 0x0, 0x0, 0x2, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0x40, 0x0, 0x0, 0x10, 0x4, 0xfe, 0x40, 0x0, - 0x7f, 0x60, 0x7, 0xff, 0xdc, 0xef, 0xe2, 0x0, - 0x3, 0xae, 0xfe, 0x91, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, - 0x0, 0x4, 0xbe, 0xfc, 0x61, 0xfd, 0x0, 0x8f, - 0xfd, 0xce, 0xfb, 0xfd, 0x5, 0xfe, 0x40, 0x0, - 0x7f, 0xfd, 0xc, 0xf5, 0x0, 0x0, 0x9, 0xfd, - 0xf, 0xe0, 0x0, 0x0, 0x3, 0xfd, 0x2f, 0xc0, - 0x0, 0x0, 0x1, 0xfd, 0xf, 0xe0, 0x0, 0x0, - 0x3, 0xfd, 0xc, 0xf4, 0x0, 0x0, 0x8, 0xfd, - 0x5, 0xfe, 0x20, 0x0, 0x5f, 0xfd, 0x0, 0x8f, - 0xfb, 0xad, 0xfb, 0xfd, 0x0, 0x4, 0xbe, 0xfd, - 0x70, 0xfd, - - /* U+0065 "e" */ - 0x0, 0x4, 0xbe, 0xfc, 0x60, 0x0, 0x0, 0x8f, - 0xfc, 0xbe, 0xfc, 0x0, 0x5, 0xfd, 0x20, 0x0, - 0xaf, 0x80, 0xc, 0xf3, 0x0, 0x0, 0xd, 0xf0, - 0xf, 0xe1, 0x11, 0x11, 0x19, 0xf4, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xf, 0xe4, 0x44, 0x44, - 0x44, 0x41, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xfe, 0x40, 0x0, 0x2b, 0x20, 0x0, 0x7f, - 0xfe, 0xcd, 0xff, 0x60, 0x0, 0x3, 0xae, 0xfe, - 0xa3, 0x0, - - /* U+0066 "f" */ - 0x0, 0x6, 0xdf, 0xd6, 0x0, 0x6f, 0xea, 0xc6, - 0x0, 0xcf, 0x20, 0x0, 0x0, 0xef, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xf1, 0x7a, 0xff, 0xaa, 0xa0, - 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, - 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, - 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, - 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, - 0x0, 0xef, 0x0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x4, 0xbe, 0xfd, 0x70, 0xdf, 0x0, 0x8f, - 0xfd, 0xce, 0xfc, 0xef, 0x5, 0xfe, 0x40, 0x0, - 0x5f, 0xff, 0xc, 0xf4, 0x0, 0x0, 0x6, 0xff, - 0xf, 0xe0, 0x0, 0x0, 0x0, 0xff, 0x2f, 0xc0, - 0x0, 0x0, 0x0, 0xff, 0xf, 0xe0, 0x0, 0x0, - 0x1, 0xff, 0xc, 0xf5, 0x0, 0x0, 0x7, 0xff, - 0x5, 0xfe, 0x40, 0x0, 0x5f, 0xff, 0x0, 0x8f, - 0xfd, 0xbe, 0xfc, 0xff, 0x0, 0x4, 0xbe, 0xfd, - 0x71, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfb, - 0x1, 0xa4, 0x0, 0x0, 0x2d, 0xf5, 0x4, 0xff, - 0xfc, 0xbd, 0xff, 0xa0, 0x0, 0x28, 0xce, 0xfe, - 0xb5, 0x0, - - /* U+0068 "h" */ - 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, - 0x3, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb1, - 0x9e, 0xfe, 0x91, 0x3, 0xfd, 0xef, 0xdd, 0xff, - 0xd0, 0x3f, 0xfd, 0x20, 0x2, 0xdf, 0x73, 0xff, - 0x20, 0x0, 0x4, 0xfc, 0x3f, 0xd0, 0x0, 0x0, - 0x1f, 0xd3, 0xfb, 0x0, 0x0, 0x0, 0xfe, 0x3f, - 0xb0, 0x0, 0x0, 0xf, 0xe3, 0xfb, 0x0, 0x0, - 0x0, 0xfe, 0x3f, 0xb0, 0x0, 0x0, 0xf, 0xe3, - 0xfb, 0x0, 0x0, 0x0, 0xfe, 0x3f, 0xb0, 0x0, - 0x0, 0xf, 0xe0, - - /* U+0069 "i" */ - 0x3e, 0xb0, 0x7f, 0xf0, 0x8, 0x40, 0x0, 0x0, - 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, - 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, - 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, - - /* U+006A "j" */ - 0x0, 0x2, 0xec, 0x0, 0x0, 0x5f, 0xf1, 0x0, - 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xfd, 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x1, 0xfd, - 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x1, 0xfd, 0x0, - 0x0, 0x1f, 0xd0, 0x0, 0x1, 0xfd, 0x0, 0x0, - 0x1f, 0xd0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x1f, - 0xd0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x1f, 0xd0, - 0x0, 0x5, 0xfa, 0x7, 0xdb, 0xff, 0x40, 0x7e, - 0xfd, 0x50, 0x0, - - /* U+006B "k" */ - 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xb0, 0x0, 0x2, 0xdf, 0x50, 0x3f, 0xb0, - 0x0, 0x2e, 0xf6, 0x0, 0x3f, 0xb0, 0x3, 0xef, - 0x60, 0x0, 0x3f, 0xb0, 0x3f, 0xf6, 0x0, 0x0, - 0x3f, 0xb4, 0xff, 0x90, 0x0, 0x0, 0x3f, 0xef, - 0xff, 0xf2, 0x0, 0x0, 0x3f, 0xff, 0x59, 0xfd, - 0x0, 0x0, 0x3f, 0xf4, 0x0, 0xcf, 0x90, 0x0, - 0x3f, 0xb0, 0x0, 0x1e, 0xf6, 0x0, 0x3f, 0xb0, - 0x0, 0x4, 0xff, 0x20, 0x3f, 0xb0, 0x0, 0x0, - 0x7f, 0xd0, - - /* U+006C "l" */ - 0x3f, 0xb3, 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, 0xb3, - 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, - 0xb3, 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, 0xb0, - - /* U+006D "m" */ - 0x3f, 0xa3, 0xae, 0xfd, 0x70, 0x5, 0xcf, 0xfc, - 0x50, 0x3, 0xfd, 0xfe, 0xbc, 0xff, 0xaa, 0xfe, - 0xbc, 0xff, 0x70, 0x3f, 0xfb, 0x10, 0x3, 0xff, - 0xf9, 0x0, 0x4, 0xff, 0x13, 0xff, 0x10, 0x0, - 0x9, 0xfe, 0x0, 0x0, 0xb, 0xf4, 0x3f, 0xd0, - 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x8f, 0x63, - 0xfb, 0x0, 0x0, 0x5, 0xf9, 0x0, 0x0, 0x8, - 0xf6, 0x3f, 0xb0, 0x0, 0x0, 0x5f, 0x90, 0x0, - 0x0, 0x8f, 0x63, 0xfb, 0x0, 0x0, 0x5, 0xf9, - 0x0, 0x0, 0x8, 0xf6, 0x3f, 0xb0, 0x0, 0x0, - 0x5f, 0x90, 0x0, 0x0, 0x8f, 0x63, 0xfb, 0x0, - 0x0, 0x5, 0xf9, 0x0, 0x0, 0x8, 0xf6, 0x3f, - 0xb0, 0x0, 0x0, 0x5f, 0x90, 0x0, 0x0, 0x8f, - 0x60, - - /* U+006E "n" */ - 0x3f, 0xa2, 0xae, 0xfe, 0x91, 0x3, 0xfd, 0xff, - 0xcb, 0xef, 0xd0, 0x3f, 0xfc, 0x10, 0x1, 0xcf, - 0x73, 0xff, 0x20, 0x0, 0x4, 0xfc, 0x3f, 0xd0, - 0x0, 0x0, 0x1f, 0xd3, 0xfb, 0x0, 0x0, 0x0, - 0xfe, 0x3f, 0xb0, 0x0, 0x0, 0xf, 0xe3, 0xfb, - 0x0, 0x0, 0x0, 0xfe, 0x3f, 0xb0, 0x0, 0x0, - 0xf, 0xe3, 0xfb, 0x0, 0x0, 0x0, 0xfe, 0x3f, - 0xb0, 0x0, 0x0, 0xf, 0xe0, - - /* U+006F "o" */ - 0x0, 0x3, 0xae, 0xfd, 0x91, 0x0, 0x0, 0x7f, - 0xfd, 0xce, 0xfe, 0x30, 0x5, 0xfe, 0x40, 0x0, - 0x7f, 0xe1, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xf7, - 0xf, 0xe0, 0x0, 0x0, 0x3, 0xfb, 0x2f, 0xc0, - 0x0, 0x0, 0x1, 0xfd, 0xf, 0xe0, 0x0, 0x0, - 0x3, 0xfb, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xf7, - 0x4, 0xfe, 0x40, 0x0, 0x7f, 0xe1, 0x0, 0x7f, - 0xfd, 0xce, 0xfe, 0x30, 0x0, 0x3, 0xae, 0xfd, - 0x91, 0x0, - - /* U+0070 "p" */ - 0x3f, 0xa2, 0x9e, 0xfd, 0x92, 0x0, 0x3f, 0xce, - 0xfb, 0xad, 0xfe, 0x40, 0x3f, 0xfd, 0x20, 0x0, - 0x6f, 0xe1, 0x3f, 0xf3, 0x0, 0x0, 0x9, 0xf7, - 0x3f, 0xd0, 0x0, 0x0, 0x4, 0xfa, 0x3f, 0xb0, - 0x0, 0x0, 0x2, 0xfc, 0x3f, 0xd0, 0x0, 0x0, - 0x4, 0xfa, 0x3f, 0xf3, 0x0, 0x0, 0xa, 0xf7, - 0x3f, 0xfe, 0x30, 0x0, 0x8f, 0xe1, 0x3f, 0xde, - 0xfd, 0xce, 0xff, 0x40, 0x3f, 0xb1, 0x9e, 0xfe, - 0x92, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x4, 0xbe, 0xfc, 0x60, 0xfd, 0x0, 0x8f, - 0xfd, 0xce, 0xfa, 0xfd, 0x5, 0xfe, 0x40, 0x0, - 0x7f, 0xfd, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xfd, - 0xf, 0xe0, 0x0, 0x0, 0x3, 0xfd, 0x2f, 0xc0, - 0x0, 0x0, 0x1, 0xfd, 0xf, 0xe0, 0x0, 0x0, - 0x3, 0xfd, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xfd, - 0x5, 0xfe, 0x40, 0x0, 0x7f, 0xfd, 0x0, 0x8f, - 0xfd, 0xce, 0xfb, 0xfd, 0x0, 0x4, 0xbe, 0xfc, - 0x61, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xfd, - - /* U+0072 "r" */ - 0x3f, 0xa1, 0x9e, 0x83, 0xfc, 0xef, 0xf7, 0x3f, - 0xfe, 0x40, 0x3, 0xff, 0x40, 0x0, 0x3f, 0xe0, - 0x0, 0x3, 0xfc, 0x0, 0x0, 0x3f, 0xb0, 0x0, - 0x3, 0xfb, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x3, - 0xfb, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x5c, 0xef, 0xea, 0x50, 0x9, 0xff, 0xcb, - 0xdf, 0xd0, 0x1f, 0xe1, 0x0, 0x2, 0x30, 0x2f, - 0xd0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x63, 0x0, - 0x0, 0x2, 0xcf, 0xff, 0xfb, 0x30, 0x0, 0x1, - 0x47, 0xbf, 0xf2, 0x0, 0x0, 0x0, 0x9, 0xf6, - 0x9, 0x30, 0x0, 0xb, 0xf5, 0x5f, 0xfe, 0xbb, - 0xef, 0xc0, 0x5, 0xae, 0xfe, 0xc7, 0x0, - - /* U+0074 "t" */ - 0x0, 0x78, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, - 0x0, 0xef, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf1, - 0x7a, 0xff, 0xaa, 0xa0, 0x0, 0xef, 0x0, 0x0, - 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, - 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, - 0x0, 0xef, 0x0, 0x0, 0x0, 0xcf, 0x40, 0x0, - 0x0, 0x6f, 0xfb, 0xd7, 0x0, 0x7, 0xdf, 0xd5, - - /* U+0075 "u" */ - 0x4f, 0xa0, 0x0, 0x0, 0x3f, 0xb4, 0xfa, 0x0, - 0x0, 0x3, 0xfb, 0x4f, 0xa0, 0x0, 0x0, 0x3f, - 0xb4, 0xfa, 0x0, 0x0, 0x3, 0xfb, 0x4f, 0xa0, - 0x0, 0x0, 0x3f, 0xb4, 0xfa, 0x0, 0x0, 0x3, - 0xfb, 0x4f, 0xb0, 0x0, 0x0, 0x5f, 0xb2, 0xfd, - 0x0, 0x0, 0x9, 0xfb, 0xd, 0xf7, 0x0, 0x5, - 0xff, 0xb0, 0x4f, 0xfd, 0xad, 0xfc, 0xfb, 0x0, - 0x3b, 0xef, 0xd7, 0x2f, 0xb0, - - /* U+0076 "v" */ - 0xd, 0xf2, 0x0, 0x0, 0x0, 0xef, 0x0, 0x6f, - 0x90, 0x0, 0x0, 0x5f, 0x90, 0x0, 0xff, 0x0, - 0x0, 0xb, 0xf2, 0x0, 0x9, 0xf6, 0x0, 0x2, - 0xfb, 0x0, 0x0, 0x2f, 0xc0, 0x0, 0x9f, 0x40, - 0x0, 0x0, 0xbf, 0x30, 0xf, 0xd0, 0x0, 0x0, - 0x4, 0xfa, 0x6, 0xf7, 0x0, 0x0, 0x0, 0xd, - 0xf1, 0xdf, 0x10, 0x0, 0x0, 0x0, 0x7f, 0xbf, - 0x90, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, - - /* U+0077 "w" */ - 0xbf, 0x10, 0x0, 0x0, 0xef, 0x0, 0x0, 0x1, - 0xfa, 0x5f, 0x70, 0x0, 0x5, 0xff, 0x60, 0x0, - 0x6, 0xf5, 0xf, 0xd0, 0x0, 0xb, 0xff, 0xb0, - 0x0, 0xc, 0xe0, 0xa, 0xf2, 0x0, 0x1f, 0xab, - 0xf1, 0x0, 0x1f, 0x90, 0x4, 0xf8, 0x0, 0x6f, - 0x55, 0xf7, 0x0, 0x7f, 0x30, 0x0, 0xed, 0x0, - 0xce, 0x0, 0xec, 0x0, 0xde, 0x0, 0x0, 0x8f, - 0x32, 0xf9, 0x0, 0x9f, 0x23, 0xf8, 0x0, 0x0, - 0x3f, 0x98, 0xf3, 0x0, 0x3f, 0x88, 0xf2, 0x0, - 0x0, 0xd, 0xee, 0xd0, 0x0, 0xd, 0xde, 0xc0, - 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x7, 0xff, - 0x70, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x2, - 0xff, 0x10, 0x0, - - /* U+0078 "x" */ - 0x2f, 0xe1, 0x0, 0x0, 0xdf, 0x30, 0x6f, 0xb0, - 0x0, 0xaf, 0x60, 0x0, 0xaf, 0x70, 0x6f, 0xa0, - 0x0, 0x0, 0xdf, 0x5f, 0xd1, 0x0, 0x0, 0x3, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0xb, 0xfb, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xf6, 0x0, 0x0, 0x2, - 0xfe, 0x2e, 0xf2, 0x0, 0x0, 0xdf, 0x40, 0x3f, - 0xd0, 0x0, 0x9f, 0x80, 0x0, 0x8f, 0xa0, 0x5f, - 0xc0, 0x0, 0x0, 0xcf, 0x60, - - /* U+0079 "y" */ - 0xd, 0xf2, 0x0, 0x0, 0x0, 0xef, 0x0, 0x6f, - 0x90, 0x0, 0x0, 0x5f, 0x80, 0x0, 0xef, 0x0, - 0x0, 0xb, 0xf2, 0x0, 0x8, 0xf7, 0x0, 0x2, - 0xfb, 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x9f, 0x40, - 0x0, 0x0, 0xaf, 0x40, 0xf, 0xd0, 0x0, 0x0, - 0x3, 0xfb, 0x6, 0xf6, 0x0, 0x0, 0x0, 0xd, - 0xf2, 0xdf, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xcf, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0x40, 0x0, 0x0, 0x3, 0x0, - 0x3f, 0xc0, 0x0, 0x0, 0x2, 0xfd, 0xbf, 0xf3, - 0x0, 0x0, 0x0, 0x8, 0xef, 0xc4, 0x0, 0x0, - 0x0, 0x0, - - /* U+007A "z" */ - 0x1f, 0xff, 0xff, 0xff, 0xf8, 0xa, 0xaa, 0xaa, - 0xaf, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0x90, 0x0, - 0x0, 0x6, 0xfc, 0x0, 0x0, 0x0, 0x3f, 0xe1, - 0x0, 0x0, 0x1, 0xdf, 0x40, 0x0, 0x0, 0xb, - 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xb0, 0x0, 0x0, - 0x4, 0xfd, 0x10, 0x0, 0x0, 0x1e, 0xfc, 0xaa, - 0xaa, 0xa6, 0x3f, 0xff, 0xff, 0xff, 0xfb, - - /* U+007B "{" */ - 0x0, 0x3c, 0xfa, 0x0, 0xef, 0xc6, 0x3, 0xfc, - 0x0, 0x4, 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x4, - 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x5, 0xfa, 0x0, - 0x8e, 0xf6, 0x0, 0xdf, 0xe2, 0x0, 0x7, 0xf9, - 0x0, 0x4, 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x4, - 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x4, 0xfa, 0x0, - 0x2, 0xfd, 0x0, 0x0, 0xef, 0xc6, 0x0, 0x3c, - 0xfa, - - /* U+007C "|" */ - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, - - /* U+007D "}" */ - 0xaf, 0xc3, 0x0, 0x6c, 0xfe, 0x0, 0x0, 0xcf, - 0x30, 0x0, 0xaf, 0x40, 0x0, 0xaf, 0x40, 0x0, - 0xaf, 0x40, 0x0, 0xaf, 0x40, 0x0, 0x9f, 0x50, - 0x0, 0x5f, 0xe8, 0x0, 0x2e, 0xfd, 0x0, 0x9f, - 0x70, 0x0, 0x9f, 0x40, 0x0, 0xaf, 0x40, 0x0, - 0xaf, 0x40, 0x0, 0xaf, 0x40, 0x0, 0xaf, 0x40, - 0x0, 0xcf, 0x30, 0x6c, 0xfe, 0x0, 0xaf, 0xc3, - 0x0, - - /* U+007E "~" */ - 0x9, 0xee, 0x60, 0x0, 0xd6, 0x7f, 0xab, 0xfb, - 0x26, 0xf3, 0xb9, 0x0, 0x5e, 0xff, 0x90, 0x31, - 0x0, 0x0, 0x32, 0x0, - - /* U+00B0 "°" */ - 0x0, 0x6d, 0xea, 0x10, 0x7, 0xe5, 0x3b, 0xc0, - 0xe, 0x40, 0x0, 0xe4, 0x1f, 0x0, 0x0, 0xb7, - 0xf, 0x30, 0x0, 0xd5, 0x8, 0xc2, 0x8, 0xe0, - 0x0, 0x9f, 0xfc, 0x20, 0x0, 0x0, 0x10, 0x0, - - /* U+2022 "•" */ - 0x9, 0xa2, 0x8f, 0xfc, 0x9f, 0xfd, 0x2d, 0xe5, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x15, 0xae, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x69, 0xff, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xfe, 0x95, 0x0, 0x8, 0xff, - 0x0, 0x0, 0xf, 0xff, 0xc7, 0x30, 0x0, 0x0, - 0x8, 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0xf, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, - 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, - 0x1, 0x7b, 0xbd, 0xff, 0x0, 0x0, 0xf, 0xf8, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x0, 0x13, - 0x3f, 0xf8, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0x2b, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xfc, 0xdf, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x6, 0xef, 0xff, 0xa1, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x7f, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x8a, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F008 "" */ - 0xc4, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x4c, 0xfd, 0xcd, 0xff, 0xee, 0xee, 0xee, - 0xee, 0xff, 0xdc, 0xdf, 0xfa, 0x8a, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xb8, 0xaf, 0xf4, 0x3, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x40, 0x4f, - 0xf4, 0x4, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0x50, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x47, 0xfd, 0x77, - 0x77, 0x77, 0x77, 0xdf, 0x84, 0x7f, 0xf4, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x4f, - 0xf7, 0x47, 0xfd, 0x77, 0x77, 0x77, 0x77, 0xdf, - 0x84, 0x7f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x4, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0x50, 0x4f, 0xf4, 0x3, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x40, 0x4f, - 0xfa, 0x8a, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xb8, 0xaf, 0xfd, 0xcd, 0xff, 0xee, 0xee, 0xee, - 0xee, 0xff, 0xdc, 0xdf, 0xc4, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x4c, - - /* U+F00B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xfa, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xfd, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xf9, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xf9, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xfa, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xf9, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfd, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0xfa, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0x60, 0x6, 0xe4, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xf6, 0x0, 0x7f, 0xff, 0x40, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0x60, 0x0, 0xff, 0xff, - 0xf4, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0x40, 0x4f, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x6, 0x70, 0x0, 0x0, 0x0, 0x18, 0x40, 0x8f, - 0xfb, 0x0, 0x0, 0x1, 0xdf, 0xf4, 0xff, 0xff, - 0xb0, 0x0, 0x1d, 0xff, 0xfb, 0x7f, 0xff, 0xfb, - 0x1, 0xdf, 0xff, 0xf4, 0x8, 0xff, 0xff, 0xbd, - 0xff, 0xff, 0x40, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1d, 0xff, - 0xff, 0x48, 0xff, 0xff, 0xb0, 0xcf, 0xff, 0xf4, - 0x0, 0x8f, 0xff, 0xf9, 0xdf, 0xff, 0x40, 0x0, - 0x8, 0xff, 0xf9, 0x2e, 0xf4, 0x0, 0x0, 0x0, - 0x8f, 0xc0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, - 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x26, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, - 0xdf, 0xf4, 0x0, 0x72, 0x0, 0x0, 0x0, 0xb, - 0xfe, 0x10, 0xdf, 0xf4, 0x9, 0xfe, 0x30, 0x0, - 0x0, 0xaf, 0xff, 0x50, 0xdf, 0xf4, 0xe, 0xff, - 0xe1, 0x0, 0x5, 0xff, 0xfb, 0x0, 0xdf, 0xf4, - 0x5, 0xff, 0xfb, 0x0, 0xd, 0xff, 0xb0, 0x0, - 0xdf, 0xf4, 0x0, 0x5f, 0xff, 0x40, 0x4f, 0xff, - 0x20, 0x0, 0xdf, 0xf4, 0x0, 0xb, 0xff, 0xa0, - 0x8f, 0xfb, 0x0, 0x0, 0xdf, 0xf4, 0x0, 0x4, - 0xff, 0xf0, 0xbf, 0xf7, 0x0, 0x0, 0xdf, 0xf4, - 0x0, 0x1, 0xff, 0xf1, 0xbf, 0xf6, 0x0, 0x0, - 0xdf, 0xf4, 0x0, 0x0, 0xff, 0xf2, 0xbf, 0xf7, - 0x0, 0x0, 0x8d, 0xc1, 0x0, 0x0, 0xff, 0xf1, - 0x8f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf0, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xb0, 0xe, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x6, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, - 0x0, 0xaf, 0xff, 0xd5, 0x10, 0x3, 0x9f, 0xff, - 0xf2, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x9e, 0xff, 0xff, 0xb6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x2b, 0xff, 0xff, 0xb2, 0x0, 0x10, 0x0, - 0x0, 0x8f, 0x87, 0xff, 0xff, 0xff, 0xff, 0x79, - 0xf8, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x2f, 0xff, - 0xff, 0xff, 0xc7, 0x7c, 0xff, 0xff, 0xff, 0xf2, - 0x7, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0x70, 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, - 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xe0, - 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x6f, - 0xff, 0xf1, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, - 0x7, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0x70, 0x2f, 0xff, 0xff, 0xff, 0xc7, 0x7c, - 0xff, 0xff, 0xff, 0xf2, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x8f, 0x97, 0xff, 0xff, 0xff, 0xff, 0x78, - 0xf8, 0x0, 0x0, 0x1, 0x0, 0x1b, 0xff, 0xff, - 0xb1, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, - 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x0, - 0x67, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfe, 0x20, 0xf, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0x51, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, - 0x8f, 0xff, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xfa, 0x0, 0x4e, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x8, 0xd3, - 0x2d, 0xff, 0xff, 0x10, 0x0, 0x0, 0xa, 0xff, - 0xf5, 0x1b, 0xff, 0xf5, 0xb, 0xff, 0xf4, 0x0, - 0x0, 0x1c, 0xff, 0xe2, 0x2d, 0xff, 0xff, 0xf7, - 0x8, 0xff, 0xf6, 0x0, 0x3e, 0xff, 0xc1, 0x4e, - 0xff, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xf9, 0xe, - 0xff, 0x90, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x13, 0xef, 0xf6, 0x4f, 0x70, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x31, 0xcc, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0x80, 0x1, 0xef, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0xe, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0x60, 0x0, 0xef, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0xe, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0x40, 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x56, 0x65, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xee, 0xef, 0xff, 0xff, 0xfe, 0xee, - 0x70, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x7a, 0xaa, 0xaa, 0x91, - 0x4f, 0xf4, 0x19, 0xaa, 0xaa, 0xa7, 0xff, 0xff, - 0xff, 0xfd, 0x23, 0x32, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0xf, 0x48, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xef, 0xff, - 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x41, - - /* U+F01C "" */ - 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xa, 0xff, 0x98, 0x88, 0x88, 0x88, 0x88, 0xdf, - 0xf3, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xd0, 0x0, 0x1, 0xef, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0x80, 0x0, 0xaf, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x20, 0x5f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, - 0xd, 0xff, 0x98, 0x88, 0x70, 0x0, 0x0, 0x3, - 0x88, 0x88, 0xdf, 0xf5, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x7f, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, - 0x7, 0xba, 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, - 0xb5, 0x0, 0xb, 0xff, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0xb, 0xff, 0x0, 0xa, - 0xff, 0xff, 0xdb, 0xbe, 0xff, 0xff, 0x9a, 0xff, - 0x0, 0xaf, 0xff, 0xa2, 0x0, 0x0, 0x3b, 0xff, - 0xff, 0xff, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xd, 0xff, 0x60, 0x0, - 0x0, 0x7, 0xba, 0x9c, 0xff, 0xff, 0x3f, 0xfc, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0xf6, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x6f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0xcf, 0xf3, 0xff, 0xff, 0xc9, 0xaa, - 0x70, 0x0, 0x0, 0x7, 0xff, 0xd0, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, - 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x3b, 0xff, - 0xf9, 0x0, 0xff, 0xa9, 0xff, 0xff, 0xeb, 0xbd, - 0xff, 0xff, 0xa0, 0x0, 0xff, 0xb0, 0x5d, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xb0, - 0x0, 0x5b, 0xff, 0xff, 0xc8, 0x10, 0x0, 0x0, - 0xab, 0x70, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x2, 0xee, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x0, - 0x0, 0x2, 0xef, 0xff, 0x47, 0x77, 0x7e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, - 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x89, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x73, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x1f, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x5f, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x4f, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x1f, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x85, 0x4, 0x77, 0x77, 0xef, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xee, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7b, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x0, 0x9, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xee, 0x0, 0x0, 0x0, 0x9, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, - 0x0, 0x8, 0x70, 0x8, 0xfd, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0x0, 0x0, 0xef, 0xb0, 0xc, - 0xf6, 0x4, 0x77, 0x77, 0xef, 0xff, 0xf0, 0x0, - 0x2, 0xdf, 0x80, 0x3f, 0xd0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x74, 0x1, 0xff, 0x10, 0xcf, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xf4, - 0x8, 0xf7, 0x7, 0xf6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x5f, 0xc0, 0x3f, 0xa0, 0x4f, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x2, - 0xfb, 0x4, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x5f, 0xc0, 0x3f, 0xa0, 0x5f, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xf4, 0x8, 0xf7, - 0x7, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x74, 0x2, 0xff, 0x10, 0xcf, 0x30, 0x0, 0x0, - 0x9f, 0xff, 0xf0, 0x0, 0x2, 0xef, 0x80, 0x3f, - 0xd0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, - 0xef, 0xb0, 0xc, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xf0, 0x0, 0x8, 0x70, 0x8, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, - 0x20, 0x0, 0x0, - - /* U+F03E "" */ - 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf6, 0x38, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x7f, 0xff, 0xff, 0xfb, 0xef, - 0xff, 0xff, 0xff, 0x80, 0x0, 0xcf, 0xff, 0xff, - 0x90, 0x3e, 0xff, 0xff, 0xff, 0xfa, 0x7c, 0xff, - 0xff, 0xf9, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0x90, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0x90, 0x6f, 0xf9, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xf9, 0x0, 0x6, 0x90, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xc8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x8c, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x1, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0xff, 0xa6, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0xef, 0x91, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xbf, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xf7, - 0x5f, 0xf9, 0x7, 0xcf, 0xff, 0xff, 0xf2, 0xc, - 0xff, 0xb3, 0x9, 0xff, 0xff, 0x80, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x15, 0x77, - 0x40, 0x0, 0x0, - - /* U+F048 "" */ - 0x47, 0x60, 0x0, 0x0, 0x0, 0x16, 0x1b, 0xff, - 0x10, 0x0, 0x0, 0x2d, 0xfb, 0xbf, 0xf1, 0x0, - 0x0, 0x2e, 0xff, 0xcb, 0xff, 0x10, 0x0, 0x3e, - 0xff, 0xfc, 0xbf, 0xf1, 0x0, 0x4f, 0xff, 0xff, - 0xcb, 0xff, 0x10, 0x5f, 0xff, 0xff, 0xfc, 0xbf, - 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xcb, 0xff, 0x9f, - 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, - 0xff, 0x4e, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xf1, - 0x2d, 0xff, 0xff, 0xff, 0xcb, 0xff, 0x10, 0x1c, - 0xff, 0xff, 0xfc, 0xbf, 0xf1, 0x0, 0xc, 0xff, - 0xff, 0xcb, 0xff, 0x10, 0x0, 0xb, 0xff, 0xfc, - 0xbf, 0xf1, 0x0, 0x0, 0xa, 0xff, 0xca, 0xff, - 0x10, 0x0, 0x0, 0x8, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x6, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xd4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x20, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x6, 0x77, 0x77, 0x30, 0x0, 0x6, 0x77, 0x77, - 0x30, 0xbf, 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, - 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, - 0xef, 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, - 0xf6, 0x6f, 0xff, 0xff, 0xc1, 0x0, 0x6f, 0xff, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F04D "" */ - 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x30, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F051 "" */ - 0x5, 0x20, 0x0, 0x0, 0x0, 0x57, 0x66, 0xff, - 0x40, 0x0, 0x0, 0xc, 0xff, 0x8f, 0xff, 0x60, - 0x0, 0x0, 0xdf, 0xf8, 0xff, 0xff, 0x70, 0x0, - 0xd, 0xff, 0x8f, 0xff, 0xff, 0x80, 0x0, 0xdf, - 0xf8, 0xff, 0xff, 0xff, 0x90, 0xd, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xb0, 0xdf, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xcd, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0x5d, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0x40, 0xdf, 0xf8, 0xff, 0xff, 0xfe, - 0x30, 0xd, 0xff, 0x8f, 0xff, 0xfe, 0x20, 0x0, - 0xdf, 0xf8, 0xff, 0xfd, 0x20, 0x0, 0xd, 0xff, - 0x7f, 0xfd, 0x10, 0x0, 0x0, 0xdf, 0xf3, 0xfb, - 0x10, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0x80, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x40, 0x0, 0x0, 0x5f, 0xff, 0xe2, 0x0, 0x0, - 0x5f, 0xff, 0xe2, 0x0, 0x0, 0x5f, 0xff, 0xe3, - 0x0, 0x0, 0x5f, 0xff, 0xe3, 0x0, 0x0, 0x5f, - 0xff, 0xe3, 0x0, 0x0, 0x5f, 0xff, 0xe3, 0x0, - 0x0, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe3, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x5f, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F054 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdb, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, - 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x9, 0xff, - 0xfc, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, - 0x9, 0xff, 0xfc, 0x0, 0x0, 0x9, 0xff, 0xfc, - 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x2, 0xdb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x2, 0x55, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x37, - 0x77, 0x77, 0x8f, 0xff, 0xc7, 0x77, 0x77, 0x60, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x14, 0x44, 0x44, 0x5f, 0xff, - 0xb4, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, - 0x0, 0x0, 0x0, - - /* U+F068 "" */ - 0x49, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x2, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x10, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x6, 0xad, 0xff, 0xec, 0x83, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xef, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0x92, 0x0, 0x5, 0xdf, 0xff, - 0x90, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x2, - 0x52, 0x1, 0xcf, 0xff, 0xb0, 0x0, 0x4, 0xff, - 0xff, 0x80, 0x0, 0x7f, 0xf9, 0x1, 0xef, 0xff, - 0xb0, 0x1, 0xef, 0xff, 0xf0, 0x0, 0x8, 0xff, - 0xf7, 0x8, 0xff, 0xff, 0x80, 0xaf, 0xff, 0xfb, - 0x2, 0x25, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, - 0x2f, 0xff, 0xff, 0xa0, 0x7f, 0xff, 0xff, 0xff, - 0x2, 0xff, 0xff, 0xf7, 0x9f, 0xff, 0xfb, 0x5, - 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0x21, - 0xef, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xf5, 0x7, - 0xff, 0xff, 0x80, 0x3, 0xff, 0xff, 0x80, 0x1a, - 0xff, 0xe5, 0x1, 0xef, 0xff, 0xb0, 0x0, 0x4, - 0xff, 0xff, 0x50, 0x0, 0x10, 0x1, 0xcf, 0xff, - 0xb0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0x92, 0x0, - 0x5, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xef, 0xff, 0xfc, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xad, 0xef, 0xec, - 0x83, 0x0, 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xe4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x70, 0x4, 0x8c, 0xef, 0xed, 0x94, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0xef, 0xff, 0xfe, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xc4, 0x0, - 0x4, 0xcf, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x60, 0x3, 0x10, 0x9, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xf9, 0x4f, 0xfa, 0x0, 0xcf, 0xff, 0xe1, 0x0, - 0x0, 0xb, 0xb0, 0x0, 0x4e, 0xff, 0xef, 0xff, - 0xa0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x6f, 0xfd, - 0x30, 0x1, 0xcf, 0xff, 0xff, 0xf1, 0xf, 0xff, - 0xff, 0x50, 0x0, 0xbf, 0xff, 0xf6, 0x0, 0x8, - 0xff, 0xff, 0xf3, 0xe, 0xff, 0xff, 0xa0, 0x0, - 0x6f, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, 0xf2, - 0xf, 0xff, 0xff, 0x50, 0x0, 0xc, 0xff, 0xff, - 0x40, 0x0, 0x2, 0xdf, 0xfe, 0x8f, 0xff, 0xfa, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xc0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xc4, 0x0, 0x0, 0x3, 0xef, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xfe, 0xe3, - 0x0, 0x1b, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x9d, 0xef, 0xec, 0x20, 0x0, 0x8f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x60, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xa2, 0x24, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x1, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xa0, 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x3, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xc0, 0x4, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xd0, 0x5, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xf9, 0x9c, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xf5, 0x2b, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0x90, 0x1, 0xff, 0xff, 0xff, 0xfe, 0x10, - 0x1, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, - 0xff, 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x1, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x40, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0xef, 0xff, - 0xf6, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0x50, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xf7, 0x22, 0x23, 0xdf, 0xf8, - 0x9, 0xff, 0xf7, 0x2f, 0xff, 0x80, 0x0, 0x0, - 0x2e, 0xb0, 0x7f, 0xff, 0x90, 0xf, 0xf8, 0x0, - 0x0, 0x0, 0x3, 0x6, 0xff, 0xfa, 0x0, 0x7, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xfd, 0x3, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xe1, 0x3f, 0x90, 0xf, 0xf8, 0x0, - 0x22, 0x23, 0xdf, 0xfe, 0x22, 0xef, 0xf7, 0x2f, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0x50, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, - 0xf6, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x30, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xae, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf9, 0x2, 0xef, 0xff, 0x50, 0x0, 0x0, 0xcf, - 0xff, 0x90, 0x0, 0x2e, 0xff, 0xf5, 0x0, 0xc, - 0xff, 0xf9, 0x0, 0x0, 0x2, 0xef, 0xff, 0x50, - 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xf2, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xe1, 0x6, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x29, 0x20, - - /* U+F078 "" */ - 0x6, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, - 0x20, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xe1, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xf2, 0xb, 0xff, 0xf9, 0x0, 0x0, - 0x3, 0xef, 0xff, 0x50, 0x0, 0xbf, 0xff, 0x90, - 0x0, 0x3e, 0xff, 0xf5, 0x0, 0x0, 0xb, 0xff, - 0xf9, 0x3, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xae, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, - 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x9c, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xd1, 0x0, 0x58, 0x88, 0x88, 0x88, 0x88, 0x81, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x20, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xe2, 0x4e, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x8f, 0xfc, 0xff, 0xcf, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf6, 0x0, - 0x0, 0x7f, 0xc2, 0xff, 0x67, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x3, 0x1, - 0xff, 0x60, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf6, 0x0, 0x0, - 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x3, 0xd7, 0x1f, 0xf6, - 0x3d, 0x70, 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x7f, 0xf9, 0xef, 0xf0, 0x0, - 0x1, 0xff, 0xb8, 0x88, 0x88, 0x88, 0x32, 0xef, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x2e, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x2, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, - - /* U+F07B "" */ - 0x5e, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb8, 0x88, 0x88, 0x88, 0x60, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x11, 0x1b, 0xff, 0xff, 0x51, 0x11, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x7a, 0xaa, 0xaa, 0x2b, - 0xff, 0xff, 0x42, 0xaa, 0xaa, 0xa7, 0xff, 0xff, - 0xff, 0x82, 0x67, 0x76, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x77, 0x77, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0xf, 0x48, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xef, 0xff, - 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x41, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xfe, 0xb5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x1, 0x30, 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x29, 0xff, 0x70, 0x0, 0x3e, 0xff, - 0xff, 0x30, 0x0, 0x4, 0xbf, 0xff, 0xff, 0x40, - 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xfe, 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x10, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xea, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x57, 0x64, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C4 "" */ - 0x0, 0x25, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x4, - 0xaa, 0x50, 0x7f, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x8f, 0xff, 0xf5, 0xef, 0xd3, 0x7f, 0xf6, 0x0, - 0x8, 0xff, 0xff, 0xb0, 0xff, 0x80, 0xf, 0xf7, - 0x0, 0x8f, 0xff, 0xfb, 0x0, 0xdf, 0xe7, 0xaf, - 0xf5, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x5f, 0xff, - 0xff, 0xfd, 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x5, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x1, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x25, 0x9f, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfb, - 0x6f, 0xff, 0xfd, 0x10, 0x0, 0xef, 0xd3, 0x7f, - 0xf5, 0x5, 0xff, 0xff, 0xd1, 0x0, 0xff, 0x80, - 0xf, 0xf7, 0x0, 0x5f, 0xff, 0xfd, 0x10, 0xdf, - 0xe7, 0xaf, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xd1, - 0x5f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, - 0xf4, 0x5, 0xef, 0xfb, 0x10, 0x0, 0x0, 0x1, - 0x66, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x8, 0xbb, 0xbb, 0xbb, 0x50, 0x90, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x81, - 0xfb, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x81, 0xff, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0x81, 0xff, 0xf8, 0x8c, 0xc9, 0xf, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xfc, 0xf, - 0xff, 0xff, 0xff, 0xd5, 0x44, 0x43, 0xff, 0xfc, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0xff, 0xfc, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfc, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xfe, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x58, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x10, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x6, 0x77, 0x77, 0x77, 0x77, 0x77, 0x60, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xfc, 0x10, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xc0, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, - 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, 0xef, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xe4, 0x2, - 0xcf, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x2f, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0x40, 0x0, 0xf, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xfc, 0x8a, 0xff, 0xff, 0xff, 0xf4, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F0C9 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xc4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xac, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0E0 "" */ - 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0xe3, 0x1b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb1, 0x3e, 0xff, 0x70, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x7, 0xff, 0xff, 0xfb, - 0x13, 0xdf, 0xff, 0xff, 0xfd, 0x31, 0xbf, 0xff, - 0xff, 0xff, 0xe4, 0xa, 0xff, 0xff, 0xa0, 0x4e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x5d, 0xd5, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x20, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, - - /* U+F0E7 "" */ - 0x0, 0x14, 0x44, 0x44, 0x41, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, - 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x6, 0x71, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x14, 0x44, 0xbf, 0xfe, 0x44, 0x43, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xf9, 0x4f, 0xff, 0xff, - 0x40, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x3f, 0xff, - 0xff, 0x50, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xa8, 0x88, 0x88, 0x20, 0x0, 0x0, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xf0, 0xcf, 0xff, 0xff, 0x51, 0xe2, 0x0, - 0xff, 0xff, 0xf0, 0xef, 0xff, 0xff, 0x51, 0xfe, - 0x20, 0xff, 0xff, 0xf0, 0xef, 0xff, 0xff, 0x51, - 0xff, 0xe2, 0xff, 0xff, 0xf0, 0xef, 0xff, 0xff, - 0x50, 0xbb, 0xb7, 0xff, 0xff, 0xf0, 0xef, 0xff, - 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xf0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xf0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xf0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xcf, 0xff, 0xf0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x7b, - 0xbb, 0xbb, 0xbb, 0xbb, 0xb4, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, - 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x75, 0x0, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, - 0xc8, 0x8f, 0xa8, 0xaf, 0x88, 0xbf, 0x88, 0xfb, - 0x88, 0xff, 0x8f, 0xf8, 0x0, 0xf4, 0x4, 0xf0, - 0x5, 0xe0, 0xe, 0x50, 0xf, 0xf8, 0xff, 0x80, - 0xf, 0x40, 0x4f, 0x0, 0x6f, 0x0, 0xf6, 0x0, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x94, - 0x6f, 0x64, 0x8f, 0x44, 0xbb, 0x44, 0xff, 0xff, - 0x8f, 0xff, 0xf6, 0x2, 0xf2, 0x5, 0xf0, 0x8, - 0x80, 0xe, 0xff, 0xf8, 0xff, 0xff, 0x94, 0x6f, - 0x64, 0x8f, 0x44, 0xbb, 0x44, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0x80, 0xf, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xf6, 0x0, 0xff, 0x8f, 0xf8, - 0x0, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0x50, - 0xf, 0xf8, 0xff, 0xc8, 0x8f, 0xa8, 0x88, 0x88, - 0x88, 0x88, 0xfb, 0x88, 0xff, 0x8e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x7e, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x18, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x2, 0xac, 0xcc, 0xcc, 0xcd, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x27, 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+F15B "" */ - 0x24, 0x44, 0x44, 0x44, 0x30, 0x30, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xfc, 0xf, 0x60, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0xff, 0x60, 0xf, 0xff, - 0xff, 0xff, 0xfc, 0xf, 0xff, 0x60, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0xfc, 0xb, 0xbb, 0xbb, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x43, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x8c, 0xff, 0xff, 0xff, 0xfc, 0x83, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x3, 0xdf, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xd3, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x72, 0x0, - 0x0, 0x2, 0x7b, 0xff, 0xff, 0xf8, 0xa, 0xff, - 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xaf, 0xff, 0xfa, 0xbf, 0xfd, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xb0, - 0xba, 0x10, 0x0, 0x5, 0x9d, 0xef, 0xed, 0x95, - 0x0, 0x0, 0x1a, 0xb0, 0x0, 0x0, 0x0, 0x6d, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xfa, 0x53, 0x23, 0x5a, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xb1, 0x0, 0x0, - 0x0, 0x1, 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x9d, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfd, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x5b, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, - 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8, 0xff, 0xff, 0x84, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, - 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc2, 0x0, - - /* U+F241 "" */ - 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfd, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0xc, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x5b, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x8f, 0xff, - 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x81, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0xc, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, - 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc2, 0x0, - - /* U+F242 "" */ - 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfd, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x5b, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x81, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, - 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc2, 0x0, - - /* U+F243 "" */ - 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfd, 0xff, 0x81, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5b, 0xff, 0xff, 0x81, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf8, 0x1f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x81, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, - 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc2, 0x0, - - /* U+F244 "" */ - 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfd, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5b, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, - 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc2, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xfb, 0xbf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0x70, 0xa, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x32, 0x0, 0x0, 0x9e, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0x90, 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0x30, 0x0, 0xcf, 0xff, 0xf6, 0x3c, 0xf3, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x5f, 0xf9, 0x10, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0xcf, 0xff, 0xf6, - 0x33, 0x34, 0xed, 0x33, 0x33, 0x33, 0x33, 0x5f, - 0xfa, 0x10, 0x2d, 0xff, 0x90, 0x0, 0x0, 0x5f, - 0x30, 0x0, 0x0, 0x0, 0x1c, 0x30, 0x0, 0x0, - 0x32, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xf3, 0xa, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, - 0xae, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xbe, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x22, 0x20, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x34, 0x31, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xbf, 0xff, 0xff, 0xe7, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xfa, 0xff, 0xff, 0xb0, 0x0, - 0x4, 0xff, 0xff, 0xf1, 0x9f, 0xff, 0xf8, 0x0, - 0xd, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xff, 0x10, - 0x3f, 0xff, 0xff, 0xf1, 0x0, 0xbf, 0xff, 0x60, - 0x7f, 0xfd, 0x8f, 0xf1, 0x66, 0xc, 0xff, 0xa0, - 0xaf, 0xf8, 0x7, 0xf1, 0x6f, 0x13, 0xff, 0xd0, - 0xcf, 0xff, 0x70, 0x71, 0x53, 0x1e, 0xff, 0xf0, - 0xdf, 0xff, 0xf7, 0x0, 0x1, 0xdf, 0xff, 0xf0, - 0xef, 0xff, 0xff, 0x60, 0xc, 0xff, 0xff, 0xf0, - 0xef, 0xff, 0xff, 0x30, 0x7, 0xff, 0xff, 0xf0, - 0xdf, 0xff, 0xf3, 0x0, 0x10, 0x8f, 0xff, 0xf0, - 0xcf, 0xff, 0x30, 0xb1, 0x67, 0x9, 0xff, 0xf0, - 0x9f, 0xf6, 0xb, 0xf2, 0x6e, 0x2, 0xff, 0xd0, - 0x6f, 0xff, 0xcf, 0xf2, 0x52, 0x2e, 0xff, 0xa0, - 0x1f, 0xff, 0xff, 0xf2, 0x2, 0xef, 0xff, 0x50, - 0x9, 0xff, 0xff, 0xf2, 0x2e, 0xff, 0xfe, 0x0, - 0x0, 0xdf, 0xff, 0xf4, 0xef, 0xff, 0xf5, 0x0, - 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x27, 0xab, 0xb9, 0x50, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x2, 0xab, 0xbb, 0xb7, 0x0, 0x0, - 0x0, 0x57, 0x77, 0x7c, 0xff, 0xff, 0xff, 0x77, - 0x77, 0x72, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x20, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0xc, 0xff, 0x77, 0xff, 0x3b, 0xfe, 0x1e, 0xff, - 0x40, 0xc, 0xff, 0x66, 0xff, 0x2a, 0xfe, 0xe, - 0xff, 0x40, 0xc, 0xff, 0x66, 0xff, 0x2a, 0xfe, - 0xe, 0xff, 0x40, 0xc, 0xff, 0x66, 0xff, 0x2a, - 0xfe, 0xe, 0xff, 0x40, 0xc, 0xff, 0x66, 0xff, - 0x2a, 0xfe, 0xe, 0xff, 0x40, 0xc, 0xff, 0x66, - 0xff, 0x2a, 0xfe, 0xe, 0xff, 0x40, 0xc, 0xff, - 0x66, 0xff, 0x2a, 0xfe, 0xe, 0xff, 0x40, 0xc, - 0xff, 0x66, 0xff, 0x2a, 0xfe, 0xe, 0xff, 0x40, - 0xc, 0xff, 0x66, 0xff, 0x2a, 0xfe, 0xe, 0xff, - 0x40, 0xc, 0xff, 0x77, 0xff, 0x3b, 0xfe, 0x1e, - 0xff, 0x40, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x57, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x72, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x90, 0x8f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xb0, 0x8f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xb0, 0x8f, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xb0, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xb0, 0x10, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x75, 0x31, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0x85, 0xff, 0xff, 0x58, 0xff, - 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb0, - 0x4, 0xff, 0x40, 0xb, 0xff, 0xff, 0xf0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x4, 0x40, 0x4, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0xef, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x4, - 0x40, 0x4, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xb0, 0x4, 0xff, 0x40, 0xb, 0xff, - 0xff, 0xf0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x85, - 0xff, 0xff, 0x58, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x20, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x28, 0x88, 0x88, 0x88, 0x73, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1d, - 0xf6, 0xe, 0x50, 0xd6, 0x8, 0xff, 0x1d, 0xff, - 0x60, 0xe5, 0xd, 0x60, 0x8f, 0xfc, 0xff, 0xf6, - 0xe, 0x50, 0xd6, 0x8, 0xff, 0xff, 0xff, 0x60, - 0xe5, 0xd, 0x60, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xab, - 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x10, - 0x0, 0xa, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf1, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0x10, 0xc, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1d, - 0xff, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, - 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x9f, - 0xff, 0xf9, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x40, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5c, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 86, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 86, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 21, .adv_w = 125, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 39, .adv_w = 225, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 137, .adv_w = 199, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 257, .adv_w = 270, .box_w = 17, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 376, .adv_w = 220, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 481, .adv_w = 67, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 487, .adv_w = 108, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 544, .adv_w = 108, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 592, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 624, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 674, .adv_w = 73, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 686, .adv_w = 123, .box_w = 6, .box_h = 2, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 692, .adv_w = 73, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 698, .adv_w = 113, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 788, .adv_w = 213, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 879, .adv_w = 118, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 921, .adv_w = 184, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 998, .adv_w = 183, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1075, .adv_w = 214, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1173, .adv_w = 184, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1250, .adv_w = 197, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1334, .adv_w = 191, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1418, .adv_w = 206, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1502, .adv_w = 197, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1586, .adv_w = 73, .box_w = 4, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1608, .adv_w = 73, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1636, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 1686, .adv_w = 186, .box_w = 10, .box_h = 7, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 1721, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 1771, .adv_w = 183, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1848, .adv_w = 331, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 2028, .adv_w = 234, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2140, .adv_w = 242, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2231, .adv_w = 231, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2329, .adv_w = 264, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2427, .adv_w = 214, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2504, .adv_w = 203, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2574, .adv_w = 247, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2672, .adv_w = 260, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2763, .adv_w = 99, .box_w = 3, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2784, .adv_w = 164, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2854, .adv_w = 230, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2945, .adv_w = 190, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3015, .adv_w = 306, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3120, .adv_w = 260, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3211, .adv_w = 269, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3323, .adv_w = 231, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3407, .adv_w = 269, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3552, .adv_w = 233, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3636, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3720, .adv_w = 188, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3804, .adv_w = 253, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3895, .adv_w = 228, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 4007, .adv_w = 360, .box_w = 22, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4161, .adv_w = 215, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4259, .adv_w = 207, .box_w = 15, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 4364, .adv_w = 210, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4455, .adv_w = 107, .box_w = 5, .box_h = 19, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 4503, .adv_w = 113, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 4593, .adv_w = 107, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 4641, .adv_w = 187, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 4686, .adv_w = 160, .box_w = 10, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4701, .adv_w = 192, .box_w = 6, .box_h = 3, .ofs_x = 2, .ofs_y = 12}, - {.bitmap_index = 4710, .adv_w = 191, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4765, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4855, .adv_w = 183, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4916, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5006, .adv_w = 196, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5072, .adv_w = 113, .box_w = 8, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5132, .adv_w = 221, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 5222, .adv_w = 218, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5305, .adv_w = 89, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5335, .adv_w = 91, .box_w = 7, .box_h = 19, .ofs_x = -2, .ofs_y = -4}, - {.bitmap_index = 5402, .adv_w = 197, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5492, .adv_w = 89, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5515, .adv_w = 338, .box_w = 19, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5620, .adv_w = 218, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5681, .adv_w = 203, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5747, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 5837, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 5927, .adv_w = 131, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5966, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6021, .adv_w = 132, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6077, .adv_w = 217, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6138, .adv_w = 179, .box_w = 13, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 6210, .adv_w = 288, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6309, .adv_w = 177, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6370, .adv_w = 179, .box_w = 13, .box_h = 15, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 6468, .adv_w = 167, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6523, .adv_w = 112, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 6580, .adv_w = 96, .box_w = 2, .box_h = 19, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 6599, .adv_w = 112, .box_w = 6, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 6656, .adv_w = 186, .box_w = 10, .box_h = 4, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 6676, .adv_w = 134, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 6708, .adv_w = 100, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 6716, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 6926, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7076, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7266, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7416, .adv_w = 220, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7521, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7731, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7941, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8160, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 8370, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8543, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 8753, .adv_w = 160, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8833, .adv_w = 240, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8953, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9172, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9322, .adv_w = 220, .box_w = 14, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9469, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 9593, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9782, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9953, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10124, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 10248, .adv_w = 280, .box_w = 19, .box_h = 19, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 10429, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 10534, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 10639, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10810, .adv_w = 280, .box_w = 18, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 10855, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11028, .adv_w = 400, .box_w = 26, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 11301, .adv_w = 360, .box_w = 24, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 11553, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11743, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 11842, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 11941, .adv_w = 400, .box_w = 26, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12149, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12299, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12509, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 12730, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12901, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 13090, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13261, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 13414, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13564, .adv_w = 200, .box_w = 14, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 13711, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 13900, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14089, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14262, .adv_w = 320, .box_w = 22, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 14493, .adv_w = 240, .box_w = 15, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14651, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14889, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 15052, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 15215, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 15378, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 15541, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 15704, .adv_w = 400, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 15925, .adv_w = 280, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 16093, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 16282, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 16503, .adv_w = 400, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16691, .adv_w = 240, .box_w = 15, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 16849, .adv_w = 322, .box_w = 21, .box_h = 13, .ofs_x = 0, .ofs_y = 1} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 3, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 14, 0, 9, -7, 0, 0, - 0, 0, -18, -19, 2, 15, 7, 5, - -13, 2, 16, 1, 13, 3, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 3, -2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 0, -10, 0, 0, 0, 0, - 0, -6, 5, 6, 0, 0, -3, 0, - -2, 3, 0, -3, 0, -3, -2, -6, - 0, 0, 0, 0, -3, 0, 0, -4, - -5, 0, 0, -3, 0, -6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - -3, 0, -5, 0, -9, 0, -39, 0, - 0, -6, 0, 6, 10, 0, 0, -6, - 3, 3, 11, 6, -5, 6, 0, 0, - -18, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -9, -4, -16, 0, -13, - -2, 0, 0, 0, 0, 1, 12, 0, - -10, -3, -1, 1, 0, -5, 0, 0, - -2, -24, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -26, -3, 12, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 11, - 0, 3, 0, 0, -6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 3, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -12, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, - 6, 3, 10, -3, 0, 0, 6, -3, - -11, -44, 2, 9, 6, 1, -4, 0, - 12, 0, 10, 0, 10, 0, -30, 0, - -4, 10, 0, 11, -3, 6, 3, 0, - 0, 1, -3, 0, 0, -5, 26, 0, - 26, 0, 10, 0, 13, 4, 5, 10, - 0, 0, 0, -12, 0, 0, 0, 0, - 1, -2, 0, 2, -6, -4, -6, 2, - 0, -3, 0, 0, 0, -13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -21, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, -18, 0, -20, 0, 0, 0, - 0, -2, 0, 32, -4, -4, 3, 3, - -3, 0, -4, 3, 0, 0, -17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -31, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -20, 0, 19, 0, 0, -12, 0, - 11, 0, -22, -31, -22, -6, 10, 0, - 0, -21, 0, 4, -7, 0, -5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 10, -39, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 2, 0, 0, 0, - 0, 0, 2, 2, -4, -6, 0, -1, - -1, -3, 0, 0, -2, 0, 0, 0, - -6, 0, -3, 0, -7, -6, 0, -8, - -11, -11, -6, 0, -6, 0, -6, 0, - 0, 0, 0, -3, 0, 0, 3, 0, - 2, -3, 0, 1, 0, 0, 0, 3, - -2, 0, 0, 0, -2, 3, 3, -1, - 0, 0, 0, -6, 0, -1, 0, 0, - 0, 0, 0, 1, 0, 4, -2, 0, - -4, 0, -5, 0, 0, -2, 0, 10, - 0, 0, -3, 0, 0, 0, 0, 0, - -1, 1, -2, -2, 0, 0, -3, 0, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, -2, 0, -3, -4, 0, - 0, 0, 0, 0, 1, 0, 0, -2, - 0, -3, -3, -3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -2, 0, 0, - 0, 0, -2, -4, 0, -5, 0, -10, - -2, -10, 6, 0, 0, -6, 3, 6, - 9, 0, -8, -1, -4, 0, -1, -15, - 3, -2, 2, -17, 3, 0, 0, 1, - -17, 0, -17, -3, -28, -2, 0, -16, - 0, 6, 9, 0, 4, 0, 0, 0, - 0, 1, 0, -6, -4, 0, -10, 0, - 0, 0, -3, 0, 0, 0, -3, 0, - 0, 0, 0, 0, -2, -2, 0, -2, - -4, 0, 0, 0, 0, 0, 0, 0, - -3, -3, 0, -2, -4, -3, 0, 0, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, -3, 0, -4, - 0, -2, 0, -6, 3, 0, 0, -4, - 2, 3, 3, 0, 0, 0, 0, 0, - 0, -2, 0, 0, 0, 0, 0, 2, - 0, 0, -3, 0, -3, -2, -4, 0, - 0, 0, 0, 0, 0, 0, 3, 0, - -3, 0, 0, 0, 0, -4, -5, 0, - -6, 0, 10, -2, 1, -10, 0, 0, - 9, -16, -17, -13, -6, 3, 0, -3, - -21, -6, 0, -6, 0, -6, 5, -6, - -20, 0, -9, 0, 0, 2, -1, 3, - -2, 0, 3, 0, -10, -12, 0, -16, - -8, -7, -8, -10, -4, -9, -1, -6, - -9, 2, 0, 1, 0, -3, 0, 0, - 0, 2, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - 0, -2, 0, -1, -3, 0, -5, -7, - -7, -1, 0, -10, 0, 0, 0, 0, - 0, 0, -3, 0, 0, 0, 0, 1, - -2, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, 0, 0, - -6, 0, 0, 0, 0, -16, -10, 0, - 0, 0, -5, -16, 0, 0, -3, 3, - 0, -9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, 0, -6, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, -6, 0, - 0, 0, 0, 4, 0, 2, -6, -6, - 0, -3, -3, -4, 0, 0, 0, 0, - 0, 0, -10, 0, -3, 0, -5, -3, - 0, -7, -8, -10, -3, 0, -6, 0, - -10, 0, 0, 0, 0, 26, 0, 0, - 2, 0, 0, -4, 0, 3, 0, -14, - 0, 0, 0, 0, 0, -30, -6, 11, - 10, -3, -13, 0, 3, -5, 0, -16, - -2, -4, 3, -22, -3, 4, 0, 5, - -11, -5, -12, -11, -13, 0, 0, -19, - 0, 18, 0, 0, -2, 0, 0, 0, - -2, -2, -3, -9, -11, -1, -30, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -3, 0, -2, -3, -5, 0, 0, - -6, 0, -3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, -6, 0, 0, 6, - -1, 4, 0, -7, 3, -2, -1, -8, - -3, 0, -4, -3, -2, 0, -5, -5, - 0, 0, -3, -1, -2, -5, -4, 0, - 0, -3, 0, 3, -2, 0, -7, 0, - 0, 0, -6, 0, -5, 0, -5, -5, - 3, 0, 0, 0, 0, 0, 0, 0, - 0, -6, 3, 0, -4, 0, -2, -4, - -10, -2, -2, -2, -1, -2, -4, -1, - 0, 0, 0, 0, 0, -3, -3, -3, - 0, 0, 0, 0, 4, -2, 0, -2, - 0, 0, 0, -2, -4, -2, -3, -4, - -3, 0, 3, 13, -1, 0, -9, 0, - -2, 6, 0, -3, -13, -4, 5, 0, - 0, -15, -5, 3, -5, 2, 0, -2, - -3, -10, 0, -5, 2, 0, 0, -5, - 0, 0, 0, 3, 3, -6, -6, 0, - -5, -3, -5, -3, -3, 0, -5, 2, - -6, -5, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 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, - -2, 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, -3, -3, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, 0, -4, - 0, 0, -3, -3, 0, 0, 0, 0, - -3, 0, 0, 0, 0, -2, 0, 0, - 0, 0, 0, -2, 0, 0, 0, 0, - -5, 0, -6, 0, 0, 0, -11, 0, - 2, -7, 6, 1, -2, -15, 0, 0, - -7, -3, 0, -13, -8, -9, 0, 0, - -14, -3, -13, -12, -15, 0, -8, 0, - 3, 21, -4, 0, -7, -3, -1, -3, - -5, -9, -6, -12, -13, -7, -3, 0, - 0, -2, 0, 1, 0, 0, -22, -3, - 10, 7, -7, -12, 0, 1, -10, 0, - -16, -2, -3, 6, -29, -4, 1, 0, - 0, -21, -4, -17, -3, -23, 0, 0, - -22, 0, 19, 1, 0, -2, 0, 0, - 0, 0, -2, -2, -12, -2, 0, -21, - 0, 0, 0, 0, -10, 0, -3, 0, - -1, -9, -15, 0, 0, -2, -5, -10, - -3, 0, -2, 0, 0, 0, 0, -14, - -3, -11, -10, -3, -5, -8, -3, -5, - 0, -6, -3, -11, -5, 0, -4, -6, - -3, -6, 0, 2, 0, -2, -11, 0, - 6, 0, -6, 0, 0, 0, 0, 4, - 0, 2, -6, 13, 0, -3, -3, -4, - 0, 0, 0, 0, 0, 0, -10, 0, - -3, 0, -5, -3, 0, -7, -8, -10, - -3, 0, -6, 3, 13, 0, 0, 0, - 0, 26, 0, 0, 2, 0, 0, -4, - 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -2, -6, 0, 0, 0, 0, 0, -2, - 0, 0, 0, -3, -3, 0, 0, -6, - -3, 0, 0, -6, 0, 5, -2, 0, - 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 5, 6, 3, -3, 0, -10, - -5, 0, 10, -11, -10, -6, -6, 13, - 6, 3, -28, -2, 6, -3, 0, -3, - 4, -3, -11, 0, -3, 3, -4, -3, - -10, -3, 0, 0, 10, 6, 0, -9, - 0, -18, -4, 9, -4, -12, 1, -4, - -11, -11, -3, 13, 3, 0, -5, 0, - -9, 0, 3, 11, -7, -12, -13, -8, - 10, 0, 1, -23, -3, 3, -5, -2, - -7, 0, -7, -12, -5, -5, -3, 0, - 0, -7, -7, -3, 0, 10, 7, -3, - -18, 0, -18, -4, 0, -11, -19, -1, - -10, -5, -11, -9, 9, 0, 0, -4, - 0, -6, -3, 0, -3, -6, 0, 5, - -11, 3, 0, 0, -17, 0, -3, -7, - -5, -2, -10, -8, -11, -7, 0, -10, - -3, -7, -6, -10, -3, 0, 0, 1, - 15, -5, 0, -10, -3, 0, -3, -6, - -7, -9, -9, -12, -4, -6, 6, 0, - -5, 0, -16, -4, 2, 6, -10, -12, - -6, -11, 11, -3, 2, -30, -6, 6, - -7, -5, -12, 0, -10, -13, -4, -3, - -3, -3, -7, -10, -1, 0, 0, 10, - 9, -2, -21, 0, -19, -7, 8, -12, - -22, -6, -11, -13, -16, -11, 6, 0, - 0, 0, 0, -4, 0, 0, 3, -4, - 6, 2, -6, 6, 0, 0, -10, -1, - 0, -1, 0, 1, 1, -3, 0, 0, - 0, 0, 0, 0, -3, 0, 0, 0, - 0, 3, 10, 1, 0, -4, 0, 0, - 0, 0, -2, -2, -4, 0, 0, 0, - 1, 3, 0, 0, 0, 0, 3, 0, - -3, 0, 12, 0, 6, 1, 1, -4, - 0, 6, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 0, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -19, 0, -3, 5, 0, 10, - 0, 0, 32, 4, -6, -6, 3, 3, - -2, 1, -16, 0, 0, 15, -19, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -22, 12, 45, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -19, 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, -5, 0, 0, -6, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, -9, 0, - 0, 1, 0, 0, 3, 41, -6, -3, - 10, 9, -9, 3, 0, 0, 3, 3, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -42, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -9, - 0, 0, 0, -9, 0, 0, 0, 0, - -7, -2, 0, 0, 0, -7, 0, -4, - 0, -15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -21, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, -3, 0, 0, -6, 0, -5, 0, - -9, 0, 0, 0, -5, 3, -4, 0, - 0, -9, -3, -7, 0, 0, -9, 0, - -3, 0, -15, 0, -4, 0, 0, -26, - -6, -13, -4, -12, 0, 0, -21, 0, - -9, -2, 0, 0, 0, 0, 0, 0, - 0, 0, -5, -6, -3, -5, 0, 0, - 0, 0, -7, 0, -7, 4, -4, 6, - 0, -2, -7, -2, -5, -6, 0, -4, - -2, -2, 2, -9, -1, 0, 0, 0, - -28, -3, -4, 0, -7, 0, -2, -15, - -3, 0, 0, -2, -3, 0, 0, 0, - 0, 2, 0, -2, -5, -2, 5, 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, 4, 0, 0, 0, 0, 0, - 0, -7, 0, -2, 0, 0, 0, -6, - 3, 0, 0, 0, -9, -3, -6, 0, - 0, -9, 0, -3, 0, -15, 0, 0, - 0, 0, -31, 0, -6, -12, -16, 0, - 0, -21, 0, -2, -5, 0, 0, 0, - 0, 0, 0, 0, 0, -3, -5, -2, - -5, 1, 0, 0, 5, -4, 0, 10, - 16, -3, -3, -10, 4, 16, 5, 7, - -9, 4, 13, 4, 9, 7, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 20, 15, -6, -3, 0, -3, - 26, 14, 26, 0, 0, 0, 3, 0, - 0, 12, 0, 0, -5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2, 0, - 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 0, -27, -4, -3, -13, - -16, 0, 0, -21, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, -27, -4, -3, - -13, -16, 0, 0, -13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -3, 0, 0, 0, -7, 3, 0, -3, - 3, 6, 3, -10, 0, -1, -3, 3, - 0, 3, 0, 0, 0, 0, -8, 0, - -3, -2, -6, 0, -3, -13, 0, 20, - -3, 0, -7, -2, 0, -2, -5, 0, - -3, -9, -6, -4, 0, 0, 0, -5, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -2, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 0, -27, - -4, -3, -13, -16, 0, 0, -21, 0, - 0, 0, 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -5, 0, -10, -4, -3, 10, -3, -3, - -13, 1, -2, 1, -2, -9, 1, 7, - 1, 3, 1, 3, -8, -13, -4, 0, - -12, -6, -9, -13, -12, 0, -5, -6, - -4, -4, -3, -2, -4, -2, 0, -2, - -1, 5, 0, 5, -2, 0, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -2, -3, -3, 0, 0, - -9, 0, -2, 0, -5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -19, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, -3, 0, -4, - 0, 0, 0, 0, -3, 0, 0, -5, - -3, 3, 0, -5, -6, -2, 0, -9, - -2, -7, -2, -4, 0, -5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -21, 0, 10, 0, 0, -6, 0, - 0, 0, 0, -4, 0, -3, 0, 0, - -2, 0, 0, -2, 0, -7, 0, 0, - 13, -4, -11, -10, 2, 4, 4, -1, - -9, 2, 5, 2, 10, 2, 11, -2, - -9, 0, 0, -13, 0, 0, -10, -9, - 0, 0, -6, 0, -4, -5, 0, -5, - 0, -5, 0, -2, 5, 0, -3, -10, - -3, 12, 0, 0, -3, 0, -6, 0, - 0, 4, -7, 0, 3, -3, 3, 0, - 0, -11, 0, -2, -1, 0, -3, 4, - -3, 0, 0, 0, -13, -4, -7, 0, - -10, 0, 0, -15, 0, 12, -3, 0, - -6, 0, 2, 0, -3, 0, -3, -10, - 0, -3, 3, 0, 0, 0, 0, -2, - 0, 0, 3, -4, 1, 0, 0, -4, - -2, 0, -4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -20, 0, 7, 0, - 0, -3, 0, 0, 0, 0, 1, 0, - -3, -3, 0, 0, 0, 6, 0, 7, - 0, 0, 0, 0, 0, -20, -18, 1, - 14, 10, 5, -13, 2, 13, 0, 12, - 0, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_20 = { -#else -lv_font_t lv_font_montserrat_20 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 22, /*The maximum line height required by the font*/ - .base_line = 4, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -1, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_20*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_22.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_22.c deleted file mode 100644 index 3390743..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_22.c +++ /dev/null @@ -1,3646 +0,0 @@ -/******************************************************************************* - * Size: 22 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 22 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_22.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_22 - #define LV_FONT_MONTSERRAT_22 1 -#endif - -#if LV_FONT_MONTSERRAT_22 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x4f, 0xf2, 0x3f, 0xf2, 0x3f, 0xf1, 0x2f, 0xf1, - 0x1f, 0xf0, 0x1f, 0xf0, 0xf, 0xf0, 0xf, 0xe0, - 0xf, 0xd0, 0xf, 0xd0, 0xa, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0xb0, 0x6f, 0xf5, 0x2d, 0xd1, - - /* U+0022 "\"" */ - 0x9f, 0x30, 0x9f, 0x39, 0xf3, 0x9, 0xf2, 0x8f, - 0x20, 0x9f, 0x28, 0xf2, 0x8, 0xf2, 0x8f, 0x10, - 0x8f, 0x17, 0xf1, 0x8, 0xf1, 0x0, 0x0, 0x0, - 0x0, - - /* U+0023 "#" */ - 0x0, 0x0, 0xf, 0x90, 0x0, 0x4f, 0x40, 0x0, - 0x0, 0x1, 0xf7, 0x0, 0x6, 0xf2, 0x0, 0x0, - 0x0, 0x3f, 0x50, 0x0, 0x8f, 0x0, 0x0, 0x0, - 0x5, 0xf3, 0x0, 0xa, 0xe0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7a, 0xad, - 0xfa, 0xaa, 0xaf, 0xda, 0xa8, 0x0, 0x0, 0xbd, - 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xb0, - 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0xf9, 0x0, - 0x3, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0x70, 0x0, - 0x5f, 0x30, 0x0, 0x4a, 0xab, 0xfc, 0xaa, 0xac, - 0xfa, 0xaa, 0x16, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x6, 0xf2, 0x0, 0xb, 0xd0, - 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, 0xdb, 0x0, - 0x0, 0x0, 0xa, 0xe0, 0x0, 0xf, 0x90, 0x0, - 0x0, 0x0, 0xcc, 0x0, 0x1, 0xf7, 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xca, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xef, 0xfe, - 0xc7, 0x10, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x3f, 0xf8, 0x1c, 0xa0, 0x4a, 0xa0, 0x9, - 0xfa, 0x0, 0xca, 0x0, 0x0, 0x0, 0xbf, 0x70, - 0xc, 0xa0, 0x0, 0x0, 0x9, 0xfd, 0x0, 0xca, - 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x7d, 0xa0, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xfe, 0x94, 0x0, 0x0, - 0x0, 0x6, 0xbf, 0xff, 0xfd, 0x30, 0x0, 0x0, - 0x0, 0xcc, 0x9f, 0xff, 0x20, 0x0, 0x0, 0xc, - 0xa0, 0x1d, 0xf9, 0x0, 0x0, 0x0, 0xca, 0x0, - 0x7f, 0xb0, 0x42, 0x0, 0xc, 0xa0, 0x9, 0xfa, - 0xd, 0xf8, 0x20, 0xca, 0x17, 0xff, 0x40, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x28, 0xcf, - 0xff, 0xea, 0x40, 0x0, 0x0, 0x0, 0xc, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xca, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x50, 0x0, 0x0, - - /* U+0025 "%" */ - 0x0, 0x6d, 0xfd, 0x40, 0x0, 0x0, 0xa, 0xf1, - 0x0, 0x6, 0xf8, 0x5a, 0xf3, 0x0, 0x0, 0x4f, - 0x60, 0x0, 0xe, 0x90, 0x0, 0xcb, 0x0, 0x0, - 0xeb, 0x0, 0x0, 0x1f, 0x50, 0x0, 0x8e, 0x0, - 0x9, 0xf1, 0x0, 0x0, 0x2f, 0x40, 0x0, 0x7e, - 0x0, 0x4f, 0x60, 0x0, 0x0, 0xf, 0x80, 0x0, - 0xbc, 0x0, 0xec, 0x0, 0x0, 0x0, 0x8, 0xf5, - 0x16, 0xf5, 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0x80, 0x3f, 0x70, 0x9f, 0xfb, 0x20, - 0x0, 0x1, 0x31, 0x0, 0xdc, 0x9, 0xf6, 0x5d, - 0xd0, 0x0, 0x0, 0x0, 0x8, 0xf2, 0x1f, 0x60, - 0x2, 0xf6, 0x0, 0x0, 0x0, 0x3f, 0x70, 0x4f, - 0x10, 0x0, 0xd9, 0x0, 0x0, 0x0, 0xdc, 0x0, - 0x6f, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x8, 0xf2, - 0x0, 0x4f, 0x10, 0x0, 0xc9, 0x0, 0x0, 0x3f, - 0x80, 0x0, 0x1f, 0x50, 0x1, 0xf5, 0x0, 0x0, - 0xdd, 0x0, 0x0, 0x8, 0xe5, 0x3c, 0xd0, 0x0, - 0x8, 0xf3, 0x0, 0x0, 0x0, 0x8e, 0xfb, 0x10, - - /* U+0026 "&" */ - 0x0, 0x0, 0x4c, 0xee, 0xc4, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xfa, 0xaf, 0xf5, 0x0, 0x0, 0x0, - 0xf, 0xf2, 0x0, 0x2f, 0xc0, 0x0, 0x0, 0x1, - 0xfe, 0x0, 0x0, 0xfd, 0x0, 0x0, 0x0, 0xf, - 0xf2, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x0, 0x8f, - 0xc1, 0x8f, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0xdf, - 0xa0, 0x0, 0x63, 0x0, 0x3f, 0xf4, 0x1, 0xdf, - 0xa0, 0xe, 0xe0, 0xb, 0xf6, 0x0, 0x1, 0xdf, - 0xa4, 0xf9, 0x0, 0xff, 0x10, 0x0, 0x1, 0xdf, - 0xff, 0x30, 0xe, 0xf4, 0x0, 0x0, 0x1, 0xef, - 0xd0, 0x0, 0x9f, 0xe3, 0x0, 0x2, 0xaf, 0xff, - 0xa0, 0x1, 0xcf, 0xfe, 0xce, 0xff, 0xc3, 0xdf, - 0x80, 0x0, 0x6b, 0xef, 0xeb, 0x50, 0x1, 0xc2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0x9f, 0x39, 0xf3, 0x8f, 0x28, 0xf2, 0x8f, 0x17, - 0xf1, 0x0, 0x0, - - /* U+0028 "(" */ - 0x0, 0x8f, 0x70, 0x1f, 0xf0, 0x8, 0xf8, 0x0, - 0xdf, 0x30, 0x2f, 0xe0, 0x6, 0xfa, 0x0, 0x8f, - 0x80, 0xb, 0xf5, 0x0, 0xcf, 0x40, 0xd, 0xf3, - 0x0, 0xef, 0x20, 0xd, 0xf3, 0x0, 0xcf, 0x40, - 0xb, 0xf5, 0x0, 0x8f, 0x70, 0x5, 0xfa, 0x0, - 0x2f, 0xe0, 0x0, 0xdf, 0x30, 0x7, 0xf8, 0x0, - 0x1f, 0xf0, 0x0, 0x8f, 0x70, - - /* U+0029 ")" */ - 0x1f, 0xe0, 0x0, 0x9, 0xf7, 0x0, 0x2, 0xfe, - 0x0, 0x0, 0xcf, 0x40, 0x0, 0x7f, 0x90, 0x0, - 0x4f, 0xc0, 0x0, 0x1f, 0xf0, 0x0, 0xe, 0xf2, - 0x0, 0xd, 0xf3, 0x0, 0xc, 0xf4, 0x0, 0xb, - 0xf5, 0x0, 0xc, 0xf4, 0x0, 0xd, 0xf3, 0x0, - 0xe, 0xf2, 0x0, 0x1f, 0xf0, 0x0, 0x3f, 0xc0, - 0x0, 0x7f, 0x90, 0x0, 0xcf, 0x40, 0x2, 0xfe, - 0x0, 0x9, 0xf7, 0x0, 0x1f, 0xe0, 0x0, - - /* U+002A "*" */ - 0x0, 0x4, 0xf0, 0x0, 0x0, 0x40, 0x4f, 0x0, - 0x50, 0x5f, 0xb6, 0xf4, 0xdf, 0x20, 0x4d, 0xff, - 0xfc, 0x30, 0x0, 0x8f, 0xff, 0x60, 0x4, 0xef, - 0xaf, 0xaf, 0xc2, 0x2a, 0x13, 0xf0, 0x3b, 0x0, - 0x0, 0x4f, 0x0, 0x0, 0x0, 0x1, 0x60, 0x0, - 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x6d, 0x40, 0x0, 0x0, 0x0, 0x8, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x50, 0x0, - 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x6c, 0xcc, - 0xef, 0xdc, 0xcc, 0x48, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x8f, 0x50, 0x0, 0x0, 0x0, - 0x8, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x50, - 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, - - /* U+002C "," */ - 0x3, 0xb, 0xfb, 0xdf, 0xe4, 0xfb, 0x3f, 0x67, - 0xf1, 0xbb, 0x0, - - /* U+002D "-" */ - 0xad, 0xdd, 0xdd, 0x2c, 0xff, 0xff, 0xf2, - - /* U+002E "." */ - 0x0, 0x9, 0xf9, 0xff, 0xe8, 0xf7, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x8, 0xf6, 0x0, 0x0, 0x0, - 0xd, 0xf1, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, - 0x0, 0x0, 0x9f, 0x50, 0x0, 0x0, 0x0, 0xef, - 0x0, 0x0, 0x0, 0x4, 0xfa, 0x0, 0x0, 0x0, - 0x9, 0xf5, 0x0, 0x0, 0x0, 0xe, 0xf0, 0x0, - 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0xaf, - 0x40, 0x0, 0x0, 0x0, 0xfe, 0x0, 0x0, 0x0, - 0x5, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xf3, 0x0, - 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0x5f, - 0x80, 0x0, 0x0, 0x0, 0xbf, 0x30, 0x0, 0x0, - 0x1, 0xfd, 0x0, 0x0, 0x0, 0x6, 0xf8, 0x0, - 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, 0x1f, - 0xd0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x0, - 0x0, - - /* U+0030 "0" */ - 0x0, 0x3, 0xae, 0xfd, 0x81, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x6, 0xff, 0x81, - 0x3, 0xbf, 0xf1, 0x0, 0xef, 0x60, 0x0, 0x0, - 0xbf, 0xa0, 0x5f, 0xd0, 0x0, 0x0, 0x3, 0xff, - 0x1a, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xf5, 0xcf, - 0x50, 0x0, 0x0, 0x0, 0xaf, 0x7e, 0xf4, 0x0, - 0x0, 0x0, 0x9, 0xf9, 0xef, 0x40, 0x0, 0x0, - 0x0, 0x9f, 0x9c, 0xf5, 0x0, 0x0, 0x0, 0xa, - 0xf7, 0xaf, 0x80, 0x0, 0x0, 0x0, 0xdf, 0x55, - 0xfd, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0x1e, 0xf6, - 0x0, 0x0, 0xb, 0xfa, 0x0, 0x6f, 0xf7, 0x10, - 0x2b, 0xff, 0x10, 0x0, 0x8f, 0xff, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0x3a, 0xef, 0xd8, 0x10, 0x0, - - /* U+0031 "1" */ - 0xdf, 0xff, 0xfd, 0xcf, 0xff, 0xfd, 0x0, 0x5, - 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, - 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, - 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, - 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, - 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, - - /* U+0032 "2" */ - 0x0, 0x39, 0xdf, 0xfd, 0x81, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x6f, 0xe7, 0x20, 0x15, - 0xef, 0xc0, 0x6, 0x20, 0x0, 0x0, 0x4f, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xf8, - 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, - - /* U+0033 "3" */ - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x1e, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x0, 0x0, 0x0, - 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x46, 0x8b, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, - 0x6, 0x0, 0x0, 0x0, 0x1e, 0xf6, 0x8f, 0xc5, - 0x10, 0x14, 0xcf, 0xe0, 0x6f, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0x1, 0x7b, 0xef, 0xed, 0x81, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0x30, 0x3, 0x63, 0x0, 0x0, 0x1, 0xef, 0x70, - 0x0, 0x8f, 0x80, 0x0, 0x0, 0xbf, 0xb0, 0x0, - 0x8, 0xf8, 0x0, 0x0, 0x7f, 0xe1, 0x0, 0x0, - 0x8f, 0x80, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x62, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, - - /* U+0035 "5" */ - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xec, - 0x82, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x14, 0xbf, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfc, - 0x7, 0x0, 0x0, 0x0, 0xc, 0xf9, 0x4f, 0xe7, - 0x20, 0x3, 0xbf, 0xf3, 0x3d, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x5a, 0xdf, 0xfd, 0x92, 0x0, - - /* U+0036 "6" */ - 0x0, 0x1, 0x7c, 0xef, 0xdb, 0x60, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xd0, 0x3, 0xff, 0xb3, 0x0, - 0x4, 0x40, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0x50, 0x6a, 0xcb, - 0x82, 0x0, 0xef, 0x6d, 0xff, 0xff, 0xff, 0x60, - 0xef, 0xff, 0x71, 0x2, 0xaf, 0xf4, 0xdf, 0xf4, - 0x0, 0x0, 0xa, 0xfb, 0xbf, 0xe0, 0x0, 0x0, - 0x4, 0xfe, 0x8f, 0xd0, 0x0, 0x0, 0x3, 0xfe, - 0x2f, 0xf2, 0x0, 0x0, 0x8, 0xfb, 0x9, 0xfd, - 0x40, 0x0, 0x6f, 0xf4, 0x0, 0xaf, 0xfe, 0xdf, - 0xff, 0x70, 0x0, 0x5, 0xbe, 0xfe, 0xa3, 0x0, - - /* U+0037 "7" */ - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x5f, 0xc0, 0x0, - 0x0, 0x6, 0xfd, 0x5, 0xfc, 0x0, 0x0, 0x0, - 0xdf, 0x60, 0x4d, 0x90, 0x0, 0x0, 0x4f, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xf4, 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x2, 0x9d, 0xff, 0xd9, 0x30, 0x0, 0x0, - 0x4f, 0xff, 0xee, 0xff, 0xf7, 0x0, 0x1, 0xff, - 0xa1, 0x0, 0x19, 0xff, 0x20, 0x5, 0xfe, 0x0, - 0x0, 0x0, 0xbf, 0x80, 0x7, 0xfc, 0x0, 0x0, - 0x0, 0x8f, 0x90, 0x4, 0xfe, 0x10, 0x0, 0x0, - 0xcf, 0x70, 0x0, 0xcf, 0xc4, 0x10, 0x3b, 0xfe, - 0x10, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0x0, 0x8f, 0xfe, 0xcc, 0xef, 0xfa, 0x0, 0x7, - 0xfe, 0x50, 0x0, 0x3, 0xdf, 0x90, 0xe, 0xf5, - 0x0, 0x0, 0x0, 0x3f, 0xf0, 0xf, 0xf3, 0x0, - 0x0, 0x0, 0xf, 0xf2, 0xe, 0xf7, 0x0, 0x0, - 0x0, 0x4f, 0xf0, 0x7, 0xff, 0x60, 0x0, 0x5, - 0xef, 0xa0, 0x0, 0xaf, 0xff, 0xed, 0xff, 0xfc, - 0x10, 0x0, 0x4, 0xad, 0xff, 0xeb, 0x50, 0x0, - - /* U+0039 "9" */ - 0x0, 0x7, 0xcf, 0xfd, 0x91, 0x0, 0x0, 0x1c, - 0xff, 0xed, 0xff, 0xf4, 0x0, 0xb, 0xfd, 0x30, - 0x0, 0x8f, 0xf2, 0x2, 0xff, 0x20, 0x0, 0x0, - 0x9f, 0xb0, 0x5f, 0xd0, 0x0, 0x0, 0x3, 0xff, - 0x15, 0xfd, 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x2f, - 0xf3, 0x0, 0x0, 0xb, 0xff, 0x60, 0xbf, 0xe6, - 0x10, 0x3a, 0xff, 0xf7, 0x1, 0xcf, 0xff, 0xff, - 0xf9, 0xbf, 0x70, 0x0, 0x5a, 0xcc, 0x94, 0xc, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xf6, 0x0, 0x7, 0x20, 0x1, - 0x6e, 0xfb, 0x0, 0x5, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x18, 0xce, 0xfd, 0xa4, 0x0, 0x0, - - /* U+003A ":" */ - 0x8f, 0x8f, 0xfe, 0x9f, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf9, 0xff, - 0xe8, 0xf7, - - /* U+003B ";" */ - 0x8f, 0x8f, 0xfe, 0x9f, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0xef, - 0xe7, 0xfc, 0x2f, 0x76, 0xf2, 0xac, 0x3, 0x20, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x17, 0x30, 0x0, 0x0, - 0x3, 0xaf, 0xf5, 0x0, 0x1, 0x7d, 0xff, 0xc6, - 0x0, 0x3a, 0xff, 0xe9, 0x20, 0x0, 0x7f, 0xfc, - 0x50, 0x0, 0x0, 0x8, 0xfe, 0x71, 0x0, 0x0, - 0x0, 0x18, 0xef, 0xfa, 0x40, 0x0, 0x0, 0x0, - 0x5b, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x2, 0x8e, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x5, 0xb5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+003D "=" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0x56, 0xcc, 0xcc, - 0xcc, 0xcc, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xcc, 0xcc, 0xcc, 0xcc, - 0xc4, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x50, - - /* U+003E ">" */ - 0x56, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0x92, - 0x0, 0x0, 0x0, 0x17, 0xdf, 0xfc, 0x50, 0x0, - 0x0, 0x0, 0x4a, 0xff, 0xe8, 0x20, 0x0, 0x0, - 0x1, 0x6d, 0xff, 0x40, 0x0, 0x0, 0x2, 0x8f, - 0xf5, 0x0, 0x0, 0x5c, 0xff, 0xd7, 0x0, 0x29, - 0xef, 0xfa, 0x30, 0x0, 0x7f, 0xfd, 0x71, 0x0, - 0x0, 0x8, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x4a, 0xdf, 0xfd, 0x81, 0x0, 0xa, 0xff, - 0xfe, 0xff, 0xfe, 0x30, 0x8f, 0xe5, 0x0, 0x4, - 0xef, 0xc0, 0x6, 0x10, 0x0, 0x0, 0x5f, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, 0xf6, 0x0, - 0x0, 0x0, 0x2, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xb, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xe3, 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xd9, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xea, 0x87, - 0x8a, 0xef, 0xd4, 0x0, 0x0, 0x0, 0xa, 0xfc, - 0x40, 0x0, 0x0, 0x0, 0x4d, 0xf8, 0x0, 0x0, - 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xf7, 0x0, 0x6, 0xf9, 0x0, 0x5, 0xcf, 0xfc, - 0x50, 0xfe, 0xa, 0xf3, 0x0, 0xec, 0x0, 0xa, - 0xff, 0xdc, 0xef, 0x9f, 0xe0, 0xe, 0xc0, 0x6f, - 0x40, 0x7, 0xfd, 0x20, 0x0, 0x8f, 0xfe, 0x0, - 0x6f, 0x2a, 0xf0, 0x0, 0xef, 0x20, 0x0, 0x0, - 0xaf, 0xe0, 0x1, 0xf6, 0xdc, 0x0, 0x4f, 0xb0, - 0x0, 0x0, 0x3, 0xfe, 0x0, 0xe, 0x9e, 0xa0, - 0x6, 0xf9, 0x0, 0x0, 0x0, 0xf, 0xe0, 0x0, - 0xda, 0xea, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x0, - 0xfe, 0x0, 0xd, 0xad, 0xc0, 0x4, 0xfb, 0x0, - 0x0, 0x0, 0x3f, 0xe0, 0x0, 0xe9, 0xaf, 0x0, - 0xe, 0xf2, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x2f, - 0x65, 0xf5, 0x0, 0x7f, 0xd2, 0x0, 0x8, 0xff, - 0xf1, 0x9, 0xf1, 0xe, 0xd0, 0x0, 0xaf, 0xfc, - 0xce, 0xf9, 0x9f, 0xec, 0xf8, 0x0, 0x6f, 0x90, - 0x0, 0x5c, 0xff, 0xc5, 0x1, 0xbf, 0xe7, 0x0, - 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xc4, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, - 0xfe, 0xa8, 0x89, 0xbf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, 0x0, - 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xee, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x87, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x21, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xfb, 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xf4, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xd0, 0x0, 0xc, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0x60, 0x0, 0x5, 0xfd, 0x0, - 0x0, 0x0, 0x2, 0xff, 0x0, 0x0, 0x0, 0xef, - 0x40, 0x0, 0x0, 0x9, 0xff, 0xcc, 0xcc, 0xcc, - 0xef, 0xb0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xb0, 0x0, - 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, 0xef, 0x40, - 0x0, 0x0, 0x0, 0x3, 0xff, 0x10, 0x5, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0xc, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xe0, - - /* U+0042 "B" */ - 0xbf, 0xff, 0xff, 0xff, 0xeb, 0x50, 0x0, 0xbf, - 0xed, 0xdd, 0xdd, 0xff, 0xfa, 0x0, 0xbf, 0x80, - 0x0, 0x0, 0x7, 0xff, 0x50, 0xbf, 0x80, 0x0, - 0x0, 0x0, 0xbf, 0xa0, 0xbf, 0x80, 0x0, 0x0, - 0x0, 0x8f, 0xb0, 0xbf, 0x80, 0x0, 0x0, 0x0, - 0xbf, 0x80, 0xbf, 0x80, 0x0, 0x0, 0x7, 0xff, - 0x20, 0xbf, 0xed, 0xdd, 0xdd, 0xff, 0xf4, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xbf, - 0x80, 0x0, 0x0, 0x14, 0xcf, 0xd0, 0xbf, 0x80, - 0x0, 0x0, 0x0, 0xe, 0xf5, 0xbf, 0x80, 0x0, - 0x0, 0x0, 0xb, 0xf8, 0xbf, 0x80, 0x0, 0x0, - 0x0, 0xd, 0xf7, 0xbf, 0x80, 0x0, 0x0, 0x1, - 0x9f, 0xf2, 0xbf, 0xed, 0xdd, 0xdd, 0xef, 0xff, - 0x70, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x93, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x29, 0xdf, 0xfe, 0xa5, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0xcf, 0xfa, 0x41, 0x2, 0x6e, 0xfc, 0x0, 0x9f, - 0xf5, 0x0, 0x0, 0x0, 0x9, 0x20, 0x2f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x92, 0x0, 0xc, 0xff, 0xa4, 0x10, 0x16, 0xef, - 0xc0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd2, - 0x0, 0x0, 0x3, 0x9d, 0xff, 0xea, 0x50, 0x0, - - /* U+0044 "D" */ - 0xbf, 0xff, 0xff, 0xfe, 0xd9, 0x30, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, - 0xbf, 0x80, 0x0, 0x0, 0x38, 0xff, 0xe1, 0x0, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2d, 0xfc, 0x0, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xc0, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xb0, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2d, 0xfc, 0x0, - 0xbf, 0x80, 0x0, 0x0, 0x38, 0xff, 0xe1, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, - 0xbf, 0xff, 0xff, 0xfe, 0xd9, 0x30, 0x0, 0x0, - - /* U+0045 "E" */ - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0xbf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfe, 0xee, 0xee, 0xee, 0x30, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0xbf, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, - - /* U+0046 "F" */ - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0xbf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0x30, 0xbf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x29, 0xdf, 0xfe, 0xb6, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0xcf, 0xfa, 0x41, 0x1, 0x5c, 0xfe, 0x0, 0x9f, - 0xf5, 0x0, 0x0, 0x0, 0x8, 0x30, 0x2f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x10, 0xef, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x1c, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xf1, 0x8f, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x12, 0xff, 0x50, 0x0, 0x0, 0x0, - 0xf, 0xf1, 0x9, 0xff, 0x50, 0x0, 0x0, 0x0, - 0xff, 0x10, 0xc, 0xff, 0xa4, 0x10, 0x25, 0xcf, - 0xf1, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x2, 0x9d, 0xff, 0xeb, 0x60, 0x0, - - /* U+0048 "H" */ - 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, - 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, - 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, - 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, - 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, - 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, - 0xf8, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, - 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, - 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, - 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, - 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, - 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, - 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, - - /* U+0049 "I" */ - 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, - 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, - 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, - - /* U+004A "J" */ - 0x0, 0xaf, 0xff, 0xff, 0xff, 0x10, 0x9, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x1, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, - 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, - 0xf1, 0x0, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, 0x0, 0x1, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x0, - 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x2f, 0xf0, 0x3, 0x50, 0x0, 0x5, 0xfe, 0x0, - 0xef, 0x70, 0x3, 0xef, 0x90, 0x8, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x4, 0xae, 0xfe, 0x91, 0x0, - - /* U+004B "K" */ - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x9f, 0xd1, 0xbf, - 0x80, 0x0, 0x0, 0x8, 0xfe, 0x10, 0xbf, 0x80, - 0x0, 0x0, 0x7f, 0xe2, 0x0, 0xbf, 0x80, 0x0, - 0x6, 0xff, 0x30, 0x0, 0xbf, 0x80, 0x0, 0x5f, - 0xf4, 0x0, 0x0, 0xbf, 0x80, 0x4, 0xff, 0x50, - 0x0, 0x0, 0xbf, 0x80, 0x3f, 0xf7, 0x0, 0x0, - 0x0, 0xbf, 0x83, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0xbf, 0xae, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xb4, 0xff, 0x90, 0x0, 0x0, 0xbf, 0xfc, - 0x0, 0x5f, 0xf6, 0x0, 0x0, 0xbf, 0xc0, 0x0, - 0x8, 0xff, 0x30, 0x0, 0xbf, 0x80, 0x0, 0x0, - 0xbf, 0xe1, 0x0, 0xbf, 0x80, 0x0, 0x0, 0xd, - 0xfc, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x1, 0xef, - 0x90, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x3f, 0xf6, - - /* U+004C "L" */ - 0xbf, 0x80, 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, - 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, - 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xb, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, - 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0x80, 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xb, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+004D "M" */ - 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xab, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xfa, 0xbf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xab, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfa, 0xbf, 0xef, 0xa0, 0x0, 0x0, 0x0, - 0xaf, 0xef, 0xab, 0xf7, 0xef, 0x30, 0x0, 0x0, - 0x3f, 0xd7, 0xfa, 0xbf, 0x65, 0xfc, 0x0, 0x0, - 0xc, 0xf5, 0x6f, 0xab, 0xf6, 0xc, 0xf6, 0x0, - 0x5, 0xfc, 0x6, 0xfa, 0xbf, 0x60, 0x3f, 0xe0, - 0x0, 0xef, 0x30, 0x6f, 0xbb, 0xf6, 0x0, 0xaf, - 0x80, 0x7f, 0x90, 0x6, 0xfb, 0xbf, 0x60, 0x1, - 0xff, 0x3f, 0xf1, 0x0, 0x6f, 0xbb, 0xf6, 0x0, - 0x7, 0xff, 0xf7, 0x0, 0x6, 0xfb, 0xbf, 0x60, - 0x0, 0xe, 0xfd, 0x0, 0x0, 0x6f, 0xbb, 0xf6, - 0x0, 0x0, 0x5f, 0x50, 0x0, 0x6, 0xfb, 0xbf, - 0x60, 0x0, 0x0, 0x10, 0x0, 0x0, 0x6f, 0xbb, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfb, - - /* U+004E "N" */ - 0xbf, 0x70, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, - 0xf4, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0xfe, - 0x10, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0xff, 0xc0, - 0x0, 0x0, 0xa, 0xf8, 0xbf, 0xbf, 0xf9, 0x0, - 0x0, 0xa, 0xf8, 0xbf, 0x86, 0xff, 0x50, 0x0, - 0xa, 0xf8, 0xbf, 0x80, 0x9f, 0xf2, 0x0, 0xa, - 0xf8, 0xbf, 0x80, 0xc, 0xfd, 0x0, 0xa, 0xf8, - 0xbf, 0x80, 0x2, 0xef, 0xb0, 0xa, 0xf8, 0xbf, - 0x80, 0x0, 0x4f, 0xf7, 0xa, 0xf8, 0xbf, 0x80, - 0x0, 0x8, 0xff, 0x4a, 0xf8, 0xbf, 0x80, 0x0, - 0x0, 0xbf, 0xeb, 0xf8, 0xbf, 0x80, 0x0, 0x0, - 0x1e, 0xff, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x3, - 0xff, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x6f, - 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, - - /* U+004F "O" */ - 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xb6, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x30, - 0x0, 0x0, 0xbf, 0xfa, 0x41, 0x2, 0x7e, 0xff, - 0x40, 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x1b, - 0xfe, 0x10, 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xfa, 0x8, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xf1, 0xcf, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x4e, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xf6, 0xef, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0x6c, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xf4, 0x8f, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0x12, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xa0, 0x8, 0xff, - 0x40, 0x0, 0x0, 0x0, 0xbf, 0xe2, 0x0, 0xc, - 0xff, 0xa4, 0x10, 0x26, 0xef, 0xf4, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, - 0x0, 0x2, 0x9d, 0xff, 0xeb, 0x60, 0x0, 0x0, - - /* U+0050 "P" */ - 0xbf, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x20, 0xbf, 0x80, 0x0, - 0x1, 0x6e, 0xfd, 0xb, 0xf8, 0x0, 0x0, 0x0, - 0x1e, 0xf6, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x9f, - 0xab, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xfb, 0xbf, - 0x80, 0x0, 0x0, 0x0, 0x9f, 0xab, 0xf8, 0x0, - 0x0, 0x0, 0x1e, 0xf6, 0xbf, 0x80, 0x0, 0x1, - 0x6e, 0xfd, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0xbf, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0xb, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xb6, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x41, 0x2, 0x7e, - 0xff, 0x40, 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, - 0x1, 0xbf, 0xe1, 0x0, 0x2f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xfa, 0x0, 0x8f, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0x0, 0xcf, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x40, 0xef, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x60, - 0xef, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0x50, 0xcf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x40, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0x0, 0x2f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xfa, 0x0, 0xa, 0xff, 0x30, 0x0, - 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x0, 0xdf, 0xf9, - 0x30, 0x1, 0x6d, 0xff, 0x50, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, - 0x0, 0x4a, 0xef, 0xff, 0xd6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe5, 0x0, 0x7, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xec, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, - 0xef, 0xd7, 0x0, - - /* U+0052 "R" */ - 0xbf, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x20, 0xbf, 0x80, 0x0, - 0x1, 0x6e, 0xfd, 0xb, 0xf8, 0x0, 0x0, 0x0, - 0x1e, 0xf6, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x9f, - 0xab, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xfb, 0xbf, - 0x80, 0x0, 0x0, 0x0, 0x9f, 0x9b, 0xf8, 0x0, - 0x0, 0x0, 0x1e, 0xf5, 0xbf, 0x80, 0x0, 0x1, - 0x5d, 0xfd, 0xb, 0xff, 0xee, 0xef, 0xff, 0xfd, - 0x20, 0xbf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xb, - 0xf8, 0x0, 0x0, 0x5f, 0xe1, 0x0, 0xbf, 0x80, - 0x0, 0x0, 0xbf, 0xa0, 0xb, 0xf8, 0x0, 0x0, - 0x1, 0xef, 0x50, 0xbf, 0x80, 0x0, 0x0, 0x6, - 0xfe, 0x1b, 0xf8, 0x0, 0x0, 0x0, 0xb, 0xfa, - - /* U+0053 "S" */ - 0x0, 0x2, 0x9d, 0xff, 0xeb, 0x60, 0x0, 0x6, - 0xff, 0xff, 0xef, 0xff, 0xe0, 0x3, 0xff, 0x92, - 0x0, 0x4, 0xba, 0x0, 0x9f, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xe7, 0x20, 0x0, 0x0, 0x0, 0x4, 0xef, - 0xff, 0xea, 0x50, 0x0, 0x0, 0x0, 0x6b, 0xff, - 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x38, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xfb, 0x4, 0x20, - 0x0, 0x0, 0x0, 0xaf, 0x90, 0xdf, 0x94, 0x0, - 0x1, 0x8f, 0xf3, 0x7, 0xff, 0xff, 0xef, 0xff, - 0xf7, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0x92, 0x0, - - /* U+0054 "T" */ - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xa, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, - - /* U+0055 "U" */ - 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, 0xdf, - 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, 0xdf, 0x60, - 0x0, 0x0, 0x0, 0xf, 0xf3, 0xdf, 0x60, 0x0, - 0x0, 0x0, 0xf, 0xf3, 0xdf, 0x60, 0x0, 0x0, - 0x0, 0xf, 0xf3, 0xdf, 0x60, 0x0, 0x0, 0x0, - 0xf, 0xf3, 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, - 0xf3, 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, - 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, 0xcf, - 0x60, 0x0, 0x0, 0x0, 0xf, 0xf2, 0xbf, 0x80, - 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x8f, 0xc0, 0x0, - 0x0, 0x0, 0x5f, 0xe0, 0x2f, 0xf5, 0x0, 0x0, - 0x0, 0xdf, 0x80, 0xa, 0xff, 0x71, 0x0, 0x4d, - 0xfe, 0x10, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x5, 0xbe, 0xff, 0xc7, 0x10, 0x0, - - /* U+0056 "V" */ - 0xc, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0x70, 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xf1, 0x0, 0xef, 0x60, 0x0, 0x0, 0x0, 0x9, - 0xfa, 0x0, 0x8, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x30, 0x0, 0x1f, 0xf4, 0x0, 0x0, 0x0, - 0x6f, 0xc0, 0x0, 0x0, 0xbf, 0xa0, 0x0, 0x0, - 0xd, 0xf5, 0x0, 0x0, 0x4, 0xff, 0x10, 0x0, - 0x4, 0xfe, 0x0, 0x0, 0x0, 0xd, 0xf8, 0x0, - 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xe0, - 0x0, 0x2f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x50, 0x8, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xfc, 0x0, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xf3, 0x6f, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0x9d, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf2, 0x0, 0x0, 0x0, - - /* U+0057 "W" */ - 0x2f, 0xf2, 0x0, 0x0, 0x0, 0xb, 0xfa, 0x0, - 0x0, 0x0, 0x2, 0xfe, 0x0, 0xdf, 0x70, 0x0, - 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8f, - 0x90, 0x7, 0xfc, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x40, 0x0, 0x0, 0xd, 0xf4, 0x0, 0x2f, 0xf1, - 0x0, 0x0, 0xb, 0xfc, 0xf9, 0x0, 0x0, 0x2, - 0xfe, 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0xff, - 0x3f, 0xe0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x8, - 0xfb, 0x0, 0x0, 0x5f, 0xa0, 0xdf, 0x40, 0x0, - 0xc, 0xf4, 0x0, 0x0, 0x3f, 0xf1, 0x0, 0xb, - 0xf5, 0x8, 0xf9, 0x0, 0x2, 0xff, 0x0, 0x0, - 0x0, 0xef, 0x50, 0x1, 0xff, 0x0, 0x3f, 0xe0, - 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x8, 0xfa, 0x0, - 0x5f, 0xa0, 0x0, 0xdf, 0x30, 0xc, 0xf5, 0x0, - 0x0, 0x0, 0x3f, 0xf0, 0xb, 0xf5, 0x0, 0x8, - 0xf9, 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0xef, - 0x51, 0xff, 0x0, 0x0, 0x3f, 0xe0, 0x6f, 0xb0, - 0x0, 0x0, 0x0, 0x9, 0xfa, 0x6f, 0xa0, 0x0, - 0x0, 0xdf, 0x3c, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xfb, 0xf5, 0x0, 0x0, 0x8, 0xfa, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xef, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, - - /* U+0058 "X" */ - 0x1e, 0xf7, 0x0, 0x0, 0x0, 0xa, 0xfc, 0x0, - 0x5f, 0xf3, 0x0, 0x0, 0x5, 0xff, 0x10, 0x0, - 0x9f, 0xd0, 0x0, 0x1, 0xef, 0x50, 0x0, 0x0, - 0xdf, 0x90, 0x0, 0xbf, 0xa0, 0x0, 0x0, 0x3, - 0xff, 0x40, 0x6f, 0xe1, 0x0, 0x0, 0x0, 0x8, - 0xfe, 0x3f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xbf, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0xdf, - 0xa0, 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x2, 0xff, - 0x50, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x7, 0xfe, - 0x10, 0x0, 0x1e, 0xf8, 0x0, 0x0, 0xc, 0xfb, - 0x0, 0xa, 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xf7, - 0x5, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5f, 0xf2, - - /* U+0059 "Y" */ - 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, - 0x3, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0x70, - 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x5, 0xfd, 0x0, - 0x0, 0x1f, 0xf4, 0x0, 0x0, 0xe, 0xf4, 0x0, - 0x0, 0x7, 0xfd, 0x0, 0x0, 0x8f, 0xb0, 0x0, - 0x0, 0x0, 0xdf, 0x70, 0x1, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x4f, 0xf1, 0xa, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xfa, 0x4f, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xef, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, - - /* U+005A "Z" */ - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+005B "[" */ - 0xbf, 0xff, 0xeb, 0xfd, 0xcb, 0xbf, 0x60, 0xb, - 0xf6, 0x0, 0xbf, 0x60, 0xb, 0xf6, 0x0, 0xbf, - 0x60, 0xb, 0xf6, 0x0, 0xbf, 0x60, 0xb, 0xf6, - 0x0, 0xbf, 0x60, 0xb, 0xf6, 0x0, 0xbf, 0x60, - 0xb, 0xf6, 0x0, 0xbf, 0x60, 0xb, 0xf6, 0x0, - 0xbf, 0x60, 0xb, 0xf6, 0x0, 0xbf, 0x60, 0xb, - 0xfd, 0xcb, 0xbf, 0xff, 0xe0, - - /* U+005C "\\" */ - 0xaf, 0x40, 0x0, 0x0, 0x0, 0x5f, 0x90, 0x0, - 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0xa, - 0xf4, 0x0, 0x0, 0x0, 0x4, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xef, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0x50, 0x0, 0x0, 0x0, 0x4f, 0xa0, 0x0, 0x0, - 0x0, 0xe, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xf5, - 0x0, 0x0, 0x0, 0x3, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0x10, 0x0, 0x0, 0x0, 0x8f, 0x60, - 0x0, 0x0, 0x0, 0x2f, 0xb0, 0x0, 0x0, 0x0, - 0xd, 0xf1, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, - 0x0, 0x0, 0x2, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0x20, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, - 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x0, 0x0, 0xc, - 0xf2, - - /* U+005D "]" */ - 0x9f, 0xff, 0xf0, 0x7c, 0xcf, 0xf0, 0x0, 0x1f, - 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, - 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, - 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, - 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, - 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, - 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, - 0xf0, 0x7c, 0xcf, 0xf0, 0x9f, 0xff, 0xf0, - - /* U+005E "^" */ - 0x0, 0x0, 0x48, 0x30, 0x0, 0x0, 0x0, 0xd, - 0xfb, 0x0, 0x0, 0x0, 0x4, 0xfc, 0xf1, 0x0, - 0x0, 0x0, 0xae, 0x2f, 0x80, 0x0, 0x0, 0x1f, - 0x80, 0xbe, 0x0, 0x0, 0x8, 0xf2, 0x4, 0xf5, - 0x0, 0x0, 0xeb, 0x0, 0xe, 0xb0, 0x0, 0x5f, - 0x50, 0x0, 0x8f, 0x20, 0xb, 0xe0, 0x0, 0x1, - 0xf8, 0x2, 0xf8, 0x0, 0x0, 0xb, 0xe0, - - /* U+005F "_" */ - 0x11, 0x11, 0x11, 0x11, 0x11, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x40, - - /* U+0060 "`" */ - 0x1b, 0xfb, 0x0, 0x0, 0x9, 0xfb, 0x0, 0x0, - 0x6, 0xfb, 0x0, - - /* U+0061 "a" */ - 0x2, 0x8d, 0xff, 0xea, 0x20, 0x4, 0xff, 0xfe, - 0xef, 0xff, 0x30, 0x1d, 0x61, 0x0, 0x2c, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xef, 0x30, 0x3a, 0xef, 0xff, 0xff, - 0xf3, 0x4f, 0xfc, 0x98, 0x88, 0xff, 0x3c, 0xf8, - 0x0, 0x0, 0xe, 0xf3, 0xef, 0x30, 0x0, 0x1, - 0xff, 0x3b, 0xf8, 0x0, 0x0, 0xbf, 0xf3, 0x3f, - 0xfc, 0x99, 0xef, 0xef, 0x30, 0x2a, 0xef, 0xea, - 0x2c, 0xf3, - - /* U+0062 "b" */ - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xf1, 0x4b, 0xef, 0xd8, 0x10, 0x0, 0xff, - 0x9f, 0xff, 0xef, 0xfe, 0x40, 0xf, 0xff, 0xc3, - 0x0, 0x2b, 0xfe, 0x10, 0xff, 0xd0, 0x0, 0x0, - 0xc, 0xf9, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x5f, - 0xe0, 0xff, 0x20, 0x0, 0x0, 0x1, 0xff, 0xf, - 0xf2, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0xff, 0x50, - 0x0, 0x0, 0x5, 0xfe, 0xf, 0xfd, 0x0, 0x0, - 0x0, 0xdf, 0x80, 0xff, 0xfc, 0x30, 0x3, 0xcf, - 0xe1, 0xf, 0xf8, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0xff, 0x4, 0xbe, 0xfd, 0x81, 0x0, 0x0, - - /* U+0063 "c" */ - 0x0, 0x0, 0x7c, 0xef, 0xd8, 0x0, 0x0, 0x3d, - 0xff, 0xfe, 0xff, 0xe2, 0x1, 0xef, 0xc3, 0x0, - 0x2b, 0xf8, 0x8, 0xfc, 0x0, 0x0, 0x0, 0x50, - 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xfc, 0x0, 0x0, 0x0, 0x50, 0x1, 0xef, - 0xc3, 0x0, 0x2c, 0xf9, 0x0, 0x2d, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x7c, 0xef, 0xd7, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xf0, 0x0, 0x18, 0xdf, 0xeb, 0x41, 0xff, 0x0, - 0x4e, 0xff, 0xef, 0xff, 0x9f, 0xf0, 0x1e, 0xfc, - 0x20, 0x3, 0xcf, 0xff, 0x9, 0xfd, 0x0, 0x0, - 0x0, 0xdf, 0xf0, 0xef, 0x50, 0x0, 0x0, 0x5, - 0xff, 0xf, 0xf1, 0x0, 0x0, 0x0, 0x2f, 0xf0, - 0xff, 0x10, 0x0, 0x0, 0x2, 0xff, 0xe, 0xf4, - 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x9f, 0xc0, 0x0, - 0x0, 0xc, 0xff, 0x1, 0xef, 0xa1, 0x0, 0x1a, - 0xff, 0xf0, 0x4, 0xef, 0xfc, 0xdf, 0xf9, 0xff, - 0x0, 0x1, 0x8d, 0xff, 0xb5, 0xf, 0xf0, - - /* U+0065 "e" */ - 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x3, - 0xef, 0xfd, 0xef, 0xfa, 0x0, 0x1, 0xef, 0x90, - 0x0, 0x3d, 0xf8, 0x0, 0x8f, 0x90, 0x0, 0x0, - 0x2f, 0xf1, 0xe, 0xf2, 0x0, 0x0, 0x0, 0xaf, - 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf, - 0xf9, 0x88, 0x88, 0x88, 0x88, 0x40, 0xef, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xfd, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x1e, 0xfc, 0x40, 0x1, 0x7f, - 0x50, 0x0, 0x3e, 0xff, 0xfe, 0xff, 0xf5, 0x0, - 0x0, 0x7, 0xce, 0xfd, 0x92, 0x0, - - /* U+0066 "f" */ - 0x0, 0x2, 0xbf, 0xfc, 0x30, 0x0, 0xef, 0xed, - 0xf3, 0x0, 0x7f, 0xc0, 0x2, 0x0, 0x9, 0xf6, - 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xc0, 0x8c, 0xef, 0xdc, 0xc9, 0x0, - 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, - 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, - 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, - 0x60, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, - 0xbf, 0x60, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, - 0x0, 0xbf, 0x60, 0x0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x2, 0x8d, 0xfe, 0xc6, 0xd, 0xf2, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xbd, 0xf2, 0x3, 0xff, - 0xb2, 0x0, 0x19, 0xff, 0xf2, 0xa, 0xfa, 0x0, - 0x0, 0x0, 0x8f, 0xf2, 0xf, 0xf3, 0x0, 0x0, - 0x0, 0x1f, 0xf2, 0xf, 0xf1, 0x0, 0x0, 0x0, - 0xe, 0xf2, 0xf, 0xf3, 0x0, 0x0, 0x0, 0x1f, - 0xf2, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x9f, 0xf2, - 0x3, 0xff, 0xa2, 0x0, 0x19, 0xff, 0xf2, 0x0, - 0x5f, 0xff, 0xee, 0xff, 0xaf, 0xf2, 0x0, 0x2, - 0x9d, 0xff, 0xc5, 0xf, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x8f, 0xc0, 0x1, 0xec, 0x51, 0x0, 0x7, - 0xff, 0x60, 0x2, 0xdf, 0xff, 0xee, 0xff, 0xf9, - 0x0, 0x0, 0x5, 0xad, 0xff, 0xea, 0x40, 0x0, - - /* U+0068 "h" */ - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, - 0xbe, 0xfd, 0x80, 0x0, 0xff, 0xbf, 0xff, 0xff, - 0xfd, 0x0, 0xff, 0xfa, 0x20, 0x6, 0xff, 0x80, - 0xff, 0xc0, 0x0, 0x0, 0x7f, 0xd0, 0xff, 0x50, - 0x0, 0x0, 0x2f, 0xf0, 0xff, 0x20, 0x0, 0x0, - 0xf, 0xf0, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, - 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, - 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, - 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, - 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, - - /* U+0069 "i" */ - 0x1d, 0xe2, 0x5f, 0xf6, 0xa, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, - 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, - 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, - 0xf, 0xf1, - - /* U+006A "j" */ - 0x0, 0x0, 0xc, 0xe3, 0x0, 0x0, 0x3f, 0xf8, - 0x0, 0x0, 0x9, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf3, - 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, - 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, - 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, - 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, - 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, - 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xf, 0xf2, - 0x1, 0x0, 0x4f, 0xf0, 0xb, 0xfd, 0xff, 0x80, - 0x8, 0xef, 0xe8, 0x0, - - /* U+006B "k" */ - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, - 0x0, 0x2, 0xef, 0x80, 0xff, 0x10, 0x0, 0x3e, - 0xf8, 0x0, 0xff, 0x10, 0x3, 0xff, 0x80, 0x0, - 0xff, 0x10, 0x4f, 0xf8, 0x0, 0x0, 0xff, 0x15, - 0xff, 0x90, 0x0, 0x0, 0xff, 0x7f, 0xff, 0x80, - 0x0, 0x0, 0xff, 0xff, 0xbf, 0xf4, 0x0, 0x0, - 0xff, 0xf6, 0xa, 0xfe, 0x20, 0x0, 0xff, 0x60, - 0x0, 0xcf, 0xc0, 0x0, 0xff, 0x10, 0x0, 0x2e, - 0xf9, 0x0, 0xff, 0x10, 0x0, 0x4, 0xff, 0x50, - 0xff, 0x10, 0x0, 0x0, 0x7f, 0xf2, - - /* U+006C "l" */ - 0xff, 0x1f, 0xf1, 0xff, 0x1f, 0xf1, 0xff, 0x1f, - 0xf1, 0xff, 0x1f, 0xf1, 0xff, 0x1f, 0xf1, 0xff, - 0x1f, 0xf1, 0xff, 0x1f, 0xf1, 0xff, 0x1f, 0xf1, - 0xff, 0x10, - - /* U+006D "m" */ - 0xff, 0x6, 0xcf, 0xfc, 0x60, 0x3, 0xae, 0xfe, - 0xa2, 0x0, 0xff, 0xbf, 0xfd, 0xff, 0xfa, 0x6f, - 0xfe, 0xdf, 0xff, 0x30, 0xff, 0xf7, 0x0, 0x7, - 0xff, 0xfe, 0x30, 0x1, 0xcf, 0xd0, 0xff, 0xa0, - 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x2f, 0xf2, - 0xff, 0x40, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, - 0xd, 0xf5, 0xff, 0x20, 0x0, 0x0, 0x6f, 0xc0, - 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, 0x0, 0x0, - 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, - 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, - 0xff, 0x10, 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, - 0xc, 0xf5, 0xff, 0x10, 0x0, 0x0, 0x6f, 0xb0, - 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, 0x0, 0x0, - 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, - 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, - - /* U+006E "n" */ - 0xff, 0x6, 0xce, 0xfd, 0x80, 0x0, 0xff, 0xbf, - 0xfd, 0xef, 0xfd, 0x0, 0xff, 0xf8, 0x0, 0x4, - 0xef, 0x80, 0xff, 0xb0, 0x0, 0x0, 0x6f, 0xd0, - 0xff, 0x40, 0x0, 0x0, 0x2f, 0xf0, 0xff, 0x20, - 0x0, 0x0, 0xf, 0xf0, 0xff, 0x10, 0x0, 0x0, - 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, - 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, - 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, - 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, - - /* U+006F "o" */ - 0x0, 0x1, 0x7c, 0xff, 0xc7, 0x10, 0x0, 0x0, - 0x3e, 0xff, 0xef, 0xff, 0xd3, 0x0, 0x1, 0xef, - 0xb2, 0x0, 0x2b, 0xfe, 0x10, 0x8, 0xfc, 0x0, - 0x0, 0x0, 0xcf, 0x80, 0xe, 0xf5, 0x0, 0x0, - 0x0, 0x5f, 0xd0, 0xf, 0xf1, 0x0, 0x0, 0x0, - 0x2f, 0xf0, 0xf, 0xf1, 0x0, 0x0, 0x0, 0x2f, - 0xf0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x5f, 0xd0, - 0x8, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x1, - 0xef, 0xc3, 0x0, 0x3c, 0xfd, 0x10, 0x0, 0x3d, - 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x1, 0x7c, - 0xff, 0xc7, 0x0, 0x0, - - /* U+0070 "p" */ - 0xff, 0x5, 0xbe, 0xfd, 0x81, 0x0, 0xf, 0xfa, - 0xff, 0xdd, 0xff, 0xe4, 0x0, 0xff, 0xfb, 0x10, - 0x1, 0xaf, 0xe1, 0xf, 0xfc, 0x0, 0x0, 0x0, - 0xcf, 0x90, 0xff, 0x50, 0x0, 0x0, 0x4, 0xfe, - 0xf, 0xf2, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0xff, - 0x20, 0x0, 0x0, 0x1, 0xff, 0xf, 0xf5, 0x0, - 0x0, 0x0, 0x5f, 0xe0, 0xff, 0xd0, 0x0, 0x0, - 0xd, 0xf8, 0xf, 0xff, 0xc3, 0x0, 0x3c, 0xfe, - 0x10, 0xff, 0x9f, 0xff, 0xff, 0xfe, 0x30, 0xf, - 0xf1, 0x4b, 0xef, 0xd8, 0x10, 0x0, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x1, 0x8d, 0xfe, 0xb4, 0xf, 0xf0, 0x4, - 0xef, 0xfe, 0xff, 0xf8, 0xff, 0x1, 0xef, 0xb2, - 0x0, 0x3c, 0xff, 0xf0, 0x9f, 0xc0, 0x0, 0x0, - 0xd, 0xff, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x5f, - 0xf0, 0xff, 0x10, 0x0, 0x0, 0x2, 0xff, 0xf, - 0xf1, 0x0, 0x0, 0x0, 0x2f, 0xf0, 0xef, 0x50, - 0x0, 0x0, 0x5, 0xff, 0x9, 0xfd, 0x0, 0x0, - 0x0, 0xdf, 0xf0, 0x1e, 0xfc, 0x30, 0x3, 0xcf, - 0xff, 0x0, 0x4e, 0xff, 0xff, 0xff, 0x9f, 0xf0, - 0x0, 0x18, 0xdf, 0xeb, 0x41, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - - /* U+0072 "r" */ - 0xff, 0x5, 0xbe, 0x4f, 0xf8, 0xff, 0xf4, 0xff, - 0xfc, 0x41, 0xf, 0xfd, 0x0, 0x0, 0xff, 0x50, - 0x0, 0xf, 0xf3, 0x0, 0x0, 0xff, 0x10, 0x0, - 0xf, 0xf1, 0x0, 0x0, 0xff, 0x10, 0x0, 0xf, - 0xf1, 0x0, 0x0, 0xff, 0x10, 0x0, 0xf, 0xf1, - 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x29, 0xdf, 0xfd, 0x93, 0x0, 0x5f, 0xff, - 0xde, 0xff, 0xc0, 0xe, 0xf8, 0x0, 0x1, 0x73, - 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, - 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xeb, 0x72, - 0x0, 0x0, 0x28, 0xcf, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x2, 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0x50, 0xd8, 0x20, 0x0, 0x4f, 0xf3, 0x4f, - 0xff, 0xfe, 0xff, 0xf9, 0x0, 0x28, 0xcf, 0xfd, - 0xb4, 0x0, - - /* U+0074 "t" */ - 0x0, 0x58, 0x30, 0x0, 0x0, 0xb, 0xf6, 0x0, - 0x0, 0x0, 0xbf, 0x60, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xc0, 0x8c, 0xef, 0xdc, 0xc9, 0x0, 0xb, - 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, 0x0, - 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, - 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, - 0x0, 0x0, 0xa, 0xf7, 0x0, 0x0, 0x0, 0x7f, - 0xc0, 0x2, 0x0, 0x1, 0xff, 0xfe, 0xf4, 0x0, - 0x2, 0xbe, 0xeb, 0x20, - - /* U+0075 "u" */ - 0x1f, 0xf0, 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, - 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, 0x0, 0x0, - 0x3, 0xfe, 0x1f, 0xf0, 0x0, 0x0, 0x3, 0xfe, - 0x1f, 0xf0, 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, - 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, 0x0, 0x0, - 0x4, 0xfe, 0x1f, 0xf1, 0x0, 0x0, 0x6, 0xfe, - 0xe, 0xf5, 0x0, 0x0, 0xc, 0xfe, 0x9, 0xfe, - 0x30, 0x0, 0x9f, 0xfe, 0x1, 0xdf, 0xfe, 0xdf, - 0xfb, 0xfe, 0x0, 0x8, 0xdf, 0xfc, 0x52, 0xfe, - - /* U+0076 "v" */ - 0xd, 0xf5, 0x0, 0x0, 0x0, 0xe, 0xf1, 0x6, - 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xa0, 0x0, 0xff, - 0x30, 0x0, 0x0, 0xdf, 0x40, 0x0, 0x8f, 0x90, - 0x0, 0x3, 0xfd, 0x0, 0x0, 0x2f, 0xf1, 0x0, - 0xa, 0xf6, 0x0, 0x0, 0xb, 0xf7, 0x0, 0x1f, - 0xe0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x8f, 0x80, - 0x0, 0x0, 0x0, 0xdf, 0x40, 0xef, 0x20, 0x0, - 0x0, 0x0, 0x6f, 0xb5, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xfd, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0x60, 0x0, 0x0, - - /* U+0077 "w" */ - 0xbf, 0x50, 0x0, 0x0, 0x2f, 0xf0, 0x0, 0x0, - 0x6, 0xf7, 0x5f, 0xa0, 0x0, 0x0, 0x8f, 0xf5, - 0x0, 0x0, 0xc, 0xf1, 0xf, 0xf0, 0x0, 0x0, - 0xdf, 0xfb, 0x0, 0x0, 0x2f, 0xb0, 0x9, 0xf6, - 0x0, 0x3, 0xfa, 0xdf, 0x10, 0x0, 0x8f, 0x50, - 0x3, 0xfb, 0x0, 0x9, 0xf4, 0x8f, 0x70, 0x0, - 0xdf, 0x0, 0x0, 0xef, 0x10, 0xf, 0xe0, 0x2f, - 0xc0, 0x3, 0xfa, 0x0, 0x0, 0x8f, 0x60, 0x5f, - 0x80, 0xc, 0xf2, 0x9, 0xf4, 0x0, 0x0, 0x2f, - 0xc0, 0xbf, 0x20, 0x6, 0xf8, 0xe, 0xe0, 0x0, - 0x0, 0xc, 0xf3, 0xfc, 0x0, 0x0, 0xfe, 0x5f, - 0x90, 0x0, 0x0, 0x7, 0xfe, 0xf6, 0x0, 0x0, - 0xaf, 0xdf, 0x30, 0x0, 0x0, 0x1, 0xff, 0xf1, - 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xa0, 0x0, 0x0, 0xe, 0xf7, 0x0, 0x0, - - /* U+0078 "x" */ - 0x2f, 0xf4, 0x0, 0x0, 0x2f, 0xf3, 0x5, 0xfe, - 0x10, 0x0, 0xcf, 0x70, 0x0, 0x9f, 0xb0, 0x9, - 0xfb, 0x0, 0x0, 0xd, 0xf7, 0x4f, 0xe1, 0x0, - 0x0, 0x2, 0xff, 0xef, 0x30, 0x0, 0x0, 0x0, - 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, - 0x0, 0x0, 0x0, 0x5, 0xfe, 0xdf, 0x60, 0x0, - 0x0, 0x2f, 0xf4, 0x2f, 0xf3, 0x0, 0x0, 0xcf, - 0x80, 0x6, 0xfe, 0x10, 0x9, 0xfc, 0x0, 0x0, - 0xaf, 0xb0, 0x5f, 0xe1, 0x0, 0x0, 0xd, 0xf7, - - /* U+0079 "y" */ - 0xd, 0xf6, 0x0, 0x0, 0x0, 0xe, 0xf1, 0x6, - 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xa0, 0x0, 0xef, - 0x40, 0x0, 0x0, 0xdf, 0x30, 0x0, 0x7f, 0xb0, - 0x0, 0x4, 0xfc, 0x0, 0x0, 0x1f, 0xf2, 0x0, - 0xb, 0xf5, 0x0, 0x0, 0x9, 0xf9, 0x0, 0x2f, - 0xd0, 0x0, 0x0, 0x2, 0xff, 0x0, 0x9f, 0x70, - 0x0, 0x0, 0x0, 0xbf, 0x71, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xd7, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfc, - 0x0, 0x0, 0x0, 0x6, 0x10, 0x2e, 0xf5, 0x0, - 0x0, 0x0, 0x4f, 0xfe, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x8, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0x70, 0xcc, 0xcc, - 0xcc, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0xc, 0xf9, - 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, - 0x5, 0xfe, 0x20, 0x0, 0x0, 0x2, 0xff, 0x40, - 0x0, 0x0, 0x1, 0xdf, 0x80, 0x0, 0x0, 0x0, - 0xbf, 0xb0, 0x0, 0x0, 0x0, 0x7f, 0xd1, 0x0, - 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0xe, - 0xfe, 0xcc, 0xcc, 0xcc, 0x72, 0xff, 0xff, 0xff, - 0xff, 0xfa, - - /* U+007B "{" */ - 0x0, 0x9, 0xef, 0x40, 0x9, 0xff, 0xd3, 0x0, - 0xef, 0x60, 0x0, 0xf, 0xf2, 0x0, 0x0, 0xff, - 0x20, 0x0, 0xf, 0xf2, 0x0, 0x0, 0xff, 0x20, - 0x0, 0xf, 0xf2, 0x0, 0x1, 0xff, 0x10, 0x9, - 0xef, 0xb0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x3f, - 0xf0, 0x0, 0x0, 0xff, 0x10, 0x0, 0xf, 0xf2, - 0x0, 0x0, 0xff, 0x20, 0x0, 0xf, 0xf2, 0x0, - 0x0, 0xff, 0x20, 0x0, 0xf, 0xf2, 0x0, 0x0, - 0xdf, 0x60, 0x0, 0x8, 0xff, 0xd3, 0x0, 0x8, - 0xef, 0x40, - - /* U+007C "|" */ - 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, - 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, - 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, - 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x40, - - /* U+007D "}" */ - 0x9f, 0xd6, 0x0, 0x7, 0xef, 0xf4, 0x0, 0x0, - 0xaf, 0xa0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x6f, - 0xb0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x6f, 0xb0, - 0x0, 0x6, 0xfb, 0x0, 0x0, 0x5f, 0xd0, 0x0, - 0x1, 0xef, 0xd5, 0x0, 0xb, 0xff, 0x70, 0x4, - 0xfe, 0x10, 0x0, 0x5f, 0xb0, 0x0, 0x6, 0xfb, - 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x6, 0xfb, 0x0, - 0x0, 0x6f, 0xb0, 0x0, 0x6, 0xfb, 0x0, 0x0, - 0xaf, 0x90, 0x7, 0xef, 0xf3, 0x0, 0x9f, 0xd5, - 0x0, 0x0, - - /* U+007E "~" */ - 0x1, 0x89, 0x50, 0x0, 0x9, 0x51, 0xef, 0xff, - 0xa0, 0x2, 0xf5, 0x7f, 0x41, 0x8f, 0xd8, 0xdf, - 0x1a, 0xb0, 0x0, 0x3c, 0xfd, 0x40, - - /* U+00B0 "°" */ - 0x0, 0x4c, 0xfd, 0x60, 0x0, 0x4f, 0x83, 0x6f, - 0x80, 0xc, 0x80, 0x0, 0x5f, 0x0, 0xf4, 0x0, - 0x1, 0xf3, 0xd, 0x60, 0x0, 0x4f, 0x10, 0x7e, - 0x50, 0x3d, 0xa0, 0x0, 0x8f, 0xff, 0xa0, 0x0, - 0x0, 0x2, 0x10, 0x0, - - /* U+2022 "•" */ - 0x0, 0x0, 0x1, 0xcf, 0xb0, 0x7f, 0xff, 0x56, - 0xff, 0xf5, 0xb, 0xfa, 0x0, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x48, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x1, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x94, 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, 0xef, 0xd0, - 0x0, 0x0, 0xa, 0xff, 0xea, 0x50, 0x0, 0x0, - 0x0, 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, - 0x0, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, - 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, - 0x0, 0x3, 0x54, 0xff, 0xd0, 0x0, 0x0, 0xa, - 0xff, 0x10, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xd0, 0x1, 0x69, 0x9d, 0xff, - 0x10, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfc, 0x6, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xff, 0x61, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x2a, 0xff, 0xfc, 0x50, 0x1f, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xcc, - 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F008 "" */ - 0x42, 0x0, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x87, 0x0, 0x24, 0xf8, 0x22, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x22, 0x8f, 0xff, 0xff, - 0xff, 0xb9, 0x99, 0x99, 0x99, 0x9b, 0xff, 0xff, - 0xff, 0xf9, 0x44, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x44, 0x9f, 0xf6, 0x0, 0xef, 0x30, - 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x6f, 0xf7, - 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x3, 0xfe, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xfa, 0x66, 0xff, - 0x74, 0x44, 0x44, 0x44, 0x47, 0xff, 0x66, 0xaf, - 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x6f, 0xf6, 0x0, 0xef, 0xdc, 0xcc, - 0xcc, 0xcc, 0xcd, 0xfe, 0x0, 0x6f, 0xff, 0xee, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, 0xee, - 0xff, 0xfc, 0x88, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x88, 0xcf, 0xf6, 0x0, 0xef, 0x30, - 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x6f, 0xf6, - 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x3, 0xfe, - 0x0, 0x6f, 0xfe, 0xcc, 0xff, 0x41, 0x11, 0x11, - 0x11, 0x14, 0xff, 0xcc, 0xef, 0xfd, 0xaa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xdf, - 0xc6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x6c, - - /* U+F00B "" */ - 0xbf, 0xff, 0xfe, 0x31, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x63, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, - 0x88, 0x87, 0x0, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0x31, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x53, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x47, 0x88, 0x87, 0x0, - 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0x31, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x37, 0x77, 0x76, 0x0, 0x57, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x74, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0x30, 0x4, 0xe8, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xf3, 0x0, 0x4f, 0xff, 0x80, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0x30, 0x0, - 0xef, 0xff, 0xf8, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, 0x2, - 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xf8, 0x2e, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xd3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x8, 0xc4, 0x0, 0x0, 0x0, 0x2, 0xc9, 0x0, - 0x9f, 0xff, 0x40, 0x0, 0x0, 0x2e, 0xff, 0xb0, - 0xff, 0xff, 0xf4, 0x0, 0x2, 0xef, 0xff, 0xf1, - 0x7f, 0xff, 0xff, 0x40, 0x2e, 0xff, 0xff, 0x90, - 0x8, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xfa, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x2, 0xef, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x0, - 0x2e, 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xff, 0x40, - 0xdf, 0xff, 0xfa, 0x0, 0x8, 0xff, 0xff, 0xf0, - 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x8f, 0xff, 0xe0, - 0x2e, 0xfa, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, - 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0x50, 0xe, 0xff, 0x80, - 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, - 0xe, 0xff, 0x80, 0x4f, 0xff, 0x50, 0x0, 0x0, - 0x9f, 0xff, 0xe0, 0xe, 0xff, 0x80, 0x5f, 0xff, - 0xf2, 0x0, 0x3, 0xff, 0xfe, 0x30, 0xe, 0xff, - 0x80, 0x8, 0xff, 0xfc, 0x0, 0xb, 0xff, 0xf3, - 0x0, 0xe, 0xff, 0x80, 0x0, 0xaf, 0xff, 0x50, - 0x1f, 0xff, 0x90, 0x0, 0xe, 0xff, 0x80, 0x0, - 0x1f, 0xff, 0xb0, 0x6f, 0xff, 0x30, 0x0, 0xe, - 0xff, 0x80, 0x0, 0x9, 0xff, 0xf0, 0x8f, 0xff, - 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x5, 0xff, - 0xf2, 0xaf, 0xfd, 0x0, 0x0, 0xe, 0xff, 0x80, - 0x0, 0x3, 0xff, 0xf3, 0x9f, 0xfd, 0x0, 0x0, - 0xc, 0xff, 0x50, 0x0, 0x4, 0xff, 0xf2, 0x8f, - 0xff, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x6, - 0xff, 0xf1, 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xe0, 0xf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, - 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0x20, 0x1, 0xef, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x0, 0x0, 0x4f, - 0xff, 0xfd, 0x62, 0x1, 0x49, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7d, 0xff, 0xff, 0xff, 0xb4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x65, - 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, - 0xee, 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0x2a, - 0xff, 0xff, 0xff, 0xb2, 0x3, 0x80, 0x0, 0x0, - 0x8f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, - 0xf8, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x55, 0xaf, 0xff, - 0xff, 0xff, 0xf2, 0x6, 0xef, 0xff, 0xff, 0x70, - 0x0, 0x7, 0xff, 0xff, 0xff, 0x60, 0x0, 0x2f, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, - 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x2f, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0x20, 0x0, 0x1, 0xff, 0xff, - 0xf9, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x3d, 0xff, 0xff, 0xff, 0xe1, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2f, - 0xb2, 0x9f, 0xff, 0xff, 0xff, 0xfa, 0x2a, 0xf3, - 0x0, 0x0, 0x1, 0x0, 0x2, 0xdf, 0xff, 0xfe, - 0x30, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x66, - 0x41, 0x0, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xe9, 0x0, - 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xfc, 0x10, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xfe, 0x37, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xb4, 0xdf, 0xff, 0xbf, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0x80, - 0x1, 0xbf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0x50, 0x8f, 0x50, 0x9f, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x30, - 0xbf, 0xff, 0x70, 0x6f, 0xff, 0xf1, 0x0, 0x0, - 0x7, 0xff, 0xfc, 0x12, 0xdf, 0xff, 0xff, 0xa0, - 0x3e, 0xff, 0xe3, 0x0, 0xa, 0xff, 0xfa, 0x3, - 0xef, 0xff, 0xff, 0xff, 0xc1, 0x2d, 0xff, 0xf6, - 0xc, 0xff, 0xf7, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe3, 0xb, 0xff, 0xf8, 0x9f, 0xf5, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x8, - 0xff, 0x50, 0x93, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x5, 0x70, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xcc, 0xcf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0x50, 0x0, 0x9f, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xf5, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0x50, 0x0, 0x9f, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x40, 0x0, - 0x8f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2, - 0x44, 0x44, 0x40, 0x0, 0x1, 0x44, 0x44, 0x41, - 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xee, 0xee, 0xff, - 0xff, 0xff, 0xee, 0xee, 0x20, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xfc, 0x4, 0xff, 0x40, 0xcf, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x23, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x44, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x6e, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, - 0x5d, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+F01C "" */ - 0x0, 0x0, 0x4, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0x50, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0xd, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xfa, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf5, 0x3, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xe1, 0xdf, 0xfa, 0x44, 0x44, - 0x20, 0x0, 0x0, 0x0, 0x34, 0x44, 0x4d, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x88, - 0x88, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x10, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x76, 0x0, 0x0, 0x0, 0x5, 0x9c, - 0xdd, 0xb8, 0x30, 0x0, 0xf, 0xff, 0x0, 0x0, - 0x6, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x40, 0xf, - 0xff, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xf, 0xff, 0x0, 0xc, 0xff, 0xff, - 0xa5, 0x34, 0x6b, 0xff, 0xff, 0xce, 0xff, 0x0, - 0xaf, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x2b, 0xff, - 0xff, 0xff, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xd, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x7d, 0xdc, 0xbf, 0xff, 0xff, - 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0x6f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x2, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x22, - 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xde, - 0xee, 0xee, 0xee, 0xe7, 0x0, 0x0, 0x0, 0x0, - 0x9e, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf3, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xe0, - 0xff, 0xff, 0xf4, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0x70, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0xff, 0xff, - 0xff, 0xfd, 0x61, 0x0, 0x5, 0xcf, 0xff, 0xf2, - 0x0, 0xff, 0xe3, 0xef, 0xff, 0xff, 0xee, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0xff, 0xf0, 0x19, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x28, 0xdf, 0xff, 0xfe, 0xa3, 0x0, - 0x0, 0x0, 0xab, 0xa0, 0x0, 0x0, 0x1, 0x33, - 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, - 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x24, 0x44, - 0x47, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x24, 0x44, 0x47, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x75, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x2f, 0xf7, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x7f, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0xdf, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xf, 0xf3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xc, 0xfd, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x1, 0xfe, 0x20, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, - 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0x0, 0x0, 0x1, 0x0, 0x7f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, - 0x0, 0x5, 0xf9, 0x0, 0x9f, 0xe1, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xfb, - 0x0, 0xdf, 0x80, 0x24, 0x44, 0x47, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x3f, 0xf7, 0x4, 0xff, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x86, 0x0, - 0x4f, 0xf1, 0xd, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x2f, 0xf7, 0x0, 0xcf, 0x60, 0x9f, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x6f, - 0xf1, 0x7, 0xf9, 0x6, 0xfa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xdf, 0x40, 0x5f, 0xb0, - 0x5f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x1f, 0xf2, 0x5, 0xfa, 0x5, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xd, 0xfc, 0x0, 0x9f, - 0x80, 0x7f, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1, 0xfd, 0x20, 0x1e, 0xf3, 0xb, 0xf6, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0x0, 0xa, - 0xfc, 0x1, 0xff, 0x20, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0x0, 0x0, 0xb, 0xff, 0x20, 0x8f, 0xc0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x7, - 0xff, 0x40, 0x2f, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0x0, 0x0, 0x19, 0x20, 0x1d, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, - 0x0, 0x0, 0x2d, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xfb, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x50, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x1, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0xd, 0xff, 0xff, 0xff, 0xdb, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x2f, 0xff, 0xff, - 0xfd, 0x10, 0xaf, 0xff, 0xff, 0xff, 0xfb, 0x56, - 0xef, 0xff, 0xff, 0xd1, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf7, 0x2e, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0x70, 0x2, 0xed, 0x10, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x21, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe4, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0xef, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xff, 0xc0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xdf, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x9f, 0xf5, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x3f, 0xfe, 0x21, 0x8b, 0xff, 0xff, 0xff, 0x50, - 0xa, 0xff, 0xf7, 0x20, 0xdf, 0xff, 0xfb, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x17, 0xab, 0xa7, 0x20, 0x0, 0x0, - - /* U+F048 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xc0, 0x0, 0x0, 0x0, 0xb, 0xd3, 0x2f, - 0xfe, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x82, 0xff, - 0xe0, 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x2f, 0xfe, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0x92, 0xff, 0xe0, - 0x0, 0x3e, 0xff, 0xff, 0xf9, 0x2f, 0xfe, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0x92, 0xff, 0xe0, 0x5f, - 0xff, 0xff, 0xff, 0xf9, 0x2f, 0xfe, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0x92, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x92, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x2f, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0x92, 0xff, 0xe0, 0xbf, 0xff, 0xff, 0xff, - 0xf9, 0x2f, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0x92, 0xff, 0xe0, 0x0, 0x8f, 0xff, 0xff, 0xf9, - 0x2f, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x92, - 0xff, 0xe0, 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x2f, - 0xfe, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x92, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x4, 0x43, - 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, - - /* U+F04B "" */ - 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xfb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x40, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2a, 0xa3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x3d, 0xff, 0xff, 0xe6, 0x0, 0x3, 0xdf, 0xff, - 0xfe, 0x60, 0xdf, 0xff, 0xff, 0xff, 0x10, 0xd, - 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, - 0x30, 0xf, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x30, 0xf, - 0xff, 0xff, 0xff, 0xf3, 0x8f, 0xff, 0xff, 0xfb, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xb0, 0x2, 0x44, - 0x44, 0x30, 0x0, 0x0, 0x24, 0x44, 0x43, 0x0, - - /* U+F04D "" */ - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x60, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x2, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, - - /* U+F051 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xdc, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x7f, - 0xfd, 0x20, 0x0, 0x0, 0xd, 0xff, 0x47, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0xdf, 0xf4, 0x7f, 0xff, - 0xff, 0x40, 0x0, 0xd, 0xff, 0x47, 0xff, 0xff, - 0xff, 0x50, 0x0, 0xdf, 0xf4, 0x7f, 0xff, 0xff, - 0xff, 0x60, 0xd, 0xff, 0x47, 0xff, 0xff, 0xff, - 0xff, 0x70, 0xdf, 0xf4, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0x8d, 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xcd, - 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xdf, - 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xff, - 0x47, 0xff, 0xff, 0xff, 0x90, 0x0, 0xdf, 0xf4, - 0x7f, 0xff, 0xff, 0x80, 0x0, 0xd, 0xff, 0x47, - 0xff, 0xff, 0x70, 0x0, 0x0, 0xdf, 0xf4, 0x7f, - 0xff, 0x60, 0x0, 0x0, 0xd, 0xff, 0x44, 0xff, - 0x50, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x2, 0x20, - 0x0, 0x0, 0x0, 0x2, 0x44, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x8, 0xea, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x1, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x56, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x27, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x30, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x19, 0x20, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xe2, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xf8, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xd1, - 0x0, 0x0, 0x1d, 0xff, 0xfc, 0x10, 0x0, 0x1, - 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x1d, 0xff, 0xfc, - 0x10, 0x0, 0x1, 0xdf, 0xff, 0xc1, 0x0, 0x0, - 0x1d, 0xff, 0xfc, 0x10, 0x0, 0x0, 0xbf, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+F054 "" */ - 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xf3, 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x9, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x9f, 0xff, 0xf4, - 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x1c, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x1, 0xbe, 0xd3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x14, 0x55, - 0x55, 0x59, 0xff, 0xfc, 0x55, 0x55, 0x54, 0x20, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x6c, 0xdd, - 0xdd, 0xde, 0xff, 0xff, 0xdd, 0xdd, 0xdc, 0x90, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x36, 0x50, 0x0, 0x0, 0x0, 0x0, - - /* U+F068 "" */ - 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x43, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5b, 0xff, 0xff, 0xff, 0xea, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xfd, 0xce, - 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xff, 0xff, 0x71, 0x0, 0x2, 0x9f, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfe, 0x20, 0x2, - 0x53, 0x0, 0x5f, 0xff, 0xfb, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0x30, 0x0, 0x6f, 0xfc, 0x10, 0x7f, - 0xff, 0xfb, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x0, - 0x6, 0xff, 0xfc, 0x0, 0xef, 0xff, 0xf8, 0x6, - 0xff, 0xff, 0xf5, 0x1, 0x3, 0xef, 0xff, 0xf4, - 0x9, 0xff, 0xff, 0xf3, 0xef, 0xff, 0xff, 0x30, - 0xbf, 0xff, 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, - 0xad, 0xff, 0xff, 0xf3, 0xa, 0xff, 0xff, 0xff, - 0xf6, 0x7, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, - 0x60, 0x5f, 0xff, 0xff, 0xff, 0x10, 0xaf, 0xff, - 0xfe, 0x10, 0x8f, 0xff, 0xfc, 0x0, 0xaf, 0xff, - 0xff, 0x60, 0x1f, 0xff, 0xff, 0x50, 0x0, 0xaf, - 0xff, 0xf6, 0x0, 0x6c, 0xdb, 0x40, 0xa, 0xff, - 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xfc, 0x52, 0x12, 0x6d, 0xff, - 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x5a, 0xde, 0xfe, 0xd9, - 0x50, 0x0, 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xd2, 0x0, 0x0, 0x0, - 0x24, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0x60, 0x28, 0xcf, 0xff, 0xff, - 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xff, 0xfc, 0xff, 0xff, 0xec, 0xdf, 0xff, 0xfe, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xa3, 0x0, 0x0, 0x6e, 0xff, 0xfc, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0x70, - 0x15, 0x40, 0x1, 0xdf, 0xff, 0xe3, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x1c, 0xff, 0xfb, 0x1f, 0xfe, - 0x50, 0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x7e, - 0x30, 0x0, 0x9f, 0xff, 0xef, 0xff, 0xf3, 0x8, - 0xff, 0xff, 0xd0, 0x0, 0x2, 0xff, 0xf6, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xfa, 0x3, 0xff, 0xff, - 0xf8, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, 0x2d, - 0xff, 0xff, 0xfd, 0x1, 0xff, 0xff, 0xff, 0x0, - 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, - 0xfb, 0x2, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xdf, - 0xff, 0xfd, 0x0, 0x0, 0x6, 0xff, 0xff, 0x55, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x3d, 0xff, 0xfe, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x10, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0xe8, 0x31, 0x20, 0x0, 0x3e, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xef, 0xff, 0xff, 0xfb, 0x0, 0x1, 0xbf, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, - 0xef, 0xfd, 0x80, 0x0, 0x8, 0xff, 0xfd, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x60, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xfd, 0x88, 0x8f, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, - 0x0, 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x0, 0xd, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xa0, 0x0, 0xef, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, - 0x0, 0xf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xfd, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xfd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x6f, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x17, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x2, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x90, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3c, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, - 0x0, 0x12, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x22, 0x9f, 0xff, 0x50, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x45, 0x55, 0xbf, - 0xff, 0x60, 0xaf, 0xff, 0xd5, 0xaf, 0xff, 0x80, - 0x0, 0x0, 0xb, 0xf8, 0xa, 0xff, 0xfe, 0x10, - 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x70, 0x9f, - 0xff, 0xe2, 0x0, 0x4f, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, 0x10, - 0x0, 0x2a, 0x30, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x41, 0xda, 0x0, 0x7f, 0xf3, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf4, 0xd, 0xff, 0x90, 0x8f, - 0xff, 0x30, 0xef, 0xff, 0xff, 0xff, 0x50, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xfa, 0x67, 0x77, 0x75, 0x0, 0x0, - 0x0, 0x3, 0x77, 0xbf, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x4e, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xfc, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xfa, 0x5, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x5, 0xff, - 0xff, 0x70, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x70, 0x3f, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x7a, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x2e, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0x50, 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x40, - - /* U+F078 "" */ - 0x9, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcb, 0x18, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xfc, 0x9f, 0xff, 0xe3, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xd0, 0xbf, 0xff, 0xe3, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xd1, 0x0, 0xbf, - 0xff, 0xe3, 0x0, 0x1, 0xcf, 0xff, 0xd1, 0x0, - 0x0, 0xbf, 0xff, 0xe3, 0x1, 0xcf, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe4, 0xcf, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, - 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x27, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfd, - 0x10, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xd1, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xfd, 0x15, 0xbb, 0xbb, - 0xbb, 0xbb, 0xef, 0xf1, 0x0, 0x0, 0xdf, 0xfb, - 0xef, 0xdc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf1, 0x0, 0x0, 0x9f, 0xc0, 0xef, 0xd1, - 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, - 0x0, 0x0, 0x3, 0x0, 0xef, 0xd0, 0x3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x50, 0xaf, 0xf1, - 0x19, 0x30, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf6, 0xaf, 0xf3, 0xdf, 0xe0, - 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xef, 0xfe, 0xff, 0xd0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x17, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x6f, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x6b, 0xbb, 0xbb, 0xbb, - 0xbb, 0xba, 0x30, 0x6, 0xff, 0xfc, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x5, 0x78, 0x88, 0x88, 0x71, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, - 0xcc, 0xcc, 0xcb, 0x91, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe4, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x11, 0x11, 0xef, - 0xff, 0xf9, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xe0, 0xdf, 0xff, 0xf8, 0xe, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xf3, 0x26, - 0x66, 0x50, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x52, 0x22, 0x25, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x6e, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, - 0x5d, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xc8, 0x51, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x5, 0xb8, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x1, 0x8e, 0xff, - 0xf6, 0x0, 0x8, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xf4, 0x4d, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xb5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xb9, - 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x1, 0x8c, 0xda, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x1d, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0xef, 0xe1, - 0xc, 0xff, 0x20, 0x0, 0xbf, 0xff, 0xfe, 0x30, - 0xff, 0xd0, 0xa, 0xff, 0x30, 0xb, 0xff, 0xff, - 0xe3, 0x0, 0xbf, 0xfc, 0xbf, 0xff, 0x10, 0xcf, - 0xff, 0xfe, 0x30, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xdc, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x1, 0x2d, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0x8c, - 0xef, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x33, 0xef, - 0xff, 0xfc, 0x0, 0x0, 0xef, 0xe1, 0xc, 0xff, - 0x20, 0x2e, 0xff, 0xff, 0xc1, 0x0, 0xff, 0xd0, - 0xa, 0xff, 0x30, 0x2, 0xef, 0xff, 0xfc, 0x10, - 0xbf, 0xfc, 0xbf, 0xff, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xd1, 0x3, 0xdf, 0xfe, 0x60, - 0x0, 0x0, 0x0, 0x4, 0x75, 0x0, 0x0, 0x1, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xfe, 0xe, 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xfe, 0xe, 0xf7, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xfe, 0xe, 0xff, 0x70, - 0x1, 0x22, 0x5, 0xff, 0xff, 0xff, 0xfe, 0xe, - 0xff, 0xf2, 0xdf, 0xff, 0x25, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0xff, 0xff, 0x25, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0x24, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0x50, 0x56, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, 0xff, 0xff, - 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x8b, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xb7, 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x2a, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x91, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x10, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xd0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xf5, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xf6, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf6, - 0xff, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xff, - 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, - 0xff, 0xfe, 0x51, 0x3b, 0xff, 0xff, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xf6, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf6, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xda, 0xbf, 0xff, 0xff, - 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, - - /* U+F0C9 "" */ - 0xce, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x13, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x12, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x10, - - /* U+F0E0 "" */ - 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x20, 0x7f, 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, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x4, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x40, 0xb1, 0x1b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb1, 0x3e, 0xfe, 0x50, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x7, 0xff, - 0xff, 0xf9, 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, - 0x31, 0xbf, 0xff, 0xff, 0xff, 0xd3, 0x1b, 0xff, - 0xff, 0xff, 0xb1, 0x4e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x6f, 0xff, 0xf6, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x12, 0x99, 0x22, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x33, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe4, - - /* U+F0E7 "" */ - 0x0, 0x3, 0x44, 0x44, 0x43, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xfe, 0x66, 0x66, 0x51, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x1, 0x22, 0x22, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0x90, 0x0, 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8c, 0xcc, 0xdf, 0xbc, - 0xfc, 0xcc, 0xc6, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xfe, 0x1, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x92, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xfc, 0x1, 0x22, 0x22, 0x22, 0x1, 0x0, 0x0, - 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xfc, 0xe, - 0x70, 0x0, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, - 0xfc, 0xe, 0xf7, 0x0, 0xff, 0xff, 0xf8, 0x1f, - 0xff, 0xff, 0xfc, 0xe, 0xff, 0x70, 0xff, 0xff, - 0xf8, 0x1f, 0xff, 0xff, 0xfc, 0xe, 0xff, 0xf2, - 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xf8, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x58, 0x88, 0x84, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x8, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x80, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x28, 0xef, 0xf9, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfb, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x6c, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7b, 0x81, 0x0, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x19, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xb7, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0x0, - 0x8f, 0x10, 0x7f, 0x10, 0x5f, 0x30, 0x3f, 0x50, - 0x1f, 0xfc, 0xff, 0xc0, 0x7, 0xe0, 0x6, 0xf0, - 0x4, 0xf2, 0x2, 0xf4, 0x0, 0xff, 0xcf, 0xfc, - 0x0, 0x8f, 0x0, 0x7f, 0x10, 0x5f, 0x30, 0x3f, - 0x50, 0x1f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xfe, 0x66, 0xbf, 0x66, 0xaf, 0x76, 0x8f, - 0x86, 0x7f, 0xff, 0xfc, 0xff, 0xff, 0xd0, 0x6, - 0xf0, 0x5, 0xf1, 0x3, 0xf3, 0x1, 0xff, 0xff, - 0xcf, 0xff, 0xfd, 0x0, 0x7f, 0x0, 0x5f, 0x10, - 0x3f, 0x30, 0x1f, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xfe, 0x66, 0xcf, 0x76, 0x66, 0x66, - 0x66, 0x66, 0x9f, 0xa6, 0x7f, 0xfc, 0xff, 0xc0, - 0x7, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf4, - 0x0, 0xff, 0xcf, 0xfc, 0x0, 0x7e, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0x40, 0xf, 0xfc, 0xff, - 0xfc, 0xce, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, - 0xfd, 0xcc, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x10, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6d, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x4, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, - 0x22, 0x7f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb8, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F15B "" */ - 0x37, 0x77, 0x77, 0x77, 0x74, 0x5, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xfa, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0xfa, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xff, - 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, - 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x40, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x26, 0x9c, 0xde, 0xdc, 0xb8, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xdb, 0x99, 0x9a, - 0xcf, 0xff, 0xff, 0xff, 0xb1, 0x0, 0xa, 0xff, - 0xff, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x39, - 0xef, 0xff, 0xfe, 0x40, 0xcf, 0xff, 0xfb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xf4, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xf2, - 0xa, 0xd2, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xed, - 0xb6, 0x20, 0x0, 0x0, 0x8e, 0x30, 0x0, 0x0, - 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfb, - 0x87, 0x89, 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xe6, 0x0, 0x0, 0x0, - 0x3, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xba, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3, - 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfa, - 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfa, 0xff, 0xc0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7, - 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0x92, 0x0, - - /* U+F241 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x3, - 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xfa, - 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x86, 0x0, 0x0, 0x7, - 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0x92, 0x0, - - /* U+F242 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, - 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, - 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, - 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, - 0x88, 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0x92, 0x0, - - /* U+F243 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, - 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, - 0xff, 0xc0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, - 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, - 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0x92, 0x0, - - /* U+F244 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x7f, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0x92, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, - 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x12, 0xdf, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0x76, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x4c, - 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, - 0x0, 0x0, 0xd, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xd2, 0x0, - 0x4f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x40, 0x0, 0xaf, 0xff, 0xfc, 0x1, 0xde, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x10, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, - 0xff, 0x88, 0x88, 0x9f, 0xe8, 0x88, 0x88, 0x88, - 0x88, 0x8f, 0xff, 0x91, 0x5f, 0xff, 0xf8, 0x0, - 0x0, 0x7, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xc3, 0x0, 0x4, 0xbb, 0x60, 0x0, 0x0, 0x0, - 0xeb, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x30, - 0x8, 0x88, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xc1, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x27, 0x9f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x9e, 0xff, 0xff, 0xc7, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xdf, 0xff, 0xfd, - 0x20, 0x0, 0x8, 0xff, 0xff, 0xf2, 0xdf, 0xff, - 0xfe, 0x0, 0x3, 0xff, 0xff, 0xff, 0x11, 0xdf, - 0xff, 0xf9, 0x0, 0xaf, 0xff, 0xff, 0xf1, 0x1, - 0xef, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0x12, - 0x12, 0xef, 0xff, 0x53, 0xff, 0xf4, 0x7f, 0xf1, - 0x3d, 0x13, 0xff, 0xf8, 0x6f, 0xff, 0x40, 0x7f, - 0x13, 0xf5, 0xc, 0xff, 0xb8, 0xff, 0xff, 0x40, - 0x71, 0x35, 0xa, 0xff, 0xfd, 0x9f, 0xff, 0xff, - 0x40, 0x0, 0x8, 0xff, 0xff, 0xea, 0xff, 0xff, - 0xff, 0x30, 0x6, 0xff, 0xff, 0xfe, 0xaf, 0xff, - 0xff, 0xf4, 0x0, 0x6f, 0xff, 0xff, 0xe9, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x8f, - 0xff, 0xf4, 0x6, 0x13, 0x50, 0x8f, 0xff, 0xd6, - 0xff, 0xf4, 0x7, 0xf1, 0x3f, 0x40, 0x9f, 0xfb, - 0x3f, 0xff, 0x47, 0xff, 0x13, 0xd1, 0x1d, 0xff, - 0x90, 0xff, 0xff, 0xff, 0xf1, 0x21, 0x1d, 0xff, - 0xf5, 0xa, 0xff, 0xff, 0xff, 0x20, 0x2e, 0xff, - 0xff, 0x0, 0x2f, 0xff, 0xff, 0xf2, 0x2e, 0xff, - 0xff, 0x80, 0x0, 0x6f, 0xff, 0xff, 0x4e, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, - 0xff, 0xc2, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xdd, - 0xc9, 0x40, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0xac, 0xcc, 0xcd, 0xff, - 0xff, 0xff, 0xfd, 0xcc, 0xcc, 0xc1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0xa, 0xff, 0xe1, 0xef, 0xf2, 0xcf, - 0xf3, 0xbf, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, - 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, - 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, - 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, - 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, - 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, - 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, - 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, - 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, - 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, - 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, - 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, - 0xe1, 0xef, 0xf1, 0xcf, 0xf3, 0xaf, 0xfe, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7b, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcb, 0x91, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xc, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xf4, 0xc, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf4, 0xc, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xf4, 0xc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xf4, 0xc, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb9, 0x75, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x2, 0x68, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x75, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x80, 0xcf, - 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0xc, 0xfc, 0x0, - 0xc, 0xff, 0xff, 0xf8, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x90, 0x0, 0x5f, 0xff, - 0xff, 0xf8, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf8, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x10, 0x0, 0xcf, 0xff, - 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x5, 0xf5, 0x0, 0xd, 0xff, 0xff, 0xf8, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x5f, - 0xff, 0x50, 0x2e, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xf8, - 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x9, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, - 0x70, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x2, 0xef, 0xbb, 0xfc, 0xbf, 0xdb, - 0xbf, 0xf9, 0x2, 0xef, 0xd0, 0x2f, 0x40, 0xe7, - 0x1, 0xff, 0xa2, 0xef, 0xfd, 0x2, 0xf4, 0xe, - 0x70, 0x1f, 0xfa, 0xef, 0xff, 0xd0, 0x2f, 0x40, - 0xe7, 0x1, 0xff, 0xaf, 0xff, 0xfd, 0x24, 0xf6, - 0x2e, 0x82, 0x3f, 0xfa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x9, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd5, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0x10, 0x0, 0x3, 0xed, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x4, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x10, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf1, 0x6, 0xff, 0xff, - 0xf6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x9f, 0xff, - 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x2, 0xef, 0xff, 0xf1, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x2, - 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 95, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 94, .box_w = 4, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 32, .adv_w = 138, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 57, .adv_w = 247, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 177, .adv_w = 219, .box_w = 13, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 320, .adv_w = 297, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 464, .adv_w = 241, .box_w = 15, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 592, .adv_w = 74, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 603, .adv_w = 119, .box_w = 5, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 656, .adv_w = 119, .box_w = 6, .box_h = 21, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 719, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 760, .adv_w = 205, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 815, .adv_w = 80, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 826, .adv_w = 135, .box_w = 7, .box_h = 2, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 833, .adv_w = 80, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 839, .adv_w = 124, .box_w = 10, .box_h = 21, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 944, .adv_w = 235, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1048, .adv_w = 130, .box_w = 6, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1096, .adv_w = 202, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1192, .adv_w = 201, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1288, .adv_w = 235, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1408, .adv_w = 202, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1504, .adv_w = 217, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1600, .adv_w = 210, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1704, .adv_w = 227, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1816, .adv_w = 217, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1920, .adv_w = 80, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1938, .adv_w = 80, .box_w = 3, .box_h = 16, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1962, .adv_w = 205, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 2023, .adv_w = 205, .box_w = 11, .box_h = 7, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 2062, .adv_w = 205, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 2123, .adv_w = 202, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2219, .adv_w = 364, .box_w = 21, .box_h = 20, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 2429, .adv_w = 258, .box_w = 18, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2573, .adv_w = 266, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2685, .adv_w = 254, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2805, .adv_w = 291, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2933, .adv_w = 236, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3029, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3125, .adv_w = 272, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3245, .adv_w = 286, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3357, .adv_w = 109, .box_w = 3, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3381, .adv_w = 181, .box_w = 11, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3469, .adv_w = 253, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3581, .adv_w = 209, .box_w = 11, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3669, .adv_w = 336, .box_w = 17, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3805, .adv_w = 286, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3917, .adv_w = 296, .box_w = 17, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4053, .adv_w = 254, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4157, .adv_w = 296, .box_w = 18, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 4328, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4432, .adv_w = 219, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4536, .adv_w = 207, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4640, .adv_w = 278, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4752, .adv_w = 251, .box_w = 17, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 4888, .adv_w = 396, .box_w = 25, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5088, .adv_w = 237, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5208, .adv_w = 228, .box_w = 16, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 5336, .adv_w = 231, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5448, .adv_w = 117, .box_w = 5, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 5501, .adv_w = 124, .box_w = 10, .box_h = 21, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 5606, .adv_w = 117, .box_w = 6, .box_h = 21, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 5669, .adv_w = 205, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 5724, .adv_w = 176, .box_w = 11, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5741, .adv_w = 211, .box_w = 7, .box_h = 3, .ofs_x = 2, .ofs_y = 14}, - {.bitmap_index = 5752, .adv_w = 210, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5818, .adv_w = 240, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5929, .adv_w = 201, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6001, .adv_w = 240, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6112, .adv_w = 215, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6190, .adv_w = 124, .box_w = 9, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6267, .adv_w = 243, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 6379, .adv_w = 240, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6481, .adv_w = 98, .box_w = 4, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6515, .adv_w = 100, .box_w = 8, .box_h = 21, .ofs_x = -3, .ofs_y = -4}, - {.bitmap_index = 6599, .adv_w = 217, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6701, .adv_w = 98, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6727, .adv_w = 372, .box_w = 20, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6847, .adv_w = 240, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6919, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7003, .adv_w = 240, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 7107, .adv_w = 240, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 7211, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7253, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7319, .adv_w = 146, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7387, .adv_w = 238, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7459, .adv_w = 197, .box_w = 14, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 7543, .adv_w = 316, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7663, .adv_w = 194, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7735, .adv_w = 197, .box_w = 14, .box_h = 16, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 7847, .adv_w = 183, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7913, .adv_w = 124, .box_w = 7, .box_h = 21, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 7987, .adv_w = 105, .box_w = 3, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 8019, .adv_w = 124, .box_w = 7, .box_h = 21, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 8093, .adv_w = 205, .box_w = 11, .box_h = 4, .ofs_x = 1, .ofs_y = 6}, - {.bitmap_index = 8115, .adv_w = 147, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 8151, .adv_w = 111, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 8164, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 8429, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8616, .adv_w = 352, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8836, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9023, .adv_w = 242, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9151, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9404, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9657, .adv_w = 396, .box_w = 25, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9907, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10160, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10373, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10626, .adv_w = 176, .box_w = 11, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10725, .adv_w = 264, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10878, .adv_w = 396, .box_w = 25, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11153, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11340, .adv_w = 242, .box_w = 16, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11524, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 11682, .adv_w = 308, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 11922, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12122, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12322, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 12480, .adv_w = 308, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 12690, .adv_w = 220, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 12810, .adv_w = 220, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 12930, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13130, .adv_w = 308, .box_w = 20, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 13180, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13393, .adv_w = 440, .box_w = 28, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 13715, .adv_w = 396, .box_w = 27, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 14026, .adv_w = 352, .box_w = 22, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14257, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 14371, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 14485, .adv_w = 440, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 14737, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14924, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 15177, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 15442, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15642, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 15872, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16072, .adv_w = 308, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 16252, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16439, .adv_w = 220, .box_w = 15, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 16612, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 16842, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 17072, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17285, .adv_w = 352, .box_w = 24, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 17561, .adv_w = 264, .box_w = 17, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 17757, .adv_w = 440, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18051, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 18261, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 18471, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 18681, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 18891, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 19101, .adv_w = 440, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 19353, .adv_w = 308, .box_w = 17, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 19549, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 19779, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 20044, .adv_w = 440, .box_w = 28, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 20282, .adv_w = 264, .box_w = 17, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 20478, .adv_w = 354, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 1} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 4, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 16, 0, 10, -8, 0, 0, - 0, 0, -19, -21, 2, 17, 8, 6, - -14, 2, 17, 1, 15, 4, 11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 21, 3, -2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 0, -11, 0, 0, 0, 0, - 0, -7, 6, 7, 0, 0, -4, 0, - -2, 4, 0, -4, 0, -4, -2, -7, - 0, 0, 0, 0, -4, 0, 0, -5, - -5, 0, 0, -4, 0, -7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - -4, 0, -5, 0, -10, 0, -43, 0, - 0, -7, 0, 7, 11, 0, 0, -7, - 4, 4, 12, 7, -6, 7, 0, 0, - -20, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -10, -4, -17, 0, -14, - -2, 0, 0, 0, 0, 1, 14, 0, - -11, -3, -1, 1, 0, -6, 0, 0, - -2, -26, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -28, -3, 13, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 12, - 0, 4, 0, 0, -7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 13, 3, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, - 7, 4, 11, -4, 0, 0, 7, -4, - -12, -48, 2, 10, 7, 1, -5, 0, - 13, 0, 11, 0, 11, 0, -33, 0, - -4, 11, 0, 12, -4, 7, 4, 0, - 0, 1, -4, 0, 0, -6, 28, 0, - 28, 0, 11, 0, 15, 5, 6, 11, - 0, 0, 0, -13, 0, 0, 0, 0, - 1, -2, 0, 2, -6, -5, -7, 2, - 0, -4, 0, 0, 0, -14, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -23, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, -19, 0, -22, 0, 0, 0, - 0, -2, 0, 35, -4, -5, 4, 4, - -3, 0, -5, 4, 0, 0, -19, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -34, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -22, 0, 21, 0, 0, -13, 0, - 12, 0, -24, -34, -24, -7, 11, 0, - 0, -24, 0, 4, -8, 0, -5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 11, -43, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 0, 2, 0, 0, 0, - 0, 0, 2, 2, -4, -7, 0, -1, - -1, -4, 0, 0, -2, 0, 0, 0, - -7, 0, -3, 0, -8, -7, 0, -9, - -12, -12, -7, 0, -7, 0, -7, 0, - 0, 0, 0, -3, 0, 0, 4, 0, - 2, -4, 0, 1, 0, 0, 0, 4, - -2, 0, 0, 0, -2, 4, 4, -1, - 0, 0, 0, -7, 0, -1, 0, 0, - 0, 0, 0, 1, 0, 5, -2, 0, - -4, 0, -6, 0, 0, -2, 0, 11, - 0, 0, -4, 0, 0, 0, 0, 0, - -1, 1, -2, -2, 0, 0, -4, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, -2, 0, -4, -4, 0, - 0, 0, 0, 0, 1, 0, 0, -2, - 0, -4, -4, -4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -2, 0, 0, - 0, 0, -2, -5, 0, -5, 0, -11, - -2, -11, 7, 0, 0, -7, 4, 7, - 10, 0, -9, -1, -4, 0, -1, -17, - 4, -2, 2, -19, 4, 0, 0, 1, - -18, 0, -19, -3, -31, -2, 0, -18, - 0, 7, 10, 0, 5, 0, 0, 0, - 0, 1, 0, -6, -5, 0, -11, 0, - 0, 0, -4, 0, 0, 0, -4, 0, - 0, 0, 0, 0, -2, -2, 0, -2, - -5, 0, 0, 0, 0, 0, 0, 0, - -4, -4, 0, -2, -4, -3, 0, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, -3, 0, -4, - 0, -2, 0, -7, 4, 0, 0, -4, - 2, 4, 4, 0, 0, 0, 0, 0, - 0, -2, 0, 0, 0, 0, 0, 2, - 0, 0, -4, 0, -4, -2, -4, 0, - 0, 0, 0, 0, 0, 0, 3, 0, - -3, 0, 0, 0, 0, -4, -5, 0, - -7, 0, 11, -2, 1, -11, 0, 0, - 10, -18, -18, -15, -7, 4, 0, -3, - -23, -6, 0, -6, 0, -7, 5, -6, - -23, 0, -10, 0, 0, 2, -1, 3, - -2, 0, 4, 0, -11, -13, 0, -18, - -8, -7, -8, -11, -4, -10, -1, -7, - -10, 2, 0, 1, 0, -4, 0, 0, - 0, 2, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - 0, -2, 0, -1, -4, 0, -6, -8, - -8, -1, 0, -11, 0, 0, 0, 0, - 0, 0, -3, 0, 0, 0, 0, 1, - -2, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, 0, 0, - -7, 0, 0, 0, 0, -18, -11, 0, - 0, 0, -5, -18, 0, 0, -4, 4, - 0, -10, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, 0, 0, -7, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, -6, 0, - 0, 0, 0, 4, 0, 2, -7, -7, - 0, -4, -4, -4, 0, 0, 0, 0, - 0, 0, -11, 0, -4, 0, -5, -4, - 0, -8, -9, -11, -3, 0, -7, 0, - -11, 0, 0, 0, 0, 28, 0, 0, - 2, 0, 0, -5, 0, 4, 0, -15, - 0, 0, 0, 0, 0, -33, -6, 12, - 11, -3, -15, 0, 4, -5, 0, -18, - -2, -5, 4, -25, -4, 5, 0, 5, - -12, -5, -13, -12, -15, 0, 0, -21, - 0, 20, 0, 0, -2, 0, 0, 0, - -2, -2, -4, -10, -12, -1, -33, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -4, 0, -2, -4, -5, 0, 0, - -7, 0, -4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, -7, 0, 0, 7, - -1, 5, 0, -8, 4, -2, -1, -9, - -4, 0, -5, -4, -2, 0, -5, -6, - 0, 0, -3, -1, -2, -6, -4, 0, - 0, -4, 0, 4, -2, 0, -8, 0, - 0, 0, -7, 0, -6, 0, -6, -6, - 4, 0, 0, 0, 0, 0, 0, 0, - 0, -7, 4, 0, -5, 0, -2, -4, - -11, -2, -2, -2, -1, -2, -4, -1, - 0, 0, 0, 0, 0, -4, -3, -3, - 0, 0, 0, 0, 4, -2, 0, -2, - 0, 0, 0, -2, -4, -2, -3, -4, - -3, 0, 3, 14, -1, 0, -10, 0, - -2, 7, 0, -4, -15, -5, 5, 0, - 0, -17, -6, 4, -6, 2, 0, -2, - -3, -11, 0, -5, 2, 0, 0, -6, - 0, 0, 0, 4, 4, -7, -7, 0, - -6, -4, -5, -4, -4, 0, -6, 2, - -7, -6, 11, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, 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, - -2, 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, -3, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, 0, -5, - 0, 0, -4, -4, 0, 0, 0, 0, - -4, 0, 0, 0, 0, -2, 0, 0, - 0, 0, 0, -2, 0, 0, 0, 0, - -5, 0, -7, 0, 0, 0, -12, 0, - 2, -8, 7, 1, -2, -17, 0, 0, - -8, -4, 0, -14, -9, -10, 0, 0, - -15, -4, -14, -13, -17, 0, -9, 0, - 3, 24, -5, 0, -8, -4, -1, -4, - -6, -10, -6, -13, -14, -8, -4, 0, - 0, -2, 0, 1, 0, 0, -25, -3, - 11, 8, -8, -13, 0, 1, -11, 0, - -18, -2, -4, 7, -32, -5, 1, 0, - 0, -23, -4, -18, -4, -26, 0, 0, - -25, 0, 21, 1, 0, -2, 0, 0, - 0, 0, -2, -2, -13, -2, 0, -23, - 0, 0, 0, 0, -11, 0, -3, 0, - -1, -10, -17, 0, 0, -2, -5, -11, - -4, 0, -2, 0, 0, 0, 0, -16, - -4, -12, -11, -3, -6, -9, -4, -6, - 0, -7, -3, -12, -5, 0, -4, -7, - -4, -7, 0, 2, 0, -2, -12, 0, - 7, 0, -6, 0, 0, 0, 0, 4, - 0, 2, -7, 14, 0, -4, -4, -4, - 0, 0, 0, 0, 0, 0, -11, 0, - -4, 0, -5, -4, 0, -8, -9, -11, - -3, 0, -7, 3, 14, 0, 0, 0, - 0, 28, 0, 0, 2, 0, 0, -5, - 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -2, -7, 0, 0, 0, 0, 0, -2, - 0, 0, 0, -4, -4, 0, 0, -7, - -4, 0, 0, -7, 0, 6, -2, 0, - 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 5, 7, 3, -3, 0, -11, - -6, 0, 11, -12, -11, -7, -7, 14, - 6, 4, -31, -2, 7, -4, 0, -4, - 4, -4, -12, 0, -4, 4, -5, -3, - -11, -3, 0, 0, 11, 7, 0, -10, - 0, -19, -5, 10, -5, -13, 1, -5, - -12, -12, -4, 14, 4, 0, -5, 0, - -10, 0, 3, 12, -8, -13, -14, -9, - 11, 0, 1, -26, -3, 4, -6, -2, - -8, 0, -8, -13, -5, -5, -3, 0, - 0, -8, -7, -4, 0, 11, 8, -4, - -19, 0, -19, -5, 0, -12, -20, -1, - -11, -6, -12, -10, 10, 0, 0, -5, - 0, -7, -3, 0, -4, -6, 0, 6, - -12, 4, 0, 0, -19, 0, -4, -8, - -6, -2, -11, -9, -12, -8, 0, -11, - -4, -8, -7, -11, -4, 0, 0, 1, - 17, -6, 0, -11, -4, 0, -4, -7, - -8, -10, -10, -13, -5, -7, 7, 0, - -5, 0, -18, -4, 2, 7, -11, -13, - -7, -12, 12, -4, 2, -33, -6, 7, - -8, -6, -13, 0, -11, -15, -4, -4, - -3, -4, -7, -11, -1, 0, 0, 11, - 10, -2, -23, 0, -21, -8, 8, -13, - -24, -7, -12, -15, -18, -12, 7, 0, - 0, 0, 0, -4, 0, 0, 4, -4, - 7, 2, -7, 7, 0, 0, -11, -1, - 0, -1, 0, 1, 1, -3, 0, 0, - 0, 0, 0, 0, -4, 0, 0, 0, - 0, 3, 11, 1, 0, -4, 0, 0, - 0, 0, -2, -2, -4, 0, 0, 0, - 1, 3, 0, 0, 0, 0, 3, 0, - -3, 0, 13, 0, 6, 1, 1, -5, - 0, 7, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11, 0, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -21, 0, -4, 6, 0, 11, - 0, 0, 35, 4, -7, -7, 4, 4, - -2, 1, -18, 0, 0, 17, -21, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -24, 13, 49, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -21, 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, -6, 0, 0, -7, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, -10, 0, - 0, 1, 0, 0, 4, 45, -7, -3, - 11, 10, -10, 4, 0, 0, 4, 4, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -46, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -10, - 0, 0, 0, -10, 0, 0, 0, 0, - -8, -2, 0, 0, 0, -8, 0, -4, - 0, -17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -24, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, -4, 0, 0, -7, 0, -5, 0, - -10, 0, 0, 0, -6, 4, -4, 0, - 0, -10, -4, -8, 0, 0, -10, 0, - -4, 0, -17, 0, -4, 0, 0, -29, - -7, -14, -4, -13, 0, 0, -24, 0, - -10, -2, 0, 0, 0, 0, 0, 0, - 0, 0, -5, -6, -3, -6, 0, 0, - 0, 0, -8, 0, -8, 5, -4, 7, - 0, -2, -8, -2, -6, -7, 0, -4, - -2, -2, 2, -10, -1, 0, 0, 0, - -31, -3, -5, 0, -8, 0, -2, -17, - -3, 0, 0, -2, -3, 0, 0, 0, - 0, 2, 0, -2, -6, -2, 6, 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, 5, 0, 0, 0, 0, 0, - 0, -8, 0, -2, 0, 0, 0, -7, - 4, 0, 0, 0, -10, -4, -7, 0, - 0, -10, 0, -4, 0, -17, 0, 0, - 0, 0, -34, 0, -7, -13, -18, 0, - 0, -24, 0, -2, -5, 0, 0, 0, - 0, 0, 0, 0, 0, -4, -5, -2, - -5, 1, 0, 0, 6, -5, 0, 11, - 17, -4, -4, -11, 4, 17, 6, 8, - -10, 4, 15, 4, 10, 8, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 22, 17, -6, -4, 0, -3, - 28, 15, 28, 0, 0, 0, 4, 0, - 0, 13, 0, 0, -6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2, 0, - 0, 0, 0, 0, 0, 0, 0, 5, - 0, 0, 0, 0, -30, -4, -3, -14, - -17, 0, 0, -24, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -2, - 0, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 0, -30, -4, -3, - -14, -17, 0, 0, -14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -3, 0, 0, 0, -8, 4, 0, -4, - 3, 6, 4, -11, 0, -1, -3, 4, - 0, 3, 0, 0, 0, 0, -9, 0, - -3, -2, -7, 0, -3, -14, 0, 22, - -4, 0, -8, -2, 0, -2, -6, 0, - -4, -10, -7, -4, 0, 0, 0, -6, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -2, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 0, 0, 0, 0, -30, - -4, -3, -14, -17, 0, 0, -24, 0, - 0, 0, 0, 0, 0, 18, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -6, 0, -11, -4, -3, 11, -3, -4, - -14, 1, -2, 1, -2, -10, 1, 8, - 1, 3, 1, 3, -8, -14, -4, 0, - -13, -7, -10, -15, -14, 0, -6, -7, - -4, -5, -3, -2, -4, -2, 0, -2, - -1, 5, 0, 5, -2, 0, 11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -2, -4, -4, 0, 0, - -10, 0, -2, 0, -6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -21, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, -4, 0, -5, - 0, 0, 0, 0, -3, 0, 0, -6, - -4, 4, 0, -6, -7, -2, 0, -10, - -2, -8, -2, -4, 0, -6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -24, 0, 11, 0, 0, -6, 0, - 0, 0, 0, -5, 0, -4, 0, 0, - -2, 0, 0, -2, 0, -8, 0, 0, - 15, -5, -12, -11, 2, 4, 4, -1, - -10, 2, 5, 2, 11, 2, 12, -2, - -10, 0, 0, -14, 0, 0, -11, -10, - 0, 0, -7, 0, -5, -6, 0, -5, - 0, -5, 0, -2, 5, 0, -3, -11, - -4, 13, 0, 0, -3, 0, -7, 0, - 0, 5, -8, 0, 4, -4, 3, 0, - 0, -12, 0, -2, -1, 0, -4, 4, - -3, 0, 0, 0, -14, -4, -8, 0, - -11, 0, 0, -17, 0, 13, -4, 0, - -6, 0, 2, 0, -4, 0, -4, -11, - 0, -4, 4, 0, 0, 0, 0, -2, - 0, 0, 4, -5, 1, 0, 0, -4, - -2, 0, -4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -22, 0, 8, 0, - 0, -3, 0, 0, 0, 0, 1, 0, - -4, -4, 0, 0, 0, 7, 0, 8, - 0, 0, 0, 0, 0, -22, -20, 1, - 15, 11, 6, -14, 2, 15, 0, 13, - 0, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 19, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_22 = { -#else -lv_font_t lv_font_montserrat_22 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 24, /*The maximum line height required by the font*/ - .base_line = 4, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -2, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_22*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_24.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_24.c deleted file mode 100644 index ffb9c83..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_24.c +++ /dev/null @@ -1,4057 +0,0 @@ -/******************************************************************************* - * Size: 24 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 24 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_24.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_24 - #define LV_FONT_MONTSERRAT_24 1 -#endif - -#if LV_FONT_MONTSERRAT_24 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x1f, 0xf8, 0x1f, 0xf8, 0xf, 0xf7, 0xf, 0xf7, - 0xf, 0xf6, 0xe, 0xf5, 0xe, 0xf5, 0xd, 0xf4, - 0xd, 0xf3, 0xc, 0xf3, 0xb, 0xf2, 0x7, 0xa1, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf6, 0x4f, 0xfb, - 0xc, 0xe5, - - /* U+0022 "\"" */ - 0x7f, 0x80, 0x2f, 0xd7, 0xf7, 0x1, 0xfd, 0x6f, - 0x70, 0x1f, 0xc6, 0xf7, 0x1, 0xfc, 0x6f, 0x60, - 0xf, 0xc5, 0xf6, 0x0, 0xfb, 0x38, 0x30, 0x8, - 0x60, - - /* U+0023 "#" */ - 0x0, 0x0, 0x8, 0xf2, 0x0, 0x5, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x7f, 0x30, - 0x0, 0x0, 0x0, 0xd, 0xe0, 0x0, 0x9, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0xbf, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x7c, 0xcd, 0xfe, 0xcc, 0xcc, - 0xfe, 0xcc, 0xc2, 0x0, 0x0, 0x4f, 0x60, 0x0, - 0x1f, 0x90, 0x0, 0x0, 0x0, 0x6, 0xf4, 0x0, - 0x3, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x20, - 0x0, 0x4f, 0x60, 0x0, 0x0, 0x0, 0xa, 0xf0, - 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xce, - 0x0, 0x0, 0x8f, 0x20, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4c, 0xcc, - 0xfe, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0x0, 0x0, - 0x2f, 0x90, 0x0, 0xe, 0xd0, 0x0, 0x0, 0x0, - 0x4, 0xf7, 0x0, 0x0, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0x50, 0x0, 0x2f, 0x90, 0x0, 0x0, - 0x0, 0x8, 0xf3, 0x0, 0x4, 0xf7, 0x0, 0x0, - 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0x3f, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0x50, 0x0, 0x0, 0x0, 0x1, 0x7c, - 0xff, 0xfe, 0xb6, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xe1, 0x1, 0xef, 0xe6, 0x5f, 0x73, - 0x7d, 0xc0, 0x6, 0xff, 0x20, 0x3f, 0x50, 0x0, - 0x20, 0x9, 0xfc, 0x0, 0x3f, 0x50, 0x0, 0x0, - 0x8, 0xfe, 0x0, 0x3f, 0x50, 0x0, 0x0, 0x3, - 0xff, 0xc3, 0x3f, 0x50, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xef, 0x91, 0x0, 0x0, 0x0, 0x4, 0xcf, - 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x1, 0x7f, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x3f, 0x53, - 0xbf, 0xf7, 0x0, 0x0, 0x0, 0x3f, 0x50, 0xb, - 0xfc, 0x0, 0x0, 0x0, 0x3f, 0x50, 0x7, 0xfe, - 0x5, 0x70, 0x0, 0x3f, 0x50, 0xc, 0xfb, 0xc, - 0xfd, 0x73, 0x4f, 0x64, 0xbf, 0xf4, 0x5, 0xef, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x6, 0xbe, - 0xff, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x50, 0x0, - 0x0, - - /* U+0025 "%" */ - 0x0, 0x3c, 0xfe, 0x90, 0x0, 0x0, 0x0, 0x6f, - 0x70, 0x0, 0x3, 0xfd, 0x78, 0xfb, 0x0, 0x0, - 0x2, 0xfc, 0x0, 0x0, 0xb, 0xe1, 0x0, 0x6f, - 0x40, 0x0, 0xc, 0xf2, 0x0, 0x0, 0xf, 0x90, - 0x0, 0xf, 0x90, 0x0, 0x7f, 0x60, 0x0, 0x0, - 0x1f, 0x70, 0x0, 0xe, 0xa0, 0x2, 0xfb, 0x0, - 0x0, 0x0, 0xf, 0x80, 0x0, 0xf, 0x90, 0xc, - 0xf1, 0x0, 0x0, 0x0, 0xd, 0xd0, 0x0, 0x3f, - 0x60, 0x7f, 0x60, 0x0, 0x0, 0x0, 0x5, 0xf9, - 0x24, 0xde, 0x2, 0xfb, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xd3, 0xc, 0xe1, 0x8, 0xff, - 0xe7, 0x0, 0x0, 0x1, 0x43, 0x0, 0x7f, 0x50, - 0x9f, 0x85, 0xaf, 0x70, 0x0, 0x0, 0x0, 0x2, - 0xfa, 0x2, 0xf8, 0x0, 0xb, 0xf0, 0x0, 0x0, - 0x0, 0xd, 0xe1, 0x5, 0xf3, 0x0, 0x5, 0xf4, - 0x0, 0x0, 0x0, 0x8f, 0x50, 0x6, 0xf1, 0x0, - 0x3, 0xf5, 0x0, 0x0, 0x3, 0xfa, 0x0, 0x5, - 0xf3, 0x0, 0x5, 0xf3, 0x0, 0x0, 0xd, 0xe1, - 0x0, 0x1, 0xf8, 0x0, 0xa, 0xe0, 0x0, 0x0, - 0x8f, 0x40, 0x0, 0x0, 0x8f, 0x84, 0x9f, 0x60, - 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0x7, 0xdf, - 0xd6, 0x0, - - /* U+0026 "&" */ - 0x0, 0x1, 0x9e, 0xfe, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xfe, 0xbd, 0xff, 0x30, 0x0, 0x0, - 0x0, 0xaf, 0xb0, 0x0, 0x7f, 0xb0, 0x0, 0x0, - 0x0, 0xdf, 0x50, 0x0, 0x2f, 0xd0, 0x0, 0x0, - 0x0, 0xcf, 0x70, 0x0, 0x6f, 0xa0, 0x0, 0x0, - 0x0, 0x6f, 0xe1, 0x6, 0xff, 0x20, 0x0, 0x0, - 0x0, 0xb, 0xfd, 0xbf, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x51, 0xcf, 0xd1, 0x0, 0xac, 0x20, - 0x4f, 0xf2, 0x0, 0xc, 0xfd, 0x20, 0xff, 0x0, - 0xbf, 0x80, 0x0, 0x0, 0xcf, 0xe8, 0xfb, 0x0, - 0xef, 0x60, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, - 0xcf, 0xa0, 0x0, 0x0, 0x1, 0xff, 0xf2, 0x0, - 0x6f, 0xfa, 0x20, 0x1, 0x6e, 0xff, 0xfe, 0x20, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xa1, 0xbf, 0xd0, - 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, 0xb, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0x7f, 0x87, 0xf7, 0x6f, 0x76, 0xf7, 0x6f, 0x65, - 0xf6, 0x38, 0x30, - - /* U+0028 "(" */ - 0x0, 0x2f, 0xf1, 0x0, 0x9f, 0x90, 0x1, 0xff, - 0x20, 0x6, 0xfc, 0x0, 0xc, 0xf7, 0x0, 0xf, - 0xf3, 0x0, 0x3f, 0xf0, 0x0, 0x6f, 0xd0, 0x0, - 0x8f, 0xb0, 0x0, 0x9f, 0xa0, 0x0, 0xaf, 0x90, - 0x0, 0xbf, 0x80, 0x0, 0xaf, 0x90, 0x0, 0x9f, - 0xa0, 0x0, 0x8f, 0xb0, 0x0, 0x6f, 0xd0, 0x0, - 0x3f, 0xf0, 0x0, 0xf, 0xf3, 0x0, 0xc, 0xf7, - 0x0, 0x6, 0xfc, 0x0, 0x1, 0xff, 0x20, 0x0, - 0x9f, 0x90, 0x0, 0x2f, 0xf1, - - /* U+0029 ")" */ - 0xf, 0xf3, 0x0, 0x8, 0xfb, 0x0, 0x1, 0xff, - 0x30, 0x0, 0xbf, 0x80, 0x0, 0x6f, 0xd0, 0x0, - 0x1f, 0xf2, 0x0, 0xe, 0xf5, 0x0, 0xb, 0xf8, - 0x0, 0x9, 0xfa, 0x0, 0x8, 0xfb, 0x0, 0x7, - 0xfc, 0x0, 0x6, 0xfd, 0x0, 0x7, 0xfc, 0x0, - 0x8, 0xfb, 0x0, 0x9, 0xfa, 0x0, 0xb, 0xf8, - 0x0, 0xe, 0xf5, 0x0, 0x1f, 0xf2, 0x0, 0x6f, - 0xd0, 0x0, 0xbf, 0x80, 0x1, 0xff, 0x30, 0x8, - 0xfb, 0x0, 0xf, 0xf3, 0x0, - - /* U+002A "*" */ - 0x0, 0x0, 0xe8, 0x0, 0x0, 0x3, 0x0, 0xe8, - 0x0, 0x20, 0x4f, 0xa1, 0xe8, 0x4d, 0xe0, 0x8, - 0xff, 0xfe, 0xfd, 0x40, 0x0, 0x2e, 0xff, 0xb0, - 0x0, 0x7, 0xef, 0xff, 0xfc, 0x30, 0x5f, 0xb2, - 0xe8, 0x5e, 0xe0, 0x4, 0x0, 0xe8, 0x0, 0x30, - 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0xa, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x5e, 0xee, 0xef, 0xfe, - 0xee, 0xe5, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, - 0x0, 0x0, - - /* U+002C "," */ - 0x3b, 0x80, 0xcf, 0xf3, 0xaf, 0xf3, 0xf, 0xe0, - 0x1f, 0x90, 0x5f, 0x40, 0x9e, 0x0, - - /* U+002D "-" */ - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0xaf, - 0xff, 0xff, 0xd0, - - /* U+002E "." */ - 0x4, 0x10, 0x9f, 0xf1, 0xdf, 0xf4, 0x6f, 0xb0, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, - 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x9, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, - 0x0, 0x4f, 0xc0, 0x0, 0x0, 0x0, 0xa, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x5f, 0xc0, 0x0, 0x0, 0x0, 0xa, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x5f, 0xb0, 0x0, 0x0, 0x0, 0xb, 0xf6, - 0x0, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, 0xb, 0xf5, - 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xf5, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x0, 0xd, 0xf4, - 0x0, 0x0, 0x0, 0x2, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0x90, 0x0, 0x0, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x1, 0x8d, 0xff, 0xd8, 0x10, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x1, 0xff, - 0xe7, 0x33, 0x7e, 0xff, 0x10, 0xb, 0xfe, 0x20, - 0x0, 0x2, 0xef, 0xb0, 0x2f, 0xf5, 0x0, 0x0, - 0x0, 0x5f, 0xf2, 0x7f, 0xe0, 0x0, 0x0, 0x0, - 0xe, 0xf7, 0xaf, 0xb0, 0x0, 0x0, 0x0, 0xb, - 0xfa, 0xcf, 0x90, 0x0, 0x0, 0x0, 0x9, 0xfc, - 0xdf, 0x80, 0x0, 0x0, 0x0, 0x8, 0xfd, 0xcf, - 0x90, 0x0, 0x0, 0x0, 0x9, 0xfc, 0xaf, 0xb0, - 0x0, 0x0, 0x0, 0xb, 0xfa, 0x7f, 0xe0, 0x0, - 0x0, 0x0, 0xe, 0xf7, 0x2f, 0xf5, 0x0, 0x0, - 0x0, 0x5f, 0xf2, 0xb, 0xfe, 0x10, 0x0, 0x2, - 0xef, 0xb0, 0x1, 0xff, 0xe7, 0x33, 0x7e, 0xff, - 0x10, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x1, 0x7c, 0xee, 0xc7, 0x10, 0x0, - - /* U+0031 "1" */ - 0xdf, 0xff, 0xff, 0x5d, 0xff, 0xff, 0xf5, 0x11, - 0x11, 0xff, 0x50, 0x0, 0xf, 0xf5, 0x0, 0x0, - 0xff, 0x50, 0x0, 0xf, 0xf5, 0x0, 0x0, 0xff, - 0x50, 0x0, 0xf, 0xf5, 0x0, 0x0, 0xff, 0x50, - 0x0, 0xf, 0xf5, 0x0, 0x0, 0xff, 0x50, 0x0, - 0xf, 0xf5, 0x0, 0x0, 0xff, 0x50, 0x0, 0xf, - 0xf5, 0x0, 0x0, 0xff, 0x50, 0x0, 0xf, 0xf5, - 0x0, 0x0, 0xff, 0x50, - - /* U+0032 "2" */ - 0x0, 0x17, 0xce, 0xfe, 0xc6, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xfc, 0x63, - 0x35, 0xbf, 0xfa, 0x0, 0x97, 0x0, 0x0, 0x0, - 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xc0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xd1, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xd1, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xc1, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xc0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xc2, 0x11, 0x11, - 0x11, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - - /* U+0033 "3" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1, 0x11, 0x11, - 0x11, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x15, 0xef, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0x81, 0xa1, 0x0, 0x0, - 0x0, 0x4f, 0xf5, 0x9f, 0xfa, 0x53, 0x34, 0x9f, - 0xfd, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x49, 0xdf, 0xfe, 0xb6, 0x0, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x60, 0x0, 0x9d, 0x70, 0x0, - 0x0, 0x1e, 0xfa, 0x0, 0x0, 0xbf, 0x90, 0x0, - 0x0, 0xbf, 0xd0, 0x0, 0x0, 0xbf, 0x90, 0x0, - 0x7, 0xff, 0x41, 0x11, 0x11, 0xbf, 0x91, 0x11, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, - - /* U+0035 "5" */ - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xbf, 0x81, - 0x11, 0x11, 0x11, 0x0, 0xd, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0x40, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0x31, 0x10, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xfe, 0xa3, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x26, 0xdf, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x93, 0x0, 0x0, - 0x0, 0x1e, 0xfa, 0x5f, 0xfb, 0x63, 0x24, 0x7e, - 0xff, 0x31, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x28, 0xce, 0xfe, 0xc8, 0x10, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xb5, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0xcf, - 0xf9, 0x42, 0x23, 0x76, 0x0, 0x8, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xa0, 0x5b, 0xef, 0xd9, 0x30, - 0x0, 0xbf, 0x9a, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0xdf, 0xff, 0xc4, 0x1, 0x4c, 0xff, 0x40, 0xcf, - 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0xbf, 0xf5, - 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x8f, 0xf2, 0x0, - 0x0, 0x0, 0x3f, 0xf1, 0x4f, 0xf4, 0x0, 0x0, - 0x0, 0x4f, 0xf0, 0xd, 0xfc, 0x0, 0x0, 0x0, - 0xbf, 0xb0, 0x4, 0xff, 0xc3, 0x0, 0x3b, 0xff, - 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x1, 0x8d, 0xff, 0xd9, 0x20, 0x0, - - /* U+0037 "7" */ - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x4f, 0xf2, - 0x11, 0x11, 0x11, 0x8f, 0xf1, 0x4f, 0xf0, 0x0, - 0x0, 0x0, 0xef, 0x90, 0x4f, 0xf0, 0x0, 0x0, - 0x5, 0xff, 0x20, 0x2, 0x20, 0x0, 0x0, 0xc, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x6, 0xbe, 0xff, 0xd9, 0x20, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xd, 0xff, - 0x71, 0x0, 0x4b, 0xff, 0x40, 0x3f, 0xf5, 0x0, - 0x0, 0x0, 0xcf, 0xa0, 0x4f, 0xf1, 0x0, 0x0, - 0x0, 0x9f, 0xc0, 0x2f, 0xf5, 0x0, 0x0, 0x0, - 0xdf, 0x90, 0xa, 0xff, 0x72, 0x1, 0x4c, 0xff, - 0x20, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x4, 0xdf, 0xff, 0xef, 0xff, 0xf8, 0x0, 0x2f, - 0xfc, 0x40, 0x0, 0x18, 0xff, 0x90, 0xaf, 0xd0, - 0x0, 0x0, 0x0, 0x6f, 0xf2, 0xdf, 0x80, 0x0, - 0x0, 0x0, 0xf, 0xf5, 0xdf, 0x80, 0x0, 0x0, - 0x0, 0x1f, 0xf5, 0xaf, 0xe1, 0x0, 0x0, 0x0, - 0x8f, 0xf2, 0x3f, 0xfd, 0x51, 0x0, 0x3a, 0xff, - 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x17, 0xce, 0xff, 0xd9, 0x40, 0x0, - - /* U+0039 "9" */ - 0x0, 0x4, 0xae, 0xfe, 0xc7, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, - 0x82, 0x0, 0x4c, 0xfe, 0x10, 0x1f, 0xf6, 0x0, - 0x0, 0x0, 0xcf, 0xa0, 0x3f, 0xf0, 0x0, 0x0, - 0x0, 0x6f, 0xf1, 0x4f, 0xf0, 0x0, 0x0, 0x0, - 0x6f, 0xf5, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0xcf, - 0xf8, 0xa, 0xff, 0x82, 0x0, 0x4c, 0xff, 0xf9, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xfa, 0x0, - 0x6, 0xbe, 0xfe, 0xa4, 0xd, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x50, 0x0, 0xa7, 0x31, 0x25, 0xcf, 0xf9, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x7b, 0xdf, 0xec, 0x82, 0x0, 0x0, - - /* U+003A ":" */ - 0x5f, 0xb0, 0xdf, 0xf4, 0x9f, 0xf1, 0x4, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x10, 0x9f, 0xf1, 0xdf, 0xf4, - 0x6f, 0xb0, - - /* U+003B ";" */ - 0x5f, 0xb0, 0xdf, 0xf4, 0x9f, 0xf1, 0x4, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5e, 0xb0, 0xcf, 0xf4, - 0x8f, 0xf2, 0xf, 0xd0, 0x2f, 0x80, 0x6f, 0x30, - 0x7b, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x84, 0x0, 0x0, - 0x0, 0x4, 0xbf, 0xf5, 0x0, 0x0, 0x18, 0xef, - 0xfe, 0x81, 0x0, 0x4b, 0xff, 0xfa, 0x40, 0x0, - 0x3e, 0xff, 0xd7, 0x10, 0x0, 0x0, 0x6f, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xd7, 0x10, - 0x0, 0x0, 0x0, 0x4b, 0xff, 0xfa, 0x40, 0x0, - 0x0, 0x0, 0x18, 0xef, 0xfe, 0x81, 0x0, 0x0, - 0x0, 0x4, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x84, - - /* U+003D "=" */ - 0x5e, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5e, 0xee, 0xee, 0xee, - 0xee, 0xe5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf5, - - /* U+003E ">" */ - 0x47, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, - 0x40, 0x0, 0x0, 0x0, 0x18, 0xef, 0xfe, 0x71, - 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xb4, 0x0, - 0x0, 0x0, 0x1, 0x7d, 0xff, 0xe3, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xf5, 0x0, 0x0, 0x1, 0x7d, - 0xff, 0xe3, 0x0, 0x4, 0xaf, 0xff, 0xb4, 0x0, - 0x18, 0xef, 0xfe, 0x71, 0x0, 0x0, 0x6f, 0xfb, - 0x40, 0x0, 0x0, 0x0, 0x47, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x28, 0xce, 0xfe, 0xc7, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x7f, 0xfb, 0x52, - 0x13, 0xaf, 0xfb, 0x0, 0x96, 0x0, 0x0, 0x0, - 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x48, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xfd, 0xa6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xca, 0x9a, 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xc5, 0x0, 0x0, 0x0, 0x4, 0xcf, - 0xd2, 0x0, 0x0, 0x2, 0xef, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xe2, 0x0, 0x0, 0xdf, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xd0, 0x0, 0x8f, 0x80, 0x0, 0x7, 0xcf, 0xfc, - 0x60, 0xaf, 0x70, 0x7f, 0x70, 0xf, 0xe0, 0x0, - 0x2d, 0xff, 0xfe, 0xff, 0xcb, 0xf7, 0x0, 0xde, - 0x5, 0xf7, 0x0, 0xd, 0xfd, 0x30, 0x1, 0x7f, - 0xff, 0x70, 0x7, 0xf4, 0x9f, 0x30, 0x6, 0xfe, - 0x10, 0x0, 0x0, 0x6f, 0xf7, 0x0, 0x2f, 0x7c, - 0xf0, 0x0, 0xbf, 0x70, 0x0, 0x0, 0x0, 0xef, - 0x70, 0x0, 0xf9, 0xde, 0x0, 0xd, 0xf3, 0x0, - 0x0, 0x0, 0xa, 0xf7, 0x0, 0xf, 0xad, 0xe0, - 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, 0xaf, 0x70, - 0x0, 0xf9, 0xbf, 0x0, 0xb, 0xf7, 0x0, 0x0, - 0x0, 0xd, 0xf7, 0x0, 0x2f, 0x79, 0xf3, 0x0, - 0x6f, 0xe0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x6, - 0xf4, 0x5f, 0x70, 0x0, 0xdf, 0xc3, 0x0, 0x7, - 0xff, 0xfb, 0x1, 0xde, 0x0, 0xee, 0x0, 0x2, - 0xdf, 0xfe, 0xdf, 0xfc, 0x3f, 0xfe, 0xff, 0x50, - 0x8, 0xf9, 0x0, 0x0, 0x7c, 0xff, 0xc7, 0x0, - 0x5d, 0xfd, 0x50, 0x0, 0xd, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfc, 0x50, 0x0, - 0x0, 0x2, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfc, 0xaa, 0xbd, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, - 0xd9, 0x40, 0x0, 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x5d, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xe0, 0x6f, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xf7, 0x0, 0xef, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0x10, 0x8, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x0, - 0x1f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf3, - 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, 0x0, 0xa, - 0xfc, 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, - 0x2, 0xff, 0x50, 0x0, 0x0, 0xd, 0xfa, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x7, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0xef, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x5f, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe0, - 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0x50, - - /* U+0042 "B" */ - 0x7f, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x7f, - 0xe0, 0x0, 0x0, 0x2, 0x9f, 0xfa, 0x7, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x7f, 0xe0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0x7, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x7f, 0xe0, 0x0, - 0x0, 0x2, 0x9f, 0xf5, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x7, 0xfe, 0x0, 0x0, 0x0, - 0x14, 0xcf, 0xf3, 0x7f, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xa7, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xfd, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xe7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xfc, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x3b, 0xff, - 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x30, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, - 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x30, - 0x0, 0x5f, 0xff, 0xb6, 0x43, 0x59, 0xff, 0xf2, - 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x1c, 0x80, - 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x1c, 0x80, - 0x0, 0x5f, 0xff, 0xb5, 0x33, 0x49, 0xff, 0xf2, - 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x30, - 0x0, 0x0, 0x5, 0xae, 0xff, 0xda, 0x50, 0x0, - - /* U+0044 "D" */ - 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, - 0x0, 0x7f, 0xe1, 0x11, 0x12, 0x36, 0xbf, 0xff, - 0x40, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4e, - 0xfe, 0x20, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xfb, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xf2, 0x7f, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0x77, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xf9, 0x7f, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xa7, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xf9, 0x7f, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0x77, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf2, 0x7f, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x7, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xfe, 0x20, 0x7f, - 0xe1, 0x11, 0x11, 0x35, 0xbf, 0xff, 0x40, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, - 0x0, - - /* U+0045 "E" */ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7f, 0xe1, 0x11, - 0x11, 0x11, 0x11, 0x7, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x7, 0xfe, 0x11, 0x11, 0x11, 0x11, - 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xe1, 0x11, 0x11, 0x11, - 0x11, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - - /* U+0046 "F" */ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7f, 0xe1, 0x11, - 0x11, 0x11, 0x11, 0x7, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x7f, 0xe1, 0x11, 0x11, 0x11, 0x10, 0x7, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, - 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0x0, 0x5f, 0xff, 0xb6, 0x43, 0x48, 0xef, 0xf5, - 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x9, 0xb0, - 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7, 0x94, - 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, - 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, - 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, - 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xd, 0xf7, - 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0xd, 0xf7, - 0x0, 0x5f, 0xff, 0xb6, 0x32, 0x47, 0xdf, 0xf7, - 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x71, 0x0, - - /* U+0048 "H" */ - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0xfe, 0x11, 0x11, 0x11, - 0x11, 0x17, 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, - - /* U+0049 "I" */ - 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, - 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, - 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, - 0x7f, 0xe0, - - /* U+004A "J" */ - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x1, 0x11, 0x11, 0x7f, - 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, - 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xd0, - 0x5a, 0x0, 0x0, 0xd, 0xfa, 0xf, 0xfc, 0x41, - 0x3b, 0xff, 0x50, 0x5f, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x29, 0xdf, 0xfc, 0x60, 0x0, - - /* U+004B "K" */ - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, - 0x7f, 0xe0, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, - 0x7f, 0xe0, 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, - 0x7f, 0xe0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, - 0x7f, 0xe0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, - 0x7f, 0xe0, 0x3, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x7f, 0xe0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xe3, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x7f, 0xfe, 0xfd, 0xdf, 0xf2, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xd1, 0x2f, 0xfd, 0x10, 0x0, 0x0, - 0x7f, 0xfe, 0x10, 0x4, 0xff, 0xb0, 0x0, 0x0, - 0x7f, 0xf2, 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, - 0x7f, 0xe0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x10, - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xc0, - - /* U+004C "L" */ - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xe1, 0x11, 0x11, 0x11, - 0x11, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - - /* U+004D "M" */ - 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0x67, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xf6, 0x7f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x67, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x7f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x67, - 0xfd, 0xbf, 0xb0, 0x0, 0x0, 0x0, 0xcf, 0x8e, - 0xf6, 0x7f, 0xd2, 0xff, 0x40, 0x0, 0x0, 0x5f, - 0xe0, 0xef, 0x67, 0xfd, 0x8, 0xfd, 0x0, 0x0, - 0xe, 0xf6, 0xe, 0xf6, 0x7f, 0xd0, 0xe, 0xf7, - 0x0, 0x8, 0xfc, 0x0, 0xef, 0x67, 0xfd, 0x0, - 0x5f, 0xf1, 0x1, 0xff, 0x30, 0xe, 0xf6, 0x7f, - 0xd0, 0x0, 0xbf, 0xa0, 0xaf, 0x90, 0x0, 0xef, - 0x67, 0xfd, 0x0, 0x2, 0xff, 0x7f, 0xe1, 0x0, - 0xe, 0xf6, 0x7f, 0xd0, 0x0, 0x8, 0xff, 0xf6, - 0x0, 0x0, 0xef, 0x67, 0xfd, 0x0, 0x0, 0xe, - 0xfd, 0x0, 0x0, 0xe, 0xf6, 0x7f, 0xd0, 0x0, - 0x0, 0x5f, 0x40, 0x0, 0x0, 0xef, 0x67, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf6, - 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0x60, - - /* U+004E "N" */ - 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xfd, - 0xfe, 0x20, 0x0, 0x0, 0x7f, 0xf7, 0xfe, 0x3f, - 0xfd, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xe0, 0x5f, - 0xfa, 0x0, 0x0, 0x7f, 0xf7, 0xfe, 0x0, 0x8f, - 0xf7, 0x0, 0x7, 0xff, 0x7f, 0xe0, 0x0, 0xbf, - 0xf4, 0x0, 0x7f, 0xf7, 0xfe, 0x0, 0x1, 0xef, - 0xe1, 0x7, 0xff, 0x7f, 0xe0, 0x0, 0x3, 0xff, - 0xc0, 0x7f, 0xf7, 0xfe, 0x0, 0x0, 0x6, 0xff, - 0xa7, 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x9, 0xff, - 0xdf, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf0, - - /* U+004F "O" */ - 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, - 0xe4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xb6, 0x33, - 0x5a, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xfd, 0x30, - 0x0, 0x0, 0x1, 0xcf, 0xf5, 0x0, 0xd, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x4, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x70, 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xfc, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf0, 0xdf, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xc, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x9f, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, - 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0x70, 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf1, 0x0, 0x3f, 0xfd, 0x30, 0x0, - 0x0, 0x1, 0xcf, 0xf5, 0x0, 0x0, 0x5f, 0xff, - 0xb5, 0x33, 0x59, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, - 0x0, 0x0, - - /* U+0050 "P" */ - 0x7f, 0xff, 0xff, 0xff, 0xeb, 0x60, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x7f, - 0xe1, 0x11, 0x12, 0x49, 0xff, 0xe1, 0x7, 0xfe, - 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, 0x7f, 0xe0, - 0x0, 0x0, 0x0, 0x9, 0xfe, 0x7, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x7f, 0xe0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0x7, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xe0, 0x7f, 0xe0, 0x0, 0x0, - 0x0, 0x3f, 0xf9, 0x7, 0xfe, 0x11, 0x11, 0x24, - 0x8f, 0xfe, 0x10, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x7, 0xff, 0xff, 0xff, 0xfe, 0xb6, - 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, - 0xe4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xb6, 0x33, - 0x5a, 0xff, 0xf7, 0x0, 0x0, 0x2f, 0xfd, 0x30, - 0x0, 0x0, 0x2, 0xcf, 0xf5, 0x0, 0xd, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf1, 0x4, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x70, 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xfc, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf0, 0xdf, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xc, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xe0, 0xaf, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, - 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0x70, 0xe, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf1, 0x0, 0x4f, 0xfc, 0x20, 0x0, - 0x0, 0x1, 0xbf, 0xf6, 0x0, 0x0, 0x7f, 0xff, - 0xa4, 0x22, 0x48, 0xef, 0xf9, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x17, 0xce, 0xff, 0xfd, 0x71, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf7, - 0x10, 0x4, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3a, 0xef, 0xea, 0x40, - - /* U+0052 "R" */ - 0x7f, 0xff, 0xff, 0xff, 0xeb, 0x60, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x7f, - 0xe1, 0x11, 0x12, 0x49, 0xff, 0xe1, 0x7, 0xfe, - 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, 0x7f, 0xe0, - 0x0, 0x0, 0x0, 0x9, 0xfe, 0x7, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x7f, 0xe0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0x7, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xe0, 0x7f, 0xe0, 0x0, 0x0, - 0x0, 0x3f, 0xf8, 0x7, 0xfe, 0x11, 0x11, 0x13, - 0x8f, 0xfe, 0x10, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x7f, 0xf2, - 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xd0, - 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x1, 0xef, 0x90, - 0x7, 0xfe, 0x0, 0x0, 0x0, 0x5, 0xff, 0x40, - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xfe, 0x10, - - /* U+0053 "S" */ - 0x0, 0x0, 0x6b, 0xef, 0xfd, 0xa5, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xef, - 0xe7, 0x21, 0x14, 0x8e, 0xc0, 0x6, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x20, 0x9, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xc3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xd9, 0x51, 0x0, 0x0, - 0x0, 0x4, 0xbf, 0xff, 0xff, 0xc5, 0x0, 0x0, - 0x0, 0x1, 0x59, 0xdf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xaf, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xfe, 0x5, 0x80, 0x0, 0x0, 0x0, - 0xc, 0xfb, 0xd, 0xfe, 0x84, 0x21, 0x25, 0xcf, - 0xf4, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x4, 0x9d, 0xef, 0xec, 0x82, 0x0, - - /* U+0054 "T" */ - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x11, - 0x13, 0xff, 0x51, 0x11, 0x11, 0x0, 0x0, 0x2, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, - - /* U+0055 "U" */ - 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x9a, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0xaf, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x9a, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0xaf, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0x9a, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xf9, 0xaf, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0x9a, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xf9, 0xaf, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0x99, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xf9, 0x9f, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0x87, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xf6, 0x3f, 0xf5, 0x0, 0x0, 0x0, 0x5, - 0xff, 0x20, 0xdf, 0xe1, 0x0, 0x0, 0x1, 0xef, - 0xc0, 0x3, 0xff, 0xe7, 0x32, 0x38, 0xef, 0xf3, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x0, 0x1, 0x7c, 0xef, 0xec, 0x71, 0x0, 0x0, - - /* U+0056 "V" */ - 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xfe, 0x0, 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0x70, 0x0, 0xef, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x8, 0xff, 0x10, - 0x0, 0x0, 0x0, 0xc, 0xf9, 0x0, 0x0, 0x1f, - 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, 0x20, 0x0, - 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xb0, - 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x2f, - 0xf4, 0x0, 0x0, 0x0, 0xc, 0xfc, 0x0, 0x0, - 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf3, - 0x0, 0x0, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xa0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0x10, 0xd, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xf8, 0x5, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe0, 0xcf, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0057 "W" */ - 0x1f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0x10, 0xbf, 0xb0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x8f, 0xc0, 0x6, 0xff, 0x10, 0x0, 0x0, - 0x5, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xf6, - 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0xef, - 0xe0, 0x0, 0x0, 0x3, 0xff, 0x10, 0x0, 0xbf, - 0xb0, 0x0, 0x0, 0x1f, 0xf4, 0xff, 0x30, 0x0, - 0x0, 0x8f, 0xc0, 0x0, 0x6, 0xff, 0x10, 0x0, - 0x6, 0xfd, 0xc, 0xf8, 0x0, 0x0, 0xd, 0xf6, - 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, 0xbf, 0x70, - 0x6f, 0xe0, 0x0, 0x3, 0xff, 0x10, 0x0, 0x0, - 0xcf, 0xb0, 0x0, 0x1f, 0xf2, 0x1, 0xff, 0x30, - 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x6, 0xff, 0x0, - 0x6, 0xfd, 0x0, 0xc, 0xf8, 0x0, 0xd, 0xf7, - 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0xbf, 0x70, - 0x0, 0x6f, 0xe0, 0x3, 0xff, 0x10, 0x0, 0x0, - 0x0, 0xcf, 0xb0, 0x1f, 0xf2, 0x0, 0x1, 0xff, - 0x30, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0x6, 0xfc, 0x0, 0x0, 0xb, 0xf8, 0xd, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, 0xcf, 0x70, - 0x0, 0x0, 0x6f, 0xe3, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xcf, 0xf2, 0x0, 0x0, 0x1, - 0xff, 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, - - /* U+0058 "X" */ - 0xe, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xe1, - 0x3, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, 0x50, - 0x0, 0x8f, 0xf3, 0x0, 0x0, 0x1e, 0xf9, 0x0, - 0x0, 0xc, 0xfe, 0x10, 0x0, 0xbf, 0xd0, 0x0, - 0x0, 0x2, 0xff, 0xa0, 0x6, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x5f, 0xf6, 0x2f, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xdf, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xfa, 0x9f, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xe1, 0xd, 0xfd, 0x0, 0x0, - 0x0, 0x6, 0xff, 0x40, 0x2, 0xff, 0x90, 0x0, - 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x6f, 0xf4, 0x0, - 0x0, 0xdf, 0xd0, 0x0, 0x0, 0xb, 0xfe, 0x10, - 0x9, 0xff, 0x20, 0x0, 0x0, 0x1, 0xef, 0xb0, - 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, - - /* U+0059 "Y" */ - 0xc, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0x50, 0x3f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xb0, 0x0, 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x4f, - 0xf2, 0x0, 0x1, 0xef, 0x90, 0x0, 0x0, 0xd, - 0xf8, 0x0, 0x0, 0x6, 0xff, 0x20, 0x0, 0x7, - 0xfe, 0x0, 0x0, 0x0, 0xc, 0xfc, 0x0, 0x1, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x0, - 0xaf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe0, - 0x4f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0x9d, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, - 0x0, - - /* U+005A "Z" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x11, - 0x11, 0x11, 0x11, 0x11, 0xcf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xfa, 0x11, 0x11, 0x11, 0x11, 0x11, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - - /* U+005B "[" */ - 0x7f, 0xff, 0xf8, 0x7f, 0xfe, 0xe7, 0x7f, 0xd0, - 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, - 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, - 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, - 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, - 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, - 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, - 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, - 0xfe, 0xe7, 0x7f, 0xff, 0xf8, - - /* U+005C "\\" */ - 0xbf, 0x50, 0x0, 0x0, 0x0, 0x6, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0x60, 0x0, 0x0, 0x0, 0x5, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0x60, 0x0, 0x0, 0x0, 0x5, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, 0x0, - 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0x70, 0x0, 0x0, - 0x0, 0x4, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, - 0x0, 0x0, 0x3, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, - 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0x90, 0x0, 0x0, 0x0, 0x2, 0xfe, 0x0, - - /* U+005D "]" */ - 0x8f, 0xff, 0xf7, 0x8e, 0xef, 0xf7, 0x0, 0xd, - 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, - 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, - 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, - 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, - 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, - 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, - 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x8e, - 0xef, 0xf7, 0x8f, 0xff, 0xf7, - - /* U+005E "^" */ - 0x0, 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xbf, - 0x10, 0x0, 0x0, 0x7, 0xf5, 0x5f, 0x70, 0x0, - 0x0, 0xd, 0xe0, 0xe, 0xd0, 0x0, 0x0, 0x4f, - 0x80, 0x8, 0xf4, 0x0, 0x0, 0xbf, 0x10, 0x1, - 0xfb, 0x0, 0x2, 0xfa, 0x0, 0x0, 0xaf, 0x20, - 0x9, 0xf4, 0x0, 0x0, 0x4f, 0x80, 0xf, 0xd0, - 0x0, 0x0, 0xd, 0xe0, - - /* U+005F "_" */ - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - - /* U+0060 "`" */ - 0x8, 0xff, 0x40, 0x0, 0x4, 0xef, 0x60, 0x0, - 0x1, 0xbf, 0x70, - - /* U+0061 "a" */ - 0x0, 0x6b, 0xef, 0xfd, 0x81, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xfe, 0x10, 0xe, 0xb5, 0x10, 0x27, - 0xff, 0xb0, 0x1, 0x0, 0x0, 0x0, 0x6f, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf3, 0x0, 0x37, - 0xaa, 0xaa, 0xaf, 0xf4, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x6f, 0xf6, 0x10, 0x0, 0xf, 0xf4, - 0xbf, 0x90, 0x0, 0x0, 0xf, 0xf4, 0xcf, 0x80, - 0x0, 0x0, 0x5f, 0xf4, 0x8f, 0xe2, 0x0, 0x4, - 0xff, 0xf4, 0x1d, 0xff, 0xcb, 0xdf, 0xdf, 0xf4, - 0x1, 0x8d, 0xff, 0xd8, 0xe, 0xf4, - - /* U+0062 "b" */ - 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0x70, 0x7c, 0xfe, 0xc7, - 0x10, 0x0, 0xdf, 0x9d, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0xdf, 0xff, 0xa3, 0x12, 0x6e, 0xfe, 0x20, - 0xdf, 0xf8, 0x0, 0x0, 0x1, 0xef, 0xa0, 0xdf, - 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xf1, 0xdf, 0x90, - 0x0, 0x0, 0x0, 0x1f, 0xf3, 0xdf, 0x70, 0x0, - 0x0, 0x0, 0xf, 0xf5, 0xdf, 0x90, 0x0, 0x0, - 0x0, 0x1f, 0xf3, 0xdf, 0xe0, 0x0, 0x0, 0x0, - 0x6f, 0xf1, 0xdf, 0xf8, 0x0, 0x0, 0x2, 0xef, - 0xa0, 0xdf, 0xff, 0xa3, 0x12, 0x6e, 0xff, 0x20, - 0xdf, 0x8d, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xdf, - 0x60, 0x7d, 0xfe, 0xc7, 0x10, 0x0, - - /* U+0063 "c" */ - 0x0, 0x3, 0xad, 0xfe, 0xc6, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xc1, 0x9, 0xff, 0x93, 0x12, - 0x7f, 0xfa, 0x4f, 0xf6, 0x0, 0x0, 0x3, 0x91, - 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, - 0x0, 0x0, 0x2, 0x91, 0x9, 0xff, 0x93, 0x12, - 0x7f, 0xfa, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x3, 0xad, 0xfe, 0xc6, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xf3, 0x0, 0x5, 0xbe, 0xfe, 0x92, - 0x2f, 0xf3, 0x1, 0xbf, 0xff, 0xff, 0xff, 0x7f, - 0xf3, 0xb, 0xff, 0x93, 0x12, 0x7f, 0xff, 0xf3, - 0x5f, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xf3, 0xbf, - 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0xdf, 0x70, - 0x0, 0x0, 0x0, 0x3f, 0xf3, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x1f, 0xf3, 0xdf, 0x70, 0x0, 0x0, - 0x0, 0x3f, 0xf3, 0xbf, 0xb0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x5f, 0xf5, 0x0, 0x0, 0x2, 0xff, - 0xf3, 0xb, 0xff, 0x71, 0x0, 0x5e, 0xff, 0xf3, - 0x1, 0xbf, 0xff, 0xef, 0xff, 0x7f, 0xf3, 0x0, - 0x5, 0xbe, 0xfe, 0xa3, 0xf, 0xf3, - - /* U+0065 "e" */ - 0x0, 0x5, 0xbe, 0xfd, 0xa3, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xa, 0xfe, 0x61, - 0x2, 0x8f, 0xf7, 0x4, 0xff, 0x20, 0x0, 0x0, - 0x5f, 0xf1, 0xaf, 0x90, 0x0, 0x0, 0x0, 0xcf, - 0x6d, 0xfc, 0xbb, 0xbb, 0xbb, 0xbd, 0xf9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0x60, 0x0, 0x0, 0x6, - 0x0, 0xa, 0xff, 0xa3, 0x11, 0x4b, 0xf8, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x3, - 0xad, 0xff, 0xd8, 0x10, 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x8d, 0xfe, 0xa1, 0x0, 0xb, 0xff, - 0xff, 0xf0, 0x0, 0x4f, 0xf5, 0x0, 0x30, 0x0, - 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0x70, 0x9e, 0xff, - 0xfe, 0xee, 0x60, 0x0, 0x7f, 0xd0, 0x0, 0x0, - 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, - 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, - 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, - 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, - 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, - 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, - 0x0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x5, 0xbe, 0xfe, 0xa3, 0xd, 0xf5, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0x8d, 0xf5, 0xb, 0xff, - 0x93, 0x12, 0x6e, 0xff, 0xf5, 0x4f, 0xf6, 0x0, - 0x0, 0x1, 0xef, 0xf5, 0xbf, 0xc0, 0x0, 0x0, - 0x0, 0x5f, 0xf5, 0xdf, 0x70, 0x0, 0x0, 0x0, - 0xf, 0xf5, 0xff, 0x50, 0x0, 0x0, 0x0, 0xe, - 0xf5, 0xdf, 0x70, 0x0, 0x0, 0x0, 0xf, 0xf5, - 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xf5, 0x4f, - 0xf6, 0x0, 0x0, 0x1, 0xef, 0xf5, 0xa, 0xff, - 0xa3, 0x12, 0x6e, 0xff, 0xf5, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0x8f, 0xf5, 0x0, 0x5, 0xbe, 0xfe, - 0xa3, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xf1, 0x3, 0x10, 0x0, 0x0, 0x0, 0xaf, - 0xd0, 0xd, 0xf9, 0x52, 0x11, 0x4b, 0xff, 0x50, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x28, 0xce, 0xff, 0xd9, 0x30, 0x0, - - /* U+0068 "h" */ - 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xf7, 0x18, 0xdf, 0xfc, 0x70, 0x0, 0xdf, - 0xae, 0xff, 0xff, 0xff, 0xc0, 0xd, 0xff, 0xf8, - 0x31, 0x4a, 0xff, 0x90, 0xdf, 0xf5, 0x0, 0x0, - 0xa, 0xff, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x3f, - 0xf2, 0xdf, 0x80, 0x0, 0x0, 0x1, 0xff, 0x3d, - 0xf7, 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, - 0x0, 0x0, 0x0, 0xff, 0x4d, 0xf7, 0x0, 0x0, - 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x0, - 0xff, 0x4d, 0xf7, 0x0, 0x0, 0x0, 0xf, 0xf4, - 0xdf, 0x70, 0x0, 0x0, 0x0, 0xff, 0x4d, 0xf7, - 0x0, 0x0, 0x0, 0xf, 0xf4, - - /* U+0069 "i" */ - 0xb, 0xf6, 0x2f, 0xfd, 0xb, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, - 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, - 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, - 0xd, 0xf7, 0xd, 0xf7, - - /* U+006A "j" */ - 0x0, 0x0, 0x9, 0xf8, 0x0, 0x0, 0x1, 0xff, - 0xf0, 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0x90, 0x0, 0x0, 0xb, 0xf9, 0x0, - 0x0, 0x0, 0xbf, 0x90, 0x0, 0x0, 0xb, 0xf9, - 0x0, 0x0, 0x0, 0xbf, 0x90, 0x0, 0x0, 0xb, - 0xf9, 0x0, 0x0, 0x0, 0xbf, 0x90, 0x0, 0x0, - 0xb, 0xf9, 0x0, 0x0, 0x0, 0xbf, 0x90, 0x0, - 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, 0xbf, 0x90, - 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, 0xbf, - 0x90, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, - 0xdf, 0x80, 0x4, 0x20, 0x5f, 0xf4, 0x0, 0xef, - 0xff, 0xfc, 0x0, 0x9, 0xef, 0xe9, 0x0, 0x0, - - /* U+006B "k" */ - 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xf7, 0x0, 0x0, 0x3, 0xef, 0xa0, 0xdf, - 0x70, 0x0, 0x3, 0xff, 0xb0, 0xd, 0xf7, 0x0, - 0x4, 0xff, 0xb0, 0x0, 0xdf, 0x70, 0x5, 0xff, - 0xb0, 0x0, 0xd, 0xf7, 0x6, 0xff, 0xb0, 0x0, - 0x0, 0xdf, 0x77, 0xff, 0xf1, 0x0, 0x0, 0xd, - 0xfe, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xdf, 0xff, - 0x87, 0xff, 0x70, 0x0, 0xd, 0xff, 0x70, 0xa, - 0xff, 0x40, 0x0, 0xdf, 0x90, 0x0, 0xd, 0xfe, - 0x10, 0xd, 0xf7, 0x0, 0x0, 0x2e, 0xfc, 0x0, - 0xdf, 0x70, 0x0, 0x0, 0x4f, 0xf9, 0xd, 0xf7, - 0x0, 0x0, 0x0, 0x7f, 0xf5, - - /* U+006C "l" */ - 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, - 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, - 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, - 0xdf, 0x7d, 0xf7, - - /* U+006D "m" */ - 0xdf, 0x61, 0x9d, 0xfe, 0xb5, 0x0, 0x7, 0xcf, - 0xfd, 0x80, 0x0, 0xdf, 0xaf, 0xff, 0xff, 0xff, - 0x92, 0xef, 0xff, 0xff, 0xfd, 0x10, 0xdf, 0xfe, - 0x60, 0x3, 0xcf, 0xff, 0xfa, 0x20, 0x17, 0xff, - 0xa0, 0xdf, 0xf3, 0x0, 0x0, 0xe, 0xff, 0xa0, - 0x0, 0x0, 0x8f, 0xf0, 0xdf, 0xc0, 0x0, 0x0, - 0x9, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xf3, 0xdf, - 0x80, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, - 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x6, 0xfe, - 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, - 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0xf, 0xf4, - 0xdf, 0x70, 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, - 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x6, - 0xfe, 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, - 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0xf, - 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x6, 0xfe, 0x0, - 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, - 0x6, 0xfe, 0x0, 0x0, 0x0, 0xf, 0xf4, - - /* U+006E "n" */ - 0xdf, 0x61, 0x8d, 0xff, 0xc7, 0x0, 0xd, 0xf9, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0xdf, 0xff, 0x61, - 0x2, 0x8f, 0xf9, 0xd, 0xff, 0x40, 0x0, 0x0, - 0x9f, 0xf0, 0xdf, 0xc0, 0x0, 0x0, 0x3, 0xff, - 0x2d, 0xf8, 0x0, 0x0, 0x0, 0x1f, 0xf3, 0xdf, - 0x70, 0x0, 0x0, 0x0, 0xff, 0x4d, 0xf7, 0x0, - 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, - 0x0, 0xff, 0x4d, 0xf7, 0x0, 0x0, 0x0, 0xf, - 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x0, 0xff, 0x4d, - 0xf7, 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, - 0x0, 0x0, 0x0, 0xff, 0x40, - - /* U+006F "o" */ - 0x0, 0x4, 0xad, 0xfe, 0xb5, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0xa, 0xff, - 0x93, 0x12, 0x7f, 0xfd, 0x0, 0x4f, 0xf6, 0x0, - 0x0, 0x3, 0xff, 0x80, 0xaf, 0xc0, 0x0, 0x0, - 0x0, 0x8f, 0xe0, 0xdf, 0x70, 0x0, 0x0, 0x0, - 0x3f, 0xf1, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, - 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xf1, - 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xe0, 0x4f, - 0xf6, 0x0, 0x0, 0x3, 0xff, 0x80, 0xa, 0xff, - 0x93, 0x12, 0x7f, 0xfd, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x4, 0xad, 0xfe, - 0xb5, 0x0, 0x0, - - /* U+0070 "p" */ - 0xdf, 0x61, 0x8d, 0xfe, 0xc7, 0x10, 0x0, 0xdf, - 0x8e, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xdf, 0xff, - 0x92, 0x0, 0x5d, 0xfe, 0x20, 0xdf, 0xf7, 0x0, - 0x0, 0x1, 0xef, 0xa0, 0xdf, 0xd0, 0x0, 0x0, - 0x0, 0x5f, 0xf1, 0xdf, 0x90, 0x0, 0x0, 0x0, - 0x1f, 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, 0xf, - 0xf5, 0xdf, 0x90, 0x0, 0x0, 0x0, 0x1f, 0xf3, - 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xf1, 0xdf, - 0xf8, 0x0, 0x0, 0x2, 0xef, 0xa0, 0xdf, 0xff, - 0xa3, 0x12, 0x6e, 0xff, 0x20, 0xdf, 0x9d, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0xdf, 0x70, 0x7c, 0xfe, - 0xc7, 0x10, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x5, 0xbe, 0xfe, 0xa2, 0xf, 0xf3, 0x1, - 0xbf, 0xff, 0xff, 0xff, 0x6f, 0xf3, 0xb, 0xff, - 0x93, 0x12, 0x7f, 0xff, 0xf3, 0x5f, 0xf6, 0x0, - 0x0, 0x3, 0xff, 0xf3, 0xbf, 0xc0, 0x0, 0x0, - 0x0, 0x8f, 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, - 0x3f, 0xf3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, - 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xf3, - 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x5f, - 0xf6, 0x0, 0x0, 0x3, 0xff, 0xf3, 0xb, 0xff, - 0x93, 0x12, 0x7f, 0xff, 0xf3, 0x1, 0xbf, 0xff, - 0xff, 0xff, 0x7f, 0xf3, 0x0, 0x5, 0xbe, 0xfe, - 0x92, 0x2f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, - - /* U+0072 "r" */ - 0xdf, 0x61, 0x8d, 0xf0, 0xdf, 0x7e, 0xff, 0xf0, - 0xdf, 0xff, 0xb5, 0x40, 0xdf, 0xf7, 0x0, 0x0, - 0xdf, 0xd0, 0x0, 0x0, 0xdf, 0x90, 0x0, 0x0, - 0xdf, 0x70, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, - 0xdf, 0x70, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, - 0xdf, 0x70, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, - 0xdf, 0x70, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x18, 0xcf, 0xfe, 0xb7, 0x10, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xb0, 0xb, 0xfe, 0x41, 0x2, - 0x6c, 0x30, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xd9, 0x52, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xe9, 0x10, 0x0, 0x0, 0x47, 0xad, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf3, 0x1, 0x0, - 0x0, 0x0, 0xf, 0xf4, 0xe, 0xc6, 0x20, 0x3, - 0xaf, 0xf1, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x1, 0x7b, 0xef, 0xfd, 0x92, 0x0, - - /* U+0074 "t" */ - 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, - 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0x70, 0x9e, 0xff, 0xfe, 0xee, - 0x60, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, - 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, - 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, - 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, - 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, - 0x0, 0x0, 0x4f, 0xf7, 0x1, 0x50, 0x0, 0xc, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x9e, 0xfd, 0x81, - - /* U+0075 "u" */ - 0xff, 0x60, 0x0, 0x0, 0x4, 0xff, 0xf, 0xf6, - 0x0, 0x0, 0x0, 0x4f, 0xf0, 0xff, 0x60, 0x0, - 0x0, 0x4, 0xff, 0xf, 0xf6, 0x0, 0x0, 0x0, - 0x4f, 0xf0, 0xff, 0x60, 0x0, 0x0, 0x4, 0xff, - 0xf, 0xf6, 0x0, 0x0, 0x0, 0x4f, 0xf0, 0xff, - 0x60, 0x0, 0x0, 0x4, 0xff, 0xe, 0xf6, 0x0, - 0x0, 0x0, 0x5f, 0xf0, 0xdf, 0x80, 0x0, 0x0, - 0x8, 0xff, 0xa, 0xfe, 0x0, 0x0, 0x1, 0xef, - 0xf0, 0x3f, 0xfb, 0x20, 0x4, 0xdf, 0xff, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0x9f, 0xf0, 0x0, 0x4b, - 0xef, 0xea, 0x32, 0xff, 0x0, - - /* U+0076 "v" */ - 0xd, 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0x30, - 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, - 0xef, 0x60, 0x0, 0x0, 0xd, 0xf5, 0x0, 0x8, - 0xfd, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x2f, - 0xf3, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0xbf, - 0xa0, 0x0, 0x2f, 0xf1, 0x0, 0x0, 0x4, 0xff, - 0x10, 0x9, 0xfa, 0x0, 0x0, 0x0, 0xd, 0xf7, - 0x1, 0xff, 0x30, 0x0, 0x0, 0x0, 0x6f, 0xe0, - 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x5d, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, - 0x0, 0x0, - - /* U+0077 "w" */ - 0xaf, 0x80, 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, - 0x0, 0xc, 0xf4, 0x5f, 0xd0, 0x0, 0x0, 0xb, - 0xff, 0x50, 0x0, 0x0, 0x2f, 0xe0, 0xe, 0xf3, - 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x8f, - 0x80, 0x9, 0xf9, 0x0, 0x0, 0x7f, 0xbf, 0xf1, - 0x0, 0x0, 0xef, 0x20, 0x3, 0xfe, 0x0, 0x0, - 0xcf, 0x4b, 0xf7, 0x0, 0x4, 0xfc, 0x0, 0x0, - 0xdf, 0x40, 0x2, 0xfe, 0x5, 0xfc, 0x0, 0xa, - 0xf6, 0x0, 0x0, 0x7f, 0xa0, 0x8, 0xf8, 0x0, - 0xef, 0x20, 0xf, 0xf1, 0x0, 0x0, 0x2f, 0xf0, - 0xe, 0xf2, 0x0, 0x9f, 0x80, 0x5f, 0xb0, 0x0, - 0x0, 0xc, 0xf5, 0x4f, 0xc0, 0x0, 0x3f, 0xe0, - 0xbf, 0x50, 0x0, 0x0, 0x6, 0xfb, 0xaf, 0x60, - 0x0, 0xd, 0xf5, 0xfe, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x1, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x0, - - /* U+0078 "x" */ - 0x1e, 0xf8, 0x0, 0x0, 0x4, 0xff, 0x40, 0x4f, - 0xf4, 0x0, 0x1, 0xef, 0x80, 0x0, 0x8f, 0xe1, - 0x0, 0xbf, 0xb0, 0x0, 0x0, 0xcf, 0xb0, 0x7f, - 0xe1, 0x0, 0x0, 0x1, 0xef, 0xaf, 0xf4, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4, 0xff, 0x5e, - 0xf7, 0x0, 0x0, 0x1, 0xef, 0x80, 0x4f, 0xf3, - 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x8f, 0xe1, 0x0, - 0x8f, 0xe1, 0x0, 0x0, 0xcf, 0xb0, 0x4f, 0xf4, - 0x0, 0x0, 0x2, 0xff, 0x80, - - /* U+0079 "y" */ - 0xd, 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0x30, - 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, - 0xef, 0x60, 0x0, 0x0, 0xd, 0xf5, 0x0, 0x8, - 0xfd, 0x0, 0x0, 0x4, 0xfe, 0x0, 0x0, 0x2f, - 0xf4, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0xbf, - 0xb0, 0x0, 0x2f, 0xf1, 0x0, 0x0, 0x4, 0xff, - 0x10, 0x8, 0xfa, 0x0, 0x0, 0x0, 0xd, 0xf8, - 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x6f, 0xe0, - 0x6f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x6c, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, - 0x0, 0xa4, 0x2, 0xcf, 0xb0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x8d, 0xfe, 0x91, 0x0, 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xd, 0xee, - 0xee, 0xee, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, - 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x2f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x0, 0x0, - 0x0, 0xb, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x7f, - 0xf2, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xee, 0xee, 0xee, 0xe8, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xf9, - - /* U+007B "{" */ - 0x0, 0x3, 0xce, 0xf0, 0x2, 0xff, 0xfe, 0x0, - 0x8f, 0xe2, 0x0, 0xa, 0xfa, 0x0, 0x0, 0xbf, - 0x90, 0x0, 0xb, 0xf9, 0x0, 0x0, 0xbf, 0x90, - 0x0, 0xb, 0xf9, 0x0, 0x0, 0xbf, 0x90, 0x0, - 0xb, 0xf9, 0x0, 0x1, 0xef, 0x70, 0xa, 0xff, - 0xd1, 0x0, 0x9f, 0xfe, 0x20, 0x0, 0xd, 0xf8, - 0x0, 0x0, 0xbf, 0x90, 0x0, 0xb, 0xf9, 0x0, - 0x0, 0xbf, 0x90, 0x0, 0xb, 0xf9, 0x0, 0x0, - 0xbf, 0x90, 0x0, 0xb, 0xfa, 0x0, 0x0, 0x9f, - 0xe2, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x4, 0xcf, - 0xf0, - - /* U+007C "|" */ - 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, - 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, - 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, - 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, - 0xfa, 0x7f, 0xa0, - - /* U+007D "}" */ - 0x8f, 0xd7, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, - 0x0, 0xaf, 0xf0, 0x0, 0x0, 0x3f, 0xf1, 0x0, - 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, - 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, - 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, - 0x0, 0xf, 0xf6, 0x0, 0x0, 0x8, 0xff, 0xf0, - 0x0, 0x9, 0xff, 0xf0, 0x0, 0x1f, 0xf5, 0x0, - 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, - 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, - 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, - 0x0, 0x9f, 0xf0, 0x0, 0x8f, 0xff, 0xa0, 0x0, - 0x8f, 0xd8, 0x0, 0x0, - - /* U+007E "~" */ - 0x3, 0xcf, 0xd5, 0x0, 0x0, 0xf8, 0xe, 0xfd, - 0xff, 0x90, 0x5, 0xf5, 0x6f, 0x60, 0x1b, 0xfe, - 0xbf, 0xe0, 0x8f, 0x0, 0x0, 0x6d, 0xfc, 0x20, - - /* U+00B0 "°" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfb, 0x20, - 0x1e, 0xc5, 0x5c, 0xe2, 0x9d, 0x0, 0x0, 0xda, - 0xd8, 0x0, 0x0, 0x7e, 0xd7, 0x0, 0x0, 0x7e, - 0xac, 0x0, 0x0, 0xcb, 0x3f, 0xa2, 0x2a, 0xf3, - 0x4, 0xef, 0xfe, 0x40, 0x0, 0x2, 0x20, 0x0, - - /* U+2022 "•" */ - 0x1, 0x64, 0x1, 0xef, 0xf7, 0x5f, 0xff, 0xd4, - 0xff, 0xfc, 0x8, 0xfd, 0x20, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xe8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x49, 0xdf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3a, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd8, 0x30, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xfb, 0x62, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xfe, 0x94, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x3a, 0xdf, 0xef, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0x3, 0xad, 0xfe, 0xff, - 0xf0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfe, - 0x6f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x3a, 0xef, 0xea, 0x30, - 0xef, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xae, 0xfe, 0xa3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F008 "" */ - 0xb7, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x7b, 0xfd, 0x88, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x88, 0xdf, - 0xff, 0xff, 0xff, 0xb4, 0x44, 0x44, 0x44, 0x44, - 0x5f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xcf, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xf5, 0x0, 0x9f, - 0xf8, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xf4, 0x0, 0x8f, 0xf9, 0x0, 0xcf, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xf5, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xfd, 0x88, 0xef, 0xa2, - 0x22, 0x22, 0x22, 0x22, 0x3f, 0xfb, 0x88, 0xdf, - 0xf8, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x8f, 0xf8, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8f, - 0xfd, 0x88, 0xef, 0xa2, 0x22, 0x22, 0x22, 0x22, - 0x3f, 0xfb, 0x88, 0xdf, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xf5, 0x0, 0x9f, 0xf8, 0x0, 0xbf, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x8f, - 0xf9, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xf5, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xb4, - 0x44, 0x44, 0x44, 0x44, 0x5f, 0xff, 0xff, 0xff, - 0xfd, 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x88, 0xdf, 0xb7, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x7b, - - /* U+F00B "" */ - 0x14, 0x44, 0x44, 0x10, 0x3, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x41, 0xef, 0xff, 0xff, 0xe0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7b, 0xbb, 0xbb, 0x60, 0x2a, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xb7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xb0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xb0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, 0x44, 0x10, - 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, - 0xef, 0xff, 0xff, 0xe0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, 0x60, - 0x2a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbd, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x10, - 0x2, 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xd1, 0x0, 0x2e, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0xdf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xc0, - 0x0, 0xc, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xcc, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x1, 0x41, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, - 0x1, 0xdf, 0xd2, 0x0, 0x0, 0x0, 0x7, 0xff, - 0x70, 0xcf, 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x4e, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, - 0xff, 0xf6, 0x4f, 0xff, 0xff, 0xe2, 0x8, 0xff, - 0xff, 0xfb, 0x0, 0x4f, 0xff, 0xff, 0xe9, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, - 0xff, 0xfb, 0x5f, 0xff, 0xff, 0xe2, 0x7, 0xff, - 0xff, 0xfb, 0x0, 0x4f, 0xff, 0xff, 0xe1, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x7a, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, - 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x60, 0x0, 0xef, 0xfd, 0x0, - 0x7, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf3, - 0x0, 0xef, 0xfd, 0x0, 0x5f, 0xfb, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfb, 0x0, 0xef, 0xfd, 0x0, - 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x9f, 0xff, 0xf6, - 0x0, 0xef, 0xfd, 0x0, 0x7f, 0xff, 0xf7, 0x0, - 0x3, 0xff, 0xff, 0x60, 0x0, 0xef, 0xfd, 0x0, - 0x8, 0xff, 0xff, 0x20, 0xa, 0xff, 0xf9, 0x0, - 0x0, 0xef, 0xfd, 0x0, 0x0, 0xbf, 0xff, 0x90, - 0x1f, 0xff, 0xe0, 0x0, 0x0, 0xef, 0xfd, 0x0, - 0x0, 0x1f, 0xff, 0xf0, 0x5f, 0xff, 0x90, 0x0, - 0x0, 0xef, 0xfd, 0x0, 0x0, 0xa, 0xff, 0xf3, - 0x8f, 0xff, 0x40, 0x0, 0x0, 0xef, 0xfd, 0x0, - 0x0, 0x6, 0xff, 0xf6, 0x9f, 0xff, 0x20, 0x0, - 0x0, 0xef, 0xfd, 0x0, 0x0, 0x4, 0xff, 0xf8, - 0x9f, 0xff, 0x20, 0x0, 0x0, 0xef, 0xfc, 0x0, - 0x0, 0x4, 0xff, 0xf7, 0x8f, 0xff, 0x40, 0x0, - 0x0, 0x37, 0x72, 0x0, 0x0, 0x6, 0xff, 0xf6, - 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf4, 0x1f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, - 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xa0, 0x3, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, - 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1, - 0x9f, 0xff, 0xf8, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xe8, 0x42, 0x24, 0x9e, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, - 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x15, 0x89, 0x97, 0x51, 0x0, 0x0, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x89, 0x98, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xc3, 0x2c, 0xff, 0xff, 0xff, 0xff, - 0xc2, 0x3c, 0xc0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0x94, 0x49, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x6, 0xef, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfe, 0x60, - 0x0, 0x1e, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe1, 0x0, - 0x6, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xfe, 0x60, 0xf, 0xff, 0xff, 0xff, - 0xff, 0x94, 0x49, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0xc, 0xc3, 0x2c, - 0xff, 0xff, 0xff, 0xff, 0xc2, 0x3c, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x89, 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x10, - 0x0, 0x2, 0x44, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x40, 0x0, 0xdf, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0x70, 0xe, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xa0, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xb3, 0xbf, 0xff, 0xce, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0x90, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x5d, - 0x50, 0x6f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfe, 0x30, 0x8f, 0xff, 0x70, 0x4e, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfd, - 0x20, 0xaf, 0xff, 0xff, 0xa0, 0x2d, 0xff, 0xfb, - 0x0, 0x0, 0x2d, 0xff, 0xfb, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xc1, 0xb, 0xff, 0xfd, 0x20, 0x4f, - 0xff, 0xf8, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x8, 0xff, 0xfe, 0x4e, 0xff, 0xf5, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x5, - 0xff, 0xfe, 0x4f, 0xe3, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3, 0xef, 0x40, - 0x41, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x1, 0x40, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xeb, 0xbb, 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x4, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xf4, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x4f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xf3, 0x0, 0x3, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, 0xbb, 0xbb, - 0xba, 0x10, 0x0, 0x1a, 0xbb, 0xbb, 0xb3, 0x0, - 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x9, 0xdd, 0xdd, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0xdd, - 0xdf, 0xff, 0xff, 0xfd, 0xdd, 0xda, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x25, 0x55, 0x55, 0x55, 0x11, 0xdf, 0xfd, 0x11, - 0x55, 0x55, 0x55, 0x52, 0xef, 0xff, 0xff, 0xff, - 0xd1, 0x1d, 0xd1, 0x1d, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x9f, 0xff, 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, 0xe7, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb6, 0xfb, 0x6f, 0xff, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+F01C "" */ - 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x50, 0x0, 0x0, 0x1e, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfe, 0x10, 0x0, 0xa, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfa, - 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x1, 0xef, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xe1, 0xaf, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd3, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x32, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x67, 0x75, 0x20, 0x0, 0x0, 0x4f, 0xff, - 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xfd, - 0x70, 0x0, 0x4f, 0xff, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x3f, 0xff, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xfe, 0xef, 0xff, - 0xff, 0xfb, 0x3f, 0xff, 0x0, 0xd, 0xff, 0xff, - 0xb4, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xdf, 0xff, - 0x0, 0xaf, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x4d, 0xff, 0xff, 0xff, 0x4, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xc, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xee, 0xef, 0xff, 0xff, 0x1f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x5f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x4, 0x43, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, 0x43, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x34, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x34, 0x40, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf1, 0xff, 0xff, 0xfd, 0xee, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0x40, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xfa, 0x0, - 0xff, 0xfe, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x4b, - 0xff, 0xff, 0xd0, 0x0, 0xff, 0xf3, 0xbf, 0xff, - 0xff, 0xfe, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0xff, 0xf3, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0xff, 0xf4, 0x0, 0x17, - 0xdf, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, - 0xff, 0xf4, 0x0, 0x0, 0x2, 0x67, 0x76, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x23, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0xa7, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0x14, 0x44, 0x44, 0xcf, 0xff, 0xff, 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, 0x7b, 0xbb, - 0xbb, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x96, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x13, 0x33, 0x33, 0xcf, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x4a, 0x20, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xe1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x3e, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x6, - 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x5, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x2e, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xcf, 0xf2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x5b, 0x30, 0x7c, 0xcc, 0xcc, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, - 0x0, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x70, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0x0, 0x0, 0x6, 0x30, - 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xf0, 0x0, 0x3, 0xff, 0x70, 0x8, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x0, - 0x0, 0xc, 0xff, 0x70, 0xc, 0xfc, 0x1, 0x44, - 0x44, 0x4c, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xa, - 0xff, 0x30, 0x4f, 0xf3, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x5a, 0x20, 0xc, 0xfb, 0x0, - 0xdf, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xc, 0xfe, 0x20, 0x4f, 0xf1, 0x8, 0xfb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2e, 0xfa, - 0x0, 0xff, 0x50, 0x5f, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x6f, 0xe0, 0xc, 0xf7, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x6, 0xfe, 0x0, 0xcf, 0x70, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, 0xef, - 0xa0, 0xf, 0xf5, 0x6, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xcf, 0xe2, 0x4, 0xff, - 0x10, 0x9f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x4, 0xa2, 0x0, 0xcf, 0xb0, 0xd, 0xf8, - 0x7b, 0xbb, 0xbb, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xaf, 0xf3, 0x4, 0xff, 0x30, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xf7, - 0x0, 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x6f, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, - 0x0, 0x53, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xfb, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xca, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x42, 0x8f, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6b, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0xbf, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x40, 0x0, - 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0xc, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, - 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xef, 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3c, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x8f, 0xfc, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x1, 0xff, 0xf9, 0x2, 0x7c, 0xff, 0xff, - 0xff, 0x50, 0x7, 0xff, 0xfb, 0x40, 0x6f, 0xff, - 0xff, 0xb0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xff, - 0xda, 0x40, 0x0, 0x0, - - /* U+F048 "" */ - 0x34, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x1d, 0xfb, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x8e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xea, 0xbb, 0x30, - 0x0, 0x0, 0x0, 0x5, 0xb4, - - /* U+F04B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xdf, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa2, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb2, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe5, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3d, 0xf9, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F04C "" */ - 0x19, 0xcc, 0xcc, 0xc9, 0x10, 0x0, 0x19, 0xcc, - 0xcc, 0xc9, 0x1b, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xfe, 0x5f, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0x50, 0x13, 0x33, 0x33, - 0x10, 0x0, 0x0, 0x13, 0x33, 0x33, 0x10, - - /* U+F04D "" */ - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x41, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb1, 0x8b, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x81, - - /* U+F051 "" */ - 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x3b, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 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, 0xfd, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x16, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xef, 0xf6, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0xb5, 0x0, - 0x0, 0x0, 0x0, 0x3b, 0xba, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x4b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0x40, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+F054 "" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x43, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x77, 0x77, 0x77, 0x7d, 0xff, 0xfd, 0x77, - 0x77, 0x77, 0x71, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xab, 0xa2, 0x0, 0x0, 0x0, 0x0, - - /* U+F068 "" */ - 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x76, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xed, - 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xe9, 0x54, 0x59, 0xef, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0x70, 0x0, 0x14, 0x20, 0x0, 0x7f, - 0xff, 0xfe, 0x20, 0x0, 0x1e, 0xff, 0xff, 0xb0, - 0x0, 0x6, 0xff, 0xc2, 0x0, 0xbf, 0xff, 0xfe, - 0x10, 0xb, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x5f, - 0xff, 0xe2, 0x3, 0xff, 0xff, 0xfb, 0x6, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa0, - 0xe, 0xff, 0xff, 0xf5, 0xef, 0xff, 0xff, 0xc0, - 0xd, 0xcf, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, - 0xff, 0xee, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xfe, 0x5f, - 0xff, 0xff, 0xe0, 0xc, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0xef, 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, - 0x30, 0x4f, 0xff, 0xff, 0xff, 0x50, 0x3f, 0xff, - 0xff, 0xb0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x7f, - 0xff, 0xff, 0x80, 0xb, 0xff, 0xff, 0xe1, 0x0, - 0x2, 0xef, 0xff, 0xf7, 0x0, 0x39, 0xb9, 0x30, - 0x7, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x2, 0xcf, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xd2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, - 0x95, 0x45, 0x9e, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xda, 0x71, 0x0, - 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x5, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xfe, 0x40, 0x0, 0x48, 0xce, 0xff, 0xeb, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xff, 0xb6, 0x45, 0x7d, 0xff, - 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xbf, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf6, 0x1, 0x76, 0x20, 0x4, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x4e, 0xff, 0xfa, 0x1f, 0xff, 0x90, 0x8, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x6e, 0x40, 0x0, - 0x2c, 0xff, 0xfd, 0xff, 0xff, 0x80, 0xf, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0x0, 0xbf, 0xff, - 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, 0xb1, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xf3, 0x9, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x9f, 0xff, 0xff, 0xd1, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0x30, 0x9f, 0xff, 0xff, - 0xf1, 0x0, 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x1, 0xbf, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf7, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x64, 0x51, - 0x0, 0x5, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x2, 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x9d, 0xef, 0xfe, 0xa1, - 0x0, 0x0, 0xaf, 0xff, 0xe4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0xc0, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xa4, 0x44, 0xaf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf7, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x80, - 0x0, 0x8f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, 0x0, 0x9, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xaf, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x2d, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x26, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x30, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfc, 0x0, 0x9b, 0xbb, 0xbb, 0x30, - 0x0, 0x0, 0x0, 0x3b, 0xbb, 0xff, 0xff, 0xc0, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3e, 0xff, - 0xe2, 0xc, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x3, 0xff, 0x30, 0xaf, 0xff, 0xf3, - 0x0, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x54, - 0x9, 0xff, 0xff, 0x40, 0x0, 0xbe, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, 0x4, 0x50, - 0x0, 0xbe, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xa0, 0x3f, 0xf3, 0x0, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xfc, 0x2, 0xef, 0xfe, - 0x30, 0xff, 0xfe, 0x30, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x9b, 0xbb, 0xbb, 0x30, 0x0, 0x0, 0x0, 0x3b, - 0xbb, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xfd, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf9, 0xa, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0xa, - 0xff, 0xff, 0x90, 0x0, 0x0, 0xaf, 0xff, 0xf9, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0x0, 0xaf, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x90, 0x9f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x79, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0xb, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, - - /* U+F078 "" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0xbf, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xa0, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x89, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf7, 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf9, 0x0, 0xa, 0xff, 0xff, - 0x90, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x90, 0x0, 0xaf, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0xaf, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x3, 0xd9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xfa, 0x0, 0x0, 0x34, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xfa, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x5, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xef, 0xfe, - 0xdf, 0xfb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf1, 0x0, 0x0, 0xd, 0xfe, 0x2b, - 0xff, 0x48, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x10, 0x0, 0x0, 0x17, 0x20, 0xbf, - 0xf4, 0x5, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0x70, 0xef, 0xf1, - 0x4f, 0xc0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x6e, 0xff, 0x5f, - 0xff, 0x60, 0x0, 0x0, 0xbf, 0xf7, 0x44, 0x44, - 0x44, 0x44, 0x20, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0xbf, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x4, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0x60, 0x0, 0xbf, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x3d, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, - 0x2f, 0xff, 0xff, 0xf2, 0x22, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x25, 0x55, 0x55, 0x52, 0xf, 0xff, 0xff, 0xf0, - 0x25, 0x55, 0x55, 0x52, 0xef, 0xff, 0xff, 0xf9, - 0xc, 0xff, 0xff, 0xc0, 0x9f, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x1, 0x10, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x88, 0x88, 0x9f, 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, 0xe7, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb6, 0xfb, 0x6f, 0xff, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xea, 0x63, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x3a, 0xff, 0xa0, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x5, 0xcf, 0xff, - 0xff, 0x70, 0x3, 0xdf, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x6a, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0xc9, - 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x0, 0x2, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0x37, 0x73, 0x0, 0x2e, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x90, 0xaf, 0xff, 0xcf, 0xff, 0xa0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xb0, 0xef, 0xf4, 0x4, 0xff, - 0xe0, 0x0, 0x9, 0xff, 0xff, 0xfb, 0x0, 0xff, - 0xf1, 0x1, 0xff, 0xf0, 0x0, 0x9f, 0xff, 0xff, - 0xb0, 0x0, 0xcf, 0xfb, 0x5b, 0xff, 0xc0, 0x9, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xf5, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x39, 0xbe, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x49, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x2, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfb, 0xef, - 0xff, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xff, 0xcf, - 0xff, 0xd0, 0x2e, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0xef, 0xf4, 0x4, 0xff, 0xe0, 0x2, 0xef, 0xff, - 0xff, 0x50, 0x0, 0xff, 0xf1, 0x1, 0xff, 0xf0, - 0x0, 0x2e, 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xfb, - 0x5b, 0xff, 0xc0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0x50, 0x5f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xd0, 0x8, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x1, 0xae, 0xea, 0x20, 0x0, - 0x39, 0xb9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf0, - 0x7a, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0x8, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xfb, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x8, - 0xff, 0xfa, 0x47, 0x88, 0x40, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x48, 0x88, 0x7f, 0xff, 0xf8, 0xf, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x74, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, - 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, - 0xf8, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf8, 0xf, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0x54, 0x44, 0x44, 0x44, 0x44, 0x45, 0xff, 0xff, - 0xff, 0xff, 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, 0xce, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb1, 0x8b, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x81, - - /* U+F0C9 "" */ - 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x57, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xeb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x31, - - /* U+F0E0 "" */ - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd2, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0xe4, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x4e, 0xff, 0x80, 0x2c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x8, 0xff, - 0xff, 0xfc, 0x20, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf5, 0x4, - 0xef, 0xff, 0xff, 0xfe, 0x40, 0x5e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x1c, 0xff, 0xff, 0xb1, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x6d, 0xd6, 0x2, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd9, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - - /* U+F0E7 "" */ - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xc8, 0x88, 0x87, 0x30, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x37, - 0x88, 0x88, 0xaf, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0x70, - 0x0, 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x3, 0xdf, 0xd3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x78, 0x88, 0xff, 0xef, 0xf8, - 0x88, 0x74, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x90, 0x9f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xf9, 0x9, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xf4, 0x7, 0x88, 0x88, - 0x88, 0x3, 0x30, 0x0, 0xff, 0xff, 0xff, 0x7, - 0xff, 0xff, 0xff, 0xf0, 0x8f, 0x40, 0xf, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0x8, 0xff, - 0x40, 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, - 0xf0, 0x8f, 0xff, 0x4f, 0xff, 0xff, 0xf0, 0x8f, - 0xff, 0xff, 0xff, 0x8, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, - 0xb8, 0x88, 0x88, 0xff, 0xff, 0xff, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x78, 0x88, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x6f, 0xff, 0x51, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, - 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xc3, - 0x0, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x1f, 0x90, 0x9, 0xf1, 0x1, - 0xf9, 0x0, 0x9f, 0x10, 0x1f, 0xff, 0xff, 0xf0, - 0x0, 0xf8, 0x0, 0x8f, 0x0, 0xf, 0x80, 0x8, - 0xf0, 0x0, 0xff, 0xff, 0xff, 0x10, 0x1f, 0x90, - 0x9, 0xf1, 0x1, 0xf9, 0x0, 0x9f, 0x10, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb8, 0x8f, 0xe8, 0x8b, 0xfb, 0x88, 0xfe, - 0x88, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xcc, 0x0, 0x4f, 0x40, 0xc, 0xc0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0xc, 0xc0, 0x4, - 0xf4, 0x0, 0xcc, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x88, 0xfe, 0x88, 0xbf, 0xb8, 0x8f, - 0xe8, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x1, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xf1, 0x1, 0xff, 0xff, - 0xff, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0x0, 0xf, 0xff, 0xff, 0xf1, 0x1, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf1, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd3, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, - 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x6, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x57, - 0x88, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F15B "" */ - 0xbf, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe4, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, - 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x56, 0x77, 0x65, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x50, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x30, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xc9, 0x65, 0x44, 0x56, 0x9c, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x1c, 0xff, 0xff, 0xfd, 0x61, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0xff, - 0xc1, 0xdf, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xfd, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x9, - 0xf6, 0x0, 0x0, 0x0, 0x48, 0xcd, 0xff, 0xdc, - 0x84, 0x0, 0x0, 0x0, 0x6f, 0x90, 0x0, 0x10, - 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe6, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xfe, 0xcc, 0xef, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xc5, 0x10, 0x0, 0x1, 0x5c, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xaa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F240 "" */ - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfe, 0xff, 0xf0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8, - 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5, 0xbf, - 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, - 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x2, 0x4f, 0xff, 0xff, 0xf0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, - - /* U+F241 "" */ - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfe, 0xff, 0xf0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x5, 0xbf, - 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, - - /* U+F242 "" */ - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfe, 0xff, 0xf0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, - 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, - - /* U+F243 "" */ - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfe, 0xff, 0xf0, 0xbf, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, - 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf0, 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, - 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, - - /* U+F244 "" */ - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfe, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0x7d, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xf5, 0x3a, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xf6, 0x0, 0x9, 0xda, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, 0xed, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x50, - 0x0, 0x6f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa4, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x30, - 0x1e, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xfa, 0x10, 0xe, 0xff, 0xff, 0xfd, 0xbe, - 0xfe, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xff, 0xff, 0x60, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x1c, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xd4, 0x0, 0x1c, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x2f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x70, - 0x0, 0x0, 0x4, 0x63, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xfb, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xf8, 0x4b, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x5c, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x2, 0x8c, 0xef, 0xfe, 0xa6, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xa, 0xff, 0xff, - 0xff, 0x5, 0xff, 0xff, 0xfe, 0x10, 0x2, 0xff, - 0xff, 0xff, 0xf0, 0x5, 0xff, 0xff, 0xf8, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0x0, 0x6, 0xff, 0xff, - 0xe0, 0xe, 0xff, 0xfc, 0xff, 0xf0, 0x16, 0x7, - 0xff, 0xff, 0x21, 0xff, 0xf8, 0x9, 0xff, 0x1, - 0xf6, 0x7, 0xff, 0xf5, 0x4f, 0xff, 0xd1, 0x9, - 0xf0, 0x1f, 0x70, 0x6f, 0xff, 0x86, 0xff, 0xff, - 0xd1, 0x7, 0x1, 0x70, 0x5f, 0xff, 0xf9, 0x7f, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xa7, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x2e, 0xff, - 0xff, 0xfb, 0x7f, 0xff, 0xff, 0xff, 0x30, 0x5, - 0xff, 0xff, 0xff, 0xb7, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x6, 0xff, 0xff, 0xfa, 0x6f, 0xff, 0xff, - 0x40, 0x30, 0x3, 0x7, 0xff, 0xff, 0xa4, 0xff, - 0xff, 0x40, 0x4e, 0x1, 0xe2, 0x8, 0xff, 0xf8, - 0x2f, 0xff, 0x70, 0x4f, 0xf0, 0x1f, 0x90, 0x2f, - 0xff, 0x60, 0xef, 0xff, 0x7f, 0xff, 0x1, 0xb0, - 0x2e, 0xff, 0xf3, 0xa, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x2e, 0xff, 0xff, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0x0, 0x2e, 0xff, 0xff, 0x90, 0x0, 0xbf, - 0xff, 0xff, 0xf0, 0x2e, 0xff, 0xff, 0xf2, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, - 0xec, 0x82, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x1a, 0xcc, 0xcc, 0xca, 0x10, - 0x0, 0x0, 0x2, 0x44, 0x44, 0x49, 0xff, 0xff, - 0xff, 0xf9, 0x44, 0x44, 0x42, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, - 0xff, 0x66, 0xff, 0xd1, 0xdf, 0xf6, 0x6f, 0xff, - 0x80, 0x8, 0xff, 0xf4, 0x4f, 0xfc, 0xc, 0xff, - 0x44, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0x44, 0xff, - 0xc0, 0xcf, 0xf4, 0x4f, 0xff, 0x80, 0x8, 0xff, - 0xf4, 0x4f, 0xfc, 0xc, 0xff, 0x44, 0xff, 0xf8, - 0x0, 0x8f, 0xff, 0x44, 0xff, 0xc0, 0xcf, 0xf4, - 0x4f, 0xff, 0x80, 0x8, 0xff, 0xf4, 0x4f, 0xfc, - 0xc, 0xff, 0x44, 0xff, 0xf8, 0x0, 0x8f, 0xff, - 0x44, 0xff, 0xc0, 0xcf, 0xf4, 0x4f, 0xff, 0x80, - 0x8, 0xff, 0xf4, 0x4f, 0xfc, 0xc, 0xff, 0x44, - 0xff, 0xf8, 0x0, 0x8f, 0xff, 0x44, 0xff, 0xc0, - 0xcf, 0xf4, 0x4f, 0xff, 0x80, 0x8, 0xff, 0xf4, - 0x4f, 0xfc, 0xc, 0xff, 0x44, 0xff, 0xf8, 0x0, - 0x8f, 0xff, 0x44, 0xff, 0xc0, 0xcf, 0xf4, 0x4f, - 0xff, 0x80, 0x8, 0xff, 0xf6, 0x6f, 0xfd, 0x1d, - 0xff, 0x66, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6e, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x50, 0x3f, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x3f, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xb0, 0x3f, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xb0, 0x3f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb0, 0x3f, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xdb, 0xa8, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xf8, 0x6, 0xff, 0xff, 0x60, 0x8f, - 0xff, 0xff, 0xff, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x6f, 0xf6, 0x0, 0xc, 0xff, - 0xff, 0xff, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x6, 0x60, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x6, 0x60, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x6f, 0xf6, 0x0, 0xc, - 0xff, 0xff, 0xff, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xf8, 0x6, 0xff, 0xff, 0x60, 0x8f, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x80, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xf4, 0x8, 0xf0, - 0xe, 0x90, 0xf, 0xff, 0x8, 0xff, 0xf4, 0x8, - 0xf0, 0xe, 0x90, 0xf, 0xff, 0x8f, 0xff, 0xf4, - 0x8, 0xf0, 0xe, 0x90, 0xf, 0xff, 0xff, 0xff, - 0xf4, 0x8, 0xf0, 0xe, 0x90, 0xf, 0xff, 0xff, - 0xff, 0xfa, 0x8c, 0xf8, 0x8f, 0xc8, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0x10, 0x0, 0x0, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf1, 0x0, 0x0, 0x1c, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, - 0x1d, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf1, 0x0, 0x2d, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, - 0x2e, 0xff, 0xff, 0xa2, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x2b, 0xff, 0xf1, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x8f, 0xff, 0xff, 0xd9, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x60, 0x0, 0x7f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 103, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 103, .box_w = 4, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 34, .adv_w = 150, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 59, .adv_w = 270, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 204, .adv_w = 238, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 365, .adv_w = 324, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 535, .adv_w = 263, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 679, .adv_w = 81, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 690, .adv_w = 129, .box_w = 6, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 759, .adv_w = 130, .box_w = 6, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 828, .adv_w = 154, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 878, .adv_w = 223, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 944, .adv_w = 87, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 958, .adv_w = 147, .box_w = 7, .box_h = 3, .ofs_x = 1, .ofs_y = 6}, - {.bitmap_index = 969, .adv_w = 87, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 977, .adv_w = 135, .box_w = 11, .box_h = 23, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 1104, .adv_w = 256, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1223, .adv_w = 142, .box_w = 7, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1283, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1394, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1505, .adv_w = 257, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1641, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1752, .adv_w = 237, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1871, .adv_w = 230, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1990, .adv_w = 247, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2109, .adv_w = 237, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2228, .adv_w = 87, .box_w = 4, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2254, .adv_w = 87, .box_w = 4, .box_h = 17, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 2288, .adv_w = 223, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 2354, .adv_w = 223, .box_w = 12, .box_h = 8, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 2402, .adv_w = 223, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 2468, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2579, .adv_w = 397, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 2832, .adv_w = 281, .box_w = 19, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2994, .adv_w = 291, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3122, .adv_w = 278, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3258, .adv_w = 317, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3403, .adv_w = 257, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3514, .adv_w = 244, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3625, .adv_w = 296, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3761, .adv_w = 312, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3889, .adv_w = 119, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3915, .adv_w = 197, .box_w = 11, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 4009, .adv_w = 276, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4145, .adv_w = 228, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4256, .adv_w = 367, .box_w = 19, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4418, .adv_w = 312, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4546, .adv_w = 323, .box_w = 19, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4708, .adv_w = 277, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4836, .adv_w = 323, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 5026, .adv_w = 279, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5154, .adv_w = 238, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5273, .adv_w = 225, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5392, .adv_w = 304, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5520, .adv_w = 273, .box_w = 19, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 5682, .adv_w = 432, .box_w = 27, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5912, .adv_w = 258, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6048, .adv_w = 248, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 6193, .adv_w = 252, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6321, .adv_w = 128, .box_w = 6, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 6390, .adv_w = 135, .box_w = 11, .box_h = 23, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 6517, .adv_w = 128, .box_w = 6, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 6586, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 6646, .adv_w = 192, .box_w = 12, .box_h = 2, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6658, .adv_w = 230, .box_w = 7, .box_h = 3, .ofs_x = 2, .ofs_y = 15}, - {.bitmap_index = 6669, .adv_w = 230, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6747, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6873, .adv_w = 219, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6951, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7077, .adv_w = 235, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7162, .adv_w = 136, .box_w = 10, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7252, .adv_w = 265, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 7378, .adv_w = 262, .box_w = 13, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7495, .adv_w = 107, .box_w = 4, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7531, .adv_w = 109, .box_w = 9, .box_h = 23, .ofs_x = -3, .ofs_y = -5}, - {.bitmap_index = 7635, .adv_w = 237, .box_w = 13, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7752, .adv_w = 107, .box_w = 3, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7779, .adv_w = 406, .box_w = 22, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7922, .adv_w = 262, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8007, .adv_w = 244, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8098, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 8224, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 8350, .adv_w = 157, .box_w = 8, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8402, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8480, .adv_w = 159, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8560, .adv_w = 260, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8645, .adv_w = 215, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 8743, .adv_w = 345, .box_w = 22, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8886, .adv_w = 212, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8971, .adv_w = 215, .box_w = 15, .box_h = 18, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 9106, .adv_w = 200, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9184, .adv_w = 135, .box_w = 7, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 9265, .adv_w = 115, .box_w = 3, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 9300, .adv_w = 135, .box_w = 8, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 9392, .adv_w = 223, .box_w = 12, .box_h = 4, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 9416, .adv_w = 161, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 9456, .adv_w = 121, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 9469, .adv_w = 384, .box_w = 24, .box_h = 25, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9769, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9985, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10249, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10465, .adv_w = 264, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10618, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10906, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11194, .adv_w = 432, .box_w = 27, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11491, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11779, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12022, .adv_w = 384, .box_w = 24, .box_h = 26, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 12334, .adv_w = 192, .box_w = 12, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12448, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12619, .adv_w = 432, .box_w = 27, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12943, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13159, .adv_w = 264, .box_w = 17, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 13363, .adv_w = 336, .box_w = 15, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 13528, .adv_w = 336, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 13801, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14032, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14263, .adv_w = 336, .box_w = 15, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 14428, .adv_w = 336, .box_w = 23, .box_h = 22, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 14681, .adv_w = 240, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 14824, .adv_w = 240, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 14967, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15198, .adv_w = 336, .box_w = 21, .box_h = 6, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 15261, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15504, .adv_w = 480, .box_w = 31, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 15876, .adv_w = 432, .box_w = 29, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 16224, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16488, .adv_w = 336, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 16635, .adv_w = 336, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 16782, .adv_w = 480, .box_w = 31, .box_h = 19, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 17077, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17293, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 17581, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 17894, .adv_w = 336, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18136, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 18388, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18619, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 18829, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 19045, .adv_w = 240, .box_w = 17, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 19249, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 19501, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 19753, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 19996, .adv_w = 384, .box_w = 26, .box_h = 26, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 20334, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 20550, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20895, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 21135, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 21375, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 21615, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 21855, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 22095, .adv_w = 480, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 22405, .adv_w = 336, .box_w = 19, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 22633, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 22885, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 23198, .adv_w = 480, .box_w = 30, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23468, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 23684, .adv_w = 386, .box_w = 25, .box_h = 16, .ofs_x = 0, .ofs_y = 1} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 4, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 17, 0, 10, -8, 0, 0, - 0, 0, -21, -23, 3, 18, 8, 7, - -15, 3, 19, 1, 16, 4, 12, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 23, 3, -3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8, 0, -12, 0, 0, 0, 0, - 0, -8, 7, 8, 0, 0, -4, 0, - -3, 4, 0, -4, 0, -4, -2, -8, - 0, 0, 0, 0, -4, 0, 0, -5, - -6, 0, 0, -4, 0, -8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - -4, 0, -6, 0, -10, 0, -46, 0, - 0, -8, 0, 8, 12, 0, 0, -8, - 4, 4, 13, 8, -7, 8, 0, 0, - -22, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -10, -5, -19, 0, -15, - -3, 0, 0, 0, 0, 1, 15, 0, - -12, -3, -1, 1, 0, -7, 0, 0, - -3, -28, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -31, -3, 15, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -16, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 13, - 0, 4, 0, 0, -8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 3, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -14, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, - 8, 4, 12, -4, 0, 0, 8, -4, - -13, -53, 3, 10, 8, 1, -5, 0, - 14, 0, 12, 0, 12, 0, -36, 0, - -5, 12, 0, 13, -4, 8, 4, 0, - 0, 1, -4, 0, 0, -7, 31, 0, - 31, 0, 12, 0, 16, 5, 7, 12, - 0, 0, 0, -14, 0, 0, 0, 0, - 1, -3, 0, 3, -7, -5, -8, 3, - 0, -4, 0, 0, 0, -15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -25, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, -21, 0, -24, 0, 0, 0, - 0, -3, 0, 38, -5, -5, 4, 4, - -3, 0, -5, 4, 0, 0, -20, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -37, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -24, 0, 23, 0, 0, -14, 0, - 13, 0, -26, -37, -26, -8, 12, 0, - 0, -26, 0, 5, -9, 0, -6, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 12, -47, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 0, 3, 0, 0, 0, - 0, 0, 3, 3, -5, -8, 0, -1, - -1, -4, 0, 0, -3, 0, 0, 0, - -8, 0, -3, 0, -9, -8, 0, -10, - -13, -13, -7, 0, -8, 0, -8, 0, - 0, 0, 0, -3, 0, 0, 4, 0, - 3, -4, 0, 1, 0, 0, 0, 4, - -3, 0, 0, 0, -3, 4, 4, -1, - 0, 0, 0, -7, 0, -1, 0, 0, - 0, 0, 0, 1, 0, 5, -3, 0, - -5, 0, -7, 0, 0, -3, 0, 12, - 0, 0, -4, 0, 0, 0, 0, 0, - -1, 1, -3, -3, 0, 0, -4, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, -2, 0, -4, -5, 0, - 0, 0, 0, 0, 1, 0, 0, -3, - 0, -4, -4, -4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -2, 0, 0, - 0, 0, -3, -5, 0, -6, 0, -12, - -3, -12, 8, 0, 0, -8, 4, 8, - 10, 0, -10, -1, -5, 0, -1, -18, - 4, -3, 3, -20, 4, 0, 0, 1, - -20, 0, -20, -3, -33, -3, 0, -19, - 0, 8, 11, 0, 5, 0, 0, 0, - 0, 1, 0, -7, -5, 0, -12, 0, - 0, 0, -4, 0, 0, 0, -4, 0, - 0, 0, 0, 0, -2, -2, 0, -2, - -5, 0, 0, 0, 0, 0, 0, 0, - -4, -4, 0, -3, -5, -3, 0, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, -3, 0, -5, - 0, -3, 0, -8, 4, 0, 0, -5, - 2, 4, 4, 0, 0, 0, 0, 0, - 0, -3, 0, 0, 0, 0, 0, 3, - 0, 0, -4, 0, -4, -3, -5, 0, - 0, 0, 0, 0, 0, 0, 3, 0, - -3, 0, 0, 0, 0, -4, -6, 0, - -7, 0, 12, -3, 1, -12, 0, 0, - 10, -19, -20, -16, -8, 4, 0, -3, - -25, -7, 0, -7, 0, -8, 6, -7, - -25, 0, -10, 0, 0, 2, -1, 3, - -3, 0, 4, 0, -12, -15, 0, -19, - -9, -8, -9, -12, -5, -10, -1, -7, - -10, 2, 0, 1, 0, -4, 0, 0, - 0, 3, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - 0, -2, 0, -1, -4, 0, -7, -8, - -8, -1, 0, -12, 0, 0, 0, 0, - 0, 0, -3, 0, 0, 0, 0, 2, - -2, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, 0, 0, - -7, 0, 0, 0, 0, -19, -12, 0, - 0, 0, -6, -19, 0, 0, -4, 4, - 0, -10, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, 0, 0, -7, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, -7, 0, - 0, 0, 0, 5, 0, 3, -8, -8, - 0, -4, -4, -5, 0, 0, 0, 0, - 0, 0, -12, 0, -4, 0, -6, -4, - 0, -8, -10, -12, -3, 0, -8, 0, - -12, 0, 0, 0, 0, 31, 0, 0, - 2, 0, 0, -5, 0, 4, 0, -17, - 0, 0, 0, 0, 0, -36, -7, 13, - 12, -3, -16, 0, 4, -6, 0, -19, - -2, -5, 4, -27, -4, 5, 0, 6, - -13, -6, -14, -13, -16, 0, 0, -23, - 0, 22, 0, 0, -2, 0, 0, 0, - -2, -2, -4, -10, -13, -1, -36, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -4, 0, -2, -4, -6, 0, 0, - -8, 0, -4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, -8, 0, 0, 8, - -1, 5, 0, -8, 4, -3, -1, -10, - -4, 0, -5, -4, -3, 0, -6, -7, - 0, 0, -3, -1, -3, -7, -5, 0, - 0, -4, 0, 4, -3, 0, -8, 0, - 0, 0, -8, 0, -7, 0, -7, -7, - 4, 0, 0, 0, 0, 0, 0, 0, - 0, -8, 4, 0, -5, 0, -3, -5, - -12, -3, -3, -3, -1, -3, -5, -1, - 0, 0, 0, 0, 0, -4, -3, -3, - 0, 0, 0, 0, 5, -3, 0, -3, - 0, 0, 0, -3, -5, -3, -3, -5, - -3, 0, 3, 15, -1, 0, -10, 0, - -3, 8, 0, -4, -16, -5, 6, 0, - 0, -18, -7, 4, -7, 3, 0, -3, - -3, -12, 0, -6, 2, 0, 0, -7, - 0, 0, 0, 4, 4, -8, -7, 0, - -7, -4, -6, -4, -4, 0, -7, 2, - -7, -7, 12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, 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, - -3, 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, -3, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, 0, 0, -5, - 0, 0, -4, -4, 0, 0, 0, 0, - -4, 0, 0, 0, 0, -2, 0, 0, - 0, 0, 0, -3, 0, 0, 0, 0, - -6, 0, -8, 0, 0, 0, -13, 0, - 3, -8, 8, 1, -3, -18, 0, 0, - -8, -4, 0, -15, -10, -11, 0, 0, - -17, -4, -15, -15, -18, 0, -10, 0, - 3, 26, -5, 0, -9, -4, -1, -4, - -7, -10, -7, -14, -16, -9, -4, 0, - 0, -3, 0, 1, 0, 0, -27, -3, - 12, 8, -8, -14, 0, 1, -12, 0, - -19, -3, -4, 8, -35, -5, 1, 0, - 0, -25, -5, -20, -4, -28, 0, 0, - -27, 0, 23, 1, 0, -3, 0, 0, - 0, 0, -2, -3, -15, -3, 0, -25, - 0, 0, 0, 0, -12, 0, -3, 0, - -1, -11, -18, 0, 0, -2, -6, -12, - -4, 0, -3, 0, 0, 0, 0, -17, - -4, -13, -12, -3, -7, -10, -4, -7, - 0, -8, -3, -13, -6, 0, -5, -7, - -4, -7, 0, 2, 0, -3, -13, 0, - 8, 0, -7, 0, 0, 0, 0, 5, - 0, 3, -8, 16, 0, -4, -4, -5, - 0, 0, 0, 0, 0, 0, -12, 0, - -4, 0, -6, -4, 0, -8, -10, -12, - -3, 0, -8, 3, 15, 0, 0, 0, - 0, 31, 0, 0, 2, 0, 0, -5, - 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -3, -8, 0, 0, 0, 0, 0, -2, - 0, 0, 0, -4, -4, 0, 0, -8, - -4, 0, 0, -8, 0, 7, -2, 0, - 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 6, 8, 3, -3, 0, -12, - -6, 0, 12, -13, -12, -8, -8, 15, - 7, 4, -33, -3, 8, -4, 0, -4, - 4, -4, -13, 0, -4, 4, -5, -3, - -12, -3, 0, 0, 12, 8, 0, -11, - 0, -21, -5, 11, -5, -15, 1, -5, - -13, -13, -4, 15, 4, 0, -6, 0, - -10, 0, 3, 13, -9, -14, -15, -10, - 12, 0, 1, -28, -3, 4, -7, -3, - -9, 0, -8, -14, -6, -6, -3, 0, - 0, -9, -8, -4, 0, 12, 9, -4, - -21, 0, -21, -5, 0, -13, -22, -1, - -12, -7, -13, -11, 10, 0, 0, -5, - 0, -8, -3, 0, -4, -7, 0, 7, - -13, 4, 0, 0, -20, 0, -4, -8, - -7, -3, -12, -10, -13, -9, 0, -12, - -4, -9, -7, -12, -4, 0, 0, 1, - 18, -7, 0, -12, -4, 0, -4, -8, - -9, -10, -11, -15, -5, -8, 8, 0, - -6, 0, -19, -5, 2, 8, -12, -14, - -8, -13, 13, -4, 2, -36, -7, 8, - -8, -7, -14, 0, -12, -16, -5, -4, - -3, -4, -8, -12, -1, 0, 0, 12, - 11, -3, -25, 0, -23, -9, 9, -15, - -26, -8, -13, -16, -19, -13, 8, 0, - 0, 0, 0, -5, 0, 0, 4, -5, - 8, 3, -7, 8, 0, 0, -12, -1, - 0, -1, 0, 1, 1, -3, 0, 0, - 0, 0, 0, 0, -4, 0, 0, 0, - 0, 3, 12, 1, 0, -5, 0, 0, - 0, 0, -3, -3, -5, 0, 0, 0, - 1, 3, 0, 0, 0, 0, 3, 0, - -3, 0, 15, 0, 7, 1, 1, -5, - 0, 8, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 12, 0, 11, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -23, 0, -4, 7, 0, 12, - 0, 0, 38, 5, -8, -8, 4, 4, - -3, 1, -19, 0, 0, 18, -23, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -26, 15, 54, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -23, 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, -6, 0, 0, -7, - -3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, -10, 0, - 0, 1, 0, 0, 4, 50, -8, -3, - 12, 10, -10, 4, 0, 0, 4, 4, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -50, 11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -11, - 0, 0, 0, -10, 0, 0, 0, 0, - -8, -2, 0, 0, 0, -8, 0, -5, - 0, -18, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -26, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, -4, 0, 0, -7, 0, -6, 0, - -10, 0, 0, 0, -7, 4, -5, 0, - 0, -10, -4, -9, 0, 0, -10, 0, - -4, 0, -18, 0, -4, 0, 0, -31, - -7, -15, -4, -14, 0, 0, -26, 0, - -10, -2, 0, 0, 0, 0, 0, 0, - 0, 0, -6, -7, -3, -7, 0, 0, - 0, 0, -8, 0, -8, 5, -4, 8, - 0, -3, -9, -3, -7, -7, 0, -5, - -2, -3, 3, -10, -1, 0, 0, 0, - -34, -3, -5, 0, -8, 0, -3, -18, - -3, 0, 0, -3, -3, 0, 0, 0, - 0, 3, 0, -3, -7, -3, 7, 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, 5, 0, 0, 0, 0, 0, - 0, -8, 0, -3, 0, 0, 0, -8, - 4, 0, 0, 0, -10, -4, -8, 0, - 0, -11, 0, -4, 0, -18, 0, 0, - 0, 0, -37, 0, -8, -14, -19, 0, - 0, -26, 0, -3, -6, 0, 0, 0, - 0, 0, 0, 0, 0, -4, -6, -2, - -6, 1, 0, 0, 7, -5, 0, 12, - 19, -4, -4, -12, 5, 19, 7, 8, - -10, 5, 16, 5, 11, 8, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 24, 18, -7, -4, 0, -3, - 31, 17, 31, 0, 0, 0, 4, 0, - 0, 14, 0, 0, -6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -3, 0, - 0, 0, 0, 0, 0, 0, 0, 5, - 0, 0, 0, 0, -32, -5, -3, -16, - -19, 0, 0, -26, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - 0, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 0, -32, -5, -3, - -16, -19, 0, 0, -15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -3, 0, 0, 0, -9, 4, 0, -4, - 3, 7, 4, -12, 0, -1, -3, 4, - 0, 3, 0, 0, 0, 0, -10, 0, - -3, -3, -8, 0, -3, -15, 0, 24, - -4, 0, -8, -3, 0, -3, -7, 0, - -4, -11, -8, -5, 0, 0, 0, -6, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -3, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 0, 0, 0, 0, -32, - -5, -3, -16, -19, 0, 0, -26, 0, - 0, 0, 0, 0, 0, 19, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -6, 0, -12, -5, -3, 12, -3, -4, - -15, 1, -2, 1, -3, -10, 1, 8, - 1, 3, 1, 3, -9, -15, -5, 0, - -15, -7, -10, -16, -15, 0, -6, -8, - -5, -5, -3, -3, -5, -3, 0, -3, - -1, 6, 0, 6, -3, 0, 12, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -3, -4, -4, 0, 0, - -10, 0, -2, 0, -7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -23, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, -4, 0, -5, - 0, 0, 0, 0, -3, 0, 0, -7, - -4, 4, 0, -7, -7, -3, 0, -11, - -3, -8, -3, -5, 0, -7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -26, 0, 12, 0, 0, -7, 0, - 0, 0, 0, -5, 0, -4, 0, 0, - -2, 0, 0, -3, 0, -9, 0, 0, - 16, -5, -13, -12, 3, 4, 4, -1, - -11, 3, 6, 3, 12, 3, 13, -3, - -10, 0, 0, -15, 0, 0, -12, -10, - 0, 0, -8, 0, -5, -7, 0, -6, - 0, -6, 0, -3, 6, 0, -3, -12, - -4, 14, 0, 0, -3, 0, -8, 0, - 0, 5, -9, 0, 4, -4, 3, 0, - 0, -13, 0, -3, -1, 0, -4, 4, - -3, 0, 0, 0, -16, -5, -8, 0, - -12, 0, 0, -18, 0, 14, -4, 0, - -7, 0, 2, 0, -4, 0, -4, -12, - 0, -4, 4, 0, 0, 0, 0, -3, - 0, 0, 4, -5, 1, 0, 0, -5, - -3, 0, -5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -24, 0, 8, 0, - 0, -3, 0, 0, 0, 0, 1, 0, - -4, -4, 0, 0, 0, 8, 0, 9, - 0, 0, 0, 0, 0, -24, -22, 1, - 17, 12, 7, -15, 3, 16, 0, 14, - 0, 8, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 20, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_24 = { -#else -lv_font_t lv_font_montserrat_24 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 27, /*The maximum line height required by the font*/ - .base_line = 5, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -2, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_24*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_26.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_26.c deleted file mode 100644 index 93d4f71..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_26.c +++ /dev/null @@ -1,4592 +0,0 @@ -/******************************************************************************* - * Size: 26 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 26 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_26.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_26 - #define LV_FONT_MONTSERRAT_26 1 -#endif - -#if LV_FONT_MONTSERRAT_26 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0xf, 0xff, 0x0, 0xef, 0xe0, 0xe, 0xfd, 0x0, - 0xdf, 0xd0, 0xc, 0xfc, 0x0, 0xcf, 0xb0, 0xb, - 0xfb, 0x0, 0xbf, 0xa0, 0xa, 0xfa, 0x0, 0x9f, - 0x90, 0x9, 0xf8, 0x0, 0x8f, 0x80, 0x4, 0x84, - 0x0, 0x0, 0x0, 0x1, 0x41, 0x0, 0xef, 0xe0, - 0x2f, 0xff, 0x10, 0x9f, 0x90, - - /* U+0022 "\"" */ - 0x5f, 0xd0, 0xa, 0xf8, 0x5f, 0xc0, 0xa, 0xf7, - 0x4f, 0xc0, 0x9, 0xf7, 0x4f, 0xb0, 0x9, 0xf6, - 0x4f, 0xb0, 0x8, 0xf6, 0x3f, 0xa0, 0x8, 0xf6, - 0x3f, 0xa0, 0x8, 0xf5, 0x1, 0x0, 0x0, 0x10, - - /* U+0023 "#" */ - 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x5f, 0x70, - 0x0, 0x0, 0x0, 0x3, 0xf9, 0x0, 0x0, 0x7f, - 0x50, 0x0, 0x0, 0x0, 0x6, 0xf7, 0x0, 0x0, - 0xaf, 0x30, 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, - 0x0, 0xcf, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x6, 0xee, 0xef, - 0xfe, 0xee, 0xee, 0xff, 0xee, 0xe8, 0x0, 0x0, - 0xe, 0xf0, 0x0, 0x2, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xd0, 0x0, 0x4, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xb0, 0x0, 0x6, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0x90, 0x0, 0x8, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0x70, 0x0, 0xa, - 0xf3, 0x0, 0x0, 0x4e, 0xee, 0xff, 0xfe, 0xee, - 0xef, 0xfe, 0xee, 0xa0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, - 0x10, 0x0, 0xf, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xfd, 0x0, 0x0, 0x3f, 0x90, 0x0, 0x0, - 0x0, 0x1, 0xfb, 0x0, 0x0, 0x5f, 0x70, 0x0, - 0x0, 0x0, 0x3, 0xf9, 0x0, 0x0, 0x7f, 0x60, - 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xae, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x1b, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x20, 0xb, 0xff, 0xc6, - 0xbf, 0x57, 0xbf, 0xe0, 0x3, 0xff, 0xa0, 0x9, - 0xf0, 0x0, 0x14, 0x0, 0x6f, 0xf2, 0x0, 0x9f, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, 0x9, 0xf0, - 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x10, 0x9f, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xac, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xd8, 0x30, - 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, 0xc3, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0x9e, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x9, 0xf0, 0x7, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x9f, 0x0, 0xa, 0xff, 0x0, - 0x0, 0x0, 0x9, 0xf0, 0x0, 0x8f, 0xf0, 0x4c, - 0x30, 0x0, 0x9f, 0x0, 0x1e, 0xfd, 0xc, 0xff, - 0xb7, 0x4b, 0xf4, 0x7e, 0xff, 0x50, 0x2c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x3, 0x9d, - 0xef, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0x0, 0x0, 0x0, 0x0, - - /* U+0025 "%" */ - 0x0, 0x1a, 0xef, 0xc5, 0x0, 0x0, 0x0, 0x3, - 0xfc, 0x0, 0x0, 0x1e, 0xfa, 0x9d, 0xf6, 0x0, - 0x0, 0x0, 0xdf, 0x20, 0x0, 0x9, 0xf5, 0x0, - 0xd, 0xf0, 0x0, 0x0, 0x8f, 0x70, 0x0, 0x0, - 0xed, 0x0, 0x0, 0x6f, 0x40, 0x0, 0x4f, 0xb0, - 0x0, 0x0, 0xf, 0xb0, 0x0, 0x4, 0xf6, 0x0, - 0xe, 0xf1, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, - 0x5f, 0x50, 0xa, 0xf6, 0x0, 0x0, 0x0, 0xb, - 0xf1, 0x0, 0xa, 0xf1, 0x5, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xd4, 0x38, 0xfa, 0x1, 0xee, - 0x10, 0x1, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfa, - 0x0, 0xbf, 0x40, 0x7e, 0xff, 0xb1, 0x0, 0x0, - 0x4, 0x42, 0x0, 0x6f, 0x90, 0x8f, 0xb6, 0x8f, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x1f, - 0xc0, 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0xc, - 0xf3, 0x5, 0xf5, 0x0, 0x0, 0xec, 0x0, 0x0, - 0x0, 0x7, 0xf8, 0x0, 0x7f, 0x30, 0x0, 0xc, - 0xe0, 0x0, 0x0, 0x2, 0xfd, 0x0, 0x7, 0xf3, - 0x0, 0x0, 0xce, 0x0, 0x0, 0x0, 0xcf, 0x30, - 0x0, 0x5f, 0x50, 0x0, 0xe, 0xc0, 0x0, 0x0, - 0x8f, 0x70, 0x0, 0x0, 0xfc, 0x0, 0x5, 0xf6, - 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x6, 0xfb, - 0x68, 0xfc, 0x0, 0x0, 0xd, 0xf2, 0x0, 0x0, - 0x0, 0x5, 0xcf, 0xe9, 0x0, - - /* U+0026 "&" */ - 0x0, 0x0, 0x5c, 0xff, 0xd9, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xef, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x4f, 0xf6, 0x0, 0x1c, 0xfa, 0x0, - 0x0, 0x0, 0x8, 0xfc, 0x0, 0x0, 0x5f, 0xc0, - 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x0, 0x7, 0xfb, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, 0x4, 0xff, - 0x40, 0x0, 0x0, 0x0, 0xb, 0xff, 0x49, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x9c, - 0xff, 0x40, 0x0, 0x44, 0x0, 0xb, 0xfe, 0x30, - 0xc, 0xff, 0x40, 0xb, 0xf7, 0x6, 0xff, 0x20, - 0x0, 0xb, 0xff, 0x51, 0xff, 0x20, 0xbf, 0xb0, - 0x0, 0x0, 0xa, 0xff, 0xbf, 0xc0, 0xc, 0xfa, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0xaf, - 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x2, - 0xff, 0xe8, 0x31, 0x25, 0xaf, 0xfd, 0xff, 0x80, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xff, - 0x30, 0x1, 0x7c, 0xef, 0xec, 0x82, 0x0, 0x8, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0027 "'" */ - 0x5f, 0xd5, 0xfc, 0x4f, 0xc4, 0xfb, 0x4f, 0xb3, - 0xfa, 0x3f, 0xa0, 0x10, - - /* U+0028 "(" */ - 0x0, 0xb, 0xfb, 0x0, 0x3f, 0xf3, 0x0, 0xbf, - 0xb0, 0x1, 0xff, 0x50, 0x6, 0xff, 0x0, 0xb, - 0xfb, 0x0, 0xf, 0xf7, 0x0, 0x2f, 0xf4, 0x0, - 0x4f, 0xf2, 0x0, 0x6f, 0xf0, 0x0, 0x7f, 0xf0, - 0x0, 0x8f, 0xe0, 0x0, 0x8f, 0xe0, 0x0, 0x7f, - 0xf0, 0x0, 0x6f, 0xf0, 0x0, 0x4f, 0xf2, 0x0, - 0x2f, 0xf4, 0x0, 0xe, 0xf7, 0x0, 0xb, 0xfb, - 0x0, 0x6, 0xff, 0x0, 0x1, 0xff, 0x50, 0x0, - 0xbf, 0xb0, 0x0, 0x3f, 0xf3, 0x0, 0xb, 0xfb, - - /* U+0029 ")" */ - 0xe, 0xf7, 0x0, 0x0, 0x6f, 0xe1, 0x0, 0x0, - 0xef, 0x80, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x3f, - 0xf3, 0x0, 0x0, 0xef, 0x80, 0x0, 0xb, 0xfb, - 0x0, 0x0, 0x8f, 0xe0, 0x0, 0x5, 0xff, 0x10, - 0x0, 0x4f, 0xf2, 0x0, 0x3, 0xff, 0x30, 0x0, - 0x2f, 0xf4, 0x0, 0x2, 0xff, 0x40, 0x0, 0x3f, - 0xf3, 0x0, 0x4, 0xff, 0x20, 0x0, 0x5f, 0xf1, - 0x0, 0x8, 0xfe, 0x0, 0x0, 0xbf, 0xb0, 0x0, - 0xe, 0xf8, 0x0, 0x3, 0xff, 0x30, 0x0, 0x9f, - 0xd0, 0x0, 0xe, 0xf7, 0x0, 0x6, 0xfe, 0x0, - 0x0, 0xef, 0x70, 0x0, - - /* U+002A "*" */ - 0x0, 0x0, 0x9f, 0x0, 0x0, 0x1, 0x0, 0x9f, - 0x0, 0x0, 0x2f, 0x91, 0x8f, 0x6, 0xe8, 0x2b, - 0xff, 0xdf, 0xcf, 0xe5, 0x0, 0x4d, 0xff, 0xf7, - 0x0, 0x0, 0x8f, 0xff, 0xfb, 0x20, 0x3e, 0xfc, - 0xbf, 0x8f, 0xf8, 0x1d, 0x50, 0x8f, 0x2, 0xb6, - 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x7c, - 0x0, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x11, 0x11, - 0x9f, 0xa1, 0x11, 0x10, 0x0, 0x0, 0x8, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xa0, 0x0, 0x0, - - /* U+002C "," */ - 0x3, 0x20, 0x6f, 0xf5, 0xbf, 0xfa, 0x6f, 0xf8, - 0xc, 0xf2, 0xf, 0xd0, 0x4f, 0x80, 0x8f, 0x20, - - /* U+002D "-" */ - 0x12, 0x22, 0x22, 0x21, 0x8f, 0xff, 0xff, 0xf7, - 0x8f, 0xff, 0xff, 0xf7, - - /* U+002E "." */ - 0x7, 0x70, 0x9f, 0xf8, 0xbf, 0xf9, 0x4e, 0xd2, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x18, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0x60, 0x0, 0x0, 0x0, 0x3, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0x40, 0x0, 0x0, 0x0, - 0x4, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x1, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x6, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, 0x0, 0x0, - 0x2, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xb0, 0x0, 0x0, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x0, 0x4a, 0xef, 0xfc, 0x60, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0xbf, 0xfd, 0x85, 0x6b, 0xff, 0xe1, 0x0, - 0x5, 0xff, 0xa0, 0x0, 0x0, 0x5f, 0xfb, 0x0, - 0xe, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, - 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, - 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd0, - 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, - 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, - 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, - 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, - 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd0, - 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, - 0xe, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, - 0x6, 0xff, 0xa0, 0x0, 0x0, 0x5f, 0xfb, 0x0, - 0x0, 0xbf, 0xfd, 0x75, 0x6b, 0xff, 0xe1, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x4a, 0xef, 0xfc, 0x60, 0x0, 0x0, - - /* U+0031 "1" */ - 0xcf, 0xff, 0xff, 0xec, 0xff, 0xff, 0xfe, 0x34, - 0x44, 0xcf, 0xe0, 0x0, 0xb, 0xfe, 0x0, 0x0, - 0xbf, 0xe0, 0x0, 0xb, 0xfe, 0x0, 0x0, 0xbf, - 0xe0, 0x0, 0xb, 0xfe, 0x0, 0x0, 0xbf, 0xe0, - 0x0, 0xb, 0xfe, 0x0, 0x0, 0xbf, 0xe0, 0x0, - 0xb, 0xfe, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0xb, - 0xfe, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0xb, 0xfe, - 0x0, 0x0, 0xbf, 0xe0, 0x0, 0xb, 0xfe, - - /* U+0032 "2" */ - 0x0, 0x5, 0xad, 0xff, 0xea, 0x40, 0x0, 0x0, - 0x4d, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x5f, - 0xff, 0xb7, 0x56, 0x9f, 0xff, 0x90, 0x0, 0xbd, - 0x20, 0x0, 0x0, 0x1e, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xfd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0x64, 0x44, 0x44, 0x44, 0x40, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - - /* U+0033 "3" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0x44, - 0x44, 0x44, 0x4b, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xa4, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x6, 0x78, 0xbf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xf9, 0x2e, 0x60, 0x0, 0x0, 0x0, 0xaf, - 0xf4, 0xaf, 0xfe, 0xa6, 0x56, 0x8e, 0xff, 0xb0, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x28, 0xce, 0xff, 0xda, 0x40, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xe1, 0x0, 0xa, 0xc7, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x30, 0x0, 0xd, 0xfa, 0x0, - 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x0, 0xd, 0xfa, - 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0xd, - 0xfa, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x4, 0x44, 0x44, - 0x44, 0x44, 0x4e, 0xfb, 0x44, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, - 0x0, 0x0, - - /* U+0035 "5" */ - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x8f, 0xe4, 0x44, 0x44, 0x44, 0x40, 0x0, 0xa, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x94, - 0x43, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xfa, 0x30, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x13, - 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xd0, 0xd, 0xa2, 0x0, 0x0, 0x0, 0x7f, 0xf8, - 0x5, 0xff, 0xfb, 0x76, 0x67, 0xdf, 0xfe, 0x10, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, - 0x1, 0x6a, 0xdf, 0xfe, 0xb6, 0x0, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x6, 0xbe, 0xff, 0xda, 0x50, 0x0, - 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x7f, 0xff, 0xa6, 0x44, 0x6b, 0xa0, 0x0, 0x3f, - 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf1, 0x0, - 0x1, 0x10, 0x0, 0x0, 0xa, 0xfe, 0x3, 0xaf, - 0xff, 0xfb, 0x50, 0x0, 0xbf, 0xd6, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0xb, 0xff, 0xff, 0x72, 0x1, - 0x5d, 0xff, 0x80, 0xaf, 0xff, 0x30, 0x0, 0x0, - 0xc, 0xff, 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x5f, 0xf3, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x3, - 0xff, 0x41, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5f, - 0xf3, 0x9, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xfd, - 0x0, 0xd, 0xff, 0x94, 0x23, 0x6e, 0xff, 0x50, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x5, 0xae, 0xff, 0xd8, 0x20, 0x0, - - /* U+0037 "7" */ - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, - 0xf7, 0x44, 0x44, 0x44, 0x4b, 0xff, 0x33, 0xff, - 0x40, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x3f, 0xf4, - 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x1, 0x77, 0x20, - 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0x60, 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x4, 0x9d, 0xff, 0xec, 0x82, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xa, - 0xff, 0xc6, 0x32, 0x37, 0xef, 0xf5, 0x0, 0xff, - 0xb0, 0x0, 0x0, 0x1, 0xef, 0xc0, 0x2f, 0xf6, - 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x8, 0xff, 0xa3, - 0x10, 0x15, 0xcf, 0xf3, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0x1, 0x9f, 0xff, 0xff, - 0xff, 0xfe, 0x70, 0x0, 0xcf, 0xfa, 0x31, 0x2, - 0x5c, 0xff, 0x80, 0x6f, 0xf6, 0x0, 0x0, 0x0, - 0xa, 0xff, 0x2b, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xf7, 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x8b, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf7, 0x6f, 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x20, 0xdf, 0xfc, 0x53, 0x23, 0x7e, 0xff, 0x90, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x49, 0xde, 0xfe, 0xc8, 0x20, 0x0, - - /* U+0039 "9" */ - 0x0, 0x1, 0x8c, 0xef, 0xea, 0x50, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x4, - 0xff, 0xe7, 0x32, 0x49, 0xff, 0xd0, 0x0, 0xcf, - 0xd1, 0x0, 0x0, 0x3, 0xff, 0x90, 0x1f, 0xf6, - 0x0, 0x0, 0x0, 0x9, 0xff, 0x13, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x2f, 0xf6, 0x0, - 0x0, 0x0, 0x9, 0xff, 0x90, 0xef, 0xd1, 0x0, - 0x0, 0x3, 0xff, 0xfb, 0x6, 0xff, 0xe7, 0x32, - 0x39, 0xff, 0xff, 0xc0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0x6d, 0xfc, 0x0, 0x3, 0x9d, 0xff, 0xd9, - 0x20, 0xef, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf4, - 0x0, 0x9, 0xb6, 0x54, 0x5a, 0xff, 0xf8, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x5, 0xad, 0xff, 0xeb, 0x71, 0x0, 0x0, - - /* U+003A ":" */ - 0x3e, 0xd3, 0xbf, 0xfa, 0x9f, 0xf7, 0x7, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x9f, 0xf8, - 0xbf, 0xf9, 0x4e, 0xd2, - - /* U+003B ";" */ - 0x3e, 0xd3, 0xbf, 0xfa, 0x9f, 0xf7, 0x7, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x6f, 0xf5, - 0xbf, 0xfa, 0x6f, 0xf8, 0xc, 0xf2, 0xf, 0xd0, - 0x4f, 0x80, 0x8f, 0x20, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0x50, 0x0, - 0x0, 0x0, 0x5, 0xcf, 0xf6, 0x0, 0x0, 0x2, - 0x9e, 0xff, 0xf9, 0x20, 0x0, 0x6c, 0xff, 0xfc, - 0x60, 0x0, 0x19, 0xff, 0xfe, 0x82, 0x0, 0x0, - 0x4, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, - 0xfd, 0x71, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, - 0xfb, 0x40, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, - 0xe4, 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, - - /* U+003D "=" */ - 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, - - /* U+003E ">" */ - 0x39, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xd6, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, - 0xa3, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xfd, - 0x61, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xfa, - 0x20, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xf6, 0x0, - 0x0, 0x0, 0x3, 0x9e, 0xff, 0x60, 0x0, 0x1, - 0x6c, 0xff, 0xfb, 0x50, 0x0, 0x4a, 0xff, 0xfe, - 0x81, 0x0, 0x2, 0xdf, 0xff, 0xb4, 0x0, 0x0, - 0x0, 0x4f, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x2, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x6, 0xbd, 0xff, 0xea, 0x50, 0x0, 0x5, - 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x5f, 0xff, - 0x95, 0x34, 0x7e, 0xff, 0x90, 0x2c, 0xc1, 0x0, - 0x0, 0x1, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0x60, 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xdb, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, - 0xff, 0xfe, 0xcb, 0xce, 0xff, 0xfb, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x51, 0x0, 0x0, - 0x1, 0x5b, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, - 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, - 0xa0, 0x0, 0x0, 0x7f, 0xd1, 0x0, 0x17, 0xcf, - 0xfc, 0x70, 0x4f, 0xf1, 0xcf, 0x70, 0x0, 0x2f, - 0xf2, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xd6, 0xff, - 0x1, 0xef, 0x20, 0xa, 0xf6, 0x0, 0x1e, 0xfe, - 0x61, 0x3, 0x9f, 0xff, 0xf0, 0x4, 0xfa, 0x1, - 0xfe, 0x0, 0xa, 0xfe, 0x20, 0x0, 0x0, 0x7f, - 0xff, 0x0, 0xc, 0xf1, 0x6f, 0x80, 0x0, 0xff, - 0x60, 0x0, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x7f, - 0x59, 0xf5, 0x0, 0x4f, 0xf1, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x0, 0x4, 0xf8, 0xbf, 0x30, 0x5, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, 0x0, - 0x2f, 0x9b, 0xf2, 0x0, 0x5f, 0xe0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x0, 0x2, 0xf9, 0xbf, 0x30, - 0x4, 0xff, 0x10, 0x0, 0x0, 0x0, 0x6f, 0xf0, - 0x0, 0x3f, 0x89, 0xf5, 0x0, 0xf, 0xf6, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x0, 0x5, 0xf6, 0x6f, - 0x90, 0x0, 0x9f, 0xe2, 0x0, 0x0, 0x6, 0xff, - 0xf0, 0x0, 0xaf, 0x21, 0xfe, 0x0, 0x1, 0xef, - 0xe6, 0x10, 0x29, 0xfd, 0xff, 0x70, 0x6f, 0xc0, - 0xa, 0xf6, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfd, - 0x2b, 0xff, 0xff, 0xf2, 0x0, 0x2f, 0xf2, 0x0, - 0x0, 0x7c, 0xff, 0xc7, 0x0, 0x1a, 0xef, 0xb2, - 0x0, 0x0, 0x7f, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x61, 0x0, - 0x0, 0x2, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2b, 0xff, 0xfe, 0xcc, 0xce, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, - 0xdf, 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xf2, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x9, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x10, 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xa0, 0x0, 0xaf, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf2, 0x0, 0x3, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfb, - 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0x40, 0x0, 0x0, 0x4f, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xc0, 0x0, 0x0, 0x0, - 0xcf, 0x90, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0xef, 0x81, 0x11, 0x11, 0x11, 0x11, - 0x8f, 0xf0, 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, 0xd, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x0, - 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf5, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xd0, - - /* U+0042 "B" */ - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x60, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, - 0x0, 0x4f, 0xf6, 0x22, 0x22, 0x23, 0x5c, 0xff, - 0xd0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0xa, - 0xff, 0x30, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf6, 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x4, 0xff, 0x50, 0x4f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xf1, 0x4, 0xff, 0x62, 0x22, 0x22, - 0x35, 0xcf, 0xf7, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, 0xf5, 0x0, - 0x0, 0x0, 0x14, 0xbf, 0xf8, 0x4, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x4f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x44, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, 0x4f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x24, - 0xff, 0x62, 0x22, 0x22, 0x23, 0x6c, 0xff, 0xb0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, - 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa5, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x50, 0x0, 0x1c, 0xff, 0xfc, 0x76, 0x57, 0xcf, - 0xff, 0x60, 0xc, 0xff, 0xc2, 0x0, 0x0, 0x0, - 0x3d, 0xe2, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x1, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0xcf, 0xfc, 0x20, 0x0, 0x0, 0x3, 0xde, 0x30, - 0x1, 0xcf, 0xff, 0xc7, 0x65, 0x7c, 0xff, 0xf6, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd4, - 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xda, 0x50, - 0x0, - - /* U+0044 "D" */ - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x40, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd4, 0x0, 0x0, 0x4f, 0xf8, 0x44, 0x44, 0x46, - 0x9e, 0xff, 0xf7, 0x0, 0x4, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xf6, 0x0, 0x4f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x4, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0x90, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xfe, 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf1, 0x4f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0x34, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf3, 0x4f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x14, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xe0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xf9, 0x4, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0x10, 0x4f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x5e, 0xff, 0x60, 0x4, 0xff, - 0x84, 0x44, 0x44, 0x68, 0xef, 0xff, 0x70, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, - 0x0, 0x0, 0x0, - - /* U+0045 "E" */ - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, 0xf8, - 0x44, 0x44, 0x44, 0x44, 0x42, 0x4f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf7, 0x33, 0x33, 0x33, 0x33, 0x10, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf8, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - - /* U+0046 "F" */ - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, 0xf8, - 0x44, 0x44, 0x44, 0x44, 0x42, 0x4f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xf7, - 0x44, 0x44, 0x44, 0x44, 0x10, 0x4f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xb6, 0x10, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x70, 0x0, 0x1c, 0xff, 0xfc, 0x86, 0x57, 0xbf, - 0xff, 0x90, 0xc, 0xff, 0xc2, 0x0, 0x0, 0x0, - 0x1a, 0xf4, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x1, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x1b, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xfd, 0x9f, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd6, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, 0x1f, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x8f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, 0x0, - 0xcf, 0xfc, 0x20, 0x0, 0x0, 0x1, 0xcf, 0xd0, - 0x1, 0xcf, 0xff, 0xc8, 0x65, 0x7a, 0xff, 0xfc, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xeb, 0x71, - 0x0, - - /* U+0048 "H" */ - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf6, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xf6, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x64, 0xff, 0x84, 0x44, 0x44, - 0x44, 0x44, 0x6f, 0xf6, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x64, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0x64, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x4f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x64, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x4f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x64, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf6, - - /* U+0049 "I" */ - 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, - 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, - 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, - 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, - 0x4f, 0xf5, 0x4f, 0xf5, - - /* U+004A "J" */ - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x14, 0x44, 0x44, - 0x4d, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x10, - 0x0, 0x0, 0xf, 0xfa, 0x7, 0xe2, 0x0, 0x0, - 0x6f, 0xf6, 0xe, 0xff, 0x95, 0x59, 0xff, 0xf1, - 0x3, 0xef, 0xff, 0xff, 0xff, 0x40, 0x0, 0x17, - 0xcf, 0xfd, 0x92, 0x0, - - /* U+004B "K" */ - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfa, - 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f, 0xfb, - 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x4f, 0xfb, - 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x4f, 0xfc, - 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x4f, 0xfc, - 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, 0x3f, 0xfd, - 0x10, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x3f, 0xfd, - 0x10, 0x0, 0x0, 0x4, 0xff, 0x50, 0x3f, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x3f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x8e, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, - 0x3c, 0xff, 0x60, 0x0, 0x0, 0x4, 0xff, 0xfe, - 0x30, 0x1e, 0xff, 0x40, 0x0, 0x0, 0x4f, 0xff, - 0x30, 0x0, 0x2f, 0xfe, 0x20, 0x0, 0x4, 0xff, - 0x60, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, 0x4f, - 0xf5, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x4, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, - 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xf4, - - /* U+004C "L" */ - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf8, 0x44, 0x44, 0x44, 0x44, 0x40, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - - /* U+004D "M" */ - 0x4f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0x14, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xf1, 0x4f, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x14, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf1, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x14, 0xff, 0xaf, 0xf2, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xaf, 0xf1, 0x4f, - 0xf3, 0xdf, 0xc0, 0x0, 0x0, 0x0, 0xdf, 0x96, - 0xff, 0x14, 0xff, 0x34, 0xff, 0x50, 0x0, 0x0, - 0x8f, 0xe1, 0x6f, 0xf1, 0x4f, 0xf3, 0xa, 0xfe, - 0x0, 0x0, 0x2f, 0xf6, 0x6, 0xff, 0x14, 0xff, - 0x30, 0x1f, 0xf8, 0x0, 0xa, 0xfc, 0x0, 0x6f, - 0xf1, 0x4f, 0xf3, 0x0, 0x6f, 0xf2, 0x4, 0xff, - 0x30, 0x6, 0xff, 0x14, 0xff, 0x30, 0x0, 0xdf, - 0xc0, 0xdf, 0x90, 0x0, 0x6f, 0xf1, 0x4f, 0xf3, - 0x0, 0x3, 0xff, 0xbf, 0xe1, 0x0, 0x6, 0xff, - 0x14, 0xff, 0x30, 0x0, 0x9, 0xff, 0xf6, 0x0, - 0x0, 0x6f, 0xf1, 0x4f, 0xf3, 0x0, 0x0, 0x1e, - 0xfc, 0x0, 0x0, 0x6, 0xff, 0x14, 0xff, 0x30, - 0x0, 0x0, 0x6d, 0x30, 0x0, 0x0, 0x6f, 0xf1, - 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0x14, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xf1, - - /* U+004E "N" */ - 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0x64, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf6, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0x64, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x3f, 0xf6, 0x4f, 0xfe, 0xff, 0x80, 0x0, 0x0, - 0x3, 0xff, 0x64, 0xff, 0x6d, 0xff, 0x50, 0x0, - 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x2f, 0xff, 0x20, - 0x0, 0x3, 0xff, 0x64, 0xff, 0x50, 0x4f, 0xfe, - 0x10, 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x0, 0x7f, - 0xfc, 0x0, 0x3, 0xff, 0x64, 0xff, 0x50, 0x0, - 0xaf, 0xf9, 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x0, - 0x0, 0xdf, 0xf6, 0x3, 0xff, 0x64, 0xff, 0x50, - 0x0, 0x1, 0xef, 0xf3, 0x3f, 0xf6, 0x4f, 0xf5, - 0x0, 0x0, 0x3, 0xff, 0xe5, 0xff, 0x64, 0xff, - 0x50, 0x0, 0x0, 0x6, 0xff, 0xef, 0xf6, 0x4f, - 0xf5, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x64, - 0xff, 0x50, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf6, - - /* U+004F "O" */ - 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfc, - 0x76, 0x68, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0xbf, - 0xfc, 0x20, 0x0, 0x0, 0x3, 0xdf, 0xf9, 0x0, - 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x60, 0x1f, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xe0, 0x6f, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x9f, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, - 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xf8, 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xf9, 0x9f, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x6f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, - 0x1f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xe0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x60, 0x0, 0xcf, 0xfc, 0x20, - 0x0, 0x0, 0x3, 0xdf, 0xfa, 0x0, 0x0, 0x1c, - 0xff, 0xfb, 0x76, 0x68, 0xcf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, - 0xb6, 0x0, 0x0, 0x0, - - /* U+0050 "P" */ - 0x4f, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x4f, 0xf8, 0x44, 0x44, 0x57, 0xbf, 0xff, 0x30, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, - 0x4f, 0xf5, 0x0, 0x0, 0x2, 0x7e, 0xff, 0x60, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, - 0x4f, 0xf8, 0x44, 0x44, 0x32, 0x0, 0x0, 0x0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xfc, 0x76, 0x68, 0xcf, 0xff, 0xa0, 0x0, 0x0, - 0xb, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x3d, 0xff, - 0x90, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x50, 0x1, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, 0x6f, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xf3, 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x70, 0xbf, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf8, 0xb, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0x80, 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xf6, 0x6, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, 0x1f, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xd0, - 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xf6, 0x0, 0x0, 0xdf, 0xfb, 0x10, 0x0, - 0x0, 0x2, 0xcf, 0xfb, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0xa6, 0x45, 0x6b, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xdf, 0xff, - 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xe2, 0x0, 0x0, 0x38, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x22, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7c, 0xfe, 0xb5, 0x0, - - /* U+0052 "R" */ - 0x4f, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x4f, 0xf8, 0x44, 0x44, 0x57, 0xbf, 0xff, 0x30, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, - 0x4f, 0xf5, 0x0, 0x0, 0x2, 0x7e, 0xff, 0x60, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, - 0x4f, 0xf7, 0x33, 0x33, 0x3c, 0xfe, 0x10, 0x0, - 0x4f, 0xf5, 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x10, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf6, - - /* U+0053 "S" */ - 0x0, 0x3, 0x9d, 0xef, 0xec, 0x94, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0xa, - 0xff, 0xc7, 0x43, 0x47, 0xbf, 0xe0, 0x3, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x25, 0x0, 0x6f, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x94, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xc8, 0x30, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, - 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7c, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xf0, 0x5d, 0x40, 0x0, 0x0, 0x0, 0x1e, 0xfc, - 0xc, 0xff, 0xd9, 0x54, 0x35, 0x8e, 0xff, 0x40, - 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x2, 0x7b, 0xef, 0xfe, 0xb7, 0x10, 0x0, - - /* U+0054 "T" */ - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x44, 0x44, 0x44, 0xcf, 0xf4, 0x44, 0x44, 0x40, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - - /* U+0055 "U" */ - 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfd, - 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfb, - 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, - 0x7, 0xff, 0xb0, 0x0, 0x0, 0x3, 0xff, 0xe0, - 0x0, 0xcf, 0xfe, 0x96, 0x57, 0xbf, 0xff, 0x50, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x39, 0xdf, 0xfe, 0xc7, 0x10, 0x0, - - /* U+0056 "V" */ - 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf4, 0x5, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xd0, 0x0, 0xef, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, 0x0, 0x7f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, - 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xf8, 0x0, 0x0, 0x9, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x2, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0xef, 0xa0, 0x0, 0x0, 0x0, - 0xbf, 0xf1, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, 0xd, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, - 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0x60, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xd0, 0x3, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf5, 0xa, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x1f, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xbf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, - 0x0, 0x0, 0x0, 0x0, - - /* U+0057 "W" */ - 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x3, 0xff, 0x40, 0xaf, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xe0, 0x5, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0xe, 0xf9, 0x0, 0xf, 0xfb, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x3, - 0xff, 0x40, 0x0, 0xaf, 0xf0, 0x0, 0x0, 0x0, - 0xff, 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x9f, 0xe0, - 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x6f, 0xf0, - 0xbf, 0xc0, 0x0, 0x0, 0xe, 0xf9, 0x0, 0x0, - 0xf, 0xfb, 0x0, 0x0, 0xb, 0xfa, 0x5, 0xff, - 0x20, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, 0xaf, - 0xf0, 0x0, 0x1, 0xff, 0x50, 0xf, 0xf7, 0x0, - 0x0, 0x9f, 0xe0, 0x0, 0x0, 0x4, 0xff, 0x50, - 0x0, 0x6f, 0xf0, 0x0, 0xaf, 0xd0, 0x0, 0xe, - 0xf9, 0x0, 0x0, 0x0, 0xe, 0xfb, 0x0, 0xc, - 0xfa, 0x0, 0x5, 0xff, 0x20, 0x4, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x2, 0xff, 0x40, - 0x0, 0xf, 0xf8, 0x0, 0x9f, 0xe0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x50, 0x7f, 0xe0, 0x0, 0x0, - 0x9f, 0xd0, 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xfb, 0xd, 0xf9, 0x0, 0x0, 0x4, 0xff, - 0x34, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xf4, 0xff, 0x40, 0x0, 0x0, 0xe, 0xf8, 0xaf, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xdf, - 0xe0, 0x0, 0x0, 0x0, 0x9f, 0xef, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf8, 0x0, 0x0, 0x0, - - /* U+0058 "X" */ - 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x50, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x3f, - 0xf9, 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, 0x1, - 0xef, 0xc0, 0x0, 0x0, 0xa, 0xff, 0x40, 0x0, - 0xb, 0xff, 0x20, 0x0, 0x0, 0x1, 0xef, 0xe1, - 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xfc, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x8d, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xdf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x19, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf4, - 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x5, 0xff, - 0x90, 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, 0x2f, - 0xfd, 0x0, 0x0, 0x6, 0xff, 0x90, 0x0, 0x0, - 0xcf, 0xf2, 0x0, 0x0, 0x0, 0xaf, 0xf4, 0x0, - 0x8, 0xff, 0x60, 0x0, 0x0, 0x0, 0xd, 0xfe, - 0x10, 0x4f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xc0, - - /* U+0059 "Y" */ - 0xc, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xf9, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xe1, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x60, 0x0, 0xe, 0xfc, 0x0, 0x0, - 0x0, 0xc, 0xfc, 0x0, 0x0, 0x5, 0xff, 0x60, - 0x0, 0x0, 0x6f, 0xf2, 0x0, 0x0, 0x0, 0xbf, - 0xf1, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x2f, 0xfa, 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0x40, 0x4f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xd1, 0xdf, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, - 0x0, 0x0, - - /* U+005A "Z" */ - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x34, 0x44, 0x44, 0x44, 0x44, 0x4c, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xfe, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - - /* U+005B "[" */ - 0x4f, 0xff, 0xff, 0x24, 0xff, 0xff, 0xf2, 0x4f, - 0xf4, 0x11, 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, - 0x0, 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, 0x0, - 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, 0x0, 0x4, - 0xff, 0x30, 0x0, 0x4f, 0xf3, 0x0, 0x4, 0xff, - 0x30, 0x0, 0x4f, 0xf3, 0x0, 0x4, 0xff, 0x30, - 0x0, 0x4f, 0xf3, 0x0, 0x4, 0xff, 0x30, 0x0, - 0x4f, 0xf3, 0x0, 0x4, 0xff, 0x30, 0x0, 0x4f, - 0xf3, 0x0, 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, - 0x0, 0x4, 0xff, 0x41, 0x10, 0x4f, 0xff, 0xff, - 0x24, 0xff, 0xff, 0xf2, - - /* U+005C "\\" */ - 0x78, 0x20, 0x0, 0x0, 0x0, 0xa, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0x50, 0x0, 0x0, 0x0, 0x9, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0x60, 0x0, 0x0, 0x0, 0x8, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0x0, - 0x7, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, 0x0, - 0x0, 0x6, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, - 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x90, - 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xa0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xa0, - - /* U+005D "]" */ - 0x8f, 0xff, 0xfe, 0x8f, 0xff, 0xfe, 0x1, 0x19, - 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, - 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, - 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, - 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, - 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, - 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, - 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x1, - 0x19, 0xfe, 0x8f, 0xff, 0xfe, 0x8f, 0xff, 0xfe, - - /* U+005E "^" */ - 0x0, 0x0, 0xa, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xaf, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xf0, 0xdf, - 0x10, 0x0, 0x0, 0x5, 0xf9, 0x6, 0xf7, 0x0, - 0x0, 0x0, 0xcf, 0x30, 0x1f, 0xe0, 0x0, 0x0, - 0x2f, 0xc0, 0x0, 0x9f, 0x50, 0x0, 0x9, 0xf6, - 0x0, 0x3, 0xfb, 0x0, 0x0, 0xfe, 0x0, 0x0, - 0xc, 0xf2, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x6f, - 0x90, 0xd, 0xf2, 0x0, 0x0, 0x0, 0xff, 0x0, - - /* U+005F "_" */ - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, - - /* U+0060 "`" */ - 0x58, 0x83, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, - 0x7f, 0xf4, 0x0, 0x0, 0x4e, 0xf4, - - /* U+0061 "a" */ - 0x0, 0x39, 0xdf, 0xfe, 0xb6, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0xe, 0xfa, 0x63, - 0x36, 0xdf, 0xf8, 0x0, 0x42, 0x0, 0x0, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf4, 0x0, - 0x6b, 0xef, 0xff, 0xff, 0xff, 0x40, 0xbf, 0xff, - 0xdd, 0xdd, 0xdf, 0xf4, 0x6f, 0xf7, 0x0, 0x0, - 0x3, 0xff, 0x4a, 0xfd, 0x0, 0x0, 0x0, 0x3f, - 0xf4, 0xaf, 0xe0, 0x0, 0x0, 0xa, 0xff, 0x45, - 0xff, 0x80, 0x0, 0x1a, 0xff, 0xf4, 0xa, 0xff, - 0xfd, 0xdf, 0xfa, 0xff, 0x40, 0x6, 0xcf, 0xfe, - 0xb5, 0x1f, 0xf4, - - /* U+0062 "b" */ - 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, 0x2, - 0x9e, 0xfe, 0xc6, 0x0, 0x0, 0xaf, 0xd6, 0xff, - 0xff, 0xff, 0xfd, 0x30, 0xa, 0xff, 0xff, 0xa5, - 0x35, 0xaf, 0xff, 0x20, 0xaf, 0xff, 0x40, 0x0, - 0x0, 0x5f, 0xfc, 0xa, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x8f, 0xf3, 0xaf, 0xf1, 0x0, 0x0, 0x0, - 0x1, 0xff, 0x7a, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xf9, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x9a, 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, - 0xf7, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x3a, 0xff, 0xf4, 0x0, 0x0, 0x5, 0xff, 0xc0, - 0xaf, 0xff, 0xfa, 0x53, 0x5a, 0xff, 0xf2, 0xa, - 0xfc, 0x6f, 0xff, 0xff, 0xff, 0xd3, 0x0, 0xaf, - 0xc0, 0x39, 0xef, 0xec, 0x60, 0x0, 0x0, - - /* U+0063 "c" */ - 0x0, 0x1, 0x7c, 0xef, 0xea, 0x50, 0x0, 0x4, - 0xef, 0xff, 0xff, 0xff, 0xb0, 0x4, 0xff, 0xf9, - 0x43, 0x5b, 0xff, 0xa1, 0xef, 0xe2, 0x0, 0x0, - 0x7, 0xd3, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xfe, 0x20, 0x0, 0x0, 0x7d, 0x40, - 0x4f, 0xff, 0x94, 0x35, 0xbf, 0xfa, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x17, 0xce, - 0xfe, 0xa4, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, 0x18, - 0xde, 0xfd, 0x81, 0x2f, 0xf5, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xe5, 0xff, 0x50, 0x5f, 0xff, 0x84, - 0x36, 0xcf, 0xff, 0xf5, 0x1f, 0xfe, 0x20, 0x0, - 0x0, 0x8f, 0xff, 0x57, 0xff, 0x40, 0x0, 0x0, - 0x0, 0xcf, 0xf5, 0xbf, 0xd0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0x5d, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xf5, 0xdf, 0xa0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0x5b, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xf5, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0xa, 0xff, - 0x51, 0xff, 0xd1, 0x0, 0x0, 0x6, 0xff, 0xf5, - 0x5, 0xff, 0xe6, 0x21, 0x3a, 0xff, 0xff, 0x50, - 0x6, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xf5, 0x0, - 0x2, 0x8d, 0xff, 0xd8, 0x10, 0xff, 0x50, - - /* U+0065 "e" */ - 0x0, 0x2, 0x8d, 0xff, 0xd8, 0x10, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, - 0xd5, 0x22, 0x5d, 0xff, 0x40, 0x1f, 0xfb, 0x0, - 0x0, 0x0, 0xbf, 0xe0, 0x7f, 0xf1, 0x0, 0x0, - 0x0, 0x1f, 0xf5, 0xbf, 0xb0, 0x0, 0x0, 0x0, - 0xa, 0xfa, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0xdf, 0xed, 0xdd, 0xdd, 0xdd, 0xdd, 0xda, - 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfd, - 0x20, 0x0, 0x0, 0x19, 0x0, 0x4, 0xff, 0xf9, - 0x43, 0x48, 0xef, 0xa0, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x1, 0x6c, 0xef, 0xeb, - 0x60, 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x5c, 0xff, 0xd7, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xc0, 0x0, 0xf, 0xfc, 0x31, 0x43, - 0x0, 0x3, 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, - 0xf2, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x9f, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x14, - 0xff, 0x41, 0x11, 0x0, 0x0, 0x4f, 0xf3, 0x0, - 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, - 0x4, 0xff, 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, - 0x0, - - /* U+0067 "g" */ - 0x0, 0x2, 0x8d, 0xef, 0xd9, 0x20, 0xdf, 0x80, - 0x7, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xf8, 0x7, - 0xff, 0xe8, 0x43, 0x49, 0xff, 0xff, 0x82, 0xff, - 0xc1, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x8f, 0xf2, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x8c, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xf8, 0xef, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0x8c, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xf8, 0x9f, 0xf1, 0x0, 0x0, - 0x0, 0x5, 0xff, 0x83, 0xff, 0xb0, 0x0, 0x0, - 0x2, 0xef, 0xf8, 0x9, 0xff, 0xd5, 0x10, 0x27, - 0xef, 0xff, 0x80, 0xa, 0xff, 0xff, 0xff, 0xff, - 0x9f, 0xf8, 0x0, 0x5, 0xbf, 0xff, 0xfc, 0x40, - 0xff, 0x80, 0x0, 0x0, 0x2, 0x20, 0x0, 0x1f, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0x30, 0x4a, 0x10, 0x0, 0x0, 0x1, 0xef, 0xe0, - 0xe, 0xff, 0xa6, 0x43, 0x48, 0xef, 0xf5, 0x0, - 0x6e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x5, 0xad, 0xff, 0xec, 0x82, 0x0, 0x0, - - /* U+0068 "h" */ - 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x3a, 0xef, 0xfc, - 0x60, 0x0, 0xaf, 0xd8, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0xaf, 0xff, 0xf8, 0x54, 0x6d, 0xff, 0x90, - 0xaf, 0xfe, 0x20, 0x0, 0x0, 0xdf, 0xf1, 0xaf, - 0xf5, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0xaf, 0xf0, - 0x0, 0x0, 0x0, 0x2f, 0xf6, 0xaf, 0xe0, 0x0, - 0x0, 0x0, 0xf, 0xf6, 0xaf, 0xd0, 0x0, 0x0, - 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, - 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, - 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, - 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, - 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, - 0x0, 0x0, 0x0, 0xf, 0xf7, - - /* U+0069 "i" */ - 0x8, 0xfb, 0x0, 0xff, 0xf3, 0xc, 0xfe, 0x10, - 0x3, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0xa, - 0xfd, 0x0, 0xaf, 0xd0, 0xa, 0xfd, 0x0, 0xaf, - 0xd0, 0xa, 0xfd, 0x0, 0xaf, 0xd0, 0xa, 0xfd, - 0x0, 0xaf, 0xd0, 0xa, 0xfd, 0x0, 0xaf, 0xd0, - 0xa, 0xfd, 0x0, 0xaf, 0xd0, 0xa, 0xfd, 0x0, - - /* U+006A "j" */ - 0x0, 0x0, 0x6, 0xfc, 0x10, 0x0, 0x0, 0xef, - 0xf6, 0x0, 0x0, 0xa, 0xff, 0x20, 0x0, 0x0, - 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x8, 0xff, 0x0, - 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x8, - 0xff, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, - 0x8, 0xff, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, - 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x8f, 0xf0, - 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x8f, - 0xf0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, - 0x8f, 0xf0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x74, - 0x26, 0xff, 0x90, 0x2f, 0xff, 0xff, 0xe1, 0x1, - 0xad, 0xfe, 0xa2, 0x0, - - /* U+006B "k" */ - 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, 0x3, - 0xef, 0xd1, 0xaf, 0xd0, 0x0, 0x0, 0x4f, 0xfc, - 0x10, 0xaf, 0xd0, 0x0, 0x5, 0xff, 0xc1, 0x0, - 0xaf, 0xd0, 0x0, 0x6f, 0xfc, 0x10, 0x0, 0xaf, - 0xd0, 0x7, 0xff, 0xc1, 0x0, 0x0, 0xaf, 0xd0, - 0x8f, 0xfd, 0x10, 0x0, 0x0, 0xaf, 0xd9, 0xff, - 0xff, 0x20, 0x0, 0x0, 0xaf, 0xff, 0xfc, 0xff, - 0xd1, 0x0, 0x0, 0xaf, 0xff, 0xa0, 0x7f, 0xfb, - 0x0, 0x0, 0xaf, 0xf9, 0x0, 0xa, 0xff, 0x70, - 0x0, 0xaf, 0xd0, 0x0, 0x0, 0xdf, 0xf4, 0x0, - 0xaf, 0xd0, 0x0, 0x0, 0x2f, 0xfe, 0x10, 0xaf, - 0xd0, 0x0, 0x0, 0x4, 0xff, 0xc0, 0xaf, 0xd0, - 0x0, 0x0, 0x0, 0x8f, 0xf9, - - /* U+006C "l" */ - 0xaf, 0xda, 0xfd, 0xaf, 0xda, 0xfd, 0xaf, 0xda, - 0xfd, 0xaf, 0xda, 0xfd, 0xaf, 0xda, 0xfd, 0xaf, - 0xda, 0xfd, 0xaf, 0xda, 0xfd, 0xaf, 0xda, 0xfd, - 0xaf, 0xda, 0xfd, 0xaf, 0xd0, - - /* U+006D "m" */ - 0xaf, 0xc0, 0x5b, 0xef, 0xea, 0x40, 0x0, 0x5a, - 0xef, 0xeb, 0x50, 0x0, 0xaf, 0xca, 0xff, 0xff, - 0xff, 0xf8, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0xaf, 0xff, 0xd6, 0x22, 0x6e, 0xff, 0xdf, 0xe7, - 0x32, 0x5d, 0xff, 0x60, 0xaf, 0xfd, 0x0, 0x0, - 0x2, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xef, 0xd0, - 0xaf, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, - 0x0, 0x0, 0x7f, 0xf1, 0xaf, 0xf0, 0x0, 0x0, - 0x0, 0x7f, 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xf3, - 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xf1, 0x0, - 0x0, 0x0, 0x4f, 0xf3, 0xaf, 0xd0, 0x0, 0x0, - 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, - 0x0, 0x0, 0x4f, 0xf4, 0xaf, 0xd0, 0x0, 0x0, - 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, - 0x0, 0x0, 0x4f, 0xf4, 0xaf, 0xd0, 0x0, 0x0, - 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, - 0x0, 0x0, 0x4f, 0xf4, 0xaf, 0xd0, 0x0, 0x0, - 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - - /* U+006E "n" */ - 0xaf, 0xc0, 0x4a, 0xef, 0xfc, 0x60, 0x0, 0xaf, - 0xc9, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xff, - 0xe6, 0x32, 0x4c, 0xff, 0x90, 0xaf, 0xfd, 0x10, - 0x0, 0x0, 0xcf, 0xf1, 0xaf, 0xf4, 0x0, 0x0, - 0x0, 0x4f, 0xf4, 0xaf, 0xf0, 0x0, 0x0, 0x0, - 0x1f, 0xf6, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0xf, - 0xf6, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, - 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, - 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, - 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, - 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, - 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, - 0xf, 0xf7, - - /* U+006F "o" */ - 0x0, 0x1, 0x7c, 0xef, 0xda, 0x40, 0x0, 0x0, - 0x5, 0xef, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x4, - 0xff, 0xf8, 0x43, 0x5c, 0xff, 0xc0, 0x1, 0xff, - 0xe2, 0x0, 0x0, 0x8, 0xff, 0x80, 0x7f, 0xf4, - 0x0, 0x0, 0x0, 0xb, 0xfe, 0xb, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xf3, 0xdf, 0xa0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0x5d, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xf5, 0xbf, 0xd0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0x37, 0xff, 0x40, 0x0, 0x0, - 0x0, 0xbf, 0xe0, 0x1e, 0xfe, 0x20, 0x0, 0x0, - 0x8f, 0xf8, 0x0, 0x4f, 0xff, 0x84, 0x36, 0xcf, - 0xfc, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfa, - 0x10, 0x0, 0x0, 0x17, 0xce, 0xfd, 0xa4, 0x0, - 0x0, - - /* U+0070 "p" */ - 0xaf, 0xc0, 0x3a, 0xef, 0xec, 0x60, 0x0, 0xa, - 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xd3, 0x0, 0xaf, - 0xff, 0xf8, 0x31, 0x38, 0xff, 0xf2, 0xa, 0xff, - 0xf3, 0x0, 0x0, 0x3, 0xff, 0xc0, 0xaf, 0xf6, - 0x0, 0x0, 0x0, 0x7, 0xff, 0x3a, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xf7, 0xaf, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0x9a, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xf9, 0xaf, 0xf1, 0x0, 0x0, - 0x0, 0x2, 0xff, 0x7a, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x8f, 0xf3, 0xaf, 0xff, 0x40, 0x0, 0x0, - 0x5f, 0xfc, 0xa, 0xff, 0xff, 0xa5, 0x35, 0xaf, - 0xff, 0x20, 0xaf, 0xd6, 0xff, 0xff, 0xff, 0xfd, - 0x30, 0xa, 0xfd, 0x2, 0x9d, 0xfe, 0xc6, 0x0, - 0x0, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x1, 0x8d, 0xef, 0xd8, 0x10, 0xff, 0x50, - 0x6, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xf5, 0x5, - 0xff, 0xf8, 0x43, 0x6c, 0xff, 0xff, 0x51, 0xff, - 0xe2, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x7f, 0xf4, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x5b, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xf5, 0xdf, 0xa0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0x5d, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xf5, 0xbf, 0xd0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0x57, 0xff, 0x40, 0x0, 0x0, - 0x0, 0xbf, 0xf5, 0x1f, 0xfe, 0x20, 0x0, 0x0, - 0x8f, 0xff, 0x50, 0x5f, 0xff, 0x84, 0x36, 0xcf, - 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xe5, - 0xff, 0x50, 0x0, 0x28, 0xdf, 0xfd, 0x81, 0x2f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, - - /* U+0072 "r" */ - 0xaf, 0xc0, 0x3a, 0xec, 0xaf, 0xc7, 0xff, 0xfc, - 0xaf, 0xef, 0xfb, 0x75, 0xaf, 0xff, 0x30, 0x0, - 0xaf, 0xf6, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, - 0xaf, 0xe0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, - 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, - 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, - 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x5, 0xbe, 0xff, 0xda, 0x50, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x8, 0xff, 0xa4, - 0x23, 0x59, 0xf2, 0x0, 0xdf, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xfd, 0xa6, 0x0, 0x0, 0x0, 0x6b, - 0xef, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x14, - 0x9f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xf3, 0x4, 0x20, 0x0, 0x0, 0x5, 0xff, 0x30, - 0xef, 0xb6, 0x33, 0x47, 0xff, 0xd0, 0x2d, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x5, 0xad, 0xff, - 0xec, 0x71, 0x0, - - /* U+0074 "t" */ - 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0x20, 0x9f, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x14, 0xff, 0x41, 0x11, - 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, - 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0xe, 0xfe, - 0x52, 0x55, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x5c, 0xff, 0xc6, 0x0, - - /* U+0075 "u" */ - 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0xcf, - 0xb0, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0xcf, 0xb0, - 0x0, 0x0, 0x0, 0x4f, 0xf3, 0xcf, 0xb0, 0x0, - 0x0, 0x0, 0x4f, 0xf3, 0xcf, 0xb0, 0x0, 0x0, - 0x0, 0x4f, 0xf3, 0xcf, 0xb0, 0x0, 0x0, 0x0, - 0x4f, 0xf3, 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x4f, - 0xf3, 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x4f, 0xf3, - 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xf3, 0x9f, - 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x5f, 0xf7, - 0x0, 0x0, 0x5, 0xff, 0xf3, 0xe, 0xff, 0x83, - 0x13, 0x8f, 0xff, 0xf3, 0x3, 0xef, 0xff, 0xff, - 0xff, 0x7f, 0xf3, 0x0, 0x18, 0xdf, 0xfd, 0x91, - 0x2f, 0xf3, - - /* U+0076 "v" */ - 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, - 0x6, 0xff, 0x20, 0x0, 0x0, 0x0, 0x8f, 0xe0, - 0x0, 0xef, 0x90, 0x0, 0x0, 0x0, 0xef, 0x70, - 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x6, 0xff, 0x10, - 0x0, 0x1f, 0xf7, 0x0, 0x0, 0xd, 0xf9, 0x0, - 0x0, 0xa, 0xfd, 0x0, 0x0, 0x4f, 0xf3, 0x0, - 0x0, 0x3, 0xff, 0x40, 0x0, 0xbf, 0xc0, 0x0, - 0x0, 0x0, 0xdf, 0xb0, 0x2, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x6f, 0xf2, 0x8, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xf8, 0xe, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xfe, 0x7f, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, - - /* U+0077 "w" */ - 0xaf, 0xb0, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, - 0x0, 0x0, 0x3f, 0xf1, 0x4f, 0xf1, 0x0, 0x0, - 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0xa0, - 0xe, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0xef, 0x40, 0x9, 0xfc, 0x0, 0x0, - 0x9, 0xfd, 0xff, 0x10, 0x0, 0x4, 0xfe, 0x0, - 0x3, 0xff, 0x20, 0x0, 0xf, 0xf4, 0xdf, 0x60, - 0x0, 0xa, 0xf8, 0x0, 0x0, 0xdf, 0x70, 0x0, - 0x5f, 0xe0, 0x8f, 0xc0, 0x0, 0x1f, 0xf3, 0x0, - 0x0, 0x7f, 0xd0, 0x0, 0xbf, 0x80, 0x2f, 0xf2, - 0x0, 0x6f, 0xd0, 0x0, 0x0, 0x1f, 0xf3, 0x1, - 0xff, 0x20, 0xc, 0xf8, 0x0, 0xcf, 0x70, 0x0, - 0x0, 0xb, 0xf9, 0x7, 0xfc, 0x0, 0x6, 0xfe, - 0x2, 0xff, 0x10, 0x0, 0x0, 0x5, 0xfe, 0xd, - 0xf6, 0x0, 0x0, 0xff, 0x48, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x8f, 0xf0, 0x0, 0x0, 0xaf, - 0x9d, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0x90, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x0, 0xe, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfd, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, 0x0, 0x0, - - /* U+0078 "x" */ - 0x1e, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x4, - 0xff, 0x80, 0x0, 0x2, 0xff, 0x80, 0x0, 0x7f, - 0xf4, 0x0, 0xd, 0xfc, 0x0, 0x0, 0xb, 0xfe, - 0x10, 0xaf, 0xe1, 0x0, 0x0, 0x1, 0xef, 0xc6, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xfe, 0xfc, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x83, 0xff, 0x80, 0x0, 0x0, 0x1e, - 0xfc, 0x0, 0x7f, 0xf4, 0x0, 0x0, 0xbf, 0xe1, - 0x0, 0xb, 0xfe, 0x20, 0x8, 0xff, 0x40, 0x0, - 0x1, 0xef, 0xc0, 0x4f, 0xf8, 0x0, 0x0, 0x0, - 0x3f, 0xf9, - - /* U+0079 "y" */ - 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, - 0x6, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xe0, - 0x0, 0xef, 0xa0, 0x0, 0x0, 0x0, 0xef, 0x70, - 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x6, 0xff, 0x10, - 0x0, 0x1f, 0xf8, 0x0, 0x0, 0xd, 0xf9, 0x0, - 0x0, 0x9, 0xfe, 0x0, 0x0, 0x4f, 0xf2, 0x0, - 0x0, 0x2, 0xff, 0x60, 0x0, 0xbf, 0xb0, 0x0, - 0x0, 0x0, 0xbf, 0xd0, 0x2, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x4f, 0xf4, 0x8, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xfb, 0xf, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0x8f, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xb0, 0x0, 0x0, 0x0, - 0xd, 0x73, 0x3a, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xcf, 0xeb, 0x40, 0x0, 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x1, 0x11, 0x11, 0x14, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1e, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x5f, 0xf8, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0xd, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xaf, - 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x4f, 0xfa, 0x11, 0x11, 0x11, 0x10, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, - - /* U+007B "{" */ - 0x0, 0x1, 0x9d, 0xfa, 0x0, 0xc, 0xff, 0xfa, - 0x0, 0x3f, 0xfa, 0x20, 0x0, 0x6f, 0xf2, 0x0, - 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, - 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, - 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf0, 0x0, - 0x1, 0xbf, 0xf0, 0x0, 0x8f, 0xff, 0x60, 0x0, - 0x8f, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xf0, 0x0, - 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x7f, 0xf1, 0x0, - 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, - 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, - 0x0, 0x6f, 0xf2, 0x0, 0x0, 0x3f, 0xfa, 0x20, - 0x0, 0xc, 0xff, 0xfa, 0x0, 0x1, 0x9d, 0xfa, - - /* U+007C "|" */ - 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, - 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, - 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, - 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, - 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, - 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, - - /* U+007D "}" */ - 0x8f, 0xea, 0x10, 0x0, 0x8f, 0xff, 0xe0, 0x0, - 0x1, 0x9f, 0xf6, 0x0, 0x0, 0xf, 0xf8, 0x0, - 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, - 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, - 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, - 0x0, 0xc, 0xfd, 0x20, 0x0, 0x4, 0xef, 0xfa, - 0x0, 0x5, 0xff, 0xfa, 0x0, 0xd, 0xfc, 0x0, - 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, - 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, - 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, - 0x0, 0xf, 0xf8, 0x0, 0x1, 0x9f, 0xf6, 0x0, - 0x8f, 0xff, 0xe0, 0x0, 0x8f, 0xea, 0x10, 0x0, - - /* U+007E "~" */ - 0x1, 0xaf, 0xfa, 0x20, 0x0, 0x1f, 0x80, 0xcf, - 0xff, 0xff, 0x60, 0x8, 0xf6, 0x3f, 0xb1, 0x17, - 0xff, 0xed, 0xfe, 0x6, 0xf3, 0x0, 0x2, 0xae, - 0xfb, 0x20, - - /* U+00B0 "°" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xe8, - 0x0, 0xd, 0xe7, 0x58, 0xfb, 0x7, 0xf2, 0x0, - 0x4, 0xf5, 0xcb, 0x0, 0x0, 0xe, 0xac, 0xb0, - 0x0, 0x0, 0xda, 0x8f, 0x10, 0x0, 0x3f, 0x71, - 0xed, 0x52, 0x5e, 0xd0, 0x2, 0xdf, 0xff, 0xc2, - 0x0, 0x0, 0x24, 0x20, 0x0, - - /* U+2022 "•" */ - 0x2, 0xab, 0x40, 0xe, 0xff, 0xf2, 0x3f, 0xff, - 0xf5, 0x1f, 0xff, 0xf3, 0x5, 0xee, 0x70, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x9c, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x48, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x5a, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x3, - 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x6f, - 0xff, 0x20, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc7, 0x30, 0x1, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0xa5, 0x10, - 0x0, 0x0, 0x1f, 0xff, 0x20, 0x0, 0x0, 0x5, - 0xff, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x20, - 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x20, 0x0, 0x0, 0x5, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x20, 0x0, 0x0, - 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x58, - 0x98, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0xfe, - 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x2, - 0x44, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x5d, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x5f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x4, - 0xac, 0xdb, 0x81, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x9f, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F008 "" */ - 0x34, 0x0, 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x81, 0x0, 0x43, 0xea, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0xae, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, - 0xcc, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xfd, 0xcc, 0xff, 0xfa, 0x0, 0x2f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf2, 0x0, - 0xaf, 0xfa, 0x0, 0x2f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xf2, 0x0, 0xaf, 0xfb, 0x0, - 0x3f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xf3, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xfe, 0xaa, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xfc, 0xaa, 0xef, 0xfa, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0xaf, 0xfa, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xaf, 0xfc, - 0x22, 0x5f, 0xfb, 0x77, 0x77, 0x77, 0x77, 0x77, - 0xbf, 0xf5, 0x22, 0xcf, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xfe, 0x88, 0xaf, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xfa, 0x88, 0xef, 0xfa, 0x0, - 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xf2, 0x0, 0xaf, 0xfa, 0x0, 0x2f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf2, 0x0, 0xaf, - 0xfc, 0x44, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xf6, 0x44, 0xcf, 0xff, 0xff, 0xff, - 0xfb, 0x77, 0x77, 0x77, 0x77, 0x77, 0xbf, 0xff, - 0xff, 0xff, 0xfd, 0x66, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x66, 0xdf, 0xa9, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x9a, - - /* U+F00B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xf4, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x37, 0x77, 0x77, 0x60, 0x1, - 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xf4, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x37, 0x88, 0x88, 0x70, 0x2, - 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xe3, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x48, 0x88, 0x88, 0x71, 0x2, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0xbd, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0xc, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xfe, 0x20, 0x9, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xe3, 0x9f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3d, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x3, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, - 0x20, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xe2, 0xef, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xa0, 0x0, - 0xb, 0xff, 0xff, 0xfb, 0x3f, 0xff, 0xff, 0xfa, - 0x0, 0xbf, 0xff, 0xff, 0xe2, 0x3, 0xff, 0xff, - 0xff, 0xab, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xfa, 0x0, 0xb, 0xff, 0xff, - 0xfe, 0x23, 0xff, 0xff, 0xff, 0xa0, 0xaf, 0xff, - 0xff, 0xe2, 0x0, 0x3f, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x3, 0xff, 0xff, 0xfd, - 0x8f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf6, 0x9, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x3, - 0xef, 0x70, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xbb, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x2f, - 0xff, 0xe0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xf5, 0x0, 0x2f, 0xff, 0xe0, 0x0, - 0x8f, 0xc1, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, - 0x0, 0x2f, 0xff, 0xe0, 0x2, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0x30, 0x2f, 0xff, - 0xe0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xbf, - 0xff, 0xfa, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0xcf, - 0xff, 0xf8, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, - 0x2f, 0xff, 0xe0, 0x0, 0xc, 0xff, 0xff, 0x20, - 0xc, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xe0, - 0x0, 0x1, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xf3, - 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x7f, - 0xff, 0xe0, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x2f, - 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0xf3, 0x9f, - 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, - 0x0, 0xb, 0xff, 0xf6, 0xbf, 0xff, 0x60, 0x0, - 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x9, 0xff, - 0xf7, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x2f, 0xff, - 0xe0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0xbf, 0xff, - 0x60, 0x0, 0x0, 0xa, 0xdd, 0x70, 0x0, 0x0, - 0xa, 0xff, 0xf6, 0x8f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, - 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf1, 0xf, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xc0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x60, 0x2, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, 0x85, 0x34, - 0x59, 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x16, 0x9c, 0xdc, 0xb9, 0x50, 0x0, 0x0, - 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x55, 0x31, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, - 0x5d, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x6, 0x10, - 0x0, 0x0, 0xd, 0xfd, 0x5c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc5, 0xdf, 0xd0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x33, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xfe, 0x50, 0x0, - 0xb, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf6, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x4f, 0xff, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf4, - 0x0, 0x0, 0x7, 0xe5, 0x4, 0xdf, 0xff, 0xff, - 0xff, 0xfd, 0x40, 0x5d, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x9b, 0xdd, 0xc9, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfd, 0x30, - 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf6, 0x0, - 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x4f, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xbf, 0xff, 0xfb, 0x5f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xf5, 0x3, 0xef, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfe, - 0x30, 0x20, 0x1c, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xc1, 0x9, - 0xfb, 0x10, 0xaf, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x1, 0xbf, 0xff, - 0xd2, 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x70, 0x2d, 0xff, 0xff, 0xff, - 0x40, 0x4f, 0xff, 0xfc, 0x10, 0x0, 0x1, 0xcf, - 0xff, 0xf4, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf7, - 0x2, 0xdf, 0xff, 0xe3, 0x0, 0x3e, 0xff, 0xfd, - 0x20, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x1b, 0xff, 0xff, 0x50, 0xef, 0xff, 0xc1, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x9f, 0xff, 0xf2, 0x6f, 0xf9, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x6, - 0xff, 0xa0, 0x7, 0x60, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x39, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0x83, 0x33, 0x5f, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0x20, 0x0, 0xe, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xbb, 0xbb, 0xb9, 0x0, - 0x0, 0x7, 0xbb, 0xbb, 0xba, 0x10, 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0xdd, 0xda, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x11, 0x14, 0xff, 0xff, 0xff, 0x41, 0x11, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe3, 0x9, - 0xff, 0x90, 0x3e, 0xff, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x77, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x6, 0xf0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x4a, 0xf5, 0x7f, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, - - /* U+F01C "" */ - 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, - 0x10, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, - 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, - 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x10, 0x6f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xef, 0xff, - 0xcc, 0xcc, 0xcc, 0x40, 0x0, 0x0, 0x0, 0x1b, - 0xcc, 0xcc, 0xce, 0xff, 0xf2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x88, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x40, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x77, 0x52, - 0x0, 0x0, 0x0, 0x6e, 0xec, 0x0, 0x0, 0x0, - 0x3, 0xaf, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, - 0x9f, 0xff, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd2, 0x7f, 0xff, 0x0, 0x3, 0xef, 0xff, - 0xfe, 0x84, 0x22, 0x59, 0xff, 0xff, 0xff, 0xaf, - 0xff, 0x0, 0x1e, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0x0, 0xbf, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, - 0x87, 0x10, 0x0, 0x0, 0x0, 0x0, 0x17, 0x88, - 0x88, 0x88, 0x88, 0x86, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xd0, 0xff, 0xff, 0xfe, 0x56, 0x77, 0x81, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xfc, - 0x20, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf4, - 0x0, 0xff, 0xfd, 0xff, 0xff, 0xfa, 0x30, 0x0, - 0x3, 0x9f, 0xff, 0xff, 0x80, 0x0, 0xff, 0xf7, - 0x8f, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xff, 0xf8, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0xff, 0xf8, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0x91, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x0, - 0x0, 0x3, 0x8b, 0xdd, 0xb9, 0x51, 0x0, 0x0, - 0x0, 0x0, 0x35, 0x51, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xf6, 0xbb, 0xbb, 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, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x6b, 0xbb, 0xbb, 0xdf, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x3, 0xb5, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x9, 0xff, 0x60, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, - 0xdf, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x2f, 0xf6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xf, 0xf7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x6f, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6, - 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x8, 0xfe, 0x20, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x41, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3d, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf0, 0x0, 0x0, 0x6d, 0x40, 0x2, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xf0, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x5f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x3e, 0xff, 0x50, 0xb, 0xff, 0x0, - 0x6b, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x1, 0xdf, 0xf2, 0x3, 0xff, 0x60, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xc6, - 0x0, 0x3f, 0xf9, 0x0, 0xdf, 0xb0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x9, 0xff, 0x70, - 0xa, 0xff, 0x0, 0x8f, 0xf0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x1, 0xdf, 0xf1, 0x5, - 0xff, 0x30, 0x5f, 0xf2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x1f, 0xf6, 0x2, 0xff, - 0x50, 0x3f, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0xf, 0xf7, 0x1, 0xff, 0x50, - 0x3f, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x6f, 0xf4, 0x3, 0xff, 0x40, 0x4f, - 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x6, 0xff, 0xd0, 0x7, 0xff, 0x10, 0x6f, 0xf0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, - 0xfd, 0x20, 0xd, 0xfc, 0x0, 0xbf, 0xd0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x40, - 0x0, 0x8f, 0xf5, 0x1, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x7, - 0xff, 0xb0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xf0, 0x0, 0x0, 0x9f, 0xfe, - 0x10, 0x1e, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xc1, 0x0, - 0xbf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xf0, 0x0, 0x0, 0x15, 0x0, 0x9, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, - 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x50, 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0x7, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0x70, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x72, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x1, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x40, 0x2b, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x7f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x7, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc2, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x2, 0xcb, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x10, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xef, 0xfb, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xf4, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0xef, 0xf6, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xbf, 0xfb, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x6f, 0xff, 0x40, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, 0xf3, - 0x0, 0x3a, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xff, - 0xff, 0x93, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, - 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xfd, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x10, - 0x0, 0x0, 0x0, - - /* U+F048 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xd2, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x7b, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0x8b, 0xff, 0xe0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0x8b, 0xff, 0xe0, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xfe, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, 0xe2, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, - 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xbf, 0xfe, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0x8b, 0xff, 0xe0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0x8b, 0xff, 0xe0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0x8b, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0x66, 0xbb, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x1a, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8b, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xfb, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x30, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe5, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F04C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xa0, 0xcf, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x7a, 0xbb, 0xbb, 0xa5, 0x0, 0x0, 0x7, - 0xab, 0xbb, 0xba, 0x50, - - /* U+F04D "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x7a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xba, 0x50, - - /* U+F051 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xee, 0x30, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xf8, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x9a, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1, - 0xff, 0xf9, 0xaf, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x1f, 0xff, 0x9a, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x1, 0xff, 0xf9, 0xaf, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x1f, 0xff, 0x9a, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x1, 0xff, 0xf9, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x1f, 0xff, 0x9a, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc2, 0xff, 0xf9, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xef, 0xff, 0x9a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0x9a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0xff, 0xf9, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x1f, 0xff, - 0x9a, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, 0xff, - 0xf9, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x1f, - 0xff, 0x9a, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x1, - 0xff, 0xf9, 0xaf, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x1f, 0xff, 0x9a, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x1, 0xff, 0xf9, 0x8f, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x91, 0x99, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xab, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xdf, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x6, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x84, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x28, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x0, - - /* U+F054 "" */ - 0x2, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0xa, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x23, 0x33, 0x33, 0x33, 0xff, 0xff, 0xd3, 0x33, - 0x33, 0x33, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x3a, 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, - 0xbb, 0xbb, 0xbb, 0xb9, 0x10, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xa8, 0x10, - 0x0, 0x0, 0x0, 0x0, - - /* U+F068 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa4, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xb2, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x56, 0x77, - 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xfa, 0x40, 0x0, 0x38, 0xff, 0xff, - 0xfb, 0x10, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xe2, - 0x0, 0x3, 0x98, 0x30, 0x0, 0xcf, 0xff, 0xff, - 0x30, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x50, 0x0, - 0x4, 0xff, 0xfa, 0x0, 0x2f, 0xff, 0xff, 0xe2, - 0x0, 0x9, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xa0, 0x9, 0xff, 0xff, 0xfd, 0x0, - 0x3f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xf2, 0x4, 0xff, 0xff, 0xff, 0x70, 0xcf, - 0xff, 0xff, 0xf6, 0x1, 0xc9, 0xdf, 0xff, 0xff, - 0xf7, 0x2, 0xff, 0xff, 0xff, 0xf1, 0xef, 0xff, - 0xff, 0xf5, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x1, 0xff, 0xff, 0xff, 0xf2, 0x8f, 0xff, 0xff, - 0xf6, 0x1, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2, - 0xff, 0xff, 0xff, 0xc0, 0xd, 0xff, 0xff, 0xfa, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xe0, 0x6, 0xff, - 0xff, 0xff, 0x30, 0x3, 0xff, 0xff, 0xff, 0x10, - 0x1d, 0xff, 0xff, 0xff, 0x40, 0xd, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, 0x1, - 0x9f, 0xff, 0xb3, 0x0, 0x7f, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x10, 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xb2, 0x0, 0x0, - 0x1, 0x8f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xbf, 0xff, 0xff, 0xc8, 0x78, 0xbf, - 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x7a, 0xdf, 0xff, 0xdb, 0x83, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x9, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x25, 0x77, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x5a, - 0xef, 0xff, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfc, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xf8, 0x30, 0x1, 0x4b, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xb1, 0x7, 0x97, 0x10, 0x4, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x5, 0xff, 0xff, 0xd3, 0xaf, 0xff, 0x50, 0x7, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x1e, 0xa0, - 0x0, 0x2, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0x40, - 0xe, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x9, 0xff, - 0xd2, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0xaf, 0xff, 0xff, 0xf2, 0x0, 0x2, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xf0, 0x8, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x4f, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0x10, 0x7f, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1b, 0xff, - 0xff, 0xf0, 0x9, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x5, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xb1, 0xdf, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x4, 0xef, 0xff, 0xef, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf8, - 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, - 0xff, 0xa8, 0x78, 0x0, 0x0, 0x2d, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, - 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0xa, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x8b, 0xef, 0xfe, 0xc8, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9d, - 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x80, 0x0, 0x4f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0x70, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xf8, 0x0, 0x4, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xee, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x3d, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x72, 0x5e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x13, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x10, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfd, 0x10, 0xdf, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xd1, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x1, 0x11, 0x1b, 0xff, 0xfc, 0x1, 0xdf, 0xff, - 0xf8, 0x18, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0xcf, 0xd1, 0x1d, 0xff, 0xff, 0x80, 0x8, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0xcf, - 0xff, 0xf9, 0x0, 0x6, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xc0, - 0x26, 0x0, 0x4, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xfc, 0x1, 0xdf, 0x50, 0x7, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xd1, 0x1d, 0xff, 0xf5, 0x8, 0xff, 0xfc, 0x10, - 0xde, 0xee, 0xef, 0xff, 0xfd, 0x10, 0x3f, 0xff, - 0xff, 0xef, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x12, 0x22, 0x22, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x12, 0x29, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0x91, 0xdf, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x1, 0xdf, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0x90, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xfb, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0xb, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xf5, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, 0x6e, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcc, - 0x10, - - /* U+F078 "" */ - 0x1, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x40, 0x1, 0xdf, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x70, 0xaf, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0x48, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, 0xa, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xf4, 0x0, 0xa, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xe2, 0x0, 0x7, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xe2, 0x7, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xe9, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x3, 0xa4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x2d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x4, 0x44, 0x44, 0x44, 0x44, 0x4e, 0xff, - 0x60, 0x0, 0x0, 0xcf, 0xff, 0x6f, 0xff, 0x6f, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf6, 0x0, 0x0, 0x6, 0xff, 0x42, 0xff, 0xf2, - 0x4f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x60, 0x0, 0x0, 0x3, 0x20, 0x2f, 0xff, - 0x20, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbe, 0x40, 0xdf, 0xf6, 0xa, 0xf5, 0x0, 0x0, - 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x3d, 0xff, 0x69, 0xff, 0xf1, 0x0, - 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xfe, 0xef, 0xfd, 0xff, 0xfd, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x5, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x5, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x40, 0x0, 0x5, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x4, 0x78, 0x88, 0x88, 0x88, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x44, - 0x44, 0x44, 0x43, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc2, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8b, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4e, - 0xee, 0xee, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xe8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x20, 0xff, - 0xff, 0xff, 0x62, 0xff, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x7b, 0xbb, 0xb9, 0x15, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xaa, - 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x6, 0xf0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x4a, 0xf5, 0x7f, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xb8, 0x41, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xfd, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x6c, 0xb0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x28, - 0xef, 0xff, 0xa0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, - 0x70, 0x1a, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xeb, 0x73, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C4 "" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xd5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x20, 0x0, - 0xb, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x1b, 0xff, 0xfd, 0x20, 0x6f, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xa0, - 0xcf, 0xfd, 0x35, 0xff, 0xf8, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xfd, 0x10, 0xff, 0xf5, 0x0, 0x9f, - 0xfb, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xd1, 0x0, - 0xff, 0xf6, 0x0, 0xaf, 0xfb, 0x0, 0xc, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0xbf, 0xff, 0x89, 0xff, - 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0x4c, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x3a, 0xce, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0xdf, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xfc, 0x18, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0xcf, 0xfd, 0x35, 0xff, - 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0xff, 0xf5, 0x0, 0x9f, 0xfb, 0x0, 0x9, 0xff, - 0xff, 0xff, 0x40, 0x0, 0xff, 0xf6, 0x0, 0xaf, - 0xfb, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf3, 0x0, - 0xbf, 0xff, 0x89, 0xff, 0xf7, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0x30, 0x4f, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, - 0x6, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, - 0x7, 0xef, 0xe8, 0x0, 0x0, 0x3a, 0xcc, 0x81, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x4c, 0xdd, 0xdd, 0xdd, 0xdd, - 0x11, 0xb2, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x11, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x11, 0xff, - 0xff, 0xb9, 0xff, 0xfd, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0xf, 0xff, 0xfe, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xe0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xfe, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xe0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xfe, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xfe, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xf0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0x41, 0x89, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x82, 0xff, 0xff, 0xfe, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x13, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x31, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xf6, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x24, 0xff, 0xff, - 0x80, 0xf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0x70, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xf8, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0x9f, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xf9, 0xff, 0xf9, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x45, 0xff, 0xff, 0xff, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x4d, - 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x87, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x41, 0x9d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdc, 0x60, - - /* U+F0C9 "" */ - 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x69, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x69, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F0E0 "" */ - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x10, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0xb2, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x4e, - 0xff, 0x60, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x8, 0xff, 0xff, 0xfa, 0x10, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x2, - 0xcf, 0xff, 0xff, 0xff, 0xe4, 0x5, 0xef, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x1c, 0xff, 0xff, 0xff, 0xc1, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x20, 0x8f, 0xff, 0xf8, 0x3, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2, 0x99, - 0x20, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb3, 0x0, 0x3b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc2, - - /* U+F0E7 "" */ - 0x0, 0x9, 0xaa, 0xaa, 0xaa, 0xa9, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xa8, 0x88, 0x88, - 0x60, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x0, 0x6c, 0xc8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x33, 0x33, 0x8f, 0xff, - 0xfb, 0x33, 0x33, 0x10, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xf7, 0x5f, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0xbf, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xf5, 0x3f, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xd0, - 0x7d, 0xdd, 0xdd, 0xdd, 0x21, 0xb2, 0x0, 0xf, - 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xf3, - 0x1f, 0xe2, 0x0, 0xff, 0xff, 0xff, 0x80, 0xef, - 0xff, 0xff, 0xff, 0x31, 0xff, 0xe2, 0xf, 0xff, - 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xf3, 0x1f, - 0xff, 0xe2, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, - 0xff, 0xff, 0x31, 0xff, 0xff, 0xbf, 0xff, 0xff, - 0xf8, 0xe, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, - 0xff, 0xa2, 0x22, 0x22, 0x1f, 0xff, 0xff, 0xf8, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xf8, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, - 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc2, 0x56, 0x66, 0x63, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, - 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xf4, 0x0, 0x9f, - 0x20, 0xb, 0xf1, 0x0, 0xcf, 0x0, 0xf, 0xc0, - 0x1, 0xff, 0xf4, 0xff, 0xf4, 0x0, 0x8f, 0x10, - 0xa, 0xf0, 0x0, 0xbe, 0x0, 0xe, 0xb0, 0x0, - 0xff, 0xf4, 0xff, 0xf5, 0x0, 0xaf, 0x20, 0xb, - 0xf1, 0x0, 0xcf, 0x0, 0xf, 0xc0, 0x1, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xaa, 0xbf, 0xea, 0xac, 0xfe, - 0xaa, 0xdf, 0xda, 0xad, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xfb, 0x0, 0x1f, 0x80, 0x2, 0xf7, 0x0, - 0x4f, 0x40, 0x7, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xfb, 0x0, 0x1f, 0x80, 0x2, 0xf7, 0x0, 0x4f, - 0x40, 0x7, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xfc, - 0x0, 0x3f, 0xa0, 0x4, 0xf9, 0x0, 0x6f, 0x60, - 0x8, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xfc, 0x99, 0xef, 0xb9, - 0x99, 0x99, 0x99, 0x99, 0x99, 0xaf, 0xf9, 0x9a, - 0xff, 0xf4, 0xff, 0xf4, 0x0, 0x8f, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0xff, - 0xf4, 0xff, 0xf4, 0x0, 0x8f, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0xff, 0xf4, - 0xff, 0xf8, 0x44, 0xbf, 0x64, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x4f, 0xd4, 0x45, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x40, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x17, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4b, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x5, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x1, 0xad, 0xee, 0xee, 0xee, 0xee, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F15B "" */ - 0x48, 0x88, 0x88, 0x88, 0x88, 0x83, 0x7, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xf, 0xc1, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0xf, 0xfc, 0x10, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xf, 0xff, 0xc1, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf, 0xff, - 0xfc, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xf, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0xf, 0xff, 0xff, 0xf6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xdd, - 0xdd, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xff, - 0xff, 0xff, 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, - 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa1, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xfc, - 0x84, 0x20, 0x0, 0x1, 0x36, 0xae, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x2d, 0xff, 0xff, 0xfe, 0x81, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, - 0xff, 0xff, 0xf7, 0xd, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3c, 0xff, 0xff, 0xf5, 0x8f, 0xff, 0xd2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfe, 0x10, 0x8f, 0xa0, 0x0, - 0x0, 0x0, 0x38, 0xcd, 0xef, 0xec, 0xa6, 0x10, - 0x0, 0x0, 0x4, 0xfe, 0x20, 0x0, 0x30, 0x0, - 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa3, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xfb, 0x63, 0x21, 0x24, - 0x8d, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xdf, 0xfe, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9e, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xae, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xbd, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x79, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, - 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x4f, 0xff, 0x42, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x42, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x42, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x41, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x80, 0x8f, 0xff, 0xf5, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, - 0x0, - - /* U+F241 "" */ - 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, - 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x4f, 0xff, 0x42, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x42, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x42, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x41, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x10, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, - 0x0, - - /* U+F242 "" */ - 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, - 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x4f, 0xff, 0x42, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x42, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x42, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x41, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x82, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, - 0x0, - - /* U+F243 "" */ - 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, - 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x4f, 0xff, 0x41, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x1f, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x41, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x1f, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x41, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x1f, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x40, - 0x88, 0x88, 0x88, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, - 0x0, - - /* U+F244 "" */ - 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, - 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, - 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xbc, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xfe, 0x31, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0x50, 0x0, 0x5c, 0xc5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x46, 0x50, 0x0, 0x0, - 0x3f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd2, 0x0, - 0xa, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc8, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc0, - 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xfe, 0x50, 0xe, 0xff, 0xff, 0xff, - 0xcc, 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x2, 0xdf, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xfa, 0x10, 0x2e, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x3, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xd3, 0x0, 0x0, 0x18, - 0xb9, 0x20, 0x0, 0x0, 0x0, 0xb, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xa0, - 0x0, 0x33, 0x33, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0x30, 0x1f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xfe, 0x77, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x56, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x23, 0x33, 0x30, 0x0, - 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x26, 0xac, 0xdc, 0xb8, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0xfe, 0x9f, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x0, - 0xbf, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, 0x30, 0x5, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1, 0xdf, 0xff, - 0xf8, 0x0, 0xaf, 0xff, 0xd9, 0xff, 0xe0, 0x3a, - 0x1, 0xdf, 0xff, 0xc0, 0xd, 0xff, 0xf1, 0x8, - 0xfe, 0x2, 0xfa, 0x2, 0xef, 0xff, 0x0, 0xff, - 0xff, 0xb0, 0x8, 0xe0, 0x2f, 0x50, 0x5f, 0xff, - 0xf1, 0x1f, 0xff, 0xff, 0xa0, 0x7, 0x2, 0x50, - 0x4f, 0xff, 0xff, 0x22, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf3, 0x3f, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x1e, 0xff, 0xff, 0xff, - 0x43, 0xff, 0xff, 0xff, 0xff, 0x40, 0x7, 0xff, - 0xff, 0xff, 0xf4, 0x3f, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x9, 0xff, 0xff, 0xff, 0x32, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, - 0xf, 0xff, 0xff, 0x50, 0x1c, 0x2, 0xa0, 0xb, - 0xff, 0xff, 0x20, 0xef, 0xff, 0x50, 0x1d, 0xf0, - 0x2f, 0xa0, 0xd, 0xff, 0xf0, 0xc, 0xff, 0xf4, - 0x1d, 0xff, 0x2, 0xf5, 0x4, 0xff, 0xfe, 0x0, - 0x8f, 0xff, 0xfd, 0xff, 0xf0, 0x25, 0x3, 0xff, - 0xff, 0xa0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x3, 0xff, 0xff, 0xf6, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xf0, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xbf, 0xff, 0xff, 0xea, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x4, 0xbc, 0xcc, 0xcc, 0xa1, - 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, 0x22, 0xef, - 0xff, 0xff, 0xff, 0xa2, 0x22, 0x22, 0x10, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x10, 0x1, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x6, 0xff, 0xfd, 0x1d, 0xff, - 0xb1, 0xef, 0xf9, 0x2f, 0xff, 0xf2, 0x0, 0x6f, - 0xff, 0xb0, 0xbf, 0xf9, 0xd, 0xff, 0x70, 0xff, - 0xff, 0x20, 0x6, 0xff, 0xfb, 0xb, 0xff, 0x90, - 0xdf, 0xf7, 0xf, 0xff, 0xf2, 0x0, 0x6f, 0xff, - 0xb0, 0xbf, 0xf9, 0xd, 0xff, 0x70, 0xff, 0xff, - 0x20, 0x6, 0xff, 0xfb, 0xb, 0xff, 0x90, 0xdf, - 0xf7, 0xf, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xb0, - 0xbf, 0xf9, 0xd, 0xff, 0x70, 0xff, 0xff, 0x20, - 0x6, 0xff, 0xfb, 0xb, 0xff, 0x90, 0xdf, 0xf7, - 0xf, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xb0, 0xbf, - 0xf9, 0xd, 0xff, 0x70, 0xff, 0xff, 0x20, 0x6, - 0xff, 0xfb, 0xb, 0xff, 0x90, 0xdf, 0xf7, 0xf, - 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xb0, 0xbf, 0xf9, - 0xd, 0xff, 0x70, 0xff, 0xff, 0x20, 0x6, 0xff, - 0xfb, 0xb, 0xff, 0x90, 0xdf, 0xf7, 0xf, 0xff, - 0xf2, 0x0, 0x6f, 0xff, 0xb0, 0xbf, 0xf9, 0xd, - 0xff, 0x70, 0xff, 0xff, 0x20, 0x6, 0xff, 0xfd, - 0x1d, 0xff, 0xb1, 0xef, 0xf9, 0x2f, 0xff, 0xf2, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x2, 0x34, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x31, 0x0, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7b, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb5, 0x7, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xf5, 0x7, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, - 0x7, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf5, 0x7, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xf5, 0x7, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xec, 0xa4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xdf, 0xff, 0xff, 0xda, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x1, 0xdf, 0xff, 0xd1, 0x8, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x1, 0xdf, 0xd1, 0x0, 0xd, - 0xff, 0xff, 0xff, 0x80, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x1, 0xb1, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xf8, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0x86, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x3, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x80, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x7, - 0xf7, 0x0, 0x1, 0xef, 0xff, 0xff, 0xf8, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x7, - 0xff, 0xf7, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x27, - 0xff, 0xff, 0xf7, 0x2e, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x20, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xd9, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x1d, - 0xfc, 0x44, 0xfc, 0x44, 0xfc, 0x44, 0xff, 0xf5, - 0x1, 0xdf, 0xfb, 0x0, 0xeb, 0x0, 0xeb, 0x0, - 0xef, 0xf5, 0x1d, 0xff, 0xfb, 0x0, 0xeb, 0x0, - 0xeb, 0x0, 0xef, 0xf5, 0xdf, 0xff, 0xfb, 0x0, - 0xeb, 0x0, 0xeb, 0x0, 0xef, 0xf5, 0xff, 0xff, - 0xfb, 0x0, 0xeb, 0x0, 0xeb, 0x0, 0xef, 0xf5, - 0xff, 0xff, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xdd, - 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, - 0x1, 0xaa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x10, 0x0, 0x1, 0xdf, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf1, 0x0, 0x2, 0xdf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x2, - 0xef, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf1, 0x3, 0xef, 0xff, 0xff, - 0x86, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xff, - 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x7, 0xff, 0xff, 0xff, 0xcb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa7, 0x0, - 0x6, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xee, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 112, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 111, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 45, .adv_w = 163, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 77, .adv_w = 292, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 239, .adv_w = 258, .box_w = 15, .box_h = 25, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 427, .adv_w = 351, .box_w = 21, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 616, .adv_w = 285, .box_w = 17, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 778, .adv_w = 87, .box_w = 3, .box_h = 8, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 790, .adv_w = 140, .box_w = 6, .box_h = 24, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 862, .adv_w = 141, .box_w = 7, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 946, .adv_w = 166, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 996, .adv_w = 242, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 1074, .adv_w = 94, .box_w = 4, .box_h = 8, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1090, .adv_w = 159, .box_w = 8, .box_h = 3, .ofs_x = 1, .ofs_y = 6}, - {.bitmap_index = 1102, .adv_w = 94, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1110, .adv_w = 146, .box_w = 12, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 1260, .adv_w = 277, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1404, .adv_w = 154, .box_w = 7, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1467, .adv_w = 239, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1602, .adv_w = 238, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1728, .adv_w = 278, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1890, .adv_w = 239, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2025, .adv_w = 257, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2160, .adv_w = 249, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2295, .adv_w = 268, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2430, .adv_w = 257, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2565, .adv_w = 94, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2593, .adv_w = 94, .box_w = 4, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 2629, .adv_w = 242, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 2707, .adv_w = 242, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 2766, .adv_w = 242, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 2844, .adv_w = 238, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2970, .adv_w = 430, .box_w = 25, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 3258, .adv_w = 305, .box_w = 21, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3447, .adv_w = 315, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3600, .adv_w = 301, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3753, .adv_w = 344, .box_w = 19, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3924, .adv_w = 279, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4050, .adv_w = 264, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4176, .adv_w = 321, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4329, .adv_w = 338, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4482, .adv_w = 129, .box_w = 4, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4518, .adv_w = 213, .box_w = 12, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 4626, .adv_w = 299, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4779, .adv_w = 247, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4905, .adv_w = 397, .box_w = 21, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5094, .adv_w = 338, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5247, .adv_w = 349, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5427, .adv_w = 300, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5571, .adv_w = 349, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 5802, .adv_w = 302, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5946, .adv_w = 258, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6081, .adv_w = 244, .box_w = 16, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6225, .adv_w = 329, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6369, .adv_w = 296, .box_w = 20, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 6549, .adv_w = 468, .box_w = 29, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6810, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6972, .adv_w = 269, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 7134, .adv_w = 273, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7278, .adv_w = 139, .box_w = 7, .box_h = 24, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 7362, .adv_w = 146, .box_w = 11, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 7500, .adv_w = 139, .box_w = 6, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 7572, .adv_w = 243, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 7644, .adv_w = 208, .box_w = 13, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7657, .adv_w = 250, .box_w = 7, .box_h = 4, .ofs_x = 3, .ofs_y = 16}, - {.bitmap_index = 7671, .adv_w = 249, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7762, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7905, .adv_w = 238, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7996, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8139, .adv_w = 255, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8237, .adv_w = 147, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8342, .adv_w = 287, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 8485, .adv_w = 283, .box_w = 14, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8618, .adv_w = 116, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8666, .adv_w = 118, .box_w = 9, .box_h = 24, .ofs_x = -3, .ofs_y = -5}, - {.bitmap_index = 8774, .adv_w = 256, .box_w = 14, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8907, .adv_w = 116, .box_w = 3, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8936, .adv_w = 440, .box_w = 24, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9104, .adv_w = 283, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9202, .adv_w = 264, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9307, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 9450, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 9593, .adv_w = 171, .box_w = 8, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9649, .adv_w = 208, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9740, .adv_w = 172, .box_w = 11, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9834, .adv_w = 282, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9932, .adv_w = 233, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 10044, .adv_w = 374, .box_w = 24, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10212, .adv_w = 230, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10310, .adv_w = 233, .box_w = 16, .box_h = 19, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 10462, .adv_w = 217, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10546, .adv_w = 146, .box_w = 8, .box_h = 24, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 10642, .adv_w = 124, .box_w = 4, .box_h = 24, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 10690, .adv_w = 146, .box_w = 8, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 10786, .adv_w = 242, .box_w = 13, .box_h = 4, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 10812, .adv_w = 174, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 10857, .adv_w = 131, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 10872, .adv_w = 416, .box_w = 27, .box_h = 28, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 11250, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11510, .adv_w = 416, .box_w = 26, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11822, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12082, .adv_w = 286, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12253, .adv_w = 416, .box_w = 26, .box_h = 26, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12591, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 12942, .adv_w = 468, .box_w = 30, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13302, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 13653, .adv_w = 468, .box_w = 30, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13953, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 14304, .adv_w = 208, .box_w = 13, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 14441, .adv_w = 312, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 14651, .adv_w = 468, .box_w = 30, .box_h = 26, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 15041, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15301, .adv_w = 286, .box_w = 18, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 15544, .adv_w = 364, .box_w = 17, .box_h = 25, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 15757, .adv_w = 364, .box_w = 23, .box_h = 28, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 16079, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16355, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16631, .adv_w = 364, .box_w = 17, .box_h = 25, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 16844, .adv_w = 364, .box_w = 25, .box_h = 24, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 17144, .adv_w = 260, .box_w = 14, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 17305, .adv_w = 260, .box_w = 14, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 17466, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17742, .adv_w = 364, .box_w = 23, .box_h = 6, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 17811, .adv_w = 468, .box_w = 30, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 18111, .adv_w = 520, .box_w = 33, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 18557, .adv_w = 468, .box_w = 31, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 18976, .adv_w = 416, .box_w = 26, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19288, .adv_w = 364, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 19449, .adv_w = 364, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 19610, .adv_w = 520, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 19957, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 20217, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 20568, .adv_w = 416, .box_w = 27, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 20933, .adv_w = 364, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21221, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 21532, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21808, .adv_w = 364, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 22050, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 22310, .adv_w = 260, .box_w = 18, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 22553, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 22864, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 23175, .adv_w = 468, .box_w = 30, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23475, .adv_w = 416, .box_w = 28, .box_h = 28, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 23867, .adv_w = 312, .box_w = 20, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 24137, .adv_w = 520, .box_w = 33, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24533, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 24814, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 25095, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 25376, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 25657, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 25938, .adv_w = 520, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 26285, .adv_w = 364, .box_w = 21, .box_h = 27, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 26569, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 26880, .adv_w = 416, .box_w = 27, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 27245, .adv_w = 520, .box_w = 33, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 27575, .adv_w = 312, .box_w = 20, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 27845, .adv_w = 418, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 1} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 4, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 19, 0, 11, -9, 0, 0, - 0, 0, -23, -25, 3, 20, 9, 7, - -17, 3, 20, 1, 17, 4, 13, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 25, 3, -3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8, 0, -12, 0, 0, 0, 0, - 0, -8, 7, 8, 0, 0, -4, 0, - -3, 4, 0, -4, 0, -4, -2, -8, - 0, 0, 0, 0, -4, 0, 0, -5, - -6, 0, 0, -4, 0, -8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - -4, 0, -6, 0, -11, 0, -50, 0, - 0, -8, 0, 8, 12, 0, 0, -8, - 4, 4, 14, 8, -7, 8, 0, 0, - -24, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -11, -5, -20, 0, -17, - -3, 0, 0, 0, 0, 1, 16, 0, - -12, -3, -1, 1, 0, -7, 0, 0, - -3, -31, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -33, -3, 16, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -17, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 14, - 0, 4, 0, 0, -8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 16, 3, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, - 8, 4, 12, -4, 0, 0, 8, -4, - -14, -57, 3, 11, 8, 1, -5, 0, - 15, 0, 13, 0, 13, 0, -39, 0, - -5, 12, 0, 14, -4, 8, 4, 0, - 0, 1, -4, 0, 0, -7, 33, 0, - 33, 0, 12, 0, 17, 5, 7, 12, - 0, 0, 0, -15, 0, 0, 0, 0, - 1, -3, 0, 3, -7, -5, -8, 3, - 0, -4, 0, 0, 0, -17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -27, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, -23, 0, -26, 0, 0, 0, - 0, -3, 0, 41, -5, -5, 4, 4, - -4, 0, -5, 4, 0, 0, -22, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -40, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -26, 0, 25, 0, 0, -15, 0, - 14, 0, -28, -40, -28, -8, 12, 0, - 0, -28, 0, 5, -10, 0, -6, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 11, 12, -51, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 20, 0, 3, 0, 0, 0, - 0, 0, 3, 3, -5, -8, 0, -1, - -1, -4, 0, 0, -3, 0, 0, 0, - -8, 0, -3, 0, -10, -8, 0, -10, - -14, -14, -8, 0, -8, 0, -8, 0, - 0, 0, 0, -3, 0, 0, 4, 0, - 3, -4, 0, 1, 0, 0, 0, 4, - -3, 0, 0, 0, -3, 4, 4, -1, - 0, 0, 0, -8, 0, -1, 0, 0, - 0, 0, 0, 1, 0, 5, -3, 0, - -5, 0, -7, 0, 0, -3, 0, 12, - 0, 0, -4, 0, 0, 0, 0, 0, - -1, 1, -3, -3, 0, 0, -4, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, -2, 0, -4, -5, 0, - 0, 0, 0, 0, 1, 0, 0, -3, - 0, -4, -4, -4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -2, 0, 0, - 0, 0, -3, -5, 0, -6, 0, -12, - -3, -12, 8, 0, 0, -8, 4, 8, - 11, 0, -10, -1, -5, 0, -1, -20, - 4, -3, 3, -22, 4, 0, 0, 1, - -22, 0, -22, -3, -36, -3, 0, -21, - 0, 8, 12, 0, 5, 0, 0, 0, - 0, 1, 0, -7, -5, 0, -12, 0, - 0, 0, -4, 0, 0, 0, -4, 0, - 0, 0, 0, 0, -2, -2, 0, -2, - -5, 0, 0, 0, 0, 0, 0, 0, - -4, -4, 0, -3, -5, -3, 0, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, -3, 0, -5, - 0, -3, 0, -8, 4, 0, 0, -5, - 2, 4, 4, 0, 0, 0, 0, 0, - 0, -3, 0, 0, 0, 0, 0, 3, - 0, 0, -4, 0, -4, -3, -5, 0, - 0, 0, 0, 0, 0, 0, 3, 0, - -3, 0, 0, 0, 0, -5, -6, 0, - -8, 0, 12, -3, 1, -13, 0, 0, - 11, -21, -22, -17, -8, 4, 0, -3, - -27, -7, 0, -7, 0, -8, 6, -7, - -27, 0, -11, 0, 0, 2, -1, 3, - -3, 0, 4, 0, -12, -16, 0, -21, - -10, -9, -10, -12, -5, -11, -1, -8, - -11, 2, 0, 1, 0, -4, 0, 0, - 0, 3, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - 0, -2, 0, -1, -4, 0, -7, -9, - -9, -1, 0, -12, 0, 0, 0, 0, - 0, 0, -3, 0, 0, 0, 0, 2, - -2, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 20, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, 0, 0, - -8, 0, 0, 0, 0, -21, -12, 0, - 0, 0, -6, -21, 0, 0, -4, 4, - 0, -11, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, 0, 0, -8, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, -7, 0, - 0, 0, 0, 5, 0, 3, -8, -8, - 0, -4, -4, -5, 0, 0, 0, 0, - 0, 0, -12, 0, -4, 0, -6, -4, - 0, -9, -10, -12, -3, 0, -8, 0, - -12, 0, 0, 0, 0, 33, 0, 0, - 2, 0, 0, -5, 0, 4, 0, -18, - 0, 0, 0, 0, 0, -39, -7, 14, - 12, -3, -17, 0, 4, -6, 0, -21, - -2, -5, 4, -29, -4, 5, 0, 6, - -15, -6, -15, -14, -17, 0, 0, -25, - 0, 24, 0, 0, -2, 0, 0, 0, - -2, -2, -4, -11, -14, -1, -39, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -4, 0, -2, -4, -6, 0, 0, - -8, 0, -4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, -8, 0, 0, 8, - -1, 5, 0, -9, 4, -3, -1, -11, - -4, 0, -5, -4, -3, 0, -6, -7, - 0, 0, -3, -1, -3, -7, -5, 0, - 0, -4, 0, 4, -3, 0, -9, 0, - 0, 0, -8, 0, -7, 0, -7, -7, - 4, 0, 0, 0, 0, 0, 0, 0, - 0, -8, 4, 0, -6, 0, -3, -5, - -13, -3, -3, -3, -1, -3, -5, -1, - 0, 0, 0, 0, 0, -4, -3, -3, - 0, 0, 0, 0, 5, -3, 0, -3, - 0, 0, 0, -3, -5, -3, -4, -5, - -4, 0, 3, 17, -1, 0, -11, 0, - -3, 8, 0, -4, -17, -5, 6, 0, - 0, -20, -7, 4, -7, 3, 0, -3, - -3, -13, 0, -6, 2, 0, 0, -7, - 0, 0, 0, 4, 4, -8, -8, 0, - -7, -4, -6, -4, -4, 0, -7, 2, - -8, -7, 12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, 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, - -3, 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, -3, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, 0, 0, -5, - 0, 0, -4, -4, 0, 0, 0, 0, - -4, 0, 0, 0, 0, -2, 0, 0, - 0, 0, 0, -3, 0, 0, 0, 0, - -6, 0, -8, 0, 0, 0, -14, 0, - 3, -9, 8, 1, -3, -20, 0, 0, - -9, -4, 0, -17, -10, -12, 0, 0, - -18, -4, -17, -16, -20, 0, -11, 0, - 3, 28, -5, 0, -10, -4, -1, -4, - -7, -11, -7, -15, -17, -10, -4, 0, - 0, -3, 0, 1, 0, 0, -29, -4, - 12, 9, -9, -15, 0, 1, -13, 0, - -21, -3, -4, 8, -38, -5, 1, 0, - 0, -27, -5, -22, -4, -30, 0, 0, - -29, 0, 25, 1, 0, -3, 0, 0, - 0, 0, -2, -3, -16, -3, 0, -27, - 0, 0, 0, 0, -13, 0, -4, 0, - -1, -12, -20, 0, 0, -2, -6, -12, - -4, 0, -3, 0, 0, 0, 0, -19, - -4, -14, -13, -3, -7, -10, -4, -7, - 0, -8, -4, -14, -6, 0, -5, -8, - -4, -8, 0, 2, 0, -3, -14, 0, - 8, 0, -7, 0, 0, 0, 0, 5, - 0, 3, -8, 17, 0, -4, -4, -5, - 0, 0, 0, 0, 0, 0, -12, 0, - -4, 0, -6, -4, 0, -9, -10, -12, - -3, 0, -8, 3, 17, 0, 0, 0, - 0, 33, 0, 0, 2, 0, 0, -5, - 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -3, -8, 0, 0, 0, 0, 0, -2, - 0, 0, 0, -4, -4, 0, 0, -8, - -4, 0, 0, -8, 0, 7, -2, 0, - 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 6, 8, 3, -4, 0, -13, - -7, 0, 12, -14, -13, -8, -8, 17, - 7, 4, -36, -3, 8, -4, 0, -4, - 5, -4, -15, 0, -4, 4, -5, -3, - -12, -3, 0, 0, 12, 8, 0, -12, - 0, -23, -5, 12, -5, -16, 1, -5, - -14, -14, -4, 17, 4, 0, -6, 0, - -11, 0, 3, 14, -10, -15, -17, -10, - 12, 0, 1, -30, -3, 4, -7, -3, - -10, 0, -9, -15, -6, -6, -3, 0, - 0, -10, -9, -4, 0, 12, 10, -4, - -23, 0, -23, -6, 0, -15, -24, -1, - -13, -7, -14, -12, 11, 0, 0, -5, - 0, -8, -4, 0, -4, -7, 0, 7, - -14, 4, 0, 0, -22, 0, -4, -9, - -7, -3, -12, -10, -14, -10, 0, -12, - -4, -10, -8, -12, -4, 0, 0, 1, - 20, -7, 0, -12, -4, 0, -4, -8, - -10, -11, -12, -16, -5, -8, 8, 0, - -6, 0, -21, -5, 2, 8, -13, -15, - -8, -14, 14, -4, 2, -39, -7, 8, - -9, -7, -15, 0, -12, -17, -5, -4, - -3, -4, -9, -12, -1, 0, 0, 12, - 12, -3, -27, 0, -25, -10, 10, -16, - -28, -8, -15, -17, -21, -14, 8, 0, - 0, 0, 0, -5, 0, 0, 4, -5, - 8, 3, -8, 8, 0, 0, -13, -1, - 0, -1, 0, 1, 1, -3, 0, 0, - 0, 0, 0, 0, -4, 0, 0, 0, - 0, 3, 12, 1, 0, -5, 0, 0, - 0, 0, -3, -3, -5, 0, 0, 0, - 1, 3, 0, 0, 0, 0, 3, 0, - -3, 0, 16, 0, 7, 1, 1, -5, - 0, 8, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 12, 0, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -25, 0, -4, 7, 0, 12, - 0, 0, 41, 5, -8, -8, 4, 4, - -3, 1, -21, 0, 0, 20, -25, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -28, 16, 58, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -25, 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, -7, 0, 0, -8, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, -11, 0, - 0, 1, 0, 0, 4, 54, -8, -3, - 13, 11, -11, 4, 0, 0, 4, 4, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -54, 12, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -12, - 0, 0, 0, -11, 0, 0, 0, 0, - -9, -2, 0, 0, 0, -9, 0, -5, - 0, -20, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -28, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, -4, 0, 0, -8, 0, -6, 0, - -11, 0, 0, 0, -7, 4, -5, 0, - 0, -11, -4, -10, 0, 0, -11, 0, - -4, 0, -20, 0, -5, 0, 0, -34, - -8, -17, -5, -15, 0, 0, -28, 0, - -11, -2, 0, 0, 0, 0, 0, 0, - 0, 0, -6, -7, -3, -7, 0, 0, - 0, 0, -9, 0, -9, 5, -5, 8, - 0, -3, -10, -3, -7, -8, 0, -5, - -2, -3, 3, -11, -1, 0, 0, 0, - -37, -3, -6, 0, -9, 0, -3, -20, - -4, 0, 0, -3, -3, 0, 0, 0, - 0, 3, 0, -3, -7, -3, 7, 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, 5, 0, 0, 0, 0, 0, - 0, -9, 0, -3, 0, 0, 0, -8, - 4, 0, 0, 0, -11, -4, -8, 0, - 0, -12, 0, -4, 0, -20, 0, 0, - 0, 0, -40, 0, -8, -15, -21, 0, - 0, -28, 0, -3, -6, 0, 0, 0, - 0, 0, 0, 0, 0, -4, -6, -2, - -6, 1, 0, 0, 7, -5, 0, 13, - 20, -4, -4, -12, 5, 20, 7, 9, - -11, 5, 17, 5, 12, 9, 11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 20, -7, -4, 0, -3, - 33, 18, 33, 0, 0, 0, 4, 0, - 0, 15, 0, 0, -7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -3, 0, - 0, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, -35, -5, -3, -17, - -20, 0, 0, -28, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - 0, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, -35, -5, -3, - -17, -20, 0, 0, -17, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -3, 0, 0, 0, -10, 4, 0, -4, - 3, 7, 4, -12, 0, -1, -3, 4, - 0, 3, 0, 0, 0, 0, -10, 0, - -4, -3, -8, 0, -4, -17, 0, 26, - -4, 0, -9, -3, 0, -3, -7, 0, - -4, -12, -8, -5, 0, 0, 0, -7, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -3, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, -35, - -5, -3, -17, -20, 0, 0, -28, 0, - 0, 0, 0, 0, 0, 21, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -7, 0, -13, -5, -4, 12, -4, -4, - -17, 1, -2, 1, -3, -11, 1, 9, - 1, 3, 1, 3, -10, -17, -5, 0, - -16, -8, -11, -17, -16, 0, -7, -8, - -5, -5, -3, -3, -5, -3, 0, -3, - -1, 6, 0, 6, -3, 0, 13, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -3, -4, -4, 0, 0, - -11, 0, -2, 0, -7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, -4, 0, -5, - 0, 0, 0, 0, -3, 0, 0, -7, - -4, 4, 0, -7, -8, -3, 0, -12, - -3, -9, -3, -5, 0, -7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -28, 0, 13, 0, 0, -7, 0, - 0, 0, 0, -5, 0, -4, 0, 0, - -2, 0, 0, -3, 0, -10, 0, 0, - 17, -5, -14, -13, 3, 5, 5, -1, - -12, 3, 6, 3, 12, 3, 14, -3, - -11, 0, 0, -17, 0, 0, -12, -11, - 0, 0, -8, 0, -5, -7, 0, -6, - 0, -6, 0, -3, 6, 0, -3, -12, - -4, 15, 0, 0, -4, 0, -8, 0, - 0, 5, -10, 0, 4, -4, 3, 0, - 0, -14, 0, -3, -1, 0, -4, 5, - -3, 0, 0, 0, -17, -5, -9, 0, - -12, 0, 0, -20, 0, 15, -4, 0, - -7, 0, 2, 0, -4, 0, -4, -12, - 0, -4, 4, 0, 0, 0, 0, -3, - 0, 0, 4, -5, 1, 0, 0, -5, - -3, 0, -5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -26, 0, 9, 0, - 0, -3, 0, 0, 0, 0, 1, 0, - -4, -4, 0, 0, 0, 8, 0, 10, - 0, 0, 0, 0, 0, -26, -24, 1, - 18, 12, 7, -17, 3, 17, 0, 15, - 0, 8, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_26 = { -#else -lv_font_t lv_font_montserrat_26 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 29, /*The maximum line height required by the font*/ - .base_line = 5, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -2, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_26*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_28.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_28.c deleted file mode 100644 index a186747..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_28.c +++ /dev/null @@ -1,5140 +0,0 @@ -/******************************************************************************* - * Size: 28 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 28 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_28.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_28 - #define LV_FONT_MONTSERRAT_28 1 -#endif - -#if LV_FONT_MONTSERRAT_28 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0xc, 0xff, 0x50, 0xcf, 0xf4, 0xb, 0xff, 0x30, - 0xaf, 0xf3, 0xa, 0xff, 0x20, 0x9f, 0xf2, 0x9, - 0xff, 0x10, 0x8f, 0xf0, 0x7, 0xff, 0x0, 0x7f, - 0xf0, 0x6, 0xfe, 0x0, 0x6f, 0xe0, 0x5, 0xfd, - 0x0, 0x27, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x86, 0x0, 0xdf, 0xf6, 0xf, 0xff, 0x80, - 0x6f, 0xc1, - - /* U+0022 "\"" */ - 0x3f, 0xf1, 0x2, 0xff, 0x23, 0xff, 0x10, 0x2f, - 0xf2, 0x2f, 0xf0, 0x1, 0xff, 0x12, 0xff, 0x0, - 0x1f, 0xf1, 0x2f, 0xf0, 0x1, 0xff, 0x11, 0xff, - 0x0, 0xf, 0xf0, 0x1f, 0xf0, 0x0, 0xff, 0x0, - 0x98, 0x0, 0x9, 0x90, - - /* U+0023 "#" */ - 0x0, 0x0, 0x0, 0xaf, 0x50, 0x0, 0x6, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xf3, 0x0, 0x0, - 0x7f, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, - 0x0, 0x9, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xf0, 0x0, 0x0, 0xbf, 0x40, 0x0, 0x0, 0x0, - 0x1, 0xfd, 0x0, 0x0, 0xd, 0xf2, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, 0x80, 0x0, - 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf6, - 0x0, 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0x40, 0x0, 0x7, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xf2, 0x0, 0x0, 0x9f, 0x60, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0xa, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, - 0xcf, 0x30, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x7, 0xf8, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0x60, 0x0, 0x4, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x6f, - 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x20, 0x0, - 0x8, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, - 0x0, 0x0, 0xaf, 0x50, 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x8c, 0xef, 0xff, 0xd9, 0x40, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x5, 0xff, 0xfc, 0x8f, 0xd7, 0xae, 0xff, 0x10, - 0xe, 0xff, 0x50, 0xf, 0xc0, 0x0, 0x59, 0x0, - 0x4f, 0xf9, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, - 0x5f, 0xf6, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, - 0x4f, 0xfa, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x80, 0xf, 0xc0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xbf, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x5e, 0xff, 0xff, 0xfe, 0x94, 0x0, 0x0, - 0x0, 0x1, 0x6b, 0xff, 0xff, 0xff, 0xc3, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xed, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0xf, 0xc0, 0x3c, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0xdf, 0xf1, - 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x8f, 0xf3, - 0x4, 0x0, 0x0, 0xf, 0xc0, 0x0, 0xbf, 0xf1, - 0x5f, 0xa2, 0x0, 0xf, 0xc0, 0x5, 0xff, 0xc0, - 0xaf, 0xff, 0xc8, 0x7f, 0xd8, 0xcf, 0xff, 0x30, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x0, 0x17, 0xbe, 0xff, 0xff, 0xc7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, - - /* U+0025 "%" */ - 0x0, 0x7d, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0x30, 0x0, 0xa, 0xfd, 0x9c, 0xfc, 0x0, - 0x0, 0x0, 0x9, 0xf9, 0x0, 0x0, 0x4f, 0xb0, - 0x0, 0x8f, 0x70, 0x0, 0x0, 0x4f, 0xd0, 0x0, - 0x0, 0xbf, 0x30, 0x0, 0xf, 0xd0, 0x0, 0x0, - 0xdf, 0x30, 0x0, 0x0, 0xef, 0x0, 0x0, 0xc, - 0xf1, 0x0, 0x9, 0xf9, 0x0, 0x0, 0x0, 0xfe, - 0x0, 0x0, 0xa, 0xf1, 0x0, 0x4f, 0xd0, 0x0, - 0x0, 0x0, 0xef, 0x0, 0x0, 0xc, 0xf1, 0x0, - 0xef, 0x30, 0x0, 0x0, 0x0, 0xbf, 0x30, 0x0, - 0xf, 0xd0, 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xb0, 0x0, 0x8f, 0x70, 0x4f, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xfd, 0x9c, 0xfc, 0x0, - 0xef, 0x30, 0x5, 0x88, 0x50, 0x0, 0x0, 0x7d, - 0xfe, 0x80, 0x9, 0xf8, 0x1, 0xcf, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xd0, 0xb, - 0xf9, 0x11, 0x8f, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0x30, 0x2f, 0xc0, 0x0, 0xc, 0xf3, 0x0, - 0x0, 0x0, 0x9, 0xf8, 0x0, 0x6f, 0x60, 0x0, - 0x6, 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xd0, 0x0, - 0x8f, 0x40, 0x0, 0x4, 0xf8, 0x0, 0x0, 0x1, - 0xef, 0x30, 0x0, 0x7f, 0x50, 0x0, 0x5, 0xf8, - 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x4f, 0x80, - 0x0, 0x8, 0xf5, 0x0, 0x0, 0x4f, 0xd0, 0x0, - 0x0, 0xe, 0xe1, 0x0, 0x1e, 0xe0, 0x0, 0x1, - 0xef, 0x30, 0x0, 0x0, 0x4, 0xfe, 0x87, 0xef, - 0x40, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x3b, 0xff, 0xb3, 0x0, - - /* U+0026 "&" */ - 0x0, 0x0, 0x19, 0xdf, 0xfd, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xfe, 0x40, 0x5, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x0, 0x0, - 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, - 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xf7, - 0x0, 0x1, 0xef, 0x80, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x20, 0x2d, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xd8, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xcf, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x8f, 0xfd, 0x10, - 0x0, 0x24, 0x0, 0x6, 0xff, 0xa1, 0x5, 0xff, - 0xd1, 0x0, 0x9f, 0xb0, 0x2f, 0xfb, 0x0, 0x0, - 0x5f, 0xfd, 0x10, 0xdf, 0x70, 0x8f, 0xf2, 0x0, - 0x0, 0x5, 0xff, 0xd6, 0xff, 0x30, 0xbf, 0xe0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x0, 0xaf, - 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x0, - 0x6f, 0xfa, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, - 0x10, 0xd, 0xff, 0xe7, 0x54, 0x59, 0xef, 0xfb, - 0xff, 0xd1, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x5f, 0xf8, 0x0, 0x4, 0x9d, 0xff, 0xeb, - 0x60, 0x0, 0x5, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0x3f, 0xf1, 0x3f, 0xf1, 0x2f, 0xf0, 0x2f, 0xf0, - 0x2f, 0xf0, 0x1f, 0xf0, 0x1f, 0xf0, 0x9, 0x80, - - /* U+0028 "(" */ - 0x0, 0x4, 0xff, 0x40, 0x0, 0xcf, 0xc0, 0x0, - 0x4f, 0xf5, 0x0, 0xb, 0xfe, 0x0, 0x0, 0xff, - 0x90, 0x0, 0x5f, 0xf4, 0x0, 0x9, 0xff, 0x0, - 0x0, 0xcf, 0xd0, 0x0, 0xf, 0xfa, 0x0, 0x2, - 0xff, 0x70, 0x0, 0x3f, 0xf6, 0x0, 0x4, 0xff, - 0x60, 0x0, 0x5f, 0xf5, 0x0, 0x5, 0xff, 0x50, - 0x0, 0x4f, 0xf6, 0x0, 0x3, 0xff, 0x60, 0x0, - 0x2f, 0xf7, 0x0, 0x0, 0xff, 0xa0, 0x0, 0xc, - 0xfd, 0x0, 0x0, 0x9f, 0xf0, 0x0, 0x5, 0xff, - 0x40, 0x0, 0xf, 0xf9, 0x0, 0x0, 0xaf, 0xe0, - 0x0, 0x4, 0xff, 0x50, 0x0, 0xc, 0xfc, 0x0, - 0x0, 0x4f, 0xf4, - - /* U+0029 ")" */ - 0xd, 0xfb, 0x0, 0x0, 0x6f, 0xf3, 0x0, 0x0, - 0xdf, 0xb0, 0x0, 0x7, 0xff, 0x20, 0x0, 0x2f, - 0xf7, 0x0, 0x0, 0xdf, 0xc0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x6f, 0xf3, 0x0, 0x3, 0xff, 0x60, - 0x0, 0xf, 0xf9, 0x0, 0x0, 0xff, 0xa0, 0x0, - 0xe, 0xfb, 0x0, 0x0, 0xdf, 0xc0, 0x0, 0xd, - 0xfc, 0x0, 0x0, 0xef, 0xb0, 0x0, 0xf, 0xfa, - 0x0, 0x0, 0xff, 0x90, 0x0, 0x3f, 0xf6, 0x0, - 0x6, 0xff, 0x30, 0x0, 0x8f, 0xf0, 0x0, 0xd, - 0xfc, 0x0, 0x2, 0xff, 0x70, 0x0, 0x7f, 0xf2, - 0x0, 0xd, 0xfb, 0x0, 0x6, 0xff, 0x30, 0x0, - 0xdf, 0xb0, 0x0, - - /* U+002A "*" */ - 0x0, 0x0, 0x3f, 0x60, 0x0, 0x0, 0x0, 0x3, - 0xf6, 0x0, 0x0, 0x1e, 0x80, 0x3f, 0x60, 0x7e, - 0x33, 0xdf, 0xe9, 0xfa, 0xdf, 0xe5, 0x0, 0x7e, - 0xff, 0xff, 0x91, 0x0, 0x1, 0xaf, 0xff, 0xc2, - 0x0, 0x7, 0xef, 0xef, 0xef, 0xf9, 0x13, 0xfe, - 0x63, 0xf6, 0x4d, 0xf6, 0x6, 0x10, 0x3f, 0x60, - 0x6, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x17, 0x30, 0x0, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x44, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x50, 0x0, 0x0, 0x3, 0x33, 0x33, 0xff, 0x73, - 0x33, 0x31, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x50, 0x0, 0x0, - - /* U+002C "," */ - 0x1a, 0xb4, 0x8, 0xff, 0xe0, 0x9f, 0xff, 0x2, - 0xdf, 0xc0, 0xa, 0xf6, 0x0, 0xef, 0x10, 0x2f, - 0xc0, 0x6, 0xf6, 0x0, - - /* U+002D "-" */ - 0x25, 0x55, 0x55, 0x55, 0x6, 0xff, 0xff, 0xff, - 0xf2, 0x6f, 0xff, 0xff, 0xff, 0x20, - - /* U+002E "." */ - 0x1a, 0xc4, 0x9, 0xff, 0xe0, 0xaf, 0xff, 0x2, - 0xde, 0x60, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x5, 0x86, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0x70, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x20, 0x0, 0x0, 0x0, 0xa, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, - 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0x50, 0x0, 0x0, 0x0, 0x7, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0x90, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x0, 0x7, 0xcf, 0xfe, 0xb5, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfb, 0x10, - 0x0, 0x0, 0x4f, 0xff, 0xd9, 0x8a, 0xff, 0xfd, - 0x10, 0x0, 0x1e, 0xff, 0x70, 0x0, 0x1, 0xbf, - 0xfa, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, - 0xdf, 0xf3, 0x0, 0xef, 0xe0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0x90, 0x3f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xfe, 0x7, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xf1, 0x9f, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x3a, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf4, 0xaf, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0x49, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x13, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, 0xe, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, - 0x8f, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xff, 0x30, - 0x1, 0xef, 0xf7, 0x0, 0x0, 0x1b, 0xff, 0xa0, - 0x0, 0x4, 0xff, 0xfd, 0x98, 0xaf, 0xff, 0xd1, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xeb, 0x50, - 0x0, 0x0, - - /* U+0031 "1" */ - 0xcf, 0xff, 0xff, 0xf6, 0xcf, 0xff, 0xff, 0xf6, - 0x57, 0x77, 0xaf, 0xf6, 0x0, 0x0, 0x5f, 0xf6, - 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, - 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, - 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, - 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, - 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, - 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, - 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, - 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, - - /* U+0032 "2" */ - 0x0, 0x3, 0x8c, 0xef, 0xfc, 0x82, 0x0, 0x0, - 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x2e, 0xff, 0xfb, 0x98, 0xae, 0xff, 0xf5, 0x0, - 0x2d, 0xf9, 0x10, 0x0, 0x0, 0x8f, 0xfe, 0x0, - 0x1, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xfa, 0x77, 0x77, 0x77, 0x77, 0x70, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - - /* U+0033 "3" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6, - 0x77, 0x77, 0x77, 0x77, 0xdf, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf9, 0x61, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x3, 0x88, 0xad, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xa0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, - 0x3f, 0xc4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x2a, - 0xff, 0xfe, 0xa8, 0x89, 0xdf, 0xff, 0x70, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1, - 0x6a, 0xdf, 0xfe, 0xc7, 0x20, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xa0, 0x0, 0xa, 0xb7, 0x0, - 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0xf, 0xfa, - 0x0, 0x0, 0x1, 0xef, 0xf2, 0x0, 0x0, 0xf, - 0xfa, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, - 0xf, 0xfa, 0x0, 0x0, 0x8f, 0xfd, 0x66, 0x66, - 0x66, 0x6f, 0xfc, 0x66, 0x62, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xfa, 0x0, 0x0, - - /* U+0035 "5" */ - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x4f, 0xf9, 0x77, 0x77, 0x77, 0x77, 0x0, - 0x0, 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xec, 0x94, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, - 0x3, 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, - 0xd, 0xe6, 0x0, 0x0, 0x0, 0x2c, 0xff, 0x70, - 0x5f, 0xff, 0xfb, 0x98, 0x9b, 0xff, 0xfd, 0x0, - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, - 0x0, 0x4, 0x9c, 0xef, 0xed, 0x94, 0x0, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x2, 0x8c, 0xef, 0xfd, 0xa4, 0x0, - 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x1d, 0xff, 0xfb, 0x86, 0x89, 0xed, 0x0, - 0x0, 0xcf, 0xfb, 0x20, 0x0, 0x0, 0x2, 0x0, - 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf3, 0x5, 0xae, 0xfe, 0xd8, 0x20, 0x0, - 0xaf, 0xf3, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0xaf, 0xfd, 0xff, 0x95, 0x46, 0xaf, 0xff, 0x60, - 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x4, 0xff, 0xe0, - 0x7f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf5, - 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, - 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, - 0xa, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf4, - 0x2, 0xff, 0xd1, 0x0, 0x0, 0x4, 0xff, 0xd0, - 0x0, 0x7f, 0xff, 0x95, 0x45, 0xaf, 0xff, 0x40, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc7, 0x10, 0x0, - - /* U+0037 "7" */ - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x2f, 0xfb, 0x77, 0x77, 0x77, 0x77, 0xcf, 0xf5, - 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, - 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, - 0x2f, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x0, 0x5a, 0xdf, 0xfd, 0xa6, 0x0, 0x0, - 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x2, 0xef, 0xfd, 0x75, 0x57, 0xdf, 0xff, 0x20, - 0xa, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xa0, - 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, - 0xf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, - 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, - 0xa, 0xff, 0x50, 0x0, 0x0, 0x5, 0xff, 0xa0, - 0x1, 0xef, 0xfa, 0x42, 0x25, 0xaf, 0xfe, 0x10, - 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xb, 0xff, 0xc5, 0x20, 0x2, 0x6d, 0xff, 0xb0, - 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf5, - 0xaf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, - 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, - 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfa, - 0x4f, 0xfd, 0x20, 0x0, 0x0, 0x2, 0xdf, 0xf5, - 0xa, 0xff, 0xfa, 0x64, 0x56, 0xaf, 0xff, 0xb0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x2, 0x7c, 0xef, 0xfe, 0xc7, 0x20, 0x0, - - /* U+0039 "9" */ - 0x0, 0x0, 0x5b, 0xef, 0xed, 0x93, 0x0, 0x0, - 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x1, 0xdf, 0xfc, 0x64, 0x58, 0xdf, 0xfa, 0x0, - 0x9, 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0x60, - 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, - 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf5, - 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, - 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfc, - 0xa, 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0xfd, - 0x2, 0xff, 0xfd, 0x75, 0x58, 0xdf, 0xee, 0xfe, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfe, 0x3e, 0xfe, - 0x0, 0x0, 0x7c, 0xef, 0xeb, 0x60, 0xf, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, - 0x0, 0x11, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x10, - 0x0, 0x8f, 0xa8, 0x67, 0xae, 0xff, 0xf3, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, - 0x0, 0x39, 0xcf, 0xff, 0xd9, 0x40, 0x0, 0x0, - - /* U+003A ":" */ - 0x2d, 0xe6, 0xa, 0xff, 0xf0, 0x9f, 0xfe, 0x1, - 0xac, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xac, 0x40, 0x9f, 0xfe, - 0xa, 0xff, 0xf0, 0x2d, 0xe6, 0x0, - - /* U+003B ";" */ - 0x2d, 0xe6, 0xa, 0xff, 0xf0, 0x9f, 0xfe, 0x1, - 0xac, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xab, 0x40, 0x8f, 0xfe, - 0x9, 0xff, 0xf0, 0x2d, 0xfc, 0x0, 0xaf, 0x60, - 0xe, 0xf1, 0x2, 0xfc, 0x0, 0x6f, 0x60, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x96, 0x0, - 0x0, 0x0, 0x0, 0x16, 0xdf, 0xf6, 0x0, 0x0, - 0x0, 0x3a, 0xff, 0xff, 0xb2, 0x0, 0x1, 0x7d, - 0xff, 0xfd, 0x71, 0x0, 0x4, 0xaf, 0xff, 0xfa, - 0x30, 0x0, 0x0, 0x2f, 0xff, 0xc6, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xfe, 0x61, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, - 0x0, 0x16, 0xdf, 0xff, 0xd7, 0x10, 0x0, 0x0, - 0x0, 0x3, 0x9f, 0xff, 0xfb, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x6c, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x39, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, - - /* U+003D "=" */ - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x3, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x31, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x31, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - - /* U+003E ">" */ - 0x1b, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x9, 0xef, - 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, - 0xff, 0xe9, 0x20, 0x0, 0x0, 0x0, 0x2, 0x8e, - 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4a, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, - 0xf6, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, 0xc3, - 0x0, 0x0, 0x5c, 0xff, 0xfe, 0x82, 0x0, 0x3, - 0x9f, 0xff, 0xfb, 0x50, 0x0, 0x0, 0x1f, 0xff, - 0xe8, 0x20, 0x0, 0x0, 0x0, 0x2f, 0xb5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x4, 0x9d, 0xef, 0xfc, 0x92, 0x0, 0x0, - 0x2b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3e, - 0xff, 0xe9, 0x76, 0x8d, 0xff, 0xf6, 0x4, 0xef, - 0x70, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x1, 0x50, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xaa, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x18, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xed, 0x10, 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xfe, - 0xb8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xcf, 0xff, 0xfe, 0xde, 0xff, 0xff, 0xc5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xd7, - 0x20, 0x0, 0x0, 0x26, 0xcf, 0xfb, 0x10, 0x0, - 0x0, 0x0, 0x1d, 0xfe, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4d, 0xfd, 0x10, 0x0, 0x0, 0x1d, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xfd, 0x10, 0x0, 0xa, 0xfc, 0x0, 0x0, - 0x18, 0xdf, 0xfd, 0x81, 0xf, 0xf8, 0xb, 0xfa, - 0x0, 0x3, 0xff, 0x20, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xe4, 0xff, 0x80, 0x1e, 0xf3, 0x0, 0xbf, - 0x80, 0x0, 0x4f, 0xff, 0x83, 0x35, 0xbf, 0xff, - 0xf8, 0x0, 0x6f, 0xb0, 0x1f, 0xf1, 0x0, 0xe, - 0xfe, 0x20, 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, - 0xef, 0x15, 0xfc, 0x0, 0x5, 0xff, 0x40, 0x0, - 0x0, 0x0, 0xaf, 0xf8, 0x0, 0xa, 0xf4, 0x8f, - 0x80, 0x0, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0x80, 0x0, 0x7f, 0x79, 0xf7, 0x0, 0xd, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf8, 0x0, - 0x5, 0xf8, 0xaf, 0x60, 0x0, 0xef, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xef, 0x80, 0x0, 0x4f, 0x99, - 0xf7, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xf8, 0x0, 0x5, 0xf8, 0x7f, 0x90, 0x0, - 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, - 0x0, 0x7f, 0x75, 0xfc, 0x0, 0x5, 0xff, 0x40, - 0x0, 0x0, 0x0, 0xaf, 0xf8, 0x0, 0xa, 0xf4, - 0x1f, 0xf1, 0x0, 0xe, 0xfe, 0x20, 0x0, 0x0, - 0x6f, 0xff, 0x90, 0x1, 0xff, 0x0, 0xbf, 0x80, - 0x0, 0x4f, 0xff, 0x83, 0x24, 0xaf, 0xfc, 0xff, - 0x53, 0xcf, 0x80, 0x3, 0xff, 0x20, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xe4, 0x4f, 0xff, 0xff, 0xc0, - 0x0, 0xa, 0xfc, 0x0, 0x0, 0x18, 0xcf, 0xfd, - 0x81, 0x0, 0x5d, 0xfe, 0x80, 0x0, 0x0, 0xd, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfe, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1a, 0xff, 0xd7, 0x30, 0x0, - 0x0, 0x37, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xcf, 0xff, 0xfe, 0xee, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x37, 0xbe, 0xff, 0xfd, 0xa6, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe9, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0x81, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0x10, 0xaf, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, - 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x6, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x60, - 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xfe, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, - 0x33, 0x33, 0x33, 0x3c, 0xff, 0x30, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1f, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, - 0x0, 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xfe, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x60, 0x5, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xd0, 0xc, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf4, - - /* U+0042 "B" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa5, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd2, 0x0, 0x1f, 0xfc, 0x44, 0x44, 0x44, 0x69, - 0xff, 0xfd, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0x60, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xa0, 0x1f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x1f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x1f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x40, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x14, 0xbf, 0xfb, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe7, 0x0, 0x1f, 0xfc, 0x44, 0x44, 0x44, - 0x45, 0x8e, 0xff, 0xa0, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x1f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x1f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xf7, 0x1f, 0xfc, 0x44, 0x44, 0x44, 0x45, 0x8e, - 0xff, 0xe1, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x20, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xda, 0x50, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xda, 0x50, - 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xe5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xda, - 0x89, 0xbf, 0xff, 0xf8, 0x0, 0x5, 0xff, 0xfb, - 0x30, 0x0, 0x0, 0x6, 0xef, 0xb0, 0x1, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0x80, 0x0, - 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x29, 0x0, - 0x0, 0x5f, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x6e, - 0xfb, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0xa8, 0x8a, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x2c, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x3, - 0x8c, 0xef, 0xed, 0xa5, 0x0, 0x0, - - /* U+0044 "D" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd4, 0x0, 0x0, 0x1f, 0xfd, 0x77, 0x77, - 0x77, 0x9c, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xf8, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x40, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xc0, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf3, 0x1f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xfa, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xfc, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x1f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xf7, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf3, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x1f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, - 0xf8, 0x0, 0x1f, 0xfd, 0x77, 0x77, 0x77, 0x9c, - 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, 0x0, 0x0, - - /* U+0045 "E" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x1f, 0xfd, 0x77, 0x77, 0x77, 0x77, 0x77, 0x50, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x1f, 0xfd, 0x66, 0x66, 0x66, 0x66, 0x63, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfd, 0x77, 0x77, 0x77, 0x77, 0x77, 0x71, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - - /* U+0046 "F" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, - 0xfd, 0x77, 0x77, 0x77, 0x77, 0x77, 0x51, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xd6, 0x66, 0x66, - 0x66, 0x66, 0x30, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xda, 0x61, - 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xff, 0xda, - 0x88, 0xae, 0xff, 0xfb, 0x0, 0x4, 0xff, 0xfc, - 0x30, 0x0, 0x0, 0x4, 0xdf, 0xd1, 0x1, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x81, 0x0, - 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0xaf, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0x38, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0x31, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x9, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, 0x1f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, - 0x0, 0x4f, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x3c, - 0xff, 0x30, 0x0, 0x5f, 0xff, 0xfd, 0xa8, 0x89, - 0xdf, 0xff, 0xe1, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x3, - 0x8c, 0xef, 0xfd, 0xa6, 0x10, 0x0, - - /* U+0048 "H" */ - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x1f, 0xfd, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x7f, 0xfc, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xfc, - - /* U+0049 "I" */ - 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, - 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, - 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, - 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, - 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, - - /* U+004A "J" */ - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x17, 0x77, - 0x77, 0x78, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x80, 0x6, 0x0, 0x0, 0x0, 0x8f, 0xf6, - 0xa, 0xf8, 0x0, 0x0, 0x1f, 0xff, 0x11, 0xdf, - 0xfd, 0x86, 0x8e, 0xff, 0xa0, 0x2, 0xcf, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5b, 0xef, 0xeb, - 0x60, 0x0, - - /* U+004B "K" */ - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xe2, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xf3, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xf4, 0x0, 0x1, 0xff, 0xb0, 0x0, - 0x0, 0x1, 0xdf, 0xf5, 0x0, 0x0, 0x1f, 0xfb, - 0x0, 0x0, 0x1, 0xdf, 0xf6, 0x0, 0x0, 0x1, - 0xff, 0xb0, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, - 0x0, 0x1f, 0xfb, 0x0, 0x0, 0xcf, 0xf8, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0xbf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0xbf, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, - 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xfb, 0x9f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x20, 0x8f, 0xfe, - 0x10, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x20, 0x0, - 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xfe, 0x20, - 0x0, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0x1, 0xff, - 0xb0, 0x0, 0x0, 0x1, 0xef, 0xf7, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, - 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xe2, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xd0, 0x1, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xb0, - - /* U+004C "L" */ - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xd7, 0x77, 0x77, 0x77, 0x77, 0x72, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x51, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - - /* U+004D "M" */ - 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xfc, 0x1f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0x1f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xfc, 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfc, 0x1f, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfc, 0x1f, - 0xfe, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xfc, 0x1f, 0xfa, 0xcf, 0xe1, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x7e, 0xfc, 0x1f, 0xfa, 0x3f, - 0xf9, 0x0, 0x0, 0x0, 0xd, 0xfd, 0xe, 0xfc, - 0x1f, 0xfa, 0x9, 0xff, 0x20, 0x0, 0x0, 0x6f, - 0xf4, 0xe, 0xfc, 0x1f, 0xfa, 0x1, 0xff, 0xb0, - 0x0, 0x0, 0xef, 0xb0, 0xe, 0xfc, 0x1f, 0xfa, - 0x0, 0x7f, 0xf5, 0x0, 0x8, 0xff, 0x20, 0xe, - 0xfc, 0x1f, 0xfa, 0x0, 0xd, 0xfe, 0x0, 0x2f, - 0xf8, 0x0, 0xe, 0xfc, 0x1f, 0xfa, 0x0, 0x4, - 0xff, 0x70, 0xbf, 0xe0, 0x0, 0xe, 0xfc, 0x1f, - 0xfa, 0x0, 0x0, 0xaf, 0xf6, 0xff, 0x60, 0x0, - 0xe, 0xfc, 0x1f, 0xfa, 0x0, 0x0, 0x2f, 0xff, - 0xfc, 0x0, 0x0, 0xe, 0xfc, 0x1f, 0xfa, 0x0, - 0x0, 0x8, 0xff, 0xf3, 0x0, 0x0, 0xe, 0xfc, - 0x1f, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xa0, 0x0, - 0x0, 0xe, 0xfc, 0x1f, 0xfa, 0x0, 0x0, 0x0, - 0x49, 0x10, 0x0, 0x0, 0xe, 0xfc, 0x1f, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xfc, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xfc, - - /* U+004E "N" */ - 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xfc, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xfc, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xfc, 0x1f, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfc, 0xdf, - 0xf9, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, - 0x2f, 0xff, 0x50, 0x0, 0x0, 0xf, 0xfc, 0x1f, - 0xfb, 0x5, 0xff, 0xf2, 0x0, 0x0, 0xf, 0xfc, - 0x1f, 0xfb, 0x0, 0x9f, 0xfd, 0x10, 0x0, 0xf, - 0xfc, 0x1f, 0xfb, 0x0, 0xc, 0xff, 0xb0, 0x0, - 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x1, 0xef, 0xf8, - 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x3f, - 0xff, 0x40, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, - 0x6, 0xff, 0xf2, 0xf, 0xfc, 0x1f, 0xfb, 0x0, - 0x0, 0x0, 0xaf, 0xfd, 0xf, 0xfc, 0x1f, 0xfb, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xaf, 0xfc, 0x1f, - 0xfb, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xfc, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xfc, - - /* U+004F "O" */ - 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xda, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xda, 0x89, 0xbf, 0xff, 0xfb, 0x10, - 0x0, 0x0, 0x4f, 0xff, 0xb3, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xc0, 0x0, 0x1, 0xef, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf9, 0x0, 0x9, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x20, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0x90, 0x5f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, - 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xf0, 0xaf, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0xaf, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xf2, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf0, 0x5f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, 0x1f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0x90, 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0x20, 0x1, 0xef, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf9, 0x0, - 0x0, 0x4f, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xc0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xda, - 0x89, 0xbf, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xda, - 0x60, 0x0, 0x0, 0x0, - - /* U+0050 "P" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x1f, 0xfd, 0x77, 0x77, 0x78, 0xaf, 0xff, - 0xf3, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xd0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0x51, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf9, 0x1f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xb1, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xfb, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0x91, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf5, 0x1f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x1, 0xff, 0xd7, - 0x77, 0x77, 0x7a, 0xff, 0xff, 0x30, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x1f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, 0xda, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xda, 0x89, 0xbf, 0xff, 0xfb, - 0x10, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x30, 0x0, - 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x1, 0xef, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf8, - 0x0, 0x0, 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf2, 0x0, 0xf, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, - 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xfd, 0x0, 0x8f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x9, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0x20, 0xaf, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x8, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xd0, 0x1, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, - 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x20, 0x0, 0x2f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x90, 0x0, - 0x0, 0x5f, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x5e, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfc, - 0x87, 0x79, 0xef, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, - 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, - 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xa5, 0x46, 0xdf, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xce, 0xfd, 0x81, 0x0, - - /* U+0052 "R" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x30, 0x0, 0x1f, 0xfd, 0x77, 0x77, 0x78, 0xaf, - 0xff, 0xf3, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xfd, 0x0, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0x50, 0x1f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, 0x1f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x1f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x90, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x50, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfe, 0x0, 0x1f, 0xfd, 0x66, 0x66, 0x67, - 0x9e, 0xff, 0xf3, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x30, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x1f, 0xfb, - 0x0, 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x1f, - 0xfb, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, 0xa0, - 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xf5, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xfe, 0x10, 0x1f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xb0, - - /* U+0053 "S" */ - 0x0, 0x0, 0x6b, 0xdf, 0xfe, 0xc8, 0x30, 0x0, - 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, - 0x4, 0xff, 0xfc, 0x86, 0x67, 0xbf, 0xff, 0x10, - 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0x69, 0x0, - 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xa6, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x5e, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, - 0x0, 0x0, 0x6b, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, - 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, - 0x5f, 0xb4, 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, - 0xaf, 0xff, 0xe9, 0x76, 0x68, 0xdf, 0xff, 0x30, - 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x5, 0x9d, 0xef, 0xed, 0xa5, 0x0, 0x0, - - /* U+0054 "T" */ - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x67, 0x77, 0x77, 0x8f, 0xfc, 0x77, 0x77, - 0x77, 0x20, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, - 0x0, 0x0, - - /* U+0055 "U" */ - 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x3f, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x3f, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf5, - 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xf5, 0x2f, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf4, 0xf, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0xc, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x7, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, - 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x20, 0x0, 0x4f, 0xff, 0xea, 0x88, 0xae, 0xff, - 0xf5, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xfe, 0x40, 0x0, 0x0, 0x0, 0x6, 0xae, 0xff, - 0xeb, 0x60, 0x0, 0x0, - - /* U+0056 "V" */ - 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xc0, 0x6f, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, 0xef, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, 0x0, - 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0x70, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0xaf, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, - 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0x20, 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, - 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5f, 0xfa, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf1, 0x0, 0x0, 0xe, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x6, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfe, - 0x0, 0x0, 0xdf, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xf5, 0x0, 0x4f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0xa, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x32, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xfa, 0x8f, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, - 0x0, 0x0, - - /* U+0057 "W" */ - 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, - 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x4, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0xe, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, 0xaf, - 0xf3, 0x0, 0x0, 0x0, 0xe, 0xfb, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, 0x4, 0xff, - 0x90, 0x0, 0x0, 0x4, 0xff, 0x4b, 0xff, 0x0, - 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0xf, 0xfe, - 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x6f, 0xf5, 0x0, - 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xf3, - 0x0, 0x0, 0xe, 0xfa, 0x1, 0xff, 0xa0, 0x0, - 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x5, 0xff, 0x80, - 0x0, 0x4, 0xff, 0x40, 0xb, 0xff, 0x0, 0x0, - 0xd, 0xfd, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x0, - 0x0, 0xaf, 0xe0, 0x0, 0x6f, 0xf4, 0x0, 0x2, - 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, 0xf3, 0x0, - 0xf, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x8f, - 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0x80, 0x4, - 0xff, 0x40, 0x0, 0xb, 0xff, 0x0, 0xd, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x0, 0xaf, - 0xe0, 0x0, 0x0, 0x5f, 0xf4, 0x2, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0xf, 0xf9, - 0x0, 0x0, 0x0, 0xff, 0x90, 0x7f, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0x85, 0xff, 0x40, - 0x0, 0x0, 0xb, 0xfe, 0xd, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xfd, 0xaf, 0xe0, 0x0, - 0x0, 0x0, 0x5f, 0xf7, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf3, 0x0, 0x0, 0x0, - - /* U+0058 "X" */ - 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xf9, 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x2f, 0xfd, 0x0, 0x0, 0x6f, 0xfc, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0xbf, 0xf7, - 0x0, 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, 0x1, - 0xef, 0xf3, 0x0, 0x4, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xd0, 0x1, 0xef, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0xaf, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xaf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xd2, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf2, - 0x6, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf7, 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x6f, 0xfb, 0x0, 0x0, 0x1e, 0xff, 0x40, 0x0, - 0x0, 0x2f, 0xfe, 0x10, 0x0, 0x0, 0x3f, 0xfe, - 0x10, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x8f, 0xfa, 0x0, 0x9, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf6, 0x4, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, - - /* U+0059 "Y" */ - 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xe0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0x50, 0x0, 0x9f, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x1e, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0x0, - 0x0, 0x6, 0xff, 0x90, 0x0, 0x0, 0x3, 0xff, - 0x80, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, - 0xd, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, - 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0x50, 0x1, 0xef, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xe0, 0x9, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x3f, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, - - /* U+005A "Z" */ - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0xdf, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x74, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, - - /* U+005B "[" */ - 0x1f, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xfc, 0x1f, - 0xfb, 0x33, 0x21, 0xff, 0xa0, 0x0, 0x1f, 0xfa, - 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, - 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x1, - 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x1, 0xff, - 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x1, 0xff, 0xa0, - 0x0, 0x1f, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, - 0x1f, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, - 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, - 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, - 0x1, 0xff, 0xb3, 0x32, 0x1f, 0xff, 0xff, 0xc1, - 0xff, 0xff, 0xfc, - - /* U+005C "\\" */ - 0x7, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x60, - - /* U+005D "]" */ - 0x7f, 0xff, 0xff, 0x67, 0xff, 0xff, 0xf6, 0x13, - 0x37, 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, - 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, - 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, 0x60, - 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, 0x60, 0x0, - 0x4f, 0xf6, 0x0, 0x4, 0xff, 0x60, 0x0, 0x4f, - 0xf6, 0x0, 0x4, 0xff, 0x60, 0x0, 0x4f, 0xf6, - 0x0, 0x4, 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, - 0x4, 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, - 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, - 0x61, 0x33, 0x7f, 0xf6, 0x7f, 0xff, 0xff, 0x67, - 0xff, 0xff, 0xf6, - - /* U+005E "^" */ - 0x0, 0x0, 0x7, 0x83, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x3f, 0xd7, 0xf9, - 0x0, 0x0, 0x0, 0xa, 0xf6, 0x1f, 0xf0, 0x0, - 0x0, 0x1, 0xff, 0x0, 0xaf, 0x60, 0x0, 0x0, - 0x8f, 0x90, 0x3, 0xfd, 0x0, 0x0, 0xe, 0xf2, - 0x0, 0xd, 0xf4, 0x0, 0x6, 0xfb, 0x0, 0x0, - 0x6f, 0xb0, 0x0, 0xdf, 0x40, 0x0, 0x0, 0xff, - 0x20, 0x4f, 0xd0, 0x0, 0x0, 0x9, 0xf9, 0xb, - 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xf0, - - /* U+005F "_" */ - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - - /* U+0060 "`" */ - 0x38, 0x87, 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, - 0x0, 0x2d, 0xfc, 0x10, 0x0, 0x0, 0xaf, 0xd1, - - /* U+0061 "a" */ - 0x0, 0x17, 0xbe, 0xff, 0xda, 0x40, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xd, 0xfe, - 0xa6, 0x56, 0xaf, 0xff, 0x60, 0x3, 0x70, 0x0, - 0x0, 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xf4, 0x0, 0x28, 0xce, 0xef, 0xff, 0xff, - 0xf4, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x2f, 0xfe, 0x51, 0x0, 0x0, 0x6f, 0xf5, 0x7f, - 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x9f, 0xf1, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x7f, 0xf5, 0x0, - 0x0, 0x2, 0xff, 0xf5, 0x2f, 0xfe, 0x50, 0x1, - 0x6e, 0xff, 0xf5, 0x5, 0xff, 0xff, 0xff, 0xff, - 0x9f, 0xf5, 0x0, 0x29, 0xef, 0xfd, 0x92, 0x3f, - 0xf5, - - /* U+0062 "b" */ - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x5, 0xbe, 0xfd, 0xb5, 0x0, 0x0, - 0x7f, 0xf5, 0xcf, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0x7f, 0xfe, 0xff, 0xa7, 0x68, 0xef, 0xff, 0x20, - 0x7f, 0xff, 0xd2, 0x0, 0x0, 0x9, 0xff, 0xd0, - 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, 0xf5, - 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, - 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, - 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, - 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, - 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xf5, - 0x7f, 0xff, 0xd2, 0x0, 0x0, 0x9, 0xff, 0xd0, - 0x7f, 0xfd, 0xff, 0xa7, 0x68, 0xef, 0xff, 0x20, - 0x7f, 0xf3, 0xcf, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0x7f, 0xf2, 0x5, 0xbe, 0xfe, 0xb5, 0x0, 0x0, - - /* U+0063 "c" */ - 0x0, 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, 0x0, - 0x1, 0xbf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, - 0xdf, 0xfe, 0x96, 0x69, 0xff, 0xf8, 0x0, 0xbf, - 0xfa, 0x0, 0x0, 0x1, 0xcf, 0x80, 0x3f, 0xfc, - 0x0, 0x0, 0x0, 0x1, 0x20, 0x8, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, - 0x1, 0x20, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x1, - 0xcf, 0x80, 0x1, 0xdf, 0xfe, 0x96, 0x69, 0xff, - 0xf8, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, - 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, - 0x0, 0x0, 0x5a, 0xdf, 0xec, 0x60, 0x2f, 0xf8, - 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfd, 0x4f, 0xf8, - 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xef, 0xf8, - 0xc, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0xf8, - 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, - 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, - 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, - 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, - 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, - 0x9f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, - 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf8, - 0xc, 0xff, 0x80, 0x0, 0x0, 0xb, 0xff, 0xf8, - 0x1, 0xef, 0xfc, 0x63, 0x47, 0xef, 0xef, 0xf8, - 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xf8, - 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x70, 0xf, 0xf8, - - /* U+0065 "e" */ - 0x0, 0x0, 0x4b, 0xdf, 0xec, 0x61, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x1, - 0xef, 0xfb, 0x64, 0x59, 0xff, 0xf4, 0x0, 0xbf, - 0xf4, 0x0, 0x0, 0x2, 0xdf, 0xe1, 0x3f, 0xf6, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x69, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xfb, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0xbf, 0xfb, 0x10, 0x0, 0x0, - 0x5e, 0x30, 0x1, 0xdf, 0xff, 0x96, 0x68, 0xcf, - 0xfc, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x0, 0x39, 0xde, 0xfe, 0xa5, 0x0, - 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x18, 0xdf, 0xeb, 0x40, 0x0, 0x1d, - 0xff, 0xff, 0xf9, 0x0, 0x9, 0xff, 0xa4, 0x49, - 0x30, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0xf, - 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0x90, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x23, 0x4f, 0xfb, 0x33, - 0x33, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1f, - 0xfa, 0x0, 0x0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x71, 0xc, 0xfc, - 0x0, 0x3d, 0xff, 0xff, 0xff, 0xfe, 0x4c, 0xfc, - 0x3, 0xff, 0xfd, 0x86, 0x68, 0xef, 0xfe, 0xfc, - 0xd, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xfc, - 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfc, - 0xaf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, - 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, - 0xaf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, - 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, - 0xd, 0xff, 0x90, 0x0, 0x0, 0x9, 0xff, 0xfc, - 0x2, 0xff, 0xfe, 0x96, 0x69, 0xef, 0xff, 0xfc, - 0x0, 0x3d, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xfb, - 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x71, 0xf, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, - 0x3, 0xe6, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, - 0xc, 0xff, 0xea, 0x76, 0x68, 0xcf, 0xff, 0x50, - 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x3, 0x8b, 0xef, 0xfe, 0xb7, 0x10, 0x0, - - /* U+0068 "h" */ - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x6, - 0xbe, 0xfe, 0xb5, 0x0, 0x7, 0xff, 0x5d, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xfe, 0x97, - 0x7a, 0xff, 0xf9, 0x7, 0xff, 0xfb, 0x0, 0x0, - 0x3, 0xff, 0xf2, 0x7f, 0xfe, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x67, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x3f, 0xf8, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x1, - 0xff, 0x97, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, - 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xa7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, 0xfa, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa7, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x7f, - 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa7, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x7f, 0xf3, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, - - /* U+0069 "i" */ - 0x5e, 0xd3, 0xdf, 0xfa, 0xbf, 0xf7, 0x6, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x7f, 0xf3, - 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, - 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, - 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, - 0x7f, 0xf3, - - /* U+006A "j" */ - 0x0, 0x0, 0x3, 0xee, 0x40, 0x0, 0x0, 0xbf, - 0xfc, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, - 0x6, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x60, - 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5, 0xff, - 0x60, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5, - 0xff, 0x60, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, - 0x5, 0xff, 0x60, 0x0, 0x0, 0x5f, 0xf6, 0x0, - 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, 0x5f, 0xf6, - 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, 0x5f, - 0xf6, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, - 0x5f, 0xf6, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, - 0x0, 0x5f, 0xf5, 0x0, 0x0, 0x9, 0xff, 0x30, - 0xb6, 0x58, 0xff, 0xe0, 0x5f, 0xff, 0xff, 0xf4, - 0x2, 0xad, 0xfe, 0xb3, 0x0, - - /* U+006B "k" */ - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x20, - 0x7f, 0xf3, 0x0, 0x0, 0x5, 0xff, 0xe2, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x6f, 0xfe, 0x20, 0x0, - 0x7f, 0xf3, 0x0, 0x7, 0xff, 0xe2, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x8f, 0xfe, 0x20, 0x0, 0x0, - 0x7f, 0xf3, 0x9, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x7f, 0xf4, 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x7f, 0xfe, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xfc, 0x5f, 0xff, 0x20, 0x0, 0x0, - 0x7f, 0xff, 0xb0, 0x8, 0xff, 0xd0, 0x0, 0x0, - 0x7f, 0xfa, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x10, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc0, - - /* U+006C "l" */ - 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, - 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, - 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, - 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, - 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, - 0x7f, 0xf3, - - /* U+006D "m" */ - 0x7f, 0xf2, 0x18, 0xce, 0xfd, 0x93, 0x0, 0x2, - 0x8d, 0xff, 0xd9, 0x20, 0x0, 0x7f, 0xf5, 0xef, - 0xff, 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x7f, 0xff, 0xfc, 0x64, 0x5a, 0xff, - 0xfa, 0xff, 0xc6, 0x45, 0xaf, 0xff, 0x30, 0x7f, - 0xff, 0x80, 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, - 0x0, 0x7, 0xff, 0xb0, 0x7f, 0xfd, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xdf, - 0xf0, 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x9f, 0xf1, 0x7f, 0xf4, - 0x0, 0x0, 0x0, 0x7, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x8f, 0xf2, 0x7f, 0xf3, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf3, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf3, 0x0, - 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x8f, 0xf3, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x7, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, - 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf3, 0x0, 0x0, - 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, - 0xf3, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf3, - 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x8f, 0xf3, - - /* U+006E "n" */ - 0x7f, 0xf2, 0x7, 0xce, 0xfe, 0xb5, 0x0, 0x7, - 0xff, 0x5e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x7f, - 0xff, 0xfd, 0x75, 0x58, 0xef, 0xf9, 0x7, 0xff, - 0xf9, 0x0, 0x0, 0x2, 0xef, 0xf2, 0x7f, 0xfd, - 0x0, 0x0, 0x0, 0x7, 0xff, 0x67, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x2f, 0xf8, 0x7f, 0xf4, 0x0, - 0x0, 0x0, 0x1, 0xff, 0x97, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x1f, 0xfa, 0x7f, 0xf3, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xa7, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x1f, 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xa7, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x1f, 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xa7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, - 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xa0, - - /* U+006F "o" */ - 0x0, 0x0, 0x4a, 0xdf, 0xed, 0x82, 0x0, 0x0, - 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xfb, 0x0, - 0xb, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0x70, - 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, - 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, - 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, - 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, - 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, - 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, - 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, - 0xb, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0x70, - 0x1, 0xdf, 0xfe, 0x96, 0x6a, 0xff, 0xfb, 0x0, - 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x4a, 0xdf, 0xed, 0x92, 0x0, 0x0, - - /* U+0070 "p" */ - 0x7f, 0xf2, 0x6, 0xbe, 0xfd, 0xb5, 0x0, 0x0, - 0x7f, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0x7f, 0xfe, 0xfe, 0x84, 0x46, 0xcf, 0xff, 0x20, - 0x7f, 0xff, 0xc1, 0x0, 0x0, 0x7, 0xff, 0xd0, - 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xf5, - 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, - 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, - 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, - 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, - 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xf5, - 0x7f, 0xff, 0xd2, 0x0, 0x0, 0x9, 0xff, 0xd0, - 0x7f, 0xfe, 0xff, 0xa7, 0x68, 0xef, 0xff, 0x20, - 0x7f, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0x7f, 0xf3, 0x5, 0xbe, 0xfe, 0xb5, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x0, 0x5a, 0xdf, 0xec, 0x60, 0xf, 0xf8, - 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfd, 0x2f, 0xf8, - 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xef, 0xf8, - 0xc, 0xff, 0xa0, 0x0, 0x0, 0x2c, 0xff, 0xf8, - 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, - 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, - 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, - 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, - 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, - 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, - 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, - 0xc, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0xf8, - 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xef, 0xf8, - 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xf8, - 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x60, 0x2f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, - - /* U+0072 "r" */ - 0x7f, 0xf2, 0x6, 0xce, 0x87, 0xff, 0x3d, 0xff, - 0xf8, 0x7f, 0xfd, 0xff, 0xc9, 0x57, 0xff, 0xfd, - 0x20, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x7, 0xff, - 0x80, 0x0, 0x0, 0x7f, 0xf5, 0x0, 0x0, 0x7, - 0xff, 0x30, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, - 0x7, 0xff, 0x30, 0x0, 0x0, 0x7f, 0xf3, 0x0, - 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x7f, 0xf3, - 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x7f, - 0xf3, 0x0, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x2, 0x9d, 0xff, 0xec, 0x83, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x5, 0xff, - 0xe8, 0x65, 0x69, 0xef, 0x20, 0xb, 0xff, 0x20, - 0x0, 0x0, 0x3, 0x0, 0xd, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xfe, 0xb8, 0x51, 0x0, - 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xd5, 0x0, - 0x0, 0x0, 0x36, 0x9c, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xef, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x5, 0x70, 0x0, - 0x0, 0x0, 0xbf, 0xf1, 0xe, 0xff, 0xa7, 0x55, - 0x7c, 0xff, 0xb0, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x38, 0xce, 0xff, 0xda, 0x50, - 0x0, - - /* U+0074 "t" */ - 0x0, 0x8, 0x85, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xfe, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x23, 0x4f, 0xfb, 0x33, 0x33, 0x0, 0x1, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xf, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xb5, 0x5a, 0x40, 0x0, 0x2e, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x19, 0xef, 0xea, - 0x30, - - /* U+0075 "u" */ - 0x9f, 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0x69, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x9f, - 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0x69, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x9f, 0xf1, - 0x0, 0x0, 0x0, 0x5, 0xff, 0x69, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x9f, 0xf1, 0x0, - 0x0, 0x0, 0x5, 0xff, 0x69, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x5f, 0xf6, 0x9f, 0xf1, 0x0, 0x0, - 0x0, 0x5, 0xff, 0x68, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x8f, 0xf6, 0x5f, 0xf7, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x61, 0xff, 0xe2, 0x0, 0x0, 0xa, - 0xff, 0xf6, 0x8, 0xff, 0xe8, 0x44, 0x6d, 0xff, - 0xff, 0x60, 0xa, 0xff, 0xff, 0xff, 0xfe, 0x5f, - 0xf6, 0x0, 0x4, 0xae, 0xfe, 0xc7, 0x2, 0xff, - 0x60, - - /* U+0076 "v" */ - 0xd, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x70, 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xf1, 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, 0x1f, - 0xf9, 0x0, 0x8, 0xff, 0x30, 0x0, 0x0, 0x7, - 0xff, 0x20, 0x0, 0x2f, 0xfa, 0x0, 0x0, 0x0, - 0xef, 0xb0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, - 0x5f, 0xf4, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, - 0xc, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x0, - 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xf5, - 0x0, 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xc0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x37, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfa, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, - - /* U+0077 "w" */ - 0xaf, 0xe0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xd4, 0xff, 0x40, 0x0, - 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xe, - 0xf7, 0xe, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xb0, 0x0, 0x0, 0x5, 0xff, 0x10, 0x8f, 0xf0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, - 0xbf, 0xb0, 0x2, 0xff, 0x50, 0x0, 0x2, 0xff, - 0x5f, 0xf6, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0xc, - 0xfb, 0x0, 0x0, 0x8f, 0xd0, 0xbf, 0xc0, 0x0, - 0x6, 0xfe, 0x0, 0x0, 0x7f, 0xf1, 0x0, 0xe, - 0xf7, 0x5, 0xff, 0x20, 0x0, 0xcf, 0x90, 0x0, - 0x1, 0xff, 0x60, 0x4, 0xff, 0x10, 0xe, 0xf8, - 0x0, 0x2f, 0xf3, 0x0, 0x0, 0xb, 0xfc, 0x0, - 0xaf, 0xb0, 0x0, 0x9f, 0xe0, 0x8, 0xfd, 0x0, - 0x0, 0x0, 0x5f, 0xf2, 0x1f, 0xf5, 0x0, 0x3, - 0xff, 0x40, 0xef, 0x70, 0x0, 0x0, 0x0, 0xef, - 0x86, 0xff, 0x0, 0x0, 0xc, 0xf9, 0x4f, 0xf1, - 0x0, 0x0, 0x0, 0x9, 0xfd, 0xcf, 0x90, 0x0, - 0x0, 0x6f, 0xfa, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, 0x0, 0x4f, - 0xfa, 0x0, 0x0, 0x0, - - /* U+0078 "x" */ - 0x1e, 0xfe, 0x10, 0x0, 0x0, 0x9, 0xff, 0x50, - 0x3, 0xff, 0xc0, 0x0, 0x0, 0x5f, 0xf9, 0x0, - 0x0, 0x6f, 0xf8, 0x0, 0x2, 0xef, 0xc0, 0x0, - 0x0, 0xa, 0xff, 0x50, 0xc, 0xff, 0x20, 0x0, - 0x0, 0x0, 0xdf, 0xe2, 0x9f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xfe, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xfa, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xc0, 0x5f, 0xf9, 0x0, 0x0, - 0x0, 0x1d, 0xfe, 0x10, 0x9, 0xff, 0x50, 0x0, - 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xdf, 0xf2, 0x0, - 0x7, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xfd, 0x0, - 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, - - /* U+0079 "y" */ - 0xd, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x70, 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xf0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x1f, - 0xf8, 0x0, 0x7, 0xff, 0x50, 0x0, 0x0, 0x8, - 0xff, 0x10, 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, - 0xef, 0xa0, 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, - 0x6f, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, - 0xd, 0xfc, 0x0, 0x0, 0x0, 0xa, 0xff, 0x10, - 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xf8, - 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xf0, 0x2f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x79, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xfe, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0xeb, 0x65, 0xaf, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x6c, 0xff, 0xd7, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+007A "z" */ - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x23, 0x33, 0x33, - 0x33, 0x8f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x30, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, - 0x33, 0x33, 0x33, 0x33, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, - - /* U+007B "{" */ - 0x0, 0x0, 0x6c, 0xff, 0x40, 0x0, 0x7f, 0xff, - 0xf4, 0x0, 0xe, 0xff, 0x73, 0x10, 0x1, 0xff, - 0xb0, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, - 0xff, 0x80, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, - 0x2, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xf8, 0x0, - 0x0, 0x2, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xf8, - 0x0, 0x1, 0x3a, 0xff, 0x50, 0x0, 0x6f, 0xff, - 0x90, 0x0, 0x6, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x7f, 0xf6, 0x0, 0x0, 0x2, 0xff, 0x80, 0x0, - 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, 0xff, 0x80, - 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, 0xff, - 0x80, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, - 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, - 0x0, 0xef, 0xf8, 0x31, 0x0, 0x6, 0xff, 0xff, - 0x40, 0x0, 0x5, 0xcf, 0xf4, - - /* U+007C "|" */ - 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, - 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, - 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, - 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, - 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, - 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, - 0x1f, 0xf7, 0x1f, 0xf7, - - /* U+007D "}" */ - 0x7f, 0xfb, 0x40, 0x0, 0x7, 0xff, 0xff, 0x40, - 0x0, 0x14, 0x9f, 0xfc, 0x0, 0x0, 0x0, 0xdf, - 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, - 0xaf, 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, - 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, - 0x0, 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xa, 0xff, - 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x30, 0x0, 0x1, - 0xbf, 0xff, 0x30, 0x0, 0x2e, 0xff, 0xf3, 0x0, - 0x9, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xf0, 0x0, - 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xf0, - 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, 0xaf, - 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, - 0xaf, 0xf0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x1, - 0x49, 0xff, 0xc0, 0x0, 0x7f, 0xff, 0xf4, 0x0, - 0x7, 0xff, 0xb4, 0x0, 0x0, - - /* U+007E "~" */ - 0x0, 0x7e, 0xfc, 0x30, 0x0, 0x2, 0xfa, 0x7, - 0xff, 0xff, 0xf6, 0x0, 0x5, 0xf8, 0xe, 0xf6, - 0x27, 0xff, 0x80, 0x1d, 0xf4, 0x3f, 0xb0, 0x0, - 0x4e, 0xff, 0xff, 0xb0, 0x5f, 0x70, 0x0, 0x1, - 0xaf, 0xfa, 0x10, - - /* U+00B0 "°" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x7e, 0xff, - 0xc4, 0x0, 0xa, 0xfa, 0x67, 0xdf, 0x50, 0x4f, - 0x80, 0x0, 0xc, 0xf0, 0x9f, 0x0, 0x0, 0x4, - 0xf5, 0xbd, 0x0, 0x0, 0x2, 0xf6, 0x9f, 0x10, - 0x0, 0x5, 0xf4, 0x3f, 0xa0, 0x0, 0x1e, 0xe0, - 0x8, 0xfd, 0x9a, 0xff, 0x40, 0x0, 0x5c, 0xfe, - 0xa2, 0x0, - - /* U+2022 "•" */ - 0x0, 0x1, 0x0, 0x4, 0xef, 0xc1, 0xe, 0xff, - 0xfb, 0x1f, 0xff, 0xfd, 0xe, 0xff, 0xfa, 0x3, - 0xcf, 0xb1, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x38, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe9, 0xbf, 0xff, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x73, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x10, 0x0, 0x0, - 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, - 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, - 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0x7a, 0xcb, - 0xcf, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, - 0x33, 0x2f, 0xff, 0x80, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3, 0xcf, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x7, 0xef, 0xff, 0xfb, 0x20, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x32, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x27, 0xaa, 0x95, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F008 "" */ - 0x9b, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb9, 0xfe, 0x44, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x44, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x88, 0x8f, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x88, 0xff, - 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, 0xfc, 0x0, - 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xb0, 0x0, 0xcf, 0xfd, 0x0, 0xd, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xcc, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xfc, 0xcc, 0xff, 0xfc, 0x0, - 0xc, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xff, 0xc0, 0x0, 0xcf, 0xfc, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0xcf, 0xfc, 0x0, 0xc, 0xff, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xff, 0xc0, 0x0, 0xcf, - 0xff, 0xcc, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xfc, 0xcc, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xd, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, - 0x0, 0xdf, 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, - 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, 0xff, 0x88, - 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf8, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x44, 0x4e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x44, 0xef, - 0xab, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb9, - - /* U+F00B "" */ - 0x9f, 0xff, 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xfc, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, - 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0xfc, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfc, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x9f, 0xff, 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xe9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x8e, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xa, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xf6, 0x6, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xe7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x2d, 0xfa, 0x0, 0x6f, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xa0, 0xef, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf2, - 0xcf, 0xff, 0xff, 0xf5, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xf1, 0x2e, 0xff, 0xff, 0xff, 0x50, 0x2e, - 0xff, 0xff, 0xff, 0x50, 0x2, 0xef, 0xff, 0xff, - 0xf7, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xf6, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0x40, 0x2e, 0xff, 0xff, 0xff, 0x50, - 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xf1, 0xef, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xf2, 0x6f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xa0, 0x6, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, 0x96, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xa8, 0x0, 0x3, - 0xff, 0xff, 0x30, 0x0, 0x8a, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0x60, 0x3, 0xff, 0xff, - 0x30, 0x6, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xe0, 0x3, 0xff, 0xff, 0x30, 0xe, - 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xe0, 0x3, 0xff, 0xff, 0x30, 0xe, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x30, 0x3, - 0xff, 0xff, 0x30, 0x3, 0xef, 0xff, 0xf9, 0x0, - 0x2, 0xff, 0xff, 0xe2, 0x0, 0x3, 0xff, 0xff, - 0x30, 0x0, 0x2e, 0xff, 0xff, 0x20, 0x9, 0xff, - 0xff, 0x50, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, - 0x5, 0xff, 0xff, 0x90, 0xe, 0xff, 0xfc, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0xcf, - 0xff, 0xe0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x6f, 0xff, 0xf3, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x30, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x7f, 0xff, - 0xe0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, - 0x0, 0xe, 0xff, 0xf8, 0x8f, 0xff, 0xd0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0xd, - 0xff, 0xf8, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0xef, 0xfe, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf7, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2, 0x20, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x3f, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf3, 0xe, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xe0, 0x9, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, - 0x2, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0x20, 0x0, 0x9f, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xf9, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfa, - 0x75, 0x57, 0xaf, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, - 0xff, 0xfe, 0xd9, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0xff, 0xff, 0xd6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xc8, 0x0, 0x5d, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6d, 0x40, - 0x0, 0x0, 0xcf, 0xfe, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xcf, 0xfe, 0x20, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xe7, 0x32, 0x5d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x13, 0xcf, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xfe, 0x60, 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xfb, 0x10, 0x0, - 0x4, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xfb, 0x10, 0x3, 0xcf, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xfe, 0x60, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xe7, 0x32, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0xcf, 0xfe, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xcf, 0xfe, 0x10, 0x0, 0x1, - 0xc8, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x5d, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2c, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, - 0x60, 0x0, 0x0, 0x48, 0x88, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xfd, 0x10, 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xe3, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0x60, 0xbf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, - 0xcf, 0xff, 0xf9, 0xbf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x30, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xd2, 0x3, - 0x10, 0x7f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xbf, 0xff, 0xfa, 0x0, 0x8f, - 0xd2, 0x4, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0x80, 0xb, 0xff, - 0xff, 0x40, 0x2d, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xf5, 0x2, 0xdf, 0xff, - 0xff, 0xf7, 0x1, 0xbf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xfe, 0x30, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x9, 0xff, 0xff, 0xc1, 0x0, - 0xa, 0xff, 0xff, 0xc1, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xfe, 0x30, - 0xbf, 0xff, 0xfa, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x4, 0xef, 0xff, 0xf4, - 0xbf, 0xff, 0x70, 0x1b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x2d, 0xff, 0xf3, - 0xd, 0xf4, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xbf, 0x60, - 0x1, 0x20, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x55, 0x55, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdd, 0xdd, 0xef, - 0xff, 0xff, 0xfe, 0xdd, 0xdd, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x10, 0x8, - 0xff, 0xff, 0x80, 0x1, 0x11, 0x11, 0x11, 0x10, - 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8f, 0xf8, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x6, 0x60, 0x2d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 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, 0xf4, - 0x1e, 0xb0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2e, 0xc1, - 0x8f, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, - - /* U+F01C "" */ - 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xd8, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x9f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x30, 0x0, - 0x0, 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, - 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, - 0xa, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x20, - 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, - 0xdf, 0xff, 0xb8, 0x88, 0x88, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x48, 0x88, 0x88, 0x8e, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x58, 0x86, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x9d, 0xef, 0xfe, 0xb7, 0x20, - 0x0, 0x0, 0xdf, 0xff, 0x0, 0x0, 0x0, 0x6, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, - 0xdf, 0xff, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0xcf, 0xff, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xef, - 0xff, 0xff, 0xff, 0xe3, 0xbf, 0xff, 0x0, 0x2, - 0xef, 0xff, 0xff, 0x94, 0x0, 0x0, 0x4b, 0xff, - 0xff, 0xfe, 0xdf, 0xff, 0x0, 0xd, 0xff, 0xff, - 0xc2, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x11, 0x0, 0x8, 0xff, 0xff, 0xff, 0x9, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xee, 0xff, 0xff, 0xff, 0xe, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x2b, 0xcc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xbc, 0xb2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xe0, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x11, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xb2, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, - 0xd0, 0x0, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xa4, - 0x0, 0x0, 0x4a, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0xff, 0xfb, 0x3e, 0xff, 0xff, 0xff, 0xfe, 0xef, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, 0xfc, - 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x10, 0x0, 0x0, 0xff, 0xfd, 0x0, 0x3, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x2, 0x7c, - 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x68, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xb6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0x38, 0x88, 0x88, 0x8f, 0xff, 0xff, - 0xff, 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, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3b, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x38, - 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x1, 0xb9, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x6f, 0xfc, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xcf, - 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xef, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xdf, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0xbf, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x6f, 0xfd, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, 0xdb, 0x10, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x18, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb6, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, - 0x0, 0x0, 0x21, 0x0, 0x1c, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, - 0x0, 0x4, 0xfe, 0x50, 0x1, 0xef, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x0, - 0x0, 0x5, 0xff, 0xf6, 0x0, 0x4f, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x40, 0xa, 0xff, 0x40, - 0x38, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xe0, 0x2, 0xff, 0xa0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x1c, 0xa1, 0x0, 0x8f, 0xf6, 0x0, 0xcf, 0xf0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x6f, 0xfd, 0x0, 0x1f, 0xfc, 0x0, 0x8f, 0xf2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x1c, 0xff, 0x80, 0xa, 0xff, 0x0, 0x4f, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xdf, 0xd0, 0x7, 0xff, 0x20, 0x3f, 0xf7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xaf, 0xf0, 0x6, 0xff, 0x30, 0x2f, 0xf7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xdf, 0xd0, 0x7, 0xff, 0x20, 0x3f, 0xf7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x1c, 0xff, 0x80, 0xa, 0xff, 0x0, 0x4f, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x6f, 0xfd, 0x0, 0x1f, 0xfc, 0x0, 0x8f, 0xf2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x1c, 0xa1, 0x0, 0x9f, 0xf6, 0x0, 0xdf, 0xe0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xe0, 0x3, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x40, 0xa, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, - 0x0, 0x5, 0xff, 0xf6, 0x0, 0x4f, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, - 0x0, 0x4, 0xfe, 0x50, 0x1, 0xef, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, - 0x0, 0x0, 0x21, 0x0, 0x1d, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x18, 0x50, 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x93, 0x27, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xd8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x3, 0xdf, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x3e, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x3, 0xef, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x3b, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x0, 0x39, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0xff, 0xfa, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, 0xf8, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xdf, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x9f, 0xff, 0x20, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x4f, 0xff, 0xb0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xc, 0xff, - 0xfa, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xfe, 0x10, - 0x2, 0xff, 0xff, 0xd6, 0x10, 0xbf, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x18, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x67, 0x64, 0x0, 0x0, - 0x0, 0x0, - - /* U+F048 "" */ - 0x48, 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0x70, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xf9, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xfc, 0xbf, 0xff, - 0x30, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfc, 0xbf, - 0xff, 0x30, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xbf, 0xff, 0x30, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xbf, 0xff, 0x37, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xbf, 0xff, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, - 0xff, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xbf, 0xff, 0x31, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xbf, 0xff, 0x30, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xfc, 0xbf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfc, 0xbf, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, - 0x9f, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3d, - 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F04B "" */ - 0x3, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x74, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x1a, 0xef, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x1a, - 0xef, 0xff, 0xff, 0xd5, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0x66, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x4, 0x89, 0x99, 0x98, - 0x71, 0x0, 0x0, 0x4, 0x89, 0x99, 0x98, 0x71, - 0x0, - - /* U+F04D "" */ - 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x60, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x1a, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, - 0x0, - - /* U+F051 "" */ - 0x5, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, - 0x87, 0x5f, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x7f, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x7f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x1c, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9a, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x1, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x93, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - - /* U+F054 "" */ - 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xa8, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x23, 0x33, 0x33, 0x33, - 0x8f, 0xff, 0xfe, 0x33, 0x33, 0x33, 0x33, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8d, 0xdc, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F068 "" */ - 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x10, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe1, 0x1, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xef, - 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xba, - 0xbd, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xfd, 0x50, 0x0, - 0x0, 0x18, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x39, - 0x95, 0x0, 0x2, 0xef, 0xff, 0xff, 0x70, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3f, - 0xff, 0xd2, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, - 0x7, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, - 0xff, 0xfe, 0x10, 0xd, 0xff, 0xff, 0xff, 0x20, - 0x2f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xc0, - 0xbf, 0xff, 0xff, 0xff, 0x0, 0x48, 0x6b, 0xff, - 0xff, 0xff, 0xd0, 0x5, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xff, 0xf9, - 0xbf, 0xff, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x5, 0xff, 0xff, 0xff, 0xf5, - 0x1f, 0xff, 0xff, 0xff, 0x20, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, 0xc0, - 0x6, 0xff, 0xff, 0xff, 0x70, 0x8, 0xff, 0xff, - 0xff, 0xff, 0x20, 0xd, 0xff, 0xff, 0xff, 0x20, - 0x0, 0xaf, 0xff, 0xff, 0xe0, 0x0, 0xaf, 0xff, - 0xff, 0xf4, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xfb, 0x0, 0x4, 0xad, - 0xc8, 0x10, 0x2, 0xef, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xfd, 0x50, 0x0, - 0x0, 0x18, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xba, - 0xac, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xff, - 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x4, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x26, 0xad, 0xff, 0xed, - 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0xfa, 0x16, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xba, 0xbe, 0xff, 0xff, 0xfe, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xc5, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1b, 0xff, 0xff, 0xc1, 0x6, 0xba, 0x50, - 0x0, 0x7f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe4, 0x7f, - 0xff, 0xc1, 0x0, 0xbf, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0xad, 0x20, 0x0, 0x4, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xc0, 0x3, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0xe, 0xff, - 0xff, 0xff, 0x50, 0x0, 0xe, 0xff, 0xff, 0x90, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0xbf, 0xff, 0xff, 0xfe, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xc2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xb0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xfa, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x1b, 0xff, 0xff, 0xd2, 0xe, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xc4, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, - 0xfe, 0xba, 0xb5, 0x0, 0x0, 0x2d, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x37, 0xbd, 0xef, 0xfd, 0xb4, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x44, 0x0, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x87, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0x80, 0x0, 0x1e, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xef, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0x70, 0x0, 0xf, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x13, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x48, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x98, 0x71, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xe3, 0x0, 0x24, 0x44, 0x44, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x44, 0x4f, 0xff, 0xfe, 0x30, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x12, 0x22, 0x26, 0xff, 0xff, 0xa0, 0x1d, 0xff, - 0xff, 0xd2, 0x2f, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x7f, 0xfb, 0x1, 0xdf, 0xff, 0xfd, 0x10, - 0xf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xc0, 0xc, 0xff, 0xff, 0xe2, 0x0, 0xe, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xfe, 0x20, 0x0, 0x4, 0x81, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x4, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xf5, 0x5, 0xe2, 0x0, 0xe, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0x60, 0x4f, 0xfd, 0x10, 0xf, 0xff, 0xe2, 0x0, - 0x12, 0x22, 0x26, 0xff, 0xff, 0xf7, 0x3, 0xff, - 0xff, 0xd2, 0x2f, 0xff, 0xfe, 0x20, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x1, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x24, 0x44, - 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0x44, - 0x4f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xb2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xfa, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x3f, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xe2, 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe0, 0x9f, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0x11, 0xdf, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x1, - 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3b, 0x50, 0x0, - - /* U+F078 "" */ - 0x1, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3b, 0x60, 0x1, 0xdf, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x60, 0x9f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0x16, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xd0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x8, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x3f, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, - 0x0, 0x0, 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xf4, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xef, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, - 0x0, 0x0, 0xf, 0xff, 0xf4, 0xef, 0xf9, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0x90, 0x0, 0x0, 0x7f, 0xf5, 0xe, 0xff, - 0x90, 0xaf, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x32, 0x0, - 0xef, 0xf9, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x80, - 0xe, 0xff, 0x90, 0x2a, 0x70, 0x0, 0x0, 0xe, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xa0, 0xef, 0xf9, 0x2e, 0xff, 0x60, 0x0, - 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x9e, 0xff, 0xad, 0xff, 0xf9, - 0x0, 0x0, 0xe, 0xff, 0xc7, 0x77, 0x77, 0x77, - 0x77, 0x73, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x3, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xdb, 0x0, 0x0, - 0x0, - - /* U+F07B "" */ - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, 0x87, 0x30, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0xcf, - 0xff, 0xff, 0xf6, 0x22, 0x22, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x0, 0xbf, - 0xff, 0xff, 0xf4, 0x0, 0x11, 0x11, 0x11, 0x10, - 0xbf, 0xff, 0xff, 0xff, 0xc0, 0xaf, 0xff, 0xff, - 0xf3, 0xc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x18, 0x99, 0x99, 0x60, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xcc, 0xcc, 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, 0xf4, - 0x1e, 0xb0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2e, 0xc1, - 0x8f, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x62, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xfe, 0xb7, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x26, 0x10, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x5, 0xef, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, - 0x76, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C4 "" */ - 0x0, 0x5, 0x99, 0x72, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xb8, - 0x10, 0x1e, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xfe, 0x38, 0xff, 0xff, - 0xef, 0xff, 0xf1, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xf4, 0xdf, 0xfe, 0x10, 0x7f, 0xff, 0x50, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xf5, 0xf, 0xff, - 0x80, 0x0, 0xff, 0xf7, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xf5, 0x0, 0xef, 0xfc, 0x0, 0x4f, 0xff, - 0x60, 0x2, 0xef, 0xff, 0xff, 0xf5, 0x0, 0xa, - 0xff, 0xfd, 0xbf, 0xff, 0xf4, 0x3, 0xef, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xe5, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x18, 0xcd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x99, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, 0xff, 0xef, - 0xff, 0xf6, 0x5, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0xdf, 0xfe, 0x10, 0x7f, 0xff, 0x50, 0x5, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0xf, 0xff, 0x80, - 0x0, 0xff, 0xf7, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0xef, 0xfc, 0x0, 0x4f, 0xff, 0x60, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xe2, 0xa, 0xff, - 0xfd, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xe2, 0x2f, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, - 0x4f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xbe, 0xfb, 0x30, 0x0, 0x18, 0xcd, 0xb5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, - 0x42, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0xeb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xe, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xe, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xef, 0xff, 0xf4, 0xaf, 0xff, 0xf4, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xbb, 0xbb, 0xb3, 0xff, 0xff, 0xf4, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, - 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, - 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, - 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf5, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x37, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x60, 0x0, - 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x87, 0x20, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0xf, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0x30, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfe, 0xf, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xf3, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xf4, 0xff, 0xfd, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x7e, 0xff, 0xff, - 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x82, 0x15, 0xef, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xa9, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x1a, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, - 0x0, - - /* U+F0C9 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xa2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x61, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xed, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0E0 "" */ - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x0, 0xe5, 0x1, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x5e, - 0xff, 0x90, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x9, 0xff, 0xff, 0xfd, - 0x20, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd3, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x6, 0xff, - 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x30, 0x2d, 0xff, 0xff, - 0xd2, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x7e, 0xe7, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb1, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x95, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, - - /* U+F0E7 "" */ - 0x0, 0x8, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x0, 0x1, 0x43, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x49, 0x99, 0x99, 0xff, 0xef, 0xfe, 0x99, - 0x99, 0x81, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xa0, 0x1e, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x1, 0xef, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xfc, 0x64, 0x44, 0x44, 0x44, - 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0x20, 0xaf, 0xff, 0xff, - 0xff, 0xa0, 0xd6, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0xe, 0xf6, - 0x0, 0xf, 0xff, 0xff, 0xff, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0xef, 0xf6, 0x0, 0xff, 0xff, - 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0xe, - 0xff, 0xf6, 0xf, 0xff, 0xff, 0xff, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0xef, 0xff, 0xf3, 0xff, - 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, - 0x4, 0x44, 0x44, 0x1f, 0xff, 0xff, 0xff, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, - 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, - 0xff, 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xff, 0xf0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x42, 0x0, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x8d, 0xff, 0xfa, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x15, 0x73, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xff, 0xfd, 0x88, 0x9f, 0xf8, 0x88, 0xff, 0x98, - 0x8e, 0xfa, 0x88, 0xbf, 0xd8, 0x89, 0xff, 0xf8, - 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0xcf, 0x0, - 0xa, 0xf1, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, - 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0xcf, 0x0, - 0xa, 0xf1, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, - 0xff, 0xf9, 0x0, 0x1f, 0xd0, 0x0, 0xdf, 0x10, - 0xc, 0xf3, 0x0, 0x6f, 0x90, 0x1, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xdc, 0xce, 0xfe, 0xcc, 0xdf, - 0xfc, 0xcd, 0xff, 0xcc, 0xcf, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x3f, - 0x80, 0x0, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x2f, - 0x80, 0x0, 0xed, 0x0, 0xa, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x3f, - 0x80, 0x0, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xdc, 0xce, 0xfe, 0xcc, 0xdf, - 0xfc, 0xcd, 0xff, 0xcc, 0xcf, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xf9, 0x0, 0x1f, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0x90, 0x1, 0xff, 0xf8, - 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, - 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, - 0xff, 0xfd, 0x88, 0x9f, 0xf8, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0xbf, 0xd8, 0x89, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xef, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x18, 0xef, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x4, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x4d, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x17, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F15B "" */ - 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x30, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xf, 0xa0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0xff, 0xa0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, - 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xa0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xb, 0xbb, 0xbb, 0xbb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x14, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x10, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x69, 0xab, 0xcb, 0xa9, 0x63, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xba, - 0xaa, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xc7, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x37, 0xcf, 0xff, 0xff, - 0xff, 0xd1, 0x3, 0xef, 0xff, 0xff, 0xf9, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, - 0xff, 0xff, 0xff, 0xe3, 0xef, 0xff, 0xff, 0xb2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xbf, 0xff, 0xff, 0xe7, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x7, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x48, 0xbe, 0xff, - 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x2d, 0xf7, - 0x0, 0x4, 0x10, 0x0, 0x0, 0x18, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, - 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xc8, 0x76, 0x78, 0xcf, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xdb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4, - 0xff, 0xff, 0xff, 0xff, 0x80, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8f, 0xff, 0xff, - 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, - 0xff, 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, - 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F241 "" */ - 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F242 "" */ - 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F243 "" */ - 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, - 0xef, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xf8, 0xe, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F244 "" */ - 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5e, 0xfe, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x23, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xcd, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xe1, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0x50, 0x0, 0x7, 0xa7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x10, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xef, 0xfc, 0x20, 0x0, 0xc, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xe1, 0x0, 0x4f, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xfb, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xfa, - 0x35, 0xef, 0x94, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x4d, 0xff, 0xf7, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0xef, 0xff, 0xff, 0xfe, 0xbb, 0xbb, 0xbc, 0xff, - 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xff, - 0xfe, 0x50, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0xe, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xb2, 0x0, 0x0, 0x0, 0x58, - 0x73, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0x20, 0x6, 0xdd, 0xdd, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xc0, 0x9, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xde, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x19, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x34, 0x32, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xef, - 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xc7, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xc0, 0x9, 0xff, 0xff, - 0xff, 0x50, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0xaf, 0xff, 0xff, 0xb0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0xb, 0xff, 0xff, 0xf1, - 0x6, 0xff, 0xff, 0xaf, 0xff, 0xc0, 0x39, 0x0, - 0xcf, 0xff, 0xf5, 0xa, 0xff, 0xf9, 0x3, 0xef, - 0xc0, 0x3f, 0x90, 0x1d, 0xff, 0xf8, 0xc, 0xff, - 0xfd, 0x10, 0x3e, 0xc0, 0x2f, 0xb0, 0xc, 0xff, - 0xfa, 0xe, 0xff, 0xff, 0xd1, 0x3, 0xb0, 0x2b, - 0x0, 0xaf, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xfd, - 0x10, 0x10, 0x0, 0x9, 0xff, 0xff, 0xfd, 0xf, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x5, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfe, - 0xf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xfb, 0x0, - 0x20, 0x11, 0x4, 0xff, 0xff, 0xfd, 0xe, 0xff, - 0xff, 0xb0, 0x5, 0xc0, 0x2d, 0x10, 0x5f, 0xff, - 0xfc, 0xc, 0xff, 0xfb, 0x0, 0x5f, 0xc0, 0x2f, - 0xd0, 0x7, 0xff, 0xfa, 0x9, 0xff, 0xfb, 0x5, - 0xff, 0xc0, 0x3f, 0x60, 0x1d, 0xff, 0xf7, 0x5, - 0xff, 0xff, 0xdf, 0xff, 0xc0, 0x36, 0x1, 0xdf, - 0xff, 0xf4, 0x1, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x1d, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xd0, 0x1, 0xdf, 0xff, 0xff, 0xa0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xd0, 0x1d, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xd1, 0xcf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xec, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x58, 0xab, 0xba, 0x84, 0x0, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, 0x44, 0x43, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x58, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x88, 0x88, 0x88, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x28, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x86, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x4f, 0xff, 0xf5, 0x5f, 0xff, 0x92, - 0xff, 0xfc, 0x1c, 0xff, 0xfc, 0x0, 0x4, 0xff, - 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, 0xa0, 0xaf, - 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, 0x2f, 0xff, - 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, 0x0, 0x4, - 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, 0xa0, - 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, 0x2f, - 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, 0x0, - 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, - 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, - 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, - 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, - 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, - 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, - 0xfc, 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, - 0xe, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, - 0xff, 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, - 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, - 0xf6, 0xe, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, - 0x4f, 0xff, 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, - 0xa, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0x55, - 0xff, 0xf9, 0x2f, 0xff, 0xc1, 0xcf, 0xff, 0xc0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x4, - 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x61, 0x0, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x66, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xec, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfc, 0x0, - 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xfc, 0x0, 0xbf, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xfc, 0x0, 0xbf, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0xbe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xec, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x76, - 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd5, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0xff, - 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x8, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x8, 0xff, 0x80, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x8, 0x80, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, 0x80, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x8, 0xff, - 0x80, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8, - 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x99, 0xff, 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, - 0x87, 0x50, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x2e, 0xff, 0x20, 0x1f, 0xa0, - 0xe, 0xd0, 0x8, 0xff, 0xf0, 0x2e, 0xff, 0xf2, - 0x1, 0xfa, 0x0, 0xed, 0x0, 0x8f, 0xff, 0x3e, - 0xff, 0xff, 0x20, 0x1f, 0xa0, 0xe, 0xd0, 0x8, - 0xff, 0xfe, 0xff, 0xff, 0xf2, 0x1, 0xfa, 0x0, - 0xed, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x1f, 0xa0, 0xe, 0xd0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x24, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, - 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x5c, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, - 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, 0x9f, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x0, 0xaf, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x10, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, - 0xfe, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x10, 0x0, 0x1c, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 121, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 120, .box_w = 5, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 50, .adv_w = 175, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, - {.bitmap_index = 86, .adv_w = 315, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 276, .adv_w = 278, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 484, .adv_w = 378, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 704, .adv_w = 307, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 893, .adv_w = 94, .box_w = 4, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, - {.bitmap_index = 909, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 1000, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 1091, .adv_w = 179, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 1152, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 1243, .adv_w = 102, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1263, .adv_w = 172, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 1277, .adv_w = 102, .box_w = 5, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1287, .adv_w = 158, .box_w = 12, .box_h = 27, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 1449, .adv_w = 299, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1619, .adv_w = 166, .box_w = 8, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1699, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1859, .adv_w = 256, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2009, .adv_w = 300, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2189, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2349, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2509, .adv_w = 268, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2669, .adv_w = 289, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2829, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2989, .adv_w = 102, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3027, .adv_w = 102, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 3075, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 3166, .adv_w = 261, .box_w = 14, .box_h = 9, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 3229, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 3320, .adv_w = 257, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3470, .adv_w = 463, .box_w = 27, .box_h = 25, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 3808, .adv_w = 328, .box_w = 22, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 4028, .adv_w = 339, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4208, .adv_w = 324, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4398, .adv_w = 370, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4598, .adv_w = 300, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4758, .adv_w = 284, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4908, .adv_w = 346, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5098, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5278, .adv_w = 139, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5318, .adv_w = 230, .box_w = 13, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 5448, .adv_w = 322, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5638, .adv_w = 266, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5788, .adv_w = 428, .box_w = 22, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6008, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6188, .adv_w = 376, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6408, .adv_w = 323, .box_w = 17, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6578, .adv_w = 376, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 6854, .adv_w = 326, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7034, .adv_w = 278, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7194, .adv_w = 263, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7364, .adv_w = 354, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7544, .adv_w = 319, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 7754, .adv_w = 504, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8064, .adv_w = 302, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8254, .adv_w = 290, .box_w = 20, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 8454, .adv_w = 294, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8624, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 8715, .adv_w = 158, .box_w = 13, .box_h = 27, .ofs_x = -2, .ofs_y = -3}, - {.bitmap_index = 8891, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 8982, .adv_w = 261, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 9060, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9074, .adv_w = 269, .box_w = 8, .box_h = 4, .ofs_x = 3, .ofs_y = 17}, - {.bitmap_index = 9090, .adv_w = 268, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9195, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9363, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9476, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9644, .adv_w = 274, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9757, .adv_w = 158, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9873, .adv_w = 309, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 10033, .adv_w = 305, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10191, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10233, .adv_w = 127, .box_w = 9, .box_h = 26, .ofs_x = -3, .ofs_y = -5}, - {.bitmap_index = 10350, .adv_w = 276, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10518, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10560, .adv_w = 474, .box_w = 26, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10755, .adv_w = 305, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10868, .adv_w = 284, .box_w = 16, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10988, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 11148, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 11308, .adv_w = 184, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11376, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11481, .adv_w = 185, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11586, .adv_w = 303, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11699, .adv_w = 250, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 11827, .adv_w = 403, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12015, .adv_w = 247, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12135, .adv_w = 250, .box_w = 17, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 12305, .adv_w = 233, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 12403, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 12520, .adv_w = 134, .box_w = 4, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 12572, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 12689, .adv_w = 261, .box_w = 14, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 12724, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 11}, - {.bitmap_index = 12774, .adv_w = 141, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 12792, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 13198, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13492, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13842, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14136, .adv_w = 308, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14346, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 14752, .adv_w = 448, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 15144, .adv_w = 504, .box_w = 32, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15544, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 15950, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16286, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 16692, .adv_w = 224, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 16853, .adv_w = 336, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 17095, .adv_w = 504, .box_w = 32, .box_h = 27, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 17527, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17821, .adv_w = 308, .box_w = 20, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 18111, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 18345, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 18708, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19021, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19334, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 19568, .adv_w = 392, .box_w = 26, .box_h = 25, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 19893, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 20093, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 20293, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20606, .adv_w = 392, .box_w = 25, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 20694, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 21030, .adv_w = 560, .box_w = 35, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 21538, .adv_w = 504, .box_w = 33, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 22017, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22367, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 22555, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 22743, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23128, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23422, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 23828, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 24249, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24562, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 24925, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25238, .adv_w = 392, .box_w = 25, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 25526, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 25820, .adv_w = 280, .box_w = 19, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 26096, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 26459, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 26822, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 27158, .adv_w = 448, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 27593, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 27898, .adv_w = 560, .box_w = 35, .box_h = 26, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28353, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 28686, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 29019, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 29352, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 29685, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 30018, .adv_w = 560, .box_w = 36, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 30432, .adv_w = 392, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 30751, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 31114, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 31535, .adv_w = 560, .box_w = 35, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 31903, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 32208, .adv_w = 451, .box_w = 29, .box_h = 19, .ofs_x = 0, .ofs_y = 1} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 4, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 20, 0, 12, -10, 0, 0, - 0, 0, -25, -27, 3, 21, 10, 8, - -18, 3, 22, 1, 19, 4, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 27, 4, -3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 0, -13, 0, 0, 0, 0, - 0, -9, 8, 9, 0, 0, -4, 0, - -3, 4, 0, -4, 0, -4, -2, -9, - 0, 0, 0, 0, -4, 0, 0, -6, - -7, 0, 0, -4, 0, -9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - -4, 0, -7, 0, -12, 0, -54, 0, - 0, -9, 0, 9, 13, 0, 0, -9, - 4, 4, 15, 9, -8, 9, 0, 0, - -26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -17, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -12, -5, -22, 0, -18, - -3, 0, 0, 0, 0, 1, 17, 0, - -13, -4, -1, 1, 0, -8, 0, 0, - -3, -33, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -36, -4, 17, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -18, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 15, - 0, 4, 0, 0, -9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 4, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -17, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, - 9, 4, 13, -4, 0, 0, 9, -4, - -15, -61, 3, 12, 9, 1, -6, 0, - 16, 0, 14, 0, 14, 0, -42, 0, - -5, 13, 0, 15, -4, 9, 4, 0, - 0, 1, -4, 0, 0, -8, 36, 0, - 36, 0, 13, 0, 19, 6, 8, 13, - 0, 0, 0, -17, 0, 0, 0, 0, - 1, -3, 0, 3, -8, -6, -9, 3, - 0, -4, 0, 0, 0, -18, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -29, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, -25, 0, -28, 0, 0, 0, - 0, -3, 0, 44, -5, -6, 4, 4, - -4, 0, -6, 4, 0, 0, -24, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -43, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -28, 0, 27, 0, 0, -17, 0, - 15, 0, -30, -43, -30, -9, 13, 0, - 0, -30, 0, 5, -10, 0, -7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 12, 13, -55, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 21, 0, 3, 0, 0, 0, - 0, 0, 3, 3, -5, -9, 0, -1, - -1, -4, 0, 0, -3, 0, 0, 0, - -9, 0, -4, 0, -10, -9, 0, -11, - -15, -15, -9, 0, -9, 0, -9, 0, - 0, 0, 0, -4, 0, 0, 4, 0, - 3, -4, 0, 1, 0, 0, 0, 4, - -3, 0, 0, 0, -3, 4, 4, -1, - 0, 0, 0, -9, 0, -1, 0, 0, - 0, 0, 0, 1, 0, 6, -3, 0, - -5, 0, -8, 0, 0, -3, 0, 13, - 0, 0, -4, 0, 0, 0, 0, 0, - -1, 1, -3, -3, 0, 0, -4, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, -2, 0, -4, -5, 0, - 0, 0, 0, 0, 1, 0, 0, -3, - 0, -4, -4, -4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -3, 0, 0, - 0, 0, -3, -6, 0, -7, 0, -13, - -3, -13, 9, 0, 0, -9, 4, 9, - 12, 0, -11, -1, -5, 0, -1, -21, - 4, -3, 3, -24, 4, 0, 0, 1, - -23, 0, -24, -4, -39, -3, 0, -22, - 0, 9, 13, 0, 6, 0, 0, 0, - 0, 1, 0, -8, -6, 0, -13, 0, - 0, 0, -4, 0, 0, 0, -4, 0, - 0, 0, 0, 0, -2, -2, 0, -2, - -6, 0, 0, 0, 0, 0, 0, 0, - -4, -4, 0, -3, -5, -4, 0, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, -4, 0, -5, - 0, -3, 0, -9, 4, 0, 0, -5, - 2, 4, 4, 0, 0, 0, 0, 0, - 0, -3, 0, 0, 0, 0, 0, 3, - 0, 0, -4, 0, -4, -3, -5, 0, - 0, 0, 0, 0, 0, 0, 4, 0, - -4, 0, 0, 0, 0, -5, -7, 0, - -9, 0, 13, -3, 1, -14, 0, 0, - 12, -22, -23, -19, -9, 4, 0, -4, - -29, -8, 0, -8, 0, -9, 7, -8, - -29, 0, -12, 0, 0, 2, -1, 4, - -3, 0, 4, 0, -13, -17, 0, -22, - -11, -9, -11, -13, -5, -12, -1, -9, - -12, 3, 0, 1, 0, -4, 0, 0, - 0, 3, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - 0, -2, 0, -1, -4, 0, -8, -10, - -10, -1, 0, -13, 0, 0, 0, 0, - 0, 0, -4, 0, 0, 0, 0, 2, - -3, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 22, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, 0, 0, - -9, 0, 0, 0, 0, -22, -13, 0, - 0, 0, -7, -22, 0, 0, -4, 4, - 0, -12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, 0, 0, -9, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, -8, 0, - 0, 0, 0, 5, 0, 3, -9, -9, - 0, -4, -4, -5, 0, 0, 0, 0, - 0, 0, -13, 0, -4, 0, -7, -4, - 0, -10, -11, -13, -4, 0, -9, 0, - -13, 0, 0, 0, 0, 36, 0, 0, - 2, 0, 0, -6, 0, 4, 0, -19, - 0, 0, 0, 0, 0, -42, -8, 15, - 13, -4, -19, 0, 4, -7, 0, -22, - -2, -6, 4, -31, -4, 6, 0, 7, - -16, -7, -17, -15, -19, 0, 0, -27, - 0, 26, 0, 0, -2, 0, 0, 0, - -2, -2, -4, -12, -15, -1, -42, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -4, 0, -2, -4, -7, 0, 0, - -9, 0, -4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, -9, 0, 0, 9, - -1, 6, 0, -10, 4, -3, -1, -12, - -4, 0, -6, -4, -3, 0, -7, -8, - 0, 0, -4, -1, -3, -8, -5, 0, - 0, -4, 0, 4, -3, 0, -10, 0, - 0, 0, -9, 0, -8, 0, -8, -8, - 4, 0, 0, 0, 0, 0, 0, 0, - 0, -9, 4, 0, -6, 0, -3, -5, - -14, -3, -3, -3, -1, -3, -5, -1, - 0, 0, 0, 0, 0, -4, -4, -4, - 0, 0, 0, 0, 5, -3, 0, -3, - 0, 0, 0, -3, -5, -3, -4, -5, - -4, 0, 4, 18, -1, 0, -12, 0, - -3, 9, 0, -4, -19, -6, 7, 0, - 0, -21, -8, 4, -8, 3, 0, -3, - -4, -14, 0, -7, 2, 0, 0, -8, - 0, 0, 0, 4, 4, -9, -9, 0, - -8, -4, -7, -4, -4, 0, -8, 2, - -9, -8, 13, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, 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, - -3, 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, -4, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, 0, 0, -6, - 0, 0, -4, -4, 0, 0, 0, 0, - -4, 0, 0, 0, 0, -2, 0, 0, - 0, 0, 0, -3, 0, 0, 0, 0, - -7, 0, -9, 0, 0, 0, -15, 0, - 3, -10, 9, 1, -3, -21, 0, 0, - -10, -4, 0, -18, -11, -13, 0, 0, - -19, -4, -18, -17, -22, 0, -12, 0, - 4, 30, -6, 0, -10, -4, -1, -4, - -8, -12, -8, -17, -18, -10, -4, 0, - 0, -3, 0, 1, 0, 0, -31, -4, - 13, 10, -10, -17, 0, 1, -14, 0, - -22, -3, -4, 9, -41, -6, 1, 0, - 0, -29, -5, -23, -4, -33, 0, 0, - -31, 0, 26, 1, 0, -3, 0, 0, - 0, 0, -2, -3, -17, -3, 0, -29, - 0, 0, 0, 0, -14, 0, -4, 0, - -1, -13, -21, 0, 0, -2, -7, -13, - -4, 0, -3, 0, 0, 0, 0, -20, - -4, -15, -14, -4, -8, -11, -4, -8, - 0, -9, -4, -15, -7, 0, -5, -9, - -4, -9, 0, 2, 0, -3, -15, 0, - 9, 0, -8, 0, 0, 0, 0, 5, - 0, 3, -9, 18, 0, -4, -4, -5, - 0, 0, 0, 0, 0, 0, -13, 0, - -4, 0, -7, -4, 0, -10, -11, -13, - -4, 0, -9, 4, 18, 0, 0, 0, - 0, 36, 0, 0, 2, 0, 0, -6, - 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -3, -9, 0, 0, 0, 0, 0, -2, - 0, 0, 0, -4, -4, 0, 0, -9, - -4, 0, 0, -9, 0, 8, -2, 0, - 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 7, 9, 4, -4, 0, -14, - -7, 0, 13, -15, -14, -9, -9, 18, - 8, 4, -39, -3, 9, -4, 0, -4, - 5, -4, -16, 0, -4, 4, -6, -4, - -13, -4, 0, 0, 13, 9, 0, -13, - 0, -25, -6, 13, -6, -17, 1, -6, - -15, -15, -4, 18, 4, 0, -7, 0, - -12, 0, 4, 15, -10, -17, -18, -11, - 13, 0, 1, -33, -4, 4, -8, -3, - -10, 0, -10, -17, -7, -7, -4, 0, - 0, -10, -9, -4, 0, 13, 10, -4, - -25, 0, -25, -6, 0, -16, -26, -1, - -14, -8, -15, -13, 12, 0, 0, -6, - 0, -9, -4, 0, -4, -8, 0, 8, - -15, 4, 0, 0, -24, 0, -4, -10, - -8, -3, -13, -11, -15, -10, 0, -13, - -4, -10, -9, -13, -4, 0, 0, 1, - 21, -8, 0, -13, -4, 0, -4, -9, - -10, -12, -13, -17, -6, -9, 9, 0, - -7, 0, -22, -5, 3, 9, -14, -17, - -9, -15, 15, -4, 2, -42, -8, 9, - -10, -8, -17, 0, -13, -19, -5, -4, - -4, -4, -9, -13, -1, 0, 0, 13, - 13, -3, -29, 0, -27, -10, 11, -17, - -30, -9, -16, -19, -22, -15, 9, 0, - 0, 0, 0, -5, 0, 0, 4, -5, - 9, 3, -9, 9, 0, 0, -14, -1, - 0, -1, 0, 1, 1, -4, 0, 0, - 0, 0, 0, 0, -4, 0, 0, 0, - 0, 4, 13, 1, 0, -5, 0, 0, - 0, 0, -3, -3, -5, 0, 0, 0, - 1, 4, 0, 0, 0, 0, 4, 0, - -4, 0, 17, 0, 8, 1, 1, -6, - 0, 9, 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13, 0, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -27, 0, -4, 8, 0, 13, - 0, 0, 44, 5, -9, -9, 4, 4, - -3, 1, -22, 0, 0, 22, -27, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -30, 17, 63, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -27, 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, -7, 0, 0, -9, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, -12, 0, - 0, 1, 0, 0, 4, 58, -9, -4, - 14, 12, -12, 4, 0, 0, 4, 4, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -58, 13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -13, - 0, 0, 0, -12, 0, 0, 0, 0, - -10, -2, 0, 0, 0, -10, 0, -5, - 0, -21, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -30, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, -4, 0, 0, -9, 0, -7, 0, - -12, 0, 0, 0, -8, 4, -5, 0, - 0, -12, -4, -10, 0, 0, -12, 0, - -4, 0, -21, 0, -5, 0, 0, -36, - -9, -18, -5, -16, 0, 0, -30, 0, - -12, -2, 0, 0, 0, 0, 0, 0, - 0, 0, -7, -8, -4, -8, 0, 0, - 0, 0, -10, 0, -10, 6, -5, 9, - 0, -3, -10, -3, -8, -9, 0, -5, - -2, -3, 3, -12, -1, 0, 0, 0, - -39, -4, -6, 0, -10, 0, -3, -21, - -4, 0, 0, -3, -4, 0, 0, 0, - 0, 3, 0, -3, -8, -3, 8, 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, 6, 0, 0, 0, 0, 0, - 0, -10, 0, -3, 0, 0, 0, -9, - 4, 0, 0, 0, -12, -4, -9, 0, - 0, -13, 0, -4, 0, -21, 0, 0, - 0, 0, -43, 0, -9, -17, -22, 0, - 0, -30, 0, -3, -7, 0, 0, 0, - 0, 0, 0, 0, 0, -4, -7, -2, - -7, 1, 0, 0, 8, -6, 0, 14, - 22, -4, -4, -13, 5, 22, 8, 10, - -12, 5, 19, 5, 13, 10, 12, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 28, 21, -8, -4, 0, -4, - 36, 19, 36, 0, 0, 0, 4, 0, - 0, 17, 0, 0, -7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -3, 0, - 0, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, -38, -5, -4, -18, - -22, 0, 0, -30, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - 0, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, -38, -5, -4, - -18, -22, 0, 0, -18, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -4, 0, 0, 0, -10, 4, 0, -4, - 4, 8, 4, -13, 0, -1, -4, 4, - 0, 4, 0, 0, 0, 0, -11, 0, - -4, -3, -9, 0, -4, -18, 0, 28, - -4, 0, -10, -3, 0, -3, -8, 0, - -4, -13, -9, -5, 0, 0, 0, -7, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -3, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, -38, - -5, -4, -18, -22, 0, 0, -30, 0, - 0, 0, 0, 0, 0, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -7, 0, -14, -5, -4, 13, -4, -4, - -18, 1, -3, 1, -3, -12, 1, 10, - 1, 4, 1, 4, -11, -18, -5, 0, - -17, -9, -12, -19, -17, 0, -7, -9, - -5, -6, -4, -3, -5, -3, 0, -3, - -1, 7, 0, 7, -3, 0, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -3, -4, -4, 0, 0, - -12, 0, -2, 0, -8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -27, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, -4, 0, -6, - 0, 0, 0, 0, -4, 0, 0, -8, - -4, 4, 0, -8, -9, -3, 0, -13, - -3, -10, -3, -5, 0, -8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -30, 0, 14, 0, 0, -8, 0, - 0, 0, 0, -6, 0, -4, 0, 0, - -2, 0, 0, -3, 0, -10, 0, 0, - 19, -6, -15, -14, 3, 5, 5, -1, - -13, 3, 7, 3, 13, 3, 15, -3, - -12, 0, 0, -18, 0, 0, -13, -12, - 0, 0, -9, 0, -6, -8, 0, -7, - 0, -7, 0, -3, 7, 0, -4, -13, - -4, 17, 0, 0, -4, 0, -9, 0, - 0, 6, -10, 0, 4, -4, 4, 0, - 0, -15, 0, -3, -1, 0, -4, 5, - -4, 0, 0, 0, -18, -5, -10, 0, - -13, 0, 0, -21, 0, 17, -4, 0, - -8, 0, 3, 0, -4, 0, -4, -13, - 0, -4, 4, 0, 0, 0, 0, -3, - 0, 0, 4, -6, 1, 0, 0, -5, - -3, 0, -5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -28, 0, 10, 0, - 0, -4, 0, 0, 0, 0, 1, 0, - -4, -4, 0, 0, 0, 9, 0, 10, - 0, 0, 0, 0, 0, -28, -26, 1, - 19, 13, 8, -18, 3, 19, 0, 17, - 0, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_28 = { -#else -lv_font_t lv_font_montserrat_28 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 30, /*The maximum line height required by the font*/ - .base_line = 5, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -2, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_28*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_28_compressed.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_28_compressed.c deleted file mode 100644 index 170ab48..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_28_compressed.c +++ /dev/null @@ -1,3271 +0,0 @@ -/******************************************************************************* - * Size: 28 px - * Bpp: 4 - * Opts: --bpp 4 --size 28 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_28_compressed.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_28_COMPRESSED - #define LV_FONT_MONTSERRAT_28_COMPRESSED 1 -#endif - -#if LV_FONT_MONTSERRAT_28_COMPRESSED - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0xc, 0xff, 0x28, 0x6, 0x10, 0x70, 0x3, 0x80, - 0x80, 0x7c, 0x20, 0x60, 0x1f, 0x18, 0x8, 0x0, - 0x43, 0xc0, 0x3f, 0x84, 0x4, 0x3, 0xe3, 0x3, - 0x0, 0x3c, 0x40, 0x0, 0x4e, 0xa0, 0x1f, 0x14, - 0x30, 0x3, 0xde, 0x58, 0x8, 0x1, 0xc1, 0x20, - 0x72, - - /* U+0022 "\"" */ - 0x3f, 0xf0, 0x81, 0x7f, 0x88, 0x3, 0xf8, 0x40, - 0x2, 0x6, 0x0, 0x30, 0xf, 0xfe, 0x31, 0x80, - 0x61, 0x0, 0x8, 0x7, 0xf0, 0xb3, 0x80, 0x4c, - 0xc0, - - /* U+0023 "#" */ - 0x0, 0xf5, 0x7a, 0x80, 0x66, 0xfa, 0x0, 0xfe, - 0x10, 0x60, 0xc, 0x20, 0x40, 0x1f, 0xcc, 0x4, - 0x1, 0xb8, 0x38, 0x3, 0xf8, 0x80, 0x40, 0x31, - 0x1, 0x0, 0x7e, 0x10, 0x20, 0xe, 0x60, 0x60, - 0xc, 0xbf, 0xf7, 0x1, 0x7f, 0xf1, 0x6, 0xff, - 0xb8, 0x3, 0xff, 0x90, 0xbf, 0xf3, 0x83, 0xff, - 0xeb, 0x3, 0xff, 0xb8, 0x3, 0x84, 0x38, 0x3, - 0x8, 0x30, 0x7, 0xf1, 0x1, 0x0, 0x62, 0x2, - 0x0, 0xfe, 0x60, 0x60, 0xd, 0xc1, 0xc0, 0x1f, - 0xc4, 0x4, 0x1, 0x8c, 0x8, 0x3, 0xf0, 0x80, - 0x80, 0x73, 0x3, 0x80, 0x64, 0xff, 0xb8, 0x7, - 0xff, 0x8c, 0x33, 0xfe, 0x0, 0xff, 0xe4, 0x27, - 0xfd, 0x0, 0xff, 0xfb, 0x40, 0xbf, 0xf0, 0x7, - 0x70, 0x70, 0x6, 0x60, 0x60, 0xf, 0xe2, 0x2, - 0x0, 0xc4, 0x4, 0x1, 0xfc, 0xc0, 0xc0, 0x1b, - 0x83, 0x80, 0x3f, 0x88, 0x8, 0x3, 0x10, 0x10, - 0x7, 0x0, - - /* U+0024 "$" */ - 0x0, 0xfb, 0xf0, 0x3, 0xff, 0xbc, 0x31, 0x9c, - 0x7, 0xfb, 0x28, 0x1, 0xcd, 0xce, 0x62, 0x1, - 0x13, 0x5e, 0x90, 0x1, 0x64, 0x0, 0x6e, 0x5, - 0xa, 0x20, 0x46, 0x0, 0xb0, 0x5, 0x64, 0x0, - 0xbd, 0x75, 0x30, 0x82, 0x8, 0x32, 0x80, 0x7c, - 0xb2, 0x0, 0x10, 0x7, 0x80, 0x7f, 0xf0, 0x4, - 0x1, 0x80, 0x1f, 0xfc, 0x4, 0x10, 0x58, 0x0, - 0xff, 0xe0, 0x40, 0x1, 0xfe, 0xc0, 0x3f, 0xcd, - 0x42, 0x0, 0x40, 0x3e, 0x94, 0x0, 0xf2, 0xfc, - 0xa0, 0x4, 0x2d, 0x78, 0x60, 0x1c, 0x2d, 0x7c, - 0x2, 0x40, 0x3, 0xc3, 0x0, 0xf8, 0x40, 0xb7, - 0xc, 0x1, 0xe0, 0x1f, 0xf1, 0xe1, 0x1, 0x88, - 0x7, 0xff, 0x1, 0x40, 0x4, 0x8, 0x1, 0xfe, - 0x30, 0x1, 0x2d, 0xd1, 0x0, 0x7c, 0xa8, 0x6, - 0x3e, 0xb, 0xb9, 0xe, 0x3, 0x19, 0x40, 0xf, - 0xa, 0x60, 0x1, 0xbc, 0x1, 0x39, 0x80, 0xd9, - 0x80, 0x27, 0xa1, 0x4, 0x3, 0x1c, 0x72, 0x0, - 0x61, 0x7b, 0xef, 0x3, 0xfc, 0x70, 0xf, 0xfe, - 0xc0, - - /* U+0025 "%" */ - 0x0, 0x3e, 0xff, 0x40, 0x7, 0xf6, 0xf9, 0x80, - 0x6a, 0x80, 0x62, 0x7c, 0x0, 0xfa, 0x49, 0x8c, - 0x2, 0x45, 0x4d, 0x9c, 0x73, 0x70, 0xe, 0x46, - 0x29, 0x0, 0xde, 0x10, 0x1, 0x40, 0x50, 0x7, - 0x48, 0x70, 0x7, 0x28, 0x18, 0x6, 0x32, 0x10, - 0xa, 0x49, 0x8c, 0x3, 0x84, 0x40, 0x1c, 0xc0, - 0x19, 0x18, 0xa4, 0x3, 0xc2, 0x20, 0xe, 0x60, - 0xd, 0x41, 0xc0, 0x1f, 0x28, 0x18, 0x6, 0x32, - 0x10, 0x91, 0x73, 0x0, 0xfb, 0xc2, 0x0, 0x28, - 0xa, 0x4, 0x62, 0x80, 0xf, 0xc8, 0xa9, 0xb3, - 0x8e, 0x6e, 0x14, 0x1c, 0x0, 0x58, 0x82, 0x80, - 0x6a, 0x80, 0x62, 0x7c, 0x9, 0x17, 0x31, 0xca, - 0x77, 0x56, 0x8, 0x4, 0xfb, 0xfd, 0x0, 0x8c, - 0x50, 0x14, 0x6d, 0xdc, 0x73, 0xa0, 0xf, 0xea, - 0xe, 0x2, 0x43, 0x91, 0x14, 0x1a, 0x18, 0x7, - 0xd2, 0x2e, 0x60, 0x81, 0x40, 0x1a, 0x81, 0x0, - 0x3c, 0x8c, 0x50, 0x0, 0xe0, 0x20, 0xc, 0x41, - 0xe0, 0x1c, 0x34, 0x1c, 0x1, 0x78, 0x8, 0x6, - 0x10, 0xf, 0xac, 0x5c, 0xc0, 0x23, 0xd, 0x0, - 0xda, 0x1a, 0x1, 0x91, 0x4a, 0x0, 0x32, 0xb, - 0x8, 0x0, 0x58, 0x54, 0x2, 0x1a, 0xe, 0x0, - 0xf5, 0xf, 0xc3, 0xf8, 0xd0, 0x6, 0xb1, 0x73, - 0x0, 0xf2, 0x62, 0xbc, 0x2e, 0x20, 0x0, - - /* U+0026 "&" */ - 0x0, 0xc3, 0x3b, 0xfe, 0xd8, 0x0, 0xff, 0x1f, - 0x31, 0x0, 0x9, 0xf4, 0x3, 0xfb, 0x80, 0x6f, - 0xfd, 0x40, 0x50, 0x1, 0xf1, 0x90, 0x5a, 0x0, - 0x15, 0x81, 0x0, 0x3e, 0x70, 0x3, 0x0, 0x61, - 0x0, 0xfe, 0x60, 0x2, 0x0, 0x42, 0xc0, 0x80, - 0x1f, 0x11, 0x84, 0x10, 0x16, 0x8, 0xa4, 0x3, - 0xf7, 0x80, 0x3e, 0x34, 0x87, 0x44, 0x3, 0xf1, - 0xd0, 0x13, 0x82, 0x79, 0x80, 0x7f, 0x1c, 0x80, - 0x43, 0x42, 0x1, 0xfc, 0xd8, 0x62, 0xe0, 0x38, - 0x20, 0x11, 0x20, 0x4, 0xd2, 0xb, 0xf1, 0x40, - 0x58, 0x20, 0xb, 0xb8, 0xa, 0x41, 0x28, 0x41, - 0x68, 0xb, 0x4, 0x10, 0x30, 0x28, 0x1, 0x20, - 0x19, 0x68, 0xb, 0x18, 0x81, 0x0, 0xc0, 0x48, - 0x3, 0x96, 0x80, 0xa4, 0x10, 0xc0, 0x40, 0x44, - 0x1, 0xe5, 0xa0, 0xb, 0x80, 0x18, 0x0, 0xb0, - 0xf, 0xb0, 0x2, 0x81, 0x6, 0x20, 0x5e, 0x75, - 0x45, 0x9e, 0x60, 0x40, 0x2c, 0x10, 0xc4, 0x1, - 0x8a, 0xba, 0x61, 0x14, 0xdd, 0x1, 0x48, 0xd, - 0xd9, 0x88, 0x0, 0x29, 0x3c, 0xc0, 0xb4, 0x90, - 0x1, 0x24, 0xef, 0xfb, 0xad, 0x80, 0x32, 0xd8, - 0x0, - - /* U+0027 "'" */ - 0x3f, 0xf0, 0x80, 0x61, 0x0, 0x8, 0x7, 0xe3, - 0x0, 0xf8, 0x59, 0xc0, - - /* U+0028 "(" */ - 0x0, 0x93, 0xfc, 0x80, 0x14, 0x1, 0xa0, 0x1, - 0xc, 0x24, 0x2, 0xf0, 0x15, 0x0, 0x90, 0x1c, - 0x2, 0x50, 0x6, 0x80, 0x58, 0x0, 0x40, 0x9, - 0x40, 0x80, 0x31, 0x83, 0x80, 0x44, 0x0, 0xd0, - 0x8, 0x40, 0x2, 0x1, 0x38, 0x7, 0x84, 0x0, - 0x60, 0x1f, 0xe1, 0x0, 0x18, 0x4, 0xe0, 0x1e, - 0x10, 0x0, 0x80, 0x44, 0x0, 0xd0, 0xc, 0x60, - 0xe0, 0x19, 0x40, 0x80, 0x36, 0x0, 0x10, 0x2, - 0x50, 0x6, 0x80, 0x65, 0x7, 0x0, 0xdc, 0x2, - 0xa0, 0x12, 0x18, 0x48, 0x6, 0x80, 0x34, - - /* U+0029 ")" */ - 0xd, 0xfb, 0x0, 0xd6, 0x8, 0x60, 0x13, 0x10, - 0x40, 0x6, 0xa0, 0x42, 0x0, 0x94, 0x0, 0xa0, - 0x11, 0x10, 0x2c, 0x3, 0x28, 0x18, 0x6, 0xe0, - 0x1, 0x80, 0x4a, 0x0, 0x50, 0x8, 0xc0, 0x1e, - 0x1, 0xe3, 0x0, 0xc2, 0x2, 0x1, 0x8c, 0x1c, - 0x3, 0xfe, 0x30, 0x70, 0xc, 0x20, 0x20, 0x1e, - 0x30, 0x8, 0xc0, 0x1e, 0x1, 0x28, 0x1, 0x40, - 0x2e, 0x0, 0x18, 0x4, 0xa0, 0x60, 0x11, 0x10, - 0x2c, 0x2, 0x50, 0x2, 0x80, 0x54, 0x8, 0x40, - 0x6, 0x20, 0x80, 0xa, 0xc1, 0xc, 0x0, - - /* U+002A "*" */ - 0x0, 0xc7, 0xec, 0x1, 0xff, 0xc3, 0x1e, 0x80, - 0xe, 0x7e, 0x32, 0x37, 0xea, 0xc, 0xd8, 0x6, - 0x3d, 0x80, 0x60, 0x52, 0x6f, 0x50, 0x3, 0x20, - 0x4, 0x76, 0x20, 0x7, 0xf5, 0x10, 0x13, 0xd9, - 0x13, 0x80, 0x9d, 0x8, 0xb2, 0x67, 0x39, 0xf6, - 0x0, 0x93, 0x65, 0x81, 0x84, 0x3, 0xcc, 0x1, - 0xc5, 0xa, 0x1, 0x80, - - /* U+002B "+" */ - 0x0, 0xf2, 0x20, 0x40, 0x3f, 0xeb, 0xb2, 0x0, - 0x7f, 0xf9, 0xc, 0xf8, 0x0, 0x46, 0x78, 0x4b, - 0x33, 0x80, 0x11, 0x99, 0x9c, 0x3, 0xff, 0x84, - 0x5f, 0xfc, 0x0, 0xaf, 0xfc, 0xc0, 0x1f, 0xfe, - 0xc0, - - /* U+002C "," */ - 0x1a, 0xb4, 0x9, 0x54, 0xa0, 0x10, 0x0, 0x85, - 0x90, 0x18, 0x13, 0x85, 0x0, 0x10, 0x1c, 0x8, - 0x4c, 0x41, 0x2, 0x80, 0x0, - - /* U+002D "-" */ - 0x25, 0x5f, 0x81, 0x2a, 0xbe, 0x20, 0xf, 0xe0, - - /* U+002E "." */ - 0x1a, 0xc4, 0x8, 0x53, 0xa0, 0x30, 0x0, 0x84, - 0x10, 0xc8, 0x0, - - /* U+002F "/" */ - 0x0, 0xfe, 0x58, 0x60, 0xf, 0xeb, 0x7e, 0x0, - 0xfc, 0x62, 0x16, 0x1, 0xfa, 0x80, 0x8c, 0x3, - 0xf3, 0x85, 0x0, 0x7e, 0x41, 0x5, 0x0, 0xfd, - 0xc0, 0x64, 0x1, 0xf9, 0x42, 0xc0, 0x3f, 0x28, - 0x1, 0x80, 0x3f, 0x78, 0x18, 0x80, 0x7e, 0x50, - 0xa0, 0xf, 0xcc, 0x0, 0x70, 0xf, 0xda, 0x8, - 0x20, 0x1f, 0xa, 0x7, 0x0, 0x7e, 0x70, 0x2, - 0x80, 0x7e, 0xa0, 0x50, 0xf, 0xc4, 0x61, 0xe0, - 0x1f, 0x94, 0x5, 0x40, 0x3f, 0x50, 0x38, 0x7, - 0xe2, 0x20, 0x68, 0x7, 0xea, 0x1, 0x40, 0xf, - 0xca, 0xe, 0x1, 0xf8, 0xc8, 0x28, 0x3, 0xf5, - 0x1, 0x18, 0x7, 0xe7, 0x5, 0x0, 0xfc, 0x82, - 0x14, 0x1, 0xfb, 0x40, 0x88, 0x1, 0xf8, - - /* U+0030 "0" */ - 0x0, 0xe7, 0xcf, 0xf7, 0x5a, 0x80, 0x7e, 0x4e, - 0x83, 0x0, 0xa, 0x55, 0x88, 0x7, 0x25, 0x88, - 0x13, 0x3a, 0x80, 0x13, 0x4, 0x2, 0x1a, 0x0, - 0x46, 0xcc, 0x57, 0x20, 0x15, 0x80, 0x52, 0x20, - 0xee, 0x0, 0xc3, 0x64, 0xa, 0x60, 0x6, 0x1, - 0x80, 0xf, 0xa4, 0x1, 0x40, 0x62, 0xe, 0x1, - 0xf9, 0x4, 0x1c, 0x10, 0x1, 0x80, 0x1f, 0xca, - 0x2, 0x2e, 0x0, 0x30, 0x7, 0xf1, 0x80, 0x8, - 0xc0, 0x2, 0x1, 0xfd, 0xe0, 0x7, 0x0, 0xff, - 0xe2, 0x98, 0x0, 0x40, 0x3f, 0xbc, 0x0, 0xfc, - 0x0, 0x60, 0xf, 0xe3, 0x0, 0x12, 0x0, 0x30, - 0x3, 0xf9, 0x40, 0x44, 0x62, 0xe, 0x1, 0xf9, - 0x4, 0x1c, 0x0, 0xc0, 0x30, 0x1, 0xf4, 0x80, - 0x28, 0x1, 0x22, 0xe, 0xe0, 0xc, 0x36, 0x40, - 0xa6, 0x0, 0x1a, 0x0, 0x46, 0xcc, 0x57, 0x20, - 0x15, 0x80, 0x64, 0xb1, 0x2, 0x67, 0x50, 0x1, - 0xe0, 0x80, 0x72, 0x74, 0x18, 0x0, 0x52, 0xb0, - 0x40, 0x20, - - /* U+0031 "1" */ - 0xcf, 0xff, 0x30, 0x7, 0xe9, 0x88, 0x94, 0x2, - 0x57, 0x7b, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, 0xfe, - 0xc0, - - /* U+0032 "2" */ - 0x0, 0x8e, 0x33, 0xbf, 0xd9, 0x4, 0x1, 0xc5, - 0x78, 0xe6, 0x20, 0x3, 0x7d, 0x60, 0x8, 0xb1, - 0x0, 0x8, 0xce, 0xa2, 0x0, 0x95, 0x0, 0x8c, - 0x1b, 0xae, 0x62, 0xb9, 0xc0, 0x16, 0x0, 0x2c, - 0x99, 0x8, 0x7, 0x41, 0x80, 0x90, 0x0, 0x58, - 0x3, 0xf2, 0x0, 0x18, 0x3, 0xff, 0x80, 0x20, - 0x6, 0x0, 0xff, 0xe0, 0x38, 0x9, 0x0, 0x7f, - 0xce, 0x20, 0xe0, 0x1f, 0xf2, 0x40, 0xc, 0x0, - 0x7f, 0x8e, 0xc0, 0x14, 0x20, 0x1f, 0xc9, 0x80, - 0xb, 0x40, 0xf, 0xe4, 0xb0, 0x5, 0xa0, 0x7, - 0xf2, 0x58, 0x2, 0xd0, 0x3, 0xf9, 0x2c, 0x1, - 0x68, 0x1, 0xfc, 0xb6, 0x0, 0xc4, 0x0, 0xfe, - 0x5a, 0x0, 0x61, 0x80, 0x7f, 0x2d, 0x0, 0x15, - 0x1d, 0xff, 0x0, 0x28, 0x2, 0x58, 0x8f, 0xe2, - 0x0, 0xff, 0xe2, 0x0, - - /* U+0033 "3" */ - 0xf, 0xff, 0xfe, 0x8, 0x7, 0xff, 0x16, 0x62, - 0x3f, 0x10, 0x2, 0x0, 0xc, 0xef, 0xf0, 0x90, - 0x2b, 0x80, 0x7f, 0x1c, 0x81, 0x50, 0x7, 0xf0, - 0xe8, 0x3, 0xc0, 0x3f, 0xda, 0x21, 0x64, 0x1, - 0xfd, 0x26, 0x10, 0x80, 0x1f, 0xca, 0xc0, 0xe, - 0x61, 0x0, 0xfc, 0x40, 0x13, 0x4f, 0x38, 0x7, - 0xc8, 0xee, 0x52, 0x0, 0x44, 0x80, 0x78, 0xe2, - 0x15, 0xb6, 0x0, 0x63, 0x0, 0xff, 0x24, 0x80, - 0x2c, 0x3, 0xfe, 0x70, 0x1, 0x80, 0x7f, 0xf0, - 0x84, 0x14, 0x3, 0xf9, 0xc0, 0x4, 0x75, 0x88, - 0x1, 0xe5, 0x90, 0x5, 0x48, 0x1d, 0xf5, 0x44, - 0x27, 0x68, 0x1, 0x5, 0x4c, 0x0, 0x15, 0x77, - 0x31, 0x0, 0x21, 0xc0, 0x13, 0xd2, 0xa4, 0x0, - 0x13, 0x8d, 0x70, 0x0, - - /* U+0034 "4" */ - 0x0, 0xfe, 0x4f, 0xf5, 0x80, 0x7f, 0xf0, 0x4a, - 0x80, 0x68, 0x3, 0xff, 0x83, 0xc2, 0x1a, 0x20, - 0x1f, 0xfc, 0x9, 0x30, 0x83, 0x0, 0xff, 0xe0, - 0x2b, 0x2, 0xb8, 0x7, 0xff, 0x0, 0xa8, 0xa, - 0x80, 0x3f, 0xf8, 0x3e, 0x0, 0xe0, 0xf, 0xfe, - 0xd, 0x10, 0x49, 0x80, 0x7f, 0xf0, 0x1d, 0x41, - 0x58, 0x2, 0xab, 0x70, 0xf, 0x1c, 0x1, 0x50, - 0x6, 0x54, 0xd0, 0xe, 0x1d, 0x0, 0x78, 0x7, - 0xff, 0x6, 0x84, 0x28, 0x80, 0x3f, 0xf8, 0x10, - 0x80, 0x46, 0xcd, 0xe0, 0x3, 0x36, 0x26, 0x0, - 0x14, 0xcf, 0xc0, 0x3, 0x99, 0x90, 0x40, 0x3f, - 0xf8, 0xbf, 0xff, 0xf0, 0x1, 0x7f, 0xe6, 0x0, - 0xff, 0xfe, 0x0, - - /* U+0035 "5" */ - 0x0, 0xf, 0xff, 0xfc, 0x1, 0x88, 0x3, 0xff, - 0x86, 0xe0, 0x6, 0x88, 0xfc, 0x1, 0x88, 0x1, - 0x4e, 0xff, 0x80, 0x37, 0x0, 0x8, 0x3, 0xff, - 0x80, 0x20, 0x1, 0x0, 0xff, 0xe0, 0x10, 0x8, - 0x7, 0xff, 0x5, 0xc0, 0xc0, 0x3f, 0xf8, 0x24, - 0x5, 0xff, 0x76, 0x4a, 0x0, 0x78, 0x40, 0x38, - 0x4d, 0xaf, 0x8, 0x3, 0x44, 0x79, 0x8c, 0x0, - 0x78, 0x20, 0x13, 0xbf, 0xa7, 0x34, 0xc0, 0x60, - 0x3, 0xfe, 0x2d, 0x0, 0x38, 0x7, 0xff, 0x0, - 0x4c, 0x4, 0x3, 0xff, 0x8c, 0x62, 0x1, 0xf8, - 0x4c, 0x8, 0x1, 0xde, 0xc0, 0x1e, 0x2d, 0x0, - 0x50, 0x29, 0xc, 0xfd, 0xcc, 0x4d, 0xe9, 0x81, - 0x38, 0x2d, 0x10, 0x1, 0x19, 0xd9, 0x0, 0x9, - 0x80, 0x12, 0xed, 0xb1, 0x88, 0x9, 0x35, 0xd8, - 0x40, 0x0, - - /* U+0036 "6" */ - 0x0, 0xe2, 0x8c, 0xef, 0xf6, 0xd2, 0x0, 0x70, - 0xd6, 0xb9, 0x88, 0x0, 0x96, 0xd0, 0x2, 0x1c, - 0x50, 0x2, 0x3c, 0xbb, 0x9, 0x20, 0x5, 0xa4, - 0x9, 0xb7, 0xd, 0x13, 0xde, 0x1, 0x31, 0x82, - 0x59, 0x0, 0x78, 0x80, 0x2b, 0x0, 0x50, 0x7, - 0xfc, 0x44, 0x5, 0x10, 0xf, 0xf9, 0x0, 0x18, - 0x1, 0xff, 0xc0, 0xe0, 0x2, 0x82, 0xd7, 0x7f, - 0x6c, 0x10, 0x4, 0x40, 0x15, 0xd2, 0x88, 0x9, - 0x3e, 0xb8, 0x7, 0x72, 0x3, 0x55, 0xca, 0x80, - 0x21, 0x80, 0xc0, 0x4, 0x4e, 0x95, 0x46, 0xab, - 0x0, 0x40, 0x70, 0x5, 0xc2, 0x1, 0xc8, 0xe0, - 0x2a, 0x60, 0x1, 0x30, 0xf, 0xb0, 0x0, 0x4a, - 0x1, 0xff, 0xc2, 0x11, 0x28, 0x9, 0x80, 0x7d, - 0x80, 0x2, 0x8, 0x0, 0x70, 0x80, 0x72, 0x38, - 0x12, 0x1, 0x40, 0x17, 0x4a, 0xa2, 0xd5, 0x80, - 0x24, 0x2, 0x79, 0x0, 0x35, 0x5d, 0x28, 0xd, - 0xa0, 0x6, 0x6e, 0x83, 0x10, 0x13, 0x8f, 0x40, - 0x0, - - /* U+0037 "7" */ - 0x2f, 0xff, 0xfe, 0x15, 0x0, 0x7f, 0xf0, 0xcc, - 0x2, 0x48, 0x8f, 0xc6, 0x0, 0xc0, 0x8, 0xdd, - 0xff, 0x18, 0xa, 0x80, 0x7f, 0xcc, 0x0, 0x90, - 0xf, 0xfe, 0x5, 0x80, 0x18, 0xb, 0xfd, 0x0, - 0x1e, 0x42, 0x6, 0x10, 0xf, 0xfa, 0x0, 0x16, - 0x1, 0xff, 0x19, 0x81, 0x8, 0x3, 0xfe, 0x90, - 0x7, 0x80, 0x7f, 0xc2, 0xa0, 0x48, 0x1, 0xff, - 0x48, 0x2, 0xc0, 0x3f, 0xf8, 0xc, 0x2, 0xc0, - 0x1f, 0xf3, 0x8, 0x30, 0x7, 0xff, 0x2, 0xc0, - 0x12, 0x1, 0xff, 0x21, 0x2, 0x88, 0x7, 0xfd, - 0xe0, 0x9, 0x0, 0xff, 0x89, 0x0, 0xcc, 0x1, - 0xff, 0x58, 0x2, 0x40, 0x3f, 0xe1, 0x60, 0x15, - 0x0, 0xf8, - - /* U+0038 "8" */ - 0x0, 0xcb, 0x5b, 0xfe, 0xda, 0x60, 0xf, 0x1e, - 0xd2, 0x90, 0x0, 0x96, 0x74, 0xc0, 0x22, 0xd2, - 0x2, 0x8a, 0xa4, 0x10, 0x16, 0x10, 0x2, 0x4, - 0x1f, 0x5d, 0x54, 0xfa, 0xe0, 0x8, 0x0, 0x20, - 0xc, 0x0, 0x7a, 0x8, 0x14, 0x0, 0x20, 0xa0, - 0x1f, 0x9c, 0x3, 0xcc, 0x1, 0xf9, 0x80, 0x32, - 0x81, 0x28, 0x7, 0x94, 0xc1, 0x40, 0x16, 0x21, - 0x54, 0x42, 0x22, 0xd5, 0x0, 0x6c, 0x0, 0x38, - 0x60, 0xb7, 0xba, 0xa5, 0x3, 0xc1, 0x0, 0xa8, - 0xc0, 0x3f, 0x1d, 0x0, 0x56, 0xe0, 0x75, 0xbf, - 0xed, 0x92, 0x7, 0xb0, 0x54, 0x4, 0xc5, 0x20, - 0x1, 0x36, 0xa8, 0x22, 0xf8, 0x2, 0x40, 0x3f, - 0x40, 0x3, 0xc4, 0x0, 0x40, 0x1f, 0x88, 0x0, - 0xc4, 0x0, 0x40, 0xf, 0xc8, 0x0, 0x6d, 0x0, - 0x49, 0x0, 0x78, 0xa4, 0x1, 0xe8, 0xa0, 0x5b, - 0x4c, 0x8a, 0xd5, 0xa4, 0x8, 0xa1, 0x4c, 0x0, - 0x59, 0xba, 0x95, 0x0, 0x35, 0x80, 0x53, 0xb0, - 0x62, 0x0, 0x13, 0x8d, 0x90, 0x0, - - /* U+0039 "9" */ - 0x0, 0xcb, 0x7d, 0xfd, 0xb2, 0x60, 0x1e, 0x2c, - 0xa4, 0x10, 0x12, 0x6c, 0x90, 0xc, 0x3e, 0x60, - 0x73, 0x74, 0xe4, 0xd, 0x40, 0x14, 0x10, 0x3e, - 0x32, 0x2c, 0x6a, 0x82, 0xb0, 0x1, 0x80, 0xa0, - 0x3, 0xd4, 0x21, 0x0, 0x40, 0x5, 0x0, 0xfc, - 0xe0, 0x2a, 0x1, 0xff, 0xc3, 0xc2, 0x0, 0x28, - 0x7, 0xe7, 0x0, 0x28, 0x28, 0x14, 0x0, 0x7a, - 0x84, 0x0, 0x21, 0x0, 0x7, 0xd7, 0x55, 0x46, - 0xa8, 0x88, 0xc, 0xb, 0x4, 0xa, 0x2a, 0x8e, - 0x43, 0xa0, 0x1c, 0x7d, 0x6, 0x20, 0x29, 0x3c, - 0x62, 0x6, 0x1, 0x9f, 0x3b, 0xfa, 0xd8, 0x8, - 0x0, 0xe0, 0x1f, 0xfc, 0x4, 0x0, 0x68, 0x7, - 0xff, 0x2, 0x80, 0xc, 0x1, 0xff, 0x39, 0x82, - 0x88, 0x0, 0x44, 0x1, 0xe8, 0x80, 0xd, 0x80, - 0x53, 0xd5, 0xc, 0xf5, 0xce, 0x0, 0xd1, 0x0, - 0x9c, 0x15, 0xe6, 0x14, 0x40, 0xf4, 0xc0, 0x36, - 0x31, 0x80, 0x44, 0xd7, 0x84, 0x1, 0x0, - - /* U+003A ":" */ - 0x2d, 0xe6, 0x8, 0x21, 0x90, 0x30, 0x0, 0x84, - 0x29, 0xd0, 0xd, 0x62, 0x0, 0x7f, 0xf4, 0xc6, - 0xb1, 0x2, 0x14, 0xe8, 0xc, 0x0, 0x21, 0x4, - 0x32, 0x0, - - /* U+003B ";" */ - 0x2d, 0xe6, 0x8, 0x21, 0x90, 0x30, 0x0, 0x84, - 0x29, 0xd0, 0xd, 0x62, 0x0, 0x7f, 0xf4, 0xc6, - 0xad, 0x2, 0x55, 0x28, 0x4, 0x0, 0x21, 0x64, - 0x6, 0x4, 0xe1, 0x40, 0x4, 0x7, 0x2, 0x13, - 0x10, 0x40, 0xa0, 0x0, - - /* U+003C "<" */ - 0x0, 0xff, 0x8e, 0x58, 0x3, 0xf0, 0xb6, 0xe3, - 0x0, 0x7c, 0x75, 0xd2, 0x40, 0x88, 0x0, 0x85, - 0xf7, 0x14, 0xa, 0x3a, 0xc8, 0x12, 0xba, 0x8, - 0x17, 0x35, 0xc4, 0x0, 0x56, 0xa0, 0x73, 0xf4, - 0x60, 0x1f, 0x86, 0x9c, 0x3, 0xf1, 0x28, 0xc, - 0xf5, 0x20, 0x7, 0xd5, 0xd2, 0x40, 0xb7, 0xae, - 0x20, 0x1c, 0x2d, 0xb8, 0xc0, 0x51, 0xd6, 0xa0, - 0x1e, 0x39, 0xf9, 0x30, 0x4a, 0x60, 0xf, 0xcd, - 0x98, 0x60, 0xf, 0xfe, 0x1, 0xcf, 0xb8, - - /* U+003D "=" */ - 0x2f, 0xff, 0xfe, 0x3, 0x0, 0x7f, 0xf0, 0x8b, - 0x33, 0xff, 0x80, 0xe0, 0x67, 0xff, 0xc0, 0x10, - 0xf, 0xfe, 0x89, 0x9f, 0xff, 0x0, 0x4b, 0x33, - 0xff, 0x80, 0xe0, 0x1f, 0xfc, 0x20, - - /* U+003E ">" */ - 0x1b, 0x50, 0xf, 0xf8, 0xd2, 0xba, 0x8, 0x3, - 0xf1, 0x30, 0x89, 0xf7, 0x14, 0x3, 0xe9, 0xea, - 0x40, 0x3a, 0xe9, 0x20, 0xf, 0x2d, 0xeb, 0x88, - 0x9b, 0x71, 0x80, 0x3c, 0x51, 0xd6, 0xa0, 0x72, - 0xc0, 0x1f, 0x93, 0x90, 0x3, 0xf8, 0xa3, 0xad, - 0x0, 0xd4, 0x3, 0x2e, 0x6b, 0x88, 0x9f, 0x70, - 0xc0, 0xe7, 0xe8, 0xc1, 0x2b, 0xa0, 0x80, 0x3, - 0x8c, 0x2, 0xfb, 0x6a, 0x1, 0xc6, 0x9, 0x5d, - 0x4, 0x1, 0xf1, 0x75, 0xa8, 0x7, 0xf8, - - /* U+003F "?" */ - 0x0, 0x92, 0x77, 0xbf, 0xd9, 0x24, 0x1, 0x8a, - 0xec, 0xc4, 0x20, 0x3, 0x6d, 0x80, 0x1, 0xe2, - 0x0, 0xb4, 0x4b, 0x90, 0x1, 0xd8, 0x1c, 0x1, - 0x1d, 0x2e, 0xd1, 0xb0, 0x0, 0x80, 0x4f, 0xa7, - 0x0, 0xf3, 0x90, 0x8, 0x80, 0x54, 0x3, 0xf3, - 0x0, 0x7f, 0xf0, 0x94, 0x4, 0x40, 0x1f, 0xe8, - 0x10, 0x60, 0xf, 0xf4, 0x38, 0x1c, 0x0, 0x7f, - 0x4b, 0x81, 0xe0, 0x7, 0xf4, 0x30, 0x26, 0x0, - 0x7f, 0x13, 0x81, 0x58, 0x7, 0xf9, 0x40, 0x16, - 0x1, 0xff, 0x12, 0xa9, 0x0, 0x3f, 0xe5, 0xaa, - 0x10, 0x7, 0xff, 0x38, 0x61, 0x80, 0x3f, 0xf8, - 0x18, 0xf2, 0xc0, 0x1f, 0xf1, 0x0, 0x38, 0x3, - 0xfe, 0x91, 0x29, 0x0, 0xe0, - - /* U+0040 "@" */ - 0x0, 0xfc, 0x4f, 0x7b, 0xff, 0x75, 0xc1, 0x80, - 0x7f, 0xf0, 0x93, 0x36, 0x10, 0x84, 0x84, 0x48, - 0xf9, 0x85, 0x0, 0xff, 0xaa, 0xcc, 0xa3, 0x7f, - 0xb7, 0xbf, 0x64, 0xcd, 0x56, 0x20, 0x1f, 0xe, - 0xa8, 0xd6, 0xb9, 0x0, 0x71, 0x36, 0x59, 0x26, - 0x8, 0x7, 0xe, 0x11, 0xfa, 0x80, 0x7f, 0xc9, - 0xaa, 0x58, 0x20, 0x1a, 0xc8, 0xf0, 0x40, 0x3, - 0x1b, 0xfe, 0xd8, 0x10, 0xff, 0x45, 0x21, 0x58, - 0x4, 0x6a, 0x1c, 0x1, 0x27, 0x39, 0x0, 0x9, - 0xfd, 0x0, 0x35, 0xa, 0x98, 0x2, 0x1, 0xc8, - 0x0, 0x96, 0x0, 0x7c, 0xc5, 0x20, 0xd8, 0x6, - 0x18, 0x8, 0x1, 0x40, 0x90, 0xa, 0x80, 0x76, - 0xc, 0xcb, 0x72, 0x1, 0xe6, 0x14, 0x14, 0x3, - 0x10, 0x2, 0x88, 0x51, 0x0, 0x73, 0x28, 0x7, - 0x90, 0x17, 0x41, 0x0, 0x2f, 0x2, 0x40, 0xf, - 0xa4, 0x3, 0xda, 0x6, 0x21, 0xe0, 0x13, 0x83, - 0x80, 0x7e, 0x30, 0xf, 0x10, 0x79, 0x80, 0x80, - 0x46, 0x6, 0x1, 0xfc, 0x20, 0x1c, 0x20, 0x26, - 0x2, 0x1, 0x18, 0x18, 0x7, 0xf0, 0x80, 0x70, - 0x80, 0xf0, 0x70, 0x4, 0xe0, 0xe0, 0x1f, 0x8c, - 0x3, 0xc4, 0x1e, 0x40, 0xa0, 0x17, 0x81, 0x20, - 0x7, 0xd2, 0x1, 0xed, 0x3, 0x40, 0x31, 0x0, - 0x28, 0x85, 0x10, 0x7, 0x32, 0x80, 0x4, 0x0, - 0x2a, 0x8, 0x28, 0x12, 0x1, 0x50, 0xe, 0xc1, - 0x92, 0x54, 0x81, 0x83, 0x29, 0xe8, 0x38, 0x2, - 0x1, 0xc8, 0x0, 0x96, 0x0, 0x7c, 0xdb, 0x51, - 0xb8, 0x0, 0x56, 0x19, 0xa0, 0x0, 0x6a, 0x1c, - 0x1, 0x27, 0x39, 0x80, 0x9, 0xfd, 0x11, 0x44, - 0x2, 0xf8, 0x1, 0xa8, 0x8f, 0x4, 0x0, 0x31, - 0x9f, 0xed, 0x81, 0x0, 0x2e, 0xff, 0x40, 0x7, - 0xb0, 0x8f, 0xd4, 0x3, 0xff, 0x94, 0x38, 0xa3, - 0x5a, 0xe6, 0x1, 0xc6, 0xf8, 0x1, 0xff, 0xc0, - 0x1a, 0xb3, 0x28, 0xcf, 0xee, 0xbf, 0x20, 0xd0, - 0x3, 0xff, 0x82, 0x99, 0x88, 0x41, 0x1c, 0x4b, - 0x3c, 0x80, 0x1f, 0x0, - - /* U+0041 "A" */ - 0x0, 0xfe, 0x6f, 0xf6, 0x80, 0x7f, 0xf1, 0xac, - 0x0, 0x48, 0x1, 0xff, 0xc4, 0x42, 0x0, 0xbc, - 0x3, 0xff, 0x89, 0xe0, 0x2c, 0x8, 0x40, 0x1f, - 0xfc, 0x22, 0x40, 0x68, 0x0, 0x40, 0x7, 0xff, - 0xa, 0xc0, 0x12, 0x2a, 0xa, 0x20, 0x1f, 0xfc, - 0x1, 0x60, 0x51, 0x9, 0x0, 0x48, 0x7, 0xff, - 0x1, 0x80, 0x12, 0x0, 0x33, 0x3, 0x0, 0x7f, - 0xf0, 0x24, 0x8, 0xc0, 0x2a, 0x1, 0x60, 0xf, - 0xf2, 0x88, 0x58, 0x6, 0x61, 0xb, 0x0, 0xff, - 0x40, 0xb, 0x0, 0x73, 0x1, 0x20, 0x7, 0xe4, - 0x20, 0x60, 0xf, 0x48, 0x3, 0xc0, 0x3f, 0x78, - 0x3, 0x4c, 0xfc, 0x46, 0x8, 0x60, 0x1e, 0x24, - 0x0, 0x56, 0x67, 0xc6, 0x0, 0x90, 0xf, 0x58, - 0x7, 0xff, 0x9, 0x44, 0x3, 0xb, 0x1, 0xff, - 0xff, 0xa8, 0x1, 0x20, 0x19, 0x80, 0x12, 0x1, - 0xfe, 0x51, 0x6, 0x0, 0xd2, 0x2, 0xa0, 0x1f, - 0xf3, 0x0, 0xb0, 0x1, 0x44, 0x18, 0x3, 0xff, - 0x81, 0x20, 0xb, 0x0, 0x48, 0x2, 0x40, 0x3f, - 0xf8, 0x2, 0xa0, 0x48, - - /* U+0042 "B" */ - 0x1f, 0xff, 0xf6, 0xd2, 0x80, 0x7f, 0xf0, 0xc9, - 0x6b, 0x48, 0x3, 0x8e, 0xef, 0xd2, 0xc0, 0x2, - 0xf0, 0xe, 0x74, 0x4f, 0x34, 0xf1, 0x81, 0x30, - 0x7, 0xff, 0x4, 0x7c, 0x1, 0x80, 0x1f, 0xfc, - 0x22, 0x0, 0x8, 0x7, 0xff, 0x8, 0xc0, 0x4, - 0x1, 0xff, 0xc2, 0xb0, 0x6, 0x80, 0x7f, 0xc2, - 0x96, 0xc0, 0x88, 0x0, 0xc9, 0xff, 0xee, 0xb4, - 0x5, 0xb0, 0xf, 0xfe, 0x22, 0x38, 0x7, 0x1d, - 0xdf, 0xd4, 0xe2, 0x28, 0xa0, 0xc, 0xe8, 0x9f, - 0x2c, 0x71, 0x82, 0xa0, 0x7, 0xff, 0xb, 0xc0, - 0x1a, 0x1, 0xff, 0xc2, 0x30, 0x2, 0x80, 0x7f, - 0xf0, 0x8c, 0x0, 0xe0, 0x1f, 0xfc, 0x28, 0x0, - 0x60, 0x4, 0xe8, 0x9f, 0x2c, 0x72, 0x0, 0xb0, - 0x4, 0x77, 0x7f, 0x53, 0x88, 0x16, 0x8, 0x7, - 0xff, 0x0, 0x96, 0xb4, 0x80, - - /* U+0043 "C" */ - 0x0, 0xf1, 0xc6, 0x77, 0xf6, 0xd2, 0x80, 0x7e, - 0x2b, 0xc7, 0x31, 0x1, 0x25, 0xae, 0x50, 0xe, - 0x5d, 0x40, 0x1, 0x2b, 0xb2, 0x0, 0x6, 0xa0, - 0x2, 0x5a, 0x0, 0x26, 0x6d, 0x44, 0xdf, 0xc8, - 0x81, 0x80, 0x6, 0x80, 0xf, 0x66, 0x1, 0xe6, - 0xc7, 0xb0, 0x5, 0x80, 0x16, 0x0, 0x3f, 0x8a, - 0x0, 0x2, 0xa0, 0xa, 0x0, 0xff, 0xe1, 0x20, - 0x1, 0x80, 0x3f, 0xf8, 0x7a, 0x0, 0xc0, 0xf, - 0xfe, 0x19, 0x0, 0x18, 0x3, 0xff, 0xac, 0x40, - 0x6, 0x0, 0xff, 0xe1, 0xe8, 0x3, 0x0, 0x3f, - 0xf8, 0x68, 0x0, 0x60, 0xf, 0xfe, 0x18, 0xa8, - 0x2, 0x80, 0x3f, 0xf8, 0x76, 0x0, 0x58, 0x0, - 0xfe, 0x29, 0x0, 0x86, 0x80, 0xf, 0x66, 0x1, - 0xe6, 0xc6, 0xb0, 0x9, 0x68, 0x0, 0x99, 0xb5, - 0x10, 0xaf, 0x91, 0x3, 0x0, 0xcb, 0xa6, 0x0, - 0x25, 0x77, 0x28, 0x0, 0x6a, 0x0, 0x38, 0xb3, - 0xe, 0x62, 0x2, 0x4b, 0x5c, 0xa0, 0x0, - - /* U+0044 "D" */ - 0x1f, 0xff, 0xee, 0xc9, 0x40, 0xf, 0xfe, 0x20, - 0x9b, 0x5e, 0xa0, 0x7, 0xc5, 0x11, 0xe6, 0x30, - 0x1, 0x5c, 0x0, 0x79, 0x9d, 0xfd, 0x39, 0xac, - 0x0, 0x78, 0x0, 0xff, 0xe1, 0x14, 0xd0, 0x1, - 0xd0, 0x3, 0xff, 0x86, 0xb2, 0x0, 0x80, 0xf, - 0xfe, 0x23, 0x10, 0x19, 0x80, 0x3f, 0xf8, 0x96, - 0x0, 0x40, 0xf, 0xfe, 0x22, 0x80, 0x34, 0x3, - 0xff, 0x88, 0x40, 0x6, 0x0, 0xff, 0xec, 0x10, - 0x1, 0x80, 0x3f, 0xf8, 0x8a, 0x0, 0xd0, 0xf, - 0xfe, 0x25, 0x80, 0x10, 0x3, 0xff, 0x86, 0xc4, - 0x6, 0x60, 0xf, 0xfe, 0x12, 0x48, 0x2, 0x0, - 0x3f, 0xf8, 0x23, 0x36, 0x0, 0x74, 0x0, 0xcc, - 0xef, 0xe9, 0xce, 0x60, 0x3, 0xc0, 0x7, 0x14, - 0x47, 0x98, 0xc0, 0x5, 0x70, 0x1, 0xff, 0xc1, - 0x13, 0x6b, 0xd4, 0x0, 0xc0, - - /* U+0045 "E" */ - 0x1f, 0xff, 0xfe, 0xe, 0x0, 0x7f, 0xf2, 0xa, - 0x23, 0xfd, 0x20, 0x19, 0x9d, 0xff, 0xca, 0x1, - 0xff, 0xff, 0x0, 0xfe, 0x4f, 0xff, 0xe9, 0x0, - 0xff, 0xe4, 0x94, 0xcf, 0xf5, 0x0, 0x73, 0x37, - 0xf8, 0xc0, 0x3f, 0xff, 0x2c, 0xef, 0xff, 0x8, - 0x4, 0x51, 0x1f, 0xf1, 0x80, 0x7f, 0xf1, 0x0, - - /* U+0046 "F" */ - 0x1f, 0xff, 0xfe, 0xe, 0x0, 0x7f, 0xf1, 0x8a, - 0x23, 0xfd, 0x20, 0x13, 0x3b, 0xff, 0x94, 0x3, - 0xff, 0xfe, 0x1, 0x33, 0x7f, 0x8c, 0x3, 0x14, - 0xcf, 0xf5, 0x0, 0x7f, 0xf1, 0xd3, 0xff, 0xfa, - 0x40, 0x3f, 0xff, 0xe0, 0x1f, 0xfd, 0x30, - - /* U+0047 "G" */ - 0x0, 0xf1, 0xc6, 0x77, 0xfb, 0x69, 0x84, 0x3, - 0xe2, 0xbc, 0x73, 0x10, 0x1, 0x2c, 0xf3, 0x80, - 0x72, 0xea, 0x0, 0x9, 0x5d, 0xca, 0x20, 0x8, - 0xb0, 0x9, 0x28, 0x0, 0x79, 0xb5, 0x10, 0xae, - 0xb2, 0x6, 0x10, 0x1b, 0x0, 0x3e, 0x18, 0x7, - 0x93, 0x5f, 0x4, 0x20, 0x0, 0xb0, 0x1, 0xfe, - 0x81, 0x1, 0x60, 0x5, 0x0, 0x7f, 0xf0, 0x90, - 0x0, 0xc0, 0x1f, 0xfc, 0x3d, 0x0, 0x60, 0x7, - 0xff, 0xc, 0x80, 0xc, 0x1, 0xff, 0xc0, 0x11, - 0x0, 0x7f, 0xf1, 0x1f, 0xb8, 0x64, 0x0, 0x60, - 0xf, 0xfe, 0x1e, 0x80, 0x30, 0x3, 0xff, 0x86, - 0x80, 0x6, 0x0, 0xff, 0xe1, 0x8b, 0x0, 0x28, - 0x3, 0xff, 0x87, 0x0, 0x5, 0x80, 0xf, 0xfe, - 0x10, 0xd8, 0x1, 0xf0, 0xc0, 0x3c, 0x76, 0x1, - 0xc9, 0x40, 0x3, 0xcd, 0xa8, 0x84, 0xee, 0x18, - 0x9, 0x0, 0x4b, 0xa8, 0x0, 0x25, 0x77, 0x31, - 0x0, 0x1b, 0xc4, 0x3, 0x15, 0xe3, 0x98, 0x80, - 0x9, 0x67, 0xa4, 0x40, - - /* U+0048 "H" */ - 0x1f, 0xf5, 0x80, 0x7f, 0xdf, 0xec, 0x0, 0xff, - 0xff, 0x80, 0x7f, 0xff, 0x13, 0xff, 0xfe, 0x0, - 0xff, 0xe6, 0x14, 0x47, 0xfc, 0x1, 0xe6, 0x77, - 0xff, 0x80, 0x3f, 0xff, 0xe0, 0x1f, 0xfe, 0xa0, - - /* U+0049 "I" */ - 0x1f, 0xf5, 0x80, 0x7f, 0xff, 0xc0, - - /* U+004A "J" */ - 0x0, 0x27, 0xff, 0xf4, 0x80, 0x7f, 0xf0, 0xd6, - 0x23, 0xce, 0x1, 0xc2, 0xef, 0xeb, 0x0, 0xff, - 0xff, 0x80, 0x7f, 0xfd, 0xdc, 0x0, 0x20, 0x6, - 0x0, 0xf6, 0x0, 0x38, 0x2a, 0x60, 0x3, 0xb, - 0x80, 0x1c, 0x5c, 0x1f, 0x61, 0xa3, 0xc0, 0xa, - 0x22, 0xf3, 0x2, 0x79, 0x71, 0x3, 0xa0, 0x1, - 0x65, 0x20, 0x80, 0xa4, 0xe0, 0x0, - - /* U+004B "K" */ - 0x1f, 0xf5, 0x80, 0x7f, 0x17, 0x7f, 0x10, 0x7, - 0xff, 0x4, 0xb0, 0x43, 0x48, 0x3, 0xff, 0x80, - 0x38, 0x21, 0x66, 0x1, 0xff, 0xc0, 0x1c, 0x10, - 0xa4, 0x0, 0xff, 0xe0, 0xe, 0x10, 0x4a, 0x80, - 0x7f, 0xf0, 0x74, 0x82, 0x18, 0x3, 0xff, 0x83, - 0x86, 0xe, 0xe0, 0xf, 0xfe, 0xd, 0x98, 0x34, - 0x0, 0x7f, 0xf0, 0x6d, 0x1, 0x64, 0x3, 0xff, - 0x83, 0x48, 0x0, 0x30, 0xf, 0xfe, 0xc, 0xa8, - 0x4, 0xcc, 0x0, 0xff, 0x91, 0x80, 0x5c, 0x1, - 0x26, 0x1, 0xff, 0xc0, 0x1c, 0x87, 0x0, 0x68, - 0x80, 0x7f, 0x87, 0x8, 0x21, 0x0, 0x74, 0x3, - 0xf8, 0x70, 0x80, 0x2b, 0x30, 0x3a, 0x0, 0xfc, - 0xa4, 0x1, 0xda, 0x20, 0xae, 0x1, 0xff, 0xc2, - 0x1d, 0x0, 0x42, 0x0, 0x7f, 0xf0, 0x8e, 0xc0, - 0x14, 0x40, 0x1f, 0xfc, 0x24, 0x80, 0x1f, 0x0, - 0xff, 0xe1, 0xbb, 0x1, 0x58, 0x0, - - /* U+004C "L" */ - 0x1f, 0xf5, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, - 0xe0, 0x1f, 0xff, 0xf0, 0xf, 0xfe, 0x8b, 0x3b, - 0xff, 0x88, 0x2, 0x28, 0x8f, 0xf3, 0x80, 0x7f, - 0xf0, 0xc0, - - /* U+004D "M" */ - 0x1f, 0xf4, 0x0, 0x7f, 0xf0, 0xf3, 0xf0, 0x2, - 0x72, 0x0, 0xff, 0xe0, 0xb1, 0x80, 0x7a, 0x0, - 0x3f, 0xf8, 0x30, 0x1, 0xf2, 0xa0, 0x7, 0xfd, - 0x2, 0x1, 0xfa, 0x40, 0x3f, 0xc4, 0xe0, 0x1f, - 0x8, 0x13, 0x0, 0x7f, 0x40, 0x7, 0xe4, 0x30, - 0x81, 0x0, 0xf9, 0x14, 0x20, 0x40, 0x3d, 0xe0, - 0x30, 0x1, 0xf4, 0x81, 0x38, 0x7, 0xc6, 0xc0, - 0xc4, 0x1, 0xcc, 0x41, 0x20, 0x1f, 0xd0, 0x0, - 0x90, 0xe, 0x80, 0x44, 0x0, 0x7f, 0xc, 0x2, - 0x28, 0x5, 0x2, 0x12, 0x1, 0xff, 0x39, 0x5, - 0x80, 0x9, 0xc1, 0xc8, 0x3, 0xff, 0x81, 0x20, - 0x2e, 0x12, 0x3, 0x0, 0x1f, 0xfc, 0x14, 0x50, - 0x86, 0x40, 0x80, 0xf, 0xfe, 0x1c, 0x0, 0x24, - 0xd, 0x80, 0x3f, 0xf8, 0x64, 0xe0, 0x17, 0x80, - 0x7f, 0xf1, 0x60, 0x41, 0x4c, 0x3, 0xff, 0x8d, - 0x4d, 0x60, 0x1f, 0xfc, 0x74, 0x91, 0x0, 0xff, - 0xe9, 0x80, - - /* U+004E "N" */ - 0x1f, 0xf5, 0x0, 0x7f, 0xdf, 0xec, 0x0, 0x95, - 0x80, 0x3f, 0xf8, 0xb2, 0x60, 0x1f, 0xfc, 0x5d, - 0x10, 0xf, 0xfe, 0x20, 0xe8, 0x7, 0xff, 0x8, - 0xc8, 0xe, 0x40, 0x3f, 0xf8, 0x2f, 0xe0, 0x6, - 0x50, 0xf, 0xfe, 0x9, 0x50, 0x2, 0x88, 0x3, - 0xff, 0x82, 0xac, 0x0, 0xf1, 0x0, 0xff, 0xe0, - 0xc9, 0x81, 0x50, 0x7, 0xff, 0xb, 0x44, 0x12, - 0x0, 0x3f, 0xf8, 0x23, 0xa0, 0x7, 0x40, 0xf, - 0xfe, 0x9, 0xc8, 0x2, 0xc8, 0x3, 0xff, 0x82, - 0xca, 0x0, 0xf0, 0xf, 0xfe, 0x15, 0x18, 0x15, - 0x0, 0x7f, 0xf0, 0xb8, 0x41, 0x40, 0x3f, 0xf8, - 0x45, 0x40, 0x1f, 0xfc, 0x54, 0x80, 0xf, 0xfe, - 0x2b, 0xa8, 0x7, 0xff, 0x16, 0x88, 0x0, - - /* U+004F "O" */ - 0x0, 0xf1, 0xc6, 0x77, 0xfb, 0x69, 0x80, 0x3f, - 0xe2, 0xbc, 0x73, 0x10, 0x1, 0x2c, 0xf3, 0x80, - 0x7e, 0x5d, 0x40, 0x1, 0x2b, 0xb2, 0x0, 0x6, - 0x2c, 0x40, 0x39, 0x28, 0x0, 0x99, 0xb5, 0x13, - 0x7f, 0x20, 0x4, 0xd0, 0xc, 0x34, 0x0, 0x7b, - 0x30, 0xf, 0x36, 0x90, 0x1c, 0x80, 0x50, 0x20, - 0xb0, 0x1, 0xfc, 0x5e, 0x0, 0x62, 0x1, 0x60, - 0x5, 0x0, 0x7f, 0xc5, 0x0, 0xb, 0x4, 0x0, - 0x30, 0x7, 0xff, 0x5, 0x80, 0x8, 0x1a, 0x0, - 0xc0, 0xf, 0xfe, 0x8, 0x90, 0x10, 0x10, 0x1, - 0x80, 0x3f, 0xf8, 0x4c, 0x0, 0x20, 0xf, 0xfe, - 0x51, 0x0, 0x18, 0x3, 0xff, 0x84, 0xc0, 0x2, - 0xd0, 0x6, 0x0, 0x7f, 0xf0, 0x44, 0x80, 0x81, - 0x0, 0xc, 0x1, 0xff, 0xc1, 0x60, 0x2, 0x0, - 0xb0, 0x2, 0x80, 0x3f, 0xe2, 0x80, 0x5, 0x80, - 0x20, 0x41, 0x60, 0x3, 0xf8, 0xbc, 0x0, 0xc4, - 0x0, 0x1a, 0x0, 0x3d, 0x98, 0x7, 0x9b, 0x48, - 0xe, 0x40, 0x32, 0x50, 0x1, 0x33, 0x6a, 0x26, - 0xfe, 0x40, 0x7, 0xa0, 0x1e, 0x5d, 0x40, 0x1, - 0x2b, 0xb2, 0x0, 0x51, 0x82, 0x1, 0xf1, 0x5e, - 0x39, 0x88, 0x0, 0x96, 0x7d, 0xc0, 0x38, - - /* U+0050 "P" */ - 0x1f, 0xff, 0xed, 0xa5, 0x0, 0xff, 0xe1, 0x12, - 0xd6, 0x98, 0x7, 0x14, 0x47, 0x3a, 0x80, 0xb, - 0xc, 0x3, 0x33, 0xbf, 0x45, 0x7a, 0x80, 0x38, - 0x3, 0xff, 0x83, 0x48, 0x4, 0xa0, 0x1f, 0xfc, - 0x1f, 0x0, 0x60, 0x7, 0xff, 0x5, 0x40, 0x4, - 0x1, 0xff, 0xd2, 0x50, 0x1, 0x0, 0x7f, 0xf0, - 0x7c, 0x1, 0x80, 0x1f, 0xfc, 0x9, 0x40, 0x25, - 0x0, 0x99, 0xdf, 0xd5, 0xec, 0x0, 0xe0, 0xc, - 0x51, 0x1e, 0x50, 0x1, 0x61, 0x80, 0x7f, 0xc4, - 0xb5, 0xa6, 0x1, 0xc9, 0xff, 0xed, 0xa5, 0x0, - 0xff, 0xff, 0x80, 0x7f, 0xf0, 0x80, - - /* U+0051 "Q" */ - 0x0, 0xf1, 0x46, 0x77, 0xfb, 0x69, 0x80, 0x3f, - 0xf8, 0x5, 0x7a, 0xe6, 0x20, 0x2, 0x59, 0xe7, - 0x0, 0xfe, 0x4d, 0x40, 0x1, 0x2b, 0xb2, 0x0, - 0x6, 0x2c, 0x40, 0x3c, 0x96, 0x0, 0x3c, 0xda, - 0x89, 0xbf, 0x80, 0x2, 0x68, 0x7, 0xd, 0x0, - 0x1f, 0xc, 0x3, 0xcf, 0xa4, 0x7, 0x0, 0x1a, - 0x4, 0x16, 0x0, 0x3f, 0x8b, 0xc0, 0xe, 0x40, - 0x13, 0x0, 0x28, 0x3, 0xfe, 0x27, 0x0, 0x50, - 0x1, 0x40, 0xc, 0x1, 0xff, 0xc1, 0x90, 0x2, - 0x80, 0x34, 0x1, 0x80, 0x1f, 0xfc, 0x11, 0x20, - 0x20, 0x0, 0x80, 0x18, 0x3, 0xff, 0x84, 0xc0, - 0x2, 0x3, 0x0, 0xff, 0xe2, 0x88, 0x0, 0xc0, - 0x80, 0xc, 0x1, 0xff, 0xc2, 0x60, 0x0, 0x86, - 0x80, 0x34, 0x3, 0xff, 0x82, 0x26, 0x4, 0x0, - 0x40, 0x3, 0x0, 0x7f, 0xf0, 0x58, 0x0, 0xa0, - 0x1, 0x50, 0x19, 0x0, 0xff, 0x8a, 0x0, 0x14, - 0x1, 0x40, 0x1, 0x9c, 0x3, 0xf8, 0x7c, 0x0, - 0xc4, 0x1, 0x15, 0x0, 0x22, 0x88, 0x3, 0xcb, - 0xe4, 0x7, 0x20, 0x1c, 0xb2, 0x0, 0x5d, 0xc8, - 0x77, 0x4f, 0x50, 0x81, 0xe8, 0x7, 0xcd, 0x84, - 0x0, 0x37, 0x88, 0x30, 0x80, 0x23, 0x4, 0x3, - 0xf1, 0xed, 0x29, 0x0, 0x62, 0x9e, 0x70, 0xf, - 0xfe, 0x2, 0xd6, 0xfc, 0x0, 0x8, 0x82, 0x1, - 0xa4, 0xc0, 0x3f, 0xe7, 0x90, 0x5, 0xd2, 0xa3, - 0x6b, 0x70, 0x7, 0xff, 0x1, 0xac, 0x41, 0x6a, - 0xe4, 0x82, 0x40, 0x3f, 0xf8, 0x29, 0xd2, 0x62, - 0x4, 0xfc, 0x80, - - /* U+0052 "R" */ - 0x1f, 0xff, 0xed, 0xa5, 0x0, 0xff, 0xe1, 0x92, - 0xd6, 0x98, 0x7, 0x8a, 0x23, 0x9d, 0x40, 0x5, - 0x86, 0x1, 0xcc, 0xef, 0xd1, 0x5e, 0xa0, 0xe, - 0x0, 0xff, 0xe1, 0x52, 0x1, 0x28, 0x7, 0xff, - 0xb, 0xc0, 0x18, 0x1, 0xff, 0xc2, 0x50, 0x1, - 0x0, 0x7f, 0xf5, 0x14, 0x0, 0x40, 0x1f, 0xfc, - 0x2f, 0x0, 0x60, 0x7, 0xff, 0x6, 0x50, 0x5, - 0x40, 0x33, 0x37, 0x9e, 0x79, 0x80, 0x1a, 0x1, - 0xc5, 0x33, 0xd0, 0xc2, 0x5, 0x86, 0x1, 0xff, - 0xc2, 0x4d, 0x30, 0xf, 0x27, 0xff, 0x8c, 0x10, - 0xc0, 0x3f, 0xf8, 0x5c, 0x0, 0xd0, 0xf, 0xfe, - 0x11, 0x48, 0xd, 0x0, 0x7f, 0xf0, 0x99, 0x1, - 0x54, 0x1, 0xff, 0xc2, 0xa1, 0xb, 0x10, 0xf, - 0xfe, 0x8, 0xd0, 0xd, 0x0, - - /* U+0053 "S" */ - 0x0, 0xcd, 0x7b, 0xfe, 0xec, 0x83, 0x0, 0xe5, - 0xe9, 0x42, 0x0, 0x9, 0xbe, 0x60, 0x80, 0x9, - 0x42, 0x6, 0xf3, 0x28, 0x40, 0x1, 0x98, 0x1, - 0x20, 0xa, 0xc8, 0x66, 0x3d, 0xfc, 0xb0, 0x81, - 0x90, 0x32, 0x80, 0x7c, 0xd2, 0x0, 0x60, 0x7, - 0x80, 0x7f, 0xf0, 0x18, 0x1, 0x80, 0x1f, 0xfc, - 0x3, 0x10, 0x58, 0x0, 0xff, 0xe0, 0x40, 0x1, - 0xfe, 0x98, 0x80, 0x3f, 0x35, 0x8, 0x1, 0x67, - 0x75, 0x28, 0x1, 0xe5, 0xe9, 0x40, 0x8, 0x9a, - 0xf4, 0xc0, 0x3c, 0xd7, 0xf6, 0xe6, 0x0, 0x2c, - 0x30, 0xf, 0xc9, 0x19, 0xa8, 0x0, 0xe0, 0xf, - 0xf8, 0xac, 0xc0, 0x84, 0x3, 0xff, 0x80, 0x80, - 0x2, 0x5, 0x0, 0xff, 0x10, 0x0, 0x96, 0xad, - 0x0, 0x3e, 0x65, 0x4, 0x1f, 0x4, 0xbe, 0x97, - 0x66, 0x46, 0xc8, 0x2, 0x2, 0xa0, 0x40, 0x5a, - 0x26, 0x4e, 0x40, 0x58, 0x60, 0x7, 0xea, 0x62, - 0x10, 0x12, 0x5a, 0xd3, 0x0, 0x0, - - /* U+0054 "T" */ - 0xef, 0xff, 0xfe, 0x1a, 0x80, 0x7f, 0xf1, 0x62, - 0x3c, 0xe0, 0x3, 0x88, 0xf3, 0xb3, 0xbf, 0x50, - 0x1, 0x5d, 0xfc, 0x40, 0x1f, 0xff, 0xf0, 0xf, - 0xff, 0xf8, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xc6, - - /* U+0055 "U" */ - 0x3f, 0xf4, 0x80, 0x7f, 0x9b, 0xfc, 0xa0, 0x1f, - 0xff, 0xf0, 0xf, 0xff, 0xf8, 0x7, 0xff, 0x90, - 0x40, 0x6, 0x1, 0xfe, 0x10, 0x0, 0x90, 0x1, - 0xc0, 0x3f, 0xda, 0x0, 0x60, 0x30, 0x22, 0x0, - 0x7f, 0x20, 0x9, 0x5, 0x80, 0x20, 0x3, 0xf3, - 0x88, 0x38, 0x1, 0xc4, 0x16, 0x40, 0x3c, 0xf0, - 0x0, 0xb0, 0xa, 0x80, 0xd, 0xd5, 0x10, 0xae, - 0x80, 0x5, 0x10, 0x4, 0x98, 0x20, 0x2a, 0xee, - 0x51, 0x1, 0xb5, 0x0, 0xe3, 0xe9, 0x51, 0x0, - 0xa, 0x4f, 0x20, 0x4, - - /* U+0056 "V" */ - 0xd, 0xff, 0x18, 0x7, 0xff, 0x0, 0x7f, 0xd8, - 0x16, 0x0, 0x90, 0xf, 0xfe, 0x3, 0x0, 0x24, - 0x18, 0x41, 0x44, 0x3, 0xfe, 0x90, 0x15, 0x0, - 0x30, 0x2, 0x40, 0x3f, 0xca, 0x21, 0x20, 0x14, - 0x80, 0x18, 0x3, 0xfd, 0x20, 0x6, 0x0, 0x85, - 0x40, 0x54, 0x3, 0xf1, 0x98, 0x18, 0x40, 0x34, - 0x80, 0x24, 0x3, 0xf4, 0x80, 0x2c, 0x3, 0x8c, - 0xc0, 0x66, 0x0, 0xf0, 0xa8, 0x21, 0x0, 0x7a, - 0x40, 0x12, 0x1, 0xe9, 0x0, 0x70, 0x7, 0xca, - 0x20, 0xa2, 0x1, 0xcc, 0x2, 0xa0, 0x1f, 0x98, - 0x1, 0x20, 0x19, 0x84, 0x24, 0x3, 0xfa, 0x40, - 0xc, 0x1, 0xac, 0x0, 0xc0, 0x1f, 0xc2, 0xa0, - 0x2a, 0x0, 0x42, 0x6, 0x10, 0xf, 0xf4, 0x80, - 0x24, 0x1, 0xc0, 0xb, 0x0, 0xff, 0x8c, 0xc0, - 0x66, 0x25, 0x4, 0x20, 0xf, 0xfe, 0x4, 0x80, - 0x26, 0x80, 0x1e, 0x1, 0xff, 0xc1, 0x51, 0x5, - 0x70, 0x24, 0x0, 0xff, 0xe1, 0x48, 0x6, 0xa0, - 0xf, 0xfe, 0x1b, 0x0, 0x66, 0x0, 0xff, 0xe1, - 0x8b, 0x0, 0x18, 0x40, 0x3e, - - /* U+0057 "W" */ - 0xe, 0xfe, 0x0, 0xff, 0x4f, 0xf9, 0x40, 0x3f, - 0x8f, 0xfc, 0xe0, 0xe0, 0x28, 0x1, 0xfc, 0xe0, - 0xf, 0x0, 0xfe, 0xb0, 0x2, 0x86, 0x80, 0x34, - 0x3, 0xf2, 0x8, 0x1, 0x40, 0x3f, 0x94, 0xc, - 0x81, 0x4, 0x1c, 0x3, 0xf6, 0x80, 0x65, 0x0, - 0xf8, 0xc8, 0x2c, 0x2, 0x40, 0x13, 0x0, 0xf9, - 0xc1, 0x0, 0x1e, 0x1, 0xf5, 0x80, 0x14, 0x2, - 0xe0, 0x5, 0x0, 0x79, 0x4, 0x3d, 0x1, 0x40, - 0x3e, 0x50, 0x22, 0x0, 0x48, 0x0, 0x70, 0xf, - 0x68, 0x1, 0x34, 0x0, 0xa0, 0x1c, 0x44, 0xa, - 0x0, 0xe5, 0x1, 0x30, 0xe, 0x70, 0x50, 0x70, - 0x7, 0x80, 0x75, 0x0, 0x14, 0x3, 0xbc, 0x1, - 0x60, 0x19, 0x4, 0x38, 0x5, 0x1, 0x40, 0x39, - 0x40, 0x88, 0x1, 0xca, 0x0, 0x50, 0xd, 0xc0, - 0x28, 0x0, 0xd0, 0x2, 0x0, 0x44, 0x40, 0x50, - 0xf, 0x94, 0x8, 0xc0, 0x25, 0x4, 0x0, 0x9c, - 0x1, 0xc0, 0x15, 0x0, 0x2c, 0x3, 0xef, 0x0, - 0x58, 0x1, 0x0, 0x1c, 0x1, 0xa, 0x2, 0x80, - 0x4a, 0x4, 0x60, 0x1f, 0x28, 0x1, 0x40, 0x1c, - 0x2, 0x80, 0x1b, 0x80, 0x8, 0x4, 0x40, 0x50, - 0xf, 0xe5, 0x2, 0x20, 0x28, 0x38, 0x7, 0x28, - 0x3, 0x41, 0x40, 0x16, 0x1, 0xfd, 0xe0, 0xa, - 0x50, 0x6, 0x80, 0x79, 0x1, 0xc2, 0x80, 0x8c, - 0x3, 0xf9, 0x40, 0xb, 0xe0, 0x28, 0x1, 0xee, - 0x1, 0x72, 0x5, 0x0, 0xff, 0x90, 0x9, 0x41, - 0xc0, 0x3e, 0x50, 0x4, 0x0, 0x2c, 0x3, 0xfe, - 0xe0, 0xd, 0xa0, 0x1f, 0x90, 0x2, 0x13, 0x0, - 0xff, 0x90, 0x2, 0x14, 0x0, 0xfd, 0xc0, 0x13, - 0x80, 0x7f, 0xf0, 0x5, 0x0, 0xe, 0x1, 0xfc, - 0xa0, 0x15, 0x0, 0x78, - - /* U+0058 "X" */ - 0xc, 0xff, 0x28, 0x7, 0xf3, 0x7f, 0xa4, 0x1, - 0xc0, 0xa, 0x20, 0xf, 0x8a, 0x40, 0xa4, 0x0, - 0x52, 0x0, 0xe0, 0xf, 0xbc, 0x1, 0xc0, 0x19, - 0x90, 0xd, 0xc0, 0x3a, 0x8, 0x20, 0xc0, 0x3a, - 0x84, 0x20, 0xc0, 0x24, 0x70, 0x47, 0x0, 0xf0, - 0xd0, 0x3, 0x80, 0x3, 0x40, 0x34, 0x1, 0xf9, - 0x18, 0xa, 0x82, 0xc4, 0x2c, 0x40, 0x3f, 0xa4, - 0x81, 0x69, 0x41, 0x94, 0x3, 0xfe, 0xf0, 0x2, - 0x81, 0x48, 0x7, 0xff, 0x0, 0xa0, 0x2, 0x90, - 0xf, 0xfe, 0x15, 0x80, 0x5c, 0x1, 0xff, 0xc1, - 0x83, 0x0, 0x95, 0x80, 0x3f, 0xe4, 0x70, 0x2d, - 0x0, 0x49, 0x0, 0x7f, 0xd, 0x0, 0x3c, 0xa4, - 0x1, 0xc0, 0x1f, 0xd6, 0x21, 0x4, 0xc, 0xa0, - 0x70, 0x1, 0xf3, 0x28, 0x23, 0x80, 0x56, 0x20, - 0xe8, 0x1, 0xc5, 0x20, 0x34, 0x1, 0x87, 0x40, - 0x14, 0x20, 0x1b, 0xc0, 0x16, 0x20, 0x1c, 0x6e, - 0x3, 0x60, 0x14, 0x90, 0x2a, 0x80, 0x3e, 0x83, - 0x5, 0x60, 0x46, 0x2, 0xa0, 0xf, 0xee, 0x0, - 0x49, 0x0, - - /* U+0059 "Y" */ - 0xc, 0xff, 0x18, 0x7, 0xfd, 0xbf, 0xc0, 0xf, - 0x0, 0x78, 0x7, 0xf9, 0xc8, 0x2c, 0x0, 0x6c, - 0x6, 0xc0, 0x1f, 0x86, 0x1, 0x14, 0x2, 0x81, - 0x8, 0x0, 0xfd, 0x60, 0x9, 0x0, 0xc3, 0x0, - 0x32, 0x1, 0xe3, 0x50, 0x72, 0x0, 0xe6, 0x20, - 0x62, 0x0, 0xee, 0x1, 0x80, 0xf, 0xb8, 0x1, - 0x20, 0x19, 0x88, 0x2c, 0x3, 0xf1, 0xa8, 0x22, - 0x80, 0x6, 0x0, 0xd4, 0x3, 0xfa, 0xc0, 0x16, - 0x0, 0x81, 0xe, 0x0, 0xff, 0xc, 0x0, 0xc1, - 0xb0, 0x31, 0x0, 0x7f, 0xce, 0x40, 0xfc, 0x3, - 0x20, 0x1f, 0xfc, 0x1e, 0x0, 0x10, 0x40, 0x7, - 0xff, 0x8, 0xd4, 0x0, 0x6c, 0x1, 0xff, 0xc3, - 0xf0, 0x5, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xfd, - 0x20, - - /* U+005A "Z" */ - 0x9f, 0xff, 0xfe, 0x19, 0x80, 0x7f, 0xf1, 0x76, - 0x23, 0xfe, 0x20, 0x2, 0x1a, 0x3b, 0xff, 0x8c, - 0x80, 0x68, 0x3, 0xfe, 0x2b, 0x0, 0x68, 0x80, - 0x7f, 0xde, 0x0, 0x93, 0x0, 0xff, 0xa8, 0x81, - 0x98, 0x1, 0xff, 0x3a, 0x81, 0xc8, 0x7, 0xfc, - 0x90, 0x3, 0xc0, 0x1f, 0xf0, 0xd0, 0x2, 0x88, - 0x3, 0xfe, 0xd1, 0x8, 0x40, 0xf, 0xfa, 0x4c, - 0x11, 0xc0, 0x3f, 0xe6, 0x60, 0x15, 0x80, 0x7f, - 0xc7, 0x20, 0xf, 0x0, 0xff, 0x87, 0x40, 0x14, - 0x40, 0x1f, 0xf5, 0x8, 0x32, 0x80, 0x7f, 0xd0, - 0x80, 0x72, 0x1, 0xff, 0x2b, 0x80, 0x11, 0xdf, - 0xfe, 0x49, 0x0, 0x9e, 0x23, 0xfe, 0xd0, 0xf, - 0xfe, 0x28, - - /* U+005B "[" */ - 0x1f, 0xfe, 0xc0, 0xf, 0xf2, 0x66, 0x38, 0x2, - 0x13, 0x31, 0x0, 0x7f, 0xff, 0xc0, 0x3f, 0xfe, - 0x22, 0x66, 0x20, 0x9, 0x33, 0x1c, 0x1, 0xf0, - - /* U+005C "\\" */ - 0x7, 0x83, 0x0, 0xff, 0x63, 0xc0, 0x7, 0xfb, - 0x81, 0x4, 0x3, 0xf9, 0x40, 0xe, 0x1, 0xfe, - 0x50, 0xa0, 0xf, 0xf7, 0x81, 0x88, 0x7, 0xf2, - 0x80, 0x18, 0x3, 0xfc, 0xa1, 0x40, 0x1f, 0xee, - 0x2, 0x20, 0x7, 0xf2, 0x8, 0x50, 0x7, 0xf9, - 0xc1, 0x40, 0x3f, 0xd4, 0x4, 0x60, 0x1f, 0xc6, - 0x21, 0x60, 0x1f, 0xe6, 0x6, 0x0, 0xff, 0x50, - 0xa, 0x0, 0x7f, 0x11, 0x3, 0x40, 0x3f, 0xd4, - 0xe, 0x1, 0xfe, 0x50, 0x14, 0x0, 0xfe, 0x23, - 0xe, 0x0, 0xff, 0x58, 0x28, 0x7, 0xf9, 0x80, - 0xa, 0x1, 0xfc, 0x28, 0x1c, 0x1, 0xfe, 0xd0, - 0x41, 0x0, 0xfe, 0x70, 0x3, 0x80, 0x7f, 0xa, - 0x6, 0x80, 0x7f, 0xb8, 0x10, 0x40, 0x3f, 0x94, - 0x0, 0xe0, - - /* U+005D "]" */ - 0x7f, 0xfe, 0x60, 0xf, 0x9b, 0x31, 0x0, 0x10, - 0x99, 0xc0, 0x1f, 0xff, 0xf0, 0xf, 0xff, 0x88, - 0x99, 0xc0, 0x13, 0x66, 0x20, 0x3, 0xfc, - - /* U+005E "^" */ - 0x0, 0xe7, 0x83, 0x0, 0xfe, 0x58, 0x78, 0x0, - 0xfe, 0x90, 0x2, 0x10, 0x7, 0xc6, 0x62, 0x80, - 0xb0, 0xf, 0xa4, 0x2d, 0x81, 0x80, 0x3c, 0x2a, - 0xc, 0x2a, 0xc, 0x1, 0xd2, 0xc, 0x0, 0x90, - 0xb0, 0xe, 0x60, 0xb0, 0x1, 0x91, 0x10, 0x2, - 0x61, 0x42, 0x0, 0xac, 0x3c, 0x2, 0xb0, 0xf0, - 0xc, 0xc0, 0x84, 0x8, 0x44, 0x40, 0xe, 0x60, - 0xb0, 0xf0, 0xa0, 0xf, 0x58, 0x30, 0x0, - - /* U+005F "_" */ - 0xbb, 0xff, 0xe1, 0x22, 0x7f, 0xf0, 0x80, - - /* U+0060 "`" */ - 0x38, 0x83, 0x80, 0x63, 0xe7, 0x8b, 0x0, 0xcd, - 0xa4, 0x98, 0x20, 0x11, 0x6a, 0x9e, 0x8, - - /* U+0061 "a" */ - 0x0, 0xb, 0xdf, 0x7f, 0xb6, 0x90, 0x3, 0x47, - 0x42, 0x8, 0x0, 0x96, 0xe4, 0x2, 0x50, 0x15, - 0x9a, 0x95, 0x0, 0x33, 0x0, 0x1d, 0x1d, 0x4c, - 0xad, 0x5a, 0x0, 0x80, 0x1, 0xb8, 0x7, 0x89, - 0xc0, 0x48, 0x3, 0xfd, 0xc0, 0x6, 0x0, 0x14, - 0x67, 0x73, 0xfe, 0x90, 0xc, 0xda, 0xe6, 0x22, - 0x0, 0xf0, 0x94, 0x80, 0xd7, 0x7f, 0xe9, 0x0, - 0x94, 0x1, 0x4a, 0x20, 0x1f, 0xb8, 0x0, 0xa0, - 0x1e, 0xe0, 0xb, 0x80, 0x8, 0x1, 0xc4, 0xe0, - 0x12, 0x80, 0x2d, 0x40, 0x2, 0xd8, 0x1, 0x8a, - 0x80, 0x6b, 0xfd, 0xd2, 0x2c, 0x1, 0x97, 0x58, - 0x40, 0x4, 0xdb, 0x40, 0x10, - - /* U+0062 "b" */ - 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, - 0x4b, 0x7d, 0xfb, 0x6a, 0x1, 0xf3, 0x65, 0x20, - 0x81, 0x25, 0x69, 0x0, 0x75, 0x98, 0x2c, 0x4b, - 0x88, 0x16, 0x90, 0x6, 0x12, 0xda, 0x76, 0x8e, - 0x60, 0x7, 0x80, 0x77, 0x90, 0x7, 0x4a, 0x81, - 0x28, 0x4, 0xc4, 0x1, 0xf4, 0x0, 0x3c, 0x2, - 0xc0, 0xf, 0xc4, 0x20, 0xc0, 0x13, 0x0, 0x7f, - 0x18, 0x10, 0x4, 0xc0, 0x1f, 0xc6, 0x4, 0x1, - 0x60, 0x7, 0xe3, 0x10, 0x60, 0x9, 0x88, 0x3, - 0xe8, 0x0, 0x78, 0x6, 0xf2, 0x0, 0xe9, 0x40, - 0x25, 0x0, 0x88, 0x9b, 0x4e, 0xd1, 0xcc, 0x0, - 0xf0, 0xd, 0xc6, 0xb, 0x12, 0xe2, 0x5, 0xa4, - 0x1, 0x87, 0x29, 0x4, 0x5, 0x2b, 0x48, 0x0, - - /* U+0063 "c" */ - 0x0, 0xc7, 0x3b, 0xfe, 0xd9, 0x30, 0xe, 0x1b, - 0xc6, 0x20, 0x1, 0x36, 0x48, 0x4, 0x38, 0x80, - 0x2d, 0x32, 0x60, 0x3, 0x40, 0x2, 0x88, 0x17, - 0xa5, 0x99, 0x3c, 0x60, 0x11, 0xa0, 0x1d, 0x0, - 0x70, 0xee, 0xa0, 0x2c, 0x1, 0x0, 0x1f, 0x9, - 0x0, 0xc, 0x0, 0x80, 0x1f, 0xf3, 0x80, 0x80, - 0x7f, 0xf0, 0x1c, 0x4, 0x3, 0xff, 0x80, 0x60, - 0x4, 0x0, 0xff, 0xa8, 0x1, 0x0, 0x1f, 0x9, - 0x0, 0x9, 0x0, 0xe8, 0x3, 0x87, 0x75, 0x0, - 0xa, 0x20, 0x5e, 0x96, 0x64, 0xf1, 0x80, 0x61, - 0xc4, 0x1, 0x69, 0x93, 0x0, 0x1e, 0x0, 0x21, - 0xbc, 0x62, 0x0, 0x13, 0x64, 0x0, 0x0, - - /* U+0064 "d" */ - 0x0, 0xff, 0xe0, 0x17, 0xfa, 0x0, 0x3f, 0xff, - 0xe0, 0x1f, 0xcb, 0x5b, 0xfd, 0x8c, 0x1, 0xf1, - 0x65, 0x29, 0x0, 0x9c, 0xeb, 0x0, 0x61, 0xc3, - 0x1, 0x69, 0x92, 0x81, 0x50, 0x6, 0xd1, 0x5, - 0xe9, 0x66, 0x57, 0x18, 0x80, 0x46, 0x60, 0x3a, - 0x0, 0xe1, 0xd1, 0x0, 0xa8, 0x1, 0x0, 0x1f, - 0xb, 0x0, 0x44, 0x0, 0x40, 0xf, 0xd6, 0x1, - 0x38, 0x8, 0x7, 0xf0, 0x80, 0x4e, 0x2, 0x1, - 0xfc, 0x20, 0x11, 0x0, 0xc, 0x3, 0xf2, 0x0, - 0x54, 0x0, 0x80, 0xf, 0xd4, 0x1, 0x19, 0x81, - 0x20, 0x3, 0xd6, 0x40, 0x1b, 0x44, 0x1f, 0x18, - 0xd1, 0xf9, 0x4, 0x3, 0xe, 0x18, 0x1c, 0xe5, - 0xc0, 0x8b, 0x40, 0x38, 0xb2, 0x90, 0x80, 0x4e, - 0x38, 0xc0, 0x20, - - /* U+0065 "e" */ - 0x0, 0xc9, 0x7b, 0xfd, 0x8c, 0x20, 0x1c, 0x39, - 0x68, 0x40, 0x27, 0x3e, 0x80, 0x10, 0xf9, 0x82, - 0x4d, 0xd3, 0x0, 0xda, 0x0, 0x28, 0x42, 0xec, - 0xc8, 0xb3, 0xa4, 0x14, 0x26, 0x81, 0x28, 0x1, - 0xc5, 0xe0, 0x2f, 0x40, 0x6, 0x0, 0xf8, 0x90, - 0x34, 0x80, 0x1f, 0xff, 0xc8, 0xc, 0xe0, 0x1f, - 0xfc, 0x13, 0x70, 0x7, 0xff, 0xfd, 0xc6, 0x0, - 0x40, 0xf, 0xfa, 0xc0, 0x10, 0x1, 0xf8, 0x40, - 0x6, 0x80, 0x76, 0x20, 0x1c, 0xbe, 0x60, 0xa, - 0x20, 0x4e, 0x96, 0x64, 0x65, 0xf, 0x80, 0x7, - 0x10, 0x0, 0xd3, 0x27, 0x30, 0x2e, 0x0, 0x86, - 0xf1, 0x88, 0x40, 0x56, 0xb4, 0x80, - - /* U+0066 "f" */ - 0x0, 0xc3, 0x1b, 0xfd, 0x68, 0x1, 0xe, 0x39, - 0x0, 0xa6, 0x80, 0x50, 0x40, 0xb7, 0x66, 0xa0, - 0x9, 0xc0, 0xa9, 0x11, 0x26, 0x1, 0x8, 0x20, - 0x7, 0xc2, 0x1, 0xfa, 0x7f, 0x80, 0xd, 0xff, - 0x70, 0x7, 0xff, 0x2, 0xf2, 0xc0, 0x9, 0x99, - 0x68, 0x11, 0xa8, 0x0, 0x4c, 0xf0, 0x7, 0xff, - 0xfc, 0x3, 0xff, 0xc6, - - /* U+0067 "g" */ - 0x0, 0xcb, 0x7b, 0xfd, 0x8e, 0x21, 0x9f, 0x80, - 0x3, 0xda, 0x42, 0x1, 0x38, 0xf4, 0x0, 0xc7, - 0x84, 0x4, 0xf3, 0x27, 0x11, 0x59, 0x0, 0x5c, - 0x0, 0x7d, 0x86, 0x64, 0x73, 0x80, 0x80, 0x14, - 0x81, 0xa0, 0x3, 0xd0, 0xc0, 0x17, 0x80, 0x2c, - 0x3, 0xf5, 0x80, 0x4c, 0x2, 0x40, 0x1f, 0x88, - 0x40, 0x30, 0x80, 0x7f, 0x84, 0x0, 0xc0, 0x2, - 0x0, 0xfc, 0x40, 0x17, 0x80, 0x20, 0x3, 0xf4, - 0x0, 0x4a, 0x40, 0xb2, 0x1, 0xe9, 0x50, 0xd, - 0xe0, 0x6, 0xe9, 0x66, 0x4f, 0x30, 0x7, 0x16, - 0x10, 0xb, 0x4c, 0x98, 0x45, 0x60, 0x7, 0x0, - 0x1e, 0xd2, 0x10, 0x9, 0xc7, 0xa0, 0x0, 0x40, - 0x32, 0xde, 0xff, 0x63, 0x89, 0x0, 0xc, 0x3, - 0xff, 0x81, 0x40, 0xc, 0x3, 0xe6, 0x0, 0xf9, - 0x5c, 0x5, 0x43, 0xc6, 0x7a, 0x9d, 0x99, 0x19, - 0x40, 0xb, 0x0, 0x71, 0x80, 0xac, 0x4c, 0x9c, - 0xc0, 0x12, 0xa0, 0x2, 0xcc, 0x3a, 0x8, 0x0, - 0x52, 0x39, 0x80, 0x0, - - /* U+0068 "h" */ - 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf8, - 0x8d, 0x7d, 0xfd, 0x6a, 0x1, 0xe6, 0xd9, 0x41, - 0x1, 0x4a, 0xb0, 0xe, 0xa2, 0x16, 0x88, 0x28, - 0x1, 0x24, 0x3, 0x93, 0xa5, 0xdd, 0x58, 0x0, - 0x62, 0x0, 0x86, 0xc0, 0x38, 0xe0, 0x0, 0x80, - 0x14, 0x80, 0x7c, 0x80, 0xe, 0x0, 0x8c, 0x3, - 0xe2, 0x0, 0x8, 0x4, 0xe0, 0x1f, 0xe3, 0x0, - 0xff, 0xff, 0x80, 0x7f, 0xf4, 0x80, - - /* U+0069 "i" */ - 0x5e, 0xd3, 0x81, 0x29, 0x60, 0x6, 0xdc, 0xd3, - 0x83, 0x28, 0x7, 0x3f, 0xf8, 0xc0, 0x3f, 0xfd, - 0x80, - - /* U+006A "j" */ - 0x0, 0xe3, 0xee, 0x20, 0x7, 0x40, 0x8a, 0x0, - 0x38, 0x80, 0xa, 0x1, 0xd3, 0x38, 0x3, 0xcc, - 0xc0, 0xf, 0xfe, 0x1a, 0xff, 0x98, 0x3, 0xff, - 0xfe, 0x1, 0xff, 0xef, 0x30, 0xe, 0xc0, 0x3, - 0x5, 0xb2, 0xc3, 0x0, 0x9a, 0xa4, 0xd3, 0x80, - 0x28, 0x1d, 0x48, 0x5, 0x31, 0x0, - - /* U+006B "k" */ - 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, - 0xe9, 0xfe, 0xe2, 0x0, 0xff, 0x2d, 0x80, 0xe1, - 0x0, 0x7f, 0x35, 0x0, 0xe1, 0x0, 0x7f, 0x3c, - 0x80, 0xe1, 0x0, 0x7f, 0x44, 0x0, 0x70, 0x80, - 0x3f, 0xa5, 0xc0, 0x70, 0x80, 0x3f, 0x3d, 0x30, - 0x1, 0xc8, 0x3, 0xfa, 0x94, 0x2, 0x65, 0x0, - 0xfe, 0x10, 0x3a, 0x0, 0x51, 0x0, 0x7f, 0x26, - 0x2b, 0x80, 0x3c, 0x3, 0xf2, 0xd8, 0x2, 0x10, - 0xa, 0x80, 0x3e, 0x90, 0xd, 0x64, 0xa, 0xe0, - 0x1f, 0xfc, 0xf, 0x0, 0x42, 0x0, 0x7f, 0xc5, - 0x40, 0xa, 0x10, 0xf, 0xf9, 0x5c, 0x7, 0x40, - - /* U+006C "l" */ - 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x38, - - /* U+006D "m" */ - 0x7f, 0xf1, 0xc, 0x67, 0x7e, 0xc9, 0x80, 0x45, - 0x1b, 0xfe, 0xd9, 0x20, 0xf, 0x3f, 0xb9, 0x88, - 0x13, 0x63, 0x83, 0xeb, 0x90, 0x0, 0x9b, 0x58, - 0x3, 0xa8, 0x4e, 0x6e, 0x94, 0x1, 0x15, 0x0, - 0x73, 0x74, 0xa0, 0x9, 0x30, 0xe, 0x7c, 0x64, - 0x5a, 0x90, 0x2, 0x83, 0xe3, 0x22, 0xd4, 0x0, - 0x20, 0x3, 0x14, 0x0, 0x73, 0x10, 0x0, 0xe0, - 0x3, 0x9c, 0x81, 0x0, 0x35, 0x0, 0x7c, 0x80, - 0xb, 0x0, 0xf9, 0x0, 0x2, 0x1, 0x18, 0x7, - 0xdc, 0x0, 0x30, 0xf, 0x84, 0x0, 0x60, 0x13, - 0x80, 0x7f, 0x9c, 0x3, 0xfc, 0x20, 0x1f, 0xff, - 0xf0, 0xf, 0xff, 0xf8, 0x7, 0xff, 0x50, - - /* U+006E "n" */ - 0x7f, 0xf1, 0x3, 0xe7, 0x7f, 0x5a, 0x80, 0x79, - 0xfa, 0xc, 0x40, 0x52, 0xac, 0x3, 0xa8, 0x4a, - 0x2a, 0x8e, 0x20, 0x92, 0x1, 0xcd, 0xae, 0xaa, - 0x8c, 0x10, 0x62, 0x0, 0x8a, 0x40, 0x38, 0xa4, - 0x0, 0x80, 0x15, 0x0, 0x7c, 0xa0, 0xe, 0x0, - 0x8c, 0x3, 0xe3, 0x0, 0x8, 0x4, 0xe0, 0x1f, - 0xe3, 0x0, 0xff, 0xff, 0x80, 0x7f, 0xf4, 0x80, - - /* U+006F "o" */ - 0x0, 0xc9, 0x5b, 0xfd, 0xb0, 0x40, 0x1e, 0x1b, - 0xb2, 0x90, 0x9, 0x3e, 0xc0, 0x6, 0x1f, 0x40, - 0x16, 0x99, 0x28, 0x1, 0xec, 0x2, 0xa1, 0x5, - 0xe9, 0x66, 0x57, 0x18, 0x23, 0x81, 0xa0, 0x1d, - 0x0, 0x70, 0xe8, 0x84, 0x85, 0x80, 0x20, 0x3, - 0xe1, 0x90, 0x15, 0x30, 0x2, 0x0, 0x7e, 0x40, - 0x1, 0x38, 0x8, 0x7, 0xf0, 0x80, 0x39, 0xc0, - 0x40, 0x3f, 0x84, 0x1, 0xc6, 0x0, 0x40, 0xf, - 0xd6, 0x0, 0x2b, 0x0, 0x40, 0x7, 0xc2, 0xc0, - 0x2a, 0x68, 0x7, 0x40, 0x1c, 0x3a, 0x21, 0x20, - 0xa, 0x20, 0x5e, 0x96, 0x65, 0x71, 0x82, 0x38, - 0x0, 0x71, 0x0, 0x5a, 0x64, 0xa0, 0x7, 0xb0, - 0xc, 0x37, 0x65, 0x20, 0x12, 0x6d, 0x80, 0x8, - - /* U+0070 "p" */ - 0x7f, 0xf1, 0x3, 0x5f, 0x7e, 0xda, 0x80, 0x7c, - 0xdb, 0x28, 0x20, 0x49, 0x5a, 0x40, 0x1d, 0x44, - 0x2f, 0x76, 0x93, 0x2, 0xd2, 0x0, 0xc2, 0x7f, - 0x8, 0x86, 0xc8, 0x0, 0x78, 0x6, 0x1d, 0x10, - 0xe, 0x76, 0x2, 0x50, 0x9, 0x84, 0x3, 0xeb, - 0x0, 0x78, 0x5, 0x80, 0x1f, 0x88, 0x41, 0x80, - 0x27, 0x0, 0xfe, 0x30, 0x20, 0x9, 0x80, 0x3f, - 0x8c, 0x8, 0x2, 0xc0, 0xf, 0xc6, 0x20, 0xc0, - 0x13, 0x10, 0x7, 0xd0, 0x0, 0xf0, 0xd, 0xe4, - 0x1, 0xd2, 0x80, 0x4a, 0x1, 0x9, 0x6d, 0x3b, - 0x47, 0x30, 0x3, 0xc0, 0x35, 0x18, 0x2c, 0x4b, - 0x88, 0x16, 0x90, 0x6, 0x7c, 0xa4, 0x10, 0x14, - 0xad, 0x20, 0xf, 0x96, 0xfb, 0xfa, 0xd4, 0x3, - 0xff, 0xf0, - - /* U+0071 "q" */ - 0x0, 0xcb, 0x5b, 0xfd, 0x8c, 0x0, 0xff, 0x40, - 0x0, 0xb2, 0x94, 0x80, 0x4e, 0x74, 0x80, 0x30, - 0xe1, 0x80, 0xb4, 0xc9, 0x40, 0xb0, 0x3, 0x68, - 0x82, 0xf4, 0xb3, 0x2b, 0x4c, 0x40, 0x23, 0x30, - 0x1d, 0x0, 0x71, 0x68, 0x80, 0x54, 0x0, 0x80, - 0xf, 0x86, 0x40, 0x22, 0x0, 0x20, 0x7, 0xe4, - 0x0, 0x9c, 0x4, 0x3, 0xf8, 0x40, 0x27, 0x1, - 0x0, 0xfe, 0x10, 0x8, 0x80, 0x8, 0x1, 0xfa, - 0xc0, 0x2a, 0x0, 0x40, 0x7, 0xc2, 0xc0, 0x11, - 0x98, 0xe, 0x80, 0x38, 0x74, 0x40, 0x36, 0x88, - 0x2f, 0x4b, 0x32, 0xb8, 0xc4, 0x3, 0xe, 0x18, - 0xb, 0x4c, 0x94, 0xf, 0x40, 0x38, 0xb2, 0x90, - 0x80, 0x4e, 0x70, 0x40, 0x3e, 0x5b, 0xdf, 0xec, - 0x60, 0xf, 0xff, 0xc8, - - /* U+0072 "r" */ - 0x7f, 0xf1, 0x3, 0x67, 0x40, 0x4, 0x3b, 0x26, - 0x20, 0x1b, 0x88, 0xd, 0xb4, 0x2, 0x22, 0x6e, - 0x4a, 0x80, 0x6c, 0x20, 0xf, 0x38, 0x80, 0x7d, - 0xa0, 0x1f, 0x98, 0x3, 0xff, 0xf0, - - /* U+0073 "s" */ - 0x0, 0x8a, 0x77, 0xfd, 0xd9, 0x6, 0x1, 0xa3, - 0x58, 0x80, 0x2, 0x6f, 0x90, 0x0, 0x57, 0x1, - 0x79, 0xa9, 0x61, 0xa, 0x0, 0x70, 0x3, 0x21, - 0x95, 0xa7, 0xb0, 0x80, 0xc, 0x4, 0x40, 0xf, - 0x18, 0x4, 0xc0, 0x4e, 0x1, 0xfe, 0x80, 0x4, - 0x75, 0xc2, 0x88, 0x7, 0x1d, 0x90, 0xa, 0x3d, - 0x76, 0xa8, 0x6, 0x4d, 0xc9, 0x63, 0x0, 0x15, - 0x38, 0x7, 0x1b, 0x4e, 0x7d, 0x8, 0x40, 0x7, - 0xf9, 0x58, 0x0, 0x40, 0xae, 0x1, 0xf1, 0x80, - 0xc, 0x2e, 0x3e, 0x9d, 0x54, 0xf8, 0x80, 0x82, - 0x22, 0x0, 0x2c, 0x55, 0x20, 0xc0, 0xe8, 0x7, - 0x30, 0xe6, 0x20, 0x2, 0x5a, 0xc1, 0x0, - - /* U+0074 "t" */ - 0x0, 0xa2, 0xa, 0x1, 0xf0, 0xbb, 0xbc, 0x3, - 0xff, 0x9f, 0x3f, 0xc0, 0x5, 0xff, 0xb8, 0x3, - 0xff, 0x81, 0x79, 0x60, 0x4, 0xcc, 0xb4, 0x8, - 0xd4, 0x0, 0x26, 0x78, 0x3, 0xff, 0xf2, 0x20, - 0x1f, 0xfc, 0x14, 0x0, 0xfc, 0xa0, 0x36, 0xaa, - 0xa4, 0x0, 0xa0, 0x41, 0x2a, 0x8b, 0xe0, 0x11, - 0x7b, 0x8, 0xa, 0xc0, - - /* U+0075 "u" */ - 0x9f, 0xf0, 0x80, 0x7c, 0xbf, 0xe6, 0x0, 0xff, - 0xff, 0x80, 0x7f, 0xf8, 0x44, 0x0, 0x40, 0x1f, - 0x68, 0x5, 0xa0, 0x4, 0x0, 0xf9, 0x80, 0x24, - 0x0, 0x49, 0x0, 0x75, 0x8, 0x4, 0x2e, 0x3, - 0x90, 0x88, 0x6d, 0x50, 0xe, 0x85, 0x1, 0x7b, - 0xb4, 0x90, 0xd0, 0x7, 0x55, 0xa8, 0x80, 0x9c, - 0x73, 0x80, 0x40, - - /* U+0076 "v" */ - 0xd, 0xfe, 0x0, 0xfe, 0x2f, 0xf3, 0x85, 0x80, - 0xb0, 0x7, 0xeb, 0x0, 0x30, 0x30, 0x85, 0x0, - 0x7c, 0x2c, 0xc, 0x20, 0x6, 0x3, 0x30, 0x7, - 0x98, 0x1, 0x60, 0x15, 0x0, 0x24, 0x3, 0xd2, - 0x8, 0x40, 0x11, 0x28, 0x28, 0x80, 0x65, 0x10, - 0xf0, 0xe, 0x90, 0x4, 0x80, 0x69, 0x2, 0x40, - 0xe, 0x32, 0x6, 0x0, 0x8c, 0xc1, 0x60, 0x1f, - 0x58, 0xa, 0x80, 0x24, 0x0, 0xc0, 0x1f, 0x30, - 0x84, 0x80, 0xa8, 0x30, 0x7, 0xf3, 0x1, 0x99, - 0x80, 0x16, 0x1, 0xfd, 0x20, 0x9, 0x90, 0x21, - 0x0, 0x7f, 0xa, 0x82, 0x88, 0x78, 0x7, 0xfd, - 0x20, 0x11, 0x20, 0x7, 0xfc, 0x66, 0x0, 0x58, - 0x7, 0x80, - - /* U+0077 "w" */ - 0xaf, 0xe0, 0xf, 0xd5, 0xfc, 0x1, 0xfa, 0x7f, - 0x78, 0x5, 0x0, 0x3c, 0x2a, 0x2, 0xa0, 0x1f, - 0x38, 0x52, 0x8, 0x68, 0x7, 0x9c, 0x2, 0xe0, - 0xf, 0x28, 0x83, 0x3, 0x3, 0x0, 0x7a, 0x80, - 0x24, 0x10, 0xe, 0xe0, 0x41, 0xa, 0x0, 0x28, - 0x6, 0x23, 0xa, 0x0, 0x38, 0x6, 0x14, 0xe, - 0x0, 0x11, 0x87, 0x0, 0x6a, 0x2, 0x54, 0xa, - 0x0, 0xce, 0x2, 0xa0, 0x15, 0x82, 0x8, 0x4, - 0xc1, 0x41, 0xc0, 0x64, 0x1, 0x50, 0x38, 0x6, - 0x60, 0x3, 0x80, 0x10, 0x41, 0x81, 0x44, 0x28, - 0x0, 0x46, 0x14, 0x1, 0x85, 0x2, 0x80, 0x1c, - 0x8, 0x20, 0x7, 0x6, 0x0, 0x50, 0x11, 0x80, - 0x77, 0x1, 0x90, 0xa8, 0x70, 0x5, 0x40, 0x28, - 0xc, 0x14, 0x1, 0xe5, 0x10, 0xa7, 0x0, 0x28, - 0x4, 0x66, 0xd, 0x41, 0x6, 0x0, 0xf9, 0xc1, - 0x68, 0x18, 0x3, 0xa8, 0x1b, 0x81, 0x4, 0x3, - 0xea, 0x2, 0x30, 0xa0, 0xe, 0x70, 0x2, 0x86, - 0x80, 0x7e, 0x32, 0x0, 0x11, 0x80, 0x70, 0xa8, - 0x4, 0xc0, 0x1f, 0xd4, 0x0, 0xa0, 0xf, 0xb8, - 0x0, 0xa0, 0x1c, - - /* U+0078 "x" */ - 0x1e, 0xfe, 0x10, 0xf, 0x4f, 0xf9, 0x40, 0x74, - 0x7, 0x40, 0x39, 0x58, 0x19, 0x40, 0x7, 0x20, - 0x70, 0x1, 0x15, 0x81, 0xc8, 0x6, 0x65, 0x7, - 0x50, 0x7, 0x8, 0x70, 0x7, 0xa8, 0x82, 0xca, - 0x4c, 0x28, 0x80, 0x3e, 0xf0, 0x1c, 0x60, 0x75, - 0x0, 0xfc, 0x52, 0x2, 0x7, 0x0, 0x1f, 0xe6, - 0x10, 0x4, 0x80, 0x7f, 0xd4, 0x20, 0xb, 0x20, - 0xf, 0xe6, 0x50, 0x50, 0x1e, 0x0, 0xfc, 0x72, - 0x7, 0x54, 0x3, 0x90, 0xf, 0xf, 0x0, 0xe8, - 0x2b, 0x3, 0x28, 0x7, 0x51, 0x5, 0x8, 0x2, - 0x48, 0x28, 0x80, 0x27, 0x40, 0x74, 0x0, 0xde, - 0x0, 0xf0, 0x1, 0xc0, 0x1c, 0x0, 0x71, 0x50, - 0x15, 0x0, - - /* U+0079 "y" */ - 0xd, 0xfe, 0x0, 0xfe, 0x2f, 0xf3, 0x85, 0x80, - 0xb0, 0x7, 0xeb, 0x0, 0x38, 0x30, 0x85, 0x80, - 0x7c, 0x2c, 0xe, 0x1, 0x48, 0x12, 0x80, 0x7a, - 0x40, 0x12, 0x1, 0x30, 0x2, 0x40, 0x3c, 0xc0, - 0xa2, 0x1, 0xb, 0x1, 0x98, 0x3, 0x30, 0x84, - 0x80, 0x75, 0x80, 0x24, 0x3, 0x58, 0x19, 0x80, - 0x38, 0x94, 0x14, 0x40, 0x8, 0x41, 0x0, 0x1f, - 0x48, 0x2, 0x40, 0x1e, 0x4, 0x80, 0x1f, 0x19, - 0x81, 0xc0, 0x90, 0x2c, 0x3, 0xfa, 0x0, 0xf, - 0x60, 0x2c, 0x1, 0xfc, 0x84, 0x12, 0xc1, 0x20, - 0x1f, 0xf5, 0x80, 0x80, 0x18, 0x3, 0xfe, 0x61, - 0x0, 0x30, 0x80, 0x7f, 0xf0, 0x1c, 0x1, 0x60, - 0x1f, 0xfc, 0x1, 0x60, 0x42, 0x0, 0xf8, 0x40, - 0x34, 0x0, 0x20, 0x3, 0xf7, 0xdb, 0x2d, 0x30, - 0x29, 0x80, 0x7c, 0xc2, 0x93, 0x4a, 0x5, 0x60, - 0x1f, 0x9a, 0x4c, 0x0, 0x51, 0xa2, 0x1, 0xf8, - - /* U+007A "z" */ - 0xbf, 0xff, 0xf9, 0x40, 0x3f, 0xf8, 0x3, 0x39, - 0x9f, 0x38, 0x1, 0x10, 0x46, 0x7e, 0x17, 0x2, - 0xa0, 0xf, 0x87, 0xc0, 0x1c, 0x20, 0x1f, 0x51, - 0x5, 0x18, 0x7, 0xd0, 0x80, 0xea, 0x1, 0xf2, - 0x38, 0x24, 0x0, 0x7c, 0x56, 0x3, 0x40, 0x1f, - 0xbc, 0x1, 0xa2, 0x1, 0xf5, 0x10, 0x49, 0x80, - 0x7c, 0xea, 0xc, 0xc0, 0xf, 0x92, 0x0, 0x68, - 0xcf, 0xe1, 0x90, 0x0, 0xe6, 0x7e, 0x93, 0x0, - 0xff, 0xe0, 0x0, - - /* U+007B "{" */ - 0x0, 0xcd, 0x9f, 0xe4, 0x0, 0x9e, 0x4c, 0x3, - 0xd2, 0x0, 0x8c, 0x50, 0x0, 0x88, 0x11, 0xcc, - 0x40, 0x6, 0x0, 0x30, 0xf, 0xff, 0x68, 0x9c, - 0x0, 0x34, 0x2, 0x7c, 0x50, 0x65, 0x0, 0xf9, - 0x4, 0x2, 0x6f, 0x80, 0x27, 0x0, 0xe5, 0x0, - 0x70, 0x7, 0xff, 0xbc, 0xc0, 0x6, 0x1, 0xc2, - 0x20, 0x48, 0x31, 0x0, 0xa0, 0x0, 0xf8, 0xa0, - 0x13, 0x51, 0x80, 0x40, - - /* U+007C "|" */ - 0x1f, 0xf3, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, - 0xa0, - - /* U+007D "}" */ - 0x7f, 0xf5, 0xa0, 0x7, 0xc9, 0x68, 0x1, 0x35, - 0xb0, 0x2, 0x0, 0x21, 0x49, 0x20, 0x30, 0xf, - 0x38, 0x7, 0xff, 0xc8, 0x80, 0x10, 0x60, 0x1a, - 0x50, 0x1f, 0xc, 0x2, 0x35, 0x0, 0xfa, 0xc4, - 0x2b, 0xcc, 0x2, 0x30, 0x2, 0x80, 0x7f, 0xfb, - 0xdc, 0x3, 0x85, 0x24, 0x80, 0xc0, 0x26, 0xb6, - 0x0, 0x40, 0x7, 0x92, 0xd0, 0x2, - - /* U+007E "~" */ - 0x0, 0x3f, 0x7e, 0x18, 0x6, 0x2f, 0xa0, 0x78, - 0x10, 0x3c, 0x60, 0x9, 0xc0, 0x82, 0x42, 0x76, - 0x2, 0x60, 0x6, 0x3, 0xc, 0x51, 0x89, 0xec, - 0x5f, 0xf8, 0x91, 0xc, 0x18, 0x1, 0x27, 0xa8, - 0x1, 0x68, 0x0, - - /* U+00B0 "°" */ - 0x0, 0xc2, 0x1, 0xf3, 0xf7, 0x3f, 0x10, 0x2, - 0xa8, 0x49, 0x81, 0xb5, 0x4, 0x57, 0xa6, 0x7d, - 0x3a, 0xd, 0x8, 0x0, 0xd0, 0xa, 0x44, 0x0, - 0xe6, 0x3, 0x22, 0x8, 0x6, 0x70, 0x2a, 0xb, - 0x0, 0x86, 0xc5, 0xd, 0xd7, 0x66, 0xb8, 0x68, - 0x1, 0x14, 0x2c, 0x8b, 0xa8, 0x0, - - /* U+2022 "•" */ - 0x0, 0x84, 0x2, 0x4e, 0xe6, 0x8, 0x50, 0x81, - 0xd0, 0x88, 0x2, 0x61, 0x10, 0x4, 0xe1, 0xa6, - 0x9, 0x60, - - /* U+F001 "" */ - 0x0, 0xff, 0xe6, 0x89, 0x80, 0x7f, 0xf2, 0xce, - 0x37, 0xb2, 0x40, 0x3f, 0xf8, 0xc2, 0xb5, 0xd8, - 0xe4, 0x0, 0x60, 0xf, 0xfe, 0x19, 0x3e, 0x75, - 0x28, 0x80, 0x7f, 0xf1, 0x92, 0x7b, 0x60, 0xc0, - 0x3f, 0xf8, 0xc2, 0xd7, 0xf6, 0xc2, 0x1, 0xff, - 0xc8, 0x8e, 0x94, 0x0, 0xff, 0xe6, 0x38, 0x7, - 0xff, 0x78, 0x59, 0x0, 0x3f, 0xf9, 0x47, 0x19, - 0xd2, 0x60, 0x1f, 0xfc, 0x61, 0x5a, 0xec, 0x73, - 0x0, 0xff, 0xe3, 0x13, 0xe7, 0x52, 0x88, 0x7, - 0xff, 0x1d, 0x77, 0x50, 0x60, 0x1f, 0xfc, 0xb2, - 0x20, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xf8, 0x2f, - 0x59, 0x68, 0x1, 0xff, 0xc9, 0x5e, 0x85, 0x34, - 0x30, 0xf, 0xfe, 0x41, 0x50, 0x7, 0xff, 0x0, - 0x4c, 0xc4, 0x1, 0xfe, 0x50, 0xf, 0xf8, 0xf3, - 0xb3, 0x1a, 0x1, 0xfe, 0x20, 0xf, 0xe2, 0x5c, - 0x30, 0xf, 0xfe, 0x12, 0xa0, 0x7, 0xe9, 0x80, - 0xf, 0xfe, 0x2d, 0xc0, 0x80, 0x64, 0xd4, 0x20, - 0xf, 0xef, 0x0, 0xfc, 0xfd, 0xcc, 0xdf, 0xb2, - 0x5, 0x0, 0xfe, 0x50, 0xf, 0xf0, 0x99, 0x0, - 0x6a, 0x50, 0xf, 0xd, 0x90, 0x7, 0xff, 0x1a, - 0xb6, 0x15, 0x4d, 0x5c, 0x80, 0x1f, 0xfc, 0x60, - - /* U+F008 "" */ - 0x9b, 0x0, 0xb3, 0xff, 0xff, 0x89, 0x60, 0x15, - 0xcb, 0x2a, 0x24, 0x40, 0x1f, 0xfc, 0x45, 0x44, - 0x95, 0x80, 0x6e, 0xe1, 0x0, 0x2a, 0xff, 0xf0, - 0x0, 0x3, 0x77, 0x8, 0x4, 0xef, 0x0, 0xa, - 0xab, 0xff, 0x80, 0x20, 0x7, 0x78, 0x2, 0x38, - 0x88, 0xc0, 0x3f, 0xf8, 0x89, 0x11, 0x18, 0x7, - 0xff, 0x48, 0x40, 0x21, 0x0, 0xff, 0xe2, 0x30, - 0x4, 0x20, 0x2, 0xff, 0x88, 0x3, 0xff, 0x88, - 0x5f, 0xf1, 0x0, 0x46, 0x70, 0x0, 0xc0, 0x3f, - 0xf8, 0x66, 0x70, 0x4, 0x79, 0x91, 0x80, 0xee, - 0xff, 0xf0, 0x4, 0xf, 0x32, 0x30, 0xf, 0xe2, - 0x2f, 0xfe, 0x0, 0x1, 0xc0, 0x3f, 0xf8, 0x24, - 0x5f, 0xfc, 0x0, 0x3, 0x80, 0x78, 0xf3, 0x23, - 0x1, 0xdd, 0xff, 0xe0, 0x8, 0x1e, 0x64, 0x60, - 0x11, 0x9c, 0x0, 0x30, 0xf, 0xfe, 0x19, 0x9c, - 0x1, 0x17, 0xfc, 0x40, 0x1f, 0xfc, 0x42, 0xff, - 0x88, 0x0, 0x20, 0x10, 0x80, 0x7f, 0xf1, 0x18, - 0x2, 0x10, 0xf, 0xfe, 0x91, 0xc4, 0x46, 0x1, - 0xff, 0xc4, 0x48, 0x88, 0xc0, 0x27, 0x78, 0x0, - 0x55, 0x5f, 0xfc, 0x1, 0x0, 0x3b, 0xc0, 0x10, - 0xdd, 0xc2, 0x0, 0x55, 0xff, 0xe0, 0x0, 0x6, - 0xee, 0x10, 0x55, 0x22, 0x44, 0x1, 0xff, 0xc4, - 0x54, 0x49, 0x58, - - /* U+F00B "" */ - 0x9f, 0xff, 0x58, 0x2, 0xbf, 0xff, 0xf8, 0x92, - 0xc0, 0x1e, 0x42, 0x15, 0x0, 0xff, 0xe2, 0x30, - 0x7, 0xff, 0xfc, 0x3, 0xff, 0xb2, 0xa0, 0x1e, - 0x32, 0x13, 0x0, 0xff, 0xe2, 0x2d, 0x7f, 0xfb, - 0x0, 0x19, 0xff, 0xff, 0xc4, 0xa0, 0xf, 0xfe, - 0x84, 0xff, 0xfa, 0xc0, 0x17, 0xff, 0xff, 0xc4, - 0x96, 0x0, 0xf2, 0x10, 0xa0, 0x7, 0xff, 0x11, - 0x80, 0x3f, 0xff, 0xe0, 0x1f, 0xfd, 0x95, 0x0, - 0xf1, 0x90, 0xa0, 0x7, 0xff, 0x11, 0xab, 0xff, - 0xd8, 0x0, 0xbf, 0xff, 0xfe, 0x24, 0x80, 0x7f, - 0xf4, 0x2b, 0xff, 0xd8, 0x0, 0xcf, 0xff, 0xfe, - 0x25, 0x28, 0x7, 0x8c, 0x84, 0xc0, 0x3f, 0xf8, - 0x8a, 0x1, 0xff, 0xff, 0x0, 0xff, 0xec, 0xb0, - 0x7, 0x90, 0x85, 0x40, 0x3f, 0xf8, 0x8c, - - /* U+F00C "" */ - 0x0, 0xff, 0xe5, 0xaf, 0x48, 0x7, 0xff, 0x31, - 0xa8, 0x5a, 0x80, 0x3f, 0xf9, 0x4d, 0x20, 0x12, - 0xc8, 0x7, 0xff, 0x21, 0xa4, 0x3, 0x98, 0x3, - 0xff, 0x8e, 0xd2, 0x1, 0xe7, 0x0, 0xff, 0xe3, - 0x34, 0x80, 0x79, 0xe0, 0x3, 0xff, 0x8a, 0xd2, - 0x1, 0xe7, 0x80, 0xa, 0x39, 0x40, 0x3f, 0xe6, - 0x90, 0xf, 0x3c, 0x0, 0x54, 0xe3, 0x4c, 0x1, - 0xfc, 0xd2, 0x1, 0xe7, 0x80, 0xa, 0x54, 0x2, - 0x96, 0x0, 0xf9, 0xa4, 0x3, 0xcf, 0x0, 0x19, - 0x80, 0x3a, 0x58, 0x3, 0x9a, 0x40, 0x3c, 0xf0, - 0x1, 0xce, 0x1, 0xe9, 0x60, 0x9, 0xa4, 0x3, - 0xcf, 0x0, 0x1e, 0x87, 0x0, 0xf4, 0xb0, 0x34, - 0x80, 0x79, 0xe0, 0x3, 0xf4, 0x38, 0x7, 0xa6, - 0xa4, 0x3, 0xcf, 0x0, 0x1f, 0xe8, 0x70, 0xf, - 0x28, 0x7, 0x9e, 0x0, 0x3f, 0xf8, 0x10, 0xe0, - 0x1f, 0xf3, 0xc0, 0x7, 0xff, 0xa, 0x1c, 0x3, - 0xf9, 0xe0, 0x3, 0xff, 0x89, 0xe, 0x1, 0xf4, - 0x40, 0x3, 0xff, 0x8d, 0x10, 0x0, 0xe8, 0x70, - 0xf, 0xfe, 0x43, 0xc0, 0x5, 0xe, 0x1, 0xff, - 0xca, 0x78, 0x18, 0x70, 0xf, 0xfe, 0x18, - - /* U+F00D "" */ - 0x0, 0xff, 0xe2, 0x8, 0x6, 0x6f, 0xf2, 0x80, - 0x7f, 0x16, 0xf5, 0x0, 0x1a, 0x40, 0x14, 0xa0, - 0x1f, 0x16, 0x10, 0x2d, 0x4, 0x0, 0x6a, 0x50, - 0xe, 0x2c, 0x10, 0x9, 0x48, 0x80, 0x1d, 0x4a, - 0x1, 0x16, 0x8, 0x7, 0x1f, 0x8, 0x7, 0x52, - 0x81, 0x60, 0x80, 0x75, 0x9, 0x60, 0x80, 0x75, - 0x3e, 0x8, 0x7, 0x52, 0x80, 0xb, 0x4, 0x3, - 0xa0, 0x40, 0x3a, 0x94, 0x3, 0x16, 0x8, 0x7, - 0xfa, 0x94, 0x3, 0xc5, 0x82, 0x1, 0xfa, 0x94, - 0x3, 0xf1, 0x50, 0x7, 0xce, 0xa0, 0x1f, 0xc5, - 0x40, 0x1f, 0x3a, 0x80, 0x7e, 0x2c, 0x10, 0xf, - 0xd4, 0xa0, 0x1e, 0x2c, 0x10, 0xf, 0xf5, 0x28, - 0x6, 0x2c, 0x10, 0xe, 0x91, 0x0, 0xea, 0x50, - 0x1, 0x60, 0x80, 0x75, 0xb6, 0x8, 0x7, 0x52, - 0x87, 0x8, 0x7, 0x5a, 0x1, 0x60, 0x80, 0x75, - 0x9, 0x0, 0x75, 0xa0, 0x4, 0x58, 0x20, 0x1c, - 0x70, 0x1, 0xad, 0x0, 0x38, 0xb0, 0x40, 0x25, - 0x26, 0x90, 0x5, 0xa0, 0x7, 0xc5, 0x84, 0xb, - 0x40, 0x6, 0xff, 0x20, 0x7, 0xf1, 0x6f, 0x50, - 0x0, - - /* U+F011 "" */ - 0x0, 0xff, 0xe0, 0x34, 0xc9, 0x80, 0x3f, 0xf9, - 0x65, 0x2c, 0xc9, 0x20, 0xf, 0xfe, 0x50, 0x80, - 0x61, 0x0, 0xff, 0xe2, 0xd, 0x40, 0x7, 0xff, - 0x2, 0x28, 0x40, 0x3f, 0x8f, 0xd5, 0xd8, 0x3, - 0xfc, 0xce, 0xbe, 0x60, 0x1f, 0x16, 0x88, 0x2, - 0x0, 0x3f, 0xd0, 0x0, 0x1c, 0x30, 0xf, 0x78, - 0x80, 0x7f, 0xf1, 0xf8, 0x40, 0x34, 0x90, 0x4, - 0x3a, 0x1, 0xfe, 0xd1, 0x0, 0x8a, 0x0, 0x22, - 0x60, 0x8, 0x70, 0xc0, 0x3f, 0xc7, 0x82, 0x1, - 0x31, 0x0, 0x2c, 0x3, 0x59, 0x0, 0x7f, 0xf0, - 0xa, 0xc0, 0x35, 0x80, 0x1c, 0x2, 0x35, 0x0, - 0xff, 0xe1, 0x29, 0x80, 0x4e, 0x6, 0x20, 0x14, - 0x80, 0x7f, 0xf1, 0x28, 0x2, 0x13, 0x50, 0xc, - 0xa0, 0x1f, 0xfc, 0x46, 0x0, 0xca, 0x20, 0x10, - 0x80, 0x7f, 0xf1, 0x84, 0x2, 0xef, 0x0, 0x8c, - 0x3, 0xc2, 0x1, 0x84, 0x3, 0xc6, 0x1, 0xf8, - 0xc0, 0x3c, 0x42, 0x0, 0x12, 0x0, 0xf1, 0x80, - 0x5f, 0xc0, 0x10, 0x80, 0x7d, 0xdb, 0xae, 0x0, - 0xf8, 0x40, 0x21, 0x50, 0xc, 0xa0, 0x1f, 0x11, - 0x0, 0x3e, 0x50, 0xc, 0xa6, 0x20, 0x17, 0x0, - 0x7f, 0xf1, 0x38, 0x2, 0x13, 0x7, 0x0, 0x91, - 0x0, 0x1f, 0xfc, 0x24, 0x40, 0x4, 0xe0, 0xb, - 0x0, 0xd4, 0x40, 0x1f, 0xfc, 0x2, 0xa0, 0xd, - 0x60, 0x2, 0x60, 0x8, 0x70, 0xc0, 0x3f, 0xc7, - 0x82, 0x1, 0x31, 0x0, 0x50, 0x20, 0x10, 0xe4, - 0x0, 0x7e, 0x8c, 0x10, 0x8, 0xa0, 0x3, 0xe, - 0x80, 0x73, 0xfd, 0x3a, 0xa9, 0xeb, 0xdc, 0x3, - 0xf, 0x88, 0x7, 0x1e, 0x8, 0x7, 0x2c, 0x55, - 0x21, 0x40, 0x38, 0x74, 0x80, 0x3e, 0x3c, 0x30, - 0xf, 0xfe, 0x11, 0xf9, 0x80, 0x7f, 0x16, 0x48, - 0x80, 0x7f, 0x86, 0x70, 0x40, 0x3f, 0xf8, 0xd, - 0xd6, 0xc4, 0x1, 0x9, 0x35, 0xf3, 0x0, 0x7f, - 0xf1, 0x12, 0x77, 0xfe, 0xed, 0x94, 0x0, 0xfe, - - /* U+F013 "" */ - 0x0, 0xff, 0xec, 0x16, 0x7f, 0xed, 0x60, 0xf, - 0xfe, 0x3b, 0x98, 0x6, 0x2c, 0x0, 0xff, 0xf1, - 0x68, 0x7, 0x98, 0x40, 0x3f, 0xe1, 0xc8, 0x0, - 0x2e, 0xb8, 0x7, 0x8f, 0xa0, 0x0, 0xda, 0x80, - 0x1d, 0xa6, 0xfd, 0x54, 0x20, 0xf, 0xe7, 0xcc, - 0x49, 0x51, 0x0, 0x4e, 0x60, 0x1, 0x50, 0xf, - 0xfe, 0x1, 0x98, 0x0, 0x32, 0x0, 0x18, 0x0, - 0xff, 0xe5, 0x22, 0x1, 0x80, 0x3f, 0xf9, 0x9e, - 0x16, 0x1, 0xfc, 0x31, 0x9b, 0x44, 0x1, 0xfc, - 0x83, 0xe6, 0x1, 0xf0, 0xfb, 0x99, 0x2e, 0xa0, - 0x7, 0xc3, 0x22, 0x79, 0x0, 0x1e, 0xa1, 0x0, - 0xeb, 0x10, 0xe, 0x4f, 0x60, 0x8, 0xc0, 0x38, - 0x50, 0x3, 0xe7, 0x0, 0xe2, 0x10, 0xc, 0x20, - 0x1c, 0x40, 0x1f, 0x84, 0x3, 0x8c, 0x3, 0x84, - 0x3, 0x88, 0x3, 0xf0, 0x80, 0x71, 0x0, 0x71, - 0x80, 0x70, 0xa0, 0x7, 0xce, 0x1, 0xc6, 0x20, - 0x3, 0xc8, 0x0, 0xf5, 0x8, 0x7, 0x58, 0x80, - 0x72, 0x7b, 0x7, 0x98, 0x7, 0xc3, 0xee, 0x64, - 0xba, 0x80, 0x1f, 0xc, 0x8d, 0x80, 0x7f, 0xc, - 0x66, 0xd1, 0x0, 0x7f, 0x20, 0xb0, 0x80, 0x7f, - 0xf2, 0xfc, 0x6, 0x40, 0x3f, 0xf9, 0x48, 0x80, - 0x3, 0x98, 0x0, 0x54, 0x3, 0xff, 0x80, 0x66, - 0x0, 0xd, 0x0, 0x6d, 0x37, 0xea, 0xa1, 0x0, - 0x7f, 0x3e, 0x62, 0x8a, 0x84, 0x3, 0xe, 0x40, - 0x1, 0x75, 0xc0, 0x3c, 0x7f, 0x0, 0x5, 0xd4, - 0x0, 0xff, 0xe0, 0x68, 0x7, 0x98, 0x3, 0xff, - 0xc4, 0xe6, 0x1, 0x8b, 0x0, 0x3f, 0xf8, 0xe5, - 0x9f, 0xfb, 0x58, 0x3, 0xfc, - - /* U+F015 "" */ - 0x0, 0xff, 0xe1, 0x1b, 0xb0, 0x7, 0x24, 0x44, - 0x80, 0x1f, 0xfc, 0x67, 0xc8, 0x9d, 0x10, 0xb, - 0x9d, 0xee, 0x0, 0xff, 0xe2, 0xd4, 0x0, 0x45, - 0xe6, 0x0, 0x10, 0x8, 0x40, 0x3f, 0xf8, 0x63, - 0x8a, 0x1, 0xc3, 0x8c, 0x1, 0xff, 0xc8, 0x3f, - 0x30, 0x9, 0xcc, 0x2, 0x99, 0x0, 0x7f, 0xf1, - 0x9b, 0x4, 0x0, 0x39, 0x18, 0xa0, 0x13, 0x20, - 0x7, 0xff, 0x12, 0x24, 0x2, 0x2c, 0x33, 0xd, - 0x40, 0x7, 0xff, 0x18, 0x6d, 0xc0, 0x25, 0xd2, - 0x8c, 0xc1, 0x3d, 0x80, 0x7f, 0xf1, 0xb, 0x10, - 0x2, 0x7a, 0xb, 0x70, 0x2d, 0x44, 0x69, 0x0, - 0x7f, 0xf0, 0x53, 0x48, 0x2, 0xa8, 0x2d, 0x40, - 0xd, 0x6e, 0x58, 0x80, 0x12, 0x50, 0x7, 0x9e, - 0xc0, 0x21, 0xc5, 0x3c, 0x20, 0xf, 0x45, 0xd, - 0xb0, 0x4, 0xb8, 0x20, 0x15, 0x40, 0x4, 0x7e, - 0x6d, 0x82, 0x1, 0xf9, 0x70, 0x66, 0x40, 0x11, - 0xf9, 0x85, 0xa8, 0x4, 0xb8, 0x33, 0x20, 0xf, - 0xf8, 0xfc, 0xda, 0xc4, 0x0, 0x38, 0x80, 0x1a, - 0x28, 0x6d, 0x80, 0x3f, 0xf8, 0x23, 0x8a, 0x98, - 0x40, 0x13, 0xd9, 0x5, 0xb9, 0x62, 0x0, 0x7f, - 0xf1, 0x2a, 0xb, 0x50, 0x24, 0xc3, 0x35, 0x2, - 0x48, 0x3, 0xff, 0x8c, 0xe6, 0x17, 0x8c, 0x0, - 0x12, 0x0, 0x38, 0x7, 0xff, 0x21, 0xc0, 0x6, - 0x1, 0xff, 0xe3, 0xbf, 0xfc, 0x60, 0x1f, 0xfc, - 0xe6, 0x0, 0xcc, 0x1, 0xff, 0xff, 0x0, 0xff, - 0xfd, 0xa0, 0x7, 0x88, 0x80, 0x1b, 0x0, 0x3c, - 0x2a, 0x1, 0xc0, - - /* U+F019 "" */ - 0x0, 0xff, 0x8d, 0x57, 0x18, 0x7, 0xff, 0x25, - 0x72, 0xab, 0x62, 0x80, 0x7f, 0xf2, 0x34, 0x3, - 0xda, 0x1, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, - 0x7f, 0xff, 0xc0, 0x3f, 0xf8, 0x23, 0x9b, 0xb9, - 0x80, 0x3c, 0xdb, 0xbb, 0x4, 0x3, 0xf2, 0x99, - 0x16, 0x10, 0xf, 0x9, 0x16, 0x35, 0x0, 0xfc, - 0x8c, 0x1, 0xff, 0xc4, 0x64, 0x0, 0xfe, 0x96, - 0x0, 0xff, 0xe1, 0x34, 0x80, 0x7f, 0xd2, 0xc0, - 0x1f, 0xfc, 0x6, 0x90, 0xf, 0xfe, 0xc, 0xb8, - 0x7, 0xf9, 0xe4, 0x3, 0xff, 0x87, 0xe, 0x1, - 0xf9, 0xe0, 0x3, 0xff, 0x8b, 0xe, 0x1, 0xe7, - 0x80, 0xf, 0xf0, 0x8f, 0xe0, 0x87, 0x0, 0xcf, - 0x0, 0x23, 0xf8, 0x2f, 0xbb, 0xf6, 0x8c, 0x38, - 0x1, 0xe0, 0x77, 0xbb, 0xf5, 0xa0, 0x7, 0xe2, - 0xf2, 0x89, 0x94, 0x16, 0x10, 0x7, 0xe4, 0x0, - 0xff, 0xe, 0x1b, 0x30, 0xf0, 0x80, 0x3f, 0xf9, - 0x23, 0x9b, 0xac, 0x10, 0xf, 0xfe, 0x61, 0x10, - 0x3, 0xff, 0xa9, 0x7c, 0x29, 0xee, 0x1, 0xff, - 0xca, 0x13, 0x7, 0x10, 0xc, 0x20, 0x1f, 0xfc, - 0x6a, 0xd1, 0x3e, 0x70, 0x0, 0xec, 0x3b, 0xff, - 0xf3, 0x23, 0x40, - - /* U+F01C "" */ - 0x0, 0xf1, 0x5f, 0xff, 0xff, 0xf, 0xa0, 0x3, - 0xff, 0x80, 0x38, 0x80, 0x1f, 0xfc, 0x31, 0x78, - 0x0, 0xff, 0xac, 0x40, 0x3f, 0xf8, 0xce, 0x60, - 0x1f, 0xca, 0xa0, 0x1, 0x3b, 0xff, 0xf0, 0x58, - 0x2, 0xe0, 0xf, 0xc3, 0x60, 0x17, 0x44, 0x7f, - 0xf0, 0x65, 0x0, 0x5, 0x0, 0x1f, 0x58, 0x80, - 0x1c, 0xc0, 0x3f, 0xf8, 0x54, 0x20, 0x7, 0x30, - 0xe, 0x55, 0x0, 0xa, 0x0, 0x3f, 0xf8, 0x63, - 0x60, 0x17, 0x0, 0x61, 0xb0, 0xb, 0x80, 0x3f, - 0xf8, 0xaa, 0x80, 0x2, 0x80, 0xa, 0xc4, 0x0, - 0xe6, 0x1, 0xff, 0xc6, 0xa1, 0x0, 0x39, 0x2, - 0xa8, 0x0, 0x50, 0x1, 0xff, 0xc7, 0x1b, 0x0, - 0xbc, 0x20, 0x2, 0x68, 0x8e, 0x70, 0xf, 0xe4, - 0x88, 0xed, 0x10, 0x1, 0x29, 0x0, 0x48, 0xef, - 0xd0, 0xe0, 0x1f, 0xa9, 0xdf, 0xc2, 0x1, 0x10, - 0x7, 0xfd, 0x20, 0x1f, 0x38, 0x80, 0x7f, 0xbc, - 0x3, 0xfe, 0x17, 0x0, 0xf4, 0x80, 0x7f, 0xf3, - 0x23, 0xff, 0xc2, 0x1, 0xff, 0xff, 0x0, 0xff, - 0xfa, 0x7a, 0x0, 0x7f, 0xf4, 0x92, 0x90, 0x3, - 0xff, 0x9e, 0x34, 0x60, - - /* U+F021 "" */ - 0x0, 0xff, 0xe6, 0x2c, 0x41, 0x80, 0x3f, 0x92, - 0x77, 0xbf, 0xdd, 0x6e, 0x40, 0x1d, 0xe, 0xe9, - 0x0, 0xf9, 0xb6, 0xd8, 0x84, 0x0, 0x29, 0x1b, - 0x66, 0x1, 0xff, 0xc0, 0x1b, 0x92, 0x0, 0xff, - 0x26, 0x50, 0x80, 0x80, 0x7c, 0x5e, 0x80, 0x1e, - 0x11, 0x0, 0x79, 0x7c, 0xdc, 0x3, 0xc5, 0x82, - 0x1, 0x9a, 0xff, 0xb9, 0xf6, 0x80, 0x18, 0x75, - 0x80, 0x3d, 0xe2, 0x1, 0x1e, 0xca, 0x0, 0x64, - 0xbc, 0x30, 0x8, 0x48, 0x3, 0xa4, 0x80, 0x26, - 0xc2, 0x0, 0xfc, 0x78, 0xe0, 0x1f, 0x89, 0x80, - 0x26, 0x90, 0xf, 0xc2, 0x20, 0x4, 0x38, 0x7, - 0xd6, 0x1, 0x14, 0x80, 0x7e, 0x3e, 0xe7, 0xfb, - 0x98, 0x3, 0xe7, 0x0, 0xa4, 0x3, 0xf9, 0xc0, - 0x30, 0x88, 0x3, 0xc6, 0x20, 0x1, 0x40, 0xf, - 0xfe, 0x50, 0xa1, 0x9a, 0x0, 0x3f, 0xca, 0x86, - 0x7f, 0xe5, 0x2b, 0xcc, 0x30, 0x7, 0xf8, 0x6f, - 0x33, 0xfd, 0x40, 0x1f, 0xfe, 0xca, 0xcc, 0xff, - 0x58, 0x80, 0x7f, 0x9a, 0xf2, 0xc9, 0x4c, 0xff, - 0xc8, 0xa0, 0x1f, 0xe8, 0x43, 0x40, 0xf, 0xfe, - 0x5a, 0x88, 0x0, 0x48, 0x3, 0xc2, 0x20, 0xc, - 0xe0, 0x1f, 0xd0, 0x1, 0x38, 0x7, 0xcd, 0xdf, - 0xee, 0xe1, 0x80, 0x7e, 0xa2, 0x0, 0xac, 0x3, - 0xe7, 0x80, 0x0, 0x88, 0x3, 0xf4, 0xa8, 0x4, - 0xc4, 0x1, 0xf9, 0xec, 0x80, 0x3f, 0x16, 0x30, - 0x4, 0x52, 0x1, 0xc4, 0x20, 0x12, 0x6d, 0x20, - 0x6, 0x4a, 0xd3, 0x0, 0x87, 0xc0, 0x3c, 0xda, - 0x20, 0x19, 0x6f, 0xfb, 0x9f, 0x6a, 0x1, 0x87, - 0x8, 0x3, 0xce, 0x7e, 0xa0, 0x1e, 0x11, 0x0, - 0x79, 0x3c, 0x80, 0x3e, 0x10, 0x1a, 0xc4, 0x0, - 0xff, 0x14, 0xd8, 0x80, 0x7f, 0xf0, 0xe, 0xf6, - 0xc, 0x3, 0x13, 0x5e, 0xb0, 0x7, 0xd2, 0xee, - 0x80, 0xe, 0x27, 0xcf, 0xfd, 0xb2, 0x80, 0x1f, - 0xc0, - - /* U+F026 "" */ - 0x0, 0xff, 0xe6, 0x9d, 0xb0, 0x7, 0xf8, 0xf1, - 0x24, 0x3, 0xf8, 0xf0, 0x3, 0xfe, 0x3c, 0x0, - 0xff, 0x8f, 0x0, 0x38, 0xe2, 0x3d, 0x80, 0x1e, - 0xd7, 0x7f, 0x0, 0x7c, 0x20, 0x1f, 0xff, 0xf0, - 0xf, 0xfe, 0xc3, 0x0, 0x7f, 0xf0, 0x67, 0xff, - 0xce, 0x1, 0xff, 0xc1, 0x87, 0x0, 0xff, 0xe0, - 0xc3, 0x80, 0x7f, 0xf0, 0x61, 0xc0, 0x3f, 0xf8, - 0x30, 0xe0, 0x60, 0x1f, 0xf4, 0x76, 0x0, - - /* U+F027 "" */ - 0x0, 0xff, 0xea, 0x1d, 0xb0, 0x7, 0xff, 0x14, - 0xf5, 0x24, 0x3, 0xff, 0x88, 0x78, 0x20, 0x1f, - 0xfc, 0x53, 0xc0, 0xf, 0xfe, 0x31, 0xe0, 0x7, - 0xff, 0x0, 0xe2, 0x3d, 0x80, 0x1f, 0xfc, 0x1d, - 0x77, 0xf0, 0x7, 0xf0, 0xdc, 0x80, 0x4, 0x3, - 0xff, 0x86, 0xe8, 0xd8, 0x1, 0xff, 0xc5, 0x73, - 0x3, 0x70, 0xf, 0xfe, 0x20, 0xe0, 0x85, 0x0, - 0x7f, 0xf1, 0x90, 0x8, 0x3, 0xff, 0x8c, 0xe0, - 0x40, 0x1f, 0xfc, 0x5b, 0x20, 0x50, 0xf, 0xfe, - 0x23, 0x20, 0x14, 0x0, 0x7f, 0xf1, 0x10, 0x93, - 0x1, 0x80, 0x3f, 0xf8, 0x65, 0xb6, 0x21, 0x3f, - 0xfe, 0x70, 0xf, 0xfe, 0x44, 0x38, 0x7, 0xff, - 0x22, 0x1c, 0x3, 0xff, 0x91, 0xe, 0x1, 0xff, - 0xc8, 0x87, 0x3, 0x0, 0xff, 0xe3, 0x46, 0xe0, - 0x7, 0xc0, - - /* U+F028 "" */ - 0x0, 0xff, 0xe5, 0xc, 0x28, 0x7, 0xff, 0x45, - 0x9e, 0xa8, 0x1, 0xff, 0xd0, 0x40, 0x2, 0xe0, - 0x80, 0x7f, 0xf0, 0xce, 0xd8, 0x3, 0xf1, 0xe9, - 0x1, 0xe8, 0x7, 0xff, 0x8, 0xf1, 0x24, 0x3, - 0xc4, 0x20, 0x58, 0x60, 0x72, 0x1, 0xff, 0xc0, - 0x3c, 0x0, 0xfc, 0x9b, 0xea, 0x3, 0xa2, 0xc, - 0x60, 0x1f, 0xe3, 0xc0, 0xf, 0xe1, 0x1, 0xa6, - 0x1, 0xa0, 0x7, 0x80, 0x7f, 0x1e, 0x0, 0x7f, - 0x96, 0x0, 0x12, 0x80, 0x8a, 0x6, 0x80, 0x71, - 0x1e, 0xc0, 0xf, 0xfe, 0x3, 0xd0, 0x2, 0x80, - 0x10, 0x0, 0xe0, 0xd7, 0x7f, 0x0, 0x7f, 0xe, - 0x50, 0x82, 0xb8, 0xb, 0x1, 0x18, 0x28, 0x8, - 0x7, 0xff, 0xd, 0xcd, 0x70, 0x1, 0x20, 0xa, - 0x0, 0x20, 0x0, 0x80, 0x3f, 0xf8, 0x8e, 0x60, - 0x50, 0x2, 0xa0, 0x60, 0xc, 0x0, 0x38, 0x7, - 0xff, 0x10, 0x70, 0x81, 0x40, 0x1a, 0x0, 0x20, - 0x70, 0x1, 0x0, 0x7f, 0xf1, 0x9c, 0x8, 0x0, - 0x20, 0x1, 0x1, 0x0, 0xff, 0xe4, 0xb8, 0x10, - 0x0, 0x40, 0x2, 0x2, 0x1, 0xff, 0xc7, 0x1c, - 0x20, 0x50, 0x6, 0x80, 0x8, 0x1c, 0x0, 0x40, - 0x1f, 0xfc, 0x47, 0x30, 0x28, 0x1, 0x50, 0x30, - 0x6, 0x0, 0x1c, 0x3, 0xff, 0x88, 0xe6, 0xb8, - 0x0, 0x80, 0x5, 0x0, 0x14, 0x4, 0x98, 0x3, - 0xff, 0x86, 0x39, 0x42, 0xa, 0xc0, 0x2c, 0x6, - 0x40, 0x81, 0x3f, 0xfe, 0x70, 0xf, 0xfe, 0x3, - 0xd0, 0x2, 0x80, 0x12, 0x0, 0xe0, 0xf, 0xd0, - 0xe0, 0x1f, 0xe5, 0x80, 0x4, 0xa0, 0x22, 0x81, - 0xa0, 0x7, 0xf4, 0x38, 0x7, 0xf0, 0x80, 0xd3, - 0x0, 0xd0, 0x3, 0xc0, 0x3f, 0xe8, 0x70, 0xf, - 0xc9, 0xbe, 0xa0, 0x38, 0x20, 0xc6, 0x1, 0xff, - 0xc0, 0x87, 0x3, 0x0, 0xf1, 0x8, 0x16, 0x10, - 0x1c, 0x80, 0x7f, 0xf0, 0xa3, 0xb0, 0x3, 0xf1, - 0xe9, 0x1, 0xe8, 0x7, 0xff, 0x10, 0x40, 0x3f, - 0x90, 0x0, 0xb8, 0x20, 0x1f, 0xfc, 0xe6, 0x7a, - 0xa0, 0x7, 0x80, - - /* U+F03E "" */ - 0x1b, 0xff, 0xff, 0xe6, 0x58, 0xd2, 0x0, 0x7f, - 0xf3, 0x12, 0x90, 0x3, 0xff, 0x9c, 0x80, 0x19, - 0xb3, 0x60, 0x3, 0xff, 0x96, 0xd2, 0x64, 0xf4, - 0x1, 0xff, 0xca, 0xb0, 0xc, 0xa2, 0x1, 0xff, - 0xd8, 0x27, 0x0, 0xff, 0x94, 0x3, 0x18, 0x80, - 0x7c, 0x79, 0x12, 0x1, 0xfe, 0x85, 0x0, 0x1f, - 0x0, 0x7c, 0x7a, 0x20, 0xd2, 0x1, 0xfe, 0xae, - 0xe6, 0x10, 0x7, 0x8f, 0x44, 0x2, 0x69, 0x0, - 0xff, 0x8, 0xc0, 0x1e, 0x3d, 0x10, 0xe, 0x69, - 0x0, 0xff, 0x1f, 0xe0, 0x80, 0x47, 0xa2, 0x1, - 0xf3, 0x30, 0x3, 0xf1, 0xe8, 0x9e, 0x88, 0x1e, - 0x88, 0x7, 0xf0, 0x80, 0x7c, 0x7a, 0x20, 0x3, - 0xd4, 0xd1, 0x0, 0xff, 0xe2, 0x96, 0x88, 0x6, - 0x3b, 0x10, 0xf, 0xfe, 0x32, 0x88, 0x7, 0xff, - 0xa9, 0x22, 0x3f, 0xf9, 0x8, 0x1, 0xe3, 0x77, - 0xff, 0xe4, 0x18, 0x4, 0x80, 0x1f, 0xfc, 0xe4, - 0xa4, 0x0, 0xff, 0xe6, 0x25, 0x0, - - /* U+F043 "" */ - 0x0, 0xfc, 0x72, 0xa0, 0x1f, 0xfc, 0x5d, 0x6a, - 0x20, 0xf, 0xfe, 0x1a, 0x8, 0x2, 0x80, 0x3f, - 0xf8, 0x7c, 0x1, 0x30, 0x7, 0xff, 0x8, 0x54, - 0x2, 0x14, 0x0, 0xff, 0xe0, 0xc8, 0x7, 0x40, - 0x7, 0xff, 0x0, 0x5c, 0x3, 0x8d, 0x0, 0x3f, - 0xe9, 0x0, 0xfa, 0x0, 0x3f, 0xc4, 0xe0, 0x1f, - 0x1b, 0x0, 0x7f, 0x70, 0x7, 0xf4, 0x88, 0x7, - 0xce, 0x60, 0x1f, 0xea, 0x0, 0xf1, 0xc0, 0x7, - 0xfc, 0x8e, 0x1, 0xdc, 0x1, 0xff, 0xc1, 0x83, - 0x0, 0x9c, 0x80, 0x3f, 0xf8, 0x50, 0x1, 0x48, - 0x7, 0xff, 0xd, 0xc, 0x18, 0x40, 0x3f, 0xf8, - 0x94, 0x1a, 0x1, 0xff, 0xc5, 0x70, 0x60, 0xf, - 0xfe, 0x28, 0x88, 0x80, 0xb, 0xe4, 0x1, 0xff, - 0xc1, 0x21, 0x0, 0x10, 0x38, 0x7, 0xff, 0x4, - 0x4c, 0x0, 0x81, 0x80, 0x1f, 0xfc, 0x13, 0x40, - 0x1, 0x93, 0x18, 0x7, 0xfc, 0x43, 0xa0, 0x14, - 0x86, 0x30, 0x7, 0xfa, 0x81, 0xc, 0x0, 0x94, - 0x13, 0xfa, 0x60, 0x1e, 0x16, 0x0, 0x70, 0x4, - 0xba, 0xc2, 0x4e, 0x1, 0xeb, 0x10, 0x1, 0x50, - 0x4, 0x53, 0xde, 0x80, 0x1c, 0xea, 0x1, 0x96, - 0xc4, 0x3, 0xfd, 0x30, 0x1, 0xe4, 0xf7, 0x0, - 0xf9, 0x75, 0x80, 0x3f, 0xc, 0x7d, 0xcc, 0x4d, - 0xfd, 0x10, 0x7, 0x0, - - /* U+F048 "" */ - 0x48, 0x88, 0x3, 0xfe, 0x77, 0x7, 0xbb, 0xc6, - 0x1, 0xfd, 0x71, 0x9, 0x0, 0xff, 0xe0, 0xe, - 0x20, 0x1, 0x40, 0x3f, 0xe1, 0xc3, 0x0, 0xff, - 0xe1, 0x17, 0x90, 0x7, 0xff, 0x8, 0xf0, 0x40, - 0x3f, 0xf8, 0x49, 0x82, 0x1, 0xff, 0xc2, 0x5b, - 0x0, 0xff, 0xe1, 0xb5, 0x0, 0x7f, 0xf0, 0xde, - 0x40, 0x3f, 0xf8, 0x71, 0x0, 0xf, 0xfe, 0x22, - 0x0, 0x7f, 0xfe, 0xe8, 0x80, 0x3f, 0xf8, 0x8d, - 0x86, 0x1, 0xff, 0xc4, 0x1c, 0x40, 0xf, 0xfe, - 0x2d, 0xa8, 0x7, 0xff, 0x16, 0x98, 0x3, 0xff, - 0x8b, 0x2e, 0x1, 0xff, 0xc5, 0x89, 0x0, 0xff, - 0xe2, 0xb5, 0x0, 0x7f, 0xf1, 0x56, 0xc0, 0x27, - 0x20, 0x0, 0x88, 0x3, 0xf2, 0x61, 0x12, 0x27, - 0xfd, 0xc4, 0x1, 0xfc, 0x7b, 0xa3, - - /* U+F04B "" */ - 0x3, 0x75, 0x0, 0xff, 0xe4, 0xbe, 0x45, 0x61, - 0x80, 0x7f, 0xf1, 0xe4, 0x2, 0x3c, 0x91, 0x0, - 0xff, 0xe2, 0x88, 0x7, 0x37, 0xb0, 0x7, 0xff, - 0x2c, 0x67, 0x4c, 0x3, 0xff, 0x96, 0x59, 0x42, - 0x1, 0xff, 0xcb, 0x5e, 0x70, 0xf, 0xfe, 0x64, - 0x6a, 0x0, 0x7f, 0xf2, 0xca, 0xec, 0x40, 0x1f, - 0xfc, 0xb4, 0xd8, 0x0, 0xff, 0xe6, 0x3f, 0x28, - 0x7, 0xff, 0x2c, 0x6a, 0xc8, 0x3, 0xff, 0x96, - 0x9a, 0xe0, 0x1f, 0xfc, 0xc8, 0x40, 0xf, 0xfe, - 0x61, 0x80, 0x7f, 0xf3, 0xc, 0x3, 0xff, 0x97, - 0x8, 0x1, 0xff, 0xc9, 0x4d, 0x70, 0xf, 0xfe, - 0x40, 0xd5, 0x90, 0x7, 0xff, 0x21, 0xf9, 0x40, - 0x3f, 0xf9, 0x9, 0xb0, 0x1, 0xff, 0xc8, 0x2b, - 0xb1, 0x0, 0x7f, 0xf2, 0x23, 0x50, 0x3, 0xff, - 0x90, 0xbc, 0xe0, 0x1f, 0xfc, 0x82, 0xca, 0x10, - 0xf, 0xfe, 0x38, 0xce, 0x98, 0x7, 0xff, 0x8, - 0x40, 0x39, 0xbd, 0x80, 0x3f, 0xf8, 0x90, 0x1, - 0x1e, 0x48, 0x80, 0x7f, 0xf1, 0x5b, 0x22, 0xf0, - 0xc0, 0x3f, 0xf8, 0xe0, - - /* U+F04C "" */ - 0x1a, 0xef, 0xfe, 0xd5, 0x0, 0xc3, 0x5d, 0xff, - 0xda, 0xa1, 0x6a, 0x20, 0x1c, 0x54, 0x40, 0x15, - 0xa8, 0x80, 0x71, 0x51, 0x28, 0x7, 0xf2, 0x80, - 0x4a, 0x1, 0xfc, 0xa0, 0x1f, 0xef, 0x0, 0xff, - 0xe0, 0xf8, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xfe, - 0x1, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, 0x7f, - 0xff, 0xc0, 0x3f, 0xfe, 0x1e, 0x1, 0xff, 0xc1, - 0xf1, 0x0, 0xfe, 0x10, 0x8, 0x40, 0x3f, 0x86, - 0x0, 0x3f, 0x13, 0x0, 0x50, 0x1, 0xf8, 0x99, - 0x96, 0xec, 0xd9, 0xe3, 0x0, 0x33, 0x5b, 0xb3, - 0x67, 0x8c, 0x0, - - /* U+F04D "" */ - 0x3, 0x88, 0xff, 0xe4, 0x30, 0x1, 0xb1, 0xdf, - 0xff, 0x91, 0x3a, 0x10, 0x1, 0xff, 0xca, 0x26, - 0x10, 0xf, 0xfe, 0x58, 0x80, 0x7f, 0xf3, 0x3c, - 0x3, 0xff, 0xfe, 0x1, 0xff, 0xff, 0x0, 0xff, - 0xff, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, - 0x1f, 0xff, 0xef, 0x50, 0xf, 0xfe, 0x5a, 0xda, - 0x88, 0x7, 0xff, 0x1c, 0xa8, 0x80, - - /* U+F051 "" */ - 0x5, 0x81, 0x0, 0xff, 0x34, 0x41, 0xd6, 0x9f, - 0xc8, 0x3, 0xfa, 0x1d, 0xd0, 0x40, 0x1, 0xc3, - 0x0, 0xfc, 0x20, 0x17, 0x80, 0x43, 0x88, 0x1, - 0xff, 0xc5, 0xb5, 0x0, 0xff, 0xe2, 0xd3, 0x0, - 0x7f, 0xf1, 0x66, 0x0, 0x3f, 0xf8, 0xaf, 0x20, - 0x1f, 0xfc, 0x56, 0xa0, 0xf, 0xfe, 0x2a, 0xd8, - 0x7, 0xff, 0x15, 0x30, 0x3, 0xff, 0x8a, 0x60, - 0x1f, 0xff, 0xa1, 0xc0, 0xf, 0xfe, 0x18, 0xe1, - 0x80, 0x7f, 0xf0, 0x8b, 0x8, 0x3, 0xff, 0x84, - 0x58, 0x40, 0x1f, 0xfc, 0x23, 0xc1, 0x0, 0xff, - 0xe1, 0x26, 0x8, 0x7, 0xff, 0x9, 0x6c, 0x3, - 0xff, 0x86, 0xd4, 0x1, 0xff, 0x78, 0x4, 0xf2, - 0x1, 0xff, 0xc0, 0x63, 0x9, 0x80, 0xf, 0xe3, - 0x0, 0x10, 0xe7, 0xb0, 0x7, 0xfb, 0x3f, 0xda, - - /* U+F052 "" */ - 0x0, 0xff, 0x86, 0x69, 0x40, 0x3f, 0xf9, 0x23, - 0xec, 0xb5, 0x0, 0x1f, 0xfc, 0x71, 0xc1, 0x0, - 0x9d, 0x80, 0x3f, 0xf8, 0xda, 0x40, 0x1d, 0x2a, - 0x1, 0xff, 0xc4, 0xb3, 0x0, 0xfa, 0x90, 0x3, - 0xff, 0x85, 0x48, 0x1, 0xfd, 0x66, 0x1, 0xff, - 0xc0, 0x95, 0x0, 0xff, 0xb4, 0x80, 0x3f, 0xd0, - 0xc0, 0x1f, 0xfc, 0x1, 0xc1, 0x0, 0xfc, 0xce, - 0x1, 0xff, 0xc2, 0x1c, 0x10, 0xf, 0x2c, 0x80, - 0x7f, 0xf1, 0xb, 0x40, 0x39, 0x28, 0x3, 0xff, - 0x8c, 0x76, 0x1, 0x1d, 0x80, 0x7f, 0xf2, 0x12, - 0x80, 0x1e, 0x1, 0xff, 0xca, 0x55, 0x1, 0x80, - 0x7f, 0xf2, 0xc8, 0x14, 0x3, 0xff, 0x96, 0x81, - 0x68, 0x1, 0xff, 0xc8, 0x19, 0x30, 0x1b, 0xff, - 0xff, 0xe4, 0x73, 0x0, 0x7f, 0xf4, 0x1b, 0xff, - 0xff, 0x95, 0xa2, 0x12, 0x1, 0xff, 0xca, 0x26, - 0x0, 0xff, 0xe6, 0xf8, 0x7, 0xff, 0xa4, 0x40, - 0x3f, 0xf9, 0x7c, 0x16, 0x20, 0x1f, 0xfc, 0x94, - 0x60, - - /* U+F053 "" */ - 0x0, 0xff, 0x8e, 0x4c, 0x3, 0xff, 0x80, 0x98, - 0xd8, 0x60, 0x1f, 0xe4, 0xb0, 0xb, 0x40, 0x3f, - 0x92, 0xc0, 0x31, 0x0, 0x7e, 0x4b, 0x0, 0xc5, - 0xa0, 0x1f, 0x25, 0x80, 0x62, 0xc1, 0x0, 0xf2, - 0x58, 0x6, 0x2c, 0x10, 0xf, 0x25, 0x80, 0x62, - 0xc1, 0x0, 0xf2, 0x58, 0x6, 0x2c, 0x10, 0xf, - 0x25, 0x80, 0x62, 0xc1, 0x0, 0xf2, 0x58, 0x6, - 0x2c, 0x10, 0xf, 0x1d, 0x80, 0x62, 0xc1, 0x0, - 0xf9, 0x0, 0x3a, 0x84, 0x3, 0xf3, 0xa0, 0x6, - 0x86, 0x0, 0xfe, 0xb4, 0x0, 0xd2, 0xc0, 0x1f, - 0xd6, 0x80, 0x1a, 0x58, 0x3, 0xfa, 0xd0, 0x3, - 0x4b, 0x0, 0x7f, 0x5a, 0x0, 0x69, 0x60, 0xf, - 0xeb, 0x30, 0xd, 0x2c, 0x1, 0xfd, 0x86, 0x1, - 0xa5, 0x80, 0x3f, 0xb0, 0xc0, 0x34, 0xb0, 0x7, - 0xf6, 0x18, 0x6, 0x90, 0xf, 0xf6, 0x18, 0x4, - 0xa0, 0x1f, 0xf6, 0x20, 0x2d, 0x0, 0x7f, 0xf0, - 0x2f, 0x68, 0x0, - - /* U+F054 "" */ - 0x0, 0x3c, 0x0, 0x7f, 0xf0, 0x6a, 0x1e, 0xc0, - 0x3f, 0xe6, 0x50, 0x2, 0x58, 0x7, 0xf8, 0x80, - 0x32, 0x58, 0x7, 0xf2, 0x40, 0x6, 0x4b, 0x0, - 0xfe, 0x78, 0x0, 0xc9, 0x60, 0x1f, 0xcf, 0x0, - 0x19, 0x2c, 0x3, 0xf9, 0xe0, 0x3, 0x25, 0x80, - 0x7f, 0x3c, 0x0, 0x64, 0xb0, 0xf, 0xe7, 0x80, - 0xc, 0x96, 0x1, 0xfc, 0xf0, 0x1, 0x92, 0xc0, - 0x3f, 0x9e, 0x0, 0x32, 0x50, 0x7, 0xf3, 0x8, - 0x6, 0x50, 0xf, 0xc3, 0xa2, 0x1, 0xa8, 0x3, - 0xe1, 0xd3, 0x0, 0xd4, 0xa0, 0x1e, 0x1d, 0x30, - 0xd, 0x4a, 0x1, 0xe1, 0xd3, 0x0, 0xd4, 0xa0, - 0x1e, 0x1d, 0x30, 0xd, 0x4a, 0x1, 0xe1, 0xd3, - 0x0, 0xd4, 0xa0, 0x1e, 0x1c, 0x30, 0xd, 0x4a, - 0x1, 0xe1, 0xc2, 0x0, 0xd4, 0xa0, 0x1f, 0x31, - 0x0, 0x6a, 0x50, 0xf, 0xca, 0x1, 0xa9, 0x40, - 0x3f, 0x8b, 0x0, 0x14, 0xa0, 0x1f, 0xf1, 0xf7, - 0x14, 0x3, 0xfe, - - /* U+F067 "" */ - 0x0, 0xff, 0x2d, 0x52, 0x4, 0x3, 0xff, 0x8e, - 0x74, 0xaa, 0x7a, 0x0, 0xff, 0xe3, 0xb0, 0x6, - 0x60, 0xf, 0xfe, 0x39, 0x80, 0x63, 0x0, 0xff, - 0xff, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xcd, 0xff, - 0xfa, 0x40, 0x30, 0xff, 0xfe, 0xc1, 0x90, 0xf, - 0xfe, 0x51, 0xb0, 0x7, 0xff, 0x33, 0xc0, 0x3f, - 0xf9, 0x9e, 0xc0, 0x1f, 0xfc, 0xa1, 0x59, 0xdc, - 0xcf, 0x9c, 0x3, 0xe, 0x67, 0xef, 0x20, 0x23, - 0x3f, 0xb8, 0x3, 0x8c, 0xff, 0x8, 0x7, 0xff, - 0xfc, 0x3, 0xff, 0xfe, 0x1, 0xfe, 0x20, 0xc, - 0x40, 0x1f, 0xfc, 0x74, 0x72, 0x21, 0xf8, 0x7, - 0xf8, - - /* U+F068 "" */ - 0x1, 0x22, 0xff, 0xe4, 0x8, 0x2, 0x3b, 0x77, - 0xff, 0x91, 0xdc, 0x17, 0x0, 0xff, 0xe5, 0xb, - 0x0, 0x7f, 0xf3, 0x3c, 0x3, 0xff, 0x99, 0xf0, - 0x1, 0xff, 0xca, 0x16, 0x7e, 0xdd, 0xff, 0xe4, - 0x77, 0x4, - - /* U+F06E "" */ - 0x0, 0xff, 0x13, 0x56, 0xf7, 0xfb, 0xb2, 0x54, - 0x3, 0xff, 0x8e, 0xb9, 0xb2, 0xa4, 0x20, 0x1, - 0x36, 0xaf, 0xa2, 0x0, 0xff, 0xe1, 0x1e, 0x51, - 0x80, 0x64, 0x54, 0x20, 0xc, 0xbb, 0x22, 0x1, - 0xff, 0x46, 0x18, 0x4, 0x55, 0xf7, 0x57, 0xbc, - 0xe0, 0x19, 0xbd, 0x0, 0x3f, 0xad, 0xc0, 0x32, - 0xea, 0x80, 0x70, 0xc6, 0x8, 0x4, 0x36, 0xc0, - 0x1f, 0x62, 0x0, 0x64, 0xa0, 0x8, 0xe6, 0x4a, - 0x0, 0x3c, 0x10, 0xd, 0x2e, 0x1, 0xd4, 0x60, - 0x18, 0x6c, 0x3, 0x99, 0x95, 0xa4, 0x5, 0x60, - 0x1d, 0xa, 0x1, 0x3a, 0x80, 0x74, 0x80, 0x7f, - 0x16, 0x8, 0x29, 0x0, 0x75, 0x10, 0x14, 0x0, - 0x79, 0x40, 0x3a, 0x40, 0x30, 0xc8, 0x1, 0x40, - 0x3d, 0xc1, 0x20, 0x1f, 0x10, 0x24, 0x35, 0xa8, - 0x7, 0x28, 0x3, 0x40, 0x3c, 0x6a, 0x80, 0x1e, - 0x10, 0x1, 0xbc, 0xa0, 0x7, 0x88, 0x0, 0x20, - 0x1f, 0x62, 0x0, 0x78, 0x40, 0x2, 0x1, 0xfc, - 0x20, 0x1, 0x0, 0xfb, 0x28, 0x3, 0xe2, 0x7, - 0x0, 0xfe, 0x70, 0x6, 0x80, 0x78, 0xd4, 0x64, - 0x3, 0xca, 0x2, 0xe0, 0x1f, 0xac, 0x0, 0xa0, - 0x1e, 0xe0, 0x3, 0x28, 0x7, 0x48, 0x2, 0x14, - 0x3, 0xd6, 0x40, 0xa4, 0x1, 0xd4, 0x40, 0x15, - 0x20, 0x6, 0x1b, 0x0, 0x55, 0xa9, 0x1b, 0xf2, - 0x1, 0x58, 0x7, 0x42, 0x80, 0x75, 0xa0, 0x6, - 0x4a, 0x0, 0x25, 0x6e, 0x40, 0x81, 0xe0, 0x80, - 0x69, 0x70, 0xf, 0xae, 0x0, 0x32, 0xea, 0x80, - 0x70, 0xc6, 0x8, 0x4, 0x36, 0xc0, 0x1f, 0xcf, - 0x86, 0x1, 0x15, 0x7d, 0xd5, 0x33, 0x9c, 0x3, - 0x37, 0xa0, 0x7, 0xfc, 0x79, 0x66, 0x1, 0x91, - 0x54, 0x60, 0x19, 0x76, 0x44, 0x3, 0xff, 0x84, - 0x99, 0xb2, 0xa4, 0x1, 0x9, 0xb5, 0x7d, 0x10, - 0x7, 0xe0, - - /* U+F070 "" */ - 0x4, 0x40, 0x7, 0xff, 0x51, 0x2e, 0xd0, 0x1, - 0xff, 0xd3, 0xa0, 0x3, 0xe0, 0x80, 0x7f, 0xf4, - 0x58, 0x2, 0x3f, 0x30, 0xf, 0xfe, 0x84, 0x50, - 0x4, 0x38, 0xe0, 0x18, 0x9a, 0xb7, 0xfd, 0xdb, - 0x6e, 0x60, 0x1f, 0xfc, 0x15, 0xd2, 0x0, 0xa2, - 0x85, 0xb7, 0x52, 0xa4, 0x0, 0x12, 0x48, 0xcd, - 0x70, 0xf, 0xfe, 0x1, 0x6a, 0x80, 0x4b, 0xd2, - 0x40, 0x19, 0x15, 0x4, 0x2, 0x28, 0xe6, 0x0, - 0xff, 0xe0, 0x54, 0x0, 0x7c, 0x75, 0xf7, 0x57, - 0xd8, 0x80, 0x10, 0xcd, 0x88, 0x7, 0xfc, 0xf8, - 0x20, 0x18, 0xb1, 0x40, 0x38, 0xee, 0x0, 0x32, - 0x79, 0x0, 0x7f, 0xc7, 0xe8, 0x1, 0x16, 0x8, - 0x35, 0xd2, 0x80, 0x1e, 0x0, 0x30, 0xe1, 0x0, - 0x7f, 0xc3, 0x6e, 0x1, 0x1f, 0xa0, 0xa2, 0xd6, - 0x8, 0x3a, 0x0, 0x61, 0xf1, 0x0, 0xf5, 0x69, - 0x0, 0x51, 0x60, 0x10, 0xdd, 0x80, 0x23, 0xd0, - 0x4, 0x0, 0x71, 0x50, 0x7, 0x2a, 0x8b, 0x54, - 0x2, 0x4d, 0x20, 0x8, 0xc0, 0x31, 0xa8, 0x18, - 0x80, 0x72, 0x28, 0x6, 0xb0, 0xa, 0xa4, 0x2, - 0x2d, 0x50, 0xf, 0xde, 0x0, 0x50, 0xf, 0x58, - 0x4, 0x42, 0x1, 0x9b, 0x8, 0x2, 0xa9, 0x0, - 0xf8, 0x40, 0x2, 0x1, 0xe1, 0x20, 0x1, 0x8, - 0x7, 0x1f, 0x0, 0x66, 0xc1, 0x0, 0xe1, 0x0, - 0x30, 0x7, 0x84, 0x80, 0x2b, 0x0, 0xf1, 0x80, - 0x71, 0xfa, 0x0, 0x67, 0x20, 0x20, 0xf, 0x58, - 0x6, 0x54, 0x0, 0xf2, 0x0, 0x70, 0xdc, 0x0, - 0x45, 0xb0, 0x20, 0x1c, 0xca, 0x1, 0xd6, 0x40, - 0x1d, 0x0, 0x1f, 0x3d, 0x88, 0x4, 0xe0, 0x1c, - 0x72, 0x1, 0xf7, 0x88, 0x6, 0x38, 0x0, 0xf9, - 0x3c, 0xc0, 0x3e, 0x1d, 0x0, 0xfc, 0x58, 0x40, - 0x19, 0xdc, 0x1, 0xf0, 0xe3, 0x0, 0x70, 0xe0, - 0x80, 0x7f, 0x16, 0x20, 0x6, 0x8c, 0x40, 0xf, - 0xa6, 0x80, 0x30, 0xa0, 0x7, 0xfc, 0x37, 0x22, - 0x1, 0x1d, 0xf5, 0xd5, 0xa8, 0x4, 0xba, 0x40, - 0x14, 0xd0, 0x7, 0xff, 0x1, 0xba, 0x8, 0x2, - 0x14, 0x54, 0xa8, 0x0, 0x8b, 0x54, 0x2, 0x5d, - 0x20, 0xf, 0xfe, 0x3, 0xee, 0x42, 0x10, 0x80, - 0x8, 0xd0, 0x3, 0x54, 0x0, 0x45, 0xaa, 0x1, - 0xff, 0xc1, 0x37, 0xbd, 0xef, 0xf6, 0xda, 0x0, - 0x73, 0xe0, 0x80, 0x55, 0x0, 0x1f, 0xfd, 0x3, - 0xf3, 0x0, 0x98, 0x3, 0xff, 0xa2, 0x38, 0xe0, - 0xa, 0x0, 0xff, 0xe9, 0xc5, 0xd9, 0x0, - - /* U+F071 "" */ - 0x0, 0xff, 0xe1, 0xa4, 0x38, 0x80, 0x7f, 0xf4, - 0x16, 0xde, 0x30, 0x3, 0xff, 0x9e, 0x36, 0x1, - 0x13, 0x80, 0x7f, 0xf3, 0xa4, 0x40, 0x34, 0x8, - 0x7, 0xff, 0x30, 0x9c, 0x3, 0xd6, 0x1, 0xff, - 0xcc, 0x90, 0xf, 0x94, 0xc0, 0x3f, 0xf9, 0x48, - 0x80, 0xf, 0xde, 0x1, 0xff, 0xca, 0x90, 0xf, - 0xe3, 0x50, 0xf, 0xfe, 0x43, 0x10, 0x7, 0xfa, - 0xc0, 0x3f, 0xf8, 0xe3, 0x0, 0x1f, 0xf0, 0xc0, - 0x7, 0xff, 0x1a, 0x4, 0x2, 0x7f, 0xfb, 0x84, - 0x2, 0x71, 0x0, 0xff, 0xe2, 0x13, 0x0, 0x6e, - 0x0, 0x84, 0x3, 0xac, 0x3, 0xff, 0x89, 0x20, - 0x1c, 0x20, 0x18, 0x40, 0x32, 0x98, 0x7, 0xff, - 0x9, 0x10, 0x1, 0xde, 0x1, 0xfe, 0xf0, 0xf, - 0xfe, 0x14, 0x80, 0x7f, 0xf1, 0x4d, 0x40, 0x3f, - 0xf8, 0xe, 0x40, 0x1e, 0x10, 0x8, 0x40, 0x3e, - 0xb0, 0xf, 0xf8, 0x60, 0x3, 0xe3, 0x0, 0x8c, - 0x3, 0xe1, 0x80, 0xf, 0xf4, 0x0, 0x7e, 0x10, - 0x8, 0x40, 0x3f, 0x38, 0x80, 0x7e, 0x26, 0x0, - 0xfc, 0xc2, 0x0, 0x50, 0xf, 0xeb, 0x0, 0xfd, - 0x20, 0x1f, 0xc5, 0xdf, 0xe9, 0x0, 0xfe, 0x53, - 0x0, 0xf2, 0xa0, 0x7, 0xfa, 0xbf, 0x90, 0x3, - 0xfd, 0xe0, 0x1e, 0x80, 0xf, 0xf4, 0x28, 0xd, - 0x88, 0x7, 0xf1, 0xb0, 0x6, 0x72, 0x0, 0xff, - 0x18, 0x6, 0x20, 0xf, 0xf4, 0x0, 0x43, 0x0, - 0x1f, 0xf6, 0x0, 0x42, 0x60, 0x1f, 0xe1, 0x80, - 0x4, 0x0, 0x7f, 0xf0, 0x1d, 0x84, 0xf4, 0x3, - 0xff, 0x80, 0xe2, 0xc, 0x1, 0xff, 0xc1, 0x9e, - 0xc3, 0x0, 0xff, 0xe0, 0xb0, 0x8, 0x7, 0xff, - 0x48, 0x42, 0x40, 0x3f, 0xfa, 0x22, 0xc0, 0xf6, - 0xec, 0xdf, 0xfc, 0xd7, 0x8f, 0x0, - - /* U+F074 "" */ - 0x0, 0xff, 0xe4, 0xb5, 0x10, 0x7, 0xff, 0x36, - 0x57, 0xc, 0x3, 0xff, 0x9c, 0x3a, 0x60, 0x2, - 0x44, 0xe3, 0x0, 0xff, 0x12, 0x24, 0x1, 0xe, - 0x98, 0x6d, 0xdf, 0x65, 0x80, 0x7e, 0x3d, 0xbb, - 0x80, 0x30, 0xe9, 0x80, 0x7c, 0x94, 0x1, 0xe3, - 0xc0, 0xf, 0xe1, 0xd0, 0xf, 0xcb, 0x20, 0x18, - 0xb4, 0x3, 0xfe, 0x30, 0xf, 0xe6, 0x80, 0x0, - 0xe0, 0x80, 0x7f, 0x8b, 0x3b, 0x77, 0x48, 0x6, - 0x20, 0x1c, 0x10, 0x8, 0xb7, 0x40, 0x18, 0xb0, - 0x44, 0x45, 0x9a, 0x0, 0x9, 0x43, 0x84, 0x1, - 0x16, 0x11, 0x0, 0x22, 0xc1, 0x0, 0xf9, 0xdc, - 0x76, 0x1a, 0x40, 0x10, 0xf8, 0x80, 0x4, 0xb, - 0x4, 0x3, 0xfa, 0x30, 0x2c, 0xc0, 0x21, 0xc2, - 0x0, 0xa9, 0xf0, 0x40, 0x3f, 0xf8, 0x14, 0x80, - 0x1b, 0x48, 0x3, 0x24, 0x8, 0x7, 0xff, 0x2, - 0x54, 0x3, 0x59, 0x80, 0x72, 0x40, 0x80, 0x7f, - 0xd0, 0xc0, 0x1a, 0x91, 0x78, 0x80, 0x2a, 0x7f, - 0x20, 0xf, 0xe7, 0x70, 0x6, 0x95, 0x4a, 0x1f, - 0x10, 0x0, 0x80, 0xe1, 0x0, 0x4, 0x8b, 0x34, - 0x0, 0x68, 0x63, 0xb0, 0x1, 0x61, 0x10, 0x2, - 0x1c, 0x20, 0xed, 0xdd, 0x20, 0x19, 0xdc, 0x4, - 0x20, 0x11, 0x6e, 0x80, 0x30, 0xe1, 0x0, 0x7f, - 0x34, 0x0, 0x7, 0x4, 0x3, 0xfc, 0x3e, 0x1, - 0xf9, 0x64, 0x3, 0x16, 0x80, 0x7f, 0xf1, 0xd2, - 0x80, 0x3c, 0x78, 0x1, 0xfc, 0x3f, 0xb7, 0x7d, - 0x96, 0x1, 0xf8, 0xf6, 0xee, 0x0, 0xc3, 0x84, - 0x44, 0x4e, 0x30, 0xf, 0xf1, 0x22, 0x40, 0x10, - 0xe9, 0x0, 0x7f, 0xf3, 0x7, 0x4c, 0x3, 0xff, - 0x97, 0x2b, 0x86, 0x1, 0x0, - - /* U+F077 "" */ - 0x0, 0xff, 0x9e, 0xc8, 0x3, 0xff, 0x93, 0x10, - 0x4c, 0x20, 0xf, 0xfe, 0x3c, 0x38, 0x0, 0x70, - 0x80, 0x3f, 0xf8, 0xb0, 0xe0, 0x18, 0x70, 0x80, - 0x3f, 0xf8, 0x70, 0xe0, 0x1e, 0x1c, 0x20, 0xf, - 0xfe, 0xc, 0x38, 0x7, 0xe1, 0xc2, 0x0, 0xff, - 0xa1, 0xc0, 0x32, 0xe0, 0x6, 0x1c, 0x20, 0xf, - 0xe8, 0x70, 0xc, 0xb4, 0x78, 0x1, 0x87, 0x8, - 0x3, 0xe8, 0x70, 0xc, 0xb4, 0x0, 0x3c, 0x0, - 0xc3, 0x84, 0x1, 0xd0, 0xe0, 0x19, 0x68, 0x3, - 0x1e, 0x0, 0x61, 0xc2, 0x0, 0xa1, 0xc0, 0x32, - 0xd0, 0x7, 0x8f, 0x0, 0x30, 0xe1, 0x3, 0x38, - 0x6, 0x5a, 0x0, 0xfc, 0x78, 0x1, 0x87, 0x3, - 0xc0, 0x32, 0xd0, 0x7, 0xf8, 0xf0, 0x3, 0x8, - 0xa0, 0x80, 0xb, 0x40, 0x1f, 0xfc, 0x3, 0xc0, - 0xa, 0x44, 0x58, 0xaf, 0x40, 0x1f, 0xfc, 0x23, - 0xc4, 0xa6, 0x0, - - /* U+F078 "" */ - 0x1, 0xa8, 0x0, 0xff, 0xe2, 0x1d, 0xb0, 0x0, - 0x71, 0x5e, 0x80, 0x3f, 0xf8, 0x47, 0x89, 0x2c, - 0x10, 0x40, 0x5, 0xa0, 0xf, 0xfe, 0x1, 0xe0, - 0x5, 0x23, 0xe0, 0x19, 0x68, 0x3, 0xfc, 0x78, - 0x1, 0x88, 0x59, 0xc0, 0x32, 0xd0, 0x7, 0xe3, - 0xc0, 0xc, 0x3e, 0x0, 0x87, 0x0, 0xcb, 0x40, - 0x1e, 0x3c, 0x0, 0xc3, 0x84, 0x1, 0x43, 0x80, - 0x65, 0xa0, 0xc, 0x78, 0x1, 0x87, 0x8, 0x3, - 0xa1, 0xc0, 0x32, 0xd0, 0x0, 0xf0, 0x3, 0xe, - 0x10, 0x7, 0xd0, 0xe0, 0x19, 0x68, 0xf0, 0x3, - 0xe, 0x10, 0x7, 0xf4, 0x38, 0x6, 0x5c, 0x0, - 0xc3, 0x84, 0x1, 0xff, 0x43, 0x80, 0x7e, 0x1c, - 0x20, 0xf, 0xfe, 0xc, 0x38, 0x7, 0x87, 0x8, - 0x3, 0xff, 0x87, 0xe, 0x1, 0x87, 0x8, 0x3, - 0xff, 0x8b, 0xe, 0x0, 0x1c, 0x20, 0xf, 0xfe, - 0x3c, 0x4a, 0xe1, 0x0, 0x7f, 0x80, - - /* U+F079 "" */ - 0x0, 0xf2, 0x10, 0x7, 0xff, 0x52, 0x6f, 0x50, - 0x3, 0xff, 0xa5, 0x2c, 0x0, 0xb4, 0x0, 0xca, - 0xef, 0xff, 0xc1, 0x60, 0xf, 0xe9, 0x60, 0xd, - 0x68, 0x0, 0x4a, 0x88, 0xff, 0xe0, 0xcb, 0x80, - 0x7d, 0x2c, 0x1, 0xeb, 0x40, 0x60, 0xf, 0xfe, - 0x1f, 0x0, 0x7a, 0x58, 0x3, 0xf5, 0xa1, 0x58, - 0x7, 0xff, 0x22, 0x58, 0x3, 0xc2, 0x1, 0x5a, - 0x23, 0xff, 0xfe, 0x10, 0xf, 0xcc, 0x1, 0x58, - 0x80, 0x1d, 0x80, 0x2d, 0x0, 0xff, 0xe4, 0xc0, - 0x2, 0x90, 0x3, 0x4a, 0x80, 0xd8, 0x7, 0xff, - 0x25, 0xf3, 0x54, 0x3, 0xd5, 0x7e, 0x40, 0x1f, - 0xfc, 0xa3, 0x20, 0xf, 0xc8, 0x20, 0x1f, 0xff, - 0xf0, 0xf, 0xfe, 0xd0, 0xcc, 0x0, 0x7c, 0x54, - 0xe0, 0x1f, 0xfc, 0xad, 0x67, 0xa0, 0xe, 0x2c, - 0x58, 0x60, 0xf, 0xfe, 0x49, 0x0, 0x16, 0x40, - 0x23, 0xf1, 0x0, 0x78, 0x7, 0xe5, 0x77, 0xff, - 0x18, 0x50, 0x4, 0xc2, 0x0, 0x52, 0x0, 0x1c, - 0x0, 0x7e, 0x38, 0x8f, 0xf6, 0x2a, 0x58, 0x7, - 0xf1, 0xe8, 0x80, 0x7f, 0xf2, 0x28, 0x12, 0xc0, - 0x3e, 0x3d, 0x10, 0xf, 0x38, 0x7, 0xff, 0x9, - 0x40, 0x9, 0x80, 0x1c, 0x7a, 0x20, 0x1f, 0x4f, - 0xff, 0xff, 0xa, 0x80, 0x23, 0xc0, 0x8, 0xf4, - 0x40, 0x3f, 0xfa, 0x7, 0x84, 0x98, 0x20, 0x18, - - /* U+F07B "" */ - 0x1b, 0xff, 0xfe, 0xc1, 0x0, 0xff, 0xe1, 0xd2, - 0x0, 0x7f, 0x1e, 0x88, 0x7, 0xff, 0x9, 0x0, - 0x3f, 0xe3, 0xd1, 0x0, 0xff, 0xe7, 0x1e, 0x44, - 0x7f, 0x9c, 0xc0, 0x3f, 0xf8, 0x64, 0xef, 0xfe, - 0x8c, 0x50, 0xf, 0xfe, 0x7d, 0x80, 0x7f, 0xf3, - 0xc4, 0x3, 0xff, 0xfe, 0x1, 0xff, 0xff, 0x0, - 0xff, 0xff, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xfb, - 0x8, 0x1, 0xff, 0xce, 0x4a, 0x40, 0xf, 0xfe, - 0x62, 0x50, - - /* U+F093 "" */ - 0x0, 0xff, 0xe0, 0x98, 0x80, 0x7f, 0xf3, 0x5f, - 0x3c, 0x80, 0x3f, 0xf9, 0x6f, 0x0, 0x38, 0x40, - 0x1f, 0xfc, 0x97, 0x80, 0x8, 0x70, 0x80, 0x3f, - 0xf8, 0xef, 0x0, 0x1c, 0x38, 0x40, 0x1f, 0xfc, - 0x57, 0x80, 0xf, 0x87, 0x8, 0x3, 0xff, 0x86, - 0xf0, 0x1, 0xfc, 0x38, 0x40, 0x1f, 0xfc, 0x17, - 0x80, 0xf, 0xf8, 0x70, 0x80, 0x3f, 0xe7, 0x80, - 0xf, 0xfe, 0x8, 0xe1, 0x0, 0x7f, 0x2c, 0x0, - 0x7f, 0xf0, 0xc7, 0x0, 0x3f, 0x8c, 0x3, 0xff, - 0x8a, 0x20, 0x1f, 0xcd, 0xbb, 0xc6, 0x1, 0xe9, - 0xdd, 0xdc, 0x1, 0xfe, 0x22, 0xe7, 0x0, 0xf1, - 0x17, 0x8, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xfe, - 0x1, 0xff, 0xcc, 0x11, 0xf8, 0x3, 0xff, 0x80, - 0x23, 0xf0, 0x5f, 0x77, 0xd8, 0x2, 0x1, 0xe7, - 0xc, 0xee, 0xfa, 0xd0, 0x3, 0xe3, 0x1b, 0x76, - 0x6d, 0x26, 0x26, 0x1, 0xf2, 0x0, 0x7f, 0x68, - 0x44, 0xce, 0x61, 0xd0, 0xf, 0xfe, 0x31, 0xf6, - 0x67, 0xb8, 0xc0, 0x3f, 0xf9, 0x6, 0x7e, 0x0, - 0xff, 0xe9, 0x5f, 0xa, 0x7b, 0x80, 0x7f, 0xf2, - 0x84, 0xc1, 0xc4, 0x3, 0x8, 0x7, 0xff, 0x1a, - 0xb4, 0x4f, 0x9c, 0x0, 0x3b, 0xe, 0xff, 0xfc, - 0xc8, 0xd0, - - /* U+F095 "" */ - 0x0, 0xff, 0xe4, 0xb3, 0x8, 0x3, 0xff, 0x9a, - 0x93, 0x2d, 0xeb, 0x73, 0x0, 0xff, 0xe4, 0xf8, - 0x4, 0x29, 0x19, 0x80, 0xf, 0xfe, 0x39, 0x20, - 0x7, 0xc6, 0x1, 0xff, 0xc7, 0xb0, 0xf, 0xc2, - 0x1, 0xff, 0xc6, 0x16, 0x0, 0xff, 0xe7, 0xb0, - 0x7, 0xf1, 0x0, 0x7f, 0xf1, 0xa8, 0x3, 0xf9, - 0x80, 0x3f, 0xf8, 0xcc, 0x1, 0xfd, 0xa0, 0x1f, - 0xfc, 0x6b, 0x40, 0xf, 0xc8, 0x1, 0xff, 0xc7, - 0xb7, 0x0, 0xf8, 0xc0, 0x3f, 0xf9, 0x11, 0x0, - 0xe, 0x60, 0xf, 0xfe, 0x56, 0x80, 0x76, 0x80, - 0x7f, 0xf2, 0x4d, 0x40, 0x31, 0x20, 0x7, 0xff, - 0x27, 0xc0, 0x3a, 0x0, 0x3f, 0xf9, 0x32, 0x60, - 0x18, 0xd4, 0x3, 0xff, 0x90, 0xcc, 0x0, 0xef, - 0x0, 0xff, 0x13, 0x8, 0x7, 0xcb, 0x20, 0x1c, - 0xe6, 0x1, 0xf9, 0x2f, 0x67, 0x40, 0x3c, 0xd4, - 0x1, 0xc7, 0x0, 0x1f, 0x36, 0xda, 0x0, 0xe, - 0x80, 0x35, 0x48, 0x7, 0xe, 0x80, 0x79, 0xfe, - 0x48, 0x3, 0x95, 0xc1, 0x79, 0x40, 0x38, 0x70, - 0x40, 0x3d, 0x0, 0x1f, 0xd1, 0xb4, 0x20, 0x1c, - 0x38, 0x40, 0x1f, 0x18, 0x7, 0xf8, 0x80, 0x3c, - 0x58, 0x40, 0x1f, 0x90, 0x3, 0xff, 0x88, 0xba, - 0x40, 0x1f, 0xd8, 0x1, 0xff, 0xc2, 0x19, 0xa0, - 0xf, 0xf9, 0x40, 0x3f, 0xf8, 0x2d, 0xec, 0x1, - 0xff, 0xc0, 0x12, 0x0, 0xfe, 0x16, 0xe9, 0x10, - 0xf, 0xfe, 0x12, 0x0, 0x78, 0x9a, 0xfa, 0x44, - 0x3, 0xff, 0x89, 0x11, 0x4d, 0x67, 0xec, 0xa0, - 0x7, 0xff, 0x14, - - /* U+F0C4 "" */ - 0x0, 0x96, 0x64, 0xe4, 0x1, 0xff, 0xc6, 0x2d, - 0xa6, 0x64, 0x6b, 0x80, 0x7f, 0xb, 0xdd, 0xa0, - 0x40, 0x70, 0x80, 0x3a, 0x1c, 0x3, 0xe2, 0xf8, - 0x44, 0x3f, 0x9c, 0x88, 0x4, 0x20, 0x14, 0x8, - 0x7, 0x16, 0x8, 0x6, 0x17, 0x50, 0x0, 0xf7, - 0x20, 0x2, 0x40, 0xc, 0x58, 0x20, 0x1d, 0x48, - 0x40, 0x6, 0x10, 0x70, 0x8, 0x80, 0x22, 0xc1, - 0x0, 0xea, 0x50, 0x10, 0x2, 0x0, 0x10, 0x2, - 0x10, 0x1, 0x60, 0x80, 0x75, 0x28, 0x1, 0x0, - 0x7, 0xb7, 0x60, 0x8, 0x80, 0xf0, 0x40, 0x3a, - 0x94, 0x2, 0x80, 0x8, 0x90, 0x3, 0x52, 0xe8, - 0x80, 0x75, 0x28, 0x6, 0x2b, 0x0, 0xfc, 0x34, - 0x20, 0x1d, 0x4a, 0x1, 0xe4, 0xe7, 0x32, 0x0, - 0xff, 0xa9, 0x40, 0x3f, 0xc, 0x66, 0xd0, 0x7, - 0xf5, 0x28, 0x7, 0xff, 0x5, 0x60, 0x3, 0xe8, - 0x50, 0xf, 0xfe, 0x11, 0xc8, 0x7, 0xd2, 0x40, - 0x1f, 0xf2, 0xcc, 0xb4, 0x40, 0x3e, 0x1c, 0x20, - 0xf, 0xc5, 0xb4, 0xcc, 0x10, 0xf, 0xe1, 0xc2, - 0x0, 0xf0, 0xe1, 0x0, 0x7e, 0x60, 0xe, 0x1c, - 0x20, 0xe, 0x91, 0x0, 0x84, 0x3, 0x4c, 0xa8, - 0x3, 0x87, 0x8, 0x3, 0x28, 0x0, 0x7b, 0x90, - 0x1, 0x18, 0x2d, 0x0, 0x70, 0xe1, 0x0, 0x44, - 0x0, 0x61, 0x7, 0x0, 0x88, 0x0, 0xb4, 0x1, - 0xc3, 0x84, 0x0, 0x10, 0x2, 0x0, 0x10, 0x2, - 0x10, 0x9, 0x68, 0x3, 0x87, 0x8, 0x10, 0x0, - 0x7b, 0x76, 0x0, 0x90, 0x3, 0x2d, 0x0, 0x70, - 0xe1, 0x40, 0x4, 0x48, 0x1, 0x31, 0x0, 0x72, - 0xd8, 0x7, 0xb, 0x15, 0x80, 0x79, 0x24, 0x3, - 0xe4, 0xc4, 0x10, 0x4c, 0x40, 0x4e, 0x73, 0x24, - 0xab, 0x0, 0xfe, 0x3b, 0xef, 0xb3, 0x0, - - /* U+F0C5 "" */ - 0x0, 0xf8, 0x51, 0x3f, 0x88, 0xc, 0x3, 0xff, - 0x81, 0x97, 0x7f, 0xd4, 0x1b, 0x60, 0x1f, 0xf1, - 0x0, 0x7f, 0xf0, 0x12, 0xc0, 0x3f, 0xf9, 0x89, - 0x60, 0x1f, 0xfc, 0xc4, 0xb0, 0xf, 0xfe, 0x62, - 0x22, 0xbf, 0xf2, 0x0, 0x7f, 0xc4, 0x1d, 0xff, - 0x91, 0x40, 0x3f, 0xf8, 0x8b, 0x97, 0x7c, 0x60, - 0x1f, 0xfc, 0x63, 0x44, 0xe6, 0x0, 0xff, 0xff, - 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, - 0xff, 0xf0, 0xf, 0xfe, 0x90, 0x82, 0x80, 0x7f, - 0xf0, 0xc5, 0x0, 0x3b, 0x82, 0xbf, 0xff, 0xf8, - 0x7c, 0x20, 0x1c, 0x94, 0x40, 0x1f, 0xfc, 0xb5, - 0xdf, 0xff, 0xe8, 0x0, 0xff, 0xea, 0x8, 0x7, - 0xff, 0x13, 0x80, 0x3e, 0xd8, 0x77, 0xff, 0xe1, - 0x4b, 0x0, 0x7c, - - /* U+F0C7 "" */ - 0x4, 0x88, 0xff, 0xe1, 0xb9, 0x0, 0x79, 0xad, - 0xdf, 0xff, 0x87, 0x1a, 0x80, 0x1d, 0x0, 0x1f, - 0xfc, 0x6b, 0x40, 0xc, 0x20, 0x1f, 0xfc, 0x7b, - 0x40, 0xf, 0x37, 0xff, 0xff, 0x4, 0x80, 0x2b, - 0x40, 0xe, 0x10, 0xf, 0xfe, 0xb, 0x0, 0x6b, - 0x30, 0xf, 0xfe, 0x66, 0x80, 0x7f, 0xf3, 0x4, - 0xc0, 0x3f, 0xf9, 0x8e, 0x1, 0xff, 0xd0, 0x57, - 0x7f, 0xfe, 0xa, 0x80, 0x7f, 0x8a, 0x23, 0xff, - 0x82, 0x20, 0x1f, 0xff, 0x77, 0xde, 0xa1, 0x0, - 0xff, 0xe3, 0xc4, 0x8, 0x57, 0x40, 0x3f, 0xf8, - 0xee, 0x1, 0x8d, 0x0, 0x3f, 0xf8, 0xa6, 0x1, - 0xe3, 0x0, 0xff, 0xe2, 0x90, 0x7, 0x84, 0x3, - 0xff, 0x8a, 0x26, 0x1, 0xce, 0x1, 0xff, 0xc6, - 0xe1, 0x0, 0xa4, 0x40, 0x3f, 0xf8, 0xc5, 0xf5, - 0x3a, 0xc0, 0x1f, 0xfc, 0x81, 0x56, 0x20, 0xf, - 0xf3, 0xa8, 0x7, 0xff, 0x28, 0x4e, 0xd4, 0x40, - 0x3f, 0xf8, 0xe7, 0xa0, - - /* U+F0C9 "" */ - 0x0, 0xff, 0xe6, 0xef, 0xff, 0xff, 0x2d, 0x48, - 0x3, 0xff, 0x97, 0xa0, 0x1f, 0xfc, 0xd5, 0x11, - 0xff, 0xe5, 0x16, 0x57, 0x77, 0xff, 0x2b, 0x50, - 0x3, 0xff, 0xfe, 0xf7, 0x7f, 0xfc, 0xaa, 0x28, - 0x44, 0xff, 0xe5, 0x2a, 0x80, 0x3f, 0xf9, 0x9e, - 0x20, 0x1f, 0xfc, 0xbe, 0xfb, 0xbf, 0xfe, 0x56, - 0x30, 0xa2, 0x7f, 0xf2, 0x8c, 0x3, 0xff, 0xfe, - 0x15, 0xdd, 0xff, 0xca, 0xd4, 0x51, 0x1f, 0xfe, - 0x51, 0x60, 0x7, 0xff, 0x34, 0x80, 0x3f, 0xf9, - 0x7b, 0xaf, 0xff, 0xfe, 0x5a, 0x80, - - /* U+F0E0 "" */ - 0x1b, 0xff, 0xff, 0xe6, 0x58, 0xd2, 0x0, 0x7f, - 0xf3, 0x12, 0x90, 0x3, 0xff, 0x9c, 0x80, 0x1f, - 0xfd, 0x5, 0x0, 0xff, 0xe7, 0x2d, 0x40, 0x7, - 0xff, 0x32, 0x28, 0x1f, 0x4, 0x3, 0xff, 0x90, - 0x38, 0xe1, 0xca, 0x7e, 0x80, 0x1f, 0xfc, 0x64, - 0xf3, 0x5e, 0x1a, 0x91, 0xb8, 0x0, 0xff, 0xe2, - 0x45, 0x8c, 0xd0, 0x80, 0x1b, 0x49, 0xf0, 0x80, - 0x3f, 0xf8, 0x5, 0x8e, 0x5a, 0xc0, 0x1c, 0x5a, - 0xc7, 0xaa, 0x1, 0xfe, 0x5d, 0x36, 0xd2, 0x0, - 0xfd, 0x34, 0x35, 0x20, 0x1f, 0xa6, 0x82, 0xa4, - 0x3, 0xfe, 0x5f, 0x36, 0xd2, 0x0, 0xc5, 0xac, - 0x7a, 0xa0, 0x1f, 0xfc, 0x11, 0xc6, 0x2d, 0x81, - 0x14, 0x69, 0x3e, 0x10, 0x7, 0xff, 0x12, 0x6c, - 0x5f, 0xb8, 0xe3, 0x70, 0x1, 0xff, 0xc7, 0x4e, - 0x95, 0x54, 0xf2, 0x0, 0x7f, 0xf2, 0x9a, 0xa8, - 0xc0, 0x1f, 0xff, 0x84, 0x0, 0xff, 0xe7, 0x25, - 0x20, 0x7, 0xff, 0x31, 0x28, - - /* U+F0E7 "" */ - 0x0, 0xa2, 0xef, 0xf4, 0x0, 0x7e, 0x37, 0x44, - 0xfc, 0xe4, 0x1, 0xf2, 0x80, 0x7f, 0x88, 0x3, - 0xee, 0x0, 0xfe, 0x40, 0xf, 0xc4, 0x1, 0xfd, - 0xc0, 0x1f, 0x98, 0x3, 0xf9, 0x0, 0x3f, 0x10, - 0x7, 0xe4, 0x10, 0xf, 0xc2, 0x1, 0xfb, 0x40, - 0x3f, 0x18, 0x7, 0xf3, 0x80, 0x7e, 0x60, 0xf, - 0xee, 0xff, 0xed, 0x20, 0x20, 0xf, 0xfe, 0x19, - 0x28, 0x70, 0x7, 0xff, 0x11, 0x80, 0x80, 0x3f, - 0xf8, 0x70, 0x20, 0xc0, 0x1f, 0xfc, 0x22, 0x70, - 0x1, 0x0, 0x7f, 0xf0, 0xa0, 0x2, 0x50, 0xf, - 0xfe, 0xa, 0x28, 0x5, 0x5f, 0xfe, 0xa0, 0xf, - 0x48, 0x7, 0xfd, 0xa0, 0x1c, 0xc4, 0x1, 0xff, - 0x20, 0x6, 0x18, 0x0, 0xff, 0xe0, 0x18, 0x6, - 0x81, 0x0, 0xff, 0x8c, 0x3, 0x13, 0x0, 0x7f, - 0xf0, 0x10, 0x3, 0x48, 0x7, 0xff, 0x7, 0x0, - 0x24, 0x40, 0x7, 0xff, 0x5, 0x40, 0x29, 0x0, - 0xff, 0xe0, 0x90, 0x80, 0x1c, 0x80, 0x3f, 0xf8, - 0x28, 0x0, 0x18, 0x0, 0xff, 0xe1, 0x60, 0x2, - 0x0, 0x3f, 0xf8, 0x66, 0x6, 0xc0, 0x1f, 0xfc, - 0x39, 0xcc, 0x0, 0x7f, 0x80, - - /* U+F0EA "" */ - 0x0, 0xf8, 0x50, 0xc0, 0x3f, 0xf9, 0x2f, 0xd7, - 0x9c, 0x60, 0x1f, 0xfc, 0x14, 0x99, 0xe8, 0x1, - 0x1, 0xd9, 0x9d, 0x2, 0x1, 0xf5, 0xb3, 0x70, - 0x2f, 0x70, 0x44, 0xcd, 0x9e, 0x0, 0x3f, 0xf9, - 0x86, 0x1, 0xff, 0xc2, 0x5f, 0xe1, 0x0, 0xff, - 0xf1, 0x9c, 0xdd, 0xfd, 0x20, 0x1f, 0xfc, 0x24, - 0xc6, 0x44, 0xf8, 0xc0, 0x3f, 0xf8, 0x52, 0x15, - 0xff, 0xf5, 0x6, 0xb0, 0x7, 0xfc, 0x42, 0xa0, - 0x1f, 0xc7, 0x2c, 0x1, 0xff, 0xcc, 0x96, 0x0, - 0xff, 0xe6, 0x4b, 0x0, 0x7f, 0xf3, 0x24, 0xc0, - 0x3f, 0xf8, 0xf5, 0x77, 0x88, 0x3, 0xff, 0x8a, - 0x82, 0x89, 0xc2, 0x1, 0xff, 0xc5, 0x1e, 0xff, - 0xe5, 0x0, 0xff, 0xff, 0x80, 0x7f, 0xf9, 0x94, - 0x3, 0xff, 0x99, 0x5f, 0xfe, 0x0, 0xff, 0xff, - 0x80, 0x7f, 0xf3, 0x84, 0x40, 0x1f, 0xfc, 0x27, - 0x0, 0xfe, 0xfb, 0xbf, 0xfe, 0xe, 0x90, - - /* U+F0F3 "" */ - 0x0, 0xff, 0x9e, 0x88, 0x3, 0xff, 0x92, 0xb0, - 0xbe, 0x1, 0xff, 0xc9, 0x20, 0x1, 0x0, 0x7f, - 0xf1, 0xca, 0x28, 0x2, 0xa5, 0x0, 0xff, 0xe2, - 0x4e, 0xb9, 0x0, 0x4b, 0x5a, 0x80, 0x1f, 0xfc, - 0x1, 0xc6, 0x0, 0xfc, 0x56, 0xa0, 0x1f, 0xf6, - 0x98, 0x7, 0xfd, 0x48, 0x1, 0xfc, 0xc6, 0x1, - 0xff, 0xc1, 0x90, 0xf, 0xe8, 0x0, 0xff, 0xe1, - 0x12, 0x80, 0x7c, 0x62, 0x1, 0xff, 0xc3, 0xe0, - 0xf, 0x94, 0x3, 0xff, 0x88, 0xc0, 0x1f, 0x8, - 0x7, 0xff, 0x10, 0x80, 0x3e, 0xf0, 0xf, 0xfe, - 0x60, 0x80, 0x7f, 0xf1, 0x44, 0x3, 0xca, 0x1, - 0xff, 0xc5, 0x50, 0xf, 0x18, 0x7, 0xff, 0x14, - 0xc0, 0x38, 0xc0, 0x3f, 0xf8, 0xd8, 0x1, 0xd4, - 0x1, 0xff, 0xc6, 0x41, 0x0, 0x8d, 0x80, 0x3f, - 0xf8, 0xf6, 0x0, 0x1d, 0x0, 0xff, 0xe4, 0x2b, - 0x85, 0x8, 0x7, 0xff, 0x26, 0xd, 0x40, 0x3f, - 0xf9, 0x69, 0x0, 0x1f, 0xfc, 0xa2, 0x66, 0x7f, - 0xff, 0xf2, 0xb4, 0x40, 0x3f, 0xfa, 0xa7, 0xff, - 0xeb, 0x0, 0xff, 0xe2, 0x98, 0x80, 0x76, 0x80, - 0x7f, 0xf1, 0xb4, 0x40, 0x26, 0x60, 0x7, 0xff, - 0x18, 0xfe, 0xa3, 0x24, 0x3, 0xfc, - - /* U+F11C "" */ - 0x1b, 0xff, 0xff, 0xe7, 0xf2, 0x85, 0x20, 0x7, - 0xff, 0x3c, 0x68, 0xd0, 0x3, 0xff, 0xa4, 0x80, - 0x11, 0x3b, 0x98, 0x0, 0xef, 0x0, 0x19, 0xdc, - 0x20, 0xae, 0xe4, 0x2, 0x77, 0x30, 0x5, 0xe0, - 0x12, 0xc4, 0x24, 0xe, 0x22, 0x30, 0x98, 0x82, - 0x5, 0xc4, 0x3c, 0x2a, 0x21, 0x20, 0x1f, 0xfd, - 0xb1, 0x0, 0x8, 0x8, 0x4, 0x20, 0x20, 0x6, - 0x2, 0x0, 0x10, 0x70, 0x0, 0x40, 0x3e, 0x6f, - 0xf7, 0x1, 0x7f, 0xc4, 0x1d, 0xfe, 0x30, 0xcf, - 0xf4, 0x83, 0x7f, 0xb8, 0x3, 0xfc, 0x46, 0x61, - 0x1, 0x33, 0x10, 0x0, 0xcc, 0x40, 0x3, 0x38, - 0x3, 0xff, 0x83, 0xf9, 0x88, 0x8, 0xcc, 0x70, - 0x3e, 0x63, 0x40, 0xb3, 0x25, 0x0, 0xff, 0xe4, - 0x8, 0x7, 0x8, 0x7, 0xff, 0x34, 0x40, 0x38, - 0x40, 0x3f, 0xf8, 0xbf, 0x98, 0x80, 0x8c, 0xc7, - 0x3, 0xe6, 0x34, 0xb, 0x32, 0x50, 0xf, 0xfe, - 0x1, 0x19, 0x84, 0x4, 0xcc, 0x40, 0x3, 0x31, - 0x0, 0xc, 0xe0, 0xf, 0xf3, 0x7f, 0xb8, 0xb, - 0xff, 0xff, 0x83, 0x20, 0xdf, 0xee, 0x0, 0xf8, - 0x40, 0x2, 0x2, 0x1, 0xff, 0xc1, 0x20, 0xe0, - 0x0, 0x80, 0x7f, 0xf6, 0xd6, 0x21, 0x20, 0x71, - 0x1f, 0xfc, 0x1f, 0xa, 0x88, 0x48, 0x7, 0xc4, - 0xee, 0x60, 0x3, 0xbf, 0xff, 0x5, 0x0, 0x9d, - 0xcc, 0x1, 0x7a, 0x0, 0x7f, 0xf4, 0x92, 0x90, - 0x3, 0xff, 0x9e, 0x34, 0x60, - - /* U+F124 "" */ - 0x0, 0xff, 0xe6, 0xab, 0x90, 0x7, 0xff, 0x35, - 0xba, 0xa3, 0x50, 0x3, 0xff, 0x92, 0x31, 0xd2, - 0x20, 0x14, 0x80, 0x7f, 0xf1, 0xca, 0x79, 0xc4, - 0x3, 0x8c, 0x3, 0xff, 0x8a, 0x75, 0xac, 0x1, - 0xf9, 0xc0, 0x3f, 0xf8, 0x69, 0x98, 0x50, 0xf, - 0xf5, 0x80, 0x7f, 0xf0, 0x5b, 0x6c, 0xc0, 0x3f, - 0xe4, 0x20, 0xf, 0xf0, 0xbf, 0x49, 0x0, 0x7f, - 0xf0, 0x60, 0x3, 0xf8, 0x63, 0xa0, 0x40, 0x3f, - 0xf8, 0x46, 0x60, 0xf, 0x8a, 0xb9, 0xc0, 0x3f, - 0xf8, 0xb2, 0x1, 0xe4, 0xbd, 0x50, 0xf, 0xfe, - 0x31, 0x28, 0x6, 0x1b, 0xb2, 0x0, 0x7f, 0xf2, - 0x2c, 0x3, 0xa9, 0x0, 0x3f, 0xf9, 0x22, 0xc0, - 0x1c, 0x80, 0x1f, 0xfc, 0xa9, 0x0, 0xf1, 0x0, - 0x7f, 0xf2, 0x98, 0x3, 0xd2, 0x1, 0xff, 0xc9, - 0x61, 0x0, 0xf2, 0x7e, 0x5d, 0xff, 0x10, 0x7, - 0xf5, 0x80, 0x7f, 0x1a, 0x27, 0xf0, 0x80, 0x7e, - 0x52, 0x0, 0xff, 0xe8, 0x48, 0x7, 0xff, 0x41, - 0xc, 0x3, 0xff, 0xa1, 0xe0, 0x1f, 0xfd, 0x2, - 0x40, 0xf, 0xfe, 0x84, 0x0, 0x7f, 0xf4, 0x5, - 0x40, 0x3f, 0xfa, 0x12, 0x1, 0xff, 0xcb, 0x70, - 0xe, 0x70, 0xf, 0xfe, 0x58, 0x80, 0x67, 0x0, - 0xff, 0xe6, 0x40, 0x4, 0x50, 0x1, 0xff, 0xcc, - 0x2e, 0x89, 0xd0, 0xf, 0xfe, 0x0, - - /* U+F15B "" */ - 0x14, 0x4f, 0xf8, 0x40, 0xc0, 0x3d, 0x97, 0x7f, - 0xf2, 0x86, 0x50, 0x7, 0x10, 0x7, 0xff, 0x9, - 0x68, 0x3, 0xff, 0x90, 0xb4, 0x1, 0xff, 0xc8, - 0x5a, 0x0, 0xff, 0xe4, 0x2d, 0x0, 0x7f, 0xf2, - 0x16, 0x40, 0x3f, 0xf8, 0x48, 0x9e, 0x20, 0xf, - 0xfe, 0x6, 0x5, 0xdf, 0xc0, 0x1f, 0xfc, 0x7, - 0xff, 0xfc, 0x1, 0xff, 0xff, 0x0, 0xff, 0xff, - 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, - 0xfe, 0xd2, 0x0, 0xff, 0xe3, 0x96, 0x5d, 0xff, - 0xf1, 0xf0, - - /* U+F1EB "" */ - 0x0, 0xff, 0xf1, 0x9b, 0x4d, 0x5e, 0x5d, 0x4b, - 0x18, 0x7, 0xff, 0x20, 0x9f, 0x3f, 0x25, 0x95, - 0xd, 0x15, 0xa7, 0x3f, 0x1c, 0x80, 0x3f, 0xf8, - 0x47, 0x7b, 0x6, 0x1, 0xff, 0xc1, 0x38, 0xdb, - 0x30, 0xf, 0xf1, 0x66, 0x10, 0x3, 0xff, 0x8e, - 0x99, 0x82, 0x0, 0xfa, 0x34, 0xc0, 0x3f, 0x12, - 0x2a, 0xc8, 0x40, 0x1f, 0x8f, 0x60, 0x3, 0xe, - 0xb8, 0x7, 0x8e, 0x33, 0xf6, 0xea, 0xab, 0xdf, - 0xc8, 0x30, 0xf, 0x3e, 0x88, 0x1f, 0x90, 0x7, - 0x36, 0xe3, 0x98, 0x7, 0xf1, 0xbe, 0x6b, 0x0, - 0x71, 0x79, 0xe8, 0x80, 0x64, 0xd9, 0x20, 0xf, - 0xfe, 0x19, 0x4e, 0xa0, 0x6, 0x1d, 0x90, 0xd, - 0x36, 0x40, 0x1f, 0xfc, 0x72, 0xb9, 0x0, 0xd2, - 0xf0, 0x3, 0xac, 0x1, 0xe4, 0x8b, 0xef, 0xfb, - 0x6e, 0x10, 0x3, 0xcd, 0xa4, 0x10, 0xe0, 0xf7, - 0xe4, 0x1, 0x86, 0x3a, 0xdd, 0x4, 0x2, 0x24, - 0x7b, 0xe8, 0x10, 0xc, 0x59, 0x6e, 0x1, 0x20, - 0x80, 0x66, 0xf7, 0x10, 0xf, 0xf8, 0x5f, 0xd8, - 0x3, 0xa, 0x0, 0x7e, 0x1b, 0x91, 0x0, 0xff, - 0xe1, 0x8c, 0xd8, 0x80, 0x7f, 0xf0, 0x29, 0x0, - 0x3c, 0x6f, 0x13, 0xe, 0x60, 0x1e, 0x4d, 0x0, - 0xff, 0xe0, 0x18, 0x6, 0x18, 0xfc, 0x87, 0x67, - 0x8c, 0xf8, 0x10, 0xc, 0x80, 0x1f, 0xfc, 0x8, - 0x70, 0x3, 0x73, 0x80, 0x7f, 0x3f, 0x30, 0x1, - 0xa0, 0x3, 0xff, 0x83, 0x13, 0x72, 0x1, 0xff, - 0xc1, 0x9b, 0x89, 0x0, 0xff, 0xe1, 0xb2, 0x0, - 0x7c, 0x20, 0x1f, 0x23, 0x80, 0x7f, 0xf2, 0xdf, - 0xfb, 0xdc, 0x3, 0xff, 0xa2, 0xf0, 0x1, 0x43, - 0x80, 0x7f, 0xf4, 0x24, 0x3, 0xa4, 0x3, 0xff, - 0xa0, 0x20, 0x1c, 0x20, 0x1f, 0xfd, 0x3, 0x0, - 0xe3, 0x0, 0xff, 0xe8, 0x40, 0x7, 0x40, 0x7, - 0xff, 0x41, 0x31, 0x9, 0x31, 0x0, 0x3f, 0xf8, - 0x40, - - /* U+F240 "" */ - 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, - 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, - 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, - 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, - 0xf5, 0x98, 0x3, 0xb3, 0xff, 0xff, 0x94, 0x1, - 0xff, 0xd8, 0x67, 0x30, 0xf, 0xfe, 0xa1, 0x42, - 0x0, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, 0xe7, 0xee, - 0x1, 0xff, 0xd4, 0x70, 0xf, 0xf6, 0x7f, 0xff, - 0xf2, 0x80, 0x3c, 0x20, 0x11, 0xbb, 0xff, 0xf3, - 0x74, 0x2, 0x5d, 0x0, 0x92, 0x23, 0xff, 0x9a, - 0xc0, 0x14, 0x9a, 0x0, 0x7f, 0xf4, 0xc4, 0xc2, - 0x90, 0x3, 0xff, 0xa2, 0x5a, 0x0, 0x1b, 0xff, - 0xff, 0xe8, 0xe9, 0x80, 0x0, - - /* U+F241 "" */ - 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, - 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, - 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, - 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, - 0xf5, 0x98, 0x3, 0xbb, 0xff, 0xff, 0x89, 0x20, - 0x1f, 0xfd, 0xd6, 0x73, 0x0, 0xff, 0xea, 0x14, - 0x20, 0x7, 0xff, 0xfc, 0x3, 0xff, 0x9e, 0x7e, - 0xe0, 0x1f, 0xfd, 0x47, 0x0, 0xff, 0x77, 0xff, - 0xff, 0x12, 0x40, 0x3f, 0xe1, 0x0, 0x8d, 0xdf, - 0xff, 0x9b, 0xa0, 0x12, 0xe8, 0x4, 0x91, 0x1f, - 0xfc, 0xd6, 0x0, 0xa4, 0xd0, 0x3, 0xff, 0xa6, - 0x26, 0x14, 0x80, 0x1f, 0xfd, 0x12, 0xd0, 0x0, - 0xdf, 0xff, 0xff, 0x47, 0x4c, 0x0, - - /* U+F242 "" */ - 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, - 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, - 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, - 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, - 0xf5, 0x98, 0x3, 0xbb, 0xff, 0xfe, 0x50, 0xf, - 0xff, 0x13, 0x39, 0x80, 0x7f, 0xf5, 0xa, 0x10, - 0x3, 0xff, 0xfe, 0x1, 0xff, 0xcf, 0x3f, 0x70, - 0xf, 0xfe, 0xa3, 0x80, 0x7f, 0xbb, 0xff, 0xfe, - 0x50, 0xf, 0xfe, 0x20, 0x80, 0x46, 0xef, 0xff, - 0xcd, 0xd0, 0x9, 0x74, 0x2, 0x48, 0x8f, 0xfe, - 0x6b, 0x0, 0x52, 0x68, 0x1, 0xff, 0xd3, 0x13, - 0xa, 0x40, 0xf, 0xfe, 0x89, 0x68, 0x0, 0x6f, - 0xff, 0xff, 0xa3, 0xa6, 0x0, - - /* U+F243 "" */ - 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, - 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, - 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, - 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, - 0xf5, 0x98, 0x3, 0xbb, 0xff, 0xc2, 0x1, 0xff, - 0xe7, 0x67, 0x30, 0xf, 0xfe, 0xa1, 0x42, 0x0, - 0x7f, 0xff, 0xc0, 0x3f, 0xf9, 0xe7, 0xee, 0x1, - 0xff, 0xd4, 0x70, 0xf, 0xf7, 0x7f, 0xf8, 0x40, - 0x3f, 0xf9, 0x22, 0x1, 0x1b, 0xbf, 0xff, 0x37, - 0x40, 0x25, 0xd0, 0x9, 0x22, 0x3f, 0xf9, 0xac, - 0x1, 0x49, 0xa0, 0x7, 0xff, 0x4c, 0x4c, 0x29, - 0x0, 0x3f, 0xfa, 0x25, 0xa0, 0x1, 0xbf, 0xff, - 0xfe, 0x8e, 0x98, 0x0, - - /* U+F244 "" */ - 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, - 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, - 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, - 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, - 0xf5, 0x98, 0x3, 0xff, 0xe8, 0xce, 0x60, 0x1f, - 0xfd, 0x42, 0x84, 0x0, 0xff, 0xff, 0x80, 0x7f, - 0xf3, 0xcf, 0xdc, 0x3, 0xff, 0xa8, 0xe0, 0x1f, - 0xfd, 0xb1, 0x0, 0x8d, 0xdf, 0xff, 0x9b, 0xa0, - 0x12, 0xe8, 0x4, 0x91, 0x1f, 0xfc, 0xd6, 0x0, - 0xa4, 0xd0, 0x3, 0xff, 0xa6, 0x26, 0x14, 0x80, - 0x1f, 0xfd, 0x12, 0xd0, 0x0, 0xdf, 0xff, 0xff, - 0x47, 0x4c, 0x0, - - /* U+F287 "" */ - 0x0, 0xff, 0xe4, 0x8, 0x7, 0xff, 0x55, 0x7b, - 0xa4, 0x0, 0xff, 0xe8, 0x9, 0x1d, 0x8, 0xd, - 0x88, 0x7, 0xff, 0x34, 0x6f, 0xb7, 0x0, 0x39, - 0x0, 0x3f, 0xf9, 0xb4, 0x80, 0x64, 0x1, 0xc2, - 0x1, 0xff, 0xcc, 0x54, 0x1e, 0xcd, 0x30, 0x8, - 0xd0, 0x3, 0xff, 0x99, 0x1, 0x62, 0x0, 0xc8, - 0x58, 0xc0, 0xf, 0xfe, 0x21, 0x8, 0x7, 0x90, - 0x88, 0xa0, 0x19, 0xe9, 0xc0, 0x3f, 0xf8, 0x69, - 0xdb, 0xd8, 0x40, 0x1a, 0x2, 0x0, 0x3f, 0xf8, - 0x6e, 0x80, 0x1c, 0x96, 0x20, 0x3, 0xc1, 0x0, - 0x21, 0x8a, 0x80, 0x7f, 0xf0, 0xee, 0xe2, 0x0, - 0xa0, 0x3, 0x86, 0xcd, 0x68, 0x1d, 0x13, 0xff, - 0x88, 0x20, 0x9a, 0xe0, 0x3, 0x0, 0xf2, 0xe5, - 0x8, 0x35, 0xdf, 0xff, 0x10, 0x80, 0x28, 0xd0, - 0x10, 0xf, 0xa, 0x27, 0x18, 0x0, 0xd1, 0x3f, - 0xf8, 0x0, 0x18, 0x60, 0x18, 0x3, 0xd5, 0x77, - 0xd8, 0xc0, 0xd7, 0x7f, 0xfc, 0x3, 0x0, 0x3f, - 0x28, 0x42, 0x0, 0x67, 0x40, 0xf, 0x48, 0xa9, - 0x0, 0x7f, 0xf0, 0x13, 0x60, 0x3, 0x5d, 0x3c, - 0x64, 0x0, 0x7e, 0x90, 0x80, 0xf, 0xfb, 0x2c, - 0x80, 0x3c, 0xb0, 0xe6, 0x1, 0xfc, 0xc0, 0xa4, - 0x0, 0x6d, 0xdd, 0x84, 0x1, 0xff, 0xcb, 0x17, - 0xe, 0x0, 0x79, 0x16, 0x36, 0x0, 0xff, 0xe6, - 0x41, 0x9b, 0xf5, 0xc0, 0x3f, 0xfa, 0x7a, 0xa0, - 0x42, 0x1, 0xff, 0xd3, 0x1a, 0xfe, 0x60, 0xf, - 0xfe, 0xb0, 0x88, 0x3, 0xff, 0xaf, 0x1f, 0xfc, - 0x80, 0x1f, 0x80, - - /* U+F293 "" */ - 0x0, 0xfe, 0x13, 0x43, 0x20, 0xf, 0xfe, 0x11, - 0xd7, 0x73, 0x2f, 0x37, 0xed, 0x40, 0x3f, 0xd5, - 0x8a, 0x20, 0x1e, 0x4a, 0xc1, 0x0, 0xf0, 0xe2, - 0x80, 0x63, 0x80, 0xe, 0x3c, 0x10, 0xe, 0xa3, - 0x0, 0xf3, 0xb8, 0x3, 0x8b, 0x40, 0x32, 0xa0, - 0x7, 0xe8, 0x60, 0xe, 0x35, 0x0, 0xa4, 0x3, - 0xfd, 0x2a, 0x1, 0xdc, 0x0, 0x23, 0x0, 0xff, - 0xa9, 0x0, 0x32, 0x8, 0x20, 0x6, 0x50, 0xe, - 0x39, 0xb, 0x30, 0xc, 0x81, 0x80, 0x13, 0x56, - 0x8, 0x6, 0x69, 0xd, 0x20, 0xb, 0x41, 0x80, - 0x24, 0x13, 0xd1, 0x0, 0x8, 0x10, 0x8, 0x80, - 0x22, 0x2, 0x0, 0x8b, 0x4, 0xf5, 0xc0, 0x9, - 0x61, 0x46, 0x1, 0x30, 0x8, 0x6, 0x2c, 0x13, - 0xa0, 0x2b, 0x9, 0x50, 0xc, 0x20, 0x1f, 0x16, - 0x8, 0x80, 0x27, 0x60, 0xe, 0x31, 0x0, 0xf8, - 0xb0, 0x40, 0xb, 0x0, 0x1f, 0xfc, 0x46, 0x10, - 0x3, 0x0, 0x7e, 0x10, 0xf, 0x92, 0xc0, 0x23, - 0xc0, 0xf, 0x18, 0x7, 0xc9, 0x60, 0x40, 0x22, - 0x3b, 0x0, 0xf8, 0x40, 0x32, 0x58, 0x2f, 0x1, - 0xe0, 0xa5, 0x0, 0x61, 0x2, 0x0, 0x92, 0xc1, - 0x68, 0x2, 0x2c, 0x5, 0x80, 0x9, 0x81, 0x40, - 0x39, 0x68, 0x2, 0x10, 0xb0, 0x1a, 0x0, 0xb4, - 0x30, 0x2, 0x4d, 0xa0, 0xe, 0x96, 0x1c, 0x20, - 0x8, 0xc1, 0x0, 0x31, 0x0, 0x42, 0x6, 0xc3, - 0x84, 0x1, 0x90, 0x5, 0x40, 0x3f, 0xc3, 0x84, - 0x1, 0x94, 0x2, 0x80, 0xf, 0xe1, 0xc2, 0x0, - 0xe8, 0x0, 0x8a, 0x40, 0x3e, 0x1d, 0x20, 0xe, - 0x72, 0x0, 0xcd, 0x20, 0x1c, 0x7a, 0x60, 0x1c, - 0x90, 0x1, 0xe6, 0xd5, 0x0, 0x84, 0xc0, 0x30, - 0xc5, 0x80, 0x7e, 0x2a, 0xea, 0x75, 0x44, 0x2b, - 0xdf, 0x38, 0x6, - - /* U+F2ED "" */ - 0x0, 0xfc, 0x28, 0x9e, 0x30, 0xf, 0xfe, 0x20, - 0xf5, 0xdf, 0xb2, 0x40, 0x3f, 0x2c, 0x47, 0xb4, - 0x3, 0xf3, 0x44, 0x7c, 0x34, 0xef, 0xe3, 0x0, - 0xfe, 0x77, 0xf9, 0x80, 0x3f, 0xf9, 0x9e, 0x80, - 0x1f, 0xfc, 0xa1, 0xcb, 0xff, 0xff, 0xe5, 0x72, - 0x1, 0x44, 0x7f, 0xf2, 0x18, 0x2, 0x67, 0x7f, - 0xfe, 0x45, 0x0, 0x7f, 0xfb, 0xaa, 0x80, 0x13, - 0x68, 0x4, 0x7c, 0x60, 0x1f, 0xfc, 0x7, 0x70, - 0x5, 0xe4, 0x20, 0x6, 0x16, 0x0, 0xff, 0xff, - 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, - 0xff, 0x27, 0x70, 0x5, 0xe4, 0x20, 0x6, 0x16, - 0x0, 0xf9, 0xc0, 0x35, 0x50, 0x2, 0x6d, 0x0, - 0x8f, 0x8c, 0x2, 0x70, 0x8, 0x40, 0x3f, 0xf9, - 0x2, 0x1, 0x13, 0x0, 0x7f, 0xf1, 0xe0, 0x3, - 0x4d, 0xc3, 0xbf, 0xff, 0xe, 0x78, 0x80, 0x0, - - /* U+F304 "" */ - 0x0, 0xff, 0xe5, 0x33, 0x4, 0x3, 0xff, 0x98, - 0x5b, 0x32, 0xf3, 0x0, 0xff, 0xe5, 0x16, 0x10, - 0x0, 0x70, 0xc0, 0x3f, 0xf9, 0x5, 0x82, 0x1, - 0xd8, 0x60, 0x1f, 0xfc, 0x7b, 0x10, 0xf, 0xb0, - 0xc0, 0x3f, 0xf8, 0x82, 0x12, 0x80, 0x1f, 0xbc, - 0x3, 0xff, 0x86, 0x5f, 0x81, 0x68, 0x1, 0xf1, - 0x80, 0x7f, 0xf0, 0x8b, 0x4, 0xf0, 0x2d, 0x0, - 0x3c, 0x80, 0x1f, 0xfc, 0x12, 0xc1, 0x0, 0x1e, - 0x5, 0xa0, 0x6, 0x1a, 0x0, 0xff, 0xe0, 0x16, - 0x8, 0x6, 0x3c, 0xb, 0x40, 0x0, 0xe0, 0x80, - 0x7f, 0xc5, 0x82, 0x1, 0xe3, 0xc0, 0xb4, 0x1c, - 0x20, 0xf, 0xf8, 0xb0, 0x40, 0x3f, 0x1e, 0x5, - 0xf9, 0x0, 0x7f, 0xc5, 0x82, 0x1, 0xfe, 0x3a, - 0x1, 0x0, 0xff, 0x8b, 0x4, 0x3, 0xfe, 0x18, - 0x0, 0xff, 0xe0, 0x16, 0x8, 0x7, 0xfc, 0x38, - 0x40, 0x1f, 0xf1, 0x60, 0x80, 0x7f, 0xc3, 0x84, - 0x1, 0xff, 0x16, 0x8, 0x7, 0xfc, 0x38, 0x40, - 0x1f, 0xf1, 0x60, 0x80, 0x7f, 0xc3, 0x84, 0x1, - 0xff, 0x16, 0x8, 0x7, 0xfc, 0x38, 0x40, 0x1f, - 0xf1, 0x60, 0x80, 0x7f, 0xc3, 0x84, 0x1, 0xff, - 0xe, 0x8, 0x7, 0xfc, 0x38, 0x40, 0x1f, 0xfc, - 0x4, 0x10, 0xf, 0xf8, 0x70, 0x80, 0x3f, 0xf8, - 0x24, 0x1, 0xff, 0xe, 0x10, 0x7, 0xff, 0xb, - 0x80, 0x3f, 0xc3, 0x84, 0x1, 0xff, 0xc3, 0x20, - 0xf, 0xe1, 0xc2, 0x0, 0xff, 0xe2, 0x30, 0x7, - 0xe1, 0xc2, 0x0, 0xff, 0xe2, 0x90, 0x7, 0xc3, - 0x84, 0x1, 0xff, 0xc6, 0x10, 0xe, 0x13, 0xc2, - 0x0, 0xff, 0xe3, 0xec, 0x4d, 0xef, 0xf6, 0x10, - 0x7, 0xff, 0x1c, - - /* U+F55A "" */ - 0x0, 0xfe, 0x8e, 0xff, 0xff, 0xe4, 0xea, 0x80, - 0x7f, 0x5b, 0x88, 0x7, 0xff, 0x24, 0xa9, 0x40, - 0x3e, 0xb4, 0x0, 0xff, 0xe6, 0xc0, 0x7, 0xad, - 0x0, 0x3f, 0xf9, 0xc4, 0x1, 0xd6, 0x80, 0x1f, - 0xcc, 0xc0, 0xf, 0x33, 0x0, 0x3f, 0xf8, 0x36, - 0x80, 0x1f, 0xcf, 0x32, 0x70, 0xc, 0xf3, 0x28, - 0x0, 0xff, 0xad, 0x0, 0x3f, 0x86, 0x0, 0x10, - 0xe0, 0x7, 0x80, 0x3, 0x88, 0x7, 0xf5, 0xa0, - 0x7, 0xf8, 0x60, 0x2, 0x87, 0x74, 0x0, 0x50, - 0x20, 0x1f, 0xad, 0x0, 0x3f, 0xf8, 0xf, 0x0, - 0x14, 0x40, 0x2, 0x87, 0x0, 0xfd, 0x48, 0x1, - 0xff, 0xc2, 0x78, 0x0, 0xf4, 0x38, 0x7, 0xf2, - 0x80, 0x7f, 0xf1, 0x1d, 0x0, 0x32, 0x38, 0x7, - 0xf9, 0x40, 0x3f, 0xf8, 0x8e, 0x80, 0x19, 0x1c, - 0x3, 0xfd, 0x48, 0x1, 0xff, 0xc2, 0x78, 0x0, - 0xf4, 0x38, 0x7, 0xfa, 0xd0, 0x3, 0xff, 0x80, - 0xf0, 0x1, 0x44, 0x0, 0x28, 0x70, 0xf, 0xf5, - 0xa0, 0x7, 0xf8, 0x60, 0x2, 0x87, 0x74, 0x0, - 0x50, 0x20, 0x1f, 0xeb, 0x40, 0xf, 0xe1, 0x80, - 0x4, 0x38, 0x1, 0xe0, 0x1, 0x2, 0x1, 0xff, - 0x5a, 0x0, 0x7f, 0x3c, 0xc9, 0xc0, 0x33, 0xcc, - 0x9c, 0x3, 0xff, 0x83, 0x68, 0x1, 0xfc, 0xcc, - 0x0, 0xf3, 0x30, 0x3, 0xff, 0x87, 0x68, 0x1, - 0xff, 0xce, 0x20, 0xf, 0xad, 0x40, 0x3f, 0xf9, - 0xb0, 0x1, 0xfa, 0x9c, 0x40, 0x3f, 0xf9, 0x25, - 0x4a, - - /* U+F7C2 "" */ - 0x0, 0xf0, 0xbc, 0x47, 0xf3, 0xa8, 0x7, 0xc3, - 0x90, 0xef, 0xfd, 0x15, 0x82, 0x1, 0x8b, 0x8, - 0x3, 0xff, 0x80, 0x76, 0x1, 0x16, 0x10, 0x7, - 0xff, 0x9, 0x40, 0x5, 0x82, 0x1b, 0xfc, 0xb, - 0xfe, 0x12, 0xff, 0x38, 0x6, 0x2c, 0x10, 0xf, - 0xfe, 0x29, 0xe0, 0x80, 0x7f, 0xf1, 0xb4, 0x40, - 0x3f, 0xf8, 0xe2, 0x1, 0xff, 0xce, 0xdf, 0xe0, - 0x5f, 0xf0, 0x97, 0xf9, 0xc0, 0x3f, 0xff, 0xe0, - 0x1f, 0xff, 0xf0, 0xf, 0xff, 0xf8, 0x7, 0xff, - 0xfc, 0x3, 0xff, 0x8c, 0x20, 0x1f, 0xfc, 0x71, - 0x60, 0xf, 0xfe, 0x3b, 0x42, 0x80, 0x7f, 0xf1, - 0x5a, 0x2, 0xb6, 0xef, 0xff, 0x87, 0xb2, 0x0, - - /* U+F8A2 "" */ - 0x0, 0xff, 0xe7, 0xa0, 0x7, 0xff, 0x3e, 0x6c, - 0x40, 0x3f, 0xf9, 0xb2, 0xc0, 0x1f, 0xfc, 0xe9, - 0x60, 0xf, 0xe5, 0xc5, 0x0, 0xff, 0xe1, 0x1b, - 0x0, 0x7f, 0x3d, 0x1c, 0x0, 0x7f, 0xf0, 0x9c, - 0x3, 0xfa, 0x20, 0x1, 0xff, 0xce, 0x97, 0x0, - 0xff, 0xe7, 0x53, 0x0, 0x7f, 0xf3, 0xad, 0x40, - 0x38, 0xbf, 0xff, 0xf8, 0x56, 0x1, 0xd4, 0x80, - 0x1f, 0xfc, 0xf6, 0x0, 0xff, 0xe8, 0x70, 0x80, - 0x7f, 0xf3, 0x44, 0x45, 0xe4, 0x1, 0xc3, 0x55, - 0xff, 0xc6, 0xf0, 0x0, 0xe1, 0x80, 0x63, 0x55, - 0xff, 0xe3, 0x8, 0x4, 0x38, 0x60, 0x1f, 0xfd, - 0xc, 0x40, 0xf, 0xfe, 0x85, 0xa8, 0x20, 0x7, - 0xff, 0x3a, 0xba, 0x40, 0x3f, 0xf9, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 121, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 120, .box_w = 5, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 41, .adv_w = 175, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, - {.bitmap_index = 66, .adv_w = 315, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 196, .adv_w = 278, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 341, .adv_w = 378, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 524, .adv_w = 307, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 685, .adv_w = 94, .box_w = 4, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, - {.bitmap_index = 697, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 776, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 855, .adv_w = 179, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 907, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 940, .adv_w = 102, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 961, .adv_w = 172, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 969, .adv_w = 102, .box_w = 5, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 980, .adv_w = 158, .box_w = 12, .box_h = 27, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 1083, .adv_w = 299, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1221, .adv_w = 166, .box_w = 8, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1238, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1354, .adv_w = 256, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1462, .adv_w = 300, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1561, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1675, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1812, .adv_w = 268, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1910, .adv_w = 289, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2052, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2187, .adv_w = 102, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2213, .adv_w = 102, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 2249, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 2320, .adv_w = 261, .box_w = 14, .box_h = 9, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 2350, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 2421, .adv_w = 257, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2522, .adv_w = 463, .box_w = 27, .box_h = 25, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 2798, .adv_w = 328, .box_w = 22, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2946, .adv_w = 339, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3063, .adv_w = 324, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3198, .adv_w = 370, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3315, .adv_w = 300, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3363, .adv_w = 284, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3402, .adv_w = 346, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3542, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3574, .adv_w = 139, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3580, .adv_w = 230, .box_w = 13, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3634, .adv_w = 322, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3760, .adv_w = 266, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3786, .adv_w = 428, .box_w = 22, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3916, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4019, .adv_w = 376, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4186, .adv_w = 323, .box_w = 17, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4272, .adv_w = 376, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 4483, .adv_w = 326, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4592, .adv_w = 278, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4726, .adv_w = 263, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4758, .adv_w = 354, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4834, .adv_w = 319, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 4983, .adv_w = 504, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5219, .adv_w = 302, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5365, .adv_w = 290, .box_w = 20, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 5470, .adv_w = 294, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5568, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 5592, .adv_w = 158, .box_w = 13, .box_h = 27, .ofs_x = -2, .ofs_y = -3}, - {.bitmap_index = 5698, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 5721, .adv_w = 261, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 5784, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5791, .adv_w = 269, .box_w = 8, .box_h = 4, .ofs_x = 3, .ofs_y = 17}, - {.bitmap_index = 5806, .adv_w = 268, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5899, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6003, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6098, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6205, .adv_w = 274, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6299, .adv_w = 158, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6351, .adv_w = 309, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 6491, .adv_w = 305, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6553, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6570, .adv_w = 127, .box_w = 9, .box_h = 26, .ofs_x = -3, .ofs_y = -5}, - {.bitmap_index = 6616, .adv_w = 276, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6704, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6711, .adv_w = 474, .box_w = 26, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6806, .adv_w = 305, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6862, .adv_w = 284, .box_w = 16, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6966, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 7072, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 7180, .adv_w = 184, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7210, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7305, .adv_w = 185, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7357, .adv_w = 303, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7408, .adv_w = 250, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 7506, .adv_w = 403, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7661, .adv_w = 247, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7759, .adv_w = 250, .box_w = 17, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 7887, .adv_w = 233, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7954, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 8014, .adv_w = 134, .box_w = 4, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 8023, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 8077, .adv_w = 261, .box_w = 14, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 8112, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 11}, - {.bitmap_index = 8158, .adv_w = 141, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 8176, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 8344, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8523, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8634, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8793, .adv_w = 308, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8946, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 9210, .adv_w = 448, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 9431, .adv_w = 504, .box_w = 32, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9642, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 9805, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9961, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 10218, .adv_w = 224, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10281, .adv_w = 336, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10395, .adv_w = 504, .box_w = 32, .box_h = 27, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10670, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10804, .adv_w = 308, .box_w = 20, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 10984, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 11094, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 11242, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11325, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11379, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 11491, .adv_w = 392, .box_w = 26, .box_h = 25, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 11628, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 11759, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 11890, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11979, .adv_w = 392, .box_w = 25, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 12013, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12263, .adv_w = 560, .box_w = 35, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 12598, .adv_w = 504, .box_w = 33, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 12836, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13065, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 13188, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 13314, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13498, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13564, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 13734, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 13945, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14184, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 14291, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14423, .adv_w = 392, .box_w = 25, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 14501, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14634, .adv_w = 280, .box_w = 19, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 14791, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 14918, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 15084, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15281, .adv_w = 448, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 15463, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 15537, .adv_w = 560, .box_w = 35, .box_h = 26, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15794, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 15895, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 15997, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 16098, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 16198, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 16289, .adv_w = 560, .box_w = 36, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 16500, .adv_w = 392, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 16743, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 16863, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 17090, .adv_w = 560, .box_w = 35, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17291, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 17387, .adv_w = 451, .box_w = 29, .box_h = 19, .ofs_x = 0, .ofs_y = 1} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 4, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 20, 0, 12, -10, 0, 0, - 0, 0, -25, -27, 3, 21, 10, 8, - -18, 3, 22, 1, 19, 4, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 27, 4, -3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 0, -13, 0, 0, 0, 0, - 0, -9, 8, 9, 0, 0, -4, 0, - -3, 4, 0, -4, 0, -4, -2, -9, - 0, 0, 0, 0, -4, 0, 0, -6, - -7, 0, 0, -4, 0, -9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - -4, 0, -7, 0, -12, 0, -54, 0, - 0, -9, 0, 9, 13, 0, 0, -9, - 4, 4, 15, 9, -8, 9, 0, 0, - -26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -17, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -12, -5, -22, 0, -18, - -3, 0, 0, 0, 0, 1, 17, 0, - -13, -4, -1, 1, 0, -8, 0, 0, - -3, -33, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -36, -4, 17, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -18, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 15, - 0, 4, 0, 0, -9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 4, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -17, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, - 9, 4, 13, -4, 0, 0, 9, -4, - -15, -61, 3, 12, 9, 1, -6, 0, - 16, 0, 14, 0, 14, 0, -42, 0, - -5, 13, 0, 15, -4, 9, 4, 0, - 0, 1, -4, 0, 0, -8, 36, 0, - 36, 0, 13, 0, 19, 6, 8, 13, - 0, 0, 0, -17, 0, 0, 0, 0, - 1, -3, 0, 3, -8, -6, -9, 3, - 0, -4, 0, 0, 0, -18, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -29, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, -25, 0, -28, 0, 0, 0, - 0, -3, 0, 44, -5, -6, 4, 4, - -4, 0, -6, 4, 0, 0, -24, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -43, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -28, 0, 27, 0, 0, -17, 0, - 15, 0, -30, -43, -30, -9, 13, 0, - 0, -30, 0, 5, -10, 0, -7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 12, 13, -55, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 21, 0, 3, 0, 0, 0, - 0, 0, 3, 3, -5, -9, 0, -1, - -1, -4, 0, 0, -3, 0, 0, 0, - -9, 0, -4, 0, -10, -9, 0, -11, - -15, -15, -9, 0, -9, 0, -9, 0, - 0, 0, 0, -4, 0, 0, 4, 0, - 3, -4, 0, 1, 0, 0, 0, 4, - -3, 0, 0, 0, -3, 4, 4, -1, - 0, 0, 0, -9, 0, -1, 0, 0, - 0, 0, 0, 1, 0, 6, -3, 0, - -5, 0, -8, 0, 0, -3, 0, 13, - 0, 0, -4, 0, 0, 0, 0, 0, - -1, 1, -3, -3, 0, 0, -4, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, -2, 0, -4, -5, 0, - 0, 0, 0, 0, 1, 0, 0, -3, - 0, -4, -4, -4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -3, 0, 0, - 0, 0, -3, -6, 0, -7, 0, -13, - -3, -13, 9, 0, 0, -9, 4, 9, - 12, 0, -11, -1, -5, 0, -1, -21, - 4, -3, 3, -24, 4, 0, 0, 1, - -23, 0, -24, -4, -39, -3, 0, -22, - 0, 9, 13, 0, 6, 0, 0, 0, - 0, 1, 0, -8, -6, 0, -13, 0, - 0, 0, -4, 0, 0, 0, -4, 0, - 0, 0, 0, 0, -2, -2, 0, -2, - -6, 0, 0, 0, 0, 0, 0, 0, - -4, -4, 0, -3, -5, -4, 0, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, -4, 0, -5, - 0, -3, 0, -9, 4, 0, 0, -5, - 2, 4, 4, 0, 0, 0, 0, 0, - 0, -3, 0, 0, 0, 0, 0, 3, - 0, 0, -4, 0, -4, -3, -5, 0, - 0, 0, 0, 0, 0, 0, 4, 0, - -4, 0, 0, 0, 0, -5, -7, 0, - -9, 0, 13, -3, 1, -14, 0, 0, - 12, -22, -23, -19, -9, 4, 0, -4, - -29, -8, 0, -8, 0, -9, 7, -8, - -29, 0, -12, 0, 0, 2, -1, 4, - -3, 0, 4, 0, -13, -17, 0, -22, - -11, -9, -11, -13, -5, -12, -1, -9, - -12, 3, 0, 1, 0, -4, 0, 0, - 0, 3, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - 0, -2, 0, -1, -4, 0, -8, -10, - -10, -1, 0, -13, 0, 0, 0, 0, - 0, 0, -4, 0, 0, 0, 0, 2, - -3, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 22, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, 0, 0, - -9, 0, 0, 0, 0, -22, -13, 0, - 0, 0, -7, -22, 0, 0, -4, 4, - 0, -12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, 0, 0, -9, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, -8, 0, - 0, 0, 0, 5, 0, 3, -9, -9, - 0, -4, -4, -5, 0, 0, 0, 0, - 0, 0, -13, 0, -4, 0, -7, -4, - 0, -10, -11, -13, -4, 0, -9, 0, - -13, 0, 0, 0, 0, 36, 0, 0, - 2, 0, 0, -6, 0, 4, 0, -19, - 0, 0, 0, 0, 0, -42, -8, 15, - 13, -4, -19, 0, 4, -7, 0, -22, - -2, -6, 4, -31, -4, 6, 0, 7, - -16, -7, -17, -15, -19, 0, 0, -27, - 0, 26, 0, 0, -2, 0, 0, 0, - -2, -2, -4, -12, -15, -1, -42, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -4, 0, -2, -4, -7, 0, 0, - -9, 0, -4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, -9, 0, 0, 9, - -1, 6, 0, -10, 4, -3, -1, -12, - -4, 0, -6, -4, -3, 0, -7, -8, - 0, 0, -4, -1, -3, -8, -5, 0, - 0, -4, 0, 4, -3, 0, -10, 0, - 0, 0, -9, 0, -8, 0, -8, -8, - 4, 0, 0, 0, 0, 0, 0, 0, - 0, -9, 4, 0, -6, 0, -3, -5, - -14, -3, -3, -3, -1, -3, -5, -1, - 0, 0, 0, 0, 0, -4, -4, -4, - 0, 0, 0, 0, 5, -3, 0, -3, - 0, 0, 0, -3, -5, -3, -4, -5, - -4, 0, 4, 18, -1, 0, -12, 0, - -3, 9, 0, -4, -19, -6, 7, 0, - 0, -21, -8, 4, -8, 3, 0, -3, - -4, -14, 0, -7, 2, 0, 0, -8, - 0, 0, 0, 4, 4, -9, -9, 0, - -8, -4, -7, -4, -4, 0, -8, 2, - -9, -8, 13, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, 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, - -3, 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, -4, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, 0, 0, -6, - 0, 0, -4, -4, 0, 0, 0, 0, - -4, 0, 0, 0, 0, -2, 0, 0, - 0, 0, 0, -3, 0, 0, 0, 0, - -7, 0, -9, 0, 0, 0, -15, 0, - 3, -10, 9, 1, -3, -21, 0, 0, - -10, -4, 0, -18, -11, -13, 0, 0, - -19, -4, -18, -17, -22, 0, -12, 0, - 4, 30, -6, 0, -10, -4, -1, -4, - -8, -12, -8, -17, -18, -10, -4, 0, - 0, -3, 0, 1, 0, 0, -31, -4, - 13, 10, -10, -17, 0, 1, -14, 0, - -22, -3, -4, 9, -41, -6, 1, 0, - 0, -29, -5, -23, -4, -33, 0, 0, - -31, 0, 26, 1, 0, -3, 0, 0, - 0, 0, -2, -3, -17, -3, 0, -29, - 0, 0, 0, 0, -14, 0, -4, 0, - -1, -13, -21, 0, 0, -2, -7, -13, - -4, 0, -3, 0, 0, 0, 0, -20, - -4, -15, -14, -4, -8, -11, -4, -8, - 0, -9, -4, -15, -7, 0, -5, -9, - -4, -9, 0, 2, 0, -3, -15, 0, - 9, 0, -8, 0, 0, 0, 0, 5, - 0, 3, -9, 18, 0, -4, -4, -5, - 0, 0, 0, 0, 0, 0, -13, 0, - -4, 0, -7, -4, 0, -10, -11, -13, - -4, 0, -9, 4, 18, 0, 0, 0, - 0, 36, 0, 0, 2, 0, 0, -6, - 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -3, -9, 0, 0, 0, 0, 0, -2, - 0, 0, 0, -4, -4, 0, 0, -9, - -4, 0, 0, -9, 0, 8, -2, 0, - 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 7, 9, 4, -4, 0, -14, - -7, 0, 13, -15, -14, -9, -9, 18, - 8, 4, -39, -3, 9, -4, 0, -4, - 5, -4, -16, 0, -4, 4, -6, -4, - -13, -4, 0, 0, 13, 9, 0, -13, - 0, -25, -6, 13, -6, -17, 1, -6, - -15, -15, -4, 18, 4, 0, -7, 0, - -12, 0, 4, 15, -10, -17, -18, -11, - 13, 0, 1, -33, -4, 4, -8, -3, - -10, 0, -10, -17, -7, -7, -4, 0, - 0, -10, -9, -4, 0, 13, 10, -4, - -25, 0, -25, -6, 0, -16, -26, -1, - -14, -8, -15, -13, 12, 0, 0, -6, - 0, -9, -4, 0, -4, -8, 0, 8, - -15, 4, 0, 0, -24, 0, -4, -10, - -8, -3, -13, -11, -15, -10, 0, -13, - -4, -10, -9, -13, -4, 0, 0, 1, - 21, -8, 0, -13, -4, 0, -4, -9, - -10, -12, -13, -17, -6, -9, 9, 0, - -7, 0, -22, -5, 3, 9, -14, -17, - -9, -15, 15, -4, 2, -42, -8, 9, - -10, -8, -17, 0, -13, -19, -5, -4, - -4, -4, -9, -13, -1, 0, 0, 13, - 13, -3, -29, 0, -27, -10, 11, -17, - -30, -9, -16, -19, -22, -15, 9, 0, - 0, 0, 0, -5, 0, 0, 4, -5, - 9, 3, -9, 9, 0, 0, -14, -1, - 0, -1, 0, 1, 1, -4, 0, 0, - 0, 0, 0, 0, -4, 0, 0, 0, - 0, 4, 13, 1, 0, -5, 0, 0, - 0, 0, -3, -3, -5, 0, 0, 0, - 1, 4, 0, 0, 0, 0, 4, 0, - -4, 0, 17, 0, 8, 1, 1, -6, - 0, 9, 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13, 0, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -27, 0, -4, 8, 0, 13, - 0, 0, 44, 5, -9, -9, 4, 4, - -3, 1, -22, 0, 0, 22, -27, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -30, 17, 63, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -27, 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, -7, 0, 0, -9, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, -12, 0, - 0, 1, 0, 0, 4, 58, -9, -4, - 14, 12, -12, 4, 0, 0, 4, 4, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -58, 13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -13, - 0, 0, 0, -12, 0, 0, 0, 0, - -10, -2, 0, 0, 0, -10, 0, -5, - 0, -21, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -30, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, -4, 0, 0, -9, 0, -7, 0, - -12, 0, 0, 0, -8, 4, -5, 0, - 0, -12, -4, -10, 0, 0, -12, 0, - -4, 0, -21, 0, -5, 0, 0, -36, - -9, -18, -5, -16, 0, 0, -30, 0, - -12, -2, 0, 0, 0, 0, 0, 0, - 0, 0, -7, -8, -4, -8, 0, 0, - 0, 0, -10, 0, -10, 6, -5, 9, - 0, -3, -10, -3, -8, -9, 0, -5, - -2, -3, 3, -12, -1, 0, 0, 0, - -39, -4, -6, 0, -10, 0, -3, -21, - -4, 0, 0, -3, -4, 0, 0, 0, - 0, 3, 0, -3, -8, -3, 8, 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, 6, 0, 0, 0, 0, 0, - 0, -10, 0, -3, 0, 0, 0, -9, - 4, 0, 0, 0, -12, -4, -9, 0, - 0, -13, 0, -4, 0, -21, 0, 0, - 0, 0, -43, 0, -9, -17, -22, 0, - 0, -30, 0, -3, -7, 0, 0, 0, - 0, 0, 0, 0, 0, -4, -7, -2, - -7, 1, 0, 0, 8, -6, 0, 14, - 22, -4, -4, -13, 5, 22, 8, 10, - -12, 5, 19, 5, 13, 10, 12, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 28, 21, -8, -4, 0, -4, - 36, 19, 36, 0, 0, 0, 4, 0, - 0, 17, 0, 0, -7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -3, 0, - 0, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, -38, -5, -4, -18, - -22, 0, 0, -30, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - 0, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, -38, -5, -4, - -18, -22, 0, 0, -18, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -4, 0, 0, 0, -10, 4, 0, -4, - 4, 8, 4, -13, 0, -1, -4, 4, - 0, 4, 0, 0, 0, 0, -11, 0, - -4, -3, -9, 0, -4, -18, 0, 28, - -4, 0, -10, -3, 0, -3, -8, 0, - -4, -13, -9, -5, 0, 0, 0, -7, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -3, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, -38, - -5, -4, -18, -22, 0, 0, -30, 0, - 0, 0, 0, 0, 0, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -7, 0, -14, -5, -4, 13, -4, -4, - -18, 1, -3, 1, -3, -12, 1, 10, - 1, 4, 1, 4, -11, -18, -5, 0, - -17, -9, -12, -19, -17, 0, -7, -9, - -5, -6, -4, -3, -5, -3, 0, -3, - -1, 7, 0, 7, -3, 0, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -3, -4, -4, 0, 0, - -12, 0, -2, 0, -8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -27, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, -4, 0, -6, - 0, 0, 0, 0, -4, 0, 0, -8, - -4, 4, 0, -8, -9, -3, 0, -13, - -3, -10, -3, -5, 0, -8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -30, 0, 14, 0, 0, -8, 0, - 0, 0, 0, -6, 0, -4, 0, 0, - -2, 0, 0, -3, 0, -10, 0, 0, - 19, -6, -15, -14, 3, 5, 5, -1, - -13, 3, 7, 3, 13, 3, 15, -3, - -12, 0, 0, -18, 0, 0, -13, -12, - 0, 0, -9, 0, -6, -8, 0, -7, - 0, -7, 0, -3, 7, 0, -4, -13, - -4, 17, 0, 0, -4, 0, -9, 0, - 0, 6, -10, 0, 4, -4, 4, 0, - 0, -15, 0, -3, -1, 0, -4, 5, - -4, 0, 0, 0, -18, -5, -10, 0, - -13, 0, 0, -21, 0, 17, -4, 0, - -8, 0, 3, 0, -4, 0, -4, -13, - 0, -4, 4, 0, 0, 0, 0, -3, - 0, 0, 4, -6, 1, 0, 0, -5, - -3, 0, -5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -28, 0, 10, 0, - 0, -4, 0, 0, 0, 0, 1, 0, - -4, -4, 0, 0, 0, 9, 0, 10, - 0, 0, 0, 0, 0, -28, -26, 1, - 19, 13, 8, -18, 3, 19, 0, 17, - 0, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 1, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_28_compressed = { -#else -lv_font_t lv_font_montserrat_28_compressed = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 30, /*The maximum line height required by the font*/ - .base_line = 5, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -2, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_28_COMPRESSED*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_30.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_30.c deleted file mode 100644 index 30e48eb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_30.c +++ /dev/null @@ -1,5723 +0,0 @@ -/******************************************************************************* - * Size: 30 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 30 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_30.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_30 - #define LV_FONT_MONTSERRAT_30 1 -#endif - -#if LV_FONT_MONTSERRAT_30 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0xaf, 0xfb, 0x9f, 0xfa, 0x9f, 0xfa, 0x8f, 0xf9, - 0x7f, 0xf8, 0x7f, 0xf8, 0x6f, 0xf7, 0x6f, 0xf6, - 0x5f, 0xf6, 0x4f, 0xf5, 0x4f, 0xf4, 0x3f, 0xf4, - 0x3f, 0xf3, 0x2f, 0xf3, 0x5, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x2b, 0xb3, 0xcf, 0xfd, 0xdf, 0xfe, - 0x4e, 0xe4, - - /* U+0022 "\"" */ - 0x1f, 0xf6, 0x0, 0xaf, 0xd1, 0xff, 0x50, 0xa, - 0xfc, 0xf, 0xf5, 0x0, 0xaf, 0xc0, 0xff, 0x50, - 0x9, 0xfb, 0xf, 0xf4, 0x0, 0x9f, 0xb0, 0xff, - 0x40, 0x9, 0xfb, 0xf, 0xf3, 0x0, 0x8f, 0xa0, - 0xff, 0x30, 0x8, 0xfa, 0x1, 0x10, 0x0, 0x1, - 0x0, - - /* U+0023 "#" */ - 0x0, 0x0, 0x0, 0x2f, 0xf0, 0x0, 0x0, 0x6f, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, - 0x0, 0x8, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xb0, 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xf9, 0x0, 0x0, 0xc, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x70, 0x0, - 0x0, 0xef, 0x30, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x2, 0x22, 0x3f, 0xf3, 0x22, 0x22, - 0x6f, 0xd2, 0x22, 0x20, 0x0, 0x0, 0x2, 0xff, - 0x0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x8f, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0xa, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x90, - 0x0, 0x0, 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xf7, 0x0, 0x0, 0xd, 0xf4, 0x0, 0x0, - 0x0, 0x22, 0x22, 0xcf, 0x72, 0x22, 0x22, 0xff, - 0x52, 0x22, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x5f, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, - 0x7, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xb0, 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xf9, 0x0, 0x0, 0xb, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, - 0xdf, 0x40, 0x0, 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0x3, 0x83, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xec, - 0x83, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x20, 0x2, 0xef, 0xff, 0xcc, 0xfc, - 0xbe, 0xff, 0xf3, 0x0, 0xbf, 0xfc, 0x20, 0x7f, - 0x70, 0x2, 0x9c, 0x0, 0x1f, 0xff, 0x10, 0x7, - 0xf7, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, - 0x7f, 0x70, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, - 0x7, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf7, - 0x0, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfd, 0x69, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xcf, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, - 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xf9, 0x8e, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x7, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, 0xb, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, - 0x9f, 0xf5, 0x8, 0x10, 0x0, 0x7, 0xf7, 0x0, - 0xd, 0xff, 0x34, 0xfe, 0x71, 0x0, 0x7f, 0x70, - 0xa, 0xff, 0xd0, 0x8f, 0xff, 0xfc, 0xac, 0xfb, - 0xbf, 0xff, 0xf3, 0x0, 0x5d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe4, 0x0, 0x0, 0x4, 0x9d, 0xef, - 0xff, 0xeb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x83, 0x0, 0x0, 0x0, 0x0, - - /* U+0025 "%" */ - 0x0, 0x5c, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xfa, 0x0, 0x0, 0x7, 0xff, 0xcd, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x0, - 0x3f, 0xe3, 0x0, 0x3e, 0xf2, 0x0, 0x0, 0x1, - 0xff, 0x40, 0x0, 0x0, 0x9f, 0x70, 0x0, 0x7, - 0xf9, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, - 0xdf, 0x30, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x6f, - 0xd0, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x1, - 0xfd, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, - 0xdf, 0x30, 0x0, 0x3, 0xfc, 0x0, 0xc, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0x70, 0x0, 0x7, - 0xf9, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xe2, 0x0, 0x3e, 0xf2, 0x2, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xcc, 0xff, - 0x70, 0xc, 0xf7, 0x0, 0x59, 0xa8, 0x20, 0x0, - 0x0, 0x5c, 0xff, 0xc5, 0x0, 0x8f, 0xc0, 0xc, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x20, 0xaf, 0xb2, 0x5, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xf6, 0x1, 0xfe, - 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xb0, 0x6, 0xf9, 0x0, 0x0, 0xf, 0xf0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x10, 0x8, 0xf6, - 0x0, 0x0, 0xd, 0xf2, 0x0, 0x0, 0x0, 0xe, - 0xf6, 0x0, 0x8, 0xf6, 0x0, 0x0, 0xc, 0xf2, - 0x0, 0x0, 0x0, 0x9f, 0xb0, 0x0, 0x7, 0xf7, - 0x0, 0x0, 0xe, 0xf1, 0x0, 0x0, 0x4, 0xfe, - 0x10, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x3f, 0xd0, - 0x0, 0x0, 0x1e, 0xf5, 0x0, 0x0, 0x0, 0xcf, - 0x40, 0x0, 0xbf, 0x60, 0x0, 0x0, 0xaf, 0xa0, - 0x0, 0x0, 0x0, 0x2e, 0xfa, 0x9d, 0xfa, 0x0, - 0x0, 0x5, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2, - 0xae, 0xfd, 0x70, 0x0, - - /* U+0026 "&" */ - 0x0, 0x0, 0x5, 0xbe, 0xfe, 0xc6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb4, - 0x23, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xfd, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xfa, 0x0, 0x0, 0xa, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x1e, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, - 0x1, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf3, 0x5e, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfb, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xfc, 0x35, 0xff, 0xf4, 0x0, 0x4, 0xc7, 0x0, - 0x9, 0xff, 0x90, 0x0, 0x4f, 0xff, 0x40, 0x9, - 0xfe, 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x4, 0xff, - 0xf5, 0xe, 0xf9, 0x0, 0x8f, 0xf5, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xaf, 0xf4, 0x0, 0xaf, 0xf3, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xc0, 0x0, - 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0x80, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x4, - 0xdf, 0xff, 0xf6, 0x0, 0x9, 0xff, 0xfd, 0x86, - 0x78, 0xdf, 0xff, 0x8e, 0xff, 0x70, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xd4, 0x2, 0xef, 0xc0, - 0x0, 0x2, 0x7c, 0xef, 0xed, 0x95, 0x0, 0x0, - 0x2c, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0x1f, 0xf6, 0x1f, 0xf5, 0xf, 0xf5, 0xf, 0xf5, - 0xf, 0xf4, 0xf, 0xf4, 0xf, 0xf3, 0xf, 0xf3, - 0x1, 0x10, - - /* U+0028 "(" */ - 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x5, 0xff, 0x60, - 0x0, 0xd, 0xfe, 0x0, 0x0, 0x4f, 0xf7, 0x0, - 0x0, 0xaf, 0xf2, 0x0, 0x0, 0xff, 0xd0, 0x0, - 0x4, 0xff, 0x80, 0x0, 0x7, 0xff, 0x50, 0x0, - 0xa, 0xff, 0x20, 0x0, 0xd, 0xff, 0x0, 0x0, - 0xf, 0xfd, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, - 0x1f, 0xfc, 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x0, - 0x2f, 0xfb, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, - 0xf, 0xfc, 0x0, 0x0, 0xf, 0xfd, 0x0, 0x0, - 0xd, 0xff, 0x0, 0x0, 0xa, 0xff, 0x20, 0x0, - 0x7, 0xff, 0x50, 0x0, 0x4, 0xff, 0x80, 0x0, - 0x0, 0xef, 0xd0, 0x0, 0x0, 0xaf, 0xf2, 0x0, - 0x0, 0x4f, 0xf7, 0x0, 0x0, 0xd, 0xfe, 0x0, - 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, 0xdf, 0xe0, - - /* U+0029 ")" */ - 0xc, 0xfe, 0x0, 0x0, 0x5, 0xff, 0x70, 0x0, - 0x0, 0xdf, 0xf1, 0x0, 0x0, 0x6f, 0xf6, 0x0, - 0x0, 0x1f, 0xfc, 0x0, 0x0, 0xb, 0xff, 0x10, - 0x0, 0x6, 0xff, 0x60, 0x0, 0x3, 0xff, 0x90, - 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0xdf, 0xf0, - 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0xaf, 0xf2, - 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x8f, 0xf4, - 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x9f, 0xf3, - 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x0, 0xbf, 0xf1, - 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, 0xff, 0xc0, - 0x0, 0x3, 0xff, 0x90, 0x0, 0x6, 0xff, 0x60, - 0x0, 0xb, 0xff, 0x10, 0x0, 0x1f, 0xfc, 0x0, - 0x0, 0x6f, 0xf6, 0x0, 0x0, 0xdf, 0xe1, 0x0, - 0x5, 0xff, 0x70, 0x0, 0xc, 0xfe, 0x0, 0x0, - - /* U+002A "*" */ - 0x0, 0x0, 0xe, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xe0, 0x0, 0x0, 0xc, 0x70, 0xe, 0xe0, - 0x7, 0xc0, 0x3f, 0xfe, 0x5e, 0xe5, 0xef, 0xf3, - 0x2, 0xaf, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x4, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xf8, 0x0, 0x3e, 0xff, 0x7e, 0xe7, 0xff, 0xe3, - 0xd, 0xa1, 0xe, 0xe0, 0x1a, 0xd0, 0x0, 0x0, - 0xe, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x56, 0x66, 0x6b, 0xff, 0x66, 0x66, 0x62, 0x0, - 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, - 0x0, 0x0, - - /* U+002C "," */ - 0x1, 0x41, 0x3, 0xff, 0xe1, 0x8f, 0xff, 0x55, - 0xff, 0xf4, 0x9, 0xff, 0x0, 0x8f, 0xa0, 0xc, - 0xf5, 0x0, 0xff, 0x0, 0x4f, 0xa0, 0x0, - - /* U+002D "-" */ - 0x27, 0x77, 0x77, 0x77, 0x64, 0xff, 0xff, 0xff, - 0xfc, 0x4f, 0xff, 0xff, 0xff, 0xc0, - - /* U+002E "." */ - 0x0, 0x0, 0x1, 0xdf, 0xb0, 0x8f, 0xff, 0x58, - 0xff, 0xf4, 0x1b, 0xf9, 0x0, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x0, 0x3, 0x9d, 0xff, 0xd9, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0xbb, 0xef, - 0xff, 0xc0, 0x0, 0x0, 0xaf, 0xfe, 0x50, 0x0, - 0x5, 0xef, 0xfa, 0x0, 0x4, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0x40, 0xb, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xb0, 0xf, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x4f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf4, - 0x6f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xf6, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf8, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xf8, 0x8f, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xf8, 0x6f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xf6, 0x4f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0xf, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0xb, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x7, 0xff, 0xb0, - 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0x40, 0x0, 0xaf, 0xfe, 0x50, 0x0, 0x4, 0xef, - 0xfa, 0x0, 0x0, 0xc, 0xff, 0xfe, 0xbb, 0xef, - 0xff, 0xc0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x3, 0x9d, - 0xff, 0xda, 0x30, 0x0, 0x0, - - /* U+0031 "1" */ - 0xcf, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0x79, 0x99, 0x9f, 0xff, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0xf, 0xff, - - /* U+0032 "2" */ - 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xb6, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, - 0x0, 0x1c, 0xff, 0xff, 0xcb, 0xbd, 0xff, 0xff, - 0x30, 0x3, 0xef, 0xe5, 0x0, 0x0, 0x4, 0xdf, - 0xfd, 0x0, 0x2, 0xa1, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfd, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x10, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, - - /* U+0033 "3" */ - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8, 0x99, 0x99, 0x99, 0x99, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xfd, 0x80, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x0, 0x0, 0x11, 0x13, 0x8e, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, - 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf7, - 0x4f, 0xfa, 0x30, 0x0, 0x0, 0x1a, 0xff, 0xf1, - 0x9f, 0xff, 0xfe, 0xca, 0xbd, 0xff, 0xff, 0x50, - 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, - 0x0, 0x4, 0x8c, 0xef, 0xfd, 0xb6, 0x0, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, - 0x0, 0x0, 0x33, 0x20, 0x0, 0x0, 0x0, 0x7f, - 0xfc, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, - 0x3f, 0xfe, 0x20, 0x0, 0x1, 0xff, 0xb0, 0x0, - 0x0, 0x1e, 0xff, 0x40, 0x0, 0x0, 0x1f, 0xfb, - 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, 0x1, - 0xff, 0xb0, 0x0, 0x8, 0xff, 0xf9, 0x99, 0x99, - 0x99, 0x9f, 0xfe, 0x99, 0x96, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, - - /* U+0035 "5" */ - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x1f, 0xfd, 0x99, 0x99, 0x99, 0x99, - 0x90, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xfe, 0xb8, 0x20, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x89, 0x99, - 0x9a, 0xbd, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x8f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, - 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, - 0x0, 0xef, 0xd5, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x60, 0x3f, 0xff, 0xff, 0xdb, 0xac, 0xff, 0xff, - 0xa0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xfe, 0xc8, - 0x20, 0x0, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xc9, 0x40, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x8, 0xff, 0xff, 0xca, 0x99, 0xcf, - 0xe0, 0x0, 0x6, 0xff, 0xf9, 0x10, 0x0, 0x0, - 0x13, 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x1, 0x7c, - 0xef, 0xec, 0x71, 0x0, 0x8, 0xff, 0x75, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0x0, 0x8f, 0xfb, 0xff, - 0xea, 0x77, 0x9e, 0xff, 0xf5, 0x8, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x9, 0xff, 0xe0, 0x7f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x65, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x1f, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, 0xa0, - 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, - 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x50, 0xd, 0xff, 0xa0, 0x0, 0x0, 0x9, 0xff, - 0xd0, 0x0, 0x2e, 0xff, 0xea, 0x77, 0x9e, 0xff, - 0xf3, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, - 0xd3, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xff, 0xeb, - 0x60, 0x0, 0x0, - - /* U+0037 "7" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x1f, 0xfe, 0x99, 0x99, 0x99, 0x99, 0x9e, - 0xff, 0x81, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf1, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xfa, 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x20, 0x5, 0x54, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x0, 0x39, 0xce, 0xfe, 0xda, 0x50, 0x0, - 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0xdf, 0xff, 0xb8, 0x78, 0xaf, 0xff, - 0xf3, 0x0, 0x7f, 0xfe, 0x30, 0x0, 0x0, 0x1a, - 0xff, 0xc0, 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x10, 0xef, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xf3, 0xc, 0xff, 0x30, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x10, 0x7f, 0xfc, 0x10, 0x0, - 0x0, 0x8, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0x96, - 0x45, 0x8d, 0xff, 0xe2, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x6e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x7f, 0xff, - 0x93, 0x10, 0x3, 0x7e, 0xff, 0xb0, 0x2f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x67, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0xaf, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xc1, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x7, 0xff, - 0xf5, 0x5, 0xff, 0xff, 0xa7, 0x67, 0x9e, 0xff, - 0xf9, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x59, 0xde, 0xfe, 0xdb, - 0x61, 0x0, 0x0, - - /* U+0039 "9" */ - 0x0, 0x0, 0x38, 0xde, 0xfe, 0xc7, 0x10, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb7, 0x78, 0xcf, - 0xff, 0x80, 0x0, 0x6, 0xff, 0xd2, 0x0, 0x0, - 0x3, 0xdf, 0xf5, 0x0, 0xd, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x2f, 0xfe, 0x0, 0xf, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x1f, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0xf, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, - 0xb, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xf0, 0x3, 0xff, 0xfb, 0x41, 0x1, 0x5c, 0xff, - 0xff, 0xf0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xf0, 0x0, 0x3, 0xbf, 0xff, 0xff, - 0xfb, 0x30, 0xff, 0xf0, 0x0, 0x0, 0x1, 0x46, - 0x64, 0x10, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xf9, - 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5e, 0xff, - 0xd0, 0x0, 0x0, 0x7f, 0xeb, 0xa9, 0xae, 0xff, - 0xfd, 0x20, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xa1, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, - 0xec, 0x82, 0x0, 0x0, 0x0, - - /* U+003A ":" */ - 0x1b, 0xfa, 0x8, 0xff, 0xf4, 0x8f, 0xff, 0x51, - 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfb, - 0x8, 0xff, 0xf5, 0x8f, 0xff, 0x41, 0xbf, 0x90, - - /* U+003B ";" */ - 0x1b, 0xfa, 0x8, 0xff, 0xf4, 0x8f, 0xff, 0x51, - 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, - 0x7, 0xff, 0xf4, 0x7f, 0xff, 0x51, 0xcf, 0xf1, - 0x7, 0xfc, 0x0, 0xbf, 0x70, 0xf, 0xf1, 0x3, - 0xfc, 0x0, 0x25, 0x20, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xa6, 0x0, 0x0, - 0x0, 0x0, 0x17, 0xdf, 0xf7, 0x0, 0x0, 0x0, - 0x4b, 0xff, 0xff, 0xc3, 0x0, 0x2, 0x8e, 0xff, - 0xfe, 0x93, 0x0, 0x5, 0xbf, 0xff, 0xfb, 0x50, - 0x0, 0x0, 0xef, 0xff, 0xd7, 0x10, 0x0, 0x0, - 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x6, - 0xcf, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x3, - 0x9f, 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, - 0x5c, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, - 0x28, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+003D "=" */ - 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x52, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - - /* U+003E ">" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd7, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfd, - 0x71, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, - 0xb4, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, - 0xe8, 0x20, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf7, - 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xf6, 0x0, - 0x0, 0x17, 0xdf, 0xff, 0xf9, 0x30, 0x0, 0x5b, - 0xff, 0xff, 0xc5, 0x0, 0x0, 0x8e, 0xff, 0xfe, - 0x82, 0x0, 0x0, 0x0, 0xff, 0xfb, 0x50, 0x0, - 0x0, 0x0, 0x0, 0xe8, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+003F "?" */ - 0x0, 0x2, 0x7b, 0xdf, 0xfe, 0xb7, 0x10, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x1d, 0xff, 0xfe, 0xa9, 0x9c, 0xff, 0xff, 0x40, - 0x6f, 0xfd, 0x40, 0x0, 0x0, 0x2d, 0xff, 0xd0, - 0x3, 0xa0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x43, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xc6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xf9, 0x0, 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xdf, 0xff, - 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xcf, 0xfe, 0x94, 0x20, 0x0, 0x14, 0x7c, 0xff, - 0xe5, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xf8, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x0, - 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x2, 0x44, - 0x20, 0x0, 0x25, 0x50, 0x5f, 0xf4, 0x0, 0x0, - 0xcf, 0xc0, 0x0, 0x0, 0x7d, 0xff, 0xff, 0xd6, - 0x9, 0xff, 0x0, 0x7f, 0xe0, 0x0, 0x4f, 0xf2, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfb, 0x9f, - 0xf0, 0x0, 0xcf, 0x70, 0xb, 0xfa, 0x0, 0x0, - 0xcf, 0xfc, 0x51, 0x2, 0x7e, 0xff, 0xff, 0x0, - 0x5, 0xfd, 0x0, 0xff, 0x40, 0x0, 0x7f, 0xfa, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf0, 0x0, 0xe, - 0xf2, 0x4f, 0xf0, 0x0, 0xe, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0xbf, 0x56, - 0xfc, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf0, 0x0, 0x8, 0xf7, 0x8f, 0xa0, - 0x0, 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0x0, 0x0, 0x7f, 0x88, 0xfa, 0x0, 0x6, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, - 0x0, 0x7, 0xf8, 0x8f, 0xa0, 0x0, 0x4f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, - 0x8f, 0x76, 0xfc, 0x0, 0x1, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0xa, 0xf5, - 0x3f, 0xf0, 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x0, 0x0, 0xef, 0x20, 0xff, - 0x40, 0x0, 0x4f, 0xfd, 0x20, 0x0, 0x0, 0x5f, - 0xff, 0xf3, 0x0, 0x6f, 0xd0, 0xa, 0xfa, 0x0, - 0x0, 0x9f, 0xff, 0x95, 0x46, 0xbf, 0xf9, 0xff, - 0xc5, 0x7f, 0xf5, 0x0, 0x4f, 0xf2, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xf6, 0xc, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0xbf, 0xc0, 0x0, 0x0, 0x29, - 0xdf, 0xfd, 0x82, 0x0, 0x19, 0xef, 0xd6, 0x0, - 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, - 0xfe, 0x95, 0x21, 0x1, 0x36, 0xaf, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, - 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xcd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf5, 0x7f, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x1, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x70, 0x9, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, 0x0, 0x2f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xfa, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x4, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc0, - 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x6f, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xb6, 0x66, 0x66, 0x66, 0x6c, 0xff, 0x90, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0xf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xe0, 0x0, 0x7, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x60, 0x0, - 0xef, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xfd, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, 0xc, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xc0, - - /* U+0042 "B" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x40, 0x0, 0xdf, 0xf8, 0x66, 0x66, 0x66, - 0x8b, 0xff, 0xff, 0x30, 0xd, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xfb, 0x0, 0xdf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0xd, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xf9, 0x0, 0xdf, 0xf2, 0x0, 0x0, - 0x0, 0x14, 0xaf, 0xfe, 0x10, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, - 0xd, 0xff, 0x86, 0x66, 0x66, 0x67, 0x8b, 0xff, - 0xfb, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xf8, 0xd, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf0, 0xdf, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x2d, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x1d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xb0, 0xdf, 0xf8, 0x66, 0x66, 0x66, - 0x78, 0xbf, 0xff, 0xf2, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, 0x0, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x0, 0x5, 0x9d, 0xff, 0xed, 0xa5, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xe6, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xfe, 0xba, 0xbd, 0xff, 0xff, 0xa0, 0x0, 0x1d, - 0xff, 0xfb, 0x30, 0x0, 0x0, 0x29, 0xff, 0xf3, - 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x3d, 0x40, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x3d, 0x40, 0x0, 0x1d, 0xff, 0xfa, 0x30, 0x0, - 0x0, 0x29, 0xff, 0xf3, 0x0, 0x1, 0xbf, 0xff, - 0xfe, 0xba, 0xbd, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xed, 0x95, - 0x0, 0x0, - - /* U+0044 "D" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x50, 0x0, 0x0, 0xdf, 0xfa, 0x99, - 0x99, 0x9a, 0xce, 0xff, 0xff, 0xa0, 0x0, 0xd, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, - 0xb0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x80, 0xd, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, 0xdf, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf9, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xe0, 0xdf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x2d, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xf4, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x5d, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, 0xdf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0x2d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xe0, 0xdf, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xf9, 0xd, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x80, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x4, 0xbf, 0xff, 0xb0, 0x0, 0xdf, 0xfa, 0x99, - 0x99, 0x9a, 0xce, 0xff, 0xff, 0xa0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xec, - 0x94, 0x0, 0x0, 0x0, 0x0, - - /* U+0045 "E" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xdf, 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x90, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0xdf, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x86, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x93, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - - /* U+0046 "F" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, - 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9d, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0xdf, 0xfa, 0x99, 0x99, 0x99, 0x99, - 0x96, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xed, 0xa6, - 0x10, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xfe, 0xca, 0xbd, 0xff, 0xff, 0xd1, 0x0, 0xc, - 0xff, 0xfb, 0x30, 0x0, 0x0, 0x17, 0xef, 0xf6, - 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x1b, 0x70, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2a, 0xa5, 0x8f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, - 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf9, 0x2f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf9, 0xc, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x4, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, - 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf9, 0x0, 0xc, 0xff, 0xfb, 0x30, 0x0, - 0x0, 0x5, 0xdf, 0xf9, 0x0, 0x1, 0xbf, 0xff, - 0xfe, 0xba, 0xbc, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, - 0x0, 0x0, 0x0, 0x5, 0x9d, 0xff, 0xed, 0xa6, - 0x10, 0x0, - - /* U+0048 "H" */ - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3d, 0xff, 0xa9, 0x99, 0x99, 0x99, 0x99, 0x99, - 0xef, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x30, - - /* U+0049 "I" */ - 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, - 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, - 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, - 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, - 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, - 0xdf, 0xf2, - - /* U+004A "J" */ - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x19, - 0x99, 0x99, 0x99, 0xdf, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, - 0x1, 0xb1, 0x0, 0x0, 0x1, 0xff, 0xf2, 0xc, - 0xfd, 0x20, 0x0, 0xa, 0xff, 0xd0, 0xc, 0xff, - 0xfc, 0x99, 0xef, 0xff, 0x50, 0x1, 0xaf, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4, 0xad, 0xff, - 0xd9, 0x20, 0x0, - - /* U+004B "K" */ - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xf7, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xf8, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xf9, 0x0, 0xd, 0xff, 0x20, 0x0, - 0x0, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0xdf, 0xf2, - 0x0, 0x0, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0xd, - 0xff, 0x20, 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x0, - 0x0, 0xdf, 0xf2, 0x0, 0x0, 0xbf, 0xfc, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0xbf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0xaf, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, - 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf2, 0xaf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xbf, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0x35, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, 0x7, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, - 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0xd, 0xff, - 0x40, 0x0, 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, - 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xa0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x70, 0xd, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0xdf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, - - /* U+004C "L" */ - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x5d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - - /* U+004D "M" */ - 0xdf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x7d, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, 0xdf, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x7d, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, 0xdf, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0x7d, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xf7, 0xdf, 0xf9, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xff, - 0x7d, 0xff, 0x1e, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x6f, 0xf8, 0x6f, 0xf7, 0xdf, 0xf0, 0x5f, 0xfa, - 0x0, 0x0, 0x0, 0xe, 0xfe, 0x6, 0xff, 0x7d, - 0xff, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x8, 0xff, - 0x50, 0x6f, 0xf7, 0xdf, 0xf0, 0x2, 0xff, 0xd0, - 0x0, 0x2, 0xff, 0xb0, 0x6, 0xff, 0x7d, 0xff, - 0x0, 0x8, 0xff, 0x60, 0x0, 0xbf, 0xf2, 0x0, - 0x6f, 0xf7, 0xdf, 0xf0, 0x0, 0xe, 0xff, 0x10, - 0x4f, 0xf8, 0x0, 0x6, 0xff, 0x7d, 0xff, 0x0, - 0x0, 0x5f, 0xf9, 0xd, 0xfe, 0x0, 0x0, 0x6f, - 0xf7, 0xdf, 0xf0, 0x0, 0x0, 0xbf, 0xfa, 0xff, - 0x50, 0x0, 0x6, 0xff, 0x7d, 0xff, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x6f, 0xf7, - 0xdf, 0xf0, 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, - 0x0, 0x6, 0xff, 0x7d, 0xff, 0x0, 0x0, 0x0, - 0xe, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0xdf, - 0xf0, 0x0, 0x0, 0x0, 0x37, 0x0, 0x0, 0x0, - 0x6, 0xff, 0x7d, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0xdf, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0x70, - - /* U+004E "N" */ - 0xdf, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x3d, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf3, 0xdf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, - 0xff, 0xdf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xcf, - 0xf3, 0xdf, 0xf3, 0xdf, 0xfc, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x3d, 0xff, 0x22, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x5, 0xff, - 0xf7, 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, - 0x8, 0xff, 0xf4, 0x0, 0x0, 0xcf, 0xf3, 0xdf, - 0xf2, 0x0, 0xb, 0xff, 0xe2, 0x0, 0xc, 0xff, - 0x3d, 0xff, 0x20, 0x0, 0xd, 0xff, 0xd0, 0x0, - 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x2f, 0xff, - 0xa0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, - 0x4f, 0xff, 0x70, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x4c, 0xff, 0x3d, 0xff, - 0x20, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0xef, 0xf3, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x3d, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0xdf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, - - /* U+004F "O" */ - 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, - 0xd2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa3, 0x0, - 0x0, 0x2, 0x8f, 0xff, 0xe2, 0x0, 0x0, 0xaf, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xd0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0x80, 0xc, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf5, 0x5f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x98, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xfb, 0x8f, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb8, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xfb, 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0x92, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf5, 0xc, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x0, 0x4f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, - 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xd0, 0x0, 0x0, 0xcf, 0xff, 0xa3, - 0x0, 0x0, 0x2, 0x8f, 0xff, 0xe2, 0x0, 0x0, - 0x1, 0xbf, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, - 0xd2, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x9d, 0xff, 0xfd, 0xa6, 0x10, 0x0, - 0x0, 0x0, - - /* U+0050 "P" */ - 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xd9, 0x40, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x30, 0x0, 0xdf, 0xfa, 0x99, 0x99, 0x9a, 0xdf, - 0xff, 0xf4, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, - 0x3, 0xcf, 0xff, 0x10, 0xdf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x90, 0xdf, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0xdf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0xdf, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xf0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xc0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0x60, 0xdf, 0xf2, 0x0, 0x0, 0x1, - 0x49, 0xff, 0xfc, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0xdf, 0xfa, - 0x99, 0x99, 0x98, 0x63, 0x0, 0x0, 0x0, 0xdf, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xfe, 0xba, 0xbd, 0xff, - 0xff, 0xd2, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, - 0x30, 0x0, 0x0, 0x29, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, - 0xc, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xfe, 0x0, 0x1f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, - 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0x80, 0x7f, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xb0, - 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xb0, 0x8f, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, - 0x6f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0x90, 0x2f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x50, - 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0x0, 0x6, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, 0x0, - 0x0, 0xcf, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x2d, 0xff, 0xd0, 0x0, 0x0, 0x1e, 0xff, 0xf9, - 0x20, 0x0, 0x0, 0x17, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x2, 0xdf, 0xff, 0xfd, 0xa9, 0xac, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xff, 0xe6, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0x2, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0x92, 0x2, 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, - 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x13, 0x54, 0x0, 0x0, - - /* U+0052 "R" */ - 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xd9, 0x40, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x30, 0x0, 0xdf, 0xfa, 0x99, 0x99, 0x9a, 0xdf, - 0xff, 0xf4, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, - 0x3, 0xcf, 0xff, 0x10, 0xdf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x90, 0xdf, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0xdf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0xdf, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xc0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x60, 0xdf, 0xf2, 0x0, 0x0, 0x1, - 0x49, 0xff, 0xfc, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0xdf, 0xf9, - 0x88, 0x88, 0x89, 0xff, 0xd0, 0x0, 0x0, 0xdf, - 0xf2, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, - 0xdf, 0xf2, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, - 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xe1, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xfb, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x60, 0xdf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf2, - - /* U+0053 "S" */ - 0x0, 0x0, 0x38, 0xce, 0xff, 0xeb, 0x72, 0x0, - 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x20, 0x1, 0xef, 0xff, 0xc9, 0x89, 0xbe, 0xff, - 0xf4, 0x0, 0xaf, 0xfc, 0x20, 0x0, 0x0, 0x3, - 0xad, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x61, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xfd, 0x95, 0x10, 0x0, 0x0, 0x0, 0x4, 0xcf, - 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, - 0x16, 0xae, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x7c, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf5, - 0x9, 0x20, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0x35, 0xff, 0x92, 0x0, 0x0, 0x0, 0x1a, 0xff, - 0xc0, 0x7f, 0xff, 0xfe, 0xb9, 0x89, 0xcf, 0xff, - 0xf3, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc3, 0x0, 0x0, 0x3, 0x7b, 0xdf, 0xfe, 0xd9, - 0x40, 0x0, 0x0, - - /* U+0054 "T" */ - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x89, 0x99, 0x99, 0x9d, 0xff, 0xb9, - 0x99, 0x99, 0x94, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x40, 0x0, 0x0, 0x0, - - /* U+0055 "U" */ - 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xb0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xb0, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xf, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xb0, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xfb, 0xf, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xf, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xb0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xa0, 0xef, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xf9, 0xb, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x70, 0x7f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, - 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfc, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x2, - 0xaf, 0xff, 0x40, 0x0, 0xb, 0xff, 0xff, 0xca, - 0xbd, 0xff, 0xff, 0x70, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, - 0x2, 0x8c, 0xef, 0xfe, 0xa6, 0x0, 0x0, 0x0, - - /* U+0056 "V" */ - 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x20, 0x5f, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, - 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xf4, 0x0, 0x7, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, 0x0, 0x1f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x60, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x2, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, - 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xfe, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0xcf, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, - 0x0, 0x0, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x30, 0x0, 0xb, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, - 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xf2, 0x0, 0x9f, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x80, 0x1f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x7, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf7, 0xef, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0057 "W" */ - 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xa0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xf4, 0x3, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xa0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xdf, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf4, 0x0, 0x3, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x4f, 0xf7, 0xaf, 0xf3, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, - 0x0, 0xa, 0xff, 0x24, 0xff, 0x90, 0x0, 0x0, - 0x3, 0xff, 0xa0, 0x0, 0x0, 0x8f, 0xf8, 0x0, - 0x0, 0x0, 0xff, 0xc0, 0xe, 0xfe, 0x0, 0x0, - 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x3, 0xff, 0xd0, - 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x9f, 0xf4, 0x0, - 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0xd, 0xff, - 0x30, 0x0, 0xa, 0xff, 0x10, 0x4, 0xff, 0x90, - 0x0, 0x3, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x8f, - 0xf8, 0x0, 0x0, 0xff, 0xc0, 0x0, 0xe, 0xfe, - 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xd0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x9f, - 0xf4, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x30, 0xb, 0xff, 0x10, 0x0, 0x4, - 0xff, 0x90, 0x3, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xf8, 0x1, 0xff, 0xc0, 0x0, 0x0, - 0xe, 0xfe, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xd0, 0x6f, 0xf6, 0x0, 0x0, - 0x0, 0x9f, 0xf4, 0xe, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x3b, 0xff, 0x10, 0x0, - 0x0, 0x3, 0xff, 0xa4, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xfa, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xe, 0xfe, 0x9f, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, - 0x0, 0x0, 0x0, - - /* U+0058 "X" */ - 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xd0, 0x1, 0xef, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x30, 0x0, 0x5f, 0xff, 0x20, - 0x0, 0x0, 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x9, - 0xff, 0xd0, 0x0, 0x0, 0x8, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x4f, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, 0x1, - 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xe1, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfb, 0x6f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xfd, 0xcf, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0x2f, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0x70, 0x6, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfc, 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0xd, 0xff, - 0x80, 0x0, 0x0, 0x1e, 0xff, 0x50, 0x0, 0x0, - 0x3, 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x8, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, - 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xf6, - - /* U+0059 "Y" */ - 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0x30, 0x3f, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x9f, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe1, 0x0, - 0x1, 0xef, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xf6, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x60, 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x10, 0x0, 0x6, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, 0x1, - 0xef, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf4, 0x0, 0xaf, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xd0, 0x3f, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x7d, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+005A "Z" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x49, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x9d, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xc9, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x98, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+005B "[" */ - 0xdf, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf6, 0xdf, - 0xf6, 0x55, 0x2d, 0xff, 0x0, 0x0, 0xdf, 0xf0, - 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, - 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, - 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, 0xff, - 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, 0xff, 0x0, - 0x0, 0xdf, 0xf0, 0x0, 0xd, 0xff, 0x0, 0x0, - 0xdf, 0xf0, 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, - 0xf0, 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, - 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, - 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, - 0xff, 0x65, 0x52, 0xdf, 0xff, 0xff, 0x6d, 0xff, - 0xff, 0xf6, - - /* U+005C "\\" */ - 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xf3, - - /* U+005D "]" */ - 0x7f, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xfd, 0x25, - 0x56, 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, - 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, - 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd0, - 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd0, 0x0, - 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd0, 0x0, 0xf, - 0xfd, 0x0, 0x0, 0xff, 0xd0, 0x0, 0xf, 0xfd, - 0x0, 0x0, 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, - 0x0, 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, - 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, - 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd2, - 0x55, 0x6f, 0xfd, 0x7f, 0xff, 0xff, 0xd7, 0xff, - 0xff, 0xfd, - - /* U+005E "^" */ - 0x0, 0x0, 0x4, 0x87, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xff, 0x19, - 0xfa, 0x0, 0x0, 0x0, 0x9, 0xfa, 0x2, 0xff, - 0x10, 0x0, 0x0, 0xf, 0xf4, 0x0, 0xbf, 0x70, - 0x0, 0x0, 0x6f, 0xd0, 0x0, 0x5f, 0xe0, 0x0, - 0x0, 0xdf, 0x60, 0x0, 0xe, 0xf5, 0x0, 0x4, - 0xff, 0x0, 0x0, 0x8, 0xfc, 0x0, 0xb, 0xf9, - 0x0, 0x0, 0x1, 0xff, 0x20, 0x2f, 0xf2, 0x0, - 0x0, 0x0, 0xaf, 0x90, 0x8f, 0xc0, 0x0, 0x0, - 0x0, 0x4f, 0xf1, - - /* U+005F "_" */ - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - - /* U+0060 "`" */ - 0x1c, 0xff, 0xa0, 0x0, 0x0, 0x9, 0xff, 0xa0, - 0x0, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, 0x3, - 0xef, 0xb0, - - /* U+0061 "a" */ - 0x0, 0x4, 0x9d, 0xef, 0xec, 0x82, 0x0, 0x0, - 0x5e, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xc, - 0xff, 0xea, 0x88, 0x9e, 0xff, 0xf4, 0x0, 0x3e, - 0x50, 0x0, 0x0, 0xa, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, 0x0, - 0x1, 0x11, 0x19, 0xff, 0x50, 0x2, 0x9d, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x51, 0xff, 0xf8, 0x20, 0x0, - 0x0, 0x8f, 0xf5, 0x6f, 0xf9, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x57, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xbf, 0xf5, 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x50, 0xef, 0xf9, 0x31, 0x14, 0xaf, 0xff, - 0xf5, 0x3, 0xef, 0xff, 0xff, 0xff, 0xd8, 0xff, - 0x50, 0x1, 0x8c, 0xff, 0xec, 0x70, 0x6f, 0xf5, - - /* U+0062 "b" */ - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, - 0x1, 0x8c, 0xef, 0xea, 0x50, 0x0, 0x0, 0x4f, - 0xf9, 0x5f, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, - 0x4f, 0xfd, 0xff, 0xfb, 0x99, 0xcf, 0xff, 0xf2, - 0x0, 0x4f, 0xff, 0xfb, 0x10, 0x0, 0x2, 0xcf, - 0xfd, 0x0, 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x70, 0x4f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xd0, 0x4f, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xf1, 0x4f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, - 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xd0, 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x70, 0x4f, 0xff, 0xfb, 0x10, 0x0, 0x2, - 0xcf, 0xfd, 0x0, 0x4f, 0xfc, 0xff, 0xfb, 0x89, - 0xbf, 0xff, 0xf2, 0x0, 0x4f, 0xf7, 0x5f, 0xff, - 0xff, 0xff, 0xfd, 0x20, 0x0, 0x4f, 0xf7, 0x1, - 0x8c, 0xff, 0xda, 0x40, 0x0, 0x0, - - /* U+0063 "c" */ - 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc7, 0x10, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x8f, 0xff, 0xea, 0x89, 0xdf, 0xff, 0x70, - 0x5, 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xc0, - 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x46, 0x0, - 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x46, 0x0, - 0x5, 0xff, 0xf6, 0x0, 0x0, 0x5, 0xff, 0xc0, - 0x0, 0x8f, 0xff, 0xea, 0x89, 0xdf, 0xff, 0x70, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc8, 0x20, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xfb, 0x0, 0x0, 0x28, 0xdf, 0xfe, - 0xa4, 0x2, 0xff, 0xb0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xfb, 0x3f, 0xfb, 0x0, 0xaf, 0xff, 0xea, - 0x8a, 0xef, 0xfd, 0xff, 0xb0, 0x7f, 0xff, 0x70, - 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x1f, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb6, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x9f, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xbb, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xbf, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb9, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, - 0x6f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xb1, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xfb, 0x7, 0xff, 0xe4, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xb0, 0xa, 0xff, 0xfb, 0x75, 0x7b, 0xff, - 0xdf, 0xfb, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xc2, 0xff, 0xb0, 0x0, 0x2, 0x8c, 0xef, 0xea, - 0x50, 0xf, 0xfb, - - /* U+0065 "e" */ - 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xb5, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0xaf, 0xff, 0xb7, 0x79, 0xef, 0xfe, - 0x20, 0x0, 0x6f, 0xfd, 0x20, 0x0, 0x0, 0x8f, - 0xfc, 0x0, 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x9f, 0xf5, 0x5, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xb0, 0x9f, 0xf4, 0x11, 0x11, 0x11, - 0x11, 0x1c, 0xfe, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x19, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x6, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x8f, 0x40, 0x0, 0x9, - 0xff, 0xfe, 0xa8, 0x8b, 0xff, 0xfd, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, - 0x0, 0x1, 0x7b, 0xef, 0xfd, 0x94, 0x0, 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x5, 0xbe, 0xfd, 0x92, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xf6, 0x0, 0x5, 0xff, 0xf8, - 0x68, 0xc0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x36, 0x6e, 0xff, 0x66, 0x66, 0x30, 0x0, 0xd, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x0, 0x0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x0, 0x28, 0xce, 0xfe, 0xb5, 0x0, 0xcf, - 0xf0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x2c, - 0xff, 0x0, 0xbf, 0xff, 0xea, 0x89, 0xcf, 0xfe, - 0xef, 0xf0, 0x8f, 0xff, 0x60, 0x0, 0x0, 0x3d, - 0xff, 0xff, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xf6, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xaf, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfb, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xbf, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf8, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x4f, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0xdf, 0xfb, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x2, 0xff, - 0xfd, 0x62, 0x1, 0x4b, 0xff, 0xff, 0xf0, 0x4, - 0xef, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfe, 0x0, - 0x1, 0xaf, 0xff, 0xff, 0xfe, 0x50, 0xff, 0xe0, - 0x0, 0x0, 0x4, 0x67, 0x63, 0x0, 0xf, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xa0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xf5, 0x2, 0xfd, 0x50, 0x0, 0x0, 0x1, 0xaf, - 0xfe, 0x0, 0xaf, 0xff, 0xfb, 0x98, 0x9b, 0xff, - 0xff, 0x40, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x40, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfd, - 0xa6, 0x0, 0x0, - - /* U+0068 "h" */ - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf9, 0x2, 0x8d, 0xef, 0xea, 0x40, 0x0, - 0x4f, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x4f, 0xfe, 0xff, 0xea, 0x9a, 0xef, 0xff, 0x90, - 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xf2, - 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, 0xf8, - 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, - 0x4f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, - 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - - /* U+0069 "i" */ - 0x2d, 0xe7, 0xb, 0xff, 0xf0, 0x9f, 0xfe, 0x1, - 0x9a, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xf9, 0x4, 0xff, 0x90, 0x4f, 0xf9, 0x4, 0xff, - 0x90, 0x4f, 0xf9, 0x4, 0xff, 0x90, 0x4f, 0xf9, - 0x4, 0xff, 0x90, 0x4f, 0xf9, 0x4, 0xff, 0x90, - 0x4f, 0xf9, 0x4, 0xff, 0x90, 0x4f, 0xf9, 0x4, - 0xff, 0x90, 0x4f, 0xf9, 0x4, 0xff, 0x90, - - /* U+006A "j" */ - 0x0, 0x0, 0x1, 0xcf, 0x90, 0x0, 0x0, 0x8, - 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x8a, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, - 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, - 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, - 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, - 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, - 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, - 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, - 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, - 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, - 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, - 0x2, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff, 0xb0, - 0x0, 0x0, 0x8, 0xff, 0x80, 0x1e, 0x97, 0xaf, - 0xff, 0x20, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x3a, - 0xdf, 0xfb, 0x40, 0x0, - - /* U+006B "k" */ - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf4, 0x4, 0xff, 0x90, 0x0, 0x0, - 0x5, 0xff, 0xf4, 0x0, 0x4f, 0xf9, 0x0, 0x0, - 0x7, 0xff, 0xf4, 0x0, 0x4, 0xff, 0x90, 0x0, - 0x8, 0xff, 0xf4, 0x0, 0x0, 0x4f, 0xf9, 0x0, - 0x9, 0xff, 0xf3, 0x0, 0x0, 0x4, 0xff, 0x90, - 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x4f, 0xf9, - 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xbc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xd1, 0x5f, 0xff, 0x50, 0x0, 0x0, - 0x4f, 0xff, 0xc0, 0x0, 0x8f, 0xff, 0x20, 0x0, - 0x4, 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xfd, 0x0, - 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x1, 0xdf, 0xfa, - 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x2, 0xff, - 0xf7, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf4, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xe1, - - /* U+006C "l" */ - 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, - 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, - 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, - 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, - 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, - 0x4f, 0xf9, 0x4f, 0xf9, - - /* U+006D "m" */ - 0x4f, 0xf7, 0x3, 0x9d, 0xff, 0xd8, 0x20, 0x0, - 0x6, 0xbe, 0xfe, 0xc7, 0x0, 0x0, 0x4f, 0xf7, - 0x9f, 0xff, 0xff, 0xff, 0xf6, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x4f, 0xfe, 0xff, 0xc8, - 0x78, 0xef, 0xff, 0x8f, 0xff, 0xa7, 0x79, 0xff, - 0xfe, 0x10, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xd2, 0x0, 0x0, 0x1d, 0xff, 0x80, - 0x4f, 0xff, 0x60, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x4f, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf0, 0x4f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf1, 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, - - /* U+006E "n" */ - 0x4f, 0xf7, 0x3, 0x9d, 0xef, 0xea, 0x40, 0x0, - 0x4f, 0xf7, 0x9f, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x4f, 0xfe, 0xff, 0xd8, 0x77, 0xcf, 0xff, 0x90, - 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x5, 0xff, 0xf2, - 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xf8, - 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, - 0x4f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, - 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, - - /* U+006F "o" */ - 0x0, 0x0, 0x17, 0xce, 0xff, 0xc8, 0x10, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x9f, 0xff, 0xea, 0x8a, 0xef, 0xff, - 0xa0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, 0x6f, - 0xff, 0x60, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0x15, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xf6, 0x9f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xab, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xfc, 0xbf, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xc9, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x5f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0x60, 0xef, 0xf5, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x5, 0xff, - 0xf6, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x9, - 0xff, 0xfe, 0x98, 0x9d, 0xff, 0xf9, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x1, 0x7c, 0xef, 0xfc, 0x81, 0x0, 0x0, - - /* U+0070 "p" */ - 0x4f, 0xf7, 0x2, 0x8d, 0xef, 0xea, 0x50, 0x0, - 0x0, 0x4f, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0xfc, - 0x20, 0x0, 0x4f, 0xfd, 0xff, 0xe9, 0x67, 0x9f, - 0xff, 0xf2, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, - 0x1, 0xbf, 0xfd, 0x0, 0x4f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x70, 0x4f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xd0, 0x4f, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, 0x4f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, - 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xf2, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf1, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xd0, 0x4f, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x70, 0x4f, 0xff, 0xfb, 0x10, - 0x0, 0x2, 0xdf, 0xfd, 0x0, 0x4f, 0xfd, 0xff, - 0xfb, 0x89, 0xbf, 0xff, 0xf2, 0x0, 0x4f, 0xf9, - 0x5e, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x4f, - 0xf9, 0x1, 0x8c, 0xef, 0xda, 0x40, 0x0, 0x0, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xa4, 0x0, 0xff, - 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfb, 0x1f, - 0xfb, 0x0, 0xaf, 0xff, 0xea, 0x8a, 0xef, 0xfc, - 0xff, 0xb0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x6f, - 0xff, 0xfb, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xb6, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfb, 0x9f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xbb, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xfb, 0xbf, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xb9, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xfb, 0x6f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xb1, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, 0x7, 0xff, - 0xf6, 0x0, 0x0, 0x6, 0xff, 0xff, 0xb0, 0xa, - 0xff, 0xfe, 0x98, 0x9d, 0xff, 0xdf, 0xfb, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xb0, - 0x0, 0x2, 0x8c, 0xef, 0xea, 0x40, 0x2f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xfb, - - /* U+0072 "r" */ - 0x4f, 0xf7, 0x2, 0x8d, 0xe4, 0x4f, 0xf7, 0x6f, - 0xff, 0xf4, 0x4f, 0xfc, 0xff, 0xfd, 0xc3, 0x4f, - 0xff, 0xfb, 0x20, 0x0, 0x4f, 0xff, 0xa0, 0x0, - 0x0, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x4f, 0xfc, - 0x0, 0x0, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, - 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x4f, - 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, - 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xf9, - 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb7, 0x20, 0x0, - 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2, - 0xff, 0xfd, 0x97, 0x79, 0xdf, 0xf1, 0x0, 0x9f, - 0xf9, 0x0, 0x0, 0x0, 0x35, 0x0, 0xb, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x63, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xc9, 0x40, 0x0, 0x0, 0x3, 0xae, 0xff, - 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x1, 0x47, - 0xbf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf1, 0x6, 0xc4, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x0, 0xef, 0xfe, 0xa8, 0x78, 0xbf, 0xff, - 0x80, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x1, 0x7b, 0xdf, 0xfe, 0xc9, 0x30, 0x0, - - /* U+0074 "t" */ - 0x0, 0x6, 0x88, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x36, 0x6e, 0xff, 0x66, - 0x66, 0x30, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xfa, 0x79, 0xe1, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x6, 0xcf, 0xfd, 0x81, - - /* U+0075 "u" */ - 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, - 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, - 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, - 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, - 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, - 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, - 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, - 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, - 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, - 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, - 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf8, - 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf8, - 0xc, 0xff, 0xa0, 0x0, 0x0, 0x2d, 0xff, 0xf8, - 0x3, 0xff, 0xfe, 0x86, 0x7a, 0xff, 0xef, 0xf8, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xfc, 0x4f, 0xf8, - 0x0, 0x1, 0x8c, 0xff, 0xeb, 0x50, 0x3f, 0xf8, - - /* U+0076 "v" */ - 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf9, 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf2, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xb0, 0x0, 0x8f, 0xf6, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x40, 0x0, 0x1f, 0xfd, 0x0, - 0x0, 0x0, 0xe, 0xfd, 0x0, 0x0, 0xa, 0xff, - 0x40, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x3, - 0xff, 0xb0, 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x0, - 0x0, 0xcf, 0xf2, 0x0, 0x4, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x5f, 0xf8, 0x0, 0xb, 0xff, 0x10, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x2f, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, 0x9f, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd1, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfb, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0x0, - - /* U+0077 "w" */ - 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x94, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x5f, 0xf3, 0xe, 0xfc, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xfd, - 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x1, 0xff, 0x70, 0x2, 0xff, - 0x80, 0x0, 0x0, 0x5f, 0xf8, 0xff, 0x60, 0x0, - 0x0, 0x7f, 0xf2, 0x0, 0xc, 0xfe, 0x0, 0x0, - 0xb, 0xfd, 0xd, 0xfc, 0x0, 0x0, 0xd, 0xfb, - 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x2, 0xff, 0x70, - 0x8f, 0xf2, 0x0, 0x3, 0xff, 0x60, 0x0, 0x1, - 0xff, 0xa0, 0x0, 0x8f, 0xf1, 0x2, 0xff, 0x80, - 0x0, 0x9f, 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, - 0xd, 0xfb, 0x0, 0xb, 0xfe, 0x0, 0xe, 0xfa, - 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x4, 0xff, 0x50, - 0x0, 0x5f, 0xf4, 0x5, 0xff, 0x40, 0x0, 0x0, - 0x0, 0xef, 0xb0, 0xaf, 0xe0, 0x0, 0x0, 0xff, - 0x90, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x2f, 0xf9, 0x0, 0x0, 0x9, 0xff, 0x1f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0xff, 0x20, - 0x0, 0x0, 0x3f, 0xfc, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, - - /* U+0078 "x" */ - 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0xbf, 0xf6, - 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x7f, 0xfa, - 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x3f, 0xfd, - 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x1e, 0xff, - 0x20, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0xb, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xfc, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xfe, 0x10, 0x8f, 0xfa, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x40, 0x0, 0xbf, 0xf6, 0x0, 0x0, 0xa, - 0xff, 0x80, 0x0, 0x1, 0xef, 0xf3, 0x0, 0x6, - 0xff, 0xc0, 0x0, 0x0, 0x4, 0xff, 0xe1, 0x3, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, - - /* U+0079 "y" */ - 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf9, 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf2, 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xb0, 0x0, 0x8f, 0xf7, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x40, 0x0, 0x1f, 0xfd, 0x0, - 0x0, 0x0, 0xe, 0xfd, 0x0, 0x0, 0xa, 0xff, - 0x50, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x3, - 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, - 0x0, 0xcf, 0xf2, 0x0, 0x3, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x5f, 0xf9, 0x0, 0xa, 0xff, 0x10, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x1f, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x70, 0x8f, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, - 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfb, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x4, 0x0, 0x0, 0x6f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xe9, 0x7a, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xfd, - 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x36, 0x66, - 0x66, 0x66, 0x6c, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0x75, 0x55, 0x55, - 0x55, 0x52, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+007B "{" */ - 0x0, 0x0, 0x19, 0xef, 0xf0, 0x0, 0x1e, 0xff, - 0xff, 0x0, 0x9, 0xff, 0xe7, 0x50, 0x0, 0xcf, - 0xf4, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, - 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, - 0x0, 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, - 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, - 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x4f, - 0xfd, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x4f, - 0xff, 0xc2, 0x0, 0x1, 0x6a, 0xff, 0xc0, 0x0, - 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xef, 0xf0, - 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0xef, - 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, - 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, - 0x0, 0xef, 0xf0, 0x0, 0x0, 0xd, 0xff, 0x30, - 0x0, 0x0, 0x9f, 0xfe, 0x75, 0x0, 0x2, 0xef, - 0xff, 0xf0, 0x0, 0x2, 0xae, 0xff, - - /* U+007C "|" */ - 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, - 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, - 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, - 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, - 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, - 0xdd, 0xfd, - - /* U+007D "}" */ - 0x7f, 0xfc, 0x60, 0x0, 0x7, 0xff, 0xff, 0x90, - 0x0, 0x26, 0xaf, 0xff, 0x20, 0x0, 0x0, 0xbf, - 0xf5, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, - 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, - 0x0, 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, - 0x0, 0x0, 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, - 0x70, 0x0, 0x0, 0x6f, 0xf7, 0x0, 0x0, 0x4, - 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, - 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x3f, 0xfe, 0x74, - 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xf7, - 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, 0x7f, - 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, - 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, - 0x0, 0x7f, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x60, - 0x2, 0x6a, 0xff, 0xf2, 0x0, 0x7f, 0xff, 0xf9, - 0x0, 0x7, 0xff, 0xc6, 0x0, 0x0, - - /* U+007E "~" */ - 0x0, 0x4c, 0xfe, 0x80, 0x0, 0x0, 0x3f, 0xa0, - 0x4f, 0xff, 0xff, 0xd2, 0x0, 0x7, 0xf8, 0xd, - 0xfc, 0x46, 0xef, 0xf6, 0x4, 0xef, 0x41, 0xff, - 0x0, 0x1, 0xaf, 0xff, 0xff, 0xb0, 0x3f, 0xb0, - 0x0, 0x0, 0x5c, 0xfe, 0x90, 0x0, - - /* U+00B0 "°" */ - 0x0, 0x3, 0x78, 0x61, 0x0, 0x0, 0x1b, 0xff, - 0xff, 0xf6, 0x0, 0xb, 0xf8, 0x20, 0x4d, 0xf5, - 0x4, 0xf8, 0x0, 0x0, 0x1e, 0xd0, 0x9f, 0x20, - 0x0, 0x0, 0x9f, 0x29, 0xf1, 0x0, 0x0, 0x8, - 0xf2, 0x7f, 0x50, 0x0, 0x0, 0xcf, 0x1, 0xfe, - 0x20, 0x0, 0x8f, 0x90, 0x4, 0xff, 0xca, 0xef, - 0xc0, 0x0, 0x2, 0xae, 0xfd, 0x70, 0x0, - - /* U+2022 "•" */ - 0x0, 0x26, 0x40, 0x0, 0x5f, 0xff, 0xb0, 0xd, - 0xff, 0xff, 0x40, 0xff, 0xff, 0xf5, 0xa, 0xff, - 0xff, 0x10, 0x1a, 0xfd, 0x40, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x6b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x72, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, - 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, 0x0, - 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x35, 0x53, 0xef, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x7, 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x16, 0x99, - 0x8c, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x3, 0xae, 0xff, - 0xfc, 0x60, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xac, 0xdc, 0x94, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F008 "" */ - 0x26, 0x0, 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x62, 0xee, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0xee, 0xff, 0xba, - 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xea, 0xaa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 0x48, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xb4, 0x44, 0xff, 0xfe, 0x0, 0x3, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, - 0x0, 0xef, 0xfe, 0x0, 0x3, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, - 0xef, 0xff, 0x10, 0x5, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xee, 0xef, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfe, 0xee, 0xff, 0xfe, 0x0, - 0x4, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xad, 0xff, 0x90, 0x0, 0xef, 0xfe, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0xef, 0xfe, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0xef, 0xff, 0x76, 0x6a, 0xff, 0xc2, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x28, 0xff, 0xc6, - 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x98, 0x8b, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xd8, 0x88, 0xff, - 0xfe, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0xef, 0xfe, - 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x80, 0x0, 0xef, 0xfe, 0x0, - 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0x80, 0x0, 0xef, 0xff, 0xcc, 0xce, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xfc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x32, 0x27, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, - 0x22, 0xff, 0x9d, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xd9, - - /* U+F00B "" */ - 0x26, 0x77, 0x77, 0x76, 0x0, 0x4, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x62, 0xef, - 0xff, 0xff, 0xff, 0x90, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0x50, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0x90, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x27, - 0x88, 0x88, 0x87, 0x10, 0x5, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x72, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x88, 0x88, - 0x87, 0x10, 0x6, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x83, 0xef, 0xff, 0xff, 0xff, - 0xa0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xfe, 0x40, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x6e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x6, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xa3, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F00D "" */ - 0x0, 0x67, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x38, 0x30, 0x0, 0xbf, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x50, 0x9f, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x3f, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xf9, 0xbf, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0x51, 0xcf, 0xff, 0xff, - 0xfd, 0x10, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x1, - 0xcf, 0xff, 0xff, 0xfd, 0x7f, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0x71, 0xcf, 0xff, 0xff, 0xfd, 0x10, - 0x5f, 0xff, 0xff, 0xff, 0x70, 0x1, 0xcf, 0xff, - 0xff, 0xfd, 0x1e, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xf8, 0xdf, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x73, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xc0, 0x4, 0xef, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xbf, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x26, 0x10, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, - 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xc0, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x5, 0xff, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, - 0x0, 0x2f, 0xff, 0xf9, 0x0, 0xd, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfa, 0x0, - 0x2f, 0xff, 0xf9, 0x0, 0x3f, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf4, 0x0, 0x2f, - 0xff, 0xf9, 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0x40, 0x0, 0x2f, 0xff, - 0xf9, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x10, 0x2, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xf9, - 0x0, 0x0, 0xd, 0xff, 0xff, 0x90, 0x8, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x2f, 0xff, 0xf9, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xf1, 0xe, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf5, 0x2f, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf9, 0x5f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xfc, 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfe, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0x6f, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x6, 0xbb, 0xa1, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x3f, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xfb, 0xf, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf7, 0xa, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xf2, 0x4, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xb0, 0x0, 0xcf, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0x30, 0x0, 0x2f, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, - 0x0, 0x17, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xeb, 0x99, 0xad, - 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5a, 0xef, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xcc, 0xb8, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x1, - 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x12, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x70, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7, 0xff, 0x30, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc5, 0x11, 0x5c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x3, 0xdf, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xfd, 0x30, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x5e, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xe5, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x99, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x8, 0xff, 0xe7, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x7e, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x99, 0x10, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x32, 0x0, 0x0, 0x0, 0x34, 0x44, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3d, 0xff, 0xb1, 0x0, 0x1, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xfd, 0x20, 0x1, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf4, 0x1, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xdf, 0xff, 0xfc, 0x24, 0xef, 0xff, - 0xfb, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xa0, 0x0, 0x2d, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xf7, 0x0, 0x75, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x50, 0x1b, - 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xe3, 0x2, - 0xdf, 0xff, 0xfb, 0x0, 0x5f, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xfc, 0x10, - 0x4f, 0xff, 0xff, 0xff, 0xd2, 0x3, 0xef, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x1c, - 0xff, 0xff, 0xd2, 0x0, 0x8, 0xff, 0xff, 0xf7, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0xaf, 0xff, 0xff, 0x40, 0xaf, 0xff, 0xff, - 0x40, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x7, 0xff, 0xff, 0xf6, 0xcf, 0xff, - 0xd2, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x10, 0x5f, 0xff, 0xf8, 0x2e, - 0xfb, 0x10, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd2, 0x3, 0xef, 0xc0, - 0x3, 0x70, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x18, - 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xa7, 0x77, 0x7d, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xcd, - 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdc, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x26, 0x77, 0x77, 0x77, 0x77, - 0x10, 0x4f, 0xff, 0xf5, 0x1, 0x77, 0x77, 0x77, - 0x77, 0x62, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd2, - 0x4, 0xff, 0x40, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x22, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, - 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x8f, 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, - 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x5a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xa5, - - /* U+F01C "" */ - 0x0, 0x0, 0x0, 0x2, 0x9b, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xb8, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe1, 0x0, - 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, - 0x0, 0x9, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x50, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xe1, 0xcf, 0xff, 0xd4, 0x44, 0x44, - 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, - 0x44, 0x4f, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x88, 0x88, - 0x88, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x31, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x26, 0xab, 0xdd, 0xb8, - 0x40, 0x0, 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x92, 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0xff, 0xff, 0x0, 0x0, 0x4, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x30, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xb8, 0x66, 0x8c, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0x81, - 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xd, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x9f, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x1, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x22, 0x10, 0xd, 0xff, 0xff, 0xff, 0x8, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x2e, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x22, 0x10, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xec, 0xcd, - 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0x50, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, - 0x0, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, - 0x0, 0x1, 0xaf, 0xff, 0xff, 0x90, 0x0, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xfa, 0x51, 0x0, 0x14, - 0x9f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x1, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x1, - 0x6b, 0xff, 0xff, 0xff, 0xd9, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x2, 0x43, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 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, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x44, 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6d, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x9, 0xc4, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x2, 0xff, 0xf4, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xb, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xa, 0xff, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x4f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x5, 0xff, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, 0xef, - 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x1, 0xef, 0xfb, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfd, 0x10, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x36, 0x0, 0x0, 0x44, 0x44, 0x44, 0x7f, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6d, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x28, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x4, - 0x92, 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xf0, 0x0, 0x0, - 0xf, 0xff, 0x50, 0x0, 0xdf, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xc, 0xff, 0xf5, 0x0, 0x3f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x9, 0xff, - 0x70, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xc0, 0x2, - 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0xad, 0x40, 0x0, 0xef, 0xf4, - 0x0, 0xcf, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x2, 0xff, 0xf5, 0x0, 0x6f, - 0xf9, 0x0, 0x7f, 0xf6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x0, - 0xf, 0xfe, 0x0, 0x4f, 0xf9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xa, 0xff, - 0x60, 0xc, 0xff, 0x0, 0x2f, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4, - 0xff, 0x80, 0xb, 0xff, 0x10, 0x1f, 0xfb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x6, 0xff, 0x70, 0xc, 0xff, 0x10, 0x2f, 0xfb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x3e, 0xff, 0x30, 0xe, 0xff, 0x0, 0x3f, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x1, 0xff, 0xfb, 0x0, 0x3f, 0xfc, 0x0, - 0x6f, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x1, 0xff, 0xc1, 0x0, 0xaf, 0xf7, - 0x0, 0xaf, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x35, 0x0, 0x4, 0xff, - 0xf1, 0x0, 0xef, 0xf0, 0x4, 0x44, 0x44, 0x47, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x70, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x6, - 0xff, 0xfc, 0x0, 0xd, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0xf, 0xff, 0xc1, 0x0, 0x8f, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0xc, 0xf9, 0x0, 0x4, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x3f, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5c, 0x60, 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0x0, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x54, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x2, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x1c, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xc, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, - 0xff, 0xf9, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xbe, 0xff, 0xd0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xcf, - 0xff, 0x10, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x87, 0xff, 0xf8, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x2f, 0xff, 0xf4, 0x2, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x9f, - 0xff, 0xf4, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, - 0x50, 0x1, 0xef, 0xff, 0xfb, 0x41, 0xc, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9a, - 0xba, 0x83, 0x0, 0x0, 0x0, 0x0, - - /* U+F048 "" */ - 0x4, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x10, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xf2, 0x4f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf7, 0x4f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, - 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xf0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xf0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xf0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xf0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf6, 0x2e, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfa, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x30, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x20, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xba, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x0, 0x34, 0x44, 0x44, 0x41, 0x0, 0x0, 0x0, - 0x3, 0x44, 0x44, 0x44, 0x10, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0x50, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x29, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x9, - 0xef, 0xff, 0xff, 0xeb, 0x20, 0x0, 0x0, 0x9e, - 0xff, 0xff, 0xfe, 0xb2, 0x0, - - /* U+F04D "" */ - 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x10, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x9, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xb2, 0x0, - - /* U+F051 "" */ - 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x44, 0x40, 0x2e, 0xfd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf4, 0x6f, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, - 0x7f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0xe, 0xff, 0xf4, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xe, - 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xe, 0xff, 0xf4, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf4, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, - 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0xe, 0xff, 0xf4, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0xe, 0xff, 0xf4, - 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xe, - 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, - 0x7f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf4, 0x6f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf4, 0xa, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x6a, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x20, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x4, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x70, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x27, 0x10, 0x0, - - /* U+F054 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x56, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x11, 0x11, 0x11, 0x11, 0xbf, 0xff, 0xff, 0x11, - 0x11, 0x11, 0x11, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, - 0x17, 0x99, 0x99, 0x99, 0x99, 0xdf, 0xff, 0xff, - 0x99, 0x99, 0x99, 0x99, 0x82, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xde, 0xc3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F068 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x17, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x82, 0x0, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x89, - 0xaa, 0x87, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xfd, 0x84, 0x23, 0x49, 0xef, 0xff, 0xff, - 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x5, 0xdd, 0x93, - 0x0, 0x6, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x80, 0x0, 0xcf, 0xff, 0xff, 0xf6, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xf6, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0x30, 0x1f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0x10, 0xf, 0xff, 0xff, - 0xff, 0xc0, 0xaf, 0xff, 0xff, 0xff, 0x80, 0x5, - 0x44, 0x9f, 0xff, 0xff, 0xff, 0x50, 0xc, 0xff, - 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0x70, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xb, - 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, - 0x80, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0xc, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, - 0xff, 0xa0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0xe, 0xff, 0xff, 0xff, 0xe1, 0x9, 0xff, - 0xff, 0xff, 0xe0, 0x1, 0xef, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x60, 0x0, - 0xdf, 0xff, 0xff, 0xf5, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x9f, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xfd, 0x0, 0x3, 0xdf, - 0xff, 0xfb, 0x10, 0x3, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x2, 0x55, 0x10, 0x0, 0x1e, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf8, 0x20, 0x0, 0x3, 0xaf, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xdf, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, - 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x7a, 0xde, 0xff, 0xec, - 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x3, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x4, 0x79, 0xa9, 0x87, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xb1, 0x2, 0x8c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xfd, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x94, 0x23, 0x59, - 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xe3, 0x6, 0xdc, - 0x92, 0x0, 0x9, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0x54, 0xff, 0xff, 0x60, 0x0, 0xef, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6, 0xf5, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xf5, - 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x2f, 0xff, 0x90, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x10, 0x0, - 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0xe, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0x40, - 0xf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xcf, 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, - 0xfe, 0xde, 0xc1, 0x0, 0x0, 0x2d, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x17, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xff, - 0xec, 0x80, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4a, 0x20, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xdf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x11, 0x11, - 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdc, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb5, 0x6d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x81, 0x2a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x7c, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xc5, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf6, 0x0, 0x8a, 0xaa, 0xaa, 0xa7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xaa, 0xdf, - 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xf5, 0x2, 0xef, 0xff, - 0xff, 0x40, 0x8f, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0x70, 0x1e, 0xff, 0xff, 0xf4, - 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xe8, 0x1, 0xdf, 0xff, 0xff, 0x50, 0x0, - 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x1d, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1a, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0x90, 0x1a, 0x10, 0x0, 0x5f, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfa, 0x0, - 0xcf, 0xd1, 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xb0, 0xb, 0xff, - 0xfc, 0x0, 0x8f, 0xff, 0xf6, 0x0, 0x8a, 0xaa, - 0xab, 0xff, 0xff, 0xfb, 0x0, 0x5f, 0xff, 0xff, - 0xca, 0xdf, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0xef, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1a, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xde, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xa6, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0x0, 0x6f, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xa0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0x30, 0x1d, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xf3, 0x9f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xfd, 0x6f, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xfa, 0x8, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, - 0x0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x46, 0x0, - - /* U+F078 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xde, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xce, 0x40, 0x1e, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf4, 0x9f, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xf9, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x7f, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf3, 0x0, 0x1d, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0x31, 0xdf, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xfd, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x2a, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0x90, 0x0, 0x5, 0xab, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb5, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xf9, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0x90, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x3f, 0xff, 0xfe, 0xff, 0xfe, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, 0xe4, - 0xff, 0xf9, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, - 0x3f, 0xfe, 0x22, 0xff, 0xf9, 0xa, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0x10, 0x0, 0x0, 0x3, 0x82, 0x2, 0xff, 0xf9, - 0x0, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x11, 0x0, 0xaf, 0xff, 0x10, - 0x2, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x40, - 0xaf, 0xff, 0x10, 0xcf, 0xb0, 0x0, 0x0, 0x2, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf3, 0xaf, 0xff, 0x1c, 0xff, 0xf7, - 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xdf, 0xff, - 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb5, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x2e, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x2, 0x68, 0x88, 0x88, 0x88, 0x88, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xca, 0x50, 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, - 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 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, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xec, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, - 0x33, 0x3e, 0xff, 0xff, 0xff, 0xa3, 0x33, 0x32, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x26, 0x77, 0x77, 0x77, 0x72, - 0xe, 0xff, 0xff, 0xff, 0x90, 0x27, 0x77, 0x77, - 0x77, 0x62, 0xdf, 0xff, 0xff, 0xff, 0xf7, 0xb, - 0xff, 0xff, 0xff, 0x60, 0x7f, 0xff, 0xff, 0xff, - 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x45, - 0x55, 0x53, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, - 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x8f, 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, - 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x5a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xa5, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xc8, 0x51, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xfd, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x7d, 0xd1, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x29, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5, 0xbf, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x5e, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x73, 0xbf, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0xb6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0xba, 0x98, 0x52, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x0, 0x2, 0x79, 0x83, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x8a, 0x83, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xf2, 0xcf, 0xff, - 0xa3, 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xf5, 0xf, 0xff, 0xe0, 0x0, 0xaf, - 0xff, 0x20, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0xff, 0xfd, 0x0, 0x9, 0xff, 0xf3, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xd, 0xff, - 0xf5, 0x2, 0xff, 0xff, 0x10, 0x7, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0xff, - 0xff, 0xf2, 0x7, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe8, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xde, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x27, 0x9b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xb, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0xc, 0xff, 0xfa, 0x37, 0xff, 0xff, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, 0xfe, - 0x0, 0xa, 0xff, 0xf2, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0xf, 0xff, 0xd0, 0x0, 0x9f, - 0xff, 0x30, 0x0, 0xb, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0xdf, 0xff, 0x50, 0x2f, 0xff, 0xf1, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xe2, 0x7, 0xff, - 0xff, 0xef, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xe1, 0xd, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xfd, 0x10, 0x2d, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xce, 0xd8, 0x0, 0x0, - 0x7, 0xbd, 0xc8, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x8, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x8f, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x8, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x8f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x8, 0xff, 0xff, - 0xd0, 0x16, 0x66, 0x64, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x59, 0x99, 0x99, 0xd, 0xff, - 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xdd, - 0xdd, 0x1f, 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, - 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xa0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, - 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xfa, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x1f, 0xff, 0xff, 0xa0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, - 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0xff, 0xff, 0xfa, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1f, 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, - 0xfa, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xa0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, - 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xfc, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0xf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xe6, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x40, 0x0, - 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x3, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x96, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xff, 0xfe, - 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x7f, - 0xff, 0xfd, 0x10, 0xf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfd, - 0x10, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfc, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf6, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x9, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc3, 0x0, - - /* U+F0C9 "" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x24, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x20, - - /* U+F0E0 "" */ - 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, 0x2d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0xc3, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x5f, 0xff, - 0x70, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x9, 0xff, 0xff, 0xfb, - 0x10, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe3, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xe4, - 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x10, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x1a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x2d, 0xff, 0xff, 0xff, 0xd2, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x9f, 0xff, 0xf9, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x3, - 0x99, 0x30, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, - 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 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, 0xfe, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, - - /* U+F0E7 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xaa, 0xaa, 0xaa, 0x92, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x6, 0xcd, 0xdd, 0xdd, 0xdf, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x0, 0x0, 0x13, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xbf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x15, 0x66, 0x66, 0xcf, 0xff, - 0xff, 0xb6, 0x66, 0x65, 0x10, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xf8, 0x29, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, - 0x29, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x54, 0x44, 0x44, 0x44, 0x30, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xfb, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xe0, 0x8b, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x80, 0x6f, 0xff, 0xff, 0xff, 0xfe, 0x8, 0xfc, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x8f, 0xfc, 0x0, 0xf, - 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, - 0xfe, 0x8, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, - 0xf8, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x8f, - 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0x80, 0x7f, - 0xff, 0xff, 0xff, 0xfe, 0x5, 0xaa, 0xaa, 0xa0, - 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x82, - 0x22, 0x22, 0x20, 0xff, 0xff, 0xff, 0xf8, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1f, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, - 0xff, 0xf8, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0x80, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, - 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xf8, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x11, 0x55, 0x55, 0x55, 0x20, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, 0xa3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xab, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, - 0x30, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfd, 0x10, 0x1d, - 0xf5, 0x0, 0x1f, 0xf2, 0x0, 0x4f, 0xe1, 0x1, - 0xef, 0x40, 0x2, 0xff, 0xfc, 0xff, 0xfc, 0x0, - 0xb, 0xf2, 0x0, 0xe, 0xf0, 0x0, 0x1f, 0xc0, - 0x0, 0xcf, 0x10, 0x0, 0xff, 0xfc, 0xff, 0xfc, - 0x0, 0xb, 0xf2, 0x0, 0xe, 0xf0, 0x0, 0x1f, - 0xc0, 0x0, 0xcf, 0x10, 0x0, 0xff, 0xfc, 0xff, - 0xfd, 0x0, 0xd, 0xf4, 0x0, 0x1f, 0xf2, 0x0, - 0x3f, 0xe0, 0x0, 0xef, 0x30, 0x2, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xff, 0xfe, - 0xef, 0xff, 0xee, 0xef, 0xff, 0xee, 0xef, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xdf, - 0x20, 0x1, 0xff, 0x0, 0x6, 0xf6, 0x0, 0xd, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x90, 0x0, - 0xcf, 0x10, 0x0, 0xff, 0x0, 0x5, 0xf5, 0x0, - 0xd, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x90, - 0x0, 0xcf, 0x10, 0x0, 0xff, 0x0, 0x5, 0xf5, - 0x0, 0xd, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xb2, 0x23, 0xef, 0x52, 0x24, 0xff, 0x32, 0x29, - 0xf9, 0x22, 0x3e, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xbb, 0xbf, 0xfd, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbc, 0xff, 0xdb, 0xbd, 0xff, 0xfc, - 0xff, 0xfc, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, 0x0, 0xff, - 0xfc, 0xff, 0xfc, 0x0, 0xb, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x10, 0x0, - 0xff, 0xfc, 0xff, 0xfc, 0x0, 0xb, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, - 0x0, 0xff, 0xfc, 0xff, 0xff, 0xcc, 0xcf, 0xfd, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, - 0xdc, 0xcd, 0xff, 0xfc, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x59, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xaa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F15B "" */ - 0x26, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x6, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0xfd, 0x10, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf, 0xfd, - 0x10, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0xff, 0xfd, 0x10, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xfd, - 0x10, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0xff, 0xff, 0xfd, 0x10, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xfd, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xa9, 0x0, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x45, 0x65, 0x43, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x92, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xb8, 0x65, 0x55, 0x67, 0x9c, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7f, 0xff, - 0xff, 0xff, 0xb1, 0xff, 0xff, 0xff, 0xd4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x9f, 0xff, 0xff, 0xf7, 0x6f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, - 0xc1, 0x6, 0xff, 0x60, 0x0, 0x0, 0x0, 0x3, - 0x8b, 0xdf, 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, - 0x0, 0x1c, 0xfc, 0x10, 0x0, 0x43, 0x0, 0x0, - 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x40, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xec, 0xbc, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, 0x61, - 0x0, 0x0, 0x0, 0x48, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0x98, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0xdc, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xcd, 0xff, 0xfa, - 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xff, - 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xfa, 0xff, - 0xfc, 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x0, 0xff, - 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F241 "" */ - 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xfa, 0xff, 0xfc, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, - 0xff, 0xfc, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xfa, 0xff, 0xfc, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, - 0xfc, 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x40, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F242 "" */ - 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, - 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, - 0xfc, 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F243 "" */ - 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x6, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, - 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, - 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, - 0xfc, 0x3, 0x88, 0x88, 0x88, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F244 "" */ - 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7c, 0xc5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xac, 0xcf, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xa5, 0x5e, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, - 0x3, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xf3, 0x0, 0x0, 0x15, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x30, - 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xdf, 0xff, 0x70, 0x0, 0x0, 0xef, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf8, 0x0, - 0x7, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xfc, 0x30, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0x32, 0x5f, 0xf7, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x2b, 0xff, 0xf9, - 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xaf, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1c, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf7, 0x0, 0x2e, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x2, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xfa, 0x10, 0x0, 0x2, 0xbf, 0xfc, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xfa, 0x0, 0xf, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0x60, 0xf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xef, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x2f, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x33, 0x33, 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x9d, 0xff, 0xff, 0xfd, 0x93, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xf9, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xf7, 0x2e, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xf7, 0x2, 0xef, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0x20, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x3, 0xff, 0xff, 0xff, 0x80, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, 0x20, - 0x4f, 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, 0xa7, - 0xff, 0xf7, 0x2, 0xe2, 0x5, 0xff, 0xff, 0xf0, - 0xa, 0xff, 0xfc, 0x0, 0x6f, 0xf7, 0x1, 0xfe, - 0x20, 0x5f, 0xff, 0xf3, 0xc, 0xff, 0xff, 0x70, - 0x6, 0xf7, 0x1, 0xfc, 0x0, 0x8f, 0xff, 0xf6, - 0xe, 0xff, 0xff, 0xf7, 0x0, 0x67, 0x1, 0xc0, - 0x7, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf8, - 0xf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xf9, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfa, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf9, - 0xf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xf9, 0xe, 0xff, 0xff, 0xf8, - 0x0, 0x47, 0x1, 0xa0, 0x6, 0xff, 0xff, 0xf7, - 0xc, 0xff, 0xff, 0x80, 0x4, 0xf7, 0x1, 0xfa, - 0x0, 0x7f, 0xff, 0xf6, 0xa, 0xff, 0xfc, 0x0, - 0x4f, 0xf8, 0x1, 0xfe, 0x20, 0x2e, 0xff, 0xf4, - 0x7, 0xff, 0xff, 0x95, 0xff, 0xf8, 0x2, 0xe3, - 0x2, 0xef, 0xff, 0xf1, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x1, 0x30, 0x2e, 0xff, 0xff, 0xd0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2, - 0xef, 0xff, 0xff, 0x80, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x20, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xf9, 0x3, 0xef, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xf9, 0x3e, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xfc, 0xef, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x58, 0xbc, 0xdd, 0xca, - 0x61, 0x0, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0x77, 0x77, - 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x69, 0x99, 0x99, 0x99, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa9, 0x99, 0x99, 0x98, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0x40, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x2, 0xff, 0xff, 0xb0, 0xbf, 0xff, - 0x62, 0xff, 0xfe, 0x18, 0xff, 0xff, 0x60, 0x0, - 0x2f, 0xff, 0xf9, 0x9, 0xff, 0xf3, 0xf, 0xff, - 0xd0, 0x5f, 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, - 0x90, 0x9f, 0xff, 0x30, 0xff, 0xfd, 0x5, 0xff, - 0xff, 0x60, 0x0, 0x2f, 0xff, 0xf9, 0x9, 0xff, - 0xf3, 0xf, 0xff, 0xd0, 0x5f, 0xff, 0xf6, 0x0, - 0x2, 0xff, 0xff, 0x90, 0x9f, 0xff, 0x30, 0xff, - 0xfd, 0x5, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, - 0xf9, 0x9, 0xff, 0xf3, 0xf, 0xff, 0xd0, 0x5f, - 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, 0x90, 0x9f, - 0xff, 0x30, 0xff, 0xfd, 0x5, 0xff, 0xff, 0x60, - 0x0, 0x2f, 0xff, 0xf9, 0x9, 0xff, 0xf3, 0xf, - 0xff, 0xd0, 0x5f, 0xff, 0xf6, 0x0, 0x2, 0xff, - 0xff, 0x90, 0x9f, 0xff, 0x30, 0xff, 0xfd, 0x5, - 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xf9, 0x9, - 0xff, 0xf3, 0xf, 0xff, 0xd0, 0x5f, 0xff, 0xf6, - 0x0, 0x2, 0xff, 0xff, 0x90, 0x9f, 0xff, 0x30, - 0xff, 0xfd, 0x5, 0xff, 0xff, 0x60, 0x0, 0x2f, - 0xff, 0xf9, 0x9, 0xff, 0xf3, 0xf, 0xff, 0xd0, - 0x5f, 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, 0x90, - 0x9f, 0xff, 0x30, 0xff, 0xfd, 0x5, 0xff, 0xff, - 0x60, 0x0, 0x2f, 0xff, 0xf9, 0x9, 0xff, 0xf3, - 0xf, 0xff, 0xd0, 0x5f, 0xff, 0xf6, 0x0, 0x2, - 0xff, 0xff, 0xb0, 0xbf, 0xff, 0x62, 0xff, 0xfe, - 0x18, 0xff, 0xff, 0x60, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x7, 0xbc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, - 0x81, 0x0, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x50, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x2e, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x2e, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x50, 0x2e, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x50, 0x2e, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x2e, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xba, 0x86, 0x43, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x87, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4e, 0xff, 0xff, 0xfe, 0x48, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x2, 0xef, 0xff, 0xe3, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2e, - 0xfe, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x2, 0xd3, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x50, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x9, - 0xf9, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x9, 0xff, 0xff, 0xf9, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcf, - 0xff, 0xff, 0xff, 0xce, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe9, 0x0, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3, - 0xff, 0xdb, 0xbf, 0xfb, 0xbb, 0xff, 0xbb, 0xbf, - 0xff, 0xa0, 0x3, 0xff, 0xf9, 0x0, 0xcf, 0x10, - 0xf, 0xf0, 0x1, 0xff, 0xfa, 0x4, 0xff, 0xff, - 0x90, 0xc, 0xf1, 0x0, 0xff, 0x0, 0x1f, 0xff, - 0xa4, 0xff, 0xff, 0xf9, 0x0, 0xcf, 0x10, 0xf, - 0xf0, 0x1, 0xff, 0xfa, 0xff, 0xff, 0xff, 0x90, - 0xc, 0xf1, 0x0, 0xff, 0x0, 0x1f, 0xff, 0xaf, - 0xff, 0xff, 0xf9, 0x0, 0xcf, 0x10, 0xf, 0xf0, - 0x1, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x41, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x6a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xa9, 0x40, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x1b, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x2d, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x2e, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, 0x3e, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x4f, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0xff, - 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xef, 0xff, 0xf1, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 129, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 129, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 42, .adv_w = 188, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 12}, - {.bitmap_index = 83, .adv_w = 337, .box_w = 21, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 304, .adv_w = 298, .box_w = 17, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 551, .adv_w = 405, .box_w = 24, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 803, .adv_w = 329, .box_w = 20, .box_h = 22, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1023, .adv_w = 101, .box_w = 4, .box_h = 9, .ofs_x = 1, .ofs_y = 12}, - {.bitmap_index = 1041, .adv_w = 162, .box_w = 8, .box_h = 28, .ofs_x = 2, .ofs_y = -6}, - {.bitmap_index = 1153, .adv_w = 162, .box_w = 8, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 1265, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 1337, .adv_w = 279, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 1435, .adv_w = 109, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1458, .adv_w = 184, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 1472, .adv_w = 109, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1485, .adv_w = 169, .box_w = 13, .box_h = 28, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 1667, .adv_w = 320, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1856, .adv_w = 178, .box_w = 8, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1940, .adv_w = 276, .box_w = 17, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2119, .adv_w = 275, .box_w = 16, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2287, .adv_w = 321, .box_w = 19, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2487, .adv_w = 276, .box_w = 17, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2666, .adv_w = 296, .box_w = 17, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2845, .adv_w = 287, .box_w = 17, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3024, .adv_w = 309, .box_w = 17, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3203, .adv_w = 296, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3392, .adv_w = 109, .box_w = 5, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3432, .adv_w = 109, .box_w = 5, .box_h = 21, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 3485, .adv_w = 279, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = 3}, - {.bitmap_index = 3590, .adv_w = 279, .box_w = 14, .box_h = 10, .ofs_x = 2, .ofs_y = 6}, - {.bitmap_index = 3660, .adv_w = 279, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = 3}, - {.bitmap_index = 3765, .adv_w = 275, .box_w = 16, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3933, .adv_w = 496, .box_w = 29, .box_h = 27, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 4325, .adv_w = 351, .box_w = 23, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 4567, .adv_w = 363, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 4767, .adv_w = 347, .box_w = 20, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4977, .adv_w = 396, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5198, .adv_w = 322, .box_w = 16, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5366, .adv_w = 305, .box_w = 15, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5524, .adv_w = 371, .box_w = 20, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5734, .adv_w = 390, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5934, .adv_w = 149, .box_w = 4, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5976, .adv_w = 246, .box_w = 14, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 6123, .adv_w = 345, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6323, .adv_w = 285, .box_w = 15, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6481, .adv_w = 458, .box_w = 23, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6723, .adv_w = 390, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6923, .adv_w = 403, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7165, .adv_w = 347, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7354, .adv_w = 403, .box_w = 24, .box_h = 26, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 7666, .adv_w = 349, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7855, .adv_w = 298, .box_w = 17, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8034, .adv_w = 282, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8223, .adv_w = 380, .box_w = 19, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8423, .adv_w = 342, .box_w = 23, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 8665, .adv_w = 540, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9012, .adv_w = 323, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9222, .adv_w = 311, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 9443, .adv_w = 315, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9632, .adv_w = 160, .box_w = 7, .box_h = 28, .ofs_x = 3, .ofs_y = -6}, - {.bitmap_index = 9730, .adv_w = 169, .box_w = 14, .box_h = 28, .ofs_x = -2, .ofs_y = -3}, - {.bitmap_index = 9926, .adv_w = 160, .box_w = 7, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 10024, .adv_w = 280, .box_w = 14, .box_h = 13, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 10115, .adv_w = 240, .box_w = 15, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10130, .adv_w = 288, .box_w = 9, .box_h = 4, .ofs_x = 3, .ofs_y = 18}, - {.bitmap_index = 10148, .adv_w = 287, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10268, .adv_w = 327, .box_w = 18, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10466, .adv_w = 274, .box_w = 16, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10594, .adv_w = 327, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10781, .adv_w = 294, .box_w = 17, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10917, .adv_w = 169, .box_w = 12, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11049, .adv_w = 331, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 11236, .adv_w = 327, .box_w = 16, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11412, .adv_w = 134, .box_w = 5, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11467, .adv_w = 136, .box_w = 10, .box_h = 28, .ofs_x = -3, .ofs_y = -6}, - {.bitmap_index = 11607, .adv_w = 296, .box_w = 17, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11794, .adv_w = 134, .box_w = 4, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11838, .adv_w = 507, .box_w = 28, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12062, .adv_w = 327, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12190, .adv_w = 305, .box_w = 17, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 12326, .adv_w = 327, .box_w = 18, .box_h = 22, .ofs_x = 2, .ofs_y = -6}, - {.bitmap_index = 12524, .adv_w = 327, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 12711, .adv_w = 197, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12791, .adv_w = 240, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12911, .adv_w = 199, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13031, .adv_w = 325, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13159, .adv_w = 268, .box_w = 18, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 13303, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13519, .adv_w = 265, .box_w = 17, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13655, .adv_w = 268, .box_w = 18, .box_h = 22, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 13853, .adv_w = 250, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 13965, .adv_w = 168, .box_w = 9, .box_h = 28, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 14091, .adv_w = 144, .box_w = 3, .box_h = 28, .ofs_x = 3, .ofs_y = -6}, - {.bitmap_index = 14133, .adv_w = 168, .box_w = 9, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 14259, .adv_w = 279, .box_w = 15, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 14297, .adv_w = 201, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 11}, - {.bitmap_index = 14352, .adv_w = 151, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 6}, - {.bitmap_index = 14373, .adv_w = 480, .box_w = 31, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 14854, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15199, .adv_w = 480, .box_w = 30, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15604, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15949, .adv_w = 330, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16180, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 16645, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 17110, .adv_w = 540, .box_w = 34, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17569, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 18034, .adv_w = 540, .box_w = 34, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 18425, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 18890, .adv_w = 240, .box_w = 15, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 19070, .adv_w = 360, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 19346, .adv_w = 540, .box_w = 34, .box_h = 29, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 19839, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 20184, .adv_w = 330, .box_w = 21, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 20510, .adv_w = 420, .box_w = 20, .box_h = 28, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 20790, .adv_w = 420, .box_w = 27, .box_h = 32, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 21222, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21587, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21952, .adv_w = 420, .box_w = 20, .box_h = 28, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 22232, .adv_w = 420, .box_w = 28, .box_h = 27, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 22610, .adv_w = 300, .box_w = 17, .box_h = 27, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 22840, .adv_w = 300, .box_w = 17, .box_h = 27, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 23070, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23435, .adv_w = 420, .box_w = 27, .box_h = 7, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 23530, .adv_w = 540, .box_w = 34, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23921, .adv_w = 600, .box_w = 38, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 24510, .adv_w = 540, .box_w = 36, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 25068, .adv_w = 480, .box_w = 30, .box_h = 28, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 25488, .adv_w = 420, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 25709, .adv_w = 420, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 25930, .adv_w = 600, .box_w = 38, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 26386, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 26731, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 27196, .adv_w = 480, .box_w = 31, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 27677, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28042, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 28461, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28826, .adv_w = 420, .box_w = 27, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 29150, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 29495, .adv_w = 300, .box_w = 20, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 29805, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 30224, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 30643, .adv_w = 540, .box_w = 34, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 31034, .adv_w = 480, .box_w = 32, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 31530, .adv_w = 360, .box_w = 23, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 31887, .adv_w = 600, .box_w = 38, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32419, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 32799, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 33179, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 33559, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 33939, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 34319, .adv_w = 600, .box_w = 38, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 34775, .adv_w = 420, .box_w = 24, .box_h = 31, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 35147, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 35566, .adv_w = 480, .box_w = 31, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 36047, .adv_w = 600, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 36484, .adv_w = 360, .box_w = 23, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 36841, .adv_w = 483, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = 1} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 5, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 22, 0, 13, -11, 0, 0, - 0, 0, -26, -29, 3, 23, 11, 8, - -19, 3, 24, 1, 20, 5, 15, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 29, 4, -3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 0, -14, 0, 0, 0, 0, - 0, -10, 8, 10, 0, 0, -5, 0, - -3, 5, 0, -5, 0, -5, -2, -10, - 0, 0, 0, 0, -5, 0, 0, -6, - -7, 0, 0, -5, 0, -10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -5, - -5, 0, -7, 0, -13, 0, -58, 0, - 0, -10, 0, 10, 14, 0, 0, -10, - 5, 5, 16, 10, -8, 10, 0, 0, - -27, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -18, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -13, -6, -24, 0, -19, - -3, 0, 0, 0, 0, 1, 19, 0, - -14, -4, -1, 1, 0, -8, 0, 0, - -3, -36, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -38, -4, 18, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -20, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, - 0, 5, 0, 0, -10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 18, 4, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -18, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, - 10, 5, 14, -5, 0, 0, 10, -5, - -16, -66, 3, 13, 10, 1, -6, 0, - 17, 0, 15, 0, 15, 0, -45, 0, - -6, 14, 0, 16, -5, 10, 5, 0, - 0, 1, -5, 0, 0, -8, 38, 0, - 38, 0, 14, 0, 20, 6, 8, 14, - 0, 0, 0, -18, 0, 0, 0, 0, - 1, -3, 0, 3, -9, -6, -10, 3, - 0, -5, 0, 0, 0, -19, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -31, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, -26, 0, -30, 0, 0, 0, - 0, -3, 0, 48, -6, -6, 5, 5, - -4, 0, -6, 5, 0, 0, -25, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -47, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -30, 0, 29, 0, 0, -18, 0, - 16, 0, -33, -47, -33, -10, 14, 0, - 0, -32, 0, 6, -11, 0, -7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 12, 14, -59, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 23, 0, 3, 0, 0, 0, - 0, 0, 3, 3, -6, -10, 0, -1, - -1, -5, 0, 0, -3, 0, 0, 0, - -10, 0, -4, 0, -11, -10, 0, -12, - -16, -16, -9, 0, -10, 0, -10, 0, - 0, 0, 0, -4, 0, 0, 5, 0, - 3, -5, 0, 1, 0, 0, 0, 5, - -3, 0, 0, 0, -3, 5, 5, -1, - 0, 0, 0, -9, 0, -1, 0, 0, - 0, 0, 0, 1, 0, 6, -3, 0, - -6, 0, -8, 0, 0, -3, 0, 14, - 0, 0, -5, 0, 0, 0, 0, 0, - -1, 1, -3, -3, 0, 0, -5, 0, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, -2, 0, -5, -6, 0, - 0, 0, 0, 0, 1, 0, 0, -3, - 0, -5, -5, -5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -3, 0, 0, - 0, 0, -3, -6, 0, -7, 0, -14, - -3, -14, 10, 0, 0, -10, 5, 10, - 13, 0, -12, -1, -6, 0, -1, -23, - 5, -3, 3, -25, 5, 0, 0, 1, - -25, 0, -25, -4, -42, -3, 0, -24, - 0, 10, 13, 0, 6, 0, 0, 0, - 0, 1, 0, -9, -6, 0, -14, 0, - 0, 0, -5, 0, 0, 0, -5, 0, - 0, 0, 0, 0, -2, -2, 0, -2, - -6, 0, 0, 0, 0, 0, 0, 0, - -5, -5, 0, -3, -6, -4, 0, 0, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, -4, 0, -6, - 0, -3, 0, -10, 5, 0, 0, -6, - 2, 5, 5, 0, 0, 0, 0, 0, - 0, -3, 0, 0, 0, 0, 0, 3, - 0, 0, -5, 0, -5, -3, -6, 0, - 0, 0, 0, 0, 0, 0, 4, 0, - -4, 0, 0, 0, 0, -5, -7, 0, - -9, 0, 14, -3, 1, -15, 0, 0, - 13, -24, -25, -20, -10, 5, 0, -4, - -31, -9, 0, -9, 0, -10, 7, -9, - -31, 0, -13, 0, 0, 2, -1, 4, - -3, 0, 5, 0, -14, -18, 0, -24, - -12, -10, -12, -14, -6, -13, -1, -9, - -13, 3, 0, 1, 0, -5, 0, 0, - 0, 3, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -5, - 0, -2, 0, -1, -5, 0, -8, -11, - -11, -1, 0, -14, 0, 0, 0, 0, - 0, 0, -4, 0, 0, 0, 0, 2, - -3, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 23, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -9, 0, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, 0, 0, - -9, 0, 0, 0, 0, -24, -14, 0, - 0, 0, -7, -24, 0, 0, -5, 5, - 0, -13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, 0, 0, -9, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, -9, 0, - 0, 0, 0, 6, 0, 3, -10, -10, - 0, -5, -5, -6, 0, 0, 0, 0, - 0, 0, -14, 0, -5, 0, -7, -5, - 0, -11, -12, -14, -4, 0, -10, 0, - -14, 0, 0, 0, 0, 38, 0, 0, - 2, 0, 0, -6, 0, 5, 0, -21, - 0, 0, 0, 0, 0, -45, -9, 16, - 14, -4, -20, 0, 5, -7, 0, -24, - -2, -6, 5, -34, -5, 6, 0, 7, - -17, -7, -18, -16, -20, 0, 0, -29, - 0, 27, 0, 0, -2, 0, 0, 0, - -2, -2, -5, -13, -16, -1, -45, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -5, 0, -2, -5, -7, 0, 0, - -10, 0, -5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, -10, 0, 0, 10, - -1, 6, 0, -11, 5, -3, -1, -12, - -5, 0, -6, -5, -3, 0, -7, -8, - 0, 0, -4, -1, -3, -8, -6, 0, - 0, -5, 0, 5, -3, 0, -11, 0, - 0, 0, -10, 0, -8, 0, -8, -8, - 5, 0, 0, 0, 0, 0, 0, 0, - 0, -10, 5, 0, -7, 0, -3, -6, - -15, -3, -3, -3, -1, -3, -6, -1, - 0, 0, 0, 0, 0, -5, -4, -4, - 0, 0, 0, 0, 6, -3, 0, -3, - 0, 0, 0, -3, -6, -3, -4, -6, - -4, 0, 4, 19, -1, 0, -13, 0, - -3, 10, 0, -5, -20, -6, 7, 0, - 0, -23, -8, 5, -8, 3, 0, -3, - -4, -15, 0, -7, 2, 0, 0, -8, - 0, 0, 0, 5, 5, -10, -9, 0, - -8, -5, -7, -5, -5, 0, -8, 2, - -9, -8, 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, 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, - -3, 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, -4, -5, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, 0, 0, -6, - 0, 0, -5, -5, 0, 0, 0, 0, - -5, 0, 0, 0, 0, -2, 0, 0, - 0, 0, 0, -3, 0, 0, 0, 0, - -7, 0, -10, 0, 0, 0, -16, 0, - 3, -11, 10, 1, -3, -23, 0, 0, - -11, -5, 0, -19, -12, -13, 0, 0, - -21, -5, -19, -18, -23, 0, -12, 0, - 4, 32, -6, 0, -11, -5, -1, -5, - -8, -13, -9, -18, -20, -11, -5, 0, - 0, -3, 0, 1, 0, 0, -34, -4, - 14, 11, -11, -18, 0, 1, -15, 0, - -24, -3, -5, 10, -44, -6, 1, 0, - 0, -31, -6, -25, -5, -35, 0, 0, - -34, 0, 28, 1, 0, -3, 0, 0, - 0, 0, -2, -3, -18, -3, 0, -31, - 0, 0, 0, 0, -15, 0, -4, 0, - -1, -13, -23, 0, 0, -2, -7, -14, - -5, 0, -3, 0, 0, 0, 0, -22, - -5, -16, -15, -4, -8, -12, -5, -8, - 0, -10, -4, -16, -7, 0, -6, -9, - -5, -9, 0, 2, 0, -3, -16, 0, - 10, 0, -9, 0, 0, 0, 0, 6, - 0, 3, -10, 20, 0, -5, -5, -6, - 0, 0, 0, 0, 0, 0, -14, 0, - -5, 0, -7, -5, 0, -11, -12, -14, - -4, 0, -10, 4, 19, 0, 0, 0, - 0, 38, 0, 0, 2, 0, 0, -6, - 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -3, -10, 0, 0, 0, 0, 0, -2, - 0, 0, 0, -5, -5, 0, 0, -10, - -5, 0, 0, -10, 0, 8, -2, 0, - 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 7, 10, 4, -4, 0, -15, - -8, 0, 14, -16, -15, -10, -10, 19, - 9, 5, -42, -3, 10, -5, 0, -5, - 5, -5, -17, 0, -5, 5, -6, -4, - -14, -4, 0, 0, 14, 10, 0, -13, - 0, -26, -6, 14, -6, -18, 1, -6, - -16, -16, -5, 19, 5, 0, -7, 0, - -13, 0, 4, 16, -11, -18, -19, -12, - 14, 0, 1, -35, -4, 5, -8, -3, - -11, 0, -11, -18, -7, -7, -4, 0, - 0, -11, -10, -5, 0, 14, 11, -5, - -26, 0, -26, -7, 0, -17, -28, -1, - -15, -8, -16, -13, 13, 0, 0, -6, - 0, -10, -4, 0, -5, -9, 0, 8, - -16, 5, 0, 0, -25, 0, -5, -11, - -8, -3, -14, -12, -16, -11, 0, -14, - -5, -11, -9, -14, -5, 0, 0, 1, - 23, -8, 0, -14, -5, 0, -5, -10, - -11, -13, -13, -18, -6, -10, 10, 0, - -7, 0, -24, -6, 3, 10, -15, -18, - -10, -16, 16, -5, 2, -45, -9, 10, - -11, -8, -18, 0, -14, -20, -6, -5, - -4, -5, -10, -14, -1, 0, 0, 14, - 13, -3, -31, 0, -29, -11, 12, -18, - -33, -10, -17, -20, -24, -16, 10, 0, - 0, 0, 0, -6, 0, 0, 5, -6, - 10, 3, -9, 10, 0, 0, -15, -1, - 0, -1, 0, 1, 1, -4, 0, 0, - 0, 0, 0, 0, -5, 0, 0, 0, - 0, 4, 14, 1, 0, -6, 0, 0, - 0, 0, -3, -3, -6, 0, 0, 0, - 1, 4, 0, 0, 0, 0, 4, 0, - -4, 0, 18, 0, 9, 1, 1, -6, - 0, 10, 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 14, 0, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -29, 0, -5, 8, 0, 14, - 0, 0, 48, 6, -10, -10, 5, 5, - -3, 1, -24, 0, 0, 23, -29, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -33, 18, 67, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -29, 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, -8, 0, 0, -9, - -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, -13, 0, - 0, 1, 0, 0, 5, 62, -10, -4, - 15, 13, -13, 5, 0, 0, 5, 5, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -62, 13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -13, - 0, 0, 0, -13, 0, 0, 0, 0, - -11, -2, 0, 0, 0, -11, 0, -6, - 0, -23, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -32, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, -5, 0, 0, -9, 0, -7, 0, - -13, 0, 0, 0, -8, 5, -6, 0, - 0, -13, -5, -11, 0, 0, -13, 0, - -5, 0, -23, 0, -5, 0, 0, -39, - -9, -19, -5, -17, 0, 0, -32, 0, - -13, -2, 0, 0, 0, 0, 0, 0, - 0, 0, -7, -9, -4, -8, 0, 0, - 0, 0, -11, 0, -11, 6, -5, 10, - 0, -3, -11, -3, -8, -9, 0, -6, - -2, -3, 3, -13, -1, 0, 0, 0, - -42, -4, -7, 0, -11, 0, -3, -23, - -4, 0, 0, -3, -4, 0, 0, 0, - 0, 3, 0, -3, -8, -3, 8, 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, 6, 0, 0, 0, 0, 0, - 0, -11, 0, -3, 0, 0, 0, -10, - 5, 0, 0, 0, -13, -5, -10, 0, - 0, -13, 0, -5, 0, -23, 0, 0, - 0, 0, -47, 0, -10, -18, -24, 0, - 0, -32, 0, -3, -7, 0, 0, 0, - 0, 0, 0, 0, 0, -5, -7, -2, - -7, 1, 0, 0, 8, -6, 0, 15, - 24, -5, -5, -14, 6, 24, 8, 11, - -13, 6, 20, 6, 14, 11, 13, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 30, 23, -9, -5, 0, -4, - 38, 21, 38, 0, 0, 0, 5, 0, - 0, 18, 0, 0, -8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -3, 0, - 0, 0, 0, 0, 0, 0, 0, 7, - 0, 0, 0, 0, -40, -6, -4, -20, - -24, 0, 0, -32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3, - 0, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 0, -40, -6, -4, - -20, -24, 0, 0, -19, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -4, 0, 0, 0, -11, 5, 0, -5, - 4, 9, 5, -14, 0, -1, -4, 5, - 0, 4, 0, 0, 0, 0, -12, 0, - -4, -3, -10, 0, -4, -19, 0, 30, - -5, 0, -11, -3, 0, -3, -8, 0, - -5, -13, -10, -6, 0, 0, 0, -8, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -3, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 0, -40, - -6, -4, -20, -24, 0, 0, -32, 0, - 0, 0, 0, 0, 0, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -8, 0, -15, -6, -4, 14, -4, -5, - -19, 1, -3, 1, -3, -13, 1, 11, - 1, 4, 1, 4, -12, -19, -6, 0, - -18, -9, -13, -20, -19, 0, -8, -10, - -6, -6, -4, -3, -6, -3, 0, -3, - -1, 7, 0, 7, -3, 0, 15, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -3, -5, -5, 0, 0, - -13, 0, -2, 0, -8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -29, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, -5, 0, -6, - 0, 0, 0, 0, -4, 0, 0, -8, - -5, 5, 0, -8, -9, -3, 0, -14, - -3, -11, -3, -6, 0, -8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -32, 0, 15, 0, 0, -9, 0, - 0, 0, 0, -6, 0, -5, 0, 0, - -2, 0, 0, -3, 0, -11, 0, 0, - 20, -6, -16, -15, 3, 5, 5, -1, - -13, 3, 7, 3, 14, 3, 16, -3, - -13, 0, 0, -19, 0, 0, -14, -13, - 0, 0, -10, 0, -6, -8, 0, -7, - 0, -7, 0, -3, 7, 0, -4, -14, - -5, 18, 0, 0, -4, 0, -10, 0, - 0, 6, -11, 0, 5, -5, 4, 0, - 0, -16, 0, -3, -1, 0, -5, 5, - -4, 0, 0, 0, -20, -6, -11, 0, - -14, 0, 0, -23, 0, 18, -5, 0, - -9, 0, 3, 0, -5, 0, -5, -14, - 0, -5, 5, 0, 0, 0, 0, -3, - 0, 0, 5, -6, 1, 0, 0, -6, - -3, 0, -6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -30, 0, 11, 0, - 0, -4, 0, 0, 0, 0, 1, 0, - -5, -5, 0, 0, 0, 10, 0, 11, - 0, 0, 0, 0, 0, -30, -27, 1, - 21, 14, 8, -19, 3, 20, 0, 18, - 0, 10, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_30 = { -#else -lv_font_t lv_font_montserrat_30 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 33, /*The maximum line height required by the font*/ - .base_line = 6, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -2, - .underline_thickness = 2, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_30*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_32.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_32.c deleted file mode 100644 index a12a49c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_32.c +++ /dev/null @@ -1,6212 +0,0 @@ -/******************************************************************************* - * Size: 32 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 32 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_32.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_32 - #define LV_FONT_MONTSERRAT_32 1 -#endif - -#if LV_FONT_MONTSERRAT_32 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x7f, 0xff, 0x17, 0xff, 0xf0, 0x6f, 0xff, 0x5, - 0xff, 0xf0, 0x5f, 0xfe, 0x4, 0xff, 0xe0, 0x4f, - 0xfd, 0x3, 0xff, 0xc0, 0x2f, 0xfc, 0x2, 0xff, - 0xb0, 0x1f, 0xfb, 0x1, 0xff, 0xa0, 0xf, 0xf9, - 0x0, 0xff, 0x90, 0xf, 0xf8, 0x0, 0x33, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0xb, - 0xff, 0xf4, 0xaf, 0xff, 0x42, 0xcf, 0x90, - - /* U+0022 "\"" */ - 0xff, 0xb0, 0x2, 0xff, 0x7f, 0xfa, 0x0, 0x2f, - 0xf7, 0xef, 0xa0, 0x2, 0xff, 0x6e, 0xf9, 0x0, - 0x1f, 0xf6, 0xef, 0x90, 0x1, 0xff, 0x6d, 0xf8, - 0x0, 0x1f, 0xf5, 0xdf, 0x80, 0x0, 0xff, 0x5d, - 0xf8, 0x0, 0xf, 0xf4, 0x79, 0x40, 0x0, 0x99, - 0x20, - - /* U+0023 "#" */ - 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, 0x6, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf6, - 0x0, 0x0, 0x9, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xf4, 0x0, 0x0, 0xb, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf2, 0x0, 0x0, - 0xd, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xf0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x55, 0x55, - 0xcf, 0xb5, 0x55, 0x55, 0x9f, 0xe5, 0x55, 0x53, - 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, 0x0, 0x7f, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, - 0x0, 0x0, 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x40, 0x0, 0x0, 0xbf, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x20, 0x0, 0x0, - 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0xff, 0x30, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x5, 0x55, 0x5d, 0xfa, 0x55, 0x55, 0x59, 0xfe, - 0x55, 0x55, 0x30, 0x0, 0x0, 0xd, 0xf6, 0x0, - 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xf4, 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, 0xc, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf0, - 0x0, 0x0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xe0, 0x0, 0x0, 0xf, 0xf3, 0x0, - 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xce, - 0xff, 0xfe, 0xb8, 0x20, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0xbf, - 0xff, 0xfc, 0xff, 0xde, 0xff, 0xff, 0x50, 0x7, - 0xff, 0xf8, 0x10, 0xef, 0x20, 0x16, 0xce, 0x0, - 0xe, 0xff, 0x70, 0x0, 0xef, 0x20, 0x0, 0x2, - 0x0, 0x1f, 0xff, 0x0, 0x0, 0xef, 0x20, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0xef, 0x20, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, 0x0, 0xef, - 0x20, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x30, - 0xef, 0x20, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xfd, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1a, - 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, - 0x0, 0x28, 0xdf, 0xff, 0xff, 0xff, 0xb2, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xef, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0xef, 0x22, 0x9f, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, - 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, - 0x20, 0x0, 0xaf, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0xef, 0x20, 0x0, 0xaf, 0xf8, 0xb, 0x50, 0x0, - 0x0, 0xef, 0x20, 0x1, 0xef, 0xf4, 0x4f, 0xfc, - 0x51, 0x0, 0xef, 0x20, 0x3d, 0xff, 0xd0, 0x5f, - 0xff, 0xff, 0xdc, 0xff, 0xce, 0xff, 0xff, 0x30, - 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xfe, 0xa5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x78, 0x10, 0x0, 0x0, 0x0, - - /* U+0025 "%" */ - 0x0, 0x2a, 0xef, 0xd8, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xe1, 0x0, 0x0, 0x3f, 0xff, 0xdf, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, - 0x0, 0xe, 0xf8, 0x0, 0xa, 0xfb, 0x0, 0x0, - 0x0, 0xc, 0xfa, 0x0, 0x0, 0x6, 0xfd, 0x0, - 0x0, 0x1f, 0xf3, 0x0, 0x0, 0x8, 0xfe, 0x0, - 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, 0xaf, 0x70, - 0x0, 0x3, 0xff, 0x40, 0x0, 0x0, 0xc, 0xf5, - 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, 0xdf, 0x80, - 0x0, 0x0, 0x0, 0xcf, 0x50, 0x0, 0x0, 0x8f, - 0x80, 0x0, 0x9f, 0xd0, 0x0, 0x0, 0x0, 0xa, - 0xf7, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x4f, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x1, - 0xff, 0x20, 0x1e, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xb2, 0x3, 0xcf, 0xa0, 0xb, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xc0, 0x6, 0xff, 0x20, 0x19, 0xdf, 0xe9, - 0x20, 0x0, 0x0, 0x7b, 0xcb, 0x60, 0x2, 0xff, - 0x60, 0x1e, 0xff, 0xdf, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xa0, 0xc, 0xfb, 0x10, - 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xe1, 0x3, 0xff, 0x10, 0x0, 0xe, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf4, 0x0, 0x7f, 0xa0, - 0x0, 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x0, 0xd, - 0xf9, 0x0, 0x9, 0xf8, 0x0, 0x0, 0x5, 0xfc, - 0x0, 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x9f, - 0x70, 0x0, 0x0, 0x5f, 0xc0, 0x0, 0x0, 0x4, - 0xff, 0x30, 0x0, 0x7, 0xf9, 0x0, 0x0, 0x7, - 0xfa, 0x0, 0x0, 0x1, 0xef, 0x80, 0x0, 0x0, - 0x3f, 0xe0, 0x0, 0x0, 0xcf, 0x60, 0x0, 0x0, - 0xaf, 0xc0, 0x0, 0x0, 0x0, 0xcf, 0x80, 0x0, - 0x6f, 0xe0, 0x0, 0x0, 0x5f, 0xf2, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xda, 0xcf, 0xf3, 0x0, 0x0, - 0x1e, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, - 0xfe, 0xa2, 0x0, - - /* U+0026 "&" */ - 0x0, 0x0, 0x2, 0x8d, 0xff, 0xea, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xf9, 0x54, 0x6e, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x2f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, - 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf2, - 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x90, 0x0, 0xb, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0x60, 0x3d, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xfe, 0x9f, - 0xff, 0x70, 0x0, 0x0, 0x50, 0x0, 0x1, 0xdf, - 0xfa, 0x10, 0x4f, 0xff, 0x80, 0x0, 0x5f, 0xf4, - 0x0, 0xbf, 0xf8, 0x0, 0x0, 0x4f, 0xff, 0x90, - 0x9, 0xff, 0x10, 0x3f, 0xfd, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x91, 0xff, 0xc0, 0x7, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xef, 0xf5, 0x0, - 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xfc, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x1e, 0xff, 0xb2, - 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xc1, 0x0, - 0x5f, 0xff, 0xfc, 0xa8, 0x9c, 0xff, 0xff, 0x6c, - 0xff, 0xc1, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x20, 0x1c, 0xfe, 0x20, 0x0, 0x5, 0xad, - 0xff, 0xec, 0x83, 0x0, 0x0, 0x1c, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0027 "'" */ - 0xff, 0xbf, 0xfa, 0xef, 0xae, 0xf9, 0xef, 0x9d, - 0xf8, 0xdf, 0x8d, 0xf8, 0x79, 0x40, - - /* U+0028 "(" */ - 0x0, 0x6, 0xff, 0x80, 0x0, 0xef, 0xe0, 0x0, - 0x7f, 0xf8, 0x0, 0xe, 0xff, 0x10, 0x3, 0xff, - 0xb0, 0x0, 0x8f, 0xf6, 0x0, 0xe, 0xff, 0x10, - 0x1, 0xff, 0xd0, 0x0, 0x4f, 0xfa, 0x0, 0x7, - 0xff, 0x80, 0x0, 0xaf, 0xf5, 0x0, 0xc, 0xff, - 0x30, 0x0, 0xcf, 0xf2, 0x0, 0xd, 0xff, 0x20, - 0x0, 0xef, 0xf1, 0x0, 0xe, 0xff, 0x10, 0x0, - 0xdf, 0xf2, 0x0, 0xc, 0xff, 0x20, 0x0, 0xcf, - 0xf3, 0x0, 0xa, 0xff, 0x50, 0x0, 0x7f, 0xf8, - 0x0, 0x4, 0xff, 0xa0, 0x0, 0x1f, 0xfd, 0x0, - 0x0, 0xdf, 0xf1, 0x0, 0x8, 0xff, 0x60, 0x0, - 0x3f, 0xfb, 0x0, 0x0, 0xdf, 0xf1, 0x0, 0x6, - 0xff, 0x80, 0x0, 0xe, 0xfe, 0x0, 0x0, 0x6f, - 0xf8, - - /* U+0029 ")" */ - 0xbf, 0xf3, 0x0, 0x4, 0xff, 0xb0, 0x0, 0xc, - 0xff, 0x30, 0x0, 0x5f, 0xfb, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0xa, 0xff, 0x50, 0x0, 0x5f, 0xfb, - 0x0, 0x1, 0xff, 0xe0, 0x0, 0xe, 0xff, 0x10, - 0x0, 0xbf, 0xf4, 0x0, 0x8, 0xff, 0x70, 0x0, - 0x6f, 0xf9, 0x0, 0x6, 0xff, 0xa0, 0x0, 0x5f, - 0xfb, 0x0, 0x4, 0xff, 0xb0, 0x0, 0x4f, 0xfc, - 0x0, 0x5, 0xff, 0xb0, 0x0, 0x6f, 0xfa, 0x0, - 0x6, 0xff, 0x90, 0x0, 0x8f, 0xf7, 0x0, 0xb, - 0xff, 0x40, 0x0, 0xef, 0xf1, 0x0, 0x1f, 0xfe, - 0x0, 0x5, 0xff, 0xb0, 0x0, 0xaf, 0xf5, 0x0, - 0xf, 0xff, 0x0, 0x4, 0xff, 0xb0, 0x0, 0xcf, - 0xf3, 0x0, 0x3f, 0xfb, 0x0, 0xb, 0xff, 0x30, - 0x0, - - /* U+002A "*" */ - 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0x50, 0x0, 0x0, 0x9, 0x70, 0x8, - 0xf5, 0x0, 0x87, 0x2, 0xff, 0xd4, 0x8f, 0x56, - 0xef, 0xe0, 0x4, 0xdf, 0xfe, 0xfe, 0xff, 0xb3, - 0x0, 0x0, 0x6e, 0xff, 0xfd, 0x40, 0x0, 0x0, - 0x19, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x7e, 0xff, - 0xdf, 0xdf, 0xfd, 0x50, 0x2f, 0xfa, 0x28, 0xf5, - 0x3c, 0xfe, 0x0, 0x74, 0x0, 0x8f, 0x50, 0x6, - 0x50, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7d, 0x40, 0x0, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0xee, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xfa, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x78, 0x88, 0x88, 0xff, - 0xd8, 0x88, 0x88, 0x30, 0x0, 0x0, 0xf, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, - 0x0, - - /* U+002C "," */ - 0x7, 0xca, 0x14, 0xff, 0xf9, 0x6f, 0xff, 0xb2, - 0xef, 0xf8, 0x4, 0xff, 0x30, 0x6f, 0xe0, 0xa, - 0xf9, 0x0, 0xef, 0x30, 0x2f, 0xe0, 0x0, - - /* U+002D "-" */ - 0x1a, 0xaa, 0xaa, 0xaa, 0xa4, 0x2f, 0xff, 0xff, - 0xff, 0xf7, 0x2f, 0xff, 0xff, 0xff, 0xf7, - - /* U+002E "." */ - 0x1, 0x42, 0x1, 0xef, 0xf4, 0x7f, 0xff, 0xb6, - 0xff, 0xf9, 0xa, 0xfc, 0x10, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x0, 0x0, 0x6b, 0xef, 0xfc, 0x82, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfd, - 0xef, 0xff, 0xfc, 0x0, 0x0, 0x5, 0xff, 0xfc, - 0x40, 0x0, 0x29, 0xff, 0xfa, 0x0, 0x0, 0xef, - 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x0, - 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xc0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x21, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf6, 0x4f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0x96, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x7f, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xc7, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xfc, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xb4, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x1f, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x60, 0xdf, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, - 0x7, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xfc, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x40, 0x0, 0x5f, 0xff, 0xc4, 0x0, - 0x2, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xde, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x5e, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xbe, 0xff, 0xd8, 0x20, 0x0, - 0x0, - - /* U+0031 "1" */ - 0xcf, 0xff, 0xff, 0xff, 0x7c, 0xff, 0xff, 0xff, - 0xf7, 0x9c, 0xcc, 0xce, 0xff, 0x70, 0x0, 0x0, - 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, - 0x0, 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, - 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, - 0x70, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, 0xb, - 0xff, 0x70, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, - 0xb, 0xff, 0x70, 0x0, 0x0, 0xbf, 0xf7, 0x0, - 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0xbf, 0xf7, - 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0xbf, - 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, - 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, - 0x0, 0xbf, 0xf7, - - /* U+0032 "2" */ - 0x0, 0x0, 0x49, 0xce, 0xff, 0xda, 0x50, 0x0, - 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x9, 0xff, 0xff, 0xfe, 0xde, 0xff, - 0xff, 0xe2, 0x0, 0x4f, 0xff, 0xb4, 0x0, 0x0, - 0x18, 0xff, 0xfb, 0x0, 0x4, 0xe6, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xc3, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - - /* U+0033 "3" */ - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x9, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, - 0x6, 0x99, 0xad, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xb0, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xf7, 0x5f, 0xfe, 0x83, 0x0, 0x0, 0x16, 0xef, - 0xfe, 0x7, 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, - 0xff, 0x30, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x30, 0x0, 0x0, 0x27, 0xbd, 0xef, 0xed, - 0x94, 0x0, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xa0, 0x0, 0x3, 0xdd, 0x90, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x3f, - 0xfc, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, - 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, - 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xc0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, - 0xbb, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xc0, 0x0, 0x0, - - /* U+0035 "5" */ - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xe, 0xff, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xfd, 0xcc, 0xba, 0x96, 0x20, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x40, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x49, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf0, 0x6, 0xd3, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xc0, 0x1e, 0xff, 0xb5, 0x10, 0x0, 0x4, - 0xcf, 0xff, 0x40, 0x2e, 0xff, 0xff, 0xfe, 0xdd, - 0xff, 0xff, 0xf8, 0x0, 0x1, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x59, - 0xde, 0xff, 0xdb, 0x61, 0x0, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, 0x94, - 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x3, 0xef, 0xff, 0xfe, 0xcb, - 0xcf, 0xff, 0x10, 0x0, 0x2e, 0xff, 0xf8, 0x10, - 0x0, 0x0, 0x36, 0x0, 0x0, 0xcf, 0xfd, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xfe, 0x0, 0x2, 0x68, 0x87, 0x40, 0x0, - 0x0, 0x5f, 0xfc, 0x4, 0xdf, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x6f, 0xfb, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x7f, 0xff, 0xff, 0xd6, 0x10, - 0x3, 0x9f, 0xff, 0xc0, 0x6f, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf4, 0x5f, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x2f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfc, 0xe, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, - 0x9, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xfb, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf6, 0x0, 0x8f, 0xff, 0x60, 0x0, 0x0, - 0x2c, 0xff, 0xe0, 0x0, 0xa, 0xff, 0xfe, 0xb9, - 0x9c, 0xff, 0xff, 0x20, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x1, - 0x7b, 0xef, 0xfd, 0xa4, 0x0, 0x0, - - /* U+0037 "7" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0xf, 0xff, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xff, 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf3, 0xf, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xc0, 0xf, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0xb, 0xbb, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x0, 0x16, 0xbd, 0xff, 0xed, 0x94, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x30, 0x0, 0x0, 0x9f, 0xff, 0xfc, 0xa9, - 0xbd, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x91, - 0x0, 0x0, 0x4, 0xdf, 0xfe, 0x0, 0x9, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, - 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x60, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf4, 0x0, 0x6f, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x6f, 0xfe, 0x0, 0x0, 0xcf, 0xfe, 0x83, - 0x10, 0x14, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, - 0x0, 0x1c, 0xff, 0xfc, 0x97, 0x67, 0xaf, 0xff, - 0xf7, 0x0, 0xb, 0xff, 0xe4, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf5, 0x3, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xd0, 0x7f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x19, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf2, - 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x14, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xd0, 0xc, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x2b, 0xff, 0xf6, 0x0, 0x1d, 0xff, 0xff, - 0xb9, 0x9a, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x1a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0x0, 0x2, 0x7b, 0xdf, 0xfe, 0xd9, 0x50, 0x0, - 0x0, - - /* U+0039 "9" */ - 0x0, 0x0, 0x16, 0xbd, 0xff, 0xda, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, - 0xe4, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfb, 0x99, - 0xbf, 0xff, 0xf6, 0x0, 0x0, 0x4f, 0xff, 0x90, - 0x0, 0x0, 0x8, 0xff, 0xf3, 0x0, 0xb, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0x40, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfa, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xd0, 0xc, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x5f, 0xff, - 0x90, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf1, 0x0, - 0xaf, 0xff, 0xfb, 0x99, 0xbf, 0xff, 0xaf, 0xff, - 0x20, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xff, 0xf2, 0x0, 0x0, 0x28, 0xce, 0xfe, 0xc8, - 0x20, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf7, 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, - 0x3b, 0xff, 0xfb, 0x0, 0x0, 0x5, 0xff, 0xec, - 0xbc, 0xef, 0xff, 0xfc, 0x10, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x5a, 0xdf, 0xff, 0xda, 0x60, 0x0, 0x0, - 0x0, - - /* U+003A ":" */ - 0x9, 0xfc, 0x16, 0xff, 0xf9, 0x7f, 0xff, 0xb1, - 0xef, 0xf4, 0x1, 0x42, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x42, - 0x1, 0xef, 0xf4, 0x7f, 0xff, 0xb6, 0xff, 0xf9, - 0xa, 0xfc, 0x10, - - /* U+003B ";" */ - 0x9, 0xfc, 0x16, 0xff, 0xf9, 0x7f, 0xff, 0xb1, - 0xef, 0xf4, 0x1, 0x42, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xc1, 0x5f, 0xff, 0xa6, 0xff, 0xfb, - 0x1d, 0xff, 0x80, 0x3f, 0xf3, 0x7, 0xfd, 0x0, - 0xbf, 0x80, 0xf, 0xf2, 0x2, 0xdb, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb7, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x5c, 0xff, 0xff, 0xe4, 0x0, 0x0, - 0x39, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x6, 0xcf, - 0xff, 0xfd, 0x71, 0x0, 0x0, 0x8f, 0xff, 0xfe, - 0x93, 0x0, 0x0, 0x0, 0xd, 0xff, 0xc5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x93, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xfd, 0x71, - 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, 0xff, 0xfa, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, - 0xe8, 0x20, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, - 0x60, - - /* U+003D "=" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x78, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x83, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, - - /* U+003E ">" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xf9, 0x30, 0x0, 0x0, 0x0, 0x1, 0x6d, - 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x3, - 0x9e, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xbf, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x17, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x3, 0x9e, - 0xff, 0xff, 0xa2, 0x0, 0x1, 0x6d, 0xff, 0xff, - 0xc6, 0x10, 0x0, 0x4a, 0xff, 0xff, 0xf9, 0x30, - 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x60, 0x0, 0x0, - 0x0, 0xd, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+003F "?" */ - 0x0, 0x0, 0x59, 0xde, 0xff, 0xda, 0x50, 0x0, - 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0xa, 0xff, 0xff, 0xec, 0xbd, 0xff, 0xff, - 0xf3, 0x6, 0xff, 0xf9, 0x20, 0x0, 0x1, 0x8f, - 0xff, 0xc0, 0x5, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xee, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe4, - 0x0, 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbd, 0xff, - 0xfe, 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xea, 0x63, 0x21, 0x23, - 0x58, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3a, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xef, 0xe2, 0x0, 0x0, 0x0, 0xbf, - 0xf5, 0x0, 0x0, 0x1, 0x56, 0x64, 0x0, 0x1, - 0x77, 0x41, 0xdf, 0xd0, 0x0, 0x0, 0x6f, 0xf6, - 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0x91, 0x3f, - 0xf9, 0x1, 0xef, 0x90, 0x0, 0xe, 0xfa, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe5, 0xff, - 0x90, 0x4, 0xff, 0x20, 0x6, 0xff, 0x20, 0x0, - 0x3f, 0xff, 0xc4, 0x10, 0x26, 0xef, 0xff, 0xf9, - 0x0, 0xb, 0xf9, 0x0, 0xcf, 0xa0, 0x0, 0xd, - 0xff, 0x80, 0x0, 0x0, 0x1, 0xcf, 0xff, 0x90, - 0x0, 0x5f, 0xe0, 0x1f, 0xf5, 0x0, 0x4, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf9, 0x0, - 0x0, 0xff, 0x34, 0xff, 0x10, 0x0, 0x9f, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, - 0xc, 0xf6, 0x6f, 0xf0, 0x0, 0xc, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, - 0xbf, 0x77, 0xfe, 0x0, 0x0, 0xdf, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0xa, - 0xf8, 0x7f, 0xe0, 0x0, 0xd, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, 0xaf, - 0x76, 0xff, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0x90, 0x0, 0xb, 0xf6, - 0x3f, 0xf2, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0xef, 0x40, - 0xff, 0x50, 0x0, 0x1f, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x90, 0x0, 0x3f, 0xf0, 0xc, - 0xfa, 0x0, 0x0, 0x8f, 0xfd, 0x30, 0x0, 0x0, - 0x6f, 0xff, 0xfd, 0x0, 0xb, 0xfa, 0x0, 0x6f, - 0xf2, 0x0, 0x0, 0xcf, 0xff, 0xb7, 0x68, 0xdf, - 0xf9, 0xcf, 0xfb, 0x7b, 0xff, 0x20, 0x0, 0xef, - 0xb0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf8, - 0x5, 0xff, 0xff, 0xff, 0x60, 0x0, 0x5, 0xff, - 0x60, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0x93, 0x0, - 0x4, 0xcf, 0xeb, 0x40, 0x0, 0x0, 0xa, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xa6, 0x43, 0x23, 0x47, 0xaf, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x9b, 0xef, 0xff, 0xdb, 0x83, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xfb, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0x1b, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xa0, 0x4f, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf3, 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x6, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x40, 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x0, - 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xf6, 0x0, 0x0, 0x1, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, - 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x7, 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, - 0x88, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0xef, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, - 0x0, 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0xd, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x40, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0xcf, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf3, - - /* U+0042 "B" */ - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x60, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x50, 0x0, 0xaf, 0xfd, 0x99, 0x99, - 0x99, 0x9a, 0xdf, 0xff, 0xf6, 0x0, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x40, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x60, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x10, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, - 0xf9, 0x0, 0xaf, 0xfd, 0x99, 0x99, 0x99, 0x9a, - 0xdf, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x14, 0xaf, - 0xff, 0x80, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf2, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xf9, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf6, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3d, 0xff, 0xf1, 0xaf, 0xfd, - 0x99, 0x99, 0x99, 0x99, 0xad, 0xff, 0xff, 0x60, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe5, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xed, 0xa5, 0x0, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xd9, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xfe, 0xde, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x7f, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x5b, - 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xe4, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xeb, 0x0, 0x1e, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x5, 0xff, 0xfe, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x7, 0xff, - 0xff, 0xa4, 0x0, 0x0, 0x5, 0xbf, 0xff, 0xa0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, - 0xff, 0xc1, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x17, 0xbd, 0xff, 0xed, 0x95, 0x0, 0x0, - - /* U+0044 "D" */ - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x40, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0xaf, 0xfe, - 0xcc, 0xcc, 0xcc, 0xde, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x16, - 0xdf, 0xff, 0xd1, 0x0, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0xaf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x70, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xe0, 0xaf, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xf9, 0xaf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xfd, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xfd, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0xaf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf5, 0xaf, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x70, 0xaf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0xd1, - 0x0, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xce, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x40, 0x0, - 0x0, 0x0, - - /* U+0045 "E" */ - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0x2a, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xdb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xb8, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xc7, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x9a, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, - - /* U+0046 "F" */ - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0x2a, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0x90, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xa, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xda, - 0x61, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xfe, 0xde, 0xff, 0xff, 0xfe, - 0x30, 0x0, 0x7, 0xff, 0xff, 0xb4, 0x0, 0x0, - 0x4, 0x9f, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xe4, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xcd, 0x10, 0x1, - 0xef, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, - 0x10, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf0, 0x5f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x2f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf0, 0x8, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, - 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf0, 0x0, 0x4f, 0xff, 0xe4, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, 0x6, - 0xff, 0xff, 0xb4, 0x0, 0x0, 0x3, 0x8f, 0xff, - 0xf0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0xde, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xda, 0x61, - 0x0, 0x0, - - /* U+0048 "H" */ - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfa, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xef, 0xfa, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xfa, - - /* U+0049 "I" */ - 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, - 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, - 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, - 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, - 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, - 0xaf, 0xf9, 0xaf, 0xf9, - - /* U+004A "J" */ - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xc, 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, - 0x3e, 0x40, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x1e, - 0xff, 0x81, 0x0, 0x5, 0xff, 0xf8, 0x0, 0xaf, - 0xff, 0xfd, 0xce, 0xff, 0xfe, 0x10, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x28, - 0xce, 0xfe, 0xb6, 0x0, 0x0, - - /* U+004B "K" */ - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xd1, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfd, 0x10, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xd1, 0x0, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x10, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe2, - 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0xbf, - 0xfe, 0x20, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, - 0xb, 0xff, 0xe2, 0x0, 0x0, 0x0, 0xaf, 0xf9, - 0x0, 0x0, 0xaf, 0xfe, 0x30, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0xa, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf9, 0x0, 0xaf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0xa, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, - 0xaf, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xf7, 0xef, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x3f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf5, 0x0, - 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0x60, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf5, - 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x30, 0x0, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xe1, 0x0, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xb0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf8, - - /* U+004C "L" */ - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc8, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+004D "M" */ - 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0x2a, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf2, 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x2a, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf2, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x2a, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xf2, 0xaf, 0xfb, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xce, 0xff, 0x2a, - 0xff, 0x7b, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf2, 0xef, 0xf2, 0xaf, 0xf7, 0x1f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0xe, 0xff, - 0x2a, 0xff, 0x70, 0x7f, 0xfb, 0x0, 0x0, 0x0, - 0x2f, 0xfe, 0x0, 0xef, 0xf2, 0xaf, 0xf7, 0x0, - 0xdf, 0xf5, 0x0, 0x0, 0xb, 0xff, 0x50, 0xe, - 0xff, 0x2a, 0xff, 0x70, 0x3, 0xff, 0xe0, 0x0, - 0x4, 0xff, 0xb0, 0x0, 0xef, 0xf3, 0xaf, 0xf7, - 0x0, 0xa, 0xff, 0x80, 0x0, 0xdf, 0xf2, 0x0, - 0xe, 0xff, 0x3a, 0xff, 0x70, 0x0, 0x1e, 0xff, - 0x20, 0x8f, 0xf8, 0x0, 0x0, 0xef, 0xf3, 0xaf, - 0xf7, 0x0, 0x0, 0x6f, 0xfb, 0x2f, 0xfe, 0x0, - 0x0, 0xe, 0xff, 0x3a, 0xff, 0x70, 0x0, 0x0, - 0xcf, 0xfd, 0xff, 0x50, 0x0, 0x0, 0xef, 0xf3, - 0xaf, 0xf7, 0x0, 0x0, 0x3, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0xe, 0xff, 0x3a, 0xff, 0x70, 0x0, - 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xef, - 0xf3, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x1e, 0xf7, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x3a, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf3, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x3a, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf3, - - /* U+004E "N" */ - 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfa, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, - 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfa, 0xaf, 0xfe, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0xbf, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, - 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x9f, 0xfa, - 0xaf, 0xf9, 0x2, 0xef, 0xfd, 0x10, 0x0, 0x0, - 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x4f, 0xff, 0xb0, - 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x6, - 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, - 0x0, 0x0, 0x9f, 0xff, 0x60, 0x0, 0x9f, 0xfa, - 0xaf, 0xf9, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, - 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x1, 0xef, - 0xfe, 0x10, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xd0, 0x9f, 0xfa, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x9f, 0xfa, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xef, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xfa, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfa, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfa, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xfa, - - /* U+004F "O" */ - 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xda, - 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0xde, - 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xfa, 0x40, 0x0, 0x0, 0x4b, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x4f, 0xff, 0xe4, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xef, 0xff, 0x30, 0x0, 0xe, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xfd, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, - 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xc0, 0x2f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf3, 0x7f, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0x47, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, 0x5f, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0x32, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, 0xe, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xfc, 0x0, 0x8f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x60, - 0x0, 0xef, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xfe, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xf3, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xa4, 0x0, 0x0, - 0x4, 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, 0xe4, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x16, 0xad, 0xff, 0xfd, 0xa6, 0x10, - 0x0, 0x0, 0x0, - - /* U+0050 "P" */ - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x40, 0x0, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, - 0xdf, 0xff, 0xff, 0x70, 0xa, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x5, 0xdf, 0xff, 0x40, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0xa, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf2, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x5a, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf6, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x5a, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0xaf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, - 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, 0xdf, - 0xff, 0x40, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xdf, - 0xff, 0xff, 0x70, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x40, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xec, 0x94, 0x0, 0x0, 0xa, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xda, - 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, - 0xde, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x5, 0xbf, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe4, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, - 0x0, 0x0, 0xef, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xd0, 0x0, 0x7, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf5, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x0, - 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x0, 0x5f, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x30, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x7f, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x50, 0x5f, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x30, 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, 0xe, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfc, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, - 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, - 0xd3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, 0x93, 0x0, - 0x0, 0x3, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xec, 0xbc, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xff, - 0xfe, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0x60, 0x0, - 0x0, 0x8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfa, 0x30, 0x14, 0xcf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x67, 0x74, 0x0, 0x0, - - /* U+0052 "R" */ - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x40, 0x0, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, - 0xdf, 0xff, 0xff, 0x70, 0xa, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x5, 0xdf, 0xff, 0x40, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0xa, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf2, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x5a, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf6, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x5a, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0xaf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, - 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, 0xdf, - 0xff, 0x40, 0xaf, 0xfd, 0xbb, 0xbb, 0xbb, 0xcf, - 0xff, 0xff, 0x70, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x40, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xa, 0xff, - 0x90, 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe1, - 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xb0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x60, 0xa, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x20, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0xa, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xf7, - - /* U+0053 "S" */ - 0x0, 0x0, 0x16, 0xbd, 0xef, 0xed, 0xa6, 0x10, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x20, 0x0, 0xbf, 0xff, 0xfd, 0xbb, 0xce, - 0xff, 0xff, 0x60, 0x7, 0xff, 0xf9, 0x10, 0x0, - 0x0, 0x27, 0xde, 0x0, 0xd, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xfc, 0x84, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfc, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, - 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x48, 0xcf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x7f, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf7, 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf4, 0x5f, 0xfe, 0x83, 0x0, 0x0, 0x0, - 0x5e, 0xff, 0xd0, 0x4e, 0xff, 0xff, 0xfd, 0xbb, - 0xcf, 0xff, 0xfe, 0x20, 0x1, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x1, 0x59, - 0xce, 0xff, 0xec, 0x83, 0x0, 0x0, - - /* U+0054 "T" */ - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0xac, 0xcc, 0xcc, 0xcc, 0xff, - 0xfc, 0xcc, 0xcc, 0xcc, 0x80, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, - 0x0, - - /* U+0055 "U" */ - 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, - 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, - 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, - 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf1, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf0, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x7f, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xb0, - 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0x70, 0xb, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x10, 0x2, 0xff, 0xff, 0x71, - 0x0, 0x0, 0x5d, 0xff, 0xf6, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe6, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xef, 0xfd, - 0xa6, 0x0, 0x0, 0x0, - - /* U+0056 "V" */ - 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xf9, 0x5, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, - 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xb0, 0x0, 0x7f, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x30, - 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x9, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, - 0x0, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xaf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0x2, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf8, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0xf, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0x70, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0xef, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf5, 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0xc, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+0057 "W" */ - 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xfd, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x80, 0x1f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf2, 0x0, 0xcf, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x7, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, - 0x1f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xfa, - 0x9f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, - 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x9, - 0xff, 0x53, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4f, - 0xfc, 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0xff, 0xf0, 0xe, 0xff, 0x30, 0x0, 0x0, - 0x9, 0xff, 0x70, 0x0, 0x0, 0x1f, 0xff, 0x30, - 0x0, 0x0, 0x5f, 0xfa, 0x0, 0x8f, 0xf8, 0x0, - 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, 0xbf, - 0xf8, 0x0, 0x0, 0xa, 0xff, 0x40, 0x3, 0xff, - 0xd0, 0x0, 0x0, 0x4f, 0xfc, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xd0, 0x0, 0x0, 0xff, 0xe0, 0x0, - 0xd, 0xff, 0x30, 0x0, 0xa, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, 0x6f, 0xf9, - 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0xb, - 0xff, 0x30, 0x0, 0x2, 0xff, 0xe0, 0x0, 0x5f, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, - 0x1, 0xff, 0xe0, 0x0, 0x0, 0xc, 0xff, 0x40, - 0xa, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x30, 0x6f, 0xf8, 0x0, 0x0, 0x0, 0x7f, - 0xf9, 0x0, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xf9, 0xc, 0xff, 0x30, 0x0, 0x0, - 0x1, 0xff, 0xe0, 0x5f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xe2, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x4b, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xbf, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, - - /* U+0058 "X" */ - 0xb, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0x30, 0x1, 0xef, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xf6, 0x0, 0x0, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xa0, - 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xfd, - 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xa0, 0x0, 0x1e, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x27, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xdf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x5d, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf9, 0x2, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xc0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0xa, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, - 0x0, 0x0, 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf4, 0x0, 0x7, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x10, 0x3f, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xb0, - - /* U+0059 "Y" */ - 0xc, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xf8, 0x3, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x9f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0x40, 0x0, 0xe, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xfa, 0x0, 0x0, 0x5, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, - 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xe0, 0x0, 0x1, 0xef, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x9, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x20, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xc0, 0xdf, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfc, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, - - /* U+005A "Z" */ - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x4c, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xef, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, - - /* U+005B "[" */ - 0xaf, 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xf0, - 0xaf, 0xfb, 0x88, 0x80, 0xaf, 0xf7, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xfb, 0x88, 0x80, - 0xaf, 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xf0, - - /* U+005C "\\" */ - 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xe0, - - /* U+005D "]" */ - 0x6f, 0xff, 0xff, 0xf4, 0x6f, 0xff, 0xff, 0xf4, - 0x38, 0x88, 0xef, 0xf4, 0x0, 0x0, 0xcf, 0xf4, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, - 0x0, 0x0, 0xcf, 0xf4, 0x38, 0x88, 0xef, 0xf4, - 0x6f, 0xff, 0xff, 0xf4, 0x6f, 0xff, 0xff, 0xf4, - - /* U+005E "^" */ - 0x0, 0x0, 0x2, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xfe, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xfe, 0x3f, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0xef, 0x70, 0xcf, 0x90, 0x0, 0x0, 0x0, 0x5f, - 0xf1, 0x6, 0xff, 0x0, 0x0, 0x0, 0xc, 0xfa, - 0x0, 0xe, 0xf6, 0x0, 0x0, 0x3, 0xff, 0x30, - 0x0, 0x8f, 0xd0, 0x0, 0x0, 0xaf, 0xc0, 0x0, - 0x1, 0xff, 0x40, 0x0, 0x1f, 0xf5, 0x0, 0x0, - 0xa, 0xfb, 0x0, 0x8, 0xfe, 0x0, 0x0, 0x0, - 0x4f, 0xf2, 0x0, 0xef, 0x70, 0x0, 0x0, 0x0, - 0xdf, 0x90, 0x6f, 0xf1, 0x0, 0x0, 0x0, 0x6, - 0xff, 0x10, - - /* U+005F "_" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - - /* U+0060 "`" */ - 0x8, 0xff, 0xf3, 0x0, 0x0, 0x4, 0xef, 0xf4, - 0x0, 0x0, 0x1, 0xcf, 0xf6, 0x0, 0x0, 0x0, - 0x8f, 0xf7, - - /* U+0061 "a" */ - 0x0, 0x2, 0x8b, 0xef, 0xfe, 0xb6, 0x0, 0x0, - 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0xb, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, 0x20, - 0x2, 0xfa, 0x30, 0x0, 0x0, 0x3e, 0xff, 0xb0, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, - 0x0, 0x5, 0xad, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xb, 0xff, 0xe8, 0x43, 0x33, 0x33, 0xcf, 0xf5, - 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xf5, - 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, - 0x5f, 0xfc, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, - 0x2f, 0xff, 0x30, 0x0, 0x0, 0x2d, 0xff, 0xf5, - 0xa, 0xff, 0xe8, 0x43, 0x49, 0xff, 0xff, 0xf5, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xf5, - 0x0, 0x5, 0xbe, 0xff, 0xda, 0x40, 0x9f, 0xf5, - - /* U+0062 "b" */ - 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf0, 0x4, 0x9d, 0xff, - 0xda, 0x40, 0x0, 0x0, 0x1f, 0xff, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x1, 0xff, 0xfc, - 0xff, 0xfc, 0xbc, 0xff, 0xff, 0xe3, 0x0, 0x1f, - 0xff, 0xff, 0x91, 0x0, 0x0, 0x6f, 0xff, 0xd1, - 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x90, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x1, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xf4, 0x1f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x61, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, - 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x61, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf4, 0x1f, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x1, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x1f, 0xff, - 0xff, 0x91, 0x0, 0x0, 0x6f, 0xff, 0xd1, 0x1, - 0xff, 0xec, 0xff, 0xfc, 0xbc, 0xff, 0xff, 0xf3, - 0x0, 0x1f, 0xfd, 0x1b, 0xff, 0xff, 0xff, 0xff, - 0xc2, 0x0, 0x1, 0xff, 0xd0, 0x4, 0xad, 0xff, - 0xda, 0x40, 0x0, 0x0, - - /* U+0063 "c" */ - 0x0, 0x0, 0x4, 0x9d, 0xff, 0xdb, 0x61, 0x0, - 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xe5, - 0x0, 0x0, 0x3f, 0xff, 0xfe, 0xcb, 0xdf, 0xff, - 0xf6, 0x0, 0x1e, 0xff, 0xe5, 0x0, 0x0, 0x2a, - 0xff, 0xe0, 0xb, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x9, 0xa1, 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x9, 0xa1, 0x0, 0x1e, - 0xff, 0xe5, 0x0, 0x0, 0x2a, 0xff, 0xe0, 0x0, - 0x3f, 0xff, 0xfe, 0xcb, 0xdf, 0xff, 0xf5, 0x0, - 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x0, 0x0, 0x4, 0x9d, 0xff, 0xeb, 0x61, 0x0, - 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, - 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x20, 0x2f, 0xfe, - 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x2f, - 0xfe, 0x0, 0x5f, 0xff, 0xfe, 0xcb, 0xdf, 0xff, - 0xcf, 0xfe, 0x2, 0xff, 0xfe, 0x50, 0x0, 0x2, - 0xbf, 0xff, 0xfe, 0xc, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xfe, 0x2f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x7f, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x9f, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0xaf, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, - 0x9f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xfe, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xfe, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xfe, 0xc, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfe, 0x2, 0xff, 0xfc, 0x20, - 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x0, 0x5f, 0xff, - 0xfb, 0x98, 0xaf, 0xff, 0xcf, 0xfe, 0x0, 0x3, - 0xdf, 0xff, 0xff, 0xff, 0xfa, 0x1f, 0xfe, 0x0, - 0x0, 0x6, 0xbe, 0xff, 0xd9, 0x30, 0xf, 0xfe, - - /* U+0065 "e" */ - 0x0, 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x40, 0x0, - 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfb, - 0x10, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x9a, 0xcf, - 0xff, 0xe1, 0x0, 0x2, 0xff, 0xf9, 0x10, 0x0, - 0x2, 0xcf, 0xfc, 0x0, 0xb, 0xff, 0x80, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x60, 0x2f, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x7f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x9f, 0xf9, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x30, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x1, 0x80, 0x0, 0x2, 0xef, 0xfe, - 0x50, 0x0, 0x0, 0x5d, 0xf8, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xcb, 0xce, 0xff, 0xfc, 0x0, 0x0, - 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x4, 0x9d, 0xff, 0xec, 0x83, 0x0, - 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x1, 0x9d, 0xff, 0xd7, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, - 0xfe, 0x99, 0xdd, 0x0, 0x0, 0x5f, 0xfe, 0x10, - 0x0, 0x10, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0x60, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x4, 0x88, 0xdf, 0xfb, 0x88, 0x88, - 0x20, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf7, 0x0, 0x0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x0, 0x5, 0xad, 0xff, 0xd9, 0x40, 0xc, - 0xff, 0x20, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0xcf, 0xf2, 0x0, 0x7f, 0xff, 0xfe, 0xbb, - 0xcf, 0xff, 0xdd, 0xff, 0x20, 0x4f, 0xff, 0xc3, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, 0xd, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x24, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xf2, 0x8f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x2a, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf2, 0xaf, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x28, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, 0x4f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x20, 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf2, 0x4, 0xff, 0xfd, 0x40, 0x0, 0x1, - 0x7f, 0xff, 0xff, 0x20, 0x6, 0xff, 0xff, 0xec, - 0xbc, 0xff, 0xfd, 0xff, 0xf2, 0x0, 0x4, 0xef, - 0xff, 0xff, 0xff, 0xfb, 0x1f, 0xff, 0x20, 0x0, - 0x0, 0x6b, 0xef, 0xfd, 0x94, 0x0, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xc0, 0x0, 0x64, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xf7, 0x0, 0x2f, 0xfb, 0x50, - 0x0, 0x0, 0x5, 0xef, 0xfe, 0x0, 0x7, 0xff, - 0xff, 0xfd, 0xbb, 0xcf, 0xff, 0xff, 0x40, 0x0, - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, - 0x0, 0x0, 0x0, 0x38, 0xbd, 0xff, 0xed, 0xa5, - 0x0, 0x0, 0x0, - - /* U+0068 "h" */ - 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x0, 0x4a, 0xdf, 0xfd, 0xa3, 0x0, 0x0, - 0x1f, 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x1f, 0xff, 0xdf, 0xff, 0xcc, 0xdf, 0xff, - 0xf9, 0x0, 0x1f, 0xff, 0xff, 0x60, 0x0, 0x2, - 0xcf, 0xff, 0x30, 0x1f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x90, 0x1f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xd0, 0x1f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x1f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, - 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, - - /* U+0069 "i" */ - 0x1b, 0xfb, 0x8, 0xff, 0xf6, 0x8f, 0xff, 0x61, - 0xbe, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x1, 0xff, - 0xf0, 0x1f, 0xff, 0x1, 0xff, 0xf0, 0x1f, 0xff, - 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x1, 0xff, 0xf0, - 0x1f, 0xff, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x1, - 0xff, 0xf0, 0x1f, 0xff, 0x1, 0xff, 0xf0, 0x1f, - 0xff, 0x1, 0xff, 0xf0, - - /* U+006A "j" */ - 0x0, 0x0, 0x0, 0xaf, 0xc1, 0x0, 0x0, 0x5, - 0xff, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0xae, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, - 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, - 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, - 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, - 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, - 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, - 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, - 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, - 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, - 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, - 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, - 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x1, - 0xff, 0xf0, 0x2, 0x0, 0x8, 0xff, 0xd0, 0x5f, - 0xb9, 0xcf, 0xff, 0x70, 0xbf, 0xff, 0xff, 0xfb, - 0x0, 0x4a, 0xdf, 0xfc, 0x60, 0x0, - - /* U+006B "k" */ - 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x60, - 0x1f, 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf6, - 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x60, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x9, 0xff, - 0xf6, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0xaf, - 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x0, 0xb, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x1, - 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x1d, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xef, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xe6, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xfd, 0x20, 0x6f, 0xff, 0x80, - 0x0, 0x0, 0x1f, 0xff, 0xc1, 0x0, 0x9, 0xff, - 0xf5, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x20, 0x0, 0x1f, 0xff, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xd0, 0x0, 0x1f, 0xff, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x1f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x1f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, - - /* U+006C "l" */ - 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, - 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, - 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, - 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, - 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, - 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, - - /* U+006D "m" */ - 0x1f, 0xfd, 0x0, 0x6b, 0xef, 0xec, 0x71, 0x0, - 0x0, 0x49, 0xde, 0xfe, 0xa4, 0x0, 0x0, 0x1f, - 0xfd, 0x3d, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1b, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1f, 0xfe, - 0xef, 0xfc, 0xa9, 0xcf, 0xff, 0xf5, 0xdf, 0xff, - 0xb9, 0xae, 0xff, 0xfb, 0x0, 0x1f, 0xff, 0xfd, - 0x30, 0x0, 0x3, 0xef, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x8f, 0xff, 0x50, 0x1f, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xb0, 0x1f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xe0, 0x1f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, - 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf1, 0x1f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf1, 0x1f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf1, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xf1, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, - 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, - - /* U+006E "n" */ - 0x1f, 0xfd, 0x0, 0x5a, 0xdf, 0xfd, 0xa3, 0x0, - 0x0, 0x1f, 0xfd, 0x2d, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x1f, 0xfe, 0xef, 0xfd, 0xa9, 0xbf, - 0xff, 0xf9, 0x0, 0x1f, 0xff, 0xfe, 0x40, 0x0, - 0x0, 0xaf, 0xff, 0x30, 0x1f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x90, 0x1f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, 0x1f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x1f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, - 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, - 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf0, - - /* U+006F "o" */ - 0x0, 0x0, 0x4, 0xad, 0xff, 0xeb, 0x60, 0x0, - 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfe, - 0x50, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xcb, 0xdf, - 0xff, 0xf8, 0x0, 0x2, 0xef, 0xfe, 0x50, 0x0, - 0x2, 0xbf, 0xff, 0x50, 0xb, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf1, 0x2f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, 0x6f, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x9f, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, - 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xfe, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xfb, 0x2f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf7, 0xb, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf1, 0x1, 0xef, 0xfe, - 0x40, 0x0, 0x2, 0xbf, 0xff, 0x50, 0x0, 0x4f, - 0xff, 0xfe, 0xbb, 0xdf, 0xff, 0xf8, 0x0, 0x0, - 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, - 0x0, 0x0, 0x4, 0xad, 0xff, 0xeb, 0x60, 0x0, - 0x0, - - /* U+0070 "p" */ - 0x1f, 0xfd, 0x0, 0x4a, 0xdf, 0xfd, 0xa4, 0x0, - 0x0, 0x1, 0xff, 0xd1, 0xcf, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x1f, 0xfe, 0xdf, 0xfe, 0xa8, - 0x9d, 0xff, 0xfe, 0x30, 0x1, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x4, 0xef, 0xfd, 0x10, 0x1f, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf9, 0x1, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x41, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xf6, 0x1f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0x71, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf6, 0x1f, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x41, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf0, 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf9, 0x1, 0xff, 0xff, 0xf9, 0x10, - 0x0, 0x6, 0xff, 0xfd, 0x10, 0x1f, 0xff, 0xbf, - 0xff, 0xcb, 0xcf, 0xff, 0xff, 0x30, 0x1, 0xff, - 0xf0, 0xaf, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, - 0x1f, 0xff, 0x0, 0x39, 0xdf, 0xfd, 0xa4, 0x0, - 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x30, 0xf, - 0xfe, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf9, - 0xf, 0xfe, 0x0, 0x5f, 0xff, 0xfe, 0xcb, 0xdf, - 0xff, 0xaf, 0xfe, 0x2, 0xff, 0xfe, 0x50, 0x0, - 0x2, 0xbf, 0xff, 0xfe, 0xc, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xfe, 0x2f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x7f, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x9f, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, - 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xfe, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xfe, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xfe, 0x2f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xfe, 0xc, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xfe, 0x2, 0xff, 0xfe, - 0x40, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0x0, 0x5f, - 0xff, 0xfe, 0xbb, 0xdf, 0xff, 0xbf, 0xfe, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xfe, - 0x0, 0x0, 0x6, 0xbe, 0xff, 0xd8, 0x20, 0x2f, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, - - /* U+0072 "r" */ - 0x1f, 0xfd, 0x0, 0x5a, 0xdf, 0x1, 0xff, 0xd1, - 0xbf, 0xff, 0xf0, 0x1f, 0xfd, 0xcf, 0xff, 0xfe, - 0x1, 0xff, 0xff, 0xf9, 0x30, 0x0, 0x1f, 0xff, - 0xf5, 0x0, 0x0, 0x1, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x1, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xd9, 0x50, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0xdf, 0xff, 0xdb, 0xaa, 0xdf, 0xff, 0x10, - 0x6, 0xff, 0xe3, 0x0, 0x0, 0x1, 0x87, 0x0, - 0xa, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf7, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xfd, 0xa7, 0x40, 0x0, 0x0, - 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, - 0x0, 0x0, 0x15, 0x9c, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x6e, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, - 0x6, 0xf9, 0x30, 0x0, 0x0, 0xa, 0xff, 0xd0, - 0xe, 0xff, 0xff, 0xca, 0xac, 0xff, 0xff, 0x50, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x5, 0x9c, 0xef, 0xfe, 0xb7, 0x10, 0x0, - - /* U+0074 "t" */ - 0x0, 0x5, 0x88, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x48, - 0x8d, 0xff, 0xb8, 0x88, 0x82, 0x0, 0x0, 0xaf, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xfe, 0x10, 0x0, 0x20, 0x0, 0x1, 0xff, - 0xff, 0xaa, 0xdd, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x3, 0xae, 0xff, 0xc6, - 0x0, - - /* U+0075 "u" */ - 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xb4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xfb, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xb4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xfb, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xb4, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xfb, 0x4f, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xb4, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xfb, 0x4f, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xb3, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x3f, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xb1, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0xd, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xb0, 0x7f, - 0xff, 0x60, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x0, - 0xcf, 0xff, 0xd9, 0x9a, 0xef, 0xfd, 0xff, 0xb0, - 0x1, 0xbf, 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xfb, - 0x0, 0x0, 0x4a, 0xef, 0xfd, 0x93, 0x3, 0xff, - 0xb0, - - /* U+0076 "v" */ - 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xb0, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf4, 0x0, 0xef, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x8, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0x60, 0x0, 0x1f, - 0xff, 0x10, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, - 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x8f, 0xf8, - 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0xe, - 0xff, 0x10, 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, - 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5f, 0xfc, - 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf3, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0x90, 0xa, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x12, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x8f, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, - 0x0, 0x0, - - /* U+0077 "w" */ - 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x64, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf0, 0xe, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x1f, 0xfa, 0x0, 0x8f, 0xf6, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x7, - 0xff, 0x40, 0x2, 0xff, 0xb0, 0x0, 0x0, 0x8, - 0xff, 0xbf, 0xf6, 0x0, 0x0, 0x0, 0xdf, 0xe0, - 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, 0xef, 0xd1, - 0xff, 0xc0, 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, - 0x6f, 0xf7, 0x0, 0x0, 0x4f, 0xf7, 0xb, 0xff, - 0x20, 0x0, 0x9, 0xff, 0x20, 0x0, 0x1, 0xff, - 0xd0, 0x0, 0xa, 0xff, 0x10, 0x4f, 0xf8, 0x0, - 0x0, 0xef, 0xc0, 0x0, 0x0, 0xa, 0xff, 0x30, - 0x1, 0xff, 0xb0, 0x0, 0xef, 0xe0, 0x0, 0x5f, - 0xf6, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x7f, - 0xf5, 0x0, 0x8, 0xff, 0x40, 0xb, 0xff, 0x10, - 0x0, 0x0, 0x0, 0xef, 0xe0, 0xd, 0xfe, 0x0, - 0x0, 0x2f, 0xf9, 0x1, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x43, 0xff, 0x80, 0x0, 0x0, - 0xcf, 0xf0, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xfa, 0x9f, 0xf2, 0x0, 0x0, 0x6, 0xff, - 0x5d, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xfe, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, - - /* U+0078 "x" */ - 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, 0xff, - 0x70, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xaf, - 0xfb, 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x6, - 0xff, 0xd1, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, - 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, 0xcf, 0xf9, - 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0x6a, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xdf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x16, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, - 0x0, 0xaf, 0xfb, 0x0, 0x0, 0x0, 0xd, 0xff, - 0x80, 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x9f, - 0xfc, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, 0x6, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x20, - 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xc0, - - /* U+0079 "y" */ - 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xb0, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf3, 0x0, 0xef, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x7, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, 0x0, 0x1f, - 0xff, 0x20, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, - 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xf7, - 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0xe, - 0xff, 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, - 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xfe, - 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf5, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xc0, 0xb, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x32, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x9f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x73, 0x0, 0x4, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, - 0xab, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xae, 0xfe, 0xb5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x38, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x48, - 0x88, 0x88, 0x88, 0x88, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xb8, 0x88, 0x88, 0x88, 0x88, - 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - - /* U+007B "{" */ - 0x0, 0x0, 0x6, 0xcf, 0xfa, 0x0, 0x0, 0x9f, - 0xff, 0xfa, 0x0, 0x3, 0xff, 0xfd, 0x95, 0x0, - 0x7, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, 0x80, - 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, - 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, - 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, - 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, - 0x9, 0xff, 0x70, 0x0, 0x0, 0xa, 0xff, 0x60, - 0x0, 0x0, 0x2e, 0xff, 0x40, 0x0, 0x2f, 0xff, - 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, - 0x18, 0xaf, 0xff, 0x20, 0x0, 0x0, 0xb, 0xff, - 0x60, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, - 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, - 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, - 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, - 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, - 0x80, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, - 0x3, 0xff, 0xfd, 0x85, 0x0, 0x0, 0xaf, 0xff, - 0xfa, 0x0, 0x0, 0x6, 0xcf, 0xfa, - - /* U+007C "|" */ - 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, - 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, - 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, - 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, - 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, - 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, - 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, - 0xaf, 0xf3, 0xaf, 0xf3, - - /* U+007D "}" */ - 0x6f, 0xfd, 0x80, 0x0, 0x0, 0x6f, 0xff, 0xfc, - 0x0, 0x0, 0x38, 0xcf, 0xff, 0x70, 0x0, 0x0, - 0x9, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xd0, - 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, - 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, - 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, - 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, - 0x3, 0xff, 0xe0, 0x0, 0x0, 0x2, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf6, 0x0, 0x0, 0x2d, 0xff, 0xf6, - 0x0, 0x0, 0xef, 0xfc, 0x83, 0x0, 0x2, 0xff, - 0xf0, 0x0, 0x0, 0x2, 0xff, 0xe0, 0x0, 0x0, - 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, - 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, - 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, - 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x4, 0xff, - 0xd0, 0x0, 0x0, 0x9, 0xff, 0xc0, 0x0, 0x38, - 0xbf, 0xff, 0x70, 0x0, 0x6f, 0xff, 0xfd, 0x0, - 0x0, 0x6f, 0xfd, 0x81, 0x0, 0x0, - - /* U+007E "~" */ - 0x0, 0x1, 0x44, 0x10, 0x0, 0x0, 0x1, 0x54, - 0x0, 0x6f, 0xff, 0xf9, 0x0, 0x0, 0x5, 0xfb, - 0x4, 0xff, 0xff, 0xff, 0xd2, 0x0, 0xa, 0xf8, - 0xb, 0xfd, 0x20, 0x7f, 0xfe, 0x62, 0x7f, 0xf3, - 0xf, 0xf3, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xa0, - 0x1f, 0xf0, 0x0, 0x0, 0x7, 0xdf, 0xe8, 0x0, - - /* U+00B0 "°" */ - 0x0, 0x18, 0xdf, 0xea, 0x30, 0x0, 0x2e, 0xfe, - 0xbd, 0xff, 0x60, 0xd, 0xf7, 0x0, 0x3, 0xef, - 0x34, 0xfa, 0x0, 0x0, 0x4, 0xfb, 0x7f, 0x50, - 0x0, 0x0, 0xf, 0xe7, 0xf5, 0x0, 0x0, 0x0, - 0xfe, 0x4f, 0xa0, 0x0, 0x0, 0x4f, 0xb0, 0xdf, - 0x70, 0x0, 0x3e, 0xf3, 0x2, 0xef, 0xec, 0xdf, - 0xf7, 0x0, 0x1, 0x8d, 0xfe, 0xa3, 0x0, - - /* U+2022 "•" */ - 0x5, 0xbb, 0x50, 0x5f, 0xff, 0xf5, 0xcf, 0xff, - 0xfc, 0xdf, 0xff, 0xfd, 0x7f, 0xff, 0xf7, 0x8, - 0xee, 0x80, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9d, 0xd4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x7b, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x48, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x16, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb6, 0x20, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfe, 0xa5, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x3a, 0xdf, 0xfd, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0xa3, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3a, 0xdf, 0xfd, 0xa3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F008 "" */ - 0x8f, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf8, - 0xff, 0x20, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, - 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x2, 0xff, 0xfa, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0xaf, 0xff, 0x20, 0x2, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0x20, 0x2, 0xff, 0xfa, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0xaf, 0xff, 0x20, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, - 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x2, 0xff, - 0x8f, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf8, - - /* U+F00B "" */ - 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xd3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x3d, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0x4, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xd1, 0x1d, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x1, 0xcf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xfc, 0x10, 0x1e, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe1, 0xcf, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0xa, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xaa, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xa0, 0x9f, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xfc, 0x1e, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe1, 0x1, - 0xcf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xfc, 0x10, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x95, 0x0, 0x0, 0xef, 0xff, 0xf1, - 0x0, 0x3, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf3, 0x0, 0xe, 0xff, 0xff, 0x10, - 0x1, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xf1, 0x0, - 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0x10, 0xe, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xff, 0xb0, 0x0, 0xef, 0xff, 0xf1, 0x0, 0x9f, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xb0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x9f, - 0xff, 0xff, 0xc0, 0x0, 0x2f, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0x50, 0x9, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0xdf, - 0xff, 0xfc, 0x0, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xf1, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, - 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0xd, 0xff, - 0xff, 0x67, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf9, 0x9f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xca, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, - 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xda, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x8f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xb5, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x2f, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0x40, 0xcf, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xf0, 0x6, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0x20, 0x0, 0x5f, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0x80, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xfa, 0x20, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xc7, 0x64, 0x57, 0xbf, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x9a, - 0xba, 0x97, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x46, 0x77, - 0x64, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x91, 0x0, 0x19, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x2a, - 0x50, 0x0, 0x0, 0x3f, 0xff, 0x85, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x58, 0xff, 0xf3, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb3, 0x0, 0x3b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x3c, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xc3, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3c, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xc3, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb3, 0x0, 0x3b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x3f, 0xff, 0x85, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x58, 0xff, 0xf3, 0x0, 0x0, 0x5, - 0xa2, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa1, 0x0, 0x2a, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x46, - 0x77, 0x64, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8e, 0xe8, 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xc1, 0x0, 0x8, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xfe, 0x30, - 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xfc, 0xcf, 0xff, 0xff, 0x88, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x1a, 0xa1, - 0x3, 0xef, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc1, 0x2, - 0xdf, 0xfd, 0x20, 0x1c, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfa, - 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0xaf, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0x70, 0x7, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x7, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xf4, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x4f, 0xff, 0xff, 0xd2, 0x0, - 0x5, 0xff, 0xff, 0xfd, 0x20, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc1, 0x2, 0xdf, 0xff, - 0xff, 0x50, 0x7f, 0xff, 0xff, 0xb1, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x1c, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xf9, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xfd, 0x3f, 0xff, - 0x60, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x6, 0xff, 0xf3, - 0x6, 0xe4, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x4e, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2, 0xef, - 0xfe, 0x20, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2d, - 0xd2, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x61, - 0x16, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F01C "" */ - 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1e, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe1, 0x0, - 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xfa, 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x50, 0x1e, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe1, 0x9f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x57, - 0x75, 0x30, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, - 0xff, 0xff, 0xa4, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd5, 0x0, 0x5, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc2, 0x4, 0xff, 0xff, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa5, 0x20, - 0x2, 0x6b, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xd, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x8f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0x1, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x46, 0x54, 0x43, 0x5f, 0xff, 0xff, 0xff, - 0x7, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xb0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, - 0xff, 0xff, 0xff, 0xf5, 0x34, 0x45, 0x64, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xd0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0x30, 0x0, - 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xb6, 0x20, - 0x2, 0x5a, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0xff, 0xff, 0x40, 0x2c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x50, 0x0, 0x5d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x4a, 0xff, 0xff, - 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3, 0x67, - 0x76, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xe7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x8, 0xe7, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0x90, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xa, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xfb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xf, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xa, 0xf9, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3e, - 0xc2, 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x40, 0x0, 0xcf, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x2f, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfe, - 0x10, 0x9, 0xff, 0xb0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0x90, 0x1, 0xff, 0xf1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, - 0xf8, 0x0, 0x4, 0xff, 0xf1, 0x0, 0xcf, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xf, 0xff, 0xa0, 0x0, 0xcf, 0xf7, 0x0, - 0x7f, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x9, 0xff, 0xf5, 0x0, 0x6f, - 0xfb, 0x0, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xfb, - 0x0, 0x2f, 0xfe, 0x0, 0x1f, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x1f, 0xfe, 0x0, 0xf, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x1f, 0xfe, 0x0, 0xf, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x8f, 0xfb, 0x0, 0x2f, - 0xfe, 0x0, 0x2f, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, 0xff, 0xf5, - 0x0, 0x6f, 0xfb, 0x0, 0x3f, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, - 0xff, 0xa0, 0x0, 0xcf, 0xf7, 0x0, 0x7f, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x9, 0xf8, 0x0, 0x4, 0xff, 0xf1, 0x0, - 0xcf, 0xf6, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0x90, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xfe, 0x10, 0x9, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x40, 0x0, 0xcf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x4e, 0xc2, 0x0, - 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xce, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xfd, 0x88, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x88, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x88, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x33, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0x20, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0x70, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x6f, 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x1f, 0xff, 0xfb, 0x0, 0x4c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, - 0xff, 0xb0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0xcf, 0xff, 0xfe, 0x72, 0x3, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x16, 0xbd, 0xff, 0xdb, 0x61, 0x0, 0x0, 0x0, - - /* U+F048 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5e, 0xe5, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x83, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 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, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, - 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5e, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xef, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb2, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe5, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xee, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x7, 0xdf, 0xff, 0xff, 0xfd, 0x70, 0x0, 0x0, - 0x7, 0xdf, 0xff, 0xff, 0xfd, 0x70, - - /* U+F04D "" */ - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - - /* U+F051 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5e, 0xe5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfd, 0xef, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x38, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xef, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x5e, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xee, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x40, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x40, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xc5, 0x0, - - /* U+F054 "" */ - 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5c, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xfe, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xef, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F068 "" */ - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe4, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, - 0xef, 0xfe, 0xda, 0x73, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3d, 0xff, 0xff, 0xff, 0xb5, 0x20, 0x2, - 0x5b, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x4e, 0xfc, 0x70, 0x0, - 0xd, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x1f, 0xff, - 0xfd, 0x10, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0x30, 0xd, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x41, 0x17, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfe, - 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xf7, 0xc, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd0, 0x3, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0x30, 0x1, 0xcf, - 0xff, 0xff, 0xfc, 0x10, 0x3, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x6, 0xcf, 0xfc, 0x70, 0x0, 0xd, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, - 0x0, 0x3d, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xb5, - 0x20, 0x2, 0x5b, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, - 0xda, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x9, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x15, - 0x9c, 0xef, 0xfe, 0xda, 0x73, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xfa, 0x0, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xde, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc7, 0x30, 0x2, 0x5b, - 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xe4, - 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, - 0x30, 0x4e, 0xfc, 0x70, 0x0, 0xd, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xf7, 0x1f, 0xff, 0xfd, - 0x10, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x2, 0xf9, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xc2, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x7f, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x2, 0xdf, 0xff, 0xff, 0x70, 0x6f, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, - 0xb5, 0x20, 0x1, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, 0xca, - 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x90, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0x60, 0x0, 0x6, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0x40, 0x0, 0x4, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x5, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x33, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x33, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x3f, - 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf3, 0x2, 0xef, - 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0x40, 0x1e, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x1, 0xdf, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfd, - 0x10, 0x40, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xe1, - 0x4, 0xfa, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfe, 0x20, - 0x3f, 0xff, 0x90, 0x0, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x2, - 0xef, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xf9, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xf9, 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, 0xc, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf4, 0x0, - 0x8, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, 0x6f, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xf2, 0xbf, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xf6, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xd1, - 0x4, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xfd, 0x10, 0x0, 0x13, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x30, 0x0, - - /* U+F078 "" */ - 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x4, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xfd, 0x10, 0x4f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xd1, 0xbf, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf6, - 0x6f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf2, 0x8, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x8f, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xf9, 0xcf, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x50, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0xff, - 0xff, 0xef, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0xff, - 0xff, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x6, 0xb4, 0x0, 0xff, 0xff, 0x0, 0x4b, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xb4, 0x0, 0xff, 0xff, 0x0, 0x4b, 0x60, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0xff, - 0xff, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0xff, - 0xff, 0xef, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x5, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x8f, 0xff, - 0xff, 0xf8, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, - 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xea, 0x63, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xb8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x20, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xfe, - 0x20, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x71, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xfe, 0xec, 0xa8, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x0, 0x7, 0xcf, 0xfc, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4b, 0xff, 0xc5, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xfa, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xc0, 0xcf, 0xff, 0xb1, 0x1b, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc1, - 0xf, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xf0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc1, 0x0, 0xff, - 0xff, 0x10, 0x1, 0xff, 0xff, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0xc, 0xff, 0xfb, - 0x11, 0xbf, 0xff, 0xc0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xca, 0xff, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x9, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0xcf, 0xff, 0xb1, 0x1b, 0xff, 0xfc, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0xf, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xf0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0xff, - 0xff, 0x10, 0x1, 0xff, 0xff, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0xc, 0xff, 0xfb, - 0x11, 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xa0, 0x1, 0xdf, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xbf, 0xfc, 0x50, 0x0, - 0x0, 0x7c, 0xff, 0xc7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xf6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x40, 0x4, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x40, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - - /* U+F0C9 "" */ - 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x47, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x74, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F0E0 "" */ - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0xf6, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x6f, - 0xff, 0xa0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0xa, 0xff, - 0xff, 0xfd, 0x30, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xdf, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x4e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe4, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb1, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x10, 0x1b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x40, 0x7, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x4, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3e, 0xff, - 0xff, 0xe3, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x8e, - 0xe8, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, - 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x41, - 0x14, 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, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - - /* U+F0E7 "" */ - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfb, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf7, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0x80, 0x0, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xf8, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xe4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, - 0xff, 0xff, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, - 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xbf, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, - 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0x0, - 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, - 0x0, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, - 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x2f, 0xf2, 0x0, 0x2f, 0xf2, 0x0, 0x2f, - 0xf2, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0xf, 0xf0, 0x0, 0xf, 0xf0, - 0x0, 0xf, 0xf0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xf0, 0x0, - 0xf, 0xf0, 0x0, 0xf, 0xf0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x2f, - 0xf2, 0x0, 0x2f, 0xf2, 0x0, 0x2f, 0xf2, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x2, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x20, 0x2, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x2, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0x20, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9e, - 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F15B "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf7, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0x80, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x7a, 0xde, 0xff, 0xff, 0xed, - 0xa7, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x96, - 0x42, 0x10, 0x1, 0x24, 0x69, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x8e, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x7f, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, - 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfe, - 0x5f, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0xf5, 0x5, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x37, 0xbd, 0xef, 0xfe, 0xdb, - 0x73, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, - 0x0, 0x46, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, - 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfb, - 0x73, 0x20, 0x2, 0x37, 0xbf, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x9f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfb, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xbf, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - - /* U+F241 "" */ - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - - /* U+F242 "" */ - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - - /* U+F243 "" */ - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - - /* U+F244 "" */ - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xce, 0xef, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb5, - 0x5b, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xc0, 0x0, 0x1d, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf3, - 0x0, 0x0, 0x6, 0x85, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x64, 0x0, - 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4e, 0xff, 0xfd, 0x30, 0x0, 0x3, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7a, 0x10, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0xbf, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xf9, 0x12, 0x8f, - 0xf5, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0xaf, 0xff, 0xd3, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xbf, - 0xff, 0xff, 0xff, 0x92, 0x22, 0x22, 0x24, 0xef, - 0xc2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2a, - 0xff, 0xfd, 0x40, 0x3, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - 0x4, 0xef, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x56, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xa0, 0x0, 0x3a, 0xaa, 0xaa, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x40, 0x8, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0x76, 0xbf, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xcc, 0xef, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x4, 0x8c, 0xdf, 0xfe, 0xda, - 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xf4, 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xc, - 0xff, 0xff, 0xff, 0x90, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xe0, - 0x2f, 0xff, 0xff, 0xef, 0xff, 0xf4, 0x5, 0x20, - 0x1d, 0xff, 0xff, 0xf3, 0x6f, 0xff, 0xfc, 0x19, - 0xff, 0xf4, 0x6, 0xe2, 0x2, 0xef, 0xff, 0xf7, - 0x9f, 0xff, 0xf3, 0x0, 0x9f, 0xf4, 0x6, 0xfe, - 0x10, 0x3f, 0xff, 0xf9, 0xbf, 0xff, 0xfe, 0x20, - 0x9, 0xf4, 0x6, 0xf8, 0x0, 0xaf, 0xff, 0xfb, - 0xdf, 0xff, 0xff, 0xe2, 0x0, 0x94, 0x6, 0x80, - 0x9, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x1, 0x0, 0x7f, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xf7, - 0x0, 0x33, 0x4, 0x20, 0xc, 0xff, 0xff, 0xfe, - 0xcf, 0xff, 0xff, 0x70, 0x3, 0xe4, 0x6, 0xe2, - 0x0, 0xcf, 0xff, 0xfc, 0xaf, 0xff, 0xf7, 0x0, - 0x3f, 0xf4, 0x6, 0xfe, 0x10, 0x1e, 0xff, 0xfb, - 0x7f, 0xff, 0xf7, 0x3, 0xff, 0xf4, 0x6, 0xf8, - 0x0, 0x6f, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0x9f, - 0xff, 0xf4, 0x6, 0x80, 0x6, 0xff, 0xff, 0xf5, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x1, 0x0, - 0x6f, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x6, 0xff, 0xff, 0xff, 0xb0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xf5, 0x6, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x8c, 0xef, 0xff, 0xec, 0x83, 0x0, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xff, 0xff, 0xf3, 0x3f, 0xff, 0xf3, 0x3f, - 0xff, 0xf3, 0x3f, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, - 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, - 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, - 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, - 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, - 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, - 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, - 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, - 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, - 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, - 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, - 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, - 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, - 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, - 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xf3, 0x3f, 0xff, - 0xf3, 0x3f, 0xff, 0xf3, 0x3f, 0xff, 0xff, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6d, 0xfa, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8c, 0x10, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x10, 0x6f, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x10, - 0x6f, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, - 0x10, 0x6f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x6f, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xec, 0xa9, 0x75, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xaf, 0xff, - 0xff, 0xfa, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xaf, - 0xfa, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0xa, 0xa0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xa, - 0xa0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, - 0xff, 0xa0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xaf, 0xff, 0xff, 0xfa, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x8, 0xff, 0xf0, 0x0, 0xff, 0x0, 0xf, - 0xf0, 0x0, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xf0, - 0x0, 0xff, 0x0, 0xf, 0xf0, 0x0, 0xff, 0xff, - 0x8, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x0, 0xf, - 0xf0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf0, - 0x0, 0xff, 0x0, 0xf, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x0, 0xf, - 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0xff, 0x0, 0xf, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x2, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0xaf, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0x10, 0x1, 0xcf, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xf1, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x8f, 0xff, 0xff, 0x12, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x20, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 138, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 137, .box_w = 5, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 55, .adv_w = 200, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 13}, - {.bitmap_index = 96, .adv_w = 360, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 338, .adv_w = 318, .box_w = 18, .box_h = 30, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 608, .adv_w = 432, .box_w = 25, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 883, .adv_w = 351, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1125, .adv_w = 108, .box_w = 3, .box_h = 9, .ofs_x = 2, .ofs_y = 13}, - {.bitmap_index = 1139, .adv_w = 173, .box_w = 7, .box_h = 30, .ofs_x = 3, .ofs_y = -6}, - {.bitmap_index = 1244, .adv_w = 173, .box_w = 7, .box_h = 30, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 1349, .adv_w = 205, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 12}, - {.bitmap_index = 1427, .adv_w = 298, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 1532, .adv_w = 116, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 1555, .adv_w = 196, .box_w = 10, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 1570, .adv_w = 116, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1583, .adv_w = 180, .box_w = 14, .box_h = 30, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 1793, .adv_w = 342, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2002, .adv_w = 189, .box_w = 9, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2101, .adv_w = 294, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2299, .adv_w = 293, .box_w = 17, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2486, .adv_w = 343, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2717, .adv_w = 294, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2915, .adv_w = 316, .box_w = 18, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3113, .adv_w = 306, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3311, .adv_w = 330, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3520, .adv_w = 316, .box_w = 19, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3729, .adv_w = 116, .box_w = 5, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3772, .adv_w = 116, .box_w = 5, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 3827, .adv_w = 298, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 3940, .adv_w = 298, .box_w = 15, .box_h = 10, .ofs_x = 2, .ofs_y = 6}, - {.bitmap_index = 4015, .adv_w = 298, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 4128, .adv_w = 293, .box_w = 17, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4315, .adv_w = 529, .box_w = 31, .box_h = 28, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 4749, .adv_w = 375, .box_w = 25, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 5024, .adv_w = 388, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5244, .adv_w = 370, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5475, .adv_w = 423, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5717, .adv_w = 343, .box_w = 17, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5904, .adv_w = 325, .box_w = 17, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6091, .adv_w = 395, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6333, .adv_w = 416, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6553, .adv_w = 159, .box_w = 4, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6597, .adv_w = 263, .box_w = 15, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 6762, .adv_w = 368, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6982, .adv_w = 304, .box_w = 16, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7158, .adv_w = 489, .box_w = 25, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7433, .adv_w = 416, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7653, .adv_w = 430, .box_w = 25, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7928, .adv_w = 370, .box_w = 19, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8137, .adv_w = 430, .box_w = 26, .box_h = 27, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 8488, .adv_w = 372, .box_w = 19, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8697, .adv_w = 318, .box_w = 18, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8895, .adv_w = 301, .box_w = 19, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9104, .adv_w = 405, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9324, .adv_w = 365, .box_w = 24, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 9588, .adv_w = 577, .box_w = 35, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9973, .adv_w = 345, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10215, .adv_w = 331, .box_w = 22, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 10457, .adv_w = 336, .box_w = 20, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10677, .adv_w = 170, .box_w = 8, .box_h = 30, .ofs_x = 3, .ofs_y = -6}, - {.bitmap_index = 10797, .adv_w = 180, .box_w = 15, .box_h = 30, .ofs_x = -2, .ofs_y = -3}, - {.bitmap_index = 11022, .adv_w = 170, .box_w = 8, .box_h = 30, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 11142, .adv_w = 298, .box_w = 15, .box_h = 13, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 11240, .adv_w = 256, .box_w = 16, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11256, .adv_w = 307, .box_w = 9, .box_h = 4, .ofs_x = 3, .ofs_y = 19}, - {.bitmap_index = 11274, .adv_w = 306, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11410, .adv_w = 349, .box_w = 19, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11638, .adv_w = 292, .box_w = 17, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11783, .adv_w = 349, .box_w = 18, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11999, .adv_w = 313, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 12152, .adv_w = 181, .box_w = 13, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12308, .adv_w = 353, .box_w = 19, .box_h = 23, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 12527, .adv_w = 349, .box_w = 18, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12743, .adv_w = 143, .box_w = 5, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12803, .adv_w = 145, .box_w = 10, .box_h = 30, .ofs_x = -3, .ofs_y = -6}, - {.bitmap_index = 12953, .adv_w = 315, .box_w = 18, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13169, .adv_w = 143, .box_w = 4, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13217, .adv_w = 541, .box_w = 30, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13472, .adv_w = 349, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13625, .adv_w = 325, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 13778, .adv_w = 349, .box_w = 19, .box_h = 23, .ofs_x = 2, .ofs_y = -6}, - {.bitmap_index = 13997, .adv_w = 349, .box_w = 18, .box_h = 23, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 14204, .adv_w = 210, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14298, .adv_w = 257, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14434, .adv_w = 212, .box_w = 13, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14571, .adv_w = 347, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14716, .adv_w = 286, .box_w = 19, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 14878, .adv_w = 460, .box_w = 29, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15125, .adv_w = 283, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15278, .adv_w = 286, .box_w = 19, .box_h = 23, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 15497, .adv_w = 267, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 15625, .adv_w = 180, .box_w = 10, .box_h = 30, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 15775, .adv_w = 153, .box_w = 4, .box_h = 30, .ofs_x = 3, .ofs_y = -6}, - {.bitmap_index = 15835, .adv_w = 180, .box_w = 10, .box_h = 30, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 15985, .adv_w = 298, .box_w = 16, .box_h = 6, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 16033, .adv_w = 215, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 12}, - {.bitmap_index = 16088, .adv_w = 161, .box_w = 6, .box_h = 6, .ofs_x = 2, .ofs_y = 6}, - {.bitmap_index = 16106, .adv_w = 512, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 16634, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17018, .adv_w = 512, .box_w = 32, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17466, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17850, .adv_w = 352, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 18092, .adv_w = 512, .box_w = 31, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 18588, .adv_w = 512, .box_w = 30, .box_h = 32, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 19068, .adv_w = 576, .box_w = 36, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19572, .adv_w = 512, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 20084, .adv_w = 576, .box_w = 36, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 20516, .adv_w = 512, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 21028, .adv_w = 256, .box_w = 16, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 21236, .adv_w = 384, .box_w = 24, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 21548, .adv_w = 576, .box_w = 36, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 22124, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 22508, .adv_w = 352, .box_w = 22, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 22860, .adv_w = 448, .box_w = 20, .box_h = 30, .ofs_x = 4, .ofs_y = -3}, - {.bitmap_index = 23160, .adv_w = 448, .box_w = 28, .box_h = 34, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 23636, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24042, .adv_w = 448, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24434, .adv_w = 448, .box_w = 20, .box_h = 30, .ofs_x = 4, .ofs_y = -3}, - {.bitmap_index = 24734, .adv_w = 448, .box_w = 30, .box_h = 28, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 25154, .adv_w = 320, .box_w = 18, .box_h = 28, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 25406, .adv_w = 320, .box_w = 18, .box_h = 28, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 25658, .adv_w = 448, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26050, .adv_w = 448, .box_w = 28, .box_h = 6, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 26134, .adv_w = 576, .box_w = 36, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 26566, .adv_w = 640, .box_w = 40, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 27206, .adv_w = 576, .box_w = 38, .box_h = 32, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 27814, .adv_w = 512, .box_w = 32, .box_h = 30, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 28294, .adv_w = 448, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 28546, .adv_w = 448, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 28798, .adv_w = 640, .box_w = 40, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 29318, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 29702, .adv_w = 512, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 30214, .adv_w = 512, .box_w = 33, .box_h = 33, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 30759, .adv_w = 448, .box_w = 29, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31165, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 31613, .adv_w = 448, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32005, .adv_w = 448, .box_w = 28, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 32369, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 32753, .adv_w = 320, .box_w = 22, .box_h = 32, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 33105, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 33553, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 34001, .adv_w = 576, .box_w = 36, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 34433, .adv_w = 512, .box_w = 34, .box_h = 34, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 35011, .adv_w = 384, .box_w = 24, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 35395, .adv_w = 640, .box_w = 40, .box_h = 29, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35975, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 36375, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 36775, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 37175, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 37575, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 37975, .adv_w = 640, .box_w = 41, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 38508, .adv_w = 448, .box_w = 24, .box_h = 32, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 38892, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 39340, .adv_w = 512, .box_w = 33, .box_h = 33, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 39885, .adv_w = 640, .box_w = 40, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 40365, .adv_w = 384, .box_w = 24, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 40749, .adv_w = 515, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 2} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 5, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 23, 0, 14, -11, 0, 0, - 0, 0, -28, -31, 4, 24, 11, 9, - -20, 4, 25, 2, 22, 5, 16, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 31, 4, -4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 0, -15, 0, 0, 0, 0, - 0, -10, 9, 10, 0, 0, -5, 0, - -4, 5, 0, -5, 0, -5, -3, -10, - 0, 0, 0, 0, -5, 0, 0, -7, - -8, 0, 0, -5, 0, -10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -5, - -5, 0, -8, 0, -14, 0, -62, 0, - 0, -10, 0, 10, 15, 1, 0, -10, - 5, 5, 17, 10, -9, 10, 0, 0, - -29, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -19, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -14, -6, -25, 0, -20, - -4, 0, 0, 0, 0, 1, 20, 0, - -15, -4, -2, 2, 0, -9, 0, 0, - -4, -38, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -41, -4, 19, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -21, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 17, - 0, 5, 0, 0, -10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 19, 4, - 2, 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, - -19, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, - 10, 5, 15, -5, 0, 0, 10, -5, - -17, -70, 4, 14, 10, 1, -7, 0, - 18, 0, 16, 0, 16, 0, -48, 0, - -6, 15, 0, 17, -5, 10, 5, 0, - 0, 2, -5, 0, 0, -9, 41, 0, - 41, 0, 15, 0, 22, 7, 9, 15, - 0, 0, 0, -19, 0, 0, 0, 0, - 2, -4, 0, 4, -9, -7, -10, 4, - 0, -5, 0, 0, 0, -20, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -33, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, -28, 0, -32, 0, 0, 0, - 0, -4, 0, 51, -6, -7, 5, 5, - -5, 0, -7, 5, 0, 0, -27, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -50, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -32, 0, 31, 0, 0, -19, 0, - 17, 0, -35, -50, -35, -10, 15, 0, - 0, -34, 0, 6, -12, 0, -8, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 13, 15, -62, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 24, 0, 4, 0, 0, 0, - 0, 0, 4, 4, -6, -10, 0, -2, - -2, -5, 0, 0, -4, 0, 0, 0, - -10, 0, -4, 0, -12, -10, 0, -13, - -17, -17, -10, 0, -10, 0, -10, 0, - 0, 0, 0, -4, 0, 0, 5, 0, - 4, -5, 0, 2, 0, 0, 0, 5, - -4, 0, 0, 0, -4, 5, 5, -2, - 0, 0, 0, -10, 0, -2, 0, 0, - 0, 0, 0, 2, 0, 7, -4, 0, - -6, 0, -9, 0, 0, -4, 0, 15, - 0, 0, -5, 0, 0, 0, 0, 0, - -2, 2, -4, -4, 0, 0, -5, 0, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -3, -3, 0, -5, -6, 0, - 0, 0, 0, 0, 2, 0, 0, -4, - 0, -5, -5, -5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -3, 0, 0, - 0, 0, -4, -7, 0, -8, 0, -15, - -4, -15, 10, 0, 0, -10, 5, 10, - 14, 0, -13, -2, -6, 0, -2, -24, - 5, -4, 4, -27, 5, 0, 0, 2, - -27, 0, -27, -4, -45, -4, 0, -26, - 0, 10, 14, 0, 7, 0, 0, 0, - 0, 1, 0, -9, -7, 0, -15, 0, - 0, 0, -5, 0, 0, 0, -5, 0, - 0, 0, 0, 0, -3, -3, 0, -3, - -7, 0, 0, 0, 0, 0, 0, 0, - -5, -5, 0, -4, -6, -4, 0, 0, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, -4, 0, -6, - 0, -4, 0, -10, 5, 0, 0, -6, - 3, 5, 5, 0, 0, 0, 0, 0, - 0, -4, 0, 0, 0, 0, 0, 4, - 0, 0, -5, 0, -5, -4, -6, 0, - 0, 0, 0, 0, 0, 0, 4, 0, - -4, 0, 0, 0, 0, -6, -8, 0, - -10, 0, 15, -4, 2, -16, 0, 0, - 14, -26, -27, -22, -10, 5, 0, -4, - -33, -9, 0, -9, 0, -10, 8, -9, - -33, 0, -14, 0, 0, 3, -2, 4, - -4, 0, 5, 1, -15, -19, 0, -26, - -12, -11, -12, -15, -6, -14, -1, -10, - -14, 3, 0, 2, 0, -5, 0, 0, - 0, 4, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -5, - 0, -3, 0, -2, -5, 0, -9, -11, - -11, -2, 0, -15, 0, 0, 0, 0, - 0, 0, -4, 0, 0, 0, 0, 2, - -3, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -9, 0, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, 0, 0, - -10, 0, 0, 0, 0, -26, -15, 0, - 0, 0, -8, -26, 0, 0, -5, 5, - 0, -14, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, 0, 0, -10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, -9, 0, - 0, 0, 0, 6, 0, 4, -10, -10, - 0, -5, -5, -6, 0, 0, 0, 0, - 0, 0, -15, 0, -5, 0, -8, -5, - 0, -11, -13, -15, -4, 0, -10, 0, - -15, 0, 0, 0, 0, 41, 0, 0, - 3, 0, 0, -7, 0, 5, 0, -22, - 0, 0, 0, 0, 0, -48, -9, 17, - 15, -4, -22, 0, 5, -8, 0, -26, - -3, -7, 5, -36, -5, 7, 0, 8, - -18, -8, -19, -17, -22, 0, 0, -31, - 0, 29, 0, 0, -3, 0, 0, 0, - -3, -3, -5, -14, -17, -1, -48, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -5, 0, -3, -5, -8, 0, 0, - -10, 0, -5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, 0, -10, 0, 0, 10, - -2, 7, 0, -11, 5, -4, -2, -13, - -5, 0, -7, -5, -4, 0, -8, -9, - 0, 0, -4, -2, -4, -9, -6, 0, - 0, -5, 0, 5, -4, 0, -11, 0, - 0, 0, -10, 0, -9, 0, -9, -9, - 5, 0, 0, 0, 0, 0, 0, 0, - 0, -10, 5, 0, -7, 0, -4, -6, - -16, -4, -4, -4, -2, -4, -6, -2, - 0, 0, 0, 0, 0, -5, -4, -4, - 0, 0, 0, 0, 6, -4, 0, -4, - 0, 0, 0, -4, -6, -4, -5, -6, - -5, 0, 4, 20, -2, 0, -14, 0, - -4, 10, 0, -5, -22, -7, 8, 1, - 0, -24, -9, 5, -9, 4, 0, -4, - -4, -16, 0, -8, 3, 0, 0, -9, - 0, 0, 0, 5, 5, -10, -10, 0, - -9, -5, -8, -5, -5, 0, -9, 3, - -10, -9, 15, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -9, 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, - -4, 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, -4, -5, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, 0, 0, -7, - 0, 0, -5, -5, 0, 0, 0, 0, - -5, 0, 0, 0, 0, -3, 0, 0, - 0, 0, 0, -4, 0, 0, 0, 0, - -8, 0, -10, 0, 0, 0, -17, 0, - 4, -11, 10, 1, -4, -24, 0, 0, - -11, -5, 0, -20, -13, -14, 0, 0, - -22, -5, -20, -19, -25, 0, -13, 0, - 4, 34, -7, 0, -12, -5, -2, -5, - -9, -14, -9, -19, -21, -12, -5, 0, - 0, -4, 0, 2, 0, 0, -36, -5, - 15, 11, -11, -19, 0, 2, -16, 0, - -26, -4, -5, 10, -47, -7, 2, 0, - 0, -33, -6, -27, -5, -37, 0, 0, - -36, 0, 30, 2, 0, -4, 0, 0, - 0, 0, -3, -4, -19, -4, 0, -33, - 0, 0, 0, 0, -16, 0, -5, 0, - -2, -14, -24, 0, 0, -3, -8, -15, - -5, 0, -4, 0, 0, 0, 0, -23, - -5, -17, -16, -4, -9, -13, -5, -9, - 0, -10, -5, -17, -8, 0, -6, -10, - -5, -10, 0, 3, 0, -4, -17, 0, - 10, 0, -9, 0, 0, 0, 0, 6, - 0, 4, -10, 21, 0, -5, -5, -6, - 0, 0, 0, 0, 0, 0, -15, 0, - -5, 0, -8, -5, 0, -11, -13, -15, - -4, 0, -10, 4, 20, 0, 0, 0, - 0, 41, 0, 0, 3, 0, 0, -7, - 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -4, -10, 0, 0, 0, 0, 0, -3, - 0, 0, 0, -5, -5, 0, 0, -10, - -5, 0, 0, -10, 0, 9, -3, 0, - 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 8, 10, 4, -5, 0, -16, - -8, 0, 15, -17, -16, -10, -10, 20, - 9, 5, -45, -4, 10, -5, 0, -5, - 6, -5, -18, 0, -5, 5, -7, -4, - -15, -4, 0, 0, 15, 10, 0, -14, - 0, -28, -7, 15, -7, -19, 2, -7, - -17, -17, -5, 20, 5, 0, -8, 0, - -14, 0, 4, 17, -12, -19, -20, -13, - 15, 0, 2, -37, -4, 5, -9, -4, - -12, 0, -11, -19, -8, -8, -4, 0, - 0, -12, -11, -5, 0, 15, 12, -5, - -28, 0, -28, -7, 0, -18, -30, -2, - -16, -9, -17, -14, 14, 0, 0, -7, - 0, -10, -5, 0, -5, -9, 0, 9, - -17, 5, 0, 0, -27, 0, -5, -11, - -9, -4, -15, -13, -17, -12, 0, -15, - -5, -12, -10, -15, -5, 0, 0, 2, - 24, -9, 0, -15, -5, 0, -5, -10, - -12, -14, -14, -19, -7, -10, 10, 0, - -8, 0, -26, -6, 3, 10, -16, -19, - -10, -17, 17, -5, 3, -48, -9, 10, - -11, -9, -19, 0, -15, -22, -6, -5, - -4, -5, -11, -15, -2, 0, 0, 15, - 14, -4, -33, 0, -31, -12, 12, -19, - -35, -10, -18, -22, -26, -17, 10, 0, - 0, 0, 0, -6, 0, 0, 5, -6, - 10, 4, -10, 10, 0, 0, -16, -2, - 0, -2, 0, 2, 2, -4, 0, 0, - 0, 0, 0, 0, -5, 0, 0, 0, - 0, 4, 15, 1, 0, -6, 0, 0, - 0, 0, -4, -4, -6, 0, 0, 0, - 2, 4, 0, 0, 0, 0, 4, 0, - -4, 0, 19, 0, 9, 2, 2, -7, - 0, 10, 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 15, 0, 14, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -31, 0, -5, 9, 0, 15, - 0, 0, 51, 6, -10, -10, 5, 5, - -4, 2, -26, 0, 0, 25, -31, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -35, 19, 72, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -31, 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, -8, 0, 0, -10, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, -14, 0, - 0, 2, 0, 0, 5, 66, -10, -4, - 16, 14, -14, 5, 0, 0, 5, 5, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -67, 14, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -14, - 0, 0, 0, -14, 0, 0, 0, 0, - -11, -3, 0, 0, 0, -11, 0, -6, - 0, -24, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -34, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, -5, 0, 0, -10, 0, -8, 0, - -14, 0, 0, 0, -9, 5, -6, 0, - 0, -14, -5, -12, 0, 0, -14, 0, - -5, 0, -24, 0, -6, 0, 0, -41, - -10, -20, -6, -18, 0, 0, -34, 0, - -14, -3, 0, 0, 0, 0, 0, 0, - 0, 0, -8, -9, -4, -9, 0, 0, - 0, 0, -11, 0, -11, 7, -6, 10, - 0, -4, -12, -4, -9, -10, 0, -6, - -3, -4, 4, -14, -2, 0, 0, 0, - -45, -4, -7, 0, -11, 0, -4, -24, - -5, 0, 0, -4, -4, 0, 0, 0, - 0, 4, 0, -4, -9, -4, 9, 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, 7, 0, 0, 0, 0, 0, - 0, -11, 0, -4, 0, 0, 0, -10, - 5, 0, 0, 0, -14, -5, -10, 0, - 0, -14, 0, -5, 0, -24, 0, 0, - 0, 0, -50, 0, -10, -19, -26, 0, - 0, -34, 0, -4, -8, 0, 0, 0, - 0, 0, 0, 0, 0, -5, -8, -3, - -8, 2, 0, 0, 9, -7, 0, 16, - 25, -5, -5, -15, 6, 25, 9, 11, - -14, 6, 22, 6, 15, 11, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 24, -9, -5, 0, -4, - 41, 22, 41, 0, 0, 0, 5, 0, - 0, 19, 0, 0, -8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -4, 0, - 0, 0, 0, 0, 0, 0, 0, 7, - 0, 0, 0, 0, -43, -6, -4, -21, - -25, 0, 0, -34, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 0, -43, -6, -4, - -21, -25, 0, 0, -20, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -4, 0, 0, 0, -12, 5, 0, -5, - 4, 9, 5, -15, 0, -1, -4, 5, - 0, 4, 0, 0, 0, 0, -13, 0, - -5, -4, -10, 0, -5, -20, 0, 32, - -5, 0, -11, -4, 0, -4, -9, 0, - -5, -14, -10, -6, 0, 0, 0, -8, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -4, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 0, -43, - -6, -4, -21, -25, 0, 0, -34, 0, - 0, 0, 0, 0, 0, 26, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -8, 0, -16, -6, -5, 15, -5, -5, - -20, 2, -3, 2, -4, -14, 1, 11, - 1, 4, 2, 4, -12, -20, -6, 0, - -19, -10, -14, -22, -20, 0, -8, -10, - -6, -7, -4, -4, -6, -4, 0, -4, - -2, 8, 0, 8, -4, 0, 16, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -4, -5, -5, 0, 0, - -14, 0, -3, 0, -9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -31, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, -5, 0, -7, - 0, 0, 0, 0, -4, 0, 0, -9, - -5, 5, 0, -9, -10, -4, 0, -15, - -4, -11, -4, -6, 0, -9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -34, 0, 16, 0, 0, -9, 0, - 0, 0, 0, -7, 0, -5, 0, 0, - -3, 0, 0, -4, 0, -12, 0, 0, - 22, -7, -17, -16, 4, 6, 6, -1, - -14, 4, 8, 4, 15, 4, 17, -4, - -14, 0, 0, -20, 0, 0, -15, -14, - 0, 0, -10, 0, -7, -9, 0, -8, - 0, -8, 0, -4, 8, 0, -4, -15, - -5, 19, 0, 0, -5, 0, -10, 0, - 0, 7, -12, 0, 5, -5, 4, 1, - 0, -17, 0, -4, -2, 0, -5, 6, - -4, 0, 0, 0, -21, -6, -11, 0, - -15, 0, 0, -24, 0, 19, -5, 0, - -9, 0, 3, 0, -5, 0, -5, -15, - 0, -5, 5, 0, 0, 0, 0, -4, - 0, 0, 5, -7, 2, 0, 0, -6, - -4, 0, -6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -32, 0, 11, 0, - 0, -4, 0, 0, 0, 0, 1, 0, - -5, -5, 0, 0, 0, 10, 0, 12, - 0, 0, 0, 0, 0, -32, -29, 2, - 22, 15, 9, -20, 4, 22, 0, 19, - 0, 10, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 27, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_32 = { -#else -lv_font_t lv_font_montserrat_32 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 35, /*The maximum line height required by the font*/ - .base_line = 6, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -2, - .underline_thickness = 2, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_32*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_34.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_34.c deleted file mode 100644 index 7577c73..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_34.c +++ /dev/null @@ -1,7011 +0,0 @@ -/******************************************************************************* - * Size: 34 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 34 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_34.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_34 - #define LV_FONT_MONTSERRAT_34 1 -#endif - -#if LV_FONT_MONTSERRAT_34 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x5f, 0xff, 0x74, 0xff, 0xf7, 0x4f, 0xff, 0x63, - 0xff, 0xf5, 0x2f, 0xff, 0x52, 0xff, 0xf4, 0x1f, - 0xff, 0x31, 0xff, 0xf3, 0xf, 0xff, 0x20, 0xff, - 0xf1, 0xf, 0xff, 0x10, 0xef, 0xf0, 0xd, 0xff, - 0x0, 0xdf, 0xf0, 0xc, 0xfe, 0x0, 0xcf, 0xd0, - 0x1, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x14, 0x10, 0x2e, 0xff, 0x49, 0xff, 0xfb, 0x8f, - 0xff, 0x90, 0xbf, 0xc1, - - /* U+0022 "\"" */ - 0xdf, 0xf0, 0x0, 0xbf, 0xf2, 0xdf, 0xf0, 0x0, - 0xaf, 0xf1, 0xcf, 0xe0, 0x0, 0xaf, 0xf1, 0xcf, - 0xe0, 0x0, 0xaf, 0xf0, 0xcf, 0xe0, 0x0, 0x9f, - 0xf0, 0xbf, 0xd0, 0x0, 0x9f, 0xf0, 0xbf, 0xd0, - 0x0, 0x8f, 0xf0, 0xbf, 0xc0, 0x0, 0x8f, 0xf0, - 0xaf, 0xc0, 0x0, 0x8f, 0xe0, 0x1, 0x0, 0x0, - 0x1, 0x10, - - /* U+0023 "#" */ - 0x0, 0x0, 0x0, 0x4, 0xff, 0x20, 0x0, 0x0, - 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xf0, 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0xbf, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xc0, - 0x0, 0x0, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xfa, 0x0, 0x0, 0x0, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x80, 0x0, - 0x0, 0x1f, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x77, 0x77, 0x9f, - 0xf8, 0x77, 0x77, 0x7b, 0xff, 0x77, 0x77, 0x70, - 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, 0x8f, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, - 0x0, 0x0, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xb0, 0x0, - 0x0, 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xf9, 0x0, 0x0, 0x0, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x70, 0x0, 0x0, - 0x2f, 0xf4, 0x0, 0x0, 0x0, 0x77, 0x77, 0x7f, - 0xfa, 0x77, 0x77, 0x79, 0xff, 0x97, 0x77, 0x60, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x0, - 0x0, 0xb, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xfb, 0x0, 0x0, 0x0, 0xdf, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0x90, 0x0, 0x0, - 0xf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xf7, 0x0, 0x0, 0x1, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0x50, 0x0, 0x0, 0x3f, - 0xf2, 0x0, 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xad, 0xff, 0xff, 0xdb, 0x71, 0x0, 0x0, - 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x2f, 0xff, 0xe6, 0x15, 0xfd, - 0x1, 0x4a, 0xff, 0x20, 0xa, 0xff, 0xe2, 0x0, - 0x5f, 0xd0, 0x0, 0x2, 0x70, 0x0, 0xef, 0xf7, - 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x50, 0x0, 0x5f, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf7, 0x0, 0x5, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xe3, 0x0, 0x5f, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf9, 0x35, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x0, - 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, 0xff, 0xfb, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xd1, 0x7e, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x5, 0xfd, 0x0, 0x9, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xd0, 0x0, 0xd, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0xaf, - 0xfb, 0x2, 0x0, 0x0, 0x0, 0x5f, 0xd0, 0x0, - 0xc, 0xff, 0x90, 0xdd, 0x30, 0x0, 0x5, 0xfd, - 0x0, 0x4, 0xff, 0xf5, 0x4f, 0xff, 0xb5, 0x10, - 0x5f, 0xd0, 0x28, 0xff, 0xfd, 0x3, 0xef, 0xff, - 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfe, 0x20, 0x1, - 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, - 0x0, 0x0, 0x5, 0x9d, 0xef, 0xff, 0xfd, 0x93, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, - - /* U+0025 "%" */ - 0x0, 0x7, 0xdf, 0xeb, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x60, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xb0, 0x0, 0x0, 0xa, 0xfd, 0x30, 0x7, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, 0x0, - 0x3, 0xff, 0x30, 0x0, 0x9, 0xfc, 0x0, 0x0, - 0x0, 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x7f, 0xc0, - 0x0, 0x0, 0x2f, 0xf1, 0x0, 0x0, 0xd, 0xfb, - 0x0, 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, 0x0, - 0xff, 0x30, 0x0, 0x9, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0xbf, 0x70, 0x0, 0x0, 0xe, 0xf4, 0x0, - 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0xa, 0xf9, - 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, 0xef, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, - 0x2f, 0xf1, 0x0, 0x9f, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x30, 0x0, 0x9, 0xfc, 0x0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xfd, 0x30, 0x7, 0xff, 0x40, 0x1e, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0x70, 0xa, 0xfe, 0x10, 0x6, 0xbe, 0xda, - 0x30, 0x0, 0x0, 0x7, 0xdf, 0xeb, 0x40, 0x5, - 0xff, 0x40, 0xb, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0x90, 0x9, - 0xfe, 0x50, 0x18, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xe0, 0x1, 0xff, 0x40, 0x0, - 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xf4, 0x0, 0x6f, 0xd0, 0x0, 0x0, 0x2f, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xf9, 0x0, 0x9, - 0xfa, 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, - 0x0, 0xb, 0xfd, 0x0, 0x0, 0x9f, 0x80, 0x0, - 0x0, 0xd, 0xf6, 0x0, 0x0, 0x0, 0x6, 0xff, - 0x30, 0x0, 0x9, 0xfa, 0x0, 0x0, 0x0, 0xef, - 0x50, 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, - 0x6f, 0xc0, 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, - 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x2, 0xff, 0x20, - 0x0, 0x7, 0xfd, 0x0, 0x0, 0x0, 0x6f, 0xf3, - 0x0, 0x0, 0x0, 0xa, 0xfc, 0x10, 0x3, 0xff, - 0x50, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xcc, 0xff, 0x90, 0x0, 0x0, - 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xdf, 0xfb, 0x50, 0x0, - - /* U+0026 "&" */ - 0x0, 0x0, 0x0, 0x5a, 0xef, 0xfd, 0x92, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x96, 0x6b, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, 0x7f, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, - 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x0, 0x0, - 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf5, 0x0, 0x7, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x32, 0xbf, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x40, 0x0, 0x0, - 0x9f, 0xff, 0x60, 0xc, 0xff, 0xf4, 0x0, 0x2, - 0xff, 0x60, 0x6, 0xff, 0xe3, 0x0, 0x0, 0xcf, - 0xff, 0x40, 0x7, 0xff, 0x60, 0xe, 0xff, 0x50, - 0x0, 0x0, 0xb, 0xff, 0xf4, 0xc, 0xff, 0x10, - 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x8f, 0xfc, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xf4, 0x0, 0x6f, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, - 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf5, 0x0, 0xc, 0xff, 0xf9, 0x10, - 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0x50, 0x1, - 0xdf, 0xff, 0xfd, 0xbb, 0xcf, 0xff, 0xfe, 0x3a, - 0xff, 0xf5, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x91, 0x0, 0xaf, 0xf5, 0x0, 0x0, 0x27, - 0xce, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x9, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0xdf, 0xfd, 0xff, 0xcf, 0xec, 0xfe, 0xcf, 0xeb, - 0xfd, 0xbf, 0xdb, 0xfc, 0xaf, 0xc0, 0x10, - - /* U+0028 "(" */ - 0x0, 0x1, 0xef, 0xf2, 0x0, 0x9, 0xff, 0x90, - 0x0, 0x1f, 0xff, 0x20, 0x0, 0x7f, 0xfa, 0x0, - 0x0, 0xdf, 0xf4, 0x0, 0x3, 0xff, 0xe0, 0x0, - 0x8, 0xff, 0xa0, 0x0, 0xc, 0xff, 0x60, 0x0, - 0xf, 0xff, 0x30, 0x0, 0x3f, 0xff, 0x0, 0x0, - 0x5f, 0xfd, 0x0, 0x0, 0x8f, 0xfa, 0x0, 0x0, - 0x9f, 0xf9, 0x0, 0x0, 0xaf, 0xf8, 0x0, 0x0, - 0xbf, 0xf8, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, - 0xcf, 0xf7, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x0, - 0xaf, 0xf8, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, - 0x8f, 0xfa, 0x0, 0x0, 0x5f, 0xfd, 0x0, 0x0, - 0x3f, 0xff, 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, - 0xc, 0xff, 0x60, 0x0, 0x7, 0xff, 0xa0, 0x0, - 0x2, 0xff, 0xe0, 0x0, 0x0, 0xdf, 0xf4, 0x0, - 0x0, 0x7f, 0xfa, 0x0, 0x0, 0xe, 0xff, 0x20, - 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, 0xef, 0xf2, - - /* U+0029 ")" */ - 0xaf, 0xf7, 0x0, 0x0, 0x2f, 0xff, 0x10, 0x0, - 0xa, 0xff, 0x80, 0x0, 0x3, 0xff, 0xf0, 0x0, - 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x7f, 0xfb, 0x0, - 0x0, 0x3f, 0xff, 0x0, 0x0, 0xe, 0xff, 0x40, - 0x0, 0xb, 0xff, 0x70, 0x0, 0x8, 0xff, 0xb0, - 0x0, 0x6, 0xff, 0xd0, 0x0, 0x3, 0xff, 0xf0, - 0x0, 0x2, 0xff, 0xf1, 0x0, 0x1, 0xff, 0xf2, - 0x0, 0x0, 0xff, 0xf3, 0x0, 0x0, 0xff, 0xf4, - 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0xff, 0xf3, - 0x0, 0x1, 0xff, 0xf2, 0x0, 0x2, 0xff, 0xf1, - 0x0, 0x3, 0xff, 0xf0, 0x0, 0x6, 0xff, 0xd0, - 0x0, 0x8, 0xff, 0xb0, 0x0, 0xb, 0xff, 0x70, - 0x0, 0xe, 0xff, 0x40, 0x0, 0x3f, 0xff, 0x0, - 0x0, 0x7f, 0xfa, 0x0, 0x0, 0xdf, 0xf4, 0x0, - 0x3, 0xff, 0xe0, 0x0, 0xa, 0xff, 0x70, 0x0, - 0x2f, 0xfe, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, - - /* U+002A "*" */ - 0x0, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x6, 0x60, 0x3, - 0xfc, 0x0, 0x19, 0x21, 0xff, 0xc3, 0x3f, 0xc0, - 0x7f, 0xfa, 0x8, 0xff, 0xfb, 0xfe, 0xdf, 0xfd, - 0x40, 0x1, 0x9f, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0x1, 0xbf, 0xff, 0xf7, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xfd, 0x40, 0x2e, 0xff, 0xb5, 0xfc, - 0x6e, 0xff, 0xa0, 0xcd, 0x50, 0x3f, 0xc0, 0x8, - 0xf6, 0x1, 0x0, 0x3, 0xfc, 0x0, 0x2, 0x0, - 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x87, 0x0, 0x0, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x6b, 0xb3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, - 0x7a, 0xaa, 0xaa, 0xdf, 0xfc, 0xaa, 0xaa, 0xa5, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, - - /* U+002C "," */ - 0x0, 0x54, 0x0, 0xd, 0xff, 0x90, 0x4f, 0xff, - 0xf0, 0x4f, 0xff, 0xf0, 0xa, 0xff, 0xc0, 0x1, - 0xff, 0x70, 0x5, 0xff, 0x20, 0x9, 0xfc, 0x0, - 0xd, 0xf7, 0x0, 0x1f, 0xf1, 0x0, - - /* U+002D "-" */ - 0xc, 0xcc, 0xcc, 0xcc, 0xcc, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0x10, - - /* U+002E "." */ - 0x2, 0x87, 0x0, 0x1f, 0xff, 0xc0, 0x6f, 0xff, - 0xf1, 0x3f, 0xff, 0xe0, 0x7, 0xed, 0x40, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x88, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x0, 0x0, 0x39, 0xcf, 0xfe, 0xb7, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xc5, 0x10, 0x26, 0xef, 0xff, - 0x80, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0x30, 0x0, 0x1f, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xfb, 0x0, 0x7, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf2, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0x70, 0xf, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x3, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xd0, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x5, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x5f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0x4, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf0, 0x3f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, - 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf7, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x20, 0x1, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, - 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf3, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x41, 0x1, - 0x6e, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, 0xff, 0xeb, - 0x71, 0x0, 0x0, 0x0, - - /* U+0031 "1" */ - 0xbf, 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, - 0xff, 0xf0, 0xae, 0xee, 0xef, 0xff, 0xf0, 0x0, - 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, - 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, - 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, - 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, - 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, - 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, - 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, - 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, - 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, - 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, - 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, - 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, - 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, - - /* U+0032 "2" */ - 0x0, 0x0, 0x27, 0xbd, 0xef, 0xec, 0x82, 0x0, - 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0xa5, - 0x10, 0x2, 0x6e, 0xff, 0xf8, 0x0, 0x7, 0xfd, - 0x20, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf0, 0x0, - 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xe5, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, - - /* U+0033 "3" */ - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xa, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfe, - 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x2a, - 0xaa, 0xcf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfd, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xfb, 0xd, 0xe5, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf5, 0x7f, 0xff, 0xd8, 0x31, - 0x0, 0x15, 0xcf, 0xff, 0xc0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0x1, 0x59, 0xce, 0xff, 0xdb, 0x72, 0x0, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xc0, - 0x0, 0x0, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfe, 0x10, 0x0, 0x6, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, 0x6, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, - 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x1, - 0xef, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, 0xd0, - 0x0, 0x0, 0xc, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xd0, 0x0, 0x0, 0x8f, 0xff, 0xfe, - 0xee, 0xee, 0xee, 0xef, 0xff, 0xfe, 0xee, 0xe4, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, - - /* U+0035 "5" */ - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xa, 0xff, 0xfe, 0xee, - 0xee, 0xee, 0xee, 0xe0, 0x0, 0x0, 0xcf, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xec, 0x95, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x49, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf4, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x20, 0x6f, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xd0, 0x1e, 0xff, - 0xe9, 0x52, 0x0, 0x3, 0x9f, 0xff, 0xf4, 0x1, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe5, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xdf, 0xfe, - 0xda, 0x50, 0x0, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, 0xc8, - 0x30, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xfe, 0xef, 0xff, 0xf3, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x83, 0x0, 0x0, 0x27, 0xa0, 0x0, - 0x0, 0x4f, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0x30, 0x1, 0x69, 0xaa, - 0x85, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x12, 0xbf, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5f, 0xff, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x5f, 0xff, 0xef, 0xfa, 0x41, 0x1, 0x5b, 0xff, - 0xfc, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x60, 0x3f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x1f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, - 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf0, 0x3, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xc0, 0x0, 0xcf, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x60, - 0x0, 0x2f, 0xff, 0xe5, 0x0, 0x0, 0x7, 0xff, - 0xfd, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, 0xbc, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x2c, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x49, 0xce, 0xfe, 0xc9, 0x30, 0x0, 0x0, - - /* U+0037 "7" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xff, 0xfd, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf6, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xe0, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x10, 0x33, - 0x30, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xc8, 0x30, - 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x20, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xdc, 0xce, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xef, - 0xff, 0x81, 0x0, 0x0, 0x29, 0xff, 0xfd, 0x0, - 0x6, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x40, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x70, 0x9, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x7, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, - 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xb5, 0x10, 0x2, - 0x5c, 0xff, 0xf5, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x3, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, - 0x0, 0x7f, 0xff, 0xfd, 0xa9, 0x9a, 0xef, 0xff, - 0xf5, 0x0, 0x6, 0xff, 0xfb, 0x20, 0x0, 0x0, - 0x4, 0xdf, 0xff, 0x50, 0xf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x5f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, - 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf5, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf5, 0x5f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf3, 0xf, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xe0, - 0x7, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x16, 0xef, - 0xff, 0x50, 0x0, 0x8f, 0xff, 0xff, 0xdb, 0xcd, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x5, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, - 0x5, 0x9c, 0xef, 0xfe, 0xc8, 0x40, 0x0, 0x0, - - /* U+0039 "9" */ - 0x0, 0x0, 0x3, 0x8c, 0xef, 0xec, 0x83, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xb2, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xdc, 0xdf, 0xff, 0xfe, 0x30, 0x0, 0x0, 0xdf, - 0xff, 0x70, 0x0, 0x0, 0x5e, 0xff, 0xe1, 0x0, - 0x6, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xfb, 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0x30, 0xf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x90, 0xf, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, - 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf1, 0xc, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf3, 0x6, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0xdf, - 0xff, 0xb5, 0x10, 0x14, 0xaf, 0xfe, 0xff, 0xf5, - 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xf4, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, - 0xfb, 0x21, 0xff, 0xf3, 0x0, 0x0, 0x1, 0x69, - 0xab, 0x97, 0x20, 0x3, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xf4, 0x0, - 0x0, 0xa, 0x72, 0x0, 0x0, 0x38, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xef, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x3, - 0x8c, 0xef, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0x0, - - /* U+003A ":" */ - 0x7, 0xed, 0x40, 0x4f, 0xff, 0xe0, 0x6f, 0xff, - 0xf1, 0x1f, 0xff, 0xb0, 0x2, 0x87, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x87, 0x0, 0x1f, 0xff, 0xc0, 0x6f, 0xff, 0xf1, - 0x3f, 0xff, 0xe0, 0x7, 0xed, 0x40, - - /* U+003B ";" */ - 0x7, 0xed, 0x40, 0x4f, 0xff, 0xe0, 0x6f, 0xff, - 0xf1, 0x1f, 0xff, 0xb0, 0x2, 0x87, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x54, 0x0, 0xd, 0xff, 0x90, 0x4f, 0xff, 0xf0, - 0x4f, 0xff, 0xf0, 0xa, 0xff, 0xc0, 0x1, 0xff, - 0x70, 0x5, 0xff, 0x20, 0x9, 0xfc, 0x0, 0xd, - 0xf7, 0x0, 0x1f, 0xf1, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xc8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xc6, 0x0, - 0x0, 0x17, 0xdf, 0xff, 0xfe, 0x82, 0x0, 0x0, - 0x4b, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x8e, 0xff, 0xff, 0xd7, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x5b, 0xff, 0xff, 0xfb, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xfe, 0x82, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, - - /* U+003D "=" */ - 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+003E ">" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x7d, 0xff, 0xff, 0xe9, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x39, 0xff, 0xff, 0xfc, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0x92, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x2, 0x8e, 0xff, 0xff, 0xd7, 0x10, - 0x0, 0x6, 0xcf, 0xff, 0xff, 0xa3, 0x0, 0x0, - 0x3a, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xf9, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x0, 0x27, 0xcd, 0xff, 0xec, 0x83, 0x0, - 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa1, 0x0, 0x6, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xf8, 0x20, 0x0, - 0x6, 0xef, 0xff, 0x90, 0x9, 0xfc, 0x10, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xf0, 0x0, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x55, 0x51, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xbf, 0xb0, 0x0, 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xde, - 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xc8, - 0x64, 0x44, 0x57, 0xae, 0xff, 0xfb, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xe7, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x91, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x20, 0x0, 0x5, 0xff, 0x80, 0x0, - 0x0, 0x5, 0xae, 0xff, 0xd9, 0x30, 0xd, 0xff, - 0x10, 0x1e, 0xfb, 0x0, 0x0, 0xdf, 0xd0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xdf, - 0xf1, 0x0, 0x5f, 0xf3, 0x0, 0x4f, 0xf6, 0x0, - 0x0, 0x2e, 0xff, 0xfe, 0xa9, 0xbf, 0xff, 0xce, - 0xff, 0x10, 0x0, 0xdf, 0x90, 0xa, 0xfe, 0x0, - 0x0, 0xd, 0xff, 0xe4, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xf1, 0x0, 0x7, 0xfe, 0x0, 0xef, 0xa0, - 0x0, 0x8, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x10, 0x0, 0x2f, 0xf2, 0x1f, 0xf6, - 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf1, 0x0, 0x0, 0xff, 0x54, 0xff, - 0x30, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x10, 0x0, 0xd, 0xf7, 0x5f, - 0xf2, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0xcf, 0x85, - 0xff, 0x10, 0x0, 0x6f, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0xc, 0xf7, - 0x5f, 0xf2, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0xdf, - 0x74, 0xff, 0x30, 0x0, 0x2f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0xf, - 0xf5, 0x1f, 0xf6, 0x0, 0x0, 0xef, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x3, - 0xff, 0x20, 0xef, 0xa0, 0x0, 0x8, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, - 0x8f, 0xd0, 0x9, 0xfe, 0x0, 0x0, 0xd, 0xff, - 0xe4, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, - 0x3f, 0xf7, 0x0, 0x4f, 0xf6, 0x0, 0x0, 0x2e, - 0xff, 0xfd, 0xa9, 0xbe, 0xff, 0xc6, 0xff, 0xfa, - 0xaf, 0xfd, 0x0, 0x0, 0xdf, 0xd0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa1, 0xc, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x5, 0xff, 0x80, 0x0, - 0x0, 0x5, 0xae, 0xff, 0xd9, 0x40, 0x0, 0x18, - 0xdf, 0xe9, 0x10, 0x0, 0x0, 0xb, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x29, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xc8, 0x64, 0x44, 0x69, - 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9b, 0xef, 0xff, - 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xe3, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, - 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0x10, 0x4f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfa, 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, 0x6, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, - 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf8, 0x0, 0x0, 0x0, 0xa, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xcb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0x10, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x0, 0x0, - 0xf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0x50, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x5, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf3, 0xc, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, - - /* U+0042 "B" */ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa5, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x7f, 0xff, - 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0xff, 0x50, - 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x8f, 0xff, 0xf1, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xfa, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf7, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x15, 0xcf, 0xff, 0x60, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x7f, - 0xff, 0xbb, 0xbb, 0xbb, 0xbb, 0xcd, 0xff, 0xff, - 0xe3, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xef, 0xff, 0x20, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x90, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xe0, 0x7f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xc0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0x50, 0x7f, - 0xff, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, - 0xfa, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xda, 0x61, 0x0, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x0, 0x0, 0x28, 0xbe, 0xff, 0xec, - 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc6, - 0x20, 0x1, 0x38, 0xef, 0xff, 0xe1, 0x0, 0xc, - 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xf6, 0x0, 0x8, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x46, 0x0, 0x1, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x60, 0x0, 0x0, 0xcf, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x70, 0x0, 0x1, - 0xcf, 0xff, 0xfb, 0x62, 0x0, 0x13, 0x8e, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xfe, - 0xc9, 0x50, 0x0, 0x0, - - /* U+0044 "D" */ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x83, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, - 0xff, 0xb1, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x15, 0xaf, 0xff, 0xfe, 0x20, 0x0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xbf, 0xff, 0xe1, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x30, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xa0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf5, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf6, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf6, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf3, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xa0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x30, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfa, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xd1, 0x0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x15, 0xaf, - 0xff, 0xfe, 0x20, 0x0, 0x7f, 0xff, 0xee, 0xee, - 0xee, 0xef, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd5, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xeb, 0x83, 0x0, 0x0, 0x0, 0x0, - - /* U+0045 "E" */ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x7f, 0xff, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xe5, 0x7f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xec, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+0046 "F" */ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x7f, 0xff, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xe5, 0x7f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0x0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xed, - 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc6, - 0x30, 0x1, 0x37, 0xcf, 0xff, 0xf3, 0x0, 0xb, - 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5e, - 0xfa, 0x0, 0x7, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x17, 0x0, 0x1, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x12, 0x20, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x54, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xf5, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0x50, 0xdf, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, - 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0x50, 0x1f, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, - 0x7f, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0x50, 0x0, 0xbf, 0xff, 0xe4, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, - 0xcf, 0xff, 0xfc, 0x62, 0x0, 0x2, 0x6b, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfe, - 0xda, 0x61, 0x0, 0x0, - - /* U+0048 "H" */ - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, - 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, - 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, - - /* U+0049 "I" */ - 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, - 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, - 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, - 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, - 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, - 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, - - /* U+004A "J" */ - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0xd, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, - 0x0, 0x60, 0x0, 0x0, 0x0, 0x9, 0xff, 0xd0, - 0x6, 0xfb, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, - 0x1f, 0xff, 0xd5, 0x0, 0x4, 0xdf, 0xff, 0x20, - 0x7, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x1, 0x6b, 0xef, 0xfd, 0x93, 0x0, 0x0, - - /* U+004B "K" */ - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x40, 0x7f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x60, - 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xf7, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, - 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x0, 0x0, 0x5f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x4, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x0, 0x4f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x3, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x3f, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xef, 0xff, 0xbf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf4, 0xb, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0x40, 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf4, 0x0, 0x0, 0x1e, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, - 0x3, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, - 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfb, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x80, 0x0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf5, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xe1, - - /* U+004C "L" */ - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfe, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xec, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, - - /* U+004D "M" */ - 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x7f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfd, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x7f, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xfd, 0x7f, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xfd, 0x7f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xfd, 0x7f, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xef, 0xfd, 0x7f, 0xfd, 0xaf, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x7f, 0xfd, - 0x7f, 0xfd, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xf6, 0x6f, 0xfe, 0x7f, 0xfd, 0x7, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, - 0x6f, 0xfe, 0x7f, 0xfd, 0x0, 0xdf, 0xf8, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x40, 0x6f, 0xfe, 0x7f, - 0xfd, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x9f, - 0xfa, 0x0, 0x6f, 0xfe, 0x7f, 0xfd, 0x0, 0xa, - 0xff, 0xb0, 0x0, 0x3, 0xff, 0xf1, 0x0, 0x6f, - 0xfe, 0x7f, 0xfd, 0x0, 0x1, 0xff, 0xf4, 0x0, - 0xc, 0xff, 0x70, 0x0, 0x6f, 0xfe, 0x7f, 0xfd, - 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x5f, 0xfd, 0x0, - 0x0, 0x6f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0xd, - 0xff, 0x70, 0xef, 0xf4, 0x0, 0x0, 0x6f, 0xfe, - 0x7f, 0xfd, 0x0, 0x0, 0x4, 0xff, 0xf9, 0xff, - 0xb0, 0x0, 0x0, 0x6f, 0xfe, 0x7f, 0xfd, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x5f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x7f, - 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x5f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0x50, 0x0, 0x0, 0x0, 0x5f, - 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x7f, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, - - /* U+004E "N" */ - 0x7f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf0, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf0, 0x7f, 0xff, 0xbf, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x1d, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, - 0x7f, 0xff, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x5f, 0xff, - 0xd1, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, - 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, 0x5, 0xff, - 0xf0, 0x7f, 0xff, 0x0, 0x0, 0xbf, 0xff, 0x80, - 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, - 0x1d, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xf0, 0x7f, - 0xff, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x5, - 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xd1, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfb, 0x5, 0xff, 0xf0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x85, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xfa, 0xff, 0xf0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xf0, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, - - /* U+004F "O" */ - 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xed, - 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xfb, 0x62, 0x0, 0x13, 0x8e, - 0xff, 0xff, 0x60, 0x0, 0x0, 0xb, 0xff, 0xfe, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, - 0x0, 0x0, 0x7f, 0xff, 0xb1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xfe, 0x10, 0x1, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x90, 0x8, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, - 0xd, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf6, 0x1f, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xfa, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x5f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xfe, 0x5f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xfe, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x1f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xfa, 0xd, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, - 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf1, 0x1, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x90, 0x0, 0x7f, 0xff, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x10, 0x0, - 0xb, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xfb, 0x62, 0x0, 0x3, 0x7e, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, - 0xbe, 0xff, 0xfd, 0xa6, 0x10, 0x0, 0x0, 0x0, - - /* U+0050 "P" */ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x30, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x30, 0x0, 0x7f, 0xff, 0xee, 0xee, - 0xee, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x1, 0x4a, 0xff, 0xff, 0x40, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xd0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf4, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xfc, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfa, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xc0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x2, - 0x5b, 0xff, 0xff, 0x30, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, - 0x7f, 0xff, 0xee, 0xee, 0xee, 0xed, 0xa7, 0x20, - 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xed, - 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x62, - 0x0, 0x14, 0x8e, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfe, 0x10, 0x0, 0x1, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0x90, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, - 0xd, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x1f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xfa, 0x0, 0x4f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfd, 0x0, 0x5f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x0, - 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x4f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xfd, 0x0, 0x2f, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xfa, 0x0, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, - 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x2, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x10, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xfa, 0x40, 0x0, 0x2, - 0x6d, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, - 0xff, 0xff, 0xe6, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xc4, - 0x10, 0x28, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xd4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x48, 0xa9, 0x84, 0x0, 0x0, - - /* U+0052 "R" */ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x30, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc3, 0x0, 0x0, 0x7f, 0xff, 0xee, - 0xee, 0xee, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x14, 0xaf, 0xff, - 0xf4, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xd0, 0x7, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf9, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xb0, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x7, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xb0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf8, 0x7, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x7f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, - 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x25, 0xbf, - 0xff, 0xf3, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, - 0x7f, 0xff, 0xdd, 0xdd, 0xdd, 0xde, 0xff, 0xd0, - 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x7, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, - 0x10, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xfa, 0x0, 0x7, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf2, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xc0, - - /* U+0053 "S" */ - 0x0, 0x0, 0x3, 0x8c, 0xdf, 0xfe, 0xc9, 0x50, - 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x10, 0x0, 0x5f, 0xff, 0xff, 0xfe, - 0xef, 0xff, 0xff, 0xf8, 0x0, 0x2f, 0xff, 0xf8, - 0x20, 0x0, 0x2, 0x6b, 0xff, 0x20, 0x9, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x70, 0x0, - 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xfd, 0x83, - 0x0, 0x0, 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, - 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x8c, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x6d, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xfb, 0x3, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x90, 0xde, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x5f, 0xff, - 0xe8, 0x40, 0x0, 0x0, 0x39, 0xff, 0xfc, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x10, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xfe, - 0xdb, 0x72, 0x0, 0x0, - - /* U+0054 "T" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xce, 0xee, 0xee, 0xee, - 0xff, 0xff, 0xee, 0xee, 0xee, 0xec, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, - - /* U+0055 "U" */ - 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x8a, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xaf, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x8a, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf8, 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x8a, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xaf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x8a, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf8, 0xaf, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x8a, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xf8, 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x8a, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xaf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x8a, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf7, 0x9f, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x68, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, - 0x5f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x31, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf0, 0xb, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, - 0x4f, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0x20, 0x0, 0x9f, 0xff, 0xe8, 0x30, 0x0, - 0x38, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xad, 0xef, 0xed, - 0xa5, 0x0, 0x0, 0x0, - - /* U+0056 "V" */ - 0xd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xf1, 0x6, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x90, 0x0, 0xef, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, - 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x1f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, - 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x3, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x10, 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, 0x0, - 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xe0, 0x0, 0x8, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xf5, 0x0, 0xe, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfc, 0x0, 0x6f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x30, 0xdf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xa4, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0057 "W" */ - 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xb0, 0x1f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x10, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xb0, 0x0, 0x1f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xe9, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, 0x0, - 0xcf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf9, - 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x10, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x40, 0xef, 0xf5, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xb0, 0x0, 0x0, 0x1f, 0xff, 0x60, - 0x0, 0x0, 0x3, 0xff, 0xe0, 0x9, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, - 0xcf, 0xfb, 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x0, - 0x3f, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, - 0x0, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0xe, - 0xff, 0x40, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x8, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x60, - 0x0, 0x3, 0xff, 0xe0, 0x0, 0x9, 0xff, 0xb0, - 0x0, 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfb, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, - 0x3f, 0xff, 0x0, 0x0, 0x3f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, 0xe, 0xff, - 0x30, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x8, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x50, - 0x4, 0xff, 0xe0, 0x0, 0x0, 0x8, 0xff, 0xb0, - 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfb, 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf0, 0xe, 0xff, 0x30, - 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x8, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x54, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, - 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfa, 0xaf, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, - - /* U+0058 "X" */ - 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf7, 0x0, 0xe, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xfb, 0x0, 0x0, - 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xfe, 0x10, 0x0, 0x0, 0x8f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x0, 0x0, - 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf8, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf4, 0x3, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xe2, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf6, 0x9, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, 0xd, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, - 0x10, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x1e, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfd, - 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, - 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf2, - - /* U+0059 "Y" */ - 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xd0, 0x3, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x30, - 0x0, 0xaf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x1f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, - 0x0, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x2, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xe1, 0x0, 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xf9, 0x0, 0x0, 0x5f, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x30, 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x9, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf6, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xcf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+005A "Z" */ - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4e, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, - - /* U+005B "[" */ - 0x7f, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xfa, - 0x7f, 0xff, 0xaa, 0xa7, 0x7f, 0xfd, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xaa, 0xa7, - 0x7f, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xfa, - - /* U+005C "\\" */ - 0x18, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, - - /* U+005D "]" */ - 0x5f, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0xfc, - 0x3a, 0xaa, 0xdf, 0xfc, 0x0, 0x0, 0x8f, 0xfc, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, - 0x0, 0x0, 0x8f, 0xfc, 0x3a, 0xaa, 0xdf, 0xfc, - 0x5f, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0xfc, - - /* U+005E "^" */ - 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xf9, 0xbf, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xf2, 0x4f, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xb0, 0xe, 0xfa, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x40, 0x7, 0xff, 0x10, 0x0, - 0x0, 0xa, 0xfe, 0x0, 0x1, 0xff, 0x70, 0x0, - 0x0, 0x1f, 0xf7, 0x0, 0x0, 0xaf, 0xe0, 0x0, - 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x3f, 0xf5, 0x0, - 0x0, 0xef, 0xa0, 0x0, 0x0, 0xc, 0xfc, 0x0, - 0x6, 0xff, 0x30, 0x0, 0x0, 0x6, 0xff, 0x30, - 0xc, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xef, 0x90, - 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, - - /* U+005F "_" */ - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, - - /* U+0060 "`" */ - 0x5, 0x88, 0x83, 0x0, 0x0, 0x0, 0xbf, 0xfe, - 0x30, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x4e, 0xff, 0x40, 0x0, 0x0, 0x2, 0xdf, - 0xf4, - - /* U+0061 "a" */ - 0x0, 0x0, 0x59, 0xde, 0xff, 0xda, 0x40, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, - 0x0, 0x9, 0xff, 0xff, 0xfd, 0xde, 0xff, 0xff, - 0xd1, 0x0, 0x2f, 0xf9, 0x30, 0x0, 0x2, 0xaf, - 0xff, 0x90, 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0x14, 0x45, - 0x55, 0x55, 0xef, 0xf5, 0x0, 0x8, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xb, 0xff, 0xe7, - 0x20, 0x0, 0x0, 0xe, 0xff, 0x61, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x4f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x63, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0xf, - 0xff, 0x90, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, - 0x7f, 0xff, 0xd7, 0x55, 0x7d, 0xff, 0xff, 0xf6, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6b, 0xff, - 0x60, 0x0, 0x29, 0xdf, 0xfe, 0xc8, 0x20, 0xbf, - 0xf6, - - /* U+0062 "b" */ - 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x50, 0x6, 0xbe, 0xff, - 0xd9, 0x40, 0x0, 0x0, 0xef, 0xf5, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xb1, 0x0, 0xe, 0xff, 0xaf, - 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xe3, 0x0, 0xef, - 0xff, 0xff, 0x82, 0x0, 0x3, 0xaf, 0xff, 0xe1, - 0xe, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xa0, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x2e, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf7, 0xef, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xae, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, - 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xbe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfa, 0xef, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x7e, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, 0xef, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0xe, - 0xff, 0xff, 0xf8, 0x20, 0x0, 0x3a, 0xff, 0xfe, - 0x10, 0xef, 0xf8, 0xff, 0xff, 0xed, 0xff, 0xff, - 0xfe, 0x30, 0xe, 0xff, 0x34, 0xef, 0xff, 0xff, - 0xff, 0xfb, 0x10, 0x0, 0xef, 0xf3, 0x0, 0x6b, - 0xef, 0xfd, 0x94, 0x0, 0x0, 0x0, - - /* U+0063 "c" */ - 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa5, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xd3, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfe, 0xef, - 0xff, 0xff, 0x40, 0x0, 0xbf, 0xff, 0xc4, 0x0, - 0x1, 0x6e, 0xff, 0xe1, 0x6, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x1, 0xdd, 0x40, 0xe, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x4f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x6, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x1, 0xde, 0x40, 0x0, 0xaf, - 0xff, 0xc4, 0x0, 0x0, 0x6e, 0xff, 0xe1, 0x0, - 0xb, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa4, - 0x0, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, - 0x2, 0x8c, 0xff, 0xec, 0x71, 0x2, 0xff, 0xf1, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x62, - 0xff, 0xf1, 0x0, 0x1d, 0xff, 0xff, 0xfd, 0xef, - 0xff, 0xfa, 0xff, 0xf1, 0x0, 0xcf, 0xff, 0xc4, - 0x0, 0x1, 0x7e, 0xff, 0xff, 0xf1, 0x8, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf1, - 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf1, 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x8f, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, - 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf1, 0x4f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0xe, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, - 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf1, 0x0, 0xcf, 0xff, 0x91, 0x0, 0x0, - 0x3d, 0xff, 0xff, 0xf1, 0x0, 0x1d, 0xff, 0xff, - 0xca, 0xbd, 0xff, 0xfa, 0xff, 0xf1, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xf1, - 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, 0x82, 0x0, - 0xff, 0xf1, - - /* U+0065 "e" */ - 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, 0x82, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xcb, - 0xdf, 0xff, 0xfc, 0x0, 0x0, 0xb, 0xff, 0xf7, - 0x0, 0x0, 0x18, 0xff, 0xf9, 0x0, 0x7, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, - 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xb0, 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x17, 0xff, 0xd5, 0x55, 0x55, 0x55, - 0x55, 0x55, 0xef, 0xf4, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x7f, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0xaf, 0xff, - 0xc4, 0x0, 0x0, 0x29, 0xff, 0xa0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xed, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xeb, - 0x71, 0x0, 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x0, 0x6b, 0xef, 0xeb, 0x50, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0xaf, 0xff, 0xdb, 0xcf, 0x90, 0x0, 0x1, 0xff, - 0xf7, 0x0, 0x1, 0x10, 0x0, 0x5, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5a, - 0xac, 0xff, 0xfa, 0xaa, 0xaa, 0x0, 0x0, 0x7, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x0, 0x2, 0x8c, 0xef, 0xec, 0x82, 0x0, - 0xcf, 0xf5, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xcf, 0xf5, 0x0, 0x1d, 0xff, 0xff, - 0xfd, 0xdf, 0xff, 0xfb, 0xcf, 0xf5, 0x0, 0xcf, - 0xff, 0xb4, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xf5, - 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf5, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf5, 0x4f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x7f, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, - 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf5, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf5, 0x7f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, 0x3f, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, - 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xf5, 0x6, 0xff, 0xfb, 0x10, 0x0, 0x0, - 0x2, 0xcf, 0xff, 0xf5, 0x0, 0xaf, 0xff, 0xe7, - 0x20, 0x13, 0x8e, 0xff, 0xff, 0xf5, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xf5, - 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xfe, 0x60, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x59, 0xcc, 0xba, - 0x50, 0x0, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xc0, - 0x0, 0x6a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0x60, 0x1, 0xff, 0xfa, 0x41, 0x0, 0x0, - 0x28, 0xff, 0xfd, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xed, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, - 0x0, 0x0, 0x16, 0x9c, 0xef, 0xfe, 0xc8, 0x30, - 0x0, 0x0, - - /* U+0068 "h" */ - 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf5, 0x1, 0x7b, 0xef, 0xfd, 0x92, 0x0, 0x0, - 0xef, 0xf5, 0x6e, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0xef, 0xfc, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xf9, 0x0, 0xef, 0xff, 0xfe, 0x61, 0x0, 0x16, - 0xef, 0xff, 0x40, 0xef, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xb0, 0xef, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf0, 0xef, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, 0xef, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, 0xef, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, - 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, - 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf3, - - /* U+0069 "i" */ - 0x2, 0x75, 0x2, 0xff, 0xf9, 0x6f, 0xff, 0xe3, - 0xff, 0xfa, 0x5, 0xa8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0xef, - 0xf5, 0xe, 0xff, 0x50, 0xef, 0xf5, 0xe, 0xff, - 0x50, 0xef, 0xf5, 0xe, 0xff, 0x50, 0xef, 0xf5, - 0xe, 0xff, 0x50, 0xef, 0xf5, 0xe, 0xff, 0x50, - 0xef, 0xf5, 0xe, 0xff, 0x50, 0xef, 0xf5, 0xe, - 0xff, 0x50, 0xef, 0xf5, 0xe, 0xff, 0x50, 0xef, - 0xf5, - - /* U+006A "j" */ - 0x0, 0x0, 0x0, 0x1, 0x66, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x3, 0xa9, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x80, 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x60, 0x1, 0x40, - 0x0, 0x9f, 0xff, 0x20, 0x8, 0xfe, 0xce, 0xff, - 0xfa, 0x0, 0xe, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x4, 0xbe, 0xff, 0xc7, 0x0, 0x0, - - /* U+006B "k" */ - 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, - 0xef, 0xf5, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, - 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x90, 0x0, 0xef, 0xf5, 0x0, 0x0, 0xa, 0xff, - 0xf8, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0xbf, - 0xff, 0x80, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x1c, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x1, - 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, 0xef, 0xf5, - 0x2e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf9, 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xfe, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xfe, 0x33, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0xef, 0xff, 0xe2, 0x0, 0x6f, 0xff, - 0xb0, 0x0, 0x0, 0xef, 0xfd, 0x20, 0x0, 0x9, - 0xff, 0xf8, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x50, 0x0, 0xef, 0xf5, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xf2, 0x0, 0xef, 0xf5, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x0, 0xef, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, - 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf7, - - /* U+006C "l" */ - 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, - 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, - 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, - 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, - 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, - 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, - 0xef, 0xf5, - - /* U+006D "m" */ - 0xef, 0xf3, 0x2, 0x8c, 0xef, 0xec, 0x61, 0x0, - 0x0, 0x27, 0xce, 0xfe, 0xc8, 0x20, 0x0, 0xe, - 0xff, 0x38, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0xef, - 0xfc, 0xff, 0xfd, 0xbc, 0xff, 0xff, 0xf3, 0xbf, - 0xff, 0xec, 0xce, 0xff, 0xff, 0x70, 0xe, 0xff, - 0xff, 0xb2, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfd, - 0x40, 0x0, 0x4, 0xef, 0xff, 0x10, 0xef, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x2, 0xff, 0xf8, 0xe, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xc0, 0xef, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xfe, 0xe, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf0, 0xef, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xe, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf0, 0xef, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xf0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, - 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, - - /* U+006E "n" */ - 0xef, 0xf3, 0x1, 0x7c, 0xef, 0xfd, 0x92, 0x0, - 0x0, 0xef, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0xef, 0xfc, 0xff, 0xfe, 0xcc, 0xef, - 0xff, 0xf9, 0x0, 0xef, 0xff, 0xfc, 0x30, 0x0, - 0x3, 0xdf, 0xff, 0x40, 0xef, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xb0, 0xef, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0xef, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, 0xef, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, - 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, - 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf3, - - /* U+006F "o" */ - 0x0, 0x0, 0x1, 0x7c, 0xef, 0xfd, 0xa5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xd3, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xfd, 0xef, 0xff, 0xff, 0x70, 0x0, 0x0, 0xbf, - 0xff, 0xc4, 0x0, 0x1, 0x6e, 0xff, 0xf4, 0x0, - 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0x10, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x80, 0x4f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, 0x7f, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, - 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf2, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x3f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, - 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x70, 0x6, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xfe, 0x10, 0x0, 0xaf, 0xff, 0xc4, - 0x0, 0x1, 0x6e, 0xff, 0xf4, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, - 0xa5, 0x0, 0x0, 0x0, - - /* U+0070 "p" */ - 0xef, 0xf3, 0x1, 0x7b, 0xef, 0xfd, 0x94, 0x0, - 0x0, 0xe, 0xff, 0x36, 0xef, 0xff, 0xff, 0xff, - 0xfb, 0x10, 0x0, 0xef, 0xfa, 0xff, 0xfe, 0xcb, - 0xcf, 0xff, 0xfe, 0x30, 0xe, 0xff, 0xff, 0xe6, - 0x0, 0x0, 0x17, 0xff, 0xfe, 0x10, 0xef, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0xe, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xf2, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0x7e, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfa, 0xef, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xbe, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, 0xef, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xae, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf7, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x2e, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xa0, 0xef, 0xff, 0xff, - 0x82, 0x0, 0x3, 0xaf, 0xff, 0xe1, 0xe, 0xff, - 0xaf, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xe3, 0x0, - 0xef, 0xf5, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xb1, - 0x0, 0xe, 0xff, 0x50, 0x6, 0xbe, 0xff, 0xd9, - 0x40, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, 0x71, 0x0, - 0xff, 0xf1, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xf1, 0x0, 0x1d, 0xff, 0xff, - 0xfd, 0xef, 0xff, 0xf8, 0xff, 0xf1, 0x0, 0xcf, - 0xff, 0xc4, 0x0, 0x1, 0x7f, 0xff, 0xff, 0xf1, - 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0xf1, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf1, 0x4f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x7f, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, - 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf1, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x4f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, - 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf1, 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xf1, 0x0, 0xcf, 0xff, 0xc4, - 0x0, 0x1, 0x6e, 0xff, 0xff, 0xf1, 0x0, 0x1d, - 0xff, 0xff, 0xfd, 0xef, 0xff, 0xf9, 0xff, 0xf1, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x52, - 0xff, 0xf1, 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, - 0x71, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf1, - - /* U+0072 "r" */ - 0xef, 0xf3, 0x1, 0x7b, 0xec, 0xef, 0xf3, 0x5e, - 0xff, 0xfc, 0xef, 0xf7, 0xff, 0xff, 0xfc, 0xef, - 0xff, 0xff, 0x94, 0x21, 0xef, 0xff, 0xe2, 0x0, - 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0xef, 0xfc, - 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, - 0xef, 0xf6, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, - 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0xef, - 0xf5, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, - 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0xef, 0xf5, - 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, - 0xef, 0xf5, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, - 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x0, 0x28, 0xce, 0xff, 0xeb, 0x84, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x30, 0x0, 0xaf, 0xff, 0xfe, 0xcc, 0xef, 0xff, - 0xe0, 0x0, 0x3f, 0xff, 0x92, 0x0, 0x0, 0x16, - 0xd6, 0x0, 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x85, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x18, 0xdf, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x13, 0x69, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x0, 0x6, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x6, - 0xfd, 0x73, 0x0, 0x0, 0x5, 0xef, 0xfa, 0x0, - 0xef, 0xff, 0xff, 0xdc, 0xdf, 0xff, 0xff, 0x20, - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x0, 0x38, 0xbe, 0xff, 0xfd, 0xa4, 0x0, - 0x0, - - /* U+0074 "t" */ - 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x5a, 0xac, 0xff, 0xfa, 0xaa, 0xaa, - 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfa, 0x0, 0x3, 0x20, 0x0, 0x0, 0xbf, - 0xff, 0xec, 0xdf, 0xa0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7c, 0xff, - 0xea, 0x30, - - /* U+0075 "u" */ - 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xfe, 0x1f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x1f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x1f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x1f, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, - 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xfe, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xfe, 0xf, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xfe, 0xd, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xfe, 0x9, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x2, 0xff, - 0xfe, 0x40, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0x0, - 0x7f, 0xff, 0xfe, 0xbb, 0xdf, 0xff, 0xcf, 0xfe, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, - 0xfe, 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc8, 0x20, - 0x3f, 0xfe, - - /* U+0076 "v" */ - 0xd, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xfd, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x60, 0x0, 0xef, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xe0, 0x0, - 0x8, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xf8, 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x10, 0x0, 0x0, 0xaf, 0xfa, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0x0, 0x0, - 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, - 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, - 0x0, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf6, 0x0, 0x5, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0xcf, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x40, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xfa, 0xa, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, - - /* U+0077 "w" */ - 0x9f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x23, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0xd, - 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x7f, - 0xf9, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x2, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0xff, 0x60, - 0x0, 0x0, 0x3, 0xff, 0xa0, 0x0, 0xc, 0xff, - 0x40, 0x0, 0x0, 0x2f, 0xfd, 0x4f, 0xfc, 0x0, - 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x6f, 0xfa, - 0x0, 0x0, 0x8, 0xff, 0x70, 0xef, 0xf2, 0x0, - 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0xff, 0xf1, - 0x0, 0x0, 0xdf, 0xf1, 0x8, 0xff, 0x80, 0x0, - 0x5, 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0x60, - 0x0, 0x4f, 0xfb, 0x0, 0x2f, 0xfd, 0x0, 0x0, - 0xbf, 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xfc, 0x0, - 0xa, 0xff, 0x40, 0x0, 0xbf, 0xf3, 0x0, 0x1f, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, - 0xff, 0xe0, 0x0, 0x5, 0xff, 0x90, 0x7, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x8, 0xff, 0x70, 0x6f, - 0xf8, 0x0, 0x0, 0xf, 0xff, 0x0, 0xdf, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0xc, 0xff, - 0x20, 0x0, 0x0, 0x9f, 0xf5, 0x3f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf6, 0xff, 0xc0, - 0x0, 0x0, 0x3, 0xff, 0xb9, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, - - /* U+0078 "x" */ - 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xf8, 0x0, 0x1e, 0xff, 0x90, 0x0, 0x0, 0x0, - 0xcf, 0xfb, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x0, - 0x0, 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x7f, 0xff, - 0x20, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0xbf, 0xfd, 0x0, 0x2f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xfa, 0xc, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x7f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x8f, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x80, - 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xc0, 0x0, 0x1, 0xef, 0xf9, 0x0, 0x0, 0x9, - 0xff, 0xe1, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x0, - 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf2, 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xd0, - - /* U+0079 "y" */ - 0xd, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xfd, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x60, 0x0, 0xef, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, - 0x8, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf8, 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0xaf, 0xfb, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, - 0x3, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf3, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x90, 0x0, 0x0, - 0x5f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf7, 0x0, 0x3, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0xaf, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x40, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xfb, 0x8, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0xef, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xdf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7, 0x0, 0x3, - 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xcd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, 0xff, 0xc7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xbf, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xa4, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - - /* U+007B "{" */ - 0x0, 0x0, 0x2, 0x9e, 0xff, 0x40, 0x0, 0x3, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0xdf, 0xff, 0xda, - 0x20, 0x0, 0x2f, 0xff, 0x80, 0x0, 0x0, 0x4, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0xfe, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, 0x1b, 0xff, - 0xb0, 0x0, 0x1, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xbc, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfd, 0xa2, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x2a, 0xef, 0xf4, - - /* U+007C "|" */ - 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, - 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, - 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, - 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, - 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, - 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, - 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, - 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, - - /* U+007D "}" */ - 0x5f, 0xfd, 0x91, 0x0, 0x0, 0x5f, 0xff, 0xfe, - 0x20, 0x0, 0x3a, 0xdf, 0xff, 0xc0, 0x0, 0x0, - 0x9, 0xff, 0xf1, 0x0, 0x0, 0x1, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, - 0xcf, 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x9f, - 0xff, 0xba, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, - 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, - 0x1, 0xff, 0xf4, 0x0, 0x0, 0x8, 0xff, 0xf2, - 0x0, 0x3a, 0xdf, 0xff, 0xd0, 0x0, 0x5f, 0xff, - 0xff, 0x30, 0x0, 0x5f, 0xfe, 0x92, 0x0, 0x0, - - /* U+007E "~" */ - 0x0, 0x8, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x6f, - 0xc0, 0xb, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x9, - 0xfa, 0x5, 0xff, 0xd8, 0xbf, 0xfe, 0x30, 0x1, - 0xff, 0x70, 0xbf, 0xc0, 0x0, 0x6f, 0xff, 0xa8, - 0xef, 0xf2, 0xe, 0xf5, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xf7, 0x0, 0xcc, 0x20, 0x0, 0x0, 0x19, - 0xef, 0xd6, 0x0, - - /* U+00B0 "°" */ - 0x0, 0x5, 0xbe, 0xfc, 0x60, 0x0, 0x0, 0xaf, - 0xfd, 0xdf, 0xfc, 0x10, 0x8, 0xfc, 0x20, 0x1, - 0xaf, 0xc0, 0x1f, 0xe1, 0x0, 0x0, 0xc, 0xf4, - 0x5f, 0x90, 0x0, 0x0, 0x5, 0xf9, 0x6f, 0x70, - 0x0, 0x0, 0x3, 0xfa, 0x5f, 0x90, 0x0, 0x0, - 0x5, 0xf9, 0x1f, 0xe1, 0x0, 0x0, 0xc, 0xf4, - 0x8, 0xfc, 0x20, 0x1, 0xbf, 0xc0, 0x0, 0xaf, - 0xfe, 0xdf, 0xfd, 0x10, 0x0, 0x5, 0xbe, 0xfc, - 0x70, 0x0, - - /* U+2022 "•" */ - 0x0, 0x1, 0x0, 0x0, 0x7f, 0xfd, 0x30, 0x5f, - 0xff, 0xfe, 0x1a, 0xff, 0xff, 0xf4, 0xaf, 0xff, - 0xff, 0x44, 0xff, 0xff, 0xd0, 0x5, 0xdf, 0xb2, - 0x0, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x27, 0xbb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x49, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x6b, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, - 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x29, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6, 0x10, 0x1f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x84, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x62, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x89, 0x87, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x24, 0x54, 0x6f, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x49, 0xcd, 0xdb, 0x72, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3a, 0xef, 0xff, 0xea, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F008 "" */ - 0x17, 0x10, 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0x0, 0x1, - 0x71, 0xdf, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x2, 0xfd, 0xff, 0x96, 0x66, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xcc, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xcc, 0xce, 0xff, 0xff, 0x20, 0x0, - 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xf8, 0x0, 0x2, 0xff, 0xff, 0x20, - 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x2, 0xff, 0xff, - 0x20, 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x2, 0xff, - 0xff, 0x40, 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x62, 0x22, 0xef, 0xfc, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0xef, - 0xfb, 0x22, 0x26, 0xff, 0xff, 0x20, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x2, 0xff, 0xff, 0x20, - 0x0, 0xcf, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xde, 0xff, 0xf8, 0x0, 0x2, 0xff, 0xff, - 0xca, 0xaa, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xfe, 0xaa, 0xac, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb8, 0x88, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x88, - 0x8b, 0xff, 0xff, 0x20, 0x0, 0xcf, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf7, - 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0xcf, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xf7, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0xcf, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xf7, 0x0, 0x2, 0xff, 0xff, 0x74, 0x44, - 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfc, 0x44, 0x48, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xef, 0xff, - 0xff, 0x30, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x3, - 0xff, 0x7f, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x2, 0xf7, - - /* U+F00B "" */ - 0x28, 0x88, 0x88, 0x88, 0x71, 0x0, 0x28, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x6e, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x6e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x17, 0x88, 0x88, 0x88, 0x71, - 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x71, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x77, 0x77, - 0x77, 0x60, 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x61, 0xcf, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x1c, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x2, 0xef, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x4b, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdb, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F00D "" */ - 0x0, 0x26, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x15, 0x40, 0x0, 0x4, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x0, - 0x4f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xa0, 0xdf, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf3, - 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xc0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2e, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xd1, 0x8f, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8, 0xff, - 0xff, 0xff, 0xff, 0x60, 0xcf, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf2, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xe1, - 0xb, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x30, 0x0, 0x9e, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xc3, 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, - 0xdd, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, - 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0x13, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, - 0xfb, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x3, - 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x50, 0x0, 0xef, 0xff, 0xf7, 0x0, - 0xc, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xd0, 0x0, 0xef, 0xff, 0xf7, - 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xef, 0xff, - 0xf7, 0x0, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, 0x0, 0xef, - 0xff, 0xf7, 0x0, 0xa, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0xef, 0xff, 0xf7, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0xef, 0xff, 0xff, 0x40, 0x0, - 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xf7, 0x0, 0x5, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xfe, 0x0, 0xb, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x3f, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xc0, 0x5f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xe0, - 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xf0, 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xf0, 0x6f, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xf0, 0x5f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x44, 0x10, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xe0, 0x2f, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0xa, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x40, 0x5, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, - 0xfd, 0x50, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xb9, 0x78, 0x9d, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, - 0xbc, 0xdd, 0xca, 0x73, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, - 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x4c, 0xff, 0xff, - 0xff, 0xff, 0x92, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x6, 0xfb, 0x20, 0x1b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x4, 0xdf, 0x40, 0x0, - 0x0, 0x4f, 0xff, 0xf9, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0xe2, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x20, - 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0x0, 0x5e, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xd4, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x4, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x20, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, - 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, - 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0xc, 0xff, 0xa1, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x2b, 0xff, 0xa0, 0x0, - 0x0, 0x1, 0x93, 0x0, 0x3, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x20, 0x0, 0x59, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0xab, - 0xba, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x9a, 0x50, 0x0, 0x0, 0x7, 0xbb, 0xba, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0xe, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0xef, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0xe, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xf6, 0x4e, 0xff, 0xff, 0xf8, 0xef, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xe3, 0x0, 0x1c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xa0, 0x2, 0xdf, 0x40, 0x7, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x70, 0x4, - 0xff, 0xff, 0x70, 0x4, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0x50, 0x7, 0xff, 0xff, 0xff, 0xa0, 0x2, - 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xfd, 0x20, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xc1, 0x1, 0xbf, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xfc, 0x10, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x9f, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xf9, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xff, 0xf5, - 0x0, 0x5f, 0xff, 0xff, 0xf6, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x3e, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xe4, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x2d, 0xff, 0xff, 0xf2, - 0x5f, 0xff, 0xd2, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0xb, 0xff, 0xf9, 0x0, 0x9f, 0xb0, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x30, 0x8, 0xfc, 0x0, 0x0, - 0x40, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x3, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x88, 0x88, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x88, - 0x88, 0x88, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xac, 0xcc, 0xcc, 0xdf, 0xff, 0xff, 0xff, 0xfd, - 0xcc, 0xcc, 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0xcf, 0xff, - 0xfc, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x10, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xb, - 0xff, 0xc0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x99, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x66, 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, 0xf6, 0x8, 0xfa, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x6, 0xf8, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F01C "" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xa0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0xcf, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xfe, 0x10, 0x6f, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xfa, 0xd, 0xff, 0xff, - 0xcc, 0xcc, 0xcc, 0xcc, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, - 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa8, 0x88, 0x88, 0x88, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe9, 0x0, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdd, - 0xda, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, - 0xef, 0xff, 0xfd, 0x95, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, - 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x10, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe3, 0x8, 0xff, 0xff, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xaa, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, - 0x4b, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xe, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x8f, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xa9, 0x87, 0x76, 0xbf, - 0xff, 0xff, 0xff, 0x7, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x49, 0xaa, 0x80, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xf1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xd0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0xff, - 0xff, 0xff, 0xfd, 0xdd, 0xef, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x30, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xfb, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, - 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, - 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x20, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, 0x9e, 0xff, - 0xff, 0xff, 0xfb, 0x63, 0x11, 0x36, 0xaf, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0xff, 0xff, 0x81, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xff, 0xff, - 0x90, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xa0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x29, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, - 0x79, 0xba, 0x98, 0x51, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x24, 0x43, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xab, 0xbb, 0xbb, 0xbd, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x7f, 0xa1, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xef, - 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x9f, 0xff, 0xa0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x8, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xef, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xf6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x1, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x2d, 0xff, 0xe0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xdf, 0xff, 0x60, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xdf, - 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x29, 0x40, 0x0, 0x3a, - 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x98, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0x50, 0x0, - 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x1, 0xff, 0xd3, 0x0, 0x7, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0x0, - 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf2, 0x0, 0x1f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, - 0x8f, 0xfe, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x70, 0x1, 0xff, 0xf4, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x8, 0xfb, 0x10, 0x0, 0xaf, 0xfe, 0x0, 0xb, - 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xff, 0xfe, 0x10, 0x2, - 0xff, 0xf4, 0x0, 0x6f, 0xfd, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, - 0xff, 0xfa, 0x0, 0xc, 0xff, 0x80, 0x3, 0xff, - 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x7, 0xff, 0xf1, 0x0, 0x8f, - 0xfb, 0x0, 0xf, 0xff, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xe, - 0xff, 0x50, 0x6, 0xff, 0xd0, 0x0, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xcf, 0xf6, 0x0, 0x5f, 0xfd, - 0x0, 0xf, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2f, 0xff, - 0x30, 0x6, 0xff, 0xc0, 0x0, 0xff, 0xf2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x2d, 0xff, 0xe0, 0x0, 0xaf, 0xfa, 0x0, - 0x2f, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xd, 0xff, 0xf5, 0x0, - 0xe, 0xff, 0x70, 0x5, 0xff, 0xe0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xdf, 0xf7, 0x0, 0x6, 0xff, 0xf2, 0x0, 0x9f, - 0xfb, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x2, 0x83, 0x0, 0x1, 0xef, - 0xfb, 0x0, 0xe, 0xff, 0x70, 0x3a, 0xbb, 0xbb, - 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x5, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x80, - 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xb0, 0x0, 0x6f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x1e, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x9d, - 0x60, 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2d, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0x2, 0x8a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, - 0x20, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x31, - 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc4, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x75, 0x8e, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x3f, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x3, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x3f, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x74, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x70, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xd9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xff, 0xff, 0x40, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xef, 0xff, 0x50, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xcf, 0xff, 0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x9f, 0xff, 0xd0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x4f, 0xff, 0xf6, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, 0x30, - 0x7, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xb5, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, - 0xcf, 0xff, 0xff, 0xd9, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x21, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F048 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5b, 0xbb, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8b, 0x50, 0xbf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf4, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xf7, 0xcf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf8, 0xcf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf8, - 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, - 0xf0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xcf, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, - 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xcf, 0xff, 0xf2, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, - 0xff, 0xf0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf7, 0xcf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xf6, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xab, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 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, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe5, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, - 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x2, 0x9b, 0xbb, 0xbb, 0xba, 0x81, 0x0, 0x0, - 0x0, 0x29, 0xbb, 0xbb, 0xbb, 0xa8, 0x10, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x8, 0xef, 0xff, 0xff, 0xff, - 0xd5, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, 0xff, - 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F04D "" */ - 0x2, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa8, 0x10, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x8, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F051 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xb7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xbb, 0xb5, 0x5f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xfb, 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x1f, 0xff, 0xfb, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1f, 0xff, - 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x1f, 0xff, 0xfb, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, - 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x2f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xfb, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1f, - 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0xfb, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xfb, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x7f, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xfb, 0xb, 0xfd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, - 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xc4, 0x0, - - /* U+F054 "" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xfe, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xba, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xa9, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3c, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xa1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x4, 0x67, - 0x77, 0x77, 0x77, 0x79, 0xff, 0xff, 0xff, 0x77, - 0x77, 0x77, 0x77, 0x76, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F068 "" */ - 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x20, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x23, 0x44, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xd9, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, - 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1b, 0xff, 0xff, 0xff, 0xf8, 0x30, 0x0, - 0x2, 0x7e, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, - 0xa1, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x4f, 0xff, 0xa2, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf6, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xd0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x20, 0x4, 0xef, - 0xff, 0xff, 0xff, 0x40, 0x8, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x2f, 0xde, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xfe, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x9, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x1, 0x69, 0x97, 0x20, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x2d, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, - 0xe5, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, - 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xfd, 0x95, 0x33, 0x47, - 0xcf, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, - 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x2, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, - 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x13, - 0x44, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x1, 0x59, 0xdf, 0xff, 0xff, 0xff, - 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x90, 0x5b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x51, 0x0, 0x2, - 0x6d, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfb, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1b, 0xff, 0xff, 0xfe, 0x30, 0x2e, 0xfd, - 0x92, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0x60, 0xef, 0xff, 0xf5, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xb1, 0x0, 0x0, 0x4, 0xef, 0xff, - 0xff, 0xae, 0xff, 0xff, 0xf4, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xe3, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x6, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x90, 0x7, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xb1, 0xdf, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, - 0x95, 0x33, 0x51, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xd2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, - 0xac, 0xef, 0xfe, 0xdb, 0x81, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xef, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, - 0x0, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4a, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x43, 0x33, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x71, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x38, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x20, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xc1, 0x0, 0x35, 0x55, 0x55, 0x55, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x55, - 0x5a, 0xff, 0xff, 0xfc, 0x10, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xc0, 0x3, 0xff, 0xff, 0xff, 0xc0, 0x8, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xfd, 0x10, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x8, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xe2, 0x2, 0xef, 0xff, 0xff, 0xe1, 0x0, - 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x30, 0x1e, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0x50, 0xb, 0x70, 0x0, 0x5, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf7, 0x0, 0xaf, 0xf6, 0x0, 0x8, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0x50, 0x8, - 0xff, 0xff, 0xc1, 0x0, 0x35, 0x55, 0x55, 0x9f, - 0xff, 0xff, 0xf9, 0x0, 0x6f, 0xff, 0xff, 0xf6, - 0x5a, 0xff, 0xff, 0xfc, 0x10, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0xcf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x84, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xae, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf9, 0x2, - 0xef, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0x90, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xf6, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0x60, 0x9f, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xf2, 0x9f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf1, - 0x1c, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x50, 0x0, - 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F078 "" */ - 0x0, 0x38, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x70, 0x0, 0x5, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x4f, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xc0, 0xaf, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xf2, 0x5f, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x9f, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x29, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x0, 0x59, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x14, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x30, 0x1b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0x5d, 0xff, 0xf6, 0xbf, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf6, 0xd, 0xff, 0xf6, 0xc, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0xae, 0x60, 0xd, - 0xff, 0xf6, 0x1, 0xbd, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x31, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x31, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x50, - 0x5f, 0xff, 0xe0, 0xa, 0xff, 0x40, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x5f, 0xff, - 0xe0, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0x8f, 0xff, 0xe9, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0xa, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, - 0x0, 0x0, - - /* U+F07B "" */ - 0x1, 0x57, 0x88, 0x88, 0x88, 0x88, 0x87, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x31, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x70, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x46, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x13, 0x33, 0x33, 0x4f, 0xff, 0xff, 0xff, 0xf8, - 0x33, 0x33, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x22, 0x22, 0x22, 0x22, 0x10, 0x1f, 0xff, 0xff, - 0xff, 0xf6, 0x1, 0x22, 0x22, 0x22, 0x22, 0x10, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, - 0xff, 0xff, 0xf5, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, - 0xbc, 0xcc, 0xcb, 0x80, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd7, 0x55, 0x55, 0x55, 0x7d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x8, 0xfa, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x6, 0xf8, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x84, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xd9, 0x62, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x2, 0xcf, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfc, - 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x32, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C4 "" */ - 0x0, 0x0, 0x15, 0x64, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xbf, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x53, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6e, 0xff, 0xff, 0x70, 0x1, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, - 0xff, 0xef, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xf6, 0xd, 0xff, 0xfd, - 0x10, 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0xff, 0xff, 0x50, - 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0xf, 0xff, 0xf6, 0x0, - 0xa, 0xff, 0xfb, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0xcf, 0xff, 0xe5, 0x27, - 0xff, 0xff, 0x70, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x56, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd1, - 0x3, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, - 0x9, 0xff, 0xfb, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, - 0xaf, 0xff, 0xb0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0xc, 0xff, 0xfe, 0x52, 0x7f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0x60, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xfb, - 0x30, 0x0, 0x0, 0x7d, 0xff, 0xfc, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x6, 0xc2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x7, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x7, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x7, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, - 0xff, 0xfc, 0x28, 0x99, 0x99, 0x30, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x3, 0x66, 0x66, - 0x66, 0xdf, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x32, 0x22, 0x22, 0x22, 0xff, - 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0x90, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x0, 0x46, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x64, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, 0xfd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xe2, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xfe, - 0x20, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe1, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x56, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x23, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x40, 0x0, 0x1, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, - 0x0, - - /* U+F0C9 "" */ - 0x8c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0E0 "" */ - 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, - 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x1, 0xc3, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x6f, 0xff, 0x80, 0x2, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0xa, 0xff, 0xff, 0xfc, 0x20, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x20, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x30, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x1, 0xbf, - 0xff, 0xfa, 0x10, 0x2d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, - 0x3, 0x99, 0x30, 0x5, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x10, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x77, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x70, - - /* U+F0E7 "" */ - 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x55, 0x55, 0x55, 0x51, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x22, 0x2a, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x0, 0x0, 0x39, 0xb9, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xaa, - 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xa9, - 0x30, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xf6, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, - 0xbb, 0xbb, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x12, 0x22, 0x22, 0x22, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x7, 0xe4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, - 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, - 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, - 0x40, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, 0xfd, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x1, 0x44, 0x44, 0x43, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xed, 0xdd, 0xdd, 0xdc, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, - 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xaa, 0xaa, - 0xaa, 0x50, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x98, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6c, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x43, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x4f, 0xff, 0xf6, 0x0, 0x6, 0xfe, 0x0, - 0x3, 0xff, 0x10, 0x1, 0xff, 0x50, 0x0, 0x5f, - 0xf1, 0x0, 0x1f, 0xff, 0xf4, 0xff, 0xff, 0x40, - 0x0, 0x4f, 0xd0, 0x0, 0x2f, 0xf0, 0x0, 0xe, - 0xf3, 0x0, 0x3, 0xfe, 0x0, 0x0, 0xff, 0xff, - 0x4f, 0xff, 0xf4, 0x0, 0x4, 0xfd, 0x0, 0x2, - 0xff, 0x0, 0x0, 0xef, 0x30, 0x0, 0x3f, 0xe0, - 0x0, 0xf, 0xff, 0xf4, 0xff, 0xff, 0x60, 0x0, - 0x7f, 0xe0, 0x0, 0x4f, 0xf2, 0x0, 0x1f, 0xf5, - 0x0, 0x5, 0xff, 0x10, 0x2, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xa2, 0x22, 0x6f, 0xf3, 0x22, 0x3f, - 0xf6, 0x22, 0x2e, 0xf9, 0x22, 0x27, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x2, - 0xfe, 0x0, 0x0, 0xff, 0x30, 0x0, 0xcf, 0x50, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x2f, 0xe0, 0x0, 0xf, 0xf3, - 0x0, 0xc, 0xf5, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xfe, - 0x0, 0x0, 0xff, 0x30, 0x0, 0xdf, 0x60, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, - 0xfd, 0xdd, 0xff, 0xfe, 0xdd, 0xef, 0xff, 0xdd, - 0xef, 0xff, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xfa, 0x44, 0x4a, - 0xff, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x9f, 0xf6, 0x44, 0x7f, 0xff, 0xf4, 0xff, - 0xff, 0x40, 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, - 0xff, 0xff, 0x4f, 0xff, 0xf4, 0x0, 0x4, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xe0, 0x0, 0xf, 0xff, 0xf4, 0xff, 0xff, - 0x40, 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0xff, - 0xff, 0x4f, 0xff, 0xf9, 0x44, 0x4a, 0xff, 0x54, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x9f, - 0xf5, 0x44, 0x6f, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe9, 0x0, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7b, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x8f, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x56, 0x66, 0x66, 0x66, 0x66, 0x67, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F15B "" */ - 0x28, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, - 0x8, 0x20, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xe2, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0xf, 0xfe, 0x20, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, - 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, 0xfe, 0x20, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0xf, 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, - 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0xf, 0xff, 0xff, 0xff, 0xe2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0xf, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x10, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x68, 0x9a, - 0xa9, 0x87, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x5a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, - 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdc, 0xbb, 0xbc, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x4, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x51, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x7b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, - 0xc1, 0x9, 0xff, 0xff, 0xff, 0xff, 0x81, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xe2, 0xef, - 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5e, 0xff, 0xff, 0xff, 0x64, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, - 0xff, 0xb0, 0x4, 0xff, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x7a, 0xce, 0xff, 0xfd, 0xb9, 0x51, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, 0x0, - 0x3, 0x91, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, - 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x76, - 0x56, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x3b, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xfd, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x45, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, - 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xf4, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0x5f, 0xff, 0xf4, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x3, 0x3f, 0xff, 0xf5, 0xff, - 0xff, 0x40, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xe, - 0xff, 0xf5, 0xff, 0xff, 0x40, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0xef, 0xff, 0x5f, - 0xff, 0xf4, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x5, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x80, 0xf, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, - 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, - 0x0, - - /* U+F241 "" */ - 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xf4, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x5f, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, - 0xff, 0x40, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf5, 0xff, 0xff, 0x40, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, - 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x6, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, - 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, - 0x0, - - /* U+F242 "" */ - 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xf4, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x5f, 0xff, 0xf4, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, - 0xff, 0x40, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf5, 0xff, 0xff, 0x40, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, - 0xff, 0xf4, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x6, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, - 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, - 0x0, - - /* U+F243 "" */ - 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xf4, 0x9, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0x9f, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x5f, 0xff, 0xf4, 0x9, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, - 0xff, 0x40, 0x9f, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0x9, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf5, 0xff, 0xff, 0x40, 0x9f, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, - 0xff, 0xf4, 0x9, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, - 0x9f, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x4, 0x88, 0x88, - 0x88, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, - 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, - 0x0, - - /* U+F244 "" */ - 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, - 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, - 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xcc, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x57, 0x7a, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xef, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x2f, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfa, 0x0, 0x0, 0x4e, 0xff, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x10, - 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x86, 0x20, - 0x0, 0x0, 0x0, 0xef, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6c, 0x30, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0x90, 0x0, 0xe, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x91, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x1b, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xe6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xcf, 0xff, 0xff, - 0xff, 0xf7, 0x55, 0x55, 0x55, 0x8f, 0xfe, 0x55, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5b, 0xff, - 0xff, 0xc3, 0x5, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x50, 0x0, - 0x9, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xbd, - 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xf2, 0x0, 0xd, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc9, - 0x9f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xac, 0xcf, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x0, 0x26, 0xab, 0xcd, 0xcb, - 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0x12, 0xef, 0xff, 0xff, 0xff, 0xe1, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x2e, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x80, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xff, - 0xec, 0xff, 0xff, 0x10, 0x39, 0x0, 0x5f, 0xff, - 0xff, 0xf1, 0x4f, 0xff, 0xfe, 0x20, 0xbf, 0xff, - 0x10, 0x3f, 0xa0, 0x5, 0xff, 0xff, 0xf4, 0x7f, - 0xff, 0xfb, 0x0, 0xb, 0xff, 0x10, 0x3f, 0xf6, - 0x0, 0xaf, 0xff, 0xf7, 0x9f, 0xff, 0xff, 0xa0, - 0x0, 0xbf, 0x10, 0x3f, 0xa0, 0x5, 0xff, 0xff, - 0xf9, 0xbf, 0xff, 0xff, 0xfa, 0x0, 0xb, 0x10, - 0x2a, 0x0, 0x3f, 0xff, 0xff, 0xfa, 0xcf, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xfc, 0xdf, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xfc, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0xdf, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, - 0x60, 0x1, 0x0, 0x11, 0x0, 0xbf, 0xff, 0xff, - 0xfb, 0xaf, 0xff, 0xff, 0xf6, 0x0, 0x1d, 0x10, - 0x3d, 0x10, 0xb, 0xff, 0xff, 0xfa, 0x8f, 0xff, - 0xff, 0x60, 0x1, 0xdf, 0x10, 0x3f, 0xc1, 0x0, - 0xcf, 0xff, 0xf8, 0x6f, 0xff, 0xfa, 0x0, 0x2d, - 0xff, 0x10, 0x3f, 0xf4, 0x0, 0x7f, 0xff, 0xf6, - 0x3f, 0xff, 0xff, 0x52, 0xef, 0xff, 0x20, 0x3f, - 0x50, 0x6, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0x20, 0x35, 0x0, 0x6f, 0xff, - 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x7, 0xff, 0xff, 0xff, 0xb0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0x60, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x7, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x7f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x8b, 0xef, 0xff, 0xff, 0xeb, 0x71, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x88, 0x88, - 0x88, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x36, 0x66, - 0x66, 0x66, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb6, 0x66, 0x66, 0x66, 0x61, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x9d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xfa, 0xa, - 0xff, 0xfe, 0x14, 0xff, 0xff, 0x61, 0xdf, 0xff, - 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, - 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, - 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, - 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, - 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, - 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, - 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, - 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, - 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, - 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, - 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, - 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, - 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, - 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, - 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, - 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, - 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, - 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, - 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, - 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, - 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, - 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, - 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, - 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, - 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, - 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, - 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, - 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, - 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xfa, 0xa, - 0xff, 0xfe, 0x14, 0xff, 0xff, 0x61, 0xdf, 0xff, - 0xfa, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x13, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x30, 0x0, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x93, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x40, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0x60, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0x60, 0xa, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0xa, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xfd, 0xb9, 0x73, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x74, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x4, 0xff, 0xff, 0xff, 0xf4, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x4, - 0xff, 0xf4, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x4, 0xf4, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x1, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x8, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xb, 0xfb, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xb, 0xff, - 0xfb, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0xb, 0xff, 0xff, 0xfb, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x5b, 0xff, 0xff, 0xff, 0xfb, 0x5e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xf9, - 0x44, 0x7f, 0xf4, 0x45, 0xff, 0x54, 0x4f, 0xff, - 0xf5, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x3f, 0xe0, - 0x1, 0xff, 0x10, 0xe, 0xff, 0xf5, 0x0, 0xcf, - 0xff, 0xf7, 0x0, 0x3f, 0xe0, 0x1, 0xff, 0x10, - 0xe, 0xff, 0xf5, 0xc, 0xff, 0xff, 0xf7, 0x0, - 0x3f, 0xe0, 0x1, 0xff, 0x10, 0xe, 0xff, 0xf5, - 0xcf, 0xff, 0xff, 0xf7, 0x0, 0x3f, 0xe0, 0x1, - 0xff, 0x10, 0xe, 0xff, 0xf5, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x3f, 0xe0, 0x1, 0xff, 0x10, 0xe, - 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf8, 0x22, 0x4f, - 0xe2, 0x22, 0xff, 0x22, 0x2e, 0xff, 0xf5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x3, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x2, 0x34, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x3e, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0x20, 0x0, 0x7f, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xd4, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x6f, 0xff, 0xff, - 0x20, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x2c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1a, 0xc3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 146, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 146, .box_w = 5, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 60, .adv_w = 213, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 14}, - {.bitmap_index = 110, .adv_w = 382, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 386, .adv_w = 338, .box_w = 19, .box_h = 32, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 690, .adv_w = 459, .box_w = 27, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1014, .adv_w = 373, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1289, .adv_w = 114, .box_w = 3, .box_h = 10, .ofs_x = 2, .ofs_y = 14}, - {.bitmap_index = 1304, .adv_w = 183, .box_w = 8, .box_h = 32, .ofs_x = 3, .ofs_y = -7}, - {.bitmap_index = 1432, .adv_w = 184, .box_w = 8, .box_h = 32, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 1560, .adv_w = 218, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 12}, - {.bitmap_index = 1645, .adv_w = 317, .box_w = 16, .box_h = 15, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 1765, .adv_w = 123, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 1795, .adv_w = 208, .box_w = 11, .box_h = 3, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 1812, .adv_w = 123, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1827, .adv_w = 191, .box_w = 15, .box_h = 32, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 2067, .adv_w = 363, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2319, .adv_w = 201, .box_w = 10, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2439, .adv_w = 312, .box_w = 19, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2667, .adv_w = 311, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2883, .adv_w = 364, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3147, .adv_w = 312, .box_w = 19, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3375, .adv_w = 336, .box_w = 20, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3615, .adv_w = 325, .box_w = 18, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3831, .adv_w = 350, .box_w = 20, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4071, .adv_w = 336, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4311, .adv_w = 123, .box_w = 6, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4365, .adv_w = 123, .box_w = 6, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 4434, .adv_w = 317, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 4562, .adv_w = 317, .box_w = 16, .box_h = 11, .ofs_x = 2, .ofs_y = 6}, - {.bitmap_index = 4650, .adv_w = 317, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 4778, .adv_w = 312, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4994, .adv_w = 562, .box_w = 33, .box_h = 31, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 5506, .adv_w = 398, .box_w = 26, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 5818, .adv_w = 412, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6082, .adv_w = 393, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6358, .adv_w = 449, .box_w = 24, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6646, .adv_w = 364, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6862, .adv_w = 345, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7078, .adv_w = 420, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7354, .adv_w = 442, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7618, .adv_w = 169, .box_w = 4, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7666, .adv_w = 279, .box_w = 16, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 7858, .adv_w = 391, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8122, .adv_w = 323, .box_w = 17, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8326, .adv_w = 520, .box_w = 26, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8638, .adv_w = 442, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8902, .adv_w = 457, .box_w = 26, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9214, .adv_w = 393, .box_w = 20, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9454, .adv_w = 457, .box_w = 28, .box_h = 29, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 9860, .adv_w = 395, .box_w = 21, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10112, .adv_w = 338, .box_w = 19, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10340, .adv_w = 319, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10580, .adv_w = 430, .box_w = 21, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10832, .adv_w = 387, .box_w = 26, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 11144, .adv_w = 613, .box_w = 37, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11588, .adv_w = 366, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11864, .adv_w = 352, .box_w = 24, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 12152, .adv_w = 357, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 12404, .adv_w = 181, .box_w = 8, .box_h = 32, .ofs_x = 3, .ofs_y = -7}, - {.bitmap_index = 12532, .adv_w = 191, .box_w = 15, .box_h = 32, .ofs_x = -2, .ofs_y = -3}, - {.bitmap_index = 12772, .adv_w = 181, .box_w = 8, .box_h = 32, .ofs_x = 0, .ofs_y = -7}, - {.bitmap_index = 12900, .adv_w = 317, .box_w = 16, .box_h = 14, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 13012, .adv_w = 272, .box_w = 17, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13038, .adv_w = 326, .box_w = 10, .box_h = 5, .ofs_x = 3, .ofs_y = 20}, - {.bitmap_index = 13063, .adv_w = 325, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 13216, .adv_w = 371, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 13454, .adv_w = 311, .box_w = 18, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 13616, .adv_w = 371, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 13866, .adv_w = 333, .box_w = 19, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 14037, .adv_w = 192, .box_w = 14, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14212, .adv_w = 375, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 14462, .adv_w = 370, .box_w = 18, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 14687, .adv_w = 152, .box_w = 5, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14752, .adv_w = 154, .box_w = 12, .box_h = 33, .ofs_x = -4, .ofs_y = -7}, - {.bitmap_index = 14950, .adv_w = 335, .box_w = 18, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 15175, .adv_w = 152, .box_w = 4, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 15225, .adv_w = 575, .box_w = 31, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 15504, .adv_w = 370, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 15666, .adv_w = 345, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 15846, .adv_w = 371, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = -7}, - {.bitmap_index = 16084, .adv_w = 371, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 16334, .adv_w = 223, .box_w = 10, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 16424, .adv_w = 273, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16577, .adv_w = 225, .box_w = 14, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16731, .adv_w = 368, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 16893, .adv_w = 304, .box_w = 21, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 17082, .adv_w = 489, .box_w = 31, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17361, .adv_w = 300, .box_w = 19, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17532, .adv_w = 304, .box_w = 21, .box_h = 25, .ofs_x = -1, .ofs_y = -7}, - {.bitmap_index = 17795, .adv_w = 283, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 17939, .adv_w = 191, .box_w = 11, .box_h = 32, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 18115, .adv_w = 163, .box_w = 4, .box_h = 32, .ofs_x = 3, .ofs_y = -7}, - {.bitmap_index = 18179, .adv_w = 191, .box_w = 10, .box_h = 32, .ofs_x = 0, .ofs_y = -7}, - {.bitmap_index = 18339, .adv_w = 317, .box_w = 17, .box_h = 6, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 18390, .adv_w = 228, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 13}, - {.bitmap_index = 18456, .adv_w = 171, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 6}, - {.bitmap_index = 18481, .adv_w = 544, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 19111, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 19553, .adv_w = 544, .box_w = 34, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 20080, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 20522, .adv_w = 374, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 20810, .adv_w = 544, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 21388, .adv_w = 544, .box_w = 32, .box_h = 35, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 21948, .adv_w = 612, .box_w = 39, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 22553, .adv_w = 544, .box_w = 34, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 23148, .adv_w = 612, .box_w = 39, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23655, .adv_w = 544, .box_w = 34, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 24250, .adv_w = 272, .box_w = 17, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 24480, .adv_w = 408, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 24831, .adv_w = 612, .box_w = 39, .box_h = 33, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 25475, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 25917, .adv_w = 374, .box_w = 24, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 26337, .adv_w = 476, .box_w = 22, .box_h = 32, .ofs_x = 4, .ofs_y = -3}, - {.bitmap_index = 26689, .adv_w = 476, .box_w = 30, .box_h = 36, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 27229, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 27694, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 28159, .adv_w = 476, .box_w = 22, .box_h = 32, .ofs_x = 4, .ofs_y = -3}, - {.bitmap_index = 28511, .adv_w = 476, .box_w = 32, .box_h = 31, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 29007, .adv_w = 340, .box_w = 19, .box_h = 30, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29292, .adv_w = 340, .box_w = 19, .box_h = 30, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29577, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 30042, .adv_w = 476, .box_w = 30, .box_h = 7, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 30147, .adv_w = 612, .box_w = 39, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 30654, .adv_w = 680, .box_w = 43, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 31407, .adv_w = 612, .box_w = 40, .box_h = 35, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 32107, .adv_w = 544, .box_w = 34, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 32634, .adv_w = 476, .box_w = 30, .box_h = 19, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 32919, .adv_w = 476, .box_w = 30, .box_h = 19, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 33204, .adv_w = 680, .box_w = 44, .box_h = 27, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 33798, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 34240, .adv_w = 544, .box_w = 34, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 34835, .adv_w = 544, .box_w = 35, .box_h = 36, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 35465, .adv_w = 476, .box_w = 31, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 35946, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 36471, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 36936, .adv_w = 476, .box_w = 30, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 37341, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 37783, .adv_w = 340, .box_w = 23, .box_h = 35, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 38186, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 38711, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 39236, .adv_w = 612, .box_w = 39, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 39743, .adv_w = 544, .box_w = 36, .box_h = 36, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 40391, .adv_w = 408, .box_w = 26, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 40846, .adv_w = 680, .box_w = 43, .box_h = 32, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 41534, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 42007, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 42480, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 42953, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 43426, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 43899, .adv_w = 680, .box_w = 43, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 44480, .adv_w = 476, .box_w = 26, .box_h = 35, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 44935, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 45460, .adv_w = 544, .box_w = 35, .box_h = 35, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 46073, .adv_w = 680, .box_w = 43, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 46632, .adv_w = 408, .box_w = 26, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 47087, .adv_w = 547, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 2} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 5, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 24, 0, 15, -12, 0, 0, - 0, 0, -30, -33, 4, 26, 12, 9, - -22, 4, 27, 2, 23, 5, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 33, 4, -4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11, 0, -16, 0, 0, 0, 0, - 0, -11, 9, 11, 0, 0, -5, 0, - -4, 5, 0, -5, 0, -5, -3, -11, - 0, 0, 0, 0, -5, 0, 0, -7, - -8, 0, 0, -5, 0, -11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -5, - -5, 0, -8, 0, -15, 0, -66, 0, - 0, -11, 0, 11, 16, 1, 0, -11, - 5, 5, 18, 11, -9, 11, 0, 0, - -31, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -20, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -15, -7, -27, 0, -22, - -4, 0, 0, 0, 0, 1, 21, 0, - -16, -4, -2, 2, 0, -9, 0, 0, - -4, -40, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -44, -4, 21, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -22, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 18, - 0, 5, 0, 0, -11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 21, 4, - 2, 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, - -20, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, - 11, 5, 16, -5, 0, 0, 11, -5, - -18, -75, 4, 15, 11, 1, -7, 0, - 20, 0, 17, 0, 17, 0, -51, 0, - -7, 16, 0, 18, -5, 11, 5, 0, - 0, 2, -5, 0, 0, -9, 44, 0, - 44, 0, 16, 0, 23, 7, 9, 16, - 0, 0, 0, -20, 0, 0, 0, 0, - 2, -4, 0, 4, -10, -7, -11, 4, - 0, -5, 0, 0, 0, -22, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -35, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, -30, 0, -34, 0, 0, 0, - 0, -4, 0, 54, -7, -7, 5, 5, - -5, 0, -7, 5, 0, 0, -29, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -53, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -34, 0, 33, 0, 0, -20, 0, - 18, 0, -37, -53, -37, -11, 16, 0, - 0, -36, 0, 7, -13, 0, -8, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 14, 16, -66, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 0, 4, 0, 0, 0, - 0, 0, 4, 4, -7, -11, 0, -2, - -2, -5, 0, 0, -4, 0, 0, 0, - -11, 0, -4, 0, -13, -11, 0, -14, - -18, -18, -10, 0, -11, 0, -11, 0, - 0, 0, 0, -4, 0, 0, 5, 0, - 4, -5, 0, 2, 0, 0, 0, 5, - -4, 0, 0, 0, -4, 5, 5, -2, - 0, 0, 0, -10, 0, -2, 0, 0, - 0, 0, 0, 2, 0, 7, -4, 0, - -7, 0, -9, 0, 0, -4, 0, 16, - 0, 0, -5, 0, 0, 0, 0, 0, - -2, 2, -4, -4, 0, 0, -5, 0, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -3, -3, 0, -5, -7, 0, - 0, 0, 0, 0, 2, 0, 0, -4, - 0, -5, -5, -5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -3, 0, 0, - 0, 0, -4, -7, 0, -8, 0, -16, - -4, -16, 11, 0, 0, -11, 5, 11, - 15, 0, -14, -2, -7, 0, -2, -26, - 5, -4, 4, -29, 5, 0, 0, 2, - -28, 0, -29, -4, -47, -4, 0, -27, - 0, 11, 15, 0, 7, 0, 0, 0, - 0, 1, 0, -10, -7, 0, -16, 0, - 0, 0, -5, 0, 0, 0, -5, 0, - 0, 0, 0, 0, -3, -3, 0, -3, - -7, 0, 0, 0, 0, 0, 0, 0, - -5, -5, 0, -4, -7, -4, 0, 0, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, -4, 0, -7, - 0, -4, 0, -11, 5, 0, 0, -7, - 3, 5, 5, 0, 0, 0, 0, 0, - 0, -4, 0, 0, 0, 0, 0, 4, - 0, 0, -5, 0, -5, -4, -7, 0, - 0, 0, 0, 0, 0, 0, 4, 0, - -4, 0, 0, 0, 0, -6, -8, 0, - -10, 0, 16, -4, 2, -17, 0, 0, - 15, -27, -28, -23, -11, 5, 0, -4, - -35, -10, 0, -10, 0, -11, 8, -10, - -35, 0, -15, 0, 0, 3, -2, 4, - -4, 0, 5, 1, -16, -21, 0, -27, - -13, -11, -13, -16, -7, -15, -1, -10, - -15, 3, 0, 2, 0, -5, 0, 0, - 0, 4, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -5, - 0, -3, 0, -2, -5, 0, -9, -12, - -12, -2, 0, -16, 0, 0, 0, 0, - 0, 0, -4, 0, 0, 0, 0, 2, - -3, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -10, 0, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, 0, 0, - -10, 0, 0, 0, 0, -27, -16, 0, - 0, 0, -8, -27, 0, 0, -5, 5, - 0, -15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -9, 0, 0, -10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, -10, 0, - 0, 0, 0, 7, 0, 4, -11, -11, - 0, -5, -5, -7, 0, 0, 0, 0, - 0, 0, -16, 0, -5, 0, -8, -5, - 0, -12, -14, -16, -4, 0, -11, 0, - -16, 0, 0, 0, 0, 44, 0, 0, - 3, 0, 0, -7, 0, 5, 0, -23, - 0, 0, 0, 0, 0, -51, -10, 18, - 16, -4, -23, 0, 5, -8, 0, -27, - -3, -7, 5, -38, -5, 7, 0, 8, - -19, -8, -20, -18, -23, 0, 0, -33, - 0, 31, 0, 0, -3, 0, 0, 0, - -3, -3, -5, -15, -18, -1, -51, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -5, 0, -3, -5, -8, 0, 0, - -11, 0, -5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, 0, -11, 0, 0, 11, - -2, 7, 0, -12, 5, -4, -2, -14, - -5, 0, -7, -5, -4, 0, -8, -9, - 0, 0, -4, -2, -4, -9, -7, 0, - 0, -5, 0, 5, -4, 0, -12, 0, - 0, 0, -11, 0, -9, 0, -9, -9, - 5, 0, 0, 0, 0, 0, 0, 0, - 0, -11, 5, 0, -8, 0, -4, -7, - -17, -4, -4, -4, -2, -4, -7, -2, - 0, 0, 0, 0, 0, -5, -4, -4, - 0, 0, 0, 0, 7, -4, 0, -4, - 0, 0, 0, -4, -7, -4, -5, -7, - -5, 0, 4, 22, -2, 0, -15, 0, - -4, 11, 0, -5, -23, -7, 8, 1, - 0, -26, -9, 5, -9, 4, 0, -4, - -4, -17, 0, -8, 3, 0, 0, -9, - 0, 0, 0, 5, 5, -11, -10, 0, - -9, -5, -8, -5, -5, 0, -9, 3, - -10, -9, 16, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -9, 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, - -4, 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, -4, -5, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, 0, 0, -7, - 0, 0, -5, -5, 0, 0, 0, 0, - -5, 0, 0, 0, 0, -3, 0, 0, - 0, 0, 0, -4, 0, 0, 0, 0, - -8, 0, -11, 0, 0, 0, -18, 0, - 4, -12, 11, 1, -4, -26, 0, 0, - -12, -5, 0, -22, -14, -15, 0, 0, - -23, -5, -22, -21, -26, 0, -14, 0, - 4, 36, -7, 0, -13, -5, -2, -5, - -9, -15, -10, -20, -22, -13, -5, 0, - 0, -4, 0, 2, 0, 0, -38, -5, - 16, 12, -12, -20, 0, 2, -17, 0, - -27, -4, -5, 11, -50, -7, 2, 0, - 0, -35, -7, -28, -5, -40, 0, 0, - -38, 0, 32, 2, 0, -4, 0, 0, - 0, 0, -3, -4, -21, -4, 0, -35, - 0, 0, 0, 0, -17, 0, -5, 0, - -2, -15, -26, 0, 0, -3, -8, -16, - -5, 0, -4, 0, 0, 0, 0, -24, - -5, -18, -17, -4, -9, -14, -5, -9, - 0, -11, -5, -18, -8, 0, -7, -10, - -5, -10, 0, 3, 0, -4, -18, 0, - 11, 0, -10, 0, 0, 0, 0, 7, - 0, 4, -11, 22, 0, -5, -5, -7, - 0, 0, 0, 0, 0, 0, -16, 0, - -5, 0, -8, -5, 0, -12, -14, -16, - -4, 0, -11, 4, 22, 0, 0, 0, - 0, 44, 0, 0, 3, 0, 0, -7, - 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -4, -11, 0, 0, 0, 0, 0, -3, - 0, 0, 0, -5, -5, 0, 0, -11, - -5, 0, 0, -11, 0, 9, -3, 0, - 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 8, 11, 4, -5, 0, -17, - -9, 0, 16, -18, -17, -11, -11, 22, - 10, 5, -47, -4, 11, -5, 0, -5, - 6, -5, -19, 0, -5, 5, -7, -4, - -16, -4, 0, 0, 16, 11, 0, -15, - 0, -30, -7, 16, -7, -21, 2, -7, - -18, -18, -5, 22, 5, 0, -8, 0, - -15, 0, 4, 18, -13, -20, -22, -14, - 16, 0, 2, -40, -4, 5, -9, -4, - -13, 0, -12, -20, -8, -8, -4, 0, - 0, -13, -11, -5, 0, 16, 13, -5, - -30, 0, -30, -8, 0, -19, -32, -2, - -17, -9, -18, -15, 15, 0, 0, -7, - 0, -11, -5, 0, -5, -10, 0, 9, - -18, 5, 0, 0, -29, 0, -5, -12, - -9, -4, -16, -14, -18, -13, 0, -16, - -5, -13, -10, -16, -5, 0, 0, 2, - 26, -9, 0, -16, -5, 0, -5, -11, - -13, -15, -15, -21, -7, -11, 11, 0, - -8, 0, -27, -7, 3, 11, -17, -20, - -11, -18, 18, -5, 3, -51, -10, 11, - -12, -9, -20, 0, -16, -23, -7, -5, - -4, -5, -11, -16, -2, 0, 0, 16, - 15, -4, -35, 0, -33, -13, 13, -21, - -37, -11, -19, -23, -27, -18, 11, 0, - 0, 0, 0, -7, 0, 0, 5, -7, - 11, 4, -10, 11, 0, 0, -17, -2, - 0, -2, 0, 2, 2, -4, 0, 0, - 0, 0, 0, 0, -5, 0, 0, 0, - 0, 4, 16, 1, 0, -7, 0, 0, - 0, 0, -4, -4, -7, 0, 0, 0, - 2, 4, 0, 0, 0, 0, 4, 0, - -4, 0, 21, 0, 10, 2, 2, -7, - 0, 11, 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 16, 0, 15, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -33, 0, -5, 9, 0, 16, - 0, 0, 54, 7, -11, -11, 5, 5, - -4, 2, -27, 0, 0, 26, -33, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -37, 21, 76, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -33, 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, -9, 0, 0, -10, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, -15, 0, - 0, 2, 0, 0, 5, 70, -11, -4, - 17, 15, -15, 5, 0, 0, 5, 5, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -71, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -15, - 0, 0, 0, -15, 0, 0, 0, 0, - -12, -3, 0, 0, 0, -12, 0, -7, - 0, -26, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -36, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, -5, 0, 0, -10, 0, -8, 0, - -15, 0, 0, 0, -9, 5, -7, 0, - 0, -15, -5, -13, 0, 0, -15, 0, - -5, 0, -26, 0, -6, 0, 0, -44, - -10, -22, -6, -20, 0, 0, -36, 0, - -15, -3, 0, 0, 0, 0, 0, 0, - 0, 0, -8, -10, -4, -9, 0, 0, - 0, 0, -12, 0, -12, 7, -6, 11, - 0, -4, -13, -4, -9, -10, 0, -7, - -3, -4, 4, -15, -2, 0, 0, 0, - -48, -4, -8, 0, -12, 0, -4, -26, - -5, 0, 0, -4, -4, 0, 0, 0, - 0, 4, 0, -4, -9, -4, 9, 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, 7, 0, 0, 0, 0, 0, - 0, -12, 0, -4, 0, 0, 0, -11, - 5, 0, 0, 0, -15, -5, -11, 0, - 0, -15, 0, -5, 0, -26, 0, 0, - 0, 0, -53, 0, -11, -20, -27, 0, - 0, -36, 0, -4, -8, 0, 0, 0, - 0, 0, 0, 0, 0, -5, -8, -3, - -8, 2, 0, 0, 9, -7, 0, 17, - 27, -5, -5, -16, 7, 27, 9, 12, - -15, 7, 23, 7, 16, 12, 15, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 34, 26, -10, -5, 0, -4, - 44, 23, 44, 0, 0, 0, 5, 0, - 0, 20, 0, 0, -9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -4, 0, - 0, 0, 0, 0, 0, 0, 0, 8, - 0, 0, 0, 0, -46, -7, -4, -22, - -27, 0, 0, -36, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, -46, -7, -4, - -22, -27, 0, 0, -22, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -4, 0, 0, 0, -13, 5, 0, -5, - 4, 10, 5, -16, 0, -1, -4, 5, - 0, 4, 0, 0, 0, 0, -14, 0, - -5, -4, -11, 0, -5, -22, 0, 34, - -5, 0, -12, -4, 0, -4, -9, 0, - -5, -15, -11, -7, 0, 0, 0, -9, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -4, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, -46, - -7, -4, -22, -27, 0, 0, -36, 0, - 0, 0, 0, 0, 0, 27, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -9, 0, -17, -7, -5, 16, -5, -5, - -22, 2, -3, 2, -4, -15, 1, 12, - 1, 4, 2, 4, -13, -22, -7, 0, - -21, -10, -15, -23, -21, 0, -9, -11, - -7, -7, -4, -4, -7, -4, 0, -4, - -2, 8, 0, 8, -4, 0, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -4, -5, -5, 0, 0, - -15, 0, -3, 0, -9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -33, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, -5, 0, -7, - 0, 0, 0, 0, -4, 0, 0, -9, - -5, 5, 0, -9, -10, -4, 0, -16, - -4, -12, -4, -7, 0, -9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -36, 0, 17, 0, 0, -10, 0, - 0, 0, 0, -7, 0, -5, 0, 0, - -3, 0, 0, -4, 0, -13, 0, 0, - 23, -7, -18, -17, 4, 6, 6, -1, - -15, 4, 8, 4, 16, 4, 18, -4, - -15, 0, 0, -22, 0, 0, -16, -15, - 0, 0, -11, 0, -7, -9, 0, -8, - 0, -8, 0, -4, 8, 0, -4, -16, - -5, 20, 0, 0, -5, 0, -11, 0, - 0, 7, -13, 0, 5, -5, 4, 1, - 0, -18, 0, -4, -2, 0, -5, 6, - -4, 0, 0, 0, -22, -7, -12, 0, - -16, 0, 0, -26, 0, 20, -5, 0, - -10, 0, 3, 0, -5, 0, -5, -16, - 0, -5, 5, 0, 0, 0, 0, -4, - 0, 0, 5, -7, 2, 0, 0, -7, - -4, 0, -7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -34, 0, 12, 0, - 0, -4, 0, 0, 0, 0, 1, 0, - -5, -5, 0, 0, 0, 11, 0, 13, - 0, 0, 0, 0, 0, -34, -31, 2, - 23, 16, 9, -22, 4, 23, 0, 20, - 0, 11, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 29, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_34 = { -#else -lv_font_t lv_font_montserrat_34 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 38, /*The maximum line height required by the font*/ - .base_line = 7, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -3, - .underline_thickness = 2, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_34*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_36.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_36.c deleted file mode 100644 index f5ef2ec..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_36.c +++ /dev/null @@ -1,7655 +0,0 @@ -/******************************************************************************* - * Size: 36 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 36 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_36.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_36 - #define LV_FONT_MONTSERRAT_36 1 -#endif - -#if LV_FONT_MONTSERRAT_36 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x1f, 0xff, - 0xc0, 0xf, 0xff, 0xb0, 0xf, 0xff, 0xb0, 0xf, - 0xff, 0xa0, 0xf, 0xff, 0x90, 0xe, 0xff, 0x90, - 0xd, 0xff, 0x80, 0xd, 0xff, 0x70, 0xc, 0xff, - 0x70, 0xc, 0xff, 0x60, 0xb, 0xff, 0x50, 0xa, - 0xff, 0x50, 0xa, 0xff, 0x40, 0x9, 0xff, 0x30, - 0x9, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x76, 0x0, 0x2f, - 0xff, 0xc0, 0x7f, 0xff, 0xf1, 0x5f, 0xff, 0xf0, - 0x8, 0xed, 0x40, - - /* U+0022 "\"" */ - 0xbf, 0xf4, 0x0, 0x3f, 0xfc, 0xbf, 0xf4, 0x0, - 0x3f, 0xfc, 0xaf, 0xf3, 0x0, 0x2f, 0xfb, 0xaf, - 0xf3, 0x0, 0x2f, 0xfb, 0xaf, 0xf2, 0x0, 0x1f, - 0xfb, 0x9f, 0xf2, 0x0, 0x1f, 0xfa, 0x9f, 0xf2, - 0x0, 0x1f, 0xfa, 0x9f, 0xf1, 0x0, 0xf, 0xf9, - 0x8f, 0xf1, 0x0, 0xf, 0xf9, 0x49, 0x90, 0x0, - 0x9, 0x95, - - /* U+0023 "#" */ - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, - 0x7, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xfa, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, - 0x0, 0xb, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xf6, 0x0, 0x0, 0x0, 0xdf, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x30, - 0x0, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x1, 0xff, - 0x70, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x89, 0x99, 0x9f, - 0xfe, 0x99, 0x99, 0x99, 0xdf, 0xf9, 0x99, 0x99, - 0x30, 0x0, 0x0, 0x0, 0xff, 0x90, 0x0, 0x0, - 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, - 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, - 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x3, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, - 0x0, 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x9, 0x99, 0x9a, 0xff, 0xc9, 0x99, 0x99, - 0x9e, 0xfe, 0x99, 0x99, 0x91, 0x0, 0x0, 0x0, - 0x2f, 0xf6, 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, - 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xf2, 0x0, 0x0, 0x0, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, - 0x0, 0x0, 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x4, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, - 0x0, 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x0, 0x0, - 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0x0, 0x6, 0x84, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x8c, 0xef, 0xff, - 0xed, 0xa6, 0x10, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0xdf, 0xff, 0xc6, 0x2c, 0xf9, 0x24, 0x8d, - 0xff, 0x40, 0x6, 0xff, 0xf9, 0x0, 0xc, 0xf8, - 0x0, 0x0, 0x4a, 0x0, 0xb, 0xff, 0xe0, 0x0, - 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xa0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xb0, 0x0, 0xc, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0xc, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x60, - 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xfe, 0xae, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x95, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x27, - 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xfc, 0xcf, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x2, 0x9f, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, - 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xf8, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0xaf, 0xfd, - 0x4, 0x30, 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, - 0xef, 0xfb, 0xc, 0xf9, 0x10, 0x0, 0xc, 0xf8, - 0x0, 0x9, 0xff, 0xf6, 0x4f, 0xff, 0xfa, 0x62, - 0x1c, 0xf8, 0x15, 0xcf, 0xff, 0xd0, 0x1b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa1, 0x0, 0x0, 0x0, 0x37, 0xbd, 0xff, 0xff, - 0xec, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, - 0x0, 0x0, 0x0, 0x0, - - /* U+0025 "%" */ - 0x0, 0x5, 0xbe, 0xfd, 0x81, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xfc, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0x20, 0x0, 0x0, 0x8, 0xff, 0x71, - 0x4, 0xdf, 0xd0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0x60, 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, 0x1, - 0xff, 0x70, 0x0, 0x0, 0x1, 0xef, 0xb0, 0x0, - 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x9, 0xfc, - 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, - 0x9, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, - 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xb0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, 0x2f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, - 0x0, 0x0, 0x6f, 0xf0, 0x0, 0xc, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, - 0x9, 0xfc, 0x0, 0x7, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, 0x1, 0xff, - 0x70, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0x71, 0x4, 0xdf, 0xe0, 0x0, - 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x8f, 0xf4, - 0x0, 0x5c, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x6, - 0xcf, 0xfe, 0x91, 0x0, 0x3f, 0xf8, 0x0, 0xaf, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xfd, 0x0, 0x7f, 0xf8, 0x11, - 0x5e, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0x30, 0xf, 0xf7, 0x0, 0x0, 0x4f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x70, 0x5, 0xff, 0x0, 0x0, 0x0, 0xcf, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xc0, 0x0, - 0x9f, 0xc0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xf2, 0x0, 0xa, 0xfa, - 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xf6, 0x0, 0x0, 0xaf, 0xa0, 0x0, - 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xfb, 0x0, 0x0, 0x9, 0xfb, 0x0, 0x0, 0x0, - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x10, - 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x0, 0xb, 0xfa, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, - 0x0, 0xff, 0x50, 0x0, 0x2, 0xff, 0x50, 0x0, - 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0x40, 0x2, 0xdf, 0xc0, 0x0, 0x0, 0x0, - 0xcf, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xed, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x7f, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xfd, - 0x70, 0x0, 0x0, - - /* U+0026 "&" */ - 0x0, 0x0, 0x0, 0x18, 0xce, 0xfe, 0xc7, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xea, 0x89, 0xef, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, - 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, 0x4, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, - 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x8, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, - 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x60, 0x9, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf8, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf9, - 0x2b, 0xff, 0xf7, 0x0, 0x0, 0xb, 0x83, 0x0, - 0x0, 0xcf, 0xfe, 0x40, 0x0, 0xbf, 0xff, 0x80, - 0x0, 0x2f, 0xfc, 0x0, 0x8, 0xff, 0xf2, 0x0, - 0x0, 0xb, 0xff, 0xf8, 0x0, 0x7f, 0xf8, 0x0, - 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0x90, 0xef, 0xf3, 0x0, 0x4f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xfc, 0xff, 0xc0, 0x0, - 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, - 0x1f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0xb0, 0x0, 0x8, 0xff, 0xfe, 0x61, - 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, - 0xd2, 0x7f, 0xff, 0xc0, 0x0, 0x7, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xe7, 0x0, 0x6, 0xff, 0x90, - 0x0, 0x0, 0x5, 0xad, 0xef, 0xed, 0xa5, 0x0, - 0x0, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0xbf, 0xf4, 0xbf, 0xf4, 0xaf, 0xf3, 0xaf, 0xf3, - 0xaf, 0xf2, 0x9f, 0xf2, 0x9f, 0xf2, 0x9f, 0xf1, - 0x8f, 0xf1, 0x49, 0x90, - - /* U+0028 "(" */ - 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x2, 0xff, 0xf2, - 0x0, 0xa, 0xff, 0xa0, 0x0, 0x2f, 0xff, 0x30, - 0x0, 0x8f, 0xfd, 0x0, 0x0, 0xef, 0xf7, 0x0, - 0x3, 0xff, 0xf2, 0x0, 0x7, 0xff, 0xe0, 0x0, - 0xb, 0xff, 0xa0, 0x0, 0xe, 0xff, 0x70, 0x0, - 0x1f, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x20, 0x0, - 0x5f, 0xff, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x8f, 0xfe, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, - 0x9f, 0xfc, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, - 0x8f, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0x5f, 0xff, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, - 0x1f, 0xff, 0x40, 0x0, 0xe, 0xff, 0x70, 0x0, - 0xb, 0xff, 0xa0, 0x0, 0x7, 0xff, 0xd0, 0x0, - 0x2, 0xff, 0xf2, 0x0, 0x0, 0xcf, 0xf7, 0x0, - 0x0, 0x7f, 0xfd, 0x0, 0x0, 0x1f, 0xff, 0x30, - 0x0, 0x9, 0xff, 0xa0, 0x0, 0x1, 0xff, 0xf2, - 0x0, 0x0, 0x8f, 0xfb, - - /* U+0029 ")" */ - 0x9f, 0xfb, 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, - 0x8, 0xff, 0xc0, 0x0, 0x1, 0xff, 0xf4, 0x0, - 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x5f, 0xff, 0x10, - 0x0, 0xf, 0xff, 0x50, 0x0, 0xc, 0xff, 0xa0, - 0x0, 0x8, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x1, 0xff, 0xf4, 0x0, 0x0, 0xff, 0xf6, - 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0xcf, 0xf9, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0xaf, 0xfb, - 0x0, 0x0, 0xaf, 0xfb, 0x0, 0x0, 0xaf, 0xfb, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0xcf, 0xf9, - 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0xff, 0xf6, - 0x0, 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xf1, - 0x0, 0x8, 0xff, 0xd0, 0x0, 0xb, 0xff, 0xa0, - 0x0, 0xf, 0xff, 0x40, 0x0, 0x5f, 0xfe, 0x0, - 0x0, 0xbf, 0xf9, 0x0, 0x1, 0xff, 0xf4, 0x0, - 0x8, 0xff, 0xc0, 0x0, 0x1f, 0xff, 0x30, 0x0, - 0x9f, 0xfb, 0x0, 0x0, - - /* U+002A "*" */ - 0x0, 0x0, 0x0, 0xdf, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0x40, 0x0, 0x0, 0x4, 0x40, - 0x0, 0xdf, 0x40, 0x1, 0x70, 0xd, 0xfb, 0x20, - 0xdf, 0x40, 0x8f, 0xf4, 0x1b, 0xff, 0xf9, 0xef, - 0x9e, 0xff, 0xe4, 0x0, 0x4c, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xc3, 0x0, - 0x7, 0xff, 0xfc, 0xef, 0xbf, 0xff, 0xb2, 0x1f, - 0xfe, 0x60, 0xdf, 0x42, 0xbf, 0xf6, 0x6, 0x80, - 0x0, 0xdf, 0x40, 0x4, 0xb0, 0x0, 0x0, 0x0, - 0xdf, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x10, - 0x0, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x8, 0x88, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x87, 0xdd, 0xdd, 0xdd, - 0xff, 0xfd, 0xdd, 0xdd, 0xd7, 0x0, 0x0, 0x0, - 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, - - /* U+002C "," */ - 0x4, 0xcd, 0x60, 0x1f, 0xff, 0xf3, 0x3f, 0xff, - 0xf7, 0x1f, 0xff, 0xf5, 0x3, 0xef, 0xf1, 0x0, - 0xff, 0xb0, 0x3, 0xff, 0x60, 0x7, 0xff, 0x0, - 0xb, 0xfb, 0x0, 0xf, 0xf5, 0x0, - - /* U+002D "-" */ - 0xef, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+002E "." */ - 0x3, 0xcc, 0x50, 0x1f, 0xff, 0xf3, 0x4f, 0xff, - 0xf7, 0x2f, 0xff, 0xf4, 0x5, 0xee, 0x70, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x87, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x0, 0x0, 0x6, 0xae, 0xff, 0xeb, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xb5, 0x33, 0x5a, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xfc, 0x0, 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x30, 0x9, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, - 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xd0, 0xf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x2f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf2, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf3, 0x4f, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf3, 0x2f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xf2, 0xf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, - 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xd0, 0x9, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x3, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x30, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfc, 0x0, 0x0, 0x3f, 0xff, 0xe4, - 0x0, 0x0, 0x0, 0x4e, 0xff, 0xf3, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xa5, 0x33, 0x5a, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xef, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xbe, 0xff, 0xeb, 0x60, - 0x0, 0x0, 0x0, - - /* U+0031 "1" */ - 0xbf, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xff, - 0xff, 0xf8, 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x11, - 0x11, 0x11, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0xff, 0xf8, - - /* U+0032 "2" */ - 0x0, 0x0, 0x5, 0xac, 0xef, 0xfe, 0xb7, 0x10, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x3f, 0xff, - 0xfe, 0x95, 0x32, 0x36, 0xbf, 0xff, 0xf6, 0x0, - 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xfe, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe3, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x10, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, - - /* U+0033 "3" */ - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x12, 0xdf, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xfc, 0x63, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xfe, - 0x60, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x22, - 0x33, 0x6a, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xe0, 0x45, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0xe, 0xfa, - 0x20, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x48, - 0xff, 0xff, 0xc8, 0x53, 0x23, 0x5a, 0xff, 0xff, - 0xb0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x48, 0xbd, - 0xef, 0xed, 0xa5, 0x10, 0x0, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xe1, - 0x0, 0x0, 0x48, 0x87, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf4, 0x0, 0x0, 0x8, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, - 0x0, 0x2, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, - - /* U+0035 "5" */ - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9, - 0xff, 0xc1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, - 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x31, 0x11, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xc9, 0x40, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, - 0x7d, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, - 0x8, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xb0, 0x2f, 0xff, 0xfe, 0xa6, 0x42, 0x34, - 0x8e, 0xff, 0xff, 0x30, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x3b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, - 0x0, 0x0, 0x16, 0xad, 0xef, 0xfd, 0xc8, 0x30, - 0x0, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xeb, - 0x82, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0x94, 0x21, 0x13, 0x6b, - 0xd0, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x70, 0x3, 0x8c, 0xef, 0xed, - 0x94, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x4f, 0xff, - 0x6d, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0x40, - 0x3, 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x4b, - 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfa, 0x1, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, - 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x20, 0xaf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf3, 0x5, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, - 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xe0, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, 0xbf, 0xff, - 0xc5, 0x0, 0x0, 0x3a, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xee, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x16, - 0xad, 0xef, 0xec, 0x82, 0x0, 0x0, 0x0, - - /* U+0037 "7" */ - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xef, 0xf9, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x3f, 0xff, 0x90, - 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x20, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfb, 0x0, 0xef, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x89, 0x94, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x0, 0x1, 0x6a, 0xde, 0xfe, 0xdb, 0x72, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xee, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0xb, 0xff, 0xfe, 0x61, 0x0, 0x1, 0x5d, 0xff, - 0xfd, 0x0, 0x2, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x7, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xfa, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0x80, 0x1, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x8, - 0xff, 0xfb, 0x20, 0x0, 0x0, 0x29, 0xff, 0xfb, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xeb, 0xbb, 0xdf, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, - 0x0, 0x1d, 0xff, 0xfd, 0x73, 0x0, 0x2, 0x6c, - 0xff, 0xfe, 0x20, 0xa, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xfc, 0x1, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, - 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x76, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf9, 0x5f, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x82, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xf5, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfe, 0x0, 0x3f, 0xff, 0xfb, - 0x51, 0x0, 0x0, 0x4a, 0xff, 0xff, 0x60, 0x0, - 0x5f, 0xff, 0xff, 0xfe, 0xee, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x2, 0x7b, - 0xde, 0xfe, 0xdb, 0x73, 0x0, 0x0, 0x0, - - /* U+0039 "9" */ - 0x0, 0x0, 0x16, 0xbd, 0xff, 0xdb, 0x72, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x91, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xee, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xa, 0xff, - 0xfc, 0x50, 0x0, 0x4, 0xaf, 0xff, 0xd0, 0x0, - 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf9, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x20, 0xef, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xe0, - 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf1, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf4, 0x6f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xf6, 0xd, 0xff, - 0xfd, 0x50, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xf7, - 0x2, 0xef, 0xff, 0xff, 0xee, 0xff, 0xff, 0xf5, - 0xff, 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x32, 0xff, 0xf6, 0x0, 0x0, 0x38, 0xce, - 0xfe, 0xd9, 0x40, 0x3, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf2, 0x0, 0x0, 0xbc, 0x73, 0x10, 0x13, 0x7d, - 0xff, 0xff, 0x50, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, - 0x0, 0x17, 0xbd, 0xff, 0xfd, 0xb7, 0x20, 0x0, - 0x0, 0x0, - - /* U+003A ":" */ - 0x5, 0xee, 0x70, 0x2f, 0xff, 0xf4, 0x4f, 0xff, - 0xf6, 0x1f, 0xff, 0xf3, 0x4, 0xcc, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xcc, 0x50, 0x1f, 0xff, 0xf3, - 0x4f, 0xff, 0xf7, 0x2f, 0xff, 0xf4, 0x5, 0xee, - 0x70, - - /* U+003B ";" */ - 0x5, 0xee, 0x70, 0x2f, 0xff, 0xf4, 0x4f, 0xff, - 0xf6, 0x1f, 0xff, 0xf3, 0x4, 0xcc, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xcd, 0x60, 0x1f, 0xff, 0xf3, - 0x3f, 0xff, 0xf7, 0x1f, 0xff, 0xf5, 0x3, 0xef, - 0xf1, 0x0, 0xff, 0xb0, 0x3, 0xff, 0x60, 0x7, - 0xff, 0x0, 0xb, 0xfb, 0x0, 0xf, 0xf5, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, - 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, - 0xfd, 0x71, 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, - 0xa3, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xc6, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe8, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xc6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, - 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, - 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x7d, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xe5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, - - /* U+003D "=" */ - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x7c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7d, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0x79, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - - /* U+003E ">" */ - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xc6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x8d, 0xff, 0xff, 0xfb, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, - 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, - 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x28, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xcf, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x3, 0xaf, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x1, - 0x7d, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x5b, - 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+003F "?" */ - 0x0, 0x0, 0x16, 0xad, 0xff, 0xfe, 0xb7, 0x10, - 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x4, 0xff, 0xff, 0xd7, - 0x31, 0x1, 0x4a, 0xff, 0xff, 0x80, 0x2c, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x0, - 0x7, 0x40, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x17, 0x71, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6e, 0xe6, 0x0, 0x0, 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xbe, - 0xef, 0xfe, 0xca, 0x72, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, - 0xff, 0xfd, 0xa7, 0x65, 0x56, 0x8b, 0xff, 0xff, - 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4b, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xcf, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x10, - 0x0, 0x0, 0x4, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xfb, 0x0, 0x0, 0x1, 0xef, 0xf2, 0x0, 0x0, - 0x0, 0x5a, 0xef, 0xfd, 0x94, 0x0, 0x7f, 0xfa, - 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x8f, 0xf6, 0x0, - 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x27, - 0xff, 0xa0, 0x0, 0xcf, 0xe0, 0x0, 0xf, 0xfd, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xfd, 0xcd, 0xff, - 0xfe, 0x9f, 0xfa, 0x0, 0x4, 0xff, 0x60, 0x5, - 0xff, 0x60, 0x0, 0x2, 0xff, 0xfe, 0x60, 0x0, - 0x1, 0x8f, 0xff, 0xff, 0xa0, 0x0, 0xd, 0xfb, - 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xdf, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, - 0x7f, 0xf0, 0xe, 0xfc, 0x0, 0x0, 0x4f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xa0, - 0x0, 0x4, 0xff, 0x31, 0xff, 0x90, 0x0, 0x9, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xfa, 0x0, 0x0, 0x1f, 0xf6, 0x2f, 0xf7, 0x0, - 0x0, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xa0, 0x0, 0x0, 0xff, 0x73, 0xff, - 0x60, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0xf, 0xf7, - 0x3f, 0xf6, 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, 0x0, - 0xff, 0x72, 0xff, 0x70, 0x0, 0xc, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x0, - 0x0, 0x1f, 0xf6, 0x1f, 0xf9, 0x0, 0x0, 0x9f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xa0, 0x0, 0x3, 0xff, 0x30, 0xef, 0xc0, 0x0, - 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xf0, 0xa, 0xff, - 0x10, 0x0, 0xc, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xb0, 0x0, 0xd, 0xfb, 0x0, - 0x5f, 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xe6, 0x0, - 0x0, 0x17, 0xff, 0xef, 0xff, 0x30, 0x8, 0xff, - 0x40, 0x0, 0xff, 0xd0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xcb, 0xdf, 0xff, 0xe1, 0xef, 0xff, 0xcd, - 0xff, 0xb0, 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x5, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x1e, 0xff, 0x20, - 0x0, 0x0, 0x5, 0xae, 0xff, 0xda, 0x40, 0x0, - 0x4, 0xbe, 0xfc, 0x70, 0x0, 0x0, 0x0, 0x4f, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe7, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x28, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xda, 0x76, 0x66, 0x8a, 0xdf, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, - 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf5, 0x1f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xe0, 0x9, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x70, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, - 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x4f, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, - 0x0, 0x0, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, 0xff, - 0x60, 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, - 0x0, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xf5, 0x0, 0x0, 0x6f, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xfc, 0x0, 0x0, 0xef, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x30, 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, - 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, - - /* U+0042 "B" */ - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xda, - 0x50, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x3f, - 0xff, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, - 0xf9, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xaf, 0xff, 0xf5, 0x0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xc0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, - 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x3, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xf6, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x2, 0x5c, 0xff, 0xfb, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x81, 0x0, 0x3, 0xff, 0xfe, - 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, 0xf4, - 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x8f, 0xff, 0xf4, 0x3, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x33, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0x13, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x27, 0xef, 0xff, 0x90, 0x3f, 0xff, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xc0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xed, 0xa6, 0x10, 0x0, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, - 0xc9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xc7, 0x43, 0x24, 0x6b, 0xff, 0xff, 0xf4, - 0x0, 0x5, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, - 0x0, 0x1a, 0xff, 0xd1, 0x0, 0x2f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x10, - 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0x10, - 0x0, 0x6, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0xff, 0xd2, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xc7, 0x43, 0x24, 0x6b, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x8, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, - 0xc9, 0x40, 0x0, 0x0, - - /* U+0044 "D" */ - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x3f, - 0xff, 0x61, 0x11, 0x11, 0x11, 0x24, 0x8d, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0x30, - 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xe1, 0x0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf8, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x60, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xa0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xd0, 0x3f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x60, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0x10, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, 0x0, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xe1, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0x30, - 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x11, 0x24, - 0x8d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, - 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+0045 "E" */ - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x3f, 0xff, - 0x61, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x10, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, - - /* U+0046 "F" */ - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x93, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x93, 0xff, 0xf6, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, - 0xca, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, - 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xc8, 0x53, 0x24, 0x5a, 0xef, 0xff, 0xf8, - 0x0, 0x5, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xef, 0xf3, 0x0, 0x2f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x30, - 0x0, 0xbf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7a, 0xa7, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, - 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xfb, 0xe, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, - 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xfb, 0x4, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, - 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x2f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, - 0x0, 0x5, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xef, 0xfb, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xc8, 0x43, 0x23, 0x59, 0xef, 0xff, 0xfa, - 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x7, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, - 0xda, 0x61, 0x0, 0x0, - - /* U+0048 "H" */ - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x73, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x61, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x3f, 0xff, 0x73, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x73, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, - - /* U+0049 "I" */ - 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, - 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, - 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, - 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, - 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, - 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, - 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, - 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x60, - - /* U+004A "J" */ - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, 0xbf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfc, - 0x0, 0x93, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, - 0x8, 0xfe, 0x30, 0x0, 0x0, 0xa, 0xff, 0xf5, - 0x1f, 0xff, 0xfa, 0x41, 0x14, 0xbf, 0xff, 0xe0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xb6, 0x0, 0x0, - - /* U+004B "K" */ - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xfa, 0x3, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xfb, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, - 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x5, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x3, 0xff, 0xf6, 0x0, 0x0, 0x4, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x4, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf6, 0x0, 0x4, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x4, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf6, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x63, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0x60, 0xa, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0x60, 0x0, 0xb, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, - 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, - 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, - 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xd1, 0x0, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, - 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, - - /* U+004C "L" */ - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf6, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x10, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - - /* U+004D "M" */ - 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x3f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf9, 0x3f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf9, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf9, - 0x3f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xf9, 0x3f, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xf9, 0x3f, 0xff, 0xaf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfa, 0xef, 0xf9, - 0x3f, 0xff, 0x3c, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf1, 0xef, 0xf9, 0x3f, 0xff, - 0x33, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0x70, 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x9f, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x0, - 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x1e, 0xff, 0x90, - 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, 0xef, 0xf9, - 0x3f, 0xff, 0x30, 0x6, 0xff, 0xf3, 0x0, 0x0, - 0xc, 0xff, 0xa0, 0x0, 0xef, 0xf9, 0x3f, 0xff, - 0x30, 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x5f, 0xff, - 0x10, 0x0, 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x0, - 0x2f, 0xff, 0x60, 0x0, 0xef, 0xf7, 0x0, 0x0, - 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x0, 0x9, 0xff, - 0xe1, 0x8, 0xff, 0xd0, 0x0, 0x0, 0xef, 0xf9, - 0x3f, 0xff, 0x30, 0x0, 0x0, 0xef, 0xf9, 0x2f, - 0xff, 0x40, 0x0, 0x0, 0xef, 0xf9, 0x3f, 0xff, - 0x30, 0x0, 0x0, 0x5f, 0xff, 0xcf, 0xfa, 0x0, - 0x0, 0x0, 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0xdf, 0xf9, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0xdf, 0xf9, - 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x3f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0xd, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf9, 0x3f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf9, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, - 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, - - /* U+004E "N" */ - 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x73, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x73, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x73, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0xdf, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0x73, 0xff, 0xf6, 0xbf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0xdf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x73, - 0xff, 0xf6, 0x2, 0xef, 0xff, 0x70, 0x0, 0x0, - 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x4, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0x73, 0xff, - 0xf6, 0x0, 0x7, 0xff, 0xfe, 0x20, 0x0, 0x2, - 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, 0xa, 0xff, - 0xfd, 0x0, 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, - 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x2, 0xff, - 0xf7, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x1e, 0xff, - 0xf7, 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x2, 0xff, 0xf7, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf2, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xd3, 0xff, 0xf7, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xdf, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xff, 0xf7, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xf7, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, - - /* U+004F "O" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, - 0xca, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xc7, - 0x43, 0x23, 0x6b, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, - 0x0, 0x1a, 0xff, 0xff, 0x90, 0x0, 0x0, 0x2f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xfe, 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, - 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0xe, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf2, 0x1f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf5, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, - 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf7, 0x1f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf5, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, - 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x3, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x70, 0x0, 0xbf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xfe, 0x10, 0x0, 0x2f, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, - 0x0, 0x19, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xc7, 0x43, 0x23, 0x6a, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, - 0xda, 0x61, 0x0, 0x0, 0x0, 0x0, - - /* U+0050 "P" */ - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x83, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x12, 0x47, - 0xdf, 0xff, 0xf7, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xe0, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf1, 0x3f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xe0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x30, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x25, 0xbf, 0xff, - 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, - 0xca, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xfc, 0x74, 0x32, 0x46, 0xbf, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x0, 0x0, - 0xbf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, 0x3f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xd0, 0x0, 0xef, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x20, 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x3, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x4f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf7, 0x3, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x70, 0x1f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xf5, 0x0, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x20, - 0xa, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x4f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, 0xdf, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x10, 0x0, 0x3, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, - 0x60, 0x0, 0x0, 0x7, 0xff, 0xff, 0xb1, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xfa, 0x52, 0x11, - 0x24, 0x9e, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x27, 0xbe, 0xff, 0xff, 0xfe, 0x72, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x6, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xfb, 0x30, 0x0, 0x3a, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0xed, 0xef, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8c, 0xff, - 0xeb, 0x60, 0x0, - - /* U+0052 "R" */ - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x83, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x12, 0x47, - 0xdf, 0xff, 0xf7, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xe0, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf1, 0x3f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xe0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x25, 0xbf, 0xff, - 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, - 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfc, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x3f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf2, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xfd, 0x0, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x80, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf3, - - /* U+0053 "S" */ - 0x0, 0x0, 0x1, 0x7b, 0xdf, 0xff, 0xeb, 0x84, - 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe8, 0x0, 0x0, 0x2d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xdf, - 0xff, 0xd7, 0x31, 0x1, 0x25, 0x9e, 0xff, 0x40, - 0x6, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6b, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfe, - 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xfd, 0x95, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x36, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x5, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, - 0xd, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf5, 0x5f, 0xff, 0xfd, 0x84, 0x21, 0x1, - 0x37, 0xdf, 0xff, 0xc0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x3b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, 0xda, 0x61, - 0x0, 0x0, - - /* U+0054 "T" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x11, 0x11, 0x11, 0x14, 0xff, 0xf6, 0x11, 0x11, - 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - - /* U+0055 "U" */ - 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, - 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfe, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x5f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, - 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xfb, 0xf, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0xc, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf3, 0x6, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xd0, 0x0, 0xdf, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0x50, 0x0, - 0x3f, 0xff, 0xfe, 0x85, 0x32, 0x36, 0xcf, 0xff, - 0xf9, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xed, 0x95, - 0x0, 0x0, 0x0, - - /* U+0056 "V" */ - 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x5f, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf0, 0x0, 0xef, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, - 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x1f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, - 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xfc, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x50, - 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf4, 0x0, 0x0, 0x6f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xb0, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x4, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf9, 0x0, 0xbf, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf1, 0x2f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x79, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xfe, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0057 "W" */ - 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0x35, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0xf, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf8, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x5, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xd0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xaf, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0xaf, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc3, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, - 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf7, 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xd0, 0x0, 0x0, 0xf, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, 0x8f, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xc0, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0xef, 0xf6, 0x0, 0xd, 0xff, 0xa0, - 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xff, 0x10, - 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0xef, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, - 0x9, 0xff, 0xb0, 0x0, 0x2, 0xff, 0xf5, 0x0, - 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf5, 0x0, 0x0, 0xef, 0xf6, 0x0, 0x0, - 0xc, 0xff, 0xa0, 0x0, 0xa, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x5f, - 0xff, 0x10, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0x10, 0xa, 0xff, 0xb0, 0x0, 0x0, 0x1, - 0xff, 0xf5, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xa0, 0xa, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xb0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x1b, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf5, 0x5f, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf7, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xba, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+0058 "X" */ - 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xb0, 0x0, 0xdf, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x10, - 0x0, 0x2f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf4, 0x0, 0x0, 0x6, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, 0x0, 0x2, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xf3, 0x0, 0x0, 0xc, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x8f, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xa0, 0x4, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, 0x1e, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xf7, 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x9, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xfe, 0x10, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x2f, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x90, 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0x70, 0x0, 0x0, 0x1e, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf3, 0x0, - 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfd, 0x0, 0x6, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa0, - 0x3f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf6, - - /* U+0059 "Y" */ - 0xd, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x20, 0x3f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x80, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xd0, 0x0, 0x1, 0xef, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xf4, 0x0, 0x0, 0x6, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0xb, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xfd, 0x0, 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x1, - 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf2, 0x0, 0x9f, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, - 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x5c, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+005A "Z" */ - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x12, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xfc, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x10, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, - - /* U+005B "[" */ - 0x3f, 0xff, 0xff, 0xff, 0x43, 0xff, 0xff, 0xff, - 0xf4, 0x3f, 0xff, 0xdd, 0xdd, 0x33, 0xff, 0xf3, - 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, - 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, - 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, - 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, - 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, - 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, - 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, - 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, - 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, - 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, - 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, - 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, - 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, - 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, - 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, - 0xff, 0xdd, 0xdd, 0x33, 0xff, 0xff, 0xff, 0xf4, - 0x3f, 0xff, 0xff, 0xff, 0x40, - - /* U+005C "\\" */ - 0x28, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, - - /* U+005D "]" */ - 0x5f, 0xff, 0xff, 0xff, 0x35, 0xff, 0xff, 0xff, - 0xf3, 0x4d, 0xdd, 0xdf, 0xff, 0x30, 0x0, 0x4, - 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, - 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, - 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, - 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, - 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, - 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, - 0x0, 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, - 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, - 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x4, - 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, - 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, - 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, - 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, - 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, - 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x4d, - 0xdd, 0xdf, 0xff, 0x35, 0xff, 0xff, 0xff, 0xf3, - 0x5f, 0xff, 0xff, 0xff, 0x30, - - /* U+005E "^" */ - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xfd, 0xc, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x60, 0x6f, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, 0x0, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, - 0x9, 0xff, 0x20, 0x0, 0x0, 0x8, 0xff, 0x20, - 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x0, 0xef, 0xc0, - 0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, 0x6f, 0xf5, - 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, 0xc, 0xfe, - 0x0, 0x0, 0x0, 0xe, 0xfc, 0x0, 0x3, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, 0xaf, - 0xf1, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, 0x1f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, - - /* U+005F "_" */ - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, - - /* U+0060 "`" */ - 0x38, 0x88, 0x60, 0x0, 0x0, 0x7, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xb0, 0x0, 0x0, - 0x1, 0xaf, 0xfc, 0x10, 0x0, 0x0, 0x6, 0xff, - 0xd1, - - /* U+0061 "a" */ - 0x0, 0x0, 0x38, 0xbe, 0xff, 0xec, 0x82, 0x0, - 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x1, 0xff, 0xe8, 0x30, 0x0, - 0x26, 0xef, 0xff, 0x70, 0x0, 0x67, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, - 0x0, 0x1, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x4, 0xff, 0xff, 0xb8, 0x77, 0x77, - 0x77, 0xff, 0xf6, 0xd, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf6, 0x1f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf6, 0x2f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x1f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0xc, - 0xff, 0xe3, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf6, - 0x3, 0xff, 0xff, 0xb8, 0x78, 0xcf, 0xfe, 0xff, - 0xf6, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0xef, 0xf6, 0x0, 0x1, 0x6b, 0xef, 0xfd, 0xa6, - 0x0, 0xef, 0xf6, - - /* U+0062 "b" */ - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xb0, 0x2, 0x8c, 0xef, 0xec, - 0x83, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0xb, 0xff, - 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x2, 0x7d, - 0xff, 0xfe, 0x10, 0xb, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0xbf, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, - 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x90, 0xbf, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfd, 0xb, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf0, 0xbf, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0xb, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x90, 0xbf, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0xbf, - 0xff, 0xff, 0xe8, 0x30, 0x2, 0x7d, 0xff, 0xfe, - 0x10, 0xb, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0xbf, 0xf9, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0xb, 0xff, - 0x90, 0x2, 0x8c, 0xef, 0xec, 0x83, 0x0, 0x0, - 0x0, - - /* U+0063 "c" */ - 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xd9, 0x40, - 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xc2, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x5, 0xff, 0xff, - 0xa4, 0x10, 0x14, 0xbf, 0xff, 0xe1, 0x2, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, - 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x52, - 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x52, 0x0, 0x2, 0xff, 0xfe, - 0x40, 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, 0x4, - 0xff, 0xff, 0xa4, 0x10, 0x14, 0xaf, 0xff, 0xe1, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, - 0xff, 0xd9, 0x40, 0x0, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x40, 0x0, 0x0, 0x5, 0xad, 0xff, 0xdb, - 0x50, 0x3, 0xff, 0xf4, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xd4, 0x3f, 0xff, 0x40, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xf4, 0x0, 0x7f, 0xff, 0xfa, 0x41, 0x1, 0x5b, - 0xff, 0xff, 0xff, 0x40, 0x3f, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xf4, 0xb, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0x41, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xf4, 0x4f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x46, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf4, - 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x46, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf4, 0x4f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x41, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf4, 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x40, 0x3f, 0xff, 0xd2, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf4, 0x0, - 0x7f, 0xff, 0xf7, 0x10, 0x0, 0x18, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x8f, 0xff, 0xff, 0xec, 0xef, - 0xff, 0xf8, 0xff, 0xf4, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0xf, 0xff, 0x40, 0x0, - 0x0, 0x6, 0xad, 0xff, 0xeb, 0x60, 0x0, 0xff, - 0xf4, - - /* U+0065 "e" */ - 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, 0xb6, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xfe, 0xef, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x6f, - 0xff, 0xd5, 0x10, 0x0, 0x4c, 0xff, 0xf8, 0x0, - 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x40, 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xc0, 0x1f, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, 0x4f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x6f, 0xff, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, 0x4f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x2, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x7, 0xe2, 0x0, 0x0, 0x6f, - 0xff, 0xfb, 0x51, 0x0, 0x26, 0xdf, 0xfd, 0x10, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x49, - 0xce, 0xff, 0xda, 0x60, 0x0, 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0x92, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x6f, 0xff, 0xfe, 0xdf, 0xf5, 0x0, 0x0, 0xef, - 0xfe, 0x30, 0x0, 0x50, 0x0, 0x2, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5c, - 0xcd, 0xff, 0xfd, 0xcc, 0xcc, 0x80, 0x0, 0x3, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x0, 0x0, 0x6a, 0xdf, 0xfe, 0xb6, 0x10, - 0xc, 0xff, 0x80, 0x0, 0x5, 0xef, 0xff, 0xff, - 0xff, 0xff, 0x70, 0xcf, 0xf8, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xac, 0xff, 0x80, - 0x9, 0xff, 0xff, 0x94, 0x10, 0x3, 0x8f, 0xff, - 0xff, 0xf8, 0x5, 0xff, 0xfd, 0x20, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0x80, 0xdf, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf8, 0x2f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x85, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf8, 0x7f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x87, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf8, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x82, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0xc, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0x80, 0x4f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xfa, 0x41, - 0x1, 0x39, 0xff, 0xff, 0xff, 0x80, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xef, 0xf8, - 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xe, 0xff, 0x80, 0x0, 0x0, 0x6, 0xad, 0xff, - 0xeb, 0x71, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf2, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xfe, 0x0, 0x7, 0xf9, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x1, - 0xff, 0xff, 0xa6, 0x20, 0x0, 0x26, 0xdf, 0xff, - 0xe1, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x7, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, - 0x0, 0x48, 0xbd, 0xef, 0xfe, 0xb8, 0x20, 0x0, - 0x0, - - /* U+0068 "h" */ - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xb0, 0x3, 0x8c, 0xef, - 0xec, 0x81, 0x0, 0x0, 0xbf, 0xfb, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0xb, 0xff, 0xcd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xbf, - 0xff, 0xff, 0xd6, 0x21, 0x14, 0xaf, 0xff, 0xf4, - 0xb, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xc0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x1b, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf4, 0xbf, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x5b, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, 0xbf, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, - - /* U+0069 "i" */ - 0x0, 0x66, 0x10, 0xd, 0xff, 0xd0, 0x4f, 0xff, - 0xf4, 0x2f, 0xff, 0xf2, 0x6, 0xdd, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, - 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, - 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, - 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, - 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, - 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, - 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, - 0xb0, - - /* U+006A "j" */ - 0x0, 0x0, 0x0, 0x0, 0x57, 0x20, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x4, 0xce, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xb0, 0x4, 0x60, 0x0, 0x9f, - 0xff, 0x60, 0xb, 0xff, 0xef, 0xff, 0xfe, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x5, 0xbe, - 0xff, 0xd8, 0x10, 0x0, - - /* U+006B "k" */ - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xb0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xb0, 0x0, 0x0, 0xbf, 0xfb, - 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0xbf, 0xfb, 0x0, 0x1, 0xcf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x2d, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x3, 0xef, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, - 0x4f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf7, 0xef, 0xff, - 0x60, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x40, - 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xe3, 0x0, 0x6, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0xbf, 0xfe, 0x20, 0x0, 0x0, 0x9f, 0xff, 0xb0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf8, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0x50, 0x0, 0xbf, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xfd, 0x10, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xb0, - - /* U+006C "l" */ - 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, - 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, - 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, - 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, - 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, - 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, - 0xbf, 0xfb, 0xbf, 0xfb, - - /* U+006D "m" */ - 0xbf, 0xf9, 0x0, 0x5a, 0xdf, 0xfd, 0xb5, 0x0, - 0x0, 0x0, 0x5a, 0xde, 0xfe, 0xb6, 0x0, 0x0, - 0xbf, 0xf9, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0xbf, 0xfc, 0xef, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0x27, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x30, - 0xbf, 0xff, 0xff, 0x92, 0x0, 0x3, 0xcf, 0xff, - 0xef, 0xff, 0xa3, 0x0, 0x3, 0xbf, 0xff, 0xd0, - 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, - 0xbf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, - 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, - 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, - 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - - /* U+006E "n" */ - 0xbf, 0xf9, 0x0, 0x49, 0xde, 0xfe, 0xc8, 0x10, - 0x0, 0xb, 0xff, 0x92, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0xbf, 0xfb, 0xef, 0xff, 0xfe, - 0xef, 0xff, 0xff, 0x90, 0xb, 0xff, 0xff, 0xfa, - 0x30, 0x0, 0x17, 0xff, 0xff, 0x40, 0xbf, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0xb, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xf1, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0x4b, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf5, 0xbf, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, 0xbf, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x60, - - /* U+006F "o" */ - 0x0, 0x0, 0x0, 0x49, 0xdf, 0xff, 0xc9, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, - 0xf3, 0x0, 0x2, 0xff, 0xfe, 0x40, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xe1, 0x0, 0xaf, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x80, 0xf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xfe, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf2, 0x6f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x47, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xf5, 0x6f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0x44, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf2, 0xf, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, - 0x0, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x70, 0x2, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xe1, 0x0, 0x5, 0xff, - 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, 0xf3, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x49, 0xdf, 0xff, 0xc9, 0x40, 0x0, 0x0, 0x0, - - /* U+0070 "p" */ - 0xbf, 0xf9, 0x0, 0x38, 0xce, 0xfe, 0xc8, 0x30, - 0x0, 0x0, 0xb, 0xff, 0x91, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xa1, 0x0, 0x0, 0xbf, 0xfb, 0xdf, - 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xe3, 0x0, 0xb, - 0xff, 0xff, 0xfd, 0x50, 0x0, 0x4, 0xbf, 0xff, - 0xe1, 0x0, 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xb0, 0xb, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x40, 0xbf, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf9, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xd0, 0xbf, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xf0, 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xb, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0xbf, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, - 0xb, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x40, 0xbf, 0xff, 0xfc, 0x20, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xb0, 0xb, 0xff, 0xff, - 0xff, 0x83, 0x0, 0x27, 0xdf, 0xff, 0xe1, 0x0, - 0xbf, 0xfc, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x0, 0xb, 0xff, 0xb0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xb1, 0x0, 0x0, 0xbf, 0xfb, 0x0, - 0x28, 0xce, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0xb, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0071 "q" */ - 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfd, 0xb6, 0x0, - 0xf, 0xff, 0x40, 0x0, 0x4, 0xef, 0xff, 0xff, - 0xff, 0xfe, 0x40, 0xff, 0xf4, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0x40, - 0x7, 0xff, 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, - 0xff, 0xf4, 0x3, 0xff, 0xfe, 0x40, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0x40, 0xbf, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x1f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x44, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf4, 0x6f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x47, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xf4, 0x6f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0x44, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x1f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x40, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf4, 0x3, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0x40, 0x7, 0xff, - 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, 0xff, 0xf4, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0xff, 0x40, 0x0, 0x4, 0xef, 0xff, 0xff, - 0xff, 0xfd, 0x33, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x6a, 0xdf, 0xfd, 0xb5, 0x0, 0x3f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf4, - - /* U+0072 "r" */ - 0xbf, 0xf9, 0x0, 0x38, 0xce, 0x8b, 0xff, 0x90, - 0xaf, 0xff, 0xf8, 0xbf, 0xf9, 0xbf, 0xff, 0xff, - 0x8b, 0xff, 0xff, 0xff, 0x96, 0x42, 0xbf, 0xff, - 0xfc, 0x10, 0x0, 0xb, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, - 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, - 0x0, - - /* U+0073 "s" */ - 0x0, 0x0, 0x6, 0xad, 0xff, 0xed, 0xa7, 0x20, - 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x1f, 0xff, 0xe6, 0x10, 0x0, 0x25, - 0xbf, 0x60, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x8f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xfd, 0xa7, 0x30, 0x0, 0x0, 0x0, 0x6e, 0xff, - 0xff, 0xff, 0xff, 0xe8, 0x0, 0x0, 0x0, 0x4, - 0x8b, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x14, 0x8e, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, - 0xa3, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd0, - 0x7f, 0xfc, 0x73, 0x0, 0x0, 0x3a, 0xff, 0xf8, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x1, 0x6a, 0xde, 0xff, 0xeb, 0x82, - 0x0, 0x0, - - /* U+0074 "t" */ - 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x5c, 0xcd, 0xff, 0xfd, 0xcc, 0xcc, - 0x80, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x50, 0x1, 0x81, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xef, 0xf7, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x4a, 0xef, 0xfc, - 0x81, - - /* U+0075 "u" */ - 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x1e, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf1, 0xef, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x1e, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf1, 0xef, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x1e, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x1e, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf1, 0xef, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x1e, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf1, 0xef, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x1d, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xf1, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x19, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x4f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x10, 0xcf, - 0xff, 0xb3, 0x0, 0x1, 0x6e, 0xff, 0xff, 0xf1, - 0x2, 0xef, 0xff, 0xff, 0xde, 0xff, 0xff, 0xaf, - 0xff, 0x10, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfe, - 0x53, 0xff, 0xf1, 0x0, 0x0, 0x4a, 0xdf, 0xfe, - 0xb6, 0x0, 0x3f, 0xff, 0x10, - - /* U+0076 "v" */ - 0xd, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xe0, 0x6, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, 0xef, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x10, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, - 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xb0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xcf, - 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x0, 0xef, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, - 0x0, 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf1, 0x0, 0xd, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x0, 0x4f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfe, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0x52, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc9, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, - - /* U+0077 "w" */ - 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, - 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x90, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf3, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xfd, 0x0, 0x1, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xef, 0xf6, 0x0, 0x0, 0x0, 0xa, - 0xff, 0x70, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, - 0x4, 0xff, 0xd7, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0xff, 0xf1, 0x0, 0x0, 0x5f, 0xfd, 0x0, 0x0, - 0x0, 0xaf, 0xf7, 0x1f, 0xff, 0x20, 0x0, 0x0, - 0x6f, 0xfb, 0x0, 0x0, 0x0, 0xff, 0xf3, 0x0, - 0x0, 0x1f, 0xff, 0x10, 0xbf, 0xf7, 0x0, 0x0, - 0xc, 0xff, 0x50, 0x0, 0x0, 0x9, 0xff, 0x90, - 0x0, 0x7, 0xff, 0xb0, 0x4, 0xff, 0xd0, 0x0, - 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3f, 0xfe, - 0x0, 0x0, 0xdf, 0xf4, 0x0, 0xe, 0xff, 0x30, - 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf5, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x8f, 0xf9, - 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xb0, 0x9, 0xff, 0x80, 0x0, 0x2, 0xff, - 0xf0, 0x4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x10, 0xef, 0xf2, 0x0, 0x0, 0xc, - 0xff, 0x50, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xf6, 0x5f, 0xfc, 0x0, 0x0, 0x0, - 0x6f, 0xfb, 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xcb, 0xff, 0x50, 0x0, 0x0, - 0x0, 0xff, 0xf7, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, - - /* U+0078 "x" */ - 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x90, 0x1, 0xef, 0xfd, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xfc, 0x0, 0x0, 0x3f, 0xff, 0xa0, - 0x0, 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, 0x7, - 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0x30, 0x4, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd1, 0x1e, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xfb, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf5, 0x7f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x90, 0xb, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfc, - 0x0, 0x1, 0xef, 0xfc, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xe1, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, - 0x0, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x7, 0xff, - 0xf6, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x30, 0x2f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xe1, - - /* U+0079 "y" */ - 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xe0, 0x6, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, 0xef, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x10, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, - 0x9, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xb0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xbf, - 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0xef, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xb0, - 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf2, 0x0, 0xc, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x3f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x10, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x72, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xe9, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xa3, 0x0, 0x3d, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x9d, 0xff, 0xd9, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x4c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, - - /* U+007B "{" */ - 0x0, 0x0, 0x7, 0xcf, 0xff, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xec, 0x0, - 0xd, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, 0x80, - 0x0, 0x0, 0xf, 0xff, 0x60, 0x0, 0x0, 0x1f, - 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, - 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, - 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, - 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, - 0x0, 0x0, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x8f, - 0xff, 0x30, 0x0, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0xcd, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, - 0x1f, 0xff, 0x50, 0x0, 0x0, 0x1f, 0xff, 0x60, - 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, - 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, - 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, - 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, - 0xf, 0xff, 0x60, 0x0, 0x0, 0xf, 0xff, 0x90, - 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xec, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0x0, 0x0, 0x7, 0xcf, 0xff, - - /* U+007C "|" */ - 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, - 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, - 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, - 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, - 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, - 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, - 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, - 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, - 0x3f, 0xff, - - /* U+007D "}" */ - 0x5f, 0xfe, 0xb4, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0xef, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x30, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, 0x0, 0x3, - 0xff, 0xff, 0xd7, 0x0, 0x0, 0x9f, 0xff, 0x10, - 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x80, 0x0, 0x4d, 0xff, 0xff, - 0xf2, 0x0, 0x5, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x5f, 0xfe, 0xa4, 0x0, 0x0, 0x0, - - /* U+007E "~" */ - 0x0, 0x6c, 0xfe, 0xb3, 0x0, 0x0, 0x0, 0x7f, - 0xd0, 0x8f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xb, - 0xfb, 0x3f, 0xff, 0xbb, 0xff, 0xfc, 0x20, 0x4, - 0xff, 0x79, 0xff, 0x30, 0x3, 0xdf, 0xff, 0xbb, - 0xff, 0xf2, 0xcf, 0x90, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf7, 0xa, 0xc5, 0x0, 0x0, 0x0, 0x4b, - 0xff, 0xc5, 0x0, - - /* U+00B0 "°" */ - 0x0, 0x1, 0x7b, 0xdb, 0x71, 0x0, 0x0, 0x4, - 0xef, 0xff, 0xff, 0xf5, 0x0, 0x2, 0xff, 0x92, - 0x2, 0x8f, 0xf3, 0x0, 0xcf, 0x70, 0x0, 0x0, - 0x7f, 0xd0, 0x2f, 0xe0, 0x0, 0x0, 0x0, 0xef, - 0x34, 0xfa, 0x0, 0x0, 0x0, 0xa, 0xf6, 0x5f, - 0xa0, 0x0, 0x0, 0x0, 0xaf, 0x62, 0xfe, 0x0, - 0x0, 0x0, 0xd, 0xf4, 0xd, 0xf6, 0x0, 0x0, - 0x6, 0xfe, 0x0, 0x4f, 0xf7, 0x10, 0x7, 0xff, - 0x50, 0x0, 0x6f, 0xff, 0xef, 0xff, 0x70, 0x0, - 0x0, 0x29, 0xdf, 0xea, 0x30, 0x0, - - /* U+2022 "•" */ - 0x0, 0x37, 0x50, 0x0, 0x9f, 0xff, 0xd1, 0x5f, - 0xff, 0xff, 0x99, 0xff, 0xff, 0xfd, 0x7f, 0xff, - 0xff, 0xb1, 0xff, 0xff, 0xf5, 0x3, 0xcf, 0xd5, - 0x0, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x6a, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x38, 0xcf, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x49, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcc, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xea, 0x51, 0x8, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfd, 0x72, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x69, 0xbc, 0xac, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x3, 0x43, 0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xa3, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, 0x20, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, - 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x7a, 0xba, 0x85, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F008 "" */ - 0x6f, 0x40, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x4, 0xf6, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x4, 0xff, 0xff, 0xec, 0xcc, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xcc, 0xce, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa6, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc8, 0x88, 0xcf, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x88, - 0x8c, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf4, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x3f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xff, 0x40, - 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, - 0xff, 0x60, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, - 0x44, 0x9f, 0xff, 0x73, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x37, 0xff, 0xf9, 0x44, 0x49, 0xff, - 0xff, 0x40, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x4, 0xff, 0xff, 0x40, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xff, 0x94, - 0x44, 0x9f, 0xff, 0x73, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x37, 0xff, 0xf9, 0x44, 0x49, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xf7, 0x0, 0x6, 0xff, 0xff, 0x40, - 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, - 0xff, 0x40, 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, - 0x4, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf4, 0x0, 0x4, 0xff, 0xff, 0xc8, 0x88, 0xcf, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfc, 0x88, 0x8c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa6, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xec, 0xcc, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, - 0xce, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x4, 0xff, 0x7f, 0x40, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x4, 0xf6, - - /* U+F00B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x6e, 0xff, 0xff, 0xff, 0xfb, 0x10, - 0x9, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, - 0xff, 0xff, 0xfb, 0x10, 0x9, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0xa, 0xe7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8d, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x0, 0x6c, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xcc, 0x40, 0x0, 0x8f, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x50, 0x7f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xa4, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0xef, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xae, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x30, - 0x8f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0x50, 0x0, 0x6c, 0xb2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcc, 0x40, - 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x56, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xed, 0x10, 0x0, 0xe, - 0xff, 0xff, 0xb0, 0x0, 0x4, 0xed, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, - 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0xe, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xf4, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, - 0x7f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, 0xff, - 0xb0, 0x0, 0xdf, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xe, - 0xff, 0xff, 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x70, - 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xef, - 0xff, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfb, 0x0, - 0x5, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0x20, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0x70, 0xe, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xb0, 0x2f, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xe0, - 0x4f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xf1, 0x5f, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xf2, 0x6f, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xf3, 0x6f, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf2, - 0x5f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4, - 0xcd, 0xdb, 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xf1, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xc0, 0xb, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x80, - 0x6, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0x30, 0x0, 0xef, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xf8, 0x30, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xdb, 0xbd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xde, 0xed, - 0xb9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4a, 0xce, 0xee, 0xda, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x7, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, 0x18, - 0x30, 0x0, 0x0, 0x0, 0x9, 0xff, 0xa2, 0x2c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x6e, 0xff, 0x20, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x60, 0x0, 0x2a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x6e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xb2, - 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x60, 0x0, 0x2a, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x9, 0xff, 0xb2, - 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x6e, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7, - 0x40, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x20, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4a, 0xce, 0xee, 0xda, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x62, 0x0, 0x0, 0x0, 0x6, 0x77, - 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf8, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x5f, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xfd, 0x20, 0x5, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x5f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, - 0xec, 0xff, 0xff, 0xff, 0x75, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xc1, 0x6, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0x70, 0x2, 0x50, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0x40, 0x5, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xfd, 0x20, 0x7, 0xff, 0xff, - 0xd2, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfb, - 0x10, 0xa, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x5f, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xf9, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x3e, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf6, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x1c, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xe3, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xa, 0xff, - 0xff, 0xff, 0x70, 0x4, 0xef, 0xff, 0xff, 0xd2, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x20, 0x7, 0xff, 0xff, 0xff, 0xa0, - 0xef, 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x4, 0xff, 0xff, 0xff, 0x67, 0xff, 0xff, 0x80, - 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x2, 0xdf, 0xff, - 0xe1, 0xa, 0xff, 0x50, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x1, 0xbf, 0xf3, 0x0, 0x9, 0x30, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x75, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, - 0xbb, 0xbb, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x33, 0x33, - 0x39, 0xff, 0xff, 0xff, 0xff, 0x93, 0x33, 0x33, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x8, 0xff, 0xff, 0x80, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x8f, 0xf8, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x5, 0x50, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x61, 0x16, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 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, 0xcf, 0xfd, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xf2, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, - 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x8f, 0xfa, 0x5d, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xa3, - - /* U+F01C "" */ - 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf9, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x8d, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xef, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0x70, 0x0, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x5f, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xfc, 0xc, 0xff, 0xff, 0xc8, 0x88, 0x88, - 0x88, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x55, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xa1, 0x0, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x15, 0x9b, 0xde, 0xec, 0xa7, 0x30, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x71, 0x0, 0x0, 0xe, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0xe, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0xd, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xc, 0xff, 0xff, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xb6, 0x42, 0x24, 0x7c, 0xff, - 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, - 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x1e, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x1, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8e, 0xed, 0xcb, 0xaa, 0xff, 0xff, 0xff, 0xff, - 0x6, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xbc, - 0xdd, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe1, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, - 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x81, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xca, 0xff, - 0xff, 0xff, 0xff, 0xb7, 0x42, 0x24, 0x6b, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xff, 0xff, - 0xc0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x5, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xde, 0xed, - 0xb9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8b, 0xbb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x16, - 0x77, 0x77, 0x77, 0x7e, 0xff, 0xff, 0xff, 0xff, - 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, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xb4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8b, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x4e, 0xe4, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xa, 0xff, 0xf5, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x6f, - 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x9f, 0xfd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x3f, 0xff, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x5f, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xa, 0xff, 0xf7, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x5f, 0xf7, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x11, 0x0, 0x1, 0x67, 0x77, 0x77, 0x77, - 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x51, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, - 0xa8, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x30, 0x0, - 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0x30, 0x0, 0x9f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfe, - 0x20, 0x1, 0xef, 0xfc, 0x0, 0x16, 0x77, 0x77, - 0x77, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0x7, 0xff, - 0xf3, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xf5, 0x0, 0x1f, 0xff, 0x80, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x4, 0xff, 0x50, 0x0, 0x1e, 0xff, 0xc0, 0x0, - 0xbf, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x60, - 0x0, 0x8f, 0xff, 0x20, 0x6, 0xff, 0xf0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x5, 0xff, 0xff, 0x20, 0x1, 0xff, 0xf6, - 0x0, 0x2f, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4, 0xff, - 0xf9, 0x0, 0xd, 0xff, 0x90, 0x0, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0xbf, - 0xfb, 0x0, 0xf, 0xff, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x6f, 0xff, 0x0, 0xa, 0xff, 0xc0, 0x0, 0xef, - 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, - 0xbf, 0xfb, 0x0, 0xf, 0xff, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x4, 0xff, 0xf9, 0x0, 0xd, 0xff, 0x90, 0x0, - 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x5, 0xff, 0xff, 0x20, - 0x1, 0xff, 0xf6, 0x0, 0x3f, 0xff, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0xaf, 0xff, 0x60, 0x0, 0x8f, 0xff, 0x20, - 0x7, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xff, 0x50, - 0x0, 0x1e, 0xff, 0xc0, 0x0, 0xbf, 0xfd, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, - 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfb, 0x0, 0x8, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfe, - 0x20, 0x1, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x30, 0x0, 0xaf, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xfd, - 0x30, 0x0, 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x2, 0xa8, 0x0, 0x0, 0x3f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x50, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x30, 0x4, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x4a, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x73, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x1c, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x1, 0xcf, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x1c, 0xfe, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x1, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x52, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, - 0xff, 0xfc, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x80, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xbd, 0xff, 0xf9, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0xcf, 0xff, 0xd0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x87, 0xff, 0xff, 0x40, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2f, 0xff, - 0xfc, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x18, - 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x3, - 0xff, 0xff, 0xfb, 0x10, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0x83, 0x10, 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8d, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x56, - 0x76, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F048 "" */ - 0x6, 0x77, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x65, 0x0, 0x4f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xc0, - 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xf2, 0x4f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xfc, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xfc, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfd, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xfc, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xfc, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf1, 0x2f, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x0, 0x57, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2d, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 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, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x57, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x0, 0x47, 0x77, 0x77, 0x77, 0x62, 0x0, 0x0, - 0x0, 0x0, 0x47, 0x77, 0x77, 0x77, 0x62, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x6, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, - 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04D "" */ - 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x62, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F051 "" */ - 0x1, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x57, 0x77, 0x42, 0xef, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x7f, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x1, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x1, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa1, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x31, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xf7, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xf0, 0xaf, 0xe4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5e, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x6d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x3, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xc5, 0x0, - - /* U+F054 "" */ - 0x0, 0x9, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xc4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x55, - 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 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, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x19, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xef, 0xff, - 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F068 "" */ - 0x19, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x50, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 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, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, - 0xad, 0xef, 0xfe, 0xdb, 0x85, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x76, - 0x8a, 0xef, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, - 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x5e, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x14, 0x53, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xc1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0x50, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x11, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0x90, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x6, 0xfc, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0x23, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xa, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x8e, 0xff, - 0xfb, 0x40, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, - 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x5d, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xc8, 0x66, 0x7a, 0xef, 0xff, 0xff, 0xff, 0xc2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, - 0xdb, 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F070 "" */ - 0x0, 0x16, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x3, 0x7b, - 0xdf, 0xfe, 0xdc, 0x96, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xf9, 0x0, 0x16, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd7, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x76, - 0x79, 0xdf, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, - 0x0, 0x2b, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x2, 0x32, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xf6, 0x1, 0xff, 0xfe, 0x80, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xfa, 0xb, 0xff, 0xff, 0xd2, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xe4, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xd0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xfb, 0x10, 0x0, 0x0, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0x30, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0x10, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xfd, 0x30, 0xef, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x2d, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, - 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xef, 0xff, 0xff, 0xff, 0xd9, 0x66, 0x76, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x26, 0x9c, 0xde, 0xfe, 0xdc, 0x95, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x16, 0x10, 0x0, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x56, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x75, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x1, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x31, 0x5e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x17, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x84, - 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xe2, 0x0, 0x7a, 0xaa, 0xaa, 0xaa, 0xa3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0xaa, 0xaf, - 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xf9, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x4, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0x50, 0x0, 0xf, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xa0, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x1, 0x63, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, - 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xfa, 0x0, 0x56, 0x0, - 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xb0, 0x4, - 0xff, 0x50, 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfb, - 0x0, 0x3f, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xc0, 0x3, 0xff, 0xff, 0xff, 0x40, 0xf, - 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x7a, 0xaa, - 0xaa, 0xaa, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8a, 0xaa, 0xaf, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, - 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xa0, - 0x8f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xf0, - 0x3f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb0, - 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, - 0x0, 0x4c, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x90, 0x0, - - /* U+F078 "" */ - 0x0, 0x4c, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x90, 0x0, - 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, - 0x3f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb0, - 0x8f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf0, - 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, - 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, - 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x2, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x6e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0x7c, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf3, 0x1f, 0xff, 0xf6, 0xc, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x8f, 0xf4, 0x1, 0xff, 0xff, 0x60, 0x1d, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xa9, 0x10, 0x1f, - 0xff, 0xf6, 0x0, 0x6b, 0x60, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xfc, 0x1, 0xff, 0xff, - 0x60, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xfb, 0x1f, 0xff, 0xf6, 0x6f, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xb8, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x40, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x50, 0x0, 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x75, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x19, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xcc, 0xcc, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xcc, 0xcc, - 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x8, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x68, 0x88, 0x88, - 0x73, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x10, 0x0, 0x0, 0x1, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 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, 0xcf, 0xfd, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xf2, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, - 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x8f, 0xfa, 0x5d, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xa3, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x62, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfe, 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x84, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x77, 0x65, 0x31, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C4 "" */ - 0x0, 0x0, 0x3, 0x54, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xfb, 0x20, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe3, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf5, - 0xbf, 0xff, 0xf9, 0x35, 0xef, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, - 0xef, 0xff, 0xb0, 0x0, 0x3f, 0xff, 0xf6, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0xf7, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0xef, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xf6, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0xaf, 0xff, 0xfc, 0x68, 0xff, 0xff, 0xf2, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x3, - 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x12, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x55, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xf9, 0x35, 0xef, 0xff, 0xf2, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0xef, 0xff, 0xb0, 0x0, 0x3f, 0xff, 0xf6, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0xf7, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0xef, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xf6, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0xaf, 0xff, 0xfc, 0x68, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf6, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xd7, 0x0, - 0x0, 0x4, 0xcf, 0xff, 0xe8, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0xab, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0x50, 0xa, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x1f, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xfa, - 0x6e, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x44, 0x44, 0x44, 0x43, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xf1, 0x6, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x51, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x60, 0x0, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf5, 0x0, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x50, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe0, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xe9, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x89, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, - 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x97, - 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C9 "" */ - 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 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, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 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, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 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, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, - - /* U+F0E0 "" */ - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x50, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x1b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x30, 0x1, 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb1, 0x0, 0x7f, 0xff, 0xb1, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xfe, - 0x40, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x50, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x5e, - 0xff, 0xff, 0xe5, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x1, 0x8e, 0xe8, 0x10, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 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, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, - - /* U+F0E7 "" */ - 0x0, 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x43, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5a, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x0, 0x0, 0x5, 0x9a, 0x71, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x66, 0x66, 0x6a, 0xff, 0xff, 0xff, 0xd6, - 0x66, 0x66, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0x53, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x53, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, - 0xbb, 0xbb, 0xbb, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x1f, 0x80, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x1f, 0xf9, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0x90, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0xf9, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0xff, 0x90, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0xb, 0xbb, 0xbb, 0xb7, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x6e, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xab, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x91, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, - 0xff, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, - 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, - 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xa1, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xff, 0xff, 0xe8, 0x88, 0xaf, 0xfc, - 0x88, 0x8c, 0xff, 0xa8, 0x88, 0xdf, 0xf9, 0x88, - 0x9f, 0xfd, 0x88, 0x8a, 0xff, 0xff, 0x8f, 0xff, - 0xf8, 0x0, 0x0, 0xff, 0x40, 0x0, 0x4f, 0xf0, - 0x0, 0x5, 0xff, 0x0, 0x0, 0xff, 0x50, 0x0, - 0xf, 0xff, 0xf8, 0xff, 0xff, 0x80, 0x0, 0xf, - 0xf4, 0x0, 0x4, 0xff, 0x0, 0x0, 0x5f, 0xe0, - 0x0, 0xe, 0xf5, 0x0, 0x0, 0xff, 0xff, 0x8f, - 0xff, 0xf8, 0x0, 0x0, 0xff, 0x40, 0x0, 0x4f, - 0xf0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0xef, 0x50, - 0x0, 0xf, 0xff, 0xf8, 0xff, 0xff, 0xa0, 0x0, - 0x2f, 0xf6, 0x0, 0x6, 0xff, 0x20, 0x0, 0x8f, - 0xf1, 0x0, 0x1f, 0xf8, 0x0, 0x2, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf5, 0x44, 0x5f, - 0xfb, 0x44, 0x46, 0xff, 0xa4, 0x44, 0x7f, 0xf7, - 0x44, 0x4b, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0xdf, 0x60, 0x0, 0xe, - 0xf5, 0x0, 0x0, 0xff, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0xd, 0xf6, 0x0, 0x0, 0xef, 0x50, 0x0, 0xf, - 0xf0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0x60, 0x0, - 0xe, 0xf5, 0x0, 0x0, 0xff, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf5, - 0x44, 0x5f, 0xfb, 0x44, 0x46, 0xff, 0xa4, 0x44, - 0x7f, 0xf7, 0x44, 0x4b, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xf8, 0x0, 0x2, 0xff, 0xff, 0x8f, 0xff, 0xf8, - 0x0, 0x0, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0x50, 0x0, 0xf, - 0xff, 0xf8, 0xff, 0xff, 0x80, 0x0, 0xf, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xf5, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, - 0xf8, 0x0, 0x0, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, - 0xf, 0xff, 0xf8, 0xff, 0xff, 0xe8, 0x88, 0xaf, - 0xfc, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x9f, 0xfd, 0x88, 0x8a, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x55, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xa1, 0x0, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x47, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x3a, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x16, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F15B "" */ - 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, - 0x0, 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xd1, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0xff, 0xd1, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0xf, 0xff, 0xd1, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, - 0xff, 0xd1, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xd1, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0xff, 0xff, 0xff, 0xd1, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, - 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0xb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xba, 0x30, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x12, 0x34, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x47, 0xad, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0xa7, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x87, - 0x66, 0x67, 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x30, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x84, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x8d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xae, - 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xdf, 0xff, 0xff, 0xfe, 0x3f, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0x30, 0x3f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x6a, 0xce, 0xff, - 0xfe, 0xca, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x30, 0x0, 0x3b, 0x40, 0x0, 0x0, - 0x0, 0x1, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x81, 0x0, 0x0, 0x0, 0x0, 0x3b, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcb, - 0xab, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xfc, 0x62, 0x0, 0x0, 0x0, - 0x2, 0x6c, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xcf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4b, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xdb, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x5, 0x7b, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xf8, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, - - /* U+F241 "" */ - 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, - - /* U+F242 "" */ - 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, - - /* U+F243 "" */ - 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, - - /* U+F244 "" */ - 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x52, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xdd, - 0xdf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xbb, 0xbf, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf4, 0x0, 0xb, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xfe, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x44, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x91, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xfe, 0x60, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xfc, 0x30, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, - 0x88, 0xbf, 0xff, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x9c, 0xff, 0xff, - 0xf9, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, - 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x91, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xc3, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x6, 0xaa, - 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x7, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xe8, 0x8b, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xbe, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x77, 0x77, 0x77, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, 0x32, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6a, 0xef, 0xff, 0xff, 0xfe, 0xa5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xe1, 0xdf, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0x0, 0xd, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xe0, 0x9, 0x30, 0x8, 0xff, 0xff, - 0xff, 0x40, 0x1f, 0xff, 0xff, 0xb0, 0x5f, 0xff, - 0xe0, 0xa, 0xf3, 0x0, 0x9f, 0xff, 0xff, 0x70, - 0x3f, 0xff, 0xff, 0x10, 0x5, 0xff, 0xe0, 0xa, - 0xff, 0x20, 0xb, 0xff, 0xff, 0xa0, 0x6f, 0xff, - 0xff, 0xd1, 0x0, 0x5f, 0xe0, 0x9, 0xfa, 0x0, - 0x3f, 0xff, 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xfd, - 0x10, 0x4, 0xe0, 0x9, 0xa0, 0x2, 0xef, 0xff, - 0xff, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x30, 0x4, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf0, - 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xaf, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xf0, 0x9f, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x40, 0x5, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x5, - 0xe0, 0x9, 0xb0, 0x0, 0xbf, 0xff, 0xff, 0xd0, - 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x6f, 0xf0, 0x9, - 0xfa, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x3f, 0xff, - 0xff, 0x10, 0x6, 0xff, 0xf0, 0xa, 0xfe, 0x10, - 0x8, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xc1, - 0x6f, 0xff, 0xf0, 0xa, 0xe2, 0x0, 0x7f, 0xff, - 0xff, 0x70, 0xc, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xf0, 0x8, 0x20, 0x7, 0xff, 0xff, 0xff, 0x40, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x68, 0x9a, 0xba, - 0x97, 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xbb, 0xbb, - 0xbb, 0xbb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x37, 0x77, 0x77, 0x77, 0x79, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x77, 0x77, 0x77, 0x77, 0x60, - 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, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x82, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0x22, 0xff, 0xff, 0xd1, - 0x6f, 0xff, 0xfa, 0xa, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, - 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0x22, 0xff, 0xff, 0xd1, - 0x6f, 0xff, 0xfa, 0xa, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, - 0x0, 0x0, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x61, 0x0, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xb1, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xd1, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xd1, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xd1, 0x1, 0xdf, - 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xd1, 0x1, 0xdf, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x1, 0xdf, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, - 0xde, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xfd, 0xca, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x76, 0x53, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, - 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0xc, 0xff, 0xc0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, - 0xc0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xc, - 0xff, 0xff, 0xc0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, - 0xff, 0xc0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, - 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x28, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x75, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1d, 0xff, 0xe0, - 0x0, 0xef, 0x50, 0x2, 0xff, 0x20, 0x8, 0xff, - 0xff, 0x0, 0x1d, 0xff, 0xfe, 0x0, 0xe, 0xf5, - 0x0, 0x2f, 0xf2, 0x0, 0x8f, 0xff, 0xf0, 0x1d, - 0xff, 0xff, 0xe0, 0x0, 0xef, 0x50, 0x2, 0xff, - 0x20, 0x8, 0xff, 0xff, 0x1d, 0xff, 0xff, 0xfe, - 0x0, 0xe, 0xf5, 0x0, 0x2f, 0xf2, 0x0, 0x8f, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xef, - 0x50, 0x2, 0xff, 0x20, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xe, 0xf5, 0x0, 0x2f, - 0xf2, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0xef, 0x50, 0x2, 0xff, 0x20, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x39, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xb9, 0x30, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x37, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0xa, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x10, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xf1, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0x10, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xa3, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6d, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 155, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 154, .box_w = 6, .box_h = 25, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 75, .adv_w = 225, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 15}, - {.bitmap_index = 125, .adv_w = 405, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 438, .adv_w = 358, .box_w = 20, .box_h = 34, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 778, .adv_w = 486, .box_w = 29, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1141, .adv_w = 395, .box_w = 24, .box_h = 26, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1453, .adv_w = 121, .box_w = 4, .box_h = 10, .ofs_x = 2, .ofs_y = 15}, - {.bitmap_index = 1473, .adv_w = 194, .box_w = 8, .box_h = 33, .ofs_x = 3, .ofs_y = -7}, - {.bitmap_index = 1605, .adv_w = 195, .box_w = 8, .box_h = 33, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 1737, .adv_w = 230, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 12}, - {.bitmap_index = 1835, .adv_w = 335, .box_w = 17, .box_h = 16, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 1971, .adv_w = 131, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 2001, .adv_w = 221, .box_w = 10, .box_h = 3, .ofs_x = 2, .ofs_y = 8}, - {.bitmap_index = 2016, .adv_w = 131, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2031, .adv_w = 203, .box_w = 16, .box_h = 34, .ofs_x = -2, .ofs_y = -4}, - {.bitmap_index = 2303, .adv_w = 384, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2578, .adv_w = 213, .box_w = 10, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2703, .adv_w = 331, .box_w = 20, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2953, .adv_w = 329, .box_w = 19, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3191, .adv_w = 385, .box_w = 23, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3479, .adv_w = 331, .box_w = 20, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3729, .adv_w = 355, .box_w = 21, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3992, .adv_w = 344, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4242, .adv_w = 371, .box_w = 21, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4505, .adv_w = 355, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4755, .adv_w = 131, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4812, .adv_w = 131, .box_w = 6, .box_h = 24, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 4884, .adv_w = 335, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 5029, .adv_w = 335, .box_w = 17, .box_h = 11, .ofs_x = 2, .ofs_y = 7}, - {.bitmap_index = 5123, .adv_w = 335, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 5268, .adv_w = 330, .box_w = 19, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5506, .adv_w = 596, .box_w = 35, .box_h = 32, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 6066, .adv_w = 422, .box_w = 28, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 6416, .adv_w = 436, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6704, .adv_w = 416, .box_w = 24, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7004, .adv_w = 476, .box_w = 26, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7329, .adv_w = 386, .box_w = 20, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7579, .adv_w = 366, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7817, .adv_w = 445, .box_w = 24, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8117, .adv_w = 468, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8405, .adv_w = 179, .box_w = 5, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8468, .adv_w = 295, .box_w = 16, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 8668, .adv_w = 414, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8956, .adv_w = 342, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9194, .adv_w = 550, .box_w = 28, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9544, .adv_w = 468, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9832, .adv_w = 484, .box_w = 28, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10182, .adv_w = 416, .box_w = 22, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10457, .adv_w = 484, .box_w = 29, .box_h = 30, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 10892, .adv_w = 419, .box_w = 22, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 11167, .adv_w = 358, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11417, .adv_w = 338, .box_w = 21, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11680, .adv_w = 456, .box_w = 22, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 11955, .adv_w = 410, .box_w = 27, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 12293, .adv_w = 649, .box_w = 39, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 12781, .adv_w = 388, .box_w = 24, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13081, .adv_w = 373, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 13394, .adv_w = 378, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 13669, .adv_w = 192, .box_w = 9, .box_h = 33, .ofs_x = 3, .ofs_y = -7}, - {.bitmap_index = 13818, .adv_w = 203, .box_w = 16, .box_h = 34, .ofs_x = -2, .ofs_y = -4}, - {.bitmap_index = 14090, .adv_w = 192, .box_w = 9, .box_h = 33, .ofs_x = 0, .ofs_y = -7}, - {.bitmap_index = 14239, .adv_w = 336, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 14367, .adv_w = 288, .box_w = 18, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14394, .adv_w = 346, .box_w = 10, .box_h = 5, .ofs_x = 4, .ofs_y = 22}, - {.bitmap_index = 14419, .adv_w = 344, .box_w = 18, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 14590, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 14863, .adv_w = 329, .box_w = 19, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 15044, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 15317, .adv_w = 353, .box_w = 20, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 15507, .adv_w = 203, .box_w = 14, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15689, .adv_w = 397, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 15962, .adv_w = 392, .box_w = 19, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 16209, .adv_w = 161, .box_w = 6, .box_h = 27, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 16290, .adv_w = 164, .box_w = 12, .box_h = 34, .ofs_x = -4, .ofs_y = -7}, - {.bitmap_index = 16494, .adv_w = 355, .box_w = 20, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 16754, .adv_w = 161, .box_w = 4, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 16806, .adv_w = 609, .box_w = 32, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 17110, .adv_w = 392, .box_w = 19, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 17291, .adv_w = 366, .box_w = 21, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 17491, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 3, .ofs_y = -7}, - {.bitmap_index = 17764, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 18037, .adv_w = 236, .box_w = 11, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 18142, .adv_w = 289, .box_w = 17, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 18304, .adv_w = 238, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 18465, .adv_w = 390, .box_w = 19, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 18646, .adv_w = 322, .box_w = 22, .box_h = 19, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 18855, .adv_w = 518, .box_w = 33, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 19169, .adv_w = 318, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 19359, .adv_w = 322, .box_w = 22, .box_h = 26, .ofs_x = -1, .ofs_y = -7}, - {.bitmap_index = 19645, .adv_w = 300, .box_w = 17, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 19807, .adv_w = 202, .box_w = 10, .box_h = 33, .ofs_x = 2, .ofs_y = -7}, - {.bitmap_index = 19972, .adv_w = 172, .box_w = 4, .box_h = 33, .ofs_x = 3, .ofs_y = -7}, - {.bitmap_index = 20038, .adv_w = 202, .box_w = 11, .box_h = 33, .ofs_x = 0, .ofs_y = -7}, - {.bitmap_index = 20220, .adv_w = 335, .box_w = 17, .box_h = 6, .ofs_x = 2, .ofs_y = 9}, - {.bitmap_index = 20271, .adv_w = 241, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 14}, - {.bitmap_index = 20349, .adv_w = 181, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 7}, - {.bitmap_index = 20374, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 21040, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 21526, .adv_w = 576, .box_w = 36, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 22120, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 22606, .adv_w = 396, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 22919, .adv_w = 576, .box_w = 36, .box_h = 36, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 23567, .adv_w = 576, .box_w = 35, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 24215, .adv_w = 648, .box_w = 41, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 24892, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 25558, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 26112, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 26778, .adv_w = 288, .box_w = 18, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 27039, .adv_w = 432, .box_w = 27, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 27431, .adv_w = 648, .box_w = 41, .box_h = 35, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 28149, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 28635, .adv_w = 396, .box_w = 25, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 29098, .adv_w = 504, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = -3}, - {.bitmap_index = 29494, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 30086, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 30614, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 31142, .adv_w = 504, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = -3}, - {.bitmap_index = 31522, .adv_w = 504, .box_w = 34, .box_h = 33, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 32083, .adv_w = 360, .box_w = 20, .box_h = 31, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 32393, .adv_w = 360, .box_w = 20, .box_h = 31, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 32703, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 33231, .adv_w = 504, .box_w = 32, .box_h = 7, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 33343, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 33897, .adv_w = 720, .box_w = 47, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 34767, .adv_w = 648, .box_w = 42, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 35544, .adv_w = 576, .box_w = 36, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 36138, .adv_w = 504, .box_w = 32, .box_h = 19, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 36442, .adv_w = 504, .box_w = 32, .box_h = 19, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 36746, .adv_w = 720, .box_w = 45, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 37399, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 37885, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 38551, .adv_w = 576, .box_w = 37, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 39236, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 39764, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 40356, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 40884, .adv_w = 504, .box_w = 32, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 41348, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 41834, .adv_w = 360, .box_w = 24, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 42278, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 42870, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 43462, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 44016, .adv_w = 576, .box_w = 38, .box_h = 38, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 44738, .adv_w = 432, .box_w = 27, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 45238, .adv_w = 720, .box_w = 45, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 46003, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 46521, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 47039, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 47557, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 48075, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 48593, .adv_w = 720, .box_w = 46, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 49260, .adv_w = 504, .box_w = 28, .box_h = 37, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 49778, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 50370, .adv_w = 576, .box_w = 37, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 51055, .adv_w = 720, .box_w = 45, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 51663, .adv_w = 432, .box_w = 27, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 52163, .adv_w = 579, .box_w = 37, .box_h = 23, .ofs_x = 0, .ofs_y = 2} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 6, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 26, 0, 16, -13, 0, 0, - 0, 0, -32, -35, 4, 27, 13, 10, - -23, 4, 28, 2, 24, 6, 18, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 35, 5, -4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 12, 0, -17, 0, 0, 0, 0, - 0, -12, 10, 12, 0, 0, -6, 0, - -4, 6, 0, -6, 0, -6, -3, -12, - 0, 0, 0, 0, -6, 0, 0, -7, - -9, 0, 0, -6, 0, -12, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -6, - -6, 0, -9, 0, -16, 0, -70, 0, - 0, -12, 0, 12, 17, 1, 0, -12, - 6, 6, 19, 12, -10, 12, 0, 0, - -33, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -21, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -16, -7, -28, 0, -23, - -4, 0, 0, 0, 0, 1, 22, 0, - -17, -5, -2, 2, 0, -10, 0, 0, - -4, -43, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -46, -5, 22, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -24, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19, - 0, 6, 0, 0, -12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 22, 5, - 2, 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, - -21, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, - 12, 6, 17, -6, 0, 0, 12, -6, - -19, -79, 4, 16, 12, 1, -7, 0, - 21, 0, 18, 0, 18, 0, -54, 0, - -7, 17, 0, 19, -6, 12, 6, 0, - 0, 2, -6, 0, 0, -10, 46, 0, - 46, 0, 17, 0, 24, 7, 10, 17, - 0, 0, 0, -21, 0, 0, 0, 0, - 2, -4, 0, 4, -10, -7, -12, 4, - 0, -6, 0, 0, 0, -23, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -37, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, -32, 0, -36, 0, 0, 0, - 0, -4, 0, 57, -7, -7, 6, 6, - -5, 0, -7, 6, 0, 0, -31, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -56, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -36, 0, 35, 0, 0, -21, 0, - 19, 0, -39, -56, -39, -12, 17, 0, - 0, -39, 0, 7, -13, 0, -9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 15, 17, -70, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 27, 0, 4, 0, 0, 0, - 0, 0, 4, 4, -7, -12, 0, -2, - -2, -6, 0, 0, -4, 0, 0, 0, - -12, 0, -5, 0, -13, -12, 0, -14, - -19, -19, -11, 0, -12, 0, -12, 0, - 0, 0, 0, -5, 0, 0, 6, 0, - 4, -6, 0, 2, 0, 0, 0, 6, - -4, 0, 0, 0, -4, 6, 6, -2, - 0, 0, 0, -11, 0, -2, 0, 0, - 0, 0, 0, 2, 0, 7, -4, 0, - -7, 0, -10, 0, 0, -4, 0, 17, - 0, 0, -6, 0, 0, 0, 0, 0, - -2, 2, -4, -4, 0, 0, -6, 0, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -3, -3, 0, -6, -7, 0, - 0, 0, 0, 0, 2, 0, 0, -4, - 0, -6, -6, -6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -3, 0, 0, - 0, 0, -4, -7, 0, -9, 0, -17, - -4, -17, 12, 0, 0, -12, 6, 12, - 16, 0, -14, -2, -7, 0, -2, -27, - 6, -4, 4, -31, 6, 0, 0, 2, - -30, 0, -31, -5, -50, -4, 0, -29, - 0, 12, 16, 0, 7, 0, 0, 0, - 0, 1, 0, -10, -7, 0, -17, 0, - 0, 0, -6, 0, 0, 0, -6, 0, - 0, 0, 0, 0, -3, -3, 0, -3, - -7, 0, 0, 0, 0, 0, 0, 0, - -6, -6, 0, -4, -7, -5, 0, 0, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, -5, 0, -7, - 0, -4, 0, -12, 6, 0, 0, -7, - 3, 6, 6, 0, 0, 0, 0, 0, - 0, -4, 0, 0, 0, 0, 0, 4, - 0, 0, -6, 0, -6, -4, -7, 0, - 0, 0, 0, 0, 0, 0, 5, 0, - -5, 0, 0, 0, 0, -6, -9, 0, - -11, 0, 17, -4, 2, -18, 0, 0, - 16, -29, -30, -24, -12, 6, 0, -5, - -37, -10, 0, -10, 0, -12, 9, -10, - -37, 0, -16, 0, 0, 3, -2, 5, - -4, 0, 6, 1, -17, -22, 0, -29, - -14, -12, -14, -17, -7, -16, -1, -11, - -16, 3, 0, 2, 0, -6, 0, 0, - 0, 4, 0, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -6, - 0, -3, 0, -2, -6, 0, -10, -13, - -13, -2, 0, -17, 0, 0, 0, 0, - 0, 0, -5, 0, 0, 0, 0, 2, - -3, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 28, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -10, 0, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, 0, 0, - -11, 0, 0, 0, 0, -29, -17, 0, - 0, 0, -9, -29, 0, 0, -6, 6, - 0, -16, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -9, 0, 0, -11, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, -10, 0, - 0, 0, 0, 7, 0, 4, -12, -12, - 0, -6, -6, -7, 0, 0, 0, 0, - 0, 0, -17, 0, -6, 0, -9, -6, - 0, -13, -14, -17, -5, 0, -12, 0, - -17, 0, 0, 0, 0, 46, 0, 0, - 3, 0, 0, -7, 0, 6, 0, -25, - 0, 0, 0, 0, 0, -54, -10, 19, - 17, -5, -24, 0, 6, -9, 0, -29, - -3, -7, 6, -40, -6, 7, 0, 9, - -20, -9, -21, -19, -24, 0, 0, -35, - 0, 33, 0, 0, -3, 0, 0, 0, - -3, -3, -6, -16, -19, -1, -54, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -6, 0, -3, -6, -9, 0, 0, - -12, 0, -6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, 0, -12, 0, 0, 12, - -2, 7, 0, -13, 6, -4, -2, -15, - -6, 0, -7, -6, -4, 0, -9, -10, - 0, 0, -5, -2, -4, -10, -7, 0, - 0, -6, 0, 6, -4, 0, -13, 0, - 0, 0, -12, 0, -10, 0, -10, -10, - 6, 0, 0, 0, 0, 0, 0, 0, - 0, -12, 6, 0, -8, 0, -4, -7, - -18, -4, -4, -4, -2, -4, -7, -2, - 0, 0, 0, 0, 0, -6, -5, -5, - 0, 0, 0, 0, 7, -4, 0, -4, - 0, 0, 0, -4, -7, -4, -5, -7, - -5, 0, 5, 23, -2, 0, -16, 0, - -4, 12, 0, -6, -24, -7, 9, 1, - 0, -27, -10, 6, -10, 4, 0, -4, - -5, -18, 0, -9, 3, 0, 0, -10, - 0, 0, 0, 6, 6, -12, -11, 0, - -10, -6, -9, -6, -6, 0, -10, 3, - -11, -10, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -10, 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, - -4, 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, -5, -6, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -9, 0, 0, -7, - 0, 0, -6, -6, 0, 0, 0, 0, - -6, 0, 0, 0, 0, -3, 0, 0, - 0, 0, 0, -4, 0, 0, 0, 0, - -9, 0, -12, 0, 0, 0, -19, 0, - 4, -13, 12, 1, -4, -27, 0, 0, - -13, -6, 0, -23, -14, -16, 0, 0, - -25, -6, -23, -22, -28, 0, -15, 0, - 5, 39, -7, 0, -13, -6, -2, -6, - -10, -16, -10, -21, -24, -13, -6, 0, - 0, -4, 0, 2, 0, 0, -40, -5, - 17, 13, -13, -21, 0, 2, -18, 0, - -29, -4, -6, 12, -53, -7, 2, 0, - 0, -37, -7, -30, -6, -42, 0, 0, - -40, 0, 34, 2, 0, -4, 0, 0, - 0, 0, -3, -4, -22, -4, 0, -37, - 0, 0, 0, 0, -18, 0, -5, 0, - -2, -16, -27, 0, 0, -3, -9, -17, - -6, 0, -4, 0, 0, 0, 0, -26, - -6, -19, -18, -5, -10, -14, -6, -10, - 0, -12, -5, -19, -9, 0, -7, -11, - -6, -11, 0, 3, 0, -4, -19, 0, - 12, 0, -10, 0, 0, 0, 0, 7, - 0, 4, -12, 24, 0, -6, -6, -7, - 0, 0, 0, 0, 0, 0, -17, 0, - -6, 0, -9, -6, 0, -13, -14, -17, - -5, 0, -12, 5, 23, 0, 0, 0, - 0, 46, 0, 0, 3, 0, 0, -7, - 0, 6, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -4, -12, 0, 0, 0, 0, 0, -3, - 0, 0, 0, -6, -6, 0, 0, -12, - -6, 0, 0, -12, 0, 10, -3, 0, - 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 9, 12, 5, -5, 0, -18, - -9, 0, 17, -19, -18, -12, -12, 23, - 10, 6, -50, -4, 12, -6, 0, -6, - 6, -6, -20, 0, -6, 6, -7, -5, - -17, -5, 0, 0, 17, 12, 0, -16, - 0, -32, -7, 17, -7, -22, 2, -7, - -19, -19, -6, 23, 6, 0, -9, 0, - -16, 0, 5, 19, -13, -21, -23, -14, - 17, 0, 2, -42, -5, 6, -10, -4, - -13, 0, -13, -21, -9, -9, -5, 0, - 0, -13, -12, -6, 0, 17, 13, -6, - -32, 0, -32, -8, 0, -20, -33, -2, - -18, -10, -19, -16, 16, 0, 0, -7, - 0, -12, -5, 0, -6, -10, 0, 10, - -19, 6, 0, 0, -31, 0, -6, -13, - -10, -4, -17, -14, -19, -13, 0, -17, - -6, -13, -11, -17, -6, 0, 0, 2, - 27, -10, 0, -17, -6, 0, -6, -12, - -13, -16, -16, -22, -7, -12, 12, 0, - -9, 0, -29, -7, 3, 12, -18, -21, - -12, -19, 19, -6, 3, -54, -10, 12, - -13, -10, -21, 0, -17, -24, -7, -6, - -5, -6, -12, -17, -2, 0, 0, 17, - 16, -4, -37, 0, -35, -13, 14, -22, - -39, -12, -20, -24, -29, -19, 12, 0, - 0, 0, 0, -7, 0, 0, 6, -7, - 12, 4, -11, 12, 0, 0, -18, -2, - 0, -2, 0, 2, 2, -5, 0, 0, - 0, 0, 0, 0, -6, 0, 0, 0, - 0, 5, 17, 1, 0, -7, 0, 0, - 0, 0, -4, -4, -7, 0, 0, 0, - 2, 5, 0, 0, 0, 0, 5, 0, - -5, 0, 22, 0, 10, 2, 2, -7, - 0, 12, 0, 0, 0, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 0, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -35, 0, -6, 10, 0, 17, - 0, 0, 57, 7, -12, -12, 6, 6, - -4, 2, -29, 0, 0, 28, -35, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -39, 22, 81, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -35, 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, -9, 0, 0, -11, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, -16, 0, - 0, 2, 0, 0, 6, 74, -12, -5, - 18, 16, -16, 6, 0, 0, 6, 6, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -75, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -16, - 0, 0, 0, -16, 0, 0, 0, 0, - -13, -3, 0, 0, 0, -13, 0, -7, - 0, -27, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -39, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, -6, 0, 0, -11, 0, -9, 0, - -16, 0, 0, 0, -10, 6, -7, 0, - 0, -16, -6, -13, 0, 0, -16, 0, - -6, 0, -27, 0, -6, 0, 0, -47, - -11, -23, -6, -21, 0, 0, -39, 0, - -16, -3, 0, 0, 0, 0, 0, 0, - 0, 0, -9, -10, -5, -10, 0, 0, - 0, 0, -13, 0, -13, 7, -6, 12, - 0, -4, -13, -4, -10, -11, 0, -7, - -3, -4, 4, -16, -2, 0, 0, 0, - -51, -5, -8, 0, -13, 0, -4, -27, - -5, 0, 0, -4, -5, 0, 0, 0, - 0, 4, 0, -4, -10, -4, 10, 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, 7, 0, 0, 0, 0, 0, - 0, -13, 0, -4, 0, 0, 0, -12, - 6, 0, 0, 0, -16, -6, -12, 0, - 0, -16, 0, -6, 0, -27, 0, 0, - 0, 0, -56, 0, -12, -21, -29, 0, - 0, -39, 0, -4, -9, 0, 0, 0, - 0, 0, 0, 0, 0, -6, -9, -3, - -9, 2, 0, 0, 10, -7, 0, 18, - 28, -6, -6, -17, 7, 28, 10, 13, - -16, 7, 24, 7, 17, 13, 16, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 36, 27, -10, -6, 0, -5, - 46, 25, 46, 0, 0, 0, 6, 0, - 0, 21, 0, 0, -9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -4, 0, - 0, 0, 0, 0, 0, 0, 0, 8, - 0, 0, 0, 0, -48, -7, -5, -24, - -28, 0, 0, -39, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, -48, -7, -5, - -24, -28, 0, 0, -23, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -5, 0, 0, 0, -13, 6, 0, -6, - 5, 10, 6, -17, 0, -1, -5, 6, - 0, 5, 0, 0, 0, 0, -14, 0, - -5, -4, -12, 0, -5, -23, 0, 36, - -6, 0, -13, -4, 0, -4, -10, 0, - -6, -16, -12, -7, 0, 0, 0, -9, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -4, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, -48, - -7, -5, -24, -28, 0, 0, -39, 0, - 0, 0, 0, 0, 0, 29, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -9, 0, -18, -7, -5, 17, -5, -6, - -23, 2, -3, 2, -4, -16, 1, 13, - 1, 5, 2, 5, -14, -23, -7, 0, - -22, -11, -16, -24, -22, 0, -9, -12, - -7, -7, -5, -4, -7, -4, 0, -4, - -2, 9, 0, 9, -4, 0, 18, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -4, -6, -6, 0, 0, - -16, 0, -3, 0, -10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -35, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, -6, 0, -7, - 0, 0, 0, 0, -5, 0, 0, -10, - -6, 6, 0, -10, -11, -4, 0, -17, - -4, -13, -4, -7, 0, -10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -39, 0, 18, 0, 0, -10, 0, - 0, 0, 0, -7, 0, -6, 0, 0, - -3, 0, 0, -4, 0, -13, 0, 0, - 24, -7, -19, -18, 4, 6, 6, -1, - -16, 4, 9, 4, 17, 4, 19, -4, - -16, 0, 0, -23, 0, 0, -17, -16, - 0, 0, -12, 0, -7, -10, 0, -9, - 0, -9, 0, -4, 9, 0, -5, -17, - -6, 21, 0, 0, -5, 0, -12, 0, - 0, 7, -13, 0, 6, -6, 5, 1, - 0, -19, 0, -4, -2, 0, -6, 6, - -5, 0, 0, 0, -24, -7, -13, 0, - -17, 0, 0, -27, 0, 21, -6, 0, - -10, 0, 3, 0, -6, 0, -6, -17, - 0, -6, 6, 0, 0, 0, 0, -4, - 0, 0, 6, -7, 2, 0, 0, -7, - -4, 0, -7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -36, 0, 13, 0, - 0, -5, 0, 0, 0, 0, 1, 0, - -6, -6, 0, 0, 0, 12, 0, 13, - 0, 0, 0, 0, 0, -36, -33, 2, - 25, 17, 10, -23, 4, 24, 0, 21, - 0, 12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 31, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_36 = { -#else -lv_font_t lv_font_montserrat_36 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 40, /*The maximum line height required by the font*/ - .base_line = 7, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -3, - .underline_thickness = 2, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_36*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_38.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_38.c deleted file mode 100644 index 992b5c6..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_38.c +++ /dev/null @@ -1,8400 +0,0 @@ -/******************************************************************************* - * Size: 38 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 38 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_38.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_38 - #define LV_FONT_MONTSERRAT_38 1 -#endif - -#if LV_FONT_MONTSERRAT_38 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, - 0xf2, 0xe, 0xff, 0xf1, 0xd, 0xff, 0xf1, 0xd, - 0xff, 0xf0, 0xc, 0xff, 0xf0, 0xc, 0xff, 0xf0, - 0xb, 0xff, 0xe0, 0xa, 0xff, 0xe0, 0xa, 0xff, - 0xd0, 0x9, 0xff, 0xc0, 0x9, 0xff, 0xc0, 0x8, - 0xff, 0xb0, 0x7, 0xff, 0xa0, 0x7, 0xff, 0xa0, - 0x6, 0xff, 0x90, 0x5, 0xee, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xab, 0x50, 0x1f, 0xff, 0xf3, 0x5f, 0xff, 0xf8, - 0x2f, 0xff, 0xf5, 0x6, 0xee, 0x80, - - /* U+0022 "\"" */ - 0x9f, 0xf9, 0x0, 0xb, 0xff, 0x79, 0xff, 0x80, - 0x0, 0xbf, 0xf6, 0x8f, 0xf8, 0x0, 0xa, 0xff, - 0x68, 0xff, 0x70, 0x0, 0xaf, 0xf6, 0x8f, 0xf7, - 0x0, 0xa, 0xff, 0x57, 0xff, 0x70, 0x0, 0x9f, - 0xf5, 0x7f, 0xf6, 0x0, 0x9, 0xff, 0x47, 0xff, - 0x60, 0x0, 0x9f, 0xf4, 0x6f, 0xf5, 0x0, 0x8, - 0xff, 0x36, 0xff, 0x50, 0x0, 0x8f, 0xf3, 0x1, - 0x10, 0x0, 0x0, 0x11, 0x0, - - /* U+0023 "#" */ - 0x0, 0x0, 0x0, 0x5, 0xff, 0x50, 0x0, 0x0, - 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x10, 0x0, - 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0xef, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfd, 0x0, - 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xa0, 0x0, 0x0, 0x2, 0xff, - 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x8, 0xbb, 0xbb, 0xdf, - 0xfc, 0xbb, 0xbb, 0xbb, 0xef, 0xfb, 0xbb, 0xbb, - 0x70, 0x0, 0x0, 0x8, 0xff, 0x20, 0x0, 0x0, - 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf0, 0x0, 0x0, 0x0, 0xdf, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x0, 0x0, - 0x0, 0xe, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, - 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, - 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x0, 0x0, - 0xbb, 0xbb, 0xbd, 0xff, 0xcb, 0xbb, 0xbb, 0xbd, - 0xff, 0xcb, 0xbb, 0xb5, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0xcf, 0xe0, 0x0, 0x0, 0x0, 0xef, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, 0x0, 0x0, - 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xa0, 0x0, 0x0, 0x2, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, 0x0, - 0x0, 0x0, 0x4f, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x60, 0x0, 0x0, 0x6, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, - 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x20, 0x0, 0x0, 0xa, - 0xff, 0x10, 0x0, 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xfe, 0xc9, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x9f, 0xff, 0xfb, 0x66, 0xff, 0x65, 0x8b, - 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0x40, 0x3, - 0xff, 0x30, 0x0, 0x18, 0xe0, 0x0, 0x8, 0xff, - 0xf5, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf0, 0x0, 0x3, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, - 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf4, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xfe, 0x30, 0x3, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xfb, 0x54, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x57, 0xdf, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x4, 0xef, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0x30, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x30, 0x0, 0xc, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, - 0xc, 0xff, 0xf0, 0x4, 0x90, 0x0, 0x0, 0x3, - 0xff, 0x30, 0x0, 0x1f, 0xff, 0xc0, 0xc, 0xfd, - 0x60, 0x0, 0x3, 0xff, 0x30, 0x1, 0xcf, 0xff, - 0x70, 0x3f, 0xff, 0xfe, 0xa6, 0x45, 0xff, 0x55, - 0x9f, 0xff, 0xfd, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x10, 0x0, 0x0, 0x0, 0x15, 0xac, 0xef, 0xff, - 0xfe, 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x88, 0x10, - 0x0, 0x0, 0x0, 0x0, - - /* U+0025 "%" */ - 0x0, 0x2, 0xae, 0xfe, 0xb4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, - 0xc4, 0x24, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xfc, 0x0, 0x0, 0x0, 0xd, 0xfd, 0x0, - 0x0, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0xcf, - 0xf2, 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x0, 0x0, - 0x1, 0xff, 0x60, 0x0, 0x0, 0x8, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, - 0xdf, 0x90, 0x0, 0x0, 0x3f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xe0, 0x0, 0x0, 0x0, 0xbf, - 0xb0, 0x0, 0x0, 0xdf, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xb0, - 0x0, 0x9, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf0, 0x0, 0x0, 0x0, 0xdf, 0x90, 0x0, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf5, 0x0, 0x0, 0x2, 0xff, 0x60, 0x1, 0xef, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfd, - 0x0, 0x0, 0xa, 0xff, 0x10, 0xb, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc5, - 0x24, 0xbf, 0xf7, 0x0, 0x6f, 0xf8, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0x90, 0x2, 0xff, 0xc0, 0x0, 0x6d, 0xff, - 0xfc, 0x50, 0x0, 0x0, 0x3, 0xae, 0xfe, 0xb4, - 0x0, 0xc, 0xff, 0x20, 0xa, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf6, 0x0, 0x8f, 0xf9, 0x20, 0x2b, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xb0, 0x1, 0xff, 0x90, 0x0, 0x0, 0xcf, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x10, - 0x6, 0xff, 0x10, 0x0, 0x0, 0x4f, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf5, 0x0, 0x9, - 0xfd, 0x0, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0xb, 0xfb, - 0x0, 0x0, 0x0, 0xe, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xfe, 0x0, 0x0, 0xa, 0xfb, 0x0, - 0x0, 0x0, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xf3, 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, - 0x0, 0xf, 0xf7, 0x0, 0x0, 0x0, 0x6, 0xff, - 0x80, 0x0, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, - 0x3f, 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0xbf, - 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xf7, 0x0, 0x1a, 0xff, 0x40, - 0x0, 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfe, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4b, 0xef, 0xea, 0x30, 0x0, - - /* U+0026 "&" */ - 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, - 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfe, 0xba, 0xcf, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xf7, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, - 0x0, 0x8f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf7, 0x0, - 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x4f, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0x90, 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x83, 0xcf, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfc, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfd, 0xcf, - 0xff, 0xa0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xf7, 0x0, 0xbf, 0xff, 0xb0, 0x0, - 0x0, 0xef, 0xb1, 0x0, 0x1e, 0xff, 0xe3, 0x0, - 0x0, 0xaf, 0xff, 0xc0, 0x0, 0x3f, 0xfe, 0x0, - 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xc1, 0x8, 0xff, 0xa0, 0x0, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd2, 0xff, 0xf5, - 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xfd, 0x0, 0x4, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0x50, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0xdf, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xf3, 0x0, 0x4, 0xff, 0xff, 0xc6, 0x20, - 0x1, 0x37, 0xef, 0xff, 0xef, 0xff, 0xf4, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x4f, 0xff, 0xf3, 0x0, 0x3, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x3f, 0xfc, - 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, 0x84, - 0x0, 0x0, 0x0, 0x3d, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0027 "'" */ - 0x9f, 0xf9, 0x9f, 0xf8, 0x8f, 0xf8, 0x8f, 0xf7, - 0x8f, 0xf7, 0x7f, 0xf7, 0x7f, 0xf6, 0x7f, 0xf6, - 0x6f, 0xf5, 0x6f, 0xf5, 0x1, 0x10, - - /* U+0028 "(" */ - 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, 0xb, 0xff, - 0xc0, 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0xbf, - 0xfd, 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x7, - 0xff, 0xf1, 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x0, - 0x1f, 0xff, 0x70, 0x0, 0x5, 0xff, 0xf3, 0x0, - 0x0, 0x9f, 0xff, 0x0, 0x0, 0xc, 0xff, 0xc0, - 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, 0x1f, 0xff, - 0x70, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x4f, - 0xff, 0x40, 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, - 0x5f, 0xff, 0x30, 0x0, 0x6, 0xff, 0xf3, 0x0, - 0x0, 0x5f, 0xff, 0x30, 0x0, 0x5, 0xff, 0xf3, - 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x3, 0xff, - 0xf6, 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x0, - 0xff, 0xf9, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, - 0x0, 0x9f, 0xff, 0x0, 0x0, 0x5, 0xff, 0xf3, - 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x0, 0xcf, - 0xfb, 0x0, 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, - 0x1f, 0xff, 0x70, 0x0, 0x0, 0xbf, 0xfd, 0x0, - 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0xb, 0xff, - 0xc0, 0x0, 0x0, 0x2f, 0xff, 0x50, - - /* U+0029 ")" */ - 0x8f, 0xfe, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, - 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, 0x1f, 0xff, - 0x80, 0x0, 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x4, - 0xff, 0xf5, 0x0, 0x0, 0xe, 0xff, 0xa0, 0x0, - 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x5, 0xff, 0xf3, - 0x0, 0x0, 0x2f, 0xff, 0x60, 0x0, 0x0, 0xff, - 0xf9, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, - 0xaf, 0xfe, 0x0, 0x0, 0x8, 0xff, 0xf0, 0x0, - 0x0, 0x7f, 0xff, 0x10, 0x0, 0x6, 0xff, 0xf2, - 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x5, 0xff, - 0xf3, 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x6, - 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0x10, 0x0, - 0x8, 0xff, 0xf0, 0x0, 0x0, 0xaf, 0xfe, 0x0, - 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xf9, - 0x0, 0x0, 0x2f, 0xff, 0x60, 0x0, 0x5, 0xff, - 0xf2, 0x0, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0xe, - 0xff, 0xa0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, - 0x9f, 0xfe, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, - 0x7, 0xff, 0xf1, 0x0, 0x0, 0xef, 0xf8, 0x0, - 0x0, 0x8f, 0xfe, 0x0, 0x0, 0x0, - - /* U+002A "*" */ - 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, 0x2, - 0x40, 0x0, 0x8f, 0xb0, 0x0, 0x24, 0x0, 0xbf, - 0xa2, 0x8, 0xfb, 0x1, 0x9f, 0xe0, 0x1e, 0xff, - 0xf8, 0x8f, 0xb6, 0xef, 0xff, 0x30, 0x7, 0xef, - 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x1, 0x8f, - 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x19, 0xff, - 0xff, 0xfb, 0x30, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xa1, 0x1, 0xef, 0xfe, 0x78, 0xfb, - 0x5d, 0xff, 0xf3, 0xa, 0xf9, 0x10, 0x8f, 0xb0, - 0x7, 0xfd, 0x0, 0x12, 0x0, 0x8, 0xfb, 0x0, - 0x1, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x0, - 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x3, 0x66, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, - 0x0, - - /* U+002C "," */ - 0x0, 0x35, 0x20, 0x9, 0xff, 0xf4, 0x1f, 0xff, - 0xfb, 0x1f, 0xff, 0xfc, 0xb, 0xff, 0xf9, 0x0, - 0xcf, 0xf4, 0x0, 0xdf, 0xe0, 0x1, 0xff, 0x90, - 0x5, 0xff, 0x40, 0x9, 0xfe, 0x0, 0xd, 0xf9, - 0x0, - - /* U+002D "-" */ - 0x11, 0x11, 0x11, 0x11, 0x11, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0x6d, 0xff, 0xff, 0xff, 0xff, 0xf6, - - /* U+002E "." */ - 0x0, 0x0, 0x0, 0x5, 0xef, 0xc1, 0x1f, 0xff, - 0xfa, 0x3f, 0xff, 0xfc, 0xe, 0xff, 0xf9, 0x3, - 0xdf, 0xa0, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x0, 0x0, 0x2, 0x8c, 0xef, 0xfd, 0xa4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xb7, - 0x56, 0x9e, 0xff, 0xff, 0x70, 0x0, 0x0, 0xd, - 0xff, 0xfc, 0x20, 0x0, 0x0, 0x9, 0xff, 0xff, - 0x30, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf4, - 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xa0, 0xa, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, - 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf3, 0xf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x51, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf7, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0x72, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xf7, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x70, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, - 0xd, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x30, 0xaf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf0, 0x5, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfa, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x7f, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xd0, 0x0, 0x0, 0xdf, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xfb, 0x75, 0x69, 0xef, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, 0xda, 0x50, - 0x0, 0x0, 0x0, - - /* U+0031 "1" */ - 0xbf, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x12, 0x44, 0x44, 0x4c, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, - 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, - 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, - 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, - 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, - - /* U+0032 "2" */ - 0x0, 0x0, 0x4, 0x8c, 0xef, 0xfe, 0xd9, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe5, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1, - 0xdf, 0xff, 0xfe, 0x97, 0x55, 0x7a, 0xff, 0xff, - 0xf5, 0x0, 0x1b, 0xff, 0xd4, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xd0, 0x0, 0x9, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x20, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, - - /* U+0033 "3" */ - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5b, 0xbb, 0xdf, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xdf, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xe0, 0x6, 0xa1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfa, 0x1, 0xef, 0xe7, 0x10, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x30, 0x9f, - 0xff, 0xff, 0xc8, 0x75, 0x56, 0xae, 0xff, 0xff, - 0x90, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x5b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, - 0x2, 0x6a, 0xde, 0xff, 0xec, 0x95, 0x0, 0x0, - 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x5, - 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xc0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xa, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xe0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x13, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x3d, 0xff, 0xe3, 0x33, 0x33, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, - - /* U+0035 "5" */ - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x6f, 0xff, 0x54, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xc9, - 0x61, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x1, 0x44, 0x44, 0x44, 0x45, 0x79, 0xdf, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf5, 0x1, 0xd5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x10, 0x9f, 0xfb, 0x40, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xa0, 0x2f, - 0xff, 0xff, 0xea, 0x76, 0x56, 0x8c, 0xff, 0xff, - 0xe1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x18, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, - 0x0, 0x48, 0xbd, 0xef, 0xfd, 0xb7, 0x20, 0x0, - 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xfd, - 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0xa6, 0x43, - 0x45, 0x8d, 0xe1, 0x0, 0x0, 0x9, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x3f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x5a, 0xdf, 0xfe, 0xc8, 0x30, 0x0, - 0x0, 0x1f, 0xff, 0xb0, 0x5e, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x20, 0x0, 0x2f, 0xff, 0xa8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x2f, - 0xff, 0xef, 0xff, 0xb5, 0x10, 0x3, 0x7e, 0xff, - 0xfe, 0x10, 0x1f, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x1, 0xbf, 0xff, 0xa0, 0xf, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, - 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf4, 0xb, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x7, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf6, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf0, 0x0, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0x80, 0x0, 0x6, 0xff, 0xff, 0xb5, 0x21, - 0x13, 0x7e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, - 0xef, 0xfe, 0xb7, 0x10, 0x0, 0x0, - - /* U+0037 "7" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, - 0xff, 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6f, - 0xff, 0xc0, 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf4, 0xd, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, 0xdf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x60, 0xc, 0xee, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0038 "8" */ - 0x0, 0x0, 0x0, 0x48, 0xcd, 0xff, 0xed, 0xa5, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x62, 0x10, 0x14, - 0x9f, 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x50, 0x3, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xa0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xd0, 0x4, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, - 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x90, 0x0, 0xbf, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0x20, 0x0, 0x2e, - 0xff, 0xfc, 0x52, 0x0, 0x13, 0x8f, 0xff, 0xf7, - 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, - 0x1b, 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, - 0xe5, 0x0, 0x1, 0xdf, 0xff, 0xe7, 0x20, 0x0, - 0x0, 0x4b, 0xff, 0xff, 0x50, 0x9, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, - 0xf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf7, 0x3f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x4f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xfc, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfb, 0xf, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, 0xa, - 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf1, 0x1, 0xef, 0xff, 0xfa, 0x52, 0x10, - 0x13, 0x7d, 0xff, 0xff, 0x70, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x40, 0x0, 0x0, 0x0, 0x1, 0x59, 0xcd, - 0xff, 0xed, 0xb7, 0x20, 0x0, 0x0, - - /* U+0039 "9" */ - 0x0, 0x0, 0x4, 0x9c, 0xef, 0xed, 0xa5, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x8f, 0xff, 0xfa, 0x41, 0x1, 0x37, 0xdf, 0xff, - 0xc0, 0x0, 0x3f, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x80, 0x9, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0xdf, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf8, 0xe, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xe0, 0xef, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x2b, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf5, 0x5f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0x70, 0xcf, 0xff, 0xf9, 0x41, - 0x0, 0x27, 0xdf, 0xff, 0xff, 0xf8, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xff, - 0x90, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x13, 0xff, 0xf9, 0x0, 0x0, 0x27, 0xbe, 0xff, - 0xec, 0x83, 0x0, 0x4f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xb0, 0x0, 0x1, 0x20, 0x0, - 0x0, 0x0, 0x4, 0xdf, 0xff, 0xe1, 0x0, 0x0, - 0x9f, 0xc7, 0x43, 0x45, 0x8d, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd3, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x59, 0xce, 0xff, 0xec, 0x95, 0x0, 0x0, 0x0, - 0x0, - - /* U+003A ":" */ - 0x3, 0xdf, 0xa0, 0xe, 0xff, 0xf9, 0x3f, 0xff, - 0xfc, 0x1f, 0xff, 0xf9, 0x5, 0xef, 0xc1, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xc1, - 0x1f, 0xff, 0xfa, 0x3f, 0xff, 0xfc, 0xe, 0xff, - 0xf9, 0x3, 0xdf, 0xa0, - - /* U+003B ";" */ - 0x3, 0xdf, 0xa0, 0xe, 0xff, 0xf9, 0x3f, 0xff, - 0xfc, 0x1f, 0xff, 0xf9, 0x5, 0xef, 0xc1, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xa1, - 0xe, 0xff, 0xf9, 0x2f, 0xff, 0xfc, 0xe, 0xff, - 0xfb, 0x4, 0xef, 0xf6, 0x0, 0xbf, 0xf1, 0x0, - 0xff, 0xc0, 0x3, 0xff, 0x60, 0x8, 0xff, 0x10, - 0xc, 0xfb, 0x0, 0x6, 0x63, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x28, 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5b, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x9e, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x6, - 0xcf, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, 0x39, - 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x1, 0x7d, - 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xf9, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xfc, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, - 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, - 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x9f, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+003D "=" */ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, - - /* U+003E ">" */ - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7e, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xc6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf9, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0xff, - 0xfd, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, - 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x16, 0xcf, 0xff, 0xff, 0xd7, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, - 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x39, 0xef, - 0xff, 0xff, 0xb5, 0x0, 0x0, 0x1, 0x7d, 0xff, - 0xff, 0xfd, 0x71, 0x0, 0x0, 0x5, 0xbf, 0xff, - 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7c, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, 0xda, 0x50, - 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x60, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x2d, 0xff, - 0xff, 0xb7, 0x43, 0x34, 0x8e, 0xff, 0xff, 0x60, - 0x3e, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xd0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xaa, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xb9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfc, - 0x20, 0x0, 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x9c, - 0xee, 0xff, 0xed, 0xa8, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5e, 0xff, 0xff, 0xec, 0x98, 0x78, 0x8a, - 0xdf, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xbf, 0xff, 0xe8, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x15, 0xbf, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x49, 0xcd, - 0xdb, 0x83, 0x0, 0x1e, 0xee, 0x22, 0xef, 0xf5, - 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x3, - 0xcf, 0xff, 0xff, 0xff, 0xfb, 0x22, 0xff, 0xf3, - 0x2, 0xff, 0xe1, 0x0, 0x0, 0x3f, 0xfe, 0x10, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x4f, 0xff, 0x30, 0x5, 0xff, 0x90, 0x0, 0xb, - 0xff, 0x50, 0x0, 0x4, 0xff, 0xff, 0xa4, 0x10, - 0x25, 0xbf, 0xff, 0xff, 0xf3, 0x0, 0xb, 0xff, - 0x20, 0x1, 0xff, 0xd0, 0x0, 0x0, 0xef, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, - 0x0, 0x3f, 0xf8, 0x0, 0x7f, 0xf6, 0x0, 0x0, - 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xf3, 0x0, 0x0, 0xdf, 0xd0, 0xb, 0xff, - 0x10, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x8, 0xff, - 0x10, 0xef, 0xe0, 0x0, 0x1, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, - 0x0, 0x5f, 0xf4, 0xf, 0xfb, 0x0, 0x0, 0x4f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x30, 0x0, 0x3, 0xff, 0x51, 0xff, 0xa0, - 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf3, 0x0, 0x0, 0x2f, 0xf6, - 0x2f, 0xf9, 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, - 0x2, 0xff, 0x71, 0xff, 0xa0, 0x0, 0x4, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf3, 0x0, 0x0, 0x2f, 0xf6, 0xf, 0xfb, 0x0, - 0x0, 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x30, 0x0, 0x4, 0xff, 0x40, - 0xef, 0xe0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, - 0x7f, 0xf2, 0xb, 0xff, 0x20, 0x0, 0x7, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x30, 0x0, 0xb, 0xfe, 0x0, 0x7f, 0xf7, 0x0, - 0x0, 0x1e, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xf5, 0x0, 0x2, 0xff, 0x90, 0x1, - 0xff, 0xd0, 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x20, - 0x0, 0x29, 0xff, 0xed, 0xff, 0xd1, 0x2, 0xdf, - 0xf2, 0x0, 0xa, 0xff, 0x50, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xed, 0xff, 0xff, 0xf3, 0x7f, 0xff, - 0xfd, 0xff, 0xf8, 0x0, 0x0, 0x3f, 0xfe, 0x10, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xff, - 0xda, 0x40, 0x0, 0x0, 0x8d, 0xfe, 0xb5, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xe8, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x27, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, - 0xff, 0xff, 0xec, 0x98, 0x88, 0x9b, 0xef, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x9c, - 0xef, 0xff, 0xec, 0x96, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x7b, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, - 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0xcf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x10, 0x5, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x90, 0x0, 0xd, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf2, 0x0, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, - 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, - 0x7, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xd0, 0x0, 0x0, 0x7, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, - 0x0, 0x0, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x0, 0x0, - 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf3, 0x0, 0xd, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xb0, 0x5, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x20, 0xcf, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xfa, - - /* U+0042 "B" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, - 0xa6, 0x10, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x1, 0x26, 0xcf, 0xff, 0xf9, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x10, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x60, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x20, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x25, - 0xbf, 0xff, 0xe2, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x5b, 0xff, 0xff, 0x70, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf8, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfa, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x5a, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x91, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xca, 0x61, 0x0, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xde, 0xff, - 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xfd, 0x97, 0x55, 0x79, - 0xef, 0xff, 0xff, 0x60, 0x0, 0x1, 0xdf, 0xff, - 0xfb, 0x30, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, - 0x80, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, 0x0, 0x7f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, 0xc, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf7, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x30, 0x0, - 0x0, 0x0, 0x4, 0xcf, 0xff, 0x80, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xfd, 0x96, 0x55, 0x79, 0xef, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x6a, 0xde, 0xff, 0xec, 0x95, 0x0, - 0x0, 0x0, - - /* U+0044 "D" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, - 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0xff, 0xfd, 0x44, 0x44, 0x44, 0x44, 0x57, - 0xbf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, - 0xff, 0xf6, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xf3, - 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x60, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf1, 0xf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x50, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf7, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x80, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf8, 0xf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0x70, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xc0, 0xf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, - 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x30, 0x0, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0x70, - 0x0, 0xf, 0xff, 0xd4, 0x44, 0x44, 0x44, 0x45, - 0x7b, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x40, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+0045 "E" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0xff, 0xfd, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x30, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0xf, 0xff, 0xd2, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, - - /* U+0046 "F" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, - 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, - 0xd3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xce, 0xff, - 0xed, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xfe, 0x97, 0x55, 0x78, - 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x1, 0xdf, 0xff, - 0xfb, 0x40, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, - 0xb0, 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdb, 0x0, 0x0, 0x6f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, - 0x20, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x1f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf1, 0xe, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, - 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf1, 0x5, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf1, 0x0, 0xef, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, - 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf1, 0x0, 0xb, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf1, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x40, 0x0, - 0x0, 0x0, 0x1, 0x7e, 0xff, 0xf1, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xfe, 0x97, 0x55, 0x68, 0xbf, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, - 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x6a, 0xce, 0xff, 0xec, 0x96, 0x10, - 0x0, 0x0, - - /* U+0048 "H" */ - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xf, 0xff, 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - - /* U+0049 "I" */ - 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, - 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, - 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, - 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, - 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, - 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, - 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, - 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, - 0xfc, - - /* U+004A "J" */ - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf9, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x50, 0xaf, 0xf9, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf1, 0x1e, 0xff, 0xfe, 0x85, 0x35, - 0xaf, 0xff, 0xf9, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x3, 0x8c, - 0xef, 0xed, 0x93, 0x0, 0x0, - - /* U+004B "K" */ - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xe2, 0x0, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe2, - 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xe3, 0x0, 0x0, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfc, 0x0, 0x0, 0x4f, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, - 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x3f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xfc, 0x3f, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xef, 0xff, 0xfb, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf9, - 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0xa, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf3, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe1, - 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xc0, - - /* U+004C "L" */ - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd4, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, - - /* U+004D "M" */ - 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, 0xf, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf4, 0xf, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xf4, 0xf, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xf4, 0xf, 0xff, 0xcf, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, 0xff, 0xf4, - 0xf, 0xff, 0xa8, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xb6, 0xff, 0xf4, 0xf, - 0xff, 0xa0, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x26, 0xff, 0xf4, 0xf, 0xff, - 0xa0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf8, 0x6, 0xff, 0xf4, 0xf, 0xff, 0xa0, - 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xd0, 0x6, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x2, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x40, - 0x6, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x7f, - 0xff, 0x40, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x6, - 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0xd, 0xff, - 0xd0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x5, 0xff, - 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x4, 0xff, 0xf8, - 0x0, 0x2f, 0xff, 0x70, 0x0, 0x5, 0xff, 0xf4, - 0xf, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, 0x20, - 0xbf, 0xfd, 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, - 0xff, 0xa0, 0x0, 0x0, 0x1f, 0xff, 0xb5, 0xff, - 0xf4, 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, 0xff, - 0xa0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x5, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xcd, 0x30, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, - 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, - - /* U+004E "N" */ - 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc7, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0xaf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0xc, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x1, 0xef, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xff, 0x60, - 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0xb, 0xff, 0xfe, - 0x10, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xfa, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf5, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, - - /* U+004F "O" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xce, 0xff, - 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xfd, 0x96, 0x55, 0x69, 0xdf, 0xff, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xfb, 0x30, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, - 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfd, 0x0, - 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x40, 0xb, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0xe, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xd0, 0x1f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf0, 0x2f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf0, 0x2f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xf0, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, - 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x5, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0xef, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, 0x6f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf5, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, - 0x30, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xfd, - 0x96, 0x55, 0x69, 0xdf, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x6a, 0xce, 0xff, 0xec, - 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+0050 "P" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xb7, - 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xff, 0xfd, 0x44, 0x44, 0x44, - 0x45, 0x7a, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, - 0xf4, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xc0, 0xf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x10, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf4, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf6, 0xf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf1, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, - 0x40, 0xf, 0xff, 0xd4, 0x44, 0x44, 0x44, 0x57, - 0xaf, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xdb, 0x83, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xce, 0xff, - 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xd9, 0x65, 0x56, 0x9e, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x4, - 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf5, 0x0, 0x0, 0xe, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xd0, 0x0, 0x5, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x40, 0x0, 0xaf, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf9, 0x0, 0xe, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xd0, 0x1, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf0, 0x2, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x10, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, - 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, - 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, - 0x6f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf5, 0x0, 0x1, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, 0x0, 0x8, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0xd, - 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x2a, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xfc, 0x75, 0x33, 0x57, 0xcf, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x49, 0xce, 0xff, 0xff, 0xfe, 0x72, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x1, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x61, 0x0, 0x38, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x7c, 0xef, 0xec, 0x82, 0x0, - 0x0, - - /* U+0052 "R" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xb7, - 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xff, 0xfd, 0x44, 0x44, 0x44, - 0x45, 0x7a, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, - 0xf4, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xc0, 0xf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x10, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf4, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf6, 0xf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf2, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x40, 0xf, 0xff, 0xd2, 0x22, 0x22, 0x22, 0x35, - 0x9e, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe1, - 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xb0, 0x0, 0xf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, - 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0x20, 0xf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, 0x0, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf9, - - /* U+0053 "S" */ - 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xed, 0xb7, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x74, 0x33, 0x45, - 0x9d, 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x29, 0xe0, 0x0, 0x8, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xc8, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x9d, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x15, 0xbf, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf0, 0x5, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0xd, - 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0x60, 0x4f, 0xff, 0xff, 0xd9, 0x54, 0x33, - 0x46, 0xbf, 0xff, 0xfc, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, - 0xff, 0xec, 0x95, 0x0, 0x0, 0x0, - - /* U+0054 "T" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x23, 0x44, 0x44, 0x44, 0x44, 0xcf, - 0xff, 0x44, 0x44, 0x44, 0x44, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0055 "U" */ - 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, - 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, - 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, - 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, - 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, - 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, - 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, - 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf4, 0x2f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, - 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf2, 0xf, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, - 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xc0, 0x7, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x70, - 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x10, 0x0, 0x7f, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xea, 0x75, 0x57, 0xae, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, - 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x9c, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, - - /* U+0056 "V" */ - 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xfd, 0x0, 0x5f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0xef, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xe0, 0x0, 0x7, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xf8, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, - 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, - 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x20, 0x0, 0x0, 0xc, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf9, 0x0, 0x0, 0x4, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, - 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, - 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x9, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf5, 0x1, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xc0, 0x8f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x4e, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0057 "W" */ - 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x64, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf1, 0xe, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x9f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x60, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0xe, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xfc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xfb, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x2f, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x0, - 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xa0, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf0, 0x0, 0x0, 0xd, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x6, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x9f, 0xfe, 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, 0x3, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, - 0xbf, 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, 0x0, 0x0, - 0x4, 0xff, 0xf3, 0x0, 0x6, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xfe, 0x0, - 0x0, 0xf, 0xff, 0x90, 0x0, 0x0, 0x5f, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, - 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0xaf, 0xfe, - 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf1, 0x0, 0x5, 0xff, 0xf3, - 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x1, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x60, 0x0, 0xbf, 0xfd, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xa0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x1f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, 0xb, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf1, 0x6, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf5, 0x1, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x60, 0xcf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xa0, - 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfc, 0x1f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xc, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf9, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf7, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, - - /* U+0058 "X" */ - 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfe, 0x10, 0x0, 0xcf, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf4, 0x0, 0x0, 0x1e, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x80, 0x0, 0x0, - 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x40, 0x0, 0x8, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xe1, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x1, 0xef, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x8c, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xaf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x5, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf2, 0x0, 0x9f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, - 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfa, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, - 0x6, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfe, 0x10, 0x2f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xb0, - - /* U+0059 "Y" */ - 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf6, 0x3, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xc0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, - 0x1e, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, - 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xc0, 0x0, 0x0, 0xef, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, - 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0x10, 0x3f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xa0, 0xdf, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+005A "Z" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x61, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0xef, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, - - /* U+005B "[" */ - 0xf, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xfa, - 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, - 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, - 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, - 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, - 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, - 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, - 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, - 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, - 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, - 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, - 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, - 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, - 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, - 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, - 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, - 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0xf0, - - /* U+005C "\\" */ - 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x30, - - /* U+005D "]" */ - 0x4f, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, - 0xfa, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, - 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, - 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, - 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, - 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, - 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, - 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, - 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, - 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, - 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, - 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, - 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, - 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, - 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, - 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, - 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, - 0x4f, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, - 0xfa, 0x4f, 0xff, 0xff, 0xff, 0xa0, - - /* U+005E "^" */ - 0x0, 0x0, 0x0, 0x4, 0x88, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xa7, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0x31, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfc, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xf6, 0x0, 0x3f, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xe0, 0x0, 0xc, 0xff, 0x10, - 0x0, 0x0, 0x5, 0xff, 0x80, 0x0, 0x5, 0xff, - 0x70, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, - 0xef, 0xe0, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, - 0x0, 0x8f, 0xf5, 0x0, 0x0, 0xaf, 0xf4, 0x0, - 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x1, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x8, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0xe, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf1, - - /* U+005F "_" */ - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, - - /* U+0060 "`" */ - 0x1c, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xfa, 0x0, 0x0, 0x0, - 0x1, 0xbf, 0xfb, 0x0, - - /* U+0061 "a" */ - 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, 0xb7, 0x10, - 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0xe, 0xff, 0xd8, - 0x42, 0x12, 0x5b, 0xff, 0xff, 0x50, 0x0, 0x6c, - 0x30, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x3, 0x67, - 0x89, 0x99, 0x99, 0xaf, 0xff, 0x60, 0x0, 0x6d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x6f, 0xff, 0xe6, 0x20, 0x0, 0x0, 0x3, - 0xff, 0xf6, 0xd, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0x60, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf6, 0xf, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x60, 0xef, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, - 0x9, 0xff, 0xf9, 0x10, 0x0, 0x1, 0x8f, 0xff, - 0xff, 0x60, 0x1d, 0xff, 0xff, 0xb9, 0x9b, 0xff, - 0xfc, 0xff, 0xf6, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x1f, 0xff, 0x60, 0x0, 0x4, 0xad, - 0xff, 0xec, 0x93, 0x0, 0xff, 0xf6, - - /* U+0062 "b" */ - 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x10, 0x4, 0x9d, 0xef, 0xec, 0x72, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x13, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x8f, 0xff, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x84, 0x23, 0x5a, - 0xff, 0xff, 0xe2, 0x0, 0x8f, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfc, 0x0, 0x8f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0x50, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x8f, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, - 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf4, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, 0x8f, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xb0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0x50, 0x8f, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfc, 0x0, - 0x8f, 0xff, 0xff, 0xfe, 0x84, 0x23, 0x5a, 0xff, - 0xff, 0xe2, 0x0, 0x8f, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x8f, 0xff, - 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, - 0x0, 0x8f, 0xff, 0x0, 0x4, 0x9d, 0xff, 0xec, - 0x82, 0x0, 0x0, 0x0, - - /* U+0063 "c" */ - 0x0, 0x0, 0x0, 0x16, 0xbd, 0xff, 0xec, 0x82, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa1, 0x0, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, - 0xff, 0xff, 0xa5, 0x32, 0x48, 0xef, 0xff, 0xd0, - 0x0, 0xcf, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x1a, - 0xff, 0xc2, 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa6, 0x0, 0xd, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, 0x0, 0xcf, - 0xff, 0xc2, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xc2, - 0x0, 0x2e, 0xff, 0xff, 0xa5, 0x32, 0x48, 0xef, - 0xff, 0xc0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x17, 0xbe, 0xff, 0xec, 0x82, 0x0, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x28, 0xce, 0xfe, 0xd9, 0x40, - 0x3, 0xff, 0xf7, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x23, 0xff, 0xf7, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, - 0xf7, 0x0, 0x3f, 0xff, 0xff, 0xa5, 0x33, 0x49, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xc2, - 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf7, 0x7, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf7, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x2f, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, - 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf7, 0x6f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x6f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf7, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf7, 0x1f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, 0xd, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf7, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf7, 0x0, 0xdf, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf7, - 0x0, 0x3f, 0xff, 0xfd, 0x61, 0x0, 0x16, 0xcf, - 0xff, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xf7, 0x0, 0x0, - 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xda, - 0x50, 0x0, 0xff, 0xf7, - - /* U+0065 "e" */ - 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, 0xda, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xc5, 0x20, 0x14, 0x9f, 0xff, - 0xf7, 0x0, 0x0, 0xdf, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x2d, 0xff, 0xf3, 0x0, 0x6f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0xd, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x11, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf6, 0x4f, 0xff, 0xb9, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x9f, 0xff, 0x86, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x94, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0xd, 0xff, - 0xfc, 0x20, 0x0, 0x0, 0x0, 0x2c, 0xf4, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xa6, 0x32, 0x35, 0xaf, - 0xff, 0xf2, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x19, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xd9, 0x40, - 0x0, 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x0, 0x6, 0xbe, 0xff, 0xc7, 0x10, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x7, 0xff, 0xfb, 0x30, 0x4, 0x90, 0x0, 0x0, - 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, - 0x0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xda, 0x50, - 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0xbf, 0xfb, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, - 0xfb, 0x0, 0x5f, 0xff, 0xff, 0x95, 0x32, 0x37, - 0xcf, 0xff, 0xff, 0xfb, 0x1, 0xef, 0xff, 0xa1, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, 0x9, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xfb, 0xe, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xfb, 0x3f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, - 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xfb, 0x6f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x5f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xfb, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfb, 0xe, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x8, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xfb, 0x1, 0xef, 0xff, 0xb1, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x4f, 0xff, - 0xff, 0xa5, 0x32, 0x47, 0xdf, 0xff, 0xff, 0xfb, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xef, 0xfb, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x50, 0xef, 0xfa, 0x0, 0x0, - 0x0, 0x38, 0xce, 0xff, 0xda, 0x50, 0x0, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, - 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xf0, 0x0, 0x4f, 0xd5, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xcf, 0xff, 0x80, 0x1, 0xef, 0xff, - 0xea, 0x64, 0x22, 0x36, 0xaf, 0xff, 0xfd, 0x10, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, - 0x1, 0x69, 0xce, 0xff, 0xed, 0xa7, 0x10, 0x0, - 0x0, - - /* U+0068 "h" */ - 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x10, 0x5, 0xad, 0xef, 0xeb, 0x71, - 0x0, 0x0, 0x8f, 0xff, 0x14, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x8f, 0xff, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, - 0xff, 0xfc, 0x74, 0x34, 0x8e, 0xff, 0xff, 0x50, - 0x8f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xd0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf2, 0x8f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0x8f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, - 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf9, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, - 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, - 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, - - /* U+0069 "i" */ - 0x0, 0x57, 0x20, 0xa, 0xff, 0xf4, 0x1f, 0xff, - 0xfa, 0x1f, 0xff, 0xf9, 0x6, 0xff, 0xd1, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x8, 0xff, - 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, - 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, - 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, - 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, - 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, - 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, - 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, - - /* U+006A "j" */ - 0x0, 0x0, 0x0, 0x0, 0x47, 0x40, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x4, 0xef, 0xe3, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, - 0x7, 0x83, 0x12, 0xaf, 0xff, 0xb0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x5f, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x20, 0x0, - - /* U+006B "k" */ - 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd1, 0x8, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd1, - 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xd1, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0x8f, 0xff, - 0x10, 0x0, 0x1, 0xcf, 0xff, 0xc1, 0x0, 0x0, - 0x8, 0xff, 0xf1, 0x0, 0x1, 0xdf, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x2, 0xef, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, - 0x3, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x14, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf7, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0x62, 0xef, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0x50, 0x4, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x8, 0xff, 0xff, 0x40, - 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x8f, - 0xff, 0x40, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x10, - 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xfb, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xf8, 0x0, 0x8, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, - 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf2, 0x8, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd1, - - /* U+006C "l" */ - 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, - 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, - 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, - 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, - 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, - 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, - 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, - 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, - 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, - - /* U+006D "m" */ - 0x8f, 0xff, 0x0, 0x16, 0xbd, 0xff, 0xda, 0x40, - 0x0, 0x0, 0x3, 0x8c, 0xef, 0xed, 0x93, 0x0, - 0x0, 0x8f, 0xff, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x20, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0x8f, 0xff, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x8f, 0xff, 0xff, 0xf8, 0x31, - 0x2, 0x7e, 0xff, 0xfd, 0xef, 0xff, 0x83, 0x11, - 0x38, 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x8f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x8f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x8f, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, - 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x8f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, - 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xfe, - - /* U+006E "n" */ - 0x8f, 0xff, 0x0, 0x6, 0xad, 0xff, 0xeb, 0x71, - 0x0, 0x0, 0x8f, 0xff, 0x6, 0xef, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x8f, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, - 0xff, 0xfa, 0x41, 0x1, 0x5c, 0xff, 0xff, 0x50, - 0x8f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xd0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf2, 0x8f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf6, 0x8f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, - 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf9, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, - 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, - 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, - - /* U+006F "o" */ - 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xec, 0x82, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xa5, 0x33, 0x49, - 0xef, 0xff, 0xf3, 0x0, 0x0, 0xdf, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfe, 0x10, 0x6, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x80, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x1f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf3, - 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf6, 0x6f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x6f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf7, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf6, 0x1f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf3, 0xd, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xe0, 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x80, 0x0, 0xcf, 0xff, - 0xc2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfe, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xa5, 0x33, 0x49, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, - 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xec, - 0x82, 0x0, 0x0, 0x0, - - /* U+0070 "p" */ - 0x8f, 0xff, 0x0, 0x5, 0xad, 0xff, 0xec, 0x72, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x4, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x8f, 0xff, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x8f, 0xff, 0xff, 0xfc, 0x61, 0x0, 0x27, - 0xef, 0xff, 0xe2, 0x0, 0x8f, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfc, 0x0, 0x8f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x50, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x8f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, - 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x8f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf4, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, 0x8f, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xb0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0x50, 0x8f, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xfc, 0x0, - 0x8f, 0xff, 0xff, 0xfe, 0x94, 0x23, 0x5b, 0xff, - 0xff, 0xe2, 0x0, 0x8f, 0xff, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x8f, 0xff, - 0x12, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, - 0x0, 0x8f, 0xff, 0x10, 0x4, 0x9d, 0xff, 0xec, - 0x82, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0071 "q" */ - 0x0, 0x0, 0x0, 0x28, 0xce, 0xfe, 0xd9, 0x40, - 0x0, 0xff, 0xf7, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x20, 0xff, 0xf7, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xf7, 0x0, 0x3f, 0xff, 0xff, 0xa5, 0x33, 0x49, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf7, 0x7, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf7, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x2f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, - 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf7, 0x6f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x6f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf7, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf7, 0x1f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0xd, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0xdf, 0xff, - 0xc2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf7, - 0x0, 0x3f, 0xff, 0xff, 0xa5, 0x33, 0x49, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0xff, 0xf7, 0x0, 0x0, - 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x23, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xd9, - 0x30, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf7, - - /* U+0072 "r" */ - 0x8f, 0xff, 0x0, 0x5, 0xad, 0xe4, 0x8f, 0xff, - 0x3, 0xdf, 0xff, 0xf4, 0x8f, 0xff, 0x4f, 0xff, - 0xff, 0xf4, 0x8f, 0xff, 0xef, 0xff, 0xb8, 0x72, - 0x8f, 0xff, 0xff, 0x91, 0x0, 0x0, 0x8f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x0, 0x3, 0x9c, 0xef, 0xfe, 0xc9, 0x51, - 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x91, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0xdf, 0xff, 0xc5, 0x21, - 0x12, 0x59, 0xef, 0x50, 0x3, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x0, 0x6, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xfe, 0xb7, 0x41, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xea, - 0x50, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x3, 0x69, - 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, - 0xd8, 0x10, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, - 0x7, 0xff, 0xfb, 0x74, 0x21, 0x24, 0x8f, 0xff, - 0xf5, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, - 0xed, 0xa6, 0x10, 0x0, - - /* U+0074 "t" */ - 0x0, 0x0, 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfd, 0x41, 0x15, 0xb0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x18, - 0xcf, 0xfe, 0xb5, 0x0, - - /* U+0075 "u" */ - 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, - 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, - 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, - 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf3, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf3, 0x5f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0xe, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf3, - 0x7, 0xff, 0xff, 0x93, 0x0, 0x14, 0xbf, 0xff, - 0xff, 0xf3, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xf3, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x33, 0xff, 0xf3, 0x0, 0x0, - 0x17, 0xbe, 0xff, 0xda, 0x50, 0x3, 0xff, 0xf3, - - /* U+0076 "v" */ - 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x10, 0x6f, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, - 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf2, 0x0, 0x8, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, 0x1f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0x40, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x3, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x9f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x60, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xfd, 0x0, 0x0, 0x7, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, - 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xa0, 0x0, 0x5f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x10, - 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf8, 0x3, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0xaf, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - - /* U+0077 "w" */ - 0x9f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xfb, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf5, 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf0, 0x7, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x90, 0x1, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0xbf, 0xfb, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xda, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x5f, - 0xff, 0x10, 0x0, 0x0, 0xd, 0xff, 0x74, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, - 0xe, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, 0x10, - 0xef, 0xf7, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, - 0x0, 0x9, 0xff, 0xc0, 0x0, 0x0, 0xaf, 0xfa, - 0x0, 0x7f, 0xfd, 0x0, 0x0, 0x8, 0xff, 0xb0, - 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, 0xff, - 0xf4, 0x0, 0x1f, 0xff, 0x30, 0x0, 0xe, 0xff, - 0x50, 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x6, - 0xff, 0xe0, 0x0, 0xb, 0xff, 0x90, 0x0, 0x4f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, - 0xc, 0xff, 0x80, 0x0, 0x5, 0xff, 0xf0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x40, 0x2f, 0xff, 0x10, 0x0, 0x0, 0xef, 0xf5, - 0x1, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xa0, 0x8f, 0xfb, 0x0, 0x0, 0x0, 0x9f, - 0xfb, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf1, 0xef, 0xf5, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x1c, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xfa, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xaf, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0x90, 0x0, 0x0, 0x0, - - /* U+0078 "x" */ - 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xfa, 0x0, 0x1d, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x3f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, - 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, - 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x30, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xfe, 0x2d, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xaf, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0xaf, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc0, - 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xe1, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x5, 0xff, - 0xfa, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf4, 0x2, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xe1, - - /* U+0079 "y" */ - 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x10, 0x6f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, - 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf2, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, 0x1f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0x30, 0x0, 0x0, 0x9f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0xaf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x80, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x8, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, - 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xd0, 0x0, 0x6f, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, - 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xfc, 0x4, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0xbf, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xde, 0x62, 0x14, 0xcf, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x8c, 0xef, 0xeb, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, - - /* U+007B "{" */ - 0x0, 0x0, 0x3, 0xad, 0xff, 0x90, 0x0, 0x6, - 0xff, 0xff, 0xf9, 0x0, 0x2, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x8f, 0xff, 0xc2, 0x0, 0x0, 0xb, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0xcf, 0xfd, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xfd, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xd0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0x30, 0x0, 0xd, 0xff, 0xff, - 0x50, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0xcf, 0xfd, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xfd, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc2, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0x90, 0x0, 0x6, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x3, 0xae, 0xff, - 0x90, - - /* U+007C "|" */ - 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, - 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, - 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, - 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, - 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, - 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, - 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, - 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, - 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, - 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, - 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, - - /* U+007D "}" */ - 0x4f, 0xfe, 0xb6, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x18, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x4f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x10, 0x0, 0x0, 0x18, 0xff, 0xfe, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xfe, 0xb6, 0x0, - 0x0, 0x0, - - /* U+007E "~" */ - 0x0, 0x7, 0xbb, 0x93, 0x0, 0x0, 0x0, 0x6, - 0xca, 0x1, 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, - 0xa, 0xfc, 0xc, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0xe, 0xfa, 0x3f, 0xfc, 0x20, 0x5e, 0xff, - 0xd2, 0x0, 0x9f, 0xf6, 0x8f, 0xf2, 0x0, 0x1, - 0xdf, 0xff, 0xce, 0xff, 0xe0, 0xbf, 0xc0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0x40, 0x9b, 0x70, - 0x0, 0x0, 0x0, 0x5c, 0xff, 0xb3, 0x0, - - /* U+00B0 "°" */ - 0x0, 0x1, 0x7c, 0xfe, 0xc6, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x2, 0xff, - 0xb3, 0x0, 0x4d, 0xfe, 0x10, 0xb, 0xfb, 0x0, - 0x0, 0x0, 0xcf, 0x90, 0x1f, 0xf2, 0x0, 0x0, - 0x0, 0x3f, 0xf0, 0x3f, 0xe0, 0x0, 0x0, 0x0, - 0xf, 0xf2, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0xf, - 0xf2, 0x1f, 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xf0, - 0xb, 0xfb, 0x0, 0x0, 0x0, 0xdf, 0x90, 0x2, - 0xff, 0xc4, 0x1, 0x5d, 0xfe, 0x10, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x1, 0x7d, - 0xfe, 0xc7, 0x0, 0x0, - - /* U+2022 "•" */ - 0x0, 0x7c, 0xb6, 0x0, 0xb, 0xff, 0xff, 0xa0, - 0x4f, 0xff, 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xf5, - 0x4f, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xc0, - 0x1, 0xae, 0xe9, 0x0, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x5e, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc8, 0x30, 0x0, 0xef, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa6, 0x10, 0x0, 0x0, 0xe, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xfb, 0x72, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x55, 0x53, 0xef, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1, - 0x58, 0x99, 0x7c, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x39, 0xef, 0xff, 0xfb, 0x60, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xfc, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, - 0xcd, 0xdb, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F008 "" */ - 0x17, 0x30, 0x0, 0x7, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, - 0x0, 0x3, 0x71, 0xcf, 0x60, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x6, 0xfc, 0xff, 0xa2, - 0x22, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x22, 0x2a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb4, 0x44, 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x44, - 0x4b, 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, - 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x6, 0xff, - 0xff, 0x60, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, - 0x0, 0x6, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf1, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x66, 0x7f, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xf7, 0x66, 0x6c, 0xff, 0xff, - 0x60, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x6, 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x6, 0xff, - 0xff, 0x70, 0x0, 0xf, 0xff, 0xf9, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xf0, - 0x0, 0x7, 0xff, 0xff, 0xfe, 0xee, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xee, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd8, 0x88, 0x9f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf9, 0x88, 0x8d, 0xff, 0xff, 0x60, 0x0, 0xe, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, - 0x60, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, - 0x6, 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, 0x70, 0x0, - 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x7, 0xff, - 0xff, 0xfc, 0xcc, 0xdf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, - 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, - 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xaa, 0xae, - 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x6, 0xff, 0x6f, 0x60, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x6, 0xf6, - - /* U+F00B "" */ - 0x5e, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe5, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x17, 0x88, 0x88, 0x88, 0x87, - 0x10, 0x0, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x71, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x17, - 0x88, 0x88, 0x88, 0x87, 0x10, 0x0, 0x47, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x6, 0x77, 0x77, 0x77, 0x76, - 0x10, 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x60, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x25, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x7, - 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0xd6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0xb, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xc1, 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xd1, - 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xb9, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0xef, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xf0, 0x5f, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xf7, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, - 0x4c, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3b, 0xc6, 0x0, 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x38, 0x30, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, - 0x0, 0x2, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0x10, 0x0, 0xe, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x8f, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xdf, 0xff, 0xff, - 0x10, 0x1, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x60, 0x0, - 0xdf, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0x10, 0x0, 0x9, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xfe, 0x0, 0x1, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0x50, 0x6, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf0, - 0xe, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xf4, 0x2f, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xf6, 0x3f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xf6, 0x3f, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xf6, 0x2f, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xf5, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x22, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xf3, 0xd, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf1, - 0x9, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xd0, 0x4, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0x90, 0x0, 0xef, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, - 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xff, 0xff, 0xa5, 0x10, 0x0, 0x0, - 0x49, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xdd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, 0xff, - 0xff, 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x58, 0x9a, 0xa9, 0x74, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xad, 0x50, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc3, 0x0, 0x8, 0xf7, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfc, 0x4a, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0xef, 0xff, - 0x50, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0x0, 0x1, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xc2, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x3, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x75, 0x58, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xec, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2, - 0xff, 0xd4, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x10, 0x6e, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x36, 0x0, 0x0, 0x7, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x72, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xdf, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x12, 0x21, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xce, 0xb3, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xb, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x20, 0xbf, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfd, 0x8e, 0xff, - 0xff, 0xff, 0x4b, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0xfa, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x26, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x4f, 0xfd, 0x20, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x7f, 0xff, 0xfe, 0x40, 0x3, 0xef, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xff, 0x90, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0x60, 0x1, 0xcf, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0x70, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x7f, - 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xfd, 0x20, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd2, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0x40, 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x10, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x70, - 0xcf, 0xff, 0xff, 0xf9, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, - 0xf6, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x9, - 0xff, 0xff, 0xf8, 0x1e, 0xff, 0xe4, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x7, 0xff, 0xfc, - 0x0, 0x3f, 0xd2, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x4, 0xfe, 0x10, 0x0, 0x10, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, - 0x0, 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x0, - 0x0, 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3d, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xee, 0xee, 0xee, 0xd3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x7, 0xff, 0x70, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x33, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x33, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x8f, 0xd0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x4f, - 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x72, 0xcf, 0xf4, 0x4e, 0xff, 0xff, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe5, - - /* U+F01C "" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x8a, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xfe, 0x10, 0x0, 0xd, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xfa, 0x0, 0x9, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x3, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xe1, 0xbf, 0xff, 0xff, - 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x6f, - 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x88, 0x88, 0x88, 0x88, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x95, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x77, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x46, 0x77, 0x53, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa1, 0x0, 0x2f, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x1f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xf, 0xff, 0xff, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, 0x2, - 0x7c, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xe, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x7f, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xed, 0xdd, 0xff, 0xff, 0xff, 0xff, 0x5, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x1, 0x22, 0x21, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xd0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0x60, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, - 0x10, 0xff, 0xff, 0xff, 0xff, 0x90, 0x1, 0x23, - 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf2, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, - 0x2, 0x9f, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x85, 0x33, 0x57, 0xcf, 0xff, 0xff, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xf1, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf2, 0x0, 0x4, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, - 0xff, 0xff, 0xd9, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7a, 0xaa, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x22, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xf0, 0x34, 0x44, 0x44, 0x44, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, - 0x44, 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, 0xef, 0x90, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x7f, 0xff, 0xb0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x4, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x4, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x6, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1f, - 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x2, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x9f, 0xff, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xaf, 0xff, 0xd0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x6f, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x6, 0xff, - 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8, 0xb3, 0x0, - 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xc2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x1, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xa1, 0x0, 0x1, - 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xe2, 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xd0, - 0x0, 0xe, 0xff, 0xf0, 0x0, 0x34, 0x44, 0x44, - 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0x90, 0x0, 0x7f, - 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x20, 0x0, - 0x2, 0xff, 0xff, 0x20, 0x0, 0xff, 0xfb, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x2, 0xef, 0xa0, 0x0, 0x6, 0xff, - 0xf9, 0x0, 0xa, 0xff, 0xf1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x7f, 0xff, 0xc0, 0x0, 0xe, 0xff, 0xe0, 0x0, - 0x5f, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, - 0x80, 0x0, 0x7f, 0xff, 0x30, 0x2, 0xff, 0xf7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x4, 0xef, 0xff, 0x10, 0x3, - 0xff, 0xf6, 0x0, 0xf, 0xff, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x5, 0xff, 0xf5, 0x0, 0xf, 0xff, 0x80, - 0x0, 0xef, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1f, - 0xff, 0x70, 0x0, 0xff, 0xf9, 0x0, 0xd, 0xff, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, - 0xf, 0xff, 0x90, 0x0, 0xef, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0xaf, 0xff, 0x30, 0x1, 0xff, 0xf8, - 0x0, 0xf, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xbf, - 0xff, 0xc0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x7f, 0xff, 0xf3, 0x0, - 0xa, 0xff, 0xf1, 0x0, 0x4f, 0xff, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x6, 0xff, 0xf5, 0x0, 0x2, 0xff, 0xfc, - 0x0, 0x8, 0xff, 0xf2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x7, - 0x93, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, 0xdf, - 0xfe, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xd0, 0x0, 0x4f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, - 0x0, 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xf7, 0x0, 0x4, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf9, 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf7, 0x0, - 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x6, 0x92, 0x0, 0x0, 0x7f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x82, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x41, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x40, 0x1, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x72, - 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x29, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x8f, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x8f, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xfb, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf, 0xff, 0xfd, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xef, - 0xff, 0xd0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, 0xfe, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xaf, 0xff, 0xf3, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x6, - 0xff, 0xff, 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, - 0x40, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x9f, 0xff, 0xff, 0x30, 0x2, - 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xc6, 0x20, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x79, 0xbb, - 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F048 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xee, - 0x70, 0x4f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x44, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xf7, 0x4f, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x84, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0x84, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, - 0x10, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xff, 0x10, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x84, 0xff, 0xff, 0xf1, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, - 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, - 0xff, 0xf2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, - 0xff, 0xff, 0xf1, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf8, 0x4f, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf7, - 0x4f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x63, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xc0, 0x3, 0x44, 0x42, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x40, 0x0, - - /* U+F04B "" */ - 0x0, 0x13, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xd4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfe, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8b, - 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x4, 0xcf, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, - 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xd6, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x24, 0x44, 0x44, 0x44, 0x43, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, - 0x30, 0x0, - - /* U+F04D "" */ - 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x30, 0x0, - - /* U+F051 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xe6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xe3, 0x2f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0x65, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x65, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x65, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0xe, 0xff, 0xff, - 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xe, 0xff, - 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xe, - 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xf6, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x9e, 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x65, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0xe, 0xff, 0xff, 0x65, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0xe, 0xff, 0xff, - 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, - 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0x65, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf6, - 0x3f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0x60, 0xaf, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xf5, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x44, 0x44, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xbe, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x46, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x3, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x75, 0x0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xe6, 0x0, - - /* U+F054 "" */ - 0x0, 0x26, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9d, - 0xed, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xcd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xca, 0x20, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x1, 0x45, 0x55, 0x55, - 0x55, 0x55, 0x5f, 0xff, 0xff, 0xff, 0x75, 0x55, - 0x55, 0x55, 0x55, 0x42, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x25, 0x65, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F068 "" */ - 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x40, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x0, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x45, 0x77, 0x65, 0x41, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xa5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfc, 0x73, - 0x21, 0x24, 0x8d, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, - 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x14, 0x54, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xa1, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe3, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xe2, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x2, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x9, 0xa7, - 0x9e, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x3, 0x9c, 0xdc, 0x82, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, - 0x15, 0xdf, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xba, 0x9a, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x7a, 0xce, 0xff, 0xed, 0xc9, 0x62, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x25, 0x67, 0x76, 0x42, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x38, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x72, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfb, 0x11, 0x8e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa6, 0x31, 0x23, 0x7b, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, - 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x35, 0x42, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, - 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xd4, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x2c, 0xff, - 0xff, 0xff, 0xb1, 0x8f, 0xff, 0xff, 0x80, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0x80, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xf7, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x90, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xe4, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0x74, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, - 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xa9, 0xab, 0x20, 0x0, 0x0, - 0x4, 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x2c, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x59, 0xcd, 0xef, 0xfe, 0xca, 0x72, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa7, 0x0, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe5, 0x55, 0x57, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x20, 0x3c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x21, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0x3b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xd9, 0x10, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0xbe, 0xee, 0xee, 0xef, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xee, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0x60, 0x5, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x8f, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0x90, 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8a, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6, 0x93, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x10, 0x0, 0x0, 0x9, - 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, 0x9, 0xe1, - 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0x50, 0x6, 0xff, 0xff, 0xc0, 0x0, - 0x8f, 0xff, 0xff, 0x60, 0x0, 0x1, 0x11, 0x11, - 0x18, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x4f, 0xff, - 0xff, 0xfb, 0x11, 0x8f, 0xff, 0xff, 0xf6, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xad, - 0xdd, 0xdd, 0xdd, 0xdb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xdd, 0xdd, 0xef, 0xff, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x82, 0x0, 0x0, - 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x7f, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, - 0x6f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xa7, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xfb, 0x1d, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0x30, 0x1d, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x30, 0x0, 0x17, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x58, 0x20, 0x0, - - /* U+F078 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf9, - 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xfa, 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xc2, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xf5, 0x3, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0x40, 0x1d, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x0, 0x59, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x6a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbe, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xef, 0xff, 0xfe, 0xef, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xfe, 0x2e, 0xff, 0xfd, 0x3f, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf3, 0xe, 0xff, 0xfd, 0x4, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x9, 0xff, 0x40, 0xe, 0xff, 0xfd, 0x0, 0x5f, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, - 0x0, 0xa, 0xff, 0xff, 0x10, 0x3, 0x72, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xc0, 0xa, 0xff, 0xff, 0x10, 0x6f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xfb, 0xa, 0xff, 0xff, 0x15, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xba, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x1c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xab, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x10, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x0, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xb9, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x11, 0x11, 0xef, 0xff, 0xff, 0xff, - 0xf9, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x5, 0x66, - 0x66, 0x66, 0x30, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x73, 0x22, 0x22, 0x22, - 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x8f, 0xd0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x4f, - 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x72, 0xcf, 0xf4, 0x4e, 0xff, 0xff, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe5, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xc9, 0x51, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xfd, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x28, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x18, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbb, - 0xa9, 0x86, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x0, 0x0, 0x6a, 0xdd, 0xb7, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xa9, - 0x50, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0xfe, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0xcf, 0xff, 0xf9, - 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, - 0xe0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, - 0xff, 0xd0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0xdf, 0xff, 0xf5, 0x0, 0x2e, 0xff, 0xff, 0x10, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xba, 0xff, 0xff, 0xfd, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0xdd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xf9, 0x0, 0x6f, 0xff, 0xff, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0xff, 0xff, 0xe0, 0x0, 0xa, 0xff, 0xff, - 0x20, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x9, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0xdf, 0xff, 0xf5, 0x0, 0x2e, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x9f, 0xff, 0xff, 0xba, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x9d, 0xfe, 0xa3, 0x0, - 0x0, 0x3, 0xaf, 0xff, 0xfc, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xed, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xef, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0xef, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0xef, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0xef, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0xef, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xff, 0xf2, - 0x6f, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, - 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, - 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, - 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, - 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, - 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0xf3, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x26, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x10, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x2, 0x9c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xa3, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x70, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, - 0xfc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x83, 0x12, 0x6d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x10, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x9a, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x10, 0x0, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x10, 0x0, - - /* U+F0C9 "" */ - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x26, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x26, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x14, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, - - /* U+F0E0 "" */ - 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x41, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x1b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x40, 0x1, 0xc4, 0x0, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, - 0x7f, 0xff, 0x90, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xfc, 0x20, 0x3, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x30, 0x4, 0xef, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x40, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x20, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc2, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x2, 0xcf, 0xff, - 0xfc, 0x20, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x4, 0xaa, 0x40, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x4d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, - 0x33, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, - - /* U+F0E7 "" */ - 0x0, 0x0, 0x13, 0x44, 0x44, 0x44, 0x44, 0x43, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb6, 0x66, 0x66, 0x66, 0x53, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x12, - 0x22, 0x22, 0x22, 0x28, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, 0xfd, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3b, 0xcc, 0xcc, 0xcc, 0xff, - 0xfe, 0xef, 0xff, 0xcc, 0xcc, 0xcc, 0xa2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x1b, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x0, 0x20, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0xed, 0x10, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0xef, 0xd1, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0xef, 0xfd, 0x10, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, 0xff, 0xd1, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, 0xff, - 0xfd, 0x10, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, - 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0xef, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, - 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x17, - 0x88, 0x88, 0x88, 0x84, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3a, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x40, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, 0xff, 0xb5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xa, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xba, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xba, 0x60, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, 0x10, 0x1, - 0xaf, 0xf2, 0x0, 0x9, 0xff, 0x40, 0x0, 0x7f, - 0xf5, 0x0, 0x5, 0xff, 0x70, 0x0, 0x4f, 0xff, - 0xfc, 0xff, 0xff, 0xc0, 0x0, 0x7, 0xfe, 0x0, - 0x0, 0x6f, 0xf0, 0x0, 0x4, 0xff, 0x20, 0x0, - 0x2f, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xcf, 0xff, - 0xfc, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x6, 0xff, - 0x0, 0x0, 0x4f, 0xf2, 0x0, 0x2, 0xff, 0x40, - 0x0, 0xf, 0xff, 0xfc, 0xff, 0xff, 0xc0, 0x0, - 0x7, 0xfe, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x4, - 0xff, 0x20, 0x0, 0x2f, 0xf4, 0x0, 0x0, 0xff, - 0xff, 0xcf, 0xff, 0xfe, 0x10, 0x0, 0xaf, 0xf2, - 0x0, 0x9, 0xff, 0x30, 0x0, 0x7f, 0xf5, 0x0, - 0x5, 0xff, 0x70, 0x0, 0x3f, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x66, - 0x8f, 0xfd, 0x66, 0x68, 0xff, 0xd6, 0x66, 0x7f, - 0xfd, 0x66, 0x66, 0xef, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xff, 0x70, - 0x0, 0xe, 0xf7, 0x0, 0x0, 0xef, 0x70, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0xf, 0xf7, 0x0, 0x0, 0xef, - 0x70, 0x0, 0xe, 0xf7, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0xff, 0x70, 0x0, 0xe, 0xf7, 0x0, 0x0, - 0xef, 0x70, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1f, 0xf9, - 0x0, 0x1, 0xff, 0x90, 0x0, 0x1f, 0xf9, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0x76, 0x67, 0xdf, 0xf8, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6a, - 0xff, 0xb6, 0x66, 0x9f, 0xff, 0xfc, 0xff, 0xff, - 0xc0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf4, 0x0, - 0x0, 0xff, 0xff, 0xcf, 0xff, 0xfc, 0x0, 0x0, - 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0x40, 0x0, 0xf, 0xff, - 0xfc, 0xff, 0xff, 0xc0, 0x0, 0x7, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xcf, 0xff, - 0xfd, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x50, - 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xff, 0xfd, 0xcc, - 0xcf, 0xff, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xef, 0xff, 0xcc, 0xce, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x95, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xab, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F15B "" */ - 0x6, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x40, 0x6, 0x10, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xfe, - 0x30, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0xf, 0xff, 0xfe, 0x30, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0xf, 0xff, 0xff, 0xfe, 0x30, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xff, - 0xff, 0xff, 0xfe, 0x30, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, - 0xff, 0xfe, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x32, - 0x22, 0x22, 0x22, 0x22, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x5e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x25, 0x8a, 0xcd, 0xee, 0xed, 0xcb, 0x96, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xae, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x86, 0x42, 0x11, 0x12, 0x35, 0x79, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x83, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, - 0xcf, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xf5, - 0x2e, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, - 0x2, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x69, 0xce, 0xff, 0xfe, 0xdb, 0x84, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf9, 0x0, - 0x0, 0x2c, 0x70, 0x0, 0x0, 0x0, 0x0, 0x18, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xc8, 0x42, 0x0, 0x1, 0x26, 0xae, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfc, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x35, 0x41, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x37, 0x7f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x5c, 0xdf, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, - - /* U+F241 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, - - /* U+F242 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, - - /* U+F243 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, - - /* U+F244 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x8b, 0xb4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x22, 0xcf, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf9, 0x88, 0xef, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x40, 0x0, 0x5f, 0xff, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xf9, 0x0, 0x0, 0x5, 0xef, 0xfb, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x78, 0x61, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, 0xc, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xd4, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x4f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xb2, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xef, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xb9, 0x9e, 0xff, - 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xac, 0xff, 0xff, 0xfd, 0x40, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xe6, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xfc, 0x20, 0x0, 0x0, - 0x0, 0x2a, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, 0xa, 0xdd, - 0xdd, 0xdd, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x53, 0x3e, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x56, 0x6f, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, - 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, 0xff, - 0xd9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xbf, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xfe, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x20, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, - 0xff, 0x7f, 0xff, 0xfe, 0x0, 0x5c, 0x0, 0xa, - 0xff, 0xff, 0xff, 0x40, 0xc, 0xff, 0xff, 0xe3, - 0x5, 0xff, 0xfe, 0x0, 0x4f, 0xc1, 0x0, 0xbf, - 0xff, 0xff, 0x70, 0xf, 0xff, 0xff, 0xb0, 0x0, - 0x4f, 0xfe, 0x0, 0x4f, 0xfa, 0x0, 0x1f, 0xff, - 0xff, 0x90, 0x1f, 0xff, 0xff, 0xfb, 0x0, 0x4, - 0xfe, 0x0, 0x4f, 0xd1, 0x0, 0xaf, 0xff, 0xff, - 0xc0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x4e, - 0x0, 0x4d, 0x10, 0x8, 0xff, 0xff, 0xff, 0xd0, - 0x4f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3, 0x0, - 0x21, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x5f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, - 0x0, 0x10, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf0, - 0x3f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x2d, 0x0, - 0x4b, 0x0, 0x8, 0xff, 0xff, 0xff, 0xe0, 0x1f, - 0xff, 0xff, 0xfd, 0x10, 0x2, 0xef, 0x0, 0x4f, - 0xa0, 0x0, 0x9f, 0xff, 0xff, 0xc0, 0xf, 0xff, - 0xff, 0xd1, 0x0, 0x2e, 0xff, 0x0, 0x4f, 0xf9, - 0x0, 0xc, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, - 0xd1, 0x2, 0xef, 0xff, 0x0, 0x4f, 0xe2, 0x0, - 0x5f, 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0xfd, - 0x4e, 0xff, 0xff, 0x0, 0x5e, 0x20, 0x5, 0xff, - 0xff, 0xff, 0x50, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x32, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x48, - 0xab, 0xcd, 0xdc, 0xa7, 0x30, 0x0, 0x0, 0x0, - 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, - 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8c, 0xcc, 0xcc, 0xcc, 0xcc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcc, - 0xcc, 0xcc, 0xcc, 0xa0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7c, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xa0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0x90, 0x9f, 0xff, 0xfb, 0x7, - 0xff, 0xff, 0xc1, 0x5f, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, - 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, - 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, - 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, - 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, - 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, - 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, - 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, - 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, - 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, - 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, - 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, - 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, - 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, - 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, - 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, - 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, - 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, 0x9f, 0xff, - 0xfb, 0x7, 0xff, 0xff, 0xc1, 0x5f, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x7b, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcb, 0x81, 0x0, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xef, 0xfe, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf7, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf7, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x4f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xab, 0x97, - 0x53, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x67, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x98, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0x60, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x6, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x6f, 0xff, 0x60, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x6, 0xf6, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1, 0xa1, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xfd, 0x10, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x1, 0xdf, 0xff, 0xd1, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x1d, 0xff, 0xff, 0xfd, - 0x10, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x21, 0xdf, 0xff, 0xff, 0xff, - 0xd1, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa2, 0x0, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x2, 0xef, 0xfc, 0xbb, 0xbf, 0xfc, - 0xbb, 0xcf, 0xfc, 0xbb, 0xbf, 0xff, 0xfa, 0x0, - 0x2, 0xef, 0xff, 0x50, 0x2, 0xff, 0x40, 0x3, - 0xff, 0x30, 0x1, 0xff, 0xff, 0xa0, 0x2, 0xef, - 0xff, 0xf5, 0x0, 0x2f, 0xf4, 0x0, 0x3f, 0xf3, - 0x0, 0x1f, 0xff, 0xfa, 0x2, 0xef, 0xff, 0xff, - 0x50, 0x2, 0xff, 0x40, 0x3, 0xff, 0x30, 0x1, - 0xff, 0xff, 0xa2, 0xef, 0xff, 0xff, 0xf5, 0x0, - 0x2f, 0xf4, 0x0, 0x3f, 0xf3, 0x0, 0x1f, 0xff, - 0xfa, 0xef, 0xff, 0xff, 0xff, 0x50, 0x2, 0xff, - 0x40, 0x3, 0xff, 0x30, 0x1, 0xff, 0xff, 0xaf, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x2f, 0xf4, 0x0, - 0x3f, 0xf3, 0x0, 0x1f, 0xff, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0x62, 0x24, 0xff, 0x62, 0x25, 0xff, - 0x52, 0x23, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xac, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x5c, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xea, 0x20, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xf1, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xff, 0xff, 0xff, 0x10, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x40, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 164, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 163, .box_w = 6, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 78, .adv_w = 238, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 15}, - {.bitmap_index = 139, .adv_w = 427, .box_w = 25, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 464, .adv_w = 378, .box_w = 22, .box_h = 36, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 860, .adv_w = 513, .box_w = 30, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1250, .adv_w = 417, .box_w = 25, .box_h = 27, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1588, .adv_w = 128, .box_w = 4, .box_h = 11, .ofs_x = 2, .ofs_y = 15}, - {.bitmap_index = 1610, .adv_w = 205, .box_w = 9, .box_h = 35, .ofs_x = 3, .ofs_y = -7}, - {.bitmap_index = 1768, .adv_w = 206, .box_w = 9, .box_h = 35, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 1926, .adv_w = 243, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = 14}, - {.bitmap_index = 2031, .adv_w = 354, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 2184, .adv_w = 138, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 2217, .adv_w = 233, .box_w = 11, .box_h = 4, .ofs_x = 2, .ofs_y = 9}, - {.bitmap_index = 2239, .adv_w = 138, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2257, .adv_w = 214, .box_w = 17, .box_h = 35, .ofs_x = -2, .ofs_y = -4}, - {.bitmap_index = 2555, .adv_w = 406, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2854, .adv_w = 225, .box_w = 11, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2997, .adv_w = 349, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3270, .adv_w = 348, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3543, .adv_w = 407, .box_w = 24, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3855, .adv_w = 349, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4128, .adv_w = 375, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4414, .adv_w = 364, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4687, .adv_w = 392, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4973, .adv_w = 375, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5246, .adv_w = 138, .box_w = 6, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5306, .adv_w = 138, .box_w = 6, .box_h = 26, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 5384, .adv_w = 354, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 5546, .adv_w = 354, .box_w = 18, .box_h = 12, .ofs_x = 2, .ofs_y = 7}, - {.bitmap_index = 5654, .adv_w = 354, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 5816, .adv_w = 348, .box_w = 20, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6076, .adv_w = 629, .box_w = 37, .box_h = 33, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 6687, .adv_w = 445, .box_w = 29, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 7064, .adv_w = 460, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7376, .adv_w = 440, .box_w = 26, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7714, .adv_w = 502, .box_w = 27, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8065, .adv_w = 407, .box_w = 21, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8338, .adv_w = 386, .box_w = 20, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8598, .adv_w = 469, .box_w = 26, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8936, .adv_w = 494, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9248, .adv_w = 188, .box_w = 5, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9313, .adv_w = 312, .box_w = 17, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 9534, .adv_w = 437, .box_w = 25, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9859, .adv_w = 361, .box_w = 20, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10119, .adv_w = 581, .box_w = 30, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10509, .adv_w = 494, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10821, .adv_w = 511, .box_w = 30, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11211, .adv_w = 439, .box_w = 23, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 11510, .adv_w = 511, .box_w = 31, .box_h = 31, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 11991, .adv_w = 442, .box_w = 23, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 12290, .adv_w = 378, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 12576, .adv_w = 357, .box_w = 23, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12875, .adv_w = 481, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 13187, .adv_w = 433, .box_w = 29, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 13564, .adv_w = 685, .box_w = 41, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 14097, .adv_w = 409, .box_w = 26, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14435, .adv_w = 393, .box_w = 26, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 14773, .adv_w = 399, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 15072, .adv_w = 202, .box_w = 9, .box_h = 35, .ofs_x = 3, .ofs_y = -7}, - {.bitmap_index = 15230, .adv_w = 214, .box_w = 17, .box_h = 35, .ofs_x = -2, .ofs_y = -4}, - {.bitmap_index = 15528, .adv_w = 202, .box_w = 9, .box_h = 35, .ofs_x = 0, .ofs_y = -7}, - {.bitmap_index = 15686, .adv_w = 354, .box_w = 18, .box_h = 16, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 15830, .adv_w = 304, .box_w = 19, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15859, .adv_w = 365, .box_w = 11, .box_h = 5, .ofs_x = 4, .ofs_y = 23}, - {.bitmap_index = 15887, .adv_w = 364, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 16077, .adv_w = 415, .box_w = 22, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 16385, .adv_w = 347, .box_w = 20, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 16585, .adv_w = 415, .box_w = 22, .box_h = 28, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 16893, .adv_w = 372, .box_w = 21, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 17103, .adv_w = 215, .box_w = 15, .box_h = 28, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17313, .adv_w = 420, .box_w = 22, .box_h = 27, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 17610, .adv_w = 414, .box_w = 20, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 17890, .adv_w = 170, .box_w = 6, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 17977, .adv_w = 173, .box_w = 12, .box_h = 36, .ofs_x = -4, .ofs_y = -7}, - {.bitmap_index = 18193, .adv_w = 375, .box_w = 21, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 18487, .adv_w = 170, .box_w = 5, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 18557, .adv_w = 643, .box_w = 34, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 18897, .adv_w = 414, .box_w = 20, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 19097, .adv_w = 386, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 19317, .adv_w = 415, .box_w = 22, .box_h = 27, .ofs_x = 3, .ofs_y = -7}, - {.bitmap_index = 19614, .adv_w = 415, .box_w = 22, .box_h = 27, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 19911, .adv_w = 249, .box_w = 12, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 20031, .adv_w = 305, .box_w = 18, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 20211, .adv_w = 252, .box_w = 15, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 20399, .adv_w = 412, .box_w = 20, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 20599, .adv_w = 340, .box_w = 23, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 20829, .adv_w = 547, .box_w = 34, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 21169, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 21379, .adv_w = 340, .box_w = 23, .box_h = 27, .ofs_x = -1, .ofs_y = -7}, - {.bitmap_index = 21690, .adv_w = 317, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 21870, .adv_w = 213, .box_w = 11, .box_h = 35, .ofs_x = 2, .ofs_y = -7}, - {.bitmap_index = 22063, .adv_w = 182, .box_w = 5, .box_h = 35, .ofs_x = 3, .ofs_y = -7}, - {.bitmap_index = 22151, .adv_w = 213, .box_w = 12, .box_h = 35, .ofs_x = 0, .ofs_y = -7}, - {.bitmap_index = 22361, .adv_w = 354, .box_w = 18, .box_h = 7, .ofs_x = 2, .ofs_y = 10}, - {.bitmap_index = 22424, .adv_w = 255, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 14}, - {.bitmap_index = 22508, .adv_w = 191, .box_w = 8, .box_h = 7, .ofs_x = 2, .ofs_y = 7}, - {.bitmap_index = 22536, .adv_w = 608, .box_w = 39, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 23297, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23848, .adv_w = 608, .box_w = 38, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 24494, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 25045, .adv_w = 418, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 25410, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 26151, .adv_w = 608, .box_w = 36, .box_h = 39, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 26853, .adv_w = 684, .box_w = 43, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 27584, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 28325, .adv_w = 684, .box_w = 43, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 28949, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 29690, .adv_w = 304, .box_w = 19, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 29975, .adv_w = 456, .box_w = 29, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 30410, .adv_w = 684, .box_w = 43, .box_h = 37, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 31206, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 31757, .adv_w = 418, .box_w = 27, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 32284, .adv_w = 532, .box_w = 25, .box_h = 35, .ofs_x = 4, .ofs_y = -3}, - {.bitmap_index = 32722, .adv_w = 532, .box_w = 34, .box_h = 40, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 33402, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 33980, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 34558, .adv_w = 532, .box_w = 25, .box_h = 35, .ofs_x = 4, .ofs_y = -3}, - {.bitmap_index = 34996, .adv_w = 532, .box_w = 35, .box_h = 34, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 35591, .adv_w = 380, .box_w = 20, .box_h = 33, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 35921, .adv_w = 380, .box_w = 20, .box_h = 33, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 36251, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 36829, .adv_w = 532, .box_w = 34, .box_h = 8, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 36965, .adv_w = 684, .box_w = 43, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 37589, .adv_w = 760, .box_w = 48, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 38525, .adv_w = 684, .box_w = 45, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 39403, .adv_w = 608, .box_w = 38, .box_h = 35, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 40068, .adv_w = 532, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 40415, .adv_w = 532, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 40762, .adv_w = 760, .box_w = 48, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 41482, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 42033, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 42774, .adv_w = 608, .box_w = 39, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 43535, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 44113, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 44776, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 45354, .adv_w = 532, .box_w = 34, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 45864, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 46415, .adv_w = 380, .box_w = 26, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 46922, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 47585, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 48248, .adv_w = 684, .box_w = 43, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 48872, .adv_w = 608, .box_w = 40, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 49652, .adv_w = 456, .box_w = 29, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 50218, .adv_w = 760, .box_w = 48, .box_h = 35, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 51058, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 51658, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 52258, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 52858, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 53458, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 54058, .adv_w = 760, .box_w = 48, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 54778, .adv_w = 532, .box_w = 30, .box_h = 39, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 55363, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 56026, .adv_w = 608, .box_w = 39, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 56787, .adv_w = 760, .box_w = 48, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 57483, .adv_w = 456, .box_w = 29, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 58049, .adv_w = 612, .box_w = 39, .box_h = 25, .ofs_x = 0, .ofs_y = 2} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 6, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 27, 0, 16, -13, 0, 0, - 0, 0, -33, -36, 4, 29, 13, 10, - -24, 4, 30, 2, 26, 6, 19, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 36, 5, -4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 12, 0, -18, 0, 0, 0, 0, - 0, -12, 10, 12, 0, 0, -6, 0, - -4, 6, 0, -6, 0, -6, -3, -12, - 0, 0, 0, 0, -6, 0, 0, -8, - -9, 0, 0, -6, 0, -12, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -6, - -6, 0, -9, 0, -16, 0, -74, 0, - 0, -12, 0, 12, 18, 1, 0, -12, - 6, 6, 20, 12, -10, 12, 0, 0, - -35, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -22, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -16, -7, -30, 0, -24, - -4, 0, 0, 0, 0, 1, 24, 0, - -18, -5, -2, 2, 0, -10, 0, 0, - -4, -45, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -49, -5, 23, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 20, - 0, 6, 0, 0, -12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 5, - 2, 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, - -22, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, - 12, 6, 18, -6, 0, 0, 12, -6, - -20, -83, 4, 16, 12, 1, -8, 0, - 22, 0, 19, 0, 19, 0, -57, 0, - -7, 18, 0, 20, -6, 12, 6, 0, - 0, 2, -6, 0, 0, -10, 49, 0, - 49, 0, 18, 0, 26, 8, 10, 18, - 0, 0, 0, -22, 0, 0, 0, 0, - 2, -4, 0, 4, -11, -8, -12, 4, - 0, -6, 0, 0, 0, -24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -40, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, -33, 0, -38, 0, 0, 0, - 0, -4, 0, 60, -7, -8, 6, 6, - -5, 0, -8, 6, 0, 0, -32, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -59, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -38, 0, 36, 0, 0, -22, 0, - 20, 0, -41, -59, -41, -12, 18, 0, - 0, -41, 0, 7, -14, 0, -9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 16, 18, -74, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 29, 0, 4, 0, 0, 0, - 0, 0, 4, 4, -7, -12, 0, -2, - -2, -6, 0, 0, -4, 0, 0, 0, - -12, 0, -5, 0, -14, -12, 0, -15, - -20, -20, -12, 0, -12, 0, -12, 0, - 0, 0, 0, -5, 0, 0, 6, 0, - 4, -6, 0, 2, 0, 0, 0, 6, - -4, 0, 0, 0, -4, 6, 6, -2, - 0, 0, 0, -12, 0, -2, 0, 0, - 0, 0, 0, 2, 0, 8, -4, 0, - -7, 0, -10, 0, 0, -4, 0, 18, - 0, 0, -6, 0, 0, 0, 0, 0, - -2, 2, -4, -4, 0, 0, -6, 0, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -3, -3, 0, -6, -7, 0, - 0, 0, 0, 0, 2, 0, 0, -4, - 0, -6, -6, -6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -4, 0, 0, - 0, 0, -4, -8, 0, -9, 0, -18, - -4, -18, 12, 0, 0, -12, 6, 12, - 16, 0, -15, -2, -7, 0, -2, -29, - 6, -4, 4, -32, 6, 0, 0, 2, - -32, 0, -32, -5, -53, -4, 0, -30, - 0, 12, 17, 0, 8, 0, 0, 0, - 0, 1, 0, -11, -8, 0, -18, 0, - 0, 0, -6, 0, 0, 0, -6, 0, - 0, 0, 0, 0, -3, -3, 0, -3, - -8, 0, 0, 0, 0, 0, 0, 0, - -6, -6, 0, -4, -7, -5, 0, 0, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, -5, 0, -7, - 0, -4, 0, -12, 6, 0, 0, -7, - 3, 6, 6, 0, 0, 0, 0, 0, - 0, -4, 0, 0, 0, 0, 0, 4, - 0, 0, -6, 0, -6, -4, -7, 0, - 0, 0, 0, 0, 0, 0, 5, 0, - -5, 0, 0, 0, 0, -7, -9, 0, - -12, 0, 18, -4, 2, -19, 0, 0, - 16, -30, -32, -26, -12, 6, 0, -5, - -40, -11, 0, -11, 0, -12, 9, -11, - -39, 0, -16, 0, 0, 3, -2, 5, - -4, 0, 6, 1, -18, -23, 0, -30, - -15, -13, -15, -18, -7, -16, -1, -12, - -16, 4, 0, 2, 0, -6, 0, 0, - 0, 4, 0, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -6, - 0, -3, 0, -2, -6, 0, -10, -13, - -13, -2, 0, -18, 0, 0, 0, 0, - 0, 0, -5, 0, 0, 0, 0, 2, - -4, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 29, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -11, 0, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, 0, 0, - -12, 0, 0, 0, 0, -30, -18, 0, - 0, 0, -9, -30, 0, 0, -6, 6, - 0, -16, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -10, 0, 0, -12, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, -11, 0, - 0, 0, 0, 7, 0, 4, -12, -12, - 0, -6, -6, -7, 0, 0, 0, 0, - 0, 0, -18, 0, -6, 0, -9, -6, - 0, -13, -15, -18, -5, 0, -12, 0, - -18, 0, 0, 0, 0, 49, 0, 0, - 3, 0, 0, -8, 0, 6, 0, -26, - 0, 0, 0, 0, 0, -57, -11, 20, - 18, -5, -26, 0, 6, -9, 0, -30, - -3, -8, 6, -43, -6, 8, 0, 9, - -21, -9, -22, -20, -26, 0, 0, -36, - 0, 35, 0, 0, -3, 0, 0, 0, - -3, -3, -6, -16, -20, -1, -57, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -6, 0, -3, -6, -9, 0, 0, - -12, 0, -6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, 0, -12, 0, 0, 12, - -2, 8, 0, -13, 6, -4, -2, -16, - -6, 0, -8, -6, -4, 0, -9, -10, - 0, 0, -5, -2, -4, -10, -7, 0, - 0, -6, 0, 6, -4, 0, -13, 0, - 0, 0, -12, 0, -10, 0, -10, -10, - 6, 0, 0, 0, 0, 0, 0, 0, - 0, -12, 6, 0, -9, 0, -4, -7, - -19, -4, -4, -4, -2, -4, -7, -2, - 0, 0, 0, 0, 0, -6, -5, -5, - 0, 0, 0, 0, 7, -4, 0, -4, - 0, 0, 0, -4, -7, -4, -5, -7, - -5, 0, 5, 24, -2, 0, -16, 0, - -4, 12, 0, -6, -26, -8, 9, 1, - 0, -29, -10, 6, -10, 4, 0, -4, - -5, -19, 0, -9, 3, 0, 0, -10, - 0, 0, 0, 6, 6, -12, -12, 0, - -10, -6, -9, -6, -6, 0, -10, 3, - -12, -10, 18, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -10, 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, - -4, 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, -5, -6, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -9, 0, 0, -8, - 0, 0, -6, -6, 0, 0, 0, 0, - -6, 0, 0, 0, 0, -3, 0, 0, - 0, 0, 0, -4, 0, 0, 0, 0, - -9, 0, -12, 0, 0, 0, -20, 0, - 4, -13, 12, 1, -4, -29, 0, 0, - -13, -6, 0, -24, -15, -17, 0, 0, - -26, -6, -24, -23, -29, 0, -16, 0, - 5, 41, -8, 0, -14, -6, -2, -6, - -10, -16, -11, -22, -25, -14, -6, 0, - 0, -4, 0, 2, 0, 0, -43, -5, - 18, 13, -13, -22, 0, 2, -19, 0, - -30, -4, -6, 12, -56, -8, 2, 0, - 0, -40, -7, -32, -6, -44, 0, 0, - -43, 0, 36, 2, 0, -4, 0, 0, - 0, 0, -3, -4, -23, -4, 0, -40, - 0, 0, 0, 0, -19, 0, -5, 0, - -2, -17, -29, 0, 0, -3, -9, -18, - -6, 0, -4, 0, 0, 0, 0, -27, - -6, -20, -19, -5, -10, -15, -6, -10, - 0, -12, -5, -20, -9, 0, -7, -12, - -6, -12, 0, 3, 0, -4, -20, 0, - 12, 0, -11, 0, 0, 0, 0, 7, - 0, 4, -12, 25, 0, -6, -6, -7, - 0, 0, 0, 0, 0, 0, -18, 0, - -6, 0, -9, -6, 0, -13, -15, -18, - -5, 0, -12, 5, 24, 0, 0, 0, - 0, 49, 0, 0, 3, 0, 0, -8, - 0, 6, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -4, -12, 0, 0, 0, 0, 0, -3, - 0, 0, 0, -6, -6, 0, 0, -12, - -6, 0, 0, -12, 0, 10, -3, 0, - 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 9, 12, 5, -5, 0, -19, - -10, 0, 18, -20, -19, -12, -12, 24, - 11, 6, -53, -4, 12, -6, 0, -6, - 7, -6, -21, 0, -6, 6, -8, -5, - -18, -5, 0, 0, 18, 12, 0, -17, - 0, -33, -8, 18, -8, -23, 2, -8, - -20, -20, -6, 24, 6, 0, -9, 0, - -16, 0, 5, 20, -14, -22, -24, -15, - 18, 0, 2, -44, -5, 6, -10, -4, - -14, 0, -13, -22, -9, -9, -5, 0, - 0, -14, -13, -6, 0, 18, 14, -6, - -33, 0, -33, -9, 0, -21, -35, -2, - -19, -10, -20, -17, 16, 0, 0, -8, - 0, -12, -5, 0, -6, -11, 0, 10, - -20, 6, 0, 0, -32, 0, -6, -13, - -10, -4, -18, -15, -20, -14, 0, -18, - -6, -14, -12, -18, -6, 0, 0, 2, - 29, -10, 0, -18, -6, 0, -6, -12, - -14, -16, -17, -23, -8, -12, 12, 0, - -9, 0, -30, -7, 4, 12, -19, -22, - -12, -20, 20, -6, 3, -57, -11, 12, - -13, -10, -22, 0, -18, -26, -7, -6, - -5, -6, -13, -18, -2, 0, 0, 18, - 17, -4, -40, 0, -36, -14, 15, -23, - -41, -12, -21, -26, -30, -20, 12, 0, - 0, 0, 0, -7, 0, 0, 6, -7, - 12, 4, -12, 12, 0, 0, -19, -2, - 0, -2, 0, 2, 2, -5, 0, 0, - 0, 0, 0, 0, -6, 0, 0, 0, - 0, 5, 18, 1, 0, -7, 0, 0, - 0, 0, -4, -4, -7, 0, 0, 0, - 2, 5, 0, 0, 0, 0, 5, 0, - -5, 0, 23, 0, 11, 2, 2, -8, - 0, 12, 0, 0, 0, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 18, 0, 17, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -36, 0, -6, 10, 0, 18, - 0, 0, 60, 7, -12, -12, 6, 6, - -4, 2, -30, 0, 0, 29, -36, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -41, 23, 85, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -36, 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, -10, 0, 0, -12, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, -16, 0, - 0, 2, 0, 0, 6, 78, -12, -5, - 19, 16, -16, 6, 0, 0, 6, 6, - -8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -79, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -17, - 0, 0, 0, -16, 0, 0, 0, 0, - -13, -3, 0, 0, 0, -13, 0, -7, - 0, -29, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -41, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, -6, 0, 0, -12, 0, -9, 0, - -16, 0, 0, 0, -10, 6, -7, 0, - 0, -16, -6, -14, 0, 0, -16, 0, - -6, 0, -29, 0, -7, 0, 0, -49, - -12, -24, -7, -22, 0, 0, -41, 0, - -16, -3, 0, 0, 0, 0, 0, 0, - 0, 0, -9, -11, -5, -10, 0, 0, - 0, 0, -13, 0, -13, 8, -7, 12, - 0, -4, -14, -4, -10, -12, 0, -7, - -3, -4, 4, -16, -2, 0, 0, 0, - -54, -5, -9, 0, -13, 0, -4, -29, - -5, 0, 0, -4, -5, 0, 0, 0, - 0, 4, 0, -4, -10, -4, 10, 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, 8, 0, 0, 0, 0, 0, - 0, -13, 0, -4, 0, 0, 0, -12, - 6, 0, 0, 0, -16, -6, -12, 0, - 0, -17, 0, -6, 0, -29, 0, 0, - 0, 0, -59, 0, -12, -22, -30, 0, - 0, -41, 0, -4, -9, 0, 0, 0, - 0, 0, 0, 0, 0, -6, -9, -3, - -9, 2, 0, 0, 10, -8, 0, 19, - 30, -6, -6, -18, 7, 30, 10, 13, - -16, 7, 26, 7, 18, 13, 16, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 38, 29, -11, -6, 0, -5, - 49, 26, 49, 0, 0, 0, 6, 0, - 0, 22, 0, 0, -10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -4, 0, - 0, 0, 0, 0, 0, 0, 0, 9, - 0, 0, 0, 0, -51, -7, -5, -25, - -30, 0, 0, -41, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 0, -51, -7, -5, - -25, -30, 0, 0, -24, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -5, 0, 0, 0, -14, 6, 0, -6, - 5, 11, 6, -18, 0, -1, -5, 6, - 0, 5, 0, 0, 0, 0, -15, 0, - -5, -4, -12, 0, -5, -24, 0, 38, - -6, 0, -13, -4, 0, -4, -10, 0, - -6, -17, -12, -7, 0, 0, 0, -10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -4, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 0, -51, - -7, -5, -25, -30, 0, 0, -41, 0, - 0, 0, 0, 0, 0, 30, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -10, 0, -19, -7, -5, 18, -5, -6, - -24, 2, -4, 2, -4, -16, 1, 13, - 1, 5, 2, 5, -15, -24, -7, 0, - -23, -12, -16, -26, -24, 0, -10, -12, - -7, -8, -5, -4, -7, -4, 0, -4, - -2, 9, 0, 9, -4, 0, 19, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -4, -6, -6, 0, 0, - -16, 0, -3, 0, -10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -36, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, -6, 0, -8, - 0, 0, 0, 0, -5, 0, 0, -10, - -6, 6, 0, -10, -12, -4, 0, -18, - -4, -13, -4, -7, 0, -10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -41, 0, 19, 0, 0, -11, 0, - 0, 0, 0, -8, 0, -6, 0, 0, - -3, 0, 0, -4, 0, -14, 0, 0, - 26, -8, -20, -19, 4, 7, 7, -1, - -17, 4, 9, 4, 18, 4, 20, -4, - -16, 0, 0, -24, 0, 0, -18, -16, - 0, 0, -12, 0, -8, -10, 0, -9, - 0, -9, 0, -4, 9, 0, -5, -18, - -6, 22, 0, 0, -5, 0, -12, 0, - 0, 8, -14, 0, 6, -6, 5, 1, - 0, -20, 0, -4, -2, 0, -6, 7, - -5, 0, 0, 0, -25, -7, -13, 0, - -18, 0, 0, -29, 0, 22, -6, 0, - -11, 0, 4, 0, -6, 0, -6, -18, - 0, -6, 6, 0, 0, 0, 0, -4, - 0, 0, 6, -8, 2, 0, 0, -7, - -4, 0, -7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -38, 0, 13, 0, - 0, -5, 0, 0, 0, 0, 1, 0, - -6, -6, 0, 0, 0, 12, 0, 14, - 0, 0, 0, 0, 0, -38, -35, 2, - 26, 18, 10, -24, 4, 26, 0, 22, - 0, 12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_38 = { -#else -lv_font_t lv_font_montserrat_38 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 41, /*The maximum line height required by the font*/ - .base_line = 7, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -3, - .underline_thickness = 2, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_38*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_40.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_40.c deleted file mode 100644 index 36c7d31..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_40.c +++ /dev/null @@ -1,9248 +0,0 @@ -/******************************************************************************* - * Size: 40 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 40 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_40.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_40 - #define LV_FONT_MONTSERRAT_40 1 -#endif - -#if LV_FONT_MONTSERRAT_40 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0xd, 0xff, 0xf9, 0xd, 0xff, 0xf9, 0xc, 0xff, - 0xf8, 0xb, 0xff, 0xf8, 0xb, 0xff, 0xf7, 0xa, - 0xff, 0xf6, 0xa, 0xff, 0xf6, 0x9, 0xff, 0xf5, - 0x9, 0xff, 0xf4, 0x8, 0xff, 0xf4, 0x7, 0xff, - 0xf3, 0x7, 0xff, 0xf3, 0x6, 0xff, 0xf2, 0x6, - 0xff, 0xf1, 0x5, 0xff, 0xf1, 0x4, 0xff, 0xf0, - 0x4, 0xff, 0xf0, 0x3, 0xff, 0xf0, 0x3, 0xff, - 0xe0, 0x1, 0xbb, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, - 0x6, 0xff, 0xe3, 0x1f, 0xff, 0xfc, 0x2f, 0xff, - 0xfe, 0xe, 0xff, 0xfa, 0x3, 0xcf, 0xb1, - - /* U+0022 "\"" */ - 0x7f, 0xfd, 0x0, 0x3, 0xff, 0xf1, 0x7f, 0xfd, - 0x0, 0x3, 0xff, 0xf1, 0x6f, 0xfc, 0x0, 0x2, - 0xff, 0xf0, 0x6f, 0xfc, 0x0, 0x2, 0xff, 0xf0, - 0x6f, 0xfc, 0x0, 0x2, 0xff, 0xf0, 0x5f, 0xfb, - 0x0, 0x1, 0xff, 0xf0, 0x5f, 0xfb, 0x0, 0x1, - 0xff, 0xf0, 0x5f, 0xfa, 0x0, 0x1, 0xff, 0xe0, - 0x4f, 0xfa, 0x0, 0x0, 0xff, 0xe0, 0x4f, 0xfa, - 0x0, 0x0, 0xff, 0xe0, 0x4f, 0xf9, 0x0, 0x0, - 0xff, 0xd0, 0x1, 0x11, 0x0, 0x0, 0x11, 0x10, - - /* U+0023 "#" */ - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, - 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xfd, 0x0, 0x0, 0x0, 0xa, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0x70, 0x0, 0x0, 0x0, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xf5, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x0, - 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, - 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x20, - 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, - 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x0, 0x0, 0x0, 0x7, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, - 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x3f, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x20, 0x0, 0x0, 0x5, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, - 0x0, 0x7f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, - 0xfe, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xea, 0xdf, 0xf9, 0xbe, 0xff, 0xff, 0x90, 0x0, - 0xc, 0xff, 0xfe, 0x50, 0xa, 0xfe, 0x0, 0x2, - 0x8f, 0xf3, 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, - 0xaf, 0xe0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x8f, - 0xff, 0x80, 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0xaf, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0x40, 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf9, 0x0, 0x0, 0xaf, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf6, - 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xfc, 0x50, 0xaf, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xfe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xe0, 0x5b, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, - 0x4, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xe0, 0x0, 0x3, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x0, - 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xe0, 0x0, 0x0, 0xcf, 0xff, 0x20, 0x5, - 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x0, 0xe, - 0xff, 0xf0, 0x6, 0xf9, 0x10, 0x0, 0x0, 0xaf, - 0xe0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0xdf, 0xff, - 0x82, 0x0, 0xa, 0xfe, 0x0, 0x18, 0xff, 0xff, - 0x40, 0x2f, 0xff, 0xff, 0xfd, 0xa9, 0xdf, 0xf8, - 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x37, 0xbd, - 0xef, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x58, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0025 "%" */ - 0x0, 0x0, 0x7d, 0xff, 0xd7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x10, 0x0, 0x0, - 0x1, 0xef, 0xfa, 0x66, 0xaf, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, - 0x9, 0xff, 0x60, 0x0, 0x5, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0xf, 0xfb, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, - 0x0, 0x0, 0x2f, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0x0, - 0x0, 0x0, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xf6, 0x0, - 0x0, 0x6, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf1, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, - 0x0, 0x1f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xf6, 0x0, - 0x0, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, - 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, - 0x1f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x20, 0x0, 0x2, 0xff, 0xb0, 0x0, - 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xe5, 0x0, 0x5e, 0xff, 0x30, 0x5, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1e, - 0xff, 0x10, 0x2, 0x9d, 0xfe, 0xb5, 0x0, 0x0, - 0x0, 0x4, 0xdf, 0xff, 0xfd, 0x40, 0x0, 0xaf, - 0xf6, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x2, 0x44, 0x20, 0x0, 0x5, 0xff, - 0xb0, 0x3, 0xff, 0xf9, 0x67, 0xdf, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0x20, 0xc, 0xff, 0x30, 0x0, 0xb, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, - 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x1, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, - 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x0, 0xaf, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x20, - 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, - 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc0, 0x0, - 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, - 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, - 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xe0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x1, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x30, 0x0, 0xb, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf9, 0x57, 0xdf, 0xf9, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x9d, 0xfe, 0xb5, 0x0, 0x0, - - /* U+0026 "&" */ - 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf7, 0x10, 0x3, 0xbf, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x50, 0x0, 0x0, 0xd, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, 0x9f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf2, 0x0, 0x1b, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x15, - 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2c, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xc3, - 0xcf, 0xff, 0xd1, 0x0, 0x0, 0x7, 0x72, 0x0, - 0x0, 0x3f, 0xff, 0xf7, 0x0, 0xc, 0xff, 0xfd, - 0x10, 0x0, 0xe, 0xff, 0x50, 0x1, 0xef, 0xff, - 0x40, 0x0, 0x0, 0xcf, 0xff, 0xd1, 0x0, 0x2f, - 0xff, 0x20, 0x8, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xfd, 0x10, 0x8f, 0xfe, 0x0, 0xe, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xd1, 0xef, 0xf9, 0x0, 0x1f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0xff, 0xf2, - 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0x30, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xc1, 0x0, - 0x8, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6, - 0xef, 0xff, 0xff, 0xfc, 0x10, 0x0, 0xdf, 0xff, - 0xfe, 0x96, 0x45, 0x6a, 0xef, 0xff, 0xfa, 0xcf, - 0xff, 0xc0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x1d, 0xff, 0xf9, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, - 0x0, 0x1, 0xdf, 0xe1, 0x0, 0x0, 0x1, 0x5a, - 0xde, 0xfe, 0xdb, 0x62, 0x0, 0x0, 0x0, 0x1d, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0x7f, 0xfd, 0x7f, 0xfd, 0x6f, 0xfc, 0x6f, 0xfc, - 0x6f, 0xfc, 0x5f, 0xfb, 0x5f, 0xfb, 0x5f, 0xfa, - 0x4f, 0xfa, 0x4f, 0xfa, 0x4f, 0xf9, 0x1, 0x11, - - /* U+0028 "(" */ - 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x4f, - 0xff, 0x70, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, - 0x3, 0xff, 0xf8, 0x0, 0x0, 0x9, 0xff, 0xf1, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x5f, - 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0x10, 0x0, - 0x0, 0xef, 0xfd, 0x0, 0x0, 0x1, 0xff, 0xf9, - 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x8, - 0xff, 0xf3, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, - 0x0, 0xd, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, - 0xc0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, - 0x1f, 0xff, 0xa0, 0x0, 0x0, 0x2f, 0xff, 0x90, - 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x3f, - 0xff, 0x90, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, - 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x1f, 0xff, - 0xa0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, - 0xf, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xff, 0xe0, - 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x8, - 0xff, 0xf3, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, - 0x0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xef, - 0xfd, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x10, 0x0, - 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, - 0xc0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, - 0x3, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xbf, 0xfe, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, - 0xb, 0xff, 0xe0, - - /* U+0029 ")" */ - 0x7f, 0xff, 0x30, 0x0, 0x0, 0xef, 0xfc, 0x0, - 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, 0x1f, 0xff, - 0xb0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x4, - 0xff, 0xf7, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, - 0x0, 0xaf, 0xff, 0x10, 0x0, 0x5, 0xff, 0xf6, - 0x0, 0x0, 0x1f, 0xff, 0xa0, 0x0, 0x0, 0xef, - 0xfd, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, - 0x9f, 0xff, 0x30, 0x0, 0x6, 0xff, 0xf5, 0x0, - 0x0, 0x4f, 0xff, 0x70, 0x0, 0x3, 0xff, 0xf8, - 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, 0x1, 0xff, - 0xfa, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, - 0xff, 0xfb, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, - 0x1, 0xff, 0xfa, 0x0, 0x0, 0x2f, 0xff, 0x90, - 0x0, 0x3, 0xff, 0xf8, 0x0, 0x0, 0x4f, 0xff, - 0x70, 0x0, 0x6, 0xff, 0xf5, 0x0, 0x0, 0x9f, - 0xff, 0x30, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, - 0xef, 0xfd, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, - 0x5, 0xff, 0xf6, 0x0, 0x0, 0xaf, 0xff, 0x10, - 0x0, 0xe, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xf7, - 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x1f, 0xff, - 0xb0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0xef, - 0xfb, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, - - /* U+002A "*" */ - 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x2f, 0xf2, 0x0, 0x1, 0x0, - 0x7, 0xf7, 0x0, 0x2f, 0xf2, 0x0, 0x7f, 0x70, - 0x1e, 0xff, 0xd4, 0x2f, 0xf2, 0x4d, 0xff, 0xe0, - 0x5, 0xef, 0xff, 0xcf, 0xfc, 0xff, 0xfe, 0x50, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x3, 0xcf, 0xff, 0xff, 0xfc, 0x30, 0x0, - 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, - 0x1e, 0xff, 0xf8, 0x3f, 0xf3, 0x8f, 0xff, 0xe1, - 0xa, 0xfb, 0x20, 0x2f, 0xf2, 0x2, 0xcf, 0xa0, - 0x1, 0x50, 0x0, 0x2f, 0xf2, 0x0, 0x5, 0x10, - 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x15, 0x51, 0x0, 0x0, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x1, 0x33, 0x33, 0x33, 0x4f, 0xff, - 0x73, 0x33, 0x33, 0x32, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, - 0x0, 0x0, 0x0, - - /* U+002C "," */ - 0x0, 0x36, 0x40, 0x0, 0x6f, 0xff, 0x80, 0xe, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xf2, 0xc, 0xff, - 0xff, 0x0, 0x2d, 0xff, 0xc0, 0x0, 0x8f, 0xf7, - 0x0, 0xc, 0xff, 0x10, 0x0, 0xff, 0xc0, 0x0, - 0x4f, 0xf7, 0x0, 0x8, 0xff, 0x20, 0x0, 0xcf, - 0xc0, 0x0, - - /* U+002D "-" */ - 0x46, 0x66, 0x66, 0x66, 0x66, 0x60, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, - - /* U+002E "." */ - 0x0, 0x59, 0x60, 0x0, 0x9f, 0xff, 0xa0, 0xf, - 0xff, 0xff, 0x11, 0xff, 0xff, 0xf2, 0xc, 0xff, - 0xfd, 0x0, 0x2b, 0xfc, 0x20, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, - 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xc8, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xec, 0xac, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x17, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0xe, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfa, 0x0, - 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x20, 0x0, 0xef, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, - 0x4, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xe0, 0x8, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, - 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf6, 0xe, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, - 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, - 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfc, 0xf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, - 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfa, 0xe, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, - 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf6, 0x8, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, - 0x4, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xe0, 0x0, 0xef, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, - 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x20, 0x0, 0xe, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfa, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xeb, 0xac, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xc8, - 0x20, 0x0, 0x0, 0x0, - - /* U+0031 "1" */ - 0xbf, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x96, 0x99, 0x99, 0x9b, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, - 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, - 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, - 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, - 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, - - /* U+0032 "2" */ - 0x0, 0x0, 0x1, 0x6a, 0xde, 0xff, 0xeb, 0x82, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xdb, 0xab, 0xdf, - 0xff, 0xff, 0xe1, 0x0, 0x2f, 0xff, 0xfe, 0x61, - 0x0, 0x0, 0x2, 0xaf, 0xff, 0xfa, 0x0, 0x3, - 0xef, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x95, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - - /* U+0033 "3" */ - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x4, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xfc, 0xa5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xe6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x44, 0x45, 0x7b, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf0, 0x1, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xc0, 0xa, 0xf9, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x70, - 0x3f, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x1, 0x8f, - 0xff, 0xfe, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xdb, - 0xab, 0xdf, 0xff, 0xff, 0xf4, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, - 0xde, 0xff, 0xeb, 0x72, 0x0, 0x0, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0xbe, 0xed, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x88, 0x88, 0x88, - 0x88, 0x88, 0xef, 0xff, 0x88, 0x88, 0x82, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, - 0x0, - - /* U+0035 "5" */ - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x2, 0xff, 0xfc, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x0, 0x0, 0x3, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xe9, 0x99, 0x87, 0x64, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x47, 0xcf, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf7, 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf3, 0x2, 0xfe, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, - 0xb, 0xff, 0xfc, 0x62, 0x0, 0x0, 0x0, 0x4c, - 0xff, 0xff, 0x60, 0x1f, 0xff, 0xff, 0xff, 0xec, - 0xbb, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x2, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6a, - 0xce, 0xff, 0xec, 0x95, 0x0, 0x0, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0xef, 0xfe, - 0xda, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xeb, 0x99, 0x9b, 0xef, 0xf3, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x48, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x10, 0x1, 0x6b, 0xdf, 0xfe, 0xb7, 0x10, - 0x0, 0x0, 0xf, 0xff, 0xf0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xfe, 0x86, 0x56, - 0x9e, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, - 0xf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x0, 0xef, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0xc, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x70, 0x9f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x6, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x80, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0xaf, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x30, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x8, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xe9, 0x65, 0x69, 0xef, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, - 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, - - /* U+0037 "7" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xcf, 0xff, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0xaf, 0xff, 0xf0, 0xcf, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0xcf, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x20, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfb, 0x0, 0xcf, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, - 0x9c, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x0, 0x0, 0x15, 0xac, 0xef, 0xfd, 0xc8, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfe, 0x96, - 0x55, 0x7a, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, - 0xf4, 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x2, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, - 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf0, 0x1, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, - 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xa0, 0x0, 0x7f, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, - 0xcf, 0xff, 0xf8, 0x41, 0x0, 0x15, 0xaf, 0xff, - 0xf8, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x20, 0x0, 0x6, 0xff, 0xff, - 0xf9, 0x53, 0x22, 0x36, 0xbf, 0xff, 0xfe, 0x20, - 0x2, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, - 0x3d, 0xff, 0xfd, 0x0, 0xaf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, 0xf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xc2, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x3f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf2, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xfe, 0xf, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xb0, 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf6, 0x2, 0xff, 0xff, 0xd4, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, - 0x7, 0xff, 0xff, 0xfd, 0x96, 0x55, 0x7a, 0xef, - 0xff, 0xff, 0x30, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, - 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, - 0xfe, 0xca, 0x61, 0x0, 0x0, 0x0, - - /* U+0039 "9" */ - 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfd, 0xc8, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xfc, 0x86, 0x57, 0xaf, - 0xff, 0xff, 0x70, 0x0, 0xb, 0xff, 0xfe, 0x40, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x3f, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xfd, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x50, 0xcf, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xb0, - 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf1, 0xdf, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xbf, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xf7, 0x7f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xf9, 0x1f, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfa, 0x7, - 0xff, 0xff, 0xe7, 0x30, 0x1, 0x4a, 0xff, 0xfe, - 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd5, 0xff, 0xfb, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x14, 0xff, 0xfb, - 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, 0xfa, 0x40, - 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2, 0x45, - 0x42, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, - 0x0, 0x1a, 0x30, 0x0, 0x0, 0x0, 0x4d, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x9f, 0xfe, 0xa9, 0x89, - 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, - 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, - - /* U+003A ":" */ - 0x1, 0xbf, 0xc2, 0x0, 0xcf, 0xff, 0xd0, 0x1f, - 0xff, 0xff, 0x20, 0xff, 0xff, 0xf1, 0x9, 0xff, - 0xfa, 0x0, 0x5, 0x96, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x59, 0x60, 0x0, 0x9f, 0xff, 0xa0, 0xf, - 0xff, 0xff, 0x11, 0xff, 0xff, 0xf2, 0xc, 0xff, - 0xfd, 0x0, 0x2b, 0xfc, 0x20, - - /* U+003B ";" */ - 0x1, 0xbf, 0xc2, 0x0, 0xcf, 0xff, 0xd0, 0x1f, - 0xff, 0xff, 0x20, 0xff, 0xff, 0xf1, 0x9, 0xff, - 0xfa, 0x0, 0x5, 0x96, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x36, 0x40, 0x0, 0x6f, 0xff, 0x80, 0xe, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xf2, 0xc, 0xff, - 0xff, 0x0, 0x2d, 0xff, 0xc0, 0x0, 0x8f, 0xf7, - 0x0, 0xc, 0xff, 0x10, 0x0, 0xff, 0xc0, 0x0, - 0x4f, 0xf7, 0x0, 0x8, 0xff, 0x20, 0x0, 0xcf, - 0xc0, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x29, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x8e, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xd6, 0x0, - 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xf9, 0x30, - 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xfc, 0x60, - 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0x93, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xc6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xbf, 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xe9, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, - 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x8e, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6c, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x50, - - /* U+003D "=" */ - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x95, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x91, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x95, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, - - /* U+003E ">" */ - 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd7, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, - 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x17, 0xef, 0xff, 0xff, 0xfa, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, - 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, - 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xaf, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, - 0xff, 0xd4, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, - 0xff, 0xfa, 0x30, 0x0, 0x0, 0x4, 0xaf, 0xff, - 0xff, 0xfd, 0x71, 0x0, 0x0, 0x1, 0x7d, 0xff, - 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xeb, 0x83, - 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0xaf, 0xff, 0xff, 0xea, 0x98, 0x9b, 0xff, 0xff, - 0xff, 0x20, 0x5f, 0xff, 0xfc, 0x40, 0x0, 0x0, - 0x1, 0x9f, 0xff, 0xfa, 0x0, 0x6f, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf0, 0x0, - 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xac, 0xcc, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xde, 0x80, 0x0, 0x0, 0x0, - 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, - 0xbd, 0xef, 0xfe, 0xda, 0x84, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xfd, - 0xcb, 0xcd, 0xef, 0xff, 0xff, 0xfa, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, - 0xff, 0xc7, 0x30, 0x0, 0x0, 0x0, 0x14, 0x9e, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2d, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xe5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0x90, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x10, 0x0, 0x0, 0x1, 0x22, 0x10, - 0x3f, 0xff, 0x50, 0x0, 0x0, 0x6, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x28, 0xdf, 0xff, 0xfc, 0x71, - 0x0, 0xcf, 0xfb, 0x0, 0x4f, 0xfe, 0x10, 0x0, - 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xe6, 0xc, 0xff, 0xb0, 0x0, - 0x9f, 0xf8, 0x0, 0x0, 0x7f, 0xfb, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xcf, 0xfb, 0x0, 0x1, 0xff, 0xf0, 0x0, 0xd, - 0xff, 0x40, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x41, - 0x1, 0x4b, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x8, - 0xff, 0x50, 0x3, 0xff, 0xd0, 0x0, 0x0, 0x5f, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x7f, 0xf8, - 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xdf, - 0xf0, 0xa, 0xff, 0x40, 0x0, 0x4, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, - 0x0, 0x0, 0xa, 0xff, 0x20, 0xdf, 0xf1, 0x0, - 0x0, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x7f, 0xf4, - 0xf, 0xff, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, - 0x0, 0x5, 0xff, 0x50, 0xff, 0xe0, 0x0, 0x0, - 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xf6, 0x1f, - 0xfd, 0x0, 0x0, 0xd, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, - 0x4, 0xff, 0x60, 0xff, 0xe0, 0x0, 0x0, 0xdf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xb0, 0x0, 0x0, 0x5f, 0xf5, 0xf, 0xff, - 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x0, 0x7, - 0xff, 0x40, 0xdf, 0xf1, 0x0, 0x0, 0x7f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xb0, 0x0, 0x0, 0x9f, 0xf2, 0xa, 0xff, 0x40, - 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, 0xd, 0xff, - 0x0, 0x7f, 0xf8, 0x0, 0x0, 0xc, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, - 0x0, 0x2, 0xff, 0xa0, 0x2, 0xff, 0xd0, 0x0, - 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0x10, 0x0, 0xbf, 0xf5, 0x0, - 0xd, 0xff, 0x40, 0x0, 0x0, 0x8f, 0xff, 0xfc, - 0x63, 0x23, 0x6d, 0xff, 0xf8, 0xff, 0xfb, 0x33, - 0xaf, 0xfd, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0xef, 0xf5, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, - 0xff, 0xff, 0xd3, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x6, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x6, 0xbe, 0xff, 0xda, 0x50, 0x0, 0x0, - 0x3a, 0xef, 0xd9, 0x20, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfb, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xff, 0xff, 0xc7, 0x30, 0x0, 0x0, 0x0, 0x26, - 0xbf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, - 0xdc, 0xcd, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, 0xff, - 0xfe, 0xc9, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x1e, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x7f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf3, 0x1, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfd, 0x0, 0xa, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x60, 0x0, 0x3f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf9, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x20, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfc, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x4a, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x3, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x50, 0x0, 0x8, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf3, 0x0, 0x6f, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xa0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x10, - - /* U+0042 "B" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, - 0x95, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0xc, 0xff, 0xf7, - 0x55, 0x55, 0x55, 0x55, 0x68, 0xcf, 0xff, 0xff, - 0x90, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0xff, 0xff, 0x20, 0xc, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf8, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, 0xc, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, - 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x30, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xcf, 0xff, 0xb0, 0x0, 0xcf, 0xff, - 0x75, 0x55, 0x55, 0x55, 0x56, 0x8c, 0xff, 0xff, - 0xd1, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x60, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x5b, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0x70, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xfd, 0xc, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf1, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x3c, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xf3, 0xcf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x2c, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xe0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, - 0xc, 0xff, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x56, - 0x7a, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc9, 0x60, - 0x0, 0x0, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xad, 0xef, - 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xec, - 0xab, 0xcf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x4, - 0xaf, 0xff, 0xff, 0x20, 0x0, 0x2e, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, - 0x50, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x5, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0x50, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3d, 0xff, 0x60, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xe7, 0x20, 0x0, 0x0, 0x4, 0xaf, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xeb, 0xab, 0xcf, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, - 0xad, 0xef, 0xfe, 0xc9, 0x40, 0x0, 0x0, 0x0, - - /* U+0044 "D" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xda, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xa9, 0x99, 0x99, 0x99, - 0x9b, 0xdf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x6d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0x30, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xd0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x50, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xa0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf1, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf1, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xd0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xa0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf7, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xd0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x6d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, - 0xa9, 0x99, 0x99, 0x99, 0x9b, 0xdf, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xda, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0045 "E" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, - 0xff, 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x80, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x97, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x10, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x94, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, - - /* U+0046 "F" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xa9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0xcf, 0xff, 0xa8, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x10, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, - 0xfe, 0xca, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xec, - 0xbb, 0xce, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x3, - 0x8e, 0xff, 0xff, 0x60, 0x0, 0x2e, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, - 0x90, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x90, 0x0, 0x5, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4a, 0xaa, 0x40, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, - 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0xcf, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf7, 0x8, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0x70, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, 0x0, 0xdf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x70, 0x5, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf7, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, - 0x2e, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xe8, 0x20, 0x0, 0x0, 0x1, 0x7d, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xec, 0xaa, 0xbe, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, - 0xad, 0xef, 0xfd, 0xc9, 0x51, 0x0, 0x0, 0x0, - - /* U+0048 "H" */ - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, - 0xa9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0xef, 0xff, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x40, - - /* U+0049 "I" */ - 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, - 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, - 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, - 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, - 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, - 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, - 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, - 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, - 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, - 0x30, - - /* U+004A "J" */ - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x4, 0x99, 0x99, 0x99, - 0x99, 0x9b, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x0, 0x64, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, 0x4, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, - 0x1e, 0xff, 0xf7, 0x0, 0x0, 0x4, 0xef, 0xff, - 0xa0, 0xc, 0xff, 0xff, 0xfb, 0x99, 0xcf, 0xff, - 0xff, 0x20, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x17, 0xbe, - 0xff, 0xda, 0x60, 0x0, 0x0, - - /* U+004B "K" */ - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xf7, 0xc, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf9, - 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xfa, 0x0, 0xc, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xfb, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0xc, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xc, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, - 0x0, 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf3, 0x0, 0x6, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf3, 0x4, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x33, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xe2, 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xe2, 0x0, 0xb, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xc, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0xc, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, - 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xd1, 0x0, 0xcf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xb0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x50, - - /* U+004C "L" */ - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xa9, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x93, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, - - /* U+004D "M" */ - 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xcf, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xcf, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xcf, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xcf, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xfc, 0xef, 0xff, 0xcf, - 0xff, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf3, 0xef, 0xff, 0xcf, 0xff, - 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0x90, 0xdf, 0xff, 0xcf, 0xff, 0x0, - 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x10, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x5f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, - 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0xc, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, - 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x3, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0xdf, - 0xff, 0xcf, 0xff, 0x0, 0x0, 0x9f, 0xff, 0x50, - 0x0, 0x1, 0xff, 0xfb, 0x0, 0x0, 0xdf, 0xff, - 0xcf, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, - 0xa, 0xff, 0xf2, 0x0, 0x0, 0xdf, 0xff, 0xcf, - 0xff, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x3f, - 0xff, 0x90, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, 0xcf, 0xfe, - 0x10, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xa5, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfe, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xcf, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, - - /* U+004E "N" */ - 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf4, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xf4, 0xcf, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, - 0xff, 0xfd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x4d, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x4c, 0xff, 0xf3, 0x2f, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, - 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x9f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, - 0x30, 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x1, 0xef, - 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, - 0xff, 0x30, 0x0, 0x4, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x80, 0x0, 0xb, 0xff, 0xf4, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x40, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xfe, 0x20, 0xb, 0xff, - 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xfd, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, 0xb, - 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf6, 0xbf, 0xff, 0x4c, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xfd, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0x4c, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xf4, 0xcf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x40, - - /* U+004F "O" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, - 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xeb, 0xab, 0xcf, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xe7, 0x20, 0x0, 0x0, 0x4, - 0xaf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2c, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x60, 0x0, 0x5, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf7, 0x0, 0x3f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xd0, 0x8, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x20, 0xcf, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xf6, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x80, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xfa, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, - 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, - 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, 0x8, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x20, 0x3f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0xdf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xf7, 0x0, 0x5, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfe, 0x0, 0x0, 0xb, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xe7, 0x20, 0x0, 0x0, 0x3, 0xaf, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xeb, 0xab, 0xcf, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, - 0xad, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0050 "P" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa6, - 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0xc, 0xff, 0xfa, 0x99, 0x99, 0x99, - 0x9a, 0xdf, 0xff, 0xff, 0xf7, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x17, 0xff, 0xff, - 0xf4, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xc0, 0xcf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0x3c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf8, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xac, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfc, 0xcf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xcc, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xfa, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x8c, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf3, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xfd, 0xc, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0x40, - 0xcf, 0xff, 0xa9, 0x99, 0x99, 0x99, 0xad, 0xff, - 0xff, 0xff, 0x70, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x20, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xda, 0x72, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, - 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xeb, 0xab, 0xcf, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe7, - 0x20, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x8, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0xbf, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0xe, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x1f, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, - 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, - 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, - 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x20, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xe0, 0x0, 0x0, 0xef, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xf7, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x10, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xd5, 0x0, 0x0, 0x0, 0x2, 0x8f, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xc9, 0x89, 0xad, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xff, 0xfe, - 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xfe, 0x85, 0x47, 0xcf, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xd9, 0x30, - 0x0, 0x0, - - /* U+0052 "R" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa6, - 0x10, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, 0xa9, 0x99, - 0x99, 0x99, 0xad, 0xff, 0xff, 0xff, 0x50, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x17, - 0xff, 0xff, 0xf3, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfb, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x20, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x70, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xa0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xc0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x90, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x14, 0x8e, - 0xff, 0xff, 0xd0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa1, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x98, 0x88, 0x88, 0x87, 0x7f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xa0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x20, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xd0, - - /* U+0053 "S" */ - 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, 0xda, - 0x62, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xb9, - 0x88, 0x9c, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xcf, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, - 0x30, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x80, 0x0, 0x8, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfe, 0xa6, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xe9, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xae, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x7f, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xb0, 0xe, 0xff, 0xfb, 0x51, - 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xf4, 0x2, - 0xef, 0xff, 0xff, 0xfc, 0xa9, 0x88, 0xad, 0xff, - 0xff, 0xf9, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, 0xce, 0xff, - 0xfe, 0xb8, 0x30, 0x0, 0x0, 0x0, - - /* U+0054 "T" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x79, 0x99, 0x99, 0x99, - 0x9a, 0xff, 0xfe, 0x99, 0x99, 0x99, 0x99, 0x92, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0055 "U" */ - 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xfa, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xfa, 0xf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0xf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0xf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xa0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, - 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x90, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf8, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0xcf, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf5, 0x8, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x5f, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xe0, 0x0, 0xef, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, - 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0x10, 0x0, 0xd, 0xff, 0xff, - 0xb3, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xfe, 0xca, 0xbc, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x5a, 0xde, 0xff, 0xdc, 0x84, 0x0, - 0x0, 0x0, 0x0, - - /* U+0056 "V" */ - 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x6, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x70, 0x0, 0x8f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x10, 0x0, 0x2f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf9, 0x0, 0x0, 0xb, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf2, 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, - 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x5, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf8, 0x0, 0xc, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xfe, 0x0, 0x3f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x50, 0xaf, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xc1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xfb, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0057 "W" */ - 0x8f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x93, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf4, 0xe, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, - 0x0, 0x9f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x4, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf4, 0x0, 0xe, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf9, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x4, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf5, 0x0, 0x0, 0xf, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x9f, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf5, 0x3, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, - 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, - 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x60, 0x0, - 0x0, 0x5, 0xff, 0xf5, 0x0, 0x3, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, - 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf1, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, - 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0xcf, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, - 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x4, 0xff, - 0xf8, 0x0, 0x0, 0x1f, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, 0x0, 0xaf, - 0xff, 0x10, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, - 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0xbf, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x50, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf8, 0x0, 0x1f, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, 0xaf, - 0xff, 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, - 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf0, 0xf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0xbf, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x45, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf8, 0x1f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xbf, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xd6, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xef, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xdf, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0058 "X" */ - 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xf5, 0x0, 0xc, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfa, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xfe, 0x10, 0x0, 0xd, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfb, 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, - 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, 0xef, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x6f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0x60, 0x9f, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, - 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xe1, 0x0, 0x3, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf5, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, - 0x0, 0x0, 0x1, 0xef, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, - 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x50, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x10, - - /* U+0059 "Y" */ - 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x4, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x20, 0x0, 0xbf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf9, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xe1, 0x0, - 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xf4, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, - 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x4, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf1, 0xd, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf9, 0x7f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+005A "Z" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9e, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xfa, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x91, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x24, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, - - /* U+005B "[" */ - 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xff, 0xff, 0xff, - 0xf9, 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xff, 0xf4, - 0x44, 0x42, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, - 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, - 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, - 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, - 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, - 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, - 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, - 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, - 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, - 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, - 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, - 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, - 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, - 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, - 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, - 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, - 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf4, - 0x33, 0x32, 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xff, - 0xff, 0xff, 0xf9, 0xcf, 0xff, 0xff, 0xff, 0x90, - - /* U+005C "\\" */ - 0x38, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, - - /* U+005D "]" */ - 0x3f, 0xff, 0xff, 0xff, 0xf2, 0x3f, 0xff, 0xff, - 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xf2, 0x4, - 0x44, 0x4c, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, - 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, - 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, - 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, - 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, - 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, - 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, - 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, - 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, - 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, - 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, - 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, - 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, - 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, - 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, - 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, - 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, - 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, - 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, - 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x3, - 0x33, 0x3c, 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, - 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xf2, 0x3f, 0xff, - 0xff, 0xff, 0xf2, - - /* U+005E "^" */ - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xcf, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x2c, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xfc, 0x6, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf5, 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xe0, 0x0, 0x9f, 0xf6, 0x0, 0x0, - 0x0, 0x7, 0xff, 0x80, 0x0, 0x3f, 0xfc, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0xc, 0xff, - 0x30, 0x0, 0x0, 0x4f, 0xfb, 0x0, 0x0, 0x6, - 0xff, 0x90, 0x0, 0x0, 0xbf, 0xf5, 0x0, 0x0, - 0x0, 0xff, 0xf1, 0x0, 0x2, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x8, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, 0xe, 0xff, - 0x10, 0x0, 0x0, 0x0, 0xc, 0xff, 0x40, 0x6f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xb0, - 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf1, - - /* U+005F "_" */ - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - - /* U+0060 "`" */ - 0x7, 0x88, 0x86, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xef, - 0xf8, - - /* U+0061 "a" */ - 0x0, 0x0, 0x48, 0xbd, 0xef, 0xed, 0x95, 0x0, - 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x30, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x1, 0xef, 0xff, 0xfb, - 0x87, 0x79, 0xcf, 0xff, 0xff, 0x20, 0x7, 0xfc, - 0x50, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xf9, 0x0, - 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x5, - 0x8b, 0xcd, 0xdd, 0xdd, 0xde, 0xff, 0xf7, 0x0, - 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x3f, 0xff, 0xf9, 0x31, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x7a, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xf7, 0xef, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x7f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, - 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x7a, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xf7, 0x4f, 0xff, 0xfc, 0x52, 0x11, - 0x4a, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3f, 0xff, 0x70, - 0x0, 0x17, 0xce, 0xff, 0xda, 0x60, 0x3, 0xff, - 0xf7, - - /* U+0062 "b" */ - 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf7, 0x0, 0x16, 0xbd, 0xff, 0xeb, 0x61, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x5e, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, - 0xf7, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x5f, 0xff, 0xef, 0xff, 0xfc, 0x97, - 0x9b, 0xff, 0xff, 0xfd, 0x10, 0x5, 0xff, 0xff, - 0xff, 0xb2, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xfb, - 0x0, 0x5f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf5, 0x5, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, - 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x15, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x5f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x85, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x5f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x95, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf7, 0x5f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0x55, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf1, 0x5f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x5, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0x50, 0x5f, 0xff, 0xff, 0xfb, 0x20, - 0x0, 0x0, 0x1a, 0xff, 0xff, 0xb0, 0x5, 0xff, - 0xfc, 0xff, 0xff, 0xc9, 0x79, 0xbf, 0xff, 0xff, - 0xe1, 0x0, 0x5f, 0xff, 0x59, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x5, 0xff, 0xf5, - 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x5f, 0xff, 0x50, 0x1, 0x6b, 0xdf, 0xfe, - 0xb6, 0x10, 0x0, 0x0, 0x0, - - /* U+0063 "c" */ - 0x0, 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xb6, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xd9, 0x78, 0xaf, 0xff, - 0xff, 0xb0, 0x0, 0x5f, 0xff, 0xfc, 0x30, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x40, 0xe, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xfe, 0x40, 0x7, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, - 0x0, 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xe5, 0x0, 0x5, 0xff, 0xff, 0xc3, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x8, 0xff, - 0xff, 0xfd, 0x97, 0x8a, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x38, 0xce, 0xff, 0xeb, 0x61, 0x0, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, 0xc7, 0x20, - 0x3, 0xff, 0xfa, 0x0, 0x0, 0x5, 0xef, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xa0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, - 0xff, 0xfa, 0x0, 0xa, 0xff, 0xff, 0xfc, 0x97, - 0x8b, 0xff, 0xff, 0xef, 0xff, 0xa0, 0x7, 0xff, - 0xff, 0xc3, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, - 0xfa, 0x1, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, - 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xa1, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x3f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xa4, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x4f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xa3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xfa, 0x1f, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xa0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xfa, 0x7, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa0, - 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xfa, 0x0, 0x7f, 0xff, 0xfc, 0x30, - 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0xaf, 0xff, 0xff, 0xd9, 0x78, 0xbf, 0xff, 0xfc, - 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xa0, 0x0, 0x0, - 0x6e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, - 0x72, 0x0, 0xf, 0xff, 0xa0, - - /* U+0065 "e" */ - 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xd9, 0x65, 0x7a, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x6f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x1a, 0xff, 0xfe, 0x10, 0x1, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x90, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf0, 0xd, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, - 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf9, 0x3f, 0xff, 0xed, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xff, 0xfb, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xc0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x40, - 0x0, 0x0, 0x1, 0xaf, 0xfa, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xfd, 0x98, 0x79, 0xcf, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfd, 0xc8, 0x30, - 0x0, 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x0, 0x2, 0x9d, 0xff, 0xea, 0x40, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x64, 0x6c, 0xa0, - 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x13, 0x33, 0xdf, 0xff, 0x43, 0x33, 0x33, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, - 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x6e, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x20, 0xbf, 0xfe, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4b, 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, 0xc9, - 0x78, 0x9d, 0xff, 0xff, 0xef, 0xfe, 0x0, 0x9f, - 0xff, 0xfb, 0x20, 0x0, 0x0, 0x4, 0xdf, 0xff, - 0xff, 0xe0, 0x2f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xfe, 0x9, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xe0, 0xef, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfe, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe4, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xfe, 0x4f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe4, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfe, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0xef, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfe, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xe0, 0x2f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfe, - 0x0, 0x8f, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x5, - 0xef, 0xff, 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, - 0xd9, 0x78, 0xae, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3e, 0xff, 0xe0, 0x0, 0x0, 0x6e, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x20, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, 0x0, 0xf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf4, 0x0, 0xc, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, - 0x6, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x1a, - 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, 0xff, 0xea, - 0x87, 0x79, 0xcf, 0xff, 0xff, 0xb0, 0x0, 0x5, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x7a, 0xde, 0xff, 0xec, 0x95, 0x0, 0x0, - 0x0, - - /* U+0068 "h" */ - 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf7, 0x0, 0x16, 0xbd, 0xff, 0xda, 0x60, 0x0, - 0x0, 0x5f, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x5, 0xff, 0xf8, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xfb, 0x99, 0xae, 0xff, 0xff, 0xf3, - 0x5, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xc0, 0x5f, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x25, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, - 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0x95, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xfb, 0x5f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc0, - - /* U+0069 "i" */ - 0x0, 0x37, 0x40, 0x0, 0x7f, 0xff, 0x90, 0xe, - 0xff, 0xff, 0x10, 0xff, 0xff, 0xf1, 0x9, 0xff, - 0xfa, 0x0, 0x6, 0x96, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x5f, - 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, - 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, - 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, 0x5, - 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, 0x5, 0xff, - 0xf7, 0x0, 0x5f, 0xff, 0x70, 0x5, 0xff, 0xf7, - 0x0, 0x5f, 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, - 0x5f, 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, - 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, - 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, - - /* U+006A "j" */ - 0x0, 0x0, 0x0, 0x0, 0x27, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x97, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf8, 0x0, 0x10, 0x0, 0x0, 0xdf, - 0xff, 0x40, 0xc, 0xc7, 0x57, 0xdf, 0xff, 0xe0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x5b, 0xef, - 0xfd, 0x92, 0x0, 0x0, - - /* U+006B "k" */ - 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x30, 0x5f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, - 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0x40, 0x0, 0x5f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x5f, - 0xff, 0x70, 0x0, 0x0, 0xa, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0xbf, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, - 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0x70, 0x1, 0xcf, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x1d, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x71, 0xdf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xae, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xfe, 0x39, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe2, 0x0, 0xcf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, - 0x20, 0x0, 0x1e, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xd2, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x5f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, - 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfa, 0x0, 0x5f, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x60, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf3, - - /* U+006C "l" */ - 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, - 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, - 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, - 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, - 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, - 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, - 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, - 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, - 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, - 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x70, - - /* U+006D "m" */ - 0x5f, 0xff, 0x50, 0x2, 0x8c, 0xef, 0xec, 0x93, - 0x0, 0x0, 0x0, 0x16, 0xbe, 0xff, 0xeb, 0x71, - 0x0, 0x0, 0x5f, 0xff, 0x51, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xa1, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x5f, 0xff, 0x6d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xb7, 0x56, 0x8e, 0xff, 0xff, 0xbb, - 0xff, 0xff, 0xa6, 0x56, 0xaf, 0xff, 0xff, 0x50, - 0x5f, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0xd0, 0x5f, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf4, 0x5f, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x5f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, - 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xfc, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfd, - - /* U+006E "n" */ - 0x5f, 0xff, 0x50, 0x2, 0x7b, 0xdf, 0xfd, 0xa6, - 0x0, 0x0, 0x5, 0xff, 0xf5, 0x19, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x40, 0x0, 0x5f, 0xff, 0x6d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x5, - 0xff, 0xff, 0xff, 0xfc, 0x86, 0x57, 0xbf, 0xff, - 0xff, 0x30, 0x5f, 0xff, 0xff, 0xe4, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xfc, 0x5, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x5f, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0x65, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf9, 0x5f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb5, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, - 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, - - /* U+006F "o" */ - 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa6, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc9, - 0x78, 0xaf, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x5f, - 0xff, 0xfc, 0x30, 0x0, 0x0, 0x18, 0xff, 0xff, - 0xc0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x60, 0x7, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, - 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf3, 0xf, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x73, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf9, 0x4f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xb4, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xfa, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf7, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x30, 0x7f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, - 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xc3, - 0x0, 0x0, 0x1, 0x8f, 0xff, 0xfb, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xfd, 0x97, 0x8b, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xce, 0xff, - 0xda, 0x60, 0x0, 0x0, 0x0, - - /* U+0070 "p" */ - 0x5f, 0xff, 0x50, 0x1, 0x6b, 0xdf, 0xfe, 0xb6, - 0x10, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x5f, - 0xff, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x5, 0xff, 0xfe, 0xff, 0xfe, 0x85, - 0x45, 0x8e, 0xff, 0xff, 0xd1, 0x0, 0x5f, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xb0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, - 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf1, 0x5f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x55, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf8, 0x5f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x95, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf9, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x75, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf5, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x15, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, - 0x5f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf5, 0x5, 0xff, 0xff, 0xff, 0xb2, - 0x0, 0x0, 0x2, 0xaf, 0xff, 0xfb, 0x0, 0x5f, - 0xff, 0xdf, 0xff, 0xfc, 0x97, 0x9b, 0xff, 0xff, - 0xfe, 0x10, 0x5, 0xff, 0xf7, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x5f, 0xff, - 0x70, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x5, 0xff, 0xf7, 0x0, 0x5, 0xbd, 0xff, - 0xeb, 0x61, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0071 "q" */ - 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x72, - 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x5e, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0xff, 0xfa, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x1f, 0xff, 0xa0, 0x0, 0xaf, 0xff, 0xff, 0xc9, - 0x78, 0xbf, 0xff, 0xfc, 0xff, 0xfa, 0x0, 0x7f, - 0xff, 0xfc, 0x30, 0x0, 0x0, 0x18, 0xff, 0xff, - 0xff, 0xa0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xfa, 0x8, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xa0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xfa, 0x1f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa3, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xfa, 0x4f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa4, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xfa, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa1, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfa, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xa0, 0x7f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, - 0x1, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xa0, 0x7, 0xff, 0xff, 0xc3, - 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xfa, 0x0, - 0xa, 0xff, 0xff, 0xfd, 0x97, 0x8b, 0xff, 0xff, - 0xdf, 0xff, 0xa0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc3, 0xff, 0xfa, 0x0, 0x0, - 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, - 0xc7, 0x10, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xfa, - - /* U+0072 "r" */ - 0x5f, 0xff, 0x50, 0x1, 0x6b, 0xdf, 0x5, 0xff, - 0xf5, 0x7, 0xff, 0xff, 0xf0, 0x5f, 0xff, 0x5a, - 0xff, 0xff, 0xff, 0x5, 0xff, 0xfb, 0xff, 0xff, - 0xfd, 0xc0, 0x5f, 0xff, 0xff, 0xfb, 0x30, 0x0, - 0x5, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xdb, 0x83, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x60, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8, 0xff, 0xff, - 0xd8, 0x66, 0x78, 0xcf, 0xff, 0x60, 0x0, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x18, 0xc0, 0x0, - 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xc4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xb8, 0x52, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa4, 0x0, - 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x4, 0x7a, 0xdf, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, - 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xc0, 0x1f, 0xf9, 0x30, 0x0, 0x0, 0x0, - 0x1b, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xea, 0x87, - 0x78, 0xaf, 0xff, 0xff, 0x10, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x6d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, - 0x0, 0x3, 0x7a, 0xde, 0xff, 0xec, 0x83, 0x0, - 0x0, - - /* U+0074 "t" */ - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x13, 0x33, 0xdf, 0xff, 0x43, 0x33, 0x33, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x75, 0x7d, 0xb0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x4, 0xae, 0xff, 0xd9, 0x20, - - /* U+0075 "u" */ - 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x69, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf6, 0x9f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x69, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xf6, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x69, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0x9f, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x69, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf6, 0x9f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x69, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xf6, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x69, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0x8f, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x67, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf6, 0x6f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x63, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, - 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0x60, 0x8f, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xf6, 0x1, 0xef, 0xff, - 0xff, 0xb9, 0x9a, 0xef, 0xff, 0xdf, 0xff, 0x60, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, - 0xff, 0xf6, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x49, - 0xde, 0xfe, 0xc7, 0x20, 0x3, 0xff, 0xf6, - - /* U+0076 "v" */ - 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf3, 0x7, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, - 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x50, 0x0, 0x9f, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x0, - 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf8, 0x0, 0x0, 0xc, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, - 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xd0, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0xc, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xfa, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x10, 0x0, 0xaf, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x70, 0x1, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x7, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xf5, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x5f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xdf, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - - /* U+0077 "w" */ - 0x9f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf8, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf2, 0xd, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xd0, 0x8, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, - 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x10, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xfe, 0xef, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x7f, 0xff, 0x20, - 0x0, 0x0, 0x0, 0xef, 0xf8, 0x9f, 0xff, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf6, 0x0, 0x0, 0x1f, - 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, 0xf2, 0x3f, - 0xff, 0x50, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, - 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, - 0xd0, 0xd, 0xff, 0xb0, 0x0, 0x0, 0xc, 0xff, - 0xa0, 0x0, 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, - 0x1f, 0xff, 0x70, 0x7, 0xff, 0xf1, 0x0, 0x0, - 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xff, 0xf9, - 0x0, 0x0, 0x6f, 0xff, 0x10, 0x1, 0xff, 0xf6, - 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xfe, 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x0, - 0xbf, 0xfc, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x40, 0x2, 0xff, 0xf5, - 0x0, 0x0, 0x5f, 0xff, 0x20, 0x3, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xa0, 0x7, - 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, 0x70, 0x9, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf0, 0xd, 0xff, 0x90, 0x0, 0x0, 0xa, 0xff, - 0xd0, 0xe, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf5, 0x3f, 0xff, 0x30, 0x0, 0x0, - 0x4, 0xff, 0xf3, 0x4f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x9f, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xf8, 0xaf, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xef, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, - - /* U+0078 "x" */ - 0xa, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xb0, 0x1, 0xdf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xfe, 0x10, 0x0, 0x3f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf3, - 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x80, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x10, - 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xc9, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xfe, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x54, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xfa, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, 0xc, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, - 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0xc, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xfa, 0x0, 0x5, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0x2e, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf2, - - /* U+0079 "y" */ - 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf3, 0x6, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, - 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x50, 0x0, 0x9f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x0, - 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, - 0x0, 0x4, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x90, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xe0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0xc, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xfc, 0x0, 0x0, 0x3f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x9f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xa0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x7, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf7, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x5f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, - 0xbf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xfd, 0x86, 0x8e, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xef, 0xec, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x36, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x15, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x56, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, - - /* U+007B "{" */ - 0x0, 0x0, 0x0, 0x6c, 0xef, 0xf4, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, 0xc6, 0x41, - 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xf1, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x34, 0x7f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xb5, 0x31, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6c, - 0xef, 0xf4, - - /* U+007C "|" */ - 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, - 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, - 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, - 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, - 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, - 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, - 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, - 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, - 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, - 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, - - /* U+007D "}" */ - 0x3f, 0xfe, 0xc6, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x4, 0x5b, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0xe, 0xff, 0xf8, 0x43, 0x0, 0x0, 0x2f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x70, 0x0, 0x3, 0x5b, 0xff, 0xff, 0x30, 0x0, - 0x3f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x3f, 0xfe, 0xc7, 0x0, - 0x0, 0x0, - - /* U+007E "~" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x9e, 0xff, 0xa3, 0x0, 0x0, - 0x0, 0x7, 0xcb, 0x1, 0xef, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0xcf, 0xd0, 0xbf, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x2f, 0xfa, 0x2f, 0xff, - 0x50, 0x2a, 0xff, 0xfd, 0x41, 0x3d, 0xff, 0x66, - 0xff, 0x60, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x9f, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xf4, 0x7, 0xba, 0x0, 0x0, 0x0, 0x0, - 0x8d, 0xfe, 0xa2, 0x0, - - /* U+00B0 "°" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7e, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xdf, 0xe6, - 0x10, 0x29, 0xff, 0x90, 0x7, 0xfe, 0x20, 0x0, - 0x0, 0x6f, 0xf3, 0xe, 0xf7, 0x0, 0x0, 0x0, - 0xb, 0xfa, 0x1f, 0xf2, 0x0, 0x0, 0x0, 0x6, - 0xfd, 0x2f, 0xf1, 0x0, 0x0, 0x0, 0x5, 0xfe, - 0x1f, 0xf3, 0x0, 0x0, 0x0, 0x7, 0xfd, 0xd, - 0xf8, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x6, 0xff, - 0x40, 0x0, 0x0, 0x9f, 0xf2, 0x0, 0xbf, 0xfa, - 0x53, 0x6c, 0xff, 0x70, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4b, 0xef, 0xd9, - 0x30, 0x0, - - /* U+2022 "•" */ - 0x0, 0x16, 0x84, 0x0, 0x3, 0xef, 0xff, 0xa0, - 0xe, 0xff, 0xff, 0xf7, 0x4f, 0xff, 0xff, 0xfc, - 0x5f, 0xff, 0xff, 0xfd, 0x2f, 0xff, 0xff, 0xfa, - 0xa, 0xff, 0xff, 0xf2, 0x0, 0x8e, 0xfc, 0x30, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xcf, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x9e, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x48, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x59, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x94, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc7, 0x20, 0x0, 0xf, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xcf, - 0xfe, 0xcf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0x9c, 0xff, - 0xec, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x10, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x39, 0xdf, 0xff, 0xd9, 0x30, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x9d, 0xff, 0xfd, 0x93, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F008 "" */ - 0x5e, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x8, 0xe5, 0xef, 0x80, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x8, 0xfe, - 0xff, 0xe8, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd8, 0x88, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1d, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0xb, 0xff, - 0xff, 0x80, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x40, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0xb, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x8, 0xff, - 0xff, 0x80, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x40, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, 0x1d, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe8, 0x88, 0x9f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xd8, 0x88, 0x8e, 0xff, 0xff, 0x80, 0x0, 0xb, - 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xff, 0xff, 0x50, 0x0, 0x8, 0xff, - 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x8, 0xff, - 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, - 0x50, 0x0, 0x8, 0xff, 0xff, 0xe8, 0x88, 0x9f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xd8, 0x88, 0x8e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x1d, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x80, 0x0, 0xb, 0xff, 0xff, 0x80, 0x0, 0xb, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x8, 0xff, - 0xff, 0x80, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x40, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0xb, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x8, 0xff, - 0xff, 0xa0, 0x0, 0x1d, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x88, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd8, 0x88, 0x8e, 0xff, - 0xef, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x8, 0xfe, 0x5e, 0x80, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x8, 0xe5, - - /* U+F00B "" */ - 0x3, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x2, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x30, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x2a, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x0, 0x19, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x5e, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, - 0x44, 0x10, 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x2a, 0xbb, 0xbb, 0xbb, - 0xbb, 0x80, 0x0, 0x19, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa2, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xbd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x5, 0xdb, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x22, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xcc, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x0, 0x17, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x79, 0x40, 0x0, 0x2, 0xef, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xf8, 0x0, 0x1e, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0x80, 0xbf, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf7, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xef, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, - 0xcf, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf4, 0x3f, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xb0, 0x4, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xfb, 0x0, 0x0, 0x3b, 0xc7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xac, 0x80, 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xe3, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x3e, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfd, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, 0x0, - 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x2f, 0xff, 0xff, 0xf2, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x2f, 0xff, 0xff, 0xf2, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x2f, 0xff, 0xff, 0xf2, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xfd, 0x0, 0x3, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x30, - 0x9, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xd0, - 0xf, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf4, 0x5f, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf5, - 0x5f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xf5, 0x4f, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf4, - 0x3f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x78, 0x87, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf1, - 0xd, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xd0, 0x9, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x90, - 0x3, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xef, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x51, 0x0, 0x0, 0x16, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, - 0xff, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x45, 0x54, 0x31, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x34, 0x55, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, - 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, - 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xe6, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe4, 0x0, 0x7f, 0xfb, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xda, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xcc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x40, 0x0, 0x4, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xd3, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa1, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x40, 0x0, 0x4, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xad, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x6e, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, - 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, - 0x0, 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x55, 0x43, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x31, 0x0, 0x0, 0x0, 0x0, - 0x24, 0x44, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0xfd, 0x20, 0x0, 0x2, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xfe, 0x40, 0x0, 0x2f, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x2, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xfd, 0x7d, 0xff, 0xff, 0xff, 0xb3, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xfb, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x5, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x2d, 0xfd, 0x20, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x4e, 0xff, 0xfe, 0x40, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4e, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0x60, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0x50, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xfe, 0x30, - 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd2, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xb1, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xd2, 0x5, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xf5, 0xef, 0xff, 0xff, - 0xf7, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xf4, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x4, 0xff, - 0xff, 0xf7, 0xa, 0xff, 0xd2, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x30, 0x2, 0xdf, 0xfa, - 0x0, 0xc, 0xb1, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x1, 0xbc, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, - 0xbb, 0xbb, 0xbb, 0xbb, 0xb3, 0x0, 0x0, 0x0, - 0x3, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0x10, 0x0, - 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xbc, 0xcc, 0xcc, 0xcb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xcc, 0xcc, 0xcc, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x42, 0x0, 0x4f, 0xff, 0xff, 0xf4, - 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x4, 0xff, 0xff, 0x40, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x4f, 0xf4, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc8, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x2, 0xef, 0x90, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xbf, - 0x30, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x46, 0xff, 0xc4, 0x6f, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, - - /* U+F01C "" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xfe, 0x10, 0x0, - 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x5, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xf5, 0x1, 0xef, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xe1, 0x9f, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 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, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x3c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x30, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x25, 0x67, 0x75, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x40, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc1, 0x5f, 0xff, 0xff, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xa6, 0x42, 0x24, 0x7b, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x5f, 0xff, 0xff, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfe, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xe, 0xff, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x6f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x21, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0x4, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x9, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3, 0x55, 0x55, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x55, 0x53, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x47, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x67, 0x77, 0x40, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xc0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0x30, - 0xff, 0xff, 0xff, 0xff, 0xec, 0xdd, 0xef, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf6, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x50, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xef, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xb7, 0x42, 0x24, 0x6b, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0xff, 0xff, 0xf5, 0x1c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xf5, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf6, 0x0, - 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x14, 0x67, 0x76, 0x52, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1a, 0xb3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0x3, 0x44, 0x44, 0x44, 0x44, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2a, 0xbb, - 0xbb, 0xbb, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x33, 0x33, 0x33, 0x33, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x2, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xcf, 0xd2, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x4, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, - 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x4e, - 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xdf, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x2, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x2d, 0xff, 0xf7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x1, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5, - 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xef, - 0xe4, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x14, 0x10, - 0x0, 0x3b, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2a, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1a, 0xb3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x16, 0x40, 0x0, - 0x0, 0xbf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xb1, 0x0, 0x0, - 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xd2, 0x0, 0x2, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xe1, 0x0, 0x8, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xc0, 0x0, 0xe, 0xff, 0xf4, 0x0, - 0x34, 0x44, 0x44, 0x44, 0x4d, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x60, 0x0, 0x6f, 0xff, 0xa0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x7, 0xff, 0xfe, - 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xd, 0xfe, 0x30, 0x0, 0xc, 0xff, 0xf6, 0x0, - 0xa, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5, 0xff, - 0xff, 0x30, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x5f, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x2f, 0xff, 0xfe, - 0x0, 0x0, 0xdf, 0xff, 0x10, 0x2, 0xff, 0xfb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x3e, 0xff, 0xf7, 0x0, - 0x9, 0xff, 0xf4, 0x0, 0xe, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x5f, - 0xff, 0x60, 0x0, 0xdf, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0xdf, 0xfe, 0x0, 0x4, 0xff, 0xf7, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0xd, 0xff, 0xe0, 0x0, 0x4f, 0xff, 0x70, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2, 0xff, - 0xfc, 0x0, 0x5, 0xff, 0xf6, 0x0, 0xd, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x3, 0xdf, 0xff, 0x70, - 0x0, 0x9f, 0xff, 0x40, 0x0, 0xff, 0xfd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, 0xd, - 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x4, 0xff, 0xfc, - 0x0, 0x5, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, - 0xdf, 0xe3, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, - 0xaf, 0xff, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x30, - 0x0, 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x1f, 0xff, - 0xf0, 0x2a, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xfc, 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfe, 0x10, - 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfd, 0x20, 0x0, 0x2f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xfb, 0x10, 0x0, 0x1d, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1, - 0x74, 0x0, 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xaa, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x30, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x67, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x81, 0x0, 0x4d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4f, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x4, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x3, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, - 0xf4, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xf0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xef, 0xff, 0xf1, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9f, 0xff, - 0xf9, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x4f, 0xff, 0xff, 0x20, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xe, 0xff, 0xff, 0xb0, 0x1, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x7, 0xff, 0xff, 0xf9, 0x0, 0x2, 0x68, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xb1, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0x94, 0x10, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xad, - 0xff, 0xfd, 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+F048 "" */ - 0x24, 0x44, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x41, 0xe, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xf4, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x98, 0xbb, 0xbb, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8b, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0xfe, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xe5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb2, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xe8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x1, 0x9c, 0xcc, 0xcc, 0xcc, 0xcc, 0x91, 0x0, - 0x0, 0x0, 0x1, 0x9c, 0xcc, 0xcc, 0xcc, 0xcc, - 0x91, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x23, 0x33, - 0x33, 0x33, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x23, 0x33, 0x33, 0x33, 0x20, 0x0, - - /* U+F04D "" */ - 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x10, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x17, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x10, - - /* U+F051 "" */ - 0x1, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x44, 0x44, 0x24, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xfe, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xaf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xf0, 0x7b, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, - 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe4, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x7, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xb7, 0x0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F054 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xfd, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xd2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x44, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xfa, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 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, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x8b, 0xbb, 0x81, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F068 "" */ - 0x4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x84, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 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, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb1, 0xbe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xa1, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x36, 0xac, 0xde, 0xfe, 0xdc, 0xa6, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xfe, 0x72, 0x0, 0x0, 0x2, 0x7e, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x24, 0x30, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xfa, 0x20, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0x50, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x73, 0x2, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0xef, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x1, 0x69, 0xba, 0x61, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xe7, 0x20, 0x0, 0x0, 0x27, - 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xed, 0xcd, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x93, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, 0xff, - 0xed, 0xca, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x0, 0x6e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xc2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x4, 0x8a, 0xde, 0xff, 0xed, 0xb7, 0x41, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x17, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xa3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xec, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb5, 0x10, 0x0, 0x1, 0x6c, 0xff, 0xff, 0xff, - 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, - 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x57, 0x74, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x70, 0xd, - 0xff, 0xff, 0x80, 0x0, 0x1, 0xef, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x30, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xa0, 0x8f, 0xff, 0xff, 0xc1, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xdb, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xd2, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xff, 0xff, 0xff, 0xf6, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xf9, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0xcd, 0xe7, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, 0xcd, 0xef, - 0xfe, 0xda, 0x73, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xdd, 0x10, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xdf, 0xd6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xce, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x79, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x52, 0x5c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x4, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc4, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x24, 0x44, 0x44, 0x44, - 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x44, 0x44, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf3, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0x40, 0x7, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf5, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0x50, 0x5, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0xef, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5d, - 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, - 0x0, 0x0, 0x0, 0x5d, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x5e, 0x20, 0x0, 0x0, 0xef, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0x60, 0x5, 0xff, - 0xe2, 0x0, 0x0, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x4f, 0xff, 0xfe, 0x20, 0x0, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0x70, 0x3, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x24, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x44, 0x44, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, 0x1d, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x4f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xfc, 0xb, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xf4, 0x8f, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0x10, 0xbf, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0x50, 0x0, 0xbf, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x50, 0x0, - 0x0, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x20, - 0x0, - - /* U+F078 "" */ - 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, - 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xf5, 0x0, 0xb, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xf5, 0x8, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf1, 0xbf, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x44, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xc0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0x81, 0xdf, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xd2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x24, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0x6, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xef, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0x5b, 0xff, 0xff, - 0x5c, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf6, 0xb, 0xff, - 0xff, 0x40, 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x70, 0xb, - 0xff, 0xff, 0x40, 0x1d, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x53, 0x0, - 0xb, 0xff, 0xff, 0x40, 0x0, 0x53, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xeb, 0x10, 0xe, 0xff, 0xff, - 0x10, 0x9, 0xea, 0x10, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0xe, 0xff, - 0xff, 0x10, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfb, 0xe, - 0xff, 0xff, 0x19, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xae, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0x74, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xa3, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x16, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x3, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1a, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x33, 0x33, 0x33, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x33, 0x33, 0x33, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x20, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0x70, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x1, 0x11, 0x11, 0x10, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x88, 0x88, 0x88, 0x88, 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, 0xf9, 0x2, 0xef, 0x90, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xbf, - 0x30, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x46, 0xff, 0xc4, 0x6f, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0xea, 0x63, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xb8, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x96, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6d, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x1, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x71, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xee, - 0xdb, 0x86, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x0, 0x0, 0x0, 0x34, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xdf, 0xfd, 0x81, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfe, 0x40, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xec, 0xef, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xff, 0x60, 0xcf, 0xff, 0xfb, 0x0, - 0x1b, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xef, 0xff, - 0xf2, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0xff, 0xff, 0xf0, 0x0, 0x1, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0xef, 0xff, 0xf6, 0x0, 0x6, 0xff, - 0xff, 0xd0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x85, - 0x8f, 0xff, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x16, 0xab, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x34, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xec, 0xef, 0xff, - 0xff, 0x90, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x0, - 0x1b, 0xff, 0xff, 0xc0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xef, 0xff, - 0xf2, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0xff, 0xff, 0xf0, 0x0, 0x1, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0xef, 0xff, 0xf6, 0x0, 0x6, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0xaf, 0xff, 0xff, 0x85, - 0x8f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x46, 0x64, 0x0, 0x0, 0x0, 0x0, - 0x16, 0xab, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7, 0xe4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, - 0xff, 0xff, 0xe0, 0x68, 0x88, 0x88, 0x40, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x48, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xf8, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x6, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x86, 0xf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xf, - 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xfe, 0x20, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x64, 0x6b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x17, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x10, - - /* U+F0C9 "" */ - 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, - - /* U+F0E0 "" */ - 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x30, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x0, 0x10, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, - 0xf8, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x8f, 0xff, 0xc1, 0x0, 0x2c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x1c, 0xff, - 0xff, 0xfe, 0x50, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x40, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd2, 0x0, 0x1b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, - 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd3, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x1, 0x9e, 0xe9, 0x10, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x19, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb9, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x3, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, - - /* U+F0E7 "" */ - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x60, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, 0xfe, 0x91, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x88, 0x88, 0x88, 0xcf, - 0xff, 0xff, 0xff, 0xc8, 0x88, 0x88, 0x86, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x72, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x27, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x3, 0x78, 0x88, 0x88, 0x88, 0x88, 0x80, 0x3, - 0x60, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x8f, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8, 0xff, 0xb0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xb0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, - 0xb0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, - 0xff, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x98, 0x88, - 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x6, 0x88, 0x88, 0x88, 0x88, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe5, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xbf, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xbf, 0xff, 0xff, - 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x6e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x9e, 0xfe, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 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, 0x30, 0x0, 0x3f, 0xfb, 0x0, - 0x0, 0xbf, 0xf3, 0x0, 0x3, 0xff, 0xb0, 0x0, - 0xb, 0xff, 0x30, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x8, - 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x8f, - 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x8f, 0xf0, - 0x0, 0x0, 0xff, 0x80, 0x0, 0x8, 0xff, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xff, 0x80, 0x0, 0x8, 0xff, 0x0, 0x0, - 0xf, 0xf8, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3f, - 0xfb, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x3, 0xff, - 0xb0, 0x0, 0xb, 0xff, 0x30, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x88, 0x8b, 0xff, 0xd8, 0x88, - 0xaf, 0xfe, 0x88, 0x88, 0xbf, 0xfd, 0x88, 0x89, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, 0xff, - 0x90, 0x0, 0x1, 0xff, 0x70, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x1, 0xff, 0x60, 0x0, 0xe, 0xf9, 0x0, - 0x0, 0x1f, 0xf6, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x1f, 0xf6, 0x0, 0x0, 0xef, 0x90, 0x0, 0x1, - 0xff, 0x60, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xff, - 0x70, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x1f, 0xf7, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x98, 0x88, 0xbf, 0xfd, 0x88, - 0x8a, 0xff, 0xe8, 0x88, 0x8b, 0xff, 0xd8, 0x88, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 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, 0x0, 0x3, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x3c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x30, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, - 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3a, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8e, 0xfb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F15B "" */ - 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x88, 0x88, - 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x45, 0x78, 0x88, 0x87, 0x54, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdd, 0xcc, 0xdd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xea, 0x73, 0x10, 0x0, 0x0, 0x0, 0x1, 0x37, - 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xc1, 0xdf, 0xff, 0xff, 0xff, 0xfe, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, - 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, - 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0xff, 0xff, 0xff, 0xfd, 0x2e, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe2, 0x2, 0xef, - 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, - 0x9b, 0xde, 0xff, 0xed, 0xb9, 0x62, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfe, 0x20, 0x0, - 0x2d, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xd2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x65, - 0x44, 0x56, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0x71, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xb1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1b, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xc7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7c, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, - 0xaa, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5b, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x24, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, - 0x0, 0x0, - - /* U+F241 "" */ - 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5b, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, - 0x0, 0x0, - - /* U+F242 "" */ - 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, - 0x0, 0x0, - - /* U+F243 "" */ - 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, - 0x0, 0x0, - - /* U+F244 "" */ - 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, - 0x0, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, - 0x88, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xfe, 0x65, 0x5a, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0x30, 0x0, 0x1d, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, - 0x0, 0x19, 0xef, 0xd5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x34, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xef, 0xff, 0xe7, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x20, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x80, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x1, 0xef, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xd4, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x23, 0xcf, 0xfc, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x36, 0xff, 0xff, 0xfb, 0x20, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 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, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, - 0xaa, 0xaa, 0xaa, 0xdf, 0xff, 0xba, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbf, 0xff, - 0xff, 0xf9, 0x10, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xc3, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xfe, 0x60, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x5a, 0xba, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xa4, 0x38, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x78, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x55, - 0x55, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xac, 0xef, - 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfc, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xa0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x1, 0x60, 0x1, 0xdf, 0xff, - 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, 0xf6, 0x6f, - 0xff, 0xfc, 0x0, 0x1f, 0x60, 0x1, 0xef, 0xff, - 0xff, 0xf2, 0xa, 0xff, 0xff, 0xf6, 0x0, 0x6f, - 0xff, 0xc0, 0x1, 0xff, 0x60, 0x2, 0xef, 0xff, - 0xff, 0x50, 0xcf, 0xff, 0xff, 0x60, 0x0, 0x6f, - 0xfc, 0x0, 0x1f, 0xff, 0x10, 0x7, 0xff, 0xff, - 0xf7, 0xf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, - 0xc0, 0x1, 0xff, 0x30, 0x4, 0xff, 0xff, 0xff, - 0x90, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6c, - 0x0, 0x1f, 0x30, 0x3, 0xff, 0xff, 0xff, 0xfb, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x30, - 0x0, 0x30, 0x2, 0xef, 0xff, 0xff, 0xff, 0xc3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xd2, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xfd, 0x1f, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x80, 0x0, 0x90, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0xcc, 0x0, 0x1f, 0x90, 0x0, 0x8f, - 0xff, 0xff, 0xfa, 0xd, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0xcf, 0xc0, 0x1, 0xff, 0x80, 0x0, 0x9f, - 0xff, 0xff, 0x90, 0xbf, 0xff, 0xff, 0x20, 0x1, - 0xcf, 0xfd, 0x0, 0x1f, 0xfd, 0x0, 0x4, 0xff, - 0xff, 0xf7, 0x8, 0xff, 0xff, 0xfd, 0x11, 0xcf, - 0xff, 0xd0, 0x1, 0xfd, 0x10, 0x4, 0xff, 0xff, - 0xff, 0x40, 0x4f, 0xff, 0xff, 0xfd, 0xcf, 0xff, - 0xfd, 0x0, 0x1d, 0x10, 0x4, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x10, 0x5, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x7a, 0xde, 0xff, 0xfe, 0xca, 0x61, - 0x0, 0x0, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xac, 0xcc, - 0xcc, 0xcc, 0xcc, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, - 0x44, 0x44, 0x44, 0x44, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xb6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, - 0xff, 0xff, 0xfe, 0x22, 0xef, 0xff, 0xf9, 0x9, - 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, - 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, - 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, - 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, - 0xc, 0xff, 0xff, 0x40, 0x4f, 0xff, 0xfc, 0x0, - 0xcf, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, - 0xfc, 0x0, 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, - 0xc0, 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0x40, 0x4f, - 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, - 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xf4, - 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, - 0xff, 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, - 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, - 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xc0, 0xc, 0xff, 0xff, 0x40, 0x4f, 0xff, 0xfc, - 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, - 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xf4, 0x4, 0xff, - 0xff, 0xc0, 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0x40, - 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, 0x80, - 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, - 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, - 0xff, 0xff, 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, - 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, - 0x0, 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, - 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xc0, 0xc, 0xff, 0xff, 0x40, 0x4f, 0xff, - 0xfc, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x8, - 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xf4, 0x4, - 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, - 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, - 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, - 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xe2, - 0x2e, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xfe, 0x22, - 0xef, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe8, 0x0, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, - 0xfd, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x61, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xd1, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd1, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xd1, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x9f, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x9f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x9f, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5e, 0xfd, 0xb9, 0x86, 0x42, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x1, 0xdf, 0xff, 0xff, 0xfd, - 0x10, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x1, 0xdf, - 0xfd, 0x10, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x1d, 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x1, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x1, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x1, 0xdf, 0xfd, 0x10, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x1, 0xdf, 0xff, 0xff, 0xfd, 0x10, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x4d, 0xff, 0xff, 0xff, 0xff, - 0xd4, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xff, 0xc0, - 0x0, 0x8f, 0xf0, 0x0, 0x1f, 0xf6, 0x0, 0xf, - 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xc0, 0x0, - 0x8f, 0xf0, 0x0, 0x1f, 0xf6, 0x0, 0xf, 0xff, - 0xff, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0x0, 0x8f, - 0xf0, 0x0, 0x1f, 0xf6, 0x0, 0xf, 0xff, 0xff, - 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xf0, - 0x0, 0x1f, 0xf6, 0x0, 0xf, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xf0, 0x0, - 0x1f, 0xf6, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xf0, 0x0, 0x1f, - 0xf6, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x8f, 0xf0, 0x0, 0x1f, 0xf6, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe8, 0x88, 0xcf, 0xf8, 0x88, 0x8f, 0xfb, 0x88, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf2, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xc6, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0xff, - 0xff, 0xff, 0x20, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x2c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xc5, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 172, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 172, .box_w = 6, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 87, .adv_w = 250, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 17}, - {.bitmap_index = 159, .adv_w = 450, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 551, .adv_w = 397, .box_w = 23, .box_h = 39, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 1000, .adv_w = 540, .box_w = 32, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1464, .adv_w = 439, .box_w = 26, .box_h = 30, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1854, .adv_w = 134, .box_w = 4, .box_h = 12, .ofs_x = 2, .ofs_y = 17}, - {.bitmap_index = 1878, .adv_w = 216, .box_w = 10, .box_h = 39, .ofs_x = 3, .ofs_y = -8}, - {.bitmap_index = 2073, .adv_w = 216, .box_w = 9, .box_h = 39, .ofs_x = 1, .ofs_y = -8}, - {.bitmap_index = 2249, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 15}, - {.bitmap_index = 2377, .adv_w = 372, .box_w = 19, .box_h = 18, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 2548, .adv_w = 145, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 2590, .adv_w = 245, .box_w = 12, .box_h = 4, .ofs_x = 2, .ofs_y = 10}, - {.bitmap_index = 2614, .adv_w = 145, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2635, .adv_w = 225, .box_w = 18, .box_h = 39, .ofs_x = -2, .ofs_y = -4}, - {.bitmap_index = 2986, .adv_w = 427, .box_w = 24, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3334, .adv_w = 237, .box_w = 11, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3494, .adv_w = 367, .box_w = 22, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3813, .adv_w = 366, .box_w = 22, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4132, .adv_w = 428, .box_w = 26, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4509, .adv_w = 367, .box_w = 22, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4828, .adv_w = 395, .box_w = 23, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5162, .adv_w = 383, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5481, .adv_w = 412, .box_w = 23, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5815, .adv_w = 395, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6134, .adv_w = 145, .box_w = 7, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6211, .adv_w = 145, .box_w = 7, .box_h = 28, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 6309, .adv_w = 372, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 6490, .adv_w = 372, .box_w = 19, .box_h = 13, .ofs_x = 2, .ofs_y = 8}, - {.bitmap_index = 6614, .adv_w = 372, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 6795, .adv_w = 367, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7100, .adv_w = 662, .box_w = 39, .box_h = 37, .ofs_x = 1, .ofs_y = -8}, - {.bitmap_index = 7822, .adv_w = 468, .box_w = 31, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 8272, .adv_w = 484, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 8635, .adv_w = 463, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9027, .adv_w = 529, .box_w = 28, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 9433, .adv_w = 429, .box_w = 21, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 9738, .adv_w = 406, .box_w = 20, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 10028, .adv_w = 494, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10420, .adv_w = 520, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 10783, .adv_w = 198, .box_w = 5, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 10856, .adv_w = 328, .box_w = 18, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 11117, .adv_w = 460, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 11480, .adv_w = 380, .box_w = 20, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 11770, .adv_w = 611, .box_w = 30, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12205, .adv_w = 520, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12568, .adv_w = 538, .box_w = 31, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 13018, .adv_w = 462, .box_w = 23, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 13352, .adv_w = 538, .box_w = 33, .box_h = 35, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 13930, .adv_w = 465, .box_w = 24, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 14278, .adv_w = 397, .box_w = 23, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 14612, .adv_w = 376, .box_w = 24, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14960, .adv_w = 506, .box_w = 25, .box_h = 29, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 15323, .adv_w = 456, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 15758, .adv_w = 721, .box_w = 43, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 16382, .adv_w = 431, .box_w = 27, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16774, .adv_w = 414, .box_w = 28, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 17180, .adv_w = 420, .box_w = 25, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 17543, .adv_w = 213, .box_w = 9, .box_h = 39, .ofs_x = 4, .ofs_y = -8}, - {.bitmap_index = 17719, .adv_w = 225, .box_w = 18, .box_h = 39, .ofs_x = -2, .ofs_y = -4}, - {.bitmap_index = 18070, .adv_w = 213, .box_w = 10, .box_h = 39, .ofs_x = 0, .ofs_y = -8}, - {.bitmap_index = 18265, .adv_w = 373, .box_w = 18, .box_h = 17, .ofs_x = 3, .ofs_y = 6}, - {.bitmap_index = 18418, .adv_w = 320, .box_w = 20, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 18448, .adv_w = 384, .box_w = 11, .box_h = 6, .ofs_x = 4, .ofs_y = 25}, - {.bitmap_index = 18481, .adv_w = 383, .box_w = 19, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 18690, .adv_w = 436, .box_w = 23, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 19047, .adv_w = 365, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 19278, .adv_w = 436, .box_w = 23, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 19635, .adv_w = 392, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 19877, .adv_w = 226, .box_w = 16, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 20125, .adv_w = 442, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = -8}, - {.bitmap_index = 20470, .adv_w = 436, .box_w = 21, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 20796, .adv_w = 179, .box_w = 7, .box_h = 32, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 20908, .adv_w = 182, .box_w = 13, .box_h = 40, .ofs_x = -4, .ofs_y = -8}, - {.bitmap_index = 21168, .adv_w = 394, .box_w = 22, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 21509, .adv_w = 179, .box_w = 5, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 21587, .adv_w = 676, .box_w = 36, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 21983, .adv_w = 436, .box_w = 21, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 22214, .adv_w = 406, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 22467, .adv_w = 436, .box_w = 23, .box_h = 30, .ofs_x = 3, .ofs_y = -8}, - {.bitmap_index = 22812, .adv_w = 436, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = -8}, - {.bitmap_index = 23157, .adv_w = 262, .box_w = 13, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 23300, .adv_w = 321, .box_w = 19, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23509, .adv_w = 265, .box_w = 16, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23725, .adv_w = 433, .box_w = 21, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 23956, .adv_w = 358, .box_w = 24, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 24220, .adv_w = 575, .box_w = 36, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 24616, .adv_w = 353, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 24858, .adv_w = 358, .box_w = 24, .box_h = 30, .ofs_x = -1, .ofs_y = -8}, - {.bitmap_index = 25218, .adv_w = 333, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 25427, .adv_w = 225, .box_w = 12, .box_h = 39, .ofs_x = 2, .ofs_y = -8}, - {.bitmap_index = 25661, .adv_w = 191, .box_w = 4, .box_h = 39, .ofs_x = 4, .ofs_y = -8}, - {.bitmap_index = 25739, .adv_w = 225, .box_w = 12, .box_h = 39, .ofs_x = 0, .ofs_y = -8}, - {.bitmap_index = 25973, .adv_w = 372, .box_w = 19, .box_h = 8, .ofs_x = 2, .ofs_y = 11}, - {.bitmap_index = 26049, .adv_w = 268, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 16}, - {.bitmap_index = 26147, .adv_w = 201, .box_w = 8, .box_h = 8, .ofs_x = 2, .ofs_y = 8}, - {.bitmap_index = 26179, .adv_w = 640, .box_w = 40, .box_h = 41, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 26999, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 27599, .adv_w = 640, .box_w = 40, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 28319, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 28919, .adv_w = 440, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 29311, .adv_w = 640, .box_w = 40, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 30111, .adv_w = 640, .box_w = 38, .box_h = 40, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 30871, .adv_w = 720, .box_w = 45, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 31681, .adv_w = 640, .box_w = 40, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 32481, .adv_w = 720, .box_w = 45, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 33156, .adv_w = 640, .box_w = 40, .box_h = 42, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 33996, .adv_w = 320, .box_w = 20, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 34316, .adv_w = 480, .box_w = 30, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 34796, .adv_w = 720, .box_w = 45, .box_h = 38, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 35651, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 36251, .adv_w = 440, .box_w = 28, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 36811, .adv_w = 560, .box_w = 25, .box_h = 37, .ofs_x = 5, .ofs_y = -4}, - {.bitmap_index = 37274, .adv_w = 560, .box_w = 35, .box_h = 42, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 38009, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 38639, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 39269, .adv_w = 560, .box_w = 25, .box_h = 37, .ofs_x = 5, .ofs_y = -4}, - {.bitmap_index = 39732, .adv_w = 560, .box_w = 37, .box_h = 36, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 40398, .adv_w = 400, .box_w = 21, .box_h = 36, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 40776, .adv_w = 400, .box_w = 21, .box_h = 36, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 41154, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 41784, .adv_w = 560, .box_w = 35, .box_h = 8, .ofs_x = 0, .ofs_y = 11}, - {.bitmap_index = 41924, .adv_w = 720, .box_w = 45, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 42599, .adv_w = 800, .box_w = 51, .box_h = 40, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 43619, .adv_w = 720, .box_w = 47, .box_h = 40, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 44559, .adv_w = 640, .box_w = 40, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 45279, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 45664, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 46049, .adv_w = 800, .box_w = 50, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 46849, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 47449, .adv_w = 640, .box_w = 40, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 48249, .adv_w = 640, .box_w = 41, .box_h = 41, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 49090, .adv_w = 560, .box_w = 36, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 49738, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 50438, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 51068, .adv_w = 560, .box_w = 35, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 51628, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 52228, .adv_w = 400, .box_w = 27, .box_h = 40, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 52768, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 53468, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 54168, .adv_w = 720, .box_w = 45, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 54843, .adv_w = 640, .box_w = 42, .box_h = 42, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 55725, .adv_w = 480, .box_w = 30, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 56325, .adv_w = 800, .box_w = 50, .box_h = 37, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 57250, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 57900, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 58550, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 59200, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 59850, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 60500, .adv_w = 800, .box_w = 51, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 61316, .adv_w = 560, .box_w = 31, .box_h = 40, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 61936, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 62636, .adv_w = 640, .box_w = 41, .box_h = 41, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 63477, .adv_w = 800, .box_w = 50, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 64227, .adv_w = 480, .box_w = 30, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 64827, .adv_w = 644, .box_w = 41, .box_h = 26, .ofs_x = 0, .ofs_y = 2} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 6, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 29, 0, 17, -14, 0, 0, - 0, 0, -35, -38, 4, 30, 14, 11, - -26, 4, 31, 2, 27, 6, 20, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 38, 5, -4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13, 0, -19, 0, 0, 0, 0, - 0, -13, 11, 13, 0, 0, -6, 0, - -4, 6, 0, -6, 0, -6, -3, -13, - 0, 0, 0, 0, -6, 0, 0, -8, - -10, 0, 0, -6, 0, -13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -6, - -6, 0, -10, 0, -17, 0, -77, 0, - 0, -13, 0, 13, 19, 1, 0, -13, - 6, 6, 21, 13, -11, 13, 0, 0, - -36, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -24, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -17, -8, -31, 0, -26, - -4, 0, 0, 0, 0, 1, 25, 0, - -19, -5, -2, 2, 0, -11, 0, 0, - -4, -47, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -51, -5, 24, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 21, - 0, 6, 0, 0, -13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 5, - 2, 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, - -24, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, - 13, 6, 19, -6, 0, 0, 13, -6, - -21, -88, 4, 17, 13, 1, -8, 0, - 23, 0, 20, 0, 20, 0, -60, 0, - -8, 19, 0, 21, -6, 13, 6, 0, - 0, 2, -6, 0, 0, -11, 51, 0, - 51, 0, 19, 0, 27, 8, 11, 19, - 0, 0, 0, -24, 0, 0, 0, 0, - 2, -4, 0, 4, -12, -8, -13, 4, - 0, -6, 0, 0, 0, -26, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -42, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, -35, 0, -40, 0, 0, 0, - 0, -4, 0, 63, -8, -8, 6, 6, - -6, 0, -8, 6, 0, 0, -34, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -62, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -40, 0, 38, 0, 0, -24, 0, - 21, 0, -44, -62, -44, -13, 19, 0, - 0, -43, 0, 8, -15, 0, -10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 17, 19, -78, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 30, 0, 4, 0, 0, 0, - 0, 0, 4, 4, -8, -13, 0, -2, - -2, -6, 0, 0, -4, 0, 0, 0, - -13, 0, -5, 0, -15, -13, 0, -16, - -21, -21, -12, 0, -13, 0, -13, 0, - 0, 0, 0, -5, 0, 0, 6, 0, - 4, -6, 0, 2, 0, 0, 0, 6, - -4, 0, 0, 0, -4, 6, 6, -2, - 0, 0, 0, -12, 0, -2, 0, 0, - 0, 0, 0, 2, 0, 8, -4, 0, - -8, 0, -11, 0, 0, -4, 0, 19, - 0, 0, -6, 0, 0, 0, 0, 0, - -2, 2, -4, -4, 0, 0, -6, 0, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -3, -3, 0, -6, -8, 0, - 0, 0, 0, 0, 2, 0, 0, -4, - 0, -6, -6, -6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -4, 0, 0, - 0, 0, -4, -8, 0, -10, 0, -19, - -4, -19, 13, 0, 0, -13, 6, 13, - 17, 0, -16, -2, -8, 0, -2, -30, - 6, -4, 4, -34, 6, 0, 0, 2, - -33, 0, -34, -5, -56, -4, 0, -32, - 0, 13, 18, 0, 8, 0, 0, 0, - 0, 1, 0, -12, -8, 0, -19, 0, - 0, 0, -6, 0, 0, 0, -6, 0, - 0, 0, 0, 0, -3, -3, 0, -3, - -8, 0, 0, 0, 0, 0, 0, 0, - -6, -6, 0, -4, -8, -5, 0, 0, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, -5, 0, -8, - 0, -4, 0, -13, 6, 0, 0, -8, - 3, 6, 6, 0, 0, 0, 0, 0, - 0, -4, 0, 0, 0, 0, 0, 4, - 0, 0, -6, 0, -6, -4, -8, 0, - 0, 0, 0, 0, 0, 0, 5, 0, - -5, 0, 0, 0, 0, -7, -10, 0, - -12, 0, 19, -4, 2, -20, 0, 0, - 17, -32, -33, -27, -13, 6, 0, -5, - -42, -12, 0, -12, 0, -13, 10, -12, - -41, 0, -17, 0, 0, 3, -2, 5, - -4, 0, 6, 1, -19, -24, 0, -32, - -15, -13, -15, -19, -8, -17, -1, -12, - -17, 4, 0, 2, 0, -6, 0, 0, - 0, 4, 0, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -6, - 0, -3, 0, -2, -6, 0, -11, -14, - -14, -2, 0, -19, 0, 0, 0, 0, - 0, 0, -5, 0, 0, 0, 0, 3, - -4, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 31, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -12, 0, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, 0, 0, - -12, 0, 0, 0, 0, -32, -19, 0, - 0, 0, -10, -32, 0, 0, -6, 6, - 0, -17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -10, 0, 0, -12, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, -12, 0, - 0, 0, 0, 8, 0, 4, -13, -13, - 0, -6, -6, -8, 0, 0, 0, 0, - 0, 0, -19, 0, -6, 0, -10, -6, - 0, -14, -16, -19, -5, 0, -13, 0, - -19, 0, 0, 0, 0, 51, 0, 0, - 3, 0, 0, -8, 0, 6, 0, -28, - 0, 0, 0, 0, 0, -60, -12, 21, - 19, -5, -27, 0, 6, -10, 0, -32, - -3, -8, 6, -45, -6, 8, 0, 10, - -22, -10, -24, -21, -27, 0, 0, -38, - 0, 36, 0, 0, -3, 0, 0, 0, - -3, -3, -6, -17, -21, -1, -60, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -6, 0, -3, -6, -10, 0, 0, - -13, 0, -6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, 0, -13, 0, 0, 13, - -2, 8, 0, -14, 6, -4, -2, -17, - -6, 0, -8, -6, -4, 0, -10, -11, - 0, 0, -5, -2, -4, -11, -8, 0, - 0, -6, 0, 6, -4, 0, -14, 0, - 0, 0, -13, 0, -11, 0, -11, -11, - 6, 0, 0, 0, 0, 0, 0, 0, - 0, -13, 6, 0, -9, 0, -4, -8, - -20, -4, -4, -4, -2, -4, -8, -2, - 0, 0, 0, 0, 0, -6, -5, -5, - 0, 0, 0, 0, 8, -4, 0, -4, - 0, 0, 0, -4, -8, -4, -6, -8, - -6, 0, 5, 26, -2, 0, -17, 0, - -4, 13, 0, -6, -27, -8, 10, 1, - 0, -30, -11, 6, -11, 4, 0, -4, - -5, -20, 0, -10, 3, 0, 0, -11, - 0, 0, 0, 6, 6, -13, -12, 0, - -11, -6, -10, -6, -6, 0, -11, 3, - -12, -11, 19, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -11, 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, - -4, 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, -5, -6, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -10, 0, 0, -8, - 0, 0, -6, -6, 0, 0, 0, 0, - -6, 0, 0, 0, 0, -3, 0, 0, - 0, 0, 0, -4, 0, 0, 0, 0, - -10, 0, -13, 0, 0, 0, -21, 0, - 4, -14, 13, 1, -4, -30, 0, 0, - -14, -6, 0, -26, -16, -18, 0, 0, - -28, -6, -26, -24, -31, 0, -17, 0, - 5, 43, -8, 0, -15, -6, -2, -6, - -11, -17, -12, -24, -26, -15, -6, 0, - 0, -4, 0, 2, 0, 0, -45, -6, - 19, 14, -14, -24, 0, 2, -20, 0, - -32, -4, -6, 13, -59, -8, 2, 0, - 0, -42, -8, -33, -6, -47, 0, 0, - -45, 0, 38, 2, 0, -4, 0, 0, - 0, 0, -3, -4, -24, -4, 0, -42, - 0, 0, 0, 0, -20, 0, -6, 0, - -2, -18, -30, 0, 0, -3, -10, -19, - -6, 0, -4, 0, 0, 0, 0, -29, - -6, -21, -20, -5, -11, -16, -6, -11, - 0, -13, -6, -21, -10, 0, -8, -12, - -6, -12, 0, 3, 0, -4, -21, 0, - 13, 0, -12, 0, 0, 0, 0, 8, - 0, 4, -13, 26, 0, -6, -6, -8, - 0, 0, 0, 0, 0, 0, -19, 0, - -6, 0, -10, -6, 0, -14, -16, -19, - -5, 0, -13, 5, 26, 0, 0, 0, - 0, 51, 0, 0, 3, 0, 0, -8, - 0, 6, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -4, -13, 0, 0, 0, 0, 0, -3, - 0, 0, 0, -6, -6, 0, 0, -13, - -6, 0, 0, -13, 0, 11, -3, 0, - 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 10, 13, 5, -6, 0, -20, - -10, 0, 19, -21, -20, -13, -13, 26, - 12, 6, -56, -4, 13, -6, 0, -6, - 7, -6, -22, 0, -6, 6, -8, -5, - -19, -5, 0, 0, 19, 13, 0, -18, - 0, -35, -8, 19, -8, -24, 2, -8, - -21, -21, -6, 26, 6, 0, -10, 0, - -17, 0, 5, 21, -15, -24, -26, -16, - 19, 0, 2, -47, -5, 6, -11, -4, - -15, 0, -14, -24, -10, -10, -5, 0, - 0, -15, -13, -6, 0, 19, 15, -6, - -35, 0, -35, -9, 0, -22, -37, -2, - -20, -11, -21, -18, 17, 0, 0, -8, - 0, -13, -6, 0, -6, -12, 0, 11, - -21, 6, 0, 0, -34, 0, -6, -14, - -11, -4, -19, -16, -21, -15, 0, -19, - -6, -15, -12, -19, -6, 0, 0, 2, - 30, -11, 0, -19, -6, 0, -6, -13, - -15, -17, -18, -24, -8, -13, 13, 0, - -10, 0, -32, -8, 4, 13, -20, -24, - -13, -21, 21, -6, 3, -60, -12, 13, - -14, -11, -24, 0, -19, -27, -8, -6, - -5, -6, -13, -19, -2, 0, 0, 19, - 18, -4, -42, 0, -38, -15, 15, -24, - -44, -13, -22, -27, -32, -21, 13, 0, - 0, 0, 0, -8, 0, 0, 6, -8, - 13, 4, -12, 13, 0, 0, -20, -2, - 0, -2, 0, 2, 2, -5, 0, 0, - 0, 0, 0, 0, -6, 0, 0, 0, - 0, 5, 19, 1, 0, -8, 0, 0, - 0, 0, -4, -4, -8, 0, 0, 0, - 2, 5, 0, 0, 0, 0, 5, 0, - -5, 0, 24, 0, 12, 2, 2, -8, - 0, 13, 0, 0, 0, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 0, 18, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -38, 0, -6, 11, 0, 19, - 0, 0, 63, 8, -13, -13, 6, 6, - -4, 2, -32, 0, 0, 31, -38, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -44, 24, 90, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -38, 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, -10, 0, 0, -12, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, 0, -17, 0, - 0, 2, 0, 0, 6, 83, -13, -5, - 20, 17, -17, 6, 0, 0, 6, 6, - -8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -83, 18, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -18, - 0, 0, 0, -17, 0, 0, 0, 0, - -14, -3, 0, 0, 0, -14, 0, -8, - 0, -30, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -43, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, -6, 0, 0, -12, 0, -10, 0, - -17, 0, 0, 0, -11, 6, -8, 0, - 0, -17, -6, -15, 0, 0, -17, 0, - -6, 0, -30, 0, -7, 0, 0, -52, - -12, -26, -7, -23, 0, 0, -43, 0, - -17, -3, 0, 0, 0, 0, 0, 0, - 0, 0, -10, -12, -5, -11, 0, 0, - 0, 0, -14, 0, -14, 8, -7, 13, - 0, -4, -15, -4, -11, -12, 0, -8, - -3, -4, 4, -17, -2, 0, 0, 0, - -56, -5, -9, 0, -14, 0, -4, -30, - -6, 0, 0, -4, -5, 0, 0, 0, - 0, 4, 0, -4, -11, -4, 11, 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, 8, 0, 0, 0, 0, 0, - 0, -14, 0, -4, 0, 0, 0, -13, - 6, 0, 0, 0, -17, -6, -13, 0, - 0, -18, 0, -6, 0, -30, 0, 0, - 0, 0, -62, 0, -13, -24, -32, 0, - 0, -43, 0, -4, -10, 0, 0, 0, - 0, 0, 0, 0, 0, -6, -10, -3, - -10, 2, 0, 0, 11, -8, 0, 20, - 31, -6, -6, -19, 8, 31, 11, 14, - -17, 8, 27, 8, 19, 14, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 40, 30, -12, -6, 0, -5, - 51, 28, 51, 0, 0, 0, 6, 0, - 0, 24, 0, 0, -10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -4, 0, - 0, 0, 0, 0, 0, 0, 0, 9, - 0, 0, 0, 0, -54, -8, -5, -26, - -31, 0, 0, -43, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - 0, 0, 0, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 0, -54, -8, -5, - -26, -31, 0, 0, -26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -5, 0, 0, 0, -15, 6, 0, -6, - 5, 12, 6, -19, 0, -1, -5, 6, - 0, 5, 0, 0, 0, 0, -16, 0, - -6, -4, -13, 0, -6, -26, 0, 40, - -6, 0, -14, -4, 0, -4, -11, 0, - -6, -18, -13, -8, 0, 0, 0, -10, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -4, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 0, -54, - -8, -5, -26, -31, 0, 0, -43, 0, - 0, 0, 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -10, 0, -20, -8, -6, 19, -6, -6, - -26, 2, -4, 2, -4, -17, 1, 14, - 1, 5, 2, 5, -15, -26, -8, 0, - -24, -12, -17, -27, -25, 0, -10, -13, - -8, -8, -5, -4, -8, -4, 0, -4, - -2, 10, 0, 10, -4, 0, 20, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -4, -6, -6, 0, 0, - -17, 0, -3, 0, -11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -38, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, -6, 0, -8, - 0, 0, 0, 0, -5, 0, 0, -11, - -6, 6, 0, -11, -12, -4, 0, -19, - -4, -14, -4, -8, 0, -11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -43, 0, 20, 0, 0, -12, 0, - 0, 0, 0, -8, 0, -6, 0, 0, - -3, 0, 0, -4, 0, -15, 0, 0, - 27, -8, -21, -20, 4, 7, 7, -1, - -18, 4, 10, 4, 19, 4, 21, -4, - -17, 0, 0, -26, 0, 0, -19, -17, - 0, 0, -13, 0, -8, -11, 0, -10, - 0, -10, 0, -4, 10, 0, -5, -19, - -6, 24, 0, 0, -6, 0, -13, 0, - 0, 8, -15, 0, 6, -6, 5, 1, - 0, -21, 0, -4, -2, 0, -6, 7, - -5, 0, 0, 0, -26, -8, -14, 0, - -19, 0, 0, -30, 0, 24, -6, 0, - -12, 0, 4, 0, -6, 0, -6, -19, - 0, -6, 6, 0, 0, 0, 0, -4, - 0, 0, 6, -8, 2, 0, 0, -8, - -4, 0, -8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -40, 0, 14, 0, - 0, -5, 0, 0, 0, 0, 1, 0, - -6, -6, 0, 0, 0, 13, 0, 15, - 0, 0, 0, 0, 0, -40, -36, 2, - 28, 19, 11, -26, 4, 27, 0, 24, - 0, 13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 34, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_40 = { -#else -lv_font_t lv_font_montserrat_40 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 44, /*The maximum line height required by the font*/ - .base_line = 8, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -3, - .underline_thickness = 2, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_40*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_42.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_42.c deleted file mode 100644 index 71fdd93..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_42.c +++ /dev/null @@ -1,10090 +0,0 @@ -/******************************************************************************* - * Size: 42 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 42 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_42.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_42 - #define LV_FONT_MONTSERRAT_42 1 -#endif - -#if LV_FONT_MONTSERRAT_42 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0xb, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, - 0xff, 0xfe, 0x0, 0x9f, 0xff, 0xe0, 0x8, 0xff, - 0xfd, 0x0, 0x8f, 0xff, 0xc0, 0x7, 0xff, 0xfc, - 0x0, 0x7f, 0xff, 0xb0, 0x6, 0xff, 0xfa, 0x0, - 0x6f, 0xff, 0xa0, 0x5, 0xff, 0xf9, 0x0, 0x4f, - 0xff, 0x90, 0x4, 0xff, 0xf8, 0x0, 0x3f, 0xff, - 0x70, 0x3, 0xff, 0xf7, 0x0, 0x2f, 0xff, 0x60, - 0x1, 0xff, 0xf6, 0x0, 0x1f, 0xff, 0x50, 0x0, - 0xff, 0xf4, 0x0, 0xf, 0xff, 0x40, 0x0, 0x99, - 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, - 0x6f, 0xff, 0xb0, 0xf, 0xff, 0xff, 0x30, 0xff, - 0xff, 0xf4, 0xc, 0xff, 0xfe, 0x10, 0x1b, 0xfd, - 0x30, - - /* U+0022 "\"" */ - 0x5f, 0xff, 0x20, 0x0, 0xbf, 0xfc, 0x5f, 0xff, - 0x20, 0x0, 0xbf, 0xfb, 0x4f, 0xff, 0x10, 0x0, - 0xbf, 0xfb, 0x4f, 0xff, 0x10, 0x0, 0xaf, 0xfb, - 0x4f, 0xff, 0x0, 0x0, 0xaf, 0xfa, 0x3f, 0xff, - 0x0, 0x0, 0xaf, 0xfa, 0x3f, 0xff, 0x0, 0x0, - 0x9f, 0xf9, 0x3f, 0xff, 0x0, 0x0, 0x9f, 0xf9, - 0x2f, 0xff, 0x0, 0x0, 0x9f, 0xf9, 0x2f, 0xfe, - 0x0, 0x0, 0x8f, 0xf8, 0x2f, 0xfe, 0x0, 0x0, - 0x8f, 0xf8, 0x19, 0x98, 0x0, 0x0, 0x49, 0x94, - - /* U+0023 "#" */ - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf9, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0xa, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf4, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, - 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3f, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x1, 0x22, 0x22, 0x2b, - 0xff, 0x62, 0x22, 0x22, 0x22, 0xdf, 0xf4, 0x22, - 0x22, 0x20, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, - 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, - 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xfd, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, 0x0, - 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xf9, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x12, 0x22, 0x23, 0xff, - 0xe2, 0x22, 0x22, 0x22, 0x5f, 0xfc, 0x22, 0x22, - 0x22, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x6f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0x60, 0x0, 0x0, 0x0, 0xaf, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, - 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, - 0xef, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x84, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xff, 0xed, - 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xfe, 0xcf, 0xfe, 0xde, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x8f, 0xff, 0xfc, 0x40, 0x1f, 0xf9, 0x0, - 0x26, 0xcf, 0xf5, 0x0, 0x0, 0xff, 0xff, 0xa0, - 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x4, 0xb0, 0x0, - 0x5, 0xff, 0xfe, 0x0, 0x0, 0x1f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, - 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf9, 0x0, 0x0, 0x1f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, - 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x60, 0x0, 0x1f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, - 0x10, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xfb, 0x7f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x61, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xfc, 0xaf, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, - 0x6e, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xf9, 0x0, 0x0, 0xbf, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, - 0x0, 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xf9, 0x0, 0x0, 0xc, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, - 0x0, 0xd, 0xff, 0xf4, 0x0, 0xa1, 0x0, 0x0, - 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0xf2, - 0x6, 0xfe, 0x50, 0x0, 0x0, 0x1f, 0xf9, 0x0, - 0x0, 0xbf, 0xff, 0xd0, 0xd, 0xff, 0xfd, 0x72, - 0x0, 0x1f, 0xf9, 0x0, 0x4c, 0xff, 0xff, 0x50, - 0x1e, 0xff, 0xff, 0xff, 0xec, 0xbf, 0xfd, 0xbe, - 0xff, 0xff, 0xfa, 0x0, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, - 0xde, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0025 "%" */ - 0x0, 0x0, 0x5b, 0xef, 0xea, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, 0x0, - 0x0, 0x0, 0xbf, 0xfe, 0x97, 0x9f, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x6f, 0xfc, 0x10, 0x0, 0x2e, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x4f, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x0, - 0x9, 0xff, 0x10, 0x0, 0x0, 0x3f, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x8f, 0xf2, 0x0, 0x0, 0xd, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x20, 0x0, 0x9, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x9f, 0xf1, 0x0, 0x3, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, 0x0, - 0x0, 0x0, 0xd, 0xfe, 0x0, 0x0, 0xdf, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf1, - 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x9f, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xc0, 0x0, 0x1, 0xdf, 0xf3, 0x0, 0x3f, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xe8, 0x79, 0xff, 0xf8, 0x0, 0xd, 0xff, - 0x50, 0x0, 0x4, 0x66, 0x40, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x9, 0xff, - 0xa0, 0x0, 0x6e, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0x0, 0x5, 0xbe, 0xfe, 0xa4, 0x0, 0x4, 0xff, - 0xe1, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf5, 0x0, 0x6f, 0xfd, 0x50, 0x5, 0xef, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xfa, 0x0, 0xe, 0xfe, 0x10, 0x0, 0x2, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xfe, 0x10, 0x5, 0xff, 0x70, 0x0, 0x0, 0x7, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0x40, 0x0, 0x9f, 0xf2, 0x0, 0x0, 0x0, - 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xa0, 0x0, 0xb, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xe1, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, - 0x0, 0xe, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf4, 0x0, 0x0, 0xc, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xf0, 0x0, - 0x0, 0x0, 0xf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xfe, 0x10, 0x0, 0x0, 0x7, 0xff, 0x40, - 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, 0x2f, 0xfb, - 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x0, - 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xf7, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfc, 0x88, 0xcf, 0xff, 0x20, 0x0, 0x0, - 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x8d, 0xff, 0xd8, 0x10, 0x0, - - /* U+0026 "&" */ - 0x0, 0x0, 0x0, 0x0, 0x49, 0xde, 0xfe, 0xc8, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfe, 0x62, - 0x2, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xd1, 0x0, 0x0, 0x3, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x40, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x8, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xf6, 0x0, 0x0, 0x9f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x30, 0x3c, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xfe, 0xcf, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x91, 0xb, 0xff, 0xff, - 0x30, 0x0, 0x0, 0xaf, 0xa4, 0x0, 0x0, 0x5f, - 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x0, - 0x0, 0xef, 0xf9, 0x0, 0x1, 0xff, 0xff, 0x30, - 0x0, 0x0, 0xb, 0xff, 0xff, 0x30, 0x3, 0xff, - 0xf5, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xf4, 0x9, 0xff, 0xf1, 0x0, - 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x5f, 0xff, 0xb0, 0x0, 0xf, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x1f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, - 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0x50, 0x0, 0x4, 0xff, - 0xff, 0xd4, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xd9, 0x77, 0x8a, 0xef, 0xff, 0xff, 0x9a, 0xff, - 0xff, 0x50, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0xaf, 0xff, 0xe0, - 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x10, 0x0, 0xa, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x38, 0xcd, 0xff, 0xec, 0xa5, 0x10, 0x0, - 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0027 "'" */ - 0x5f, 0xff, 0x25, 0xff, 0xf2, 0x4f, 0xff, 0x14, - 0xff, 0xf1, 0x4f, 0xff, 0x3, 0xff, 0xf0, 0x3f, - 0xff, 0x3, 0xff, 0xf0, 0x2f, 0xff, 0x2, 0xff, - 0xe0, 0x2f, 0xfe, 0x1, 0x99, 0x80, - - /* U+0028 "(" */ - 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0xd, - 0xff, 0xf1, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, - 0x0, 0xdf, 0xff, 0x10, 0x0, 0x4, 0xff, 0xfa, - 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0xf, - 0xff, 0xe0, 0x0, 0x0, 0x4f, 0xff, 0xa0, 0x0, - 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0xdf, 0xff, - 0x10, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x4, - 0xff, 0xfa, 0x0, 0x0, 0x6, 0xff, 0xf8, 0x0, - 0x0, 0x9, 0xff, 0xf5, 0x0, 0x0, 0xb, 0xff, - 0xf3, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, - 0xe, 0xff, 0xf1, 0x0, 0x0, 0xf, 0xff, 0xf0, - 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xf, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, - 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xf0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, - 0xc, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf3, - 0x0, 0x0, 0x9, 0xff, 0xf5, 0x0, 0x0, 0x6, - 0xff, 0xf8, 0x0, 0x0, 0x4, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x10, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, - 0x0, 0x4f, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, - 0xe0, 0x0, 0x0, 0x9, 0xff, 0xf4, 0x0, 0x0, - 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x10, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, - 0xd, 0xff, 0xf1, 0x0, 0x0, 0x4, 0xff, 0xf8, - - /* U+0029 ")" */ - 0x6f, 0xff, 0x70, 0x0, 0x0, 0xd, 0xff, 0xf1, - 0x0, 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, 0x70, - 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0xc, - 0xff, 0xf2, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, - 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xef, - 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, - 0x0, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x5f, 0xff, - 0x90, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x0, - 0xf, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, 0xf0, - 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0xc, - 0xff, 0xf2, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, - 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0xc, 0xff, - 0xf3, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, - 0xc, 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, 0xf1, - 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xf, - 0xff, 0xe0, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, - 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, - 0x70, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, - 0xef, 0xff, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, - 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0xc, 0xff, - 0xf2, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x0, - 0x8f, 0xff, 0x60, 0x0, 0x0, 0xef, 0xff, 0x0, - 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0xd, 0xff, - 0xf1, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, - - /* U+002A "*" */ - 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x10, - 0x5, 0xe6, 0x0, 0xd, 0xfa, 0x0, 0x8, 0xf2, - 0xd, 0xff, 0xc3, 0xd, 0xfa, 0x5, 0xef, 0xfa, - 0x8, 0xff, 0xff, 0x9d, 0xfb, 0xbf, 0xff, 0xe6, - 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, - 0x0, 0x0, 0x3c, 0xff, 0xff, 0xfb, 0x20, 0x0, - 0x0, 0x0, 0x3c, 0xff, 0xff, 0xfb, 0x20, 0x0, - 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x8, 0xff, 0xff, 0x9d, 0xfb, 0xbf, 0xff, 0xe6, - 0xd, 0xff, 0xc3, 0xd, 0xfa, 0x5, 0xef, 0xfa, - 0x5, 0xe6, 0x0, 0xd, 0xfa, 0x0, 0x8, 0xf2, - 0x0, 0x10, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x0, 0x7d, 0xdd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x16, 0x66, - 0x66, 0x66, 0xbf, 0xff, 0x66, 0x66, 0x66, 0x63, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, - - /* U+002C "," */ - 0x9, 0xed, 0x50, 0x9f, 0xff, 0xf2, 0xef, 0xff, - 0xf7, 0xef, 0xff, 0xf7, 0x8f, 0xff, 0xf5, 0x8, - 0xff, 0xf0, 0x7, 0xff, 0xb0, 0xa, 0xff, 0x50, - 0xe, 0xff, 0x0, 0x2f, 0xfb, 0x0, 0x6f, 0xf5, - 0x0, 0xaf, 0xf1, 0x0, - - /* U+002D "-" */ - 0x59, 0x99, 0x99, 0x99, 0x99, 0x96, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+002E "." */ - 0x0, 0x8d, 0xc4, 0x0, 0x9f, 0xff, 0xf2, 0xf, - 0xff, 0xff, 0x70, 0xff, 0xff, 0xf7, 0xa, 0xff, - 0xff, 0x20, 0x1a, 0xed, 0x50, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, - 0x88, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb7, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x4b, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0xaf, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, - 0x3, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x30, 0xa, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, - 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf0, 0x4f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, - 0x8f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf8, 0xbf, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, - 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfd, 0xef, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfe, 0xdf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, - 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfb, 0x8f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, - 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf5, 0xf, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, - 0xa, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xa0, 0x3, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x30, - 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xfa, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xc4, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x7b, 0xef, 0xfe, 0xb7, 0x10, 0x0, 0x0, 0x0, - - /* U+0031 "1" */ - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x7b, 0xbb, 0xbb, 0xbf, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf2, - - /* U+0032 "2" */ - 0x0, 0x0, 0x0, 0x48, 0xce, 0xff, 0xed, 0xa6, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfd, - 0xdf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x2f, 0xff, - 0xff, 0xb6, 0x10, 0x0, 0x2, 0x7f, 0xff, 0xff, - 0x80, 0x0, 0x5f, 0xfe, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xfe, 0x0, 0x0, 0x3c, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfe, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, - - /* U+0033 "3" */ - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xdf, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xfb, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xcc, 0xde, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5c, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x0, 0x2b, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xc0, 0xb, 0xfe, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x4, - 0xff, 0xff, 0xe8, 0x40, 0x0, 0x0, 0x16, 0xdf, - 0xff, 0xfd, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xdd, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x5e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x26, 0xac, 0xef, 0xfe, 0xda, 0x61, 0x0, 0x0, - 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, - 0x0, 0x0, 0x7, 0x88, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x96, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x4b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbf, 0xff, 0xfb, 0xbb, 0xbb, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x0, 0x0, 0x0, - - /* U+0035 "5" */ - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x0, 0x0, 0x0, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xcb, 0xbb, 0xa9, 0x85, 0x20, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x13, 0x59, 0xef, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x60, 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf2, 0x4, 0xff, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, - 0xcf, 0xff, 0xfc, 0x72, 0x0, 0x0, 0x3, 0xaf, - 0xff, 0xff, 0x40, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xed, 0xef, 0xff, 0xff, 0xff, 0x80, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x8b, 0xde, 0xff, 0xeb, 0x83, 0x0, 0x0, - 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, - 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xfd, 0xbb, 0xce, 0xff, 0xf5, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xf9, 0x30, 0x0, 0x0, 0x2, 0x7c, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xf7, 0x0, 0x0, 0x4, 0x57, 0x65, 0x20, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x50, 0x5, 0xbf, 0xff, - 0xff, 0xff, 0xe8, 0x0, 0x0, 0xe, 0xff, 0xf4, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, - 0x0, 0xff, 0xff, 0x4d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, 0xfe, 0xff, - 0xfc, 0x62, 0x0, 0x25, 0xbf, 0xff, 0xff, 0x30, - 0xef, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xfd, 0xd, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xcf, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x89, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x6f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xc2, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xfb, 0xd, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x90, 0x6f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, - 0x3, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x2c, - 0xff, 0xff, 0x60, 0x0, 0x7, 0xff, 0xff, 0xfe, - 0xa8, 0x89, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x27, 0xbd, 0xef, 0xfd, 0x94, 0x0, 0x0, - 0x0, - - /* U+0037 "7" */ - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x6b, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf2, 0xbf, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xfb, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x40, 0xbf, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, - 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x1, - 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0038 "8" */ - 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xfe, 0xdb, - 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xea, 0x88, 0x8a, 0xef, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x50, 0x0, - 0x0, 0x0, 0x5e, 0xff, 0xff, 0x40, 0x0, 0xb, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xfb, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, - 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x10, 0x1, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, - 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0xaf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xa0, 0x0, 0x2, 0xff, 0xff, 0xb1, 0x0, 0x0, - 0x0, 0x1, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xfa, 0x75, 0x45, 0x7a, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, - 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x10, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xa5, 0x20, 0x0, 0x25, - 0xaf, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xfc, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, - 0x20, 0xa, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, 0xef, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x22, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf2, 0x1f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, - 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xe0, 0x8, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf9, - 0x0, 0x1e, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, - 0x2, 0xaf, 0xff, 0xff, 0x10, 0x0, 0x4f, 0xff, - 0xff, 0xfd, 0xa8, 0x78, 0xad, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, - 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, - 0xff, 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, - - /* U+0039 "9" */ - 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, 0xdb, 0x62, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfc, 0x98, - 0x8a, 0xef, 0xff, 0xff, 0x50, 0x0, 0x8, 0xff, - 0xff, 0xa1, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, - 0x20, 0x1, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfc, 0x0, 0x7f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, - 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xb0, 0xcf, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x1c, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf4, 0xbf, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x88, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xfb, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xc0, 0xbf, 0xff, - 0xfa, 0x20, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, - 0xfd, 0x1, 0xef, 0xff, 0xff, 0xc9, 0x88, 0xae, - 0xff, 0xff, 0x9f, 0xff, 0xd0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0xff, 0xfd, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x30, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x17, 0xbe, - 0xff, 0xec, 0x83, 0x0, 0x7, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x30, 0x0, - 0x1, 0xd7, 0x20, 0x0, 0x0, 0x4, 0xaf, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x7f, 0xff, 0xec, 0xbb, - 0xdf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x16, - 0xad, 0xef, 0xfe, 0xca, 0x51, 0x0, 0x0, 0x0, - 0x0, - - /* U+003A ":" */ - 0x1, 0xae, 0xd5, 0x0, 0xaf, 0xff, 0xf3, 0xf, - 0xff, 0xff, 0x70, 0xff, 0xff, 0xf7, 0x9, 0xff, - 0xff, 0x20, 0x8, 0xdb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xdc, 0x40, 0x9, - 0xff, 0xff, 0x20, 0xff, 0xff, 0xf7, 0xf, 0xff, - 0xff, 0x70, 0xaf, 0xff, 0xf2, 0x1, 0xae, 0xd5, - 0x0, - - /* U+003B ";" */ - 0x1, 0xae, 0xd5, 0x0, 0xaf, 0xff, 0xf3, 0xf, - 0xff, 0xff, 0x70, 0xff, 0xff, 0xf7, 0x9, 0xff, - 0xff, 0x20, 0x8, 0xdb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xed, 0x50, 0x9, - 0xff, 0xff, 0x20, 0xef, 0xff, 0xf7, 0xe, 0xff, - 0xff, 0x70, 0x8f, 0xff, 0xf5, 0x0, 0x8f, 0xff, - 0x0, 0x7, 0xff, 0xb0, 0x0, 0xaf, 0xf5, 0x0, - 0xe, 0xff, 0x0, 0x2, 0xff, 0xb0, 0x0, 0x6f, - 0xf5, 0x0, 0xa, 0xff, 0x10, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3a, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6d, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, - 0xfe, 0x81, 0x0, 0x0, 0x0, 0x39, 0xff, 0xff, - 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x6c, 0xff, - 0xff, 0xff, 0xd7, 0x10, 0x0, 0x0, 0x2, 0x9e, - 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x7e, 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, - 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, - 0xef, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0x92, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5b, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x28, 0xea, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - - /* U+003D "=" */ - 0x16, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x64, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x16, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x64, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, - - /* U+003E ">" */ - 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xd6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xbf, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0xff, 0xff, - 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, - 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xfb, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x7d, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x8e, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, - 0xfa, 0x40, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, - 0xff, 0xd7, 0x10, 0x0, 0x0, 0x3, 0x9f, 0xff, - 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x6, 0xdf, - 0xff, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xe8, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xed, 0xa7, - 0x10, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x5e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xec, 0xbb, 0xcf, - 0xff, 0xff, 0xfe, 0x10, 0x5f, 0xff, 0xff, 0x93, - 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0x90, 0x9, - 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xe0, 0x0, 0x4b, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x66, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xaf, 0xd4, 0x0, 0x0, - 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, - 0xcd, 0xef, 0xfe, 0xdb, 0x85, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, 0xfd, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xef, 0xff, 0xfd, 0x84, 0x10, 0x0, 0x0, 0x2, - 0x59, 0xef, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xef, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x20, 0x0, - 0x0, 0x15, 0x55, 0x10, 0xbf, 0xfe, 0x10, 0x0, - 0x0, 0x1e, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5b, - 0xff, 0xff, 0xff, 0xa4, 0x0, 0x6f, 0xff, 0x40, - 0xc, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xfd, 0x0, - 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa1, 0x6f, 0xff, 0x40, 0x2, 0xff, 0xf3, 0x0, - 0x2, 0xff, 0xf3, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x6f, 0xff, 0x40, - 0x0, 0x7f, 0xfb, 0x0, 0x9, 0xff, 0xb0, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0x94, 0x10, 0x14, 0xaf, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xe, 0xff, 0x20, - 0xe, 0xff, 0x40, 0x0, 0x0, 0xbf, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x40, - 0x0, 0x8, 0xff, 0x70, 0x4f, 0xfe, 0x0, 0x0, - 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0x40, 0x0, 0x2, 0xff, 0xc0, - 0x8f, 0xf9, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, - 0x0, 0x0, 0xef, 0xf0, 0xaf, 0xf6, 0x0, 0x0, - 0xf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0xbf, 0xf2, - 0xdf, 0xf3, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x40, - 0x0, 0x0, 0x8f, 0xf4, 0xef, 0xf2, 0x0, 0x0, - 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xf5, - 0xff, 0xf1, 0x0, 0x0, 0x5f, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x40, - 0x0, 0x0, 0x7f, 0xf6, 0xff, 0xf1, 0x0, 0x0, - 0x5f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xf5, - 0xef, 0xf2, 0x0, 0x0, 0x4f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, - 0x0, 0x0, 0x8f, 0xf4, 0xdf, 0xf4, 0x0, 0x0, - 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0xaf, 0xf3, - 0xaf, 0xf6, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, - 0x0, 0x0, 0xdf, 0xf0, 0x7f, 0xfa, 0x0, 0x0, - 0x8, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0x40, 0x0, 0x1, 0xff, 0xd0, - 0x3f, 0xfe, 0x0, 0x0, 0x1, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x50, - 0x0, 0x7, 0xff, 0x80, 0xe, 0xff, 0x40, 0x0, - 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x2f, 0xff, 0x20, - 0x9, 0xff, 0xc0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xe9, 0x54, 0x69, 0xef, 0xff, 0x6e, 0xff, 0xfa, - 0x57, 0xef, 0xfa, 0x0, 0x2, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0xcf, 0xff, - 0xff, 0xfd, 0x20, 0x0, 0x0, 0x1e, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x16, 0xbe, 0xff, 0xeb, 0x60, - 0x0, 0x0, 0x7, 0xdf, 0xfc, 0x70, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xfd, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xfd, 0x95, - 0x20, 0x0, 0x0, 0x14, 0x7c, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x19, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x69, 0xce, 0xff, 0xfe, 0xca, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, - 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, - 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, - 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, - 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, - 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, - 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xc0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xa7, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0xdf, 0xff, 0x70, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, - 0x0, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, - 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, - 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xa0, - 0x6, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, - 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, - - /* U+0042 "B" */ - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xc9, 0x50, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x9f, - 0xff, 0xc7, 0x77, 0x77, 0x77, 0x78, 0x8b, 0xef, - 0xff, 0xff, 0xc0, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xf6, - 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x10, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf3, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x13, 0x7d, 0xff, 0xff, 0x70, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa2, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x9f, 0xff, 0xc7, 0x77, 0x77, 0x77, 0x77, 0x78, - 0xad, 0xff, 0xff, 0xfb, 0x0, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, - 0xff, 0x80, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf6, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xf9, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf9, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf8, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, - 0xff, 0xd0, 0x9f, 0xff, 0xc7, 0x77, 0x77, 0x77, - 0x77, 0x78, 0xad, 0xff, 0xff, 0xff, 0x30, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, - 0xfe, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfe, - 0xde, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x0, 0x0, 0x27, - 0xcf, 0xff, 0xff, 0x70, 0x0, 0xaf, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, - 0xc1, 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xc1, 0x0, 0x1f, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x6, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xcc, 0x10, 0x0, 0xa, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, - 0xfd, 0x10, 0x0, 0xb, 0xff, 0xff, 0xfe, 0x83, - 0x0, 0x0, 0x2, 0x7d, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xed, 0xef, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xff, - 0xec, 0x84, 0x0, 0x0, 0x0, - - /* U+0044 "D" */ - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, - 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc5, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x30, 0x0, 0x0, 0x9, 0xff, 0xfe, 0xbb, 0xbb, - 0xbb, 0xbb, 0xcd, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x9f, 0xff, 0xff, 0x70, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4e, 0xff, 0xff, 0x30, 0x9, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xfd, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf5, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xb0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x19, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x79, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf9, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xa9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x99, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf7, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x49, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf1, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, - 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xd0, 0x9, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xef, 0xff, 0xf3, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xf7, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbc, - 0xdf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x60, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xca, 0x72, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0045 "E" */ - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xb1, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x9f, 0xff, 0xda, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xa3, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xb8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, - - /* U+0046 "F" */ - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xb1, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xb3, 0x0, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xbd, 0xef, - 0xfe, 0xc9, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xed, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf9, 0x40, 0x0, - 0x0, 0x15, 0xaf, 0xff, 0xff, 0xc0, 0x0, 0xa, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xbf, 0xff, 0x30, 0x0, 0x6f, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xe3, 0x0, 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x22, 0x20, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, - 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0xcf, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xd0, 0x9f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xd0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, - 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x8, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xd0, 0x1, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xd0, 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, - 0x0, 0xa, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x9f, 0xff, 0xd0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x14, - 0x9f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, 0xfd, 0xc9, - 0x51, 0x0, 0x0, 0x0, - - /* U+0048 "H" */ - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x9f, 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xce, 0xff, 0xfb, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, - - /* U+0049 "I" */ - 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, - 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, - 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, - 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, - 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, - 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, - 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, - 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, - 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, - 0x99, 0xff, 0xf9, - - /* U+004A "J" */ - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x4b, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x8, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf0, 0x6, 0xff, 0x90, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xfc, 0x2, 0xff, 0xff, - 0xc4, 0x0, 0x0, 0x2c, 0xff, 0xff, 0x50, 0xa, - 0xff, 0xff, 0xfe, 0xcb, 0xdf, 0xff, 0xff, 0xc0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, - 0xfe, 0xc8, 0x30, 0x0, 0x0, - - /* U+004B "K" */ - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xd1, 0x9, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xd1, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe2, 0x0, - 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xe2, 0x0, 0x0, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xf3, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, - 0x0, 0x6f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x5f, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf9, 0x0, 0x5f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, - 0x4f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf9, 0x3f, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0x35, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x30, - 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0x40, 0x0, 0x9, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0x40, 0x0, 0x0, 0xc, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x9, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x0, - 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xf5, 0x0, 0x9, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xf2, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd1, 0x9, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xb0, - - /* U+004C "L" */ - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0x69, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, - - /* U+004D "M" */ - 0x9f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, - 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, - 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, - 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfa, - 0x9f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfa, - 0x9f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xfa, - 0x9f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfa, - 0x9f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xfa, - 0x9f, 0xff, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0xff, 0xfa, - 0x9f, 0xff, 0x7d, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd6, 0xff, 0xfa, - 0x9f, 0xff, 0x74, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x45, 0xff, 0xfa, - 0x9f, 0xff, 0x70, 0xaf, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xfa, 0x5, 0xff, 0xfa, - 0x9f, 0xff, 0x70, 0x1f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf1, 0x5, 0xff, 0xfa, - 0x9f, 0xff, 0x70, 0x7, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x70, 0x5, 0xff, 0xfa, - 0x9f, 0xff, 0x70, 0x0, 0xdf, 0xff, 0x40, 0x0, - 0x0, 0x2, 0xff, 0xfe, 0x0, 0x5, 0xff, 0xfa, - 0x9f, 0xff, 0x70, 0x0, 0x5f, 0xff, 0xd0, 0x0, - 0x0, 0xa, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xfa, - 0x9f, 0xff, 0x70, 0x0, 0xb, 0xff, 0xf7, 0x0, - 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x5, 0xff, 0xfa, - 0x9f, 0xff, 0x70, 0x0, 0x2, 0xff, 0xff, 0x10, - 0x0, 0xcf, 0xff, 0x20, 0x0, 0x5, 0xff, 0xfa, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x8f, 0xff, 0x90, - 0x6, 0xff, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xfa, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf3, - 0xe, 0xff, 0xe1, 0x0, 0x0, 0x5, 0xff, 0xfa, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x6, 0xff, 0xfc, - 0x8f, 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - - /* U+004E "N" */ - 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfb, 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfb, 0x9f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, - 0x9f, 0xff, 0x9b, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, - 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x2f, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, - 0xff, 0x90, 0x5, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, - 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfb, 0x9f, 0xff, 0x90, 0x0, 0xb, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, - 0x90, 0x0, 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, - 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x3f, 0xff, 0xfe, 0x20, 0x0, 0x8, 0xff, 0xfb, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xd0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfa, 0x0, 0x8, - 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0x70, 0x8, 0xff, 0xfb, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xf3, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x18, 0xff, - 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xc8, 0xff, 0xfb, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfb, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, - - /* U+004F "O" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, - 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xed, - 0xef, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x0, - 0x0, 0x26, 0xcf, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, - 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, - 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x0, - 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, - 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, - 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, - 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, - 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, - 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, - 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, - 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, - 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, - 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, - 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x0, - 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, - 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x0, - 0x0, 0x26, 0xcf, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xed, - 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, - 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0050 "P" */ - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xd9, - 0x61, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x9, 0xff, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xaf, 0xff, 0xff, 0x50, 0x9, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xfe, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x9, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xb0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x19, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf6, 0x9, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x0, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xaf, 0xff, 0xff, 0x50, 0x9, 0xff, 0xfe, 0xcc, - 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xda, 0x61, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, - 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xfe, 0xde, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xe8, - 0x30, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x1e, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0x50, 0x0, 0x8, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xfd, 0x0, 0x0, 0xef, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x4f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x90, 0x8, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0xcf, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0xe, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x20, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0xf, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, - 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, - 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x10, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xe0, 0x5, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfa, 0x0, 0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x40, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xe0, 0x0, 0x2, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf6, 0x0, 0x0, 0x8, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xfd, 0x61, 0x0, 0x0, 0x0, 0x5b, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xff, 0xfe, 0xcb, 0xbd, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xff, 0xff, - 0xf6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xc2, 0x0, 0x0, 0x3, 0xcf, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xfb, 0x86, 0x8c, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xb6, - 0x10, 0x0, - - /* U+0052 "R" */ - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xd9, - 0x61, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x9, 0xff, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xaf, 0xff, 0xff, 0x50, 0x9, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xfe, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x9, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xb0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x19, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf7, 0x9, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfe, 0x10, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x9f, 0xff, 0xff, 0x60, 0x9, 0xff, 0xfd, 0xaa, - 0xaa, 0xaa, 0xab, 0xcf, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x9, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x9, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xf2, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, - 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x70, 0x0, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x30, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0x9f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xf9, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, - - /* U+0053 "S" */ - 0x0, 0x0, 0x0, 0x4, 0x8b, 0xef, 0xff, 0xec, - 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, - 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xdb, 0xab, 0xcf, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x8f, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, - 0x38, 0xef, 0xf6, 0x0, 0x0, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, - 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xfa, 0x51, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x8d, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4c, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf4, 0x0, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, - 0x7, 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xa5, - 0x10, 0x0, 0x0, 0x1, 0x6e, 0xff, 0xff, 0x40, - 0x1d, 0xff, 0xff, 0xff, 0xfd, 0xcb, 0xab, 0xdf, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, - 0xbd, 0xff, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, - - /* U+0054 "T" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x79, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbe, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, - 0xbb, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0055 "U" */ - 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, - 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, - 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf0, 0xcf, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0xaf, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xd0, 0x7f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xa0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0xf, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x20, 0x9, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfb, 0x0, - 0x2, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0xf4, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xa4, 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, - 0x90, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfe, - 0xde, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xde, 0xfe, - 0xdb, 0x83, 0x0, 0x0, 0x0, 0x0, - - /* U+0056 "V" */ - 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, - 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, - 0xef, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, 0x0, 0x8, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x1f, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0xaf, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf9, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0xd, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x90, 0x0, - 0x0, 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x0, 0x0, - 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0xb, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, 0x2, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x9f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xf2, 0xf, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x96, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xdf, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0057 "W" */ - 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc2, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf7, 0xd, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x20, 0x8f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xc0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, - 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, - 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x3, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xf3, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf7, 0x0, 0x0, 0xd, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x7, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x20, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x2f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf3, 0x0, 0xdf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfd, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x80, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf3, 0x0, - 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x8, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, - 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, 0x0, 0x7, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, - 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, - 0xd0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, 0xb, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, - 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf5, 0x0, 0x1, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, - 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xb0, 0x0, 0x6f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x2f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x30, 0x7, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, - 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xf8, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x6f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xd0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xc, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x37, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf6, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0xcf, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xef, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, - - /* U+0058 "X" */ - 0x6, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0x90, 0x0, 0xbf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xfd, 0x0, 0x0, 0x1e, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf3, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, - 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x20, 0x0, - 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xc0, 0x5, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf7, 0x1e, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xef, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf6, 0x4f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xb0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x10, 0x0, - 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x3f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x1e, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xf3, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, - 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xa0, 0x2f, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf5, - - /* U+0059 "Y" */ - 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, 0x4f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x70, 0x0, 0xaf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xd0, 0x0, 0x1, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf4, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, - 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, 0x4f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x50, 0xd, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfe, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xfa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+005A "Z" */ - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xa, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xeb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb4, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - - /* U+005B "[" */ - 0x9f, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, - 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, 0xf3, 0x9f, - 0xff, 0xa6, 0x66, 0x61, 0x9f, 0xff, 0x70, 0x0, - 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, - 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, - 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, - 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, - 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, - 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, - 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, - 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, - 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, - 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, - 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, - 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, - 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, - 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, - 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, - 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0xa6, 0x66, - 0x61, 0x9f, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, - 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, 0xf3, - - /* U+005C "\\" */ - 0x48, 0x88, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xfc, - - /* U+005D "]" */ - 0x3f, 0xff, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, - 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xf9, 0x16, - 0x66, 0x6a, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, - 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, - 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, - 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, - 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, - 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, - 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, - 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, - 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, - 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, - 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, - 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, - 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, - 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, - 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, - 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, - 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, - 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, - 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, - 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, - 0x0, 0x7, 0xff, 0xf9, 0x16, 0x66, 0x6a, 0xff, - 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xf9, 0x3f, 0xff, - 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xf9, - - /* U+005E "^" */ - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xd4, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xf6, 0xe, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x8f, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, 0x1, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, - 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x5f, - 0xfd, 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x60, 0x0, 0x0, 0xef, 0xf4, 0x0, - 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xff, - 0xa0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x10, 0x0, 0xf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x6, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xe0, 0x0, 0xdf, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, - 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xfb, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xf2, - - /* U+005F "_" */ - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - - /* U+0060 "`" */ - 0x6, 0x88, 0x88, 0x20, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf4, - - /* U+0061 "a" */ - 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, 0xc8, 0x30, - 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x10, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0xe, 0xff, - 0xff, 0xfc, 0xa9, 0xac, 0xff, 0xff, 0xfe, 0x10, - 0x6, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x2b, 0xff, - 0xff, 0x80, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x5a, 0xde, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x2f, 0xff, 0xfc, 0x51, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf7, 0x9f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0xdf, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, - 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf7, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf7, 0x8f, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xf7, 0x2f, 0xff, - 0xff, 0x95, 0x33, 0x59, 0xff, 0xff, 0xff, 0xf7, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, - 0xff, 0xf7, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x15, 0xff, 0xf7, 0x0, 0x0, 0x5a, 0xdf, - 0xfe, 0xc8, 0x30, 0x5, 0xff, 0xf7, - - /* U+0062 "b" */ - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, - 0x27, 0xce, 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x1a, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x70, 0x0, 0x0, 0x2f, 0xff, 0xd2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x2f, 0xff, 0xee, 0xff, 0xff, 0xdb, 0xac, 0xef, - 0xff, 0xff, 0xe1, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0x92, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xfc, 0x0, - 0x2f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x60, 0x2f, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe0, - 0x2f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf4, 0x2f, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, - 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfb, 0x2f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, 0x2f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, - 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfb, 0x2f, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, - 0x2f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf4, 0x2f, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, - 0x2f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0x60, 0x2f, 0xff, 0xff, 0xff, - 0xa3, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xfc, 0x0, - 0x2f, 0xff, 0xcd, 0xff, 0xff, 0xdb, 0xac, 0xef, - 0xff, 0xff, 0xd1, 0x0, 0x2f, 0xff, 0xb2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x2f, 0xff, 0xb0, 0x1a, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x70, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, - 0x28, 0xce, 0xff, 0xda, 0x60, 0x0, 0x0, 0x0, - - /* U+0063 "c" */ - 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xda, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xdb, 0xab, - 0xef, 0xff, 0xff, 0xa0, 0x0, 0x1e, 0xff, 0xff, - 0xa3, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xf5, 0x0, - 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0x80, 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x93, 0x0, 0x9, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x93, 0x0, 0x0, 0xaf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, 0x1e, - 0xff, 0xff, 0xa3, 0x0, 0x0, 0x4, 0xcf, 0xff, - 0xf5, 0x0, 0x3, 0xff, 0xff, 0xff, 0xeb, 0xab, - 0xef, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, - 0xff, 0xda, 0x50, 0x0, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x2, - 0x7b, 0xef, 0xfd, 0xb6, 0x10, 0x3, 0xff, 0xfd, - 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xe6, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xfd, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xdb, 0xac, 0xef, - 0xff, 0xfc, 0xff, 0xfd, 0x0, 0x2f, 0xff, 0xff, - 0xa3, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xfd, - 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xfd, 0x4, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, - 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xfd, 0xe, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, - 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfd, 0x2f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, - 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, 0x2f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, - 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfd, 0xe, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, - 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xfd, 0x4, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, - 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xfd, 0x0, 0x2f, 0xff, 0xff, - 0xa3, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xfd, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xdb, 0xac, 0xef, - 0xff, 0xfa, 0xff, 0xfd, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xff, 0xfd, - 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x2, - 0x7b, 0xef, 0xfd, 0xb6, 0x0, 0x0, 0xff, 0xfd, - - /* U+0065 "e" */ - 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfe, 0xb7, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd2, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xea, - 0x88, 0xae, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x2f, - 0xff, 0xfe, 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xc0, 0x0, 0xb, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0x70, 0x3, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, - 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf4, 0xe, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x91, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfc, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xd1, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x5d, - 0xff, 0xc0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfe, - 0xba, 0xac, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5a, 0xde, 0xfe, 0xdb, 0x61, 0x0, 0x0, - 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x0, 0x0, 0x6b, 0xef, 0xfd, 0x92, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfa, 0x76, - 0xaf, 0x60, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x26, 0x66, - 0xcf, 0xff, 0xa6, 0x66, 0x66, 0x50, 0x0, 0x0, - 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x0, 0x0, 0x2, 0x8b, 0xef, 0xfd, 0xb7, - 0x10, 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0xb, 0xff, - 0xf1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0xbf, 0xff, 0x10, 0x0, 0x7f, - 0xff, 0xff, 0xfd, 0xba, 0xbd, 0xff, 0xff, 0xed, - 0xff, 0xf1, 0x0, 0x4f, 0xff, 0xff, 0x81, 0x0, - 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0x10, 0xe, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xf1, 0x6, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, - 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf1, 0xf, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0x12, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf1, 0x3f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x13, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x1f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x10, 0xef, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf1, 0xa, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0x10, 0x3f, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xf1, - 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0xff, 0xff, 0xff, 0x10, 0x1, 0xef, 0xff, - 0xfe, 0x83, 0x10, 0x13, 0x8e, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0xef, 0xff, 0x10, 0x0, 0x2, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, - 0xff, 0xff, 0xb3, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x58, 0x99, 0x75, 0x10, 0x0, - 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x2, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, - 0x0, 0x0, 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xfe, 0x0, 0x0, 0x5f, 0xff, - 0xe7, 0x20, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, - 0x70, 0x0, 0xd, 0xff, 0xff, 0xff, 0xec, 0xaa, - 0xac, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x15, 0x8c, 0xde, 0xff, 0xec, 0x84, - 0x0, 0x0, 0x0, 0x0, - - /* U+0068 "h" */ - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x38, - 0xce, 0xfe, 0xda, 0x50, 0x0, 0x0, 0x2f, 0xff, - 0xd0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, - 0x0, 0x2f, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xdb, 0xce, 0xff, 0xff, 0xff, 0x30, 0x2f, - 0xff, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x2a, 0xff, - 0xff, 0xc0, 0x2f, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x2f, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, - 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xfc, 0x2f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x2f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xfe, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - - /* U+0069 "i" */ - 0x2, 0x66, 0x0, 0x4f, 0xff, 0xd1, 0xcf, 0xff, - 0xf7, 0xdf, 0xff, 0xf7, 0x8f, 0xff, 0xf2, 0x8, - 0xcc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, - 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, - 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, - 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, - 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, - 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, - 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, - 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, - 0x2f, 0xff, 0xd0, - - /* U+006A "j" */ - 0x0, 0x0, 0x0, 0x0, 0x16, 0x61, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x5, 0xcc, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xd0, 0x4, 0x0, 0x0, 0x1d, 0xff, 0xf9, - 0x0, 0xfe, 0x98, 0x9e, 0xff, 0xff, 0x30, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x6, 0xbe, 0xff, 0xda, - 0x30, 0x0, 0x0, - - /* U+006B "k" */ - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x50, 0x2f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0x60, 0x2, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x60, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0x60, 0x0, 0x2, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x0, 0x1d, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x2e, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xd0, 0x2e, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xfd, 0x3e, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0x40, 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0x30, 0x0, 0xcf, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x30, - 0x0, 0x1, 0xef, 0xff, 0xe2, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, 0x2, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x50, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0x20, 0x2, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, - 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xfa, 0x2, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, - - /* U+006C "l" */ - 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, - 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, - 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, - 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, - 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, - 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, - 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, - 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, - 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, - 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, - - /* U+006D "m" */ - 0x2f, 0xff, 0xb0, 0x0, 0x5a, 0xde, 0xfe, 0xc8, - 0x30, 0x0, 0x0, 0x0, 0x49, 0xce, 0xfe, 0xd9, - 0x50, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x4d, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x2f, 0xff, - 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x2f, 0xff, 0xef, 0xff, 0xfc, 0x98, 0x9c, - 0xff, 0xff, 0xfb, 0x7f, 0xff, 0xfe, 0xa8, 0x8a, - 0xef, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfb, - 0x20, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x2f, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf1, 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf5, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, - 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xfa, 0x2f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xfc, - - /* U+006E "n" */ - 0x2f, 0xff, 0xb0, 0x0, 0x49, 0xce, 0xfe, 0xda, - 0x50, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x2f, 0xff, - 0xb6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x2f, 0xff, 0xef, 0xff, 0xfd, 0x98, 0x8a, - 0xef, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xfc, - 0x30, 0x0, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x2f, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf4, 0x2f, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf8, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, - 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfd, 0x2f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0x2f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, - - /* U+006F "o" */ - 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xc9, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xdb, 0xab, 0xef, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x4, - 0xcf, 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, - 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xd0, 0x9, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf4, - 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf8, 0x1f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, - 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfd, 0x3f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, - 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfd, 0x1f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, - 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf8, 0x9, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, - 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xd0, 0x0, 0xaf, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, - 0x0, 0x1e, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, - 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xdb, 0xac, 0xef, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xd9, - 0x40, 0x0, 0x0, 0x0, - - /* U+0070 "p" */ - 0x2f, 0xff, 0xb0, 0x0, 0x38, 0xce, 0xff, 0xda, - 0x50, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x2b, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, - 0x2f, 0xff, 0xb4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x2f, 0xff, 0xdf, 0xff, - 0xfe, 0x97, 0x68, 0xbf, 0xff, 0xff, 0xe1, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2, - 0xaf, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x60, - 0x2f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xe0, 0x2f, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf4, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf8, 0x2f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, - 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfd, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, - 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfd, 0x2f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, - 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf8, 0x2f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, - 0x2f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xd0, 0x2f, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0x60, - 0x2f, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, - 0xdf, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xed, 0xff, - 0xff, 0xdb, 0xac, 0xef, 0xff, 0xff, 0xd1, 0x0, - 0x2f, 0xff, 0xd1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x2f, 0xff, 0xd0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x0, 0x27, 0xce, 0xff, 0xda, - 0x60, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfd, 0xb6, - 0x10, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xff, 0xfd, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb1, 0xff, 0xfd, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xdb, 0xac, 0xef, 0xff, 0xfa, 0xff, 0xfd, - 0x0, 0x2f, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, - 0xdf, 0xff, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, - 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xfd, 0xa, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, - 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfd, 0x1f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, - 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfd, 0x3f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, - 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfd, 0x1f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, - 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfd, 0x9, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, - 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, - 0x0, 0x2f, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, - 0xdf, 0xff, 0xff, 0xfd, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xdb, 0xac, 0xef, 0xff, 0xfc, 0xff, 0xfd, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x93, 0xff, 0xfd, 0x0, 0x0, 0x2, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xe5, 0x3, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfd, 0xa5, - 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, - - /* U+0072 "r" */ - 0x2f, 0xff, 0xb0, 0x0, 0x49, 0xce, 0xc2, 0xff, - 0xfb, 0x2, 0xcf, 0xff, 0xfc, 0x2f, 0xff, 0xb3, - 0xff, 0xff, 0xff, 0xc2, 0xff, 0xfc, 0xef, 0xff, - 0xff, 0xfc, 0x2f, 0xff, 0xff, 0xff, 0xa4, 0x10, - 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, 0xc9, 0x61, - 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x40, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xff, - 0xda, 0x89, 0xac, 0xff, 0xff, 0x50, 0xd, 0xff, - 0xfc, 0x20, 0x0, 0x0, 0x0, 0x5d, 0xc0, 0x2, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xa6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x10, 0x0, - 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb3, 0x0, 0x0, 0x0, 0x27, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x58, 0xbf, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xc0, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xfb, 0x1f, 0xfd, 0x72, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x68, 0xff, 0xff, 0xfe, - 0xba, 0x99, 0xbe, 0xff, 0xff, 0xd0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, - 0x0, 0x0, 0x1, 0x59, 0xce, 0xff, 0xed, 0xa7, - 0x10, 0x0, 0x0, - - /* U+0074 "t" */ - 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x26, 0x66, 0xcf, 0xff, - 0xa6, 0x66, 0x66, 0x50, 0x0, 0x0, 0x9, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x60, 0x0, 0x3, 0x10, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xc8, 0x8b, 0xf8, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x18, 0xce, 0xfe, 0xb7, 0x0, - - /* U+0075 "u" */ - 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, - 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf9, 0x5f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xf9, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf9, 0x3f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf9, - 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xf9, 0xa, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xf9, 0x3, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, - 0xf9, 0x0, 0xaf, 0xff, 0xff, 0xfc, 0xbc, 0xef, - 0xff, 0xfc, 0xff, 0xf9, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xf9, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4, - 0xff, 0xf9, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, - 0xb6, 0x10, 0x4, 0xff, 0xf9, - - /* U+0076 "v" */ - 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0x40, 0x7f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xd0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x9, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0x10, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, - 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf2, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, - 0x0, 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x40, 0x0, 0xb, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x9f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x80, 0xf, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x6, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xf6, 0xdf, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xef, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0077 "w" */ - 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf5, 0x3f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0xd, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x90, 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x30, 0x2, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x0, 0x0, - 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xf8, 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x8c, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf2, 0x0, 0x0, 0x1f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x26, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, - 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xdf, - 0xfc, 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, - 0x0, 0x3, 0xff, 0xf6, 0x0, 0xaf, 0xff, 0x10, - 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, - 0xff, 0xfc, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, - 0x4f, 0xff, 0x60, 0x0, 0x0, 0xef, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x20, 0x0, 0xe, - 0xff, 0xa0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x4, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0x70, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x8, 0xff, - 0xf2, 0x0, 0x9, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xd0, 0x0, 0xbf, 0xfe, 0x0, - 0x0, 0x2, 0xff, 0xf8, 0x0, 0xf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, 0x1, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, - 0x5f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf8, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x30, 0xbf, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xc, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x91, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x6f, 0xff, 0x70, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xe6, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, - - /* U+0078 "x" */ - 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xfc, 0x0, 0xd, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x10, 0x0, - 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x9f, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, - 0x5f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x50, 0x1e, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x2c, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf9, 0x7, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0xb, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x20, 0x0, 0x1e, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0x60, 0x0, 0x0, 0x4f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xe1, 0x0, 0x0, 0x8f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xb0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x70, 0x1e, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x30, - - /* U+0079 "y" */ - 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0x40, 0x6f, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xd0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf6, 0x0, 0x8, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, - 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf2, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, - 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, - 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x80, 0x0, 0xc, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, - 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf6, 0x0, 0x9f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xd0, 0x1f, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x37, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xfb, 0xef, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x91, 0x0, - 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfa, 0x89, 0xef, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6b, 0xef, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x6a, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - - /* U+007B "{" */ - 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xff, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfa, 0x76, - 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x9f, 0xff, 0xfd, 0x30, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x47, 0x9f, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x76, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x39, 0xdf, 0xff, - - /* U+007C "|" */ - 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, - 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, - 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, - 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, - 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, - 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, - 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, - 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, - 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, - 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, - 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, - 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, - 0xff, 0x29, 0xff, 0xf2, - - /* U+007D "}" */ - 0x3f, 0xff, 0xc8, 0x10, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x1, 0x68, 0xcf, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, - 0x50, 0x0, 0x0, 0xaf, 0xff, 0xe8, 0x72, 0x0, - 0x0, 0xe, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, - 0x0, 0x0, 0x16, 0x8c, 0xff, 0xff, 0x80, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x3, 0xff, 0xfc, - 0x81, 0x0, 0x0, 0x0, - - /* U+007E "~" */ - 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xf9, 0x10, - 0x0, 0x0, 0x0, 0xae, 0xe0, 0x1, 0xdf, 0xff, - 0xff, 0xfe, 0x40, 0x0, 0x0, 0xe, 0xfe, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x5, - 0xff, 0xb0, 0x1f, 0xff, 0x81, 0x6, 0xef, 0xff, - 0xc5, 0x37, 0xff, 0xf6, 0x4, 0xff, 0xb0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, - 0xf4, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0x30, 0x6, 0xbb, 0x10, 0x0, 0x0, 0x0, 0x3a, - 0xef, 0xe9, 0x20, 0x0, - - /* U+00B0 "°" */ - 0x0, 0x0, 0x29, 0xdf, 0xec, 0x60, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x7f, 0xfd, 0x75, 0x5a, 0xff, 0xe1, 0x0, 0x2f, - 0xfa, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x9, 0xfd, - 0x0, 0x0, 0x0, 0x5, 0xff, 0x30, 0xef, 0x70, - 0x0, 0x0, 0x0, 0xe, 0xf8, 0xf, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xa0, 0xff, 0x40, 0x0, - 0x0, 0x0, 0xb, 0xfa, 0xe, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xef, 0x80, 0x9f, 0xd0, 0x0, 0x0, - 0x0, 0x6f, 0xf3, 0x2, 0xff, 0xb0, 0x0, 0x0, - 0x4f, 0xfc, 0x0, 0x7, 0xff, 0xe8, 0x56, 0xaf, - 0xfe, 0x10, 0x0, 0x7, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x0, 0x2, 0x9d, 0xfe, 0xc6, 0x0, - 0x0, - - /* U+2022 "•" */ - 0x0, 0x3b, 0xdb, 0x40, 0x0, 0x4f, 0xff, 0xff, - 0x60, 0xe, 0xff, 0xff, 0xff, 0x12, 0xff, 0xff, - 0xff, 0xf5, 0x3f, 0xff, 0xff, 0xff, 0x50, 0xff, - 0xff, 0xff, 0xf1, 0x6, 0xff, 0xff, 0xf8, 0x0, - 0x5, 0xdf, 0xd7, 0x0, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x5a, 0xca, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x9d, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x5a, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x9d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x84, 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x62, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, - 0x40, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xfe, 0xa5, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0x83, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x47, 0x89, 0x86, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x1, 0x35, 0x53, 0x6f, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x2, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x8c, 0xdd, 0xda, 0x71, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x9d, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F008 "" */ - 0x6, 0x50, 0x0, 0x1, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x10, 0x0, 0x5, 0x60, 0xbf, 0xa0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0xa, 0xfb, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xc, 0xff, 0xff, - 0xfe, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xcc, 0xce, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xec, 0xcc, 0xcf, 0xff, 0xff, 0xb0, - 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, - 0x0, 0xb, 0xff, 0xff, 0xa0, 0x0, 0x2, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0xa, 0xff, - 0xff, 0xa0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x20, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, - 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, - 0xa, 0xff, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x50, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0xaa, 0xad, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xda, 0xaa, 0xaf, 0xff, 0xff, 0xa0, - 0x0, 0x2, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0x20, - 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xa, 0xff, - 0xff, 0xa0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0xa, 0xff, 0xff, 0xd2, 0x22, 0x27, 0xff, 0xff, - 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x35, 0xff, 0xff, 0x72, 0x22, 0x2d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x88, 0x8c, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xc8, 0x88, 0x8f, 0xff, 0xff, 0xa0, - 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, - 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x2, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0xa, 0xff, - 0xff, 0xa0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x20, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, - 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, - 0xa, 0xff, 0xff, 0xe4, 0x44, 0x49, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x94, 0x44, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 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, 0xe6, 0x66, 0x6a, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa6, 0x66, 0x6e, 0xff, 0xef, 0xa0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0xa, 0xfe, 0x4e, 0xa0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xa, 0xe4, - - /* U+F00B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x5, - 0x77, 0x77, 0x77, 0x77, 0x61, 0x0, 0x0, 0x67, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x6, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe4, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x6, 0x88, 0x88, 0x88, 0x88, 0x71, 0x0, 0x1, - 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, - 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x6, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd4, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x7, 0x88, 0x88, 0x88, 0x88, 0x72, 0x0, - 0x1, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x3, 0xcd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6d, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x5, - 0xef, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xef, 0xe3, 0x0, 0x5, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xf3, 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xfd, 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x81, - 0xdf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xc0, 0x1, 0xdf, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xc0, 0x0, 0x1, 0x8b, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8b, 0x70, 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0xcc, 0xb6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0x93, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x18, 0x92, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0x20, - 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2d, 0xff, 0xff, 0xb0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x5, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, - 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x1, 0xff, 0xff, - 0xff, 0x70, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x2, 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0x30, 0x2, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0x90, 0x7, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xe0, - 0xc, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xf5, 0x2f, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf8, 0x4f, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xfa, 0x5f, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xfb, 0x5f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xfb, 0x4f, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xfb, 0x3f, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4c, 0xee, 0xd8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf9, - 0x1f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xf7, 0xd, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xf5, 0xa, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf1, 0x5, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb7, 0x31, 0x0, 0x12, 0x5a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x67, 0x89, - 0x87, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x19, 0xcf, 0xff, 0xff, 0xeb, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x91, - 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe7, 0x0, 0x0, 0x2b, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xfe, 0x60, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x19, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xdb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x4c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x3c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x30, 0x0, 0x2, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x30, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x53, 0x36, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xe6, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x1, - 0xaf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, 0x20, - 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x70, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x47, 0x89, 0x98, 0x64, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xdf, 0xe7, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0xff, 0x70, 0x5f, 0xff, 0xff, 0xff, - 0xda, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x2, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x1b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0x3a, 0x50, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb1, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x60, - 0xef, 0xff, 0xff, 0xfd, 0x20, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, - 0x9f, 0xff, 0xff, 0xa0, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x7f, 0xff, 0xff, 0xc0, - 0xc, 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x5, 0xff, 0xfe, 0x10, - 0x1, 0xef, 0x50, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x2e, 0xf4, 0x0, - 0x0, 0x11, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x53, 0x33, 0x33, 0x4d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7b, 0xbb, 0xbb, 0xbb, - 0xbb, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x9b, 0xbb, - 0xbb, 0xbb, 0xbb, 0x90, 0x0, 0x0, 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5c, 0xdd, 0xdd, 0xdd, 0xc5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x11, 0x11, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x41, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xc, - 0xff, 0xc1, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x99, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xbb, 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, 0xfc, 0xaf, 0xff, 0xea, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x6, 0xff, 0x10, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x3, 0xfd, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x2c, 0xff, 0x71, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x20, - - /* U+F01C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xf5, 0x0, - 0xc, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x10, - 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, - 0xdf, 0xff, 0xff, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xf1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6b, 0xcc, 0xc8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, - 0xfd, 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x60, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0xaf, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x9f, 0xff, 0xff, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0x95, 0x10, 0x0, 0x1, 0x5b, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0xff, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0x81, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xd, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x22, 0x10, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xdf, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xed, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x3, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x6, 0xaa, 0xa9, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9a, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x90, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x89, - 0xab, 0xbb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xf9, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xf2, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xfe, 0x10, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6d, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, - 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x74, 0x22, 0x46, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xfa, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xfb, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1, 0x7d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x8a, 0xbb, - 0xb9, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x25, 0x55, 0x51, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0x19, 0xbb, 0xbb, 0xbb, - 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xd4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x19, 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x11, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0x80, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xfb, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xc, 0xff, 0xff, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x1, 0xcf, 0xff, 0xf1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0xc, 0xff, 0xf7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2e, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x5, 0xff, 0xff, 0xe0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xff, 0x40, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xd, 0xff, 0xf6, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x3, 0xcc, 0x30, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xdd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x16, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2d, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1, 0xbc, - 0x50, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xf9, 0x0, 0x0, 0xc, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xb0, 0x0, 0x1, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x7f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0x70, 0x0, 0xd, 0xff, 0xf7, 0x0, - 0x19, 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xf2, 0x0, 0x6, 0xff, 0xfd, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x33, 0x0, 0x0, - 0x1e, 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, 0x20, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x8, 0xff, 0xa0, 0x0, - 0x4, 0xff, 0xff, 0x20, 0x0, 0xaf, 0xff, 0x70, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xfc, 0x0, - 0x0, 0xcf, 0xff, 0x70, 0x0, 0x5f, 0xff, 0xb0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xb, 0xff, 0xff, 0x90, - 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x1f, 0xff, 0xe0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x1, 0xbf, 0xff, 0xf2, - 0x0, 0x1f, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xf0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0xc, 0xff, 0xf7, - 0x0, 0xd, 0xff, 0xf1, 0x0, 0xd, 0xff, 0xf2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xfa, - 0x0, 0xc, 0xff, 0xf3, 0x0, 0xc, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xfa, - 0x0, 0xb, 0xff, 0xf3, 0x0, 0xb, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xff, 0xf9, - 0x0, 0xc, 0xff, 0xf2, 0x0, 0xc, 0xff, 0xf2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3f, 0xff, 0xf5, - 0x0, 0xf, 0xff, 0xf0, 0x0, 0xd, 0xff, 0xf1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x5, 0xff, 0xff, 0xd0, - 0x0, 0x3f, 0xff, 0xd0, 0x0, 0xf, 0xff, 0xf0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xff, 0x30, - 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x3f, 0xff, 0xc0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xd, 0xff, 0xf5, 0x0, - 0x1, 0xff, 0xff, 0x40, 0x0, 0x7f, 0xff, 0x90, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x2, 0xbb, 0x20, 0x0, - 0xa, 0xff, 0xfe, 0x0, 0x0, 0xcf, 0xff, 0x50, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xc0, 0x0, 0xa, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0x20, 0x0, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0x40, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xc2, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x34, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xdd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7e, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0x0, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x84, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe6, 0x11, 0x4b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x35, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcb, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x1d, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x1, 0xdf, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x1d, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x1, 0xde, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x2, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xda, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0xff, 0xff, 0xfd, 0x6c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, - 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0x60, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xfb, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x98, 0xff, 0xff, 0xf1, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x3f, 0xff, 0xff, 0x90, 0x2, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xdf, - 0xff, 0xff, 0x50, 0x1, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x2, 0x4c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0xc, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe8, - 0x31, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, - 0xff, 0xff, 0xff, 0xeb, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, - 0x33, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F048 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xfe, 0x50, 0xdf, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0x2d, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf6, 0xdf, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, - 0xff, 0xff, 0xf1, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, - 0x11, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf3, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xdf, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0xdf, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, - 0xff, 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, - 0xff, 0xff, 0x10, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xf5, 0xdf, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfe, 0x15, 0xbb, 0xbb, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb9, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xbb, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe6, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe5, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xef, 0xfd, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa1, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x10, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x6, 0xab, 0xbb, - 0xbb, 0xbb, 0xba, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x6a, 0xbb, 0xbb, 0xbb, 0xbb, 0xa5, 0x0, - - /* U+F04D "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x10, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb, - 0xff, 0xff, 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, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x6, 0xab, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa5, 0x0, - - /* U+F051 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xf8, 0x4f, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xb8, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x3, 0xff, - 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x3f, 0xff, 0xff, 0xb8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x3f, - 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd4, 0xff, 0xff, 0xfb, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xb8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x73, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x3f, 0xff, - 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x3, 0xff, 0xff, 0xfb, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x3, 0xff, - 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, - 0x8f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xb7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, 0x2f, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xb0, 0x2a, 0xb4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9b, 0xbb, - 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8e, 0xfd, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x4, 0x89, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x73, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe7, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x72, 0x0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xe3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+F054 "" */ - 0x0, 0x8, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0xff, - 0xfc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x30, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xbc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x3a, 0xff, 0xff, 0xff, 0xf7, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x18, 0x9a, 0x97, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F068 "" */ - 0x8, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xc5, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x71, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x25, 0x89, 0xab, 0xa9, 0x86, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa6, 0x53, 0x46, 0x9e, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, - 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x1, 0x89, 0x86, 0x10, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x10, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xd2, 0x0, - 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x93, 0x13, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x7c, 0xff, 0xfe, 0x91, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, - 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x62, 0x0, 0x1, 0x49, 0xef, 0xff, - 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x7a, 0xce, 0xff, 0xfd, 0xcb, 0x74, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x2, 0xdc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, - 0x79, 0xab, 0xa8, 0x75, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x1, - 0x6a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa6, 0x43, 0x57, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x6, 0xbc, 0xb7, 0x20, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x5f, - 0xff, 0xff, 0x80, 0x0, 0x1, 0xef, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x33, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0x51, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xf6, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xe3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xfe, 0x94, 0x10, 0x1, 0x10, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x48, 0xbd, 0xef, 0xfe, - 0xdc, 0x96, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5c, 0xed, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xfb, 0x77, 0x77, 0x79, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe4, 0x33, 0x33, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x74, 0x6c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x34, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x23, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x31, 0x0, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x69, 0x99, 0x99, 0x99, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xe9, 0x9c, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xfb, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x8, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x8, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xfd, 0x10, 0x7, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x6, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x10, 0x5, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x8d, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x80, 0x0, 0x0, - 0x2, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0xa, 0xfb, 0x0, 0x0, 0x7, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xff, - 0x90, 0x0, 0x8, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x6, 0xff, 0xff, 0xf8, 0x0, 0x8, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0x70, 0x8, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x48, 0x88, 0x88, 0x88, 0x88, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x88, 0x8c, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7b, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb2, - 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xf4, 0x4, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x22, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xc0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xc1, 0x0, 0x3, 0xef, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xb0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+F078 "" */ - 0x0, 0x6, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x83, 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf5, 0x0, 0xa, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf5, 0x5, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0x21, 0xef, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x0, 0x7, 0xc7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x4e, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0xaf, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0x92, 0xff, 0xff, 0xf2, - 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, 0x2f, - 0xff, 0xff, 0x20, 0xaf, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xa0, 0x2, 0xff, 0xff, 0xf2, 0x0, 0xaf, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x20, 0x0, 0x2f, 0xff, 0xff, 0x20, - 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9d, 0x80, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x2b, - 0xc5, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x90, 0xd, 0xff, 0xff, - 0x60, 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x80, - 0xdf, 0xff, 0xf6, 0x1e, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0x7d, 0xff, 0xff, 0x7d, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xea, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x0, 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x2, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9b, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xee, - 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xee, 0xee, 0xee, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x29, 0xbb, 0xbb, 0xbb, 0xa5, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xda, 0xaa, 0xaa, 0xaa, 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, 0xfc, 0xaf, 0xff, 0xea, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x6, 0xff, 0x10, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x3, 0xfd, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x2c, 0xff, 0x71, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x20, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0x84, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xd9, 0x62, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x29, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x19, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x6e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xdb, 0x85, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x32, - 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F0C4 "" */ - 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, - 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xbc, 0xb8, 0x20, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xaf, 0xff, 0xff, 0x93, 0x4c, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xfa, - 0x0, 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x8f, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xdf, 0xff, - 0xfd, 0x0, 0x2, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xd7, 0x8e, 0xff, 0xff, - 0xf4, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x17, 0xbc, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x19, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x92, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0x93, 0x4c, 0xff, 0xff, - 0xf5, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfa, 0x0, - 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x8f, 0xff, 0xfb, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x9f, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, 0xfd, - 0x0, 0x2, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x8f, 0xff, 0xff, 0xd7, 0x8e, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, - 0xff, 0xff, 0xd4, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x68, 0x73, 0x0, 0x0, 0x0, - 0x0, 0x17, 0xbc, 0xca, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x10, 0x1c, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x1, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x1f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x1f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x1, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x1, - 0xff, 0xff, 0xff, 0xfc, 0x4d, 0xff, 0xff, 0xfd, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xe0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xe0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xf0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x5, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x96, 0xf, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x0, 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb2, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, - 0xff, 0xf9, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x28, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0xf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xd1, 0xf, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0x9f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xfb, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, - 0x1, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb7, 0x68, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x19, 0xcd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb5, 0x0, - - /* U+F0C9 "" */ - 0x8d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x0, - - /* U+F0E0 "" */ - 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x30, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x2d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd2, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x1, 0xd5, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x8f, 0xff, 0x90, 0x0, 0x2d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x1c, - 0xff, 0xff, 0xfd, 0x30, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc2, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x40, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, - 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x3, 0xcf, 0xff, 0xfc, - 0x30, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd3, 0x0, 0x4, 0xaa, 0x40, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x61, 0x0, 0x16, 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, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x3, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - - /* U+F0E7 "" */ - 0x0, 0x0, 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x20, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xcc, 0xa4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x33, 0x33, - 0x33, 0x5f, 0xff, 0xff, 0xff, 0xf7, 0x33, 0x33, - 0x33, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x8e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x2b, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd2, 0x1, 0xc7, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x1f, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x1, 0xff, 0xf8, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x1f, 0xff, - 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x1, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x1f, 0xff, 0xff, 0xf8, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x1, 0xff, 0xff, - 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x1f, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x42, - 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x4, 0x66, 0x66, - 0x66, 0x66, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x23, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x31, 0x0, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2b, 0xea, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4a, 0xff, 0xff, 0xf7, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x17, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x82, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, - 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0xbf, 0xf4, 0x0, - 0x0, 0xcf, 0xf3, 0x0, 0x0, 0xdf, 0xf2, 0x0, - 0x2, 0xff, 0xd0, 0x0, 0x3, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, - 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xbf, 0xe0, 0x0, - 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, - 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xbf, 0xe0, 0x0, - 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, - 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xbf, 0xe0, 0x0, - 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0xbf, 0xf5, 0x0, - 0x0, 0xcf, 0xf3, 0x0, 0x1, 0xdf, 0xf2, 0x0, - 0x2, 0xff, 0xd1, 0x0, 0x3, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaa, 0xaa, 0xff, - 0xfd, 0xaa, 0xab, 0xff, 0xfc, 0xaa, 0xac, 0xff, - 0xfb, 0xaa, 0xac, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xaf, - 0xf2, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, 0xff, - 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, - 0xf1, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xef, - 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, - 0xf1, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xef, - 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, - 0xf1, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xef, - 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1, 0xcf, - 0xf5, 0x0, 0x1, 0xdf, 0xf3, 0x0, 0x3, 0xff, - 0xe2, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xfd, 0x99, 0x99, 0xff, 0xfc, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x9b, 0xff, 0xfa, 0x99, 0x9c, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x9f, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xfa, 0x44, 0x44, 0xdf, 0xf8, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x46, 0xff, 0xe5, 0x44, 0x47, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xaa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x29, 0xde, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F15B "" */ - 0x7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x30, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0xf, 0xff, 0xff, 0x50, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0xf, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0x50, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xff, 0x50, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, - 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xbe, - 0xff, 0xff, 0xff, 0xff, 0xec, 0xa7, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xa8, - 0x87, 0x77, 0x89, 0xbd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x96, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, - 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0x6c, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xf4, 0x1d, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4e, 0xff, 0xff, 0xf7, 0x0, 0x1d, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, - 0x9b, 0xde, 0xff, 0xfe, 0xca, 0x73, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xf7, 0x0, - 0x0, 0x1d, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xca, 0x99, 0x9b, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfb, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x9c, 0xdb, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x58, 0x97, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F240 "" */ - 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 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, 0x0, 0xf, 0xff, 0xff, 0x74, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, - 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x48, - 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, - 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0xe, 0xff, 0xff, - 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, - 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x1, 0x33, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, - 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 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, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x30, 0x0, 0x0, 0x0, - - /* U+F241 "" */ - 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 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, 0x0, 0xf, 0xff, 0xff, 0x74, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, - 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x48, - 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, - 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, - 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, - 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 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, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x30, 0x0, 0x0, 0x0, - - /* U+F242 "" */ - 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 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, 0x0, 0xf, 0xff, 0xff, 0x74, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, - 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, - 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, - 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, - 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, - 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 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, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x30, 0x0, 0x0, 0x0, - - /* U+F243 "" */ - 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 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, 0x0, 0xf, 0xff, 0xff, 0x74, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, - 0xff, 0x40, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xf4, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, - 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, - 0xf4, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0x5f, 0xff, 0xff, 0x40, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, - 0x40, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xf4, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, - 0x0, 0x88, 0x88, 0x88, 0x88, 0x88, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 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, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x30, 0x0, 0x0, 0x0, - - /* U+F244 "" */ - 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 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, 0x0, 0xf, 0xff, 0xff, 0x74, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, - 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 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, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x30, 0x0, 0x0, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xcb, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x19, 0xde, 0xee, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xd3, 0x11, 0x3f, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, - 0x0, 0x0, 0x4c, 0xed, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x47, 0x63, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xfd, - 0x30, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x9f, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xb2, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x11, 0x4e, 0xff, 0xb2, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x24, 0xff, 0xff, 0xfd, 0x40, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xed, 0xdd, 0xdd, 0xdd, 0xdf, 0xff, 0xfe, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdf, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xfa, 0x10, 0x1, - 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd3, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xfe, 0x60, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, - 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, - 0x0, 0x6, 0xaa, 0xaa, 0xaa, 0xa7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xfb, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, - 0xbb, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x2d, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, 0xbc, - 0xdd, 0xba, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x10, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0xff, 0x90, 0x8, 0x50, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x5, 0xff, - 0xff, 0xff, 0x90, 0x9f, 0xff, 0xf9, 0x0, 0x8f, - 0x50, 0x0, 0xdf, 0xff, 0xff, 0xf5, 0x0, 0x8f, - 0xff, 0xff, 0xa0, 0x0, 0x8f, 0xff, 0x90, 0x8, - 0xff, 0x50, 0x1, 0xdf, 0xff, 0xff, 0x80, 0xa, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x8f, 0xf9, 0x0, - 0x8f, 0xfa, 0x0, 0xa, 0xff, 0xff, 0xfb, 0x0, - 0xdf, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x8f, 0x90, - 0x8, 0xfa, 0x0, 0x8, 0xff, 0xff, 0xff, 0xd0, - 0xe, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x89, - 0x0, 0x8a, 0x0, 0x7, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x30, 0x3, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x11, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x40, 0x4, 0x0, 0x1, - 0xef, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0xa9, 0x0, 0x8c, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0xaf, 0xa0, 0x8, 0xfc, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xc0, 0xa, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x8f, - 0xfa, 0x0, 0x4, 0xff, 0xff, 0xfb, 0x0, 0x7f, - 0xff, 0xff, 0xc0, 0x0, 0xaf, 0xff, 0xa0, 0x8, - 0xfe, 0x30, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x4, - 0xff, 0xff, 0xff, 0xc1, 0xbf, 0xff, 0xfa, 0x0, - 0x8e, 0x30, 0x0, 0xcf, 0xff, 0xff, 0xf5, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x8, 0x30, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x20, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x8b, 0xef, 0xff, 0xff, 0xfe, 0xb7, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x21, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xcc, - 0xcc, 0xcc, 0xcc, 0xca, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, - 0x22, 0x22, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x22, 0x22, 0x22, 0x22, 0x21, 0xb, - 0xff, 0xff, 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, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x1, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, - 0xf6, 0xa, 0xff, 0xff, 0xf4, 0x1b, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, - 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, - 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, - 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, - 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x3, - 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, 0xf0, 0x7, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, - 0xff, 0x30, 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, - 0xff, 0x0, 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, - 0x5, 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, - 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, - 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, - 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0x10, - 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x3, 0xff, - 0xff, 0xf1, 0x5, 0xff, 0xff, 0xf0, 0x7, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, - 0x30, 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, - 0x0, 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, - 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, - 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, - 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, 0xf0, - 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, - 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0x10, 0x5f, - 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x3, 0xff, 0xff, - 0xf1, 0x5, 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, - 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, - 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, - 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, - 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf8, 0x8, - 0xff, 0xff, 0xf6, 0xa, 0xff, 0xff, 0xf4, 0x1b, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x34, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x30, 0x0, 0x0, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6a, 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xf8, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xfe, 0xca, 0x86, 0x42, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x23, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x8, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x5, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x2c, 0x20, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x20, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x2e, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x8e, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x0, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x1d, 0xff, 0xf6, 0x44, 0x4f, 0xfc, - 0x44, 0x45, 0xff, 0xa4, 0x44, 0xff, 0xff, 0xf5, - 0x0, 0x1, 0xdf, 0xff, 0xf3, 0x0, 0xe, 0xfb, - 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, - 0x0, 0x1d, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, - 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, - 0x1, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, - 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, - 0x1d, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, - 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, - 0xdf, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, - 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, - 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, - 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdf, 0xff, - 0xdd, 0xdd, 0xff, 0xed, 0xdd, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1, 0xac, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xf1, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x10, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xcf, 0xff, 0xff, 0xf1, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 181, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 180, .box_w = 7, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 105, .adv_w = 263, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 18}, - {.bitmap_index = 177, .adv_w = 472, .box_w = 28, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 597, .adv_w = 417, .box_w = 24, .box_h = 41, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 1089, .adv_w = 566, .box_w = 33, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1584, .adv_w = 461, .box_w = 28, .box_h = 31, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2018, .adv_w = 141, .box_w = 5, .box_h = 12, .ofs_x = 2, .ofs_y = 18}, - {.bitmap_index = 2048, .adv_w = 226, .box_w = 10, .box_h = 40, .ofs_x = 3, .ofs_y = -8}, - {.bitmap_index = 2248, .adv_w = 227, .box_w = 10, .box_h = 40, .ofs_x = 1, .ofs_y = -8}, - {.bitmap_index = 2448, .adv_w = 269, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 15}, - {.bitmap_index = 2584, .adv_w = 391, .box_w = 20, .box_h = 19, .ofs_x = 2, .ofs_y = 6}, - {.bitmap_index = 2774, .adv_w = 153, .box_w = 6, .box_h = 12, .ofs_x = 2, .ofs_y = -6}, - {.bitmap_index = 2810, .adv_w = 257, .box_w = 12, .box_h = 4, .ofs_x = 2, .ofs_y = 10}, - {.bitmap_index = 2834, .adv_w = 153, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2855, .adv_w = 237, .box_w = 19, .box_h = 41, .ofs_x = -2, .ofs_y = -4}, - {.bitmap_index = 3245, .adv_w = 448, .box_w = 24, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3605, .adv_w = 249, .box_w = 12, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3785, .adv_w = 386, .box_w = 23, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4130, .adv_w = 384, .box_w = 23, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4475, .adv_w = 450, .box_w = 27, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4880, .adv_w = 386, .box_w = 23, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5225, .adv_w = 415, .box_w = 23, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5570, .adv_w = 402, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5915, .adv_w = 433, .box_w = 25, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6290, .adv_w = 415, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6635, .adv_w = 153, .box_w = 7, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6716, .adv_w = 153, .box_w = 7, .box_h = 29, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 6818, .adv_w = 391, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 7018, .adv_w = 391, .box_w = 20, .box_h = 14, .ofs_x = 2, .ofs_y = 8}, - {.bitmap_index = 7158, .adv_w = 391, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 7358, .adv_w = 385, .box_w = 22, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7688, .adv_w = 695, .box_w = 40, .box_h = 38, .ofs_x = 2, .ofs_y = -8}, - {.bitmap_index = 8448, .adv_w = 492, .box_w = 32, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 8928, .adv_w = 509, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 9318, .adv_w = 486, .box_w = 27, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9723, .adv_w = 555, .box_w = 29, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 10158, .adv_w = 450, .box_w = 22, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 10488, .adv_w = 427, .box_w = 22, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 10818, .adv_w = 519, .box_w = 28, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11238, .adv_w = 546, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 11628, .adv_w = 208, .box_w = 5, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 11703, .adv_w = 345, .box_w = 19, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 11988, .adv_w = 483, .box_w = 27, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12393, .adv_w = 399, .box_w = 21, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12708, .adv_w = 642, .box_w = 32, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 13188, .adv_w = 546, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 13578, .adv_w = 564, .box_w = 32, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14058, .adv_w = 485, .box_w = 25, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 14433, .adv_w = 564, .box_w = 33, .box_h = 36, .ofs_x = 2, .ofs_y = -6}, - {.bitmap_index = 15027, .adv_w = 489, .box_w = 25, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 15402, .adv_w = 417, .box_w = 24, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 15762, .adv_w = 394, .box_w = 25, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16137, .adv_w = 532, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 16527, .adv_w = 478, .box_w = 31, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 16992, .adv_w = 757, .box_w = 45, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 17667, .adv_w = 452, .box_w = 28, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 18087, .adv_w = 435, .box_w = 29, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 18522, .adv_w = 442, .box_w = 26, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 18912, .adv_w = 224, .box_w = 10, .box_h = 40, .ofs_x = 4, .ofs_y = -8}, - {.bitmap_index = 19112, .adv_w = 237, .box_w = 18, .box_h = 41, .ofs_x = -2, .ofs_y = -4}, - {.bitmap_index = 19481, .adv_w = 224, .box_w = 10, .box_h = 40, .ofs_x = 0, .ofs_y = -8}, - {.bitmap_index = 19681, .adv_w = 392, .box_w = 19, .box_h = 18, .ofs_x = 3, .ofs_y = 6}, - {.bitmap_index = 19852, .adv_w = 336, .box_w = 21, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 19884, .adv_w = 403, .box_w = 12, .box_h = 6, .ofs_x = 4, .ofs_y = 26}, - {.bitmap_index = 19920, .adv_w = 402, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 20150, .adv_w = 458, .box_w = 24, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 20534, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 20787, .adv_w = 458, .box_w = 24, .box_h = 32, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 21171, .adv_w = 411, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 21436, .adv_w = 237, .box_w = 17, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 21708, .adv_w = 464, .box_w = 25, .box_h = 31, .ofs_x = 1, .ofs_y = -8}, - {.bitmap_index = 22096, .adv_w = 458, .box_w = 22, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 22448, .adv_w = 187, .box_w = 6, .box_h = 33, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 22547, .adv_w = 191, .box_w = 13, .box_h = 41, .ofs_x = -4, .ofs_y = -8}, - {.bitmap_index = 22814, .adv_w = 414, .box_w = 23, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 23182, .adv_w = 187, .box_w = 5, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 23262, .adv_w = 710, .box_w = 38, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 23699, .adv_w = 458, .box_w = 22, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 23952, .adv_w = 427, .box_w = 24, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 24228, .adv_w = 458, .box_w = 24, .box_h = 31, .ofs_x = 3, .ofs_y = -8}, - {.bitmap_index = 24600, .adv_w = 458, .box_w = 24, .box_h = 31, .ofs_x = 1, .ofs_y = -8}, - {.bitmap_index = 24972, .adv_w = 276, .box_w = 13, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 25122, .adv_w = 337, .box_w = 19, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 25341, .adv_w = 278, .box_w = 17, .box_h = 28, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 25579, .adv_w = 455, .box_w = 22, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 25832, .adv_w = 376, .box_w = 25, .box_h = 23, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 26120, .adv_w = 604, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 26557, .adv_w = 371, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 26822, .adv_w = 376, .box_w = 25, .box_h = 31, .ofs_x = -1, .ofs_y = -8}, - {.bitmap_index = 27210, .adv_w = 350, .box_w = 20, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 27440, .adv_w = 236, .box_w = 12, .box_h = 40, .ofs_x = 2, .ofs_y = -8}, - {.bitmap_index = 27680, .adv_w = 201, .box_w = 5, .box_h = 40, .ofs_x = 4, .ofs_y = -8}, - {.bitmap_index = 27780, .adv_w = 236, .box_w = 13, .box_h = 40, .ofs_x = 0, .ofs_y = -8}, - {.bitmap_index = 28040, .adv_w = 391, .box_w = 21, .box_h = 8, .ofs_x = 2, .ofs_y = 11}, - {.bitmap_index = 28124, .adv_w = 282, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = 16}, - {.bitmap_index = 28229, .adv_w = 211, .box_w = 9, .box_h = 8, .ofs_x = 2, .ofs_y = 8}, - {.bitmap_index = 28265, .adv_w = 672, .box_w = 43, .box_h = 44, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 29211, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 29883, .adv_w = 672, .box_w = 42, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 30681, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 31353, .adv_w = 462, .box_w = 29, .box_h = 30, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 31788, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 32670, .adv_w = 672, .box_w = 40, .box_h = 43, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 33530, .adv_w = 756, .box_w = 48, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 34442, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 35345, .adv_w = 756, .box_w = 48, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 36113, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 37016, .adv_w = 336, .box_w = 21, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 37363, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 37891, .adv_w = 756, .box_w = 48, .box_h = 41, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 38875, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 39547, .adv_w = 462, .box_w = 29, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 40171, .adv_w = 588, .box_w = 27, .box_h = 39, .ofs_x = 5, .ofs_y = -4}, - {.bitmap_index = 40698, .adv_w = 588, .box_w = 37, .box_h = 44, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 41512, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 42215, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 42918, .adv_w = 588, .box_w = 27, .box_h = 39, .ofs_x = 5, .ofs_y = -4}, - {.bitmap_index = 43445, .adv_w = 588, .box_w = 39, .box_h = 38, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 44186, .adv_w = 420, .box_w = 23, .box_h = 37, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 44612, .adv_w = 420, .box_w = 23, .box_h = 37, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 45038, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 45741, .adv_w = 588, .box_w = 37, .box_h = 9, .ofs_x = 0, .ofs_y = 11}, - {.bitmap_index = 45908, .adv_w = 756, .box_w = 48, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 46676, .adv_w = 840, .box_w = 53, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 47816, .adv_w = 756, .box_w = 49, .box_h = 43, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 48870, .adv_w = 672, .box_w = 42, .box_h = 39, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 49689, .adv_w = 588, .box_w = 37, .box_h = 23, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 50115, .adv_w = 588, .box_w = 37, .box_h = 23, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 50541, .adv_w = 840, .box_w = 53, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 51416, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 52088, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 52991, .adv_w = 672, .box_w = 43, .box_h = 44, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 53937, .adv_w = 588, .box_w = 38, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 54659, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 55455, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 56158, .adv_w = 588, .box_w = 37, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 56769, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 57441, .adv_w = 420, .box_w = 28, .box_h = 43, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 58043, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 58839, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 59635, .adv_w = 756, .box_w = 48, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 60403, .adv_w = 672, .box_w = 44, .box_h = 44, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 61371, .adv_w = 504, .box_w = 32, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 62059, .adv_w = 840, .box_w = 53, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 63093, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 63809, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 64525, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 65241, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 65957, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 66673, .adv_w = 840, .box_w = 53, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 67548, .adv_w = 588, .box_w = 33, .box_h = 43, .ofs_x = 2, .ofs_y = -6}, - {.bitmap_index = 68258, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 69054, .adv_w = 672, .box_w = 43, .box_h = 43, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 69979, .adv_w = 840, .box_w = 53, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 70827, .adv_w = 504, .box_w = 32, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 71515, .adv_w = 676, .box_w = 43, .box_h = 28, .ofs_x = 0, .ofs_y = 2} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 7, 0, 0, 0, - 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 30, 0, 18, -15, 0, 0, - 0, 0, -37, -40, 5, 32, 15, 11, - -27, 5, 33, 2, 28, 7, 22, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 40, 5, -5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13, 0, -20, 0, 0, 0, 0, - 0, -13, 11, 13, 0, 0, -7, 0, - -5, 7, 0, -7, 0, -7, -3, -13, - 0, 0, 0, 0, -7, 0, 0, -9, - -10, 0, 0, -7, 0, -13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -7, - -7, 0, -10, 0, -18, 0, -81, 0, - 0, -13, 0, 13, 20, 1, 0, -13, - 7, 7, 22, 13, -11, 13, 0, 0, - -38, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -18, -8, -33, 0, -27, - -5, 0, 0, 0, 0, 1, 26, 0, - -20, -5, -2, 2, 0, -11, 0, 0, - -5, -50, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -54, -5, 26, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -28, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 22, - 0, 7, 0, 0, -13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 5, - 2, 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, - -25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 5, - 13, 7, 20, -7, 0, 0, 13, -7, - -22, -92, 5, 18, 13, 1, -9, 0, - 24, 0, 22, 0, 22, 0, -62, 0, - -8, 20, 0, 22, -7, 13, 7, 0, - 0, 2, -7, 0, 0, -11, 54, 0, - 54, 0, 20, 0, 28, 9, 11, 20, - 0, 0, 0, -25, 0, 0, 0, 0, - 2, -5, 0, 5, -12, -9, -13, 5, - 0, -7, 0, 0, 0, -27, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -44, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, -37, 0, -42, 0, 0, 0, - 0, -5, 0, 67, -8, -9, 7, 7, - -6, 0, -9, 7, 0, 0, -36, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -65, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -42, 0, 40, 0, 0, -25, 0, - 22, 0, -46, -65, -46, -13, 20, 0, - 0, -45, 0, 8, -15, 0, -10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 17, 20, -82, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 0, 5, 0, 0, 0, - 0, 0, 5, 5, -8, -13, 0, -2, - -2, -7, 0, 0, -5, 0, 0, 0, - -13, 0, -5, 0, -15, -13, 0, -17, - -22, -22, -13, 0, -13, 0, -13, 0, - 0, 0, 0, -5, 0, 0, 7, 0, - 5, -7, 0, 2, 0, 0, 0, 7, - -5, 0, 0, 0, -5, 7, 7, -2, - 0, 0, 0, -13, 0, -2, 0, 0, - 0, 0, 0, 2, 0, 9, -5, 0, - -8, 0, -11, 0, 0, -5, 0, 20, - 0, 0, -7, 0, 0, 0, 0, 0, - -2, 2, -5, -5, 0, 0, -7, 0, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -3, -3, 0, -7, -8, 0, - 0, 0, 0, 0, 2, 0, 0, -5, - 0, -7, -7, -7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -4, 0, 0, - 0, 0, -5, -9, 0, -10, 0, -20, - -5, -20, 13, 0, 0, -13, 7, 13, - 18, 0, -17, -2, -8, 0, -2, -32, - 7, -5, 5, -36, 7, 0, 0, 2, - -35, 0, -36, -5, -58, -5, 0, -34, - 0, 13, 19, 0, 9, 0, 0, 0, - 0, 1, 0, -12, -9, 0, -20, 0, - 0, 0, -7, 0, 0, 0, -7, 0, - 0, 0, 0, 0, -3, -3, 0, -3, - -9, 0, 0, 0, 0, 0, 0, 0, - -7, -7, 0, -5, -8, -5, 0, 0, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, -5, 0, -8, - 0, -5, 0, -13, 7, 0, 0, -8, - 3, 7, 7, 0, 0, 0, 0, 0, - 0, -5, 0, 0, 0, 0, 0, 5, - 0, 0, -7, 0, -7, -5, -8, 0, - 0, 0, 0, 0, 0, 0, 5, 0, - -5, 0, 0, 0, 0, -7, -10, 0, - -13, 0, 20, -5, 2, -22, 0, 0, - 18, -34, -35, -28, -13, 7, 0, -5, - -44, -12, 0, -12, 0, -13, 10, -12, - -43, 0, -18, 0, 0, 3, -2, 5, - -5, 0, 7, 1, -20, -26, 0, -34, - -16, -14, -16, -20, -8, -18, -1, -13, - -18, 4, 0, 2, 0, -7, 0, 0, - 0, 5, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -7, - 0, -3, 0, -2, -7, 0, -11, -15, - -15, -2, 0, -20, 0, 0, 0, 0, - 0, 0, -5, 0, 0, 0, 0, 3, - -4, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -12, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, 0, 0, - -13, 0, 0, 0, 0, -34, -20, 0, - 0, 0, -10, -34, 0, 0, -7, 7, - 0, -18, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -11, 0, 0, -13, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, -12, 0, - 0, 0, 0, 8, 0, 5, -13, -13, - 0, -7, -7, -8, 0, 0, 0, 0, - 0, 0, -20, 0, -7, 0, -10, -7, - 0, -15, -17, -20, -5, 0, -13, 0, - -20, 0, 0, 0, 0, 54, 0, 0, - 3, 0, 0, -9, 0, 7, 0, -29, - 0, 0, 0, 0, 0, -62, -12, 22, - 20, -5, -28, 0, 7, -10, 0, -34, - -3, -9, 7, -47, -7, 9, 0, 10, - -24, -10, -25, -22, -28, 0, 0, -40, - 0, 38, 0, 0, -3, 0, 0, 0, - -3, -3, -7, -18, -22, -1, -62, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -7, 0, -3, -7, -10, 0, 0, - -13, 0, -7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, 0, -13, 0, 0, 13, - -2, 9, 0, -15, 7, -5, -2, -17, - -7, 0, -9, -7, -5, 0, -10, -11, - 0, 0, -5, -2, -5, -11, -8, 0, - 0, -7, 0, 7, -5, 0, -15, 0, - 0, 0, -13, 0, -11, 0, -11, -11, - 7, 0, 0, 0, 0, 0, 0, 0, - 0, -13, 7, 0, -9, 0, -5, -8, - -21, -5, -5, -5, -2, -5, -8, -2, - 0, 0, 0, 0, 0, -7, -5, -5, - 0, 0, 0, 0, 8, -5, 0, -5, - 0, 0, 0, -5, -8, -5, -6, -8, - -6, 0, 5, 27, -2, 0, -18, 0, - -5, 13, 0, -7, -28, -9, 10, 1, - 0, -32, -11, 7, -11, 5, 0, -5, - -5, -22, 0, -10, 3, 0, 0, -11, - 0, 0, 0, 7, 7, -13, -13, 0, - -11, -7, -10, -7, -7, 0, -11, 3, - -13, -11, 20, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -11, 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, - -5, 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, -5, -7, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -10, 0, 0, -9, - 0, 0, -7, -7, 0, 0, 0, 0, - -7, 0, 0, 0, 0, -3, 0, 0, - 0, 0, 0, -5, 0, 0, 0, 0, - -10, 0, -13, 0, 0, 0, -22, 0, - 5, -15, 13, 1, -5, -32, 0, 0, - -15, -7, 0, -27, -17, -19, 0, 0, - -29, -7, -27, -26, -32, 0, -17, 0, - 5, 45, -9, 0, -15, -7, -2, -7, - -11, -18, -12, -25, -28, -15, -7, 0, - 0, -5, 0, 2, 0, 0, -47, -6, - 20, 15, -15, -25, 0, 2, -21, 0, - -34, -5, -7, 13, -62, -9, 2, 0, - 0, -44, -8, -35, -7, -49, 0, 0, - -47, 0, 40, 2, 0, -5, 0, 0, - 0, 0, -3, -5, -26, -5, 0, -44, - 0, 0, 0, 0, -22, 0, -6, 0, - -2, -19, -32, 0, 0, -3, -10, -20, - -7, 0, -5, 0, 0, 0, 0, -30, - -7, -22, -22, -5, -11, -17, -7, -11, - 0, -13, -6, -22, -10, 0, -8, -13, - -7, -13, 0, 3, 0, -5, -22, 0, - 13, 0, -12, 0, 0, 0, 0, 8, - 0, 5, -13, 28, 0, -7, -7, -8, - 0, 0, 0, 0, 0, 0, -20, 0, - -7, 0, -10, -7, 0, -15, -17, -20, - -5, 0, -13, 5, 27, 0, 0, 0, - 0, 54, 0, 0, 3, 0, 0, -9, - 0, 7, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -5, -13, 0, 0, 0, 0, 0, -3, - 0, 0, 0, -7, -7, 0, 0, -13, - -7, 0, 0, -13, 0, 11, -3, 0, - 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 10, 13, 5, -6, 0, -22, - -11, 0, 20, -22, -22, -13, -13, 27, - 12, 7, -58, -5, 13, -7, 0, -7, - 7, -7, -24, 0, -7, 7, -9, -5, - -20, -5, 0, 0, 20, 13, 0, -19, - 0, -37, -9, 19, -9, -26, 2, -9, - -22, -22, -7, 27, 7, 0, -10, 0, - -18, 0, 5, 22, -15, -25, -27, -17, - 20, 0, 2, -49, -5, 7, -11, -5, - -15, 0, -15, -25, -10, -10, -5, 0, - 0, -15, -14, -7, 0, 20, 15, -7, - -37, 0, -37, -9, 0, -24, -39, -2, - -22, -11, -22, -19, 18, 0, 0, -9, - 0, -13, -6, 0, -7, -12, 0, 11, - -22, 7, 0, 0, -36, 0, -7, -15, - -11, -5, -20, -17, -22, -15, 0, -20, - -7, -15, -13, -20, -7, 0, 0, 2, - 32, -11, 0, -20, -7, 0, -7, -13, - -15, -18, -19, -26, -9, -13, 13, 0, - -10, 0, -34, -8, 4, 13, -22, -25, - -13, -22, 22, -7, 3, -62, -12, 13, - -15, -11, -25, 0, -20, -28, -8, -7, - -5, -7, -14, -20, -2, 0, 0, 20, - 19, -5, -44, 0, -40, -15, 16, -26, - -46, -13, -24, -28, -34, -22, 13, 0, - 0, 0, 0, -8, 0, 0, 7, -8, - 13, 5, -13, 13, 0, 0, -21, -2, - 0, -2, 0, 2, 2, -5, 0, 0, - 0, 0, 0, 0, -7, 0, 0, 0, - 0, 5, 20, 1, 0, -8, 0, 0, - 0, 0, -5, -5, -8, 0, 0, 0, - 2, 5, 0, 0, 0, 0, 5, 0, - -5, 0, 26, 0, 12, 2, 2, -9, - 0, 13, 0, 0, 0, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 20, 0, 19, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -40, 0, -7, 11, 0, 20, - 0, 0, 67, 8, -13, -13, 7, 7, - -5, 2, -34, 0, 0, 32, -40, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -46, 26, 94, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -40, 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, -11, 0, 0, -13, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, -18, 0, - 0, 2, 0, 0, 7, 87, -13, -5, - 22, 18, -18, 7, 0, 0, 7, 7, - -9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -87, 19, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -19, - 0, 0, 0, -18, 0, 0, 0, 0, - -15, -3, 0, 0, 0, -15, 0, -8, - 0, -32, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -45, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, -7, 0, 0, -13, 0, -10, 0, - -18, 0, 0, 0, -11, 7, -8, 0, - 0, -18, -7, -15, 0, 0, -18, 0, - -7, 0, -32, 0, -7, 0, 0, -54, - -13, -27, -7, -24, 0, 0, -45, 0, - -18, -3, 0, 0, 0, 0, 0, 0, - 0, 0, -10, -12, -5, -11, 0, 0, - 0, 0, -15, 0, -15, 9, -7, 13, - 0, -5, -15, -5, -11, -13, 0, -8, - -3, -5, 5, -18, -2, 0, 0, 0, - -59, -5, -9, 0, -15, 0, -5, -32, - -6, 0, 0, -5, -5, 0, 0, 0, - 0, 5, 0, -5, -11, -5, 11, 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, 9, 0, 0, 0, 0, 0, - 0, -15, 0, -5, 0, 0, 0, -13, - 7, 0, 0, 0, -18, -7, -13, 0, - 0, -19, 0, -7, 0, -32, 0, 0, - 0, 0, -65, 0, -13, -25, -34, 0, - 0, -45, 0, -5, -10, 0, 0, 0, - 0, 0, 0, 0, 0, -7, -10, -3, - -10, 2, 0, 0, 11, -9, 0, 21, - 33, -7, -7, -20, 8, 33, 11, 15, - -18, 8, 28, 8, 19, 15, 18, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 42, 32, -12, -7, 0, -5, - 54, 29, 54, 0, 0, 0, 7, 0, - 0, 25, 0, 0, -11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -5, 0, - 0, 0, 0, 0, 0, 0, 0, 9, - 0, 0, 0, 0, -56, -8, -5, -28, - -33, 0, 0, -45, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -5, - 0, 0, 0, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 0, -56, -8, -5, - -28, -33, 0, 0, -27, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -5, 0, 0, 0, -15, 7, 0, -7, - 5, 12, 7, -20, 0, -1, -5, 7, - 0, 5, 0, 0, 0, 0, -17, 0, - -6, -5, -13, 0, -6, -27, 0, 42, - -7, 0, -15, -5, 0, -5, -11, 0, - -7, -19, -13, -8, 0, 0, 0, -11, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -5, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 0, -56, - -8, -5, -28, -33, 0, 0, -45, 0, - 0, 0, 0, 0, 0, 34, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -11, 0, -22, -8, -6, 20, -6, -7, - -27, 2, -4, 2, -5, -18, 1, 15, - 1, 5, 2, 5, -16, -27, -8, 0, - -26, -13, -18, -28, -26, 0, -11, -13, - -8, -9, -5, -5, -8, -5, 0, -5, - -2, 10, 0, 10, -5, 0, 21, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -5, -7, -7, 0, 0, - -18, 0, -3, 0, -11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -40, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, -7, 0, -9, - 0, 0, 0, 0, -5, 0, 0, -11, - -7, 7, 0, -11, -13, -5, 0, -19, - -5, -15, -5, -8, 0, -11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -45, 0, 22, 0, 0, -12, 0, - 0, 0, 0, -9, 0, -7, 0, 0, - -3, 0, 0, -5, 0, -15, 0, 0, - 28, -9, -22, -21, 5, 7, 7, -1, - -19, 5, 10, 5, 20, 5, 22, -5, - -18, 0, 0, -27, 0, 0, -20, -18, - 0, 0, -13, 0, -9, -11, 0, -10, - 0, -10, 0, -5, 10, 0, -5, -20, - -7, 25, 0, 0, -6, 0, -13, 0, - 0, 9, -15, 0, 7, -7, 5, 1, - 0, -22, 0, -5, -2, 0, -7, 7, - -5, 0, 0, 0, -28, -8, -15, 0, - -20, 0, 0, -32, 0, 25, -7, 0, - -12, 0, 4, 0, -7, 0, -7, -20, - 0, -7, 7, 0, 0, 0, 0, -5, - 0, 0, 7, -9, 2, 0, 0, -8, - -5, 0, -8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -42, 0, 15, 0, - 0, -5, 0, 0, 0, 0, 1, 0, - -7, -7, 0, 0, 0, 13, 0, 15, - 0, 0, 0, 0, 0, -42, -38, 2, - 29, 20, 11, -27, 5, 28, 0, 25, - 0, 13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 36, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_42 = { -#else -lv_font_t lv_font_montserrat_42 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 46, /*The maximum line height required by the font*/ - .base_line = 8, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -3, - .underline_thickness = 2, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_42*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_44.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_44.c deleted file mode 100644 index 0707153..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_44.c +++ /dev/null @@ -1,10916 +0,0 @@ -/******************************************************************************* - * Size: 44 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 44 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_44.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_44 - #define LV_FONT_MONTSERRAT_44 1 -#endif - -#if LV_FONT_MONTSERRAT_44 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x8f, 0xff, 0xf6, 0x8f, 0xff, 0xf5, 0x7f, 0xff, - 0xf4, 0x7f, 0xff, 0xf4, 0x6f, 0xff, 0xf3, 0x5f, - 0xff, 0xf3, 0x5f, 0xff, 0xf2, 0x4f, 0xff, 0xf1, - 0x4f, 0xff, 0xf1, 0x3f, 0xff, 0xf0, 0x2f, 0xff, - 0xf0, 0x2f, 0xff, 0xf0, 0x1f, 0xff, 0xe0, 0x1f, - 0xff, 0xe0, 0xf, 0xff, 0xd0, 0xf, 0xff, 0xc0, - 0xf, 0xff, 0xc0, 0xe, 0xff, 0xb0, 0xe, 0xff, - 0xa0, 0xd, 0xff, 0xa0, 0xd, 0xff, 0x90, 0x6, - 0x77, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xaa, 0x30, 0x6f, 0xff, - 0xf3, 0xdf, 0xff, 0xfa, 0xef, 0xff, 0xfa, 0x9f, - 0xff, 0xf5, 0x9, 0xee, 0x70, - - /* U+0022 "\"" */ - 0x3f, 0xff, 0x70, 0x0, 0x4f, 0xff, 0x63, 0xff, - 0xf6, 0x0, 0x3, 0xff, 0xf6, 0x2f, 0xff, 0x60, - 0x0, 0x3f, 0xff, 0x52, 0xff, 0xf6, 0x0, 0x3, - 0xff, 0xf5, 0x2f, 0xff, 0x50, 0x0, 0x2f, 0xff, - 0x51, 0xff, 0xf5, 0x0, 0x2, 0xff, 0xf4, 0x1f, - 0xff, 0x40, 0x0, 0x2f, 0xff, 0x41, 0xff, 0xf4, - 0x0, 0x1, 0xff, 0xf3, 0xf, 0xff, 0x30, 0x0, - 0x1f, 0xff, 0x30, 0xff, 0xf3, 0x0, 0x0, 0xff, - 0xf3, 0xf, 0xff, 0x30, 0x0, 0xf, 0xff, 0x20, - 0xff, 0xf2, 0x0, 0x0, 0xff, 0xf2, 0x1, 0x11, - 0x0, 0x0, 0x1, 0x11, 0x0, - - /* U+0023 "#" */ - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xf5, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x1, 0x44, 0x44, 0x47, 0xff, 0xe4, 0x44, - 0x44, 0x44, 0x4e, 0xff, 0x74, 0x44, 0x44, 0x30, - 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf5, - 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x47, 0xff, - 0xd4, 0x44, 0x44, 0x44, 0x4e, 0xff, 0x74, 0x44, - 0x44, 0x10, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x5f, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, - 0xdf, 0xff, 0xfe, 0xda, 0x62, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xa3, 0x8, 0xff, 0x50, 0x15, 0x9f, 0xff, - 0x70, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x8f, - 0xf5, 0x0, 0x0, 0x7, 0xe1, 0x0, 0x2, 0xff, - 0xff, 0x60, 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, - 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xfe, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x70, 0x0, 0x8, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0x70, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xe7, 0x28, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x54, 0xaf, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, - 0x0, 0x1a, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, 0x8, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xf5, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, - 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf5, 0x0, 0x0, 0xe, 0xff, 0xf6, 0x0, - 0xd6, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, - 0x4, 0xff, 0xff, 0x30, 0x6f, 0xfb, 0x30, 0x0, - 0x0, 0x8f, 0xf5, 0x0, 0x2, 0xef, 0xff, 0xe0, - 0xd, 0xff, 0xff, 0xc7, 0x20, 0x8, 0xff, 0x50, - 0x28, 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xfe, 0xef, 0xfd, 0xef, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x18, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbe, 0xff, - 0xff, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0025 "%" */ - 0x0, 0x0, 0x3a, 0xdf, 0xec, 0x71, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc9, 0x9e, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, - 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0x50, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x50, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xc0, 0x0, 0x0, 0x1, 0xef, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0x80, 0x0, 0x0, 0x0, - 0xe, 0xfe, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, 0x6f, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, - 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x1f, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xfd, 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, - 0xb, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf5, 0x0, 0x0, 0x0, 0xbf, 0xf5, - 0x0, 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x8f, - 0xfd, 0x0, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x9a, - 0xef, 0xff, 0x30, 0x0, 0xcf, 0xf9, 0x0, 0x0, - 0x57, 0x87, 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xfe, 0x40, 0x0, 0x7f, 0xfd, 0x0, - 0x6, 0xef, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, - 0x3, 0xae, 0xff, 0xc8, 0x10, 0x0, 0x2f, 0xff, - 0x30, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x80, 0x5, 0xff, 0xf7, 0x10, 0x3b, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xd0, 0x0, 0xdf, 0xf4, 0x0, 0x0, - 0xb, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf3, 0x0, 0x4f, 0xfa, 0x0, - 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x8, 0xff, - 0x50, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, - 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x20, - 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0x70, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xaf, 0xf3, - 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x0, 0x0, 0x6, - 0xff, 0x70, 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x4f, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xa9, - 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6c, 0xef, 0xe9, 0x30, 0x0, 0x0, - - /* U+0026 "&" */ - 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xeb, - 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xfb, 0x52, 0x35, 0xbf, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xa0, - 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x1, - 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x67, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x3b, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x4, 0x83, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf6, 0x0, 0xb, 0xff, 0xff, 0x70, - 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x8f, 0xff, - 0xe3, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, - 0xe, 0xff, 0xc0, 0x0, 0x2f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x4, 0xff, - 0xf8, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0x90, 0xbf, 0xff, 0x20, - 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xaf, 0xff, 0xc0, 0x0, 0xf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x2, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, - 0x1, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xeb, 0x9a, 0xbd, 0xff, - 0xff, 0xff, 0x66, 0xff, 0xff, 0xb0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x40, 0x7, 0xff, 0xff, 0x40, 0x0, 0x2, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, - 0x7, 0xff, 0x80, 0x0, 0x0, 0x0, 0x15, 0xac, - 0xef, 0xfd, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x7, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0x3f, 0xff, 0x73, 0xff, 0xf6, 0x2f, 0xff, 0x62, - 0xff, 0xf6, 0x2f, 0xff, 0x51, 0xff, 0xf5, 0x1f, - 0xff, 0x41, 0xff, 0xf4, 0xf, 0xff, 0x30, 0xff, - 0xf3, 0xf, 0xff, 0x30, 0xff, 0xf2, 0x1, 0x11, - 0x0, - - /* U+0028 "(" */ - 0x0, 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x6f, - 0xff, 0xa0, 0x0, 0x0, 0xef, 0xff, 0x20, 0x0, - 0x6, 0xff, 0xfb, 0x0, 0x0, 0xd, 0xff, 0xf4, - 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x9f, - 0xff, 0x80, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, - 0x2, 0xff, 0xfe, 0x0, 0x0, 0x7, 0xff, 0xfa, - 0x0, 0x0, 0xa, 0xff, 0xf6, 0x0, 0x0, 0xe, - 0xff, 0xf3, 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, - 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, - 0xb0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, 0x0, - 0x9f, 0xff, 0x80, 0x0, 0x0, 0xbf, 0xff, 0x60, - 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, 0xcf, - 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, - 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, - 0x50, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, - 0xbf, 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0x80, - 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, 0x0, 0x6f, - 0xff, 0xb0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, - 0x0, 0x1f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, - 0xf3, 0x0, 0x0, 0xa, 0xff, 0xf6, 0x0, 0x0, - 0x7, 0xff, 0xfa, 0x0, 0x0, 0x2, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, - 0x9f, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xe0, - 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0x6, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0xef, 0xff, 0x20, - 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0xd, - 0xff, 0xf2, - - /* U+0029 ")" */ - 0x5f, 0xff, 0xb0, 0x0, 0x0, 0xd, 0xff, 0xf4, - 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xff, 0xb0, - 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0xb, - 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0xcf, - 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, 0x80, 0x0, - 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x2f, 0xff, - 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, - 0xd, 0xff, 0xf4, 0x0, 0x0, 0xb, 0xff, 0xf6, - 0x0, 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x9, - 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xf9, 0x0, - 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, - 0xfa, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, - 0x7, 0xff, 0xfa, 0x0, 0x0, 0x8, 0xff, 0xf9, - 0x0, 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0xa, - 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, 0xf6, 0x0, - 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, - 0xf1, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x0, 0x0, - 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x9f, 0xff, 0x80, - 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x1, 0xff, - 0xff, 0x10, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, - 0xb, 0xff, 0xf7, 0x0, 0x0, 0x1f, 0xff, 0xf1, - 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, 0x0, 0xdf, - 0xff, 0x30, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, - 0xd, 0xff, 0xf4, 0x0, 0x0, 0x5f, 0xff, 0xb0, - 0x0, 0x0, - - /* U+002A "*" */ - 0x0, 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x2e, 0x50, 0x0, 0x7f, 0xf1, 0x0, - 0x19, 0xb0, 0xa, 0xff, 0xb2, 0x7, 0xff, 0x10, - 0x6e, 0xff, 0x40, 0xcf, 0xff, 0xf8, 0x8f, 0xf4, - 0xcf, 0xff, 0xf6, 0x0, 0x5d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa2, 0x0, 0x0, 0x7, 0xef, 0xff, - 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x2b, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x1, 0x9f, 0xff, - 0xfe, 0xff, 0xef, 0xff, 0xe6, 0x0, 0xef, 0xff, - 0xd4, 0x7f, 0xf1, 0x7f, 0xff, 0xf8, 0x8, 0xff, - 0x70, 0x7, 0xff, 0x10, 0x1a, 0xff, 0x20, 0x9, - 0x10, 0x0, 0x7f, 0xf1, 0x0, 0x4, 0x70, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xbb, 0x10, 0x0, 0x0, - 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x0, 0xa, 0xaa, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x8, 0x88, 0x88, 0x88, - 0x8f, 0xff, 0xd8, 0x88, 0x88, 0x88, 0x50, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, - - /* U+002C "," */ - 0x1, 0x66, 0x10, 0x2e, 0xff, 0xf3, 0xbf, 0xff, - 0xfb, 0xdf, 0xff, 0xfe, 0xbf, 0xff, 0xfc, 0x3f, - 0xff, 0xf9, 0x3, 0xff, 0xf4, 0x5, 0xff, 0xe0, - 0x9, 0xff, 0x90, 0xd, 0xff, 0x40, 0x1f, 0xfe, - 0x0, 0x4f, 0xf9, 0x0, 0x8f, 0xf4, 0x0, - - /* U+002D "-" */ - 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x37, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x57, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, - - /* U+002E "." */ - 0x0, 0x0, 0x0, 0xa, 0xff, 0xa0, 0x9f, 0xff, - 0xf9, 0xef, 0xff, 0xfd, 0xdf, 0xff, 0xfd, 0x8f, - 0xff, 0xf7, 0x8, 0xee, 0x80, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xda, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xfa, 0x51, 0x1, 0x38, 0xef, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x40, 0x0, 0x0, - 0x0, 0x1b, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xdf, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf3, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x0, - 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x70, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x8f, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xe0, 0xbf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0xdf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf3, 0xef, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf3, 0xcf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf2, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x8f, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xe0, 0x5f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xb0, 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x70, 0xc, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0x10, 0x6, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x0, - 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, 0x5f, 0xff, - 0xfe, 0x40, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x51, - 0x1, 0x38, 0xef, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x49, 0xce, 0xff, 0xda, 0x60, 0x0, - 0x0, 0x0, 0x0, - - /* U+0031 "1" */ - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x9e, 0xee, 0xee, 0xef, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfa, - - /* U+0032 "2" */ - 0x0, 0x0, 0x0, 0x27, 0xad, 0xff, 0xfe, 0xc9, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, - 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x2f, 0xff, 0xff, 0xfa, 0x52, 0x10, 0x2, 0x6c, - 0xff, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xfa, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x0, - 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x30, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xeb, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, - - /* U+0033 "3" */ - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x5, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x15, 0x55, 0x67, 0xaf, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf0, - 0x3, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xb0, 0xc, 0xff, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x50, - 0x6f, 0xff, 0xff, 0xd8, 0x42, 0x10, 0x2, 0x5a, - 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x5, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x58, 0xcd, 0xef, 0xfe, 0xc9, - 0x40, 0x0, 0x0, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x77, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x80, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xed, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xff, 0xff, 0xdd, 0xdd, 0xdc, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, - 0x0, 0x0, - - /* U+0035 "5" */ - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xed, 0xc9, - 0x61, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, 0xee, 0xee, - 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x49, - 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfa, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, - 0x0, 0xbb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf3, 0x4, 0xff, 0xe7, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xc0, - 0xd, 0xff, 0xff, 0xfb, 0x63, 0x10, 0x1, 0x38, - 0xef, 0xff, 0xff, 0x40, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0x8e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x26, 0xac, 0xef, 0xff, 0xda, - 0x72, 0x0, 0x0, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xde, 0xff, - 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, - 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0x94, 0x0, 0x0, - 0x1, 0x49, 0xe0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, - 0x1, 0x58, 0x9a, 0x97, 0x40, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xa0, 0x2, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0x91, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0xdf, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xef, 0xff, - 0xfa, 0x41, 0x0, 0x26, 0xdf, 0xff, 0xff, 0x40, - 0xdf, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xd0, 0xcf, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, - 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfa, 0xaf, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfd, - 0x6f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfe, 0x3f, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, - 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfd, 0x9, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, - 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xe0, - 0x0, 0xd, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x1, - 0x7f, 0xff, 0xff, 0x50, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xec, 0xaa, 0xcf, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x49, 0xcd, 0xff, 0xec, - 0x83, 0x0, 0x0, 0x0, - - /* U+0037 "7" */ - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xfe, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf5, - 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xe0, 0xbf, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x70, - 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x0, 0xbf, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, - 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf2, 0x0, 0x46, 0x66, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x0, 0x0, 0x1, 0x59, 0xcd, 0xff, 0xed, - 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xeb, 0xaa, 0xbd, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xa3, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0xdf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x20, 0x0, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, - 0x0, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0xcf, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x10, 0x0, 0x7f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, - 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x4, - 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xfe, 0xa8, 0x66, 0x79, 0xdf, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x91, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xe8, 0x41, 0x0, 0x13, - 0x6c, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xdf, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0x30, 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xb0, 0xc, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf1, 0xf, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf4, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0xf, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf5, 0xe, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, - 0xa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xf0, 0x3, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0x90, 0x0, 0xaf, 0xff, 0xff, 0x82, 0x0, - 0x0, 0x0, 0x16, 0xef, 0xff, 0xfe, 0x10, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xeb, 0xaa, 0xbd, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, - 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x7a, 0xde, 0xff, 0xfd, 0xb8, 0x40, - 0x0, 0x0, 0x0, - - /* U+0039 "9" */ - 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, 0x95, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xca, 0xab, 0xdf, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0x0, 0x28, 0xff, 0xff, 0xe1, 0x0, 0x0, 0xef, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xb0, 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x9, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xfb, 0x0, 0xbf, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf1, - 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x50, 0xaf, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf9, 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xc0, 0x1f, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xfd, 0x0, 0x9f, 0xff, 0xfe, 0x71, 0x0, - 0x0, 0x2, 0x8f, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0xdf, 0xff, 0xff, 0xfd, 0xba, 0xbd, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa1, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5, - 0xad, 0xff, 0xfe, 0xb7, 0x20, 0x0, 0x8f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0xe, 0xd7, - 0x20, 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, 0xef, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x49, 0xbe, 0xff, 0xfe, 0xb8, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+003A ":" */ - 0x8, 0xee, 0x80, 0x8f, 0xff, 0xf7, 0xdf, 0xff, - 0xfd, 0xef, 0xff, 0xfd, 0x9f, 0xff, 0xf8, 0xa, - 0xff, 0xa0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xa0, 0x9f, 0xff, 0xf9, 0xef, 0xff, 0xfd, 0xdf, - 0xff, 0xfd, 0x8f, 0xff, 0xf7, 0x8, 0xee, 0x80, - - /* U+003B ";" */ - 0x8, 0xee, 0x80, 0x8f, 0xff, 0xf7, 0xdf, 0xff, - 0xfd, 0xef, 0xff, 0xfd, 0x9f, 0xff, 0xf8, 0xa, - 0xff, 0xa0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xee, - 0x80, 0x7f, 0xff, 0xf7, 0xcf, 0xff, 0xfd, 0xdf, - 0xff, 0xfd, 0x8f, 0xff, 0xfb, 0x9, 0xff, 0xf6, - 0x3, 0xff, 0xf1, 0x7, 0xff, 0xc0, 0xb, 0xff, - 0x60, 0xe, 0xff, 0x10, 0x2f, 0xfc, 0x0, 0x6f, - 0xf7, 0x0, 0x58, 0x81, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4b, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, - 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, - 0x4a, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, - 0x0, 0x17, 0xdf, 0xff, 0xff, 0xfe, 0x92, 0x0, - 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xc5, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xb5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xdf, - 0xff, 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xfc, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, - 0xff, 0xff, 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xaf, 0xff, 0xff, 0xff, 0xc6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4b, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+003D "=" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x50, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, - - /* U+003E ">" */ - 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xfe, 0x82, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xb4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, - 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xfb, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, - 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x7d, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xfb, - 0x30, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, - 0xfe, 0x81, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xff, - 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x2, 0x8e, - 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x82, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x0, 0x0, 0x37, 0xbd, 0xff, 0xfe, 0xc9, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfe, - 0xdd, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3f, 0xff, - 0xff, 0xe7, 0x30, 0x0, 0x0, 0x4b, 0xff, 0xff, - 0xf7, 0x1, 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, 0x6f, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x9a, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xfa, - 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, - 0x9c, 0xde, 0xff, 0xed, 0xb8, 0x61, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x8d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xea, 0x63, - 0x10, 0x0, 0x1, 0x46, 0xaf, 0xff, 0xff, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5c, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4d, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1, - 0x7b, 0xef, 0xfd, 0xb5, 0x10, 0x0, 0xff, 0xfc, - 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x3f, 0xff, - 0x90, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0xff, 0xfc, 0x0, 0xa, 0xff, - 0xe0, 0x0, 0x0, 0xbf, 0xfe, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0xff, 0xfc, 0x0, 0x0, 0xef, 0xf7, 0x0, 0x3, - 0xff, 0xf5, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xb8, 0x79, 0xbf, 0xff, 0xfb, 0xff, 0xfc, 0x0, - 0x0, 0x6f, 0xfe, 0x0, 0x9, 0xff, 0xd0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0x81, 0x0, 0x0, 0x1, - 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xe, 0xff, - 0x40, 0xe, 0xff, 0x70, 0x0, 0x0, 0x7f, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x8, 0xff, 0x90, 0x3f, 0xff, - 0x10, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfc, 0x0, 0x0, - 0x3, 0xff, 0xd0, 0x6f, 0xfd, 0x0, 0x0, 0x4, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xf0, - 0x9f, 0xfa, 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xcf, 0xf7, 0x0, - 0x0, 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0xbf, 0xf4, 0xcf, 0xf6, 0x0, 0x0, 0xd, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0xaf, 0xf5, 0xdf, - 0xf5, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0xaf, 0xf5, 0xdf, 0xf5, 0x0, 0x0, - 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xaf, - 0xf5, 0xcf, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0xbf, 0xf4, 0xbf, 0xf7, - 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0xdf, 0xf2, 0x9f, 0xfa, 0x0, 0x0, 0x4, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xfc, 0x0, 0x0, 0x1, 0xff, 0xf0, - 0x6f, 0xfd, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, - 0x0, 0x0, 0x5, 0xff, 0xb0, 0x3f, 0xff, 0x20, - 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, 0x0, 0xc, - 0xff, 0x60, 0xe, 0xff, 0x70, 0x0, 0x0, 0xc, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x1, 0x8f, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x7f, 0xfe, 0x10, 0x9, - 0xff, 0xd0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, - 0xa7, 0x68, 0xaf, 0xff, 0xfa, 0x7f, 0xff, 0xf9, - 0x7b, 0xff, 0xf7, 0x0, 0x2, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0xaf, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x2f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, - 0xfe, 0xb7, 0x10, 0x0, 0x0, 0x3a, 0xef, 0xeb, - 0x50, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xd4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xc5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xb6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xfa, 0x74, 0x21, 0x0, 0x14, - 0x6a, 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x9e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x37, 0x9c, 0xef, 0xff, 0xec, 0xa7, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xfe, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x97, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x21, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, - 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, - 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xd0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x60, 0x0, 0x4, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xc9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9c, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xc0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf3, 0x0, 0x0, 0x7f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x20, 0x5, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0xd, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, - - /* U+0042 "B" */ - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, - 0x0, 0x0, 0x6f, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xab, 0xdf, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x7f, 0xff, 0xff, 0xa0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xf1, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf5, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf1, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xb0, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x7f, 0xff, 0xfe, 0x10, 0x0, 0x6f, 0xff, - 0xfa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xdf, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x5a, - 0xff, 0xff, 0xf7, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0x20, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x90, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, - 0xff, 0x20, 0x6f, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xac, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc9, 0x61, 0x0, - 0x0, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, - 0xff, 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, - 0x95, 0x20, 0x1, 0x25, 0x9e, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, 0x0, - 0x1e, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0x60, 0x0, 0xb, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x4, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x40, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0x60, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0x95, - 0x20, 0x1, 0x25, 0xae, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x9c, 0xef, 0xff, 0xeb, 0x84, 0x0, 0x0, - 0x0, 0x0, - - /* U+0044 "D" */ - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xca, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xcf, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xa0, 0x6, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x20, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf7, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xc0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x26, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x26, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x6f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x6, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x6, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x20, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xa0, 0x6, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x37, 0xcf, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xee, 0xee, 0xee, - 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xca, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0045 "E" */ - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x56, 0xff, 0xff, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, - - /* U+0046 "F" */ - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x56, 0xff, 0xff, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0x60, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x6f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xef, - 0xff, 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xa5, 0x20, 0x0, 0x24, 0x8d, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xb0, 0x0, - 0x1e, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xa0, 0x0, 0xb, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x30, 0x0, 0x4, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xaa, 0xa2, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x3c, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf3, 0x9f, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x36, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf3, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x30, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x3, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0xb, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf3, 0x0, 0x1e, 0xff, 0xff, - 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x4f, 0xff, 0xff, 0xf7, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, - 0xf3, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa5, - 0x20, 0x0, 0x13, 0x7c, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x9b, 0xef, 0xff, 0xec, 0x95, 0x10, 0x0, - 0x0, 0x0, - - /* U+0048 "H" */ - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, - 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xef, 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, - - /* U+0049 "I" */ - 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, - 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, - 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, - 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, - 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, - 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, - 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, - 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, - 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, - 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, - 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, - 0xff, 0xf0, 0x6f, 0xff, 0xf0, - - /* U+004A "J" */ - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x3, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf0, - 0x0, 0xae, 0x10, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xc0, 0x8, 0xff, 0xd2, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x70, 0x2f, 0xff, 0xff, 0x92, - 0x0, 0x2, 0x9f, 0xff, 0xff, 0x10, 0x7, 0xff, - 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, - 0xff, 0xed, 0xa6, 0x0, 0x0, 0x0, - - /* U+004B "K" */ - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x60, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x6f, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x5, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x5f, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x4, - 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x4f, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0x7e, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xf5, 0x3, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x5f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfd, - 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0x50, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xf3, - - /* U+004C "L" */ - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xea, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+004D "M" */ - 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf5, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf5, 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, 0x6f, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf5, 0x6f, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, - 0x6f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xf5, 0x6f, 0xff, 0xd9, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x7e, - 0xff, 0xf5, 0x6f, 0xff, 0xd1, 0xef, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, - 0xd, 0xff, 0xf5, 0x6f, 0xff, 0xd0, 0x6f, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xf4, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0xc, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xb0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, - 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x20, 0xd, 0xff, 0xf6, 0x6f, 0xff, - 0xd0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf8, 0x0, 0xd, 0xff, 0xf6, 0x6f, - 0xff, 0xd0, 0x0, 0x1e, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xe0, 0x0, 0xd, 0xff, 0xf6, - 0x6f, 0xff, 0xd0, 0x0, 0x6, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0xd, 0xff, - 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0xdf, 0xff, - 0x80, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0xd, - 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x3f, - 0xff, 0xf2, 0x0, 0x1e, 0xff, 0xf2, 0x0, 0x0, - 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, - 0xa, 0xff, 0xfb, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x53, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xec, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, - 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, - - /* U+004E "N" */ - 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x6f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x6f, 0xff, 0xf8, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, - 0xf0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0xd, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x2, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x6f, 0xff, 0xf0, 0x0, 0x4f, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, - 0xf0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x30, - 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x4f, - 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x4f, 0xff, 0xf1, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0x90, 0x4f, 0xff, 0xf1, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xf6, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x8f, - 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf1, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf1, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xf1, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf1, - - /* U+004F "O" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9b, 0xef, - 0xff, 0xeb, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, - 0x95, 0x20, 0x0, 0x25, 0x9e, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xfe, 0x10, 0x0, 0xb, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xfa, 0x0, 0x3, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xa0, 0x1f, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x16, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x9f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x8c, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, 0xdf, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xce, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xcc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xfb, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0x86, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf5, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x10, 0xbf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xa0, 0x3, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xf3, 0x0, 0xb, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xfe, 0x95, 0x20, 0x0, 0x25, 0x9e, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x9b, 0xef, 0xff, - 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0050 "P" */ - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, - 0x95, 0x10, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x6f, - 0xff, 0xfe, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x7d, 0xff, 0xff, 0xf7, - 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0x20, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xa0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf5, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x6f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf6, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf5, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xe0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0x10, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x25, 0x9e, 0xff, 0xff, - 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe5, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, - 0x0, 0x6f, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xed, - 0xcb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xef, - 0xff, 0xeb, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xfe, 0x95, 0x20, 0x0, 0x25, - 0x9e, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xfa, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0xaf, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x1f, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x0, - 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf5, 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x80, 0xb, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfb, 0x0, 0xdf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0xe, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xc0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfb, 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x90, 0x6, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x2f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, - 0xcf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xb0, - 0x0, 0x5, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xf4, 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xfd, 0x73, 0x0, 0x0, - 0x2, 0x7d, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xed, 0xef, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x38, 0xbe, 0xff, 0xff, 0xff, 0xf6, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x38, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x4e, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xe7, 0x20, 0x14, - 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xbf, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x15, 0x78, 0x75, 0x10, 0x0, - 0x0, - - /* U+0052 "R" */ - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, - 0x95, 0x10, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7d, 0xff, - 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, - 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xa0, 0x6, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf3, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x50, 0x6f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf7, 0x6, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x70, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0x6, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x30, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xe0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, - 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0x10, 0x6, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xef, 0xff, - 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xdd, 0xdd, - 0xdd, 0xdc, 0xcd, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xe1, 0x0, 0x0, 0x6f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xc0, 0x0, 0x6, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x70, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x6, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfd, 0x0, 0x6f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xfa, 0x0, - - /* U+0053 "S" */ - 0x0, 0x0, 0x0, 0x1, 0x6a, 0xce, 0xff, 0xed, - 0xb8, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xb5, 0x10, - 0x0, 0x0, 0x36, 0xbf, 0xff, 0x80, 0x0, 0xc, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x19, 0xf1, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xc8, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x83, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5a, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x26, 0xae, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x8e, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf6, 0x0, 0xe8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x30, 0x7f, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xd0, 0xe, 0xff, 0xff, - 0xe9, 0x51, 0x0, 0x0, 0x1, 0x4a, 0xff, 0xff, - 0xf5, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xed, - 0xde, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, 0xec, 0xa6, - 0x10, 0x0, 0x0, 0x0, - - /* U+0054 "T" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xce, - 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xfe, 0xee, - 0xee, 0xee, 0xee, 0xe9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0055 "U" */ - 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xf6, 0xaf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x6a, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0xaf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf6, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf6, 0xaf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x6a, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0xaf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf6, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf6, 0xaf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x6a, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, - 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xf6, 0x9f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x58, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x6f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x23, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x0, 0xaf, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0x60, 0x3, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xe0, 0x0, 0xb, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xf7, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xfa, 0x52, 0x0, 0x12, 0x6c, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x48, 0xcd, 0xef, 0xed, 0xb7, 0x30, 0x0, - 0x0, 0x0, 0x0, - - /* U+0056 "V" */ - 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x20, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xb0, 0x0, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf4, 0x0, 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xfd, 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x60, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, - 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfc, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf3, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xa0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x10, 0x7, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf8, 0x0, 0xef, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xe0, 0x5f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x5c, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xfe, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0057 "W" */ - 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, - 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, - 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, - 0x6, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, - 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, - 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, - 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfd, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, - 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf6, 0xcf, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, - 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf1, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xb0, 0x1f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x50, 0xb, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x0, 0x6, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xfb, 0x0, 0x1, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf0, 0x0, 0x0, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x1f, 0xff, 0xf2, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, - 0xcf, 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, 0xf8, - 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x1, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, - 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, 0x7, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x20, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0x0, 0xc, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x80, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x2f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xd0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x7f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf2, 0x4, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0xdf, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xf8, 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa2, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xfd, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf8, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0058 "X" */ - 0x5, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, - 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0xd, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, - 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x5f, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x2, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xac, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x9e, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xfc, 0x5, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xf2, 0x0, 0x9f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x60, 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf3, 0x0, 0x5, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xfe, 0x10, 0x1e, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xa0, - - /* U+0059 "Y" */ - 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf5, 0x4, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, 0xaf, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, 0x1f, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf1, 0x0, 0x4, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xfa, 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x40, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xd2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfe, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+005A "Z" */ - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0xbe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xef, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xe9, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, - - /* U+005B "[" */ - 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xff, 0xff, - 0xff, 0xfd, 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x6f, - 0xff, 0xe8, 0x88, 0x87, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, - 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, - 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, - 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, - 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, - 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, - 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, - 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, - 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, - 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, - 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, - 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, - 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, - 0xe8, 0x88, 0x87, 0x6f, 0xff, 0xff, 0xff, 0xfd, - 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xff, 0xff, - 0xff, 0xfd, - - /* U+005C "\\" */ - 0x48, 0x88, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x80, - - /* U+005D "]" */ - 0x2f, 0xff, 0xff, 0xff, 0xff, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0x1, 0x88, 0x88, 0xaf, 0xff, 0xf0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf0, 0x18, 0x88, 0x8a, 0xff, 0xff, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0x2, 0xff, 0xff, 0xff, 0xff, 0xf0, - - /* U+005E "^" */ - 0x0, 0x0, 0x0, 0x0, 0x78, 0x85, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xef, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0x8f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xd0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x60, 0xb, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x0, 0x5, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, - 0xef, 0xf6, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, - 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xc0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, - 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, - 0xa0, 0x0, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf1, 0x0, 0x0, 0xcf, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x3, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, - 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x40, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xb0, 0x7f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, - - /* U+005F "_" */ - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, - - /* U+0060 "`" */ - 0x4f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xe2, - - /* U+0061 "a" */ - 0x0, 0x0, 0x4, 0x8b, 0xde, 0xfe, 0xda, 0x71, - 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0xdf, 0xff, 0xff, 0xfd, 0xcc, 0xdf, 0xff, 0xff, - 0xfc, 0x0, 0x5, 0xff, 0xf9, 0x40, 0x0, 0x0, - 0x6, 0xef, 0xff, 0xf6, 0x0, 0xb, 0x91, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf7, 0x0, 0x0, 0x38, 0xbe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x2, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0xdf, 0xff, 0xfa, 0x52, 0x11, 0x11, 0x11, - 0x1c, 0xff, 0xf7, 0x5f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x7a, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, - 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x7b, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x9f, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x74, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xf7, 0xc, 0xff, 0xff, 0xe8, 0x65, 0x58, - 0xdf, 0xff, 0xef, 0xff, 0x70, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa8, 0xff, 0xf7, 0x0, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x8f, - 0xff, 0x70, 0x0, 0x3, 0x8c, 0xef, 0xfd, 0xb6, - 0x10, 0x8, 0xff, 0xf7, - - /* U+0062 "b" */ - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf3, 0x0, 0x4, 0x9c, 0xef, 0xed, - 0x95, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, - 0x0, 0xf, 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0xff, 0xff, - 0xaf, 0xff, 0xff, 0xed, 0xce, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, 0x20, - 0x0, 0x2, 0x8f, 0xff, 0xff, 0xc0, 0x0, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0x70, 0xf, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf6, 0xf, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xb0, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xfe, 0xf, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf1, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x2f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf2, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x1f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xe0, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, - 0xf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xf0, 0xf, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x3, 0xdf, 0xff, 0xf7, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x82, 0x0, 0x0, 0x28, 0xff, 0xff, - 0xfc, 0x0, 0xf, 0xff, 0xf8, 0xff, 0xff, 0xfe, - 0xcc, 0xef, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xff, - 0xff, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x10, 0x0, 0xf, 0xff, 0xf0, 0x4, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xda, - 0x50, 0x0, 0x0, 0x0, 0x0, - - /* U+0063 "c" */ - 0x0, 0x0, 0x0, 0x0, 0x38, 0xbe, 0xff, 0xec, - 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xed, 0xde, 0xff, 0xff, 0xff, 0x90, 0x0, 0xa, - 0xff, 0xff, 0xf9, 0x20, 0x0, 0x2, 0x8f, 0xff, - 0xff, 0x40, 0x6, 0xff, 0xff, 0xd3, 0x0, 0x0, - 0x0, 0x0, 0x3d, 0xff, 0xc2, 0x0, 0xef, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x70, - 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xe7, 0x0, 0x0, - 0x5f, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xfd, 0x30, 0x0, 0xaf, 0xff, 0xff, 0x82, - 0x0, 0x0, 0x28, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xfe, 0xcc, 0xef, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xfe, - 0xc9, 0x40, 0x0, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x5, 0x9d, 0xef, 0xec, - 0x94, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, - 0xff, 0xf0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x73, 0xff, 0xff, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xfe, 0xcd, 0xef, 0xff, 0xff, - 0xaf, 0xff, 0xf0, 0x0, 0xcf, 0xff, 0xff, 0x82, - 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x7f, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, - 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf1, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x1f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, - 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xb, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xf0, 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xf0, 0x7, 0xff, 0xff, 0xd3, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0x0, 0xc, - 0xff, 0xff, 0xf8, 0x20, 0x0, 0x2, 0x8f, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xec, 0xce, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xda, - 0x50, 0x0, 0xf, 0xff, 0xf0, - - /* U+0065 "e" */ - 0x0, 0x0, 0x0, 0x0, 0x5a, 0xde, 0xff, 0xda, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xfe, 0xba, 0xbe, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, 0xb3, 0x0, - 0x0, 0x2, 0xaf, 0xff, 0xfc, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf7, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe0, 0x0, - 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x60, 0xb, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, - 0x0, 0xef, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xd0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0x31, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0xe, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xf4, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xa3, 0x0, 0x0, 0x4, 0xaf, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xdc, 0xdf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x7b, 0xef, 0xfe, 0xda, - 0x51, 0x0, 0x0, 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xb6, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xeb, 0x9a, 0xef, 0x30, 0x0, 0x0, 0xf, 0xff, - 0xfb, 0x10, 0x0, 0x5, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x38, 0x88, 0xbf, 0xff, - 0xe8, 0x88, 0x88, 0x84, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0067 "g" */ - 0x0, 0x0, 0x0, 0x0, 0x59, 0xde, 0xfe, 0xda, - 0x50, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xb, - 0xff, 0xf5, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x1b, 0xff, 0xf5, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xfe, 0xdc, 0xef, 0xff, - 0xff, 0xdc, 0xff, 0xf5, 0x0, 0xe, 0xff, 0xff, - 0xf8, 0x20, 0x0, 0x1, 0x6d, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x9f, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf5, 0x2, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xf5, 0x8, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, - 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xf5, 0xf, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf5, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x2f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf5, 0x1f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xf5, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0xc, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf5, 0x7, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, - 0x1, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x9f, 0xff, - 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf5, 0x0, 0xd, 0xff, 0xff, 0xf9, 0x30, - 0x0, 0x1, 0x7d, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xdc, 0xef, 0xff, - 0xff, 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1e, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0xe, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x59, 0xde, 0xfe, 0xda, 0x50, 0x0, - 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xb0, 0x0, 0x2, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, 0x0, - 0xb, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xfe, 0x0, 0x0, 0x5f, 0xff, 0xfd, - 0x73, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0xcc, - 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, 0xff, 0xed, - 0xb7, 0x30, 0x0, 0x0, 0x0, - - /* U+0068 "h" */ - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf3, 0x0, 0x4, 0x9d, 0xef, 0xed, 0x94, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x5e, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0xf, 0xff, - 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfe, - 0xef, 0xff, 0xff, 0xff, 0x30, 0xf, 0xff, 0xff, - 0xff, 0xe6, 0x10, 0x0, 0x16, 0xef, 0xff, 0xfd, - 0x0, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xf5, 0xf, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xa0, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xfd, 0xf, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x1f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x20, - - /* U+0069 "i" */ - 0x1, 0x66, 0x20, 0x1e, 0xff, 0xf4, 0x9f, 0xff, - 0xfd, 0xbf, 0xff, 0xfe, 0x7f, 0xff, 0xfa, 0x9, - 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, - 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, - 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, - 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, - 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, - 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, - 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, - 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, - 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, - - /* U+006A "j" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xfd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, 0x71, 0x0, - 0x1, 0xdf, 0xff, 0xe0, 0x0, 0x3f, 0xfc, 0xab, - 0xff, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x6b, 0xef, 0xfe, 0xa4, - 0x0, 0x0, 0x0, - - /* U+006B "k" */ - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0x90, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x1, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x2e, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x2, - 0xef, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x3e, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x34, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0x66, 0xff, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xd, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf9, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0x50, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xa0, - - /* U+006C "l" */ - 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, - 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, - 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, - 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, - 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, - 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, - 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, - 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, - 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, - 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, - 0xff, 0xff, 0x30, - - /* U+006D "m" */ - 0xff, 0xff, 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xc7, - 0x20, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, - 0x82, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x2, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xff, - 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0xf, 0xff, 0xfd, 0xff, 0xff, 0xdb, - 0xab, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xfe, - 0xba, 0xbe, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, - 0xff, 0xf9, 0x10, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xb3, 0x0, 0x0, 0x5, 0xef, 0xff, - 0xf7, 0xf, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xe0, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x3f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf7, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x9f, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xfa, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xbf, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xbf, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xbf, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xbf, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfb, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfb, - - /* U+006E "n" */ - 0xff, 0xff, 0x0, 0x1, 0x5a, 0xde, 0xfe, 0xd9, - 0x40, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0xff, - 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0xf, 0xff, 0xfd, 0xff, 0xff, 0xeb, - 0xab, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, - 0xff, 0xfb, 0x30, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0xd0, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x50, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfa, - 0xf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xd0, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf1, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf2, - - /* U+006F "o" */ - 0x0, 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, - 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xfe, 0xcd, 0xef, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xf8, 0x20, 0x0, 0x2, 0x8f, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x6f, 0xff, 0xfd, 0x30, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xf5, 0x0, 0x0, 0xef, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xfd, 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, - 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xa0, 0xe, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xd0, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x2f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf1, 0x2f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0xe, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xd0, 0xa, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, - 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, 0xef, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xfd, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x30, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xf4, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xf8, 0x20, 0x0, 0x2, 0x8f, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xfe, 0xcc, 0xef, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, - 0xce, 0xff, 0xec, 0x83, 0x0, 0x0, 0x0, 0x0, - - /* U+0070 "p" */ - 0xff, 0xff, 0x0, 0x0, 0x5a, 0xde, 0xfe, 0xd9, - 0x50, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x6, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0xf, 0xff, 0xfb, - 0xff, 0xff, 0xeb, 0x99, 0xae, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, - 0x0, 0x5, 0xdf, 0xff, 0xfc, 0x0, 0xf, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf0, 0xf, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x60, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, - 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xe0, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xfe, 0xf, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf6, 0xf, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0x70, 0xf, 0xff, 0xff, - 0xff, 0xf9, 0x20, 0x0, 0x2, 0x8f, 0xff, 0xff, - 0xc0, 0x0, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xec, - 0xce, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xf, 0xff, - 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0xff, 0xff, 0x30, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0xf, - 0xff, 0xf3, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa5, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x0, 0x0, 0x0, 0x59, 0xde, 0xff, 0xda, - 0x50, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x6, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xf, 0xff, 0xf0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xec, 0xde, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0x0, 0xc, 0xff, 0xff, 0xf8, 0x20, - 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xf0, 0x7, - 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf0, - 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xb, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xf0, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x1f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf2, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x2f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf1, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xe, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf0, 0xbf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0x0, 0x7f, 0xff, 0xfd, 0x30, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xf0, 0x0, 0xcf, - 0xff, 0xff, 0x82, 0x0, 0x0, 0x28, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfe, - 0xcc, 0xef, 0xff, 0xff, 0xaf, 0xff, 0xf0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x73, 0xff, 0xff, 0x0, 0x0, 0x0, 0x7e, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xed, 0x94, - 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf0, - - /* U+0072 "r" */ - 0xff, 0xff, 0x0, 0x0, 0x6a, 0xdf, 0x8f, 0xff, - 0xf0, 0x6, 0xef, 0xff, 0xf8, 0xff, 0xff, 0x9, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x32, - 0x1f, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xdb, 0x84, - 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x20, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x2, 0xff, - 0xff, 0xff, 0xdb, 0xbc, 0xdf, 0xff, 0xff, 0x40, - 0xa, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, 0x4a, - 0xfc, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x22, 0x0, 0x2f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xc6, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xfe, 0xb8, 0x41, 0x0, 0x0, 0x0, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x20, 0x0, - 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x6b, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfb, 0x8, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x1f, 0xff, - 0xc6, 0x20, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xf3, - 0x9f, 0xff, 0xff, 0xff, 0xdc, 0xbc, 0xff, 0xff, - 0xff, 0xa0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x2, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, - 0x48, 0xbd, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, - - /* U+0074 "t" */ - 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x38, 0x88, 0xbf, 0xff, 0xe8, 0x88, 0x88, 0x84, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xfd, 0x20, 0x0, 0x7, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, 0xab, - 0xff, 0x50, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x5a, 0xef, 0xfd, 0xa4, 0x0, - - /* U+0075 "u" */ - 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xb3, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x3f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xb3, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x3f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xb3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfb, 0x3f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xb3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfb, 0x3f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb3, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xfb, 0x3f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb3, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfb, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb3, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xfb, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xb1, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, - 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xb0, 0xbf, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, 0x5, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xb0, 0xe, 0xff, 0xff, 0xd6, 0x10, - 0x0, 0x27, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xaf, - 0xff, 0xb0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x74, 0xff, 0xfb, 0x0, 0x0, 0x3c, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x4f, 0xff, - 0xb0, 0x0, 0x0, 0x4, 0x8c, 0xef, 0xed, 0xa4, - 0x0, 0x4, 0xff, 0xfb, - - /* U+0076 "v" */ - 0xd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf6, 0x7, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, - 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x20, 0x0, 0x2f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, - 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x6f, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x80, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, - 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf5, 0x0, 0xa, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xfc, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x8f, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0x90, 0xef, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf6, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0077 "w" */ - 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf1, 0x3f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, - 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x60, 0x7, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, - 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfa, 0x0, 0x0, 0xbf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, - 0x0, 0x6f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xf8, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x9f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, - 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xc0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0xd, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0xef, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x10, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x4, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x50, 0x0, 0x2, 0xff, 0xfa, 0x0, 0x1, 0xff, - 0xfc, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x8, 0xff, - 0xf4, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0xf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf1, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x5f, - 0xff, 0x80, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf6, 0x0, 0x4f, 0xff, - 0x80, 0x0, 0x0, 0xf, 0xff, 0xd0, 0x0, 0xbf, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xfc, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, 0x9, - 0xff, 0xf3, 0x1, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x10, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, 0x7, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x75, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xfe, 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xdb, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x7f, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - - /* U+0078 "x" */ - 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x20, - 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x1, 0xef, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, 0xb, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, 0x3, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf5, 0x1e, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xbf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xfa, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xd0, 0xa, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x20, 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x3f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xa0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, - 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xe1, 0x0, 0x0, 0x8f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfc, 0x0, - 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x80, 0x1e, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, - - /* U+0079 "y" */ - 0xd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf6, 0x7, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, - 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x20, 0x0, 0x2f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, - 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x5f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x90, 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, - 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xfe, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, 0x6f, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xb0, 0xdf, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xd4, 0x0, 0x0, - 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xeb, 0xbe, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5a, 0xdf, 0xfd, 0xa4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8d, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xb8, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x23, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x43, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, - - /* U+007B "{" */ - 0x0, 0x0, 0x0, 0x6, 0xbe, 0xff, 0x90, 0x0, - 0x0, 0x2d, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x6, 0xff, 0xff, - 0xfb, 0x95, 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x10, 0x0, 0x4, 0x9a, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1, 0x9f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x80, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xb9, 0x50, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x7c, 0xef, - 0xf9, - - /* U+007C "|" */ - 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, - 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, - 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, - 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, - 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, - 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, - 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, - 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, - 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, - 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, - 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, - 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, - 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, - 0xf8, - - /* U+007D "}" */ - 0x2f, 0xff, 0xd9, 0x30, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x1, 0x8a, 0xdf, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xfc, 0x98, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xfe, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x8f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x70, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x18, - 0xad, 0xff, 0xff, 0xe0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x2, 0xff, 0xfd, 0x93, 0x0, 0x0, - 0x0, - - /* U+007E "~" */ - 0x0, 0x3, 0xae, 0xfd, 0x81, 0x0, 0x0, 0x0, - 0x0, 0x9b, 0xb0, 0x0, 0x5f, 0xff, 0xff, 0xfe, - 0x40, 0x0, 0x0, 0x0, 0xef, 0xf0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x2, 0xff, - 0xd0, 0xa, 0xff, 0xf8, 0x58, 0xff, 0xff, 0x90, - 0x0, 0xa, 0xff, 0x90, 0xf, 0xff, 0x40, 0x0, - 0x2d, 0xff, 0xfd, 0x65, 0xbf, 0xff, 0x40, 0x3f, - 0xfc, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x4b, 0xb4, 0x0, - 0x0, 0x0, 0x0, 0x4b, 0xef, 0xd8, 0x0, 0x0, - - /* U+00B0 "°" */ - 0x0, 0x0, 0x0, 0x24, 0x53, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5c, 0xff, 0xff, 0xe8, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0x0, 0x8f, 0xfc, 0x41, 0x3, 0x9f, 0xfe, 0x10, - 0x2, 0xff, 0xb0, 0x0, 0x0, 0x5, 0xff, 0x90, - 0x9, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xaf, 0xf1, - 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf4, - 0xf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf6, - 0xe, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, - 0xc, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf3, - 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0xdf, 0xd0, - 0x1, 0xef, 0xe3, 0x0, 0x0, 0x1b, 0xff, 0x60, - 0x0, 0x4f, 0xff, 0xb7, 0x79, 0xef, 0xfa, 0x0, - 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x17, 0xce, 0xfd, 0x93, 0x0, 0x0, - - /* U+2022 "•" */ - 0x0, 0x0, 0x22, 0x0, 0x0, 0x5, 0xef, 0xfd, - 0x30, 0x5, 0xff, 0xff, 0xff, 0x20, 0xdf, 0xff, - 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, 0xd0, 0xff, - 0xff, 0xff, 0xfd, 0xc, 0xff, 0xff, 0xff, 0x80, - 0x3f, 0xff, 0xff, 0xe1, 0x0, 0x3b, 0xfe, 0xa1, - 0x0, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x8d, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x37, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x16, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, - 0x30, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x61, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x94, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x59, 0xbc, 0xb9, 0xbf, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x23, 0x43, 0xf, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xcf, 0xff, 0xff, 0xe9, - 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x23, 0x21, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, - 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x26, 0x9a, 0xba, 0x84, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F008 "" */ - 0x4d, 0xb0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0xb, 0xd4, 0xef, 0xc0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0xc, 0xfd, 0xff, 0xe5, 0x44, 0x45, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x54, 0x44, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x88, 0x89, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x98, 0x88, 0x9f, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xe1, 0x0, 0x1, - 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x10, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xcc, 0xcd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xdc, 0xcc, 0xdf, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0xdf, 0xff, 0xe9, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x9e, 0xff, 0xfc, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0xdf, 0xff, 0xe9, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x9e, 0xff, 0xfc, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xfd, 0xcc, 0xcd, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xdc, 0xcc, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x1, - 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x10, 0x0, - 0x1e, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xf9, 0x88, 0x89, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x98, 0x88, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x44, 0x45, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x54, 0x44, - 0x5f, 0xff, 0xef, 0xc0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xfd, - 0x4e, 0xb0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0xb, 0xe4, - - /* U+F00B "" */ - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x20, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x20, 0x0, 0x9e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd3, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xdb, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x1, 0xbd, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x0, 0x2, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x25, 0x30, 0x0, 0x0, - 0x7, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x7, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xb0, 0x5, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xa0, 0xdf, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0x2a, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xd0, 0x1d, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xf3, 0x0, 0x1d, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, - 0x0, 0x0, 0x8, 0xca, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c, 0xa2, 0x0, - 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x89, 0x99, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0x60, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xcf, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0xf2, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x2f, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0x30, 0x1, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xa0, - 0x5, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xf3, 0xd, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xf6, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf9, - 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfb, 0x3f, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xfd, 0x2f, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfc, - 0x1f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfb, 0xf, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x12, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xf7, 0xa, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xf4, - 0x5, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6d, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x85, 0x21, 0x11, 0x36, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x7a, 0xbc, 0xcc, 0xb9, 0x63, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0xab, 0xcc, - 0xb9, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, - 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe8, 0x10, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xfa, 0x10, 0x1, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x3, 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf7, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc3, 0x9f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xaa, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x10, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x60, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x60, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x2, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xaa, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xf8, 0x4e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x9f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfb, - 0x20, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x3, 0xcf, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x3, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x10, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, - 0xab, 0xcc, 0xba, 0x73, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x76, 0x10, 0x0, 0x0, - 0x0, 0x4, 0x88, 0x88, 0x84, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0xf, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xce, 0xff, 0xff, 0xff, 0xf8, 0xf, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xf5, 0x1, 0xbf, 0xff, 0xff, 0xff, - 0xbf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xfe, 0x30, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x2, 0xa7, 0x0, - 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xef, 0xff, 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, - 0xb0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7, 0xff, - 0xff, 0xfd, 0x20, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x1c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xd2, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe4, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xfe, 0x40, 0xcf, 0xff, 0xff, 0xff, 0xb1, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xf4, 0xdf, 0xff, 0xff, 0xf9, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xf5, 0x2f, 0xff, 0xff, - 0x60, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x1c, 0xff, 0xff, 0x90, 0x5, 0xff, - 0xe3, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x9f, 0xfc, 0x0, 0x0, - 0x6b, 0x20, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xb1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xbc, 0xcc, 0xcc, 0xcc, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xcb, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0xbf, 0xfb, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x7, 0x70, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x10, 0x1, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 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, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x3f, 0xfb, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xd, 0xf5, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x4f, 0xfc, - 0x10, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x50, - - /* U+F01C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xfe, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8a, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xef, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xf7, 0x0, 0xa, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x4f, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc0, - 0xcf, 0xff, 0xff, 0xe8, 0x88, 0x88, 0x88, 0x88, - 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x68, 0x88, 0x88, 0x88, 0x88, 0xaf, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 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, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x1e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, - 0x0, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x47, 0x77, 0x74, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x9b, - 0xcd, 0xdb, 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x8d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd5, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc3, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0xdf, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd9, 0x75, 0x57, 0xad, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0xcf, 0xff, 0xff, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, - 0x81, 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5f, - 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x43, 0x22, 0x10, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x2, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8, 0xcc, 0xcc, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xee, 0xed, 0x90, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xde, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x1, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x19, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, - 0x93, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xff, 0xff, - 0xfd, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, - 0x75, 0x57, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xfe, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x4d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x3a, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd8, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x7a, 0xcd, 0xdc, 0xb9, 0x62, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x35, 0x66, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3b, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x6, 0x88, 0x88, 0x88, 0x88, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x10, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xba, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x88, 0x88, - 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x2, 0x30, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x7, 0xff, 0xb1, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xef, 0xff, 0xd1, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0xd, 0xff, 0xff, 0xb0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x2d, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0xd, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, - 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1b, - 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xb, - 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xff, 0xff, 0xe2, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x9, 0xff, 0xd2, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x5, 0x50, 0x0, 0x3, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xa1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xc1, 0x0, 0x2, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x70, - 0x0, 0xe, 0xff, 0xf9, 0x0, 0x6, 0x88, 0x88, - 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xf2, 0x0, 0x7, 0xff, 0xfe, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x3, 0x40, 0x0, 0x0, 0x3f, - 0xff, 0xfa, 0x0, 0x1, 0xff, 0xff, 0x40, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x8f, 0xfc, 0x10, 0x0, - 0x8, 0xff, 0xff, 0x10, 0x0, 0xbf, 0xff, 0x90, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xe1, - 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x6f, 0xff, - 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xcf, 0xff, - 0xfc, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x3f, - 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0x50, 0x0, 0x4f, 0xff, 0xf0, 0x0, - 0xf, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x1f, 0xff, 0xf1, - 0x0, 0xe, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0xf, 0xff, - 0xf3, 0x0, 0xd, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x0, 0xe, - 0xff, 0xf3, 0x0, 0xc, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, - 0xf, 0xff, 0xf3, 0x0, 0xc, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, - 0x0, 0x1f, 0xff, 0xf1, 0x0, 0xe, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0x50, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0xf, 0xff, - 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xcf, 0xff, - 0xfc, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x3f, - 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xe1, 0x0, 0x1, 0xff, 0xff, 0x70, 0x0, - 0x6f, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x8f, 0xfc, 0x10, 0x0, 0x8, 0xff, 0xff, 0x10, - 0x0, 0xbf, 0xff, 0x90, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x3, 0x40, 0x0, 0x0, 0x3f, 0xff, 0xfa, - 0x0, 0x1, 0xff, 0xff, 0x40, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xf2, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0x70, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xc0, 0x0, 0x2, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xa1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe5, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb1, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb9, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x9, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x9f, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x9, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x9f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 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, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, - 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x88, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0xff, 0xff, 0xfc, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x3f, 0xff, 0xff, 0x80, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0xff, 0xff, 0xf9, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x2d, 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xaf, 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x6, - 0xff, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1f, - 0xff, 0xff, 0xf1, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xbf, - 0xff, 0xff, 0xc0, 0x0, 0x29, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x13, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xd3, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xfb, 0x62, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, - 0xff, 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x46, 0x77, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F048 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, - 0x88, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x94, 0x0, 0x4f, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf9, 0x4, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xf1, 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xf3, 0x4f, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, - 0xff, 0xff, 0xfe, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, - 0xff, 0xe0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf2, 0x4f, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x2, 0xef, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2c, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x77, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x5f, 0xff, 0xff, 0xff, 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, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x91, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x20, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x67, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x1, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xec, 0x50, - 0x0, 0x0, 0x0, 0x1, 0x9e, 0xff, 0xff, 0xff, - 0xff, 0xec, 0x50, 0x1, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x37, 0x89, - 0x99, 0x99, 0x99, 0x86, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x37, 0x89, 0x99, 0x99, 0x99, 0x86, 0x0, - 0x0, - - /* U+F04D "" */ - 0x0, 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x86, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x21, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x1, 0x9e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x50, - 0x0, - - /* U+F051 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x78, 0x88, 0x85, 0xd, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0x6f, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0x7f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x3, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa3, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x13, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x3, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0x4, 0xdf, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5a, 0xb8, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2a, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x50, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x9e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x12, 0x0, 0x0, - - /* U+F054 "" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x39, 0xaa, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, - 0xb8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x10, 0x5a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xb9, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xdd, 0xda, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F068 "" */ - 0x1, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x30, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 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, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x68, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x7, 0xcd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb2, 0x0, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x47, 0xac, 0xef, 0xff, 0xed, 0xb9, 0x62, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x53, - 0x23, 0x47, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x18, 0x99, 0x72, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb2, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x13, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x6f, - 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x2, 0x8b, 0xdc, 0xa6, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x53, - 0x23, 0x46, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x37, 0xac, 0xef, 0xff, 0xfd, 0xb9, 0x62, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F070 "" */ - 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x69, 0xbd, 0xff, 0xfe, 0xdb, - 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x5a, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x71, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfc, 0x11, - 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x32, 0x34, 0x8c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x4, 0xab, 0xa8, 0x30, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xd2, - 0x2, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x1b, - 0xff, 0xff, 0xff, 0xfe, 0x40, 0xef, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xb1, 0x0, 0x0, 0x0, - 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0xff, 0xe4, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, - 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x84, 0x22, 0x35, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x4, - 0xef, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x15, 0x8b, 0xde, 0xff, 0xfd, 0xca, - 0x74, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x50, 0x0, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x13, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xfd, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x99, 0x99, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x20, 0x6, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x41, 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x4, 0x89, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x97, - 0x10, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x67, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0xad, 0xdd, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xdd, - 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xfa, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0xf, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xfe, 0x10, 0x4, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x5f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x4, 0xff, 0xfa, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x3f, 0xff, 0xff, 0xa0, 0x0, - 0xf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x3, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0xad, 0xdd, 0xdd, 0xdd, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xdd, 0xdf, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x10, 0x0, - 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xbd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xb5, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0x70, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x6f, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xfe, 0x5f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xfd, 0xb, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, - 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x40, 0x0, 0x8, 0xd9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0xc3, 0x0, - - /* U+F078 "" */ - 0x0, 0x8, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4c, 0xc3, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0xb, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xf4, 0x5f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfe, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xb5, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xbd, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2, 0x67, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x76, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf8, 0xef, - 0xff, 0xfa, 0xcf, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xf9, 0xe, 0xff, 0xff, 0x91, 0xdf, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xfa, 0x0, 0xef, 0xff, - 0xf9, 0x1, 0xef, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, - 0x0, 0xe, 0xff, 0xff, 0x90, 0x2, 0xdf, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x12, 0x0, 0x0, 0xef, 0xff, 0xf9, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0x82, 0x0, 0xe, 0xff, 0xff, 0x90, 0x0, 0x49, - 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xe2, 0x0, 0xef, 0xff, - 0xf9, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xe2, 0xe, 0xff, 0xff, 0x90, 0x6f, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xd1, 0xef, 0xff, 0xf9, - 0x5f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xc7, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x62, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, - 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x23, 0x33, 0x33, 0x33, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x33, 0x33, 0x33, 0x31, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x5, 0x99, - 0x99, 0x99, 0x98, 0x20, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 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, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x3f, 0xfb, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xd, 0xf5, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x4f, 0xfc, - 0x10, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x50, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x17, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfe, 0xb7, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x17, 0xef, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x9f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x5e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x14, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x67, 0x76, 0x54, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C4 "" */ - 0x0, 0x0, 0x2, 0x79, 0x98, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x13, 0x31, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, - 0xfd, 0x50, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x76, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0xbf, 0xff, 0xff, - 0x90, 0x3, 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0xe, 0xff, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xf, 0xff, 0xff, 0x70, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0xe, - 0xff, 0xff, 0xb0, 0x0, 0x3, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x50, 0x1, - 0xcf, 0xff, 0xff, 0x30, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xcb, 0xef, 0xff, 0xff, 0xf0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xac, 0xde, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x79, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0x90, 0x3, 0xef, - 0xff, 0xff, 0x20, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xc0, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0xe, 0xff, 0xff, 0xb0, - 0x0, 0x3, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0xcf, 0xff, 0xff, 0x50, 0x1, 0xcf, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xff, 0xcb, - 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xfa, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x46, 0x75, 0x10, 0x0, 0x0, 0x0, 0x6, - 0xac, 0xdb, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x41, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xe, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xe, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0x44, - 0xef, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x40, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xbb, 0xbb, - 0xbb, 0xb3, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, - 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, - 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, - 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, - 0xff, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x0, 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xfe, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x11, 0x39, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x40, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd9, 0x9b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x1, 0x9e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x30, - 0x0, - - /* U+F0C9 "" */ - 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x32, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x15, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x64, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x6c, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x2f, 0xff, 0xff, - 0xff, 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, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x32, 0x0, - - /* U+F0E0 "" */ - 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x10, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x2, 0xf9, 0x0, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x9f, - 0xff, 0xd2, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x2c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x10, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x40, 0x0, 0x4e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x2, - 0x9e, 0xe9, 0x20, 0x0, 0x4e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x4, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x75, 0x57, 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, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, - 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, - - /* U+F0E7 "" */ - 0x0, 0x0, 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xea, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x64, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x9b, 0xcc, 0xcc, 0xcc, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xb7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x1b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x87, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0xdb, 0x10, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0xe, 0xfd, 0x10, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, - 0xfd, 0x10, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0xe, 0xff, 0xfd, 0x10, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, 0xff, - 0xfd, 0x10, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0xe, 0xff, 0xff, 0xfd, 0x10, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, 0xff, 0xff, - 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0xe, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x44, 0x44, 0x44, 0x44, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x54, 0xef, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x40, 0x0, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x8a, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x29, 0xdf, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x21, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x67, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, - 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 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, 0xff, 0xff, 0xfe, - 0x88, 0x88, 0xaf, 0xff, 0x98, 0x88, 0x9f, 0xff, - 0xa8, 0x88, 0x8f, 0xff, 0xb8, 0x88, 0x8b, 0xff, - 0xf8, 0x88, 0x8a, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0xc, - 0xff, 0x0, 0x0, 0xb, 0xff, 0x10, 0x0, 0x1, - 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, - 0xc, 0xff, 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, - 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, - 0x0, 0xc, 0xff, 0x0, 0x0, 0xa, 0xff, 0x10, - 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0xa, 0xff, - 0x10, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x3f, - 0xfe, 0x10, 0x0, 0x1e, 0xff, 0x30, 0x0, 0xd, - 0xff, 0x40, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x3, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcc, 0xcc, 0xdf, 0xff, 0xdc, 0xcc, - 0xcf, 0xff, 0xec, 0xcc, 0xce, 0xff, 0xfc, 0xcc, - 0xce, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0xf, 0xfe, 0x0, - 0x0, 0xb, 0xff, 0x20, 0x0, 0x3, 0xff, 0xa0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xe, 0xfd, - 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, 0x2, 0xff, - 0x90, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xe, - 0xfd, 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, 0x2, - 0xff, 0x90, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0xe, 0xfd, 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, - 0x2, 0xff, 0x90, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0xf, 0xfe, 0x0, 0x0, 0xb, 0xff, 0x20, - 0x0, 0x3, 0xff, 0xa0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcc, 0xcc, 0xdf, 0xff, 0xdc, 0xcc, 0xcf, 0xff, - 0xec, 0xcc, 0xce, 0xff, 0xfc, 0xcc, 0xce, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x3f, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xd0, 0x0, 0x3, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfe, 0x88, 0x88, - 0xaf, 0xff, 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x8b, 0xff, 0xf8, 0x88, - 0x8a, 0xff, 0xff, 0xf8, 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, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x1e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, - 0x0, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x76, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x74, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F15B "" */ - 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x41, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0xf, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0xb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x25, 0x79, 0xbc, 0xcc, 0xcc, 0xb9, 0x75, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x84, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x71, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0xa8, 0x64, 0x32, 0x22, 0x34, 0x68, - 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xb1, 0xcf, 0xff, 0xff, - 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xc1, - 0x1, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x15, 0x8b, 0xde, 0xff, 0xfe, 0xdb, - 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xc1, 0x0, 0x1, 0xcf, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xc1, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc8, 0x41, 0x0, 0x0, 0x1, - 0x48, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xff, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x9f, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xcb, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0xc2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xfc, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x17, 0xcd, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, - 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, 0x88, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, - 0xf, 0xff, 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, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F241 "" */ - 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, - 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, - 0xf, 0xff, 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, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F242 "" */ - 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, - 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, - 0xf, 0xff, 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, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F243 "" */ - 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, - 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, - 0xf, 0xff, 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, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F244 "" */ - 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, - 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, - 0xf, 0xff, 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, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xef, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x24, 0x34, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xfd, 0xde, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfc, - 0x10, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x8c, 0xda, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9c, 0xca, - 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfb, - 0x20, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x9f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xd4, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x43, 0x49, 0xff, 0xf9, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x45, 0xff, 0xff, 0xff, 0xb1, 0x0, - 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, 0x70, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdf, 0xff, 0xfe, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xff, - 0xff, 0xff, 0xfb, 0x20, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xfd, 0x40, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xa1, 0x0, 0x0, 0x0, - 0x0, 0x3c, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x53, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xa0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfe, 0x20, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, - 0xde, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x26, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x34, 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x34, 0x43, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbe, - 0xff, 0xff, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x6, 0x60, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xe0, 0x5, 0xff, 0xff, - 0xff, 0xe2, 0x6f, 0xff, 0xff, 0x30, 0x6, 0xf6, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xf1, 0x8, 0xff, - 0xff, 0xfe, 0x20, 0x6, 0xff, 0xff, 0x30, 0x6, - 0xff, 0x60, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0xb, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x5f, 0xff, 0x30, - 0x6, 0xff, 0xf2, 0x0, 0x1f, 0xff, 0xff, 0xf6, - 0xd, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x5, 0xff, - 0x30, 0x5, 0xff, 0x40, 0x0, 0xcf, 0xff, 0xff, - 0xf9, 0xf, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x5f, 0x30, 0x5, 0xf4, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x5, 0x30, 0x5, 0x40, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xfb, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x4, 0x30, 0x5, 0x40, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x4f, 0x30, 0x5, 0xf3, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xfa, 0xd, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x5, 0xff, 0x30, 0x5, 0xff, - 0x30, 0x0, 0x9f, 0xff, 0xff, 0xf9, 0xb, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x5f, 0xff, 0x40, 0x6, - 0xff, 0xe1, 0x0, 0xc, 0xff, 0xff, 0xf7, 0x8, - 0xff, 0xff, 0xfe, 0x20, 0x5, 0xff, 0xff, 0x40, - 0x6, 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, 0xf5, - 0x5, 0xff, 0xff, 0xff, 0xe2, 0x5f, 0xff, 0xff, - 0x40, 0x6, 0xf6, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xf2, 0x1, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0x40, 0x6, 0x60, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x25, 0x89, 0xab, 0xba, 0x97, 0x51, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x60, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xe2, 0x2e, 0xff, 0xff, 0xf4, 0x1b, 0xff, 0xff, - 0xf8, 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, - 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, - 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, - 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, - 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, - 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, 0x6f, - 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, - 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, 0x6f, 0xff, - 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, - 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, - 0x0, 0xaf, 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, - 0x20, 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, 0xe0, - 0x6, 0xff, 0xff, 0xf2, 0x2, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, - 0xaf, 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, 0x20, - 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, 0xe0, 0x6, - 0xff, 0xff, 0xf2, 0x2, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, - 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xa0, 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, - 0xff, 0xf2, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, - 0xfe, 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xa0, 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, - 0xf2, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, - 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, - 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, - 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, - 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, - 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xfe, 0x22, 0xef, 0xff, 0xff, 0x41, 0xbf, - 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x61, 0x0, 0x0, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x47, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x20, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xee, - 0x20, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfe, 0x20, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xfe, 0x20, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x3, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x3, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x3, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x3, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xfe, 0xcb, 0x97, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, - 0x54, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xea, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xe3, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x33, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x3e, 0xe3, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xea, 0x20, 0x0, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x61, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x2e, 0xff, 0xfa, - 0x0, 0x1, 0xff, 0xa0, 0x0, 0x2f, 0xf9, 0x0, - 0x8, 0xff, 0xff, 0xf0, 0x0, 0x2e, 0xff, 0xff, - 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x2, 0xff, 0x90, - 0x0, 0x8f, 0xff, 0xff, 0x0, 0x2e, 0xff, 0xff, - 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x2f, 0xf9, - 0x0, 0x8, 0xff, 0xff, 0xf0, 0x2e, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x2, 0xff, - 0x90, 0x0, 0x8f, 0xff, 0xff, 0x3e, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x2f, - 0xf9, 0x0, 0x8, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x2, - 0xff, 0x90, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, - 0x2f, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, - 0x2, 0xff, 0x90, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, - 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6c, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf1, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0x10, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xe4, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xdf, - 0xff, 0xff, 0xf1, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x12, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x71, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 189, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 189, .box_w = 6, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 93, .adv_w = 275, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 18}, - {.bitmap_index = 178, .adv_w = 495, .box_w = 29, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 628, .adv_w = 437, .box_w = 25, .box_h = 42, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 1153, .adv_w = 593, .box_w = 35, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1696, .adv_w = 483, .box_w = 29, .box_h = 32, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2160, .adv_w = 148, .box_w = 5, .box_h = 13, .ofs_x = 2, .ofs_y = 18}, - {.bitmap_index = 2193, .adv_w = 237, .box_w = 10, .box_h = 42, .ofs_x = 4, .ofs_y = -9}, - {.bitmap_index = 2403, .adv_w = 238, .box_w = 10, .box_h = 42, .ofs_x = 1, .ofs_y = -9}, - {.bitmap_index = 2613, .adv_w = 282, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = 16}, - {.bitmap_index = 2758, .adv_w = 410, .box_w = 21, .box_h = 20, .ofs_x = 2, .ofs_y = 6}, - {.bitmap_index = 2968, .adv_w = 160, .box_w = 6, .box_h = 13, .ofs_x = 2, .ofs_y = -7}, - {.bitmap_index = 3007, .adv_w = 270, .box_w = 13, .box_h = 4, .ofs_x = 2, .ofs_y = 10}, - {.bitmap_index = 3033, .adv_w = 160, .box_w = 6, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3054, .adv_w = 248, .box_w = 20, .box_h = 43, .ofs_x = -2, .ofs_y = -4}, - {.bitmap_index = 3484, .adv_w = 470, .box_w = 26, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3887, .adv_w = 260, .box_w = 12, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4073, .adv_w = 404, .box_w = 24, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4445, .adv_w = 403, .box_w = 24, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4817, .adv_w = 471, .box_w = 28, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5251, .adv_w = 404, .box_w = 24, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5623, .adv_w = 434, .box_w = 24, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5995, .adv_w = 421, .box_w = 24, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6367, .adv_w = 453, .box_w = 26, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6770, .adv_w = 434, .box_w = 25, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7158, .adv_w = 160, .box_w = 6, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7230, .adv_w = 160, .box_w = 6, .box_h = 31, .ofs_x = 2, .ofs_y = -7}, - {.bitmap_index = 7323, .adv_w = 410, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 7544, .adv_w = 410, .box_w = 21, .box_h = 14, .ofs_x = 2, .ofs_y = 9}, - {.bitmap_index = 7691, .adv_w = 410, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 7912, .adv_w = 403, .box_w = 23, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8269, .adv_w = 728, .box_w = 42, .box_h = 40, .ofs_x = 2, .ofs_y = -9}, - {.bitmap_index = 9109, .adv_w = 515, .box_w = 34, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 9636, .adv_w = 533, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 10070, .adv_w = 509, .box_w = 29, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10520, .adv_w = 582, .box_w = 31, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 11001, .adv_w = 472, .box_w = 23, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 11358, .adv_w = 447, .box_w = 23, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 11715, .adv_w = 543, .box_w = 29, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12165, .adv_w = 572, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12599, .adv_w = 218, .box_w = 6, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12692, .adv_w = 361, .box_w = 20, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 13002, .adv_w = 506, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 13436, .adv_w = 418, .box_w = 22, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 13777, .adv_w = 672, .box_w = 34, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 14304, .adv_w = 572, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 14738, .adv_w = 591, .box_w = 33, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 15250, .adv_w = 508, .box_w = 26, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 15653, .adv_w = 591, .box_w = 35, .box_h = 38, .ofs_x = 2, .ofs_y = -7}, - {.bitmap_index = 16318, .adv_w = 512, .box_w = 27, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 16737, .adv_w = 437, .box_w = 25, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 17125, .adv_w = 413, .box_w = 26, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17528, .adv_w = 557, .box_w = 27, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 17947, .adv_w = 501, .box_w = 33, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 18459, .adv_w = 793, .box_w = 48, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 19203, .adv_w = 474, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 19668, .adv_w = 455, .box_w = 30, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 20133, .adv_w = 463, .box_w = 27, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 20552, .adv_w = 234, .box_w = 10, .box_h = 42, .ofs_x = 4, .ofs_y = -9}, - {.bitmap_index = 20762, .adv_w = 248, .box_w = 19, .box_h = 43, .ofs_x = -2, .ofs_y = -4}, - {.bitmap_index = 21171, .adv_w = 234, .box_w = 11, .box_h = 42, .ofs_x = 0, .ofs_y = -9}, - {.bitmap_index = 21402, .adv_w = 410, .box_w = 20, .box_h = 19, .ofs_x = 3, .ofs_y = 6}, - {.bitmap_index = 21592, .adv_w = 352, .box_w = 22, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 21625, .adv_w = 422, .box_w = 12, .box_h = 6, .ofs_x = 5, .ofs_y = 27}, - {.bitmap_index = 21661, .adv_w = 421, .box_w = 21, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 21913, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 22326, .adv_w = 402, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 22602, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 23015, .adv_w = 431, .box_w = 25, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 23315, .adv_w = 249, .box_w = 18, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23612, .adv_w = 486, .box_w = 26, .box_h = 33, .ofs_x = 1, .ofs_y = -9}, - {.bitmap_index = 24041, .adv_w = 479, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 24421, .adv_w = 196, .box_w = 6, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 24523, .adv_w = 200, .box_w = 15, .box_h = 43, .ofs_x = -5, .ofs_y = -9}, - {.bitmap_index = 24846, .adv_w = 434, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 25242, .adv_w = 196, .box_w = 5, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 25325, .adv_w = 744, .box_w = 39, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 25793, .adv_w = 479, .box_w = 23, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 26069, .adv_w = 447, .box_w = 26, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 26381, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = -9}, - {.bitmap_index = 26794, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 1, .ofs_y = -9}, - {.bitmap_index = 27207, .adv_w = 289, .box_w = 13, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 27363, .adv_w = 353, .box_w = 20, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 27603, .adv_w = 291, .box_w = 18, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 27864, .adv_w = 477, .box_w = 23, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 28140, .adv_w = 394, .box_w = 26, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 28452, .adv_w = 633, .box_w = 40, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 28932, .adv_w = 389, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 29220, .adv_w = 394, .box_w = 26, .box_h = 33, .ofs_x = -1, .ofs_y = -9}, - {.bitmap_index = 29649, .adv_w = 367, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 29901, .adv_w = 247, .box_w = 13, .box_h = 42, .ofs_x = 2, .ofs_y = -9}, - {.bitmap_index = 30174, .adv_w = 210, .box_w = 5, .box_h = 42, .ofs_x = 4, .ofs_y = -9}, - {.bitmap_index = 30279, .adv_w = 247, .box_w = 13, .box_h = 42, .ofs_x = 0, .ofs_y = -9}, - {.bitmap_index = 30552, .adv_w = 410, .box_w = 22, .box_h = 8, .ofs_x = 2, .ofs_y = 12}, - {.bitmap_index = 30640, .adv_w = 295, .box_w = 16, .box_h = 15, .ofs_x = 1, .ofs_y = 17}, - {.bitmap_index = 30760, .adv_w = 221, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 8}, - {.bitmap_index = 30801, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 31791, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 32517, .adv_w = 704, .box_w = 44, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 33375, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 34101, .adv_w = 484, .box_w = 31, .box_h = 31, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 34582, .adv_w = 704, .box_w = 44, .box_h = 44, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 35550, .adv_w = 704, .box_w = 42, .box_h = 45, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 36495, .adv_w = 792, .box_w = 50, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 37470, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 38460, .adv_w = 792, .box_w = 50, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 39285, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 40275, .adv_w = 352, .box_w = 22, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 40660, .adv_w = 528, .box_w = 33, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 41238, .adv_w = 792, .box_w = 50, .box_h = 43, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 42313, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 43039, .adv_w = 484, .box_w = 31, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 43737, .adv_w = 616, .box_w = 29, .box_h = 41, .ofs_x = 5, .ofs_y = -4}, - {.bitmap_index = 44332, .adv_w = 616, .box_w = 39, .box_h = 47, .ofs_x = 0, .ofs_y = -7}, - {.bitmap_index = 45249, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 46010, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 46771, .adv_w = 616, .box_w = 28, .box_h = 41, .ofs_x = 5, .ofs_y = -4}, - {.bitmap_index = 47345, .adv_w = 616, .box_w = 41, .box_h = 39, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 48145, .adv_w = 440, .box_w = 24, .box_h = 39, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 48613, .adv_w = 440, .box_w = 24, .box_h = 39, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 49081, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 49842, .adv_w = 616, .box_w = 39, .box_h = 9, .ofs_x = 0, .ofs_y = 12}, - {.bitmap_index = 50018, .adv_w = 792, .box_w = 50, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 50843, .adv_w = 880, .box_w = 56, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 52103, .adv_w = 792, .box_w = 52, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 53273, .adv_w = 704, .box_w = 44, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 54131, .adv_w = 616, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 54568, .adv_w = 616, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 55005, .adv_w = 880, .box_w = 55, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 55968, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 56694, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 57684, .adv_w = 704, .box_w = 45, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 58697, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 59458, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 60336, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 61097, .adv_w = 616, .box_w = 39, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 61780, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 62506, .adv_w = 440, .box_w = 29, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 63159, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 64037, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 64915, .adv_w = 792, .box_w = 50, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 65740, .adv_w = 704, .box_w = 46, .box_h = 46, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 66798, .adv_w = 528, .box_w = 33, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 67541, .adv_w = 880, .box_w = 55, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 68669, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 69467, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 70265, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 71063, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 71861, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 72659, .adv_w = 880, .box_w = 56, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 73639, .adv_w = 616, .box_w = 34, .box_h = 45, .ofs_x = 2, .ofs_y = -6}, - {.bitmap_index = 74404, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 75282, .adv_w = 704, .box_w = 45, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 76295, .adv_w = 880, .box_w = 55, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 77203, .adv_w = 528, .box_w = 33, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 77946, .adv_w = 708, .box_w = 45, .box_h = 29, .ofs_x = 0, .ofs_y = 2} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 7, 0, 0, 0, - 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 32, 0, 19, -15, 0, 0, - 0, 0, -39, -42, 5, 33, 15, 12, - -28, 5, 34, 2, 30, 7, 23, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 42, 6, -5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 14, 0, -21, 0, 0, 0, 0, - 0, -14, 12, 14, 0, 0, -7, 0, - -5, 7, 0, -7, 0, -7, -4, -14, - 0, 0, 0, 0, -7, 0, 0, -9, - -11, 0, 0, -7, 0, -14, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -7, - -7, 0, -11, 0, -19, 0, -85, 0, - 0, -14, 0, 14, 21, 1, 0, -14, - 7, 7, 23, 14, -12, 14, 0, 0, - -40, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -19, -8, -34, 0, -28, - -5, 0, 0, 0, 0, 1, 27, 0, - -21, -6, -2, 2, 0, -12, 0, 0, - -5, -52, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -56, -6, 27, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -29, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 23, - 0, 7, 0, 0, -14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 27, 6, - 2, 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, - -26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 5, - 14, 7, 21, -7, 0, 0, 14, -7, - -23, -96, 5, 19, 14, 1, -9, 0, - 25, 0, 23, 0, 23, 0, -65, 0, - -8, 21, 0, 23, -7, 14, 7, 0, - 0, 2, -7, 0, 0, -12, 56, 0, - 56, 0, 21, 0, 30, 9, 12, 21, - 0, 0, 0, -26, 0, 0, 0, 0, - 2, -5, 0, 5, -13, -9, -14, 5, - 0, -7, 0, 0, 0, -28, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -46, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, -39, 0, -44, 0, 0, 0, - 0, -5, 0, 70, -8, -9, 7, 7, - -6, 0, -9, 7, 0, 0, -37, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -68, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -44, 0, 42, 0, 0, -26, 0, - 23, 0, -48, -68, -48, -14, 21, 0, - 0, -47, 0, 8, -16, 0, -11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 18, 21, -86, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 33, 0, 5, 0, 0, 0, - 0, 0, 5, 5, -8, -14, 0, -2, - -2, -7, 0, 0, -5, 0, 0, 0, - -14, 0, -6, 0, -16, -14, 0, -18, - -23, -23, -13, 0, -14, 0, -14, 0, - 0, 0, 0, -6, 0, 0, 7, 0, - 5, -7, 0, 2, 0, 0, 0, 7, - -5, 0, 0, 0, -5, 7, 7, -2, - 0, 0, 0, -13, 0, -2, 0, 0, - 0, 0, 0, 2, 0, 9, -5, 0, - -8, 0, -12, 0, 0, -5, 0, 21, - 0, 0, -7, 0, 0, 0, 0, 0, - -2, 2, -5, -5, 0, 0, -7, 0, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -4, -4, 0, -7, -8, 0, - 0, 0, 0, 0, 2, 0, 0, -5, - 0, -7, -7, -7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -4, 0, 0, - 0, 0, -5, -9, 0, -11, 0, -21, - -5, -21, 14, 0, 0, -14, 7, 14, - 19, 0, -18, -2, -8, 0, -2, -33, - 7, -5, 5, -37, 7, 0, 0, 2, - -37, 0, -37, -6, -61, -5, 0, -35, - 0, 14, 20, 0, 9, 0, 0, 0, - 0, 1, 0, -13, -9, 0, -21, 0, - 0, 0, -7, 0, 0, 0, -7, 0, - 0, 0, 0, 0, -4, -4, 0, -4, - -9, 0, 0, 0, 0, 0, 0, 0, - -7, -7, 0, -5, -8, -6, 0, 0, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, -6, 0, -8, - 0, -5, 0, -14, 7, 0, 0, -8, - 4, 7, 7, 0, 0, 0, 0, 0, - 0, -5, 0, 0, 0, 0, 0, 5, - 0, 0, -7, 0, -7, -5, -8, 0, - 0, 0, 0, 0, 0, 0, 6, 0, - -6, 0, 0, 0, 0, -8, -11, 0, - -13, 0, 21, -5, 2, -23, 0, 0, - 19, -35, -37, -30, -14, 7, 0, -6, - -46, -13, 0, -13, 0, -14, 11, -13, - -45, 0, -19, 0, 0, 4, -2, 6, - -5, 0, 7, 1, -21, -27, 0, -35, - -17, -15, -17, -21, -8, -19, -1, -13, - -19, 4, 0, 2, 0, -7, 0, 0, - 0, 5, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -7, - 0, -4, 0, -2, -7, 0, -12, -15, - -15, -2, 0, -21, 0, 0, 0, 0, - 0, 0, -6, 0, 0, 0, 0, 3, - -4, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 34, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -13, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, 0, 0, - -13, 0, 0, 0, 0, -35, -21, 0, - 0, 0, -11, -35, 0, 0, -7, 7, - 0, -19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -11, 0, 0, -13, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, -13, 0, - 0, 0, 0, 8, 0, 5, -14, -14, - 0, -7, -7, -8, 0, 0, 0, 0, - 0, 0, -21, 0, -7, 0, -11, -7, - 0, -15, -18, -21, -6, 0, -14, 0, - -21, 0, 0, 0, 0, 56, 0, 0, - 4, 0, 0, -9, 0, 7, 0, -30, - 0, 0, 0, 0, 0, -65, -13, 23, - 21, -6, -30, 0, 7, -11, 0, -35, - -4, -9, 7, -49, -7, 9, 0, 11, - -25, -11, -26, -23, -30, 0, 0, -42, - 0, 40, 0, 0, -4, 0, 0, 0, - -4, -4, -7, -19, -23, -1, -65, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -7, 0, -4, -7, -11, 0, 0, - -14, 0, -7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, 0, -14, 0, 0, 14, - -2, 9, 0, -15, 7, -5, -2, -18, - -7, 0, -9, -7, -5, 0, -11, -12, - 0, 0, -6, -2, -5, -12, -8, 0, - 0, -7, 0, 7, -5, 0, -15, 0, - 0, 0, -14, 0, -12, 0, -12, -12, - 7, 0, 0, 0, 0, 0, 0, 0, - 0, -14, 7, 0, -10, 0, -5, -8, - -22, -5, -5, -5, -2, -5, -8, -2, - 0, 0, 0, 0, 0, -7, -6, -6, - 0, 0, 0, 0, 8, -5, 0, -5, - 0, 0, 0, -5, -8, -5, -6, -8, - -6, 0, 6, 28, -2, 0, -19, 0, - -5, 14, 0, -7, -30, -9, 11, 1, - 0, -33, -12, 7, -12, 5, 0, -5, - -6, -23, 0, -11, 4, 0, 0, -12, - 0, 0, 0, 7, 7, -14, -13, 0, - -12, -7, -11, -7, -7, 0, -12, 4, - -13, -12, 21, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -12, 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, - -5, 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, -6, -7, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -11, 0, 0, -9, - 0, 0, -7, -7, 0, 0, 0, 0, - -7, 0, 0, 0, 0, -4, 0, 0, - 0, 0, 0, -5, 0, 0, 0, 0, - -11, 0, -14, 0, 0, 0, -23, 0, - 5, -15, 14, 1, -5, -33, 0, 0, - -15, -7, 0, -28, -18, -20, 0, 0, - -30, -7, -28, -27, -34, 0, -18, 0, - 6, 47, -9, 0, -16, -7, -2, -7, - -12, -19, -13, -26, -29, -16, -7, 0, - 0, -5, 0, 2, 0, 0, -49, -6, - 21, 15, -15, -26, 0, 2, -22, 0, - -35, -5, -7, 14, -65, -9, 2, 0, - 0, -46, -8, -37, -7, -51, 0, 0, - -49, 0, 42, 2, 0, -5, 0, 0, - 0, 0, -4, -5, -27, -5, 0, -46, - 0, 0, 0, 0, -23, 0, -6, 0, - -2, -20, -33, 0, 0, -4, -11, -21, - -7, 0, -5, 0, 0, 0, 0, -32, - -7, -23, -23, -6, -12, -18, -7, -12, - 0, -14, -6, -23, -11, 0, -8, -13, - -7, -13, 0, 4, 0, -5, -23, 0, - 14, 0, -13, 0, 0, 0, 0, 8, - 0, 5, -14, 29, 0, -7, -7, -8, - 0, 0, 0, 0, 0, 0, -21, 0, - -7, 0, -11, -7, 0, -15, -18, -21, - -6, 0, -14, 6, 28, 0, 0, 0, - 0, 56, 0, 0, 4, 0, 0, -9, - 0, 7, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -5, -14, 0, 0, 0, 0, 0, -4, - 0, 0, 0, -7, -7, 0, 0, -14, - -7, 0, 0, -14, 0, 12, -4, 0, - 0, 0, 0, 0, 0, 4, 0, 0, - 0, 0, 11, 14, 6, -6, 0, -23, - -11, 0, 21, -23, -23, -14, -14, 28, - 13, 7, -61, -5, 14, -7, 0, -7, - 8, -7, -25, 0, -7, 7, -9, -6, - -21, -6, 0, 0, 21, 14, 0, -20, - 0, -39, -9, 20, -9, -27, 2, -9, - -23, -23, -7, 28, 7, 0, -11, 0, - -19, 0, 6, 23, -16, -26, -28, -18, - 21, 0, 2, -51, -6, 7, -12, -5, - -16, 0, -15, -26, -11, -11, -6, 0, - 0, -16, -15, -7, 0, 21, 16, -7, - -39, 0, -39, -10, 0, -25, -41, -2, - -23, -12, -23, -20, 19, 0, 0, -9, - 0, -14, -6, 0, -7, -13, 0, 12, - -23, 7, 0, 0, -37, 0, -7, -15, - -12, -5, -21, -18, -23, -16, 0, -21, - -7, -16, -13, -21, -7, 0, 0, 2, - 33, -12, 0, -21, -7, 0, -7, -14, - -16, -19, -20, -27, -9, -14, 14, 0, - -11, 0, -35, -8, 4, 14, -23, -26, - -14, -23, 23, -7, 4, -65, -13, 14, - -15, -12, -26, 0, -21, -30, -8, -7, - -6, -7, -15, -21, -2, 0, 0, 21, - 20, -5, -46, 0, -42, -16, 17, -27, - -48, -14, -25, -30, -35, -23, 14, 0, - 0, 0, 0, -8, 0, 0, 7, -8, - 14, 5, -13, 14, 0, 0, -22, -2, - 0, -2, 0, 2, 2, -6, 0, 0, - 0, 0, 0, 0, -7, 0, 0, 0, - 0, 6, 21, 1, 0, -8, 0, 0, - 0, 0, -5, -5, -8, 0, 0, 0, - 2, 6, 0, 0, 0, 0, 6, 0, - -6, 0, 27, 0, 13, 2, 2, -9, - 0, 14, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 21, 0, 20, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -42, 0, -7, 12, 0, 21, - 0, 0, 70, 8, -14, -14, 7, 7, - -5, 2, -35, 0, 0, 34, -42, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -48, 27, 99, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -42, 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, -11, 0, 0, -13, - -6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, -19, 0, - 0, 2, 0, 0, 7, 91, -14, -6, - 23, 19, -19, 7, 0, 0, 7, 7, - -9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -92, 20, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -20, - 0, 0, 0, -19, 0, 0, 0, 0, - -15, -4, 0, 0, 0, -15, 0, -8, - 0, -33, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -47, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, -7, 0, 0, -13, 0, -11, 0, - -19, 0, 0, 0, -12, 7, -8, 0, - 0, -19, -7, -16, 0, 0, -19, 0, - -7, 0, -33, 0, -8, 0, 0, -57, - -13, -28, -8, -25, 0, 0, -47, 0, - -19, -4, 0, 0, 0, 0, 0, 0, - 0, 0, -11, -13, -6, -12, 0, 0, - 0, 0, -15, 0, -15, 9, -8, 14, - 0, -5, -16, -5, -12, -13, 0, -8, - -4, -5, 5, -19, -2, 0, 0, 0, - -62, -6, -10, 0, -15, 0, -5, -33, - -6, 0, 0, -5, -6, 0, 0, 0, - 0, 5, 0, -5, -12, -5, 12, 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, 9, 0, 0, 0, 0, 0, - 0, -15, 0, -5, 0, 0, 0, -14, - 7, 0, 0, 0, -19, -7, -14, 0, - 0, -20, 0, -7, 0, -33, 0, 0, - 0, 0, -68, 0, -14, -26, -35, 0, - 0, -47, 0, -5, -11, 0, 0, 0, - 0, 0, 0, 0, 0, -7, -11, -4, - -11, 2, 0, 0, 12, -9, 0, 22, - 34, -7, -7, -21, 8, 34, 12, 15, - -19, 8, 30, 8, 20, 15, 19, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 44, 33, -13, -7, 0, -6, - 56, 30, 56, 0, 0, 0, 7, 0, - 0, 26, 0, 0, -11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -5, 0, - 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, -59, -8, -6, -29, - -34, 0, 0, -47, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -5, - 0, 0, 0, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 0, -59, -8, -6, - -29, -34, 0, 0, -28, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -6, 0, 0, 0, -16, 7, 0, -7, - 6, 13, 7, -21, 0, -1, -6, 7, - 0, 6, 0, 0, 0, 0, -18, 0, - -6, -5, -14, 0, -6, -28, 0, 44, - -7, 0, -15, -5, 0, -5, -12, 0, - -7, -20, -14, -8, 0, 0, 0, -11, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -5, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 0, 0, -59, - -8, -6, -29, -34, 0, 0, -47, 0, - 0, 0, 0, 0, 0, 35, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -11, 0, -23, -8, -6, 21, -6, -7, - -28, 2, -4, 2, -5, -19, 1, 15, - 1, 6, 2, 6, -17, -28, -8, 0, - -27, -13, -19, -30, -27, 0, -11, -14, - -8, -9, -6, -5, -8, -5, 0, -5, - -2, 11, 0, 11, -5, 0, 22, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -5, -7, -7, 0, 0, - -19, 0, -4, 0, -12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -42, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, -7, 0, -9, - 0, 0, 0, 0, -6, 0, 0, -12, - -7, 7, 0, -12, -13, -5, 0, -20, - -5, -15, -5, -8, 0, -12, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -47, 0, 23, 0, 0, -13, 0, - 0, 0, 0, -9, 0, -7, 0, 0, - -4, 0, 0, -5, 0, -16, 0, 0, - 30, -9, -23, -22, 5, 8, 8, -1, - -20, 5, 11, 5, 21, 5, 23, -5, - -19, 0, 0, -28, 0, 0, -21, -19, - 0, 0, -14, 0, -9, -12, 0, -11, - 0, -11, 0, -5, 11, 0, -6, -21, - -7, 26, 0, 0, -6, 0, -14, 0, - 0, 9, -16, 0, 7, -7, 6, 1, - 0, -23, 0, -5, -2, 0, -7, 8, - -6, 0, 0, 0, -29, -8, -15, 0, - -21, 0, 0, -33, 0, 26, -7, 0, - -13, 0, 4, 0, -7, 0, -7, -21, - 0, -7, 7, 0, 0, 0, 0, -5, - 0, 0, 7, -9, 2, 0, 0, -8, - -5, 0, -8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -44, 0, 15, 0, - 0, -6, 0, 0, 0, 0, 1, 0, - -7, -7, 0, 0, 0, 14, 0, 16, - 0, 0, 0, 0, 0, -44, -40, 2, - 30, 21, 12, -28, 5, 30, 0, 26, - 0, 14, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 37, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_44 = { -#else -lv_font_t lv_font_montserrat_44 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 49, /*The maximum line height required by the font*/ - .base_line = 9, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -3, - .underline_thickness = 2, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_44*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_46.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_46.c deleted file mode 100644 index 48fa687..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_46.c +++ /dev/null @@ -1,11868 +0,0 @@ -/******************************************************************************* - * Size: 46 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 46 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_46.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_46 - #define LV_FONT_MONTSERRAT_46 1 -#endif - -#if LV_FONT_MONTSERRAT_46 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x6f, 0xff, 0xfc, 0x5, 0xff, 0xff, 0xb0, 0x5f, - 0xff, 0xfa, 0x4, 0xff, 0xff, 0xa0, 0x3f, 0xff, - 0xf9, 0x3, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xf8, - 0x2, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xf7, 0x0, - 0xff, 0xff, 0x60, 0xf, 0xff, 0xf5, 0x0, 0xff, - 0xff, 0x50, 0xf, 0xff, 0xf4, 0x0, 0xef, 0xff, - 0x40, 0xd, 0xff, 0xf3, 0x0, 0xdf, 0xff, 0x20, - 0xc, 0xff, 0xf2, 0x0, 0xcf, 0xff, 0x10, 0xb, - 0xff, 0xf0, 0x0, 0xbf, 0xff, 0x0, 0xa, 0xff, - 0xf0, 0x0, 0x9f, 0xff, 0x0, 0x3, 0x66, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, - 0xea, 0x10, 0x5f, 0xff, 0xfb, 0xb, 0xff, 0xff, - 0xf1, 0xbf, 0xff, 0xff, 0x16, 0xff, 0xff, 0xb0, - 0x7, 0xde, 0xa1, 0x0, - - /* U+0022 "\"" */ - 0x1f, 0xff, 0xc0, 0x0, 0xc, 0xff, 0xf1, 0x1f, - 0xff, 0xb0, 0x0, 0xc, 0xff, 0xf0, 0xf, 0xff, - 0xb0, 0x0, 0xb, 0xff, 0xf0, 0xf, 0xff, 0xa0, - 0x0, 0xb, 0xff, 0xf0, 0xf, 0xff, 0xa0, 0x0, - 0xa, 0xff, 0xf0, 0xf, 0xff, 0x90, 0x0, 0xa, - 0xff, 0xf0, 0xf, 0xff, 0x90, 0x0, 0xa, 0xff, - 0xe0, 0xf, 0xff, 0x90, 0x0, 0x9, 0xff, 0xe0, - 0xe, 0xff, 0x80, 0x0, 0x9, 0xff, 0xd0, 0xe, - 0xff, 0x80, 0x0, 0x9, 0xff, 0xd0, 0xe, 0xff, - 0x70, 0x0, 0x8, 0xff, 0xd0, 0xd, 0xff, 0x70, - 0x0, 0x8, 0xff, 0xc0, 0x8, 0xaa, 0x40, 0x0, - 0x5, 0xaa, 0x70, - - /* U+0023 "#" */ - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, - 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x16, 0x66, 0x66, 0x6e, 0xff, - 0xa6, 0x66, 0x66, 0x66, 0x6f, 0xff, 0x96, 0x66, - 0x66, 0x60, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0x90, 0x0, 0x0, 0x0, - 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x40, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x56, 0x66, 0x66, 0xaf, - 0xfe, 0x66, 0x66, 0x66, 0x66, 0xbf, 0xfd, 0x66, - 0x66, 0x66, 0x40, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, - 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x59, 0xce, 0xff, 0xff, 0xec, 0x95, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0xe, 0xff, 0xff, 0xf9, 0x41, - 0xff, 0xf1, 0x25, 0x8d, 0xff, 0xfa, 0x0, 0x0, - 0x7f, 0xff, 0xfc, 0x20, 0x0, 0xff, 0xf0, 0x0, - 0x0, 0x4c, 0xf3, 0x0, 0x0, 0xef, 0xff, 0xe1, - 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x40, - 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x30, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, - 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x60, 0x0, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xfe, 0x83, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf4, 0x9f, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf0, 0x0, 0x6e, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, - 0x1, 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x3f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, - 0xd, 0xff, 0xfa, 0x0, 0x40, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf0, 0x0, 0x0, 0x1f, 0xff, 0xf8, - 0x0, 0xed, 0x20, 0x0, 0x0, 0x0, 0xff, 0xf0, - 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x6, 0xff, 0xf9, - 0x20, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x7, 0xff, - 0xff, 0xd0, 0xd, 0xff, 0xff, 0xfb, 0x63, 0x10, - 0xff, 0xf0, 0x26, 0xcf, 0xff, 0xff, 0x40, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x26, 0xad, 0xef, 0xff, 0xff, 0xeb, 0x72, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x78, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0025 "%" */ - 0x0, 0x0, 0x17, 0xce, 0xfd, 0x93, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xfb, 0xbd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xa1, 0x0, 0x5, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, 0x6, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0x90, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xfa, 0x0, 0x0, 0x1, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, - 0x0, 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xf8, 0x0, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x50, 0x0, 0x1f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x60, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, 0xb, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xfe, 0x20, 0x0, 0x0, 0xaf, 0xfa, - 0x0, 0x6, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x51, 0x3, - 0xbf, 0xff, 0x20, 0x1, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xbf, 0xfc, - 0x0, 0x0, 0x5a, 0xef, 0xeb, 0x60, 0x0, 0x0, - 0x0, 0x1, 0xaf, 0xff, 0xff, 0xfd, 0x40, 0x0, - 0x6f, 0xff, 0x20, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x27, 0x9a, 0x84, - 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0xcf, 0xff, - 0xdb, 0xcf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, - 0x8f, 0xfe, 0x30, 0x0, 0x2d, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf2, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x2f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xf7, 0x0, 0x6, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x0, 0x0, 0x9f, - 0xf5, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, - 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0x70, 0x0, 0x0, 0xdf, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, - 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0xcf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xe3, 0x0, 0x2, - 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfd, 0xbc, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xfe, 0xb6, - 0x0, 0x0, 0x0, - - /* U+0026 "&" */ - 0x0, 0x0, 0x0, 0x0, 0x39, 0xce, 0xff, 0xda, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xfa, 0x64, 0x58, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, - 0x4e, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x9f, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xf7, 0xef, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0x95, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x37, 0x20, 0x0, 0x0, 0x5f, 0xff, - 0xfd, 0x30, 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x8, 0xff, 0xd2, 0x0, 0x3f, 0xff, 0xfb, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xcf, - 0xff, 0x10, 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xf3, 0x0, 0x1f, 0xff, 0xd0, - 0x5, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xf3, 0x7, 0xff, 0xf8, 0x0, 0xaf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xf3, 0xef, 0xff, 0x20, 0xd, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x5, - 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xc, 0xff, - 0xff, 0xf8, 0x20, 0x0, 0x0, 0x15, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x1e, 0xff, 0xff, - 0xff, 0xec, 0xcc, 0xef, 0xff, 0xff, 0xff, 0x53, - 0xff, 0xff, 0xf3, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x4, 0xff, - 0xff, 0x80, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd6, 0x0, 0x0, 0x4, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x48, 0xce, 0xff, 0xfd, 0xb7, - 0x30, 0x0, 0x0, 0x0, 0x4, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0x1f, 0xff, 0xc1, 0xff, 0xfb, 0xf, 0xff, 0xb0, - 0xff, 0xfa, 0xf, 0xff, 0xa0, 0xff, 0xf9, 0xf, - 0xff, 0x90, 0xff, 0xf9, 0xe, 0xff, 0x80, 0xef, - 0xf8, 0xe, 0xff, 0x70, 0xdf, 0xf7, 0x8, 0xaa, - 0x40, - - /* U+0028 "(" */ - 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x1, - 0xef, 0xff, 0x40, 0x0, 0x0, 0x8f, 0xff, 0xb0, - 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x6, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, - 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x8, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, - 0x0, 0x0, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x5, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, - 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x50, 0x0, 0x0, 0x1f, 0xff, 0xf3, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x6, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, - 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xb0, 0x0, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x9, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, 0x0, - 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xe0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x30, 0x0, 0x0, 0xe, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, 0x0, 0x0, - 0x8, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xe0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x30, 0x0, - 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, - 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x40, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xc0, - - /* U+0029 ")" */ - 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0x80, 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, - 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x50, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x10, 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, 0xa, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, - 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, - 0xf2, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xe0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, 0xd, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x6, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xa0, - 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x9f, 0xff, 0xb0, - 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x5, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, - 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0xc, - 0xff, 0xf8, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x0, - 0x0, 0x0, - - /* U+002A "*" */ - 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x2, 0xff, - 0x80, 0x0, 0x1a, 0x50, 0x8, 0xff, 0xb2, 0x2, - 0xff, 0x80, 0x7, 0xff, 0xe0, 0xd, 0xff, 0xff, - 0x72, 0xff, 0x84, 0xdf, 0xff, 0xf4, 0x0, 0x8f, - 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfb, 0x30, 0x0, - 0x1, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe5, 0x0, 0x8, 0xff, 0xff, 0xd6, 0xff, - 0xaa, 0xff, 0xff, 0xc2, 0xb, 0xff, 0xf7, 0x2, - 0xff, 0x80, 0x3d, 0xff, 0xf2, 0x3, 0xfa, 0x10, - 0x2, 0xff, 0x80, 0x0, 0x7f, 0x90, 0x0, 0x20, - 0x0, 0x2, 0xff, 0x80, 0x0, 0x1, 0x10, 0x0, - 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x66, 0x30, 0x0, - 0x0, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x0, 0x47, 0x77, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xbe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xab, 0xbb, - 0xbb, 0xbb, 0xdf, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, - 0x70, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, - - /* U+002C "," */ - 0x0, 0x0, 0x0, 0x0, 0x6e, 0xfb, 0x10, 0x5f, - 0xff, 0xfc, 0xb, 0xff, 0xff, 0xf2, 0xbf, 0xff, - 0xff, 0x37, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xfd, - 0x0, 0xf, 0xff, 0x70, 0x3, 0xff, 0xf2, 0x0, - 0x7f, 0xfd, 0x0, 0xb, 0xff, 0x80, 0x0, 0xff, - 0xf2, 0x0, 0x3f, 0xfd, 0x0, 0x7, 0xff, 0x80, - 0x0, - - /* U+002D "-" */ - 0x5e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, - - /* U+002E "." */ - 0x0, 0x45, 0x10, 0x1, 0xcf, 0xff, 0x50, 0x9f, - 0xff, 0xff, 0xd, 0xff, 0xff, 0xf3, 0xcf, 0xff, - 0xff, 0x25, 0xff, 0xff, 0xc0, 0x6, 0xdf, 0xa1, - 0x0, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xec, - 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xb6, 0x42, 0x47, 0xdf, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfd, - 0x30, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x0, 0x1f, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xfa, 0x0, 0x6, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xf1, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x1f, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xfb, 0x4, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x29, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xbf, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x6c, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, - 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x7c, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf6, 0xbf, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x69, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x7f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x24, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0xcf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xf1, 0x0, 0x1f, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, - 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0x20, 0x0, 0x0, 0xdf, 0xff, - 0xfd, 0x30, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb6, - 0x32, 0x47, 0xdf, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xed, - 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0031 "1" */ - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x1, 0x11, 0x11, 0x16, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, - - /* U+0032 "2" */ - 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, 0xdb, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xa6, 0x43, - 0x24, 0x6b, 0xff, 0xff, 0xff, 0x30, 0x0, 0xbf, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xc1, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, - - /* U+0033 "3" */ - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfa, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x56, 0x66, 0x7a, 0xdf, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3c, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x10, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xe0, 0x5, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf9, 0x0, 0xdf, 0xff, 0x92, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x9f, 0xff, 0xff, 0x20, 0x7f, 0xff, - 0xff, 0xfd, 0x96, 0x43, 0x23, 0x6a, 0xff, 0xff, - 0xff, 0x80, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x48, 0xbd, 0xff, 0xff, 0xdb, - 0x72, 0x0, 0x0, 0x0, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x3, 0x33, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, - - /* U+0035 "5" */ - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xa1, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, - 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xfd, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xb8, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x25, 0x8d, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xa0, 0x3, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x0, 0xcf, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0x20, 0x5f, 0xff, 0xd6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xb0, 0xe, 0xff, - 0xff, 0xff, 0xb7, 0x53, 0x23, 0x47, 0xdf, 0xff, - 0xff, 0xf2, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, 0xec, - 0x95, 0x0, 0x0, 0x0, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xbe, 0xff, - 0xfe, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x81, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xfa, 0x62, 0x10, 0x12, 0x48, 0xef, 0x20, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x3, 0x8c, 0xef, - 0xfe, 0xc9, 0x40, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xe0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x0, 0x0, 0xbf, 0xff, 0xd0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0xcf, 0xff, 0xd8, 0xff, 0xff, 0xff, 0xdc, 0xdf, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xfa, 0x40, 0x0, 0x0, 0x4b, 0xff, 0xff, - 0xf9, 0x0, 0xbf, 0xff, 0xff, 0xfe, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x20, 0xaf, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x90, 0x9f, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xd0, 0x6f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x2f, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf1, 0xf, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf1, - 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x3, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x70, 0x0, - 0x2f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xfe, 0x10, 0x0, 0x7, 0xff, 0xff, - 0xfa, 0x40, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xec, - 0xdf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xfe, - 0xb7, 0x20, 0x0, 0x0, 0x0, - - /* U+0037 "7" */ - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xaf, 0xff, 0xd1, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x1b, 0xff, 0xff, 0x1a, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0xa, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfc, 0x0, 0xaf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, - 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x0, 0x0, 0x3, 0x8b, 0xdf, 0xff, 0xec, - 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, - 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0xef, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xa4, 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, 0xf4, - 0x0, 0x2, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xfc, 0x0, 0x8, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0x20, 0xb, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, - 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x60, 0xc, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x60, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x5, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf7, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xd7, 0x31, 0x0, - 0x14, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xfe, 0xb9, 0x99, 0xad, 0xff, 0xff, 0xff, - 0xd2, 0x0, 0x5, 0xff, 0xff, 0xfa, 0x30, 0x0, - 0x0, 0x0, 0x16, 0xef, 0xff, 0xfd, 0x10, 0x1e, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0x90, 0x7f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xf1, 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0xef, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf8, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, - 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf8, 0xbf, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xf5, 0x7f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf1, 0x1f, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xa0, 0x6, 0xff, 0xff, 0xfe, - 0x72, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0xcd, - 0xef, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xff, 0xed, - 0xa7, 0x30, 0x0, 0x0, 0x0, - - /* U+0039 "9" */ - 0x0, 0x0, 0x0, 0x6, 0xad, 0xff, 0xfe, 0xc8, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xec, 0xde, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfd, - 0x61, 0x0, 0x0, 0x27, 0xef, 0xff, 0xfd, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf9, 0x0, - 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x50, 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x80, 0x9f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xc0, 0x6f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xe0, 0x2f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf0, 0xb, 0xff, - 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, - 0xff, 0xff, 0xf1, 0x2, 0xff, 0xff, 0xff, 0xa4, - 0x10, 0x2, 0x5a, 0xff, 0xff, 0xef, 0xff, 0xf2, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x4, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x7f, - 0xff, 0xf1, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xc4, 0x0, 0x8f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x4, 0x8a, 0xcc, 0xb9, 0x72, 0x0, - 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x63, - 0x10, 0x12, 0x48, 0xdf, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, 0xda, 0x61, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+003A ":" */ - 0x6, 0xdf, 0xa1, 0x5, 0xff, 0xff, 0xc0, 0xcf, - 0xff, 0xff, 0x2d, 0xff, 0xff, 0xf3, 0x9f, 0xff, - 0xfe, 0x1, 0xcf, 0xff, 0x50, 0x0, 0x45, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x45, 0x10, 0x1, 0xcf, 0xff, 0x50, 0x9f, 0xff, - 0xff, 0xd, 0xff, 0xff, 0xf3, 0xcf, 0xff, 0xff, - 0x25, 0xff, 0xff, 0xc0, 0x6, 0xdf, 0xa1, 0x0, - - /* U+003B ";" */ - 0x6, 0xdf, 0xa1, 0x5, 0xff, 0xff, 0xc0, 0xcf, - 0xff, 0xff, 0x2d, 0xff, 0xff, 0xf3, 0x9f, 0xff, - 0xfe, 0x1, 0xcf, 0xff, 0x50, 0x0, 0x45, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6e, 0xfb, 0x10, 0x5f, 0xff, - 0xfc, 0xb, 0xff, 0xff, 0xf2, 0xbf, 0xff, 0xff, - 0x37, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xfd, 0x0, - 0xf, 0xff, 0x70, 0x3, 0xff, 0xf2, 0x0, 0x7f, - 0xfd, 0x0, 0xb, 0xff, 0x80, 0x0, 0xff, 0xf2, - 0x0, 0x3f, 0xfd, 0x0, 0x7, 0xff, 0x80, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5c, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, - 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, - 0x5b, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, - 0x0, 0x28, 0xef, 0xff, 0xff, 0xff, 0xa4, 0x0, - 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0xd7, - 0x10, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, 0xff, - 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe8, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3a, 0xff, 0xff, 0xff, 0xfe, 0x82, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, - 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, - 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3a, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xaf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x17, 0x80, - - /* U+003D "=" */ - 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - - /* U+003E ">" */ - 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xfa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xd7, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6c, 0xff, 0xff, 0xff, 0xfd, 0x71, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, - 0xff, 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xd7, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, - 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5b, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x39, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, - 0xff, 0xe8, 0x20, 0x0, 0x0, 0x1, 0x7d, 0xff, - 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x4a, - 0xff, 0xff, 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, - 0x28, 0xef, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe8, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfb, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x0, 0x0, 0x16, 0xac, 0xef, 0xfe, 0xdb, - 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x1e, 0xff, 0xff, 0xfd, 0x73, 0x10, 0x1, 0x49, - 0xff, 0xff, 0xff, 0x40, 0x3e, 0xff, 0xfe, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb0, - 0x1, 0xbf, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xf0, 0x0, 0x6, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x77, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1a, 0xed, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xed, 0x60, - 0x0, 0x0, 0x0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x69, 0xcd, 0xef, 0xfe, 0xdb, 0x96, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x81, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, - 0xff, 0xff, 0xb8, 0x53, 0x21, 0x12, 0x36, 0x8c, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xfc, 0x51, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, - 0xff, 0xdb, 0x61, 0x0, 0xa, 0xff, 0xf5, 0x0, - 0x5f, 0xff, 0x60, 0x0, 0x0, 0x4f, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xa, 0xff, 0xf5, 0x0, 0xa, 0xff, - 0xe0, 0x0, 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x1a, 0xff, 0xf5, 0x0, 0x1, 0xef, 0xf7, 0x0, - 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xfd, 0xb9, 0xad, 0xff, 0xff, 0xdb, 0xff, - 0xf5, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x9, 0xff, - 0xe0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfa, 0x20, - 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x1f, 0xff, 0x40, 0xe, 0xff, 0x90, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xb, - 0xff, 0x90, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x3f, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x5, 0xff, 0xd0, - 0x5f, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf5, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x8f, 0xfd, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0xff, 0xf2, 0xaf, 0xfb, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0xef, 0xf3, 0xbf, 0xfa, 0x0, 0x0, 0x4, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xdf, 0xf4, - 0xcf, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0xcf, 0xf5, 0xcf, 0xf9, - 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0xcf, 0xf4, 0xbf, 0xfa, 0x0, 0x0, - 0x4, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0xdf, 0xf4, 0xaf, 0xfb, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf2, - 0x8f, 0xfe, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf5, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x5f, 0xff, - 0x10, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf5, 0x0, - 0x0, 0x5, 0xff, 0xd0, 0x2f, 0xff, 0x50, 0x0, - 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xb, - 0xff, 0x80, 0xd, 0xff, 0xa0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2f, 0xff, 0x30, - 0x8, 0xff, 0xf1, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xfa, 0x20, 0x0, 0x0, 0x19, 0xff, 0xfe, 0xff, - 0xfe, 0x10, 0x1, 0xdf, 0xfc, 0x0, 0x2, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, - 0xa9, 0x9c, 0xff, 0xff, 0xc2, 0xff, 0xff, 0xea, - 0xaf, 0xff, 0xf3, 0x0, 0x0, 0xbf, 0xfe, 0x10, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x27, 0xbe, 0xff, 0xeb, 0x71, 0x0, 0x0, 0x0, - 0x7c, 0xff, 0xd9, 0x20, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xfc, 0x61, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3a, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0xff, 0xff, 0xff, 0xc8, 0x53, 0x32, 0x23, - 0x57, 0xae, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, - 0xef, 0xfe, 0xda, 0x84, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x8e, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf1, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xfa, 0x1, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x30, 0xa, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x0, 0x3f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0x0, - 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf4, 0x0, 0x0, 0x1f, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xb0, 0x0, 0x8, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0x20, 0x0, 0xef, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, 0x6f, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf1, - 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x70, - - /* U+0042 "B" */ - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xee, 0xb8, 0x50, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe8, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x2, 0xff, 0xff, 0xec, 0xcc, - 0xcc, 0xcc, 0xcc, 0xde, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xfc, 0x0, - 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x2f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x90, 0x2, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfb, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xc0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, - 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x2, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xfd, 0x0, 0x2, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, - 0xff, 0x20, 0x0, 0x2f, 0xff, 0xfe, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xff, 0xfe, 0x40, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x36, 0xbf, - 0xff, 0xff, 0xb0, 0x2, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, - 0xff, 0x60, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfe, - 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x2f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x62, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x72, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf5, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x22, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xd0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x7e, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xec, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, - 0xff, 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xfb, 0x74, 0x32, 0x45, 0x8d, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, - 0xff, 0xe2, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfe, - 0x20, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb2, 0x0, - 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xc2, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xfe, 0x20, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x3b, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xfb, 0x74, 0x32, 0x45, 0x8d, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x10, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, - 0xff, 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, - - /* U+0044 "D" */ - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x12, - 0x46, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6e, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x60, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xc0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xc0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x60, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6e, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x12, - 0x36, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0045 "E" */ - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x2, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf7, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x32, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, - - /* U+0046 "F" */ - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x10, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, - 0xff, 0xfe, 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xfc, 0x75, 0x32, 0x35, 0x7b, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xf5, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, - 0x50, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, - 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xbb, 0xb6, 0xbf, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0xaf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf9, 0x8f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf9, 0x5f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xf9, 0x1f, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf9, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf9, 0x4, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, - 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, - 0x3f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x7, - 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xfc, 0x75, 0x32, 0x34, 0x7a, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, - 0xff, 0xfe, 0xc9, 0x51, 0x0, 0x0, 0x0, - - /* U+0048 "H" */ - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x82, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x82, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xf7, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x12, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x80, - - /* U+0049 "I" */ - 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, - 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, - 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, - 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, - 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, - 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, - 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, - 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, - 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, - 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, - 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, - 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, - 0x2f, 0xff, 0xf7, - - /* U+004A "J" */ - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x18, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xfe, 0x0, 0x2, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xb0, 0x1, 0xdf, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf7, 0x0, 0xbf, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x2f, 0xff, - 0xff, 0xd7, 0x31, 0x3, 0x8f, 0xff, 0xff, 0xb0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfe, 0xc8, 0x30, - 0x0, 0x0, 0x0, - - /* U+004B "K" */ - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfa, 0x0, 0x2f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x1, - 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0xc, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf7, 0x0, 0xbf, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf7, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xfe, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0x40, 0xbf, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x1d, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x2, 0xef, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0x30, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xe1, - 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfc, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, - - /* U+004C "L" */ - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, - - /* U+004D "M" */ - 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xf0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xf0, 0x2f, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, - 0x2f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xf0, - 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xf0, 0x2f, 0xff, 0xfc, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xaf, 0xff, 0xf0, 0x2f, 0xff, 0xf4, 0xef, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xfb, 0x5f, 0xff, 0xf0, 0x2f, 0xff, - 0xf4, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x5f, 0xff, 0xf1, - 0x2f, 0xff, 0xf4, 0xc, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x5f, - 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x3, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, - 0x10, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, - 0x9f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xf6, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, - 0xf4, 0x0, 0x1e, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xf1, - 0x2f, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x5f, - 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0xdf, - 0xff, 0xb0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, - 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x4f, 0xff, - 0xf2, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, - 0xf4, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0x0, - 0xdf, 0xff, 0x80, 0x0, 0x0, 0x5f, 0xff, 0xf1, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x70, 0x6, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf1, 0x1e, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf9, 0x9f, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf1, - - /* U+004E "N" */ - 0x2f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x82, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xfd, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x82, 0xff, 0xff, 0x7b, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf8, 0x2f, 0xff, 0xf7, 0xd, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, - 0xff, 0xff, 0x70, 0x2f, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, - 0xf7, 0x0, 0x5f, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, - 0x0, 0x8f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, - 0xcf, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x1, 0xef, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf2, 0x0, - 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xd0, 0x0, 0x1f, - 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xb0, 0x1, 0xff, 0xff, - 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xf8, 0x2f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0x41, 0xff, 0xff, 0x82, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xfe, 0x3f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, - 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x82, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf8, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x80, - - /* U+004F "O" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, - 0xff, 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xfb, 0x74, 0x32, 0x35, - 0x8d, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0xcf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x0, 0xb, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf5, - 0x1, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xb0, 0x5f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0x8, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf2, 0xaf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x4b, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, - 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x6b, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf6, 0xaf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x48, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x5f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x1, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xb0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf5, 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xfe, 0x0, 0x0, 0xcf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0x70, 0x0, 0x3, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x81, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xfb, 0x74, 0x32, 0x35, 0x8c, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, - 0xff, 0xfe, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0050 "P" */ - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, - 0xc8, 0x50, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x20, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x2f, 0xff, - 0xf7, 0x11, 0x11, 0x11, 0x11, 0x23, 0x7b, 0xff, - 0xff, 0xff, 0x80, 0x2, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, - 0x30, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x2, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xf2, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x72, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x2f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xb2, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xfc, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb2, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfa, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x72, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf2, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x2, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, - 0xff, 0xff, 0x40, 0x2f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x12, 0x5a, 0xff, 0xff, 0xff, 0x90, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xd9, 0x61, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x71, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, - 0xff, 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfb, 0x74, - 0x32, 0x35, 0x8d, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf8, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0x60, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xe0, 0x0, 0xa, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf5, 0x0, 0xf, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, - 0x4f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x20, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, 0xbf, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, - 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x60, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x60, 0xbf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, 0x8f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, - 0x5f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xfb, 0x0, 0xc, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x6, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x18, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xe9, 0x52, - 0x10, 0x13, 0x6a, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, - 0xff, 0xff, 0xff, 0x61, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, - 0x10, 0x0, 0x0, 0x1, 0xaf, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xe8, 0x30, 0x3, 0x8e, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, - 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x26, 0x9a, 0xa8, 0x50, 0x0, 0x0, - - /* U+0052 "R" */ - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, - 0xc8, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x92, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x23, - 0x7b, 0xff, 0xff, 0xff, 0x80, 0x0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xf3, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xfc, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x20, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x70, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xa0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xb0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xa0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x70, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x30, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, - 0xff, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x59, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa2, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x2f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xe1, 0x0, 0x2f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xfa, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, - - /* U+0053 "S" */ - 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xff, 0xfe, - 0xda, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, - 0x20, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0xd, 0xff, 0xff, - 0xfa, 0x52, 0x0, 0x1, 0x36, 0xaf, 0xff, 0xfa, - 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6d, 0xf4, 0x0, 0x0, 0xef, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x50, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x72, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xea, 0x62, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x6a, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7d, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x51, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf8, 0x0, 0xee, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x7, - 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xd0, 0xe, 0xff, 0xff, 0xfe, - 0x96, 0x30, 0x0, 0x1, 0x48, 0xef, 0xff, 0xff, - 0x40, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x39, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x7a, 0xde, 0xff, 0xfe, - 0xc9, 0x50, 0x0, 0x0, 0x0, - - /* U+0054 "T" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x1c, 0xff, 0xfc, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0055 "U" */ - 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, - 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, - 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, - 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, - 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xfc, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, - 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x4f, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf9, 0x1f, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf6, 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, - 0x9, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x3, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x80, 0x0, 0xcf, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0x10, 0x0, 0x3f, 0xff, 0xff, 0xc3, 0x0, - 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xb7, 0x43, 0x24, - 0x6a, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xfe, - 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, - - /* U+0056 "V" */ - 0xd, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf9, 0x6, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xf2, 0x0, 0xef, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xb0, 0x0, 0x8f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x40, 0x0, 0x2f, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfd, 0x0, 0x0, 0xb, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x3f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xaf, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xf2, 0x0, 0x1, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x8, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, - 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x60, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xd0, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf7, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0057 "W" */ - 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf2, 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xd0, 0xb, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x80, 0x6, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x20, 0x1, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, 0xbf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, 0x0, 0x6f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, - 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xac, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, - 0x0, 0xc, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x57, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x80, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x1, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, 0xcf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, - 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, - 0x0, 0x1f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xa0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0x50, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xa0, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, - 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xe0, 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, - 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x2f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf8, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf9, 0x0, 0x0, 0x7f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfd, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0x0, 0xcf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x20, 0x4, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, 0x2, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x80, 0xa, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, - 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, 0xf, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xe0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x4f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf4, 0x1f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, - 0xaf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf9, 0x7f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xfd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfe, 0xcf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0058 "X" */ - 0x5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, 0x0, - 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, - 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0x50, 0x0, 0x3f, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xfe, 0x10, 0xd, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xfb, 0x9, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xfa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xbf, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, 0xcf, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xd0, 0x2, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x6, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf8, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x9f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x90, - 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x40, - 0x1e, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x10, - - /* U+0059 "Y" */ - 0xd, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, - 0x4f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, - 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x2, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xfd, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0xe, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xf2, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xb0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x50, 0x3, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, - 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf8, - 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+005A "Z" */ - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, - 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x3f, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xf8, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - - /* U+005B "[" */ - 0x2f, 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0x72, 0xff, 0xff, 0xcb, 0xbb, 0xb4, 0x2f, 0xff, - 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, - 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, - 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, - 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, - 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xfc, 0xbb, - 0xbb, 0x42, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, 0xff, - 0xff, 0xf7, - - /* U+005C "\\" */ - 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, - - /* U+005D "]" */ - 0x2f, 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0x71, 0xbb, 0xbb, 0xbf, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, - 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, - 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, - 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, - 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, - 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, - 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, - 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, - 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, - 0x0, 0xe, 0xff, 0xf7, 0x1b, 0xbb, 0xbb, 0xff, - 0xff, 0x72, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, 0xff, - 0xff, 0xf7, - - /* U+005E "^" */ - 0x0, 0x0, 0x0, 0x0, 0x48, 0x88, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xbf, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xe1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xf7, 0xa, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x10, 0x3f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xa0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x0, 0x0, 0xf, - 0xff, 0x60, 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, - 0x0, 0x0, 0x9f, 0xfd, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf1, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xa0, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x10, 0x0, 0xa, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, - 0x1, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xe0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0x50, 0xe, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfc, 0x5, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xf2, - - /* U+005F "_" */ - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, - - /* U+0060 "`" */ - 0x2d, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, - - /* U+0061 "a" */ - 0x0, 0x0, 0x2, 0x6a, 0xce, 0xff, 0xec, 0x95, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x2, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x4, 0xff, 0xfe, 0x94, - 0x10, 0x0, 0x15, 0xcf, 0xff, 0xff, 0x40, 0x0, - 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xb0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x22, 0x33, 0x33, 0x33, 0x3e, 0xff, - 0xf7, 0x0, 0x0, 0x4a, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xc, 0xff, 0xff, 0xb5, 0x20, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf8, 0x4f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf8, - 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xf8, 0xaf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0xaf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf8, 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xfe, 0x40, - 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xf8, 0xa, - 0xff, 0xff, 0xfd, 0x97, 0x79, 0xcf, 0xff, 0xfe, - 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x6b, 0xff, 0xf8, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd4, 0xb, 0xff, 0xf8, - 0x0, 0x0, 0x17, 0xbe, 0xff, 0xec, 0x94, 0x0, - 0xb, 0xff, 0xf8, - - /* U+0062 "b" */ - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x17, 0xbe, - 0xff, 0xec, 0x94, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd5, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x91, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, - 0x0, 0xdf, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, - 0xff, 0xc0, 0x0, 0xdf, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf8, 0x0, - 0xdf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0x10, 0xdf, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0x80, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0xdf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf2, 0xdf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf4, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0xdf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf6, 0xdf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, - 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xdf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xf1, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xd0, 0xdf, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x80, 0xdf, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0x10, 0xdf, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xf8, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, - 0xff, 0xc0, 0x0, 0xdf, 0xff, 0x8d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0xdf, 0xff, 0x61, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb1, 0x0, 0x0, 0xdf, 0xff, 0x60, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x60, 0x0, 0x17, 0xbe, - 0xff, 0xec, 0x94, 0x0, 0x0, 0x0, 0x0, - - /* U+0063 "c" */ - 0x0, 0x0, 0x0, 0x0, 0x5, 0xac, 0xef, 0xfe, - 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x5, 0xff, 0xff, 0xfe, 0x83, 0x0, 0x1, - 0x6c, 0xff, 0xff, 0xf4, 0x0, 0x1f, 0xff, 0xff, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, - 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xfb, 0x10, 0x2, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xfb, 0x20, 0x0, 0x1e, 0xff, 0xff, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, - 0x0, 0x4, 0xff, 0xff, 0xfe, 0x83, 0x0, 0x1, - 0x6c, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xad, 0xef, 0xfe, - 0xb7, 0x20, 0x0, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, 0x83, - 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x2, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x3f, - 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x53, 0xff, 0xff, 0x30, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xf3, 0x0, 0x7, 0xff, - 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x3, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xf3, 0x8, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0x30, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0xe, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x30, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf3, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf3, 0xe, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x30, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x8, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, - 0x3, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x7, 0xff, - 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xf3, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x27, - 0xbe, 0xff, 0xec, 0x83, 0x0, 0x0, 0xff, 0xff, - 0x30, - - /* U+0065 "e" */ - 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, - 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xdc, 0xef, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xfa, 0x30, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x40, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0xbf, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xfd, 0x0, 0x2, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, - 0x7, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xa0, 0xb, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xe0, 0xe, 0xff, 0xf8, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x4f, 0xff, 0xf0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xe, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x37, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0x94, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, - 0xc9, 0x50, 0x0, 0x0, 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x0, 0x0, 0x7, 0xbe, 0xff, 0xda, - 0x40, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xfe, 0xbb, 0xef, 0xf1, 0x0, 0x0, 0x9, 0xff, - 0xff, 0x70, 0x0, 0x3, 0x70, 0x0, 0x0, 0xe, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x3b, 0xbb, 0xbf, - 0xff, 0xfc, 0xbb, 0xbb, 0xbb, 0x20, 0x0, 0x0, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, - 0x94, 0x0, 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, - 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0xa, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xaf, 0xff, - 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xbb, 0xff, 0xf8, 0x0, 0x9, - 0xff, 0xff, 0xfe, 0x73, 0x0, 0x1, 0x4a, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x4, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, - 0xf8, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x4f, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xf8, 0x9, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x80, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0xf, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x80, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf8, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x80, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf8, 0xc, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x80, 0x9f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, - 0x3, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0x80, 0xc, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0x41, 0x0, - 0x26, 0xcf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xef, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x1, 0x6a, 0xce, 0xed, 0xb7, 0x30, - 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, 0x1c, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0x70, 0x0, 0x9, 0xff, 0x93, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf1, 0x0, - 0x4, 0xff, 0xff, 0xfc, 0x84, 0x10, 0x0, 0x3, - 0x7d, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x15, 0x8b, 0xde, 0xff, 0xed, 0xa6, 0x20, - 0x0, 0x0, 0x0, - - /* U+0068 "h" */ - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x16, 0xbd, 0xef, 0xec, - 0x83, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x19, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0xdf, 0xff, 0x93, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0xdf, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xd7, 0x31, 0x1, 0x4a, - 0xff, 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x50, - 0xdf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xb0, 0xdf, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, - 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf2, 0xdf, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, - 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf4, 0xdf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, - - /* U+0069 "i" */ - 0x0, 0x57, 0x40, 0x0, 0xcf, 0xff, 0x90, 0x6f, - 0xff, 0xff, 0x38, 0xff, 0xff, 0xf5, 0x5f, 0xff, - 0xff, 0x20, 0xaf, 0xff, 0x60, 0x0, 0x24, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, - 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, - 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, - 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, 0xff, - 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, 0xff, 0xf9, - 0x0, 0xdf, 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, - 0xdf, 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, - 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, - 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, - 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, - 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, - - /* U+006A "j" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x14, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x70, 0x0, 0xa3, 0x0, 0x2, - 0xdf, 0xff, 0xf3, 0x0, 0x6f, 0xfe, 0xcd, 0xff, - 0xff, 0xfb, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x10, 0x1, 0xef, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x0, 0x6b, 0xef, 0xfe, 0xa5, 0x0, - 0x0, 0x0, - - /* U+006B "k" */ - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xb0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, 0xdf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xb0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xdf, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, - 0x0, 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x90, 0x5f, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf9, 0x6f, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0x70, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0xaf, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0x60, 0x0, 0x0, 0xdf, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x0, 0xdf, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xc0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0x80, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0x20, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xfd, 0x0, - - /* U+006C "l" */ - 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, - 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, - 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, - 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, - 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, - 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, - 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, - 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, - 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, - 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, - 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x90, - - /* U+006D "m" */ - 0xdf, 0xff, 0x60, 0x0, 0x38, 0xce, 0xff, 0xeb, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, 0xfe, - 0xda, 0x60, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x2, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, - 0x0, 0xdf, 0xff, 0x64, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x1b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0xd, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xc6, 0x20, - 0x12, 0x7e, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc6, - 0x20, 0x12, 0x7e, 0xff, 0xff, 0xf4, 0xd, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xb0, 0xdf, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x1d, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf5, 0xdf, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x8d, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf9, 0xdf, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xad, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0xdf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xad, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0xdf, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xad, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xad, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfa, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xad, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xfa, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xad, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xfa, 0xdf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xad, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfa, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xa0, - - /* U+006E "n" */ - 0xdf, 0xff, 0x60, 0x0, 0x27, 0xbe, 0xff, 0xec, - 0x83, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0x1a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0xdf, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0xdf, 0xff, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xd7, 0x31, 0x1, 0x4a, - 0xff, 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x50, - 0xdf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xb0, 0xdf, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, - 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf2, 0xdf, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, - 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf4, 0xdf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, - - /* U+006F "o" */ - 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfd, - 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0x0, 0x2f, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0x50, 0x7, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xfa, 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0xe, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x20, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf3, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf3, 0xe, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x10, 0xbf, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, - 0x7, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x1f, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x50, 0x0, 0xaf, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xd0, - 0x0, 0x1, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x16, 0xad, 0xff, 0xfd, 0xb7, 0x20, 0x0, 0x0, - 0x0, 0x0, - - /* U+0070 "p" */ - 0xdf, 0xff, 0x60, 0x0, 0x17, 0xbe, 0xff, 0xec, - 0x94, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x62, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0xdf, - 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xf9, 0x30, 0x0, 0x15, 0xcf, 0xff, 0xff, 0xc0, - 0x0, 0xdf, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xf8, 0x0, 0xdf, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0x10, 0xdf, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x80, - 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xe0, 0xdf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xf2, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xdf, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf6, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf6, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0xdf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf4, 0xdf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf1, - 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xd0, 0xdf, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x80, 0xdf, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x10, 0xdf, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xf8, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, 0xff, 0xc0, - 0x0, 0xdf, 0xff, 0xad, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, - 0x91, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x16, 0xbe, 0xff, 0xec, - 0x94, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, - 0x83, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, - 0xf, 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, - 0x30, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x6f, 0xff, 0xf3, 0x0, 0x7, - 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x3, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x2f, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xf3, 0x8, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0x30, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0xe, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x30, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf3, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf3, 0xe, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x30, 0xbf, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, - 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0x30, 0x2f, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0x30, 0x3, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x7, - 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x43, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x10, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x27, 0xbe, 0xff, 0xec, 0x83, 0x0, 0x3, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf3, - - /* U+0072 "r" */ - 0xdf, 0xff, 0x60, 0x0, 0x27, 0xbe, 0xf4, 0xdf, - 0xff, 0x60, 0x1a, 0xff, 0xff, 0xf4, 0xdf, 0xff, - 0x63, 0xef, 0xff, 0xff, 0xf4, 0xdf, 0xff, 0x8e, - 0xff, 0xff, 0xff, 0xf4, 0xdf, 0xff, 0xff, 0xff, - 0xfb, 0x75, 0x41, 0xdf, 0xff, 0xff, 0xfb, 0x20, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xed, 0xa7, - 0x30, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe8, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, - 0xff, 0x40, 0x7, 0xff, 0xff, 0xd6, 0x10, 0x0, - 0x1, 0x49, 0xef, 0xb0, 0x0, 0xdf, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x73, 0x0, 0xf, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xc9, 0x52, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x6, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x0, - 0x0, 0x0, 0x0, 0x6a, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x25, - 0x7a, 0xdf, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xfb, 0x1, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, - 0x8f, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf7, 0x1f, 0xff, 0xfb, 0x63, 0x0, 0x0, - 0x3, 0x8f, 0xff, 0xff, 0x19, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0x70, 0x5e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x36, 0xac, - 0xef, 0xfe, 0xdb, 0x82, 0x0, 0x0, 0x0, - - /* U+0074 "t" */ - 0x0, 0x0, 0x18, 0x88, 0x82, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x3b, 0xbb, 0xbf, 0xff, 0xfc, 0xbb, 0xbb, - 0xbb, 0x20, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa1, - 0x0, 0x5, 0x90, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xdd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x28, 0xce, 0xfe, 0xc8, 0x20, - - /* U+0075 "u" */ - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfe, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, - 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xfe, 0xb, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, - 0x7, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xfe, 0x1, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, - 0x0, 0x9f, 0xff, 0xff, 0xc6, 0x20, 0x2, 0x6c, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, - 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x54, 0xff, 0xfe, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc2, 0x4, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfc, 0x93, - 0x0, 0x4, 0xff, 0xfe, - - /* U+0076 "v" */ - 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, 0x7f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf2, 0x1, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, - 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, 0x0, 0x2f, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xd0, 0x0, 0x0, 0xbf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, - 0x0, 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x5, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xf8, 0x0, 0x0, 0xcf, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xe0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x9, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfc, 0x1, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf3, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xae, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0077 "w" */ - 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x2f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x80, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x20, 0x7, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xfc, 0x0, 0x1, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf6, - 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0x5f, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x2c, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, - 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xfc, 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x0, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x5, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, - 0x0, 0xf, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x60, - 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x5f, 0xff, - 0xa0, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x1f, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xe0, 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0xe, - 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, 0x1, - 0xff, 0xfe, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, - 0x0, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xf8, 0x0, - 0x0, 0x2, 0xff, 0xfd, 0x0, 0x2, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x30, 0x8, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x3f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0xd, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xb0, 0x9f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xe0, 0x3f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, - 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xf5, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xfb, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, 0xef, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+0078 "x" */ - 0x8, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xfd, 0x0, 0xc, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x20, 0x0, 0x1e, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x4f, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xf2, 0x0, 0x0, 0xaf, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xd0, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, 0x2f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x6d, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xfc, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x8, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x20, 0xc, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, - 0x1e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x4f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xd0, 0x0, - 0x3f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0x90, 0x1e, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x50, - - /* U+0079 "y" */ - 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x7f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf1, 0x0, 0xf, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xa0, 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x30, - 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x50, 0x0, 0x5, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xc0, 0x0, 0xc, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf3, 0x0, 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x11, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x77, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xed, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x32, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0x81, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xed, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x9d, 0xff, 0xeb, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x9, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xb2, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, - - /* U+007B "{" */ - 0x0, 0x0, 0x0, 0x3, 0x9d, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xfc, 0xb2, 0x0, 0x0, 0x6f, 0xff, - 0xfb, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x4b, 0xcf, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xe5, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x10, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfc, 0xb2, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x3, 0x9d, 0xff, 0xf4, - - /* U+007C "|" */ - 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, - 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, - 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, - 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, - 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, - 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, - 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, - 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, - 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, - 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, - 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, - 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, - 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, - 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, - - /* U+007D "}" */ - 0x2f, 0xff, 0xda, 0x40, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x1b, 0xce, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xfc, 0xb5, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x91, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, - 0x1b, 0xce, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xda, - 0x40, 0x0, 0x0, 0x0, - - /* U+007E "~" */ - 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xbb, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xfb, 0x10, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x1, - 0xef, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x4f, 0xfd, 0x0, 0x8f, 0xff, 0xc7, 0x8e, 0xff, - 0xff, 0x60, 0x0, 0xd, 0xff, 0xa0, 0xd, 0xff, - 0xa0, 0x0, 0xa, 0xff, 0xff, 0xc8, 0x8e, 0xff, - 0xf4, 0x1, 0xff, 0xf1, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3f, 0xfc, 0x0, - 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xfd, 0x10, - 0x3, 0xbb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x7c, - 0xff, 0xc7, 0x0, 0x0, - - /* U+00B0 "°" */ - 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x60, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0x1, 0xef, 0xfe, 0x97, 0x9d, 0xff, 0xf4, 0x0, - 0xb, 0xff, 0x80, 0x0, 0x0, 0x6f, 0xfe, 0x10, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0x90, - 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, - 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, - 0xef, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf2, - 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, - 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, - 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0x90, - 0xb, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xfe, 0x10, - 0x1, 0xef, 0xfe, 0xa8, 0x9e, 0xff, 0xf4, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x60, 0x0, 0x0, - - /* U+2022 "•" */ - 0x0, 0x27, 0x85, 0x0, 0x0, 0x7f, 0xff, 0xfc, - 0x10, 0x5f, 0xff, 0xff, 0xfb, 0xc, 0xff, 0xff, - 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x5e, 0xff, - 0xff, 0xff, 0xf4, 0x9f, 0xff, 0xff, 0xfe, 0x1, - 0xef, 0xff, 0xff, 0x50, 0x1, 0x9e, 0xfc, 0x40, - 0x0, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x8c, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xae, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x6a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xae, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x27, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x28, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa6, 0x10, 0xe, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x94, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x72, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe9, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xc7, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, - 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x14, 0x55, 0x42, 0xef, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x4, 0x79, 0x99, 0x6c, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x1, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, - 0xea, 0x50, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x8b, 0xcd, 0xcb, 0x73, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F008 "" */ - 0x5, 0x60, 0x0, 0x0, 0x18, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x84, 0x0, 0x0, 0x6, 0x50, 0x9f, - 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xe, 0xf9, 0xff, 0xe0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xfc, 0xaa, - 0xaa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xaa, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x44, 0x44, 0xaf, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xfd, 0x44, 0x44, 0x5f, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x7f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xee, 0xee, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xee, 0xee, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5f, 0xff, 0xfa, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xf8, 0x66, 0x66, - 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x66, - 0x66, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x88, 0x88, 0xcf, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfe, 0x88, 0x88, 0xaf, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xfd, 0xcc, 0xcc, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xcc, 0xcc, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x22, 0x22, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x22, 0x22, 0x3f, 0xff, 0xdf, - 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xe, 0xfd, 0x3d, 0xd0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xd, 0xd3, - - /* U+F00B "" */ - 0x4, 0x77, 0x77, 0x77, 0x77, 0x76, 0x10, 0x0, - 0x3, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x40, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x5, 0x78, - 0x88, 0x88, 0x88, 0x87, 0x10, 0x0, 0x3, 0x78, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x88, 0x88, 0x88, 0x88, - 0x87, 0x20, 0x0, 0x4, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x3c, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, - 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x51, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9d, 0x91, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbd, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1b, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfe, 0x70, 0x0, - 0x1, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf9, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x90, - 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x5f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xe1, - 0x7, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x7f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe2, 0x0, - 0x0, 0x3, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x86, 0x0, 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x22, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xb5, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x1, 0x9b, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xf4, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xbf, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4e, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0x70, 0x0, 0xd, 0xff, 0xff, - 0xff, 0x60, 0x0, 0xd, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x30, - 0x1, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0x30, 0xdf, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xf6, 0xf, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0x92, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, 0x3f, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xc4, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xfd, 0x3f, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xc2, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xfc, 0x1f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8b, 0xbb, 0xa4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xa0, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf8, 0xc, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0x50, 0x8f, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xf2, 0x3, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xfd, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc8, 0x53, 0x22, 0x46, 0x9e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, 0xff, - 0xff, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x46, - 0x78, 0x87, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xa3, 0x0, 0x0, 0x4, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, - 0x0, 0x0, 0x6a, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xa2, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3c, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xca, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb9, 0x9c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x60, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, - 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x31, 0x14, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf9, 0x16, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x42, 0xbf, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, - 0x30, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa1, 0x0, 0x4, 0xdf, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x92, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xce, - 0xff, 0xff, 0xdb, 0x81, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x44, 0x44, 0x41, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0x50, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x5f, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe4, 0x0, 0x5f, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x5f, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0xe5, 0x7f, 0xff, 0xff, 0xff, 0xf9, - 0x5f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x5f, 0xd2, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xd2, 0x0, 0x8, 0xff, 0xff, 0x40, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xfb, 0x10, 0x0, 0xaf, 0xff, 0xff, - 0xf7, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x40, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xd2, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x50, - 0xaf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x4, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xf6, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, 0xc1, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x4e, 0xff, 0xff, 0xe1, 0x7, 0xff, - 0xfa, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x2, 0xdf, 0xff, 0x30, - 0x0, 0x9f, 0x80, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb, - 0xf6, 0x0, 0x0, 0x1, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x77, 0x77, - 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x5e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8c, 0xcc, 0xcc, 0xcc, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, - 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x63, - 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, 0x0, 0x36, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x40, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x7, 0xff, 0x70, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x22, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x11, 0x4c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x9f, 0xf7, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, - 0xf1, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xaf, 0xf8, - 0x2, 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, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x6, 0x89, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, - 0x60, - - /* U+F01C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0x94, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0x9, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x50, - 0x3f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xff, 0xe0, 0xbf, 0xff, 0xff, 0xf6, 0x44, 0x44, - 0x44, 0x44, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x9f, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd8, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 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, 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, 0xfa, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x1, 0x9e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x14, 0x67, 0x88, 0x75, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x4, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc1, 0x2, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x31, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb6, 0x21, 0x0, 0x3, 0x7c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x81, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, - 0x54, 0x43, 0x21, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xaf, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x9, 0xff, 0xff, 0xe6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x44, 0x43, 0x10, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xcd, 0xef, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xff, 0xf7, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x0, 0x3, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xb8, 0x77, 0x9a, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x10, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0x20, 0x5, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x7a, 0xdf, 0xff, 0xfe, - 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xad, 0xee, 0xec, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 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, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x2, 0x44, 0x44, 0x44, 0x44, - 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xec, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x24, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xfe, - 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xb, - 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x1, 0xcf, 0xff, 0xfb, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xb, 0xff, - 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xaf, 0xff, 0xd2, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x2, 0xcf, 0xa0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x44, 0x44, 0x44, 0x44, 0x48, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xec, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xab, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x93, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0x70, 0x0, 0x0, 0x5f, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xfb, 0x0, 0x0, 0x9, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0xdf, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, 0xc, 0xff, - 0xff, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xe0, 0x0, - 0x4, 0xff, 0xff, 0x50, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x36, 0x10, 0x0, 0x0, 0x9f, 0xff, - 0xf7, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, - 0xd, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xf0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0xc, 0xff, 0xff, - 0x60, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x3f, - 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x9, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xff, 0x90, - 0x0, 0xf, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x1, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0xaf, - 0xff, 0xc0, 0x0, 0xd, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, - 0x0, 0x6f, 0xff, 0xf0, 0x0, 0xa, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x60, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0xa, - 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x70, 0x0, 0x3f, 0xff, 0xf1, - 0x0, 0x9, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x4f, - 0xff, 0xf1, 0x0, 0x9, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, - 0x0, 0x5f, 0xff, 0xf0, 0x0, 0xa, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, 0xc, - 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x5, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0xcf, 0xff, 0xb0, - 0x0, 0xe, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0xb, 0xff, 0xff, 0xc0, 0x0, 0x2, 0xff, - 0xff, 0x60, 0x0, 0x1f, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0xa, 0xff, 0xfc, 0x10, 0x0, - 0xa, 0xff, 0xff, 0x10, 0x0, 0x6f, 0xff, 0xf1, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1, 0xbe, 0x80, - 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0xbf, - 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf3, 0x0, - 0x2, 0xff, 0xff, 0x70, 0x2, 0x44, 0x44, 0x44, - 0x44, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xa0, 0x0, 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, - 0xff, 0xfe, 0x10, 0x0, 0x1f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0x40, 0x0, 0x4, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe3, 0x0, - 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfa, - 0x10, 0x0, 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xec, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F03E "" */ - 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x4, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x7a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x46, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x5, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, 0x9e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe9, 0x10, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xef, 0xff, 0xff, 0xb8, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xff, 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xef, 0xff, 0xfe, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xcf, 0xff, 0xff, 0x10, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x9f, 0xff, 0xff, 0x60, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x5f, 0xff, 0xff, 0xd0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xf, 0xff, 0xff, 0xf7, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x9, 0xff, 0xff, 0xff, 0x40, 0x0, 0x3a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x1, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x1, - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x94, 0x20, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, 0xbb, - 0xba, 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F048 "" */ - 0x3, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x52, 0x0, 0x2f, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x4f, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xf4, 0x4f, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xf7, 0x4f, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, - 0xff, 0xff, 0xf3, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xff, 0xf3, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, - 0xf3, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xf7, 0x3f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf2, - 0x1e, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2b, 0xfc, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x0, 0x2, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xf9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4a, 0xb8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, 0x44, - 0x44, 0x44, 0x30, 0x0, 0x0, 0x4d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x8d, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xea, 0x20, - 0x0, - - /* U+F04D "" */ - 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x30, 0x0, 0x0, 0x4d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x8d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x20, - 0x0, - - /* U+F051 "" */ - 0x0, 0x15, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x44, 0x44, 0x40, 0x5, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xf6, 0x1f, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xf, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, - 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0xf, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x1f, 0xff, 0xff, 0xf8, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf8, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, - 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf8, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf7, - 0x2, 0xbf, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xe4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, - 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x10, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x5, 0x9b, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x27, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x84, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xea, 0x10, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2b, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x33, 0x0, 0x0, - - /* U+F054 "" */ - 0x0, 0x7, 0xca, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x56, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x79, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, - 0xff, 0xff, 0xff, 0xff, 0xc9, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x98, 0x40, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, - 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xde, 0xed, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F068 "" */ - 0x2, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x98, 0x40, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x35, 0x67, 0x66, 0x53, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x7b, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x51, 0x0, 0x0, - 0x26, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x2, 0xbd, 0xdb, - 0x71, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x3, 0x10, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xa, 0xfc, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x10, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, - 0xe9, 0x10, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x35, 0x53, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2c, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, - 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, - 0x65, 0x57, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, - 0xff, 0xff, 0xdc, 0x97, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x46, 0x66, 0x64, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xda, 0x61, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x1, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xd3, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, 0x2, 0x6b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x82, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x3b, 0xdc, 0xa6, 0x10, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xfd, 0x20, 0xf, 0xff, 0xff, - 0xe6, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x40, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, - 0xff, 0xf5, 0xc, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x10, 0x0, - 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x9c, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xf9, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x86, 0x55, 0x74, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x48, 0xac, 0xef, 0xff, 0xed, - 0xb8, 0x51, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, - 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xb3, 0x0, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, - 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x9a, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc4, 0x11, 0x6e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x8, 0xce, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xdb, 0x60, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xda, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8d, 0xdd, 0xdd, 0xef, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x25, 0x55, 0x55, 0x55, 0x6f, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xf8, 0x55, 0xaf, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0x20, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xb, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xc9, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xc8, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0xb, 0xff, 0x70, 0x0, - 0x0, 0x7f, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x8, 0xff, 0xff, 0xff, 0x50, 0x0, 0x8f, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x11, 0x11, - 0x11, 0x2d, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xf4, 0x11, 0x8f, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0x22, 0x22, - 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x9f, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xdb, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x5f, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xfb, 0x2f, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf7, - 0x4, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0x90, 0x0, 0x5f, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, - 0x0, 0x3, 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x59, 0x60, 0x0, - - /* U+F078 "" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xe3, 0x0, - 0x0, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xfe, 0x30, 0xb, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xe2, - 0x4f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfa, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x2, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x2c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xad, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xf6, 0x2f, 0xff, 0xff, 0x91, 0xdf, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x70, - 0x2f, 0xff, 0xff, 0x90, 0x2e, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xf8, 0x0, 0x2f, 0xff, 0xff, - 0x90, 0x2, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, - 0x30, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x16, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, 0xa, 0xff, - 0xff, 0xf1, 0x0, 0x4e, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, 0xf1, 0x4, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf9, - 0xa, 0xff, 0xff, 0xf1, 0x3f, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0x7a, 0xff, 0xff, - 0xf3, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xba, 0x60, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x0, 0x16, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0xa5, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, 0x9e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe9, 0x10, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x13, 0x33, 0x33, 0x33, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa3, 0x33, 0x33, 0x33, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x20, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x2, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x40, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x10, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x14, 0x44, - 0x44, 0x44, 0x30, 0x0, 0x1e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe6, 0x21, 0x11, 0x11, 0x11, - 0x12, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x9f, 0xf7, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, - 0xf1, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xaf, 0xf8, - 0x2, 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, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x6, 0x89, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, - 0x60, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd3, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9b, 0xba, 0x98, 0x64, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x0, 0x0, 0x0, 0x57, 0x98, 0x51, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xdf, 0xff, 0xe8, 0x10, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x23, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x9f, 0xff, 0xff, 0xf7, 0x35, - 0xef, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xd, - 0xff, 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0xf, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0xef, 0xff, 0xff, - 0x20, 0x0, 0xd, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xfd, 0x20, 0x1a, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, - 0xcd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x79, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x73, 0x5e, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0x40, 0x0, 0x1f, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0xe, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0xaf, 0xff, 0xff, 0xd2, 0x1, 0xaf, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3b, 0xff, 0xff, 0xfd, 0x40, 0x0, - 0x0, 0x3c, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x56, 0x52, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, - 0xdc, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x8f, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x8, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x46, 0x66, 0x66, 0x64, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x59, 0x99, 0x99, 0x99, 0x90, 0x8f, 0xff, 0xff, - 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xdd, 0xdd, - 0xdd, 0xdd, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x50, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, - 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xb9, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x0, 0x27, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x97, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x32, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0xbf, 0xff, 0xff, 0xff, 0x60, 0x0, 0xf, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x60, - 0xf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x10, 0x0, 0x3c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x8d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x30, - 0x0, - - /* U+F0C9 "" */ - 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x27, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x74, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x55, 0x55, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x20, - - /* U+F0E0 "" */ - 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x3, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x1, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x2, 0xd6, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x10, 0x0, 0xaf, 0xff, 0xb1, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x2d, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x1, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x10, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0x0, 0x2d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd3, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x10, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x4, 0xdf, 0xff, 0xfd, 0x40, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x5, 0xaa, 0x50, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x20, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x20, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xab, 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, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, 0x9e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe9, 0x10, - - /* U+F0E7 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xca, 0xaa, 0xaa, 0xaa, 0xaa, 0xa7, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x1, 0xad, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5c, 0xff, 0xfc, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, - 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x64, - 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x9c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x82, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x8e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x8d, 0x50, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x8, - 0xff, 0x50, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, 0x50, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x8, 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, 0xff, - 0x50, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x8, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x5a, - 0xaa, 0xaa, 0xaa, 0xa0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x42, 0x22, 0x22, 0x22, - 0x22, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x2, 0x55, 0x55, 0x55, 0x55, - 0x52, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, - 0xff, 0xff, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x30, 0x0, 0x12, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x8b, 0xb9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0x82, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x6f, 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, 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, 0xf9, - 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x1e, 0xff, 0x60, 0x0, 0x3, 0xff, 0xf4, - 0x0, 0x0, 0x5f, 0xfe, 0x20, 0x0, 0x2e, 0xff, - 0x50, 0x0, 0x4, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, - 0xef, 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, - 0xc, 0xff, 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, 0xff, 0x20, - 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x1f, 0xfc, - 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, - 0xff, 0x20, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, - 0x1f, 0xfc, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, - 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0xef, 0xf0, - 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, 0xc, 0xff, - 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x1d, 0xff, 0x60, 0x0, 0x2, - 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, - 0x1e, 0xff, 0x40, 0x0, 0x3, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xee, 0xef, 0xff, 0xfe, 0xee, 0xee, - 0xff, 0xff, 0xee, 0xee, 0xff, 0xff, 0xfe, 0xee, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xe0, - 0x0, 0x0, 0xef, 0xf3, 0x0, 0x0, 0x1f, 0xff, - 0x10, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x1, - 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, - 0xf, 0xff, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xf1, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, - 0xcf, 0xf1, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x1, 0xff, 0xc0, - 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x62, 0x22, 0x27, - 0xff, 0xf3, 0x22, 0x23, 0xff, 0xf7, 0x22, 0x22, - 0x5f, 0xff, 0x52, 0x22, 0x2a, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xcb, 0xbb, 0xcf, 0xff, 0xeb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xcf, 0xff, 0xeb, 0xbb, 0xbd, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0xc, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x1, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, - 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0xc, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x1, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xdc, 0xcc, 0xcf, - 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xec, 0xcc, - 0xce, 0xff, 0xff, 0xfc, 0xff, 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, 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, 0xfa, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x1, 0x9e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x89, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x9b, 0x83, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F15B "" */ - 0x4, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, - 0x60, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0xf, 0xff, 0xff, 0x60, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, - 0x60, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, - 0xff, 0xff, 0xff, 0xff, 0x60, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 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, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x18, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa4, 0x0, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x34, 0x56, 0x66, 0x65, 0x32, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x25, 0x9c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xb7, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb7, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xdd, 0xee, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, - 0x53, 0x10, 0x0, 0x0, 0x0, 0x2, 0x47, 0xae, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, 0xff, - 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, - 0xff, 0xff, 0xf3, 0xb, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0x40, - 0x0, 0xcf, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x48, 0xac, 0xef, 0xff, 0xed, - 0xb9, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0xb, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x97, - 0x53, 0x33, 0x46, 0x8b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xe7, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xe6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xaf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfe, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x27, 0x98, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6b, 0xdc, 0x93, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F240 "" */ - 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 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, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xc, - 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x6, 0x77, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, - 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 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, - 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, - 0xff, 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, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F241 "" */ - 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 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, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, - 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 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, - 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, - 0xff, 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, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F242 "" */ - 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 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, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, - 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 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, - 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, - 0xff, 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, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F243 "" */ - 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 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, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, - 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 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, - 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, - 0xff, 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, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F244 "" */ - 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 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, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 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, - 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, - 0xff, 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, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xad, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x38, 0xaa, 0xae, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfd, 0x99, 0x9e, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xfe, 0x10, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x3, 0x9b, 0xa5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x58, 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, - 0xfc, 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb9, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x9, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xb2, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xde, - 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xff, 0xff, 0xff, 0xfe, 0x50, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 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, 0xd3, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x55, 0x55, - 0x55, 0x55, 0xaf, 0xff, 0xd5, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfb, 0x20, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xc4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xfe, 0x10, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf6, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x45, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x89, 0x99, 0x99, 0x99, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x6a, 0xdf, 0xff, 0xff, 0xff, 0xc9, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xbf, - 0xff, 0xff, 0xf0, 0x0, 0xd5, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x3, 0xff, 0xff, 0xff, - 0xf5, 0x8, 0xff, 0xff, 0xf0, 0x0, 0xdf, 0x50, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0x50, 0x6, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x8f, 0xff, 0xf0, 0x0, - 0xcf, 0xf6, 0x0, 0x9, 0xff, 0xff, 0xff, 0x80, - 0x9, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x8, 0xff, - 0xf0, 0x0, 0xcf, 0xfc, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xa0, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x7f, 0xf0, 0x0, 0xcf, 0xc0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xc0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x7, 0xf0, 0x0, 0xcc, 0x0, - 0x1, 0xef, 0xff, 0xff, 0xff, 0xe0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x70, 0x0, - 0x80, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x30, 0x0, 0x40, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x3, 0xe0, 0x0, 0xc7, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x3e, 0xf1, 0x0, 0xcf, 0x60, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xd0, 0xa, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x3, 0xff, 0xf1, 0x0, - 0xcf, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb0, - 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3f, 0xff, - 0xf1, 0x0, 0xcf, 0xf9, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0x90, 0x4, 0xff, 0xff, 0xff, 0xd1, 0x3, - 0xff, 0xff, 0xf1, 0x0, 0xdf, 0xa0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0x70, 0x1, 0xff, 0xff, 0xff, - 0xfd, 0x5f, 0xff, 0xff, 0xf1, 0x0, 0xda, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0x40, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x70, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x71, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x26, 0x8a, 0xcd, 0xdd, 0xcb, 0x96, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, - 0x77, 0x77, 0x77, 0x77, 0x76, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x9d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x50, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x10, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xc4, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x7f, - 0xff, 0xff, 0xe3, 0x1c, 0xff, 0xff, 0xfb, 0x14, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, - 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, - 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, - 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, - 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, - 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, - 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, - 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, - 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, - 0xff, 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, - 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, - 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, 0xb0, - 0x7, 0xff, 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf1, - 0x1, 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xff, - 0x50, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, - 0xb0, 0x7, 0xff, 0xff, 0xf5, 0x0, 0xdf, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, - 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, - 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, 0x0, 0xdf, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, 0x7f, - 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, 0x1f, - 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, 0x0, - 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, - 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, - 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, - 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, - 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, - 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, - 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0x70, 0x7f, 0xff, 0xff, 0xe3, 0x1c, 0xff, - 0xff, 0xfb, 0x14, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xab, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, - 0x71, 0x0, 0x0, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x23, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x8f, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xdb, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x9b, 0xa8, 0x64, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x26, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3, 0xe3, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x53, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xeb, 0x40, 0x0, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x3, 0xff, 0xff, 0xbb, 0xbb, - 0xff, 0xfb, 0xbb, 0xbc, 0xff, 0xeb, 0xbb, 0xbf, - 0xff, 0xff, 0xa0, 0x0, 0x3, 0xff, 0xff, 0xf1, - 0x0, 0xc, 0xff, 0x10, 0x0, 0x3f, 0xfa, 0x0, - 0x1, 0xff, 0xff, 0xfa, 0x0, 0x3, 0xff, 0xff, - 0xff, 0x10, 0x0, 0xcf, 0xf1, 0x0, 0x3, 0xff, - 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xa0, 0x3, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0xc, 0xff, 0x10, 0x0, - 0x3f, 0xfa, 0x0, 0x1, 0xff, 0xff, 0xfa, 0x4, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0xcf, 0xf1, - 0x0, 0x3, 0xff, 0xa0, 0x0, 0x1f, 0xff, 0xff, - 0xa4, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xc, - 0xff, 0x10, 0x0, 0x3f, 0xfa, 0x0, 0x1, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0xcf, 0xf1, 0x0, 0x3, 0xff, 0xa0, 0x0, - 0x1f, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0xc, 0xff, 0x10, 0x0, 0x3f, 0xfa, - 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0xcf, 0xf1, 0x0, 0x3, - 0xff, 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2, 0x8a, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xa9, 0x61, 0x0, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1a, 0xd8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x2d, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x32, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 198, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 197, .box_w = 7, .box_h = 33, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 116, .adv_w = 288, .box_w = 14, .box_h = 13, .ofs_x = 2, .ofs_y = 20}, - {.bitmap_index = 207, .adv_w = 517, .box_w = 31, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 719, .adv_w = 457, .box_w = 26, .box_h = 45, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 1304, .adv_w = 620, .box_w = 37, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1915, .adv_w = 505, .box_w = 29, .box_h = 34, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 2408, .adv_w = 155, .box_w = 5, .box_h = 13, .ofs_x = 2, .ofs_y = 20}, - {.bitmap_index = 2441, .adv_w = 248, .box_w = 11, .box_h = 44, .ofs_x = 4, .ofs_y = -9}, - {.bitmap_index = 2683, .adv_w = 249, .box_w = 11, .box_h = 44, .ofs_x = 1, .ofs_y = -9}, - {.bitmap_index = 2925, .adv_w = 294, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 17}, - {.bitmap_index = 3087, .adv_w = 428, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 6}, - {.bitmap_index = 3308, .adv_w = 167, .box_w = 7, .box_h = 14, .ofs_x = 2, .ofs_y = -7}, - {.bitmap_index = 3357, .adv_w = 282, .box_w = 13, .box_h = 4, .ofs_x = 2, .ofs_y = 11}, - {.bitmap_index = 3383, .adv_w = 167, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3408, .adv_w = 259, .box_w = 20, .box_h = 44, .ofs_x = -2, .ofs_y = -5}, - {.bitmap_index = 3848, .adv_w = 491, .box_w = 27, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4294, .adv_w = 272, .box_w = 13, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4509, .adv_w = 422, .box_w = 25, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4922, .adv_w = 421, .box_w = 25, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5335, .adv_w = 492, .box_w = 30, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5830, .adv_w = 422, .box_w = 25, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6243, .adv_w = 454, .box_w = 26, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6672, .adv_w = 440, .box_w = 25, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7085, .adv_w = 474, .box_w = 26, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7514, .adv_w = 454, .box_w = 26, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7943, .adv_w = 167, .box_w = 7, .box_h = 25, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8031, .adv_w = 167, .box_w = 7, .box_h = 32, .ofs_x = 2, .ofs_y = -7}, - {.bitmap_index = 8143, .adv_w = 428, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 6}, - {.bitmap_index = 8364, .adv_w = 428, .box_w = 21, .box_h = 15, .ofs_x = 3, .ofs_y = 9}, - {.bitmap_index = 8522, .adv_w = 428, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 6}, - {.bitmap_index = 8743, .adv_w = 422, .box_w = 24, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9139, .adv_w = 761, .box_w = 44, .box_h = 42, .ofs_x = 2, .ofs_y = -9}, - {.bitmap_index = 10063, .adv_w = 539, .box_w = 35, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 10641, .adv_w = 557, .box_w = 29, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 11120, .adv_w = 532, .box_w = 30, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11615, .adv_w = 608, .box_w = 32, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12143, .adv_w = 493, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12556, .adv_w = 467, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12952, .adv_w = 568, .box_w = 30, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13447, .adv_w = 598, .box_w = 29, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 13926, .adv_w = 228, .box_w = 6, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 14025, .adv_w = 378, .box_w = 21, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 14372, .adv_w = 529, .box_w = 30, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 14867, .adv_w = 437, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 15247, .adv_w = 703, .box_w = 36, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 15841, .adv_w = 598, .box_w = 29, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 16320, .adv_w = 618, .box_w = 35, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 16898, .adv_w = 531, .box_w = 27, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 17344, .adv_w = 618, .box_w = 36, .box_h = 40, .ofs_x = 2, .ofs_y = -7}, - {.bitmap_index = 18064, .adv_w = 535, .box_w = 28, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 18526, .adv_w = 457, .box_w = 26, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 18955, .adv_w = 432, .box_w = 27, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 19401, .adv_w = 582, .box_w = 28, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 19863, .adv_w = 524, .box_w = 34, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 20424, .adv_w = 829, .box_w = 50, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 21249, .adv_w = 495, .box_w = 31, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 21761, .adv_w = 476, .box_w = 31, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 22273, .adv_w = 484, .box_w = 28, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 22735, .adv_w = 245, .box_w = 11, .box_h = 44, .ofs_x = 4, .ofs_y = -9}, - {.bitmap_index = 22977, .adv_w = 259, .box_w = 20, .box_h = 44, .ofs_x = -2, .ofs_y = -5}, - {.bitmap_index = 23417, .adv_w = 245, .box_w = 11, .box_h = 44, .ofs_x = 0, .ofs_y = -9}, - {.bitmap_index = 23659, .adv_w = 429, .box_w = 21, .box_h = 20, .ofs_x = 3, .ofs_y = 7}, - {.bitmap_index = 23869, .adv_w = 368, .box_w = 23, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 23904, .adv_w = 442, .box_w = 13, .box_h = 6, .ofs_x = 5, .ofs_y = 28}, - {.bitmap_index = 23943, .adv_w = 440, .box_w = 22, .box_h = 25, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 24218, .adv_w = 502, .box_w = 26, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 24673, .adv_w = 420, .box_w = 24, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 24973, .adv_w = 502, .box_w = 27, .box_h = 35, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 25446, .adv_w = 450, .box_w = 26, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 25771, .adv_w = 260, .box_w = 18, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 26086, .adv_w = 508, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = -9}, - {.bitmap_index = 26545, .adv_w = 501, .box_w = 24, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 26965, .adv_w = 205, .box_w = 7, .box_h = 36, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 27091, .adv_w = 209, .box_w = 15, .box_h = 45, .ofs_x = -5, .ofs_y = -9}, - {.bitmap_index = 27429, .adv_w = 453, .box_w = 25, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 27867, .adv_w = 205, .box_w = 5, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 27955, .adv_w = 778, .box_w = 41, .box_h = 25, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 28468, .adv_w = 501, .box_w = 24, .box_h = 25, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 28768, .adv_w = 467, .box_w = 27, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 29106, .adv_w = 502, .box_w = 26, .box_h = 34, .ofs_x = 4, .ofs_y = -9}, - {.bitmap_index = 29548, .adv_w = 502, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = -9}, - {.bitmap_index = 30007, .adv_w = 302, .box_w = 14, .box_h = 25, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 30182, .adv_w = 369, .box_w = 21, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 30445, .adv_w = 305, .box_w = 18, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 30724, .adv_w = 498, .box_w = 24, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 31024, .adv_w = 411, .box_w = 27, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 31362, .adv_w = 662, .box_w = 42, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 31887, .adv_w = 406, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 32200, .adv_w = 411, .box_w = 28, .box_h = 34, .ofs_x = -2, .ofs_y = -9}, - {.bitmap_index = 32676, .adv_w = 383, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 32951, .adv_w = 258, .box_w = 14, .box_h = 44, .ofs_x = 2, .ofs_y = -9}, - {.bitmap_index = 33259, .adv_w = 220, .box_w = 5, .box_h = 44, .ofs_x = 4, .ofs_y = -9}, - {.bitmap_index = 33369, .adv_w = 258, .box_w = 14, .box_h = 44, .ofs_x = 0, .ofs_y = -9}, - {.bitmap_index = 33677, .adv_w = 428, .box_w = 23, .box_h = 8, .ofs_x = 2, .ofs_y = 12}, - {.bitmap_index = 33769, .adv_w = 308, .box_w = 16, .box_h = 15, .ofs_x = 2, .ofs_y = 18}, - {.bitmap_index = 33889, .adv_w = 231, .box_w = 9, .box_h = 9, .ofs_x = 3, .ofs_y = 9}, - {.bitmap_index = 33930, .adv_w = 736, .box_w = 47, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 35035, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 35840, .adv_w = 736, .box_w = 46, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 36783, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 37588, .adv_w = 506, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 38116, .adv_w = 736, .box_w = 45, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 39174, .adv_w = 736, .box_w = 44, .box_h = 47, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 40208, .adv_w = 828, .box_w = 52, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 41274, .adv_w = 736, .box_w = 46, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 42355, .adv_w = 828, .box_w = 52, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 43265, .adv_w = 736, .box_w = 46, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 44346, .adv_w = 368, .box_w = 23, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 44760, .adv_w = 552, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 45390, .adv_w = 828, .box_w = 52, .box_h = 44, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 46534, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 47339, .adv_w = 506, .box_w = 32, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 48091, .adv_w = 644, .box_w = 30, .box_h = 42, .ofs_x = 5, .ofs_y = -4}, - {.bitmap_index = 48721, .adv_w = 644, .box_w = 41, .box_h = 48, .ofs_x = 0, .ofs_y = -7}, - {.bitmap_index = 49705, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 50546, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 51387, .adv_w = 644, .box_w = 30, .box_h = 42, .ofs_x = 5, .ofs_y = -4}, - {.bitmap_index = 52017, .adv_w = 644, .box_w = 42, .box_h = 41, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 52878, .adv_w = 460, .box_w = 25, .box_h = 40, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 53378, .adv_w = 460, .box_w = 25, .box_h = 40, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 53878, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 54719, .adv_w = 644, .box_w = 41, .box_h = 10, .ofs_x = 0, .ofs_y = 12}, - {.bitmap_index = 54924, .adv_w = 828, .box_w = 52, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 55834, .adv_w = 920, .box_w = 58, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 57197, .adv_w = 828, .box_w = 54, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 58466, .adv_w = 736, .box_w = 46, .box_h = 42, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 59432, .adv_w = 644, .box_w = 40, .box_h = 25, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 59932, .adv_w = 644, .box_w = 40, .box_h = 25, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 60432, .adv_w = 920, .box_w = 58, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 61476, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 62281, .adv_w = 736, .box_w = 46, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 63362, .adv_w = 736, .box_w = 47, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 64467, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 65308, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 66272, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 67113, .adv_w = 644, .box_w = 41, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 67851, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 68656, .adv_w = 460, .box_w = 31, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 69385, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 70349, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 71313, .adv_w = 828, .box_w = 52, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 72223, .adv_w = 736, .box_w = 48, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 73351, .adv_w = 552, .box_w = 35, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 74174, .adv_w = 920, .box_w = 58, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 75392, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 76262, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 77132, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 78002, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 78872, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 79742, .adv_w = 920, .box_w = 58, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 80786, .adv_w = 644, .box_w = 36, .box_h = 47, .ofs_x = 2, .ofs_y = -6}, - {.bitmap_index = 81632, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 82596, .adv_w = 736, .box_w = 47, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 83701, .adv_w = 920, .box_w = 58, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 84716, .adv_w = 552, .box_w = 35, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 85539, .adv_w = 740, .box_w = 47, .box_h = 30, .ofs_x = 0, .ofs_y = 2} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 7, 0, 0, 0, - 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 33, 0, 20, -16, 0, 0, - 0, 0, -40, -44, 5, 35, 16, 13, - -29, 5, 36, 2, 31, 7, 24, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 44, 6, -5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 15, 0, -22, 0, 0, 0, 0, - 0, -15, 13, 15, 0, 0, -7, 0, - -5, 7, 0, -7, 0, -7, -4, -15, - 0, 0, 0, 0, -7, 0, 0, -10, - -11, 0, 0, -7, 0, -15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -7, - -7, 0, -11, 0, -20, 0, -89, 0, - 0, -15, 0, 15, 22, 1, 0, -15, - 7, 7, 24, 15, -13, 15, 0, 0, - -42, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -27, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -20, -9, -36, 0, -29, - -5, 0, 0, 0, 0, 1, 29, 0, - -22, -6, -2, 2, 0, -13, 0, 0, - -5, -54, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -59, -6, 28, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -30, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 24, - 0, 7, 0, 0, -15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 28, 6, - 2, 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, - -27, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 5, - 15, 7, 22, -7, 0, 0, 15, -7, - -24, -101, 5, 20, 15, 1, -10, 0, - 26, 0, 24, 0, 24, 0, -68, 0, - -9, 22, 0, 24, -7, 15, 7, 0, - 0, 2, -7, 0, 0, -13, 59, 0, - 59, 0, 22, 0, 31, 10, 13, 22, - 0, 0, 0, -27, 0, 0, 0, 0, - 2, -5, 0, 5, -13, -10, -15, 5, - 0, -7, 0, 0, 0, -29, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -48, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, -40, 0, -46, 0, 0, 0, - 0, -5, 0, 73, -9, -10, 7, 7, - -7, 0, -10, 7, 0, 0, -39, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -71, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -46, 0, 44, 0, 0, -27, 0, - 24, 0, -50, -71, -50, -15, 22, 0, - 0, -49, 0, 9, -17, 0, -11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 22, -90, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 35, 0, 5, 0, 0, 0, - 0, 0, 5, 5, -9, -15, 0, -2, - -2, -7, 0, 0, -5, 0, 0, 0, - -15, 0, -6, 0, -17, -15, 0, -18, - -24, -24, -14, 0, -15, 0, -15, 0, - 0, 0, 0, -6, 0, 0, 7, 0, - 5, -7, 0, 2, 0, 0, 0, 7, - -5, 0, 0, 0, -5, 7, 7, -2, - 0, 0, 0, -14, 0, -2, 0, 0, - 0, 0, 0, 2, 0, 10, -5, 0, - -9, 0, -13, 0, 0, -5, 0, 22, - 0, 0, -7, 0, 0, 0, 0, 0, - -2, 2, -5, -5, 0, 0, -7, 0, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -4, -4, 0, -7, -9, 0, - 0, 0, 0, 0, 2, 0, 0, -5, - 0, -7, -7, -7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -4, 0, 0, - 0, 0, -5, -10, 0, -11, 0, -22, - -5, -22, 15, 0, 0, -15, 7, 15, - 20, 0, -18, -2, -9, 0, -2, -35, - 7, -5, 5, -39, 7, 0, 0, 2, - -38, 0, -39, -6, -64, -5, 0, -37, - 0, 15, 21, 0, 10, 0, 0, 0, - 0, 1, 0, -13, -10, 0, -22, 0, - 0, 0, -7, 0, 0, 0, -7, 0, - 0, 0, 0, 0, -4, -4, 0, -4, - -10, 0, 0, 0, 0, 0, 0, 0, - -7, -7, 0, -5, -9, -6, 0, 0, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, -6, 0, -9, - 0, -5, 0, -15, 7, 0, 0, -9, - 4, 7, 7, 0, 0, 0, 0, 0, - 0, -5, 0, 0, 0, 0, 0, 5, - 0, 0, -7, 0, -7, -5, -9, 0, - 0, 0, 0, 0, 0, 0, 6, 0, - -6, 0, 0, 0, 0, -8, -11, 0, - -14, 0, 22, -5, 2, -24, 0, 0, - 20, -37, -38, -31, -15, 7, 0, -6, - -48, -13, 0, -13, 0, -15, 11, -13, - -47, 0, -20, 0, 0, 4, -2, 6, - -5, 0, 7, 1, -22, -28, 0, -37, - -18, -15, -18, -22, -9, -20, -1, -14, - -20, 4, 0, 2, 0, -7, 0, 0, - 0, 5, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -7, - 0, -4, 0, -2, -7, 0, -13, -16, - -16, -2, 0, -22, 0, 0, 0, 0, - 0, 0, -6, 0, 0, 0, 0, 3, - -4, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 35, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -13, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, 0, 0, - -14, 0, 0, 0, 0, -37, -22, 0, - 0, 0, -11, -37, 0, 0, -7, 7, - 0, -20, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -12, 0, 0, -14, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, -13, 0, - 0, 0, 0, 9, 0, 5, -15, -15, - 0, -7, -7, -9, 0, 0, 0, 0, - 0, 0, -22, 0, -7, 0, -11, -7, - 0, -16, -18, -22, -6, 0, -15, 0, - -22, 0, 0, 0, 0, 59, 0, 0, - 4, 0, 0, -10, 0, 7, 0, -32, - 0, 0, 0, 0, 0, -68, -13, 24, - 22, -6, -31, 0, 7, -11, 0, -37, - -4, -10, 7, -52, -7, 10, 0, 11, - -26, -11, -27, -24, -31, 0, 0, -44, - 0, 42, 0, 0, -4, 0, 0, 0, - -4, -4, -7, -20, -24, -1, -68, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -7, 0, -4, -7, -11, 0, 0, - -15, 0, -7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, 0, -15, 0, 0, 15, - -2, 10, 0, -16, 7, -5, -2, -19, - -7, 0, -10, -7, -5, 0, -11, -13, - 0, 0, -6, -2, -5, -13, -9, 0, - 0, -7, 0, 7, -5, 0, -16, 0, - 0, 0, -15, 0, -13, 0, -13, -13, - 7, 0, 0, 0, 0, 0, 0, 0, - 0, -15, 7, 0, -10, 0, -5, -9, - -23, -5, -5, -5, -2, -5, -9, -2, - 0, 0, 0, 0, 0, -7, -6, -6, - 0, 0, 0, 0, 9, -5, 0, -5, - 0, 0, 0, -5, -9, -5, -7, -9, - -7, 0, 6, 29, -2, 0, -20, 0, - -5, 15, 0, -7, -31, -10, 11, 1, - 0, -35, -13, 7, -13, 5, 0, -5, - -6, -24, 0, -11, 4, 0, 0, -13, - 0, 0, 0, 7, 7, -15, -14, 0, - -13, -7, -11, -7, -7, 0, -13, 4, - -14, -13, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -13, 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, - -5, 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, -6, -7, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -11, 0, 0, -10, - 0, 0, -7, -7, 0, 0, 0, 0, - -7, 0, 0, 0, 0, -4, 0, 0, - 0, 0, 0, -5, 0, 0, 0, 0, - -11, 0, -15, 0, 0, 0, -24, 0, - 5, -16, 15, 1, -5, -35, 0, 0, - -16, -7, 0, -29, -18, -21, 0, 0, - -32, -7, -29, -28, -35, 0, -19, 0, - 6, 49, -10, 0, -17, -7, -2, -7, - -13, -20, -13, -27, -30, -17, -7, 0, - 0, -5, 0, 2, 0, 0, -52, -7, - 22, 16, -16, -27, 0, 2, -23, 0, - -37, -5, -7, 15, -68, -10, 2, 0, - 0, -48, -9, -38, -7, -54, 0, 0, - -52, 0, 43, 2, 0, -5, 0, 0, - 0, 0, -4, -5, -28, -5, 0, -48, - 0, 0, 0, 0, -24, 0, -7, 0, - -2, -21, -35, 0, 0, -4, -11, -22, - -7, 0, -5, 0, 0, 0, 0, -33, - -7, -24, -24, -6, -13, -18, -7, -13, - 0, -15, -7, -24, -11, 0, -9, -14, - -7, -14, 0, 4, 0, -5, -24, 0, - 15, 0, -13, 0, 0, 0, 0, 9, - 0, 5, -15, 30, 0, -7, -7, -9, - 0, 0, 0, 0, 0, 0, -22, 0, - -7, 0, -11, -7, 0, -16, -18, -22, - -6, 0, -15, 6, 29, 0, 0, 0, - 0, 59, 0, 0, 4, 0, 0, -10, - 0, 7, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 0, - -5, -15, 0, 0, 0, 0, 0, -4, - 0, 0, 0, -7, -7, 0, 0, -15, - -7, 0, 0, -15, 0, 13, -4, 0, - 0, 0, 0, 0, 0, 4, 0, 0, - 0, 0, 11, 15, 6, -7, 0, -24, - -12, 0, 22, -24, -24, -15, -15, 29, - 13, 7, -64, -5, 15, -7, 0, -7, - 8, -7, -26, 0, -7, 7, -10, -6, - -22, -6, 0, 0, 22, 15, 0, -21, - 0, -40, -10, 21, -10, -28, 2, -10, - -24, -24, -7, 29, 7, 0, -11, 0, - -20, 0, 6, 24, -17, -27, -29, -18, - 22, 0, 2, -54, -6, 7, -13, -5, - -17, 0, -16, -27, -11, -11, -6, 0, - 0, -17, -15, -7, 0, 22, 17, -7, - -40, 0, -40, -10, 0, -26, -43, -2, - -24, -13, -24, -21, 20, 0, 0, -10, - 0, -15, -7, 0, -7, -13, 0, 13, - -24, 7, 0, 0, -39, 0, -7, -16, - -13, -5, -22, -18, -24, -17, 0, -22, - -7, -17, -14, -22, -7, 0, 0, 2, - 35, -13, 0, -22, -7, 0, -7, -15, - -17, -20, -21, -28, -10, -15, 15, 0, - -11, 0, -37, -9, 4, 15, -24, -27, - -15, -24, 24, -7, 4, -68, -13, 15, - -16, -13, -27, 0, -22, -31, -9, -7, - -6, -7, -15, -22, -2, 0, 0, 22, - 21, -5, -48, 0, -44, -17, 18, -28, - -50, -15, -26, -31, -37, -24, 15, 0, - 0, 0, 0, -9, 0, 0, 7, -9, - 15, 5, -14, 15, 0, 0, -23, -2, - 0, -2, 0, 2, 2, -6, 0, 0, - 0, 0, 0, 0, -7, 0, 0, 0, - 0, 6, 22, 1, 0, -9, 0, 0, - 0, 0, -5, -5, -9, 0, 0, 0, - 2, 6, 0, 0, 0, 0, 6, 0, - -6, 0, 28, 0, 13, 2, 2, -10, - 0, 15, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 22, 0, 21, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -44, 0, -7, 13, 0, 22, - 0, 0, 73, 9, -15, -15, 7, 7, - -5, 2, -37, 0, 0, 35, -44, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -50, 28, 103, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -44, 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, -12, 0, 0, -14, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, -20, 0, - 0, 2, 0, 0, 7, 95, -15, -6, - 24, 20, -20, 7, 0, 0, 7, 7, - -10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -96, 21, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -21, - 0, 0, 0, -20, 0, 0, 0, 0, - -16, -4, 0, 0, 0, -16, 0, -9, - 0, -35, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -49, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, -7, 0, 0, -14, 0, -11, 0, - -20, 0, 0, 0, -13, 7, -9, 0, - 0, -20, -7, -17, 0, 0, -20, 0, - -7, 0, -35, 0, -8, 0, 0, -60, - -14, -29, -8, -26, 0, 0, -49, 0, - -20, -4, 0, 0, 0, 0, 0, 0, - 0, 0, -11, -13, -6, -13, 0, 0, - 0, 0, -16, 0, -16, 10, -8, 15, - 0, -5, -17, -5, -13, -14, 0, -9, - -4, -5, 5, -20, -2, 0, 0, 0, - -65, -6, -10, 0, -16, 0, -5, -35, - -7, 0, 0, -5, -6, 0, 0, 0, - 0, 5, 0, -5, -13, -5, 13, 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, 10, 0, 0, 0, 0, 0, - 0, -16, 0, -5, 0, 0, 0, -15, - 7, 0, 0, 0, -20, -7, -15, 0, - 0, -21, 0, -7, 0, -35, 0, 0, - 0, 0, -71, 0, -15, -27, -37, 0, - 0, -49, 0, -5, -11, 0, 0, 0, - 0, 0, 0, 0, 0, -7, -11, -4, - -11, 2, 0, 0, 13, -10, 0, 23, - 36, -7, -7, -22, 9, 36, 13, 16, - -20, 9, 31, 9, 21, 16, 20, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 46, 35, -13, -7, 0, -6, - 59, 32, 59, 0, 0, 0, 7, 0, - 0, 27, 0, 0, -12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -5, 0, - 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, -62, -9, -6, -30, - -36, 0, 0, -49, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -12, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -5, - 0, 0, 0, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 0, -62, -9, -6, - -30, -36, 0, 0, -29, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -6, 0, 0, 0, -17, 7, 0, -7, - 6, 13, 7, -22, 0, -1, -6, 7, - 0, 6, 0, 0, 0, 0, -18, 0, - -7, -5, -15, 0, -7, -29, 0, 46, - -7, 0, -16, -5, 0, -5, -13, 0, - -7, -21, -15, -9, 0, 0, 0, -12, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -5, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 0, 0, -62, - -9, -6, -30, -36, 0, 0, -49, 0, - 0, 0, 0, 0, 0, 37, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -12, 0, -24, -9, -7, 22, -7, -7, - -29, 2, -4, 2, -5, -20, 1, 16, - 1, 6, 2, 6, -18, -29, -9, 0, - -28, -14, -20, -31, -29, 0, -12, -15, - -9, -10, -6, -5, -9, -5, 0, -5, - -2, 11, 0, 11, -5, 0, 23, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -5, -7, -7, 0, 0, - -20, 0, -4, 0, -13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -44, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -7, -7, 0, -10, - 0, 0, 0, 0, -6, 0, 0, -13, - -7, 7, 0, -13, -14, -5, 0, -21, - -5, -16, -5, -9, 0, -13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -49, 0, 24, 0, 0, -13, 0, - 0, 0, 0, -10, 0, -7, 0, 0, - -4, 0, 0, -5, 0, -17, 0, 0, - 31, -10, -24, -23, 5, 8, 8, -1, - -21, 5, 11, 5, 22, 5, 24, -5, - -20, 0, 0, -29, 0, 0, -22, -20, - 0, 0, -15, 0, -10, -13, 0, -11, - 0, -11, 0, -5, 11, 0, -6, -22, - -7, 27, 0, 0, -7, 0, -15, 0, - 0, 10, -17, 0, 7, -7, 6, 1, - 0, -24, 0, -5, -2, 0, -7, 8, - -6, 0, 0, 0, -30, -9, -16, 0, - -22, 0, 0, -35, 0, 27, -7, 0, - -13, 0, 4, 0, -7, 0, -7, -22, - 0, -7, 7, 0, 0, 0, 0, -5, - 0, 0, 7, -10, 2, 0, 0, -9, - -5, 0, -9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -46, 0, 16, 0, - 0, -6, 0, 0, 0, 0, 1, 0, - -7, -7, 0, 0, 0, 15, 0, 17, - 0, 0, 0, 0, 0, -46, -42, 2, - 32, 22, 13, -29, 5, 31, 0, 27, - 0, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 39, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_46 = { -#else -lv_font_t lv_font_montserrat_46 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 50, /*The maximum line height required by the font*/ - .base_line = 9, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -3, - .underline_thickness = 2, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_46*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_48.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_48.c deleted file mode 100644 index 1f731ac..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_48.c +++ /dev/null @@ -1,12569 +0,0 @@ -/******************************************************************************* - * Size: 48 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 48 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_48.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_48 - #define LV_FONT_MONTSERRAT_48 1 -#endif - -#if LV_FONT_MONTSERRAT_48 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x3f, 0xff, 0xff, 0x23, 0xff, 0xff, 0xf1, 0x2f, - 0xff, 0xff, 0x11, 0xff, 0xff, 0xf0, 0x1f, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xfe, - 0x0, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xfd, 0x0, - 0xef, 0xff, 0xc0, 0xd, 0xff, 0xfc, 0x0, 0xdf, - 0xff, 0xb0, 0xc, 0xff, 0xfa, 0x0, 0xcf, 0xff, - 0xa0, 0xb, 0xff, 0xf9, 0x0, 0xaf, 0xff, 0x80, - 0xa, 0xff, 0xf8, 0x0, 0x9f, 0xff, 0x70, 0x9, - 0xff, 0xf7, 0x0, 0x8f, 0xff, 0x60, 0x7, 0xff, - 0xf5, 0x0, 0x7f, 0xff, 0x50, 0x6, 0xff, 0xf4, - 0x0, 0x14, 0x44, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x7, 0xff, 0xf6, 0x4, 0xff, 0xff, - 0xf3, 0x9f, 0xff, 0xff, 0x79, 0xff, 0xff, 0xf6, - 0x3f, 0xff, 0xff, 0x10, 0x4c, 0xfc, 0x30, - - /* U+0022 "\"" */ - 0xff, 0xff, 0x0, 0x0, 0x4f, 0xff, 0xbf, 0xff, - 0xf0, 0x0, 0x4, 0xff, 0xfb, 0xef, 0xff, 0x0, - 0x0, 0x3f, 0xff, 0xae, 0xff, 0xf0, 0x0, 0x3, - 0xff, 0xfa, 0xef, 0xff, 0x0, 0x0, 0x3f, 0xff, - 0xad, 0xff, 0xe0, 0x0, 0x2, 0xff, 0xf9, 0xdf, - 0xfe, 0x0, 0x0, 0x2f, 0xff, 0x9c, 0xff, 0xd0, - 0x0, 0x1, 0xff, 0xf8, 0xcf, 0xfd, 0x0, 0x0, - 0x1f, 0xff, 0x8c, 0xff, 0xc0, 0x0, 0x1, 0xff, - 0xf7, 0xbf, 0xfc, 0x0, 0x0, 0xf, 0xff, 0x7b, - 0xff, 0xc0, 0x0, 0x0, 0xff, 0xf7, 0xbf, 0xfb, - 0x0, 0x0, 0xf, 0xff, 0x61, 0x22, 0x10, 0x0, - 0x0, 0x22, 0x20, - - /* U+0023 "#" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x1, 0x88, 0x88, 0x88, 0xcf, 0xff, 0x88, 0x88, - 0x88, 0x88, 0x9f, 0xff, 0xb8, 0x88, 0x88, 0x83, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x68, 0x88, 0x88, 0x8d, 0xff, 0xe8, 0x88, 0x88, - 0x88, 0x89, 0xff, 0xfa, 0x88, 0x88, 0x87, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, - 0xff, 0xfd, 0xc8, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa1, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0xa, 0xff, 0xff, 0xfe, 0x95, 0x7f, 0xfc, 0x45, - 0x8c, 0xff, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, - 0xf8, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x1, 0x7e, - 0xf5, 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, - 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, - 0xf, 0xff, 0xfd, 0x0, 0x0, 0x6, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, - 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x6f, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0x20, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x30, - 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xb4, 0x6, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xfe, 0xcf, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x51, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x5a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xee, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x3, - 0xaf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x1b, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xfb, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, - 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xb0, 0x0, 0x0, 0xe, 0xff, 0xfc, - 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x90, 0xe, 0xf8, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, - 0xcf, 0xff, 0xf5, 0x6, 0xff, 0xfe, 0x71, 0x0, - 0x0, 0x6f, 0xfb, 0x0, 0x1, 0xbf, 0xff, 0xfd, - 0x0, 0xdf, 0xff, 0xff, 0xfb, 0x74, 0x37, 0xff, - 0xb3, 0x6a, 0xff, 0xff, 0xff, 0x40, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x48, 0xbe, 0xff, 0xff, 0xff, 0xda, - 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x88, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0025 "%" */ - 0x0, 0x0, 0x5, 0xbe, 0xfe, 0xc7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xfe, 0xcd, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xfe, 0x40, 0x0, 0x3c, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf2, 0x0, - 0x0, 0x1, 0xdf, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x5f, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, - 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x40, 0x0, 0x0, - 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0x50, 0x0, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, 0x8f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x40, 0x0, - 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x10, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x5f, 0xfd, 0x0, 0x0, 0x9f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf2, 0x0, 0x0, 0x1, 0xdf, 0xf7, 0x0, - 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x50, 0x0, 0x3c, - 0xff, 0xe0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xfe, 0xce, 0xff, 0xff, 0x30, 0x0, 0x9f, 0xff, - 0x20, 0x0, 0x16, 0xab, 0xb9, 0x40, 0x0, 0x0, - 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x4, 0xff, 0xf6, 0x0, 0x5, 0xef, 0xff, 0xff, - 0xfc, 0x30, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xfe, - 0xc7, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0x10, 0x3, 0xff, 0xfb, 0x30, 0x15, 0xef, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf6, 0x0, 0xd, 0xff, 0xa0, 0x0, - 0x0, 0x1d, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x3f, - 0xfe, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x10, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x0, - 0xdf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, - 0x10, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xdf, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xfd, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x70, 0x0, 0x0, 0xc, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, - 0x0, 0x2, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xfd, 0xdf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x39, 0xdf, 0xfd, 0x81, 0x0, 0x0, - - /* U+0026 "&" */ - 0x0, 0x0, 0x0, 0x0, 0x6, 0xad, 0xff, 0xec, - 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xa7, 0x68, 0xcf, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x5f, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf7, - 0x0, 0x6, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf6, - 0x3c, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfd, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xf6, 0x4, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x4f, 0xb6, 0x10, 0x0, 0x8, - 0xff, 0xff, 0xc1, 0x0, 0x4, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x5, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0xef, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, - 0x0, 0x2f, 0xff, 0xf0, 0x0, 0x5f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, - 0x9, 0xff, 0xfa, 0x0, 0xa, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, - 0xff, 0xff, 0x40, 0x0, 0xcf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xfe, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xe7, 0x30, 0x0, - 0x1, 0x59, 0xff, 0xff, 0xff, 0xef, 0xff, 0xfa, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0xef, - 0xff, 0xff, 0xff, 0xfe, 0x31, 0xdf, 0xff, 0xfa, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x10, 0x2, 0xef, 0xff, 0xc0, - 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb4, 0x0, 0x0, 0x2, 0xef, 0xe1, 0x0, - 0x0, 0x0, 0x2, 0x7a, 0xdf, 0xff, 0xed, 0xa6, - 0x10, 0x0, 0x0, 0x0, 0x2, 0xd3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0xff, 0xff, 0xf, 0xff, 0xf0, 0xef, 0xff, 0xe, - 0xff, 0xf0, 0xef, 0xff, 0xd, 0xff, 0xe0, 0xdf, - 0xfe, 0xc, 0xff, 0xd0, 0xcf, 0xfd, 0xc, 0xff, - 0xc0, 0xbf, 0xfc, 0xb, 0xff, 0xc0, 0xbf, 0xfb, - 0x1, 0x22, 0x10, - - /* U+0028 "(" */ - 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x2f, 0xff, 0xf5, - 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x7f, 0xff, 0xf0, - 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xff, 0xf0, - 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x4f, 0xff, 0xf3, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, - 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x6f, 0xff, - 0xf2, 0x0, 0x0, 0x6, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x4f, - 0xff, 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, - 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xf0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, - 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, - - /* U+0029 ")" */ - 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xc0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, - 0x0, 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xb0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x70, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x70, 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x90, 0x0, 0x0, 0xd, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, - 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, - 0xff, 0x90, 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1f, - 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x7, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe0, - 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, 0xf3, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x1f, 0xff, 0xf6, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x4f, 0xff, 0xf4, - 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xff, 0xc0, - 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, - - /* U+002A "*" */ - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, - 0xd, 0xff, 0x0, 0x0, 0x2a, 0x10, 0x5, 0xff, - 0xa1, 0x0, 0xdf, 0xf0, 0x0, 0x8f, 0xf8, 0x0, - 0xdf, 0xff, 0xf7, 0xc, 0xff, 0x5, 0xef, 0xff, - 0xf1, 0x2, 0xbf, 0xff, 0xfd, 0xef, 0xfb, 0xff, - 0xff, 0xd4, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x6, 0xef, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4d, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, - 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, - 0x0, 0x19, 0xff, 0xff, 0xee, 0xff, 0xcf, 0xff, - 0xfb, 0x20, 0xd, 0xff, 0xff, 0x80, 0xcf, 0xf0, - 0x6e, 0xff, 0xff, 0x10, 0x6f, 0xfb, 0x20, 0xd, - 0xff, 0x0, 0x19, 0xff, 0x90, 0x0, 0xb5, 0x0, - 0x0, 0xdf, 0xf0, 0x0, 0x3, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x44, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdf, - 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xd9, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, - - /* U+002C "," */ - 0x0, 0x57, 0x50, 0x0, 0xcf, 0xff, 0xb0, 0x7f, - 0xff, 0xff, 0x5a, 0xff, 0xff, 0xf9, 0x9f, 0xff, - 0xff, 0x83, 0xff, 0xff, 0xf5, 0x4, 0xef, 0xff, - 0x10, 0xd, 0xff, 0xb0, 0x1, 0xff, 0xf6, 0x0, - 0x5f, 0xff, 0x10, 0x9, 0xff, 0xb0, 0x0, 0xdf, - 0xf6, 0x0, 0x1f, 0xff, 0x10, 0x5, 0xff, 0xb0, - 0x0, - - /* U+002D "-" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, - - /* U+002E "." */ - 0x0, 0x79, 0x70, 0x1, 0xdf, 0xff, 0xc0, 0x8f, - 0xff, 0xff, 0x6b, 0xff, 0xff, 0xf9, 0xaf, 0xff, - 0xff, 0x73, 0xff, 0xff, 0xf1, 0x4, 0xcf, 0xc3, - 0x0, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xfe, - 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x75, 0x57, - 0xbf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, 0x0, - 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0x20, 0x8, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xd0, 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, - 0x5f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x7f, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf7, 0x9f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf9, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfa, - 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0xaf, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xfb, 0xaf, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xfa, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, - 0x7f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x5f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf5, 0x1f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf1, 0xd, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xd0, - 0x8, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x2, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0x20, 0x0, 0xbf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xfb, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, - 0x1, 0xbf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xfb, 0x76, 0x67, 0xbf, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xc8, 0x30, - 0x0, 0x0, 0x0, 0x0, - - /* U+0031 "1" */ - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x23, 0x33, 0x33, 0x34, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfb, - - /* U+0032 "2" */ - 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xff, 0xed, - 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, - 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xfa, 0x76, 0x55, 0x7a, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x1c, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, - 0x0, 0x19, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xbf, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf5, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x1, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, - - /* U+0033 "3" */ - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x38, 0xff, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xfd, 0xa7, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x13, 0x8e, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf2, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xe0, 0x6, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0x90, 0xe, 0xff, 0xfe, 0x72, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, - 0x10, 0x8f, 0xff, 0xff, 0xff, 0xd9, 0x76, 0x56, - 0x7a, 0xef, 0xff, 0xff, 0xf7, 0x0, 0x2d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x1, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x26, 0x9c, 0xef, 0xff, 0xec, 0x96, 0x10, 0x0, - 0x0, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x3, 0xbb, 0xbb, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0x42, 0x22, 0x22, 0x22, 0x22, 0x22, 0x7f, - 0xff, 0xf4, 0x22, 0x22, 0x21, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, - - /* U+0035 "5" */ - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf4, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xdc, 0x96, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x60, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2, 0x33, - 0x33, 0x33, 0x33, 0x45, 0x79, 0xdf, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xfa, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf6, 0x0, - 0xdf, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xf1, 0x6, 0xff, 0xff, 0xc5, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, - 0x90, 0xe, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x65, - 0x68, 0xcf, 0xff, 0xff, 0xfe, 0x10, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x7b, 0xde, 0xff, 0xfd, 0xb8, 0x40, 0x0, - 0x0, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xac, 0xef, - 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xb7, 0x53, 0x33, 0x57, - 0xbf, 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x17, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x50, 0x0, 0x5, 0xad, 0xef, 0xfe, - 0xb8, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, - 0x0, 0x0, 0x9, 0xff, 0xff, 0x22, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0xaf, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, 0xff, - 0xef, 0xff, 0xf9, 0x41, 0x0, 0x3, 0x8e, 0xff, - 0xff, 0xf8, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xc2, - 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xf2, - 0x9, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0x8f, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0x6, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf2, 0x3f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf4, 0xb, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0x30, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, - 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x7, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x70, 0x0, 0xd, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xfa, 0x41, 0x0, 0x3, - 0x8e, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x49, 0xce, 0xff, 0xfd, 0xa6, 0x10, - 0x0, 0x0, 0x0, - - /* U+0037 "7" */ - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xff, 0xf4, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xdf, 0xff, - 0xf4, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xc0, 0x9f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0x50, 0x9f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x0, - 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x9f, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xf1, 0x0, 0x25, 0x55, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, 0xff, 0xfe, - 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xef, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xf8, 0x41, 0x0, 0x1, 0x49, 0xff, - 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, 0xff, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xfe, - 0x0, 0x5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf4, 0x0, 0x9f, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x70, 0xa, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xf9, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, 0x7, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x3f, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0x10, 0x0, 0xbf, 0xff, 0xfc, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0x90, 0x0, - 0x1, 0xef, 0xff, 0xff, 0x95, 0x20, 0x0, 0x25, - 0xaf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0xff, 0xff, 0xdb, 0xbc, 0xdf, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0x1, 0xef, 0xff, 0xff, 0x93, - 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xd1, - 0x0, 0xbf, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x3f, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0x29, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf7, 0xcf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xad, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfc, 0xdf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xcc, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x8f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x73, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xf1, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, - 0x2e, 0xff, 0xff, 0xfd, 0x73, 0x0, 0x0, 0x14, - 0x8e, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, - 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x27, 0xac, 0xef, 0xff, 0xec, 0xa6, 0x20, - 0x0, 0x0, 0x0, - - /* U+0039 "9" */ - 0x0, 0x0, 0x0, 0x3, 0x8c, 0xef, 0xff, 0xdb, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xb5, 0x10, 0x0, 0x15, 0xbf, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0x70, - 0x0, 0xe, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0x20, 0x4, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf9, 0x0, 0x8f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xe0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, 0xaf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf9, 0x9, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xc0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x1, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xff, - 0xe4, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, - 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfb, 0x52, - 0x0, 0x1, 0x5b, 0xff, 0xff, 0xef, 0xff, 0xf3, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb8, 0xff, 0xff, 0x40, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x19, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x50, 0x9, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xec, - 0x84, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xcf, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0xbf, 0xfa, 0x74, 0x33, 0x45, 0x9d, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x69, 0xce, 0xff, 0xfe, 0xb9, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+003A ":" */ - 0x4, 0xcf, 0xc3, 0x3, 0xff, 0xff, 0xf2, 0xaf, - 0xff, 0xff, 0x7b, 0xff, 0xff, 0xf9, 0x8f, 0xff, - 0xff, 0x61, 0xef, 0xff, 0xc0, 0x0, 0x79, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x97, 0x0, 0x1d, 0xff, - 0xfc, 0x8, 0xff, 0xff, 0xf6, 0xbf, 0xff, 0xff, - 0x9a, 0xff, 0xff, 0xf7, 0x3f, 0xff, 0xff, 0x10, - 0x4c, 0xfc, 0x30, - - /* U+003B ";" */ - 0x4, 0xcf, 0xc3, 0x3, 0xff, 0xff, 0xf2, 0xaf, - 0xff, 0xff, 0x7b, 0xff, 0xff, 0xf9, 0x8f, 0xff, - 0xff, 0x61, 0xef, 0xff, 0xc0, 0x0, 0x79, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x75, 0x0, 0xc, 0xff, - 0xfb, 0x7, 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xff, - 0x99, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0x50, - 0x4e, 0xff, 0xf1, 0x0, 0xdf, 0xfb, 0x0, 0x1f, - 0xff, 0x60, 0x5, 0xff, 0xf1, 0x0, 0x9f, 0xfb, - 0x0, 0xd, 0xff, 0x60, 0x1, 0xff, 0xf1, 0x0, - 0x5f, 0xfb, 0x0, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6c, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x39, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, - 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0xff, 0xff, - 0x93, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, - 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x6, 0xcf, - 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, - 0x39, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x82, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, - 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, - 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, - 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0xff, - 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x39, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x36, - - /* U+003D "=" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xd9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xd9, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+003E ">" */ - 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xc5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, - 0xfe, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3a, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, - 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x9e, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, - 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x28, 0xef, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, - 0xfe, 0x92, 0x0, 0x0, 0x0, 0x2, 0x9e, 0xff, - 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x6, - 0xcf, 0xff, 0xff, 0xff, 0xe9, 0x20, 0x0, 0x0, - 0x0, 0x39, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, - 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xfe, - 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xe9, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x0, 0x0, 0x4, 0x8b, 0xdf, 0xff, 0xed, - 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc7, 0x43, - 0x22, 0x48, 0xef, 0xff, 0xff, 0xf3, 0x4, 0xff, - 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xa0, 0x2, 0xdf, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, - 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5d, 0xfc, 0x20, 0x0, 0x0, 0x0, - 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x37, 0x9c, 0xde, 0xff, 0xed, 0xc9, 0x63, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xae, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xdf, 0xff, 0xff, 0xfd, 0xa7, 0x54, - 0x33, 0x45, 0x7a, 0xdf, 0xff, 0xff, 0xfb, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x37, 0xab, 0xba, 0x73, 0x0, 0x0, 0x3b, - 0xbb, 0xa0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x6e, - 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x5f, 0xff, - 0xd0, 0x1, 0xdf, 0xff, 0x20, 0x0, 0x0, 0xe, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb1, 0x5f, 0xff, 0xd0, - 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x6f, 0xff, - 0x80, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xd0, 0x0, - 0x7, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xfe, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf9, 0x41, 0x1, - 0x38, 0xef, 0xff, 0xef, 0xff, 0xd0, 0x0, 0x0, - 0xef, 0xfa, 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6f, - 0xff, 0x10, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1f, 0xff, - 0x60, 0xf, 0xff, 0xb0, 0x0, 0x0, 0xc, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0xb, 0xff, 0xa0, - 0x2f, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x5f, - 0xff, 0x30, 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xd0, 0x0, 0x0, 0x4, 0xff, 0xf0, 0x8f, 0xff, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd0, - 0x0, 0x0, 0x1, 0xff, 0xf2, 0x9f, 0xfe, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0xff, 0xf3, 0xaf, 0xfd, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0xff, 0xf4, 0xbf, 0xfd, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0xff, 0xf4, 0xaf, 0xfd, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xff, - 0xf3, 0x9f, 0xfe, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, 0xf3, - 0x8f, 0xff, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xd0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x5f, - 0xff, 0x30, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x5, 0xff, 0xe0, 0x2f, 0xff, - 0x60, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x9, 0xff, 0xb0, 0xe, 0xff, 0xb0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0xf, 0xff, 0x60, 0x9, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x8f, 0xff, 0x10, 0x4, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x3, - 0xbf, 0xff, 0xde, 0xff, 0xfb, 0x0, 0x6, 0xff, - 0xf9, 0x0, 0x0, 0xdf, 0xfe, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xfc, 0xbc, 0xef, 0xff, - 0xff, 0x2a, 0xff, 0xff, 0xeb, 0xdf, 0xff, 0xe1, - 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2, - 0x8b, 0xef, 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x2, - 0x9e, 0xfe, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xd6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x9f, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, - 0xff, 0xfd, 0xa7, 0x55, 0x44, 0x56, 0x9b, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0xac, - 0xee, 0xff, 0xed, 0xb8, 0x51, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfe, - 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x70, 0x7f, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf9, 0x0, - 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x20, 0x0, 0x2f, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x9, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, 0xe, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x10, - 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf8, 0x0, 0xdf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xe0, - - /* U+0042 "B" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe8, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x7d, 0xff, 0xff, 0xfe, 0x0, - 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xf7, 0x0, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf1, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x10, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf0, 0xf, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0x70, 0xf, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xe0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x14, 0x8e, 0xff, 0xff, 0xf3, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x20, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0xf, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xff, 0xff, - 0xff, 0x30, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xfd, - 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf5, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xaf, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfd, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xfe, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xcf, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf8, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xaf, 0xff, 0xff, 0x3f, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x49, 0xff, - 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, - 0xc9, 0x61, 0x0, 0x0, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, - 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x65, 0x56, - 0x8b, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x5d, 0xff, 0xff, 0xf8, 0x0, 0x2, 0xff, - 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xe8, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0xd, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0x90, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x90, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfe, - 0x81, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xfd, 0x97, 0x55, 0x68, 0xbf, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xde, - 0xff, 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, - - /* U+0044 "D" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xdb, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, - 0x33, 0x45, 0x79, 0xdf, 0xff, 0xff, 0xff, 0xd2, - 0x0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, - 0xff, 0xd0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0x30, 0xf, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0x80, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfc, 0xf, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf0, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x2f, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0x5f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf2, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xc0, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf8, 0xf, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0x20, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xf9, 0x0, 0xf, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1b, 0xff, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x9f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xf, 0xff, - 0xfe, 0x33, 0x33, 0x33, 0x33, 0x34, 0x46, 0x9d, - 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xee, 0xc9, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0045 "E" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0xf, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xd2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x21, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfe, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, - - /* U+0046 "F" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x32, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0xff, 0xff, 0xd2, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x21, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xac, - 0xef, 0xff, 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xd9, - 0x75, 0x56, 0x7a, 0xef, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x82, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xd0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfd, 0x10, - 0x0, 0xd, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xc1, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x33, 0x20, - 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, - 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, - 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, - 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, - 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, - 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, - 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, - 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, - 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, - 0x0, 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xe0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x82, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x8f, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xd9, - 0x76, 0x56, 0x7a, 0xdf, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xad, - 0xef, 0xff, 0xdb, 0x95, 0x10, 0x0, 0x0, 0x0, - - /* U+0048 "H" */ - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 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, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, - - /* U+0049 "I" */ - 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, - 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, - 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, - 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, - 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, - 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, - 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, - 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, - 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, - 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, - 0xff, 0xff, 0xdf, 0xff, 0xfd, - - /* U+004A "J" */ - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x0, 0x0, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xfa, 0x0, 0x3d, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x70, 0x2e, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xf3, 0x1d, 0xff, - 0xfd, 0x30, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfd, - 0x2, 0xff, 0xff, 0xff, 0xc6, 0x43, 0x48, 0xef, - 0xff, 0xff, 0x60, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, - 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, - 0xed, 0xa6, 0x10, 0x0, 0x0, - - /* U+004B "K" */ - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x20, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0x50, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x1, - 0xdf, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0xc, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xd0, 0x0, 0xcf, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0xb, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xd0, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x68, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0xaf, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0xc, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0x30, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfc, - 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, - 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x40, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xe2, - - /* U+004C "L" */ - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe3, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - - /* U+004D "M" */ - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfc, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfc, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xef, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xee, 0xff, 0xfc, 0xff, 0xff, 0xab, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x6d, 0xff, 0xfc, 0xff, 0xff, - 0xa2, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xfc, 0xd, 0xff, 0xfc, - 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0xd, - 0xff, 0xfc, 0xff, 0xff, 0xa0, 0xe, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xa0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x5, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0x10, 0xd, 0xff, 0xfc, 0xff, 0xff, - 0xa0, 0x0, 0xbf, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf7, 0x0, 0xd, 0xff, 0xfc, - 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd0, 0x0, 0xd, - 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x8, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, - 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0xef, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xff, - 0xfb, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, 0x0, - 0x7f, 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, 0xfc, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0xc, 0xff, 0xfe, - 0x10, 0x1, 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, - 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x90, 0xa, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf2, 0x3f, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfb, 0xcf, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6e, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfc, - - /* U+004E "N" */ - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x7f, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0xaf, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x2, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x4, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x8, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0x70, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0x40, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xfe, 0x20, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xfa, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf7, - 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, - - /* U+004F "O" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xad, - 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, - 0xff, 0xc9, 0x65, 0x56, 0x8b, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x5c, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xfc, 0x0, 0x0, 0xe, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, - 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0x20, 0x1f, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf7, - 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfd, 0x9, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, - 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xf0, 0x9f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x8, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xd0, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xfa, 0x1, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0xc, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xf2, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0x50, 0x0, 0x7, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6e, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfc, - 0x96, 0x55, 0x68, 0xbf, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x7a, 0xde, 0xff, 0xed, 0xb8, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0050 "P" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, - 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x82, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, 0x34, 0x56, - 0xae, 0xff, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, - 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x50, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xf0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0x50, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, - 0xf5, 0x0, 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, - 0x34, 0x56, 0xae, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xad, - 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xc9, 0x65, 0x56, 0x8b, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xa1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0x40, 0x0, 0x6, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xc0, - 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x4f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xfa, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfd, 0x0, 0x9f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, - 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0x0, 0xaf, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x2f, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf7, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xf2, 0x0, 0x8, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, - 0x1, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xbf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x43, - 0x34, 0x69, 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x6a, 0xde, 0xff, 0xff, 0xff, 0xf7, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x4, 0xef, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0x94, 0x10, 0x25, 0xbf, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xcd, 0xc9, - 0x50, 0x0, 0x0, - - /* U+0052 "R" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, - 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x81, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, 0x34, 0x56, - 0xae, 0xff, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, - 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x50, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xf1, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xb0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0x60, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, - 0xf6, 0x0, 0xff, 0xff, 0xd2, 0x22, 0x22, 0x22, - 0x22, 0x35, 0x8d, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x50, - 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xf3, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xa0, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xf5, - - /* U+0053 "S" */ - 0x0, 0x0, 0x0, 0x0, 0x16, 0x9c, 0xef, 0xff, - 0xec, 0x96, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd8, 0x10, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xa6, 0x42, 0x23, 0x46, 0xad, - 0xff, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xff, 0xfa, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xf6, - 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x19, 0x0, 0x0, 0xf, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xfd, 0x95, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x49, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, - 0x9d, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7e, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, - 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x90, 0xe, 0xfa, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xf4, 0x6, 0xff, 0xff, 0xa4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xfd, 0x0, - 0xdf, 0xff, 0xff, 0xfe, 0xa6, 0x42, 0x22, 0x35, - 0x7c, 0xff, 0xff, 0xff, 0x40, 0x3, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, - 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x16, 0x9c, 0xef, 0xff, 0xed, 0xb8, 0x40, - 0x0, 0x0, 0x0, - - /* U+0054 "T" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x37, 0xff, 0xff, - 0x93, 0x33, 0x33, 0x33, 0x33, 0x33, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0055 "U" */ - 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, - 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, - 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x3f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf2, 0x2f, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf1, 0x1f, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf0, 0xf, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xe0, 0xc, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xb0, - 0x8, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, 0x4, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, 0x0, 0xdf, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xfb, 0x30, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, - 0xfd, 0x97, 0x55, 0x79, 0xdf, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x6a, 0xde, 0xff, 0xec, - 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+0056 "V" */ - 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x90, 0x0, 0xef, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x8f, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf4, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xd0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x1, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xf7, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x6f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, - 0xdf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xc0, 0x4, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xf2, 0xb, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x2f, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xaf, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0057 "W" */ - 0x4f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf5, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf0, 0xa, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xb0, 0x5, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, - 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xfb, 0x0, 0x0, 0x5f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0xf, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfd, 0xbf, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf8, 0x5f, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xb0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0xf, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xd0, 0xb, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x80, 0x5, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x20, 0x0, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, - 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf7, - 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0xe, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0xa, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, - 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x30, 0x0, - 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf4, 0x0, 0x0, 0xef, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x80, 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf9, 0x0, 0x3, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x8, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x1, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x40, 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x6, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x90, 0x3f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xfd, 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x8f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0x4f, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xef, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xdf, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xfc, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0058 "X" */ - 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x70, - 0x0, 0x8f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfb, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x0, - 0x0, 0x3f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x60, - 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, - 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, - 0x5f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, - 0x8f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe1, - 0xc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x40, - 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf9, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x60, 0x0, - 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x0, - 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x90, - 0x1e, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, - - /* U+0059 "Y" */ - 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, - 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x50, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xb0, 0x0, 0x1, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xf2, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, - 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, - 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, - 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf8, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+005A "Z" */ - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x5f, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfd, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x30, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, - - /* U+005B "[" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1f, 0xff, 0xff, 0xdd, 0xdd, 0xd1, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xdd, 0xdd, 0xd1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - - /* U+005C "\\" */ - 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf0, - - /* U+005D "]" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf1, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, - - /* U+005E "^" */ - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xbb, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x44, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x0, - 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xf7, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x1f, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xa0, - 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, - 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, - 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xa0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, 0x7f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, - 0x0, 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xfe, 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0xc, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xc0, 0x3f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf2, - - /* U+005F "_" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - - /* U+0060 "`" */ - 0x7, 0x88, 0x88, 0x50, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x2, 0xcf, 0xff, 0x70, - - /* U+0061 "a" */ - 0x0, 0x0, 0x0, 0x48, 0xbd, 0xef, 0xfd, 0xb8, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3, 0xff, - 0xff, 0xd9, 0x52, 0x11, 0x25, 0x9f, 0xff, 0xff, - 0xf2, 0x0, 0xa, 0xfc, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x2d, 0xff, 0xff, 0xa0, 0x0, 0x27, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x49, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x6, 0xff, 0xff, 0xfd, 0x86, 0x55, 0x55, - 0x55, 0x56, 0xff, 0xff, 0x80, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, - 0x5f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x88, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x9f, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x87, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xf8, 0x4f, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0x80, 0xef, 0xff, 0xfa, 0x20, 0x0, 0x0, - 0x17, 0xef, 0xff, 0xff, 0xf8, 0x5, 0xff, 0xff, - 0xff, 0xda, 0x9a, 0xcf, 0xff, 0xfe, 0xef, 0xff, - 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x2d, 0xff, 0xf8, 0x0, 0x4, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x10, 0xdf, 0xff, 0x80, - 0x0, 0x0, 0x49, 0xce, 0xff, 0xdb, 0x72, 0x0, - 0xd, 0xff, 0xf8, - - /* U+0062 "b" */ - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xb8, - 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, - 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0xa, - 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0x95, 0x21, 0x25, 0x9f, 0xff, 0xff, - 0xfd, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, 0x10, - 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf9, 0x0, - 0xaf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xf3, 0xa, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xaf, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xfa, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xba, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfb, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xaa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0xaf, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x4a, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfa, 0xa, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0x30, 0xaf, 0xff, 0xff, - 0xff, 0xa1, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0x90, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x52, 0x12, 0x59, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0xaf, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0xa, 0xff, 0xfc, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x3, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, - 0xa, 0xff, 0xfc, 0x0, 0x0, 0x38, 0xce, 0xff, - 0xeb, 0x83, 0x0, 0x0, 0x0, 0x0, - - /* U+0063 "c" */ - 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xfd, - 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, - 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x1d, 0xff, 0xff, 0xfe, 0x84, 0x21, 0x35, - 0xbf, 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xf8, - 0x5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xfe, 0x50, 0xd, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, - 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x81, 0x0, 0x5, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x50, - 0x0, 0xbf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x2, 0xcf, 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, - 0xfe, 0x84, 0x21, 0x35, 0xbf, 0xff, 0xff, 0xf2, - 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x27, 0xbd, 0xff, 0xfd, 0xa6, 0x10, 0x0, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xeb, 0x71, - 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x7, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x3f, - 0xff, 0xf6, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x33, 0xff, 0xff, 0x60, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7f, 0xff, 0xf6, 0x0, 0x2f, 0xff, - 0xff, 0xfe, 0x84, 0x21, 0x36, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xf6, - 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0x69, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0xcf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x6e, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x6f, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf6, 0xef, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x6c, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x9f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0x64, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xf6, 0xe, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x60, - 0x7f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xf6, 0x0, 0xdf, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0x60, 0x2, 0xff, 0xff, 0xff, 0xe8, - 0x42, 0x13, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0x60, 0x0, 0x3, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, - 0xb7, 0x20, 0x0, 0xf, 0xff, 0xf6, - - /* U+0065 "e" */ - 0x0, 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xeb, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, 0xff, 0x90, - 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x10, 0x0, 0x0, - 0x0, 0x5, 0xef, 0xff, 0xf4, 0x0, 0x6, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xfd, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, - 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x9f, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf0, 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xef, 0xff, - 0xc5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x51, 0xcf, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9c, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0x90, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x95, 0x31, - 0x23, 0x6b, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x27, 0xbd, 0xff, 0xfe, 0xc8, 0x40, 0x0, - 0x0, 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xef, 0xec, - 0x82, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xde, 0xff, 0xd0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xd4, 0x0, 0x2, 0x86, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x3, 0xdd, 0xdd, 0xff, 0xff, - 0xfd, 0xdd, 0xdd, 0xdc, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xec, - 0x83, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, 0x0, - 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, - 0xa, 0xff, 0xfb, 0x0, 0x0, 0x5e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, - 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xaa, 0xff, 0xfb, 0x0, 0x6f, - 0xff, 0xff, 0xfd, 0x84, 0x21, 0x24, 0x8e, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x2f, 0xff, 0xff, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xfb, 0xb, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xb2, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xfb, 0x7f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xbb, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0xef, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xbf, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfb, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xbe, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfb, 0xbf, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xb8, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, - 0x2f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb0, 0xbf, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xfb, 0x2, 0xff, 0xff, 0xfe, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xb0, 0x6, 0xff, 0xff, 0xff, 0xc7, 0x31, 0x1, - 0x37, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xef, 0xff, 0xb0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe, 0xff, - 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd4, 0x0, 0xef, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x16, 0xbe, 0xff, 0xff, 0xd9, 0x40, - 0x0, 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xe0, 0x0, 0x1f, 0xc2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf8, 0x0, - 0xa, 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, - 0xff, 0xd9, 0x53, 0x21, 0x23, 0x7b, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x6a, - 0xcd, 0xef, 0xfd, 0xc9, 0x61, 0x0, 0x0, 0x0, - 0x0, - - /* U+0068 "h" */ - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, - 0x0, 0x4, 0x8c, 0xef, 0xfe, 0xb7, 0x20, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x0, 0x3c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0xaf, 0xff, - 0xf0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe4, 0x0, 0xa, 0xff, 0xff, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xfd, 0x85, 0x33, 0x58, 0xef, - 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x60, - 0xaf, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xfd, 0xa, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xf1, 0xaf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x4a, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf6, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x7a, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf8, - - /* U+0069 "i" */ - 0x0, 0x37, 0x50, 0x0, 0x8f, 0xff, 0xd1, 0x3f, - 0xff, 0xff, 0x96, 0xff, 0xff, 0xfb, 0x4f, 0xff, - 0xff, 0x90, 0xaf, 0xff, 0xe1, 0x0, 0x58, 0x61, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, - 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, - 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, - 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, - 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, 0xff, - 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, - 0xaf, 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, - 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, - 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, - 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, - 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, - 0xff, 0x0, - - /* U+006A "j" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x61, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x72, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x0, - 0x3, 0xd5, 0x10, 0x4, 0xdf, 0xff, 0xf7, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, - 0x1, 0x6b, 0xef, 0xfe, 0xb6, 0x0, 0x0, 0x0, - - /* U+006B "k" */ - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x10, 0xaf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xd1, 0x0, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfd, 0x10, - 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xaf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x4, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf0, 0x0, 0x5f, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x6, - 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x5f, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0x90, 0x8, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x10, 0x0, - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xc0, 0x0, 0xaf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xf8, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x50, 0xaf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xf2, - - /* U+006C "l" */ - 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, - 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, - 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, - 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, - 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, - 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, - 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, - 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, - 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, - 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, - 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, - 0xff, 0xff, - - /* U+006D "m" */ - 0xaf, 0xff, 0xc0, 0x0, 0x5, 0xad, 0xff, 0xfd, - 0xa5, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8b, 0xef, - 0xfe, 0xc8, 0x40, 0x0, 0x0, 0xa, 0xff, 0xfc, - 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, - 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc3, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0xa, 0xff, 0xfc, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xfc, 0x74, 0x34, 0x6b, 0xff, 0xff, - 0xff, 0x9f, 0xff, 0xff, 0xb6, 0x43, 0x47, 0xcf, - 0xff, 0xff, 0xf1, 0xa, 0xff, 0xff, 0xff, 0xe4, - 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, - 0xfc, 0x20, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0x80, 0xaf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0xa, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xf2, 0xaf, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x6a, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0xaf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xf9, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x9a, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf9, 0xaf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x9a, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x9a, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf9, 0xaf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x9a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0xaf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x9a, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf9, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x9a, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf9, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x9a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, - - /* U+006E "n" */ - 0xaf, 0xff, 0xc0, 0x0, 0x4, 0x9c, 0xef, 0xfe, - 0xb7, 0x20, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x0, - 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, - 0x0, 0xaf, 0xff, 0xc0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe4, 0x0, 0xa, 0xff, 0xfc, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x85, - 0x33, 0x58, 0xef, 0xff, 0xff, 0xe0, 0xa, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfd, 0xa, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xf1, 0xaf, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x4a, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf6, 0xaf, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x7a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xf8, - - /* U+006F "o" */ - 0x0, 0x0, 0x0, 0x0, 0x38, 0xbe, 0xff, 0xed, - 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xfe, 0x84, 0x21, 0x25, 0xaf, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf3, - 0x0, 0x6, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xd0, 0x0, 0xdf, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0x50, 0x4f, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xfb, 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, 0xcf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x3e, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x7f, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf6, 0xef, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x6c, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, - 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0x3, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xb0, 0xd, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, - 0x0, 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xfd, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0xff, 0x30, 0x0, 0x1, 0xef, 0xff, 0xff, - 0xe8, 0x42, 0x12, 0x5a, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, - 0xfe, 0xda, 0x61, 0x0, 0x0, 0x0, 0x0, - - /* U+0070 "p" */ - 0xaf, 0xff, 0xc0, 0x0, 0x3, 0x8c, 0xef, 0xfe, - 0xb8, 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, - 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, - 0xa, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0x95, 0x21, 0x25, 0x9f, 0xff, - 0xff, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfb, - 0x10, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf9, - 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xf3, 0xa, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xaf, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xfa, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xba, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfb, 0xaf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xaa, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, - 0xaf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x4a, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfa, - 0xa, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0x30, 0xaf, 0xff, - 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x52, 0x12, 0x59, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0xaf, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xa, 0xff, - 0xff, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb1, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x2, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x38, 0xce, - 0xff, 0xeb, 0x83, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0071 "q" */ - 0x0, 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xeb, - 0x72, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, - 0xf, 0xff, 0xf6, 0x0, 0x0, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, - 0x60, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x5f, 0xff, 0xf6, 0x0, 0x2f, - 0xff, 0xff, 0xfe, 0x84, 0x21, 0x36, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, - 0xf6, 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0x69, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0xcf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x6e, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x6f, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf6, 0xef, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x6c, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, - 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0x64, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xf6, 0xe, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0x60, 0x7f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf6, 0x0, 0xdf, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, 0xdf, - 0xff, 0xff, 0xff, 0x60, 0x2, 0xff, 0xff, 0xff, - 0xe8, 0x42, 0x13, 0x6b, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0x60, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, - 0xfe, 0xb7, 0x10, 0x0, 0x3f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x60, - - /* U+0072 "r" */ - 0xaf, 0xff, 0xc0, 0x0, 0x4, 0x9c, 0xef, 0xa, - 0xff, 0xfc, 0x0, 0x5e, 0xff, 0xff, 0xf0, 0xaf, - 0xff, 0xc0, 0x9f, 0xff, 0xff, 0xff, 0xa, 0xff, - 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0xaf, 0xff, - 0xef, 0xff, 0xff, 0xd9, 0x88, 0xa, 0xff, 0xff, - 0xff, 0xfa, 0x20, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, 0xfe, 0xc9, - 0x61, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x4, 0xff, 0xff, 0xfb, - 0x52, 0x0, 0x1, 0x48, 0xdf, 0xfa, 0x0, 0xa, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xc2, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xfd, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xa7, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, - 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x26, 0x9c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x58, 0xdf, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xfa, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf8, 0x8, 0xfd, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x1f, - 0xff, 0xff, 0xa7, 0x32, 0x10, 0x13, 0x7d, 0xff, - 0xff, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x10, 0x0, 0x0, 0x0, 0x15, 0x8c, 0xde, - 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, - - /* U+0074 "t" */ - 0x0, 0x0, 0x7, 0x88, 0x85, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xdd, 0xdd, - 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xdc, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x71, 0x0, - 0x3a, 0x80, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x6a, 0xef, 0xfe, 0xb6, 0x0, - - /* U+0075 "u" */ - 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x1e, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf1, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0x1e, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf1, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x1e, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf1, 0xef, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x1e, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf1, 0xef, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x1e, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf1, 0xef, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x1e, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0xef, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x1e, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0xdf, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0x1d, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, - 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0x1a, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xf1, 0x6f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0x12, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xf1, 0xb, 0xff, 0xff, 0xe4, 0x0, 0x0, - 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0x10, 0x4f, - 0xff, 0xff, 0xfc, 0x74, 0x34, 0x6a, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0x10, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x4c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x91, 0x4, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x4, 0x8c, 0xef, 0xfe, 0xb7, - 0x20, 0x0, 0x4f, 0xff, 0xf1, - - /* U+0076 "v" */ - 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x7, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf3, 0x1, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xc0, 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x60, - 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0xb, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf8, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfc, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0x30, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, - 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x2, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf7, 0x8, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xfd, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xbf, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0077 "w" */ - 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa2, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xf4, 0xc, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, - 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x1, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xf3, 0x0, 0xb, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, - 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfc, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, 0x0, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf1, 0x0, 0x0, 0xa, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xc0, 0x9f, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xf6, 0x3, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, - 0x0, 0xef, 0xff, 0x60, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, - 0x7f, 0xff, 0xc0, 0x0, 0x0, 0x7, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x0, - 0x0, 0xe, 0xff, 0xf3, 0x0, 0x1, 0xff, 0xff, - 0x20, 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x4, 0xff, - 0xfd, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, - 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, - 0x0, 0x5f, 0xff, 0xd0, 0x0, 0x8, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf3, - 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x30, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x80, 0x6, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, - 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xfe, 0x0, 0xcf, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xe0, 0xa, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf4, 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x50, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x98, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, - 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xef, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - - /* U+0078 "x" */ - 0x7, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0x30, 0x0, 0x1e, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x60, 0x0, - 0x0, 0xcf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xf2, 0x0, 0x9, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xfd, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa1, 0xef, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xfe, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd7, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0x30, 0xaf, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf6, - 0x0, 0x1e, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xa0, 0x0, 0x3, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0x60, 0x0, 0x0, 0xa, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xf3, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0, - 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xa0, 0x1e, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf7, - - /* U+0079 "y" */ - 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x6, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0xf, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x50, 0x0, 0x1, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, 0x1f, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xf1, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x70, 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0x0, - 0xc, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x3, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xc0, 0xaf, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x50, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xb4, 0x10, 0x27, - 0xef, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, - 0xef, 0xec, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+007A "z" */ - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0x31, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x31, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, - - /* U+007B "{" */ - 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xff, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xdc, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xf0, 0x0, 0x0, 0x3e, 0xef, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xe7, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xdc, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x4e, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, - 0x7b, 0xef, 0xff, - - /* U+007C "|" */ - 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, - 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, - 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, - 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, - 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, - 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, - 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, - 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, - 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, - 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, - 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, - 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, - 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, - 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, - 0x50, - - /* U+007D "}" */ - 0x1f, 0xff, 0xeb, 0x60, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x1, 0xde, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, - 0x9f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xee, 0x0, 0x0, 0x0, - 0x1, 0xbf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, - 0xfe, 0x0, 0x0, 0x1, 0xde, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xe1, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xeb, 0x60, 0x0, 0x0, - 0x0, 0x0, - - /* U+007E "~" */ - 0x0, 0x0, 0x15, 0x88, 0x61, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x44, 0x40, 0x0, 0x5, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x2, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x9, 0xff, 0xd0, - 0x8, 0xff, 0xf9, 0x10, 0x4d, 0xff, 0xff, 0x60, - 0x0, 0x3f, 0xff, 0x90, 0xc, 0xff, 0xb0, 0x0, - 0x0, 0xbf, 0xff, 0xfd, 0xab, 0xff, 0xff, 0x30, - 0xf, 0xff, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x2f, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x2a, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, - 0xfe, 0xc6, 0x0, 0x0, - - /* U+00B0 "°" */ - 0x0, 0x0, 0x2, 0x68, 0x86, 0x20, 0x0, 0x0, - 0x0, 0x2, 0xcf, 0xff, 0xff, 0xfc, 0x30, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x3, 0xff, 0xfa, 0x30, 0x3, 0x9f, 0xff, 0x40, - 0xd, 0xff, 0x50, 0x0, 0x0, 0x5, 0xff, 0xe1, - 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, - 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, - 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, - 0xdf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, - 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf9, - 0x2f, 0xfe, 0x10, 0x0, 0x0, 0x1, 0xef, 0xf3, - 0x8, 0xff, 0xd4, 0x0, 0x0, 0x3d, 0xff, 0x90, - 0x0, 0xbf, 0xff, 0xda, 0xad, 0xff, 0xfc, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, 0x0, - - /* U+2022 "•" */ - 0x0, 0x5b, 0xdc, 0x60, 0x0, 0x9f, 0xff, 0xff, - 0x90, 0x5f, 0xff, 0xff, 0xff, 0x5b, 0xff, 0xff, - 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xdb, 0xff, - 0xff, 0xff, 0xfb, 0x6f, 0xff, 0xff, 0xff, 0x60, - 0xbf, 0xff, 0xff, 0xb0, 0x0, 0x7d, 0xfd, 0x80, - 0x0, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xee, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x72, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xa5, 0x10, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd8, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x61, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb7, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xe9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x38, 0xce, 0xff, 0xeb, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x38, 0xce, 0xff, 0xeb, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x38, 0xce, 0xff, 0xec, 0x83, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, 0x83, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F008 "" */ - 0x3d, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xd3, - 0xdf, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 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, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, - 0xdf, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xfd, - 0x3d, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xd3, - - /* U+F00B "" */ - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2b, 0xd6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x6d, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4c, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, - 0x0, 0x2, 0xcf, 0xfd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xc2, - 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xe2, 0x1, 0xef, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xe1, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x2b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x5f, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x7f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x49, 0xa4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xa9, 0x30, - 0x0, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x40, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x2, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xf9, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x50, - 0x5, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, - 0x9, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe0, - 0xc, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf2, - 0xf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, - 0x1f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf6, - 0x2f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf7, - 0x3f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, - 0x3f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, - 0x2f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, - 0x1f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf6, - 0xf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf4, - 0xb, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf2, - 0x8, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe0, - 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc9, 0x76, 0x56, 0x8b, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x7a, 0xdf, 0xff, 0xff, 0xfe, 0xc9, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x21, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x12, 0x33, 0x21, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x50, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xfd, 0x40, 0x0, 0x4, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x40, 0x0, 0x5, 0xef, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xfb, 0x20, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x2, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xea, 0x88, 0xae, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe6, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x4e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe4, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa1, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x6e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xea, 0x88, 0xae, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfb, 0x20, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x2, 0xbf, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xfe, 0x50, 0x0, 0x4, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x40, 0x0, 0x4, 0xdf, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x5, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xfc, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x12, 0x33, 0x21, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb1, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0xcf, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0xcf, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, - 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0x22, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x8, 0xff, 0x80, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xe4, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x4e, 0xff, 0xff, 0xff, - 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x2d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd2, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x8f, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0x6f, 0xff, 0xff, 0xf8, 0x0, 0x1, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, - 0x0, 0x8f, 0xff, 0xff, 0xf6, 0x9, 0xff, 0xff, - 0x50, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x0, 0x5, 0xff, 0xff, 0x90, - 0x0, 0xcf, 0xe3, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x3e, 0xfc, 0x0, 0x0, 0x17, 0x10, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x1, 0x71, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x4e, 0xe4, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x40, 0x4, 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, - 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0xdf, 0x80, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - - /* U+F01C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x50, - 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xe1, 0x8f, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd8, 0x0, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x7b, 0xef, 0xff, 0xff, 0xfc, 0x84, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x30, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x50, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x30, 0x0, 0x8, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd2, 0x6, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0xba, 0xab, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa5, 0x10, 0x0, 0x0, 0x1, 0x6c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xa9, 0x87, - 0x76, 0x54, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xaf, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x5, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x9, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x9, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x90, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x40, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x45, 0x67, - 0x78, 0x9a, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb6, 0x10, 0x0, 0x0, 0x1, 0x5a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0xba, 0xab, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x60, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x70, 0x1, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x4, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x5, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x49, 0xcf, 0xff, 0xff, 0xfe, 0xb8, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 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, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8e, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2f, 0xff, - 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x8f, 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0x70, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xa0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, - 0xfc, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x4f, 0xff, 0xb1, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x3, 0x85, 0x0, 0x0, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x75, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xd3, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0xdf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x3f, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0xb, 0xff, - 0xff, 0x30, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xc0, - 0x0, 0x4, 0xff, 0xff, 0x80, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x2, 0x74, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xf4, 0x0, 0x0, 0xdf, 0xff, 0xd0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, 0xff, - 0x90, 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, 0x0, - 0x8f, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x9f, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, - 0xff, 0x10, 0x0, 0x3f, 0xff, 0xf6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x80, - 0x0, 0x5, 0xff, 0xff, 0x60, 0x0, 0xf, 0xff, - 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, 0xa0, - 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x0, - 0xcf, 0xff, 0xc0, 0x0, 0xa, 0xff, 0xfd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x0, 0x9, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xff, - 0xf0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x0, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x0, - 0x9, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x0, 0xcf, - 0xff, 0xc0, 0x0, 0xa, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0xc, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0x80, 0x0, 0x5, 0xff, 0xff, 0x60, - 0x0, 0xf, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x0, 0x0, 0xc, - 0xff, 0xff, 0x10, 0x0, 0x3f, 0xff, 0xf6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, 0xff, 0x90, - 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x8f, - 0xff, 0xf2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x2, 0x74, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf4, - 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0xc, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x3f, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0xdf, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xc3, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xdf, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x75, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F03E "" */ - 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa5, 0x45, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x22, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa5, 0x45, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x2e, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x2c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, - - /* U+F043 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, - 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xbf, 0xff, 0xff, 0x70, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb7, 0xff, 0xff, 0xfc, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x3f, 0xff, 0xff, 0xf4, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0xdf, 0xff, 0xff, 0xd1, 0x0, - 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x5, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xd4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xfc, 0x73, 0x10, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbe, 0xff, - 0xfe, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F048 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0x80, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xf9, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 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, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xfe, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0xcf, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, 0xfd, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xfd, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7d, 0xfd, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F04C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x7d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, - - /* U+F04D "" */ - 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd8, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd8, 0x0, - - /* U+F051 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x9f, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x9f, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x8, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xbf, 0xfb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x8, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x8e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe8, 0x0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x89, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x0, 0x0, - - /* U+F054 "" */ - 0x0, 0x2, 0x98, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xcf, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x86, 0x10, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x1, 0x68, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0xcf, 0xff, 0xff, - 0xff, 0xfc, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x86, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, - 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F068 "" */ - 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x42, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3, 0x9b, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xb9, 0x30, - - /* U+F06E "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x47, 0xac, 0xef, 0xff, 0xfe, 0xca, - 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x61, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xba, 0x88, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x4, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xda, 0x40, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xfc, 0x20, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x20, 0x0, - 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0xdc, 0x98, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x4, 0x9d, 0xff, 0xda, 0x40, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, - 0x0, 0x4, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xba, 0x88, 0xab, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x37, 0x9c, 0xee, 0xff, 0xfe, - 0xca, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F070 "" */ - 0x0, 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x58, 0xad, 0xef, 0xff, 0xec, 0xa7, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xb1, - 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0xa8, 0x8a, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x10, - 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x2, - 0xdf, 0xfd, 0xa4, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0xcf, 0xff, - 0xff, 0xc2, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xee, - 0x30, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, - 0xff, 0xfb, 0xaf, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, - 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x98, 0x89, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x7a, 0xce, 0xff, 0xfe, 0xdc, 0x96, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, - 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0x0, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xfb, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xa8, 0x88, 0x88, 0x8a, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0xaa, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x51, 0x15, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x10, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x73, 0x37, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 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, 0xfc, 0x0, 0x0, 0x8, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3d, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x47, 0x88, 0x88, 0x88, 0x8e, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xe8, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xfd, 0x10, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xe2, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, - 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf3, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x4, 0x50, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x3f, 0xf4, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x2, 0xef, 0xff, 0x30, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x2e, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x1, 0xdf, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x47, 0x88, 0x88, 0x88, 0x8e, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xe8, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3d, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x46, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xd9, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x2f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf8, 0xa, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0xbf, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x30, - 0x0, 0xb, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x45, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, - 0x10, 0x0, - - /* U+F078 "" */ - 0x0, 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x35, 0x10, 0x0, 0x0, 0xb, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xe3, 0x0, 0x0, 0xbf, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x30, 0xa, - 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xe2, 0x2f, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd9, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xf0, - 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0x90, 0xf, 0xff, 0xff, 0xf0, 0x9, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x49, 0x60, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x6, 0x94, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, - 0x60, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x6, - 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0x90, 0xf, 0xff, - 0xff, 0xf0, 0x9, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xf0, - 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x51, 0x0, 0x0, 0x0, 0x0, 0x15, 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, - 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0xdf, 0x80, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xea, 0x63, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xb8, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x91, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x2, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x7e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, - 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xfe, 0xdd, 0xb9, 0x74, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x0, 0x0, 0x4, 0xad, 0xff, 0xda, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, - 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x77, - 0x51, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xfb, 0x20, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0x40, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xaf, 0xff, 0xff, 0xf7, 0x11, 0x7f, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x1, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0xf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1f, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0x71, 0x17, 0xff, 0xff, 0xff, 0x90, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xad, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xf7, 0x11, 0x7f, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x1, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x70, 0x0, - 0x7, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xa, 0xff, 0xff, 0xff, 0x71, 0x17, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, - 0xff, 0xff, 0xb2, 0x0, 0x0, 0x2, 0xcf, 0xff, - 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x57, 0x75, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x4a, 0xdf, 0xfd, 0xa4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xf, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x3d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x51, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x83, 0x0, 0x38, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x2d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x83, 0x0, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd8, 0x0, - - /* U+F0C9 "" */ - 0x39, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x93, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x2, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x39, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x93, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x2, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x93, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, - - /* U+F0E0 "" */ - 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, - 0x10, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x2, - 0xfa, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xaf, - 0xff, 0xd3, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x2d, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x10, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe4, 0x0, 0x1, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe4, 0x0, 0x1, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x10, 0x0, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x10, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, - 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x2, 0x9e, 0xe9, 0x20, 0x0, 0x9, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe7, 0x30, 0x13, 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, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, - - /* U+F0E7 "" */ - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, - 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc5, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xf, 0xb1, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xfe, 0x20, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xe2, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xfe, 0x20, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, - 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xfe, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xee, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x9e, 0xff, 0xff, 0xff, 0xea, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xc6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F11C "" */ - 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd8, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 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, 0xfd, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, - 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, - 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xf, - 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, - 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0x0, - 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, - 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, - 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, - 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, - 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x1, 0xdf, 0xf8, 0x0, - 0x0, 0x1e, 0xff, 0x80, 0x0, 0x1, 0xef, 0xf8, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0xbf, 0xf4, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, - 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xb, - 0xff, 0x40, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xbf, 0xf4, - 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0xbf, - 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xb, 0xff, 0x40, - 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, - 0x1e, 0xff, 0x80, 0x0, 0x1, 0xef, 0xf8, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd8, 0x0, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, 0xfc, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7d, 0xfc, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F15B "" */ - 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xfb, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x68, - 0xbd, 0xef, 0xff, 0xff, 0xfe, 0xdb, 0x86, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x8c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x93, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xec, 0xa9, 0x98, 0x89, 0x9a, 0xce, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x7b, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfa, - 0xb, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xbf, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x14, 0x7a, 0xce, 0xef, 0xfe, 0xec, 0xa7, - 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xfb, 0x0, 0x0, 0xb, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xb0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xca, 0x98, 0x89, - 0xac, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, - 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xce, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xec, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xcf, 0xfc, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfd, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xcf, 0xfc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x0, 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, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 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, 0xd0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 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, - 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 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, - 0xfd, 0x80, 0x0, 0x0, - - /* U+F241 "" */ - 0x0, 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, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 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, 0xd0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 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, - 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 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, - 0xfd, 0x80, 0x0, 0x0, - - /* U+F242 "" */ - 0x0, 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, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 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, 0xd0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 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, - 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 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, - 0xfd, 0x80, 0x0, 0x0, - - /* U+F243 "" */ - 0x0, 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, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 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, 0xd0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 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, - 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 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, - 0xfd, 0x80, 0x0, 0x0, - - /* U+F244 "" */ - 0x0, 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, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x0, 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, 0xd0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 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, - 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 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, - 0xfd, 0x80, 0x0, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, - 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbd, - 0xdc, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xfe, 0x99, 0x9c, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x18, 0xcc, 0xa3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x15, 0x66, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, - 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xd3, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xf9, 0x10, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xfe, 0x60, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x76, 0x79, 0xff, - 0xff, 0x97, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, - 0xff, 0xff, 0xff, 0xc3, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xa1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xbd, 0xc9, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, - 0x0, 0x1, 0xde, 0xee, 0xee, 0xee, 0xd8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xf6, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xfa, 0x88, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xbc, - 0xcd, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbd, - 0xef, 0xff, 0xec, 0xa7, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x71, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xf8, 0xaf, - 0xff, 0xff, 0xe0, 0x0, 0xac, 0x10, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, - 0x80, 0xa, 0xff, 0xff, 0xe0, 0x0, 0xaf, 0xd1, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x0, - 0x9f, 0xfd, 0x10, 0x1, 0xdf, 0xff, 0xff, 0xf6, - 0x7f, 0xff, 0xff, 0xff, 0x50, 0x0, 0xa, 0xff, - 0xe0, 0x0, 0x9f, 0xfe, 0x10, 0x0, 0xcf, 0xff, - 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x9f, 0xe0, 0x0, 0x9f, 0xe2, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x9, 0xe0, 0x0, 0x9e, 0x20, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x70, 0x0, - 0x72, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x1, 0xb0, 0x0, 0x85, 0x0, 0x1, 0xdf, - 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0xff, 0xff, - 0xfd, 0x10, 0x0, 0x1d, 0xe0, 0x0, 0x9f, 0x50, - 0x0, 0x1e, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xe0, 0x0, - 0x9f, 0xf4, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfa, - 0x6f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x1d, 0xff, - 0xe0, 0x0, 0x9f, 0xff, 0x20, 0x0, 0x4f, 0xff, - 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x2, - 0xef, 0xff, 0xe0, 0x0, 0x9f, 0xf8, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xf5, 0xf, 0xff, 0xff, 0xff, - 0xd1, 0x2e, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0x80, - 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf3, 0xc, 0xff, - 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xf0, 0x0, - 0xa8, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x30, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x58, 0xbd, 0xef, 0xff, - 0xed, 0xb9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd2, - 0x2d, 0xff, 0xff, 0xfd, 0x22, 0xdf, 0xff, 0xff, - 0xd2, 0x2d, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, - 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, - 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, - 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, - 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, - 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, - 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, - 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, - 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, - 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, - 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, - 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, - 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, - 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, - 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, - 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, - 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, - 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, - 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, - 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, - 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, - 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, - 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, - 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, - 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, - 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, - 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, - 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xd2, 0x2d, 0xff, 0xff, 0xfd, 0x22, - 0xdf, 0xff, 0xff, 0xd2, 0x2d, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0xff, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8e, 0x20, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xfe, 0x20, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x20, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0xcf, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0xcf, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3d, 0xfe, 0xca, 0x86, 0x53, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 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, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4, - 0x40, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4, 0x40, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 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, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4b, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x70, 0x0, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, - 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, - 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, 0x0, 0xf, - 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, - 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x80, - 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, - 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, - 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xf, - 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, - 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x6, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x1, 0xdf, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x2, 0xdf, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, - 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcd, 0xff, 0xff, 0xff, 0xf1, - 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcb, 0x91, 0x0, 0x0, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xfd, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 207, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 206, .box_w = 7, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 119, .adv_w = 300, .box_w = 13, .box_h = 14, .ofs_x = 3, .ofs_y = 20}, - {.bitmap_index = 210, .adv_w = 540, .box_w = 32, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 754, .adv_w = 477, .box_w = 27, .box_h = 46, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 1375, .adv_w = 647, .box_w = 38, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2021, .adv_w = 527, .box_w = 31, .box_h = 35, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 2564, .adv_w = 161, .box_w = 5, .box_h = 14, .ofs_x = 3, .ofs_y = 20}, - {.bitmap_index = 2599, .adv_w = 259, .box_w = 11, .box_h = 45, .ofs_x = 4, .ofs_y = -9}, - {.bitmap_index = 2847, .adv_w = 260, .box_w = 11, .box_h = 45, .ofs_x = 1, .ofs_y = -9}, - {.bitmap_index = 3095, .adv_w = 307, .box_w = 19, .box_h = 19, .ofs_x = 0, .ofs_y = 17}, - {.bitmap_index = 3276, .adv_w = 447, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 6}, - {.bitmap_index = 3518, .adv_w = 174, .box_w = 7, .box_h = 14, .ofs_x = 2, .ofs_y = -7}, - {.bitmap_index = 3567, .adv_w = 294, .box_w = 14, .box_h = 5, .ofs_x = 2, .ofs_y = 11}, - {.bitmap_index = 3602, .adv_w = 174, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3627, .adv_w = 270, .box_w = 21, .box_h = 46, .ofs_x = -2, .ofs_y = -5}, - {.bitmap_index = 4110, .adv_w = 512, .box_w = 28, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4586, .adv_w = 284, .box_w = 13, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4807, .adv_w = 441, .box_w = 26, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5249, .adv_w = 439, .box_w = 26, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5691, .adv_w = 514, .box_w = 31, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6218, .adv_w = 441, .box_w = 26, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6660, .adv_w = 474, .box_w = 27, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7119, .adv_w = 459, .box_w = 26, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7561, .adv_w = 495, .box_w = 27, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8020, .adv_w = 474, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8479, .adv_w = 174, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8570, .adv_w = 174, .box_w = 7, .box_h = 33, .ofs_x = 2, .ofs_y = -7}, - {.bitmap_index = 8686, .adv_w = 447, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 6}, - {.bitmap_index = 8928, .adv_w = 447, .box_w = 22, .box_h = 15, .ofs_x = 3, .ofs_y = 9}, - {.bitmap_index = 9093, .adv_w = 447, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 6}, - {.bitmap_index = 9335, .adv_w = 440, .box_w = 25, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9760, .adv_w = 794, .box_w = 46, .box_h = 43, .ofs_x = 2, .ofs_y = -9}, - {.bitmap_index = 10749, .adv_w = 562, .box_w = 37, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 11378, .adv_w = 581, .box_w = 29, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 11871, .adv_w = 555, .box_w = 31, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12398, .adv_w = 634, .box_w = 33, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 12959, .adv_w = 515, .box_w = 25, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 13384, .adv_w = 488, .box_w = 24, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 13792, .adv_w = 593, .box_w = 32, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14336, .adv_w = 624, .box_w = 29, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 14829, .adv_w = 238, .box_w = 5, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 14914, .adv_w = 394, .box_w = 21, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 15271, .adv_w = 552, .box_w = 30, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 15781, .adv_w = 456, .box_w = 24, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 16189, .adv_w = 733, .box_w = 36, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 16801, .adv_w = 624, .box_w = 29, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 17294, .adv_w = 645, .box_w = 37, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 17923, .adv_w = 554, .box_w = 28, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 18399, .adv_w = 645, .box_w = 38, .box_h = 41, .ofs_x = 2, .ofs_y = -7}, - {.bitmap_index = 19178, .adv_w = 558, .box_w = 28, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 19654, .adv_w = 477, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 20113, .adv_w = 451, .box_w = 28, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 20589, .adv_w = 607, .box_w = 30, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 21099, .adv_w = 547, .box_w = 36, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 21711, .adv_w = 865, .box_w = 52, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 22595, .adv_w = 517, .box_w = 32, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23139, .adv_w = 497, .box_w = 33, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 23700, .adv_w = 505, .box_w = 29, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 24193, .adv_w = 256, .box_w = 11, .box_h = 45, .ofs_x = 5, .ofs_y = -9}, - {.bitmap_index = 24441, .adv_w = 270, .box_w = 21, .box_h = 46, .ofs_x = -2, .ofs_y = -5}, - {.bitmap_index = 24924, .adv_w = 256, .box_w = 11, .box_h = 45, .ofs_x = 0, .ofs_y = -9}, - {.bitmap_index = 25172, .adv_w = 448, .box_w = 22, .box_h = 20, .ofs_x = 3, .ofs_y = 7}, - {.bitmap_index = 25392, .adv_w = 384, .box_w = 24, .box_h = 4, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 25440, .adv_w = 461, .box_w = 13, .box_h = 7, .ofs_x = 5, .ofs_y = 29}, - {.bitmap_index = 25486, .adv_w = 459, .box_w = 23, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 25785, .adv_w = 524, .box_w = 27, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 26271, .adv_w = 439, .box_w = 24, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 26583, .adv_w = 524, .box_w = 27, .box_h = 36, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 27069, .adv_w = 470, .box_w = 26, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 27407, .adv_w = 271, .box_w = 19, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 27749, .adv_w = 530, .box_w = 27, .box_h = 35, .ofs_x = 2, .ofs_y = -9}, - {.bitmap_index = 28222, .adv_w = 523, .box_w = 25, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 28672, .adv_w = 214, .box_w = 7, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 28802, .adv_w = 218, .box_w = 16, .box_h = 46, .ofs_x = -5, .ofs_y = -9}, - {.bitmap_index = 29170, .adv_w = 473, .box_w = 26, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 29638, .adv_w = 214, .box_w = 5, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 29728, .adv_w = 812, .box_w = 43, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 30287, .adv_w = 523, .box_w = 25, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 30612, .adv_w = 488, .box_w = 27, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 30963, .adv_w = 524, .box_w = 27, .box_h = 35, .ofs_x = 4, .ofs_y = -9}, - {.bitmap_index = 31436, .adv_w = 524, .box_w = 27, .box_h = 35, .ofs_x = 2, .ofs_y = -9}, - {.bitmap_index = 31909, .adv_w = 315, .box_w = 15, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 32104, .adv_w = 385, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 32390, .adv_w = 318, .box_w = 19, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 32694, .adv_w = 520, .box_w = 25, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 33019, .adv_w = 429, .box_w = 28, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 33383, .adv_w = 690, .box_w = 43, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 33942, .adv_w = 424, .box_w = 26, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 34280, .adv_w = 429, .box_w = 29, .box_h = 35, .ofs_x = -2, .ofs_y = -9}, - {.bitmap_index = 34788, .adv_w = 400, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 35087, .adv_w = 270, .box_w = 14, .box_h = 45, .ofs_x = 2, .ofs_y = -9}, - {.bitmap_index = 35402, .adv_w = 230, .box_w = 5, .box_h = 45, .ofs_x = 5, .ofs_y = -9}, - {.bitmap_index = 35515, .adv_w = 270, .box_w = 15, .box_h = 45, .ofs_x = 0, .ofs_y = -9}, - {.bitmap_index = 35853, .adv_w = 447, .box_w = 24, .box_h = 9, .ofs_x = 2, .ofs_y = 13}, - {.bitmap_index = 35961, .adv_w = 322, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 19}, - {.bitmap_index = 36089, .adv_w = 241, .box_w = 9, .box_h = 9, .ofs_x = 3, .ofs_y = 9}, - {.bitmap_index = 36130, .adv_w = 768, .box_w = 48, .box_h = 49, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 37306, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 38170, .adv_w = 768, .box_w = 48, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 39178, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 40042, .adv_w = 528, .box_w = 33, .box_h = 34, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 40603, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 41755, .adv_w = 768, .box_w = 46, .box_h = 48, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 42859, .adv_w = 864, .box_w = 54, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 43993, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 45145, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 46117, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 47269, .adv_w = 384, .box_w = 24, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 47725, .adv_w = 576, .box_w = 36, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 48409, .adv_w = 864, .box_w = 54, .box_h = 46, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 49651, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 50515, .adv_w = 528, .box_w = 33, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 51307, .adv_w = 672, .box_w = 30, .box_h = 44, .ofs_x = 6, .ofs_y = -4}, - {.bitmap_index = 51967, .adv_w = 672, .box_w = 42, .box_h = 50, .ofs_x = 0, .ofs_y = -7}, - {.bitmap_index = 53017, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 53920, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 54802, .adv_w = 672, .box_w = 30, .box_h = 44, .ofs_x = 6, .ofs_y = -4}, - {.bitmap_index = 55462, .adv_w = 672, .box_w = 44, .box_h = 42, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 56386, .adv_w = 480, .box_w = 26, .box_h = 42, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 56932, .adv_w = 480, .box_w = 26, .box_h = 42, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 57478, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 58360, .adv_w = 672, .box_w = 42, .box_h = 10, .ofs_x = 0, .ofs_y = 13}, - {.bitmap_index = 58570, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 59542, .adv_w = 960, .box_w = 60, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 60982, .adv_w = 864, .box_w = 56, .box_h = 48, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 62326, .adv_w = 768, .box_w = 48, .box_h = 44, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 63382, .adv_w = 672, .box_w = 42, .box_h = 26, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 63928, .adv_w = 672, .box_w = 42, .box_h = 26, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 64474, .adv_w = 960, .box_w = 60, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 65614, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 66478, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 67630, .adv_w = 768, .box_w = 49, .box_h = 49, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 68831, .adv_w = 672, .box_w = 43, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 69734, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 70742, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 71624, .adv_w = 672, .box_w = 42, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 72422, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 73286, .adv_w = 480, .box_w = 32, .box_h = 48, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 74054, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 75062, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 76070, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 77042, .adv_w = 768, .box_w = 50, .box_h = 50, .ofs_x = -1, .ofs_y = -7}, - {.bitmap_index = 78292, .adv_w = 576, .box_w = 36, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 79156, .adv_w = 960, .box_w = 60, .box_h = 44, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 80476, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 81376, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 82276, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 83176, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 84076, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 84976, .adv_w = 960, .box_w = 61, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 86135, .adv_w = 672, .box_w = 36, .box_h = 48, .ofs_x = 3, .ofs_y = -6}, - {.bitmap_index = 86999, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 88007, .adv_w = 768, .box_w = 49, .box_h = 49, .ofs_x = -1, .ofs_y = -7}, - {.bitmap_index = 89208, .adv_w = 960, .box_w = 60, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 90288, .adv_w = 576, .box_w = 36, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 91152, .adv_w = 773, .box_w = 49, .box_h = 31, .ofs_x = 0, .ofs_y = 3} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 8, 0, 0, 0, - 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 35, 0, 21, -17, 0, 0, - 0, 0, -42, -46, 5, 36, 17, 13, - -31, 5, 38, 2, 32, 8, 25, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 46, 6, -5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 15, 0, -23, 0, 0, 0, 0, - 0, -15, 13, 15, 0, 0, -8, 0, - -5, 8, 0, -8, 0, -8, -4, -15, - 0, 0, 0, 0, -8, 0, 0, -10, - -12, 0, 0, -8, 0, -15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -8, - -8, 0, -12, 0, -21, 0, -93, 0, - 0, -15, 0, 15, 23, 1, 0, -15, - 8, 8, 25, 15, -13, 15, 0, 0, - -44, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -28, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -21, -9, -38, 0, -31, - -5, 0, 0, 0, 0, 2, 30, 0, - -23, -6, -2, 2, 0, -13, 0, 0, - -5, -57, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -61, -6, 29, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -31, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 25, - 0, 8, 0, 0, -15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 29, 6, - 2, 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, - -28, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 5, - 15, 8, 23, -8, 0, 0, 15, -8, - -25, -105, 5, 21, 15, 2, -10, 0, - 28, 0, 25, 0, 25, 0, -71, 0, - -9, 23, 0, 25, -8, 15, 8, 0, - 0, 2, -8, 0, 0, -13, 61, 0, - 61, 0, 23, 0, 32, 10, 13, 23, - 0, 0, 0, -28, 0, 0, 0, 0, - 2, -5, 0, 5, -14, -10, -15, 5, - 0, -8, 0, 0, 0, -31, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -50, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, -42, 0, -48, 0, 0, 0, - 0, -5, 0, 76, -9, -10, 8, 8, - -7, 0, -10, 8, 0, 0, -41, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -74, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -48, 0, 46, 0, 0, -28, 0, - 25, 0, -52, -74, -52, -15, 23, 0, - 0, -51, 0, 9, -18, 0, -12, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 20, 23, -94, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 36, 0, 5, 0, 0, 0, - 0, 0, 5, 5, -9, -15, 0, -2, - -2, -8, 0, 0, -5, 0, 0, 0, - -15, 0, -6, 0, -18, -15, 0, -19, - -25, -25, -15, 0, -15, 0, -15, 0, - 0, 0, 0, -6, 0, 0, 8, 0, - 5, -8, 0, 2, 0, 0, 0, 8, - -5, 0, 0, 0, -5, 8, 8, -2, - 0, 0, 0, -15, 0, -2, 0, 0, - 0, 0, 0, 2, 0, 10, -5, 0, - -9, 0, -13, 0, 0, -5, 0, 23, - 0, 0, -8, 0, 0, 0, 0, 0, - -2, 2, -5, -5, 0, 0, -8, 0, - -8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -4, -4, 0, -8, -9, 0, - 0, 0, 0, 0, 2, 0, 0, -5, - 0, -8, -8, -8, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -5, 0, 0, - 0, 0, -5, -10, 0, -12, 0, -23, - -5, -23, 15, 0, 0, -15, 8, 15, - 21, 0, -19, -2, -9, 0, -2, -36, - 8, -5, 5, -41, 8, 0, 0, 2, - -40, 0, -41, -6, -67, -5, 0, -38, - 0, 15, 22, 0, 10, 0, 0, 0, - 0, 2, 0, -14, -10, 0, -23, 0, - 0, 0, -8, 0, 0, 0, -8, 0, - 0, 0, 0, 0, -4, -4, 0, -4, - -10, 0, 0, 0, 0, 0, 0, 0, - -8, -8, 0, -5, -9, -6, 0, 0, - -8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -6, -6, 0, -9, - 0, -5, 0, -15, 8, 0, 0, -9, - 4, 8, 8, 0, 0, 0, 0, 0, - 0, -5, 0, 0, 0, 0, 0, 5, - 0, 0, -8, 0, -8, -5, -9, 0, - 0, 0, 0, 0, 0, 0, 6, 0, - -6, 0, 0, 0, 0, -8, -12, 0, - -15, 0, 23, -5, 2, -25, 0, 0, - 21, -38, -40, -32, -15, 8, 0, -6, - -50, -14, 0, -14, 0, -15, 12, -14, - -49, 0, -21, 0, 0, 4, -2, 6, - -5, 0, 8, 1, -23, -29, 0, -38, - -18, -16, -18, -23, -9, -21, -2, -15, - -21, 5, 0, 2, 0, -8, 0, 0, - 0, 5, 0, 8, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -8, - 0, -4, 0, -2, -8, 0, -13, -17, - -17, -2, 0, -23, 0, 0, 0, 0, - 0, 0, -6, 0, 0, 0, 0, 3, - -5, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 37, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, - -8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -14, 0, 8, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, 0, 0, - -15, 0, 0, 0, 0, -38, -23, 0, - 0, 0, -12, -38, 0, 0, -8, 8, - 0, -21, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -12, 0, 0, -15, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 0, -14, 0, - 0, 0, 0, 9, 0, 5, -15, -15, - 0, -8, -8, -9, 0, 0, 0, 0, - 0, 0, -23, 0, -8, 0, -12, -8, - 0, -17, -19, -23, -6, 0, -15, 0, - -23, 0, 0, 0, 0, 61, 0, 0, - 4, 0, 0, -10, 0, 8, 0, -33, - 0, 0, 0, 0, 0, -71, -14, 25, - 23, -6, -32, 0, 8, -12, 0, -38, - -4, -10, 8, -54, -8, 10, 0, 12, - -27, -12, -28, -25, -32, 0, 0, -46, - 0, 44, 0, 0, -4, 0, 0, 0, - -4, -4, -8, -21, -25, -2, -71, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -8, 0, -4, -8, -12, 0, 0, - -15, 0, -8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -2, 0, -15, 0, 0, 15, - -2, 10, 0, -17, 8, -5, -2, -20, - -8, 0, -10, -8, -5, 0, -12, -13, - 0, 0, -6, -2, -5, -13, -9, 0, - 0, -8, 0, 8, -5, 0, -17, 0, - 0, 0, -15, 0, -13, 0, -13, -13, - 8, 0, 0, 0, 0, 0, 0, 0, - 0, -15, 8, 0, -11, 0, -5, -9, - -24, -5, -5, -5, -2, -5, -9, -2, - 0, 0, 0, 0, 0, -8, -6, -6, - 0, 0, 0, 0, 9, -5, 0, -5, - 0, 0, 0, -5, -9, -5, -7, -9, - -7, 0, 6, 31, -2, 0, -21, 0, - -5, 15, 0, -8, -32, -10, 12, 1, - 0, -36, -13, 8, -13, 5, 0, -5, - -6, -25, 0, -12, 4, 0, 0, -13, - 0, 0, 0, 8, 8, -15, -15, 0, - -13, -8, -12, -8, -8, 0, -13, 4, - -15, -13, 23, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -13, 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, - -5, 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, -6, -8, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -12, 0, 0, -10, - 0, 0, -8, -8, 0, 0, 0, 0, - -8, 0, 0, 0, 0, -4, 0, 0, - 0, 0, 0, -5, 0, 0, 0, 0, - -12, 0, -15, 0, 0, 0, -25, 0, - 5, -17, 15, 2, -5, -36, 0, 0, - -17, -8, 0, -31, -19, -22, 0, 0, - -33, -8, -31, -29, -37, 0, -20, 0, - 6, 51, -10, 0, -18, -8, -2, -8, - -13, -21, -14, -28, -31, -18, -8, 0, - 0, -5, 0, 2, 0, 0, -54, -7, - 23, 17, -17, -28, 0, 2, -24, 0, - -38, -5, -8, 15, -71, -10, 2, 0, - 0, -50, -9, -40, -8, -56, 0, 0, - -54, 0, 45, 2, 0, -5, 0, 0, - 0, 0, -4, -5, -29, -5, 0, -50, - 0, 0, 0, 0, -25, 0, -7, 0, - -2, -22, -36, 0, 0, -4, -12, -23, - -8, 0, -5, 0, 0, 0, 0, -35, - -8, -25, -25, -6, -13, -19, -8, -13, - 0, -15, -7, -25, -12, 0, -9, -15, - -8, -15, 0, 4, 0, -5, -25, 0, - 15, 0, -14, 0, 0, 0, 0, 9, - 0, 5, -15, 31, 0, -8, -8, -9, - 0, 0, 0, 0, 0, 0, -23, 0, - -8, 0, -12, -8, 0, -17, -19, -23, - -6, 0, -15, 6, 31, 0, 0, 0, - 0, 61, 0, 0, 4, 0, 0, -10, - 0, 8, 0, 0, 0, 0, 0, 0, - 0, 0, -2, 0, 0, 0, 0, 0, - -5, -15, 0, 0, 0, 0, 0, -4, - 0, 0, 0, -8, -8, 0, 0, -15, - -8, 0, 0, -15, 0, 13, -4, 0, - 0, 0, 0, 0, 0, 4, 0, 0, - 0, 0, 12, 15, 6, -7, 0, -25, - -12, 0, 23, -25, -25, -15, -15, 31, - 14, 8, -67, -5, 15, -8, 0, -8, - 8, -8, -27, 0, -8, 8, -10, -6, - -23, -6, 0, 0, 23, 15, 0, -22, - 0, -42, -10, 22, -10, -29, 2, -10, - -25, -25, -8, 31, 8, 0, -12, 0, - -21, 0, 6, 25, -18, -28, -31, -19, - 23, 0, 2, -56, -6, 8, -13, -5, - -18, 0, -17, -28, -12, -12, -6, 0, - 0, -18, -16, -8, 0, 23, 18, -8, - -42, 0, -42, -11, 0, -27, -45, -2, - -25, -13, -25, -22, 21, 0, 0, -10, - 0, -15, -7, 0, -8, -14, 0, 13, - -25, 8, 0, 0, -41, 0, -8, -17, - -13, -5, -23, -19, -25, -18, 0, -23, - -8, -18, -15, -23, -8, 0, 0, 2, - 36, -13, 0, -23, -8, 0, -8, -15, - -18, -21, -22, -29, -10, -15, 15, 0, - -12, 0, -38, -9, 5, 15, -25, -28, - -15, -25, 25, -8, 4, -71, -14, 15, - -17, -13, -28, 0, -23, -32, -9, -8, - -6, -8, -16, -23, -2, 0, 0, 23, - 22, -5, -50, 0, -46, -18, 18, -29, - -52, -15, -27, -32, -38, -25, 15, 0, - 0, 0, 0, -9, 0, 0, 8, -9, - 15, 5, -15, 15, 0, 0, -24, -2, - 0, -2, 0, 2, 2, -6, 0, 0, - 0, 0, 0, 0, -8, 0, 0, 0, - 0, 6, 23, 2, 0, -9, 0, 0, - 0, 0, -5, -5, -9, 0, 0, 0, - 2, 6, 0, 0, 0, 0, 6, 0, - -6, 0, 29, 0, 14, 2, 2, -10, - 0, 15, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 23, 0, 22, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -46, 0, -8, 13, 0, 23, - 0, 0, 76, 9, -15, -15, 8, 8, - -5, 2, -38, 0, 0, 37, -46, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -52, 29, 108, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -46, 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, -12, 0, 0, -15, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, -21, 0, - 0, 2, 0, 0, 8, 99, -15, -6, - 25, 21, -21, 8, 0, 0, 8, 8, - -10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -100, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -22, - 0, 0, 0, -21, 0, 0, 0, 0, - -17, -4, 0, 0, 0, -17, 0, -9, - 0, -36, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -51, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, -8, 0, 0, -15, 0, -12, 0, - -21, 0, 0, 0, -13, 8, -9, 0, - 0, -21, -8, -18, 0, 0, -21, 0, - -8, 0, -36, 0, -8, 0, 0, -62, - -15, -31, -8, -28, 0, 0, -51, 0, - -21, -4, 0, 0, 0, 0, 0, 0, - 0, 0, -12, -14, -6, -13, 0, 0, - 0, 0, -17, 0, -17, 10, -8, 15, - 0, -5, -18, -5, -13, -15, 0, -9, - -4, -5, 5, -21, -2, 0, 0, 0, - -68, -6, -11, 0, -17, 0, -5, -36, - -7, 0, 0, -5, -6, 0, 0, 0, - 0, 5, 0, -5, -13, -5, 13, 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, 10, 0, 0, 0, 0, 0, - 0, -17, 0, -5, 0, 0, 0, -15, - 8, 0, 0, 0, -21, -8, -15, 0, - 0, -22, 0, -8, 0, -36, 0, 0, - 0, 0, -74, 0, -15, -28, -38, 0, - 0, -51, 0, -5, -12, 0, 0, 0, - 0, 0, 0, 0, 0, -8, -12, -4, - -12, 2, 0, 0, 13, -10, 0, 24, - 38, -8, -8, -23, 9, 38, 13, 17, - -21, 9, 32, 9, 22, 17, 21, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 36, -14, -8, 0, -6, - 61, 33, 61, 0, 0, 0, 8, 0, - 0, 28, 0, 0, -12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -5, 0, - 0, 0, 0, 0, 0, 0, 0, 11, - 0, 0, 0, 0, -65, -9, -6, -31, - -38, 0, 0, -51, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -12, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -5, - 0, 0, 0, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 0, -65, -9, -6, - -31, -38, 0, 0, -31, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -6, 0, 0, 0, -18, 8, 0, -8, - 6, 14, 8, -23, 0, -2, -6, 8, - 0, 6, 0, 0, 0, 0, -19, 0, - -7, -5, -15, 0, -7, -31, 0, 48, - -8, 0, -17, -5, 0, -5, -13, 0, - -8, -22, -15, -9, 0, 0, 0, -12, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -5, 0, 0, 0, 0, 0, 0, - 0, 0, 11, 0, 0, 0, 0, -65, - -9, -6, -31, -38, 0, 0, -51, 0, - 0, 0, 0, 0, 0, 38, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -12, 0, -25, -9, -7, 23, -7, -8, - -31, 2, -5, 2, -5, -21, 2, 17, - 2, 6, 2, 6, -18, -31, -9, 0, - -29, -15, -21, -32, -30, 0, -12, -15, - -9, -10, -6, -5, -9, -5, 0, -5, - -2, 12, 0, 12, -5, 0, 24, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -5, -8, -8, 0, 0, - -21, 0, -4, 0, -13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -46, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, -8, 0, -10, - 0, 0, 0, 0, -6, 0, 0, -13, - -8, 8, 0, -13, -15, -5, 0, -22, - -5, -17, -5, -9, 0, -13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -51, 0, 25, 0, 0, -14, 0, - 0, 0, 0, -10, 0, -8, 0, 0, - -4, 0, 0, -5, 0, -18, 0, 0, - 32, -10, -25, -24, 5, 8, 8, -2, - -22, 5, 12, 5, 23, 5, 25, -5, - -21, 0, 0, -31, 0, 0, -23, -21, - 0, 0, -15, 0, -10, -13, 0, -12, - 0, -12, 0, -5, 12, 0, -6, -23, - -8, 28, 0, 0, -7, 0, -15, 0, - 0, 10, -18, 0, 8, -8, 6, 1, - 0, -25, 0, -5, -2, 0, -8, 8, - -6, 0, 0, 0, -31, -9, -17, 0, - -23, 0, 0, -36, 0, 28, -8, 0, - -14, 0, 5, 0, -8, 0, -8, -23, - 0, -8, 8, 0, 0, 0, 0, -5, - 0, 0, 8, -10, 2, 0, 0, -9, - -5, 0, -9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -48, 0, 17, 0, - 0, -6, 0, 0, 0, 0, 2, 0, - -8, -8, 0, 0, 0, 15, 0, 18, - 0, 0, 0, 0, 0, -48, -44, 2, - 33, 23, 13, -31, 5, 32, 0, 28, - 0, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 41, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_48 = { -#else -lv_font_t lv_font_montserrat_48 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 52, /*The maximum line height required by the font*/ - .base_line = 9, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -4, - .underline_thickness = 2, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_48*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_8.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_8.c deleted file mode 100644 index 6985792..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_montserrat_8.c +++ /dev/null @@ -1,1440 +0,0 @@ -/******************************************************************************* - * Size: 8 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 8 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_8.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_MONTSERRAT_8 - #define LV_FONT_MONTSERRAT_8 1 -#endif - -#if LV_FONT_MONTSERRAT_8 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x58, 0x57, 0x46, 0x23, 0x46, - - /* U+0022 "\"" */ - 0x73, 0x97, 0x29, 0x0, 0x0, - - /* U+0023 "#" */ - 0x4, 0x52, 0x60, 0x4b, 0x9b, 0xa3, 0x8, 0x7, - 0x20, 0x6c, 0x8c, 0x81, 0x9, 0x9, 0x0, - - /* U+0024 "$" */ - 0x0, 0x80, 0x2, 0xbd, 0xa2, 0x76, 0x80, 0x0, - 0x8d, 0x81, 0x0, 0x84, 0x95, 0xad, 0xb3, 0x0, - 0x80, 0x0, - - /* U+0025 "%" */ - 0x58, 0x70, 0x63, 0x8, 0x8, 0x36, 0x0, 0x27, - 0x58, 0x67, 0x10, 0x8, 0x27, 0x26, 0x6, 0x20, - 0x88, 0x20, - - /* U+0026 "&" */ - 0x9, 0x99, 0x0, 0xb, 0x3a, 0x0, 0x19, 0xc2, - 0x20, 0x83, 0x1a, 0xa0, 0x3a, 0x99, 0x92, 0x0, - 0x0, 0x0, - - /* U+0027 "'" */ - 0x72, 0x72, 0x0, - - /* U+0028 "(" */ - 0x8, 0x20, 0xb0, 0x1a, 0x3, 0x80, 0x1a, 0x0, - 0xb0, 0x8, 0x20, - - /* U+0029 ")" */ - 0x73, 0x19, 0xb, 0xc, 0xb, 0x19, 0x73, - - /* U+002A "*" */ - 0x48, 0x40, 0x6e, 0x80, 0x15, 0x10, - - /* U+002B "+" */ - 0x0, 0x20, 0x0, 0xa, 0x0, 0x49, 0xd9, 0x10, - 0xa, 0x0, - - /* U+002C "," */ - 0x0, 0x75, 0x71, - - /* U+002D "-" */ - 0x5a, 0x60, - - /* U+002E "." */ - 0x0, 0x74, - - /* U+002F "/" */ - 0x0, 0xa, 0x0, 0x2, 0x80, 0x0, 0x82, 0x0, - 0xa, 0x0, 0x4, 0x60, 0x0, 0x91, 0x0, 0x19, - 0x0, 0x0, - - /* U+0030 "0" */ - 0xa, 0xbb, 0x26, 0x60, 0x1b, 0x93, 0x0, 0xc6, - 0x60, 0x1b, 0xa, 0xbb, 0x20, - - /* U+0031 "1" */ - 0x9e, 0x20, 0xa2, 0xa, 0x20, 0xa2, 0xa, 0x20, - - /* U+0032 "2" */ - 0x6a, 0xb9, 0x0, 0x0, 0xc0, 0x0, 0x58, 0x0, - 0x87, 0x0, 0x9e, 0xaa, 0x30, - - /* U+0033 "3" */ - 0x7a, 0xbe, 0x0, 0xa, 0x20, 0x4, 0xa9, 0x0, - 0x0, 0xa2, 0x8a, 0xa9, 0x0, - - /* U+0034 "4" */ - 0x0, 0x49, 0x0, 0x3, 0xa0, 0x0, 0x1b, 0x8, - 0x20, 0x8b, 0xad, 0xb2, 0x0, 0x9, 0x30, - - /* U+0035 "5" */ - 0x3d, 0xaa, 0x5, 0x60, 0x0, 0x5b, 0xa8, 0x0, - 0x0, 0x93, 0x7a, 0xaa, 0x0, - - /* U+0036 "6" */ - 0x9, 0xaa, 0x36, 0x70, 0x0, 0x98, 0x9a, 0x26, - 0x80, 0x2a, 0x9, 0x9a, 0x40, - - /* U+0037 "7" */ - 0xca, 0xad, 0x67, 0x0, 0xc0, 0x0, 0x67, 0x0, - 0xc, 0x0, 0x6, 0x70, 0x0, - - /* U+0038 "8" */ - 0x1a, 0xab, 0x25, 0x60, 0x48, 0x1d, 0xad, 0x38, - 0x40, 0x1b, 0x3a, 0x9a, 0x40, - - /* U+0039 "9" */ - 0x4a, 0x99, 0xb, 0x10, 0x95, 0x3a, 0x99, 0x80, - 0x0, 0x95, 0x3a, 0xb8, 0x0, - - /* U+003A ":" */ - 0x74, 0x0, 0x0, 0x74, - - /* U+003B ";" */ - 0x74, 0x0, 0x0, 0x75, 0x62, 0x0, - - /* U+003C "<" */ - 0x0, 0x1, 0x0, 0x49, 0x80, 0x5c, 0x30, 0x0, - 0x16, 0x91, 0x0, 0x0, 0x0, - - /* U+003D "=" */ - 0x49, 0x99, 0x10, 0x0, 0x0, 0x49, 0x99, 0x10, - - /* U+003E ">" */ - 0x10, 0x0, 0x3, 0x98, 0x20, 0x0, 0x6d, 0x14, - 0x94, 0x0, 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x6a, 0xb9, 0x0, 0x0, 0xc0, 0x0, 0xa4, 0x0, - 0x3, 0x0, 0x2, 0x80, 0x0, - - /* U+0040 "@" */ - 0x3, 0x87, 0x78, 0x50, 0x28, 0x4a, 0x9c, 0x75, - 0x80, 0xb0, 0xa, 0x28, 0x80, 0xb0, 0xa, 0x28, - 0x28, 0x49, 0x99, 0xa6, 0x3, 0x88, 0x75, 0x0, - - /* U+0041 "A" */ - 0x0, 0xb, 0x90, 0x0, 0x3, 0x8a, 0x10, 0x0, - 0xb1, 0x39, 0x0, 0x4d, 0x99, 0xd1, 0xb, 0x10, - 0x3, 0x90, - - /* U+0042 "B" */ - 0x2d, 0x99, 0xb1, 0x2a, 0x0, 0x84, 0x2d, 0x9a, - 0xd1, 0x2a, 0x0, 0x39, 0x2d, 0x99, 0xb4, - - /* U+0043 "C" */ - 0x7, 0xba, 0xa2, 0x59, 0x0, 0x0, 0x93, 0x0, - 0x0, 0x59, 0x0, 0x0, 0x7, 0xba, 0xa2, - - /* U+0044 "D" */ - 0x2e, 0xab, 0xb3, 0x2, 0xa0, 0x1, 0xc0, 0x2a, - 0x0, 0x9, 0x22, 0xa0, 0x1, 0xc0, 0x2e, 0xab, - 0xb3, 0x0, - - /* U+0045 "E" */ - 0x2e, 0xaa, 0x82, 0xa0, 0x0, 0x2d, 0xaa, 0x42, - 0xa0, 0x0, 0x2e, 0xaa, 0x90, - - /* U+0046 "F" */ - 0x2e, 0xaa, 0x82, 0xa0, 0x0, 0x2e, 0xaa, 0x42, - 0xa0, 0x0, 0x2a, 0x0, 0x0, - - /* U+0047 "G" */ - 0x7, 0xba, 0xa2, 0x59, 0x0, 0x0, 0x93, 0x0, - 0x23, 0x59, 0x0, 0x47, 0x7, 0xba, 0xa3, - - /* U+0048 "H" */ - 0x2a, 0x0, 0x2a, 0x2a, 0x0, 0x2a, 0x2e, 0xaa, - 0xba, 0x2a, 0x0, 0x2a, 0x2a, 0x0, 0x2a, - - /* U+0049 "I" */ - 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, - - /* U+004A "J" */ - 0x5, 0xad, 0x50, 0x0, 0x75, 0x0, 0x7, 0x50, - 0x0, 0x84, 0x9, 0xab, 0x0, - - /* U+004B "K" */ - 0x2a, 0x1, 0xa2, 0x2a, 0x1b, 0x20, 0x2c, 0xc7, - 0x0, 0x2d, 0x19, 0x50, 0x2a, 0x0, 0xa4, - - /* U+004C "L" */ - 0x2a, 0x0, 0x2, 0xa0, 0x0, 0x2a, 0x0, 0x2, - 0xa0, 0x0, 0x2e, 0xaa, 0x70, - - /* U+004D "M" */ - 0x2c, 0x0, 0x3, 0xc2, 0xd7, 0x0, 0xbc, 0x29, - 0x92, 0x84, 0xc2, 0x91, 0xb9, 0xc, 0x29, 0x3, - 0x0, 0xc0, - - /* U+004E "N" */ - 0x2d, 0x10, 0x2a, 0x2c, 0xb0, 0x2a, 0x2a, 0x4b, - 0x2a, 0x2a, 0x5, 0xca, 0x2a, 0x0, 0x7a, - - /* U+004F "O" */ - 0x7, 0xbb, 0xb3, 0x5, 0x90, 0x1, 0xc1, 0x93, - 0x0, 0x8, 0x45, 0x90, 0x1, 0xc1, 0x7, 0xbb, - 0xb3, 0x0, - - /* U+0050 "P" */ - 0x2e, 0xaa, 0x90, 0x2a, 0x0, 0x84, 0x2a, 0x0, - 0xa3, 0x2e, 0xaa, 0x60, 0x2a, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x7, 0xbb, 0xb3, 0x5, 0x90, 0x1, 0xc1, 0x93, - 0x0, 0x8, 0x45, 0x90, 0x0, 0xc1, 0x7, 0xbb, - 0xb3, 0x0, 0x0, 0x39, 0x93, - - /* U+0052 "R" */ - 0x2e, 0xaa, 0x90, 0x2a, 0x0, 0x84, 0x2a, 0x0, - 0xa3, 0x2d, 0xac, 0x80, 0x2a, 0x1, 0xa1, - - /* U+0053 "S" */ - 0x2a, 0xaa, 0x27, 0x60, 0x0, 0x8, 0x98, 0x10, - 0x0, 0x49, 0x5a, 0xaa, 0x30, - - /* U+0054 "T" */ - 0xaa, 0xea, 0x60, 0xc, 0x0, 0x0, 0xc0, 0x0, - 0xc, 0x0, 0x0, 0xc0, 0x0, - - /* U+0055 "U" */ - 0x39, 0x0, 0x48, 0x39, 0x0, 0x48, 0x39, 0x0, - 0x48, 0x1c, 0x0, 0x66, 0x6, 0xba, 0xa0, - - /* U+0056 "V" */ - 0xb, 0x10, 0x5, 0x70, 0x49, 0x0, 0xb0, 0x0, - 0xc1, 0x57, 0x0, 0x4, 0x9c, 0x0, 0x0, 0xc, - 0x70, 0x0, - - /* U+0057 "W" */ - 0x94, 0x0, 0xf1, 0x3, 0x93, 0xa0, 0x69, 0x70, - 0x93, 0xc, 0xb, 0xb, 0xb, 0x0, 0x79, 0x80, - 0x89, 0x70, 0x1, 0xf2, 0x2, 0xf1, 0x0, - - /* U+0058 "X" */ - 0x58, 0x2, 0xa0, 0x8, 0x7b, 0x10, 0x0, 0xf5, - 0x0, 0xa, 0x4b, 0x10, 0x76, 0x2, 0xb0, - - /* U+0059 "Y" */ - 0xa, 0x20, 0xb, 0x0, 0x1b, 0x9, 0x30, 0x0, - 0x5b, 0x80, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, - 0x0, 0x0, - - /* U+005A "Z" */ - 0x6a, 0xac, 0xd0, 0x0, 0x1b, 0x10, 0x0, 0xb2, - 0x0, 0xb, 0x30, 0x0, 0x8d, 0xaa, 0xa0, - - /* U+005B "[" */ - 0x2d, 0x42, 0x90, 0x29, 0x2, 0x90, 0x29, 0x2, - 0x90, 0x2d, 0x40, - - /* U+005C "\\" */ - 0x19, 0x0, 0x0, 0xa0, 0x0, 0x5, 0x50, 0x0, - 0xa, 0x0, 0x0, 0x91, 0x0, 0x3, 0x70, 0x0, - 0xa, 0x0, - - /* U+005D "]" */ - 0x8c, 0xc, 0xc, 0xc, 0xc, 0xc, 0x8c, - - /* U+005E "^" */ - 0x3, 0xc0, 0x0, 0x94, 0x50, 0x27, 0x9, 0x0, - - /* U+005F "_" */ - 0x77, 0x77, - - /* U+0060 "`" */ - 0x6, 0x60, - - /* U+0061 "a" */ - 0x29, 0x98, 0x2, 0x98, 0xd0, 0x84, 0xc, 0x13, - 0xb9, 0xd1, - - /* U+0062 "b" */ - 0x48, 0x0, 0x0, 0x48, 0x0, 0x0, 0x4c, 0xab, - 0x50, 0x4a, 0x0, 0xc0, 0x4a, 0x0, 0xc0, 0x4c, - 0xaa, 0x50, - - /* U+0063 "c" */ - 0x1a, 0xaa, 0x18, 0x40, 0x0, 0x84, 0x0, 0x1, - 0xaa, 0xa1, - - /* U+0064 "d" */ - 0x0, 0x0, 0xb0, 0x0, 0xb, 0x1a, 0xaa, 0xb9, - 0x40, 0x3b, 0x94, 0x2, 0xb1, 0xa9, 0x9b, - - /* U+0065 "e" */ - 0x19, 0x99, 0x19, 0x98, 0x86, 0x85, 0x1, 0x1, - 0xaa, 0xb1, - - /* U+0066 "f" */ - 0xa, 0xa0, 0x2a, 0x0, 0x9d, 0x70, 0x29, 0x0, - 0x29, 0x0, 0x29, 0x0, - - /* U+0067 "g" */ - 0x1a, 0x99, 0xb9, 0x40, 0x1c, 0x94, 0x2, 0xc1, - 0xaa, 0xab, 0x18, 0x9a, 0x30, - - /* U+0068 "h" */ - 0x48, 0x0, 0x4, 0x80, 0x0, 0x4c, 0x9b, 0x44, - 0x90, 0x1b, 0x48, 0x0, 0xc4, 0x80, 0xc, - - /* U+0069 "i" */ - 0x37, 0x0, 0x48, 0x48, 0x48, 0x48, - - /* U+006A "j" */ - 0x3, 0x70, 0x0, 0x3, 0x80, 0x38, 0x3, 0x80, - 0x38, 0x6b, 0x40, - - /* U+006B "k" */ - 0x48, 0x0, 0x4, 0x80, 0x0, 0x48, 0xa, 0x44, - 0x9c, 0x30, 0x4d, 0x6a, 0x4, 0x80, 0x77, - - /* U+006C "l" */ - 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, - - /* U+006D "m" */ - 0x4c, 0x9b, 0x89, 0xb4, 0x49, 0x3, 0xb0, 0xb, - 0x48, 0x2, 0xa0, 0xc, 0x48, 0x2, 0xa0, 0xc, - - /* U+006E "n" */ - 0x4c, 0x9b, 0x44, 0x90, 0x1b, 0x48, 0x0, 0xc4, - 0x80, 0xc, - - /* U+006F "o" */ - 0x1a, 0xaa, 0x18, 0x40, 0x3a, 0x84, 0x3, 0xa1, - 0xaa, 0xa1, - - /* U+0070 "p" */ - 0x4c, 0xab, 0x50, 0x4a, 0x0, 0xc0, 0x4a, 0x0, - 0xc0, 0x4c, 0xaa, 0x50, 0x48, 0x0, 0x0, - - /* U+0071 "q" */ - 0x1a, 0xa9, 0xb9, 0x40, 0x3b, 0x94, 0x3, 0xb1, - 0xaa, 0x9b, 0x0, 0x0, 0xb0, - - /* U+0072 "r" */ - 0x4b, 0xa0, 0x4a, 0x0, 0x48, 0x0, 0x48, 0x0, - - /* U+0073 "s" */ - 0x5b, 0x95, 0x87, 0x30, 0x3, 0x79, 0x7a, 0xa6, - - /* U+0074 "t" */ - 0x29, 0x0, 0x9d, 0x70, 0x29, 0x0, 0x29, 0x0, - 0xb, 0x90, - - /* U+0075 "u" */ - 0x57, 0x1, 0xb5, 0x70, 0x1b, 0x48, 0x3, 0xb0, - 0xa9, 0x9b, - - /* U+0076 "v" */ - 0xb, 0x0, 0x84, 0x5, 0x70, 0xb0, 0x0, 0xb7, - 0x50, 0x0, 0x6d, 0x0, - - /* U+0077 "w" */ - 0xb0, 0xe, 0x20, 0xa0, 0x55, 0x59, 0x82, 0x80, - 0xa, 0xa0, 0xa8, 0x20, 0x9, 0x80, 0x6b, 0x0, - - /* U+0078 "x" */ - 0x67, 0x1b, 0x0, 0x9b, 0x10, 0xa, 0xb2, 0x7, - 0x51, 0xb0, - - /* U+0079 "y" */ - 0xb, 0x10, 0x83, 0x3, 0x81, 0xa0, 0x0, 0xaa, - 0x30, 0x0, 0x4a, 0x0, 0xa, 0xb2, 0x0, - - /* U+007A "z" */ - 0x59, 0xbb, 0x1, 0xb1, 0xb, 0x20, 0x9c, 0x98, - - /* U+007B "{" */ - 0xa, 0x60, 0xc0, 0xc, 0x5, 0xb0, 0xc, 0x0, - 0xc0, 0xa, 0x60, - - /* U+007C "|" */ - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, - - /* U+007D "}" */ - 0x97, 0x0, 0xb0, 0xb, 0x0, 0xd3, 0xb, 0x0, - 0xb0, 0x97, 0x0, - - /* U+007E "~" */ - 0x29, 0x35, 0x15, 0x6, 0x80, - - /* U+00B0 "°" */ - 0x26, 0x47, 0x7, 0x27, 0x50, - - /* U+2022 "•" */ - 0x0, 0x5d, 0x2, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbe, - 0x0, 0x8d, 0xff, 0xff, 0x0, 0xff, 0xe9, 0x5f, - 0x0, 0xf3, 0x0, 0xf, 0x0, 0xf0, 0x0, 0xf, - 0x0, 0xf0, 0xa, 0xff, 0xaf, 0xf0, 0xa, 0xfa, - 0xaf, 0xa0, 0x0, 0x0, - - /* U+F008 "" */ - 0xbd, 0xcc, 0xce, 0xab, 0x8b, 0x0, 0x7, 0x58, - 0xcd, 0x66, 0x6a, 0xac, 0xcd, 0x66, 0x6a, 0xac, - 0x8b, 0x0, 0x7, 0x58, 0xbd, 0xcc, 0xce, 0xab, - - /* U+F00B "" */ - 0x34, 0x14, 0x44, 0x43, 0xff, 0x7f, 0xff, 0xff, - 0xab, 0x4b, 0xbb, 0xba, 0xbc, 0x5c, 0xcc, 0xcb, - 0xff, 0x7f, 0xff, 0xff, 0x67, 0x17, 0x88, 0x86, - 0xff, 0x7f, 0xff, 0xff, 0xab, 0x4b, 0xbb, 0xba, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0x9, 0xfa, - 0xa9, 0x0, 0x9f, 0xa0, 0xaf, 0x99, 0xfa, 0x0, - 0xa, 0xff, 0xa0, 0x0, 0x0, 0x99, 0x0, 0x0, - - /* U+F00D "" */ - 0x63, 0x0, 0x82, 0xcf, 0x4a, 0xf4, 0x1d, 0xff, - 0x60, 0xa, 0xff, 0x30, 0xaf, 0x7d, 0xf3, 0xa6, - 0x1, 0xb3, - - /* U+F011 "" */ - 0x0, 0xc, 0x51, 0x0, 0x1d, 0x7d, 0x6e, 0x70, - 0x8d, 0xd, 0x65, 0xf1, 0xc7, 0xd, 0x60, 0xe6, - 0xd7, 0x6, 0x20, 0xe6, 0x9d, 0x0, 0x4, 0xf2, - 0x1e, 0xc7, 0x8f, 0x80, 0x1, 0x9d, 0xc6, 0x0, - - /* U+F013 "" */ - 0x0, 0xc, 0xc0, 0x0, 0x18, 0x8f, 0xf8, 0x81, - 0x8f, 0xfe, 0xef, 0xf8, 0x2f, 0xe0, 0xe, 0xf2, - 0x2f, 0xe0, 0xe, 0xf2, 0x8f, 0xfe, 0xef, 0xf8, - 0x18, 0x8f, 0xf8, 0x81, 0x0, 0xc, 0xc0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x30, 0x22, 0x0, 0x0, 0xaf, 0xaa, - 0xa0, 0x1, 0xda, 0x6a, 0xfa, 0x3, 0xe8, 0xbf, - 0xb8, 0xe3, 0xb6, 0xdf, 0xff, 0xd6, 0xb0, 0x8f, - 0xfb, 0xff, 0x80, 0x8, 0xfc, 0xc, 0xf8, 0x0, - 0x5b, 0x80, 0x8b, 0x50, - - /* U+F019 "" */ - 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, - 0x0, 0xf, 0xf0, 0x0, 0x7, 0xff, 0xff, 0x70, - 0x0, 0x9f, 0xf9, 0x0, 0x78, 0x7a, 0xa7, 0x87, - 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xbf, - - /* U+F01C "" */ - 0x5, 0xff, 0xff, 0xf5, 0x1, 0xe3, 0x0, 0x3, - 0xe1, 0xa8, 0x0, 0x0, 0x8, 0xaf, 0xff, 0x60, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, - 0xff, 0xff, 0xfd, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x3, 0x2, 0xbf, 0xfb, 0x3f, - 0x2e, 0x91, 0x18, 0xff, 0x9a, 0x0, 0x6c, 0xff, - 0x31, 0x0, 0x24, 0x44, 0x44, 0x42, 0x0, 0x13, - 0xff, 0xc6, 0x0, 0xb9, 0xfe, 0xa5, 0x5b, 0xd1, - 0xf2, 0x8c, 0xc8, 0x10, 0x30, 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x9, 0x34, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xab, 0xff, 0x0, 0x4f, 0x0, 0x1, - - /* U+F027 "" */ - 0x0, 0x9, 0x0, 0x34, 0xcf, 0x1, 0xff, 0xff, - 0x1b, 0xff, 0xff, 0x1b, 0xbb, 0xff, 0x1, 0x0, - 0x4f, 0x0, 0x0, 0x1, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x90, 0x23, - 0xb3, 0x34, 0xcf, 0x2, 0xc3, 0xbf, 0xff, 0xf1, - 0xb5, 0x6c, 0xff, 0xff, 0x1b, 0x56, 0xca, 0xbf, - 0xf0, 0x2c, 0x3a, 0x0, 0x4f, 0x2, 0x3b, 0x30, - 0x0, 0x10, 0x5, 0x40, - - /* U+F03E "" */ - 0xdf, 0xff, 0xff, 0xfd, 0xf0, 0x7f, 0xff, 0xff, - 0xf8, 0xcf, 0xb1, 0xbf, 0xfb, 0x5b, 0x0, 0xf, - 0xf0, 0x0, 0x0, 0xf, 0xdf, 0xff, 0xff, 0xfd, - - /* U+F043 "" */ - 0x0, 0xb4, 0x0, 0x3, 0xfb, 0x0, 0xb, 0xff, - 0x40, 0x6f, 0xff, 0xd0, 0xdf, 0xff, 0xf5, 0xf8, - 0xff, 0xf7, 0xaa, 0x8f, 0xf2, 0x1a, 0xfd, 0x40, - - /* U+F048 "" */ - 0x40, 0x0, 0x2f, 0x20, 0x8f, 0xf2, 0x9f, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0x5e, 0xff, 0xf2, - 0x2e, 0xfb, 0x10, 0x19, - - /* U+F04B "" */ - 0x0, 0x0, 0x0, 0xd, 0xa1, 0x0, 0x0, 0xff, - 0xf7, 0x0, 0xf, 0xff, 0xfd, 0x40, 0xff, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xd4, - 0xf, 0xff, 0x70, 0x0, 0xda, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x9b, 0x90, 0x9b, 0x9f, 0xff, 0xf, 0xff, 0xff, - 0xf0, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf0, - 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf0, 0xff, - 0xf2, 0x42, 0x2, 0x42, - - /* U+F04D "" */ - 0x24, 0x44, 0x44, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xbb, 0xbb, 0xb8, - - /* U+F051 "" */ - 0x20, 0x0, 0x4f, 0x80, 0x2f, 0xff, 0x92, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xfd, - 0x22, 0xf9, 0x10, 0x1b, - - /* U+F052 "" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x8f, 0x80, - 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, 0x5f, 0xff, - 0xff, 0x50, 0xe, 0xff, 0xff, 0xfe, 0x0, 0x58, - 0x88, 0x88, 0x50, 0xf, 0xff, 0xff, 0xff, 0x0, - 0xab, 0xbb, 0xbb, 0xa0, - - /* U+F053 "" */ - 0x0, 0x6, 0x20, 0x7, 0xf4, 0x7, 0xf5, 0x5, - 0xf6, 0x0, 0x1e, 0xb0, 0x0, 0x2e, 0xb0, 0x0, - 0x2e, 0x60, 0x0, 0x10, - - /* U+F054 "" */ - 0x26, 0x0, 0x4, 0xf7, 0x0, 0x5, 0xf7, 0x0, - 0x6, 0xf5, 0x0, 0xbe, 0x10, 0xbe, 0x20, 0x6e, - 0x20, 0x0, 0x10, 0x0, - - /* U+F067 "" */ - 0x0, 0x4, 0x0, 0x0, 0x3, 0xf3, 0x0, 0x0, - 0x4f, 0x40, 0x7, 0x8a, 0xfa, 0x87, 0xef, 0xff, - 0xff, 0xe0, 0x4, 0xf4, 0x0, 0x0, 0x4f, 0x40, - 0x0, 0x1, 0xb1, 0x0, - - /* U+F068 "" */ - 0x78, 0x88, 0x88, 0x7e, 0xff, 0xff, 0xfe, - - /* U+F06E "" */ - 0x0, 0x8c, 0xcc, 0x80, 0x1, 0xdd, 0x16, 0x3d, - 0xd1, 0xcf, 0x55, 0xed, 0x5f, 0xcb, 0xf5, 0xdf, - 0xd5, 0xfc, 0x1d, 0xd3, 0x73, 0xdd, 0x10, 0x8, - 0xdc, 0xc8, 0x10, - - /* U+F070 "" */ - 0x1d, 0x30, 0x0, 0x0, 0x0, 0x0, 0x5e, 0x8c, - 0xcc, 0xa2, 0x0, 0x0, 0x2d, 0xb4, 0x49, 0xf4, - 0x0, 0x7a, 0x1a, 0xff, 0x3f, 0xe1, 0x7, 0xfa, - 0x6, 0xf7, 0xff, 0x10, 0xa, 0xf3, 0x3, 0xef, - 0x40, 0x0, 0x6, 0xcc, 0x71, 0xbb, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x89, - - /* U+F071 "" */ - 0x0, 0x0, 0x3e, 0x30, 0x0, 0x0, 0x0, 0xc, - 0xfc, 0x0, 0x0, 0x0, 0x6, 0xfc, 0xf6, 0x0, - 0x0, 0x0, 0xed, 0xd, 0xe0, 0x0, 0x0, 0x8f, - 0xe0, 0xef, 0x80, 0x0, 0x2f, 0xff, 0x6f, 0xff, - 0x20, 0xb, 0xff, 0xe2, 0xef, 0xfa, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xd0, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x20, 0x44, 0x0, 0x4, 0xf5, - 0xef, 0xb1, 0xcf, 0xfd, 0x1, 0x8c, 0xd1, 0xc1, - 0x1, 0xdc, 0x81, 0xc1, 0xef, 0xc1, 0xbf, 0xfd, - 0x44, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, 0x20, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0xe4, 0x0, 0x4, - 0xfc, 0xf4, 0x4, 0xf8, 0x8, 0xf4, 0xb8, 0x0, - 0x8, 0xb0, 0x0, 0x0, 0x0, - - /* U+F078 "" */ - 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x8b, 0x4f, - 0x80, 0x8f, 0x40, 0x4f, 0xcf, 0x40, 0x0, 0x4e, - 0x40, 0x0, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x94, 0x14, 0x44, 0x40, 0x0, 0xbf, 0xf8, - 0xbb, 0xbf, 0x10, 0x8, 0xb7, 0x60, 0x0, 0xe1, - 0x0, 0xb, 0x40, 0x0, 0x1e, 0x20, 0x0, 0xb7, - 0x44, 0x5e, 0xfd, 0x50, 0x7, 0xbb, 0xb8, 0x5f, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - - /* U+F07B "" */ - 0xdf, 0xfb, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, - - /* U+F093 "" */ - 0x0, 0x9, 0x90, 0x0, 0x0, 0x9f, 0xf9, 0x0, - 0x7, 0xff, 0xff, 0x70, 0x0, 0xf, 0xf0, 0x0, - 0x0, 0xf, 0xf0, 0x0, 0x78, 0x4f, 0xf4, 0x87, - 0xff, 0xe8, 0x8e, 0xff, 0xff, 0xff, 0xfb, 0xbf, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xea, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, - 0xc, 0xfc, 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, - 0x0, 0x1d, 0xe0, 0x7, 0xdc, 0x4d, 0xf3, 0x0, - 0xef, 0xff, 0xe3, 0x0, 0xa, 0xec, 0x70, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x3, 0x0, 0x0, 0x0, 0xcd, 0xc0, 0x2d, 0xc0, - 0xe7, 0xf2, 0xee, 0x20, 0x4b, 0xff, 0xe2, 0x0, - 0x4, 0xff, 0xa0, 0x0, 0xcd, 0xf9, 0xf9, 0x0, - 0xe7, 0xe0, 0x7f, 0x90, 0x4a, 0x40, 0x4, 0x50, - - /* U+F0C5 "" */ - 0x0, 0xff, 0xf7, 0x47, 0x4f, 0xff, 0x47, 0xf8, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xff, 0xfb, 0x78, 0x88, - 0x7f, 0xff, 0xff, 0x0, - - /* U+F0C7 "" */ - 0x24, 0x44, 0x41, 0xf, 0xbb, 0xbb, 0xe2, 0xf0, - 0x0, 0xf, 0xdf, 0x44, 0x44, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xf9, 0x9, 0xff, 0xff, 0xd5, 0xdf, - 0xf8, 0xbb, 0xbb, 0xb8, - - /* U+F0C9 "" */ - 0x1, 0x11, 0x11, 0xf, 0xff, 0xff, 0xff, 0x1, - 0x11, 0x11, 0x5, 0x55, 0x55, 0x55, 0xcc, 0xcc, - 0xcc, 0xc0, 0x11, 0x11, 0x10, 0xff, 0xff, 0xff, - 0xf0, 0x11, 0x11, 0x10, - - /* U+F0E0 "" */ - 0xdf, 0xff, 0xff, 0xfd, 0x9f, 0xff, 0xff, 0xf9, - 0xb7, 0xff, 0xff, 0x7b, 0xfe, 0x7c, 0xc7, 0xef, - 0xff, 0xfa, 0xaf, 0xff, 0xdf, 0xff, 0xff, 0xfd, - - /* U+F0E7 "" */ - 0x7, 0xff, 0x60, 0x0, 0xaf, 0xf2, 0x0, 0xc, - 0xff, 0x87, 0x0, 0xef, 0xff, 0xb0, 0x7, 0x8e, - 0xf2, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x3e, 0x0, - 0x0, 0x6, 0x50, 0x0, - - /* U+F0EA "" */ - 0x79, 0xb9, 0x70, 0xf, 0xfc, 0xff, 0x0, 0xff, - 0x68, 0x83, 0xf, 0xf8, 0xff, 0x8b, 0xff, 0x8f, - 0xf8, 0x8f, 0xf8, 0xff, 0xff, 0x78, 0x8f, 0xff, - 0xf0, 0x7, 0xff, 0xff, - - /* U+F0F3 "" */ - 0x0, 0xd, 0x0, 0x0, 0x4e, 0xfe, 0x30, 0xd, - 0xff, 0xfd, 0x0, 0xff, 0xff, 0xf0, 0x3f, 0xff, - 0xff, 0x3b, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, - 0x60, 0x4, 0xf4, 0x0, - - /* U+F11C "" */ - 0xdf, 0xff, 0xff, 0xff, 0xdf, 0x18, 0x81, 0x88, - 0x1f, 0xfe, 0xaa, 0xca, 0xae, 0xff, 0xea, 0xac, - 0xaa, 0xef, 0xf1, 0x80, 0x0, 0x81, 0xfd, 0xff, - 0xff, 0xff, 0xfd, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4b, 0xc0, 0x0, 0x0, 0x5c, 0xff, 0xb0, 0x0, - 0x6e, 0xff, 0xff, 0x40, 0xd, 0xff, 0xff, 0xfc, - 0x0, 0x6, 0x88, 0xcf, 0xf5, 0x0, 0x0, 0x0, - 0x8f, 0xe0, 0x0, 0x0, 0x0, 0x8f, 0x60, 0x0, - 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F15B "" */ - 0xff, 0xf8, 0xb0, 0xff, 0xf8, 0xfb, 0xff, 0xfc, - 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - - /* U+F1EB "" */ - 0x0, 0x4, 0x77, 0x40, 0x0, 0x9, 0xff, 0xcc, - 0xff, 0x90, 0xcd, 0x40, 0x0, 0x4, 0xdc, 0x20, - 0x4b, 0xff, 0xb4, 0x2, 0x1, 0xfa, 0x55, 0xaf, - 0x10, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, - 0xee, 0x0, 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, - - /* U+F240 "" */ - 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, - 0xbb, 0xda, 0xf7, 0xee, 0xee, 0xee, 0x5f, 0xf8, - 0xff, 0xff, 0xff, 0x2f, 0xf5, 0x66, 0x66, 0x66, - 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, - - /* U+F241 "" */ - 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, - 0xbb, 0xda, 0xf7, 0xee, 0xee, 0x70, 0x5f, 0xf8, - 0xff, 0xff, 0x80, 0x2f, 0xf5, 0x66, 0x66, 0x54, - 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, - - /* U+F242 "" */ - 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, - 0xbb, 0xda, 0xf7, 0xee, 0xe0, 0x0, 0x5f, 0xf8, - 0xff, 0xf0, 0x0, 0x2f, 0xf5, 0x66, 0x64, 0x44, - 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, - - /* U+F243 "" */ - 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, - 0xbb, 0xda, 0xf7, 0xe7, 0x0, 0x0, 0x5f, 0xf8, - 0xf8, 0x0, 0x0, 0x2f, 0xf5, 0x65, 0x44, 0x44, - 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, - - /* U+F244 "" */ - 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, - 0xbb, 0xd8, 0xf0, 0x0, 0x0, 0x0, 0x5f, 0xf0, - 0x0, 0x0, 0x0, 0x2f, 0xf4, 0x44, 0x44, 0x44, - 0xad, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xd8, 0x0, 0x0, 0x0, 0x7, 0x36, 0x40, 0x0, - 0x9, 0xb1, 0x91, 0x11, 0x17, 0x20, 0xef, 0x88, - 0xd8, 0x88, 0xd9, 0x2, 0x20, 0x6, 0x48, 0x70, - 0x0, 0x0, 0x0, 0x6, 0xec, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x6, 0xdd, 0xc3, 0x4, 0xff, 0x3e, 0xd0, 0x9c, - 0xb5, 0x5f, 0x2b, 0xf7, 0x1a, 0xf4, 0xbf, 0x81, - 0xbf, 0x39, 0xc9, 0x64, 0xf2, 0x4f, 0xf3, 0xde, - 0x0, 0x6d, 0xed, 0x30, - - /* U+F2ED "" */ - 0x78, 0xdf, 0xd8, 0x77, 0x88, 0x88, 0x87, 0x8f, - 0xff, 0xff, 0x88, 0xcc, 0x8c, 0xc8, 0x8c, 0xc8, - 0xcc, 0x88, 0xcc, 0x8c, 0xc8, 0x8c, 0xc8, 0xcc, - 0x85, 0xff, 0xff, 0xf5, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x7e, 0x30, 0x0, 0x0, 0x4b, - 0xfe, 0x0, 0x0, 0x8f, 0x9b, 0x70, 0x0, 0x8f, - 0xff, 0x40, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x7f, - 0xff, 0x80, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, - 0xee, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0xaf, 0xff, 0xff, 0xfc, 0xb, 0xff, 0x9c, - 0xc9, 0xff, 0xaf, 0xff, 0xc1, 0x1c, 0xff, 0xaf, - 0xff, 0xc1, 0x1c, 0xff, 0xb, 0xff, 0x9c, 0xc9, - 0xff, 0x0, 0xaf, 0xff, 0xff, 0xfc, - - /* U+F7C2 "" */ - 0x7, 0xff, 0xfe, 0x17, 0xb6, 0x27, 0xc3, 0xfe, - 0xb9, 0xbe, 0x3f, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0x3f, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, - 0x3c, 0xff, 0xff, 0xe1, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x3, 0x0, 0x23, 0x0, 0x2, - 0xf0, 0x2e, 0x92, 0x22, 0x5f, 0xd, 0xff, 0xff, - 0xff, 0xf0, 0x2e, 0x92, 0x22, 0x21, 0x0, 0x23, - 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 34, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 34, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5, .adv_w = 50, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 10, .adv_w = 90, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 25, .adv_w = 79, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 43, .adv_w = 108, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 61, .adv_w = 88, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 79, .adv_w = 27, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 82, .adv_w = 43, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 93, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 100, .adv_w = 51, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 106, .adv_w = 74, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 116, .adv_w = 29, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 119, .adv_w = 49, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 121, .adv_w = 29, .box_w = 2, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 123, .adv_w = 45, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 141, .adv_w = 85, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 154, .adv_w = 47, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 162, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 175, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 188, .adv_w = 86, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 203, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 216, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 229, .adv_w = 77, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 242, .adv_w = 82, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 255, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 268, .adv_w = 29, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 272, .adv_w = 29, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 278, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 291, .adv_w = 74, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 299, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 312, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 325, .adv_w = 132, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 349, .adv_w = 94, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 367, .adv_w = 97, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 382, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 397, .adv_w = 106, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 415, .adv_w = 86, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 428, .adv_w = 81, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 441, .adv_w = 99, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 456, .adv_w = 104, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 471, .adv_w = 40, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 476, .adv_w = 66, .box_w = 5, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 489, .adv_w = 92, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 504, .adv_w = 76, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 517, .adv_w = 122, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 535, .adv_w = 104, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 550, .adv_w = 108, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 568, .adv_w = 92, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 583, .adv_w = 108, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 604, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 619, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 632, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 645, .adv_w = 101, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 660, .adv_w = 91, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 678, .adv_w = 144, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 701, .adv_w = 86, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 716, .adv_w = 83, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 734, .adv_w = 84, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 749, .adv_w = 43, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 760, .adv_w = 45, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 778, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 785, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 793, .adv_w = 64, .box_w = 4, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 795, .adv_w = 77, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 797, .adv_w = 77, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 807, .adv_w = 87, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 825, .adv_w = 73, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 835, .adv_w = 87, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 850, .adv_w = 78, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 860, .adv_w = 45, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 872, .adv_w = 88, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 885, .adv_w = 87, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 900, .adv_w = 36, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 906, .adv_w = 36, .box_w = 3, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 917, .adv_w = 79, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 932, .adv_w = 36, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 938, .adv_w = 135, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 954, .adv_w = 87, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 964, .adv_w = 81, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 974, .adv_w = 87, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 989, .adv_w = 87, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1002, .adv_w = 52, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1010, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1018, .adv_w = 53, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1028, .adv_w = 87, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1038, .adv_w = 72, .box_w = 6, .box_h = 4, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1050, .adv_w = 115, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1066, .adv_w = 71, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1076, .adv_w = 72, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 1091, .adv_w = 67, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1099, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1110, .adv_w = 38, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1117, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1128, .adv_w = 74, .box_w = 5, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 1133, .adv_w = 54, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 1138, .adv_w = 40, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 1141, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1177, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1201, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1233, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1257, .adv_w = 88, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1275, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1307, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1339, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1375, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1407, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1434, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1474, .adv_w = 64, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1488, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1509, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1545, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1569, .adv_w = 88, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1593, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1613, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1648, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1676, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1704, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1724, .adv_w = 112, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 1760, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1780, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1800, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1828, .adv_w = 112, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 1835, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1862, .adv_w = 160, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 1906, .adv_w = 144, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 1950, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1982, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2003, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2024, .adv_w = 160, .box_w = 11, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 2063, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2087, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2119, .adv_w = 128, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 2160, .adv_w = 112, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2192, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2220, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2248, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2276, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2300, .adv_w = 80, .box_w = 7, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 2328, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2356, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2384, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2411, .adv_w = 128, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 2461, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2485, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2525, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2555, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2585, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2615, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2645, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2675, .adv_w = 160, .box_w = 11, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2719, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2747, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2775, .adv_w = 128, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 2816, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2846, .adv_w = 96, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2874, .adv_w = 129, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, - 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, - 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, - 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, - 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, - 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, - 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, - 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 176, .range_length = 63475, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*----------------- - * KERNING - *----------------*/ - -/*Map glyph_ids to kern left classes*/ -static const uint8_t kern_left_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 0, 13, 14, 15, 16, 17, - 18, 19, 12, 20, 20, 0, 0, 0, - 21, 22, 23, 24, 25, 22, 26, 27, - 28, 29, 29, 30, 31, 32, 29, 29, - 22, 33, 34, 35, 3, 36, 30, 37, - 37, 38, 39, 40, 41, 42, 43, 0, - 44, 0, 45, 46, 47, 48, 49, 50, - 51, 45, 52, 52, 53, 48, 45, 45, - 46, 46, 54, 55, 56, 57, 51, 58, - 58, 59, 58, 60, 41, 0, 0, 9, - 61, 9, 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 -}; - -/*Map glyph_ids to kern right classes*/ -static const uint8_t kern_right_class_mapping[] = { - 0, 0, 1, 2, 0, 3, 4, 5, - 2, 6, 7, 8, 9, 10, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 12, - 18, 19, 20, 21, 21, 0, 0, 0, - 22, 23, 24, 25, 23, 25, 25, 25, - 23, 25, 25, 26, 25, 25, 25, 25, - 23, 25, 23, 25, 3, 27, 28, 29, - 29, 30, 31, 32, 33, 34, 35, 0, - 36, 0, 37, 38, 39, 39, 39, 0, - 39, 38, 40, 41, 38, 38, 42, 42, - 39, 42, 39, 42, 43, 44, 45, 46, - 46, 47, 46, 48, 0, 0, 35, 9, - 49, 9, 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 -}; - -/*Kern values between classes*/ -static const int8_t kern_class_values[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 3, -3, 0, 0, - 0, 0, -7, -8, 1, 6, 3, 2, - -5, 1, 6, 0, 5, 1, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 1, -1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 0, -4, 0, 0, 0, 0, - 0, -3, 2, 3, 0, 0, -1, 0, - -1, 1, 0, -1, 0, -1, -1, -3, - 0, 0, 0, 0, -1, 0, 0, -2, - -2, 0, 0, -1, 0, -3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -1, - -1, 0, -2, 0, -3, 0, -15, 0, - 0, -3, 0, 3, 4, 0, 0, -3, - 1, 1, 4, 3, -2, 3, 0, 0, - -7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -3, -2, -6, 0, -5, - -1, 0, 0, 0, 0, 0, 5, 0, - -4, -1, 0, 0, 0, -2, 0, 0, - -1, -9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -10, -1, 5, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, - 0, 1, 0, 0, -3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 1, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, - 3, 1, 4, -1, 0, 0, 3, -1, - -4, -18, 1, 3, 3, 0, -2, 0, - 5, 0, 4, 0, 4, 0, -12, 0, - -2, 4, 0, 4, -1, 3, 1, 0, - 0, 0, -1, 0, 0, -2, 10, 0, - 10, 0, 4, 0, 5, 2, 2, 4, - 0, 0, 0, -5, 0, 0, 0, 0, - 0, -1, 0, 1, -2, -2, -3, 1, - 0, -1, 0, 0, 0, -5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -8, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -7, 0, -8, 0, 0, 0, - 0, -1, 0, 13, -2, -2, 1, 1, - -1, 0, -2, 1, 0, 0, -7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -12, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -8, 0, 8, 0, 0, -5, 0, - 4, 0, -9, -12, -9, -3, 4, 0, - 0, -9, 0, 2, -3, 0, -2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 4, -16, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 1, 0, 0, 0, - 0, 0, 1, 1, -2, -3, 0, 0, - 0, -1, 0, 0, -1, 0, 0, 0, - -3, 0, -1, 0, -3, -3, 0, -3, - -4, -4, -2, 0, -3, 0, -3, 0, - 0, 0, 0, -1, 0, 0, 1, 0, - 1, -1, 0, 0, 0, 0, 0, 1, - -1, 0, 0, 0, -1, 1, 1, 0, - 0, 0, 0, -2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, -1, 0, - -2, 0, -2, 0, 0, -1, 0, 4, - 0, 0, -1, 0, 0, 0, 0, 0, - 0, 0, -1, -1, 0, 0, -1, 0, - -1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, -1, 0, -1, -2, 0, - 0, 0, 0, 0, 0, 0, 0, -1, - 0, -1, -1, -1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -1, 0, 0, - 0, 0, -1, -2, 0, -2, 0, -4, - -1, -4, 3, 0, 0, -3, 1, 3, - 3, 0, -3, 0, -2, 0, 0, -6, - 1, -1, 1, -7, 1, 0, 0, 0, - -7, 0, -7, -1, -11, -1, 0, -6, - 0, 3, 4, 0, 2, 0, 0, 0, - 0, 0, 0, -2, -2, 0, -4, 0, - 0, 0, -1, 0, 0, 0, -1, 0, - 0, 0, 0, 0, -1, -1, 0, -1, - -2, 0, 0, 0, 0, 0, 0, 0, - -1, -1, 0, -1, -2, -1, 0, 0, - -1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -1, -1, 0, -2, - 0, -1, 0, -3, 1, 0, 0, -2, - 1, 1, 1, 0, 0, 0, 0, 0, - 0, -1, 0, 0, 0, 0, 0, 1, - 0, 0, -1, 0, -1, -1, -2, 0, - 0, 0, 0, 0, 0, 0, 1, 0, - -1, 0, 0, 0, 0, -1, -2, 0, - -2, 0, 4, -1, 0, -4, 0, 0, - 3, -6, -7, -5, -3, 1, 0, -1, - -8, -2, 0, -2, 0, -3, 2, -2, - -8, 0, -3, 0, 0, 1, 0, 1, - -1, 0, 1, 0, -4, -5, 0, -6, - -3, -3, -3, -4, -2, -3, 0, -2, - -3, 1, 0, 0, 0, -1, 0, 0, - 0, 1, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -1, - 0, -1, 0, 0, -1, 0, -2, -3, - -3, 0, 0, -4, 0, 0, 0, 0, - 0, 0, -1, 0, 0, 0, 0, 1, - -1, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, - -1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -1, 0, 0, 0, - -2, 0, 0, 0, 0, -6, -4, 0, - 0, 0, -2, -6, 0, 0, -1, 1, - 0, -3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, 0, -2, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, -2, 0, - 0, 0, 0, 2, 0, 1, -3, -3, - 0, -1, -1, -2, 0, 0, 0, 0, - 0, 0, -4, 0, -1, 0, -2, -1, - 0, -3, -3, -4, -1, 0, -3, 0, - -4, 0, 0, 0, 0, 10, 0, 0, - 1, 0, 0, -2, 0, 1, 0, -6, - 0, 0, 0, 0, 0, -12, -2, 4, - 4, -1, -5, 0, 1, -2, 0, -6, - -1, -2, 1, -9, -1, 2, 0, 2, - -4, -2, -5, -4, -5, 0, 0, -8, - 0, 7, 0, 0, -1, 0, 0, 0, - -1, -1, -1, -3, -4, 0, -12, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -1, 0, -1, -1, -2, 0, 0, - -3, 0, -1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3, 0, 0, 3, - 0, 2, 0, -3, 1, -1, 0, -3, - -1, 0, -2, -1, -1, 0, -2, -2, - 0, 0, -1, 0, -1, -2, -2, 0, - 0, -1, 0, 1, -1, 0, -3, 0, - 0, 0, -3, 0, -2, 0, -2, -2, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, -3, 1, 0, -2, 0, -1, -2, - -4, -1, -1, -1, 0, -1, -2, 0, - 0, 0, 0, 0, 0, -1, -1, -1, - 0, 0, 0, 0, 2, -1, 0, -1, - 0, 0, 0, -1, -2, -1, -1, -2, - -1, 0, 1, 5, 0, 0, -3, 0, - -1, 3, 0, -1, -5, -2, 2, 0, - 0, -6, -2, 1, -2, 1, 0, -1, - -1, -4, 0, -2, 1, 0, 0, -2, - 0, 0, 0, 1, 1, -3, -2, 0, - -2, -1, -2, -1, -1, 0, -2, 1, - -2, -2, 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 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, - -1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -1, -1, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2, 0, 0, -2, - 0, 0, -1, -1, 0, 0, 0, 0, - -1, 0, 0, 0, 0, -1, 0, 0, - 0, 0, 0, -1, 0, 0, 0, 0, - -2, 0, -3, 0, 0, 0, -4, 0, - 1, -3, 3, 0, -1, -6, 0, 0, - -3, -1, 0, -5, -3, -4, 0, 0, - -6, -1, -5, -5, -6, 0, -3, 0, - 1, 9, -2, 0, -3, -1, 0, -1, - -2, -3, -2, -5, -5, -3, -1, 0, - 0, -1, 0, 0, 0, 0, -9, -1, - 4, 3, -3, -5, 0, 0, -4, 0, - -6, -1, -1, 3, -12, -2, 0, 0, - 0, -8, -2, -7, -1, -9, 0, 0, - -9, 0, 8, 0, 0, -1, 0, 0, - 0, 0, -1, -1, -5, -1, 0, -8, - 0, 0, 0, 0, -4, 0, -1, 0, - 0, -4, -6, 0, 0, -1, -2, -4, - -1, 0, -1, 0, 0, 0, 0, -6, - -1, -4, -4, -1, -2, -3, -1, -2, - 0, -3, -1, -4, -2, 0, -2, -2, - -1, -2, 0, 1, 0, -1, -4, 0, - 3, 0, -2, 0, 0, 0, 0, 2, - 0, 1, -3, 5, 0, -1, -1, -2, - 0, 0, 0, 0, 0, 0, -4, 0, - -1, 0, -2, -1, 0, -3, -3, -4, - -1, 0, -3, 1, 5, 0, 0, 0, - 0, 10, 0, 0, 1, 0, 0, -2, - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -1, -3, 0, 0, 0, 0, 0, -1, - 0, 0, 0, -1, -1, 0, 0, -3, - -1, 0, 0, -3, 0, 2, -1, 0, - 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 2, 3, 1, -1, 0, -4, - -2, 0, 4, -4, -4, -3, -3, 5, - 2, 1, -11, -1, 3, -1, 0, -1, - 1, -1, -4, 0, -1, 1, -2, -1, - -4, -1, 0, 0, 4, 3, 0, -4, - 0, -7, -2, 4, -2, -5, 0, -2, - -4, -4, -1, 5, 1, 0, -2, 0, - -3, 0, 1, 4, -3, -5, -5, -3, - 4, 0, 0, -9, -1, 1, -2, -1, - -3, 0, -3, -5, -2, -2, -1, 0, - 0, -3, -3, -1, 0, 4, 3, -1, - -7, 0, -7, -2, 0, -4, -7, 0, - -4, -2, -4, -4, 3, 0, 0, -2, - 0, -3, -1, 0, -1, -2, 0, 2, - -4, 1, 0, 0, -7, 0, -1, -3, - -2, -1, -4, -3, -4, -3, 0, -4, - -1, -3, -2, -4, -1, 0, 0, 0, - 6, -2, 0, -4, -1, 0, -1, -3, - -3, -3, -4, -5, -2, -3, 3, 0, - -2, 0, -6, -2, 1, 3, -4, -5, - -3, -4, 4, -1, 1, -12, -2, 3, - -3, -2, -5, 0, -4, -5, -2, -1, - -1, -1, -3, -4, 0, 0, 0, 4, - 4, -1, -8, 0, -8, -3, 3, -5, - -9, -3, -4, -5, -6, -4, 3, 0, - 0, 0, 0, -2, 0, 0, 1, -2, - 3, 1, -2, 3, 0, 0, -4, 0, - 0, 0, 0, 0, 0, -1, 0, 0, - 0, 0, 0, 0, -1, 0, 0, 0, - 0, 1, 4, 0, 0, -2, 0, 0, - 0, 0, -1, -1, -2, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 1, 0, - -1, 0, 5, 0, 2, 0, 0, -2, - 0, 3, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -8, 0, -1, 2, 0, 4, - 0, 0, 13, 2, -3, -3, 1, 1, - -1, 0, -6, 0, 0, 6, -8, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -9, 5, 18, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -8, 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, -2, 0, 0, -2, - -1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -1, 0, -3, 0, - 0, 0, 0, 0, 1, 17, -3, -1, - 4, 3, -3, 1, 0, 0, 1, 1, - -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -17, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -4, - 0, 0, 0, -3, 0, 0, 0, 0, - -3, -1, 0, 0, 0, -3, 0, -2, - 0, -6, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -1, 0, 0, -2, 0, -2, 0, - -3, 0, 0, 0, -2, 1, -2, 0, - 0, -3, -1, -3, 0, 0, -3, 0, - -1, 0, -6, 0, -1, 0, 0, -10, - -2, -5, -1, -5, 0, 0, -9, 0, - -3, -1, 0, 0, 0, 0, 0, 0, - 0, 0, -2, -2, -1, -2, 0, 0, - 0, 0, -3, 0, -3, 2, -1, 3, - 0, -1, -3, -1, -2, -2, 0, -2, - -1, -1, 1, -3, 0, 0, 0, 0, - -11, -1, -2, 0, -3, 0, -1, -6, - -1, 0, 0, -1, -1, 0, 0, 0, - 0, 1, 0, -1, -2, -1, 2, 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, 2, 0, 0, 0, 0, 0, - 0, -3, 0, -1, 0, 0, 0, -3, - 1, 0, 0, 0, -3, -1, -3, 0, - 0, -4, 0, -1, 0, -6, 0, 0, - 0, 0, -12, 0, -3, -5, -6, 0, - 0, -9, 0, -1, -2, 0, 0, 0, - 0, 0, 0, 0, 0, -1, -2, -1, - -2, 0, 0, 0, 2, -2, 0, 4, - 6, -1, -1, -4, 2, 6, 2, 3, - -3, 2, 5, 2, 4, 3, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 6, -2, -1, 0, -1, - 10, 6, 10, 0, 0, 0, 1, 0, - 0, 5, 0, 0, -2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -1, 0, - 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, -11, -2, -1, -5, - -6, 0, 0, -9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -1, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, -11, -2, -1, - -5, -6, 0, 0, -5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -1, 0, 0, 0, -3, 1, 0, -1, - 1, 2, 1, -4, 0, 0, -1, 1, - 0, 1, 0, 0, 0, 0, -3, 0, - -1, -1, -3, 0, -1, -5, 0, 8, - -1, 0, -3, -1, 0, -1, -2, 0, - -1, -4, -3, -2, 0, 0, 0, -2, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, -11, - -2, -1, -5, -6, 0, 0, -9, 0, - 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -2, 0, -4, -2, -1, 4, -1, -1, - -5, 0, -1, 0, -1, -3, 0, 3, - 0, 1, 0, 1, -3, -5, -2, 0, - -5, -2, -3, -5, -5, 0, -2, -3, - -2, -2, -1, -1, -2, -1, 0, -1, - 0, 2, 0, 2, -1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -1, -1, -1, 0, 0, - -3, 0, -1, 0, -2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - -8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -1, -1, 0, -2, - 0, 0, 0, 0, -1, 0, 0, -2, - -1, 1, 0, -2, -2, -1, 0, -4, - -1, -3, -1, -2, 0, -2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, -9, 0, 4, 0, 0, -2, 0, - 0, 0, 0, -2, 0, -1, 0, 0, - -1, 0, 0, -1, 0, -3, 0, 0, - 5, -2, -4, -4, 1, 1, 1, 0, - -4, 1, 2, 1, 4, 1, 4, -1, - -3, 0, 0, -5, 0, 0, -4, -3, - 0, 0, -3, 0, -2, -2, 0, -2, - 0, -2, 0, -1, 2, 0, -1, -4, - -1, 5, 0, 0, -1, 0, -3, 0, - 0, 2, -3, 0, 1, -1, 1, 0, - 0, -4, 0, -1, 0, 0, -1, 1, - -1, 0, 0, 0, -5, -2, -3, 0, - -4, 0, 0, -6, 0, 5, -1, 0, - -2, 0, 1, 0, -1, 0, -1, -4, - 0, -1, 1, 0, 0, 0, 0, -1, - 0, 0, 1, -2, 0, 0, 0, -2, - -1, 0, -2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -8, 0, 3, 0, - 0, -1, 0, 0, 0, 0, 0, 0, - -1, -1, 0, 0, 0, 3, 0, 3, - 0, 0, 0, 0, 0, -8, -7, 0, - 6, 4, 2, -5, 1, 5, 0, 5, - 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -/*Collect the kern class' data in one place*/ -static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .class_pair_values = kern_class_values, - .left_class_mapping = kern_left_class_mapping, - .right_class_mapping = kern_right_class_mapping, - .left_class_cnt = 61, - .right_class_cnt = 49, -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = &kern_classes, - .kern_scale = 16, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 1, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_montserrat_8 = { -#else -lv_font_t lv_font_montserrat_8 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 10, /*The maximum line height required by the font*/ - .base_line = 2, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -1, - .underline_thickness = 0, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_MONTSERRAT_8*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_simsun_14_cjk.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_simsun_14_cjk.c deleted file mode 100644 index 4cd687f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_simsun_14_cjk.c +++ /dev/null @@ -1,20783 +0,0 @@ -/******************************************************************************* - * Size: 14 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 14 --font SimSun.woff -r 0x20-0x7f --symbols (),盗提陽帯鼻画輕ッ冊ェル写父ぁフ結想正四O夫源庭場天續鳥れ講猿苦階給了製守8祝己妳薄泣塩帰ぺ吃変輪那着仍嗯爭熱創味保字宿捨準查達肯ァ薬得査障該降察ね網加昼料等図邪秋コ態品屬久原殊候路願楽確針上被怕悲風份重歡っ附ぷ既4黨價娘朝凍僅際洋止右航よ专角應酸師個比則響健昇豐筆歷適修據細忙跟管長令家ザ期般花越ミ域泳通些油乏ラ。營ス返調農叫樹刊愛間包知把ヤ貧橋拡普聞前ジ建当繰ネ送習渇用補ィ覺體法遊宙ョ酔余利壊語くつ払皆時辺追奇そ們只胸械勝住全沈力光ん深溝二類北面社值試9和五勵ゃ貿幾逐打課ゲて領3鼓辦発評1渉詳暇込计駄供嘛郵頃腦反構絵お容規借身妻国慮剛急乗静必議置克土オ乎荷更肉還混古渡授合主離條値決季晴東大尚央州が嗎験流先医亦林田星晩拿60旅婦量為痛テ孫う環友況玩務其ぼち揺坐一肩腰犯タょ希即果ぶ物練待み高九找やヶ都グ去」サ、气仮雑酒許終企笑録形リ銀切ギ快問滿役単黄集森毎實研喜蘇司鉛洲川条媽ノ才兩話言雖媒出客づ卻現異故り誌逮同訊已視本題ぞを横開音第席費持眾怎選元退限ー賽処喝就残無いガ多ケ沒義遠歌隣錢某雪析嬉採自透き側員予ゼ白婚电へ顯呀始均畫似懸格車騒度わ親店週維億締慣免帳電甚來園浴ゅ愈京と杯各海怒ぜ排敗挙老買7極模実紀ヒ携隻告シ並屋這孩讓質ワブ富賃争康由辞マ火於短樣削弟材注節另室ダ招擁ぃ若套底波行勤關著泊背疲狭作念推ぐ民貸祖介說ビ代温契你我レ入描變再札ソ派頭智遅私聽舉灣山伸放直安ト誕煙付符幅ふ絡她届耳飲忘参革團仕様載ど歩獲嫌息の汚交興魚指資雙與館初学年幸史位柱族走括び考青也共腕Lで販擔理病イ今逃當寺猫邊菓係ム秘示解池影ド文例斷曾事茶寫明科桃藝売便え導禁財飛替而亡到し具空寝辛業ウ府セ國何基菜厳市努張缺雲根外だ断万砂ゴ超使台实ぽ礼最慧算軟界段律像夕丈窓助刻月夏政呼ぴざ擇趣除動従涼方勉名線対存請子氏將5少否諸論美感或西者定食御表は參歳緑命進易性錯房も捕皿判中觀戦ニ緩町ピ番ず金千ろ?不た象治関ャ每看徒卒統じ手範訪押座步号ベ旁以母すほ密減成往歲件緒読歯效院种七謂凝濃嵌震喉繼クュ拭死円2積水欲如ポにさ寒道區精啦姐ア聯能足及停思壓2春且メ裏株官答概黒過氷柿戻厚ぱ党祭織引計け委暗複誘港バ失下村較続神ぇ尤強秀膝兒来績十書済化服破新廠1紹您情半式產系好教暑早め樂地休協良な哪常要揮周かエ麗境働避護ンツ香夜太見設非改広聲他検求危清彼經未在起葉控靴所差內造寄南望尺換向展備眠點完約ぎ裡分説申童優伝島机須塊日立拉,鉄軽單気信很転識支布数紙此迎受心輸坊モ處「訳三曇兄野顔戰增ナ伊列又髪両有取左毛至困吧昔赤狀相夠整別士経頼然簡ホ会發隨営需脱ヨば接永居冬迫圍甘醫誰部充消連弱宇會咲覚姉麼的増首统帶糖朋術商担移景功育庫曲總劃牛程駅犬報ロ學責因パ嚴八世後平負公げ曜陸專午之閉ぬ談ご災昨冷職悪謝對它近射敢意運船臉局難什産頗!球真記ま但蔵究制機案湖臺ひ害券男留内木驗雨施種特復句末濟キ色訴依せ百型る石牠討呢时任執飯歐宅組傳配小活ゆべ暖ズ漸站素らボ束価チ浅回女片独妹英目從認生違策僕楚ペ米こ掛む爸六状落漢プ投カ校做啊洗声探あ割体項履触々訓技ハ低工映是標速善点人デ口次可廿节宵植树端阳旦腊妇费愚劳动儿军师庆圣诞闰 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_simsun_14_cjk.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_SIMSUN_14_CJK - #define LV_FONT_SIMSUN_14_CJK 1 -#endif - -#if LV_FONT_SIMSUN_14_CJK - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x1d, 0x2, 0xf0, 0xe, 0x0, 0xc0, 0xa, 0x0, - 0x80, 0x5, 0x0, 0x0, 0x18, 0x2, 0xe1, - - /* U+0022 "\"" */ - 0x0, 0x89, 0x5b, 0x1, 0xe3, 0xd5, 0x8, 0x45, - 0x60, 0x4, 0x4, 0x0, - - /* U+0023 "#" */ - 0x0, 0x70, 0x7, 0x0, 0x7, 0x0, 0x70, 0x7f, - 0xff, 0xff, 0x71, 0x46, 0x24, 0x61, 0x4, 0x30, - 0x43, 0x0, 0x52, 0x5, 0x20, 0x7f, 0xff, 0xff, - 0x71, 0x92, 0x28, 0x21, 0x7, 0x0, 0x70, 0x0, - 0x70, 0x7, 0x0, - - /* U+0024 "$" */ - 0x0, 0x4, 0x0, 0x0, 0x8, 0x0, 0x1, 0x8b, - 0x82, 0x9, 0x28, 0x4a, 0xc, 0x28, 0x46, 0x6, - 0xc9, 0x0, 0x0, 0x8f, 0x30, 0x0, 0xa, 0xe2, - 0x0, 0x8, 0x6a, 0xd, 0x28, 0xc, 0xe, 0x8, - 0x19, 0x4, 0x7b, 0x71, 0x0, 0x8, 0x0, 0x0, - 0x4, 0x0, - - /* U+0025 "%" */ - 0x0, 0x0, 0x2, 0x4, 0x76, 0x3, 0x40, 0xa0, - 0x90, 0x70, 0xb, 0x9, 0x16, 0x0, 0x90, 0xa5, - 0x10, 0x1, 0x64, 0x64, 0x60, 0x0, 0x15, 0x93, - 0x60, 0x6, 0x37, 0x9, 0x0, 0x64, 0x70, 0xa0, - 0x32, 0x18, 0x28, 0x5, 0x0, 0x78, 0x10, - - /* U+0026 "&" */ - 0x3, 0x79, 0x0, 0x0, 0xa0, 0x83, 0x0, 0xb, - 0x9, 0x20, 0x0, 0xa5, 0x80, 0x0, 0x8, 0xa0, - 0x78, 0x14, 0x6d, 0x4, 0x40, 0xb0, 0x95, 0x51, - 0xc, 0x2, 0xd7, 0x0, 0x95, 0x8, 0xb0, 0x31, - 0xb9, 0x68, 0xc5, - - /* U+0027 "'" */ - 0xd, 0x60, 0x8a, 0x5, 0x50, 0x60, - - /* U+0028 "(" */ - 0x0, 0x0, 0x0, 0x71, 0x5, 0x40, 0xa, 0x0, - 0x65, 0x0, 0xb1, 0x0, 0xc0, 0x0, 0xc0, 0x0, - 0xc0, 0x0, 0xb0, 0x0, 0x65, 0x0, 0x1a, 0x0, - 0x6, 0x40, 0x0, 0x81, 0x0, 0x1, - - /* U+0029 ")" */ - 0x0, 0x0, 0x26, 0x0, 0x5, 0x40, 0x0, 0xa0, - 0x0, 0x65, 0x0, 0x2a, 0x0, 0xc, 0x0, 0xc, - 0x0, 0xc, 0x0, 0x1b, 0x0, 0x66, 0x0, 0xa0, - 0x4, 0x50, 0x17, 0x0, 0x10, 0x0, - - /* U+002A "*" */ - 0x0, 0x5, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x6b, - 0xb, 0x1c, 0x50, 0x7a, 0x7a, 0x70, 0x0, 0x6a, - 0x60, 0x4, 0xe5, 0x86, 0xe3, 0x24, 0xd, 0x4, - 0x20, 0x0, 0xd0, 0x0, - - /* U+002B "+" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, - 0x7, 0x0, 0x0, 0x0, 0x70, 0x0, 0x38, 0x8c, - 0x88, 0x40, 0x0, 0x70, 0x0, 0x0, 0x7, 0x0, - 0x0, 0x0, 0x70, 0x0, 0x0, 0x2, 0x0, 0x0, - - /* U+002C "," */ - 0xd, 0x60, 0x8a, 0x5, 0x50, 0x60, - - /* U+002D "-" */ - 0x48, 0x88, 0x88, 0x40, - - /* U+002E "." */ - 0x9, 0x40, 0xd6, - - /* U+002F "/" */ - 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x60, 0x0, - 0x0, 0x7, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, - 0x70, 0x0, 0x0, 0x43, 0x0, 0x0, 0x7, 0x0, - 0x0, 0x2, 0x50, 0x0, 0x0, 0x70, 0x0, 0x0, - 0x6, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x70, - 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0030 "0" */ - 0x0, 0x97, 0x90, 0x0, 0x95, 0x4, 0x90, 0xe, - 0x0, 0xe, 0x3, 0xc0, 0x0, 0xd3, 0x4b, 0x0, - 0xc, 0x45, 0xb0, 0x0, 0xc3, 0x3c, 0x0, 0xd, - 0x20, 0xe0, 0x0, 0xe0, 0x9, 0x50, 0x48, 0x0, - 0x9, 0x79, 0x0, - - /* U+0031 "1" */ - 0x26, 0xe0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, - 0xe, 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, - 0xe0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x2, 0x7f, - 0x83, - - /* U+0032 "2" */ - 0x3, 0x76, 0x93, 0x0, 0xb0, 0x1, 0xd0, 0x1f, - 0x0, 0xe, 0x0, 0x40, 0x1, 0xc0, 0x0, 0x0, - 0x84, 0x0, 0x0, 0x46, 0x0, 0x0, 0x36, 0x0, - 0x0, 0x17, 0x0, 0x20, 0x8, 0x0, 0x8, 0x4, - 0xee, 0xee, 0xd0, - - /* U+0033 "3" */ - 0x4, 0x67, 0x91, 0x0, 0xd0, 0x5, 0x90, 0x8, - 0x0, 0x3b, 0x0, 0x0, 0x8, 0x40, 0x0, 0x2a, - 0x80, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0xe, - 0x0, 0xb0, 0x0, 0xe0, 0x1e, 0x0, 0x2b, 0x0, - 0x57, 0x68, 0x10, - - /* U+0034 "4" */ - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x6e, 0x0, 0x0, - 0x15, 0xd0, 0x0, 0x7, 0xd, 0x0, 0x4, 0x20, - 0xd0, 0x0, 0x60, 0xd, 0x0, 0x45, 0x55, 0xe5, - 0x20, 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x1, 0x6f, 0x81, - - /* U+0035 "5" */ - 0x8, 0xee, 0xec, 0x0, 0x60, 0x0, 0x0, 0x6, - 0x0, 0x0, 0x0, 0x68, 0x9b, 0x20, 0x9, 0x10, - 0x3b, 0x0, 0x0, 0x0, 0xe0, 0x1, 0x0, 0xd, - 0x11, 0xf0, 0x0, 0xd0, 0xc, 0x0, 0x2a, 0x0, - 0x37, 0x69, 0x10, - - /* U+0036 "6" */ - 0x0, 0x66, 0x96, 0x0, 0x73, 0x2, 0x60, 0xc, - 0x0, 0x0, 0x2, 0xb6, 0x9c, 0x40, 0x4e, 0x40, - 0x1d, 0x5, 0xc0, 0x0, 0xb3, 0x4c, 0x0, 0xa, - 0x41, 0xe0, 0x0, 0xb2, 0xb, 0x40, 0xb, 0x0, - 0x1a, 0x68, 0x20, - - /* U+0037 "7" */ - 0xd, 0xee, 0xef, 0x10, 0x90, 0x0, 0x70, 0x2, - 0x0, 0x61, 0x0, 0x0, 0x8, 0x0, 0x0, 0x5, - 0x40, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x1c, 0x0, - 0x0, 0x5, 0xb0, 0x0, 0x0, 0x7b, 0x0, 0x0, - 0x6, 0xa0, 0x0, - - /* U+0038 "8" */ - 0x3, 0x86, 0x82, 0x0, 0xb0, 0x0, 0xb0, 0x2b, - 0x0, 0xb, 0x0, 0xd6, 0x1, 0xa0, 0x1, 0xec, - 0x90, 0x0, 0x83, 0x5e, 0x50, 0x39, 0x0, 0x2e, - 0x5, 0x60, 0x0, 0xb2, 0x29, 0x0, 0xb, 0x0, - 0x47, 0x67, 0x30, - - /* U+0039 "9" */ - 0x4, 0x87, 0x81, 0x1, 0xc0, 0x2, 0xa0, 0x59, - 0x0, 0xd, 0x5, 0x90, 0x0, 0xe2, 0x1d, 0x10, - 0x6e, 0x30, 0x49, 0x83, 0xe2, 0x0, 0x0, 0xf, - 0x0, 0x10, 0x3, 0xa0, 0xd, 0x30, 0x94, 0x0, - 0x79, 0x76, 0x0, - - /* U+003A ":" */ - 0x3e, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x80, 0x3e, 0x0, - - /* U+003B ";" */ - 0x3f, 0x1, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x50, 0x3f, 0x0, 0xa0, 0x3, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x5, 0x0, 0x0, 0x5, 0x40, 0x0, - 0x5, 0x50, 0x0, 0x4, 0x60, 0x0, 0x3, 0x70, - 0x0, 0x0, 0xa0, 0x0, 0x0, 0x4, 0x60, 0x0, - 0x0, 0x5, 0x50, 0x0, 0x0, 0x6, 0x40, 0x0, - 0x0, 0x6, 0x30, 0x0, 0x0, 0x6, 0x0, - - /* U+003D "=" */ - 0x48, 0x88, 0x88, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x88, 0x88, 0x84, - - /* U+003E ">" */ - 0x5, 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, - 0x55, 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, - 0x73, 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x64, - 0x0, 0x0, 0x55, 0x0, 0x0, 0x46, 0x0, 0x0, - 0x37, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x2, 0x88, 0xa4, 0x0, 0x80, 0x0, 0xd1, 0x3a, - 0x0, 0xb, 0x31, 0x90, 0x0, 0xe1, 0x0, 0x1, - 0xa5, 0x0, 0x0, 0x81, 0x0, 0x0, 0x7, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x18, 0x0, 0x0, - 0x3, 0xe0, 0x0, - - /* U+0040 "@" */ - 0x0, 0x77, 0x74, 0x0, 0x72, 0x46, 0xa2, 0x9, - 0x17, 0x65, 0x74, 0x67, 0x27, 0x37, 0x65, 0xb0, - 0x91, 0x76, 0x5b, 0xa, 0x7, 0x46, 0xa1, 0xc4, - 0x31, 0x95, 0x66, 0x61, 0x8, 0x10, 0x4, 0x30, - 0x8, 0x77, 0x50, - - /* U+0041 "A" */ - 0x0, 0xb, 0x0, 0x0, 0x4, 0xe2, 0x0, 0x0, - 0x77, 0x60, 0x0, 0x8, 0x49, 0x0, 0x0, 0x70, - 0xd0, 0x0, 0x44, 0xc, 0x10, 0x7, 0x65, 0xb5, - 0x0, 0x80, 0x5, 0x80, 0x7, 0x0, 0x1c, 0x8, - 0xb0, 0x4, 0xf5, - - /* U+0042 "B" */ - 0x4e, 0x66, 0x95, 0x0, 0xd0, 0x0, 0xe0, 0xd, - 0x0, 0xe, 0x0, 0xd0, 0x3, 0xb0, 0xd, 0x56, - 0xb1, 0x0, 0xd0, 0x1, 0xc0, 0xd, 0x0, 0x9, - 0x60, 0xd0, 0x0, 0x97, 0xd, 0x0, 0xc, 0x34, - 0xe6, 0x68, 0x60, - - /* U+0043 "C" */ - 0x0, 0x87, 0x8f, 0x10, 0x94, 0x0, 0x54, 0x1d, - 0x0, 0x0, 0x36, 0x90, 0x0, 0x0, 0x88, 0x0, - 0x0, 0x8, 0x80, 0x0, 0x0, 0x79, 0x0, 0x0, - 0x4, 0xc0, 0x0, 0x4, 0xd, 0x30, 0x6, 0x10, - 0x1a, 0x88, 0x30, - - /* U+0044 "D" */ - 0x4e, 0x76, 0x80, 0x0, 0xd0, 0x3, 0xb0, 0xd, - 0x0, 0xc, 0x30, 0xd0, 0x0, 0x96, 0xd, 0x0, - 0x8, 0x70, 0xd0, 0x0, 0x87, 0xd, 0x0, 0xa, - 0x60, 0xd0, 0x0, 0xd2, 0xd, 0x0, 0x4a, 0x4, - 0xe7, 0x78, 0x0, - - /* U+0045 "E" */ - 0x3e, 0x75, 0x7d, 0x0, 0xc1, 0x0, 0x43, 0xc, - 0x10, 0x0, 0x0, 0xc1, 0x5, 0x0, 0xc, 0x65, - 0xd0, 0x0, 0xc1, 0x6, 0x0, 0xc, 0x10, 0x20, - 0x0, 0xc1, 0x0, 0x1, 0xc, 0x10, 0x2, 0x53, - 0xe7, 0x57, 0xe1, - - /* U+0046 "F" */ - 0x3e, 0x75, 0x6d, 0x30, 0xc1, 0x0, 0x17, 0xc, - 0x10, 0x0, 0x0, 0xc1, 0x2, 0x40, 0xc, 0x65, - 0xb4, 0x0, 0xc1, 0x2, 0x40, 0xc, 0x10, 0x1, - 0x0, 0xc1, 0x0, 0x0, 0xc, 0x10, 0x0, 0x4, - 0xe7, 0x0, 0x0, - - /* U+0047 "G" */ - 0x1, 0x97, 0xc8, 0x0, 0xa2, 0x0, 0x90, 0x1a, - 0x0, 0x3, 0x6, 0x70, 0x0, 0x0, 0x86, 0x0, - 0x0, 0x9, 0x60, 0x7, 0xa4, 0x77, 0x0, 0xe, - 0x3, 0xb0, 0x0, 0xd0, 0xc, 0x10, 0xd, 0x0, - 0x29, 0x67, 0x40, - - /* U+0048 "H" */ - 0x5f, 0x30, 0x3f, 0x40, 0xd0, 0x0, 0xe0, 0xd, - 0x0, 0xe, 0x0, 0xd0, 0x0, 0xe0, 0xe, 0x55, - 0x5e, 0x0, 0xd0, 0x0, 0xe0, 0xd, 0x0, 0xe, - 0x0, 0xd0, 0x0, 0xe0, 0xd, 0x0, 0xe, 0x5, - 0xf3, 0x4, 0xf4, - - /* U+0049 "I" */ - 0x36, 0xf6, 0x30, 0xe, 0x0, 0x0, 0xe0, 0x0, - 0xe, 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, - 0xe0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x3, 0x6f, - 0x63, - - /* U+004A "J" */ - 0x0, 0x46, 0xf5, 0x30, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, - 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0x57, 0x3, 0x90, 0x3, 0xb6, - 0x70, 0x0, - - /* U+004B "K" */ - 0x4e, 0x50, 0x8c, 0x20, 0xd0, 0x7, 0x0, 0xd, - 0x4, 0x30, 0x0, 0xd1, 0x70, 0x0, 0xd, 0x8c, - 0x0, 0x0, 0xd4, 0xa4, 0x0, 0xd, 0x3, 0xb0, - 0x0, 0xd0, 0xc, 0x20, 0xd, 0x0, 0x59, 0x4, - 0xe6, 0x4, 0xf5, - - /* U+004C "L" */ - 0x2d, 0x80, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xb, - 0x30, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xb, 0x30, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x0, 0xb3, 0x0, 0x1, 0xb, 0x30, 0x1, 0x53, - 0xd8, 0x56, 0xd2, - - /* U+004D "M" */ - 0x7c, 0x0, 0xf, 0x62, 0xe0, 0x3, 0xe2, 0x2b, - 0x30, 0x6c, 0x22, 0x86, 0x6, 0xc2, 0x25, 0x90, - 0x6c, 0x22, 0x2c, 0x14, 0xc2, 0x22, 0xb5, 0xc, - 0x22, 0x28, 0x90, 0xc2, 0x22, 0x59, 0xc, 0x27, - 0x72, 0x63, 0xe7, - - /* U+004E "N" */ - 0x4f, 0x10, 0x1a, 0x50, 0xc8, 0x0, 0x50, 0x5, - 0xd1, 0x5, 0x0, 0x57, 0x80, 0x50, 0x5, 0xd, - 0x5, 0x0, 0x50, 0x87, 0x50, 0x5, 0x1, 0xe5, - 0x0, 0x50, 0x8, 0xc0, 0x5, 0x0, 0x1f, 0x5, - 0xa1, 0x0, 0x90, - - /* U+004F "O" */ - 0x1, 0x96, 0x81, 0x0, 0xa2, 0x0, 0xb0, 0x1c, - 0x0, 0xb, 0x35, 0x90, 0x0, 0x87, 0x78, 0x0, - 0x7, 0x97, 0x80, 0x0, 0x79, 0x59, 0x0, 0x7, - 0x71, 0xb0, 0x0, 0xa3, 0xa, 0x20, 0xb, 0x0, - 0x18, 0x57, 0x20, - - /* U+0050 "P" */ - 0x3e, 0x75, 0x75, 0x0, 0xc1, 0x0, 0xb2, 0xc, - 0x10, 0x8, 0x60, 0xc1, 0x0, 0x95, 0xc, 0x10, - 0x1c, 0x0, 0xc6, 0x57, 0x10, 0xc, 0x10, 0x0, - 0x0, 0xc1, 0x0, 0x0, 0xc, 0x10, 0x0, 0x4, - 0xe7, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x2, 0x96, 0x81, 0x0, 0xc1, 0x1, 0xb0, 0x3b, - 0x0, 0xb, 0x36, 0x90, 0x0, 0x87, 0x87, 0x0, - 0x7, 0x88, 0x70, 0x0, 0x78, 0x78, 0x0, 0x8, - 0x74, 0xa8, 0xa1, 0xa3, 0xd, 0x44, 0x9b, 0x0, - 0x28, 0x7f, 0x30, 0x0, 0x0, 0x7d, 0x20, - - /* U+0052 "R" */ - 0x3d, 0x76, 0x95, 0x0, 0xb2, 0x0, 0xe1, 0xb, - 0x20, 0xc, 0x20, 0xb2, 0x2, 0xc0, 0xb, 0x68, - 0x91, 0x0, 0xb2, 0x58, 0x0, 0xb, 0x20, 0xd0, - 0x0, 0xb2, 0xa, 0x40, 0xb, 0x20, 0x49, 0x3, - 0xd7, 0x0, 0xe4, - - /* U+0053 "S" */ - 0x4, 0x67, 0xcb, 0x1, 0x80, 0x0, 0x90, 0x37, - 0x0, 0x1, 0x1, 0xd3, 0x0, 0x0, 0x3, 0xcb, - 0x20, 0x0, 0x0, 0x5d, 0x50, 0x0, 0x0, 0x1d, - 0x3, 0x10, 0x0, 0x92, 0x38, 0x0, 0xa, 0x0, - 0xfa, 0x67, 0x30, - - /* U+0054 "T" */ - 0x3b, 0x6f, 0x6b, 0x26, 0x0, 0xe0, 0x15, 0x10, - 0xe, 0x0, 0x10, 0x0, 0xe0, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x6, 0xf5, 0x0, - - /* U+0055 "U" */ - 0x5f, 0x30, 0x1a, 0x40, 0xd0, 0x0, 0x50, 0xd, - 0x0, 0x5, 0x0, 0xd0, 0x0, 0x50, 0xd, 0x0, - 0x5, 0x0, 0xd0, 0x0, 0x50, 0xd, 0x0, 0x5, - 0x0, 0xd0, 0x0, 0x50, 0xc, 0x0, 0x6, 0x0, - 0x39, 0x77, 0x10, - - /* U+0056 "V" */ - 0x5f, 0x30, 0x2c, 0x40, 0xd1, 0x0, 0x70, 0x9, - 0x40, 0x15, 0x0, 0x58, 0x5, 0x10, 0x2, 0xc0, - 0x60, 0x0, 0xd, 0x6, 0x0, 0x0, 0xa4, 0x50, - 0x0, 0x7, 0xb1, 0x0, 0x0, 0x3d, 0x0, 0x0, - 0x0, 0x80, 0x0, - - /* U+0057 "W" */ - 0x9a, 0x2e, 0x36, 0x83, 0x80, 0xb0, 0x32, 0x1a, - 0xb, 0x25, 0x0, 0xb0, 0xd4, 0x50, 0xb, 0x1a, - 0x65, 0x0, 0xa5, 0x58, 0x50, 0x8, 0x91, 0xb5, - 0x0, 0x6b, 0xe, 0x20, 0x3, 0x90, 0xc0, 0x0, - 0x16, 0x7, 0x0, - - /* U+0058 "X" */ - 0x2d, 0x70, 0x4c, 0x20, 0x57, 0x3, 0x30, 0x0, - 0xc0, 0x70, 0x0, 0x8, 0x75, 0x0, 0x0, 0x1e, - 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x65, 0xa0, - 0x0, 0x7, 0xc, 0x10, 0x5, 0x20, 0x68, 0x3, - 0xd2, 0x5, 0xf4, - - /* U+0059 "Y" */ - 0x4f, 0x40, 0x3d, 0x40, 0xa3, 0x0, 0x60, 0x4, - 0x90, 0x41, 0x0, 0xd, 0x6, 0x0, 0x0, 0x95, - 0x50, 0x0, 0x3, 0xd0, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x6, 0xf5, 0x0, - - /* U+005A "Z" */ - 0xb, 0x95, 0x5e, 0x21, 0x70, 0x4, 0xa0, 0x0, - 0x0, 0xc2, 0x0, 0x0, 0x4a, 0x0, 0x0, 0xc, - 0x20, 0x0, 0x4, 0xa0, 0x0, 0x0, 0xb2, 0x0, - 0x0, 0x4a, 0x0, 0x1, 0xb, 0x20, 0x6, 0x24, - 0xd5, 0x57, 0xd0, - - /* U+005B "[" */ - 0x39, 0x88, 0x4, 0x40, 0x0, 0x44, 0x0, 0x4, - 0x40, 0x0, 0x44, 0x0, 0x4, 0x40, 0x0, 0x44, - 0x0, 0x4, 0x40, 0x0, 0x44, 0x0, 0x4, 0x40, - 0x0, 0x44, 0x0, 0x4, 0x40, 0x0, 0x44, 0x0, - 0x3, 0x98, 0x80, - - /* U+005C "\\" */ - 0xa0, 0x0, 0x0, 0x64, 0x0, 0x0, 0x9, 0x0, - 0x0, 0x9, 0x0, 0x0, 0x4, 0x50, 0x0, 0x0, - 0xa0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x27, 0x0, - 0x0, 0xa, 0x0, 0x0, 0x6, 0x30, 0x0, 0x1, - 0x90, 0x0, 0x0, 0x90, 0x0, 0x0, 0x32, - - /* U+005D "]" */ - 0x8, 0x89, 0x20, 0x0, 0x53, 0x0, 0x5, 0x30, - 0x0, 0x53, 0x0, 0x5, 0x30, 0x0, 0x53, 0x0, - 0x5, 0x30, 0x0, 0x53, 0x0, 0x5, 0x30, 0x0, - 0x53, 0x0, 0x5, 0x30, 0x0, 0x53, 0x0, 0x5, - 0x30, 0x88, 0x92, - - /* U+005E "^" */ - 0x8, 0xb8, 0x1, 0x30, 0x31, - - /* U+005F "_" */ - 0x55, 0x55, 0x55, 0x50, - - /* U+0060 "`" */ - 0x5c, 0x30, 0x4, - - /* U+0061 "a" */ - 0x5, 0x65, 0x81, 0x0, 0xd0, 0x4, 0x80, 0x0, - 0x4, 0x79, 0x0, 0x78, 0x23, 0x90, 0x3b, 0x0, - 0x39, 0x5, 0x90, 0x3, 0x92, 0xa, 0x76, 0x6b, - 0x50, - - /* U+0062 "b" */ - 0x3, 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x47, - 0x94, 0x0, 0xd4, 0x0, 0xc0, 0xc, 0x0, 0xb, - 0x20, 0xc0, 0x0, 0xa3, 0xc, 0x0, 0xb, 0x10, - 0xd1, 0x0, 0xb0, 0x8, 0x66, 0x82, 0x0, - - /* U+0063 "c" */ - 0x0, 0x85, 0x83, 0x0, 0xa2, 0x3, 0xa0, 0xd, - 0x0, 0x2, 0x2, 0xb0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0xb2, 0x0, 0x60, 0x1, 0x97, 0x73, - 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x3, 0x0, 0x0, 0x5, 0xc0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x1, 0x97, - 0x6c, 0x0, 0xa2, 0x0, 0xc0, 0xc, 0x0, 0xc, - 0x2, 0xb0, 0x0, 0xc0, 0xc, 0x0, 0xc, 0x0, - 0xb1, 0x3, 0xc0, 0x2, 0x97, 0x5c, 0x30, - - /* U+0065 "e" */ - 0x0, 0x86, 0x82, 0x0, 0x92, 0x1, 0xc0, 0xc, - 0x0, 0xc, 0x11, 0xd5, 0x55, 0x91, 0xd, 0x0, - 0x0, 0x0, 0xa2, 0x0, 0x50, 0x1, 0x97, 0x73, - 0x0, - - /* U+0066 "f" */ - 0x0, 0x7, 0x58, 0x50, 0x6, 0x40, 0x24, 0x0, - 0x83, 0x0, 0x1, 0x5b, 0x75, 0x20, 0x0, 0x83, - 0x0, 0x0, 0x8, 0x30, 0x0, 0x0, 0x83, 0x0, - 0x0, 0x8, 0x30, 0x0, 0x0, 0x83, 0x0, 0x0, - 0x5c, 0x95, 0x0, - - /* U+0067 "g" */ - 0x1, 0x86, 0x99, 0x70, 0xa1, 0x6, 0x60, 0xb, - 0x0, 0x47, 0x0, 0x83, 0x7, 0x30, 0x5, 0x75, - 0x40, 0x0, 0x99, 0x64, 0x0, 0x7, 0x2, 0x5b, - 0x2, 0x90, 0x0, 0x91, 0x7, 0x65, 0x66, 0x0, - - /* U+0068 "h" */ - 0x6, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x58, - 0xa4, 0x0, 0xc4, 0x0, 0xb0, 0xc, 0x0, 0xc, - 0x0, 0xc0, 0x0, 0xc0, 0xc, 0x0, 0xc, 0x0, - 0xc0, 0x0, 0xc0, 0x3e, 0x50, 0x4e, 0x30, - - /* U+0069 "i" */ - 0x0, 0xe2, 0x0, 0x5, 0x0, 0x0, 0x20, 0x2, - 0x5d, 0x0, 0x0, 0xc0, 0x0, 0xc, 0x0, 0x0, - 0xc0, 0x0, 0xc, 0x0, 0x0, 0xc0, 0x2, 0x6e, - 0x63, - - /* U+006A "j" */ - 0x0, 0x8, 0x80, 0x0, 0x33, 0x0, 0x1, 0x10, - 0x5, 0xa6, 0x0, 0x5, 0x60, 0x0, 0x56, 0x0, - 0x5, 0x60, 0x0, 0x56, 0x0, 0x5, 0x60, 0x0, - 0x55, 0x60, 0x8, 0x29, 0x97, 0x50, - - /* U+006B "k" */ - 0x6, 0x0, 0x0, 0x3, 0xd0, 0x0, 0x0, 0xb, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0xb, 0x0, - 0xc7, 0x0, 0xb0, 0x26, 0x0, 0xb, 0x1b, 0x0, - 0x0, 0xb8, 0xa3, 0x0, 0xb, 0x12, 0xc0, 0x0, - 0xb0, 0x9, 0x50, 0x2d, 0x50, 0x5e, 0x30, - - /* U+006C "l" */ - 0x2, 0x90, 0x3, 0x5d, 0x0, 0x0, 0xc0, 0x0, - 0xc, 0x0, 0x0, 0xc0, 0x0, 0xc, 0x0, 0x0, - 0xc0, 0x0, 0xc, 0x0, 0x0, 0xc0, 0x0, 0xc, - 0x0, 0x36, 0xe6, 0x30, - - /* U+006D "m" */ - 0x8a, 0x7a, 0x7a, 0x24, 0x90, 0xc0, 0x55, 0x47, - 0xc, 0x5, 0x64, 0x70, 0xc0, 0x56, 0x47, 0xc, - 0x5, 0x64, 0x70, 0xc0, 0x56, 0x8b, 0x2e, 0x39, - 0xa0, - - /* U+006E "n" */ - 0x3e, 0x47, 0x94, 0x0, 0xc4, 0x0, 0xb0, 0xc, - 0x0, 0xc, 0x0, 0xc0, 0x0, 0xc0, 0xc, 0x0, - 0xc, 0x0, 0xc0, 0x0, 0xc0, 0x3e, 0x50, 0x4e, - 0x30, - - /* U+006F "o" */ - 0x1, 0x86, 0x82, 0x0, 0xb0, 0x0, 0xb0, 0x2a, - 0x0, 0xa, 0x24, 0x80, 0x0, 0x84, 0x3a, 0x0, - 0xa, 0x30, 0xb0, 0x0, 0xb0, 0x2, 0x85, 0x71, - 0x0, - - /* U+0070 "p" */ - 0x4e, 0x57, 0x94, 0x0, 0xc3, 0x0, 0xc0, 0xc, - 0x0, 0x9, 0x30, 0xc0, 0x0, 0x84, 0xc, 0x0, - 0xa, 0x30, 0xc1, 0x0, 0xc0, 0xc, 0x66, 0x92, - 0x0, 0xc0, 0x0, 0x0, 0x3e, 0x50, 0x0, 0x0, - - /* U+0071 "q" */ - 0x2, 0x86, 0x68, 0x0, 0xb0, 0x2, 0xc0, 0x2a, - 0x0, 0xc, 0x4, 0x90, 0x0, 0xc0, 0x2a, 0x0, - 0xc, 0x0, 0xb0, 0x2, 0xc0, 0x3, 0x97, 0x5c, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x6e, 0x30, - - /* U+0072 "r" */ - 0x38, 0xc2, 0x7c, 0x30, 0xc, 0x60, 0x42, 0x0, - 0xe0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x36, 0xe5, 0x20, - 0x0, - - /* U+0073 "s" */ - 0x17, 0x6b, 0xa8, 0x10, 0x8, 0x69, 0x10, 0x0, - 0x5c, 0xa1, 0x10, 0x4, 0xc8, 0x0, 0xa, 0xba, - 0x66, 0x40, - - /* U+0074 "t" */ - 0x0, 0x24, 0x0, 0x0, 0x94, 0x0, 0x5, 0xa8, - 0x52, 0x0, 0x74, 0x0, 0x0, 0x74, 0x0, 0x0, - 0x74, 0x0, 0x0, 0x74, 0x0, 0x0, 0x65, 0x5, - 0x0, 0x1a, 0x83, - - /* U+0075 "u" */ - 0x4d, 0x0, 0x5c, 0x0, 0xc0, 0x0, 0xc0, 0xc, - 0x0, 0xc, 0x0, 0xc0, 0x0, 0xc0, 0xc, 0x0, - 0xc, 0x0, 0xb0, 0x4, 0xc0, 0x4, 0xb8, 0x5c, - 0x30, - - /* U+0076 "v" */ - 0x2d, 0x70, 0x3d, 0x20, 0x75, 0x1, 0x50, 0x2, - 0xa0, 0x50, 0x0, 0xc, 0x6, 0x0, 0x0, 0x84, - 0x50, 0x0, 0x3, 0xd1, 0x0, 0x0, 0xa, 0x0, - 0x0, - - /* U+0077 "w" */ - 0x9b, 0x3e, 0x28, 0x82, 0x90, 0xb0, 0x50, 0xb, - 0xd, 0x35, 0x0, 0xa2, 0x76, 0x50, 0x7, 0x81, - 0xa4, 0x0, 0x4b, 0xd, 0x10, 0x0, 0x80, 0x80, - 0x0, - - /* U+0078 "x" */ - 0x9, 0xd0, 0x89, 0x10, 0xc, 0x18, 0x0, 0x0, - 0x5d, 0x30, 0x0, 0x0, 0xe1, 0x0, 0x0, 0x65, - 0x90, 0x0, 0x16, 0xa, 0x20, 0x2c, 0x50, 0x9c, - 0x20, - - /* U+0079 "y" */ - 0x2c, 0x80, 0x5c, 0x20, 0x57, 0x3, 0x40, 0x0, - 0xb0, 0x70, 0x0, 0x9, 0x17, 0x0, 0x0, 0x48, - 0x50, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x7, 0x0, - 0x0, 0x1, 0x50, 0x0, 0xd, 0x90, 0x0, 0x0, - - /* U+007A "z" */ - 0xc, 0x65, 0xa7, 0x0, 0x70, 0x1c, 0x0, 0x0, - 0x9, 0x40, 0x0, 0x2, 0xb0, 0x0, 0x0, 0xb2, - 0x2, 0x0, 0x58, 0x0, 0x70, 0xe, 0x65, 0x8b, - 0x0, - - /* U+007B "{" */ - 0x0, 0x26, 0x0, 0x80, 0x0, 0x70, 0x0, 0x80, - 0x0, 0x80, 0x0, 0x80, 0x5, 0x40, 0x5, 0x40, - 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x70, - 0x0, 0x80, 0x0, 0x27, - - /* U+007C "|" */ - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, - - /* U+007D "}" */ - 0x62, 0x0, 0x7, 0x0, 0x7, 0x0, 0x7, 0x0, - 0x7, 0x0, 0x7, 0x0, 0x4, 0x50, 0x4, 0x50, - 0x7, 0x0, 0x7, 0x0, 0x7, 0x0, 0x7, 0x0, - 0x7, 0x0, 0x62, 0x0, - - /* U+007E "~" */ - 0x5, 0x92, 0x0, 0x3, 0x11, 0xb2, 0x4, 0x0, - 0x1, 0x97, 0x0, - - /* U+007F "" */ - - /* U+3001 "、" */ - 0x0, 0x0, 0x29, 0x50, 0x0, 0xd7, 0x0, 0x4d, - 0x0, 0x1, - - /* U+3002 "。" */ - 0x0, 0x0, 0x67, 0x70, 0x70, 0x70, 0x77, 0x70, - 0x0, 0x0, - - /* U+3005 "々" */ - 0x0, 0x11, 0x0, 0x0, 0x0, 0x49, 0x0, 0x0, - 0x0, 0x82, 0x0, 0x11, 0x1, 0xc7, 0x55, 0xc8, - 0x7, 0x21, 0x0, 0xb0, 0x11, 0x0, 0x5, 0x50, - 0x0, 0x0, 0x8, 0x0, 0x0, 0x6, 0x52, 0x0, - 0x0, 0x2, 0xd3, 0x0, 0x0, 0x0, 0x4d, 0x0, - 0x0, 0x0, 0x3, 0x0, - - /* U+300C "「" */ - 0x88, 0x86, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, - 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, - 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, 0x80, 0x0, - - /* U+300D "」" */ - 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, - 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, - 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x78, 0x88, - - /* U+3041 "ぁ" */ - 0x0, 0x33, 0x0, 0x0, 0x0, 0x55, 0x54, 0x0, - 0x5, 0xa8, 0x30, 0x0, 0x0, 0x63, 0x95, 0x10, - 0x0, 0xb4, 0x71, 0x91, 0x8, 0x67, 0x10, 0x46, - 0x70, 0x58, 0x0, 0x63, 0x78, 0x78, 0x3, 0x80, - 0x1, 0x0, 0x54, 0x0, - - /* U+3042 "あ" */ - 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x9, 0x30, - 0x10, 0x0, 0x0, 0xa, 0x7a, 0x91, 0x0, 0x6, - 0x7c, 0x21, 0x0, 0x0, 0x0, 0x9, 0x2c, 0x75, - 0x0, 0x0, 0x2d, 0x6c, 0x3, 0xb1, 0x3, 0xa9, - 0x37, 0x0, 0x48, 0x1a, 0x9, 0xa0, 0x0, 0x29, - 0x82, 0xa, 0x50, 0x0, 0x65, 0x93, 0x89, 0x90, - 0x2, 0xa0, 0x17, 0x20, 0x20, 0x67, 0x0, 0x0, - 0x0, 0x14, 0x10, 0x0, - - /* U+3043 "ぃ" */ - 0x0, 0x0, 0x0, 0x0, 0x55, 0x0, 0x1, 0x0, - 0x62, 0x0, 0x3, 0x50, 0x81, 0x0, 0x0, 0x82, - 0x71, 0x10, 0x1, 0x57, 0x37, 0x60, 0x0, 0x83, - 0x8, 0x30, 0x0, 0x0, - - /* U+3044 "い" */ - 0x34, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, - 0x5, 0x0, 0x65, 0x0, 0x0, 0x2, 0x90, 0x82, - 0x0, 0x0, 0x0, 0x56, 0x91, 0x1, 0x0, 0x0, - 0x1a, 0x74, 0x14, 0x0, 0x4, 0x7b, 0x1c, 0xb1, - 0x0, 0x0, 0x75, 0x4, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3046 "う" */ - 0x0, 0x32, 0x0, 0x0, 0x0, 0x4, 0xdb, 0x0, - 0x0, 0x2, 0x42, 0x0, 0x0, 0x2, 0x78, 0x20, - 0x3, 0x97, 0x1, 0xb0, 0x58, 0x10, 0x0, 0x92, - 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x3, 0x90, 0x0, 0x0, 0x1b, 0x0, - 0x0, 0x3, 0x91, 0x0, 0x0, 0x43, 0x0, 0x0, - - /* U+3047 "ぇ" */ - 0x0, 0x3, 0x70, 0x0, 0x0, 0x1, 0x60, 0x0, - 0x0, 0x16, 0xb5, 0x0, 0x5, 0x71, 0xa0, 0x0, - 0x0, 0x8, 0x10, 0x0, 0x0, 0x78, 0x40, 0x0, - 0x9, 0x30, 0x80, 0x0, 0x45, 0x0, 0x88, 0x91, - 0x0, 0x0, 0x0, 0x0, - - /* U+3048 "え" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x78, - 0x10, 0x0, 0x0, 0x0, 0x5a, 0x40, 0x0, 0x0, - 0x0, 0x6, 0x30, 0x0, 0x1, 0x47, 0x78, 0x90, - 0x0, 0x6, 0x70, 0x1a, 0x0, 0x0, 0x0, 0x0, - 0x91, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, - 0x0, 0x58, 0x86, 0x0, 0x0, 0x4, 0x80, 0xa, - 0x0, 0x0, 0x4c, 0x0, 0xb, 0x34, 0x81, 0x31, - 0x0, 0x2, 0x66, 0x30, - - /* U+304A "お" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc2, - 0x0, 0x0, 0x0, 0x0, 0xb, 0x10, 0x1, 0x68, - 0x10, 0x0, 0xa6, 0xb2, 0x0, 0xb8, 0x5, 0x9e, - 0x40, 0x0, 0x0, 0x0, 0x0, 0xa1, 0x89, 0x96, - 0x0, 0x0, 0xc, 0x81, 0x0, 0x66, 0x0, 0x1a, - 0xc0, 0x0, 0x0, 0xc0, 0x6, 0x3a, 0x2, 0x0, - 0x39, 0x0, 0x8, 0xc1, 0x74, 0x4b, 0x20, 0x0, - 0x1d, 0x0, 0x55, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+304B "か" */ - 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x3, 0x5a, 0xc9, 0xc1, 0x6, 0x0, - 0x9, 0x5b, 0x10, 0x76, 0x1, 0xb0, 0x0, 0x29, - 0x0, 0x74, 0x0, 0x78, 0x0, 0x92, 0x0, 0xa1, - 0x6, 0xc9, 0x3, 0x80, 0x0, 0xb0, 0x0, 0x62, - 0xc, 0x4, 0x49, 0x60, 0x0, 0x0, 0x14, 0x0, - 0xea, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+304C "が" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0xa0, 0x0, 0x0, - 0x82, 0x0, 0x76, 0x50, 0x0, 0x0, 0xb3, 0x0, - 0x6, 0x0, 0x0, 0x1, 0xb1, 0x10, 0x20, 0x0, - 0x17, 0x8c, 0xa6, 0xc2, 0x19, 0x10, 0x4, 0x2b, - 0x0, 0x83, 0x2, 0xc0, 0x0, 0x47, 0x0, 0xa1, - 0x0, 0x95, 0x0, 0xb0, 0x0, 0xb0, 0x18, 0xd6, - 0x6, 0x60, 0x4, 0x70, 0x0, 0x81, 0x2c, 0x6, - 0x6d, 0x20, 0x0, 0x0, 0x12, 0x0, 0xb5, 0x0, - 0x0, 0x0, - - /* U+304D "き" */ - 0x0, 0x10, 0x0, 0x0, 0x1, 0xe1, 0x0, 0x0, - 0x0, 0x48, 0x6a, 0x20, 0x17, 0x8d, 0x40, 0x11, - 0x0, 0x2, 0xa6, 0xa1, 0x4, 0x79, 0xb7, 0x0, - 0x0, 0x0, 0xb, 0x10, 0x5, 0x99, 0x87, 0xb0, - 0x97, 0x0, 0x17, 0xf4, 0xc0, 0x0, 0x0, 0x10, - 0x69, 0x0, 0x1, 0x0, 0x5, 0xcc, 0xca, 0x0, - - /* U+304E "ぎ" */ - 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x1c, 0x0, - 0x0, 0x37, 0xb4, 0x0, 0x75, 0x2a, 0x40, 0xa1, - 0x1, 0x36, 0xe7, 0x10, 0x0, 0x0, 0x3, 0x25, - 0x54, 0xb2, 0x0, 0x0, 0x12, 0x6e, 0x80, 0x0, - 0x0, 0x2, 0x42, 0x1a, 0x0, 0x0, 0x0, 0x26, - 0x75, 0x69, 0x0, 0x0, 0x69, 0x32, 0x48, 0xe4, - 0x0, 0xb, 0x0, 0x0, 0x1, 0x0, 0x0, 0x5a, - 0x20, 0x26, 0x10, 0x0, 0x0, 0x4a, 0xca, 0x60, - 0x0, 0x0, - - /* U+304F "く" */ - 0x0, 0x1, 0x50, 0x0, 0x6, 0xe0, 0x0, 0x1c, - 0x20, 0x1, 0xa1, 0x0, 0x9, 0x10, 0x0, 0x71, - 0x0, 0x0, 0x46, 0x0, 0x0, 0x3, 0x91, 0x0, - 0x0, 0x2d, 0x20, 0x0, 0x7, 0xd0, 0x0, 0x0, - 0xe3, 0x0, 0x0, 0x30, - - /* U+3050 "ぐ" */ - 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x8b, 0x0, - 0x0, 0x0, 0x3c, 0x10, 0x8, 0x70, 0x1b, 0x10, - 0xa, 0x34, 0x9, 0x0, 0x0, 0x23, 0x6, 0x0, - 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x0, - 0x49, 0x0, 0x0, 0x0, 0x0, 0x5b, 0x0, 0x0, - 0x0, 0x0, 0xaa, 0x0, 0x0, 0x0, 0x2, 0xf0, - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, - - /* U+3051 "け" */ - 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x2, 0xc0, - 0x0, 0x1, 0xe0, 0x0, 0x2, 0xa0, 0x0, 0x0, - 0xc0, 0x10, 0x6, 0x50, 0x4, 0x88, 0xea, 0x80, - 0xa, 0x10, 0x0, 0x0, 0xb0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0xb, 0x3, 0x0, 0x0, - 0xb0, 0x0, 0xc, 0x43, 0x0, 0x2, 0x90, 0x0, - 0xa, 0xd0, 0x0, 0x8, 0x40, 0x0, 0x2, 0xc0, - 0x0, 0x39, 0x0, 0x0, 0x0, 0x0, 0x4, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - - /* U+3052 "げ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x15, 0x70, 0x18, 0x0, 0x0, - 0x1b, 0x6, 0x77, 0x1, 0xe0, 0x0, 0x0, 0xd0, - 0x4, 0x0, 0x48, 0x0, 0x0, 0x2d, 0x9a, 0x0, - 0x8, 0x30, 0x5, 0x87, 0xd1, 0x0, 0x0, 0xa0, - 0x0, 0x0, 0xb, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0xb0, 0x30, 0x0, 0xb, - 0x0, 0x0, 0x8, 0x93, 0x0, 0x4, 0x70, 0x0, - 0x0, 0x3f, 0x10, 0x0, 0xb1, 0x0, 0x0, 0x0, - 0x40, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x50, 0x0, 0x0, 0x0, 0x0, - - /* U+3053 "こ" */ - 0x0, 0x11, 0x1, 0x30, 0x0, 0x0, 0x68, 0xed, - 0x20, 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, - 0x90, 0x0, 0x0, 0x0, 0x7, 0x95, 0x45, 0x7b, - 0x60, 0x2, 0x67, 0x76, 0x20, - - /* U+3054 "ご" */ - 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x10, 0x0, - 0x10, 0x56, 0x72, 0x1, 0x69, 0xcf, 0x60, 0x90, - 0x0, 0x0, 0x37, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xa4, 0x22, 0x48, 0x90, 0x0, 0x1, - 0x69, 0xa9, 0x61, 0x0, 0x0, - - /* U+3055 "さ" */ - 0x1, 0x50, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, - 0x0, 0x1b, 0x25, 0xb0, 0x7, 0x7b, 0xf6, 0x0, - 0x1, 0x20, 0x49, 0x0, 0x0, 0x0, 0x9, 0x50, - 0x19, 0x9a, 0xa9, 0xe0, 0xb1, 0x0, 0x3, 0xd2, - 0xc0, 0x0, 0x0, 0x0, 0x4b, 0x42, 0x33, 0x0, - 0x2, 0x7a, 0xa5, 0x0, - - /* U+3056 "ざ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x14, 0x90, 0x0, 0xd3, 0x0, 0x3, 0xb5, - 0x0, 0x1, 0xb1, 0x5, 0x53, 0x0, 0x0, 0x4, - 0xca, 0x70, 0x0, 0x0, 0x36, 0x66, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x16, - 0x75, 0x2d, 0x10, 0x0, 0x4a, 0x33, 0x59, 0xe7, - 0x0, 0x9, 0x20, 0x0, 0x2, 0x30, 0x0, 0x4a, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xbc, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3057 "し" */ - 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, - 0x94, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, - 0xa1, 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, - 0xa0, 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, - 0xa1, 0x0, 0x0, 0x33, 0x75, 0x0, 0x7, 0x60, - 0xc, 0x99, 0xc5, 0x0, 0x0, 0x22, 0x0, 0x0, - - /* U+3058 "じ" */ - 0x20, 0x0, 0x0, 0x0, 0x98, 0x0, 0x6, 0x0, - 0x85, 0x1, 0x74, 0x90, 0x83, 0x0, 0x56, 0x0, - 0x92, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0xa1, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0x83, 0x0, 0x0, 0x34, 0x58, 0x0, 0x7, 0x70, - 0xa, 0xba, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3059 "す" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, - 0x0, 0x0, 0x1, 0x13, 0x57, 0xd9, 0x9a, 0xa2, - 0x8, 0x96, 0x30, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x69, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa0, 0xb2, - 0x0, 0x0, 0x0, 0x0, 0xa0, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x8a, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x10, - 0x0, 0x0, 0x0, 0x2, 0x60, 0x0, 0x0, 0x0, - - /* U+305A "ず" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x50, 0x0, - 0x0, 0x0, 0xe1, 0x0, 0x85, 0x80, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x6, 0x0, 0x0, 0x2, 0x47, - 0xd9, 0x9a, 0xa1, 0x0, 0x8, 0xa7, 0x41, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x90, 0x93, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x90, 0xa4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9a, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1b, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0x70, - 0x0, 0x0, 0x0, 0x0, - - /* U+305B "せ" */ - 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x91, - 0x0, 0xd1, 0x0, 0x0, 0x9, 0x20, 0xb, 0x0, - 0x0, 0x0, 0x93, 0x57, 0xda, 0xb6, 0x4a, 0x9c, - 0x73, 0xa, 0x0, 0x0, 0x0, 0x91, 0x0, 0xb0, - 0x0, 0x0, 0x8, 0x21, 0xb9, 0x0, 0x0, 0x0, - 0x73, 0x2, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xab, 0xbb, 0x30, - - /* U+305C "ぜ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, - 0x0, 0x0, 0x16, 0x7, 0x4a, 0x0, 0x3, 0x90, - 0x0, 0xe0, 0x37, 0x0, 0x0, 0xb, 0x0, 0xb, - 0x0, 0x0, 0x0, 0x0, 0xb4, 0x69, 0xda, 0xa2, - 0x0, 0x9a, 0x9c, 0x52, 0xa, 0x0, 0x0, 0x0, - 0x0, 0xa0, 0x2, 0x90, 0x0, 0x0, 0x0, 0xa, - 0x2, 0xe4, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x20, - 0x0, 0x0, 0x0, 0x8, 0xbc, 0xca, 0x0, 0x0, - - /* U+305D "そ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, - 0xc4, 0x0, 0x0, 0x8a, 0x42, 0xc4, 0x0, 0x0, - 0x0, 0x39, 0x10, 0x0, 0x0, 0x6, 0x60, 0x2, - 0x30, 0x3, 0x85, 0x79, 0xc9, 0x70, 0x7e, 0x84, - 0x48, 0x0, 0x0, 0x0, 0x1, 0x90, 0x0, 0x0, - 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, 0x5, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xc7, 0x41, 0x0, 0x0, - 0x0, 0x7, 0xa4, 0x0, - - /* U+305E "ぞ" */ - 0x0, 0x0, 0x0, 0x30, 0x2, 0x40, 0x0, 0x23, - 0x67, 0xe6, 0x36, 0x66, 0x0, 0x86, 0x18, 0x70, - 0x8, 0x30, 0x0, 0x1, 0x93, 0x0, 0x0, 0x0, - 0x0, 0x28, 0x0, 0x25, 0x71, 0x0, 0x6, 0x97, - 0x7c, 0xa5, 0x41, 0x0, 0x6a, 0x40, 0x75, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9c, 0x93, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x61, 0x0, 0x0, - - /* U+305F "た" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, - 0x0, 0x0, 0x0, 0x48, 0x14, 0x0, 0x0, 0x24, - 0x9c, 0xa3, 0x0, 0x10, 0x14, 0xb1, 0x2, 0x77, - 0xf5, 0x0, 0xb0, 0x0, 0x17, 0x30, 0x2, 0x90, - 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, - 0xb, 0x0, 0x60, 0x0, 0x0, 0x67, 0x0, 0x80, - 0x0, 0x0, 0x90, 0x0, 0x39, 0xab, 0xc5, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+3060 "だ" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x6, - 0x70, 0x0, 0x43, 0xb2, 0x0, 0x7, 0x53, 0x20, - 0xb, 0x20, 0x3, 0x3b, 0xb7, 0x0, 0x1, 0x0, - 0x2, 0x5c, 0x0, 0x47, 0x8e, 0x10, 0x0, 0xa, - 0x0, 0x2, 0x73, 0x0, 0x0, 0x56, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb0, 0x5, 0x0, 0x0, 0x0, 0x7, 0x50, - 0x19, 0x0, 0x0, 0x0, 0xa, 0x0, 0x4, 0xaa, - 0xbc, 0x10, - - /* U+3061 "ち" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0xc, 0x30, - 0x0, 0x0, 0x0, 0xb, 0x3, 0x71, 0x0, 0x28, - 0xad, 0x86, 0x30, 0x0, 0x0, 0x54, 0x0, 0x0, - 0x0, 0x0, 0xa0, 0x48, 0x99, 0x20, 0x1, 0xc9, - 0x40, 0x2, 0xd0, 0x2, 0xd1, 0x0, 0x0, 0xb2, - 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, - 0x3b, 0x30, 0x0, 0x0, 0x46, 0x40, 0x0, - - /* U+3063 "っ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x78, 0x78, - 0x80, 0xb, 0x71, 0x0, 0x7, 0x40, 0x0, 0x0, - 0x0, 0x47, 0x0, 0x0, 0x0, 0x8, 0x30, 0x0, - 0x0, 0x7, 0x70, 0x0, 0x4, 0x67, 0x20, 0x0, - - /* U+3064 "つ" */ - 0x0, 0x0, 0x17, 0x99, 0x81, 0x0, 0x36, 0xa8, - 0x20, 0x1, 0xb3, 0xb, 0x70, 0x0, 0x0, 0x3, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0xb3, 0x0, 0x0, 0x0, 0x2, 0xb5, 0x0, 0x0, - 0x3, 0x68, 0x81, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+3065 "づ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x72, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x39, 0x0, 0x0, 0x37, 0x89, - 0x61, 0x60, 0x14, 0x8a, 0x50, 0x0, 0x4a, 0x0, - 0x2a, 0x30, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, - 0x0, 0x0, 0x0, 0x18, 0x80, 0x0, 0x0, 0x3, - 0x68, 0x72, 0x0, 0x0, - - /* U+3066 "て" */ - 0x0, 0x0, 0x0, 0x36, 0x82, 0x35, 0x78, 0x87, - 0xbc, 0x83, 0x46, 0x30, 0x9, 0x30, 0x0, 0x0, - 0x0, 0x92, 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, - 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, 0xa, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, - 0x0, 0x1, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x1a, - 0xd7, 0x0, - - /* U+3067 "で" */ - 0x0, 0x0, 0x0, 0x26, 0x89, 0x10, 0x3, 0x47, - 0x98, 0x7c, 0x85, 0x10, 0x8, 0x73, 0x2, 0xb2, - 0x2, 0x0, 0x0, 0x0, 0x1b, 0x10, 0x33, 0xa0, - 0x0, 0x0, 0x93, 0x0, 0x49, 0x40, 0x0, 0x0, - 0xc0, 0x0, 0x3, 0x0, 0x0, 0x1, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6a, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xde, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+3068 "と" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x40, - 0x0, 0x92, 0x3b, 0xb0, 0x0, 0x5d, 0x71, 0x0, - 0x9, 0x80, 0x0, 0x0, 0x66, 0x0, 0x0, 0x0, - 0xa0, 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x20, - 0x7, 0xbc, 0xcd, 0xc3, 0x0, 0x0, 0x0, 0x0, - - /* U+3069 "ど" */ - 0x0, 0x10, 0x0, 0x0, 0x20, 0x0, 0x8, 0x70, - 0x0, 0x43, 0xb0, 0x0, 0x65, 0x0, 0x3, 0x94, - 0x0, 0x5, 0x50, 0x3, 0x11, 0x0, 0x0, 0x28, - 0x19, 0xd4, 0x0, 0x0, 0x1, 0xda, 0x30, 0x0, - 0x0, 0x3, 0xb3, 0x0, 0x0, 0x0, 0x0, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xc1, 0x0, 0x0, 0x10, 0x0, 0x3, - 0xab, 0xbc, 0xd9, 0x0, 0x0, - - /* U+306A "な" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x82, 0x41, 0x0, - 0x0, 0x6, 0x8c, 0x96, 0x5, 0x30, 0x0, 0x8, - 0x10, 0x0, 0x2b, 0x60, 0x2, 0x80, 0x0, 0x96, - 0x56, 0x1, 0xb0, 0x0, 0x9, 0x0, 0x0, 0xb4, - 0x0, 0x1, 0x90, 0x0, 0x3, 0x0, 0x67, 0x59, - 0x0, 0x0, 0x0, 0x92, 0x4, 0xe6, 0x0, 0x0, - 0x9, 0x42, 0x94, 0xa5, 0x0, 0x0, 0x5, 0x73, - 0x0, 0x20, - - /* U+306B "に" */ - 0x26, 0x0, 0x24, 0x6a, 0x50, 0x2c, 0x0, 0x23, - 0x78, 0x20, 0x65, 0x0, 0x1, 0x30, 0x0, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xb0, 0x13, 0x0, 0x0, 0x0, 0xb6, 0x7, - 0x0, 0x0, 0x0, 0x7d, 0x6, 0x50, 0x0, 0x30, - 0x8, 0x0, 0x6a, 0xbc, 0x90, - - /* U+306C "ぬ" */ - 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0xa, 0x20, 0x3d, 0x88, - 0x70, 0x0, 0x6, 0x48, 0x87, 0x0, 0x39, 0x0, - 0x3, 0xc2, 0x72, 0x0, 0xa, 0x10, 0x8, 0xa0, - 0x90, 0x0, 0x8, 0x30, 0x18, 0x69, 0x40, 0x0, - 0xa, 0x0, 0x53, 0xe, 0x32, 0xa9, 0xac, 0x0, - 0x46, 0x92, 0x56, 0x41, 0xa8, 0xb0, 0x6, 0x10, - 0x0, 0x78, 0x20, 0x40, - - /* U+306D "ね" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1b, 0x5, 0x98, 0xa5, 0x0, - 0x29, 0x99, 0x84, 0x0, 0xa, 0x10, 0x1, 0x8d, - 0x10, 0x0, 0x7, 0x40, 0x0, 0xc8, 0x0, 0x0, - 0x6, 0x50, 0x7, 0x48, 0x0, 0x1, 0x9, 0x20, - 0x2b, 0x8, 0x3, 0xb8, 0xae, 0x30, 0x84, 0x99, - 0x7, 0x40, 0x88, 0xa7, 0x0, 0x76, 0x1, 0x9a, - 0x40, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+306E "の" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, - 0xa9, 0x99, 0x10, 0x0, 0x69, 0x16, 0x0, 0x2c, - 0x10, 0x48, 0x0, 0x80, 0x0, 0x58, 0xb, 0x0, - 0x9, 0x0, 0x1, 0xc1, 0x90, 0x0, 0x90, 0x0, - 0xc, 0x36, 0x0, 0x19, 0x0, 0x0, 0xb2, 0x70, - 0x8, 0x30, 0x0, 0x57, 0xb, 0x15, 0x80, 0x0, - 0x2b, 0x0, 0x3a, 0x70, 0x0, 0x69, 0x10, 0x0, - 0x0, 0x2, 0x52, 0x0, 0x0, - - /* U+306F "は" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x24, 0x0, - 0x1, 0xe0, 0x0, 0x4, 0xa0, 0x0, 0xb, 0x0, - 0x0, 0x64, 0x0, 0x1, 0xc8, 0x90, 0xa, 0x0, - 0x16, 0x7c, 0x10, 0x0, 0xa0, 0x0, 0x0, 0xa0, - 0x0, 0x18, 0x0, 0x0, 0xa, 0x0, 0x3, 0x73, - 0x0, 0x0, 0xa0, 0x0, 0x3b, 0x51, 0xa8, 0x9d, - 0x30, 0x0, 0xe3, 0x55, 0x2, 0xaa, 0x70, 0x3, - 0x1, 0xb9, 0xa1, 0x4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+3070 "ば" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x5, 0x0, - 0x0, 0x92, 0x7, 0x49, 0xd, 0x0, 0x0, 0xa1, - 0x2, 0x70, 0x19, 0x0, 0x0, 0x94, 0x92, 0x0, - 0x45, 0x0, 0x68, 0xd5, 0x10, 0x0, 0x72, 0x0, - 0x0, 0x90, 0x0, 0x0, 0x90, 0x0, 0x0, 0x90, - 0x0, 0x0, 0x93, 0x0, 0x0, 0x90, 0x0, 0x0, - 0xa7, 0x5, 0x88, 0xd2, 0x0, 0x0, 0x97, 0xb, - 0x0, 0xaa, 0x70, 0x0, 0x33, 0x9, 0x9a, 0x50, - 0x80, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - - /* U+3071 "ぱ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0, 0x5, - 0x0, 0x0, 0xa1, 0x6, 0x42, 0x0, 0xd0, 0x0, - 0xa, 0x0, 0x66, 0x0, 0x28, 0x0, 0x0, 0xa5, - 0x92, 0x0, 0x5, 0x40, 0x6, 0x8c, 0x40, 0x0, - 0x0, 0x80, 0x0, 0x0, 0x90, 0x0, 0x0, 0x9, - 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x93, 0x0, - 0x0, 0x90, 0x0, 0x0, 0xa, 0x70, 0x78, 0x8d, - 0x30, 0x0, 0x0, 0x96, 0xa, 0x0, 0xb9, 0x80, - 0x0, 0x2, 0x20, 0x89, 0xa4, 0x5, 0x0, 0x0, - - /* U+3072 "ひ" */ - 0x0, 0x4, 0x60, 0x1, 0x20, 0x0, 0x1b, 0x99, - 0xb0, 0x6, 0xd0, 0x0, 0x0, 0x2a, 0x0, 0x3, - 0xd3, 0x0, 0x0, 0xa1, 0x0, 0x2, 0x89, 0x0, - 0x3, 0x70, 0x0, 0x3, 0x7a, 0x50, 0x8, 0x20, - 0x0, 0x6, 0x51, 0xa0, 0xa, 0x0, 0x0, 0xa, - 0x10, 0x0, 0x8, 0x30, 0x0, 0x2a, 0x0, 0x0, - 0x2, 0xa0, 0x1, 0xc2, 0x0, 0x0, 0x0, 0x5b, - 0xaa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+3073 "び" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x17, - 0x30, 0x2, 0x8, 0x55, 0x5b, 0x7d, 0x60, 0xc, - 0x61, 0x60, 0x0, 0x76, 0x0, 0xa, 0x90, 0x0, - 0x2, 0xa0, 0x0, 0xa, 0x83, 0x0, 0x9, 0x20, - 0x0, 0xa, 0x1c, 0x0, 0xb, 0x0, 0x0, 0xb, - 0x5, 0x70, 0xa, 0x0, 0x0, 0x1a, 0x0, 0x0, - 0xb, 0x0, 0x0, 0x84, 0x0, 0x0, 0x9, 0x30, - 0x5, 0xa0, 0x0, 0x0, 0x1, 0xbb, 0xb8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3074 "ぴ" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, 0x16, - 0x30, 0x2, 0x5, 0x5, 0x4b, 0x8c, 0x70, 0xa, - 0x72, 0x51, 0x0, 0x67, 0x0, 0x8, 0xa0, 0x0, - 0x1, 0xa0, 0x0, 0x7, 0x94, 0x0, 0x8, 0x30, - 0x0, 0x8, 0x2c, 0x10, 0xb, 0x0, 0x0, 0xb, - 0x4, 0x70, 0xb, 0x0, 0x0, 0xb, 0x0, 0x0, - 0xb, 0x0, 0x0, 0x67, 0x0, 0x0, 0x9, 0x40, - 0x3, 0xc0, 0x0, 0x0, 0x1, 0xba, 0xba, 0x10, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - - /* U+3075 "ふ" */ - 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x94, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, 0x0, 0x0, - 0x1, 0xa2, 0x0, 0x0, 0x0, 0x4, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x46, 0x3, 0x70, 0x21, 0x60, 0xb, 0x0, 0x78, - 0xba, 0x12, 0xb, 0x0, 0xa, 0x30, 0x5, 0x95, - 0x0, 0x0, - - /* U+3076 "ぶ" */ - 0x0, 0x0, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x9, 0x30, 0x22, 0xa1, 0x0, 0x0, 0x5, 0xf0, - 0xb, 0x30, 0x0, 0x0, 0x57, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x50, - 0x53, 0x0, 0x10, 0x34, 0x0, 0xb0, 0xb, 0x40, - 0x3c, 0x70, 0x20, 0xb0, 0x2, 0x90, 0x4, 0x0, - 0x38, 0x30, 0x0, 0x0, - - /* U+3077 "ぷ" */ - 0x0, 0x0, 0x30, 0x0, 0x4, 0x10, 0x0, 0x0, - 0xa3, 0x2, 0x26, 0x0, 0x0, 0x7, 0xf0, 0x5, - 0x40, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x2, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x40, 0x64, 0x1, 0x3, - 0x50, 0xa, 0x0, 0xb4, 0x4c, 0x62, 0x0, 0xb0, - 0x3, 0x71, 0x40, 0x8, 0x93, 0x0, 0x0, - - /* U+3078 "へ" */ - 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x69, 0x0, 0x0, 0x0, 0x0, 0x85, 0x2, 0x80, - 0x0, 0x0, 0x1a, 0x80, 0x0, 0x57, 0x0, 0x0, - 0x13, 0x0, 0x0, 0x8, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3079 "べ" */ - 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, - 0x20, 0x1, 0x94, 0x80, 0x0, 0x8, 0x69, 0x0, - 0x25, 0x0, 0x0, 0x83, 0x2, 0x80, 0x0, 0x0, - 0x19, 0x60, 0x0, 0x56, 0x0, 0x0, 0x15, 0x0, - 0x0, 0x8, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+307A "ぺ" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x52, 0x40, 0x0, 0x7, 0x69, 0x0, - 0x35, 0x10, 0x0, 0x75, 0x2, 0x90, 0x0, 0x0, - 0x19, 0x70, 0x0, 0x56, 0x0, 0x0, 0x14, 0x0, - 0x0, 0x8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+307B "ほ" */ - 0x3, 0x0, 0x0, 0x1, 0x10, 0xe, 0x0, 0x58, - 0xc8, 0x40, 0xa, 0x0, 0x0, 0xc0, 0x0, 0x46, - 0x0, 0x0, 0xa0, 0x30, 0x72, 0x0, 0x68, 0xda, - 0x70, 0x90, 0x0, 0x0, 0x90, 0x0, 0x91, 0x0, - 0x0, 0x90, 0x0, 0xa6, 0x0, 0x20, 0x90, 0x0, - 0x98, 0x1a, 0x68, 0xe4, 0x0, 0x34, 0x45, 0x3, - 0x98, 0x80, 0x0, 0xa, 0xbb, 0x10, 0x30, - - /* U+307C "ぼ" */ - 0x1, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0xc0, - 0x5, 0x8c, 0x84, 0x4, 0x0, 0xa, 0x0, 0x0, - 0xc0, 0x6, 0x3a, 0x3, 0x60, 0x0, 0xa, 0x0, - 0x28, 0x0, 0x63, 0x0, 0x11, 0xb7, 0x92, 0x0, - 0x7, 0x10, 0x3, 0x6c, 0x30, 0x0, 0x0, 0x91, - 0x0, 0x0, 0xa0, 0x0, 0x0, 0x9, 0x60, 0x0, - 0xa, 0x0, 0x0, 0x0, 0x7a, 0x7, 0x77, 0xd2, - 0x0, 0x0, 0x2, 0x72, 0x60, 0xb, 0x98, 0x0, - 0x0, 0x0, 0x9, 0x89, 0x40, 0x50, 0x0, 0x0, - - /* U+307D "ぽ" */ - 0x1, 0x0, 0x0, 0x1, 0x20, 0x0, 0xc, 0x0, - 0x58, 0xc8, 0x42, 0x83, 0xa, 0x0, 0x0, 0xc0, - 0x4, 0x6, 0x36, 0x0, 0x0, 0xa0, 0x0, 0x40, - 0x63, 0x0, 0x11, 0xb7, 0x92, 0x0, 0x71, 0x0, - 0x36, 0xc3, 0x0, 0x0, 0x90, 0x0, 0x0, 0xa0, - 0x0, 0x0, 0x96, 0x0, 0x0, 0xa0, 0x0, 0x0, - 0x7a, 0x7, 0x77, 0xd2, 0x0, 0x0, 0x28, 0x26, - 0x0, 0xba, 0x70, 0x0, 0x0, 0x9, 0x89, 0x40, - 0x60, 0x0, - - /* U+307E "ま" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, - 0x0, 0x0, 0xb0, 0x21, 0x2, 0x67, 0xda, 0x81, - 0x0, 0x1, 0xa0, 0x0, 0x0, 0x0, 0xb5, 0x80, - 0x2, 0x79, 0xd4, 0x0, 0x0, 0x0, 0xa0, 0x0, - 0x7, 0x88, 0xb0, 0x0, 0x82, 0x3, 0xcb, 0x20, - 0x67, 0x3b, 0x22, 0xd3, 0x4, 0x62, 0x0, 0x12, - - /* U+307F "み" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, - 0x8d, 0x50, 0x0, 0x0, 0x3, 0x20, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x56, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x0, 0x43, 0x0, 0x2, 0x6a, 0x92, 0x7, - 0x60, 0x7, 0x63, 0xa2, 0x7a, 0xc0, 0x3, 0x70, - 0xa1, 0x0, 0x4c, 0xb0, 0x53, 0x84, 0x0, 0x1a, - 0x5, 0x61, 0x84, 0x0, 0x19, 0x10, 0x0, 0x0, - 0x0, 0x15, 0x0, 0x0, 0x0, - - /* U+3080 "む" */ - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0x78, 0x0, 0x71, - 0x0, 0x37, 0xc2, 0x0, 0x1, 0xc0, 0x0, 0x3a, - 0x0, 0x0, 0x6, 0x10, 0x80, 0xc0, 0x0, 0x0, - 0x0, 0x26, 0x1d, 0x0, 0x0, 0x0, 0x1, 0xcd, - 0x80, 0x0, 0x5, 0x0, 0x0, 0x82, 0x0, 0x0, - 0x57, 0x0, 0x9, 0x40, 0x2, 0x6c, 0x50, 0x0, - 0x6, 0x99, 0x84, 0x0, 0x0, - - /* U+3081 "め" */ - 0x0, 0x0, 0x0, 0x71, 0x0, 0x0, 0x1d, 0x0, - 0xb, 0x10, 0x0, 0x0, 0xa1, 0x28, 0xd7, 0x30, - 0x0, 0x5, 0xb6, 0x38, 0x18, 0x80, 0x0, 0x99, - 0x7, 0x20, 0x9, 0x30, 0x73, 0x82, 0x90, 0x0, - 0x56, 0xa, 0x1, 0xd2, 0x0, 0x7, 0x40, 0x90, - 0x5a, 0x60, 0x0, 0xb0, 0xa, 0xa6, 0x0, 0x1, - 0x92, 0x0, 0x0, 0x0, 0x15, 0x60, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x0, 0x0, - - /* U+3082 "も" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, - 0x0, 0x1a, 0x0, 0x0, 0x3, 0x46, 0x0, 0x0, - 0x3, 0xca, 0x80, 0x0, 0x0, 0xa0, 0x0, 0x0, - 0x20, 0xa0, 0x0, 0x20, 0x29, 0xd9, 0x80, 0x24, - 0x1, 0x90, 0x0, 0x25, 0x0, 0xa0, 0x0, 0x63, - 0x0, 0xa4, 0x3, 0xa0, 0x0, 0x7, 0x97, 0x0, - - /* U+3083 "ゃ" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x30, 0x38, - 0x0, 0x0, 0x0, 0xa0, 0x1a, 0x87, 0x10, 0x0, - 0x87, 0x94, 0x2, 0xc0, 0x17, 0xa9, 0x3, 0x0, - 0xc0, 0x13, 0x9, 0x12, 0x89, 0x30, 0x0, 0x2, - 0x90, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, - - /* U+3084 "や" */ - 0x0, 0x0, 0x2, 0x60, 0x0, 0x0, 0x0, 0xa3, - 0x3, 0xc3, 0x0, 0x0, 0x0, 0x74, 0x3, 0xb9, - 0x99, 0xa0, 0x0, 0xc, 0xa6, 0x0, 0x0, 0x74, - 0x3, 0xab, 0x40, 0x10, 0x0, 0x93, 0x49, 0x10, - 0xb0, 0x37, 0x57, 0xa0, 0x0, 0x0, 0x84, 0x0, - 0x32, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x7, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, - - /* U+3085 "ゅ" */ - 0x0, 0x3, 0x60, 0x0, 0x65, 0x3, 0xd8, 0x40, - 0x91, 0x85, 0x72, 0x84, 0x95, 0x50, 0x72, 0x29, - 0xaa, 0x30, 0x90, 0x19, 0x97, 0x17, 0x90, 0x84, - 0x22, 0x7, 0xb9, 0x50, 0x0, 0x45, 0x0, 0x0, - - /* U+3086 "ゆ" */ - 0x0, 0x0, 0x49, 0x10, 0x0, 0x2, 0x30, 0x0, - 0x49, 0x10, 0x0, 0x39, 0x2, 0xa8, 0xc8, 0x90, - 0x6, 0x52, 0xa1, 0xa, 0x3, 0x90, 0x91, 0xa0, - 0x0, 0xa0, 0xc, 0xa, 0x55, 0x30, 0xa, 0x0, - 0xc0, 0xba, 0x6, 0x3, 0x70, 0xb, 0x9, 0xa0, - 0x18, 0x83, 0x9, 0x50, 0x26, 0x0, 0x4e, 0x9a, - 0x40, 0x0, 0x0, 0x2a, 0x20, 0x0, 0x0, 0x0, - 0x14, 0x0, 0x0, 0x0, 0x0, - - /* U+3087 "ょ" */ - 0x0, 0xa, 0x20, 0x0, 0x0, 0xb3, 0x31, 0x0, - 0xa, 0x66, 0x10, 0x0, 0xb0, 0x0, 0x0, 0xb, - 0x0, 0x0, 0x67, 0xe9, 0x30, 0x37, 0x1c, 0x1a, - 0x0, 0xce, 0x40, 0x0, - - /* U+3088 "よ" */ - 0x0, 0xa, 0x20, 0x0, 0x0, 0xa, 0x20, 0x0, - 0x0, 0xa, 0x8a, 0x80, 0x0, 0xa, 0x0, 0x0, - 0x0, 0xa, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, - 0x39, 0x9d, 0x81, 0x0, 0xa0, 0xa, 0x3c, 0x10, - 0x7a, 0xa3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3089 "ら" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x10, 0x0, - 0x0, 0x3, 0xc6, 0x0, 0x2, 0x93, 0x58, 0x0, - 0x9, 0x0, 0x0, 0x0, 0x18, 0x0, 0x21, 0x0, - 0x57, 0x98, 0x68, 0xb1, 0xac, 0x10, 0x0, 0x39, - 0x40, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x94, - 0x0, 0x13, 0x79, 0x50, 0x1, 0x33, 0x10, 0x0, - - /* U+308A "り" */ - 0x0, 0x0, 0x0, 0x7, 0x60, 0x68, 0x10, 0x83, - 0x93, 0x39, 0xa, 0x66, 0x0, 0xc0, 0xab, 0x0, - 0xb, 0xc, 0x70, 0x0, 0xb0, 0xd2, 0x0, 0xb, - 0x5, 0x0, 0x3, 0x70, 0x0, 0x0, 0x91, 0x0, - 0x0, 0x47, 0x0, 0x0, 0x27, 0x0, 0x0, 0x14, - 0x0, 0x0, - - /* U+308B "る" */ - 0x0, 0x0, 0x5a, 0x20, 0x0, 0x7a, 0x83, 0xb5, - 0x0, 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x75, - 0x0, 0x0, 0x0, 0x66, 0x23, 0x10, 0x0, 0x6e, - 0x85, 0x5a, 0x70, 0x9b, 0x10, 0x0, 0xc, 0x7, - 0x3, 0x40, 0x0, 0xb1, 0x2, 0xa4, 0x80, 0x2b, - 0x0, 0xb, 0x46, 0x9b, 0x10, 0x0, 0x15, 0x63, - 0x0, 0x0, - - /* U+308C "れ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x46, - 0x0, 0x0, 0x0, 0xc, 0x29, 0x66, 0x50, 0x0, - 0x18, 0x8d, 0x91, 0x4, 0x60, 0x0, 0x0, 0x6c, - 0x0, 0x6, 0x40, 0x0, 0x0, 0xc9, 0x0, 0x8, - 0x10, 0x0, 0x5, 0x79, 0x0, 0xa, 0x0, 0x0, - 0xc, 0x9, 0x0, 0x9, 0x0, 0x12, 0x66, 0x9a, - 0x0, 0x9, 0x35, 0x70, 0x10, 0x68, 0x0, 0x1, - 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+308D "ろ" */ - 0x0, 0x0, 0x36, 0x90, 0x0, 0x0, 0x89, 0x43, - 0xd1, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x0, 0x0, - 0x1, 0x90, 0x0, 0x0, 0x0, 0x1a, 0x57, 0x74, - 0x0, 0x2, 0xda, 0x40, 0x15, 0xa0, 0x2d, 0x40, - 0x0, 0x0, 0x92, 0x11, 0x0, 0x0, 0x0, 0xa1, - 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x2, 0x56, - 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+308F "わ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x30, 0x34, 0x30, 0x0, - 0x4, 0x8d, 0x79, 0x54, 0x6a, 0x10, 0x4, 0x1e, - 0x70, 0x0, 0x2, 0xa0, 0x0, 0x8e, 0x0, 0x0, - 0x0, 0xb0, 0x2, 0xba, 0x0, 0x0, 0x0, 0xa0, - 0xb, 0x2a, 0x0, 0x0, 0x2, 0x80, 0x2b, 0x7b, - 0x0, 0x0, 0x29, 0x0, 0x1, 0x2d, 0x0, 0x4, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3092 "を" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0xb2, - 0x0, 0x0, 0x1, 0x1, 0xa1, 0x64, 0x0, 0x2, - 0x8d, 0xa8, 0x40, 0x0, 0x0, 0x47, 0x0, 0x0, - 0x0, 0x1, 0xd8, 0x93, 0x0, 0x87, 0xd, 0x60, - 0xb, 0x7a, 0x51, 0x14, 0x0, 0x8d, 0x30, 0x0, - 0x0, 0x2a, 0x3a, 0x0, 0x0, 0x0, 0xa1, 0x16, - 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x2a, 0xaa, 0xba, 0x0, - - /* U+3093 "ん" */ - 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x10, 0x0, 0x0, 0x0, 0x2, 0x98, 0xa5, 0x0, - 0x0, 0x0, 0x9c, 0x20, 0xa0, 0x0, 0x20, 0x2f, - 0x20, 0xa, 0x0, 0x6, 0xa, 0x70, 0x0, 0xb0, - 0x7, 0x11, 0xd0, 0x0, 0xb, 0x58, 0x50, 0x1, - 0x0, 0x0, 0x15, 0x10, 0x0, - - /* U+30A1 "ァ" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x46, 0x77, 0xc5, - 0x7, 0x62, 0x4, 0xa2, 0x0, 0x4, 0x74, 0x0, - 0x0, 0x6, 0x60, 0x0, 0x0, 0xa, 0x20, 0x0, - 0x0, 0x1a, 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, - 0x4, 0x10, 0x0, 0x0, - - /* U+30A2 "ア" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, - 0x78, 0xe6, 0x1c, 0xb8, 0x62, 0x4, 0xd3, 0x1, - 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x5a, 0x50, - 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0x0, - 0xb1, 0x0, 0x0, 0x0, 0x2, 0xa0, 0x0, 0x0, - 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x48, 0x0, - 0x0, 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, 0x3, - 0x0, 0x0, 0x0, 0x0, - - /* U+30A3 "ィ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, - 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x69, 0x0, - 0x0, 0x8, 0x8a, 0x0, 0x2, 0x72, 0xa, 0x0, - 0x1, 0x0, 0x9, 0x0, 0x0, 0x0, 0x1a, 0x0, - 0x0, 0x0, 0x19, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+30A4 "イ" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, - 0xe0, 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, - 0x95, 0x0, 0x0, 0x0, 0x99, 0x0, 0x0, 0x1, - 0xa5, 0xd0, 0x0, 0x5, 0x71, 0xb, 0x0, 0x3, - 0x10, 0x0, 0xa0, 0x0, 0x0, 0x0, 0xa, 0x0, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x1b, - 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, - - /* U+30A6 "ウ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd2, - 0x0, 0x0, 0x0, 0x0, 0xa2, 0x25, 0x80, 0x29, - 0x89, 0xa8, 0x63, 0xe3, 0xb, 0x0, 0x0, 0x4, - 0x90, 0xc, 0x0, 0x0, 0xb, 0x10, 0xd, 0x0, - 0x0, 0x66, 0x0, 0x2, 0x0, 0x2, 0xa0, 0x0, - 0x0, 0x0, 0xb, 0x10, 0x0, 0x0, 0x0, 0x92, - 0x0, 0x0, 0x0, 0x17, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+30A7 "ェ" */ - 0x0, 0x12, 0x36, 0x91, 0x0, 0x7, 0x7c, 0x40, - 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, 0x9, - 0x10, 0x0, 0x2, 0x45, 0xc9, 0xab, 0x50, 0x56, - 0x42, 0x0, 0x0, - - /* U+30A8 "エ" */ - 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x7, 0x89, - 0xa9, 0x97, 0x0, 0x0, 0x22, 0xd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, 0x0, - 0x0, 0x7, 0x78, 0x9c, 0x99, 0xaa, 0x70, 0x44, - 0x10, 0x0, 0x0, 0x0, - - /* U+30AA "オ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x92, 0x0, - 0x0, 0x0, 0x0, 0x2a, 0x68, 0xa3, 0x4, 0xb9, - 0x89, 0xf2, 0x10, 0x0, 0x0, 0x1, 0xb9, 0x10, - 0x0, 0x0, 0x0, 0xb2, 0x91, 0x0, 0x0, 0x0, - 0xa3, 0x9, 0x10, 0x0, 0x0, 0x92, 0x0, 0x91, - 0x0, 0x2, 0x60, 0x1, 0x19, 0x20, 0x0, 0x0, - 0x0, 0x9, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x0, 0x0, - - /* U+30AB "カ" */ - 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0x0, 0x1a, 0x37, 0x90, 0x7, - 0x99, 0xba, 0x52, 0xe1, 0x2, 0x20, 0xb0, 0x2, - 0xa0, 0x0, 0x2, 0x90, 0x6, 0x60, 0x0, 0xa, - 0x10, 0xb, 0x10, 0x0, 0x65, 0x0, 0x1c, 0x0, - 0x4, 0x70, 0x9, 0xa7, 0x0, 0x14, 0x0, 0x3, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30AC "ガ" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x50, 0x0, 0x0, - 0x9, 0x30, 0x54, 0x92, 0x0, 0x0, 0xb, 0x30, - 0xb, 0x0, 0x0, 0x0, 0xc, 0x4, 0x81, 0x0, - 0x3, 0x68, 0x9d, 0x85, 0xb6, 0x0, 0x0, 0x41, - 0x56, 0x0, 0xb1, 0x0, 0x0, 0x0, 0xb1, 0x0, - 0xb0, 0x0, 0x0, 0x3, 0x80, 0x4, 0x70, 0x0, - 0x0, 0xa, 0x0, 0x9, 0x20, 0x0, 0x0, 0x82, - 0x6, 0x6c, 0x0, 0x0, 0x4, 0x10, 0x1, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30AD "キ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0x1, 0xb6, 0x89, 0x30, 0x7, 0x97, 0xa3, 0x0, - 0x0, 0x0, 0x0, 0x54, 0x3, 0x40, 0x23, 0x57, - 0xac, 0x87, 0x51, 0x47, 0x31, 0x9, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x0, 0x0, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x0, - - /* U+30AE "ギ" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x2b, - 0x0, 0x32, 0xc0, 0x0, 0x0, 0xb0, 0x1, 0xc0, - 0x0, 0x0, 0x1b, 0x79, 0x80, 0x0, 0x6, 0x96, - 0x93, 0x0, 0x0, 0x0, 0x0, 0x4, 0x51, 0x35, - 0x0, 0x24, 0x68, 0x9c, 0x86, 0x51, 0x3, 0x63, - 0x0, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+30AF "ク" */ - 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x9, 0x80, - 0x0, 0x0, 0x1, 0xd2, 0x25, 0x10, 0x0, 0x97, - 0x75, 0x9b, 0x0, 0x66, 0x0, 0xd, 0x20, 0x23, - 0x0, 0x8, 0x50, 0x0, 0x0, 0x3, 0xa0, 0x0, - 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, 0xb2, 0x0, - 0x0, 0x1, 0xa3, 0x0, 0x0, 0x3, 0x71, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - - /* U+30B0 "グ" */ - 0x0, 0x0, 0x31, 0x0, 0x31, 0x0, 0x0, 0xa, - 0x60, 0x36, 0xb0, 0x0, 0x2, 0xd3, 0x36, 0x82, - 0x0, 0x0, 0xa6, 0x64, 0xa9, 0x0, 0x0, 0x74, - 0x0, 0x1d, 0x10, 0x0, 0x32, 0x0, 0xa, 0x30, - 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, - 0x2, 0xb0, 0x0, 0x0, 0x0, 0x1, 0xb1, 0x0, - 0x0, 0x0, 0x2, 0xa1, 0x0, 0x0, 0x0, 0x4, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+30B1 "ケ" */ - 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, 0xe, 0x30, - 0x0, 0x0, 0x0, 0x67, 0x3, 0x69, 0xa4, 0x1, - 0xba, 0x89, 0x91, 0x0, 0x9, 0x10, 0x7, 0x70, - 0x0, 0x30, 0x0, 0xb, 0x10, 0x0, 0x0, 0x0, - 0x38, 0x0, 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, - 0x0, 0x6, 0x40, 0x0, 0x0, 0x0, 0x34, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30B2 "ゲ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, - 0x0, 0x0, 0x83, 0x0, 0xd, 0x20, 0x0, 0x75, - 0x70, 0x6, 0x70, 0x3, 0x66, 0x60, 0x1, 0xb9, - 0x8a, 0xa3, 0x20, 0x0, 0x91, 0x0, 0x69, 0x0, - 0x0, 0x30, 0x0, 0xb, 0x10, 0x0, 0x0, 0x0, - 0x4, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, 0x0, 0x0, - 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+30B3 "コ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x78, 0x99, - 0xd6, 0x1, 0x53, 0x0, 0x8, 0x50, 0x0, 0x0, - 0x0, 0xa0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0x0, 0xa0, 0x0, 0x0, 0x13, 0x79, 0x0, - 0x8b, 0xa8, 0x65, 0x40, - - /* U+30B4 "ゴ" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x72, 0xb0, 0x0, 0x0, 0x0, 0x1, - 0x19, 0x0, 0x2, 0x46, 0x78, 0x8c, 0x80, 0x0, - 0x1, 0x74, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0x0, 0x13, 0x6a, 0x0, 0x0, 0x8, 0xb9, - 0x76, 0x54, 0x0, 0x0, - - /* U+30B5 "サ" */ - 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0xd, - 0x10, 0xd, 0x0, 0x0, 0x0, 0xa, 0x0, 0xb, - 0x0, 0x0, 0x1, 0x2c, 0x67, 0x8d, 0x9a, 0xa1, - 0x59, 0x6c, 0x20, 0xb, 0x0, 0x0, 0x0, 0xb, - 0x0, 0x1a, 0x0, 0x0, 0x0, 0xb, 0x0, 0x47, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, - 0x0, 0x0, - - /* U+30B6 "ザ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, - 0x0, 0x0, 0x40, 0x43, 0x85, 0x0, 0x3, 0xa0, - 0xb, 0x20, 0xa1, 0x10, 0x0, 0xa, 0x0, 0xa0, - 0x0, 0x0, 0x0, 0x2, 0xc7, 0x7d, 0x89, 0xa2, - 0x0, 0x99, 0x5b, 0x0, 0xa0, 0x0, 0x0, 0x0, - 0x1, 0xa0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x19, - 0x0, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - - /* U+30B7 "シ" */ - 0x2, 0x72, 0x0, 0x0, 0x0, 0x0, 0x2, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x6, - 0x4, 0x93, 0x0, 0x0, 0x8, 0x10, 0x2, 0xc0, - 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, 0x1a, 0x20, - 0x0, 0x0, 0x0, 0x5b, 0x10, 0x0, 0x0, 0x26, - 0xc8, 0x0, 0x0, 0x0, 0xa, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30B8 "ジ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x48, 0x0, 0x2, 0x72, 0x0, 0x49, 0x50, - 0x0, 0x2, 0xd2, 0x0, 0x40, 0x0, 0x10, 0x1, - 0x0, 0x0, 0x6, 0x1, 0x96, 0x0, 0x0, 0x9, - 0x10, 0x0, 0xb3, 0x0, 0xa, 0x30, 0x0, 0x0, - 0x0, 0x1b, 0x30, 0x0, 0x0, 0x0, 0x5b, 0x10, - 0x0, 0x0, 0x15, 0xa7, 0x0, 0x0, 0x0, 0x6, - 0xb1, 0x0, 0x0, 0x0, 0x0, - - /* U+30B9 "ス" */ - 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x1, 0x34, - 0x89, 0xad, 0x0, 0x0, 0x39, 0x61, 0xa, 0x50, - 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x89, 0x60, - 0x0, 0x0, 0x0, 0x59, 0x4, 0x80, 0x0, 0x0, - 0x69, 0x0, 0x8, 0x80, 0x0, 0x85, 0x0, 0x0, - 0x1e, 0x20, 0x30, 0x0, 0x0, 0x0, 0x51, - - /* U+30BA "ズ" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x71, 0x0, 0x0, - 0x0, 0x11, 0x57, 0x26, 0x1, 0x24, 0x79, 0xbc, - 0x8, 0x0, 0x3, 0xa5, 0x10, 0xa4, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x40, - 0x0, 0x0, 0x0, 0x4, 0x90, 0x58, 0x0, 0x0, - 0x0, 0x48, 0x0, 0x8, 0x80, 0x0, 0x6, 0x50, - 0x0, 0x0, 0xe2, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x30, 0x0, - - /* U+30BB "セ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x39, - 0x0, 0x0, 0xb, 0x6, 0x96, 0xe4, 0x0, 0x5, - 0xd8, 0x20, 0x84, 0x0, 0x6b, 0x5b, 0x0, 0x35, - 0x0, 0x0, 0x0, 0xb0, 0x1, 0x0, 0x0, 0x0, - 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, - 0x14, 0x10, 0x0, 0x1, 0x9b, 0xba, 0x70, - - /* U+30BC "ゼ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x35, 0xb1, 0x0, 0x0, 0xd2, - 0x0, 0x0, 0x92, 0x0, 0x0, 0xb, 0x0, 0x2, - 0x81, 0x0, 0x0, 0x0, 0xb1, 0x69, 0x8e, 0x50, - 0x0, 0x0, 0x5e, 0x72, 0x8, 0x30, 0x0, 0x6, - 0xb4, 0xb0, 0x4, 0x40, 0x0, 0x0, 0x0, 0xb, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0x50, 0x12, 0x52, - 0x0, 0x0, 0x0, 0x18, 0xab, 0xa8, 0x10, 0x0, - - /* U+30BD "ソ" */ - 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x6a, - 0x59, 0x0, 0x0, 0x88, 0xd, 0x20, 0x0, 0xd1, - 0x5, 0x10, 0x5, 0x80, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x94, 0x0, 0x0, 0x6, 0x70, 0x0, - 0x0, 0x67, 0x0, 0x0, 0x6, 0x40, 0x0, 0x0, - 0x10, 0x0, 0x0, 0x0, - - /* U+30BF "タ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x66, - 0x0, 0x0, 0x0, 0x0, 0xd9, 0x8b, 0xe0, 0x0, - 0x8, 0x64, 0x18, 0x80, 0x0, 0x7b, 0x10, 0x1d, - 0x0, 0x7, 0x60, 0xb5, 0x95, 0x0, 0x21, 0x0, - 0x1d, 0xa0, 0x0, 0x0, 0x0, 0x1b, 0x0, 0x0, - 0x0, 0x1, 0xb1, 0x0, 0x0, 0x0, 0x4a, 0x10, - 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x0, 0x0, 0x0, - - /* U+30C0 "ダ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x92, 0x0, 0x0, 0x9, - 0x20, 0x1, 0x95, 0x50, 0x0, 0x2, 0xe7, 0x8c, - 0xa1, 0x40, 0x0, 0x0, 0xb5, 0x40, 0xb3, 0x0, - 0x0, 0x0, 0x98, 0x0, 0x49, 0x0, 0x0, 0x0, - 0x83, 0x2c, 0x2c, 0x10, 0x0, 0x0, 0x20, 0x0, - 0x4d, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x17, 0x40, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30C1 "チ" */ - 0x0, 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, - 0x48, 0xb6, 0x20, 0x0, 0x0, 0x14, 0x21, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd4, 0x57, 0x50, - 0x7, 0xba, 0x99, 0xc5, 0x44, 0x40, 0x0, 0x0, - 0x4, 0x70, 0x0, 0x0, 0x0, 0x0, 0x9, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, - - /* U+30C3 "ッ" */ - 0x0, 0x20, 0x0, 0x0, 0x41, 0x47, 0x3, 0xd0, - 0x1c, 0x8, 0x6, 0x80, 0x4, 0x0, 0xc, 0x10, - 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0x80, 0x0, - 0x0, 0x38, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, - - /* U+30C4 "ツ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x20, - 0x0, 0x70, 0x16, 0x1, 0xd0, 0x1, 0xe1, 0xa, - 0x40, 0x90, 0x7, 0x60, 0x5, 0x50, 0x0, 0x1b, - 0x0, 0x0, 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, - 0x4, 0x80, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x0, - 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, 0x26, 0x0, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - - /* U+30C6 "テ" */ - 0x0, 0x0, 0x2, 0x61, 0x0, 0x0, 0x59, 0x86, - 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, - 0x56, 0x87, 0x8a, 0xb1, 0x36, 0x31, 0x79, 0x0, - 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0x8, 0x40, 0x0, 0x0, - 0x0, 0x38, 0x0, 0x0, 0x0, 0x2, 0x80, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - - /* U+30C7 "デ" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, - 0x1, 0x41, 0x25, 0x93, 0x0, 0x49, 0x87, 0x63, - 0x8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x12, 0x46, 0x78, 0x9a, 0xb2, 0x0, 0x26, 0x42, - 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x50, 0x0, 0x0, 0x0, 0x0, 0x19, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30C8 "ト" */ - 0x18, 0x0, 0x0, 0xc, 0x0, 0x0, 0xb, 0x0, - 0x0, 0xb, 0x10, 0x0, 0xa, 0x59, 0x20, 0xa, - 0x1, 0xd5, 0xa, 0x0, 0x14, 0xa, 0x0, 0x0, - 0xb, 0x0, 0x0, 0xb, 0x0, 0x0, 0x3, 0x0, - 0x0, - - /* U+30C9 "ド" */ - 0x81, 0x0, 0x3, 0x0, 0xb2, 0x1, 0x53, 0xb0, - 0xa0, 0x0, 0x67, 0x30, 0xa3, 0x0, 0x0, 0x0, - 0xa2, 0x94, 0x0, 0x0, 0xa0, 0xb, 0x70, 0x0, - 0xa0, 0x0, 0x50, 0x0, 0xa0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x0, 0x0, - - /* U+30CA "ナ" */ - 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x2c, - 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x0, 0x0, - 0x23, 0x6d, 0x99, 0xb5, 0x7a, 0x75, 0x58, 0x0, - 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x0, - 0x91, 0x0, 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, - 0x0, 0x8, 0x20, 0x0, 0x0, 0x0, 0x44, 0x0, - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+30CB "ニ" */ - 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x8, - 0xa8, 0x87, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0x88, - 0x88, 0x88, 0x9a, 0x90, 0x2, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+30CD "ネ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x96, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, - 0x0, 0x37, 0xc7, 0x0, 0x1, 0xa9, 0x52, 0xc1, - 0x0, 0x0, 0x0, 0x1b, 0x10, 0x0, 0x0, 0x2, - 0xc6, 0x23, 0x0, 0x0, 0x49, 0x2a, 0x6, 0xa0, - 0x6, 0x50, 0x9, 0x0, 0x84, 0x20, 0x0, 0xa, - 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x0, 0x0, - - /* U+30CE "ノ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xe0, 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, - 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, 0xc2, - 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, - 0x85, 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, - 0x1, 0x92, 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, - 0x0, 0x0, - - /* U+30CF "ハ" */ - 0x0, 0x0, 0x60, 0x1, 0x0, 0x0, 0x0, 0x1, - 0xf2, 0x1, 0x70, 0x0, 0x0, 0x9, 0x60, 0x0, - 0x49, 0x0, 0x0, 0x3a, 0x0, 0x0, 0xa, 0x60, - 0x1, 0xa0, 0x0, 0x0, 0x1, 0xe0, 0x7, 0x0, - 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+30D0 "バ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x22, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x48, 0x51, 0x0, 0x0, 0x50, 0x1, 0x3, 0x0, - 0x0, 0x1, 0xe1, 0x0, 0x70, 0x0, 0x0, 0x8, - 0x50, 0x0, 0x29, 0x0, 0x0, 0x29, 0x0, 0x0, - 0x9, 0x60, 0x0, 0x90, 0x0, 0x0, 0x1, 0xe0, - 0x6, 0x0, 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+30D1 "パ" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x41, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x16, 0x40, 0x0, 0x0, 0x40, 0x1, 0x20, 0x0, - 0x0, 0x0, 0xd3, 0x0, 0x71, 0x0, 0x0, 0x5, - 0x80, 0x0, 0xb, 0x0, 0x0, 0x1a, 0x0, 0x0, - 0x6, 0x90, 0x0, 0x91, 0x0, 0x0, 0x0, 0xe2, - 0x6, 0x10, 0x0, 0x0, 0x0, 0x73, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+30D2 "ヒ" */ - 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0x1, 0x0, 0xb0, 0x15, 0xae, 0x40, - 0xb5, 0x53, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0x96, 0x10, 0x13, 0x50, 0x6, 0x99, 0x98, 0x60, - - /* U+30D3 "ビ" */ - 0x0, 0x0, 0x0, 0x10, 0x2, 0xc0, 0x0, 0x2, - 0xa4, 0xb, 0x0, 0x0, 0x79, 0x30, 0xb0, 0x0, - 0x28, 0x20, 0xb, 0x3, 0x9a, 0x61, 0x0, 0xc6, - 0x40, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0xc, 0x30, 0x1, 0x44, - 0x0, 0x28, 0x99, 0x98, 0x40, - - /* U+30D4 "ピ" */ - 0x0, 0x0, 0x0, 0x6, 0x90, 0xa, 0x0, 0x0, - 0x5, 0x32, 0xc, 0x0, 0x0, 0x1, 0x20, 0xb, - 0x0, 0x1, 0xa1, 0x0, 0xb, 0x3, 0x8a, 0x61, - 0x0, 0xb, 0x54, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x0, - 0x9, 0x52, 0x12, 0x46, 0x0, 0x0, 0x68, 0x98, - 0x75, 0x0, - - /* U+30D5 "フ" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x14, 0x46, 0x89, - 0x99, 0xf4, 0x7, 0x63, 0x10, 0x3, 0xc0, 0x0, - 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, 0x67, - 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, - 0x2b, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x0, - 0x0, 0x57, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, - 0x0, 0x0, - - /* U+30D6 "ブ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x8, 0x2b, 0x0, 0x0, 0x2, - 0x57, 0xa7, 0x25, 0x0, 0x7b, 0xa8, 0x63, 0x17, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30D7 "プ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x15, 0x0, 0x0, 0x1, - 0x36, 0x95, 0x4, 0x0, 0x8b, 0x99, 0x75, 0x28, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30D9 "ベ" */ - 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, - 0x10, 0x4, 0x48, 0x50, 0x0, 0x9, 0xb5, 0x0, - 0x90, 0x0, 0x0, 0xa4, 0x9, 0x50, 0x0, 0x0, - 0x2b, 0x50, 0x0, 0xb4, 0x0, 0x0, 0x35, 0x0, - 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x41, - - /* U+30DA "ペ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x26, 0x40, 0x0, 0x0, 0x0, 0x30, 0x34, - 0x60, 0x0, 0x0, 0xb, 0x98, 0x1, 0x0, 0x0, - 0x0, 0xb2, 0x7, 0x70, 0x0, 0x0, 0x3c, 0x30, - 0x0, 0x96, 0x0, 0x0, 0x13, 0x0, 0x0, 0xa, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x10, - - /* U+30DB "ホ" */ - 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0xb0, 0x23, 0x30, 0x5b, - 0x99, 0xd8, 0x77, 0x70, 0x0, 0x0, 0xb0, 0x0, - 0x0, 0x0, 0x20, 0xb0, 0x4, 0x0, 0x5, 0x20, - 0xb0, 0x3, 0x80, 0x2c, 0x0, 0xb0, 0x0, 0xc2, - 0x52, 0x6, 0xd0, 0x0, 0x31, 0x0, 0x2, 0xc0, - 0x0, 0x0, - - /* U+30DC "ボ" */ - 0x0, 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, 0x9, - 0x10, 0x72, 0xb0, 0x0, 0x0, 0xb1, 0x2, 0x60, - 0x0, 0x0, 0xa, 0x1, 0x32, 0x0, 0x4a, 0x98, - 0xd8, 0x87, 0x70, 0x0, 0x0, 0xa, 0x0, 0x0, - 0x0, 0x0, 0x20, 0xa0, 0x4, 0x0, 0x0, 0x52, - 0xa, 0x0, 0x47, 0x0, 0x1c, 0x0, 0xa0, 0x0, - 0xc2, 0x6, 0x30, 0x6c, 0x10, 0x4, 0x10, 0x0, - 0x3, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+30DD "ポ" */ - 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x91, - 0x50, 0x50, 0x0, 0x0, 0xb1, 0x16, 0x20, 0x0, - 0x0, 0xa0, 0x23, 0x30, 0x5b, 0x98, 0xd8, 0x76, - 0x60, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, 0x20, - 0xa0, 0x4, 0x0, 0x5, 0x20, 0xa0, 0x3, 0x80, - 0x2c, 0x0, 0xa0, 0x0, 0xc2, 0x52, 0x6, 0xc1, - 0x0, 0x31, 0x0, 0x2, 0xc0, 0x0, 0x0, - - /* U+30DE "マ" */ - 0x0, 0x0, 0x0, 0x24, 0x61, 0x7b, 0x98, 0x88, - 0x64, 0xb9, 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, - 0x4, 0x0, 0x65, 0x0, 0x0, 0x2, 0x95, 0x20, - 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x20, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, - - /* U+30DF "ミ" */ - 0x4, 0x20, 0x0, 0x0, 0x6b, 0x70, 0x0, 0x0, - 0xa5, 0x1, 0x0, 0x0, 0x4, 0x96, 0x0, 0x0, - 0x7, 0xc0, 0x0, 0x0, 0x20, 0x35, 0x10, 0x0, - 0x1, 0x8b, 0x40, 0x0, 0x2, 0xc6, 0x0, 0x0, - 0x2, - - /* U+30E0 "ム" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x88, - 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, - 0x3, 0x90, 0x0, 0x0, 0x0, 0x9, 0x10, 0x0, - 0x0, 0x0, 0x28, 0x0, 0x40, 0x0, 0x0, 0x91, - 0x0, 0x2a, 0x0, 0x3, 0x70, 0x15, 0x79, 0x90, - 0x1d, 0xaa, 0x83, 0x0, 0xe1, 0x18, 0x20, 0x0, - 0x0, 0x40, - - /* U+30E1 "メ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xc0, 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, - 0x2, 0x20, 0x2b, 0x0, 0x0, 0x0, 0x39, 0xc2, - 0x0, 0x0, 0x0, 0x7, 0xd8, 0x0, 0x0, 0x0, - 0x39, 0xa, 0x70, 0x0, 0x2, 0xb0, 0x0, 0x40, - 0x0, 0x39, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+30E2 "モ" */ - 0x0, 0x0, 0x1, 0x47, 0x81, 0x0, 0x7, 0x98, - 0xc4, 0x21, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb2, 0x46, 0x71, 0x6, 0xa9, - 0x8c, 0x65, 0x43, 0x10, 0x0, 0x0, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb2, 0x1, 0x20, 0x0, 0x0, 0x2, 0x9a, - 0xa6, 0x0, - - /* U+30E3 "ャ" */ - 0x0, 0x9, 0x50, 0x0, 0x0, 0x0, 0x3, 0x90, - 0x5, 0x70, 0x0, 0x4, 0xd8, 0x74, 0xc1, 0x6, - 0x94, 0x82, 0x6, 0x10, 0x0, 0x0, 0x37, 0x2, - 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x20, 0x0, 0x0, 0x0, 0x3, 0x40, 0x0, - - /* U+30E4 "ヤ" */ - 0x0, 0x4, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x5b, - 0x70, 0x0, 0x9, 0x98, 0x84, 0x97, 0x1a, 0xa8, - 0x68, 0x0, 0x19, 0x0, 0x0, 0x0, 0xa0, 0x7, - 0x0, 0x0, 0x0, 0x9, 0x10, 0x20, 0x0, 0x0, - 0x0, 0x55, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, - - /* U+30E5 "ュ" */ - 0x0, 0x12, 0x35, 0x30, 0x0, 0x0, 0x67, 0x46, - 0xb0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, - 0x0, 0xb, 0x0, 0x0, 0x7, 0x88, 0x9d, 0xab, - 0x90, 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+30E7 "ョ" */ - 0x0, 0x0, 0x1, 0x10, 0x3, 0xba, 0x9a, 0xd0, - 0x0, 0x0, 0x2, 0xa0, 0x1, 0xa9, 0x8a, 0x70, - 0x0, 0x0, 0x6, 0x40, 0x0, 0x0, 0x8, 0x20, - 0x8, 0xa9, 0x9a, 0x30, - - /* U+30E8 "ヨ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0x89, 0xaa, - 0xd5, 0x0, 0x21, 0x0, 0x7, 0x70, 0x0, 0x0, - 0x0, 0x93, 0x0, 0x0, 0x0, 0xb, 0x0, 0x2b, - 0xb9, 0x98, 0xc0, 0x0, 0x0, 0x0, 0xa, 0x0, - 0x0, 0x0, 0x2, 0x80, 0xb, 0xba, 0x99, 0xb8, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30E9 "ラ" */ - 0x0, 0x0, 0x1, 0x35, 0x0, 0x0, 0x7a, 0x98, - 0x65, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x35, 0x69, 0x9a, 0xe0, 0x6, 0x74, 0x20, 0x3, - 0xb0, 0x0, 0x0, 0x0, 0xb, 0x10, 0x0, 0x0, - 0x0, 0x85, 0x0, 0x0, 0x0, 0x7, 0x70, 0x0, - 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x18, 0x30, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - - /* U+30EA "リ" */ - 0x5, 0x0, 0xa, 0x0, 0xc1, 0x0, 0xe0, 0xb, - 0x0, 0xc, 0x0, 0xb0, 0x0, 0xc0, 0xb, 0x0, - 0xc, 0x0, 0xc0, 0x0, 0xb0, 0x3, 0x0, 0x29, - 0x0, 0x0, 0x9, 0x30, 0x0, 0x3, 0x90, 0x0, - 0x3, 0x80, 0x0, 0x1, 0x30, 0x0, 0x0, - - /* U+30EB "ル" */ - 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x20, - 0xe, 0x10, 0x0, 0x0, 0x0, 0xd2, 0xc, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0xb, 0x0, 0x0, 0x50, - 0x0, 0xc0, 0xb, 0x0, 0x6, 0x30, 0x0, 0xc0, - 0xb, 0x0, 0x76, 0x0, 0x2, 0x80, 0xb, 0x1a, - 0x60, 0x0, 0x9, 0x10, 0xd, 0xd3, 0x0, 0x0, - 0x32, 0x0, 0x3, 0x10, 0x0, 0x0, - - /* U+30EC "レ" */ - 0x24, 0x0, 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, - 0xb, 0x0, 0x0, 0x62, 0xb, 0x0, 0x59, 0x10, - 0xb, 0x3b, 0x60, 0x0, 0x1f, 0xb1, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, - - /* U+30ED "ロ" */ - 0x0, 0x0, 0x24, 0x69, 0x20, 0xf9, 0x97, 0x53, - 0xa9, 0xc, 0x0, 0x0, 0xb, 0x20, 0xb0, 0x0, - 0x0, 0xb0, 0xa, 0x10, 0x0, 0x19, 0x0, 0x91, - 0x0, 0x6, 0x60, 0xa, 0xaa, 0x99, 0x96, 0x0, - 0x40, 0x0, 0x0, 0x0, - - /* U+30EF "ワ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0x56, 0x79, - 0xab, 0xe2, 0xd, 0x43, 0x20, 0x0, 0xd2, 0xc, - 0x0, 0x0, 0x5, 0x80, 0xd, 0x0, 0x0, 0xc, - 0x10, 0x9, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, - 0x2, 0xa0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x0, - 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, 0x27, 0x0, - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+30F3 "ン" */ - 0x15, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc4, 0x0, - 0x0, 0x2, 0x0, 0x3a, 0x0, 0x0, 0x53, 0x0, - 0x0, 0x0, 0x6, 0x60, 0x0, 0x0, 0x0, 0x66, - 0x0, 0x0, 0x0, 0x9, 0x50, 0x0, 0x0, 0x3, - 0xb3, 0x0, 0x0, 0x6, 0xa9, 0x10, 0x0, 0x0, - 0x6, 0x30, 0x0, 0x0, 0x0, - - /* U+30F6 "ヶ" */ - 0x0, 0x82, 0x0, 0x0, 0x0, 0xc1, 0x2, 0x50, - 0x8, 0xa9, 0xd7, 0x51, 0x35, 0x0, 0xc2, 0x0, - 0x0, 0x2, 0x90, 0x0, 0x0, 0x9, 0x10, 0x0, - 0x0, 0x45, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - - /* U+30FC "ー" */ - 0x2, 0x10, 0x0, 0x1, 0x24, 0x69, 0x40, 0x8, - 0xff, 0xcb, 0xa9, 0x87, 0x77, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4E00 "一" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x30, 0x6, - 0x55, 0x55, 0x55, 0x55, 0x58, 0x70, - - /* U+4E03 "七" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, 0xd3, 0x55, - 0x51, 0x0, 0x0, 0x3, 0x55, 0xd1, 0x0, 0x0, - 0x0, 0x7, 0x51, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x50, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, - 0xd1, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x5b, - 0xbb, 0xbb, 0xa2, - - /* U+4E07 "万" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x10, 0x75, - 0x55, 0xa7, 0x55, 0x55, 0x85, 0x0, 0x0, 0xc, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, - 0x1, 0x0, 0x0, 0x0, 0xf, 0x55, 0x55, 0xb8, - 0x0, 0x0, 0x2, 0xc0, 0x0, 0x9, 0x40, 0x0, - 0x0, 0x68, 0x0, 0x0, 0xa3, 0x0, 0x0, 0xb, - 0x30, 0x0, 0xb, 0x20, 0x0, 0x2, 0xa0, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x73, 0x0, 0x5, 0x78, 0xc0, 0x0, - 0x43, 0x0, 0x0, 0x6, 0xb2, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4E08 "丈" */ - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x30, 0x1, 0x0, 0x5, 0x65, 0x55, - 0x5b, 0x75, 0x5a, 0xa0, 0x0, 0x1, 0x0, 0xa, - 0x20, 0x0, 0x0, 0x0, 0x5, 0x0, 0xb, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x60, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x73, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x59, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xbe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x88, - 0x1, 0xbe, 0x95, 0x30, 0x0, 0x58, 0x30, 0x0, - 0x3, 0xaf, 0x50, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4E09 "三" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x65, 0x55, 0x55, 0x55, 0x6d, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x90, 0x0, 0x0, 0x26, 0x55, 0x55, 0x55, 0x52, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x16, 0x55, - 0x55, 0x55, 0x55, 0x58, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+4E0A "上" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0xd5, 0x55, - 0xa8, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x3, 0x80, 0x7, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x51, - - /* U+4E0B "下" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x30, 0x65, - 0x55, 0x5d, 0x55, 0x55, 0x54, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd6, 0x50, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x5, 0xd7, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x2, 0xe2, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+4E0D "不" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0x55, 0x55, 0x56, 0x55, 0x5b, 0x80, 0x0, 0x0, - 0x0, 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xe4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xa2, 0x25, - 0x0, 0x0, 0x0, 0x1, 0xc2, 0xa2, 0x2, 0xa1, - 0x0, 0x0, 0xb, 0x20, 0xa2, 0x0, 0x3d, 0x30, - 0x0, 0x92, 0x0, 0xa2, 0x0, 0x6, 0xc0, 0x16, - 0x0, 0x0, 0xa2, 0x0, 0x0, 0x40, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4E13 "专" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x90, 0x0, 0x70, 0x0, 0x0, 0x55, 0x59, - 0x95, 0x55, 0x52, 0x0, 0x0, 0x0, 0x8, 0x30, - 0x0, 0x0, 0x0, 0x15, 0x55, 0x5d, 0x65, 0x55, - 0x58, 0xb0, 0x1, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x49, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x0, 0x57, 0x55, 0x57, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, - 0x16, 0x30, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6c, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+4E14 "且" */ - 0x0, 0x0, 0x95, 0x55, 0x55, 0xb0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xd5, 0x55, - 0x55, 0xc0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0xd5, 0x55, 0x55, 0xc0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0xc0, 0x80, 0x6, 0x55, 0x75, - 0x55, 0x55, 0x76, 0x74, - - /* U+4E16 "世" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0xd1, 0x0, 0x0, 0x2c, - 0x0, 0xc0, 0x0, 0xc0, 0x0, 0x0, 0x1a, 0x0, - 0xc0, 0x0, 0xc0, 0x0, 0x0, 0x1a, 0x0, 0xc0, - 0x0, 0xc0, 0x91, 0x6, 0x6c, 0x55, 0xd5, 0x55, - 0xd5, 0x52, 0x0, 0x1a, 0x0, 0xc0, 0x0, 0xc0, - 0x0, 0x0, 0x1a, 0x0, 0xc0, 0x0, 0xc0, 0x0, - 0x0, 0x1a, 0x0, 0xc0, 0x0, 0xc0, 0x0, 0x0, - 0x1a, 0x0, 0xc5, 0x55, 0xc0, 0x0, 0x0, 0x1a, - 0x0, 0x90, 0x0, 0x70, 0x0, 0x0, 0x1a, 0x0, - 0x0, 0x0, 0x0, 0x50, 0x0, 0x3b, 0x55, 0x55, - 0x55, 0x56, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4E21 "両" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x6, - 0x55, 0x55, 0x57, 0x55, 0x59, 0x90, 0x0, 0x0, - 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x29, 0x0, 0x1, 0x0, 0x0, 0xc5, 0x55, 0x6b, - 0x55, 0x5c, 0x30, 0x0, 0xb0, 0x0, 0x29, 0x1, - 0xa, 0x10, 0x0, 0xb0, 0xb1, 0x29, 0xd, 0xa, - 0x10, 0x0, 0xb0, 0xb0, 0x29, 0xc, 0xa, 0x10, - 0x0, 0xb0, 0xb0, 0x29, 0xc, 0xa, 0x10, 0x0, - 0xb0, 0xc5, 0x6a, 0x5d, 0xa, 0x10, 0x0, 0xb0, - 0x20, 0x0, 0x5, 0xa, 0x10, 0x0, 0xb0, 0x0, - 0x0, 0x3, 0x2c, 0x0, 0x0, 0xa0, 0x0, 0x0, - 0x2, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4E26 "並" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x1, 0x81, 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, - 0x3d, 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, 0xc, - 0x10, 0x42, 0x7, 0x0, 0x2, 0x65, 0x5d, 0x55, - 0xd5, 0x55, 0x20, 0x0, 0x20, 0xc, 0x0, 0xc0, - 0x4, 0x10, 0x0, 0x70, 0xc, 0x0, 0xc0, 0xd, - 0x50, 0x0, 0x56, 0xc, 0x0, 0xc0, 0x67, 0x0, - 0x0, 0x1d, 0xc, 0x0, 0xc0, 0xa0, 0x0, 0x0, - 0xd, 0xc, 0x0, 0xc6, 0x10, 0x0, 0x0, 0x3, - 0xc, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x0, 0xc0, 0x3, 0x40, 0x6, 0x55, 0x57, 0x55, - 0x75, 0x57, 0x80, - - /* U+4E2D "中" */ - 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0xa, - 0x50, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, - 0x8, 0x55, 0x5b, 0x75, 0x55, 0xa2, 0xc0, 0x0, - 0xa3, 0x0, 0xc, 0xc, 0x0, 0xa, 0x30, 0x0, - 0xc0, 0xc0, 0x0, 0xa3, 0x0, 0xc, 0xd, 0x55, - 0x5b, 0x75, 0x55, 0xd0, 0xb0, 0x0, 0xa3, 0x0, - 0xa, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0xa, 0x30, - 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, - - /* U+4E3B "主" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x15, 0x0, 0x18, 0x0, 0x3, 0x65, 0x55, 0xc7, - 0x55, 0x55, 0x10, 0x0, 0x0, 0x0, 0xa2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa3, 0x11, 0x90, 0x0, - 0x0, 0x46, 0x55, 0xc6, 0x44, 0x41, 0x0, 0x0, - 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x5, 0x10, 0x26, 0x55, 0x55, 0x75, - 0x55, 0x58, 0x60, - - /* U+4E45 "久" */ - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, - 0x55, 0xb1, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x4, - 0xb0, 0x0, 0x0, 0x0, 0x7, 0x20, 0xa, 0x50, - 0x0, 0x0, 0x0, 0x36, 0x0, 0x1d, 0x50, 0x0, - 0x0, 0x1, 0x50, 0x0, 0x94, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xb0, 0x45, 0x0, 0x0, 0x0, - 0x0, 0x1b, 0x10, 0xb, 0x10, 0x0, 0x0, 0x0, - 0xb2, 0x0, 0x4, 0xc1, 0x0, 0x0, 0x28, 0x10, - 0x0, 0x0, 0x8d, 0x50, 0x5, 0x60, 0x0, 0x0, - 0x0, 0x8, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4E4B "之" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0x0, 0x3, 0x55, 0x55, - 0x65, 0x59, 0x50, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x3d, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xb1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1a, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x70, 0x87, - 0x31, 0x0, 0x2, 0x31, 0x4, 0x0, 0x4, 0xad, - 0xef, 0xff, 0x70, - - /* U+4E4E "乎" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, - 0x0, 0x0, 0x14, 0x7b, 0xd8, 0x0, 0x0, 0x45, - 0x67, 0x8b, 0x20, 0x0, 0x0, 0x0, 0x4, 0x0, - 0x2a, 0x0, 0xa5, 0x0, 0x0, 0x4, 0x90, 0x2a, - 0x1, 0xa0, 0x0, 0x0, 0x0, 0xc2, 0x2a, 0x7, - 0x10, 0x0, 0x0, 0x0, 0x20, 0x2a, 0x2, 0x1, - 0x80, 0x6, 0x55, 0x55, 0x6c, 0x55, 0x55, 0x52, - 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, - 0x4a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+4E4F "乏" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x48, 0xd5, 0x0, 0x15, 0x56, 0x78, - 0x86, 0x53, 0x20, 0x0, 0x0, 0x3, 0x91, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x80, 0x0, 0x0, - 0x0, 0x45, 0x55, 0x56, 0x55, 0xb0, 0x0, 0x1, - 0x0, 0x0, 0x2, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x8, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x58, 0x10, 0x0, 0x0, - 0x0, 0x2, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xb0, 0x68, 0x41, 0x0, 0x1, 0x21, 0x21, 0x0, - 0x17, 0xbd, 0xef, 0xf8, 0x0, - - /* U+4E57 "乗" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x12, 0x46, 0x8b, 0xe8, 0x0, 0x0, 0x44, - 0x33, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x92, 0x0, 0x43, 0x0, 0x0, 0x65, 0x85, 0xb7, - 0x59, 0x54, 0x0, 0x0, 0x0, 0xc0, 0x92, 0xc, - 0x4, 0x0, 0x6, 0x55, 0xd5, 0xb7, 0x5d, 0x56, - 0x30, 0x0, 0x0, 0xc0, 0x92, 0xc, 0x12, 0x0, - 0x0, 0x65, 0x79, 0xe9, 0x57, 0x66, 0x0, 0x0, - 0x0, 0x1b, 0x94, 0x70, 0x0, 0x0, 0x0, 0x1, - 0xa1, 0x92, 0x58, 0x0, 0x0, 0x0, 0x38, 0x10, - 0x92, 0x6, 0xc5, 0x0, 0x5, 0x40, 0x0, 0x93, - 0x0, 0x4d, 0x80, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+4E5D "九" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x10, 0x0, 0x0, 0x1, 0x65, 0x5d, 0x55, - 0xb5, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0xa1, - 0x0, 0x0, 0x0, 0x0, 0x38, 0x0, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0x64, 0x0, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0x0, 0x0, - 0x2, 0x90, 0x0, 0xa1, 0x0, 0x10, 0x0, 0x9, - 0x10, 0x0, 0xa2, 0x0, 0x60, 0x0, 0x63, 0x0, - 0x0, 0x92, 0x0, 0x90, 0x4, 0x30, 0x0, 0x0, - 0x6c, 0xaa, 0xd1, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4E5F "也" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x92, 0x0, 0x3a, 0x0, 0x0, 0xc, 0x0, 0x95, - 0x66, 0x69, 0x0, 0x0, 0xc, 0x16, 0xc5, 0x0, - 0x39, 0x0, 0x2, 0x5d, 0x40, 0x92, 0x0, 0x47, - 0x0, 0x4, 0xc, 0x0, 0x92, 0x0, 0x66, 0x0, - 0x0, 0xc, 0x0, 0x93, 0x57, 0xd2, 0x0, 0x0, - 0xc, 0x0, 0x93, 0x7, 0x60, 0x20, 0x0, 0xc, - 0x0, 0x71, 0x0, 0x0, 0x60, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0xa0, 0x0, 0xa, 0xba, 0xaa, - 0xaa, 0xac, 0xd1, - - /* U+4E86 "了" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x55, 0x55, - 0x55, 0x57, 0xc0, 0x0, 0x0, 0x0, 0x3, 0xb5, - 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, 0x0, 0x0, - 0x29, 0x30, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0x0, 0x0, 0x0, 0x2, 0x15, 0xa0, - 0x0, 0x0, 0x0, 0x17, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, - - /* U+4E88 "予" */ - 0x0, 0x55, 0x55, 0x55, 0x5b, 0x10, 0x0, 0x1, - 0x0, 0x0, 0x1a, 0x82, 0x0, 0x0, 0x0, 0x54, - 0x27, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7d, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x15, - 0x4, 0x65, 0x55, 0x5e, 0x55, 0x5b, 0xc0, 0x0, - 0x0, 0x0, 0xd0, 0x3, 0x70, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x17, 0xea, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x0, - - /* U+4E89 "争" */ - 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x99, 0x0, 0x50, 0x0, 0x0, 0x0, 0x5, - 0xa5, 0x57, 0xd2, 0x0, 0x0, 0x0, 0x28, 0x0, - 0x8, 0x0, 0x0, 0x0, 0x2, 0x66, 0x55, 0x96, - 0x55, 0xd1, 0x0, 0x2, 0x0, 0x0, 0xa1, 0x0, - 0xb0, 0x0, 0x15, 0x55, 0x55, 0xc6, 0x55, 0xc8, - 0xa0, 0x1, 0x0, 0x0, 0xa1, 0x0, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0xa1, 0x0, 0xb0, 0x0, 0x0, - 0x55, 0x55, 0xc6, 0x55, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, - 0x0, 0x0, - - /* U+4E8B "事" */ - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2b, 0x0, 0x4, 0x20, 0x5, 0x55, - 0x55, 0x6b, 0x55, 0x57, 0x60, 0x0, 0x7, 0x55, - 0x6b, 0x55, 0x92, 0x0, 0x0, 0xb, 0x0, 0x29, - 0x0, 0xc0, 0x0, 0x0, 0xc, 0x55, 0x6b, 0x55, - 0xd0, 0x0, 0x0, 0x3, 0x0, 0x29, 0x0, 0x50, - 0x0, 0x0, 0x36, 0x55, 0x6b, 0x55, 0xd2, 0x0, - 0x16, 0x55, 0x55, 0x6b, 0x55, 0xd7, 0xb0, 0x0, - 0x0, 0x0, 0x29, 0x0, 0xc0, 0x0, 0x0, 0x36, - 0x55, 0x6b, 0x55, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x39, 0x0, 0x20, 0x0, 0x0, 0x0, 0x17, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+4E8C "二" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x46, 0x55, 0x55, 0x55, 0x98, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x50, 0x6, - 0x55, 0x55, 0x55, 0x55, 0x56, 0x60, - - /* U+4E94 "五" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x10, 0x0, - 0x65, 0x55, 0xc6, 0x55, 0x55, 0x30, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa0, - 0x0, 0x30, 0x0, 0x0, 0x36, 0x58, 0xa5, 0x55, - 0xd0, 0x0, 0x0, 0x0, 0x6, 0x50, 0x1, 0xa0, - 0x0, 0x0, 0x0, 0x9, 0x30, 0x2, 0xa0, 0x0, - 0x0, 0x0, 0xb, 0x0, 0x2, 0x90, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x3, 0x90, 0x0, 0x0, 0x0, - 0xb, 0x0, 0x3, 0x80, 0x70, 0x5, 0x55, 0x56, - 0x55, 0x55, 0x66, 0x72, - - /* U+4E9B "些" */ - 0x0, 0x0, 0x92, 0x0, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0xb0, 0x2, 0x0, 0x0, 0xc0, - 0xb0, 0x50, 0xb0, 0x3c, 0x40, 0x0, 0xb0, 0xb5, - 0x52, 0xb5, 0x50, 0x0, 0x0, 0xb0, 0xb0, 0x0, - 0xb0, 0x0, 0x50, 0x0, 0xb0, 0xb0, 0x1, 0xb0, - 0x0, 0x90, 0x5, 0xd9, 0xa6, 0x41, 0x9a, 0x99, - 0xc2, 0x8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x15, 0x55, 0x55, 0x56, 0xd3, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x60, 0x6, 0x55, 0x55, - 0x55, 0x55, 0x56, 0x60, - - /* U+4EA1 "亡" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x0, 0x4, 0x80, 0x16, 0x5d, 0x55, 0x55, - 0x55, 0x55, 0x51, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0xe, 0x55, - 0x55, 0x55, 0x7d, 0x20, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+4EA4 "交" */ - 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x37, 0x0, 0x6, 0x50, 0x6, 0x55, 0x65, - 0x55, 0x65, 0x55, 0x50, 0x0, 0x0, 0xc4, 0x0, - 0x18, 0x30, 0x0, 0x0, 0xa, 0x40, 0x0, 0x10, - 0xb9, 0x0, 0x1, 0x81, 0x31, 0x0, 0x88, 0xc, - 0x0, 0x3, 0x0, 0x6, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x26, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, - 0x13, 0xc7, 0x20, 0x0, 0x1, 0x57, 0x20, 0x0, - 0x6, 0xcf, 0xc1, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, - - /* U+4EA6 "亦" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x58, 0x0, 0x8, 0x20, 0x65, 0x55, 0xd5, 0x5d, - 0x55, 0x54, 0x0, 0x0, 0xc, 0x0, 0xc0, 0x0, - 0x0, 0x3, 0xa0, 0xc0, 0xc, 0x12, 0x0, 0x0, - 0x76, 0xc, 0x0, 0xc0, 0x82, 0x0, 0xb, 0x0, - 0xb0, 0xc, 0x1, 0xd1, 0x3, 0x50, 0x39, 0x0, - 0xc0, 0x8, 0x90, 0x60, 0x9, 0x20, 0xc, 0x0, - 0x27, 0x0, 0x2, 0x90, 0x0, 0xc0, 0x0, 0x0, - 0x1, 0x90, 0x4, 0x4e, 0x0, 0x0, 0x3, 0x50, - 0x0, 0x1a, 0x90, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+4EAC "京" */ - 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x5, 0x55, - 0x55, 0x96, 0x55, 0x5a, 0xc0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x55, 0x55, - 0x55, 0xa0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x2, - 0xb0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x2, 0xa0, - 0x0, 0x0, 0xd, 0x55, 0x55, 0x56, 0xb0, 0x0, - 0x0, 0x8, 0x0, 0xd0, 0x1, 0x30, 0x0, 0x0, - 0x3, 0xa0, 0xd0, 0x6, 0x0, 0x0, 0x0, 0x1b, - 0x20, 0xd0, 0x1, 0xb2, 0x0, 0x1, 0x91, 0x0, - 0xd0, 0x0, 0x3e, 0x0, 0x15, 0x0, 0x4c, 0xd0, - 0x0, 0x7, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, - 0x0, 0x0, - - /* U+4EBA "人" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xd6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xb8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x76, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x31, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0xa4, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x5, - 0x80, 0x0, 0x8, 0xb0, 0x0, 0x0, 0x57, 0x0, - 0x0, 0x0, 0xbd, 0x61, 0x5, 0x40, 0x0, 0x0, - 0x0, 0x9, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4EC0 "什" */ - 0x0, 0x0, 0x20, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x4, 0xd0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x9, - 0x50, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, - 0xc0, 0x0, 0x10, 0x0, 0xac, 0x36, 0x55, 0xd5, - 0x58, 0x90, 0x5, 0x3c, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x15, 0xc, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x10, 0xc, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+4ECA "今" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, - 0x0, 0x90, 0x0, 0x0, 0x0, 0x1, 0xc2, 0x0, - 0x3b, 0x10, 0x0, 0x0, 0x1a, 0x11, 0x92, 0x3, - 0xd7, 0x10, 0x2, 0x81, 0x0, 0x3b, 0x0, 0x1b, - 0xd2, 0x14, 0x0, 0x0, 0x1, 0x0, 0x20, 0x0, - 0x0, 0x16, 0x55, 0x55, 0x58, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, - 0x0, 0x0, - - /* U+4ECB "介" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x86, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, - 0x2b, 0x10, 0x0, 0x0, 0x8, 0x42, 0x0, 0x44, - 0xd8, 0x20, 0x1, 0x71, 0x2c, 0x0, 0xa4, 0x1a, - 0x80, 0x3, 0x0, 0x29, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x39, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0x56, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0xb1, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x6, 0x60, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, - 0xa2, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x0, - - /* U+4ECD "仍" */ - 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xb0, 0x0, 0x0, 0x13, 0x0, 0x0, 0xa, - 0x25, 0x6d, 0x55, 0x99, 0x0, 0x0, 0x1a, 0x0, - 0xc, 0x0, 0x84, 0x0, 0x0, 0x7c, 0x0, 0xb, - 0x0, 0xb0, 0x0, 0x0, 0x8c, 0x0, 0x1a, 0x0, - 0xc0, 0x40, 0x6, 0x1c, 0x0, 0x29, 0x2, 0x85, - 0xd1, 0x12, 0xc, 0x0, 0x47, 0x0, 0x0, 0xc0, - 0x0, 0xc, 0x0, 0x74, 0x0, 0x1, 0xb0, 0x0, - 0xc, 0x0, 0xb0, 0x0, 0x3, 0x90, 0x0, 0xc, - 0x3, 0x80, 0x0, 0x6, 0x70, 0x0, 0xc, 0x9, - 0x0, 0x4, 0x3c, 0x30, 0x0, 0xd, 0x62, 0x0, - 0x1, 0xc9, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+4ED5 "仕" */ - 0x0, 0x0, 0x20, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x3, 0xe1, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x8, - 0x70, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, - 0xd0, 0x0, 0x20, 0x0, 0xbe, 0x26, 0x55, 0xd5, - 0x57, 0x90, 0x4, 0x4d, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x6, 0xd, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x10, 0xd, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd0, 0x7, 0x10, 0x0, 0xe, 0x6, 0x55, - 0x55, 0x55, 0x30, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4ED6 "他" */ - 0x0, 0x1, 0x30, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x6, 0xd0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0xa, - 0x40, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x1c, 0x0, - 0x90, 0xb0, 0x2, 0x0, 0x0, 0x7a, 0x0, 0xc0, - 0xb5, 0x5d, 0x10, 0x0, 0xac, 0x14, 0xd5, 0xc0, - 0xb, 0x0, 0x5, 0x3c, 0x21, 0xb0, 0xb0, 0xc, - 0x0, 0x6, 0xc, 0x0, 0xb0, 0xb0, 0xc, 0x0, - 0x0, 0xc, 0x0, 0xb0, 0xb1, 0x7d, 0x0, 0x0, - 0xc, 0x0, 0xb0, 0xb0, 0x23, 0x0, 0x0, 0xc, - 0x0, 0xb0, 0x70, 0x0, 0x50, 0x0, 0xc, 0x0, - 0xb0, 0x0, 0x0, 0x90, 0x0, 0xc, 0x0, 0xa9, - 0x99, 0x99, 0xd3, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4ED8 "付" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x1, 0xe1, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x6, - 0x70, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0xd0, 0x10, 0x0, 0x3c, 0x5, 0x55, - 0x55, 0xe5, 0xa1, 0x0, 0xad, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x4, 0x5c, 0x0, 0x40, 0x0, 0xd0, - 0x0, 0x6, 0xc, 0x0, 0x67, 0x0, 0xd0, 0x0, - 0x10, 0xc, 0x0, 0xe, 0x0, 0xd0, 0x0, 0x0, - 0xc, 0x0, 0x2, 0x0, 0xd0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x5c, 0xd0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, - 0x10, 0x0, - - /* U+4EE3 "代" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xf2, 0x4, 0x90, 0x40, 0x0, 0x0, 0x6, - 0x80, 0x3, 0x90, 0x3d, 0x20, 0x0, 0xc, 0x10, - 0x2, 0xa0, 0x5, 0x40, 0x0, 0x4d, 0x10, 0x1, - 0xb0, 0x3, 0x70, 0x0, 0xad, 0x15, 0x55, 0xd5, - 0x54, 0x30, 0x6, 0x3c, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x15, 0xc, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x10, 0xc, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xa, 0x60, 0x32, 0x0, 0xc, 0x0, - 0x0, 0x1, 0xd6, 0x81, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x1b, 0xf2, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x31, - - /* U+4EE4 "令" */ - 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xb4, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0x10, 0x90, 0x0, 0x0, 0x0, 0x0, 0xb5, 0x20, - 0x2a, 0x0, 0x0, 0x0, 0x9, 0x50, 0x87, 0x4, - 0xd3, 0x0, 0x0, 0x72, 0x0, 0xd, 0x0, 0x3d, - 0xc1, 0x14, 0x5, 0x55, 0x56, 0x57, 0xb0, 0x10, - 0x0, 0x1, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, - 0x47, 0x23, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xac, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x0, - - /* U+4EE5 "以" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, - 0x0, 0x0, 0x3c, 0x0, 0xd, 0x10, 0x70, 0x0, - 0x3b, 0x0, 0xd, 0x0, 0x3d, 0x0, 0x3a, 0x0, - 0xd, 0x0, 0xc, 0x40, 0x3a, 0x0, 0xd, 0x0, - 0x2, 0x0, 0x49, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x58, 0x0, 0xd, 0x0, 0x4, 0x0, 0x85, 0x0, - 0xd, 0x3, 0x80, 0x0, 0xd1, 0x0, 0xd, 0x99, - 0x0, 0x5, 0xa8, 0x0, 0xe, 0x80, 0x0, 0x3c, - 0x3, 0xd1, 0x1, 0x0, 0x7, 0x80, 0x0, 0x97, - 0x0, 0x35, 0x61, 0x0, 0x0, 0x12, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+4EEE "仮" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xd0, 0x10, 0x4, 0x8d, 0x70, 0x0, 0x8, - 0x50, 0xc4, 0x42, 0x0, 0x0, 0x0, 0xb, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0x0, 0xc5, - 0x55, 0x59, 0x30, 0x0, 0x9b, 0x0, 0xb4, 0x0, - 0xc, 0x10, 0x6, 0x1b, 0x0, 0xc4, 0x10, 0x1a, - 0x0, 0x2, 0xb, 0x0, 0xb0, 0x60, 0x74, 0x0, - 0x0, 0xb, 0x3, 0x80, 0x80, 0xb0, 0x0, 0x0, - 0xb, 0x6, 0x40, 0x3b, 0x70, 0x0, 0x0, 0xb, - 0x9, 0x0, 0x2e, 0x50, 0x0, 0x0, 0xb, 0x16, - 0x4, 0x91, 0xb7, 0x0, 0x0, 0xb, 0x62, 0x64, - 0x0, 0x8, 0xd2, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, - - /* U+4EF6 "件" */ - 0x0, 0x0, 0x30, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x2, 0xf1, 0x0, 0xe, 0x0, 0x0, 0x0, 0x8, - 0x70, 0xa5, 0xc, 0x0, 0x0, 0x0, 0xc, 0x0, - 0xd0, 0xc, 0x0, 0x20, 0x0, 0x6e, 0x1, 0xb5, - 0x5d, 0x56, 0x70, 0x0, 0x9c, 0x6, 0x20, 0xc, - 0x0, 0x0, 0x6, 0x1c, 0x5, 0x0, 0xc, 0x0, - 0x0, 0x13, 0xc, 0x5, 0x55, 0x5d, 0x55, 0xa4, - 0x0, 0xc, 0x1, 0x0, 0xc, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+4EFB "任" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xe0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x6, - 0x70, 0x35, 0x89, 0xa9, 0x10, 0x0, 0xc, 0x2, - 0x10, 0xb1, 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, - 0xb1, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, 0xb1, - 0x0, 0x0, 0x5, 0x3c, 0x0, 0x0, 0xb1, 0x3, - 0x40, 0x15, 0xc, 0x26, 0x55, 0xc5, 0x55, 0x40, - 0x0, 0xc, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xb1, 0x0, 0x30, 0x0, 0xd, 0x36, 0x55, - 0x75, 0x56, 0x70, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4EFD "份" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0xd1, 0x6, 0x7, 0x0, 0x0, 0x0, 0x4, - 0x90, 0x2c, 0x6, 0x10, 0x0, 0x0, 0xb, 0x10, - 0x84, 0x1, 0x70, 0x0, 0x0, 0x3a, 0x0, 0xa0, - 0x0, 0x93, 0x0, 0x0, 0x9d, 0x7, 0x20, 0x0, - 0x1d, 0x60, 0x5, 0x2c, 0x34, 0x55, 0x55, 0x84, - 0xa3, 0x13, 0xc, 0x20, 0xd, 0x0, 0xa1, 0x0, - 0x0, 0xc, 0x0, 0x1b, 0x0, 0xb0, 0x0, 0x0, - 0xc, 0x0, 0x38, 0x0, 0xb0, 0x0, 0x0, 0xc, - 0x0, 0x92, 0x0, 0xb0, 0x0, 0x0, 0xc, 0x2, - 0x80, 0x22, 0xc0, 0x0, 0x0, 0xc, 0x36, 0x0, - 0x3d, 0x60, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+4F01 "企" */ - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xd4, 0x30, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x30, 0x73, 0x0, 0x0, 0x0, 0x0, 0x95, 0x2, - 0xa, 0x50, 0x0, 0x0, 0x8, 0x40, 0xe, 0x10, - 0xab, 0x41, 0x1, 0x72, 0x0, 0xc, 0x0, 0x6, - 0x91, 0x3, 0x0, 0xe1, 0xc, 0x0, 0x60, 0x0, - 0x0, 0x0, 0xc0, 0xd, 0x55, 0x61, 0x0, 0x0, - 0x0, 0xc0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0xc, 0x0, 0x2, 0x40, 0x5, 0x55, 0x75, 0x57, - 0x55, 0x56, 0x70, - - /* U+4F0A "伊" */ - 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0x90, 0x0, 0x0, 0x4, 0x0, 0x0, 0xc, - 0x16, 0x5c, 0x55, 0x5d, 0x0, 0x0, 0x39, 0x0, - 0xc, 0x0, 0xc, 0x0, 0x0, 0x9b, 0x0, 0xc, - 0x0, 0xc, 0x20, 0x2, 0x6c, 0x46, 0x5d, 0x55, - 0x5d, 0x74, 0x6, 0xc, 0x0, 0xc, 0x0, 0xc, - 0x0, 0x0, 0xc, 0x0, 0xc, 0x0, 0xc, 0x0, - 0x0, 0xc, 0x7, 0x5d, 0x55, 0x5c, 0x0, 0x0, - 0xc, 0x0, 0x2a, 0x0, 0x5, 0x0, 0x0, 0xc, - 0x0, 0x83, 0x0, 0x0, 0x0, 0x0, 0xc, 0x3, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xc, 0x35, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+4F11 "休" */ - 0x0, 0x0, 0x20, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x2, 0xd1, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x8, - 0x50, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0xc0, 0x3, 0x40, 0x0, 0x6b, 0x36, 0x5a, - 0xf7, 0x55, 0x50, 0x0, 0xac, 0x0, 0xc, 0xd5, - 0x0, 0x0, 0x6, 0x2c, 0x0, 0x2a, 0xc3, 0x40, - 0x0, 0x13, 0xc, 0x0, 0xa2, 0xc0, 0xa0, 0x0, - 0x0, 0xc, 0x3, 0x80, 0xc0, 0x67, 0x0, 0x0, - 0xc, 0x8, 0x0, 0xc0, 0xc, 0x70, 0x0, 0xc, - 0x51, 0x0, 0xc0, 0x2, 0x92, 0x0, 0xc, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+4F1A "会" */ - 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x47, 0x10, 0x0, 0x0, 0x0, 0x0, 0x68, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0x3, 0x90, 0x0, - 0x1c, 0x70, 0x0, 0x0, 0x3a, 0x55, 0x55, 0x79, - 0x9f, 0xa2, 0x4, 0x40, 0x10, 0x0, 0x0, 0x2, - 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, - 0x2, 0x65, 0x58, 0x95, 0x55, 0x58, 0x30, 0x0, - 0x0, 0xd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x85, 0x0, 0x64, 0x0, 0x0, 0x0, 0x6, 0x50, - 0x0, 0x8, 0x90, 0x0, 0x0, 0x5e, 0xca, 0x87, - 0x65, 0xc5, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x21, 0x0, - - /* U+4F1D "伝" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe3, 0x0, 0x0, 0x1, 0x0, 0x0, 0x5, - 0xa0, 0x55, 0x55, 0x68, 0x0, 0x0, 0xc, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xad, 0x15, 0x55, 0x55, - 0x56, 0xc1, 0x7, 0x1c, 0x1, 0x0, 0xd2, 0x0, - 0x0, 0x11, 0xc, 0x0, 0x3, 0xa0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x9, 0x20, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x29, 0x0, 0x52, 0x0, 0x0, 0xc, - 0x0, 0x90, 0x0, 0xc, 0x10, 0x0, 0xc, 0x8, - 0xa7, 0x86, 0x5a, 0x80, 0x0, 0xd, 0x4, 0x62, - 0x0, 0x3, 0x50, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4F38 "伸" */ - 0x0, 0x1, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, - 0x8, 0x70, 0x0, 0x2b, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x2a, 0x0, 0x20, 0x0, 0x39, 0xb, - 0x55, 0x6b, 0x55, 0xe0, 0x0, 0xab, 0xc, 0x0, - 0x2a, 0x0, 0xc0, 0x2, 0x9a, 0xc, 0x0, 0x2a, - 0x0, 0xc0, 0x8, 0x1a, 0xc, 0x55, 0x6b, 0x55, - 0xc0, 0x11, 0x1a, 0xc, 0x0, 0x2a, 0x0, 0xc0, - 0x0, 0x1a, 0xc, 0x55, 0x6b, 0x55, 0xc0, 0x0, - 0x1a, 0x8, 0x0, 0x2a, 0x0, 0x80, 0x0, 0x1a, - 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x1a, 0x0, - 0x0, 0x2a, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, - 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+4F3C "似" */ - 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x70, 0x0, 0x0, 0x8, 0x20, 0x0, 0xc, - 0x3, 0x1, 0x0, 0xc, 0x10, 0x0, 0x48, 0xb, - 0x14, 0x60, 0xc, 0x0, 0x0, 0xab, 0xb, 0x0, - 0xe1, 0xd, 0x0, 0x2, 0x7b, 0xb, 0x0, 0x60, - 0xd, 0x0, 0x7, 0xb, 0xb, 0x0, 0x0, 0xd, - 0x0, 0x10, 0xb, 0xb, 0x0, 0x0, 0x3b, 0x0, - 0x0, 0xb, 0xb, 0x0, 0x50, 0x77, 0x0, 0x0, - 0xb, 0xb, 0x59, 0x10, 0xd6, 0x0, 0x0, 0xb, - 0xc, 0x90, 0xa, 0x63, 0xa0, 0x0, 0xb, 0x2, - 0x0, 0x96, 0x0, 0x97, 0x0, 0x1b, 0x0, 0x56, - 0x10, 0x0, 0x23, 0x0, 0x1, 0x3, 0x0, 0x0, - 0x0, 0x0, - - /* U+4F46 "但" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x31, 0x0, 0x0, 0x2, 0x0, 0x0, 0x2c, - 0xc, 0x55, 0x55, 0x5e, 0x0, 0x0, 0x84, 0xc, - 0x0, 0x0, 0xc, 0x0, 0x1, 0xe1, 0xc, 0x0, - 0x0, 0xc, 0x0, 0x7, 0xd0, 0xc, 0x55, 0x55, - 0x5c, 0x0, 0x25, 0xc0, 0xc, 0x0, 0x0, 0xc, - 0x0, 0x30, 0xc0, 0xc, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xc0, 0xc, 0x0, 0x0, 0xc, 0x0, 0x0, - 0xc0, 0xc, 0x55, 0x55, 0x5c, 0x0, 0x0, 0xc0, - 0x7, 0x0, 0x0, 0x3, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x40, 0x0, 0xc2, 0x65, 0x55, - 0x55, 0x55, 0x71, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4F4D "位" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xc0, 0x3, 0x80, 0x0, 0x0, 0x0, 0x9, - 0x50, 0x0, 0xd2, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x20, 0x4, 0x50, 0x0, 0x5a, 0x16, 0x55, - 0x55, 0x55, 0x40, 0x0, 0xac, 0x0, 0x20, 0x0, - 0x87, 0x0, 0x4, 0x4b, 0x0, 0x80, 0x0, 0xa3, - 0x0, 0x5, 0xb, 0x0, 0x74, 0x0, 0xb0, 0x0, - 0x0, 0xb, 0x0, 0x3b, 0x1, 0x80, 0x0, 0x0, - 0xb, 0x0, 0x1d, 0x6, 0x30, 0x0, 0x0, 0xb, - 0x0, 0x4, 0x8, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x6, 0x0, 0x70, 0x0, 0xb, 0x36, 0x55, - 0x55, 0x55, 0x62, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4F4E "低" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd3, 0x0, 0x0, 0x3b, 0x30, 0x0, 0x49, 0x4, - 0x46, 0xc7, 0x41, 0x0, 0xa, 0x10, 0xc0, 0xb, - 0x0, 0x0, 0x2, 0xf2, 0xb, 0x0, 0xb0, 0x0, - 0x0, 0x9b, 0x10, 0xb0, 0xb, 0x0, 0x20, 0x43, - 0xa1, 0xc, 0x55, 0xb6, 0x57, 0x41, 0xa, 0x10, - 0xb0, 0x6, 0x40, 0x0, 0x0, 0xa1, 0xb, 0x0, - 0x38, 0x0, 0x0, 0xa, 0x10, 0xb0, 0x0, 0xc0, - 0x1, 0x0, 0xa1, 0xb, 0x36, 0x6, 0x90, 0x70, - 0xa, 0x10, 0xf7, 0x53, 0xa, 0x99, 0x0, 0xa1, - 0x3, 0x0, 0xc0, 0x7, 0xa0, 0x1, 0x0, 0x0, - 0x1, 0x0, 0x0, - - /* U+4F4F "住" */ - 0x0, 0x0, 0x20, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe3, 0x7, 0x70, 0x0, 0x0, 0x0, 0x5, - 0x90, 0x0, 0xd2, 0x0, 0x0, 0x0, 0xb, 0x15, - 0x55, 0x75, 0x59, 0x90, 0x0, 0x4c, 0x1, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x6, 0x1c, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x12, 0xc, 0x3, 0x55, 0xd5, 0x6c, 0x10, - 0x0, 0xc, 0x1, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xc0, 0x0, 0x30, 0x0, 0xd, 0x36, 0x55, - 0x85, 0x57, 0x80, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4F53 "体" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xb0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x9, - 0x40, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0xc0, 0x2, 0x50, 0x0, 0x69, 0x16, 0x5b, - 0xf8, 0x55, 0x50, 0x0, 0xac, 0x0, 0xc, 0xc5, - 0x0, 0x0, 0x6, 0x1b, 0x0, 0x57, 0xc1, 0x60, - 0x0, 0x13, 0xb, 0x0, 0xa0, 0xc0, 0x91, 0x0, - 0x0, 0xb, 0x7, 0x30, 0xc0, 0x2c, 0x0, 0x0, - 0xb, 0x25, 0x0, 0xc0, 0x59, 0xc2, 0x0, 0xb, - 0x30, 0x75, 0xd5, 0x53, 0x30, 0x0, 0xb, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+4F55 "何" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xb0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x8, - 0x46, 0x55, 0x55, 0x59, 0x93, 0x0, 0xc, 0x0, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x5c, 0x2, 0x0, - 0x30, 0xb, 0x0, 0x0, 0xab, 0xb, 0x55, 0xb4, - 0xb, 0x0, 0x6, 0x2b, 0xb, 0x0, 0xa2, 0xb, - 0x0, 0x2, 0xb, 0xb, 0x0, 0xa2, 0xb, 0x0, - 0x0, 0xb, 0xb, 0x55, 0xb2, 0xb, 0x0, 0x0, - 0xb, 0xa, 0x0, 0x40, 0xb, 0x0, 0x0, 0xb, - 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0xb, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x17, 0xd9, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x20, 0x0, - - /* U+4F59 "余" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x46, 0x10, 0x0, 0x0, 0x0, 0x0, 0x87, - 0x0, 0x92, 0x0, 0x0, 0x0, 0x7, 0x70, 0x0, - 0xb, 0x60, 0x0, 0x0, 0x68, 0x65, 0x65, 0x7a, - 0xae, 0x80, 0x16, 0x10, 0x0, 0xb1, 0x0, 0x4, - 0x30, 0x0, 0x55, 0x55, 0xc5, 0x55, 0xc3, 0x0, - 0x0, 0x10, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xb0, 0xb1, 0x45, 0x0, 0x0, 0x0, 0x2c, - 0x10, 0xb1, 0x5, 0xc2, 0x0, 0x2, 0x90, 0x0, - 0xb0, 0x0, 0x5e, 0x0, 0x15, 0x0, 0x3b, 0xe0, - 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+4F5C "作" */ - 0x0, 0x0, 0x30, 0x3, 0x10, 0x0, 0x0, 0x0, - 0x2, 0xd1, 0xa, 0x50, 0x0, 0x0, 0x0, 0x7, - 0x50, 0x1b, 0x0, 0x0, 0x20, 0x0, 0xb, 0x0, - 0x87, 0x95, 0x55, 0x91, 0x0, 0x5b, 0x1, 0x90, - 0xc0, 0x0, 0x0, 0x0, 0xac, 0x7, 0x0, 0xc0, - 0x0, 0x0, 0x6, 0x2c, 0x21, 0x0, 0xd5, 0x5a, - 0x70, 0x3, 0xc, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0xd5, 0x56, 0xb0, 0x0, 0xc, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+4F60 "你" */ - 0x0, 0x0, 0x40, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xe1, 0xe, 0x20, 0x0, 0x0, 0x0, 0x8, - 0x60, 0x58, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0xb6, 0x55, 0x58, 0x90, 0x0, 0x7c, 0x2, 0x70, - 0x30, 0x9, 0x30, 0x1, 0x9c, 0x7, 0x0, 0x94, - 0x2, 0x0, 0x7, 0x1c, 0x11, 0x51, 0x93, 0x10, - 0x0, 0x12, 0xc, 0x0, 0xd1, 0x93, 0x53, 0x0, - 0x0, 0xc, 0x3, 0x70, 0x93, 0xb, 0x20, 0x0, - 0xc, 0x8, 0x0, 0x93, 0x4, 0xc0, 0x0, 0xc, - 0x24, 0x0, 0x93, 0x0, 0xc0, 0x0, 0xc, 0x20, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0xc, 0x0, 0x19, - 0xe1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+4F7F "使" */ - 0x0, 0x0, 0x20, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x3, 0xe1, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x8, - 0x60, 0x0, 0xa1, 0x1, 0x60, 0x0, 0xc, 0x5, - 0x55, 0xc5, 0x55, 0x50, 0x0, 0x6b, 0x1, 0x65, - 0xc5, 0x58, 0x10, 0x0, 0x8b, 0x2, 0x90, 0xa0, - 0xb, 0x0, 0x5, 0x1b, 0x1, 0x90, 0xa0, 0xb, - 0x0, 0x12, 0xb, 0x2, 0xb5, 0xc5, 0x5c, 0x0, - 0x0, 0xb, 0x0, 0x30, 0xb0, 0x2, 0x0, 0x0, - 0xb, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0xb, - 0x0, 0x7, 0x80, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x2a, 0x7a, 0x30, 0x0, 0x0, 0xb, 0x5, 0x60, - 0x2, 0xae, 0xa1, 0x0, 0x2, 0x30, 0x0, 0x0, - 0x0, 0x10, - - /* U+4F86 "來" */ - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0x0, 0x3, 0x0, 0x1, 0x65, 0x55, - 0x6c, 0x55, 0x59, 0x50, 0x0, 0x3, 0xb0, 0x2a, - 0x1, 0xd0, 0x0, 0x0, 0x8, 0x60, 0x2a, 0x4, - 0x80, 0x0, 0x0, 0x1a, 0x76, 0x3b, 0x9, 0x5a, - 0x10, 0x0, 0x81, 0x9, 0xbd, 0x64, 0x4, 0x50, - 0x1, 0x0, 0x6, 0xaa, 0x81, 0x0, 0x0, 0x0, - 0x0, 0x49, 0x2a, 0xb, 0x20, 0x0, 0x0, 0x5, - 0x80, 0x2a, 0x1, 0xd6, 0x0, 0x0, 0x64, 0x0, - 0x2a, 0x0, 0x1b, 0xe3, 0x4, 0x0, 0x0, 0x3b, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, - 0x0, 0x0, - - /* U+4F8B "例" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xd0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x76, 0x57, - 0x76, 0x80, 0xb, 0x0, 0xb, 0x0, 0x83, 0x0, - 0x82, 0xb0, 0x2, 0xe1, 0xb, 0x3, 0x1b, 0xb, - 0x0, 0x8d, 0x1, 0xa5, 0xb5, 0xb0, 0xb0, 0x25, - 0xb0, 0x73, 0xc, 0xb, 0xb, 0x2, 0xb, 0x7, - 0x93, 0xa0, 0xb0, 0xb0, 0x0, 0xb2, 0x4, 0x94, - 0xb, 0xb, 0x0, 0xb, 0x0, 0x1b, 0x0, 0xb0, - 0xb0, 0x0, 0xb0, 0x8, 0x30, 0x1, 0xb, 0x0, - 0xb, 0x4, 0x50, 0x0, 0x0, 0xb0, 0x0, 0xb4, - 0x30, 0x0, 0x3, 0x9e, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x20, - - /* U+4F9B "供" */ - 0x0, 0x0, 0x20, 0x2, 0x0, 0x10, 0x0, 0x0, - 0x1, 0xe1, 0xd, 0x0, 0xd0, 0x0, 0x0, 0x7, - 0x70, 0xb, 0x0, 0xb0, 0x0, 0x0, 0xc, 0x0, - 0xb, 0x0, 0xb0, 0x40, 0x0, 0x6b, 0x6, 0x5c, - 0x55, 0xc5, 0x60, 0x0, 0xaa, 0x0, 0xb, 0x0, - 0xb0, 0x0, 0x6, 0x1a, 0x0, 0xb, 0x0, 0xb0, - 0x0, 0x2, 0xa, 0x0, 0xb, 0x0, 0xb0, 0x30, - 0x0, 0xa, 0x56, 0x57, 0x55, 0x75, 0x84, 0x0, - 0xa, 0x0, 0x8, 0x1, 0x10, 0x0, 0x0, 0xa, - 0x0, 0x79, 0x0, 0x85, 0x0, 0x0, 0xa, 0x3, - 0x90, 0x0, 0xa, 0x80, 0x0, 0x1b, 0x27, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x3, 0x20, 0x0, 0x0, - 0x0, 0x0, - - /* U+4F9D "依" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x80, 0x3, 0x80, 0x0, 0x0, 0x0, 0xc, - 0x10, 0x0, 0xc1, 0x2, 0x30, 0x0, 0x29, 0x26, - 0x56, 0xe5, 0x55, 0x50, 0x0, 0x9c, 0x0, 0x7, - 0x90, 0x0, 0x0, 0x1, 0x7b, 0x0, 0x1a, 0x50, - 0x6, 0x0, 0x6, 0xb, 0x0, 0xa1, 0x51, 0x5b, - 0x20, 0x2, 0xb, 0x6, 0xe1, 0x19, 0x50, 0x0, - 0x0, 0xb, 0x44, 0xb0, 0xa, 0x0, 0x0, 0x0, - 0xb, 0x20, 0xb0, 0x6, 0x70, 0x0, 0x0, 0xb, - 0x0, 0xb0, 0x41, 0xc4, 0x0, 0x0, 0xb, 0x0, - 0xb9, 0x20, 0x2e, 0x70, 0x0, 0xc, 0x0, 0xa2, - 0x0, 0x3, 0x60, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4FA1 "価" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xc0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x8, - 0x56, 0x58, 0x58, 0x55, 0xa2, 0x0, 0xb, 0x0, - 0xa, 0x9, 0x10, 0x0, 0x0, 0x6c, 0x0, 0xa, - 0x9, 0x10, 0x0, 0x0, 0x9a, 0xa, 0x5c, 0x5b, - 0x55, 0xd0, 0x5, 0x1a, 0xb, 0xa, 0x9, 0x10, - 0xb0, 0x2, 0xa, 0xb, 0xa, 0x9, 0x10, 0xb0, - 0x0, 0xa, 0xb, 0xa, 0x9, 0x10, 0xb0, 0x0, - 0xa, 0xb, 0xa, 0x9, 0x10, 0xb0, 0x0, 0xa, - 0xb, 0xa, 0x9, 0x10, 0xb0, 0x0, 0xa, 0xb, - 0x58, 0x57, 0x55, 0xb0, 0x0, 0xb, 0xb, 0x0, - 0x0, 0x0, 0xa0, 0x0, 0x1, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+4FBF "便" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x40, 0x0, 0x0, 0x3, 0x40, 0x0, 0x1c, - 0x36, 0x55, 0xc5, 0x55, 0x40, 0x0, 0x74, 0x6, - 0x55, 0xc5, 0x58, 0x10, 0x0, 0xd2, 0xb, 0x0, - 0xb0, 0xb, 0x0, 0x5, 0xc2, 0xc, 0x55, 0xc5, - 0x5b, 0x0, 0x6, 0x92, 0xb, 0x0, 0xb0, 0xb, - 0x0, 0x30, 0x92, 0xb, 0x0, 0xb0, 0xb, 0x0, - 0x0, 0x92, 0xb, 0x55, 0xc5, 0x59, 0x0, 0x0, - 0x92, 0x1, 0x20, 0xa0, 0x0, 0x0, 0x0, 0x92, - 0x0, 0x67, 0x60, 0x0, 0x0, 0x0, 0x92, 0x0, - 0x1e, 0x80, 0x0, 0x0, 0x0, 0x92, 0x5, 0x91, - 0x5c, 0xb8, 0x70, 0x0, 0x32, 0x51, 0x0, 0x0, - 0x25, 0x30, - - /* U+4FC2 "係" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xe2, 0x0, 0x2, 0x5a, 0x80, 0x0, 0x7, - 0x73, 0x56, 0xb8, 0x53, 0x30, 0x0, 0xd, 0x0, - 0x3, 0xb4, 0x14, 0x0, 0x0, 0x5b, 0x0, 0x66, - 0x0, 0xc8, 0x0, 0x0, 0xbb, 0x5, 0xa8, 0x7c, - 0x31, 0x0, 0x6, 0x3b, 0x0, 0x4, 0x70, 0x6, - 0x20, 0x3, 0xb, 0x2, 0xca, 0x77, 0x55, 0xd0, - 0x0, 0xb, 0x0, 0x41, 0xb, 0x0, 0x90, 0x0, - 0xb, 0x0, 0x2a, 0xb, 0x51, 0x0, 0x0, 0xb, - 0x0, 0xb3, 0xb, 0xa, 0x40, 0x0, 0xb, 0x7, - 0x30, 0xb, 0x1, 0xe0, 0x0, 0xc, 0x22, 0x6, - 0xc9, 0x0, 0x20, 0x0, 0x1, 0x0, 0x0, 0x30, - 0x0, 0x0, - - /* U+4FDD "保" */ - 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xd0, 0x85, 0x55, 0x5b, 0x10, 0x0, 0x8, - 0x50, 0xc0, 0x0, 0xb, 0x0, 0x0, 0xb, 0x0, - 0xc0, 0x0, 0xb, 0x0, 0x0, 0x6b, 0x0, 0xc0, - 0x0, 0xb, 0x0, 0x0, 0xaa, 0x0, 0xd5, 0xb5, - 0x5a, 0x0, 0x6, 0x1a, 0x0, 0x0, 0xb0, 0x0, - 0x0, 0x1, 0xa, 0x45, 0x56, 0xd6, 0x55, 0xa2, - 0x0, 0xa, 0x0, 0x9, 0xd4, 0x20, 0x0, 0x0, - 0xa, 0x0, 0x38, 0xb0, 0x80, 0x0, 0x0, 0xa, - 0x0, 0x90, 0xb0, 0x39, 0x0, 0x0, 0xa, 0x7, - 0x10, 0xb0, 0x6, 0xd2, 0x0, 0x1b, 0x40, 0x0, - 0xb0, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+4FE1 "信" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xd0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x8, - 0x50, 0x0, 0x75, 0x1, 0x50, 0x0, 0xb, 0x17, - 0x55, 0x55, 0x55, 0x50, 0x0, 0x6a, 0x0, 0x0, - 0x0, 0x6, 0x0, 0x0, 0xba, 0x1, 0x65, 0x55, - 0x55, 0x10, 0x6, 0x49, 0x0, 0x0, 0x0, 0x6, - 0x0, 0x13, 0x19, 0x1, 0x65, 0x55, 0x55, 0x20, - 0x0, 0x19, 0x0, 0x75, 0x55, 0x58, 0x20, 0x0, - 0x19, 0x0, 0xb0, 0x0, 0xb, 0x0, 0x0, 0x19, - 0x0, 0xb0, 0x0, 0xb, 0x0, 0x0, 0x19, 0x0, - 0xc5, 0x55, 0x5c, 0x0, 0x0, 0x19, 0x0, 0xa0, - 0x0, 0xa, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4FEE "修" */ - 0x0, 0x3, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, - 0xd, 0x10, 0x9, 0x60, 0x0, 0x0, 0x0, 0x57, - 0x0, 0xd, 0x55, 0x59, 0x10, 0x0, 0xa1, 0x40, - 0x65, 0x30, 0x69, 0x0, 0x2, 0xf2, 0xb2, 0x40, - 0x78, 0x80, 0x0, 0x8, 0xa1, 0xa0, 0x0, 0x8b, - 0x60, 0x0, 0x34, 0x91, 0xa0, 0x47, 0x14, 0x6c, - 0x90, 0x10, 0x91, 0xa3, 0x10, 0x69, 0x20, 0x0, - 0x0, 0x91, 0xa0, 0x17, 0x30, 0xa6, 0x0, 0x0, - 0x91, 0xa1, 0x20, 0x2a, 0x60, 0x20, 0x0, 0x91, - 0xa0, 0x17, 0x70, 0x2c, 0x90, 0x0, 0x91, 0x1, - 0x30, 0x28, 0xa2, 0x0, 0x0, 0x91, 0x1, 0x57, - 0x71, 0x0, 0x0, 0x0, 0x20, 0x13, 0x0, 0x0, - 0x0, 0x0, - - /* U+500B "個" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc7, 0x30, 0x0, 0x0, 0x30, 0x0, 0x2c, 0xc, - 0x55, 0x65, 0x5c, 0x20, 0x8, 0x40, 0xb0, 0xa, - 0x0, 0xb0, 0x0, 0xe2, 0xb, 0x35, 0xa6, 0x6b, - 0x0, 0x6e, 0x0, 0xb0, 0x8, 0x0, 0xb0, 0x16, - 0xb0, 0xb, 0x1, 0x82, 0xb, 0x2, 0xb, 0x0, - 0xb0, 0xc5, 0xc1, 0xb0, 0x0, 0xb0, 0xb, 0xa, - 0xa, 0xb, 0x0, 0xb, 0x0, 0xb0, 0xc5, 0xc0, - 0xb0, 0x0, 0xb0, 0xb, 0x8, 0x6, 0xb, 0x0, - 0xb, 0x0, 0xc5, 0x55, 0x55, 0xc0, 0x0, 0xb0, - 0xb, 0x0, 0x0, 0xa, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5011 "們" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0x41, 0x4, 0x3, 0x0, 0x40, 0x0, 0x4a, - 0x2b, 0x5c, 0x1d, 0x56, 0xb0, 0x0, 0x93, 0x2a, - 0xb, 0xb, 0x2, 0x90, 0x0, 0xe1, 0x2b, 0x5c, - 0xc, 0x56, 0x90, 0x5, 0xf0, 0x2a, 0xb, 0xb, - 0x2, 0x90, 0x8, 0xb0, 0x2b, 0x5a, 0xa, 0x56, - 0x90, 0x31, 0xb0, 0x2a, 0x0, 0x0, 0x2, 0x90, - 0x0, 0xb0, 0x2a, 0x0, 0x0, 0x2, 0x90, 0x0, - 0xb0, 0x2a, 0x0, 0x0, 0x2, 0x90, 0x0, 0xb0, - 0x2a, 0x0, 0x0, 0x2, 0x90, 0x0, 0xb0, 0x2a, - 0x0, 0x0, 0x2, 0x90, 0x0, 0xb0, 0x2a, 0x0, - 0x0, 0x6c, 0x80, 0x0, 0x30, 0x11, 0x0, 0x0, - 0x3, 0x0, - - /* U+5019 "候" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0x10, 0x45, 0x55, 0xa0, 0x0, 0x0, 0x58, - 0x0, 0x0, 0x3, 0x90, 0x0, 0x0, 0xa2, 0x82, - 0x0, 0x5, 0x61, 0x30, 0x0, 0xe1, 0xa2, 0x7a, - 0x55, 0x55, 0x40, 0x6, 0xe0, 0xa0, 0x57, 0x0, - 0x11, 0x0, 0x16, 0xb0, 0xa0, 0x85, 0xa6, 0x65, - 0x0, 0x20, 0xb0, 0xa0, 0x30, 0xa2, 0x0, 0x0, - 0x0, 0xb0, 0xa2, 0x65, 0xc7, 0x58, 0x60, 0x0, - 0xb0, 0xa0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0xb0, - 0xa0, 0x6, 0x52, 0x60, 0x0, 0x0, 0xb0, 0x0, - 0x29, 0x0, 0x87, 0x0, 0x0, 0xb0, 0x4, 0x60, - 0x0, 0xa, 0xb1, 0x0, 0x20, 0x11, 0x0, 0x0, - 0x0, 0x0, - - /* U+501F "借" */ - 0x0, 0x0, 0x10, 0x3, 0x0, 0x30, 0x0, 0x0, - 0x1, 0xe1, 0xb, 0x10, 0xd0, 0x0, 0x0, 0x6, - 0x70, 0xa, 0x0, 0xb0, 0x30, 0x0, 0xc, 0x14, - 0x5c, 0x55, 0xc5, 0x60, 0x0, 0x57, 0x0, 0xa, - 0x0, 0xb0, 0x0, 0x0, 0xba, 0x0, 0xa, 0x0, - 0xb0, 0x51, 0x7, 0x39, 0x36, 0x55, 0x55, 0x55, - 0x53, 0x1, 0x19, 0x0, 0x75, 0x55, 0x59, 0x0, - 0x0, 0x19, 0x0, 0xc0, 0x0, 0xb, 0x0, 0x0, - 0x19, 0x0, 0xc0, 0x0, 0xb, 0x0, 0x0, 0x19, - 0x0, 0xd5, 0x55, 0x5b, 0x0, 0x0, 0x19, 0x0, - 0xc0, 0x0, 0xb, 0x0, 0x0, 0x2a, 0x0, 0xd5, - 0x55, 0x5b, 0x0, 0x0, 0x12, 0x0, 0x20, 0x0, - 0x1, 0x0, - - /* U+5024 "値" */ - 0x0, 0x3, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0xc, 0x30, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x2a, - 0x35, 0x55, 0xd5, 0x56, 0xa0, 0x0, 0x84, 0x10, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x86, - 0xc5, 0x5a, 0x0, 0x7, 0xd1, 0x51, 0xb0, 0x0, - 0x1a, 0x0, 0x16, 0xa1, 0xc0, 0xc5, 0x55, 0x5a, - 0x0, 0x20, 0xa1, 0xb0, 0xb0, 0x0, 0x1a, 0x0, - 0x0, 0xa1, 0xb0, 0xc5, 0x55, 0x5a, 0x0, 0x0, - 0xa1, 0xb0, 0xb0, 0x0, 0x1a, 0x0, 0x0, 0xa1, - 0xb0, 0xc5, 0x55, 0x5a, 0x0, 0x0, 0xa1, 0xb0, - 0x90, 0x0, 0x7, 0x10, 0x0, 0xa1, 0xd5, 0x55, - 0x55, 0x56, 0xe1, 0x0, 0x50, 0x30, 0x0, 0x0, - 0x0, 0x0, - - /* U+503C "值" */ - 0x0, 0x2, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x20, 0xa, 0x40, 0x0, 0x0, 0x0, 0x2a, - 0x45, 0x5c, 0x65, 0x5c, 0x20, 0x0, 0x84, 0x10, - 0xb, 0x10, 0x0, 0x0, 0x0, 0xe2, 0x7, 0x5c, - 0x55, 0xa2, 0x0, 0x6, 0xd2, 0xb, 0x0, 0x0, - 0xb0, 0x0, 0x8, 0x92, 0xb, 0x55, 0x55, 0xc0, - 0x0, 0x40, 0x92, 0xb, 0x0, 0x0, 0xb0, 0x0, - 0x0, 0x92, 0xb, 0x55, 0x55, 0xc0, 0x0, 0x0, - 0x92, 0xb, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x92, - 0xb, 0x55, 0x55, 0xc0, 0x0, 0x0, 0x92, 0xb, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x94, 0x5c, 0x55, - 0x55, 0xc7, 0xb0, 0x0, 0x41, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+505A "做" */ - 0x0, 0x2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0xd, 0x14, 0x80, 0x7, 0x60, 0x0, 0x0, 0x39, - 0x3, 0x70, 0xa, 0x0, 0x0, 0x0, 0x83, 0x3, - 0x72, 0x8, 0x0, 0x30, 0x0, 0xd2, 0x67, 0x96, - 0x59, 0x5b, 0x60, 0x4, 0xe0, 0x3, 0x70, 0x44, - 0xa, 0x0, 0x7, 0xb0, 0x3, 0x70, 0x44, 0xa, - 0x0, 0x21, 0xb0, 0xa6, 0x6c, 0x16, 0xa, 0x0, - 0x0, 0xb0, 0xa0, 0xa, 0x6, 0x56, 0x0, 0x0, - 0xb0, 0xa0, 0xa, 0x1, 0xe1, 0x0, 0x0, 0xb0, - 0xb5, 0x5b, 0x5, 0xc2, 0x0, 0x0, 0xb0, 0xa0, - 0x7, 0x57, 0x1b, 0x20, 0x0, 0xc0, 0x30, 0x16, - 0x30, 0x2, 0xa1, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+505C "停" */ - 0x0, 0x3, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0x10, 0x2, 0xa0, 0x1, 0x0, 0x0, 0x57, - 0x36, 0x55, 0x85, 0x58, 0x50, 0x0, 0xa1, 0x0, - 0x75, 0x55, 0x90, 0x0, 0x1, 0xf2, 0x0, 0xb0, - 0x0, 0xb0, 0x0, 0x7, 0xd0, 0x0, 0xc5, 0x55, - 0xc0, 0x0, 0x16, 0xb0, 0x20, 0x20, 0x0, 0x10, - 0x30, 0x20, 0xb0, 0xb5, 0x55, 0x55, 0x58, 0x80, - 0x0, 0xb1, 0x54, 0x55, 0x55, 0x97, 0x0, 0x0, - 0xb0, 0x1, 0x0, 0xb0, 0x0, 0x0, 0x0, 0xb0, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0xb0, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x39, - 0xc0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x1, 0x10, - 0x0, 0x0, - - /* U+5065 "健" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x20, 0x0, 0xb, 0x0, 0x0, 0x0, 0x1b, - 0x47, 0x62, 0x5c, 0x5a, 0x0, 0x0, 0x74, 0x9, - 0x20, 0xa, 0xa, 0x10, 0x0, 0xc0, 0xb, 0x5, - 0x5c, 0x5c, 0x70, 0x5, 0xe1, 0x56, 0x20, 0x2b, - 0x2b, 0x0, 0x15, 0xb0, 0x85, 0xc1, 0x3b, 0x35, - 0x0, 0x20, 0xb0, 0x0, 0x93, 0x5c, 0x59, 0x10, - 0x0, 0xb0, 0x53, 0x70, 0xa, 0x0, 0x0, 0x0, - 0xb0, 0x67, 0x45, 0x5c, 0x56, 0x60, 0x0, 0xb0, - 0x1e, 0x0, 0xb, 0x0, 0x0, 0x0, 0xb0, 0x48, - 0xa4, 0x5, 0x0, 0x0, 0x0, 0xb3, 0x40, 0x18, - 0xbb, 0xbc, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5074 "側" */ - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0xd, 0x37, 0x55, 0x80, 0x0, 0xc0, 0x0, 0x2b, - 0xa, 0x0, 0xa0, 0x70, 0xa0, 0x0, 0x74, 0xa, - 0x0, 0xa0, 0xb0, 0xa0, 0x0, 0xc2, 0xc, 0x55, - 0xa0, 0xa0, 0xa0, 0x3, 0xe0, 0xa, 0x0, 0xa0, - 0xa0, 0xa0, 0x7, 0xa0, 0xa, 0x0, 0xa0, 0xa0, - 0xa0, 0x21, 0xa0, 0xc, 0x55, 0xa0, 0xa0, 0xa0, - 0x0, 0xa0, 0xa, 0x0, 0xa0, 0xa0, 0xa0, 0x0, - 0xa0, 0xc, 0x55, 0xa0, 0xa0, 0xa0, 0x0, 0xa0, - 0x6, 0x33, 0x10, 0x0, 0xa0, 0x0, 0xa0, 0x1b, - 0x21, 0xa0, 0x0, 0xa0, 0x0, 0xb0, 0x70, 0x0, - 0x93, 0x5b, 0x80, 0x0, 0x11, 0x0, 0x0, 0x10, - 0x2, 0x0, - - /* U+5099 "備" */ - 0x0, 0x1, 0x0, 0x40, 0x3, 0x0, 0x0, 0x0, - 0xd, 0x30, 0xd1, 0xa, 0x40, 0x0, 0x0, 0x3b, - 0x36, 0xd5, 0x5c, 0x6b, 0x30, 0x0, 0x84, 0x0, - 0xc0, 0xa, 0x20, 0x10, 0x0, 0xe2, 0x65, 0xd5, - 0x5a, 0x67, 0xb1, 0x6, 0xe0, 0x2, 0xc1, 0x0, - 0x1, 0x0, 0x16, 0xb0, 0xd, 0x65, 0xa5, 0x5d, - 0x0, 0x20, 0xb0, 0x7c, 0x0, 0xb0, 0xb, 0x0, - 0x0, 0xb3, 0xb, 0x55, 0xc5, 0x5b, 0x0, 0x0, - 0xb0, 0xb, 0x0, 0xb0, 0xb, 0x0, 0x0, 0xb0, - 0xb, 0x55, 0xc5, 0x5b, 0x0, 0x0, 0xb0, 0xb, - 0x0, 0xb0, 0xb, 0x0, 0x0, 0xb0, 0xb, 0x0, - 0xb3, 0xa9, 0x0, 0x0, 0x30, 0x3, 0x0, 0x0, - 0x31, 0x0, - - /* U+50B3 "傳" */ - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - 0x5, 0x90, 0x0, 0xc0, 0x2, 0x30, 0x0, 0xa, - 0x37, 0x55, 0xc5, 0x56, 0x50, 0x0, 0x1a, 0xa, - 0x55, 0xc5, 0x5c, 0x0, 0x0, 0x8b, 0xb, 0x55, - 0xc5, 0x5b, 0x0, 0x1, 0xa9, 0xb, 0x0, 0xb0, - 0xb, 0x0, 0x6, 0x29, 0x8, 0x55, 0xc5, 0x77, - 0x0, 0x1, 0x19, 0x13, 0x44, 0xc5, 0x5b, 0x40, - 0x0, 0x19, 0x28, 0x53, 0x10, 0x81, 0x40, 0x0, - 0x19, 0x55, 0x55, 0x55, 0xc5, 0xb1, 0x0, 0x19, - 0x4, 0x80, 0x0, 0xb0, 0x0, 0x0, 0x19, 0x0, - 0x71, 0x0, 0xb0, 0x0, 0x0, 0x2a, 0x0, 0x2, - 0x6c, 0x90, 0x0, 0x0, 0x1, 0x0, 0x0, 0x3, - 0x0, 0x0, - - /* U+50C5 "僅" */ - 0x0, 0x2, 0x0, 0x30, 0x0, 0x20, 0x0, 0x0, - 0xe, 0x20, 0xc1, 0x1, 0xc0, 0x0, 0x0, 0x59, - 0x55, 0xd5, 0x55, 0xc6, 0xb0, 0x0, 0xb2, 0x10, - 0xb0, 0x0, 0xa0, 0x0, 0x1, 0xe2, 0x0, 0xb5, - 0xa5, 0x80, 0x0, 0x7, 0xd0, 0x7, 0x55, 0xc5, - 0x58, 0x0, 0x16, 0xb0, 0xb, 0x0, 0xb0, 0xb, - 0x0, 0x30, 0xb0, 0xc, 0x55, 0xc5, 0x5b, 0x0, - 0x0, 0xb0, 0x5, 0x0, 0xb0, 0x5, 0x0, 0x0, - 0xb0, 0x6, 0x55, 0xc5, 0x67, 0x0, 0x0, 0xb0, - 0x5, 0x55, 0xc5, 0x69, 0x0, 0x0, 0xb0, 0x1, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0xb1, 0x55, 0x55, - 0xc5, 0x56, 0xd1, 0x0, 0x30, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+50CD "働" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x2d, 0x13, 0x6a, 0x60, 0xd1, 0x0, 0x0, 0x66, - 0x22, 0xa0, 0x0, 0xb0, 0x0, 0x0, 0xa2, 0x75, - 0xc5, 0x90, 0xb0, 0x0, 0x1, 0xd1, 0x20, 0xa0, - 0x36, 0xc5, 0xd0, 0x7, 0xc0, 0xb5, 0xc5, 0xb0, - 0xb0, 0xb0, 0x8, 0xa0, 0xa5, 0xc5, 0x90, 0xb0, - 0xb0, 0x30, 0xa0, 0xa0, 0xa1, 0x90, 0xa0, 0xb0, - 0x0, 0xa0, 0xb5, 0xc5, 0x92, 0x80, 0xa0, 0x0, - 0xa0, 0x0, 0xa1, 0x46, 0x30, 0x90, 0x0, 0xa0, - 0x65, 0xc5, 0x49, 0x1, 0x80, 0x0, 0xa0, 0x24, - 0xc5, 0x55, 0x3, 0x70, 0x0, 0xb1, 0xb5, 0x11, - 0x60, 0x7d, 0x30, 0x0, 0x20, 0x0, 0x2, 0x0, - 0x2, 0x0, - - /* U+50CF "像" */ - 0x0, 0x1, 0x50, 0x6, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xb0, 0x4d, 0x55, 0x80, 0x0, 0x0, 0xb, - 0x30, 0xb1, 0x8, 0x40, 0x0, 0x0, 0x1b, 0x8, - 0xb5, 0x78, 0x5b, 0x20, 0x0, 0x9c, 0x33, 0xb0, - 0xb0, 0xb, 0x0, 0x1, 0x9a, 0x0, 0xd5, 0xc5, - 0x5d, 0x10, 0x6, 0x1a, 0x0, 0x26, 0x50, 0x5, - 0x0, 0x11, 0x1a, 0x0, 0x56, 0x93, 0xa6, 0x0, - 0x0, 0x1a, 0x5, 0x28, 0x98, 0x50, 0x0, 0x0, - 0x1a, 0x1, 0x83, 0x9b, 0x81, 0x0, 0x0, 0x1a, - 0x14, 0x9, 0x5d, 0x2c, 0x0, 0x0, 0x1a, 0x3, - 0x92, 0xd, 0x9, 0xd3, 0x0, 0x1a, 0x43, 0x6, - 0xd8, 0x0, 0x40, 0x0, 0x1, 0x0, 0x0, 0x30, - 0x0, 0x0, - - /* U+50D5 "僕" */ - 0x0, 0x3, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, - 0xd, 0x30, 0xd, 0xd, 0x0, 0x0, 0x0, 0x3a, - 0x8, 0x1b, 0xb, 0x2c, 0x0, 0x0, 0x84, 0x5, - 0x4b, 0xb, 0x81, 0x0, 0x0, 0xd3, 0x56, 0x5a, - 0x5b, 0x67, 0x80, 0x5, 0xd2, 0x0, 0x82, 0x4, - 0x60, 0x0, 0x7, 0x92, 0x15, 0x78, 0x59, 0x6a, - 0x0, 0x20, 0x92, 0x1, 0x0, 0xb0, 0x10, 0x0, - 0x0, 0x92, 0x3, 0x65, 0xc5, 0x73, 0x0, 0x0, - 0x92, 0x45, 0x57, 0xa5, 0x59, 0x60, 0x0, 0x92, - 0x10, 0xa, 0x15, 0x0, 0x0, 0x0, 0x92, 0x1, - 0x92, 0x3, 0x80, 0x0, 0x0, 0x92, 0x46, 0x0, - 0x0, 0x3c, 0x80, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+50F9 "價" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4d, 0x46, 0x57, 0x57, 0x56, 0x90, 0x0, 0x85, - 0x2, 0xa, 0xa, 0x2, 0x10, 0x0, 0xc2, 0xc, - 0x5c, 0x5c, 0x5a, 0x40, 0x2, 0xf3, 0xc, 0x5c, - 0x5c, 0x5a, 0x30, 0x7, 0xa2, 0x4, 0x0, 0x0, - 0x3, 0x0, 0x6, 0x82, 0x6, 0x65, 0x55, 0x5b, - 0x0, 0x30, 0x82, 0x6, 0x75, 0x55, 0x59, 0x0, - 0x0, 0x82, 0x6, 0x30, 0x0, 0x19, 0x0, 0x0, - 0x82, 0x6, 0x75, 0x55, 0x59, 0x0, 0x0, 0x82, - 0x6, 0x75, 0x55, 0x59, 0x0, 0x0, 0x82, 0x1, - 0xb3, 0x3, 0x86, 0x0, 0x0, 0x82, 0x48, 0x10, - 0x0, 0x6, 0xb0, 0x0, 0x10, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+5104 "億" */ - 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x9, 0x70, 0x0, 0xb0, 0x0, 0x0, 0x0, 0xd, - 0x4, 0x65, 0x95, 0x58, 0x50, 0x0, 0x49, 0x0, - 0x55, 0x5, 0xa0, 0x0, 0x0, 0xab, 0x24, 0x48, - 0x49, 0x44, 0xa1, 0x1, 0x99, 0x12, 0x31, 0x11, - 0x24, 0x10, 0x6, 0x29, 0x0, 0xc5, 0x55, 0x6b, - 0x0, 0x2, 0x19, 0x0, 0xc5, 0x55, 0x69, 0x0, - 0x0, 0x19, 0x0, 0xd5, 0x55, 0x6a, 0x0, 0x0, - 0x19, 0x0, 0x42, 0x70, 0x22, 0x0, 0x0, 0x19, - 0x5, 0x1a, 0x63, 0x2a, 0x20, 0x0, 0x19, 0x38, - 0x19, 0x0, 0x83, 0x80, 0x0, 0x2a, 0x41, 0xc, - 0xab, 0xd2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+512A "優" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0x26, 0x55, 0x85, 0x5a, 0x20, 0x0, 0x48, - 0x0, 0xb5, 0x75, 0xb1, 0x0, 0x0, 0x92, 0x0, - 0xc5, 0x55, 0xc0, 0x0, 0x0, 0xd2, 0x0, 0xc5, - 0x55, 0xc0, 0x0, 0x5, 0xe0, 0x75, 0xa5, 0x55, - 0xa5, 0xb0, 0x7, 0xb1, 0xa2, 0x73, 0xa2, 0x25, - 0x40, 0x21, 0xb0, 0x38, 0x83, 0x12, 0x7a, 0x10, - 0x0, 0xb0, 0x31, 0x5a, 0x88, 0x33, 0x0, 0x0, - 0xb0, 0x0, 0xd7, 0x55, 0x92, 0x0, 0x0, 0xb0, - 0x9, 0x47, 0x7, 0x70, 0x0, 0x0, 0xb0, 0x30, - 0x5, 0xf9, 0x0, 0x0, 0x0, 0xb0, 0x4, 0x75, - 0x6, 0xcb, 0x50, 0x0, 0x20, 0x30, 0x0, 0x0, - 0x2, 0x0, - - /* U+513F "儿" */ - 0x0, 0x0, 0x20, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x1, 0xb0, - 0xa, 0x20, 0x0, 0x0, 0x0, 0x1b, 0x0, 0xa2, - 0x0, 0x0, 0x0, 0x1, 0xa0, 0xa, 0x20, 0x0, - 0x0, 0x0, 0x29, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0x4, 0x80, 0xa, 0x20, 0x0, 0x0, 0x0, 0x75, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0xb, 0x10, 0xa, - 0x20, 0x4, 0x0, 0x3, 0x90, 0x0, 0xa2, 0x0, - 0x60, 0x0, 0xb1, 0x0, 0x9, 0x20, 0xa, 0x21, - 0x81, 0x0, 0x0, 0x5d, 0xbb, 0xe4, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5143 "元" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x71, 0x0, 0x0, - 0x6, 0x55, 0x55, 0x55, 0x53, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x4, 0x65, 0x59, 0x55, - 0x95, 0x5a, 0x60, 0x0, 0x0, 0xe, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x49, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x95, 0x0, 0xd0, 0x0, 0x30, 0x0, - 0x1, 0xc0, 0x0, 0xd0, 0x0, 0x60, 0x0, 0xb, - 0x30, 0x0, 0xd0, 0x0, 0xc0, 0x1, 0x92, 0x0, - 0x0, 0xac, 0xbc, 0xc2, 0x4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5144 "兄" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x55, 0x55, 0x55, 0xc2, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0xe5, 0xb8, 0x5d, 0x5c, 0x0, 0x0, 0x3, 0xa, - 0x30, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xd, - 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0xd0, 0x0, - 0x40, 0x0, 0x6, 0x70, 0xd, 0x0, 0x6, 0x0, - 0x2, 0xb0, 0x0, 0xd0, 0x0, 0xc0, 0x4, 0x80, - 0x0, 0xb, 0xcb, 0xcd, 0x23, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5145 "充" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x4, 0x55, - 0x55, 0x7b, 0x55, 0x59, 0x90, 0x1, 0x0, 0x3, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x30, - 0x23, 0x0, 0x0, 0x0, 0x2, 0x91, 0x0, 0x6, - 0x90, 0x0, 0x0, 0x4f, 0xaa, 0x87, 0x95, 0x9c, - 0x0, 0x0, 0x2, 0xd, 0x1, 0xb0, 0x8, 0x0, - 0x0, 0x0, 0x1c, 0x1, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x57, 0x1, 0xb0, 0x0, 0x30, 0x0, 0x0, - 0xb1, 0x1, 0xb0, 0x0, 0x60, 0x0, 0x7, 0x60, - 0x0, 0xb0, 0x0, 0xb0, 0x1, 0x73, 0x0, 0x0, - 0xbb, 0xbc, 0xd2, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5148 "先" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0xe, - 0x30, 0x92, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x55, - 0xb6, 0x55, 0xd2, 0x0, 0x0, 0x92, 0x0, 0x92, - 0x0, 0x0, 0x0, 0x2, 0x50, 0x0, 0x92, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x92, 0x0, 0x6, - 0x30, 0x17, 0x55, 0x7b, 0x59, 0x95, 0x55, 0x40, - 0x0, 0x0, 0x66, 0x6, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x93, 0x6, 0x60, 0x0, 0x10, 0x0, 0x0, - 0xb0, 0x6, 0x60, 0x0, 0x50, 0x0, 0xa, 0x30, - 0x5, 0x60, 0x1, 0x80, 0x2, 0x82, 0x0, 0x2, - 0xda, 0xab, 0xb0, 0x13, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5149 "光" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x7, - 0x0, 0x48, 0x0, 0x91, 0x0, 0x0, 0x2, 0xc0, - 0x48, 0x4, 0xb0, 0x0, 0x0, 0x0, 0xa4, 0x48, - 0xa, 0x10, 0x0, 0x0, 0x0, 0x20, 0x48, 0x33, - 0x2, 0x40, 0x6, 0x55, 0x5c, 0x56, 0xc5, 0x56, - 0x60, 0x0, 0x0, 0x1c, 0x0, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x29, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x76, 0x0, 0xb0, 0x0, 0x30, 0x0, 0x0, - 0xb0, 0x0, 0xb0, 0x0, 0x60, 0x0, 0x8, 0x50, - 0x0, 0xc0, 0x0, 0xa0, 0x1, 0x73, 0x0, 0x0, - 0xab, 0xaa, 0xd2, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+514B "克" */ - 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x5, 0x55, - 0x55, 0xb6, 0x55, 0x59, 0x70, 0x1, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x55, 0xc5, - 0x55, 0xa0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0xa0, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0xa0, 0x0, - 0x0, 0xb, 0x5c, 0x5a, 0x95, 0x80, 0x0, 0x0, - 0x0, 0xb, 0x7, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x47, 0x7, 0x60, 0x0, 0x50, 0x0, 0x1, 0xb0, - 0x7, 0x60, 0x0, 0x80, 0x0, 0x57, 0x10, 0x5, - 0xd9, 0x9b, 0xb0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+514D "免" */ - 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd7, 0x55, 0xb5, 0x0, 0x0, 0x0, 0x8, 0x50, - 0x0, 0xc1, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x5, - 0x20, 0x4, 0x0, 0x3, 0x7c, 0x55, 0x6c, 0x55, - 0x5d, 0x0, 0x3, 0xc, 0x0, 0x39, 0x0, 0x1b, - 0x0, 0x0, 0xd, 0x55, 0x8a, 0x55, 0x5b, 0x0, - 0x0, 0x8, 0x0, 0x86, 0xb0, 0x5, 0x0, 0x0, - 0x0, 0x0, 0xd2, 0xb0, 0x0, 0x20, 0x0, 0x0, - 0x7, 0x81, 0xb0, 0x0, 0x60, 0x0, 0x0, 0x5b, - 0x0, 0xb0, 0x0, 0x91, 0x0, 0x38, 0x50, 0x0, - 0xda, 0xaa, 0xe4, 0x3, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5152 "兒" */ - 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x59, 0x73, 0x55, 0x93, 0x0, 0x0, 0xd0, 0x0, - 0x1, 0xa, 0x20, 0x0, 0xc, 0x2, 0x0, 0x0, - 0xa1, 0x0, 0x0, 0xd5, 0x74, 0x6, 0x5c, 0x10, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, - 0xd5, 0x55, 0x55, 0x5c, 0x20, 0x0, 0x7, 0xc, - 0x0, 0xc0, 0x50, 0x0, 0x0, 0x0, 0xc0, 0xc, - 0x0, 0x0, 0x0, 0x0, 0x38, 0x0, 0xc0, 0x0, - 0x40, 0x0, 0xa, 0x20, 0xc, 0x0, 0x7, 0x0, - 0x7, 0x60, 0x0, 0xd1, 0x1, 0xd4, 0x6, 0x40, - 0x0, 0x6, 0x99, 0x97, 0x12, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+515A "党" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x0, 0x2b, 0x5, 0x30, 0x0, 0x0, 0x1, - 0xc2, 0x19, 0xc, 0x30, 0x0, 0x0, 0x30, 0x42, - 0x19, 0x52, 0x0, 0x30, 0x1, 0xa5, 0x55, 0x55, - 0x55, 0x5a, 0xa0, 0x9, 0x40, 0x30, 0x0, 0x4, - 0x5, 0x0, 0x0, 0x0, 0xd5, 0x55, 0x5c, 0x20, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x86, 0x7c, 0x0, 0x0, 0x0, - 0x0, 0x36, 0x72, 0x60, 0x0, 0x10, 0x0, 0x0, - 0xb, 0x22, 0x60, 0x0, 0x50, 0x0, 0x0, 0x78, - 0x2, 0x70, 0x0, 0xa0, 0x1, 0x57, 0x40, 0x1, - 0xca, 0xab, 0xc1, 0x13, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5165 "入" */ - 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xda, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, 0x54, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x94, 0x0, 0x6a, 0x0, 0x0, - 0x0, 0x5, 0x90, 0x0, 0xc, 0x60, 0x0, 0x0, - 0x29, 0x0, 0x0, 0x2, 0xe8, 0x0, 0x3, 0x70, - 0x0, 0x0, 0x0, 0x2e, 0xc2, 0x24, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x10, - - /* U+5167 "內" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x53, 0x0, 0x0, - 0xa, 0x55, 0x57, 0x95, 0x55, 0xc1, 0xc0, 0x0, - 0x3c, 0x0, 0xc, 0xc, 0x0, 0x6, 0xc1, 0x0, - 0xc0, 0xc0, 0x0, 0xb3, 0x70, 0xc, 0xc, 0x0, - 0x46, 0xb, 0x10, 0xc0, 0xc0, 0x9, 0x0, 0x4c, - 0xc, 0xc, 0x7, 0x10, 0x0, 0xa9, 0xc0, 0xc1, - 0x0, 0x0, 0x0, 0xc, 0xc, 0x0, 0x0, 0x0, - 0x10, 0xd0, 0xb0, 0x0, 0x0, 0x4, 0xca, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5168 "全" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, 0x87, - 0x3, 0x70, 0x0, 0x0, 0x0, 0x4, 0xa0, 0x0, - 0x59, 0x10, 0x0, 0x0, 0x49, 0x0, 0x0, 0x9, - 0xe9, 0x40, 0x6, 0x66, 0x55, 0xc6, 0x55, 0x39, - 0x70, 0x20, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa1, 0x2, 0x40, 0x0, 0x0, - 0x16, 0x55, 0xc6, 0x55, 0x40, 0x0, 0x0, 0x0, - 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa1, 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0xc6, - 0x55, 0x5d, 0x50, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5169 "兩" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x55, - 0x55, 0x55, 0x55, 0x57, 0xe2, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x10, 0xc, 0x55, 0x55, 0xc5, 0x55, 0x5c, - 0x0, 0xb1, 0x10, 0xb, 0x10, 0x0, 0xa0, 0xb, - 0x7, 0x10, 0xb0, 0x70, 0xa, 0x0, 0xb0, 0x3b, - 0xb, 0x5, 0x90, 0xa0, 0xb, 0x9, 0xa4, 0xb0, - 0x9b, 0x4a, 0x0, 0xb3, 0x52, 0x9b, 0x44, 0x59, - 0xa0, 0xc, 0x50, 0x2, 0xb4, 0x1, 0x3a, 0x0, - 0xb0, 0x0, 0xb, 0x0, 0x1, 0xa0, 0xb, 0x0, - 0x0, 0xa0, 0x6, 0xe6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, - - /* U+516B "八" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x2, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0x10, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x39, 0x0, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x57, 0x0, 0x81, - 0x0, 0x0, 0x0, 0x0, 0x84, 0x0, 0x55, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x1a, 0x0, 0x0, - 0x0, 0x1, 0xa0, 0x0, 0xa, 0x10, 0x0, 0x0, - 0x8, 0x30, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x19, - 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x80, 0x0, - 0x0, 0x0, 0x1e, 0x80, 0x5, 0x10, 0x0, 0x0, - 0x0, 0x3, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+516C "公" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x10, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x4b, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0xb2, - 0x0, 0x55, 0x0, 0x0, 0x0, 0x4, 0x80, 0x0, - 0xc, 0x10, 0x0, 0x0, 0x1a, 0x0, 0x20, 0x3, - 0xc1, 0x0, 0x0, 0x81, 0x0, 0xa8, 0x0, 0x6e, - 0x60, 0x5, 0x0, 0x3, 0xc0, 0x0, 0x5, 0x40, - 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x74, 0x0, 0x53, 0x0, 0x0, 0x0, 0x3, - 0x70, 0x0, 0xa, 0x30, 0x0, 0x0, 0x4c, 0x66, - 0x76, 0x67, 0xe1, 0x0, 0x0, 0x28, 0x42, 0x10, - 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+516D "六" */ - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x18, 0x0, 0x0, 0x10, 0x6, 0x55, 0x55, 0x55, - 0x55, 0x58, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3c, 0x10, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x98, 0x0, 0x28, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x6, 0x80, 0x0, 0x0, - 0x9, 0x40, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x57, - 0x0, 0x0, 0x0, 0x3f, 0x20, 0x2, 0x80, 0x0, - 0x0, 0x0, 0xb, 0x40, 0x15, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5171 "共" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0xc0, 0x0, 0x0, 0x4, 0x55, 0xd5, - 0x55, 0xd5, 0x5c, 0x20, 0x0, 0x0, 0xc0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0xc0, 0x6, 0x20, - 0x36, 0x55, 0x75, 0x55, 0x65, 0x56, 0x50, 0x0, - 0x0, 0xa8, 0x0, 0x52, 0x0, 0x0, 0x0, 0x7, - 0xa0, 0x0, 0x7, 0xa1, 0x0, 0x0, 0x67, 0x0, - 0x0, 0x0, 0x5e, 0x20, 0x6, 0x30, 0x0, 0x0, - 0x0, 0x6, 0x50, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5176 "其" */ - 0x0, 0x0, 0x30, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0x1d, 0x0, 0x0, 0x3, 0x55, - 0xd5, 0x55, 0x6c, 0x5b, 0x60, 0x0, 0x0, 0xc0, - 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x55, - 0x5b, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x1b, - 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x1b, 0x0, - 0x0, 0x0, 0x0, 0xc5, 0x55, 0x5b, 0x0, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x1b, 0x1, 0x60, 0x16, - 0x55, 0x76, 0x55, 0x57, 0x56, 0x72, 0x0, 0x0, - 0xab, 0x0, 0x48, 0x10, 0x0, 0x0, 0xa, 0x70, - 0x0, 0x2, 0xd7, 0x0, 0x3, 0x82, 0x0, 0x0, - 0x0, 0x2e, 0x10, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+5177 "具" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc5, 0x55, 0x55, 0xc0, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, 0xc5, - 0x55, 0x56, 0x90, 0x0, 0x0, 0x0, 0xb0, 0x0, - 0x1, 0x90, 0x0, 0x0, 0x0, 0xc5, 0x55, 0x56, - 0x90, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x1, 0x90, - 0x0, 0x0, 0x0, 0xc5, 0x55, 0x56, 0x90, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x1, 0x90, 0x40, 0x6, - 0x55, 0x85, 0x55, 0x55, 0x87, 0xa2, 0x0, 0x0, - 0x89, 0x0, 0x25, 0x10, 0x0, 0x0, 0x9, 0x70, - 0x0, 0x1, 0xa7, 0x0, 0x3, 0x72, 0x0, 0x0, - 0x0, 0xb, 0x40, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5185 "内" */ - 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x50, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x7, 0x55, 0x5d, 0x55, 0x55, 0xa0, 0xc0, 0x0, - 0xd0, 0x0, 0xc, 0xc, 0x0, 0xc, 0x0, 0x0, - 0xc0, 0xc0, 0x5, 0xa7, 0x0, 0xc, 0xc, 0x0, - 0xa1, 0x3c, 0x20, 0xc0, 0xc0, 0x73, 0x0, 0x6b, - 0xc, 0xc, 0x52, 0x0, 0x0, 0x60, 0xc0, 0xc0, - 0x0, 0x0, 0x0, 0xc, 0xc, 0x0, 0x0, 0x1, - 0x23, 0xb0, 0xc0, 0x0, 0x0, 0x4, 0xe7, 0x1, - 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+5186 "円" */ - 0x85, 0x55, 0x55, 0x55, 0x5a, 0x1c, 0x0, 0x2, - 0x90, 0x0, 0xc0, 0xc0, 0x0, 0x29, 0x0, 0xc, - 0xc, 0x0, 0x2, 0x90, 0x0, 0xc0, 0xc0, 0x0, - 0x29, 0x0, 0xc, 0xd, 0x55, 0x56, 0xa5, 0x55, - 0xd0, 0xc0, 0x0, 0x0, 0x0, 0xc, 0xc, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0xc0, 0x0, 0x0, 0x0, - 0xc, 0xc, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xc0, - 0x0, 0x0, 0x0, 0xc, 0xc, 0x0, 0x0, 0x0, - 0x6c, 0xc0, 0x10, 0x0, 0x0, 0x0, 0x21, 0x0, - - /* U+518A "冊" */ - 0x0, 0x17, 0x55, 0x55, 0x55, 0x59, 0x0, 0x0, - 0x1a, 0xb, 0x0, 0xb0, 0xc, 0x0, 0x0, 0xa, - 0xb, 0x0, 0xb0, 0xb, 0x0, 0x0, 0xa, 0xb, - 0x0, 0xb0, 0xb, 0x0, 0x0, 0xa, 0xb, 0x0, - 0xb0, 0xb, 0x0, 0x4, 0x5c, 0x5c, 0x55, 0xc5, - 0x5d, 0xd3, 0x1, 0x1a, 0xb, 0x0, 0xb0, 0xb, - 0x0, 0x0, 0xa, 0xb, 0x0, 0xb0, 0xb, 0x0, - 0x0, 0xa, 0xb, 0x0, 0xb0, 0xb, 0x0, 0x0, - 0xa, 0xb, 0x0, 0xb0, 0xb, 0x0, 0x0, 0xa, - 0xa, 0x0, 0xa0, 0xb, 0x0, 0x0, 0x19, 0x0, - 0x0, 0x4, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+518D "再" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x65, 0x55, 0x55, 0x55, 0x5d, 0x30, 0x0, 0x0, - 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, 0x7, 0x55, - 0x6b, 0x55, 0x92, 0x0, 0x0, 0xc, 0x0, 0x29, - 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x29, 0x0, - 0xc0, 0x0, 0x0, 0xd, 0x55, 0x6b, 0x55, 0xd0, - 0x0, 0x0, 0xc, 0x0, 0x29, 0x0, 0xc0, 0x0, - 0x0, 0xc, 0x0, 0x29, 0x0, 0xc1, 0x70, 0x6, - 0x5d, 0x55, 0x55, 0x55, 0xd5, 0x61, 0x0, 0xc, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x5b, 0xd0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, - 0x10, 0x0, - - /* U+5199 "写" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x55, 0x55, 0x55, 0x55, 0x97, 0x1, 0xc0, 0x10, - 0x0, 0x0, 0xa, 0x20, 0x46, 0xd, 0x10, 0x0, - 0x1, 0x10, 0x0, 0x0, 0xd5, 0x55, 0x55, 0xa5, - 0x0, 0x0, 0x39, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x60, 0x0, 0x0, 0x3, 0x0, 0x0, 0x77, - 0x55, 0x55, 0x55, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x45, 0x55, 0x55, 0x5a, 0x81, - 0xa0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x48, 0x0, - 0x0, 0x0, 0x0, 0x13, 0x1a, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x3d, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, - - /* U+519B "军" */ - 0x0, 0x85, 0x55, 0x55, 0x55, 0x59, 0x70, 0x5, - 0x80, 0x2, 0x90, 0x0, 0x7, 0x10, 0x2, 0x10, - 0x8, 0x50, 0x0, 0x20, 0x0, 0x0, 0x35, 0x6c, - 0x55, 0x55, 0x72, 0x0, 0x0, 0x0, 0x93, 0x9, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x80, 0xb, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x55, 0x5c, 0x55, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, - 0x4, 0x55, 0x55, 0x5c, 0x55, 0x56, 0xa0, 0x1, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, - - /* U+51AC "冬" */ - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x99, 0x55, 0x5a, 0x70, 0x0, 0x0, 0x3, 0xa3, - 0x0, 0x3c, 0x10, 0x0, 0x0, 0x9, 0x6, 0x31, - 0xc2, 0x0, 0x0, 0x0, 0x60, 0x0, 0xac, 0x20, - 0x0, 0x0, 0x1, 0x0, 0x5, 0xaa, 0x91, 0x0, - 0x0, 0x0, 0x2, 0x96, 0x0, 0x4d, 0x94, 0x0, - 0x4, 0x65, 0x0, 0x6a, 0x20, 0x6d, 0xa1, 0x0, - 0x0, 0x0, 0x4, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x57, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5d, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+51B7 "冷" */ - 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x8, 0xb0, 0x0, 0x0, 0x8, 0x60, - 0x0, 0xd, 0x52, 0x0, 0x0, 0x0, 0xf0, 0x40, - 0x58, 0x9, 0x0, 0x0, 0x0, 0x30, 0x50, 0xb3, - 0x3, 0xa0, 0x0, 0x0, 0x5, 0x18, 0x31, 0xc0, - 0x7c, 0x30, 0x0, 0x8, 0x53, 0x0, 0xa1, 0x6, - 0xa2, 0x0, 0x55, 0x13, 0x55, 0x55, 0x92, 0x0, - 0x18, 0xe0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x2, - 0xc0, 0x0, 0x10, 0xa, 0x0, 0x0, 0x4, 0xb0, - 0x0, 0x9, 0x71, 0x0, 0x0, 0x4, 0xa0, 0x0, - 0x1, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+51CD "凍" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x2, 0xc1, - 0x45, 0x55, 0xd5, 0x57, 0xb0, 0x0, 0x75, 0x1, - 0x0, 0xb0, 0x1, 0x0, 0x0, 0x2, 0x2c, 0x55, - 0xc5, 0x5d, 0x10, 0x0, 0x5, 0xb, 0x0, 0xb0, - 0xb, 0x0, 0x0, 0x6, 0xb, 0x55, 0xc5, 0x5c, - 0x0, 0x0, 0x43, 0xb, 0x0, 0xb0, 0xb, 0x0, - 0x6, 0xd0, 0xa, 0x5d, 0xe8, 0x58, 0x0, 0x2, - 0xc0, 0x0, 0x39, 0xb6, 0x10, 0x0, 0x2, 0xb0, - 0x1, 0xa0, 0xb1, 0xa0, 0x0, 0x4, 0xb0, 0x9, - 0x10, 0xb0, 0x5b, 0x20, 0x1, 0x51, 0x60, 0x0, - 0xb0, 0x6, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x50, - 0x0, 0x0, - - /* U+51DD "凝" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x13, - 0x0, 0xc0, 0x80, 0x65, 0x5d, 0x20, 0xa, 0x60, - 0xb6, 0x21, 0x1, 0x35, 0x0, 0x2, 0x52, 0xa0, - 0x15, 0x7, 0x80, 0x0, 0x0, 0x3, 0x98, 0xa5, - 0x0, 0xb0, 0x0, 0x0, 0x50, 0xb0, 0x2, 0x65, - 0x85, 0xd0, 0x0, 0x72, 0xb5, 0x92, 0x0, 0xa3, - 0x20, 0x3, 0x76, 0xa, 0x0, 0xb1, 0xa0, 0x30, - 0x3e, 0x45, 0x5c, 0x78, 0xa0, 0xc5, 0x50, 0xb, - 0x1, 0xc, 0x0, 0xb0, 0xa0, 0x0, 0xf, 0x0, - 0x57, 0xa1, 0xa7, 0xa0, 0x0, 0x8, 0x0, 0x90, - 0x66, 0x41, 0xb6, 0x20, 0x0, 0x6, 0x0, 0x5, - 0x0, 0x7, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+51E6 "処" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0xa5, 0xb2, 0x0, 0x0, 0x3b, 0x56, - 0x90, 0xb0, 0xc0, 0x0, 0x0, 0x92, 0x4, 0x60, - 0xb0, 0xc0, 0x0, 0x0, 0xb1, 0x7, 0x31, 0x90, - 0xc0, 0x0, 0x7, 0x14, 0xb, 0x3, 0x70, 0xc0, - 0x0, 0x3, 0x6, 0x1a, 0x8, 0x10, 0xc0, 0x10, - 0x0, 0x2, 0xc4, 0x27, 0x0, 0xc0, 0x60, 0x0, - 0x1, 0xe3, 0x60, 0x0, 0xa9, 0xd2, 0x0, 0x9, - 0x2b, 0x40, 0x0, 0x1, 0x0, 0x0, 0x73, 0x1, - 0xbc, 0x63, 0x22, 0x31, 0x6, 0x20, 0x0, 0x3, - 0x8c, 0xde, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+51FA "出" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x30, 0x0, 0x0, 0x3, 0x10, 0xa, 0x10, - 0x5, 0x10, 0x7, 0x60, 0xa, 0x10, 0xa, 0x20, - 0x6, 0x50, 0xa, 0x10, 0xa, 0x10, 0x6, 0x50, - 0xa, 0x10, 0xa, 0x10, 0x8, 0x75, 0x5c, 0x65, - 0x5c, 0x20, 0x0, 0x0, 0xa, 0x10, 0x2, 0x0, - 0xd, 0x10, 0xa, 0x10, 0x2, 0xa0, 0xc, 0x0, - 0xa, 0x10, 0x1, 0xa0, 0xc, 0x0, 0xa, 0x10, - 0x1, 0xa0, 0xc, 0x0, 0xa, 0x10, 0x1, 0xa0, - 0x8, 0x55, 0x55, 0x55, 0x56, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+5206 "分" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x1b, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x87, 0x0, 0x80, 0x0, 0x0, 0x0, 0x1, 0xc0, - 0x0, 0x27, 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, - 0x9, 0x40, 0x0, 0x0, 0x65, 0x0, 0x0, 0x1, - 0xb8, 0x10, 0x4, 0x54, 0x57, 0x85, 0x5c, 0x59, - 0xc1, 0x2, 0x0, 0x8, 0x40, 0xb, 0x10, 0x0, - 0x0, 0x0, 0xb, 0x10, 0xc, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x93, 0x0, 0xd, 0x0, 0x0, 0x0, 0x5, 0x60, - 0x0, 0x2b, 0x0, 0x0, 0x0, 0x63, 0x0, 0x18, - 0xf3, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+5207 "切" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0xc, - 0x0, 0x65, 0x69, 0x56, 0xd0, 0x0, 0xc, 0x0, - 0x10, 0x3a, 0x1, 0xb0, 0x0, 0xc, 0x46, 0xa1, - 0x48, 0x2, 0xb0, 0x5, 0x5c, 0x0, 0x0, 0x67, - 0x2, 0xa0, 0x0, 0xc, 0x0, 0x0, 0x84, 0x3, - 0x90, 0x0, 0xc, 0x0, 0x0, 0xc1, 0x4, 0x90, - 0x0, 0xc, 0x1, 0x51, 0xc0, 0x4, 0x80, 0x0, - 0xc, 0x57, 0x8, 0x50, 0x5, 0x70, 0x0, 0x1f, - 0x60, 0x2b, 0x0, 0x7, 0x50, 0x0, 0x3, 0x1, - 0xa1, 0x4, 0x3c, 0x30, 0x0, 0x0, 0x36, 0x0, - 0x1, 0xca, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+520A "刊" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x3, - 0x55, 0x55, 0x96, 0x0, 0x1, 0xd0, 0x0, 0x10, - 0xc0, 0x0, 0x7, 0x1, 0xb0, 0x0, 0x0, 0xc0, - 0x0, 0xc, 0x1, 0xb0, 0x0, 0x0, 0xc0, 0x0, - 0xb, 0x1, 0xb0, 0x0, 0x0, 0xc0, 0x17, 0xb, - 0x1, 0xb0, 0x6, 0x55, 0xd5, 0x55, 0x1b, 0x1, - 0xb0, 0x0, 0x0, 0xc0, 0x0, 0xb, 0x1, 0xb0, - 0x0, 0x0, 0xc0, 0x0, 0xc, 0x1, 0xb0, 0x0, - 0x0, 0xc0, 0x0, 0x1b, 0x1, 0xb0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x13, 0xa0, 0x0, 0x0, 0xd0, 0x0, - 0x1, 0x6e, 0x60, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x2, 0x0, - - /* U+5217 "列" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x10, 0x1, 0xc0, 0x3, 0x65, - 0xe5, 0x55, 0x30, 0x1, 0xa0, 0x0, 0x3, 0xb0, - 0x0, 0xb, 0x1, 0xa0, 0x0, 0x8, 0x95, 0x75, - 0xb, 0x1, 0xa0, 0x0, 0xc, 0x0, 0x94, 0xb, - 0x1, 0xa0, 0x0, 0x79, 0x10, 0xc0, 0xb, 0x1, - 0xa0, 0x1, 0x62, 0xb3, 0x90, 0xb, 0x1, 0xa0, - 0x4, 0x0, 0x7b, 0x20, 0xb, 0x1, 0xa0, 0x0, - 0x0, 0x48, 0x0, 0xc, 0x1, 0xa0, 0x0, 0x2, - 0xa0, 0x0, 0x4, 0x1, 0xa0, 0x0, 0x38, 0x0, - 0x0, 0x3, 0x24, 0xa0, 0x4, 0x40, 0x0, 0x0, - 0x1, 0x6f, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+521D "初" */ - 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x40, 0x45, 0x65, 0x55, 0xb1, 0x17, 0x55, 0xb7, - 0x0, 0xc0, 0x0, 0xc0, 0x0, 0x2, 0xb0, 0x0, - 0xc0, 0x0, 0xb0, 0x0, 0xc, 0x16, 0x50, 0xb0, - 0x1, 0xa0, 0x0, 0x7e, 0x19, 0x2, 0x90, 0x2, - 0x90, 0x6, 0x4b, 0x95, 0x5, 0x60, 0x4, 0x80, - 0x32, 0xb, 0xb, 0x38, 0x20, 0x5, 0x70, 0x0, - 0xb, 0x0, 0xa, 0x0, 0x6, 0x60, 0x0, 0xb, - 0x0, 0x64, 0x0, 0x8, 0x40, 0x0, 0xb, 0x2, - 0x70, 0x13, 0x1b, 0x10, 0x0, 0xb, 0x25, 0x0, - 0x4, 0xea, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5224 "判" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, 0x20, 0x0, - 0x0, 0xb2, 0x0, 0x0, 0x2, 0xb0, 0x3, 0x50, - 0xb0, 0x3b, 0x2, 0x1, 0x90, 0x0, 0xc3, 0xb0, - 0x92, 0xc, 0x11, 0x90, 0x0, 0x62, 0xb3, 0x30, - 0xb, 0x1, 0x90, 0x2, 0x55, 0xc5, 0x6b, 0xb, - 0x1, 0x90, 0x0, 0x0, 0xb0, 0x0, 0xb, 0x1, - 0x90, 0x0, 0x0, 0xb0, 0x3, 0xb, 0x1, 0x90, - 0x17, 0x55, 0xc5, 0x58, 0x3b, 0x1, 0x90, 0x0, - 0x4, 0x70, 0x0, 0xc, 0x1, 0x90, 0x0, 0xa, - 0x0, 0x0, 0x6, 0x1, 0x90, 0x0, 0x73, 0x0, - 0x0, 0x0, 0x2, 0x90, 0x6, 0x20, 0x0, 0x0, - 0x0, 0x7f, 0x50, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, - - /* U+5225 "別" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x85, 0x55, 0x59, 0x0, 0x0, 0xc0, 0x0, 0xb0, - 0x0, 0x1a, 0x0, 0x0, 0xb0, 0x0, 0xb0, 0x0, - 0x1a, 0xa, 0x0, 0xb0, 0x0, 0xd5, 0x55, 0x6a, - 0xb, 0x0, 0xb0, 0x0, 0x68, 0x10, 0x4, 0xb, - 0x0, 0xb0, 0x0, 0xd, 0x0, 0x0, 0xb, 0x0, - 0xb0, 0x0, 0xd, 0x55, 0x6a, 0xb, 0x0, 0xb0, - 0x0, 0x39, 0x0, 0x46, 0xb, 0x0, 0xb0, 0x0, - 0x75, 0x0, 0x74, 0xa, 0x0, 0xb0, 0x0, 0xb0, - 0x0, 0xa1, 0x0, 0x0, 0xb0, 0x4, 0x50, 0x22, - 0xc0, 0x0, 0x12, 0xb0, 0x7, 0x0, 0x1d, 0x50, - 0x0, 0x5e, 0x70, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+5229 "利" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x4, 0x0, 0x2, - 0x59, 0xba, 0x40, 0x0, 0xb3, 0x3, 0x21, 0xc0, - 0x0, 0x6, 0xa, 0x10, 0x0, 0xc, 0x0, 0x0, - 0xb0, 0xa1, 0x25, 0x55, 0xd5, 0x6c, 0x1b, 0xa, - 0x10, 0x10, 0x1f, 0x0, 0x0, 0xb0, 0xa1, 0x0, - 0x7, 0xf5, 0x10, 0xb, 0xa, 0x10, 0x1, 0xac, - 0x1d, 0x40, 0xb0, 0xa1, 0x0, 0x91, 0xc0, 0x36, - 0xb, 0xa, 0x10, 0x62, 0xc, 0x0, 0x0, 0x90, - 0xa1, 0x31, 0x0, 0xc0, 0x0, 0x0, 0xa, 0x10, - 0x0, 0xc, 0x0, 0x0, 0x44, 0xd1, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5230 "到" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x4, - 0x55, 0x55, 0x6b, 0x0, 0x0, 0xd0, 0x1, 0x0, - 0xd2, 0x0, 0x5, 0x0, 0xb0, 0x0, 0x8, 0x42, - 0x10, 0xc, 0x10, 0xb0, 0x0, 0x53, 0x0, 0x93, - 0xb, 0x0, 0xb0, 0x6, 0xd8, 0xa6, 0x5e, 0xb, - 0x0, 0xb0, 0x0, 0x0, 0xc1, 0x5, 0xb, 0x0, - 0xb0, 0x0, 0x0, 0xc0, 0x2, 0xb, 0x0, 0xb0, - 0x4, 0x55, 0xd5, 0x67, 0xb, 0x0, 0xb0, 0x0, - 0x0, 0xc0, 0x0, 0xc, 0x0, 0xb0, 0x0, 0x0, - 0xc0, 0x14, 0x2, 0x0, 0xb0, 0x4, 0x68, 0xb7, - 0x40, 0x0, 0x1, 0xb0, 0xa, 0x72, 0x0, 0x0, - 0x1, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, - - /* U+5236 "制" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x3, 0x0, 0x0, - 0xb, 0x0, 0x0, 0x0, 0xb1, 0x3, 0xa0, 0xa0, - 0x0, 0x2, 0xb, 0x0, 0x87, 0x5c, 0x6a, 0x0, - 0xc0, 0xb0, 0x7, 0x0, 0xa0, 0x0, 0xa, 0xb, - 0x3, 0x65, 0x5c, 0x57, 0x80, 0xa0, 0xb0, 0x0, - 0x0, 0xa0, 0x10, 0xa, 0xb, 0x0, 0x95, 0x5c, - 0x5c, 0x20, 0xa0, 0xb0, 0x9, 0x10, 0xa0, 0xa0, - 0xa, 0xb, 0x0, 0x91, 0xa, 0xa, 0x0, 0xa0, - 0xb0, 0x9, 0x10, 0xb5, 0xc0, 0x0, 0xb, 0x0, - 0x60, 0xa, 0x26, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0xa0, 0x0, 0x3, 0xad, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x10, - - /* U+5238 "券" */ - 0x0, 0x0, 0x0, 0x60, 0x1, 0x0, 0x0, 0x0, - 0x1a, 0x10, 0xe1, 0xc, 0x20, 0x0, 0x0, 0x5, - 0x92, 0xa0, 0x63, 0x0, 0x0, 0x2, 0x55, 0x69, - 0x95, 0x75, 0xa8, 0x0, 0x0, 0x10, 0xb, 0x10, - 0x0, 0x0, 0x0, 0x15, 0x55, 0x5d, 0x55, 0x55, - 0x5b, 0x80, 0x1, 0x0, 0xa2, 0x0, 0x52, 0x0, - 0x0, 0x0, 0x8, 0x40, 0x0, 0x9, 0x71, 0x0, - 0x1, 0x84, 0x5b, 0x55, 0x5e, 0x7e, 0xb2, 0x14, - 0x0, 0xc, 0x0, 0xc, 0x0, 0x20, 0x0, 0x0, - 0x66, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x3, 0xa0, - 0x0, 0x48, 0x0, 0x0, 0x1, 0x67, 0x0, 0x18, - 0xf3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+523B "刻" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x1, 0xb0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x81, 0x5, 0x2, 0x0, 0xb0, 0x16, 0x57, 0xc5, - 0x56, 0x2a, 0x40, 0xb0, 0x0, 0xa, 0x30, 0x50, - 0x9, 0x20, 0xb0, 0x0, 0x64, 0x4, 0xb1, 0x9, - 0x20, 0xb0, 0x3, 0xd6, 0x5c, 0x11, 0x9, 0x20, - 0xb0, 0x0, 0x0, 0xa3, 0x6c, 0x9, 0x20, 0xb0, - 0x0, 0x9, 0x31, 0xc1, 0x9, 0x20, 0xb0, 0x2, - 0x81, 0xc, 0x20, 0x9, 0x20, 0xb0, 0x23, 0x1, - 0xa4, 0xa1, 0x1, 0x0, 0xb0, 0x0, 0x49, 0x10, - 0x5a, 0x0, 0x1, 0xa0, 0x16, 0x30, 0x0, 0x3, - 0x0, 0x6d, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, - - /* U+5247 "則" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x95, 0x55, 0xa2, 0x0, 0x0, 0xd0, 0x0, 0xb0, - 0x0, 0xb0, 0x1, 0x0, 0xb0, 0x0, 0xc5, 0x55, - 0xc0, 0xd, 0x0, 0xb0, 0x0, 0xb0, 0x0, 0xb0, - 0xb, 0x0, 0xb0, 0x0, 0xc5, 0x55, 0xc0, 0xb, - 0x0, 0xb0, 0x0, 0xb0, 0x0, 0xb0, 0xb, 0x0, - 0xb0, 0x0, 0xb0, 0x0, 0xb0, 0xb, 0x0, 0xb0, - 0x0, 0xc5, 0x55, 0xc0, 0xb, 0x0, 0xb0, 0x0, - 0x53, 0x2, 0x40, 0x8, 0x0, 0xb0, 0x0, 0x4b, - 0x7, 0x50, 0x0, 0x0, 0xb0, 0x0, 0x90, 0x0, - 0xc4, 0x0, 0x0, 0xb0, 0x6, 0x0, 0x0, 0x38, - 0x0, 0x6e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, - - /* U+524A "削" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0xc2, 0x6, 0x0, 0x0, 0xc0, 0x1b, 0xb, 0x3, - 0xa0, 0x0, 0xb, 0x0, 0x84, 0xb0, 0x70, 0xa, - 0x10, 0xb0, 0x8, 0x5d, 0x65, 0x90, 0xb0, 0xb, - 0x0, 0xb0, 0x0, 0xc, 0xb, 0x0, 0xb0, 0xd, - 0x55, 0x55, 0xc0, 0xb0, 0xb, 0x0, 0xb0, 0x0, - 0xc, 0xb, 0x0, 0xb0, 0xb, 0x0, 0x0, 0xc0, - 0xb0, 0xb, 0x0, 0xd5, 0x55, 0x5c, 0xc, 0x0, - 0xb0, 0xb, 0x0, 0x0, 0xc0, 0x60, 0xb, 0x0, - 0xb0, 0x1, 0x2c, 0x0, 0x12, 0xa0, 0x1b, 0x0, - 0x3d, 0x70, 0x5, 0xe7, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x1, 0x0, - - /* U+524D "前" */ - 0x0, 0x0, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x85, 0x0, 0x3e, 0x20, 0x0, 0x0, 0x0, - 0x1c, 0x0, 0x91, 0x0, 0x40, 0x6, 0x55, 0x55, - 0x55, 0x65, 0x56, 0x92, 0x0, 0x30, 0x3, 0x10, - 0x0, 0x19, 0x0, 0x0, 0xb5, 0x5b, 0x30, 0xa2, - 0x1a, 0x0, 0x0, 0xb0, 0x9, 0x10, 0xb0, 0x1a, - 0x0, 0x0, 0xb5, 0x5b, 0x10, 0xb0, 0x1a, 0x0, - 0x0, 0xb0, 0x9, 0x10, 0xb0, 0x1a, 0x0, 0x0, - 0xb5, 0x5b, 0x10, 0xb0, 0x1a, 0x0, 0x0, 0xb0, - 0x9, 0x10, 0xb0, 0x1a, 0x0, 0x0, 0xb0, 0x9, - 0x10, 0x11, 0x3a, 0x0, 0x0, 0xb0, 0x6d, 0x0, - 0x6, 0xf5, 0x0, 0x0, 0x10, 0x1, 0x0, 0x0, - 0x10, 0x0, - - /* U+525B "剛" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa, 0x55, - 0x55, 0x5c, 0x20, 0x0, 0xc0, 0xb1, 0x40, 0x61, - 0xb0, 0x10, 0xb, 0xb, 0xa, 0x1a, 0xb, 0xa, - 0x10, 0xb0, 0xb2, 0x66, 0x76, 0xb0, 0xa0, 0xb, - 0xb, 0x12, 0xa1, 0x1b, 0xa, 0x0, 0xb0, 0xb1, - 0x19, 0x22, 0xb0, 0xa0, 0xb, 0xb, 0x55, 0x94, - 0x5b, 0xa, 0x0, 0xb0, 0xb5, 0x49, 0x45, 0xb0, - 0xa0, 0xb, 0xb, 0x68, 0xa8, 0x5b, 0x8, 0x0, - 0xb0, 0xb0, 0x0, 0x11, 0xb0, 0x0, 0xb, 0xb, - 0x0, 0x0, 0xb, 0x0, 0x2, 0xa0, 0xa0, 0x0, - 0x2a, 0xd0, 0x27, 0xe7, 0x0, 0x0, 0x0, 0x11, - 0x0, 0x1, 0x0, - - /* U+5272 "割" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xb0, 0x0, 0x0, 0x0, 0xc0, 0x6, 0x55, - 0x75, 0x5a, 0x21, 0x0, 0xb0, 0x1b, 0x0, 0xb1, - 0x4, 0xb, 0x30, 0xb0, 0x3, 0x55, 0xc5, 0x67, - 0xa, 0x0, 0xb0, 0x0, 0x0, 0xb0, 0x0, 0xa, - 0x0, 0xb0, 0x1, 0x55, 0xc5, 0x73, 0xa, 0x0, - 0xb0, 0x0, 0x0, 0xb0, 0x4, 0x2a, 0x0, 0xb0, - 0x6, 0x55, 0xd5, 0x55, 0x3b, 0x0, 0xb0, 0x0, - 0x95, 0x65, 0xa1, 0xa, 0x10, 0xb0, 0x0, 0xb0, - 0x0, 0xb0, 0x0, 0x0, 0xb0, 0x0, 0xb0, 0x0, - 0xb0, 0x0, 0x0, 0xb0, 0x0, 0xd5, 0x55, 0xc0, - 0x0, 0x6c, 0xa0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x2, 0x0, - - /* U+5275 "創" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0xd5, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x6, - 0x73, 0xa3, 0x0, 0x0, 0xa0, 0x0, 0x29, 0x45, - 0x1c, 0xb, 0x0, 0xa0, 0x1, 0x80, 0xa, 0x1, - 0xa, 0x0, 0xa0, 0x15, 0x86, 0x55, 0x5a, 0xa, - 0x0, 0xa0, 0x0, 0x86, 0x55, 0x59, 0xa, 0x0, - 0xa0, 0x0, 0x82, 0x0, 0x9, 0xa, 0x0, 0xa0, - 0x0, 0x96, 0x55, 0x58, 0xb, 0x0, 0xa0, 0x0, - 0xb7, 0x55, 0x57, 0x6, 0x0, 0xa0, 0x1, 0xa9, - 0x0, 0xa, 0x0, 0x0, 0xa0, 0x6, 0x39, 0x0, - 0xa, 0x0, 0x0, 0xa0, 0x15, 0x1b, 0x55, 0x5a, - 0x1, 0x7d, 0x70, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+5283 "劃" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0xa2, 0x2, 0x0, 0x0, 0xc0, 0x0, 0x55, - 0xb5, 0x5c, 0x0, 0x0, 0xa0, 0x6, 0x55, 0xb5, - 0x5c, 0x92, 0x90, 0xa0, 0x0, 0x33, 0xb4, 0x3b, - 0x0, 0xa0, 0xa0, 0x0, 0x22, 0xa2, 0x35, 0x0, - 0xa0, 0xa0, 0x0, 0x55, 0xb5, 0x54, 0x40, 0xa0, - 0xa0, 0x5, 0x75, 0x55, 0x57, 0x51, 0xa0, 0xa0, - 0x0, 0xc5, 0xc5, 0x5c, 0x0, 0xa0, 0xa0, 0x0, - 0xc5, 0xc5, 0x5a, 0x0, 0x60, 0xa0, 0x0, 0xc5, - 0xc5, 0x5a, 0x0, 0x0, 0xa0, 0x0, 0x40, 0x0, - 0x27, 0x20, 0x11, 0xb0, 0x7, 0xb9, 0x75, 0x31, - 0x0, 0x4d, 0x80, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+529B "力" */ - 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x10, - 0x0, 0x10, 0x1, 0x75, 0x55, 0xd5, 0x55, 0x5d, - 0x40, 0x0, 0x0, 0xc, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x3, 0x90, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x84, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x1c, 0x0, - 0x0, 0x2b, 0x0, 0x0, 0x9, 0x40, 0x0, 0x4, - 0xa0, 0x0, 0x4, 0x80, 0x0, 0x0, 0x67, 0x0, - 0x4, 0x80, 0x0, 0x36, 0x4d, 0x30, 0x5, 0x50, - 0x0, 0x0, 0x4f, 0x80, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, - - /* U+529F "功" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x4, - 0x0, 0xa1, 0x0, 0x0, 0x65, 0xc5, 0x52, 0xa, - 0x0, 0x0, 0x0, 0xa, 0x0, 0x55, 0xc5, 0x5a, - 0x50, 0x0, 0xa0, 0x0, 0xb, 0x0, 0x92, 0x0, - 0xa, 0x0, 0x0, 0xb0, 0xa, 0x10, 0x0, 0xa0, - 0x0, 0x1a, 0x0, 0xb0, 0x0, 0xa, 0x3, 0x25, - 0x60, 0xc, 0x0, 0x26, 0xc6, 0x10, 0xb0, 0x0, - 0xc0, 0x2c, 0x50, 0x0, 0x65, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x47, 0x4, 0x23, 0xb0, 0x0, 0x0, - 0x54, 0x0, 0x18, 0xf4, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x1, 0x0, - - /* U+52A0 "加" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5d, 0x55, - 0x91, 0xb5, 0x55, 0xc0, 0x0, 0xb, 0x0, 0xb0, - 0xb0, 0x0, 0xb0, 0x0, 0xc, 0x0, 0xb0, 0xb0, - 0x0, 0xb0, 0x0, 0xc, 0x0, 0xb0, 0xb0, 0x0, - 0xb0, 0x0, 0xb, 0x0, 0xa0, 0xb0, 0x0, 0xb0, - 0x0, 0x29, 0x1, 0x90, 0xb0, 0x0, 0xb0, 0x0, - 0x64, 0x2, 0x80, 0xb0, 0x0, 0xb0, 0x0, 0xa0, - 0x5, 0x60, 0xb0, 0x0, 0xb0, 0x5, 0x44, 0x7c, - 0x30, 0xc5, 0x55, 0xb0, 0x15, 0x0, 0x66, 0x0, - 0xb0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+52A8 "动" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x3, 0x65, - 0x5a, 0x50, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x0, 0x10, 0x0, 0x0, 0x0, 0x15, - 0x5c, 0x55, 0xd0, 0x5, 0x57, 0x65, 0x92, 0xb, - 0x0, 0xb0, 0x0, 0xb, 0x60, 0x0, 0x19, 0x0, - 0xb0, 0x0, 0x29, 0x2, 0x0, 0x46, 0x0, 0xb0, - 0x0, 0x80, 0x8, 0x20, 0x82, 0x1, 0xa0, 0x5, - 0x32, 0x36, 0xd0, 0xa0, 0x1, 0xa0, 0xd, 0xb6, - 0x20, 0x96, 0x30, 0x3, 0x90, 0x0, 0x0, 0x0, - 0x36, 0x3, 0x17, 0x60, 0x0, 0x0, 0x4, 0x40, - 0x2, 0xcd, 0x10, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+52A9 "助" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x30, 0x4, 0x0, 0xe, 0x0, 0x0, 0x0, 0xd5, - 0x5c, 0x20, 0xc, 0x0, 0x0, 0x0, 0xb0, 0xb, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xb0, 0xb, 0x26, - 0x5d, 0x55, 0xc0, 0x0, 0xc5, 0x5c, 0x0, 0xc, - 0x0, 0xb0, 0x0, 0xb0, 0xb, 0x0, 0xc, 0x0, - 0xb0, 0x0, 0xc5, 0x5c, 0x0, 0x2a, 0x0, 0xb0, - 0x0, 0xb0, 0xb, 0x0, 0x56, 0x0, 0xb0, 0x0, - 0xb0, 0xb, 0x0, 0xb1, 0x0, 0xb0, 0x0, 0xb4, - 0x78, 0x46, 0x60, 0x2, 0x90, 0x1d, 0xa4, 0x0, - 0x36, 0x3, 0x59, 0x60, 0x1, 0x0, 0x5, 0x40, - 0x0, 0x5a, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+52AA "努" */ - 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x50, 0x1, 0x11, 0x14, 0x0, 0x5, 0x5c, - 0x57, 0x67, 0x44, 0x6d, 0x10, 0x1, 0x28, 0x9, - 0x30, 0x60, 0x93, 0x0, 0x0, 0x92, 0xb, 0x0, - 0x58, 0x80, 0x0, 0x0, 0x16, 0xca, 0x10, 0x2d, - 0x80, 0x0, 0x0, 0x18, 0x44, 0x76, 0x70, 0x5c, - 0x82, 0x14, 0x50, 0x1, 0xa4, 0x0, 0x0, 0x20, - 0x0, 0x35, 0x55, 0xc8, 0x55, 0x75, 0x0, 0x0, - 0x10, 0x1, 0xc0, 0x0, 0x85, 0x0, 0x0, 0x0, - 0x9, 0x50, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x87, - 0x1, 0x31, 0xd0, 0x0, 0x2, 0x57, 0x20, 0x0, - 0x6f, 0x60, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+52B3 "劳" */ - 0x0, 0x0, 0x40, 0x0, 0x30, 0x0, 0x0, 0x0, - 0xc, 0x0, 0xd, 0x0, 0x0, 0x35, 0x55, 0xc5, - 0x55, 0xc5, 0x6d, 0x20, 0x0, 0xb, 0x0, 0xb, - 0x0, 0x0, 0x2, 0x0, 0x60, 0x0, 0x50, 0x2, - 0x0, 0x95, 0x55, 0x65, 0x55, 0x56, 0xe1, 0x3b, - 0x0, 0xb, 0x40, 0x0, 0x51, 0x0, 0x0, 0x0, - 0xc1, 0x0, 0x21, 0x0, 0x4, 0x65, 0x5e, 0x55, - 0x5b, 0x60, 0x0, 0x0, 0x2, 0xb0, 0x0, 0xa2, - 0x0, 0x0, 0x0, 0xa4, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x78, 0x1, 0x1, 0xd0, 0x0, 0x3, 0x84, - 0x0, 0x7, 0xf7, 0x0, 0x3, 0x20, 0x0, 0x0, - 0x2, 0x0, 0x0, - - /* U+52C9 "勉" */ - 0x0, 0x4, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x2c, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x97, - 0x5d, 0x20, 0xa, 0x0, 0x0, 0x2, 0x80, 0x35, - 0x0, 0xa, 0x2, 0x0, 0x7, 0xa5, 0xa5, 0xb5, - 0x5c, 0x5a, 0x40, 0x10, 0xb0, 0xb0, 0xa0, 0xa, - 0x8, 0x10, 0x0, 0xb0, 0xb0, 0xa0, 0xa, 0x8, - 0x10, 0x0, 0xc5, 0xd8, 0xc0, 0x46, 0x9, 0x10, - 0x0, 0x23, 0x98, 0x10, 0x91, 0xa, 0x0, 0x0, - 0x8, 0x48, 0x2, 0x81, 0x1b, 0x0, 0x0, 0x19, - 0x28, 0x7, 0x0, 0xa7, 0x40, 0x0, 0x81, 0x18, - 0x30, 0x0, 0x0, 0x80, 0x6, 0x20, 0xb, 0x88, - 0x88, 0x8a, 0xa0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+52D5 "動" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x6b, 0x80, 0xc, 0x10, 0x0, 0x3, 0x4b, - 0x30, 0x0, 0xc, 0x0, 0x0, 0x26, 0x5b, 0x65, - 0xa2, 0xb, 0x0, 0x30, 0x1, 0x9, 0x10, 0x24, - 0x6c, 0x55, 0xd0, 0xb, 0x5b, 0x65, 0xc0, 0xb, - 0x0, 0xb0, 0xa, 0x5b, 0x65, 0xa0, 0xb, 0x0, - 0xa0, 0xa, 0x9, 0x10, 0xa0, 0x19, 0x0, 0xa0, - 0xa, 0x5b, 0x65, 0x90, 0x55, 0x0, 0xa0, 0x0, - 0x9, 0x10, 0x40, 0xa0, 0x2, 0x80, 0x6, 0x5b, - 0x65, 0x52, 0x80, 0x4, 0x60, 0x0, 0x1a, 0x65, - 0x48, 0x3, 0x1a, 0x30, 0x1d, 0x94, 0x0, 0x52, - 0x2, 0xca, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x10, 0x0, - - /* U+52D9 "務" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x44, 0x46, 0x10, 0xd1, 0x0, 0x0, 0x1, 0x20, - 0x2a, 0x45, 0xa5, 0x5d, 0x20, 0x0, 0x19, 0x70, - 0x7, 0x60, 0x38, 0x0, 0x0, 0x1, 0xd0, 0x20, - 0x28, 0xb0, 0x0, 0x5, 0x57, 0x97, 0x70, 0x1a, - 0xb1, 0x0, 0x0, 0xc, 0xa5, 0x14, 0x91, 0x2c, - 0xa4, 0x0, 0x29, 0xa1, 0x63, 0x76, 0x0, 0x40, - 0x0, 0x92, 0xa0, 0x46, 0xc6, 0x5c, 0x30, 0x3, - 0x51, 0xa0, 0x0, 0xb0, 0xb, 0x0, 0x5, 0x1, - 0xa0, 0x5, 0x60, 0xb, 0x0, 0x0, 0x23, 0xa0, - 0x29, 0x0, 0x1b, 0x0, 0x0, 0x4d, 0x63, 0x60, - 0x7, 0xe6, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x10, 0x0, - - /* U+52DD "勝" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x8, - 0x55, 0xb0, 0x81, 0xc1, 0x76, 0x0, 0x9, 0x10, - 0xa0, 0x3a, 0xb2, 0x70, 0x0, 0x9, 0x10, 0xa2, - 0x57, 0xc6, 0x78, 0x0, 0x9, 0x65, 0xa0, 0x12, - 0x80, 0x2, 0x0, 0x9, 0x10, 0xb6, 0x5a, 0x77, - 0x58, 0x50, 0x9, 0x10, 0xa0, 0x2a, 0x25, 0x30, - 0x0, 0x9, 0x65, 0xa1, 0x83, 0xa0, 0x7b, 0x60, - 0xa, 0x0, 0xb6, 0x77, 0xa5, 0x95, 0x30, 0xa, - 0x0, 0xa0, 0x7, 0x20, 0xa0, 0x0, 0x9, 0x0, - 0xa0, 0xa, 0x0, 0xa0, 0x0, 0x15, 0x0, 0xa0, - 0x82, 0x0, 0xb0, 0x0, 0x40, 0x3c, 0x66, 0x20, - 0x5c, 0x80, 0x0, 0x10, 0x1, 0x10, 0x0, 0x2, - 0x0, 0x0, - - /* U+52E4 "勤" */ - 0x0, 0x12, 0x3, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x38, 0x8, 0x13, 0xa, 0x30, 0x0, 0x6, 0x7a, - 0x5b, 0x67, 0xa, 0x0, 0x0, 0x0, 0x3a, 0x5b, - 0x0, 0xb, 0x0, 0x0, 0x0, 0x22, 0xa2, 0x22, - 0x6c, 0x55, 0xc2, 0x1, 0xb5, 0xc5, 0xb3, 0xb, - 0x0, 0xb0, 0x1, 0xa0, 0xa0, 0x91, 0xb, 0x0, - 0xb0, 0x1, 0xa5, 0xc5, 0x91, 0xb, 0x0, 0xb0, - 0x2, 0x65, 0xc5, 0x86, 0xa, 0x0, 0xb0, 0x0, - 0x0, 0xa0, 0x40, 0x47, 0x0, 0xb0, 0x0, 0x65, - 0xc5, 0x52, 0x91, 0x0, 0xc0, 0x0, 0x2, 0xb5, - 0x47, 0x63, 0x36, 0xa0, 0xb, 0xa6, 0x30, 0x35, - 0x0, 0x7d, 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+52F5 "勵" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x6, - 0x55, 0x55, 0x5a, 0xb, 0x20, 0x0, 0x9, 0x0, - 0x60, 0x60, 0xa, 0x0, 0x0, 0x9, 0x56, 0xa5, - 0xb7, 0xa, 0x0, 0x10, 0x8, 0x0, 0x30, 0x42, - 0x6c, 0x55, 0xb2, 0x8, 0xb, 0x59, 0x75, 0xa, - 0x0, 0xa0, 0x9, 0xc, 0x5a, 0x74, 0xa, 0x0, - 0xa0, 0x9, 0xc, 0x5a, 0x74, 0xa, 0x0, 0xa0, - 0x9, 0x2, 0x17, 0x11, 0x9, 0x0, 0xa0, 0x8, - 0x77, 0x5a, 0x5a, 0x46, 0x0, 0xa0, 0x7, 0x74, - 0x3a, 0x59, 0x81, 0x0, 0xa0, 0x32, 0x75, 0x61, - 0x59, 0x81, 0x14, 0x80, 0x20, 0x73, 0x0, 0x8b, - 0x10, 0x7d, 0x10, 0x0, 0x10, 0x0, 0x1, 0x0, - 0x0, 0x0, - - /* U+5305 "包" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x90, 0x0, 0x0, 0x30, 0x0, 0x0, 0xc, 0x55, - 0x55, 0x55, 0xc4, 0x0, 0x0, 0x84, 0x0, 0x1, - 0x0, 0xa1, 0x0, 0x4, 0x6c, 0x55, 0x5c, 0x30, - 0xb0, 0x0, 0x25, 0xb, 0x0, 0xb, 0x0, 0xb0, - 0x0, 0x0, 0xb, 0x0, 0xb, 0x0, 0xc0, 0x0, - 0x0, 0xb, 0x55, 0x5b, 0x20, 0xc0, 0x0, 0x0, - 0xb, 0x0, 0x0, 0x4a, 0xa0, 0x30, 0x0, 0xb, - 0x0, 0x0, 0x3, 0x0, 0x60, 0x0, 0xb, 0x0, - 0x0, 0x0, 0x1, 0xc0, 0x0, 0x5, 0xba, 0xaa, - 0xaa, 0xbd, 0xb1, - - /* U+5316 "化" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x6, - 0x80, 0xa, 0x10, 0x0, 0x0, 0x0, 0xc, 0x10, - 0xa, 0x10, 0x12, 0x0, 0x0, 0x4b, 0x0, 0xa, - 0x10, 0xa8, 0x0, 0x0, 0xbd, 0x0, 0xa, 0x17, - 0x80, 0x0, 0x4, 0x4c, 0x0, 0xa, 0x79, 0x0, - 0x0, 0x6, 0xc, 0x0, 0xb, 0x80, 0x0, 0x0, - 0x10, 0xc, 0x0, 0x8d, 0x10, 0x0, 0x0, 0x0, - 0xc, 0x26, 0x1a, 0x10, 0x0, 0x30, 0x0, 0xc, - 0x10, 0xa, 0x10, 0x0, 0x60, 0x0, 0xc, 0x0, - 0xa, 0x20, 0x1, 0xb0, 0x0, 0xd, 0x0, 0x6, - 0xdb, 0xbc, 0xa0, 0x0, 0x5, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5317 "北" */ - 0x0, 0x0, 0x2, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x0, 0xc0, 0x0, 0x20, 0x3, 0x55, 0x5c, 0x0, - 0xc0, 0xb, 0xa0, 0x0, 0x0, 0xc, 0x0, 0xc3, - 0x83, 0x0, 0x0, 0x0, 0xc, 0x0, 0xc3, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0xc0, 0x0, 0x40, 0x1, 0x58, - 0x5c, 0x0, 0xc0, 0x0, 0x60, 0xa, 0x60, 0xc, - 0x0, 0xc0, 0x0, 0xb1, 0x0, 0x0, 0xc, 0x0, - 0x9c, 0xbc, 0xd3, 0x0, 0x0, 0x4, 0x0, 0x0, - 0x0, 0x0, - - /* U+533B "医" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0x55, 0x55, 0x55, 0x55, 0x7c, 0x10, 0xb, 0x10, - 0xa, 0x10, 0x0, 0x0, 0x0, 0xb, 0x10, 0x1b, - 0x0, 0x0, 0x20, 0x0, 0xb, 0x10, 0x78, 0x59, - 0x57, 0x80, 0x0, 0xb, 0x10, 0x80, 0xb, 0x0, - 0x0, 0x0, 0xb, 0x14, 0x0, 0x1a, 0x0, 0x3, - 0x0, 0xb, 0x26, 0x55, 0x7b, 0x55, 0x58, 0x30, - 0xb, 0x10, 0x0, 0x79, 0x10, 0x0, 0x0, 0xb, - 0x10, 0x2, 0xb0, 0x7a, 0x30, 0x0, 0xb, 0x10, - 0x39, 0x0, 0x3, 0xe3, 0x0, 0xb, 0x15, 0x40, - 0x0, 0x0, 0x36, 0x10, 0xb, 0x55, 0x55, 0x55, - 0x55, 0x58, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5340 "區" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x85, 0x55, - 0x55, 0x55, 0x58, 0x80, 0x92, 0x1, 0x0, 0x0, - 0x30, 0x0, 0x92, 0x5, 0x95, 0x55, 0xc0, 0x0, - 0x92, 0x5, 0x60, 0x0, 0xa0, 0x0, 0x92, 0x5, - 0x95, 0x55, 0xa0, 0x0, 0x92, 0x1, 0x10, 0x0, - 0x20, 0x0, 0x92, 0x85, 0x58, 0x85, 0x5a, 0x10, - 0x92, 0xa0, 0x19, 0xa0, 0xa, 0x0, 0x92, 0xa0, - 0x19, 0xa0, 0xa, 0x0, 0x92, 0xb5, 0x69, 0xa5, - 0x5c, 0x0, 0x92, 0x30, 0x1, 0x20, 0x1, 0x0, - 0xa6, 0x55, 0x55, 0x55, 0x55, 0xe3, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+5341 "十" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb1, - 0x0, 0x0, 0x0, 0x25, 0x55, 0x55, 0xc6, 0x55, - 0x5a, 0x90, 0x1, 0x0, 0x0, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5343 "千" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x25, 0x9e, 0xa0, 0x0, 0x0, 0x45, - 0x67, 0xd6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, - 0x5, 0x40, 0x36, 0x55, 0x55, 0xc7, 0x55, 0x55, - 0x50, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+5348 "午" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x80, 0x0, 0x0, 0x62, 0x0, 0x0, 0xb, 0x55, - 0x6b, 0x55, 0x54, 0x0, 0x0, 0x73, 0x0, 0x2a, - 0x0, 0x0, 0x0, 0x3, 0x40, 0x0, 0x2a, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, - 0x40, 0x6, 0x55, 0x55, 0x6c, 0x55, 0x56, 0x81, - 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x0, - - /* U+534A "半" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc2, 0x0, 0x20, 0x0, 0x0, 0x26, - 0x0, 0xc0, 0x5, 0xd1, 0x0, 0x0, 0x6, 0xb0, - 0xc0, 0xa, 0x10, 0x0, 0x0, 0x0, 0xb0, 0xc0, - 0x60, 0x0, 0x0, 0x2, 0x55, 0x55, 0xd5, 0x55, - 0x8a, 0x0, 0x0, 0x10, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0x16, 0x55, 0x55, 0xd5, 0x55, 0x5a, 0x90, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+5352 "卒" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3a, 0x0, 0x1, 0x0, 0x0, 0x65, - 0x55, 0x59, 0x55, 0x6b, 0x20, 0x0, 0x0, 0x86, - 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x77, 0x0, 0x0, 0x0, 0x6, 0x6a, 0x11, 0xa6, - 0x60, 0x0, 0x0, 0x18, 0x5, 0x78, 0x10, 0xa6, - 0x0, 0x0, 0x50, 0x0, 0x5a, 0x0, 0x13, 0x0, - 0x4, 0x55, 0x55, 0x5d, 0x55, 0x56, 0xd2, 0x1, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+5354 "協" */ - 0x0, 0x10, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0xa3, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xa1, - 0x3, 0x67, 0xa5, 0x5b, 0x20, 0x0, 0xa1, 0x0, - 0x9, 0x20, 0xa, 0x0, 0x26, 0xc5, 0x91, 0x56, - 0x0, 0x37, 0x0, 0x0, 0xa1, 0x15, 0x40, 0x18, - 0xc1, 0x0, 0x0, 0xa1, 0x24, 0x30, 0x0, 0x60, - 0x0, 0x0, 0xa1, 0x6a, 0x96, 0x75, 0xd5, 0x90, - 0x0, 0xa1, 0x9, 0x14, 0x50, 0xa0, 0x90, 0x0, - 0xa1, 0xa, 0x6, 0x32, 0x90, 0xa0, 0x0, 0xa1, - 0x27, 0x8, 0x17, 0x40, 0xa0, 0x0, 0xa1, 0x72, - 0x3b, 0x9, 0x0, 0xa0, 0x0, 0xa5, 0x30, 0x76, - 0x70, 0x5b, 0x60, 0x0, 0x21, 0x0, 0x2, 0x0, - 0x3, 0x0, - - /* U+5357 "南" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x5, 0x55, - 0x55, 0xc6, 0x55, 0x5a, 0xc0, 0x1, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x75, 0x55, 0xd5, - 0x55, 0x59, 0x10, 0x0, 0xb0, 0x22, 0x0, 0x91, - 0xb, 0x0, 0x0, 0xb0, 0xc, 0x14, 0x80, 0xb, - 0x0, 0x0, 0xb0, 0x58, 0x5a, 0x5b, 0x1b, 0x0, - 0x0, 0xb0, 0x10, 0xa1, 0x0, 0xb, 0x0, 0x0, - 0xb4, 0x65, 0xc5, 0x59, 0x4b, 0x0, 0x0, 0xb0, - 0x0, 0xa1, 0x0, 0xb, 0x0, 0x0, 0xb0, 0x0, - 0xa1, 0x13, 0x2c, 0x0, 0x0, 0xb0, 0x0, 0x70, - 0x4, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+5358 "単" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x50, 0xa1, 0x4, 0xc0, 0x0, 0x0, 0x0, - 0xb5, 0x68, 0xa, 0x20, 0x0, 0x0, 0x2, 0x23, - 0x12, 0x43, 0x30, 0x0, 0x0, 0xc, 0x55, 0xb6, - 0x55, 0xc2, 0x0, 0x0, 0xb, 0x0, 0x91, 0x0, - 0xb0, 0x0, 0x0, 0xc, 0x55, 0xb6, 0x55, 0xc0, - 0x0, 0x0, 0xb, 0x0, 0x91, 0x0, 0xb0, 0x0, - 0x0, 0xb, 0x55, 0xb6, 0x55, 0xa0, 0x0, 0x4, - 0x55, 0x55, 0xb6, 0x55, 0x59, 0xc0, 0x1, 0x0, - 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x92, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5371 "危" */ - 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb5, 0x0, 0x3, 0x0, 0x0, 0x0, 0x5, - 0xa5, 0x55, 0xab, 0x0, 0x0, 0x0, 0x2a, 0x0, - 0x1, 0x80, 0x0, 0x0, 0x2, 0x89, 0x55, 0x58, - 0x55, 0x5a, 0x60, 0x3, 0xc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x9, 0x65, 0x55, 0xc0, - 0x0, 0x0, 0xc, 0x9, 0x20, 0x0, 0xa0, 0x0, - 0x0, 0xc, 0x9, 0x20, 0x0, 0xa0, 0x0, 0x0, - 0xb, 0x9, 0x20, 0x57, 0xa0, 0x20, 0x0, 0x47, - 0x9, 0x20, 0x7, 0x20, 0x60, 0x0, 0xa1, 0x9, - 0x20, 0x0, 0x0, 0xb0, 0x5, 0x30, 0x4, 0xca, - 0xaa, 0xab, 0xb1, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5373 "即" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x55, - 0xa4, 0x7, 0x55, 0x93, 0xb, 0x0, 0x92, 0xb, - 0x0, 0xa1, 0xb, 0x0, 0x92, 0xb, 0x0, 0xa1, - 0xc, 0x55, 0xb2, 0xb, 0x0, 0xa1, 0xb, 0x0, - 0x92, 0xb, 0x0, 0xa1, 0xc, 0x55, 0xb2, 0xb, - 0x0, 0xa1, 0xb, 0x1, 0x30, 0xb, 0x0, 0xa1, - 0xb, 0x5, 0x60, 0xb, 0x0, 0xa1, 0xb, 0x0, - 0xc7, 0xb, 0x27, 0xc0, 0x1d, 0x86, 0x1b, 0xb, - 0x3, 0x50, 0x6, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, - - /* U+537B "卻" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4a, 0x4, 0x80, 0x20, 0x0, 0x20, 0x1, 0xa1, - 0x0, 0x79, 0xc5, 0x55, 0xd0, 0x15, 0x1, 0x90, - 0x4, 0xb0, 0x0, 0xb0, 0x0, 0x9, 0x85, 0x0, - 0xb0, 0x0, 0xb0, 0x0, 0x47, 0x5, 0xb0, 0xb0, - 0x0, 0xb0, 0x2, 0x80, 0x0, 0x77, 0xb0, 0x0, - 0xb0, 0x16, 0x75, 0x55, 0xa2, 0xb0, 0x0, 0xb0, - 0x10, 0xb0, 0x0, 0xb0, 0xb0, 0x0, 0xb0, 0x0, - 0xb0, 0x0, 0xb0, 0xb1, 0x54, 0xb0, 0x0, 0xb0, - 0x0, 0xb0, 0xb0, 0x1a, 0x40, 0x0, 0xb5, 0x55, - 0xb0, 0xb0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x40, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+539A "厚" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x95, 0x55, 0x55, 0x55, 0x5a, 0x50, 0x0, 0xa1, - 0x7, 0x55, 0x55, 0x80, 0x0, 0x0, 0xa1, 0xb, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0xa1, 0xc, 0x55, - 0x55, 0xc0, 0x0, 0x0, 0xa1, 0xc, 0x55, 0x55, - 0xc0, 0x0, 0x0, 0xa0, 0x6, 0x0, 0x0, 0x60, - 0x0, 0x0, 0xb0, 0x56, 0x55, 0x57, 0xd2, 0x0, - 0x0, 0xb0, 0x0, 0x1, 0x75, 0x0, 0x0, 0x0, - 0xb4, 0x65, 0x55, 0xc5, 0x58, 0x80, 0x3, 0x70, - 0x0, 0x1, 0xa0, 0x0, 0x0, 0x7, 0x10, 0x0, - 0x11, 0xa0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x4e, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+539F "原" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x9, - 0x55, 0x55, 0x65, 0x58, 0x90, 0x0, 0xb1, 0x0, - 0x9, 0x30, 0x0, 0x0, 0xb, 0x11, 0x75, 0x95, - 0x59, 0x20, 0x0, 0xb1, 0x1a, 0x0, 0x0, 0x91, - 0x0, 0xb, 0x11, 0xc5, 0x55, 0x5b, 0x10, 0x0, - 0xb0, 0x1a, 0x0, 0x0, 0x91, 0x0, 0xb, 0x1, - 0xc5, 0x57, 0x5b, 0x20, 0x0, 0xb0, 0x3, 0x1, - 0xa0, 0x30, 0x0, 0xb, 0x0, 0x7a, 0x1a, 0x35, - 0x0, 0x2, 0x80, 0x5a, 0x1, 0xa0, 0x4c, 0x30, - 0x71, 0x65, 0x3, 0x5a, 0x0, 0x3c, 0x14, 0x11, - 0x0, 0x1b, 0x50, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+53B3 "厳" */ - 0x0, 0x1, 0x0, 0x10, 0x0, 0x10, 0x0, 0x0, - 0x2b, 0x4, 0x80, 0x67, 0x0, 0x0, 0x10, 0x80, - 0x8, 0x15, 0x6, 0x0, 0xc, 0x55, 0x55, 0x56, - 0x75, 0x73, 0x0, 0xc1, 0x77, 0x80, 0x59, 0x0, - 0x0, 0xc, 0x0, 0x72, 0x39, 0x10, 0x60, 0x0, - 0xc3, 0xc5, 0xc5, 0xc5, 0x99, 0x10, 0xc, 0xa, - 0x5c, 0x56, 0x8, 0x30, 0x0, 0xb0, 0xa0, 0xa0, - 0x33, 0xb0, 0x0, 0xa, 0xa, 0x5c, 0x0, 0x99, - 0x0, 0x2, 0x70, 0xb4, 0xc5, 0x1b, 0x60, 0x0, - 0x61, 0xa8, 0x3a, 0x5, 0x6b, 0x60, 0x6, 0x0, - 0x0, 0x94, 0x30, 0xb, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+53BB "去" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, - 0x8, 0x0, 0x0, 0x55, 0x55, 0xc7, 0x55, 0x52, - 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa2, 0x0, 0x8, 0x21, 0x65, 0x55, - 0x5e, 0x65, 0x55, 0x53, 0x0, 0x0, 0x7, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x90, 0x4, 0x10, - 0x0, 0x0, 0x2, 0x80, 0x0, 0xa, 0x50, 0x0, - 0x6, 0xc6, 0x66, 0x66, 0x5e, 0x60, 0x0, 0x49, - 0x53, 0x10, 0x0, 0x39, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+53C2 "参" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x73, 0x0, 0x28, 0x50, 0x0, 0x0, 0x4e, 0x88, - 0xa5, 0x54, 0xb6, 0x0, 0x0, 0x0, 0x8, 0x50, - 0x0, 0x3, 0x50, 0x5, 0x55, 0x7c, 0x55, 0x85, - 0x55, 0x60, 0x0, 0x1, 0xa1, 0x48, 0x47, 0x0, - 0x0, 0x0, 0x28, 0x5, 0xb2, 0x13, 0xb8, 0x30, - 0x5, 0x41, 0x75, 0x5, 0xd2, 0x6, 0x81, 0x0, - 0x34, 0x1, 0x87, 0x1, 0x80, 0x0, 0x0, 0x3, - 0x66, 0x10, 0x5c, 0x60, 0x0, 0x0, 0x22, 0x1, - 0x6a, 0x60, 0x0, 0x0, 0x1, 0x46, 0x68, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+53C3 "參" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x80, 0x51, 0x0, 0x0, 0x0, 0x1, - 0xa6, 0x54, 0x5d, 0x20, 0x0, 0x0, 0x6, 0x52, - 0x0, 0x8, 0x20, 0x0, 0x0, 0x66, 0x11, 0x0, - 0x86, 0x6, 0x0, 0x4, 0xb6, 0x49, 0xc8, 0x61, - 0x8, 0x40, 0x0, 0x0, 0xa, 0x66, 0x20, 0x1, - 0x0, 0x0, 0x4, 0x92, 0x3, 0x6a, 0x62, 0x10, - 0x4, 0x64, 0x3, 0xb8, 0x1, 0x8d, 0x91, 0x0, - 0x5, 0x75, 0x4, 0xc1, 0x0, 0x0, 0x0, 0x30, - 0x5, 0x97, 0x13, 0x10, 0x0, 0x0, 0x35, 0x52, - 0x4, 0xab, 0x60, 0x0, 0x1, 0x34, 0x55, 0x64, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+53C8 "又" */ - 0x0, 0x45, 0x55, 0x55, 0x55, 0x91, 0x0, 0x0, - 0x10, 0x40, 0x0, 0x1, 0xc0, 0x0, 0x0, 0x0, - 0x50, 0x0, 0x5, 0x70, 0x0, 0x0, 0x0, 0x50, - 0x0, 0xb, 0x10, 0x0, 0x0, 0x0, 0x15, 0x0, - 0x29, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x84, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8c, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xbb, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0x20, 0xa9, 0x10, 0x0, 0x0, 0x6, - 0x70, 0x0, 0x6, 0xea, 0x51, 0x4, 0x51, 0x0, - 0x0, 0x0, 0x18, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+53CA "及" */ - 0x0, 0x25, 0x56, 0x55, 0x59, 0x40, 0x0, 0x0, - 0x0, 0xc, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x1b, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x3b, - 0x0, 0x84, 0x0, 0x0, 0x0, 0x0, 0x68, 0x20, - 0xb5, 0x7c, 0x0, 0x0, 0x0, 0xa1, 0x60, 0x0, - 0x94, 0x0, 0x0, 0x0, 0xb0, 0x61, 0x2, 0xb0, - 0x0, 0x0, 0x6, 0x50, 0xa, 0xb, 0x20, 0x0, - 0x0, 0xb, 0x0, 0x5, 0xd5, 0x0, 0x0, 0x0, - 0x83, 0x0, 0x8, 0xb7, 0x0, 0x0, 0x4, 0x40, - 0x4, 0x93, 0x8, 0xc5, 0x0, 0x23, 0x15, 0x63, - 0x0, 0x0, 0x3b, 0xa0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+53CB "友" */ - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x2, 0x30, 0x6, 0x55, 0x5e, - 0x55, 0x55, 0x58, 0x80, 0x0, 0x0, 0x3a, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, - 0x40, 0x0, 0x0, 0x0, 0xa7, 0x75, 0x57, 0xd0, - 0x0, 0x0, 0x1, 0xc0, 0x60, 0x9, 0x50, 0x0, - 0x0, 0x6, 0x60, 0x53, 0x1c, 0x0, 0x0, 0x0, - 0xb, 0x0, 0x9, 0xb4, 0x0, 0x0, 0x0, 0x74, - 0x0, 0x9, 0xe4, 0x0, 0x0, 0x2, 0x70, 0x1, - 0x96, 0x1a, 0xa4, 0x0, 0x6, 0x2, 0x66, 0x0, - 0x0, 0x5d, 0xb1, 0x10, 0x11, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+53CD "反" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x25, 0x8b, 0xe9, 0x0, 0x0, 0x1c, - 0x55, 0x43, 0x10, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x0, 0xc, 0x58, 0x55, 0x55, - 0xaa, 0x0, 0x0, 0x1b, 0x5, 0x0, 0x0, 0xd1, - 0x0, 0x0, 0x2a, 0x0, 0x70, 0x7, 0x80, 0x0, - 0x0, 0x38, 0x0, 0x64, 0x2c, 0x0, 0x0, 0x0, - 0x74, 0x0, 0x9, 0xc2, 0x0, 0x0, 0x0, 0xa0, - 0x0, 0x1b, 0xc6, 0x0, 0x0, 0x4, 0x50, 0x7, - 0x81, 0x9, 0xd6, 0x10, 0x6, 0x15, 0x61, 0x0, - 0x0, 0x3c, 0xd2, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+53D6 "取" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x75, 0x57, 0xb1, 0x0, 0x0, 0x0, 0x0, 0xb0, - 0xb, 0x12, 0x22, 0x27, 0x0, 0x0, 0xb0, 0xb, - 0x16, 0x33, 0x3e, 0x10, 0x0, 0xc5, 0x5c, 0x1, - 0x30, 0x3a, 0x0, 0x0, 0xb0, 0xb, 0x0, 0x60, - 0x76, 0x0, 0x0, 0xc5, 0x5c, 0x0, 0x70, 0xc1, - 0x0, 0x0, 0xb0, 0xb, 0x0, 0x64, 0xa0, 0x0, - 0x0, 0xb0, 0xb, 0x52, 0x1e, 0x30, 0x0, 0x4, - 0xd9, 0x8d, 0x0, 0x2e, 0x40, 0x0, 0xa, 0x40, - 0xb, 0x0, 0xa1, 0xc5, 0x0, 0x0, 0x0, 0xb, - 0x8, 0x20, 0x1c, 0xb1, 0x0, 0x0, 0xa, 0x51, - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+53D7 "受" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, 0x13, 0x57, 0xac, 0xd5, 0x0, 0x0, 0x45, - 0x44, 0x31, 0x0, 0x80, 0x0, 0x0, 0x9, 0x10, - 0xb1, 0x6, 0x80, 0x0, 0x0, 0x27, 0x70, 0x86, - 0x9, 0x0, 0x10, 0x1, 0xa6, 0x55, 0x65, 0x56, - 0x58, 0xd0, 0x9, 0x60, 0x0, 0x0, 0x1, 0x7, - 0x10, 0x2, 0x5, 0x75, 0x55, 0x5f, 0x31, 0x0, - 0x0, 0x0, 0x15, 0x0, 0x87, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x45, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, - 0x56, 0xb7, 0x20, 0x0, 0x2, 0x57, 0x50, 0x0, - 0x6, 0xcf, 0xb1, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+53E3 "口" */ - 0x18, 0x55, 0x55, 0x55, 0x5a, 0x1, 0xb0, 0x0, - 0x0, 0x0, 0xc0, 0xb, 0x0, 0x0, 0x0, 0xc, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0xc0, 0xb, 0x0, - 0x0, 0x0, 0xc, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0xc0, 0xb, 0x0, 0x0, 0x0, 0xc, 0x0, 0xb0, - 0x0, 0x0, 0x0, 0xc0, 0x1c, 0x55, 0x55, 0x55, - 0x5c, 0x1, 0xa0, 0x0, 0x0, 0x0, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+53E4 "古" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0x5, 0x55, 0x55, - 0xc6, 0x55, 0x59, 0x90, 0x0, 0x0, 0x0, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x55, 0x85, 0x55, 0xd2, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x55, - 0x55, 0x55, 0xd0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+53E5 "句" */ - 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x95, 0x55, 0x55, 0x55, 0x90, 0x0, 0x3a, 0x0, - 0x0, 0x0, 0x2, 0xa0, 0x0, 0xa0, 0x0, 0x0, - 0x0, 0x1, 0xa0, 0x7, 0x17, 0x55, 0x55, 0x90, - 0x1, 0xa0, 0x10, 0xc, 0x0, 0x2, 0xa0, 0x2, - 0xa0, 0x0, 0xc, 0x0, 0x2, 0xa0, 0x2, 0xa0, - 0x0, 0xc, 0x0, 0x2, 0xa0, 0x2, 0x90, 0x0, - 0xd, 0x55, 0x56, 0x90, 0x3, 0x90, 0x0, 0x4, - 0x0, 0x0, 0x0, 0x4, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x8, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x18, 0xec, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x40, 0x0, - - /* U+53E6 "另" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0xb5, 0x55, 0x55, 0x5e, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0xb0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0xb, 0x55, 0x55, 0x55, 0xc0, - 0x0, 0x0, 0x90, 0xa, 0x10, 0x7, 0x0, 0x0, - 0x0, 0x1, 0xc0, 0x0, 0x3, 0x0, 0x26, 0x55, - 0x7c, 0x55, 0x56, 0xc0, 0x0, 0x0, 0x5, 0x70, - 0x0, 0x29, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x3, - 0x90, 0x0, 0x0, 0x29, 0x0, 0x0, 0x48, 0x0, - 0x0, 0x49, 0x0, 0x3, 0x18, 0x60, 0x3, 0x64, - 0x0, 0x0, 0x2b, 0xe1, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+53EA "只" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa5, - 0x55, 0x55, 0x5d, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0xc5, 0x55, 0x55, - 0x5c, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x9, 0x0, - 0x0, 0x2, 0xd1, 0x5, 0x10, 0x0, 0x0, 0xc, - 0x40, 0x0, 0xa4, 0x0, 0x0, 0x76, 0x0, 0x0, - 0x1e, 0x50, 0x5, 0x60, 0x0, 0x0, 0x5, 0xe0, - 0x44, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+53EB "叫" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc2, 0x27, 0x55, 0xa0, 0x29, - 0x0, 0xb0, 0x2a, 0x0, 0xc0, 0x2a, 0x0, 0xb0, - 0x2a, 0x0, 0xc0, 0x2a, 0x0, 0xb0, 0x2a, 0x0, - 0xc0, 0x2a, 0x0, 0xb0, 0x2a, 0x0, 0xc0, 0x2a, - 0x0, 0xb0, 0x2a, 0x0, 0xc0, 0x2a, 0x2, 0xc0, - 0x2b, 0x55, 0xc0, 0x3d, 0x83, 0xb0, 0x2a, 0x0, - 0xc0, 0x5, 0x0, 0xb0, 0x25, 0x0, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x10, - - /* U+53EF "可" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x6, - 0x55, 0x55, 0x55, 0x55, 0xd5, 0x52, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x18, 0x55, - 0x5a, 0x0, 0xc0, 0x0, 0x0, 0x2a, 0x0, 0xc, - 0x0, 0xc0, 0x0, 0x0, 0x1a, 0x0, 0xc, 0x0, - 0xc0, 0x0, 0x0, 0x1a, 0x0, 0xc, 0x0, 0xc0, - 0x0, 0x0, 0x1c, 0x55, 0x5c, 0x0, 0xc0, 0x0, - 0x0, 0x2a, 0x0, 0xa, 0x0, 0xc0, 0x0, 0x0, - 0x13, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x54, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1a, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+53F0 "台" */ - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0x30, 0x0, 0x0, 0x0, 0x1, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x60, 0x0, - 0x0, 0x92, 0x0, 0x0, 0x1b, 0x50, 0x2d, 0x87, - 0x77, 0x76, 0x57, 0xe5, 0xa, 0x74, 0x10, 0x0, - 0x0, 0x45, 0x0, 0x30, 0x0, 0x0, 0x5, 0x0, - 0x0, 0xc5, 0x55, 0x55, 0x5d, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xc5, 0x55, 0x55, 0x5c, 0x0, 0x0, 0x20, - 0x0, 0x0, 0x1, 0x0, - - /* U+53F2 "史" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0xc, 0x55, 0x5d, 0x55, - 0x5d, 0x20, 0x0, 0xd0, 0x0, 0xc0, 0x0, 0xc0, - 0x0, 0xd, 0x0, 0xc, 0x0, 0xc, 0x0, 0x0, - 0xe5, 0x55, 0xd5, 0x55, 0xd0, 0x0, 0x6, 0x10, - 0xb, 0x0, 0x4, 0x0, 0x0, 0x3, 0x20, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x77, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x2b, 0x45, 0xca, 0x63, 0x20, 0x4, 0x87, - 0x10, 0x0, 0x49, 0xcc, 0x23, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+53F3 "右" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x80, 0x0, 0x3, 0x1, 0x65, 0x55, 0xb7, 0x55, - 0x55, 0x96, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xc0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x9c, - 0x65, 0x55, 0x5d, 0x20, 0x0, 0x54, 0xa2, 0x0, - 0x0, 0xc0, 0x0, 0x35, 0xa, 0x20, 0x0, 0xc, - 0x0, 0x23, 0x0, 0xa2, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0xa, 0x65, 0x55, 0x5d, 0x0, 0x0, 0x0, - 0x81, 0x0, 0x0, 0x90, 0x0, - - /* U+53F7 "号" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0xb5, 0x55, 0x55, 0xc3, 0x0, 0x0, 0xb, 0x0, - 0x0, 0xb, 0x10, 0x0, 0x0, 0xb0, 0x0, 0x0, - 0xb1, 0x0, 0x0, 0xb, 0x55, 0x55, 0x5c, 0x10, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x10, 0x50, 0x5, - 0x55, 0x99, 0x55, 0x55, 0x56, 0x30, 0x0, 0xb, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0xd5, 0x55, - 0x59, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x84, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, - 0x0, 0x0, 0x3, 0x2, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x2d, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x0, - - /* U+53F8 "司" */ - 0x2, 0x65, 0x55, 0x55, 0x55, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x1, - 0x20, 0xc0, 0x35, 0x55, 0x55, 0x57, 0x70, 0xc0, - 0x0, 0x10, 0x0, 0x20, 0x0, 0xc0, 0x0, 0xd5, - 0x55, 0xd4, 0x0, 0xc0, 0x0, 0xc0, 0x0, 0xb0, - 0x0, 0xc0, 0x0, 0xc0, 0x0, 0xb0, 0x0, 0xc0, - 0x0, 0xd5, 0x55, 0xd1, 0x0, 0xc0, 0x0, 0x80, - 0x0, 0x50, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x21, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+5403 "吃" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x80, 0x0, 0x0, 0x42, 0x26, 0x0, - 0xc0, 0x0, 0x0, 0xd, 0x33, 0xd0, 0x69, 0x55, - 0x58, 0x80, 0xc0, 0xc, 0x9, 0x0, 0x0, 0x0, - 0xc, 0x0, 0xc5, 0x10, 0x0, 0x40, 0x0, 0xc0, - 0xc, 0x15, 0x55, 0x9c, 0x10, 0xc, 0x0, 0xc0, - 0x0, 0x2c, 0x10, 0x0, 0xc5, 0x5d, 0x0, 0xc, - 0x20, 0x0, 0xd, 0x0, 0xb0, 0xa, 0x30, 0x0, - 0x30, 0x50, 0x0, 0x7, 0x70, 0x0, 0x6, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x1, 0xa0, 0x0, 0x0, - 0x8, 0xba, 0xaa, 0xcc, 0x0, - - /* U+5404 "各" */ - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3d, 0x10, 0x3, 0x0, 0x0, 0x0, 0x0, - 0xc7, 0x55, 0x6e, 0x20, 0x0, 0x0, 0x7, 0x56, - 0x0, 0x96, 0x0, 0x0, 0x0, 0x44, 0x4, 0x53, - 0xb0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x9c, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xa8, 0xa3, 0x0, - 0x0, 0x0, 0x0, 0x86, 0x0, 0x3b, 0xd8, 0x51, - 0x0, 0x58, 0xb5, 0x55, 0x5c, 0x48, 0x60, 0x4, - 0x1, 0xa0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x1, - 0xa0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x1, 0xa0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x2, 0xc5, 0x55, - 0x5d, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x3, - 0x0, 0x0, - - /* U+5408 "合" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, - 0x2, 0x90, 0x0, 0x0, 0x0, 0x4, 0xa0, 0x0, - 0x4b, 0x20, 0x0, 0x0, 0x68, 0x0, 0x0, 0x17, - 0xda, 0x50, 0x26, 0x24, 0x55, 0x55, 0x56, 0x7, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x55, 0x55, 0x5c, 0x20, 0x0, 0x0, - 0xa, 0x10, 0x0, 0xc, 0x0, 0x0, 0x0, 0xa, - 0x10, 0x0, 0xc, 0x0, 0x0, 0x0, 0xa, 0x65, - 0x55, 0x5d, 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, - 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+540C "同" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x55, - 0x55, 0x55, 0x55, 0xa3, 0xc, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0xc, 0x0, 0x0, 0x0, 0x61, 0xa2, - 0xc, 0x6, 0x55, 0x55, 0x52, 0xa2, 0xc, 0x0, - 0x10, 0x0, 0x30, 0xa2, 0xc, 0x1, 0xc5, 0x55, - 0xc0, 0xa2, 0xc, 0x0, 0xa0, 0x0, 0xb0, 0xa2, - 0xc, 0x0, 0xa0, 0x0, 0xb0, 0xa2, 0xc, 0x1, - 0xc5, 0x55, 0xb0, 0xa2, 0xc, 0x0, 0x20, 0x0, - 0x10, 0xa2, 0xc, 0x0, 0x0, 0x0, 0x20, 0xc1, - 0xd, 0x0, 0x0, 0x0, 0x4c, 0xd0, 0x2, 0x0, - 0x0, 0x0, 0x1, 0x0, - - /* U+540D "名" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x75, 0x55, 0x78, 0x0, 0x0, 0x7, 0x50, 0x0, - 0xc, 0x40, 0x0, 0x4, 0xc2, 0x0, 0x9, 0x70, - 0x0, 0x3, 0x60, 0xd3, 0x9, 0x80, 0x0, 0x0, - 0x20, 0x3, 0x1a, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x3b, 0x50, 0x0, 0x10, 0x0, 0x0, 0x7e, 0x65, - 0x55, 0x5d, 0x20, 0x15, 0x72, 0xc0, 0x0, 0x0, - 0xc0, 0x2, 0x0, 0xc, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0xd5, 0x55, 0x55, 0xd0, 0x0, 0x0, - 0x9, 0x0, 0x0, 0x7, 0x0, - - /* U+5411 "向" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0x0, 0x0, 0x0, 0x10, 0x5, 0x20, 0x0, 0x2, - 0xd, 0x55, 0x65, 0x55, 0x55, 0xd2, 0xc0, 0x0, - 0x0, 0x0, 0xc, 0xc, 0x1, 0x20, 0x4, 0x0, - 0xc0, 0xc0, 0x1c, 0x55, 0xc3, 0xc, 0xc, 0x1, - 0xa0, 0xb, 0x10, 0xc0, 0xc0, 0x1a, 0x0, 0xb1, - 0xc, 0xc, 0x2, 0xc5, 0x5c, 0x10, 0xc0, 0xc0, - 0x13, 0x0, 0x10, 0xc, 0xc, 0x0, 0x0, 0x0, - 0x22, 0xd0, 0xc0, 0x0, 0x0, 0x3, 0xbb, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5426 "否" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, - 0x55, 0x56, 0x55, 0x55, 0xd4, 0x0, 0x0, 0x3, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbd, 0x12, - 0x0, 0x0, 0x0, 0x1, 0xb2, 0xc0, 0x27, 0x60, - 0x0, 0x3, 0xa1, 0xc, 0x0, 0x4, 0xd4, 0x5, - 0x50, 0x0, 0xd0, 0x0, 0x2, 0xa0, 0x0, 0x30, - 0x4, 0x0, 0x5, 0x0, 0x0, 0xc, 0x65, 0x55, - 0x55, 0xe0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0xd, - 0x0, 0x0, 0xb, 0x10, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xb6, 0x55, 0x55, 0x5d, 0x0, 0x0, 0xc, - 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, 0x0, - - /* U+5427 "吧" */ - 0x0, 0x0, 0x2, 0x0, 0x0, 0x30, 0x7, 0x55, - 0x90, 0xd5, 0xc5, 0x6d, 0x0, 0xc0, 0x1b, 0xc, - 0xc, 0x1, 0xb0, 0xc, 0x1, 0xb0, 0xc0, 0xc0, - 0x1b, 0x0, 0xc0, 0x1b, 0xc, 0xc, 0x1, 0xb0, - 0xc, 0x1, 0xb0, 0xd5, 0xd5, 0x6b, 0x0, 0xc0, - 0x1b, 0xc, 0x0, 0x1, 0x70, 0xc, 0x56, 0xb0, - 0xc0, 0x0, 0x0, 0x0, 0xc0, 0x1b, 0xc, 0x0, - 0x0, 0x1, 0xc, 0x0, 0x50, 0xc0, 0x0, 0x0, - 0x60, 0x0, 0x0, 0xc, 0x0, 0x0, 0xa, 0x0, - 0x0, 0x0, 0xab, 0xaa, 0xab, 0xc0, - - /* U+5440 "呀" */ - 0x0, 0x0, 0x2, 0x22, 0x22, 0x65, 0x9, 0x55, - 0xb2, 0x42, 0x22, 0xc2, 0x20, 0xc0, 0xc, 0x6, - 0x90, 0xc, 0x0, 0xc, 0x0, 0xc0, 0xb3, 0x0, - 0xc0, 0x0, 0xc0, 0xc, 0x1c, 0x0, 0xc, 0x7, - 0xc, 0x0, 0xc2, 0x75, 0x7d, 0xd5, 0x51, 0xc0, - 0xc, 0x0, 0xa, 0x4c, 0x0, 0xc, 0x55, 0xd0, - 0x4, 0x90, 0xc0, 0x0, 0xa0, 0x1, 0x2, 0xa0, - 0xc, 0x0, 0x0, 0x0, 0x2, 0x90, 0x0, 0xc0, - 0x0, 0x0, 0x3, 0x60, 0x12, 0x3b, 0x0, 0x0, - 0x1, 0x20, 0x0, 0x5e, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+544A "告" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x64, 0xb, 0x30, 0x0, 0x0, 0x0, 0xb, 0x10, - 0xb1, 0x2, 0x10, 0x0, 0x5, 0x85, 0x5c, 0x65, - 0x76, 0x0, 0x1, 0x70, 0x0, 0xb1, 0x0, 0x0, - 0x0, 0x20, 0x0, 0xb, 0x10, 0x1, 0x50, 0x6, - 0x55, 0x55, 0x65, 0x55, 0x67, 0x10, 0x0, 0x20, - 0x0, 0x0, 0x20, 0x0, 0x0, 0xc, 0x55, 0x55, - 0x5c, 0x30, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xb1, - 0x0, 0x0, 0xc, 0x0, 0x0, 0xb, 0x10, 0x0, - 0x0, 0xc5, 0x55, 0x55, 0xc1, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, 0x0, - - /* U+5462 "呢" */ - 0x10, 0x1, 0x8, 0x55, 0x55, 0x91, 0xc5, 0x5d, - 0xc, 0x0, 0x0, 0xc0, 0xc0, 0xc, 0xc, 0x0, - 0x0, 0xc0, 0xc0, 0xc, 0xc, 0x55, 0x55, 0xd0, - 0xc0, 0xc, 0xc, 0x12, 0x0, 0x20, 0xc0, 0xc, - 0xc, 0x3a, 0x0, 0x70, 0xc0, 0xc, 0xb, 0x38, - 0x9, 0x80, 0xc5, 0x5c, 0x38, 0x38, 0x74, 0x0, - 0xc0, 0x6, 0x73, 0x3b, 0x10, 0x2, 0x40, 0x0, - 0xa0, 0x38, 0x0, 0x14, 0x0, 0x4, 0x40, 0x2b, - 0x11, 0x6a, 0x0, 0x6, 0x0, 0x7, 0x99, 0x93, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+5468 "周" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x65, 0x55, 0x55, 0x55, 0xd0, 0x0, 0x92, 0x0, - 0x92, 0x0, 0xb, 0x0, 0x9, 0x20, 0xa, 0x14, - 0x10, 0xb0, 0x0, 0x92, 0x36, 0xc5, 0x53, 0xb, - 0x0, 0x9, 0x20, 0xa, 0x10, 0x60, 0xb0, 0x0, - 0xa4, 0x65, 0x55, 0x55, 0x2b, 0x0, 0xa, 0x0, - 0x85, 0x5a, 0x30, 0xb0, 0x0, 0xb0, 0xb, 0x0, - 0xb0, 0xb, 0x0, 0xa, 0x0, 0xb0, 0xb, 0x0, - 0xb0, 0x4, 0x50, 0xc, 0x55, 0xc0, 0xb, 0x0, - 0x80, 0x0, 0x40, 0x3, 0x22, 0xb0, 0x32, 0x0, - 0x0, 0x0, 0x5, 0xe5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5473 "味" */ - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x74, 0x49, 0x0, - 0xc, 0x0, 0x20, 0xc, 0x0, 0xc1, 0x65, 0xd5, - 0x67, 0x0, 0xc0, 0xc, 0x0, 0xc, 0x0, 0x0, - 0xc, 0x0, 0xc0, 0x0, 0xc0, 0x2, 0x50, 0xc0, - 0xc, 0x65, 0xae, 0x85, 0x55, 0xc, 0x0, 0xc0, - 0xc, 0xc5, 0x10, 0x0, 0xd5, 0x5c, 0x6, 0x5c, - 0x8, 0x0, 0xa, 0x0, 0x32, 0x90, 0xc0, 0x76, - 0x0, 0x0, 0x1, 0x90, 0xc, 0x0, 0xc9, 0x10, - 0x1, 0x70, 0x0, 0xc0, 0x1, 0x50, 0x0, 0x20, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x0, - - /* U+547C "呼" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x8e, 0x20, 0x85, 0x5c, 0x14, - 0x58, 0xc2, 0x0, 0xb, 0x0, 0xc1, 0x10, 0x1a, - 0x1, 0x90, 0xb0, 0xc, 0xa, 0x11, 0xa0, 0x94, - 0xb, 0x0, 0xc0, 0x67, 0x1a, 0x25, 0x0, 0xb0, - 0xc, 0x1, 0x11, 0xa2, 0x5, 0xb, 0x0, 0xc5, - 0x55, 0x6c, 0x55, 0x71, 0xb5, 0x5c, 0x0, 0x1, - 0xa0, 0x0, 0xb, 0x0, 0xc0, 0x0, 0x1a, 0x0, - 0x0, 0x50, 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x3a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6e, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x0, - - /* U+547D "命" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, - 0x2, 0x80, 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, - 0x7c, 0x71, 0x0, 0x3, 0x82, 0x65, 0x55, 0x61, - 0x8f, 0x80, 0x33, 0x20, 0x3, 0x4, 0x11, 0x52, - 0x0, 0x0, 0xb5, 0x5d, 0xb, 0x33, 0xc1, 0x0, - 0x0, 0xb0, 0xb, 0xb, 0x0, 0xb0, 0x0, 0x0, - 0xb0, 0xb, 0xb, 0x0, 0xb0, 0x0, 0x0, 0xb5, - 0x5c, 0xb, 0x0, 0xb0, 0x0, 0x0, 0xb0, 0x9, - 0xb, 0x29, 0xc0, 0x0, 0x0, 0x30, 0x0, 0xb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, - - /* U+548C "和" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4a, 0xd0, 0x0, 0x0, 0x0, 0x2, 0x55, - 0xd1, 0x0, 0x85, 0x55, 0x90, 0x0, 0x0, 0xc0, - 0x0, 0xc0, 0x2, 0xa0, 0x3, 0x55, 0xd5, 0x94, - 0xc0, 0x2, 0xa0, 0x0, 0x4, 0xe0, 0x0, 0xc0, - 0x2, 0xa0, 0x0, 0xb, 0xe7, 0x20, 0xc0, 0x2, - 0xa0, 0x0, 0x37, 0xc1, 0xd3, 0xc0, 0x2, 0xa0, - 0x0, 0x90, 0xc0, 0x11, 0xc0, 0x2, 0xa0, 0x6, - 0x10, 0xc0, 0x0, 0xd5, 0x56, 0xa0, 0x11, 0x0, - 0xc0, 0x0, 0xc0, 0x2, 0xa0, 0x0, 0x0, 0xd0, - 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+54B2 "咲" */ - 0x0, 0x0, 0x1, 0x0, 0x1, 0x10, 0x0, 0x0, - 0x0, 0x94, 0x0, 0x7a, 0x0, 0xb5, 0x5c, 0x1, - 0xf0, 0xa, 0x0, 0xc, 0x0, 0xc0, 0x4, 0x3, - 0x21, 0x30, 0xc0, 0xc, 0x26, 0x59, 0x85, 0x66, - 0xc, 0x0, 0xc0, 0x0, 0x93, 0x0, 0x0, 0xc0, - 0xc, 0x0, 0xa, 0x20, 0x4, 0xc, 0x0, 0xc6, - 0x55, 0xd8, 0x55, 0x73, 0xd5, 0x5c, 0x0, 0xc, - 0x41, 0x0, 0xc, 0x0, 0x80, 0x3, 0x91, 0x70, - 0x0, 0x10, 0x0, 0x0, 0xa2, 0xa, 0x10, 0x0, - 0x0, 0x0, 0x56, 0x0, 0x3c, 0x0, 0x0, 0x0, - 0x64, 0x0, 0x0, 0x8e, 0x40, 0x0, 0x30, 0x0, - 0x0, 0x0, 0x30, - - /* U+54C1 "品" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x55, 0x55, 0xa4, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x82, 0x0, 0x0, 0xc, 0x0, 0x0, 0x82, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x82, 0x0, 0x0, 0xd, - 0x55, 0x55, 0xb2, 0x0, 0x0, 0x4, 0x0, 0x0, - 0x10, 0x0, 0x1a, 0x55, 0xa5, 0xb, 0x55, 0xb4, - 0xb, 0x0, 0x93, 0xc, 0x0, 0xa2, 0xb, 0x0, - 0x93, 0xc, 0x0, 0xa2, 0xb, 0x0, 0x93, 0xc, - 0x0, 0xa2, 0xd, 0x55, 0xb3, 0xd, 0x55, 0xb2, - 0x1a, 0x0, 0x51, 0x9, 0x0, 0x61, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+54E1 "員" */ - 0x0, 0x2, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1c, - 0x55, 0x55, 0x5d, 0x0, 0x0, 0x1b, 0x0, 0x0, - 0xb, 0x0, 0x0, 0x1c, 0x55, 0x55, 0x5a, 0x0, - 0x1, 0x86, 0x55, 0x55, 0x56, 0x80, 0x1, 0xb0, - 0x0, 0x0, 0x2, 0x90, 0x1, 0xc5, 0x55, 0x55, - 0x56, 0x90, 0x0, 0xb0, 0x0, 0x0, 0x2, 0x90, - 0x1, 0xc5, 0x55, 0x55, 0x56, 0x90, 0x1, 0xc5, - 0x55, 0x55, 0x56, 0xa0, 0x0, 0x50, 0x54, 0x5, - 0x10, 0x20, 0x0, 0x7, 0xa3, 0x1, 0x9b, 0x30, - 0x3, 0x72, 0x0, 0x0, 0x3, 0xe0, 0x11, 0x0, - 0x0, 0x0, 0x0, 0x10, - - /* U+54EA "哪" */ - 0x0, 0x3, 0x33, 0x37, 0x24, 0x37, 0x8, 0x5a, - 0x22, 0xb1, 0xb4, 0x72, 0xc1, 0xa0, 0xa0, 0xa, - 0xb, 0x46, 0x53, 0xa, 0xa, 0x25, 0xc5, 0xb4, - 0x66, 0x0, 0xa0, 0xa0, 0xa, 0xb, 0x46, 0x50, - 0xa, 0xa, 0x0, 0x90, 0xb4, 0x64, 0x30, 0xa0, - 0xa2, 0x5b, 0x4b, 0x46, 0xa, 0xc, 0x5b, 0x5, - 0x61, 0xa4, 0x60, 0x91, 0xb0, 0x20, 0x91, 0x1a, - 0x47, 0x2b, 0x12, 0x0, 0x28, 0x3, 0x84, 0x6a, - 0x90, 0x0, 0x8, 0x17, 0xb4, 0x46, 0x0, 0x0, - 0x6, 0x0, 0x25, 0x4, 0x50, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5546 "商" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x67, 0x0, 0x2, 0x20, 0x6, 0x55, - 0x75, 0x56, 0x67, 0x57, 0x60, 0x0, 0x0, 0x67, - 0x0, 0x67, 0x0, 0x0, 0x0, 0x75, 0x5c, 0x55, - 0x95, 0x59, 0x10, 0x0, 0xb0, 0x5, 0x0, 0x20, - 0xb, 0x0, 0x0, 0xb0, 0x3c, 0x10, 0x5c, 0x1b, - 0x0, 0x0, 0xb1, 0x71, 0x0, 0x25, 0x2b, 0x0, - 0x0, 0xb2, 0xc, 0x55, 0xc2, 0xb, 0x0, 0x0, - 0xb0, 0xb, 0x0, 0xb0, 0xb, 0x0, 0x0, 0xb0, - 0xc, 0x55, 0xc0, 0xb, 0x0, 0x0, 0xb0, 0xa, - 0x0, 0x60, 0xb, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x3, 0xbb, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+554A "啊" */ - 0x0, 0x4, 0x67, 0x74, 0x55, 0x5a, 0x2c, 0x5c, - 0x65, 0x73, 0x0, 0x5, 0x60, 0xa0, 0xa5, 0x58, - 0x0, 0x0, 0x56, 0xa, 0xa, 0x55, 0x50, 0xa5, - 0xb5, 0x60, 0xa0, 0xa5, 0x64, 0xa, 0xa, 0x56, - 0xa, 0xa, 0x55, 0x70, 0xa0, 0xa5, 0x60, 0xa0, - 0xa5, 0x55, 0x6a, 0xa, 0x56, 0xc, 0x5b, 0x55, - 0x47, 0xc5, 0xa5, 0x60, 0xa0, 0x35, 0x8d, 0x23, - 0x1, 0x56, 0x0, 0x0, 0x55, 0x0, 0x0, 0x5, - 0x60, 0x0, 0x5, 0x50, 0x0, 0x10, 0x56, 0x0, - 0x0, 0x64, 0x0, 0x1, 0x8f, 0x30, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+554F "問" */ - 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x1, 0xc5, - 0x55, 0xc0, 0xc5, 0x55, 0xd0, 0x1b, 0x0, 0xa, - 0xb, 0x0, 0xc, 0x1, 0xc5, 0x55, 0xa0, 0xc5, - 0x55, 0xc0, 0x1b, 0x0, 0xa, 0xb, 0x0, 0xc, - 0x1, 0xc5, 0x55, 0x80, 0xb5, 0x55, 0xc0, 0x1b, - 0x0, 0x0, 0x0, 0x10, 0xc, 0x1, 0xb0, 0xc, - 0x55, 0x5d, 0x0, 0xc0, 0x1b, 0x0, 0xb0, 0x0, - 0xb0, 0xc, 0x1, 0xb0, 0xb, 0x0, 0xb, 0x0, - 0xc0, 0x1b, 0x0, 0xd5, 0x55, 0xb0, 0xc, 0x1, - 0xb0, 0x3, 0x0, 0x2, 0x0, 0xc0, 0x1a, 0x0, - 0x0, 0x0, 0x6, 0xd8, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x1, 0x0, - - /* U+5566 "啦" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x4, 0x30, 0x0, 0x0, 0x0, 0xb, - 0x0, 0xd, 0x0, 0xb, 0x5c, 0x10, 0xb4, 0x0, - 0x71, 0x50, 0xb0, 0xb4, 0x6c, 0x54, 0x65, 0x55, - 0xb, 0xb, 0x0, 0xb0, 0x0, 0x5, 0x30, 0xb0, - 0xb0, 0xb, 0x45, 0x20, 0xa5, 0xb, 0xb, 0x5, - 0xd2, 0x9, 0xb, 0x0, 0xb0, 0xba, 0x6b, 0x0, - 0xc0, 0xa0, 0xc, 0x5c, 0x0, 0xb0, 0xa, 0x27, - 0x0, 0xa0, 0x20, 0xb, 0x0, 0x24, 0x30, 0x0, - 0x0, 0x11, 0xb0, 0x0, 0x50, 0x60, 0x0, 0x4, - 0xd7, 0x36, 0x55, 0x56, 0x20, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x0, - - /* U+5584 "善" */ - 0x0, 0x0, 0x20, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x6, 0x70, 0x1b, 0x0, 0x0, 0x3, 0x55, 0x6b, - 0x59, 0x55, 0xc5, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x21, 0x0, 0x0, 0x36, 0x55, 0xd5, 0x56, 0x50, - 0x0, 0x65, 0x55, 0x5d, 0x55, 0x56, 0xb0, 0x0, - 0x4, 0x60, 0xc0, 0x1b, 0x0, 0x0, 0x0, 0xb, - 0xc, 0x5, 0x20, 0x60, 0x16, 0x55, 0x55, 0x65, - 0x55, 0x57, 0x40, 0x0, 0x75, 0x55, 0x55, 0xa1, - 0x0, 0x0, 0xb, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0xc, - 0x55, 0x55, 0x5d, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x20, 0x0, - - /* U+5589 "喉" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc2, 0x55, 0x82, 0x0, 0x54, 0x72, 0x1a, - 0x0, 0xa, 0x0, 0xa, 0x1a, 0x6, 0x30, 0x0, - 0xa0, 0x40, 0xa0, 0xa0, 0xc2, 0x7b, 0x55, 0x55, - 0xa, 0xa, 0x3e, 0x4, 0xa0, 0x2, 0x0, 0xa0, - 0xa4, 0xa0, 0x95, 0xb5, 0x62, 0xa, 0xa, 0xa, - 0x32, 0xb, 0x0, 0x0, 0xa5, 0xc0, 0xa4, 0x55, - 0xc6, 0x59, 0xb, 0x9, 0xa, 0x0, 0xa, 0x60, - 0x0, 0x60, 0x0, 0xa0, 0x6, 0x56, 0x30, 0x0, - 0x0, 0xa, 0x1, 0x90, 0xb, 0x10, 0x0, 0x0, - 0xb2, 0x60, 0x0, 0x3b, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, - - /* U+559C "喜" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x10, 0x4, 0x10, 0x2, 0x65, 0x55, - 0xc5, 0x55, 0x75, 0x0, 0x0, 0x22, 0x2c, 0x22, - 0x91, 0x0, 0x0, 0x6, 0x32, 0x22, 0x26, 0x10, - 0x0, 0x0, 0xb5, 0x55, 0x55, 0xc1, 0x0, 0x0, - 0xb, 0x55, 0x55, 0x5c, 0x0, 0x0, 0x0, 0x63, - 0x30, 0x8, 0x40, 0x0, 0x1, 0x11, 0x1b, 0x13, - 0x51, 0x18, 0x21, 0x64, 0x54, 0x44, 0x44, 0x54, - 0x42, 0x0, 0xa, 0x55, 0x55, 0x5b, 0x40, 0x0, - 0x0, 0xa0, 0x0, 0x0, 0x82, 0x0, 0x0, 0xb, - 0x55, 0x55, 0x5b, 0x30, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x20, 0x0, - - /* U+559D "喝" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x10, 0xc5, 0x55, 0x5e, 0x0, 0xb5, 0x6c, 0xc, - 0x0, 0x0, 0xc0, 0xc, 0x1, 0xa0, 0xd5, 0x55, - 0x5c, 0x0, 0xc0, 0x1a, 0xd, 0x55, 0x55, 0xc0, - 0xc, 0x1, 0xa0, 0x8a, 0x0, 0x4, 0x0, 0xc0, - 0x1a, 0xa, 0x73, 0x33, 0x37, 0xc, 0x56, 0xb6, - 0x52, 0x86, 0x22, 0xb0, 0xc0, 0x8, 0xa5, 0x1c, - 0x60, 0x18, 0x9, 0x0, 0x26, 0x38, 0x13, 0xa3, - 0x70, 0x0, 0x0, 0x65, 0x0, 0x16, 0x46, 0x0, - 0x0, 0x6, 0x65, 0x55, 0x47, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x3b, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x0, - - /* U+55AE "單" */ - 0x0, 0x10, 0x3, 0x2, 0x0, 0x11, 0x0, 0x0, - 0xb5, 0x5c, 0x1b, 0x55, 0x87, 0x0, 0x0, 0xb0, - 0xb, 0xa, 0x0, 0x55, 0x0, 0x0, 0xb5, 0x5a, - 0xb, 0x55, 0x85, 0x0, 0x0, 0x27, 0x55, 0x65, - 0x55, 0xa0, 0x0, 0x0, 0x38, 0x0, 0x90, 0x0, - 0xb0, 0x0, 0x0, 0x2b, 0x55, 0xb5, 0x55, 0xb0, - 0x0, 0x0, 0x28, 0x0, 0x90, 0x0, 0xb0, 0x0, - 0x0, 0x3b, 0x55, 0xb5, 0x55, 0xb0, 0x0, 0x0, - 0x11, 0x0, 0x90, 0x0, 0x13, 0x20, 0x16, 0x55, - 0x55, 0xb5, 0x55, 0x56, 0x60, 0x0, 0x0, 0x0, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x0, - - /* U+55B6 "営" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x91, 0x9, 0x10, 0x87, 0x0, 0x0, 0x5, 0x90, - 0x57, 0x18, 0x0, 0x0, 0x20, 0x2, 0x0, 0x4, - 0x0, 0x11, 0x8, 0x55, 0x55, 0x55, 0x55, 0x5b, - 0x91, 0xd0, 0x47, 0x55, 0x55, 0xb0, 0x70, 0x11, - 0x5, 0x60, 0x0, 0xb, 0x0, 0x0, 0x0, 0x59, - 0x55, 0x55, 0xb0, 0x0, 0x0, 0x3, 0x20, 0x0, - 0x3, 0x0, 0x0, 0x5, 0x55, 0x55, 0x55, 0x59, - 0x10, 0x0, 0xa1, 0x0, 0x0, 0x0, 0xb0, 0x0, - 0xa, 0x10, 0x0, 0x0, 0xb, 0x0, 0x0, 0xa5, - 0x55, 0x55, 0x55, 0xc0, 0x0, 0x5, 0x0, 0x0, - 0x0, 0x4, 0x0, - - /* U+55CE "嗎" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x55, - 0x95, 0x85, 0x59, 0x57, 0x60, 0xb0, 0xa, 0x56, - 0x0, 0xb0, 0x10, 0xb, 0x0, 0xa5, 0x95, 0x5c, - 0x58, 0x20, 0xb0, 0xa, 0x56, 0x0, 0xb0, 0x10, - 0xb, 0x0, 0xa5, 0x95, 0x5c, 0x57, 0x30, 0xb0, - 0xa, 0x56, 0x0, 0xb0, 0x2, 0xc, 0x55, 0xb5, - 0x95, 0x47, 0x45, 0xc2, 0xb0, 0x6, 0x0, 0x0, - 0x4, 0xb, 0x5, 0x0, 0x4, 0x24, 0x26, 0x3a, - 0xb0, 0x0, 0x0, 0x90, 0xc0, 0xc0, 0xab, 0x0, - 0x0, 0x67, 0x7, 0x2, 0x2, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x39, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x0, - - /* U+55EF "嗯" */ - 0x20, 0x3, 0x18, 0x55, 0x55, 0xa3, 0xb, 0x56, - 0xb1, 0xa0, 0x73, 0xa, 0x10, 0xb0, 0x1a, 0x1a, - 0x5b, 0x79, 0xa1, 0xb, 0x1, 0xa1, 0xa0, 0xb0, - 0xa, 0x10, 0xb0, 0x1a, 0x1a, 0x18, 0x94, 0xa1, - 0xb, 0x1, 0xa1, 0xa7, 0x0, 0x7a, 0x10, 0xb5, - 0x6a, 0x1c, 0x55, 0x55, 0xb1, 0xb, 0x1, 0x70, - 0x30, 0x71, 0x2, 0x0, 0x80, 0x0, 0x22, 0x63, - 0xa0, 0x63, 0x0, 0x0, 0x36, 0x28, 0x2, 0x3, - 0xd2, 0x0, 0xd, 0x22, 0x70, 0x1, 0x64, 0x0, - 0x0, 0x0, 0xc, 0x99, 0xb9, 0x0, - - /* U+561B "嘛" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb2, 0x0, 0x0, 0x85, 0x94, 0x75, - 0x58, 0x55, 0x98, 0xb, 0xb, 0x47, 0xb, 0x0, - 0xa1, 0x0, 0xb0, 0xb4, 0x70, 0xa0, 0xa, 0x0, - 0xb, 0xb, 0x4a, 0x5c, 0x94, 0xc6, 0x80, 0xb0, - 0xb5, 0x63, 0xc0, 0xe, 0x40, 0xb, 0xb, 0x64, - 0x8c, 0xb4, 0xe6, 0x0, 0xc5, 0xc9, 0x1a, 0xa2, - 0x8a, 0x70, 0x9, 0x0, 0xa6, 0x2a, 0x25, 0xa2, - 0x90, 0x0, 0x36, 0x50, 0xa5, 0xa, 0xa, 0x30, - 0x7, 0x20, 0xa, 0x0, 0xb0, 0x0, 0x3, 0x10, - 0x0, 0xa0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+56B4 "嚴" */ - 0x0, 0x1, 0x0, 0x30, 0x10, 0x2, 0x0, 0x0, - 0x1b, 0x55, 0xc0, 0xb5, 0x5c, 0x0, 0x0, 0x1b, - 0x55, 0xb0, 0xb5, 0x5b, 0x0, 0x0, 0x33, 0x0, - 0x30, 0x40, 0x7, 0x30, 0x0, 0xd5, 0x55, 0x65, - 0x57, 0x56, 0x50, 0x0, 0xb0, 0x65, 0xc1, 0x2b, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0x93, 0x66, 0x25, - 0x40, 0x0, 0xb5, 0xc5, 0x79, 0xb2, 0x49, 0x10, - 0x1, 0xa0, 0xb5, 0x77, 0x73, 0x55, 0x0, 0x2, - 0x80, 0xa0, 0x39, 0x7, 0x91, 0x0, 0x5, 0x40, - 0xb5, 0x77, 0x5, 0xb0, 0x0, 0x7, 0x2, 0xc7, - 0x89, 0x38, 0xa5, 0x0, 0x5, 0x9, 0x40, 0x37, - 0x52, 0xb, 0x90, 0x10, 0x0, 0x0, 0x12, 0x0, - 0x0, 0x0, - - /* U+56DB "四" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x55, 0x75, - 0x57, 0x55, 0xc2, 0xc0, 0xc, 0x0, 0xc0, 0xc, - 0xc, 0x0, 0xc0, 0xc, 0x0, 0xc0, 0xc0, 0xc, - 0x0, 0xc0, 0xc, 0xc, 0x0, 0xb0, 0xc, 0x0, - 0xc0, 0xc0, 0xb, 0x0, 0xc0, 0xc, 0xc, 0x4, - 0x70, 0xc, 0x0, 0xc0, 0xc0, 0xa1, 0x0, 0xab, - 0xcd, 0xc, 0x73, 0x0, 0x0, 0x0, 0xc0, 0xd1, - 0x0, 0x0, 0x0, 0xc, 0xd, 0x55, 0x55, 0x55, - 0x55, 0xd0, 0xc0, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x10, - - /* U+56DE "回" */ - 0x85, 0x55, 0x55, 0x55, 0x59, 0x2c, 0x0, 0x0, - 0x0, 0x0, 0xb0, 0xc0, 0x0, 0x0, 0x0, 0xb, - 0xc, 0x1, 0x75, 0x55, 0x80, 0xb0, 0xc0, 0x1a, - 0x0, 0x1a, 0xb, 0xc, 0x0, 0xa0, 0x1, 0xa0, - 0xb0, 0xc0, 0x1a, 0x0, 0x1a, 0xb, 0xc, 0x1, - 0xc5, 0x56, 0xa0, 0xb0, 0xc0, 0x4, 0x0, 0x2, - 0xb, 0xc, 0x0, 0x0, 0x0, 0x0, 0xb0, 0xd5, - 0x55, 0x55, 0x55, 0x5c, 0xc, 0x0, 0x0, 0x0, - 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+56E0 "因" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x95, - 0x55, 0x55, 0x55, 0x56, 0xa0, 0x1b, 0x0, 0x1, - 0x60, 0x0, 0x2a, 0x1, 0xb0, 0x0, 0x1b, 0x0, - 0x2, 0xa0, 0x1b, 0x0, 0x1, 0xa0, 0x4, 0x2a, - 0x1, 0xb3, 0x65, 0x6c, 0x56, 0x72, 0xa0, 0x1b, - 0x0, 0x4, 0x90, 0x0, 0x2a, 0x1, 0xb0, 0x0, - 0x88, 0x70, 0x2, 0xa0, 0x1b, 0x0, 0xc, 0x4, - 0xc0, 0x2a, 0x1, 0xb0, 0x9, 0x30, 0x9, 0x72, - 0xa0, 0x1b, 0x16, 0x20, 0x0, 0x14, 0x2a, 0x1, - 0xb0, 0x0, 0x0, 0x0, 0x2, 0xa0, 0x1c, 0x55, - 0x55, 0x55, 0x55, 0x6a, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+56F0 "困" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x55, - 0x55, 0x65, 0x55, 0xc4, 0xc, 0x0, 0x0, 0xd0, - 0x0, 0xa2, 0xc, 0x0, 0x0, 0xc0, 0x0, 0xa2, - 0xc, 0x36, 0x56, 0xd5, 0x79, 0xa2, 0xc, 0x0, - 0xc, 0xc0, 0x0, 0xa2, 0xc, 0x0, 0x47, 0xd5, - 0x0, 0xa2, 0xc, 0x0, 0xa0, 0xc2, 0xc4, 0xa2, - 0xc, 0x8, 0x20, 0xc0, 0x2c, 0xa2, 0xc, 0x52, - 0x0, 0xc0, 0x2, 0xa2, 0xc, 0x0, 0x0, 0xd0, - 0x0, 0xa2, 0xc, 0x0, 0x0, 0x40, 0x0, 0xa2, - 0xd, 0x55, 0x55, 0x55, 0x55, 0xb2, 0x2, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+56F3 "図" */ - 0x30, 0x0, 0x0, 0x0, 0x0, 0x30, 0xb6, 0x55, - 0x55, 0x55, 0x55, 0xd2, 0xb1, 0x0, 0x1, 0x30, - 0x0, 0xb0, 0xb1, 0x0, 0x71, 0xb2, 0x71, 0xb0, - 0xb1, 0x4, 0x2b, 0x56, 0xd1, 0xb0, 0xb1, 0x5, - 0x14, 0x9, 0x40, 0xb0, 0xb1, 0x0, 0x80, 0x3a, - 0x0, 0xb0, 0xb1, 0x0, 0x29, 0xb1, 0x0, 0xb0, - 0xb1, 0x0, 0xb, 0xb0, 0x0, 0xb0, 0xb1, 0x1, - 0x81, 0x3c, 0x72, 0xb0, 0xb1, 0x45, 0x0, 0x1, - 0x89, 0xc0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0xb0, - 0xb6, 0x55, 0x55, 0x55, 0x55, 0xd1, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x20, - - /* U+56FD "国" */ - 0x10, 0x0, 0x0, 0x0, 0x1, 0xd, 0x55, 0x55, - 0x55, 0x55, 0xd2, 0xc0, 0x0, 0x0, 0x3, 0x3c, - 0xc, 0x16, 0x56, 0xb5, 0x53, 0xc0, 0xc0, 0x0, - 0x2a, 0x0, 0xc, 0xc, 0x4, 0x56, 0xb5, 0xa1, - 0xc0, 0xc0, 0x10, 0x2a, 0x20, 0xc, 0xc, 0x0, - 0x2, 0xa9, 0x70, 0xc0, 0xc0, 0x0, 0x2a, 0x9, - 0xc, 0xc, 0x35, 0x56, 0xb5, 0x98, 0xc0, 0xc1, - 0x0, 0x0, 0x0, 0xc, 0xd, 0x55, 0x55, 0x55, - 0x55, 0xd0, 0xc0, 0x0, 0x0, 0x0, 0x9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+570B "國" */ - 0x20, 0x0, 0x0, 0x0, 0x0, 0x30, 0xa6, 0x55, - 0x55, 0x87, 0x55, 0xc2, 0xa1, 0x0, 0x0, 0xc1, - 0xc0, 0xb0, 0xa2, 0x65, 0x55, 0xc5, 0x8a, 0xb0, - 0xa1, 0x0, 0x0, 0xa0, 0x0, 0xb0, 0xa1, 0x95, - 0xb2, 0xa0, 0x65, 0xb0, 0xa1, 0xa0, 0xa0, 0x90, - 0xa1, 0xb0, 0xa1, 0xa5, 0xc0, 0x67, 0x80, 0xb0, - 0xa1, 0x70, 0x40, 0xf, 0x11, 0xc0, 0xa1, 0x36, - 0x63, 0x7a, 0x86, 0xb0, 0xa2, 0x91, 0x6, 0x40, - 0x6f, 0xb0, 0xa1, 0x0, 0x40, 0x0, 0x3, 0xc0, - 0xa6, 0x55, 0x55, 0x55, 0x55, 0xc0, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x20, - - /* U+570D "圍" */ - 0x11, 0x0, 0x0, 0x0, 0x0, 0x3, 0x2, 0xb5, - 0x55, 0x75, 0x55, 0x55, 0xd0, 0x2a, 0x0, 0xa, - 0x10, 0x20, 0xc, 0x2, 0xa0, 0x46, 0xb5, 0x5d, - 0x0, 0xc0, 0x2a, 0x45, 0x5b, 0x55, 0xca, 0x3c, - 0x2, 0xa1, 0x16, 0x55, 0x58, 0x0, 0xc0, 0x2a, - 0x1, 0x90, 0x0, 0xb0, 0xc, 0x2, 0xa0, 0x18, - 0x5c, 0x57, 0x0, 0xc0, 0x2a, 0x6, 0x85, 0xc5, - 0x84, 0xc, 0x2, 0xa0, 0xa8, 0x5c, 0x57, 0x70, - 0xc0, 0x2a, 0x1, 0x0, 0xb0, 0x0, 0xc, 0x2, - 0xa0, 0x0, 0x8, 0x0, 0x0, 0xc0, 0x2b, 0x55, - 0x55, 0x55, 0x55, 0x5c, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x20, - - /* U+5712 "園" */ - 0x30, 0x0, 0x0, 0x0, 0x0, 0x30, 0xa6, 0x55, - 0x5a, 0x55, 0x55, 0xd1, 0xa2, 0x0, 0xc, 0x3, - 0x0, 0xc0, 0xa2, 0x6, 0x5c, 0x56, 0x20, 0xc0, - 0xa2, 0x65, 0x5a, 0x55, 0xa3, 0xc0, 0xa2, 0x7, - 0x55, 0x58, 0x20, 0xc0, 0xa2, 0xb, 0x0, 0xa, - 0x10, 0xc0, 0xa2, 0xd, 0x66, 0x5b, 0x10, 0xc0, - 0xa2, 0x3, 0xd1, 0x1, 0xc1, 0xc0, 0xa2, 0x18, - 0xa1, 0x69, 0x10, 0xc0, 0xa4, 0x50, 0x80, 0x9, - 0xa0, 0xc0, 0xa2, 0x0, 0x60, 0x0, 0x70, 0xc0, - 0xa6, 0x55, 0x55, 0x55, 0x55, 0xd0, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x10, - - /* U+5718 "團" */ - 0x30, 0x0, 0x0, 0x0, 0x0, 0x30, 0xb6, 0x55, - 0x5a, 0x65, 0x55, 0xd1, 0xb3, 0x65, 0x5d, 0x55, - 0x76, 0xc0, 0xb1, 0x55, 0x5c, 0x55, 0x80, 0xc0, - 0xb1, 0x86, 0x5c, 0x55, 0xa0, 0xc0, 0xb1, 0x86, - 0x5c, 0x55, 0xa0, 0xc0, 0xb1, 0x50, 0xb, 0x3, - 0x70, 0xc0, 0xb1, 0x9a, 0x88, 0x48, 0x86, 0xc0, - 0xb2, 0x55, 0x55, 0x5c, 0x82, 0xc0, 0xb1, 0x15, - 0x40, 0xa, 0x0, 0xc0, 0xb1, 0x0, 0x72, 0x5a, - 0x0, 0xc0, 0xb1, 0x0, 0x0, 0x74, 0x0, 0xc0, - 0xb6, 0x55, 0x55, 0x55, 0x55, 0xd0, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x10, - - /* U+571F "土" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb1, - 0x0, 0x0, 0x0, 0x2, 0x55, 0x55, 0xc6, 0x55, - 0x9a, 0x0, 0x0, 0x10, 0x0, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb1, 0x0, 0x1, 0x0, 0x26, 0x55, 0x55, - 0xb6, 0x55, 0x5b, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5723 "圣" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x16, 0x65, 0x55, 0x58, 0xd0, 0x0, 0x0, 0x0, - 0x32, 0x0, 0xd, 0x50, 0x0, 0x0, 0x0, 0x6, - 0x40, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb8, 0xb7, - 0x20, 0x0, 0x0, 0x3, 0x87, 0x19, 0x15, 0xbf, - 0xd3, 0x4, 0x53, 0x0, 0xd, 0x0, 0x0, 0x20, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x26, 0x0, 0x0, - 0x26, 0x55, 0x5e, 0x55, 0x55, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x1, 0x80, 0x5, 0x55, 0x55, 0x56, - 0x55, 0x55, 0x62, - - /* U+5728 "在" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x80, 0x0, 0x6, 0x40, 0x5, 0x65, 0x5d, - 0x55, 0x65, 0x55, 0x40, 0x0, 0x0, 0x58, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0xc0, 0x7, - 0x0, 0x0, 0x8c, 0x6, 0x55, 0xd5, 0x55, 0x20, - 0x6, 0x2c, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x10, - 0xc, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, 0x45, - 0x55, 0xc5, 0x56, 0xc1, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5730 "地" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x29, 0x0, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x29, - 0x0, 0x51, 0x1a, 0x0, 0x0, 0x0, 0x29, 0x0, - 0xb0, 0x1a, 0x3, 0x0, 0x0, 0x29, 0x10, 0xb0, - 0x1b, 0x5d, 0x20, 0x6, 0x7b, 0x83, 0xb5, 0x6a, - 0xb, 0x0, 0x0, 0x29, 0x35, 0xc0, 0x1a, 0xb, - 0x0, 0x0, 0x29, 0x0, 0xb0, 0x1a, 0xb, 0x0, - 0x0, 0x29, 0x0, 0xb0, 0x1a, 0xb, 0x0, 0x0, - 0x29, 0x0, 0xb0, 0x1b, 0x9b, 0x10, 0x0, 0x2c, - 0x64, 0xb0, 0x17, 0x0, 0x50, 0xb, 0xb3, 0x0, - 0xb0, 0x0, 0x0, 0x91, 0x3, 0x0, 0x0, 0x7b, - 0xaa, 0xaa, 0xe4, - - /* U+5747 "均" */ - 0x0, 0x2, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, - 0xe, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, 0xc, - 0x0, 0xb, 0x10, 0x0, 0x10, 0x0, 0xc, 0x0, - 0x2b, 0x55, 0x55, 0xd1, 0x5, 0x5d, 0x86, 0x81, - 0x0, 0x0, 0xc0, 0x0, 0xc, 0x2, 0x53, 0x60, - 0x0, 0xc0, 0x0, 0xc, 0x2, 0x0, 0xb6, 0x0, - 0xc0, 0x0, 0xc, 0x0, 0x0, 0x35, 0x0, 0xb0, - 0x0, 0xc, 0x2, 0x10, 0x5, 0x41, 0xb0, 0x0, - 0x2e, 0x83, 0x6, 0x91, 0x2, 0xa0, 0x1d, 0xc3, - 0x2, 0xe6, 0x0, 0x4, 0x80, 0x3, 0x0, 0x0, - 0x20, 0x22, 0x1a, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xea, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+574A "坊" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x10, 0x1, 0xb1, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x11, 0x22, 0x11, 0x80, 0x0, 0xc, 0x16, 0x36, - 0xb3, 0x33, 0x31, 0x4, 0x5d, 0x54, 0x4, 0x90, - 0x0, 0x0, 0x0, 0xc, 0x0, 0x5, 0xa5, 0x5b, - 0x60, 0x0, 0xc, 0x0, 0x7, 0x60, 0xa, 0x30, - 0x0, 0xc, 0x0, 0xb, 0x20, 0xb, 0x10, 0x0, - 0x1d, 0x86, 0x2b, 0x0, 0xd, 0x0, 0xc, 0xc4, - 0x0, 0x93, 0x0, 0xd, 0x0, 0x2, 0x0, 0x5, - 0x40, 0x21, 0x3b, 0x0, 0x0, 0x0, 0x53, 0x0, - 0x1a, 0xf4, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+5750 "坐" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x20, 0x92, 0x0, 0xd2, 0x0, 0x0, 0x2c, 0x0, - 0x92, 0x3, 0xb0, 0x0, 0x0, 0x88, 0x0, 0x92, - 0x9, 0x80, 0x0, 0x0, 0xc5, 0xa0, 0x92, 0x1a, - 0x2b, 0x0, 0x6, 0x40, 0xb4, 0x92, 0x71, 0x9, - 0x60, 0x16, 0x0, 0x20, 0x95, 0x30, 0x1, 0x10, - 0x10, 0x35, 0x55, 0xb7, 0x55, 0xd3, 0x0, 0x0, - 0x10, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x92, 0x0, 0x5, 0x40, 0x26, 0x55, 0x55, 0x65, - 0x55, 0x57, 0x70, - - /* U+578B "型" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x15, - 0x55, 0x58, 0x80, 0x0, 0xb1, 0x0, 0xa, 0x9, - 0x20, 0xb, 0xb, 0x0, 0x0, 0xa0, 0x92, 0x30, - 0xb0, 0xb0, 0x5, 0x5c, 0x5b, 0x78, 0x3b, 0xb, - 0x0, 0x0, 0xb0, 0x92, 0x0, 0xb0, 0xb0, 0x0, - 0x28, 0x9, 0x20, 0x3, 0xb, 0x0, 0x9, 0x0, - 0x92, 0x0, 0x38, 0xd0, 0x5, 0x10, 0x1, 0xa5, - 0x0, 0x23, 0x0, 0x1, 0x55, 0x5c, 0x75, 0x5c, - 0x30, 0x0, 0x1, 0x0, 0xa3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x30, 0x0, 0x10, 0x4, 0x55, - 0x55, 0xb7, 0x55, 0x5e, 0x80, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+57DF "域" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, - 0x94, 0x0, 0x0, 0xc, 0x2b, 0x20, 0x0, 0x92, - 0x0, 0x0, 0xb, 0x4, 0x40, 0x0, 0x92, 0x36, - 0x55, 0x5c, 0x56, 0xa1, 0x25, 0xb8, 0x80, 0x0, - 0xb, 0x0, 0x0, 0x1, 0x92, 0xa, 0x5c, 0x3b, - 0xa, 0x30, 0x0, 0x92, 0xa, 0xa, 0xb, 0xd, - 0x0, 0x0, 0x92, 0xa, 0xa, 0xb, 0x57, 0x0, - 0x0, 0x92, 0xa, 0x59, 0xa, 0xc1, 0x0, 0x15, - 0xc7, 0x40, 0x0, 0x28, 0xa0, 0x2, 0x49, 0x10, - 0x68, 0x74, 0x3b, 0xc2, 0x32, 0x0, 0x0, 0x61, - 0x2, 0x90, 0x3d, 0xa1, 0x0, 0x0, 0x0, 0x56, - 0x0, 0x4, 0xe2, 0x0, 0x0, 0x1, 0x10, 0x0, - 0x0, 0x0, - - /* U+57F7 "執" */ - 0x0, 0x3, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0xc, 0x20, 0x0, 0xc2, 0x0, 0x0, 0x4, 0x5d, - 0x59, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xc0, 0x3, 0x0, 0x0, 0xc, 0x3, 0x26, - 0xd5, 0x8b, 0x0, 0x27, 0x85, 0x59, 0x30, 0xb0, - 0x57, 0x0, 0x0, 0x93, 0x56, 0x5, 0xb0, 0x65, - 0x0, 0x5, 0x77, 0x99, 0x12, 0xe4, 0x74, 0x0, - 0x0, 0xc, 0x0, 0x4, 0x8d, 0x74, 0x0, 0x25, - 0x5d, 0x5a, 0x49, 0x20, 0x75, 0x10, 0x1, 0xc, - 0x0, 0x19, 0x0, 0x58, 0x60, 0x0, 0xc, 0x0, - 0x91, 0x0, 0xd, 0xa0, 0x0, 0xb, 0x16, 0x10, - 0x0, 0x3, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+57FA "基" */ - 0x0, 0x0, 0x20, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0xd, 0x1, 0x0, 0x3, 0x55, - 0xd5, 0x55, 0x5d, 0x5a, 0x30, 0x0, 0x0, 0xc0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x55, - 0x5c, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x55, 0x5c, - 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xc, 0x5, - 0x40, 0x6, 0x55, 0xc7, 0x75, 0x87, 0x57, 0x60, - 0x0, 0x4, 0x90, 0xb2, 0x9, 0x30, 0x0, 0x0, - 0x57, 0x0, 0xb0, 0x5, 0x9c, 0x71, 0x16, 0x32, - 0x55, 0xc5, 0x56, 0x3, 0x40, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0x3, 0x55, 0x55, 0xc5, - 0x55, 0x6e, 0x20, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5831 "報" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x20, 0xa, 0x55, 0x59, 0x50, 0x5, 0x5c, - 0x59, 0x1b, 0x0, 0x8, 0x30, 0x0, 0xa, 0x0, - 0xb, 0x0, 0xa, 0x10, 0x25, 0x5c, 0x57, 0x7b, - 0x2, 0xac, 0x0, 0x1, 0x60, 0x35, 0xb, 0x0, - 0x11, 0x0, 0x0, 0x85, 0x72, 0xc, 0x75, 0x5a, - 0x80, 0x6, 0x68, 0x79, 0x3b, 0x40, 0xb, 0x0, - 0x0, 0xa, 0x0, 0xb, 0x7, 0x74, 0x0, 0x25, - 0x5c, 0x57, 0x6b, 0x7, 0xa0, 0x0, 0x1, 0xa, - 0x0, 0xb, 0xa, 0xb3, 0x0, 0x0, 0xa, 0x0, - 0xb, 0x71, 0x1d, 0x80, 0x0, 0xa, 0x10, 0xb, - 0x0, 0x2, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5834 "場" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0xa4, 0x0, 0xc5, 0x55, 0x5d, 0x0, 0x0, 0xa2, - 0x0, 0xb0, 0x0, 0xc, 0x0, 0x0, 0xa2, 0x0, - 0xc5, 0x55, 0x5c, 0x0, 0x36, 0xc6, 0x92, 0xd5, - 0x55, 0x5c, 0x0, 0x0, 0xa2, 0x0, 0x60, 0x0, - 0x5, 0x10, 0x0, 0xa2, 0x16, 0x5a, 0x55, 0x56, - 0x90, 0x0, 0xa2, 0x0, 0x7a, 0x55, 0x56, 0x50, - 0x0, 0xa5, 0x67, 0x65, 0x76, 0x66, 0x50, 0x27, - 0xb4, 0x42, 0x28, 0xb, 0x8, 0x20, 0x47, 0x0, - 0x4, 0x60, 0x92, 0xb, 0x0, 0x0, 0x0, 0x12, - 0x8, 0x30, 0xc, 0x0, 0x0, 0x0, 0x3, 0x61, - 0x6, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+584A "塊" */ - 0x0, 0x10, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0xa3, 0x0, 0x4, 0x80, 0x0, 0x0, 0x0, 0xa2, - 0xa, 0x57, 0x85, 0x5c, 0x0, 0x0, 0xa2, 0xb, - 0x0, 0xc0, 0xc, 0x0, 0x25, 0xc7, 0x8b, 0x55, - 0xd5, 0x5c, 0x0, 0x1, 0xa2, 0xb, 0x0, 0xc0, - 0xc, 0x0, 0x0, 0xa2, 0xb, 0x1, 0xb0, 0xc, - 0x0, 0x0, 0xa2, 0x9, 0x48, 0xe8, 0x47, 0x0, - 0x0, 0xa2, 0x40, 0xa, 0x84, 0x82, 0x0, 0x1, - 0xb8, 0x10, 0x39, 0x65, 0x74, 0x0, 0x5d, 0x30, - 0x1, 0xa0, 0x6c, 0x79, 0x50, 0x1, 0x0, 0x19, - 0x10, 0x66, 0x2, 0x80, 0x0, 0x3, 0x50, 0x0, - 0x3b, 0x89, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5869 "塩" */ - 0x0, 0x30, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xb1, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, 0xb0, - 0x0, 0xc5, 0x55, 0x5c, 0x40, 0x0, 0xb0, 0x6, - 0x20, 0x0, 0x0, 0x0, 0x36, 0xd7, 0x56, 0x85, - 0x55, 0x5a, 0x0, 0x0, 0xb0, 0x10, 0xb0, 0x0, - 0xb, 0x0, 0x0, 0xb0, 0x0, 0xb0, 0x0, 0xb, - 0x0, 0x0, 0xb0, 0x1, 0xa5, 0x55, 0x58, 0x0, - 0x0, 0xb1, 0x45, 0x55, 0x55, 0x58, 0x20, 0x3, - 0xc6, 0xb, 0xa, 0xa, 0xa, 0x10, 0x4b, 0x10, - 0xb, 0xa, 0xa, 0xa, 0x10, 0x0, 0x0, 0xb, - 0xa, 0xa, 0xa, 0x10, 0x0, 0x0, 0x4c, 0x5c, - 0x5c, 0x5b, 0xc1, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+5883 "境" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x2b, 0x0, 0x0, 0x92, 0x1, 0x0, 0x0, 0x29, - 0x1, 0x65, 0x65, 0x68, 0x50, 0x0, 0x29, 0x0, - 0x9, 0x20, 0xc2, 0x0, 0x5, 0x6b, 0xa3, 0x15, - 0x44, 0x51, 0x70, 0x0, 0x29, 0x5, 0x54, 0x44, - 0x45, 0x41, 0x0, 0x29, 0x0, 0xb5, 0x55, 0x5e, - 0x10, 0x0, 0x29, 0x0, 0xb5, 0x55, 0x5c, 0x0, - 0x0, 0x29, 0x13, 0xb0, 0x0, 0xc, 0x0, 0x6, - 0xa9, 0x30, 0xc7, 0x78, 0x5c, 0x0, 0x6, 0x10, - 0x0, 0x9, 0x4b, 0x0, 0x50, 0x0, 0x0, 0x0, - 0x2c, 0xb, 0x0, 0x71, 0x0, 0x0, 0x37, 0x81, - 0x6, 0xb9, 0xd4, 0x0, 0x2, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+5897 "増" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb3, 0x0, 0x49, 0x0, 0x7a, 0x0, 0x0, 0xb1, - 0x0, 0x9, 0x61, 0x80, 0x0, 0x0, 0xb1, 0x8, - 0x56, 0x77, 0x55, 0x90, 0x13, 0xc5, 0x6c, 0x0, - 0xb0, 0x2, 0xa0, 0x13, 0xb2, 0x1c, 0x55, 0xc5, - 0x56, 0xa0, 0x0, 0xb1, 0xc, 0x0, 0xb0, 0x2, - 0xa0, 0x0, 0xb1, 0xa, 0x55, 0x55, 0x56, 0x70, - 0x0, 0xb1, 0x1, 0x85, 0x55, 0x5a, 0x0, 0x0, - 0xb8, 0x61, 0xa0, 0x0, 0xc, 0x0, 0x4c, 0xa1, - 0x0, 0xc5, 0x55, 0x5c, 0x0, 0x15, 0x0, 0x0, - 0xa0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x1, 0xc5, - 0x55, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x2, 0x0, - - /* U+589E "增" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, - 0x2b, 0x0, 0x9, 0x30, 0x67, 0x0, 0x0, 0x19, - 0x0, 0x22, 0x50, 0x70, 0x30, 0x0, 0x19, 0x0, - 0xc5, 0x5c, 0x55, 0xc0, 0x6, 0x6b, 0xa4, 0xe5, - 0xa, 0x28, 0xa0, 0x0, 0x19, 0x0, 0xad, 0xa, - 0x61, 0xa0, 0x0, 0x19, 0x0, 0xa2, 0xa, 0x10, - 0xa0, 0x0, 0x19, 0x0, 0x95, 0x55, 0x55, 0x80, - 0x0, 0x19, 0x0, 0x56, 0x55, 0x5b, 0x10, 0x0, - 0x3d, 0x63, 0x55, 0x0, 0xb, 0x0, 0xc, 0x91, - 0x0, 0x58, 0x55, 0x5c, 0x0, 0x1, 0x0, 0x0, - 0x55, 0x0, 0xb, 0x0, 0x0, 0x0, 0x0, 0x58, - 0x55, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+58CA "壊" */ - 0x0, 0x10, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - 0xb2, 0x0, 0x0, 0xd1, 0x2, 0x20, 0x0, 0xb0, - 0x26, 0x55, 0xd5, 0x56, 0x50, 0x0, 0xb0, 0x5, - 0x55, 0xd5, 0x58, 0x20, 0x25, 0xc6, 0x8a, 0xa, - 0xa, 0xa, 0x0, 0x1, 0xb0, 0xa, 0xa, 0xa, - 0xa, 0x0, 0x0, 0xb0, 0xb, 0x59, 0x59, 0x5c, - 0x0, 0x0, 0xb0, 0x1, 0x0, 0xa1, 0x3, 0x0, - 0x0, 0xb0, 0x26, 0x5b, 0x95, 0x58, 0x20, 0x0, - 0xb6, 0x50, 0x86, 0x24, 0x1b, 0x0, 0x2a, 0x91, - 0x7, 0xc3, 0x9, 0x71, 0x0, 0x5, 0x2, 0x62, - 0x73, 0x42, 0xd4, 0x0, 0x0, 0x1, 0x0, 0x8a, - 0x10, 0x3e, 0x91, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+58D3 "壓" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0xc, - 0x55, 0x55, 0x55, 0x65, 0x83, 0x0, 0xb3, 0x95, - 0x5b, 0xa, 0x27, 0x0, 0xb, 0x39, 0x55, 0xa0, - 0xa0, 0x52, 0x0, 0xb3, 0x75, 0x57, 0x5c, 0x59, - 0x0, 0x9, 0x67, 0x55, 0xb0, 0xa4, 0x0, 0x3, - 0x76, 0x85, 0x5a, 0x9, 0x60, 0x0, 0x62, 0x68, - 0x55, 0xa5, 0x45, 0x50, 0x8, 0x6, 0x40, 0x5a, - 0x60, 0xc, 0x42, 0x30, 0x31, 0x1, 0x70, 0x0, - 0x10, 0x0, 0x25, 0x55, 0x6b, 0x55, 0xa0, 0x0, - 0x0, 0x10, 0x1, 0x80, 0x0, 0x0, 0x4, 0x55, - 0x55, 0x6b, 0x55, 0x5c, 0x80, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+58EB "士" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, - 0x0, 0x0, 0x0, 0x15, 0x55, 0x55, 0xc7, 0x55, - 0x5c, 0x90, 0x1, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x55, 0x55, - 0xc7, 0x55, 0xaa, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+58F0 "声" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x25, 0x55, 0x55, - 0xd5, 0x55, 0x7b, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0x65, 0x55, 0xb5, 0x58, 0x80, - 0x0, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, - 0xd5, 0x55, 0xd5, 0x55, 0xd0, 0x0, 0xc, 0x0, - 0xc, 0x0, 0xc, 0x0, 0x0, 0xd5, 0x55, 0xa5, - 0x55, 0xd0, 0x0, 0x1b, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x4, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x53, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+58F2 "売" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x20, 0x2, 0x10, 0x2, 0x65, 0x55, - 0xc6, 0x55, 0x86, 0x0, 0x0, 0x0, 0xa, 0x10, - 0x21, 0x0, 0x0, 0x16, 0x55, 0x75, 0x57, 0x40, - 0x0, 0x55, 0x55, 0x55, 0x55, 0x55, 0x82, 0xa, - 0x10, 0x0, 0x0, 0x0, 0xa, 0x20, 0x80, 0x6, - 0x60, 0x36, 0x1, 0x10, 0x0, 0x0, 0x86, 0x4, - 0x80, 0x0, 0x0, 0x0, 0x9, 0x30, 0x48, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0x4, 0x80, 0x4, 0x0, - 0x0, 0x58, 0x0, 0x38, 0x0, 0x52, 0x0, 0x66, - 0x0, 0x2, 0xea, 0xac, 0x51, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5909 "変" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5a, 0x0, 0x0, 0x30, 0x4, 0x65, - 0x58, 0x59, 0x68, 0x56, 0xb3, 0x0, 0x2, 0x1c, - 0x0, 0x3b, 0x0, 0x0, 0x0, 0x1c, 0x4c, 0x0, - 0x3c, 0x86, 0x0, 0x0, 0x91, 0x1c, 0x0, 0x3b, - 0x8, 0xb0, 0x5, 0x0, 0xa, 0x10, 0x11, 0x0, - 0x50, 0x0, 0x0, 0x4e, 0x65, 0x55, 0x91, 0x0, - 0x0, 0x2, 0x95, 0x0, 0x7, 0xc2, 0x0, 0x0, - 0x35, 0x4, 0x60, 0x7a, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x6d, 0x80, 0x0, 0x0, 0x0, 0x0, 0x17, - 0x94, 0xa9, 0x40, 0x0, 0x1, 0x56, 0x61, 0x0, - 0x3, 0x9e, 0xe5, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, - - /* U+590F "夏" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x3, - 0x65, 0x55, 0xa5, 0x55, 0x5a, 0x20, 0x0, 0x7, - 0x56, 0x85, 0x55, 0x90, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd, 0x55, 0x55, - 0x55, 0xc0, 0x0, 0x0, 0xd, 0x55, 0x55, 0x55, - 0xc0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xc, 0x6e, 0x55, 0x55, 0x80, 0x0, - 0x0, 0x0, 0x99, 0x55, 0x5c, 0x20, 0x0, 0x0, - 0x6, 0x55, 0x10, 0xa6, 0x0, 0x0, 0x0, 0x64, - 0x0, 0x9a, 0x50, 0x0, 0x0, 0x3, 0x10, 0x5, - 0x97, 0xa6, 0x20, 0x0, 0x1, 0x56, 0x72, 0x0, - 0x6, 0xbe, 0x92, 0x12, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5915 "夕" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x55, - 0x57, 0xd1, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x8a, - 0x0, 0x0, 0xc, 0x10, 0x0, 0xe, 0x20, 0x0, - 0x7, 0x88, 0x0, 0x7, 0x90, 0x0, 0x3, 0x70, - 0x5d, 0x1, 0xe1, 0x0, 0x1, 0x60, 0x0, 0xc2, - 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x79, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xa5, 0x0, 0x0, 0x0, 0x1, 0x57, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5916 "外" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe2, 0x0, 0xd, 0x10, 0x0, 0x0, 0x3c, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x8, 0x60, 0x23, 0xc, - 0x0, 0x0, 0x0, 0xc5, 0x5a, 0xb0, 0xc0, 0x0, - 0x0, 0x48, 0x0, 0xc2, 0xd, 0x10, 0x0, 0xa, - 0x84, 0x1c, 0x0, 0xc6, 0xa2, 0x4, 0x40, 0xd7, - 0x50, 0xc, 0x3, 0xe1, 0x30, 0x1, 0xc0, 0x0, - 0xc0, 0x4, 0x0, 0x0, 0x65, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x29, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x27, 0x0, 0x0, 0xc, 0x0, 0x0, 0x34, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x0, 0x0, - - /* U+591A "多" */ - 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x50, 0x0, 0x0, 0x0, 0x1, 0xb8, 0x55, - 0x59, 0xb0, 0x0, 0x48, 0x72, 0x0, 0x5c, 0x10, - 0x15, 0x20, 0x1b, 0x8, 0x80, 0x0, 0x0, 0x0, - 0x6, 0xa3, 0x0, 0x0, 0x0, 0x37, 0x86, 0xc1, - 0x0, 0x0, 0x24, 0x20, 0x2d, 0x95, 0x55, 0x93, - 0x0, 0x5, 0xb2, 0x0, 0x4, 0xc2, 0x2, 0x75, - 0x38, 0x0, 0x4b, 0x10, 0x2, 0x0, 0xd, 0x7, - 0x90, 0x0, 0x0, 0x0, 0x17, 0x93, 0x0, 0x0, - 0x3, 0x56, 0x62, 0x0, 0x0, 0x0, 0x21, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+591C "夜" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x5, 0x55, - 0x55, 0x58, 0x55, 0x57, 0xb0, 0x1, 0x2, 0xc0, - 0x1d, 0x0, 0x0, 0x0, 0x0, 0x9, 0x60, 0x68, - 0x0, 0x14, 0x0, 0x0, 0x1c, 0x0, 0xb5, 0x55, - 0x99, 0x0, 0x0, 0x8e, 0x3, 0x93, 0x60, 0xb2, - 0x0, 0x2, 0x7c, 0x9, 0x60, 0xb1, 0xb0, 0x0, - 0x6, 0xc, 0x52, 0x16, 0x8, 0x50, 0x0, 0x0, - 0xc, 0x0, 0x6, 0x5b, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xf6, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x19, 0x4a, 0x92, 0x0, 0x0, 0xc, 0x5, 0x70, - 0x0, 0x6e, 0xc2, 0x0, 0x4, 0x30, 0x0, 0x0, - 0x0, 0x10, - - /* U+5920 "夠" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x30, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x77, - 0x58, 0xc4, 0x90, 0x0, 0x10, 0x5, 0x84, 0xc, - 0x2a, 0x55, 0x55, 0xd0, 0x11, 0x6, 0xa3, 0x53, - 0x0, 0x0, 0xb0, 0x0, 0x9, 0x52, 0x42, 0x0, - 0x40, 0xb0, 0x4, 0x77, 0xa0, 0x1b, 0x55, 0xc0, - 0xb0, 0x11, 0x2b, 0x57, 0xeb, 0x0, 0xb0, 0xb0, - 0x1, 0xb1, 0x9, 0x5a, 0x0, 0xb0, 0xb0, 0x16, - 0x1b, 0x2b, 0xb, 0x55, 0xb1, 0xa0, 0x0, 0x3, - 0xb2, 0x0, 0x0, 0x3, 0x80, 0x0, 0x19, 0x30, - 0x0, 0x12, 0x17, 0x60, 0x4, 0x60, 0x0, 0x0, - 0x5, 0xde, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+5927 "大" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x2, 0x10, 0x6, 0x55, 0x55, 0xe5, - 0x55, 0x59, 0x80, 0x0, 0x0, 0x0, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x87, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x31, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, - 0xb2, 0x0, 0xa, 0x40, 0x0, 0x0, 0x1a, 0x30, - 0x0, 0x1, 0xda, 0x30, 0x5, 0x70, 0x0, 0x0, - 0x0, 0xa, 0x70, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5929 "天" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x45, 0x55, 0x55, 0x55, 0xd4, 0x0, 0x0, 0x10, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x1b, 0x10, 0x6, 0x55, 0x56, 0xc8, 0x55, 0x55, - 0x30, 0x0, 0x0, 0x6, 0x75, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x21, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x3a, 0x0, 0x82, 0x0, 0x0, 0x0, 0x0, - 0xb1, 0x0, 0x1c, 0x30, 0x0, 0x0, 0x9, 0x10, - 0x0, 0x3, 0xe8, 0x20, 0x3, 0x70, 0x0, 0x0, - 0x0, 0x2c, 0xa1, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+592A "太" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb1, 0x0, 0x3, 0x10, 0x5, 0x65, 0x55, 0xd7, - 0x55, 0x5a, 0x70, 0x0, 0x0, 0x0, 0xd6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xa2, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x8, 0x50, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x65, 0x0, 0x0, 0x0, - 0x0, 0x87, 0x10, 0xc, 0x10, 0x0, 0x0, 0x4, - 0x80, 0xb5, 0x3, 0xc1, 0x0, 0x0, 0x47, 0x0, - 0x1e, 0x0, 0x6e, 0x60, 0x5, 0x30, 0x0, 0x2, - 0x0, 0x6, 0x71, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+592B "夫" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x93, 0x0, 0x1, 0x0, 0x0, 0x55, 0x55, - 0xb7, 0x55, 0x87, 0x0, 0x0, 0x0, 0x0, 0xa3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, - 0x2, 0x0, 0x6, 0x55, 0x55, 0xd6, 0x55, 0x5b, - 0x80, 0x0, 0x0, 0x1, 0xd4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x70, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0x0, 0x72, 0x0, 0x0, 0x0, 0x0, - 0xa3, 0x0, 0xb, 0x20, 0x0, 0x0, 0x19, 0x20, - 0x0, 0x2, 0xe7, 0x10, 0x4, 0x50, 0x0, 0x0, - 0x0, 0x2c, 0x80, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+592E "央" */ - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3a, 0x0, 0x0, 0x0, 0x0, 0xa, 0x55, - 0x7c, 0x55, 0xc2, 0x0, 0x0, 0xd, 0x0, 0x39, - 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x39, 0x0, - 0xd0, 0x0, 0x0, 0xd, 0x0, 0x48, 0x0, 0xd0, - 0x10, 0x4, 0x6b, 0x55, 0x9a, 0x55, 0xb8, 0xb0, - 0x0, 0x0, 0x0, 0x94, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xc0, 0x71, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x30, 0x1b, 0x10, 0x0, 0x0, 0x2, 0x93, - 0x0, 0x2, 0xd7, 0x20, 0x2, 0x65, 0x0, 0x0, - 0x0, 0x1a, 0xb1, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5931 "失" */ - 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, 0xe, - 0x20, 0x93, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x55, - 0xb7, 0x55, 0xd4, 0x0, 0x0, 0x72, 0x0, 0xa3, - 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0xb1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x9, - 0x30, 0x6, 0x55, 0x55, 0xd8, 0x55, 0x55, 0x40, - 0x0, 0x0, 0x4, 0x83, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x10, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x67, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x6, 0x70, - 0x0, 0x4, 0xc4, 0x0, 0x2, 0x73, 0x0, 0x0, - 0x0, 0x4e, 0x90, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+5947 "奇" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, 0x0, 0x55, - 0x55, 0xd6, 0x55, 0x7b, 0x0, 0x0, 0x10, 0x5, - 0x96, 0x30, 0x0, 0x0, 0x0, 0x0, 0x58, 0x0, - 0x5c, 0x80, 0x0, 0x0, 0x46, 0x30, 0x0, 0x0, - 0x92, 0x80, 0x6, 0x55, 0x55, 0x55, 0x55, 0xc5, - 0x62, 0x0, 0x3, 0x0, 0x4, 0x0, 0xc0, 0x0, - 0x0, 0xd, 0x55, 0x5d, 0x10, 0xc0, 0x0, 0x0, - 0xc, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x0, 0xd, - 0x55, 0x5d, 0x0, 0xc0, 0x0, 0x0, 0xa, 0x0, - 0x5, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5d, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+5951 "契" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x10, 0x0, 0x0, 0x20, 0x3, 0x65, - 0xc5, 0x93, 0x6b, 0x56, 0xd0, 0x0, 0x0, 0xb1, - 0x30, 0xc, 0x2, 0xa0, 0x0, 0x65, 0xc5, 0x40, - 0x48, 0x4, 0x80, 0x3, 0x55, 0xc5, 0xa2, 0xb1, - 0x6, 0x60, 0x0, 0x0, 0xb0, 0x8, 0x33, 0x6c, - 0x20, 0x0, 0x0, 0xc1, 0x70, 0x0, 0x55, 0x0, - 0x0, 0x0, 0x0, 0x95, 0x0, 0x5, 0x40, 0x5, - 0x65, 0x55, 0xd8, 0x55, 0x55, 0x50, 0x0, 0x0, - 0x7, 0x50, 0x80, 0x0, 0x0, 0x0, 0x0, 0x77, - 0x0, 0x1a, 0x60, 0x0, 0x0, 0x58, 0x30, 0x0, - 0x0, 0x8e, 0xb2, 0x4, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x10, - - /* U+5957 "套" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xd1, 0x0, 0x2, 0x0, 0x2, 0x65, - 0x5c, 0x85, 0x65, 0x5b, 0x20, 0x0, 0x0, 0x59, - 0x0, 0x53, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, - 0x1a, 0x60, 0x0, 0x0, 0x56, 0xc5, 0x55, 0x66, - 0x7e, 0x91, 0x15, 0x20, 0xc5, 0x55, 0x79, 0x2, - 0x20, 0x0, 0x0, 0xc0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0xc5, 0x55, 0x58, 0x30, 0x0, 0x5, - 0x55, 0xd5, 0x55, 0x55, 0x5c, 0x90, 0x1, 0x0, - 0xa, 0x60, 0x30, 0x0, 0x0, 0x0, 0x0, 0x73, - 0x0, 0x9, 0x90, 0x0, 0x0, 0x9, 0xc9, 0x76, - 0x54, 0x87, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+5973 "女" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xa0, 0x0, 0x0, 0x10, 0x5, 0x55, 0x5a, 0x85, - 0x55, 0x59, 0xc0, 0x0, 0x0, 0xc, 0x0, 0xb, - 0x40, 0x0, 0x0, 0x0, 0x48, 0x0, 0xe, 0x0, - 0x0, 0x0, 0x0, 0xa2, 0x0, 0x69, 0x0, 0x0, - 0x0, 0x1, 0xd1, 0x0, 0xc2, 0x0, 0x0, 0x0, - 0x0, 0x16, 0x89, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4c, 0xab, 0x50, 0x0, 0x0, 0x0, 0x8, - 0x80, 0x3, 0xdb, 0x0, 0x0, 0x36, 0x71, 0x0, - 0x0, 0xa, 0x10, 0x3, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5979 "她" */ - 0x0, 0x3, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0xe, 0x10, 0x0, 0xd, 0x0, 0x0, 0x0, 0x1b, - 0x0, 0x14, 0xb, 0x0, 0x0, 0x0, 0x38, 0x3, - 0x2a, 0xb, 0x1, 0x0, 0x6, 0x98, 0x6b, 0x19, - 0xc, 0x5d, 0x20, 0x0, 0x73, 0x38, 0x7b, 0x5b, - 0xb, 0x0, 0x0, 0xa0, 0x65, 0x19, 0xb, 0xc, - 0x0, 0x0, 0xa0, 0x82, 0x19, 0xb, 0xc, 0x0, - 0x0, 0x90, 0xb0, 0x19, 0xb, 0x5c, 0x0, 0x2, - 0x93, 0xa0, 0x19, 0xc, 0x24, 0x10, 0x0, 0xa, - 0xc3, 0x19, 0xb, 0x0, 0x50, 0x0, 0x27, 0x1d, - 0x2a, 0x0, 0x0, 0x90, 0x2, 0x70, 0x1, 0xd, - 0xa9, 0x9a, 0xd1, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+597D "好" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x10, 0x0, 0x0, 0x4, 0x0, 0x0, 0xc, - 0x0, 0x25, 0x55, 0x6e, 0x30, 0x0, 0x29, 0x3, - 0x0, 0x0, 0x81, 0x0, 0x15, 0x99, 0x5d, 0x10, - 0x8, 0x30, 0x0, 0x0, 0x92, 0xb, 0x0, 0xc, - 0x0, 0x0, 0x0, 0xa0, 0x38, 0x0, 0xc, 0x0, - 0x70, 0x0, 0x90, 0x75, 0x55, 0x5d, 0x55, 0x51, - 0x4, 0x50, 0xb0, 0x0, 0xc, 0x0, 0x0, 0x2, - 0x67, 0xb0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x9, - 0xba, 0x0, 0xc, 0x0, 0x0, 0x0, 0x65, 0x8, - 0x40, 0xc, 0x0, 0x0, 0x6, 0x30, 0x0, 0x6, - 0xbc, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x31, - 0x0, 0x0, - - /* U+5982 "如" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x50, 0x95, 0x55, 0xc0, 0x6, 0x5d, 0x55, 0xd0, - 0xb0, 0x0, 0xb0, 0x0, 0x29, 0x2, 0xa0, 0xb0, - 0x0, 0xb0, 0x0, 0x65, 0x5, 0x70, 0xb0, 0x0, - 0xb0, 0x0, 0x91, 0x8, 0x40, 0xb0, 0x0, 0xb0, - 0x0, 0xb0, 0xb, 0x0, 0xb0, 0x0, 0xb0, 0x0, - 0x57, 0x7b, 0x0, 0xb0, 0x0, 0xb0, 0x0, 0x0, - 0x9b, 0xa0, 0xc5, 0x55, 0xb0, 0x0, 0x7, 0x40, - 0x73, 0xb0, 0x0, 0xb0, 0x2, 0x72, 0x0, 0x0, - 0x40, 0x0, 0x10, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5987 "妇" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x12, 0x22, 0x22, 0x60, 0x0, 0x2a, 0x2, - 0x44, 0x33, 0x34, 0xb0, 0x5, 0x89, 0x5b, 0x50, - 0x0, 0x2, 0xa0, 0x0, 0x83, 0xb, 0x0, 0x0, - 0x2, 0xa0, 0x0, 0xb0, 0xb, 0x6, 0x55, 0x56, - 0xa0, 0x0, 0xb0, 0x1a, 0x0, 0x0, 0x2, 0xa0, - 0x1, 0x92, 0x65, 0x0, 0x0, 0x2, 0xa0, 0x0, - 0x6, 0xe4, 0x0, 0x0, 0x2, 0xa0, 0x0, 0x3, - 0x9c, 0x30, 0x0, 0x2, 0xa0, 0x0, 0x19, 0x1, - 0x46, 0x55, 0x56, 0xa0, 0x1, 0x70, 0x0, 0x0, - 0x0, 0x1, 0x80, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+59B3 "妳" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2d, 0x0, 0x5, 0x90, 0x0, 0x0, 0x0, 0x58, - 0x0, 0x9, 0x50, 0x0, 0x0, 0x0, 0x83, 0x3, - 0xd, 0x44, 0x44, 0x70, 0x36, 0xd5, 0x7b, 0x37, - 0x0, 0x5, 0x90, 0x0, 0xb0, 0x56, 0x70, 0x6, - 0x15, 0x0, 0x5, 0x60, 0x93, 0x20, 0xc, 0x0, - 0x0, 0x9, 0x10, 0xc0, 0x7, 0x1c, 0x3, 0x0, - 0xb, 0x1, 0xa0, 0x1c, 0xc, 0x7, 0x50, 0x1, - 0x7b, 0x60, 0x63, 0xc, 0x0, 0xd1, 0x0, 0x1b, - 0xc6, 0x50, 0xc, 0x0, 0x50, 0x0, 0x91, 0x5, - 0x0, 0xc, 0x0, 0x0, 0x7, 0x10, 0x0, 0x3, - 0xad, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x12, - 0x0, 0x0, - - /* U+59B9 "妹" */ - 0x0, 0x2, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0xc, 0x20, 0x0, 0xd, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x38, 0x4, - 0x26, 0x5c, 0x58, 0x40, 0x6, 0xa7, 0x5d, 0x0, - 0xb, 0x0, 0x0, 0x0, 0xa0, 0x29, 0x0, 0xb, - 0x0, 0x50, 0x0, 0xa0, 0x56, 0x65, 0xbd, 0x75, - 0x52, 0x3, 0x60, 0x92, 0x0, 0xcb, 0x60, 0x0, - 0x7, 0x40, 0xb0, 0x6, 0x5b, 0x61, 0x0, 0x0, - 0x5a, 0x90, 0xa, 0xb, 0x19, 0x0, 0x0, 0x9, - 0x96, 0x72, 0xb, 0x8, 0x80, 0x0, 0x62, 0x6, - 0x30, 0xb, 0x0, 0xb5, 0x4, 0x30, 0x2, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+59BB "妻" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x9, 0x20, 0x6, 0x55, - 0x55, 0xd5, 0x55, 0x55, 0x30, 0x0, 0x25, 0x55, - 0xd5, 0x55, 0x90, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x1, 0xa0, 0x40, 0x7, 0x55, 0x55, 0xd5, 0x56, - 0xc6, 0x81, 0x0, 0x0, 0x0, 0xc0, 0x1, 0xb0, - 0x0, 0x0, 0x36, 0x5c, 0x65, 0x55, 0x70, 0x0, - 0x25, 0x55, 0x6d, 0x55, 0x55, 0x57, 0xc1, 0x1, - 0x0, 0x92, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x1, - 0x85, 0x56, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x99, 0x9c, 0x92, 0x0, 0x3, 0x55, 0x66, 0x10, - 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+59C9 "姉" */ - 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x3, - 0xc0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x66, 0x0, - 0x0, 0xb, 0x0, 0x0, 0xa, 0x20, 0x25, 0x55, - 0xc5, 0x95, 0x36, 0xd5, 0x89, 0x10, 0xb, 0x0, - 0x0, 0x29, 0x7, 0x52, 0x0, 0xb0, 0x30, 0x6, - 0x50, 0xa1, 0xb5, 0x5c, 0x5b, 0x20, 0xa0, 0xb, - 0xb, 0x0, 0xb0, 0xa1, 0xb, 0x3, 0x80, 0xb0, - 0xb, 0xa, 0x10, 0x38, 0xc4, 0xb, 0x0, 0xb0, - 0xa1, 0x0, 0x2a, 0xc5, 0xb0, 0xb, 0x4c, 0x10, - 0x9, 0x0, 0x54, 0x0, 0xb3, 0x70, 0x7, 0x10, - 0x0, 0x0, 0xc, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, - - /* U+59CB "始" */ - 0x0, 0x1, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0xd, 0x20, 0x0, 0x97, 0x0, 0x0, 0x0, 0x1b, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x47, 0x3, - 0x5, 0x50, 0x43, 0x0, 0x16, 0xb7, 0x5e, 0x19, - 0x0, 0xb, 0x40, 0x0, 0xb0, 0x1a, 0x8c, 0x86, - 0x56, 0xc0, 0x1, 0x90, 0x57, 0x13, 0x0, 0x0, - 0x30, 0x6, 0x50, 0x92, 0x7, 0x55, 0x59, 0x20, - 0x9, 0x20, 0xc0, 0xc, 0x0, 0xb, 0x0, 0x0, - 0x5b, 0xa0, 0xc, 0x0, 0xb, 0x0, 0x0, 0xb, - 0x9b, 0xc, 0x0, 0xb, 0x0, 0x0, 0x82, 0x8, - 0xd, 0x55, 0x5d, 0x0, 0x6, 0x20, 0x0, 0xc, - 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+59D0 "姐" */ - 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x20, 0x8, 0x55, 0x59, 0x10, 0x0, 0x1c, - 0x0, 0xc, 0x0, 0xc, 0x0, 0x2, 0x69, 0x26, - 0xc, 0x0, 0xc, 0x0, 0x3, 0xa5, 0x3d, 0x1c, - 0x0, 0xc, 0x0, 0x0, 0xb0, 0xb, 0xd, 0x55, - 0x5d, 0x0, 0x1, 0x90, 0x48, 0xc, 0x0, 0xc, - 0x0, 0x6, 0x40, 0x83, 0xc, 0x0, 0xc, 0x0, - 0x9, 0x20, 0xb0, 0xd, 0x55, 0x5d, 0x0, 0x0, - 0x4a, 0xb0, 0xc, 0x0, 0xc, 0x0, 0x0, 0xb, - 0x6c, 0x1c, 0x0, 0xc, 0x0, 0x0, 0x82, 0x4, - 0x2c, 0x0, 0xc, 0x20, 0x6, 0x10, 0x5, 0x68, - 0x55, 0x58, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+59D4 "委" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, - 0x3, 0x46, 0x79, 0x99, 0x81, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0x0, 0x0, 0x10, 0x5, 0x65, 0x55, - 0x9c, 0x65, 0x57, 0xc1, 0x0, 0x0, 0xa, 0x7a, - 0x62, 0x0, 0x0, 0x0, 0x1, 0xa4, 0x1a, 0x8, - 0x92, 0x0, 0x0, 0x57, 0x10, 0x57, 0x0, 0x4d, - 0xd3, 0x4, 0x10, 0x5, 0xc0, 0x0, 0x0, 0x50, - 0x7, 0x55, 0x6c, 0x65, 0x5a, 0x56, 0xa2, 0x0, - 0x0, 0xa3, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, - 0x55, 0x77, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6a, 0x7d, 0xa3, 0x0, 0x0, 0x25, 0x68, 0x30, - 0x0, 0x6e, 0x20, 0x3, 0x20, 0x0, 0x0, 0x0, - 0x1, 0x10, - - /* U+5A18 "娘" */ - 0x0, 0x2, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0xb, 0x50, 0x0, 0x1c, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x8, 0x5b, 0x59, 0x10, 0x2, 0x4b, 0x36, - 0xb, 0x0, 0xb, 0x0, 0x3, 0x77, 0x2c, 0x1c, - 0x55, 0x5c, 0x0, 0x0, 0x92, 0xb, 0xb, 0x0, - 0xb, 0x0, 0x0, 0xb0, 0x28, 0xb, 0x0, 0xb, - 0x0, 0x1, 0x90, 0x64, 0xc, 0x58, 0x59, 0x10, - 0x4, 0x70, 0xa0, 0xb, 0x7, 0x6, 0xa0, 0x0, - 0x39, 0xc0, 0xb, 0x7, 0x65, 0x0, 0x0, 0x9, - 0x8c, 0xb, 0x2, 0xc1, 0x0, 0x0, 0x56, 0x4, - 0xc, 0x83, 0x4d, 0x71, 0x5, 0x50, 0x0, 0xc, - 0x10, 0x2, 0x81, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5A5A "婚" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x1d, 0x0, 0x22, 0x58, 0xb8, 0x0, 0x0, 0x48, - 0x0, 0xb3, 0x1b, 0x0, 0x0, 0x0, 0x74, 0x2, - 0xa1, 0x1b, 0x11, 0x50, 0x15, 0xc5, 0x88, 0xa4, - 0x4a, 0x64, 0x40, 0x0, 0xb0, 0x74, 0xa0, 0x23, - 0xa0, 0x40, 0x3, 0x70, 0xa1, 0xd9, 0x30, 0x5b, - 0xb0, 0x7, 0x30, 0xb0, 0x40, 0x0, 0x6, 0xa1, - 0xa, 0x12, 0x80, 0x97, 0x55, 0x5d, 0x10, 0x0, - 0x6c, 0x50, 0x93, 0x0, 0xb, 0x0, 0x0, 0x29, - 0xc4, 0x87, 0x55, 0x5c, 0x0, 0x0, 0x80, 0x16, - 0x93, 0x0, 0xb, 0x0, 0x6, 0x0, 0x0, 0x97, - 0x55, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+5A66 "婦" */ - 0x0, 0x11, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x5a, 0x0, 0x55, 0x55, 0x5d, 0x10, 0x0, 0x84, - 0x0, 0x15, 0x55, 0x5c, 0x0, 0x12, 0xb2, 0x42, - 0x1, 0x0, 0xb, 0x0, 0x15, 0xc3, 0xa6, 0x46, - 0x55, 0x5c, 0x0, 0x2, 0x80, 0xb4, 0x0, 0x0, - 0x0, 0x30, 0x7, 0x40, 0xb8, 0x55, 0x6b, 0x56, - 0xc1, 0xa, 0x1, 0x99, 0x20, 0x1a, 0x5, 0x0, - 0xa, 0x6, 0x50, 0xb5, 0x6b, 0x5d, 0x10, 0x0, - 0x7e, 0x30, 0xb0, 0x1a, 0xb, 0x0, 0x0, 0x38, - 0xc3, 0xb0, 0x1a, 0xb, 0x0, 0x1, 0x80, 0x13, - 0xb0, 0x1a, 0x6c, 0x0, 0x15, 0x0, 0x0, 0x0, - 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+5A92 "媒" */ - 0x0, 0x3, 0x0, 0x2, 0x0, 0x2, 0x0, 0x0, - 0xe, 0x10, 0x1c, 0x0, 0xd, 0x0, 0x0, 0x2a, - 0x3, 0x5c, 0x55, 0x5c, 0x91, 0x1, 0x67, 0x15, - 0xa, 0x0, 0xb, 0x0, 0x5, 0xb5, 0x5b, 0xc, - 0x55, 0x5b, 0x0, 0x0, 0xb0, 0x47, 0xa, 0x0, - 0xb, 0x0, 0x1, 0xa0, 0x73, 0x1c, 0x55, 0x5b, - 0x0, 0x4, 0x50, 0xa0, 0x2, 0x1c, 0x0, 0x0, - 0x7, 0x30, 0xa3, 0x65, 0x8d, 0x55, 0xa0, 0x0, - 0x4b, 0x80, 0x3, 0xbb, 0x50, 0x0, 0x0, 0x1a, - 0x97, 0x1b, 0x2a, 0x63, 0x0, 0x0, 0x81, 0x4, - 0x91, 0x1a, 0xa, 0x81, 0x6, 0x20, 0x36, 0x0, - 0x1b, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+5ABD "媽" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2c, 0x0, 0xa5, 0x58, 0x58, 0x60, 0x0, 0x67, - 0x0, 0xb0, 0xb, 0x0, 0x0, 0x0, 0x93, 0x2, - 0xb5, 0x5c, 0x59, 0x20, 0x26, 0xd5, 0x88, 0xb0, - 0xb, 0x0, 0x0, 0x1, 0xa0, 0x74, 0xb5, 0x5c, - 0x58, 0x40, 0x5, 0x60, 0xa1, 0xb0, 0xb, 0x0, - 0x0, 0x9, 0x20, 0xb0, 0xb5, 0x5b, 0x55, 0xa2, - 0xb, 0x3, 0x80, 0x40, 0x0, 0x20, 0xc0, 0x2, - 0x7c, 0x50, 0x24, 0x8, 0x29, 0xc0, 0x0, 0x1a, - 0xb4, 0x84, 0x78, 0x3a, 0xc0, 0x0, 0x80, 0x7, - 0x72, 0x51, 0x1, 0xc0, 0x6, 0x10, 0x0, 0x0, - 0x3, 0x9e, 0x60, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x0, - - /* U+5ACC "嫌" */ - 0x0, 0x42, 0x0, 0x10, 0x0, 0x40, 0x0, 0x0, - 0xa4, 0x0, 0xb, 0x4, 0x80, 0x0, 0x0, 0xb0, - 0x5, 0x5a, 0x59, 0x5a, 0x40, 0x13, 0xc3, 0x73, - 0xa, 0xa, 0x0, 0x0, 0x15, 0x92, 0xc1, 0x6c, - 0x5c, 0x5a, 0x0, 0x5, 0x50, 0xb0, 0xa, 0xa, - 0xa, 0x0, 0x8, 0x12, 0x85, 0x5c, 0x5c, 0x5c, - 0x80, 0xa, 0x5, 0x40, 0xa, 0xa, 0xa, 0x0, - 0xa, 0x19, 0x2, 0x7f, 0x5c, 0x79, 0x0, 0x0, - 0x7d, 0x20, 0x7d, 0xa, 0x60, 0x0, 0x0, 0x84, - 0xa3, 0x6a, 0xa, 0x27, 0x0, 0x4, 0x50, 0x16, - 0xa, 0xa, 0x9, 0x90, 0x24, 0x0, 0x30, 0xa, - 0xb, 0x0, 0x20, 0x0, 0x0, 0x0, 0x2, 0x1, - 0x0, 0x0, - - /* U+5B09 "嬉" */ - 0x0, 0x10, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, - 0x68, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x92, - 0x3, 0x65, 0x6b, 0x57, 0x70, 0x0, 0xb0, 0x31, - 0x12, 0x4a, 0x27, 0x0, 0x36, 0xc5, 0xb3, 0x43, - 0x22, 0x25, 0x0, 0x4, 0x70, 0xb0, 0xa5, 0x55, - 0x5d, 0x0, 0x8, 0x30, 0xb0, 0xa5, 0x55, 0x5c, - 0x0, 0xb, 0x3, 0x80, 0x25, 0x10, 0x72, 0x0, - 0xa, 0x8, 0x32, 0x26, 0x82, 0x72, 0x60, 0x5, - 0x8d, 0x4, 0x53, 0x33, 0x36, 0x30, 0x0, 0x69, - 0xd0, 0xb5, 0x55, 0x5d, 0x10, 0x1, 0x90, 0x30, - 0xb0, 0x0, 0xb, 0x0, 0x17, 0x0, 0x0, 0xb5, - 0x55, 0x5c, 0x0, 0x10, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+5B50 "子" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x16, 0x55, 0x55, 0x55, 0x7c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, - 0x0, 0x50, 0x6, 0x55, 0x55, 0x6c, 0x55, 0x56, - 0x92, 0x0, 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+5B57 "字" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x7, 0x0, 0x2, 0x60, 0x0, 0xa5, 0x55, - 0x55, 0x55, 0x5a, 0x90, 0x3, 0xc3, 0x55, 0x55, - 0x56, 0x73, 0x0, 0x0, 0x0, 0x10, 0x0, 0x2b, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x70, - 0x6, 0x55, 0x55, 0x6c, 0x55, 0x55, 0x72, 0x0, - 0x0, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xe8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x0, - - /* U+5B58 "存" */ - 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xa0, 0x0, 0x3, 0x0, 0x6, 0x55, - 0x5d, 0x65, 0x55, 0x6b, 0x30, 0x0, 0x0, 0x39, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x55, - 0x55, 0x95, 0x0, 0x0, 0x9, 0x60, 0x0, 0x4, - 0x82, 0x0, 0x0, 0x2e, 0x10, 0x0, 0x85, 0x0, - 0x0, 0x0, 0x9b, 0x10, 0x0, 0xc0, 0x0, 0x0, - 0x8, 0x1a, 0x26, 0x55, 0xd5, 0x58, 0x80, 0x30, - 0xa, 0x10, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xa, - 0x10, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xa, 0x20, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0xb, 0x20, 0x3b, - 0xd0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x1, 0x10, - 0x0, 0x0, - - /* U+5B63 "季" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x2, 0x47, 0xac, 0xc2, 0x0, 0x0, 0x3, - 0x43, 0x3a, 0x0, 0x0, 0x0, 0x5, 0x55, 0x55, - 0x5c, 0x55, 0x56, 0xd2, 0x0, 0x0, 0x8, 0x8a, - 0x71, 0x0, 0x0, 0x0, 0x0, 0x95, 0x1a, 0x9, - 0x71, 0x0, 0x0, 0x58, 0x10, 0x18, 0x0, 0x6d, - 0xd4, 0x4, 0x11, 0x65, 0x55, 0x5c, 0xa0, 0x20, - 0x0, 0x0, 0x0, 0x6, 0x61, 0x0, 0x0, 0x4, - 0x55, 0x55, 0x5d, 0x55, 0x58, 0xd1, 0x1, 0x0, - 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+5B66 "学" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x8, - 0x0, 0xa0, 0x0, 0xe2, 0x0, 0x0, 0x6b, 0x9, - 0x70, 0x66, 0x0, 0x0, 0x20, 0x90, 0x32, 0x8, - 0x0, 0x20, 0xa, 0x55, 0x55, 0x55, 0x65, 0x6f, - 0x25, 0xa0, 0x0, 0x0, 0x1, 0x16, 0x20, 0x32, - 0x46, 0x55, 0x55, 0xd8, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x38, 0x5, 0x65, 0x55, 0x5d, 0x55, 0x55, - 0x51, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x0, - - /* U+5B69 "孩" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x11, 0x15, 0x0, 0x59, 0x0, 0x0, 0x2, 0x43, - 0x89, 0x0, 0x9, 0x0, 0x70, 0x0, 0x1, 0x62, - 0x55, 0xd6, 0x55, 0x52, 0x0, 0xc, 0x0, 0x4, - 0x80, 0x21, 0x0, 0x0, 0xb, 0x2, 0x8, 0x0, - 0xc6, 0x0, 0x0, 0xc, 0x73, 0x8a, 0x68, 0xa0, - 0x0, 0x5, 0xac, 0x0, 0x0, 0x1b, 0x8, 0x50, - 0x1a, 0x1b, 0x0, 0x1, 0xa1, 0x3b, 0x0, 0x0, - 0xb, 0x0, 0x38, 0x11, 0xb1, 0x0, 0x0, 0xb, - 0x4, 0x30, 0x2b, 0x74, 0x0, 0x0, 0xb, 0x0, - 0x6, 0x80, 0xa, 0x70, 0x2, 0xc7, 0x25, 0x61, - 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5B6B "孫" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x14, 0x2, 0x57, 0x9b, 0x50, 0x4, 0x55, - 0xa9, 0x22, 0x88, 0x0, 0x0, 0x0, 0x1, 0x60, - 0x1, 0xa0, 0x32, 0x0, 0x0, 0x2b, 0x0, 0x39, - 0x44, 0xc4, 0x0, 0x0, 0x19, 0x0, 0x46, 0x4a, - 0x30, 0x0, 0x0, 0x1b, 0x62, 0x1, 0x91, 0x15, - 0x0, 0x5, 0xab, 0x0, 0x7b, 0x55, 0x58, 0x90, - 0x9, 0x29, 0x0, 0x55, 0x2b, 0x0, 0xa0, 0x0, - 0x19, 0x0, 0x17, 0xb, 0x30, 0x0, 0x0, 0x19, - 0x0, 0x95, 0xb, 0xa, 0x20, 0x0, 0x29, 0x5, - 0x40, 0xb, 0x2, 0xe0, 0x2, 0xd6, 0x11, 0x6, - 0xe9, 0x0, 0x60, 0x0, 0x10, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+5B78 "學" */ - 0x0, 0x0, 0x3, 0x2, 0x20, 0x0, 0x0, 0x0, - 0x29, 0x64, 0x3c, 0x45, 0xb4, 0x0, 0x0, 0x1b, - 0x72, 0x44, 0x65, 0xc1, 0x0, 0x0, 0x9, 0x0, - 0x24, 0x30, 0xa0, 0x0, 0x0, 0xc, 0x65, 0x3e, - 0x15, 0xc0, 0x0, 0x4, 0xa, 0x0, 0x53, 0x40, - 0xb0, 0x30, 0xa, 0x55, 0x55, 0x55, 0x55, 0x58, - 0xb0, 0x1c, 0x3, 0x55, 0x55, 0x7b, 0x4, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x4, - 0x55, 0x55, 0x6e, 0x55, 0x5b, 0x90, 0x1, 0x0, - 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+5B83 "它" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x28, 0x0, 0x1, 0x20, 0x3, 0x95, 0x55, - 0x55, 0x55, 0x5b, 0xb0, 0xc, 0x50, 0x0, 0x0, - 0x0, 0x7, 0x0, 0x2, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x2c, 0x20, - 0x0, 0x0, 0x0, 0xc0, 0x17, 0xa4, 0x10, 0x0, - 0x0, 0x0, 0xd5, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0xab, 0xaa, - 0xaa, 0xbc, 0x20, - - /* U+5B85 "宅" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x36, 0x0, 0x1, 0x20, 0x0, 0xa5, 0x55, - 0x55, 0x55, 0x5a, 0x90, 0x3, 0xc0, 0x0, 0x3, - 0x9d, 0x27, 0x0, 0x0, 0x34, 0x57, 0xd6, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0xc0, 0x2, 0x6e, 0x40, - 0x0, 0x14, 0x55, 0xd5, 0x53, 0x10, 0x0, 0x6, - 0x31, 0x0, 0xc0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, 0xbb, - 0xaa, 0xab, 0xc0, - - /* U+5B87 "宇" */ - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x68, 0x0, 0x0, 0x0, 0x3, 0x0, 0x1, - 0x70, 0x0, 0x23, 0x0, 0xa5, 0x55, 0x55, 0x55, - 0x5b, 0x80, 0x2c, 0x0, 0x0, 0x0, 0x2, 0x50, - 0x0, 0x5, 0x55, 0x58, 0x56, 0xa1, 0x0, 0x0, - 0x0, 0x1, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0x0, 0x3, 0x80, 0x55, 0x55, 0x56, 0xc5, - 0x55, 0x55, 0x10, 0x0, 0x0, 0x1a, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x3a, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x8f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x0, 0x0, - - /* U+5B88 "守" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x29, 0x0, 0x2, 0x0, 0xa, 0x55, 0x55, 0x55, - 0x55, 0xe7, 0x4, 0xb0, 0x0, 0x0, 0xa2, 0x35, - 0x0, 0x10, 0x0, 0x0, 0xd, 0x0, 0x20, 0x5, - 0x55, 0x55, 0x55, 0xe5, 0x5a, 0x70, 0x0, 0x40, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0xb, 0x40, 0xd, 0x0, - 0x0, 0x0, 0x0, 0x30, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4d, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x0, - - /* U+5B89 "安" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x8, 0x0, 0x3, 0x10, 0x0, 0x95, 0x55, - 0x55, 0x55, 0x5c, 0x60, 0x2, 0xb0, 0x3, 0x60, - 0x0, 0x14, 0x0, 0x0, 0x0, 0x8, 0x50, 0x0, - 0x0, 0x10, 0x5, 0x55, 0x5d, 0x55, 0x57, 0x59, - 0x90, 0x0, 0x0, 0x57, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x86, 0x0, 0x0, 0x0, - 0x1, 0x86, 0x33, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5e, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xa2, 0x6, 0xd8, 0x0, 0x0, 0x36, 0x84, 0x0, - 0x0, 0x1a, 0x50, 0x3, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5B8C "完" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x40, - 0x0, 0x26, 0x0, 0x0, 0x30, 0x0, 0xb5, 0x55, - 0x55, 0x55, 0x58, 0xa0, 0x3, 0x80, 0x0, 0x0, - 0x4, 0x3, 0x0, 0x0, 0x5, 0x55, 0x55, 0x55, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x0, 0x1, 0x55, 0x59, 0x55, 0x85, 0x5a, 0x40, - 0x0, 0x0, 0xc, 0x2, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x29, 0x2, 0xa0, 0x0, 0x10, 0x0, 0x0, - 0x84, 0x2, 0xa0, 0x0, 0x50, 0x0, 0x2, 0xa0, - 0x1, 0xa0, 0x0, 0x90, 0x0, 0x67, 0x0, 0x0, - 0xba, 0xaa, 0xd3, 0x4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5B98 "官" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1b, 0x20, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x64, 0x0, 0x3, 0x20, 0x68, 0x55, 0x55, 0x55, - 0x55, 0xc7, 0xd, 0x16, 0x55, 0x55, 0x59, 0x23, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0xb, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xb5, - 0x55, 0x55, 0xb0, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0xb5, 0x55, 0x55, 0x98, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x6, 0x60, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x66, 0x0, 0x0, 0xc, - 0x55, 0x55, 0x59, 0x50, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, 0x0, - - /* U+5B99 "宙" */ - 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x54, 0x0, 0x2, 0x10, 0x95, 0x55, 0x57, 0x55, - 0x55, 0xc7, 0x1d, 0x0, 0x0, 0xc2, 0x0, 0x14, - 0x0, 0x1, 0x0, 0xc, 0x0, 0x1, 0x0, 0x0, - 0x96, 0x55, 0xd5, 0x55, 0xe1, 0x0, 0x9, 0x20, - 0xc, 0x0, 0xc, 0x0, 0x0, 0x92, 0x0, 0xc0, - 0x0, 0xc0, 0x0, 0x9, 0x75, 0x5d, 0x55, 0x5c, - 0x0, 0x0, 0x92, 0x0, 0xc0, 0x0, 0xc0, 0x0, - 0x9, 0x20, 0xc, 0x0, 0xc, 0x0, 0x0, 0x97, - 0x55, 0x55, 0x55, 0xd0, 0x0, 0x3, 0x0, 0x0, - 0x0, 0x2, 0x0, - - /* U+5B9A "定" */ - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x85, 0x0, 0x0, 0x0, 0x3, 0x0, 0x2, - 0x60, 0x0, 0x13, 0x0, 0xa5, 0x55, 0x55, 0x55, - 0x5a, 0xa0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x50, - 0x0, 0x45, 0x55, 0x55, 0x55, 0x7c, 0x10, 0x1, - 0x0, 0x2, 0x90, 0x0, 0x0, 0x0, 0x5, 0x70, - 0x29, 0x0, 0x0, 0x0, 0x0, 0x87, 0x2, 0xb5, - 0x5b, 0x50, 0x0, 0xa, 0x50, 0x29, 0x0, 0x0, - 0x0, 0x1, 0xa4, 0x32, 0x90, 0x0, 0x0, 0x0, - 0x82, 0x6, 0xaa, 0x10, 0x0, 0x0, 0x44, 0x0, - 0x2, 0x8b, 0xde, 0xf9, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5B9E "实" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x9, 0x0, 0x1, 0x30, 0x0, 0xa5, 0x55, - 0x55, 0x55, 0x5a, 0xc0, 0x8, 0x80, 0x65, 0x7, - 0x70, 0x7, 0x0, 0x2, 0x0, 0xd, 0x18, 0x50, - 0x0, 0x0, 0x0, 0x18, 0x12, 0xa, 0x30, 0x0, - 0x0, 0x0, 0x5, 0xc0, 0xb, 0x10, 0x0, 0x0, - 0x4, 0x55, 0x95, 0x5e, 0x55, 0x58, 0xb0, 0x1, - 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc5, 0x87, 0x10, 0x0, 0x0, 0x0, 0x2b, - 0x40, 0x5, 0xe7, 0x0, 0x1, 0x57, 0x60, 0x0, - 0x0, 0x2d, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5B9F "実" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x70, 0x0, 0x0, 0x2, 0x20, 0x0, - 0x26, 0x0, 0x5, 0x20, 0x78, 0x55, 0x56, 0x55, - 0x55, 0xd6, 0xd, 0x20, 0x0, 0xa3, 0x0, 0x22, - 0x0, 0x4, 0x55, 0x5c, 0x65, 0x5c, 0x10, 0x0, - 0x10, 0x0, 0xa1, 0x0, 0x20, 0x0, 0x1, 0x55, - 0x5c, 0x65, 0x78, 0x0, 0x4, 0x55, 0x55, 0xc6, - 0x55, 0x6d, 0x20, 0x10, 0x0, 0x1d, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x8, 0x61, 0x70, 0x0, 0x0, - 0x0, 0x8, 0x90, 0x3, 0xb5, 0x0, 0x1, 0x58, - 0x30, 0x0, 0x2, 0xae, 0x40, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5BA2 "客" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0x95, - 0x55, 0x59, 0x55, 0x55, 0xb0, 0x5, 0x80, 0xb, - 0x20, 0x0, 0x6, 0x60, 0x5, 0x10, 0x6c, 0x55, - 0x5b, 0x52, 0x0, 0x0, 0x2, 0x93, 0x30, 0x6a, - 0x0, 0x0, 0x0, 0x27, 0x0, 0x69, 0x90, 0x0, - 0x0, 0x0, 0x30, 0x0, 0x98, 0x94, 0x0, 0x0, - 0x0, 0x0, 0x68, 0x20, 0x7, 0xda, 0x84, 0x4, - 0x56, 0xc5, 0x55, 0x55, 0xc4, 0x70, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0xb0, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0xc5, 0x55, - 0x55, 0xb0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x10, 0x0, - - /* U+5BA4 "室" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, 0x65, - 0x55, 0x79, 0x55, 0x56, 0x10, 0x7, 0x50, 0x0, - 0x0, 0x0, 0x9, 0x10, 0x6, 0x45, 0x55, 0x55, - 0x58, 0xa0, 0x0, 0x0, 0x0, 0xa, 0x50, 0x11, - 0x0, 0x0, 0x0, 0x1, 0x82, 0x0, 0xa, 0x40, - 0x0, 0x0, 0x2f, 0xa8, 0x76, 0x56, 0xe0, 0x0, - 0x0, 0x3, 0x0, 0x84, 0x0, 0x40, 0x0, 0x0, - 0x25, 0x55, 0xb7, 0x56, 0xb0, 0x0, 0x0, 0x1, - 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x92, 0x0, 0x0, 0x0, 0x15, 0x55, 0x55, 0xb7, - 0x55, 0x5b, 0xa0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5BB3 "害" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x2, 0x85, - 0x55, 0x67, 0x55, 0x59, 0x80, 0xb, 0x30, 0x0, - 0xb2, 0x0, 0x26, 0x0, 0x1, 0x25, 0x55, 0xd5, - 0x55, 0x92, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0x50, 0x0, 0x0, 0x25, 0x55, 0xd5, 0x55, 0x51, - 0x0, 0x5, 0x55, 0x55, 0xd5, 0x55, 0x59, 0x90, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x55, 0x75, 0x55, 0xd0, 0x0, 0x0, 0xb, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0xb, 0x55, 0x55, - 0x55, 0xb0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, - 0x50, 0x0, - - /* U+5BB5 "宵" */ - 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb4, 0x0, 0x0, 0x0, 0x7, 0x55, 0x57, - 0x75, 0x55, 0x68, 0x3, 0x92, 0x0, 0x64, 0x1, - 0x16, 0x40, 0x42, 0x2c, 0x2a, 0x20, 0xa5, 0x10, - 0x0, 0x0, 0x55, 0xa1, 0x53, 0x0, 0x0, 0x0, - 0xa5, 0x59, 0x55, 0x5c, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0xc5, 0x55, 0x55, - 0x5b, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0xb0, - 0x0, 0x0, 0xc5, 0x55, 0x55, 0x5b, 0x0, 0x0, - 0xb, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0xb0, - 0x0, 0x6, 0xc9, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x3, 0x0, 0x0, - - /* U+5BB6 "家" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x95, - 0x55, 0x58, 0x55, 0x57, 0xa0, 0x6, 0x80, 0x0, - 0x0, 0x0, 0x7, 0x20, 0x1, 0x5, 0x55, 0x95, - 0x57, 0x70, 0x0, 0x0, 0x0, 0x1b, 0x60, 0x0, - 0x50, 0x0, 0x0, 0x4, 0x81, 0x92, 0x8, 0x71, - 0x0, 0x3, 0x53, 0x6, 0x7b, 0x54, 0x0, 0x0, - 0x0, 0x1, 0x84, 0x1e, 0x37, 0x0, 0x0, 0x1, - 0x56, 0x2, 0xb8, 0x75, 0x60, 0x0, 0x2, 0x0, - 0x49, 0x14, 0x80, 0x99, 0x20, 0x0, 0x37, 0x40, - 0x6, 0x60, 0x7, 0x80, 0x14, 0x20, 0x4, 0xbd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+5BB9 "容" */ - 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0x95, - 0x55, 0x58, 0x55, 0x57, 0x70, 0x5, 0x80, 0x40, - 0x0, 0x20, 0x8, 0x30, 0x5, 0x12, 0xc3, 0x42, - 0x3a, 0x51, 0x0, 0x0, 0x29, 0x10, 0xd7, 0x0, - 0xb7, 0x0, 0x2, 0x40, 0xa, 0x54, 0x40, 0x4, - 0x0, 0x0, 0x0, 0x97, 0x0, 0x58, 0x0, 0x0, - 0x0, 0x9, 0x90, 0x0, 0x7, 0xda, 0x61, 0x4, - 0x71, 0xd5, 0x55, 0x5d, 0x36, 0x60, 0x0, 0x0, - 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xd5, 0x55, - 0x5d, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x1, - 0x0, 0x0, - - /* U+5BBF "宿" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, 0x0, 0x85, - 0x55, 0x59, 0x55, 0x56, 0x80, 0x3, 0x91, 0x90, - 0x0, 0x0, 0x7, 0x40, 0x5, 0x26, 0x94, 0x55, - 0x55, 0x56, 0xb1, 0x0, 0xb, 0x0, 0x0, 0xa3, - 0x0, 0x0, 0x0, 0x6d, 0x0, 0x20, 0x80, 0x3, - 0x0, 0x1, 0x8c, 0x0, 0xc5, 0x55, 0x5d, 0x0, - 0x6, 0xc, 0x0, 0xc0, 0x0, 0xc, 0x0, 0x0, - 0xc, 0x0, 0xc5, 0x55, 0x5c, 0x0, 0x0, 0xc, - 0x0, 0xc0, 0x0, 0xc, 0x0, 0x0, 0xc, 0x0, - 0xc0, 0x0, 0xc, 0x0, 0x0, 0xc, 0x0, 0xc5, - 0x55, 0x5c, 0x0, 0x0, 0x3, 0x0, 0x20, 0x0, - 0x2, 0x0, - - /* U+5BC4 "寄" */ - 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x92, 0x0, 0x0, 0x0, 0x9, 0x55, 0x56, - 0x55, 0x55, 0x89, 0x6, 0x80, 0x0, 0x77, 0x0, - 0x15, 0x0, 0x1, 0x55, 0x6d, 0x65, 0x5a, 0x20, - 0x0, 0x0, 0x1a, 0x33, 0x85, 0x0, 0x0, 0x1, - 0x55, 0x0, 0x0, 0x90, 0x17, 0x5, 0x55, 0x55, - 0x55, 0x55, 0xc5, 0x61, 0x0, 0x95, 0x55, 0xa0, - 0xc, 0x0, 0x0, 0xc, 0x0, 0xb, 0x0, 0xc0, - 0x0, 0x0, 0xd5, 0x55, 0xb0, 0xc, 0x0, 0x0, - 0xb, 0x0, 0x7, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, - - /* U+5BC6 "密" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x95, - 0x55, 0x59, 0x55, 0x55, 0xd1, 0x6, 0x80, 0x0, - 0x71, 0x7, 0x15, 0x20, 0x2, 0x1, 0x49, 0x57, - 0x8a, 0x10, 0x0, 0x0, 0x27, 0x38, 0xa, 0x61, - 0x39, 0x0, 0x0, 0xb3, 0x3c, 0x92, 0x5, 0x9, - 0x60, 0x0, 0x26, 0x9d, 0x99, 0x9c, 0x31, 0x10, - 0x3, 0x20, 0x0, 0x16, 0x0, 0x0, 0x0, 0x0, - 0x19, 0x0, 0x1b, 0x0, 0x55, 0x0, 0x0, 0xa, - 0x0, 0xa, 0x0, 0x65, 0x0, 0x0, 0x1a, 0x0, - 0xa, 0x0, 0x65, 0x0, 0x0, 0x28, 0x55, 0x56, - 0x55, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5BCC "富" */ - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xc0, 0x0, 0x0, 0x8, 0x55, 0x55, 0x85, - 0x55, 0x97, 0x49, 0x0, 0x0, 0x0, 0x41, 0x81, - 0x10, 0x35, 0x55, 0x55, 0x53, 0x0, 0x0, 0xa, - 0x55, 0x55, 0xb2, 0x0, 0x0, 0xc, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0xb, 0x55, 0x55, 0x90, 0x0, - 0x0, 0x85, 0x55, 0x55, 0x59, 0x20, 0x0, 0xc0, - 0x1, 0xa0, 0xb, 0x0, 0x0, 0xd5, 0x55, 0xc5, - 0x5d, 0x0, 0x0, 0xc0, 0x1, 0xa0, 0xb, 0x0, - 0x0, 0xd5, 0x55, 0x75, 0x5d, 0x10, 0x0, 0x20, - 0x0, 0x0, 0x0, 0x0, - - /* U+5BD2 "寒" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x39, 0x0, 0x0, 0x10, 0x1, 0x95, - 0x55, 0x57, 0x55, 0x56, 0xd0, 0xa, 0x30, 0x1a, - 0x0, 0xb1, 0x14, 0x10, 0x0, 0x45, 0x6c, 0x55, - 0xc5, 0x93, 0x0, 0x0, 0x0, 0x1a, 0x0, 0xb0, - 0x51, 0x0, 0x0, 0x25, 0x6c, 0x55, 0xc5, 0x52, - 0x0, 0x4, 0x55, 0x6c, 0x55, 0xc5, 0x58, 0xc0, - 0x0, 0x0, 0x68, 0x0, 0x42, 0x0, 0x0, 0x0, - 0x3, 0xa0, 0x78, 0x8, 0x40, 0x0, 0x0, 0x38, - 0x0, 0x7, 0x0, 0x9d, 0x81, 0x4, 0x30, 0x15, - 0x87, 0x20, 0x2, 0x30, 0x0, 0x0, 0x0, 0x5, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5BDD "寝" */ - 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x50, 0x0, 0x0, 0x2, 0x85, 0x55, - 0x66, 0x55, 0x5a, 0x30, 0x84, 0x30, 0x0, 0x0, - 0x2, 0x50, 0x3, 0xb, 0x12, 0x65, 0x55, 0xc1, - 0x0, 0x71, 0xb0, 0x5, 0x55, 0x5c, 0x0, 0x4, - 0x8b, 0x2, 0x65, 0x55, 0xc0, 0x0, 0x1, 0xb0, - 0x53, 0x33, 0x34, 0x60, 0x2, 0x8c, 0x38, 0x11, - 0x12, 0x59, 0x13, 0xb0, 0xb3, 0x27, 0x65, 0x99, - 0x0, 0x0, 0xb, 0x0, 0x7, 0x2a, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x4f, 0x30, 0x0, 0x0, 0xb, - 0x1, 0x65, 0x17, 0xba, 0x60, 0x0, 0x32, 0x20, - 0x0, 0x0, 0x20, - - /* U+5BDF "察" */ - 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0xc, 0x0, 0x0, 0x20, 0x0, 0x95, - 0x65, 0x55, 0x55, 0x56, 0xd2, 0x6, 0x71, 0xd1, - 0x11, 0x10, 0x5, 0x10, 0x0, 0xa, 0x75, 0xd5, - 0x85, 0x5d, 0x50, 0x0, 0x57, 0x93, 0xa0, 0x52, - 0x54, 0x0, 0x2, 0x82, 0x5a, 0x10, 0x1a, 0x50, - 0x0, 0x1, 0x8, 0x96, 0x55, 0x74, 0xb7, 0x10, - 0x0, 0x18, 0x10, 0x0, 0x0, 0x89, 0xd2, 0x4, - 0x45, 0x55, 0x6c, 0x55, 0x52, 0x0, 0x0, 0x0, - 0xb4, 0x1a, 0x16, 0x10, 0x0, 0x0, 0x19, 0x30, - 0x1a, 0x0, 0xb6, 0x0, 0x3, 0x60, 0x6, 0xc9, - 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x0, - - /* U+5BE6 "實" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, 0x84, - 0x44, 0x47, 0x44, 0x48, 0x60, 0x1, 0xb3, 0x55, - 0x55, 0x55, 0x87, 0x0, 0x2, 0x28, 0x52, 0x67, - 0x22, 0xb5, 0x80, 0x5, 0x3b, 0x43, 0x95, 0x36, - 0x93, 0x30, 0x0, 0x9, 0x55, 0x65, 0x57, 0x50, - 0x0, 0x0, 0xa, 0x55, 0x55, 0x55, 0xd0, 0x0, - 0x0, 0xb, 0x55, 0x55, 0x55, 0xb0, 0x0, 0x0, - 0xb, 0x55, 0x55, 0x55, 0xb0, 0x0, 0x0, 0xb, - 0x55, 0x55, 0x55, 0xb0, 0x0, 0x0, 0x3, 0x29, - 0x0, 0x56, 0x40, 0x0, 0x0, 0x37, 0x72, 0x0, - 0x3, 0xc7, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, - 0x3, 0x0, - - /* U+5BEB "寫" */ - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x76, 0x0, 0x0, 0x0, 0x8, 0x55, 0x56, - 0x95, 0x55, 0x67, 0x7, 0x50, 0x5, 0x40, 0x0, - 0x26, 0x40, 0x61, 0xa5, 0x41, 0x46, 0x5d, 0x20, - 0x0, 0xc, 0x58, 0x31, 0x55, 0xb0, 0x0, 0x0, - 0xb0, 0x0, 0x1, 0xb, 0x0, 0x0, 0xc, 0x8a, - 0x55, 0x55, 0xa0, 0x0, 0x0, 0x1d, 0x65, 0x55, - 0x55, 0x91, 0x0, 0x38, 0x10, 0x2, 0x14, 0xb, - 0x0, 0x23, 0x60, 0x80, 0x91, 0xb1, 0xb0, 0x0, - 0x2c, 0x8, 0x24, 0x12, 0x39, 0x0, 0x1, 0x20, - 0x0, 0x4, 0xad, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x20, 0x0, - - /* U+5BFA "寺" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x1, 0x55, - 0x55, 0xe5, 0x55, 0x99, 0x0, 0x0, 0x10, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x1, 0x40, 0x36, 0x55, 0x55, 0x85, 0x66, - 0x57, 0x91, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x6, 0x30, - 0x6, 0x57, 0x55, 0x55, 0x6c, 0x55, 0x40, 0x0, - 0x1, 0xb0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, - 0xa5, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, - 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, - 0x0, 0x0, - - /* U+5BFE "対" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x63, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x1e, - 0x10, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x6, 0x4, - 0x0, 0x0, 0xc0, 0x0, 0x6, 0x55, 0xc7, 0x35, - 0x55, 0xd5, 0xb0, 0x0, 0x0, 0xd0, 0x1, 0x0, - 0xc0, 0x0, 0x3, 0x21, 0xb0, 0x33, 0x0, 0xc0, - 0x0, 0x0, 0x5a, 0x60, 0xc, 0x20, 0xc0, 0x0, - 0x0, 0xc, 0x90, 0x7, 0x60, 0xc0, 0x0, 0x0, - 0x47, 0xa8, 0x0, 0x0, 0xc0, 0x0, 0x1, 0x90, - 0x1c, 0x0, 0x0, 0xc0, 0x0, 0x18, 0x0, 0x0, - 0x1, 0x32, 0xd0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x3d, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+5C04 "射" */ - 0x0, 0x1, 0x20, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x6, 0x40, 0x0, 0x0, 0xc2, 0x0, 0x0, 0xa7, - 0x5b, 0x20, 0x0, 0xc0, 0x0, 0x0, 0xc0, 0xb, - 0x10, 0x0, 0xc0, 0x10, 0x0, 0xd5, 0x5c, 0x46, - 0x55, 0xd6, 0xa0, 0x0, 0xc0, 0xb, 0x10, 0x0, - 0xc0, 0x0, 0x0, 0xd5, 0x5c, 0x15, 0x10, 0xc0, - 0x0, 0x0, 0xc0, 0xb, 0x12, 0xc0, 0xc0, 0x0, - 0x16, 0x86, 0xac, 0x10, 0xc0, 0xc0, 0x0, 0x0, - 0x9, 0x4b, 0x10, 0x0, 0xc0, 0x0, 0x0, 0x48, - 0xb, 0x10, 0x0, 0xc0, 0x0, 0x2, 0x80, 0xb, - 0x10, 0x0, 0xc0, 0x0, 0x15, 0x2, 0xad, 0x0, - 0x6d, 0xc0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, - 0x0, 0x0, - - /* U+5C07 "將" */ - 0x0, 0x0, 0x20, 0x0, 0x20, 0x0, 0x0, 0x2, - 0x0, 0xd0, 0x1, 0xe1, 0x0, 0x0, 0xb, 0x10, - 0xb0, 0x9, 0x85, 0x5b, 0x60, 0xb, 0x0, 0xb0, - 0x58, 0x70, 0x3c, 0x10, 0xc, 0x55, 0xb3, 0x75, - 0x74, 0xb1, 0x0, 0x3, 0x0, 0xb0, 0x8, 0x2a, - 0x20, 0x0, 0x0, 0x0, 0xb0, 0x6, 0x80, 0xb1, - 0x0, 0x17, 0x95, 0xb3, 0x51, 0x0, 0xb1, 0x60, - 0x0, 0xc0, 0xb5, 0x65, 0x55, 0xc5, 0x50, 0x0, - 0xb0, 0xb0, 0x64, 0x0, 0xb0, 0x0, 0x3, 0x80, - 0xb0, 0x1d, 0x0, 0xb0, 0x0, 0x8, 0x20, 0xb0, - 0x3, 0x0, 0xb0, 0x0, 0x35, 0x0, 0xc0, 0x1, - 0x7d, 0xc0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x2, - 0x10, 0x0, - - /* U+5C08 "專" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x3, 0x50, 0x0, 0x65, 0x55, - 0xc5, 0x55, 0x55, 0x0, 0x0, 0xa5, 0x5c, 0x55, - 0x79, 0x0, 0x0, 0xc, 0x0, 0xb1, 0x4, 0x80, - 0x0, 0x0, 0xc5, 0x5c, 0x55, 0x78, 0x0, 0x0, - 0xc, 0x55, 0xc5, 0x57, 0x80, 0x0, 0x0, 0x30, - 0xb, 0x22, 0x97, 0x0, 0x0, 0xac, 0xa8, 0x76, - 0x84, 0x96, 0x0, 0x45, 0x55, 0x55, 0x5c, 0x75, - 0xd7, 0x1, 0x3, 0x40, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0xb, 0x30, 0xa, 0x20, 0x0, 0x0, 0x0, - 0x30, 0x3a, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, - - /* U+5C0D "對" */ - 0x0, 0x3, 0x3, 0x0, 0x0, 0x2, 0x0, 0x1, - 0xc, 0xc, 0x1, 0x0, 0xd, 0x0, 0x8, 0x4a, - 0xa, 0x67, 0x0, 0xb, 0x0, 0x2, 0x4a, 0xc, - 0x42, 0x0, 0xb, 0x0, 0x16, 0x58, 0x59, 0x5a, - 0x10, 0xb, 0x51, 0x0, 0x72, 0xb, 0x10, 0x65, - 0x5c, 0x52, 0x0, 0x38, 0x25, 0x22, 0x30, 0xb, - 0x0, 0x4, 0x66, 0xa5, 0x70, 0xb3, 0xb, 0x0, - 0x0, 0x2, 0x90, 0x0, 0x59, 0xb, 0x0, 0x1, - 0x66, 0xb6, 0x90, 0x1, 0xb, 0x0, 0x0, 0x2, - 0x90, 0x0, 0x0, 0xb, 0x0, 0x0, 0x2, 0xa3, - 0x42, 0x1, 0x1b, 0x0, 0xb, 0xb8, 0x52, 0x0, - 0x5, 0xe8, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+5C0E "導" */ - 0x0, 0x10, 0x0, 0x30, 0x2, 0x0, 0x0, 0x0, - 0x94, 0x0, 0x2a, 0x8, 0x31, 0x0, 0x0, 0x38, - 0x46, 0x58, 0x77, 0x59, 0x60, 0x1, 0x26, 0x9, - 0x57, 0x55, 0x86, 0x0, 0x1, 0x3c, 0xb, 0x55, - 0x55, 0x95, 0x0, 0x0, 0xb, 0xb, 0x44, 0x44, - 0x95, 0x0, 0x0, 0xb, 0xb, 0x55, 0x55, 0x95, - 0x0, 0x1, 0x76, 0x89, 0x21, 0x11, 0x34, 0x41, - 0x2, 0x40, 0x4, 0x79, 0xac, 0xab, 0x70, 0x4, - 0x55, 0x55, 0x55, 0x5e, 0x5a, 0xb0, 0x1, 0x1, - 0x40, 0x0, 0xb, 0x0, 0x0, 0x0, 0x0, 0xa3, - 0x0, 0xb, 0x0, 0x0, 0x0, 0x0, 0x20, 0x5, - 0xb9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x0, - - /* U+5C0F "小" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x8, 0x10, 0xc0, 0x30, 0x0, 0x0, 0x1e, - 0x20, 0xc0, 0x46, 0x0, 0x0, 0x95, 0x0, 0xc0, - 0x9, 0x70, 0x2, 0x90, 0x0, 0xc0, 0x0, 0xe5, - 0x8, 0x0, 0x0, 0xc0, 0x0, 0x6c, 0x51, 0x0, - 0x0, 0xc0, 0x0, 0x6, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0x1, 0x45, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, - - /* U+5C11 "少" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x0, 0x0, 0x0, 0x34, 0xa, 0x22, - 0x10, 0x0, 0x0, 0xa, 0x90, 0xa2, 0x7, 0x91, - 0x0, 0x2, 0xc0, 0xa, 0x20, 0x7, 0xe2, 0x0, - 0xa2, 0x0, 0xa2, 0x0, 0xa, 0x80, 0x54, 0x0, - 0xa, 0x20, 0x29, 0x12, 0x24, 0x0, 0x0, 0xa3, - 0x1d, 0xa1, 0x0, 0x0, 0x0, 0x1, 0x2d, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x6c, 0x30, 0x0, 0x0, - 0x0, 0x5, 0xb7, 0x0, 0x0, 0x0, 0x3, 0x68, - 0x40, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5C1A "尚" */ - 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x11, 0x0, - 0xd, 0x0, 0x5, 0x0, 0x9, 0x60, 0xc, 0x0, - 0x4d, 0x10, 0x0, 0xe3, 0xc, 0x0, 0xa1, 0x0, - 0x20, 0x40, 0xc, 0x5, 0x20, 0x20, 0xc5, 0x55, - 0x57, 0x56, 0x56, 0xc0, 0xc0, 0x2, 0x0, 0x3, - 0x2, 0xa0, 0xc0, 0xc, 0x55, 0x5c, 0x2, 0xa0, - 0xc0, 0xb, 0x0, 0xb, 0x2, 0xa0, 0xc0, 0xb, - 0x0, 0xb, 0x2, 0xa0, 0xc0, 0xc, 0x55, 0x5b, - 0x2, 0xa0, 0xc0, 0x4, 0x0, 0x3, 0x24, 0xa0, - 0xc0, 0x0, 0x0, 0x1, 0x7f, 0x50, 0x10, 0x0, - 0x0, 0x0, 0x2, 0x0, - - /* U+5C24 "尤" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x60, 0x66, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x30, 0xa, 0x90, 0x0, 0x0, 0x0, 0x8, - 0x30, 0x0, 0x44, 0x0, 0x6, 0x55, 0x5b, 0x78, - 0x55, 0x5b, 0x50, 0x0, 0x0, 0x9, 0x3a, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xa, 0x2a, 0x10, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xa, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xa, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x48, 0xa, 0x10, 0x0, 0x10, 0x0, 0x0, - 0xb1, 0xa, 0x10, 0x0, 0x50, 0x0, 0x9, 0x40, - 0xa, 0x20, 0x1, 0x80, 0x1, 0x82, 0x0, 0x6, - 0xdb, 0xbc, 0xb0, 0x13, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5C31 "就" */ - 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x3, 0x90, 0x0, 0xb1, 0x30, 0x0, 0x0, 0x0, - 0x70, 0x21, 0xb0, 0x4a, 0x0, 0x5, 0x55, 0x55, - 0x52, 0xb0, 0x6, 0x0, 0x0, 0x75, 0x55, 0x74, - 0xc5, 0x56, 0x90, 0x0, 0xb0, 0x0, 0xb0, 0xb4, - 0x60, 0x0, 0x0, 0xb0, 0x0, 0xb0, 0xb4, 0x60, - 0x0, 0x0, 0xc5, 0xb5, 0xa0, 0xb4, 0x60, 0x0, - 0x0, 0x30, 0xa1, 0x0, 0xb4, 0x60, 0x0, 0x0, - 0xc1, 0xa2, 0x82, 0x84, 0x60, 0x0, 0x5, 0x40, - 0xa0, 0x98, 0x24, 0x60, 0x40, 0x6, 0x0, 0xa0, - 0x8, 0x4, 0x60, 0x80, 0x10, 0x3b, 0x90, 0x70, - 0x2, 0xca, 0xd0, 0x0, 0x1, 0x2, 0x10, 0x0, - 0x0, 0x0, - - /* U+5C3A "尺" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, - 0xd, 0x55, 0x55, 0x55, 0x5d, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0x1b, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x1b, 0x0, 0x0, 0xd, 0x55, 0x57, - 0x55, 0x5b, 0x0, 0x0, 0xd, 0x0, 0x6, 0x0, - 0x4, 0x0, 0x0, 0xc, 0x0, 0x7, 0x10, 0x0, - 0x0, 0x0, 0xb, 0x0, 0x1, 0x70, 0x0, 0x0, - 0x0, 0x38, 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, - 0x82, 0x0, 0x0, 0x1d, 0x40, 0x0, 0x2, 0x80, - 0x0, 0x0, 0x2, 0xe9, 0x20, 0x7, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0xe3, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5C40 "局" */ - 0x0, 0x8, 0x55, 0x55, 0x55, 0x5a, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0xd, 0x55, - 0x55, 0x55, 0x59, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x0, 0x30, 0x0, 0xd, 0x55, 0x55, 0x55, - 0x55, 0xd0, 0x0, 0x1a, 0x7, 0x55, 0x58, 0x0, - 0xc0, 0x0, 0x28, 0xb, 0x0, 0xb, 0x0, 0xc0, - 0x0, 0x64, 0xb, 0x0, 0xb, 0x0, 0xc0, 0x0, - 0x90, 0xc, 0x55, 0x5a, 0x1, 0xb0, 0x1, 0x60, - 0x2, 0x0, 0x2, 0x14, 0xa0, 0x5, 0x0, 0x0, - 0x0, 0x1, 0x8f, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5C45 "居" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x65, 0x55, 0x55, 0x56, 0xa0, 0x0, 0x83, 0x0, - 0x0, 0x0, 0x38, 0x0, 0x8, 0x75, 0x55, 0x55, - 0x57, 0x90, 0x0, 0x83, 0x0, 0x9, 0x10, 0x13, - 0x0, 0x8, 0x30, 0x0, 0xc0, 0x0, 0x11, 0x0, - 0x87, 0x65, 0x5d, 0x55, 0x58, 0x60, 0xa, 0x10, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0xa0, 0x20, 0xc, - 0x0, 0x40, 0x0, 0xa, 0xc, 0x66, 0x66, 0x6d, - 0x10, 0x3, 0x50, 0xc0, 0x0, 0x0, 0xc0, 0x0, - 0x70, 0xc, 0x0, 0x0, 0xc, 0x0, 0x23, 0x0, - 0xc5, 0x55, 0x55, 0xc0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, 0x0, - - /* U+5C4A "届" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x65, 0x55, 0x55, 0x55, 0xc0, 0x0, 0x83, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x8, 0x75, 0x55, 0x55, - 0x55, 0xc0, 0x0, 0x83, 0x0, 0x0, 0x30, 0x5, - 0x0, 0x8, 0x30, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x82, 0x65, 0x55, 0xd5, 0x59, 0x30, 0xa, 0x1b, - 0x10, 0xc, 0x0, 0xa1, 0x0, 0xa0, 0xb1, 0x0, - 0xc0, 0xa, 0x10, 0xa, 0xa, 0x65, 0x5d, 0x55, - 0xc1, 0x3, 0x60, 0xa1, 0x0, 0xc0, 0xa, 0x10, - 0x70, 0xb, 0x65, 0x5d, 0x55, 0xc1, 0x14, 0x0, - 0x91, 0x0, 0x0, 0x7, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5C4B "屋" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x97, 0x55, 0x55, 0x55, 0x5e, 0x0, 0x0, 0x83, - 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x87, 0x55, - 0x55, 0x55, 0x5c, 0x0, 0x0, 0x83, 0x0, 0x0, - 0x0, 0x5, 0x0, 0x0, 0x84, 0x65, 0x78, 0x55, - 0x68, 0x10, 0x0, 0x92, 0x0, 0xb5, 0x6, 0x10, - 0x0, 0x0, 0xa1, 0x38, 0x10, 0x2, 0xd5, 0x0, - 0x0, 0xc0, 0x8a, 0x8b, 0x74, 0x4b, 0x0, 0x0, - 0xb0, 0x0, 0xa, 0x20, 0x13, 0x0, 0x3, 0x60, - 0x56, 0x5c, 0x65, 0x66, 0x0, 0x8, 0x0, 0x0, - 0xa, 0x10, 0x0, 0x0, 0x15, 0x5, 0x55, 0x5c, - 0x65, 0x58, 0xc0, 0x10, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5C55 "展" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x86, 0x55, 0x55, 0x55, 0x5d, 0x0, 0x0, 0x83, - 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x87, 0x55, - 0x55, 0x55, 0x5c, 0x0, 0x0, 0x83, 0x3, 0xa0, - 0x1a, 0x2, 0x0, 0x0, 0x97, 0x57, 0xb5, 0x6b, - 0x69, 0x0, 0x0, 0x92, 0x3, 0x80, 0x1a, 0x0, - 0x0, 0x0, 0xa1, 0x3, 0x80, 0x1a, 0x5, 0x50, - 0x0, 0xb5, 0x5c, 0x59, 0x55, 0x75, 0x40, 0x0, - 0xb0, 0xb, 0x5, 0x32, 0xb3, 0x0, 0x2, 0x70, - 0xb, 0x0, 0xa7, 0x0, 0x0, 0x7, 0x10, 0xb, - 0x55, 0x1b, 0x83, 0x10, 0x15, 0x0, 0x1e, 0x40, - 0x0, 0x6d, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5C65 "履" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0xa6, 0x55, 0x55, 0x55, 0x5c, 0x10, 0x0, 0x96, - 0x55, 0x55, 0x55, 0x5c, 0x0, 0x0, 0x91, 0x27, - 0x9, 0x30, 0x5, 0x0, 0x0, 0x91, 0x92, 0xc, - 0x55, 0x58, 0x20, 0x0, 0x95, 0x46, 0x6b, 0x55, - 0x5b, 0x0, 0x0, 0xa2, 0x69, 0x5a, 0x55, 0x5a, - 0x0, 0x0, 0xa0, 0xc1, 0xa, 0x0, 0xa, 0x0, - 0x0, 0xa6, 0xc1, 0x7, 0xc6, 0x56, 0x0, 0x0, - 0x92, 0xa0, 0x5, 0xc5, 0x78, 0x0, 0x3, 0x50, - 0xa0, 0x35, 0x42, 0xb2, 0x0, 0x7, 0x0, 0xa0, - 0x20, 0x3d, 0x80, 0x0, 0x13, 0x0, 0x91, 0x47, - 0x50, 0x5b, 0xa0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, - - /* U+5C6C "屬" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x3, 0x0, 0x9, - 0x75, 0x55, 0x55, 0x55, 0xc0, 0x0, 0x97, 0x55, - 0x56, 0x55, 0x6b, 0x0, 0x9, 0x23, 0x91, 0x92, - 0x57, 0x10, 0x0, 0x96, 0x76, 0x39, 0x15, 0x87, - 0x0, 0x9, 0x47, 0x55, 0x75, 0x55, 0xa0, 0x0, - 0xa2, 0x70, 0x90, 0x90, 0xa, 0x0, 0xb, 0x19, - 0x84, 0x44, 0x44, 0x60, 0x0, 0xa0, 0x96, 0x57, - 0x55, 0x5a, 0x40, 0x9, 0x57, 0x55, 0xb5, 0x91, - 0x91, 0x5, 0x40, 0x95, 0x5a, 0x5c, 0xa, 0x0, - 0x70, 0x4, 0x23, 0xa5, 0x81, 0xa0, 0x14, 0x0, - 0x85, 0x31, 0x6, 0x9a, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, - - /* U+5C71 "山" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x8, 0x10, 0xc, 0x0, 0x0, 0xa1, 0xc, 0x0, - 0xc, 0x0, 0x0, 0xc0, 0xc, 0x0, 0xc, 0x0, - 0x0, 0xc0, 0xc, 0x0, 0xc, 0x0, 0x0, 0xc0, - 0xc, 0x0, 0xc, 0x0, 0x0, 0xc0, 0xc, 0x0, - 0xc, 0x0, 0x0, 0xc0, 0xc, 0x0, 0xc, 0x0, - 0x0, 0xc0, 0xe, 0x55, 0x5a, 0x55, 0x55, 0xc0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x80, - - /* U+5CF6 "島" */ - 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x86, 0x56, - 0x55, 0x5c, 0x30, 0x0, 0x9, 0x75, 0x55, 0x55, - 0xc0, 0x0, 0x0, 0x93, 0x0, 0x0, 0xa, 0x0, - 0x0, 0x9, 0x75, 0x55, 0x55, 0xb0, 0x0, 0x0, - 0x97, 0x55, 0x55, 0x55, 0x59, 0x70, 0x9, 0x30, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x76, 0x57, 0x55, - 0x55, 0x5d, 0x10, 0x51, 0x0, 0xd0, 0x5, 0x0, - 0xb0, 0xb, 0x0, 0xb, 0x0, 0xb1, 0xb, 0x0, - 0xb5, 0x55, 0x95, 0x5b, 0x2, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x5b, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x0, - - /* U+5D4C "嵌" */ - 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, - 0x71, 0x0, 0x85, 0x0, 0x18, 0x0, 0x0, 0xb0, - 0x0, 0x74, 0x0, 0x1a, 0x0, 0x0, 0xb5, 0x55, - 0x76, 0x55, 0x5a, 0x0, 0x0, 0x71, 0x8, 0x10, - 0x59, 0x0, 0x0, 0x0, 0xb0, 0xb, 0x41, 0xa3, - 0x0, 0x50, 0x6, 0xc5, 0x5c, 0x54, 0xb5, 0x57, - 0xb0, 0x0, 0xb0, 0xb, 0x8, 0x1c, 0x25, 0x0, - 0x0, 0xb5, 0x5c, 0x12, 0xe, 0x20, 0x0, 0x0, - 0xb0, 0xb, 0x0, 0x58, 0x60, 0x0, 0x0, 0xb0, - 0xb, 0x0, 0xa2, 0x72, 0x0, 0x0, 0xb5, 0x5d, - 0x5, 0x70, 0xc, 0x30, 0x0, 0x80, 0x4, 0x64, - 0x0, 0x3, 0xe4, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, - - /* U+5DDD "川" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa3, 0x0, 0x0, 0x0, 0xd1, 0x0, 0xa, 0x10, - 0xb, 0x20, 0xc, 0x0, 0x0, 0xa1, 0x0, 0xc0, - 0x0, 0xc0, 0x0, 0xa, 0x10, 0xc, 0x0, 0xc, - 0x0, 0x0, 0xb0, 0x0, 0xc0, 0x0, 0xc0, 0x0, - 0xb, 0x0, 0xc, 0x0, 0xc, 0x0, 0x0, 0xb0, - 0x0, 0xc0, 0x0, 0xc0, 0x0, 0xa, 0x0, 0xc, - 0x0, 0xc, 0x0, 0x3, 0x70, 0x0, 0xc0, 0x0, - 0xc0, 0x0, 0x71, 0x0, 0xa, 0x0, 0xc, 0x0, - 0x7, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x5, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x10, - - /* U+5DDE "州" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x27, 0x0, 0x20, 0x1, 0xc0, 0x0, 0x2, 0x90, - 0x9, 0x40, 0x1a, 0x0, 0x0, 0x29, 0x0, 0x92, - 0x1, 0xa0, 0x0, 0x3, 0x80, 0x9, 0x20, 0xa, - 0x0, 0x6, 0x47, 0x80, 0x92, 0x91, 0xa0, 0x2, - 0xa5, 0x66, 0x79, 0x29, 0x4a, 0x0, 0x74, 0x65, - 0x23, 0x92, 0x21, 0xa0, 0x0, 0x9, 0x20, 0x9, - 0x20, 0xa, 0x0, 0x0, 0xc0, 0x0, 0x92, 0x0, - 0xa0, 0x0, 0x38, 0x0, 0x9, 0x20, 0xa, 0x0, - 0x9, 0x0, 0x0, 0x71, 0x1, 0xa0, 0x5, 0x30, - 0x0, 0x0, 0x0, 0x1b, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5DE5 "工" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x3, - 0x65, 0x55, 0x75, 0x55, 0x8b, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa2, 0x0, 0x1, 0x0, 0x15, 0x55, - 0x55, 0xc7, 0x55, 0x5e, 0x80, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+5DE6 "左" */ - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x16, 0x0, 0x46, 0x56, 0xc5, 0x55, - 0x56, 0x81, 0x0, 0x0, 0x66, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xb0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x76, - 0x55, 0xb5, 0x58, 0x10, 0x0, 0x1a, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x8, 0x10, 0x0, 0xc0, 0x0, - 0x0, 0x4, 0x40, 0x0, 0xc, 0x0, 0x0, 0x2, - 0x40, 0x0, 0x0, 0xc0, 0x0, 0x70, 0x0, 0x17, - 0x55, 0x56, 0x55, 0x56, 0x30, - - /* U+5DEE "差" */ - 0x0, 0x1, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0xa5, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, - 0x17, 0x0, 0x44, 0x3, 0x50, 0x0, 0x55, 0x55, - 0xb6, 0x55, 0x56, 0x60, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x24, 0x0, 0x0, 0x25, 0x56, 0xc5, 0x55, - 0x55, 0x0, 0x0, 0x0, 0x6, 0x50, 0x0, 0x3, - 0x80, 0x4, 0x55, 0x5d, 0x55, 0x55, 0x55, 0x51, - 0x0, 0x0, 0x56, 0x0, 0x0, 0x11, 0x0, 0x0, - 0x1, 0x95, 0x56, 0xa5, 0x66, 0x0, 0x0, 0x18, - 0x0, 0x2, 0xa0, 0x0, 0x0, 0x1, 0x70, 0x0, - 0x2, 0xa0, 0x0, 0x0, 0x3, 0x4, 0x55, 0x56, - 0xc5, 0x56, 0xd1, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5DF1 "己" */ - 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x65, - 0x55, 0x55, 0x55, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x3, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xb5, 0x55, 0x55, 0x55, 0xd0, 0x0, 0xb, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0x10, 0x0, 0x0, - 0x0, 0x5, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x70, 0xa, 0x52, 0x22, 0x22, 0x22, 0x6e, 0x0, - 0x29, 0x99, 0x99, 0x99, 0x99, 0x50, - - /* U+5DF2 "已" */ - 0x4, 0x55, 0x55, 0x55, 0x5b, 0x0, 0x1, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x5, 0x10, 0x0, 0x0, 0xc, 0x0, - 0xb, 0x65, 0x55, 0x55, 0x5c, 0x0, 0xb, 0x10, - 0x0, 0x0, 0x9, 0x0, 0xb, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x10, 0x0, 0x0, 0x0, 0x10, - 0xb, 0x10, 0x0, 0x0, 0x0, 0x50, 0xb, 0x10, - 0x0, 0x0, 0x0, 0x62, 0xa, 0x42, 0x22, 0x22, - 0x22, 0xb8, 0x2, 0x88, 0x88, 0x88, 0x88, 0x72, - - /* U+5E02 "市" */ - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x90, 0x0, 0x19, 0x4, 0x65, 0x55, 0x5d, 0x55, - 0x55, 0x52, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x10, - 0x0, 0xc, 0x55, 0x5d, 0x55, 0x6d, 0x0, 0x0, - 0xc0, 0x0, 0xc0, 0x1, 0xb0, 0x0, 0xc, 0x0, - 0xc, 0x0, 0x1b, 0x0, 0x0, 0xc0, 0x0, 0xc0, - 0x1, 0xb0, 0x0, 0xc, 0x0, 0xc, 0x0, 0x1b, - 0x0, 0x0, 0xc0, 0x0, 0xc0, 0x56, 0xa0, 0x0, - 0xa, 0x0, 0xc, 0x1, 0xb4, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, - - /* U+5E03 "布" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0x60, 0x0, 0x1, 0x40, 0x5, 0x55, 0x5d, - 0x55, 0x55, 0x56, 0x81, 0x0, 0x0, 0x57, 0x9, - 0x30, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xb, 0x0, - 0x4, 0x0, 0x0, 0x8, 0xe5, 0x5c, 0x55, 0x5d, - 0x0, 0x0, 0x54, 0xc0, 0xb, 0x0, 0xc, 0x0, - 0x4, 0x40, 0xc0, 0xb, 0x0, 0xc, 0x0, 0x12, - 0x0, 0xc0, 0xb, 0x0, 0xc, 0x0, 0x0, 0x0, - 0xc0, 0xb, 0x2, 0x2c, 0x0, 0x0, 0x0, 0xb0, - 0xb, 0x1, 0xc6, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x0, - - /* U+5E08 "师" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa3, 0x55, 0x55, 0x55, 0xa5, 0x3, 0xa, 0x11, - 0x0, 0xb0, 0x0, 0x0, 0xa2, 0xa1, 0x0, 0xb, - 0x0, 0x0, 0xa, 0x1a, 0x1a, 0x55, 0xc5, 0x5c, - 0x20, 0xa1, 0xa1, 0xb0, 0xb, 0x0, 0xa0, 0xa, - 0x1a, 0xb, 0x0, 0xb0, 0xa, 0x0, 0xa1, 0xb0, - 0xb0, 0xb, 0x0, 0xa0, 0xa, 0x1b, 0xb, 0x0, - 0xb0, 0xa, 0x0, 0x32, 0x80, 0xb0, 0xb, 0x1, - 0xb0, 0x0, 0x82, 0x7, 0x0, 0xb0, 0x6b, 0x0, - 0x27, 0x0, 0x0, 0xb, 0x0, 0x0, 0x6, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x3, 0x0, 0x0, - - /* U+5E0C "希" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x14, 0x52, 0x3, 0xc8, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xdd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x68, - 0x14, 0xcb, 0x10, 0x0, 0x0, 0x44, 0xc, 0x40, - 0x6, 0x51, 0x0, 0x16, 0x55, 0x7c, 0x55, 0x55, - 0x5b, 0x80, 0x0, 0x0, 0xb1, 0x94, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x85, 0xb7, 0x55, 0x91, 0x0, - 0x0, 0x8c, 0x20, 0x92, 0x0, 0xc0, 0x0, 0x25, - 0x9, 0x20, 0x92, 0x0, 0xc0, 0x0, 0x0, 0x9, - 0x20, 0x92, 0x11, 0xd0, 0x0, 0x0, 0xa, 0x20, - 0x92, 0x2b, 0x90, 0x0, 0x0, 0x1, 0x0, 0xa3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+5E2B "師" */ - 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x10, 0x0, 0x0, 0x0, 0x20, 0x23, 0x30, 0x36, - 0x55, 0xa5, 0x58, 0x2c, 0x55, 0x5c, 0x0, 0xb, - 0x0, 0x0, 0xb0, 0x0, 0xb3, 0x54, 0xc4, 0x49, - 0xc, 0x55, 0x5b, 0x55, 0xb, 0x0, 0xb0, 0xb0, - 0x0, 0x45, 0x50, 0xb0, 0xb, 0xc, 0x55, 0x58, - 0x55, 0xb, 0x0, 0xb0, 0xb0, 0x0, 0xb5, 0x50, - 0xb0, 0xb, 0xb, 0x0, 0xb, 0x55, 0xb, 0x0, - 0xb0, 0xb0, 0x0, 0xb5, 0x40, 0xb3, 0xb9, 0xc, - 0x55, 0x5b, 0x0, 0xb, 0x1, 0x0, 0x70, 0x0, - 0x10, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, - - /* U+5E2D "席" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0x0, 0x20, 0x0, 0xc5, - 0x55, 0x58, 0x55, 0x57, 0x80, 0x0, 0xc0, 0x6, - 0x50, 0xc, 0x0, 0x0, 0x0, 0xc3, 0x59, 0x85, - 0x5d, 0x5a, 0x50, 0x0, 0xb0, 0x5, 0x50, 0xb, - 0x0, 0x0, 0x0, 0xb0, 0x6, 0x86, 0x5c, 0x0, - 0x0, 0x1, 0xa0, 0x3, 0x1b, 0x4, 0x0, 0x0, - 0x2, 0x90, 0xa5, 0x5c, 0x55, 0x5c, 0x0, 0x5, - 0x60, 0xb0, 0xb, 0x0, 0xb, 0x0, 0x8, 0x10, - 0xb0, 0xb, 0x0, 0xb, 0x0, 0x7, 0x0, 0xb0, - 0xb, 0x3, 0xba, 0x0, 0x22, 0x0, 0x30, 0xb, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+5E2F "帯" */ - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x20, 0x37, 0x0, 0x80, 0x0, 0x3, 0x5a, - 0x75, 0x79, 0x55, 0xd8, 0xc0, 0x0, 0x7, 0x30, - 0x36, 0x0, 0xb0, 0x0, 0x0, 0x9, 0x75, 0x68, - 0x55, 0xc0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x20, 0x40, 0x4, 0x85, 0x55, 0x78, 0x55, 0x56, - 0xd1, 0xb, 0x22, 0x0, 0x37, 0x0, 0x24, 0x0, - 0x0, 0xc, 0x55, 0x79, 0x55, 0xa5, 0x0, 0x0, - 0xb, 0x0, 0x36, 0x0, 0x73, 0x0, 0x0, 0xb, - 0x0, 0x36, 0x0, 0x73, 0x0, 0x0, 0xb, 0x0, - 0x36, 0x16, 0xd2, 0x0, 0x0, 0x1, 0x0, 0x36, - 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x0, - - /* U+5E30 "帰" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0xb, 0x14, 0x65, 0x55, 0x5c, 0x20, 0x0, 0xb, - 0x0, 0x0, 0x0, 0xb, 0x0, 0x3, 0xb, 0x2, - 0x65, 0x55, 0x5c, 0x0, 0xa, 0xb, 0x3, 0x55, - 0x55, 0x5c, 0x0, 0xa, 0xb, 0x3, 0x0, 0x0, - 0x3, 0x20, 0xa, 0xb, 0x48, 0x55, 0xb5, 0x55, - 0xd2, 0xa, 0xb, 0x82, 0x0, 0xb0, 0x3, 0x20, - 0x2, 0x19, 0x9, 0x65, 0xc5, 0x5d, 0x10, 0x0, - 0x55, 0x9, 0x20, 0xb0, 0xb, 0x0, 0x0, 0x80, - 0x9, 0x20, 0xb0, 0xb, 0x0, 0x1, 0x70, 0x9, - 0x20, 0xb1, 0x7d, 0x0, 0x5, 0x0, 0x3, 0x0, - 0xb0, 0x24, 0x0, 0x1, 0x0, 0x0, 0x0, 0x40, - 0x0, 0x0, - - /* U+5E33 "帳" */ - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0x0, 0xb, 0x55, 0x58, 0x50, 0x0, 0x1b, - 0x0, 0xb, 0x0, 0x4, 0x0, 0xb, 0x5d, 0x5c, - 0xc, 0x55, 0x56, 0x0, 0xb, 0x1b, 0xb, 0xb, - 0x0, 0x6, 0x0, 0xb, 0x1b, 0xb, 0xc, 0x55, - 0x55, 0x10, 0xb, 0x1b, 0xb, 0x5c, 0x55, 0x55, - 0xb1, 0xb, 0x1b, 0xb, 0x28, 0x13, 0x1, 0x10, - 0xb, 0x1b, 0xb, 0x28, 0x7, 0xa, 0x60, 0xa, - 0x1c, 0x96, 0x28, 0x6, 0x82, 0x0, 0x0, 0x1b, - 0x0, 0x28, 0x0, 0xb1, 0x0, 0x0, 0x1b, 0x0, - 0x2a, 0x72, 0x3d, 0x30, 0x0, 0x1c, 0x0, 0x3c, - 0x10, 0x4, 0xb2, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5E36 "帶" */ - 0x0, 0x3, 0x2, 0x2, 0x2, 0x0, 0x0, 0x0, - 0xb, 0x1a, 0x1a, 0x2a, 0x30, 0x0, 0x3, 0x5d, - 0x5c, 0x5c, 0x5b, 0x6d, 0x70, 0x0, 0xb, 0xa, - 0xa, 0x9, 0x10, 0x30, 0x0, 0x64, 0xa, 0x5c, - 0x9, 0x65, 0xa0, 0x4, 0x20, 0x4, 0x3, 0x1, - 0x44, 0x20, 0x6, 0x55, 0x55, 0x86, 0x55, 0x58, - 0xc0, 0xd, 0x0, 0x0, 0x92, 0x0, 0x36, 0x10, - 0x14, 0x49, 0x55, 0xb6, 0x55, 0xd0, 0x0, 0x0, - 0x46, 0x0, 0x91, 0x0, 0xb0, 0x0, 0x0, 0x46, - 0x0, 0x91, 0x0, 0xb0, 0x0, 0x0, 0x45, 0x0, - 0x91, 0x28, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x91, - 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x0, - - /* U+5E38 "常" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x5, - 0x70, 0xc, 0x5, 0x90, 0x0, 0x0, 0xb, 0x10, - 0xb0, 0x80, 0x0, 0x0, 0x85, 0x55, 0x59, 0x65, - 0x55, 0xe1, 0x67, 0x2, 0x0, 0x0, 0x30, 0x53, - 0x5, 0x10, 0x96, 0x55, 0x5c, 0x10, 0x0, 0x0, - 0x9, 0x20, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x86, - 0x5c, 0x58, 0x0, 0x0, 0x0, 0x95, 0x55, 0xc5, - 0x57, 0x60, 0x0, 0xc, 0x0, 0xb, 0x0, 0x56, - 0x0, 0x0, 0xc0, 0x0, 0xb0, 0x5, 0x60, 0x0, - 0xc, 0x0, 0xb, 0x7, 0xc4, 0x0, 0x0, 0x30, - 0x0, 0xb0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, - - /* U+5E45 "幅" */ - 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x55, 0x55, 0x55, 0xa1, 0x0, 0xa0, 0x1, - 0x0, 0x0, 0x0, 0xa, 0x5c, 0x5b, 0x9, 0x55, - 0x5c, 0x0, 0xa0, 0xa0, 0xa0, 0xb0, 0x0, 0xb0, - 0xa, 0xa, 0xa, 0xc, 0x55, 0x5b, 0x0, 0xa0, - 0xa0, 0xa0, 0x70, 0x0, 0x40, 0xa, 0xa, 0xa, - 0x95, 0x59, 0x55, 0xb0, 0xa0, 0xa0, 0xa9, 0x0, - 0xa0, 0x1a, 0xb, 0xa, 0x78, 0x95, 0x5c, 0x55, - 0xa0, 0x30, 0xa1, 0x9, 0x0, 0xa0, 0x1a, 0x0, - 0xb, 0x0, 0x95, 0x5c, 0x55, 0xa0, 0x0, 0xb0, - 0xa, 0x0, 0x0, 0x1a, 0x0, 0x2, 0x0, 0x10, - 0x0, 0x0, 0x0, - - /* U+5E73 "平" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x55, 0x55, 0x55, 0x55, 0x8b, 0x0, 0x0, 0x10, - 0x0, 0xa2, 0x0, 0x30, 0x0, 0x0, 0x9, 0x0, - 0xa2, 0x4, 0xd1, 0x0, 0x0, 0x6, 0xb0, 0xa2, - 0x9, 0x10, 0x0, 0x0, 0x0, 0xb0, 0xa2, 0x42, - 0x0, 0x0, 0x36, 0x55, 0x55, 0xc7, 0x65, 0x5a, - 0x90, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5E74 "年" */ - 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x65, 0x55, 0x55, 0x5c, 0x60, 0x0, 0x74, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x3, 0x60, 0x0, 0xd, - 0x0, 0x0, 0x0, 0x4, 0x8, 0x55, 0x5d, 0x55, - 0xa7, 0x0, 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x2, 0x80, 0x17, - 0x55, 0x55, 0x5d, 0x55, 0x55, 0x51, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x0, - - /* U+5E78 "幸" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x16, - 0x55, 0xc6, 0x58, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xa1, 0x0, 0x0, 0x0, 0x5, 0x55, 0x55, 0xb6, - 0x55, 0x6d, 0x30, 0x0, 0x0, 0x52, 0x0, 0x83, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0xa0, 0x0, - 0x0, 0x0, 0x65, 0x57, 0x68, 0x65, 0xc3, 0x0, - 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa1, 0x0, 0x7, 0x50, 0x26, 0x55, - 0x55, 0xc6, 0x55, 0x55, 0x40, 0x0, 0x0, 0x0, - 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x0, - - /* U+5E7E "幾" */ - 0x0, 0x0, 0x10, 0x13, 0x0, 0x20, 0x0, 0x0, - 0x4, 0xa0, 0x1a, 0x4, 0xa0, 0x0, 0x0, 0x18, - 0x2, 0xa, 0x18, 0x3, 0x0, 0x1, 0xb6, 0x6b, - 0x1b, 0xa8, 0x5c, 0x30, 0x0, 0x32, 0x80, 0xa, - 0x10, 0x82, 0x0, 0x0, 0x36, 0x28, 0xb, 0x3a, - 0x47, 0x60, 0x0, 0x99, 0x67, 0x3a, 0x2a, 0x30, - 0x90, 0x0, 0x3, 0x90, 0x9, 0x12, 0x73, 0x40, - 0x5, 0x58, 0x95, 0x59, 0x85, 0x57, 0x60, 0x0, - 0x9, 0x80, 0x2, 0x90, 0xaa, 0x0, 0x0, 0x9, - 0x3c, 0x0, 0xbb, 0x70, 0x2, 0x0, 0x71, 0x3, - 0x4, 0xac, 0x40, 0x24, 0x5, 0x20, 0x4, 0x73, - 0x1, 0x9c, 0xc4, 0x1, 0x0, 0x30, 0x0, 0x0, - 0x1, 0x52, - - /* U+5E83 "広" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x5, 0x30, 0x8, 0x20, 0x9, 0x85, 0x55, 0x55, - 0x55, 0x53, 0x0, 0x94, 0x0, 0x4, 0x20, 0x0, - 0x0, 0x9, 0x30, 0x0, 0xb7, 0x0, 0x0, 0x0, - 0xa3, 0x0, 0x2d, 0x0, 0x0, 0x0, 0xb, 0x10, - 0x8, 0x40, 0x0, 0x0, 0x0, 0xc0, 0x1, 0xa0, - 0x0, 0x0, 0x0, 0xa, 0x0, 0x82, 0x0, 0x19, - 0x10, 0x3, 0x50, 0x46, 0x0, 0x0, 0x3d, 0x10, - 0x70, 0x2e, 0x99, 0x98, 0x87, 0xc8, 0x15, 0x0, - 0x84, 0x10, 0x0, 0x2, 0x61, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5E86 "庆" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x85, - 0x55, 0x5c, 0x55, 0x5b, 0x80, 0x0, 0xc0, 0x0, - 0x7, 0x10, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xc, 0x0, - 0x0, 0x10, 0x0, 0xc3, 0x65, 0x5d, 0x65, 0x57, - 0x80, 0x0, 0xc0, 0x0, 0xc, 0x50, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x29, 0x71, 0x0, 0x0, 0x1, - 0xa0, 0x0, 0x84, 0x19, 0x0, 0x0, 0x5, 0x60, - 0x1, 0xb0, 0x7, 0x70, 0x0, 0x8, 0x0, 0x29, - 0x10, 0x0, 0xab, 0x30, 0x24, 0x5, 0x60, 0x0, - 0x0, 0x8, 0x91, 0x10, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5E95 "底" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0xb5, - 0x55, 0x5b, 0x55, 0x5a, 0x70, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0xd0, 0x42, 0x47, - 0x9b, 0xb5, 0x0, 0x0, 0xd0, 0xc3, 0x15, 0x80, - 0x0, 0x0, 0x0, 0xd0, 0xc0, 0x2, 0xa0, 0x2, - 0x0, 0x0, 0xd0, 0xc5, 0x55, 0xd5, 0x59, 0x40, - 0x0, 0xb0, 0xc0, 0x0, 0xb1, 0x0, 0x0, 0x2, - 0x80, 0xc0, 0x0, 0x77, 0x0, 0x0, 0x6, 0x30, - 0xc1, 0x75, 0xd, 0x20, 0x50, 0x8, 0x0, 0xdb, - 0x38, 0x13, 0xd4, 0x90, 0x23, 0x0, 0x30, 0x5, - 0x80, 0x2b, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, - - /* U+5E97 "店" */ - 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x10, 0x0, 0x20, 0x0, 0x86, - 0x55, 0x5a, 0x55, 0x58, 0xb1, 0x0, 0x93, 0x0, - 0xa, 0x20, 0x0, 0x0, 0x0, 0x93, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x0, 0x93, 0x0, 0xc, 0x55, - 0x5b, 0x40, 0x0, 0xa2, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x0, 0xa2, 0x0, 0xc, 0x0, 0x1, 0x0, - 0x0, 0xc0, 0xb5, 0x58, 0x55, 0x5e, 0x0, 0x0, - 0xc0, 0xb0, 0x0, 0x0, 0xd, 0x0, 0x3, 0x70, - 0xb0, 0x0, 0x0, 0xd, 0x0, 0x7, 0x0, 0xb5, - 0x55, 0x55, 0x5d, 0x0, 0x23, 0x0, 0xb0, 0x0, - 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5E9C "府" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x0, 0x0, 0x10, 0x0, 0xa5, - 0x55, 0x59, 0x55, 0x59, 0x90, 0x0, 0xc0, 0x2, - 0x50, 0x0, 0x61, 0x0, 0x0, 0xc0, 0x8, 0x70, - 0x0, 0xb0, 0x0, 0x0, 0xc0, 0xc, 0x0, 0x0, - 0xb0, 0x60, 0x0, 0xc0, 0x7d, 0x26, 0x55, 0xc5, - 0x51, 0x0, 0xb1, 0x9b, 0x12, 0x0, 0xb0, 0x0, - 0x2, 0xa7, 0xb, 0x9, 0x50, 0xb0, 0x0, 0x4, - 0x70, 0xb, 0x1, 0x90, 0xb0, 0x0, 0x7, 0x10, - 0xb, 0x0, 0x0, 0xb0, 0x0, 0x8, 0x0, 0xb, - 0x0, 0x0, 0xb0, 0x0, 0x32, 0x0, 0xb, 0x0, - 0x39, 0xc0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x1, - 0x20, 0x0, - - /* U+5EA6 "度" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3c, 0x0, 0x1, 0x0, 0x0, 0xb5, - 0x55, 0x58, 0x55, 0x59, 0x70, 0x0, 0xc0, 0x9, - 0x30, 0xa, 0x20, 0x0, 0x0, 0xc4, 0x5b, 0x65, - 0x5d, 0x5b, 0x40, 0x0, 0xc0, 0x9, 0x20, 0xb, - 0x0, 0x0, 0x0, 0xc0, 0x9, 0x65, 0x5c, 0x0, - 0x0, 0x0, 0xc0, 0x4, 0x0, 0x3, 0x20, 0x0, - 0x0, 0xa0, 0x47, 0x55, 0x59, 0xb0, 0x0, 0x2, - 0x70, 0x0, 0x70, 0x2c, 0x0, 0x0, 0x6, 0x20, - 0x0, 0x29, 0xc1, 0x0, 0x0, 0x7, 0x0, 0x0, - 0x6a, 0xb6, 0x10, 0x0, 0x23, 0x2, 0x67, 0x30, - 0x7, 0xcd, 0x80, 0x10, 0x22, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+5EA7 "座" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4b, 0x0, 0x1, 0x0, 0x0, 0x95, - 0x55, 0x5b, 0x55, 0x5d, 0x50, 0x0, 0xd0, 0x0, - 0x3, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x36, 0xa, - 0x20, 0x81, 0x0, 0x0, 0xc0, 0x75, 0xa, 0x1, - 0xd0, 0x0, 0x0, 0xc0, 0xa5, 0xa, 0x6, 0x94, - 0x0, 0x0, 0xc2, 0x55, 0x9a, 0x8, 0x9, 0x70, - 0x0, 0xb6, 0x0, 0x5a, 0x41, 0x21, 0x30, 0x1, - 0x90, 0x65, 0x5c, 0x55, 0x86, 0x0, 0x5, 0x40, - 0x0, 0xa, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, - 0xa, 0x0, 0x0, 0x0, 0x14, 0x15, 0x55, 0x5c, - 0x55, 0x5b, 0xa0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5EAB "庫" */ - 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x65, 0x55, - 0x5a, 0x55, 0x5d, 0x30, 0x8, 0x30, 0x0, 0x28, - 0x0, 0x0, 0x0, 0x83, 0x65, 0x56, 0xb5, 0x88, - 0x0, 0x8, 0x30, 0x20, 0x19, 0x3, 0x0, 0x0, - 0x92, 0xd, 0x56, 0xb5, 0xc2, 0x0, 0xa, 0x10, - 0xc5, 0x6b, 0x5c, 0x10, 0x0, 0xa0, 0xb, 0x1, - 0x90, 0xa1, 0x0, 0xa, 0x0, 0xc5, 0x6b, 0x59, - 0x10, 0x3, 0x53, 0x55, 0x56, 0xb5, 0x5d, 0x50, - 0x70, 0x1, 0x0, 0x19, 0x0, 0x0, 0x23, 0x0, - 0x0, 0x2, 0xa0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x12, 0x0, 0x0, - - /* U+5EAD "庭" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x0, 0x3, 0x0, 0x2, 0xa5, - 0x55, 0x58, 0x55, 0x59, 0x40, 0x2, 0xa0, 0x2, - 0x0, 0x0, 0x48, 0x0, 0x2, 0xa6, 0x6e, 0x24, - 0x5d, 0x53, 0x0, 0x2, 0xa0, 0x84, 0x0, 0xc, - 0x0, 0x0, 0x2, 0x95, 0x82, 0x10, 0xc, 0x4, - 0x10, 0x2, 0x97, 0x5b, 0x56, 0x5d, 0x55, 0x30, - 0x3, 0x72, 0xb, 0x0, 0xc, 0x0, 0x0, 0x4, - 0x53, 0x69, 0x0, 0xc, 0x0, 0x30, 0x7, 0x10, - 0xd5, 0x26, 0x56, 0x55, 0x60, 0x7, 0x7, 0x68, - 0x94, 0x10, 0x0, 0x0, 0x32, 0x74, 0x0, 0x28, - 0xbd, 0xef, 0xa1, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5EB7 "康" */ - 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x40, 0x1, 0x20, 0x0, 0xa5, - 0x55, 0x57, 0x65, 0x58, 0x80, 0x0, 0xa1, 0x0, - 0xc, 0x0, 0x20, 0x0, 0x0, 0xa1, 0x65, 0x5c, - 0x55, 0xc3, 0x0, 0x0, 0xa5, 0x55, 0x5c, 0x55, - 0xc7, 0xa0, 0x0, 0xb2, 0x0, 0xb, 0x0, 0xa0, - 0x0, 0x0, 0xc0, 0x65, 0x5c, 0x65, 0xc1, 0x0, - 0x0, 0xb0, 0x44, 0xb, 0x50, 0x2a, 0x20, 0x1, - 0xa0, 0xb, 0x2c, 0x54, 0x83, 0x0, 0x5, 0x40, - 0x7, 0x5b, 0xb, 0x20, 0x0, 0x8, 0x9, 0xa1, - 0xb, 0x1, 0xc7, 0x20, 0x23, 0x5, 0x3, 0xba, - 0x0, 0x9, 0x60, 0x10, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+5EE0 "廠" */ - 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x10, 0x1, 0x10, 0x0, 0x85, - 0x55, 0x58, 0x55, 0x59, 0x80, 0x0, 0xb0, 0x2, - 0x70, 0x2, 0x30, 0x0, 0x0, 0xb1, 0x63, 0xb2, - 0x96, 0x60, 0x0, 0x0, 0xb0, 0x84, 0xb6, 0x9, - 0x44, 0x60, 0x0, 0xb3, 0x66, 0xb6, 0x9a, 0x19, - 0x20, 0x0, 0xa4, 0x61, 0x12, 0xb6, 0x19, 0x0, - 0x0, 0xa4, 0x6b, 0x87, 0xa1, 0x59, 0x0, 0x0, - 0x84, 0x69, 0x46, 0x90, 0xa6, 0x0, 0x4, 0x44, - 0x69, 0x75, 0x90, 0xb4, 0x0, 0x6, 0x4, 0x60, - 0x13, 0x95, 0x4b, 0x20, 0x4, 0x4, 0x30, 0x8, - 0x73, 0x2, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5EFA "建" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x5, 0x57, - 0xa2, 0x55, 0xc5, 0x5b, 0x0, 0x0, 0xa, 0x20, - 0x0, 0xb0, 0xb, 0x20, 0x0, 0x48, 0x15, 0x55, - 0xc5, 0x5d, 0x70, 0x0, 0xa0, 0x1, 0x22, 0xb2, - 0x2b, 0x0, 0x5, 0x85, 0xd2, 0x33, 0xc3, 0x35, - 0x0, 0x0, 0x0, 0xa2, 0x55, 0xc5, 0x86, 0x0, - 0x1, 0x33, 0x70, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0x77, 0x45, 0x55, 0xc5, 0x57, 0x70, 0x0, 0x2d, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x77, 0xb5, - 0x10, 0xa0, 0x0, 0x0, 0x5, 0x20, 0x17, 0xbc, - 0xcc, 0xde, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5EFF "廿" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc2, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0xc, 0x1, 0x60, 0x6, 0x55, 0xd5, 0x55, 0x5d, - 0x56, 0x61, 0x0, 0x0, 0xc0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xc5, - 0x55, 0x5c, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x0, - 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5F0F "式" */ - 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xc2, 0x81, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xb0, 0x68, 0x0, 0x3, 0x55, 0x55, - 0x56, 0xd5, 0x5b, 0xa0, 0x1, 0x10, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xc0, - 0x0, 0x0, 0x3, 0x65, 0x85, 0xb3, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x93, 0x0, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x58, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0xd, 0x0, 0x30, 0x0, 0x0, - 0xd6, 0x64, 0x8, 0x80, 0x60, 0x8, 0xba, 0x61, - 0x0, 0x0, 0xc8, 0x90, 0x5, 0x20, 0x0, 0x0, - 0x0, 0xa, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, - - /* U+5F15 "引" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x55, 0x55, - 0x59, 0x0, 0xb4, 0x1, 0x0, 0x2, 0x90, 0xa, - 0x10, 0x0, 0x0, 0x29, 0x0, 0xa1, 0x6, 0x75, - 0x56, 0xa0, 0xa, 0x10, 0x93, 0x0, 0x12, 0x0, - 0xa1, 0xc, 0x0, 0x0, 0x0, 0xa, 0x12, 0xc5, - 0x55, 0x5d, 0x10, 0xa1, 0x0, 0x0, 0x0, 0xa0, - 0xa, 0x10, 0x0, 0x0, 0x47, 0x0, 0xa1, 0x0, - 0x0, 0x8, 0x40, 0xa, 0x10, 0x2, 0x54, 0xd0, - 0x0, 0xa1, 0x0, 0x4, 0xe4, 0x0, 0xb, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x10, - - /* U+5F1F "弟" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x94, 0x0, 0xd, 0x30, 0x0, 0x0, 0x1, 0xb0, - 0x6, 0x30, 0x0, 0x0, 0x46, 0x55, 0x58, 0x75, - 0x5d, 0x0, 0x0, 0x0, 0x1, 0xa0, 0x0, 0xc0, - 0x0, 0x8, 0x55, 0x6c, 0x55, 0x5c, 0x0, 0x1, - 0xb0, 0x1, 0xa0, 0x0, 0x60, 0x0, 0x76, 0x0, - 0x1a, 0x0, 0x0, 0x40, 0x6, 0x55, 0x6f, 0xc5, - 0x55, 0x7c, 0x0, 0x0, 0xb, 0x5a, 0x0, 0x4, - 0x80, 0x0, 0x9, 0x41, 0xa0, 0x0, 0x75, 0x0, - 0x18, 0x20, 0x1a, 0x5, 0xad, 0x20, 0x35, 0x0, - 0x2, 0xb0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, - - /* U+5F31 "弱" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, - 0x55, 0xb3, 0x56, 0x55, 0xc1, 0x0, 0x0, 0xa, - 0x10, 0x0, 0xb, 0x0, 0x3, 0x0, 0xa1, 0x14, - 0x22, 0xc0, 0x0, 0xc5, 0x59, 0x13, 0x92, 0x27, - 0x0, 0x1a, 0x0, 0x0, 0x65, 0x0, 0x10, 0x4, - 0x95, 0x5c, 0x3a, 0x65, 0x5a, 0x60, 0x4, 0x10, - 0xb0, 0x5, 0x10, 0x75, 0x0, 0x1c, 0xb, 0x0, - 0x2b, 0x7, 0x50, 0x0, 0x24, 0xc0, 0x0, 0x45, - 0x84, 0x2, 0x87, 0xb, 0x3, 0x86, 0x8, 0x40, - 0xc3, 0x0, 0xb0, 0xa2, 0x10, 0xb2, 0x0, 0x6, - 0xd6, 0x0, 0x3, 0xcc, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x1, 0x0, - - /* U+5F35 "張" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x55, 0x92, 0x75, 0x55, 0x5b, 0x20, 0x0, 0x0, - 0xa1, 0x91, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa1, - 0x96, 0x55, 0x67, 0x0, 0x8, 0x55, 0xc1, 0x91, - 0x0, 0x5, 0x0, 0xc, 0x0, 0x30, 0x96, 0x55, - 0x55, 0x0, 0xb, 0x0, 0x2, 0xa4, 0x33, 0x35, - 0x60, 0x3c, 0x55, 0x96, 0xc2, 0x72, 0x23, 0x20, - 0x0, 0x0, 0xa2, 0xb0, 0x51, 0x2c, 0x20, 0x0, - 0x0, 0xb0, 0xb0, 0x19, 0x60, 0x0, 0x0, 0x0, - 0xb0, 0xb0, 0x7, 0x50, 0x0, 0x2, 0x14, 0x80, - 0xb5, 0x60, 0xb7, 0x0, 0x0, 0xaf, 0x20, 0xd7, - 0x0, 0x1b, 0x90, 0x0, 0x1, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+5F37 "強" */ - 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x1, 0x55, - 0x5a, 0x20, 0xc, 0x50, 0x0, 0x0, 0x0, 0xa0, - 0x7, 0x30, 0x10, 0x0, 0x0, 0xa, 0x6, 0x20, - 0x1, 0xa3, 0x9, 0x55, 0xc4, 0xd9, 0x88, 0x44, - 0xc0, 0xb0, 0x2, 0x0, 0x2, 0xa0, 0x1, 0xa, - 0x0, 0x0, 0xa5, 0x6b, 0x5b, 0x14, 0xb5, 0x59, - 0x3b, 0x2, 0x90, 0xb0, 0x0, 0x0, 0xb1, 0xb0, - 0x29, 0xb, 0x0, 0x0, 0xc, 0xc, 0x56, 0xb5, - 0xb0, 0x0, 0x1, 0xb0, 0x0, 0x29, 0x5, 0x0, - 0x20, 0x77, 0x1, 0x25, 0xb5, 0x87, 0x0, 0xad, - 0x2, 0xd8, 0x53, 0x0, 0xb0, 0x1, 0x10, 0x0, - 0x0, 0x0, 0x0, - - /* U+5F53 "当" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x50, 0x2, 0x0, 0x4, 0x80, 0xa, 0x10, - 0x4e, 0x10, 0x0, 0x7a, 0xa, 0x10, 0xb2, 0x0, - 0x0, 0x5, 0xa, 0x16, 0x10, 0x0, 0x16, 0x55, - 0x5b, 0x65, 0x55, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x3, 0x55, 0x55, 0x55, 0x55, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x46, 0x55, 0x55, 0x55, 0x55, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x20, - - /* U+5F62 "形" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x55, 0x55, 0x5b, 0x50, 0x1d, 0x10, 0x0, 0xc, - 0x0, 0xb0, 0x0, 0x95, 0x0, 0x0, 0xc, 0x0, - 0xb0, 0x5, 0x50, 0x0, 0x0, 0xc, 0x0, 0xb0, - 0x24, 0x0, 0x0, 0x0, 0xc, 0x0, 0xb4, 0x40, - 0xa, 0x70, 0x5, 0x5d, 0x55, 0xc5, 0x40, 0x79, - 0x0, 0x0, 0xc, 0x0, 0xb0, 0x7, 0x60, 0x0, - 0x0, 0x1a, 0x0, 0xb0, 0x63, 0x0, 0x40, 0x0, - 0x56, 0x0, 0xb0, 0x0, 0x8, 0xd1, 0x0, 0x91, - 0x0, 0xb0, 0x0, 0x79, 0x0, 0x2, 0x60, 0x0, - 0xb0, 0x8, 0x50, 0x0, 0x6, 0x0, 0x0, 0x73, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+5F71 "影" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x95, 0x55, 0x5c, 0x0, 0x8, 0x50, 0x1, 0xa0, - 0x0, 0xb, 0x0, 0x3b, 0x0, 0x1, 0xb5, 0x55, - 0x5b, 0x1, 0x90, 0x0, 0x1, 0xb5, 0x85, 0x5a, - 0x15, 0x0, 0x10, 0x2, 0x22, 0xb2, 0x26, 0x40, - 0x2, 0xe1, 0x4, 0x53, 0x33, 0x37, 0x20, 0xb, - 0x20, 0x0, 0xc5, 0x55, 0x6b, 0x0, 0x91, 0x0, - 0x0, 0xa0, 0x0, 0x1a, 0x16, 0x0, 0x33, 0x0, - 0x95, 0xc5, 0x67, 0x0, 0x1, 0xd5, 0x0, 0x66, - 0xb3, 0x60, 0x0, 0x2b, 0x20, 0x1, 0x90, 0xb0, - 0x77, 0x4, 0x91, 0x0, 0x6, 0x17, 0xd0, 0x3, - 0x64, 0x0, 0x0, 0x0, 0x0, 0x10, 0x2, 0x0, - 0x0, 0x0, - - /* U+5F79 "役" */ - 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x80, 0x2a, 0x55, 0xc0, 0x0, 0x0, 0x49, - 0x0, 0x29, 0x0, 0xb0, 0x0, 0x2, 0x80, 0x20, - 0x47, 0x0, 0xb0, 0x0, 0x4, 0x3, 0xe1, 0x82, - 0x0, 0xc0, 0x10, 0x0, 0xc, 0x24, 0x50, 0x0, - 0x68, 0x83, 0x0, 0x8c, 0x23, 0x55, 0x55, 0x78, - 0x0, 0x5, 0x4c, 0x0, 0x5, 0x0, 0x93, 0x0, - 0x13, 0xc, 0x0, 0x6, 0x1, 0xb0, 0x0, 0x0, - 0xc, 0x0, 0x1, 0x8a, 0x30, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x19, 0x57, 0xa2, 0x0, 0x0, 0xc, 0x5, 0x71, - 0x0, 0x4c, 0xc1, 0x0, 0x3, 0x20, 0x0, 0x0, - 0x0, 0x0, - - /* U+5F7C "彼" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0xd, 0x20, 0x0, 0xc, 0x0, 0x0, 0x0, 0x57, - 0x0, 0x30, 0xb, 0x0, 0x40, 0x1, 0x90, 0x30, - 0xd5, 0x5c, 0x57, 0xc1, 0x6, 0x6, 0xb0, 0xb0, - 0xb, 0x5, 0x0, 0x0, 0xc, 0x10, 0xb0, 0xb, - 0x0, 0x0, 0x0, 0x8b, 0x0, 0xc6, 0x58, 0x5c, - 0x20, 0x4, 0x5b, 0x0, 0xa1, 0x40, 0x1a, 0x0, - 0x3, 0xb, 0x2, 0x90, 0x80, 0x83, 0x0, 0x0, - 0xb, 0x5, 0x50, 0x65, 0xa0, 0x0, 0x0, 0xb, - 0x8, 0x0, 0x1f, 0x20, 0x0, 0x0, 0xb, 0x16, - 0x3, 0x94, 0xb5, 0x0, 0x0, 0xb, 0x53, 0x53, - 0x0, 0x1a, 0xc1, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5F80 "往" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x90, 0x4, 0x70, 0x0, 0x0, 0x0, 0x1b, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x71, 0x0, - 0x0, 0x20, 0x6, 0x10, 0x4, 0x2, 0xa5, 0x55, - 0xd5, 0x55, 0x30, 0x0, 0xa, 0x60, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0x4d, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x1, 0x9c, 0x1, 0x55, 0xd5, 0x5a, 0x10, - 0x7, 0xc, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x10, - 0xc, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xc0, 0x0, 0x50, 0x0, 0xc, 0x36, 0x55, - 0x75, 0x56, 0x71, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5F85 "待" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x7, 0x90, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x1b, - 0x0, 0x0, 0xc0, 0x5, 0x0, 0x0, 0x91, 0x32, - 0x55, 0xd5, 0x55, 0x0, 0x5, 0x13, 0xd0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0xb, 0x47, 0x55, 0x95, - 0x55, 0xa1, 0x0, 0x6d, 0x0, 0x0, 0x0, 0xa1, - 0x0, 0x2, 0x6c, 0x5, 0x55, 0x55, 0xd5, 0xb0, - 0x4, 0xc, 0x0, 0x30, 0x0, 0xb0, 0x0, 0x0, - 0xc, 0x0, 0x3a, 0x0, 0xb0, 0x0, 0x0, 0xc, - 0x0, 0xa, 0x0, 0xb0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x5b, 0xc0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x2, - 0x10, 0x0, - - /* U+5F88 "很" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x40, 0x75, 0x55, 0x59, 0x0, 0x0, 0x47, - 0x0, 0xb0, 0x0, 0xb, 0x0, 0x0, 0x80, 0x30, - 0xb0, 0x0, 0xb, 0x0, 0x5, 0x3, 0xc0, 0xb5, - 0x55, 0x5b, 0x0, 0x0, 0xa, 0x20, 0xb0, 0x0, - 0xb, 0x0, 0x0, 0x4c, 0x0, 0xb5, 0x65, 0x5b, - 0x0, 0x0, 0x8b, 0x0, 0xb0, 0x60, 0x8, 0x20, - 0x6, 0xb, 0x0, 0xb0, 0x61, 0x67, 0x10, 0x0, - 0xb, 0x0, 0xb0, 0xb, 0x10, 0x0, 0x0, 0xb, - 0x0, 0xb0, 0x6, 0x80, 0x0, 0x0, 0xb, 0x0, - 0xb6, 0x71, 0x7c, 0x40, 0x0, 0xc, 0x0, 0xb5, - 0x0, 0x3, 0x81, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5F8B "律" */ - 0x0, 0x4, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, - 0x4b, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xa1, - 0x3, 0x55, 0xd5, 0x5a, 0x10, 0x5, 0x24, 0x50, - 0x0, 0xc0, 0xc, 0x0, 0x2, 0xb, 0x66, 0x55, - 0xd5, 0x5d, 0xa3, 0x0, 0x3b, 0x0, 0x0, 0xc0, - 0xc, 0x0, 0x0, 0xba, 0x4, 0x65, 0xd5, 0x5b, - 0x0, 0x6, 0x3a, 0x0, 0x0, 0xc0, 0x4, 0x0, - 0x2, 0x1a, 0x5, 0x55, 0xd5, 0x56, 0x20, 0x0, - 0x1a, 0x0, 0x0, 0xc0, 0x0, 0x60, 0x0, 0x1a, - 0x56, 0x55, 0xd5, 0x55, 0x51, 0x0, 0x1a, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x40, - 0x0, 0x0, - - /* U+5F8C "後" */ - 0x0, 0x0, 0x10, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x7, 0xb0, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x2b, - 0x0, 0x9, 0x20, 0x97, 0x0, 0x1, 0x90, 0x31, - 0xd8, 0x59, 0x70, 0x0, 0x6, 0x3, 0xd1, 0x41, - 0x83, 0x31, 0x0, 0x0, 0xb, 0x20, 0x58, 0x0, - 0x2c, 0x20, 0x0, 0x8d, 0x4, 0xcc, 0x85, 0x35, - 0x70, 0x6, 0x5c, 0x0, 0xc, 0x20, 0x12, 0x0, - 0x12, 0xc, 0x0, 0x89, 0x55, 0xaa, 0x0, 0x0, - 0xc, 0x4, 0x54, 0x21, 0xc0, 0x0, 0x0, 0xc, - 0x13, 0x0, 0x9b, 0x20, 0x0, 0x0, 0xc, 0x0, - 0x1, 0xab, 0x40, 0x0, 0x0, 0xc, 0x2, 0x77, - 0x10, 0x7d, 0xa2, 0x0, 0x3, 0x22, 0x0, 0x0, - 0x0, 0x20, - - /* U+5F92 "徒" */ - 0x0, 0x2, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0xc, 0x40, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x58, - 0x0, 0x0, 0x92, 0x3, 0x0, 0x1, 0x90, 0x42, - 0x65, 0xb7, 0x57, 0x40, 0x6, 0x5, 0xc0, 0x0, - 0x92, 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x92, - 0x1, 0x70, 0x0, 0x7c, 0x16, 0x55, 0xb8, 0x55, - 0x51, 0x3, 0x8c, 0x0, 0xa0, 0x92, 0x0, 0x0, - 0x15, 0xc, 0x1, 0xb0, 0x97, 0x59, 0x50, 0x0, - 0xc, 0x3, 0xa0, 0x92, 0x0, 0x0, 0x0, 0xc, - 0x7, 0x35, 0x92, 0x0, 0x0, 0x0, 0xc, 0x7, - 0x3, 0xd6, 0x10, 0x0, 0x0, 0xc, 0x40, 0x0, - 0x6, 0xbe, 0xe3, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+5F93 "従" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x7, 0xc0, 0x73, 0x0, 0xb, 0x60, 0x0, 0x2b, - 0x0, 0xd, 0x20, 0x29, 0x0, 0x0, 0x90, 0x20, - 0x5, 0x40, 0x70, 0x0, 0x6, 0x1, 0xe4, 0x55, - 0x55, 0x66, 0xc1, 0x0, 0x9, 0x60, 0x10, 0xc, - 0x0, 0x0, 0x0, 0x4d, 0x0, 0x51, 0xc, 0x0, - 0x0, 0x1, 0x8c, 0x0, 0xa4, 0xc, 0x2, 0x20, - 0x5, 0xc, 0x0, 0xb1, 0xd, 0x55, 0x30, 0x0, - 0xc, 0x0, 0xd1, 0xc, 0x0, 0x0, 0x0, 0xc, - 0x2, 0x97, 0x1c, 0x0, 0x0, 0x0, 0xc, 0x7, - 0x10, 0xac, 0x0, 0x0, 0x0, 0xc, 0x23, 0x0, - 0x7, 0xdc, 0xa3, 0x0, 0x2, 0x10, 0x0, 0x0, - 0x2, 0x40, - - /* U+5F97 "得" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xd0, 0x85, 0x55, 0x5b, 0x0, 0x0, 0x2b, - 0x10, 0xb0, 0x0, 0x1a, 0x0, 0x1, 0x80, 0x42, - 0xb5, 0x55, 0x6a, 0x0, 0x4, 0x0, 0xd5, 0xb0, - 0x0, 0x1a, 0x0, 0x0, 0x8, 0x60, 0xc5, 0x55, - 0x6a, 0x0, 0x0, 0x4d, 0x3, 0x65, 0x55, 0x58, - 0x60, 0x3, 0x6c, 0x0, 0x10, 0x0, 0xc0, 0x0, - 0x3, 0xc, 0x16, 0x55, 0x55, 0xd5, 0xc1, 0x0, - 0xc, 0x0, 0x51, 0x0, 0xc0, 0x0, 0x0, 0xc, - 0x0, 0x2c, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, - 0x5, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x4a, 0xd0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, - 0x10, 0x0, - - /* U+5F9E "從" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xa0, 0x6b, 0x0, 0x5a, 0x0, 0x0, 0x2a, - 0x0, 0x85, 0x0, 0x94, 0x0, 0x0, 0x80, 0x10, - 0xa8, 0x30, 0xb7, 0x0, 0x5, 0x0, 0xe4, 0x61, - 0xd5, 0x33, 0xc0, 0x0, 0x8, 0x55, 0x0, 0x15, - 0x0, 0x40, 0x0, 0x4c, 0x0, 0x0, 0x9, 0x0, - 0x0, 0x3, 0x7c, 0x0, 0xa3, 0xc, 0x0, 0x0, - 0x13, 0xc, 0x0, 0xc0, 0xd, 0x59, 0x20, 0x0, - 0xc, 0x0, 0xc0, 0xc, 0x0, 0x0, 0x0, 0xc, - 0x1, 0xc7, 0xc, 0x0, 0x0, 0x0, 0xc, 0x6, - 0x21, 0xad, 0x30, 0x0, 0x0, 0xc, 0x24, 0x0, - 0x4, 0xae, 0xd4, 0x0, 0x1, 0x10, 0x0, 0x0, - 0x0, 0x10, - - /* U+5FA1 "御" */ - 0x0, 0x1, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x50, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x48, - 0x2, 0x80, 0x40, 0x63, 0x71, 0x2, 0x70, 0x37, - 0x6b, 0x52, 0xc1, 0xb0, 0x4, 0x5, 0xa6, 0xa, - 0x0, 0xb0, 0xa0, 0x0, 0xb, 0x15, 0x5b, 0x86, - 0xb0, 0xa0, 0x0, 0x99, 0x0, 0xa, 0x0, 0xb0, - 0xa0, 0x4, 0x49, 0xa, 0x1a, 0x31, 0xb0, 0xa0, - 0x2, 0x19, 0xa, 0xb, 0x53, 0xb0, 0xa0, 0x0, - 0x19, 0xa, 0xa, 0x0, 0xb0, 0xa0, 0x0, 0x19, - 0xa, 0x1c, 0x52, 0xb6, 0xb0, 0x0, 0x19, 0x4d, - 0x82, 0x0, 0xb0, 0x10, 0x0, 0x29, 0x1, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+5FA9 "復" */ - 0x0, 0x0, 0x10, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xc0, 0xd, 0x20, 0x0, 0x0, 0x0, 0x1b, - 0x0, 0x6a, 0x55, 0x57, 0x90, 0x0, 0x91, 0x1, - 0x72, 0x0, 0x3, 0x10, 0x6, 0x0, 0x94, 0xd, - 0x55, 0x5b, 0x40, 0x0, 0x7, 0x80, 0xc, 0x55, - 0x5b, 0x20, 0x0, 0x3c, 0x0, 0xb, 0x0, 0x9, - 0x20, 0x1, 0x8b, 0x0, 0xa, 0xc5, 0x58, 0x10, - 0x4, 0xb, 0x0, 0x8, 0x85, 0x5a, 0x10, 0x0, - 0xb, 0x0, 0x45, 0x50, 0x6a, 0x0, 0x0, 0xb, - 0x3, 0x30, 0x38, 0xb0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x5c, 0x80, 0x0, 0x0, 0xb, 0x0, 0x47, - 0x30, 0x6d, 0xa2, 0x0, 0x1, 0x2, 0x0, 0x0, - 0x0, 0x20, - - /* U+5FC3 "心" */ - 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x40, 0xe, 0x60, 0x0, 0x0, 0x0, 0x0, 0xc4, - 0x5, 0x20, 0x0, 0x0, 0x0, 0x30, 0xb1, 0x0, - 0x0, 0x21, 0x0, 0x0, 0x80, 0xb1, 0x0, 0x0, - 0xb, 0x10, 0x3, 0xa0, 0xb1, 0x0, 0x0, 0x6, - 0xb0, 0xd, 0x70, 0xb1, 0x0, 0x0, 0x42, 0xd0, - 0x4, 0x0, 0xb1, 0x0, 0x0, 0x60, 0x10, 0x0, - 0x0, 0xb2, 0x0, 0x3, 0x90, 0x0, 0x0, 0x0, - 0x7d, 0xaa, 0xad, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x11, 0x10, 0x0, 0x0, - - /* U+5FC5 "必" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x53, 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, - 0xb5, 0x7, 0x80, 0x0, 0x0, 0xc, 0x23, 0xb0, - 0xc1, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x49, 0x0, - 0x0, 0x5, 0xc, 0x0, 0xb, 0x13, 0x20, 0x0, - 0x80, 0xc0, 0x4, 0x80, 0xa, 0x10, 0x67, 0xc, - 0x0, 0xb1, 0x0, 0x6a, 0xa, 0x20, 0xc0, 0x93, - 0x0, 0x21, 0x70, 0x0, 0xc, 0x76, 0x0, 0x6, - 0x0, 0x0, 0x0, 0xd5, 0x0, 0x1, 0xb0, 0x0, - 0x16, 0x79, 0xdc, 0xcc, 0xdb, 0x0, 0x13, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5FD8 "忘" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2d, 0x0, 0x4, 0x70, 0x6, 0x55, 0xd5, - 0x55, 0x55, 0x55, 0x50, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xd5, 0x55, 0x55, 0x7c, - 0x0, 0x0, 0x0, 0x50, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x30, 0x2d, 0x10, 0x0, 0x0, 0x0, - 0x40, 0x95, 0x9, 0x20, 0x19, 0x10, 0x0, 0xa0, - 0x83, 0x0, 0x0, 0x45, 0xc0, 0x6, 0xc0, 0x83, - 0x0, 0x0, 0x90, 0x70, 0x1, 0x0, 0x5c, 0xaa, - 0xab, 0xb0, 0x0, - - /* U+5FD9 "忙" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x95, 0x0, 0x2, 0x90, 0x0, 0x0, 0x0, 0x92, - 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, 0x93, 0x0, - 0x0, 0x22, 0x2, 0x60, 0x2, 0x9a, 0x85, 0xd5, - 0x55, 0x55, 0x50, 0x9, 0x93, 0xa0, 0xc0, 0x0, - 0x0, 0x0, 0x4a, 0x92, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x21, 0x92, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x92, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x92, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x92, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x93, 0x0, - 0xc0, 0x0, 0x4, 0x20, 0x0, 0xa3, 0x1, 0x85, - 0x55, 0x55, 0x40, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5FEB "快" */ - 0x0, 0x13, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - 0x2c, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x1a, - 0x0, 0x0, 0xc0, 0x1, 0x0, 0x0, 0x1c, 0x3, - 0x55, 0xd5, 0x5e, 0x10, 0x1, 0x3b, 0xb3, 0x0, - 0xc0, 0xc, 0x0, 0x7, 0x4a, 0x35, 0x0, 0xc0, - 0xc, 0x0, 0xd, 0x2a, 0x0, 0x0, 0xb0, 0xc, - 0x20, 0x0, 0x1a, 0x26, 0x56, 0xc6, 0x59, 0x94, - 0x0, 0x1a, 0x0, 0x6, 0x66, 0x0, 0x0, 0x0, - 0x1a, 0x0, 0xb, 0x16, 0x20, 0x0, 0x0, 0x1a, - 0x0, 0x47, 0x0, 0xa0, 0x0, 0x0, 0x1a, 0x2, - 0x90, 0x0, 0x5b, 0x10, 0x0, 0x2b, 0x37, 0x0, - 0x0, 0x7, 0xe4, 0x0, 0x1, 0x10, 0x0, 0x0, - 0x0, 0x10, - - /* U+5FF5 "念" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x45, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa5, - 0x50, 0x67, 0x0, 0x0, 0x0, 0xa, 0x30, 0x77, - 0x4, 0xd8, 0x41, 0x4, 0x71, 0x0, 0x13, 0x3, - 0x7, 0x80, 0x12, 0x4, 0x65, 0x55, 0x7e, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, - 0x0, 0x0, 0x42, 0x93, 0x90, 0x0, 0x0, 0x0, - 0x40, 0xd2, 0x96, 0x0, 0x23, 0x0, 0x0, 0xb0, - 0xc0, 0x10, 0x4, 0xb, 0x40, 0x7, 0x80, 0xc0, - 0x0, 0x8, 0x24, 0x60, 0x0, 0x0, 0xac, 0xaa, - 0xad, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+600E "怎" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xb5, 0x55, 0x55, 0x6c, 0x10, 0x0, 0x1a, 0xc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x81, 0xc, 0x55, - 0x56, 0xb0, 0x0, 0x5, 0x10, 0xc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x55, 0x55, 0xb7, - 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x30, 0xc1, 0x1d, 0x0, 0x17, 0x0, 0x0, 0x90, - 0xc0, 0x6, 0x0, 0x36, 0xb0, 0x9, 0x70, 0xc0, - 0x0, 0x1, 0x60, 0xa0, 0x4, 0x0, 0x8b, 0xaa, - 0xac, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6012 "怒" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x60, 0x1, 0x11, 0x15, 0x0, 0x5, 0x5d, - 0x57, 0x67, 0x44, 0x7c, 0x0, 0x0, 0x28, 0x9, - 0x31, 0x50, 0xa3, 0x0, 0x0, 0x92, 0xb, 0x0, - 0x76, 0x90, 0x0, 0x0, 0x26, 0xc9, 0x0, 0x4f, - 0x40, 0x0, 0x0, 0x7, 0x58, 0x55, 0x71, 0xb9, - 0x30, 0x4, 0x61, 0x3, 0x52, 0x0, 0x6, 0x80, - 0x10, 0x0, 0x10, 0x55, 0x0, 0x10, 0x0, 0x0, - 0x40, 0xb2, 0xd, 0x30, 0x39, 0x0, 0x0, 0xa0, - 0xb1, 0x4, 0x2, 0x8, 0x90, 0x7, 0x70, 0xb1, - 0x0, 0x6, 0x20, 0x40, 0x0, 0x0, 0x8c, 0xbb, - 0xbd, 0x50, 0x0, - - /* U+6015 "怕" */ - 0x0, 0x3, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, - 0xd1, 0x0, 0x7, 0x70, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x80, 0x0, 0x0, 0x0, 0xc0, 0x9, 0x57, - 0x55, 0xc2, 0x1, 0x2c, 0xa2, 0xc0, 0x0, 0xc, - 0x0, 0x64, 0xc3, 0x3c, 0x0, 0x0, 0xc0, 0xd, - 0x2c, 0x0, 0xc0, 0x0, 0xc, 0x0, 0x0, 0xc0, - 0xc, 0x55, 0x55, 0xd0, 0x0, 0xc, 0x0, 0xc0, - 0x0, 0xc, 0x0, 0x0, 0xc0, 0xc, 0x0, 0x0, - 0xc0, 0x0, 0xc, 0x0, 0xc0, 0x0, 0xc, 0x0, - 0x0, 0xc0, 0xc, 0x55, 0x55, 0xd0, 0x0, 0xd, - 0x0, 0xc0, 0x0, 0xb, 0x0, 0x0, 0x20, 0x1, - 0x0, 0x0, 0x0, - - /* U+601D "思" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x55, 0x58, 0x55, 0x5d, 0x0, 0x0, 0xc, - 0x0, 0xc, 0x0, 0xc, 0x0, 0x0, 0xc, 0x0, - 0xc, 0x0, 0xc, 0x0, 0x0, 0xd, 0x55, 0x5d, - 0x55, 0x5c, 0x0, 0x0, 0xc, 0x0, 0xc, 0x0, - 0xc, 0x0, 0x0, 0xc, 0x0, 0xc, 0x0, 0xc, - 0x0, 0x0, 0xd, 0x55, 0x65, 0x55, 0x5b, 0x0, - 0x0, 0x1, 0x30, 0x69, 0x0, 0x0, 0x0, 0x0, - 0x60, 0x95, 0xb, 0x20, 0x33, 0x91, 0x1, 0xb0, - 0x93, 0x0, 0x0, 0xc3, 0x6b, 0x8, 0x80, 0x94, - 0x0, 0x0, 0xe6, 0x6, 0x0, 0x0, 0x6d, 0xbb, - 0xbc, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6025 "急" */ - 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5b, 0x10, 0x12, 0x0, 0x0, 0x0, 0x1, - 0xb5, 0x55, 0xba, 0x0, 0x0, 0x0, 0x8, 0x0, - 0x2, 0x70, 0x2, 0x0, 0x0, 0x76, 0x55, 0x56, - 0x55, 0x8c, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x49, 0x0, 0x0, 0x2, 0x65, 0x55, 0x55, 0x79, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, - 0x0, 0x6, 0x55, 0x96, 0x55, 0x77, 0x0, 0x0, - 0x10, 0xb2, 0x1d, 0x11, 0x14, 0x0, 0x0, 0x80, - 0xc0, 0x3, 0x5, 0x7, 0x90, 0x5, 0xb0, 0xc0, - 0x0, 0x7, 0x20, 0x90, 0x2, 0x10, 0x9b, 0xaa, - 0xad, 0x50, 0x0, - - /* U+6027 "性" */ - 0x0, 0x13, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x1c, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x1a, - 0x0, 0x77, 0xc, 0x0, 0x0, 0x0, 0x1c, 0x40, - 0xa3, 0xc, 0x0, 0x10, 0x2, 0x4a, 0xa3, 0xd5, - 0x5d, 0x57, 0xa0, 0x7, 0x5a, 0x14, 0x60, 0xc, - 0x0, 0x0, 0xa, 0x2a, 0x7, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x1a, 0x2, 0x45, 0x5d, 0x59, 0x70, - 0x0, 0x1a, 0x0, 0x10, 0xc, 0x0, 0x0, 0x0, - 0x1a, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x1a, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x1a, 0x0, - 0x0, 0xc, 0x0, 0x71, 0x0, 0x2b, 0x7, 0x55, - 0x55, 0x55, 0x53, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+606F "息" */ - 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x37, 0x0, 0x5, 0x0, 0x0, 0xd, 0x55, - 0x55, 0x55, 0xe0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0xd, 0x55, 0x55, 0x55, 0xc0, - 0x0, 0x0, 0xd5, 0x55, 0x55, 0x5c, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd5, - 0x55, 0x55, 0x5d, 0x0, 0x0, 0x5, 0x0, 0x83, - 0x0, 0x30, 0x0, 0x2, 0xc, 0x22, 0xf0, 0x0, - 0x40, 0x0, 0x90, 0xd0, 0x3, 0x3, 0x17, 0x80, - 0xa8, 0xd, 0x0, 0x0, 0x54, 0x1c, 0x4, 0x0, - 0x9b, 0xaa, 0xac, 0x60, 0x0, - - /* U+60A8 "您" */ - 0x0, 0x2, 0x10, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x96, 0x8, 0x90, 0x0, 0x0, 0x0, 0x1c, 0x0, - 0xd5, 0x55, 0x59, 0x30, 0x9, 0xa0, 0x62, 0x3, - 0x0, 0xa2, 0x4, 0x6a, 0x23, 0x20, 0xc1, 0x20, - 0x0, 0x41, 0xa0, 0x1d, 0x1c, 0x7, 0x10, 0x0, - 0x1a, 0x8, 0x20, 0xc0, 0x2d, 0x10, 0x1, 0xa3, - 0x14, 0x8e, 0x0, 0x61, 0x0, 0x15, 0x0, 0x44, - 0x40, 0x0, 0x0, 0x1, 0x18, 0x55, 0x90, 0x2, - 0x40, 0x0, 0x81, 0x73, 0x7, 0x0, 0x48, 0x70, - 0x4e, 0x7, 0x30, 0x0, 0x28, 0x9, 0x1, 0x10, - 0x4b, 0x99, 0x9b, 0x80, 0x0, - - /* U+60AA "悪" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, - 0x55, 0x65, 0x56, 0x58, 0xa0, 0x0, 0x0, 0xc, - 0x0, 0xc0, 0x0, 0x0, 0x8, 0x65, 0xd5, 0x5d, - 0x5c, 0x30, 0x0, 0x92, 0xc, 0x0, 0xc0, 0xb0, - 0x0, 0x9, 0x75, 0xd5, 0x5d, 0x5c, 0x10, 0x0, - 0x30, 0xc, 0x0, 0xc0, 0x24, 0x0, 0x55, 0x55, - 0x95, 0x59, 0x56, 0xa3, 0x0, 0x0, 0x20, 0x64, - 0x0, 0x0, 0x0, 0x3, 0x1d, 0x0, 0xc3, 0x1, - 0x70, 0x0, 0x91, 0xb0, 0x2, 0x4, 0x7, 0x70, - 0xb8, 0x1b, 0x0, 0x0, 0x63, 0x17, 0x3, 0x0, - 0xdb, 0xbb, 0xbd, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+60B2 "悲" */ - 0x0, 0x0, 0x3, 0x0, 0x40, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0x3, 0x55, - 0x5c, 0x0, 0xd5, 0x57, 0x50, 0x0, 0x0, 0xc, - 0x0, 0xc0, 0x2, 0x0, 0x0, 0x55, 0x5c, 0x0, - 0xd5, 0x57, 0x0, 0x0, 0x0, 0xc, 0x0, 0xc0, - 0x0, 0x10, 0x5, 0x55, 0x5c, 0x0, 0xd5, 0x57, - 0x70, 0x0, 0x0, 0xd, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x21, 0x46, 0x0, 0x11, 0x0, 0x0, - 0x40, 0xd1, 0xb, 0x30, 0x9, 0x40, 0x2, 0x80, - 0xc0, 0x2, 0x0, 0x41, 0xb0, 0xc, 0x40, 0xc0, - 0x0, 0x1, 0x80, 0x10, 0x0, 0x0, 0xbb, 0xaa, - 0xac, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+60C5 "情" */ - 0x0, 0x20, 0x0, 0x0, 0x30, 0x0, 0x0, 0xa, - 0x40, 0x0, 0xd, 0x0, 0x0, 0x0, 0xa2, 0x26, - 0x55, 0xd5, 0x6a, 0x0, 0x1a, 0x93, 0x0, 0xc, - 0x3, 0x0, 0x7, 0xa4, 0x74, 0x65, 0xd5, 0x63, - 0x4, 0x9a, 0x24, 0x55, 0x5d, 0x55, 0x86, 0x21, - 0xa2, 0x12, 0x0, 0x0, 0x20, 0x0, 0xa, 0x20, - 0xa5, 0x55, 0x5c, 0x30, 0x0, 0xa2, 0xa, 0x65, - 0x55, 0xc1, 0x0, 0xa, 0x20, 0xa1, 0x0, 0xa, - 0x10, 0x0, 0xa2, 0xa, 0x65, 0x55, 0xc1, 0x0, - 0xa, 0x20, 0xa1, 0x0, 0xa, 0x10, 0x0, 0xa2, - 0xa, 0x10, 0x28, 0xe0, 0x0, 0x2, 0x0, 0x20, - 0x0, 0x2, 0x0, - - /* U+60F3 "想" */ - 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0x30, 0x8, 0x55, 0x59, 0x10, 0x0, 0x8, - 0x24, 0xb, 0x0, 0xb, 0x0, 0x6, 0x5c, 0x78, - 0x2c, 0x55, 0x5c, 0x0, 0x0, 0x1f, 0x70, 0xb, - 0x0, 0xb, 0x0, 0x0, 0x8c, 0x6c, 0xc, 0x55, - 0x5c, 0x0, 0x2, 0x78, 0x25, 0xb, 0x0, 0xb, - 0x0, 0x6, 0x9, 0x20, 0xd, 0x55, 0x5c, 0x0, - 0x10, 0x7, 0x20, 0x46, 0x0, 0x4, 0x0, 0x0, - 0x0, 0x71, 0x2d, 0x0, 0x2, 0x0, 0x0, 0x70, - 0xb0, 0x7, 0x14, 0x7, 0x60, 0x4, 0xa0, 0xb0, - 0x0, 0x6, 0x10, 0xc0, 0x4, 0x20, 0x8a, 0x99, - 0x9c, 0x40, 0x0, - - /* U+6108 "愈" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa5, - 0x17, 0x0, 0x0, 0x0, 0x3, 0x93, 0x11, 0x7b, - 0x61, 0x0, 0x35, 0x52, 0x36, 0x33, 0x17, 0xda, - 0x10, 0xc, 0x55, 0xb0, 0x80, 0xc0, 0x0, 0x0, - 0xb4, 0x4a, 0x9, 0xa, 0x0, 0x0, 0xc, 0x55, - 0xa0, 0xa0, 0xa0, 0x0, 0x0, 0xa0, 0x69, 0x3, - 0x2b, 0x0, 0x0, 0x5, 0x23, 0x84, 0x5, 0x60, - 0x0, 0x1, 0x18, 0x40, 0xc0, 0x0, 0x70, 0x0, - 0xa1, 0x83, 0x0, 0x2, 0x15, 0xa0, 0x27, 0x5, - 0xb9, 0x99, 0xb6, 0x2, 0x0, - - /* U+610F "意" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x75, 0x0, 0x30, 0x0, 0x0, 0x25, - 0x76, 0x66, 0x97, 0x80, 0x0, 0x0, 0x0, 0xc, - 0x0, 0xa1, 0x1, 0x0, 0x6, 0x55, 0x57, 0x56, - 0x65, 0x59, 0x80, 0x0, 0x7, 0x55, 0x55, 0x55, - 0x70, 0x0, 0x0, 0xb, 0x0, 0x0, 0x2, 0x90, - 0x0, 0x0, 0xc, 0x55, 0x55, 0x56, 0x90, 0x0, - 0x0, 0xc, 0x55, 0x55, 0x56, 0x90, 0x0, 0x0, - 0x5, 0x20, 0x71, 0x1, 0x30, 0x0, 0x0, 0x50, - 0xc0, 0x3a, 0x1, 0x39, 0x10, 0x2, 0xa0, 0xb0, - 0x1, 0x6, 0x6, 0x90, 0x8, 0x40, 0xaa, 0x99, - 0x9d, 0x10, 0x10, - - /* U+611A "愚" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, - 0x58, 0x55, 0x5c, 0x0, 0x0, 0xc0, 0x9, 0x10, - 0xb, 0x0, 0x0, 0xd5, 0x5b, 0x65, 0x5b, 0x0, - 0x0, 0xd5, 0x5b, 0x65, 0x5c, 0x0, 0x3, 0x30, - 0x9, 0x10, 0x1, 0x50, 0xd, 0x55, 0x5b, 0x67, - 0x55, 0xc1, 0xc, 0x1, 0x2a, 0x57, 0xb0, 0xb0, - 0xc, 0xb, 0x74, 0x10, 0x60, 0xb0, 0xb, 0x1, - 0x1a, 0x20, 0x29, 0xb0, 0x3, 0xc, 0x4, 0x80, - 0x23, 0x60, 0x1a, 0xb, 0x0, 0x0, 0x60, 0x97, - 0x74, 0x9, 0xa9, 0x99, 0xc4, 0x13, - - /* U+611B "愛" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x1, 0x24, - 0x57, 0x8a, 0xcc, 0x50, 0x1, 0x43, 0x7, 0x10, - 0x86, 0x0, 0x2, 0xb, 0x2, 0x60, 0x70, 0x12, - 0x2a, 0x56, 0x5a, 0x75, 0x55, 0xb7, 0xa4, 0x5a, - 0x31, 0xd1, 0x13, 0x80, 0x8, 0x59, 0x30, 0x10, - 0x64, 0x4c, 0x6, 0x4, 0xaa, 0xaa, 0x92, 0x2, - 0x0, 0xa, 0x50, 0x0, 0x10, 0x0, 0x0, 0x5a, - 0x85, 0x59, 0xc0, 0x0, 0x4, 0x50, 0x64, 0x5a, - 0x10, 0x0, 0x1, 0x0, 0x2d, 0xe2, 0x0, 0x0, - 0x2, 0x57, 0x61, 0x3a, 0xdb, 0x93, 0x12, 0x0, - 0x0, 0x0, 0x3, 0x30, - - /* U+611F "感" */ - 0x0, 0x0, 0x0, 0x0, 0x41, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb0, 0xa2, 0x0, 0x0, 0x95, - 0x55, 0x55, 0xc5, 0x67, 0xb0, 0x0, 0xb0, 0x0, - 0x2, 0x91, 0x3, 0x0, 0x0, 0xb3, 0x55, 0x56, - 0x73, 0x2d, 0x10, 0x0, 0xb0, 0x85, 0x58, 0x48, - 0xb3, 0x0, 0x0, 0xb0, 0xb0, 0x1a, 0xe, 0x70, - 0x10, 0x3, 0x70, 0xd5, 0x6a, 0x4a, 0xa0, 0x50, - 0x8, 0x0, 0x60, 0x7, 0x40, 0x5c, 0xb0, 0x22, - 0x0, 0x50, 0x75, 0x0, 0x32, 0x82, 0x0, 0x70, - 0xd0, 0xc, 0x2, 0xc, 0x20, 0x7, 0x80, 0xb0, - 0x0, 0x7, 0x6, 0x40, 0x5, 0x10, 0xb9, 0x99, - 0x9c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+614B "態" */ - 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0x51, 0x1, 0xb0, 0x4, 0x0, 0x47, 0x10, 0x47, - 0x1b, 0x58, 0x61, 0x8, 0xa8, 0x54, 0x91, 0xa0, - 0x0, 0x70, 0xa, 0x55, 0x96, 0xb, 0x99, 0xa8, - 0x0, 0xc5, 0x59, 0x51, 0xc0, 0x16, 0x0, 0xb, - 0x0, 0x75, 0x1b, 0x69, 0x61, 0x0, 0xc4, 0x49, - 0x51, 0xb0, 0x0, 0x60, 0xc, 0x6, 0xc4, 0xc, - 0xaa, 0xb8, 0x0, 0x20, 0x55, 0x2a, 0x10, 0x3, - 0x0, 0x6, 0xc, 0x10, 0x47, 0x4, 0x58, 0x4, - 0xb0, 0xc0, 0x0, 0x0, 0x70, 0xc0, 0x42, 0xa, - 0xba, 0xaa, 0xc9, 0x0, 0x0, - - /* U+6163 "慣" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0xb2, 0x0, 0xc5, 0x87, 0x5c, 0x0, 0x0, 0xb0, - 0x0, 0xb0, 0x92, 0x1a, 0x50, 0x2, 0xb6, 0x56, - 0xb5, 0xd5, 0x8a, 0x50, 0x7, 0xb6, 0x55, 0xa5, - 0xd5, 0x97, 0x0, 0x49, 0xb2, 0x21, 0x10, 0x0, - 0x22, 0x0, 0x31, 0xb0, 0xa, 0x55, 0x55, 0x5c, - 0x0, 0x0, 0xb0, 0xb, 0x44, 0x44, 0x4b, 0x0, - 0x0, 0xb0, 0xb, 0x11, 0x11, 0x1b, 0x0, 0x0, - 0xb0, 0xb, 0x55, 0x55, 0x5b, 0x0, 0x0, 0xb0, - 0xc, 0x55, 0x55, 0x5b, 0x0, 0x0, 0xb0, 0x3, - 0xc4, 0x1, 0x84, 0x0, 0x0, 0xb0, 0x38, 0x20, - 0x0, 0x1d, 0x30, 0x0, 0x10, 0x20, 0x0, 0x0, - 0x1, 0x10, - - /* U+6167 "慧" */ - 0x0, 0x3, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0xc1, 0x40, 0xc, 0x3, 0x20, 0x36, 0x5c, 0x55, - 0x46, 0xc5, 0x53, 0x0, 0x65, 0xc6, 0x53, 0x6c, - 0x59, 0x10, 0x45, 0x5c, 0x59, 0x35, 0xc5, 0x59, - 0x1, 0x0, 0xa0, 0x0, 0x1a, 0x0, 0x0, 0x3, - 0x65, 0x55, 0x55, 0x59, 0x70, 0x0, 0x5, 0x55, - 0x55, 0x55, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x50, 0x0, 0x27, 0x65, 0x95, 0x55, 0x83, - 0x0, 0x4, 0xa, 0x35, 0x90, 0x21, 0x70, 0x0, - 0xa0, 0xa2, 0x3, 0x7, 0x13, 0xb0, 0x33, 0x7, - 0xb9, 0x99, 0xc3, 0x3, 0x0, - - /* U+616E "慮" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x11, 0x50, 0x0, 0x0, 0x10, - 0x0, 0x1b, 0x44, 0x42, 0x0, 0x0, 0xb6, 0x55, - 0x6a, 0x56, 0x5c, 0x50, 0x0, 0xa1, 0x24, 0x6b, - 0x58, 0x35, 0x0, 0x0, 0xb1, 0x30, 0x1a, 0x22, - 0x39, 0x0, 0x0, 0xb0, 0x20, 0x4, 0x66, 0xa3, - 0x0, 0x0, 0xb0, 0xc5, 0x5b, 0x65, 0xc2, 0x0, - 0x0, 0xb0, 0xb5, 0x5b, 0x65, 0xc0, 0x0, 0x0, - 0x90, 0xc5, 0x5a, 0x65, 0xc0, 0x0, 0x4, 0x40, - 0x28, 0x5, 0x60, 0x14, 0x0, 0x7, 0x4, 0x3d, - 0x0, 0x91, 0x42, 0xd0, 0x32, 0x3d, 0xb, 0xba, - 0xab, 0x80, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+61C9 "應" */ - 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x2b, 0x0, 0x1, 0x40, 0x0, 0xc5, - 0x56, 0x57, 0x76, 0x56, 0x70, 0x0, 0xc0, 0x2d, - 0x6b, 0x1b, 0x1, 0x0, 0x0, 0xc0, 0xb2, 0xc6, - 0x5a, 0x57, 0x40, 0x0, 0xc4, 0xc4, 0xc5, 0x5c, - 0x59, 0x0, 0x0, 0xc0, 0xb1, 0xa1, 0xa, 0x4, - 0x0, 0x0, 0xb0, 0xb0, 0xa5, 0x5c, 0x55, 0x10, - 0x0, 0xb0, 0xb0, 0xa5, 0x59, 0x56, 0x80, 0x3, - 0x80, 0x40, 0x41, 0x0, 0x1, 0x0, 0x7, 0x34, - 0x39, 0xa, 0x60, 0x24, 0x70, 0x8, 0x1b, 0x28, - 0x0, 0x60, 0x70, 0xc1, 0x23, 0x54, 0xc, 0xaa, - 0xab, 0xd1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+61F8 "懸" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, 0x0, - 0xa5, 0x5b, 0x33, 0x57, 0x9a, 0x70, 0x0, 0xb5, - 0x5b, 0x10, 0x19, 0x65, 0x10, 0x0, 0xa4, 0x4b, - 0x13, 0xd6, 0x9a, 0x30, 0x0, 0xa5, 0x5b, 0x10, - 0x5a, 0x32, 0x50, 0x0, 0xa0, 0x9, 0x55, 0xf9, - 0xa5, 0xb2, 0x6, 0x97, 0xa5, 0x54, 0x60, 0xb3, - 0x10, 0x2, 0xa4, 0x79, 0x24, 0xa1, 0xb3, 0xa0, - 0x5, 0x2a, 0x52, 0x65, 0x26, 0xa0, 0x81, 0x0, - 0x3, 0x50, 0x52, 0x6, 0x31, 0x0, 0x0, 0x51, - 0x90, 0x1d, 0x10, 0x8, 0x50, 0x4, 0xa1, 0x90, - 0x2, 0x0, 0x60, 0xc0, 0x7, 0x20, 0xca, 0xaa, - 0xac, 0xa0, 0x0, - - /* U+6210 "成" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0x15, 0x70, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xc3, 0x0, 0x0, 0x75, 0x55, - 0x5e, 0x55, 0x6b, 0x60, 0x0, 0xc1, 0x0, 0xb, - 0x10, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x9, 0x30, - 0x38, 0x0, 0x0, 0xc5, 0x58, 0x46, 0x60, 0x97, - 0x0, 0x0, 0xc0, 0x9, 0x33, 0x90, 0xd0, 0x0, - 0x0, 0xc0, 0xa, 0x10, 0xd7, 0x70, 0x0, 0x0, - 0xb0, 0xb, 0x0, 0x8e, 0x0, 0x20, 0x2, 0x74, - 0x6c, 0x0, 0xbd, 0x50, 0x60, 0x7, 0x10, 0x75, - 0x19, 0x12, 0xd9, 0x90, 0x6, 0x0, 0x2, 0x50, - 0x0, 0x9, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6211 "我" */ - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x8d, 0x6a, 0x51, 0x30, 0x0, 0x2, 0x43, - 0xc0, 0xa, 0x20, 0x99, 0x0, 0x0, 0x0, 0xc0, - 0x9, 0x20, 0x9, 0x0, 0x5, 0x55, 0xd5, 0x5b, - 0x75, 0x5a, 0x90, 0x1, 0x0, 0xc0, 0x7, 0x40, - 0x1, 0x0, 0x0, 0x0, 0xc0, 0x5, 0x60, 0x79, - 0x0, 0x0, 0x1, 0xe6, 0x33, 0x82, 0xb0, 0x0, - 0x18, 0xc8, 0xc0, 0x0, 0xcb, 0x10, 0x0, 0x6, - 0x10, 0xc0, 0x1, 0xe5, 0x0, 0x10, 0x0, 0x0, - 0xc0, 0x29, 0x4c, 0x10, 0x50, 0x0, 0x43, 0xc4, - 0x50, 0x2, 0xd6, 0x90, 0x0, 0x2d, 0x60, 0x0, - 0x0, 0x18, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6216 "或" */ - 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe1, 0xb4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x15, 0x40, 0x6, 0x55, 0x55, - 0x55, 0xd5, 0x56, 0x70, 0x0, 0x0, 0x1, 0x0, - 0xc0, 0x1, 0x0, 0x0, 0xd5, 0x5c, 0x50, 0xc0, - 0xe, 0x10, 0x0, 0xc0, 0xa, 0x20, 0xa2, 0x4a, - 0x0, 0x0, 0xc0, 0xa, 0x20, 0x74, 0xa3, 0x0, - 0x0, 0xd5, 0x5c, 0x20, 0x3b, 0xb0, 0x0, 0x0, - 0x50, 0x0, 0x0, 0xf, 0x40, 0x10, 0x0, 0x35, - 0x77, 0x54, 0x98, 0xb0, 0x50, 0x1f, 0xa5, 0x10, - 0x28, 0x10, 0x7c, 0xa0, 0x0, 0x0, 0x5, 0x40, - 0x0, 0x5, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6226 "戦" */ - 0x0, 0x2, 0x0, 0x10, 0x4, 0x0, 0x0, 0x8, - 0x18, 0x51, 0xb0, 0xe, 0x25, 0x0, 0x4, 0x81, - 0x66, 0x10, 0xc, 0x9, 0x50, 0x9, 0x55, 0x77, - 0xb0, 0xc, 0x1, 0x20, 0xb, 0x1, 0x90, 0xb0, - 0x2d, 0x55, 0x80, 0xb, 0x55, 0xb5, 0xb5, 0x3c, - 0x4, 0x20, 0xb, 0x1, 0x90, 0xb0, 0xc, 0xc, - 0x40, 0xb, 0x55, 0xb5, 0xb0, 0xc, 0x59, 0x0, - 0x7, 0x1, 0x90, 0x60, 0x9, 0xd1, 0x0, 0x0, - 0x1, 0x90, 0x43, 0x8, 0x90, 0x0, 0x27, 0x55, - 0xb5, 0x54, 0x4a, 0xd1, 0x51, 0x0, 0x1, 0x90, - 0x3, 0x90, 0x4d, 0xb0, 0x0, 0x1, 0xa0, 0x56, - 0x0, 0x6, 0xf1, 0x0, 0x0, 0x10, 0x10, 0x0, - 0x0, 0x31, - - /* U+6230 "戰" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0xa, - 0x5b, 0x57, 0xb2, 0xd, 0x34, 0x0, 0xa, 0xa, - 0x55, 0x91, 0xd, 0xa, 0x40, 0xb, 0x5b, 0x58, - 0xb1, 0xc, 0x1, 0x10, 0x5, 0x2, 0x21, 0x50, - 0xc, 0x46, 0x80, 0x7, 0x77, 0x95, 0xc3, 0x5c, - 0x3, 0x10, 0x7, 0x77, 0x95, 0xa0, 0xb, 0xb, - 0x40, 0x7, 0x33, 0x70, 0xa0, 0xa, 0x4a, 0x0, - 0x8, 0x77, 0x95, 0xa0, 0x7, 0xd2, 0x0, 0x3, - 0x3, 0x70, 0x20, 0x6, 0xb0, 0x0, 0x6, 0x57, - 0x95, 0x74, 0x2a, 0xb3, 0x60, 0x0, 0x3, 0x70, - 0x2, 0x80, 0x2d, 0xb0, 0x0, 0x4, 0x70, 0x34, - 0x0, 0x4, 0xf0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x21, - - /* U+623B "戻" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x55, 0x5a, 0x55, 0x5a, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0xe, 0x55, 0x55, 0x55, - 0x5c, 0x0, 0x0, 0x1c, 0x0, 0x8, 0x40, 0x4, - 0x0, 0x0, 0x3a, 0x0, 0xc, 0x20, 0x3, 0x0, - 0x0, 0x66, 0x65, 0x5d, 0x75, 0x58, 0x40, 0x0, - 0xa1, 0x0, 0x75, 0x43, 0x0, 0x0, 0x1, 0x90, - 0x3, 0xa0, 0x9, 0x30, 0x0, 0x7, 0x10, 0x38, - 0x0, 0x0, 0xb9, 0x20, 0x14, 0x15, 0x40, 0x0, - 0x0, 0x8, 0xc2, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+623F "房" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x3a, - 0x55, 0x56, 0x55, 0x5d, 0x10, 0x0, 0x39, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x2b, 0x55, 0x55, - 0x55, 0x5d, 0x0, 0x0, 0x38, 0x0, 0x8, 0x30, - 0x1, 0x0, 0x0, 0x47, 0x0, 0x2, 0x70, 0x1, - 0x50, 0x0, 0x56, 0x55, 0x8b, 0x55, 0x55, 0x50, - 0x0, 0x82, 0x0, 0x68, 0x0, 0x5, 0x0, 0x0, - 0xa0, 0x0, 0xb7, 0x55, 0x5e, 0x10, 0x2, 0x70, - 0x2, 0xd0, 0x0, 0x1c, 0x0, 0x6, 0x10, 0x1c, - 0x20, 0x0, 0x3a, 0x0, 0x13, 0x2, 0x92, 0x0, - 0x17, 0xd5, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x40, 0x0, - - /* U+6240 "所" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x21, 0x6b, 0x52, 0x4, 0x8c, 0x60, 0x0, 0xd4, - 0x0, 0xa, 0x61, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0xa, 0x30, 0x0, 0x0, 0x0, 0xd5, 0x59, 0x29, - 0x30, 0x0, 0x20, 0x0, 0xc0, 0xc, 0x9, 0x75, - 0x96, 0x80, 0x0, 0xc0, 0xc, 0xa, 0x20, 0xb0, - 0x0, 0x0, 0xd5, 0x5d, 0xc, 0x0, 0xb0, 0x0, - 0x0, 0xc0, 0x8, 0xb, 0x0, 0xb0, 0x0, 0x0, - 0xb0, 0x0, 0x47, 0x0, 0xb0, 0x0, 0x4, 0x60, - 0x0, 0x91, 0x0, 0xb0, 0x0, 0x7, 0x0, 0x4, - 0x50, 0x0, 0xb0, 0x0, 0x15, 0x0, 0x15, 0x0, - 0x0, 0xb1, 0x0, 0x10, 0x0, 0x10, 0x0, 0x0, - 0x10, 0x0, - - /* U+624B "手" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x25, 0x8c, 0xf3, 0x0, 0x2, 0x45, - 0x66, 0xd4, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x55, 0x55, 0xd5, - 0x55, 0xd5, 0x0, 0x0, 0x10, 0x0, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x0, 0x25, 0x55, 0x55, 0xd5, 0x55, 0x5b, 0xa0, - 0x1, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+624D "才" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x50, 0x5, 0x65, 0x55, 0x5c, - 0xd5, 0x56, 0x71, 0x0, 0x0, 0x0, 0x6a, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xd1, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x75, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x6, 0x50, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x63, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x5, 0x10, 0x1, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, - 0x0, 0x0, - - /* U+6253 "打" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x55, 0x57, 0x58, 0x90, 0x15, 0x5d, 0x5a, - 0x10, 0xd, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0xc, 0x1, 0x0, 0xd, - 0x0, 0x0, 0x0, 0xc, 0x73, 0x0, 0xd, 0x0, - 0x0, 0x29, 0xbd, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x5, 0xc, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x3, 0x2d, 0x0, - 0x3, 0x1d, 0x0, 0x0, 0x1, 0xbc, 0x0, 0x2, - 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+6255 "払" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb2, 0x0, 0x8, 0x50, 0x0, 0x0, 0xb, 0x0, - 0x0, 0xd3, 0x0, 0x1, 0x55, 0xd5, 0xa1, 0x1d, - 0x0, 0x0, 0x0, 0xb, 0x0, 0x5, 0x80, 0x0, - 0x0, 0x0, 0xb0, 0x11, 0x92, 0x0, 0x0, 0x0, - 0xc, 0x74, 0xb, 0x0, 0x0, 0x2, 0xab, 0xd0, - 0x3, 0x70, 0x4, 0x0, 0x5, 0xb, 0x0, 0x72, - 0x0, 0x43, 0x0, 0x0, 0xb0, 0x9, 0x0, 0x0, - 0xb0, 0x0, 0xb, 0x3, 0x60, 0x0, 0x8, 0x70, - 0x32, 0xd0, 0xcb, 0xa9, 0x76, 0x7c, 0x1, 0xbb, - 0x4, 0x40, 0x0, 0x2, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+627E "找" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x20, 0x8, 0x61, 0x40, 0x0, 0x0, 0xc, - 0x0, 0x8, 0x40, 0x8a, 0x0, 0x0, 0xc, 0x4, - 0x8, 0x40, 0x5, 0x0, 0x16, 0x5d, 0x55, 0x19, - 0x64, 0x5b, 0x30, 0x0, 0xc, 0x3, 0x39, 0x40, - 0x0, 0x0, 0x0, 0xc, 0x64, 0x7, 0x50, 0x6a, - 0x0, 0x28, 0xae, 0x0, 0x5, 0x74, 0xc1, 0x0, - 0x16, 0xc, 0x0, 0x2, 0xdb, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x5, 0xf2, 0x0, 0x30, 0x0, 0xc, - 0x0, 0x75, 0x2c, 0x10, 0x60, 0x3, 0x3d, 0x5, - 0x10, 0x4, 0xd8, 0x70, 0x1, 0xaa, 0x0, 0x0, - 0x0, 0x2b, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6280 "技" */ - 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0xd, 0x10, 0x0, 0xe, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x15, 0x5d, 0x6a, - 0x35, 0x5d, 0x55, 0xb1, 0x0, 0xc, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0xc, 0x75, 0x47, 0x59, 0x5d, - 0x30, 0x18, 0xbd, 0x0, 0x6, 0x0, 0x1b, 0x0, - 0x6, 0xc, 0x0, 0x3, 0x40, 0x84, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x94, 0xb0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x5f, 0x20, 0x0, 0x1, 0xc, 0x0, - 0x7, 0x95, 0xc4, 0x0, 0x3, 0xcc, 0x15, 0x72, - 0x0, 0x2a, 0xd3, 0x0, 0x10, 0x20, 0x0, 0x0, - 0x0, 0x0, - - /* U+628A "把" */ - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x10, 0x10, 0x0, 0x2, 0x0, 0x0, 0xc, - 0x0, 0xd5, 0x5b, 0x5d, 0x30, 0x15, 0x5d, 0x77, - 0xc0, 0xb, 0xb, 0x0, 0x0, 0xc, 0x0, 0xc0, - 0xb, 0xb, 0x0, 0x0, 0xc, 0x0, 0xc0, 0xb, - 0xb, 0x0, 0x0, 0xd, 0x73, 0xd5, 0x57, 0x5c, - 0x10, 0x2a, 0xbd, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0x5, 0xc, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0xc0, 0x0, 0x0, 0x10, 0x0, 0xc, - 0x0, 0xc0, 0x0, 0x0, 0x50, 0x0, 0xc, 0x0, - 0xc0, 0x0, 0x0, 0xa0, 0x5, 0xbb, 0x0, 0xab, - 0xaa, 0xab, 0xd0, 0x0, 0x21, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6295 "投" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0x10, 0x9, 0x55, 0xa1, 0x0, 0x0, 0xc, - 0x0, 0xb, 0x0, 0xc0, 0x0, 0x5, 0x5d, 0x78, - 0x2a, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x55, - 0x0, 0xc0, 0x0, 0x0, 0xc, 0x1, 0x90, 0x0, - 0x8a, 0xb3, 0x0, 0xd, 0x67, 0x65, 0x55, 0x87, - 0x0, 0x18, 0xbc, 0x0, 0x5, 0x0, 0xa3, 0x0, - 0x6, 0xc, 0x0, 0x6, 0x11, 0xb0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x9a, 0x30, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xac, 0x0, 0x0, 0x1, 0xc, 0x0, - 0x19, 0x57, 0xc3, 0x0, 0x3, 0xc8, 0x15, 0x60, - 0x0, 0x3c, 0xb1, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, - - /* U+62BC "押" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x85, 0x55, 0x55, 0xa0, 0x0, 0xc, - 0x0, 0xc0, 0xc, 0x1, 0xb0, 0x5, 0x5d, 0x95, - 0xc0, 0xc, 0x1, 0xb0, 0x0, 0xc, 0x0, 0xd5, - 0x5d, 0x56, 0xb0, 0x0, 0xc, 0x1, 0xc0, 0xc, - 0x1, 0xb0, 0x0, 0xe, 0x61, 0xc0, 0xc, 0x1, - 0xb0, 0x17, 0xbc, 0x0, 0xd5, 0x5d, 0x56, 0xb0, - 0x19, 0xc, 0x0, 0xa0, 0xc, 0x0, 0x60, 0x0, - 0xc, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x1, 0x2c, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x3, 0xd7, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+62C5 "担" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x10, 0x0, 0x0, 0x1, 0x0, 0x0, 0xc, - 0x0, 0x96, 0x55, 0x5e, 0x10, 0x0, 0xc, 0x13, - 0x92, 0x0, 0xd, 0x0, 0x5, 0x5d, 0x54, 0x92, - 0x0, 0xd, 0x0, 0x0, 0xc, 0x1, 0x97, 0x55, - 0x5d, 0x0, 0x0, 0xc, 0x71, 0x92, 0x0, 0xd, - 0x0, 0x5, 0xbe, 0x0, 0x92, 0x0, 0xd, 0x0, - 0x1a, 0x1c, 0x0, 0x92, 0x0, 0xd, 0x0, 0x0, - 0xc, 0x0, 0xa7, 0x55, 0x5e, 0x0, 0x0, 0xc, - 0x0, 0x50, 0x0, 0x2, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x2, 0x70, 0x3, 0xbc, 0x6, 0x55, - 0x55, 0x55, 0x50, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+62C9 "拉" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x20, 0x0, 0x70, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x6a, 0x0, 0x0, 0x2, 0x2c, 0x36, - 0x0, 0x16, 0x1, 0x0, 0x3, 0x2c, 0x22, 0x55, - 0x55, 0x58, 0x50, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x42, 0x0, 0x0, 0xc, 0x64, 0x23, 0x0, 0x97, - 0x0, 0x2, 0x9e, 0x10, 0xa, 0x0, 0xb1, 0x0, - 0x2d, 0x3c, 0x0, 0xa, 0x30, 0xb0, 0x0, 0x0, - 0xc, 0x0, 0x8, 0x73, 0x70, 0x0, 0x0, 0xc, - 0x0, 0x4, 0x27, 0x10, 0x0, 0x1, 0xd, 0x0, - 0x0, 0x7, 0x0, 0x50, 0x2, 0xbc, 0x6, 0x55, - 0x56, 0x56, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+62DB "招" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x25, 0x55, 0x55, 0x76, 0x0, 0xb, 0x0, - 0x6, 0x70, 0x7, 0x50, 0x55, 0xc6, 0x80, 0x83, - 0x0, 0x83, 0x0, 0xb, 0x0, 0xb, 0x0, 0xa, - 0x10, 0x0, 0xb0, 0x4, 0x60, 0x55, 0xd0, 0x0, - 0xc, 0x73, 0x80, 0x0, 0xa5, 0x1, 0x7b, 0xc0, - 0x46, 0x55, 0x55, 0x92, 0x8, 0xb, 0x0, 0xa1, - 0x0, 0xb, 0x0, 0x0, 0xb0, 0xa, 0x10, 0x0, - 0xb0, 0x0, 0xb, 0x0, 0xa1, 0x0, 0xb, 0x0, - 0x0, 0xb0, 0xa, 0x65, 0x55, 0xd0, 0x3, 0xc9, - 0x0, 0x90, 0x0, 0x8, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+62E1 "拡" */ - 0x0, 0x2, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x20, 0xa, 0x0, 0x50, 0x0, 0xc, 0x12, - 0xd5, 0x55, 0x55, 0x61, 0x5, 0x5d, 0x54, 0xc0, - 0x1, 0x0, 0x0, 0x0, 0xc, 0x0, 0xc0, 0xa, - 0x70, 0x0, 0x0, 0xc, 0x52, 0xc0, 0xd, 0x0, - 0x0, 0x0, 0x7d, 0x10, 0xc0, 0x38, 0x0, 0x0, - 0x2e, 0x5c, 0x0, 0xc0, 0x81, 0x0, 0x0, 0x1, - 0xc, 0x1, 0xa0, 0x80, 0x7, 0x0, 0x0, 0xc, - 0x5, 0x55, 0x30, 0x3, 0xa0, 0x0, 0xc, 0x9, - 0xd, 0xa8, 0x65, 0xd2, 0x5, 0xd8, 0x42, 0x3, - 0x0, 0x0, 0x50, 0x0, 0x10, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+62EC "括" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x20, 0x0, 0x2, 0x7c, 0x10, 0x0, 0xc, - 0x0, 0x35, 0x7d, 0x41, 0x0, 0x17, 0x5d, 0x5a, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0xc, 0x0, 0x30, 0x0, 0xc, 0x3, 0x65, 0x5d, - 0x56, 0x80, 0x0, 0xc, 0x54, 0x0, 0xc, 0x0, - 0x0, 0x16, 0xae, 0x10, 0x20, 0xc, 0x3, 0x0, - 0x19, 0x1c, 0x0, 0xc5, 0x55, 0x5d, 0x10, 0x0, - 0xc, 0x0, 0xc0, 0x0, 0xc, 0x0, 0x0, 0xc, - 0x0, 0xc0, 0x0, 0xc, 0x0, 0x2, 0x2d, 0x0, - 0xc5, 0x55, 0x5d, 0x0, 0x1, 0xaa, 0x0, 0xc0, - 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+62ED "拭" */ - 0x0, 0x2, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0xe, 0x10, 0x0, 0xd, 0x29, 0x30, 0x0, 0xc, - 0x0, 0x0, 0xd, 0x2, 0x80, 0x0, 0xc, 0x23, - 0x0, 0xc, 0x1, 0x50, 0x16, 0x5d, 0x54, 0x46, - 0x5d, 0x55, 0x50, 0x0, 0xc, 0x0, 0x0, 0xa, - 0x10, 0x0, 0x0, 0xd, 0x66, 0x55, 0x89, 0x20, - 0x0, 0x18, 0xbd, 0x0, 0xc, 0x6, 0x50, 0x0, - 0x18, 0xc, 0x0, 0xc, 0x3, 0x80, 0x0, 0x0, - 0xc, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x0, 0xc, - 0x0, 0x1d, 0x63, 0x86, 0x41, 0x1, 0xc, 0xa, - 0xa4, 0x0, 0xd, 0xc0, 0x3, 0xd8, 0x0, 0x0, - 0x0, 0x1, 0xc2, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+62FF "拿" */ - 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb9, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x3b, 0x30, 0x66, 0x0, 0x0, 0x0, 0x17, 0x76, - 0x55, 0x86, 0xb9, 0x62, 0x4, 0x40, 0x85, 0x55, - 0x59, 0x13, 0x60, 0x0, 0x0, 0xc0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x0, 0xd5, 0x55, 0x5a, 0x10, - 0x0, 0x0, 0x23, 0x45, 0x68, 0xac, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x2a, 0x0, 0x40, 0x0, 0x0, - 0x36, 0x55, 0x6c, 0x56, 0x92, 0x0, 0x4, 0x55, - 0x55, 0x6c, 0x55, 0x5a, 0x90, 0x0, 0x0, 0x0, - 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x0, - - /* U+6301 "持" */ - 0x0, 0x4, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xc, - 0x1, 0x44, 0xc5, 0x49, 0x0, 0x5, 0x5d, 0x86, - 0x11, 0xb2, 0x11, 0x0, 0x0, 0xc, 0x0, 0x0, - 0xb1, 0x0, 0x20, 0x0, 0xc, 0x6, 0x55, 0x86, - 0x56, 0x90, 0x0, 0xd, 0x62, 0x0, 0x7, 0x70, - 0x0, 0x7, 0xbc, 0x5, 0x55, 0x5a, 0x87, 0x90, - 0x6, 0xc, 0x1, 0x20, 0x7, 0x50, 0x0, 0x0, - 0xc, 0x0, 0x85, 0x7, 0x50, 0x0, 0x0, 0xc, - 0x0, 0x19, 0x7, 0x50, 0x0, 0x1, 0x1c, 0x0, - 0x0, 0x7, 0x50, 0x0, 0x2, 0xc8, 0x0, 0x0, - 0x7f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+6307 "指" */ - 0x0, 0x5, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, - 0xc1, 0x8, 0x60, 0x3, 0x70, 0x0, 0xc, 0x0, - 0x83, 0x18, 0xa5, 0x0, 0x55, 0xd6, 0xb8, 0x75, - 0x10, 0x3, 0x1, 0xc, 0x0, 0x84, 0x0, 0x0, - 0x70, 0x0, 0xc0, 0x35, 0xc9, 0x99, 0xb9, 0x0, - 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xe0, - 0x6, 0x75, 0x55, 0xc1, 0x1b, 0x2c, 0x0, 0x65, - 0x0, 0xc, 0x0, 0x0, 0xc0, 0x6, 0x85, 0x55, - 0xd0, 0x0, 0xc, 0x0, 0x65, 0x0, 0xc, 0x0, - 0x10, 0xd0, 0x6, 0x85, 0x55, 0xd0, 0x2, 0xba, - 0x0, 0x74, 0x0, 0xb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+6319 "挙" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0x0, 0x91, 0x5, 0xb0, 0x0, 0x0, 0x5, - 0xb0, 0x5a, 0xa, 0x10, 0x0, 0x0, 0x0, 0x70, - 0x4, 0x34, 0x4, 0x30, 0x6, 0x55, 0xc5, 0x55, - 0x95, 0x57, 0x60, 0x0, 0x5, 0x80, 0x0, 0x66, - 0x0, 0x0, 0x0, 0x3a, 0x46, 0x9b, 0xa6, 0xb4, - 0x0, 0x5, 0x60, 0x0, 0xb0, 0x0, 0x7c, 0x80, - 0x31, 0x55, 0x55, 0xc5, 0x55, 0x71, 0x0, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x7, 0x30, 0x7, 0x55, - 0x55, 0xc5, 0x55, 0x55, 0x40, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, - 0x0, 0x0, - - /* U+6355 "捕" */ - 0x0, 0x2, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0xb2, 0x81, 0x0, 0x0, 0xb, - 0x0, 0x0, 0xb0, 0x36, 0x10, 0x0, 0xb, 0x45, - 0x55, 0xc5, 0x56, 0x90, 0x4, 0x4c, 0x41, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0xb, 0xa, 0x65, 0xc5, - 0x5c, 0x20, 0x0, 0xd, 0x59, 0x10, 0xb0, 0xb, - 0x0, 0x7, 0xbb, 0x9, 0x65, 0xc5, 0x5c, 0x0, - 0x7, 0xb, 0x9, 0x10, 0xb0, 0xb, 0x0, 0x0, - 0xb, 0x9, 0x65, 0xc5, 0x5c, 0x0, 0x0, 0xb, - 0x9, 0x10, 0xb0, 0xb, 0x0, 0x0, 0xb, 0x9, - 0x10, 0xb0, 0xb, 0x0, 0x4, 0xc7, 0xa, 0x10, - 0xb2, 0x8d, 0x0, 0x0, 0x10, 0x2, 0x0, 0x10, - 0x1, 0x0, - - /* U+6368 "捨" */ - 0x0, 0x2, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0xe, 0x0, 0x0, 0xe1, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x8, 0x57, 0x0, 0x0, 0x0, 0xc, 0x41, - 0x47, 0x2, 0x90, 0x0, 0x5, 0x5d, 0x55, 0x70, - 0x0, 0x8c, 0x72, 0x0, 0xc, 0x14, 0x25, 0xc5, - 0x63, 0x71, 0x0, 0xc, 0x43, 0x0, 0xb0, 0x2, - 0x20, 0x1, 0x8e, 0x24, 0x65, 0xc5, 0x56, 0x50, - 0xc, 0x4c, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0xc5, 0x85, 0x5d, 0x10, 0x0, 0xc, - 0x0, 0xb0, 0x0, 0xc, 0x0, 0x1, 0xc, 0x0, - 0xb0, 0x0, 0xc, 0x0, 0x4, 0xd8, 0x0, 0xd5, - 0x55, 0x5d, 0x0, 0x0, 0x10, 0x0, 0x20, 0x0, - 0x1, 0x0, - - /* U+6388 "授" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0xd, 0x0, 0x1, 0x47, 0xad, 0x40, 0x0, 0xb, - 0x1, 0x43, 0x30, 0x9, 0x20, 0x5, 0x5c, 0x84, - 0x90, 0xa2, 0x2a, 0x0, 0x0, 0xb, 0x0, 0x75, - 0x63, 0x71, 0x0, 0x0, 0xb, 0x27, 0x55, 0x55, - 0x85, 0xb0, 0x0, 0x1d, 0x5c, 0x0, 0x0, 0x5, - 0x30, 0x17, 0xab, 0x2, 0x55, 0x55, 0xa4, 0x0, - 0x17, 0xb, 0x0, 0x5, 0x2, 0xc1, 0x0, 0x0, - 0xb, 0x0, 0x3, 0x5b, 0x20, 0x0, 0x0, 0xb, - 0x0, 0x0, 0xd8, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x2a, 0x48, 0x93, 0x0, 0x5, 0xd7, 0x16, 0x60, - 0x0, 0x4b, 0xc2, 0x0, 0x10, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+6392 "排" */ - 0x0, 0x5, 0x0, 0x4, 0x10, 0x40, 0x0, 0x0, - 0xc, 0x0, 0x9, 0x50, 0xd0, 0x0, 0x0, 0xb, - 0x0, 0x9, 0x20, 0xb0, 0x0, 0x5, 0x5c, 0x96, - 0x5b, 0x20, 0xc5, 0x84, 0x0, 0xb, 0x0, 0x9, - 0x20, 0xb0, 0x0, 0x0, 0xb, 0x11, 0x9, 0x20, - 0xb0, 0x10, 0x0, 0x2d, 0x52, 0x5b, 0x20, 0xc5, - 0x82, 0x1b, 0xab, 0x0, 0x9, 0x20, 0xb0, 0x0, - 0x3, 0xb, 0x0, 0x9, 0x20, 0xb0, 0x21, 0x0, - 0xb, 0x15, 0x5b, 0x20, 0xc5, 0x64, 0x0, 0xb, - 0x0, 0x9, 0x20, 0xb0, 0x0, 0x1, 0xb, 0x0, - 0x9, 0x20, 0xb0, 0x0, 0x3, 0xc7, 0x0, 0x9, - 0x20, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x10, 0x0, - - /* U+639B "掛" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0xa3, 0x0, 0x1b, 0x0, 0xb2, 0x0, 0x0, 0xa1, - 0x0, 0x19, 0x0, 0xb0, 0x0, 0x0, 0xa2, 0x25, - 0x5b, 0x91, 0xb0, 0x0, 0x35, 0xc6, 0x40, 0x19, - 0x0, 0xb0, 0x0, 0x0, 0xa1, 0x0, 0x19, 0x13, - 0xb5, 0x0, 0x0, 0xa2, 0x35, 0x57, 0x54, 0xb4, - 0xb0, 0x3, 0xd4, 0x0, 0x1b, 0x0, 0xb0, 0xa0, - 0x6a, 0xb1, 0x15, 0x6b, 0x83, 0xb0, 0x0, 0x0, - 0xa1, 0x0, 0x19, 0x0, 0xb0, 0x0, 0x0, 0xa1, - 0x0, 0x19, 0x0, 0xb0, 0x0, 0x0, 0xb0, 0x2, - 0x5b, 0x53, 0xb0, 0x0, 0x8, 0xb0, 0x5b, 0x40, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+63A1 "採" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0xd, 0x0, 0x14, 0x69, 0xcc, 0x10, 0x0, 0xb, - 0x3, 0x33, 0x0, 0x2, 0x40, 0x0, 0xb, 0x44, - 0x31, 0x90, 0x9, 0x60, 0x5, 0x5c, 0x52, 0xc2, - 0x85, 0x37, 0x0, 0x0, 0xb, 0x0, 0x40, 0x51, - 0x40, 0x0, 0x0, 0xb, 0x42, 0x0, 0x93, 0x2, - 0x40, 0x0, 0x6d, 0x24, 0x59, 0xf9, 0x55, 0x40, - 0x1e, 0x6b, 0x0, 0xb, 0xb8, 0x10, 0x0, 0x1, - 0xb, 0x0, 0x46, 0x92, 0xa0, 0x0, 0x0, 0xb, - 0x1, 0x80, 0x92, 0x69, 0x0, 0x0, 0xb, 0x7, - 0x0, 0x92, 0xb, 0xb2, 0x4, 0xd8, 0x20, 0x0, - 0x92, 0x0, 0x20, 0x0, 0x10, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+63A2 "探" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x75, 0x55, 0x55, 0x82, 0x0, 0xb, - 0x1, 0xb0, 0x0, 0x0, 0xa1, 0x0, 0xb, 0x44, - 0x25, 0x92, 0x51, 0x0, 0x5, 0x5c, 0x53, 0x1b, - 0x10, 0x3d, 0x30, 0x0, 0xb, 0x3, 0x81, 0x1a, - 0x3, 0x50, 0x0, 0xd, 0x62, 0x0, 0x1a, 0x0, - 0x50, 0x6, 0xbb, 0x5, 0x55, 0xec, 0x75, 0x63, - 0x8, 0xb, 0x0, 0x6, 0x9a, 0x70, 0x0, 0x0, - 0xb, 0x0, 0x1b, 0x1a, 0x46, 0x0, 0x0, 0xb, - 0x0, 0x91, 0x1a, 0xa, 0x70, 0x0, 0xb, 0x7, - 0x10, 0x1a, 0x0, 0xb6, 0x2, 0xb7, 0x20, 0x0, - 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+63A5 "接" */ - 0x0, 0x4, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0xb, - 0x1, 0x55, 0x77, 0x58, 0x60, 0x5, 0x5c, 0x77, - 0x34, 0x0, 0xa1, 0x0, 0x0, 0xb, 0x0, 0xb, - 0x23, 0x70, 0x0, 0x0, 0xb, 0x5, 0x57, 0x68, - 0x55, 0xb1, 0x0, 0xc, 0x51, 0x1, 0xc0, 0x0, - 0x0, 0x16, 0xab, 0x0, 0x8, 0x50, 0x0, 0x50, - 0x18, 0xb, 0x35, 0x5c, 0x55, 0xc6, 0x62, 0x0, - 0xb, 0x0, 0x73, 0x2, 0xb0, 0x0, 0x0, 0xb, - 0x0, 0x57, 0x7c, 0x20, 0x0, 0x1, 0xb, 0x0, - 0x1, 0xa6, 0xb8, 0x0, 0x2, 0xc7, 0x3, 0x78, - 0x10, 0x7, 0xa0, 0x0, 0x10, 0x31, 0x0, 0x0, - 0x0, 0x10, - - /* U+63A7 "控" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0x10, 0x1, 0x82, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x10, 0x39, 0x0, 0x10, 0x5, 0x5d, 0x83, - 0x94, 0x44, 0x46, 0xb0, 0x0, 0xc, 0x5, 0x55, - 0x32, 0x4, 0x0, 0x0, 0xc, 0x0, 0x1c, 0x20, - 0x97, 0x0, 0x0, 0xd, 0x63, 0x91, 0x0, 0xb, - 0x50, 0x5, 0xad, 0x4, 0x0, 0x0, 0x26, 0x10, - 0x1a, 0x1c, 0x0, 0x55, 0xc6, 0x54, 0x0, 0x0, - 0xc, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xa2, 0x1, 0x60, 0x5, 0xb9, 0x6, 0x55, - 0x55, 0x55, 0x50, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+63A8 "推" */ - 0x0, 0x2, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x3d, 0x9, 0x20, 0x0, 0x0, 0xb, - 0x0, 0x76, 0x4, 0x70, 0x20, 0x5, 0x5c, 0x76, - 0xb5, 0x5a, 0x55, 0x80, 0x0, 0xb, 0x0, 0xf0, - 0xb, 0x0, 0x0, 0x0, 0xb, 0x7, 0xd0, 0xb, - 0x3, 0x20, 0x0, 0x1d, 0x45, 0xb5, 0x5c, 0x55, - 0x30, 0x19, 0x9b, 0x0, 0xb0, 0xb, 0x0, 0x0, - 0x5, 0xb, 0x0, 0xb5, 0x5c, 0x57, 0x80, 0x0, - 0xb, 0x0, 0xb0, 0xb, 0x0, 0x0, 0x0, 0xb, - 0x0, 0xb0, 0xb, 0x0, 0x0, 0x0, 0xb, 0x0, - 0xb5, 0x5c, 0x56, 0xc1, 0x3, 0xc6, 0x0, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+63CF "描" */ - 0x0, 0x4, 0x0, 0x1, 0x0, 0x10, 0x0, 0x0, - 0xe, 0x10, 0x8, 0x60, 0xc2, 0x0, 0x0, 0xc, - 0x0, 0x8, 0x30, 0xc0, 0x20, 0x0, 0xc, 0x26, - 0x5a, 0x75, 0xd5, 0x81, 0x6, 0x5d, 0x54, 0x8, - 0x30, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x4, 0x10, - 0x40, 0x10, 0x0, 0xc, 0x53, 0xc5, 0x5a, 0x56, - 0xc0, 0x5, 0x9d, 0x10, 0xb0, 0xb, 0x1, 0xa0, - 0x9, 0x1c, 0x0, 0xc5, 0x5c, 0x56, 0xa0, 0x0, - 0xc, 0x0, 0xb0, 0xb, 0x1, 0xa0, 0x0, 0xc, - 0x0, 0xb0, 0xb, 0x1, 0xa0, 0x3, 0x2c, 0x0, - 0xc5, 0x5c, 0x56, 0xa0, 0x2, 0xc7, 0x0, 0xa0, - 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+63D0 "提" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x85, 0x55, 0x5a, 0x0, 0x0, 0xb, - 0x0, 0x91, 0x0, 0xa, 0x0, 0x5, 0x5c, 0x84, - 0x96, 0x55, 0x5a, 0x0, 0x0, 0xb, 0x0, 0x91, - 0x0, 0xa, 0x0, 0x0, 0xb, 0x1, 0xa6, 0x55, - 0x5a, 0x0, 0x0, 0xd, 0x60, 0x30, 0x0, 0x0, - 0x50, 0x8, 0xab, 0x17, 0x55, 0x5c, 0x55, 0x62, - 0x6, 0xb, 0x2, 0xa0, 0xb, 0x0, 0x0, 0x0, - 0xb, 0x5, 0x70, 0xc, 0x56, 0x60, 0x0, 0xb, - 0x9, 0x63, 0xb, 0x0, 0x0, 0x1, 0x2b, 0x26, - 0x8, 0x9c, 0x0, 0x0, 0x2, 0xc6, 0x50, 0x0, - 0x4a, 0xde, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+63DB "換" */ - 0x0, 0x2, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x2c, 0x0, 0x9, 0x41, 0x20, 0x0, 0x0, 0x19, - 0x0, 0x38, 0x5b, 0xa0, 0x0, 0x5, 0x6b, 0x94, - 0x50, 0x26, 0x0, 0x0, 0x0, 0x19, 0x0, 0xa5, - 0x75, 0x5b, 0x20, 0x0, 0x19, 0x3, 0xb5, 0x65, - 0xa, 0x0, 0x0, 0x2d, 0x60, 0xb8, 0x1, 0xcb, - 0x0, 0x9, 0xc9, 0x0, 0xc2, 0x81, 0x6b, 0x0, - 0x5, 0x19, 0x0, 0x40, 0xc0, 0x4, 0x30, 0x0, - 0x19, 0x16, 0x56, 0xb7, 0x55, 0x81, 0x0, 0x19, - 0x0, 0x9, 0x25, 0x20, 0x0, 0x0, 0x19, 0x0, - 0x76, 0x0, 0xa6, 0x0, 0x4, 0xc7, 0x37, 0x20, - 0x0, 0x9, 0xd2, 0x0, 0x20, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+63EE "揮" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x93, 0x7, 0x55, 0x55, 0x56, 0x80, 0x0, 0x92, - 0xe, 0x10, 0x62, 0x7, 0x30, 0x0, 0x93, 0x13, - 0x0, 0xb1, 0x6, 0x0, 0x35, 0xb7, 0x45, 0x55, - 0xc5, 0x55, 0x20, 0x0, 0x92, 0x6, 0x55, 0xc5, - 0x5a, 0x20, 0x0, 0x93, 0x49, 0x20, 0xb0, 0xb, - 0x0, 0x1, 0xc6, 0x9, 0x65, 0xc5, 0x5c, 0x0, - 0x6c, 0xb2, 0x9, 0x65, 0xc5, 0x5c, 0x0, 0x10, - 0x92, 0x5, 0x0, 0xb0, 0x4, 0x0, 0x0, 0x92, - 0x26, 0x55, 0xc5, 0x58, 0x80, 0x0, 0x92, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x29, 0xe0, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x30, - 0x0, 0x0, - - /* U+63FA "揺" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, - 0xd, 0x0, 0x1, 0x48, 0xbd, 0xa0, 0x0, 0xb, - 0x2, 0x44, 0x31, 0x0, 0x80, 0x0, 0xb, 0x34, - 0x20, 0x91, 0x5, 0xa0, 0x5, 0x5c, 0x53, 0xc1, - 0x67, 0x8, 0x0, 0x0, 0xb, 0x0, 0x40, 0x1, - 0x22, 0x20, 0x0, 0xb, 0x53, 0x55, 0x5b, 0x56, - 0x50, 0x1, 0x7d, 0x10, 0x0, 0xb, 0x0, 0x20, - 0x1e, 0x5b, 0x6, 0x55, 0x5c, 0x55, 0x95, 0x1, - 0xb, 0x0, 0x40, 0xb, 0x0, 0x20, 0x0, 0xb, - 0x0, 0xc0, 0xb, 0x0, 0xc0, 0x0, 0x1b, 0x0, - 0xa0, 0xb, 0x0, 0xa0, 0x5, 0xe7, 0x1, 0xa5, - 0x57, 0x55, 0xb0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x10, - - /* U+643A "携" */ - 0x0, 0x2, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x1d, 0x1b, 0x10, 0x0, 0x0, 0xb, - 0x0, 0x88, 0x5b, 0x67, 0x80, 0x5, 0x5c, 0x93, - 0xf0, 0xa, 0x3, 0x10, 0x0, 0xb, 0x6, 0xb5, - 0x5c, 0x55, 0x30, 0x0, 0xb, 0x22, 0xb5, 0x5c, - 0x59, 0x30, 0x0, 0x1d, 0x40, 0xb0, 0xa, 0x0, - 0x30, 0x19, 0xab, 0x0, 0xb5, 0x56, 0x55, 0x60, - 0x6, 0xb, 0x3, 0x68, 0x55, 0x96, 0x0, 0x0, - 0xb, 0x0, 0xd, 0x0, 0xb0, 0x40, 0x0, 0xb, - 0x0, 0x48, 0x1, 0x75, 0xd0, 0x0, 0xb, 0x1, - 0xb1, 0x0, 0x3, 0x80, 0x4, 0xc8, 0x38, 0x10, - 0x2, 0x9c, 0x20, 0x0, 0x10, 0x10, 0x0, 0x0, - 0x12, 0x0, - - /* U+64C1 "擁" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb1, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0xb0, - 0x25, 0x55, 0x96, 0x56, 0xa0, 0x0, 0xb0, 0x1, - 0xb0, 0x44, 0x60, 0x0, 0x25, 0xc6, 0x56, 0x22, - 0xa2, 0x73, 0x10, 0x0, 0xb0, 0x5, 0x4c, 0xc5, - 0x96, 0x70, 0x0, 0xb2, 0x68, 0xb6, 0xb0, 0xb0, - 0x0, 0x0, 0xc4, 0x5, 0x32, 0xc5, 0xc6, 0x60, - 0x3c, 0xd0, 0x37, 0x6a, 0xb0, 0xb0, 0x0, 0x13, - 0xb0, 0x56, 0xb1, 0xc5, 0xc6, 0x60, 0x0, 0xb0, - 0x2, 0x70, 0xb0, 0xb0, 0x0, 0x0, 0xb0, 0x9, - 0x0, 0xb0, 0xb0, 0x40, 0x18, 0xd0, 0x60, 0x0, - 0xd5, 0x65, 0x60, 0x0, 0x10, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+64C7 "擇" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0x0, 0x85, 0x55, 0x55, 0x90, 0x0, 0x1a, - 0x0, 0xa0, 0xb0, 0xa0, 0xa0, 0x0, 0xa, 0x20, - 0xc5, 0xc5, 0xc5, 0xb0, 0x5, 0x5c, 0x73, 0x60, - 0x1a, 0x0, 0x40, 0x0, 0xa, 0x0, 0x45, 0x5c, - 0x5a, 0x20, 0x0, 0xa, 0x50, 0x0, 0xb, 0x0, - 0x40, 0x0, 0x3d, 0x13, 0x69, 0x55, 0x86, 0x52, - 0x8, 0xaa, 0x0, 0x4, 0x80, 0x93, 0x0, 0x6, - 0x1a, 0x0, 0x76, 0x79, 0x67, 0x40, 0x0, 0xa, - 0x0, 0x0, 0xb, 0x0, 0x60, 0x0, 0xa, 0x7, - 0x55, 0x5c, 0x55, 0x52, 0x4, 0xa9, 0x0, 0x0, - 0xb, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x5, - 0x0, 0x0, - - /* U+64D4 "擔" */ - 0x0, 0x1, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, - 0xd, 0x0, 0xa, 0x60, 0x10, 0x0, 0x0, 0xb, - 0x0, 0x3a, 0x55, 0xd1, 0x0, 0x0, 0xb, 0x20, - 0xb5, 0x57, 0x65, 0xa0, 0x5, 0x5c, 0x65, 0xc1, - 0xa2, 0x37, 0x0, 0x0, 0xb, 0x0, 0xb5, 0x18, - 0x36, 0x30, 0x0, 0xb, 0x62, 0xb5, 0x56, 0x55, - 0x81, 0x0, 0x3d, 0x10, 0xb2, 0x55, 0x59, 0x0, - 0x9, 0x9b, 0x0, 0xa0, 0x0, 0x5, 0x0, 0x5, - 0xb, 0x3, 0x72, 0x65, 0x55, 0x10, 0x0, 0xb, - 0x8, 0x28, 0x65, 0x5b, 0x20, 0x1, 0xb, 0x7, - 0x8, 0x30, 0xa, 0x10, 0x2, 0xd7, 0x50, 0x8, - 0x75, 0x5a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+64DA "據" */ - 0x0, 0x1, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x1b, 0x0, 0x0, 0xb1, 0x4, 0x0, 0x0, 0x19, - 0x1, 0x0, 0xb5, 0x55, 0x20, 0x0, 0x19, 0x29, - 0x65, 0xb6, 0x55, 0xd1, 0x5, 0x6b, 0x6a, 0x10, - 0xb5, 0x83, 0x20, 0x0, 0x19, 0x9, 0x44, 0xb1, - 0x7, 0x0, 0x0, 0x1a, 0x49, 0x10, 0x37, 0x76, - 0x40, 0x0, 0x4c, 0xa, 0x45, 0xa8, 0x57, 0x60, - 0x9, 0xa9, 0xa, 0x5, 0x84, 0x1b, 0x20, 0x4, - 0x19, 0xa, 0x23, 0x8a, 0x90, 0x0, 0x0, 0x19, - 0x26, 0x56, 0x4a, 0x97, 0x0, 0x0, 0x19, 0x61, - 0x27, 0x60, 0xb4, 0xc2, 0x5, 0xc7, 0x42, 0x30, - 0x39, 0x90, 0x10, 0x0, 0x20, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+652F "支" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0x6, 0x10, 0x6, 0x55, 0x55, - 0xd5, 0x55, 0x57, 0x40, 0x0, 0x0, 0x0, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x25, 0x55, 0xd5, 0x59, - 0x10, 0x0, 0x0, 0x0, 0x40, 0x0, 0x4a, 0x0, - 0x0, 0x0, 0x0, 0x51, 0x0, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x7, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xdb, 0x20, 0x0, 0x0, 0x0, 0x1, 0x97, - 0x3, 0xca, 0x63, 0x10, 0x4, 0x67, 0x10, 0x0, - 0x4, 0xae, 0x60, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6539 "改" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x0, 0x0, 0x5, 0x55, 0x5c, - 0x15, 0x70, 0x0, 0x0, 0x0, 0x0, 0xb0, 0xa1, - 0x0, 0x41, 0x0, 0x0, 0xb, 0xb, 0x55, 0xb6, - 0x30, 0x20, 0x0, 0xb6, 0x70, 0xa, 0x0, 0xb, - 0x65, 0x58, 0x55, 0x10, 0xb0, 0x0, 0xb1, 0x0, - 0x0, 0x25, 0xb, 0x0, 0xb, 0x10, 0x0, 0x0, - 0x95, 0x60, 0x0, 0xb1, 0x0, 0x2, 0x6, 0xc0, - 0x0, 0xb, 0x13, 0x75, 0x0, 0x8c, 0x20, 0x0, - 0xcc, 0x60, 0x0, 0x85, 0x1c, 0x40, 0x4, 0x10, - 0x4, 0x71, 0x0, 0x2d, 0x80, 0x0, 0x1, 0x10, - 0x0, 0x0, 0x0, - - /* U+653E "放" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x9, 0x30, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x1, - 0xb0, 0x0, 0xd0, 0x0, 0x0, 0x25, 0x65, 0x55, - 0xa4, 0xb5, 0x59, 0x80, 0x0, 0x92, 0x0, 0x8, - 0x20, 0x57, 0x0, 0x0, 0x92, 0x3, 0xa, 0x20, - 0x75, 0x0, 0x0, 0xa6, 0x5c, 0x52, 0x60, 0xb1, - 0x0, 0x0, 0xb0, 0xb, 0x0, 0x80, 0xc0, 0x0, - 0x0, 0xb0, 0xb, 0x0, 0x68, 0x60, 0x0, 0x0, - 0xa0, 0xb, 0x0, 0x1f, 0x0, 0x0, 0x4, 0x60, - 0xc, 0x0, 0x98, 0x90, 0x0, 0x9, 0x6, 0xa8, - 0x8, 0x30, 0x8a, 0x10, 0x43, 0x0, 0x83, 0x61, - 0x0, 0x7, 0x91, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+653F "政" */ - 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x6, 0x55, - 0x65, 0xc3, 0xb1, 0x0, 0x0, 0x0, 0x0, 0xb0, - 0x0, 0xd5, 0x56, 0xb2, 0x0, 0x0, 0xb0, 0x4, - 0x70, 0xd, 0x0, 0x1, 0xb0, 0xb1, 0x28, 0x50, - 0xb, 0x0, 0x1, 0xa0, 0xc5, 0x55, 0x60, 0x38, - 0x0, 0x1, 0xa0, 0xb0, 0x20, 0x52, 0x75, 0x0, - 0x1, 0xa0, 0xb0, 0x0, 0x8, 0xc0, 0x0, 0x1, - 0xa0, 0xb0, 0x31, 0xa, 0x90, 0x0, 0x2, 0xc8, - 0xb6, 0x10, 0x4b, 0xc1, 0x0, 0x1d, 0x72, 0x0, - 0x6, 0x70, 0x3d, 0x40, 0x0, 0x0, 0x2, 0x62, - 0x0, 0x3, 0xc4, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+6545 "故" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, 0xb0, - 0x30, 0xb0, 0x0, 0x40, 0x5, 0x55, 0xc5, 0x73, - 0xd5, 0x5d, 0x61, 0x0, 0x0, 0xb0, 0x6, 0x80, - 0xc, 0x0, 0x0, 0x0, 0xb0, 0x6, 0x50, 0x1b, - 0x0, 0x0, 0xc5, 0x79, 0x80, 0x34, 0x47, 0x0, - 0x0, 0xb0, 0x6, 0x50, 0x9, 0x92, 0x0, 0x0, - 0xb0, 0x6, 0x50, 0x9, 0xb0, 0x0, 0x0, 0xb0, - 0x6, 0x50, 0xb, 0xb0, 0x0, 0x0, 0xd5, 0x59, - 0x51, 0x92, 0x5b, 0x20, 0x0, 0x50, 0x1, 0x55, - 0x0, 0x5, 0xd2, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+6548 "效" */ - 0x0, 0x1, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x5, 0x60, 0x0, 0x1e, 0x20, 0x0, 0x0, 0x0, - 0xd1, 0x21, 0x48, 0x0, 0x0, 0x3, 0x65, 0x65, - 0x75, 0x92, 0x0, 0x60, 0x0, 0x2b, 0x7, 0x40, - 0xb5, 0x5d, 0x51, 0x0, 0x93, 0x0, 0xd4, 0x90, - 0xb, 0x0, 0x3, 0x60, 0x6, 0x36, 0x50, 0x29, - 0x0, 0x5, 0x14, 0x1c, 0x12, 0x34, 0x64, 0x0, - 0x0, 0x3, 0xc4, 0x0, 0x9, 0xb0, 0x0, 0x0, - 0x2, 0xba, 0x0, 0xa, 0x70, 0x0, 0x0, 0xa, - 0x8, 0x70, 0x3a, 0xa0, 0x0, 0x0, 0x81, 0x1, - 0x54, 0x60, 0x6b, 0x10, 0x6, 0x10, 0x0, 0x53, - 0x0, 0x7, 0xb1, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, - - /* U+6557 "敗" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x6, - 0x55, 0x55, 0x90, 0x7a, 0x0, 0x0, 0xb, 0x0, - 0x1, 0xb0, 0xa2, 0x0, 0x0, 0xb, 0x0, 0x1, - 0xa0, 0xc5, 0x57, 0xb2, 0xb, 0x55, 0x55, 0xa3, - 0x80, 0xc, 0x0, 0xb, 0x0, 0x1, 0xa7, 0x40, - 0xc, 0x0, 0xb, 0x55, 0x55, 0xa6, 0x50, 0x29, - 0x0, 0xb, 0x0, 0x1, 0xb0, 0x42, 0x75, 0x0, - 0xb, 0x55, 0x55, 0xa0, 0x7, 0xb0, 0x0, 0x7, - 0x11, 0x10, 0x40, 0x9, 0x80, 0x0, 0x0, 0xa6, - 0x1a, 0x30, 0x3a, 0xb1, 0x0, 0x5, 0x60, 0x2, - 0x72, 0x80, 0x3d, 0x20, 0x24, 0x0, 0x0, 0x44, - 0x0, 0x4, 0xd3, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+6559 "教" */ - 0x0, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, - 0xb3, 0x2b, 0xc, 0x10, 0x0, 0x1, 0x55, 0xc5, - 0xd2, 0xa, 0x0, 0x50, 0x5, 0x55, 0xc8, 0xaa, - 0x67, 0x4a, 0x62, 0x0, 0x0, 0x38, 0x0, 0x73, - 0xa, 0x10, 0x1, 0x57, 0xb5, 0xd3, 0x44, 0xb, - 0x0, 0x0, 0x46, 0x16, 0x22, 0x6, 0xa, 0x0, - 0x4, 0x20, 0x85, 0x2, 0x6, 0x56, 0x0, 0x1, - 0x36, 0xc8, 0x52, 0x3, 0xd0, 0x0, 0x8, 0x72, - 0x83, 0x0, 0x7, 0xc2, 0x0, 0x0, 0x0, 0x83, - 0x0, 0x75, 0x1c, 0x20, 0x0, 0x27, 0xd1, 0x26, - 0x20, 0x3, 0xd4, 0x0, 0x0, 0x30, 0x10, 0x0, - 0x0, 0x0, - - /* U+6562 "敢" */ - 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x1, - 0x55, 0x58, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, - 0x48, 0x0, 0x83, 0x0, 0x0, 0x15, 0x55, 0xa6, - 0x86, 0xb5, 0x56, 0xa0, 0x0, 0xb0, 0xb, 0x0, - 0xa0, 0x1a, 0x0, 0x0, 0xb0, 0xb, 0x5, 0x80, - 0x38, 0x0, 0x0, 0xc5, 0x5c, 0x7, 0x50, 0x65, - 0x0, 0x0, 0xb0, 0xb, 0x13, 0x34, 0x92, 0x0, - 0x0, 0xc5, 0x5c, 0x0, 0x8, 0xb0, 0x0, 0x0, - 0xb0, 0xb, 0x33, 0x9, 0x70, 0x0, 0x16, 0xe9, - 0x7d, 0x10, 0x1b, 0xb0, 0x0, 0x8, 0x20, 0xb, - 0x0, 0x91, 0x4b, 0x10, 0x0, 0x0, 0xb, 0x27, - 0x10, 0x5, 0xc2, 0x0, 0x0, 0x1, 0x20, 0x0, - 0x0, 0x0, - - /* U+6570 "数" */ - 0x0, 0x0, 0x30, 0x0, 0x11, 0x0, 0x0, 0x1, - 0x40, 0xc1, 0x62, 0x5b, 0x0, 0x0, 0x0, 0xb3, - 0xb1, 0x90, 0x93, 0x0, 0x0, 0x0, 0x31, 0xb3, - 0x41, 0xb0, 0x0, 0x60, 0x6, 0x5b, 0xe5, 0x56, - 0xb5, 0x5d, 0x51, 0x0, 0x48, 0xb9, 0x77, 0x50, - 0x1a, 0x0, 0x4, 0x60, 0xa0, 0x54, 0x50, 0x38, - 0x0, 0x11, 0x4, 0x90, 0x10, 0x52, 0x65, 0x0, - 0x6, 0x5b, 0x75, 0xc0, 0x17, 0xb1, 0x0, 0x0, - 0x29, 0x7, 0x50, 0xa, 0xb0, 0x0, 0x0, 0x26, - 0x8d, 0x20, 0xb, 0xa0, 0x0, 0x0, 0x6, 0x84, - 0xc2, 0x93, 0x8a, 0x10, 0x4, 0x62, 0x0, 0x36, - 0x10, 0x7, 0xc1, 0x0, 0x0, 0x1, 0x10, 0x0, - 0x0, 0x0, - - /* U+6574 "整" */ - 0x0, 0x0, 0x30, 0x0, 0x22, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x30, 0x86, 0x0, 0x0, 0x5, 0x65, - 0xc5, 0x63, 0xc5, 0x57, 0xa0, 0x0, 0x95, 0xc5, - 0xa3, 0xa0, 0x29, 0x0, 0x0, 0xa0, 0xb0, 0xa7, - 0x24, 0x84, 0x0, 0x0, 0xb7, 0xe5, 0x90, 0x9, - 0xb0, 0x0, 0x0, 0x2a, 0xc8, 0x60, 0x2a, 0xb2, - 0x0, 0x3, 0x70, 0xc0, 0x65, 0x60, 0x2c, 0xa1, - 0x12, 0x46, 0x65, 0x86, 0x55, 0x96, 0x10, 0x0, - 0x0, 0x20, 0x57, 0x0, 0x20, 0x0, 0x0, 0x0, - 0xc0, 0x5a, 0x56, 0x80, 0x0, 0x0, 0x0, 0xb0, - 0x57, 0x0, 0x0, 0x0, 0x4, 0x55, 0xc5, 0x8a, - 0x55, 0x5b, 0x90, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6587 "文" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x48, 0x0, 0x0, 0x10, 0x5, 0x55, 0x65, - 0x55, 0x57, 0x5a, 0xa0, 0x0, 0x0, 0x50, 0x0, - 0x2a, 0x0, 0x0, 0x0, 0x0, 0x51, 0x0, 0x66, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x0, 0xb1, 0x0, - 0x0, 0x0, 0x0, 0x8, 0x2, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x8a, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x8a, 0x70, 0x0, 0x0, 0x0, 0x1, 0x84, - 0x0, 0x7d, 0x84, 0x10, 0x3, 0x55, 0x0, 0x0, - 0x1, 0x8e, 0x80, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6599 "料" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0xc, 0x10, 0x0, 0x0, 0xd2, 0x0, 0x5, 0xb, - 0x9, 0x13, 0x20, 0xc0, 0x0, 0x3, 0x9b, 0x9, - 0x0, 0xd2, 0xc0, 0x0, 0x0, 0x6b, 0x40, 0x0, - 0x40, 0xc0, 0x0, 0x5, 0x5d, 0x5a, 0x31, 0x0, - 0xc0, 0x0, 0x0, 0x2f, 0x10, 0x4, 0x90, 0xc0, - 0x0, 0x0, 0x9e, 0x79, 0x0, 0xa0, 0xc0, 0x10, - 0x1, 0x8b, 0x9, 0x10, 0x0, 0xc6, 0xa0, 0x8, - 0x1b, 0x3, 0x55, 0x55, 0xd0, 0x0, 0x32, 0xb, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+65AD "断" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x20, 0xb2, 0x0, 0x12, 0x6b, 0x70, 0xb, 0x12, - 0xb0, 0x92, 0xc3, 0x10, 0x0, 0xb, 0xb, 0xc1, - 0x90, 0xb0, 0x0, 0x0, 0xb, 0x4, 0xc4, 0x0, - 0xb0, 0x0, 0x0, 0xb, 0x45, 0xe5, 0x93, 0xc5, - 0x57, 0xb1, 0xb, 0x4, 0xf4, 0x0, 0xb0, 0x1a, - 0x0, 0xb, 0x8, 0xc3, 0x90, 0xa0, 0x1a, 0x0, - 0xb, 0x17, 0xb0, 0xa3, 0x90, 0x1a, 0x0, 0xb, - 0x50, 0xb0, 0x4, 0x70, 0x1a, 0x0, 0xb, 0x0, - 0xa1, 0x8, 0x20, 0x1a, 0x0, 0xc, 0x55, 0x59, - 0x66, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x1, 0x60, - 0x0, 0x1a, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, - - /* U+65B0 "新" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x80, 0x0, 0x0, 0x39, 0xa0, 0x4, 0x55, - 0xb5, 0xb2, 0xb5, 0x41, 0x0, 0x0, 0x61, 0xa, - 0x20, 0xb0, 0x0, 0x0, 0x0, 0x2a, 0x8, 0x0, - 0xb0, 0x0, 0x0, 0x6, 0x57, 0x85, 0x87, 0xb5, - 0x56, 0xc3, 0x0, 0x0, 0xb0, 0x0, 0xb0, 0x1a, - 0x0, 0x3, 0x55, 0xc5, 0xa3, 0xb0, 0x1a, 0x0, - 0x0, 0x10, 0xb0, 0x0, 0xb0, 0x1a, 0x0, 0x0, - 0xd2, 0xb5, 0x41, 0xa0, 0x1a, 0x0, 0x4, 0x60, - 0xb0, 0xc6, 0x40, 0x1a, 0x0, 0x7, 0x22, 0xb0, - 0x28, 0x0, 0x1a, 0x0, 0x10, 0xa, 0x70, 0x60, - 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+65B7 "斷" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x19, 0x2, 0x70, 0x32, 0x6b, 0x60, 0xb, 0x35, - 0x57, 0x73, 0xc2, 0x0, 0x0, 0xb, 0x4a, 0x16, - 0xa0, 0xb0, 0x0, 0x0, 0xb, 0x25, 0x67, 0x81, - 0xb0, 0x0, 0x10, 0xb, 0x55, 0x75, 0x54, 0xb5, - 0x87, 0x80, 0xb, 0x58, 0x56, 0x90, 0xb0, 0x92, - 0x0, 0xb, 0xa, 0x16, 0x40, 0xb0, 0x92, 0x0, - 0xb, 0x68, 0x79, 0xb1, 0xb0, 0x92, 0x0, 0xb, - 0x18, 0x4, 0x60, 0xa0, 0x92, 0x0, 0xb, 0x48, - 0x8a, 0x92, 0x80, 0x92, 0x0, 0xb, 0x0, 0x36, - 0x47, 0x20, 0x92, 0x0, 0x8, 0x55, 0x55, 0x46, - 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x10, 0x0, - - /* U+65B9 "方" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x29, 0x0, 0x0, 0x20, 0x16, 0x55, 0x55, - 0x85, 0x55, 0x57, 0xb1, 0x0, 0x0, 0x2, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x80, 0x0, - 0x20, 0x0, 0x0, 0x0, 0x6, 0x95, 0x55, 0xe2, - 0x0, 0x0, 0x0, 0xa, 0x10, 0x1, 0xc0, 0x0, - 0x0, 0x0, 0xb, 0x0, 0x3, 0xa0, 0x0, 0x0, - 0x0, 0x73, 0x0, 0x5, 0x80, 0x0, 0x0, 0x2, - 0x80, 0x0, 0x8, 0x50, 0x0, 0x0, 0x28, 0x0, - 0x22, 0xc, 0x20, 0x0, 0x3, 0x50, 0x0, 0x7, - 0xfa, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+65BC "於" */ - 0x0, 0x2, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x9, 0x30, 0x0, 0x7a, 0x0, 0x0, 0x0, 0x3, - 0x52, 0x10, 0xb8, 0x0, 0x0, 0x16, 0x96, 0x57, - 0x61, 0xb2, 0x60, 0x0, 0x0, 0x92, 0x0, 0x6, - 0x40, 0xa1, 0x0, 0x0, 0x97, 0x59, 0x19, 0x0, - 0x2d, 0x20, 0x0, 0xa2, 0xb, 0x61, 0x63, 0x6, - 0xa0, 0x0, 0xb0, 0xb, 0x10, 0x1b, 0x80, 0x0, - 0x0, 0xb0, 0xb, 0x0, 0x0, 0x30, 0x0, 0x0, - 0xa0, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, - 0x38, 0x5, 0x95, 0x0, 0x0, 0x8, 0x17, 0xb4, - 0x0, 0x9, 0xe1, 0x0, 0x32, 0x3, 0x60, 0x0, - 0x0, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+65BD "施" */ - 0x0, 0x10, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x1a, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x9, - 0x20, 0x7, 0x92, 0x24, 0x90, 0x15, 0x75, 0x5b, - 0x5b, 0x33, 0x33, 0x30, 0x0, 0xb0, 0x0, 0x71, - 0xd, 0x0, 0x0, 0x0, 0xb0, 0x32, 0x2a, 0xb, - 0x5, 0x20, 0x0, 0xb5, 0xc3, 0xb, 0x1d, 0x6c, - 0x10, 0x0, 0xb0, 0xa2, 0x6d, 0x4b, 0xb, 0x0, - 0x0, 0xb0, 0xb1, 0xb, 0xb, 0xb, 0x0, 0x0, - 0x90, 0xb0, 0xb, 0xb, 0x6c, 0x0, 0x4, 0x50, - 0xb0, 0xb, 0xc, 0x12, 0x50, 0x8, 0x32, 0xc0, - 0xb, 0x3, 0x0, 0x90, 0x23, 0xb, 0x50, 0xc, - 0xaa, 0xaa, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+65C1 "旁" */ - 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x94, 0x0, 0x3, 0x0, 0x0, 0x65, - 0x65, 0x66, 0x65, 0x78, 0x0, 0x0, 0x0, 0x67, - 0x0, 0x77, 0x0, 0x0, 0x0, 0x20, 0xa, 0x0, - 0x70, 0x2, 0x0, 0x3, 0x95, 0x55, 0x85, 0x55, - 0x5c, 0x60, 0x7, 0x20, 0x0, 0x59, 0x0, 0x14, - 0x10, 0x4, 0x65, 0x57, 0x78, 0x55, 0x57, 0x90, - 0x0, 0x0, 0xb, 0x30, 0x0, 0x30, 0x0, 0x0, - 0x0, 0xd, 0x55, 0x56, 0xd0, 0x0, 0x0, 0x0, - 0x67, 0x0, 0x4, 0x90, 0x0, 0x0, 0x2, 0xa0, - 0x2, 0x8, 0x50, 0x0, 0x1, 0x66, 0x0, 0x2, - 0xcd, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+65C5 "旅" */ - 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x10, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x7, - 0x60, 0xb, 0x20, 0x1, 0x0, 0x15, 0x55, 0x5a, - 0x5b, 0x55, 0x59, 0x60, 0x0, 0xb0, 0x0, 0x62, - 0x0, 0x12, 0x0, 0x0, 0xb0, 0x4, 0x41, 0x27, - 0xa6, 0x0, 0x0, 0xb5, 0x5c, 0xc, 0x52, 0x0, - 0x0, 0x0, 0xb0, 0xa, 0xb, 0x4, 0xb, 0x30, - 0x0, 0xb0, 0x1a, 0xb, 0x8, 0x61, 0x0, 0x2, - 0x90, 0x29, 0xb, 0x8, 0x10, 0x0, 0x7, 0x30, - 0x47, 0xb, 0x2, 0xa0, 0x0, 0x8, 0x16, 0xb3, - 0xb, 0x54, 0x7a, 0x10, 0x41, 0x4, 0x50, 0xe, - 0x40, 0x7, 0xc1, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, - - /* U+65CF "族" */ - 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x48, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x0, 0x56, 0x0, 0x5, 0x0, 0x25, 0x85, 0x67, - 0x98, 0x55, 0x57, 0x20, 0x0, 0xb0, 0x1, 0x6d, - 0x10, 0x1, 0x0, 0x0, 0xb5, 0x95, 0x58, 0x85, - 0x68, 0x0, 0x0, 0xb0, 0xb0, 0x70, 0xa1, 0x0, - 0x0, 0x0, 0xb0, 0xb1, 0x0, 0xa0, 0x2, 0x10, - 0x0, 0xb0, 0xb5, 0x55, 0xc7, 0x57, 0x50, 0x1, - 0x90, 0xb0, 0x0, 0xa6, 0x0, 0x0, 0x6, 0x30, - 0xb0, 0x7, 0x42, 0x70, 0x0, 0x8, 0x29, 0x90, - 0x48, 0x0, 0x96, 0x0, 0x41, 0x4, 0x26, 0x50, - 0x0, 0xb, 0x90, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, - - /* U+65E2 "既" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x55, - 0x59, 0x25, 0x57, 0x58, 0x70, 0xa1, 0x0, 0xb1, - 0x30, 0xc0, 0x0, 0xa, 0x10, 0xb, 0x2b, 0xc, - 0x0, 0x0, 0xa6, 0x55, 0xb3, 0x70, 0xc0, 0x0, - 0xa, 0x10, 0xb, 0x46, 0xb, 0x0, 0x10, 0xa6, - 0x55, 0xb6, 0x77, 0xb5, 0x77, 0xa, 0x10, 0x4, - 0x0, 0x6c, 0x20, 0x0, 0xa1, 0x14, 0x0, 0xa, - 0xa2, 0x0, 0xa, 0x10, 0x67, 0x2, 0xa9, 0x20, - 0x0, 0xa1, 0x65, 0xd1, 0x91, 0x92, 0x5, 0xb, - 0xc3, 0x3, 0x64, 0x9, 0x20, 0x80, 0x31, 0x0, - 0x53, 0x0, 0x6b, 0xad, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, - - /* U+65E5 "日" */ - 0x95, 0x55, 0x55, 0x5a, 0x2c, 0x0, 0x0, 0x0, - 0xc0, 0xc0, 0x0, 0x0, 0xc, 0xc, 0x0, 0x0, - 0x0, 0xc0, 0xc0, 0x0, 0x0, 0xc, 0xd, 0x55, - 0x55, 0x55, 0xd0, 0xc0, 0x0, 0x0, 0xc, 0xc, - 0x0, 0x0, 0x0, 0xc0, 0xc0, 0x0, 0x0, 0xc, - 0xc, 0x0, 0x0, 0x0, 0xc0, 0xd5, 0x55, 0x55, - 0x5d, 0xa, 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+65E6 "旦" */ - 0x0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0xb6, 0x55, 0x55, 0xd3, 0x0, 0x0, 0xb, 0x10, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0xa, 0x65, 0x55, 0x5d, 0x0, - 0x0, 0x0, 0xa1, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0xa, 0x10, 0x0, 0xc, 0x0, 0x0, 0x0, 0xb6, - 0x55, 0x55, 0xd0, 0x0, 0x0, 0xb, 0x10, 0x0, - 0xb, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x11, - 0x75, 0x55, 0x55, 0x55, 0x55, 0x53, - - /* U+65E9 "早" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa5, 0x55, 0x55, 0xc4, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xb, 0x10, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0xb1, 0x0, 0x0, 0xc, 0x55, 0x55, 0x5c, 0x10, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0xb1, 0x0, 0x0, - 0xc, 0x55, 0x75, 0x5c, 0x10, 0x0, 0x0, 0x60, - 0xb, 0x10, 0x40, 0x0, 0x0, 0x0, 0x0, 0xb1, - 0x0, 0x8, 0x1, 0x75, 0x55, 0x5c, 0x65, 0x55, - 0x52, 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, - - /* U+65F6 "时" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe1, 0x0, 0x85, 0x5a, 0x20, - 0x0, 0xc, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x0, - 0xc0, 0x50, 0xc0, 0xc, 0x46, 0x55, 0x5d, 0x57, - 0x1c, 0x0, 0xc0, 0x0, 0x0, 0xc0, 0x0, 0xc5, - 0x5d, 0x7, 0x40, 0xc, 0x0, 0xc, 0x0, 0xc0, - 0xe, 0x10, 0xc0, 0x0, 0xc0, 0xc, 0x0, 0x60, - 0xc, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x0, 0xc0, - 0x0, 0xc5, 0x5d, 0x0, 0x0, 0xc, 0x0, 0x9, - 0x0, 0x30, 0x0, 0x11, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, - - /* U+6607 "昇" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x55, 0x55, 0x55, 0x8b, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, 0xd, 0x55, - 0x55, 0x55, 0x87, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x47, 0x0, 0x0, 0xc, 0x55, 0x75, 0x55, - 0x75, 0x0, 0x0, 0x2, 0x6a, 0xc2, 0xc, 0x10, - 0x0, 0x0, 0x33, 0x57, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x0, 0x47, 0x0, 0xc, 0x3, 0x70, 0x5, - 0x55, 0x99, 0x55, 0x5d, 0x55, 0x50, 0x0, 0x0, - 0xa2, 0x0, 0xc, 0x0, 0x0, 0x0, 0x3, 0x80, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x57, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x3, - 0x0, 0x0, - - /* U+660E "明" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x95, 0x55, 0xc2, 0xc5, 0x5d, 0xa, 0x10, 0xb, - 0xb, 0x0, 0xb0, 0xa1, 0x0, 0xb0, 0xb0, 0xb, - 0xa, 0x65, 0x5c, 0xc, 0x55, 0xb0, 0xa1, 0x0, - 0xb0, 0xb0, 0xb, 0xb, 0x0, 0xb, 0xb, 0x0, - 0xb0, 0xb3, 0x33, 0xc0, 0xc5, 0x5c, 0xc, 0x11, - 0x1b, 0xb, 0x0, 0x51, 0xb0, 0x0, 0xb0, 0x0, - 0x0, 0x84, 0x0, 0xb, 0x0, 0x0, 0x47, 0x0, - 0x10, 0xc0, 0x0, 0x44, 0x0, 0x4, 0xcc, 0x0, - 0x11, 0x0, 0x0, 0x1, 0x0, - - /* U+6613 "易" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1b, - 0x55, 0x55, 0x5d, 0x0, 0x0, 0x1b, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x1c, 0x55, 0x55, 0x5c, 0x0, - 0x0, 0x1b, 0x0, 0x0, 0xc, 0x0, 0x0, 0x1c, - 0x85, 0x55, 0x5b, 0x0, 0x0, 0x7, 0xa0, 0x0, - 0x0, 0x11, 0x0, 0x2b, 0x5b, 0x75, 0xc5, 0xa8, - 0x2, 0x90, 0x3b, 0x6, 0x70, 0x93, 0x4, 0x1, - 0xb1, 0xc, 0x10, 0xc0, 0x0, 0x48, 0x10, 0x95, - 0x0, 0xc0, 0x4, 0x20, 0x19, 0x51, 0x4, 0x90, - 0x0, 0x15, 0x61, 0x1, 0xae, 0x20, 0x0, 0x20, - 0x0, 0x0, 0x0, 0x0, - - /* U+6614 "昔" */ - 0x0, 0x0, 0x10, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x76, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, - 0x74, 0x0, 0xc0, 0x36, 0x0, 0x2, 0x65, 0xa8, - 0x55, 0xd5, 0x55, 0x0, 0x0, 0x0, 0x74, 0x0, - 0xc0, 0x0, 0x0, 0x15, 0x55, 0xa8, 0x55, 0xd5, - 0x5b, 0x80, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x55, 0x55, 0x5a, 0x70, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x8, 0x40, 0x0, 0x0, - 0xc, 0x55, 0x55, 0x5a, 0x40, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x8, 0x40, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x8, 0x40, 0x0, 0x0, 0xc, 0x55, 0x55, - 0x5a, 0x40, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+661F "星" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x55, 0x55, 0x55, 0x8a, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x57, 0x0, 0x0, 0xd, 0x55, - 0x55, 0x55, 0x87, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x57, 0x0, 0x0, 0xb, 0x55, 0x65, 0x55, - 0x86, 0x0, 0x0, 0x9, 0x20, 0x2b, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0x55, 0x6b, 0x55, 0x6d, 0x20, - 0x0, 0x82, 0x0, 0x29, 0x0, 0x0, 0x0, 0x2, - 0x50, 0x0, 0x29, 0x0, 0x82, 0x0, 0x3, 0x5, - 0x55, 0x6b, 0x55, 0x53, 0x0, 0x0, 0x0, 0x0, - 0x29, 0x0, 0x0, 0x40, 0x6, 0x55, 0x55, 0x57, - 0x55, 0x56, 0x92, - - /* U+6620 "映" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb2, 0x0, 0x0, 0x75, 0x59, 0x0, - 0xb, 0x0, 0x0, 0xb, 0x0, 0xb0, 0xb5, 0xc5, - 0x5c, 0x0, 0xb0, 0xb, 0xa, 0xb, 0x0, 0xa0, - 0xb, 0x0, 0xb0, 0xa0, 0xb0, 0xa, 0x0, 0xb5, - 0x5b, 0xa, 0xb, 0x0, 0xa0, 0xb, 0x0, 0xb5, - 0xa5, 0xc5, 0x5b, 0xb1, 0xb0, 0xb, 0x0, 0x28, - 0x50, 0x0, 0xb, 0x0, 0xb0, 0x8, 0x46, 0x10, - 0x0, 0xb5, 0x5b, 0x1, 0xa0, 0x1a, 0x0, 0x9, - 0x0, 0x1, 0xa1, 0x0, 0x6a, 0x0, 0x0, 0x5, - 0x70, 0x0, 0x0, 0x8d, 0x10, 0x2, 0x10, 0x0, - 0x0, 0x0, 0x0, - - /* U+6625 "春" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf3, 0x0, 0x1, 0x0, 0x2, 0x55, - 0x56, 0xe5, 0x55, 0x5a, 0x30, 0x0, 0x0, 0x5, - 0x70, 0x0, 0x60, 0x0, 0x0, 0x55, 0x5d, 0x65, - 0x55, 0x51, 0x0, 0x5, 0x55, 0x6c, 0x55, 0x55, - 0x57, 0xc1, 0x0, 0x1, 0xb1, 0x0, 0x7, 0x0, - 0x0, 0x0, 0x1a, 0x61, 0x11, 0x18, 0x90, 0x0, - 0x4, 0x70, 0xd3, 0x33, 0x3d, 0x3c, 0xa3, 0x11, - 0x0, 0xc0, 0x0, 0xc, 0x0, 0x40, 0x0, 0x0, - 0xd5, 0x55, 0x5c, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xd5, 0x55, - 0x5c, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x1, - 0x0, 0x0, - - /* U+6628 "昨" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x70, 0x0, 0x0, 0x85, 0x5b, 0x20, - 0xd0, 0x0, 0x0, 0xb, 0x0, 0xb0, 0x4a, 0x75, - 0x57, 0xb0, 0xb0, 0xb, 0x9, 0xc, 0x0, 0x0, - 0xb, 0x0, 0xb3, 0x40, 0xc0, 0x0, 0x0, 0xb5, - 0x5c, 0x20, 0xd, 0x55, 0xa2, 0xb, 0x0, 0xb0, - 0x0, 0xc0, 0x0, 0x0, 0xb0, 0xb, 0x0, 0xc, - 0x0, 0x33, 0xb, 0x0, 0xb0, 0x0, 0xd5, 0x56, - 0x50, 0xb5, 0x5d, 0x0, 0xc, 0x0, 0x0, 0xa, - 0x0, 0x40, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x0, - - /* U+662F "是" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0xd5, 0x55, 0x5c, 0x50, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, 0xd5, - 0x55, 0x5c, 0x20, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0xa, 0x20, 0x0, 0x0, 0x0, 0xd5, 0x55, 0x5b, - 0x20, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x7, - 0x30, 0x4, 0x65, 0x75, 0x5d, 0x55, 0x55, 0x40, - 0x0, 0x4, 0xd0, 0xc, 0x0, 0x22, 0x0, 0x0, - 0x8, 0x60, 0xd, 0x55, 0x65, 0x0, 0x0, 0xb, - 0x45, 0xc, 0x0, 0x0, 0x0, 0x0, 0x92, 0x5, - 0xbd, 0x20, 0x0, 0x0, 0x5, 0x30, 0x0, 0x17, - 0xbd, 0xef, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+663C "昼" */ - 0x0, 0x8, 0x55, 0x55, 0x55, 0xb0, 0x0, 0x0, - 0xb, 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0xc, - 0x55, 0x55, 0x65, 0xb0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x42, 0x10, 0x0, 0x0, 0x39, 0x0, 0x0, - 0x9, 0x20, 0x0, 0x0, 0x98, 0x75, 0x55, 0x5d, - 0xa7, 0x0, 0x2, 0x67, 0x30, 0x0, 0xa, 0x6, - 0xb0, 0x16, 0x7, 0x75, 0x55, 0x5b, 0x0, 0x0, - 0x10, 0x7, 0x30, 0x0, 0xa, 0x0, 0x0, 0x0, - 0x7, 0x75, 0x55, 0x5b, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x8, 0x0, 0x3, 0x55, 0x55, - 0x55, 0x55, 0x56, 0x30, - - /* U+6642 "時" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x0, - 0x20, 0x0, 0xb2, 0x0, 0x0, 0xc5, 0x5d, 0x10, - 0xb, 0x0, 0x30, 0xb, 0x0, 0xb0, 0x55, 0xc5, - 0x57, 0x0, 0xb0, 0xb, 0x0, 0xb, 0x0, 0x0, - 0xb, 0x0, 0xb5, 0x55, 0xd5, 0x57, 0xa0, 0xb5, - 0x5b, 0x0, 0x0, 0x9, 0x10, 0xb, 0x0, 0xb4, - 0x55, 0x55, 0xc5, 0xa0, 0xb0, 0xb, 0x14, 0x10, - 0xb, 0x0, 0xb, 0x0, 0xb0, 0xc, 0x10, 0xb0, - 0x0, 0xc5, 0x5c, 0x0, 0x41, 0xb, 0x0, 0x8, - 0x0, 0x30, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x10, 0x0, - - /* U+6669 "晩" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x20, 0x0, 0x0, 0xb5, 0x5c, 0x4, - 0xb5, 0x6b, 0x10, 0xb, 0x1, 0x90, 0xa0, 0x8, - 0x40, 0x0, 0xb0, 0x19, 0x7a, 0x56, 0x85, 0x92, - 0xb, 0x1, 0xb2, 0xb0, 0x91, 0xb, 0x0, 0xc5, - 0x69, 0xb, 0x9, 0x10, 0xb0, 0xb, 0x1, 0x90, - 0xd5, 0xb6, 0x5c, 0x0, 0xb0, 0x19, 0x4, 0x17, - 0xc0, 0x10, 0xb, 0x1, 0xa0, 0x4, 0x4c, 0x0, - 0x0, 0xd5, 0x6a, 0x0, 0x90, 0xc0, 0x4, 0x6, - 0x0, 0x0, 0x65, 0xc, 0x0, 0x60, 0x0, 0x0, - 0x64, 0x0, 0xba, 0x9d, 0x10, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, - - /* U+666E "普" */ - 0x0, 0x0, 0x40, 0x0, 0x22, 0x0, 0x0, 0x0, - 0x4, 0xb0, 0x8, 0x30, 0x0, 0x2, 0x55, 0x5d, - 0x55, 0x95, 0x7c, 0x10, 0x1, 0x0, 0xc0, 0x2a, - 0x5, 0x0, 0x0, 0xa, 0xc, 0x2, 0xa1, 0xb0, - 0x0, 0x0, 0x75, 0xc0, 0x2a, 0x71, 0x0, 0x35, - 0x56, 0x5d, 0x56, 0xb7, 0x5c, 0x70, 0x0, 0x10, - 0x0, 0x0, 0x20, 0x0, 0x0, 0xa, 0x65, 0x55, - 0x5d, 0x30, 0x0, 0x0, 0x92, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x9, 0x65, 0x55, 0x5d, 0x0, 0x0, - 0x0, 0x92, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xa, - 0x65, 0x55, 0x5d, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x10, 0x0, - - /* U+666F "景" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x55, 0x55, 0x55, 0xd1, 0x0, 0x0, 0xc, - 0x55, 0x55, 0x55, 0xd0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0xb, 0x55, 0x88, - 0x55, 0xa0, 0x0, 0x3, 0x33, 0x33, 0x3c, 0x33, - 0x35, 0xa0, 0x3, 0x24, 0x22, 0x22, 0x22, 0x62, - 0x20, 0x0, 0x8, 0x85, 0x55, 0x56, 0xc0, 0x0, - 0x0, 0x8, 0x40, 0x0, 0x1, 0xa0, 0x0, 0x0, - 0x6, 0x65, 0x6c, 0x55, 0x70, 0x0, 0x0, 0x1, - 0xc2, 0x1a, 0x5, 0x40, 0x0, 0x0, 0x59, 0x20, - 0x1a, 0x0, 0x6c, 0x20, 0x15, 0x20, 0x5, 0xa8, - 0x0, 0x4, 0x70, 0x0, 0x0, 0x0, 0x40, 0x0, - 0x0, 0x0, - - /* U+6674 "晴" */ - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0xb3, 0x2, 0x10, 0xb5, 0x5d, 0x35, - 0x5c, 0x55, 0x64, 0xb, 0x0, 0xb0, 0x0, 0xb1, - 0x6, 0x0, 0xb0, 0xb, 0x5, 0x5c, 0x65, 0x51, - 0xb, 0x33, 0xb5, 0x55, 0xb5, 0x55, 0xa0, 0xb2, - 0x2b, 0x2, 0x0, 0x0, 0x40, 0xb, 0x0, 0xb0, - 0xb5, 0x55, 0x5c, 0x0, 0xb0, 0xb, 0xb, 0x55, - 0x55, 0xb0, 0xb, 0x33, 0xb0, 0xb0, 0x0, 0xb, - 0x0, 0xb2, 0x2b, 0xb, 0x55, 0x55, 0xb0, 0x5, - 0x0, 0x10, 0xb0, 0x0, 0xb, 0x0, 0x0, 0x0, - 0xb, 0x0, 0x49, 0xa0, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x41, 0x0, - - /* U+667A "智" */ - 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, 0xb0, - 0x3, 0x1, 0x0, 0x1, 0x6, 0x69, 0x86, 0x1b, - 0x55, 0x79, 0x5, 0x7, 0x30, 0xb, 0x0, 0x37, - 0x55, 0x5b, 0x57, 0x6b, 0x0, 0x37, 0x0, 0xb, - 0x74, 0xb, 0x55, 0x78, 0x0, 0x74, 0xa, 0x6b, - 0x0, 0x36, 0x5, 0x43, 0x0, 0x21, 0x4, 0x0, - 0x31, 0xd, 0x55, 0x55, 0x5d, 0x20, 0x0, 0xb, - 0x0, 0x0, 0xb, 0x0, 0x0, 0xc, 0x55, 0x55, - 0x5c, 0x0, 0x0, 0xb, 0x0, 0x0, 0xb, 0x0, - 0x0, 0xd, 0x55, 0x55, 0x5c, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x1, 0x0, - - /* U+6687 "暇" */ - 0x0, 0x11, 0x75, 0x83, 0x55, 0x92, 0xb, 0x5c, - 0x49, 0xa, 0x0, 0xa, 0x0, 0xa0, 0xa1, 0x90, - 0xa0, 0x0, 0xa0, 0xa, 0xa, 0x1b, 0x5c, 0x15, - 0x5c, 0x0, 0xb5, 0xc1, 0x90, 0x40, 0x0, 0x10, - 0xa, 0xa, 0x19, 0x3, 0x45, 0x58, 0x30, 0xa0, - 0xa1, 0xb5, 0x40, 0x40, 0xb1, 0xa, 0xa, 0x19, - 0x2, 0x5, 0x1b, 0x0, 0xb5, 0xc2, 0xb5, 0x71, - 0x69, 0x30, 0x7, 0x1, 0x19, 0x0, 0x4, 0xe0, - 0x0, 0x0, 0x1, 0x90, 0x3, 0x84, 0xc3, 0x0, - 0x0, 0x28, 0x4, 0x40, 0x4, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6691 "暑" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x55, 0x55, 0x56, 0xc0, 0x0, 0x0, 0xc, - 0x55, 0x55, 0x56, 0xa0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x2, 0xa0, 0x0, 0x0, 0xb, 0x55, 0xd6, - 0x56, 0x8b, 0x10, 0x0, 0x15, 0x55, 0xd6, 0xa3, - 0xc4, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x6b, 0x11, - 0x50, 0x6, 0x55, 0x55, 0x9d, 0x85, 0x56, 0x70, - 0x0, 0x0, 0x7a, 0xc6, 0x55, 0x90, 0x0, 0x0, - 0x58, 0xd0, 0x0, 0x0, 0xc0, 0x0, 0x23, 0x0, - 0xd5, 0x55, 0x55, 0xc0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xd5, 0x55, - 0x55, 0xc0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+6696 "暖" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x1, 0x45, 0x68, 0xab, 0x30, 0xb5, 0x5d, 0x23, - 0x6, 0x2, 0x90, 0xb, 0x0, 0xb0, 0x93, 0x74, - 0x73, 0x0, 0xb0, 0xb, 0x28, 0x66, 0x58, 0x95, - 0xb, 0x0, 0xb0, 0x4, 0x70, 0x0, 0x0, 0xc5, - 0x5b, 0x46, 0x98, 0x55, 0x5b, 0x1b, 0x0, 0xb0, - 0xa, 0x10, 0x0, 0x0, 0xb0, 0xb, 0x0, 0xc6, - 0x56, 0xd0, 0xb, 0x0, 0xb0, 0x64, 0x70, 0xb3, - 0x0, 0xc5, 0x5b, 0x19, 0x3, 0xc5, 0x0, 0xa, - 0x0, 0x7, 0x0, 0x8a, 0xa1, 0x0, 0x0, 0x3, - 0x3, 0x82, 0x5, 0xda, 0x20, 0x0, 0x0, 0x20, - 0x0, 0x0, 0x20, - - /* U+6697 "暗" */ - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x85, 0x0, 0x0, 0xb5, 0x5d, 0x16, - 0x56, 0x75, 0x93, 0xc, 0x0, 0xb0, 0x23, 0x0, - 0xa3, 0x0, 0xb0, 0xb, 0x0, 0xc1, 0xa, 0x0, - 0xb, 0x0, 0xb1, 0x26, 0x26, 0x32, 0x80, 0xc5, - 0x5b, 0x33, 0x33, 0x33, 0x33, 0xb, 0x0, 0xb0, - 0x75, 0x55, 0x5a, 0x0, 0xb0, 0xb, 0xb, 0x0, - 0x0, 0xb0, 0xb, 0x0, 0xb0, 0xb5, 0x55, 0x5b, - 0x0, 0xc5, 0x5b, 0xb, 0x0, 0x0, 0xb0, 0x4, - 0x0, 0x10, 0xb5, 0x55, 0x5c, 0x0, 0x0, 0x0, - 0xb, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+66C7 "曇" */ - 0x0, 0x10, 0x0, 0x0, 0x4, 0x0, 0x0, 0xa, - 0x55, 0x55, 0x55, 0xc1, 0x0, 0x0, 0xa5, 0x55, - 0x55, 0x5b, 0x0, 0x0, 0xa, 0x55, 0x55, 0x55, - 0xb0, 0x0, 0x0, 0x53, 0x33, 0x33, 0x39, 0x20, - 0x0, 0x32, 0x11, 0xa2, 0x11, 0x11, 0x40, 0x39, - 0x77, 0x6b, 0x56, 0x77, 0x5c, 0x28, 0x27, 0x72, - 0x91, 0x37, 0x62, 0x0, 0x0, 0x11, 0x13, 0x11, - 0x44, 0x0, 0x0, 0x4, 0x43, 0x33, 0x33, 0x33, - 0x30, 0x55, 0x55, 0x79, 0x55, 0x55, 0x66, 0x0, - 0x0, 0x29, 0x20, 0x6, 0x40, 0x0, 0x0, 0x8d, - 0x98, 0x76, 0x5c, 0x30, 0x0, 0x2, 0x20, 0x0, - 0x0, 0x10, 0x0, - - /* U+66DC "曜" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x34, 0x65, 0xb4, 0x65, 0xb0, 0xc5, 0x6b, 0x37, - 0xa, 0x26, 0xa, 0xb, 0x1, 0x90, 0x60, 0xa0, - 0x61, 0xa0, 0xb0, 0x19, 0x16, 0x5a, 0x37, 0x5b, - 0xb, 0x56, 0xa9, 0x22, 0x69, 0x10, 0x60, 0xb0, - 0x19, 0x8, 0x60, 0xc2, 0x12, 0xb, 0x1, 0x91, - 0xc5, 0x5c, 0x56, 0x60, 0xb0, 0x19, 0x7c, 0x22, - 0xb2, 0x80, 0xb, 0x56, 0xb1, 0xc3, 0x3b, 0x33, - 0x10, 0xb0, 0x13, 0xc, 0x55, 0xc5, 0xa2, 0x2, - 0x0, 0x0, 0xb0, 0xa, 0x0, 0x30, 0x0, 0x0, - 0xd, 0x55, 0x75, 0x68, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x0, - - /* U+66F2 "曲" */ - 0x0, 0x3, 0x0, 0x30, 0x0, 0x0, 0x0, 0xc1, - 0xc, 0x10, 0x0, 0x0, 0xb, 0x0, 0xb0, 0x0, - 0x8, 0x55, 0xc5, 0x5c, 0x55, 0xa1, 0xd0, 0xb, - 0x0, 0xb0, 0xc, 0xc, 0x0, 0xb0, 0xb, 0x0, - 0xc0, 0xc0, 0xb, 0x0, 0xb0, 0xc, 0xc, 0x55, - 0xc5, 0x5c, 0x55, 0xc0, 0xc0, 0xb, 0x0, 0xb0, - 0xc, 0xc, 0x0, 0xb0, 0xb, 0x0, 0xc0, 0xc0, - 0xb, 0x0, 0xb0, 0xc, 0xc, 0x55, 0xb5, 0x5b, - 0x55, 0xd0, 0xc0, 0x0, 0x0, 0x0, 0x9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+66F4 "更" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x55, 0x55, 0x56, 0x55, 0x56, 0xc1, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x19, 0x55, - 0x5d, 0x55, 0x5b, 0x0, 0x0, 0x1b, 0x0, 0xc, - 0x0, 0x1a, 0x0, 0x0, 0xc, 0x55, 0x5d, 0x55, - 0x6a, 0x0, 0x0, 0xb, 0x0, 0xc, 0x0, 0x1a, - 0x0, 0x0, 0x1c, 0x55, 0x5d, 0x55, 0x6a, 0x0, - 0x0, 0x5, 0x10, 0x38, 0x0, 0x4, 0x0, 0x0, - 0x0, 0x33, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, - 0x7b, 0x62, 0x0, 0x0, 0x1, 0x57, 0x50, 0x1, - 0x6a, 0xdd, 0xe4, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+66F8 "書" */ - 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2b, 0x0, 0x20, 0x0, 0x0, 0x45, 0x56, - 0xb5, 0x5c, 0x41, 0x3, 0x65, 0x55, 0x6b, 0x55, - 0xb7, 0x90, 0x0, 0x45, 0x56, 0xb5, 0x5b, 0x10, - 0x0, 0x0, 0x0, 0x29, 0x0, 0x32, 0x0, 0x3, - 0x55, 0x56, 0xb5, 0x56, 0x60, 0x4, 0x55, 0x55, - 0x69, 0x55, 0x58, 0x80, 0x0, 0x85, 0x55, 0x55, - 0x59, 0x20, 0x0, 0xc, 0x0, 0x0, 0x0, 0xa1, - 0x0, 0x0, 0xd5, 0x55, 0x55, 0x5c, 0x10, 0x0, - 0xc, 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, 0xd5, - 0x55, 0x55, 0x5c, 0x10, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x20, 0x0, - - /* U+66FE "曾" */ - 0x0, 0x20, 0x0, 0x11, 0x0, 0x0, 0x3a, 0x0, - 0x96, 0x0, 0x20, 0x7, 0x2, 0x60, 0x12, 0xb5, - 0x55, 0xb6, 0x55, 0x88, 0xb0, 0x82, 0x91, 0x59, - 0x56, 0xb0, 0x39, 0x92, 0x80, 0x56, 0xb5, 0x56, - 0xb7, 0x55, 0x86, 0x60, 0x0, 0x0, 0x0, 0x22, - 0x9, 0x55, 0x55, 0x5b, 0x40, 0x9, 0x10, 0x0, - 0x9, 0x10, 0x9, 0x65, 0x55, 0x5b, 0x10, 0x9, - 0x10, 0x0, 0x9, 0x20, 0x9, 0x55, 0x55, 0x5b, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+66FF "替" */ - 0x0, 0x3, 0x0, 0x1, 0x20, 0x0, 0x0, 0xd, - 0x10, 0x2, 0xb0, 0x0, 0x5, 0x5d, 0x77, 0x46, - 0xb7, 0x70, 0x0, 0xb, 0x1, 0x3, 0x80, 0x20, - 0x25, 0x7b, 0x65, 0x59, 0xb5, 0x73, 0x0, 0x86, - 0x90, 0xa, 0x17, 0x0, 0x4, 0x60, 0x55, 0x81, - 0x5, 0xa4, 0x43, 0x75, 0x59, 0x55, 0x5a, 0x42, - 0x0, 0xc0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x29, 0x0, 0x0, 0xc5, 0x55, 0x55, - 0x69, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x2a, 0x0, - 0x0, 0xc5, 0x55, 0x55, 0x6a, 0x0, 0x0, 0x20, - 0x0, 0x0, 0x0, 0x0, - - /* U+6700 "最" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x6, 0x85, 0x55, 0x55, 0xd2, 0x0, 0x0, 0x6, - 0x95, 0x55, 0x55, 0xd0, 0x0, 0x0, 0x6, 0x60, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x6, 0x95, 0x55, - 0x55, 0xd0, 0x0, 0x4, 0x56, 0x55, 0x55, 0x55, - 0x58, 0xd1, 0x0, 0x29, 0x0, 0xb0, 0x0, 0x3, - 0x0, 0x0, 0x2b, 0x55, 0xc4, 0x85, 0x5d, 0x30, - 0x0, 0x2b, 0x55, 0xc0, 0x50, 0x39, 0x0, 0x0, - 0x29, 0x0, 0xb0, 0x28, 0xb1, 0x0, 0x0, 0x2b, - 0x67, 0xd5, 0x1a, 0x90, 0x0, 0xa, 0xc7, 0x30, - 0xb0, 0x56, 0x99, 0x10, 0x0, 0x0, 0x0, 0xb5, - 0x30, 0x6, 0xb2, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+6703 "會" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x71, 0x60, 0x0, 0x0, 0x0, 0x1, 0xa5, - 0x0, 0x5a, 0x61, 0x0, 0x0, 0x57, 0x25, 0x55, - 0x51, 0x6c, 0xb1, 0x4, 0xb, 0x55, 0x59, 0x55, - 0xb3, 0x0, 0x0, 0xb, 0x57, 0xb, 0x56, 0x91, - 0x0, 0x0, 0xb, 0x6, 0xb, 0x60, 0x91, 0x0, - 0x0, 0x8, 0x55, 0x55, 0x56, 0x70, 0x0, 0x0, - 0x3, 0xa5, 0x55, 0x5c, 0x30, 0x0, 0x0, 0x2, - 0xb5, 0x55, 0x5c, 0x10, 0x0, 0x0, 0x2, 0x90, - 0x0, 0xa, 0x10, 0x0, 0x0, 0x3, 0xb5, 0x55, - 0x5c, 0x10, 0x0, 0x0, 0x1, 0x30, 0x0, 0x4, - 0x0, 0x0, - - /* U+6708 "月" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa5, - 0x55, 0x55, 0xc1, 0x0, 0xc, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc0, 0x0, 0xd, - 0x55, 0x55, 0x5c, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0xc0, 0x0, 0xc, 0x0, 0x0, 0xc, 0x0, 0x0, - 0xd5, 0x55, 0x55, 0xc0, 0x0, 0x2a, 0x0, 0x0, - 0xc, 0x0, 0x5, 0x70, 0x0, 0x0, 0xc0, 0x0, - 0xa1, 0x0, 0x0, 0xc, 0x0, 0x37, 0x0, 0x1, - 0x11, 0xd0, 0x26, 0x0, 0x0, 0x5, 0xe9, 0x2, - 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+6709 "有" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x15, 0x55, - 0x58, 0xc5, 0x55, 0x5a, 0xc1, 0x1, 0x0, 0xc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, - 0x0, 0x40, 0x0, 0x0, 0x2, 0xe5, 0x55, 0x55, - 0xe0, 0x0, 0x0, 0x19, 0xc0, 0x0, 0x0, 0xc0, - 0x0, 0x1, 0x80, 0xc5, 0x55, 0x55, 0xc0, 0x0, - 0x15, 0x0, 0xc0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0xd5, 0x55, 0x55, 0xc0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0x5c, 0x90, 0x0, 0x0, 0x0, 0x10, 0x0, 0x2, - 0x0, 0x0, - - /* U+670B "朋" */ - 0x0, 0x75, 0x59, 0x20, 0x85, 0x59, 0x20, 0xb, - 0x0, 0xb0, 0xb, 0x0, 0xb0, 0x0, 0xb0, 0xb, - 0x0, 0xb0, 0xb, 0x0, 0xc, 0x55, 0xc0, 0xc, - 0x55, 0xc0, 0x0, 0xb0, 0xb, 0x0, 0xb0, 0xb, - 0x0, 0xb, 0x0, 0xb0, 0xb, 0x0, 0xb0, 0x0, - 0xc5, 0x5c, 0x0, 0xc5, 0x5c, 0x0, 0xa, 0x0, - 0xb0, 0xa, 0x0, 0xb0, 0x0, 0xa0, 0xb, 0x3, - 0x70, 0xb, 0x0, 0x36, 0x0, 0xb0, 0x82, 0x0, - 0xb0, 0x7, 0x2, 0x6d, 0x18, 0x0, 0xc, 0x1, - 0x40, 0x4, 0x66, 0x0, 0x4c, 0xd0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x10, 0x0, - - /* U+670D "服" */ - 0x0, 0x95, 0x5a, 0x9, 0x55, 0x5a, 0x10, 0x0, - 0xb0, 0xb, 0xb, 0x0, 0xc, 0x0, 0x0, 0xb0, - 0xb, 0xb, 0x0, 0xc, 0x0, 0x0, 0xc5, 0x5b, - 0xb, 0x4, 0x89, 0x0, 0x0, 0xb0, 0xb, 0xb, - 0x0, 0x51, 0x0, 0x0, 0xb0, 0xb, 0xc, 0x65, - 0x5a, 0x50, 0x0, 0xc5, 0x5b, 0xb, 0x42, 0xc, - 0x0, 0x0, 0xb0, 0xb, 0xb, 0x7, 0x29, 0x0, - 0x0, 0xa0, 0xb, 0xb, 0x6, 0xb2, 0x0, 0x4, - 0x60, 0xb, 0xb, 0x4, 0xd1, 0x0, 0x8, 0x2, - 0x1b, 0xb, 0x37, 0x1c, 0x61, 0x14, 0x1, 0xc7, - 0xd, 0x30, 0x1, 0x71, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, - - /* U+671B "望" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x10, 0x8, 0x55, 0x59, 0x10, 0x0, 0x5, - 0x14, 0xc, 0x0, 0xb, 0x0, 0x16, 0xb5, 0x57, - 0x2d, 0x55, 0x5c, 0x0, 0x0, 0xb0, 0x0, 0xc, - 0x0, 0xb, 0x0, 0x0, 0xb0, 0x25, 0x3c, 0x55, - 0x5c, 0x0, 0x0, 0xca, 0x60, 0x75, 0x2, 0x3c, - 0x0, 0x0, 0x40, 0x3, 0x60, 0x0, 0x67, 0x0, - 0x3, 0x65, 0x57, 0x75, 0x55, 0x6b, 0x10, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x10, 0x0, 0x0, 0x46, - 0x55, 0xd5, 0x56, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x15, 0x55, 0x55, 0xd5, - 0x55, 0x5b, 0x90, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+671D "朝" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x42, 0x22, 0x70, 0x4, 0x55, - 0xc5, 0x75, 0x93, 0x22, 0xc0, 0x0, 0x0, 0xb0, - 0x0, 0x91, 0x0, 0xb0, 0x0, 0xa5, 0x95, 0xc0, - 0x93, 0x11, 0xb0, 0x0, 0xb0, 0x0, 0xb0, 0x94, - 0x33, 0xb0, 0x0, 0xc5, 0x55, 0xb0, 0x91, 0x0, - 0xb0, 0x0, 0xb0, 0x0, 0xb0, 0xa1, 0x0, 0xb0, - 0x0, 0xc5, 0xc5, 0x90, 0xb5, 0x55, 0xb0, 0x0, - 0x0, 0xb0, 0x31, 0xb0, 0x0, 0xb0, 0x16, 0x55, - 0xc5, 0x55, 0x80, 0x0, 0xb0, 0x0, 0x0, 0xb0, - 0x8, 0x10, 0x0, 0xb0, 0x0, 0x0, 0xc0, 0x43, - 0x0, 0x4c, 0x80, 0x0, 0x0, 0x20, 0x10, 0x0, - 0x1, 0x0, - - /* U+671F "期" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0x0, 0xd0, 0x16, 0x44, 0x81, 0x0, 0x1a, - 0x0, 0xc5, 0x1b, 0x11, 0xc0, 0x3, 0x6c, 0x55, - 0xd5, 0x3b, 0x0, 0xc0, 0x0, 0x1c, 0x55, 0xc0, - 0x1c, 0x55, 0xc0, 0x0, 0x1a, 0x0, 0xc0, 0x1a, - 0x0, 0xc0, 0x0, 0x1c, 0x55, 0xc0, 0x1a, 0x0, - 0xc0, 0x0, 0x1a, 0x0, 0xc0, 0x2b, 0x22, 0xc0, - 0x3, 0x6c, 0x55, 0xda, 0x5a, 0x33, 0xc0, 0x0, - 0x6, 0x13, 0x0, 0x66, 0x0, 0xc0, 0x0, 0x2c, - 0x24, 0xa0, 0xb1, 0x0, 0xc0, 0x0, 0xa1, 0x0, - 0x75, 0x60, 0x10, 0xc0, 0x6, 0x0, 0x0, 0x35, - 0x0, 0x2b, 0xa0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+6728 "木" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc1, 0x0, 0x3, 0x0, 0x7, 0x55, 0x57, 0xe7, - 0x55, 0x5b, 0x50, 0x0, 0x0, 0xb, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2b, 0xc3, 0x60, 0x0, - 0x0, 0x0, 0x0, 0xb3, 0xc1, 0xa1, 0x0, 0x0, - 0x0, 0x6, 0x70, 0xc1, 0x3b, 0x0, 0x0, 0x0, - 0x48, 0x0, 0xc1, 0x6, 0xd3, 0x0, 0x3, 0x70, - 0x0, 0xc1, 0x0, 0x7f, 0xa0, 0x23, 0x0, 0x0, - 0xc1, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+672A "未" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x50, 0x0, 0x0, 0x46, 0x55, - 0xc7, 0x56, 0x71, 0x0, 0x0, 0x0, 0x0, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, - 0x5, 0x0, 0x6, 0x55, 0x58, 0xf9, 0x55, 0x58, - 0x40, 0x0, 0x0, 0xc, 0xd5, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x86, 0xa2, 0x81, 0x0, 0x0, 0x0, - 0x6, 0x70, 0xa2, 0x1c, 0x20, 0x0, 0x0, 0x65, - 0x0, 0xa2, 0x2, 0xe8, 0x10, 0x16, 0x20, 0x0, - 0xa3, 0x0, 0x2c, 0x80, 0x0, 0x0, 0x0, 0xb3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+672B "末" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x5, 0x0, 0x7, 0x55, 0x55, - 0xc7, 0x55, 0x58, 0x40, 0x0, 0x0, 0x0, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, - 0x80, 0x0, 0x0, 0x55, 0x5a, 0xfa, 0x55, 0x52, - 0x0, 0x0, 0x0, 0x1c, 0xb4, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xb3, 0xa2, 0x74, 0x0, 0x0, 0x0, - 0x9, 0x40, 0xa2, 0xb, 0x60, 0x0, 0x0, 0x83, - 0x0, 0xa2, 0x0, 0xcc, 0x60, 0x26, 0x10, 0x0, - 0xa3, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0xb3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+672C "本" */ - 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0x0, 0x0, 0x0, 0x2, 0x55, 0x55, - 0x6c, 0x55, 0x58, 0xb0, 0x0, 0x10, 0x0, 0xea, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x6, 0xaa, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0x3a, 0x18, 0x0, - 0x0, 0x0, 0x0, 0xa3, 0x2a, 0x7, 0x50, 0x0, - 0x0, 0x7, 0x50, 0x2a, 0x0, 0xb7, 0x0, 0x0, - 0x66, 0x55, 0x6c, 0x59, 0x7c, 0xd3, 0x5, 0x20, - 0x0, 0x2a, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x0, - - /* U+672D "札" */ - 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xc0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x3, - 0xa0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xa0, - 0x60, 0xd0, 0x0, 0x0, 0x6, 0x57, 0xc5, 0x50, - 0xd0, 0x0, 0x0, 0x0, 0x7, 0xb0, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0xc, 0xca, 0x30, 0xd0, 0x0, - 0x0, 0x0, 0x3a, 0xa3, 0xe0, 0xd0, 0x0, 0x0, - 0x0, 0x93, 0xa0, 0x30, 0xd0, 0x0, 0x0, 0x3, - 0x42, 0xa0, 0x0, 0xd0, 0x0, 0x30, 0x4, 0x2, - 0xa0, 0x0, 0xd0, 0x0, 0x60, 0x0, 0x3, 0xa0, - 0x0, 0xc0, 0x0, 0xa2, 0x0, 0x3, 0xa0, 0x0, - 0x9c, 0xaa, 0xd3, 0x0, 0x1, 0x30, 0x0, 0x0, - 0x0, 0x0, - - /* U+673A "机" */ - 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x2, 0x0, 0x40, 0x0, 0x0, 0xc, - 0x0, 0x1c, 0x55, 0xd1, 0x0, 0x0, 0xc, 0x4, - 0x1b, 0x0, 0xc0, 0x0, 0x5, 0x6e, 0x55, 0x1b, - 0x0, 0xc0, 0x0, 0x0, 0x4d, 0x0, 0x1b, 0x0, - 0xc0, 0x0, 0x0, 0x8d, 0x94, 0x1b, 0x0, 0xc0, - 0x0, 0x0, 0xac, 0xc, 0x1a, 0x0, 0xc0, 0x0, - 0x3, 0x5c, 0x0, 0x29, 0x0, 0xc0, 0x0, 0x7, - 0xc, 0x0, 0x56, 0x0, 0xc0, 0x0, 0x22, 0xc, - 0x0, 0xa1, 0x0, 0xc0, 0x50, 0x0, 0xc, 0x2, - 0x70, 0x0, 0xc0, 0x70, 0x0, 0xd, 0x7, 0x0, - 0x0, 0xba, 0xd3, 0x0, 0x8, 0x30, 0x0, 0x0, - 0x0, 0x0, - - /* U+6750 "材" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0xd, 0x30, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, 0x6, - 0x0, 0x0, 0xd1, 0x60, 0x35, 0x5e, 0x55, 0x24, - 0x46, 0xf4, 0x40, 0x0, 0x1f, 0x50, 0x0, 0x9, - 0xf0, 0x0, 0x0, 0x7f, 0x4b, 0x0, 0x2c, 0xd0, - 0x0, 0x0, 0xbc, 0x9, 0x10, 0xa2, 0xd0, 0x0, - 0x5, 0x5c, 0x0, 0x7, 0x50, 0xd0, 0x0, 0x7, - 0xc, 0x0, 0x55, 0x0, 0xd0, 0x0, 0x40, 0xc, - 0x3, 0x20, 0x0, 0xd0, 0x0, 0x0, 0xc, 0x10, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, 0x10, 0x0, - 0x5c, 0xd0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x1, - 0x10, 0x0, - - /* U+6751 "村" */ - 0x0, 0x4, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, - 0xd, 0x20, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x5, - 0x0, 0x0, 0xd1, 0x40, 0x25, 0x5f, 0x55, 0x25, - 0x55, 0xe5, 0x40, 0x0, 0x4f, 0x20, 0x3, 0x0, - 0xd0, 0x0, 0x0, 0x8f, 0x69, 0x6, 0x60, 0xd0, - 0x0, 0x0, 0x9d, 0xb, 0x10, 0xe0, 0xd0, 0x0, - 0x6, 0x3d, 0x0, 0x0, 0x40, 0xd0, 0x0, 0x6, - 0xd, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x30, 0xd, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x5c, 0xe0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x2, - 0x10, 0x0, - - /* U+675F "束" */ - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x0, 0x0, 0x10, 0x5, 0x65, - 0x55, 0x5d, 0x55, 0x55, 0xb4, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x29, 0x55, 0x5d, - 0x55, 0x6b, 0x0, 0x0, 0x1b, 0x0, 0xc, 0x0, - 0x2a, 0x0, 0x0, 0x1b, 0x0, 0xc, 0x0, 0x2a, - 0x0, 0x0, 0x1c, 0x55, 0x8d, 0x65, 0x7a, 0x0, - 0x0, 0x28, 0x5, 0xbc, 0x60, 0x13, 0x0, 0x0, - 0x0, 0x2c, 0x1c, 0x18, 0x0, 0x0, 0x0, 0x2, - 0xb1, 0xc, 0x4, 0xa2, 0x0, 0x0, 0x49, 0x0, - 0x1c, 0x0, 0x4e, 0xa3, 0x5, 0x40, 0x0, 0x1c, - 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+6761 "条" */ - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4c, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, - 0xb8, 0x55, 0x5c, 0xb0, 0x0, 0x0, 0x7, 0x35, - 0x10, 0x4d, 0x0, 0x0, 0x0, 0x44, 0x0, 0x95, - 0xc2, 0x0, 0x0, 0x1, 0x20, 0x0, 0x9f, 0x70, - 0x0, 0x0, 0x0, 0x2, 0x79, 0x47, 0x9d, 0xa7, - 0x63, 0x4, 0x54, 0x0, 0xe, 0x0, 0x58, 0x70, - 0x0, 0x17, 0x55, 0x5e, 0x55, 0x96, 0x0, 0x0, - 0x0, 0x54, 0xd, 0x21, 0x0, 0x0, 0x0, 0x2, - 0xd3, 0xd, 0x7, 0x80, 0x0, 0x0, 0x2a, 0x10, - 0xd, 0x0, 0x8c, 0x0, 0x3, 0x50, 0x5, 0xda, - 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+6765 "来" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x17, 0x0, 0x2, 0x66, 0x55, - 0xc7, 0x55, 0x75, 0x10, 0x0, 0x8, 0x60, 0xa2, - 0x7, 0xa0, 0x0, 0x0, 0x0, 0xe0, 0xa2, 0x1a, - 0x0, 0x0, 0x25, 0x55, 0x75, 0xc7, 0x95, 0x5a, - 0x90, 0x1, 0x0, 0x8, 0xf6, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x2b, 0xa2, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0xa2, 0x3a, 0x0, 0x0, 0x0, 0xa, - 0x20, 0xa2, 0x5, 0xc3, 0x0, 0x1, 0x81, 0x0, - 0xa3, 0x0, 0x4e, 0xa0, 0x24, 0x0, 0x0, 0xb3, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+676F "杯" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc2, 0x0, 0x0, 0x0, 0x42, 0x0, 0xb, 0x4, - 0x55, 0x9a, 0x55, 0x30, 0x0, 0xb0, 0x40, 0xa, - 0x20, 0x0, 0x15, 0x5d, 0x56, 0x0, 0xb0, 0x0, - 0x0, 0x1, 0xf4, 0x0, 0x7d, 0x20, 0x0, 0x0, - 0x7f, 0x68, 0xb, 0xb0, 0x30, 0x0, 0x9, 0xb0, - 0xa8, 0x2b, 0x2, 0x90, 0x6, 0x2b, 0x3, 0x50, - 0xb0, 0x7, 0xa2, 0x40, 0xb2, 0x50, 0xb, 0x0, - 0x5, 0x20, 0xb, 0x10, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0xb1, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc, - 0x10, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x2, 0x0, 0x0, - - /* U+6771 "東" */ - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0x2, 0x10, 0x3, 0x65, - 0x55, 0x5c, 0x55, 0x59, 0x80, 0x0, 0x2, 0x0, - 0x1b, 0x0, 0x40, 0x0, 0x0, 0xd, 0x55, 0x5c, - 0x55, 0xd3, 0x0, 0x0, 0xc, 0x0, 0x1b, 0x0, - 0xc0, 0x0, 0x0, 0xd, 0x55, 0x5c, 0x55, 0xd0, - 0x0, 0x0, 0xd, 0x55, 0x6c, 0x55, 0xd0, 0x0, - 0x0, 0x7, 0x3, 0xdb, 0x50, 0x40, 0x0, 0x0, - 0x0, 0xc, 0x3b, 0x44, 0x0, 0x0, 0x0, 0x0, - 0xa3, 0x1b, 0x9, 0x50, 0x0, 0x0, 0x9, 0x30, - 0x1b, 0x0, 0xac, 0x51, 0x4, 0x60, 0x0, 0x1b, - 0x0, 0x5, 0xa2, 0x1, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+6790 "析" */ - 0x0, 0x5, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0xd, 0x0, 0x24, 0x46, 0x9a, 0x40, 0x0, 0xc, - 0x0, 0x39, 0x0, 0x0, 0x0, 0x5, 0x5d, 0x69, - 0x39, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x39, - 0x0, 0x0, 0x10, 0x0, 0x5e, 0x10, 0x3b, 0x55, - 0x85, 0xb2, 0x0, 0xac, 0xa4, 0x38, 0x0, 0xc0, - 0x0, 0x0, 0x9c, 0x28, 0x48, 0x0, 0xc0, 0x0, - 0x6, 0x2c, 0x0, 0x56, 0x0, 0xc0, 0x0, 0x5, - 0xc, 0x0, 0x83, 0x0, 0xc0, 0x0, 0x0, 0xc, - 0x0, 0xb0, 0x0, 0xc0, 0x0, 0x0, 0xd, 0x6, - 0x40, 0x0, 0xc0, 0x0, 0x0, 0xd, 0x25, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, - 0x10, 0x0, - - /* U+6797 "林" */ - 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0xb, 0x30, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xa, - 0x10, 0x0, 0xb1, 0x0, 0x0, 0x0, 0xa, 0x33, - 0x0, 0xb1, 0x18, 0x0, 0x5, 0x5d, 0x64, 0x34, - 0xf8, 0x44, 0x10, 0x0, 0xf, 0x20, 0x5, 0xf7, - 0x0, 0x0, 0x0, 0x5f, 0x94, 0xa, 0xc7, 0x10, - 0x0, 0x0, 0xab, 0x2c, 0x27, 0xb2, 0x90, 0x0, - 0x4, 0x5a, 0x11, 0x80, 0xb1, 0x94, 0x0, 0x6, - 0xa, 0x15, 0x20, 0xb1, 0x1e, 0x60, 0x20, 0xa, - 0x33, 0x0, 0xb1, 0x3, 0x30, 0x0, 0xa, 0x10, - 0x0, 0xb1, 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, - 0xb1, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x40, - 0x0, 0x0, - - /* U+679C "果" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x55, 0x59, 0x55, 0xc3, 0x0, 0x0, 0xc, - 0x0, 0x1b, 0x0, 0xc0, 0x0, 0x0, 0xd, 0x55, - 0x6c, 0x55, 0xd0, 0x0, 0x0, 0xc, 0x0, 0x1b, - 0x0, 0xc0, 0x0, 0x0, 0xd, 0x55, 0x6c, 0x55, - 0xd0, 0x0, 0x0, 0x9, 0x0, 0x1b, 0x0, 0x70, - 0x0, 0x3, 0x55, 0x55, 0x6c, 0x55, 0x5b, 0xb1, - 0x1, 0x0, 0x4, 0xcd, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x3c, 0x2b, 0x74, 0x0, 0x0, 0x0, 0x3, - 0xa0, 0x1b, 0xb, 0x80, 0x0, 0x0, 0x66, 0x0, - 0x2b, 0x0, 0x9e, 0x92, 0x5, 0x10, 0x0, 0x2b, - 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+67D0 "某" */ - 0x0, 0x0, 0x20, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0xd, 0x0, 0x0, 0x5, 0x55, - 0xd5, 0x55, 0x5d, 0x5a, 0x50, 0x0, 0x0, 0xc0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x55, - 0x5c, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x0, 0xd5, 0x85, 0x5c, 0x0, - 0x0, 0x0, 0x0, 0x10, 0xa1, 0x0, 0x3, 0x30, - 0x7, 0x55, 0x5b, 0xe9, 0x55, 0x56, 0x60, 0x0, - 0x0, 0x39, 0xa3, 0x60, 0x0, 0x0, 0x0, 0x2, - 0xa0, 0xa1, 0x58, 0x0, 0x0, 0x0, 0x48, 0x0, - 0xa2, 0x4, 0xd8, 0x40, 0x15, 0x30, 0x0, 0xb2, - 0x0, 0x19, 0x60, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+67E5 "查" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x20, 0x0, 0x10, 0x6, 0x55, 0x57, - 0xe6, 0x55, 0x59, 0x40, 0x0, 0x1, 0xbd, 0x25, - 0x0, 0x0, 0x0, 0x1, 0xa2, 0xc0, 0x57, 0x0, - 0x0, 0x2, 0x91, 0xb, 0x0, 0x4c, 0x72, 0x5, - 0x49, 0x65, 0x55, 0x56, 0xc7, 0x41, 0x0, 0xa2, - 0x0, 0x0, 0x29, 0x0, 0x0, 0x9, 0x65, 0x55, - 0x56, 0x90, 0x0, 0x0, 0x92, 0x0, 0x0, 0x29, - 0x0, 0x0, 0xa, 0x65, 0x55, 0x56, 0xa0, 0x0, - 0x0, 0x91, 0x0, 0x0, 0x15, 0x10, 0x4, 0x55, - 0x55, 0x55, 0x55, 0x5e, 0x30, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+67F1 "柱" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x4b, 0x0, 0x0, 0x0, 0xc, 0x13, - 0x23, 0x36, 0x34, 0xb1, 0x6, 0x5d, 0x55, 0x22, - 0x1c, 0x11, 0x10, 0x0, 0x3d, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x8d, 0xa3, 0x0, 0xc, 0x0, - 0x0, 0x0, 0xac, 0x3a, 0x35, 0x5d, 0x59, 0x80, - 0x5, 0x4c, 0x0, 0x10, 0xc, 0x0, 0x0, 0x6, - 0xc, 0x0, 0x0, 0xc, 0x0, 0x0, 0x10, 0xc, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xc, 0x0, 0x30, 0x0, 0xd, 0x5, 0x55, - 0x58, 0x56, 0x92, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+67FB "査" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x2, 0x80, 0x4, 0x65, 0x55, - 0xdd, 0x95, 0x55, 0x51, 0x0, 0x0, 0x9, 0x6c, - 0x37, 0x0, 0x0, 0x0, 0x0, 0x95, 0xc, 0x4, - 0xb4, 0x0, 0x0, 0x58, 0x20, 0xa, 0x0, 0x4a, - 0xe6, 0x4, 0x11, 0xc5, 0x55, 0x55, 0xe0, 0x10, - 0x0, 0x1, 0xb0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x1, 0xc5, 0x55, 0x55, 0xc0, 0x0, 0x0, 0x1, - 0xc5, 0x55, 0x55, 0xc0, 0x0, 0x0, 0x1, 0xb0, - 0x0, 0x0, 0xc0, 0x10, 0x5, 0x55, 0xc5, 0x55, - 0x55, 0xd6, 0xf5, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+67FF "柿" */ - 0x0, 0x2, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0xe, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x2b, 0x0, 0x10, 0x0, 0xc, 0x14, - 0x65, 0x58, 0x55, 0xb2, 0x5, 0x5d, 0x65, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x4d, 0x0, 0x75, 0x5d, - 0x55, 0x80, 0x0, 0x9d, 0xb3, 0xc0, 0xc, 0x2, - 0xa0, 0x0, 0x9c, 0x35, 0xc0, 0xc, 0x2, 0xa0, - 0x5, 0x3c, 0x0, 0xc0, 0xc, 0x2, 0xa0, 0x6, - 0xc, 0x0, 0xc0, 0xc, 0x2, 0xa0, 0x10, 0xc, - 0x0, 0xc0, 0xc, 0x2a, 0x80, 0x0, 0xd, 0x0, - 0x20, 0xc, 0x2, 0x0, 0x0, 0xd, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+6811 "树" */ - 0x0, 0x4, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0xc, - 0x4, 0x55, 0x91, 0xc, 0x0, 0x0, 0xc, 0x22, - 0x0, 0xc0, 0xc, 0x41, 0x5, 0x5d, 0x66, 0x3, - 0x95, 0x5d, 0x53, 0x0, 0x3d, 0x0, 0x57, 0x40, - 0xc, 0x0, 0x0, 0x7d, 0xa2, 0x6c, 0x53, 0xc, - 0x0, 0x0, 0xac, 0x28, 0x4d, 0xc, 0xc, 0x0, - 0x3, 0x4c, 0x0, 0xa8, 0x58, 0xc, 0x0, 0x6, - 0xc, 0x5, 0x33, 0x90, 0xc, 0x0, 0x10, 0xc, - 0x24, 0x0, 0x20, 0xc, 0x0, 0x0, 0xc, 0x10, - 0x0, 0x11, 0x1c, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x6, 0xe9, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x20, 0x0, - - /* U+6821 "校" */ - 0x0, 0x1, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, - 0xe, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x56, 0x0, 0x40, 0x0, 0xc, 0x15, - 0x65, 0x55, 0x56, 0x81, 0x5, 0x5e, 0x54, 0x8, - 0x61, 0x61, 0x0, 0x0, 0x4e, 0x60, 0x2b, 0x0, - 0x2d, 0x40, 0x0, 0x9d, 0x86, 0x80, 0x0, 0x34, - 0x90, 0x0, 0x9c, 0x4, 0x4, 0x0, 0xd5, 0x0, - 0x5, 0x3c, 0x0, 0x5, 0x3, 0xb0, 0x0, 0x6, - 0xc, 0x0, 0x1, 0x6b, 0x20, 0x0, 0x10, 0xc, - 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x6, 0x7a, 0x91, 0x0, 0x0, 0xd, 0x4, 0x72, - 0x0, 0x5d, 0xc3, 0x0, 0x3, 0x21, 0x0, 0x0, - 0x0, 0x20, - - /* U+682A "株" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0x10, 0x1, 0xd, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x3c, 0xc, 0x0, 0x0, 0x0, 0xc, 0x23, - 0x7a, 0x5d, 0x59, 0x60, 0x6, 0x6d, 0x54, 0xa0, - 0xc, 0x0, 0x0, 0x0, 0x4d, 0x1, 0x20, 0xc, - 0x0, 0x10, 0x0, 0x9d, 0xb5, 0x65, 0x8d, 0x65, - 0x94, 0x0, 0x9c, 0x34, 0x1, 0xdc, 0x50, 0x0, - 0x6, 0x2c, 0x0, 0x9, 0x4c, 0x71, 0x0, 0x5, - 0xc, 0x0, 0x38, 0xc, 0x1a, 0x0, 0x0, 0xc, - 0x1, 0x80, 0xc, 0x6, 0xb2, 0x0, 0xd, 0x16, - 0x0, 0xc, 0x0, 0x84, 0x0, 0xd, 0x10, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+6839 "根" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0x0, 0x85, 0x55, 0x5c, 0x10, 0x0, 0xc, - 0x0, 0xc0, 0x0, 0xc, 0x0, 0x1, 0x1c, 0x24, - 0xc0, 0x0, 0xc, 0x0, 0x4, 0x4d, 0x33, 0xc5, - 0x55, 0x5c, 0x0, 0x0, 0x4d, 0x10, 0xc0, 0x0, - 0xc, 0x0, 0x0, 0x9c, 0xa3, 0xc5, 0x65, 0x5c, - 0x0, 0x0, 0x9c, 0x37, 0xc0, 0x60, 0x7, 0x70, - 0x5, 0x2c, 0x0, 0xc0, 0x61, 0x68, 0x10, 0x5, - 0xc, 0x0, 0xc0, 0x1b, 0x10, 0x0, 0x0, 0xc, - 0x0, 0xc0, 0x8, 0x50, 0x0, 0x0, 0xd, 0x0, - 0xc2, 0x61, 0xb9, 0x10, 0x0, 0xd, 0x0, 0xd9, - 0x0, 0x9, 0xd3, 0x0, 0x2, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+683C "格" */ - 0x0, 0x3, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, - 0xd, 0x0, 0xc, 0x50, 0x0, 0x0, 0x0, 0xb, - 0x0, 0x2d, 0x55, 0x5a, 0x0, 0x0, 0xb, 0x23, - 0x87, 0x0, 0x85, 0x0, 0x5, 0x6d, 0x56, 0x43, - 0x53, 0xa0, 0x0, 0x0, 0x4d, 0x3, 0x0, 0x9c, - 0x10, 0x0, 0x0, 0x9c, 0xa2, 0x2, 0xbb, 0x40, - 0x0, 0x0, 0x8b, 0x25, 0x47, 0x0, 0x9c, 0x72, - 0x5, 0x2b, 0x24, 0x95, 0x55, 0x5b, 0x60, 0x5, - 0xb, 0x0, 0xa1, 0x0, 0x29, 0x0, 0x0, 0xb, - 0x0, 0xa1, 0x0, 0x29, 0x0, 0x0, 0xc, 0x0, - 0xa1, 0x0, 0x29, 0x0, 0x0, 0xc, 0x0, 0xa6, - 0x55, 0x6a, 0x0, 0x0, 0x4, 0x0, 0x30, 0x0, - 0x2, 0x0, - - /* U+6843 "桃" */ - 0x0, 0x2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x9, 0x4a, 0x40, 0x0, 0x0, 0xb, - 0x0, 0x9, 0x29, 0x10, 0x0, 0x0, 0xb, 0x32, - 0x9, 0x29, 0x13, 0x30, 0x5, 0x5d, 0x53, 0x79, - 0x29, 0x2b, 0x40, 0x0, 0x4d, 0x0, 0xc9, 0x29, - 0x71, 0x0, 0x0, 0x8c, 0xa2, 0x29, 0x29, 0x10, - 0x0, 0x0, 0xab, 0x36, 0xb, 0x29, 0x84, 0x0, - 0x4, 0x4b, 0x3, 0x9b, 0x19, 0x2b, 0x40, 0x7, - 0xb, 0xa, 0xb, 0x9, 0x10, 0x20, 0x11, 0xb, - 0x0, 0x29, 0x9, 0x10, 0x40, 0x0, 0xc, 0x0, - 0x91, 0x9, 0x20, 0x80, 0x0, 0xc, 0x6, 0x30, - 0x6, 0xca, 0xd2, 0x0, 0x6, 0x21, 0x0, 0x0, - 0x0, 0x0, - - /* U+6848 "案" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x75, - 0x55, 0x86, 0x55, 0x5a, 0x60, 0x3, 0xb0, 0x4, - 0xa0, 0x0, 0x9, 0x0, 0x1, 0x55, 0x5c, 0x55, - 0x58, 0x59, 0x60, 0x0, 0x0, 0x94, 0x0, 0xa4, - 0x0, 0x0, 0x0, 0x0, 0x14, 0x7d, 0xc6, 0x10, - 0x0, 0x0, 0x1, 0x57, 0x83, 0x6, 0xd4, 0x0, - 0x0, 0x32, 0x0, 0x2c, 0x0, 0x3, 0x70, 0x3, - 0x55, 0x57, 0xdc, 0x85, 0x55, 0x61, 0x0, 0x0, - 0x2b, 0x3a, 0x56, 0x0, 0x0, 0x0, 0x5, 0x80, - 0x2a, 0x5, 0xb7, 0x30, 0x4, 0x62, 0x0, 0x2b, - 0x0, 0x18, 0xb2, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, - - /* U+689D "條" */ - 0x0, 0x3, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, - 0x1f, 0x20, 0x6, 0xb0, 0x0, 0x0, 0x0, 0x58, - 0x0, 0xc, 0x75, 0x5a, 0x10, 0x0, 0xb1, 0x50, - 0x39, 0x50, 0x78, 0x0, 0x3, 0xf1, 0xc0, 0x80, - 0x87, 0x90, 0x0, 0x8, 0xb0, 0xb1, 0x0, 0x8d, - 0x60, 0x0, 0x41, 0xb0, 0xb0, 0x28, 0x41, 0x8d, - 0x92, 0x0, 0xb0, 0xb3, 0x30, 0x1c, 0x1, 0x40, - 0x0, 0xb0, 0xb4, 0x65, 0x6b, 0x57, 0x80, 0x0, - 0xb0, 0xc0, 0x14, 0x1a, 0x10, 0x0, 0x0, 0xb0, - 0x70, 0xa7, 0x1a, 0x2a, 0x20, 0x0, 0xb0, 0x5, - 0x60, 0x1a, 0x3, 0xd0, 0x0, 0xb0, 0x23, 0x5, - 0xd8, 0x0, 0x40, 0x0, 0x20, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+68B0 "械" */ - 0x0, 0x10, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0xa4, 0x0, 0x0, 0xd, 0x28, 0x0, 0x0, 0x92, - 0x0, 0x0, 0xb, 0x6, 0x30, 0x0, 0x93, 0x34, - 0x44, 0x4c, 0x45, 0x90, 0x36, 0xc6, 0x44, 0x12, - 0xb, 0x0, 0x0, 0x0, 0xd8, 0x19, 0x2c, 0xb, - 0x3, 0x50, 0x1, 0xf5, 0xa9, 0x1a, 0xa, 0x8, - 0x50, 0x6, 0xb2, 0x7b, 0x5c, 0x8b, 0xc, 0x0, - 0x7, 0x92, 0xa, 0xa, 0x8, 0x86, 0x0, 0x41, - 0x92, 0xa, 0xa, 0x5, 0xd0, 0x10, 0x0, 0x92, - 0x17, 0xb, 0x9, 0xc0, 0x50, 0x0, 0xa2, 0x60, - 0x8, 0x83, 0x4a, 0x80, 0x0, 0xa4, 0x30, 0x26, - 0x10, 0x6, 0xe0, 0x0, 0x30, 0x0, 0x20, 0x0, - 0x0, 0x10, - - /* U+68EE "森" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc2, 0x0, 0x2, 0x0, 0x5, 0x55, - 0x57, 0xe7, 0x55, 0x5b, 0x20, 0x0, 0x0, 0x2c, - 0xd3, 0x50, 0x0, 0x0, 0x0, 0x1, 0xb1, 0xc0, - 0x69, 0x10, 0x0, 0x0, 0x38, 0x0, 0xc0, 0x7, - 0xe9, 0x50, 0x4, 0x39, 0x30, 0xb0, 0xd, 0x17, - 0x20, 0x25, 0x5b, 0x69, 0x35, 0x5d, 0x58, 0x80, - 0x0, 0x1f, 0x20, 0x0, 0xdc, 0x50, 0x0, 0x0, - 0x9c, 0x88, 0x7, 0x7b, 0x81, 0x0, 0x4, 0x6a, - 0x16, 0x39, 0xb, 0x2c, 0x10, 0x25, 0xa, 0x23, - 0x60, 0xc, 0x6, 0xc1, 0x10, 0xa, 0x22, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x3, - 0x0, 0x0, - - /* U+690D "植" */ - 0x0, 0x6, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0xc, - 0x3, 0x55, 0xc5, 0x58, 0x90, 0x2, 0x2c, 0x73, - 0x0, 0xb0, 0x0, 0x0, 0x4, 0x4d, 0x31, 0x75, - 0xc5, 0x5a, 0x0, 0x0, 0x4d, 0x20, 0xb0, 0x0, - 0xb, 0x0, 0x0, 0x9c, 0xa4, 0xb5, 0x55, 0x5b, - 0x0, 0x0, 0x9c, 0x13, 0xb0, 0x0, 0xb, 0x0, - 0x5, 0x3c, 0x0, 0xb5, 0x55, 0x5b, 0x0, 0x5, - 0xc, 0x0, 0xb0, 0x0, 0xb, 0x0, 0x0, 0xc, - 0x0, 0xb5, 0x55, 0x5b, 0x0, 0x0, 0xc, 0x0, - 0xb0, 0x0, 0xb, 0x50, 0x0, 0xc, 0x36, 0x65, - 0x55, 0x56, 0x62, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+691C "検" */ - 0x0, 0x4, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, - 0xe, 0x0, 0x0, 0xb9, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x3, 0xb3, 0x50, 0x0, 0x1, 0x1c, 0x43, - 0x1a, 0x0, 0x6b, 0x30, 0x4, 0x4d, 0x34, 0x76, - 0x55, 0x87, 0xb3, 0x0, 0x4e, 0x22, 0x0, 0xb, - 0x0, 0x0, 0x0, 0x9d, 0xa5, 0xa5, 0x5c, 0x5c, - 0x30, 0x0, 0x9c, 0x14, 0xb0, 0xa, 0xb, 0x0, - 0x5, 0x3c, 0x0, 0xb5, 0x6b, 0x5c, 0x0, 0x5, - 0xc, 0x0, 0x70, 0x6b, 0x14, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xc1, 0xa0, 0x0, 0x0, 0xd, 0x0, - 0x9, 0x40, 0x4c, 0x30, 0x0, 0xd, 0x2, 0x72, - 0x0, 0x5, 0xc3, 0x0, 0x2, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+695A "楚" */ - 0x0, 0x0, 0x20, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0xc, 0x0, 0x0, 0x2, 0x55, - 0xc6, 0x83, 0x5c, 0x59, 0x30, 0x0, 0x4, 0xf2, - 0x0, 0x7e, 0x0, 0x0, 0x0, 0xb, 0xc6, 0x72, - 0x9b, 0x77, 0x0, 0x0, 0x82, 0xc0, 0x48, 0xb, - 0xa, 0x20, 0x5, 0x20, 0xb0, 0x50, 0xb, 0x0, - 0x0, 0x1, 0x65, 0x55, 0x58, 0x55, 0x5e, 0x30, - 0x0, 0x0, 0x60, 0xb, 0x0, 0x42, 0x0, 0x0, - 0x5, 0xb0, 0xc, 0x55, 0x86, 0x0, 0x0, 0xc, - 0x70, 0xb, 0x0, 0x0, 0x0, 0x0, 0x73, 0x8, - 0x6b, 0x0, 0x0, 0x0, 0x4, 0x30, 0x0, 0x39, - 0xbc, 0xce, 0xb1, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+696D "業" */ - 0x0, 0x0, 0x4, 0x0, 0x50, 0x0, 0x0, 0x0, - 0x76, 0xc, 0x10, 0xc0, 0xb2, 0x0, 0x0, 0xa, - 0x4b, 0x0, 0xb7, 0x30, 0x0, 0x4, 0x56, 0x6c, - 0x55, 0xd5, 0x56, 0xb0, 0x1, 0x0, 0x63, 0x0, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x60, - 0x35, 0x0, 0x0, 0x45, 0x55, 0xa7, 0x55, 0x55, - 0x0, 0x0, 0x15, 0x55, 0xb7, 0x55, 0xb1, 0x0, - 0x0, 0x0, 0x0, 0x82, 0x0, 0x3, 0x10, 0x4, - 0x55, 0x58, 0xe9, 0x65, 0x56, 0x50, 0x0, 0x0, - 0x3b, 0xa3, 0x92, 0x0, 0x0, 0x0, 0x7, 0x80, - 0x92, 0xa, 0xa5, 0x20, 0x4, 0x72, 0x0, 0x93, - 0x0, 0x4b, 0xc2, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x0, - - /* U+6975 "極" */ - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0xb, - 0x0, 0x55, 0x55, 0xb8, 0x0, 0x3, 0x3c, 0x71, - 0x0, 0x18, 0x20, 0x0, 0x2, 0x2c, 0x26, 0x58, - 0x3a, 0x55, 0x81, 0x0, 0x3d, 0x38, 0x1a, 0x19, - 0x1, 0xb0, 0x0, 0x8c, 0x9d, 0x1a, 0x19, 0x56, - 0x60, 0x0, 0xab, 0x1c, 0x1a, 0x19, 0xe, 0x10, - 0x4, 0x5b, 0x8, 0x6c, 0x19, 0x1a, 0x90, 0x7, - 0xb, 0x9, 0x18, 0x19, 0x60, 0xb0, 0x10, 0xb, - 0x4, 0x3, 0x3a, 0x30, 0x0, 0x0, 0xc, 0x0, - 0x2, 0xc5, 0x0, 0x0, 0x0, 0xc, 0x25, 0x55, - 0x55, 0x55, 0xd2, 0x0, 0x5, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+697D "楽" */ - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x2, 0x71, - 0x1b, 0x66, 0x5b, 0x6, 0x80, 0x0, 0x3c, 0xb, - 0x0, 0x1a, 0x37, 0x0, 0x0, 0x1, 0xc, 0x55, - 0x6c, 0x20, 0x0, 0x0, 0x16, 0x4b, 0x0, 0x1b, - 0x7b, 0x40, 0x6, 0xa1, 0xc, 0x55, 0x6a, 0x2, - 0xa0, 0x0, 0x0, 0x5, 0xa, 0x14, 0x0, 0x20, - 0x5, 0x65, 0x55, 0x9d, 0x75, 0x57, 0x80, 0x0, - 0x0, 0x6, 0xbc, 0x71, 0x0, 0x0, 0x0, 0x0, - 0x69, 0xc, 0xa, 0x30, 0x0, 0x0, 0x18, 0x50, - 0xc, 0x1, 0xbb, 0x61, 0x5, 0x50, 0x0, 0xd, - 0x0, 0x4, 0x60, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x0, - - /* U+6982 "概" */ - 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0x5, 0x57, 0x24, 0x55, 0x93, 0x0, 0x9, - 0xa, 0x9, 0x0, 0xb, 0x0, 0x2, 0x3b, 0x7a, - 0x9, 0x8, 0x2a, 0x0, 0x2, 0x4a, 0x2a, 0x5b, - 0xb, 0x19, 0x0, 0x0, 0x6c, 0x2a, 0x9, 0x2a, - 0x28, 0x0, 0x0, 0xaa, 0xcc, 0x9, 0x79, 0x8a, - 0x95, 0x0, 0x99, 0x3c, 0x57, 0x0, 0x88, 0x0, - 0x6, 0x39, 0xa, 0x15, 0x0, 0xcb, 0x0, 0x6, - 0x19, 0xa, 0xa, 0x55, 0x7a, 0x0, 0x10, 0x19, - 0xb, 0x92, 0x4a, 0xa, 0x3, 0x0, 0x1a, 0x6, - 0x10, 0x92, 0xa, 0x6, 0x0, 0x1a, 0x0, 0x16, - 0x10, 0xa, 0xa9, 0x0, 0x3, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+69CB "構" */ - 0x0, 0x20, 0x0, 0x4, 0x0, 0x30, 0x0, 0x0, - 0x84, 0x0, 0xc, 0x0, 0xc1, 0x20, 0x0, 0x82, - 0x15, 0x5c, 0x55, 0xc6, 0x60, 0x0, 0x82, 0x44, - 0x5c, 0x55, 0xc9, 0x30, 0x25, 0xb6, 0x51, 0xa, - 0x0, 0xa0, 0x40, 0x0, 0xd9, 0x55, 0x56, 0x97, - 0x65, 0x60, 0x1, 0xf4, 0xa5, 0x55, 0xa8, 0x58, - 0x20, 0x6, 0xc2, 0x38, 0x20, 0x74, 0xa, 0x0, - 0x8, 0x82, 0x8, 0x65, 0xa8, 0x5b, 0x0, 0x32, - 0x82, 0x8, 0x20, 0x74, 0xa, 0x50, 0x10, 0x82, - 0x5b, 0x65, 0x55, 0x5b, 0x61, 0x0, 0x82, 0x8, - 0x20, 0x0, 0xa, 0x0, 0x0, 0x92, 0x9, 0x20, - 0x2, 0x8d, 0x0, 0x0, 0x10, 0x2, 0x0, 0x0, - 0x1, 0x0, - - /* U+69D8 "様" */ - 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x0, - 0xc, 0x0, 0x3, 0xb0, 0xb, 0x10, 0x0, 0xa, - 0x0, 0x45, 0xb5, 0x86, 0xb2, 0x0, 0xa, 0x23, - 0x0, 0xb, 0x0, 0x0, 0x5, 0x6c, 0x54, 0x25, - 0x5c, 0x57, 0x70, 0x0, 0x4d, 0x50, 0x0, 0xb, - 0x0, 0x10, 0x0, 0x8a, 0xa4, 0x65, 0x5b, 0x55, - 0x94, 0x0, 0xaa, 0x20, 0x0, 0xb, 0x20, 0x80, - 0x4, 0x4a, 0x4, 0x59, 0x7b, 0x47, 0x50, 0x6, - 0xa, 0x0, 0xa, 0x1b, 0x72, 0x0, 0x0, 0xa, - 0x0, 0x47, 0xb, 0xb, 0x0, 0x0, 0xb, 0x1, - 0x80, 0xb, 0x5, 0xc3, 0x0, 0xb, 0x25, 0x4, - 0xac, 0x0, 0x40, 0x0, 0x1, 0x0, 0x0, 0x11, - 0x0, 0x0, - - /* U+6A02 "樂" */ - 0x0, 0x21, 0x0, 0x32, 0x0, 0x30, 0x0, 0x0, - 0x86, 0x1, 0x72, 0x20, 0xa5, 0x0, 0x0, 0xa2, - 0x3a, 0x55, 0xc1, 0x83, 0x20, 0x7, 0x38, 0x7a, - 0x0, 0xa7, 0x2a, 0x40, 0x9, 0x7a, 0xa, 0x55, - 0xa9, 0x78, 0x0, 0x0, 0x73, 0xa, 0x0, 0xa0, - 0x83, 0x0, 0x6, 0x75, 0xaa, 0x55, 0xa6, 0x55, - 0xb0, 0x8, 0x62, 0xa4, 0x45, 0x3a, 0x62, 0x90, - 0x6, 0x55, 0x55, 0xaa, 0x55, 0x5a, 0x70, 0x0, - 0x0, 0xb, 0xb7, 0x60, 0x0, 0x0, 0x0, 0x1, - 0xa4, 0x66, 0x48, 0x0, 0x0, 0x0, 0x58, 0x10, - 0x66, 0x4, 0xd8, 0x50, 0x15, 0x20, 0x0, 0x66, - 0x0, 0x17, 0x70, 0x0, 0x0, 0x0, 0x21, 0x0, - 0x0, 0x0, - - /* U+6A19 "標" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x3, 0x65, 0x75, 0x75, 0xa2, 0x0, 0xa, - 0x0, 0x0, 0x90, 0x90, 0x0, 0x5, 0x5c, 0x86, - 0xa5, 0xb5, 0xb5, 0xa0, 0x0, 0x2b, 0x0, 0xa0, - 0x90, 0x92, 0x80, 0x0, 0x7d, 0x60, 0xc5, 0xb5, - 0xb6, 0x80, 0x0, 0xaa, 0x94, 0x70, 0x0, 0x2, - 0x20, 0x3, 0x5a, 0x10, 0x55, 0x55, 0x58, 0x20, - 0x6, 0xa, 0x4, 0x55, 0x55, 0x55, 0x85, 0x12, - 0xa, 0x1, 0x23, 0xb, 0x10, 0x0, 0x0, 0xb, - 0x0, 0xb5, 0xb, 0x38, 0x0, 0x0, 0xb, 0x8, - 0x20, 0xb, 0x4, 0xb0, 0x0, 0xb, 0x40, 0x5, - 0xb8, 0x0, 0x40, 0x0, 0x1, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+6A21 "模" */ - 0x0, 0x4, 0x0, 0x3, 0x0, 0x40, 0x0, 0x0, - 0xd, 0x0, 0xb, 0x20, 0xd0, 0x10, 0x0, 0xb, - 0x4, 0x5c, 0x55, 0xc5, 0xa1, 0x4, 0x4c, 0x85, - 0xa, 0x0, 0xa0, 0x0, 0x1, 0x3c, 0x10, 0x95, - 0x55, 0x5b, 0x10, 0x0, 0x6d, 0x20, 0xb0, 0x0, - 0xb, 0x0, 0x0, 0xab, 0xa4, 0xb5, 0x55, 0x5c, - 0x0, 0x1, 0x7b, 0x16, 0xb5, 0x55, 0x5c, 0x0, - 0x6, 0xb, 0x0, 0x60, 0x93, 0x5, 0x0, 0x12, - 0xb, 0x16, 0x55, 0xc7, 0x55, 0xb2, 0x0, 0xb, - 0x0, 0x1, 0xb4, 0x20, 0x0, 0x0, 0xc, 0x0, - 0xa, 0x30, 0xa5, 0x0, 0x0, 0xc, 0x2, 0x83, - 0x0, 0xa, 0xd3, 0x0, 0x2, 0x22, 0x0, 0x0, - 0x0, 0x0, - - /* U+6A23 "樣" */ - 0x0, 0x4, 0x0, 0x3, 0x0, 0x32, 0x0, 0x0, - 0xc, 0x0, 0x5, 0x80, 0x94, 0x0, 0x0, 0xb, - 0x2, 0x55, 0x7a, 0x57, 0x50, 0x5, 0x5c, 0x76, - 0x45, 0x5c, 0x59, 0x20, 0x0, 0x2c, 0x0, 0x0, - 0xa, 0x0, 0x10, 0x0, 0x6d, 0x53, 0x55, 0x69, - 0x55, 0x92, 0x0, 0xab, 0x85, 0x0, 0x3c, 0x0, - 0x0, 0x2, 0x7b, 0x13, 0x55, 0x5a, 0x0, 0x40, - 0x7, 0xb, 0x0, 0x2, 0xc, 0x19, 0x60, 0x12, - 0xb, 0x5, 0x5e, 0x5b, 0x91, 0x0, 0x0, 0xb, - 0x0, 0x79, 0xb, 0x38, 0x0, 0x0, 0xc, 0x4, - 0x90, 0xb, 0x7, 0xa2, 0x0, 0xc, 0x25, 0x5, - 0xbc, 0x0, 0x51, 0x0, 0x2, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+6A2A "横" */ - 0x0, 0x13, 0x0, 0x2, 0x1, 0x20, 0x0, 0x0, - 0x1b, 0x0, 0xa, 0x2, 0xb0, 0x0, 0x0, 0x19, - 0x3, 0x5b, 0x56, 0xb7, 0x50, 0x5, 0x6b, 0xa4, - 0x9, 0x2, 0x90, 0x0, 0x0, 0x59, 0x16, 0x58, - 0x86, 0x85, 0x91, 0x0, 0x8b, 0x0, 0x20, 0xa0, - 0x3, 0x0, 0x0, 0xba, 0xb2, 0xc4, 0xb5, 0x5c, - 0x20, 0x2, 0x89, 0x32, 0xa0, 0xa0, 0xa, 0x0, - 0x7, 0x29, 0x0, 0xc5, 0xb5, 0x5c, 0x0, 0x5, - 0x19, 0x0, 0xa0, 0xa0, 0xa, 0x0, 0x0, 0x19, - 0x0, 0xb8, 0x56, 0x57, 0x0, 0x0, 0x1a, 0x0, - 0x5b, 0x10, 0x76, 0x0, 0x0, 0x2a, 0x6, 0x60, - 0x0, 0x7, 0x80, 0x0, 0x13, 0x20, 0x0, 0x0, - 0x0, 0x30, - - /* U+6A39 "樹" */ - 0x0, 0x31, 0x0, 0x21, 0x0, 0x3, 0x0, 0x0, - 0x92, 0x0, 0x67, 0x0, 0xb, 0x0, 0x0, 0x92, - 0x25, 0x99, 0x83, 0xa, 0x0, 0x25, 0xb8, 0x70, - 0x66, 0x0, 0xa, 0x40, 0x0, 0xb2, 0x5, 0x77, - 0x84, 0x5c, 0x50, 0x0, 0xe4, 0x6, 0x55, 0x80, - 0xa, 0x0, 0x3, 0xf8, 0x7a, 0x0, 0xa6, 0x2a, - 0x0, 0x8, 0xa2, 0x4b, 0x55, 0xa1, 0xba, 0x0, - 0x16, 0x92, 0x6, 0x0, 0x90, 0x2a, 0x0, 0x40, - 0x92, 0x7, 0x13, 0x70, 0xa, 0x0, 0x0, 0x92, - 0x3, 0x47, 0x32, 0xa, 0x0, 0x0, 0x92, 0x6a, - 0x85, 0x10, 0xb, 0x0, 0x0, 0x92, 0x20, 0x0, - 0x2, 0xbb, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6A4B "橋" */ - 0x0, 0x30, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, - 0x94, 0x3, 0x57, 0xaa, 0x85, 0x0, 0x0, 0x92, - 0x0, 0x0, 0xc0, 0x1, 0x0, 0x25, 0xb8, 0x74, - 0x5b, 0x75, 0x86, 0x40, 0x0, 0xb2, 0x0, 0x76, - 0x0, 0x87, 0x10, 0x0, 0xe5, 0x17, 0x4b, 0x55, - 0xc5, 0xa1, 0x3, 0xf7, 0x80, 0xb, 0x55, 0xb0, - 0x0, 0x8, 0xa2, 0x33, 0x13, 0x0, 0x41, 0x40, - 0x17, 0x92, 0xc, 0x45, 0x44, 0x55, 0xb0, 0x50, - 0x92, 0xb, 0x9, 0x55, 0xc1, 0x90, 0x0, 0x92, - 0xb, 0x9, 0x55, 0xa1, 0x90, 0x0, 0x92, 0xb, - 0x4, 0x0, 0x31, 0x90, 0x0, 0x92, 0xb, 0x0, - 0x0, 0x6c, 0x60, 0x0, 0x10, 0x1, 0x0, 0x0, - 0x1, 0x0, - - /* U+6A5F "機" */ - 0x0, 0x41, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0xb0, 0xb2, 0x68, 0x0, 0x0, 0xa1, - 0x4, 0x36, 0xb0, 0x83, 0x20, 0x25, 0xc9, 0x6b, - 0x78, 0xb9, 0x8b, 0x40, 0x0, 0xc1, 0x1, 0x71, - 0xb1, 0x46, 0x0, 0x0, 0xf3, 0x5, 0x29, 0xb2, - 0x65, 0x60, 0x4, 0xf8, 0x6a, 0x57, 0xb7, 0x92, - 0x80, 0x9, 0xb1, 0x40, 0xb0, 0x91, 0x56, 0x20, - 0x26, 0xa1, 0x25, 0xc5, 0xa7, 0x57, 0x80, 0x40, - 0xa1, 0x0, 0xc0, 0x47, 0x2c, 0x0, 0x0, 0xa1, - 0x5, 0x5a, 0xb, 0xc2, 0x30, 0x0, 0xa1, 0x18, - 0x1, 0x78, 0xc4, 0x70, 0x0, 0xa3, 0x50, 0x5, - 0x10, 0x18, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6B21 "次" */ - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x2, - 0x40, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, 0xa6, - 0x10, 0x3a, 0x0, 0x0, 0x0, 0x0, 0x38, 0x40, - 0x88, 0x55, 0x57, 0x70, 0x0, 0x0, 0x50, 0xb0, - 0x40, 0xa, 0x60, 0x0, 0x5, 0x17, 0x20, 0xe2, - 0x24, 0x0, 0x0, 0x7, 0x25, 0x1, 0xb3, 0x0, - 0x0, 0x0, 0x44, 0x10, 0x3, 0x85, 0x0, 0x0, - 0x6, 0xd0, 0x0, 0x7, 0x47, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0xb, 0x4, 0x50, 0x0, 0x0, 0xe0, - 0x0, 0x74, 0x0, 0xb1, 0x0, 0x0, 0xf0, 0x5, - 0x50, 0x0, 0x3d, 0x30, 0x0, 0x21, 0x62, 0x0, - 0x0, 0x4, 0xb2, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6B32 "欲" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x55, 0x15, 0x0, 0x78, 0x0, 0x0, 0x0, 0xa1, - 0x7, 0x90, 0xb1, 0x0, 0x0, 0x7, 0x13, 0x50, - 0x40, 0xc5, 0x55, 0xa0, 0x10, 0xa, 0x70, 0x6, - 0x30, 0x5, 0x60, 0x0, 0x38, 0x3c, 0x46, 0xe, - 0x4, 0x0, 0x1, 0x90, 0x2, 0x80, 0x1c, 0x0, - 0x0, 0x6, 0x30, 0x4, 0x0, 0x39, 0x30, 0x0, - 0x10, 0xc5, 0x5d, 0x0, 0x65, 0x60, 0x0, 0x0, - 0xa0, 0xb, 0x0, 0xb0, 0x90, 0x0, 0x0, 0xa0, - 0xb, 0x3, 0x80, 0x74, 0x0, 0x0, 0xc5, 0x5c, - 0x19, 0x0, 0xd, 0x30, 0x0, 0x60, 0x4, 0x60, - 0x0, 0x4, 0xc2, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+6B4C "歌" */ - 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x16, - 0x55, 0x56, 0xa3, 0x79, 0x0, 0x0, 0x1, 0x0, - 0x18, 0x30, 0xb1, 0x0, 0x0, 0x4, 0xa5, 0xa8, - 0x31, 0xc5, 0x56, 0x70, 0x4, 0xa5, 0xa8, 0x36, - 0x14, 0x7, 0x40, 0x3, 0x40, 0x47, 0x43, 0xe, - 0x2, 0x0, 0x26, 0x55, 0x58, 0xa2, 0xf, 0x0, - 0x0, 0x2, 0x0, 0x3a, 0x10, 0x2a, 0x40, 0x0, - 0xb, 0x65, 0xba, 0x10, 0x67, 0x70, 0x0, 0xb, - 0x10, 0xaa, 0x10, 0x91, 0x80, 0x0, 0xb, 0x65, - 0x7a, 0x11, 0x90, 0x57, 0x0, 0x1, 0x0, 0x3b, - 0x18, 0x10, 0xd, 0x40, 0x0, 0x0, 0x4b, 0x62, - 0x0, 0x3, 0x90, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, - - /* U+6B50 "歐" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x9, - 0x55, 0x55, 0xa0, 0xc2, 0x0, 0x0, 0xa, 0x3, - 0x12, 0x30, 0xb0, 0x0, 0x0, 0xa, 0xa, 0x48, - 0x65, 0x95, 0x57, 0x80, 0xa, 0x9, 0x5, 0x48, - 0x5, 0x8, 0x20, 0xa, 0xa, 0x58, 0x53, 0xe, - 0x12, 0x0, 0xa, 0x1, 0x0, 0x0, 0xd, 0x10, - 0x0, 0xa, 0x87, 0x9a, 0x96, 0xb, 0x40, 0x0, - 0xa, 0x83, 0x79, 0x63, 0x39, 0x70, 0x0, 0xa, - 0x87, 0x7a, 0x93, 0x75, 0x80, 0x0, 0xa, 0x61, - 0x16, 0x21, 0xb0, 0x49, 0x0, 0xb, 0x0, 0x4, - 0x18, 0x30, 0xc, 0x70, 0x8, 0x55, 0x55, 0x93, - 0x0, 0x1, 0xb2, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x0, 0x0, - - /* U+6B61 "歡" */ - 0x0, 0x10, 0x2, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x48, 0xc, 0x31, 0x79, 0x0, 0x0, 0x6, 0x89, - 0x5c, 0x52, 0x92, 0x0, 0x0, 0x6, 0x58, 0x56, - 0x71, 0xc5, 0x57, 0x80, 0xb, 0xb, 0x91, 0xa2, - 0x62, 0x9, 0x30, 0x8, 0x86, 0x85, 0x66, 0xe, - 0x12, 0x0, 0x0, 0xc1, 0x80, 0x31, 0x1d, 0x0, - 0x0, 0x7, 0xa5, 0xb5, 0x62, 0x2b, 0x20, 0x0, - 0x27, 0xa4, 0xc4, 0x70, 0x56, 0x60, 0x0, 0x2, - 0xa5, 0xc5, 0x70, 0x92, 0x90, 0x0, 0x2, 0x70, - 0xb0, 0x10, 0xa0, 0x57, 0x0, 0x3, 0xa5, 0x95, - 0x99, 0x20, 0xc, 0x60, 0x3, 0x60, 0x0, 0x62, - 0x0, 0x2, 0xb2, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, - - /* U+6B62 "止" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0xc, - 0x0, 0x3, 0x0, 0x0, 0xc, 0x0, 0xd, 0x55, - 0x59, 0x20, 0x0, 0xc, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x15, 0x5d, 0x55, - 0x5d, 0x55, 0x5a, 0xb0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+6B63 "正" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x55, 0x55, 0x55, 0x55, 0x5b, 0x90, 0x0, 0x10, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0xc, 0x0, - 0x1, 0x0, 0x0, 0xb, 0x0, 0xd, 0x55, 0x7a, - 0x0, 0x0, 0xb, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, - 0xc, 0x0, 0x6, 0x50, 0x17, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x50, - - /* U+6B64 "此" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xa4, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x10, 0x92, - 0x0, 0xb0, 0x1, 0x20, 0x0, 0xd0, 0x92, 0x0, - 0xb0, 0x1c, 0x90, 0x0, 0xb0, 0x96, 0x86, 0xb3, - 0x93, 0x0, 0x0, 0xb0, 0x92, 0x0, 0xb4, 0x0, - 0x0, 0x0, 0xb0, 0x92, 0x0, 0xb0, 0x0, 0x0, - 0x0, 0xb0, 0x92, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0xb0, 0x92, 0x2, 0xb0, 0x0, 0x30, 0x0, 0xb0, - 0xa9, 0x62, 0xb0, 0x0, 0x60, 0x16, 0xea, 0x50, - 0x0, 0xc0, 0x0, 0xc2, 0x1a, 0x30, 0x0, 0x0, - 0x5a, 0xaa, 0x91, - - /* U+6B65 "步" */ - 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x20, 0xd, 0x55, 0x6b, 0x0, 0x0, 0xc, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0xc, - 0x0, 0x0, 0x20, 0x7, 0x5b, 0x55, 0x5b, 0x55, - 0x57, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xa0, 0xc, 0x0, 0xa, 0x30, - 0x0, 0xb, 0x30, 0xc, 0x0, 0x9a, 0x0, 0x0, - 0x75, 0x0, 0xc, 0xa, 0x80, 0x0, 0x4, 0x50, - 0x0, 0x8, 0xb5, 0x0, 0x0, 0x2, 0x0, 0x2, - 0x89, 0x10, 0x0, 0x0, 0x0, 0x25, 0x66, 0x10, - 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6B69 "歩" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, 0x2b, 0x0, - 0xc0, 0x2, 0x40, 0x0, 0x2, 0xa0, 0xc, 0x55, - 0x54, 0x0, 0x0, 0x1a, 0x0, 0xc0, 0x0, 0x4, - 0x5, 0x65, 0x85, 0x5b, 0x55, 0x56, 0x92, 0x0, - 0x1, 0x0, 0xe0, 0x44, 0x0, 0x0, 0x2, 0xe2, - 0xc, 0x0, 0x5b, 0x30, 0x0, 0xb3, 0x0, 0xc0, - 0xa, 0x8d, 0x0, 0x82, 0x0, 0xd, 0xb, 0xb2, - 0x20, 0x20, 0x0, 0x0, 0x7c, 0x60, 0x0, 0x0, - 0x0, 0x3, 0x98, 0x10, 0x0, 0x0, 0x1, 0x57, - 0x50, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+6B6F "歯" */ - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x50, 0xd, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x80, 0xd, 0x55, 0xb1, 0x0, 0x0, 0x4, 0x80, - 0xc, 0x0, 0x0, 0x0, 0x4, 0x57, 0xa5, 0x5d, - 0x55, 0x5b, 0x80, 0x1, 0x0, 0x10, 0x8, 0x2, - 0x0, 0x0, 0x0, 0xb0, 0x57, 0xb, 0xb, 0x27, - 0x10, 0x0, 0xb0, 0x7, 0xb, 0x43, 0x2c, 0x0, - 0x0, 0xb3, 0x65, 0xae, 0x76, 0x7c, 0x0, 0x0, - 0xb0, 0x5, 0x8b, 0x87, 0xc, 0x0, 0x0, 0xb0, - 0x47, 0xb, 0x9, 0x9c, 0x0, 0x0, 0xb4, 0x40, - 0xa, 0x0, 0x2c, 0x0, 0x2, 0xa5, 0x55, 0x55, - 0x55, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6B72 "歲" */ - 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x40, 0x66, 0x0, 0x50, 0x0, 0x0, 0x4, - 0x60, 0x68, 0x55, 0x50, 0x10, 0x6, 0x57, 0x85, - 0x88, 0x55, 0x57, 0xa0, 0x0, 0x0, 0x0, 0x6, - 0x63, 0x90, 0x0, 0x0, 0xb5, 0x55, 0x58, 0x95, - 0x79, 0x50, 0x0, 0xc0, 0x0, 0x21, 0x90, 0x24, - 0x0, 0x0, 0xc3, 0x6a, 0x72, 0xb0, 0x89, 0x0, - 0x0, 0xc2, 0x5a, 0x23, 0xa3, 0xc0, 0x0, 0x2, - 0xa7, 0x2a, 0xb6, 0x6e, 0x30, 0x0, 0x4, 0x64, - 0xf, 0x60, 0xad, 0x20, 0x40, 0x8, 0x0, 0x95, - 0x1a, 0x42, 0xd4, 0x80, 0x15, 0x47, 0x24, 0x71, - 0x0, 0x2c, 0xf0, 0x10, 0x10, 0x20, 0x0, 0x0, - 0x0, 0x10, - - /* U+6B73 "歳" */ - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x50, 0x58, 0x0, 0x60, 0x0, 0x0, 0x4, - 0x70, 0x49, 0x55, 0x51, 0x10, 0x6, 0x57, 0x85, - 0x78, 0x55, 0x58, 0xa0, 0x0, 0x0, 0x0, 0x5, - 0x83, 0xa0, 0x0, 0x0, 0xa5, 0x55, 0x57, 0xa5, - 0x78, 0x60, 0x0, 0xb0, 0x0, 0x13, 0xa0, 0x14, - 0x0, 0x0, 0xb6, 0x5b, 0x54, 0xb0, 0x7b, 0x0, - 0x0, 0xa2, 0x3a, 0x40, 0x94, 0xd1, 0x0, 0x1, - 0x98, 0x3a, 0x57, 0x4f, 0x30, 0x0, 0x4, 0x84, - 0xa, 0x4, 0x9d, 0x20, 0x40, 0x7, 0x12, 0xa9, - 0x19, 0x43, 0xd3, 0x70, 0x6, 0x0, 0x4, 0x60, - 0x0, 0x2c, 0xe0, 0x10, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x20, - - /* U+6B77 "歷" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, - 0x95, 0x55, 0x55, 0x55, 0x5b, 0x50, 0x1, 0xa0, - 0x15, 0xc2, 0x1, 0x78, 0x0, 0x1, 0xa3, 0x5a, - 0x0, 0x4c, 0x20, 0x0, 0x1, 0xa5, 0x7b, 0xa3, - 0x6c, 0x58, 0x50, 0x1, 0xa0, 0xab, 0x20, 0x5e, - 0x60, 0x0, 0x2, 0x92, 0x99, 0xa1, 0x8a, 0x2a, - 0x0, 0x3, 0x87, 0x29, 0x6, 0xa, 0x5, 0x70, - 0x4, 0x70, 0x15, 0x12, 0x74, 0x0, 0x0, 0x6, - 0x30, 0x51, 0x2, 0x80, 0x50, 0x0, 0x8, 0x0, - 0xa0, 0x2, 0xa5, 0x52, 0x0, 0x7, 0x0, 0xa0, - 0x2, 0x80, 0x0, 0x0, 0x42, 0x55, 0xc5, 0x56, - 0xa5, 0x59, 0xb0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6B7B "死" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x55, 0x55, 0x55, 0x55, 0x5a, 0xc0, 0x1, 0x3, - 0xa0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x7, 0x60, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0xb, 0x10, 0x40, - 0xc0, 0x4, 0x60, 0x0, 0x1c, 0x56, 0xe1, 0xc0, - 0x2c, 0x40, 0x0, 0x85, 0x5, 0x80, 0xc3, 0x80, - 0x0, 0x1, 0x88, 0x3a, 0x20, 0xc3, 0x0, 0x0, - 0x7, 0x3, 0x6c, 0x0, 0xc0, 0x0, 0x0, 0x10, - 0x0, 0x94, 0x0, 0xc0, 0x0, 0x40, 0x0, 0x4, - 0x80, 0x0, 0xc0, 0x0, 0x70, 0x0, 0x38, 0x0, - 0x0, 0xc2, 0x11, 0xd2, 0x4, 0x50, 0x0, 0x0, - 0x59, 0x99, 0x70, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6B8A "殊" */ - 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x6, 0x2c, 0x0, 0x0, 0x5, 0x99, - 0x55, 0x3a, 0x2a, 0x1, 0x0, 0x0, 0x84, 0x0, - 0x67, 0x6b, 0x59, 0x40, 0x0, 0xb6, 0x75, 0x80, - 0x2a, 0x0, 0x0, 0x0, 0xb0, 0x77, 0x20, 0x2a, - 0x0, 0x40, 0x3, 0x90, 0xa4, 0x55, 0xbc, 0x65, - 0x92, 0x7, 0x57, 0xc0, 0x2, 0xda, 0x60, 0x0, - 0x13, 0x5, 0x90, 0xa, 0x4a, 0x80, 0x0, 0x0, - 0x8, 0x20, 0x56, 0x2a, 0x38, 0x0, 0x0, 0x19, - 0x3, 0x80, 0x2a, 0xa, 0x80, 0x0, 0x71, 0x26, - 0x0, 0x2a, 0x1, 0xb4, 0x5, 0x10, 0x20, 0x0, - 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6B8B "残" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x0, 0xc2, 0x60, 0x0, 0x5, 0x99, - 0x55, 0x10, 0xc0, 0x69, 0x0, 0x0, 0x83, 0x0, - 0x0, 0xc0, 0x6, 0x0, 0x0, 0xa0, 0x4, 0x35, - 0xd5, 0x57, 0x40, 0x0, 0xb5, 0x5d, 0x10, 0xb0, - 0x0, 0x0, 0x5, 0x80, 0x38, 0x0, 0xb6, 0x57, - 0x60, 0x8, 0x49, 0x64, 0x54, 0x94, 0x7, 0x10, - 0x21, 0x4, 0xa0, 0x0, 0x57, 0x4b, 0x0, 0x0, - 0x2, 0x80, 0x0, 0x1d, 0xb0, 0x0, 0x0, 0x9, - 0x0, 0x0, 0x4e, 0x50, 0x12, 0x0, 0x63, 0x0, - 0x18, 0x60, 0xc5, 0x60, 0x4, 0x30, 0x4, 0x50, - 0x0, 0x1b, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x30, - - /* U+6BB5 "段" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x43, 0x8b, 0x27, 0x55, 0x91, 0x0, 0x0, 0xc2, - 0x0, 0xc, 0x0, 0xb0, 0x0, 0x0, 0xb0, 0x0, - 0xc, 0x0, 0xb0, 0x0, 0x0, 0xc5, 0x68, 0xa, - 0x0, 0xc0, 0x10, 0x0, 0xb0, 0x0, 0x72, 0x0, - 0x59, 0x80, 0x0, 0xc5, 0x68, 0x55, 0x44, 0x78, - 0x0, 0x0, 0xb0, 0x0, 0x6, 0x0, 0xa3, 0x0, - 0x0, 0xb0, 0x2, 0x24, 0x42, 0xb0, 0x0, 0x14, - 0xd9, 0x73, 0x0, 0xbb, 0x30, 0x0, 0x19, 0xc0, - 0x0, 0x0, 0xbd, 0x10, 0x0, 0x0, 0xb0, 0x0, - 0x3a, 0x33, 0xd6, 0x0, 0x0, 0xb0, 0x35, 0x40, - 0x0, 0x1a, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6BCD "母" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0x65, 0x55, 0x55, 0xb5, 0x0, 0x0, 0xc, - 0x11, 0x50, 0x0, 0xa2, 0x0, 0x0, 0xd, 0x0, - 0x87, 0x0, 0xb1, 0x0, 0x0, 0xd, 0x0, 0x17, - 0x0, 0xc0, 0x0, 0x15, 0x5d, 0x55, 0x55, 0x55, - 0xe7, 0xc0, 0x0, 0x2a, 0x2, 0x30, 0x0, 0xd0, - 0x0, 0x0, 0x48, 0x0, 0xb5, 0x0, 0xd0, 0x0, - 0x0, 0x67, 0x0, 0x49, 0x1, 0xc0, 0x0, 0x0, - 0x85, 0x0, 0x0, 0x2, 0xb3, 0x60, 0x0, 0x86, - 0x55, 0x55, 0x57, 0xb5, 0x50, 0x0, 0x0, 0x0, - 0x2, 0x7, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xbf, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, - 0x0, 0x0, - - /* U+6BCE "毎" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xc0, 0x0, 0x0, 0x6, 0x0, 0x0, 0xc, - 0x55, 0x55, 0x55, 0x56, 0x20, 0x0, 0x84, 0x0, - 0x0, 0x0, 0x30, 0x0, 0x4, 0x26, 0x85, 0x5c, - 0x55, 0xd3, 0x0, 0x0, 0x8, 0x30, 0x1a, 0x0, - 0xc0, 0x0, 0x0, 0xa, 0x10, 0x38, 0x0, 0xc0, - 0x50, 0x16, 0x5d, 0x55, 0x89, 0x55, 0xd6, 0x71, - 0x0, 0xc, 0x0, 0x75, 0x0, 0xc0, 0x0, 0x0, - 0xb, 0x0, 0x83, 0x0, 0xc0, 0x0, 0x0, 0x5b, - 0x55, 0x96, 0x55, 0xd8, 0x80, 0x0, 0x1, 0x0, - 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x8d, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x0, 0x0, - - /* U+6BCF "每" */ - 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xc0, 0x0, 0x0, 0x5, 0x0, 0x0, 0xc, - 0x65, 0x55, 0x55, 0x58, 0x30, 0x0, 0x85, 0x0, - 0x0, 0x0, 0x30, 0x0, 0x5, 0x56, 0x95, 0x75, - 0x55, 0xd3, 0x0, 0x12, 0x7, 0x40, 0x87, 0x0, - 0xc0, 0x0, 0x0, 0x9, 0x30, 0x8, 0x0, 0xc0, - 0x60, 0x16, 0x5c, 0x66, 0x55, 0x55, 0xd5, 0x71, - 0x0, 0xc, 0x0, 0xa4, 0x0, 0xd0, 0x0, 0x0, - 0xc, 0x0, 0x2a, 0x0, 0xc0, 0x0, 0x0, 0x3c, - 0x55, 0x55, 0x55, 0xd8, 0xa0, 0x0, 0x1, 0x0, - 0x0, 0x3, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x8d, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x0, 0x0, - - /* U+6BD4 "比" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, - 0xc, 0x30, 0x0, 0x0, 0xc0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0xc, 0x0, 0xc, 0x30, - 0xc0, 0x0, 0xc, 0x0, 0xb7, 0x0, 0xc5, 0x5a, - 0x3c, 0x9, 0x30, 0x0, 0xc0, 0x0, 0xc, 0x60, - 0x0, 0x0, 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0xc, 0x0, 0x0, 0x40, 0xc0, 0x15, 0x2c, 0x0, - 0x0, 0x60, 0xdb, 0x70, 0xc, 0x31, 0x14, 0xc0, - 0x62, 0x0, 0x4, 0xaa, 0xaa, 0x60, - - /* U+6BDB "毛" */ - 0x0, 0x0, 0x0, 0x1, 0x5c, 0x30, 0x0, 0x0, - 0x14, 0x57, 0xb9, 0x74, 0x20, 0x0, 0x0, 0x20, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x50, 0x0, 0x0, 0x24, 0x55, 0xd5, - 0x55, 0x62, 0x0, 0x0, 0x31, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x1, 0x29, - 0x80, 0x4, 0x55, 0x55, 0xd5, 0x54, 0x21, 0x0, - 0x1, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x50, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, - 0xbc, 0xbb, 0xbc, 0xc1, - - /* U+6C0F "氏" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x8e, 0x80, 0x0, 0xa5, 0x56, 0xd5, 0x31, - 0x0, 0x0, 0xb1, 0x0, 0xb1, 0x0, 0x0, 0x0, - 0xb1, 0x0, 0xa2, 0x0, 0x0, 0x0, 0xb5, 0x55, - 0xb7, 0x55, 0x6e, 0x30, 0xb1, 0x0, 0x56, 0x0, - 0x0, 0x0, 0xb1, 0x0, 0x2b, 0x0, 0x0, 0x0, - 0xb1, 0x0, 0xc, 0x30, 0x0, 0x0, 0xb1, 0x0, - 0x34, 0xd0, 0x0, 0x30, 0xb1, 0x66, 0x0, 0x8b, - 0x10, 0x70, 0xcd, 0x40, 0x0, 0x7, 0xe9, 0x70, - 0x62, 0x0, 0x0, 0x0, 0x2a, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+6C11 "民" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x95, - 0x55, 0x55, 0x55, 0xc1, 0x0, 0xc, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0xc, 0x55, 0x5a, 0x55, 0x5d, 0x0, - 0x0, 0xc0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x9, 0x20, 0x0, 0x53, 0x0, 0xc5, 0x55, - 0x99, 0x55, 0x55, 0x40, 0xc, 0x0, 0x1, 0xb0, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0xa, 0x40, 0x0, - 0x0, 0xc, 0x1, 0x50, 0x2d, 0x20, 0x5, 0x0, - 0xd8, 0x80, 0x0, 0x4d, 0x41, 0x80, 0xc, 0x50, - 0x0, 0x0, 0x2b, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x30, - - /* U+6C14 "气" */ - 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0x55, 0x55, 0x55, 0x7d, 0x10, 0x0, 0x65, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x90, 0x65, 0x55, - 0x57, 0x90, 0x0, 0x7, 0x10, 0x0, 0x0, 0x3, - 0x0, 0x0, 0x21, 0x36, 0x55, 0x55, 0x5c, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x70, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc2, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3d, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x30, - - /* U+6C17 "気" */ - 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xc0, 0x0, 0x0, 0x2, 0x0, 0x0, 0xa, - 0x75, 0x55, 0x55, 0x59, 0x40, 0x0, 0x28, 0x55, - 0x55, 0x55, 0xa2, 0x0, 0x0, 0x90, 0x10, 0x0, - 0x0, 0x10, 0x0, 0x5, 0x16, 0x55, 0x55, 0x55, - 0xe0, 0x0, 0x1, 0x0, 0x0, 0xa, 0x60, 0xc0, - 0x0, 0x0, 0x4, 0x20, 0x3c, 0x0, 0xb0, 0x0, - 0x0, 0x0, 0x49, 0xc1, 0x0, 0xb0, 0x0, 0x0, - 0x0, 0xa, 0xc7, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0x93, 0xc, 0x60, 0x83, 0x30, 0x0, 0x27, 0x10, - 0x2, 0x60, 0x2c, 0x51, 0x1, 0x30, 0x0, 0x0, - 0x0, 0x6, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x12, - - /* U+6C34 "水" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb4, 0x0, 0x7a, 0x0, 0x5, 0x55, 0xa4, 0xb7, - 0x5, 0x80, 0x0, 0x1, 0x0, 0xd1, 0xb7, 0x63, - 0x0, 0x0, 0x0, 0x3, 0xa0, 0xb2, 0x80, 0x0, - 0x0, 0x0, 0x9, 0x40, 0xb1, 0x83, 0x0, 0x0, - 0x0, 0x1b, 0x0, 0xb1, 0x1c, 0x0, 0x0, 0x0, - 0x83, 0x0, 0xb1, 0x6, 0xb0, 0x0, 0x3, 0x60, - 0x0, 0xb1, 0x0, 0x9d, 0x40, 0x15, 0x0, 0x11, - 0xc1, 0x0, 0x8, 0x60, 0x0, 0x0, 0x2b, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6C37 "氷" */ - 0x0, 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0xa2, 0x0, 0x10, 0x0, 0x0, 0x6a, 0x10, - 0xa3, 0x0, 0xd4, 0x0, 0x0, 0x6, 0x80, 0xa8, - 0x9, 0x30, 0x0, 0x4, 0x55, 0x66, 0xa8, 0x72, - 0x0, 0x0, 0x1, 0x0, 0x85, 0xa4, 0x70, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0xa2, 0xa1, 0x0, 0x0, - 0x0, 0x7, 0x50, 0xa2, 0x3c, 0x0, 0x0, 0x0, - 0x1a, 0x0, 0xa2, 0x9, 0xb0, 0x0, 0x0, 0xa1, - 0x0, 0xa2, 0x0, 0xbd, 0x50, 0x8, 0x10, 0x22, - 0xc2, 0x0, 0x8, 0x20, 0x20, 0x0, 0x18, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6C38 "永" */ - 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8b, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, - 0x5a, 0x10, 0x1, 0x0, 0x0, 0x0, 0x10, 0xe, - 0x0, 0x2e, 0x10, 0x0, 0x0, 0x12, 0xd, 0x40, - 0xa2, 0x0, 0x3, 0x65, 0xa9, 0xc, 0x77, 0x20, - 0x0, 0x0, 0x0, 0xc1, 0xc, 0x55, 0x0, 0x0, - 0x0, 0x4, 0x80, 0xc, 0xb, 0x0, 0x0, 0x0, - 0xb, 0x0, 0xc, 0x5, 0xb0, 0x0, 0x0, 0x73, - 0x0, 0xc, 0x0, 0x9c, 0x20, 0x4, 0x40, 0x3, - 0x4c, 0x0, 0x8, 0xc2, 0x2, 0x0, 0x2, 0xd7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6C42 "求" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd2, 0x29, 0x20, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x3, 0xc0, 0x0, 0x5, 0x55, 0x55, - 0xe5, 0x55, 0x7d, 0x30, 0x1, 0x0, 0x0, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x56, 0x0, 0xd5, 0x0, - 0x65, 0x0, 0x0, 0xa, 0x90, 0xd7, 0x5, 0xb3, - 0x0, 0x0, 0x1, 0x60, 0xd2, 0xa5, 0x0, 0x0, - 0x0, 0x0, 0x36, 0xd0, 0x93, 0x0, 0x0, 0x0, - 0x39, 0x40, 0xd0, 0x1d, 0x30, 0x0, 0x3c, 0xa0, - 0x0, 0xd0, 0x3, 0xe8, 0x10, 0x6, 0x0, 0x32, - 0xe0, 0x0, 0x2d, 0x90, 0x0, 0x0, 0x3c, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+6C5A "汚" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x92, 0x6, 0x55, 0x65, 0x5a, 0x10, 0x0, 0x3a, - 0x0, 0x4, 0x70, 0x0, 0x0, 0x0, 0x1, 0x20, - 0x6, 0x50, 0x0, 0x0, 0x27, 0x0, 0x76, 0x5b, - 0x75, 0x55, 0xb1, 0x7, 0x73, 0x20, 0xb, 0x0, - 0x0, 0x0, 0x0, 0x46, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x0, 0x4b, 0x55, 0x5c, 0x40, - 0x0, 0x44, 0x0, 0x0, 0x0, 0xd, 0x0, 0x7, - 0xe0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0x39, 0x0, 0x1, 0xd0, 0x0, - 0x0, 0x30, 0x86, 0x0, 0x0, 0xa0, 0x0, 0x0, - 0x3e, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+6C60 "池" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x49, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x31, - 0xa0, 0xb0, 0x2, 0x0, 0x9, 0x10, 0x41, 0xa0, - 0xb4, 0x4c, 0x30, 0x3, 0xb1, 0x44, 0xb4, 0xc0, - 0xa, 0x0, 0x0, 0x26, 0x22, 0xa0, 0xb0, 0xb, - 0x0, 0x0, 0x7, 0x1, 0xa0, 0xb0, 0xb, 0x0, - 0x0, 0x35, 0x1, 0xa0, 0xb2, 0x4c, 0x0, 0x6, - 0xe1, 0x1, 0xa0, 0xb0, 0x76, 0x20, 0x0, 0xd0, - 0x1, 0xa0, 0x70, 0x0, 0x60, 0x0, 0xe0, 0x1, - 0xb0, 0x0, 0x0, 0xb4, 0x0, 0xa0, 0x0, 0x8a, - 0xaa, 0xaa, 0x91, - - /* U+6C7A "決" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x75, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, 0x1, 0x5, - 0x76, 0xc5, 0x5c, 0x0, 0x7, 0x20, 0x40, 0x1, - 0xa0, 0xc, 0x0, 0x1, 0xe0, 0x60, 0x1, 0xa0, - 0xc, 0x0, 0x0, 0x43, 0x30, 0x2, 0x90, 0xc, - 0x0, 0x0, 0x8, 0x26, 0x57, 0xb5, 0x5a, 0x93, - 0x0, 0x27, 0x0, 0x7, 0x56, 0x0, 0x0, 0x5, - 0xe3, 0x0, 0xc, 0x9, 0x10, 0x0, 0x0, 0xc0, - 0x0, 0x57, 0x2, 0xc0, 0x0, 0x0, 0xe0, 0x1, - 0xa0, 0x0, 0x7c, 0x20, 0x0, 0x70, 0x28, 0x0, - 0x0, 0x7, 0xf4, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x10, - - /* U+6C88 "沈" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, - 0x50, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x77, - 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, 0x3, 0x7, - 0x55, 0xc5, 0x57, 0x80, 0x14, 0x0, 0x4c, 0x1, - 0xa0, 0x7, 0x20, 0x9, 0x54, 0x11, 0x2, 0xa0, - 0x0, 0x0, 0x1, 0x25, 0x0, 0x4, 0xe5, 0x0, - 0x0, 0x0, 0x6, 0x0, 0x7, 0xb4, 0x0, 0x0, - 0x0, 0x62, 0x0, 0xc, 0x74, 0x0, 0x0, 0x14, - 0xc0, 0x0, 0x39, 0x64, 0x0, 0x10, 0x7, 0xb0, - 0x0, 0xa1, 0x64, 0x0, 0x50, 0x4, 0xa0, 0x7, - 0x20, 0x65, 0x0, 0x61, 0x5, 0xa0, 0x62, 0x0, - 0x3c, 0x99, 0xc4, 0x0, 0x23, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6C92 "沒" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x73, 0x0, 0x4b, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0x0, 0x96, 0x55, 0x5d, 0x0, 0x0, 0x2, 0x13, - 0x80, 0x0, 0x1b, 0x0, 0x7, 0x0, 0x56, 0x10, - 0x0, 0x38, 0x0, 0x4, 0xb0, 0x73, 0x0, 0x3, - 0xd2, 0x0, 0x0, 0x55, 0x15, 0x65, 0x55, 0x6c, - 0x0, 0x0, 0x8, 0x0, 0x60, 0x0, 0x86, 0x0, - 0x0, 0x46, 0x0, 0x43, 0x1, 0xb0, 0x0, 0x6, - 0xf1, 0x0, 0xa, 0x1b, 0x20, 0x0, 0x0, 0xc0, - 0x0, 0x3, 0xf5, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x3b, 0x6c, 0x60, 0x0, 0x0, 0x80, 0x38, 0x71, - 0x1, 0x9f, 0xb2, 0x0, 0x2, 0x20, 0x0, 0x0, - 0x1, 0x20, - - /* U+6CB9 "油" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x5, - 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x3c, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0x42, 0x20, 0xb, - 0x0, 0x40, 0x23, 0x0, 0x5b, 0x55, 0xc5, 0x5d, - 0x10, 0xb5, 0x14, 0xb0, 0xb, 0x0, 0xb0, 0x2, - 0x36, 0xb, 0x0, 0xb0, 0xb, 0x0, 0x0, 0x80, - 0xb5, 0x5c, 0x55, 0xc0, 0x0, 0x54, 0xb, 0x0, - 0xb0, 0xb, 0x1, 0x6d, 0x0, 0xb0, 0xb, 0x0, - 0xb0, 0x3, 0xc0, 0xb, 0x0, 0xb0, 0xb, 0x0, - 0x3b, 0x0, 0xb5, 0x5c, 0x55, 0xc0, 0x3, 0xb0, - 0xa, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+6CBB "治" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x53, 0x0, 0x1, 0xe1, 0x0, 0x0, 0x0, 0xe, - 0x10, 0x8, 0x40, 0x0, 0x0, 0x0, 0x4, 0x4, - 0x27, 0x0, 0x53, 0x0, 0x4, 0x0, 0x32, 0x80, - 0x0, 0xb, 0x50, 0x6, 0xa0, 0x6a, 0xc8, 0x65, - 0x55, 0xd0, 0x0, 0x80, 0x61, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x6, 0x10, 0x95, 0x55, 0x5b, 0x0, - 0x0, 0xa, 0x0, 0xb0, 0x0, 0xb, 0x0, 0x4, - 0xb7, 0x0, 0xb0, 0x0, 0xb, 0x0, 0x0, 0x95, - 0x0, 0xb0, 0x0, 0xb, 0x0, 0x0, 0xb4, 0x0, - 0xc5, 0x55, 0x5b, 0x0, 0x0, 0x93, 0x0, 0xa0, - 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6CC1 "況" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x82, 0x1, 0xa5, 0x55, 0x5b, 0x20, 0x0, 0x1d, - 0x0, 0xa0, 0x0, 0xb, 0x0, 0x0, 0x2, 0x3, - 0xa0, 0x0, 0xb, 0x0, 0x6, 0x0, 0x40, 0xa0, - 0x0, 0xb, 0x0, 0x4, 0xb0, 0x50, 0xc5, 0x55, - 0x5c, 0x0, 0x0, 0x64, 0x21, 0x77, 0x3b, 0x5, - 0x0, 0x0, 0x8, 0x0, 0x8, 0x1b, 0x0, 0x0, - 0x0, 0x37, 0x0, 0xa, 0xb, 0x0, 0x0, 0x6, - 0xe2, 0x0, 0xa, 0xb, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x74, 0xb, 0x0, 0x50, 0x0, 0xf0, 0x3, - 0x80, 0xb, 0x0, 0x80, 0x0, 0xa0, 0x46, 0x0, - 0x7, 0xa9, 0xc2, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+6CCA "泊" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, - 0x0, 0x0, 0x5b, 0x0, 0x0, 0x1, 0xd0, 0x0, - 0x8, 0x10, 0x0, 0x0, 0x5, 0x3, 0x95, 0x85, - 0x55, 0xb0, 0x40, 0x2, 0x2b, 0x0, 0x0, 0x1a, - 0x3, 0xb0, 0x50, 0xb0, 0x0, 0x1, 0xa0, 0x9, - 0x16, 0xb, 0x0, 0x0, 0x1a, 0x0, 0x6, 0x10, - 0xc5, 0x55, 0x56, 0xa0, 0x0, 0x90, 0xb, 0x0, - 0x0, 0x1a, 0x4, 0xb6, 0x0, 0xb0, 0x0, 0x1, - 0xa0, 0xa, 0x30, 0xb, 0x0, 0x0, 0x1a, 0x0, - 0xb2, 0x0, 0xc5, 0x55, 0x56, 0xa0, 0x9, 0x30, - 0xb, 0x0, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+6CD5 "法" */ - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - 0x91, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x3a, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x2, 0x34, - 0x65, 0xc5, 0x5a, 0x30, 0x26, 0x0, 0x50, 0x0, - 0xb0, 0x0, 0x0, 0x8, 0x71, 0x40, 0x0, 0xb0, - 0x0, 0x0, 0x1, 0x46, 0x0, 0x0, 0xb0, 0x0, - 0x60, 0x0, 0x7, 0x36, 0x56, 0xd5, 0x55, 0x51, - 0x0, 0x63, 0x0, 0x7, 0x90, 0x0, 0x0, 0x18, - 0xd0, 0x0, 0x2b, 0x0, 0x30, 0x0, 0x1, 0xb0, - 0x0, 0x91, 0x0, 0x57, 0x0, 0x3, 0xa0, 0x19, - 0x44, 0x55, 0x5c, 0x70, 0x2, 0x80, 0x2e, 0x95, - 0x20, 0x1, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6CE2 "波" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x92, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x4a, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x1, 0x4a, - 0x55, 0xc5, 0x5b, 0x70, 0x27, 0x0, 0x5b, 0x0, - 0xb0, 0x17, 0x0, 0x8, 0x73, 0x2b, 0x0, 0xb0, - 0x0, 0x0, 0x1, 0x27, 0xb, 0x56, 0xa5, 0x6a, - 0x0, 0x0, 0x16, 0xb, 0x5, 0x0, 0x84, 0x0, - 0x0, 0x81, 0xb, 0x6, 0x11, 0xa0, 0x0, 0x29, - 0xb0, 0x28, 0x0, 0xaa, 0x10, 0x0, 0x3, 0x90, - 0x72, 0x0, 0xab, 0x0, 0x0, 0x5, 0x91, 0x70, - 0x9, 0x45, 0xc3, 0x0, 0x3, 0x76, 0x5, 0x71, - 0x0, 0x3d, 0x80, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, 0x0, - - /* U+6CE3 "泣" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x82, 0x0, 0x8, 0x50, 0x0, 0x0, 0x0, 0x3c, - 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x3, 0x5, - 0x55, 0x65, 0x5d, 0x30, 0x16, 0x0, 0x31, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x90, 0x52, 0x0, 0x0, - 0xe1, 0x0, 0x0, 0x54, 0x20, 0x70, 0x2, 0xb0, - 0x0, 0x0, 0x8, 0x0, 0xa2, 0x5, 0x60, 0x0, - 0x0, 0x28, 0x0, 0x77, 0x8, 0x10, 0x0, 0x6, - 0xe3, 0x0, 0x49, 0x9, 0x0, 0x0, 0x0, 0xd1, - 0x0, 0x12, 0x7, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x42, 0x1, 0x80, 0x0, 0xa0, 0x65, 0x55, - 0x55, 0x55, 0x51, - - /* U+6CE8 "注" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x70, 0x0, 0x8, 0x50, 0x0, 0x0, 0x0, 0x6a, - 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, 0x4, 0x40, - 0x0, 0x20, 0x5, 0x50, 0x22, 0x0, 0x56, 0x55, - 0xd5, 0x55, 0x40, 0xb, 0x53, 0x30, 0x0, 0xc0, - 0x0, 0x0, 0x3, 0x67, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x8, 0x4, 0x55, 0xd5, 0x6d, 0x10, - 0x0, 0x55, 0x1, 0x0, 0xc0, 0x0, 0x0, 0x17, - 0xe0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x3, 0xd0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x4, 0xb0, 0x0, - 0x0, 0xc0, 0x2, 0x70, 0x4, 0xa0, 0x65, 0x55, - 0x55, 0x55, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6CF3 "泳" */ - 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, - 0x82, 0x0, 0x6, 0xd2, 0x0, 0x0, 0x0, 0x2c, - 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x2, 0x32, - 0x65, 0xe1, 0x1, 0x0, 0x17, 0x0, 0x50, 0x0, - 0xe1, 0xb, 0x40, 0x7, 0x93, 0x20, 0x40, 0xc5, - 0x73, 0x0, 0x0, 0x47, 0x46, 0xd2, 0xc9, 0x10, - 0x0, 0x0, 0x8, 0x0, 0xb0, 0xc7, 0x10, 0x0, - 0x0, 0x55, 0x4, 0x70, 0xc2, 0x80, 0x0, 0x7, - 0xf1, 0xa, 0x10, 0xc0, 0xb3, 0x0, 0x0, 0xe0, - 0x37, 0x0, 0xc0, 0x3e, 0x30, 0x3, 0xd1, 0x60, - 0x11, 0xc0, 0x6, 0xa1, 0x1, 0xa0, 0x0, 0x4d, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+6D0B "洋" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x60, 0x0, 0x92, 0x0, 0xd2, 0x0, 0x0, 0x69, - 0x0, 0x4b, 0x4, 0x70, 0x0, 0x0, 0x5, 0x20, - 0x3, 0x7, 0x5, 0x40, 0x12, 0x0, 0x45, 0x55, - 0xd5, 0x55, 0x40, 0xb, 0x50, 0x50, 0x0, 0xc0, - 0x2, 0x0, 0x2, 0x64, 0x23, 0x65, 0xd5, 0x59, - 0x10, 0x0, 0x8, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x18, 0x0, 0x0, 0xc0, 0x1, 0x60, 0x5, - 0xb4, 0x36, 0x55, 0xd5, 0x55, 0x50, 0x0, 0xe1, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+6D17 "洗" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, - 0x60, 0x0, 0x40, 0xb2, 0x0, 0x0, 0x0, 0x87, - 0x2, 0xd0, 0xb0, 0x0, 0x0, 0x0, 0x12, 0x35, - 0x95, 0xc5, 0x5d, 0x20, 0x15, 0x0, 0x49, 0x0, - 0xb0, 0x0, 0x0, 0x7, 0x81, 0x54, 0x0, 0xb0, - 0x0, 0x0, 0x0, 0x55, 0x35, 0x55, 0xc5, 0x56, - 0xb0, 0x0, 0x7, 0x1, 0x1b, 0xa, 0x10, 0x0, - 0x0, 0x17, 0x0, 0x29, 0xa, 0x10, 0x0, 0x5, - 0xb4, 0x0, 0x57, 0xa, 0x10, 0x0, 0x0, 0xd2, - 0x0, 0xa2, 0xa, 0x10, 0x40, 0x0, 0xf1, 0x4, - 0x90, 0xa, 0x10, 0x80, 0x0, 0xe0, 0x57, 0x0, - 0x6, 0xb9, 0xd4, 0x0, 0x2, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+6D32 "洲" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x83, 0x0, 0xb0, 0x2, 0x0, 0xd0, 0x0, 0x1b, - 0x0, 0xb0, 0xc, 0x0, 0xb0, 0x0, 0x0, 0x40, - 0xb0, 0xa, 0x0, 0xb0, 0x7, 0x10, 0x50, 0xa0, - 0xa, 0x0, 0xb0, 0x3, 0xc1, 0x45, 0xb6, 0xa, - 0x70, 0xb0, 0x0, 0x26, 0x66, 0xa5, 0x6a, 0x84, - 0xb0, 0x0, 0x8, 0x62, 0x91, 0x1a, 0x10, 0xb0, - 0x0, 0x36, 0x4, 0x70, 0xa, 0x0, 0xb0, 0x6, - 0xe2, 0x8, 0x20, 0xa, 0x0, 0xb0, 0x0, 0xd0, - 0xa, 0x0, 0xa, 0x0, 0xb0, 0x0, 0xf0, 0x63, - 0x0, 0xb, 0x0, 0xb0, 0x0, 0x92, 0x40, 0x0, - 0x1, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6D3B "活" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x72, 0x0, 0x0, 0x15, 0xac, 0x0, 0x0, 0x2d, - 0x4, 0x57, 0xd6, 0x32, 0x0, 0x0, 0x3, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x24, 0x0, 0x30, 0x0, - 0xb0, 0x0, 0x20, 0x9, 0x64, 0x46, 0x55, 0xc5, - 0x55, 0x91, 0x1, 0x56, 0x0, 0x0, 0xb0, 0x0, - 0x0, 0x0, 0x16, 0x2, 0x0, 0xb0, 0x3, 0x0, - 0x0, 0x72, 0xc, 0x55, 0x55, 0x5e, 0x10, 0x18, - 0xd0, 0xc, 0x0, 0x0, 0xb, 0x0, 0x1, 0xb0, - 0xc, 0x0, 0x0, 0xb, 0x0, 0x3, 0xb0, 0xc, - 0x55, 0x55, 0x5c, 0x0, 0x2, 0x80, 0xc, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x2, 0x0, - - /* U+6D3E "派" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x66, 0x0, 0x0, 0x26, 0xbc, 0x0, 0x0, 0xd, - 0x9, 0x65, 0x42, 0x0, 0x0, 0x0, 0x0, 0x39, - 0x20, 0x1, 0x6c, 0x0, 0x38, 0x1, 0x39, 0x2a, - 0x67, 0x20, 0x0, 0x9, 0x55, 0x9, 0x2b, 0x4, - 0x5, 0x40, 0x1, 0x7, 0xa, 0x1b, 0x6, 0x69, - 0x20, 0x0, 0x35, 0xb, 0xb, 0x9, 0x20, 0x0, - 0x0, 0xa0, 0xb, 0xb, 0x8, 0x10, 0x0, 0x19, - 0xd0, 0x19, 0xb, 0x3, 0x80, 0x0, 0x3, 0xb0, - 0x72, 0xb, 0x0, 0xa4, 0x0, 0x5, 0xa0, 0x70, - 0xc, 0x83, 0x1e, 0x80, 0x1, 0x56, 0x0, 0x9, - 0x10, 0x3, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6D41 "流" */ - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x60, 0x0, 0x9, 0x50, 0x1, 0x0, 0x0, 0x4b, - 0x27, 0x59, 0x75, 0x59, 0x40, 0x0, 0x4, 0x0, - 0x1d, 0x20, 0x0, 0x0, 0x32, 0x0, 0x40, 0x93, - 0x0, 0x70, 0x0, 0xc, 0x32, 0x37, 0x73, 0x34, - 0x98, 0x0, 0x3, 0x26, 0x7, 0x74, 0x20, 0x8, - 0x0, 0x0, 0x7, 0xa, 0x29, 0x30, 0xb0, 0x0, - 0x0, 0x63, 0xb, 0xb, 0x0, 0xb0, 0x0, 0x26, - 0xc0, 0xb, 0xb, 0x0, 0xb0, 0x0, 0x6, 0xa0, - 0xb, 0xb, 0x0, 0xb0, 0x30, 0x5, 0x90, 0x55, - 0xb, 0x0, 0xb0, 0x60, 0x6, 0x93, 0x60, 0xb, - 0x0, 0xb9, 0xc0, 0x0, 0x12, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+6D45 "浅" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x56, 0x0, 0x0, 0xd2, 0x50, 0x0, 0x0, 0xd, - 0x20, 0x0, 0xc0, 0x86, 0x0, 0x0, 0x2, 0x4, - 0x0, 0xc0, 0x4, 0x20, 0x7, 0x20, 0x33, 0x45, - 0xd5, 0x56, 0x50, 0x2, 0xe0, 0x61, 0x10, 0xb0, - 0x0, 0x20, 0x0, 0x41, 0x60, 0x2, 0xc5, 0x57, - 0x90, 0x0, 0x6, 0x36, 0x43, 0xb0, 0x7, 0x0, - 0x0, 0xa, 0x0, 0x0, 0x83, 0x8a, 0x0, 0x4, - 0xb8, 0x0, 0x0, 0x3e, 0x80, 0x0, 0x0, 0x95, - 0x0, 0x1, 0xad, 0x30, 0x50, 0x0, 0xb4, 0x0, - 0x57, 0x11, 0xc4, 0x90, 0x0, 0x93, 0x13, 0x0, - 0x0, 0x1b, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, - - /* U+6D74 "浴" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x92, 0x0, 0x1d, 0x2, 0x70, 0x0, 0x0, 0x4c, - 0x0, 0xa3, 0x0, 0x3e, 0x20, 0x0, 0x3, 0x45, - 0x30, 0xa5, 0x7, 0x40, 0x17, 0x0, 0x62, 0x4, - 0xb6, 0x0, 0x0, 0x7, 0xa2, 0x30, 0xc, 0x13, - 0x60, 0x0, 0x0, 0x47, 0x0, 0xa2, 0x0, 0x69, - 0x10, 0x0, 0x9, 0x8, 0x70, 0x0, 0xb, 0xe2, - 0x0, 0x37, 0x51, 0xc5, 0x55, 0x5c, 0x0, 0x6, - 0xd2, 0x0, 0xc0, 0x0, 0x1b, 0x0, 0x0, 0xf0, - 0x0, 0xc0, 0x0, 0x1b, 0x0, 0x2, 0xf0, 0x0, - 0xd5, 0x55, 0x5b, 0x0, 0x1, 0xc0, 0x0, 0xc0, - 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6D77 "海" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, - 0x70, 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x94, - 0x9, 0x75, 0x55, 0x5a, 0x40, 0x0, 0x12, 0x19, - 0x0, 0x0, 0x0, 0x0, 0x29, 0x4, 0x6a, 0x55, - 0x55, 0xa5, 0x0, 0x9, 0x25, 0x1c, 0x7, 0x30, - 0x91, 0x0, 0x0, 0x14, 0xc, 0x1, 0x80, 0xa0, - 0x20, 0x0, 0x64, 0x7c, 0x55, 0x55, 0xc5, 0x81, - 0x0, 0x80, 0x38, 0x7, 0x20, 0xb0, 0x0, 0x2a, - 0x80, 0x65, 0x3, 0x60, 0xb0, 0x0, 0x6, 0x60, - 0xb6, 0x55, 0x55, 0xd5, 0x90, 0x8, 0x60, 0x0, - 0x1, 0x11, 0xb0, 0x0, 0x5, 0x50, 0x0, 0x0, - 0x6f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+6D88 "消" */ - 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x6, - 0x20, 0x31, 0x2, 0xc0, 0x43, 0x0, 0x1e, 0x0, - 0xc3, 0x1a, 0xb, 0x20, 0x0, 0x40, 0x35, 0x51, - 0xa5, 0x10, 0x6, 0x10, 0x13, 0x85, 0x6c, 0x69, - 0x20, 0x3d, 0x5, 0xc, 0x0, 0x0, 0xc0, 0x0, - 0x50, 0x70, 0xd5, 0x55, 0x5d, 0x0, 0x0, 0x35, - 0xc, 0x0, 0x0, 0xc0, 0x0, 0x9, 0x0, 0xc0, - 0x0, 0xc, 0x0, 0x48, 0xb0, 0xd, 0x55, 0x55, - 0xd0, 0x0, 0x68, 0x0, 0xc0, 0x0, 0xc, 0x0, - 0x6, 0x70, 0xc, 0x0, 0x0, 0xc0, 0x0, 0x67, - 0x0, 0xc0, 0x4, 0xbc, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x1, 0x10, - - /* U+6DBC "涼" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x50, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x69, - 0x0, 0x0, 0x16, 0x0, 0x60, 0x0, 0x6, 0x6, - 0x65, 0x55, 0x55, 0x51, 0x13, 0x0, 0x40, 0x65, - 0x55, 0x57, 0x0, 0x9, 0x60, 0x50, 0xb0, 0x0, - 0xb, 0x0, 0x1, 0x94, 0x20, 0xb0, 0x0, 0xb, - 0x0, 0x0, 0x8, 0x0, 0xb5, 0x57, 0x5c, 0x0, - 0x0, 0x26, 0x0, 0x50, 0x1a, 0x3, 0x0, 0x6, - 0xc1, 0x0, 0xa3, 0x1a, 0x33, 0x0, 0x0, 0xd0, - 0x3, 0xa0, 0x1a, 0x9, 0x50, 0x0, 0xd0, 0x18, - 0x0, 0x19, 0x1, 0xe0, 0x0, 0xc0, 0x50, 0x6, - 0xb8, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x40, - 0x0, 0x0, - - /* U+6DF1 "深" */ - 0x0, 0x70, 0x4, 0x0, 0x0, 0x2, 0x10, 0x0, - 0x59, 0xa, 0x55, 0x55, 0x5b, 0x50, 0x0, 0x2, - 0x56, 0x47, 0x3, 0x43, 0x0, 0x32, 0x3, 0x10, - 0xa1, 0x10, 0x6b, 0x0, 0xc, 0x35, 0x6, 0x0, - 0xc2, 0x7, 0x0, 0x2, 0x16, 0x0, 0x0, 0xc0, - 0x2, 0x40, 0x0, 0x53, 0x16, 0x5b, 0xf8, 0x55, - 0x50, 0x0, 0xa0, 0x0, 0x2b, 0xc5, 0x10, 0x0, - 0x29, 0xb0, 0x0, 0xb1, 0xc0, 0xa0, 0x0, 0x4, - 0x90, 0x9, 0x20, 0xc0, 0x4c, 0x20, 0x6, 0x81, - 0x61, 0x0, 0xc0, 0x7, 0x80, 0x4, 0x60, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+6DF7 "混" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x64, 0x2, 0x0, 0x0, 0x4, 0x0, 0x0, 0xd, - 0x17, 0x85, 0x55, 0x5d, 0x0, 0x0, 0x2, 0x47, - 0x85, 0x55, 0x5b, 0x0, 0x29, 0x0, 0x56, 0x50, - 0x0, 0xb, 0x0, 0x7, 0x72, 0x37, 0x50, 0x0, - 0xb, 0x0, 0x0, 0x17, 0x5, 0x65, 0x58, 0x57, - 0x0, 0x0, 0x7, 0xa, 0x20, 0xc, 0x6, 0x10, - 0x0, 0x63, 0xb, 0x5a, 0x3b, 0x88, 0x10, 0x18, - 0xf0, 0xb, 0x0, 0xd, 0x20, 0x0, 0x0, 0xc0, - 0xb, 0x0, 0xb, 0x0, 0x50, 0x1, 0xd0, 0xb, - 0x66, 0x2b, 0x0, 0x90, 0x0, 0x80, 0x8, 0x40, - 0xc, 0xab, 0xb0, - - /* U+6E05 "清" */ - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x1, - 0x91, 0x0, 0x0, 0xc0, 0x2, 0x0, 0x0, 0x59, - 0x26, 0x55, 0xc5, 0x58, 0x40, 0x0, 0x2, 0x3, - 0x55, 0xc5, 0x77, 0x0, 0x28, 0x4, 0x1, 0x10, - 0xb0, 0x0, 0x10, 0x7, 0x85, 0x55, 0x55, 0xa5, - 0x56, 0xb0, 0x0, 0x25, 0x2, 0x0, 0x0, 0x4, - 0x0, 0x0, 0x33, 0xb, 0x55, 0x55, 0x5c, 0x0, - 0x0, 0x80, 0xb, 0x55, 0x55, 0x5b, 0x0, 0x28, - 0xb0, 0xb, 0x0, 0x0, 0xb, 0x0, 0x4, 0xa0, - 0xb, 0x55, 0x55, 0x5b, 0x0, 0x5, 0x80, 0xb, - 0x0, 0x0, 0xb, 0x0, 0x5, 0x70, 0xb, 0x0, - 0x5, 0xc9, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x20, 0x0, - - /* U+6E07 "渇" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x73, 0x9, 0x65, 0x55, 0x5c, 0x0, 0x0, 0x1d, - 0x9, 0x20, 0x0, 0xb, 0x0, 0x0, 0x2, 0x2b, - 0x65, 0x55, 0x5b, 0x0, 0x16, 0x0, 0x59, 0x20, - 0x0, 0xb, 0x0, 0x6, 0x91, 0x59, 0x85, 0x55, - 0x5b, 0x0, 0x0, 0x56, 0x3, 0xc4, 0x0, 0x0, - 0x10, 0x0, 0x8, 0x7, 0x85, 0x55, 0x57, 0xb0, - 0x0, 0x54, 0x5a, 0x30, 0x35, 0x3, 0x80, 0x6, - 0xe2, 0x27, 0x67, 0x62, 0x4, 0x70, 0x0, 0xc0, - 0x7, 0x60, 0x5, 0x14, 0x70, 0x0, 0xd0, 0x3, - 0xa9, 0x9a, 0x25, 0x60, 0x0, 0x70, 0x0, 0x0, - 0x0, 0x7e, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x0, - - /* U+6E08 "済" */ - 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, - 0x72, 0x0, 0x1, 0xd1, 0x0, 0x0, 0x0, 0x1d, - 0x6, 0x65, 0x95, 0x88, 0x70, 0x0, 0x3, 0x0, - 0x60, 0x2, 0xb0, 0x0, 0x15, 0x0, 0x40, 0x1a, - 0x1b, 0x10, 0x0, 0x7, 0x80, 0x40, 0x7, 0xf4, - 0x0, 0x0, 0x0, 0x65, 0x2, 0x87, 0x2a, 0xb6, - 0x41, 0x0, 0x8, 0x46, 0x80, 0x0, 0xa9, 0x60, - 0x0, 0x45, 0x3, 0xa5, 0x55, 0xd0, 0x0, 0x7, - 0xe0, 0x4, 0x70, 0x0, 0xb0, 0x0, 0x0, 0xd0, - 0x7, 0x75, 0x55, 0xc0, 0x0, 0x1, 0xd0, 0xa, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x90, 0x54, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x40, 0x0, - - /* U+6E09 "渉" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x73, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x1d, - 0x0, 0x61, 0xa1, 0x0, 0x0, 0x0, 0x2, 0x30, - 0xa0, 0xa6, 0x59, 0x0, 0x26, 0x0, 0x50, 0xa0, - 0xa1, 0x0, 0x0, 0x8, 0x72, 0x55, 0xc5, 0xb6, - 0x56, 0xa0, 0x1, 0x47, 0x1, 0x10, 0x93, 0x0, - 0x0, 0x0, 0x17, 0x0, 0xd1, 0xa1, 0x19, 0x20, - 0x0, 0x82, 0x4, 0x70, 0xa1, 0x31, 0xd0, 0x18, - 0xd0, 0x9, 0x0, 0xa4, 0xd2, 0x30, 0x2, 0xb0, - 0x23, 0x0, 0x6c, 0x10, 0x0, 0x4, 0xb0, 0x0, - 0x8, 0x90, 0x0, 0x0, 0x2, 0x70, 0x6, 0x83, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, - 0x0, 0x0, - - /* U+6E1B "減" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, - 0x60, 0x0, 0x0, 0xc, 0x48, 0x0, 0x0, 0x78, - 0x0, 0x0, 0xb, 0x6, 0x50, 0x0, 0x4, 0x3b, - 0x55, 0x5c, 0x65, 0x92, 0x22, 0x0, 0x4b, 0x0, - 0x9, 0x10, 0x0, 0xb, 0x43, 0x2b, 0x46, 0xba, - 0x22, 0x70, 0x3, 0x56, 0xa, 0x0, 0x17, 0x36, - 0x70, 0x0, 0x16, 0xa, 0x95, 0xc7, 0x6b, 0x10, - 0x0, 0x72, 0xa, 0x90, 0xa2, 0xb9, 0x0, 0x18, - 0xc0, 0xa, 0x90, 0xa0, 0xe2, 0x0, 0x3, 0xa0, - 0x36, 0x95, 0xa6, 0xc5, 0x40, 0x4, 0x90, 0x91, - 0x0, 0x38, 0xc, 0x80, 0x3, 0x82, 0x50, 0x3, - 0x70, 0x3, 0xf3, 0x0, 0x2, 0x0, 0x2, 0x0, - 0x0, 0x12, - - /* U+6E21 "渡" */ - 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, - 0x91, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x59, - 0x9, 0x55, 0x87, 0x55, 0xb1, 0x10, 0x1, 0x1b, - 0x7, 0x10, 0x80, 0x0, 0x1a, 0x10, 0x4b, 0xa, - 0x0, 0xa1, 0x40, 0x6, 0x65, 0xc, 0x5c, 0x55, - 0xc5, 0x40, 0x0, 0x6, 0xb, 0xa, 0x55, 0xb0, - 0x0, 0x0, 0x16, 0xb, 0x5, 0x0, 0x40, 0x0, - 0x0, 0x81, 0x19, 0x37, 0x55, 0xd4, 0x0, 0x18, - 0xd0, 0x46, 0x5, 0x15, 0x90, 0x0, 0x2, 0xb0, - 0x82, 0x0, 0xbb, 0x0, 0x0, 0x4, 0xb0, 0x90, - 0x7, 0x9b, 0x60, 0x0, 0x1, 0x66, 0x25, 0x73, - 0x0, 0x7e, 0xa1, 0x0, 0x1, 0x21, 0x0, 0x0, - 0x0, 0x10, - - /* U+6E29 "温" */ - 0x0, 0x81, 0x7, 0x55, 0x55, 0x91, 0x0, 0x0, - 0x47, 0xa, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, - 0x4b, 0x55, 0x55, 0xb0, 0x0, 0x17, 0x3, 0x1a, - 0x0, 0x0, 0x90, 0x0, 0x7, 0x55, 0xa, 0x0, - 0x0, 0xa0, 0x0, 0x0, 0x7, 0xa, 0x55, 0x55, - 0xa0, 0x0, 0x0, 0x35, 0x20, 0x0, 0x0, 0x3, - 0x0, 0x0, 0x81, 0xb5, 0xb5, 0x5c, 0x5d, 0x0, - 0x28, 0xc0, 0xb0, 0xa0, 0xa, 0xb, 0x0, 0x4, - 0xa0, 0xb0, 0xa0, 0xa, 0xb, 0x0, 0x5, 0x90, - 0xb0, 0xa0, 0xa, 0xb, 0x0, 0x5, 0x95, 0xc5, - 0xb5, 0x5c, 0x5d, 0xb1, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+6E2F "港" */ - 0x0, 0x0, 0x0, 0x20, 0x3, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x94, 0xb, 0x10, 0x0, 0x0, 0x49, - 0x0, 0x92, 0xb, 0x5, 0x0, 0x10, 0x2, 0x26, - 0xb6, 0x5c, 0x55, 0x10, 0xb, 0x24, 0x0, 0x92, - 0xb, 0x0, 0x10, 0x5, 0x65, 0x65, 0xa8, 0x5a, - 0x55, 0x81, 0x0, 0x5, 0x0, 0xb0, 0x3, 0x40, - 0x0, 0x0, 0x42, 0x7, 0xb5, 0x58, 0xb7, 0x0, - 0x0, 0x90, 0x55, 0xb0, 0x7, 0x36, 0xd2, 0x19, - 0xa4, 0x30, 0xc5, 0x59, 0x30, 0x0, 0x4, 0x80, - 0x0, 0xb0, 0x3, 0x13, 0x0, 0x6, 0x80, 0x0, - 0xb0, 0x0, 0x4, 0x30, 0x3, 0x50, 0x0, 0xba, - 0xaa, 0xac, 0x60, - - /* U+6E56 "湖" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x60, 0x3, 0x90, 0x2, 0x0, 0x30, 0x0, 0x94, - 0x13, 0x70, 0xd, 0x55, 0xb0, 0x0, 0x1, 0x45, - 0x85, 0x1b, 0x1, 0x90, 0x44, 0x4, 0x26, 0x82, - 0x1c, 0x55, 0x90, 0xc, 0x25, 0x3, 0x70, 0xa, - 0x1, 0x90, 0x2, 0x6, 0x46, 0x86, 0xa, 0x1, - 0x90, 0x0, 0x43, 0xb2, 0x2a, 0xc, 0x55, 0x90, - 0x0, 0x90, 0xa0, 0xa, 0x19, 0x1, 0x90, 0x29, - 0xb0, 0xa0, 0xa, 0x46, 0x1, 0x90, 0x3, 0x90, - 0xb5, 0x59, 0x90, 0x1, 0x90, 0x5, 0x90, 0x80, - 0x5, 0x40, 0x22, 0x90, 0x2, 0x60, 0x0, 0x44, - 0x0, 0x4e, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6E90 "源" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x91, 0x8, 0x55, 0x55, 0x57, 0xb0, 0x0, 0x68, - 0xc, 0x0, 0xc, 0x10, 0x0, 0x0, 0x1, 0x4c, - 0x2, 0x34, 0x4, 0x0, 0x35, 0x1, 0x3c, 0xc, - 0x55, 0x5c, 0x20, 0xb, 0x65, 0xc, 0xb, 0x0, - 0xb, 0x0, 0x2, 0x26, 0xc, 0xc, 0x55, 0x5c, - 0x0, 0x0, 0x16, 0xb, 0xb, 0x0, 0xb, 0x0, - 0x0, 0x71, 0x29, 0xa, 0x5d, 0x59, 0x0, 0x18, - 0xd0, 0x64, 0x6, 0xc, 0x22, 0x0, 0x2, 0xb0, - 0x90, 0x4a, 0xc, 0xa, 0x50, 0x4, 0xa3, 0x41, - 0x80, 0xc, 0x1, 0xe0, 0x2, 0x85, 0x4, 0x2, - 0x9d, 0x0, 0x30, 0x0, 0x10, 0x0, 0x0, 0x11, - 0x0, 0x0, - - /* U+6E96 "準" */ - 0x0, 0x10, 0x0, 0x10, 0x10, 0x0, 0x0, 0x0, - 0x94, 0x0, 0x95, 0x2a, 0x0, 0x0, 0x0, 0x5, - 0x31, 0xc5, 0x58, 0x59, 0x70, 0x8, 0x30, 0x48, - 0xb0, 0x1a, 0x2, 0x0, 0x1, 0x65, 0x62, 0xc5, - 0x6c, 0x57, 0x20, 0x0, 0x7, 0x10, 0xb0, 0x1a, - 0x15, 0x10, 0x3, 0xb3, 0x0, 0xc5, 0x6b, 0x44, - 0x20, 0x0, 0x91, 0x0, 0xd5, 0x6b, 0x57, 0x90, - 0x0, 0x82, 0x0, 0x46, 0x0, 0x0, 0x0, 0x5, - 0x55, 0x55, 0x7b, 0x55, 0x55, 0xa2, 0x1, 0x0, - 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, - - /* U+6E9D "溝" */ - 0x0, 0x0, 0x0, 0x21, 0x2, 0x10, 0x0, 0x0, - 0x70, 0x0, 0x67, 0x6, 0x70, 0x0, 0x0, 0x69, - 0x36, 0x98, 0x59, 0x87, 0x70, 0x0, 0x4, 0x20, - 0x65, 0x5, 0x54, 0x0, 0x31, 0x0, 0x46, 0x98, - 0x59, 0x85, 0x30, 0xc, 0x25, 0x36, 0x76, 0x97, - 0x75, 0x90, 0x5, 0x36, 0x2, 0x0, 0xb0, 0x3, - 0x0, 0x0, 0x34, 0xb, 0x55, 0xc5, 0x5d, 0x0, - 0x0, 0x90, 0xb, 0x55, 0xc5, 0x5b, 0x0, 0x29, - 0xa0, 0xb, 0x0, 0xb0, 0xb, 0x20, 0x6, 0x70, - 0x6c, 0x55, 0x65, 0x5c, 0x61, 0x7, 0x70, 0xb, - 0x0, 0x0, 0xb, 0x0, 0x5, 0x60, 0xb, 0x0, - 0x5, 0x9a, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, - 0x42, 0x0, - - /* U+6EFF "滿" */ - 0x0, 0x0, 0x0, 0x11, 0x0, 0x30, 0x0, 0x0, - 0x72, 0x0, 0x47, 0x0, 0xc0, 0x0, 0x0, 0x1d, - 0x36, 0x79, 0x55, 0xd5, 0x92, 0x0, 0x3, 0x20, - 0x36, 0x0, 0xb0, 0x0, 0x6, 0x0, 0x40, 0x49, - 0xa5, 0xc0, 0x0, 0x4, 0xb0, 0x50, 0x10, 0xb0, - 0x0, 0x0, 0x0, 0x74, 0x2c, 0x55, 0xc5, 0x58, - 0x90, 0x0, 0x7, 0xb, 0x61, 0xb3, 0x54, 0x60, - 0x0, 0x27, 0xb, 0x3b, 0xb0, 0xd8, 0x60, 0x5, - 0xd3, 0xb, 0x79, 0xd5, 0x6e, 0x60, 0x0, 0xc0, - 0xc, 0x11, 0xb3, 0x6, 0x60, 0x0, 0xe0, 0xb, - 0x0, 0xb0, 0x4, 0x60, 0x0, 0x90, 0xb, 0x0, - 0xb0, 0x5b, 0x50, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x5, 0x0, - - /* U+6F22 "漢" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x20, 0x0, 0x0, - 0x81, 0x0, 0xb0, 0x1, 0xa0, 0x40, 0x0, 0x4a, - 0x36, 0xc5, 0x56, 0xb5, 0x50, 0x0, 0x3, 0x31, - 0xb5, 0x56, 0x90, 0x0, 0x14, 0x0, 0x50, 0x40, - 0xa0, 0x31, 0x0, 0x9, 0x61, 0x4c, 0x55, 0xc5, - 0x5c, 0x0, 0x1, 0x56, 0xb, 0x0, 0xa0, 0xa, - 0x0, 0x0, 0x7, 0xa, 0x55, 0xc5, 0x58, 0x0, - 0x0, 0x63, 0x6, 0x55, 0xc5, 0x68, 0x0, 0x17, - 0xd0, 0x0, 0x1, 0x90, 0x0, 0x40, 0x1, 0xb0, - 0x65, 0x5a, 0x89, 0x55, 0x51, 0x2, 0xb0, 0x0, - 0x39, 0x5, 0x70, 0x0, 0x1, 0x80, 0x6, 0x70, - 0x0, 0x4d, 0x92, 0x0, 0x0, 0x41, 0x0, 0x0, - 0x0, 0x10, - - /* U+6F38 "漸" */ - 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x92, 0x0, 0xc0, 0x0, 0x16, 0xc2, 0x0, 0x4a, - 0x65, 0xc5, 0x99, 0x51, 0x0, 0x0, 0x1, 0x10, - 0xb0, 0x28, 0x10, 0x0, 0x26, 0x4, 0xb5, 0xc5, - 0xd8, 0x10, 0x50, 0x8, 0x75, 0xb0, 0xb0, 0xb8, - 0x6c, 0x51, 0x1, 0x45, 0xb5, 0xc5, 0xb8, 0x1b, - 0x0, 0x0, 0x52, 0xb0, 0xb0, 0xb8, 0x1b, 0x0, - 0x0, 0xa0, 0x95, 0xc5, 0x69, 0xb, 0x0, 0x29, - 0xa3, 0x55, 0xc5, 0xa9, 0xb, 0x0, 0x4, 0x80, - 0x0, 0xb0, 0x9, 0xb, 0x0, 0x6, 0x80, 0x0, - 0xb0, 0x44, 0xb, 0x0, 0x4, 0x60, 0x0, 0xc1, - 0x60, 0xb, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, - 0x4, 0x0, - - /* U+6FC3 "濃" */ - 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x1, - 0x60, 0x2, 0xa, 0xa, 0x3, 0x0, 0x0, 0x78, - 0xb, 0x5c, 0x5c, 0x5c, 0x20, 0x0, 0x4, 0x4b, - 0x5c, 0x5c, 0x5c, 0x0, 0x7, 0x11, 0x4b, 0xa, - 0xa, 0xb, 0x0, 0x3, 0xc5, 0x18, 0x55, 0x55, - 0x58, 0x0, 0x0, 0x57, 0x1c, 0x55, 0x55, 0x56, - 0x30, 0x0, 0x26, 0xb, 0x45, 0x55, 0x57, 0x0, - 0x1, 0xa2, 0xc, 0x55, 0x55, 0x55, 0x90, 0x5, - 0xe0, 0x1a, 0x73, 0x60, 0x36, 0x0, 0x0, 0xc0, - 0x37, 0x73, 0x39, 0x71, 0x0, 0x1, 0xd0, 0x81, - 0x75, 0x55, 0xb4, 0x10, 0x0, 0x42, 0x40, 0x77, - 0x0, 0x2a, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+6FDF "濟" */ - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x2, - 0x60, 0x0, 0x1, 0xb0, 0x0, 0x10, 0x0, 0x95, - 0x46, 0x56, 0x66, 0x57, 0x80, 0x0, 0x12, 0x30, - 0xa, 0x2b, 0x15, 0x10, 0x27, 0x4, 0x3a, 0x98, - 0x93, 0x68, 0x10, 0x8, 0x76, 0xa, 0x64, 0xb4, - 0x68, 0x0, 0x0, 0x45, 0x36, 0x92, 0xa5, 0x97, - 0xa1, 0x0, 0x61, 0x65, 0x90, 0x62, 0x43, 0x61, - 0x0, 0xa0, 0xa, 0x75, 0x55, 0x5d, 0x0, 0x1a, - 0x90, 0xa, 0x10, 0x0, 0xc, 0x0, 0x5, 0x70, - 0xb, 0x55, 0x55, 0x5c, 0x0, 0x6, 0x70, 0x18, - 0x0, 0x0, 0xc, 0x0, 0x3, 0x41, 0x80, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x3, 0x0, - - /* U+7063 "灣" */ - 0x0, 0x0, 0x2, 0x1, 0x20, 0x2, 0x0, 0x2, - 0x50, 0x28, 0x10, 0x92, 0x9, 0x40, 0x0, 0xa4, - 0x97, 0x66, 0x57, 0x96, 0xa0, 0x0, 0x23, 0x34, - 0x26, 0x87, 0x17, 0x30, 0x16, 0x4, 0xa7, 0xa5, - 0x35, 0x89, 0x75, 0x7, 0x75, 0x33, 0x3a, 0x5b, - 0x23, 0x30, 0x1, 0x57, 0x99, 0x8a, 0x5b, 0x94, - 0x86, 0x0, 0x52, 0x16, 0x58, 0x57, 0x6a, 0x10, - 0x0, 0x90, 0x3, 0x22, 0x22, 0x2b, 0x0, 0x18, - 0xa0, 0xb, 0x33, 0x33, 0x37, 0x0, 0x4, 0x80, - 0x18, 0x55, 0x55, 0x5b, 0x50, 0x5, 0x70, 0x0, - 0x0, 0x0, 0xb, 0x0, 0x4, 0x70, 0x0, 0x0, - 0x17, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+706B "火" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb3, 0x0, 0x10, 0x0, 0x0, 0x4, 0x0, 0xb3, - 0x0, 0xb6, 0x0, 0x0, 0x18, 0x0, 0xc3, 0x6, - 0x80, 0x0, 0x1, 0xc4, 0x0, 0xd4, 0x36, 0x0, - 0x0, 0x4, 0x70, 0x1, 0xc4, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x70, 0x80, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x47, 0x0, 0x0, 0x0, 0x0, - 0x85, 0x0, 0x9, 0x70, 0x0, 0x0, 0x8, 0x60, - 0x0, 0x0, 0xab, 0x40, 0x4, 0x72, 0x0, 0x0, - 0x0, 0x8, 0x80, 0x21, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+707D "災" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0xb, 0x40, 0x59, 0x0, 0xa5, 0x0, 0x0, 0x45, - 0x0, 0x90, 0x3, 0x60, 0x0, 0x0, 0x70, 0x6, - 0x0, 0x7, 0x0, 0x0, 0x0, 0x67, 0x3, 0x90, - 0x6, 0x60, 0x0, 0x0, 0xb, 0x20, 0x58, 0x0, - 0x94, 0x0, 0x0, 0x1, 0x0, 0x32, 0x0, 0x11, - 0x0, 0x0, 0x2, 0x0, 0xa7, 0x0, 0x10, 0x0, - 0x0, 0x9, 0x0, 0xc6, 0x3, 0xb0, 0x0, 0x0, - 0x7a, 0x2, 0xb3, 0x76, 0x0, 0x0, 0x0, 0x10, - 0xb, 0x40, 0x82, 0x0, 0x0, 0x0, 0x0, 0x97, - 0x0, 0xc, 0x60, 0x0, 0x1, 0x69, 0x30, 0x0, - 0x0, 0x9e, 0x81, 0x13, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+70B9 "点" */ - 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc5, 0x55, 0x6c, 0x10, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xc5, 0x59, 0x55, 0x5e, 0x10, 0x0, - 0xd, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0xd, 0x55, 0x55, - 0x55, 0xc0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x8, - 0x0, 0x0, 0x30, 0x12, 0x2, 0x10, 0x14, 0x0, - 0x9, 0x0, 0xb1, 0xc, 0x0, 0x85, 0x9, 0x70, - 0x7, 0x10, 0x81, 0x2, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+70BA "為" */ - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xa0, 0x6a, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x61, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x75, 0x56, - 0xc5, 0x56, 0xb0, 0x0, 0x0, 0x0, 0x9, 0x30, - 0x6, 0x50, 0x0, 0x0, 0x0, 0x1c, 0x55, 0x59, - 0x6d, 0x10, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x47, - 0x0, 0x0, 0x6, 0x95, 0x55, 0x55, 0x96, 0xc1, - 0x0, 0x38, 0x0, 0x1, 0x3, 0x0, 0xb0, 0x2, - 0x72, 0x27, 0x6, 0x62, 0xa2, 0xa0, 0x13, 0xa, - 0x4, 0x90, 0xb0, 0x64, 0x80, 0x0, 0x6b, 0x0, - 0x50, 0x0, 0x7, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x8e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x0, - - /* U+7121 "無" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x86, - 0x56, 0x56, 0xa2, 0x0, 0x6, 0xd0, 0xa0, 0xa0, - 0xb0, 0x0, 0x2, 0x3a, 0xa, 0xa, 0xb, 0x0, - 0x0, 0x0, 0xa0, 0xa0, 0xa0, 0xb0, 0x70, 0x2, - 0x6c, 0x5c, 0x5c, 0x5c, 0x55, 0x10, 0x0, 0xa0, - 0xa0, 0xa0, 0xb0, 0x0, 0x0, 0xa, 0xa, 0xa, - 0xb, 0x3, 0x0, 0x65, 0x85, 0x85, 0x85, 0x85, - 0x93, 0x0, 0x40, 0x23, 0x1, 0x50, 0x16, 0x0, - 0x1a, 0x0, 0xb1, 0x9, 0x40, 0x86, 0xc, 0x50, - 0x8, 0x30, 0x35, 0x2, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+7136 "然" */ - 0x0, 0x3, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0xe, 0x20, 0x0, 0xb2, 0x50, 0x0, 0x0, 0x49, - 0x2, 0x20, 0xb1, 0x4b, 0x0, 0x0, 0xa6, 0x5a, - 0x80, 0xb0, 0x7, 0x0, 0x2, 0xa9, 0x2b, 0x56, - 0xd6, 0x5b, 0x40, 0x8, 0x73, 0x6b, 0x0, 0xc5, - 0x0, 0x0, 0x32, 0x67, 0x74, 0x1, 0xa5, 0x30, - 0x0, 0x0, 0x3, 0xa0, 0x8, 0x30, 0xb1, 0x0, - 0x0, 0x2a, 0x0, 0x57, 0x0, 0x4d, 0x40, 0x4, - 0x70, 0x5, 0x30, 0x0, 0x6, 0x50, 0x11, 0x40, - 0x31, 0x4, 0x10, 0x34, 0x0, 0x1, 0xa0, 0x1c, - 0x1, 0xc0, 0xb, 0x40, 0xb, 0x70, 0xc, 0x0, - 0xa0, 0x4, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7159 "煙" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x2, 0x65, 0x55, 0x55, 0xb3, 0x0, 0xc, - 0x0, 0x0, 0xb0, 0xb0, 0x0, 0x0, 0xc, 0x27, - 0x75, 0xc5, 0xd5, 0x90, 0x2, 0x1c, 0x92, 0xa0, - 0xb0, 0xb0, 0xb0, 0x8, 0x2d, 0x10, 0xa0, 0xb0, - 0xb0, 0xb0, 0x1d, 0xb, 0x0, 0xa0, 0xb0, 0xb0, - 0xb0, 0x0, 0xb, 0x0, 0xa5, 0x5a, 0x55, 0x60, - 0x0, 0x1b, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x39, 0xa2, 0x55, 0x5c, 0x59, 0x60, 0x0, 0x73, - 0x3b, 0x0, 0xb, 0x0, 0x0, 0x0, 0xa0, 0x2, - 0x0, 0xb, 0x0, 0x0, 0x7, 0x20, 0x5, 0x55, - 0x5c, 0x55, 0x97, 0x12, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+71B1 "熱" */ - 0x0, 0x0, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x65, - 0xc6, 0x80, 0xb, 0x4, 0x0, 0x0, 0x0, 0xb0, - 0x24, 0x5c, 0x79, 0x0, 0x4, 0x77, 0x76, 0x72, - 0x19, 0x36, 0x0, 0x0, 0x96, 0x37, 0x92, 0x48, - 0x36, 0x0, 0x6, 0x20, 0xc0, 0x70, 0xb9, 0x38, - 0x0, 0x0, 0x65, 0xc7, 0x70, 0xb9, 0x6b, 0x2, - 0x0, 0x0, 0xb3, 0x46, 0x30, 0x18, 0xa2, 0x4, - 0xba, 0x62, 0x23, 0x0, 0x0, 0xb2, 0x1, 0x23, - 0x5, 0x1, 0x40, 0x24, 0x0, 0x0, 0x92, 0x7, - 0x50, 0xa3, 0xb, 0x40, 0x7, 0xa0, 0x2, 0x60, - 0x33, 0x4, 0x60, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+71DF "營" */ - 0x0, 0x0, 0x30, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x2b, 0x15, 0x2, 0xa1, 0x30, 0x0, 0x63, 0xc7, - 0x37, 0x4a, 0x84, 0x0, 0x6, 0x2c, 0x63, 0x86, - 0x94, 0x0, 0x0, 0x9, 0x12, 0x92, 0x90, 0x6b, - 0x0, 0x5, 0x22, 0x22, 0x62, 0x22, 0x64, 0x4, - 0x73, 0x43, 0x33, 0x36, 0x3a, 0x60, 0xa1, 0xc, - 0x55, 0x55, 0xd2, 0x30, 0x0, 0x0, 0xc5, 0x55, - 0x5c, 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, 0x32, - 0x0, 0x0, 0xd, 0x55, 0x55, 0x55, 0xd2, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x0, 0xd, - 0x55, 0x55, 0x55, 0xd0, 0x0, 0x0, 0x70, 0x0, - 0x0, 0x5, 0x0, - - /* U+722D "爭" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x2, 0x35, 0x7a, 0xdc, 0x0, 0x1, 0x54, 0x47, - 0x21, 0x2, 0x50, 0x0, 0x8, 0x50, 0x3a, 0x0, - 0x94, 0x0, 0x0, 0x9, 0x0, 0x60, 0x53, 0x0, - 0x0, 0x5, 0x55, 0x57, 0x56, 0x5c, 0x0, 0x0, - 0x0, 0x1, 0x90, 0x1, 0xa0, 0x13, 0x65, 0x55, - 0x6b, 0x55, 0x5c, 0x86, 0x0, 0x0, 0x1, 0x90, - 0x1, 0xa0, 0x0, 0x6, 0x55, 0x6b, 0x55, 0x5a, - 0x0, 0x0, 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x8e, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, - 0x0, 0x0, 0x0, - - /* U+7236 "父" */ - 0x0, 0x0, 0x47, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x1, 0xd5, 0x0, 0x7, 0x60, 0x0, 0x0, 0xb, - 0x30, 0x0, 0x0, 0x7c, 0x0, 0x1, 0x81, 0x10, - 0x0, 0x5, 0x9, 0x50, 0x14, 0x0, 0x50, 0x0, - 0x1d, 0x10, 0x0, 0x0, 0x0, 0x52, 0x0, 0x85, - 0x0, 0x0, 0x0, 0x0, 0x9, 0x1, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x8a, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x76, 0xc3, 0x0, 0x0, 0x0, 0x2, - 0x94, 0x0, 0x3c, 0xc7, 0x30, 0x3, 0x75, 0x0, - 0x0, 0x0, 0x4a, 0x91, 0x12, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+7238 "爸" */ - 0x0, 0x0, 0x20, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x1, 0xc4, 0x0, 0x6, 0x91, 0x0, 0x0, 0x29, - 0x41, 0x0, 0x77, 0x4d, 0x0, 0x3, 0x50, 0x7, - 0x39, 0x80, 0x2, 0x0, 0x0, 0x0, 0x4, 0xda, - 0x10, 0x0, 0x0, 0x0, 0x5, 0x96, 0x2, 0x8a, - 0x97, 0x63, 0x15, 0x68, 0x55, 0x55, 0x55, 0xb5, - 0x50, 0x0, 0xb, 0x0, 0xb0, 0x1, 0xa0, 0x0, - 0x0, 0xb, 0x0, 0xb0, 0x1, 0x90, 0x0, 0x0, - 0xb, 0x55, 0x85, 0x56, 0x90, 0x0, 0x0, 0xb, - 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0xb, 0x0, - 0x0, 0x0, 0x5, 0x30, 0x0, 0x7, 0xba, 0xaa, - 0xaa, 0xad, 0x60, - - /* U+7247 "片" */ - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - 0x64, 0x0, 0xd, 0x0, 0x0, 0x0, 0x8, 0x40, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x83, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x8, 0x75, 0x55, 0xd5, 0x5b, - 0x70, 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb6, - 0x55, 0x55, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x1b, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x1, 0xb0, - 0x0, 0x0, 0x83, 0x0, 0x0, 0x1b, 0x0, 0x0, - 0x28, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x6, 0x0, - 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, - - /* U+725B "牛" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x4c, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x9, 0x50, 0xc, 0x0, - 0x17, 0x0, 0x0, 0xc5, 0x55, 0xd5, 0x55, 0x51, - 0x0, 0x73, 0x0, 0xc, 0x0, 0x0, 0x0, 0x15, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x4, 0x55, 0x55, - 0x5d, 0x55, 0x59, 0xc1, 0x10, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+7260 "牠" */ - 0x0, 0x2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0xc, 0x20, 0x0, 0xd, 0x0, 0x0, 0x5, 0x5b, - 0x0, 0x40, 0xb, 0x0, 0x0, 0x9, 0x4b, 0x0, - 0xb2, 0xb, 0x3, 0x0, 0xb, 0x5c, 0x93, 0xb0, - 0xc, 0x5c, 0x20, 0x8, 0xb, 0x5, 0xc5, 0x4b, - 0xa, 0x0, 0x51, 0xb, 0x1, 0xb0, 0xb, 0xb, - 0x0, 0x20, 0xb, 0x22, 0xb0, 0xb, 0xb, 0x0, - 0x0, 0x3d, 0x40, 0xb0, 0xb, 0x5c, 0x0, 0x2b, - 0x6b, 0x0, 0xb0, 0xb, 0x56, 0x0, 0x2, 0xb, - 0x0, 0xb0, 0xb, 0x0, 0x40, 0x0, 0xb, 0x0, - 0xb0, 0x0, 0x2, 0x70, 0x0, 0xb, 0x0, 0x5b, - 0x99, 0x9b, 0x90, 0x0, 0x7, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7269 "物" */ - 0x0, 0x2, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x20, 0xd, 0x30, 0x0, 0x0, 0x6, 0x7b, - 0x0, 0x2b, 0x0, 0x0, 0x0, 0x9, 0x2b, 0x11, - 0x88, 0x95, 0x95, 0xd1, 0xb, 0x5c, 0x66, 0x90, - 0xc0, 0xd0, 0xc0, 0x24, 0xb, 0x6, 0x15, 0x61, - 0xb0, 0xc0, 0x30, 0xb, 0x2, 0xa, 0x6, 0x70, - 0xc0, 0x0, 0xc, 0x62, 0x64, 0xb, 0x11, 0xb0, - 0x18, 0x9d, 0x2, 0x60, 0x3a, 0x2, 0xa0, 0x15, - 0xb, 0x4, 0x0, 0xb1, 0x4, 0x80, 0x0, 0xb, - 0x0, 0x8, 0x30, 0x6, 0x70, 0x0, 0xb, 0x0, - 0x63, 0x14, 0x2c, 0x30, 0x0, 0xb, 0x4, 0x0, - 0x3, 0xf8, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7279 "特" */ - 0x0, 0x4, 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, - 0xc, 0x10, 0x0, 0xc0, 0x0, 0x0, 0x7, 0x3c, - 0x0, 0x55, 0xd5, 0x6b, 0x0, 0xb, 0x1c, 0x0, - 0x10, 0xc0, 0x0, 0x0, 0xc, 0x5d, 0x6a, 0x0, - 0xc0, 0x0, 0x20, 0x26, 0xc, 0x5, 0x55, 0x95, - 0x56, 0xa1, 0x40, 0xc, 0x2, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0xc, 0x75, 0x55, 0x55, 0xd5, 0xc2, - 0x18, 0xbd, 0x0, 0x30, 0x0, 0xc0, 0x0, 0x7, - 0xc, 0x0, 0x66, 0x0, 0xc0, 0x0, 0x0, 0xc, - 0x0, 0x1c, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, - 0x2, 0x11, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x5e, 0x70, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+72AC "犬" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe2, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe0, 0x4a, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xd0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x30, 0x30, 0x6, 0x55, 0x56, 0xd7, 0x55, - 0x57, 0x91, 0x0, 0x0, 0x4, 0x95, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x65, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x11, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x2b, 0x0, 0x74, 0x0, 0x0, 0x0, 0x0, - 0xb2, 0x0, 0xc, 0x30, 0x0, 0x0, 0xa, 0x40, - 0x0, 0x1, 0xe8, 0x10, 0x3, 0x81, 0x0, 0x0, - 0x0, 0x1c, 0xb1, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+72AF "犯" */ - 0x1, 0x10, 0xb, 0x21, 0x0, 0x3, 0x0, 0x0, - 0x54, 0x88, 0xd, 0x55, 0x5d, 0x20, 0x0, 0xa, - 0x80, 0xc, 0x0, 0xc, 0x0, 0x0, 0x47, 0x80, - 0xc, 0x0, 0xc, 0x0, 0x5, 0x40, 0xb0, 0xc, - 0x0, 0xc, 0x0, 0x0, 0x3, 0xf0, 0xc, 0x0, - 0xc, 0x0, 0x0, 0xa, 0xa2, 0xc, 0x5, 0x4d, - 0x0, 0x0, 0x82, 0x93, 0xc, 0x1, 0xb7, 0x0, - 0x6, 0x20, 0xa2, 0xc, 0x0, 0x0, 0x10, 0x0, - 0x0, 0xb1, 0xc, 0x0, 0x0, 0x60, 0x0, 0x0, - 0xd0, 0xc, 0x0, 0x0, 0xb1, 0x1, 0x8d, 0x50, - 0x8, 0xcb, 0xbb, 0xd2, 0x0, 0x3, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+72B6 "状" */ - 0x0, 0x0, 0x10, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xe1, 0x0, 0xc2, 0x40, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0xc0, 0x4d, 0x0, 0x6, 0x20, 0xc0, - 0x0, 0xc0, 0x8, 0x0, 0x1, 0xe0, 0xc0, 0x0, - 0xc0, 0x0, 0x70, 0x0, 0x91, 0xc5, 0x65, 0xd8, - 0x55, 0x61, 0x0, 0x0, 0xc0, 0x0, 0xc6, 0x0, - 0x0, 0x0, 0x6, 0xc0, 0x1, 0xa5, 0x10, 0x0, - 0x2, 0xa1, 0xc0, 0x5, 0x71, 0x70, 0x0, 0xd, - 0x20, 0xc0, 0xa, 0x10, 0xb0, 0x0, 0x0, 0x0, - 0xc0, 0x1a, 0x0, 0x6a, 0x0, 0x0, 0x0, 0xc0, - 0x91, 0x0, 0xd, 0x90, 0x0, 0x0, 0xd5, 0x30, - 0x0, 0x2, 0xc4, 0x0, 0x0, 0x21, 0x0, 0x0, - 0x0, 0x0, - - /* U+72C0 "狀" */ - 0x0, 0x0, 0x10, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x40, 0xb2, 0x0, 0xb3, 0x30, 0x0, 0x0, 0xc0, - 0xb0, 0x0, 0xb1, 0x3a, 0x0, 0x0, 0xb0, 0xb0, - 0x0, 0xb1, 0x8, 0x0, 0x0, 0xb0, 0xb1, 0x22, - 0xb3, 0x23, 0x90, 0x2, 0x95, 0xc1, 0x32, 0xc7, - 0x22, 0x20, 0x0, 0x0, 0xb0, 0x0, 0xb7, 0x0, - 0x0, 0x3, 0x55, 0xc0, 0x0, 0xb6, 0x20, 0x0, - 0x0, 0x82, 0xb0, 0x4, 0x72, 0x80, 0x0, 0x0, - 0xa0, 0xb0, 0x9, 0x20, 0xb1, 0x0, 0x0, 0x90, - 0xb0, 0x1a, 0x0, 0x5b, 0x0, 0x5, 0x30, 0xb0, - 0x91, 0x0, 0xb, 0xa0, 0x5, 0x0, 0xb5, 0x30, - 0x0, 0x1, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+72EC "独" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x3, - 0x20, 0x79, 0x0, 0xd, 0x0, 0x0, 0x0, 0x76, - 0xb0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x1e, 0x30, - 0x85, 0x5d, 0x59, 0x20, 0x1, 0x85, 0x60, 0xc0, - 0xc, 0xc, 0x0, 0x15, 0x3, 0xb0, 0xc0, 0xc, - 0xc, 0x0, 0x0, 0xb, 0xc0, 0xc0, 0xc, 0xc, - 0x0, 0x0, 0x57, 0xb0, 0xc0, 0xc, 0xc, 0x0, - 0x1, 0xa0, 0xc0, 0xd5, 0x5d, 0x5c, 0x0, 0x7, - 0x0, 0xc0, 0x10, 0xc, 0x2, 0x0, 0x10, 0x0, - 0xd0, 0x0, 0xc, 0x8, 0x20, 0x0, 0x2, 0xb1, - 0x24, 0x5d, 0x65, 0xd0, 0x0, 0x8e, 0x35, 0xc7, - 0x30, 0x0, 0x90, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+72ED "狭" */ - 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x3, - 0x0, 0xb1, 0x4, 0xa0, 0x0, 0x0, 0x1, 0x87, - 0x50, 0x3, 0x80, 0x2, 0x0, 0x0, 0x7a, 0x6, - 0x57, 0xa5, 0x5a, 0x20, 0x4, 0x5a, 0x2, 0x3, - 0x80, 0x62, 0x0, 0x22, 0xa, 0x31, 0xb4, 0x70, - 0xb1, 0x0, 0x0, 0x2e, 0x50, 0xc5, 0x75, 0x20, - 0x0, 0x0, 0x95, 0x85, 0x68, 0x96, 0x59, 0x90, - 0x6, 0x33, 0x81, 0x8, 0x44, 0x0, 0x0, 0x32, - 0x4, 0x80, 0xc, 0x7, 0x0, 0x0, 0x0, 0x6, - 0x70, 0x56, 0x4, 0x70, 0x0, 0x3, 0x4c, 0x22, - 0xa0, 0x0, 0x98, 0x0, 0x0, 0xa5, 0x56, 0x0, - 0x0, 0x9, 0x90, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+732B "猫" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x10, 0x0, 0x4, - 0x0, 0x67, 0xc, 0x20, 0xe1, 0x0, 0x0, 0x75, - 0xb0, 0xc, 0x0, 0xc0, 0x10, 0x0, 0x1e, 0x26, - 0x5d, 0x55, 0xd5, 0xb1, 0x1, 0x84, 0x60, 0xc, - 0x0, 0xc0, 0x0, 0x4, 0x3, 0xb0, 0x7, 0x0, - 0x61, 0x0, 0x0, 0xa, 0xb1, 0xb5, 0x77, 0x5a, - 0x60, 0x0, 0x46, 0xb1, 0x90, 0x56, 0x7, 0x40, - 0x1, 0x80, 0xb1, 0x90, 0x56, 0x7, 0x40, 0x15, - 0x0, 0xb1, 0xb5, 0x99, 0x5a, 0x40, 0x10, 0x0, - 0xc1, 0x90, 0x56, 0x7, 0x40, 0x1, 0x37, 0x81, - 0xb5, 0x99, 0x5a, 0x40, 0x0, 0x4c, 0x1, 0x80, - 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+733F "猿" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x3, - 0x0, 0x83, 0x0, 0xc2, 0x1, 0x0, 0x1, 0x74, - 0xb1, 0x65, 0xd5, 0x69, 0x0, 0x0, 0x3e, 0x0, - 0x0, 0xc0, 0x0, 0x50, 0x1, 0x8a, 0x26, 0x55, - 0x65, 0x55, 0x60, 0x15, 0x7, 0x50, 0xb5, 0x55, - 0x5c, 0x0, 0x0, 0xd, 0x80, 0xb0, 0x0, 0xb, - 0x0, 0x0, 0x66, 0xa0, 0xd5, 0x76, 0x5b, 0x0, - 0x1, 0x81, 0xb0, 0x29, 0x46, 0x4, 0xb0, 0x7, - 0x2, 0xb0, 0x68, 0x8, 0x67, 0x0, 0x10, 0x4, - 0xa5, 0x97, 0x1, 0xc0, 0x0, 0x0, 0x8, 0x80, - 0x46, 0x42, 0x5c, 0x30, 0x1, 0x9e, 0x0, 0x5c, - 0x20, 0x4, 0xb2, 0x0, 0x1, 0x0, 0x1, 0x0, - 0x0, 0x0, - - /* U+7372 "獲" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x10, 0x0, 0x2, - 0x0, 0x63, 0x9, 0x20, 0xa3, 0x40, 0x2, 0x82, - 0xb4, 0x6b, 0x65, 0xb6, 0x61, 0x0, 0x2e, 0x10, - 0x55, 0x37, 0x30, 0x0, 0x0, 0x9a, 0x10, 0xd6, - 0x5a, 0x58, 0x50, 0x6, 0x16, 0x56, 0xc3, 0x3c, - 0x38, 0x0, 0x0, 0xb, 0x93, 0xb2, 0x2b, 0x27, - 0x0, 0x0, 0x48, 0xa0, 0xc5, 0x5c, 0x55, 0x40, - 0x0, 0x90, 0xb0, 0xc5, 0x56, 0x55, 0x60, 0x7, - 0x10, 0xb0, 0x66, 0x55, 0x7b, 0x0, 0x11, 0x1, - 0xa0, 0x5, 0x31, 0xb2, 0x0, 0x0, 0x4, 0x80, - 0x0, 0x9d, 0x20, 0x0, 0x1, 0x8d, 0x30, 0x17, - 0x86, 0xb7, 0x52, 0x0, 0x25, 0x14, 0x40, 0x0, - 0x4, 0x50, - - /* U+73A9 "玩" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x55, 0x6a, 0x15, 0x55, 0x59, 0x50, 0x1, 0xd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x31, 0x5, 0x5e, 0x95, 0x68, 0x75, - 0xa5, 0x85, 0x0, 0xd, 0x0, 0x8, 0x40, 0xc0, - 0x0, 0x0, 0xd, 0x0, 0xa, 0x20, 0xc0, 0x0, - 0x0, 0xd, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x0, - 0xd, 0x34, 0x1b, 0x0, 0xc0, 0x0, 0x16, 0x99, - 0x20, 0x75, 0x0, 0xc0, 0x22, 0x9, 0x10, 0x3, - 0xa0, 0x0, 0xc0, 0x44, 0x0, 0x0, 0x57, 0x0, - 0x0, 0xba, 0xd8, 0x0, 0x2, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+73FE "現" */ - 0x4, 0x55, 0x68, 0x85, 0x55, 0x58, 0x30, 0x1, - 0xb, 0x0, 0xb0, 0x0, 0x8, 0x20, 0x0, 0xb, - 0x0, 0xb5, 0x55, 0x5a, 0x20, 0x0, 0xb, 0x0, - 0xb0, 0x0, 0x8, 0x20, 0x0, 0xb, 0x23, 0xb4, - 0x44, 0x4a, 0x20, 0x4, 0x6c, 0x53, 0xb0, 0x0, - 0x8, 0x20, 0x0, 0xb, 0x0, 0xb5, 0x55, 0x5a, - 0x20, 0x0, 0xb, 0x0, 0x82, 0xb0, 0xa4, 0x10, - 0x0, 0xb, 0x1, 0x6, 0x60, 0xa0, 0x0, 0x1, - 0x4d, 0x53, 0xc, 0x10, 0xa0, 0x40, 0x1c, 0x60, - 0x0, 0x76, 0x0, 0xa0, 0x70, 0x0, 0x0, 0x7, - 0x50, 0x0, 0xca, 0xd4, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x0, 0x0, - - /* U+7403 "球" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0x18, 0x10, 0x6, 0x57, - 0x77, 0x0, 0x1b, 0x6, 0x60, 0x0, 0x1a, 0x2, - 0x55, 0x6c, 0x55, 0xc4, 0x0, 0x1a, 0x0, 0x0, - 0x1d, 0x0, 0x0, 0x0, 0x1a, 0x13, 0x70, 0x1e, - 0x11, 0xb0, 0x5, 0x6c, 0x64, 0x96, 0x1b, 0x69, - 0x30, 0x0, 0x1a, 0x0, 0x12, 0x1b, 0x91, 0x0, - 0x0, 0x1a, 0x0, 0x2, 0x7b, 0x38, 0x0, 0x0, - 0x1c, 0x65, 0x87, 0x1b, 0xb, 0x60, 0xa, 0xb4, - 0x8, 0x50, 0x1b, 0x1, 0xe7, 0x4, 0x0, 0x0, - 0x1, 0x2a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x5, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+7406 "理" */ - 0x0, 0x0, 0x0, 0x53, 0x33, 0x37, 0x10, 0x6, - 0x58, 0x85, 0xb1, 0x1b, 0x1b, 0x0, 0x0, 0xb, - 0x0, 0xa0, 0xa, 0xa, 0x0, 0x0, 0xb, 0x0, - 0xb5, 0x5c, 0x5c, 0x0, 0x0, 0xb, 0x21, 0xa0, - 0xa, 0xa, 0x0, 0x6, 0x6d, 0x74, 0xb0, 0xa, - 0xa, 0x0, 0x0, 0xb, 0x0, 0xb5, 0x5c, 0x5a, - 0x0, 0x0, 0xb, 0x0, 0x0, 0xa, 0x0, 0x0, - 0x0, 0xc, 0x54, 0x55, 0x5c, 0x5a, 0x20, 0x7, - 0xb8, 0x10, 0x0, 0xa, 0x0, 0x0, 0x6, 0x0, - 0x0, 0x0, 0xa, 0x0, 0x40, 0x0, 0x0, 0x36, - 0x55, 0x56, 0x55, 0x71, - - /* U+74B0 "環" */ - 0x0, 0x0, 0x40, 0x75, 0x55, 0x57, 0x40, 0x6, - 0x6b, 0x52, 0xa0, 0x90, 0x95, 0x30, 0x0, 0x19, - 0x0, 0xc5, 0xa5, 0xa8, 0x30, 0x0, 0x19, 0x0, - 0x20, 0x0, 0x0, 0x40, 0x4, 0x6b, 0xa6, 0x55, - 0x55, 0x55, 0x50, 0x1, 0x29, 0x0, 0x85, 0x55, - 0x5b, 0x0, 0x0, 0x19, 0x0, 0xa1, 0x0, 0x9, - 0x0, 0x0, 0x19, 0x0, 0xa6, 0xb7, 0x58, 0x20, - 0x0, 0x1a, 0x52, 0xa, 0x37, 0x16, 0x90, 0x9, - 0xb6, 0x0, 0x8d, 0x1, 0xc2, 0x0, 0x3, 0x0, - 0x26, 0x1b, 0x14, 0x2c, 0x60, 0x0, 0x0, 0x0, - 0xc, 0x80, 0x1, 0x70, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, - - /* U+7518 "甘" */ - 0x0, 0x0, 0x40, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0xe0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0xc, 0x2, 0x80, 0x6, 0x55, 0xd5, 0x55, - 0x5d, 0x55, 0x51, 0x0, 0x0, 0xc0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0xd5, 0x55, 0x5d, 0x0, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xe5, - 0x55, 0x5d, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0xb, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+751A "甚" */ - 0x0, 0x0, 0x40, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0xc, 0x10, 0x0, 0x2, 0x65, - 0xd5, 0x55, 0x5d, 0x5a, 0x50, 0x0, 0x0, 0xc0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x55, - 0x5d, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x0, 0xc5, 0x55, 0x5d, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0xc, 0x0, 0x20, - 0x17, 0x5a, 0x85, 0x55, 0x58, 0x55, 0x91, 0x0, - 0xc, 0x1, 0xc0, 0x35, 0x0, 0x0, 0x0, 0xc, - 0x9, 0x40, 0x7, 0xb0, 0x0, 0x0, 0xc, 0x64, - 0x0, 0x0, 0x90, 0x0, 0x0, 0xe, 0x75, 0x55, - 0x55, 0x5d, 0x30, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+751F "生" */ - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x10, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x80, 0x2a, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x2a, 0x0, 0x5, 0x0, 0x0, 0x49, 0x55, 0x6c, - 0x55, 0x58, 0x30, 0x0, 0x90, 0x0, 0x2a, 0x0, - 0x0, 0x0, 0x2, 0x50, 0x0, 0x2a, 0x0, 0x0, - 0x0, 0x5, 0x0, 0x0, 0x2a, 0x0, 0x54, 0x0, - 0x0, 0x5, 0x55, 0x6c, 0x55, 0x54, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2a, 0x0, 0x0, 0x60, 0x6, 0x55, 0x55, 0x56, - 0x55, 0x56, 0x72, - - /* U+7522 "產" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x40, 0x0, 0x40, 0x0, 0x55, 0x67, - 0x55, 0x6d, 0x65, 0x0, 0x0, 0x0, 0x27, 0x89, - 0x30, 0x0, 0x0, 0x0, 0x25, 0x65, 0xb4, 0x0, - 0x0, 0x7, 0x67, 0x55, 0x56, 0xb5, 0xc2, 0x0, - 0xc0, 0x23, 0x7, 0x10, 0x0, 0x0, 0xb, 0x8, - 0x60, 0xb0, 0x1, 0x0, 0x0, 0xb0, 0xc5, 0x5c, - 0x55, 0x84, 0x0, 0xa, 0x62, 0x0, 0xb0, 0x1, - 0x0, 0x2, 0x72, 0x46, 0x5c, 0x55, 0x80, 0x0, - 0x61, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x6, 0x15, - 0x55, 0x5c, 0x55, 0x5a, 0x71, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, - - /* U+7523 "産" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x50, 0x0, 0x60, 0x0, 0x55, 0x75, - 0x55, 0x76, 0x56, 0x10, 0x0, 0x2, 0x90, 0x8, - 0x60, 0x0, 0x0, 0x20, 0x8, 0x0, 0x70, 0x4, - 0x0, 0xc, 0x55, 0x55, 0x85, 0x55, 0x62, 0x0, - 0xb0, 0x57, 0xb, 0x10, 0x0, 0x0, 0xb, 0xa, - 0x30, 0xb0, 0x2, 0x50, 0x0, 0xb1, 0xa5, 0x5c, - 0x55, 0x54, 0x0, 0x19, 0x60, 0x0, 0xb0, 0x5, - 0x0, 0x4, 0x60, 0x36, 0x5c, 0x55, 0x51, 0x0, - 0x70, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x6, 0x15, - 0x55, 0x5c, 0x55, 0x5b, 0x51, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, - - /* U+7528 "用" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x65, 0x55, 0x75, 0x55, 0xd1, 0x0, 0x83, 0x0, - 0xa, 0x0, 0xc, 0x0, 0x8, 0x30, 0x0, 0xa0, - 0x0, 0xc0, 0x0, 0x87, 0x55, 0x5c, 0x55, 0x5c, - 0x0, 0x8, 0x30, 0x0, 0xa0, 0x0, 0xc0, 0x0, - 0x93, 0x0, 0xa, 0x0, 0xc, 0x0, 0x9, 0x20, - 0x0, 0xa0, 0x0, 0xc0, 0x0, 0xb5, 0x55, 0x5c, - 0x55, 0x5c, 0x0, 0xc, 0x0, 0x0, 0xa0, 0x0, - 0xc0, 0x2, 0x80, 0x0, 0x1a, 0x0, 0xc, 0x0, - 0x71, 0x0, 0x1, 0xa0, 0x22, 0xd0, 0x6, 0x0, - 0x0, 0x17, 0x3, 0xc9, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, - - /* U+7530 "田" */ - 0x10, 0x0, 0x0, 0x0, 0x10, 0xc5, 0x55, 0xa6, - 0x55, 0xa6, 0xc0, 0x0, 0xa1, 0x0, 0x84, 0xc0, - 0x0, 0xa1, 0x0, 0x84, 0xc0, 0x0, 0xa1, 0x0, - 0x84, 0xc5, 0x55, 0xc6, 0x55, 0xa4, 0xc0, 0x0, - 0xa1, 0x0, 0x84, 0xc0, 0x0, 0xa1, 0x0, 0x84, - 0xc0, 0x0, 0xa1, 0x0, 0x84, 0xc0, 0x0, 0xa1, - 0x0, 0x84, 0xc5, 0x55, 0x55, 0x55, 0xa4, 0x40, - 0x0, 0x0, 0x0, 0x20, - - /* U+7531 "由" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x30, 0x0, 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, - 0x2, 0x0, 0xa, 0x10, 0x0, 0x40, 0xc5, 0x55, - 0xc6, 0x55, 0x5e, 0x1c, 0x0, 0xa, 0x10, 0x0, - 0xc0, 0xc0, 0x0, 0xa1, 0x0, 0xc, 0xc, 0x0, - 0xa, 0x10, 0x0, 0xc0, 0xc5, 0x55, 0xc6, 0x55, - 0x5c, 0xc, 0x0, 0xa, 0x10, 0x0, 0xc0, 0xc0, - 0x0, 0xa1, 0x0, 0xc, 0xc, 0x0, 0xa, 0x10, - 0x0, 0xc0, 0xc5, 0x55, 0x55, 0x55, 0x5c, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7533 "申" */ - 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0xc2, - 0x0, 0x0, 0x20, 0x0, 0xb0, 0x0, 0x30, 0xc5, - 0x55, 0xc5, 0x55, 0xd3, 0xc0, 0x0, 0xb0, 0x0, - 0xb0, 0xc5, 0x55, 0xc5, 0x55, 0xc0, 0xc0, 0x0, - 0xb0, 0x0, 0xb0, 0xc0, 0x0, 0xb0, 0x0, 0xb0, - 0xc5, 0x55, 0xc5, 0x55, 0xc1, 0xb0, 0x0, 0xb0, - 0x0, 0x70, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xb1, 0x0, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - - /* U+7535 "电" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0xa5, 0x55, 0xd5, 0x55, 0xb4, 0x0, - 0xc0, 0x0, 0xc0, 0x0, 0xc0, 0x0, 0xc0, 0x0, - 0xc0, 0x0, 0xc0, 0x0, 0xc5, 0x55, 0xd5, 0x55, - 0xd0, 0x0, 0xc0, 0x0, 0xc0, 0x0, 0xc0, 0x0, - 0xc0, 0x0, 0xc0, 0x0, 0xc0, 0x0, 0xd5, 0x55, - 0xd5, 0x55, 0xa0, 0x10, 0x30, 0x0, 0xc0, 0x0, - 0x0, 0x50, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xa0, - 0x0, 0x0, 0x8b, 0xaa, 0xab, 0xd0, - - /* U+7537 "男" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0xc5, - 0x55, 0xa5, 0x5c, 0x20, 0x0, 0xb0, 0x1, 0xa0, - 0xb, 0x0, 0x0, 0xc5, 0x55, 0xc5, 0x5c, 0x0, - 0x0, 0xb0, 0x1, 0xa0, 0xb, 0x0, 0x0, 0xd5, - 0x55, 0xc5, 0x5c, 0x10, 0x0, 0x80, 0x1, 0x80, - 0x5, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x30, - 0x6, 0x55, 0x59, 0x95, 0x55, 0xe1, 0x0, 0x0, - 0xa, 0x20, 0x1, 0xb0, 0x0, 0x0, 0x3a, 0x0, - 0x4, 0x80, 0x0, 0x4, 0xa0, 0x4, 0x8, 0x40, - 0x4, 0x86, 0x0, 0x1, 0xdc, 0x0, 0x31, 0x0, - 0x0, 0x0, 0x10, 0x0, - - /* U+753A "町" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x24, 0xb, 0x5a, - 0x5c, 0x56, 0x5b, 0x65, 0x50, 0xb0, 0xb0, 0xa0, - 0x0, 0xa2, 0x0, 0xb, 0xb, 0xa, 0x0, 0xa, - 0x20, 0x0, 0xb0, 0xb0, 0xa0, 0x0, 0xa2, 0x0, - 0xb, 0x5c, 0x5c, 0x0, 0xa, 0x20, 0x0, 0xb0, - 0xb0, 0xa0, 0x0, 0xa2, 0x0, 0xb, 0xb, 0xa, - 0x0, 0xa, 0x20, 0x0, 0xb0, 0xb0, 0xa0, 0x0, - 0xa2, 0x0, 0xc, 0x55, 0x5c, 0x10, 0xa, 0x20, - 0x0, 0x60, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xae, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, - - /* U+753B "画" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x65, - 0x55, 0x55, 0x55, 0x59, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x85, 0x56, 0x59, - 0x40, 0x0, 0x1, 0xc, 0x0, 0xa0, 0xb0, 0x8, - 0x1, 0xb0, 0xb0, 0xa, 0xb, 0x0, 0xb0, 0x1a, - 0xc, 0x55, 0xc5, 0xc0, 0xb, 0x1, 0xa0, 0xb0, - 0xa, 0xb, 0x0, 0xb0, 0x1a, 0xb, 0x0, 0xa0, - 0xb0, 0xb, 0x1, 0xa0, 0xb0, 0xa, 0xb, 0x0, - 0xb0, 0x1a, 0xc, 0x55, 0x55, 0xa0, 0xb, 0x3, - 0xb5, 0x55, 0x55, 0x55, 0x55, 0xb0, 0x3, 0x0, - 0x0, 0x0, 0x0, 0x8, 0x0, - - /* U+754C "界" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x55, 0x57, 0x55, 0x97, 0x0, 0x0, 0xb, - 0x0, 0x19, 0x0, 0x74, 0x0, 0x0, 0xc, 0x55, - 0x6b, 0x55, 0x94, 0x0, 0x0, 0xb, 0x0, 0x19, - 0x0, 0x74, 0x0, 0x0, 0xc, 0x55, 0xb7, 0x75, - 0x94, 0x0, 0x0, 0x1, 0x7, 0x70, 0x34, 0x0, - 0x0, 0x0, 0x0, 0x7b, 0x0, 0x7, 0x93, 0x0, - 0x0, 0x29, 0x4a, 0x40, 0x2b, 0x2a, 0xe3, 0x4, - 0x30, 0xc, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, - 0x2a, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x1, 0xa1, - 0x0, 0x1a, 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, - 0x2a, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7559 "留" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x22, - 0x69, 0x80, 0x0, 0x0, 0x40, 0xc, 0x20, 0x0, - 0x6a, 0x95, 0x6b, 0x0, 0xb0, 0x17, 0x10, 0x93, - 0x3, 0x80, 0xb, 0x1, 0x7d, 0x1b, 0x0, 0x56, - 0x1, 0xd9, 0x60, 0x49, 0x22, 0x6b, 0x30, 0x7, - 0x0, 0x16, 0x20, 0x3, 0x70, 0x0, 0x59, 0x55, - 0x59, 0x55, 0x6c, 0x0, 0x4, 0x80, 0x1, 0xb0, - 0x1, 0xa0, 0x0, 0x4a, 0x55, 0x6c, 0x55, 0x6a, - 0x0, 0x4, 0x80, 0x1, 0xb0, 0x1, 0xa0, 0x0, - 0x48, 0x0, 0x1b, 0x0, 0x1b, 0x0, 0x5, 0xa5, - 0x55, 0x65, 0x56, 0xb0, 0x0, 0x11, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+756A "番" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, 0x24, 0x79, 0xbb, 0x10, 0x0, 0x36, 0x64, - 0xa2, 0x9, 0x10, 0x0, 0x0, 0xb, 0x9, 0x24, - 0x60, 0x0, 0x6, 0x55, 0x88, 0xc8, 0x75, 0x57, - 0x40, 0x0, 0x4, 0x99, 0x27, 0x0, 0x0, 0x0, - 0x6, 0x60, 0x92, 0x9, 0x71, 0x0, 0x26, 0x40, - 0x8, 0x10, 0x8, 0xd7, 0x11, 0xb, 0x55, 0x97, - 0x55, 0xd2, 0x0, 0x0, 0xb0, 0x7, 0x40, 0xb, - 0x0, 0x0, 0xb, 0x55, 0xa7, 0x55, 0xc0, 0x0, - 0x0, 0xb0, 0x7, 0x40, 0xb, 0x0, 0x0, 0xb, - 0x55, 0x55, 0x55, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+756B "畫" */ - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2b, 0x0, 0x30, 0x0, 0x0, 0x6, - 0x55, 0x6b, 0x55, 0xd1, 0x20, 0x3, 0x65, 0x55, - 0x6b, 0x55, 0xc5, 0x70, 0x0, 0x7, 0x55, 0x6b, - 0x55, 0xc0, 0x0, 0x0, 0x5, 0x55, 0x6b, 0x55, - 0x76, 0x0, 0x0, 0x23, 0x22, 0x3a, 0x22, 0x25, - 0x20, 0x0, 0x45, 0x33, 0x33, 0x33, 0x53, 0x10, - 0x0, 0xd, 0x55, 0x6b, 0x55, 0xb4, 0x0, 0x0, - 0xc, 0x55, 0x6b, 0x55, 0xb1, 0x0, 0x0, 0xb, - 0x0, 0x29, 0x0, 0xa1, 0x0, 0x0, 0xc, 0x55, - 0x55, 0x55, 0x91, 0x10, 0x5, 0x55, 0x55, 0x55, - 0x55, 0x58, 0xe1, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7570 "異" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0x55, 0x57, 0x55, 0xa5, 0x0, 0x0, 0xb0, 0x0, - 0xb0, 0x9, 0x10, 0x0, 0xc, 0x55, 0x5c, 0x55, - 0xb1, 0x0, 0x0, 0xb0, 0x0, 0xb0, 0x9, 0x10, - 0x0, 0xd, 0x55, 0x58, 0x55, 0xb2, 0x0, 0x0, - 0x21, 0xb0, 0x8, 0x20, 0x0, 0x0, 0x65, 0x6c, - 0x55, 0xa6, 0x5a, 0x10, 0x0, 0x1, 0xa0, 0x8, - 0x10, 0x0, 0x3, 0x55, 0x6c, 0x55, 0xa6, 0x57, - 0x80, 0x10, 0x0, 0x91, 0x4, 0x30, 0x0, 0x0, - 0x4, 0xb7, 0x10, 0x4, 0xb5, 0x0, 0x37, 0x50, - 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, - - /* U+7576 "當" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x6, - 0x10, 0x1b, 0x3, 0x70, 0x0, 0x0, 0x39, 0x0, - 0xa0, 0x92, 0x0, 0x0, 0x75, 0x65, 0x5b, 0x67, - 0x55, 0xa0, 0x29, 0x0, 0x0, 0x0, 0x10, 0x74, - 0x6, 0x40, 0xb5, 0x55, 0x5c, 0x22, 0x0, 0x0, - 0xb, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0xc5, - 0x55, 0x5c, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, - 0x2, 0x30, 0x0, 0x1c, 0x55, 0x5c, 0x55, 0xa7, - 0x0, 0x1, 0xc5, 0x55, 0xc5, 0x5a, 0x40, 0x0, - 0x1a, 0x0, 0xb, 0x0, 0x74, 0x0, 0x1, 0xc5, - 0x55, 0xc5, 0x5a, 0x40, 0x0, 0x15, 0x0, 0x0, - 0x0, 0x42, 0x0, - - /* U+75B2 "疲" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x9, - 0x55, 0x58, 0x85, 0x56, 0xc1, 0x2, 0xb, 0x0, - 0x0, 0x91, 0x0, 0x0, 0x8, 0x2b, 0x6, 0x55, - 0xd5, 0x58, 0x40, 0x5, 0x4b, 0xb, 0x0, 0xb0, - 0x9, 0x20, 0x0, 0xb, 0xb, 0x0, 0xb0, 0x1, - 0x0, 0x16, 0x7b, 0xb, 0x55, 0xb5, 0x79, 0x0, - 0x15, 0xa, 0xb, 0x5, 0x0, 0xa3, 0x0, 0x0, - 0x47, 0xb, 0x3, 0x44, 0x90, 0x0, 0x0, 0x92, - 0x55, 0x0, 0x9b, 0x0, 0x0, 0x1, 0x80, 0x90, - 0x4, 0x99, 0x83, 0x0, 0x6, 0x6, 0x13, 0x63, - 0x0, 0x3a, 0xc1, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+75C5 "病" */ - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0xc, 0x55, - 0x56, 0x65, 0x58, 0x60, 0x60, 0xc0, 0x0, 0x0, - 0x0, 0x20, 0x8, 0x3c, 0x26, 0x55, 0xb5, 0x58, - 0x20, 0x10, 0xb0, 0x0, 0xd, 0x0, 0x0, 0x1, - 0x6b, 0x9, 0x55, 0xd5, 0x5b, 0x22, 0xb1, 0xa0, - 0xb0, 0x2a, 0x0, 0xc0, 0x0, 0x28, 0xb, 0x6, - 0x86, 0xc, 0x0, 0x6, 0x40, 0xb0, 0xa0, 0x76, - 0xc0, 0x0, 0x90, 0xb, 0x61, 0x1, 0x6c, 0x0, - 0x26, 0x0, 0xb0, 0x0, 0x10, 0xc0, 0x6, 0x0, - 0xb, 0x0, 0x3, 0xcc, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x0, - - /* U+75DB "痛" */ - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x90, 0x0, 0x10, 0x0, 0x9, - 0x55, 0x55, 0x85, 0x58, 0x90, 0x7, 0xa, 0x15, - 0x55, 0x55, 0x57, 0x0, 0x7, 0x6a, 0x10, 0x3, - 0x23, 0x85, 0x0, 0x3, 0x3a, 0x13, 0x0, 0xc3, - 0x3, 0x0, 0x0, 0xb, 0x1c, 0x55, 0xc5, 0x5b, - 0x30, 0x3, 0x8c, 0xb, 0x0, 0xb0, 0xa, 0x10, - 0x3a, 0xb, 0xb, 0x55, 0xc5, 0x5b, 0x10, 0x0, - 0x19, 0xb, 0x55, 0xc5, 0x5b, 0x10, 0x0, 0x73, - 0xb, 0x0, 0xb0, 0xa, 0x10, 0x1, 0x80, 0xb, - 0x0, 0xb0, 0x1a, 0x10, 0x6, 0x0, 0xb, 0x0, - 0x90, 0x7d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+767A "発" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x65, 0x55, 0xd5, 0x12, 0xc1, 0x0, 0x0, 0x15, - 0x7, 0x70, 0x76, 0x4, 0x10, 0x0, 0xa, 0x3a, - 0x0, 0x54, 0x48, 0x20, 0x0, 0x3, 0xa0, 0x0, - 0x8, 0xa1, 0x0, 0x0, 0x58, 0x55, 0x55, 0x58, - 0xad, 0xb1, 0x4, 0x10, 0x1b, 0x0, 0xb0, 0x0, - 0x10, 0x0, 0x0, 0xb, 0x0, 0xb0, 0x0, 0x0, - 0x2, 0x55, 0x5c, 0x55, 0xc5, 0x58, 0x70, 0x0, - 0x10, 0xb, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x65, 0x0, 0xb0, 0x0, 0x30, 0x0, 0x3, 0x80, - 0x0, 0xb0, 0x0, 0x70, 0x2, 0x64, 0x0, 0x0, - 0x9a, 0x9b, 0xa0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+767C "發" */ - 0x0, 0x0, 0x4, 0x10, 0x21, 0x0, 0x0, 0x46, - 0x59, 0xb2, 0x38, 0x11, 0x0, 0x3, 0x73, 0xa0, - 0x5, 0x25, 0x70, 0x0, 0x7, 0x80, 0x0, 0x4, - 0x91, 0x0, 0x36, 0x86, 0xa0, 0x18, 0x5a, 0x8a, - 0x21, 0x0, 0xb, 0x2, 0x80, 0xb0, 0x0, 0x4, - 0x22, 0xb0, 0x55, 0xc, 0x1, 0x0, 0xc2, 0x25, - 0x8, 0x0, 0x69, 0x91, 0xd, 0x55, 0x93, 0x26, - 0x46, 0xb0, 0x0, 0x30, 0xc, 0x1, 0x10, 0xa3, - 0x0, 0x0, 0x2, 0xa0, 0x3, 0x98, 0x0, 0x0, - 0x0, 0x57, 0x0, 0x57, 0x97, 0x0, 0x2, 0x9d, - 0x22, 0x53, 0x0, 0xa4, 0x0, 0x1, 0x10, 0x10, - 0x0, 0x0, 0x0, - - /* U+767D "白" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0x10, 0x0, 0x0, 0x0, 0x9, 0x20, 0x0, 0x0, - 0x7, 0x56, 0x85, 0x55, 0x56, 0xc0, 0xa2, 0x0, - 0x0, 0x0, 0x1a, 0x9, 0x20, 0x0, 0x0, 0x1, - 0xa0, 0x92, 0x0, 0x0, 0x0, 0x1a, 0x9, 0x75, - 0x55, 0x55, 0x56, 0xa0, 0x92, 0x0, 0x0, 0x0, - 0x1a, 0x9, 0x20, 0x0, 0x0, 0x1, 0xa0, 0x92, - 0x0, 0x0, 0x0, 0x1a, 0xa, 0x75, 0x55, 0x55, - 0x56, 0xa0, 0xa2, 0x0, 0x0, 0x0, 0x19, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+767E "百" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x55, - 0x55, 0x55, 0x55, 0x59, 0x90, 0x10, 0x0, 0xb, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x85, 0x77, 0x55, 0x5b, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd5, 0x55, 0x55, - 0x5d, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0xd, 0x55, 0x55, 0x55, 0xd0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+7684 "的" */ - 0x0, 0x11, 0x0, 0x1, 0x10, 0x0, 0x0, 0x5, - 0x90, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x70, 0x0, - 0xb, 0x30, 0x0, 0x1, 0xa7, 0x5b, 0x42, 0xd5, - 0x56, 0xb0, 0x1b, 0x0, 0xb0, 0x92, 0x0, 0x3a, - 0x0, 0xb0, 0xb, 0x35, 0x0, 0x3, 0x90, 0xb, - 0x0, 0xb2, 0x25, 0x0, 0x39, 0x0, 0xc5, 0x5c, - 0x0, 0xa3, 0x4, 0x90, 0xb, 0x0, 0xb0, 0x5, - 0x40, 0x48, 0x0, 0xb0, 0xb, 0x0, 0x0, 0x5, - 0x70, 0xb, 0x0, 0xb0, 0x0, 0x0, 0x66, 0x1, - 0xc5, 0x5c, 0x0, 0x14, 0x2b, 0x40, 0x19, 0x0, - 0x70, 0x0, 0x2d, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+7686 "皆" */ - 0x20, 0x0, 0x4, 0x0, 0x0, 0x0, 0xb1, 0x0, - 0xb, 0x20, 0x57, 0x0, 0xb5, 0x5b, 0x2b, 0x8, - 0x82, 0x0, 0xb0, 0x0, 0xb, 0x40, 0x0, 0x30, - 0xb0, 0x35, 0x1b, 0x0, 0x0, 0x80, 0xdb, 0x41, - 0x39, 0xa9, 0x99, 0xe1, 0x10, 0x4, 0x70, 0x11, - 0x11, 0x0, 0x8, 0x59, 0x55, 0x55, 0xa0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xd, 0x55, - 0x55, 0x55, 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0xd, 0x55, 0x55, 0x55, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+76BF "皿" */ - 0x0, 0x75, 0x56, 0x55, 0x55, 0xa2, 0x0, 0x0, - 0xc0, 0xb, 0x2, 0x90, 0xc0, 0x0, 0x0, 0xc0, - 0xb, 0x2, 0x90, 0xc0, 0x0, 0x0, 0xc0, 0xb, - 0x2, 0x90, 0xc0, 0x0, 0x0, 0xc0, 0xb, 0x2, - 0x90, 0xc0, 0x0, 0x0, 0xc0, 0xb, 0x2, 0x90, - 0xc0, 0x0, 0x0, 0xc0, 0xb, 0x2, 0x90, 0xc0, - 0x0, 0x0, 0xc0, 0xb, 0x2, 0x90, 0xc0, 0x0, - 0x0, 0xc0, 0xb, 0x2, 0x90, 0xc1, 0x40, 0x26, - 0x65, 0x56, 0x55, 0x65, 0x66, 0x60, - - /* U+76D7 "盗" */ - 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x63, - 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, 0xd0, 0x44, - 0xc5, 0x55, 0x84, 0x0, 0x1, 0x62, 0xa0, 0x62, - 0x9, 0x20, 0x0, 0x38, 0x61, 0xd, 0x41, 0x0, - 0x0, 0x6e, 0x10, 0x5, 0x87, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0xc1, 0x2a, 0x0, 0x0, 0x3b, 0x2, - 0x92, 0x0, 0x6e, 0x40, 0x0, 0x31, 0x30, 0x0, - 0x3, 0x30, 0x0, 0xc, 0x5c, 0x65, 0xc5, 0xb4, - 0x0, 0x0, 0xb0, 0xa1, 0xb, 0x9, 0x10, 0x0, - 0xb, 0xa, 0x10, 0xb0, 0x91, 0x0, 0x35, 0xc5, - 0xc6, 0x5c, 0x5b, 0x8b, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+76EE "目" */ - 0x85, 0x55, 0x55, 0x5a, 0x1d, 0x0, 0x0, 0x0, - 0xd0, 0xd0, 0x0, 0x0, 0xd, 0xd, 0x0, 0x0, - 0x0, 0xd0, 0xd5, 0x55, 0x55, 0x5d, 0xd, 0x0, - 0x0, 0x0, 0xd0, 0xd0, 0x0, 0x0, 0xd, 0xd, - 0x55, 0x55, 0x55, 0xd0, 0xd0, 0x0, 0x0, 0xd, - 0xd, 0x0, 0x0, 0x0, 0xd0, 0xd5, 0x55, 0x55, - 0x5d, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+76F4 "直" */ - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x69, 0x0, 0x2, 0x0, 0x4, 0x65, - 0x55, 0xa8, 0x55, 0x5a, 0x40, 0x0, 0x1, 0x0, - 0xa1, 0x0, 0x20, 0x0, 0x0, 0xc, 0x55, 0x75, - 0x56, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x1, - 0xa0, 0x0, 0x0, 0xc, 0x55, 0x55, 0x56, 0xa0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x1, 0xa0, 0x0, - 0x0, 0xc, 0x55, 0x55, 0x56, 0xa0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, 0xc, - 0x55, 0x55, 0x56, 0xa0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x1, 0xa1, 0x60, 0x16, 0x56, 0x55, 0x55, - 0x55, 0x65, 0x61, - - /* U+76F8 "相" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa4, 0x0, 0x10, 0x0, 0x30, 0x0, 0x9, 0x10, - 0xd, 0x55, 0x5d, 0x30, 0x0, 0x91, 0x20, 0xc0, - 0x0, 0xc0, 0x6, 0x5d, 0x67, 0x4c, 0x0, 0xc, - 0x0, 0x0, 0xf2, 0x0, 0xc5, 0x55, 0xd0, 0x0, - 0x5f, 0x97, 0xc, 0x0, 0xc, 0x0, 0xa, 0xa1, - 0xb0, 0xc0, 0x0, 0xc0, 0x3, 0x79, 0x10, 0xc, - 0x55, 0x5d, 0x0, 0x80, 0x91, 0x0, 0xc0, 0x0, - 0xc0, 0x31, 0xa, 0x10, 0xc, 0x0, 0xc, 0x0, - 0x0, 0xa2, 0x0, 0xd5, 0x55, 0xd0, 0x0, 0xa, - 0x20, 0xc, 0x0, 0xa, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, - - /* U+770B "看" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x13, 0x57, 0x9b, 0xb5, 0x0, 0x1, 0x44, - 0x43, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x58, - 0xb5, 0x55, 0xa4, 0x0, 0x0, 0x0, 0xb, 0x20, - 0x0, 0x0, 0x40, 0x17, 0x55, 0x7b, 0x55, 0x55, - 0x56, 0x92, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x30, - 0x0, 0x0, 0x7, 0xe5, 0x55, 0x55, 0xd0, 0x0, - 0x0, 0x45, 0xc5, 0x55, 0x55, 0xc0, 0x0, 0x4, - 0x40, 0xc0, 0x0, 0x0, 0xc0, 0x0, 0x11, 0x0, - 0xc5, 0x55, 0x55, 0xc0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc5, 0x55, - 0x55, 0xc0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, - 0x60, 0x0, - - /* U+771F "真" */ - 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3b, 0x0, 0x1, 0x30, 0x0, 0x65, - 0x55, 0x8a, 0x55, 0x56, 0x70, 0x0, 0x0, 0x0, - 0x56, 0x0, 0x30, 0x0, 0x0, 0x1, 0xc5, 0x65, - 0x56, 0xc0, 0x0, 0x0, 0x1, 0xc5, 0x55, 0x56, - 0x90, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x2, 0x90, - 0x0, 0x0, 0x1, 0xc5, 0x55, 0x56, 0x90, 0x0, - 0x0, 0x1, 0xc5, 0x55, 0x56, 0x90, 0x0, 0x0, - 0x1, 0xb0, 0x0, 0x2, 0x90, 0x52, 0x6, 0x55, - 0x6a, 0x55, 0x86, 0x65, 0x64, 0x0, 0x0, 0x89, - 0x10, 0x8, 0x91, 0x0, 0x0, 0x28, 0x30, 0x0, - 0x0, 0x5c, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x2, 0x0, - - /* U+7720 "眠" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x30, 0xa5, 0x55, 0x5c, 0x20, 0xc5, 0x5c, 0xb, - 0x0, 0x0, 0xc0, 0xb, 0x1, 0xa0, 0xb0, 0x0, - 0xc, 0x0, 0xb0, 0x1a, 0xc, 0x59, 0x55, 0xd0, - 0xc, 0x55, 0xa0, 0xb0, 0x91, 0x0, 0x0, 0xb0, - 0x1a, 0xb, 0x8, 0x30, 0x37, 0xc, 0x55, 0xa0, - 0xc4, 0x88, 0x44, 0x41, 0xb0, 0x1a, 0xb, 0x3, - 0x90, 0x0, 0xb, 0x1, 0xa0, 0xb0, 0xc, 0x0, - 0x3, 0xc5, 0x5b, 0xb, 0x23, 0x5a, 0x1, 0x5b, - 0x0, 0x70, 0xe7, 0x0, 0x8b, 0x84, 0x0, 0x0, - 0x8, 0x0, 0x0, 0x5e, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+773E "眾" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xb, 0x55, - 0xa5, 0x5b, 0x55, 0xd2, 0xb, 0x0, 0xa0, 0xe, - 0x0, 0xb0, 0xb, 0x0, 0xa0, 0xe, 0x0, 0xb0, - 0xb, 0x55, 0x55, 0x55, 0x55, 0x90, 0x0, 0x0, - 0x0, 0x14, 0x7b, 0xb0, 0x4, 0x55, 0x6a, 0x94, - 0x32, 0x10, 0x0, 0x46, 0x5, 0x50, 0x9, 0x0, - 0x0, 0x93, 0x5, 0x50, 0x3a, 0x0, 0x0, 0xc7, - 0x5, 0x50, 0x9a, 0x0, 0x8, 0x23, 0xc5, 0x52, - 0x91, 0x80, 0x43, 0x0, 0x65, 0x77, 0x0, 0x78, - 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, - - /* U+7740 "着" */ - 0x0, 0x0, 0x20, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x3b, 0x0, 0x67, 0x0, 0x0, 0x3, 0x55, - 0x5c, 0x55, 0x95, 0x5c, 0x30, 0x1, 0x0, 0x0, - 0xc0, 0x0, 0x20, 0x0, 0x0, 0x36, 0x58, 0xa5, - 0x57, 0x90, 0x0, 0x0, 0x0, 0xb, 0x10, 0x0, - 0x4, 0x40, 0x16, 0x55, 0xa8, 0x55, 0x55, 0x55, - 0x40, 0x0, 0x3, 0xe5, 0x55, 0x55, 0xb0, 0x0, - 0x0, 0x39, 0x92, 0x0, 0x0, 0xb0, 0x0, 0x4, - 0x60, 0x96, 0x55, 0x55, 0xb0, 0x0, 0x21, 0x0, - 0x96, 0x55, 0x55, 0xb0, 0x0, 0x0, 0x0, 0x92, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x96, 0x55, - 0x55, 0xb0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x20, 0x0, - - /* U+77E5 "知" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96, 0x66, - 0xb0, 0x95, 0x55, 0xc0, 0x0, 0x80, 0xc0, 0x0, - 0xb0, 0x0, 0xb0, 0x5, 0x10, 0xc0, 0x0, 0xb0, - 0x0, 0xb0, 0x1, 0x0, 0xc0, 0x62, 0xb0, 0x0, - 0xb0, 0x6, 0x55, 0xd5, 0x53, 0xb0, 0x0, 0xb0, - 0x0, 0x2, 0xc0, 0x0, 0xb0, 0x0, 0xb0, 0x0, - 0x7, 0x59, 0x30, 0xb0, 0x0, 0xb0, 0x0, 0xb, - 0x1, 0xd2, 0xc5, 0x55, 0xb0, 0x0, 0x82, 0x0, - 0x64, 0xb0, 0x0, 0xb0, 0x6, 0x30, 0x0, 0x0, - 0x50, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+77ED "短" */ - 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x97, 0x0, 0x55, 0x55, 0x58, 0x60, 0x0, 0xc0, - 0x1, 0x10, 0x0, 0x0, 0x0, 0x3, 0xba, 0x69, - 0x0, 0x0, 0x1, 0x0, 0x8, 0x1c, 0x0, 0xc, - 0x55, 0x5d, 0x0, 0x3, 0xc, 0x0, 0xb, 0x0, - 0xb, 0x0, 0x3, 0x3d, 0x39, 0x2b, 0x0, 0xb, - 0x0, 0x3, 0x2c, 0x22, 0x1c, 0x55, 0x5b, 0x0, - 0x0, 0xd, 0x10, 0x6, 0x0, 0x34, 0x0, 0x0, - 0x29, 0x83, 0x8, 0x0, 0xa5, 0x0, 0x0, 0x73, - 0x1b, 0x7, 0x50, 0xa0, 0x0, 0x0, 0x90, 0x2, - 0x3, 0x21, 0x50, 0x30, 0x6, 0x10, 0x5, 0x55, - 0x56, 0x55, 0x91, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+77F3 "石" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x30, 0x6, - 0x55, 0x59, 0xa5, 0x55, 0x55, 0x50, 0x0, 0x0, - 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xd5, 0x55, 0x55, - 0xc3, 0x0, 0x0, 0x48, 0xc0, 0x0, 0x0, 0xc0, - 0x0, 0x2, 0x70, 0xc0, 0x0, 0x0, 0xc0, 0x0, - 0x24, 0x0, 0xc0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0xc5, 0x55, 0x55, 0xd0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+7802 "砂" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x0, 0xd, 0x0, 0x0, 0x7, 0x79, - 0x67, 0x0, 0xb, 0x0, 0x0, 0x0, 0x74, 0x0, - 0x27, 0xb, 0x22, 0x0, 0x0, 0xa0, 0x0, 0x68, - 0xb, 0x9, 0x60, 0x0, 0xb0, 0x40, 0xa1, 0xc, - 0x1, 0xe0, 0x5, 0xe5, 0xc3, 0x80, 0xc, 0x0, - 0x20, 0x7, 0xb0, 0xa6, 0x10, 0xc, 0xa, 0x20, - 0x21, 0xb0, 0xa2, 0x0, 0x8, 0x6c, 0x10, 0x0, - 0xb0, 0xa0, 0x0, 0x4, 0xb0, 0x0, 0x0, 0xc5, - 0xc1, 0x0, 0x5a, 0x0, 0x0, 0x0, 0xb0, 0x60, - 0x18, 0x60, 0x0, 0x0, 0x0, 0x30, 0x25, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+7814 "研" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x12, 0x56, 0x55, 0x58, 0x70, 0x6, 0x78, - 0x65, 0x9, 0x20, 0xb0, 0x0, 0x0, 0x73, 0x0, - 0x9, 0x20, 0xb0, 0x0, 0x0, 0xa0, 0x0, 0x9, - 0x20, 0xb0, 0x0, 0x0, 0xe5, 0xa3, 0x9, 0x20, - 0xb0, 0x20, 0x6, 0xe0, 0x94, 0x6b, 0x65, 0xc6, - 0x90, 0x7, 0xb0, 0x92, 0xa, 0x10, 0xb0, 0x0, - 0x20, 0xb0, 0x92, 0xb, 0x0, 0xb0, 0x0, 0x0, - 0xb0, 0x92, 0x1b, 0x0, 0xb0, 0x0, 0x0, 0xc5, - 0xb2, 0x74, 0x0, 0xb0, 0x0, 0x0, 0x70, 0x12, - 0x70, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x26, 0x0, - 0x0, 0xb1, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+7834 "破" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x6, 0x58, - 0x86, 0x30, 0xb, 0x0, 0x40, 0x0, 0x38, 0x0, - 0xa5, 0x5c, 0x58, 0xa0, 0x0, 0x74, 0x0, 0xa0, - 0xb, 0x3, 0x0, 0x0, 0xb1, 0x50, 0xa0, 0xb, - 0x0, 0x0, 0x3, 0xd3, 0xc1, 0xa5, 0x6a, 0x5c, - 0x10, 0x8, 0xb0, 0xb0, 0xb0, 0x50, 0x1a, 0x0, - 0x22, 0xb0, 0xb0, 0xb0, 0x60, 0x74, 0x0, 0x0, - 0xb0, 0xb0, 0xa0, 0x17, 0xb0, 0x0, 0x0, 0xc5, - 0xc5, 0x40, 0xb, 0x80, 0x0, 0x0, 0xb0, 0x68, - 0x0, 0x85, 0x89, 0x30, 0x0, 0x50, 0x52, 0x56, - 0x10, 0x5, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+78BA "確" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x3, - 0x33, 0x74, 0x0, 0xd, 0x30, 0x0, 0x3, 0x75, - 0x11, 0x46, 0x6c, 0x55, 0xa5, 0x0, 0x91, 0x0, - 0xc0, 0x95, 0x10, 0x50, 0x0, 0xb0, 0x10, 0x2, - 0xa0, 0xb0, 0x0, 0x0, 0xd5, 0xc3, 0xb, 0x65, - 0xa5, 0xa2, 0x5, 0xc0, 0xa0, 0x8c, 0x1, 0x90, - 0x0, 0x7, 0xa0, 0xa5, 0x2c, 0x56, 0xb5, 0x80, - 0x22, 0xa0, 0xa0, 0xb, 0x1, 0x90, 0x0, 0x0, - 0xa0, 0xa0, 0xb, 0x23, 0xa4, 0x60, 0x0, 0xb5, - 0xb0, 0xc, 0x34, 0xa2, 0x20, 0x0, 0x90, 0x0, - 0xb, 0x1, 0x90, 0x40, 0x0, 0x0, 0x0, 0xc, - 0x55, 0x55, 0x52, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+793A "示" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x15, 0x55, 0x55, 0x55, 0x9b, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x40, 0x6, 0x55, 0x55, 0x68, 0x55, - 0x55, 0xa3, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xe2, 0x2a, 0x6, 0x0, 0x0, - 0x0, 0x8, 0x70, 0x2a, 0x0, 0xa2, 0x0, 0x0, - 0x3a, 0x0, 0x2a, 0x0, 0x2d, 0x20, 0x1, 0x90, - 0x0, 0x2a, 0x0, 0x6, 0xb0, 0x6, 0x0, 0x23, - 0x6a, 0x0, 0x0, 0x60, 0x0, 0x0, 0x6, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+793C "礼" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x30, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x2, - 0xb0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x20, 0xc0, 0x0, 0x0, 0x2, 0x65, 0x5e, 0x60, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0x2, 0xd0, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x19, 0xd9, 0x40, 0xc0, 0x0, 0x0, - 0x1, 0x70, 0xc1, 0xc0, 0xc0, 0x0, 0x0, 0x3, - 0x0, 0xc0, 0x0, 0xc0, 0x0, 0x10, 0x0, 0x0, - 0xc0, 0x0, 0xc0, 0x0, 0x50, 0x0, 0x0, 0xc0, - 0x0, 0xc0, 0x0, 0xa0, 0x0, 0x0, 0xd0, 0x0, - 0x8b, 0xbb, 0xd2, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, - - /* U+793E "社" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x7, - 0x30, 0x0, 0x2a, 0x0, 0x0, 0x5, 0x55, 0x78, - 0x0, 0x2a, 0x0, 0x0, 0x1, 0x0, 0xb4, 0x0, - 0x2a, 0x0, 0x0, 0x0, 0x4, 0x90, 0x55, 0x6b, - 0x58, 0x90, 0x0, 0xe, 0x70, 0x10, 0x2a, 0x0, - 0x0, 0x0, 0x9d, 0x3c, 0x0, 0x2a, 0x0, 0x0, - 0x6, 0x2c, 0x4, 0x0, 0x2a, 0x0, 0x0, 0x11, - 0xc, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0xc, 0x4, - 0x55, 0x6b, 0x55, 0xc3, 0x0, 0xc, 0x1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7956 "祖" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x59, 0x0, 0x65, 0x55, 0x5a, 0x0, 0x0, 0xc, - 0x0, 0xa2, 0x0, 0xc, 0x0, 0x5, 0x55, 0xa1, - 0xa2, 0x0, 0xc, 0x0, 0x0, 0x2, 0xa0, 0x92, - 0x0, 0xc, 0x0, 0x0, 0xa, 0x20, 0x96, 0x55, - 0x5c, 0x0, 0x0, 0x4d, 0x60, 0x92, 0x0, 0xc, - 0x0, 0x0, 0x9b, 0x78, 0x92, 0x0, 0xc, 0x0, - 0x6, 0xb, 0x4, 0x96, 0x55, 0x5c, 0x0, 0x0, - 0xb, 0x0, 0x92, 0x0, 0xc, 0x0, 0x0, 0xb, - 0x0, 0x92, 0x0, 0xc, 0x0, 0x0, 0xb, 0x0, - 0x92, 0x0, 0xc, 0x52, 0x0, 0xc, 0x26, 0x55, - 0x55, 0x55, 0x54, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+795D "祝" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2a, 0x0, 0x20, 0x0, 0x4, 0x0, 0x0, 0xa, - 0x10, 0xb5, 0x55, 0x5d, 0x0, 0x5, 0x55, 0x93, - 0xb0, 0x0, 0xb, 0x0, 0x1, 0x0, 0xc0, 0xb0, - 0x0, 0xb, 0x0, 0x0, 0x7, 0x40, 0xb0, 0x0, - 0xb, 0x0, 0x0, 0x2e, 0x30, 0xb6, 0x89, 0x5c, - 0x0, 0x0, 0x9b, 0x95, 0x14, 0x6b, 0x1, 0x0, - 0x6, 0x1b, 0x15, 0x5, 0x4b, 0x0, 0x0, 0x21, - 0xb, 0x0, 0x8, 0x1b, 0x0, 0x0, 0x0, 0xb, - 0x0, 0xa, 0xb, 0x0, 0x50, 0x0, 0xc, 0x0, - 0x82, 0xb, 0x0, 0x80, 0x0, 0xc, 0x6, 0x20, - 0x7, 0xa9, 0xd2, 0x0, 0x4, 0x30, 0x0, 0x0, - 0x0, 0x0, - - /* U+795E "神" */ - 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, - 0x29, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xb, 0x0, 0x10, 0x5, 0x55, 0x92, - 0xb5, 0x5c, 0x55, 0xd0, 0x1, 0x0, 0xb0, 0xb0, - 0xb, 0x0, 0xb0, 0x0, 0x7, 0x40, 0xb5, 0x5c, - 0x55, 0xb0, 0x0, 0x2d, 0x60, 0xb0, 0xb, 0x0, - 0xb0, 0x0, 0x9b, 0x69, 0xb0, 0xb, 0x0, 0xb0, - 0x6, 0xb, 0x3, 0xb5, 0x5c, 0x55, 0xb0, 0x10, - 0xb, 0x0, 0x50, 0xb, 0x0, 0x20, 0x0, 0xb, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x3, - 0x0, 0x0, - - /* U+796D "祭" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x90, 0x11, 0x30, 0x3, 0x0, 0x0, 0xb, - 0x55, 0xc5, 0x95, 0x5d, 0x30, 0x0, 0x57, 0x92, - 0xc0, 0x71, 0x71, 0x0, 0x1, 0x93, 0x4a, 0x40, - 0x1b, 0x20, 0x0, 0x5, 0xb, 0x49, 0x0, 0x7, - 0x70, 0x0, 0x0, 0x2, 0x96, 0x55, 0x68, 0x8b, - 0x30, 0x0, 0x37, 0x0, 0x0, 0x0, 0x5, 0xa2, - 0x15, 0x56, 0x55, 0x56, 0x55, 0x87, 0x0, 0x0, - 0x0, 0x55, 0xb, 0x13, 0x0, 0x0, 0x0, 0x3, - 0xc3, 0xb, 0x3, 0xa4, 0x0, 0x0, 0x49, 0x0, - 0xb, 0x0, 0x1d, 0x30, 0x2, 0x30, 0x5, 0xb9, - 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x31, 0x0, - 0x0, 0x0, - - /* U+7981 "禁" */ - 0x0, 0x0, 0x40, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0xb, 0x10, 0x0, 0x4, 0x55, - 0xc5, 0xa2, 0x5d, 0x56, 0xa0, 0x0, 0xb, 0xc2, - 0x0, 0x5f, 0x50, 0x0, 0x0, 0x56, 0xb9, 0x50, - 0x9b, 0x46, 0x0, 0x2, 0x80, 0xb1, 0x27, 0x1b, - 0x8, 0xb1, 0x4, 0x0, 0x80, 0x21, 0x7, 0x20, - 0x20, 0x0, 0x6, 0x55, 0x55, 0x55, 0x92, 0x0, - 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0xb1, 0x1, - 0x0, 0x42, 0xc, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xd4, 0xc, 0x7, 0x60, 0x0, 0x0, 0x48, 0x10, - 0xc, 0x0, 0x8a, 0x0, 0x2, 0x30, 0x6, 0xd9, - 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+79C0 "秀" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, 0x0, - 0x4, 0x56, 0x7a, 0x89, 0x72, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x0, 0x0, 0x10, 0x4, 0x65, 0x55, - 0x8c, 0x65, 0x56, 0xb1, 0x0, 0x0, 0xb, 0x5a, - 0x42, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x1a, 0x8, - 0x60, 0x0, 0x0, 0x29, 0x20, 0x15, 0x2, 0x6d, - 0x72, 0x4, 0x42, 0x6b, 0x65, 0x8a, 0x1, 0x60, - 0x0, 0x0, 0xc, 0x0, 0xa2, 0x4, 0x0, 0x0, - 0x0, 0x1b, 0x0, 0x85, 0x6c, 0x0, 0x0, 0x0, - 0x93, 0x0, 0x0, 0x47, 0x0, 0x0, 0x6, 0x60, - 0x0, 0x10, 0x93, 0x0, 0x0, 0x64, 0x0, 0x0, - 0x4d, 0xb0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+79C1 "私" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4a, 0xd1, 0x5, 0x10, 0x0, 0x2, 0x46, - 0xd1, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x52, - 0x2a, 0x0, 0x0, 0x6, 0x55, 0xe5, 0x53, 0x65, - 0x0, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x90, 0x0, - 0x0, 0x0, 0xb, 0xd6, 0xb0, 0x90, 0x10, 0x0, - 0x0, 0x83, 0xc0, 0x93, 0x50, 0x35, 0x0, 0x5, - 0x40, 0xc0, 0x7, 0x0, 0xb, 0x10, 0x13, 0x0, - 0xc0, 0x18, 0x0, 0x7, 0xb0, 0x0, 0x0, 0xd0, - 0x8e, 0xa8, 0x64, 0xf0, 0x0, 0x0, 0xe0, 0x12, - 0x0, 0x0, 0x50, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, 0x0, - - /* U+79CB "秋" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x3, 0xaa, 0x0, 0xb4, 0x0, 0x0, 0x3, 0x5b, - 0x30, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x9, 0x20, - 0x1, 0xb1, 0x9, 0x10, 0x15, 0x5b, 0x7b, 0x35, - 0xc2, 0x6a, 0x10, 0x1, 0xe, 0x20, 0x84, 0xd6, - 0x70, 0x0, 0x0, 0x4f, 0x50, 0xa0, 0xc7, 0x0, - 0x0, 0x0, 0x9b, 0x7a, 0x0, 0xc7, 0x0, 0x0, - 0x3, 0x69, 0x29, 0x3, 0x97, 0x10, 0x0, 0x6, - 0x9, 0x20, 0x9, 0x42, 0x90, 0x0, 0x20, 0x9, - 0x20, 0x1b, 0x0, 0xb3, 0x0, 0x0, 0xa, 0x20, - 0x91, 0x0, 0x2e, 0x40, 0x0, 0xa, 0x46, 0x0, - 0x0, 0x6, 0x70, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+79CD "种" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x4, 0xb8, 0x0, 0xd, 0x0, 0x0, 0x4, 0x5c, - 0x10, 0x0, 0xb, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x10, 0xb, 0x0, 0x40, 0x16, 0x5c, 0x69, 0xa5, - 0x5c, 0x56, 0xb0, 0x0, 0xe, 0x0, 0xa1, 0xb, - 0x2, 0x90, 0x0, 0x3f, 0x61, 0xa1, 0xb, 0x2, - 0x90, 0x0, 0xad, 0x3c, 0xa1, 0xb, 0x2, 0x90, - 0x3, 0x7b, 0x2, 0xa5, 0x5c, 0x56, 0x90, 0x8, - 0xb, 0x0, 0x20, 0xb, 0x0, 0x0, 0x30, 0xb, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x3, - 0x0, 0x0, - - /* U+79D1 "科" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x2, 0x8d, 0x0, 0x0, 0xc2, 0x0, 0x4, 0x5b, - 0x40, 0x3, 0x10, 0xb0, 0x0, 0x0, 0x8, 0x20, - 0x1, 0xd0, 0xb0, 0x0, 0x0, 0x8, 0x25, 0x10, - 0x40, 0xb0, 0x0, 0x26, 0x5d, 0x65, 0x31, 0x0, - 0xb0, 0x0, 0x0, 0x1f, 0x60, 0x5, 0x70, 0xb0, - 0x0, 0x0, 0x8c, 0x6b, 0x0, 0x90, 0xb0, 0x30, - 0x2, 0x88, 0x26, 0x0, 0x3, 0xd6, 0x70, 0x7, - 0x8, 0x23, 0x65, 0x41, 0xb0, 0x0, 0x30, 0x9, - 0x20, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x9, 0x20, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x9, 0x30, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x40, 0x0, - - /* U+79D8 "秘" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x38, 0xb7, 0x0, 0x70, 0x6, 0x0, 0x4, 0x2b, - 0x0, 0x0, 0x4b, 0x1e, 0x10, 0x0, 0xb, 0x0, - 0x6, 0x44, 0x49, 0x0, 0x14, 0x4c, 0x4a, 0x9, - 0x20, 0x95, 0x0, 0x2, 0x1f, 0x0, 0x9, 0x20, - 0xd1, 0x0, 0x0, 0x5f, 0x82, 0x49, 0x23, 0xb5, - 0x20, 0x0, 0xac, 0x29, 0x99, 0x2a, 0x50, 0xd0, - 0x4, 0x5b, 0x6, 0x99, 0x5c, 0x0, 0xb2, 0x7, - 0xb, 0x2, 0x19, 0xe2, 0x1, 0x10, 0x20, 0xb, - 0x0, 0xb, 0x60, 0x5, 0x0, 0x0, 0xb, 0x0, - 0x8c, 0x20, 0x9, 0x10, 0x0, 0xb, 0x26, 0x15, - 0xca, 0xad, 0x30, 0x0, 0x5, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+79FB "移" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x3, 0xa8, 0x0, 0xb4, 0x0, 0x0, 0x4, 0x6d, - 0x20, 0x4, 0xb5, 0x59, 0x30, 0x0, 0xb, 0x0, - 0x19, 0x50, 0x2b, 0x0, 0x0, 0xb, 0x5, 0x30, - 0xa2, 0xb1, 0x0, 0x26, 0x5f, 0x55, 0x10, 0x2a, - 0x10, 0x0, 0x0, 0x3f, 0x20, 0x4, 0x78, 0x50, - 0x0, 0x0, 0x9e, 0x77, 0x42, 0x4b, 0x10, 0x30, - 0x1, 0x8c, 0x7, 0x3, 0xa5, 0x59, 0xb0, 0x7, - 0xc, 0x0, 0x48, 0x70, 0x1c, 0x10, 0x22, 0xc, - 0x1, 0x20, 0x92, 0xb2, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x4a, 0x20, 0x0, 0x0, 0xc, 0x0, 0x57, - 0x50, 0x0, 0x0, 0x0, 0x3, 0x13, 0x0, 0x0, - 0x0, 0x0, - - /* U+7A0B "程" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x37, 0xb9, 0x18, 0x55, 0x59, 0x30, 0x4, 0x3b, - 0x0, 0x1a, 0x0, 0xa, 0x0, 0x0, 0xb, 0x0, - 0xa, 0x0, 0xa, 0x0, 0x15, 0x5c, 0x5a, 0x2c, - 0x55, 0x5c, 0x0, 0x1, 0x1e, 0x0, 0x17, 0x0, - 0x5, 0x0, 0x0, 0x5f, 0x71, 0x35, 0x55, 0x57, - 0x70, 0x0, 0x9c, 0x2b, 0x10, 0xb, 0x0, 0x0, - 0x1, 0x7b, 0x1, 0x0, 0xb, 0x0, 0x0, 0x7, - 0xb, 0x0, 0x16, 0x5c, 0x59, 0x30, 0x23, 0xb, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xb, 0x0, 0x30, 0x0, 0xc, 0x3, 0x65, - 0x57, 0x55, 0x80, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7A2E "種" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x2, 0x95, 0x14, 0x6a, 0xa8, 0x0, 0x3, 0x5c, - 0x20, 0x0, 0xb, 0x0, 0x10, 0x0, 0xb, 0x1, - 0x65, 0x5c, 0x56, 0x70, 0x4, 0x4c, 0x67, 0x20, - 0xb, 0x2, 0x0, 0x2, 0x4d, 0x0, 0xa5, 0x5c, - 0x5c, 0x10, 0x0, 0x7c, 0x80, 0xa5, 0x5c, 0x5c, - 0x0, 0x0, 0xab, 0x65, 0xa0, 0xb, 0xb, 0x0, - 0x5, 0x3b, 0x1, 0xa5, 0x5c, 0x5c, 0x0, 0x5, - 0xb, 0x0, 0x40, 0xb, 0x4, 0x0, 0x10, 0xb, - 0x0, 0x65, 0x5c, 0x59, 0x40, 0x0, 0xc, 0x0, - 0x0, 0xb, 0x0, 0x0, 0x0, 0xc, 0x3, 0x55, - 0x5c, 0x57, 0xd0, 0x0, 0x3, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+7A4D "積" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x27, 0xd3, 0x0, 0xc, 0x0, 0x40, 0x3, 0x3b, - 0x0, 0x65, 0x5c, 0x55, 0x61, 0x0, 0xb, 0x0, - 0x27, 0x5c, 0x57, 0x50, 0x6, 0x6d, 0x85, 0x11, - 0x1b, 0x11, 0x62, 0x0, 0x5d, 0x31, 0x63, 0x33, - 0x33, 0x52, 0x0, 0xab, 0x83, 0x96, 0x55, 0x56, - 0xb0, 0x1, 0x8b, 0x23, 0x86, 0x55, 0x56, 0x90, - 0x7, 0x1b, 0x0, 0x81, 0x0, 0x2, 0x90, 0x14, - 0xb, 0x0, 0x86, 0x55, 0x56, 0x90, 0x0, 0xb, - 0x0, 0x96, 0x55, 0x56, 0x90, 0x0, 0xc, 0x0, - 0x2a, 0x60, 0x37, 0x10, 0x0, 0xb, 0x3, 0x73, - 0x0, 0x2, 0xc0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x20, - - /* U+7A76 "究" */ - 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x75, - 0x55, 0x87, 0x55, 0x5c, 0x10, 0x3, 0x90, 0x94, - 0x1, 0x50, 0x36, 0x0, 0x3, 0x29, 0x75, 0x10, - 0x2b, 0xa0, 0x0, 0x2, 0x61, 0xb, 0x10, 0x0, - 0x91, 0x0, 0x0, 0x46, 0x6d, 0x66, 0x94, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x0, 0x92, 0x0, 0x0, - 0x0, 0x0, 0x38, 0x0, 0x92, 0x0, 0x0, 0x0, - 0x0, 0x93, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x2, - 0xb0, 0x0, 0xa1, 0x0, 0x50, 0x0, 0xb, 0x20, - 0x0, 0xa1, 0x1, 0x90, 0x1, 0x82, 0x0, 0x0, - 0x5b, 0xac, 0x90, 0x4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7A7A "空" */ - 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x16, 0x0, 0x2, 0x0, 0x4, 0x95, 0x56, - 0x55, 0x55, 0x5c, 0x80, 0xd, 0x30, 0xa9, 0x0, - 0x57, 0x25, 0x0, 0x0, 0x9, 0x70, 0x0, 0x2, - 0xc8, 0x0, 0x2, 0x72, 0x0, 0x0, 0x0, 0x1b, - 0x10, 0x3, 0x17, 0x55, 0x85, 0x57, 0x80, 0x0, - 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x0, 0x0, 0x5, 0x55, 0x55, 0xc7, - 0x55, 0x5d, 0x60, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7A93 "窓" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x75, - 0x55, 0x5c, 0x55, 0x56, 0xa0, 0x3, 0x90, 0x18, - 0x0, 0x54, 0x5, 0x50, 0x6, 0x25, 0xa4, 0x63, - 0x4, 0xd7, 0x0, 0x0, 0x52, 0x3, 0xc3, 0x10, - 0x4, 0x0, 0x0, 0x0, 0x58, 0x0, 0xa, 0x10, - 0x0, 0x0, 0x8, 0xda, 0x87, 0x68, 0xb0, 0x0, - 0x0, 0x2, 0x30, 0x50, 0x0, 0x80, 0x0, 0x0, - 0x10, 0xc1, 0x2c, 0x0, 0x5, 0x0, 0x0, 0x70, - 0xc0, 0x7, 0x0, 0x46, 0x70, 0x7, 0x90, 0xc0, - 0x0, 0x1, 0x70, 0xb0, 0x3, 0x0, 0xbb, 0xbb, - 0xbc, 0xb0, 0x0, - - /* U+7ACB "立" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x68, 0x0, 0x1, 0x0, 0x2, 0x65, 0x55, - 0x55, 0x55, 0x5c, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0xe, - 0x40, 0x0, 0x0, 0x0, 0x90, 0x0, 0x1c, 0x0, - 0x0, 0x0, 0x0, 0x67, 0x0, 0x47, 0x0, 0x0, - 0x0, 0x0, 0x3d, 0x0, 0x91, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x2, 0x40, 0x0, 0x0, 0x15, 0x55, 0x55, - 0x59, 0x55, 0x57, 0xd1, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+7AD9 "站" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x43, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x7, 0x0, - 0x30, 0xb, 0x1, 0x40, 0x6, 0x55, 0x56, 0x70, - 0xc, 0x55, 0x50, 0x0, 0x10, 0x28, 0x0, 0xb, - 0x0, 0x0, 0x0, 0x70, 0x57, 0x0, 0xb, 0x0, - 0x0, 0x0, 0xb0, 0x72, 0xa, 0x5a, 0x5b, 0x30, - 0x0, 0x94, 0x80, 0xb, 0x0, 0xb, 0x0, 0x0, - 0x51, 0x60, 0xb, 0x0, 0xb, 0x0, 0x0, 0x36, - 0x95, 0x2b, 0x0, 0xb, 0x0, 0xc, 0x83, 0x0, - 0xc, 0x55, 0x5c, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7AE5 "童" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x40, 0x14, 0x0, 0x0, 0x46, 0x97, - 0x55, 0xc6, 0x50, 0x0, 0x0, 0x1, 0xb0, 0x26, - 0x0, 0x0, 0x5, 0x65, 0x56, 0x57, 0x55, 0x87, - 0x0, 0x0, 0x75, 0x55, 0x55, 0x75, 0x0, 0x0, - 0xb, 0x0, 0x91, 0x5, 0x50, 0x0, 0x0, 0xb5, - 0x5b, 0x65, 0x95, 0x0, 0x0, 0xb, 0x55, 0xb6, - 0x59, 0x60, 0x0, 0x0, 0x60, 0x9, 0x10, 0x33, - 0x0, 0x0, 0x55, 0x55, 0xb6, 0x55, 0xb4, 0x0, - 0x0, 0x0, 0x9, 0x10, 0x0, 0x20, 0x6, 0x55, - 0x55, 0x75, 0x55, 0x58, 0x50, - - /* U+7AEF "端" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x71, 0x0, 0x50, 0x1c, 0x2, 0x10, 0x0, 0x48, - 0x0, 0xb0, 0xa, 0x4, 0x70, 0x0, 0x1, 0x50, - 0xa0, 0xa, 0x4, 0x60, 0x5, 0x44, 0x62, 0x85, - 0x55, 0x57, 0x40, 0x3, 0x10, 0xd3, 0x55, 0x55, - 0x55, 0x92, 0x1, 0x72, 0x80, 0x10, 0x92, 0x0, - 0x0, 0x0, 0xb5, 0x30, 0x85, 0xa5, 0x55, 0x90, - 0x0, 0x66, 0x0, 0xb0, 0xa0, 0xa0, 0xb0, 0x0, - 0x8, 0x53, 0xb0, 0xa0, 0xa0, 0xb0, 0xb, 0xa3, - 0x0, 0xb0, 0xa0, 0xa0, 0xb0, 0x1, 0x0, 0x0, - 0xb0, 0xa0, 0x90, 0xb0, 0x0, 0x0, 0x0, 0xb0, - 0x40, 0x29, 0xa0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x2, 0x10, - - /* U+7B11 "笑" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x30, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x4c, - 0x55, 0xb3, 0xc6, 0x57, 0xb0, 0x0, 0xa0, 0x82, - 0x5, 0x50, 0xa1, 0x0, 0x6, 0x20, 0x47, 0x15, - 0x0, 0x73, 0x0, 0x1, 0x0, 0x13, 0x67, 0xad, - 0xc0, 0x0, 0x0, 0x24, 0x43, 0xb3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x2, 0x10, - 0x6, 0x55, 0x55, 0xd7, 0x55, 0x58, 0x60, 0x0, - 0x0, 0x4, 0x83, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x10, 0x83, 0x0, 0x0, 0x0, 0x1, 0x92, - 0x0, 0xa, 0x92, 0x0, 0x2, 0x56, 0x0, 0x0, - 0x0, 0x6e, 0xa0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7B26 "符" */ - 0x0, 0x2, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0xd, 0x30, 0x0, 0x69, 0x0, 0x0, 0x0, 0x6a, - 0x65, 0x92, 0xb5, 0x75, 0x90, 0x1, 0x90, 0x1a, - 0x5, 0x30, 0x83, 0x0, 0x6, 0x0, 0x54, 0x25, - 0x0, 0x32, 0x0, 0x0, 0x2, 0xd1, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0xb, 0x25, 0x55, 0x55, 0xc5, - 0xa2, 0x0, 0x7d, 0x10, 0x20, 0x0, 0xb0, 0x0, - 0x6, 0x3b, 0x0, 0x75, 0x0, 0xb0, 0x0, 0x11, - 0xb, 0x0, 0xd, 0x0, 0xb0, 0x0, 0x0, 0xb, - 0x0, 0x1, 0x0, 0xb0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x6c, 0x90, 0x0, 0x0, 0x2, 0x0, 0x0, 0x3, - 0x0, 0x0, - - /* U+7B2C "第" */ - 0x0, 0x2, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, - 0xc, 0x50, 0x10, 0x8a, 0x0, 0x10, 0x0, 0x6a, - 0x85, 0x94, 0xc7, 0x65, 0x91, 0x3, 0x70, 0x66, - 0x8, 0x0, 0xb0, 0x0, 0x2, 0x25, 0x67, 0x65, - 0x55, 0x89, 0x0, 0x0, 0x1, 0x0, 0xb, 0x0, - 0xb, 0x0, 0x0, 0x9, 0x55, 0x5c, 0x55, 0x5b, - 0x0, 0x0, 0x1b, 0x0, 0xb, 0x0, 0x5, 0x0, - 0x0, 0x7a, 0x55, 0x5c, 0x55, 0x55, 0x90, 0x0, - 0x21, 0x5, 0x9b, 0x0, 0x1, 0xb0, 0x0, 0x0, - 0x59, 0xb, 0x0, 0x4, 0x80, 0x0, 0x18, 0x50, - 0xb, 0x2, 0x9e, 0x30, 0x15, 0x50, 0x0, 0xb, - 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+7B46 "筆" */ - 0x0, 0x4, 0x10, 0x0, 0x22, 0x0, 0x0, 0x0, - 0xd, 0x40, 0x0, 0x78, 0x0, 0x10, 0x0, 0x5b, - 0x65, 0x95, 0xc5, 0x76, 0xa0, 0x0, 0xa0, 0x2b, - 0x6, 0x30, 0x69, 0x0, 0x7, 0x10, 0x8, 0x39, - 0x0, 0x1a, 0x0, 0x1, 0x4, 0x65, 0x6b, 0x55, - 0xd2, 0x0, 0x1, 0x55, 0x55, 0x6b, 0x55, 0xd9, - 0x80, 0x0, 0x10, 0x0, 0x29, 0x0, 0xc0, 0x0, - 0x0, 0x4, 0x65, 0x6b, 0x55, 0xa0, 0x0, 0x0, - 0x2, 0x22, 0x4a, 0x23, 0x80, 0x0, 0x0, 0x3, - 0x33, 0x5a, 0x33, 0x35, 0x10, 0x3, 0x65, 0x55, - 0x6b, 0x55, 0x57, 0x40, 0x0, 0x0, 0x0, 0x2a, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x0, - - /* U+7B49 "等" */ - 0x0, 0x3, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, - 0xe, 0x50, 0x10, 0x88, 0x0, 0x10, 0x0, 0x5b, - 0x75, 0x85, 0xb7, 0x55, 0x80, 0x1, 0xa0, 0x84, - 0x5, 0x10, 0xb0, 0x0, 0x6, 0x0, 0x35, 0xc, - 0x0, 0x70, 0x0, 0x0, 0x6, 0x55, 0x5d, 0x55, - 0x78, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x30, 0x6, 0x55, 0x55, 0x57, 0x56, 0x55, 0x70, - 0x0, 0x0, 0x0, 0x0, 0xb, 0x21, 0x30, 0x1, - 0x75, 0x75, 0x55, 0x5c, 0x55, 0x60, 0x0, 0x0, - 0x39, 0x0, 0xb, 0x10, 0x0, 0x0, 0x0, 0xb, - 0x10, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xae, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x0, 0x0, - - /* U+7B54 "答" */ - 0x0, 0x2, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0xf, 0x20, 0x1, 0xe0, 0x0, 0x0, 0x0, 0x7b, - 0x55, 0xa7, 0x86, 0x59, 0x30, 0x1, 0xa0, 0xa0, - 0x16, 0x6, 0x60, 0x0, 0x7, 0x10, 0x85, 0xe1, - 0x0, 0xa0, 0x0, 0x0, 0x0, 0x4b, 0x17, 0x20, - 0x0, 0x0, 0x0, 0x6, 0x90, 0x0, 0x79, 0x30, - 0x0, 0x1, 0x85, 0x65, 0x55, 0xa4, 0xae, 0x80, - 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x55, 0x55, 0x5d, 0x30, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xc, 0x55, 0x55, - 0x5d, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+7B56 "策" */ - 0x0, 0x1, 0x10, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x9, 0x70, 0x0, 0x93, 0x0, 0x0, 0x0, 0x3c, - 0x75, 0x86, 0xa7, 0x58, 0x70, 0x0, 0x90, 0x47, - 0x5, 0x8, 0x40, 0x0, 0x4, 0x0, 0x4, 0xa, - 0x2, 0x22, 0x30, 0x4, 0x55, 0x55, 0x5c, 0x55, - 0x58, 0x80, 0x0, 0x7, 0x55, 0x5c, 0x55, 0x83, - 0x0, 0x0, 0xb, 0x0, 0xb, 0x0, 0xa1, 0x0, - 0x0, 0xb, 0x0, 0x7d, 0x11, 0xb0, 0x0, 0x0, - 0xb, 0x6, 0x8b, 0x87, 0xc0, 0x0, 0x0, 0x0, - 0x86, 0xb, 0x1a, 0x30, 0x0, 0x0, 0x38, 0x20, - 0xb, 0x0, 0xac, 0x83, 0x15, 0x30, 0x0, 0xb, - 0x0, 0x3, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7B97 "算" */ - 0x0, 0x4, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0xd, 0x10, 0x30, 0xb2, 0x0, 0x10, 0x0, 0x77, - 0x96, 0x75, 0x85, 0x96, 0x60, 0x2, 0x71, 0x37, - 0x5, 0x0, 0x85, 0x0, 0x5, 0xb, 0x55, 0x55, - 0x57, 0xb0, 0x0, 0x0, 0xb, 0x55, 0x55, 0x57, - 0x90, 0x0, 0x0, 0xb, 0x0, 0x0, 0x3, 0x90, - 0x0, 0x0, 0xc, 0x55, 0x55, 0x57, 0x90, 0x0, - 0x0, 0xc, 0x59, 0x55, 0x97, 0x90, 0x0, 0x0, - 0x2, 0x2b, 0x0, 0xc0, 0x0, 0x20, 0x16, 0x55, - 0x8b, 0x55, 0xd5, 0x57, 0x80, 0x0, 0x0, 0xb2, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x38, 0x20, 0x0, - 0xc0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x30, - 0x0, 0x0, - - /* U+7BA1 "管" */ - 0x0, 0x3, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x79, 0x0, 0x11, 0xc1, 0x1, 0x0, 0x0, 0xb7, - 0x66, 0x58, 0x68, 0x57, 0x40, 0x7, 0x10, 0xa0, - 0x61, 0x6, 0x60, 0x0, 0x3, 0x0, 0x20, 0x92, - 0x0, 0x12, 0x30, 0x9, 0x55, 0x55, 0x55, 0x55, - 0x5b, 0x80, 0x29, 0x8, 0x55, 0x55, 0x5c, 0x4, - 0x0, 0x0, 0xa, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0xa, 0x55, 0x55, 0x5b, 0x0, 0x0, 0x0, - 0xa, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0xa, - 0x55, 0x55, 0x5a, 0x60, 0x0, 0x0, 0xa, 0x0, - 0x0, 0x7, 0x30, 0x0, 0x0, 0xb, 0x55, 0x55, - 0x5a, 0x40, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7BC0 "節" */ - 0x0, 0x4, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, - 0x3c, 0x0, 0x60, 0xb3, 0x3, 0x40, 0x0, 0xa5, - 0xa8, 0x54, 0xa6, 0xa5, 0x40, 0x4, 0x30, 0xc, - 0x7, 0x0, 0x5a, 0x0, 0x13, 0x20, 0x0, 0x41, - 0x20, 0x7, 0x0, 0x0, 0xb5, 0x55, 0xd1, 0xc5, - 0x5d, 0x0, 0x0, 0xb5, 0x55, 0xb0, 0xb0, 0xb, - 0x0, 0x0, 0xb0, 0x0, 0xb0, 0xb0, 0xb, 0x0, - 0x0, 0xb5, 0x55, 0xb0, 0xb0, 0xb, 0x0, 0x0, - 0xb0, 0x3, 0x10, 0xb0, 0xb, 0x0, 0x0, 0xb0, - 0x8, 0x50, 0xb2, 0x9a, 0x0, 0x0, 0xc7, 0x74, - 0xe0, 0xb0, 0x20, 0x0, 0x0, 0x74, 0x0, 0x41, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+7BC4 "範" */ - 0x0, 0x3, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, - 0x4d, 0x10, 0x60, 0xa5, 0x3, 0x40, 0x0, 0xb6, - 0xa6, 0x55, 0xa6, 0xb6, 0x40, 0x5, 0x40, 0x3d, - 0x8, 0x0, 0x3d, 0x10, 0x4, 0x11, 0xc4, 0x61, - 0x20, 0x8, 0x0, 0x2, 0x64, 0xb4, 0x51, 0xc5, - 0x5c, 0x0, 0x0, 0xb5, 0xc5, 0xc0, 0xa0, 0xa, - 0x0, 0x0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa, 0x0, - 0x0, 0xc5, 0xc5, 0xa0, 0xa0, 0xa, 0x0, 0x0, - 0xc5, 0xc5, 0xb0, 0xa4, 0x7a, 0x0, 0x0, 0x20, - 0xa0, 0x70, 0xa0, 0x41, 0x20, 0x5, 0x55, 0xc5, - 0x52, 0xa0, 0x0, 0x50, 0x0, 0x0, 0xb0, 0x0, - 0xb9, 0x9a, 0xc0, 0x0, 0x0, 0x40, 0x0, 0x0, - 0x0, 0x0, - - /* U+7C21 "簡" */ - 0x0, 0x3, 0x0, 0x0, 0x40, 0x0, 0x0, 0x3, - 0xc0, 0x6, 0x3d, 0x10, 0x43, 0x0, 0xa6, 0xb5, - 0x5a, 0x6b, 0x75, 0x40, 0x51, 0x6, 0x52, 0x20, - 0x1c, 0x0, 0x0, 0xb4, 0x4b, 0x27, 0x54, 0x5c, - 0x10, 0xc, 0x55, 0xc0, 0x86, 0x55, 0xc0, 0x0, - 0xb0, 0xa, 0x8, 0x20, 0xb, 0x0, 0xc, 0x55, - 0x90, 0x75, 0x55, 0xc0, 0x0, 0xb0, 0x85, 0x55, - 0x88, 0xb, 0x0, 0xb, 0x9, 0x55, 0x58, 0x70, - 0xb0, 0x0, 0xb0, 0x91, 0x0, 0x47, 0xb, 0x0, - 0xb, 0x9, 0x55, 0x57, 0x50, 0xb0, 0x0, 0xc0, - 0x0, 0x0, 0x4, 0x8d, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x1, 0x20, - - /* U+7C73 "米" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0xb5, 0x0, 0x60, 0x0, 0x0, 0x1a, - 0x10, 0xb1, 0x6, 0xc1, 0x0, 0x0, 0x7, 0xa0, - 0xb1, 0xb, 0x10, 0x0, 0x0, 0x1, 0x90, 0xb1, - 0x72, 0x0, 0x0, 0x16, 0x55, 0x56, 0xd8, 0x85, - 0x5b, 0x70, 0x0, 0x0, 0xb, 0xf7, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x4a, 0xb2, 0x80, 0x0, 0x0, - 0x0, 0x1, 0xc1, 0xb1, 0x67, 0x0, 0x0, 0x0, - 0xb, 0x20, 0xb1, 0xa, 0x80, 0x0, 0x0, 0x91, - 0x0, 0xb1, 0x0, 0xbd, 0x60, 0x26, 0x0, 0x0, - 0xb1, 0x0, 0x9, 0x50, 0x0, 0x0, 0x0, 0xb2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+7CBE "精" */ - 0x0, 0x2, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, - 0xd, 0x10, 0x0, 0xc, 0x0, 0x0, 0x6, 0xb, - 0xb, 0x36, 0x5c, 0x57, 0x60, 0x6, 0x6b, 0x63, - 0x0, 0xb, 0x3, 0x0, 0x1, 0x3b, 0x31, 0x6, - 0x5c, 0x56, 0x10, 0x6, 0x5d, 0x57, 0x45, 0x5c, - 0x55, 0x90, 0x0, 0x5e, 0x10, 0x12, 0x0, 0x2, - 0x0, 0x0, 0xac, 0xa4, 0xc, 0x55, 0x5d, 0x10, - 0x1, 0x9b, 0x27, 0xc, 0x55, 0x5c, 0x0, 0x7, - 0x2b, 0x0, 0xb, 0x0, 0xb, 0x0, 0x14, 0xb, - 0x0, 0xc, 0x55, 0x5c, 0x0, 0x10, 0xb, 0x0, - 0xb, 0x0, 0xb, 0x0, 0x0, 0xc, 0x0, 0xb, - 0x2, 0x8c, 0x0, 0x0, 0x2, 0x0, 0x3, 0x0, - 0x12, 0x0, - - /* U+7CD6 "糖" */ - 0x0, 0x20, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, - 0x67, 0x0, 0x0, 0xc, 0x0, 0x10, 0x15, 0x65, - 0x95, 0xb5, 0x59, 0x57, 0x70, 0xc, 0x66, 0x90, - 0xb0, 0xc, 0x1, 0x0, 0x5, 0x69, 0x0, 0xb4, - 0x6c, 0x5d, 0x0, 0x36, 0xa8, 0x95, 0xb1, 0x1b, - 0xb, 0x50, 0x0, 0xb5, 0x0, 0xa5, 0x4c, 0x5c, - 0x40, 0x0, 0xea, 0x71, 0xa3, 0x5c, 0x5c, 0x0, - 0x5, 0xa5, 0xa3, 0x81, 0xb, 0x4, 0x0, 0x7, - 0x65, 0x6, 0x58, 0x56, 0x5b, 0x10, 0x31, 0x65, - 0x9, 0xa, 0x0, 0xb, 0x0, 0x0, 0x75, 0x16, - 0xa, 0x0, 0xb, 0x0, 0x0, 0x75, 0x60, 0xb, - 0x55, 0x5c, 0x0, 0x0, 0x20, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+7CFB "系" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, - 0x2, 0x46, 0x79, 0xaa, 0x60, 0x0, 0x24, 0x32, - 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x85, 0x0, - 0x25, 0x0, 0x0, 0x4, 0x94, 0x23, 0x5c, 0x60, - 0x0, 0x0, 0x9a, 0x65, 0xa7, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x81, 0x3, 0x60, 0x0, 0x1, 0x8b, - 0x64, 0x55, 0x59, 0xe1, 0x0, 0x1a, 0x64, 0x2c, - 0x0, 0x9, 0x20, 0x0, 0x7, 0x70, 0xc1, 0x61, - 0x0, 0x0, 0x5, 0xb1, 0xc, 0x1, 0xb9, 0x0, - 0x7, 0x60, 0x21, 0xc0, 0x0, 0xc8, 0x5, 0x10, - 0x3, 0xca, 0x0, 0x1, 0x50, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, - - /* U+7D00 "紀" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x30, 0x0, 0x0, 0x5, 0x10, 0x0, 0x38, - 0x0, 0x36, 0x55, 0x5d, 0x20, 0x0, 0x80, 0x34, - 0x0, 0x0, 0xc, 0x0, 0xb, 0x65, 0xb3, 0x0, - 0x0, 0xc, 0x0, 0x6, 0x38, 0x40, 0x7, 0x55, - 0x5d, 0x0, 0x0, 0x65, 0x26, 0xc, 0x0, 0x6, - 0x0, 0x8, 0x84, 0x6d, 0x2c, 0x0, 0x0, 0x0, - 0xb, 0x82, 0x6, 0x1c, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x16, 0xc, 0x0, 0x0, 0x20, 0x6, 0xb, - 0xb, 0x2c, 0x0, 0x0, 0x80, 0xb, 0xb, 0x36, - 0x3d, 0x0, 0x0, 0xc0, 0x36, 0x3, 0x0, 0x9, - 0xdb, 0xbd, 0xe1, - - /* U+7D04 "約" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xa0, 0x0, 0x6b, 0x0, 0x0, 0x0, 0xa, - 0x10, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x72, 0x9, - 0x1, 0xd5, 0x55, 0xb1, 0x7, 0xa6, 0x97, 0x6, - 0x20, 0x0, 0xc0, 0x4, 0x54, 0x80, 0x15, 0x0, - 0x0, 0xc0, 0x0, 0x38, 0x8, 0x12, 0x20, 0x0, - 0xc0, 0x5, 0xb4, 0x6a, 0x80, 0xb6, 0x0, 0xb0, - 0x5, 0x83, 0x2, 0x50, 0x1d, 0x1, 0xa0, 0x0, - 0x12, 0x5, 0x10, 0x1, 0x2, 0x90, 0x4, 0x36, - 0x51, 0xc0, 0x0, 0x4, 0x80, 0xb, 0x23, 0xa0, - 0xa0, 0x0, 0x6, 0x60, 0x9, 0x0, 0x20, 0x0, - 0x5, 0xce, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+7D19 "紙" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x10, 0x0, 0x1, 0x7c, 0x10, 0x0, 0x74, - 0x0, 0x85, 0x6d, 0x40, 0x0, 0x3, 0x70, 0x63, - 0x91, 0xb, 0x0, 0x0, 0x2d, 0x76, 0xb1, 0x91, - 0xb, 0x0, 0x0, 0x6, 0x19, 0x10, 0x91, 0xa, - 0x3, 0x30, 0x0, 0x91, 0x62, 0x95, 0x5b, 0x55, - 0x40, 0x1c, 0x66, 0x8b, 0x91, 0x7, 0x20, 0x0, - 0x9, 0x40, 0x7, 0x91, 0x5, 0x60, 0x0, 0x1, - 0x20, 0x61, 0x91, 0x0, 0xa0, 0x10, 0x7, 0x47, - 0x2b, 0x91, 0x1, 0xa2, 0x60, 0x39, 0xb, 0x2, - 0xa7, 0x50, 0x2c, 0xa0, 0x64, 0x0, 0x0, 0xa4, - 0x0, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7D20 "素" */ - 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2b, 0x0, 0x6, 0x0, 0x0, 0x56, - 0x55, 0x6b, 0x55, 0x55, 0x20, 0x0, 0x5, 0x55, - 0x6b, 0x55, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x29, - 0x0, 0x0, 0x60, 0x6, 0x55, 0x5b, 0xa5, 0x55, - 0x55, 0x62, 0x0, 0x2, 0x75, 0x12, 0xc6, 0x0, - 0x0, 0x0, 0x7, 0x96, 0x8a, 0x33, 0x0, 0x0, - 0x0, 0x0, 0x48, 0x40, 0x6, 0xa0, 0x0, 0x0, - 0xe, 0xd8, 0x8c, 0x53, 0x75, 0x0, 0x0, 0x2, - 0x92, 0x29, 0x25, 0x10, 0x0, 0x0, 0x9, 0x70, - 0x29, 0x2, 0xb8, 0x0, 0x2, 0x61, 0x16, 0xd8, - 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x0, - - /* U+7D30 "細" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x74, - 0x0, 0xb5, 0x5a, 0x57, 0xc0, 0x3, 0x60, 0x62, - 0xb0, 0xb, 0x2, 0x90, 0x3c, 0x66, 0xc1, 0xb0, - 0xb, 0x2, 0x90, 0x6, 0x2a, 0x10, 0xb0, 0xb, - 0x2, 0x90, 0x0, 0x91, 0x70, 0xb5, 0x5c, 0x56, - 0x90, 0x2c, 0x66, 0x98, 0xb0, 0xb, 0x2, 0x90, - 0x1a, 0x51, 0x16, 0xb0, 0xb, 0x2, 0x90, 0x1, - 0x10, 0x61, 0xb0, 0xb, 0x2, 0x90, 0x7, 0x28, - 0x3b, 0xb0, 0xb, 0x2, 0x90, 0x2a, 0xd, 0x5, - 0xb5, 0x5b, 0x56, 0x90, 0x44, 0x1, 0x0, 0xb0, - 0x0, 0x2, 0x90, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+7D39 "紹" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0x50, 0x35, 0x55, 0x55, 0xa1, 0x0, 0x2a, - 0x0, 0x10, 0xa3, 0x0, 0xc0, 0x0, 0x90, 0x16, - 0x0, 0xc1, 0x1, 0xb0, 0xa, 0x75, 0xa5, 0x1, - 0xc0, 0x3, 0x90, 0x7, 0x57, 0x60, 0x7, 0x50, - 0x5, 0x70, 0x0, 0x47, 0x33, 0x27, 0x1, 0x8d, - 0x30, 0x6, 0x82, 0x5d, 0x43, 0x0, 0x3, 0x40, - 0xa, 0x94, 0x17, 0xc, 0x55, 0x55, 0xd0, 0x0, - 0x2, 0x18, 0xb, 0x0, 0x0, 0xb0, 0x4, 0x28, - 0x28, 0x6b, 0x0, 0x0, 0xb0, 0xb, 0x26, 0x61, - 0x3c, 0x55, 0x55, 0xb0, 0x8, 0x0, 0x0, 0xa, - 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7D42 "終" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0xa, 0x30, 0x2, 0xe1, 0x0, 0x0, 0x0, 0x39, - 0x0, 0x8, 0x85, 0x5a, 0x20, 0x0, 0x90, 0x35, - 0x2b, 0x10, 0x2b, 0x0, 0xb, 0x76, 0xb3, 0x60, - 0x70, 0xa2, 0x0, 0x5, 0x38, 0x40, 0x0, 0x5a, - 0x70, 0x0, 0x0, 0x64, 0x25, 0x0, 0x4e, 0x60, - 0x0, 0x9, 0x85, 0x5d, 0x15, 0x70, 0xab, 0x50, - 0x8, 0x62, 0x5, 0x62, 0x29, 0x25, 0x81, 0x1, - 0x2, 0x35, 0x0, 0x4, 0xa0, 0x0, 0x7, 0xa, - 0xc, 0x12, 0x62, 0x10, 0x0, 0xc, 0xb, 0x23, - 0x0, 0x1a, 0xb1, 0x0, 0x26, 0x0, 0x0, 0x0, - 0x0, 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+7D44 "組" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x30, 0x7, 0x55, 0x59, 0x0, 0x0, 0x47, - 0x0, 0xc, 0x0, 0xc, 0x0, 0x1, 0x80, 0x36, - 0xc, 0x0, 0xc, 0x0, 0xc, 0x76, 0xb3, 0xc, - 0x0, 0xc, 0x0, 0x6, 0x38, 0x30, 0xd, 0x55, - 0x5c, 0x0, 0x0, 0x74, 0x26, 0xc, 0x0, 0xc, - 0x0, 0xa, 0x85, 0x6d, 0x2c, 0x0, 0xc, 0x0, - 0x8, 0x61, 0x5, 0x1d, 0x55, 0x5c, 0x0, 0x1, - 0x3, 0x26, 0xc, 0x0, 0xc, 0x0, 0x7, 0xa, - 0xc, 0x1c, 0x0, 0xc, 0x0, 0xc, 0x9, 0x32, - 0xc, 0x0, 0xc, 0x0, 0x16, 0x0, 0x4, 0x5d, - 0x55, 0x5d, 0xd1, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+7D4C "経" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x66, 0x55, 0x59, 0x40, 0x0, 0x74, - 0x0, 0x7, 0x0, 0x1d, 0x20, 0x2, 0x70, 0x62, - 0x2, 0x70, 0xa4, 0x0, 0x1c, 0x55, 0xb0, 0x0, - 0x7b, 0x60, 0x0, 0x7, 0x3a, 0x10, 0x0, 0x9b, - 0xa2, 0x0, 0x0, 0x82, 0x61, 0x48, 0x14, 0x4d, - 0xc2, 0x9, 0x64, 0x7b, 0x10, 0xd, 0x0, 0x10, - 0xa, 0x62, 0x7, 0x25, 0x5d, 0x59, 0x50, 0x0, - 0x12, 0x52, 0x1, 0xc, 0x0, 0x0, 0x7, 0xb, - 0xd, 0x0, 0xc, 0x0, 0x0, 0x1c, 0xc, 0x5, - 0x0, 0xc, 0x0, 0x70, 0x25, 0x0, 0x3, 0x65, - 0x55, 0x55, 0x51, - - /* U+7D50 "結" */ - 0x0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0xc, 0x20, 0x0, 0xc, 0x10, 0x0, 0x0, 0x66, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x2, 0x80, 0x54, - 0x45, 0x5c, 0x55, 0xb1, 0x1c, 0x66, 0xc2, 0x10, - 0xb, 0x0, 0x0, 0x7, 0x39, 0x20, 0x0, 0xb, - 0x0, 0x0, 0x0, 0x83, 0x34, 0x16, 0x5a, 0x59, - 0x40, 0x1a, 0x64, 0x6e, 0x10, 0x0, 0x0, 0x0, - 0xb, 0x62, 0x7, 0xb, 0x55, 0x5c, 0x20, 0x1, - 0x3, 0x26, 0xb, 0x0, 0xb, 0x0, 0x6, 0xa, - 0xb, 0x2b, 0x0, 0xb, 0x0, 0xc, 0xa, 0x34, - 0x1c, 0x55, 0x5c, 0x0, 0x27, 0x1, 0x0, 0xb, - 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7D61 "絡" */ - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - 0x1c, 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0x73, - 0x0, 0xa, 0x75, 0x59, 0x10, 0x2, 0x70, 0x60, - 0x2b, 0x0, 0x3c, 0x10, 0x1b, 0x34, 0xc0, 0x72, - 0x50, 0xc1, 0x0, 0x9, 0x4b, 0x12, 0x0, 0x5b, - 0x30, 0x0, 0x0, 0x72, 0x60, 0x0, 0x99, 0x80, - 0x0, 0x8, 0x42, 0x87, 0x37, 0x10, 0x5d, 0x91, - 0x1e, 0x95, 0x29, 0x28, 0x55, 0x59, 0x20, 0x0, - 0x0, 0x20, 0xb, 0x0, 0xb, 0x0, 0x5, 0x6, - 0x56, 0xb, 0x0, 0xb, 0x0, 0xb, 0xd, 0x1b, - 0xb, 0x0, 0xb, 0x0, 0x48, 0x6, 0x0, 0xd, - 0x55, 0x5b, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x1, 0x0, - - /* U+7D66 "給" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x8, 0x50, 0x0, 0x2e, 0x10, 0x0, 0x0, 0x1a, - 0x0, 0x0, 0x87, 0x40, 0x0, 0x0, 0x81, 0x34, - 0x1, 0xb0, 0x70, 0x0, 0x7, 0x85, 0xa3, 0x9, - 0x20, 0x1b, 0x10, 0x4, 0x57, 0x50, 0x63, 0x0, - 0x16, 0xe4, 0x0, 0x36, 0x27, 0x16, 0x55, 0x64, - 0x30, 0x4, 0xa4, 0x6d, 0x11, 0x0, 0x3, 0x0, - 0x5, 0x83, 0x6, 0x1c, 0x55, 0x5d, 0x10, 0x1, - 0x14, 0x35, 0xa, 0x0, 0xb, 0x0, 0x6, 0x27, - 0x3d, 0x2a, 0x0, 0xb, 0x0, 0xd, 0x6, 0x54, - 0x1c, 0x55, 0x5c, 0x0, 0x3, 0x0, 0x0, 0x1a, - 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7D71 "統" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0xb, 0x30, 0x0, 0x97, 0x0, 0x0, 0x0, 0x38, - 0x0, 0x0, 0x17, 0x0, 0x60, 0x0, 0x90, 0x34, - 0x65, 0xa8, 0x55, 0x50, 0xb, 0x65, 0xb3, 0x3, - 0xa0, 0x31, 0x0, 0x7, 0x38, 0x30, 0x47, 0x0, - 0x1b, 0x20, 0x0, 0x64, 0x34, 0x99, 0x65, 0x36, - 0x80, 0x9, 0x74, 0x6e, 0x16, 0x50, 0xa0, 0x0, - 0xb, 0x83, 0x17, 0x7, 0x40, 0xb0, 0x0, 0x1, - 0x11, 0x55, 0x9, 0x20, 0xb0, 0x0, 0x7, 0xb, - 0xc, 0xb, 0x0, 0xb0, 0x30, 0x1c, 0xa, 0x1, - 0x57, 0x0, 0xb0, 0x60, 0x13, 0x0, 0x6, 0x60, - 0x0, 0xba, 0xd4, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, 0x0, - - /* U+7D75 "絵" */ - 0x0, 0x1, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, - 0x1d, 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x93, - 0x0, 0x1, 0xc5, 0x20, 0x0, 0x4, 0x50, 0x82, - 0x9, 0x30, 0x91, 0x0, 0x2d, 0x77, 0xb0, 0x55, - 0x0, 0x1c, 0x40, 0x5, 0x1a, 0x14, 0x34, 0x55, - 0xb5, 0xb3, 0x0, 0x91, 0x62, 0x1, 0x0, 0x0, - 0x0, 0x1a, 0x44, 0x8b, 0x0, 0x0, 0x4, 0x30, - 0x1d, 0x73, 0x8, 0x55, 0xa7, 0x55, 0x40, 0x0, - 0x11, 0x51, 0x1, 0xd2, 0x0, 0x0, 0x6, 0xa, - 0x1c, 0x9, 0x20, 0x33, 0x0, 0xa, 0xb, 0x6, - 0x74, 0x12, 0x3c, 0x20, 0x24, 0x0, 0x0, 0xb9, - 0x64, 0x25, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7D93 "經" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0x1, 0x55, 0x55, 0x58, 0x90, 0x0, 0x82, - 0x0, 0x23, 0x5, 0x4, 0x0, 0x2, 0x60, 0x70, - 0x68, 0x3a, 0x1c, 0x10, 0x1b, 0x46, 0xa0, 0x90, - 0x80, 0x71, 0x0, 0x8, 0x3a, 0x1, 0x70, 0x80, - 0x83, 0x0, 0x0, 0x82, 0x50, 0x86, 0x4a, 0xd, - 0x10, 0x7, 0x51, 0x95, 0x26, 0x7, 0x4, 0x0, - 0xd, 0xa5, 0x47, 0x45, 0x55, 0x57, 0x70, 0x1, - 0x1, 0x41, 0x10, 0xb, 0x0, 0x0, 0x6, 0x9, - 0x1b, 0x0, 0xb, 0x0, 0x0, 0xc, 0xc, 0x6, - 0x0, 0xb, 0x0, 0x0, 0x18, 0x2, 0x2, 0x55, - 0x5c, 0x56, 0xd1, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+7D9A "続" */ - 0x0, 0x1, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x1c, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x73, - 0x0, 0x55, 0x5c, 0x57, 0xa0, 0x1, 0x70, 0x60, - 0x10, 0xb, 0x0, 0x0, 0xb, 0x45, 0xa0, 0x6, - 0x5a, 0x5a, 0x10, 0x8, 0x4a, 0x0, 0x30, 0x0, - 0x0, 0x20, 0x0, 0x72, 0x50, 0xa5, 0x55, 0x55, - 0xe1, 0x6, 0x51, 0x96, 0x74, 0x51, 0x44, 0x20, - 0xd, 0xa6, 0x57, 0x5, 0x71, 0xa0, 0x0, 0x1, - 0x0, 0x30, 0x7, 0x41, 0x90, 0x0, 0x5, 0x17, - 0x2a, 0xa, 0x1, 0x90, 0x40, 0xb, 0xc, 0x7, - 0x47, 0x1, 0x90, 0x70, 0x17, 0x3, 0x6, 0x60, - 0x0, 0xca, 0xe2, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, 0x0, - - /* U+7DAD "維" */ - 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x1b, 0x0, 0x6, 0x6a, 0x30, 0x0, 0x0, 0x82, - 0x0, 0xb, 0x14, 0x80, 0x0, 0x2, 0x60, 0x70, - 0x1d, 0x57, 0x58, 0x80, 0x1b, 0x56, 0xa0, 0x7b, - 0xa, 0x10, 0x0, 0x6, 0x2a, 0x1, 0x6b, 0xa, - 0x11, 0x0, 0x0, 0x81, 0x74, 0xc, 0x5c, 0x57, - 0x40, 0x9, 0x54, 0xa7, 0xb, 0xa, 0x10, 0x0, - 0xc, 0x72, 0x16, 0xb, 0xa, 0x13, 0x10, 0x1, - 0x20, 0x51, 0xc, 0x5c, 0x55, 0x30, 0x6, 0x19, - 0x1d, 0xb, 0xa, 0x10, 0x0, 0x2a, 0xc, 0x5, - 0xb, 0xa, 0x12, 0x50, 0x33, 0x0, 0x0, 0xd, - 0x55, 0x55, 0x50, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+7DB2 "網" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1b, 0x0, 0x85, 0x55, 0x55, 0xa1, 0x0, 0x72, - 0x0, 0xb2, 0x20, 0x82, 0xc0, 0x2, 0x60, 0x60, - 0xb0, 0xb2, 0x90, 0xc0, 0x1c, 0x67, 0x90, 0xb4, - 0x88, 0x86, 0xc0, 0x6, 0x2a, 0x0, 0xb1, 0x42, - 0x0, 0xc0, 0x0, 0x91, 0x60, 0xb0, 0xd, 0x0, - 0xc0, 0x9, 0x54, 0xa6, 0xb6, 0x86, 0x77, 0xc0, - 0xb, 0x72, 0x25, 0xb0, 0xb0, 0x0, 0xc0, 0x1, - 0x20, 0x70, 0xb0, 0xb0, 0x40, 0xc0, 0x7, 0x45, - 0x76, 0xb1, 0x75, 0x52, 0xc0, 0x3a, 0x29, 0x23, - 0xb0, 0x0, 0x0, 0xc0, 0x42, 0x0, 0x0, 0xb0, - 0x0, 0x5d, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+7DD1 "緑" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1b, 0x0, 0x65, 0x55, 0x5c, 0x0, 0x0, 0x82, - 0x0, 0x0, 0x0, 0xc, 0x0, 0x3, 0x50, 0x70, - 0x26, 0x55, 0x5c, 0x0, 0x1c, 0x67, 0x80, 0x0, - 0x0, 0xc, 0x20, 0x6, 0x29, 0x1, 0x75, 0x69, - 0x58, 0x81, 0x0, 0x90, 0x70, 0x20, 0x2d, 0x2, - 0x60, 0xb, 0x66, 0xa6, 0x86, 0x2c, 0x68, 0x20, - 0x9, 0x50, 0x24, 0x9, 0x3a, 0xa0, 0x0, 0x2, - 0x31, 0x91, 0x5, 0x7a, 0x64, 0x0, 0x8, 0x1a, - 0x57, 0x94, 0x2a, 0xb, 0x20, 0x4a, 0x8, 0x7, - 0x30, 0x29, 0x2, 0xc2, 0x21, 0x0, 0x0, 0x5, - 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+7DD2 "緒" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x1a, 0x0, 0x0, 0x92, 0x1, 0x0, 0x0, 0x82, - 0x0, 0x0, 0x91, 0x2b, 0x20, 0x2, 0x60, 0x60, - 0x65, 0xb6, 0x98, 0x0, 0x1b, 0x46, 0xa0, 0x0, - 0x91, 0xa0, 0x10, 0x7, 0x3a, 0x5, 0x65, 0x9b, - 0x76, 0xa0, 0x0, 0x91, 0x60, 0x0, 0x75, 0x0, - 0x0, 0xa, 0x54, 0xa7, 0xa, 0xa5, 0x59, 0x0, - 0xb, 0x62, 0x26, 0x89, 0x0, 0xa, 0x0, 0x1, - 0x20, 0x64, 0x1b, 0x55, 0x5b, 0x0, 0x7, 0x36, - 0x84, 0x9, 0x0, 0xa, 0x0, 0x2a, 0x1b, 0x25, - 0x19, 0x0, 0xa, 0x0, 0x33, 0x1, 0x0, 0x1b, - 0x55, 0x5b, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, - - /* U+7DDA "線" */ - 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, - 0x29, 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x92, - 0x0, 0x95, 0x85, 0x5c, 0x10, 0x3, 0x50, 0x50, - 0xb0, 0x0, 0xb, 0x0, 0x2a, 0x37, 0x80, 0xb5, - 0x55, 0x5c, 0x0, 0x18, 0x4a, 0x0, 0xb0, 0x0, - 0xb, 0x0, 0x0, 0x92, 0x40, 0xa5, 0x6b, 0x59, - 0x0, 0x9, 0x33, 0xd1, 0x1, 0x1d, 0x1, 0x50, - 0x1d, 0x73, 0x74, 0x6c, 0x8b, 0x59, 0x50, 0x2, - 0x30, 0x80, 0xb, 0x1a, 0x90, 0x0, 0x7, 0x65, - 0x93, 0x83, 0x1a, 0x57, 0x0, 0x86, 0x37, 0x15, - 0x50, 0x1a, 0xa, 0xa1, 0x30, 0x0, 0x42, 0x6, - 0xd8, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x0, - - /* U+7DE0 "締" */ - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - 0x1b, 0x0, 0x0, 0x5b, 0x0, 0x0, 0x0, 0x82, - 0x2, 0x65, 0x59, 0x58, 0x70, 0x2, 0x60, 0x50, - 0x8, 0x0, 0xa2, 0x0, 0x1a, 0x35, 0xa0, 0x5, - 0x60, 0x80, 0x0, 0x8, 0x4a, 0x5, 0x75, 0x56, - 0x55, 0xd1, 0x0, 0x81, 0x5b, 0x10, 0x18, 0x2, - 0x30, 0x8, 0x42, 0xa3, 0x20, 0x19, 0x3, 0x0, - 0xe, 0x94, 0x55, 0xa5, 0x6b, 0x5c, 0x10, 0x0, - 0x10, 0x50, 0xa0, 0x19, 0xa, 0x0, 0x6, 0x63, - 0x85, 0xa0, 0x19, 0xa, 0x0, 0x29, 0x2a, 0x13, - 0x90, 0x19, 0x7b, 0x0, 0x53, 0x1, 0x0, 0x0, - 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+7DE9 "緩" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x1c, 0x0, 0x35, 0x67, 0x9b, 0x40, 0x0, 0x85, - 0x0, 0x30, 0x50, 0x1a, 0x0, 0x2, 0x70, 0x60, - 0x65, 0x46, 0x55, 0x0, 0x1b, 0x46, 0xa1, 0x77, - 0x65, 0x88, 0x60, 0x7, 0x3a, 0x0, 0x1, 0xa0, - 0x0, 0x0, 0x0, 0x81, 0x64, 0x67, 0xa5, 0x55, - 0xb1, 0x8, 0x54, 0xa6, 0x8, 0x40, 0x0, 0x0, - 0xb, 0x72, 0x25, 0xb, 0x85, 0x6d, 0x0, 0x2, - 0x30, 0x60, 0x47, 0x70, 0xa4, 0x0, 0x8, 0x38, - 0x85, 0x90, 0x1c, 0x70, 0x0, 0x59, 0x9, 0x19, - 0x10, 0x7a, 0xb2, 0x0, 0x10, 0x0, 0x21, 0x27, - 0x30, 0x3d, 0xb2, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x20, - - /* U+7DF4 "練" */ - 0x0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x1c, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x72, - 0x3, 0x65, 0x5c, 0x56, 0xb1, 0x2, 0x60, 0x70, - 0x0, 0xa, 0x0, 0x0, 0x1c, 0x56, 0x90, 0x95, - 0x5c, 0x5b, 0x20, 0x6, 0x29, 0x0, 0xa5, 0xa, - 0x7b, 0x0, 0x0, 0x81, 0x60, 0xa4, 0x6a, 0x7a, - 0x0, 0x8, 0x53, 0x97, 0xb5, 0x6d, 0x5c, 0x0, - 0xc, 0x73, 0x26, 0x61, 0xdb, 0x33, 0x0, 0x1, - 0x11, 0x61, 0x8, 0x5a, 0x80, 0x0, 0x6, 0xa, - 0x3a, 0x39, 0xa, 0x49, 0x0, 0x1b, 0xc, 0x5, - 0x80, 0xa, 0x9, 0xc3, 0x25, 0x0, 0x14, 0x0, - 0xa, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+7E3D "總" */ - 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0x73, - 0x0, 0x94, 0x84, 0x48, 0x70, 0x1, 0x70, 0x60, - 0xa0, 0xa5, 0x27, 0x50, 0xb, 0x45, 0xa0, 0xa3, - 0x85, 0xc9, 0x50, 0x7, 0x39, 0x0, 0xa3, 0x39, - 0x76, 0x50, 0x0, 0x81, 0x60, 0xb1, 0x66, 0xc6, - 0x50, 0x9, 0x65, 0x97, 0xb8, 0x66, 0x7a, 0x50, - 0xa, 0x62, 0x15, 0x21, 0x44, 0x2, 0x0, 0x0, - 0x14, 0x30, 0x2c, 0xd, 0x14, 0x60, 0x5, 0x63, - 0xc6, 0x2a, 0x3, 0x3, 0xc2, 0x1a, 0x37, 0x1d, - 0xa, 0x0, 0x6, 0x10, 0x56, 0x0, 0x1, 0xd, - 0xaa, 0xbc, 0x0, - - /* U+7E3E "績" */ - 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, - 0x1c, 0x0, 0x0, 0x2a, 0x4, 0x0, 0x0, 0x73, - 0x3, 0x65, 0x6b, 0x56, 0x30, 0x1, 0x70, 0x60, - 0x46, 0x6b, 0x58, 0x0, 0xb, 0x45, 0x91, 0x11, - 0x39, 0x14, 0x70, 0x7, 0x39, 0x3, 0x63, 0x33, - 0x36, 0x30, 0x0, 0x72, 0x60, 0xc5, 0x55, 0x5d, - 0x20, 0x7, 0x52, 0xa5, 0xc5, 0x55, 0x5c, 0x0, - 0xc, 0x94, 0x36, 0xc4, 0x44, 0x4c, 0x0, 0x0, - 0x20, 0x50, 0xc1, 0x11, 0x1b, 0x0, 0x6, 0x37, - 0x57, 0xa6, 0x55, 0x5a, 0x0, 0x1b, 0xc, 0x3, - 0xb, 0x60, 0x67, 0x10, 0x24, 0x0, 0x1, 0x93, - 0x0, 0x5, 0xd0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x0, 0x30, - - /* U+7E54 "織" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x10, 0x0, 0x0, - 0x83, 0x0, 0x39, 0x0, 0xa0, 0x0, 0x0, 0x90, - 0x6, 0x58, 0x93, 0x97, 0x10, 0x6, 0x13, 0x15, - 0x20, 0xc0, 0x92, 0x90, 0x49, 0x4b, 0x21, 0x93, - 0x40, 0x90, 0x0, 0x35, 0x74, 0x26, 0x57, 0x55, - 0xb5, 0xb1, 0x1, 0x74, 0x22, 0x0, 0x30, 0x93, - 0x20, 0x19, 0x25, 0xb9, 0x65, 0xc0, 0x99, 0x40, - 0x4b, 0x51, 0x79, 0x10, 0xa0, 0x9b, 0x0, 0x0, - 0x24, 0x29, 0x65, 0xa0, 0xa5, 0x0, 0x7, 0x92, - 0xc9, 0x10, 0xa1, 0xc6, 0x22, 0x77, 0x75, 0x2a, - 0x65, 0x97, 0xb, 0xa0, 0x41, 0x0, 0x1, 0x1, - 0x50, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7E70 "繰" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x10, 0xb, 0x55, 0x5c, 0x0, 0x0, 0x45, - 0x0, 0xb, 0x0, 0xb, 0x0, 0x0, 0x80, 0x61, - 0xb, 0x55, 0x5a, 0x0, 0xb, 0x86, 0xb0, 0x75, - 0x70, 0x75, 0x70, 0x4, 0x19, 0x10, 0xa0, 0xa0, - 0xb0, 0x90, 0x0, 0x73, 0x61, 0xc5, 0xb0, 0xc5, - 0xa0, 0x6, 0x84, 0x8a, 0x40, 0x36, 0x50, 0x30, - 0x8, 0x83, 0x7, 0x65, 0x6e, 0x55, 0xb1, 0x0, - 0x10, 0x61, 0x0, 0xbc, 0x50, 0x0, 0x7, 0xa, - 0x2a, 0x9, 0x2c, 0x64, 0x0, 0x1b, 0xc, 0x3, - 0x82, 0xc, 0x9, 0x81, 0x14, 0x0, 0x15, 0x0, - 0xc, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+7E7C "繼" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x56, 0x8, 0x16, 0x0, 0x33, 0x0, 0x0, 0xa0, - 0xa, 0x37, 0x40, 0x93, 0x20, 0x6, 0x31, 0x3a, - 0xb6, 0xa6, 0x8a, 0x20, 0x3a, 0x49, 0x4a, 0x18, - 0x30, 0x64, 0x10, 0x26, 0x57, 0xa, 0xa7, 0x96, - 0xa4, 0xa0, 0x1, 0x81, 0x4a, 0x10, 0x0, 0x13, - 0x50, 0x1a, 0x34, 0xda, 0x59, 0x55, 0x69, 0x30, - 0x2c, 0x51, 0x6a, 0x18, 0x30, 0x73, 0x20, 0x0, - 0x13, 0xa, 0x95, 0xa6, 0x89, 0x40, 0x6, 0x81, - 0xba, 0x18, 0x20, 0x64, 0x30, 0x56, 0x84, 0x7a, - 0x96, 0x95, 0xa4, 0x90, 0x61, 0x10, 0xc, 0x75, - 0x86, 0x67, 0xb0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x0, 0x0, - - /* U+7E8C "續" */ - 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, - 0xb, 0x2, 0x55, 0x6c, 0x55, 0xb1, 0x0, 0x64, - 0x0, 0x21, 0x2a, 0x15, 0x20, 0x1, 0x80, 0x40, - 0x55, 0x44, 0x44, 0x40, 0x9, 0x23, 0xb0, 0xb5, - 0xa5, 0xa5, 0xc0, 0xa, 0x5b, 0x10, 0xa0, 0x90, - 0x90, 0xa0, 0x0, 0x63, 0x50, 0x95, 0x55, 0x56, - 0x50, 0x6, 0x52, 0x95, 0x87, 0x55, 0x5a, 0x50, - 0xd, 0x95, 0x37, 0x77, 0x55, 0x5a, 0x40, 0x0, - 0x10, 0x30, 0x87, 0x55, 0x5a, 0x40, 0x6, 0x64, - 0x93, 0x87, 0x55, 0x5a, 0x40, 0x29, 0x2a, 0x34, - 0x39, 0x60, 0x48, 0x10, 0x43, 0x1, 0x4, 0x84, - 0x0, 0x4, 0xd0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x20, - - /* U+7EDF "统" */ - 0x0, 0x22, 0x0, 0x4, 0x0, 0x0, 0x0, 0x9, - 0x70, 0x0, 0x2c, 0x0, 0x0, 0x1, 0xb0, 0x5, - 0x55, 0xa5, 0x6c, 0x10, 0x81, 0xa, 0x20, 0x77, - 0x0, 0x0, 0x57, 0x39, 0x70, 0x19, 0x2, 0x0, - 0x7, 0x65, 0x80, 0x8, 0x0, 0x3a, 0x20, 0x1, - 0x90, 0xb, 0xaa, 0x6a, 0x7c, 0x1, 0xa2, 0x34, - 0x34, 0xa0, 0xb0, 0x30, 0x6d, 0x72, 0x0, 0x39, - 0xb, 0x0, 0x0, 0x0, 0x0, 0x5, 0x70, 0xb0, - 0x0, 0x14, 0x76, 0x40, 0x93, 0xb, 0x4, 0x8, - 0x81, 0x0, 0x3a, 0x0, 0xb0, 0x61, 0x0, 0x0, - 0x57, 0x0, 0xb, 0xbc, 0x40, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, - - /* U+7F3A "缺" */ - 0x0, 0x20, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0xb4, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0xb0, - 0x1, 0x0, 0xb0, 0x0, 0x0, 0x5, 0x89, 0x59, - 0x46, 0xc5, 0x6b, 0x0, 0x7, 0xa, 0x0, 0x0, - 0xb0, 0x19, 0x0, 0x11, 0xa, 0x1, 0x20, 0xb0, - 0x19, 0x0, 0x36, 0x5c, 0x57, 0x60, 0xb0, 0x19, - 0x30, 0x5, 0x1a, 0x5, 0x65, 0xc7, 0x57, 0x72, - 0xa, 0xa, 0xa, 0x2, 0x86, 0x0, 0x0, 0xa, - 0xa, 0xa, 0x7, 0x33, 0x60, 0x0, 0xa, 0x5c, - 0x5c, 0x9, 0x0, 0xa1, 0x0, 0x8, 0x60, 0x4, - 0x81, 0x0, 0x3d, 0x20, 0x0, 0x0, 0x16, 0x10, - 0x0, 0x5, 0xb1, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+7F6E "置" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0xb6, 0x6b, 0x66, 0xa6, 0x6d, 0x0, 0x0, 0xc0, - 0xc, 0x0, 0xb0, 0xd, 0x0, 0x0, 0xc6, 0x6b, - 0x76, 0xa6, 0x6d, 0x0, 0x0, 0x20, 0x0, 0xa3, - 0x0, 0x7, 0x0, 0x2, 0x76, 0x66, 0xd6, 0x66, - 0x66, 0x10, 0x0, 0xa, 0x66, 0x96, 0x69, 0xa0, - 0x0, 0x0, 0xb, 0x10, 0x0, 0x4, 0x80, 0x0, - 0x0, 0xb, 0x66, 0x66, 0x68, 0x80, 0x0, 0x0, - 0xb, 0x76, 0x66, 0x69, 0x80, 0x0, 0x0, 0xb, - 0x10, 0x0, 0x4, 0x80, 0x0, 0x0, 0xb, 0x76, - 0x66, 0x69, 0x80, 0x0, 0x26, 0x6d, 0x76, 0x66, - 0x69, 0xb7, 0xd2, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7F8E "美" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xa3, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, - 0x57, 0x3, 0x40, 0x44, 0x0, 0x3, 0x65, 0x55, - 0xd5, 0x55, 0x54, 0x0, 0x0, 0x45, 0x55, 0xd5, - 0x56, 0xa1, 0x0, 0x0, 0x10, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x25, 0x55, 0x55, 0xd5, 0x55, 0x5b, - 0x70, 0x1, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0x4, 0x55, 0x55, 0xe5, 0x55, 0x98, 0x0, 0x1, - 0x0, 0x6, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x2, 0x80, 0x0, 0x0, 0x0, 0x1, 0xa3, - 0x0, 0x3c, 0x61, 0x0, 0x2, 0x67, 0x10, 0x0, - 0x1, 0x9f, 0x90, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7FA9 "義" */ - 0x0, 0x0, 0x40, 0x0, 0x32, 0x0, 0x0, 0x0, - 0x0, 0x58, 0x0, 0xa3, 0x12, 0x0, 0x2, 0x65, - 0x57, 0x95, 0x75, 0x88, 0x0, 0x0, 0x25, 0x55, - 0xc5, 0x55, 0xb0, 0x0, 0x0, 0x1, 0x0, 0xb0, - 0x0, 0x5, 0x0, 0x5, 0x55, 0x55, 0x85, 0x55, - 0x59, 0x30, 0x0, 0x0, 0x38, 0xb5, 0x82, 0x81, - 0x0, 0x1, 0x45, 0xc3, 0x13, 0x90, 0x57, 0x0, - 0x16, 0x55, 0xc5, 0x55, 0xc5, 0x59, 0x80, 0x0, - 0x0, 0xa3, 0x30, 0xb0, 0x68, 0x0, 0xb, 0xa7, - 0xc0, 0x0, 0x6b, 0x90, 0x20, 0x0, 0x0, 0xa0, - 0x3, 0xac, 0x50, 0x60, 0x0, 0x29, 0xd2, 0x53, - 0x0, 0x7c, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+7FD2 "習" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x20, 0x26, 0x55, - 0xd2, 0x55, 0x57, 0xc0, 0x6, 0x70, 0xc0, 0x39, - 0x12, 0x90, 0x0, 0xb0, 0xc0, 0x6, 0x32, 0x90, - 0x0, 0x46, 0xd0, 0x3, 0x77, 0x90, 0x5b, 0x40, - 0xc2, 0x99, 0x12, 0x70, 0x21, 0x0, 0xc, 0x30, - 0x0, 0x0, 0x0, 0x85, 0x78, 0x55, 0x5a, 0x20, - 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0xd5, 0x55, 0x55, - 0x5d, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xd5, 0x55, 0x55, 0x5d, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x1, 0x0, - - /* U+8001 "老" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb4, 0x0, 0x14, 0x0, 0x0, 0x0, - 0x0, 0xb2, 0x5, 0x8c, 0x0, 0x0, 0x16, 0x55, - 0xc6, 0x58, 0xd1, 0x0, 0x0, 0x0, 0x0, 0xb2, - 0xc, 0x30, 0x0, 0x5, 0x55, 0x55, 0xb6, 0xaa, - 0x55, 0xc2, 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xb4, 0x1, 0x40, 0x0, - 0x0, 0x0, 0x7e, 0x10, 0x3d, 0x90, 0x0, 0x0, - 0x49, 0x5c, 0x28, 0x71, 0x1, 0x0, 0x5, 0x30, - 0x1d, 0x40, 0x0, 0x5, 0x0, 0x0, 0x0, 0x1c, - 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0xc, 0xcb, - 0xbb, 0xbe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8003 "考" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x71, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x55, 0xc1, 0x0, 0x0, 0x16, 0x55, - 0xd5, 0x8c, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc2, - 0xb0, 0x0, 0x60, 0x16, 0x55, 0x55, 0x8c, 0x55, - 0x55, 0x51, 0x0, 0x0, 0x4, 0xa0, 0x0, 0x15, - 0x0, 0x0, 0x0, 0x76, 0x99, 0x55, 0x56, 0x0, - 0x0, 0x48, 0x10, 0xa2, 0x0, 0x20, 0x0, 0x4, - 0x10, 0x0, 0x95, 0x55, 0xa6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x16, - 0xab, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, - 0x0, 0x0, - - /* U+8005 "者" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x31, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x71, 0xd4, 0x0, 0x0, 0x36, 0x55, - 0xd5, 0x5d, 0x40, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0xa5, 0x0, 0x50, 0x7, 0x55, 0x55, 0x7c, 0x75, - 0x56, 0x72, 0x0, 0x0, 0x1, 0xa3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbb, 0x65, 0x56, 0xd0, 0x0, - 0x0, 0x18, 0xe0, 0x0, 0x1, 0xa0, 0x0, 0x4, - 0x50, 0xc5, 0x55, 0x56, 0xa0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x1, 0xa0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x1, 0xa0, 0x0, 0x0, 0x0, 0xc5, 0x55, - 0x56, 0xb0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x10, 0x0, - - /* U+800C "而" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, - 0x55, 0x55, 0x55, 0x55, 0x58, 0xb0, 0x1, 0x0, - 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x75, 0x57, 0x75, - 0x55, 0x5a, 0x10, 0x0, 0xc0, 0xb, 0x0, 0xb0, - 0xd, 0x0, 0x0, 0xc0, 0xb, 0x0, 0xb0, 0xc, - 0x0, 0x0, 0xc0, 0xb, 0x0, 0xb0, 0xc, 0x0, - 0x0, 0xc0, 0xb, 0x0, 0xb0, 0xc, 0x0, 0x0, - 0xc0, 0xb, 0x0, 0xb0, 0xc, 0x0, 0x0, 0xc0, - 0xb, 0x0, 0xb0, 0xc, 0x0, 0x0, 0xc0, 0xb, - 0x0, 0xb1, 0x1c, 0x0, 0x0, 0x90, 0x3, 0x0, - 0x24, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8033 "耳" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0x57, 0x55, 0x55, 0x57, 0x58, 0x80, 0x0, 0xa, - 0x20, 0x0, 0xc, 0x0, 0x0, 0x0, 0xa, 0x20, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xa, 0x65, 0x55, - 0x5c, 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0xc, - 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0xc, 0x0, - 0x0, 0x0, 0xa, 0x65, 0x55, 0x5c, 0x0, 0x0, - 0x0, 0xa, 0x20, 0x0, 0xc, 0x0, 0x20, 0x0, - 0xa, 0x32, 0x34, 0x5d, 0x56, 0x91, 0x26, 0x55, - 0x42, 0x10, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+805E "聞" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa5, 0x55, - 0xd0, 0x95, 0x55, 0xc3, 0xb0, 0x0, 0xb0, 0xa0, - 0x0, 0xa0, 0xb5, 0x55, 0xb0, 0xa5, 0x55, 0xc0, - 0xb5, 0x55, 0xa0, 0xa5, 0x55, 0xc0, 0xb0, 0x0, - 0x0, 0x0, 0x40, 0xa0, 0xb0, 0x6a, 0x65, 0x69, - 0x72, 0xa0, 0xb0, 0xa, 0x65, 0x78, 0x0, 0xa0, - 0xb0, 0xa, 0x10, 0x28, 0x0, 0xa0, 0xb0, 0xa, - 0x65, 0x78, 0x0, 0xa0, 0xb0, 0xa, 0x32, 0x5a, - 0x79, 0xa0, 0xb3, 0x54, 0x32, 0x38, 0x0, 0xb0, - 0xb0, 0x0, 0x0, 0x25, 0x3a, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x10, - - /* U+806F "聯" */ - 0x0, 0x0, 0x0, 0x2, 0x20, 0x3, 0x0, 0x5, - 0x55, 0x5c, 0x59, 0x30, 0x59, 0x0, 0x1, 0xb0, - 0x91, 0x54, 0x63, 0x80, 0x82, 0x0, 0xb0, 0x93, - 0xd7, 0x86, 0x87, 0x80, 0x0, 0xc5, 0xb1, 0x18, - 0x31, 0x36, 0x30, 0x0, 0xb0, 0x92, 0x93, 0x83, - 0x84, 0x94, 0x0, 0xb0, 0x93, 0xb5, 0x53, 0x83, - 0x23, 0x0, 0xc5, 0xb1, 0x1, 0x44, 0xa1, 0x10, - 0x0, 0xb0, 0x91, 0x1a, 0x44, 0xa0, 0xa0, 0x1, - 0xc6, 0xc5, 0x29, 0x64, 0xa0, 0xa0, 0xd, 0x71, - 0x91, 0x2a, 0x83, 0xa5, 0xb0, 0x0, 0x0, 0xa1, - 0x0, 0xa0, 0xa0, 0x0, 0x0, 0x0, 0xa2, 0x38, - 0x20, 0xb0, 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, - 0x20, 0x0, - - /* U+8072 "聲" */ - 0x0, 0x0, 0x50, 0x0, 0x10, 0x10, 0x0, 0x4, - 0x55, 0xc5, 0xa2, 0xb5, 0xc1, 0x0, 0x1, 0x0, - 0xa0, 0x31, 0x80, 0xa4, 0x50, 0x2, 0x85, 0x55, - 0x57, 0x10, 0x28, 0x60, 0x0, 0xb5, 0xa6, 0xb2, - 0x95, 0xa8, 0x0, 0x1, 0xb5, 0xc6, 0x90, 0x1b, - 0x70, 0x0, 0x3, 0x60, 0x0, 0x2, 0x85, 0x98, - 0x50, 0x6, 0x35, 0x55, 0x68, 0x55, 0x89, 0x40, - 0x2, 0x1, 0xb1, 0x11, 0x17, 0x30, 0x0, 0x0, - 0x0, 0xb4, 0x44, 0x49, 0x30, 0x0, 0x0, 0x0, - 0xb5, 0x55, 0x5a, 0x30, 0x20, 0x2, 0x44, 0xc5, - 0x55, 0x5a, 0x76, 0x80, 0x1, 0x10, 0x0, 0x0, - 0x7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+8077 "職" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x10, 0x0, 0x5, - 0x55, 0x5a, 0x3b, 0x10, 0xc0, 0x0, 0x0, 0xa0, - 0xa2, 0x68, 0x67, 0xb5, 0x30, 0x0, 0xa0, 0xa0, - 0x50, 0x55, 0xa0, 0xc0, 0x0, 0xc5, 0xc0, 0x73, - 0x70, 0xa0, 0x0, 0x0, 0xa0, 0xa4, 0x75, 0x85, - 0xc5, 0xb1, 0x0, 0xa0, 0xa0, 0x31, 0x40, 0xa1, - 0x90, 0x0, 0xc5, 0xc0, 0xb4, 0xa3, 0x94, 0x70, - 0x0, 0xa0, 0xa0, 0xa0, 0x81, 0x7b, 0x10, 0x0, - 0xb3, 0xc4, 0xb5, 0xb1, 0x4b, 0x0, 0xc, 0xa4, - 0xa0, 0xa0, 0x81, 0x8a, 0x3, 0x0, 0x0, 0xa0, - 0xa5, 0x84, 0x67, 0xa2, 0x0, 0x0, 0xb0, 0x0, - 0x26, 0x0, 0xc2, 0x0, 0x0, 0x10, 0x0, 0x10, - 0x0, 0x0, - - /* U+807D "聽" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x5, - 0x55, 0x57, 0x80, 0xa, 0x10, 0x30, 0x0, 0xa0, - 0xa, 0x46, 0x5a, 0x55, 0x71, 0x0, 0xc5, 0x5a, - 0x15, 0x36, 0x33, 0x60, 0x0, 0xc5, 0x5a, 0x1a, - 0x56, 0xb2, 0xb0, 0x0, 0xa0, 0xa, 0x1a, 0x44, - 0xa0, 0xa0, 0x6, 0x75, 0x5a, 0x1b, 0x77, 0xb4, - 0xa0, 0x5, 0x67, 0x5a, 0x15, 0x11, 0x11, 0x50, - 0x0, 0x83, 0xa, 0x36, 0x55, 0x55, 0x92, 0x5, - 0xa9, 0x3a, 0x1, 0x47, 0x11, 0x0, 0x0, 0x82, - 0xa, 0x34, 0xa2, 0x82, 0xa1, 0x6, 0xa6, 0x2a, - 0xd1, 0xa0, 0x4, 0x63, 0x4, 0x0, 0xb, 0x10, - 0xc9, 0x9c, 0x40, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x0, 0x0, - - /* U+8089 "肉" */ - 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x60, 0x0, 0x0, 0x95, 0x55, 0xa8, 0x55, 0x5a, - 0x2d, 0x0, 0xc, 0x10, 0x0, 0xc1, 0xd0, 0x2, - 0xb8, 0x50, 0xc, 0x1d, 0x1, 0x92, 0x9, 0xc0, - 0xc1, 0xd2, 0x60, 0x97, 0x9, 0xc, 0x1d, 0x10, - 0xe, 0x20, 0x0, 0xc1, 0xd0, 0x7, 0x57, 0x81, - 0xc, 0x1d, 0x4, 0x60, 0x6, 0xd0, 0xc1, 0xd3, - 0x30, 0x0, 0x7, 0xc, 0x1d, 0x0, 0x0, 0x0, - 0x56, 0xe0, 0xc0, 0x0, 0x0, 0x0, 0xa9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+80A9 "肩" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, 0x49, 0x55, - 0x57, 0x55, 0x5c, 0x30, 0x3, 0x90, 0x0, 0x0, - 0x0, 0xb1, 0x0, 0x3b, 0x55, 0x55, 0x55, 0x5c, - 0x10, 0x3, 0x90, 0x10, 0x0, 0x0, 0x20, 0x0, - 0x48, 0xd, 0x55, 0x55, 0x6c, 0x0, 0x4, 0x70, - 0xc0, 0x0, 0x2, 0xa0, 0x0, 0x75, 0xd, 0x55, - 0x55, 0x6a, 0x0, 0xa, 0x10, 0xd5, 0x55, 0x56, - 0xa0, 0x0, 0x90, 0xc, 0x0, 0x0, 0x2a, 0x0, - 0x62, 0x0, 0xc0, 0x0, 0x2, 0x90, 0x23, 0x0, - 0xc, 0x0, 0x6, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, - - /* U+80AF "肯" */ - 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x70, 0xe, 0x0, 0x1, 0x0, 0x0, 0x6, - 0x70, 0xd, 0x55, 0x6a, 0x0, 0x0, 0x6, 0x70, - 0xd, 0x0, 0x0, 0x20, 0x17, 0x57, 0x75, 0x5a, - 0x55, 0x57, 0xa0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x40, 0x0, 0x0, 0xd, 0x55, 0x55, 0x55, 0xe1, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x55, 0x55, 0x55, 0xd0, 0x0, 0x0, - 0xd, 0x55, 0x55, 0x55, 0xd0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0xe, 0x0, 0x1, - 0x6d, 0xa0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+80B2 "育" */ - 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x10, 0x0, 0x20, 0x6, 0x55, 0x58, - 0x85, 0x55, 0x6a, 0x10, 0x0, 0x6, 0x92, 0x4, - 0x10, 0x0, 0x0, 0x39, 0x53, 0x33, 0x4c, 0xa0, - 0x0, 0x2, 0xa7, 0x53, 0x20, 0xa, 0x10, 0x0, - 0x9, 0x55, 0x55, 0x5b, 0x30, 0x0, 0x0, 0xa1, - 0x0, 0x0, 0xa2, 0x0, 0x0, 0xa, 0x65, 0x55, - 0x5c, 0x20, 0x0, 0x0, 0xa1, 0x0, 0x0, 0xa2, - 0x0, 0x0, 0xa, 0x65, 0x55, 0x5c, 0x20, 0x0, - 0x0, 0xa1, 0x0, 0x0, 0xa1, 0x0, 0x0, 0xb, - 0x10, 0x3, 0x9e, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x10, 0x0, - - /* U+80CC "背" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xd0, 0x2c, 0x0, 0x60, 0x6, 0x55, 0x6c, - 0x2, 0xb5, 0x98, 0x10, 0x0, 0x4, 0xc0, 0x2c, - 0x0, 0x4, 0x3b, 0x96, 0x4c, 0x1, 0xe6, 0x68, - 0xb0, 0x20, 0x2, 0x80, 0x4, 0x66, 0x52, 0x0, - 0xb, 0x55, 0x55, 0x55, 0xe1, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0xd, 0x55, 0x55, - 0x55, 0xc0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xd, 0x55, 0x55, 0x55, 0xc0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0xc, 0x0, 0x0, 0xd, - 0x0, 0x1, 0x6c, 0xa0, 0x0, 0x0, 0x50, 0x0, - 0x0, 0x41, 0x0, - - /* U+80F8 "胸" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x65, - 0x5a, 0x14, 0x90, 0x0, 0x0, 0x9, 0x20, 0xb0, - 0x92, 0x0, 0x3, 0x10, 0x92, 0xb, 0xa, 0x57, - 0x65, 0xa3, 0x9, 0x65, 0xc4, 0x12, 0x79, 0x8, - 0x20, 0x92, 0xb, 0x2, 0x6a, 0x11, 0x82, 0x9, - 0x20, 0xb0, 0xb3, 0x90, 0xb8, 0x20, 0x96, 0x5c, - 0xa, 0x4b, 0xa, 0x81, 0xa, 0x10, 0xb0, 0xa7, - 0x82, 0xa9, 0x10, 0xb0, 0xb, 0xc, 0x23, 0x2a, - 0x91, 0xa, 0x0, 0xb0, 0xa5, 0x55, 0xaa, 0x1, - 0x62, 0x3c, 0x0, 0x0, 0x33, 0xc0, 0x40, 0x9, - 0x70, 0x0, 0x1, 0x89, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+80FD "能" */ - 0x0, 0x6, 0x0, 0x2, 0x0, 0x0, 0x0, 0x7, - 0x80, 0x0, 0xb2, 0x3, 0x0, 0x4, 0x60, 0x26, - 0xb, 0x7, 0xb1, 0x5, 0xa5, 0x55, 0xa5, 0xb6, - 0x20, 0x20, 0x35, 0x20, 0x2, 0x2b, 0x0, 0x6, - 0x0, 0xa5, 0x55, 0xb0, 0x8a, 0x99, 0xd1, 0xc, - 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, 0xd5, 0x55, - 0xa0, 0xb1, 0x5, 0x0, 0xc, 0x0, 0x1a, 0xb, - 0x7, 0xb2, 0x0, 0xd5, 0x55, 0xa0, 0xc8, 0x40, - 0x0, 0xc, 0x0, 0x1a, 0xb, 0x0, 0x4, 0x0, - 0xc0, 0x1, 0xa0, 0xb0, 0x0, 0x80, 0xc, 0x5, - 0xc8, 0xa, 0xba, 0xad, 0x30, 0x20, 0x3, 0x0, - 0x0, 0x0, 0x0, - - /* U+8131 "脱" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0xa5, 0xa3, 0x8, 0x0, 0xe1, 0x0, 0x0, 0xb0, - 0x92, 0x9, 0x44, 0x70, 0x0, 0x0, 0xb0, 0x92, - 0x23, 0x17, 0x4, 0x0, 0x0, 0xc5, 0xb2, 0xb5, - 0x55, 0x5c, 0x0, 0x0, 0xb0, 0x92, 0xa0, 0x0, - 0x1b, 0x0, 0x0, 0xb0, 0x92, 0xa0, 0x0, 0x1b, - 0x0, 0x0, 0xc5, 0xb2, 0xb8, 0x9b, 0x6b, 0x0, - 0x0, 0xa0, 0x92, 0x24, 0x6a, 0x0, 0x0, 0x1, - 0x90, 0x92, 0x5, 0x5a, 0x0, 0x0, 0x4, 0x50, - 0x92, 0x8, 0x2a, 0x0, 0x40, 0x7, 0x11, 0xa1, - 0x1a, 0xa, 0x10, 0x70, 0x6, 0x5, 0xd2, 0x70, - 0x7, 0xb9, 0xc2, 0x10, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, - - /* U+814A "腊" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x20, 0x0, 0x0, - 0x95, 0xa3, 0x7, 0x80, 0xc1, 0x0, 0x0, 0xb0, - 0xa1, 0x7, 0x50, 0xb2, 0x30, 0x0, 0xb0, 0xa1, - 0x6a, 0x85, 0xc5, 0x40, 0x0, 0xc5, 0xc1, 0x7, - 0x50, 0xb0, 0x0, 0x0, 0xb0, 0xa3, 0x5a, 0x85, - 0xc5, 0xc2, 0x0, 0xb0, 0xa1, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xc5, 0xc1, 0x65, 0x55, 0x59, 0x20, - 0x0, 0xb0, 0xa1, 0x92, 0x0, 0xa, 0x10, 0x1, - 0x90, 0xa1, 0x96, 0x55, 0x5c, 0x10, 0x3, 0x60, - 0xa1, 0x92, 0x0, 0xa, 0x10, 0x7, 0x11, 0xb0, - 0x96, 0x55, 0x5c, 0x10, 0x5, 0x6, 0xd0, 0x91, - 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8155 "腕" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, - 0x42, 0x61, 0x0, 0x38, 0x0, 0x0, 0x1, 0xb3, - 0xc0, 0x75, 0x5c, 0x55, 0x80, 0x1, 0xa0, 0xb2, - 0x95, 0x0, 0x3, 0x50, 0x1, 0xb5, 0xc2, 0x3a, - 0x0, 0x2, 0x0, 0x1, 0xa0, 0xb0, 0x68, 0x8b, - 0x5b, 0x20, 0x1, 0xa0, 0xb0, 0x90, 0xba, 0xa, - 0x0, 0x1, 0xb5, 0xc2, 0xa1, 0xaa, 0xa, 0x0, - 0x2, 0x90, 0xb4, 0x49, 0x6a, 0xa, 0x0, 0x3, - 0x70, 0xb0, 0xa, 0x1a, 0x3d, 0x0, 0x5, 0x40, - 0xb0, 0x18, 0xa, 0x3, 0x40, 0x8, 0x0, 0xb0, - 0x80, 0xa, 0x0, 0x70, 0x6, 0x18, 0xc5, 0x10, - 0x7, 0xa9, 0xc2, 0x10, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+8166 "腦" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0xa5, 0xa3, 0x3d, 0xa, 0x50, 0xd1, 0x0, 0xb0, - 0xa1, 0x82, 0x19, 0x6, 0x60, 0x0, 0xb0, 0xa2, - 0x60, 0x70, 0x27, 0x0, 0x0, 0xc5, 0xc1, 0x91, - 0x47, 0x19, 0x30, 0x0, 0xb0, 0xa1, 0x3b, 0x48, - 0x61, 0xe0, 0x0, 0xb0, 0xa1, 0x4, 0xa1, 0x10, - 0x30, 0x0, 0xc5, 0xc1, 0xb5, 0x65, 0x55, 0xd0, - 0x0, 0xb0, 0xa1, 0xb2, 0x0, 0xd2, 0xb0, 0x0, - 0x90, 0xa1, 0xb0, 0x7b, 0x50, 0xb0, 0x3, 0x60, - 0xa1, 0xb0, 0x5b, 0x70, 0xb0, 0x6, 0x10, 0xa0, - 0xb3, 0x50, 0xb1, 0xb0, 0x6, 0x29, 0xd0, 0xb6, - 0x55, 0x55, 0xb0, 0x11, 0x0, 0x20, 0x50, 0x0, - 0x0, 0x50, - - /* U+8170 "腰" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x65, 0xc4, 0x55, 0x55, 0x58, 0x70, 0x9, 0x20, - 0xb1, 0xa, 0xa, 0x0, 0x0, 0x9, 0x20, 0xb5, - 0x6c, 0x5c, 0x5a, 0x10, 0x9, 0x65, 0xb7, 0x3a, - 0xa, 0xb, 0x0, 0x9, 0x20, 0xb7, 0x3a, 0xa, - 0xb, 0x0, 0x9, 0x20, 0xb7, 0x79, 0x57, 0x5c, - 0x0, 0x9, 0x65, 0xb1, 0x9, 0x50, 0x0, 0x0, - 0x9, 0x10, 0xb6, 0x5d, 0x55, 0x77, 0x90, 0xa, - 0x0, 0xb0, 0x64, 0x5, 0x60, 0x0, 0x9, 0x0, - 0xb0, 0xb4, 0x1b, 0x0, 0x0, 0x17, 0x11, 0xb0, - 0x2, 0xda, 0x61, 0x0, 0x50, 0x2c, 0x71, 0x58, - 0x20, 0x5d, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, - 0x1, 0x0, - - /* U+819D "膝" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x4, - 0x37, 0x30, 0x0, 0xb1, 0x4, 0x0, 0xa, 0x2a, - 0x25, 0x59, 0xf5, 0x57, 0x20, 0xa, 0xa, 0x10, - 0x2a, 0xb6, 0x82, 0x0, 0xa, 0x5c, 0x12, 0x80, - 0x70, 0x2e, 0x20, 0xa, 0xa, 0x33, 0x6, 0xc2, - 0x3, 0x10, 0xa, 0xa, 0x10, 0x3a, 0x6, 0x60, - 0x0, 0xa, 0x5c, 0x14, 0x70, 0xb1, 0x6d, 0x80, - 0xa, 0xa, 0x33, 0x55, 0xb2, 0xb2, 0x20, 0xa, - 0xa, 0x10, 0x8, 0xd4, 0x0, 0x0, 0x9, 0xa, - 0x10, 0x66, 0xb5, 0x93, 0x0, 0x25, 0x1b, 0x1c, - 0x50, 0xb0, 0x1d, 0x20, 0x50, 0x5b, 0x0, 0x18, - 0xe0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+81C9 "臉" */ - 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x1, - 0x85, 0xa1, 0x0, 0x8a, 0x0, 0x0, 0x1, 0x90, - 0xa0, 0x2, 0x91, 0x50, 0x0, 0x1, 0x90, 0xa0, - 0x9, 0x0, 0x57, 0x0, 0x1, 0xb5, 0xb0, 0x65, - 0x55, 0x96, 0xc3, 0x1, 0x90, 0xa2, 0x20, 0x21, - 0x10, 0x40, 0x1, 0x90, 0xa0, 0xb5, 0xb3, 0xa5, - 0xb0, 0x1, 0xb5, 0xb0, 0x90, 0x92, 0x70, 0x90, - 0x1, 0x80, 0xa0, 0xb5, 0xa3, 0x95, 0x90, 0x3, - 0x60, 0xa0, 0x1b, 0x0, 0x38, 0x0, 0x5, 0x30, - 0xa0, 0x49, 0x0, 0x74, 0x0, 0x7, 0x12, 0xa0, - 0x82, 0xb0, 0x96, 0x80, 0x4, 0x9, 0x63, 0x30, - 0x36, 0x10, 0x74, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+81EA "自" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, - 0x0, 0x10, 0x44, 0x0, 0x3, 0xd, 0x56, 0x55, - 0x55, 0xd4, 0xd0, 0x0, 0x0, 0xc, 0xd, 0x0, - 0x0, 0x0, 0xc0, 0xd5, 0x55, 0x55, 0x5d, 0xd, - 0x0, 0x0, 0x0, 0xc0, 0xd0, 0x0, 0x0, 0xc, - 0xd, 0x55, 0x55, 0x55, 0xd0, 0xd0, 0x0, 0x0, - 0xc, 0xd, 0x0, 0x0, 0x0, 0xc0, 0xe5, 0x55, - 0x55, 0x5d, 0x14, 0x0, 0x0, 0x0, 0x40, - - /* U+81F3 "至" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x55, 0x55, 0x55, 0x55, 0x6d, 0x20, 0x1, 0x0, - 0xa, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, - 0x1, 0x50, 0x0, 0x0, 0x0, 0x4, 0x80, 0x0, - 0x2c, 0x50, 0x0, 0x0, 0x89, 0x45, 0x66, 0x67, - 0xe5, 0x0, 0x0, 0x98, 0x53, 0xb2, 0x0, 0x34, - 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0x55, 0x55, 0xc7, 0x55, 0xd5, 0x0, 0x0, - 0x10, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x7, 0x50, 0x26, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x40, - - /* U+81FA "臺" */ - 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x10, 0x6, - 0x55, 0x55, 0x6c, 0x55, 0x58, 0xa0, 0x0, 0x24, - 0x44, 0x6b, 0x44, 0x94, 0x0, 0x0, 0x8, 0x55, - 0x55, 0x55, 0xa1, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x1, 0xb, 0x55, 0x55, 0x55, - 0x90, 0x0, 0x8, 0x55, 0x55, 0x55, 0x55, 0x56, - 0xd1, 0x4b, 0x35, 0x55, 0x65, 0x56, 0xb5, 0x20, - 0x0, 0x0, 0x48, 0x30, 0x6, 0x30, 0x0, 0x0, - 0x1d, 0xc8, 0x88, 0x55, 0xc5, 0x0, 0x0, 0x3, - 0x0, 0x38, 0x0, 0x82, 0x0, 0x0, 0x36, 0x55, - 0x7b, 0x55, 0x52, 0x0, 0x4, 0x55, 0x55, 0x7b, - 0x55, 0x5c, 0x70, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8207 "與" */ - 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x24, 0xa7, 0x70, 0x1, 0x16, 0x0, 0x0, 0xd2, - 0x6, 0x85, 0xa6, 0x4d, 0x20, 0x0, 0xc0, 0x26, - 0x50, 0x0, 0xc, 0x0, 0x0, 0xc5, 0x59, 0x85, - 0xb3, 0x6c, 0x0, 0x0, 0xb0, 0x3, 0x0, 0xb0, - 0xb, 0x0, 0x0, 0xc5, 0x99, 0x40, 0xb2, 0x5c, - 0x0, 0x0, 0xc0, 0x9, 0x20, 0xb0, 0x1b, 0x0, - 0x0, 0xc0, 0x9, 0x20, 0xb0, 0xb, 0x50, 0x8, - 0x65, 0x66, 0x55, 0x65, 0x56, 0x61, 0x0, 0x1, - 0xd5, 0x0, 0x17, 0x50, 0x0, 0x0, 0x1b, 0x40, - 0x0, 0x0, 0x5d, 0x40, 0x4, 0x81, 0x0, 0x0, - 0x0, 0x4, 0xb0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8208 "興" */ - 0x0, 0x38, 0x68, 0x55, 0x85, 0x15, 0x0, 0x0, - 0xc1, 0x19, 0x2, 0x65, 0x5c, 0x10, 0x0, 0xb2, - 0x1a, 0x66, 0x84, 0xb, 0x0, 0x0, 0xb5, 0x39, - 0x67, 0x75, 0x5c, 0x0, 0x0, 0xa0, 0x19, 0x89, - 0x64, 0xb, 0x0, 0x0, 0xb8, 0x49, 0x89, 0x65, - 0x4b, 0x0, 0x0, 0xb1, 0x19, 0x89, 0x64, 0x2b, - 0x0, 0x0, 0xb0, 0x19, 0x0, 0x64, 0x1b, 0x50, - 0x6, 0x65, 0x57, 0x55, 0x65, 0x56, 0x61, 0x0, - 0x0, 0x9a, 0x0, 0x18, 0x60, 0x0, 0x0, 0x9, - 0x70, 0x0, 0x0, 0x7e, 0x50, 0x3, 0x71, 0x0, - 0x0, 0x0, 0x5, 0x90, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+8209 "舉" */ - 0x0, 0x0, 0x31, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xa7, 0x85, 0xd5, 0x95, 0x6c, 0x20, 0x0, 0xb0, - 0x31, 0xa0, 0x0, 0xb, 0x0, 0x0, 0xb5, 0x65, - 0xb5, 0xa5, 0x6b, 0x0, 0x0, 0xa0, 0x61, 0x50, - 0xc0, 0xa, 0x0, 0x0, 0xa6, 0x53, 0xb0, 0xc4, - 0x6b, 0x0, 0x5, 0xb6, 0x56, 0xb5, 0xd5, 0x5d, - 0xb1, 0x1, 0x0, 0xc4, 0x25, 0x5, 0x0, 0x0, - 0x0, 0xa, 0x50, 0x37, 0x24, 0x80, 0x0, 0x1, - 0x93, 0x46, 0x79, 0x54, 0x2b, 0x50, 0x15, 0x25, - 0x55, 0x79, 0x55, 0xb6, 0x70, 0x0, 0x1, 0x0, - 0x37, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+822A "航" */ - 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0x30, 0x0, 0x45, 0x0, 0x0, 0x0, 0x99, - 0x5a, 0x0, 0xb, 0x1, 0x0, 0x0, 0xb0, 0xb, - 0x45, 0x55, 0x59, 0x50, 0x0, 0xb6, 0x2b, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb2, 0x6b, 0x9, 0x55, - 0xb2, 0x0, 0x15, 0xc5, 0x5c, 0xa, 0x10, 0xb0, - 0x0, 0x1, 0xa1, 0xb, 0xa, 0x10, 0xb0, 0x0, - 0x0, 0xa6, 0x4b, 0xa, 0x0, 0xb0, 0x0, 0x1, - 0x81, 0x7b, 0xa, 0x0, 0xb0, 0x0, 0x4, 0x40, - 0xb, 0x9, 0x0, 0xb0, 0x40, 0x7, 0x1, 0xb, - 0x43, 0x0, 0xb0, 0x80, 0x14, 0x2, 0xc9, 0x60, - 0x0, 0x8b, 0xe2, 0x10, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+822C "般" */ - 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0x30, 0x7, 0x55, 0x82, 0x0, 0x0, 0xa7, - 0x5b, 0x2a, 0x10, 0xb0, 0x0, 0x0, 0xb3, 0xb, - 0xb, 0x0, 0xb0, 0x0, 0x0, 0xb4, 0x7b, 0xa, - 0x0, 0x8b, 0xc2, 0x0, 0xb0, 0x3b, 0x35, 0x0, - 0x0, 0x0, 0x5, 0xc5, 0x5c, 0x37, 0x55, 0x7c, - 0x0, 0x0, 0xb2, 0xb, 0x4, 0x10, 0x75, 0x0, - 0x0, 0xb6, 0x4b, 0x0, 0x60, 0xc0, 0x0, 0x1, - 0x91, 0x7b, 0x0, 0x79, 0x60, 0x0, 0x4, 0x50, - 0xb, 0x0, 0x4f, 0x30, 0x0, 0x8, 0x2, 0x3c, - 0x4, 0x91, 0xc8, 0x10, 0x24, 0x0, 0x78, 0x64, - 0x0, 0x9, 0xc1, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+8239 "船" */ - 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x40, 0x0, 0xa5, 0x5b, 0x0, 0x0, 0x98, - 0x5b, 0x20, 0xa0, 0xb, 0x0, 0x0, 0xb1, 0xb, - 0x0, 0xa0, 0xb, 0x0, 0x0, 0xb5, 0x5b, 0x2, - 0x80, 0xb, 0x0, 0x0, 0xb0, 0x4b, 0x7, 0x20, - 0xb, 0xb6, 0x16, 0xc5, 0x5c, 0x34, 0x0, 0x0, - 0x0, 0x0, 0xa1, 0xb, 0x11, 0x75, 0x56, 0x60, - 0x0, 0x96, 0x4b, 0x2, 0x90, 0x5, 0x60, 0x2, - 0x70, 0x6b, 0x1, 0x90, 0x5, 0x50, 0x5, 0x30, - 0xb, 0x1, 0x90, 0x5, 0x50, 0x8, 0x1, 0x4b, - 0x2, 0xb5, 0x59, 0x60, 0x13, 0x0, 0x67, 0x2, - 0x80, 0x4, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+826F "良" */ - 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x20, 0x0, 0x0, 0x8, 0x55, 0xb6, 0x59, 0x30, - 0x0, 0xc0, 0x0, 0x0, 0xa2, 0x0, 0xc, 0x0, - 0x0, 0xa, 0x20, 0x0, 0xd5, 0x55, 0x55, 0xc2, - 0x0, 0xc, 0x0, 0x0, 0xa, 0x20, 0x0, 0xd5, - 0x65, 0x55, 0xb2, 0x0, 0xc, 0x2, 0x30, 0x5, - 0xd1, 0x0, 0xc0, 0x8, 0x37, 0x50, 0x0, 0xc, - 0x0, 0x3b, 0x10, 0x0, 0x0, 0xc5, 0x71, 0x2b, - 0x94, 0x10, 0xd, 0x50, 0x0, 0x5, 0xce, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8272 "色" */ - 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd5, 0x0, 0x50, 0x0, 0x0, 0x0, 0x7, - 0x95, 0x58, 0xe3, 0x0, 0x0, 0x0, 0x2a, 0x0, - 0x9, 0x10, 0x0, 0x0, 0x1, 0xd6, 0x55, 0x86, - 0x55, 0xa1, 0x0, 0x16, 0x82, 0x0, 0xb0, 0x0, - 0xb0, 0x0, 0x0, 0x82, 0x0, 0xb0, 0x0, 0xb0, - 0x0, 0x0, 0x87, 0x55, 0xc5, 0x55, 0xc0, 0x0, - 0x0, 0x82, 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, - 0x82, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x82, - 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x83, 0x0, - 0x0, 0x0, 0x1, 0xa0, 0x0, 0x5d, 0xaa, 0xaa, - 0xaa, 0xac, 0xa0, - - /* U+8282 "节" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0xc, 0x1, 0xa0, 0x6, 0x55, 0x5d, - 0x55, 0x5d, 0x55, 0x52, 0x0, 0x0, 0xb, 0x0, - 0xa, 0x0, 0x0, 0x0, 0x45, 0x55, 0x55, 0x55, - 0x5a, 0x0, 0x0, 0x10, 0x0, 0xb0, 0x0, 0x2b, - 0x0, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x2b, 0x0, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0x2b, 0x0, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x2a, 0x0, 0x0, 0x0, - 0x0, 0xb0, 0x58, 0xe8, 0x0, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+82B1 "花" */ - 0x0, 0x0, 0x20, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x84, 0x1, 0xc0, 0x0, 0x0, 0x25, 0x55, - 0xa7, 0x56, 0xd5, 0x5c, 0x80, 0x1, 0x0, 0x73, - 0x1, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x71, 0x0, - 0x50, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x7, 0x20, - 0x2, 0x0, 0x0, 0xb, 0x20, 0xb, 0x10, 0x8c, - 0x0, 0x0, 0x5f, 0x10, 0xb, 0x2a, 0x80, 0x0, - 0x1, 0x9c, 0x0, 0xb, 0xb3, 0x0, 0x0, 0x27, - 0xc, 0x2, 0x7d, 0x10, 0x0, 0x0, 0x10, 0xc, - 0x12, 0xa, 0x10, 0x0, 0x50, 0x0, 0xc, 0x0, - 0xa, 0x10, 0x0, 0x80, 0x0, 0xc, 0x0, 0x7, - 0xca, 0xab, 0xc0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+82E5 "若" */ - 0x0, 0x0, 0x21, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x68, 0x0, 0xc2, 0x0, 0x0, 0x5, 0x55, - 0x99, 0x55, 0xd5, 0x5c, 0x30, 0x0, 0x0, 0x56, - 0x10, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x33, 0xd0, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, - 0x3, 0x40, 0x6, 0x55, 0x5d, 0x55, 0x55, 0x56, - 0x50, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xe5, 0x55, 0x57, 0x90, 0x0, 0x0, - 0x4a, 0xc0, 0x0, 0x4, 0x80, 0x0, 0x5, 0x50, - 0xc0, 0x0, 0x4, 0x80, 0x0, 0x10, 0x0, 0xc5, - 0x55, 0x58, 0x80, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0x4, 0x70, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+82E6 "苦" */ - 0x0, 0x0, 0x20, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x76, 0x0, 0xd, 0x0, 0x10, 0x6, 0x55, - 0xa8, 0x55, 0x5c, 0x56, 0xc2, 0x0, 0x0, 0x74, - 0x10, 0xb, 0x0, 0x0, 0x0, 0x0, 0x31, 0xa4, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa1, 0x0, - 0x1, 0x80, 0x6, 0x55, 0x55, 0xc5, 0x55, 0x55, - 0x51, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x55, 0x85, 0x55, 0xb3, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0xa1, 0x0, 0x0, 0xd, 0x55, 0x55, - 0x55, 0xc1, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+82F1 "英" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x67, 0x0, 0x1c, 0x0, 0x30, 0x6, 0x55, - 0x88, 0x55, 0x5c, 0x56, 0xb2, 0x0, 0x0, 0x55, - 0x42, 0xa, 0x0, 0x0, 0x0, 0x0, 0x11, 0x84, - 0x1, 0x0, 0x0, 0x0, 0xa, 0x55, 0xb7, 0x55, - 0xc3, 0x0, 0x0, 0xb, 0x0, 0x92, 0x0, 0xa0, - 0x0, 0x0, 0xb, 0x0, 0xa1, 0x0, 0xa0, 0x0, - 0x5, 0x5c, 0x55, 0xd5, 0x55, 0xc6, 0xd2, 0x1, - 0x0, 0x2, 0xb3, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x30, 0x74, 0x0, 0x0, 0x0, 0x1, 0xa5, - 0x0, 0x8, 0xa3, 0x0, 0x0, 0x57, 0x10, 0x0, - 0x0, 0x3c, 0xd2, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, - - /* U+8336 "茶" */ - 0x0, 0x0, 0x30, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0xc1, 0x3, 0x0, 0x6, 0x55, - 0xc6, 0x55, 0xd5, 0x59, 0x60, 0x0, 0x0, 0xb2, - 0xc1, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x29, 0x65, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x86, 0x1, 0x81, - 0x0, 0x0, 0x0, 0x18, 0x40, 0x82, 0x9, 0xa4, - 0x10, 0x4, 0x50, 0x0, 0xc0, 0x2, 0x8b, 0x60, - 0x0, 0x55, 0x55, 0xd5, 0x57, 0x70, 0x0, 0x0, - 0x1, 0xa0, 0xc0, 0x33, 0x0, 0x0, 0x0, 0xa, - 0x40, 0xc0, 0x5, 0xa1, 0x0, 0x0, 0x82, 0x10, - 0xc0, 0x0, 0x6c, 0x0, 0x4, 0x0, 0x2b, 0xd0, - 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8377 "荷" */ - 0x0, 0x0, 0x2, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x49, 0x0, 0x10, 0x5, 0x55, - 0x5d, 0x55, 0x79, 0x56, 0xc2, 0x0, 0x0, 0xc, - 0x0, 0x36, 0x0, 0x0, 0x0, 0x3, 0xa3, 0x0, - 0x11, 0x0, 0x30, 0x0, 0xa, 0x46, 0x55, 0x55, - 0x59, 0xa3, 0x0, 0x4b, 0x0, 0x0, 0x10, 0x1a, - 0x0, 0x1, 0xad, 0x8, 0x65, 0xe1, 0x1a, 0x0, - 0x7, 0x1b, 0x8, 0x30, 0xb0, 0x1a, 0x0, 0x0, - 0xb, 0x8, 0x30, 0xb0, 0x1a, 0x0, 0x0, 0xb, - 0x8, 0x75, 0xb0, 0x1a, 0x0, 0x0, 0xb, 0x6, - 0x10, 0x0, 0x1a, 0x0, 0x0, 0x1c, 0x0, 0x0, - 0x5, 0xc8, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x20, 0x0, - - /* U+83D3 "菓" */ - 0x0, 0x0, 0x10, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x5a, 0x0, 0x48, 0x0, 0x20, 0x6, 0x55, - 0x8a, 0x55, 0x89, 0x57, 0xb2, 0x0, 0x0, 0x47, - 0x0, 0x46, 0x0, 0x0, 0x0, 0xb, 0x55, 0x58, - 0x55, 0xd4, 0x0, 0x0, 0xb, 0x0, 0x1a, 0x0, - 0xc0, 0x0, 0x0, 0xc, 0x55, 0x6c, 0x55, 0xd0, - 0x0, 0x0, 0xc, 0x55, 0x6c, 0x55, 0xd0, 0x0, - 0x0, 0x4, 0x0, 0x1a, 0x0, 0x38, 0x0, 0x2, - 0x65, 0x57, 0xdc, 0x85, 0x56, 0x40, 0x0, 0x0, - 0x2c, 0x4a, 0x36, 0x0, 0x0, 0x0, 0x5, 0x91, - 0x1a, 0x4, 0xb4, 0x0, 0x4, 0x63, 0x0, 0x2a, - 0x0, 0x2b, 0xd2, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, - - /* U+83DC "菜" */ - 0x0, 0x0, 0x4, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xc1, 0x1, 0x40, 0x6, 0x55, - 0x5d, 0x55, 0xd5, 0x57, 0x90, 0x0, 0x0, 0xa, - 0x0, 0x73, 0x81, 0x0, 0x0, 0x34, 0x56, 0x78, - 0x97, 0x62, 0x0, 0x0, 0x11, 0x0, 0x54, 0x0, - 0xb1, 0x0, 0x0, 0xb, 0x30, 0xb, 0x4, 0x70, - 0x0, 0x0, 0x3, 0x30, 0x38, 0x7, 0x0, 0x20, - 0x17, 0x55, 0x55, 0xab, 0x65, 0x58, 0xb1, 0x0, - 0x0, 0xa, 0x88, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x95, 0x38, 0x19, 0x10, 0x0, 0x0, 0x29, 0x20, - 0x38, 0x2, 0xc8, 0x30, 0x5, 0x50, 0x0, 0x38, - 0x0, 0x7, 0x91, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x0, - - /* U+843D "落" */ - 0x0, 0x0, 0x20, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xb2, 0x0, 0xc0, 0x3, 0x20, 0x6, 0x55, - 0xc5, 0x55, 0xc5, 0x58, 0x70, 0x1, 0x40, 0x60, - 0x36, 0x50, 0x0, 0x0, 0x0, 0x86, 0x10, 0xa7, - 0x55, 0x80, 0x0, 0x0, 0x2, 0x42, 0x84, 0x8, - 0x40, 0x0, 0xa, 0x23, 0x27, 0x5, 0x77, 0x0, - 0x0, 0x3, 0x47, 0x21, 0x6, 0xc6, 0x0, 0x0, - 0x0, 0x17, 0x0, 0x76, 0x5, 0xc7, 0x30, 0x3, - 0xb3, 0x37, 0xa5, 0x55, 0xb7, 0x70, 0x2, 0xd0, - 0x2, 0x90, 0x0, 0xb0, 0x0, 0x0, 0xd0, 0x2, - 0x90, 0x0, 0xb0, 0x0, 0x0, 0xb0, 0x2, 0xb5, - 0x55, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+8449 "葉" */ - 0x0, 0x0, 0x20, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x91, 0x0, 0xb1, 0x6, 0x60, 0x16, 0x55, - 0xb5, 0x55, 0xc5, 0x55, 0x50, 0x0, 0x6, 0x35, - 0x10, 0x50, 0x0, 0x0, 0x0, 0xa, 0x1b, 0x10, - 0xa3, 0x16, 0x0, 0x4, 0x5c, 0x5c, 0x55, 0xb6, - 0x55, 0x10, 0x0, 0xa, 0xb, 0x55, 0xb1, 0x0, - 0x0, 0x0, 0xc, 0x57, 0x55, 0x75, 0xb1, 0x0, - 0x0, 0x2, 0x0, 0xc0, 0x0, 0x4, 0x0, 0x5, - 0x55, 0x5a, 0xe7, 0x55, 0x6a, 0x40, 0x0, 0x0, - 0x79, 0xc1, 0x60, 0x0, 0x0, 0x0, 0x19, 0x50, - 0xc0, 0x1a, 0x71, 0x0, 0x14, 0x50, 0x0, 0xd0, - 0x0, 0x6e, 0x90, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x0, - - /* U+8457 "著" */ - 0x0, 0x0, 0x10, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x6, 0x70, 0xc, 0x10, 0x60, 0x5, 0x55, 0x98, - 0x55, 0xc5, 0x57, 0x30, 0x0, 0x5, 0x38, 0x27, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x61, 0xb2, - 0x0, 0x0, 0x65, 0x5c, 0x56, 0xd6, 0x0, 0x4, - 0x55, 0x55, 0xc5, 0xd8, 0x5b, 0x70, 0x10, 0x0, - 0x4, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x6a, 0xb5, - 0x55, 0xa0, 0x0, 0x1, 0x7e, 0x10, 0x0, 0xb, - 0x0, 0x15, 0x50, 0xb5, 0x55, 0x55, 0xb0, 0x0, - 0x0, 0xb, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, - 0xb5, 0x55, 0x55, 0xc0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x2, 0x0, - - /* U+8535 "蔵" */ - 0x0, 0x0, 0x1, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x1b, 0x0, 0xa3, 0x2, 0x40, 0x6, 0x55, - 0x6b, 0x55, 0xb6, 0x57, 0x80, 0x0, 0x0, 0x5, - 0x0, 0x74, 0x80, 0x0, 0x0, 0x41, 0x11, 0x11, - 0x97, 0x76, 0x50, 0x0, 0xb4, 0x44, 0x46, 0x88, - 0x44, 0x30, 0x0, 0xb1, 0xb6, 0x87, 0x56, 0x6, - 0x20, 0x0, 0xb1, 0x93, 0x54, 0x38, 0xc, 0x30, - 0x0, 0xb1, 0xb5, 0x5c, 0x1b, 0x39, 0x0, 0x0, - 0xb1, 0xb5, 0x6b, 0xb, 0xb1, 0x0, 0x0, 0x91, - 0x93, 0x52, 0x9, 0xa0, 0x40, 0x5, 0x22, 0xa5, - 0x68, 0x75, 0xa5, 0x70, 0x5, 0x0, 0x0, 0x16, - 0x20, 0xa, 0xc0, 0x10, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x20, - - /* U+8584 "薄" */ - 0x0, 0x0, 0x3, 0x0, 0x21, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x58, 0x1, 0x50, 0x3, 0x65, - 0x5c, 0x55, 0x8a, 0x85, 0x60, 0x1, 0x81, 0x4, - 0x0, 0xa1, 0x83, 0x20, 0x0, 0x46, 0x26, 0x55, - 0xd5, 0x56, 0x70, 0x4, 0x0, 0x47, 0x55, 0xc5, - 0x5c, 0x0, 0x5, 0x84, 0x9, 0x54, 0xc4, 0x4b, - 0x0, 0x0, 0x26, 0x9, 0x31, 0xb1, 0x1b, 0x0, - 0x0, 0x44, 0x9, 0x65, 0xc5, 0x6a, 0x0, 0x5, - 0xe0, 0x56, 0x55, 0x65, 0xd5, 0xb1, 0x0, 0xc0, - 0x11, 0x70, 0x0, 0xb0, 0x0, 0x0, 0xe0, 0x0, - 0x54, 0x0, 0xb0, 0x0, 0x0, 0xa0, 0x0, 0x0, - 0x5d, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+85AC "薬" */ - 0x0, 0x0, 0x2, 0x0, 0x11, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x3a, 0x0, 0x81, 0x6, 0x55, - 0x5c, 0x55, 0x7a, 0x55, 0x52, 0x0, 0x0, 0x2, - 0x2a, 0x11, 0x0, 0x0, 0x1, 0x72, 0x17, 0x95, - 0x59, 0x2, 0x60, 0x0, 0x2a, 0x19, 0x0, 0xa, - 0x58, 0x30, 0x0, 0x0, 0x4b, 0x55, 0x5a, 0x40, - 0x0, 0x4, 0x96, 0x29, 0x0, 0xa, 0x1a, 0x80, - 0x3, 0x10, 0x19, 0x57, 0x57, 0x0, 0x60, 0x3, - 0x55, 0x55, 0x5e, 0x55, 0x57, 0xd1, 0x1, 0x0, - 0x9, 0x9b, 0x51, 0x0, 0x0, 0x0, 0x2, 0xa5, - 0xb, 0x7, 0x82, 0x0, 0x3, 0x55, 0x0, 0xb, - 0x0, 0x3c, 0xd3, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+85DD "藝" */ - 0x0, 0x0, 0x2, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x1b, 0x0, 0x80, 0x5, 0x55, - 0x5c, 0x55, 0x6a, 0x55, 0x52, 0x0, 0x0, 0xa0, - 0x10, 0x7, 0x0, 0x0, 0x0, 0x65, 0xb5, 0x73, - 0x5c, 0x58, 0x0, 0x3, 0x75, 0x96, 0x93, 0xa, - 0x18, 0x0, 0x1, 0x92, 0xb6, 0x90, 0x5b, 0x19, - 0x0, 0x3, 0x26, 0xb5, 0x30, 0x95, 0x7b, 0x40, - 0x0, 0x78, 0xa5, 0x35, 0x21, 0x16, 0xc0, 0x0, - 0x33, 0x65, 0x55, 0x57, 0x72, 0x20, 0x1, 0x65, - 0x55, 0x95, 0x55, 0x5a, 0x30, 0x0, 0x0, 0x18, - 0x71, 0x27, 0x30, 0x0, 0x0, 0x8, 0xea, 0x87, - 0x54, 0xb4, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+8607 "蘇" */ - 0x0, 0x0, 0x2, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x1b, 0x0, 0xa2, 0x2, 0x50, 0x6, 0x55, - 0x5b, 0x55, 0xc5, 0x55, 0x50, 0x0, 0x8, 0x24, - 0x0, 0x40, 0x15, 0x0, 0x0, 0x3c, 0x5a, 0x13, - 0x5b, 0x86, 0x10, 0x0, 0xa0, 0x44, 0x0, 0xa, - 0x0, 0x0, 0x6, 0xb5, 0xa5, 0xa5, 0x6d, 0x59, - 0x50, 0x0, 0x90, 0x91, 0x80, 0x9d, 0x50, 0x0, - 0x0, 0xb5, 0xb5, 0x80, 0x9a, 0x70, 0x0, 0x0, - 0x90, 0x91, 0x93, 0x5a, 0x29, 0x0, 0x0, 0x85, - 0x55, 0x45, 0xb, 0x9, 0xa1, 0x0, 0x43, 0x65, - 0x60, 0xb, 0x0, 0x20, 0xa, 0x2a, 0x44, 0x70, - 0xb, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+8655 "處" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x50, 0x0, 0x0, 0x0, - 0x0, 0xd5, 0x55, 0x61, 0x0, 0x0, 0xb5, 0x55, - 0xa5, 0x55, 0x59, 0x90, 0x0, 0xb0, 0x0, 0xd1, - 0x3, 0x16, 0x0, 0x0, 0xb2, 0x34, 0xc4, 0x55, - 0x32, 0x0, 0x0, 0xb0, 0x20, 0xb9, 0x88, 0x9a, - 0x0, 0x0, 0xb0, 0xa4, 0x1, 0x20, 0x20, 0x0, - 0x0, 0xa0, 0xc5, 0x8b, 0x87, 0xc2, 0x0, 0x0, - 0x95, 0x80, 0x93, 0x91, 0xa0, 0x20, 0x3, 0x57, - 0x36, 0xa0, 0x90, 0xa0, 0x70, 0x6, 0x10, 0x2c, - 0x97, 0x10, 0x38, 0x70, 0x13, 0x5, 0x60, 0x17, - 0xac, 0xdd, 0xb1, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+884C "行" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x80, 0x0, 0x0, 0x6, 0x0, 0x0, 0x3a, - 0x0, 0x55, 0x55, 0x56, 0x10, 0x1, 0x80, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x1, 0xd1, 0x0, - 0x0, 0x0, 0x20, 0x0, 0xb, 0x34, 0x65, 0x59, - 0x57, 0x90, 0x0, 0x7e, 0x10, 0x0, 0xc, 0x0, - 0x0, 0x4, 0x6c, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x13, 0xc, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x12, 0x2c, 0x0, 0x0, 0x0, 0xc, 0x0, 0x6, - 0xe8, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+8853 "術" */ - 0x0, 0x21, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x87, 0x0, 0xd2, 0x2, 0x55, 0x90, 0x1, 0x90, - 0x0, 0xb5, 0x60, 0x10, 0x0, 0x7, 0x9, 0x0, - 0xb0, 0x60, 0x0, 0x0, 0x20, 0x5a, 0x33, 0xc6, - 0x50, 0x0, 0x50, 0x0, 0xd1, 0x2a, 0xc1, 0x15, - 0x6c, 0x51, 0x7, 0xd2, 0xb, 0xc4, 0x0, 0xb, - 0x0, 0x32, 0xb0, 0x19, 0xb6, 0x90, 0xb, 0x0, - 0x0, 0xb0, 0x63, 0xb0, 0x70, 0xb, 0x0, 0x0, - 0xb0, 0x70, 0xb0, 0x0, 0xb, 0x0, 0x0, 0xb4, - 0x10, 0xb0, 0x0, 0xb, 0x0, 0x0, 0xb1, 0x0, - 0xb0, 0x0, 0xb, 0x0, 0x0, 0xb0, 0x0, 0xb0, - 0x6, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+8868 "表" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x1, 0x0, 0x1, 0x65, - 0x55, 0xd5, 0x55, 0x6c, 0x10, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x20, 0x0, 0x0, 0x26, 0x55, 0xd5, - 0x55, 0x92, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0x2, 0x30, 0x6, 0x55, 0x57, 0xe5, 0x55, 0x57, - 0x70, 0x0, 0x0, 0xc, 0x45, 0x0, 0xc3, 0x0, - 0x0, 0x0, 0xc4, 0x8, 0x28, 0x20, 0x0, 0x0, - 0x3a, 0xe0, 0x1, 0xb0, 0x0, 0x0, 0x16, 0x50, - 0xd0, 0x0, 0x4a, 0x10, 0x0, 0x0, 0x0, 0xd2, - 0x73, 0x3, 0xda, 0x61, 0x0, 0x0, 0xe9, 0x0, - 0x0, 0x7, 0x40, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+88AB "被" */ - 0x0, 0x20, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x49, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x6, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x5, 0x55, 0xc1, - 0xb5, 0x5c, 0x55, 0xe1, 0x0, 0x2, 0xa0, 0xb0, - 0xb, 0x5, 0x30, 0x0, 0xa, 0x33, 0xb0, 0xb, - 0x0, 0x0, 0x0, 0x3b, 0x65, 0xc5, 0x5b, 0x5a, - 0x30, 0x0, 0x8d, 0x60, 0xc1, 0x30, 0xd, 0x0, - 0x6, 0xb, 0x94, 0xb0, 0x60, 0x66, 0x0, 0x0, - 0xb, 0x15, 0xa0, 0x55, 0xc0, 0x0, 0x0, 0xb, - 0x4, 0x50, 0xe, 0x50, 0x0, 0x0, 0xb, 0x8, - 0x1, 0x94, 0xa6, 0x0, 0x0, 0xc, 0x43, 0x56, - 0x0, 0x8, 0xd3, 0x0, 0x1, 0x11, 0x0, 0x0, - 0x0, 0x0, - - /* U+88CF "裏" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3a, 0x0, 0x5, 0x20, 0x5, 0x55, - 0x55, 0x55, 0x55, 0x65, 0x30, 0x0, 0xc, 0x55, - 0x69, 0x55, 0xd1, 0x0, 0x0, 0xc, 0x55, 0x6b, - 0x55, 0xc0, 0x0, 0x0, 0xb, 0x0, 0x19, 0x0, - 0xb0, 0x0, 0x0, 0x7, 0x55, 0x6b, 0x55, 0x70, - 0x0, 0x0, 0x36, 0x55, 0x6b, 0x55, 0x74, 0x0, - 0x4, 0x65, 0x55, 0x8a, 0x55, 0x58, 0x80, 0x0, - 0x0, 0x7, 0xa5, 0x1, 0xc4, 0x0, 0x0, 0x4, - 0xba, 0x3, 0x87, 0x20, 0x0, 0x3, 0x64, 0x48, - 0x15, 0x4a, 0x85, 0x30, 0x0, 0x0, 0x6d, 0x70, - 0x0, 0x49, 0x40, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+88DC "補" */ - 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x1b, 0x0, 0x0, 0xd, 0x37, 0x0, 0x0, 0x7, - 0x0, 0x0, 0xb, 0x7, 0x40, 0x6, 0x55, 0xc4, - 0x65, 0x5c, 0x55, 0xb3, 0x0, 0x3, 0x90, 0x20, - 0xb, 0x0, 0x30, 0x0, 0xa, 0x23, 0xb5, 0x5c, - 0x57, 0xb0, 0x0, 0x4c, 0x57, 0xb0, 0xb, 0x2, - 0x90, 0x1, 0x8c, 0x70, 0xb5, 0x5c, 0x56, 0x90, - 0x6, 0xb, 0x95, 0xb0, 0xb, 0x2, 0x90, 0x10, - 0xb, 0x17, 0xb5, 0x5c, 0x56, 0x90, 0x0, 0xb, - 0x0, 0xb0, 0xb, 0x2, 0x90, 0x0, 0xb, 0x0, - 0xb0, 0xb, 0x2, 0x90, 0x0, 0xc, 0x0, 0xb0, - 0xa, 0x3b, 0x60, 0x0, 0x1, 0x0, 0x20, 0x0, - 0x1, 0x0, - - /* U+88E1 "裡" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1b, 0x0, 0x30, 0x0, 0x4, 0x0, 0x0, 0x7, - 0x0, 0xb5, 0x5c, 0x5c, 0x20, 0x6, 0x55, 0xc1, - 0xa0, 0xb, 0xa, 0x0, 0x0, 0x3, 0x90, 0xa5, - 0x5c, 0x5c, 0x0, 0x0, 0xa, 0x23, 0xa0, 0xb, - 0xa, 0x0, 0x0, 0x3c, 0x48, 0xa0, 0xb, 0xa, - 0x0, 0x0, 0x8c, 0x70, 0xb5, 0x5c, 0x5b, 0x0, - 0x6, 0xb, 0x95, 0x40, 0xb, 0x0, 0x0, 0x10, - 0xb, 0x17, 0x0, 0xb, 0x6, 0x10, 0x0, 0xb, - 0x0, 0x75, 0x5c, 0x55, 0x20, 0x0, 0xb, 0x0, - 0x0, 0xb, 0x0, 0x0, 0x0, 0xc, 0x5, 0x55, - 0x5c, 0x57, 0xc1, 0x0, 0x3, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+88FD "製" */ - 0x0, 0x10, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x84, 0xa3, 0x1, 0x0, 0xb, 0x20, 0x2, 0x95, - 0xc5, 0x68, 0x8, 0xb, 0x0, 0x7, 0x55, 0xc5, - 0x5a, 0x1b, 0xb, 0x0, 0x0, 0x75, 0xc5, 0x58, - 0xb, 0xb, 0x0, 0x0, 0xa0, 0xa0, 0xa, 0xb, - 0xb, 0x0, 0x0, 0xa0, 0xa1, 0x79, 0x2, 0x1b, - 0x0, 0x0, 0x60, 0x90, 0x64, 0x0, 0x7a, 0x0, - 0x4, 0x55, 0x55, 0x5b, 0x55, 0x5d, 0x60, 0x1, - 0x0, 0x3a, 0x25, 0x0, 0x73, 0x0, 0x0, 0x17, - 0xd1, 0x0, 0x76, 0x50, 0x0, 0x15, 0x40, 0xa1, - 0x55, 0x1a, 0x51, 0x0, 0x0, 0x0, 0xbb, 0x30, - 0x0, 0x6c, 0x80, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+8907 "複" */ - 0x0, 0x20, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x57, 0x0, 0xc, 0x40, 0x0, 0x10, 0x0, 0xa, - 0x0, 0x1d, 0x55, 0x56, 0xa1, 0x5, 0x55, 0xa0, - 0x76, 0x0, 0x4, 0x0, 0x0, 0x3, 0xa1, 0x6c, - 0x55, 0x5c, 0x20, 0x0, 0xa, 0x25, 0xc, 0x55, - 0x5c, 0x0, 0x0, 0x3b, 0x57, 0xb, 0x0, 0xb, - 0x0, 0x0, 0x9c, 0x70, 0x9, 0xd5, 0x58, 0x0, - 0x7, 0xa, 0x94, 0x4, 0xa5, 0x5b, 0x0, 0x0, - 0xa, 0x16, 0x17, 0x50, 0x67, 0x0, 0x0, 0xa, - 0x0, 0x40, 0x46, 0xa0, 0x0, 0x0, 0xa, 0x0, - 0x0, 0x6d, 0x60, 0x0, 0x0, 0xa, 0x1, 0x57, - 0x30, 0x5c, 0xa3, 0x0, 0x1, 0x12, 0x0, 0x0, - 0x0, 0x10, - - /* U+897F "西" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x20, 0x65, - 0x55, 0xc5, 0x5c, 0x55, 0x53, 0x0, 0x0, 0xb, - 0x0, 0xb0, 0x0, 0x0, 0x7, 0x55, 0xc5, 0x5c, - 0x55, 0x92, 0x0, 0xb0, 0xb, 0x0, 0xb0, 0xb, - 0x0, 0xb, 0x0, 0xc0, 0xb, 0x0, 0xb0, 0x0, - 0xb0, 0x1a, 0x0, 0xb0, 0xb, 0x0, 0xb, 0x6, - 0x40, 0xb, 0x1, 0xb0, 0x0, 0xb1, 0x70, 0x0, - 0x7a, 0x9b, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0xc5, 0x55, 0x55, 0x55, 0x5d, 0x0, - 0xb, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8981 "要" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, - 0x55, 0x55, 0x55, 0x56, 0xd2, 0x0, 0x0, 0xb, - 0x0, 0xb0, 0x0, 0x0, 0x7, 0x55, 0xc5, 0x5c, - 0x5b, 0x20, 0x0, 0xb0, 0xb, 0x0, 0xb0, 0xb0, - 0x0, 0xb, 0x0, 0xb0, 0xb, 0xb, 0x0, 0x0, - 0xa5, 0x5a, 0x65, 0x55, 0x90, 0x0, 0x0, 0x1, - 0xd1, 0x0, 0x0, 0x61, 0x26, 0x55, 0xc7, 0x55, - 0x89, 0x57, 0x40, 0x0, 0x39, 0x0, 0xb, 0x10, - 0x0, 0x0, 0x3, 0x66, 0x7b, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x4a, 0x66, 0xca, 0x10, 0x3, 0x56, - 0x74, 0x0, 0x0, 0x59, 0x1, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+898B "見" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x55, 0x55, 0x55, 0xe1, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x55, - 0x55, 0x55, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0xc, 0x55, 0x55, 0x55, - 0xc0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0xd, 0x5c, 0x65, 0xd5, 0xb0, 0x0, 0x0, - 0x3, 0xc, 0x0, 0xc0, 0x0, 0x10, 0x0, 0x0, - 0x1c, 0x0, 0xc0, 0x0, 0x50, 0x0, 0x0, 0xa4, - 0x0, 0xc0, 0x0, 0x90, 0x0, 0x48, 0x40, 0x0, - 0xdb, 0xaa, 0xe2, 0x14, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+898F "規" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x85, 0x55, 0x5b, 0x20, 0x0, 0xb, - 0x0, 0xb0, 0x0, 0xb, 0x0, 0x4, 0x5c, 0x74, - 0xb5, 0x55, 0x5c, 0x0, 0x1, 0xb, 0x0, 0xb0, - 0x0, 0xb, 0x0, 0x0, 0xb, 0x0, 0xb5, 0x55, - 0x5c, 0x0, 0x17, 0x5c, 0x59, 0xb0, 0x0, 0xb, - 0x0, 0x0, 0xb, 0x0, 0xb0, 0x0, 0xb, 0x0, - 0x0, 0x1c, 0x10, 0xb5, 0xd7, 0x9a, 0x0, 0x0, - 0x37, 0x76, 0x10, 0xc3, 0x70, 0x0, 0x0, 0x82, - 0xc, 0x14, 0x83, 0x70, 0x20, 0x1, 0x70, 0x1, - 0xb, 0x13, 0x70, 0x60, 0x6, 0x0, 0x3, 0x71, - 0x2, 0xca, 0xd1, 0x10, 0x0, 0x11, 0x0, 0x0, - 0x0, 0x0, - - /* U+8996 "視" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0x0, 0x85, 0x55, 0x5b, 0x30, 0x0, 0x8, - 0x20, 0xb0, 0x0, 0xb, 0x0, 0x6, 0x55, 0xb2, - 0xb5, 0x55, 0x5c, 0x0, 0x0, 0x2, 0xa0, 0xb0, - 0x0, 0xb, 0x0, 0x0, 0xa, 0x10, 0xb5, 0x55, - 0x5c, 0x0, 0x0, 0x5d, 0x10, 0xb0, 0x0, 0xb, - 0x0, 0x2, 0x7b, 0xa5, 0xb0, 0x0, 0xb, 0x0, - 0x15, 0xb, 0x19, 0xb5, 0xd7, 0x9b, 0x0, 0x0, - 0xb, 0x0, 0x0, 0xb3, 0x70, 0x0, 0x0, 0xb, - 0x0, 0x5, 0x73, 0x70, 0x30, 0x0, 0xc, 0x0, - 0x1a, 0x3, 0x70, 0x70, 0x0, 0xc, 0x3, 0x60, - 0x1, 0xca, 0xe2, 0x0, 0x1, 0x21, 0x0, 0x0, - 0x0, 0x0, - - /* U+899A "覚" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x72, 0xa, 0x10, 0x97, 0x0, 0x1, 0x1, 0xc0, - 0x57, 0x19, 0x0, 0x0, 0x75, 0x56, 0x55, 0x58, - 0x55, 0xa9, 0x3d, 0x1, 0x0, 0x0, 0x2, 0x9, - 0x1, 0x20, 0xa5, 0x55, 0x55, 0xd4, 0x10, 0x0, - 0xa, 0x55, 0x55, 0x5c, 0x0, 0x0, 0x0, 0xa0, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0xa, 0x55, 0x55, - 0x5c, 0x0, 0x0, 0x0, 0xa5, 0x75, 0x75, 0xc0, - 0x0, 0x0, 0x3, 0xc, 0xb, 0x3, 0x0, 0x30, - 0x0, 0x7, 0x60, 0xb0, 0x0, 0x15, 0x0, 0x47, - 0x50, 0x8, 0xba, 0xac, 0x90, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+89AA "親" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x80, 0x6, 0x55, 0x56, 0x80, 0x2, 0x65, - 0xa6, 0x89, 0x10, 0x3, 0x60, 0x0, 0x51, 0xb, - 0x9, 0x65, 0x57, 0x60, 0x0, 0x1a, 0x16, 0x9, - 0x10, 0x3, 0x60, 0x5, 0x56, 0x85, 0xa9, 0x65, - 0x57, 0x60, 0x0, 0x1, 0x80, 0x9, 0x10, 0x3, - 0x60, 0x2, 0x56, 0xb6, 0x69, 0x65, 0x57, 0x60, - 0x0, 0x1, 0x80, 0x8, 0x47, 0xa2, 0x40, 0x0, - 0xa4, 0x95, 0x0, 0x55, 0xa0, 0x0, 0x2, 0x81, - 0x86, 0x80, 0x82, 0xa0, 0x20, 0x7, 0x1, 0x80, - 0x71, 0x90, 0xa0, 0x40, 0x1, 0x4c, 0x50, 0x26, - 0x0, 0x7a, 0xc4, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+89BA "覺" */ - 0x0, 0x0, 0x20, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x86, 0x71, 0x6a, 0x36, 0x98, 0x0, 0x0, 0xa4, - 0x63, 0x47, 0x14, 0x94, 0x0, 0x0, 0x92, 0x31, - 0x4a, 0x12, 0xa2, 0x0, 0x0, 0x87, 0x43, 0x7a, - 0x16, 0xd0, 0x0, 0x9, 0x76, 0x55, 0x55, 0x55, - 0x97, 0xb0, 0x58, 0x8, 0x55, 0x55, 0x5a, 0x25, - 0x0, 0x0, 0xa, 0x55, 0x55, 0x5b, 0x0, 0x0, - 0x0, 0xa, 0x33, 0x33, 0x3b, 0x0, 0x0, 0x0, - 0xa, 0x11, 0x11, 0x1a, 0x10, 0x0, 0x0, 0x8, - 0x5c, 0x5c, 0x58, 0x0, 0x30, 0x0, 0x0, 0x56, - 0xa, 0x0, 0x0, 0x60, 0x0, 0x36, 0x50, 0x8, - 0xa9, 0x9a, 0xd0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+89C0 "觀" */ - 0x0, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x93, 0x56, 0x6, 0x55, 0x57, 0x60, 0x6, 0xb6, - 0x99, 0x99, 0x10, 0x5, 0x50, 0x1, 0x53, 0x42, - 0x28, 0x65, 0x58, 0x50, 0xa, 0x5b, 0xa5, 0xb8, - 0x10, 0x5, 0x50, 0xa, 0x59, 0xa5, 0x98, 0x65, - 0x58, 0x50, 0x2, 0xa5, 0x50, 0x8, 0x10, 0x5, - 0x50, 0x4, 0xa5, 0xa7, 0x78, 0x65, 0x58, 0x50, - 0xb, 0x52, 0x81, 0x8, 0x57, 0xa4, 0x30, 0x26, - 0x86, 0xa6, 0x30, 0x55, 0xa0, 0x0, 0x5, 0x86, - 0xa7, 0x40, 0x82, 0xa0, 0x20, 0x5, 0x52, 0x81, - 0x21, 0x90, 0xa0, 0x50, 0x6, 0x85, 0x55, 0x66, - 0x0, 0x9a, 0xd3, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x0, - - /* U+89D2 "角" */ - 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x90, 0x1, 0x0, 0x0, 0x0, 0x1, 0xd5, - 0x55, 0xc9, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x18, - 0x0, 0x0, 0x0, 0x7d, 0x55, 0x5a, 0x55, 0x5e, - 0x0, 0x63, 0xb0, 0x0, 0xc0, 0x0, 0xc0, 0x0, - 0xb, 0x55, 0x5d, 0x55, 0x5c, 0x0, 0x0, 0xb0, - 0x0, 0xc0, 0x0, 0xc0, 0x0, 0xc, 0x55, 0x5d, - 0x55, 0x5c, 0x0, 0x0, 0xb0, 0x0, 0xc0, 0x0, - 0xc0, 0x0, 0x38, 0x0, 0xc, 0x0, 0xc, 0x0, - 0xa, 0x10, 0x0, 0xc0, 0x0, 0xc0, 0x7, 0x20, - 0x0, 0x1a, 0x6, 0xda, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, - - /* U+89E3 "解" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x30, 0x4, 0x56, 0x55, 0xa0, 0x0, 0x2d, - 0x58, 0x0, 0x1b, 0x0, 0xb0, 0x0, 0x92, 0x58, - 0x0, 0x75, 0x0, 0xa0, 0x3, 0xc5, 0x97, 0x63, - 0x90, 0x4a, 0x70, 0x4, 0xa0, 0xa5, 0x74, 0x41, - 0x93, 0x0, 0x0, 0xc5, 0xc8, 0x50, 0xc2, 0xa0, - 0x20, 0x0, 0xa0, 0xa5, 0x55, 0x95, 0xc6, 0x70, - 0x0, 0xb3, 0xb7, 0x67, 0x1, 0xa0, 0x0, 0x0, - 0xa2, 0xb7, 0x77, 0x55, 0xc5, 0x95, 0x2, 0x70, - 0xa5, 0x50, 0x1, 0xa0, 0x0, 0x6, 0x20, 0xb5, - 0x50, 0x1, 0xa0, 0x0, 0x6, 0x0, 0x6b, 0x40, - 0x1, 0xb0, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, - 0x10, 0x0, - - /* U+89E6 "触" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x40, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x2c, - 0x5a, 0x20, 0x0, 0xa0, 0x0, 0x0, 0x91, 0x28, - 0x0, 0x0, 0xa0, 0x10, 0x4, 0xc5, 0x95, 0xa3, - 0xa5, 0xc5, 0xd0, 0x13, 0xa0, 0x90, 0xa3, 0x70, - 0xa0, 0xa0, 0x0, 0xc5, 0xb5, 0xa3, 0x70, 0xa0, - 0xa0, 0x0, 0xa0, 0x90, 0xa3, 0x70, 0xa0, 0xa0, - 0x0, 0xc5, 0xb5, 0xa3, 0xa5, 0xc5, 0xa0, 0x0, - 0xa0, 0x90, 0xa1, 0x10, 0xa0, 0x0, 0x2, 0x60, - 0x90, 0xa0, 0x0, 0xa2, 0x60, 0x6, 0x10, 0xa0, - 0xa3, 0x56, 0xc4, 0xb3, 0x5, 0x0, 0x47, 0x98, - 0x62, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8A00 "言" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x35, 0x0, 0x5, 0x20, 0x65, 0x55, 0x55, 0x55, - 0x55, 0x54, 0x0, 0x0, 0x0, 0x0, 0x2, 0x70, - 0x0, 0x0, 0x65, 0x55, 0x55, 0x55, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x65, - 0x55, 0x55, 0x56, 0x10, 0x0, 0x3, 0x0, 0x0, - 0x0, 0x40, 0x0, 0x0, 0xc5, 0x55, 0x55, 0x6c, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x2, 0xa0, 0x0, - 0x0, 0xc5, 0x55, 0x55, 0x7a, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+8A08 "計" */ - 0x0, 0x21, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x1d, 0x10, 0x0, 0xd, 0x10, 0x0, 0x15, 0x5d, - 0x67, 0x80, 0xc, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x3, 0x44, 0x49, 0x0, - 0xc, 0x0, 0x30, 0x2, 0x21, 0x11, 0x36, 0x5d, - 0x56, 0x80, 0x4, 0x55, 0x5a, 0x10, 0xc, 0x0, - 0x0, 0x1, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x7, 0x55, 0x59, 0x0, 0xc, 0x0, 0x0, 0xb, - 0x0, 0xb, 0x0, 0xc, 0x0, 0x0, 0xb, 0x0, - 0xb, 0x0, 0xc, 0x0, 0x0, 0xb, 0x55, 0x5b, - 0x0, 0xd, 0x0, 0x0, 0xb, 0x0, 0xb, 0x0, - 0xd, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+8A0A "訊" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x39, 0x4, 0x68, 0x55, 0xd0, 0x0, 0x15, 0x5c, - 0x6a, 0xb, 0x0, 0xc0, 0x0, 0x1, 0x0, 0x0, - 0xb, 0x0, 0xb0, 0x0, 0x4, 0x55, 0x91, 0xb, - 0x0, 0xb0, 0x0, 0x1, 0x0, 0x0, 0xb, 0x10, - 0xb0, 0x0, 0x4, 0x55, 0xa3, 0x6c, 0x74, 0xa0, - 0x0, 0x1, 0x0, 0x0, 0xb, 0x0, 0xb0, 0x0, - 0x7, 0x55, 0x92, 0xb, 0x0, 0xb0, 0x0, 0xb, - 0x0, 0xa1, 0xb, 0x0, 0x93, 0x10, 0xb, 0x0, - 0xa1, 0xb, 0x0, 0x48, 0x60, 0xb, 0x55, 0xc1, - 0xc, 0x0, 0xc, 0xb0, 0xb, 0x0, 0xa1, 0xb, - 0x0, 0x1, 0xd0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8A0E "討" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x46, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xa, - 0x6, 0x0, 0x0, 0xd0, 0x0, 0x26, 0x55, 0x55, - 0x10, 0x0, 0xd0, 0x10, 0x4, 0x55, 0x93, 0x54, - 0x44, 0xd5, 0x80, 0x1, 0x0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x50, 0x8, 0x0, 0xd0, - 0x0, 0x5, 0x55, 0x50, 0x4, 0xb0, 0xd0, 0x0, - 0x6, 0x55, 0x82, 0x0, 0x90, 0xd0, 0x0, 0xb, - 0x0, 0xa1, 0x0, 0x0, 0xd0, 0x0, 0xb, 0x0, - 0xa1, 0x0, 0x0, 0xd0, 0x0, 0xb, 0x55, 0xc1, - 0x1, 0x0, 0xd0, 0x0, 0xc, 0x0, 0xa1, 0x1, - 0x7e, 0xc0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, - 0x10, 0x0, - - /* U+8A13 "訓" */ - 0x0, 0x20, 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, - 0x39, 0x0, 0xc, 0x7, 0x11, 0xc0, 0x25, 0x5b, - 0x6a, 0xc, 0xb, 0x0, 0xa0, 0x0, 0x0, 0x0, - 0xc, 0xb, 0x0, 0xa0, 0x5, 0x55, 0x91, 0xb, - 0xb, 0x0, 0xa0, 0x0, 0x0, 0x10, 0xc, 0xb, - 0x0, 0xa0, 0x4, 0x55, 0x81, 0xc, 0xb, 0x0, - 0xa0, 0x0, 0x0, 0x10, 0xc, 0xb, 0x0, 0xa0, - 0xb, 0x55, 0xc3, 0x1a, 0xb, 0x0, 0xa0, 0xb, - 0x0, 0xa1, 0x56, 0xb, 0x0, 0xa0, 0xb, 0x0, - 0xa1, 0xa1, 0xb, 0x0, 0xa0, 0xb, 0x55, 0x94, - 0x70, 0x7, 0x1, 0xa0, 0x5, 0x0, 0x16, 0x0, - 0x0, 0x1, 0xa0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+8A18 "記" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4a, 0x0, 0x25, 0x55, 0x5a, 0x20, 0x25, 0x5d, - 0x59, 0x31, 0x0, 0xc, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x4, 0x55, 0x58, 0x0, - 0x0, 0xc, 0x0, 0x1, 0x0, 0x0, 0x9, 0x55, - 0x5d, 0x0, 0x4, 0x55, 0x76, 0xc, 0x0, 0x5, - 0x0, 0x1, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x7, 0x55, 0x5a, 0xc, 0x0, 0x0, 0x0, 0xb, - 0x0, 0xc, 0xc, 0x0, 0x0, 0x10, 0xb, 0x0, - 0xb, 0xc, 0x0, 0x0, 0x50, 0xb, 0x55, 0x5b, - 0xc, 0x0, 0x0, 0x90, 0xc, 0x0, 0xb, 0x9, - 0xcb, 0xbc, 0xb0, 0x2, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+8A2A "訪" */ - 0x0, 0x20, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x67, 0x0, 0x0, 0x4b, 0x0, 0x0, 0x25, 0x6b, - 0x68, 0x0, 0xb, 0x30, 0x10, 0x1, 0x0, 0x0, - 0x65, 0x85, 0x57, 0x90, 0x4, 0x55, 0x91, 0x0, - 0xd0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xd0, - 0x1, 0x0, 0x3, 0x55, 0x80, 0x0, 0xc5, 0x5c, - 0x40, 0x1, 0x0, 0x0, 0x2, 0x80, 0xa, 0x10, - 0x7, 0x55, 0xa2, 0x6, 0x50, 0xb, 0x0, 0xb, - 0x0, 0xb0, 0xa, 0x0, 0xc, 0x0, 0xb, 0x0, - 0xb0, 0x27, 0x0, 0xc, 0x0, 0xb, 0x55, 0xc0, - 0x80, 0x12, 0x2a, 0x0, 0xb, 0x0, 0x95, 0x20, - 0x5, 0xf3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x10, 0x0, - - /* U+8A2D "設" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x67, 0x0, 0xb, 0x55, 0xd2, 0x0, 0x25, 0x6b, - 0x67, 0xc, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x0, 0xb0, 0x0, 0x5, 0x55, 0x91, 0x29, - 0x0, 0xb2, 0x30, 0x0, 0x0, 0x0, 0x80, 0x0, - 0x4a, 0x92, 0x4, 0x65, 0x84, 0x46, 0x55, 0x6d, - 0x10, 0x0, 0x0, 0x0, 0x6, 0x0, 0x88, 0x0, - 0xa, 0x55, 0xb2, 0x3, 0x41, 0xc0, 0x0, 0xb, - 0x0, 0xb0, 0x0, 0x9a, 0x30, 0x0, 0xb, 0x0, - 0xb0, 0x0, 0x9c, 0x0, 0x0, 0xb, 0x55, 0xc0, - 0x7, 0x46, 0xa0, 0x0, 0xb, 0x0, 0x72, 0x72, - 0x0, 0x7e, 0x81, 0x1, 0x0, 0x13, 0x0, 0x0, - 0x3, 0x40, - - /* U+8A31 "許" */ - 0x0, 0x20, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, - 0x49, 0x0, 0x4, 0xb0, 0x0, 0x0, 0x15, 0x5d, - 0x59, 0x8, 0x30, 0x1, 0x0, 0x1, 0x0, 0x0, - 0xc, 0x58, 0x59, 0x40, 0x4, 0x55, 0x91, 0x45, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0xc, - 0x0, 0x0, 0x3, 0x55, 0x92, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x65, 0x5d, 0x55, 0xc1, - 0x7, 0x55, 0xa2, 0x0, 0xc, 0x0, 0x0, 0xb, - 0x0, 0xb0, 0x0, 0xc, 0x0, 0x0, 0xb, 0x0, - 0xb0, 0x0, 0xc, 0x0, 0x0, 0xb, 0x55, 0xc0, - 0x0, 0xc, 0x0, 0x0, 0xb, 0x0, 0x70, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+8A33 "訳" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x29, 0x0, 0x5, 0x22, 0x22, 0x60, 0x26, 0x59, - 0x6a, 0x1d, 0x33, 0x34, 0xa0, 0x0, 0x0, 0x10, - 0xc, 0x0, 0x2, 0x90, 0x4, 0x55, 0x80, 0xc, - 0x0, 0x2, 0x90, 0x0, 0x0, 0x10, 0xd, 0x56, - 0x56, 0x90, 0x4, 0x55, 0x70, 0xb, 0x5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1a, 0x7, 0x0, 0x0, - 0xb, 0x55, 0xc4, 0x28, 0x8, 0x0, 0x0, 0xb, - 0x0, 0xb0, 0x64, 0x4, 0x60, 0x0, 0xb, 0x0, - 0xb0, 0x90, 0x0, 0xc1, 0x0, 0xb, 0x55, 0xc2, - 0x80, 0x0, 0x4c, 0x0, 0x6, 0x0, 0x27, 0x0, - 0x0, 0x9, 0xd4, 0x0, 0x0, 0x31, 0x0, 0x0, - 0x0, 0x40, - - /* U+8A34 "訴" */ - 0x0, 0x30, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x68, 0x0, 0x3, 0x36, 0xac, 0x30, 0x16, 0x6a, - 0x69, 0xd, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x4, 0x65, 0x81, 0xd, - 0x55, 0x55, 0xb1, 0x0, 0x0, 0x0, 0xc, 0x0, - 0xc0, 0x0, 0x3, 0x55, 0x80, 0xc, 0x22, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0x4, 0xe8, 0x10, - 0xa, 0x55, 0xc2, 0x38, 0x0, 0xc5, 0xe0, 0xb, - 0x0, 0xb0, 0x74, 0x0, 0xc0, 0x30, 0xb, 0x0, - 0xb0, 0xa0, 0x0, 0xc0, 0x0, 0xb, 0x55, 0xc5, - 0x40, 0x0, 0xd0, 0x0, 0x7, 0x0, 0x36, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+8A55 "評" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x59, 0x0, 0x36, 0x59, 0x56, 0x70, 0x15, 0x5d, - 0x67, 0x20, 0xc, 0x1, 0x30, 0x1, 0x0, 0x0, - 0x56, 0xc, 0x6, 0xa0, 0x3, 0x55, 0x90, 0xe, - 0x1c, 0xa, 0x0, 0x1, 0x0, 0x0, 0x8, 0x1c, - 0x34, 0x0, 0x3, 0x44, 0x70, 0x0, 0xc, 0x10, - 0x50, 0x1, 0x11, 0x11, 0x65, 0x5d, 0x55, 0x71, - 0x7, 0x55, 0x92, 0x0, 0xc, 0x0, 0x0, 0xb, - 0x0, 0xb0, 0x0, 0xc, 0x0, 0x0, 0xb, 0x0, - 0xb0, 0x0, 0xc, 0x0, 0x0, 0xb, 0x55, 0xc0, - 0x0, 0xd, 0x0, 0x0, 0xb, 0x0, 0xa0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8A66 "試" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x74, 0x0, 0x0, 0xb, 0x43, 0x0, 0x0, 0x1a, - 0x4, 0x0, 0xb, 0xc, 0x10, 0x16, 0x55, 0x56, - 0x11, 0x1b, 0x13, 0x60, 0x3, 0x55, 0x82, 0x32, - 0x2b, 0x32, 0x20, 0x1, 0x0, 0x0, 0x0, 0x9, - 0x10, 0x0, 0x0, 0x0, 0x51, 0x67, 0xa9, 0x30, - 0x0, 0x4, 0x55, 0x50, 0xb, 0x6, 0x50, 0x0, - 0x6, 0x55, 0x81, 0xb, 0x3, 0x80, 0x0, 0xb, - 0x0, 0xb0, 0xb, 0x0, 0xb0, 0x10, 0xb, 0x0, - 0xb0, 0x4d, 0x62, 0x84, 0x50, 0xb, 0x55, 0xc3, - 0x91, 0x0, 0x1c, 0xa0, 0xb, 0x0, 0xa0, 0x0, - 0x0, 0x2, 0xb0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8A71 "話" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x66, 0x0, 0x0, 0x14, 0x7c, 0xa0, 0x15, 0x5c, - 0x59, 0x24, 0x5c, 0x31, 0x0, 0x1, 0x0, 0x0, - 0x0, 0xb, 0x0, 0x0, 0x2, 0x33, 0x80, 0x0, - 0xb, 0x0, 0x70, 0x2, 0x21, 0x12, 0x65, 0x5c, - 0x55, 0x51, 0x3, 0x55, 0x80, 0x0, 0xb, 0x0, - 0x0, 0x1, 0x0, 0x0, 0x43, 0x3c, 0x37, 0x10, - 0x7, 0x55, 0x91, 0x94, 0x22, 0x2b, 0x10, 0xb, - 0x0, 0xb0, 0x92, 0x0, 0xb, 0x0, 0xb, 0x0, - 0xb0, 0x92, 0x0, 0xb, 0x0, 0xb, 0x55, 0xc0, - 0x96, 0x55, 0x5c, 0x0, 0xb, 0x0, 0x90, 0x91, - 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8A72 "該" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x73, 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x1a, - 0x4, 0x0, 0xc, 0x0, 0x0, 0x16, 0x55, 0x55, - 0x54, 0x54, 0x44, 0xa1, 0x3, 0x55, 0x80, 0x0, - 0xc4, 0x1, 0x0, 0x1, 0x0, 0x0, 0x8, 0x50, - 0x2e, 0x10, 0x0, 0x0, 0x40, 0xaa, 0x87, 0xc4, - 0x0, 0x4, 0x55, 0x50, 0x44, 0x17, 0x52, 0x0, - 0x6, 0x55, 0x81, 0x0, 0x73, 0x1d, 0x40, 0xb, - 0x0, 0xb0, 0x45, 0x0, 0xb4, 0x0, 0xb, 0x0, - 0xb1, 0x0, 0x1c, 0x86, 0x0, 0xb, 0x55, 0xc0, - 0x3, 0xa2, 0x6, 0xb0, 0xc, 0x0, 0xa2, 0x66, - 0x0, 0x0, 0xb2, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8A73 "詳" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, - 0x67, 0x0, 0x9, 0x10, 0x2d, 0x10, 0x15, 0x5b, - 0x6a, 0x6, 0x90, 0x73, 0x0, 0x1, 0x0, 0x1, - 0x45, 0x84, 0xa4, 0xb1, 0x3, 0x55, 0x91, 0x21, - 0x1c, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x2, 0x0, 0x3, 0x55, 0x90, 0x26, 0x5d, 0x57, - 0x30, 0x1, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x6, 0x44, 0x81, 0x0, 0xc, 0x0, 0x70, 0xb, - 0x0, 0xb2, 0x65, 0x5d, 0x55, 0x52, 0xb, 0x0, - 0xb0, 0x0, 0xc, 0x0, 0x0, 0xb, 0x55, 0xc0, - 0x0, 0xc, 0x0, 0x0, 0x9, 0x0, 0x70, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+8A8C "誌" */ - 0x0, 0x20, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x77, 0x0, 0x0, 0xc, 0x0, 0x0, 0x15, 0x6b, - 0x68, 0x0, 0xb, 0x0, 0x20, 0x1, 0x0, 0x0, - 0x65, 0x5c, 0x56, 0xa0, 0x3, 0x55, 0x90, 0x0, - 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x4, 0x10, 0x3, 0x55, 0x80, 0x26, 0x55, 0x55, - 0x20, 0x1, 0x0, 0x0, 0x0, 0x43, 0x0, 0x0, - 0x6, 0x55, 0x91, 0x8, 0x1c, 0x31, 0x0, 0xb, - 0x0, 0xb0, 0x6b, 0x3, 0x24, 0x90, 0xb, 0x0, - 0xb3, 0x8b, 0x0, 0x3, 0xa4, 0xb, 0x55, 0xc7, - 0x2b, 0x10, 0x19, 0x0, 0xb, 0x0, 0xb0, 0x3, - 0xaa, 0xa5, 0x0, 0x2, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+8A8D "認" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x57, 0x0, 0x14, 0x44, 0x45, 0x70, 0x15, 0x5c, - 0x68, 0x2, 0x76, 0x14, 0xa0, 0x1, 0x0, 0x0, - 0x42, 0x93, 0x4, 0x80, 0x3, 0x55, 0x91, 0xc1, - 0xc0, 0x6, 0x60, 0x1, 0x0, 0x0, 0x27, 0x60, - 0x9, 0x40, 0x3, 0x55, 0x70, 0x38, 0x3, 0x9d, - 0x0, 0x1, 0x0, 0x0, 0x40, 0x35, 0x21, 0x0, - 0x7, 0x55, 0x92, 0x7, 0x1b, 0x21, 0x0, 0xb, - 0x0, 0xb0, 0x6b, 0x3, 0x5, 0x60, 0xb, 0x0, - 0xb4, 0x8b, 0x0, 0x4, 0xb1, 0xb, 0x55, 0xc5, - 0x2b, 0x10, 0x29, 0x10, 0xb, 0x0, 0xa0, 0x3, - 0xaa, 0xa6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8A95 "誕" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x84, 0x1, 0x15, 0x0, 0x16, 0x90, 0x15, 0x8a, - 0x97, 0x4d, 0x36, 0xb6, 0x20, 0x1, 0x0, 0x0, - 0x57, 0x0, 0x72, 0x0, 0x4, 0x55, 0x80, 0xb1, - 0x5, 0x72, 0x0, 0x0, 0x0, 0x3, 0xa2, 0xb, - 0x77, 0x90, 0x4, 0x55, 0x83, 0x6b, 0x4a, 0x72, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xa, 0x72, 0x0, - 0xa, 0x55, 0xc5, 0xa, 0xa, 0x72, 0x0, 0xa, - 0x0, 0xa1, 0xb6, 0x2c, 0x97, 0x90, 0xa, 0x0, - 0xa0, 0xb9, 0x2, 0x0, 0x0, 0xa, 0x55, 0xb7, - 0x34, 0xc8, 0x53, 0x21, 0x5, 0x0, 0x53, 0x0, - 0x5, 0xac, 0xa1, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+8A98 "誘" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x85, 0x0, 0x35, 0x7a, 0xbb, 0x20, 0x15, 0x79, - 0x92, 0x0, 0xb, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x65, 0x7d, 0x65, 0xb1, 0x4, 0x55, 0x80, 0x2, - 0xbb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x1b, - 0x2b, 0x10, 0x4, 0x55, 0x74, 0x70, 0xb, 0x3, - 0xd3, 0x0, 0x0, 0x10, 0x46, 0x95, 0x7a, 0x0, - 0xb, 0x55, 0xd1, 0x2, 0xb0, 0x85, 0x0, 0xb, - 0x0, 0xb0, 0x5, 0x70, 0xb5, 0xd1, 0xb, 0x0, - 0xb0, 0xb, 0x10, 0x0, 0xc0, 0xb, 0x55, 0xc0, - 0x75, 0x0, 0x4, 0x90, 0x4, 0x0, 0x26, 0x30, - 0x2, 0xae, 0x20, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x11, 0x0, - - /* U+8A9E "語" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x74, 0x0, 0x22, 0x22, 0x28, 0x0, 0x0, 0x1a, - 0x13, 0x33, 0xb3, 0x33, 0x0, 0x16, 0x55, 0x54, - 0x12, 0xb2, 0x52, 0x0, 0x3, 0x55, 0x80, 0x3, - 0xa2, 0xa3, 0x0, 0x1, 0x0, 0x0, 0x1, 0x80, - 0xa2, 0x0, 0x0, 0x0, 0x41, 0x35, 0x93, 0xc5, - 0xa0, 0x4, 0x55, 0x51, 0x42, 0x22, 0x22, 0x20, - 0x6, 0x55, 0x81, 0x1a, 0x44, 0x4d, 0x0, 0xb, - 0x0, 0xb0, 0xb, 0x0, 0xc, 0x0, 0xb, 0x0, - 0xb0, 0xb, 0x0, 0xc, 0x0, 0xb, 0x55, 0xc0, - 0xd, 0x55, 0x5c, 0x0, 0xa, 0x0, 0x80, 0x1a, - 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8AAA "說" */ - 0x0, 0x20, 0x0, 0x0, 0x30, 0x30, 0x0, 0x0, - 0x57, 0x0, 0x2, 0xd1, 0x70, 0x0, 0x15, 0x5c, - 0x68, 0xa, 0x20, 0x64, 0x0, 0x1, 0x0, 0x0, - 0x65, 0x0, 0xc, 0x40, 0x3, 0x55, 0x94, 0x58, - 0x55, 0x5c, 0xb2, 0x0, 0x0, 0x0, 0xb, 0x0, - 0xa, 0x0, 0x3, 0x55, 0x90, 0xb, 0x0, 0xa, - 0x0, 0x1, 0x0, 0x0, 0xc, 0x33, 0x3b, 0x0, - 0x7, 0x55, 0x92, 0x7, 0xb3, 0xc5, 0x0, 0xb, - 0x0, 0xb0, 0x0, 0xb0, 0xb0, 0x0, 0xb, 0x0, - 0xb0, 0x1, 0xa0, 0xb0, 0x30, 0xb, 0x55, 0xc0, - 0x8, 0x30, 0xb0, 0x60, 0xb, 0x0, 0xa0, 0x64, - 0x0, 0xb9, 0xd1, 0x1, 0x0, 0x3, 0x10, 0x0, - 0x0, 0x0, - - /* U+8AAC "説" */ - 0x0, 0x20, 0x0, 0x10, 0x0, 0x23, 0x0, 0x0, - 0x77, 0x0, 0xa, 0x0, 0x78, 0x0, 0x15, 0x6b, - 0x75, 0x8, 0x50, 0x90, 0x0, 0x1, 0x0, 0x0, - 0x44, 0x44, 0x66, 0x0, 0x4, 0x55, 0x91, 0xb3, - 0x33, 0x3b, 0x10, 0x0, 0x0, 0x0, 0xb0, 0x0, - 0xa, 0x0, 0x4, 0x55, 0x90, 0xb0, 0x0, 0xa, - 0x0, 0x0, 0x0, 0x0, 0xb6, 0x85, 0x8b, 0x0, - 0xa, 0x55, 0xc2, 0x32, 0xa1, 0xa0, 0x0, 0xb, - 0x0, 0xb0, 0x4, 0x91, 0xa0, 0x0, 0xb, 0x0, - 0xb0, 0x9, 0x41, 0xa0, 0x50, 0xb, 0x55, 0xc0, - 0x3a, 0x1, 0xa0, 0x70, 0x9, 0x0, 0x45, 0x80, - 0x0, 0xc9, 0xd2, 0x0, 0x0, 0x32, 0x0, 0x0, - 0x0, 0x0, - - /* U+8AAD "読" */ - 0x0, 0x20, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x74, 0x0, 0x0, 0xc, 0x0, 0x0, 0x15, 0x78, - 0x94, 0x55, 0x5c, 0x56, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x0, 0x0, 0x4, 0x55, 0x91, 0x16, - 0x5a, 0x58, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x20, 0x4, 0x55, 0x81, 0xb5, 0x55, 0x55, - 0xe1, 0x0, 0x0, 0x13, 0x52, 0x80, 0x74, 0x10, - 0xb, 0x55, 0xd1, 0x3, 0xa0, 0xb0, 0x0, 0xb, - 0x0, 0xb0, 0x5, 0x80, 0xb0, 0x20, 0xb, 0x0, - 0xb0, 0xa, 0x30, 0xb0, 0x40, 0xb, 0x55, 0xc0, - 0x4a, 0x0, 0xb0, 0x70, 0x7, 0x0, 0x25, 0x80, - 0x0, 0xba, 0xd1, 0x0, 0x0, 0x32, 0x0, 0x0, - 0x0, 0x0, - - /* U+8AB0 "誰" */ - 0x0, 0x10, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, - 0x65, 0x0, 0x7, 0x59, 0x40, 0x0, 0x13, 0x3b, - 0x46, 0xb, 0x1, 0x71, 0x10, 0x3, 0x22, 0x22, - 0x3d, 0x59, 0x57, 0x60, 0x4, 0x55, 0x80, 0xab, - 0xa, 0x0, 0x0, 0x1, 0x0, 0x4, 0x5b, 0xa, - 0x5, 0x10, 0x4, 0x55, 0x93, 0xc, 0x4c, 0x54, - 0x20, 0x1, 0x0, 0x0, 0xb, 0xa, 0x0, 0x0, - 0x5, 0x44, 0x81, 0xb, 0xa, 0x4, 0x10, 0xb, - 0x11, 0xb1, 0xc, 0x5c, 0x55, 0x30, 0xb, 0x0, - 0xb0, 0xb, 0xa, 0x0, 0x0, 0xb, 0x55, 0xc0, - 0xb, 0xa, 0x2, 0x50, 0xb, 0x0, 0xa0, 0xd, - 0x55, 0x55, 0x50, 0x1, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+8AB2 "課" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x84, 0x0, 0xa5, 0x58, 0x5d, 0x20, 0x15, 0x89, - 0x84, 0xb0, 0xb, 0xb, 0x0, 0x1, 0x0, 0x0, - 0xb5, 0x5c, 0x5c, 0x0, 0x5, 0x55, 0x90, 0xb0, - 0xb, 0xb, 0x0, 0x0, 0x0, 0x0, 0xb5, 0x5c, - 0x5c, 0x0, 0x5, 0x55, 0x80, 0x40, 0xb, 0x3, - 0x0, 0x0, 0x0, 0x2, 0x55, 0x5c, 0x56, 0xc2, - 0xa, 0x55, 0xd1, 0x0, 0xec, 0x40, 0x0, 0xb, - 0x0, 0xb0, 0x8, 0x6b, 0x80, 0x0, 0xb, 0x0, - 0xb0, 0x3a, 0xb, 0x48, 0x0, 0xb, 0x55, 0xc2, - 0x90, 0xb, 0xa, 0xa2, 0x5, 0x0, 0x34, 0x0, - 0xc, 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+8ABF "調" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x94, 0x0, 0x95, 0x56, 0x55, 0xd0, 0x14, 0x79, - 0x64, 0xb0, 0xb, 0x0, 0xb0, 0x2, 0x11, 0x11, - 0xb2, 0x5c, 0x74, 0xb0, 0x4, 0x54, 0x81, 0xb0, - 0xa, 0x0, 0xb0, 0x0, 0x0, 0x0, 0xb4, 0x5c, - 0x57, 0xb0, 0x5, 0x65, 0x91, 0xb1, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0xb2, 0xa5, 0xb3, 0xb0, - 0x9, 0x55, 0xb2, 0xb1, 0x80, 0x91, 0xb0, 0xb, - 0x0, 0xb0, 0xb2, 0xb5, 0xb1, 0xb0, 0xb, 0x0, - 0xb3, 0x71, 0x50, 0x50, 0xb0, 0xb, 0x55, 0xb8, - 0x10, 0x0, 0x32, 0xb0, 0x4, 0x0, 0x24, 0x0, - 0x0, 0x1b, 0x70, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+8AC7 "談" */ - 0x0, 0x20, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x95, 0x0, 0x1, 0xa2, 0x5, 0x20, 0x15, 0x89, - 0x85, 0x17, 0xa1, 0x8a, 0x30, 0x1, 0x0, 0x0, - 0xc3, 0xb8, 0x30, 0x0, 0x5, 0x55, 0x90, 0x21, - 0xe5, 0x60, 0x0, 0x0, 0x0, 0x0, 0xa, 0x50, - 0x3d, 0x20, 0x5, 0x55, 0x82, 0x72, 0x94, 0x3, - 0x30, 0x0, 0x0, 0x0, 0x2, 0xa3, 0x6, 0x0, - 0x9, 0x55, 0xb2, 0x55, 0xc6, 0x98, 0x20, 0xb, - 0x0, 0xb1, 0xb1, 0xc8, 0x0, 0x0, 0xb, 0x0, - 0xb0, 0x7, 0x67, 0x30, 0x0, 0xb, 0x55, 0xc0, - 0x1b, 0x1, 0xd2, 0x0, 0xb, 0x0, 0x83, 0x80, - 0x0, 0x4f, 0x91, 0x1, 0x0, 0x34, 0x0, 0x0, - 0x3, 0x30, - - /* U+8ACB "請" */ - 0x0, 0x10, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x57, 0x0, 0x0, 0xc, 0x0, 0x0, 0x14, 0x4c, - 0x75, 0x55, 0x5c, 0x58, 0x80, 0x2, 0x11, 0x11, - 0x0, 0xb, 0x5, 0x0, 0x2, 0x44, 0x81, 0x16, - 0x5c, 0x55, 0x20, 0x1, 0x11, 0x12, 0x65, 0x5b, - 0x56, 0xa0, 0x2, 0x33, 0x71, 0x2, 0x0, 0x4, - 0x0, 0x1, 0x21, 0x10, 0xc, 0x55, 0x5c, 0x20, - 0x6, 0x55, 0x92, 0xc, 0x55, 0x5c, 0x0, 0xb, - 0x0, 0xb0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, - 0xb0, 0xc, 0x55, 0x5c, 0x0, 0xb, 0x55, 0xc0, - 0xb, 0x0, 0xb, 0x0, 0x7, 0x0, 0x50, 0xa, - 0x4, 0xad, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x1, 0x0, - - /* U+8AD6 "論" */ - 0x0, 0x20, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, - 0x76, 0x0, 0x0, 0x6d, 0x0, 0x0, 0x15, 0x6b, - 0x67, 0x0, 0xd5, 0x20, 0x0, 0x1, 0x0, 0x0, - 0x8, 0x50, 0x90, 0x0, 0x3, 0x44, 0x80, 0x57, - 0x0, 0x5b, 0x10, 0x1, 0x21, 0x16, 0x56, 0x55, - 0x95, 0xd4, 0x3, 0x55, 0x90, 0x65, 0x55, 0x55, - 0x80, 0x1, 0x0, 0x0, 0xa0, 0xa0, 0xa0, 0x90, - 0x6, 0x55, 0x90, 0xa0, 0xa0, 0xa0, 0x90, 0xa, - 0x0, 0xb0, 0xb5, 0xc5, 0xc5, 0x90, 0xa, 0x0, - 0xa0, 0xa0, 0xa0, 0xa0, 0x90, 0xa, 0x55, 0xb0, - 0xa0, 0xa0, 0x80, 0x90, 0xa, 0x0, 0xa0, 0xa0, - 0x0, 0x4b, 0x80, 0x1, 0x0, 0x0, 0x10, 0x0, - 0x2, 0x0, - - /* U+8AF8 "諸" */ - 0x0, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x84, 0x0, 0x0, 0xb1, 0x2, 0x30, 0x14, 0x69, - 0x73, 0x0, 0xa0, 0x3a, 0x70, 0x2, 0x0, 0x0, - 0x45, 0xc5, 0x8a, 0x0, 0x5, 0x55, 0x90, 0x0, - 0xa0, 0xc1, 0x20, 0x0, 0x0, 0x3, 0x65, 0x8b, - 0x86, 0x90, 0x5, 0x55, 0x80, 0x0, 0x84, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0x85, 0x5b, 0x10, - 0x9, 0x55, 0xd4, 0x8a, 0x0, 0xb, 0x0, 0xb, - 0x0, 0xb2, 0x1c, 0x55, 0x5c, 0x0, 0xb, 0x0, - 0xb0, 0x1a, 0x0, 0xb, 0x0, 0xb, 0x44, 0xc0, - 0x1c, 0x55, 0x5c, 0x0, 0x7, 0x0, 0x50, 0x17, - 0x0, 0x8, 0x0, - - /* U+8B02 "謂" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x67, 0x0, 0x95, 0x57, 0x56, 0xb0, 0x25, 0x6b, - 0x78, 0xb0, 0xb, 0x1, 0x90, 0x0, 0x0, 0x0, - 0xb5, 0x5c, 0x56, 0x90, 0x5, 0x55, 0x92, 0xb0, - 0xb, 0x1, 0x90, 0x0, 0x0, 0x0, 0xb5, 0x57, - 0x56, 0x70, 0x5, 0x55, 0x81, 0x16, 0x55, 0x59, - 0x20, 0x0, 0x0, 0x0, 0x19, 0x0, 0xb, 0x0, - 0xa, 0x55, 0xc2, 0x1b, 0x55, 0x5c, 0x0, 0xb, - 0x0, 0xb0, 0x19, 0x0, 0xb, 0x0, 0xb, 0x0, - 0xb0, 0x1b, 0x44, 0x4c, 0x0, 0xb, 0x55, 0xc0, - 0x19, 0x0, 0xb, 0x0, 0x8, 0x0, 0x60, 0x29, - 0x1, 0x8c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+8B1B "講" */ - 0x0, 0x10, 0x0, 0x2, 0x0, 0x20, 0x0, 0x0, - 0x85, 0x0, 0x9, 0x40, 0xb0, 0x10, 0x12, 0x4a, - 0x64, 0x6b, 0x65, 0xc5, 0x80, 0x14, 0x33, 0x31, - 0x9, 0x20, 0xa1, 0x20, 0x3, 0x44, 0x70, 0x6b, - 0x65, 0xc5, 0x40, 0x0, 0x0, 0x4, 0x57, 0x67, - 0x85, 0x82, 0x5, 0x55, 0x80, 0x55, 0x5d, 0x58, - 0x20, 0x0, 0x0, 0x0, 0x91, 0xa, 0xa, 0x0, - 0x9, 0x55, 0xb0, 0x95, 0x5c, 0x5c, 0x0, 0xa, - 0x0, 0xa0, 0x91, 0xa, 0xa, 0x10, 0xa, 0x0, - 0xa4, 0xb5, 0x59, 0x5c, 0x91, 0xb, 0x55, 0xa0, - 0x91, 0x0, 0xa, 0x0, 0x7, 0x0, 0x40, 0xa0, - 0x2, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x2, 0x0, - - /* U+8B1D "謝" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x92, 0x0, 0xa, 0x0, 0xa, 0x10, 0x0, 0x57, - 0x43, 0x86, 0x80, 0xa, 0x0, 0x16, 0x55, 0x57, - 0x40, 0xa0, 0xa, 0x0, 0x4, 0x56, 0x75, 0x74, - 0xb4, 0x5c, 0x80, 0x1, 0x0, 0x5, 0x40, 0xa0, - 0xa, 0x0, 0x3, 0x55, 0x85, 0x75, 0xb6, 0x2a, - 0x0, 0x1, 0x0, 0x6, 0x41, 0xa0, 0xda, 0x0, - 0x7, 0x55, 0x95, 0x4c, 0xc0, 0x3a, 0x0, 0xa, - 0x0, 0xa0, 0x29, 0xa0, 0xa, 0x0, 0xa, 0x0, - 0xa0, 0x90, 0xa0, 0xa, 0x0, 0xa, 0x55, 0xa7, - 0x20, 0xa0, 0x1b, 0x0, 0x6, 0x0, 0x51, 0x1a, - 0xb1, 0x8c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8B58 "識" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x1, - 0x70, 0x0, 0x83, 0x0, 0xb0, 0x0, 0x0, 0x84, - 0x25, 0x89, 0x83, 0xa6, 0x30, 0x16, 0x55, 0x35, - 0x10, 0xa1, 0xa0, 0xa0, 0x3, 0x48, 0x2, 0xa2, - 0x80, 0xa0, 0x0, 0x1, 0x0, 0x45, 0x79, 0x55, - 0xc5, 0xb0, 0x4, 0x59, 0x23, 0x0, 0x30, 0xa0, - 0x70, 0x1, 0x0, 0xb, 0x55, 0xc0, 0xa4, 0x90, - 0x8, 0x5a, 0x3a, 0x0, 0xa0, 0x9b, 0x20, 0xa, - 0x9, 0xa, 0x55, 0xa0, 0x6b, 0x0, 0xa, 0x9, - 0x1a, 0x0, 0xa0, 0xba, 0x4, 0xb, 0x5b, 0x1b, - 0x55, 0xa7, 0x48, 0xa3, 0x7, 0x6, 0x3, 0x0, - 0x64, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+8B70 "議" */ - 0x0, 0x10, 0x0, 0x3, 0x0, 0x52, 0x0, 0x0, - 0xa3, 0x0, 0x4, 0x90, 0xb2, 0x0, 0x25, 0x98, - 0x93, 0x65, 0x98, 0x68, 0x70, 0x1, 0x0, 0x0, - 0x1, 0x46, 0x15, 0x0, 0x5, 0x56, 0x60, 0x25, - 0x78, 0x44, 0x0, 0x0, 0x0, 0x2, 0x65, 0x78, - 0x56, 0xb0, 0x5, 0x56, 0x70, 0x3, 0x77, 0x25, - 0x0, 0x0, 0x0, 0x1, 0x6c, 0x39, 0x6, 0x30, - 0x9, 0x55, 0xc4, 0x5c, 0x5b, 0x65, 0xb2, 0xa, - 0x0, 0xa0, 0xa, 0x26, 0x46, 0x20, 0xa, 0x0, - 0xa5, 0x9d, 0x22, 0xc9, 0x0, 0xb, 0x55, 0xa3, - 0xa, 0x5, 0xd4, 0x21, 0x6, 0x0, 0x51, 0x7c, - 0x54, 0xa, 0xc1, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x31, - - /* U+8B77 "護" */ - 0x0, 0x20, 0x0, 0x3, 0x10, 0x40, 0x0, 0x0, - 0xa4, 0x0, 0x7, 0x40, 0xb0, 0x40, 0x25, 0x99, - 0x87, 0x5a, 0x95, 0xc5, 0x52, 0x1, 0x0, 0x0, - 0x66, 0x1b, 0x20, 0x10, 0x5, 0x55, 0x80, 0xd5, - 0x5c, 0x57, 0x80, 0x0, 0x0, 0x6, 0xd4, 0x4c, - 0x58, 0x20, 0x5, 0x55, 0x73, 0xa5, 0x5c, 0x58, - 0x20, 0x0, 0x0, 0x0, 0xa1, 0x1a, 0x11, 0x80, - 0xb, 0x55, 0xc0, 0x74, 0x44, 0x47, 0x41, 0xa, - 0x0, 0xa1, 0x68, 0x55, 0x8d, 0x0, 0xa, 0x0, - 0xa0, 0x3, 0x53, 0xa1, 0x0, 0xb, 0x55, 0xa0, - 0x1, 0xbc, 0x10, 0x0, 0x3, 0x0, 0x33, 0x55, - 0x1, 0x9a, 0x92, - - /* U+8B8A "變" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, 0x0, - 0x85, 0x0, 0x44, 0x30, 0x2a, 0x0, 0x4, 0x77, - 0x36, 0x55, 0x82, 0x85, 0x70, 0x9, 0x8a, 0x14, - 0x66, 0x86, 0x9c, 0x30, 0x5, 0x96, 0x74, 0x33, - 0x51, 0x96, 0x80, 0x4, 0x86, 0x96, 0x75, 0xb0, - 0xa7, 0x82, 0x6, 0x44, 0x96, 0x75, 0x91, 0x57, - 0x71, 0x6, 0x15, 0x53, 0x10, 0x35, 0x15, 0x22, - 0x0, 0x3, 0xf6, 0x55, 0x56, 0x7a, 0x0, 0x0, - 0x2a, 0x33, 0x0, 0x49, 0x0, 0x0, 0x0, 0x40, - 0x4, 0x65, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xbc, 0x40, 0x0, 0x0, 0x2, 0x46, 0x74, 0x0, - 0x5a, 0xbb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8B93 "讓" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, - 0x80, 0x0, 0x0, 0x57, 0x0, 0x20, 0x0, 0x75, - 0x34, 0x55, 0x57, 0x55, 0x91, 0x26, 0x55, 0x50, - 0x84, 0x95, 0x54, 0x80, 0x5, 0x55, 0x50, 0xb5, - 0xa6, 0x75, 0x90, 0x0, 0x0, 0x0, 0x34, 0x32, - 0x50, 0x20, 0x4, 0x57, 0x53, 0x6a, 0x65, 0xc6, - 0xa0, 0x0, 0x0, 0x0, 0x8, 0x10, 0x91, 0x40, - 0x8, 0x55, 0x90, 0x6a, 0x65, 0xb5, 0x60, 0x9, - 0x0, 0x95, 0x59, 0x96, 0x86, 0x92, 0x9, 0x0, - 0x90, 0x1c, 0x27, 0x38, 0x30, 0xa, 0x55, 0x93, - 0x8b, 0x3, 0xb3, 0x0, 0x5, 0x0, 0x23, 0xb, - 0x70, 0x9, 0xc2, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, - - /* U+8BA1 "计" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x46, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xb, - 0x40, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb2, 0x0, 0x0, 0x16, 0x5c, 0x16, 0x55, 0xc6, - 0x56, 0xb0, 0x0, 0xb, 0x0, 0x0, 0xb2, 0x0, - 0x0, 0x0, 0xb, 0x0, 0x0, 0xb2, 0x0, 0x0, - 0x0, 0xb, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, - 0xb, 0x3, 0x0, 0xb2, 0x0, 0x0, 0x0, 0xb, - 0x82, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x1f, 0x60, - 0x0, 0xb2, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, - 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+8BDE "诞" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x20, 0x0, 0x40, 0x0, 0x2a, 0x80, 0x0, 0xd0, - 0x67, 0xd2, 0x68, 0xd3, 0x0, 0x0, 0x20, 0x7, - 0x50, 0x0, 0xb0, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x50, 0xb0, 0x0, 0x26, 0xb2, 0x58, 0x30, 0xc0, - 0xc6, 0xa0, 0x0, 0xb0, 0x56, 0xc3, 0xa0, 0xb0, - 0x0, 0x0, 0xb0, 0x20, 0xb0, 0xa0, 0xb0, 0x0, - 0x0, 0xb0, 0x34, 0xb0, 0xa0, 0xb0, 0x10, 0x0, - 0xb0, 0x3c, 0x51, 0xc5, 0x85, 0x90, 0x0, 0xb9, - 0x1b, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x81, - 0x2b, 0x96, 0x43, 0x20, 0x0, 0x16, 0x10, 0x0, - 0x37, 0xac, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8C50 "豐" */ - 0x0, 0x0, 0x30, 0x41, 0x2, 0x0, 0x0, 0x0, - 0xb0, 0x93, 0xa1, 0xb, 0x1a, 0x0, 0x0, 0xa4, - 0xc5, 0x93, 0x6b, 0x3a, 0x0, 0x0, 0xa4, 0xb7, - 0x93, 0x6c, 0x5a, 0x0, 0x0, 0xa3, 0xb7, 0x93, - 0x5b, 0x4a, 0x0, 0x1, 0xd5, 0xb5, 0xb5, 0x5b, - 0x5a, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x6, - 0x0, 0x2, 0x65, 0x55, 0x55, 0x55, 0x57, 0x30, - 0x0, 0x7, 0x55, 0x55, 0x55, 0xa0, 0x0, 0x0, - 0xa, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0xa, - 0x65, 0x55, 0x56, 0xa0, 0x0, 0x0, 0x1, 0x47, - 0x0, 0x68, 0x0, 0x0, 0x5, 0x55, 0x5a, 0x55, - 0xa5, 0x57, 0xd1, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8C61 "象" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5d, 0x10, 0x13, 0x0, 0x0, 0x0, 0x4b, 0x55, - 0x5c, 0x80, 0x0, 0x0, 0x5d, 0x55, 0x58, 0x75, - 0x58, 0x0, 0x42, 0xb0, 0x3, 0xa0, 0x2, 0xa0, - 0x0, 0xd, 0x55, 0xa9, 0x55, 0x6a, 0x0, 0x0, - 0x70, 0x3d, 0x10, 0x2, 0x70, 0x0, 0x0, 0x67, - 0x3b, 0x6, 0x95, 0x0, 0x3, 0x62, 0x59, 0x79, - 0x60, 0x0, 0x0, 0x2, 0x85, 0x2b, 0xb3, 0x60, - 0x0, 0x4, 0x40, 0x59, 0xd, 0x9, 0x80, 0x0, - 0x3, 0x84, 0x2, 0xc0, 0x8, 0xe4, 0x35, 0x30, - 0x4b, 0xe4, 0x0, 0x1, 0x0, 0x0, 0x0, 0x12, - 0x0, 0x0, 0x0, - - /* U+8CA0 "負" */ - 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6c, 0x10, 0x21, 0x0, 0x0, 0x3, 0xc5, 0x55, - 0xd8, 0x0, 0x0, 0x3a, 0x10, 0x5, 0x60, 0x0, - 0x5, 0x75, 0x22, 0x38, 0x23, 0x70, 0x1, 0x2b, - 0x22, 0x22, 0x23, 0xb0, 0x0, 0x1c, 0x55, 0x55, - 0x56, 0xa0, 0x0, 0x1a, 0x0, 0x0, 0x1, 0xa0, - 0x0, 0x1c, 0x55, 0x55, 0x56, 0xa0, 0x0, 0x2a, - 0x0, 0x0, 0x1, 0xa0, 0x0, 0x2a, 0x85, 0x55, - 0x76, 0x90, 0x0, 0x4, 0xd4, 0x0, 0x4a, 0x60, - 0x0, 0x77, 0x0, 0x0, 0x0, 0xb6, 0x2, 0x0, - 0x0, 0x0, 0x0, 0x1, - - /* U+8CA1 "財" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x7, - 0x55, 0x59, 0x0, 0x0, 0xb2, 0x0, 0xb, 0x0, - 0xb, 0x0, 0x0, 0xb0, 0x0, 0xb, 0x0, 0xb, - 0x0, 0x0, 0xb0, 0x50, 0xb, 0x55, 0x5b, 0x35, - 0x59, 0xf5, 0x50, 0xb, 0x0, 0xb, 0x0, 0xc, - 0xc0, 0x0, 0xb, 0x55, 0x5b, 0x0, 0x49, 0xb0, - 0x0, 0xb, 0x0, 0xb, 0x0, 0xb1, 0xb0, 0x0, - 0xb, 0x0, 0xb, 0x7, 0x40, 0xb0, 0x0, 0xb, - 0x55, 0x5a, 0x36, 0x0, 0xb0, 0x0, 0x1, 0x82, - 0x52, 0x50, 0x0, 0xb0, 0x0, 0x4, 0x90, 0x1b, - 0x0, 0x0, 0xb0, 0x0, 0x28, 0x0, 0x8, 0x10, - 0x4a, 0xe0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, - 0x30, 0x0, - - /* U+8CA7 "貧" */ - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x98, 0x0, 0x61, 0x0, 0x0, 0x0, 0x85, 0x0, - 0x0, 0x86, 0x0, 0x2, 0x73, 0x6a, 0x75, 0x5c, - 0x9d, 0x80, 0x0, 0x6, 0x80, 0x0, 0xc0, 0x0, - 0x0, 0x27, 0x40, 0x2, 0xa8, 0x0, 0x0, 0x12, - 0x95, 0x55, 0x56, 0x5c, 0x0, 0x0, 0xb, 0x55, - 0x55, 0x55, 0xb0, 0x0, 0x0, 0xb0, 0x0, 0x0, - 0xb, 0x0, 0x0, 0xb, 0x55, 0x55, 0x55, 0xc0, - 0x0, 0x0, 0xb5, 0x55, 0x55, 0x5b, 0x0, 0x0, - 0x2, 0x5c, 0x0, 0x37, 0x82, 0x0, 0x4, 0x85, - 0x0, 0x0, 0x2, 0xc3, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+8CA9 "販" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0x55, 0x59, 0x1, 0x25, 0x9c, 0x70, 0xb, 0x0, - 0xb, 0xc, 0x31, 0x0, 0x0, 0xb, 0x11, 0x1b, - 0xa, 0x0, 0x0, 0x0, 0xb, 0x33, 0x3b, 0xc, - 0x55, 0x58, 0x10, 0xb, 0x0, 0xb, 0xa, 0x50, - 0xc, 0x0, 0xb, 0x55, 0x5b, 0x19, 0x60, 0x29, - 0x0, 0xb, 0x0, 0xb, 0x18, 0x43, 0x65, 0x0, - 0xb, 0x0, 0xb, 0x46, 0x8, 0xb0, 0x0, 0xb, - 0x55, 0x5b, 0x63, 0x9, 0x80, 0x0, 0x1, 0xb1, - 0x91, 0x80, 0x1b, 0xa0, 0x0, 0x6, 0x60, 0x57, - 0x60, 0x91, 0x5b, 0x10, 0x17, 0x0, 0x5, 0x25, - 0x0, 0x7, 0xa0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8CAC "責" */ - 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2b, 0x0, 0x7, 0x0, 0x6, 0x55, 0x56, - 0xb5, 0x56, 0x52, 0x0, 0x6, 0x55, 0x6b, 0x55, - 0x85, 0x0, 0x11, 0x11, 0x13, 0xa1, 0x11, 0x2a, - 0x4, 0x47, 0x44, 0x44, 0x44, 0x75, 0x41, 0x0, - 0xc5, 0x55, 0x55, 0x59, 0x60, 0x0, 0xc, 0x44, - 0x44, 0x44, 0x95, 0x0, 0x0, 0xc5, 0x55, 0x55, - 0x59, 0x50, 0x0, 0xc, 0x0, 0x0, 0x0, 0x75, - 0x0, 0x0, 0xb5, 0x75, 0x55, 0x59, 0x40, 0x0, - 0x0, 0x8c, 0x10, 0x48, 0x82, 0x0, 0x5, 0x94, - 0x0, 0x0, 0x3, 0xd3, 0x2, 0x10, 0x0, 0x0, - 0x0, 0x1, 0x0, - - /* U+8CB7 "買" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x55, - 0x85, 0x58, 0x55, 0xc0, 0xc, 0x0, 0xb0, 0xb, - 0x1, 0xa0, 0xc, 0x0, 0xb0, 0xb, 0x1, 0xa0, - 0x9, 0x55, 0x55, 0x55, 0x55, 0x70, 0x0, 0x95, - 0x55, 0x55, 0x5c, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0xc5, 0x55, 0x55, 0x5c, 0x0, - 0x0, 0xc5, 0x55, 0x55, 0x5c, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0xb5, 0x75, 0x55, - 0x59, 0x0, 0x0, 0x1b, 0x90, 0x3, 0x78, 0x20, - 0x6, 0x82, 0x0, 0x0, 0x3, 0xd0, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+8CB8 "貸" */ - 0x0, 0x0, 0x11, 0x1, 0x11, 0x0, 0x0, 0x0, - 0xc, 0x60, 0xc0, 0xa5, 0x0, 0x0, 0x1c, 0x40, - 0xa, 0x12, 0x39, 0x20, 0x48, 0x93, 0x55, 0x7a, - 0x43, 0x32, 0x11, 0x8, 0x20, 0x0, 0x86, 0x0, - 0x50, 0x0, 0x71, 0x0, 0x0, 0x7b, 0x78, 0x0, - 0xb, 0x55, 0x55, 0x55, 0xd5, 0x50, 0x0, 0xc5, - 0x55, 0x55, 0x5c, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0xc5, 0x55, 0x55, 0x5c, - 0x0, 0x0, 0xc, 0x55, 0x55, 0x55, 0xc0, 0x0, - 0x0, 0x19, 0xa0, 0x2, 0x78, 0x20, 0x0, 0x59, - 0x30, 0x0, 0x0, 0x4d, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+8CBB "費" */ - 0x0, 0x0, 0x20, 0x2, 0x0, 0x0, 0x0, 0x0, - 0xa1, 0xc, 0x3, 0x0, 0x4, 0x55, 0xc5, 0x5c, - 0x5c, 0x20, 0x5, 0x95, 0xc5, 0x5c, 0x5a, 0x0, - 0x9, 0x95, 0xc5, 0x5c, 0x55, 0x69, 0x0, 0x8, - 0x20, 0xa, 0x3, 0x84, 0x14, 0x95, 0x44, 0x49, - 0x48, 0x60, 0x0, 0xb1, 0x11, 0x11, 0x1c, 0x0, - 0x0, 0xb5, 0x55, 0x55, 0x5b, 0x0, 0x0, 0xb5, - 0x55, 0x55, 0x5b, 0x0, 0x0, 0xb5, 0x55, 0x55, - 0x5b, 0x0, 0x0, 0x49, 0x50, 0x4, 0x78, 0x0, - 0x5, 0x94, 0x0, 0x0, 0x5, 0xd1, 0x21, 0x0, - 0x0, 0x0, 0x0, 0x20, - - /* U+8CBF "貿" */ - 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x5, 0x58, - 0x63, 0x55, 0x55, 0x93, 0xb, 0x1, 0x50, 0x1c, - 0x0, 0xb0, 0xb, 0x0, 0xa5, 0x29, 0x0, 0xc0, - 0xc, 0x87, 0x23, 0xa1, 0x58, 0x90, 0x5, 0x10, - 0x16, 0x10, 0x7, 0x10, 0x0, 0x95, 0x55, 0x55, - 0x5d, 0x10, 0x0, 0xb5, 0x55, 0x55, 0x5c, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0xc, 0x0, 0x0, 0xb5, - 0x55, 0x55, 0x5d, 0x0, 0x0, 0xb5, 0x65, 0x55, - 0x5c, 0x0, 0x0, 0x17, 0xc0, 0x2, 0x78, 0x10, - 0x4, 0x84, 0x0, 0x0, 0x4, 0xd0, 0x21, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+8CC3 "賃" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, - 0x23, 0x68, 0x9b, 0x70, 0x3, 0xc0, 0x11, 0x1b, - 0x0, 0x0, 0x37, 0xb3, 0x65, 0x5c, 0x55, 0x86, - 0x20, 0xb0, 0x0, 0xb, 0x0, 0x20, 0x0, 0x70, - 0x36, 0x57, 0x57, 0x70, 0x0, 0x95, 0x55, 0x55, - 0x5d, 0x0, 0x0, 0xb5, 0x55, 0x55, 0x5b, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0xb, 0x0, 0x0, 0xb5, - 0x55, 0x55, 0x5c, 0x0, 0x0, 0xb5, 0x55, 0x55, - 0x5b, 0x0, 0x0, 0x16, 0xb0, 0x2, 0x67, 0x10, - 0x3, 0x95, 0x0, 0x0, 0x3, 0xd1, 0x11, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+8CC7 "資" */ - 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0x8, 0x50, - 0x1c, 0x10, 0x0, 0x10, 0x0, 0x46, 0x3a, 0x56, - 0x57, 0xb0, 0x0, 0x80, 0x90, 0x3d, 0x5, 0x0, - 0x3e, 0x12, 0x10, 0xb4, 0x70, 0x0, 0xc, 0x0, - 0x9, 0x50, 0x6a, 0x41, 0xa, 0x34, 0x72, 0x11, - 0x19, 0x94, 0x0, 0xc3, 0x33, 0x33, 0x3d, 0x0, - 0x0, 0xc5, 0x55, 0x55, 0x5c, 0x0, 0x0, 0xc5, - 0x55, 0x55, 0x5c, 0x0, 0x0, 0xc5, 0x55, 0x55, - 0x5c, 0x0, 0x0, 0x3a, 0x80, 0x2, 0x78, 0x0, - 0x5, 0x94, 0x0, 0x0, 0x5, 0xd0, 0x21, 0x0, - 0x0, 0x0, 0x0, 0x10, - - /* U+8CEA "質" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x20, 0x0, 0x7, - 0x58, 0xa2, 0x66, 0x8a, 0x30, 0x0, 0xb0, 0x2, - 0xc, 0x0, 0x3, 0x0, 0xc, 0x5b, 0x63, 0xd5, - 0x97, 0x60, 0x4, 0x70, 0xb0, 0x37, 0x8, 0x30, - 0x0, 0x90, 0xa, 0x19, 0x0, 0x83, 0x0, 0x40, - 0x55, 0x68, 0x55, 0x5a, 0x10, 0x0, 0x8, 0x40, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x87, 0x55, 0x55, - 0x5d, 0x0, 0x0, 0x8, 0x75, 0x55, 0x55, 0xd0, - 0x0, 0x0, 0x87, 0x55, 0x55, 0x5d, 0x0, 0x0, - 0x2, 0x3b, 0x10, 0x26, 0x60, 0x0, 0x1, 0x77, - 0x10, 0x0, 0x6, 0xd0, 0x0, 0x30, 0x0, 0x0, - 0x0, 0x2, 0x0, - - /* U+8CFD "賽" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x39, 0x0, 0x1, 0x0, 0x0, 0xa5, - 0x59, 0x55, 0x85, 0x5b, 0x40, 0x1, 0x56, 0x5c, - 0x55, 0xc5, 0x85, 0x0, 0x0, 0x5, 0x5c, 0x55, - 0xc5, 0x71, 0x0, 0x1, 0x56, 0x5c, 0x55, 0xc5, - 0x59, 0x30, 0x0, 0x10, 0x95, 0x0, 0x25, 0x0, - 0x0, 0x0, 0x19, 0xd5, 0x55, 0x5d, 0xb3, 0x0, - 0x4, 0x50, 0xc5, 0x55, 0x5b, 0x2a, 0xc1, 0x0, - 0x0, 0xc3, 0x33, 0x3b, 0x10, 0x0, 0x0, 0x0, - 0xc1, 0x11, 0x1a, 0x10, 0x0, 0x0, 0x0, 0x9a, - 0x55, 0xa9, 0x0, 0x0, 0x0, 0x2, 0x96, 0x10, - 0x6, 0xc1, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, - 0x21, 0x0, - - /* U+8D39 "费" */ - 0x0, 0x0, 0x40, 0x2, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x10, 0xd0, 0x1, 0x0, 0x6, 0x55, 0xc5, - 0x5c, 0x56, 0xc0, 0x0, 0x75, 0x5c, 0x55, 0xc5, - 0x69, 0x0, 0xc, 0x0, 0xb0, 0xb, 0x0, 0x34, - 0x1, 0x75, 0xa8, 0x55, 0xd5, 0x57, 0xc0, 0x0, - 0x66, 0x0, 0xb, 0x4, 0xc3, 0x3, 0x59, 0x55, - 0x55, 0x55, 0xb2, 0x0, 0x0, 0xc0, 0x6, 0x50, - 0x1a, 0x0, 0x0, 0xc, 0x0, 0x92, 0x1, 0xb0, - 0x0, 0x0, 0xb0, 0xb, 0x21, 0x17, 0x0, 0x0, - 0x0, 0xa, 0x30, 0x5b, 0x81, 0x0, 0x2, 0x67, - 0x10, 0x0, 0x9, 0xa0, 0x3, 0x20, 0x0, 0x0, - 0x0, 0x1, 0x0, - - /* U+8D64 "赤" */ - 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x65, 0x0, 0x52, 0x0, 0x0, 0x16, 0x55, - 0x99, 0x55, 0x53, 0x0, 0x0, 0x0, 0x0, 0x65, - 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x99, 0x55, - 0x56, 0xc1, 0x0, 0x1, 0xa, 0x20, 0xc0, 0x0, - 0x0, 0x0, 0xd, 0x3b, 0x0, 0xc1, 0x60, 0x0, - 0x0, 0x57, 0xc, 0x0, 0xc0, 0x2b, 0x10, 0x1, - 0x70, 0x39, 0x0, 0xc0, 0x7, 0xa0, 0x5, 0x0, - 0x92, 0x0, 0xc0, 0x0, 0x60, 0x0, 0x6, 0x50, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x63, 0x0, 0x5b, - 0xe0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x20, - 0x0, 0x0, - - /* U+8D70 "走" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa1, 0x1, 0x70, 0x0, 0x0, 0x45, 0x55, - 0xc6, 0x55, 0x50, 0x0, 0x0, 0x0, 0x0, 0xa1, - 0x0, 0x0, 0x0, 0x16, 0x55, 0x55, 0xb6, 0x55, - 0x5c, 0x50, 0x0, 0x1, 0x0, 0xa3, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x30, 0xa1, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xa6, 0x55, 0xc4, 0x0, 0x0, - 0x4b, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x92, - 0x81, 0xa1, 0x0, 0x0, 0x0, 0x2, 0x90, 0xa, - 0xe6, 0x31, 0x11, 0x20, 0x8, 0x0, 0x0, 0x48, - 0xbd, 0xff, 0x60, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8D77 "起" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb0, 0x60, 0x65, 0x5b, 0x10, 0x2, 0x65, 0xc5, - 0x50, 0x0, 0xb, 0x0, 0x0, 0x0, 0xb0, 0x0, - 0x0, 0xb, 0x0, 0x6, 0x55, 0xc5, 0xa5, 0x95, - 0x5c, 0x0, 0x0, 0x0, 0xb2, 0x0, 0xb0, 0x4, - 0x0, 0x0, 0xc0, 0xb0, 0x0, 0xb0, 0x0, 0x10, - 0x0, 0xc0, 0xb5, 0xb2, 0xb0, 0x0, 0x50, 0x3, - 0xa0, 0xb0, 0x0, 0xb0, 0x0, 0xa0, 0x6, 0x75, - 0xb0, 0x0, 0x89, 0x9a, 0x90, 0x8, 0x3, 0xc7, - 0x42, 0x0, 0x0, 0x10, 0x23, 0x0, 0x3, 0x8b, - 0xde, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8D85 "超" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x30, 0x2, 0x22, 0x23, 0x40, 0x0, 0xa, - 0x4, 0x4, 0xc5, 0x38, 0x60, 0x4, 0x5c, 0x56, - 0x10, 0xd0, 0x8, 0x40, 0x0, 0xa, 0x0, 0x2, - 0xa0, 0xa, 0x20, 0x5, 0x5c, 0x5a, 0x3a, 0x11, - 0x9d, 0x0, 0x1, 0x8, 0x20, 0x63, 0x0, 0x3, - 0x0, 0x3, 0x78, 0x20, 0xc, 0x55, 0x5d, 0x30, - 0x5, 0x68, 0x68, 0x5c, 0x0, 0xb, 0x0, 0x6, - 0x48, 0x20, 0xc, 0x0, 0xb, 0x0, 0x8, 0x5a, - 0x20, 0xc, 0x55, 0x5d, 0x0, 0x8, 0x6, 0x84, - 0x15, 0x0, 0x1, 0x0, 0x31, 0x0, 0x5, 0x9b, - 0xcd, 0xde, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8D8A "越" */ - 0x0, 0x2, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0xb, 0x10, 0x0, 0xd, 0x33, 0x0, 0x1, 0x1b, - 0x17, 0x10, 0xb, 0xc, 0x0, 0x4, 0x3c, 0x33, - 0x17, 0x5d, 0x58, 0xa0, 0x0, 0xb, 0x0, 0xb, - 0xb, 0x0, 0x0, 0x36, 0x5b, 0x58, 0x6b, 0xb, - 0xa, 0x30, 0x1, 0x7, 0x40, 0xb, 0xa, 0x1c, - 0x0, 0x4, 0xa7, 0x31, 0x1b, 0x7, 0xb4, 0x0, - 0x6, 0x67, 0x76, 0x4c, 0x64, 0xd0, 0x50, 0x8, - 0x47, 0x30, 0x1c, 0x1a, 0x96, 0x80, 0xa, 0x6a, - 0x30, 0x1, 0x81, 0x9, 0xc0, 0x8, 0x7, 0xa4, - 0x14, 0x0, 0x0, 0x30, 0x41, 0x0, 0x17, 0xbc, - 0xcc, 0xdd, 0xa1, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x11, 0x0, - - /* U+8DA3 "趣" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xa, - 0x16, 0xa5, 0xa7, 0x20, 0x0, 0x4, 0x5c, 0x73, - 0xa0, 0xa2, 0x65, 0xb0, 0x0, 0xa, 0x0, 0xa5, - 0xc0, 0x2, 0x80, 0x15, 0x5c, 0x5a, 0xa0, 0xa1, - 0x45, 0x50, 0x1, 0x9, 0x10, 0xa0, 0xa0, 0x5b, - 0x10, 0x5, 0x4a, 0x0, 0xa5, 0xc0, 0xd, 0x0, - 0x8, 0x4a, 0x67, 0xa0, 0xa3, 0x68, 0x70, 0x9, - 0x1a, 0x4, 0xc7, 0xc2, 0x60, 0xb0, 0x9, 0x6b, - 0x3, 0x10, 0xa3, 0x0, 0x10, 0x7, 0x9, 0x72, - 0x0, 0x60, 0x0, 0x0, 0x31, 0x0, 0x27, 0xbc, - 0xcd, 0xde, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8DB3 "足" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x9, 0x55, 0x55, 0x55, 0xd0, 0x0, 0x0, 0xa, - 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0xa, 0x0, - 0x0, 0x0, 0xa0, 0x0, 0x0, 0xa, 0x0, 0x0, - 0x0, 0xa0, 0x0, 0x0, 0xa, 0x55, 0xc5, 0x55, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x10, 0xc0, 0x0, 0x34, 0x0, - 0x0, 0x2d, 0x0, 0xc5, 0x55, 0x55, 0x0, 0x0, - 0x7a, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc1, - 0x70, 0xc0, 0x0, 0x0, 0x0, 0x5, 0x40, 0x19, - 0xe3, 0x21, 0x1, 0x21, 0x16, 0x0, 0x0, 0x49, - 0xce, 0xef, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8DDF "跟" */ - 0x4, 0x55, 0x59, 0x7, 0x55, 0x59, 0x0, 0x7, - 0x40, 0xb, 0xb, 0x0, 0xc, 0x0, 0x7, 0x40, - 0xa, 0xb, 0x0, 0xb, 0x0, 0x7, 0x40, 0xa, - 0xd, 0x55, 0x5b, 0x0, 0x7, 0x7b, 0x57, 0xb, - 0x0, 0xb, 0x0, 0x1, 0xa, 0x0, 0xc, 0x65, - 0x5b, 0x0, 0xa, 0x2b, 0x59, 0x1b, 0x41, 0x6, - 0x40, 0xa, 0xa, 0x0, 0xb, 0x16, 0x59, 0x20, - 0xa, 0xa, 0x0, 0xb, 0x9, 0x40, 0x0, 0xa, - 0xb, 0x55, 0x1b, 0x3, 0xb1, 0x0, 0x4d, 0xb7, - 0x10, 0xd, 0x80, 0x3d, 0x91, 0x35, 0x0, 0x0, - 0x8, 0x0, 0x1, 0x30, - - /* U+8DEF "路" */ - 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x3, - 0x22, 0x25, 0x6, 0xa0, 0x0, 0x0, 0x8, 0x53, - 0x4a, 0xa, 0x65, 0x5c, 0x0, 0x8, 0x20, 0x19, - 0x1b, 0x0, 0x66, 0x0, 0x9, 0x20, 0x19, 0x61, - 0x71, 0xa0, 0x0, 0x8, 0x6b, 0x66, 0x50, 0x4e, - 0x20, 0x0, 0x0, 0xa, 0x0, 0x0, 0xa9, 0xb2, - 0x0, 0xa, 0x2b, 0x68, 0x9, 0x30, 0x3d, 0xb1, - 0xa, 0xa, 0x3, 0x6c, 0x55, 0x5c, 0x20, 0xa, - 0xa, 0x0, 0xb, 0x0, 0xb, 0x0, 0xa, 0xc, - 0x64, 0xb, 0x0, 0xb, 0x0, 0x3d, 0x94, 0x0, - 0xc, 0x55, 0x5b, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8EAB "身" */ - 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, 0xa, 0x58, - 0x55, 0x5d, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0xd, 0x55, 0x55, 0x5c, 0x3, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc5, 0xc0, 0x0, - 0xd, 0x55, 0x55, 0x5e, 0xb0, 0x0, 0x0, 0xc0, - 0x0, 0x4, 0xe1, 0x0, 0x36, 0x57, 0x55, 0x58, - 0xbc, 0x0, 0x0, 0x0, 0x0, 0x6, 0x90, 0xc0, - 0x0, 0x0, 0x0, 0x19, 0x50, 0xc, 0x0, 0x0, - 0x0, 0x67, 0x10, 0x0, 0xc0, 0x0, 0x24, 0x50, - 0x0, 0x5, 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, - - /* U+8ECA "車" */ - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xc0, 0x0, 0x0, 0x0, 0x2, - 0x65, 0x55, 0x5c, 0x55, 0x56, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0xa0, 0x0, 0x20, 0x0, 0x0, 0x1b, - 0x55, 0x5c, 0x55, 0x5e, 0x10, 0x0, 0x1, 0x90, - 0x0, 0xa0, 0x0, 0xb0, 0x0, 0x0, 0x1b, 0x55, - 0x5c, 0x55, 0x5b, 0x0, 0x0, 0x1, 0x90, 0x0, - 0xa0, 0x0, 0xb0, 0x0, 0x0, 0x1b, 0x55, 0x5c, - 0x55, 0x5c, 0x0, 0x0, 0x0, 0x10, 0x0, 0xa0, - 0x0, 0x2, 0x20, 0x6, 0x55, 0x55, 0x5c, 0x55, - 0x55, 0x88, 0x0, 0x0, 0x0, 0x0, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, - - /* U+8EDF "軟" */ - 0x0, 0x3, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0xb, 0x20, 0x0, 0xc3, 0x0, 0x0, 0x6, 0x5c, - 0x59, 0x50, 0xb0, 0x0, 0x0, 0x0, 0xa, 0x0, - 0x5, 0x95, 0x57, 0x90, 0xa, 0x5c, 0x5c, 0x29, - 0x45, 0x7, 0x30, 0xb, 0xa, 0xa, 0x33, 0x48, - 0x2, 0x0, 0xb, 0x5c, 0x5b, 0x10, 0x5a, 0x0, - 0x0, 0xb, 0xa, 0xa, 0x0, 0x7a, 0x0, 0x0, - 0xb, 0x5c, 0x5b, 0x0, 0xa6, 0x20, 0x0, 0x2, - 0xa, 0x1, 0x41, 0xb1, 0x90, 0x0, 0x36, 0x5c, - 0x55, 0x58, 0x30, 0xa3, 0x0, 0x0, 0xa, 0x0, - 0x55, 0x0, 0x2d, 0x30, 0x0, 0xb, 0x4, 0x40, - 0x0, 0x4, 0xa1, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8EE2 "転" */ - 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0x5c, - 0x5a, 0x45, 0x65, 0x5b, 0x10, 0x0, 0xa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0x5c, 0x5c, 0x10, - 0x0, 0x0, 0x0, 0xb, 0xa, 0xa, 0x0, 0x0, - 0x0, 0x40, 0xb, 0x5c, 0x5b, 0x46, 0x59, 0x56, - 0x70, 0xb, 0xa, 0xa, 0x0, 0x4a, 0x0, 0x0, - 0xb, 0x5c, 0x5b, 0x0, 0xa1, 0x0, 0x0, 0x2, - 0xa, 0x4, 0x12, 0x70, 0x31, 0x0, 0x36, 0x5c, - 0x55, 0x38, 0x0, 0xa, 0x20, 0x0, 0xa, 0x0, - 0x7b, 0x97, 0x67, 0xa0, 0x0, 0xb, 0x0, 0x23, - 0x0, 0x0, 0x50, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8EFD "軽" */ - 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x10, 0x36, 0x55, 0x5b, 0x40, 0x6, 0x5c, - 0x5a, 0x24, 0x0, 0x2a, 0x0, 0x0, 0xa, 0x0, - 0x0, 0x70, 0xa1, 0x0, 0xa, 0x5c, 0x5d, 0x10, - 0x5b, 0x30, 0x0, 0xb, 0xa, 0xa, 0x0, 0x89, - 0x91, 0x0, 0xb, 0x5c, 0x5b, 0x27, 0x22, 0x4d, - 0xa1, 0xb, 0xa, 0xb, 0x30, 0xd, 0x10, 0x10, - 0xb, 0x5c, 0x5b, 0x0, 0xb, 0x5, 0x20, 0x3, - 0xa, 0x2, 0x46, 0x5c, 0x55, 0x30, 0x26, 0x5c, - 0x55, 0x40, 0xb, 0x0, 0x0, 0x0, 0xa, 0x0, - 0x0, 0xb, 0x0, 0x30, 0x0, 0xb, 0x1, 0x65, - 0x57, 0x56, 0x81, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8F03 "較" */ - 0x0, 0x4, 0x10, 0x0, 0x11, 0x0, 0x0, 0x0, - 0xb, 0x10, 0x0, 0xb, 0x30, 0x0, 0x6, 0x5c, - 0x5b, 0x20, 0x3, 0x20, 0x30, 0x0, 0xa, 0x0, - 0x26, 0x75, 0x56, 0x70, 0xa, 0x5c, 0x5c, 0x20, - 0xc3, 0x26, 0x0, 0xb, 0xa, 0xa, 0x6, 0x50, - 0x3, 0xc0, 0xb, 0x5c, 0x5b, 0x37, 0x20, 0x26, - 0x62, 0xb, 0xa, 0xa, 0x40, 0x60, 0x69, 0x0, - 0xb, 0x5c, 0x5b, 0x0, 0x71, 0xb1, 0x0, 0x2, - 0xa, 0x3, 0x20, 0x1c, 0x80, 0x0, 0x26, 0x5c, - 0x56, 0x40, 0x2c, 0x80, 0x0, 0x0, 0xa, 0x0, - 0x4, 0x80, 0x8b, 0x30, 0x0, 0xb, 0x1, 0x64, - 0x0, 0x5, 0xa2, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8F09 "載" */ - 0x0, 0x0, 0x41, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x0, 0xa1, 0x51, 0xd, 0x73, 0x0, 0x0, 0x65, - 0xc5, 0x53, 0xb, 0x19, 0x0, 0x6, 0x55, 0xb5, - 0x55, 0x5c, 0x55, 0xb3, 0x0, 0x0, 0x92, 0x21, - 0xb, 0x0, 0x0, 0x2, 0x65, 0xc5, 0x66, 0xb, - 0x2, 0x30, 0x0, 0x95, 0xc5, 0xa5, 0xb, 0x7, - 0x70, 0x0, 0xb0, 0xa0, 0x91, 0xb, 0xb, 0x0, - 0x0, 0xc5, 0xc5, 0xb1, 0x9, 0x68, 0x0, 0x0, - 0xd5, 0xc5, 0xb1, 0x5, 0xe1, 0x0, 0x0, 0x20, - 0xa0, 0x26, 0x9, 0xd0, 0x3, 0x5, 0x55, 0xc5, - 0x55, 0xa6, 0x59, 0x15, 0x0, 0x0, 0xa0, 0x38, - 0x20, 0x7, 0xd5, 0x0, 0x0, 0x40, 0x20, 0x0, - 0x0, 0x34, - - /* U+8F15 "輕" */ - 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x10, 0x12, 0x22, 0x25, 0x60, 0x16, 0x5c, - 0x5a, 0x36, 0x45, 0x45, 0x40, 0x0, 0xa, 0x0, - 0x9, 0x3a, 0x3a, 0x30, 0xa, 0x5c, 0x5c, 0x37, - 0x34, 0x25, 0x0, 0xb, 0xa, 0xa, 0x35, 0x36, - 0x18, 0x0, 0xb, 0x5c, 0x5b, 0xa, 0x3a, 0x37, - 0x60, 0xb, 0xa, 0xa, 0x3, 0x43, 0x12, 0x20, - 0xb, 0x5c, 0x5b, 0x6, 0x58, 0x59, 0x50, 0x3, - 0xa, 0x1, 0x30, 0xb, 0x0, 0x0, 0x36, 0x5c, - 0x55, 0x50, 0xb, 0x0, 0x0, 0x0, 0xa, 0x0, - 0x0, 0xb, 0x0, 0x0, 0x0, 0xb, 0x0, 0x55, - 0x5c, 0x55, 0xd2, 0x0, 0x8, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+8F2A "輪" */ - 0x0, 0x5, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, - 0xb, 0x0, 0x0, 0x2d, 0x0, 0x0, 0x6, 0x5c, - 0x5a, 0x0, 0x95, 0x50, 0x0, 0x0, 0xa, 0x0, - 0x2, 0xa0, 0x84, 0x0, 0xb, 0x5c, 0x5d, 0x19, - 0x0, 0x3d, 0xa2, 0xb, 0xa, 0xb, 0x62, 0x65, - 0x53, 0x40, 0xb, 0x4c, 0x4a, 0x45, 0x55, 0x55, - 0x80, 0xb, 0xa, 0xa, 0x64, 0x90, 0x90, 0xa0, - 0xb, 0x5c, 0x5a, 0x64, 0x90, 0x90, 0xa0, 0x2, - 0xa, 0x5, 0x68, 0xb5, 0xb5, 0xa0, 0x26, 0x5c, - 0x55, 0x74, 0x90, 0x90, 0xa0, 0x0, 0xa, 0x0, - 0x64, 0x90, 0x90, 0xa0, 0x0, 0xb, 0x0, 0x64, - 0x60, 0x67, 0x90, 0x0, 0x4, 0x0, 0x10, 0x0, - 0x1, 0x0, - - /* U+8F38 "輸" */ - 0x0, 0x1, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, - 0xc, 0x10, 0x0, 0x6c, 0x0, 0x0, 0x6, 0x5c, - 0x5a, 0x0, 0xd4, 0x40, 0x0, 0x0, 0xa, 0x0, - 0x6, 0x80, 0x84, 0x0, 0x9, 0x5c, 0x5c, 0x39, - 0x65, 0x8c, 0xa2, 0xb, 0xa, 0xb, 0x60, 0x1, - 0x4, 0x50, 0xb, 0x5c, 0x5a, 0x68, 0x69, 0x39, - 0x20, 0xb, 0xa, 0xa, 0x65, 0x29, 0xa8, 0x10, - 0xc, 0x5c, 0x5a, 0x68, 0x59, 0x98, 0x10, 0x2, - 0xa, 0x6, 0x67, 0x49, 0x98, 0x10, 0x26, 0x5c, - 0x55, 0x76, 0x39, 0xa8, 0x10, 0x0, 0xa, 0x0, - 0x65, 0x18, 0x18, 0x10, 0x0, 0xc, 0x0, 0x66, - 0xa7, 0x6d, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8F9B "辛" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb3, 0x0, 0x71, 0x0, 0x6, 0x57, 0x55, 0x58, - 0x65, 0x30, 0x0, 0x0, 0x75, 0x0, 0xa6, 0x0, - 0x0, 0x0, 0x2, 0xd0, 0x9, 0x0, 0x0, 0x6, - 0x55, 0x57, 0x68, 0x65, 0x5c, 0x60, 0x0, 0x0, - 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, - 0x0, 0x30, 0x0, 0x6, 0x55, 0x5c, 0x75, 0x5b, - 0x30, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, - - /* U+8F9E "辞" */ - 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, - 0x0, 0x6c, 0x0, 0x1b, 0x0, 0x0, 0x3, 0x6a, - 0x93, 0x36, 0x57, 0x56, 0x90, 0x0, 0x4, 0x70, - 0x2, 0x0, 0x15, 0x0, 0x0, 0x4, 0x72, 0x46, - 0x50, 0x5b, 0x0, 0x5, 0x57, 0x95, 0x41, 0xa0, - 0x91, 0x0, 0x0, 0x4, 0x70, 0x45, 0x45, 0x84, - 0x92, 0x1, 0x77, 0x98, 0x20, 0xb, 0x0, 0x0, - 0x1, 0xb0, 0xb, 0x0, 0xb, 0x0, 0x0, 0x1, - 0xb0, 0xb, 0x26, 0x5c, 0x57, 0x70, 0x1, 0xb0, - 0xb, 0x0, 0xb, 0x0, 0x0, 0x1, 0xc5, 0x5c, - 0x0, 0xb, 0x0, 0x0, 0x1, 0x80, 0x3, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x0, 0x0, - - /* U+8FA6 "辦" */ - 0x0, 0x0, 0x0, 0x10, 0x2, 0x0, 0x0, 0x0, - 0xa1, 0x0, 0xc0, 0x1, 0xc0, 0x0, 0x3, 0x97, - 0x40, 0xa0, 0x13, 0x75, 0x40, 0x4, 0x26, 0x35, - 0xc9, 0x53, 0x25, 0x20, 0x7, 0x2a, 0x20, 0xa7, - 0x29, 0xb, 0x20, 0x3, 0x57, 0x11, 0x97, 0x17, - 0x37, 0x0, 0x36, 0xa6, 0x83, 0x78, 0x55, 0x96, - 0xa0, 0x0, 0xa0, 0x5, 0x49, 0x0, 0xa0, 0x0, - 0x3, 0xb6, 0x49, 0xa, 0x0, 0xa1, 0x20, 0x3, - 0xa1, 0x29, 0xa, 0x26, 0xc6, 0x50, 0x0, 0x90, - 0x81, 0xa, 0x0, 0xa0, 0x0, 0x6, 0x34, 0x43, - 0xb7, 0x0, 0xa0, 0x0, 0x25, 0x24, 0x0, 0x20, - 0x0, 0xb0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x30, 0x0, - - /* U+8FB2 "農" */ - 0x0, 0x0, 0x16, 0x0, 0x60, 0x0, 0x0, 0x5, - 0x56, 0xc5, 0x5d, 0x58, 0x20, 0x0, 0x92, 0x1a, - 0x0, 0xb0, 0xa1, 0x0, 0x9, 0x66, 0xc5, 0x5c, - 0x5c, 0x0, 0x0, 0x92, 0x1a, 0x0, 0xb0, 0xa1, - 0x0, 0x7, 0x55, 0x65, 0x56, 0x59, 0x10, 0x0, - 0x85, 0x55, 0x55, 0x55, 0x87, 0x0, 0x9, 0x33, - 0x33, 0x33, 0x62, 0x0, 0x0, 0x93, 0x21, 0x11, - 0x11, 0x15, 0x0, 0xb, 0x5b, 0x57, 0x65, 0x58, - 0x61, 0x0, 0xb0, 0xa0, 0x7, 0x18, 0x70, 0x0, - 0x55, 0xa, 0x1, 0x3a, 0xa0, 0x0, 0x17, 0x0, - 0xda, 0x60, 0x6, 0xdb, 0x52, 0x0, 0x2, 0x0, - 0x0, 0x0, 0x30, - - /* U+8FBA "辺" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x86, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1e, - 0x6, 0x57, 0x75, 0x5c, 0x60, 0x0, 0x0, 0x0, - 0x8, 0x30, 0xa, 0x10, 0x0, 0x6, 0x0, 0xa, - 0x10, 0xa, 0x0, 0x6, 0x5d, 0x0, 0xc, 0x0, - 0xb, 0x0, 0x0, 0xa, 0x0, 0x1a, 0x0, 0xb, - 0x0, 0x0, 0xa, 0x0, 0x74, 0x0, 0xc, 0x0, - 0x0, 0xa, 0x0, 0xa0, 0x0, 0xb, 0x0, 0x0, - 0xa, 0x7, 0x20, 0x0, 0x58, 0x0, 0x0, 0x7c, - 0x32, 0x0, 0x19, 0xe2, 0x0, 0x1d, 0x51, 0xa4, - 0x0, 0x0, 0x10, 0x0, 0x2, 0x0, 0x6, 0xbc, - 0xdd, 0xde, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8FBC "込" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x92, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x3d, - 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, 0x4, 0x0, - 0x0, 0x60, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x6, 0x5e, 0x10, 0x5, 0x94, - 0x0, 0x0, 0x0, 0xb, 0x0, 0xb, 0x9, 0x0, - 0x0, 0x0, 0xb, 0x0, 0x55, 0x7, 0x30, 0x0, - 0x0, 0xb, 0x1, 0x80, 0x0, 0xc1, 0x0, 0x0, - 0xb, 0x17, 0x0, 0x0, 0x5c, 0x20, 0x0, 0x6c, - 0x40, 0x0, 0x0, 0x8, 0xb1, 0xc, 0x61, 0x94, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x5, 0xbc, - 0xcc, 0xdd, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8FCE "迎" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x70, 0x0, 0x7, 0xb1, 0x0, 0x0, 0x0, 0x78, - 0xa, 0x41, 0x8, 0x55, 0xa0, 0x0, 0x13, 0xb, - 0x0, 0xb, 0x0, 0xb0, 0x0, 0x0, 0xb, 0x0, - 0xb, 0x0, 0xb0, 0x6, 0x6c, 0xb, 0x0, 0xb, - 0x0, 0xb0, 0x0, 0xa, 0xb, 0x0, 0xb, 0x0, - 0xb0, 0x0, 0xa, 0xb, 0x4, 0x2b, 0x0, 0xb0, - 0x0, 0xa, 0xc, 0xb3, 0xb, 0x26, 0xa0, 0x0, - 0xa, 0x5, 0x10, 0xb, 0x5, 0x30, 0x1, 0x89, - 0x20, 0x0, 0xb, 0x0, 0x0, 0x1d, 0x20, 0x68, - 0x42, 0x14, 0x11, 0x23, 0x0, 0x0, 0x1, 0x69, - 0xbc, 0xcd, 0xc1, - - /* U+8FD1 "近" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x70, 0x0, 0x10, 0x14, 0x8d, 0x20, 0x0, 0x59, - 0x0, 0xb5, 0x53, 0x10, 0x0, 0x0, 0x2, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0xb0, - 0x0, 0x0, 0x40, 0x7, 0x6d, 0x0, 0xb5, 0x55, - 0xb5, 0x62, 0x0, 0xa, 0x0, 0xb0, 0x0, 0xb0, - 0x0, 0x0, 0xa, 0x0, 0xa0, 0x0, 0xb0, 0x0, - 0x0, 0xa, 0x4, 0x60, 0x0, 0xb0, 0x0, 0x0, - 0xa, 0x8, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x3b, - 0x21, 0x0, 0x0, 0xc0, 0x0, 0x6, 0x80, 0x74, - 0x0, 0x0, 0x40, 0x0, 0x9, 0x0, 0x5, 0xbc, - 0xdd, 0xdd, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8FD4 "返" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x62, 0x1, 0x1, 0x37, 0xca, 0x0, 0x0, 0x1d, - 0x3, 0xb4, 0x31, 0x0, 0x0, 0x0, 0x5, 0x3, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb5, - 0x55, 0x69, 0x0, 0x7, 0x5c, 0x4, 0x80, 0x0, - 0x67, 0x0, 0x0, 0xb, 0x5, 0x74, 0x0, 0xc0, - 0x0, 0x0, 0xb, 0x6, 0x30, 0x89, 0x60, 0x0, - 0x0, 0xb, 0x9, 0x0, 0x2c, 0xb1, 0x0, 0x0, - 0xb, 0x26, 0x2, 0xa1, 0x3d, 0x10, 0x0, 0xb, - 0x40, 0x47, 0x0, 0x5, 0x30, 0x4, 0x83, 0x75, - 0x10, 0x0, 0x0, 0x0, 0x9, 0x0, 0x6, 0xbc, - 0xdd, 0xde, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8FEB "迫" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x40, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x87, - 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x2b, 0x0, - 0xa7, 0x65, 0x5d, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x1b, 0x0, 0x5, 0x5a, 0x0, 0xc0, 0x0, - 0x1b, 0x0, 0x1, 0xc, 0x0, 0xd5, 0x55, 0x5b, - 0x0, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x1b, 0x0, - 0x0, 0xc, 0x0, 0xc0, 0x0, 0x1b, 0x0, 0x0, - 0xc, 0x0, 0xd5, 0x55, 0x5b, 0x0, 0x0, 0x7d, - 0x10, 0xc0, 0x0, 0x9, 0x0, 0xc, 0x60, 0x86, - 0x31, 0x0, 0x1, 0x22, 0x3, 0x0, 0x3, 0x8b, - 0xcd, 0xee, 0xc1, - - /* U+8FFD "追" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x60, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x79, - 0x0, 0x75, 0x95, 0x59, 0x0, 0x0, 0x17, 0x0, - 0xb0, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, 0xb0, - 0x0, 0x1a, 0x0, 0x6, 0x5b, 0x0, 0xc5, 0x55, - 0x6a, 0x0, 0x0, 0xb, 0x0, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x0, 0xc5, 0x55, 0x5b, 0x50, - 0x0, 0xb, 0x0, 0xb0, 0x0, 0x9, 0x20, 0x0, - 0xb, 0x0, 0xb0, 0x0, 0x9, 0x20, 0x0, 0x6c, - 0x10, 0xd5, 0x55, 0x5b, 0x20, 0xb, 0x60, 0x85, - 0x40, 0x0, 0x1, 0x0, 0x4, 0x0, 0x5, 0xac, - 0xcc, 0xdd, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x11, 0x10, - - /* U+9000 "退" */ - 0x0, 0x60, 0x0, 0x20, 0x0, 0x5, 0x0, 0x0, - 0x6a, 0x0, 0xd5, 0x55, 0x5d, 0x0, 0x0, 0x6, - 0x0, 0xc0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, - 0xd5, 0x55, 0x5c, 0x0, 0x5, 0x5b, 0x0, 0xc0, - 0x0, 0xc, 0x0, 0x0, 0xc, 0x0, 0xd5, 0x55, - 0x58, 0x30, 0x0, 0xc, 0x0, 0xc1, 0x40, 0x2a, - 0x40, 0x0, 0xc, 0x0, 0xc0, 0x18, 0xa0, 0x0, - 0x0, 0xc, 0x0, 0xc2, 0x62, 0x5d, 0x30, 0x0, - 0x6b, 0x21, 0xf7, 0x0, 0x4, 0x80, 0xc, 0x40, - 0x67, 0x50, 0x0, 0x0, 0x12, 0x1, 0x0, 0x3, - 0x9b, 0xde, 0xef, 0xe2, - - /* U+9001 "送" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x70, 0x0, 0x81, 0x1, 0xd0, 0x0, 0x0, 0x88, - 0x0, 0x4a, 0x7, 0x30, 0x0, 0x0, 0x13, 0x3, - 0x57, 0x59, 0x5b, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x7, 0x6b, 0x0, 0x0, 0xc0, - 0x0, 0x40, 0x0, 0x19, 0x26, 0x55, 0xd5, 0x56, - 0x80, 0x0, 0x19, 0x0, 0x2, 0xb0, 0x0, 0x0, - 0x0, 0x19, 0x0, 0x9, 0x69, 0x40, 0x0, 0x0, - 0x19, 0x0, 0x48, 0x0, 0xa9, 0x0, 0x0, 0x5c, - 0x4, 0x60, 0x0, 0xc, 0x0, 0xa, 0x61, 0xa6, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x7, 0xbb, - 0xcc, 0xde, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9003 "逃" */ - 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, - 0x60, 0x0, 0xb, 0x2c, 0x20, 0x0, 0x0, 0x59, - 0x11, 0xb, 0xb, 0x5, 0x40, 0x0, 0x6, 0xb, - 0xb, 0xb, 0x39, 0x10, 0x0, 0x0, 0x8, 0x2b, - 0xb, 0x40, 0x0, 0x6, 0x5c, 0x0, 0xb, 0xb, - 0x10, 0x0, 0x0, 0xa, 0x1, 0x7d, 0xb, 0x6b, - 0x10, 0x0, 0xa, 0x5a, 0xc, 0xb, 0x5, 0x60, - 0x0, 0xa, 0x0, 0x38, 0xb, 0x0, 0x50, 0x0, - 0xa, 0x0, 0x91, 0xb, 0x20, 0xa1, 0x0, 0x6b, - 0x15, 0x10, 0x4, 0x99, 0x80, 0xb, 0x60, 0x84, - 0x0, 0x0, 0x0, 0x11, 0x3, 0x0, 0x5, 0xac, - 0xde, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+900F "透" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x1, - 0x30, 0x0, 0x14, 0x79, 0xb4, 0x0, 0x0, 0xa4, - 0x1, 0x31, 0xa0, 0x0, 0x20, 0x0, 0x32, 0x36, - 0x58, 0xd6, 0x56, 0xa0, 0x0, 0x0, 0x0, 0x2a, - 0xa4, 0x50, 0x0, 0x4, 0x59, 0x3, 0x70, 0xa0, - 0x5b, 0x61, 0x2, 0x1a, 0x46, 0x67, 0x85, 0x92, - 0x60, 0x0, 0xa, 0x0, 0xb, 0x4, 0x72, 0x0, - 0x0, 0xa, 0x0, 0x19, 0x6, 0x5d, 0x0, 0x0, - 0xa, 0x0, 0x72, 0x0, 0x1a, 0x0, 0x0, 0x3b, - 0x3, 0x50, 0x16, 0x96, 0x0, 0x9, 0x71, 0x84, - 0x0, 0x3, 0x80, 0x0, 0x6, 0x0, 0x7, 0xab, - 0xcc, 0xcd, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+9010 "逐" */ - 0x0, 0x82, 0x0, 0x0, 0x0, 0x2, 0x60, 0x0, - 0x3c, 0x6, 0x55, 0xd5, 0x55, 0x50, 0x0, 0x3, - 0x0, 0x9, 0x40, 0x4, 0x10, 0x0, 0x0, 0x1, - 0x71, 0x90, 0x3a, 0x20, 0x6, 0x5c, 0x3, 0x5, - 0xaa, 0x50, 0x0, 0x0, 0xb, 0x0, 0x65, 0xc, - 0x0, 0x0, 0x0, 0xb, 0x15, 0x20, 0xad, 0x76, - 0x0, 0x0, 0xb, 0x0, 0x9, 0x4a, 0x19, 0x80, - 0x0, 0xb, 0x3, 0x81, 0xc, 0x0, 0xb0, 0x0, - 0x4c, 0x23, 0x5, 0x7c, 0x0, 0x0, 0xa, 0x50, - 0x94, 0x0, 0x72, 0x0, 0x0, 0x4, 0x0, 0x6, - 0xbc, 0xcc, 0xcd, 0xa1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x0, - - /* U+9019 "這" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x92, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x3c, - 0x0, 0x0, 0x42, 0x4, 0x30, 0x0, 0x1, 0x6, - 0x55, 0x55, 0x55, 0x40, 0x0, 0x1, 0x0, 0x55, - 0x55, 0x79, 0x0, 0x6, 0x7d, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x19, 0x0, 0x65, 0x55, 0x77, - 0x0, 0x0, 0x19, 0x0, 0x20, 0x0, 0x3, 0x0, - 0x0, 0x19, 0x0, 0xd5, 0x55, 0x5d, 0x0, 0x0, - 0x19, 0x0, 0xb0, 0x0, 0xb, 0x0, 0x1, 0xab, - 0x20, 0xc5, 0x55, 0x5b, 0x0, 0x1d, 0x30, 0x86, - 0x70, 0x0, 0x3, 0x1, 0x2, 0x0, 0x3, 0x9b, - 0xcd, 0xde, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+901A "通" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x60, 0x3, 0x65, 0x55, 0x7e, 0x20, 0x0, 0x87, - 0x0, 0x5, 0x54, 0x60, 0x0, 0x0, 0x23, 0x4, - 0x0, 0xc4, 0x0, 0x40, 0x0, 0x0, 0xc, 0x55, - 0xc5, 0x56, 0xa0, 0x5, 0x4b, 0xb, 0x55, 0xc5, - 0x56, 0x90, 0x0, 0xa, 0xb, 0x0, 0xb0, 0x2, - 0x90, 0x0, 0xa, 0xb, 0x55, 0xc5, 0x56, 0x90, - 0x0, 0xa, 0xb, 0x0, 0xb0, 0x2, 0x90, 0x0, - 0xa, 0xb, 0x0, 0xb0, 0x2, 0x90, 0x0, 0x3c, - 0xb, 0x0, 0xa0, 0x4a, 0x80, 0x8, 0x80, 0x75, - 0x0, 0x0, 0x5, 0x10, 0x6, 0x0, 0x5, 0xac, - 0xdd, 0xde, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x11, 0x10, - - /* U+901F "速" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x2, - 0x10, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0xc2, - 0x35, 0x55, 0xd5, 0x57, 0x90, 0x0, 0x63, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x55, - 0xc5, 0x5c, 0x0, 0x3, 0x38, 0x9, 0x10, 0xb0, - 0xb, 0x0, 0x3, 0x1b, 0x9, 0x65, 0xc5, 0x5b, - 0x0, 0x0, 0xb, 0x6, 0x6, 0xf0, 0x5, 0x0, - 0x0, 0xb, 0x0, 0x39, 0xb6, 0x71, 0x0, 0x0, - 0xb, 0x2, 0x80, 0xb0, 0x3d, 0x30, 0x0, 0x4b, - 0x33, 0x0, 0xc0, 0x2, 0x40, 0xa, 0x60, 0x84, - 0x0, 0x90, 0x0, 0x0, 0x4, 0x0, 0x5, 0xab, - 0xcd, 0xde, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9020 "造" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, - 0x50, 0x0, 0x30, 0xb2, 0x0, 0x0, 0x0, 0xa6, - 0x0, 0xd2, 0xb0, 0x3, 0x0, 0x0, 0x33, 0x3, - 0xa5, 0xc5, 0x69, 0x10, 0x0, 0x0, 0x7, 0x0, - 0xb0, 0x0, 0x0, 0x6, 0x6b, 0x26, 0x55, 0xc5, - 0x55, 0xc2, 0x0, 0x19, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x19, 0x0, 0xa5, 0x55, 0x5d, 0x0, - 0x0, 0x19, 0x0, 0xb0, 0x0, 0xb, 0x0, 0x0, - 0x19, 0x0, 0xb0, 0x0, 0xb, 0x0, 0x1, 0x8b, - 0x0, 0xc5, 0x55, 0x5b, 0x0, 0x1d, 0x40, 0x95, - 0x50, 0x0, 0x1, 0x0, 0x3, 0x0, 0x6, 0xbc, - 0xcd, 0xee, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9023 "連" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x93, 0x0, 0x0, 0xa2, 0x1, 0x0, 0x0, 0x2c, - 0x5, 0x55, 0xc5, 0x57, 0x50, 0x0, 0x1, 0x0, - 0x30, 0xa0, 0x5, 0x0, 0x0, 0x1, 0x0, 0xc5, - 0xc5, 0x5c, 0x10, 0x16, 0x5e, 0x10, 0xc5, 0xc5, - 0x5b, 0x0, 0x0, 0xb, 0x0, 0xb0, 0xa0, 0xa, - 0x0, 0x0, 0xb, 0x0, 0xc5, 0xc5, 0x5b, 0x0, - 0x0, 0xb, 0x0, 0x10, 0xa0, 0x0, 0x30, 0x0, - 0xb, 0x46, 0x55, 0xc5, 0x55, 0x71, 0x2, 0xaa, - 0x20, 0x0, 0xa0, 0x0, 0x0, 0xd, 0x20, 0x78, - 0x31, 0x70, 0x0, 0x22, 0x1, 0x0, 0x2, 0x7a, - 0xcc, 0xdd, 0xa1, - - /* U+902E "逮" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x71, 0x0, 0x0, 0xc1, 0x1, 0x0, 0x0, 0x2c, - 0x3, 0x65, 0xc5, 0x5d, 0x0, 0x0, 0x2, 0x0, - 0x0, 0xb0, 0xc, 0x40, 0x0, 0x0, 0x26, 0x55, - 0xc5, 0x5d, 0x52, 0x7, 0x6d, 0x2, 0x55, 0xc5, - 0x5c, 0x0, 0x0, 0xa, 0x4, 0x20, 0xb0, 0x4, - 0x0, 0x0, 0xa, 0x0, 0xb3, 0xb2, 0xa7, 0x0, - 0x0, 0xa, 0x0, 0x26, 0xd8, 0x0, 0x0, 0x0, - 0xa, 0x3a, 0x70, 0xb2, 0x98, 0x0, 0x0, 0x5a, - 0x13, 0x33, 0xc0, 0x7, 0x40, 0x9, 0x50, 0x83, - 0x8, 0x90, 0x0, 0x0, 0x4, 0x0, 0x6, 0xab, - 0xbc, 0xcd, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9031 "週" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x85, 0x8, 0x55, 0x65, 0x5b, 0x30, 0x0, 0xd, - 0xb, 0x0, 0xa2, 0xa, 0x0, 0x0, 0x0, 0xa, - 0x6, 0xc7, 0x4a, 0x0, 0x0, 0x5, 0xa, 0x0, - 0xa0, 0x3a, 0x0, 0x16, 0x5d, 0xa, 0x36, 0x65, - 0x7a, 0x0, 0x0, 0xa, 0x9, 0x8, 0x59, 0x4a, - 0x0, 0x0, 0xa, 0x9, 0xa, 0x8, 0x2a, 0x0, - 0x0, 0xa, 0x8, 0xc, 0x5a, 0x2a, 0x0, 0x0, - 0xa, 0x24, 0x7, 0x2, 0xa, 0x0, 0x0, 0x7b, - 0x50, 0x0, 0x2, 0x7c, 0x0, 0x1c, 0x30, 0x94, - 0x0, 0x0, 0x3, 0x0, 0x2, 0x0, 0x6, 0xbb, - 0xcc, 0xde, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9032 "進" */ - 0x0, 0x0, 0x0, 0x10, 0x10, 0x0, 0x0, 0x0, - 0x84, 0x0, 0xa7, 0x49, 0x0, 0x0, 0x0, 0x1e, - 0x0, 0xd0, 0x9, 0x2, 0x0, 0x0, 0x1, 0x5, - 0xc5, 0x59, 0x58, 0x40, 0x0, 0x4, 0xa, 0xa0, - 0xa, 0x1, 0x0, 0x6, 0x5d, 0x63, 0xc5, 0x5c, - 0x59, 0x10, 0x0, 0xb, 0x0, 0xa0, 0xa, 0x0, - 0x0, 0x0, 0xb, 0x0, 0xc5, 0x5c, 0x5b, 0x10, - 0x0, 0xb, 0x0, 0xa0, 0xa, 0x0, 0x0, 0x0, - 0xb, 0x0, 0xa0, 0xa, 0x5, 0x30, 0x1, 0x8b, - 0x10, 0xc5, 0x55, 0x55, 0x30, 0xd, 0x40, 0x96, - 0x20, 0x0, 0x0, 0x1, 0x3, 0x0, 0x5, 0xbc, - 0xcd, 0xef, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9045 "遅" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x84, 0x2, 0x95, 0x55, 0x55, 0xc0, 0x0, 0x1d, - 0x1, 0xa0, 0x0, 0x0, 0xb0, 0x0, 0x1, 0x0, - 0xc5, 0x55, 0x55, 0xb0, 0x0, 0x4, 0x0, 0xa2, - 0x70, 0x67, 0x0, 0x6, 0x5d, 0x11, 0xa5, 0xb5, - 0xb6, 0x90, 0x0, 0xb, 0x3, 0x71, 0xb, 0x1, - 0x0, 0x0, 0xb, 0x6, 0x36, 0x5c, 0x59, 0x40, - 0x0, 0xb, 0x8, 0x0, 0xb, 0x0, 0x51, 0x0, - 0xb, 0x33, 0x55, 0x5d, 0x55, 0x52, 0x0, 0x7c, - 0x40, 0x0, 0xc, 0x0, 0x0, 0xc, 0x50, 0x95, - 0x0, 0x8, 0x0, 0x0, 0x4, 0x0, 0x5, 0xab, - 0xbb, 0xcd, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+904A "遊" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x85, 0x0, 0x93, 0x0, 0xc1, 0x0, 0x0, 0x1c, - 0x0, 0x24, 0x5, 0x60, 0x41, 0x0, 0x0, 0x16, - 0x75, 0x9a, 0x55, 0x53, 0x0, 0x3, 0x1, 0x90, - 0x44, 0x55, 0xa1, 0x6, 0x6d, 0x2, 0xb6, 0xa0, - 0x5, 0x50, 0x0, 0x19, 0x4, 0x63, 0x70, 0x1a, - 0x10, 0x0, 0x19, 0x7, 0x24, 0x77, 0x5b, 0x75, - 0x0, 0x19, 0x9, 0x6, 0x40, 0x18, 0x0, 0x0, - 0x19, 0x43, 0x9, 0x10, 0x18, 0x0, 0x0, 0x7b, - 0x41, 0x9b, 0x3, 0x88, 0x0, 0x1d, 0x31, 0x82, - 0x0, 0x0, 0x41, 0x0, 0x2, 0x0, 0x6, 0xaa, - 0xbb, 0xcc, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x11, 0x0, - - /* U+904B "運" */ - 0x1, 0x80, 0x5, 0x65, 0x55, 0x56, 0x70, 0x0, - 0x6a, 0xc, 0x0, 0x72, 0x6, 0x30, 0x0, 0x5, - 0x6, 0x55, 0xc5, 0x59, 0x20, 0x0, 0x1, 0x0, - 0x30, 0xa0, 0x4, 0x0, 0x6, 0x6e, 0x10, 0xc5, - 0xc5, 0x5c, 0x0, 0x0, 0xa, 0x0, 0xc5, 0xc5, - 0x5b, 0x0, 0x0, 0xa, 0x0, 0xa0, 0xa0, 0xa, - 0x0, 0x0, 0xa, 0x0, 0xa5, 0xc5, 0x58, 0x0, - 0x0, 0xa, 0x26, 0x55, 0xc5, 0x55, 0xa0, 0x0, - 0x7c, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x1d, 0x51, - 0x93, 0x0, 0xa0, 0x0, 0x0, 0x2, 0x0, 0x6, - 0xbb, 0xcc, 0xcd, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+904E "過" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x94, 0x0, 0x75, 0x55, 0x69, 0x0, 0x0, 0x2d, - 0x0, 0x91, 0x3, 0x46, 0x0, 0x0, 0x1, 0x0, - 0x86, 0x89, 0x46, 0x0, 0x0, 0x3, 0x1, 0x81, - 0x46, 0x46, 0x20, 0x16, 0x6d, 0xb, 0x65, 0x56, - 0x56, 0xd0, 0x0, 0x19, 0xa, 0x7, 0x55, 0x90, - 0xa0, 0x0, 0x19, 0xa, 0xa, 0x0, 0xa0, 0xa0, - 0x0, 0x19, 0xa, 0xb, 0x55, 0xb0, 0xa0, 0x0, - 0x19, 0xb, 0x9, 0x0, 0x70, 0xa0, 0x0, 0x7a, - 0xa, 0x0, 0x0, 0x3a, 0x80, 0x1d, 0x41, 0x84, - 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x5, 0xac, - 0xcd, 0xdd, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9053 "道" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x20, 0x0, 0x0, - 0x84, 0x0, 0x67, 0x0, 0xc4, 0x0, 0x0, 0x2c, - 0x0, 0xa, 0x4, 0x40, 0x40, 0x0, 0x1, 0x16, - 0x55, 0xa6, 0x55, 0x82, 0x0, 0x4, 0x0, 0x75, - 0xa5, 0x59, 0x0, 0x7, 0x6d, 0x0, 0xc0, 0x0, - 0xc, 0x0, 0x0, 0xa, 0x0, 0xc5, 0x55, 0x5b, - 0x0, 0x0, 0xa, 0x0, 0xb0, 0x0, 0xb, 0x0, - 0x0, 0xa, 0x0, 0xc5, 0x55, 0x5b, 0x0, 0x0, - 0xa, 0x0, 0xb0, 0x0, 0xb, 0x0, 0x1, 0x88, - 0x20, 0xc5, 0x55, 0x5b, 0x0, 0xc, 0x20, 0x77, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8b, - 0xcc, 0xde, 0xd2, - - /* U+9054 "達" */ - 0x0, 0x20, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, - 0x76, 0x0, 0x0, 0xa3, 0x2, 0x0, 0x0, 0xd, - 0x2, 0x65, 0xb6, 0x67, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa1, 0x1, 0x70, 0x0, 0x3, 0x26, 0x88, - 0x55, 0xb5, 0x51, 0x16, 0x6c, 0x0, 0xc, 0x6, - 0x62, 0x20, 0x0, 0x19, 0x6, 0x55, 0xb6, 0x56, - 0x50, 0x0, 0x19, 0x1, 0x55, 0xb6, 0x69, 0x0, - 0x0, 0x19, 0x0, 0x10, 0xa1, 0x0, 0x10, 0x0, - 0x19, 0x17, 0x55, 0xb6, 0x56, 0x70, 0x2, 0xbb, - 0x10, 0x0, 0xa1, 0x0, 0x0, 0x1e, 0x20, 0xa6, - 0x10, 0x81, 0x0, 0x0, 0x1, 0x0, 0x5, 0xbd, - 0xde, 0xef, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9055 "違" */ - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x4, - 0x90, 0x0, 0xc, 0x10, 0x40, 0x0, 0x0, 0xb5, - 0x6, 0x8a, 0x55, 0xc0, 0x0, 0x0, 0x20, 0x22, - 0x77, 0x22, 0xb4, 0x70, 0x0, 0x20, 0x35, 0x22, - 0x22, 0x43, 0x20, 0x46, 0xc5, 0x9, 0x65, 0x55, - 0xb4, 0x0, 0x0, 0x92, 0x9, 0x65, 0x75, 0xb1, - 0x0, 0x0, 0x92, 0x2, 0x0, 0xa0, 0x34, 0x0, - 0x0, 0x92, 0x4a, 0x55, 0xc5, 0x54, 0x0, 0x0, - 0x92, 0x4c, 0x55, 0xc5, 0x57, 0x80, 0x5, 0xc6, - 0x11, 0x0, 0xb0, 0x0, 0x0, 0x8b, 0x5, 0x81, - 0x0, 0x90, 0x0, 0x0, 0x10, 0x0, 0x3a, 0xcb, - 0xbc, 0xde, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+9060 "遠" */ - 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, - 0x74, 0x0, 0x0, 0xb2, 0x2, 0x0, 0x0, 0xe, - 0x1, 0x75, 0xc5, 0x59, 0x10, 0x0, 0x3, 0x0, - 0x0, 0xb0, 0x0, 0x60, 0x0, 0x0, 0x26, 0x65, - 0x55, 0x57, 0x51, 0x16, 0x6c, 0x0, 0xc4, 0x44, - 0x4d, 0x0, 0x0, 0x19, 0x0, 0xc5, 0x55, 0x5b, - 0x0, 0x0, 0x19, 0x0, 0x77, 0xb0, 0x6, 0x0, - 0x0, 0x19, 0x0, 0x78, 0xa4, 0x58, 0x20, 0x0, - 0x19, 0x27, 0x31, 0x90, 0x79, 0x10, 0x1, 0x8b, - 0x10, 0x2, 0x90, 0x3, 0x90, 0x1d, 0x40, 0x94, - 0x1, 0x60, 0x0, 0x0, 0x2, 0x0, 0x5, 0xab, - 0xcc, 0xdd, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9069 "適" */ - 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, - 0x91, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x5a, - 0x6, 0x55, 0x65, 0x58, 0x80, 0x0, 0x2, 0x0, - 0x46, 0x6, 0x50, 0x0, 0x0, 0x2, 0x6, 0x5a, - 0x5a, 0x58, 0x30, 0x16, 0x6d, 0xa, 0x0, 0xa2, - 0x9, 0x20, 0x0, 0x19, 0xa, 0x26, 0xc5, 0x89, - 0x10, 0x0, 0x19, 0xa, 0x2, 0xa1, 0x19, 0x10, - 0x0, 0x19, 0xa, 0xc, 0x59, 0x59, 0x10, 0x0, - 0x19, 0xa, 0xc, 0x59, 0x49, 0x10, 0x0, 0x7b, - 0xb, 0x5, 0x3, 0x3a, 0x10, 0x1d, 0x41, 0x94, - 0x0, 0x0, 0x39, 0x0, 0x2, 0x0, 0x7, 0xbb, - 0xcc, 0xcd, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9078 "選" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x95, 0x7, 0x59, 0x48, 0x5a, 0x20, 0x0, 0x1d, - 0x9, 0x9, 0x19, 0x9, 0x0, 0x0, 0x0, 0x9, - 0x57, 0x39, 0x57, 0x30, 0x0, 0x2, 0x8, 0x65, - 0x98, 0x65, 0x90, 0x16, 0x6d, 0x0, 0x3a, 0x11, - 0x72, 0x0, 0x0, 0x19, 0x4, 0x5c, 0x57, 0xb8, - 0x50, 0x0, 0x19, 0x1, 0x9, 0x2, 0x70, 0x0, - 0x0, 0x19, 0x35, 0x5b, 0x56, 0x95, 0xa1, 0x0, - 0x19, 0x0, 0xa, 0x23, 0x61, 0x0, 0x1, 0xac, - 0x3, 0x93, 0x0, 0x1c, 0x30, 0x1e, 0x41, 0xa6, - 0x0, 0x0, 0x1, 0x10, 0x3, 0x0, 0x6, 0xaa, - 0xbb, 0xbc, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x11, 0x0, - - /* U+907F "避" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x3, - 0x60, 0x32, 0x25, 0x2, 0xa0, 0x0, 0x0, 0xa4, - 0x94, 0x3c, 0x65, 0x86, 0x70, 0x0, 0x10, 0x91, - 0xa, 0x31, 0xa, 0x0, 0x0, 0x0, 0x96, 0x5b, - 0xb, 0x26, 0x0, 0x46, 0xa5, 0x90, 0x3, 0x57, - 0x95, 0xa0, 0x0, 0x92, 0xa4, 0x25, 0x10, 0xa0, - 0x0, 0x0, 0x92, 0x8c, 0x3b, 0x0, 0xa0, 0x30, - 0x0, 0x93, 0x6b, 0xa, 0x55, 0xc5, 0x40, 0x0, - 0x97, 0xb, 0xa, 0x0, 0xa0, 0x0, 0x1, 0x94, - 0xc, 0x5a, 0x0, 0xb0, 0x0, 0x3b, 0x4, 0x72, - 0x0, 0x0, 0x50, 0x0, 0x1, 0x0, 0x18, 0xbc, - 0xcc, 0xde, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9084 "還" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xa0, 0xa, 0x58, 0x58, 0x5b, 0x30, 0x0, 0x97, - 0xb, 0xa, 0xa, 0x9, 0x0, 0x0, 0x11, 0xc, - 0x59, 0x59, 0x5b, 0x10, 0x0, 0x10, 0x57, 0x55, - 0x55, 0x56, 0xb0, 0x36, 0xb5, 0x4, 0x55, 0x55, - 0x58, 0x0, 0x0, 0x92, 0x7, 0x30, 0x0, 0xb, - 0x0, 0x0, 0x92, 0x7, 0x7c, 0x55, 0x59, 0x0, - 0x0, 0x92, 0x0, 0xb6, 0x42, 0x96, 0x0, 0x0, - 0x92, 0x29, 0x94, 0x2a, 0x60, 0x0, 0x1, 0xb5, - 0x40, 0x79, 0x72, 0x8a, 0x0, 0x3c, 0x15, 0x71, - 0x35, 0x0, 0x2, 0x0, 0x43, 0x0, 0x29, 0xbc, - 0xcc, 0xcd, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+908A "邊" */ - 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, - 0x71, 0x0, 0x55, 0xb7, 0x58, 0x0, 0x0, 0x3d, - 0x0, 0xb5, 0x55, 0x5b, 0x0, 0x0, 0x7, 0x0, - 0xa5, 0x55, 0x5b, 0x0, 0x0, 0x0, 0x0, 0xb5, - 0x55, 0x5c, 0x0, 0x14, 0x5a, 0x2, 0x30, 0x55, - 0x2, 0x30, 0x1, 0x1a, 0x2a, 0x5a, 0x77, 0x85, - 0xb1, 0x0, 0x19, 0x12, 0x54, 0x45, 0x35, 0x30, - 0x0, 0x19, 0x6, 0x58, 0x75, 0x57, 0x70, 0x0, - 0x19, 0x0, 0xb, 0x55, 0x5d, 0x10, 0x1, 0x9b, - 0x11, 0x92, 0x3, 0x58, 0x0, 0x1d, 0x31, 0xaa, - 0x10, 0x1, 0x91, 0x0, 0x2, 0x0, 0x6, 0xbc, - 0xdd, 0xde, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+90A3 "那" */ - 0x2, 0x55, 0x55, 0x93, 0x75, 0x56, 0x70, 0x0, - 0x11, 0xa0, 0xa1, 0xb0, 0x7, 0x70, 0x0, 0x1, - 0xa0, 0xa1, 0xb0, 0xa, 0x0, 0x1, 0x55, 0xc5, - 0xc1, 0xb0, 0x25, 0x0, 0x0, 0x11, 0xa0, 0xa1, - 0xb0, 0x50, 0x0, 0x0, 0x2, 0x90, 0xa1, 0xb0, - 0x7, 0x0, 0x2, 0x67, 0xa5, 0xc1, 0xb0, 0x5, - 0x40, 0x0, 0x6, 0x30, 0xa1, 0xb0, 0x0, 0xa0, - 0x0, 0x9, 0x0, 0xa1, 0xb0, 0x13, 0xb0, 0x0, - 0x27, 0x0, 0xb0, 0xb1, 0x7f, 0x40, 0x0, 0x80, - 0x5b, 0xc0, 0xb0, 0x0, 0x0, 0x5, 0x0, 0x3, - 0x10, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x0, - - /* U+90AA "邪" */ - 0x2, 0x55, 0x55, 0x87, 0x75, 0x57, 0x70, 0x1, - 0x0, 0xb0, 0xb, 0x0, 0x95, 0x0, 0xb2, 0xb, - 0x0, 0xb0, 0xa, 0x0, 0x1c, 0x0, 0xb0, 0xb, - 0x4, 0x40, 0x7, 0xa5, 0x5c, 0x7a, 0xb0, 0x60, - 0x0, 0x10, 0x9, 0xd0, 0xb, 0x4, 0x30, 0x0, - 0x2, 0xab, 0x0, 0xb0, 0x9, 0x0, 0x0, 0xa1, - 0xb0, 0xb, 0x0, 0x47, 0x0, 0x64, 0xb, 0x0, - 0xb0, 0x3, 0xa0, 0x44, 0x0, 0xb0, 0xb, 0x28, - 0xe6, 0x22, 0x3, 0x3c, 0x0, 0xb0, 0x4, 0x0, - 0x0, 0x9, 0x90, 0xb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x0, - - /* U+90E8 "部" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xa0, 0x0, 0x1, 0x0, 0x10, 0x0, 0x0, - 0x92, 0x15, 0xc, 0x55, 0xd2, 0x3, 0x75, 0x55, - 0x75, 0xb, 0x1, 0xa0, 0x0, 0x37, 0x2, 0xc0, - 0xb, 0x6, 0x30, 0x0, 0xb, 0x7, 0x10, 0xb, - 0x7, 0x0, 0x6, 0x55, 0x57, 0x58, 0x6b, 0x6, - 0x0, 0x0, 0x10, 0x0, 0x30, 0xb, 0x3, 0x60, - 0x0, 0xc5, 0x55, 0xd2, 0xb, 0x0, 0xb0, 0x0, - 0xb0, 0x0, 0xb0, 0xb, 0x0, 0xa2, 0x0, 0xb0, - 0x0, 0xb0, 0xb, 0x59, 0xd0, 0x0, 0xb5, 0x55, - 0xc0, 0xb, 0x6, 0x20, 0x0, 0x90, 0x0, 0x70, - 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, - - /* U+90F5 "郵" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, - 0x47, 0xab, 0xa0, 0x65, 0x58, 0x50, 0x1, 0x10, - 0xa0, 0x0, 0x82, 0xc, 0x30, 0x5, 0x55, 0xc5, - 0x5a, 0x92, 0x36, 0x0, 0x0, 0xa0, 0xa0, 0xa0, - 0x82, 0x70, 0x0, 0x0, 0xa0, 0xa0, 0xa1, 0x82, - 0x50, 0x0, 0x5, 0xc5, 0xc5, 0xb6, 0x82, 0x33, - 0x0, 0x0, 0xa0, 0xa0, 0xa0, 0x82, 0x7, 0x30, - 0x5, 0xc5, 0xc5, 0xc9, 0x92, 0x0, 0xa0, 0x1, - 0x0, 0xa0, 0x0, 0x82, 0x0, 0xc0, 0x0, 0x0, - 0xb4, 0x53, 0x85, 0x7e, 0x80, 0x7, 0xca, 0x52, - 0x0, 0x82, 0x3, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+90FD "都" */ - 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb2, 0x3, 0x6, 0x44, 0x72, 0x0, 0x45, - 0xc7, 0x8d, 0x3c, 0x11, 0xd1, 0x0, 0x10, 0xb1, - 0x67, 0xb, 0x3, 0x70, 0x0, 0x0, 0xb3, 0xb0, - 0x3b, 0x7, 0x10, 0x5, 0x55, 0x7d, 0x65, 0x5b, - 0x6, 0x0, 0x0, 0x1, 0xa2, 0x3, 0xb, 0x6, - 0x10, 0x0, 0x4d, 0x55, 0x6c, 0xb, 0x0, 0xa0, - 0x5, 0x4a, 0x0, 0x19, 0xb, 0x0, 0xa3, 0x0, - 0xc, 0x55, 0x69, 0xb, 0x0, 0x94, 0x0, 0xa, - 0x0, 0x1a, 0xb, 0x3b, 0xd0, 0x0, 0x1c, 0x55, - 0x6a, 0xb, 0x1, 0x0, 0x0, 0x1a, 0x0, 0x16, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x0, 0x0, - - /* U+914D "配" */ - 0x25, 0x55, 0x55, 0xb3, 0x55, 0x58, 0x10, 0x1, - 0xa, 0x91, 0x0, 0x10, 0xb, 0x0, 0x3, 0xa, - 0x91, 0x40, 0x0, 0xb, 0x0, 0xb, 0x5b, 0xb6, - 0xc0, 0x0, 0xb, 0x0, 0xb, 0x18, 0x91, 0xb0, - 0x75, 0x5c, 0x0, 0xb, 0x44, 0x91, 0xb0, 0xb0, - 0x7, 0x0, 0xb, 0x70, 0x4a, 0xb0, 0xb0, 0x0, - 0x0, 0xb, 0x0, 0x0, 0xb0, 0xb0, 0x0, 0x0, - 0xb, 0x55, 0x55, 0xb0, 0xb0, 0x0, 0x10, 0xb, - 0x0, 0x0, 0xb0, 0xb0, 0x0, 0x50, 0xb, 0x55, - 0x55, 0xb0, 0xb0, 0x0, 0x90, 0xb, 0x0, 0x0, - 0xb0, 0xaa, 0x9b, 0xb0, 0x4, 0x0, 0x0, 0x30, - 0x0, 0x0, 0x0, - - /* U+9152 "酒" */ - 0x1, 0x60, 0x45, 0x55, 0x55, 0x56, 0xa0, 0x0, - 0x75, 0x10, 0xa, 0xa, 0x0, 0x0, 0x0, 0x1, - 0x32, 0xa, 0xa, 0x3, 0x0, 0x7, 0x1, 0x4d, - 0x5c, 0x5c, 0x5c, 0x20, 0x4, 0x95, 0xb, 0xa, - 0xa, 0xb, 0x0, 0x0, 0x27, 0xb, 0x9, 0xa, - 0xb, 0x0, 0x0, 0x26, 0xb, 0x53, 0x6, 0x9d, - 0x0, 0x1, 0x92, 0xb, 0x30, 0x0, 0xb, 0x0, - 0x4, 0xe0, 0xc, 0x55, 0x55, 0x5c, 0x0, 0x0, - 0xb0, 0xb, 0x0, 0x0, 0xb, 0x0, 0x0, 0xe0, - 0xd, 0x55, 0x55, 0x5c, 0x0, 0x0, 0x80, 0xb, - 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+9154 "酔" */ - 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x15, - 0x55, 0x55, 0x90, 0x85, 0x0, 0x0, 0x1, 0x54, - 0x90, 0x4, 0xa7, 0x58, 0x0, 0x1, 0x54, 0x92, - 0x1, 0x91, 0xa, 0x0, 0xa, 0x88, 0xba, 0x50, - 0xa0, 0xa, 0x10, 0x9, 0x53, 0x97, 0x24, 0x60, - 0x9, 0x50, 0x9, 0x71, 0x97, 0x46, 0x8, 0x4a, - 0xa3, 0x9, 0x70, 0xac, 0x40, 0xc, 0x10, 0x0, - 0xa, 0x0, 0x7, 0x43, 0x3c, 0x43, 0x80, 0xa, - 0x55, 0x5a, 0x43, 0x2c, 0x32, 0x20, 0x9, 0x0, - 0x7, 0x20, 0xb, 0x10, 0x0, 0xa, 0x55, 0x5a, - 0x30, 0xc, 0x10, 0x0, 0xa, 0x0, 0x7, 0x20, - 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, - - /* U+9178 "酸" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x15, - 0x55, 0x56, 0x80, 0x3a, 0x11, 0x0, 0x1, 0x36, - 0x90, 0x2, 0x70, 0x8, 0x40, 0x1, 0x36, 0x91, - 0x2c, 0x86, 0x55, 0xd0, 0xa, 0x79, 0xbb, 0x32, - 0x51, 0x33, 0x30, 0xa, 0x45, 0x99, 0x13, 0xa1, - 0x7, 0xb0, 0xa, 0x53, 0x99, 0x45, 0x57, 0x0, - 0x81, 0xa, 0x70, 0x9c, 0x10, 0xc6, 0x5b, 0x30, - 0xa, 0x20, 0x9, 0x16, 0x70, 0x1b, 0x0, 0xa, - 0x55, 0x5b, 0x44, 0x51, 0xa3, 0x0, 0xa, 0x0, - 0x9, 0x20, 0xc, 0x70, 0x0, 0xa, 0x55, 0x5b, - 0x10, 0x59, 0xa1, 0x0, 0xb, 0x0, 0x8, 0x27, - 0x50, 0x3d, 0x92, 0x3, 0x0, 0x1, 0x40, 0x0, - 0x1, 0x50, - - /* U+91AB "醫" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x10, 0x0, 0x0, - 0xb5, 0x85, 0x82, 0x95, 0xb3, 0x0, 0x0, 0xa6, - 0x96, 0x80, 0x90, 0x86, 0x30, 0x0, 0xa4, 0x27, - 0x34, 0x30, 0x16, 0x20, 0x0, 0xa5, 0xaa, 0x52, - 0x75, 0xb7, 0x0, 0x0, 0xa3, 0x51, 0x61, 0x29, - 0xb1, 0x0, 0x2, 0xa6, 0x55, 0x57, 0x53, 0x29, - 0x10, 0x5, 0x55, 0x55, 0x95, 0x95, 0x55, 0x91, - 0x0, 0x17, 0x55, 0xc5, 0xc5, 0x76, 0x0, 0x0, - 0x1a, 0x5, 0x50, 0xa0, 0x55, 0x0, 0x0, 0x1a, - 0x44, 0x0, 0x57, 0xa5, 0x0, 0x0, 0x1b, 0x55, - 0x55, 0x55, 0x85, 0x0, 0x0, 0x1b, 0x55, 0x55, - 0x55, 0x85, 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, - 0x22, 0x0, - - /* U+91CD "重" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x23, 0x57, 0x9b, 0x90, 0x0, 0x0, 0x23, - 0x22, 0xb1, 0x0, 0x2, 0x0, 0x5, 0x65, 0x55, - 0xc5, 0x55, 0x5a, 0x40, 0x0, 0x2, 0x0, 0xa1, - 0x0, 0x40, 0x0, 0x0, 0xd, 0x55, 0xc5, 0x55, - 0xc0, 0x0, 0x0, 0xd, 0x55, 0xc5, 0x55, 0xb0, - 0x0, 0x0, 0xc, 0x0, 0xa1, 0x0, 0xb0, 0x0, - 0x0, 0xd, 0x55, 0xc5, 0x55, 0xc0, 0x0, 0x0, - 0x4, 0x0, 0xa1, 0x0, 0x50, 0x0, 0x0, 0x65, - 0x55, 0xc5, 0x55, 0x86, 0x0, 0x0, 0x0, 0x0, - 0xa1, 0x0, 0x1, 0x40, 0x26, 0x55, 0x55, 0x85, - 0x55, 0x57, 0x91, - - /* U+91CE "野" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x95, - 0x75, 0x5b, 0x45, 0x55, 0xd2, 0xb, 0x9, 0x10, - 0xb0, 0x0, 0x75, 0x0, 0xb0, 0x91, 0xb, 0x5, - 0x93, 0x0, 0xb, 0x5b, 0x65, 0xb0, 0x9, 0x60, - 0x0, 0xb0, 0x91, 0xb, 0x65, 0x86, 0x89, 0xb, - 0x5b, 0x65, 0xb0, 0xa, 0x8, 0x0, 0x40, 0x91, - 0x2, 0x0, 0xa1, 0x10, 0x1, 0x19, 0x10, 0x70, - 0xa, 0x0, 0x0, 0x54, 0xb6, 0x55, 0x0, 0xa0, - 0x0, 0x0, 0x9, 0x10, 0x11, 0xa, 0x0, 0x1, - 0x46, 0xb7, 0x53, 0x0, 0xa0, 0x0, 0x59, 0x30, - 0x0, 0x3, 0x9e, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, - - /* U+91CF "量" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0xb, 0x55, 0x55, 0x55, 0xd0, 0x0, 0x0, 0xb, - 0x55, 0x55, 0x55, 0xb0, 0x0, 0x0, 0xb, 0x55, - 0x55, 0x55, 0xb0, 0x0, 0x0, 0x8, 0x0, 0x0, - 0x0, 0x40, 0x50, 0x17, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x72, 0x0, 0xa, 0x55, 0x57, 0x55, 0xb0, - 0x0, 0x0, 0xb, 0x0, 0x19, 0x0, 0xb0, 0x0, - 0x0, 0xc, 0x55, 0x6b, 0x55, 0xc0, 0x0, 0x0, - 0xd, 0x55, 0x6b, 0x55, 0xb0, 0x0, 0x0, 0x2, - 0x0, 0x19, 0x0, 0x34, 0x0, 0x0, 0x56, 0x55, - 0x6b, 0x55, 0x54, 0x0, 0x5, 0x55, 0x55, 0x6b, - 0x55, 0x56, 0xc1, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+91D1 "金" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x37, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, - 0x3, 0x80, 0x0, 0x0, 0x0, 0x5, 0x90, 0x0, - 0x4b, 0x20, 0x0, 0x0, 0x56, 0x0, 0x0, 0x6, - 0xdb, 0x71, 0x15, 0x21, 0x65, 0xc5, 0x56, 0x5, - 0x50, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x65, 0x55, 0xd5, 0x55, 0x95, 0x0, 0x0, - 0x4, 0x0, 0xc0, 0x7, 0x10, 0x0, 0x0, 0x3, - 0xc0, 0xc0, 0x1c, 0x10, 0x0, 0x0, 0x0, 0xb3, - 0xc0, 0x72, 0x0, 0x0, 0x15, 0x55, 0x65, 0xd5, - 0x95, 0x58, 0xa0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+91DD "針" */ - 0x0, 0x3, 0x10, 0x0, 0x6, 0x10, 0x0, 0x0, - 0xe, 0x50, 0x0, 0xc, 0x10, 0x0, 0x0, 0x58, - 0x79, 0x0, 0xc, 0x0, 0x0, 0x0, 0xa0, 0x8, - 0x30, 0xc, 0x0, 0x0, 0x6, 0x30, 0x22, 0x0, - 0xc, 0x0, 0x0, 0x24, 0x5b, 0x63, 0x35, 0x5d, - 0x56, 0xb0, 0x0, 0x9, 0x10, 0x1, 0xc, 0x0, - 0x0, 0x4, 0x6b, 0x6b, 0x10, 0xc, 0x0, 0x0, - 0x1, 0x9, 0x15, 0x0, 0xc, 0x0, 0x0, 0x0, - 0xa9, 0x2c, 0x0, 0xc, 0x0, 0x0, 0x0, 0xba, - 0x62, 0x0, 0xc, 0x0, 0x0, 0x2, 0x5c, 0x85, - 0x10, 0xc, 0x0, 0x0, 0x9, 0x61, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x0, 0x0, - - /* U+9244 "鉄" */ - 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0xe, 0x30, 0x0, 0xd, 0x0, 0x0, 0x0, 0x59, - 0x84, 0xd, 0x1b, 0x0, 0x0, 0x0, 0xa0, 0xc, - 0x5a, 0xb, 0x3, 0x0, 0x6, 0x30, 0x32, 0x77, - 0x5c, 0x57, 0x30, 0x24, 0x6c, 0x53, 0x90, 0xb, - 0x0, 0x0, 0x0, 0xb, 0x3, 0x10, 0x1a, 0x0, - 0x30, 0x5, 0x6c, 0x57, 0x56, 0x7d, 0x55, 0x71, - 0x3, 0xb, 0x9, 0x10, 0x78, 0x20, 0x0, 0x4, - 0x7b, 0x29, 0x0, 0xb0, 0x90, 0x0, 0x1, 0x8b, - 0x42, 0x16, 0x50, 0x75, 0x0, 0x5, 0x8b, 0x73, - 0x47, 0x0, 0xd, 0x70, 0x7, 0x20, 0x4, 0x40, - 0x0, 0x1, 0x92, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, - - /* U+925B "鉛" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0x30, 0x2, 0x0, 0x3, 0x0, 0x0, 0x59, - 0x85, 0x7, 0x95, 0x5c, 0x0, 0x0, 0xa0, 0xc, - 0x27, 0x50, 0xa, 0x0, 0x6, 0x30, 0x32, 0x8, - 0x30, 0xa, 0x0, 0x24, 0x6c, 0x52, 0xa, 0x0, - 0xb, 0x0, 0x0, 0xb, 0x0, 0x45, 0x0, 0x7, - 0x93, 0x5, 0x5c, 0x5b, 0x33, 0x0, 0x4, 0x0, - 0x2, 0xb, 0x7, 0xc, 0x55, 0x5b, 0x40, 0x4, - 0x6b, 0x2a, 0xb, 0x0, 0x9, 0x20, 0x1, 0x9b, - 0x42, 0x1b, 0x0, 0x9, 0x20, 0x5, 0x8c, 0x74, - 0xc, 0x55, 0x5b, 0x20, 0x7, 0x20, 0x0, 0xb, - 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9280 "銀" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0x10, 0x2, 0x0, 0x3, 0x0, 0x0, 0x97, - 0x82, 0x1c, 0x55, 0x5d, 0x0, 0x1, 0xa0, 0x2c, - 0xa, 0x0, 0xb, 0x0, 0x9, 0x10, 0x41, 0xc, - 0x55, 0x5b, 0x0, 0x23, 0x6c, 0x52, 0xa, 0x0, - 0xb, 0x0, 0x0, 0xb, 0x0, 0xc, 0x55, 0x5b, - 0x0, 0x6, 0x5c, 0x6a, 0x1a, 0x40, 0x6, 0x50, - 0x2, 0xb, 0x7, 0xa, 0x6, 0x19, 0x30, 0x8, - 0x2b, 0x57, 0xa, 0x8, 0x50, 0x0, 0x5, 0x4b, - 0x61, 0x1a, 0x2, 0xb2, 0x0, 0x4, 0x7c, 0x74, - 0x2c, 0x71, 0x2c, 0xa2, 0xa, 0x20, 0x0, 0x19, - 0x0, 0x0, 0x20, - - /* U+9322 "錢" */ - 0x0, 0x6, 0x0, 0x6, 0x33, 0x20, 0x0, 0x0, - 0x4d, 0x0, 0x6, 0x60, 0xa3, 0x20, 0x0, 0xa2, - 0xa5, 0x46, 0xc5, 0x55, 0x20, 0x4, 0x60, 0x8, - 0x0, 0xb1, 0xa7, 0x0, 0x8, 0x55, 0x92, 0x0, - 0x6e, 0x40, 0x10, 0x10, 0x1b, 0x0, 0x37, 0x77, - 0xb3, 0x51, 0x0, 0xb, 0x4, 0x27, 0x47, 0x5b, - 0xe3, 0x5, 0x5c, 0x66, 0x5, 0x73, 0x42, 0x60, - 0x4, 0xb, 0x1a, 0x56, 0xc5, 0x54, 0x20, 0x5, - 0x6b, 0x63, 0x0, 0xb1, 0x96, 0x0, 0x2, 0x4b, - 0x65, 0x0, 0x4d, 0x80, 0x0, 0xb, 0x96, 0x10, - 0x2, 0x8a, 0x91, 0x41, 0x2, 0x0, 0x1, 0x44, - 0x0, 0x4b, 0xc3, - - /* U+932F "錯" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x3d, 0x0, 0x1, 0xc0, 0xc1, 0x0, 0x0, 0xa7, - 0x81, 0x0, 0xa0, 0xc4, 0x20, 0x2, 0x90, 0x4b, - 0x36, 0xc5, 0xd5, 0x30, 0x9, 0x10, 0x42, 0x0, - 0xa0, 0xc0, 0x0, 0x31, 0x5c, 0x43, 0x55, 0xc5, - 0xd5, 0xb2, 0x0, 0xb, 0x1, 0x10, 0x0, 0x0, - 0x0, 0x6, 0x5c, 0x78, 0xa, 0x55, 0x5b, 0x30, - 0x3, 0xb, 0x9, 0xc, 0x0, 0xb, 0x0, 0x7, - 0x4b, 0x56, 0xd, 0x55, 0x5d, 0x0, 0x4, 0x4b, - 0x52, 0x1c, 0x0, 0xb, 0x0, 0x6, 0x9b, 0x73, - 0xd, 0x55, 0x5d, 0x10, 0x8, 0x10, 0x0, 0xb, - 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9332 "録" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4c, 0x0, 0x25, 0x55, 0x59, 0x10, 0x0, 0xb5, - 0x92, 0x1, 0x0, 0xb, 0x0, 0x2, 0x80, 0x3a, - 0x4, 0x55, 0x5b, 0x0, 0x9, 0x11, 0x60, 0x1, - 0x0, 0xb, 0x0, 0x32, 0x5c, 0x42, 0x55, 0x55, - 0x5c, 0xb3, 0x0, 0xb, 0x0, 0x20, 0xb, 0x0, - 0x20, 0x6, 0x5c, 0x76, 0x39, 0xe, 0x8, 0x80, - 0x3, 0xb, 0x28, 0x8, 0xc, 0x92, 0x0, 0x8, - 0x3b, 0x74, 0x1, 0x3b, 0x72, 0x0, 0x5, 0x3b, - 0x53, 0x47, 0xb, 0xc, 0x30, 0x16, 0x9a, 0x64, - 0x90, 0xb, 0x2, 0xc2, 0x7, 0x10, 0x0, 0x5, - 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+9577 "長" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x65, 0x55, 0x55, 0xa2, 0x0, 0x0, 0x8, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x85, - 0x55, 0x58, 0x50, 0x0, 0x0, 0x8, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0x85, 0x55, 0x58, - 0x70, 0x0, 0x0, 0x8, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x16, 0x5b, 0x85, 0x55, 0x55, 0x57, 0x90, - 0x0, 0xd, 0x0, 0x60, 0x0, 0x60, 0x0, 0x0, - 0xd, 0x0, 0x17, 0x29, 0x60, 0x0, 0x0, 0xd, - 0x0, 0x14, 0xb0, 0x0, 0x0, 0x0, 0xd, 0x37, - 0x10, 0x4c, 0x71, 0x0, 0x0, 0xd, 0x80, 0x0, - 0x0, 0x8e, 0x80, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9589 "閉" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x55, - 0xd3, 0xa, 0x55, 0xb5, 0xc, 0x0, 0xb0, 0xa, - 0x0, 0xa2, 0xd, 0x55, 0xc0, 0xb, 0x55, 0xb2, - 0xd, 0x55, 0xc0, 0xc, 0x55, 0xb2, 0xc, 0x0, - 0x30, 0x24, 0x0, 0xa2, 0xc, 0x0, 0x0, 0xb1, - 0x0, 0xa2, 0xc, 0x26, 0x58, 0xe5, 0x83, 0xa2, - 0xc, 0x0, 0x2b, 0xb0, 0x0, 0xa2, 0xc, 0x2, - 0x91, 0xb0, 0x0, 0xa2, 0xc, 0x36, 0x0, 0xb0, - 0x0, 0xa2, 0xc, 0x0, 0x29, 0xd0, 0x0, 0xa2, - 0xc, 0x0, 0x0, 0x20, 0x3a, 0xe0, 0x2, 0x0, - 0x0, 0x0, 0x1, 0x10, - - /* U+958B "開" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x55, - 0xa5, 0xb, 0x55, 0xb4, 0xc, 0x0, 0x83, 0xc, - 0x0, 0xa2, 0xd, 0x55, 0xa3, 0xc, 0x55, 0xb2, - 0xd, 0x55, 0xa3, 0xc, 0x55, 0xb2, 0xc, 0x0, - 0x20, 0x5, 0x0, 0xa2, 0xc, 0x4, 0x65, 0x56, - 0x80, 0xa2, 0xc, 0x0, 0x55, 0xa, 0x0, 0xa2, - 0xc, 0x15, 0x88, 0x5c, 0x85, 0xa2, 0xc, 0x1, - 0x74, 0xa, 0x0, 0xa2, 0xc, 0x0, 0xa0, 0xa, - 0x0, 0xa2, 0xc, 0x7, 0x30, 0xa, 0x0, 0xa2, - 0xc, 0x10, 0x0, 0x1, 0x2a, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x10, - - /* U+9593 "間" */ - 0x1, 0x0, 0x10, 0x1, 0x0, 0x20, 0xd, 0x55, - 0x97, 0xb, 0x55, 0xc4, 0xc, 0x0, 0x54, 0xb, - 0x0, 0xa2, 0xd, 0x55, 0x94, 0xc, 0x55, 0xb2, - 0xd, 0x55, 0x95, 0xc, 0x55, 0xb2, 0xc, 0x0, - 0x10, 0x3, 0x0, 0xa2, 0xc, 0x0, 0xa5, 0x59, - 0x50, 0xa2, 0xc, 0x0, 0xc0, 0x7, 0x30, 0xa2, - 0xc, 0x0, 0xd5, 0x5a, 0x30, 0xa2, 0xc, 0x0, - 0xc0, 0x7, 0x30, 0xa2, 0xc, 0x0, 0xd5, 0x5a, - 0x30, 0xa2, 0xc, 0x0, 0x70, 0x4, 0x20, 0xa2, - 0xc, 0x0, 0x0, 0x0, 0x2a, 0xe0, 0x2, 0x0, - 0x0, 0x0, 0x1, 0x10, - - /* U+95A2 "関" */ - 0x1, 0x0, 0x10, 0x1, 0x0, 0x1, 0x0, 0xd5, - 0x5c, 0x30, 0xc5, 0x56, 0xc0, 0xd, 0x55, 0xc0, - 0xc, 0x55, 0x6a, 0x0, 0xc0, 0xb, 0x0, 0xb0, - 0x2, 0xa0, 0xd, 0x55, 0xc0, 0xc, 0x55, 0x6a, - 0x0, 0xc0, 0x6, 0x0, 0x71, 0x2, 0xa0, 0xc, - 0x0, 0x73, 0x29, 0x0, 0x2a, 0x0, 0xc0, 0x55, - 0x6a, 0x57, 0x32, 0xa0, 0xc, 0x0, 0x5, 0x70, - 0x3, 0x2a, 0x0, 0xc1, 0x65, 0xd8, 0x55, 0x42, - 0xa0, 0xc, 0x0, 0x67, 0x4a, 0x60, 0x2a, 0x0, - 0xc0, 0x65, 0x0, 0x6, 0x2, 0xa0, 0xc, 0x10, - 0x0, 0x0, 0x17, 0xc9, 0x0, 0x40, 0x0, 0x0, - 0x0, 0x4, 0x0, - - /* U+95DC "關" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0xb5, - 0x59, 0x60, 0xc5, 0x56, 0xc0, 0x1b, 0x55, 0x95, - 0xc, 0x55, 0x6a, 0x1, 0xa0, 0x6, 0x50, 0xb0, - 0x1, 0xa0, 0x1b, 0x55, 0x92, 0x9, 0x85, 0x6a, - 0x1, 0xa0, 0x38, 0x21, 0x82, 0x31, 0xa0, 0x1a, - 0x1a, 0x88, 0x67, 0xa5, 0x1a, 0x1, 0xa0, 0x76, - 0x84, 0x93, 0x71, 0xa0, 0x1a, 0x8, 0x37, 0x55, - 0x14, 0x1a, 0x1, 0xa0, 0xa0, 0xb4, 0x70, 0xa1, - 0xa0, 0x1a, 0x17, 0x59, 0x39, 0x5a, 0x1a, 0x1, - 0xa0, 0x6, 0x44, 0x60, 0x1, 0xa0, 0x1a, 0x2, - 0x20, 0x12, 0x5, 0xc7, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x3, 0x0, - - /* U+95F0 "闰" */ - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x20, 0x55, 0x55, 0x55, 0x90, 0x15, 0x64, 0x1, - 0x0, 0x0, 0xc, 0x2, 0xb0, 0x0, 0x0, 0x0, - 0x30, 0xc0, 0x2a, 0x17, 0x55, 0xb5, 0x67, 0xc, - 0x2, 0xa0, 0x0, 0xc, 0x0, 0x0, 0xc0, 0x2a, - 0x0, 0x0, 0xc0, 0x42, 0xc, 0x2, 0xa0, 0x36, - 0x5d, 0x55, 0x30, 0xc0, 0x2a, 0x0, 0x0, 0xc0, - 0x0, 0xc, 0x2, 0xa0, 0x0, 0xc, 0x0, 0x60, - 0xc0, 0x2a, 0x46, 0x55, 0x55, 0x55, 0x2c, 0x2, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x29, 0x0, - 0x0, 0x0, 0x5, 0xd8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, - - /* U+9633 "阳" */ - 0x65, 0x58, 0x51, 0x0, 0x0, 0x10, 0x92, 0xb, - 0x3b, 0x55, 0x55, 0xd0, 0x92, 0x17, 0xb, 0x0, - 0x0, 0xb0, 0x92, 0x60, 0xb, 0x0, 0x0, 0xb0, - 0x92, 0x60, 0xb, 0x0, 0x0, 0xb0, 0x92, 0x9, - 0xb, 0x55, 0x55, 0xb0, 0x92, 0x6, 0x6b, 0x0, - 0x0, 0xb0, 0x92, 0x7, 0x7b, 0x0, 0x0, 0xb0, - 0x95, 0xbe, 0x1b, 0x0, 0x0, 0xb0, 0x92, 0x31, - 0xb, 0x0, 0x0, 0xb0, 0x92, 0x0, 0xb, 0x55, - 0x55, 0xc0, 0x92, 0x0, 0x8, 0x0, 0x0, 0x70, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9644 "附" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, 0x85, - 0x93, 0xb, 0x40, 0xc, 0x0, 0x1a, 0xa, 0x1, - 0xb0, 0x0, 0xb0, 0x1, 0xa0, 0x80, 0x73, 0x0, - 0xb, 0x0, 0x1a, 0x52, 0xd, 0x24, 0x55, 0xc8, - 0x31, 0xa3, 0x15, 0xa1, 0x10, 0xb, 0x0, 0x1a, - 0x8, 0x29, 0x14, 0x0, 0xb0, 0x1, 0xa0, 0x72, - 0x91, 0x3b, 0xb, 0x0, 0x1a, 0x7, 0x49, 0x10, - 0x50, 0xb0, 0x1, 0xba, 0xc0, 0x91, 0x0, 0xb, - 0x0, 0x1a, 0x10, 0x9, 0x10, 0x0, 0xb0, 0x1, - 0xa0, 0x0, 0x91, 0x2, 0x1b, 0x0, 0x19, 0x0, - 0x8, 0x10, 0x2c, 0x60, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+964D "降" */ - 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x2, 0xa5, - 0x89, 0x7, 0xa5, 0x59, 0x10, 0x1a, 0xa, 0x20, - 0xb2, 0x3, 0xb0, 0x1, 0xa0, 0x90, 0x53, 0x71, - 0xb0, 0x0, 0x1a, 0x32, 0x13, 0x3, 0xe2, 0x0, - 0x1, 0xa1, 0x40, 0x2, 0x94, 0xa6, 0x20, 0x1a, - 0x6, 0x35, 0x50, 0xa1, 0x59, 0x11, 0xa0, 0x2a, - 0x36, 0x5c, 0x58, 0x50, 0x1a, 0x3, 0xa5, 0x30, - 0xb0, 0x0, 0x1, 0xb9, 0xe3, 0xb1, 0xb, 0x0, - 0x30, 0x1a, 0x1, 0x28, 0x55, 0xc5, 0x57, 0x21, - 0xa0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x1a, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x3, 0x0, 0x0, - - /* U+9650 "限" */ - 0x75, 0x5a, 0x8, 0x55, 0x5a, 0x40, 0xa, 0x12, - 0x90, 0xb0, 0x0, 0xa1, 0x0, 0xa1, 0x62, 0xb, - 0x0, 0xa, 0x10, 0xa, 0x16, 0x0, 0xd5, 0x55, - 0xc1, 0x0, 0xa1, 0x50, 0xb, 0x0, 0xa, 0x20, - 0xa, 0x12, 0x50, 0xd6, 0x55, 0xc2, 0x0, 0xa1, - 0xa, 0xb, 0x14, 0x2, 0x90, 0xa, 0x10, 0xb0, - 0xb0, 0x71, 0xa5, 0x0, 0xa5, 0xbd, 0xb, 0x7, - 0x70, 0x0, 0xa, 0x14, 0x10, 0xb0, 0x1b, 0x20, - 0x0, 0xa1, 0x0, 0xd, 0x82, 0x2d, 0x93, 0xa, - 0x10, 0x1, 0xc1, 0x0, 0x1a, 0x40, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9662 "院" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x65, 0x58, - 0x0, 0xa, 0x10, 0x0, 0xa0, 0x48, 0x55, 0x5b, - 0x65, 0x83, 0xa0, 0x71, 0xb0, 0x0, 0x0, 0x80, - 0xa0, 0x60, 0x40, 0x0, 0x5, 0x0, 0xa0, 0x40, - 0x5, 0x55, 0x55, 0x0, 0xa0, 0x53, 0x0, 0x0, - 0x0, 0x40, 0xa0, 0xb, 0x56, 0xb5, 0xb5, 0x71, - 0xa0, 0xc, 0x0, 0xb0, 0xb0, 0x0, 0xa3, 0xbb, - 0x1, 0xa0, 0xb0, 0x0, 0xa0, 0x30, 0x6, 0x60, - 0xb0, 0x4, 0xa0, 0x0, 0x1a, 0x0, 0xb0, 0x17, - 0xa0, 0x3, 0x70, 0x0, 0xaa, 0xba, 0x40, 0x11, - 0x0, 0x0, 0x0, 0x0, - - /* U+9664 "除" */ - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x6, 0x55, - 0xa1, 0x4, 0xe1, 0x0, 0x0, 0xa0, 0x2a, 0x0, - 0xc2, 0x70, 0x0, 0xa, 0x7, 0x20, 0x66, 0x4, - 0x80, 0x0, 0xa0, 0x60, 0x38, 0x0, 0x6, 0xc5, - 0xa, 0x4, 0x25, 0x46, 0x85, 0x83, 0x70, 0xa0, - 0x54, 0x0, 0xb, 0x0, 0x0, 0xa, 0x0, 0xc3, - 0x55, 0xc5, 0x5b, 0x20, 0xa0, 0x1c, 0x12, 0xb, - 0x0, 0x0, 0xa, 0x4e, 0x50, 0xd3, 0xb0, 0x61, - 0x0, 0xa0, 0x0, 0x85, 0xb, 0x1, 0xb2, 0xa, - 0x0, 0x64, 0x0, 0xb0, 0x5, 0x90, 0xb0, 0x1, - 0x4, 0xbd, 0x0, 0x1, 0x1, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, - - /* U+9678 "陸" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x7, 0x55, - 0x91, 0x0, 0xc1, 0x0, 0x0, 0xb0, 0xb, 0x0, - 0xb, 0x0, 0x60, 0xb, 0x5, 0x32, 0x65, 0xc5, - 0x55, 0x0, 0xb0, 0x50, 0x0, 0xb, 0x0, 0x3, - 0xb, 0x5, 0x16, 0x58, 0x65, 0x55, 0x60, 0xb0, - 0x34, 0x7, 0xa1, 0x6, 0x91, 0xb, 0x0, 0xb5, - 0x50, 0xb1, 0x5, 0x70, 0xb0, 0x2b, 0x10, 0xb, - 0x0, 0x0, 0xb, 0x6d, 0x23, 0x65, 0xc5, 0x69, - 0x0, 0xb0, 0x0, 0x0, 0xb, 0x0, 0x0, 0xb, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0x20, 0xb0, 0x6, - 0x55, 0x58, 0x55, 0x77, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+967D "陽" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x55, - 0xb2, 0xa5, 0x55, 0x5c, 0x0, 0xb0, 0x1b, 0xb, - 0x0, 0x0, 0xb0, 0xb, 0x6, 0x20, 0xb5, 0x55, - 0x5b, 0x0, 0xb0, 0x50, 0xb, 0x55, 0x55, 0xc0, - 0xb, 0x6, 0x0, 0x50, 0x0, 0x3, 0x10, 0xb0, - 0x27, 0x65, 0x85, 0x55, 0x59, 0xb, 0x0, 0xb0, - 0x2b, 0x0, 0x0, 0x30, 0xb1, 0x1d, 0x1a, 0x5d, - 0x6c, 0x6b, 0xb, 0x4d, 0x67, 0x17, 0x57, 0x53, - 0x80, 0xb0, 0x2, 0x5, 0x62, 0xa0, 0x56, 0xb, - 0x0, 0x4, 0x22, 0x91, 0x9, 0x30, 0xa0, 0x0, - 0x4, 0x60, 0x4b, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x0, - - /* U+968E "階" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x9, 0x55, - 0xb5, 0xb0, 0xc, 0x0, 0x0, 0xa0, 0xb, 0x1a, - 0x1, 0xb0, 0xb5, 0xa, 0x6, 0x21, 0xc6, 0x5c, - 0x82, 0x0, 0xa0, 0x60, 0x1a, 0x0, 0xb0, 0x4, - 0xa, 0x6, 0x1, 0xc6, 0x2b, 0x0, 0x90, 0xa0, - 0x18, 0x19, 0x4, 0x49, 0x97, 0xa, 0x0, 0xb0, - 0x11, 0x80, 0x2, 0x0, 0xa4, 0x8d, 0xc, 0x55, - 0x55, 0xd0, 0xa, 0x5, 0x10, 0xb0, 0x0, 0xb, - 0x0, 0xa0, 0x0, 0xc, 0x55, 0x55, 0xb0, 0xb, - 0x0, 0x0, 0xb0, 0x0, 0xb, 0x0, 0xa0, 0x0, - 0xc, 0x55, 0x55, 0xc0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x0, - - /* U+969B "際" */ - 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x7, 0x55, - 0xa1, 0x86, 0x24, 0x0, 0x20, 0xb0, 0x3a, 0xb, - 0x5c, 0x85, 0x97, 0xb, 0x8, 0x17, 0x75, 0xa3, - 0x38, 0x0, 0xb1, 0x53, 0x75, 0x93, 0xb, 0x20, - 0xb, 0x6, 0x0, 0x57, 0x0, 0x3c, 0x40, 0xb0, - 0x45, 0x35, 0x55, 0x58, 0x58, 0x1b, 0x0, 0xc1, - 0x1, 0x0, 0x0, 0x0, 0xb3, 0x5b, 0x26, 0x55, - 0x75, 0x77, 0xb, 0x8, 0x10, 0x13, 0xb, 0x20, - 0x0, 0xb0, 0x0, 0xb, 0x60, 0xb1, 0xa2, 0xb, - 0x0, 0x17, 0x20, 0xb, 0x2, 0xe0, 0xb0, 0x3, - 0x0, 0x6d, 0x80, 0x3, 0x1, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x0, - - /* U+969C "障" */ - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x6, 0x45, - 0x70, 0x0, 0xc0, 0x1, 0x0, 0xc0, 0x77, 0x17, - 0x57, 0x57, 0x90, 0xb, 0x9, 0x0, 0x19, 0x4, - 0xa0, 0x0, 0xb0, 0x61, 0x33, 0xa3, 0x83, 0x49, - 0xb, 0x5, 0x3, 0x42, 0x22, 0x25, 0x20, 0xb0, - 0x54, 0xc, 0x55, 0x55, 0xd1, 0xb, 0x0, 0xc0, - 0xc5, 0x55, 0x5c, 0x0, 0xb0, 0xe, 0xb, 0x0, - 0x0, 0xb0, 0xb, 0x5d, 0x80, 0xa5, 0xc5, 0x59, - 0x0, 0xb0, 0x12, 0x65, 0x5c, 0x55, 0x5b, 0x1b, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x30, 0x0, 0x0, - - /* U+96A3 "隣" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x7, 0x56, - 0x80, 0x71, 0x94, 0xa, 0x0, 0xb0, 0x74, 0x2, - 0x89, 0x27, 0x40, 0xb, 0x8, 0x4, 0x66, 0xc8, - 0x85, 0x70, 0xb3, 0x10, 0x2, 0xaa, 0x65, 0x0, - 0xb, 0x14, 0x5, 0x60, 0x92, 0x5c, 0x70, 0xb0, - 0x74, 0x14, 0x6, 0x10, 0x31, 0xb, 0x3, 0x86, - 0x92, 0x10, 0x19, 0x20, 0xb5, 0x97, 0xa5, 0xc4, - 0x86, 0xb5, 0xb, 0x6, 0x78, 0x1b, 0x3b, 0x19, - 0x0, 0xb0, 0x0, 0x49, 0x37, 0x65, 0xb7, 0x1b, - 0x0, 0x4, 0x70, 0x0, 0x19, 0x0, 0xb0, 0x4, - 0x50, 0x0, 0x1, 0x90, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, - - /* U+96A8 "隨" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x8, 0x5a, - 0x40, 0x0, 0xd, 0x0, 0x20, 0xa0, 0xb2, 0x64, - 0x69, 0x95, 0x55, 0xa, 0x35, 0xb, 0x3, 0xb5, - 0x78, 0x30, 0xa5, 0x0, 0x13, 0x62, 0x3a, 0x27, - 0xa, 0x33, 0x2, 0x2, 0x42, 0x24, 0x20, 0xa0, - 0x95, 0xb5, 0xb, 0x55, 0xa3, 0xa, 0x8, 0x39, - 0x10, 0xc5, 0x5a, 0x10, 0xb7, 0xc1, 0x91, 0xa, - 0x0, 0x81, 0xa, 0x33, 0x9, 0x10, 0xc5, 0x5a, - 0x10, 0xa0, 0x0, 0x91, 0xa, 0x4, 0xa1, 0xa, - 0x0, 0x83, 0x65, 0x30, 0x17, 0x0, 0xa0, 0x26, - 0x0, 0x4a, 0xdc, 0xdb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+96BB "隻" */ - 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x70, 0x4, 0x0, 0x8, 0x0, 0x0, 0x5f, 0x55, - 0x5d, 0x55, 0x55, 0x10, 0x3, 0x5b, 0x55, 0x5d, - 0x55, 0x83, 0x0, 0x2, 0xb, 0x0, 0xc, 0x0, - 0x33, 0x0, 0x0, 0xb, 0x55, 0x5d, 0x55, 0x54, - 0x0, 0x0, 0xb, 0x44, 0x49, 0x44, 0x49, 0x30, - 0x0, 0x36, 0x55, 0x55, 0x58, 0x50, 0x0, 0x0, - 0x10, 0x61, 0x0, 0x3c, 0x30, 0x0, 0x0, 0x0, - 0x8, 0x57, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xcc, 0x62, 0x0, 0x0, 0x2, 0x46, 0x72, 0x0, - 0x49, 0xbc, 0xb1, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+96C6 "集" */ - 0x0, 0x0, 0x50, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xc1, 0x1c, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x75, 0x59, 0x55, 0x5a, 0x40, 0x0, 0x5d, 0x0, - 0xb, 0x0, 0x0, 0x0, 0x2, 0x7c, 0x55, 0x5c, - 0x55, 0x77, 0x0, 0x15, 0xb, 0x0, 0xb, 0x0, - 0x33, 0x0, 0x0, 0xc, 0x55, 0x5c, 0x55, 0x54, - 0x0, 0x0, 0xc, 0x55, 0x5a, 0x55, 0x5a, 0x20, - 0x0, 0x7, 0x0, 0x1b, 0x0, 0x0, 0x30, 0x16, - 0x55, 0x57, 0xbc, 0x85, 0x55, 0x73, 0x0, 0x0, - 0x3b, 0x2a, 0x35, 0x0, 0x0, 0x0, 0x7, 0x70, - 0x1a, 0x4, 0xb5, 0x0, 0x4, 0x61, 0x0, 0x1b, - 0x0, 0x19, 0xe3, 0x10, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+96D1 "雑" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x76, 0x70, 0x0, 0x3, 0x6c, - 0x6a, 0x0, 0xc1, 0xc0, 0x0, 0x0, 0x28, 0x47, - 0x1, 0xc5, 0x75, 0xb1, 0x0, 0x83, 0x74, 0x57, - 0xa0, 0xb0, 0x0, 0x3, 0x61, 0x4a, 0x99, 0xa0, - 0xb0, 0x0, 0x3, 0x5, 0x70, 0x32, 0xc5, 0xc5, - 0x80, 0x2, 0x37, 0x83, 0x81, 0xa0, 0xb0, 0x0, - 0x2, 0x26, 0x72, 0x21, 0xa0, 0xb0, 0x40, 0x0, - 0xb6, 0x95, 0x1, 0xc5, 0xc5, 0x50, 0x3, 0x65, - 0x67, 0x71, 0xa0, 0xb0, 0x0, 0x6, 0x5, 0x60, - 0x51, 0xa0, 0xb0, 0x51, 0x0, 0x3c, 0x50, 0x1, - 0xc5, 0x55, 0x52, 0x0, 0x2, 0x0, 0x0, 0x20, - 0x0, 0x0, - - /* U+96D6 "雖" */ - 0x1, 0x10, 0x4, 0x1, 0xb2, 0x70, 0x0, 0x2, - 0xa5, 0x5c, 0x5, 0x90, 0x94, 0x0, 0x1, 0x70, - 0xa, 0x9, 0x65, 0x65, 0x90, 0x2, 0xa8, 0x5a, - 0xe, 0x10, 0xa0, 0x0, 0x0, 0x1a, 0x0, 0x5a, - 0x10, 0xa0, 0x0, 0x9, 0x5b, 0x58, 0x49, 0x65, - 0xc6, 0x70, 0xa, 0xa, 0x4, 0x29, 0x10, 0xa0, - 0x0, 0xa, 0xa, 0x4, 0x29, 0x10, 0xa1, 0x30, - 0x8, 0x5b, 0x56, 0x19, 0x65, 0xc5, 0x40, 0x0, - 0xa, 0x5, 0x9, 0x10, 0xa0, 0x0, 0x4, 0x6c, - 0x78, 0x49, 0x10, 0xa0, 0x60, 0x9, 0x52, 0x2, - 0x6a, 0x65, 0x55, 0x51, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, - - /* U+96D9 "雙" */ - 0x0, 0x0, 0x20, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x67, 0x92, 0x5, 0x87, 0x50, 0x0, 0x0, 0xd5, - 0x67, 0x69, 0x68, 0x69, 0x20, 0x7, 0xb0, 0xa0, - 0xf, 0xa, 0x1, 0x0, 0x13, 0xc5, 0xc7, 0x6b, - 0x5c, 0x57, 0x0, 0x0, 0xa0, 0xa2, 0x1a, 0xa, - 0x3, 0x0, 0x0, 0xc5, 0xc5, 0x2a, 0x5c, 0x55, - 0x0, 0x0, 0xc5, 0x95, 0x6b, 0x5b, 0x58, 0x30, - 0x0, 0x40, 0x0, 0x3, 0x0, 0x30, 0x0, 0x0, - 0x66, 0x95, 0x55, 0x5d, 0x80, 0x0, 0x0, 0x0, - 0x26, 0x2, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcd, 0x20, 0x0, 0x0, 0x0, 0x15, 0x65, 0x12, - 0x8a, 0x98, 0x72, 0x4, 0x30, 0x0, 0x0, 0x0, - 0x14, 0x30, - - /* U+96E2 "離" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x80, 0x10, 0x84, 0x70, 0x0, 0x6, 0x56, - 0x85, 0x91, 0xa0, 0x83, 0x0, 0x4, 0x34, 0x85, - 0x30, 0xc5, 0x66, 0x90, 0x7, 0x26, 0xb1, 0x95, - 0xb0, 0xb0, 0x0, 0x7, 0x51, 0x52, 0x95, 0xb0, - 0xb0, 0x0, 0x8, 0x57, 0x85, 0x80, 0xc5, 0xc6, - 0x60, 0x3, 0x19, 0x51, 0x60, 0xb0, 0xb0, 0x0, - 0xa, 0x3a, 0x53, 0xc0, 0xb0, 0xb0, 0x20, 0xa, - 0x65, 0x75, 0xa0, 0xd5, 0xc5, 0x40, 0xa, 0x54, - 0x13, 0xa0, 0xb0, 0xb0, 0x0, 0xa, 0x0, 0x0, - 0xa0, 0xb0, 0xb0, 0x40, 0xa, 0x0, 0x3b, 0x80, - 0xd5, 0x55, 0x50, 0x2, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, - - /* U+96E3 "難" */ - 0x0, 0x10, 0x0, 0x0, 0x40, 0x10, 0x0, 0x0, - 0xa0, 0x74, 0x3, 0xe1, 0x93, 0x0, 0x15, 0xb5, - 0x97, 0x87, 0x60, 0x35, 0x20, 0x1, 0x90, 0x73, - 0xb, 0x65, 0xa6, 0x80, 0x0, 0x8a, 0x82, 0x2e, - 0x20, 0xb0, 0x0, 0x6, 0x5c, 0x5a, 0x69, 0x20, - 0xb0, 0x0, 0x9, 0x1a, 0xa, 0x9, 0x65, 0xc6, - 0x40, 0x8, 0x5c, 0x58, 0x9, 0x20, 0xb0, 0x0, - 0x4, 0x5c, 0x58, 0x19, 0x30, 0xb2, 0x20, 0x15, - 0x5c, 0x56, 0x79, 0x64, 0xc4, 0x20, 0x1, 0x9, - 0x11, 0x9, 0x20, 0xb0, 0x0, 0x0, 0x83, 0xa, - 0x49, 0x20, 0xb0, 0x40, 0x6, 0x30, 0x1, 0x49, - 0x65, 0x65, 0x60, 0x10, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, - - /* U+96E8 "雨" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x45, 0x55, - 0x5c, 0x55, 0x55, 0x54, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x20, 0xc, 0x55, 0x5c, 0x55, 0x55, 0xe0, - 0xc, 0x26, 0xb, 0x6, 0x0, 0xc0, 0xc, 0x8, - 0x7b, 0x4, 0xb0, 0xc0, 0xc, 0x0, 0x2b, 0x0, - 0x30, 0xc0, 0xc, 0x33, 0xb, 0x3, 0x0, 0xc0, - 0xc, 0xb, 0x4b, 0x6, 0xa0, 0xc0, 0xc, 0x1, - 0x2b, 0x0, 0x50, 0xc0, 0xc, 0x0, 0xb, 0x0, - 0x45, 0xb0, 0xa, 0x0, 0x7, 0x0, 0x1b, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+96EA "雪" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x46, 0x55, 0x65, 0x55, 0xc4, 0x0, 0x0, 0x0, - 0x0, 0x73, 0x0, 0x0, 0x10, 0x4, 0x75, 0x55, - 0xa7, 0x55, 0x58, 0xb0, 0xb, 0x35, 0x53, 0x73, - 0x45, 0x44, 0x0, 0x3, 0x0, 0x0, 0x74, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x53, 0x84, 0x45, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x40, 0x0, - 0x0, 0x46, 0x55, 0x55, 0x55, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x16, - 0x55, 0x55, 0x55, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x65, 0x55, 0x55, - 0x55, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, - - /* U+96F2 "雲" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x7, - 0x55, 0x77, 0x55, 0x83, 0x0, 0x3, 0x0, 0x5, - 0x60, 0x0, 0x12, 0x2, 0xa5, 0x55, 0x89, 0x55, - 0x59, 0xb0, 0x93, 0x55, 0x35, 0x63, 0x54, 0x50, - 0x0, 0x0, 0x0, 0x57, 0x0, 0x0, 0x0, 0x0, - 0x55, 0x34, 0x44, 0x54, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x70, 0x0, 0x1, 0x65, 0x55, 0x55, - 0x55, 0x20, 0x3, 0x65, 0x55, 0x65, 0x55, 0x58, - 0x80, 0x0, 0x0, 0xa8, 0x2, 0x20, 0x0, 0x0, - 0x5, 0x71, 0x0, 0x6, 0xa1, 0x0, 0x6, 0xeb, - 0x98, 0x65, 0x57, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, - - /* U+96FB "電" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x6, - 0x55, 0x59, 0x55, 0x91, 0x0, 0x7, 0x55, 0x56, - 0xc5, 0x55, 0x69, 0x3, 0x90, 0x0, 0x1a, 0x0, - 0x5, 0x60, 0x32, 0x45, 0x42, 0xa3, 0x55, 0x30, - 0x0, 0x4, 0x54, 0x29, 0x35, 0x50, 0x0, 0x0, - 0x20, 0x0, 0x0, 0x3, 0x0, 0x0, 0xc, 0x55, - 0x6b, 0x55, 0xc3, 0x0, 0x0, 0xc5, 0x56, 0xc5, - 0x5c, 0x0, 0x0, 0xb, 0x0, 0x1a, 0x0, 0xb0, - 0x0, 0x0, 0xc5, 0x56, 0xc5, 0x5c, 0x3, 0x0, - 0x5, 0x0, 0x1a, 0x0, 0x30, 0x70, 0x0, 0x0, - 0x0, 0xe9, 0x99, 0x9d, 0x10, - - /* U+9700 "需" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x36, 0x55, 0x77, 0x55, 0x85, 0x0, 0x1, 0x65, - 0x55, 0x99, 0x55, 0x56, 0x80, 0x8, 0x40, 0x0, - 0x66, 0x0, 0x6, 0x50, 0x4, 0x4, 0x52, 0x66, - 0x45, 0x31, 0x0, 0x0, 0x5, 0x52, 0x66, 0x45, - 0x30, 0x0, 0x3, 0x55, 0x55, 0x55, 0x55, 0x5b, - 0x40, 0x1, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x85, 0x59, 0x55, 0x75, 0x5b, 0x0, 0x0, - 0xb1, 0xb, 0x0, 0xb0, 0x1a, 0x0, 0x0, 0xb1, - 0xb, 0x0, 0xb0, 0x1a, 0x0, 0x0, 0xb1, 0xb, - 0x0, 0xb0, 0x1a, 0x0, 0x0, 0xb0, 0x7, 0x0, - 0x52, 0xb8, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+9707 "震" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x26, 0x55, 0x95, 0x56, 0x80, 0x0, 0x0, 0x85, - 0x55, 0xc5, 0x55, 0x59, 0x40, 0x8, 0x50, 0x0, - 0xb0, 0x0, 0x9, 0x10, 0x3, 0x5, 0x52, 0xb0, - 0x55, 0x30, 0x0, 0x0, 0x24, 0x42, 0x80, 0x44, - 0x52, 0x0, 0x0, 0xb5, 0x55, 0x55, 0x55, 0x65, - 0x0, 0x0, 0xb0, 0x65, 0x55, 0x55, 0x90, 0x0, - 0x0, 0xc5, 0x55, 0x55, 0x55, 0x5a, 0x50, 0x0, - 0xb0, 0xb0, 0x42, 0x2, 0x80, 0x0, 0x0, 0xa0, - 0xb0, 0x8, 0x57, 0x20, 0x0, 0x6, 0x30, 0xb3, - 0x51, 0x99, 0x30, 0x0, 0x15, 0x0, 0xb6, 0x0, - 0x3, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9752 "青" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x1, 0x20, 0x6, 0x55, 0x55, - 0xd5, 0x55, 0x88, 0x0, 0x4, 0x55, 0x5d, 0x55, - 0x6a, 0x0, 0x0, 0x10, 0x0, 0xc0, 0x0, 0x2, - 0x3, 0x65, 0x55, 0x59, 0x55, 0x55, 0x96, 0x0, - 0x7, 0x55, 0x55, 0x58, 0x20, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xb1, 0x0, 0x0, 0xc, 0x55, 0x55, - 0x5c, 0x10, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xb1, - 0x0, 0x0, 0xc, 0x55, 0x55, 0x5c, 0x10, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0xc, - 0x0, 0x3, 0xae, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x1, 0x10, 0x0, - - /* U+9759 "静" */ - 0x0, 0x3, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - 0xb, 0x11, 0x1, 0xc1, 0x10, 0x0, 0x7, 0x5c, - 0x57, 0x48, 0x75, 0xd2, 0x0, 0x4, 0x5c, 0x58, - 0x36, 0x2, 0x50, 0x0, 0x1, 0xa, 0x0, 0x36, - 0x69, 0x5c, 0x10, 0x26, 0x58, 0x57, 0x80, 0xa, - 0xa, 0x0, 0x5, 0x55, 0x59, 0x35, 0x5b, 0x5c, - 0x90, 0x9, 0x10, 0xa, 0x1, 0xa, 0xa, 0x0, - 0x9, 0x65, 0x5a, 0x1, 0x1a, 0x1b, 0x0, 0x9, - 0x65, 0x5a, 0x5, 0x4b, 0x36, 0x0, 0x9, 0x10, - 0xa, 0x0, 0xa, 0x0, 0x0, 0x9, 0x10, 0xa, - 0x0, 0x9, 0x0, 0x0, 0x9, 0x14, 0xc7, 0x5, - 0xc7, 0x0, 0x0, 0x1, 0x0, 0x10, 0x0, 0x20, - 0x0, 0x0, - - /* U+975E "非" */ - 0x0, 0x0, 0x1, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0xc0, 0x0, 0x0, 0x4, 0x55, 0x5d, - 0x0, 0xd5, 0x57, 0x80, 0x0, 0x0, 0xc, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0xc0, - 0x0, 0x0, 0x1, 0x75, 0x5d, 0x0, 0xd5, 0x58, - 0x40, 0x0, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x0, 0x6, - 0x55, 0x5d, 0x0, 0xd5, 0x55, 0xb1, 0x0, 0x0, - 0xc, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x10, - 0x0, 0x0, - - /* U+9762 "面" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x6, - 0x55, 0x55, 0x75, 0x55, 0x56, 0xc1, 0x0, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x10, 0x4, - 0x30, 0x0, 0x2, 0x0, 0x0, 0xd5, 0x5b, 0x55, - 0xb5, 0x5d, 0x10, 0x0, 0xc0, 0xb, 0x0, 0xb0, - 0xc, 0x0, 0x0, 0xc0, 0xb, 0x55, 0xc0, 0xc, - 0x0, 0x0, 0xc0, 0xb, 0x0, 0xb0, 0xc, 0x0, - 0x0, 0xc0, 0xb, 0x0, 0xb0, 0xc, 0x0, 0x0, - 0xc0, 0xb, 0x55, 0xc0, 0xc, 0x0, 0x0, 0xc0, - 0xb, 0x0, 0xb0, 0xc, 0x0, 0x0, 0xd5, 0x5c, - 0x55, 0xd5, 0x5d, 0x0, 0x0, 0xb0, 0x0, 0x0, - 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9769 "革" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0x0, 0x38, 0x1, 0x0, 0x1, 0x65, - 0x5c, 0x55, 0x6a, 0x59, 0x50, 0x0, 0x0, 0x1b, - 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x5a, - 0x65, 0x0, 0x0, 0x0, 0x3, 0x0, 0xc, 0x0, - 0x30, 0x0, 0x0, 0xd, 0x55, 0x5d, 0x55, 0xb4, - 0x0, 0x0, 0xc, 0x0, 0xc, 0x0, 0x92, 0x0, - 0x0, 0xc, 0x55, 0x5d, 0x55, 0x91, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x50, 0x6, 0x55, - 0x55, 0x5d, 0x55, 0x56, 0x71, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+9774 "靴" */ - 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb0, 0x84, 0x5, 0x8a, 0x10, 0x0, 0x16, 0xb5, - 0xa9, 0x49, 0x3b, 0x0, 0x0, 0x0, 0xa0, 0x82, - 0xb, 0xa, 0x4, 0x50, 0x1, 0xaa, 0x82, 0x28, - 0xa, 0xb, 0x20, 0x5, 0x5c, 0x57, 0x7b, 0xa, - 0x55, 0x0, 0x9, 0x1a, 0xb, 0x4a, 0xa, 0x80, - 0x0, 0x9, 0x1a, 0xb, 0xa, 0xd, 0x10, 0x0, - 0x8, 0x5c, 0x57, 0xa, 0x5a, 0x10, 0x0, 0x0, - 0xa, 0x4, 0x1a, 0x9, 0x10, 0x0, 0x26, 0x5c, - 0x55, 0x2a, 0x9, 0x10, 0x40, 0x0, 0xb, 0x0, - 0xa, 0x9, 0x10, 0x70, 0x0, 0xb, 0x0, 0xb, - 0x6, 0xba, 0xc0, 0x0, 0x4, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+97F3 "音" */ - 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x65, - 0x55, 0x87, 0x55, 0x98, 0x0, 0x0, 0x0, 0x53, - 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, - 0x84, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x70, - 0x5, 0x70, 0x26, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x50, 0x0, 0x7, 0x55, 0x55, 0x56, 0xa0, 0x0, - 0x0, 0x9, 0x20, 0x0, 0x2, 0x90, 0x0, 0x0, - 0x9, 0x65, 0x55, 0x56, 0x90, 0x0, 0x0, 0x9, - 0x20, 0x0, 0x2, 0x90, 0x0, 0x0, 0xa, 0x65, - 0x55, 0x56, 0xa0, 0x0, 0x0, 0x9, 0x20, 0x0, - 0x2, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+97FF "響" */ - 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x2, - 0xa0, 0x66, 0x76, 0x54, 0x71, 0x1, 0x71, 0x49, - 0x0, 0xa9, 0x18, 0x0, 0xa6, 0x93, 0xa5, 0x5a, - 0x95, 0x0, 0x2, 0x62, 0x9a, 0x57, 0x59, 0x8, - 0x0, 0x46, 0x93, 0xa6, 0x67, 0x94, 0xa1, 0x0, - 0x67, 0x4, 0x71, 0x18, 0x14, 0x0, 0x46, 0x55, - 0x57, 0x76, 0x5a, 0x0, 0x0, 0x0, 0x47, 0x2, - 0xa0, 0x1, 0x0, 0x65, 0x55, 0x65, 0x75, 0x55, - 0x91, 0x0, 0xa, 0x55, 0x55, 0x5b, 0x20, 0x0, - 0x0, 0xa5, 0x55, 0x55, 0xc0, 0x0, 0x0, 0xa, - 0x55, 0x55, 0x5c, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x20, 0x0, - - /* U+9803 "頃" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x46, 0x57, 0x55, 0xa3, 0xd, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0xb0, 0x0, 0x8, 0x67, - 0x55, 0xb0, 0xb, 0x0, 0x10, 0xb0, 0x0, 0xb, - 0x0, 0xc5, 0x65, 0xc, 0x55, 0x55, 0xb0, 0xb, - 0x0, 0x0, 0xb0, 0x0, 0xb, 0x0, 0xb0, 0x0, - 0xc, 0x55, 0x55, 0xb0, 0xb, 0x0, 0x20, 0xb0, - 0x0, 0xb, 0x0, 0xb2, 0x82, 0xd, 0x55, 0x55, - 0xb0, 0x1f, 0xa0, 0x0, 0x1a, 0x23, 0x20, 0x0, - 0x40, 0x0, 0x7, 0x70, 0xa, 0x50, 0x0, 0x0, - 0x5, 0x30, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+9805 "項" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x46, 0x56, 0x55, 0xb3, 0x5, 0x67, - 0x77, 0x0, 0xc, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x7, 0x68, 0x55, 0x90, 0x0, 0xb, 0x0, 0xc, - 0x0, 0x0, 0xb0, 0x0, 0xb, 0x0, 0xd, 0x55, - 0x55, 0xb0, 0x0, 0xb, 0x0, 0xb, 0x0, 0x0, - 0xb0, 0x0, 0xb, 0x0, 0xc, 0x55, 0x55, 0xb0, - 0x0, 0xb, 0x3, 0xb, 0x0, 0x0, 0xb0, 0x0, - 0x5d, 0x61, 0xd, 0x55, 0x55, 0xb0, 0x1e, 0x70, - 0x0, 0x2, 0x82, 0x31, 0x10, 0x0, 0x0, 0x0, - 0x6, 0x80, 0xa, 0x40, 0x0, 0x0, 0x0, 0x54, - 0x0, 0x1, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9808 "須" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa1, 0x45, 0x56, 0x55, 0xb3, 0x0, 0x8, - 0x70, 0x0, 0xc, 0x0, 0x0, 0x0, 0x66, 0x0, - 0x7, 0x68, 0x55, 0x90, 0x5, 0x20, 0x10, 0xb, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x98, 0xc, 0x55, - 0x55, 0xb0, 0x0, 0x7, 0x80, 0xb, 0x0, 0x0, - 0xb0, 0x0, 0x64, 0x0, 0xc, 0x55, 0x55, 0xb0, - 0x3, 0x0, 0x7, 0xb, 0x0, 0x0, 0xb0, 0x0, - 0x0, 0x6b, 0x1d, 0x55, 0x55, 0xb0, 0x0, 0x6, - 0x80, 0x2, 0x61, 0x31, 0x10, 0x0, 0x64, 0x0, - 0x5, 0xa1, 0xa, 0x40, 0x2, 0x0, 0x0, 0x56, - 0x0, 0x1, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9817 "頗" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x26, 0x55, 0x55, 0xb3, 0x0, 0x0, - 0xa0, 0x0, 0xc, 0x10, 0x0, 0x2, 0xa4, 0xc5, - 0xa5, 0x5a, 0x55, 0x91, 0x1, 0x90, 0xa5, 0x2b, - 0x0, 0x0, 0xb0, 0x1, 0x90, 0xa2, 0xb, 0x55, - 0x55, 0xc0, 0x1, 0xb5, 0x98, 0x6a, 0x0, 0x0, - 0xb0, 0x2, 0x80, 0x8, 0x1a, 0x55, 0x55, 0xc0, - 0x4, 0x65, 0x1a, 0xa, 0x0, 0x0, 0xb0, 0x5, - 0x30, 0xb6, 0xb, 0x55, 0x55, 0xc0, 0x7, 0x3, - 0x9c, 0x3, 0x63, 0x21, 0x20, 0x6, 0x27, 0x7, - 0x13, 0xb1, 0x9, 0x50, 0x12, 0x30, 0x0, 0x37, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x10, - - /* U+9818 "領" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x10, 0x56, 0x56, 0x55, 0xb3, 0x0, 0x2c, - 0x50, 0x0, 0xc, 0x0, 0x0, 0x0, 0x83, 0x68, - 0x7, 0x68, 0x55, 0x90, 0x1, 0x92, 0xa, 0x4b, - 0x0, 0x0, 0xb0, 0x7, 0x16, 0x51, 0xc, 0x55, - 0x55, 0xb0, 0x22, 0x0, 0x70, 0xb, 0x0, 0x0, - 0xb0, 0x2, 0x65, 0x5d, 0x2b, 0x55, 0x55, 0xb0, - 0x0, 0x0, 0x47, 0xb, 0x0, 0x0, 0xb0, 0x1, - 0x20, 0x80, 0xc, 0x55, 0x55, 0xb0, 0x0, 0x6a, - 0x20, 0x2, 0x82, 0x22, 0x10, 0x0, 0x9, 0x80, - 0x6, 0x80, 0x8, 0x60, 0x0, 0x0, 0x60, 0x54, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+982D "頭" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x36, 0x55, 0x55, 0xb1, 0x16, 0x55, - 0x55, 0x20, 0xc, 0x0, 0x0, 0x2, 0x0, 0x4, - 0x6, 0x57, 0x44, 0x80, 0xa, 0x65, 0x5d, 0xc, - 0x0, 0x0, 0xb0, 0xa, 0x10, 0xb, 0xc, 0x55, - 0x55, 0xb0, 0xa, 0x55, 0x5b, 0xb, 0x0, 0x0, - 0xb0, 0x4, 0x0, 0x12, 0xb, 0x55, 0x55, 0xb0, - 0x3, 0x20, 0x67, 0xb, 0x0, 0x0, 0xb0, 0x0, - 0xc0, 0x90, 0xc, 0x55, 0x55, 0xb0, 0x0, 0x60, - 0x73, 0x12, 0x82, 0x13, 0x10, 0x2c, 0xa8, 0x41, - 0x6, 0x90, 0x6, 0x80, 0x2, 0x0, 0x0, 0x55, - 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+983C "頼" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x20, 0x36, 0x56, 0x55, 0xb1, 0x1, 0x1b, - 0x16, 0x10, 0xc, 0x10, 0x0, 0x5, 0x3b, 0x33, - 0x26, 0x59, 0x55, 0x90, 0x3, 0x1a, 0x14, 0xc, - 0x0, 0x0, 0xb0, 0xa, 0x4b, 0x4c, 0x1b, 0x55, - 0x55, 0xb0, 0xa, 0xa, 0xb, 0xb, 0x0, 0x0, - 0xb0, 0xa, 0x5d, 0x5c, 0xb, 0x55, 0x55, 0xb0, - 0x2, 0x5f, 0x41, 0xb, 0x0, 0x0, 0xb0, 0x0, - 0xab, 0x3b, 0xb, 0x55, 0x55, 0xb0, 0x6, 0x3a, - 0x6, 0x52, 0x83, 0x14, 0x10, 0x24, 0xa, 0x0, - 0x5, 0x90, 0x6, 0x90, 0x0, 0xa, 0x0, 0x45, - 0x0, 0x0, 0xb2, 0x0, 0x1, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+984C "題" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x75, 0x5b, 0x36, 0x55, 0x57, 0x90, 0x4, 0x50, - 0xa, 0x0, 0x9, 0x0, 0x0, 0x4, 0x85, 0x5a, - 0x7, 0x67, 0x5b, 0x0, 0x5, 0x51, 0x1a, 0xa, - 0x0, 0xa, 0x0, 0x4, 0x64, 0x46, 0xa, 0x55, - 0x5a, 0x0, 0x5, 0x55, 0x57, 0x7a, 0x55, 0x5a, - 0x0, 0x3, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, - 0x8, 0x3a, 0x3, 0x1a, 0x55, 0x58, 0x0, 0x9, - 0x1a, 0x55, 0x21, 0xc0, 0x44, 0x0, 0x9, 0x5a, - 0x0, 0x8, 0x20, 0xa, 0x40, 0x7, 0xb, 0x30, - 0x30, 0x0, 0x1, 0x20, 0x41, 0x0, 0x7b, 0xbb, - 0xcc, 0xde, 0x80, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9854 "顔" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x40, 0x36, 0x56, 0x55, 0xb1, 0x5, 0x66, - 0x79, 0x60, 0xc, 0x10, 0x0, 0x0, 0x71, 0x39, - 0x7, 0x59, 0x55, 0xa0, 0x1, 0x36, 0x60, 0x1c, - 0x0, 0x0, 0xa0, 0xa, 0x55, 0x66, 0x6b, 0x55, - 0x55, 0xa0, 0xa, 0x0, 0x2a, 0xb, 0x0, 0x0, - 0xa0, 0xa, 0x5, 0x71, 0xb, 0x55, 0x55, 0xa0, - 0xa, 0x20, 0x1b, 0x4b, 0x0, 0x0, 0xa0, 0x9, - 0x3, 0x82, 0xb, 0x55, 0x55, 0xa0, 0x8, 0x22, - 0x6, 0xb1, 0x93, 0x24, 0x0, 0x15, 0x1, 0x87, - 0x5, 0x90, 0x7, 0x80, 0x40, 0x45, 0x0, 0x45, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+9858 "願" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0x55, 0x59, 0x76, 0x57, 0x55, 0xb1, 0xa, 0x0, - 0x90, 0x0, 0xc, 0x10, 0x0, 0xa, 0x23, 0x32, - 0x15, 0x48, 0x44, 0x90, 0xa, 0x58, 0x59, 0x4b, - 0x11, 0x11, 0xc0, 0xa, 0x57, 0x59, 0x2b, 0x55, - 0x55, 0xb0, 0xa, 0x54, 0x7, 0x2b, 0x0, 0x0, - 0xb0, 0xa, 0x57, 0x99, 0x2b, 0x55, 0x55, 0xb0, - 0x8, 0x10, 0xa0, 0xb, 0x0, 0x0, 0xb0, 0x7, - 0x85, 0xa6, 0x1b, 0x55, 0x55, 0xb0, 0x33, 0x70, - 0xa2, 0xa1, 0x83, 0x14, 0x10, 0x24, 0x22, 0xb0, - 0x54, 0x90, 0x6, 0x90, 0x0, 0xa, 0x70, 0x36, - 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+985E "類" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x9, 0x35, 0x26, 0x56, 0x55, 0xb1, 0x2, 0xa9, - 0x2a, 0x0, 0xc, 0x20, 0x0, 0x0, 0x39, 0x73, - 0x45, 0x49, 0x44, 0x90, 0x26, 0xaf, 0xb6, 0x4b, - 0x10, 0x0, 0xb0, 0x3, 0x89, 0x3b, 0x3b, 0x55, - 0x55, 0xb0, 0x34, 0x9, 0x32, 0x3a, 0x0, 0x0, - 0xb0, 0x0, 0x6, 0x4b, 0xa, 0x55, 0x55, 0xb0, - 0x12, 0x29, 0x55, 0x6a, 0x0, 0x0, 0xb0, 0x14, - 0x3d, 0x33, 0x3b, 0x55, 0x55, 0xb0, 0x0, 0x2a, - 0x78, 0x1, 0x84, 0x14, 0x10, 0x0, 0xa1, 0x7, - 0x54, 0xa0, 0x6, 0x90, 0x6, 0x10, 0x0, 0x36, - 0x0, 0x0, 0xb1, 0x10, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+986F "顯" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0x55, 0x59, 0x56, 0x57, 0x58, 0x70, 0xa, 0x0, - 0xa, 0x0, 0xc, 0x0, 0x0, 0xa, 0x55, 0x5c, - 0x6, 0x68, 0x59, 0x30, 0xa, 0x55, 0x5a, 0xb, - 0x0, 0x9, 0x10, 0x2, 0x80, 0x17, 0xa, 0x55, - 0x5b, 0x10, 0x6, 0x34, 0x74, 0x5a, 0x0, 0x9, - 0x10, 0x28, 0x91, 0x8a, 0x1a, 0x55, 0x5b, 0x10, - 0x27, 0x54, 0x64, 0x4a, 0x0, 0x9, 0x10, 0x36, - 0x39, 0x63, 0x7a, 0x55, 0x5b, 0x10, 0x3, 0x31, - 0x54, 0x21, 0x92, 0x24, 0x0, 0x19, 0x37, 0xa2, - 0xa3, 0x90, 0x8, 0x60, 0x33, 0x2, 0x10, 0x36, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+98A8 "風" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x86, 0x55, 0x55, 0x55, 0xd0, 0x0, 0x0, 0x82, - 0x0, 0x4, 0x92, 0xb0, 0x0, 0x0, 0x84, 0x57, - 0xd5, 0x20, 0xb0, 0x0, 0x0, 0x82, 0x0, 0xb0, - 0x0, 0xb0, 0x0, 0x0, 0x82, 0xa5, 0xc5, 0xc1, - 0xb0, 0x0, 0x0, 0x82, 0xb0, 0xb0, 0xb0, 0xb0, - 0x0, 0x0, 0x82, 0xb0, 0xb0, 0xb0, 0xb0, 0x0, - 0x0, 0x91, 0xa5, 0xc5, 0x90, 0xb0, 0x0, 0x0, - 0xb0, 0x0, 0xb0, 0x60, 0xc0, 0x0, 0x0, 0xa0, - 0x0, 0xb4, 0x7a, 0x93, 0x50, 0x6, 0x49, 0xc9, - 0x63, 0xb, 0x3c, 0x90, 0x16, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xd0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, - - /* U+98DB "飛" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x65, 0x55, 0x55, 0xc6, 0x3, 0x0, 0x0, 0x0, - 0x73, 0x90, 0xa4, 0x88, 0x0, 0x0, 0x2b, 0x51, - 0xa0, 0x98, 0x52, 0x0, 0x3, 0x3a, 0x0, 0xa0, - 0x5a, 0xa, 0x31, 0x0, 0xa, 0x0, 0xa0, 0xb, - 0x50, 0x61, 0x15, 0x5c, 0x55, 0xb5, 0xa2, 0x78, - 0xc5, 0x1, 0xa, 0x0, 0xa0, 0xb0, 0x12, 0x11, - 0x0, 0xb, 0x0, 0xa0, 0xb6, 0x73, 0x0, 0x0, - 0xa, 0x0, 0xa0, 0xb1, 0xa6, 0x0, 0x0, 0x45, - 0x0, 0xa0, 0x76, 0x5, 0x13, 0x0, 0x80, 0x0, - 0xa0, 0xb, 0x60, 0x53, 0x15, 0x0, 0x1, 0x50, - 0x0, 0x6b, 0xd5, - - /* U+98DF "食" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4c, 0x7, 0x10, 0x0, 0x0, 0x0, 0x3, 0xb1, - 0x71, 0x96, 0x0, 0x0, 0x0, 0x59, 0x0, 0x58, - 0x8, 0xd9, 0x60, 0x16, 0x39, 0x65, 0x56, 0x5d, - 0x28, 0x40, 0x0, 0x9, 0x20, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x9, 0x65, 0x55, 0x5c, 0x0, 0x0, - 0x0, 0x9, 0x65, 0x55, 0x5c, 0x0, 0x0, 0x0, - 0x9, 0x22, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x9, - 0x20, 0x68, 0x66, 0x0, 0x0, 0x0, 0xa, 0x34, - 0x52, 0x8c, 0x50, 0x0, 0x0, 0xb, 0xb3, 0x0, - 0x3, 0xe2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+98EF "飯" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x60, 0x1, 0x1, 0x5b, 0x60, 0x0, 0x1b, - 0x66, 0xb, 0x54, 0x31, 0x0, 0x0, 0x84, 0x6, - 0x8b, 0x0, 0x0, 0x0, 0x4, 0x41, 0xa0, 0x2b, - 0x0, 0x0, 0x0, 0x13, 0xa5, 0x6a, 0x2b, 0x65, - 0x58, 0x90, 0x0, 0xa0, 0xa, 0xb, 0x30, 0x7, - 0x30, 0x0, 0xc5, 0x5c, 0xb, 0x4, 0xa, 0x0, - 0x0, 0xc5, 0x5c, 0xb, 0x6, 0x27, 0x0, 0x0, - 0xa0, 0x42, 0xa, 0x5, 0xb0, 0x0, 0x0, 0xa0, - 0x4a, 0x18, 0x6, 0xb0, 0x0, 0x0, 0xc9, 0x4a, - 0x51, 0x37, 0x49, 0x0, 0x0, 0xa1, 0x0, 0x52, - 0x50, 0x8, 0xb1, 0x0, 0x0, 0x2, 0x2, 0x0, - 0x0, 0x30, - - /* U+98F2 "飲" */ - 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x8, 0x70, 0x0, 0xc2, 0x0, 0x0, 0x0, 0xb, - 0x65, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x84, 0x7, - 0x85, 0x95, 0x58, 0x60, 0x3, 0x41, 0xa0, 0x29, - 0x10, 0x9, 0x30, 0x13, 0x95, 0x7a, 0x44, 0x4a, - 0x7, 0x0, 0x0, 0xa0, 0xa, 0x20, 0x59, 0x11, - 0x0, 0x0, 0xc5, 0x5c, 0x0, 0x69, 0x0, 0x0, - 0x0, 0xc5, 0x5c, 0x0, 0x97, 0x0, 0x0, 0x0, - 0xa0, 0x42, 0x0, 0xb1, 0x60, 0x0, 0x0, 0xa0, - 0x5b, 0x3, 0x80, 0xa1, 0x0, 0x1, 0xe9, 0x18, - 0x8, 0x0, 0x3c, 0x10, 0x0, 0x50, 0x0, 0x50, - 0x0, 0x5, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9928 "館" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x8, 0x70, 0x0, 0x7, 0x60, 0x0, 0x0, 0xc, - 0x74, 0x8, 0x56, 0xa5, 0x93, 0x0, 0x85, 0xa, - 0xb6, 0x0, 0x0, 0x90, 0x3, 0x53, 0x80, 0x23, - 0x11, 0x16, 0x10, 0x14, 0x85, 0x79, 0x19, 0x64, - 0x4c, 0x10, 0x0, 0xa0, 0xa, 0x9, 0x20, 0xb, - 0x0, 0x0, 0xb5, 0x5b, 0x9, 0x65, 0x59, 0x0, - 0x0, 0xa1, 0x1b, 0x9, 0x20, 0x2, 0x30, 0x0, - 0xb3, 0x65, 0x9, 0x65, 0x58, 0x80, 0x0, 0xa0, - 0x4a, 0x9, 0x20, 0x5, 0x50, 0x1, 0xd9, 0x4a, - 0x9, 0x65, 0x58, 0x60, 0x0, 0x80, 0x0, 0x9, - 0x20, 0x4, 0x30, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, - - /* U+9996 "首" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x84, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0x0, 0x81, 0x0, 0x30, 0x16, 0x55, 0x58, - 0xb5, 0x75, 0x57, 0x91, 0x0, 0x0, 0x2, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xa, 0x57, 0x65, 0x56, - 0xc0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x1, 0xa0, - 0x0, 0x0, 0xc, 0x55, 0x55, 0x56, 0xa0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, - 0xc, 0x55, 0x55, 0x56, 0xa0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, 0xc, 0x55, - 0x55, 0x56, 0xa0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x1, 0xa0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9999 "香" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x35, 0x8b, 0xc3, 0x0, 0x0, 0x4, - 0x55, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x1, 0x80, 0x4, 0x55, 0x58, 0xdd, - 0x95, 0x55, 0x51, 0x0, 0x0, 0x2b, 0x1c, 0x18, - 0x10, 0x0, 0x0, 0x5, 0x90, 0xd, 0x1, 0xb9, - 0x30, 0x1, 0x64, 0x75, 0x57, 0x55, 0xa6, 0xc4, - 0x3, 0x0, 0xb0, 0x0, 0x0, 0xb0, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, - 0xc5, 0x55, 0x55, 0xa0, 0x0, 0x0, 0x0, 0xb0, - 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, 0xc5, 0x55, - 0x55, 0xb0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+99C4 "駄" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x2, - 0xa5, 0x85, 0x80, 0xb, 0x20, 0x0, 0x1, 0xa0, - 0xa0, 0x0, 0xa, 0x0, 0x0, 0x1, 0xb5, 0xc6, - 0x60, 0xa, 0x0, 0x10, 0x1, 0xa0, 0xa0, 0x26, - 0x5c, 0x65, 0x91, 0x1, 0xb5, 0xc5, 0x40, 0xa, - 0x50, 0x0, 0x1, 0xa0, 0xa0, 0x30, 0x9, 0x60, - 0x0, 0x1, 0xb4, 0x54, 0xd1, 0x37, 0x70, 0x0, - 0x0, 0x21, 0x40, 0xb0, 0x72, 0x81, 0x0, 0x4, - 0x66, 0x85, 0xb0, 0xa0, 0x47, 0x0, 0xa, 0x82, - 0x42, 0x93, 0x82, 0xc, 0x0, 0x14, 0x1, 0x8, - 0x69, 0xa, 0x27, 0x90, 0x0, 0x0, 0x8c, 0x61, - 0x3, 0x10, 0xc4, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+99C5 "駅" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, - 0xa5, 0x95, 0x86, 0x65, 0x55, 0xc0, 0x1, 0x90, - 0xb0, 0x16, 0x40, 0x0, 0xb0, 0x1, 0xb5, 0xc6, - 0x56, 0x40, 0x0, 0xb0, 0x1, 0x90, 0xb0, 0x16, - 0x40, 0x0, 0xb0, 0x1, 0xb5, 0xc5, 0x46, 0x88, - 0x55, 0xa0, 0x1, 0x90, 0xb0, 0x26, 0x45, 0x0, - 0x0, 0x1, 0xb4, 0x54, 0xd7, 0x34, 0x30, 0x0, - 0x0, 0x11, 0x40, 0xb8, 0x10, 0x80, 0x0, 0x4, - 0x64, 0x77, 0xb9, 0x0, 0xa0, 0x0, 0xa, 0x73, - 0x53, 0x98, 0x0, 0x49, 0x0, 0x14, 0x0, 0x8, - 0x83, 0x0, 0xb, 0x80, 0x0, 0x0, 0x7c, 0x60, - 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9A12 "騒" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x85, 0x76, 0x74, 0x65, 0x56, 0xb0, 0x1, 0xa0, - 0xb0, 0x0, 0x51, 0x9, 0x40, 0x1, 0xb5, 0xc7, - 0x40, 0x9, 0x3a, 0x0, 0x1, 0xa0, 0xb0, 0x0, - 0x4, 0xf2, 0x0, 0x1, 0xb5, 0xc7, 0x40, 0x58, - 0x5c, 0x83, 0x1, 0xa0, 0xb0, 0x14, 0x20, 0xc0, - 0x51, 0x2, 0xb4, 0x74, 0xd6, 0x85, 0xc5, 0xc0, - 0x0, 0x1, 0x30, 0xb5, 0x60, 0xb0, 0xb0, 0x3, - 0x66, 0x85, 0xa5, 0x95, 0xc5, 0xc0, 0xa, 0x65, - 0x43, 0x82, 0x20, 0xb2, 0x30, 0x14, 0x0, 0x6, - 0x50, 0x0, 0xb3, 0xb2, 0x0, 0x3, 0x9c, 0x1c, - 0xb8, 0x63, 0x28, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9A13 "験" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x1, - 0x85, 0x77, 0x50, 0x1e, 0x10, 0x0, 0x1, 0x90, - 0xb0, 0x0, 0x93, 0x70, 0x0, 0x1, 0xb5, 0xc7, - 0x24, 0x70, 0x2b, 0x51, 0x1, 0x90, 0xb0, 0x37, - 0x68, 0x6a, 0x82, 0x1, 0xb5, 0xc7, 0x20, 0xa, - 0x11, 0x0, 0x1, 0x90, 0xb0, 0x1b, 0x5c, 0x5b, - 0x40, 0x2, 0xa4, 0x66, 0x9b, 0xa, 0x19, 0x10, - 0x0, 0x1, 0x43, 0x7b, 0x5c, 0x5b, 0x10, 0x7, - 0x66, 0x88, 0x66, 0xb, 0x14, 0x0, 0x2b, 0x73, - 0x36, 0x40, 0x28, 0x70, 0x0, 0x11, 0x0, 0x9, - 0x21, 0xa0, 0x59, 0x0, 0x0, 0x2, 0xaa, 0x37, - 0x0, 0x6, 0xd3, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+9A57 "驗" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, - 0x85, 0x68, 0x40, 0xd, 0x30, 0x0, 0x1, 0x90, - 0xa0, 0x0, 0x64, 0x80, 0x0, 0x1, 0xb5, 0xc8, - 0x12, 0x80, 0x2a, 0x10, 0x1, 0x90, 0xa0, 0x18, - 0x65, 0x5b, 0xc5, 0x1, 0xb5, 0xc7, 0x31, 0x1, - 0x10, 0x20, 0x1, 0x90, 0xa0, 0xc, 0x77, 0xb5, - 0xc0, 0x1, 0xb4, 0x77, 0x8a, 0x35, 0xa0, 0xa0, - 0x0, 0x20, 0x34, 0x5c, 0x76, 0xb5, 0xb0, 0x4, - 0x56, 0x4b, 0x56, 0x81, 0x46, 0x40, 0xa, 0x82, - 0x37, 0x44, 0x80, 0xc, 0x0, 0x14, 0x0, 0xa, - 0x19, 0x63, 0x48, 0x60, 0x0, 0x2, 0x9a, 0x53, - 0x8, 0x70, 0x81, 0x0, 0x0, 0x0, 0x10, 0x2, - 0x0, 0x0, - - /* U+9AD4 "體" */ - 0x0, 0x0, 0x0, 0x0, 0x11, 0x20, 0x0, 0x0, - 0x85, 0x5a, 0x0, 0x46, 0xb1, 0x0, 0x0, 0xa2, - 0x1a, 0x7, 0x89, 0xc6, 0xa0, 0x0, 0xca, 0x5a, - 0xb, 0x46, 0xa2, 0x90, 0x2, 0xa7, 0x3a, 0x1b, - 0x78, 0xc6, 0x90, 0xb, 0x66, 0x57, 0x9b, 0x78, - 0xc6, 0x90, 0x25, 0x85, 0x5b, 0x5, 0x0, 0x1, - 0x60, 0x0, 0xb0, 0xa, 0x26, 0x55, 0x56, 0x51, - 0x0, 0xc5, 0x5a, 0x7, 0x75, 0x5a, 0x60, 0x0, - 0xb0, 0xa, 0x6, 0x52, 0x28, 0x40, 0x0, 0xc5, - 0x5a, 0x5, 0x73, 0x59, 0x20, 0x0, 0xb0, 0xa, - 0x0, 0x83, 0x64, 0x0, 0x0, 0xb2, 0x99, 0x45, - 0x66, 0x95, 0xb2, 0x0, 0x20, 0x0, 0x10, 0x0, - 0x0, 0x0, - - /* U+9AD8 "高" */ - 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0x20, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x69, 0x0, 0x3, 0x65, 0x55, 0x59, - 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, 0xb0, 0x0, - 0x0, 0x4, 0x95, 0x55, 0x5c, 0x0, 0x0, 0x0, - 0x32, 0x0, 0x0, 0x50, 0x10, 0x0, 0xc5, 0x55, - 0x55, 0x55, 0x5d, 0x30, 0xb, 0x6, 0x55, 0x59, - 0x30, 0xc0, 0x0, 0xb0, 0x91, 0x0, 0x91, 0xc, - 0x0, 0xb, 0x9, 0x65, 0x5b, 0x20, 0xc0, 0x0, - 0xb0, 0x70, 0x0, 0x61, 0xc, 0x0, 0xb, 0x0, - 0x0, 0x0, 0x39, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, - - /* U+9AEA "髪" */ - 0x0, 0x20, 0x0, 0x30, 0x0, 0x20, 0x0, 0x0, - 0xa5, 0x55, 0x50, 0x5, 0xb3, 0x0, 0x0, 0xa5, - 0x56, 0x44, 0x73, 0x4, 0x0, 0x0, 0xa5, 0x56, - 0x50, 0x3, 0xa6, 0x0, 0x6, 0xa8, 0x55, 0x86, - 0x53, 0x3, 0x40, 0x0, 0x58, 0x16, 0x20, 0x3, - 0x98, 0x30, 0x6, 0xc7, 0x55, 0x84, 0x64, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x7, 0x20, - 0x16, 0x55, 0x8b, 0x55, 0x55, 0x55, 0x30, 0x0, - 0x1, 0xb8, 0x55, 0x5d, 0x40, 0x0, 0x0, 0x1a, - 0x23, 0x42, 0xb4, 0x0, 0x0, 0x3, 0x70, 0x1, - 0xad, 0x50, 0x0, 0x0, 0x22, 0x4, 0x66, 0x10, - 0x5b, 0xa8, 0x60, 0x1, 0x30, 0x0, 0x0, 0x0, - 0x3, 0x0, - - /* U+9B5A "魚" */ - 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xd5, 0x0, 0x10, 0x0, 0x0, 0x0, 0xa7, - 0x55, 0xab, 0x0, 0x0, 0x0, 0x83, 0x0, 0x19, - 0x0, 0x0, 0x0, 0x7b, 0x55, 0x5a, 0x55, 0x6d, - 0x1, 0x50, 0xb0, 0x0, 0xc0, 0x2, 0xa0, 0x0, - 0xb, 0x55, 0x5d, 0x55, 0x7a, 0x0, 0x0, 0xb0, - 0x0, 0xc0, 0x2, 0xa0, 0x0, 0xb, 0x0, 0xc, - 0x0, 0x2a, 0x0, 0x0, 0xb5, 0x55, 0x55, 0x56, - 0x70, 0x0, 0x12, 0x22, 0x4, 0x20, 0x53, 0x0, - 0xb, 0x0, 0xc0, 0xd, 0x10, 0xc6, 0x9, 0x80, - 0xb, 0x10, 0x82, 0x2, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+9CE5 "鳥" */ - 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x50, 0x0, 0x0, 0x0, 0x0, 0xa, - 0x58, 0x55, 0x5b, 0x20, 0x0, 0x0, 0xb, 0x0, - 0x0, 0xb, 0x0, 0x0, 0x0, 0xc, 0x55, 0x55, - 0x5c, 0x0, 0x0, 0x0, 0xc, 0x55, 0x55, 0x5c, - 0x0, 0x0, 0x0, 0xc, 0x55, 0x55, 0x55, 0x56, - 0xa0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0xb, 0x55, 0x55, 0x55, 0x5b, 0x50, 0x0, - 0x11, 0x2, 0x30, 0x73, 0xb, 0x10, 0x0, 0x60, - 0xa0, 0xa4, 0x1d, 0xc, 0x0, 0x5, 0x80, 0xa1, - 0x24, 0x13, 0x1c, 0x0, 0x6, 0x10, 0x10, 0x0, - 0x29, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x30, 0x0, - - /* U+9E97 "麗" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x4, - 0x65, 0x56, 0x64, 0x65, 0x56, 0x40, 0x0, 0xb5, - 0x5c, 0x10, 0xb5, 0x5b, 0x0, 0x0, 0xb2, 0x5b, - 0x0, 0xb8, 0x1a, 0x0, 0x0, 0x90, 0x28, 0x56, - 0x92, 0xa, 0x0, 0x0, 0x96, 0x59, 0x56, 0x95, - 0x57, 0x50, 0x0, 0x96, 0x5b, 0x65, 0xb5, 0x58, - 0x10, 0x0, 0x92, 0x9, 0x10, 0x90, 0xa, 0x0, - 0x0, 0xa6, 0x86, 0x55, 0xa7, 0x59, 0x0, 0x0, - 0xc0, 0xa1, 0x2, 0x90, 0x18, 0x0, 0x0, 0xa0, - 0xa5, 0x55, 0x96, 0x74, 0x30, 0x2, 0x60, 0xa1, - 0x43, 0x90, 0x0, 0x60, 0x7, 0x0, 0xb9, 0x20, - 0x6b, 0xaa, 0xd1, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9EBC "麼" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x1, 0xc0, 0x0, 0x21, 0x0, 0xc5, 0x56, - 0x57, 0x56, 0x58, 0x60, 0xb, 0x0, 0xa1, 0x0, - 0xa2, 0x0, 0x0, 0xb5, 0x6d, 0x74, 0x6d, 0x67, - 0x40, 0xb, 0x4, 0xf6, 0x14, 0xf6, 0x10, 0x0, - 0xa2, 0x7a, 0x16, 0x7a, 0x1b, 0x60, 0xa, 0x40, - 0x81, 0x50, 0x60, 0x12, 0x0, 0x90, 0x3, 0x95, - 0x5, 0x20, 0x0, 0x27, 0x1b, 0x96, 0x49, 0xa3, - 0x0, 0x4, 0x30, 0x41, 0x37, 0x20, 0x50, 0x0, - 0x70, 0x5, 0x75, 0x34, 0x59, 0x70, 0x4, 0x0, - 0xc9, 0x64, 0x20, 0xa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+9EC4 "黄" */ - 0x0, 0x0, 0x21, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x56, 0x0, 0xb2, 0x1, 0x0, 0x0, 0x65, - 0x98, 0x55, 0xc5, 0x5a, 0x20, 0x0, 0x0, 0x54, - 0x0, 0xb0, 0x0, 0x20, 0x26, 0x55, 0x77, 0x75, - 0x95, 0x56, 0xa1, 0x0, 0x2, 0x0, 0x91, 0x0, - 0x30, 0x0, 0x0, 0xd, 0x55, 0xb6, 0x55, 0xc2, - 0x0, 0x0, 0xc, 0x0, 0x91, 0x0, 0xb0, 0x0, - 0x0, 0xd, 0x55, 0xb6, 0x55, 0xc0, 0x0, 0x0, - 0xc, 0x0, 0x91, 0x0, 0xb0, 0x0, 0x0, 0xb, - 0x88, 0x55, 0x96, 0x90, 0x0, 0x0, 0x4, 0xd5, - 0x0, 0x7, 0xa3, 0x0, 0x0, 0x77, 0x0, 0x0, - 0x0, 0x3e, 0x20, 0x4, 0x10, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+9ED2 "黒" */ - 0x1, 0x95, 0x55, 0x65, 0x55, 0xa0, 0x0, 0x1a, - 0x0, 0xb, 0x0, 0xb, 0x0, 0x1, 0xc5, 0x55, - 0xc5, 0x55, 0xb0, 0x0, 0x1a, 0x0, 0xb, 0x0, - 0xb, 0x0, 0x1, 0xc5, 0x55, 0xc5, 0x55, 0xb0, - 0x0, 0x3, 0x0, 0xb, 0x0, 0x2, 0x0, 0x5, - 0x65, 0x55, 0xc5, 0x55, 0xb2, 0x0, 0x0, 0x0, - 0xb, 0x0, 0x1, 0x40, 0x46, 0x55, 0x55, 0x85, - 0x55, 0x79, 0x10, 0x4, 0x6, 0x0, 0x70, 0x8, - 0x0, 0x4, 0x60, 0x74, 0x8, 0x40, 0x86, 0x0, - 0xc1, 0x4, 0x30, 0x33, 0x3, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9EDE "點" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x7, - 0x57, 0x59, 0x30, 0xd, 0x0, 0x0, 0x9, 0x1a, - 0x3a, 0x0, 0xb, 0x0, 0x0, 0x9, 0x8a, 0x6a, - 0x0, 0xc, 0x44, 0x80, 0x9, 0x6c, 0x5b, 0x10, - 0xb, 0x0, 0x0, 0x6, 0xa, 0x4, 0x0, 0xb, - 0x0, 0x0, 0x2, 0x3b, 0x38, 0x10, 0xb, 0x0, - 0x0, 0x2, 0x3b, 0x22, 0x19, 0x5a, 0x5b, 0x20, - 0x0, 0xa, 0x54, 0x1a, 0x0, 0xb, 0x0, 0xb, - 0xa5, 0x1, 0xa, 0x0, 0xb, 0x0, 0x2, 0x20, - 0x62, 0x7a, 0x0, 0xb, 0x0, 0x7, 0x27, 0x71, - 0x8b, 0x55, 0x5c, 0x0, 0x19, 0x2, 0x0, 0xb, - 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, - - /* U+9EE8 "黨" */ - 0x0, 0x0, 0x0, 0x5, 0x0, 0x10, 0x0, 0x0, - 0x6, 0x70, 0xb, 0x6, 0x80, 0x0, 0x0, 0x53, - 0xa3, 0x3b, 0x38, 0x33, 0x70, 0x3, 0x82, 0x52, - 0x22, 0x25, 0x26, 0x91, 0x8, 0x10, 0x96, 0x55, - 0x5c, 0x12, 0x0, 0x0, 0x0, 0x96, 0x55, 0x5a, - 0x0, 0x0, 0x0, 0x29, 0x65, 0x58, 0x55, 0x6a, - 0x0, 0x0, 0x29, 0x37, 0xa, 0x19, 0x18, 0x0, - 0x0, 0x2b, 0x56, 0x5b, 0x65, 0x68, 0x0, 0x0, - 0x47, 0x55, 0x5b, 0x55, 0x5a, 0x10, 0x4, 0x55, - 0x55, 0x5b, 0x55, 0x55, 0xb1, 0x1, 0x30, 0x4, - 0x0, 0x40, 0x4, 0x10, 0x2, 0xa0, 0x2, 0x70, - 0x35, 0x1, 0x80, 0x2, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9F13 "鼓" */ - 0x0, 0x0, 0x40, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x9, 0x40, 0x0, 0x6, 0x55, - 0xd5, 0x75, 0x9, 0x20, 0x0, 0x0, 0x0, 0xb0, - 0x5, 0x5b, 0x65, 0xa0, 0x1, 0x75, 0xb5, 0x91, - 0x9, 0x20, 0x0, 0x0, 0x10, 0x0, 0x20, 0x9, - 0x21, 0x10, 0x0, 0xd5, 0x55, 0xd3, 0x86, 0x5b, - 0x70, 0x0, 0xd0, 0x0, 0xb0, 0x50, 0xc, 0x0, - 0x0, 0xd5, 0x55, 0xa0, 0x43, 0x66, 0x0, 0x0, - 0x40, 0x9, 0x10, 0xa, 0xb0, 0x0, 0x0, 0x19, - 0x9, 0x0, 0xb, 0x90, 0x0, 0x0, 0x15, 0x78, - 0x53, 0x82, 0x7a, 0x10, 0xc, 0x95, 0x20, 0x36, - 0x0, 0x6, 0xc1, 0x0, 0x0, 0x1, 0x10, 0x0, - 0x0, 0x0, - - /* U+9F3B "鼻" */ - 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x5a, 0x65, 0x58, 0x10, 0x0, 0x0, 0xa, - 0x22, 0x22, 0x2a, 0x0, 0x0, 0x0, 0xa, 0x33, - 0x33, 0x3a, 0x0, 0x0, 0x0, 0xa, 0x55, 0x55, - 0x5b, 0x0, 0x0, 0x0, 0x9, 0x55, 0x55, 0x5a, - 0x0, 0x0, 0x0, 0xa5, 0x55, 0x95, 0x55, 0xc2, - 0x0, 0x0, 0xa5, 0x55, 0xc5, 0x55, 0xc0, 0x0, - 0x0, 0xb5, 0x55, 0xc5, 0x55, 0xc0, 0x0, 0x0, - 0x40, 0x0, 0x0, 0x0, 0x42, 0x40, 0x17, 0x55, - 0xc6, 0x55, 0xd5, 0x55, 0x40, 0x0, 0x1, 0xa0, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0x29, 0x10, 0x0, - 0xb0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x30, - 0x0, 0x0, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xfb, 0x0, - 0x0, 0x0, 0x4, 0x9d, 0xff, 0xff, 0xd0, 0x0, - 0x3, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xdf, 0xd0, 0x0, 0xa, - 0xff, 0xff, 0xb6, 0x10, 0xed, 0x0, 0x0, 0xaf, - 0x94, 0x0, 0x0, 0xe, 0xd0, 0x0, 0xa, 0xf1, - 0x0, 0x0, 0x0, 0xed, 0x0, 0x0, 0xaf, 0x10, - 0x0, 0x0, 0xe, 0xd0, 0x0, 0xa, 0xf1, 0x0, - 0x0, 0x45, 0xfd, 0x0, 0x0, 0xaf, 0x10, 0x1, - 0xef, 0xff, 0xd0, 0x17, 0x9d, 0xf1, 0x0, 0x5f, - 0xff, 0xfc, 0xe, 0xff, 0xff, 0x10, 0x0, 0xaf, - 0xfd, 0x31, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x1, - 0x0, 0x3, 0xbd, 0xa3, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F008 "" */ - 0x50, 0x18, 0x88, 0x88, 0x88, 0x84, 0x5, 0xfa, - 0xbf, 0xdd, 0xdd, 0xdd, 0xfd, 0xaf, 0xe4, 0x7f, - 0x10, 0x0, 0x0, 0xca, 0x4e, 0xe0, 0x4f, 0x10, - 0x0, 0x0, 0xc8, 0xe, 0xfe, 0xef, 0x10, 0x0, - 0x0, 0xcf, 0xef, 0xe0, 0x3f, 0xee, 0xee, 0xee, - 0xf8, 0xe, 0xf6, 0x8f, 0x76, 0x66, 0x66, 0xeb, - 0x6f, 0xf8, 0xaf, 0x10, 0x0, 0x0, 0xcc, 0x8f, - 0xe0, 0x3f, 0x10, 0x0, 0x0, 0xc8, 0xe, 0xfc, - 0xdf, 0x65, 0x55, 0x55, 0xee, 0xcf, 0xc2, 0x5f, - 0xff, 0xff, 0xff, 0xf9, 0x2c, - - /* U+F00B "" */ - 0x57, 0x75, 0x5, 0x77, 0x77, 0x77, 0x75, 0xff, - 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xe, - 0xff, 0xff, 0xff, 0xfe, 0x1, 0x10, 0x0, 0x11, - 0x11, 0x11, 0x10, 0xef, 0xfe, 0xe, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0x68, 0x87, 0x7, 0x88, 0x88, 0x88, 0x86, 0x68, - 0x87, 0x7, 0x88, 0x88, 0x88, 0x86, 0xff, 0xff, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xd, 0xff, - 0xff, 0xff, 0xfd, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xe2, 0x2d, 0x60, 0x0, 0x1, - 0xdf, 0xfe, 0x20, 0xdf, 0xf7, 0x0, 0x1d, 0xff, - 0xe2, 0x0, 0x8f, 0xff, 0x71, 0xdf, 0xfe, 0x20, - 0x0, 0x8, 0xff, 0xfe, 0xff, 0xe2, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7d, 0x20, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, - 0xb, 0xe2, 0xef, 0xf6, 0x0, 0xbf, 0xf8, 0x4f, - 0xff, 0x6b, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x5f, 0xff, 0xe1, 0x0, 0x0, 0xbf, - 0xff, 0xf6, 0x0, 0xb, 0xff, 0xdf, 0xff, 0x60, - 0xbf, 0xfd, 0x14, 0xff, 0xf5, 0xcf, 0xd1, 0x0, - 0x4f, 0xf6, 0x17, 0x10, 0x0, 0x3, 0x60, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0x21, 0xff, 0x12, 0xf7, 0x0, 0x6, 0xff, 0x61, - 0xff, 0x16, 0xff, 0x60, 0x1f, 0xf9, 0x1, 0xff, - 0x10, 0x9f, 0xf1, 0x6f, 0xe0, 0x1, 0xff, 0x10, - 0xe, 0xf6, 0xaf, 0x80, 0x1, 0xff, 0x10, 0x8, - 0xfa, 0xcf, 0x60, 0x1, 0xff, 0x10, 0x6, 0xfc, - 0xaf, 0x80, 0x0, 0xaa, 0x0, 0x8, 0xfb, 0x7f, - 0xd0, 0x0, 0x0, 0x0, 0xd, 0xf7, 0x1f, 0xf8, - 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x7, 0xff, 0x91, - 0x0, 0x2a, 0xff, 0x70, 0x0, 0x9f, 0xff, 0xee, - 0xff, 0xf9, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xfd, - 0x50, 0x0, 0x0, 0x0, 0x2, 0x44, 0x20, 0x0, - 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xd6, 0xdf, - 0xff, 0xfd, 0x6d, 0x30, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x5f, 0xff, 0xff, 0xaa, 0xff, - 0xff, 0xf5, 0x1a, 0xff, 0xf4, 0x0, 0x4f, 0xff, - 0xa1, 0x3, 0xff, 0xd0, 0x0, 0xd, 0xff, 0x30, - 0x4, 0xff, 0xf0, 0x0, 0xf, 0xff, 0x40, 0x4f, - 0xff, 0xfb, 0x22, 0xbf, 0xff, 0xf4, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9, 0xfe, 0xff, - 0xff, 0xff, 0xef, 0x90, 0x0, 0x50, 0x5e, 0xff, - 0xe5, 0x5, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x77, 0x40, 0x0, - 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x3, 0x10, 0x3, 0x41, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xf5, 0xd, 0xf5, 0x0, - 0x0, 0x0, 0x1b, 0xfd, 0xff, 0x8d, 0xf5, 0x0, - 0x0, 0x2, 0xdf, 0xb1, 0x2d, 0xff, 0xf5, 0x0, - 0x0, 0x4f, 0xf8, 0x3e, 0xc2, 0xbf, 0xf5, 0x0, - 0x7, 0xff, 0x55, 0xff, 0xfe, 0x39, 0xfe, 0x40, - 0x9f, 0xe3, 0x8f, 0xff, 0xff, 0xf5, 0x6f, 0xf6, - 0xac, 0x2a, 0xff, 0xff, 0xff, 0xff, 0x73, 0xe6, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0x6f, 0xff, 0xd7, 0x7f, 0xff, 0xf2, 0x0, - 0x0, 0x6f, 0xff, 0x90, 0xd, 0xff, 0xf2, 0x0, - 0x0, 0x6f, 0xff, 0x90, 0xd, 0xff, 0xf2, 0x0, - 0x0, 0x4f, 0xff, 0x70, 0xb, 0xff, 0xe1, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x0, 0x79, 0x99, - 0x82, 0xde, 0x28, 0x99, 0x97, 0xff, 0xff, 0xfb, - 0x22, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xb3, 0xcf, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xca, - - /* U+F01C "" */ - 0x0, 0x6, 0xbb, 0xbb, 0xbb, 0xba, 0x30, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0xef, 0x30, 0x0, 0x0, 0x6, 0xfb, 0x0, - 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x50, - 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe1, - 0xdf, 0x84, 0x42, 0x0, 0x0, 0x34, 0x4b, 0xf9, - 0xff, 0xff, 0xfd, 0x0, 0x1, 0xff, 0xff, 0xfb, - 0xff, 0xff, 0xff, 0x98, 0x8b, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, - 0x1, 0x8d, 0xff, 0xc6, 0x0, 0xef, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xe4, 0xdf, 0x4, 0xff, 0xb3, - 0x0, 0x4c, 0xff, 0xff, 0xe, 0xf9, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0x6f, 0xc0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0x8e, 0x50, 0x0, 0x1, 0xde, 0xee, - 0xed, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x21, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x8, 0xf8, 0xff, 0xfb, - 0xbc, 0x10, 0x0, 0x1e, 0xf4, 0xff, 0xfc, 0x10, - 0x0, 0x1, 0xdf, 0xc0, 0xfe, 0xef, 0xe8, 0x44, - 0x8e, 0xfe, 0x10, 0xfe, 0x1a, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0xfd, 0x0, 0x28, 0xbb, 0x94, 0x0, - 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x2, 0x70, 0x0, 0x2, 0xef, 0x0, - 0x2, 0xef, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x34, 0x47, 0xff, 0xf0, - 0x0, 0x5, 0xff, 0x0, 0x0, 0x5, 0xc0, 0x0, - 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x2, - 0xef, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0x2, 0x20, 0xff, 0xff, - 0xff, 0xf0, 0x8e, 0x1f, 0xff, 0xff, 0xff, 0x0, - 0xe7, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x5f, 0xff, - 0xff, 0xff, 0x8, 0x90, 0x34, 0x47, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x0, - 0x0, 0x0, 0x2, 0x70, 0x0, 0x5, 0xfa, 0x0, - 0x0, 0x0, 0x2e, 0xf0, 0x0, 0x81, 0x4f, 0x60, - 0x0, 0x2, 0xef, 0xf0, 0x1, 0xdd, 0x7, 0xf0, - 0xdf, 0xff, 0xff, 0xf0, 0x32, 0x1e, 0x80, 0xf6, - 0xff, 0xff, 0xff, 0xf0, 0x8e, 0x27, 0xe0, 0xb9, - 0xff, 0xff, 0xff, 0xf0, 0xe, 0x73, 0xf1, 0x9b, - 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x54, 0xf0, 0x9a, - 0xff, 0xff, 0xff, 0xf0, 0x89, 0xa, 0xc0, 0xd8, - 0x34, 0x47, 0xff, 0xf0, 0x0, 0x7f, 0x43, 0xf3, - 0x0, 0x0, 0x5f, 0xf0, 0x2, 0xf6, 0xc, 0xb0, - 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0xbf, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, - - /* U+F03E "" */ - 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0x32, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x7f, - 0xff, 0xfd, 0xff, 0xff, 0xfd, 0x10, 0xcf, 0xff, - 0xa0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x7, 0xff, 0xff, 0xf3, 0x5f, 0xa0, 0x0, 0x0, - 0xcf, 0xff, 0x30, 0x3, 0x0, 0x0, 0x0, 0xcf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, - - /* U+F043 "" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0xfa, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, 0x0, - 0xd, 0xff, 0x70, 0x0, 0x0, 0x6f, 0xff, 0xf1, - 0x0, 0x1, 0xef, 0xff, 0xfa, 0x0, 0xb, 0xff, - 0xff, 0xff, 0x60, 0x5f, 0xff, 0xff, 0xff, 0xe0, - 0xcf, 0xff, 0xff, 0xff, 0xf6, 0xfe, 0xbf, 0xff, - 0xff, 0xf9, 0xfd, 0x4f, 0xff, 0xff, 0xf9, 0xbf, - 0x49, 0xff, 0xff, 0xf5, 0x3f, 0xe5, 0x2e, 0xff, - 0xd0, 0x6, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x28, - 0xba, 0x60, 0x0, - - /* U+F048 "" */ - 0x4, 0x30, 0x0, 0x0, 0x31, 0x1f, 0xe0, 0x0, - 0x6, 0xf9, 0x1f, 0xe0, 0x0, 0x7f, 0xfa, 0x1f, - 0xe0, 0x9, 0xff, 0xfa, 0x1f, 0xe0, 0xaf, 0xff, - 0xfa, 0x1f, 0xeb, 0xff, 0xff, 0xfa, 0x1f, 0xff, - 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, 0xff, 0xfa, - 0x1f, 0xe6, 0xff, 0xff, 0xfa, 0x1f, 0xe0, 0x5f, - 0xff, 0xfa, 0x1f, 0xe0, 0x4, 0xff, 0xfa, 0x1f, - 0xe0, 0x0, 0x3e, 0xfa, 0xf, 0xd0, 0x0, 0x2, - 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfb, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xe6, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe6, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xf, - 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0x6a, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F04C "" */ - 0x14, 0x44, 0x20, 0x1, 0x44, 0x42, 0xd, 0xff, - 0xff, 0x10, 0xdf, 0xff, 0xf1, 0xff, 0xff, 0xf3, - 0xf, 0xff, 0xff, 0x3f, 0xff, 0xff, 0x40, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, - 0x4f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xf4, 0xf, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0x40, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xf4, 0xf, - 0xff, 0xff, 0x4f, 0xff, 0xff, 0x40, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0x30, 0xff, 0xff, 0xf3, 0x9f, 0xff, - 0xc0, 0x9, 0xff, 0xfc, 0x0, - - /* U+F04D "" */ - 0x14, 0x44, 0x44, 0x44, 0x44, 0x42, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, - - /* U+F051 "" */ - 0x2, 0x10, 0x0, 0x0, 0x42, 0xf, 0xe2, 0x0, - 0x3, 0xfb, 0xf, 0xfe, 0x30, 0x4, 0xfb, 0xf, - 0xff, 0xf4, 0x4, 0xfb, 0xf, 0xff, 0xff, 0x54, - 0xfb, 0xf, 0xff, 0xff, 0xfa, 0xfb, 0xf, 0xff, - 0xff, 0xff, 0xfb, 0xf, 0xff, 0xff, 0xff, 0xfb, - 0xf, 0xff, 0xff, 0xd6, 0xfb, 0xf, 0xff, 0xfd, - 0x14, 0xfb, 0xf, 0xff, 0xc1, 0x4, 0xfb, 0xf, - 0xfb, 0x0, 0x4, 0xfb, 0xc, 0xa0, 0x0, 0x3, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x3, 0x99, 0x99, 0x99, 0x99, 0x99, 0x50, 0x5, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd1, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0x90, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x3f, - 0xfd, 0x10, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x3f, - 0xfd, 0x10, 0x0, 0x1f, 0xfd, 0x10, 0x0, 0x0, - 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, - 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xcf, - 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, - 0x0, 0xa4, 0x0, - - /* U+F054 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0x10, 0x0, - 0x0, 0x1f, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xfd, - 0x10, 0x0, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, - 0x3f, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xfd, 0x0, - 0x0, 0x8, 0xff, 0x90, 0x0, 0x8, 0xff, 0x90, - 0x0, 0x8, 0xff, 0x90, 0x0, 0x8, 0xff, 0x90, - 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x7, 0x80, - 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, - 0x6, 0x99, 0x9a, 0xff, 0xc9, 0x99, 0x80, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x1, 0x11, 0x3f, 0xf7, - 0x11, 0x10, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xd3, 0x0, 0x0, 0x0, - - /* U+F068 "" */ - 0x69, 0x99, 0x99, 0x99, 0x99, 0x98, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F06E "" */ - 0x0, 0x0, 0x1, 0x56, 0x64, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xbf, 0xfe, 0xef, 0xf9, 0x10, 0x0, - 0x0, 0x7f, 0xfa, 0x10, 0x3, 0xdf, 0xe4, 0x0, - 0x8, 0xff, 0xa0, 0x9, 0xb4, 0x1e, 0xff, 0x50, - 0x4f, 0xff, 0x20, 0xb, 0xff, 0x26, 0xff, 0xe1, - 0xef, 0xff, 0x9, 0xcf, 0xff, 0x63, 0xff, 0xfa, - 0xbf, 0xff, 0x9, 0xff, 0xff, 0x54, 0xff, 0xf6, - 0x1e, 0xff, 0x51, 0xdf, 0xfb, 0x9, 0xff, 0xb0, - 0x3, 0xef, 0xe2, 0x4, 0x30, 0x5f, 0xfc, 0x10, - 0x0, 0x2c, 0xff, 0x95, 0x6a, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x49, 0xdf, 0xfd, 0x92, 0x0, 0x0, - - /* U+F070 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x14, 0x66, 0x40, - 0x0, 0x0, 0x0, 0x4, 0xef, 0xac, 0xff, 0xef, - 0xff, 0x91, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xa1, - 0x0, 0x4d, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9f, - 0xf5, 0xab, 0x31, 0xef, 0xf4, 0x0, 0x7, 0xb1, - 0x5, 0xff, 0xff, 0xe1, 0x7f, 0xfe, 0x10, 0xf, - 0xfe, 0x30, 0x2d, 0xff, 0xf5, 0x4f, 0xff, 0x90, - 0xc, 0xff, 0xe0, 0x0, 0xaf, 0xf6, 0x5f, 0xff, - 0x60, 0x2, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xef, - 0xfb, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, 0x3e, - 0xff, 0xc0, 0x0, 0x0, 0x2, 0xdf, 0xe8, 0x54, - 0x1, 0xbf, 0xe3, 0x0, 0x0, 0x0, 0x5, 0xae, - 0xff, 0x60, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa1, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfc, 0xcf, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x0, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, - 0xf, 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xfd, - 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0xdf, 0xff, - 0xe0, 0x2f, 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xff, - 0xff, 0x9b, 0xff, 0xff, 0xf3, 0x0, 0x1f, 0xff, - 0xff, 0xb0, 0xe, 0xff, 0xff, 0xc0, 0xa, 0xff, - 0xff, 0xfe, 0x24, 0xff, 0xff, 0xff, 0x60, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x6, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x30, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0x80, 0xdd, 0xdb, - 0x0, 0x0, 0x8d, 0xef, 0xf8, 0xff, 0xff, 0xb0, - 0x7, 0xff, 0xff, 0xfd, 0x55, 0x6f, 0xf4, 0x6f, - 0xf8, 0xaf, 0xe2, 0x0, 0x5, 0x74, 0xff, 0x90, - 0x7e, 0x20, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xef, 0xb2, 0x50, 0x4a, 0x0, - 0x1, 0x2e, 0xfd, 0x1d, 0xf4, 0x8f, 0xb0, 0xff, - 0xff, 0xd1, 0xb, 0xff, 0xff, 0xfb, 0xff, 0xfe, - 0x20, 0x0, 0xcf, 0xff, 0xfb, 0x12, 0x21, 0x0, - 0x0, 0x2, 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5b, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, 0x95, 0xff, - 0xb0, 0x0, 0x8, 0xff, 0x90, 0x5, 0xff, 0xb0, - 0x7, 0xff, 0x90, 0x0, 0x5, 0xff, 0xb0, 0x9f, - 0x90, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x40, 0x0, - 0x0, 0x0, 0x3, 0x10, - - /* U+F078 "" */ - 0x4c, 0x20, 0x0, 0x0, 0x0, 0xb6, 0xb, 0xfe, - 0x20, 0x0, 0x0, 0xcf, 0xf0, 0x2e, 0xfe, 0x20, - 0x0, 0xcf, 0xf4, 0x0, 0x2e, 0xfe, 0x20, 0xcf, - 0xf4, 0x0, 0x0, 0x2e, 0xfe, 0xcf, 0xf4, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x13, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xf3, 0x8, 0xbb, 0xbb, 0xbb, - 0x90, 0x0, 0xb, 0xff, 0xff, 0x39, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x8f, 0xcf, 0xcf, 0xf0, 0x0, - 0x0, 0xa, 0xf1, 0x0, 0x38, 0x2f, 0x94, 0x80, - 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x2f, 0x90, - 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x2f, - 0x90, 0x0, 0x0, 0x3, 0xa, 0xf1, 0x30, 0x0, - 0x2f, 0x90, 0x0, 0x0, 0x1f, 0xcb, 0xf8, 0xf8, - 0x0, 0x2f, 0xeb, 0xbb, 0xbb, 0x39, 0xff, 0xff, - 0xe2, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xb0, 0x9f, - 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xd1, 0x0, - - /* U+F07B "" */ - 0x37, 0x88, 0x87, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xfd, 0xcc, 0xcc, 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, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x1, 0x1c, 0xff, 0xc1, 0x10, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x79, 0x99, - 0x3b, 0xff, 0xb3, 0x99, 0x97, 0xff, 0xff, 0xb2, - 0x44, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdd, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xb3, 0xcf, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xca, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xf3, 0x0, 0x0, 0x4a, 0x30, 0x2, - 0xdf, 0xf8, 0x0, 0x5, 0xdf, 0xfe, 0x15, 0xef, - 0xfb, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa2, 0x0, 0x0, - 0x0, 0x2, 0xba, 0x85, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x4, 0x86, 0x0, 0x0, 0x0, 0x10, 0x6, 0xff, - 0xfa, 0x0, 0x2, 0xdf, 0xd1, 0xef, 0x3c, 0xf1, - 0x1, 0xdf, 0xfa, 0xe, 0xe0, 0xaf, 0x21, 0xdf, - 0xfa, 0x0, 0x9f, 0xef, 0xf6, 0xdf, 0xfa, 0x0, - 0x0, 0x8d, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x48, 0xef, - 0xff, 0xf6, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0xff, - 0xf6, 0x0, 0xe, 0xf3, 0xcf, 0x23, 0xff, 0xf6, - 0x0, 0xee, 0xa, 0xf2, 0x4, 0xff, 0xf6, 0x9, - 0xfe, 0xfc, 0x0, 0x4, 0xff, 0xf1, 0x8, 0xda, - 0x10, 0x0, 0x2, 0x62, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf9, 0x87, 0x0, 0x0, 0x8, 0xff, - 0xff, 0x98, 0xf7, 0x8, 0xa6, 0x8f, 0xff, 0xf9, - 0x59, 0x90, 0xff, 0xa8, 0xff, 0xff, 0xfc, 0xcc, - 0xf, 0xfa, 0x8f, 0xff, 0xff, 0xff, 0xf1, 0xff, - 0xa8, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfa, 0x8f, - 0xff, 0xff, 0xff, 0xf1, 0xff, 0xa8, 0xff, 0xff, - 0xff, 0xff, 0x1f, 0xfa, 0x8f, 0xff, 0xff, 0xff, - 0xf1, 0xff, 0xa8, 0xff, 0xff, 0xff, 0xff, 0x1f, - 0xfa, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xe3, - 0x12, 0x22, 0x22, 0x21, 0xf, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0xac, 0xcc, 0xcc, 0xcb, 0x50, - 0x0, 0x0, - - /* U+F0C7 "" */ - 0x49, 0x99, 0x99, 0x99, 0x95, 0x0, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0xfd, 0x22, 0x22, - 0x22, 0x4f, 0xf6, 0xf, 0xc0, 0x0, 0x0, 0x1, - 0xff, 0xf3, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0x6f, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xdc, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x5, - 0xff, 0xff, 0x6f, 0xff, 0xf6, 0x0, 0xf, 0xff, - 0xf6, 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0x6f, - 0xff, 0xff, 0xed, 0xff, 0xff, 0xf6, 0x9f, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, - - /* U+F0C9 "" */ - 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x12, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xde, - 0xee, 0xee, 0xee, 0xee, 0xee, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xee, 0xee, 0xee, 0xee, 0xee, - 0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0E0 "" */ - 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0xd2, 0x8f, 0xff, 0xff, - 0xff, 0xf8, 0x2d, 0xff, 0x64, 0xef, 0xff, 0xfe, - 0x45, 0xff, 0xff, 0xfa, 0x2b, 0xff, 0xb2, 0xaf, - 0xff, 0xff, 0xff, 0xd3, 0x55, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, - - /* U+F0E7 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xf0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x6, - 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0x30, - 0x0, 0xa, 0xff, 0xff, 0xaa, 0xa6, 0xc, 0xff, - 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xe1, - 0xb, 0xdd, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x4f, - 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, - 0x0, 0xbf, 0xa0, 0x0, 0x0, 0x0, 0xff, 0x10, - 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, 0x3, - 0xc0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x4, 0x55, - 0xef, 0xb5, 0x52, 0x0, 0x0, 0xff, 0xfd, 0x1f, - 0xff, 0xb0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0xff, 0xff, 0x53, 0x33, 0x20, 0x0, - 0xf, 0xff, 0x97, 0xff, 0xfb, 0x57, 0x0, 0xff, - 0xf8, 0xaf, 0xff, 0xc6, 0xf8, 0xf, 0xff, 0x8a, - 0xff, 0xfc, 0x4a, 0xa1, 0xff, 0xf8, 0xaf, 0xff, - 0xe3, 0x22, 0xf, 0xff, 0x8a, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xf8, 0xaf, 0xff, 0xff, 0xff, 0x4f, - 0xff, 0x8a, 0xff, 0xff, 0xff, 0xf4, 0x35, 0x52, - 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0xfe, 0x20, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, - 0xfa, 0x30, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, - 0x50, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0x20, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x2, 0x22, - 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x8, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xa2, 0x0, - 0x0, 0x0, - - /* U+F11C "" */ - 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xfc, 0xc, 0x30, 0xe1, 0x1d, 0xd, 0x11, 0xfc, - 0xfc, 0xb, 0x30, 0xe0, 0x1d, 0xd, 0x10, 0xfc, - 0xff, 0xfe, 0xff, 0xef, 0xfe, 0xfe, 0xef, 0xfc, - 0xff, 0xf1, 0x5a, 0x8, 0x70, 0xa0, 0x5f, 0xfc, - 0xff, 0xf3, 0x7b, 0x29, 0x92, 0xc2, 0x7f, 0xfc, - 0xff, 0xbf, 0xcb, 0xbb, 0xbb, 0xbf, 0xcb, 0xfc, - 0xfc, 0xb, 0x20, 0x0, 0x0, 0xd, 0x0, 0xfc, - 0xff, 0xcf, 0xcc, 0xcc, 0xcc, 0xcf, 0xcc, 0xfb, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x4, 0x9a, 0xaa, 0xaf, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xb3, 0x0, 0x0, 0x0, - - /* U+F15B "" */ - 0x35, 0x55, 0x55, 0x2, 0x0, 0xf, 0xff, 0xff, - 0xf2, 0xf4, 0x0, 0xff, 0xff, 0xff, 0x2f, 0xf4, - 0xf, 0xff, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0x32, 0x22, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8a, 0xaa, 0xaa, - 0xaa, 0xaa, 0x30, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x24, 0x55, 0x31, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xc7, - 0x0, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0xde, 0xff, - 0xff, 0xf6, 0x0, 0x5f, 0xff, 0xb5, 0x10, 0x0, - 0x3, 0x8e, 0xff, 0xb0, 0xdf, 0xd3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x18, 0x0, 0x5, - 0xae, 0xfe, 0xc8, 0x10, 0x4, 0x60, 0x0, 0x2, - 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x95, 0x34, 0x7d, 0xff, 0x40, 0x0, - 0x0, 0x2, 0xa2, 0x0, 0x0, 0x0, 0x77, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x96, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xda, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x22, 0x22, - 0x22, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x2c, 0xfa, 0xfc, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x21, 0xfa, 0xfc, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x27, 0xfa, 0xfc, 0x26, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x1f, 0xfa, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F241 "" */ - 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x22, 0x21, - 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x7, 0xfa, 0xfc, 0x26, - 0x66, 0x66, 0x66, 0x63, 0x0, 0xf, 0xfa, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F242 "" */ - 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x10, 0x0, - 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x26, - 0x66, 0x66, 0x50, 0x0, 0x0, 0xf, 0xfa, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F243 "" */ - 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xfc, 0x12, 0x22, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x26, - 0x66, 0x10, 0x0, 0x0, 0x0, 0xf, 0xfa, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F244 "" */ - 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xf7, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0xfe, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x7, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xdf, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa9, 0x3d, 0xf5, - 0x0, 0x0, 0x0, 0x4, 0x40, 0x2, 0xe0, 0x0, - 0x10, 0x0, 0x0, 0x0, 0xaf, 0xf8, 0xb, 0x60, - 0x0, 0x0, 0x0, 0x6c, 0x30, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xaf, 0xf9, - 0x0, 0xc, 0x50, 0x0, 0x0, 0x6d, 0x40, 0x5, - 0x50, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc4, 0x3e, 0xe8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xef, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x7, - 0xef, 0xff, 0xb3, 0x0, 0x0, 0xaf, 0xfd, 0x8f, - 0xff, 0x20, 0x4, 0xff, 0xfd, 0x9, 0xff, 0xb0, - 0xa, 0xfe, 0xfd, 0x12, 0xaf, 0xf0, 0xe, 0xf5, - 0x5d, 0x2c, 0xe, 0xf3, 0xf, 0xff, 0x33, 0x12, - 0x9f, 0xf5, 0xf, 0xff, 0xf3, 0x7, 0xff, 0xf6, - 0xf, 0xff, 0xe2, 0x6, 0xff, 0xf6, 0xf, 0xfe, - 0x24, 0x13, 0x7f, 0xf5, 0xd, 0xf5, 0x7d, 0x2c, - 0xd, 0xf3, 0xa, 0xff, 0xfd, 0x11, 0xbf, 0xf0, - 0x3, 0xff, 0xfe, 0xb, 0xff, 0xa0, 0x0, 0x7f, - 0xfe, 0xbf, 0xfe, 0x10, 0x0, 0x3, 0xac, 0xdc, - 0x81, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x34, 0x43, 0x0, 0x0, 0x5, 0x66, - 0x7f, 0xff, 0xf9, 0x66, 0x50, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x35, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x50, 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xc4, - 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2f, - 0xf3, 0xfb, 0x7f, 0x6d, 0xf6, 0x2, 0xff, 0x2f, - 0xb7, 0xf5, 0xdf, 0x60, 0x2f, 0xf2, 0xfb, 0x7f, - 0x5d, 0xf6, 0x2, 0xff, 0x2f, 0xb7, 0xf5, 0xdf, - 0x60, 0x2f, 0xf2, 0xfb, 0x7f, 0x5d, 0xf6, 0x2, - 0xff, 0x2f, 0xb7, 0xf5, 0xdf, 0x60, 0x2f, 0xf3, - 0xfb, 0x7f, 0x6d, 0xf6, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x7, 0xbc, 0xcc, 0xcc, 0xcc, - 0x90, 0x0, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x4, 0x39, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x39, 0xff, 0xa0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x39, 0xb0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xa8, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, 0x87, - 0x40, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x3e, 0xff, 0xff, 0xcf, 0xff, - 0xcf, 0xff, 0xf7, 0x3, 0xef, 0xff, 0xf9, 0x8, - 0xf8, 0x9, 0xff, 0xf8, 0x3e, 0xff, 0xff, 0xfe, - 0x20, 0x40, 0x2e, 0xff, 0xf8, 0xdf, 0xff, 0xff, - 0xff, 0xe1, 0x1, 0xef, 0xff, 0xf8, 0x9f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x8f, 0xff, 0xf8, 0x9, - 0xff, 0xff, 0xf9, 0x2, 0xc2, 0x9, 0xff, 0xf8, - 0x0, 0x9f, 0xff, 0xfe, 0x4e, 0xfe, 0x4e, 0xff, - 0xf8, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc1, - - /* U+F7C2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, - 0xff, 0xff, 0xe2, 0x3, 0xfb, 0xfb, 0xce, 0xbf, - 0xa4, 0xff, 0x1d, 0x3, 0xa1, 0xfa, 0xff, 0xf1, - 0xd0, 0x3a, 0x1f, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x29, 0xaa, 0xaa, - 0xaa, 0xa8, 0x0, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf1, 0x0, - 0x8, 0x20, 0x0, 0x0, 0x1, 0xff, 0x10, 0xb, - 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0xc, 0xff, - 0x94, 0x44, 0x44, 0x45, 0xff, 0x1b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x7f, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+FF08 "(" */ - 0x0, 0x0, 0x20, 0x0, 0x61, 0x0, 0x81, 0x0, - 0x46, 0x0, 0xb, 0x10, 0x0, 0xc0, 0x0, 0xc, - 0x0, 0x0, 0xb0, 0x0, 0x4, 0x60, 0x0, 0x8, - 0x20, 0x0, 0x6, 0x20, 0x0, 0x1, - - /* U+FF09 ")" */ - 0x30, 0x0, 0x1, 0x70, 0x0, 0x1, 0x90, 0x0, - 0x6, 0x60, 0x0, 0xc, 0x0, 0x0, 0xd0, 0x0, - 0xd, 0x0, 0x0, 0xc0, 0x0, 0x66, 0x0, 0x2a, - 0x0, 0x27, 0x0, 0x2, 0x0, 0x0, - - /* U+FF0C "," */ - 0x1, 0x0, 0xfc, 0x7, 0xb0, 0x63, 0x3, 0x0, - - /* U+FF11 "1" */ - 0x0, 0x23, 0x0, 0x5, 0xd6, 0x0, 0x0, 0x86, - 0x0, 0x0, 0x86, 0x0, 0x0, 0x86, 0x0, 0x0, - 0x86, 0x0, 0x0, 0x86, 0x0, 0x0, 0x86, 0x0, - 0x0, 0x96, 0x0, 0x14, 0x66, 0x40, - - /* U+FF12 "2" */ - 0x0, 0x0, 0x0, 0x7, 0x67, 0x91, 0x87, 0x0, - 0x99, 0x69, 0x0, 0x8b, 0x0, 0x0, 0xd5, 0x0, - 0x6, 0x80, 0x0, 0x39, 0x0, 0x2, 0x90, 0x0, - 0x19, 0x0, 0x3, 0xab, 0xaa, 0xb4, 0x12, 0x22, - 0x20 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 112, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 112, .box_w = 3, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 15, .adv_w = 112, .box_w = 6, .box_h = 4, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 27, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 62, .adv_w = 112, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 143, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 178, .adv_w = 112, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 184, .adv_w = 112, .box_w = 4, .box_h = 15, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 214, .adv_w = 112, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 244, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 272, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 304, .adv_w = 112, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 310, .adv_w = 112, .box_w = 7, .box_h = 1, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 314, .adv_w = 112, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 317, .adv_w = 112, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 366, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 401, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 426, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 461, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 496, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 531, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 566, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 601, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 636, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 671, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 706, .adv_w = 112, .box_w = 3, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 717, .adv_w = 112, .box_w = 3, .box_h = 9, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 731, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 770, .adv_w = 112, .box_w = 7, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 784, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 823, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 858, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 893, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 928, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 963, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 998, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1033, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1068, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1103, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1138, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1173, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1198, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1240, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1275, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1310, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1345, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1380, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1415, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1450, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1489, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1524, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1559, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1594, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1629, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1664, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1699, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1734, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1769, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1804, .adv_w = 112, .box_w = 5, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 1839, .adv_w = 112, .box_w = 6, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1878, .adv_w = 112, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1913, .adv_w = 112, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 1918, .adv_w = 112, .box_w = 7, .box_h = 1, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1922, .adv_w = 112, .box_w = 3, .box_h = 2, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 1925, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1950, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1989, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2014, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2053, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2078, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2113, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2145, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2184, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2209, .adv_w = 112, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 2239, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2278, .adv_w = 112, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2306, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2331, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2356, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2381, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2413, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2445, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2470, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2488, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2515, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2540, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2565, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2590, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2615, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2647, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2672, .adv_w = 112, .box_w = 4, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 2700, .adv_w = 112, .box_w = 1, .box_h = 15, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 2708, .adv_w = 112, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 2736, .adv_w = 112, .box_w = 7, .box_h = 3, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 2747, .adv_w = 112, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2747, .adv_w = 224, .box_w = 4, .box_h = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2757, .adv_w = 224, .box_w = 4, .box_h = 5, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 2767, .adv_w = 224, .box_w = 8, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2811, .adv_w = 224, .box_w = 4, .box_h = 12, .ofs_x = 8, .ofs_y = -1}, - {.bitmap_index = 2835, .adv_w = 224, .box_w = 4, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 2859, .adv_w = 224, .box_w = 8, .box_h = 9, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 2895, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 2955, .adv_w = 224, .box_w = 8, .box_h = 7, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2983, .adv_w = 224, .box_w = 10, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3028, .adv_w = 224, .box_w = 8, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 3076, .adv_w = 224, .box_w = 8, .box_h = 9, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 3112, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 3172, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3238, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3304, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3370, .adv_w = 224, .box_w = 8, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 3418, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 3484, .adv_w = 224, .box_w = 6, .box_h = 12, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 3520, .adv_w = 224, .box_w = 9, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 3574, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3646, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3731, .adv_w = 224, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3776, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3837, .adv_w = 224, .box_w = 8, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 3881, .adv_w = 224, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 3953, .adv_w = 224, .box_w = 8, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 4001, .adv_w = 224, .box_w = 8, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 4049, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4121, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4205, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4260, .adv_w = 224, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4332, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4392, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4464, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4524, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4590, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4645, .adv_w = 224, .box_w = 9, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4677, .adv_w = 224, .box_w = 11, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4727, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 4787, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4837, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4903, .adv_w = 224, .box_w = 8, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 4951, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5012, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5078, .adv_w = 224, .box_w = 10, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5123, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5183, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5255, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5316, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5382, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5454, .adv_w = 224, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5526, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5592, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5664, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5736, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5786, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5846, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5901, .adv_w = 224, .box_w = 12, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 5949, .adv_w = 224, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 6003, .adv_w = 224, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 6057, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6112, .adv_w = 224, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6184, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6250, .adv_w = 224, .box_w = 8, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6298, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6359, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6420, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6481, .adv_w = 224, .box_w = 8, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6529, .adv_w = 224, .box_w = 10, .box_h = 9, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6574, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6640, .adv_w = 224, .box_w = 8, .box_h = 8, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6672, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6733, .adv_w = 224, .box_w = 7, .box_h = 8, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6761, .adv_w = 224, .box_w = 8, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6801, .adv_w = 224, .box_w = 8, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6849, .adv_w = 224, .box_w = 7, .box_h = 12, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 6891, .adv_w = 224, .box_w = 9, .box_h = 11, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6941, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7013, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7068, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7140, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7200, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7261, .adv_w = 224, .box_w = 8, .box_h = 9, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 7297, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7357, .adv_w = 224, .box_w = 8, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7397, .adv_w = 224, .box_w = 9, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7451, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7511, .adv_w = 224, .box_w = 9, .box_h = 6, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 7538, .adv_w = 224, .box_w = 11, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 7582, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7648, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7703, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7775, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7835, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7901, .adv_w = 224, .box_w = 9, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7955, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8021, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8076, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8142, .adv_w = 224, .box_w = 9, .box_h = 8, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 8178, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 8238, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8304, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8382, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8437, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8498, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8553, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8619, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8674, .adv_w = 224, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8746, .adv_w = 224, .box_w = 8, .box_h = 11, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 8790, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8850, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8935, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 9001, .adv_w = 224, .box_w = 8, .box_h = 8, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 9033, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 9088, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 9143, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 9215, .adv_w = 224, .box_w = 6, .box_h = 11, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 9248, .adv_w = 224, .box_w = 8, .box_h = 11, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 9292, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 9347, .adv_w = 224, .box_w = 12, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 9389, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 9449, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9499, .adv_w = 224, .box_w = 12, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 9541, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 9601, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 9661, .adv_w = 224, .box_w = 8, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9701, .adv_w = 224, .box_w = 9, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9746, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9796, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9846, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 9924, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10002, .adv_w = 224, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 10056, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 10116, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10166, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10232, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10287, .adv_w = 224, .box_w = 10, .box_h = 8, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10327, .adv_w = 224, .box_w = 6, .box_h = 11, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 10360, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10410, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10465, .adv_w = 224, .box_w = 11, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10515, .adv_w = 224, .box_w = 10, .box_h = 8, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10555, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 10616, .adv_w = 224, .box_w = 10, .box_h = 6, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10646, .adv_w = 224, .box_w = 8, .box_h = 7, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10674, .adv_w = 224, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10719, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10774, .adv_w = 224, .box_w = 7, .box_h = 11, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 10813, .adv_w = 224, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10867, .adv_w = 224, .box_w = 8, .box_h = 9, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10903, .adv_w = 224, .box_w = 9, .box_h = 8, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10939, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10994, .adv_w = 224, .box_w = 10, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11039, .adv_w = 224, .box_w = 8, .box_h = 8, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 11071, .adv_w = 224, .box_w = 14, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 11092, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 11106, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 11197, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11282, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11380, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 11464, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 11555, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11640, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11738, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11836, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 11920, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12018, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12116, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12207, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 12284, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12375, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12473, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12564, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12662, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 12747, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12845, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12943, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 13034, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 13111, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 13196, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13294, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13392, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13462, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 13546, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 13630, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 13721, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13819, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13910, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14008, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14106, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14204, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14302, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14400, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14498, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14596, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14694, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14792, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14890, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14988, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 15072, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15170, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15268, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15366, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15464, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 15555, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15653, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15751, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15849, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15947, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16045, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16143, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16241, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16339, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16430, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16528, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16626, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16724, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16822, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16920, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17018, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17116, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17214, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17305, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17403, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17501, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17599, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17697, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17795, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17893, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17991, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18089, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18180, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18278, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18376, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18474, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18572, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18670, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18768, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18866, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18964, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19062, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19160, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19258, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19356, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19454, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19552, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19650, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19748, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19846, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19944, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 20029, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20120, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 20211, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20309, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20407, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20505, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20603, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20701, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 20792, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20890, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 20974, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 21051, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21149, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 21240, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21338, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21436, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21534, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21632, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21730, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21828, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 21905, .adv_w = 224, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 21977, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22068, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22166, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22257, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22348, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22446, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22544, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22642, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22740, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22838, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 22922, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23020, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23118, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23216, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23314, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23412, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23510, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23608, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23699, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23797, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23888, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23986, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24084, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24182, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 24273, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24371, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 24462, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24560, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24658, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24756, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24847, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24938, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25036, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25134, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25232, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25330, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 25421, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25519, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25617, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25715, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25813, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25911, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26009, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 26100, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26198, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26296, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26394, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 26478, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26576, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26674, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26772, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26870, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26968, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27066, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27164, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27262, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27360, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 27444, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27542, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27640, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27731, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27822, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27913, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28011, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28109, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28200, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28291, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28389, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28487, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28585, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28683, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 28744, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28842, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28940, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 29031, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29115, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29199, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 29290, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29374, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29465, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 29550, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 29641, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29719, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 29804, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 29902, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 30000, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 30084, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 30169, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 30246, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 30337, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 30415, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 30500, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 30591, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 30669, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 30760, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 30851, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 30942, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31040, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31138, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 31229, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 31313, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 31397, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 31482, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31580, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 31665, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 31756, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 31847, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31938, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 32029, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32120, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 32211, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32309, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32400, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 32491, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 32569, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 32660, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32758, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 32835, .adv_w = 224, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 32907, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 32998, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 33082, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 33166, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 33243, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 33327, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 33418, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 33502, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 33586, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 33677, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 33768, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 33866, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 33957, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 34055, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 34153, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 34244, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 34335, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 34433, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 34531, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 34629, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 34727, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 34825, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 34923, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35021, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35119, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35217, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35315, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35413, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35504, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 35595, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 35686, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35777, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35875, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35973, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36064, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 36155, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 36239, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36337, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36435, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36533, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36631, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36729, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36827, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36925, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37023, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37121, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37219, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37317, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37415, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37513, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37611, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37709, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37807, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37905, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38003, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38101, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38192, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38290, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38388, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38486, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38584, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38682, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38780, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38878, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38976, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 39074, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 39172, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 39270, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 39368, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 39466, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 39564, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39655, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 39753, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 39851, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 39949, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 40040, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 40131, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 40222, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 40313, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 40411, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 40509, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 40600, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 40691, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 40782, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 40880, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 40971, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 41069, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 41167, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 41265, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 41356, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 41454, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 41552, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 41650, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 41741, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 41839, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 41923, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42021, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42112, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42210, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42308, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 42399, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42497, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42595, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42693, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42791, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42882, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42980, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43078, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 43162, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43253, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 43337, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43435, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43533, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43624, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43715, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43806, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43897, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43995, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44093, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44191, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44282, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 44360, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44451, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44549, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44640, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44731, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 44815, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 44900, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44998, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 45076, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 45148, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 45239, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 45337, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 45428, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 45526, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 45617, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 45715, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 45813, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 45911, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46009, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46107, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 46198, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 46289, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46387, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46485, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46583, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46681, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46772, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46870, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46968, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47066, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47164, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47262, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47360, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47451, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47549, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47647, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47745, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47843, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47941, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48039, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 48116, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 48207, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48298, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48396, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48487, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 48571, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48669, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48767, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48865, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48963, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49061, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49159, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49257, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49355, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49453, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49551, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49649, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49747, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49845, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49943, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50041, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 50125, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 50210, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 50301, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50399, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50497, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50595, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50693, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 50784, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50875, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50973, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 51064, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 51162, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 51247, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 51332, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 51423, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 51521, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 51612, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 51703, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 51788, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 51879, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 51957, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 52041, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52139, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 52224, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52322, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 52407, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52505, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52603, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 52694, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52792, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52890, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52988, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53086, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53184, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53282, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53380, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53478, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53576, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53674, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53772, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53863, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53961, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54059, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54157, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54255, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54353, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54451, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54549, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54640, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54738, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54836, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54934, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55032, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55130, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55221, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55319, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55417, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55515, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55613, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55711, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55809, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55907, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56005, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56103, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56201, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56299, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56397, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56495, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56593, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56691, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56789, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56887, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56985, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57083, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57181, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57279, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57377, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57468, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57566, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57664, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57762, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57860, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57958, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58056, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58154, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58252, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58350, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58448, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58546, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58644, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58742, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58840, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58938, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59036, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59134, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59232, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59330, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59428, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 59519, .adv_w = 224, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 59578, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 59656, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59747, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 59838, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59936, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 60013, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 60097, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 60195, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 60286, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 60377, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 60475, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 60566, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 60664, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 60748, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 60839, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 60930, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61021, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61119, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 61210, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 61294, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 61379, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61477, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 61568, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 61659, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 61750, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 61841, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 61918, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62016, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 62107, .adv_w = 224, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 62177, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 62261, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62359, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62457, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 62534, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62632, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62717, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62808, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62906, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63004, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63102, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63200, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63298, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63396, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63494, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63592, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63690, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63788, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63886, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63984, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64082, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64180, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64271, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64369, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64467, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64565, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64663, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64761, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64852, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64950, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65048, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65146, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65244, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65342, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65440, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65538, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65636, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65734, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65832, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65930, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 66028, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 66126, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 66224, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 66322, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 66420, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 66518, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 66616, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 66714, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 66812, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 66910, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67008, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67106, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67204, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67302, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67400, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67498, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67596, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67694, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67792, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67890, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67988, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68086, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68184, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68282, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 68373, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 68464, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 68555, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68653, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 68744, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68842, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68940, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69038, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69136, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69234, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69332, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69430, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69528, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69626, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69724, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69822, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 69900, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 69984, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 70068, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 70159, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70257, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70355, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70453, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70551, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70649, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70747, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70845, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 70936, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71034, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71132, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71230, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71321, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71419, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71517, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 71608, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71706, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71804, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 71895, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71993, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72091, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72189, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72287, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72385, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72483, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72581, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72679, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72777, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72875, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72973, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73064, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73162, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73253, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 73344, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73442, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73540, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73638, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73736, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73834, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73932, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74023, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 74114, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74212, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74310, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74408, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74506, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74604, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74702, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74800, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74898, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74996, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75094, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75192, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75290, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75381, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75479, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75570, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75668, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75766, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75864, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75955, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 76046, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76137, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 76228, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76319, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 76410, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76508, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76606, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76704, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76802, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76893, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76991, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 77089, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 77187, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 77285, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 77383, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 77481, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 77579, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 77677, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 77768, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 77866, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 77950, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78041, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78139, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78237, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 78328, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78419, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78510, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78601, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 78661, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 78738, .adv_w = 224, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 78808, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 78886, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 78970, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 79055, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 79140, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79238, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 79329, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79420, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79518, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 79609, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 79700, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79798, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79889, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79987, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80085, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 80176, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 80253, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 80344, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 80435, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 80519, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 80589, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 80680, .adv_w = 224, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 80739, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 80830, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80921, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81019, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81117, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 81208, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 81292, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81390, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81488, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81586, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81677, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81775, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81873, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81971, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82069, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82167, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82265, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82363, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82461, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82559, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82657, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82755, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82853, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82951, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83049, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83147, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83245, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83343, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83441, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83539, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83637, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83735, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83833, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83931, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84029, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 84120, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 84211, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84309, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 84394, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84492, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84590, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84688, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84786, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84884, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84982, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85080, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85178, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85276, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85374, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85472, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85570, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85661, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85759, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85857, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85955, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86046, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 86137, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86235, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86333, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86431, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86529, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86627, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86725, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86823, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 86914, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87012, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87110, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87208, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87306, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87404, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87502, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87600, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87698, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87796, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87894, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87992, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88090, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88188, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88286, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88384, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 88475, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88573, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88671, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88769, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88867, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88965, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 89056, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89154, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89252, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89350, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89448, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 89532, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89630, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89728, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89826, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89924, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90022, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 90106, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90204, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90302, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90400, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90498, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 90575, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90666, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90764, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90855, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90946, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91037, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 91128, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91226, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91324, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91422, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91520, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91618, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91716, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91814, .adv_w = 224, .box_w = 9, .box_h = 14, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 91877, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 91968, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 92066, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 92164, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 92255, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 92353, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 92451, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 92549, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 92647, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 92724, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 92815, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 92913, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93011, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93109, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93207, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93305, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93403, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93501, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93599, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93697, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93795, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93893, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93984, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94082, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94180, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94278, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94376, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94474, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94572, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94670, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94768, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94866, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94964, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95062, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95160, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95258, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95356, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95454, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95539, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95630, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95728, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95826, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95924, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96015, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96113, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96211, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96309, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96400, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96498, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96596, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96687, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96785, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96883, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96981, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97079, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97177, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97275, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97373, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97471, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97569, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97667, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97765, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97863, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97961, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98059, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98157, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98255, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98353, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98451, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98549, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98647, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98745, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98843, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98941, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 99039, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 99137, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 99235, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 99333, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 99431, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 99529, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 99620, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 99718, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 99816, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 99914, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100012, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100110, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 100201, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100299, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100397, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100495, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100593, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100691, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 100782, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 100866, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100964, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 101055, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 101153, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 101244, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 101328, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 101419, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 101503, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 101587, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 101671, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 101755, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 101846, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 101944, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 102035, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102133, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102231, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102329, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102427, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102525, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102623, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102721, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 102805, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102903, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 102994, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103099, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103197, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103295, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103393, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103491, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103589, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103687, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103785, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103883, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103974, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104072, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104170, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104261, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104359, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104457, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 104548, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104646, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104744, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 104835, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104933, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 105017, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105115, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105213, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105311, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105402, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105500, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105598, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105696, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105794, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 105885, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105983, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106081, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106179, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106277, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106375, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106466, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106564, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 106655, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106753, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106851, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106949, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107047, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107145, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107243, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107341, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107439, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107530, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107615, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107713, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107811, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107909, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108000, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108091, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108189, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108287, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108385, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 108476, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108567, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108665, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108763, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108861, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108959, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 109057, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 109148, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 109239, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 109337, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 109435, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 109533, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 109617, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 109701, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 109785, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 109876, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 109967, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 110058, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 110136, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 110227, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 110318, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 110403, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 110487, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 110578, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 110669, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 110760, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 110851, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 110942, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 111033, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 111124, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 111215, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111313, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111411, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111509, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111600, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111698, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111796, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111894, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 111972, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 112070, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 112161, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 112246, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 112344, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 112442, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 112533, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 112631, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 112729, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 112827, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 112925, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113023, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113121, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113212, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 113303, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113401, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113499, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113597, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113695, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113793, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113891, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113989, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114087, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114185, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114283, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114381, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114479, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 114570, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114668, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114766, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114864, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114962, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115060, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115158, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115256, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115354, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115452, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115550, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115648, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115746, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 115837, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115935, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116026, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116124, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116222, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116313, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116411, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 116496, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116594, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116692, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116790, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116888, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 117001, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 117078, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 117169, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 117246, .adv_w = 154, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 117301, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 117406, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 117511, .adv_w = 252, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 117615, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 117720, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 117808, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 117913, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 117955, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 118021, .adv_w = 252, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 118133, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 118210, .adv_w = 154, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 118285, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 118355, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 118453, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 118538, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 118623, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 118693, .adv_w = 196, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 118784, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 118843, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 118902, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 118987, .adv_w = 196, .box_w = 13, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 119013, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 119101, .adv_w = 280, .box_w = 18, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 119236, .adv_w = 252, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 119364, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 119455, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 119507, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 119559, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 119658, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 119735, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 119840, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 119953, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 120038, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 120136, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 120221, .adv_w = 196, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 120299, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 120376, .adv_w = 140, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 120451, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 120549, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 120647, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 120735, .adv_w = 224, .box_w = 16, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 120855, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 120938, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 121055, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 121145, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 121235, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 121325, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 121415, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 121505, .adv_w = 280, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 121613, .adv_w = 196, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 121703, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 121801, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 121914, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 122013, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 122096, .adv_w = 225, .box_w = 15, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 122171, .adv_w = 224, .box_w = 5, .box_h = 12, .ofs_x = 7, .ofs_y = -1}, - {.bitmap_index = 122201, .adv_w = 224, .box_w = 5, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 122231, .adv_w = 224, .box_w = 3, .box_h = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 122239, .adv_w = 224, .box_w = 6, .box_h = 10, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 122269, .adv_w = 224, .box_w = 6, .box_h = 11, .ofs_x = 4, .ofs_y = 0} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1, 0x4, 0xb, 0xc, 0x40, 0x41, 0x42, - 0x43, 0x45, 0x46, 0x47 -}; - -static const uint8_t glyph_id_ofs_list_4[] = { - 0, 0, 0, 1, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 4, 5, 6, 0, 7, - 8, 9, 0, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 0, - 30, 31, 32, 0, 33, 34, 0, 35, - 36, 37, 38, 39, 40, 0, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, - 51, 0, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 0, - 65, 66, 67, 68, 69, 70, 71 -}; - -static const uint16_t unicode_list_5[] = { - 0x0, 0x4, 0x7, 0xd, 0x1d11, 0x1d14, 0x1d18, 0x1d19, - 0x1d1a, 0x1d1b, 0x1d1c, 0x1d1e, 0x1d24, 0x1d25, 0x1d27, 0x1d32, - 0x1d37, 0x1d3e, 0x1d4c, 0x1d56, 0x1d5c, 0x1d5f, 0x1d60, 0x1d68, - 0x1d6e, 0x1d70, 0x1d97, 0x1d99, 0x1d9a, 0x1d9c, 0x1d9d, 0x1da5, - 0x1dac, 0x1db2, 0x1db5, 0x1db7, 0x1dbd, 0x1dcb, 0x1dd1, 0x1ddb, - 0x1ddc, 0x1dde, 0x1de6, 0x1de7, 0x1de9, 0x1df4, 0x1df5, 0x1df6, - 0x1dff, 0x1e07, 0x1e0c, 0x1e0e, 0x1e12, 0x1e1b, 0x1e22, 0x1e2b, - 0x1e2e, 0x1e49, 0x1e4d, 0x1e57, 0x1e5e, 0x1e5f, 0x1e60, 0x1e64, - 0x1e66, 0x1e6a, 0x1e6d, 0x1e71, 0x1e90, 0x1e97, 0x1e9c, 0x1eac, - 0x1eae, 0x1eb2, 0x1ed0, 0x1ed3, 0x1eee, 0x1ef2, 0x1eff, 0x1f1c, - 0x1f22, 0x1f2a, 0x1f30, 0x1f35, 0x1f4d, 0x1f6b, 0x1f6d, 0x1f76, - 0x1f85, 0x1faa, 0x1fc4, 0x1fd6, 0x1fde, 0x1fe0, 0x1fe6, 0x200a, - 0x2015, 0x203b, 0x2050, 0x2054, 0x2055, 0x2056, 0x2059, 0x205a, - 0x205c, 0x205e, 0x2063, 0x206b, 0x2076, 0x2078, 0x2079, 0x207a, - 0x207c, 0x207d, 0x207e, 0x2082, 0x2087, 0x2088, 0x2096, 0x2097, - 0x209b, 0x209e, 0x20aa, 0x20ac, 0x20bd, 0x20c8, 0x20de, 0x20ee, - 0x20f7, 0x210b, 0x2117, 0x2118, 0x211b, 0x2128, 0x212e, 0x2135, - 0x2136, 0x213a, 0x2141, 0x2147, 0x2149, 0x214c, 0x2158, 0x215b, - 0x215e, 0x216c, 0x2183, 0x2186, 0x2194, 0x21ac, 0x21b0, 0x21b1, - 0x21b9, 0x21ba, 0x21bb, 0x21c4, 0x21da, 0x21e6, 0x21ea, 0x21ee, - 0x21f5, 0x2206, 0x2216, 0x2227, 0x2228, 0x224c, 0x2251, 0x2252, - 0x2254, 0x2259, 0x225b, 0x2263, 0x2265, 0x2268, 0x2269, 0x2282, - 0x2284, 0x228c, 0x22ab, 0x22b0, 0x22c4, 0x22cc, 0x22d3, 0x22d4, - 0x22d9, 0x22db, 0x22dc, 0x22de, 0x22e7, 0x22e8, 0x22f4, 0x22f5, - 0x22f6, 0x22f7, 0x22fb, 0x22fc, 0x2300, 0x2301, 0x2303, 0x2304, - 0x2308, 0x2309, 0x2314, 0x2315, 0x2319, 0x231d, 0x231e, 0x2322, - 0x2337, 0x2338, 0x2351, 0x235b, 0x2373, 0x2379, 0x2384, 0x238d, - 0x238e, 0x239d, 0x23c3, 0x23d2, 0x23f2, 0x23fb, 0x2457, 0x245b, - 0x2460, 0x2477, 0x2495, 0x249a, 0x24ad, 0x24ae, 0x24bf, 0x24c7, - 0x24df, 0x2500, 0x252c, 0x25c5, 0x25ec, 0x25ef, 0x25f1, 0x2601, - 0x2604, 0x260e, 0x261c, 0x261e, 0x2623, 0x2629, 0x2630, 0x2634, - 0x2639, 0x2641, 0x2658, 0x265b, 0x2661, 0x269c, 0x26f0, 0x2708, - 0x270b, 0x2742, 0x2745, 0x275b, 0x277a, 0x2794, 0x27a8, 0x27af, - 0x27db, 0x27e4, 0x27fc, 0x2801, 0x2803, 0x281a, 0x2820, 0x2826, - 0x2827, 0x282b, 0x282d, 0x2831, 0x2838, 0x283a, 0x283b, 0x283c, - 0x283f, 0x2842, 0x2858, 0x2862, 0x2868, 0x2884, 0x288a, 0x288e, - 0x2893, 0x2898, 0x28c4, 0x28ca, 0x28cc, 0x28da, 0x28dc, 0x28e1, - 0x28e5, 0x2929, 0x296b, 0x2977, 0x29a3, 0x29ce, 0x29dd, 0x2a1a, - 0x2a61, 0x2a68, 0x2a69, 0x2a74, 0x2a77, 0x2a7a, 0x2a7c, 0x2a89, - 0x2a94, 0x2a96, 0x2a98, 0x2a99, 0x2a9a, 0x2a9d, 0x2aa9, 0x2aaa, - 0x2aab, 0x2aaf, 0x2ab0, 0x2ab3, 0x2ab5, 0x2ac4, 0x2ac6, 0x2ac7, - 0x2aca, 0x2ad0, 0x2ad5, 0x2ad7, 0x2add, 0x2ae3, 0x2aee, 0x2af0, - 0x2af7, 0x2afc, 0x2b0b, 0x2b0f, 0x2b15, 0x2b18, 0x2b19, 0x2b1e, - 0x2b1f, 0x2b20, 0x2b22, 0x2b2b, 0x2b35, 0x2b42, 0x2b4b, 0x2b51, - 0x2b56, 0x2b5b, 0x2b5c, 0x2b66, 0x2b76, 0x2b7d, 0x2b82, 0x2c07, - 0x2c5d, 0x2cee, 0x2cef, 0x2cf6, 0x2cf7, 0x2cff, 0x2d02, 0x2d03, - 0x2d13, 0x2d14, 0x2d19, 0x2d1d, 0x2d3c, 0x2d3e, 0x2d40, 0x2d41, - 0x2d44, 0x2d47, 0x2d49, 0x2d56, 0x2d84, 0x2d85, 0x2d89, 0x2d8f, - 0x2d94, 0x2d97, 0x2da6, 0x2da8, 0x2dad, 0x2db7, 0x2db8, 0x2dbc, - 0x2dbe, 0x2dc8, 0x2df1, 0x2e0b, 0x2e10, 0x2e20, 0x2e26, 0x2e30, - 0x2e42, 0x2e46, 0x2e48, 0x2e64, 0x2e73, 0x2e82, 0x2e8a, 0x2e8d, - 0x2e91, 0x2e96, 0x2e99, 0x2e9c, 0x2e9d, 0x2ea3, 0x2ea4, 0x2ea8, - 0x2eaf, 0x2eb2, 0x2eba, 0x2ed4, 0x2ed6, 0x2ee9, 0x2eea, 0x2efc, - 0x2f06, 0x2f1f, 0x2f23, 0x2f26, 0x2f2e, 0x2f36, 0x2f38, 0x2f80, - 0x2fb9, 0x2fbb, 0x2fc3, 0x2fd6, 0x3004, 0x3019, 0x3020, 0x302b, - 0x302c, 0x3030, 0x305c, 0x3074, 0x3078, 0x307f, 0x30da, 0x3109, - 0x3121, 0x3122, 0x3127, 0x3137, 0x3141, 0x314c, 0x3150, 0x3151, - 0x315c, 0x315e, 0x3164, 0x3166, 0x318f, 0x3191, 0x319b, 0x31a6, - 0x31cd, 0x31d6, 0x31da, 0x31ec, 0x31f2, 0x31fd, 0x31fe, 0x3210, - 0x3212, 0x3218, 0x322a, 0x3266, 0x3279, 0x3299, 0x32a3, 0x32ac, - 0x32b2, 0x32b3, 0x32b6, 0x32b8, 0x32b9, 0x32e0, 0x32e1, 0x32ec, - 0x32ff, 0x330b, 0x334b, 0x33d2, 0x33d8, 0x33e5, 0x33eb, 0x3440, - 0x344a, 0x344f, 0x3450, 0x3456, 0x3459, 0x3468, 0x346a, 0x3473, - 0x3481, 0x3485, 0x3498, 0x34aa, 0x34be, 0x34c1, 0x34c8, 0x34ca, - 0x34cd, 0x34ce, 0x34d2, 0x34d6, 0x34e0, 0x34f3, 0x34f6, 0x34f7, - 0x34fa, 0x3507, 0x3518, 0x351f, 0x3524, 0x3525, 0x3530, 0x3531, - 0x3536, 0x3539, 0x3540, 0x354d, 0x3553, 0x357a, 0x357f, 0x3580, - 0x3585, 0x358b, 0x3598, 0x35a2, 0x35a7, 0x35a8, 0x35d8, 0x35ed, - 0x3603, 0x3605, 0x3609, 0x360f, 0x3610, 0x3611, 0x3614, 0x3619, - 0x361a, 0x361c, 0x361e, 0x362c, 0x362e, 0x3630, 0x3639, 0x363b, - 0x363c, 0x363d, 0x363e, 0x364b, 0x3661, 0x3662, 0x3670, 0x3672, - 0x3676, 0x3680, 0x3682, 0x36a1, 0x36a8, 0x36ad, 0x36e1, 0x36f6, - 0x3702, 0x370c, 0x3710, 0x3722, 0x3732, 0x373b, 0x374a, 0x374d, - 0x3754, 0x3759, 0x37ae, 0x37c1, 0x37ff, 0x381e, 0x382d, 0x386b, - 0x387e, 0x3886, 0x388e, 0x3893, 0x38dc, 0x38e9, 0x3913, 0x392a, - 0x3932, 0x3934, 0x393b, 0x394a, 0x395c, 0x3970, 0x3a32, 0x3a43, - 0x3a5d, 0x3a61, 0x3a72, 0x3a73, 0x3a74, 0x3a75, 0x3a76, 0x3a7a, - 0x3a80, 0x3a83, 0x3a84, 0x3a88, 0x3a8c, 0x3a9b, 0x3a9c, 0x3ac6, - 0x3ade, 0x3adf, 0x3ae0, 0x3ae5, 0x3aec, 0x3b20, 0x3b22, 0x3b25, - 0x3b28, 0x3b45, 0x3b48, 0x3b49, 0x3b53, 0x3b6b, 0x3b71, 0x3b8b, - 0x3b99, 0x3ba3, 0x3bca, 0x3bcc, 0x3bd2, 0x3bdb, 0x3be6, 0x3bf3, - 0x3bf4, 0x3bf9, 0x3c04, 0x3c1c, 0x3c28, 0x3c43, 0x3c4c, 0x3c4f, - 0x3c52, 0x3c56, 0x3c85, 0x3c88, 0x3c99, 0x3ccd, 0x3d02, 0x3d08, - 0x3d16, 0x3d18, 0x3d19, 0x3d1a, 0x3d2c, 0x3d32, 0x3d3a, 0x3d40, - 0x3d67, 0x3da1, 0x3da7, 0x3dae, 0x3e10, 0x3e33, 0x3e49, 0x3ed4, - 0x3ef0, 0x3f74, 0x3f7c, 0x3f8e, 0x3fca, 0x3fcb, 0x4032, 0x4047, - 0x406a, 0x40c2, 0x40f0, 0x413e, 0x4147, 0x4149, 0x4158, 0x416c, - 0x4171, 0x417a, 0x418a, 0x41bd, 0x41c0, 0x41c7, 0x41d1, 0x41fd, - 0x41fe, 0x423c, 0x4250, 0x4283, 0x42ba, 0x430f, 0x4314, 0x4317, - 0x43c1, 0x4429, 0x442b, 0x4430, 0x4433, 0x4434, 0x4439, 0x4441, - 0x4442, 0x4444, 0x4446, 0x4448, 0x444b, 0x444c, 0x445d, 0x446a, - 0x447b, 0x447c, 0x4481, 0x4487, 0x44c3, 0x44d6, 0x44ec, 0x458b, - 0x458d, 0x458e, 0x458f, 0x4595, 0x4597, 0x45d0, 0x45e8, 0x45ff, - 0x4605, 0x4609, 0x461c, 0x4630, 0x4631, 0x464f, 0x4651, 0x46f6, - 0x46fe, 0x4704, 0x4713, 0x4725, 0x4745, 0x47cb, 0x484b, 0x484d, - 0x484f, 0x4867, 0x486e, 0x486f, 0x487e, 0x4892, 0x48d1, 0x48d2, - 0x48dc, 0x48de, 0x48e2, 0x48e9, 0x490c, 0x491c, 0x493f, 0x495e, - 0x4987, 0x498b, 0x49a4, 0x49dc, 0x49ea, 0x49f6, 0x4a00, 0x4a22, - 0x4a37, 0x4a3d, 0x4a57, 0x4a5a, 0x4a65, 0x4a67, 0x4aa8, 0x4ab2, - 0x4ad1, 0x4ad5, 0x4b32, 0x4b84, 0x4bcf, 0x4be7, 0x4c0c, 0x4c11, - 0x4c15, 0x4c2a, 0x4c31, 0x4c41, 0x4c4a, 0x4c53, 0x4c55, 0x4c5d, - 0x4c61, 0x4c72, 0x4c77, 0x4c82, 0x4c86, 0x4ca4, 0x4cab, 0x4cbe, - 0x4cc3, 0x4ce2, 0x4ce3, 0x4ceb, 0x4cf1, 0x4cfa, 0x4d05, 0x4d4e, - 0x4d4f, 0x4d65, 0x4d81, 0x4d8d, 0x4d9d, 0x4df0, 0x4e4b, 0x4e7f, - 0x4e9f, 0x4eba, 0x4ee3, 0x4f12, 0x4f14, 0x4f16, 0x4f1d, 0x4f44, - 0x4f6f, 0x4f80, 0x4f83, 0x4f88, 0x4f8e, 0x4f9a, 0x4fba, 0x4fc0, - 0x4fc3, 0x4fdd, 0x5009, 0x500e, 0x5042, 0x505b, 0x5066, 0x5077, - 0x5081, 0x50ae, 0x50da, 0x50fb, 0x5104, 0x510b, 0x5118, 0x5119, - 0x511a, 0x513b, 0x513d, 0x514a, 0x5180, 0x5183, 0x5193, 0x51c2, - 0x51f6, 0x51f7, 0x5202, 0x5247, 0x5288, 0x52e4, 0x52ed, 0x534e, - 0x535a, 0x5368, 0x5446, 0x5495, 0x54bd, 0x54ee, 0x5518, 0x5566, - 0x575d, 0x5764, 0x5779, 0x57bc, 0x57e0, 0x57ed, 0x57f2, 0x580e, - 0x5818, 0x5890, 0x5892, 0x589c, 0x58a0, 0x58a7, 0x58ab, 0x58bb, - 0x58cb, 0x58d1, 0x58e3, 0x58f4, 0x58f7, 0x5911, 0x5919, 0x591b, - 0x591f, 0x5924, 0x5929, 0x593b, 0x593e, 0x5942, 0x5944, 0x5945, - 0x5966, 0x5977, 0x5982, 0x5983, 0x5984, 0x599d, 0x599e, 0x59a6, - 0x59a9, 0x59af, 0x59bb, 0x59bd, 0x59be, 0x59c1, 0x59c3, 0x59d0, - 0x59d8, 0x59dc, 0x59e7, 0x5a09, 0x5a13, 0x5a2c, 0x5a2e, 0x5a69, - 0x5a81, 0x5a88, 0x5a9b, 0x5aa4, 0x5ab2, 0x5aef, 0x5b61, 0x5b72, - 0x5bb1, 0x5bb2, 0x5bb8, 0x5bba, 0x5bbd, 0x5bc8, 0x5bc9, 0x5bcc, - 0x5bd0, 0x5bd4, 0x5bd8, 0x5bfb, 0x5c0e, 0x5c4a, 0x5c75, 0x5c81, - 0x5c88, 0x5c96, 0x5c9b, 0x5cb4, 0x5cc4, 0x5cf0, 0x5d00, 0x5dbc, - 0x5ddb, 0x5df0, 0x5df3, 0x5e0e, 0x5e14, 0x5e1a, 0x5e26, 0x5e3b, - 0x5e49, 0x5eac, 0x5eaf, 0x5eb7, 0x5ec3, 0x5ecb, 0x5ecd, 0x5edf, - 0x5ee2, 0x5ee5, 0x5efc, 0x5f0e, 0x5f11, 0x5f12, 0x5f14, 0x5f20, - 0x5f21, 0x5f2a, 0x5f2b, 0x5f30, 0x5f31, 0x5f34, 0x5f3f, 0x5f42, - 0x5f43, 0x5f56, 0x5f5b, 0x5f5c, 0x5f5f, 0x5f64, 0x5f65, 0x5f66, - 0x5f71, 0x5f7a, 0x5f89, 0x5f90, 0x5f95, 0x5f9b, 0x5fb4, 0x5fbb, - 0x5ff9, 0x6006, 0x600e, 0x605e, 0x6063, 0x6065, 0x6089, 0x60bc, - 0x60de, 0x60df, 0x60e0, 0x60e2, 0x60ee, 0x6155, 0x616c, 0x6191, - 0x6233, 0x6240, 0x6243, 0x6488, 0x649a, 0x649c, 0x64a4, 0x64b3, - 0x64ed, 0x6501, 0x6544, 0x6555, 0x655e, 0x6561, 0x6573, 0x6575, - 0x6589, 0x658e, 0x659f, 0x65ac, 0x65ad, 0x65b4, 0x65b9, 0x65cc, - 0x65d7, 0x65e2, 0x65e7, 0x65ea, 0x65f3, 0x65f4, 0x65f9, 0x65fb, - 0x6603, 0x660c, 0x6611, 0x6618, 0x6663, 0x666a, 0x666f, 0x6673, - 0x667a, 0x6685, 0x6704, 0x6710, 0x6714, 0x6716, 0x6719, 0x6728, - 0x6729, 0x673e, 0x674d, 0x675d, 0x6765, 0x6769, 0x676f, 0x6780, - 0x67b9, 0x67ec, 0x67f0, 0x6800, 0x6803, 0x6839, 0x68a7, 0x68aa, - 0x68d5, 0x68d6, 0x6923, 0x6924, 0x6968, 0x69e5, 0x69e9, 0x69fb, - 0x6a6b, 0x6bf6, 0x6da8, 0x6dcd, 0x6dd5, 0x6de3, 0x6def, 0x6df9, - 0x6e24, 0x6e4c, 0xbf12, 0xbf19, 0xbf1c, 0xbf1d, 0xbf1e, 0xbf22, - 0xbf24, 0xbf26, 0xbf2a, 0xbf2d, 0xbf32, 0xbf37, 0xbf38, 0xbf39, - 0xbf4f, 0xbf54, 0xbf59, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf62, 0xbf63, - 0xbf64, 0xbf65, 0xbf78, 0xbf79, 0xbf7f, 0xbf81, 0xbf82, 0xbf85, - 0xbf88, 0xbf89, 0xbf8a, 0xbf8c, 0xbfa4, 0xbfa6, 0xbfd5, 0xbfd6, - 0xbfd8, 0xbfda, 0xbff1, 0xbff8, 0xbffb, 0xc004, 0xc02d, 0xc035, - 0xc06c, 0xc0fc, 0xc151, 0xc152, 0xc153, 0xc154, 0xc155, 0xc198, - 0xc1a4, 0xc1fe, 0xc215, 0xc46b, 0xc6d3, 0xc7b3, 0xce19, 0xce1a, - 0xce1d, 0xce22, 0xce23 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 96, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 12289, .range_length = 72, .glyph_id_start = 97, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 12, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - }, - { - .range_start = 12362, .range_length = 24, .glyph_id_start = 109, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 12387, .range_length = 43, .glyph_id_start = 133, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 12431, .range_length = 95, .glyph_id_start = 176, - .unicode_list = NULL, .glyph_id_ofs_list = glyph_id_ofs_list_4, .list_length = 95, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL - }, - { - .range_start = 12527, .range_length = 52772, .glyph_id_start = 248, - .unicode_list = unicode_list_5, .glyph_id_ofs_list = NULL, .list_length = 1187, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = NULL, - .kern_scale = 0, - .cmap_num = 6, - .bpp = 4, - .kern_classes = 0, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_simsun_14_cjk = { -#else -lv_font_t lv_font_simsun_14_cjk = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 15, /*The maximum line height required by the font*/ - .base_line = 2, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -2, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_SIMSUN_14_CJK*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_simsun_16_cjk.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_simsun_16_cjk.c deleted file mode 100644 index e8b2f28..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_simsun_16_cjk.c +++ /dev/null @@ -1,24148 +0,0 @@ -/******************************************************************************* - * Size: 16 px - * Bpp: 4 - * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font SimSun.woff -r 0x20-0x7f --symbols (),盗提陽帯鼻画輕ッ冊ェル写父ぁフ結想正四O夫源庭場天續鳥れ講猿苦階給了製守8祝己妳薄泣塩帰ぺ吃変輪那着仍嗯爭熱創味保字宿捨準查達肯ァ薬得査障該降察ね網加昼料等図邪秋コ態品屬久原殊候路願楽確針上被怕悲風份重歡っ附ぷ既4黨價娘朝凍僅際洋止右航よ专角應酸師個比則響健昇豐筆歷適修據細忙跟管長令家ザ期般花越ミ域泳通些油乏ラ。營ス返調農叫樹刊愛間包知把ヤ貧橋拡普聞前ジ建当繰ネ送習渇用補ィ覺體法遊宙ョ酔余利壊語くつ払皆時辺追奇そ們只胸械勝住全沈力光ん深溝二類北面社值試9和五勵ゃ貿幾逐打課ゲて領3鼓辦発評1渉詳暇込计駄供嘛郵頃腦反構絵お容規借身妻国慮剛急乗静必議置克土オ乎荷更肉還混古渡授合主離條値決季晴東大尚央州が嗎験流先医亦林田星晩拿60旅婦量為痛テ孫う環友況玩務其ぼち揺坐一肩腰犯タょ希即果ぶ物練待み高九找やヶ都グ去」サ、气仮雑酒許終企笑録形リ銀切ギ快問滿役単黄集森毎實研喜蘇司鉛洲川条媽ノ才兩話言雖媒出客づ卻現異故り誌逮同訊已視本題ぞを横開音第席費持眾怎選元退限ー賽処喝就残無いガ多ケ沒義遠歌隣錢某雪析嬉採自透き側員予ゼ白婚电へ顯呀始均畫似懸格車騒度わ親店週維億締慣免帳電甚來園浴ゅ愈京と杯各海怒ぜ排敗挙老買7極模実紀ヒ携隻告シ並屋這孩讓質ワブ富賃争康由辞マ火於短樣削弟材注節另室ダ招擁ぃ若套底波行勤關著泊背疲狭作念推ぐ民貸祖介說ビ代温契你我レ入描變再札ソ派頭智遅私聽舉灣山伸放直安ト誕煙付符幅ふ絡她届耳飲忘参革團仕様載ど歩獲嫌息の汚交興魚指資雙與館初学年幸史位柱族走括び考青也共腕Lで販擔理病イ今逃當寺猫邊菓係ム秘示解池影ド文例斷曾事茶寫明科桃藝売便え導禁財飛替而亡到し具空寝辛業ウ府セ國何基菜厳市努張缺雲根外だ断万砂ゴ超使台实ぽ礼最慧算軟界段律像夕丈窓助刻月夏政呼ぴざ擇趣除動従涼方勉名線対存請子氏將5少否諸論美感或西者定食御表は參歳緑命進易性錯房も捕皿判中觀戦ニ緩町ピ番ず金千ろ?不た象治関ャ每看徒卒統じ手範訪押座步号ベ旁以母すほ密減成往歲件緒読歯效院种七謂凝濃嵌震喉繼クュ拭死円2積水欲如ポにさ寒道區精啦姐ア聯能足及停思壓2春且メ裏株官答概黒過氷柿戻厚ぱ党祭織引計け委暗複誘港バ失下村較続神ぇ尤強秀膝兒来績十書済化服破新廠1紹您情半式產系好教暑早め樂地休協良な哪常要揮周かエ麗境働避護ンツ香夜太見設非改広聲他検求危清彼經未在起葉控靴所差內造寄南望尺換向展備眠點完約ぎ裡分説申童優伝島机須塊日立拉,鉄軽單気信很転識支布数紙此迎受心輸坊モ處「訳三曇兄野顔戰增ナ伊列又髪両有取左毛至困吧昔赤狀相夠整別士経頼然簡ホ会發隨営需脱ヨば接永居冬迫圍甘醫誰部充消連弱宇會咲覚姉麼的増首统帶糖朋術商担移景功育庫曲總劃牛程駅犬報ロ學責因パ嚴八世後平負公げ曜陸專午之閉ぬ談ご災昨冷職悪謝對它近射敢意運船臉局難什産頗!球真記ま但蔵究制機案湖臺ひ害券男留内木驗雨施種特復句末濟キ色訴依せ百型る石牠討呢时任執飯歐宅組傳配小活ゆべ暖ズ漸站素らボ束価チ浅回女片独妹英目從認生違策僕楚ペ米こ掛む爸六状落漢プ投カ校做啊洗声探あ割体項履触々訓技ハ低工映是標速善点人デ口次可廿节宵植树端阳旦腊妇费愚劳动儿军师庆圣诞闰 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_simsun_16_cjk.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_SIMSUN_16_CJK - #define LV_FONT_SIMSUN_16_CJK 1 -#endif - -#if LV_FONT_SIMSUN_16_CJK - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x97, 0xb9, 0xa8, 0x97, 0x75, 0x64, 0x53, 0x53, - 0x0, 0x0, 0xa8, 0xb9, - - /* U+0022 "\"" */ - 0x2, 0xe1, 0x98, 0xa, 0xc3, 0xf4, 0x2c, 0xa, - 0x60, 0x81, 0x27, 0x0, 0x0, 0x0, 0x0, - - /* U+0023 "#" */ - 0x0, 0x90, 0x3, 0x50, 0x0, 0x90, 0x4, 0x40, - 0x0, 0x90, 0x6, 0x40, 0x7f, 0xff, 0xff, 0xf6, - 0x13, 0xa3, 0x39, 0x41, 0x0, 0x80, 0x8, 0x0, - 0x1, 0x70, 0x9, 0x0, 0x3, 0x70, 0x9, 0x0, - 0x7f, 0xff, 0xff, 0xf6, 0x17, 0x73, 0x3a, 0x31, - 0x5, 0x30, 0x9, 0x0, 0x6, 0x20, 0x9, 0x0, - - /* U+0024 "$" */ - 0x0, 0x45, 0x0, 0x6, 0xaa, 0x80, 0x48, 0x45, - 0x86, 0x95, 0x45, 0xc7, 0x7b, 0x45, 0x20, 0x1e, - 0xc5, 0x0, 0x2, 0xec, 0x0, 0x0, 0x4f, 0xb0, - 0x0, 0x45, 0xd5, 0x52, 0x45, 0x6a, 0xe7, 0x45, - 0x49, 0xa4, 0x45, 0x74, 0x18, 0x9a, 0x60, 0x0, - 0x45, 0x0, 0x0, 0x45, 0x0, - - /* U+0025 "%" */ - 0x19, 0x80, 0x3, 0x20, 0x82, 0x64, 0x8, 0x0, - 0xb0, 0x47, 0x7, 0x0, 0xc0, 0x48, 0x61, 0x0, - 0xb0, 0x47, 0x70, 0x0, 0x73, 0x76, 0x50, 0x0, - 0x7, 0x67, 0x7, 0x60, 0x0, 0x7, 0x64, 0x64, - 0x0, 0x42, 0xa1, 0x38, 0x0, 0x70, 0xb1, 0x39, - 0x1, 0x50, 0x82, 0x47, 0x5, 0x0, 0x19, 0x91, - - /* U+0026 "&" */ - 0x0, 0x88, 0x50, 0x0, 0x6, 0x40, 0xc0, 0x0, - 0x9, 0x30, 0xd0, 0x0, 0x8, 0x53, 0x90, 0x0, - 0x6, 0x99, 0x10, 0x0, 0x5, 0xf0, 0x2a, 0x80, - 0x18, 0xd4, 0x9, 0x10, 0x84, 0x6a, 0x8, 0x0, - 0xc2, 0xe, 0x38, 0x0, 0xb3, 0x6, 0xe5, 0x0, - 0x6a, 0x0, 0xe9, 0x5, 0x9, 0xc9, 0x2b, 0xc3, - - /* U+0027 "'" */ - 0xb, 0xb0, 0x7, 0xf0, 0x0, 0xc0, 0x8, 0x30, - 0x1, 0x0, - - /* U+0028 "(" */ - 0x0, 0x6, 0x10, 0x4, 0x60, 0x0, 0xb0, 0x0, - 0x84, 0x0, 0xd, 0x0, 0x4, 0xa0, 0x0, 0x67, - 0x0, 0x8, 0x60, 0x0, 0x77, 0x0, 0x6, 0x80, - 0x0, 0x2c, 0x0, 0x0, 0xc1, 0x0, 0x5, 0x70, - 0x0, 0xa, 0x10, 0x0, 0x19, 0x0, 0x0, 0x21, - - /* U+0029 ")" */ - 0x16, 0x0, 0x0, 0x74, 0x0, 0x0, 0xb0, 0x0, - 0x5, 0x70, 0x0, 0xd, 0x0, 0x0, 0xb3, 0x0, - 0x8, 0x50, 0x0, 0x77, 0x0, 0x8, 0x60, 0x0, - 0x95, 0x0, 0xc, 0x10, 0x1, 0xb0, 0x0, 0x84, - 0x0, 0x29, 0x0, 0x9, 0x0, 0x1, 0x10, 0x0, - - /* U+002A "*" */ - 0x0, 0x7, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, - 0x5d, 0x26, 0x52, 0xd4, 0x18, 0xd6, 0x6d, 0x80, - 0x0, 0x1b, 0xa1, 0x0, 0x8, 0xd6, 0x6d, 0x80, - 0x5d, 0x27, 0x52, 0xd4, 0x0, 0x9, 0x70, 0x0, - 0x0, 0x9, 0x70, 0x0, - - /* U+002B "+" */ - 0x0, 0x2, 0x40, 0x0, 0x0, 0x3, 0x60, 0x0, - 0x0, 0x3, 0x60, 0x0, 0x0, 0x3, 0x60, 0x0, - 0x39, 0x9a, 0xc9, 0x94, 0x0, 0x3, 0x60, 0x0, - 0x0, 0x3, 0x60, 0x0, 0x0, 0x3, 0x60, 0x0, - 0x0, 0x2, 0x40, 0x0, - - /* U+002C "," */ - 0xb, 0xb0, 0x7, 0xf0, 0x0, 0xc0, 0x8, 0x40, - 0x2, 0x0, - - /* U+002D "-" */ - 0x49, 0x99, 0x99, 0x94, - - /* U+002E "." */ - 0x0, 0xcb, 0xbb, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x71, - 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x5, 0x20, - 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x44, 0x0, - 0x0, 0x0, 0x80, 0x0, 0x0, 0x2, 0x60, 0x0, - 0x0, 0x8, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, - 0x0, 0x71, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, - 0x5, 0x30, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, - 0x35, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x6a, 0x95, 0x0, 0x3, 0xc0, 0xb, 0x30, - 0xb, 0x60, 0x6, 0xa0, 0xf, 0x20, 0x2, 0xf0, - 0x2f, 0x0, 0x1, 0xf1, 0x3f, 0x0, 0x0, 0xf2, - 0x3f, 0x0, 0x0, 0xf2, 0x2f, 0x0, 0x1, 0xf1, - 0xf, 0x20, 0x2, 0xe0, 0xb, 0x50, 0x6, 0xa0, - 0x3, 0xc0, 0xb, 0x30, 0x0, 0x6a, 0x95, 0x0, - - /* U+0031 "1" */ - 0x0, 0x17, 0x0, 0x16, 0xd9, 0x0, 0x0, 0x79, - 0x0, 0x0, 0x79, 0x0, 0x0, 0x79, 0x0, 0x0, - 0x79, 0x0, 0x0, 0x79, 0x0, 0x0, 0x79, 0x0, - 0x0, 0x79, 0x0, 0x0, 0x79, 0x0, 0x0, 0x79, - 0x0, 0x16, 0xde, 0x72, - - /* U+0032 "2" */ - 0x0, 0x77, 0x89, 0x0, 0x92, 0x0, 0x88, 0xe, - 0x20, 0x4, 0xc0, 0xd5, 0x0, 0x3c, 0x0, 0x0, - 0x8, 0x80, 0x0, 0x1, 0xd1, 0x0, 0x0, 0x93, - 0x0, 0x0, 0x74, 0x0, 0x0, 0x55, 0x0, 0x0, - 0x28, 0x0, 0x6, 0x9, 0x0, 0x1, 0xa2, 0xff, - 0xff, 0xfb, - - /* U+0033 "3" */ - 0x1, 0x77, 0xa5, 0x0, 0xa2, 0x0, 0xd3, 0xd, - 0x40, 0x8, 0x80, 0x10, 0x0, 0x96, 0x0, 0x0, - 0x2c, 0x10, 0x0, 0x8d, 0x20, 0x0, 0x0, 0xb, - 0x30, 0x0, 0x0, 0x4c, 0x3, 0x0, 0x2, 0xf0, - 0xf4, 0x0, 0x3d, 0xd, 0x30, 0x9, 0x60, 0x28, - 0x78, 0x70, - - /* U+0034 "4" */ - 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0xac, 0x0, - 0x0, 0x3, 0x8c, 0x0, 0x0, 0x8, 0x4c, 0x0, - 0x0, 0x53, 0x4c, 0x0, 0x0, 0x80, 0x4c, 0x0, - 0x6, 0x20, 0x4c, 0x0, 0x7, 0x0, 0x4c, 0x0, - 0x47, 0x66, 0x8d, 0x62, 0x0, 0x0, 0x4c, 0x0, - 0x0, 0x0, 0x4c, 0x0, 0x0, 0x5, 0xaf, 0x71, - - /* U+0035 "5" */ - 0x5, 0xff, 0xff, 0xb0, 0x61, 0x0, 0x0, 0x7, - 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x7, 0x5a, - 0xca, 0x0, 0x85, 0x0, 0xa7, 0x1, 0x0, 0x3, - 0xd0, 0x0, 0x0, 0x1f, 0x7, 0x20, 0x1, 0xe0, - 0xf4, 0x0, 0x3c, 0xb, 0x10, 0x9, 0x50, 0x17, - 0x79, 0x80, - - /* U+0036 "6" */ - 0x0, 0x28, 0x7b, 0x20, 0x1, 0xa0, 0xa, 0x80, - 0x9, 0x40, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, - 0x1f, 0x2a, 0xbb, 0x10, 0x3f, 0x90, 0x7, 0xa0, - 0x3f, 0x20, 0x0, 0xf0, 0x3f, 0x0, 0x0, 0xe2, - 0x1f, 0x10, 0x0, 0xe2, 0xd, 0x40, 0x0, 0xe0, - 0x6, 0xb0, 0x4, 0x90, 0x0, 0x79, 0x88, 0x0, - - /* U+0037 "7" */ - 0xaf, 0xff, 0xff, 0xb, 0x30, 0x1, 0x80, 0x60, - 0x0, 0x71, 0x0, 0x0, 0x8, 0x0, 0x0, 0x7, - 0x30, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x49, 0x0, - 0x0, 0x9, 0x50, 0x0, 0x0, 0xd3, 0x0, 0x0, - 0xf, 0x30, 0x0, 0x2, 0xf3, 0x0, 0x0, 0x1e, - 0x20, 0x0, - - /* U+0038 "8" */ - 0x1, 0x87, 0x78, 0x0, 0xa, 0x20, 0x4, 0x80, - 0xd, 0x0, 0x0, 0xd0, 0xe, 0x20, 0x0, 0xc0, - 0x7, 0xd3, 0x7, 0x50, 0x0, 0x9f, 0xc6, 0x0, - 0x5, 0x72, 0xbe, 0x10, 0xc, 0x0, 0x9, 0xb0, - 0x39, 0x0, 0x0, 0xf0, 0x3a, 0x0, 0x0, 0xe0, - 0xb, 0x10, 0x3, 0x90, 0x1, 0x87, 0x78, 0x0, - - /* U+0039 "9" */ - 0x1, 0x98, 0x86, 0x0, 0xa, 0x40, 0x9, 0x40, - 0x1e, 0x0, 0x4, 0xb0, 0x3c, 0x0, 0x2, 0xf0, - 0x4c, 0x0, 0x1, 0xf1, 0x2e, 0x0, 0x6, 0xf1, - 0xc, 0x70, 0x29, 0xf1, 0x1, 0x99, 0x73, 0xf0, - 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, 0x9, 0x50, - 0xa, 0x80, 0x1c, 0x0, 0x4, 0xb7, 0x91, 0x0, - - /* U+003A ":" */ - 0xc8, 0xb7, 0x0, 0x0, 0x0, 0x0, 0xb7, 0xc8, - - /* U+003B ";" */ - 0xda, 0x64, 0x0, 0x0, 0x0, 0x0, 0x65, 0xda, - 0x56, 0x90, - - /* U+003C "<" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x38, 0x0, 0x2, - 0x90, 0x0, 0x19, 0x0, 0x1, 0xa0, 0x0, 0xa, - 0x10, 0x0, 0xa1, 0x0, 0x0, 0x56, 0x0, 0x0, - 0x6, 0x50, 0x0, 0x0, 0x74, 0x0, 0x0, 0x8, - 0x30, 0x0, 0x0, 0x92, 0x0, 0x0, 0x6, - - /* U+003D "=" */ - 0x49, 0x99, 0x99, 0x94, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x49, 0x99, 0x99, 0x94, - - /* U+003E ">" */ - 0x10, 0x0, 0x0, 0x83, 0x0, 0x0, 0x9, 0x20, - 0x0, 0x0, 0x91, 0x0, 0x0, 0xa, 0x10, 0x0, - 0x1, 0xa0, 0x0, 0x0, 0x1a, 0x0, 0x0, 0x65, - 0x0, 0x5, 0x60, 0x0, 0x47, 0x0, 0x3, 0x80, - 0x0, 0x29, 0x0, 0x0, 0x60, 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x79, 0xa9, 0x10, 0x8, 0x10, 0x5, 0xb0, - 0x1a, 0x0, 0x0, 0xf1, 0x2f, 0x40, 0x0, 0xf1, - 0x5, 0x10, 0x5, 0xe0, 0x0, 0x0, 0x5d, 0x20, - 0x0, 0x3, 0xa0, 0x0, 0x0, 0x6, 0x10, 0x0, - 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x70, 0x0, 0x0, 0xc, 0x80, 0x0, - - /* U+0040 "@" */ - 0x0, 0x38, 0x78, 0x10, 0x2, 0x90, 0x0, 0x90, - 0xa, 0x10, 0x79, 0x64, 0x1b, 0x8, 0x2b, 0x27, - 0x49, 0xa, 0xc, 0x9, 0x58, 0x57, 0xc, 0x8, - 0x58, 0x84, 0xb, 0x8, 0x39, 0x93, 0x39, 0x25, - 0x1b, 0x73, 0x78, 0x70, 0xa, 0x29, 0x3a, 0x41, - 0x3, 0x80, 0x0, 0x72, 0x0, 0x59, 0x88, 0x30, - - /* U+0041 "A" */ - 0x0, 0x5, 0x50, 0x0, 0x0, 0xc, 0xa0, 0x0, - 0x0, 0x8, 0xe0, 0x0, 0x0, 0x44, 0xd1, 0x0, - 0x0, 0x70, 0x95, 0x0, 0x0, 0x80, 0x68, 0x0, - 0x0, 0x80, 0x2c, 0x0, 0x3, 0x96, 0x6f, 0x0, - 0x7, 0x10, 0xc, 0x30, 0x8, 0x0, 0x8, 0x70, - 0x9, 0x0, 0x5, 0xa0, 0x8d, 0x20, 0x9, 0xf5, - - /* U+0042 "B" */ - 0x4e, 0xa6, 0x8a, 0x20, 0xb, 0x50, 0x6, 0xb0, - 0xb, 0x50, 0x2, 0xe0, 0xb, 0x50, 0x3, 0xd0, - 0xb, 0x50, 0xa, 0x50, 0xb, 0x96, 0xb7, 0x0, - 0xb, 0x50, 0x7, 0x90, 0xb, 0x50, 0x0, 0xe2, - 0xb, 0x50, 0x0, 0xc6, 0xb, 0x50, 0x0, 0xd5, - 0xb, 0x50, 0x3, 0xe1, 0x5e, 0xa6, 0x7a, 0x30, - - /* U+0043 "C" */ - 0x0, 0x49, 0x7c, 0xf0, 0x3, 0xb0, 0x0, 0xb2, - 0xc, 0x40, 0x0, 0x25, 0x2f, 0x0, 0x0, 0x0, - 0x6c, 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x0, - 0x7b, 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, - 0x4e, 0x0, 0x0, 0x2, 0xf, 0x20, 0x0, 0x42, - 0x7, 0xa0, 0x1, 0x70, 0x0, 0x7b, 0x98, 0x0, - - /* U+0044 "D" */ - 0x4e, 0xb6, 0x84, 0x0, 0xb, 0x50, 0xa, 0x50, - 0xb, 0x50, 0x3, 0xe0, 0xb, 0x50, 0x0, 0xe3, - 0xb, 0x50, 0x0, 0xd5, 0xb, 0x50, 0x0, 0xc6, - 0xb, 0x50, 0x0, 0xc6, 0xb, 0x50, 0x0, 0xd5, - 0xb, 0x50, 0x0, 0xf2, 0xb, 0x50, 0x3, 0xd0, - 0xb, 0x50, 0xb, 0x40, 0x4e, 0xb6, 0x94, 0x0, - - /* U+0045 "E" */ - 0x3d, 0xb6, 0x6b, 0xc0, 0xa, 0x60, 0x0, 0xb0, - 0xa, 0x60, 0x0, 0x22, 0xa, 0x60, 0x0, 0x0, - 0xa, 0x60, 0x6, 0x0, 0xa, 0xa6, 0x8b, 0x0, - 0xa, 0x60, 0x9, 0x0, 0xa, 0x60, 0x6, 0x0, - 0xa, 0x60, 0x0, 0x0, 0xa, 0x60, 0x0, 0x3, - 0xa, 0x60, 0x0, 0x63, 0x3d, 0xb6, 0x69, 0xe0, - - /* U+0046 "F" */ - 0x3d, 0xb6, 0x69, 0xf1, 0xa, 0x60, 0x0, 0x65, - 0xa, 0x60, 0x0, 0x5, 0xa, 0x60, 0x0, 0x0, - 0xa, 0x60, 0x6, 0x0, 0xa, 0xa6, 0x7e, 0x0, - 0xa, 0x60, 0x9, 0x0, 0xa, 0x60, 0x5, 0x0, - 0xa, 0x60, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, - 0xa, 0x60, 0x0, 0x0, 0x4d, 0xb2, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x68, 0x9f, 0x50, 0x4, 0x90, 0x4, 0x80, - 0xd, 0x10, 0x0, 0x70, 0x3c, 0x0, 0x0, 0x0, - 0x6a, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, - 0x89, 0x0, 0x29, 0xb4, 0x6a, 0x0, 0x5, 0xb0, - 0x4d, 0x0, 0x5, 0xb0, 0xe, 0x10, 0x5, 0xb0, - 0x7, 0x80, 0x6, 0xb0, 0x0, 0x88, 0x77, 0x20, - - /* U+0048 "H" */ - 0x4f, 0x80, 0x9, 0xf4, 0xe, 0x20, 0x3, 0xd0, - 0xe, 0x20, 0x3, 0xd0, 0xe, 0x20, 0x3, 0xd0, - 0xe, 0x20, 0x3, 0xd0, 0xe, 0x76, 0x68, 0xd0, - 0xe, 0x20, 0x3, 0xd0, 0xe, 0x20, 0x3, 0xd0, - 0xe, 0x20, 0x3, 0xd0, 0xe, 0x20, 0x3, 0xd0, - 0xe, 0x20, 0x3, 0xd0, 0x5f, 0x90, 0x9, 0xf4, - - /* U+0049 "I" */ - 0x36, 0xcc, 0x63, 0x0, 0x88, 0x0, 0x0, 0x88, - 0x0, 0x0, 0x88, 0x0, 0x0, 0x88, 0x0, 0x0, - 0x88, 0x0, 0x0, 0x88, 0x0, 0x0, 0x88, 0x0, - 0x0, 0x88, 0x0, 0x0, 0x88, 0x0, 0x0, 0x88, - 0x0, 0x36, 0xcc, 0x63, - - /* U+004A "J" */ - 0x0, 0x36, 0xbd, 0x64, 0x0, 0x0, 0x79, 0x0, - 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x79, 0x0, - 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x79, 0x0, - 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x79, 0x0, - 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x79, 0x0, - 0x0, 0x0, 0x78, 0x0, 0x1, 0x0, 0x87, 0x0, - 0x5d, 0x0, 0xb2, 0x0, 0x1b, 0x77, 0x40, 0x0, - - /* U+004B "K" */ - 0x4e, 0xa1, 0x2c, 0xb2, 0xb, 0x50, 0x9, 0x0, - 0xb, 0x50, 0x62, 0x0, 0xb, 0x51, 0x60, 0x0, - 0xb, 0x5a, 0x10, 0x0, 0xb, 0x9d, 0x60, 0x0, - 0xb, 0xa3, 0xd0, 0x0, 0xb, 0x50, 0xd3, 0x0, - 0xb, 0x50, 0x6a, 0x0, 0xb, 0x50, 0xe, 0x10, - 0xb, 0x50, 0x9, 0x70, 0x4e, 0xa1, 0xa, 0xf5, - - /* U+004C "L" */ - 0x2c, 0xc3, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, - 0x8, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, - 0x8, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, - 0x8, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, - 0x8, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, 0x4, - 0x8, 0x80, 0x0, 0x63, 0x3c, 0xc6, 0x69, 0xf0, - - /* U+004D "M" */ - 0x7f, 0x0, 0x4, 0xf6, 0x1f, 0x30, 0x7, 0xf0, - 0x1c, 0x60, 0x6, 0xf0, 0x19, 0x90, 0x6, 0xf0, - 0x16, 0xc0, 0x14, 0xf0, 0x15, 0xd0, 0x51, 0xf0, - 0x15, 0xb3, 0x60, 0xf0, 0x15, 0x86, 0x60, 0xf0, - 0x15, 0x49, 0x60, 0xf0, 0x15, 0x1e, 0x40, 0xf0, - 0x15, 0xe, 0x10, 0xf0, 0x7a, 0x9, 0x6, 0xf6, - - /* U+004E "N" */ - 0x5f, 0x40, 0x4, 0xc6, 0xb, 0xc0, 0x0, 0x60, - 0x6, 0xd3, 0x0, 0x60, 0x6, 0x6a, 0x0, 0x60, - 0x6, 0xe, 0x20, 0x60, 0x6, 0x8, 0x90, 0x60, - 0x6, 0x1, 0xe1, 0x60, 0x6, 0x0, 0x98, 0x60, - 0x6, 0x0, 0x2e, 0x60, 0x6, 0x0, 0xb, 0xc0, - 0x6, 0x0, 0x3, 0xd0, 0x6c, 0x40, 0x0, 0x90, - - /* U+004F "O" */ - 0x0, 0x68, 0x87, 0x0, 0x5, 0x90, 0x6, 0x70, - 0xd, 0x20, 0x0, 0xe0, 0x2e, 0x0, 0x0, 0xd3, - 0x5c, 0x0, 0x0, 0xb6, 0x6c, 0x0, 0x0, 0xa8, - 0x6c, 0x0, 0x0, 0xa8, 0x5c, 0x0, 0x0, 0xa7, - 0x2e, 0x0, 0x0, 0xc4, 0xd, 0x20, 0x0, 0xe0, - 0x4, 0x80, 0x5, 0x70, 0x0, 0x57, 0x77, 0x0, - - /* U+0050 "P" */ - 0x3d, 0xb6, 0x79, 0x20, 0xa, 0x60, 0x1, 0xd0, - 0xa, 0x60, 0x0, 0xc4, 0xa, 0x60, 0x0, 0xb5, - 0xa, 0x60, 0x0, 0xd2, 0xa, 0x60, 0x6, 0xa0, - 0xa, 0xa6, 0x76, 0x0, 0xa, 0x60, 0x0, 0x0, - 0xa, 0x60, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, - 0xa, 0x60, 0x0, 0x0, 0x4d, 0xb2, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x88, 0x87, 0x0, 0x7, 0x80, 0x6, 0x60, - 0xe, 0x10, 0x0, 0xe0, 0x3d, 0x0, 0x0, 0xd3, - 0x6b, 0x0, 0x0, 0xb6, 0x7b, 0x0, 0x0, 0xb7, - 0x7b, 0x0, 0x0, 0xb7, 0x6b, 0x0, 0x0, 0xb6, - 0x4d, 0x5b, 0x60, 0xd4, 0xf, 0x90, 0xd1, 0xe0, - 0x7, 0x90, 0x9c, 0x80, 0x0, 0x78, 0xbe, 0x0, - 0x0, 0x0, 0xd, 0xe1, 0x0, 0x0, 0x0, 0x0, - - /* U+0052 "R" */ - 0x3c, 0xb6, 0x7a, 0x20, 0x9, 0x70, 0x5, 0xc0, - 0x9, 0x70, 0x0, 0xf0, 0x9, 0x70, 0x1, 0xf0, - 0x9, 0x70, 0x8, 0x80, 0x9, 0xa6, 0xc5, 0x0, - 0x9, 0x70, 0xd1, 0x0, 0x9, 0x70, 0x87, 0x0, - 0x9, 0x70, 0x3c, 0x0, 0x9, 0x70, 0xe, 0x20, - 0x9, 0x70, 0x8, 0x70, 0x3c, 0xc2, 0x3, 0xe4, - - /* U+0053 "S" */ - 0x1, 0x77, 0x9f, 0x70, 0xa, 0x0, 0x5, 0x90, - 0x1a, 0x0, 0x0, 0x40, 0x1c, 0x0, 0x0, 0x0, - 0xb, 0xb2, 0x0, 0x0, 0x0, 0x9f, 0x91, 0x0, - 0x0, 0x2, 0xae, 0x20, 0x0, 0x0, 0x7, 0xb0, - 0x0, 0x0, 0x0, 0xe0, 0x35, 0x0, 0x0, 0xd0, - 0xd, 0x10, 0x3, 0x90, 0xe, 0xe8, 0x78, 0x0, - - /* U+0054 "T" */ - 0x1e, 0x8c, 0xb8, 0xe0, 0x54, 0x9, 0x70, 0x53, - 0x40, 0x9, 0x70, 0x3, 0x0, 0x9, 0x70, 0x0, - 0x0, 0x9, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, - 0x0, 0x9, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, - 0x0, 0x9, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, - 0x0, 0x9, 0x70, 0x0, 0x0, 0x4c, 0xb3, 0x0, - - /* U+0055 "U" */ - 0x5f, 0x90, 0x4, 0xc4, 0xe, 0x20, 0x0, 0x60, - 0xe, 0x20, 0x0, 0x60, 0xe, 0x20, 0x0, 0x60, - 0xe, 0x20, 0x0, 0x60, 0xe, 0x20, 0x0, 0x60, - 0xe, 0x20, 0x0, 0x60, 0xe, 0x20, 0x0, 0x60, - 0xe, 0x20, 0x0, 0x60, 0xc, 0x20, 0x0, 0x50, - 0x8, 0x60, 0x3, 0x40, 0x0, 0x98, 0x86, 0x0, - - /* U+0056 "V" */ - 0x5f, 0x90, 0x5, 0xe4, 0xb, 0x50, 0x0, 0x70, - 0x8, 0x80, 0x4, 0x30, 0x4, 0xb0, 0x7, 0x0, - 0x1, 0xf0, 0x7, 0x0, 0x0, 0xd2, 0x7, 0x0, - 0x0, 0xa6, 0x34, 0x0, 0x0, 0x69, 0x60, 0x0, - 0x0, 0x3c, 0x70, 0x0, 0x0, 0xf, 0x70, 0x0, - 0x0, 0xc, 0x40, 0x0, 0x0, 0x8, 0x10, 0x0, - - /* U+0057 "W" */ - 0x8d, 0x2b, 0xc0, 0xa8, 0x2b, 0x5, 0x90, 0x50, - 0xd, 0x3, 0xb0, 0x60, 0xd, 0x4, 0xd0, 0x60, - 0xc, 0x17, 0xe0, 0x60, 0xa, 0x37, 0xd1, 0x60, - 0x8, 0x57, 0xa5, 0x40, 0x5, 0x86, 0x89, 0x20, - 0x3, 0xd3, 0x6d, 0x0, 0x1, 0xf1, 0x4d, 0x0, - 0x0, 0xd0, 0x2a, 0x0, 0x0, 0x80, 0x7, 0x0, - - /* U+0058 "X" */ - 0x2c, 0xc1, 0x9, 0xb2, 0x4, 0xb0, 0x6, 0x10, - 0x0, 0xd2, 0x7, 0x0, 0x0, 0x78, 0x43, 0x0, - 0x0, 0x1d, 0x80, 0x0, 0x0, 0xa, 0x70, 0x0, - 0x0, 0x8, 0xc0, 0x0, 0x0, 0x8, 0xd2, 0x0, - 0x0, 0x62, 0x79, 0x0, 0x0, 0x80, 0x1e, 0x0, - 0x3, 0x50, 0xa, 0x60, 0x3d, 0x70, 0xb, 0xe4, - - /* U+0059 "Y" */ - 0x4f, 0xa0, 0x7, 0xe4, 0x9, 0x70, 0x2, 0x50, - 0x3, 0xc0, 0x6, 0x0, 0x0, 0xe1, 0x7, 0x0, - 0x0, 0x86, 0x24, 0x0, 0x0, 0x3c, 0x60, 0x0, - 0x0, 0xd, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, - 0x0, 0x9, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, - 0x0, 0x9, 0x70, 0x0, 0x0, 0x4c, 0xb3, 0x0, - - /* U+005A "Z" */ - 0x8, 0xd7, 0x67, 0xf1, 0xb, 0x10, 0x7, 0x90, - 0x3, 0x0, 0xe, 0x20, 0x0, 0x0, 0x6a, 0x0, - 0x0, 0x0, 0xd2, 0x0, 0x0, 0x5, 0xb0, 0x0, - 0x0, 0xd, 0x30, 0x0, 0x0, 0x4c, 0x0, 0x0, - 0x0, 0xc4, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x31, - 0xb, 0x50, 0x0, 0xa0, 0x3f, 0x66, 0x6b, 0xb0, - - /* U+005B "[" */ - 0xa9, 0x98, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, - 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, - 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, - 0xa0, 0x0, 0xa0, 0x0, 0xa9, 0x98, - - /* U+005C "\\" */ - 0xa1, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0xb, - 0x0, 0x0, 0x0, 0x83, 0x0, 0x0, 0x2, 0x90, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x65, 0x0, - 0x0, 0x1, 0xa0, 0x0, 0x0, 0xa, 0x10, 0x0, - 0x0, 0x56, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, - 0x9, 0x20, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0x4, 0x10, - - /* U+005D "]" */ - 0x89, 0x99, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, - 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, - 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, - 0x0, 0xa, 0x0, 0xa, 0x99, 0x99, - - /* U+005E "^" */ - 0x2, 0xdd, 0x20, 0x7, 0x1, 0x70, - - /* U+005F "_" */ - 0x66, 0x66, 0x66, 0x66, - - /* U+0060 "`" */ - 0x3c, 0x90, 0x0, 0x43, - - /* U+0061 "a" */ - 0x2, 0x86, 0x68, 0x0, 0xd, 0x20, 0x9, 0x40, - 0x5, 0x0, 0x8, 0x50, 0x0, 0x68, 0x6a, 0x60, - 0xb, 0x50, 0x8, 0x60, 0x3d, 0x0, 0x8, 0x60, - 0x3e, 0x0, 0x9, 0x63, 0x7, 0x97, 0x76, 0xb4, - - /* U+0062 "b" */ - 0x2, 0x10, 0x0, 0x0, 0x4e, 0x30, 0x0, 0x0, - 0xb, 0x30, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, - 0xb, 0x30, 0x0, 0x0, 0xb, 0x48, 0x9b, 0x10, - 0xb, 0xa0, 0x5, 0xa0, 0xb, 0x40, 0x0, 0xf0, - 0xb, 0x30, 0x0, 0xe1, 0xb, 0x30, 0x0, 0xe1, - 0xb, 0x30, 0x0, 0xe0, 0xb, 0x60, 0x5, 0x80, - 0x8, 0x57, 0x89, 0x0, - - /* U+0063 "c" */ - 0x0, 0x67, 0x69, 0x0, 0x59, 0x0, 0x87, 0xc, - 0x20, 0x4, 0x30, 0xf0, 0x0, 0x0, 0xf, 0x0, - 0x0, 0x0, 0xd2, 0x0, 0x3, 0x6, 0x80, 0x0, - 0x60, 0x8, 0xa8, 0x80, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x2a, 0xa0, - 0x0, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x4, 0xa0, - 0x0, 0x0, 0x4, 0xa0, 0x0, 0x89, 0x87, 0xa0, - 0x6, 0x80, 0x6, 0xa0, 0xd, 0x20, 0x4, 0xa0, - 0xf, 0x0, 0x4, 0xa0, 0xf, 0x0, 0x4, 0xa0, - 0xe, 0x10, 0x4, 0xa0, 0x7, 0x60, 0x9, 0xa0, - 0x0, 0x99, 0x86, 0xc3, - - /* U+0065 "e" */ - 0x6, 0x87, 0x90, 0x4, 0x70, 0x5, 0xa0, 0xb1, - 0x0, 0xf, 0xe, 0x66, 0x66, 0xb0, 0xe0, 0x0, - 0x0, 0xc, 0x30, 0x0, 0x20, 0x5a, 0x0, 0x16, - 0x0, 0x7a, 0x87, 0x0, - - /* U+0066 "f" */ - 0x0, 0x2, 0x76, 0xa2, 0x0, 0xb, 0x0, 0x87, - 0x0, 0x2b, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, - 0x6, 0x8d, 0x66, 0x20, 0x0, 0x3b, 0x0, 0x0, - 0x0, 0x3b, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, - 0x0, 0x3b, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, - 0x0, 0x3b, 0x0, 0x0, 0x5, 0x9e, 0x64, 0x0, - - /* U+0067 "g" */ - 0x0, 0x86, 0x88, 0xb6, 0x7, 0x50, 0xb, 0x21, - 0xa, 0x30, 0x9, 0x40, 0x4, 0x80, 0xb, 0x10, - 0x3, 0x86, 0x72, 0x0, 0x8, 0x84, 0x10, 0x0, - 0x3, 0xaa, 0xde, 0x70, 0xc, 0x0, 0x0, 0xe0, - 0xc, 0x0, 0x0, 0xb0, 0x3, 0x86, 0x68, 0x30, - - /* U+0068 "h" */ - 0x3d, 0x40, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, - 0xa, 0x40, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, - 0xa, 0x59, 0x9b, 0x10, 0xa, 0xb0, 0x6, 0x70, - 0xa, 0x40, 0x4, 0x90, 0xa, 0x40, 0x4, 0xa0, - 0xa, 0x40, 0x4, 0xa0, 0xa, 0x40, 0x4, 0xa0, - 0xa, 0x40, 0x4, 0xa0, 0x3d, 0xa0, 0xa, 0xd3, - - /* U+0069 "i" */ - 0x0, 0x8a, 0x0, 0x0, 0x56, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x22, 0x0, 0x26, 0xc7, 0x0, 0x0, - 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, - 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, - 0x0, 0x26, 0xbc, 0x62, - - /* U+006A "j" */ - 0x0, 0x0, 0xd5, 0x0, 0x0, 0x92, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x31, 0x0, 0x36, 0xe3, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xb3, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0xb3, 0x0, 0x0, - 0xb2, 0x0, 0x0, 0xb1, 0x73, 0x0, 0xb0, 0x6c, - 0x88, 0x10, - - /* U+006B "k" */ - 0x3c, 0x50, 0x0, 0x0, 0x9, 0x50, 0x0, 0x0, - 0x9, 0x50, 0x0, 0x0, 0x9, 0x50, 0x0, 0x0, - 0x9, 0x50, 0x4e, 0x70, 0x9, 0x50, 0x63, 0x0, - 0x9, 0x54, 0x70, 0x0, 0x9, 0x7c, 0x80, 0x0, - 0x9, 0xb0, 0xd2, 0x0, 0x9, 0x50, 0x5a, 0x0, - 0x9, 0x50, 0xc, 0x30, 0x2c, 0xa1, 0xb, 0xd3, - - /* U+006C "l" */ - 0x26, 0xb7, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, - 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, - 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, - 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, - 0x0, 0x26, 0xbb, 0x62, - - /* U+006D "m" */ - 0x8b, 0x7b, 0x68, 0xc1, 0x3d, 0x6, 0xa0, 0x94, - 0x3b, 0x6, 0x80, 0x95, 0x3b, 0x6, 0x80, 0x95, - 0x3b, 0x6, 0x80, 0x95, 0x3b, 0x6, 0x80, 0x95, - 0x3b, 0x6, 0x80, 0x95, 0x8d, 0x2b, 0xc2, 0xc9, - - /* U+006E "n" */ - 0x3d, 0x58, 0x8a, 0x10, 0xa, 0xa0, 0x6, 0x70, - 0xa, 0x40, 0x4, 0x90, 0xa, 0x40, 0x4, 0xa0, - 0xa, 0x40, 0x4, 0xa0, 0xa, 0x40, 0x4, 0xa0, - 0xa, 0x40, 0x4, 0xa0, 0x3d, 0xa0, 0xa, 0xd3, - - /* U+006F "o" */ - 0x0, 0x87, 0x78, 0x0, 0x7, 0x60, 0x6, 0x70, - 0xd, 0x0, 0x0, 0xd0, 0x2c, 0x0, 0x0, 0xd2, - 0x2c, 0x0, 0x0, 0xc2, 0xd, 0x0, 0x0, 0xd0, - 0x8, 0x50, 0x4, 0x80, 0x0, 0x87, 0x77, 0x0, - - /* U+0070 "p" */ - 0x5e, 0x59, 0x89, 0x10, 0xa, 0xa0, 0x3, 0xc0, - 0xa, 0x40, 0x0, 0xe1, 0xa, 0x40, 0x0, 0xc3, - 0xa, 0x40, 0x0, 0xc2, 0xa, 0x40, 0x0, 0xe0, - 0xa, 0x70, 0x5, 0x90, 0xa, 0x87, 0x8a, 0x0, - 0xa, 0x40, 0x0, 0x0, 0x3d, 0xa2, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x88, 0x74, 0x70, 0x7, 0x60, 0x8, 0x90, - 0xe, 0x0, 0x5, 0x90, 0x1d, 0x0, 0x5, 0x90, - 0x2d, 0x0, 0x5, 0x90, 0xe, 0x0, 0x5, 0x90, - 0x9, 0x40, 0x9, 0x90, 0x1, 0xa9, 0x87, 0x90, - 0x0, 0x0, 0x5, 0x90, 0x0, 0x0, 0x2a, 0xd3, - - /* U+0072 "r" */ - 0x38, 0xe3, 0x58, 0xd2, 0x0, 0xb7, 0x40, 0x82, - 0x0, 0xb8, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0x36, 0xe9, 0x60, 0x0, - - /* U+0073 "s" */ - 0x6, 0x68, 0xe6, 0x46, 0x0, 0x28, 0x59, 0x0, - 0x2, 0xa, 0xd7, 0x10, 0x0, 0x29, 0xe3, 0x40, - 0x0, 0x3b, 0x92, 0x0, 0xa, 0x8e, 0x86, 0x72, - - /* U+0074 "t" */ - 0x0, 0x30, 0x0, 0x0, 0x80, 0x0, 0x5, 0xb0, - 0x0, 0x67, 0xd6, 0x61, 0x2, 0xc0, 0x0, 0x2, - 0xc0, 0x0, 0x2, 0xc0, 0x0, 0x2, 0xc0, 0x0, - 0x1, 0xc0, 0x1, 0x0, 0xd0, 0x6, 0x0, 0x7a, - 0x81, - - /* U+0075 "u" */ - 0x4e, 0x30, 0x1a, 0x90, 0xb, 0x30, 0x5, 0x90, - 0xb, 0x30, 0x5, 0x90, 0xb, 0x30, 0x5, 0x90, - 0xb, 0x30, 0x5, 0x90, 0xa, 0x30, 0x5, 0x90, - 0x8, 0x50, 0xa, 0x90, 0x1, 0xca, 0x96, 0xb3, - - /* U+0076 "v" */ - 0x2c, 0xb1, 0x9, 0xc2, 0x4, 0x90, 0x5, 0x20, - 0x0, 0xd0, 0x7, 0x0, 0x0, 0xb3, 0x7, 0x0, - 0x0, 0x68, 0x42, 0x0, 0x0, 0x1c, 0x60, 0x0, - 0x0, 0xc, 0x70, 0x0, 0x0, 0x7, 0x30, 0x0, - - /* U+0077 "w" */ - 0x9e, 0x2b, 0xb1, 0xb8, 0x1c, 0x4, 0x80, 0x70, - 0xc, 0x6, 0xb0, 0x60, 0x9, 0x26, 0xc0, 0x60, - 0x6, 0x66, 0xa4, 0x30, 0x2, 0xa4, 0x7b, 0x0, - 0x0, 0xf1, 0x4c, 0x0, 0x0, 0x90, 0x8, 0x0, - - /* U+0078 "x" */ - 0x8, 0xf5, 0x2c, 0x80, 0x0, 0xa5, 0x8, 0x0, - 0x0, 0x2e, 0x81, 0x0, 0x0, 0x9, 0x90, 0x0, - 0x0, 0x9, 0xd0, 0x0, 0x0, 0x44, 0x77, 0x0, - 0x0, 0x80, 0xd, 0x10, 0x2b, 0xb0, 0x2d, 0xc2, - - /* U+0079 "y" */ - 0x2b, 0xd2, 0x1a, 0xb2, 0x2, 0xc0, 0x7, 0x10, - 0x0, 0xc1, 0x8, 0x0, 0x0, 0x66, 0x16, 0x0, - 0x0, 0x1b, 0x61, 0x0, 0x0, 0xb, 0x90, 0x0, - 0x0, 0x5, 0x70, 0x0, 0x0, 0x5, 0x20, 0x0, - 0x2, 0x8, 0x0, 0x0, 0xb, 0xc3, 0x0, 0x0, - - /* U+007A "z" */ - 0xaa, 0x66, 0xe4, 0x90, 0x4, 0xb0, 0x30, 0xd, - 0x20, 0x0, 0x78, 0x0, 0x1, 0xd0, 0x0, 0xa, - 0x50, 0x5, 0x4c, 0x0, 0x9, 0xc9, 0x66, 0xc8, - - /* U+007B "{" */ - 0x0, 0x46, 0x1, 0x80, 0x3, 0x50, 0x4, 0x50, - 0x4, 0x50, 0x4, 0x50, 0x5, 0x40, 0x38, 0x0, - 0x27, 0x0, 0x5, 0x30, 0x4, 0x50, 0x4, 0x50, - 0x4, 0x50, 0x3, 0x50, 0x1, 0x80, 0x0, 0x46, - - /* U+007C "|" */ - 0x21, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, - - /* U+007D "}" */ - 0x64, 0x0, 0x8, 0x10, 0x5, 0x30, 0x5, 0x40, - 0x5, 0x40, 0x5, 0x40, 0x4, 0x50, 0x0, 0x83, - 0x0, 0x72, 0x3, 0x50, 0x5, 0x40, 0x5, 0x40, - 0x5, 0x40, 0x5, 0x30, 0x8, 0x10, 0x64, 0x0, - - /* U+007E "~" */ - 0x4, 0x95, 0x0, 0x0, 0x5, 0xb, 0x30, 0x4, - 0x30, 0x1, 0xc1, 0x41, 0x0, 0x0, 0x3a, 0x50, - - /* U+007F "" */ - - /* U+3001 "、" */ - 0x3, 0x0, 0x0, 0x4d, 0x50, 0x0, 0x4f, 0x40, - 0x0, 0xa8, 0x0, 0x1, 0x0, - - /* U+3002 "。" */ - 0x4, 0x40, 0x74, 0x56, 0x80, 0x8, 0x48, 0x93, - 0x0, 0x0, - - /* U+3005 "々" */ - 0x0, 0x56, 0x0, 0x0, 0x0, 0x8, 0x60, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x15, 0x0, 0x5b, 0x86, - 0x58, 0xf1, 0x9, 0x21, 0x0, 0x85, 0x4, 0x0, - 0x0, 0xb, 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, - 0x1, 0x0, 0x80, 0x0, 0x0, 0x9, 0xb1, 0x0, - 0x0, 0x0, 0xb, 0xa0, 0x0, 0x0, 0x0, 0x1e, - 0x20, 0x0, 0x0, 0x0, 0x20, 0x0, - - /* U+300C "「" */ - 0xda, 0xa8, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, - 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, - 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, - 0xa0, 0x0, 0xa0, 0x0, - - /* U+300D "」" */ - 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, - 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, - 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, - 0x0, 0xa, 0x8a, 0xad, - - /* U+3041 "ぁ" */ - 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, 0x5, 0x61, - 0x50, 0x0, 0x2, 0x6b, 0xa8, 0x30, 0x0, 0x0, - 0x7, 0x3, 0x0, 0x0, 0x0, 0x8, 0x7c, 0x78, - 0x20, 0x0, 0x6c, 0x18, 0x0, 0xb0, 0x5, 0x56, - 0x92, 0x0, 0xb0, 0x8, 0x6, 0x80, 0x0, 0xa0, - 0xb, 0x87, 0xa0, 0xa, 0x20, 0x1, 0x20, 0x5, - 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3042 "あ" */ - 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb1, 0x6b, - 0x40, 0x0, 0x4, 0x8a, 0xea, 0x51, 0x0, 0x0, - 0x0, 0x0, 0xb0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0xca, 0x73, 0x0, 0x0, 0x4, 0xe6, 0xc1, - 0x29, 0x80, 0x0, 0x6a, 0xa2, 0xa0, 0x0, 0xc1, - 0x6, 0x90, 0xaa, 0x20, 0x0, 0x94, 0xb, 0x0, - 0xd8, 0x0, 0x0, 0xb1, 0x47, 0x3, 0xf3, 0x0, - 0x2, 0xa0, 0x2b, 0x89, 0x4a, 0x0, 0x2b, 0x10, - 0x3, 0x20, 0x0, 0x17, 0x80, 0x0, 0x0, 0x0, - 0x1, 0x40, 0x0, 0x0, - - /* U+3043 "ぃ" */ - 0xa, 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x34, 0x0, 0x9, 0x0, 0x0, 0x7, 0x40, 0x9, - 0x0, 0x0, 0x0, 0xb0, 0xa, 0x3, 0x0, 0x5, - 0xd0, 0x9, 0x93, 0x0, 0x2, 0x60, 0x1, 0xa0, - 0x0, 0x0, 0x0, - - /* U+3044 "い" */ - 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, - 0x0, 0x0, 0x60, 0x0, 0x49, 0x0, 0x0, 0x0, - 0x1a, 0x10, 0x66, 0x0, 0x0, 0x0, 0x2, 0xb0, - 0x75, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x76, 0x3, - 0x0, 0x0, 0x20, 0xa3, 0x3c, 0x9, 0x0, 0x0, - 0x1b, 0xf1, 0xa, 0xd7, 0x0, 0x0, 0x0, 0x50, - 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, - - /* U+3046 "う" */ - 0x0, 0x5, 0x86, 0x30, 0x0, 0x0, 0x1, 0xce, - 0x30, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x3, - 0x9a, 0x50, 0x0, 0x4a, 0x71, 0xa, 0x41, 0xb9, - 0x10, 0x0, 0x49, 0x0, 0x0, 0x0, 0x3, 0x90, - 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, 0x0, 0xa, - 0x30, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x1, - 0xc1, 0x0, 0x0, 0x5, 0xa1, 0x0, 0x0, 0x6, - 0x30, 0x0, 0x0, - - /* U+3047 "ぇ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x81, 0x0, - 0x0, 0x2, 0x71, 0x0, 0x0, 0x5, 0xb6, 0x0, - 0x9, 0x93, 0x93, 0x0, 0x0, 0x5, 0x60, 0x0, - 0x0, 0x39, 0x0, 0x0, 0x3, 0x96, 0x80, 0x0, - 0x4b, 0x0, 0xa0, 0x0, 0x90, 0x0, 0x99, 0xa6, - 0x0, 0x0, 0x0, 0x0, - - /* U+3048 "え" */ - 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5e, 0x60, 0x0, 0x0, 0x0, 0x6, 0x84, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x60, 0x0, 0x0, 0x3, - 0x78, 0x6d, 0x0, 0x0, 0x2c, 0x81, 0xb, 0x20, - 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, - 0x5, 0x60, 0x0, 0x0, 0x0, 0x3, 0xd8, 0x10, - 0x0, 0x0, 0x1, 0xb1, 0x3a, 0x0, 0x0, 0x1, - 0xc2, 0x0, 0xc0, 0x0, 0x0, 0xe4, 0x0, 0xb, - 0x44, 0x88, 0x6, 0x0, 0x0, 0x17, 0x75, 0x10, - - /* U+304A "お" */ - 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0x20, 0x0, 0x10, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x4b, 0x90, 0x0, 0xc, 0x7d, 0x40, 0x6, 0xb4, - 0x29, 0xbe, 0x50, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x4, 0x9a, 0x70, 0x0, 0x0, 0xd, 0xa5, 0x0, - 0x4b, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x8, 0x50, - 0xa, 0x3c, 0x0, 0x0, 0x7, 0x70, 0x9, 0xc, - 0x5, 0x0, 0xc, 0x20, 0x1, 0xbf, 0x5, 0x86, - 0xb7, 0x0, 0x0, 0x4c, 0x0, 0x25, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+304B "か" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x25, 0xcb, 0xac, - 0x20, 0x53, 0x0, 0xb, 0xb6, 0xd0, 0x6, 0x90, - 0x9, 0x50, 0x0, 0x6, 0x60, 0x5, 0x80, 0x0, - 0xe2, 0x0, 0xc, 0x0, 0x8, 0x50, 0x22, 0xb7, - 0x0, 0x66, 0x0, 0xc, 0x10, 0x9, 0xf4, 0x1, - 0xc0, 0x0, 0x2c, 0x0, 0x0, 0x20, 0xc, 0x40, - 0x86, 0xc5, 0x0, 0x0, 0x0, 0x6, 0x0, 0x3f, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+304C "が" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, - 0x0, 0x8, 0x0, 0x3, 0x11, 0x80, 0x0, 0x0, - 0xe, 0x30, 0x1, 0xd2, 0x0, 0x0, 0x0, 0x2c, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x9a, 0x98, - 0x1, 0x10, 0x0, 0xb, 0xdb, 0xe2, 0x9, 0x70, - 0x84, 0x0, 0x0, 0x5, 0x70, 0x7, 0x60, 0xb, - 0x50, 0x0, 0xc, 0x10, 0xa, 0x30, 0x2, 0xe0, - 0x0, 0x48, 0x0, 0xd, 0x0, 0x43, 0xe3, 0x0, - 0xc1, 0x0, 0x3a, 0x0, 0x1b, 0xf1, 0x9, 0x71, - 0x60, 0xb4, 0x0, 0x0, 0x30, 0xb, 0x0, 0x6f, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, - 0x0, 0x0, 0x0, - - /* U+304D "き" */ - 0x0, 0x47, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x10, - 0x25, 0x0, 0x0, 0x5, 0x99, 0xa1, 0x0, 0x4, - 0x9a, 0xd4, 0x0, 0x10, 0x0, 0x0, 0x3a, 0x2a, - 0x70, 0x0, 0x2, 0x5e, 0xb2, 0x0, 0x0, 0x67, - 0x53, 0xc0, 0x0, 0x0, 0x0, 0x10, 0x5a, 0x0, - 0x7, 0xb9, 0x9b, 0xbe, 0x70, 0x4b, 0x0, 0x0, - 0x18, 0xb0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x70, 0x0, 0x21, 0x0, 0x0, 0x8d, 0xed, 0xa2, - 0x0, - - /* U+304E "ぎ" */ - 0x0, 0x33, 0x0, 0x0, 0x1, 0x78, 0x0, 0x5, - 0xd0, 0x1, 0x20, 0xb5, 0x90, 0x0, 0xa, 0x47, - 0xc4, 0x1, 0x70, 0x0, 0x56, 0xae, 0x40, 0x0, - 0x0, 0x0, 0x1, 0x20, 0x84, 0x3c, 0x60, 0x0, - 0x0, 0x0, 0x16, 0xf9, 0x10, 0x0, 0x0, 0x1, - 0x77, 0x54, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, - 0x7, 0x70, 0x0, 0x0, 0x7, 0xca, 0x9b, 0xbf, - 0x50, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x78, 0x0, - 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc8, 0x32, 0x58, 0x40, 0x0, 0x0, 0x0, 0x7b, - 0xb9, 0x50, 0x0, 0x0, 0x0, - - /* U+304F "く" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe2, 0x0, - 0x0, 0x7d, 0x10, 0x0, 0x3d, 0x10, 0x0, 0x2b, - 0x10, 0x0, 0x2a, 0x0, 0x0, 0x9, 0x0, 0x0, - 0x0, 0x80, 0x0, 0x0, 0x1, 0xa3, 0x0, 0x0, - 0x0, 0xb6, 0x0, 0x0, 0x0, 0xd8, 0x0, 0x0, - 0x4, 0xf4, 0x0, 0x0, 0xc, 0x80, 0x0, 0x0, - 0x22, - - /* U+3050 "ぐ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0x90, 0x0, 0x0, 0x0, 0x0, 0xcb, 0x0, 0x22, - 0x0, 0x0, 0x8a, 0x0, 0x10, 0xc4, 0x0, 0x59, - 0x0, 0x6, 0xa1, 0x10, 0x39, 0x0, 0x0, 0x7, - 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x3, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x50, 0x0, 0x0, - - /* U+3051 "け" */ - 0x6, 0x10, 0x0, 0x0, 0xb2, 0x0, 0xb, 0x60, - 0x0, 0x0, 0xc4, 0x0, 0xc, 0x20, 0x0, 0x0, - 0xa3, 0x23, 0xc, 0x0, 0x6, 0x9a, 0xec, 0x95, - 0x48, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x84, 0x0, - 0x0, 0x0, 0xa2, 0x0, 0xa2, 0x10, 0x0, 0x0, - 0xb1, 0x0, 0xa3, 0x60, 0x0, 0x0, 0xc0, 0x0, - 0x87, 0x90, 0x0, 0x1, 0xc0, 0x0, 0x2f, 0x80, - 0x0, 0x8, 0x60, 0x0, 0x8, 0x50, 0x0, 0x4a, - 0x0, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - - /* U+3052 "げ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x1, - 0x0, 0x0, 0x0, 0x30, 0x34, 0x5b, 0xc, 0x40, - 0x0, 0x0, 0xe4, 0x9, 0x63, 0xc, 0x30, 0x0, - 0x0, 0xb3, 0x0, 0x20, 0xd, 0x0, 0x0, 0x2, - 0xba, 0xc6, 0x0, 0x48, 0x0, 0x7, 0x98, 0xc5, - 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x93, 0x0, - 0x0, 0x84, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x84, 0x10, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x76, - 0x70, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x3c, 0x90, - 0x0, 0x5, 0x80, 0x0, 0x0, 0xd, 0x70, 0x0, - 0x1c, 0x10, 0x0, 0x0, 0x2, 0x10, 0x2, 0xa2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, - 0x0, 0x0, - - /* U+3053 "こ" */ - 0x0, 0x58, 0x9a, 0xc7, 0x0, 0x0, 0x0, 0x3c, - 0x71, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x59, 0x0, 0x0, 0x3, 0x70, 0x6, 0xcc, 0xcd, - 0xfd, 0x70, 0x0, 0x0, 0x11, 0x0, 0x0, - - /* U+3054 "ご" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x16, 0xa0, 0x0, 0x32, 0x1, - 0x31, 0xb, 0x56, 0x0, 0x1, 0x7a, 0xdf, 0x90, - 0x16, 0x0, 0x0, 0x0, 0x58, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x98, 0x42, 0x34, 0x8d, 0x20, 0x0, 0x0, 0x49, - 0xbc, 0xb8, 0x30, 0x0, 0x0, - - /* U+3055 "さ" */ - 0x0, 0x24, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, - 0x0, 0x0, 0x5, 0xb0, 0x7, 0x40, 0x0, 0x9, - 0xcc, 0x70, 0x3, 0xaa, 0x8b, 0x50, 0x0, 0x0, - 0x0, 0xd, 0x20, 0x0, 0x1, 0x20, 0x3d, 0x0, - 0x7b, 0x99, 0xbb, 0xd7, 0x4a, 0x0, 0x0, 0x1b, - 0x96, 0x70, 0x0, 0x0, 0x1, 0x1d, 0x30, 0x0, - 0x0, 0x0, 0x2a, 0xdc, 0xcd, 0x0, 0x0, 0x0, - 0x22, 0x0, 0x0, - - /* U+3056 "ざ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x25, - 0x0, 0x0, 0x16, 0x5b, 0x0, 0x2d, 0x20, 0x0, - 0x7, 0x81, 0x0, 0x2, 0xc1, 0x6, 0xb0, 0x10, - 0x0, 0x1, 0x6d, 0xb7, 0x0, 0x0, 0x1, 0x67, - 0x77, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96, - 0x0, 0x0, 0x0, 0x1, 0x10, 0xd, 0x20, 0x0, - 0x6, 0xba, 0xac, 0xbb, 0xa0, 0x0, 0x2c, 0x0, - 0x0, 0x19, 0xd0, 0x0, 0x3a, 0x0, 0x0, 0x0, - 0x10, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8d, 0xee, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+3057 "し" */ - 0x7, 0x10, 0x0, 0x0, 0x0, 0xf, 0x40, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x1, 0xe, 0x0, 0x0, - 0x2, 0x90, 0xb, 0x40, 0x0, 0x7a, 0x0, 0x2, - 0xda, 0xad, 0x70, 0x0, 0x0, 0x2, 0x20, 0x0, - 0x0, - - /* U+3058 "じ" */ - 0x1a, 0x10, 0x0, 0x0, 0x0, 0xf, 0x10, 0x0, - 0x86, 0x0, 0xe, 0x0, 0x2a, 0x3c, 0x0, 0x1d, - 0x0, 0x4, 0x90, 0x0, 0x1c, 0x0, 0x0, 0x0, - 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, - 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, - 0x2b, 0x0, 0x0, 0x0, 0x11, 0xd, 0x0, 0x0, - 0x4, 0x80, 0xb, 0x50, 0x1, 0x99, 0x0, 0x2, - 0xcc, 0xcb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+3059 "す" */ - 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x13, 0x57, 0x40, 0x5, 0x57, 0x99, - 0x9e, 0x87, 0x65, 0x50, 0x3, 0x74, 0x10, 0xb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xae, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x56, 0xc, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x74, 0xd, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x3b, 0x8f, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x0, - 0x0, 0x0, 0x0, - - /* U+305A "ず" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, - 0x0, 0x0, 0x1, 0x40, 0x0, 0x31, 0x6a, 0x0, - 0x0, 0x0, 0x1f, 0x20, 0x0, 0xc3, 0x40, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x1, 0x20, 0x0, 0x0, - 0x24, 0x7e, 0xaa, 0xbc, 0x80, 0x0, 0x7d, 0xb8, - 0x52, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x81, - 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x92, 0xb, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x7, 0x60, 0xd4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xbf, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+305B "せ" */ - 0x0, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, - 0xe, 0x20, 0x3, 0xc0, 0x0, 0x0, 0x0, 0xb1, - 0x0, 0x2a, 0x0, 0x0, 0x0, 0xb, 0x12, 0x58, - 0xec, 0xd8, 0x7, 0x8a, 0xe9, 0x74, 0x49, 0x0, - 0x0, 0x33, 0xb, 0x10, 0x3, 0x80, 0x0, 0x0, - 0x0, 0xa1, 0x5, 0x96, 0x0, 0x0, 0x0, 0xa, - 0x20, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x74, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xc2, 0x0, 0x13, - 0x0, 0x0, 0x0, 0x3, 0xac, 0xcb, 0x90, 0x0, - - /* U+305C "ぜ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0xa2, 0x0, - 0x0, 0x0, 0x0, 0x29, 0x4, 0xa3, 0x70, 0x0, - 0xc, 0x40, 0x0, 0xf0, 0x7, 0x10, 0x0, 0x0, - 0xa4, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x21, 0x46, 0xeb, 0xc8, 0x0, 0x5, 0x69, 0xdb, - 0x96, 0x4b, 0x0, 0x0, 0x0, 0x55, 0x29, 0x20, - 0x1, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x92, 0x4, - 0x87, 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0x1c, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xd3, 0x0, 0x2, - 0x10, 0x0, 0x0, 0x0, 0x3, 0xad, 0xdd, 0xc4, - 0x0, 0x0, - - /* U+305D "そ" */ - 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x1, 0x56, - 0x98, 0x9e, 0x0, 0x0, 0x8, 0x60, 0x3d, 0x40, - 0x0, 0x0, 0x0, 0x5a, 0x10, 0x0, 0x0, 0x0, - 0x86, 0x0, 0x2, 0x0, 0x4, 0x82, 0x48, 0xcc, - 0xa6, 0x2c, 0xe9, 0x85, 0xa4, 0x0, 0x1, 0x62, - 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x74, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd9, - 0x63, 0x0, 0x0, 0x0, 0x0, 0x7b, 0x80, 0x0, - - /* U+305E "ぞ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4a, 0x30, 0x17, 0x90, 0x0, 0x57, - 0x88, 0x5d, 0x90, 0x96, 0x52, 0x0, 0x15, 0x11, - 0xb4, 0x0, 0x9, 0x0, 0x0, 0x0, 0x3a, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x70, 0x0, 0x35, - 0x30, 0x0, 0x1, 0x85, 0x58, 0xbd, 0x97, 0x50, - 0x0, 0x4e, 0xc8, 0x35, 0x80, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x49, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x97, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xda, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x30, - 0x0, 0x0, - - /* U+305F "た" */ - 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x90, 0x0, 0x0, 0x0, 0x0, 0xa, 0x34, 0x70, - 0x0, 0x0, 0x14, 0x5d, 0xc9, 0x20, 0x1, 0x0, - 0x4, 0x5c, 0x0, 0x38, 0x8c, 0xd1, 0x0, 0x39, - 0x0, 0x0, 0x68, 0x30, 0x0, 0x75, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xa0, 0x3, 0x0, 0x0, 0x0, 0x9, 0x50, - 0x8, 0x0, 0x0, 0x0, 0x2d, 0x0, 0xa, 0x10, - 0x0, 0x0, 0x64, 0x0, 0x2, 0xab, 0xce, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3060 "だ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x40, 0x0, 0x0, 0x8, 0x40, 0x0, 0x0, - 0xc5, 0x0, 0x1, 0x92, 0xc0, 0x0, 0x0, 0xc1, - 0x64, 0x0, 0x29, 0x0, 0x3, 0x35, 0xeb, 0x50, - 0x0, 0x10, 0x0, 0x1, 0x57, 0x90, 0x5, 0x98, - 0xd8, 0x0, 0x0, 0x6, 0x50, 0x0, 0x7, 0x84, - 0x0, 0x0, 0xb, 0x10, 0x0, 0x10, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x58, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0xb2, - 0x2, 0x50, 0x0, 0x0, 0x0, 0x4, 0xb0, 0x2, - 0xa1, 0x0, 0x11, 0x0, 0x7, 0x30, 0x0, 0x4a, - 0xbc, 0xd9, 0x0, - - /* U+3061 "ち" */ - 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xa3, 0x6a, 0x40, - 0x0, 0x7a, 0xdb, 0x75, 0x20, 0x0, 0x0, 0xa, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x16, 0x98, - 0x30, 0x0, 0x58, 0x88, 0x30, 0x4d, 0x40, 0xa, - 0xd2, 0x0, 0x0, 0x5b, 0x0, 0x63, 0x0, 0x0, - 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, - 0x0, 0x0, 0x4, 0xb5, 0x0, 0x0, 0x1, 0x56, - 0x40, 0x0, - - /* U+3063 "っ" */ - 0x0, 0x5, 0x99, 0x99, 0x10, 0x6b, 0xa5, 0x0, - 0x4, 0xa0, 0x2, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x6, - 0x80, 0x0, 0x0, 0x2, 0x99, 0x0, 0x0, 0x16, - 0x87, 0x10, 0x0, - - /* U+3064 "つ" */ - 0x0, 0x0, 0x5, 0xaa, 0xab, 0x70, 0x0, 0x25, - 0x9b, 0x50, 0x0, 0x6, 0xc0, 0x9, 0xc3, 0x0, - 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xc5, 0x0, 0x0, 0x0, 0x36, 0x79, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+3065 "づ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x31, 0xb6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2c, 0x24, 0x0, 0x0, 0x26, - 0x99, 0xaa, 0x44, 0x20, 0x4, 0x7b, 0x93, 0x0, - 0x0, 0xb4, 0x0, 0xb, 0x81, 0x0, 0x0, 0x0, - 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xb6, 0x0, 0x0, 0x0, 0x1, 0x68, - 0x84, 0x0, 0x0, 0x0, - - /* U+3066 "て" */ - 0x0, 0x0, 0x1, 0x48, 0xbd, 0xd1, 0x37, 0x8a, - 0xa8, 0x49, 0xb6, 0x30, 0x15, 0x30, 0x1, 0xb4, - 0x0, 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0x61, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, - 0xc0, 0x0, - - /* U+3067 "で" */ - 0x0, 0x0, 0x0, 0x37, 0xad, 0xfb, 0x0, 0x66, - 0x8a, 0xa6, 0x4a, 0x82, 0x0, 0x4, 0x74, 0x0, - 0x2c, 0x20, 0x11, 0x0, 0x0, 0x0, 0x1c, 0x10, - 0x20, 0x95, 0x0, 0x0, 0xb, 0x30, 0x2, 0xc2, - 0x60, 0x0, 0x2, 0xc0, 0x0, 0x5, 0x20, 0x0, - 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0x41, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5c, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3068 "と" */ - 0x0, 0x24, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, - 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x2, 0xa0, - 0x0, 0x20, 0x0, 0xc, 0x0, 0x6e, 0x50, 0x0, - 0x7b, 0xc7, 0x20, 0x0, 0x5c, 0x50, 0x0, 0x0, - 0x7a, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x2, 0xa0, 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, - 0x1, 0x20, 0x2b, 0xdc, 0xce, 0xf9, 0x0, 0x0, - 0x12, 0x10, 0x0, - - /* U+3069 "ど" */ - 0x0, 0x8, 0x10, 0x0, 0x1, 0x70, 0x0, 0xd, - 0x30, 0x0, 0x46, 0x4b, 0x0, 0xb, 0x10, 0x0, - 0xb, 0x32, 0x0, 0xa, 0x10, 0x1, 0x40, 0x0, - 0x0, 0x8, 0x40, 0x7e, 0x90, 0x0, 0x0, 0x2, - 0xdc, 0x71, 0x0, 0x0, 0x0, 0x3c, 0x60, 0x0, - 0x0, 0x0, 0x3, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x91, 0x0, 0x0, - 0x40, 0x0, 0x0, 0x6c, 0xcc, 0xde, 0xc2, 0x0, - - /* U+306A "な" */ - 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb1, 0x73, - 0x0, 0x0, 0x3, 0x8b, 0xca, 0x60, 0x47, 0x10, - 0x0, 0xa, 0x0, 0x0, 0x4, 0xd1, 0x0, 0x74, - 0x0, 0x4, 0xb7, 0xa5, 0x3, 0xa0, 0x0, 0xc, - 0x0, 0x0, 0x2e, 0x20, 0x0, 0xc, 0x0, 0x0, - 0x95, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x5, - 0x99, 0x9d, 0x0, 0x0, 0x0, 0x1a, 0x0, 0xe, - 0xc2, 0x0, 0x0, 0xc, 0x42, 0x96, 0x5d, 0x0, - 0x0, 0x1, 0x78, 0x40, 0x3, 0x0, - - /* U+306B "に" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, - 0x46, 0x7c, 0xd1, 0xc, 0x40, 0x1, 0x24, 0xa3, - 0x0, 0xd0, 0x0, 0x1, 0x40, 0x0, 0x48, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x84, 0x0, 0x10, 0x0, 0x0, 0x8, 0x35, - 0x6, 0x0, 0x0, 0x0, 0x58, 0x80, 0x90, 0x0, - 0x0, 0x1, 0xf6, 0x8, 0x81, 0x1, 0x45, 0x6, - 0x30, 0x5, 0xac, 0xcb, 0x40, - - /* U+306C "ぬ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2d, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, - 0xc2, 0x30, 0x0, 0x0, 0x4a, 0x1, 0x9c, 0x66, - 0xa7, 0x0, 0x0, 0xa4, 0x97, 0x50, 0x0, 0x95, - 0x0, 0xc, 0x80, 0xa1, 0x0, 0x2, 0xa0, 0x3, - 0xd4, 0x19, 0x0, 0x0, 0xc, 0x0, 0xa1, 0xb9, - 0x20, 0x0, 0x1, 0xa0, 0x19, 0x7, 0xb0, 0x7, - 0xa8, 0x96, 0x2, 0x80, 0xbb, 0x67, 0x60, 0x2f, - 0xa0, 0xc, 0xb4, 0x0, 0x76, 0x1a, 0x68, 0xa0, - 0x11, 0x0, 0x0, 0x79, 0x40, 0x3, - - /* U+306D "ね" */ - 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0xb, 0x40, - 0x89, 0x79, 0x80, 0x0, 0x18, 0xad, 0x2a, 0x20, - 0x0, 0x85, 0x0, 0x3, 0x3f, 0x80, 0x0, 0x0, - 0x3a, 0x0, 0x0, 0xae, 0x0, 0x0, 0x0, 0x2b, - 0x0, 0x1, 0xca, 0x0, 0x0, 0x0, 0x39, 0x0, - 0xa, 0x3a, 0x0, 0x6, 0x86, 0x86, 0x0, 0x4c, - 0x1a, 0x0, 0xa6, 0x25, 0xfb, 0x30, 0x81, 0xae, - 0x0, 0xc2, 0x29, 0x73, 0xd2, 0x0, 0x3c, 0x0, - 0x29, 0x94, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+306E "の" */ - 0x0, 0x0, 0x0, 0x45, 0x51, 0x0, 0x0, 0x0, - 0x8, 0xba, 0x56, 0xab, 0x10, 0x0, 0x1c, 0x30, - 0x80, 0x0, 0x4c, 0x0, 0xb, 0x20, 0x8, 0x10, - 0x0, 0xa5, 0x5, 0x80, 0x0, 0x81, 0x0, 0x6, - 0x90, 0xa2, 0x0, 0xa, 0x0, 0x0, 0x3a, 0xc, - 0x0, 0x0, 0xb0, 0x0, 0x4, 0x90, 0xb0, 0x0, - 0x57, 0x0, 0x0, 0x86, 0xa, 0x20, 0xc, 0x0, - 0x0, 0x1d, 0x10, 0x4b, 0x5c, 0x30, 0x0, 0x1c, - 0x40, 0x0, 0x48, 0x20, 0x0, 0x6a, 0x30, 0x0, - 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, - - /* U+306F "は" */ - 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0xc1, - 0x0, 0x0, 0xe2, 0x0, 0x0, 0xd1, 0x0, 0x0, - 0xc0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0xc7, 0xc5, - 0x4, 0x70, 0x3, 0x89, 0xe3, 0x0, 0x8, 0x30, - 0x0, 0x0, 0xb0, 0x0, 0xb, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0xb, 0x0, 0x0, 0x0, 0xb0, 0x0, - 0xc, 0x60, 0x4, 0x65, 0xb0, 0x0, 0xd, 0xa0, - 0x77, 0x35, 0xea, 0x20, 0x8, 0xa0, 0xb1, 0x1, - 0xc3, 0xe2, 0x0, 0x30, 0x3c, 0xab, 0x20, 0x31, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3070 "ば" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x11, 0xb2, 0x9, 0x20, - 0x0, 0xd, 0x30, 0x3a, 0x45, 0xc, 0x10, 0x0, - 0xb, 0x10, 0x6, 0x10, 0xc, 0x0, 0x0, 0xb, - 0x49, 0x60, 0x0, 0x29, 0x0, 0x38, 0xae, 0x73, - 0x0, 0x0, 0x55, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0x73, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, - 0xa1, 0x10, 0x0, 0xb, 0x0, 0x0, 0x0, 0xb4, - 0x10, 0x2, 0x1b, 0x0, 0x0, 0x0, 0xba, 0x3, - 0xc6, 0x7e, 0x70, 0x0, 0x0, 0x7a, 0x7, 0x70, - 0xa, 0x6d, 0x10, 0x0, 0x15, 0x2, 0xd9, 0xb4, - 0x5, 0x30, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, - - /* U+3071 "ぱ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x30, 0x6, 0x75, 0xa, 0x10, 0x0, - 0xd, 0x30, 0x90, 0x60, 0xd1, 0x0, 0x0, 0xb0, - 0x1, 0x73, 0xb, 0x0, 0x0, 0xb, 0x5a, 0x60, - 0x3, 0x70, 0x3, 0x8a, 0xd5, 0x10, 0x0, 0x64, - 0x0, 0x0, 0xb, 0x0, 0x0, 0x9, 0x10, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0xb, - 0x0, 0x0, 0xb, 0x50, 0x2, 0x43, 0xb0, 0x0, - 0x0, 0xba, 0x5, 0xa4, 0x5e, 0x80, 0x0, 0x7, - 0x90, 0x93, 0x1, 0xb4, 0xd1, 0x0, 0x3, 0x2, - 0xba, 0xb2, 0x3, 0x10, 0x0, - - /* U+3072 "ひ" */ - 0x0, 0x4a, 0xd1, 0x0, 0x82, 0x0, 0x6, 0xc6, - 0x99, 0x0, 0xd, 0x90, 0x0, 0x0, 0x49, 0x0, - 0x0, 0xac, 0x0, 0x0, 0xc, 0x0, 0x0, 0x9, - 0x86, 0x0, 0x7, 0x50, 0x0, 0x0, 0xa2, 0xd2, - 0x0, 0xc0, 0x0, 0x0, 0xc, 0x5, 0xd0, 0xc, - 0x0, 0x0, 0x1, 0xc0, 0x1, 0x0, 0xc0, 0x0, - 0x0, 0x67, 0x0, 0x0, 0xc, 0x10, 0x0, 0xd, - 0x10, 0x0, 0x0, 0x5a, 0x0, 0x1b, 0x50, 0x0, - 0x0, 0x0, 0x6c, 0xbb, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3073 "び" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x95, 0x0, 0x16, - 0xc7, 0x0, 0x27, 0x1c, 0x14, 0xc, 0x94, 0xd4, - 0x0, 0x4f, 0x14, 0x10, 0x0, 0xb, 0x40, 0x0, - 0x2d, 0x60, 0x0, 0x0, 0x59, 0x0, 0x0, 0x29, - 0xc0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x29, 0x79, - 0x0, 0x3, 0xa0, 0x0, 0x0, 0x48, 0xc, 0x60, - 0x5, 0x60, 0x0, 0x0, 0x75, 0x0, 0x10, 0x6, - 0x50, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x4, 0x80, - 0x0, 0x6, 0x90, 0x0, 0x0, 0x0, 0xc3, 0x0, - 0x5c, 0x10, 0x0, 0x0, 0x0, 0x2c, 0xcc, 0x91, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+3074 "ぴ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x1, 0x38, - 0xc4, 0x0, 0x45, 0x16, 0x61, 0x2c, 0x75, 0xc2, - 0x0, 0x7e, 0x3, 0x30, 0x0, 0xc, 0x10, 0x0, - 0x4d, 0x30, 0x0, 0x0, 0x94, 0x0, 0x0, 0x49, - 0xa0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x46, 0xa4, - 0x0, 0x7, 0x60, 0x0, 0x0, 0x75, 0x1e, 0x20, - 0xa, 0x20, 0x0, 0x0, 0xa2, 0x1, 0x0, 0xb, - 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x8, 0x40, - 0x0, 0x8, 0x70, 0x0, 0x0, 0x2, 0xc1, 0x0, - 0x6b, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xbc, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+3075 "ふ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x3a, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0x20, 0x14, 0x0, - 0x0, 0x2, 0x1, 0xb0, 0x6, 0x90, 0x41, 0x83, - 0x0, 0xb1, 0x0, 0xc6, 0x8d, 0x24, 0x20, 0xc0, - 0x0, 0x35, 0x10, 0x0, 0x7a, 0x40, 0x0, 0x0, - - /* U+3076 "ぶ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x52, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, - 0xb7, 0x0, 0x53, 0xc0, 0x0, 0x0, 0x6, 0xf3, - 0x5, 0x92, 0x0, 0x0, 0x8, 0x71, 0x0, 0x2, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x10, 0x31, 0x0, 0x0, 0x0, 0x30, 0x3a, - 0x0, 0xa4, 0x0, 0x33, 0x80, 0x0, 0xc0, 0x1, - 0xe2, 0xe, 0xb0, 0x13, 0x1c, 0x0, 0x6, 0x30, - 0x30, 0x0, 0x38, 0x20, 0x0, 0x0, - - /* U+3077 "ぷ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x62, 0x0, 0x4, 0x61, 0x0, 0x0, 0x0, - 0xb7, 0x0, 0x60, 0x60, 0x0, 0x0, 0x8, 0xf2, - 0x3, 0x61, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x10, 0x32, 0x0, 0x0, 0x0, 0x20, 0x3a, - 0x0, 0xa5, 0x0, 0x43, 0x80, 0x0, 0xc0, 0x1, - 0xe1, 0xf, 0xa0, 0x51, 0x2c, 0x0, 0x7, 0x10, - 0x50, 0x1, 0x99, 0x20, 0x0, 0x0, - - /* U+3078 "へ" */ - 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1b, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x10, - 0x39, 0x0, 0x0, 0x0, 0x4d, 0x30, 0x0, 0x67, - 0x0, 0x0, 0x19, 0x30, 0x0, 0x0, 0xa5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcb, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x67, - - /* U+3079 "べ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x24, 0xa1, 0x0, 0x0, 0x15, - 0x0, 0x6, 0x95, 0x30, 0x0, 0x29, 0x4a, 0x0, - 0x8, 0x0, 0x0, 0x1a, 0x0, 0x39, 0x0, 0x0, - 0x0, 0x3c, 0x20, 0x0, 0x66, 0x0, 0x0, 0x1b, - 0x40, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x78, - - /* U+307A "ぺ" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x63, 0x0, 0x0, - 0x1, 0x50, 0x0, 0x60, 0x60, 0x0, 0x1, 0xb4, - 0xa0, 0x1, 0x64, 0x0, 0x1, 0xb1, 0x2, 0xa0, - 0x0, 0x0, 0x3, 0xc3, 0x0, 0x6, 0x70, 0x0, - 0x0, 0xa4, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x91, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x70, - - /* U+307B "ほ" */ - 0x5, 0x20, 0x0, 0x2, 0x48, 0x10, 0x9, 0x60, - 0x7, 0x9d, 0x63, 0x0, 0xa, 0x10, 0x0, 0xb, - 0x20, 0x0, 0xb, 0x0, 0x0, 0xa, 0x0, 0x0, - 0x1a, 0x0, 0x0, 0xb, 0x49, 0x70, 0x46, 0x0, - 0x7, 0x9e, 0x72, 0x0, 0x64, 0x0, 0x0, 0xb, - 0x0, 0x0, 0x82, 0x40, 0x0, 0xb, 0x0, 0x0, - 0x88, 0x30, 0x35, 0x4b, 0x0, 0x0, 0x5f, 0x6, - 0x63, 0x5e, 0x91, 0x0, 0x9, 0xa, 0x0, 0x2a, - 0x4d, 0x20, 0x0, 0x2, 0xaa, 0xa1, 0x2, 0x20, - - /* U+307C "ぼ" */ - 0x2, 0x40, 0x0, 0x1, 0x36, 0x50, 0x0, 0x3, - 0xa0, 0x2, 0x8b, 0xb4, 0x11, 0x60, 0x7, 0x40, - 0x0, 0x3, 0xb0, 0x36, 0x49, 0xa, 0x0, 0x0, - 0x2, 0xa0, 0x8, 0x40, 0xa, 0x0, 0x0, 0x2, - 0xb6, 0xa2, 0x0, 0xa, 0x0, 0x3, 0x8a, 0xc5, - 0x10, 0x0, 0xa, 0x0, 0x0, 0x2, 0xa0, 0x0, - 0x0, 0x19, 0x50, 0x0, 0x2, 0xa0, 0x0, 0x0, - 0x1b, 0x70, 0x4, 0x54, 0xa0, 0x0, 0x0, 0xd, - 0x50, 0xa4, 0x38, 0xd5, 0x0, 0x0, 0x5, 0x21, - 0x90, 0x6, 0x79, 0xa0, 0x0, 0x0, 0x0, 0x7a, - 0xa9, 0x0, 0x50, 0x0, - - /* U+307D "ぽ" */ - 0x2, 0x40, 0x0, 0x1, 0x36, 0x40, 0x0, 0x3, - 0xa0, 0x2, 0x8b, 0xb4, 0x5, 0x85, 0x7, 0x40, - 0x0, 0x3, 0xb0, 0x5, 0x7, 0xa, 0x0, 0x0, - 0x2, 0xa0, 0x0, 0x51, 0xa, 0x0, 0x0, 0x2, - 0xb6, 0xa2, 0x0, 0xa, 0x0, 0x3, 0x8a, 0xc5, - 0x10, 0x0, 0xa, 0x0, 0x0, 0x2, 0xa0, 0x0, - 0x0, 0x19, 0x40, 0x0, 0x2, 0xa0, 0x0, 0x0, - 0x1b, 0x70, 0x4, 0x54, 0xa0, 0x0, 0x0, 0xd, - 0x50, 0xa4, 0x38, 0xd4, 0x0, 0x0, 0x6, 0x21, - 0x90, 0x6, 0x7b, 0x90, 0x0, 0x0, 0x0, 0x7a, - 0xa9, 0x0, 0x50, 0x0, - - /* U+307E "ま" */ - 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0xc, 0x38, 0x80, 0x5, 0x9a, - 0xe7, 0x30, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x0, 0xd6, 0xb4, 0x0, 0x69, 0xad, 0x40, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x56, 0x4c, 0x0, - 0x0, 0xb5, 0x27, 0xf8, 0x0, 0x1a, 0x0, 0x67, - 0x6d, 0x30, 0x8b, 0xba, 0x0, 0x3d, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+307F "み" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x26, 0x7a, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x42, - 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x20, - 0x0, 0x0, 0x0, 0x67, 0x0, 0x1f, 0x0, 0x0, - 0x59, 0x9e, 0xa9, 0x43, 0xa0, 0x0, 0x85, 0x9, - 0x40, 0x17, 0xe7, 0x0, 0x1a, 0x4, 0x90, 0x0, - 0x2b, 0xb9, 0x2, 0x93, 0xb0, 0x0, 0xb, 0x10, - 0xa1, 0x8, 0x80, 0x0, 0xa, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x27, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3080 "む" */ - 0x0, 0x49, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, - 0x0, 0x0, 0x0, 0x1, 0x3c, 0x8b, 0x0, 0x46, - 0x0, 0x69, 0xc2, 0x0, 0x0, 0xa6, 0x0, 0x2a, - 0x0, 0x0, 0x2, 0xb2, 0x76, 0xa0, 0x0, 0x0, - 0x0, 0x90, 0x3c, 0x0, 0x0, 0x0, 0xa, 0x38, - 0xa0, 0x0, 0x1, 0x0, 0x3b, 0xd4, 0x0, 0x0, - 0x8, 0x0, 0xc, 0x0, 0x0, 0x0, 0xd3, 0x0, - 0xd4, 0x1, 0x35, 0xbb, 0x0, 0x1, 0x79, 0xa9, - 0x61, 0x0, - - /* U+3081 "め" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, - 0x0, 0xa6, 0x0, 0x0, 0x9, 0x70, 0x0, 0xa2, - 0x0, 0x0, 0x2, 0xa0, 0x49, 0xe9, 0x60, 0x0, - 0x0, 0xca, 0x53, 0x90, 0x6c, 0x10, 0x2, 0xd4, - 0x7, 0x40, 0x3, 0xb0, 0xb, 0x29, 0xb, 0x0, - 0x0, 0xc0, 0x64, 0xa, 0x95, 0x0, 0x0, 0xc0, - 0xb0, 0x4, 0xf1, 0x0, 0x2, 0xb0, 0xb0, 0x3b, - 0x55, 0x0, 0xa, 0x30, 0x4b, 0x81, 0x0, 0x1, - 0xa4, 0x0, 0x0, 0x0, 0x2, 0x67, 0x10, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - - /* U+3082 "も" */ - 0x0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x3d, 0x0, - 0x0, 0x0, 0x4, 0x80, 0x0, 0x0, 0x32, 0x74, - 0x0, 0x0, 0x0, 0x6e, 0xba, 0x10, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x11, - 0x88, 0xa2, 0x20, 0x5, 0x0, 0x8a, 0x88, 0x0, - 0x80, 0x6, 0x50, 0x0, 0xa, 0x0, 0x48, 0x0, - 0x2, 0x90, 0x0, 0xc4, 0x13, 0xc2, 0x0, 0x1, - 0x8a, 0x92, 0x0, - - /* U+3083 "ゃ" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x39, 0x0, 0x0, 0x0, 0x57, 0x1, 0xa4, 0x51, - 0x0, 0x1, 0xa2, 0x99, 0x55, 0xc4, 0x0, 0x2d, - 0x91, 0x0, 0x4, 0x80, 0xa9, 0x49, 0x7, 0x65, - 0xc3, 0x0, 0x0, 0xb2, 0x3, 0x52, 0x0, 0x0, - 0x4, 0x90, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, - - /* U+3084 "や" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x10, 0x1a, 0x20, 0x0, 0x0, 0x0, 0x3a, - 0x0, 0x4c, 0x52, 0x31, 0x0, 0x0, 0xc, 0x0, - 0x4b, 0xb8, 0x7a, 0x80, 0x0, 0x7, 0xab, 0x71, - 0x0, 0x0, 0xd1, 0x0, 0x3b, 0xe1, 0x0, 0x0, - 0x0, 0xd0, 0x2c, 0x91, 0x77, 0x5, 0x40, 0x6, - 0xa0, 0x0, 0x0, 0xd, 0x0, 0x38, 0xa7, 0x0, - 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, - 0x0, 0x0, 0x0, - - /* U+3085 "ゅ" */ - 0x0, 0x0, 0x48, 0x0, 0x0, 0xd, 0x0, 0x3c, - 0xa5, 0x0, 0x1b, 0x9, 0x87, 0x56, 0x80, 0x47, - 0x76, 0x6, 0x50, 0xc0, 0x56, 0xa1, 0x7, 0x40, - 0xa2, 0x4d, 0x46, 0x19, 0x10, 0xd0, 0xe, 0x0, - 0xab, 0x18, 0x80, 0x2, 0x0, 0x8a, 0x94, 0x0, - 0x0, 0x6, 0x40, 0x0, 0x0, - - /* U+3086 "ゆ" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xa6, 0x0, 0x0, 0x8, 0x10, 0x0, 0x3e, - 0x51, 0x0, 0xb, 0x30, 0x3b, 0x8d, 0x5a, 0x70, - 0xc, 0x4, 0xb1, 0xb, 0x0, 0x95, 0x1a, 0x1c, - 0x0, 0xb, 0x0, 0x3b, 0x47, 0x94, 0x10, 0xc, - 0x0, 0xd, 0x47, 0xb0, 0x60, 0xc, 0x0, 0x2b, - 0x3d, 0x70, 0x72, 0x2a, 0x0, 0x77, 0xf, 0x40, - 0xb, 0x95, 0x17, 0xb0, 0x5, 0x10, 0x2, 0xda, - 0x95, 0x0, 0x0, 0x0, 0x3b, 0x20, 0x0, 0x0, - 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, - - /* U+3087 "ょ" */ - 0x0, 0x9, 0x30, 0x0, 0x0, 0xa, 0x40, 0x0, - 0x0, 0x9, 0xab, 0x80, 0x0, 0x9, 0x30, 0x0, - 0x0, 0xa, 0x20, 0x0, 0x0, 0xa, 0x20, 0x0, - 0x29, 0x9e, 0xb8, 0x0, 0x83, 0x2d, 0x8, 0x40, - 0x2d, 0xd5, 0x0, 0x0, - - /* U+3088 "よ" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0xe, 0x40, - 0x0, 0x0, 0x0, 0xb2, 0x1, 0x0, 0x0, 0xb, - 0x9c, 0xa2, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x4, 0x4d, 0x0, 0x0, 0x2b, 0x65, 0xec, 0x80, - 0x6, 0x50, 0x49, 0x9, 0x70, 0x1b, 0xbb, 0x10, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3089 "ら" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x75, - 0x0, 0x0, 0x0, 0x2, 0x5c, 0xd0, 0x0, 0x0, - 0x67, 0x13, 0x90, 0x0, 0x1, 0xa0, 0x0, 0x0, - 0x0, 0x6, 0x40, 0x0, 0x0, 0x0, 0xb, 0x16, - 0xba, 0xba, 0x20, 0xe, 0xb5, 0x0, 0x3, 0xd0, - 0x3e, 0x20, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, - 0x1, 0x37, 0xb7, 0x0, 0x0, 0x24, 0x31, 0x0, - 0x0, - - /* U+308A "り" */ - 0x5, 0x0, 0x0, 0x0, 0x1f, 0x4, 0xbb, 0x40, - 0x3a, 0x3a, 0x1, 0xc0, 0x66, 0xc0, 0x0, 0xd0, - 0x98, 0x70, 0x0, 0xb1, 0xac, 0x10, 0x0, 0xb1, - 0x9b, 0x0, 0x0, 0xc0, 0x58, 0x0, 0x1, 0xb0, - 0x1, 0x0, 0x6, 0x60, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0x84, 0x0, 0x0, 0x6, 0x50, 0x0, - 0x0, 0x53, 0x0, 0x0, - - /* U+308B "る" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, - 0xca, 0x0, 0x1, 0xcb, 0x50, 0xb7, 0x0, 0x0, - 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x76, 0x0, - 0x0, 0x0, 0x6, 0x80, 0x0, 0x0, 0x0, 0x6d, - 0x9a, 0xab, 0x70, 0x8, 0xe6, 0x0, 0x0, 0x96, - 0x6d, 0x10, 0x0, 0x0, 0x3b, 0x21, 0x1a, 0x92, - 0x0, 0x49, 0x0, 0x85, 0x9, 0x10, 0xc3, 0x0, - 0x3b, 0x45, 0xbc, 0x40, 0x0, 0x2, 0x66, 0x40, - 0x0, - - /* U+308C "れ" */ - 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0x0, 0x18, 0x91, 0x0, 0x0, 0x0, 0xb, 0x63, - 0xb3, 0x57, 0x0, 0x0, 0x17, 0x9d, 0x88, 0x0, - 0x47, 0x0, 0x0, 0x3, 0x1f, 0x60, 0x0, 0x65, - 0x0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x82, 0x0, - 0x0, 0x0, 0xda, 0x0, 0x0, 0xa0, 0x0, 0x0, - 0x7, 0x6a, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x1d, - 0x2a, 0x0, 0x0, 0xb0, 0x1, 0x60, 0x75, 0x9e, - 0x10, 0x0, 0x97, 0x79, 0x0, 0x0, 0x2d, 0x0, - 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+308D "ろ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x34, 0x88, - 0xe4, 0x0, 0x1, 0x96, 0x3, 0xd2, 0x0, 0x0, - 0x0, 0x2b, 0x10, 0x0, 0x0, 0x1, 0xa1, 0x0, - 0x0, 0x0, 0x1a, 0x23, 0x42, 0x0, 0x2, 0xda, - 0x85, 0x58, 0xb1, 0x5e, 0x80, 0x0, 0x0, 0x4a, - 0xb3, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, - 0x0, 0x49, 0x0, 0x0, 0x0, 0x2, 0xc1, 0x0, - 0x4, 0x67, 0x99, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+308F "わ" */ - 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x20, 0x35, - 0x41, 0x0, 0x1, 0x69, 0xf5, 0xa7, 0x56, 0xb7, - 0x0, 0x46, 0x4e, 0x90, 0x0, 0x0, 0x95, 0x0, - 0xc, 0xb0, 0x0, 0x0, 0x2, 0xa0, 0x5, 0xbb, - 0x0, 0x0, 0x0, 0x1b, 0x0, 0xd2, 0xb0, 0x0, - 0x0, 0x3, 0x80, 0x89, 0x1b, 0x0, 0x0, 0x0, - 0xa1, 0xc, 0x49, 0xb0, 0x0, 0x1, 0x93, 0x0, - 0x0, 0x79, 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+3092 "を" */ - 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x10, 0x0, 0x0, 0x3, 0x5, 0x83, 0x99, 0x0, - 0x0, 0x59, 0xea, 0x73, 0x0, 0x0, 0x0, 0x84, - 0x0, 0x0, 0x0, 0x0, 0x4b, 0x89, 0x10, 0x1, - 0xa1, 0x4e, 0x70, 0x2a, 0x18, 0xc8, 0x1c, 0x40, - 0x2, 0xeb, 0x40, 0x0, 0x0, 0x8, 0xac, 0x0, - 0x0, 0x0, 0xb, 0x41, 0xb0, 0x0, 0x0, 0x2, - 0xa0, 0x14, 0x0, 0x0, 0x0, 0x1d, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x4c, 0xcc, 0xdd, 0x20, 0x0, - - /* U+3093 "ん" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x47, 0x91, 0x0, 0x0, 0x0, 0x1, 0xcb, - 0x46, 0x80, 0x0, 0x0, 0x0, 0x8e, 0x20, 0x39, - 0x0, 0x1, 0x30, 0x1f, 0x50, 0x3, 0x90, 0x0, - 0x80, 0xa, 0xa0, 0x0, 0x2a, 0x0, 0x55, 0x0, - 0xe1, 0x0, 0x0, 0xd5, 0x88, 0x0, 0x1, 0x0, - 0x0, 0x1, 0x62, 0x0, 0x0, - - /* U+30A1 "ァ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x57, 0x8a, - 0xc0, 0x4b, 0x84, 0x0, 0xb8, 0x0, 0x0, 0x23, - 0x92, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, - 0x95, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x5, 0x80, 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, - 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+30A2 "ア" */ - 0x0, 0x0, 0x0, 0x0, 0x15, 0x60, 0x0, 0x1, - 0x36, 0x88, 0x89, 0xf3, 0x9, 0xfa, 0x62, 0x0, - 0x2e, 0x60, 0x0, 0x0, 0x0, 0x1, 0xb2, 0x0, - 0x0, 0x0, 0x6, 0x98, 0x0, 0x0, 0x0, 0x0, - 0x7, 0x80, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+30A3 "ィ" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0xa7, - 0x0, 0x0, 0x4, 0xd1, 0x0, 0x0, 0x4c, 0x10, - 0x0, 0x6, 0xc9, 0x0, 0x0, 0x86, 0xc, 0x0, - 0x15, 0x10, 0xb, 0x0, 0x0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, 0x2a, 0x0, - 0x0, 0x0, 0x2, 0x0, - - /* U+30A4 "イ" */ - 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, - 0x3, 0xf3, 0x0, 0x0, 0x0, 0x1d, 0x40, 0x0, - 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0xb, 0x70, - 0x0, 0x0, 0x2, 0xb8, 0xc0, 0x0, 0x0, 0x69, - 0x13, 0xa0, 0x0, 0x27, 0x30, 0x2, 0xa0, 0x0, - 0x0, 0x0, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x2, - 0xa0, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x0, - 0x0, 0x4, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x70, - 0x0, - - /* U+30A6 "ウ" */ - 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x30, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x47, 0xb8, - 0x9, 0x9a, 0xaa, 0x85, 0x27, 0xc0, 0x94, 0x0, - 0x0, 0x0, 0xd3, 0x8, 0x50, 0x0, 0x0, 0x59, - 0x0, 0x86, 0x0, 0x0, 0xc, 0x10, 0x4, 0x40, - 0x0, 0x9, 0x50, 0x0, 0x0, 0x0, 0x5, 0xa0, - 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, - 0x2, 0xa1, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30A7 "ェ" */ - 0x0, 0x1, 0x25, 0x94, 0x0, 0x3, 0xb9, 0xd5, - 0x20, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0xa1, 0x0, - 0x0, 0x25, 0x78, 0xdb, 0xbc, 0xd1, 0x17, 0x42, - 0x0, 0x0, 0x0, - - /* U+30A8 "エ" */ - 0x0, 0x0, 0x0, 0x2, 0x51, 0x0, 0x2, 0x99, - 0xac, 0xa9, 0x73, 0x0, 0x0, 0x33, 0xc, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, 0xa, 0x43, - 0x56, 0x72, 0x6c, 0xca, 0xa9, 0x76, 0x55, 0x64, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30AA "オ" */ - 0x0, 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4c, - 0x8a, 0xc4, 0x0, 0x8d, 0xb9, 0x7e, 0xb2, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x9a, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xb0, 0xb0, 0x0, 0x0, 0x0, 0x3, - 0xb0, 0xb, 0x0, 0x0, 0x0, 0x3, 0xb1, 0x0, - 0xb0, 0x0, 0x0, 0x5, 0x90, 0x0, 0xb, 0x0, - 0x0, 0x4, 0x40, 0x0, 0x52, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x10, 0x0, 0x0, - - /* U+30AB "カ" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xf, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x2b, 0x37, 0xb5, 0x3, 0x88, - 0xac, 0xb6, 0x38, 0xb0, 0x6, 0x30, 0xb1, 0x0, - 0xa4, 0x0, 0x0, 0x2b, 0x0, 0xe, 0x0, 0x0, - 0xb, 0x30, 0x3, 0xb0, 0x0, 0x4, 0x90, 0x0, - 0x86, 0x0, 0x1, 0xb0, 0x0, 0xd, 0x10, 0x1, - 0x91, 0x0, 0xac, 0xb0, 0x0, 0x50, 0x0, 0x2, - 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30AC "ガ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x20, 0x1, 0x6, 0x90, 0x0, 0x0, 0xc, - 0x60, 0x1b, 0x28, 0x0, 0x0, 0x0, 0xd2, 0x0, - 0x36, 0x0, 0x0, 0x0, 0xd, 0x4, 0x85, 0x0, - 0x0, 0x55, 0x8a, 0xd9, 0x67, 0xe0, 0x0, 0x6, - 0x62, 0x76, 0x0, 0x69, 0x0, 0x0, 0x0, 0xc, - 0x10, 0xa, 0x40, 0x0, 0x0, 0x4, 0x90, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x3a, 0x0, - 0x0, 0x0, 0x85, 0x0, 0x8, 0x50, 0x0, 0x0, - 0x66, 0x0, 0x88, 0xe1, 0x0, 0x0, 0x32, 0x0, - 0x0, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+30AD "キ" */ - 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xc7, 0x9a, 0x90, 0x3, 0xca, - 0x7b, 0x30, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, - 0x0, 0x0, 0x0, 0x28, 0xba, 0xbb, 0x83, 0xcb, - 0xa7, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - - /* U+30AE "ギ" */ - 0x0, 0x0, 0x23, 0x0, 0x1, 0x83, 0x0, 0x0, - 0x3d, 0x0, 0x27, 0x29, 0x0, 0x0, 0xc, 0x0, - 0x5, 0x80, 0x0, 0x0, 0x2c, 0x8a, 0xb3, 0x0, - 0x2, 0xca, 0x6a, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x50, 0x1, 0x0, 0x0, 0x1, 0x38, 0xca, - 0xba, 0x80, 0x2c, 0xb9, 0x64, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30AF "ク" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, - 0x0, 0x0, 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, - 0x4, 0xe4, 0x46, 0x70, 0x0, 0xc, 0x56, 0x34, - 0xf4, 0x0, 0x94, 0x0, 0x9, 0x90, 0x7, 0x30, - 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, - 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0x5a, - 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, - 0x5a, 0x0, 0x0, 0x0, 0x7, 0x50, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+30B0 "グ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x40, 0x2, 0x93, 0x0, 0x0, 0x1e, 0x20, - 0x2a, 0x57, 0x0, 0x0, 0x9b, 0x55, 0x87, 0x60, - 0x0, 0x3, 0xb4, 0x42, 0x6f, 0x0, 0x0, 0x1b, - 0x10, 0x0, 0xd4, 0x0, 0x1, 0x70, 0x0, 0x7, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x87, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, - 0x2, 0x82, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+30B1 "ケ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x31, 0x36, 0x9c, 0xb1, - 0x0, 0x7b, 0xca, 0x9b, 0x10, 0x0, 0x3, 0x90, - 0x0, 0x5c, 0x0, 0x0, 0x15, 0x0, 0x0, 0x95, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30B2 "ゲ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x1b, 0x0, 0x0, 0x21, 0xc2, 0x0, 0x6, 0xc0, - 0x0, 0x2, 0xc4, 0x30, 0x0, 0xc1, 0x1, 0x36, - 0x96, 0x20, 0x0, 0x8b, 0xb9, 0xba, 0x43, 0x0, - 0x0, 0x48, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x25, - 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30B3 "コ" */ - 0x0, 0x0, 0x0, 0x1, 0x10, 0x7, 0x78, 0x9a, - 0xab, 0xe1, 0x4, 0x53, 0x0, 0x3, 0xc0, 0x0, - 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0x7, - 0x50, 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x2, 0x34, 0x68, 0xaf, 0x20, - 0x2b, 0x96, 0x42, 0x11, 0x0, - - /* U+30B4 "ゴ" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x20, 0xa5, 0x0, 0x0, 0x0, 0x0, - 0x4a, 0x18, 0x0, 0x0, 0x0, 0x2, 0x26, 0x30, - 0x15, 0x57, 0x99, 0x9b, 0xe0, 0x0, 0x7, 0x73, - 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x23, 0x45, 0x78, 0xae, - 0x0, 0x0, 0x29, 0x75, 0x32, 0x11, 0x0, 0x0, - - /* U+30B5 "サ" */ - 0x0, 0x0, 0x30, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0xf1, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x1, 0xc4, - 0x68, 0xdb, 0xbc, 0xb0, 0x1c, 0xb8, 0xd4, 0x21, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x70, 0x2, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, - 0x0, 0x0, 0x0, 0x0, - - /* U+30B6 "ザ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, - 0x0, 0x30, 0x0, 0xa1, 0x19, 0x28, 0x30, 0x0, - 0xd, 0x30, 0xc, 0x10, 0x2a, 0x0, 0x0, 0x0, - 0xa1, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x56, 0x8e, 0x99, 0xb9, 0x0, 0xb, 0xb9, 0xd5, - 0x20, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x10, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x38, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, - 0x0, - - /* U+30B7 "シ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x15, - 0x28, 0x40, 0x0, 0x0, 0x1, 0x90, 0x1, 0xc9, - 0x0, 0x0, 0x2b, 0x10, 0x0, 0x3, 0x0, 0x3, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, - 0x0, 0x0, 0x2b, 0x90, 0x0, 0x0, 0x2, 0x6b, - 0xd4, 0x0, 0x0, 0x0, 0x3, 0xe6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30B8 "ジ" */ - 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x29, 0x60, 0x0, 0x69, 0x20, 0x0, - 0xc3, 0x20, 0x0, 0x3, 0xe1, 0x0, 0x21, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x24, 0x7, 0x80, - 0x0, 0x0, 0x2, 0x90, 0x0, 0x7d, 0x0, 0x0, - 0x2b, 0x10, 0x0, 0x5, 0x0, 0x3, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x6b, 0x10, 0x0, 0x0, 0x0, - 0x1b, 0x80, 0x0, 0x0, 0x1, 0x6a, 0xc3, 0x0, - 0x0, 0x0, 0x1, 0xb7, 0x0, 0x0, 0x0, 0x0, - - /* U+30B9 "ス" */ - 0x0, 0x0, 0x0, 0x16, 0x90, 0x0, 0x5, 0x68, - 0xaa, 0x6f, 0x40, 0x0, 0x68, 0x30, 0x7, 0x90, - 0x0, 0x0, 0x0, 0x1, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x40, - 0x0, 0x0, 0x0, 0x2d, 0x16, 0x60, 0x0, 0x0, - 0x2d, 0x20, 0xa, 0x60, 0x0, 0x3c, 0x20, 0x0, - 0xe, 0x40, 0x68, 0x0, 0x0, 0x0, 0x6c, 0x21, - 0x0, 0x0, 0x0, 0x0, 0x60, - - /* U+30BA "ズ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x12, 0xc2, 0x0, 0x0, - 0x0, 0x5, 0x60, 0xa5, 0x22, 0x0, 0x55, 0x8a, - 0x99, 0xf1, 0x14, 0x0, 0x0, 0x97, 0x20, 0xa, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x19, 0x30, 0x0, 0x0, 0x0, - 0x2, 0xb1, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x3a, - 0x10, 0x0, 0x1e, 0x30, 0x0, 0x6, 0x60, 0x0, - 0x0, 0x7, 0x90, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, - - /* U+30BB "セ" */ - 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x19, 0x60, 0x0, 0x0, 0xd0, 0x49, 0x9a, 0xe0, - 0x0, 0x3, 0xe9, 0x60, 0x1c, 0x10, 0x39, 0xc8, - 0xd0, 0x0, 0x91, 0x0, 0x4, 0x0, 0xd0, 0x3, - 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb6, 0x22, 0x36, 0x70, 0x0, 0x0, 0x19, 0xbb, - 0x98, 0x30, - - /* U+30BC "ゼ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x96, 0x0, 0x1, 0x10, - 0x0, 0x0, 0xa5, 0x80, 0x0, 0x4e, 0x0, 0x0, - 0x1, 0x90, 0x0, 0x1, 0xd0, 0x0, 0x6, 0x40, - 0x0, 0x0, 0x1c, 0x2, 0x8a, 0xce, 0x0, 0x0, - 0x3, 0xea, 0x71, 0x2c, 0x10, 0x2, 0x7b, 0x9c, - 0x0, 0xa, 0x10, 0x0, 0x16, 0x1, 0xc0, 0x6, - 0x10, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x40, 0x12, 0x57, 0x0, 0x0, 0x0, - 0x3a, 0xbc, 0xba, 0x50, 0x0, - - /* U+30BD "ソ" */ - 0x0, 0x0, 0x0, 0x0, 0x40, 0x35, 0x0, 0x0, - 0x0, 0xf5, 0xb, 0x50, 0x0, 0x2, 0xe0, 0x4, - 0xe0, 0x0, 0x8, 0x80, 0x0, 0xa0, 0x0, 0x1e, - 0x10, 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, - 0x3, 0xc0, 0x0, 0x0, 0x0, 0x1c, 0x20, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xa, 0x30, - 0x0, 0x0, 0x2, 0x81, 0x0, 0x0, 0x0, 0x3, - 0x0, 0x0, 0x0, 0x0, - - /* U+30BF "タ" */ - 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xaa, 0x0, 0x51, 0x0, 0x0, 0x2f, 0xaa, 0xaf, - 0x80, 0x0, 0xc, 0x42, 0x12, 0xe1, 0x0, 0xa, - 0xa0, 0x0, 0xa6, 0x0, 0xa, 0x43, 0xc3, 0x3c, - 0x0, 0x6, 0x10, 0x4, 0xed, 0x20, 0x0, 0x0, - 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, 0x7, 0x90, - 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, - 0x1a, 0x60, 0x0, 0x0, 0x0, 0x58, 0x20, 0x0, - 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30C0 "ダ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x52, 0xc2, 0x0, 0x0, - 0x1f, 0x20, 0x35, 0x2d, 0x31, 0x0, 0x0, 0x9d, - 0x8a, 0xaf, 0x13, 0x0, 0x0, 0x4, 0xc3, 0x20, - 0x97, 0x0, 0x0, 0x0, 0x3d, 0x30, 0x2, 0xd0, - 0x0, 0x0, 0x4, 0xa0, 0x98, 0xb, 0x40, 0x0, - 0x0, 0x24, 0x0, 0xb, 0xa9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+30C1 "チ" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x3b, 0xe1, 0x0, 0x0, 0x4, 0x8b, 0xc3, - 0x0, 0x0, 0x0, 0x22, 0x1, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe2, 0x35, 0x61, 0x49, 0x9a, - 0xaa, 0xe8, 0x77, 0x75, 0x3, 0x20, 0x3, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x76, 0x0, 0x0, 0x0, 0x0, 0x4, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+30C3 "ッ" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x20, 0x73, 0x0, - 0xe3, 0x9, 0x41, 0xc0, 0x1f, 0x10, 0x39, 0x2, - 0x7, 0x80, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0x94, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, - 0x0, 0x67, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, - 0x0, - - /* U+30C4 "ツ" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, 0x9, 0x20, - 0x0, 0x75, 0x81, 0x2, 0xe0, 0x0, 0xa8, 0x3d, - 0x0, 0xc0, 0x1, 0xd0, 0xd, 0x10, 0x0, 0x9, - 0x50, 0x1, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, - 0x0, 0xc2, 0x0, 0x0, 0x0, 0x8, 0x60, 0x0, - 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x5, 0x80, - 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, - - /* U+30C6 "テ" */ - 0x0, 0x2, 0x35, 0x7b, 0x70, 0x0, 0x0, 0x77, - 0x53, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x23, 0x45, 0x78, 0x9b, 0xda, 0x2a, 0x85, - 0x38, 0x90, 0x0, 0x0, 0x0, 0x0, 0x98, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, - 0x74, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, - 0x0, 0x0, - - /* U+30C7 "デ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x80, 0x0, 0x3, - 0x35, 0x7a, 0x70, 0x95, 0x90, 0x0, 0x6, 0x64, - 0x21, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x24, 0x68, 0x9a, 0xbc, - 0x80, 0x0, 0x29, 0x75, 0x25, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x73, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+30C8 "ト" */ - 0x0, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, 0x3a, - 0x0, 0x0, 0x3, 0x90, 0x0, 0x0, 0x2b, 0x0, - 0x0, 0x2, 0x97, 0x81, 0x0, 0x29, 0x4, 0xe6, - 0x2, 0x90, 0x2, 0xd0, 0x29, 0x0, 0x0, 0x3, - 0x90, 0x0, 0x0, 0x49, 0x0, 0x0, 0x4, 0xa0, - 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - - /* U+30C9 "ド" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0xe1, 0x0, 0x2, - 0x50, 0xe, 0x0, 0x7, 0x36, 0x90, 0xc0, 0x0, - 0x1d, 0x2, 0xc, 0x10, 0x0, 0x10, 0x0, 0xc5, - 0x93, 0x0, 0x0, 0xc, 0x2, 0xd8, 0x0, 0x0, - 0xc0, 0x1, 0xd1, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x0, 0x0, - - /* U+30CA "ナ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x27, 0xc8, 0xac, 0xc1, 0x5d, 0xca, - 0x78, 0x91, 0x0, 0x0, 0x0, 0x0, 0x6, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x75, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+30CB "ニ" */ - 0x0, 0x0, 0x0, 0x1, 0x23, 0x0, 0x0, 0x0, - 0x2c, 0xa9, 0x98, 0x83, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x23, 0x45, 0x62, 0xb, - 0xca, 0x99, 0x87, 0x65, 0x55, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+30CD "ネ" */ - 0x0, 0x0, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0xd0, 0x0, - 0x0, 0x6b, 0xa5, 0x1d, 0x40, 0x0, 0x0, 0x1, - 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0xc, 0x60, - 0x0, 0x0, 0x0, 0x1, 0xb6, 0xc0, 0x87, 0x0, - 0x0, 0x49, 0x11, 0xa0, 0x9, 0xb0, 0x6, 0x40, - 0x1, 0xa0, 0x0, 0x90, 0x0, 0x0, 0x1, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, - - /* U+30CE "ノ" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xb9, 0x0, 0x0, 0x0, 0x0, 0x2e, - 0x10, 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, - 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x4, 0xb0, - 0x0, 0x0, 0x0, 0x3, 0xc1, 0x0, 0x0, 0x0, - 0x3, 0xb1, 0x0, 0x0, 0x0, 0x5, 0xa0, 0x0, - 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x15, - 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+30CF "ハ" */ - 0x0, 0x0, 0x17, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x5, 0xf1, 0x0, 0x81, 0x0, 0x0, 0x0, 0xc5, - 0x0, 0x1, 0xb1, 0x0, 0x0, 0x79, 0x0, 0x0, - 0x5, 0xc0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0xc, - 0x70, 0x1a, 0x10, 0x0, 0x0, 0x0, 0x4d, 0x6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, - - /* U+30D0 "バ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x34, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb4, 0x40, 0x0, 0x0, 0x5, - 0x0, 0x2, 0x11, 0x0, 0x0, 0x0, 0x5e, 0x0, - 0x6, 0x20, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, - 0xa1, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x4c, - 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0xb, 0x60, - 0x1, 0x91, 0x0, 0x0, 0x0, 0x4, 0xd0, 0x5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, - - /* U+30D1 "パ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x61, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x46, 0x10, 0x0, 0x0, 0x6, - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x30, - 0x3, 0x60, 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, - 0x94, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x1e, - 0x10, 0x0, 0xb, 0x10, 0x0, 0x0, 0x8, 0xa0, - 0x0, 0x83, 0x0, 0x0, 0x0, 0x1, 0xf1, 0x4, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x70, - - /* U+30D2 "ヒ" */ - 0x11, 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x1, - 0x5c, 0xc0, 0xe, 0x67, 0x75, 0x32, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xc6, 0x21, 0x23, 0x65, 0x1, 0x7a, 0xaa, - 0x98, 0x40, - - /* U+30D3 "ビ" */ - 0x30, 0x0, 0x0, 0x5, 0x10, 0xd5, 0x0, 0x0, - 0x42, 0xd1, 0xb2, 0x0, 0x0, 0x4d, 0x30, 0xb2, - 0x0, 0x1, 0x82, 0x0, 0xb2, 0x1, 0x8d, 0xb3, - 0x0, 0xb6, 0x78, 0x30, 0x0, 0x0, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0xb2, 0x0, 0x0, 0x0, 0x0, 0x7a, 0x42, 0x23, - 0x68, 0x0, 0x5, 0x89, 0x99, 0x75, 0x0, - - /* U+30D4 "ピ" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x3, 0x40, 0x0, - 0x0, 0x32, 0x60, 0x4d, 0x0, 0x0, 0x3, 0x9a, - 0x3, 0xa0, 0x0, 0x0, 0x1, 0x10, 0x2a, 0x0, - 0x4, 0xdb, 0x0, 0x2, 0xa0, 0x6a, 0x84, 0x0, - 0x0, 0x2c, 0x61, 0x0, 0x0, 0x0, 0x3, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x39, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xdc, 0xbc, 0xdd, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+30D5 "フ" */ - 0x0, 0x0, 0x0, 0x0, 0x25, 0x30, 0x7, 0x78, - 0x9a, 0xa9, 0x7a, 0xe0, 0x3, 0x63, 0x10, 0x0, - 0xd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x97, - 0x0, 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x29, - 0x20, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, - 0x0, 0x0, - - /* U+30D6 "ブ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x30, 0xa4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3c, 0x17, 0x0, 0x2, 0x36, - 0x8a, 0xbe, 0x25, 0x0, 0x5d, 0xb8, 0x64, 0x10, - 0x4e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xc2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+30D7 "プ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x34, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x73, 0x0, 0x0, 0x24, - 0x69, 0xbc, 0x10, 0x0, 0x7d, 0xca, 0x86, 0x31, - 0x4e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+30D9 "ベ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, - 0x12, 0x0, 0x2a, 0x1c, 0x0, 0x0, 0x3, 0xcb, - 0x50, 0x4, 0x60, 0x0, 0x0, 0x3c, 0x10, 0xb4, - 0x0, 0x0, 0x0, 0x4, 0xd1, 0x0, 0x1c, 0x40, - 0x0, 0x0, 0x3c, 0x20, 0x0, 0x1, 0xd4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xd8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x10, - - /* U+30DA "ペ" */ - 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x37, 0x0, 0x0, 0x0, 0x0, - 0x35, 0x2, 0x78, 0x0, 0x0, 0x0, 0x5, 0xb9, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x5b, 0x0, 0x97, - 0x0, 0x0, 0x0, 0x7, 0xc0, 0x0, 0xb, 0x60, - 0x0, 0x0, 0x29, 0x10, 0x0, 0x0, 0xc6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbb, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30DB "ホ" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc6, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x93, 0x13, 0x52, 0x9, 0xaa, - 0xad, 0xb9, 0x88, 0x70, 0x11, 0x0, 0x93, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x30, 0x20, 0x0, 0x7, - 0x0, 0x93, 0x2, 0x80, 0x3, 0x90, 0x9, 0x30, - 0x9, 0x61, 0xd3, 0x0, 0x83, 0x0, 0x2d, 0x13, - 0x0, 0x8d, 0x40, 0x0, 0x30, 0x0, 0x1, 0xc1, - 0x0, 0x0, - - /* U+30DC "ボ" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x20, 0xb3, 0x0, 0x0, 0xe, 0x20, - 0x5a, 0x37, 0x0, 0x0, 0xc, 0x10, 0x7, 0x0, - 0x0, 0x0, 0xb, 0x0, 0x24, 0x10, 0x19, 0x99, - 0x9e, 0x99, 0x88, 0x50, 0x2, 0x20, 0xb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x10, 0x0, - 0x0, 0x70, 0xb, 0x10, 0x27, 0x0, 0x2, 0x90, - 0xb, 0x10, 0x9, 0x60, 0xd, 0x40, 0xb, 0x10, - 0x2, 0xd0, 0x24, 0x1, 0x8d, 0x10, 0x0, 0x30, - 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+30DD "ポ" */ - 0x0, 0x0, 0x1, 0x2, 0x76, 0x0, 0x0, 0x0, - 0xe2, 0x42, 0x60, 0x0, 0x0, 0xc, 0x10, 0x64, - 0x0, 0x0, 0x0, 0xb0, 0x13, 0x51, 0x1a, 0xaa, - 0x9e, 0x98, 0x77, 0x50, 0x11, 0x0, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x0, 0x20, 0x0, 0x7, - 0x0, 0xb1, 0x2, 0x80, 0x3, 0x90, 0xb, 0x10, - 0x9, 0x61, 0xd3, 0x0, 0xb1, 0x0, 0x2d, 0x13, - 0x1, 0x9e, 0x10, 0x0, 0x30, 0x0, 0x3, 0xb0, - 0x0, 0x0, - - /* U+30DE "マ" */ - 0x0, 0x0, 0x0, 0x1, 0x36, 0x60, 0x4c, 0xba, - 0x99, 0x98, 0x65, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x70, 0x0, 0x0, 0x10, 0x1, 0xa3, 0x0, - 0x0, 0x0, 0x83, 0x18, 0x10, 0x0, 0x0, 0x0, - 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x4, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, - - /* U+30DF "ミ" */ - 0x1, 0x67, 0x20, 0x0, 0x0, 0x3, 0xcc, 0x30, - 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x78, 0x30, 0x0, 0x0, 0x2, 0xcc, 0x0, - 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x85, 0x0, 0x0, 0x0, 0x6, 0xd9, 0x10, - 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, 0x0, 0x40, - - /* U+30E0 "ム" */ - 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xaa, 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, - 0x0, 0x0, 0x5, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xc2, 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, 0x20, - 0x0, 0x0, 0xb, 0x10, 0x3, 0x80, 0x0, 0x4, - 0x70, 0x0, 0x8, 0x90, 0x0, 0xb0, 0x26, 0x98, - 0x5d, 0x50, 0xbe, 0xd9, 0x40, 0x0, 0x6a, 0x5, - 0x50, 0x0, 0x0, 0x0, 0x30, - - /* U+30E1 "メ" */ - 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5c, - 0x0, 0x0, 0x4, 0x10, 0xd, 0x20, 0x0, 0x0, - 0x6, 0x88, 0x80, 0x0, 0x0, 0x0, 0x5, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0xc3, 0xca, 0x0, 0x0, - 0x0, 0xa5, 0x1, 0xd1, 0x0, 0x0, 0x96, 0x0, - 0x1, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x2, - 0x82, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, - - /* U+30E2 "モ" */ - 0x0, 0x0, 0x3, 0x59, 0xc7, 0x0, 0x2, 0xba, - 0xac, 0x31, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x13, 0x10, - 0x14, 0x57, 0x9e, 0x9a, 0xa9, 0x90, 0x17, 0x52, - 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x42, 0x24, 0x20, 0x0, 0x0, - 0x1, 0x8a, 0xa9, 0x20, - - /* U+30E3 "ャ" */ - 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x77, - 0x0, 0x5, 0x10, 0x0, 0x1, 0xc6, 0x98, 0xca, - 0x2, 0x7a, 0x9d, 0x30, 0xa, 0x0, 0x3, 0x0, - 0x75, 0x5, 0x10, 0x0, 0x0, 0x2, 0xa0, 0x10, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x3, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30E4 "ヤ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x49, 0xd3, 0x0, 0x0, 0xc, 0x7a, 0x96, 0x2e, - 0x30, 0x68, 0xaa, 0xa8, 0x0, 0x7, 0x50, 0x3, - 0x40, 0x2, 0xa0, 0x1, 0x80, 0x0, 0x0, 0x0, - 0xc, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x83, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, - - /* U+30E5 "ュ" */ - 0x0, 0x0, 0x1, 0x20, 0x0, 0x2, 0xba, 0x99, - 0xf0, 0x0, 0x0, 0x0, 0x4, 0xa0, 0x0, 0x0, - 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x3c, 0xba, 0xac, 0xbc, 0xd5, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+30E7 "ョ" */ - 0x0, 0x0, 0x0, 0x10, 0x7, 0xcb, 0xbb, 0xf3, - 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0xd0, - 0x5, 0xcb, 0xaa, 0xb0, 0x0, 0x0, 0x3, 0x90, - 0x0, 0x0, 0x6, 0x70, 0x2c, 0xba, 0xaa, 0x70, - - /* U+30E8 "ヨ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xaa, - 0xbb, 0xbd, 0xd0, 0x0, 0x2, 0x10, 0x0, 0x2f, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x58, 0x0, 0x8, 0xdc, 0xaa, 0xad, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x93, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xc0, 0x0, 0x7e, 0xcb, 0xaa, 0xab, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+30E9 "ラ" */ - 0x1, 0x43, 0x45, 0x7a, 0x60, 0x0, 0x78, 0x64, - 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, - 0x23, 0x58, 0xab, 0xe8, 0x5c, 0x97, 0x53, 0x10, - 0xb6, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, - 0x0, 0x1d, 0x20, 0x0, 0x0, 0x0, 0xb4, 0x0, - 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x1, 0xb4, - 0x0, 0x0, 0x0, 0x59, 0x10, 0x0, 0x0, 0x2, - 0x20, 0x0, 0x0, 0x0, - - /* U+30EA "リ" */ - 0x0, 0x0, 0x1, 0x2, 0x90, 0x0, 0xc6, 0xf, - 0x0, 0x9, 0x60, 0xd0, 0x0, 0x94, 0xd, 0x0, - 0x9, 0x40, 0xd0, 0x0, 0xa3, 0xe, 0x0, 0xb, - 0x20, 0xa0, 0x0, 0xd0, 0x0, 0x0, 0x2b, 0x0, - 0x0, 0x9, 0x40, 0x0, 0x5, 0x90, 0x0, 0x4, - 0x80, 0x0, 0x3, 0x30, 0x0, 0x0, - - /* U+30EB "ル" */ - 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, - 0xa3, 0x0, 0x0, 0x50, 0x0, 0xd, 0x0, 0xa3, - 0x0, 0x4, 0x40, 0x0, 0x1b, 0x0, 0xa3, 0x0, - 0x48, 0x0, 0x0, 0x48, 0x0, 0xa3, 0x6, 0x90, - 0x0, 0x0, 0xa2, 0x0, 0xa5, 0xb8, 0x0, 0x0, - 0x4, 0x70, 0x0, 0xbf, 0x40, 0x0, 0x0, 0x5, - 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, - - /* U+30EC "レ" */ - 0x9, 0x20, 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, - 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0xb, - 0x30, 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x2, - 0x50, 0xb, 0x20, 0x0, 0x78, 0x0, 0xb, 0x20, - 0x5b, 0x40, 0x0, 0xb, 0x7c, 0x90, 0x0, 0x0, - 0xa, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+30ED "ロ" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x55, 0x79, - 0xbc, 0xe2, 0x4d, 0x64, 0x31, 0x0, 0xf4, 0xc, - 0x0, 0x0, 0x2, 0xc0, 0xd, 0x0, 0x0, 0x5, - 0x70, 0xc, 0x0, 0x0, 0x8, 0x30, 0xd, 0x0, - 0x0, 0xc, 0x0, 0xe, 0x67, 0x9b, 0xcf, 0x20, - 0xc, 0x43, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+30EF "ワ" */ - 0x0, 0x0, 0x0, 0x0, 0x41, 0x9, 0x98, 0x9b, - 0xbb, 0xbc, 0xd0, 0x97, 0x21, 0x0, 0x0, 0x8a, - 0x8, 0x60, 0x0, 0x0, 0xd, 0x10, 0x86, 0x0, - 0x0, 0x6, 0x80, 0x7, 0x70, 0x0, 0x1, 0xc0, - 0x0, 0x1, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, - 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, - 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, - 0x65, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, - 0x0, 0x0, - - /* U+30F3 "ン" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0x20, 0x0, - 0x0, 0x2, 0x0, 0x7, 0x80, 0x0, 0x0, 0x90, - 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x2b, - 0x20, 0x0, 0x0, 0x0, 0x5, 0xc1, 0x0, 0x0, - 0x0, 0x1, 0xa9, 0x0, 0x0, 0x0, 0x4, 0xbd, - 0x40, 0x0, 0x0, 0x0, 0x1, 0x70, 0x0, 0x0, - 0x0, 0x0, - - /* U+30F6 "ヶ" */ - 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, 0x2d, 0x10, - 0x1, 0x0, 0x0, 0xba, 0x8a, 0xbb, 0x80, 0x5, - 0x72, 0x1a, 0x50, 0x0, 0x15, 0x0, 0xd, 0x10, - 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, - 0x0, 0x13, 0x0, 0x0, 0x0, - - /* U+30FC "ー" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x46, 0x81, 0x8, - 0xfe, 0xee, 0xdc, 0xcc, 0xbb, 0xbb, 0xa0, 0x4, - 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4E00 "一" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, - 0x7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x80, - - /* U+4E03 "七" */ - 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x2c, 0x80, - 0x0, 0x0, 0x0, 0xe, 0x15, 0x66, 0x40, 0x0, - 0x0, 0x0, 0x15, 0x6f, 0x40, 0x0, 0x0, 0x0, - 0x6, 0x66, 0x40, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x70, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xa0, - 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x3, 0xf2, - 0x0, 0x0, 0x0, 0x6, 0xbc, 0xcc, 0xcc, 0xa1, - - /* U+4E07 "万" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x46, - 0x66, 0x66, 0x66, 0x66, 0x66, 0xe8, 0x11, 0x0, - 0xc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x30, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x1f, 0x66, 0x66, - 0x6e, 0x60, 0x0, 0x0, 0x3e, 0x0, 0x0, 0xe, - 0x10, 0x0, 0x0, 0x7a, 0x0, 0x0, 0xf, 0x0, - 0x0, 0x0, 0xc5, 0x0, 0x0, 0xf, 0x0, 0x0, - 0x2, 0xe0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0xa, - 0x60, 0x0, 0x0, 0x3d, 0x0, 0x0, 0x4a, 0x0, - 0x0, 0x0, 0x6b, 0x0, 0x1, 0xa0, 0x0, 0x4, - 0x87, 0xd7, 0x0, 0x17, 0x0, 0x0, 0x0, 0x2d, - 0x90, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+4E08 "丈" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x30, 0x0, 0x60, 0x5, 0x76, - 0x66, 0x66, 0xd8, 0x66, 0x7b, 0x60, 0x0, 0x10, - 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x2, 0x30, - 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x9, 0x0, - 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x1, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x4b, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdb, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xd7, 0xdb, 0x30, - 0x0, 0x0, 0x0, 0x4, 0xc3, 0x1, 0x9f, 0xc8, - 0x42, 0x0, 0x39, 0x70, 0x0, 0x0, 0x2a, 0xfc, - 0x20, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - - /* U+4E09 "三" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x0, - 0x0, 0x76, 0x66, 0x66, 0x66, 0x66, 0x89, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x20, 0x0, - 0x0, 0x7, 0x66, 0x66, 0x66, 0x69, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x16, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xc1, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4E0A "上" */ - 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x66, 0x67, 0xd5, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x7, 0x80, - 0x7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, - - /* U+4E0B "下" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x46, - 0x66, 0x66, 0x66, 0x66, 0x67, 0xe6, 0x0, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd7, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x5d, 0x91, - 0x0, 0x0, 0x0, 0x0, 0xd1, 0x1, 0xdc, 0x0, - 0x0, 0x0, 0x0, 0xd1, 0x0, 0x1b, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, - 0x0, - - /* U+4E0D "不" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x10, - 0x76, 0x66, 0x66, 0x9c, 0x66, 0x66, 0x85, 0x0, - 0x0, 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7b, 0xb3, 0x6, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0x1b, 0x30, 0x1a, 0x30, 0x0, 0x0, 0x1c, 0x20, - 0xb3, 0x0, 0x1d, 0x60, 0x0, 0x1b, 0x20, 0xb, - 0x30, 0x0, 0x2f, 0x60, 0x29, 0x10, 0x0, 0xb3, - 0x0, 0x0, 0x6a, 0x15, 0x0, 0x0, 0xb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, - - /* U+4E13 "专" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x36, 0x66, 0xaa, 0x66, 0x6a, 0xb0, 0x0, - 0x0, 0x1, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x66, 0x66, 0xf6, 0x66, 0x66, 0x6c, 0xa0, - 0x2, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x86, 0x66, 0x6a, 0x80, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x1d, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x85, 0x7, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xda, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, - - /* U+4E14 "且" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6f, 0x10, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x7, 0x40, - 0x28, 0x66, 0x86, 0x66, 0x66, 0x68, 0x69, 0x80, - - /* U+4E16 "世" */ - 0x0, 0x0, 0x0, 0x6, 0x0, 0x8, 0x20, 0x0, - 0x0, 0x6, 0x0, 0xe, 0x0, 0xe, 0x10, 0x0, - 0x0, 0xe, 0x20, 0xd, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x7, 0x70, - 0x18, 0x6e, 0x66, 0x6e, 0x66, 0x6e, 0x66, 0x50, - 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xe, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x7, 0x0, 0x5, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, - 0x0, 0x2e, 0x66, 0x66, 0x66, 0x66, 0x6a, 0x90, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4E21 "両" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, - 0x7, 0x66, 0x66, 0x6d, 0x66, 0x66, 0x66, 0x50, - 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0xc, 0x0, 0x0, 0x3, 0x0, - 0x0, 0xd6, 0x66, 0x6d, 0x66, 0x66, 0x6e, 0x10, - 0x0, 0xd0, 0x0, 0xc, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd0, 0x2b, 0xc, 0x0, 0xc4, 0xd, 0x0, - 0x0, 0xd0, 0x1b, 0xc, 0x0, 0xc1, 0xd, 0x0, - 0x0, 0xd0, 0x1b, 0xc, 0x0, 0xc1, 0xd, 0x0, - 0x0, 0xd0, 0x1b, 0xc, 0x0, 0xc1, 0xd, 0x0, - 0x0, 0xd0, 0x3c, 0x69, 0x66, 0xd1, 0xd, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x30, 0xd, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x43, 0x4c, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x6, 0xf8, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - - /* U+4E26 "並" */ - 0x0, 0x4, 0x10, 0x0, 0x0, 0x82, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x0, 0x2e, 0x30, 0x0, 0x0, - 0x0, 0x3f, 0x10, 0x9, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xc2, 0x2, 0x50, 0x39, 0x0, 0x7, 0x66, - 0x6e, 0x66, 0xc7, 0x66, 0x61, 0x0, 0x10, 0x0, - 0xd0, 0xb, 0x30, 0x3, 0x0, 0x6, 0x20, 0xd, - 0x0, 0xb3, 0x2, 0xf3, 0x0, 0x1a, 0x0, 0xd0, - 0xb, 0x30, 0xa7, 0x0, 0x0, 0xc3, 0xd, 0x0, - 0xb3, 0x3a, 0x0, 0x0, 0x8, 0x90, 0xd0, 0xb, - 0x3a, 0x10, 0x0, 0x0, 0x68, 0xd, 0x0, 0xb8, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xd0, 0xb, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0xb3, 0x0, - 0x72, 0x5, 0x76, 0x66, 0x96, 0x68, 0x66, 0x6a, - 0x80, - - /* U+4E2D "中" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, - 0x0, 0x0, 0xa6, 0x66, 0x6e, 0x66, 0x66, 0x6e, - 0x2d, 0x10, 0x0, 0xd1, 0x0, 0x0, 0xe0, 0xd1, - 0x0, 0xd, 0x10, 0x0, 0xe, 0xd, 0x10, 0x0, - 0xd1, 0x0, 0x0, 0xe0, 0xd1, 0x0, 0xd, 0x10, - 0x0, 0xe, 0xd, 0x66, 0x66, 0xe6, 0x66, 0x66, - 0xe0, 0x60, 0x0, 0xd, 0x10, 0x0, 0x5, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - - /* U+4E3B "主" */ - 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xd0, 0x0, 0x0, 0x0, 0x26, - 0x66, 0x66, 0x6a, 0x66, 0x6c, 0xb0, 0x0, 0x20, - 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb3, 0x0, 0x33, 0x0, 0x0, 0x28, 0x66, 0x6d, - 0x86, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xb3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x7, 0x1, 0x86, 0x66, 0x66, 0x86, 0x66, 0x67, - 0xa5, - - /* U+4E45 "久" */ - 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x66, 0x6d, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x67, 0x0, 0x2e, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x88, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x20, 0x0, 0xe6, 0x0, 0x0, 0x0, - 0x0, 0x43, 0x0, 0x6, 0x97, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x1d, 0x13, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa5, 0x0, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x80, 0x0, 0x59, 0x0, 0x0, - 0x0, 0x0, 0x69, 0x0, 0x0, 0xb, 0x80, 0x0, - 0x0, 0x7, 0x60, 0x0, 0x0, 0x1, 0xeb, 0x30, - 0x2, 0x62, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x60, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4E4B "之" */ - 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, - 0x2, 0x76, 0x66, 0x66, 0x66, 0x8d, 0x10, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x1, 0xd8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7b, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0x90, 0x1b, 0x95, 0x32, 0x22, 0x34, 0x51, - 0x3, 0x0, 0x0, 0x5a, 0xce, 0xef, 0xff, 0x30, - - /* U+4E4E "乎" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x6c, 0x20, 0x0, - 0x0, 0x23, 0x68, 0xab, 0xa8, 0x62, 0x0, 0x4, - 0x54, 0x32, 0x4b, 0x0, 0x2, 0x0, 0x0, 0x3, - 0x30, 0x3, 0xb0, 0x3, 0xd1, 0x0, 0x0, 0xb, - 0x40, 0x3b, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x4e, - 0x3, 0xb0, 0x37, 0x0, 0x0, 0x0, 0x0, 0x60, - 0x3b, 0x5, 0x0, 0x14, 0x6, 0x76, 0x66, 0x68, - 0xd6, 0x66, 0x69, 0xa1, 0x0, 0x0, 0x0, 0x3b, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x41, 0x6b, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xaf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, - 0x0, - - /* U+4E4F "乏" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, - 0x0, 0x0, 0x24, 0x7a, 0xed, 0xc3, 0x0, 0x5, - 0x66, 0x78, 0x42, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x36, 0x66, - 0x66, 0x86, 0x6a, 0x70, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x8, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1b, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0x96, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0x81, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4a, 0x92, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5d, 0x0, 0x7a, 0x63, 0x22, 0x23, - 0x45, 0x10, 0x20, 0x0, 0x16, 0xac, 0xde, 0xff, - 0x40, - - /* U+4E57 "乗" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0xa7, 0x0, - 0x0, 0x45, 0x55, 0x67, 0xd9, 0x87, 0x66, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x46, 0x66, 0x66, 0xe6, 0x66, 0xab, 0x0, - 0x0, 0x11, 0x6, 0x0, 0xd0, 0x16, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0xd0, 0x3b, 0x2, 0x30, - 0x6, 0x76, 0x6d, 0x66, 0xe6, 0x7c, 0x68, 0x80, - 0x0, 0x0, 0x1c, 0x0, 0xd0, 0x3b, 0x0, 0x0, - 0x0, 0x46, 0x6d, 0x66, 0xe6, 0x7c, 0x9c, 0x10, - 0x0, 0x11, 0x0, 0x7b, 0xd6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xc1, 0xd1, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x5b, 0x10, 0xd0, 0x4c, 0x10, 0x0, - 0x0, 0x8, 0x70, 0x0, 0xd0, 0x5, 0xe9, 0x30, - 0x5, 0x61, 0x0, 0x0, 0xe0, 0x0, 0x2c, 0xc3, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+4E5D "九" */ - 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xc0, 0x0, 0x40, 0x0, 0x0, 0x5, 0x65, - 0x6d, 0x66, 0x6e, 0x20, 0x0, 0x0, 0x0, 0x2, - 0xa0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x48, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x8, 0x50, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0xd, - 0x0, 0x3, 0x0, 0x4, 0x90, 0x0, 0x0, 0xd0, - 0x0, 0x70, 0x1, 0x90, 0x0, 0x0, 0xe, 0x0, - 0xb, 0x2, 0x70, 0x0, 0x0, 0x0, 0xbd, 0xcc, - 0xd2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+4E5F "也" */ - 0x0, 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x7, 0x30, 0xc, 0x10, 0x0, 0x20, 0x0, 0x0, - 0xa3, 0x0, 0xc1, 0x1, 0x6f, 0x20, 0x0, 0xa, - 0x30, 0xc, 0x67, 0x61, 0xd0, 0x0, 0x0, 0xa4, - 0x57, 0xe2, 0x0, 0xd, 0x0, 0x0, 0x5c, 0x81, - 0xc, 0x10, 0x2, 0xb0, 0x0, 0x61, 0xa3, 0x0, - 0xc1, 0x0, 0x3a, 0x0, 0x0, 0xa, 0x30, 0xc, - 0x12, 0x18, 0x70, 0x0, 0x0, 0xa3, 0x0, 0xc1, - 0x4d, 0xe1, 0x0, 0x0, 0xa, 0x30, 0xd, 0x10, - 0x10, 0x5, 0x0, 0x0, 0xa3, 0x0, 0x50, 0x0, - 0x0, 0x70, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, - 0xa, 0x30, 0x0, 0x6e, 0xcc, 0xcc, 0xcc, 0xcc, - 0xe6, - - /* U+4E86 "了" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x3, 0x76, - 0x66, 0x66, 0x66, 0x7f, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x2b, 0x40, 0x0, 0x0, 0x0, 0x0, 0x47, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x94, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x5, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, - 0x0, 0x0, - - /* U+4E88 "予" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, - 0x6, 0x76, 0x66, 0x66, 0x7e, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3b, 0x50, 0x0, 0x0, 0x0, - 0x1, 0x76, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7e, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb5, 0x0, 0x5, 0x20, 0x47, 0x66, 0x66, - 0x6e, 0x66, 0x66, 0xfa, 0x0, 0x0, 0x0, 0x1, - 0xd0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x21, 0x3d, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x8f, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, - - /* U+4E89 "争" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0x76, 0x6b, 0x80, 0x0, 0x0, - 0x0, 0x1, 0xc2, 0x0, 0x3c, 0x20, 0x0, 0x0, - 0x0, 0xa, 0x10, 0x0, 0x90, 0x0, 0x20, 0x0, - 0x1, 0x75, 0x76, 0x6b, 0x76, 0x67, 0xd0, 0x0, - 0x4, 0x0, 0x0, 0xb, 0x20, 0x3, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x3, 0xa5, 0x60, - 0x7, 0x66, 0x66, 0x6d, 0x76, 0x67, 0xc6, 0x50, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x3, 0xa0, 0x0, - 0x0, 0x26, 0x66, 0x6d, 0x76, 0x67, 0xa0, 0x0, - 0x0, 0x1, 0x0, 0xb, 0x20, 0x1, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0xd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x17, 0xef, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, - - /* U+4E8B "事" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, 0x10, 0x5, - 0x66, 0x66, 0x6e, 0x66, 0x66, 0xae, 0x20, 0x10, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x66, 0x6e, 0x66, 0x6c, 0x40, 0x0, 0x0, 0xa2, - 0x0, 0xe0, 0x0, 0xc2, 0x0, 0x0, 0xa, 0x76, - 0x6e, 0x66, 0x6d, 0x20, 0x0, 0x0, 0x40, 0x0, - 0xe0, 0x0, 0x50, 0x0, 0x0, 0x27, 0x66, 0x6e, - 0x66, 0x6d, 0x50, 0x0, 0x0, 0x0, 0x0, 0xe0, - 0x0, 0xc2, 0x81, 0x27, 0x66, 0x66, 0x6e, 0x66, - 0x6d, 0x77, 0x40, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0xc2, 0x0, 0x0, 0x37, 0x66, 0x6e, 0x66, 0x6d, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x10, - 0x0, 0x0, 0x0, 0x28, 0xed, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, - - /* U+4E8C "二" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, - 0x0, 0x27, 0x66, 0x66, 0x66, 0x67, 0xa4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x40, - 0x7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, - - /* U+4E94 "五" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x76, 0x66, 0x68, 0x66, 0x66, 0xab, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x85, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x37, 0x66, 0xc8, 0x66, 0x6e, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xc0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x90, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x70, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x40, 0x0, 0x1c, 0x6, 0x40, - 0x7, 0x66, 0x68, 0x66, 0x66, 0x68, 0x68, 0x80, - - /* U+4E9B "些" */ - 0x0, 0x0, 0x8, 0x0, 0x8, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x50, 0xd, 0x0, 0xd, 0x0, 0x2b, 0x10, - 0x0, 0xd2, 0xe, 0x6c, 0x2d, 0x2, 0xc5, 0x0, - 0x0, 0xd0, 0xd, 0x0, 0xd, 0x47, 0x0, 0x0, - 0x0, 0xd0, 0xd, 0x0, 0xd, 0x20, 0x0, 0x40, - 0x0, 0xd0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x70, - 0x0, 0xd0, 0xd, 0x55, 0x2d, 0x20, 0x5, 0xc0, - 0xa, 0xe9, 0x74, 0x0, 0x4, 0xaa, 0xaa, 0x50, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, - 0x0, 0x7, 0x66, 0x66, 0x66, 0x6a, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x20, - 0x6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x78, 0x60, - - /* U+4EA1 "亡" */ - 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x10, - 0x5, 0x66, 0x66, 0x66, 0x86, 0x66, 0x6b, 0xe2, - 0x1, 0x11, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x4, 0xe6, 0x66, 0x66, 0x66, 0xad, 0x20, - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4EA4 "交" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2a, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x2, 0x0, - 0x5, 0x66, 0x66, 0x66, 0x96, 0x66, 0x6f, 0x80, - 0x1, 0x0, 0x5, 0x0, 0x2, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x6d, 0x20, 0x0, 0x78, 0x10, 0x0, - 0x0, 0x5, 0xb1, 0x0, 0x0, 0x15, 0xe4, 0x0, - 0x0, 0x67, 0x5, 0x0, 0x5, 0xd1, 0x7b, 0x0, - 0x4, 0x20, 0x5, 0x20, 0xa, 0x60, 0x1, 0x0, - 0x0, 0x0, 0x0, 0x90, 0x1d, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x65, 0xa5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7a, 0xc5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3a, 0x50, 0x1a, 0xc6, 0x20, 0x0, - 0x0, 0x47, 0x60, 0x0, 0x0, 0x3a, 0xff, 0xb1, - 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, - - /* U+4EA6 "亦" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x19, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0x20, 0x0, 0x10, 0x4, 0x66, - 0x66, 0x66, 0xd6, 0x66, 0x6d, 0xb0, 0x11, 0x0, - 0xe, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe0, 0x1, 0xc0, 0x0, 0x0, 0x0, 0xa6, 0xe, - 0x0, 0x1c, 0x21, 0x0, 0x0, 0xe, 0x10, 0xe0, - 0x1, 0xc0, 0x91, 0x0, 0x4, 0x80, 0x2c, 0x0, - 0x1c, 0x2, 0xc1, 0x0, 0xa1, 0x4, 0x90, 0x1, - 0xc0, 0x9, 0xa0, 0x26, 0x0, 0xa5, 0x0, 0x1c, - 0x0, 0x2f, 0x4, 0x0, 0x1c, 0x0, 0x1, 0xc0, - 0x0, 0x50, 0x0, 0xa, 0x30, 0x0, 0x1c, 0x0, - 0x0, 0x0, 0x8, 0x30, 0x3, 0x79, 0xc0, 0x0, - 0x0, 0x17, 0x10, 0x0, 0x2, 0xd5, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4EAC "京" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x10, 0x0, 0x50, 0x5, 0x76, - 0x66, 0x66, 0x86, 0x66, 0x6b, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, - 0x66, 0x66, 0x6b, 0x40, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0x0, 0xf6, 0x66, 0xc6, - 0x6d, 0x10, 0x0, 0x0, 0x2, 0x20, 0x1d, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0x31, 0xd0, 0x38, - 0x0, 0x0, 0x0, 0x2c, 0x30, 0x1d, 0x0, 0x5c, - 0x10, 0x0, 0x3a, 0x10, 0x2, 0xd0, 0x0, 0x9b, - 0x0, 0x45, 0x0, 0x29, 0xeb, 0x0, 0x1, 0x80, - 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, - - /* U+4EBA "人" */ - 0x0, 0x0, 0x0, 0x1b, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5c, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6a, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa7, 0x64, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe3, 0x1a, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xd0, 0xb, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x60, 0x4, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x3c, 0x0, 0x0, 0xb8, 0x0, 0x0, - 0x0, 0x1, 0xc2, 0x0, 0x0, 0x1e, 0x70, 0x0, - 0x0, 0x2b, 0x20, 0x0, 0x0, 0x3, 0xfc, 0x50, - 0x4, 0x70, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x61, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4EC0 "什" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x40, 0x0, 0xb3, 0x0, 0x0, 0x0, - 0x2, 0xf1, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, - 0x79, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xd, - 0x20, 0x0, 0xc, 0x10, 0x0, 0x0, 0x4, 0xf3, - 0x0, 0x0, 0xc1, 0x0, 0x20, 0x0, 0xac, 0x47, - 0x66, 0x6d, 0x66, 0x6d, 0x60, 0x37, 0xa3, 0x0, - 0x0, 0xc1, 0x0, 0x0, 0x8, 0xa, 0x30, 0x0, - 0xc, 0x10, 0x0, 0x4, 0x10, 0xa3, 0x0, 0x0, - 0xc1, 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0xc, - 0x10, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0xc1, - 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0xc, 0x10, - 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0xc1, 0x0, - 0x0, 0x0, 0xa, 0x40, 0x0, 0xd, 0x10, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x50, 0x0, 0x0, - - /* U+4ECA "今" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6c, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xe2, 0x54, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x60, 0x9, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x79, 0x10, 0x0, 0xc6, 0x0, 0x0, - 0x0, 0x6, 0x90, 0x3a, 0x10, 0xb, 0xc4, 0x0, - 0x0, 0x76, 0x0, 0x6, 0xc0, 0x0, 0x7f, 0xc1, - 0x16, 0x20, 0x0, 0x0, 0x60, 0x0, 0x2, 0x10, - 0x0, 0x5, 0x66, 0x66, 0x66, 0x6a, 0x50, 0x0, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x2e, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, - - /* U+4ECB "介" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8b, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0x16, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x60, 0xa, 0x10, 0x0, 0x0, 0x0, 0x6, - 0xa0, 0x0, 0x1c, 0x30, 0x0, 0x0, 0x5, 0x82, - 0x0, 0x3, 0x2d, 0xa3, 0x0, 0x6, 0x50, 0xb6, - 0x0, 0xb6, 0x1a, 0xf6, 0x15, 0x10, 0xb, 0x20, - 0xb, 0x30, 0x1, 0x0, 0x0, 0x0, 0xb2, 0x0, - 0xa3, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0xa, - 0x30, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0xa3, - 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, 0xa, 0x30, - 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0xa3, 0x0, - 0x0, 0x0, 0x57, 0x0, 0x0, 0xa, 0x40, 0x0, - 0x0, 0x22, 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, - - /* U+4ECD "仍" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xc2, 0x76, 0x66, 0x66, 0xc2, 0x0, - 0x0, 0x9, 0x50, 0x13, 0xa0, 0x1, 0xd0, 0x0, - 0x0, 0xc, 0x0, 0x4, 0x90, 0x5, 0x90, 0x0, - 0x0, 0x7e, 0x30, 0x4, 0x90, 0x8, 0x50, 0x0, - 0x0, 0xac, 0x10, 0x5, 0x80, 0xc, 0x21, 0x20, - 0x7, 0x2c, 0x10, 0x6, 0x70, 0x1c, 0x69, 0xb0, - 0x25, 0xc, 0x10, 0x8, 0x50, 0x0, 0x7, 0x70, - 0x0, 0xc, 0x10, 0xa, 0x20, 0x0, 0x8, 0x50, - 0x0, 0xc, 0x10, 0xd, 0x0, 0x0, 0xa, 0x30, - 0x0, 0xc, 0x10, 0x48, 0x0, 0x0, 0xd, 0x10, - 0x0, 0xc, 0x10, 0xa1, 0x0, 0x0, 0xe, 0x0, - 0x0, 0xc, 0x14, 0x60, 0x0, 0x43, 0x8b, 0x0, - 0x0, 0xd, 0x46, 0x0, 0x0, 0x1a, 0xe3, 0x0, - 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4ED5 "仕" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x50, 0x0, 0x93, 0x0, 0x0, 0x0, - 0x1, 0xf2, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, - 0x6b, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0xc, - 0x30, 0x0, 0xd, 0x10, 0x0, 0x0, 0x2, 0xf3, - 0x0, 0x0, 0xd1, 0x0, 0x30, 0x0, 0xae, 0x47, - 0x66, 0x6e, 0x66, 0x6b, 0x60, 0x28, 0xb3, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0x8, 0xb, 0x30, 0x0, - 0xd, 0x10, 0x0, 0x3, 0x10, 0xb3, 0x0, 0x0, - 0xd1, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0xd, - 0x10, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xd1, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0xd, 0x10, - 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xd1, 0x4, - 0x80, 0x0, 0xb, 0x43, 0x76, 0x66, 0x66, 0x66, - 0x10, 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4ED6 "他" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xe2, 0x0, 0xc, 0x30, 0x0, 0x0, - 0x0, 0x5, 0xa0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0x0, 0xd3, 0xd, 0x0, 0x26, 0x0, - 0x0, 0x7d, 0x20, 0xd0, 0xd, 0x66, 0x7b, 0x0, - 0x0, 0xbd, 0x24, 0xe6, 0x5d, 0x0, 0x3a, 0x0, - 0x6, 0x4c, 0x22, 0xd0, 0xd, 0x0, 0x3a, 0x0, - 0x7, 0xc, 0x10, 0xd0, 0xd, 0x0, 0x49, 0x0, - 0x20, 0xc, 0x10, 0xd0, 0xd, 0x2, 0x88, 0x0, - 0x0, 0xc, 0x10, 0xd0, 0xd, 0x5, 0xe3, 0x0, - 0x0, 0xc, 0x10, 0xd0, 0xd, 0x0, 0x0, 0x30, - 0x0, 0xc, 0x10, 0xd0, 0x4, 0x0, 0x0, 0x60, - 0x0, 0xc, 0x10, 0xc0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0xd, 0x10, 0x7c, 0xbb, 0xbb, 0xbc, 0xb1, - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4ED8 "付" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x70, 0x0, 0x0, 0xa3, 0x0, 0x0, - 0x0, 0xe2, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, - 0x4b, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xa, - 0x30, 0x0, 0x0, 0xd, 0x23, 0x0, 0x1, 0xf3, - 0x27, 0x66, 0x66, 0xe7, 0x96, 0x0, 0x9d, 0x30, - 0x0, 0x0, 0xd, 0x20, 0x0, 0x28, 0xa3, 0x1, - 0x20, 0x0, 0xd2, 0x0, 0x8, 0xa, 0x30, 0x9, - 0x30, 0xd, 0x20, 0x3, 0x10, 0xa3, 0x0, 0x2f, - 0x10, 0xd2, 0x0, 0x0, 0xa, 0x30, 0x0, 0xb1, - 0xd, 0x20, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, - 0xd2, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0xd, - 0x20, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0xd2, - 0x0, 0x0, 0xb, 0x40, 0x0, 0x16, 0xdf, 0x0, - 0x0, 0x0, 0x50, 0x0, 0x0, 0x3, 0x30, 0x0, - - /* U+4EE3 "代" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x10, 0x15, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7b, 0x0, 0x1e, 0x13, 0x92, 0x0, - 0x0, 0x0, 0xd2, 0x0, 0xd, 0x0, 0x4f, 0x20, - 0x0, 0x3, 0xa0, 0x0, 0xe, 0x0, 0x6, 0x10, - 0x0, 0xb, 0xa0, 0x0, 0xd, 0x0, 0x7, 0x50, - 0x0, 0x3c, 0xc1, 0x65, 0x6d, 0x76, 0x54, 0x30, - 0x0, 0xa3, 0xb0, 0x0, 0xa, 0x30, 0x0, 0x0, - 0x6, 0x32, 0xb0, 0x0, 0x7, 0x60, 0x0, 0x0, - 0x4, 0x2, 0xb0, 0x0, 0x4, 0x90, 0x0, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x0, 0xa6, 0x0, 0x11, - 0x0, 0x2, 0xb0, 0x0, 0x0, 0x2e, 0x30, 0x60, - 0x0, 0x2, 0xb0, 0x0, 0x0, 0x6, 0xe3, 0xb0, - 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, 0x5e, 0xf1, - 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x1, 0x72, - - /* U+4EE4 "令" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb6, 0x27, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xb0, 0x8, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x3d, 0x32, 0x0, 0xc4, 0x0, 0x0, - 0x0, 0x2, 0xc2, 0xa, 0x70, 0x1d, 0x70, 0x0, - 0x0, 0x39, 0x10, 0x1, 0xf2, 0x1, 0xce, 0x81, - 0x5, 0x40, 0x0, 0x0, 0x40, 0x7, 0x16, 0x30, - 0x0, 0x4, 0x76, 0x66, 0x66, 0x9f, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, - 0x0, 0x0, 0x11, 0x0, 0x8, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x94, 0x44, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1a, 0xd3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, - - /* U+4EE5 "以" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x60, 0x1, 0xe2, - 0x1, 0x0, 0x0, 0x4d, 0x0, 0xe, 0x0, 0x57, - 0x0, 0x4, 0xb0, 0x0, 0xe0, 0x0, 0xc8, 0x0, - 0x4b, 0x0, 0xe, 0x0, 0x5, 0xc0, 0x5, 0xa0, - 0x0, 0xe0, 0x0, 0x2, 0x0, 0x59, 0x0, 0xe, - 0x0, 0x0, 0x0, 0x6, 0x80, 0x0, 0xe0, 0x0, - 0x1, 0x0, 0x96, 0x0, 0xe, 0x0, 0x37, 0x0, - 0xd, 0x30, 0x0, 0xe0, 0x87, 0x0, 0x4, 0xf1, - 0x0, 0x1f, 0xe5, 0x0, 0x0, 0xc4, 0xa4, 0x2, - 0xe4, 0x0, 0x1, 0xb6, 0x1, 0xe5, 0x1, 0x0, - 0x4, 0xb3, 0x0, 0x6, 0xc0, 0x2, 0x67, 0x40, - 0x0, 0x0, 0x5, 0x2, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4EEE "仮" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x5a, 0x0, - 0x0, 0x0, 0xe0, 0x36, 0x56, 0x89, 0x86, 0x20, - 0x0, 0x6, 0x80, 0x49, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x49, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0x10, 0x4b, 0x66, 0x66, 0x7a, 0x0, - 0x0, 0xad, 0x0, 0x48, 0x50, 0x0, 0x88, 0x0, - 0x5, 0x3d, 0x0, 0x58, 0x60, 0x0, 0xb1, 0x0, - 0x14, 0xd, 0x0, 0x67, 0x34, 0x1, 0xc0, 0x0, - 0x0, 0xd, 0x0, 0x85, 0x9, 0x7, 0x60, 0x0, - 0x0, 0xd, 0x0, 0xa2, 0x8, 0x2c, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0x1, 0xe7, 0x0, 0x0, - 0x0, 0xd, 0x3, 0x70, 0x4, 0xdb, 0x0, 0x0, - 0x0, 0xd, 0x7, 0x0, 0x69, 0x8, 0xc3, 0x0, - 0x0, 0xd, 0x34, 0x38, 0x40, 0x0, 0x5f, 0xa0, - 0x0, 0x2, 0x12, 0x30, 0x0, 0x0, 0x1, 0x0, - - /* U+4EF6 "件" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa6, 0x0, 0x1, 0xd1, 0x0, 0x0, - 0x0, 0x1, 0xf2, 0x6, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x7, 0x90, 0x2e, 0x10, 0xd0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x59, 0x0, 0xd0, 0x5, 0x0, - 0x0, 0x5f, 0x40, 0x97, 0x66, 0xe6, 0x68, 0x30, - 0x0, 0xad, 0x10, 0x90, 0x0, 0xd0, 0x0, 0x0, - 0x6, 0x3c, 0x14, 0x20, 0x0, 0xd0, 0x0, 0x0, - 0x25, 0xc, 0x12, 0x0, 0x0, 0xd0, 0x1, 0x50, - 0x10, 0xc, 0x15, 0x76, 0x66, 0xe6, 0x66, 0x71, - 0x0, 0xc, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x1, 0xe0, 0x0, 0x0, - 0x0, 0x5, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, - - /* U+4EFB "任" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe2, 0x0, 0x0, 0x27, 0xd5, 0x0, 0x0, - 0x59, 0x25, 0x67, 0xd8, 0x53, 0x10, 0x0, 0xc, - 0x20, 0x0, 0xc, 0x10, 0x0, 0x0, 0x3, 0xe1, - 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xae, 0x20, - 0x0, 0xc, 0x10, 0x0, 0x0, 0x46, 0xc1, 0x0, - 0x0, 0xc1, 0x0, 0x40, 0x7, 0xc, 0x17, 0x66, - 0x6d, 0x76, 0x6a, 0x43, 0x0, 0xc1, 0x0, 0x0, - 0xc1, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0xc, - 0x10, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xc1, - 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0xc, 0x10, - 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, - 0x40, 0x0, 0xd, 0x27, 0x66, 0x69, 0x66, 0x69, - 0x60, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4EFD "份" */ - 0x0, 0x0, 0x32, 0x0, 0x0, 0x43, 0x0, 0x0, - 0x0, 0x0, 0xb9, 0x0, 0xd3, 0x24, 0x0, 0x0, - 0x0, 0x1, 0xe0, 0x4, 0xb0, 0x8, 0x0, 0x0, - 0x0, 0x8, 0x60, 0xb, 0x30, 0x8, 0x10, 0x0, - 0x0, 0x1d, 0x0, 0x3a, 0x0, 0x2, 0xb0, 0x0, - 0x0, 0x8f, 0x30, 0xa1, 0x0, 0x0, 0x8b, 0x10, - 0x3, 0x6d, 0x16, 0x30, 0x0, 0x0, 0x4a, 0xc1, - 0x16, 0xd, 0x43, 0x16, 0xe6, 0x67, 0xd0, 0x0, - 0x10, 0xd, 0x10, 0x0, 0xe0, 0x2, 0xa0, 0x0, - 0x0, 0xd, 0x10, 0x1, 0xd0, 0x3, 0xa0, 0x0, - 0x0, 0xd, 0x10, 0x5, 0x90, 0x3, 0x90, 0x0, - 0x0, 0xd, 0x10, 0xb, 0x20, 0x4, 0x80, 0x0, - 0x0, 0xd, 0x10, 0x57, 0x1, 0x7, 0x70, 0x0, - 0x0, 0xd, 0x15, 0x60, 0x3, 0xcf, 0x20, 0x0, - 0x0, 0x6, 0x41, 0x0, 0x0, 0x1, 0x0, 0x0, - - /* U+4F01 "企" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb8, 0x17, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xb0, 0x4, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0x0, 0x20, 0x7a, 0x0, 0x0, - 0x0, 0x4, 0xa0, 0x1, 0xe1, 0x6, 0xe6, 0x10, - 0x0, 0x66, 0x0, 0x1, 0xd0, 0x0, 0x4e, 0xa1, - 0x15, 0x10, 0x85, 0x1, 0xd0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0xa4, 0x1, 0xe6, 0x6c, 0x70, 0x0, - 0x0, 0x0, 0xa3, 0x1, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa3, 0x1, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa3, 0x1, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa3, 0x1, 0xd0, 0x0, 0x7, 0x20, - 0x7, 0x66, 0x76, 0x66, 0x86, 0x66, 0x69, 0x70, - - /* U+4F0A "伊" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xb3, 0x66, 0x66, 0x66, 0xc3, 0x0, - 0x0, 0xb, 0x30, 0x10, 0xe0, 0x0, 0xe0, 0x0, - 0x0, 0x2b, 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, - 0x0, 0x9e, 0x30, 0x0, 0xe0, 0x0, 0xe0, 0x30, - 0x1, 0x9d, 0x38, 0x66, 0xe6, 0x66, 0xe7, 0x90, - 0x7, 0xd, 0x10, 0x0, 0xe0, 0x0, 0xe0, 0x0, - 0x22, 0xd, 0x10, 0x0, 0xd0, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0xd0, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0x15, 0x78, 0xc6, 0x66, 0xe0, 0x0, - 0x0, 0xd, 0x10, 0x7, 0x60, 0x0, 0x20, 0x0, - 0x0, 0xd, 0x10, 0xc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x84, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x16, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4F11 "休" */ - 0x0, 0x0, 0x84, 0x0, 0xb, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xe1, 0x0, 0xe, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x80, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0xd, 0x0, 0x8, 0x0, - 0x0, 0x4d, 0x37, 0x66, 0xcf, 0x96, 0x66, 0x30, - 0x0, 0xbe, 0x20, 0x0, 0xee, 0x60, 0x0, 0x0, - 0x5, 0x5c, 0x10, 0x4, 0xad, 0x35, 0x0, 0x0, - 0x7, 0xc, 0x10, 0xb, 0x2d, 0xa, 0x0, 0x0, - 0x20, 0xc, 0x10, 0x49, 0xd, 0x7, 0x60, 0x0, - 0x0, 0xc, 0x10, 0xb1, 0xd, 0x0, 0xe3, 0x0, - 0x0, 0xc, 0x17, 0x30, 0xd, 0x0, 0x5e, 0x50, - 0x0, 0xc, 0x44, 0x0, 0xd, 0x0, 0x7, 0x50, - 0x0, 0xc, 0x20, 0x0, 0xe, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0xe, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, - - /* U+4F1A "会" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7d, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xd2, 0x63, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x50, 0xa, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x96, 0x0, 0x0, 0xa9, 0x10, 0x0, - 0x0, 0x8, 0x50, 0x0, 0x1, 0x78, 0xfa, 0x61, - 0x0, 0x73, 0x66, 0x66, 0x66, 0x61, 0x2a, 0x50, - 0x15, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x66, 0x66, 0x66, 0x66, 0x66, 0x9d, 0x10, - 0x0, 0x20, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xc0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x10, 0x2, 0xa2, 0x0, 0x0, - 0x0, 0x2, 0xa1, 0x0, 0x0, 0x2e, 0x50, 0x0, - 0x0, 0xe, 0xcc, 0xba, 0x87, 0x67, 0xf0, 0x0, - 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x60, 0x0, - - /* U+4F1D "伝" */ - 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd8, 0x0, 0x0, 0x0, 0x60, 0x0, - 0x0, 0x2, 0xd0, 0x18, 0x66, 0x66, 0x62, 0x0, - 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xae, 0x40, 0x0, 0x0, 0x0, 0x8, 0x30, - 0x6, 0x4c, 0x14, 0x76, 0x6e, 0x76, 0x66, 0x50, - 0x25, 0xc, 0x10, 0x0, 0x3e, 0x20, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x86, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0xc0, 0x2, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x7, 0x50, 0x2, 0x70, 0x0, - 0x0, 0xc, 0x10, 0x29, 0x0, 0x0, 0x96, 0x0, - 0x0, 0xc, 0x12, 0xc5, 0x55, 0x66, 0x7f, 0x0, - 0x0, 0xc, 0x21, 0xd9, 0x53, 0x10, 0xe, 0x10, - 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+4F38 "伸" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x10, 0x0, 0x3a, 0x0, 0x0, 0x0, - 0x4, 0xc0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, - 0xa4, 0x2, 0x0, 0x2b, 0x0, 0x50, 0x0, 0x1c, - 0x0, 0xe6, 0x67, 0xd6, 0x6e, 0x20, 0x9, 0xf1, - 0xe, 0x0, 0x2b, 0x0, 0xe0, 0x1, 0x9e, 0x0, - 0xe0, 0x2, 0xb0, 0xe, 0x0, 0x81, 0xe0, 0xe, - 0x66, 0x7d, 0x66, 0xe0, 0x22, 0xe, 0x0, 0xe0, - 0x2, 0xb0, 0xe, 0x0, 0x0, 0xe0, 0xe, 0x0, - 0x2b, 0x0, 0xe0, 0x0, 0xe, 0x0, 0xe6, 0x67, - 0xd6, 0x6e, 0x0, 0x0, 0xe0, 0x5, 0x0, 0x2b, - 0x0, 0x50, 0x0, 0xe, 0x0, 0x0, 0x2, 0xb0, - 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x2b, 0x0, - 0x0, 0x0, 0xf, 0x0, 0x0, 0x3, 0xc0, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x14, 0x0, 0x0, - - /* U+4F3C "似" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xd2, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0xa8, 0x0, - 0x0, 0xc, 0x20, 0x91, 0x40, 0x0, 0xa5, 0x0, - 0x0, 0x3a, 0x0, 0xd0, 0x1b, 0x0, 0xa4, 0x0, - 0x0, 0x9e, 0x20, 0xd0, 0xb, 0x60, 0xb4, 0x0, - 0x2, 0x9e, 0x0, 0xd0, 0x6, 0x30, 0xc3, 0x0, - 0x8, 0xe, 0x0, 0xd0, 0x0, 0x0, 0xe1, 0x0, - 0x22, 0xe, 0x0, 0xd0, 0x0, 0x1, 0xf0, 0x0, - 0x0, 0xe, 0x0, 0xd0, 0x0, 0x4, 0xc0, 0x0, - 0x0, 0xe, 0x0, 0xd0, 0x46, 0x9, 0x70, 0x0, - 0x0, 0xe, 0x0, 0xda, 0x50, 0x2e, 0x83, 0x0, - 0x0, 0xe, 0x0, 0xe5, 0x0, 0xc4, 0xc, 0x50, - 0x0, 0xe, 0x0, 0x10, 0x1b, 0x30, 0x4, 0xe0, - 0x0, 0xe, 0x0, 0x16, 0x60, 0x0, 0x0, 0x70, - 0x0, 0x5, 0x2, 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+4F46 "但" */ - 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xe1, 0x86, 0x66, 0x66, 0x6c, 0x10, - 0x0, 0x8, 0x70, 0xb3, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x10, 0xa3, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x6d, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xce, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, - 0x7, 0x4d, 0x0, 0xa8, 0x66, 0x66, 0x6d, 0x0, - 0x15, 0xd, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xb8, 0x66, 0x66, 0x6d, 0x0, - 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, - 0x0, 0xe, 0x27, 0x66, 0x66, 0x66, 0x66, 0x93, - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4F4D "位" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd4, 0x0, 0x62, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xd0, 0x0, 0x1e, 0x10, 0x0, 0x0, - 0x0, 0x8, 0x60, 0x0, 0xc, 0x20, 0x1, 0x0, - 0x0, 0xd, 0x4, 0x66, 0x66, 0x66, 0x7f, 0x40, - 0x0, 0x4e, 0x21, 0x10, 0x0, 0x1, 0x10, 0x0, - 0x0, 0xbe, 0x0, 0x20, 0x0, 0x4, 0xe1, 0x0, - 0x4, 0x5d, 0x0, 0x25, 0x0, 0x7, 0x90, 0x0, - 0x7, 0xd, 0x0, 0xc, 0x0, 0xa, 0x30, 0x0, - 0x10, 0xd, 0x0, 0xa, 0x60, 0xc, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x7, 0xa0, 0x19, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x5, 0x90, 0x54, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x1, 0x10, 0x80, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x70, 0x3, 0x60, - 0x0, 0xd, 0x17, 0x66, 0x66, 0x66, 0x66, 0x61, - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4F4E "低" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x40, 0x0, - 0x0, 0x3, 0xd0, 0x0, 0x0, 0x5c, 0xd6, 0x0, - 0x0, 0xa, 0x40, 0x96, 0x68, 0xd1, 0x0, 0x0, - 0x0, 0x1c, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x9e, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, - 0x2, 0x9d, 0x0, 0xd0, 0x0, 0xd0, 0x1, 0x0, - 0x8, 0xd, 0x0, 0xd6, 0x66, 0xe6, 0x6a, 0x60, - 0x11, 0xd, 0x0, 0xd0, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0x0, 0x85, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0x0, 0x4a, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0x2, 0xd, 0x10, 0x40, - 0x0, 0xd, 0x0, 0xd3, 0x83, 0x6, 0xb0, 0x80, - 0x0, 0xd, 0x0, 0xfb, 0x75, 0x0, 0xbb, 0xb0, - 0x0, 0xe, 0x0, 0x40, 0xc, 0x30, 0x8, 0xd0, - 0x0, 0x4, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - - /* U+4F4F "住" */ - 0x0, 0x0, 0x57, 0x0, 0x72, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x70, 0x1, 0xe4, 0x0, 0x0, 0x0, - 0x2, 0xd0, 0x0, 0x8, 0x50, 0x1, 0x0, 0x0, - 0xa4, 0x36, 0x66, 0x66, 0x67, 0xe3, 0x0, 0x3e, - 0x10, 0x10, 0xe, 0x0, 0x0, 0x0, 0xa, 0xe2, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x6, 0x4c, 0x10, - 0x0, 0xe, 0x0, 0x0, 0x2, 0x50, 0xc1, 0x0, - 0x0, 0xe0, 0x6, 0x10, 0x0, 0xc, 0x11, 0x86, - 0x6e, 0x66, 0x75, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0xe0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0xe, - 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0xe, 0x0, - 0x4, 0x0, 0x0, 0xd3, 0x86, 0x66, 0xa6, 0x66, - 0xa5, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+4F53 "体" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc2, 0x0, 0xb, 0x30, 0x0, 0x0, - 0x0, 0x3, 0xc0, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x9, 0x50, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x1c, 0x4, 0x66, 0x6d, 0x66, 0x6d, 0x60, - 0x0, 0x7c, 0x21, 0x10, 0xcf, 0x60, 0x0, 0x0, - 0x0, 0xad, 0x0, 0x2, 0xbc, 0x43, 0x0, 0x0, - 0x7, 0x1d, 0x0, 0xa, 0x4c, 0x18, 0x0, 0x0, - 0x23, 0xd, 0x0, 0x2a, 0xc, 0x17, 0x40, 0x0, - 0x0, 0xd, 0x0, 0xa1, 0xc, 0x10, 0xd1, 0x0, - 0x0, 0xd, 0x6, 0x40, 0xc, 0x10, 0x7d, 0x20, - 0x0, 0xd, 0x35, 0x46, 0x6d, 0x69, 0xab, 0x90, - 0x0, 0xd, 0x10, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, - 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - - /* U+4F55 "何" */ - 0x0, 0x0, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x3, 0x50, - 0x0, 0x5, 0x92, 0x76, 0x66, 0x66, 0xe6, 0x50, - 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x3f, 0x20, 0x30, 0x0, 0x40, 0xd0, 0x0, - 0x0, 0xae, 0x0, 0xe6, 0x68, 0xc0, 0xd0, 0x0, - 0x4, 0x5d, 0x0, 0xd0, 0x3, 0xa0, 0xd0, 0x0, - 0x5, 0xd, 0x0, 0xd0, 0x3, 0xa0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0x3, 0xa0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xe6, 0x68, 0xb0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x80, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x5b, 0xe0, 0x0, - 0x0, 0x5, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, - - /* U+4F59 "余" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8b, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xd1, 0x46, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x20, 0x6, 0x80, 0x0, 0x0, - 0x0, 0x1, 0xc3, 0x0, 0x0, 0x7c, 0x30, 0x0, - 0x0, 0x1a, 0x76, 0x66, 0x66, 0xd8, 0xfc, 0x60, - 0x5, 0x60, 0x10, 0xc, 0x10, 0x0, 0x2a, 0x30, - 0x21, 0x0, 0x0, 0xc, 0x10, 0x2, 0x50, 0x0, - 0x0, 0x67, 0x66, 0x6d, 0x66, 0x67, 0x70, 0x0, - 0x0, 0x0, 0x31, 0xc, 0x12, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xe7, 0xc, 0x11, 0x95, 0x0, 0x0, - 0x0, 0xb, 0x50, 0xc, 0x10, 0xa, 0xb1, 0x0, - 0x0, 0xa4, 0x0, 0xd, 0x10, 0x0, 0xbb, 0x0, - 0x17, 0x10, 0x17, 0xcf, 0x0, 0x0, 0x17, 0x0, - 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, - - /* U+4F5C "作" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb5, 0x0, 0xb5, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xe1, 0x2, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x80, 0x9, 0x50, 0x0, 0x5, 0x30, - 0x0, 0xc, 0x10, 0x1c, 0x7c, 0x66, 0x66, 0x60, - 0x0, 0x4d, 0x20, 0x83, 0x2b, 0x0, 0x0, 0x0, - 0x0, 0xbd, 0x13, 0x60, 0x2b, 0x0, 0x0, 0x0, - 0x7, 0x3c, 0x15, 0x0, 0x2d, 0x66, 0x7d, 0x10, - 0x14, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x4, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x2d, 0x66, 0x69, 0x60, - 0x0, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x2c, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, - - /* U+4F60 "你" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa8, 0x0, 0xa4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf3, 0x1, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x90, 0x7, 0x80, 0x0, 0x1, 0x0, - 0x0, 0xc, 0x10, 0xd, 0x76, 0x66, 0x6b, 0xb0, - 0x0, 0x5e, 0x20, 0x66, 0x1, 0x30, 0xb, 0x10, - 0x0, 0xbd, 0x11, 0x80, 0x3, 0xc0, 0x21, 0x0, - 0x7, 0x2c, 0x14, 0x3, 0x3, 0xb0, 0x0, 0x0, - 0x23, 0xc, 0x10, 0xd, 0x53, 0xb0, 0x60, 0x0, - 0x0, 0xc, 0x10, 0x3b, 0x3, 0xb0, 0x48, 0x0, - 0x0, 0xc, 0x10, 0x93, 0x3, 0xb0, 0xb, 0x60, - 0x0, 0xc, 0x12, 0x80, 0x3, 0xb0, 0x3, 0xe0, - 0x0, 0xc, 0x17, 0x0, 0x3, 0xb0, 0x0, 0xb0, - 0x0, 0xc, 0x31, 0x1, 0x4, 0xa0, 0x0, 0x0, - 0x0, 0xd, 0x20, 0x2, 0x9f, 0x80, 0x0, 0x0, - 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - - /* U+4F7F "使" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x30, 0x0, 0xb3, 0x0, 0x0, 0x0, - 0x3, 0xd0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, - 0x96, 0x46, 0x66, 0xd6, 0x66, 0xa8, 0x0, 0xd, - 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x7, 0xe2, - 0x8, 0x66, 0xd6, 0x66, 0x90, 0x0, 0xad, 0x0, - 0xd0, 0xc, 0x0, 0x1b, 0x0, 0x71, 0xd0, 0xd, - 0x0, 0xc0, 0x1, 0xb0, 0x23, 0xd, 0x0, 0xd6, - 0x6e, 0x66, 0x6b, 0x0, 0x0, 0xd0, 0x7, 0x10, - 0xc0, 0x1, 0x60, 0x0, 0xd, 0x0, 0x6, 0xc, - 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x39, 0x90, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0xc9, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x86, 0x6c, 0x72, - 0x0, 0x0, 0xd, 0x4, 0x72, 0x0, 0x18, 0xee, - 0x80, 0x0, 0x32, 0x10, 0x0, 0x0, 0x0, 0x20, - - /* U+4F86 "來" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa4, 0x0, 0x5, 0x40, 0x2, 0x76, - 0x76, 0x6c, 0x86, 0x67, 0x66, 0x0, 0x0, 0x3e, - 0x10, 0xa4, 0x2, 0xe1, 0x0, 0x0, 0x7, 0x80, - 0xa, 0x40, 0x59, 0x0, 0x0, 0x0, 0xc7, 0x70, - 0xa4, 0xa, 0x79, 0x10, 0x0, 0x84, 0xb, 0x4f, - 0x93, 0x70, 0x5a, 0x0, 0x43, 0x0, 0x1b, 0xe8, - 0x80, 0x0, 0x20, 0x0, 0x0, 0x8, 0x9a, 0x48, - 0x40, 0x0, 0x0, 0x0, 0x6, 0xa0, 0xa4, 0xb, - 0x50, 0x0, 0x0, 0x8, 0x80, 0xa, 0x40, 0xc, - 0xa2, 0x0, 0x18, 0x30, 0x0, 0xa4, 0x0, 0x9, - 0xf8, 0x14, 0x0, 0x0, 0xb, 0x50, 0x0, 0x2, - 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, - - /* U+4F8B "例" */ - 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, 0x6, 0x30, - 0x0, 0x79, 0x0, 0x0, 0x42, 0x0, 0xa3, 0x0, - 0xc, 0x36, 0x7e, 0x66, 0x40, 0xa, 0x30, 0x1, - 0xc0, 0x5, 0x80, 0x0, 0xc2, 0xa3, 0x0, 0x8d, - 0x10, 0x93, 0x6, 0xd, 0xa, 0x30, 0xb, 0xd0, - 0xc, 0x66, 0xe2, 0xd0, 0xa3, 0x6, 0x2d, 0x4, - 0x60, 0x3b, 0xd, 0xa, 0x30, 0x50, 0xd0, 0x88, - 0x17, 0x60, 0xd0, 0xa3, 0x0, 0xd, 0x43, 0x48, - 0xd1, 0xd, 0xa, 0x30, 0x0, 0xd0, 0x0, 0x5a, - 0x0, 0xd0, 0xa3, 0x0, 0xd, 0x0, 0xb, 0x10, - 0xb, 0xa, 0x30, 0x0, 0xd0, 0x6, 0x60, 0x0, - 0x0, 0xa3, 0x0, 0xd, 0x4, 0x70, 0x0, 0x0, - 0xa, 0x30, 0x0, 0xe4, 0x40, 0x0, 0x0, 0x4a, - 0xf1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x14, - 0x0, - - /* U+4F9B "供" */ - 0x0, 0x0, 0x86, 0x2, 0x80, 0x9, 0x10, 0x0, - 0x0, 0x0, 0xe4, 0x2, 0xa0, 0xd, 0x0, 0x0, - 0x0, 0x5, 0xa0, 0x2, 0xa0, 0xd, 0x0, 0x0, - 0x0, 0xc, 0x20, 0x2, 0xa0, 0xd, 0x7, 0x20, - 0x0, 0x4e, 0x23, 0x77, 0xc6, 0x6e, 0x66, 0x40, - 0x0, 0xbd, 0x0, 0x2, 0xa0, 0xd, 0x0, 0x0, - 0x6, 0x2d, 0x0, 0x2, 0xa0, 0xd, 0x0, 0x0, - 0x23, 0xd, 0x0, 0x2, 0xa0, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x26, 0x67, 0xc6, 0x6e, 0x68, 0xd1, - 0x0, 0xd, 0x2, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x5, 0xd0, 0x15, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x1d, 0x20, 0x3, 0xb2, 0x0, - 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0x4f, 0x30, - 0x0, 0xe, 0x8, 0x20, 0x0, 0x0, 0x7, 0x70, - 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4F9D "依" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xd1, 0x0, 0x55, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x90, 0x0, 0xd, 0x40, 0x0, 0x0, - 0x0, 0xc, 0x25, 0x66, 0x6c, 0x76, 0x6d, 0x60, - 0x0, 0x2d, 0x11, 0x0, 0x2e, 0x10, 0x0, 0x0, - 0x0, 0x9e, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, - 0x1, 0x8d, 0x0, 0x4, 0x95, 0x0, 0x27, 0x0, - 0x7, 0x1d, 0x0, 0x1b, 0x3, 0x40, 0xc7, 0x0, - 0x13, 0xd, 0x0, 0xae, 0x10, 0x98, 0x20, 0x0, - 0x0, 0xd, 0x8, 0x3d, 0x0, 0xa1, 0x0, 0x0, - 0x0, 0xd, 0x41, 0xd, 0x0, 0x58, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x2d, 0x30, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x17, 0x14, 0xe3, 0x0, - 0x0, 0xd, 0x0, 0xe, 0xb0, 0x0, 0x7f, 0x90, - 0x0, 0xd, 0x0, 0xb, 0x0, 0x0, 0x6, 0x10, - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4FA1 "価" */ - 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0x73, 0x0, - 0x5, 0x94, 0x76, 0xd6, 0x6d, 0x66, 0x40, 0x0, - 0xc1, 0x0, 0xc, 0x0, 0xb0, 0x0, 0x0, 0x4f, - 0x30, 0x0, 0xc0, 0xb, 0x0, 0x0, 0xa, 0xc0, - 0xc, 0x6d, 0x66, 0xd6, 0xd3, 0x5, 0x3c, 0x0, - 0xd0, 0xc0, 0xb, 0xd, 0x1, 0x40, 0xc0, 0xd, - 0xc, 0x0, 0xb0, 0xd0, 0x0, 0xc, 0x0, 0xd0, - 0xc0, 0xb, 0xd, 0x0, 0x0, 0xc0, 0xd, 0xc, - 0x0, 0xb0, 0xd0, 0x0, 0xc, 0x0, 0xd0, 0xc0, - 0xb, 0xd, 0x0, 0x0, 0xc0, 0xd, 0xc, 0x0, - 0xb0, 0xd0, 0x0, 0xc, 0x0, 0xd6, 0x86, 0x68, - 0x6e, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x4, 0x0, 0x30, 0x0, 0x0, 0x1, - 0x0, - - /* U+4FBF "便" */ - 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x2, 0xf7, 0x76, 0x67, 0x66, 0x69, 0xa0, - 0x0, 0x8, 0x70, 0x0, 0xa, 0x20, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xa6, 0x6c, 0x76, 0x6d, 0x20, - 0x0, 0x6b, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, - 0x0, 0xbe, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, - 0x6, 0x3d, 0x0, 0xd6, 0x6c, 0x76, 0x6d, 0x0, - 0x6, 0xd, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xd6, 0x6c, 0x76, 0x6d, 0x0, - 0x0, 0xd, 0x0, 0x50, 0xc, 0x0, 0x1, 0x0, - 0x0, 0xd, 0x0, 0x6, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x2, 0xa9, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x1, 0xcc, 0x40, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x59, 0x21, 0x9e, 0xb9, 0x81, - 0x0, 0x6, 0x35, 0x20, 0x0, 0x0, 0x37, 0x40, - - /* U+4FC2 "係" */ - 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x14, 0x0, - 0x0, 0x0, 0xf3, 0x2, 0x46, 0x9b, 0xdc, 0x40, - 0x0, 0x5, 0xa1, 0x43, 0x2b, 0x80, 0x0, 0x0, - 0x0, 0xc, 0x30, 0x0, 0x89, 0x20, 0x90, 0x0, - 0x0, 0x3e, 0x20, 0x39, 0x40, 0xb, 0xb2, 0x0, - 0x0, 0xae, 0x0, 0xcb, 0x97, 0xd7, 0x0, 0x0, - 0x4, 0x6d, 0x0, 0x0, 0x29, 0x20, 0x44, 0x0, - 0x7, 0xd, 0x0, 0x17, 0x60, 0x0, 0xb, 0x20, - 0x0, 0xd, 0x0, 0xac, 0xa8, 0xd5, 0x48, 0xa0, - 0x0, 0xd, 0x0, 0x1, 0x0, 0xc1, 0x1, 0x30, - 0x0, 0xd, 0x0, 0x9, 0xa0, 0xc1, 0x92, 0x0, - 0x0, 0xd, 0x0, 0x3b, 0x0, 0xc0, 0x1d, 0x40, - 0x0, 0xd, 0x1, 0xa0, 0x0, 0xc0, 0x4, 0xd0, - 0x0, 0xd, 0x6, 0x1, 0x8a, 0xb0, 0x0, 0x30, - 0x0, 0x6, 0x0, 0x0, 0x8, 0x20, 0x0, 0x0, - - /* U+4FDD "保" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb7, 0x11, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x1, 0xe1, 0x3d, 0x66, 0x66, 0xd4, 0x0, - 0x0, 0x6, 0x80, 0x2b, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0xc, 0x10, 0x2b, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x5e, 0x10, 0x2b, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0xad, 0x0, 0x3d, 0x6b, 0x66, 0xd0, 0x0, - 0x7, 0x2d, 0x0, 0x11, 0xb, 0x10, 0x0, 0x0, - 0x12, 0xd, 0x16, 0x66, 0x6d, 0x66, 0x69, 0xa0, - 0x0, 0xd, 0x1, 0x0, 0x8e, 0x51, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x1, 0xab, 0x18, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xa, 0x2b, 0x16, 0x60, 0x0, - 0x0, 0xd, 0x0, 0x74, 0xb, 0x10, 0xb7, 0x0, - 0x0, 0xd, 0x4, 0x50, 0xb, 0x10, 0x1c, 0xb0, - 0x0, 0xe, 0x23, 0x0, 0xc, 0x20, 0x0, 0x0, - 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - - /* U+4FE1 "信" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa5, 0x0, 0x8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe1, 0x0, 0x6, 0xa0, 0x0, 0x0, - 0x0, 0x6, 0x93, 0x66, 0x67, 0xb6, 0x6a, 0x90, - 0x0, 0xc, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4d, 0x10, 0x0, 0x0, 0x0, 0x26, 0x0, - 0x0, 0xbd, 0x0, 0x27, 0x66, 0x66, 0x65, 0x0, - 0x5, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x16, 0xd, 0x0, 0x47, 0x66, 0x66, 0x78, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0xd, 0x0, 0x2b, 0x66, 0x66, 0x7d, 0x0, - 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0x2a, 0x0, - 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0x2a, 0x0, - 0x0, 0xd, 0x0, 0x1d, 0x66, 0x66, 0x7a, 0x0, - 0x0, 0xd, 0x0, 0x2b, 0x0, 0x0, 0x2a, 0x0, - 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4FEE "修" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0xe, 0x20, 0x0, 0x0, - 0x0, 0x6, 0x80, 0x0, 0x59, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x20, 0x0, 0xb8, 0x66, 0x7e, 0x20, - 0x0, 0x2b, 0x7, 0x5, 0x57, 0x0, 0xb5, 0x0, - 0x0, 0x9e, 0xc, 0x16, 0x1, 0xab, 0x50, 0x0, - 0x1, 0x9c, 0xc, 0x10, 0x2, 0xbc, 0x30, 0x0, - 0x8, 0x1c, 0xc, 0x0, 0x67, 0x3, 0xac, 0x82, - 0x12, 0xc, 0xc, 0x34, 0x0, 0x7c, 0x12, 0x30, - 0x0, 0xc, 0xc, 0x0, 0x19, 0x60, 0x41, 0x0, - 0x0, 0xc, 0xc, 0x4, 0x61, 0x6, 0xd4, 0x0, - 0x0, 0xc, 0xc, 0x0, 0x2, 0xa7, 0x2, 0x80, - 0x0, 0xc, 0xa, 0x2, 0x77, 0x10, 0x6d, 0x70, - 0x0, 0xc, 0x0, 0x13, 0x0, 0x5b, 0x80, 0x0, - 0x0, 0xc, 0x0, 0x3, 0x79, 0x50, 0x0, 0x0, - 0x0, 0x5, 0x2, 0x53, 0x0, 0x0, 0x0, 0x0, - - /* U+500B "個" */ - 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xf3, 0xb6, 0x66, 0x66, 0x66, 0xb0, - 0x0, 0x7, 0x80, 0xd0, 0x3, 0x30, 0x3, 0xa0, - 0x0, 0xd, 0x10, 0xd0, 0x5, 0x70, 0x3, 0xa0, - 0x0, 0x5e, 0x10, 0xd3, 0x69, 0xa7, 0x93, 0xa0, - 0x0, 0xbd, 0x0, 0xd0, 0x5, 0x60, 0x3, 0xa0, - 0x4, 0x4d, 0x0, 0xd0, 0x5, 0x60, 0x3, 0xa0, - 0x5, 0xd, 0x0, 0xd0, 0xa8, 0x8d, 0x33, 0xa0, - 0x0, 0xd, 0x0, 0xd0, 0xc0, 0xc, 0x3, 0xa0, - 0x0, 0xd, 0x0, 0xd0, 0xc0, 0xc, 0x3, 0xa0, - 0x0, 0xd, 0x0, 0xd0, 0xc6, 0x6d, 0x3, 0xa0, - 0x0, 0xd, 0x0, 0xd0, 0x70, 0x5, 0x3, 0xa0, - 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0x67, 0xa0, - 0x0, 0xe, 0x0, 0xd0, 0x0, 0x0, 0x3, 0xa0, - 0x0, 0x4, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+5011 "們" */ - 0x0, 0x1, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xc1, 0xa6, 0x6c, 0x39, 0x66, 0xd0, - 0x0, 0xa, 0x51, 0xd0, 0x2b, 0x3a, 0x1, 0xc0, - 0x0, 0xd, 0x1, 0xe6, 0x7b, 0x3c, 0x66, 0xc0, - 0x0, 0x5e, 0x11, 0xd0, 0x2b, 0x3a, 0x1, 0xc0, - 0x0, 0xad, 0x1, 0xd0, 0x2b, 0x3a, 0x1, 0xc0, - 0x2, 0x6d, 0x1, 0xe6, 0x79, 0x3a, 0x66, 0xc0, - 0x6, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, - 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, - 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, - 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, - 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, - 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, - 0x0, 0xe, 0x1, 0xd0, 0x0, 0x1, 0x7d, 0xa0, - 0x0, 0x4, 0x1, 0x30, 0x0, 0x0, 0x4, 0x10, - - /* U+5019 "候" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x4, 0xb0, 0x2, 0x86, 0x67, 0xd1, 0x0, - 0x0, 0x9, 0x50, 0x0, 0x0, 0x4, 0x80, 0x0, - 0x0, 0xd, 0x9, 0x40, 0x0, 0x6, 0x60, 0x50, - 0x0, 0x4d, 0xa, 0x27, 0xb7, 0x66, 0x66, 0x50, - 0x0, 0xad, 0xa, 0x20, 0xc2, 0x0, 0x1, 0x0, - 0x4, 0x5d, 0xa, 0x22, 0xb6, 0xa6, 0x78, 0x0, - 0x5, 0xd, 0xa, 0x27, 0x10, 0xd0, 0x0, 0x0, - 0x0, 0xd, 0xa, 0x21, 0x0, 0xe0, 0x2, 0x50, - 0x0, 0xd, 0xa, 0x27, 0x67, 0xd9, 0x66, 0x50, - 0x0, 0xd, 0xa, 0x20, 0x6, 0x77, 0x0, 0x0, - 0x0, 0xd, 0xa, 0x20, 0xc, 0x13, 0x80, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x95, 0x0, 0x98, 0x0, - 0x0, 0xe, 0x0, 0x8, 0x40, 0x0, 0xb, 0xd3, - 0x0, 0x7, 0x1, 0x50, 0x0, 0x0, 0x0, 0x20, - - /* U+501F "借" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0xa3, 0x6, 0xa0, 0xd, 0x20, 0x0, - 0x0, 0x1, 0xd0, 0x6, 0x70, 0xd, 0x0, 0x0, - 0x0, 0x6, 0x73, 0x69, 0xa6, 0x6e, 0x69, 0x70, - 0x0, 0xc, 0x10, 0x6, 0x70, 0xd, 0x0, 0x0, - 0x0, 0x59, 0x0, 0x6, 0x70, 0xd, 0x0, 0x0, - 0x0, 0xbe, 0x0, 0x6, 0x70, 0xd, 0x1, 0x60, - 0x7, 0x3d, 0x18, 0x66, 0x66, 0x66, 0x66, 0x71, - 0x24, 0xd, 0x0, 0x20, 0x0, 0x0, 0x30, 0x0, - 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0xd5, 0x0, - 0x0, 0xd, 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, - 0x0, 0xd, 0x0, 0xc6, 0x66, 0x66, 0xd1, 0x0, - 0x0, 0xd, 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, - 0x0, 0xd, 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, - 0x0, 0xe, 0x0, 0xd6, 0x66, 0x66, 0xd1, 0x0, - 0x0, 0x7, 0x0, 0x40, 0x0, 0x0, 0x30, 0x0, - - /* U+5024 "値" */ - 0x0, 0x0, 0xa3, 0x0, 0x4, 0x90, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x5, 0x90, 0x0, 0x10, - 0x0, 0x7, 0x76, 0x76, 0x6a, 0xb6, 0x67, 0xc1, - 0x0, 0xc, 0x10, 0x0, 0x9, 0x50, 0x0, 0x0, - 0x0, 0x4e, 0x10, 0x8, 0x6c, 0x86, 0x6b, 0x0, - 0x0, 0xbd, 0x4, 0xd, 0x0, 0x0, 0x2a, 0x0, - 0x5, 0x3d, 0xd, 0x2d, 0x0, 0x0, 0x2a, 0x0, - 0x15, 0xd, 0xd, 0xd, 0x66, 0x66, 0x7a, 0x0, - 0x0, 0xd, 0xd, 0xd, 0x0, 0x0, 0x2a, 0x0, - 0x0, 0xd, 0xd, 0xd, 0x66, 0x66, 0x7a, 0x0, - 0x0, 0xd, 0xd, 0xd, 0x0, 0x0, 0x2a, 0x0, - 0x0, 0xd, 0xd, 0xd, 0x66, 0x66, 0x7b, 0x0, - 0x0, 0xd, 0xd, 0x9, 0x0, 0x0, 0x16, 0x20, - 0x0, 0xe, 0xe, 0x66, 0x66, 0x66, 0x67, 0xf4, - 0x0, 0x8, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+503C "值" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb1, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x3, 0xb0, 0x0, 0xe, 0x0, 0x3, 0x0, - 0x0, 0x9, 0x57, 0x76, 0x6e, 0x66, 0x7b, 0x30, - 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x6d, 0x10, 0x96, 0x6d, 0x66, 0xc2, 0x0, - 0x0, 0xbd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, - 0x5, 0x4d, 0x0, 0xc6, 0x66, 0x66, 0xd0, 0x0, - 0x6, 0xd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, - 0x10, 0xd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xc6, 0x66, 0x66, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xc6, 0x66, 0x66, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x46, 0xd6, 0x66, 0x66, 0xe8, 0xd1, - 0x0, 0x7, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+505A "做" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xb0, 0x24, 0x0, 0xb, 0x10, 0x0, - 0x0, 0x5, 0xa0, 0x48, 0x0, 0x2c, 0x0, 0x0, - 0x0, 0xa, 0x30, 0x37, 0x0, 0x57, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x37, 0x33, 0x83, 0x11, 0x60, - 0x0, 0x6c, 0x28, 0x8a, 0x65, 0xa5, 0x5e, 0x50, - 0x0, 0xba, 0x0, 0x37, 0x0, 0xa0, 0xc, 0x0, - 0x4, 0x7a, 0x0, 0x37, 0x5, 0x60, 0xb, 0x0, - 0x6, 0x2a, 0x9, 0x8a, 0xa4, 0x51, 0x39, 0x0, - 0x0, 0x2a, 0xc, 0x0, 0xb1, 0x25, 0x75, 0x0, - 0x0, 0x2a, 0xc, 0x0, 0xb1, 0x8, 0xb1, 0x0, - 0x0, 0x2a, 0xc, 0x0, 0xb1, 0x8, 0xa0, 0x0, - 0x0, 0x2a, 0xd, 0x66, 0xc1, 0x1c, 0xb0, 0x0, - 0x0, 0x2a, 0xc, 0x0, 0x82, 0xa2, 0x5b, 0x10, - 0x0, 0x3a, 0x6, 0x0, 0x47, 0x0, 0x6, 0xd2, - 0x0, 0x24, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, - - /* U+505C "停" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x19, 0x20, 0x0, 0x0, - 0x0, 0x6, 0x90, 0x0, 0x5, 0x90, 0x2, 0x50, - 0x0, 0xb, 0x24, 0x76, 0x66, 0x66, 0x66, 0x60, - 0x0, 0x1b, 0x0, 0xa, 0x66, 0x66, 0xb2, 0x0, - 0x0, 0x8d, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xbc, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, - 0x6, 0x3c, 0x2, 0x4, 0x0, 0x0, 0x20, 0x20, - 0x3, 0xc, 0xa, 0x66, 0x66, 0x66, 0x66, 0xe3, - 0x0, 0xc, 0x4a, 0x0, 0x0, 0x0, 0x25, 0x10, - 0x0, 0xc, 0x0, 0x67, 0x66, 0xb6, 0x77, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x7c, 0xb0, 0x0, 0x0, - 0x0, 0x4, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, - - /* U+5065 "健" */ - 0x0, 0x0, 0xa3, 0x0, 0x0, 0x8, 0x0, 0x0, - 0x0, 0x1, 0xe0, 0x1, 0x0, 0xc, 0x1, 0x0, - 0x0, 0x6, 0x85, 0x7e, 0x6, 0x6d, 0x6d, 0x20, - 0x0, 0xb, 0x10, 0x66, 0x0, 0xc, 0xc, 0x30, - 0x0, 0x3b, 0x0, 0xc1, 0x46, 0x6d, 0x6d, 0x62, - 0x0, 0x9e, 0x3, 0xa1, 0x0, 0xc, 0xc, 0x0, - 0x4, 0x5d, 0xa, 0x8b, 0x64, 0x6d, 0x69, 0x0, - 0x5, 0xd, 0x0, 0xa, 0x10, 0xc, 0x6, 0x0, - 0x0, 0xd, 0x3, 0xc, 0x6, 0x6d, 0x66, 0x20, - 0x0, 0xd, 0x6, 0xb, 0x0, 0xc, 0x1, 0x50, - 0x0, 0xd, 0x4, 0x87, 0x46, 0x6d, 0x66, 0x50, - 0x0, 0xd, 0x0, 0xd4, 0x0, 0xc, 0x0, 0x0, - 0x0, 0xd, 0x4, 0x7a, 0x82, 0x4, 0x0, 0x0, - 0x0, 0xd, 0x35, 0x0, 0x4a, 0xcc, 0xcd, 0xb1, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5074 "側" */ - 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x1, 0x70, - 0x0, 0x4, 0xc1, 0xb6, 0x6d, 0x10, 0x1, 0xc0, - 0x0, 0x9, 0x51, 0xb0, 0xc, 0xa, 0x31, 0xb0, - 0x0, 0xc, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, - 0x0, 0x4d, 0x1, 0xc6, 0x6c, 0xc, 0x1, 0xb0, - 0x0, 0xaa, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, - 0x3, 0x6a, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, - 0x5, 0x1a, 0x1, 0xc6, 0x6c, 0xc, 0x1, 0xb0, - 0x0, 0x1a, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, - 0x0, 0x1a, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, - 0x0, 0x1a, 0x1, 0xb6, 0x6a, 0x9, 0x1, 0xb0, - 0x0, 0x1a, 0x0, 0x75, 0x42, 0x0, 0x1, 0xb0, - 0x0, 0x1a, 0x2, 0xb1, 0xc, 0x20, 0x1, 0xa0, - 0x0, 0x2b, 0x8, 0x0, 0x7, 0x93, 0x8c, 0x90, - 0x0, 0x13, 0x20, 0x0, 0x1, 0x30, 0x6, 0x0, - - /* U+5099 "備" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x95, 0x2, 0xc0, 0xb, 0x40, 0x0, - 0x0, 0x1, 0xf3, 0x2, 0xb0, 0xb, 0x14, 0x0, - 0x0, 0x6, 0x91, 0x87, 0xc6, 0x6d, 0x68, 0x50, - 0x0, 0xc, 0x20, 0x2, 0xb0, 0xb, 0x10, 0x30, - 0x0, 0x3e, 0x17, 0x67, 0xc6, 0x6a, 0x67, 0xc3, - 0x0, 0xad, 0x0, 0x8, 0xa0, 0x0, 0x0, 0x0, - 0x4, 0x4d, 0x0, 0x4e, 0x66, 0x86, 0x6d, 0x10, - 0x4, 0xd, 0x3, 0xbb, 0x1, 0xc0, 0xd, 0x0, - 0x0, 0xd, 0x46, 0x2c, 0x66, 0xd6, 0x6d, 0x0, - 0x0, 0xd, 0x0, 0x2b, 0x1, 0xc0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0x2c, 0x66, 0xd6, 0x6d, 0x0, - 0x0, 0xd, 0x0, 0x2b, 0x1, 0xc0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0x2b, 0x1, 0xc0, 0xc, 0x0, - 0x0, 0xe, 0x0, 0x2b, 0x1, 0xb5, 0xaa, 0x0, - 0x0, 0x4, 0x0, 0x13, 0x0, 0x0, 0x41, 0x0, - - /* U+50B3 "傳" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0xe, 0x10, 0x0, 0x0, - 0x0, 0x3, 0xd4, 0x66, 0x6e, 0x66, 0x7e, 0x30, - 0x0, 0x9, 0x51, 0x30, 0xd, 0x0, 0x40, 0x0, - 0x0, 0xd, 0x0, 0xd6, 0x6e, 0x66, 0xd3, 0x0, - 0x0, 0x6e, 0x10, 0xd6, 0x6e, 0x66, 0xd1, 0x0, - 0x0, 0xad, 0x0, 0xd0, 0xd, 0x0, 0xc1, 0x0, - 0x6, 0x1d, 0x0, 0xd6, 0x6e, 0x66, 0xa1, 0x0, - 0x13, 0xd, 0x0, 0x0, 0xd, 0x1, 0x95, 0x0, - 0x0, 0xd, 0x9, 0xca, 0x88, 0x67, 0x3c, 0x0, - 0x0, 0xd, 0x1, 0x0, 0x0, 0xd, 0x14, 0x20, - 0x0, 0xd, 0x37, 0x86, 0x66, 0x6e, 0x67, 0x60, - 0x0, 0xd, 0x0, 0x5b, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x7, 0x10, 0xd, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x27, 0xbc, 0x0, 0x0, - 0x0, 0x5, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, - - /* U+50C5 "僅" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb2, 0x8, 0x40, 0xa, 0x40, 0x0, - 0x0, 0x4, 0xb0, 0x9, 0x30, 0xb, 0x21, 0x20, - 0x0, 0xa, 0x57, 0x6b, 0x76, 0x6c, 0x79, 0x90, - 0x0, 0xd, 0x0, 0x9, 0x30, 0xb, 0x20, 0x0, - 0x0, 0x6d, 0x10, 0x9, 0x7c, 0x7b, 0x10, 0x0, - 0x0, 0xcd, 0x0, 0x30, 0xb, 0x20, 0x23, 0x0, - 0x4, 0x5d, 0x0, 0xd6, 0x6c, 0x76, 0xa8, 0x0, - 0x6, 0xd, 0x0, 0xd0, 0xb, 0x20, 0x76, 0x0, - 0x0, 0xd, 0x0, 0xc6, 0x6c, 0x76, 0x83, 0x0, - 0x0, 0xd, 0x0, 0x66, 0x6c, 0x76, 0xb6, 0x0, - 0x0, 0xd, 0x0, 0x20, 0xb, 0x20, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x56, 0x6c, 0x76, 0xd5, 0x0, - 0x0, 0xd, 0x0, 0x10, 0xb, 0x20, 0x0, 0x0, - 0x0, 0xe, 0x16, 0x66, 0x6c, 0x76, 0x6a, 0xc0, - 0x0, 0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+50CD "働" */ - 0x0, 0xb, 0x40, 0x1, 0x50, 0x7, 0x30, 0x0, - 0x1, 0xf5, 0x6a, 0x97, 0x10, 0xb2, 0x0, 0x0, - 0x69, 0x0, 0xa2, 0x12, 0xa, 0x20, 0x0, 0xb, - 0x48, 0x6c, 0x77, 0x70, 0xa2, 0x20, 0x1, 0xf2, - 0x12, 0xa2, 0x42, 0x8c, 0x7c, 0x60, 0x8f, 0x2, - 0xcc, 0x7c, 0x50, 0xb2, 0xa2, 0xa, 0xb0, 0x2a, - 0xa2, 0xa2, 0xb, 0x1a, 0x15, 0x1b, 0x2, 0xcc, - 0x7c, 0x20, 0xc0, 0xb1, 0x0, 0xb0, 0x2c, 0xc7, - 0xc2, 0xc, 0xb, 0x0, 0xb, 0x1, 0x4a, 0x24, - 0x1, 0xa0, 0xc0, 0x0, 0xb0, 0x46, 0xc7, 0xb4, - 0x55, 0xc, 0x0, 0xb, 0x1, 0x1a, 0x20, 0x9, - 0x0, 0xc0, 0x0, 0xb1, 0x46, 0xc8, 0x54, 0x60, - 0xb, 0x0, 0xc, 0x1b, 0x61, 0x1, 0x70, 0x5d, - 0x80, 0x0, 0x40, 0x0, 0x0, 0x30, 0x0, 0x30, - 0x0, - - /* U+50CF "像" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x6, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xb0, 0xd, 0x86, 0x6c, 0x60, 0x0, - 0x0, 0xa, 0x40, 0x84, 0x0, 0x47, 0x0, 0x0, - 0x0, 0x1d, 0x4, 0xd6, 0x67, 0xa6, 0x6e, 0x10, - 0x0, 0x8f, 0x23, 0xd0, 0x7, 0x50, 0xe, 0x0, - 0x1, 0x9e, 0x0, 0xd6, 0x6c, 0x86, 0x6e, 0x0, - 0x7, 0xe, 0x0, 0x60, 0x3a, 0x0, 0x15, 0x0, - 0x22, 0xe, 0x0, 0x3, 0xa7, 0x2, 0xd6, 0x0, - 0x0, 0xe, 0x1, 0x76, 0x1c, 0xaa, 0x10, 0x0, - 0x0, 0xe, 0x3, 0x3, 0xb2, 0xd4, 0x30, 0x0, - 0x0, 0xe, 0x1, 0x76, 0xa, 0xd5, 0xa0, 0x0, - 0x0, 0xe, 0x4, 0x2, 0xb4, 0x77, 0x6a, 0x0, - 0x0, 0xe, 0x0, 0x79, 0x10, 0x86, 0xc, 0xb1, - 0x0, 0xe, 0x36, 0x12, 0x7c, 0xe1, 0x1, 0x30, - 0x0, 0x4, 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, - - /* U+50D5 "僕" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc2, 0x0, 0xc1, 0xb3, 0x0, 0x0, - 0x0, 0x3, 0xb1, 0x30, 0xd0, 0xc0, 0x34, 0x0, - 0x0, 0x8, 0x50, 0xb1, 0xd0, 0xc0, 0xb7, 0x0, - 0x0, 0xc, 0x0, 0x62, 0xd0, 0xc5, 0x51, 0x10, - 0x0, 0x4e, 0x17, 0x66, 0xa6, 0xa8, 0x69, 0x90, - 0x0, 0xad, 0x0, 0x9, 0x30, 0xc, 0x10, 0x0, - 0x3, 0x6d, 0x0, 0x2, 0x80, 0x53, 0x34, 0x0, - 0x7, 0xd, 0x2, 0x66, 0x6c, 0x66, 0x66, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xb, 0x1, 0x70, 0x0, - 0x0, 0xd, 0x0, 0x47, 0x6c, 0x66, 0x62, 0x0, - 0x0, 0xd, 0x7, 0x66, 0x7b, 0x66, 0x6b, 0x60, - 0x0, 0xd, 0x0, 0x0, 0xa1, 0x60, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x9, 0x30, 0x1a, 0x20, 0x0, - 0x0, 0xe, 0x3, 0x82, 0x0, 0x1, 0xbc, 0x80, - 0x0, 0x3, 0x33, 0x0, 0x0, 0x0, 0x4, 0x10, - - /* U+50F9 "價" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x4, 0x40, - 0x0, 0xb, 0x54, 0x76, 0xd6, 0x6d, 0x66, 0x50, - 0x0, 0xe, 0x0, 0x86, 0xd6, 0x6d, 0x6a, 0x10, - 0x0, 0x4c, 0x10, 0xb0, 0xc0, 0xb, 0xc, 0x0, - 0x0, 0xad, 0x0, 0xd6, 0xd6, 0x6d, 0x6d, 0x0, - 0x0, 0x9c, 0x0, 0x50, 0x0, 0x0, 0x4, 0x0, - 0x6, 0x2c, 0x0, 0x68, 0x66, 0x66, 0x96, 0x0, - 0x6, 0xc, 0x0, 0x65, 0x0, 0x0, 0x64, 0x0, - 0x10, 0xc, 0x0, 0x59, 0x66, 0x66, 0xa4, 0x0, - 0x0, 0xc, 0x0, 0x59, 0x66, 0x66, 0xa4, 0x0, - 0x0, 0xc, 0x0, 0x55, 0x0, 0x0, 0x64, 0x0, - 0x0, 0xc, 0x0, 0x58, 0x76, 0x67, 0x93, 0x0, - 0x0, 0xc, 0x0, 0x1b, 0x70, 0x3, 0x98, 0x20, - 0x0, 0xd, 0x3, 0x92, 0x0, 0x0, 0x6, 0xe1, - 0x0, 0x4, 0x12, 0x0, 0x0, 0x0, 0x0, 0x20, - - /* U+5104 "億" */ - 0x0, 0x3, 0xb0, 0x0, 0x64, 0x0, 0x0, 0x0, - 0x0, 0x89, 0x0, 0x0, 0xd0, 0x1, 0x30, 0x0, - 0xd, 0x21, 0x88, 0x67, 0x6b, 0x67, 0x0, 0x3, - 0xc0, 0x0, 0x58, 0x3, 0xa0, 0x0, 0x0, 0x9e, - 0x25, 0x66, 0xa6, 0xa6, 0x6b, 0x70, 0x19, 0xd0, - 0x22, 0x0, 0x0, 0x2, 0x0, 0x7, 0x1d, 0x0, - 0xb6, 0x66, 0x66, 0xe0, 0x1, 0x40, 0xd0, 0xb, - 0x66, 0x66, 0x6d, 0x0, 0x0, 0xd, 0x0, 0xb1, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd0, 0xa, 0x66, - 0x76, 0x6a, 0x0, 0x0, 0xd, 0x0, 0x18, 0x38, - 0x40, 0x61, 0x0, 0x0, 0xd0, 0x53, 0xb2, 0x17, - 0x42, 0xd1, 0x0, 0xd, 0xd, 0x1b, 0x30, 0x9, - 0x17, 0x40, 0x0, 0xe1, 0x40, 0x7d, 0xcc, 0xd4, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+512A "優" */ - 0x0, 0x2, 0x80, 0x0, 0x0, 0x0, 0x6, 0x0, - 0x0, 0x6, 0xa1, 0x78, 0x6b, 0x66, 0x96, 0x20, - 0x0, 0xb, 0x30, 0xe, 0x55, 0x55, 0xe1, 0x0, - 0x0, 0xc, 0x0, 0xd, 0x66, 0x66, 0xd0, 0x0, - 0x0, 0x5c, 0x0, 0xd, 0x66, 0x66, 0xd0, 0x0, - 0x0, 0xbb, 0x8, 0x6d, 0x66, 0x66, 0xd6, 0xb0, - 0x3, 0x6b, 0x2b, 0x14, 0x49, 0x30, 0x14, 0x70, - 0x6, 0x1b, 0x12, 0x97, 0x51, 0x66, 0x67, 0x0, - 0x0, 0x1b, 0x8, 0x54, 0xca, 0xad, 0x5b, 0x0, - 0x0, 0x1b, 0x0, 0x6, 0x80, 0x0, 0x10, 0x0, - 0x0, 0x1b, 0x0, 0x2e, 0x86, 0x69, 0xe2, 0x0, - 0x0, 0x1b, 0x2, 0x91, 0x84, 0x6b, 0x10, 0x0, - 0x0, 0x1b, 0x3, 0x0, 0x2e, 0xd3, 0x0, 0x0, - 0x0, 0x2c, 0x0, 0x38, 0x81, 0x3a, 0xda, 0x60, - 0x0, 0x13, 0x15, 0x30, 0x0, 0x0, 0x15, 0x10, - - /* U+513F "儿" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x30, 0xb, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x20, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x20, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x10, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x10, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x59, 0x0, 0xc, 0x10, 0x0, 0x20, - 0x0, 0x0, 0xb2, 0x0, 0xc, 0x10, 0x0, 0x60, - 0x0, 0x3, 0xa0, 0x0, 0xc, 0x10, 0x0, 0x80, - 0x0, 0x1b, 0x10, 0x0, 0xc, 0x20, 0x1, 0xe1, - 0x2, 0x81, 0x0, 0x0, 0x6, 0xed, 0xde, 0xc1, - 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5143 "元" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x5, 0x76, 0x66, 0x66, 0x69, 0xb1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x3, 0x76, 0x66, 0x86, 0x68, 0x66, 0x7c, 0x40, - 0x0, 0x0, 0x4, 0xb0, 0xf, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x90, 0xf, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x60, 0xf, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x30, 0xf, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x2d, 0x0, 0xf, 0x0, 0x0, 0x60, - 0x0, 0x0, 0xb5, 0x0, 0xf, 0x0, 0x0, 0x80, - 0x0, 0x8, 0x80, 0x0, 0xe, 0x20, 0x4, 0xc0, - 0x0, 0x95, 0x0, 0x0, 0x8, 0xdd, 0xde, 0xa0, - 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5144 "兄" */ - 0x0, 0x40, 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, - 0xe6, 0x66, 0x66, 0x66, 0xe4, 0x0, 0x0, 0xd1, - 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0xd1, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, - 0xd1, 0x0, 0x0, 0xe6, 0x6d, 0x67, 0xc6, 0xe1, - 0x0, 0x0, 0x70, 0x2c, 0x3, 0xc0, 0x10, 0x0, - 0x0, 0x0, 0x5a, 0x3, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x87, 0x3, 0xc0, 0x0, 0x20, 0x0, 0x0, - 0xc3, 0x3, 0xc0, 0x0, 0x50, 0x0, 0x3, 0xc0, - 0x3, 0xc0, 0x0, 0x71, 0x0, 0x2c, 0x20, 0x2, - 0xc0, 0x0, 0xb7, 0x4, 0x91, 0x0, 0x0, 0xcd, - 0xdd, 0xf8, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5145 "充" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5b, 0x0, 0x0, 0x30, 0x6, 0x76, - 0x66, 0x68, 0x96, 0x66, 0x6b, 0x60, 0x0, 0x0, - 0x9, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xb1, 0x2, 0x50, 0x0, 0x0, 0x0, 0x6, 0x80, - 0x0, 0x3, 0xb3, 0x0, 0x0, 0xc, 0xb8, 0x88, - 0x87, 0x68, 0xf4, 0x0, 0x0, 0x65, 0x6c, 0x10, - 0xe0, 0x8, 0x80, 0x0, 0x0, 0x5, 0x90, 0xe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x86, 0x0, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0x10, 0xe, 0x0, - 0x0, 0x60, 0x0, 0x5, 0x90, 0x0, 0xe0, 0x0, - 0x8, 0x0, 0x4, 0xa0, 0x0, 0xe, 0x0, 0x2, - 0xc0, 0x6, 0x60, 0x0, 0x0, 0x9d, 0xdd, 0xea, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5148 "先" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x90, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x89, 0x0, 0xa3, 0x0, 0x10, 0x0, 0x0, 0xd, - 0x86, 0x6c, 0x86, 0x6b, 0xa0, 0x0, 0x4, 0x90, - 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, - 0xa, 0x30, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, - 0xa3, 0x0, 0x0, 0x50, 0x7, 0x66, 0x69, 0x88, - 0x89, 0x66, 0x7a, 0x30, 0x0, 0x0, 0x95, 0x4, - 0x90, 0x0, 0x0, 0x0, 0x0, 0xc, 0x20, 0x49, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x4, 0x90, - 0x0, 0x40, 0x0, 0x0, 0x85, 0x0, 0x49, 0x0, - 0x6, 0x10, 0x0, 0x5a, 0x0, 0x4, 0xa0, 0x0, - 0x85, 0x1, 0x86, 0x0, 0x0, 0xc, 0xcc, 0xcd, - 0x60, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5149 "光" */ - 0x0, 0x0, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x90, 0x3, 0xa0, 0x8, 0xa0, 0x0, - 0x0, 0x0, 0x6c, 0x3, 0xa0, 0xe, 0x20, 0x0, - 0x0, 0x0, 0xe, 0x13, 0xa0, 0x66, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x3, 0xa0, 0x80, 0x3, 0x20, - 0x5, 0x76, 0x67, 0xa6, 0x8b, 0x66, 0x69, 0x80, - 0x0, 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x90, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x50, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x10, 0xd, 0x0, 0x0, 0x50, - 0x0, 0x0, 0x59, 0x0, 0xd, 0x0, 0x0, 0x70, - 0x0, 0x3, 0xa0, 0x0, 0xc, 0x10, 0x0, 0xd1, - 0x0, 0x67, 0x0, 0x0, 0x6, 0xdc, 0xcd, 0xc1, - 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+514B "克" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x31, 0x3, 0x76, - 0x66, 0x66, 0xd6, 0x66, 0x6a, 0x80, 0x0, 0x0, - 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, - 0x67, 0xc6, 0x6c, 0x40, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0xe6, 0x88, 0x6a, - 0x6d, 0x10, 0x0, 0x0, 0x6, 0x9, 0x50, 0xb0, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xd1, 0xb, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x4a, 0x0, 0xb0, 0x0, - 0x6, 0x0, 0x0, 0x2c, 0x10, 0xb, 0x0, 0x1, - 0xa0, 0x2, 0x77, 0x0, 0x0, 0x9b, 0xbb, 0xdc, - 0x13, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+514D "免" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4d, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd8, 0x66, 0x6e, 0x80, 0x0, 0x0, - 0x0, 0x7, 0x80, 0x0, 0x3a, 0x0, 0x0, 0x0, - 0x0, 0x3d, 0x0, 0x0, 0x80, 0x0, 0x60, 0x0, - 0x2, 0xab, 0x86, 0x6c, 0xa6, 0x66, 0xf2, 0x0, - 0x5, 0xa, 0x30, 0xa, 0x60, 0x0, 0xe0, 0x0, - 0x0, 0xa, 0x30, 0xc, 0x40, 0x0, 0xe0, 0x0, - 0x0, 0xb, 0x86, 0x6f, 0x8a, 0x66, 0xe0, 0x0, - 0x0, 0x3, 0x0, 0x2e, 0x3b, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x88, 0x3b, 0x0, 0x0, 0x60, - 0x0, 0x0, 0x3, 0xe1, 0x3b, 0x0, 0x0, 0x80, - 0x0, 0x0, 0x4d, 0x30, 0x2b, 0x0, 0x3, 0xc0, - 0x0, 0x39, 0x70, 0x0, 0xe, 0xcc, 0xce, 0xb1, - 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5152 "兒" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x85, 0x74, 0x14, 0x76, 0x6e, 0x10, 0x0, 0xd, - 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xd1, - 0x5, 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x66, - 0x82, 0x18, 0x66, 0xe0, 0x0, 0x0, 0xd1, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x10, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xd6, 0x7d, 0x66, - 0xe6, 0x6c, 0x0, 0x0, 0x1, 0x3, 0xa0, 0xe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x0, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0xe, 0x0, - 0x0, 0x50, 0x0, 0x4, 0xa0, 0x0, 0xe0, 0x0, - 0x8, 0x0, 0x3, 0xa0, 0x0, 0xf, 0x21, 0x15, - 0xe1, 0x6, 0x70, 0x0, 0x0, 0x7a, 0xbb, 0xa7, - 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+515A "党" */ - 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x19, 0x30, 0xd0, 0xb, 0x80, 0x0, 0x0, - 0x0, 0x2f, 0xd, 0x3, 0xb0, 0x0, 0x0, 0x4, - 0x0, 0x40, 0xd0, 0x80, 0x0, 0x60, 0x2, 0xb6, - 0x66, 0x66, 0x66, 0x66, 0x8d, 0x40, 0xd5, 0x3, - 0x0, 0x0, 0x4, 0x5, 0x0, 0x1, 0x0, 0xc6, - 0x66, 0x66, 0xe3, 0x0, 0x0, 0x0, 0xb, 0x10, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xb6, 0x66, - 0x66, 0xe0, 0x0, 0x0, 0x0, 0x9, 0x1c, 0xb, - 0x15, 0x0, 0x0, 0x0, 0x0, 0x4, 0x90, 0xb1, - 0x0, 0x3, 0x0, 0x0, 0x0, 0xb2, 0xb, 0x10, - 0x0, 0x61, 0x0, 0x0, 0x88, 0x0, 0xb1, 0x0, - 0x7, 0x60, 0x16, 0x83, 0x0, 0x6, 0xdc, 0xcc, - 0xe7, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5165 "入" */ - 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xc4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4b, 0x92, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa5, 0x49, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xd0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x40, 0x6, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x4b, 0x0, 0x0, 0xd6, 0x0, 0x0, - 0x0, 0x1, 0xc1, 0x0, 0x0, 0x3f, 0x40, 0x0, - 0x0, 0x1a, 0x10, 0x0, 0x0, 0x6, 0xf7, 0x0, - 0x1, 0x91, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xc1, - 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5167 "內" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0x10, 0x0, 0x0, 0x1, 0x0, 0x0, 0x64, 0x0, - 0x0, 0x20, 0xa7, 0x66, 0x68, 0xb6, 0x66, 0x7e, - 0xa, 0x30, 0x0, 0x4d, 0x0, 0x2, 0xc0, 0xa3, - 0x0, 0x8, 0xc3, 0x0, 0x2c, 0xa, 0x30, 0x0, - 0xc2, 0x90, 0x2, 0xc0, 0xa3, 0x0, 0x57, 0xb, - 0x20, 0x2c, 0xa, 0x30, 0xb, 0x0, 0x5c, 0x2, - 0xc0, 0xa3, 0x8, 0x10, 0x0, 0xbb, 0x3c, 0xa, - 0x36, 0x20, 0x0, 0x1, 0xa5, 0xc0, 0xa3, 0x10, - 0x0, 0x0, 0x0, 0x2b, 0xa, 0x30, 0x0, 0x0, - 0x1, 0x13, 0xb0, 0xa2, 0x0, 0x0, 0x0, 0x28, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+5168 "全" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4d, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc9, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xb0, 0x62, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0x10, 0xb, 0x20, 0x0, 0x0, - 0x0, 0x1, 0xc3, 0x0, 0x0, 0xb6, 0x0, 0x0, - 0x0, 0x1b, 0x30, 0x0, 0x0, 0x4e, 0xd7, 0x30, - 0x3, 0x95, 0x76, 0x6d, 0x76, 0x65, 0x5d, 0x60, - 0x23, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x1, 0x0, 0x0, - 0x0, 0x7, 0x76, 0x6d, 0x76, 0x6c, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x2, 0x0, - 0x4, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x8f, 0x30, - 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5169 "兩" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x82, 0x5, - 0x76, 0x66, 0x6a, 0x76, 0x66, 0x69, 0x70, 0x0, - 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0xa, 0x20, 0x0, 0x2, 0x0, 0xe, 0x66, - 0x66, 0xc7, 0x66, 0x66, 0xe2, 0x0, 0xd0, 0x20, - 0xa, 0x22, 0x0, 0xd, 0x0, 0xd, 0x6, 0x10, - 0xa2, 0x16, 0x0, 0xd0, 0x0, 0xd0, 0xb, 0xa, - 0x20, 0x75, 0xd, 0x0, 0xd, 0x2, 0xe7, 0xa2, - 0xa, 0xd1, 0xd0, 0x0, 0xd0, 0x92, 0xea, 0x22, - 0x87, 0x9d, 0x0, 0xd, 0x35, 0xb, 0xb2, 0x80, - 0x2b, 0xd0, 0x0, 0xd5, 0x0, 0x1a, 0x60, 0x0, - 0x2d, 0x0, 0xd, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0xe0, 0x0, 0xd0, 0x0, 0xa, 0x20, 0x16, 0xec, - 0x0, 0x2, 0x0, 0x0, 0x20, 0x0, 0x3, 0x10, - 0x0, - - /* U+516B "八" */ - 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x60, 0x9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xc0, 0x9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x80, 0xa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x60, 0x8, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x30, 0x5, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x10, 0x2, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x68, 0x0, 0x0, 0x84, 0x0, 0x0, - 0x0, 0x0, 0xb2, 0x0, 0x0, 0x2c, 0x0, 0x0, - 0x0, 0x2, 0xa0, 0x0, 0x0, 0xb, 0x70, 0x0, - 0x0, 0xa, 0x10, 0x0, 0x0, 0x2, 0xf5, 0x0, - 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x70, - 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, 0x8, 0x71, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+516C "公" */ - 0x0, 0x0, 0x12, 0x0, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xe1, 0x9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb5, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, - 0x3c, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, 0xb, - 0x20, 0x0, 0x8, 0x70, 0x0, 0x0, 0x7, 0x60, - 0x2, 0x0, 0xc, 0x50, 0x0, 0x4, 0x70, 0x0, - 0xba, 0x0, 0x2e, 0x81, 0x3, 0x60, 0x0, 0x2e, - 0x10, 0x0, 0x2d, 0x70, 0x20, 0x0, 0xb, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x80, 0x3, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x1a, - 0x0, 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x4c, - 0x0, 0x0, 0x1, 0xd8, 0x77, 0x77, 0x65, 0xc9, - 0x0, 0x0, 0xa, 0x64, 0x20, 0x0, 0x4, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, - - /* U+516D "六" */ - 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x70, 0x0, 0x2, 0x10, - 0x7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x70, 0x4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x90, 0x2, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0x0, 0x0, 0x59, 0x0, 0x0, - 0x0, 0x0, 0xc5, 0x0, 0x0, 0xa, 0x80, 0x0, - 0x0, 0x6, 0x90, 0x0, 0x0, 0x1, 0xf6, 0x0, - 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x0, - 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, - 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5171 "共" */ - 0x0, 0x0, 0x8, 0x10, 0x0, 0x91, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x2, 0x0, - 0x3, 0x76, 0x6e, 0x66, 0x66, 0xe6, 0x6b, 0x60, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x20, - 0x17, 0x66, 0x6d, 0x66, 0x66, 0xd6, 0x6b, 0xd2, - 0x1, 0x0, 0x4, 0x20, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0x90, 0x4, 0x82, 0x0, 0x0, - 0x0, 0x1, 0xc6, 0x0, 0x0, 0x1b, 0x91, 0x0, - 0x0, 0x1b, 0x40, 0x0, 0x0, 0x0, 0xae, 0x0, - 0x3, 0x81, 0x0, 0x0, 0x0, 0x0, 0xb, 0x20, - 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5176 "其" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x10, 0x0, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x4, 0x0, - 0x1, 0x86, 0x6e, 0x66, 0x66, 0xe6, 0x7a, 0x30, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x1, 0x0, - 0x5, 0x66, 0x6e, 0x66, 0x66, 0xe6, 0x6d, 0xc1, - 0x1, 0x0, 0x5, 0x40, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0x80, 0x0, 0x97, 0x0, 0x0, - 0x0, 0x6, 0xc2, 0x0, 0x0, 0x9, 0xe4, 0x0, - 0x1, 0x86, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - - /* U+5177 "具" */ - 0x0, 0x0, 0x86, 0x66, 0x66, 0x6b, 0x10, 0x0, - 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6c, 0x0, 0x0, - 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6c, 0x0, 0x0, - 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6c, 0x0, 0x0, - 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0xb, 0x40, - 0x7, 0x66, 0x68, 0x66, 0x66, 0x66, 0x66, 0x50, - 0x0, 0x0, 0x5e, 0x20, 0x0, 0x66, 0x0, 0x0, - 0x0, 0x8, 0xa1, 0x0, 0x0, 0x5, 0xd4, 0x0, - 0x2, 0x94, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x0, - 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+5185 "内" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2d, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x0, - 0x0, 0x0, 0x39, 0x66, 0x67, 0xe6, 0x66, 0x7d, - 0x2, 0xb0, 0x0, 0x3b, 0x0, 0x3, 0xb0, 0x2b, - 0x0, 0x6, 0x90, 0x0, 0x3b, 0x2, 0xb0, 0x0, - 0xb9, 0x20, 0x3, 0xb0, 0x2b, 0x0, 0x2c, 0xb, - 0x70, 0x3b, 0x2, 0xb0, 0xb, 0x20, 0xc, 0x93, - 0xb0, 0x2b, 0x19, 0x20, 0x0, 0x2e, 0x3b, 0x2, - 0xd6, 0x0, 0x0, 0x0, 0x33, 0xb0, 0x2b, 0x0, - 0x0, 0x0, 0x0, 0x3b, 0x2, 0xb0, 0x0, 0x0, - 0x2, 0x15, 0xa0, 0x2b, 0x0, 0x0, 0x0, 0x39, - 0xf6, 0x1, 0x30, 0x0, 0x0, 0x0, 0x4, 0x0, - - /* U+5186 "円" */ - 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xd, 0x66, - 0x66, 0xa6, 0x66, 0x68, 0xe0, 0xd1, 0x0, 0xd, - 0x0, 0x0, 0x3a, 0xc, 0x10, 0x0, 0xd0, 0x0, - 0x3, 0xa0, 0xc1, 0x0, 0xd, 0x0, 0x0, 0x3a, - 0xc, 0x10, 0x0, 0xd0, 0x0, 0x3, 0xa0, 0xc6, - 0x66, 0x6e, 0x66, 0x66, 0x8a, 0xc, 0x10, 0x0, - 0x0, 0x0, 0x3, 0xa0, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x3a, 0xc, 0x10, 0x0, 0x0, 0x0, 0x3, - 0xa0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xc, - 0x10, 0x0, 0x0, 0x0, 0x3, 0xa0, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x4a, 0xd, 0x10, 0x0, 0x0, - 0x5, 0xaf, 0x70, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x40, 0x0, - - /* U+518A "冊" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x66, 0x96, 0x69, 0x66, 0xe3, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd6, 0x40, - 0x7, 0x6e, 0x66, 0xe6, 0x6e, 0x66, 0xe6, 0x60, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0xc, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x10, 0x0, 0x6b, 0xd0, 0x0, - 0x0, 0x3, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, - - /* U+518D "再" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x82, 0x0, - 0x28, 0x66, 0x66, 0xc6, 0x66, 0x68, 0x60, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x86, 0x66, 0xe6, 0x66, 0xb4, 0x0, 0x0, 0xd, - 0x10, 0xd, 0x0, 0xc, 0x20, 0x0, 0x0, 0xc1, - 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0xc, 0x66, - 0x6e, 0x66, 0x6d, 0x10, 0x0, 0x0, 0xc1, 0x0, - 0xd0, 0x0, 0xc1, 0x0, 0x0, 0xc, 0x10, 0xd, - 0x0, 0xc, 0x11, 0x1, 0x66, 0xd6, 0x66, 0xe6, - 0x66, 0xd7, 0xf6, 0x2, 0xc, 0x10, 0x0, 0x0, - 0xc, 0x10, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, - 0xc1, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0xc, - 0x10, 0x0, 0x0, 0xd1, 0x0, 0x1, 0x7d, 0xf0, - 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x33, 0x0, - 0x0, - - /* U+5199 "写" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x91, 0x8, 0x86, - 0x66, 0x66, 0x66, 0x66, 0xf6, 0xe, 0x32, 0x30, - 0x0, 0x0, 0x6, 0x30, 0x25, 0x5, 0xb0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x7, 0xa6, 0x66, 0x66, - 0x7d, 0x20, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x2f, 0x66, 0x66, 0x66, 0x68, 0xc0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x7, 0x60, 0x57, 0x66, 0x66, - 0x66, 0x8b, 0x29, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x31, - 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, - - /* U+519B "军" */ - 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x91, 0x0, - 0xb6, 0x66, 0x66, 0x66, 0x66, 0x6e, 0x60, 0x5c, - 0x0, 0x6, 0xb0, 0x0, 0x4, 0x10, 0x0, 0x0, - 0x0, 0xd2, 0x0, 0x0, 0x40, 0x0, 0x1, 0x66, - 0x9b, 0x66, 0x66, 0x67, 0x0, 0x0, 0x0, 0xc, - 0x10, 0x80, 0x0, 0x0, 0x0, 0x0, 0x7, 0x60, - 0xd, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, - 0xd0, 0x3, 0x50, 0x0, 0x0, 0x56, 0x66, 0x6e, - 0x66, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0x67, 0x66, 0x66, 0x6e, 0x66, - 0x66, 0xa9, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, - 0x0, - - /* U+51AC "冬" */ - 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x80, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x3, 0xd6, 0x66, 0x6a, 0xe1, 0x0, 0x0, 0x0, - 0xb6, 0x30, 0x2, 0xe3, 0x0, 0x0, 0x0, 0x74, - 0x8, 0x21, 0xc4, 0x0, 0x0, 0x0, 0x54, 0x0, - 0xb, 0xc4, 0x0, 0x0, 0x0, 0x12, 0x0, 0x4, - 0xcc, 0x80, 0x0, 0x0, 0x0, 0x0, 0x19, 0x91, - 0x8, 0xd7, 0x10, 0x0, 0x1, 0x78, 0x21, 0x73, - 0x3, 0xaf, 0xb7, 0x5, 0x50, 0x0, 0x1, 0xca, - 0x0, 0x28, 0x10, 0x0, 0x0, 0x0, 0x0, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x27, 0x97, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xd2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, - - /* U+51B7 "冷" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5c, 0x10, 0x0, 0x0, - 0x6, 0x10, 0x0, 0x0, 0xac, 0x10, 0x0, 0x0, - 0x2, 0xe2, 0x2, 0x0, 0xe1, 0x80, 0x0, 0x0, - 0x0, 0xa7, 0x5, 0x7, 0x80, 0x74, 0x0, 0x0, - 0x0, 0x20, 0x41, 0xc, 0x30, 0xc, 0x30, 0x0, - 0x0, 0x0, 0x70, 0x93, 0x1c, 0x12, 0xe7, 0x0, - 0x0, 0x3, 0x46, 0x40, 0x9, 0x70, 0x3e, 0xb2, - 0x0, 0xa, 0x42, 0x0, 0x1, 0x11, 0x21, 0x0, - 0x0, 0x69, 0x0, 0x76, 0x66, 0x6c, 0xc0, 0x0, - 0x7, 0xf4, 0x0, 0x0, 0x0, 0x2c, 0x10, 0x0, - 0x0, 0xd1, 0x0, 0x2, 0x10, 0x92, 0x0, 0x0, - 0x1, 0xf1, 0x0, 0x0, 0x99, 0x30, 0x0, 0x0, - 0x1, 0xe0, 0x0, 0x0, 0xd, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - - /* U+51CD "凍" */ - 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x2, - 0x70, 0x0, 0x0, 0xb, 0x10, 0x2, 0x20, 0x7, - 0xc0, 0x76, 0x66, 0xd6, 0x66, 0x87, 0x0, 0xb, - 0x10, 0x30, 0xb, 0x10, 0x3, 0x0, 0x0, 0x5, - 0xe, 0x66, 0xd6, 0x66, 0xe0, 0x0, 0x0, 0x50, - 0xd0, 0xb, 0x10, 0xd, 0x0, 0x0, 0x42, 0xd, - 0x66, 0xd6, 0x66, 0xd0, 0x0, 0x9, 0x0, 0xd0, - 0xb, 0x10, 0xd, 0x0, 0x15, 0x90, 0xe, 0x69, - 0xe9, 0x66, 0xc0, 0x4, 0xe5, 0x0, 0x21, 0xcb, - 0x71, 0x0, 0x0, 0xa, 0x30, 0x0, 0x94, 0xb2, - 0x90, 0x0, 0x0, 0xd3, 0x0, 0x57, 0xb, 0x15, - 0x80, 0x0, 0xf, 0x30, 0x47, 0x0, 0xb1, 0x9, - 0xb2, 0x0, 0x41, 0x34, 0x0, 0xb, 0x10, 0x9, - 0x80, 0x0, 0x1, 0x0, 0x0, 0x50, 0x0, 0x0, - 0x0, - - /* U+51DD "凝" */ - 0x0, 0x0, 0xc, 0x11, 0x0, 0x0, 0x5, 0x10, - 0x6, 0x70, 0xc, 0x1b, 0x31, 0x76, 0x6e, 0x50, - 0x0, 0xd5, 0xc, 0x50, 0x30, 0x3, 0x53, 0x0, - 0x0, 0x41, 0x3c, 0x0, 0x90, 0x6, 0xb0, 0x0, - 0x0, 0x2, 0x28, 0xaa, 0x91, 0x0, 0xc0, 0x0, - 0x0, 0x6, 0xb, 0x20, 0x5, 0x76, 0x86, 0xc5, - 0x0, 0x7, 0x1c, 0x2, 0x40, 0x1, 0xb0, 0x80, - 0x0, 0x45, 0x76, 0xb7, 0x50, 0x91, 0xb0, 0x0, - 0x5, 0xd1, 0x40, 0x92, 0x10, 0xc1, 0xc6, 0xc1, - 0x3, 0xe1, 0x86, 0xb7, 0xb4, 0xc1, 0xb0, 0x0, - 0x2, 0xc0, 0x0, 0xc2, 0x0, 0xd1, 0xb0, 0x0, - 0x6, 0xb0, 0x2, 0xa8, 0x64, 0x88, 0xb0, 0x0, - 0x3, 0x70, 0xa, 0x11, 0xa8, 0x12, 0xc5, 0x10, - 0x0, 0x0, 0x72, 0x0, 0x26, 0x0, 0x19, 0xf5, - 0x0, 0x1, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+51E6 "処" */ - 0x0, 0x4, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x80, 0x0, 0x2, 0x0, 0x40, 0x0, - 0x0, 0xb, 0x20, 0x10, 0xe, 0x67, 0xd0, 0x0, - 0x0, 0xe, 0x66, 0xb8, 0xd, 0x2, 0xb0, 0x0, - 0x0, 0x67, 0x0, 0xa2, 0xc, 0x2, 0xb0, 0x0, - 0x0, 0xb3, 0x0, 0xc0, 0x1b, 0x2, 0xb0, 0x0, - 0x4, 0x55, 0x1, 0xb0, 0x39, 0x2, 0xb0, 0x0, - 0x7, 0x6, 0x15, 0x70, 0x74, 0x2, 0xb0, 0x0, - 0x0, 0x1, 0x7b, 0x20, 0xb0, 0x2, 0xb0, 0x40, - 0x0, 0x0, 0x9b, 0x7, 0x40, 0x2, 0xb0, 0x80, - 0x0, 0x0, 0xac, 0x34, 0x0, 0x0, 0xdb, 0xe3, - 0x0, 0x7, 0x53, 0xc4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x56, 0x0, 0x2b, 0xd8, 0x53, 0x33, 0x42, - 0x6, 0x30, 0x0, 0x0, 0x27, 0xbd, 0xef, 0xb0, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+51FA "出" */ - 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x10, 0x0, 0x0, 0x4, 0x70, 0x0, - 0xe0, 0x0, 0xc, 0x10, 0x49, 0x0, 0xe, 0x0, - 0x0, 0xe0, 0x4, 0x90, 0x0, 0xe0, 0x0, 0xe, - 0x0, 0x49, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x7, - 0xb6, 0x66, 0xe6, 0x66, 0x6e, 0x0, 0x1, 0x0, - 0xe, 0x0, 0x0, 0x60, 0x8, 0x20, 0x0, 0xe0, - 0x0, 0x4, 0x30, 0xc2, 0x0, 0xe, 0x0, 0x0, - 0x6a, 0xc, 0x10, 0x0, 0xe0, 0x0, 0x6, 0x80, - 0xc1, 0x0, 0xe, 0x0, 0x0, 0x68, 0xd, 0x10, - 0x0, 0xe0, 0x0, 0x6, 0x80, 0x96, 0x66, 0x66, - 0x66, 0x66, 0x98, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x10, - - /* U+5206 "分" */ - 0x0, 0x0, 0x4, 0x0, 0x71, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xd1, 0x5, 0x20, 0x0, 0x0, 0x0, - 0x0, 0xd4, 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, - 0x6a, 0x0, 0x0, 0x82, 0x0, 0x0, 0x0, 0x1c, - 0x0, 0x0, 0x1, 0xc1, 0x0, 0x0, 0xb, 0x20, - 0x0, 0x0, 0x4, 0xe5, 0x0, 0x8, 0x46, 0x67, - 0x76, 0x66, 0xe4, 0xec, 0x25, 0x10, 0x0, 0x77, - 0x0, 0x2b, 0x0, 0x20, 0x0, 0x0, 0xa, 0x40, - 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x4a, 0x0, 0x0, 0x0, 0x0, 0x58, 0x0, 0x5, - 0x90, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x77, - 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0xb, 0x40, - 0x0, 0x0, 0x28, 0x10, 0x0, 0x7f, 0xc0, 0x0, - 0x0, 0x13, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, - 0x0, - - /* U+5207 "切" */ - 0x0, 0x7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x52, 0x0, - 0xc, 0x10, 0x28, 0x68, 0xd6, 0x6c, 0x60, 0x0, - 0xc1, 0x1, 0x10, 0x4b, 0x0, 0xb3, 0x0, 0xc, - 0x55, 0xa8, 0x5, 0xa0, 0xb, 0x31, 0x66, 0xd2, - 0x0, 0x0, 0x78, 0x0, 0xc3, 0x0, 0xc, 0x10, - 0x0, 0x9, 0x60, 0xc, 0x20, 0x0, 0xc1, 0x0, - 0x0, 0xc3, 0x0, 0xd1, 0x0, 0xc, 0x10, 0x2, - 0xe, 0x0, 0xe, 0x10, 0x0, 0xc1, 0x17, 0x16, - 0x90, 0x0, 0xe0, 0x0, 0xd, 0x79, 0x0, 0xd1, - 0x0, 0xe, 0x0, 0x0, 0xe9, 0x0, 0x87, 0x0, - 0x2, 0xd0, 0x0, 0x3, 0x0, 0x68, 0x0, 0x42, - 0x8a, 0x0, 0x0, 0x0, 0x65, 0x0, 0x2, 0xbf, - 0x30, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, 0x20, - 0x0, - - /* U+520A "刊" */ - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0xa, 0x20, - 0x67, 0x69, 0x66, 0xa3, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xb2, 0x0, 0x2, 0xb0, 0xe, 0x0, 0x0, - 0xb, 0x20, 0x0, 0x2c, 0x0, 0xe0, 0x0, 0x0, - 0xb2, 0x0, 0x2, 0xc0, 0xe, 0x0, 0x0, 0xb, - 0x20, 0x46, 0x2c, 0x0, 0xe0, 0x18, 0x66, 0xd7, - 0x66, 0x52, 0xc0, 0xe, 0x0, 0x0, 0xb, 0x20, - 0x0, 0x2c, 0x0, 0xe0, 0x0, 0x0, 0xb2, 0x0, - 0x2, 0xc0, 0xe, 0x0, 0x0, 0xb, 0x20, 0x0, - 0x2c, 0x0, 0xe0, 0x0, 0x0, 0xb2, 0x0, 0x2, - 0x60, 0xe, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, - 0x0, 0xe0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x24, - 0x4d, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x5e, - 0x90, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x20, - 0x0, - - /* U+5217 "列" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x20, - 0x36, 0x66, 0x66, 0x6e, 0x50, 0x0, 0xe0, 0x0, - 0x10, 0x98, 0x0, 0x0, 0x10, 0xe, 0x0, 0x0, - 0xd, 0x20, 0x0, 0xd, 0x20, 0xe0, 0x0, 0x3, - 0xe6, 0x6a, 0x50, 0xd0, 0xe, 0x0, 0x0, 0xa4, - 0x0, 0xd3, 0xd, 0x0, 0xe0, 0x0, 0x2d, 0x30, - 0x1d, 0x0, 0xd0, 0xe, 0x0, 0x9, 0x1c, 0x17, - 0x80, 0xd, 0x0, 0xe0, 0x5, 0x20, 0x95, 0xd2, - 0x0, 0xd0, 0xe, 0x0, 0x20, 0x2, 0x69, 0x0, - 0xd, 0x0, 0xe0, 0x0, 0x0, 0x1c, 0x0, 0x0, - 0xd0, 0xe, 0x0, 0x0, 0x1b, 0x20, 0x0, 0x1, - 0x0, 0xe0, 0x0, 0x2a, 0x20, 0x0, 0x0, 0x33, - 0x3f, 0x0, 0x46, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, - 0x0, - - /* U+521D "初" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x33, 0x24, 0x68, 0x76, 0x66, 0xe3, - 0x6, 0x76, 0x6d, 0x70, 0x9, 0x40, 0x0, 0xe0, - 0x0, 0x0, 0x3b, 0x0, 0xa, 0x30, 0x0, 0xd0, - 0x0, 0x0, 0xc1, 0x46, 0xb, 0x20, 0x1, 0xc0, - 0x0, 0x9, 0xd0, 0xb2, 0xd, 0x0, 0x2, 0xb0, - 0x0, 0x65, 0xd9, 0x20, 0xd, 0x0, 0x3, 0xa0, - 0x5, 0x40, 0xd4, 0xd2, 0x2a, 0x0, 0x4, 0x90, - 0x1, 0x0, 0xd0, 0x54, 0x66, 0x0, 0x6, 0x80, - 0x0, 0x0, 0xd0, 0x0, 0xb0, 0x0, 0x7, 0x60, - 0x0, 0x0, 0xd0, 0x5, 0x60, 0x0, 0x9, 0x50, - 0x0, 0x0, 0xd0, 0x19, 0x0, 0x31, 0x1c, 0x20, - 0x0, 0x0, 0xe1, 0x70, 0x0, 0x3a, 0xfb, 0x0, - 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x40, 0x0, - - /* U+5224 "判" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0xb4, 0x0, - 0x20, 0xd, 0x0, 0x81, 0x0, 0xb, 0x10, 0x9, - 0x30, 0xd0, 0x3d, 0x21, 0x70, 0xb1, 0x0, 0x4e, - 0xd, 0xa, 0x10, 0x1b, 0xb, 0x10, 0x0, 0x90, - 0xd3, 0x30, 0x1, 0xb0, 0xb1, 0x1, 0x66, 0x6e, - 0x66, 0xd4, 0x1b, 0xb, 0x10, 0x2, 0x0, 0xc0, - 0x0, 0x1, 0xb0, 0xb1, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x1b, 0xb, 0x10, 0x56, 0x67, 0xd6, 0x6b, - 0xb2, 0xb0, 0xb1, 0x1, 0x0, 0x67, 0x0, 0x0, - 0x1b, 0xb, 0x10, 0x0, 0xb, 0x10, 0x0, 0x2, - 0xc0, 0xb1, 0x0, 0x6, 0x70, 0x0, 0x0, 0x2, - 0xb, 0x10, 0x3, 0x80, 0x0, 0x0, 0x0, 0x21, - 0xc1, 0x4, 0x60, 0x0, 0x0, 0x0, 0x4, 0xdd, - 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, - - /* U+5225 "別" */ - 0x0, 0x10, 0x0, 0x3, 0x0, 0x0, 0x6, 0x10, - 0xd, 0x66, 0x66, 0xd5, 0x0, 0x0, 0xc1, 0x0, - 0xd0, 0x0, 0xb, 0x10, 0x0, 0xc, 0x0, 0xd, - 0x0, 0x0, 0xb1, 0xc, 0x10, 0xc0, 0x0, 0xd6, - 0x66, 0x6d, 0x20, 0xd0, 0xc, 0x0, 0x8, 0x62, - 0x0, 0x50, 0xd, 0x0, 0xc0, 0x0, 0xc, 0x20, - 0x0, 0x0, 0xd0, 0xc, 0x0, 0x0, 0xc6, 0x66, - 0xa3, 0xd, 0x0, 0xc0, 0x0, 0xd, 0x0, 0xd, - 0x0, 0xd0, 0xc, 0x0, 0x1, 0xb0, 0x0, 0xe0, - 0xd, 0x0, 0xc0, 0x0, 0x66, 0x0, 0x2c, 0x0, - 0x70, 0xc, 0x0, 0xb, 0x0, 0x5, 0x90, 0x0, - 0x0, 0xc0, 0x4, 0x60, 0x22, 0xa5, 0x0, 0x1, - 0x2e, 0x0, 0x80, 0x0, 0xbc, 0x0, 0x1, 0x6e, - 0xc0, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, 0x21, - 0x0, - - /* U+5229 "利" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x27, 0xe5, 0x0, 0x0, 0xc3, 0x2, - 0x56, 0x8f, 0x53, 0x10, 0x0, 0xc, 0x10, 0x0, - 0x0, 0xe0, 0x0, 0xb, 0x20, 0xc1, 0x0, 0x0, - 0xe, 0x0, 0x0, 0xd0, 0xc, 0x10, 0x56, 0x66, - 0xe6, 0x7e, 0x2d, 0x0, 0xc1, 0x1, 0x0, 0x3f, - 0x0, 0x0, 0xd0, 0xc, 0x10, 0x0, 0xa, 0xf4, - 0x0, 0xd, 0x0, 0xc1, 0x0, 0x3, 0xce, 0x5c, - 0x30, 0xd0, 0xc, 0x10, 0x0, 0xb2, 0xe0, 0x5d, - 0xd, 0x0, 0xc1, 0x0, 0x84, 0xe, 0x0, 0x30, - 0xd0, 0xc, 0x10, 0x64, 0x0, 0xe0, 0x0, 0x6, - 0x0, 0xc1, 0x13, 0x0, 0xe, 0x0, 0x0, 0x0, - 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x3, 0x55, - 0xe1, 0x0, 0x0, 0xf, 0x0, 0x0, 0x2, 0xcd, - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, 0x0, - - /* U+5230 "到" */ - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x29, 0x3, - 0x76, 0x69, 0x66, 0x95, 0x0, 0x2, 0xa0, 0x0, - 0x6, 0xd1, 0x0, 0x2, 0x90, 0x2a, 0x0, 0x1, - 0xa0, 0x24, 0x0, 0x3b, 0x2, 0xa0, 0x1, 0x80, - 0x0, 0x78, 0x2, 0xa0, 0x2a, 0x1, 0xeb, 0x8b, - 0x65, 0xd7, 0x2a, 0x2, 0xa0, 0x2, 0x0, 0xf1, - 0x4, 0x42, 0xa0, 0x2a, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x2a, 0x2, 0xa0, 0x26, 0x66, 0xe6, 0x6d, - 0x22, 0xa0, 0x2a, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x3a, 0x2, 0xa0, 0x0, 0x0, 0xe0, 0x0, 0x3, - 0x90, 0x2a, 0x0, 0x0, 0xe, 0x14, 0x63, 0x0, - 0x2, 0xa0, 0x46, 0x9b, 0xb7, 0x20, 0x0, 0x10, - 0x4a, 0x7, 0xa4, 0x0, 0x0, 0x0, 0x3, 0x9f, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, - 0x0, - - /* U+5236 "制" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x93, 0x0, - 0x43, 0xc, 0x0, 0x0, 0x0, 0xa, 0x20, 0x9, - 0x50, 0xc0, 0x21, 0x0, 0x60, 0xa2, 0x0, 0xc6, - 0x6d, 0x68, 0x70, 0x1c, 0xa, 0x20, 0x43, 0x0, - 0xc0, 0x0, 0x0, 0xb0, 0xa2, 0x8, 0x66, 0x6d, - 0x66, 0xb7, 0xb, 0xa, 0x20, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xb0, 0xa2, 0x0, 0xa6, 0x6d, 0x66, - 0xc1, 0xb, 0xa, 0x20, 0xc, 0x0, 0xc0, 0xc, - 0x0, 0xb0, 0xa2, 0x0, 0xc0, 0xc, 0x0, 0xc0, - 0xb, 0xa, 0x20, 0xc, 0x0, 0xc0, 0xc, 0x1, - 0x70, 0xa2, 0x0, 0xc0, 0xc, 0x49, 0xa0, 0x0, - 0xa, 0x20, 0x7, 0x0, 0xc0, 0x52, 0x0, 0x0, - 0xb2, 0x0, 0x0, 0xc, 0x0, 0x0, 0x5, 0xcf, - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x30, - - /* U+5238 "券" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x0, 0xe, 0x30, 0x33, 0x0, 0x0, - 0x0, 0x4, 0xc1, 0x2e, 0x0, 0xb7, 0x0, 0x0, - 0x0, 0x0, 0xc3, 0x69, 0x5, 0x40, 0x10, 0x0, - 0x1, 0x66, 0x76, 0xc9, 0x68, 0x67, 0xf4, 0x0, - 0x0, 0x20, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x1b, 0x20, - 0x17, 0x66, 0x6e, 0x66, 0x6a, 0x76, 0x66, 0x40, - 0x0, 0x0, 0x96, 0x0, 0x0, 0x94, 0x0, 0x0, - 0x0, 0x9, 0x96, 0x66, 0x66, 0x9e, 0xc7, 0x40, - 0x4, 0x71, 0x1, 0xd0, 0x0, 0xa4, 0x3c, 0x80, - 0x11, 0x0, 0x6, 0x80, 0x0, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x10, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0xa5, 0x1, 0x1, 0xd0, 0x0, 0x0, - 0x0, 0x49, 0x30, 0x1, 0x9f, 0x80, 0x0, 0x0, - 0x3, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - - /* U+523B "刻" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x1, 0xd0, - 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, 0xc0, - 0x5, 0x66, 0x6b, 0x66, 0xb9, 0xa, 0x20, 0xc0, - 0x1, 0x10, 0x7a, 0x0, 0x0, 0xd, 0x0, 0xc0, - 0x0, 0x1, 0xc1, 0x7, 0x10, 0xd, 0x0, 0xc0, - 0x0, 0x9, 0x20, 0x2e, 0x30, 0xd, 0x0, 0xc0, - 0x0, 0xab, 0x75, 0xc4, 0x0, 0xd, 0x0, 0xc0, - 0x0, 0x21, 0x7, 0x80, 0xc3, 0xd, 0x0, 0xc0, - 0x0, 0x0, 0x68, 0x8, 0xa0, 0xd, 0x0, 0xc0, - 0x0, 0x7, 0x60, 0x5c, 0x0, 0xd, 0x0, 0xc0, - 0x2, 0x72, 0x3, 0xe3, 0x0, 0xb, 0x0, 0xc0, - 0x3, 0x0, 0x4b, 0x1a, 0x60, 0x0, 0x0, 0xc0, - 0x0, 0x7, 0x70, 0x1, 0xf1, 0x0, 0x1, 0xc0, - 0x4, 0x71, 0x0, 0x0, 0x50, 0x2, 0x8f, 0x90, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, - - /* U+5247 "則" */ - 0x0, 0x20, 0x0, 0x4, 0x0, 0x0, 0x9, 0x20, - 0xe, 0x66, 0x66, 0xe2, 0x0, 0x0, 0xc0, 0x0, - 0xd0, 0x0, 0xd, 0x0, 0x60, 0xc, 0x0, 0xd, - 0x66, 0x66, 0xd0, 0xd, 0x0, 0xc0, 0x0, 0xd0, - 0x0, 0xd, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, - 0x0, 0xd0, 0xd, 0x0, 0xc0, 0x0, 0xd6, 0x66, - 0x6d, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, 0x0, - 0xd0, 0xd, 0x0, 0xc0, 0x0, 0xd6, 0x66, 0x6e, - 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, 0x0, 0xc0, - 0xd, 0x0, 0xc0, 0x0, 0x19, 0x22, 0x40, 0x0, - 0x40, 0xc, 0x0, 0x4, 0xb1, 0x8, 0x60, 0x0, - 0x0, 0xc0, 0x0, 0x90, 0x0, 0xd, 0x60, 0x0, - 0xd, 0x0, 0x70, 0x0, 0x0, 0x49, 0x1, 0x7e, - 0xd0, 0x11, 0x0, 0x0, 0x0, 0x10, 0x0, 0x21, - 0x0, - - /* U+524A "削" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xd1, 0x0, 0x0, 0x0, 0x82, 0x26, 0x0, - 0xd0, 0x1d, 0x0, 0x0, 0xd0, 0x9, 0x80, 0xd0, - 0x83, 0x1, 0x0, 0xd0, 0x1, 0xb0, 0xd2, 0x40, - 0xd, 0x20, 0xd0, 0x9, 0x66, 0xe6, 0x6a, 0xd, - 0x0, 0xd0, 0xe, 0x0, 0x0, 0x3a, 0xd, 0x0, - 0xd0, 0xe, 0x0, 0x0, 0x3a, 0xd, 0x0, 0xd0, - 0xe, 0x66, 0x66, 0x8a, 0xd, 0x0, 0xd0, 0xe, - 0x0, 0x0, 0x3a, 0xd, 0x0, 0xd0, 0xe, 0x66, - 0x66, 0x8a, 0xd, 0x0, 0xd0, 0xe, 0x0, 0x0, - 0x3a, 0xd, 0x0, 0xd0, 0xe, 0x0, 0x0, 0x3a, - 0x3, 0x0, 0xd0, 0xe, 0x0, 0x12, 0x6a, 0x0, - 0x21, 0xe0, 0xe, 0x0, 0x16, 0xf5, 0x0, 0x5e, - 0xc0, 0x3, 0x0, 0x0, 0x20, 0x0, 0x2, 0x10, - - /* U+524D "前" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x27, 0x0, 0x0, 0x56, 0x0, 0x0, 0x0, - 0x0, 0xa8, 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, - 0x3, 0x60, 0x4, 0x30, 0x8, 0x50, 0x57, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x65, 0x0, 0x12, 0x0, - 0x5, 0x0, 0x0, 0xa4, 0x0, 0x2, 0xc6, 0x67, - 0xc0, 0x1b, 0xc, 0x10, 0x0, 0x2a, 0x0, 0x2b, - 0x1, 0xc0, 0xc1, 0x0, 0x2, 0xc6, 0x67, 0xb0, - 0x1c, 0xc, 0x10, 0x0, 0x2a, 0x0, 0x2b, 0x1, - 0xc0, 0xc1, 0x0, 0x2, 0xc6, 0x67, 0xb0, 0x1c, - 0xc, 0x10, 0x0, 0x2a, 0x0, 0x2b, 0x1, 0xc0, - 0xc1, 0x0, 0x2, 0xa0, 0x2, 0xb0, 0x18, 0xc, - 0x10, 0x0, 0x2a, 0x0, 0x3a, 0x1, 0x54, 0xe0, - 0x0, 0x3, 0xa0, 0x3d, 0x70, 0x2, 0xda, 0x0, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, - - /* U+525B "剛" */ - 0x30, 0x0, 0x0, 0x5, 0x0, 0x0, 0x81, 0xd6, - 0x66, 0x66, 0x6e, 0x30, 0x0, 0xd0, 0xd0, 0x81, - 0xb, 0xd, 0x0, 0x30, 0xd0, 0xd0, 0x4a, 0x36, - 0xd, 0x0, 0xd0, 0xd0, 0xd2, 0x47, 0x78, 0x4d, - 0x0, 0xc0, 0xd0, 0xd1, 0x32, 0xb2, 0x1d, 0x0, - 0xc0, 0xd0, 0xd0, 0x10, 0xa2, 0xd, 0x0, 0xc0, - 0xd0, 0xd0, 0xc0, 0xaa, 0x2d, 0x0, 0xc0, 0xd0, - 0xd0, 0xb0, 0xaa, 0x1d, 0x0, 0xc0, 0xd0, 0xd0, - 0xb0, 0xaa, 0x1d, 0x0, 0xc0, 0xd0, 0xd1, 0xb6, - 0x8c, 0xd, 0x0, 0x50, 0xd0, 0xd0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0xd0, 0xd0, 0x0, 0x0, 0xd, - 0x0, 0x10, 0xe0, 0xc0, 0x0, 0x6, 0xcd, 0x0, - 0x5d, 0xc0, 0x10, 0x0, 0x0, 0x42, 0x0, 0x1, - 0x20, - - /* U+5272 "割" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, 0x92, 0x2, - 0x10, 0x37, 0x0, 0x30, 0x0, 0xc, 0x0, 0x86, - 0x67, 0x86, 0x6d, 0x50, 0x40, 0xc0, 0x2b, 0x0, - 0x2d, 0x2, 0x20, 0x1d, 0xc, 0x0, 0x36, 0x67, - 0xd6, 0x88, 0x0, 0xc0, 0xc0, 0x0, 0x0, 0x1b, - 0x0, 0x0, 0xc, 0xc, 0x0, 0x16, 0x66, 0xd6, - 0xa3, 0x0, 0xc0, 0xc0, 0x0, 0x0, 0x1b, 0x0, - 0x11, 0xc, 0xc, 0x1, 0x86, 0x67, 0xd6, 0x68, - 0x80, 0xc0, 0xc0, 0x0, 0x10, 0x17, 0x3, 0x0, - 0x1c, 0xc, 0x0, 0xd, 0x66, 0x66, 0xe1, 0x1, - 0x70, 0xc0, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, - 0xc, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0xc0, 0x0, 0xd6, 0x66, 0x6d, 0x0, 0x17, 0xbe, - 0x0, 0x4, 0x0, 0x0, 0x10, 0x0, 0x2, 0x30, - - /* U+5275 "創" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x1, 0x90, - 0x0, 0x0, 0x5b, 0x62, 0x0, 0x0, 0x0, 0xb0, - 0x0, 0x0, 0xc3, 0xa, 0xa0, 0x1, 0x0, 0xb0, - 0x0, 0x9, 0x35, 0x70, 0xb2, 0x2c, 0x0, 0xb0, - 0x0, 0x65, 0x0, 0xb0, 0x0, 0x1a, 0x0, 0xb0, - 0x5, 0x3b, 0x66, 0x66, 0xd0, 0x1a, 0x0, 0xb0, - 0x1, 0xc, 0x0, 0x0, 0xc0, 0x1a, 0x0, 0xb0, - 0x0, 0xd, 0x66, 0x66, 0xc0, 0x1a, 0x0, 0xb0, - 0x0, 0xd, 0x66, 0x66, 0xc0, 0x1a, 0x0, 0xb0, - 0x0, 0x1c, 0x0, 0x0, 0x20, 0x1a, 0x0, 0xb0, - 0x0, 0x4e, 0x76, 0x66, 0xc2, 0x13, 0x0, 0xb0, - 0x0, 0x99, 0x50, 0x0, 0xc0, 0x0, 0x0, 0xb0, - 0x1, 0x97, 0x50, 0x0, 0xc0, 0x0, 0x2, 0xb0, - 0x7, 0x17, 0x96, 0x66, 0xd0, 0x3, 0x9f, 0x80, - 0x12, 0x2, 0x0, 0x0, 0x10, 0x0, 0x3, 0x0, - - /* U+5283 "劃" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x1, 0x80, - 0x0, 0x46, 0x6d, 0x66, 0xa0, 0x0, 0x1, 0xa0, - 0x0, 0x11, 0xc, 0x0, 0xc2, 0x1, 0x1, 0xa0, - 0x6, 0x76, 0x6d, 0x66, 0xd8, 0x2d, 0x1, 0xa0, - 0x0, 0x35, 0x5d, 0x55, 0xc0, 0xc, 0x1, 0xa0, - 0x0, 0x12, 0x1c, 0x12, 0x50, 0xc, 0x1, 0xa0, - 0x0, 0x47, 0x6d, 0x66, 0x52, 0xc, 0x1, 0xa0, - 0x6, 0x76, 0x69, 0x66, 0x69, 0x1c, 0x1, 0xa0, - 0x0, 0x96, 0x68, 0x66, 0xb0, 0xc, 0x1, 0xa0, - 0x0, 0xc0, 0xc, 0x0, 0xc0, 0xd, 0x1, 0xa0, - 0x0, 0xc6, 0x6d, 0x66, 0xc0, 0x5, 0x1, 0xa0, - 0x0, 0xc6, 0x6d, 0x66, 0xc0, 0x0, 0x1, 0xa0, - 0x0, 0x50, 0x0, 0x0, 0x62, 0x0, 0x2, 0xa0, - 0x5, 0x9a, 0x98, 0x75, 0x31, 0x4, 0xaf, 0x80, - 0x3, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, - - /* U+529B "力" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x20, 0x0, 0x3, 0x0, 0x6, 0x66, - 0x66, 0xf6, 0x66, 0x66, 0xf4, 0x0, 0x0, 0x0, - 0x1d, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x4, - 0xa0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x95, - 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x1d, 0x0, - 0x0, 0x5, 0xa0, 0x0, 0x0, 0x8, 0x70, 0x0, - 0x0, 0x69, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, - 0x9, 0x70, 0x0, 0x1, 0xc1, 0x0, 0x0, 0x0, - 0xc4, 0x0, 0x1, 0xb2, 0x0, 0x2, 0x74, 0x6e, - 0x0, 0x3, 0x81, 0x0, 0x0, 0x1, 0xdf, 0x50, - 0x1, 0x30, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, - - /* U+529F "功" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x46, - 0x66, 0x6a, 0x70, 0xd, 0x0, 0x0, 0x1, 0x10, - 0xd0, 0x0, 0x0, 0xd0, 0x1, 0x0, 0x0, 0xd, - 0x0, 0x56, 0x6e, 0x66, 0xb8, 0x0, 0x0, 0xd0, - 0x0, 0x2, 0xb0, 0x8, 0x50, 0x0, 0xd, 0x0, - 0x0, 0x49, 0x0, 0x94, 0x0, 0x0, 0xd0, 0x0, - 0x7, 0x60, 0xa, 0x30, 0x0, 0xd, 0x0, 0x0, - 0xb3, 0x0, 0xb2, 0x0, 0x0, 0xd5, 0x64, 0x1c, - 0x0, 0xc, 0x10, 0x59, 0xc8, 0x20, 0x8, 0x50, - 0x0, 0xd0, 0x8, 0x60, 0x0, 0x4, 0xa0, 0x0, - 0xe, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x24, 0x24, - 0xc0, 0x0, 0x0, 0x6, 0x60, 0x0, 0x3c, 0xf6, - 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x4, 0x0, - - /* U+52A0 "加" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2b, 0x0, 0x0, 0x20, 0x0, 0x20, 0x6, 0x67, - 0xd6, 0x6d, 0x1c, 0x66, 0x6c, 0x50, 0x0, 0x3a, - 0x0, 0xd0, 0xc0, 0x0, 0xa2, 0x0, 0x4, 0xa0, - 0xc, 0xc, 0x0, 0xa, 0x20, 0x0, 0x48, 0x0, - 0xc0, 0xc0, 0x0, 0xa2, 0x0, 0x6, 0x70, 0xb, - 0xc, 0x0, 0xa, 0x20, 0x0, 0x84, 0x1, 0xb0, - 0xc0, 0x0, 0xa2, 0x0, 0xb, 0x0, 0x29, 0xc, - 0x0, 0xa, 0x20, 0x2, 0xa0, 0x4, 0x80, 0xc0, - 0x0, 0xa2, 0x0, 0x92, 0x0, 0x76, 0xc, 0x66, - 0x6c, 0x30, 0x36, 0x18, 0xbe, 0x10, 0xc0, 0x0, - 0xa3, 0x6, 0x0, 0x6, 0x30, 0xb, 0x0, 0x5, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+52A8 "动" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x0, 0xd, 0x0, 0x0, 0x4, - 0x76, 0x66, 0x92, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x21, 0x0, 0x0, - 0x0, 0x2, 0x66, 0xe6, 0x6b, 0x70, 0x66, 0x67, - 0x67, 0xb1, 0xc, 0x0, 0x84, 0x0, 0x6, 0xd0, - 0x0, 0x0, 0xc0, 0x9, 0x40, 0x0, 0xc3, 0x0, - 0x0, 0x29, 0x0, 0x93, 0x0, 0x47, 0x5, 0x40, - 0x6, 0x60, 0xa, 0x30, 0x9, 0x0, 0xc, 0x30, - 0xa1, 0x0, 0xb2, 0x9, 0x56, 0x76, 0x8b, 0x2a, - 0x0, 0xb, 0x20, 0xc9, 0x40, 0x0, 0x7a, 0x10, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x6, 0x30, 0x31, - 0x2e, 0x0, 0x0, 0x0, 0x6, 0x30, 0x1, 0xaf, - 0x70, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x30, - 0x0, - - /* U+52A9 "助" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, - 0x0, 0xa6, 0x66, 0xc2, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0xd2, 0x86, 0xe6, 0x67, 0xd0, - 0x0, 0xd6, 0x66, 0xd0, 0x0, 0xd0, 0x1, 0xb0, - 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xe0, 0x2, 0xb0, - 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xe0, 0x2, 0xa0, - 0x0, 0xd6, 0x66, 0xd0, 0x2, 0xc0, 0x3, 0xa0, - 0x0, 0xd0, 0x0, 0xd0, 0x6, 0x80, 0x3, 0x90, - 0x0, 0xd0, 0x0, 0xd1, 0x2c, 0x10, 0x4, 0x80, - 0x0, 0xd5, 0x87, 0x73, 0x76, 0x0, 0x6, 0x70, - 0x1f, 0xb6, 0x10, 0x5, 0x70, 0x35, 0x5d, 0x30, - 0x2, 0x0, 0x0, 0x64, 0x0, 0x3, 0xd8, 0x0, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+52AA "努" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xb0, 0x11, 0x76, 0x66, 0x98, 0x0, - 0x7, 0x6a, 0x96, 0xc6, 0x24, 0x0, 0xb5, 0x0, - 0x0, 0xb, 0x0, 0xd0, 0x7, 0x3, 0xb0, 0x0, - 0x0, 0x48, 0x4, 0x90, 0x2, 0x9c, 0x10, 0x0, - 0x0, 0x15, 0x8e, 0x60, 0x0, 0xbc, 0x10, 0x0, - 0x0, 0x1, 0xa5, 0xb7, 0x1a, 0x43, 0xd7, 0x30, - 0x0, 0x57, 0x10, 0x28, 0x60, 0x0, 0x18, 0x80, - 0x15, 0x10, 0x0, 0x1b, 0x70, 0x0, 0x10, 0x0, - 0x0, 0x37, 0x66, 0x6e, 0x76, 0x66, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0xc3, 0x0, 0x3, 0xc0, 0x0, - 0x0, 0x0, 0x1b, 0x60, 0x11, 0x7, 0x90, 0x0, - 0x0, 0x16, 0x92, 0x0, 0x7, 0xef, 0x20, 0x0, - 0x3, 0x41, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, - - /* U+52B3 "劳" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x50, 0x1, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x20, 0x1, 0xc0, 0x4, 0x10, - 0x7, 0x66, 0x6c, 0x76, 0x66, 0xd6, 0x6a, 0x80, - 0x0, 0x0, 0xa, 0x20, 0x1, 0xc0, 0x0, 0x0, - 0x0, 0x30, 0x5, 0x10, 0x0, 0x30, 0x2, 0x0, - 0x0, 0xa6, 0x66, 0x66, 0x66, 0x66, 0x6e, 0x70, - 0x5, 0xb0, 0x0, 0x4b, 0x0, 0x0, 0x26, 0x0, - 0x2, 0x10, 0x0, 0x5b, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x67, 0x66, 0x9b, 0x66, 0x6a, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x95, 0x0, 0x8, 0x60, 0x0, - 0x0, 0x0, 0x0, 0xe1, 0x0, 0xa, 0x50, 0x0, - 0x0, 0x0, 0x8, 0x90, 0x0, 0xc, 0x20, 0x0, - 0x0, 0x0, 0x7a, 0x0, 0x32, 0x2e, 0x0, 0x0, - 0x0, 0x39, 0x50, 0x0, 0x19, 0xf7, 0x0, 0x0, - 0x5, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - - /* U+52C9 "勉" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, - 0x2b, 0x1, 0x30, 0x0, 0xc0, 0x0, 0x0, 0xa, - 0x76, 0xbc, 0x0, 0xc, 0x0, 0x0, 0x3, 0x90, - 0x9, 0x0, 0x0, 0xc0, 0x5, 0x0, 0x8b, 0x69, - 0x86, 0xd5, 0x5d, 0x55, 0xd1, 0x20, 0xc0, 0x94, - 0xc, 0x0, 0xb0, 0xc, 0x0, 0xc, 0x9, 0x30, - 0xc0, 0xb, 0x0, 0xc0, 0x0, 0xc5, 0xc6, 0x5d, - 0x2, 0x90, 0xc, 0x0, 0x8, 0x1c, 0xd1, 0x70, - 0x74, 0x0, 0xc0, 0x0, 0x2, 0xac, 0x0, 0xb, - 0x0, 0xb, 0x0, 0x0, 0x74, 0xc0, 0x7, 0x40, - 0x79, 0xa1, 0x0, 0x1b, 0xc, 0x3, 0x50, 0x0, - 0xa5, 0x20, 0x9, 0x10, 0xc0, 0x20, 0x0, 0x0, - 0x57, 0x7, 0x20, 0x8, 0xba, 0xaa, 0xaa, 0xac, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+52D5 "動" */ - 0x0, 0x0, 0x0, 0x25, 0x0, 0x17, 0x0, 0x0, - 0x0, 0x46, 0x9a, 0xa8, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, - 0x7, 0x66, 0xc6, 0x69, 0x81, 0x2b, 0x11, 0x61, - 0x0, 0x10, 0xb1, 0x3, 0x7, 0x6c, 0x55, 0xd3, - 0x2, 0xc6, 0xc6, 0x6d, 0x10, 0x2a, 0x0, 0xc0, - 0x1, 0xc6, 0xc6, 0x6d, 0x0, 0x48, 0x0, 0xc0, - 0x1, 0xa0, 0xb1, 0xc, 0x0, 0x66, 0x0, 0xc0, - 0x1, 0xc6, 0xc6, 0x6d, 0x0, 0xa2, 0x0, 0xc0, - 0x1, 0x40, 0xb1, 0x5, 0x0, 0xc0, 0x0, 0xc0, - 0x3, 0x66, 0xc6, 0x6c, 0x24, 0x70, 0x2, 0xa0, - 0x0, 0x10, 0xb1, 0x0, 0xa, 0x0, 0x5, 0x80, - 0x0, 0x13, 0xc8, 0x65, 0x74, 0x15, 0x3b, 0x40, - 0x9, 0xc7, 0x20, 0x3, 0x50, 0x2, 0xdb, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x20, 0x0, - - /* U+52D9 "務" */ - 0x0, 0x0, 0x0, 0x20, 0xb, 0x0, 0x0, 0x0, - 0x5, 0x76, 0x68, 0xe1, 0x5d, 0x66, 0x86, 0x0, - 0x0, 0x14, 0x18, 0x10, 0xa4, 0x0, 0xb4, 0x0, - 0x0, 0x6, 0xd0, 0x4, 0x37, 0x3, 0xa0, 0x0, - 0x0, 0x0, 0x95, 0x2, 0x1, 0xac, 0x10, 0x0, - 0x6, 0x76, 0x86, 0xa2, 0x1, 0xbc, 0x20, 0x0, - 0x0, 0x8, 0xf1, 0x91, 0x3a, 0x12, 0xda, 0x51, - 0x0, 0xc, 0xc1, 0x27, 0x58, 0x50, 0x6, 0x60, - 0x0, 0x56, 0xc1, 0x35, 0x6c, 0x86, 0x76, 0x0, - 0x0, 0xa0, 0xc1, 0x1, 0xc, 0x0, 0x76, 0x0, - 0x6, 0x20, 0xc1, 0x0, 0x49, 0x0, 0x84, 0x0, - 0x13, 0x0, 0xc1, 0x0, 0xb2, 0x0, 0xa2, 0x0, - 0x0, 0x32, 0xd0, 0x7, 0x60, 0x10, 0xd0, 0x0, - 0x0, 0x3b, 0xc0, 0x74, 0x0, 0x7e, 0xa0, 0x0, - 0x0, 0x1, 0x2, 0x0, 0x0, 0x3, 0x0, 0x0, - - /* U+52DD "勝" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x96, 0x6a, 0x13, 0x3, 0xc0, 0x45, 0x0, - 0x0, 0xc0, 0xc, 0x9, 0x53, 0xa0, 0xb4, 0x0, - 0x0, 0xc0, 0xc, 0x1, 0xa4, 0x86, 0x10, 0x0, - 0x0, 0xc0, 0xc, 0x7, 0x69, 0xa6, 0x8a, 0x0, - 0x0, 0xd6, 0x6c, 0x0, 0xa, 0x20, 0x1, 0x10, - 0x0, 0xc0, 0xc, 0x76, 0x6d, 0x76, 0x69, 0x80, - 0x0, 0xc0, 0xc, 0x0, 0x76, 0x7, 0x10, 0x0, - 0x0, 0xc3, 0x3c, 0x4, 0x88, 0x51, 0xb6, 0x10, - 0x0, 0xc3, 0x3c, 0x46, 0xa, 0x20, 0x4a, 0xc2, - 0x0, 0xa0, 0xc, 0x17, 0x6d, 0x66, 0xc3, 0x0, - 0x3, 0x80, 0xc, 0x0, 0x1a, 0x0, 0xb0, 0x0, - 0x5, 0x40, 0xc, 0x0, 0x93, 0x0, 0xc0, 0x0, - 0x7, 0x0, 0xc, 0x4, 0x70, 0x0, 0xc0, 0x0, - 0x6, 0x6, 0xe9, 0x46, 0x1, 0x8d, 0x80, 0x0, - 0x10, 0x0, 0x32, 0x20, 0x0, 0x5, 0x0, 0x0, - - /* U+52E4 "勤" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0xa0, 0x0, 0x3c, 0x0, 0x0, - 0x5, 0x6e, 0x66, 0xc7, 0xd2, 0x3a, 0x0, 0x0, - 0x1, 0xd, 0x0, 0x90, 0x0, 0x39, 0x0, 0x0, - 0x0, 0xe, 0x67, 0xb0, 0x0, 0x39, 0x0, 0x20, - 0x0, 0x14, 0x1a, 0x22, 0x28, 0x8b, 0x66, 0xe0, - 0x0, 0xd6, 0x6c, 0x6d, 0x40, 0x48, 0x1, 0xb0, - 0x0, 0xd0, 0x1a, 0xc, 0x0, 0x48, 0x1, 0xb0, - 0x0, 0xe6, 0x6c, 0x6d, 0x0, 0x56, 0x2, 0xb0, - 0x0, 0x40, 0x1a, 0x6, 0x20, 0x75, 0x2, 0xa0, - 0x1, 0x76, 0x6c, 0x66, 0x50, 0xb1, 0x3, 0x90, - 0x0, 0x56, 0x6c, 0x6b, 0x41, 0xb0, 0x4, 0x80, - 0x0, 0x10, 0x1a, 0x0, 0x8, 0x40, 0x6, 0x70, - 0x0, 0x13, 0x6c, 0x65, 0x78, 0x5, 0x5d, 0x40, - 0xb, 0xb7, 0x30, 0x3, 0x60, 0x1, 0xc9, 0x0, - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, - - /* U+52F5 "勵" */ - 0x2, 0x0, 0x0, 0x1, 0x50, 0x38, 0x0, 0x0, - 0x9, 0x76, 0x76, 0x66, 0x61, 0x3a, 0x0, 0x0, - 0x9, 0x20, 0xb0, 0x44, 0x10, 0x39, 0x0, 0x0, - 0x8, 0x77, 0xc6, 0x88, 0x80, 0x29, 0x0, 0x30, - 0x8, 0x20, 0x30, 0x22, 0x28, 0x8b, 0x66, 0xd0, - 0x8, 0x2b, 0x6a, 0x6c, 0x20, 0x48, 0x0, 0xc0, - 0x8, 0x1b, 0x6c, 0x6c, 0x0, 0x56, 0x0, 0xc0, - 0x9, 0x1b, 0xb, 0xa, 0x0, 0x74, 0x0, 0xc0, - 0xa, 0x9, 0x6c, 0x69, 0x0, 0xa2, 0x0, 0xb0, - 0xa, 0x36, 0x6c, 0x66, 0x60, 0xc0, 0x1, 0xa0, - 0x9, 0x55, 0xb, 0x12, 0xa1, 0xa0, 0x2, 0x90, - 0x7, 0x56, 0x5c, 0x68, 0x97, 0x40, 0x4, 0x80, - 0x31, 0x55, 0x50, 0x6, 0x99, 0x4, 0x2a, 0x40, - 0x30, 0x55, 0x0, 0x1c, 0xa1, 0x1, 0xcb, 0x0, - 0x0, 0x11, 0x0, 0x0, 0x30, 0x0, 0x10, 0x0, - - /* U+5305 "包" */ - 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4d, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc9, 0x66, 0x66, 0x66, 0xc3, 0x0, - 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x1b, 0x10, 0x0, 0x1, 0x0, 0xd0, 0x0, - 0x0, 0x94, 0xc6, 0x66, 0x6d, 0x0, 0xd0, 0x0, - 0x6, 0x21, 0xb0, 0x0, 0xc, 0x0, 0xe0, 0x0, - 0x1, 0x1, 0xb0, 0x0, 0xc, 0x0, 0xe0, 0x0, - 0x0, 0x1, 0xd6, 0x66, 0x6a, 0x0, 0xd0, 0x0, - 0x0, 0x1, 0xb0, 0x0, 0x5, 0x25, 0xb0, 0x10, - 0x0, 0x1, 0xb0, 0x0, 0x0, 0x6e, 0x40, 0x60, - 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x80, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xe1, - 0x0, 0x0, 0x7c, 0xbb, 0xcc, 0xcc, 0xde, 0xa0, - - /* U+5316 "化" */ - 0x0, 0x0, 0x63, 0x0, 0x82, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x30, 0xd, 0x20, 0x0, 0x0, 0x0, - 0x4, 0xb0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0xb4, 0x0, 0xc, 0x10, 0x9, 0x10, 0x0, 0x3e, - 0x10, 0x0, 0xc1, 0x8, 0xb2, 0x0, 0xb, 0xe4, - 0x0, 0xc, 0x15, 0xc0, 0x0, 0x3, 0x7b, 0x20, - 0x0, 0xc5, 0xc1, 0x0, 0x0, 0x80, 0xb2, 0x0, - 0xc, 0xb0, 0x0, 0x0, 0x30, 0xb, 0x20, 0x8, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb2, 0x19, 0x3c, - 0x10, 0x0, 0x0, 0x0, 0xb, 0x45, 0x0, 0xc1, - 0x0, 0x6, 0x0, 0x0, 0xb2, 0x0, 0xc, 0x10, - 0x0, 0x71, 0x0, 0xb, 0x20, 0x0, 0xc2, 0x0, - 0x9, 0x70, 0x0, 0xc2, 0x0, 0x6, 0xed, 0xdd, - 0xe6, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5317 "北" */ - 0x0, 0x0, 0xa, 0x40, 0x1a, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0xd0, 0x0, 0x60, 0x5, 0x66, - 0x6d, 0x10, 0xd, 0x0, 0xbc, 0x20, 0x0, 0x0, - 0xc1, 0x0, 0xd2, 0xa5, 0x0, 0x0, 0x0, 0xc, - 0x10, 0xe, 0x50, 0x0, 0x0, 0x0, 0x0, 0xc1, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, - 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, - 0xd0, 0x0, 0x10, 0x0, 0x0, 0x4d, 0x10, 0xd, - 0x0, 0x5, 0x1, 0x6a, 0x92, 0xc1, 0x0, 0xd0, - 0x0, 0x61, 0xa, 0x20, 0xc, 0x10, 0xe, 0x0, - 0x9, 0x60, 0x0, 0x0, 0xd2, 0x0, 0xbe, 0xdd, - 0xe6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+533B "医" */ - 0x1, 0x0, 0x0, 0x0, 0x0, 0x3, 0x40, 0x1, - 0xd6, 0x66, 0x76, 0x66, 0x66, 0x99, 0x0, 0xd, - 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x2, 0xb0, 0x0, 0x5, 0x10, 0x0, 0xd, 0x0, - 0x78, 0x6b, 0x66, 0x85, 0x0, 0x0, 0xd0, 0x9, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0xd, 0x6, 0x0, - 0xe, 0x0, 0x0, 0x10, 0x0, 0xd2, 0x76, 0x66, - 0xe6, 0x66, 0x6e, 0x30, 0xd, 0x0, 0x0, 0x3b, - 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x9, 0x88, - 0x40, 0x0, 0x0, 0xd, 0x0, 0x4, 0xa0, 0x8, - 0xd4, 0x0, 0x0, 0xd0, 0x5, 0x90, 0x0, 0x5, - 0xf1, 0x0, 0xd, 0x16, 0x30, 0x0, 0x0, 0x4, - 0x51, 0x2, 0xd6, 0x66, 0x66, 0x66, 0x66, 0x6a, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5340 "區" */ - 0x3, 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0xe, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, 0xd, 0x0, - 0x18, 0x66, 0x69, 0x40, 0x0, 0xd, 0x0, 0x1a, - 0x0, 0x8, 0x40, 0x0, 0xd, 0x0, 0x1a, 0x0, - 0x8, 0x40, 0x0, 0xd, 0x0, 0x1c, 0x66, 0x6b, - 0x40, 0x0, 0xd, 0x0, 0x3, 0x0, 0x3, 0x0, - 0x0, 0xd, 0x7, 0x66, 0x90, 0x86, 0x69, 0x0, - 0xd, 0xd, 0x0, 0xb0, 0xc0, 0xc, 0x0, 0xd, - 0xd, 0x0, 0xb0, 0xc0, 0xc, 0x0, 0xd, 0xd, - 0x0, 0xb0, 0xc0, 0xc, 0x0, 0xd, 0xd, 0x66, - 0xb0, 0xd6, 0x6c, 0x0, 0xd, 0x3, 0x0, 0x10, - 0x20, 0x1, 0x10, 0x1e, 0x66, 0x66, 0x66, 0x66, - 0x67, 0xf3, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5341 "十" */ - 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0xa, 0x30, - 0x28, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x66, 0x50, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, - - /* U+5343 "千" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x69, 0xcc, 0xa8, 0x30, 0x0, - 0x0, 0x25, 0x54, 0x2c, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x7, 0x10, - 0x27, 0x66, 0x66, 0x6d, 0x86, 0x66, 0x69, 0x60, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, - - /* U+5348 "午" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8b, 0x66, 0x66, 0x66, 0xca, 0x0, 0x0, 0x1b, - 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x8, 0x10, - 0x0, 0xa4, 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, - 0xa, 0x40, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0xa4, 0x0, 0x0, 0x20, 0x16, 0x66, 0x66, 0x6c, - 0x86, 0x66, 0x6e, 0x60, 0x10, 0x0, 0x0, 0xa4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - - /* U+534A "半" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0xc, 0x10, 0x8, 0x70, 0x0, - 0x0, 0x7, 0x70, 0xc, 0x10, 0x2d, 0x30, 0x0, - 0x0, 0x0, 0xb9, 0xc, 0x10, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x39, 0xc, 0x16, 0x10, 0x0, 0x0, - 0x1, 0x66, 0x66, 0x6d, 0x66, 0x66, 0xd7, 0x0, - 0x0, 0x20, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x8, 0x20, - 0x7, 0x66, 0x66, 0x6d, 0x66, 0x66, 0x68, 0x60, - 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, - - /* U+5352 "卒" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x0, 0x4, 0x50, 0x0, 0x67, - 0x69, 0x66, 0x66, 0x86, 0x66, 0x0, 0x0, 0x0, - 0xe3, 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, 0x69, - 0x0, 0x5, 0xb0, 0x0, 0x0, 0x0, 0xb, 0x69, - 0x0, 0xb5, 0x91, 0x0, 0x0, 0x7, 0x40, 0xa5, - 0x83, 0x5, 0xe0, 0x0, 0x3, 0x50, 0x2, 0x77, - 0x0, 0xa, 0x0, 0x0, 0x20, 0x0, 0x1, 0xe1, - 0x0, 0x3, 0x50, 0x67, 0x66, 0x66, 0x6e, 0x66, - 0x66, 0x88, 0x10, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, - - /* U+5354 "協" */ - 0x0, 0x9, 0x10, 0x0, 0x6, 0x60, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x9, 0x40, 0x3, 0x0, - 0x0, 0xd, 0x0, 0x37, 0x6d, 0x66, 0x6d, 0x40, - 0x0, 0xd, 0x0, 0x0, 0x39, 0x0, 0xb, 0x0, - 0x6, 0x6e, 0x6b, 0x21, 0xa1, 0x0, 0x48, 0x0, - 0x1, 0xd, 0x0, 0x57, 0x0, 0x4a, 0xd1, 0x0, - 0x0, 0xd, 0x3, 0x23, 0x0, 0x2, 0x40, 0x0, - 0x0, 0xd, 0x1, 0x4b, 0x14, 0x0, 0xe0, 0x40, - 0x0, 0xd, 0x6, 0x99, 0x5c, 0x58, 0xd6, 0xc2, - 0x0, 0xd, 0x0, 0x83, 0xb, 0x3, 0x90, 0xa0, - 0x0, 0xd, 0x0, 0xb0, 0xb, 0x7, 0x60, 0xb0, - 0x0, 0xd, 0x2, 0x80, 0x29, 0xc, 0x10, 0xb0, - 0x0, 0xd, 0x8, 0x24, 0x85, 0x47, 0x0, 0xc0, - 0x0, 0xe, 0x44, 0x4, 0xc4, 0x70, 0x6b, 0xa0, - 0x0, 0x5, 0x20, 0x0, 0x13, 0x0, 0x5, 0x10, - - /* U+5357 "南" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x20, 0x0, 0x5, 0x1, 0x76, - 0x66, 0x66, 0xe6, 0x66, 0x68, 0xc4, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x8, 0x66, - 0x66, 0xe6, 0x66, 0x6a, 0x40, 0x0, 0xb1, 0x3, - 0x0, 0x8, 0x0, 0xb2, 0x0, 0xb, 0x10, 0x3c, - 0x3, 0xa0, 0xb, 0x20, 0x0, 0xb1, 0x0, 0x90, - 0x71, 0x60, 0xb2, 0x0, 0xb, 0x16, 0x76, 0xd6, - 0x67, 0x1b, 0x20, 0x0, 0xb1, 0x0, 0xc, 0x0, - 0x61, 0xb2, 0x0, 0xb, 0x38, 0x66, 0xd6, 0x66, - 0x4b, 0x20, 0x0, 0xb1, 0x0, 0xc, 0x0, 0x0, - 0xb2, 0x0, 0xb, 0x10, 0x0, 0xc0, 0x23, 0x2d, - 0x10, 0x0, 0xc1, 0x0, 0xa, 0x0, 0x5e, 0xc0, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - - /* U+5358 "単" */ - 0x0, 0x3, 0x0, 0x52, 0x0, 0x67, 0x0, 0x0, - 0x0, 0x89, 0x1, 0xd1, 0xc, 0x40, 0x0, 0x0, - 0x0, 0xd3, 0xb, 0x35, 0x60, 0x0, 0x0, 0x2, - 0x89, 0x66, 0x76, 0xa6, 0xb1, 0x0, 0x0, 0x2a, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x2, 0xa0, - 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, 0x2c, 0x66, - 0x6e, 0x66, 0x6d, 0x0, 0x0, 0x2, 0xa0, 0x0, - 0xd0, 0x0, 0xd0, 0x0, 0x0, 0x2c, 0x66, 0x6e, - 0x66, 0x6d, 0x0, 0x0, 0x1, 0x40, 0x0, 0xd0, - 0x0, 0x41, 0x30, 0x37, 0x66, 0x66, 0x6e, 0x66, - 0x66, 0xac, 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, - - /* U+5371 "危" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7d, 0x66, 0x67, 0x90, 0x0, 0x0, 0x0, - 0x2c, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x1b, - 0x10, 0x0, 0x55, 0x0, 0x2, 0x0, 0x28, 0xa6, - 0x66, 0x69, 0x66, 0x69, 0xb0, 0x4, 0xb, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb2, 0xa, - 0x66, 0x66, 0xd0, 0x0, 0x0, 0xb, 0x20, 0xd0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0xb2, 0xd, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0xc, 0x10, 0xd0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0xd0, 0xd, 0x1, 0x6d, - 0xa0, 0x50, 0x0, 0x3a, 0x0, 0xd0, 0x0, 0x30, - 0x7, 0x10, 0xa, 0x20, 0xc, 0x10, 0x0, 0x0, - 0x95, 0x6, 0x30, 0x0, 0x6d, 0xcc, 0xcc, 0xce, - 0x61, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5373 "即" */ - 0x2, 0x0, 0x3, 0x0, 0x0, 0x0, 0x10, 0xe, - 0x66, 0x6e, 0x30, 0xc6, 0x66, 0xe1, 0xd, 0x0, - 0xd, 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x66, 0x6e, - 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, 0xd, 0x0, - 0xd0, 0x0, 0xd0, 0xd, 0x0, 0xd, 0x0, 0xd0, - 0x0, 0xd0, 0xd, 0x66, 0x6e, 0x0, 0xd0, 0x0, - 0xd0, 0xd, 0x0, 0x8, 0x0, 0xd0, 0x0, 0xd0, - 0xd, 0x3, 0x50, 0x0, 0xd0, 0x0, 0xd0, 0xd, - 0x0, 0x6a, 0x0, 0xd0, 0x0, 0xc0, 0xd, 0x1, - 0x5b, 0xa0, 0xd1, 0x8d, 0xa0, 0x1f, 0xa7, 0x11, - 0x90, 0xd0, 0x4, 0x0, 0x5, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, - 0x0, - - /* U+537B "卻" */ - 0x0, 0x3, 0x40, 0x61, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x60, 0x2d, 0x40, 0xa6, 0x66, 0xa1, - 0x0, 0x83, 0x0, 0x4, 0xc0, 0xd0, 0x0, 0xd0, - 0x5, 0x10, 0x3d, 0x0, 0x20, 0xd0, 0x0, 0xd0, - 0x0, 0x0, 0xb7, 0x70, 0x0, 0xd0, 0x0, 0xd0, - 0x0, 0x6, 0x60, 0x3c, 0x20, 0xd0, 0x0, 0xd0, - 0x0, 0x39, 0x0, 0x5, 0xd0, 0xd0, 0x0, 0xd0, - 0x2, 0x83, 0x0, 0x4, 0x70, 0xd0, 0x0, 0xd0, - 0x5, 0xe, 0x66, 0x6e, 0x20, 0xd0, 0x0, 0xd0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0xd0, 0x0, 0xd0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0xd1, 0x79, 0xc0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0xd0, 0x8, 0x30, - 0x0, 0xe, 0x66, 0x6e, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x9, 0x0, 0x5, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - - /* U+539A "厚" */ - 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, - 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, 0x0, - 0xd0, 0xc, 0x66, 0x66, 0x6c, 0x0, 0x0, 0xd, - 0x0, 0xd0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd0, - 0xe, 0x66, 0x66, 0x6d, 0x0, 0x0, 0xd, 0x0, - 0xe6, 0x66, 0x66, 0xd0, 0x0, 0x0, 0xd0, 0xa, - 0x0, 0x0, 0x8, 0x0, 0x0, 0xd, 0x5, 0x66, - 0x66, 0x66, 0xc2, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x13, 0x85, 0x10, 0x0, 0x2a, 0x0, 0x0, 0xc, - 0x20, 0x2, 0x50, 0x5, 0x76, 0x66, 0x66, 0xe6, - 0x66, 0x77, 0x10, 0x92, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x9, 0x0, 0x0, 0x10, 0xd0, 0x0, - 0x0, 0x5, 0x10, 0x0, 0x4, 0xdb, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, - - /* U+539F "原" */ - 0x0, 0x30, 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, - 0xe6, 0x66, 0x68, 0x96, 0x66, 0x61, 0x0, 0xe0, - 0x0, 0x8, 0x40, 0x0, 0x0, 0x0, 0xe0, 0x1a, - 0x69, 0x66, 0x6c, 0x30, 0x0, 0xe0, 0xc, 0x0, - 0x0, 0xb, 0x10, 0x0, 0xe0, 0xd, 0x66, 0x66, - 0x6d, 0x10, 0x0, 0xd0, 0xc, 0x0, 0x0, 0xb, - 0x10, 0x0, 0xd0, 0xd, 0x66, 0x66, 0x6d, 0x10, - 0x0, 0xc0, 0x7, 0x0, 0xd0, 0x6, 0x0, 0x2, - 0xa0, 0x2, 0x50, 0xd1, 0x0, 0x0, 0x4, 0x70, - 0xd, 0x80, 0xd0, 0x77, 0x0, 0x9, 0x21, 0xb4, - 0x0, 0xd0, 0x6, 0xe3, 0x18, 0x18, 0x10, 0x57, - 0xe0, 0x0, 0x6a, 0x60, 0x10, 0x0, 0x8, 0x80, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+53B3 "厳" */ - 0x0, 0x0, 0x81, 0x6, 0x20, 0xb, 0x20, 0x0, - 0x0, 0x4, 0xc0, 0x1e, 0x5, 0x70, 0x0, 0x0, - 0x52, 0x26, 0x22, 0x62, 0x62, 0x6b, 0x0, 0xb, - 0x64, 0x44, 0x44, 0x4a, 0x44, 0x41, 0x0, 0xa3, - 0x67, 0x97, 0x1, 0xd0, 0x0, 0x0, 0xa, 0x30, - 0xa, 0x14, 0x64, 0x3, 0x40, 0x0, 0xa5, 0x8c, - 0x6d, 0x5c, 0x66, 0xe5, 0x0, 0xa, 0x22, 0xc6, - 0xd4, 0x62, 0xd, 0x0, 0x0, 0xb2, 0x2a, 0xc, - 0x20, 0x62, 0xa0, 0x0, 0xc, 0x2, 0xc6, 0xd0, - 0x9, 0x75, 0x0, 0x0, 0xc0, 0x2a, 0xc, 0x0, - 0x6d, 0x0, 0x0, 0x28, 0x15, 0xc7, 0xd6, 0x27, - 0xe1, 0x0, 0x6, 0x25, 0xa4, 0xc, 0x3, 0x84, - 0xd3, 0x0, 0x60, 0x0, 0x0, 0xb3, 0x60, 0x5, - 0xd3, 0x11, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, - 0x0, - - /* U+53BB "去" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x26, - 0x66, 0x6d, 0x86, 0x6a, 0xc0, 0x0, 0x0, 0x10, - 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb3, 0x0, 0x0, 0x80, 0x8, 0x66, 0x66, 0x6d, - 0x66, 0x66, 0x7a, 0x40, 0x0, 0x0, 0x5, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x37, - 0x0, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0x3d, - 0x30, 0x0, 0x3, 0xd8, 0x77, 0x77, 0x76, 0x9f, - 0x20, 0x0, 0xb, 0x85, 0x32, 0x0, 0x0, 0xb4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+53C2 "参" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xa2, 0x1, 0x50, 0x0, 0x0, - 0x0, 0x3, 0x74, 0x0, 0x0, 0x3c, 0x60, 0x0, - 0x0, 0xd, 0xb9, 0xbc, 0x65, 0x54, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x23, 0x40, - 0x6, 0x66, 0x6a, 0xb6, 0x69, 0x66, 0x67, 0x70, - 0x0, 0x0, 0x2c, 0x1, 0x44, 0x60, 0x0, 0x0, - 0x0, 0x1, 0xb1, 0x1c, 0x90, 0x5b, 0x20, 0x0, - 0x0, 0x39, 0x12, 0xc5, 0x4, 0x13, 0xdc, 0x71, - 0x5, 0x50, 0x68, 0x10, 0x5e, 0x50, 0x6, 0x40, - 0x0, 0x16, 0x10, 0x8, 0xa1, 0x4, 0x30, 0x0, - 0x0, 0x0, 0x6, 0x93, 0x0, 0x7e, 0x60, 0x0, - 0x0, 0x15, 0x62, 0x0, 0x4c, 0x91, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x6c, 0x92, 0x0, 0x0, 0x0, - 0x1, 0x57, 0x88, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+53C3 "參" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8b, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x27, 0x30, 0x2, 0xd5, 0x0, 0x0, - 0x0, 0x0, 0x7a, 0x86, 0x43, 0x4a, 0x0, 0x0, - 0x0, 0x6, 0x80, 0x0, 0x0, 0xb4, 0x10, 0x0, - 0x0, 0xa, 0x5, 0x0, 0x19, 0x30, 0x34, 0x0, - 0x0, 0x71, 0x6, 0x52, 0x5f, 0xed, 0xbd, 0x0, - 0x1, 0xb7, 0x45, 0xbe, 0x65, 0x0, 0x9, 0x0, - 0x0, 0x0, 0x6, 0xb2, 0x36, 0x20, 0x0, 0x0, - 0x0, 0x5, 0x83, 0x7, 0xc1, 0x7b, 0xa8, 0x60, - 0x4, 0x40, 0x16, 0xa6, 0x27, 0x10, 0x37, 0x0, - 0x0, 0x25, 0x51, 0x5, 0xda, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x28, 0xa7, 0x10, 0x6c, 0x10, 0x0, - 0x0, 0x57, 0x51, 0x0, 0x4c, 0xb4, 0x10, 0x0, - 0x0, 0x0, 0x2, 0x7c, 0xa3, 0x0, 0x0, 0x0, - 0x1, 0x67, 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+53C8 "又" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x47, 0x76, 0x66, 0x66, 0x6a, 0xb0, 0x0, - 0x0, 0x0, 0x41, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x0, 0x0, 0x5, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x0, 0x0, 0x77, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x10, 0x0, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x80, 0x5, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x82, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1b, 0x97, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5b, 0x7b, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x90, 0x5, 0xd6, 0x0, 0x0, - 0x0, 0x3, 0x94, 0x0, 0x0, 0x2c, 0xe9, 0x51, - 0x2, 0x65, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x70, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+53CA "及" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x6, 0x67, 0xb6, 0x66, 0xad, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x90, 0x0, 0xa5, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x70, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x80, 0x6, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x60, 0xb, 0x86, 0xc7, 0x0, - 0x0, 0x0, 0xd, 0x16, 0x0, 0x1, 0xe1, 0x0, - 0x0, 0x0, 0x48, 0x8, 0x0, 0x8, 0x70, 0x0, - 0x0, 0x0, 0xa3, 0x3, 0x70, 0x2c, 0x0, 0x0, - 0x0, 0x1, 0xb0, 0x0, 0xa4, 0xc3, 0x0, 0x0, - 0x0, 0x9, 0x30, 0x0, 0x1f, 0x70, 0x0, 0x0, - 0x0, 0x57, 0x0, 0x1, 0xb8, 0xd3, 0x0, 0x0, - 0x2, 0x70, 0x0, 0x79, 0x20, 0x3d, 0xa4, 0x0, - 0x15, 0x3, 0x67, 0x20, 0x0, 0x0, 0x8f, 0x90, - 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+53CB "友" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x9, 0x30, - 0x6, 0x76, 0x69, 0xc6, 0x66, 0x66, 0x67, 0x50, - 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x40, 0x0, 0x2, 0x10, 0x0, - 0x0, 0x0, 0xe, 0x86, 0x66, 0x6d, 0x80, 0x0, - 0x0, 0x0, 0x4a, 0x16, 0x0, 0x1e, 0x0, 0x0, - 0x0, 0x0, 0xa4, 0x8, 0x0, 0x88, 0x0, 0x0, - 0x0, 0x2, 0xb0, 0x2, 0x91, 0xd1, 0x0, 0x0, - 0x0, 0xa, 0x30, 0x0, 0x7d, 0x50, 0x0, 0x0, - 0x0, 0x38, 0x0, 0x0, 0xac, 0xa1, 0x0, 0x0, - 0x0, 0x90, 0x0, 0x3b, 0x50, 0x5e, 0x82, 0x0, - 0x7, 0x10, 0x38, 0x70, 0x0, 0x2, 0xaf, 0xa1, - 0x11, 0x4, 0x20, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+53CD "反" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xa1, 0x0, - 0x0, 0x6, 0x46, 0x78, 0x9a, 0xa8, 0x73, 0x0, - 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0, 0xa, 0x86, 0x86, 0x66, 0x66, 0xf5, 0x0, - 0x0, 0xa, 0x30, 0x70, 0x0, 0x6, 0xc0, 0x0, - 0x0, 0xb, 0x20, 0x53, 0x0, 0xd, 0x30, 0x0, - 0x0, 0xc, 0x10, 0xa, 0x0, 0x89, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x2, 0xa4, 0xd0, 0x0, 0x0, - 0x0, 0x3a, 0x0, 0x0, 0x7f, 0x30, 0x0, 0x0, - 0x0, 0x93, 0x0, 0x4, 0xc9, 0xc3, 0x0, 0x0, - 0x1, 0x90, 0x2, 0x98, 0x0, 0x3e, 0xb5, 0x0, - 0x7, 0x3, 0x76, 0x0, 0x0, 0x0, 0x8f, 0xc2, - 0x10, 0x11, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+53D6 "取" */ - 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, - 0x16, 0xd6, 0x66, 0xe6, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0xd3, 0x66, 0x66, 0x8b, 0x0, - 0x0, 0xc0, 0x0, 0xd0, 0x22, 0x0, 0x89, 0x0, - 0x0, 0xc6, 0x66, 0xd0, 0x5, 0x0, 0xb4, 0x0, - 0x0, 0xc0, 0x0, 0xd0, 0x7, 0x0, 0xe0, 0x0, - 0x0, 0xc0, 0x0, 0xd0, 0x8, 0x4, 0xa0, 0x0, - 0x0, 0xc6, 0x66, 0xd0, 0x5, 0x3a, 0x50, 0x0, - 0x0, 0xc0, 0x0, 0xd0, 0x1, 0xad, 0x0, 0x0, - 0x0, 0xc0, 0x14, 0xe6, 0x30, 0xb7, 0x0, 0x0, - 0x17, 0xec, 0x84, 0xd0, 0x1, 0xdc, 0x0, 0x0, - 0x1a, 0x30, 0x0, 0xd0, 0xa, 0x25, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x83, 0x0, 0x7f, 0x90, - 0x0, 0x0, 0x0, 0xd6, 0x20, 0x0, 0x5, 0x30, - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+53D7 "受" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x5a, 0xb0, 0x0, - 0x0, 0x25, 0x66, 0x89, 0xa9, 0x87, 0x51, 0x0, - 0x0, 0x3, 0x0, 0x33, 0x0, 0xb, 0x60, 0x0, - 0x0, 0x5, 0xa0, 0xd, 0x30, 0x1c, 0x0, 0x0, - 0x0, 0x30, 0xe1, 0x9, 0x60, 0x82, 0x2, 0x0, - 0x0, 0xa6, 0x86, 0x67, 0x66, 0x76, 0x6c, 0xb0, - 0x4, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, - 0x6, 0x44, 0x66, 0x66, 0x66, 0xa8, 0x20, 0x0, - 0x0, 0x0, 0x6, 0x0, 0x1, 0xe4, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x80, 0xa, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x67, 0x99, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xb3, 0x4d, 0x94, 0x20, 0x0, - 0x0, 0x37, 0x83, 0x0, 0x0, 0x5b, 0xff, 0x91, - 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+53E3 "口" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x66, 0x66, - 0x66, 0x66, 0xe3, 0xe0, 0x0, 0x0, 0x0, 0xe, - 0xe, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xe0, 0x0, - 0x0, 0x0, 0xe, 0xe, 0x0, 0x0, 0x0, 0x0, - 0xe0, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xe, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0xe0, 0x0, 0x0, 0x0, - 0xe, 0xe, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xe6, - 0x66, 0x66, 0x66, 0x6e, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+53E4 "古" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x20, 0x47, 0x66, - 0x66, 0x6e, 0x66, 0x66, 0x9b, 0x10, 0x0, 0x0, - 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x66, 0x6e, - 0x66, 0x6b, 0x20, 0x0, 0x1, 0xd0, 0x0, 0x0, - 0x0, 0xe0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0xe, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0xe0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x1, 0xe6, 0x66, 0x66, 0x66, 0xe0, - 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x10, 0x0, - - /* U+53E5 "句" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0x76, 0x66, 0x66, 0x66, 0xb6, 0x0, 0xa, - 0x40, 0x0, 0x0, 0x0, 0xa, 0x30, 0x4, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xa3, 0x2, 0x71, 0x20, - 0x0, 0x6, 0x0, 0xa, 0x30, 0x50, 0x3d, 0x66, - 0x66, 0xf1, 0x0, 0xa3, 0x0, 0x2, 0xb0, 0x0, - 0xe, 0x0, 0xa, 0x30, 0x0, 0x2b, 0x0, 0x0, - 0xe0, 0x0, 0xa3, 0x0, 0x2, 0xd6, 0x66, 0x6e, - 0x0, 0xa, 0x30, 0x0, 0x3b, 0x0, 0x0, 0x80, - 0x0, 0xb2, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x21, 0x2, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, 0x0, - - /* U+53E6 "另" */ - 0x0, 0x9, 0x66, 0x66, 0x66, 0x6b, 0x0, 0x0, - 0xe, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0x2b, 0x0, 0x0, 0xe, 0x66, 0x66, - 0x66, 0x7b, 0x0, 0x0, 0xc, 0x0, 0x94, 0x0, - 0x27, 0x0, 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, - 0x10, 0x6, 0x66, 0x66, 0xe6, 0x66, 0x67, 0xe0, - 0x0, 0x0, 0x0, 0xe0, 0x0, 0x3, 0xb0, 0x0, - 0x0, 0x3, 0xa0, 0x0, 0x3, 0xa0, 0x0, 0x0, - 0x9, 0x40, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x4a, - 0x0, 0x0, 0x5, 0x80, 0x0, 0x6, 0x90, 0x0, - 0x12, 0xa, 0x60, 0x4, 0x73, 0x0, 0x0, 0x5, - 0xee, 0x10, 0x31, 0x0, 0x0, 0x0, 0x0, 0x21, - 0x0, - - /* U+53EA "只" */ - 0x0, 0x4, 0x0, 0x0, 0x0, 0x52, 0x0, 0x0, - 0xe6, 0x66, 0x66, 0x6c, 0x50, 0x0, 0xd, 0x0, - 0x0, 0x0, 0xa3, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0xa, 0x30, 0x0, 0xd, 0x0, 0x0, 0x0, 0xa3, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x30, 0x0, - 0xd, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x1, 0xe6, - 0x66, 0x66, 0x6c, 0x30, 0x0, 0x17, 0x4, 0x0, - 0x20, 0x30, 0x0, 0x0, 0x7, 0xd1, 0x1, 0x91, - 0x0, 0x0, 0x2, 0xd2, 0x0, 0x3, 0xd3, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0x6, 0xf2, 0x0, 0x93, - 0x0, 0x0, 0x0, 0xc, 0x90, 0x82, 0x0, 0x0, - 0x0, 0x0, 0x37, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+53EB "叫" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xb1, 0x0, - 0x0, 0x0, 0x1, 0x10, 0x0, 0xd0, 0x1c, 0x66, - 0xc6, 0x3, 0xd0, 0x0, 0xd0, 0xd, 0x0, 0xb2, - 0x2, 0xb0, 0x0, 0xd0, 0xd, 0x0, 0xb2, 0x2, - 0xb0, 0x0, 0xd0, 0xd, 0x0, 0xb2, 0x2, 0xb0, - 0x0, 0xd0, 0xd, 0x0, 0xb2, 0x2, 0xb0, 0x0, - 0xd0, 0xd, 0x0, 0xb2, 0x2, 0xb0, 0x0, 0xd0, - 0xd, 0x0, 0xb2, 0x3, 0xb3, 0x76, 0xd0, 0xe, - 0x66, 0xd2, 0x3, 0xf7, 0x0, 0xd0, 0x1d, 0x0, - 0x91, 0x0, 0x10, 0x0, 0xd0, 0x6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x30, - - /* U+53EF "可" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6d, 0x90, - 0x1, 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, - 0x0, 0xb, 0x66, 0x6c, 0x50, 0xc, 0x10, 0x0, - 0x0, 0xe, 0x0, 0xb, 0x20, 0xc, 0x10, 0x0, - 0x0, 0xe, 0x0, 0xb, 0x20, 0xc, 0x10, 0x0, - 0x0, 0xe, 0x0, 0xb, 0x20, 0xc, 0x10, 0x0, - 0x0, 0xe, 0x0, 0xb, 0x20, 0xc, 0x10, 0x0, - 0x0, 0xe, 0x66, 0x6d, 0x30, 0xc, 0x10, 0x0, - 0x0, 0xe, 0x0, 0x6, 0x10, 0xc, 0x10, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x25, 0x4e, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xcb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - - /* U+53F0 "台" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaa, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x65, 0x0, - 0x0, 0x4a, 0x0, 0x0, 0x0, 0x7b, 0x20, 0x8e, - 0x55, 0x66, 0x77, 0x66, 0xce, 0x16, 0xd9, 0x64, - 0x21, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x1d, 0x66, 0x66, 0x66, 0xc6, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xb, 0x30, 0x0, - 0xd, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0xb, 0x30, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, - 0x30, 0x0, 0x4, 0x0, 0x0, 0x0, 0x30, 0x0, - - /* U+53F2 "史" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0xe0, 0x0, 0x3, 0x0, - 0x0, 0xe, 0x66, 0x66, 0xe6, 0x66, 0x8d, 0x0, - 0x0, 0xd, 0x10, 0x0, 0xe0, 0x0, 0x3a, 0x0, - 0x0, 0xd, 0x10, 0x0, 0xe0, 0x0, 0x3a, 0x0, - 0x0, 0xd, 0x66, 0x66, 0xe6, 0x66, 0x8b, 0x0, - 0x0, 0xa, 0x0, 0x0, 0xc0, 0x0, 0x25, 0x0, - 0x0, 0x0, 0x24, 0x2, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x46, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8d, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7d, 0xc5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0x80, 0x29, 0xeb, 0x86, 0x51, - 0x0, 0x48, 0x81, 0x0, 0x0, 0x5, 0x9c, 0x80, - 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+53F3 "右" */ - 0x0, 0x0, 0x0, 0x9, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, 0x8, 0x30, - 0x7, 0x66, 0x66, 0xd7, 0x66, 0x66, 0x67, 0x60, - 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, 0xad, 0x66, 0x66, 0x66, 0xf2, 0x0, - 0x0, 0x6, 0x6c, 0x10, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x38, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, - 0x2, 0x70, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, - 0x14, 0x0, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+53F7 "号" */ - 0x0, 0x9, 0x66, 0x66, 0x66, 0xb3, 0x0, 0x0, - 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x66, 0x66, - 0x66, 0xe0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, - 0x10, 0x31, 0x56, 0x66, 0x89, 0x66, 0x66, 0x66, - 0x97, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xe0, 0x0, 0x0, 0x34, 0x0, 0x0, - 0x3, 0x96, 0x66, 0x66, 0xca, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xdf, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x72, 0x0, - 0x0, - - /* U+53F8 "司" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x27, - 0x66, 0x66, 0x66, 0x66, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x20, 0xd0, 0x46, 0x66, 0x66, 0x66, 0x76, 0xd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0xb6, 0x66, 0x6e, 0x20, 0xd, 0x0, 0xc, 0x10, - 0x0, 0xe0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0xe, - 0x0, 0xd, 0x0, 0xc, 0x10, 0x0, 0xe0, 0x0, - 0xd0, 0x0, 0xc6, 0x66, 0x6e, 0x0, 0xd, 0x0, - 0x8, 0x0, 0x0, 0x40, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x8e, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x32, 0x0, - - /* U+5403 "吃" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0x20, 0x0, 0x0, 0x96, 0x6b, 0x50, - 0x77, 0x0, 0x0, 0x30, 0xd1, 0xb, 0x30, 0xc6, - 0x66, 0x66, 0xa4, 0xd1, 0xb, 0x36, 0x40, 0x0, - 0x0, 0x0, 0xc1, 0xb, 0x46, 0x0, 0x0, 0x30, - 0x0, 0xc1, 0xb, 0x54, 0x66, 0x67, 0xf5, 0x0, - 0xc1, 0xb, 0x30, 0x0, 0xc, 0x60, 0x0, 0xc1, - 0xb, 0x30, 0x0, 0xa8, 0x0, 0x0, 0xd6, 0x6c, - 0x30, 0x8, 0xa0, 0x0, 0x0, 0xd1, 0x5, 0x10, - 0x5c, 0x0, 0x0, 0x60, 0x10, 0x0, 0x1, 0xe1, - 0x0, 0x0, 0x70, 0x0, 0x0, 0x5, 0xb0, 0x0, - 0x0, 0xa6, 0x0, 0x0, 0x1, 0xcc, 0xcc, 0xcc, - 0xf6, - - /* U+5404 "各" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0x86, 0x66, 0xb4, 0x0, 0x0, - 0x0, 0x0, 0xb8, 0x0, 0x3, 0xd1, 0x0, 0x0, - 0x0, 0x7, 0x63, 0x40, 0xc, 0x30, 0x0, 0x0, - 0x0, 0x55, 0x0, 0x82, 0x88, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x89, 0xb9, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0x50, 0x5, 0xdc, 0x74, 0x10, - 0x0, 0x7, 0xd6, 0x66, 0x66, 0xa8, 0xbe, 0x60, - 0x5, 0x61, 0xd1, 0x0, 0x0, 0xb3, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0xd3, 0x0, 0x0, - 0x0, 0x0, 0x70, 0x0, 0x0, 0x50, 0x0, 0x0, - - /* U+5408 "合" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb6, 0x37, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x90, 0x7, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x6a, 0x0, 0x0, 0x8a, 0x10, 0x0, - 0x0, 0x9, 0x70, 0x0, 0x0, 0x38, 0xea, 0x40, - 0x4, 0x82, 0x76, 0x66, 0x66, 0x98, 0x2b, 0x91, - 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x30, 0x0, 0x0, 0x6, 0x0, 0x0, - 0x0, 0x0, 0xf6, 0x66, 0x66, 0x6f, 0x10, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+540C "同" */ - 0x40, 0x0, 0x0, 0x0, 0x0, 0x5, 0xd, 0x66, - 0x66, 0x66, 0x66, 0x66, 0xe2, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xc, 0x15, 0x66, 0x66, 0x6b, - 0x90, 0xe0, 0xc1, 0x10, 0x0, 0x0, 0x0, 0xe, - 0xc, 0x10, 0x20, 0x0, 0x3, 0x0, 0xe0, 0xc1, - 0xd, 0x66, 0x66, 0xe1, 0xe, 0xc, 0x10, 0xd0, - 0x0, 0xd, 0x0, 0xe0, 0xc1, 0xd, 0x0, 0x0, - 0xd0, 0xe, 0xc, 0x10, 0xd6, 0x66, 0x6d, 0x0, - 0xe0, 0xc1, 0xc, 0x0, 0x0, 0xa0, 0xe, 0xc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xd1, 0x0, - 0x0, 0x0, 0x22, 0x3e, 0xe, 0x10, 0x0, 0x0, - 0x1, 0x7f, 0xa0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x30, 0x0, - - /* U+540D "名" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xd0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xd, - 0x86, 0x66, 0x6c, 0xb0, 0x0, 0x0, 0x77, 0x0, - 0x0, 0x3e, 0x10, 0x0, 0x4, 0x98, 0x10, 0x1, - 0xd4, 0x0, 0x0, 0x47, 0x3, 0xe1, 0x1d, 0x50, - 0x0, 0x1, 0x30, 0x0, 0x72, 0xd5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3d, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xe7, 0x66, 0x66, 0xb2, 0x0, 0x5, - 0xae, 0x10, 0x0, 0x0, 0xe0, 0x5, 0x63, 0xc, - 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x10, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x66, 0x66, - 0x66, 0xe0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5411 "向" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, - 0x0, 0x0, 0x0, 0x4, 0x0, 0x8, 0x0, 0x0, - 0x0, 0x60, 0xd6, 0x66, 0x66, 0x66, 0x66, 0x6f, - 0x1c, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xc1, - 0x3, 0x0, 0x0, 0x40, 0xe, 0xc, 0x10, 0xd6, - 0x66, 0x8d, 0x0, 0xe0, 0xc1, 0xc, 0x10, 0x3, - 0xa0, 0xe, 0xc, 0x10, 0xc1, 0x0, 0x3a, 0x0, - 0xe0, 0xc1, 0xd, 0x66, 0x68, 0xa0, 0xe, 0xc, - 0x10, 0xd1, 0x0, 0x39, 0x0, 0xe0, 0xc1, 0x1, - 0x0, 0x0, 0x0, 0xe, 0xc, 0x10, 0x0, 0x0, - 0x2, 0x34, 0xd0, 0xd1, 0x0, 0x0, 0x0, 0x15, - 0xea, 0x4, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+5426 "否" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x81, 0x18, - 0x66, 0x66, 0x9c, 0x66, 0x66, 0x85, 0x0, 0x0, - 0x1, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0x6c, 0x31, 0x0, 0x0, 0x0, 0x1, 0xc4, 0x2b, - 0x6, 0x94, 0x0, 0x0, 0x4b, 0x20, 0x2b, 0x0, - 0x1b, 0xc1, 0x17, 0x60, 0x0, 0x3b, 0x0, 0x0, - 0x89, 0x30, 0x0, 0x0, 0x26, 0x0, 0x1, 0x1, - 0x0, 0xd, 0x66, 0x66, 0x66, 0x7e, 0x10, 0x0, - 0xf, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0xf, - 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0xf, 0x0, - 0x0, 0x0, 0x2c, 0x0, 0x0, 0xf, 0x66, 0x66, - 0x66, 0x7c, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, - 0x2d, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, - 0x0, - - /* U+5427 "吧" */ - 0x0, 0x0, 0x0, 0x95, 0x55, 0x55, 0xa1, 0x3, - 0xb6, 0x6d, 0xe, 0x11, 0xe1, 0x2c, 0x0, 0x2b, - 0x2, 0xc0, 0xe0, 0xe, 0x2, 0xc0, 0x2, 0xb0, - 0x2c, 0xe, 0x0, 0xe0, 0x2c, 0x0, 0x2b, 0x2, - 0xc0, 0xe0, 0xe, 0x2, 0xc0, 0x2, 0xb0, 0x2c, - 0xe, 0x0, 0xe0, 0x2c, 0x0, 0x2b, 0x2, 0xc0, - 0xe6, 0x66, 0x67, 0xc0, 0x2, 0xb0, 0x2c, 0xe, - 0x0, 0x0, 0x1, 0x0, 0x3d, 0x67, 0xc0, 0xe0, - 0x0, 0x0, 0x0, 0x3, 0xb0, 0x2c, 0xe, 0x0, - 0x0, 0x0, 0x50, 0x38, 0x0, 0x10, 0xe0, 0x0, - 0x0, 0x7, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0x0, 0x8d, 0xcc, 0xcc, - 0xdd, 0x20, - - /* U+5440 "呀" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x2, - 0x0, 0x3, 0x27, 0x66, 0x69, 0x7b, 0x20, 0xb7, - 0x66, 0xe0, 0x30, 0x0, 0xe0, 0x0, 0xb, 0x20, - 0x1d, 0xb, 0x60, 0xe, 0x0, 0x0, 0xb2, 0x1, - 0xd0, 0xd0, 0x0, 0xe0, 0x0, 0xb, 0x20, 0x1d, - 0x3a, 0x0, 0xe, 0x5, 0x30, 0xb2, 0x1, 0xd5, - 0x86, 0x7e, 0xe6, 0x65, 0xb, 0x20, 0x1d, 0x0, - 0x9, 0x7e, 0x0, 0x0, 0xb7, 0x66, 0xd0, 0x2, - 0xd0, 0xe0, 0x0, 0xb, 0x20, 0x9, 0x0, 0xc3, - 0xe, 0x0, 0x0, 0x70, 0x0, 0x0, 0x95, 0x0, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x74, 0x0, 0xe, - 0x0, 0x0, 0x0, 0x0, 0x63, 0x2, 0x23, 0xe0, - 0x0, 0x0, 0x0, 0x40, 0x0, 0x16, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, - - /* U+544A "告" */ - 0x0, 0x2, 0x0, 0x1b, 0x10, 0x0, 0x0, 0x0, - 0xc, 0x60, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x3b, - 0x0, 0xe, 0x0, 0x46, 0x0, 0x0, 0xa6, 0x66, - 0x6e, 0x66, 0x65, 0x0, 0x5, 0x40, 0x0, 0xe, - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x50, 0x47, 0x66, 0x66, 0x6a, 0x66, 0x67, - 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1a, 0x66, 0x66, 0x66, 0xb6, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0xa3, 0x0, 0x0, 0xe, 0x66, 0x66, - 0x66, 0xc3, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0xa3, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5462 "呢" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x60, 0x86, - 0x6b, 0x21, 0xe6, 0x66, 0x66, 0xe1, 0xb2, 0xe, - 0x0, 0xd0, 0x0, 0x0, 0xe0, 0xb2, 0xe, 0x0, - 0xd0, 0x0, 0x0, 0xe0, 0xb2, 0xe, 0x0, 0xe6, - 0x66, 0x66, 0xe0, 0xb2, 0xe, 0x1, 0xc0, 0x20, - 0x0, 0x20, 0xb2, 0xe, 0x2, 0xb0, 0xe1, 0x1, - 0x40, 0xb2, 0xe, 0x4, 0x90, 0xd0, 0xb, 0xa0, - 0xb7, 0x6e, 0x7, 0x60, 0xd0, 0x96, 0x0, 0xb2, - 0xd, 0xb, 0x20, 0xe7, 0x30, 0x0, 0xc2, 0x2, - 0xc, 0x0, 0xe0, 0x0, 0x32, 0x10, 0x0, 0x75, - 0x0, 0xd0, 0x0, 0x44, 0x0, 0x0, 0x90, 0x0, - 0xe3, 0x11, 0x9a, 0x0, 0x7, 0x10, 0x0, 0x5a, - 0xaa, 0x93, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5468 "周" */ - 0x0, 0x9, 0x66, 0x66, 0x66, 0x66, 0x6c, 0x10, - 0x0, 0xd0, 0x0, 0x4, 0x0, 0x0, 0xd0, 0x0, - 0xd, 0x0, 0x0, 0xd0, 0x0, 0xc, 0x0, 0x0, - 0xd0, 0x0, 0xc, 0x7, 0x0, 0xc0, 0x0, 0xd, - 0x5, 0x76, 0xd6, 0x63, 0xc, 0x0, 0x0, 0xd0, - 0x0, 0xc, 0x0, 0x50, 0xc0, 0x0, 0xd, 0x47, - 0x66, 0x76, 0x67, 0x2c, 0x0, 0x1, 0xc0, 0x13, - 0x0, 0x6, 0x0, 0xc0, 0x0, 0x3a, 0x1, 0xd6, - 0x66, 0xe1, 0xc, 0x0, 0x5, 0x60, 0x1b, 0x0, - 0xd, 0x0, 0xc0, 0x0, 0x92, 0x1, 0xb0, 0x0, - 0xd0, 0xc, 0x0, 0xa, 0x0, 0x1d, 0x66, 0x6d, - 0x0, 0xc0, 0x6, 0x30, 0x1, 0x40, 0x0, 0x30, - 0x2c, 0x1, 0x50, 0x0, 0x0, 0x0, 0x3, 0x9f, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, - 0x0, - - /* U+5473 "味" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb, 0x66, - 0xe2, 0x0, 0xd, 0x0, 0x71, 0x0, 0xd1, 0xe, - 0x6, 0x76, 0xe6, 0x66, 0x30, 0xc, 0x10, 0xe0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, - 0x0, 0xd0, 0x0, 0x51, 0xc, 0x10, 0xe5, 0x76, - 0x9f, 0x86, 0x68, 0x60, 0xc1, 0xe, 0x0, 0xd, - 0xf4, 0x20, 0x0, 0xc, 0x66, 0xe0, 0x5, 0x9d, - 0x9, 0x0, 0x0, 0xd1, 0xb, 0x1, 0xc0, 0xd0, - 0x75, 0x0, 0x7, 0x0, 0x0, 0xa2, 0xd, 0x0, - 0xd5, 0x0, 0x0, 0x0, 0x83, 0x0, 0xd0, 0x3, - 0xfa, 0x10, 0x0, 0x72, 0x0, 0xd, 0x0, 0x4, - 0x10, 0x0, 0x30, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, - - /* U+547C "呼" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, 0x1, - 0x0, 0x30, 0x1, 0x37, 0xac, 0xa7, 0x0, 0xb7, - 0x6e, 0x33, 0x42, 0x1e, 0x0, 0x0, 0xa, 0x20, - 0xe0, 0x41, 0x0, 0xe0, 0x9, 0x60, 0xa2, 0xe, - 0x0, 0xc1, 0xe, 0x2, 0xc0, 0xa, 0x20, 0xe0, - 0x8, 0x80, 0xe0, 0x91, 0x0, 0xa2, 0xe, 0x0, - 0x23, 0xe, 0x21, 0x1, 0xa, 0x20, 0xe4, 0x76, - 0x66, 0xe6, 0x69, 0xa0, 0xa2, 0xe, 0x0, 0x0, - 0xe, 0x0, 0x0, 0xa, 0x76, 0xe0, 0x0, 0x0, - 0xe0, 0x0, 0x0, 0xb2, 0xa, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x1d, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, - - /* U+547D "命" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc4, 0x18, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x50, 0x4, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0xa4, 0x0, 0x1, 0x6d, 0x82, 0x0, - 0x0, 0x49, 0x37, 0x66, 0x66, 0x61, 0xaf, 0xb1, - 0x6, 0x40, 0x0, 0x10, 0x1, 0x0, 0x33, 0x0, - 0x0, 0xd, 0x66, 0xd2, 0xd, 0x66, 0xe3, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xe, 0x66, 0xe0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xa0, 0xd, 0x5c, 0xc0, 0x0, - 0x0, 0x5, 0x0, 0x0, 0xd, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - - /* U+548C "和" */ - 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x48, 0xca, 0x81, 0x10, 0x0, 0x10, 0x0, - 0x31, 0xd, 0x0, 0xc, 0x66, 0x6c, 0x60, 0x0, - 0x0, 0xd0, 0x0, 0xc2, 0x0, 0xb3, 0x2, 0x66, - 0x6e, 0x6a, 0x5c, 0x20, 0xb, 0x30, 0x0, 0x8, - 0xd0, 0x0, 0xc2, 0x0, 0xb3, 0x0, 0x0, 0xde, - 0x50, 0xc, 0x20, 0xb, 0x30, 0x0, 0x68, 0xd4, - 0xd3, 0xc2, 0x0, 0xb3, 0x0, 0xb, 0xd, 0x4, - 0x8c, 0x20, 0xb, 0x30, 0x8, 0x20, 0xd0, 0x0, - 0xc2, 0x0, 0xb3, 0x4, 0x40, 0xd, 0x0, 0xc, - 0x76, 0x6c, 0x30, 0x30, 0x0, 0xd0, 0x0, 0xc2, - 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, 0x7, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+54B2 "咲" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x18, 0x0, 0x3, 0xb1, 0x0, 0x30, - 0x4, 0x0, 0x7b, 0x0, 0x97, 0x0, 0xe, 0x66, - 0xe2, 0x0, 0xe1, 0x9, 0x0, 0x0, 0xe0, 0xe, - 0x0, 0x2, 0x5, 0x11, 0x80, 0xe, 0x0, 0xe0, - 0x76, 0x6d, 0x76, 0x66, 0x20, 0xe0, 0xe, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0xe, 0x0, 0xe0, 0x0, - 0xe, 0x0, 0x0, 0x10, 0xe0, 0xe, 0x57, 0x66, - 0xe6, 0x66, 0xaa, 0xe, 0x0, 0xe0, 0x0, 0x2c, - 0x60, 0x0, 0x0, 0xe6, 0x6e, 0x0, 0x6, 0x84, - 0x30, 0x0, 0xb, 0x0, 0x30, 0x0, 0xb3, 0xa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x95, - 0x0, 0x0, 0x0, 0x0, 0x2a, 0x10, 0x1, 0xe4, - 0x0, 0x0, 0x0, 0x57, 0x0, 0x0, 0x5, 0xfa, - 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x4, 0x10, - - /* U+54C1 "品" */ - 0x0, 0x4, 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, - 0xc, 0x76, 0x66, 0x69, 0xa0, 0x0, 0x0, 0xb, - 0x20, 0x0, 0x5, 0x70, 0x0, 0x0, 0xb, 0x20, - 0x0, 0x5, 0x70, 0x0, 0x0, 0xb, 0x20, 0x0, - 0x5, 0x80, 0x0, 0x0, 0xc, 0x76, 0x66, 0x69, - 0x80, 0x0, 0x0, 0x5, 0x0, 0x0, 0x2, 0x10, - 0x0, 0x9, 0x66, 0x7a, 0x0, 0x96, 0x66, 0xb1, - 0xe, 0x0, 0x3c, 0x0, 0xd0, 0x0, 0xe0, 0xe, - 0x0, 0x3b, 0x0, 0xd0, 0x0, 0xe0, 0xe, 0x0, - 0x3b, 0x0, 0xd0, 0x0, 0xe0, 0xe, 0x0, 0x3c, - 0x0, 0xd0, 0x0, 0xe0, 0xe, 0x66, 0x8c, 0x0, - 0xe6, 0x66, 0xe0, 0xd, 0x0, 0x26, 0x1, 0xb0, - 0x0, 0xa0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+54E1 "員" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, - 0xc6, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xc, 0x10, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc6, 0x66, 0x66, - 0x6d, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x90, - 0x0, 0xa, 0x66, 0x66, 0x66, 0x66, 0xc1, 0x0, - 0xe0, 0x0, 0x0, 0x0, 0xd, 0x0, 0xe, 0x66, - 0x66, 0x66, 0x66, 0xd0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, - 0xd0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xd, 0x0, - 0xe, 0x66, 0x66, 0x66, 0x66, 0xd0, 0x0, 0x40, - 0x2c, 0x20, 0x65, 0x1, 0x0, 0x0, 0x4c, 0x50, - 0x0, 0x5d, 0x91, 0x2, 0x75, 0x0, 0x0, 0x0, - 0xa, 0xb1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, - - /* U+54EA "哪" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, - 0x0, 0x17, 0x78, 0x6e, 0x1c, 0x68, 0xc0, 0xc6, - 0x7c, 0x2, 0x90, 0xd0, 0xc0, 0x85, 0xc, 0x2, - 0x90, 0x29, 0xd, 0xc, 0x9, 0x0, 0xc0, 0x29, - 0x37, 0xb6, 0xd0, 0xc1, 0x50, 0xc, 0x2, 0x90, - 0x29, 0xd, 0xc, 0x51, 0x0, 0xc0, 0x29, 0x3, - 0x80, 0xd0, 0xc0, 0x80, 0xc, 0x2, 0x90, 0x38, - 0xc, 0xc, 0x5, 0x50, 0xc6, 0x79, 0x5a, 0x96, - 0xd0, 0xc0, 0xb, 0xc, 0x2, 0x70, 0xa1, 0xd, - 0xc, 0x0, 0xc0, 0xb0, 0x0, 0x1a, 0x0, 0xc0, - 0xc5, 0x7c, 0x0, 0x0, 0x8, 0x20, 0x3a, 0xc, - 0xa, 0x20, 0x0, 0x4, 0x62, 0x9c, 0x50, 0xc0, - 0x0, 0x0, 0x3, 0x50, 0x2, 0x50, 0xc, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5546 "商" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xc2, 0x0, 0x0, 0x10, 0x5, - 0x66, 0x66, 0x6c, 0x86, 0x66, 0x9e, 0x20, 0x10, - 0x6, 0x0, 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, - 0x3d, 0x0, 0x8, 0x40, 0x0, 0x0, 0x8, 0x66, - 0xd6, 0x66, 0xa6, 0x6a, 0x40, 0x0, 0xd0, 0x2, - 0x20, 0x10, 0x0, 0xa2, 0x0, 0xd, 0x0, 0xb7, - 0x0, 0x9a, 0x1a, 0x20, 0x0, 0xd0, 0x75, 0x0, - 0x0, 0x87, 0xa2, 0x0, 0xd, 0x33, 0x96, 0x66, - 0xb3, 0xa, 0x20, 0x0, 0xd0, 0xd, 0x0, 0xb, - 0x10, 0xa2, 0x0, 0xd, 0x0, 0xd0, 0x0, 0xb1, - 0xa, 0x20, 0x0, 0xd0, 0xd, 0x66, 0x6d, 0x10, - 0xa2, 0x0, 0xd, 0x0, 0xb0, 0x0, 0x60, 0xa, - 0x20, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x3a, 0xf1, - 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, - - /* U+554A "啊" */ - 0x0, 0x0, 0x53, 0x54, 0x0, 0x0, 0x25, 0x9, - 0x69, 0x2c, 0x3a, 0x65, 0x66, 0x6e, 0x50, 0xc0, - 0xc0, 0xc0, 0xa0, 0x0, 0x0, 0xd0, 0xc, 0xc, - 0xc, 0x8, 0x0, 0x0, 0xd, 0x0, 0xc0, 0xc0, - 0xc4, 0x30, 0xc6, 0xd1, 0xd0, 0xc, 0xc, 0xc, - 0x31, 0xc, 0xc, 0xd, 0x0, 0xc0, 0xc0, 0xc0, - 0x80, 0xc0, 0xc0, 0xd0, 0xc, 0xc, 0xc, 0x6, - 0x5c, 0xc, 0xd, 0x0, 0xc6, 0xd0, 0xc0, 0x57, - 0xd5, 0xd0, 0xd0, 0xc, 0x9, 0xc, 0x6b, 0x5a, - 0x6, 0xd, 0x0, 0x70, 0x0, 0xc1, 0x70, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x1, 0x42, - 0xd0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x2, 0xd9, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+554F "問" */ - 0x1a, 0x66, 0x6a, 0x50, 0x96, 0x66, 0xa3, 0xd, - 0x0, 0x9, 0x50, 0xd0, 0x0, 0xc1, 0xd, 0x0, - 0x9, 0x40, 0xd0, 0x0, 0xc1, 0xe, 0x66, 0x6b, - 0x40, 0xd6, 0x66, 0xd1, 0xd, 0x0, 0x9, 0x40, - 0xd0, 0x0, 0xc1, 0xe, 0x66, 0x6b, 0x40, 0xd6, - 0x66, 0xd1, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc1, 0xd, 0x0, 0x96, 0x66, 0x6a, 0x0, 0xc1, - 0xd, 0x0, 0xd0, 0x0, 0x9, 0x0, 0xc1, 0xd, - 0x0, 0xd0, 0x0, 0x9, 0x0, 0xc1, 0xd, 0x0, - 0xd6, 0x66, 0x69, 0x0, 0xc1, 0xd, 0x0, 0xd0, - 0x0, 0x9, 0x0, 0xc1, 0xd, 0x0, 0x0, 0x0, - 0x1, 0x22, 0xe0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x4d, 0xc0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, - - /* U+5566 "啦" */ - 0x0, 0x0, 0x2, 0x80, 0x1, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0x0, 0xb, 0x10, 0x0, 0x10, - 0x10, 0x2, 0xa0, 0x0, 0x88, 0x0, 0xc, 0x6c, - 0x60, 0x2a, 0x61, 0x14, 0x45, 0x40, 0xd0, 0xa3, - 0x88, 0xc5, 0x36, 0x55, 0x54, 0xd, 0xa, 0x20, - 0x2a, 0x0, 0x0, 0x7, 0x0, 0xd0, 0xa2, 0x2, - 0xa1, 0x44, 0x0, 0xf2, 0xd, 0xa, 0x20, 0x3d, - 0x50, 0x90, 0x2c, 0x0, 0xd0, 0xa6, 0xbb, 0xa0, - 0xa, 0x24, 0x80, 0xd, 0x6c, 0x34, 0x2a, 0x0, - 0x77, 0x73, 0x0, 0xd0, 0xa2, 0x2, 0xa0, 0x5, - 0x69, 0x0, 0x9, 0x0, 0x0, 0x2a, 0x0, 0x0, - 0x80, 0x0, 0x0, 0x1, 0x15, 0xa0, 0x0, 0x6, - 0x17, 0x0, 0x0, 0x28, 0xf6, 0x37, 0x66, 0x66, - 0x71, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5584 "善" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x40, 0x0, 0xb3, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xf0, 0x5, 0x60, 0x4, 0x0, - 0x0, 0x76, 0x66, 0x96, 0x98, 0x66, 0x7b, 0x30, - 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x80, 0x0, - 0x0, 0x7, 0x76, 0x67, 0xd6, 0x66, 0x62, 0x0, - 0x3, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6b, 0xa0, - 0x0, 0x10, 0x80, 0x2, 0xb0, 0x8, 0x40, 0x0, - 0x0, 0x0, 0x78, 0x2, 0xb0, 0x1a, 0x10, 0x20, - 0x5, 0x66, 0x78, 0x67, 0xc6, 0x96, 0x68, 0xe4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x69, 0xa0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x5, 0x80, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x5, 0x80, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x69, 0x80, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x2, 0x20, 0x0, - - /* U+5589 "喉" */ - 0x0, 0x0, 0x0, 0x81, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x16, 0x6a, 0xa0, 0x0, 0x96, - 0x6d, 0x6, 0x60, 0x0, 0x94, 0x0, 0xa, 0x11, - 0xb0, 0xa0, 0x0, 0xc, 0x4, 0x30, 0xa1, 0x1b, - 0x1d, 0x38, 0xa6, 0x66, 0x64, 0xa, 0x11, 0xb7, - 0xc0, 0x4a, 0x0, 0x1, 0x0, 0xa1, 0x1b, 0x6c, - 0x9, 0x69, 0x67, 0x90, 0xa, 0x11, 0xb0, 0xc2, - 0x40, 0xc0, 0x0, 0x0, 0xa1, 0x1b, 0xc, 0x32, - 0x2d, 0x22, 0x45, 0xa, 0x66, 0xb0, 0xc4, 0x44, - 0xd8, 0x44, 0x30, 0xb1, 0x7, 0xc, 0x0, 0x2a, - 0x71, 0x0, 0x4, 0x0, 0x0, 0xc0, 0x8, 0x41, - 0xa0, 0x0, 0x0, 0x0, 0xc, 0x2, 0x90, 0x8, - 0x90, 0x0, 0x0, 0x0, 0xd2, 0x70, 0x0, 0xb, - 0x90, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, - 0x0, - - /* U+559C "喜" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x56, 0x66, 0x6d, 0x66, 0x66, 0xd8, 0x0, - 0x0, 0x10, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x66, 0x6d, 0x66, 0x7d, 0x20, 0x0, - 0x0, 0x0, 0x50, 0x0, 0x0, 0x5, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x10, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xd8, 0x66, 0x68, 0x7b, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x90, 0x9, 0x50, 0x1, 0x0, - 0x6, 0x66, 0x66, 0xb6, 0x69, 0x66, 0x6d, 0x80, - 0x1, 0x0, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6d, 0x30, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, 0x10, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6d, 0x10, 0x0, - 0x0, 0x0, 0x60, 0x0, 0x0, 0x5, 0x0, 0x0, - - /* U+559D "喝" */ - 0x0, 0x0, 0x5, 0x76, 0x66, 0x6b, 0x30, 0x62, - 0x28, 0x6, 0x70, 0x0, 0xe, 0x0, 0xc4, 0x3e, - 0x16, 0xa6, 0x66, 0x6e, 0x0, 0xc1, 0xe, 0x6, - 0x70, 0x0, 0xe, 0x0, 0xc1, 0xe, 0x6, 0xa6, - 0x66, 0x6e, 0x0, 0xc1, 0xe, 0x5, 0x97, 0x0, - 0x5, 0x0, 0xc1, 0xe, 0x0, 0xd3, 0x0, 0x0, - 0x41, 0xc1, 0xe, 0x9, 0x76, 0x97, 0x66, 0xd6, - 0xc6, 0x6d, 0x6c, 0x0, 0xd5, 0x0, 0xc2, 0xc1, - 0x6, 0x4c, 0x6, 0x78, 0x50, 0xd1, 0x60, 0x1, - 0xc, 0x36, 0x0, 0xc0, 0xe0, 0x0, 0x0, 0xc, - 0x10, 0x1, 0x60, 0xe0, 0x0, 0x0, 0x2a, 0x66, - 0x66, 0x52, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xae, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, - 0x0, - - /* U+55AE "單" */ - 0x0, 0x20, 0x4, 0x0, 0x30, 0x1, 0x20, 0x0, - 0xe, 0x66, 0xe2, 0xe, 0x66, 0x8a, 0x0, 0x0, - 0xd0, 0xd, 0x0, 0xd0, 0x4, 0x80, 0x0, 0xd, - 0x0, 0xd0, 0xd, 0x0, 0x48, 0x0, 0x0, 0xc6, - 0x6a, 0x0, 0xd6, 0x67, 0x60, 0x0, 0x5, 0x76, - 0x66, 0x76, 0x66, 0xc0, 0x0, 0x0, 0x66, 0x0, - 0x68, 0x0, 0xc, 0x0, 0x0, 0x6, 0x96, 0x6a, - 0xb6, 0x66, 0xc0, 0x0, 0x0, 0x66, 0x0, 0x68, - 0x0, 0xc, 0x0, 0x0, 0x6, 0x60, 0x6, 0x80, - 0x0, 0xc0, 0x0, 0x0, 0x68, 0x66, 0xab, 0x66, - 0x6b, 0x0, 0x0, 0x0, 0x0, 0x6, 0x80, 0x0, - 0x3, 0x80, 0x57, 0x66, 0x66, 0xab, 0x66, 0x66, - 0x66, 0x10, 0x0, 0x0, 0x6, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x40, 0x0, 0x0, 0x0, - - /* U+55B6 "営" */ - 0x0, 0x3, 0x10, 0x17, 0x0, 0x8, 0x0, 0x0, - 0x0, 0xc, 0x30, 0xa5, 0x4, 0xb1, 0x0, 0x0, - 0x0, 0x59, 0x5, 0x70, 0x90, 0x0, 0x0, 0x3, - 0x0, 0x0, 0x0, 0x21, 0x0, 0x40, 0x0, 0xb6, - 0x66, 0x66, 0x66, 0x66, 0x6e, 0x70, 0x78, 0x5, - 0x66, 0x66, 0x6a, 0x31, 0x70, 0x6, 0x10, 0x75, - 0x0, 0x0, 0xa2, 0x10, 0x0, 0x0, 0x7, 0x50, - 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, 0x79, 0x66, - 0x66, 0xa2, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x66, 0x66, 0x66, - 0x68, 0xb0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x48, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x4, - 0x80, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x66, 0x88, - 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x2, 0x30, - 0x0, - - /* U+55CE "嗎" */ - 0x30, 0x4, 0x6, 0x33, 0x33, 0x33, 0xa1, 0xe, - 0x66, 0xe1, 0xd3, 0x33, 0xd3, 0x33, 0x10, 0xd0, - 0xd, 0xd, 0x0, 0xd, 0x1, 0x40, 0xd, 0x0, - 0xd0, 0xd6, 0x66, 0xe6, 0x66, 0x0, 0xd0, 0xd, - 0xd, 0x0, 0xd, 0x0, 0x20, 0xd, 0x0, 0xd0, - 0xd6, 0x66, 0xe6, 0x6a, 0x10, 0xd0, 0xd, 0xd, - 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, 0xd0, 0xd5, - 0x65, 0xd6, 0x67, 0xd0, 0xe6, 0x6e, 0x7, 0x0, - 0x0, 0x0, 0x1b, 0xd, 0x0, 0x20, 0x1, 0x3, - 0x5, 0x62, 0xa0, 0x20, 0x0, 0x6, 0x64, 0x1b, - 0xc, 0x79, 0x0, 0x0, 0x5, 0x61, 0xd0, 0xa3, - 0x69, 0x70, 0x0, 0x0, 0xd2, 0x9, 0x2, 0x0, - 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xce, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x20, - 0x0, - - /* U+55EF "嗯" */ - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x40, 0x8, - 0x66, 0xb1, 0xd6, 0x67, 0x66, 0x8c, 0x0, 0xb1, - 0xd, 0xd, 0x0, 0x69, 0x3, 0x90, 0xb, 0x10, - 0xd0, 0xd3, 0x69, 0x9a, 0x59, 0x0, 0xb1, 0xd, - 0xd, 0x0, 0x94, 0x3, 0x90, 0xb, 0x10, 0xd0, - 0xd0, 0x2b, 0x69, 0x39, 0x0, 0xb1, 0xd, 0xd, - 0x28, 0x0, 0x95, 0x90, 0xb, 0x66, 0xd0, 0xd6, - 0x55, 0x55, 0x7a, 0x0, 0xb1, 0xd, 0x8, 0x0, - 0x20, 0x2, 0x40, 0xc, 0x10, 0x10, 0x3, 0x5, - 0xa0, 0x11, 0x0, 0x30, 0x0, 0x60, 0xb7, 0xc, - 0x10, 0xa6, 0x0, 0x0, 0x1d, 0xb, 0x30, 0x0, - 0x51, 0xe1, 0x0, 0x8, 0x80, 0xb4, 0x0, 0xa, - 0x4, 0x0, 0x0, 0x0, 0x6, 0xdb, 0xbb, 0xd2, - 0x0, - - /* U+561B "嘛" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, - 0x10, 0x20, 0x0, 0x57, 0x0, 0x50, 0xd, 0x6d, - 0x2c, 0x66, 0x76, 0x68, 0x78, 0x20, 0xd0, 0xd0, - 0xc1, 0xd, 0x0, 0x94, 0x0, 0xd, 0xd, 0xc, - 0x10, 0xc0, 0x9, 0x20, 0x0, 0xd0, 0xd0, 0xc6, - 0x6d, 0xa4, 0xc7, 0xb3, 0xd, 0xd, 0xd, 0x13, - 0xc0, 0xd, 0x70, 0x0, 0xd0, 0xd0, 0xd0, 0x8d, - 0x92, 0xf8, 0x0, 0xe, 0x6e, 0x1b, 0xc, 0xc6, - 0x9d, 0x81, 0x0, 0xd0, 0x84, 0x76, 0x5c, 0x9, - 0x94, 0x90, 0x6, 0x0, 0x83, 0x80, 0xc4, 0x49, - 0x2b, 0x40, 0x0, 0x8, 0x70, 0xc, 0x50, 0x92, - 0x38, 0x0, 0x6, 0x20, 0x0, 0xc0, 0x9, 0x20, - 0x0, 0x2, 0x30, 0x0, 0xc, 0x0, 0xa3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - - /* U+56B4 "嚴" */ - 0x0, 0x3, 0x0, 0x4, 0x2, 0x0, 0x2, 0x0, - 0x0, 0xb7, 0x66, 0xd0, 0xb6, 0x66, 0xc0, 0x0, - 0xa, 0x30, 0xc, 0xb, 0x0, 0xb, 0x0, 0x0, - 0xb7, 0x66, 0xd0, 0xb6, 0x66, 0xb0, 0x0, 0x34, - 0x0, 0x2, 0x3, 0x0, 0x8, 0x20, 0xa, 0x76, - 0x66, 0x66, 0x68, 0x66, 0x64, 0x0, 0xa3, 0x18, - 0x6d, 0x10, 0xd4, 0x0, 0x0, 0xa, 0x20, 0x1, - 0xa1, 0x1b, 0x0, 0x41, 0x0, 0xb4, 0x7a, 0x68, - 0xb8, 0x86, 0xaa, 0x30, 0xc, 0x11, 0xc6, 0x88, - 0x85, 0x9, 0x30, 0x0, 0xd0, 0x1a, 0x4, 0x94, - 0x60, 0xc0, 0x0, 0xc, 0x1, 0xc6, 0x88, 0x2, - 0x9a, 0x0, 0x2, 0x80, 0x1a, 0x4, 0x83, 0xc, - 0x70, 0x0, 0x62, 0x37, 0xd8, 0x9a, 0x6, 0x6b, - 0x50, 0x7, 0x5, 0x61, 0x4, 0x85, 0x50, 0x1c, - 0x80, 0x10, 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, - - /* U+56DB "四" */ - 0x40, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd, 0x66, - 0x6e, 0x66, 0xe6, 0x66, 0xf1, 0xd1, 0x1, 0xc0, - 0xe, 0x0, 0xe, 0xd, 0x10, 0x1c, 0x0, 0xe0, - 0x0, 0xe0, 0xd1, 0x1, 0xb0, 0xe, 0x0, 0xe, - 0xd, 0x10, 0x3a, 0x0, 0xe0, 0x0, 0xe0, 0xd1, - 0x5, 0x80, 0xe, 0x0, 0xe, 0xd, 0x10, 0x85, - 0x0, 0xe0, 0x0, 0xe0, 0xd1, 0xc, 0x0, 0xd, - 0x10, 0xe, 0xd, 0x17, 0x50, 0x0, 0x7c, 0xd8, - 0xe0, 0xd6, 0x50, 0x0, 0x0, 0x0, 0xe, 0xd, - 0x30, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xd6, 0x66, - 0x66, 0x66, 0x66, 0x6e, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x0, - - /* U+56DE "回" */ - 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc, 0x66, - 0x66, 0x66, 0x66, 0x66, 0xe1, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0xc1, 0x9, 0x66, 0x66, 0xb1, 0xd, - 0xc, 0x10, 0xd0, 0x0, 0xe, 0x0, 0xd0, 0xc1, - 0xd, 0x0, 0x0, 0xd0, 0xd, 0xc, 0x10, 0xd0, - 0x0, 0xd, 0x0, 0xd0, 0xc1, 0xd, 0x66, 0x66, - 0xe0, 0xd, 0xc, 0x10, 0xd0, 0x0, 0xb, 0x0, - 0xd0, 0xc1, 0x1, 0x0, 0x0, 0x0, 0xd, 0xc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xd0, 0xd6, 0x66, - 0x66, 0x66, 0x66, 0x6d, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xb0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+56E0 "因" */ - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0xe, - 0x66, 0x66, 0x66, 0x66, 0x66, 0xe2, 0xd, 0x0, - 0x0, 0xb4, 0x0, 0x0, 0xe0, 0xd, 0x0, 0x0, - 0xc1, 0x0, 0x0, 0xe0, 0xd, 0x0, 0x0, 0xc1, - 0x1, 0x50, 0xe0, 0xd, 0x18, 0x66, 0xe6, 0x67, - 0x81, 0xe0, 0xd, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0xe0, 0xd, 0x0, 0x1, 0xd7, 0x0, 0x0, 0xe0, - 0xd, 0x0, 0x7, 0x72, 0xc2, 0x0, 0xe0, 0xd, - 0x0, 0xc, 0x0, 0x5e, 0x10, 0xe0, 0xd, 0x0, - 0x93, 0x0, 0xc, 0x50, 0xe0, 0xd, 0x16, 0x20, - 0x0, 0x2, 0x10, 0xe0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0xe, 0x66, 0x66, 0x66, 0x66, - 0x66, 0xe0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x30, - - /* U+56F0 "困" */ - 0xa6, 0x66, 0x66, 0x66, 0x66, 0x6b, 0x1e, 0x0, - 0x0, 0x28, 0x0, 0x0, 0xe0, 0xe0, 0x0, 0x2, - 0xc0, 0x0, 0xe, 0xe, 0x0, 0x0, 0x2b, 0x0, - 0x10, 0xe0, 0xe1, 0x76, 0x69, 0xd6, 0x6d, 0x3e, - 0xe, 0x0, 0x2, 0xfb, 0x0, 0x0, 0xe0, 0xe0, - 0x0, 0x97, 0xd3, 0x0, 0xe, 0xe, 0x0, 0x3b, - 0x2b, 0x5b, 0x20, 0xe0, 0xe0, 0xa, 0x12, 0xb0, - 0x5f, 0x1e, 0xe, 0x8, 0x20, 0x2b, 0x0, 0x91, - 0xe0, 0xe5, 0x10, 0x2, 0xb0, 0x0, 0xe, 0xe, - 0x0, 0x0, 0x3c, 0x0, 0x0, 0xe0, 0xe0, 0x0, - 0x1, 0x20, 0x0, 0xe, 0xe, 0x66, 0x66, 0x66, - 0x66, 0x66, 0xe0, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, - - /* U+56F3 "図" */ - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, - 0xe6, 0x66, 0x66, 0x66, 0x66, 0x67, 0xd0, 0xd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, 0xd0, - 0x0, 0x1, 0x70, 0x2, 0x3, 0xb0, 0xd, 0x0, - 0x2a, 0x29, 0x61, 0xf2, 0x3b, 0x0, 0xd0, 0x6, - 0x4c, 0x36, 0x89, 0x3, 0xb0, 0xd, 0x0, 0x35, - 0x60, 0x1d, 0x0, 0x3b, 0x0, 0xd0, 0x0, 0x82, - 0xa, 0x50, 0x3, 0xb0, 0xd, 0x0, 0x1, 0xb5, - 0xa0, 0x0, 0x3b, 0x0, 0xd0, 0x0, 0x5, 0xf2, - 0x0, 0x3, 0xb0, 0xd, 0x0, 0x2, 0xa5, 0xd5, - 0x0, 0x3b, 0x0, 0xd0, 0x5, 0x80, 0x2, 0xdd, - 0x84, 0xb0, 0xd, 0x16, 0x30, 0x0, 0x0, 0x65, - 0x3b, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xb0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7b, - 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, - - /* U+56FD "国" */ - 0x96, 0x66, 0x66, 0x66, 0x66, 0x6b, 0x1d, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xe0, 0xc1, 0x56, 0x66, - 0x66, 0x7d, 0x2e, 0xc, 0x11, 0x0, 0xc1, 0x0, - 0x0, 0xe0, 0xc1, 0x0, 0xc, 0x10, 0x0, 0xe, - 0xc, 0x10, 0x0, 0xc1, 0x7, 0x20, 0xe0, 0xc1, - 0x46, 0x6d, 0x76, 0x64, 0xe, 0xc, 0x10, 0x0, - 0xc1, 0x96, 0x0, 0xe0, 0xc1, 0x0, 0xc, 0x10, - 0xe2, 0xe, 0xc, 0x10, 0x0, 0xc1, 0x3, 0x30, - 0xe0, 0xc3, 0x86, 0x6b, 0x66, 0x8c, 0x3e, 0xc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xd6, 0x66, - 0x66, 0x66, 0x66, 0x6e, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xc0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+570B "國" */ - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, - 0xe6, 0x66, 0x66, 0x76, 0x66, 0x67, 0xc0, 0xd, - 0x0, 0x0, 0x6, 0xb8, 0x0, 0x3a, 0x0, 0xd0, - 0x0, 0x0, 0x56, 0x76, 0x33, 0xa0, 0xd, 0x28, - 0x66, 0x69, 0x96, 0x7b, 0x5a, 0x0, 0xd0, 0x0, - 0x0, 0x47, 0x0, 0x3, 0xa0, 0xd, 0xa, 0x66, - 0xc3, 0x80, 0x74, 0x3a, 0x0, 0xd0, 0xc0, 0xc, - 0xa, 0xc, 0x23, 0xa0, 0xd, 0xc, 0x0, 0xc0, - 0xb2, 0x90, 0x3a, 0x0, 0xd0, 0xc6, 0x6b, 0x8, - 0xc2, 0x3, 0xa0, 0xd, 0x3, 0x0, 0x32, 0x4e, - 0x2, 0x6a, 0x0, 0xd2, 0x89, 0x72, 0x2a, 0x6a, - 0x93, 0xa0, 0xd, 0x17, 0x0, 0x38, 0x0, 0x6f, - 0x4a, 0x0, 0xd0, 0x0, 0x13, 0x0, 0x0, 0x24, - 0xa0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7a, - 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, - - /* U+570D "圍" */ - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0xe, - 0x66, 0x66, 0x76, 0x66, 0x66, 0xd4, 0xd, 0x0, - 0x0, 0xe1, 0x0, 0x0, 0xc1, 0xd, 0x0, 0x0, - 0xc0, 0x6, 0x0, 0xc1, 0xd, 0x3, 0x78, 0xc6, - 0x6d, 0x10, 0xc1, 0xd, 0x23, 0x37, 0x93, 0x3c, - 0x75, 0xc1, 0xd, 0x24, 0x53, 0x33, 0x37, 0x32, - 0xc1, 0xd, 0x0, 0xc6, 0x66, 0x6d, 0x10, 0xc1, - 0xd, 0x0, 0xb5, 0x59, 0x5b, 0x0, 0xc1, 0xd, - 0x4, 0x66, 0x6e, 0x68, 0x80, 0xc1, 0xd, 0x1, - 0xc0, 0xd, 0x0, 0x10, 0xc1, 0xd, 0x7, 0xa6, - 0x6e, 0x67, 0xc0, 0xc1, 0xd, 0x0, 0x0, 0xd, - 0x0, 0x0, 0xc1, 0xd, 0x0, 0x0, 0x8, 0x0, - 0x0, 0xc1, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, - 0xd1, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, - - /* U+5712 "園" */ - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0xe, - 0x66, 0x66, 0x96, 0x66, 0x66, 0xe2, 0xd, 0x0, - 0x0, 0xc3, 0x0, 0x0, 0xd0, 0xd, 0x0, 0x56, - 0xd6, 0x6d, 0x10, 0xd0, 0xd, 0x0, 0x10, 0xb1, - 0x0, 0x30, 0xd0, 0xd, 0x18, 0x66, 0x86, 0x66, - 0x93, 0xd0, 0xd, 0x0, 0x86, 0x66, 0x6a, 0x20, - 0xd0, 0xd, 0x0, 0xd0, 0x0, 0xd, 0x0, 0xd0, - 0xd, 0x0, 0xe6, 0x66, 0x6e, 0x0, 0xd0, 0xd, - 0x0, 0x5b, 0x30, 0x4, 0x90, 0xd0, 0xd, 0x0, - 0x7d, 0x33, 0x7, 0x50, 0xd0, 0xd, 0x6, 0x58, - 0x13, 0xb8, 0x0, 0xd0, 0xd, 0x41, 0x8, 0x10, - 0x9, 0xc0, 0xd0, 0xd, 0x0, 0x5, 0x0, 0x0, - 0x50, 0xd0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, - 0xe0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, - - /* U+5718 "團" */ - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0xe, - 0x66, 0x66, 0x68, 0x66, 0x66, 0xc4, 0xd, 0x0, - 0x0, 0x1c, 0x0, 0x13, 0xb3, 0xd, 0x19, 0x77, - 0x7d, 0x77, 0x76, 0xb3, 0xd, 0x2, 0x86, 0x6d, - 0x66, 0xc0, 0xb3, 0xd, 0x2, 0xb4, 0x4d, 0x44, - 0xc0, 0xb3, 0xd, 0x2, 0xa2, 0x3c, 0x22, 0xc0, - 0xb3, 0xd, 0x2, 0xa6, 0x6d, 0x6a, 0x70, 0xb3, - 0xd, 0x3, 0x56, 0x7c, 0x57, 0xc4, 0xb3, 0xd, - 0x2, 0x52, 0x0, 0x86, 0x24, 0xb3, 0xd, 0x7, - 0x77, 0x66, 0xb9, 0x92, 0xb3, 0xd, 0x0, 0xa, - 0x10, 0x85, 0x0, 0xb3, 0xd, 0x0, 0x5, 0x56, - 0xc4, 0x0, 0xb3, 0xd, 0x0, 0x0, 0x3, 0xa0, - 0x0, 0xb3, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, - 0xc3, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, - - /* U+571F "土" */ - 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x10, 0x0, - 0x1, 0x66, 0x66, 0x6d, 0x76, 0x66, 0xe6, 0x0, - 0x0, 0x20, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x3, 0x0, - 0x27, 0x66, 0x66, 0x6c, 0x76, 0x66, 0x6d, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5723 "圣" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x10, 0x0, - 0x0, 0x6, 0x78, 0x66, 0x66, 0x8f, 0x70, 0x0, - 0x0, 0x0, 0x5, 0x20, 0x0, 0xc7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x84, 0xa, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xca, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2c, 0x9c, 0x83, 0x0, 0x0, - 0x0, 0x0, 0x29, 0x92, 0x60, 0x6d, 0xfc, 0xa2, - 0x2, 0x57, 0x50, 0x1, 0xf1, 0x0, 0x16, 0x40, - 0x2, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x10, 0x0, - 0x0, 0x6, 0x66, 0x66, 0xf6, 0x66, 0xd8, 0x0, - 0x0, 0x1, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x4, 0x70, - 0x5, 0x76, 0x66, 0x66, 0x76, 0x66, 0x67, 0x71, - - /* U+5728 "在" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5c, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x1, 0x0, - 0x5, 0x66, 0x66, 0xf6, 0x66, 0x66, 0x8f, 0x40, - 0x1, 0x10, 0x7, 0x80, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x0, 0xe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xb4, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x80, 0x0, 0xd, 0x0, 0x23, 0x0, - 0x0, 0x5f, 0x14, 0x76, 0x6e, 0x66, 0x88, 0x0, - 0x4, 0x6c, 0x10, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x33, 0xc, 0x10, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0xd, 0x0, 0x1, 0x0, - 0x0, 0xc, 0x37, 0x66, 0x6d, 0x66, 0x6c, 0x90, - 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5730 "地" */ - 0x0, 0x5, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, - 0x0, 0xe, 0x10, 0x0, 0x1, 0xb0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xc, 0x1, 0xb0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x1, 0xb0, 0x7, 0x0, - 0x0, 0xe, 0x1, 0xd, 0x1, 0xc6, 0x6e, 0x0, - 0x8, 0x6e, 0x7a, 0xd, 0x56, 0xc0, 0xc, 0x0, - 0x0, 0xe, 0x4, 0x6d, 0x1, 0xb0, 0xc, 0x0, - 0x0, 0xe, 0x12, 0xd, 0x1, 0xb0, 0xc, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x1, 0xb0, 0xc, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x1, 0xb5, 0x9b, 0x0, - 0x0, 0xe, 0x3, 0x2d, 0x2, 0xc0, 0x73, 0x40, - 0x0, 0x4f, 0x82, 0xd, 0x1, 0x40, 0x0, 0x70, - 0x2e, 0xa2, 0x0, 0xd, 0x0, 0x0, 0x0, 0xc2, - 0x2, 0x0, 0x0, 0xa, 0xcc, 0xcc, 0xcd, 0xe3, - - /* U+5747 "均" */ - 0x0, 0xa, 0x20, 0x0, 0x86, 0x0, 0x0, 0x0, - 0x0, 0xd1, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x2, 0xc0, 0x0, 0x2, 0x0, 0x0, - 0xd0, 0x0, 0x88, 0x66, 0x66, 0xc6, 0x16, 0x6e, - 0x6b, 0x2a, 0x0, 0x0, 0xa, 0x30, 0x0, 0xd0, - 0x7, 0x23, 0x70, 0x0, 0xb2, 0x0, 0xd, 0x0, - 0x30, 0x9, 0x90, 0xb, 0x20, 0x0, 0xd0, 0x0, - 0x0, 0x2e, 0x0, 0xc2, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x15, 0xd, 0x10, 0x0, 0xd1, 0x65, 0x0, - 0x58, 0x10, 0xe0, 0x1, 0x6e, 0x81, 0x6, 0xc5, - 0x0, 0xf, 0x3, 0xf9, 0x10, 0x9, 0xc1, 0x0, - 0x1, 0xe0, 0x2, 0x0, 0x0, 0x0, 0x3, 0x21, - 0x8a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfe, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, - - /* U+574A "坊" */ - 0x0, 0x7, 0x20, 0x0, 0x37, 0x0, 0x0, 0x0, - 0x0, 0xd2, 0x0, 0x0, 0x9a, 0x0, 0x0, 0x0, - 0xc, 0x10, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, - 0xc1, 0x5, 0x66, 0x66, 0x66, 0xd6, 0x0, 0xc, - 0x17, 0x10, 0xb4, 0x0, 0x0, 0x0, 0x66, 0xd6, - 0x61, 0xc, 0x30, 0x0, 0x0, 0x0, 0xc, 0x10, - 0x0, 0xd7, 0x66, 0xa9, 0x0, 0x0, 0xc1, 0x0, - 0xf, 0x10, 0x9, 0x60, 0x0, 0xc, 0x10, 0x1, - 0xe0, 0x0, 0xa4, 0x0, 0x0, 0xc1, 0x34, 0x69, - 0x0, 0xc, 0x30, 0x1, 0x5e, 0x93, 0xc, 0x30, - 0x0, 0xd1, 0x2, 0xf9, 0x20, 0x5, 0x90, 0x0, - 0xe, 0x0, 0x1, 0x0, 0x2, 0xa0, 0x3, 0x4, - 0xc0, 0x0, 0x0, 0x4, 0x70, 0x0, 0x4d, 0xf6, - 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x13, 0x0, - 0x0, - - /* U+5750 "坐" */ - 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x10, 0xa, 0x30, 0x2, 0x10, 0x0, - 0x0, 0x8, 0xc0, 0xa, 0x30, 0x8, 0xc0, 0x0, - 0x0, 0xc, 0x40, 0xa, 0x30, 0xd, 0x40, 0x0, - 0x0, 0x1f, 0x0, 0xa, 0x30, 0x3e, 0x20, 0x0, - 0x0, 0x87, 0xb3, 0xa, 0x30, 0x93, 0xa5, 0x0, - 0x0, 0xb0, 0x3f, 0x1a, 0x32, 0x90, 0x1f, 0x20, - 0x7, 0x20, 0x9, 0xa, 0x37, 0x0, 0x8, 0x10, - 0x23, 0x0, 0x0, 0xa, 0x51, 0x2, 0x30, 0x0, - 0x0, 0x27, 0x66, 0x6c, 0x86, 0x69, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x9, 0x20, - 0x28, 0x66, 0x66, 0x67, 0x66, 0x66, 0x69, 0x70, - - /* U+578B "型" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x23, 0x0, 0x0, 0xc1, 0x6, 0x6b, - 0x6b, 0x87, 0x4, 0x10, 0xd0, 0x0, 0x1b, 0xb, - 0x10, 0xb, 0x30, 0xd0, 0x0, 0x1b, 0xb, 0x16, - 0xb, 0x10, 0xd0, 0x47, 0x7c, 0x6d, 0x78, 0x4b, - 0x10, 0xd0, 0x0, 0x48, 0xb, 0x10, 0xb, 0x10, - 0xd0, 0x0, 0x93, 0xb, 0x10, 0x6, 0x0, 0xd0, - 0x2, 0xa0, 0xb, 0x20, 0x2, 0x33, 0xd0, 0x18, - 0x0, 0x7, 0x62, 0x0, 0x5e, 0x80, 0x30, 0x0, - 0x0, 0xa5, 0x0, 0x3, 0x0, 0x0, 0x67, 0x66, - 0xc8, 0x66, 0x9c, 0x10, 0x0, 0x0, 0x0, 0xa3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, - 0x0, 0x30, 0x46, 0x66, 0x66, 0xc8, 0x66, 0x67, - 0xf7, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+57DF "域" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x10, 0x0, 0x0, 0x76, 0x54, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0x75, 0xc, 0x40, - 0x0, 0xe, 0x0, 0x0, 0x0, 0x75, 0x2, 0x70, - 0x0, 0xe, 0x5, 0x76, 0x66, 0xa9, 0x67, 0x82, - 0x5, 0x6e, 0x98, 0x0, 0x0, 0x76, 0x0, 0x0, - 0x1, 0xe, 0x0, 0xb6, 0x7c, 0x66, 0xb, 0x30, - 0x0, 0xe, 0x0, 0xc0, 0x29, 0x57, 0x1e, 0x0, - 0x0, 0xe, 0x0, 0xc0, 0x29, 0x49, 0x77, 0x0, - 0x0, 0xe, 0x0, 0xc6, 0x79, 0x1c, 0xc1, 0x0, - 0x0, 0xe, 0x44, 0x50, 0x1, 0xe, 0x90, 0x0, - 0x19, 0xc9, 0x20, 0x0, 0x45, 0x2e, 0x70, 0x4, - 0x7, 0x10, 0x2a, 0xb7, 0x20, 0xb4, 0xe3, 0x34, - 0x0, 0x0, 0x5, 0x0, 0x1a, 0x30, 0x4e, 0xb3, - 0x0, 0x0, 0x0, 0x3, 0x81, 0x0, 0x4, 0xe3, - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x11, - - /* U+57F7 "執" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x1, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x10, 0x1, 0xc0, 0x0, 0x0, - 0x3, 0x66, 0xe6, 0xa2, 0x1, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x1, 0xc0, 0x25, 0x0, - 0x0, 0x0, 0xd0, 0x24, 0x57, 0xd5, 0x8c, 0x0, - 0x7, 0xb6, 0x66, 0x95, 0x2, 0xb0, 0x57, 0x0, - 0x0, 0x69, 0x4, 0xb0, 0x45, 0xa0, 0x76, 0x0, - 0x0, 0x8, 0x7, 0x50, 0xa, 0xb0, 0x85, 0x0, - 0x5, 0x76, 0xe6, 0x63, 0x9, 0xcb, 0x84, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xc, 0x8, 0x94, 0x0, - 0x7, 0x66, 0xe6, 0x99, 0x3a, 0x0, 0x85, 0x10, - 0x0, 0x0, 0xd0, 0x0, 0xa1, 0x0, 0x58, 0x60, - 0x0, 0x0, 0xe0, 0x6, 0x50, 0x0, 0x1d, 0xb0, - 0x0, 0x0, 0xe0, 0x64, 0x0, 0x0, 0x4, 0xf1, - 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x11, - - /* U+57FA "基" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0x0, 0x0, 0xb3, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0x0, 0xc2, 0x18, 0x0, - 0x0, 0x66, 0x6d, 0x66, 0x66, 0xd7, 0x66, 0x20, - 0x0, 0x0, 0x1d, 0x66, 0x66, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0x0, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x66, 0x66, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0x0, 0xc2, 0x5, 0x0, - 0x6, 0x76, 0x6d, 0x66, 0x66, 0xb6, 0x7c, 0x90, - 0x0, 0x0, 0x2c, 0x9, 0x30, 0x91, 0x0, 0x0, - 0x0, 0x2, 0xb1, 0xb, 0x20, 0x1b, 0x83, 0x0, - 0x0, 0x57, 0x46, 0x6c, 0x76, 0xd3, 0x7e, 0xb1, - 0x5, 0x10, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x11, 0x0, - 0x0, 0x56, 0x66, 0x6c, 0x76, 0x66, 0xcc, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5831 "報" */ - 0x0, 0x0, 0xb0, 0x0, 0x30, 0x0, 0x3, 0x0, - 0x0, 0x0, 0xd0, 0x10, 0xd6, 0x66, 0x6d, 0x30, - 0x3, 0x76, 0xe6, 0x91, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x1d, 0x0, - 0x15, 0x66, 0xe6, 0x98, 0xd0, 0x7, 0xe8, 0x0, - 0x1, 0x60, 0x4, 0x50, 0xd0, 0x0, 0x21, 0x0, - 0x0, 0x4b, 0x9, 0x20, 0xd7, 0x55, 0x5d, 0x50, - 0x3, 0x6c, 0x69, 0xa3, 0xd3, 0x20, 0x2d, 0x0, - 0x0, 0x10, 0xd0, 0x0, 0xd0, 0x80, 0x94, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x66, 0xb0, 0x0, - 0x17, 0x66, 0xe6, 0x98, 0xd0, 0xf, 0x30, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x78, 0xb0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xd5, 0x40, 0x6d, 0x50, - 0x0, 0x0, 0xe0, 0x0, 0xd2, 0x0, 0x7, 0x60, - 0x0, 0x0, 0x40, 0x0, 0x40, 0x0, 0x0, 0x0, - - /* U+5834 "場" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x9, 0x66, 0x66, 0x6b, 0x10, - 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0xe, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x66, 0x66, 0x6e, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0xe, 0x0, - 0x18, 0x6e, 0x6b, 0x2e, 0x66, 0x66, 0x6e, 0x0, - 0x0, 0xe, 0x0, 0x8, 0x0, 0x0, 0x7, 0x10, - 0x0, 0xe, 0x2, 0x76, 0x76, 0x66, 0x66, 0xd3, - 0x0, 0xe, 0x0, 0x2, 0xd1, 0x0, 0x0, 0x10, - 0x0, 0xe, 0x1, 0x2b, 0x7b, 0x79, 0x98, 0xb0, - 0x0, 0xe, 0x76, 0x92, 0x4a, 0xd, 0x26, 0x70, - 0x18, 0xc7, 0x4, 0x2, 0xa0, 0x78, 0x8, 0x40, - 0x9, 0x10, 0x0, 0x47, 0x4, 0xa0, 0xb, 0x20, - 0x0, 0x0, 0x2, 0x20, 0x58, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x0, 0x17, 0x40, 0x19, 0xd8, 0x0, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x1, 0x60, 0x0, - - /* U+584A "塊" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x10, 0x0, 0x8, 0x70, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x30, 0x19, 0x0, 0x4, 0x0, - 0x0, 0xe, 0x0, 0xc6, 0x68, 0xc6, 0x6f, 0x10, - 0x0, 0xe, 0x0, 0xb1, 0x3, 0xa0, 0xe, 0x0, - 0x5, 0x6e, 0x88, 0xb6, 0x68, 0xc6, 0x6e, 0x0, - 0x1, 0xe, 0x0, 0xb1, 0x4, 0x90, 0xe, 0x0, - 0x0, 0xe, 0x0, 0xb1, 0x6, 0x70, 0xe, 0x0, - 0x0, 0xe, 0x0, 0xc6, 0x6c, 0xd6, 0x6d, 0x0, - 0x0, 0xe, 0x0, 0x20, 0xd, 0xb1, 0x41, 0x0, - 0x0, 0xe, 0x66, 0x0, 0x68, 0xa1, 0xa1, 0x0, - 0x4, 0x9a, 0x10, 0x2, 0xc0, 0xa6, 0x28, 0x0, - 0xb, 0x40, 0x0, 0x1b, 0x20, 0xab, 0x79, 0x90, - 0x0, 0x0, 0x2, 0xa2, 0x0, 0xa2, 0x1, 0x90, - 0x0, 0x0, 0x55, 0x0, 0x0, 0x6c, 0xaa, 0xc2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5869 "塩" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0x10, 0x0, 0xb3, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x2, 0xc0, 0x0, 0x2, 0x0, - 0x0, 0xc, 0x0, 0x8, 0x86, 0x66, 0x6c, 0x40, - 0x0, 0xc, 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, - 0x7, 0x7d, 0x78, 0x66, 0x76, 0x66, 0x7a, 0x0, - 0x0, 0xc, 0x0, 0x16, 0x60, 0x0, 0x39, 0x0, - 0x0, 0xc, 0x0, 0x6, 0x60, 0x0, 0x39, 0x0, - 0x0, 0xc, 0x0, 0x6, 0x96, 0x66, 0x89, 0x0, - 0x0, 0xc, 0x0, 0x12, 0x0, 0x0, 0x2, 0x0, - 0x0, 0xd, 0x66, 0x4b, 0x6a, 0x6a, 0x6e, 0x20, - 0x4, 0xaa, 0x20, 0x2b, 0xc, 0xc, 0xd, 0x0, - 0x9, 0x40, 0x0, 0x2b, 0xc, 0xc, 0xd, 0x0, - 0x0, 0x0, 0x0, 0x2b, 0xc, 0xc, 0xd, 0x0, - 0x0, 0x0, 0x4, 0x7c, 0x6d, 0x6d, 0x6e, 0xc2, - 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+5883 "境" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x10, 0x0, 0x9, 0x30, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x2, 0x60, 0x26, 0x0, - 0x0, 0xe, 0x0, 0x48, 0x76, 0x69, 0x65, 0x10, - 0x0, 0xe, 0x0, 0x0, 0xb2, 0xb, 0x50, 0x0, - 0x6, 0x6e, 0x8a, 0x0, 0x62, 0x26, 0x4, 0x50, - 0x0, 0xe, 0x3, 0x76, 0x66, 0x66, 0x66, 0x50, - 0x0, 0xe, 0x0, 0xc, 0x66, 0x66, 0xc6, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0xb1, 0x0, - 0x0, 0xe, 0x0, 0xe, 0x66, 0x66, 0xd1, 0x0, - 0x0, 0xe, 0x55, 0x2d, 0x0, 0x0, 0xb1, 0x0, - 0xb, 0xb6, 0x0, 0x9, 0xc9, 0xc7, 0x81, 0x20, - 0x2, 0x0, 0x0, 0x0, 0xd2, 0xa2, 0x0, 0x70, - 0x0, 0x0, 0x0, 0x8, 0x90, 0xa3, 0x0, 0xb0, - 0x0, 0x0, 0x26, 0x96, 0x0, 0x5d, 0xbc, 0xc1, - 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5897 "増" */ - 0x0, 0xb, 0x10, 0x5, 0x20, 0x0, 0x57, 0x0, - 0x0, 0xe, 0x0, 0x0, 0xd4, 0x0, 0xc5, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x68, 0x5, 0x30, 0x0, - 0x0, 0xe, 0x0, 0xc6, 0x66, 0x96, 0x66, 0xe0, - 0x4, 0x4e, 0x57, 0xd1, 0x0, 0xd0, 0x1, 0xd0, - 0x3, 0x2e, 0x21, 0xc6, 0x66, 0xe6, 0x66, 0xd0, - 0x0, 0xe, 0x0, 0xd1, 0x0, 0xd0, 0x1, 0xd0, - 0x0, 0xe, 0x0, 0xd6, 0x66, 0xa6, 0x66, 0xd0, - 0x0, 0xe, 0x0, 0x32, 0x0, 0x0, 0x3, 0x20, - 0x0, 0xe, 0x5, 0x1f, 0x66, 0x66, 0x6f, 0x10, - 0x0, 0x2f, 0x91, 0xe, 0x0, 0x0, 0xe, 0x0, - 0xc, 0xd3, 0x0, 0xe, 0x66, 0x66, 0x6e, 0x0, - 0x4, 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x66, 0x66, 0x6f, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x5, 0x0, - - /* U+589E "增" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb1, 0x0, 0x27, 0x0, 0xc, 0x30, 0x0, - 0xd, 0x0, 0x0, 0x96, 0x5, 0x60, 0x0, 0x0, - 0xd0, 0x8, 0x67, 0x86, 0xa6, 0x78, 0x0, 0xd, - 0x0, 0xc0, 0x0, 0xc0, 0x4, 0x70, 0x76, 0xe9, - 0x8c, 0x47, 0xc, 0xb, 0x77, 0x0, 0xd, 0x0, - 0xc0, 0xd2, 0xc3, 0x74, 0x70, 0x0, 0xd0, 0xc, - 0x4, 0xc, 0x30, 0x47, 0x0, 0xd, 0x0, 0xc6, - 0x66, 0x96, 0x68, 0x80, 0x0, 0xd0, 0x2, 0x30, - 0x0, 0x0, 0x60, 0x0, 0xd, 0x4, 0xe, 0x66, - 0x66, 0x7c, 0x0, 0x16, 0xd6, 0x0, 0xd0, 0x0, - 0x2, 0xa0, 0x1e, 0x60, 0x0, 0xe, 0x66, 0x66, - 0x7a, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x2, - 0xa0, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x7b, - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x10, - - /* U+58CA "壊" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, - 0x0, 0xd, 0x2, 0x66, 0x66, 0xd6, 0x69, 0x90, - 0x0, 0xd, 0x0, 0x10, 0x1, 0xa0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x86, 0x68, 0xb7, 0x6b, 0x30, - 0x5, 0x6e, 0x79, 0xa1, 0xc, 0xc, 0xa, 0x10, - 0x1, 0xd, 0x0, 0xa1, 0xc, 0xc, 0xa, 0x10, - 0x0, 0xd, 0x0, 0xb6, 0x6d, 0x6d, 0x6c, 0x20, - 0x0, 0xd, 0x0, 0x50, 0x2, 0x70, 0x4, 0x0, - 0x0, 0xd, 0x2, 0x66, 0x66, 0xd6, 0x6c, 0x30, - 0x0, 0xd, 0x5, 0x20, 0x97, 0x50, 0x3, 0x0, - 0x0, 0x2e, 0x70, 0x6, 0xd0, 0x35, 0x5b, 0x10, - 0xb, 0xd3, 0x0, 0x78, 0xc0, 0xb, 0x60, 0x0, - 0x4, 0x0, 0x36, 0x12, 0xc1, 0x42, 0xd5, 0x0, - 0x0, 0x0, 0x10, 0x4, 0xf7, 0x0, 0x3e, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, - - /* U+58D3 "壓" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x76, 0x66, 0x66, 0x66, 0x66, 0x6d, 0x50, - 0x0, 0xa2, 0x64, 0x44, 0x70, 0x8, 0x20, 0x0, - 0x0, 0xa2, 0xc6, 0x66, 0xd0, 0xc, 0x3a, 0x0, - 0x0, 0xa2, 0xc2, 0x22, 0xc0, 0xc, 0x6, 0x0, - 0x0, 0xb1, 0x84, 0x44, 0x84, 0x6d, 0x6b, 0x10, - 0x0, 0xc0, 0xb6, 0x66, 0xd1, 0xb, 0x50, 0x0, - 0x0, 0xc0, 0xd6, 0x66, 0xc0, 0x47, 0x70, 0x0, - 0x2, 0x90, 0xb0, 0x0, 0xc0, 0x91, 0x81, 0x0, - 0x6, 0x30, 0xd6, 0x66, 0xc2, 0x70, 0x3b, 0x0, - 0x8, 0x0, 0xc0, 0x6, 0xb6, 0x0, 0xa, 0x70, - 0x22, 0x0, 0x10, 0x2, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x66, 0x67, 0xb6, 0x67, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x90, 0x0, 0x1, 0x0, - 0x4, 0x66, 0x66, 0x67, 0xb6, 0x66, 0x6c, 0xb0, - 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+58EB "士" */ - 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x1, 0xb2, 0x7, 0x66, 0x66, - 0x6d, 0x86, 0x66, 0x66, 0x40, 0x0, 0x0, 0x0, - 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, - 0x1, 0x0, 0x0, 0x46, 0x66, 0x6d, 0x86, 0x66, - 0xf6, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+58F0 "声" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x4, 0x0, 0x37, - 0x66, 0x66, 0x6e, 0x66, 0x67, 0xb4, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x10, 0x0, 0x0, 0x76, - 0x66, 0x6b, 0x66, 0x8b, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0xc7, 0x66, - 0x6c, 0x66, 0x6d, 0x30, 0x0, 0xc, 0x20, 0x0, - 0xd0, 0x0, 0xc1, 0x0, 0x0, 0xc2, 0x0, 0xd, - 0x0, 0xc, 0x10, 0x0, 0xd, 0x66, 0x66, 0x66, - 0x66, 0xb1, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+58F2 "売" */ - 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb2, 0x0, 0x8, 0x10, 0x1, - 0x76, 0x66, 0x6d, 0x76, 0x66, 0x63, 0x0, 0x0, - 0x0, 0x0, 0xb2, 0x0, 0x60, 0x0, 0x0, 0x5, - 0x76, 0x66, 0x66, 0x67, 0x20, 0x0, 0x18, 0x66, - 0x66, 0x66, 0x66, 0x66, 0xa1, 0x6, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0x30, 0xb2, 0x0, 0x82, - 0x1, 0x60, 0x4, 0x0, 0x0, 0x0, 0xc, 0x40, - 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x1c, - 0x0, 0x1, 0x0, 0x0, 0x5, 0x90, 0x1, 0xc0, - 0x0, 0x60, 0x0, 0x1, 0xc2, 0x0, 0x1d, 0x0, - 0x8, 0x10, 0x5, 0x92, 0x0, 0x0, 0xdc, 0xcc, - 0xd4, 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5909 "変" */ - 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb2, 0x0, 0x3, 0xa0, 0x7, - 0x66, 0x6d, 0x76, 0x6d, 0x76, 0x67, 0x20, 0x0, - 0x41, 0xd2, 0x0, 0xe2, 0x10, 0x0, 0x0, 0x1d, - 0x5d, 0x20, 0xe, 0x25, 0xa4, 0x0, 0xa, 0x20, - 0xd2, 0x0, 0xe2, 0x2, 0xd7, 0x17, 0x10, 0xa, - 0x10, 0x6, 0x0, 0x2, 0x70, 0x0, 0x0, 0xb8, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x7c, 0x66, - 0x66, 0xcd, 0x0, 0x0, 0x0, 0x67, 0x71, 0x0, - 0x5e, 0x30, 0x0, 0x0, 0x63, 0x0, 0xa1, 0x5d, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xec, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xa6, 0x9c, 0x61, - 0x0, 0x0, 0x3, 0x78, 0x40, 0x0, 0x29, 0xee, - 0xc6, 0x15, 0x30, 0x0, 0x0, 0x0, 0x0, 0x44, - 0x0, - - /* U+590F "夏" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x83, 0x0, - 0x4, 0x76, 0x66, 0xaa, 0x66, 0x66, 0x65, 0x0, - 0x0, 0xa, 0x66, 0x96, 0x66, 0x6d, 0x30, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xc, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0xc, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xc, 0x68, 0x86, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x4, 0xd, 0x20, 0x0, 0x51, 0x0, 0x0, - 0x0, 0x0, 0x9b, 0x66, 0x68, 0xf4, 0x0, 0x0, - 0x0, 0x7, 0x60, 0x80, 0x2d, 0x30, 0x0, 0x0, - 0x0, 0x74, 0x0, 0x1b, 0xd2, 0x0, 0x0, 0x0, - 0x4, 0x10, 0x2, 0x99, 0x8b, 0x62, 0x0, 0x0, - 0x0, 0x26, 0x86, 0x10, 0x1, 0x8d, 0xfd, 0x60, - 0x24, 0x30, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, - - /* U+5915 "夕" */ - 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x80, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3f, - 0x66, 0x66, 0x6d, 0xb0, 0x0, 0x0, 0xa6, 0x0, - 0x0, 0x1f, 0x40, 0x0, 0x4, 0xc0, 0x0, 0x0, - 0x8c, 0x0, 0x0, 0xc, 0x94, 0x0, 0x0, 0xe4, - 0x0, 0x0, 0x75, 0xc, 0x80, 0x8, 0xa0, 0x0, - 0x4, 0x60, 0x2, 0xf4, 0x2e, 0x20, 0x0, 0x4, - 0x0, 0x0, 0x72, 0xd5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x30, - 0x0, 0x0, 0x0, 0x2, 0x78, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5916 "外" */ - 0x0, 0x0, 0x77, 0x0, 0x0, 0xb3, 0x0, 0x0, - 0x0, 0xc, 0x60, 0x0, 0xe, 0x0, 0x0, 0x0, - 0x1, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x6c, 0x66, 0xb6, 0xe, 0x0, 0x0, 0x0, 0xb, - 0x30, 0xd, 0x70, 0xe0, 0x0, 0x0, 0x2, 0xb0, - 0x2, 0xe0, 0xe, 0x40, 0x0, 0x0, 0x98, 0x80, - 0x68, 0x0, 0xe3, 0xb7, 0x0, 0x26, 0x9, 0x8c, - 0x20, 0xe, 0x1, 0xca, 0x5, 0x0, 0x7, 0xa0, - 0x0, 0xe0, 0x1, 0x90, 0x0, 0x0, 0xb3, 0x0, - 0xe, 0x0, 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, - 0xe0, 0x0, 0x0, 0x0, 0x39, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, 0x0, 0xe0, - 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, - 0x0, - - /* U+591A "多" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xc1, 0x0, 0x5, 0x0, 0x0, 0x0, 0x9a, - 0x66, 0x66, 0x8f, 0x60, 0x0, 0x39, 0x49, 0x30, - 0x3, 0xd4, 0x0, 0x6, 0x40, 0x3, 0xb0, 0x6b, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x69, 0x8a, 0x10, 0x0, 0x0, - 0x25, 0x66, 0x20, 0xaa, 0x10, 0x0, 0x30, 0x0, - 0x0, 0x1b, 0x96, 0x66, 0x69, 0xf2, 0x0, 0x4, - 0xb7, 0x0, 0x0, 0x2d, 0x30, 0x2, 0x74, 0x3, - 0xb0, 0x3, 0xc2, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x7a, 0x10, 0x0, 0x0, 0x0, 0x1, 0x7a, 0x40, - 0x0, 0x0, 0x0, 0x26, 0x77, 0x30, 0x0, 0x0, - 0x0, 0x24, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+591C "夜" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x2, 0x0, - 0x8, 0x66, 0x76, 0x66, 0x86, 0x66, 0x6b, 0x70, - 0x0, 0x0, 0xe5, 0x5, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xc0, 0xa, 0x50, 0x0, 0x60, 0x0, - 0x0, 0xc, 0x30, 0x1d, 0x66, 0x67, 0xf2, 0x0, - 0x0, 0x4f, 0x40, 0x85, 0x53, 0x6, 0x90, 0x0, - 0x0, 0xbc, 0x21, 0xb5, 0xe, 0x1b, 0x30, 0x0, - 0x7, 0x2b, 0x28, 0x17, 0x15, 0x2c, 0x0, 0x0, - 0x13, 0xb, 0x42, 0x1, 0x90, 0x95, 0x0, 0x0, - 0x0, 0xb, 0x20, 0x0, 0x59, 0xc0, 0x0, 0x0, - 0x0, 0xb, 0x20, 0x0, 0x2f, 0x90, 0x0, 0x0, - 0x0, 0xb, 0x20, 0x3, 0xb2, 0x8c, 0x50, 0x0, - 0x0, 0xb, 0x21, 0x87, 0x0, 0x4, 0xdf, 0x90, - 0x0, 0x6, 0x35, 0x0, 0x0, 0x0, 0x4, 0x0, - - /* U+5920 "夠" */ - 0x0, 0x0, 0x85, 0x0, 0x1, 0x60, 0x0, 0x0, - 0x0, 0x3, 0xd2, 0x25, 0x6, 0xc0, 0x0, 0x0, - 0x0, 0x1b, 0x44, 0x6f, 0x3c, 0x10, 0x0, 0x50, - 0x1, 0x78, 0x50, 0xc4, 0x59, 0x66, 0x66, 0xe1, - 0x3, 0x1, 0x6a, 0x61, 0x90, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x96, 0x8, 0x10, 0x0, 0x20, 0xd0, - 0x0, 0x38, 0x7d, 0x10, 0x3c, 0x66, 0xd0, 0xd0, - 0x4, 0x30, 0xd8, 0x6c, 0x7a, 0x1, 0xc0, 0xd0, - 0x0, 0xa, 0x40, 0x2e, 0x4a, 0x1, 0xc1, 0xc0, - 0x0, 0x88, 0x40, 0x96, 0x2c, 0x66, 0xc1, 0xc0, - 0x4, 0x10, 0xd3, 0xc0, 0x37, 0x0, 0x72, 0xb0, - 0x0, 0x0, 0x2c, 0x20, 0x0, 0x0, 0x4, 0x90, - 0x0, 0x2, 0xb2, 0x0, 0x0, 0x22, 0x19, 0x70, - 0x0, 0x67, 0x0, 0x0, 0x0, 0x26, 0xef, 0x20, - 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, - - /* U+5927 "大" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x6, 0x10, - 0x6, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x6a, 0x80, - 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4a, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x95, 0x27, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0x8, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x70, 0x1, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x5b, 0x0, 0x0, 0x3c, 0x20, 0x0, - 0x0, 0x6, 0x90, 0x0, 0x0, 0x5, 0xf9, 0x20, - 0x2, 0x84, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x60, - 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5929 "天" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, - 0x0, 0x28, 0x66, 0x69, 0x66, 0x69, 0xb2, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x3b, 0x0, - 0x6, 0x76, 0x66, 0x7e, 0x96, 0x66, 0x67, 0x30, - 0x0, 0x0, 0x0, 0x69, 0x42, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa5, 0x8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xd0, 0x7, 0x20, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x50, 0x1, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x68, 0x0, 0x0, 0x5d, 0x20, 0x0, - 0x0, 0x5, 0x60, 0x0, 0x0, 0x6, 0xf8, 0x20, - 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x91, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+592A "太" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x8, 0x0, - 0x4, 0x76, 0x66, 0x6f, 0x86, 0x66, 0x7a, 0x50, - 0x0, 0x0, 0x0, 0x1d, 0x51, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5a, 0x26, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x95, 0xa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0x7, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x70, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x54, 0x0, 0x5b, 0x0, 0x0, - 0x0, 0x1, 0xb1, 0xb, 0xa0, 0x9, 0xb0, 0x0, - 0x0, 0x2a, 0x10, 0x1, 0xf1, 0x0, 0xce, 0x60, - 0x4, 0x60, 0x0, 0x0, 0x20, 0x0, 0x1b, 0x61, - 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+592B "夫" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x6, 0x0, 0x0, 0x56, - 0x66, 0x6d, 0x86, 0x66, 0x83, 0x0, 0x0, 0x0, - 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x20, 0x0, 0x2, 0x0, 0x56, 0x66, 0x66, - 0xe6, 0x66, 0x68, 0xf5, 0x1, 0x0, 0x0, 0x1d, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x81, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd2, 0x9, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, 0x3b, - 0x0, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, 0x8a, - 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x9d, - 0x50, 0x4, 0x72, 0x0, 0x0, 0x0, 0x0, 0x6e, - 0x71, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+592E "央" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x20, 0x0, 0x0, 0xa, - 0x76, 0x6d, 0x86, 0x6d, 0x60, 0x0, 0x0, 0xa4, - 0x0, 0xb3, 0x0, 0xc3, 0x0, 0x0, 0xa, 0x40, - 0xb, 0x20, 0xc, 0x30, 0x0, 0x0, 0xa4, 0x0, - 0xc1, 0x0, 0xc3, 0x0, 0x0, 0xa, 0x40, 0xd, - 0x10, 0xc, 0x4b, 0x10, 0x57, 0x66, 0x66, 0xe9, - 0x66, 0x66, 0x63, 0x0, 0x0, 0x0, 0x4a, 0x33, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x40, 0x91, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x90, 0x2, 0xb2, - 0x0, 0x0, 0x0, 0x8, 0x70, 0x0, 0x3, 0xe8, - 0x10, 0x0, 0x58, 0x10, 0x0, 0x0, 0x2, 0xcf, - 0x61, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, - - /* U+5931 "失" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x40, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x8a, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x76, 0x6d, 0x86, 0x6a, 0xc1, 0x0, 0x1, 0x90, - 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x71, 0x0, - 0xd, 0x10, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0xe0, 0x0, 0x1, 0x80, 0x6, 0x76, 0x66, 0x7e, - 0x86, 0x66, 0x79, 0x40, 0x0, 0x0, 0x6, 0x94, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc3, 0x9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x57, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0x10, 0x0, 0xa7, - 0x0, 0x0, 0x0, 0x3a, 0x10, 0x0, 0x0, 0xbc, - 0x30, 0x1, 0x66, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0x80, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, - - /* U+5947 "奇" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x30, 0x0, - 0x0, 0x76, 0x66, 0x8d, 0x66, 0x68, 0xb2, 0x0, - 0x0, 0x0, 0x0, 0xc6, 0x76, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0x30, 0x4, 0xda, 0x0, 0x0, - 0x0, 0x46, 0x60, 0x0, 0x0, 0xa, 0x27, 0x10, - 0x18, 0x66, 0x66, 0x66, 0x66, 0x6a, 0x7a, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x10, 0xd, 0x0, 0x0, - 0x0, 0xc, 0x66, 0x66, 0xe1, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0xe0, 0xd, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0xe0, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x66, 0x66, 0xe0, 0xd, 0x0, 0x0, - 0x0, 0xa, 0x0, 0x0, 0x50, 0xe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xed, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, - - /* U+5951 "契" */ - 0x0, 0x0, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa2, 0x24, 0x1, 0x11, 0x16, 0x20, - 0x4, 0x76, 0xc7, 0x65, 0x36, 0xe5, 0x5c, 0x50, - 0x0, 0x56, 0xc7, 0xa3, 0x0, 0xd0, 0xc, 0x20, - 0x0, 0x10, 0xa2, 0x0, 0x4, 0x90, 0xd, 0x0, - 0x4, 0x66, 0xc7, 0x7b, 0xb, 0x10, 0xd, 0x0, - 0x1, 0x10, 0xa2, 0x0, 0x94, 0x33, 0x6b, 0x0, - 0x0, 0x0, 0xb3, 0x37, 0x10, 0x6, 0xe3, 0x0, - 0x0, 0x0, 0x51, 0xc, 0x20, 0x0, 0x1, 0x0, - 0x5, 0x66, 0x66, 0x6f, 0x66, 0x66, 0x8f, 0x40, - 0x1, 0x0, 0x0, 0x87, 0x61, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xd0, 0x9, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x3c, 0x20, 0x0, 0xb8, 0x20, 0x0, - 0x0, 0x38, 0x70, 0x0, 0x0, 0x7, 0xfe, 0x80, - 0x15, 0x30, 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, - - /* U+5957 "套" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6b, 0x0, 0x0, 0x29, 0x0, - 0x0, 0x76, 0x66, 0xf6, 0x68, 0x76, 0x66, 0x20, - 0x0, 0x0, 0xa, 0x60, 0x0, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x88, 0x0, 0x0, 0x7c, 0x40, 0x0, - 0x0, 0x8, 0x4e, 0x66, 0x66, 0x95, 0xdc, 0x81, - 0x2, 0x61, 0xe, 0x0, 0x0, 0x80, 0x7, 0x50, - 0x2, 0x0, 0xe, 0x66, 0x66, 0x63, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x66, 0x66, 0x7b, 0x10, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x5, 0x10, - 0x6, 0x76, 0x6b, 0x79, 0x66, 0x66, 0x6b, 0x90, - 0x0, 0x0, 0x0, 0xc4, 0x2, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x19, 0x20, 0x0, 0x3c, 0x70, 0x0, - 0x0, 0x1, 0xeb, 0xa8, 0x76, 0x55, 0xd4, 0x0, - 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x11, 0x0, - - /* U+5973 "女" */ - 0x0, 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x88, 0x0, 0x0, 0x2, 0x0, 0x56, 0x66, - 0x6d, 0x86, 0x66, 0x66, 0xdb, 0x0, 0x0, 0x2, - 0xd0, 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0x77, - 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, 0xd, 0x10, - 0x0, 0xf1, 0x0, 0x0, 0x0, 0x4, 0xa0, 0x0, - 0x6a, 0x0, 0x0, 0x0, 0x0, 0x48, 0x61, 0xe, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xc5, 0xdb, - 0x40, 0x0, 0x0, 0x0, 0x2b, 0x70, 0x0, 0x7f, - 0x70, 0x0, 0x5, 0x86, 0x10, 0x0, 0x0, 0x3b, - 0x0, 0x35, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5979 "她" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x70, 0x0, 0x0, 0x82, 0x0, 0x0, - 0x0, 0x9, 0x50, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xb, 0x20, 0x2, 0x80, 0xd0, 0x0, 0x0, - 0x0, 0xd, 0x2, 0x32, 0xa0, 0xd0, 0x3, 0x0, - 0x6, 0x7d, 0x6a, 0x82, 0xa0, 0xd5, 0x6f, 0x20, - 0x0, 0x2a, 0x8, 0x68, 0xc6, 0xd0, 0xd, 0x0, - 0x0, 0x57, 0xb, 0x12, 0xa0, 0xd0, 0xe, 0x0, - 0x0, 0x83, 0xd, 0x2, 0xa0, 0xd0, 0xe, 0x0, - 0x0, 0xb0, 0x1b, 0x2, 0xa0, 0xd0, 0x1d, 0x0, - 0x0, 0xc0, 0x57, 0x2, 0xa0, 0xd3, 0xc8, 0x0, - 0x0, 0x59, 0xc3, 0x2, 0xa0, 0xd1, 0x0, 0x30, - 0x0, 0x2, 0xbd, 0x52, 0xa0, 0x70, 0x0, 0x70, - 0x0, 0x9, 0x2, 0xc2, 0xb0, 0x0, 0x0, 0xc0, - 0x1, 0x81, 0x0, 0x0, 0xdb, 0xbb, 0xbc, 0xd2, - 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+597D "好" */ - 0x0, 0x7, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x40, 0x4, 0x66, 0x66, 0x99, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, - 0x26, 0x6e, 0x67, 0x80, 0x0, 0x7, 0x20, 0x0, - 0x0, 0x49, 0x6, 0x70, 0x0, 0xb6, 0x0, 0x0, - 0x0, 0x75, 0x9, 0x40, 0x0, 0xc1, 0x0, 0x0, - 0x0, 0xa1, 0xc, 0x10, 0x0, 0xc1, 0x3, 0x30, - 0x0, 0xc0, 0xd, 0x36, 0x66, 0xd6, 0x68, 0x70, - 0x3, 0x90, 0x39, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x5, 0x80, 0x85, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x0, 0x28, 0xf4, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x0, 0x8, 0x7c, 0xa0, 0x0, 0xc1, 0x0, 0x0, - 0x0, 0x66, 0x0, 0xa0, 0x0, 0xd1, 0x0, 0x0, - 0x7, 0x30, 0x0, 0x1, 0x7d, 0xe0, 0x0, 0x0, - 0x20, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, - - /* U+5982 "如" */ - 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x67, 0x0, 0x60, 0xb6, 0x66, 0xc4, 0x6, 0x7c, - 0x86, 0x8c, 0xd, 0x0, 0xb, 0x10, 0x0, 0xc0, - 0x5, 0x80, 0xd0, 0x0, 0xb1, 0x0, 0xc, 0x0, - 0x85, 0xd, 0x0, 0xb, 0x10, 0x3, 0x90, 0xb, - 0x20, 0xd0, 0x0, 0xb1, 0x0, 0x75, 0x0, 0xd0, - 0xd, 0x0, 0xb, 0x10, 0xb, 0x40, 0x3a, 0x0, - 0xd0, 0x0, 0xb1, 0x0, 0x4, 0x9c, 0x80, 0xd, - 0x0, 0xb, 0x10, 0x0, 0x3, 0xbb, 0xc0, 0xd6, - 0x66, 0xd1, 0x0, 0x3, 0xa0, 0x9, 0x2d, 0x0, - 0xb, 0x20, 0x6, 0x70, 0x0, 0x0, 0x70, 0x0, - 0x20, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5987 "妇" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0x10, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, - 0xd0, 0x0, 0x76, 0x66, 0x66, 0xe3, 0x16, 0x8c, - 0x66, 0xb0, 0x0, 0x0, 0xe, 0x0, 0x6, 0x70, - 0x4a, 0x0, 0x0, 0x0, 0xe0, 0x0, 0xa3, 0x6, - 0x70, 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, 0x94, - 0x26, 0x66, 0x66, 0xe0, 0x1, 0xb0, 0xc, 0x0, - 0x20, 0x0, 0xe, 0x0, 0x48, 0x1, 0xc0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x49, 0x97, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0xd, 0xc3, 0x0, 0x0, - 0x0, 0xe0, 0x0, 0x6, 0x63, 0xd3, 0x66, 0x66, - 0x6e, 0x0, 0x3, 0x80, 0x3, 0x1, 0x0, 0x0, - 0xe0, 0x3, 0x60, 0x0, 0x0, 0x0, 0x0, 0xa, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+59B3 "妳" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xb0, 0x0, 0x8, 0x30, 0x0, 0x0, - 0x0, 0x8, 0x70, 0x0, 0xf, 0x20, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x0, 0x49, 0x0, 0x0, 0x10, - 0x5, 0x6e, 0x66, 0xa0, 0xa8, 0x66, 0x66, 0xe2, - 0x1, 0x3b, 0x3, 0xc0, 0xa0, 0x0, 0x5, 0x60, - 0x0, 0x76, 0x6, 0x86, 0x20, 0x18, 0x4, 0x0, - 0x0, 0xb1, 0x9, 0x43, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0xc0, 0xd, 0x0, 0x33, 0x1c, 0x10, 0x0, - 0x4, 0x80, 0x2c, 0x0, 0x99, 0x1c, 0x28, 0x0, - 0x1, 0x77, 0x87, 0x0, 0xc0, 0x1c, 0x8, 0x90, - 0x0, 0x2, 0xfb, 0x16, 0x30, 0x1c, 0x0, 0xf1, - 0x0, 0x8, 0x67, 0xc3, 0x0, 0x1c, 0x0, 0x30, - 0x0, 0x58, 0x0, 0x20, 0x0, 0x2c, 0x0, 0x0, - 0x5, 0x50, 0x0, 0x0, 0x7, 0xf8, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - - /* U+59B9 "妹" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x9, 0x80, 0x0, 0x0, 0xe1, 0x0, 0x0, - 0x0, 0xc, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x1, 0x22, 0xd2, 0x38, 0x0, - 0x16, 0x7d, 0x68, 0x74, 0x54, 0xd4, 0x44, 0x10, - 0x2, 0x66, 0x8, 0x50, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xa2, 0xb, 0x20, 0x0, 0xd0, 0x1, 0x40, - 0x0, 0xc0, 0xd, 0x37, 0x6a, 0xe7, 0x67, 0x80, - 0x2, 0x90, 0x2a, 0x0, 0xd, 0xd6, 0x0, 0x0, - 0x7, 0x50, 0x66, 0x0, 0x48, 0xd6, 0x10, 0x0, - 0x5, 0x83, 0xb1, 0x0, 0xb1, 0xd1, 0xa0, 0x0, - 0x0, 0x8, 0xf3, 0x5, 0x60, 0xd0, 0x84, 0x0, - 0x0, 0x9, 0x4d, 0x29, 0x0, 0xd0, 0x1d, 0x40, - 0x0, 0x64, 0x2, 0x80, 0x0, 0xd0, 0x4, 0xb2, - 0x4, 0x40, 0x2, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, - - /* U+59BB "妻" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x12, 0x0, - 0x6, 0x76, 0x66, 0x6e, 0x66, 0x66, 0xbc, 0x20, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x66, 0x6e, 0x66, 0x6d, 0x20, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0xe, 0x4, 0x20, - 0x7, 0x66, 0x66, 0x6e, 0x66, 0x6e, 0x69, 0x80, - 0x0, 0x0, 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x18, 0x66, 0xa8, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x5, 0x20, - 0x28, 0x66, 0x6c, 0x86, 0x66, 0xb6, 0x69, 0x80, - 0x0, 0x0, 0x2b, 0x0, 0x6, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x79, 0x42, 0x2d, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x39, 0xfd, 0x94, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x8a, 0x20, 0x5b, 0xe2, 0x0, - 0x3, 0x56, 0x76, 0x10, 0x0, 0x0, 0x34, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+59C9 "姉" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb6, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, - 0xe, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x2, - 0xc0, 0x0, 0x0, 0xd, 0x0, 0x20, 0x26, 0x9b, - 0x68, 0x68, 0x66, 0xe6, 0x69, 0x50, 0x29, 0x40, - 0x95, 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, 0xc, - 0x13, 0x0, 0xd0, 0x5, 0x0, 0x2b, 0x0, 0xd0, - 0xd6, 0x6e, 0x66, 0xe1, 0x6, 0x60, 0x49, 0xc, - 0x0, 0xd0, 0xd, 0x0, 0xa1, 0x8, 0x50, 0xc0, - 0xd, 0x0, 0xd0, 0x7, 0x72, 0xd0, 0xc, 0x0, - 0xd0, 0xd, 0x0, 0x0, 0xae, 0x50, 0xc0, 0xd, - 0x0, 0xd0, 0x0, 0xb, 0x3c, 0x6d, 0x0, 0xd3, - 0x9d, 0x0, 0x9, 0x20, 0x3, 0x20, 0xd, 0x2, - 0x20, 0x6, 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - - /* U+59CB "始" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x6, 0xa0, 0x0, 0x3, 0xe1, 0x0, 0x0, - 0x0, 0x9, 0x60, 0x0, 0x8, 0x80, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0xc, 0x10, 0x20, 0x0, - 0x5, 0x6e, 0x66, 0xa0, 0x56, 0x0, 0x76, 0x0, - 0x2, 0x49, 0x4, 0xa0, 0xa0, 0x0, 0xc, 0x60, - 0x0, 0x85, 0x7, 0x7a, 0xb9, 0x87, 0x68, 0xe0, - 0x0, 0xc0, 0xa, 0x34, 0x61, 0x0, 0x0, 0x60, - 0x1, 0xb0, 0xd, 0x0, 0x20, 0x0, 0x3, 0x0, - 0x5, 0x70, 0x2b, 0x0, 0xe6, 0x66, 0x6e, 0x30, - 0x4, 0x84, 0x86, 0x0, 0xe0, 0x0, 0xe, 0x0, - 0x0, 0x5, 0xf8, 0x0, 0xe0, 0x0, 0xe, 0x0, - 0x0, 0x8, 0x6b, 0xa0, 0xe0, 0x0, 0xe, 0x0, - 0x0, 0x47, 0x0, 0x80, 0xe6, 0x66, 0x6e, 0x0, - 0x4, 0x50, 0x0, 0x0, 0xe0, 0x0, 0xd, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x20, 0x0, 0x1, 0x0, - - /* U+59D0 "姐" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x70, 0x0, 0xd6, 0x66, 0x6e, 0x10, - 0x0, 0xc, 0x20, 0x0, 0xe0, 0x0, 0xd, 0x0, - 0x16, 0x6e, 0x66, 0xa1, 0xe0, 0x0, 0xd, 0x0, - 0x0, 0x49, 0x2, 0xc0, 0xe0, 0x0, 0xd, 0x0, - 0x0, 0x85, 0x6, 0x80, 0xe6, 0x66, 0x6d, 0x0, - 0x0, 0xc0, 0x9, 0x40, 0xe0, 0x0, 0xd, 0x0, - 0x1, 0xb0, 0xd, 0x0, 0xe0, 0x0, 0xd, 0x0, - 0x6, 0x50, 0x2b, 0x0, 0xe0, 0x0, 0xd, 0x0, - 0x5, 0x84, 0x85, 0x0, 0xe6, 0x66, 0x6d, 0x0, - 0x0, 0x5, 0xf8, 0x0, 0xe0, 0x0, 0xd, 0x0, - 0x0, 0x9, 0x47, 0xd0, 0xe0, 0x0, 0xd, 0x0, - 0x0, 0x66, 0x0, 0x60, 0xe0, 0x0, 0xd, 0x20, - 0x5, 0x40, 0x0, 0x76, 0xa6, 0x66, 0x6a, 0xa3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+59D4 "委" */ - 0x0, 0x0, 0x0, 0x0, 0x14, 0x7c, 0x70, 0x0, - 0x0, 0x3, 0x56, 0x7a, 0xd5, 0x43, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x2, 0x30, - 0x4, 0x76, 0x66, 0x7b, 0xd8, 0x66, 0x69, 0xa0, - 0x0, 0x0, 0x2, 0xc5, 0xb4, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x4b, 0x22, 0xb0, 0x4c, 0x61, 0x0, - 0x0, 0x18, 0x60, 0x5, 0x90, 0x1, 0xaf, 0xc3, - 0x4, 0x40, 0x0, 0x7c, 0x0, 0x0, 0x2, 0x40, - 0x5, 0x66, 0x66, 0xe7, 0x66, 0x66, 0x6b, 0xd1, - 0x1, 0x0, 0xb, 0x40, 0x0, 0xc4, 0x0, 0x0, - 0x0, 0x0, 0x5b, 0x30, 0x7, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x37, 0xcf, 0x71, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3a, 0x82, 0x8e, 0xb2, 0x0, - 0x0, 0x25, 0x78, 0x61, 0x0, 0x0, 0x8e, 0x0, - 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+5A18 "娘" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xc1, 0x0, 0x1, 0x91, 0x0, 0x0, - 0x0, 0x5, 0xb0, 0x0, 0x0, 0x69, 0x1, 0x0, - 0x0, 0x8, 0x60, 0x0, 0xc6, 0x77, 0x6e, 0x0, - 0x4, 0x5d, 0x75, 0x91, 0xd0, 0x0, 0xd, 0x0, - 0x1, 0x1d, 0x1, 0xc0, 0xd6, 0x66, 0x6d, 0x0, - 0x0, 0x39, 0x4, 0x90, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0x75, 0x7, 0x50, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0xb1, 0xa, 0x20, 0xd6, 0x86, 0x6d, 0x0, - 0x0, 0xc0, 0xc, 0x0, 0xd0, 0x80, 0x4, 0x80, - 0x0, 0x87, 0x69, 0x0, 0xd0, 0x55, 0x3a, 0x30, - 0x0, 0x2, 0xeb, 0x10, 0xd0, 0xc, 0x60, 0x0, - 0x0, 0x4, 0x97, 0xc0, 0xd0, 0x26, 0xb1, 0x0, - 0x0, 0x2a, 0x0, 0x40, 0xe9, 0x50, 0x7e, 0x71, - 0x2, 0x80, 0x0, 0x0, 0xd4, 0x0, 0x4, 0x80, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5A5A "婚" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x60, 0x0, 0x0, 0x27, 0xd9, 0x0, - 0x0, 0xd, 0x20, 0xb, 0x56, 0xe2, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x0, - 0x5, 0x7c, 0x69, 0x4c, 0x66, 0xd7, 0x67, 0xa0, - 0x0, 0x76, 0xa, 0x3c, 0x0, 0x59, 0x0, 0x0, - 0x0, 0xb2, 0xd, 0xc, 0x2, 0x2c, 0x40, 0x50, - 0x0, 0xc0, 0xc, 0xe, 0xa5, 0x2, 0xd7, 0x90, - 0x3, 0x90, 0x39, 0x5, 0x0, 0x0, 0x8, 0xd0, - 0x7, 0x40, 0x85, 0x9, 0x66, 0x66, 0x6d, 0x0, - 0x4, 0x84, 0xc0, 0xa, 0x30, 0x0, 0xd, 0x0, - 0x0, 0x8, 0xe4, 0xa, 0x76, 0x66, 0x6d, 0x0, - 0x0, 0xb, 0x2d, 0x3a, 0x30, 0x0, 0xd, 0x0, - 0x0, 0x82, 0x2, 0x3a, 0x30, 0x0, 0xd, 0x0, - 0x6, 0x20, 0x0, 0xa, 0x76, 0x66, 0x6d, 0x0, - 0x10, 0x0, 0x0, 0x4, 0x0, 0x0, 0x2, 0x0, - - /* U+5A66 "婦" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x30, 0x5, 0x66, 0x66, 0x6a, 0x0, - 0x0, 0xe, 0x0, 0x1, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x3a, 0x0, 0x2, 0x86, 0x66, 0x6d, 0x0, - 0x14, 0x89, 0x48, 0x10, 0x0, 0x0, 0xd, 0x0, - 0x4, 0xb4, 0x2d, 0x26, 0x76, 0x66, 0x6d, 0x0, - 0x0, 0xc0, 0xd, 0x30, 0x0, 0x0, 0x0, 0x30, - 0x2, 0xa0, 0x3a, 0xa6, 0x66, 0xd6, 0x68, 0xd1, - 0x6, 0x60, 0x68, 0xc0, 0x0, 0xd0, 0x4, 0x0, - 0xa, 0x10, 0xb2, 0xa, 0x66, 0xe6, 0x6c, 0x0, - 0x6, 0x73, 0xc0, 0xc, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0xb, 0xd3, 0xc, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0x1b, 0x3e, 0x2c, 0x0, 0xd0, 0xc, 0x0, - 0x0, 0x91, 0x2, 0x1c, 0x0, 0xd3, 0xb8, 0x0, - 0x6, 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, - - /* U+5A92 "媒" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x70, 0x2, 0xa0, 0x0, 0xa3, 0x0, - 0x0, 0xa, 0x40, 0x1, 0xb0, 0x0, 0xd0, 0x10, - 0x0, 0xd, 0x0, 0x66, 0xd6, 0x66, 0xe7, 0xb1, - 0x3, 0x4d, 0x46, 0x51, 0xb0, 0x0, 0xd0, 0x0, - 0x3, 0x69, 0x28, 0x71, 0xd6, 0x66, 0xe0, 0x0, - 0x0, 0x84, 0xa, 0x31, 0xb0, 0x0, 0xd0, 0x0, - 0x0, 0xb0, 0xc, 0x2, 0xd6, 0x66, 0xe0, 0x0, - 0x0, 0xb0, 0xc, 0x1, 0x70, 0xa2, 0x40, 0x0, - 0x4, 0x70, 0x48, 0x0, 0x0, 0xd0, 0x4, 0x70, - 0x3, 0x84, 0x93, 0x67, 0x6d, 0xf9, 0x66, 0x51, - 0x0, 0x7, 0xf5, 0x0, 0x5a, 0xd7, 0x10, 0x0, - 0x0, 0xa, 0x4c, 0x42, 0xb0, 0xd1, 0xb1, 0x0, - 0x0, 0x56, 0x1, 0x5a, 0x0, 0xd0, 0x3e, 0x72, - 0x4, 0x60, 0x4, 0x60, 0x0, 0xe0, 0x3, 0x81, - 0x2, 0x0, 0x1, 0x0, 0x0, 0x70, 0x0, 0x0, - - /* U+5ABD "媽" */ - 0x0, 0x8, 0x40, 0x3, 0x0, 0x0, 0x7, 0x10, - 0x0, 0xd, 0x20, 0xd, 0x66, 0xe6, 0x66, 0x30, - 0x0, 0x1d, 0x0, 0xd, 0x0, 0xd0, 0x4, 0x0, - 0x16, 0x8b, 0x68, 0x4d, 0x55, 0xd5, 0x55, 0x0, - 0x2, 0x95, 0xa, 0x3d, 0x0, 0xd0, 0x1, 0x0, - 0x0, 0xc1, 0xc, 0xd, 0x66, 0xe6, 0x6b, 0x20, - 0x0, 0xc0, 0xc, 0xd, 0x0, 0xd0, 0x0, 0x0, - 0x4, 0x80, 0x39, 0xd, 0x0, 0xd0, 0x0, 0x50, - 0x8, 0x40, 0x75, 0xc, 0x66, 0x66, 0x66, 0xf1, - 0xa, 0x50, 0xc1, 0x0, 0x0, 0x20, 0x60, 0xe0, - 0x0, 0x3a, 0xe3, 0x4, 0x51, 0x94, 0x77, 0xd0, - 0x0, 0xa, 0x6d, 0x38, 0x38, 0x5b, 0x3b, 0xb0, - 0x0, 0x65, 0x1, 0xa7, 0x27, 0x2, 0x5, 0x90, - 0x4, 0x40, 0x0, 0x30, 0x0, 0x37, 0xae, 0x50, - 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, 0x0, - - /* U+5ACC "嫌" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xc0, 0x0, 0x27, 0x0, 0xb1, 0x0, 0x0, - 0x59, 0x0, 0x0, 0xb3, 0x37, 0x1, 0x0, 0x8, - 0x50, 0x27, 0x69, 0x6a, 0x68, 0xc1, 0x25, 0xc6, - 0x59, 0x0, 0x92, 0xb1, 0x0, 0x0, 0x2d, 0x13, - 0xa2, 0x6c, 0x7c, 0x6a, 0x30, 0x1, 0xb0, 0x57, - 0x0, 0x92, 0xb1, 0xb1, 0x0, 0x47, 0x8, 0x45, - 0x6b, 0x7c, 0x6c, 0xb5, 0x7, 0x30, 0xb0, 0x10, - 0x92, 0xb1, 0xb1, 0x0, 0xb0, 0xb, 0x3, 0x6c, - 0x7c, 0x6c, 0x10, 0x6, 0x88, 0x70, 0x3, 0xf2, - 0xb6, 0x50, 0x0, 0x0, 0xdc, 0x20, 0xbb, 0x2b, - 0x45, 0x0, 0x0, 0x65, 0x37, 0x74, 0x92, 0xb1, - 0xa2, 0x0, 0x28, 0x0, 0x54, 0x9, 0x2b, 0x12, - 0xe6, 0x16, 0x0, 0x33, 0x0, 0x92, 0xb1, 0x3, - 0x1, 0x0, 0x0, 0x0, 0x4, 0x3, 0x0, 0x0, - - /* U+5B09 "嬉" */ - 0x0, 0xb, 0x10, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x0, 0x2c, 0x0, 0x0, 0x0, 0xd0, 0x4, 0x40, - 0x0, 0x58, 0x0, 0x57, 0x66, 0xe6, 0x66, 0x50, - 0x13, 0x97, 0x38, 0x14, 0x66, 0xe6, 0x8b, 0x0, - 0x15, 0xc4, 0x3d, 0x3, 0x10, 0x0, 0x3, 0x0, - 0x0, 0xc0, 0x2a, 0xb, 0x66, 0x66, 0x7d, 0x0, - 0x3, 0x90, 0x57, 0xb, 0x10, 0x0, 0x2b, 0x0, - 0x7, 0x50, 0x93, 0x8, 0x96, 0x66, 0x96, 0x0, - 0xb, 0x10, 0xc0, 0x0, 0x68, 0x5, 0x70, 0x10, - 0xb, 0x53, 0xa1, 0x75, 0x68, 0x57, 0x56, 0xa1, - 0x0, 0x2d, 0xc2, 0x7, 0x66, 0x66, 0x6a, 0x10, - 0x0, 0x3a, 0x3d, 0xc, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xa1, 0x1, 0xc, 0x0, 0x0, 0xd, 0x0, - 0x8, 0x20, 0x0, 0xd, 0x66, 0x66, 0x6d, 0x0, - 0x21, 0x0, 0x0, 0x5, 0x0, 0x0, 0x2, 0x0, - - /* U+5B50 "子" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x0, - 0x0, 0x6, 0x66, 0x66, 0x66, 0x68, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xd4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xd0, 0x0, 0x1, 0x30, - 0x6, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6a, 0xc1, - 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x14, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xaf, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, - - /* U+5B57 "字" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x28, 0x66, 0x66, 0x96, 0x66, 0x6b, 0x80, - 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x19, 0x10, - 0x1, 0xc2, 0x56, 0x66, 0x66, 0x6c, 0x40, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, 0xa9, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xd1, 0x0, 0x0, 0x10, - 0x6, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6a, 0xd1, - 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xae, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, - - /* U+5B58 "存" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2d, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0xa, 0x30, - 0x4, 0x66, 0x66, 0xf7, 0x66, 0x66, 0x66, 0x50, - 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x56, 0x66, 0x66, 0x99, 0x0, - 0x0, 0x0, 0xd6, 0x0, 0x0, 0x4, 0xb3, 0x0, - 0x0, 0x3, 0xe0, 0x0, 0x0, 0x76, 0x0, 0x0, - 0x0, 0x1b, 0xe0, 0x0, 0x0, 0xf1, 0x0, 0x0, - 0x0, 0xa1, 0xe0, 0x0, 0x0, 0xe0, 0x2, 0x80, - 0x7, 0x10, 0xe0, 0x76, 0x66, 0xe6, 0x66, 0x61, - 0x10, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xf0, 0x1, 0x8d, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x50, 0x0, 0x5, 0x10, 0x0, 0x0, - - /* U+5B63 "季" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x7c, 0x80, 0x0, - 0x0, 0x3, 0x45, 0x79, 0xd8, 0x64, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x20, - 0x6, 0x66, 0x66, 0x68, 0xd6, 0x66, 0x6a, 0xc1, - 0x0, 0x0, 0x1, 0xc6, 0xb6, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x42, 0xb0, 0x79, 0x20, 0x0, - 0x0, 0x7, 0x91, 0x2, 0xb0, 0x4, 0xdd, 0xa3, - 0x5, 0x62, 0x56, 0x66, 0x66, 0x6c, 0x24, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x95, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xd2, 0x0, 0x3, 0x20, - 0x6, 0x76, 0x66, 0x66, 0xd6, 0x66, 0x6b, 0xa0, - 0x0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x9e, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, - - /* U+5B66 "学" */ - 0x0, 0x30, 0x3, 0x40, 0x0, 0x67, 0x0, 0x0, - 0x3, 0xc1, 0xd, 0x40, 0xc, 0x50, 0x0, 0x0, - 0xb, 0x80, 0x98, 0x3, 0x90, 0x0, 0x0, 0x40, - 0x43, 0x2, 0x10, 0x80, 0x0, 0x40, 0xa, 0x66, - 0x66, 0x66, 0x66, 0x66, 0xae, 0x11, 0xf0, 0x0, - 0x0, 0x0, 0x1, 0x9, 0x0, 0x37, 0x18, 0x66, - 0x66, 0x68, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0x40, 0x0, 0x20, 0x4, 0x66, 0x66, 0x66, 0xe6, - 0x66, 0x6d, 0xb0, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x9f, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - 0x0, - - /* U+5B69 "孩" */ - 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, - 0x3, 0x66, 0x6c, 0x70, 0x0, 0xc5, 0x0, 0x0, - 0x0, 0x0, 0x39, 0x56, 0x66, 0x97, 0x69, 0xc0, - 0x0, 0x1, 0x60, 0x0, 0x1d, 0x10, 0x0, 0x0, - 0x0, 0xd, 0x20, 0x0, 0x86, 0x1, 0x50, 0x0, - 0x0, 0xd, 0x0, 0x22, 0x70, 0x8, 0xb0, 0x0, - 0x0, 0xd, 0x57, 0x1c, 0x97, 0x6e, 0x10, 0x0, - 0x1, 0x7f, 0x40, 0x3, 0x0, 0xb4, 0x18, 0x0, - 0x3f, 0x7d, 0x0, 0x0, 0x8, 0x60, 0x99, 0x0, - 0x2, 0xd, 0x0, 0x0, 0x86, 0x6, 0xb0, 0x0, - 0x0, 0xd, 0x0, 0x38, 0x20, 0x4e, 0x0, 0x0, - 0x0, 0xd, 0x2, 0x30, 0x6, 0xa2, 0xb2, 0x0, - 0x1, 0xd, 0x0, 0x2, 0x96, 0x0, 0x3e, 0x20, - 0x2, 0xbc, 0x4, 0x75, 0x0, 0x0, 0x9, 0x50, - 0x0, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5B6B "孫" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0x0, - 0x5, 0x66, 0x6d, 0x55, 0x59, 0xb6, 0x42, 0x0, - 0x0, 0x0, 0x39, 0x10, 0xa, 0x80, 0x0, 0x0, - 0x0, 0x1, 0x70, 0x0, 0x58, 0x1, 0x80, 0x0, - 0x0, 0xe, 0x10, 0x7, 0x93, 0x4c, 0x70, 0x0, - 0x0, 0xd, 0x0, 0x8, 0x74, 0xa5, 0x0, 0x0, - 0x0, 0xd, 0x25, 0x0, 0x9, 0x40, 0x50, 0x0, - 0x0, 0x5e, 0x60, 0x4, 0x91, 0x0, 0x4a, 0x0, - 0x3e, 0x7d, 0x0, 0x2f, 0xa8, 0xe5, 0x49, 0x80, - 0x2, 0xd, 0x0, 0x1, 0x0, 0xd0, 0x1, 0x30, - 0x0, 0xd, 0x0, 0x7, 0x90, 0xd0, 0x70, 0x0, - 0x0, 0xd, 0x0, 0x2b, 0x0, 0xd0, 0x2c, 0x20, - 0x1, 0xd, 0x1, 0x81, 0x0, 0xd0, 0x6, 0xd0, - 0x3, 0xdb, 0x4, 0x1, 0x8f, 0xb0, 0x0, 0x70, - 0x0, 0x20, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, - - /* U+5B78 "學" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x39, 0x31, 0xb2, 0x0, 0x50, 0x0, - 0x0, 0xd, 0x30, 0xa, 0xb2, 0x76, 0xe2, 0x0, - 0x0, 0xc, 0x74, 0x32, 0x62, 0x66, 0xd0, 0x0, - 0x0, 0xb, 0x1, 0x21, 0xa2, 0x0, 0xc0, 0x0, - 0x0, 0xa, 0x77, 0xc, 0xa0, 0x66, 0xb0, 0x0, - 0x3, 0x9, 0x20, 0x52, 0x90, 0x1, 0xb0, 0x20, - 0x8, 0x77, 0x66, 0x66, 0x66, 0x66, 0x79, 0xd0, - 0xe, 0x10, 0x56, 0x66, 0x66, 0xa2, 0x8, 0x0, - 0x4, 0x0, 0x0, 0x0, 0x1a, 0x72, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x5, 0x10, - 0x6, 0x66, 0x66, 0x6c, 0x86, 0x66, 0x6b, 0x90, - 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xbf, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, - - /* U+5B83 "它" */ - 0x0, 0x0, 0x0, 0x19, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x2, - 0x96, 0x66, 0x67, 0xb6, 0x66, 0x6c, 0x10, 0x85, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xa1, 0x2f, 0x30, - 0x20, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0xc, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, - 0x0, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xc, 0x10, - 0x7, 0xc7, 0x20, 0x0, 0x0, 0x0, 0xc3, 0x78, - 0x30, 0x0, 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x0, 0x50, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x8, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, - 0xc3, 0x0, 0x0, 0x6, 0xdc, 0xcc, 0xcc, 0xcd, - 0x50, - - /* U+5B85 "宅" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x28, 0x66, 0x67, 0xa6, 0x66, 0x6a, 0x60, - 0x0, 0x85, 0x0, 0x0, 0x0, 0x30, 0xb, 0x30, - 0x0, 0xc2, 0x0, 0x2, 0x6b, 0xe8, 0x22, 0x0, - 0x0, 0x24, 0x56, 0x9d, 0x41, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x7d, 0x20, - 0x0, 0x0, 0x0, 0x4d, 0x66, 0x66, 0x52, 0x0, - 0x6, 0x66, 0x65, 0x4c, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x40, - 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x60, - 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x3, 0xa0, - 0x0, 0x0, 0x0, 0xb, 0xcc, 0xcc, 0xcd, 0xa0, - - /* U+5B87 "宇" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x19, - 0x66, 0x66, 0xa6, 0x66, 0x6b, 0x40, 0x7, 0x70, - 0x0, 0x0, 0x0, 0x0, 0xc3, 0x0, 0xc2, 0x0, - 0x0, 0x0, 0x3, 0x51, 0x0, 0x0, 0x26, 0x66, - 0x68, 0x66, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, - 0x0, 0x0, 0x32, 0x4, 0x76, 0x66, 0x67, 0xd6, - 0x66, 0x6b, 0xa0, 0x0, 0x0, 0x0, 0x2b, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x15, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3a, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, - - /* U+5B88 "守" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xa0, 0x0, 0x0, 0x0, 0x5, - 0x0, 0x0, 0x35, 0x0, 0x1, 0x70, 0x0, 0xb6, - 0x66, 0x66, 0x66, 0x66, 0xad, 0x20, 0x3f, 0x0, - 0x0, 0x0, 0xb3, 0x8, 0x0, 0x1, 0x10, 0x0, - 0x0, 0xd, 0x10, 0x1, 0x0, 0x56, 0x66, 0x66, - 0x66, 0xe6, 0x68, 0xe3, 0x1, 0x11, 0x0, 0x0, - 0xd, 0x10, 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x5d, 0x0, 0xd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0xd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xee, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, - - /* U+5B89 "安" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x66, 0x66, 0xa6, 0x66, 0x6c, 0x30, - 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x10, - 0x0, 0xa2, 0x0, 0x77, 0x0, 0x0, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x1, 0x0, - 0x5, 0x66, 0x66, 0xe6, 0x66, 0x66, 0x6e, 0x90, - 0x0, 0x0, 0x8, 0x60, 0x0, 0x97, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x2, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x86, 0x0, 0xa, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x26, 0x78, 0x8c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xda, 0xb5, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x8a, 0x10, 0x29, 0xe6, 0x0, - 0x0, 0x15, 0x88, 0x20, 0x0, 0x0, 0x4e, 0x10, - 0x3, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5B8C "完" */ - 0x0, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x67, 0x66, 0x67, 0x96, 0x66, 0x69, 0x70, - 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, - 0x1, 0x90, 0x0, 0x0, 0x0, 0x24, 0x3, 0x0, - 0x0, 0x3, 0x76, 0x66, 0x66, 0x66, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x56, 0x66, 0x66, 0x66, 0x66, 0x9e, 0x20, - 0x0, 0x10, 0x4, 0xa0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x70, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x40, 0xd, 0x0, 0x0, 0x30, - 0x0, 0x0, 0x1d, 0x0, 0xd, 0x0, 0x0, 0x60, - 0x0, 0x0, 0xa4, 0x0, 0xe, 0x0, 0x0, 0xc0, - 0x0, 0x49, 0x30, 0x0, 0x9, 0xdc, 0xcd, 0xb1, - 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5B98 "官" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1a, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x86, - 0x66, 0x66, 0x96, 0x66, 0x69, 0xa0, 0x2d, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa5, 0x7, 0x70, 0x96, - 0x66, 0x66, 0x6b, 0x23, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, - 0x66, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, - 0x96, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x8, - 0x60, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x85, - 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x8, 0x50, - 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xb5, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x1, 0x0, 0x0, - - /* U+5B99 "宙" */ - 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x0, - 0x84, 0x44, 0x47, 0x64, 0x44, 0x49, 0x0, 0x3a, - 0x22, 0x22, 0x62, 0x22, 0x25, 0xb2, 0xa, 0x60, - 0x0, 0xd, 0x30, 0x0, 0x50, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x66, - 0x6e, 0x66, 0x6b, 0x70, 0x0, 0x0, 0xe0, 0x0, - 0xd0, 0x0, 0xa4, 0x0, 0x0, 0xe, 0x0, 0xd, - 0x0, 0xa, 0x40, 0x0, 0x0, 0xe6, 0x66, 0xe6, - 0x66, 0xc4, 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, - 0xa, 0x40, 0x0, 0x0, 0xe0, 0x0, 0xd0, 0x0, - 0xa4, 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, 0xa, - 0x40, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x66, 0xc4, - 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x4, 0x10, - 0x0, - - /* U+5B9A "定" */ - 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, 0x1, - 0x96, 0x66, 0x79, 0x66, 0x66, 0xb5, 0x0, 0x95, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x40, 0x1c, 0x10, - 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x36, 0x66, - 0x66, 0x66, 0x66, 0xd9, 0x0, 0x0, 0x10, 0x0, - 0x3a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, 0x3, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x40, 0x3a, - 0x0, 0x15, 0x0, 0x0, 0x1, 0xe0, 0x3, 0xc6, - 0x67, 0x81, 0x0, 0x0, 0x6b, 0x30, 0x3a, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x16, 0x43, 0xa0, 0x0, - 0x0, 0x0, 0x5, 0x70, 0x7, 0xcc, 0x42, 0x11, - 0x23, 0x3, 0x60, 0x0, 0x1, 0x7b, 0xde, 0xff, - 0x40, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5B9E "实" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x66, - 0x66, 0x66, 0xb6, 0x66, 0x69, 0x50, 0xd, 0x0, - 0x0, 0x2, 0x0, 0x0, 0xc7, 0x7, 0xc0, 0x1a, - 0x40, 0x7c, 0x0, 0x42, 0x0, 0x0, 0x0, 0x3f, - 0x8, 0x80, 0x0, 0x0, 0x0, 0x6, 0x20, 0x50, - 0x96, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x40, 0xa, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, 0xc2, - 0x0, 0x4, 0x20, 0x67, 0x66, 0x66, 0x6e, 0x66, - 0x66, 0xa9, 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xd3, 0x8a, 0x50, - 0x0, 0x0, 0x0, 0x4, 0xc3, 0x0, 0x2c, 0xe3, - 0x0, 0x1, 0x5a, 0x70, 0x0, 0x0, 0x9, 0xb0, - 0x4, 0x51, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - - /* U+5B9F "実" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xb3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, 0xa, - 0x66, 0x66, 0x79, 0x66, 0x66, 0xc2, 0x4, 0xa0, - 0x0, 0x4, 0x0, 0x0, 0x49, 0x20, 0xb5, 0x0, - 0x0, 0xb4, 0x0, 0x4, 0x0, 0x0, 0x36, 0x66, - 0x6d, 0x76, 0x6b, 0xa0, 0x0, 0x0, 0x10, 0x0, - 0xb2, 0x0, 0x0, 0x0, 0x0, 0x5, 0x66, 0x6d, - 0x76, 0x6e, 0x50, 0x0, 0x0, 0x0, 0x0, 0xb2, - 0x0, 0x1, 0x30, 0x4, 0x76, 0x66, 0x6e, 0x86, - 0x66, 0x9b, 0x10, 0x0, 0x0, 0x2, 0xd5, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb5, 0x9, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x98, 0x0, 0x2c, 0x61, - 0x0, 0x0, 0x6, 0xa4, 0x0, 0x0, 0x1b, 0xfb, - 0x30, 0x35, 0x20, 0x0, 0x0, 0x0, 0x3, 0x20, - - /* U+5BA2 "客" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3b, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x0, 0x7, 0x70, 0x0, 0x2, 0x0, - 0x1, 0xb6, 0x67, 0x66, 0x66, 0x66, 0x6e, 0x70, - 0xa, 0x70, 0x9, 0xa0, 0x0, 0x0, 0x57, 0x0, - 0x5, 0x0, 0x3f, 0x76, 0x66, 0xd7, 0x20, 0x0, - 0x0, 0x1, 0xb2, 0x60, 0x8, 0xb0, 0x0, 0x0, - 0x0, 0x9, 0x10, 0x38, 0x7a, 0x0, 0x0, 0x0, - 0x0, 0x60, 0x0, 0xb, 0xe4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xb4, 0x8, 0xc7, 0x30, 0x0, - 0x0, 0x4, 0xa6, 0x0, 0x0, 0x1c, 0xef, 0xa1, - 0x15, 0x63, 0xd6, 0x66, 0x66, 0x6e, 0x13, 0x10, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x3, 0x0, 0x0, - - /* U+5BA4 "室" */ - 0x0, 0x0, 0x0, 0x1a, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x96, 0x66, 0x66, 0x76, 0x66, 0x6b, 0x10, - 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, - 0x6, 0x56, 0x66, 0x66, 0x66, 0x6e, 0x50, 0x0, - 0x0, 0x1, 0x0, 0xb5, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x19, 0x20, 0x0, 0x88, 0x0, 0x0, - 0x0, 0x8, 0xd6, 0x66, 0x66, 0x6e, 0x80, 0x0, - 0x0, 0x6, 0x95, 0x37, 0x20, 0x4, 0x80, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x60, 0x1, 0x0, 0x0, - 0x0, 0x7, 0x66, 0x6c, 0x86, 0x6c, 0x70, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x2, 0x0, - 0x5, 0x66, 0x66, 0x6c, 0x86, 0x66, 0x6e, 0x90, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5BB3 "害" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x57, 0x0, 0x0, 0x40, 0xa, 0x66, 0x66, - 0x67, 0x66, 0x66, 0xe4, 0x5b, 0x0, 0x0, 0x1e, - 0x0, 0x25, 0x10, 0x0, 0x56, 0x66, 0x6d, 0x66, - 0x77, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x31, - 0x0, 0x0, 0x56, 0x66, 0x6d, 0x66, 0x75, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x82, 0x57, - 0x66, 0x66, 0x7d, 0x66, 0x66, 0x64, 0x0, 0x3, - 0x0, 0x29, 0x0, 0x40, 0x0, 0x0, 0xe, 0x66, - 0x66, 0x66, 0xc5, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xc2, - 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x51, 0x0, - - /* U+5BB5 "宵" */ - 0x0, 0x0, 0x4, 0x91, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x87, 0x0, 0x0, 0x10, 0x6, 0x76, - 0x66, 0x66, 0x66, 0x66, 0xc7, 0xd, 0x34, 0x0, - 0x18, 0x0, 0x51, 0x80, 0x15, 0x7, 0xc0, 0x1d, - 0x8, 0x92, 0x0, 0x0, 0x0, 0xb2, 0x1d, 0x46, - 0x0, 0x0, 0x0, 0x28, 0x66, 0x6d, 0x76, 0xa4, - 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0xb2, 0x0, - 0x0, 0x2c, 0x66, 0x66, 0x66, 0xc2, 0x0, 0x0, - 0x2a, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x2c, - 0x66, 0x66, 0x66, 0xc2, 0x0, 0x0, 0x2a, 0x0, - 0x0, 0x0, 0xb2, 0x0, 0x0, 0x2a, 0x0, 0x0, - 0x0, 0xb2, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x6c, - 0xe0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x2, 0x20, - 0x0, - - /* U+5BB6 "家" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1b, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x0, 0x4, 0x90, 0x0, 0x2, 0x10, - 0x0, 0xa6, 0x66, 0x66, 0x66, 0x66, 0x6d, 0x90, - 0x4, 0xc0, 0x0, 0x0, 0x0, 0x2, 0x16, 0x0, - 0x0, 0x4, 0x66, 0x7a, 0x66, 0x6a, 0x20, 0x0, - 0x0, 0x0, 0x2, 0xd4, 0x0, 0x2, 0x20, 0x0, - 0x0, 0x0, 0x5a, 0x29, 0x10, 0x3c, 0x70, 0x0, - 0x0, 0x47, 0x40, 0x4b, 0xb6, 0x90, 0x0, 0x0, - 0x3, 0x10, 0x6, 0x90, 0xb4, 0x70, 0x0, 0x0, - 0x0, 0x2, 0x95, 0x7, 0xe8, 0x36, 0x0, 0x0, - 0x2, 0x65, 0x0, 0x8a, 0x3b, 0xb, 0x30, 0x0, - 0x0, 0x0, 0x2a, 0x50, 0x3b, 0x1, 0xd9, 0x30, - 0x0, 0x17, 0x70, 0x0, 0x59, 0x0, 0x1a, 0x50, - 0x5, 0x40, 0x0, 0x6c, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, - - /* U+5BB9 "容" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x1d, 0x0, 0x0, 0x1, 0x0, 0x86, - 0x66, 0x66, 0x66, 0x66, 0x6a, 0xb0, 0x1e, 0x10, - 0x82, 0x0, 0x40, 0x0, 0x81, 0x1, 0x40, 0x6c, - 0x21, 0x71, 0x9a, 0x20, 0x0, 0x0, 0x59, 0x0, - 0xad, 0x0, 0x6f, 0x20, 0x0, 0x54, 0x0, 0x6b, - 0x17, 0x0, 0x63, 0x0, 0x0, 0x0, 0x6c, 0x0, - 0x3a, 0x10, 0x0, 0x0, 0x0, 0x6a, 0x0, 0x0, - 0x2c, 0x94, 0x0, 0x1, 0x88, 0xb6, 0x66, 0x66, - 0xe9, 0xed, 0x24, 0x50, 0x2b, 0x0, 0x0, 0xe, - 0x0, 0x10, 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, - 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0x3, 0xd6, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0x0, 0x13, 0x0, 0x0, 0x4, 0x0, 0x0, - - /* U+5BBF "宿" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x2, 0xc0, 0x0, 0x1, 0x0, 0xb, - 0x66, 0x66, 0x66, 0x66, 0x67, 0xf2, 0x6, 0xa0, - 0xb5, 0x0, 0x0, 0x0, 0x63, 0x0, 0x62, 0x2d, - 0x26, 0x66, 0x66, 0x66, 0xd4, 0x0, 0x9, 0x40, - 0x10, 0xb, 0x40, 0x0, 0x0, 0x2, 0xe3, 0x0, - 0x0, 0x90, 0x1, 0x0, 0x0, 0x9d, 0x10, 0xd, - 0x68, 0x66, 0xe2, 0x0, 0x53, 0xc1, 0x0, 0xe0, - 0x0, 0xe, 0x0, 0x23, 0xc, 0x10, 0xe, 0x0, - 0x0, 0xe0, 0x0, 0x0, 0xc1, 0x0, 0xe6, 0x66, - 0x6e, 0x0, 0x0, 0xc, 0x10, 0xe, 0x0, 0x0, - 0xe0, 0x0, 0x0, 0xc1, 0x0, 0xe0, 0x0, 0xe, - 0x0, 0x0, 0xd, 0x10, 0xe, 0x66, 0x66, 0xf0, - 0x0, 0x0, 0x60, 0x0, 0x50, 0x0, 0x5, 0x0, - - /* U+5BC4 "寄" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x30, 0x0, 0x6, 0x10, 0x0, 0x5, 0x0, 0xb, - 0x66, 0x66, 0x96, 0x66, 0x68, 0xd1, 0x8, 0x80, - 0x0, 0x3d, 0x0, 0x3, 0x40, 0x0, 0x0, 0x66, - 0x6d, 0x86, 0x66, 0x95, 0x0, 0x0, 0x0, 0x8, - 0x61, 0x78, 0x10, 0x0, 0x0, 0x0, 0x57, 0x30, - 0x0, 0x5b, 0x0, 0x40, 0x7, 0x76, 0x66, 0x66, - 0x66, 0x69, 0x6b, 0x70, 0x0, 0x30, 0x0, 0x30, - 0x0, 0xe0, 0x0, 0x0, 0xd, 0x66, 0x6d, 0x70, - 0xe, 0x0, 0x0, 0x0, 0xc1, 0x0, 0xb2, 0x0, - 0xe0, 0x0, 0x0, 0xc, 0x66, 0x6d, 0x40, 0xe, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x63, 0x0, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, - - /* U+5BC6 "密" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x30, 0x0, 0xa, 0x40, 0x0, 0x3, 0x10, 0xb, - 0x66, 0x66, 0x66, 0x66, 0x66, 0xd8, 0x8, 0x90, - 0x0, 0x48, 0x0, 0x93, 0x25, 0x0, 0x10, 0x0, - 0xb2, 0xd0, 0x8c, 0x30, 0x0, 0x0, 0x8, 0xd, - 0x1, 0x99, 0x0, 0x94, 0x0, 0x9, 0x90, 0xd2, - 0xb5, 0x4, 0x1, 0xf2, 0x0, 0x60, 0x2e, 0x91, - 0x0, 0x84, 0x6, 0x0, 0x25, 0x77, 0x8b, 0xbb, - 0xba, 0x40, 0x0, 0x1, 0x0, 0x0, 0xa, 0x30, - 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, 0xc0, 0x0, - 0x2c, 0x0, 0x0, 0xd, 0x0, 0xc, 0x0, 0x2, - 0xb0, 0x0, 0x0, 0xd0, 0x0, 0xc0, 0x0, 0x2b, - 0x0, 0x0, 0x1b, 0x66, 0x67, 0x66, 0x67, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+5BCC "富" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xb1, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x84, 0x0, 0x0, 0x30, 0xb, 0x66, 0x66, - 0x66, 0x66, 0x68, 0xe1, 0x79, 0x0, 0x0, 0x0, - 0x5, 0x46, 0x10, 0x0, 0x27, 0x66, 0x66, 0x66, - 0x50, 0x0, 0x0, 0x7, 0x66, 0x66, 0x6b, 0x40, - 0x0, 0x0, 0x9, 0x30, 0x0, 0xb, 0x10, 0x0, - 0x0, 0x9, 0x76, 0x66, 0x6d, 0x20, 0x0, 0x0, - 0x23, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0xd6, - 0x66, 0xc6, 0x66, 0xb7, 0x0, 0x0, 0xd1, 0x0, - 0xd0, 0x0, 0x94, 0x0, 0x0, 0xc6, 0x66, 0xe6, - 0x66, 0xb4, 0x0, 0x0, 0xd1, 0x0, 0xd0, 0x0, - 0x95, 0x0, 0x0, 0xd6, 0x66, 0x96, 0x66, 0xb5, - 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x20, 0x0, - - /* U+5BD2 "寒" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, - 0x30, 0x0, 0x8, 0x30, 0x0, 0x6, 0x10, 0x68, - 0x66, 0x86, 0x66, 0x86, 0x66, 0xd5, 0x1d, 0x10, - 0xd, 0x10, 0xe, 0x13, 0x22, 0x0, 0x5, 0x66, - 0xe6, 0x66, 0xe6, 0x95, 0x0, 0x0, 0x0, 0xd, - 0x0, 0xd, 0x4, 0x10, 0x0, 0x3, 0x66, 0xe6, - 0x66, 0xe6, 0x75, 0x0, 0x0, 0x0, 0xd, 0x0, - 0xd, 0x0, 0x1a, 0x11, 0x66, 0x66, 0xf6, 0x66, - 0xa6, 0x66, 0x74, 0x0, 0x0, 0x88, 0x16, 0x3, - 0x60, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x3e, 0x17, - 0xa2, 0x0, 0x0, 0x67, 0x2, 0x0, 0x40, 0x5, - 0xed, 0x41, 0x52, 0x0, 0x26, 0xa9, 0x40, 0x0, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x5e, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, - - /* U+5BDD "寝" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1b, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x1, 0x90, 0x0, 0x2, 0x0, - 0x0, 0xa6, 0x66, 0x66, 0x66, 0x66, 0x6d, 0x50, - 0x2, 0xd0, 0x50, 0x0, 0x0, 0x0, 0x53, 0x0, - 0x0, 0x10, 0xe1, 0x17, 0x66, 0x66, 0xe1, 0x0, - 0x2, 0x70, 0xd0, 0x4, 0x65, 0x55, 0xd0, 0x0, - 0x0, 0xc2, 0xd0, 0x16, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0x50, 0xd0, 0x22, 0x0, 0x0, 0x22, 0x0, - 0x0, 0x6, 0xd0, 0xb6, 0x66, 0x66, 0x6e, 0x30, - 0x5, 0xb2, 0xd7, 0x75, 0x66, 0x68, 0x82, 0x0, - 0x9, 0x10, 0xd0, 0x0, 0x50, 0xc, 0x30, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x45, 0x95, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xc, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x5, 0x82, 0x3b, 0xca, 0x70, - 0x0, 0x0, 0x62, 0x41, 0x0, 0x0, 0x14, 0x10, - - /* U+5BDF "察" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, 0x5, - 0x66, 0x66, 0x6b, 0x66, 0x66, 0x6c, 0x0, 0xc0, - 0x46, 0x0, 0x0, 0x0, 0x8, 0x50, 0x36, 0xb, - 0x70, 0x31, 0x30, 0x0, 0x70, 0x0, 0x5, 0xc6, - 0x6e, 0x58, 0x66, 0x8e, 0x30, 0x1, 0xb8, 0x46, - 0x90, 0x34, 0xa, 0x10, 0x0, 0x95, 0x19, 0xc1, - 0x0, 0x87, 0x10, 0x0, 0x40, 0xa2, 0xb9, 0x66, - 0x98, 0xb6, 0x0, 0x0, 0x4, 0xa2, 0x0, 0x0, - 0x1, 0xae, 0xa2, 0x4, 0xa6, 0x66, 0x67, 0x66, - 0xaa, 0x44, 0x4, 0x10, 0x4, 0x2, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xc2, 0x2b, 0x6, 0x70, - 0x0, 0x0, 0x8, 0x70, 0x2, 0xb0, 0x4, 0xe3, - 0x0, 0x27, 0x20, 0x28, 0xd9, 0x0, 0x5, 0x90, - 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, - - /* U+5BE6 "實" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x2a, - 0x66, 0x66, 0x66, 0x66, 0x6a, 0xa0, 0x9, 0x56, - 0x66, 0x66, 0x66, 0x69, 0x70, 0x0, 0x0, 0xa1, - 0x0, 0xb0, 0x4, 0x93, 0x90, 0x47, 0x6d, 0x66, - 0x8b, 0x66, 0xa9, 0x66, 0x10, 0x1, 0xc6, 0x67, - 0x86, 0x6a, 0x40, 0x0, 0x0, 0xa, 0x55, 0x55, - 0x55, 0x6a, 0x0, 0x0, 0x0, 0xe6, 0x66, 0x66, - 0x67, 0xa0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x3a, 0x0, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x68, - 0xa0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0x7a, - 0x0, 0x0, 0x0, 0x23, 0xc1, 0x5, 0x75, 0x10, - 0x0, 0x0, 0x38, 0x82, 0x0, 0x1, 0x9e, 0x20, - 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, 0x43, 0x0, - - /* U+5BEB "寫" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0xa, - 0x66, 0x66, 0x67, 0x66, 0x66, 0xd4, 0x8, 0x70, - 0x3, 0xb1, 0x0, 0x5, 0x28, 0x0, 0x61, 0xb5, - 0x41, 0x6, 0x76, 0xe3, 0x0, 0x0, 0xb, 0x10, - 0x50, 0x0, 0xd, 0x0, 0x0, 0x0, 0xb6, 0x65, - 0x3, 0x76, 0xe0, 0x0, 0x0, 0xc, 0x68, 0x76, - 0x66, 0x6e, 0x0, 0x0, 0x0, 0x43, 0xc0, 0x0, - 0x0, 0x41, 0x10, 0x0, 0x2, 0xb7, 0x66, 0x66, - 0x66, 0xb9, 0x0, 0x6, 0x71, 0x20, 0x14, 0x9, - 0x19, 0x30, 0x2, 0x14, 0x33, 0x80, 0xc1, 0x58, - 0xb1, 0x0, 0x1, 0xe1, 0xc, 0x5, 0x0, 0x1d, - 0x0, 0x0, 0x4, 0x0, 0x0, 0x5, 0xab, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, - - /* U+5BFA "寺" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x30, 0x0, - 0x0, 0x76, 0x66, 0x6e, 0x66, 0x67, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x5, 0x10, - 0x28, 0x66, 0x66, 0x6a, 0x66, 0x66, 0x6a, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x4, 0x0, - 0x6, 0x76, 0x66, 0x66, 0x66, 0xf6, 0x7a, 0x30, - 0x0, 0x0, 0x72, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0x10, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x20, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x1, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x9f, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, - - /* U+5BFE "対" */ - 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, - 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x1, 0x20, 0x71, 0x0, 0x0, 0xe0, 0x0, - 0x4, 0x76, 0x6e, 0x73, 0x56, 0x66, 0xe6, 0xd2, - 0x0, 0x0, 0xe, 0x0, 0x10, 0x0, 0xe0, 0x0, - 0x0, 0x40, 0x2b, 0x1, 0x40, 0x0, 0xe0, 0x0, - 0x0, 0x28, 0x77, 0x0, 0xa5, 0x0, 0xe0, 0x0, - 0x0, 0x2, 0xf4, 0x0, 0x4e, 0x0, 0xe0, 0x0, - 0x0, 0x3, 0xce, 0x20, 0x9, 0x0, 0xe0, 0x0, - 0x0, 0xb, 0x17, 0xd0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x84, 0x0, 0xd0, 0x0, 0x0, 0xe0, 0x0, - 0x7, 0x40, 0x0, 0x0, 0x4, 0x33, 0xd0, 0x0, - 0x12, 0x0, 0x0, 0x0, 0x1, 0x8f, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, - - /* U+5C04 "射" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0x2, 0xc0, 0x0, - 0x0, 0x20, 0x80, 0x30, 0x0, 0x2, 0xb0, 0x0, - 0x0, 0xd6, 0x66, 0xe2, 0x0, 0x2, 0xb0, 0x0, - 0x0, 0xd1, 0x0, 0xe0, 0x0, 0x2, 0xb0, 0x20, - 0x0, 0xc6, 0x66, 0xe3, 0x76, 0x67, 0xd8, 0xb1, - 0x0, 0xc1, 0x0, 0xe0, 0x0, 0x2, 0xb0, 0x0, - 0x0, 0xc6, 0x66, 0xe0, 0x40, 0x2, 0xb0, 0x0, - 0x0, 0xc1, 0x0, 0xe0, 0x3b, 0x2, 0xb0, 0x0, - 0x26, 0xd6, 0x66, 0xe0, 0xd, 0x42, 0xb0, 0x0, - 0x2, 0x0, 0xb4, 0xe0, 0x6, 0x2, 0xb0, 0x0, - 0x0, 0x5, 0x90, 0xe0, 0x0, 0x2, 0xb0, 0x0, - 0x0, 0x2b, 0x0, 0xe0, 0x0, 0x2, 0xb0, 0x0, - 0x1, 0x91, 0x10, 0xe0, 0x2, 0x3, 0xb0, 0x0, - 0x26, 0x0, 0x4d, 0xc0, 0x3, 0xaf, 0x80, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x4, 0x0, 0x0, - - /* U+5C07 "將" */ - 0x0, 0x0, 0xa, 0x10, 0x3, 0x80, 0x0, 0x0, - 0x2, 0x80, 0xd, 0x0, 0xb, 0x60, 0x3, 0x10, - 0x2, 0xa0, 0xd, 0x0, 0x6b, 0x66, 0x6e, 0xa0, - 0x2, 0xa0, 0xd, 0x3, 0x88, 0x70, 0x6b, 0x0, - 0x4, 0xc6, 0x6d, 0x36, 0x91, 0xb4, 0xb0, 0x0, - 0x0, 0x30, 0xd, 0x0, 0x74, 0x5a, 0x10, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x19, 0x70, 0xc2, 0x0, - 0x4, 0x66, 0x6d, 0x36, 0x61, 0x0, 0xd0, 0x30, - 0x1, 0x69, 0xd, 0x67, 0x66, 0x66, 0xe6, 0xa2, - 0x0, 0x59, 0xd, 0x3, 0x30, 0x0, 0xd0, 0x0, - 0x0, 0x77, 0xd, 0x0, 0xd2, 0x0, 0xd0, 0x0, - 0x0, 0xa3, 0xd, 0x0, 0x95, 0x0, 0xd0, 0x0, - 0x1, 0xa0, 0xd, 0x0, 0x12, 0x10, 0xd0, 0x0, - 0x8, 0x0, 0xd, 0x0, 0x2, 0x9f, 0xb0, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x4, 0x10, 0x0, - - /* U+5C08 "專" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xd0, 0x0, 0x2, 0x0, 0x3, - 0x76, 0x66, 0x6e, 0x66, 0x69, 0xb1, 0x0, 0x0, - 0x10, 0x1, 0xd0, 0x1, 0x10, 0x0, 0x0, 0xe, - 0x66, 0x6e, 0x66, 0x9b, 0x0, 0x0, 0x0, 0xd0, - 0x1, 0xd0, 0x5, 0x80, 0x0, 0x0, 0xe, 0x66, - 0x6e, 0x66, 0x98, 0x0, 0x0, 0x1, 0xe6, 0x66, - 0xe6, 0x69, 0x80, 0x0, 0x0, 0x17, 0x0, 0x1d, - 0x2, 0x93, 0x0, 0x0, 0x16, 0x66, 0x78, 0xe7, - 0x68, 0xe4, 0x0, 0x0, 0x97, 0x43, 0x10, 0xb, - 0x13, 0x92, 0x3, 0x76, 0x66, 0x66, 0x66, 0xf6, - 0x6b, 0xb0, 0x0, 0x8, 0x40, 0x0, 0xf, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x40, 0x7, 0xcd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, - - /* U+5C0D "對" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x2a, 0x20, 0x0, 0x0, 0xb3, 0x0, - 0x6, 0xc, 0xb, 0x7, 0x10, 0x0, 0xd0, 0x0, - 0x6, 0x8c, 0xb, 0x49, 0x0, 0x0, 0xd0, 0x0, - 0x1, 0x4c, 0xb, 0x52, 0x20, 0x0, 0xd0, 0x0, - 0x28, 0x69, 0x69, 0x68, 0x80, 0x0, 0xd3, 0x50, - 0x0, 0x63, 0x7, 0x60, 0x18, 0x66, 0xe6, 0x50, - 0x0, 0x1d, 0x9, 0x10, 0x12, 0x0, 0xd0, 0x0, - 0x5, 0x79, 0x87, 0xb6, 0xb, 0x30, 0xd0, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x4, 0xe0, 0xd0, 0x0, - 0x0, 0x0, 0xb0, 0x40, 0x0, 0xc0, 0xd0, 0x0, - 0x2, 0x86, 0xc6, 0x73, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0xb3, 0x54, 0x1, 0x10, 0xd0, 0x0, - 0x1b, 0xca, 0x73, 0x0, 0x1, 0x6e, 0xc0, 0x0, - 0x4, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, - - /* U+5C0E "導" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0x10, 0x0, 0x94, 0x5, 0x80, 0x0, 0x0, - 0x4c, 0x0, 0x1, 0x70, 0x80, 0x28, 0x0, 0x0, - 0x70, 0x77, 0x6a, 0x76, 0x67, 0x61, 0x3, 0x69, - 0x40, 0xe5, 0x65, 0x56, 0xd0, 0x0, 0x0, 0xb1, - 0xd, 0x55, 0x55, 0x6b, 0x0, 0x0, 0xb, 0x10, - 0xd6, 0x66, 0x67, 0xb0, 0x0, 0x0, 0xb1, 0xd, - 0x22, 0x22, 0x3b, 0x0, 0x0, 0x29, 0x72, 0x93, - 0x33, 0x34, 0x60, 0x0, 0x3a, 0x0, 0x6a, 0xbb, - 0xcc, 0xcd, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb1, 0x19, 0x0, 0x76, 0x66, 0x66, 0x66, 0x6e, - 0x68, 0xc6, 0x0, 0x0, 0x82, 0x0, 0x0, 0xe0, - 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x1, 0x7b, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x0, 0x0, - - /* U+5C0F "小" */ - 0x0, 0x0, 0x0, 0x2a, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0x0, 0x0, 0x0, 0x0, 0x3, 0x90, 0x1d, - 0x4, 0x0, 0x0, 0x0, 0x8, 0xc0, 0x1d, 0x1, - 0x90, 0x0, 0x0, 0x1e, 0x10, 0x1d, 0x0, 0x3c, - 0x10, 0x0, 0x86, 0x0, 0x1d, 0x0, 0x8, 0xd0, - 0x2, 0x90, 0x0, 0x1d, 0x0, 0x0, 0xe8, 0x8, - 0x0, 0x0, 0x1d, 0x0, 0x0, 0x89, 0x40, 0x0, - 0x0, 0x1d, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, - 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x6d, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, - - /* U+5C11 "少" */ - 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x30, 0xb3, 0x16, 0x0, 0x0, 0x0, 0x2, - 0xf3, 0xb, 0x30, 0x2c, 0x60, 0x0, 0x0, 0xa7, - 0x0, 0xb3, 0x0, 0x1d, 0xb0, 0x0, 0x3b, 0x0, - 0xb, 0x30, 0x0, 0x2f, 0x50, 0xa, 0x10, 0x0, - 0xb3, 0x0, 0x40, 0x62, 0x7, 0x20, 0x0, 0xb, - 0x30, 0x3f, 0xa0, 0x1, 0x10, 0x0, 0x0, 0x81, - 0x3e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9c, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x18, 0xc5, 0x0, 0x0, - 0x0, 0x0, 0x15, 0x88, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5C1A "尚" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2c, 0x10, 0x0, 0x0, 0x7, 0x30, 0x2, - 0xc0, 0x0, 0xc4, 0x0, 0xd, 0x70, 0x2c, 0x0, - 0x5d, 0x10, 0x0, 0x4f, 0x2, 0xc0, 0xb, 0x10, - 0x2, 0x0, 0x40, 0x2c, 0x7, 0x30, 0x30, 0xc7, - 0x66, 0x66, 0x86, 0x76, 0x6f, 0x3b, 0x20, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0xb2, 0xa, 0x76, 0x66, - 0xe0, 0xe, 0xb, 0x20, 0xa3, 0x0, 0xd, 0x0, - 0xe0, 0xb2, 0xa, 0x30, 0x0, 0xd0, 0xe, 0xb, - 0x20, 0xa7, 0x66, 0x6d, 0x0, 0xe0, 0xb2, 0xa, - 0x20, 0x0, 0xa0, 0xe, 0xb, 0x20, 0x10, 0x0, - 0x4, 0x55, 0xe0, 0xc2, 0x0, 0x0, 0x0, 0x4, - 0xe9, 0x1, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+5C24 "尤" */ - 0x0, 0x0, 0x0, 0x95, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb4, 0x2, 0xc9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb3, 0x0, 0x1e, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xb3, 0x0, 0x2, 0x5, 0x20, - 0x6, 0x76, 0x66, 0xc7, 0x69, 0x66, 0x6a, 0x90, - 0x0, 0x0, 0x0, 0xb2, 0x1c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc1, 0x1c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0x1c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x1c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xa0, 0x1c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x30, 0x1c, 0x0, 0x0, 0x40, - 0x0, 0x0, 0x59, 0x0, 0x1c, 0x0, 0x0, 0x70, - 0x0, 0x4, 0xa0, 0x0, 0x1d, 0x0, 0x0, 0xc1, - 0x0, 0x76, 0x0, 0x0, 0xb, 0xdd, 0xdd, 0xd2, - 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5C31 "就" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x90, 0x0, 0x8, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xa4, 0x0, 0x9, 0x32, 0x80, 0x0, - 0x5, 0x66, 0x76, 0x6c, 0x29, 0x30, 0x87, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x9, 0x30, 0x12, 0x0, - 0x0, 0x86, 0x66, 0xa4, 0x6b, 0x86, 0x6a, 0x90, - 0x0, 0xd0, 0x0, 0xc1, 0x9, 0x3d, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0xc0, 0x9, 0x3d, 0x0, 0x0, - 0x0, 0xd6, 0x86, 0xd1, 0xa, 0x2d, 0x0, 0x0, - 0x0, 0x40, 0xb0, 0x30, 0xc, 0xd, 0x0, 0x0, - 0x0, 0x93, 0xb2, 0x50, 0xc, 0xd, 0x0, 0x0, - 0x1, 0xb0, 0xb0, 0xa5, 0x47, 0xd, 0x0, 0x10, - 0x7, 0x20, 0xb0, 0x34, 0xa1, 0xd, 0x0, 0x60, - 0x15, 0x10, 0xc0, 0x5, 0x50, 0xd, 0x1, 0x90, - 0x0, 0x2b, 0xd0, 0x35, 0x0, 0x9, 0xcc, 0xb0, - 0x0, 0x0, 0x10, 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+5C3A "尺" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xa6, 0x66, 0x66, 0x66, 0xd3, 0x0, - 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x4, 0xd6, 0x66, 0x76, 0x66, 0xe1, 0x0, - 0x0, 0x4, 0xa0, 0x0, 0x60, 0x0, 0x70, 0x0, - 0x0, 0x4, 0x90, 0x0, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x70, 0x0, 0x45, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x50, 0x0, 0xb, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x5, 0xa0, 0x0, 0x0, - 0x0, 0x2a, 0x0, 0x0, 0x0, 0xaa, 0x0, 0x0, - 0x0, 0xa1, 0x0, 0x0, 0x0, 0xb, 0xd5, 0x0, - 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xa0, - 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+5C40 "局" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0xd6, 0x66, 0x66, 0x66, 0x6e, 0x30, 0x0, - 0xd, 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0xd6, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xd, - 0x10, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0xd, 0x66, - 0x66, 0x66, 0x66, 0x6e, 0x40, 0x0, 0xd0, 0x0, - 0x0, 0x2, 0x0, 0xd1, 0x0, 0xd, 0x2, 0xc6, - 0x66, 0xe0, 0xd, 0x10, 0x2, 0xa0, 0x1b, 0x0, - 0xd, 0x0, 0xd1, 0x0, 0x56, 0x1, 0xd6, 0x66, - 0xd0, 0xd, 0x10, 0xa, 0x0, 0x2a, 0x0, 0x7, - 0x0, 0xe0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x34, - 0x4e, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, - - /* U+5C45 "居" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, - 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x9a, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, - 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x98, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xb4, 0x0, 0x22, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x76, 0x66, 0xd7, 0x66, 0x6b, 0x90, - 0x0, 0x1b, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, - 0x0, 0x39, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, - 0x0, 0x56, 0xc, 0x77, 0xb7, 0x77, 0xe1, 0x0, - 0x0, 0x82, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xa0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x4, 0x50, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x7, 0x0, 0xf, 0x66, 0x66, 0x66, 0xe0, 0x0, - 0x10, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5C4A "届" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, - 0x0, 0xe6, 0x66, 0x66, 0x66, 0x66, 0xe0, 0x0, - 0xe, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, - 0xe6, 0x66, 0x66, 0x66, 0x66, 0xd0, 0x0, 0xd, - 0x0, 0x0, 0x4, 0x0, 0x4, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0xc, 0x3, - 0x0, 0xe, 0x0, 0x5, 0x10, 0x1, 0xb0, 0xd6, - 0x66, 0xe6, 0x66, 0xd5, 0x0, 0x3a, 0xd, 0x10, - 0xe, 0x0, 0xb, 0x20, 0x5, 0x70, 0xd6, 0x66, - 0xe6, 0x66, 0xd2, 0x0, 0x83, 0xc, 0x10, 0xe, - 0x0, 0xb, 0x20, 0xa, 0x0, 0xc1, 0x0, 0xe0, - 0x0, 0xb2, 0x3, 0x60, 0xd, 0x66, 0x6e, 0x66, - 0x6d, 0x30, 0x70, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0x92, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5C4B "屋" */ - 0x0, 0x19, 0x66, 0x66, 0x66, 0x66, 0x6b, 0x0, - 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, - 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, - 0x0, 0x1e, 0x66, 0x66, 0x66, 0x66, 0x7b, 0x0, - 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, - 0x0, 0x1c, 0x47, 0x66, 0xa6, 0x66, 0x79, 0x10, - 0x0, 0x2b, 0x0, 0x5, 0xc3, 0x13, 0x0, 0x0, - 0x0, 0x3a, 0x0, 0x76, 0x0, 0x6, 0xb1, 0x0, - 0x0, 0x49, 0xc, 0xda, 0x87, 0x65, 0xab, 0x0, - 0x0, 0x66, 0x2, 0x20, 0xd, 0x10, 0x4, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0xd, 0x0, 0x45, 0x0, - 0x0, 0xb0, 0x6, 0x76, 0x6e, 0x66, 0x65, 0x0, - 0x4, 0x50, 0x0, 0x0, 0xd, 0x0, 0x0, 0x10, - 0x7, 0x3, 0x66, 0x66, 0x6e, 0x66, 0x6a, 0xd1, - 0x11, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5C55 "展" */ - 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x51, 0x0, - 0x3, 0xc6, 0x66, 0x66, 0x66, 0x6d, 0x50, 0x0, - 0x3b, 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x3, - 0xc6, 0x67, 0x66, 0x66, 0x6d, 0x30, 0x0, 0x3a, - 0x0, 0xb5, 0x0, 0xd0, 0x10, 0x0, 0x3, 0xa0, - 0xb, 0x20, 0xd, 0x7, 0x0, 0x0, 0x3c, 0x66, - 0xd7, 0x66, 0xe6, 0x62, 0x0, 0x4, 0x90, 0xb, - 0x20, 0xd, 0x0, 0x30, 0x0, 0x5a, 0x68, 0xa7, - 0x76, 0xa6, 0x7b, 0x30, 0x8, 0x50, 0xa2, 0x7, - 0x0, 0x57, 0x0, 0x0, 0xb1, 0xa, 0x20, 0x47, - 0x59, 0x20, 0x0, 0xb, 0x0, 0xa2, 0x0, 0xa9, - 0x0, 0x0, 0x5, 0x40, 0xa, 0x57, 0x50, 0x9c, - 0x63, 0x10, 0x70, 0x0, 0xbb, 0x10, 0x0, 0x4c, - 0xe5, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5C65 "履" */ - 0x0, 0x28, 0x66, 0x66, 0x66, 0x66, 0x6a, 0x20, - 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x1d, 0x66, 0x66, 0x76, 0x66, 0x6d, 0x10, - 0x0, 0x1b, 0x4, 0x90, 0xb6, 0x0, 0x6, 0x0, - 0x0, 0x1b, 0xa, 0x10, 0xc6, 0x66, 0x68, 0x30, - 0x0, 0x2a, 0x63, 0x55, 0xc6, 0x66, 0x6c, 0x0, - 0x0, 0x2a, 0x26, 0xb6, 0xa1, 0x0, 0xc, 0x0, - 0x0, 0x39, 0xc, 0x20, 0xa7, 0x66, 0x6c, 0x0, - 0x0, 0x47, 0x7e, 0x20, 0xa8, 0x66, 0x6c, 0x0, - 0x0, 0x67, 0x5c, 0x0, 0x1c, 0x50, 0x11, 0x0, - 0x0, 0x91, 0xc, 0x0, 0x7b, 0x66, 0xc9, 0x0, - 0x0, 0x90, 0xc, 0x4, 0x42, 0x76, 0x90, 0x0, - 0x4, 0x40, 0xc, 0x1, 0x1, 0xbd, 0x40, 0x0, - 0x5, 0x0, 0xb, 0x2, 0x78, 0x20, 0x8d, 0xb1, - 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x20, - - /* U+5C6C "屬" */ - 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, - 0x2, 0xd6, 0x66, 0x66, 0x66, 0x6a, 0x70, 0x0, - 0x2b, 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, 0x2, - 0xc6, 0x86, 0x69, 0x86, 0x9b, 0x30, 0x0, 0x2b, - 0x1, 0xa3, 0x75, 0x46, 0x20, 0x0, 0x2, 0xa7, - 0x85, 0x47, 0x44, 0x7a, 0x30, 0x0, 0x3a, 0x56, - 0x66, 0x86, 0x66, 0x94, 0x0, 0x3, 0x95, 0x60, - 0xa0, 0xb, 0xa, 0x10, 0x0, 0x58, 0x5a, 0x68, - 0x66, 0x86, 0xb1, 0x0, 0x6, 0x50, 0x9b, 0x66, - 0x66, 0x66, 0x90, 0x0, 0x92, 0x66, 0x0, 0xa0, - 0x1, 0x1a, 0x0, 0xb, 0x32, 0xb6, 0x6d, 0x67, - 0x92, 0x90, 0x1, 0x90, 0xb, 0x66, 0xd6, 0x77, - 0x38, 0x0, 0x62, 0x0, 0x33, 0x3c, 0x57, 0x75, - 0x60, 0x6, 0x0, 0x1a, 0x64, 0x10, 0x19, 0xc3, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, - - /* U+5C71 "山" */ - 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x9, 0x40, 0x0, 0xd0, 0x0, 0xa, - 0x30, 0xa3, 0x0, 0xd, 0x0, 0x0, 0xc1, 0xa, - 0x30, 0x0, 0xd0, 0x0, 0xc, 0x10, 0xa3, 0x0, - 0xd, 0x0, 0x0, 0xc1, 0xa, 0x30, 0x0, 0xd0, - 0x0, 0xc, 0x10, 0xa3, 0x0, 0xd, 0x0, 0x0, - 0xc1, 0xa, 0x30, 0x0, 0xd0, 0x0, 0xc, 0x10, - 0xa3, 0x0, 0xd, 0x0, 0x0, 0xc1, 0xd, 0x76, - 0x66, 0xa6, 0x66, 0x6d, 0x10, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x91, - - /* U+5CF6 "島" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x7, 0x0, 0x0, 0x51, 0x0, 0x0, 0xc, - 0x66, 0x66, 0x66, 0x6d, 0x30, 0x0, 0x0, 0xc6, - 0x66, 0x66, 0x66, 0xd1, 0x0, 0x0, 0xc, 0x10, - 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0xc6, 0x66, - 0x66, 0x66, 0xd1, 0x0, 0x0, 0xc, 0x10, 0x0, - 0x0, 0x1, 0x2, 0x70, 0x0, 0xc6, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x10, 0xc, 0x66, 0x66, 0x66, - 0x66, 0x6a, 0x50, 0x0, 0x40, 0xa, 0x10, 0x0, - 0x0, 0x93, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xb1, - 0xb, 0x10, 0xc, 0x0, 0xd, 0x0, 0xd, 0x0, - 0xd0, 0x2, 0xc6, 0x66, 0x96, 0x66, 0xc0, 0x1c, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xce, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, - - /* U+5D4C "嵌" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x6, 0x80, 0x0, 0x20, 0x0, 0x1, - 0xd0, 0x0, 0x66, 0x0, 0xb, 0x40, 0x0, 0x1b, - 0x0, 0x6, 0x60, 0x0, 0xb2, 0x0, 0x2, 0xb6, - 0x66, 0x66, 0x66, 0x6c, 0x20, 0x0, 0x19, 0x0, - 0xb2, 0x2, 0xe0, 0x0, 0x0, 0x1, 0xb0, 0xd, - 0x22, 0x78, 0x0, 0x21, 0x5, 0x7d, 0x66, 0xe7, - 0x6b, 0x66, 0x6c, 0x90, 0x1, 0xb0, 0xd, 0x5, - 0x77, 0x41, 0x70, 0x0, 0x1d, 0x66, 0xe0, 0x70, - 0xb6, 0x0, 0x0, 0x1, 0xb0, 0xd, 0x0, 0xd, - 0x50, 0x0, 0x0, 0x1b, 0x0, 0xd0, 0x3, 0xa6, - 0x20, 0x0, 0x1, 0xb0, 0xd, 0x0, 0x94, 0x1b, - 0x0, 0x0, 0x1d, 0x66, 0xe0, 0x48, 0x0, 0x7b, - 0x10, 0x2, 0x80, 0x5, 0x66, 0x0, 0x0, 0xbd, - 0x20, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x10, - - /* U+5DDD "川" */ - 0x0, 0x25, 0x0, 0x0, 0x0, 0x5, 0x50, 0x2, - 0xc0, 0x0, 0x40, 0x0, 0x78, 0x0, 0x2b, 0x0, - 0xd, 0x30, 0x7, 0x70, 0x2, 0xb0, 0x0, 0xc1, - 0x0, 0x77, 0x0, 0x3a, 0x0, 0xc, 0x10, 0x6, - 0x70, 0x3, 0xa0, 0x0, 0xc1, 0x0, 0x67, 0x0, - 0x39, 0x0, 0xc, 0x10, 0x6, 0x70, 0x5, 0x70, - 0x0, 0xc1, 0x0, 0x67, 0x0, 0x65, 0x0, 0xc, - 0x10, 0x6, 0x70, 0x9, 0x20, 0x0, 0xc1, 0x0, - 0x67, 0x0, 0xc0, 0x0, 0xd, 0x10, 0x6, 0x70, - 0x36, 0x0, 0x0, 0x80, 0x0, 0x67, 0x8, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x73, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x77, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, - - /* U+5DDE "州" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x72, 0x0, - 0x0, 0xd2, 0x0, 0x93, 0x0, 0xb3, 0x0, 0x0, - 0xd0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0x0, 0xd0, - 0x0, 0xb1, 0x0, 0xb2, 0x0, 0x10, 0xd0, 0x0, - 0xb1, 0x10, 0xb2, 0x0, 0x70, 0xd0, 0x90, 0xb1, - 0x82, 0xb2, 0x1, 0xc0, 0xd0, 0xa5, 0xb1, 0x4b, - 0xb2, 0x9, 0x91, 0xb0, 0x64, 0xb1, 0x7, 0xb2, - 0x1, 0x4, 0x90, 0x0, 0xb1, 0x0, 0xb2, 0x0, - 0x7, 0x60, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xc, - 0x20, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0x2b, 0x0, - 0x0, 0xb2, 0x0, 0xb2, 0x0, 0xa2, 0x0, 0x0, - 0x91, 0x0, 0xb2, 0x6, 0x40, 0x0, 0x0, 0x0, - 0x0, 0xb2, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x30, - - /* U+5DE5 "工" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x72, 0x0, - 0x28, 0x66, 0x66, 0xb7, 0x66, 0x68, 0x60, 0x0, - 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, - 0x0, 0x3, 0x1, 0x66, 0x66, 0x66, 0xd8, 0x66, - 0x68, 0xf6, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+5DE6 "左" */ - 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xb0, 0x0, 0x0, 0x96, 0x0, 0x37, - 0x66, 0xaa, 0x66, 0x66, 0x66, 0x50, 0x0, 0x0, - 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xb, 0x66, - 0x67, 0x66, 0xb9, 0x0, 0x0, 0x4, 0x80, 0x0, - 0xb2, 0x0, 0x0, 0x0, 0x0, 0xa0, 0x0, 0xb, - 0x20, 0x0, 0x0, 0x0, 0x74, 0x0, 0x0, 0xb2, - 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0xb, 0x20, - 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0xb2, 0x0, - 0x27, 0x0, 0x0, 0x66, 0x66, 0x67, 0x66, 0x67, - 0x82, - - /* U+5DEE "差" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x59, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, - 0x0, 0x96, 0x0, 0xa, 0x10, 0x10, 0x0, 0x56, - 0x67, 0x76, 0x68, 0x86, 0x6e, 0x90, 0x1, 0x0, - 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0x0, 0x0, 0x81, 0x0, 0x0, 0x66, 0x68, - 0xc6, 0x66, 0x67, 0x40, 0x0, 0x0, 0x0, 0x85, - 0x0, 0x0, 0x4, 0x20, 0x46, 0x66, 0x6d, 0x66, - 0x66, 0x66, 0xa9, 0x0, 0x0, 0x7, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xc6, 0x66, 0x66, - 0x6d, 0x30, 0x0, 0x0, 0xa1, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x1, 0x71, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x10, 0x40, 0x36, 0x66, 0x66, 0xe6, 0x66, 0xbd, - 0x10, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5DF1 "己" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, - 0x66, 0x66, 0x66, 0x66, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0xe0, 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0xf0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0xd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x60, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb0, 0xe, 0x42, 0x22, 0x22, - 0x22, 0x26, 0xf3, 0x5, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0x70, - - /* U+5DF2 "已" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x18, - 0x66, 0x66, 0x66, 0x66, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x5, 0x0, 0x0, 0x0, - 0x0, 0xe0, 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, - 0xe0, 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0xe0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0xe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x60, 0xe, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x90, 0xe, 0x42, 0x22, 0x22, - 0x22, 0x27, 0xe1, 0x5, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x50, - - /* U+5E02 "市" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc5, 0x0, 0x0, 0x20, 0x4, 0x66, - 0x66, 0x69, 0x76, 0x66, 0x6f, 0x80, 0x11, 0x0, - 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0xb, 0x20, 0x0, 0x20, 0x0, 0x0, 0xd6, 0x66, - 0xd7, 0x66, 0x6f, 0x20, 0x0, 0xd, 0x10, 0xb, - 0x20, 0x0, 0xe0, 0x0, 0x0, 0xd1, 0x0, 0xb2, - 0x0, 0xe, 0x0, 0x0, 0xd, 0x10, 0xb, 0x20, - 0x0, 0xe0, 0x0, 0x0, 0xd1, 0x0, 0xb2, 0x0, - 0xe, 0x0, 0x0, 0xd, 0x10, 0xb, 0x20, 0x0, - 0xe0, 0x0, 0x0, 0xd1, 0x0, 0xb2, 0x17, 0x9d, - 0x0, 0x0, 0xb, 0x0, 0xb, 0x20, 0xb, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, - - /* U+5E03 "布" */ - 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8a, 0x0, 0x0, 0x3, 0xa0, - 0x4, 0x66, 0x66, 0xf6, 0x66, 0x66, 0x66, 0x62, - 0x0, 0x0, 0x7, 0x70, 0x1b, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x3, 0x0, - 0x0, 0x0, 0xbe, 0x66, 0x6e, 0x66, 0x7e, 0x10, - 0x0, 0x7, 0x4d, 0x0, 0xd, 0x0, 0x1c, 0x0, - 0x0, 0x64, 0xd, 0x0, 0xd, 0x0, 0x1c, 0x0, - 0x4, 0x30, 0xd, 0x0, 0xd, 0x0, 0x1c, 0x0, - 0x1, 0x0, 0xd, 0x0, 0xd, 0x0, 0x1c, 0x0, - 0x0, 0x0, 0xd, 0x0, 0xd, 0x5, 0x6c, 0x0, - 0x0, 0x0, 0x1b, 0x0, 0x1d, 0x2, 0xd6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, - - /* U+5E08 "师" */ - 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x5, 0x0, - 0x0, 0xc2, 0x47, 0x66, 0xb6, 0x66, 0x93, 0x9, - 0xc, 0x10, 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, - 0xb1, 0x0, 0x0, 0xd0, 0x0, 0x10, 0xd, 0xb, - 0x10, 0xd6, 0x6e, 0x66, 0x7d, 0x0, 0xd0, 0xb1, - 0xd, 0x0, 0xd0, 0x2, 0xb0, 0xd, 0xc, 0x0, - 0xd0, 0xd, 0x0, 0x2b, 0x0, 0xd0, 0xc0, 0xd, - 0x0, 0xd0, 0x2, 0xb0, 0xd, 0xc, 0x0, 0xd0, - 0xd, 0x0, 0x2b, 0x0, 0xb2, 0xa0, 0xd, 0x0, - 0xd0, 0x2, 0xb0, 0x0, 0x74, 0x0, 0xd0, 0xd, - 0x5, 0x8a, 0x0, 0xb, 0x0, 0x5, 0x0, 0xd0, - 0xa, 0x30, 0x7, 0x30, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x3, 0x40, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, - 0x0, - - /* U+5E0C "希" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x30, 0x0, 0x0, 0xba, 0x0, 0x0, - 0x0, 0x0, 0x16, 0x86, 0x4c, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2c, 0xcb, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x37, 0x83, 0x3, 0xbe, 0x30, 0x0, - 0x0, 0x25, 0x30, 0x9c, 0x0, 0x5, 0x61, 0x10, - 0x6, 0x66, 0x66, 0xf7, 0x66, 0x66, 0x6d, 0xb0, - 0x0, 0x0, 0xb, 0x40, 0xa1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x86, 0x0, 0xd0, 0x0, 0x30, 0x0, - 0x0, 0x7, 0xf6, 0x66, 0xe6, 0x66, 0xf2, 0x0, - 0x0, 0x74, 0xe0, 0x0, 0xd0, 0x0, 0xe0, 0x0, - 0x16, 0x10, 0xe0, 0x0, 0xd0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0xd0, 0x12, 0xd0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x5e, 0x90, 0x0, - 0x0, 0x0, 0x30, 0x0, 0xe0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, - - /* U+5E2B "師" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x90, 0x2, 0x55, 0x55, 0x55, 0x5c, 0x19, 0x78, - 0x6b, 0x32, 0x11, 0xd1, 0x11, 0x10, 0xd0, 0x0, - 0xd0, 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, 0xd, - 0x7, 0x66, 0xe6, 0x66, 0xb0, 0xd0, 0x0, 0xd0, - 0xd0, 0xd, 0x0, 0x2a, 0xd, 0x66, 0x6b, 0xd, - 0x0, 0xd0, 0x2, 0xa0, 0xd0, 0x0, 0x20, 0xd0, - 0xd, 0x0, 0x2a, 0xd, 0x66, 0x6e, 0x2d, 0x0, - 0xd0, 0x2, 0xa0, 0xd0, 0x0, 0xd0, 0xd0, 0xd, - 0x0, 0x2a, 0xd, 0x0, 0xd, 0xd, 0x0, 0xd0, - 0x24, 0xa0, 0xd0, 0x0, 0xd0, 0xb0, 0xd, 0x5, - 0xe6, 0xd, 0x66, 0x6d, 0x0, 0x0, 0xd0, 0x1, - 0x0, 0x90, 0x0, 0x10, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, - - /* U+5E2D "席" */ - 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x4, 0x60, - 0x0, 0xb7, 0x66, 0x76, 0x66, 0x96, 0x66, 0x50, - 0x0, 0xb2, 0x0, 0x75, 0x0, 0xd3, 0x0, 0x0, - 0x0, 0xb3, 0x66, 0xa8, 0x66, 0xe6, 0x6d, 0x60, - 0x0, 0xb2, 0x0, 0x64, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0x68, 0x66, 0xe0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x52, 0xb1, 0x70, 0x0, 0x0, - 0x0, 0xd0, 0x3, 0x0, 0xb1, 0x0, 0x5, 0x0, - 0x0, 0xd0, 0xe, 0x66, 0xd6, 0x66, 0x7c, 0x0, - 0x1, 0xa0, 0xd, 0x0, 0xb1, 0x0, 0x2a, 0x0, - 0x5, 0x50, 0xd, 0x0, 0xb1, 0x0, 0x2a, 0x0, - 0x8, 0x0, 0xd, 0x0, 0xb1, 0x28, 0xd8, 0x0, - 0x6, 0x0, 0x5, 0x0, 0xc2, 0x0, 0x50, 0x0, - 0x10, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, - - /* U+5E2F "帯" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x50, 0x1, 0x0, 0x0, - 0x0, 0x3, 0xa0, 0x7, 0x50, 0xb, 0x33, 0x0, - 0x4, 0x68, 0xb6, 0x6a, 0x96, 0x6d, 0x7c, 0x70, - 0x0, 0x3, 0x90, 0x7, 0x50, 0xb, 0x20, 0x0, - 0x0, 0x5, 0xb6, 0x69, 0x86, 0x6c, 0x20, 0x0, - 0x0, 0x40, 0x10, 0x0, 0x0, 0x3, 0x2, 0x10, - 0x2, 0xa6, 0x66, 0x68, 0x76, 0x66, 0x6b, 0xa0, - 0xb, 0x50, 0x0, 0x7, 0x70, 0x0, 0x7, 0x0, - 0x3, 0xb, 0x66, 0x6a, 0x96, 0x67, 0xc0, 0x0, - 0x0, 0xd, 0x0, 0x7, 0x50, 0x3, 0xa0, 0x0, - 0x0, 0xd, 0x0, 0x7, 0x50, 0x3, 0xa0, 0x0, - 0x0, 0xd, 0x0, 0x7, 0x50, 0x3, 0xa0, 0x0, - 0x0, 0xd, 0x0, 0x7, 0x50, 0x6c, 0x80, 0x0, - 0x0, 0x3, 0x0, 0x7, 0x50, 0x5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, - - /* U+5E30 "帰" */ - 0x0, 0x7, 0x40, 0x56, 0x66, 0x66, 0x6b, 0x0, - 0x0, 0x9, 0x30, 0x11, 0x0, 0x0, 0x1c, 0x0, - 0x0, 0x9, 0x30, 0x36, 0x66, 0x66, 0x6c, 0x0, - 0x6, 0x29, 0x30, 0x1, 0x0, 0x0, 0x1c, 0x0, - 0xb, 0x9, 0x30, 0x66, 0x66, 0x66, 0x6c, 0x0, - 0xb, 0xa, 0x22, 0x0, 0x0, 0x0, 0x4, 0x10, - 0xb, 0xb, 0x1a, 0x66, 0x6a, 0x66, 0x66, 0xe1, - 0xb, 0xc, 0x5a, 0x0, 0xd, 0x0, 0x4, 0x30, - 0x7, 0xc, 0x11, 0x76, 0x6e, 0x66, 0x6a, 0x0, - 0x0, 0x2a, 0x0, 0xd0, 0xd, 0x0, 0x1c, 0x0, - 0x0, 0x65, 0x0, 0xd0, 0xd, 0x0, 0x1c, 0x0, - 0x0, 0xa0, 0x0, 0xd0, 0xd, 0x0, 0x1c, 0x0, - 0x3, 0x60, 0x0, 0xd0, 0xd, 0x6, 0xab, 0x0, - 0x6, 0x0, 0x0, 0x50, 0xd, 0x0, 0x62, 0x0, - 0x10, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, - - /* U+5E33 "帳" */ - 0x0, 0xb1, 0x0, 0x4, 0x0, 0x0, 0x71, 0x0, - 0xd, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x30, 0x10, - 0xd0, 0x30, 0xd, 0x22, 0x24, 0x70, 0xe, 0x6e, - 0x6e, 0x30, 0xd3, 0x33, 0x32, 0x0, 0xd0, 0xd0, - 0xd0, 0xc, 0x0, 0x1, 0x60, 0xd, 0xd, 0xd, - 0x0, 0xd6, 0x66, 0x65, 0x0, 0xd0, 0xd0, 0xd0, - 0xc, 0x0, 0x0, 0x17, 0xd, 0xd, 0xd, 0x47, - 0xd6, 0x96, 0x66, 0x61, 0xd0, 0xd0, 0xd0, 0x1b, - 0x6, 0x0, 0x84, 0xd, 0xd, 0x3d, 0x1, 0xb0, - 0x44, 0x6a, 0x20, 0x90, 0xd4, 0x80, 0x1b, 0x0, - 0xc4, 0x0, 0x0, 0xd, 0x0, 0x1, 0xb0, 0x5, - 0xa0, 0x0, 0x0, 0xd0, 0x0, 0x1c, 0x76, 0x9, - 0xb2, 0x0, 0xe, 0x0, 0x4, 0xf5, 0x0, 0x9, - 0xd3, 0x0, 0x50, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, - - /* U+5E36 "帶" */ - 0x0, 0x1, 0xb0, 0x92, 0x18, 0xb, 0x10, 0x0, - 0x0, 0x0, 0xd0, 0xc0, 0xb, 0xd, 0x4, 0x0, - 0x2, 0x66, 0xd6, 0xd6, 0x6d, 0x6e, 0x6b, 0x80, - 0x0, 0x4, 0x80, 0xc0, 0xb, 0xd, 0x0, 0x40, - 0x0, 0x1a, 0x0, 0xc6, 0x6c, 0xd, 0x57, 0xb0, - 0x1, 0x60, 0x0, 0x60, 0x4, 0x3, 0x55, 0x20, - 0x0, 0x96, 0x66, 0x67, 0x66, 0x66, 0x68, 0xb0, - 0x7, 0x50, 0x0, 0x6, 0xb0, 0x0, 0x7, 0x40, - 0xd, 0x18, 0x66, 0x69, 0xb6, 0x68, 0xb3, 0x0, - 0x0, 0xb, 0x20, 0x6, 0x90, 0x4, 0x90, 0x0, - 0x0, 0xb, 0x20, 0x6, 0x90, 0x4, 0x90, 0x0, - 0x0, 0xb, 0x20, 0x6, 0x90, 0x4, 0x90, 0x0, - 0x0, 0xb, 0x10, 0x6, 0x91, 0x8c, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xa0, 0x7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x40, 0x0, 0x0, 0x0, - - /* U+5E38 "常" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x15, 0x0, 0x93, 0x2, 0x60, 0x0, 0x0, 0x8, - 0xa0, 0xa2, 0xa, 0x60, 0x0, 0x2, 0x0, 0x90, - 0xa2, 0x43, 0x0, 0x30, 0xa, 0x66, 0x66, 0x76, - 0x66, 0x66, 0xe8, 0x78, 0x2, 0x10, 0x0, 0x4, - 0x2, 0x70, 0x61, 0x5, 0xa6, 0x66, 0x6d, 0x20, - 0x0, 0x0, 0x4, 0x70, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x5, 0xa6, 0xb7, 0x6c, 0x0, 0x0, 0x0, - 0x21, 0x0, 0xa2, 0x0, 0x3, 0x0, 0x0, 0xd6, - 0x66, 0xc7, 0x66, 0x8c, 0x0, 0x0, 0xd1, 0x0, - 0xa2, 0x0, 0x39, 0x0, 0x0, 0xd1, 0x0, 0xa2, - 0x0, 0x39, 0x0, 0x0, 0xd1, 0x0, 0xa2, 0x18, - 0xd8, 0x0, 0x0, 0x40, 0x0, 0xb3, 0x0, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, - - /* U+5E45 "幅" */ - 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0xc0, 0x4, 0x76, 0x66, 0x66, 0x96, 0x10, 0xc0, - 0x30, 0x0, 0x0, 0x1, 0x0, 0xc6, 0xd6, 0xd3, - 0xd, 0x66, 0x6d, 0x30, 0xc0, 0xc0, 0xc0, 0xd, - 0x0, 0xc, 0x0, 0xc0, 0xc0, 0xc0, 0xd, 0x66, - 0x6d, 0x0, 0xc0, 0xc0, 0xc0, 0xb, 0x0, 0x6, - 0x0, 0xc0, 0xc0, 0xc0, 0x86, 0x66, 0x66, 0xa2, - 0xc0, 0xc0, 0xc0, 0xd0, 0xc, 0x0, 0xb2, 0xc0, - 0xc0, 0xc0, 0xd0, 0xc, 0x0, 0xb1, 0xc0, 0xc6, - 0xa0, 0xd6, 0x6d, 0x66, 0xd1, 0x10, 0xc0, 0x0, - 0xd0, 0xc, 0x0, 0xb1, 0x0, 0xc0, 0x0, 0xd6, - 0x6d, 0x66, 0xd1, 0x0, 0xc0, 0x0, 0xd0, 0x0, - 0x0, 0xb1, 0x0, 0x50, 0x0, 0x40, 0x0, 0x0, - 0x10, - - /* U+5E73 "平" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, 0x0, - 0x0, 0x76, 0x66, 0x6b, 0x76, 0x66, 0x86, 0x0, - 0x0, 0x3, 0x0, 0xb, 0x30, 0x6, 0x30, 0x0, - 0x0, 0x6, 0x80, 0xb, 0x30, 0xe, 0x50, 0x0, - 0x0, 0x0, 0xd7, 0xb, 0x30, 0x74, 0x0, 0x0, - 0x0, 0x0, 0x68, 0xb, 0x32, 0x50, 0x1, 0x0, - 0x26, 0x66, 0x66, 0x6d, 0x87, 0x66, 0x6e, 0x80, - 0x1, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5E74 "年" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0xc, 0x86, 0x66, 0x86, 0x66, 0x8c, 0x20, - 0x0, 0x67, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, - 0x1, 0x90, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, - 0x7, 0x4, 0x0, 0x1, 0xd0, 0x2, 0x90, 0x0, - 0x10, 0xb, 0x86, 0x66, 0xe6, 0x66, 0x62, 0x0, - 0x0, 0xb, 0x30, 0x1, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x1, 0xd0, 0x0, 0x1, 0x0, - 0x27, 0x6c, 0x76, 0x66, 0xe6, 0x66, 0x6d, 0xa0, - 0x1, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, 0x0, 0x0, - - /* U+5E78 "幸" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x5, 0x0, 0x0, - 0x0, 0x6, 0x66, 0x6d, 0x76, 0x69, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x1, 0x0, - 0x4, 0x66, 0x66, 0x6c, 0x76, 0x66, 0xad, 0x10, - 0x0, 0x0, 0x6, 0x0, 0x5, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x90, 0xa, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x50, 0x25, 0x4, 0x80, 0x0, - 0x0, 0x57, 0x66, 0x6d, 0x76, 0x66, 0x61, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x1, 0x0, - 0x16, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x6f, 0x80, - 0x2, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, - - /* U+5E7E "幾" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x83, 0x4, 0xa0, 0xa, 0x30, 0x0, - 0x0, 0x2, 0xa0, 0x3, 0x90, 0x49, 0x0, 0x0, - 0x0, 0x18, 0x1, 0x72, 0xa2, 0x70, 0x9, 0x0, - 0x0, 0xc9, 0x6c, 0x61, 0xba, 0x96, 0xc7, 0x0, - 0x0, 0x10, 0x83, 0x0, 0xc0, 0x8, 0x41, 0x0, - 0x0, 0x7, 0x24, 0x50, 0xc2, 0x94, 0x2a, 0x20, - 0x0, 0x8c, 0x86, 0xc0, 0xc2, 0xc7, 0x45, 0x90, - 0x0, 0x0, 0xb2, 0x10, 0xb1, 0x1c, 0x2, 0x10, - 0x4, 0x66, 0xd6, 0x66, 0xb8, 0x69, 0x6e, 0x80, - 0x0, 0x0, 0xc0, 0x0, 0x57, 0x0, 0x81, 0x0, - 0x0, 0x4, 0xc8, 0x10, 0x1c, 0x9, 0xc3, 0x0, - 0x0, 0xa, 0x14, 0xb0, 0x9, 0xd8, 0x0, 0x31, - 0x0, 0x64, 0x0, 0x30, 0x5b, 0xc7, 0x0, 0x70, - 0x4, 0x50, 0x0, 0x58, 0x40, 0x7, 0xd9, 0xd0, - 0x2, 0x0, 0x15, 0x10, 0x0, 0x0, 0x5, 0x91, - - /* U+5E83 "広" */ - 0x0, 0x0, 0x0, 0x2, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x10, 0x0, - 0x28, 0x66, 0x66, 0x78, 0x66, 0x7f, 0x50, 0x2, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, 0x2, 0xc0, - 0x0, 0x9, 0xb0, 0x0, 0x0, 0x0, 0x2c, 0x0, - 0x0, 0xe2, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, - 0x69, 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, 0xc, - 0x10, 0x0, 0x0, 0x0, 0x7, 0x50, 0x5, 0x60, - 0x0, 0x40, 0x0, 0x0, 0xa1, 0x0, 0xa0, 0x0, - 0x1, 0xc2, 0x0, 0xa, 0x0, 0xa2, 0x0, 0x0, - 0x5, 0xe1, 0x5, 0x30, 0x7e, 0xcc, 0xba, 0x98, - 0x7d, 0x80, 0x70, 0x2, 0x62, 0x0, 0x0, 0x0, - 0x44, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5E86 "庆" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0xf1, 0x0, 0x5, 0x0, - 0x0, 0x98, 0x66, 0x66, 0x96, 0x66, 0x7b, 0x40, - 0x0, 0x95, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, - 0x0, 0x95, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x95, 0x0, 0x0, 0xe0, 0x0, 0x1, 0x0, - 0x0, 0xa5, 0x76, 0x66, 0xe6, 0x66, 0x6c, 0x50, - 0x0, 0xa3, 0x0, 0x0, 0xd5, 0x0, 0x0, 0x0, - 0x0, 0xb2, 0x0, 0x3, 0xa7, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x8, 0x63, 0x60, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0xd, 0x10, 0xa2, 0x0, 0x0, - 0x4, 0x80, 0x0, 0x77, 0x0, 0x2d, 0x30, 0x0, - 0x9, 0x10, 0x7, 0x80, 0x0, 0x4, 0xe8, 0x10, - 0x26, 0x3, 0x73, 0x0, 0x0, 0x0, 0x3d, 0x70, - 0x20, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5E95 "底" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0xd3, 0x0, 0x6, 0x10, - 0x0, 0xb8, 0x66, 0x66, 0x76, 0x66, 0x68, 0x60, - 0x0, 0xb3, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, - 0x0, 0xb3, 0x4, 0x24, 0x7a, 0xcb, 0x93, 0x0, - 0x0, 0xb3, 0x1d, 0x32, 0x2e, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0xd, 0x0, 0xe, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0xe, 0x66, 0x6e, 0x76, 0x6e, 0x40, - 0x0, 0xc1, 0xd, 0x0, 0x9, 0x50, 0x0, 0x0, - 0x0, 0xd0, 0xd, 0x0, 0x4, 0xb0, 0x0, 0x0, - 0x0, 0xb0, 0xd, 0x0, 0x23, 0xd2, 0x0, 0x20, - 0x5, 0x60, 0xd, 0x49, 0x50, 0x5c, 0x0, 0x70, - 0x8, 0x0, 0x2f, 0xa3, 0xa2, 0x8, 0xd3, 0xa0, - 0x25, 0x0, 0x5, 0x0, 0x4c, 0x0, 0x6e, 0xd0, - 0x20, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x50, - - /* U+5E97 "店" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, - 0x12, 0x0, 0x0, 0xc3, 0x0, 0x9, 0x10, 0x3, - 0xd6, 0x66, 0x68, 0x66, 0x66, 0x85, 0x0, 0x2c, - 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x2, 0xc0, - 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x2b, 0x0, - 0x0, 0xc6, 0x66, 0xab, 0x0, 0x3, 0xb0, 0x0, - 0xc, 0x10, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, - 0xc1, 0x0, 0x0, 0x0, 0x5, 0x90, 0x96, 0x6d, - 0x66, 0x6b, 0x40, 0x0, 0x77, 0xd, 0x10, 0x0, - 0x0, 0xc3, 0x0, 0xa, 0x30, 0xc1, 0x0, 0x0, - 0xc, 0x20, 0x0, 0xb0, 0xc, 0x10, 0x0, 0x0, - 0xc2, 0x0, 0x54, 0x0, 0xd6, 0x66, 0x66, 0x6d, - 0x30, 0x6, 0x0, 0xd, 0x10, 0x0, 0x0, 0x92, - 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+5E9C "府" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0xe1, 0x0, 0x5, 0x40, - 0x0, 0xb7, 0x66, 0x66, 0x76, 0x66, 0x67, 0x70, - 0x0, 0xb3, 0x0, 0xb5, 0x0, 0x2, 0xa0, 0x0, - 0x0, 0xb3, 0x1, 0xe1, 0x0, 0x1, 0xb0, 0x0, - 0x0, 0xb3, 0x8, 0x60, 0x0, 0x1, 0xb0, 0x60, - 0x0, 0xb2, 0xe, 0x45, 0x76, 0x66, 0xd6, 0x72, - 0x0, 0xc2, 0x7c, 0x20, 0x0, 0x1, 0xb0, 0x0, - 0x0, 0xd3, 0x5a, 0x21, 0xa2, 0x1, 0xb0, 0x0, - 0x0, 0xc4, 0xa, 0x20, 0x4e, 0x1, 0xb0, 0x0, - 0x0, 0xa0, 0xa, 0x20, 0x6, 0x1, 0xb0, 0x0, - 0x4, 0x50, 0xa, 0x20, 0x0, 0x1, 0xb0, 0x0, - 0x8, 0x0, 0xa, 0x20, 0x0, 0x1, 0xb0, 0x0, - 0x14, 0x0, 0xb, 0x20, 0x0, 0x7c, 0x90, 0x0, - 0x10, 0x0, 0x5, 0x0, 0x0, 0x5, 0x10, 0x0, - - /* U+5EA6 "度" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, - 0x40, 0x0, 0x1, 0xc0, 0x0, 0x29, 0x0, 0xb, - 0x86, 0x68, 0x66, 0x67, 0x66, 0x62, 0x0, 0xa3, - 0x0, 0xd2, 0x0, 0xb4, 0x0, 0x0, 0xa, 0x66, - 0x6e, 0x66, 0x6c, 0x79, 0xc0, 0x0, 0xb3, 0x0, - 0xd0, 0x0, 0xa2, 0x0, 0x0, 0xb, 0x20, 0xd, - 0x0, 0xa, 0x20, 0x0, 0x0, 0xc1, 0x0, 0xb6, - 0x66, 0xa1, 0x0, 0x0, 0xd, 0x1, 0x66, 0x66, - 0x66, 0xb1, 0x0, 0x0, 0xc0, 0x0, 0x51, 0x0, - 0x99, 0x0, 0x0, 0x38, 0x0, 0x0, 0x80, 0x5b, - 0x0, 0x0, 0x7, 0x30, 0x0, 0x1, 0xbb, 0x0, - 0x0, 0x0, 0x80, 0x0, 0x1, 0x99, 0xc8, 0x20, - 0x0, 0x33, 0x0, 0x38, 0x82, 0x0, 0x6d, 0xeb, - 0x42, 0x2, 0x52, 0x0, 0x0, 0x0, 0x2, 0x30, - - /* U+5EA7 "座" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x84, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x2, 0xd0, 0x0, 0x26, 0x0, 0xa, - 0x86, 0x66, 0x68, 0x66, 0x68, 0x92, 0x0, 0xa4, - 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0xa, 0x40, - 0x83, 0xb, 0x20, 0x56, 0x0, 0x0, 0xa4, 0xd, - 0x10, 0xb1, 0xb, 0x60, 0x0, 0xa, 0x32, 0xc0, - 0xb, 0x11, 0xe4, 0x0, 0x0, 0xb3, 0x83, 0xc3, - 0xb1, 0x74, 0x7b, 0x0, 0xc, 0x27, 0x5, 0x8b, - 0x28, 0x0, 0xa3, 0x0, 0xd4, 0x0, 0x1, 0xb3, - 0x2, 0x91, 0x0, 0xb, 0x3, 0x76, 0x6d, 0x66, - 0x66, 0x20, 0x4, 0x60, 0x0, 0x0, 0xb1, 0x0, - 0x0, 0x0, 0x80, 0x0, 0x0, 0xb, 0x10, 0x0, - 0x10, 0x15, 0x5, 0x66, 0x66, 0xd6, 0x66, 0x7f, - 0x61, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5EAB "庫" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb3, 0x0, 0x3, 0x0, 0x2, - 0xc6, 0x66, 0x67, 0x66, 0x66, 0xb5, 0x0, 0x2c, - 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x1, 0xb3, - 0x76, 0x66, 0xe6, 0x6a, 0x80, 0x0, 0x1b, 0x2, - 0x0, 0xd, 0x0, 0x40, 0x0, 0x2, 0xb0, 0xa7, - 0x66, 0xe6, 0x6e, 0x20, 0x0, 0x3a, 0xa, 0x20, - 0xd, 0x0, 0xd0, 0x0, 0x4, 0x80, 0xa7, 0x66, - 0xe6, 0x6e, 0x0, 0x0, 0x65, 0xa, 0x76, 0x6e, - 0x66, 0xe0, 0x0, 0xa, 0x10, 0x61, 0x0, 0xd0, - 0x4, 0x30, 0x0, 0x90, 0x76, 0x66, 0x6e, 0x66, - 0x6d, 0x70, 0x53, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x6, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, - - /* U+5EAD "庭" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x40, 0x0, 0x0, 0xb4, 0x0, 0x9, 0x10, - 0x0, 0xe6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x30, - 0x0, 0xe0, 0x0, 0x40, 0x0, 0x2, 0x7a, 0x0, - 0x0, 0xe3, 0x78, 0xf3, 0x35, 0x8d, 0x52, 0x0, - 0x0, 0xe0, 0xb, 0x40, 0x0, 0x2b, 0x0, 0x0, - 0x0, 0xd0, 0x78, 0x0, 0x0, 0x2b, 0x2, 0x0, - 0x0, 0xd3, 0xe6, 0xb8, 0x57, 0x7d, 0x6a, 0x60, - 0x0, 0xc0, 0x0, 0xc2, 0x0, 0x2b, 0x0, 0x0, - 0x0, 0xc0, 0x61, 0xc0, 0x0, 0x2b, 0x0, 0x0, - 0x2, 0x90, 0x5c, 0x61, 0x66, 0x7d, 0x67, 0xb0, - 0x6, 0x30, 0x4e, 0x80, 0x10, 0x0, 0x0, 0x0, - 0x7, 0x2, 0xb1, 0x6c, 0x84, 0x21, 0x11, 0x21, - 0x23, 0x57, 0x0, 0x0, 0x59, 0xce, 0xff, 0xa1, - 0x11, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5EB7 "康" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xb4, 0x0, 0x0, 0x0, - 0x0, 0x12, 0x0, 0x0, 0x47, 0x0, 0x8, 0x50, - 0x0, 0x3d, 0x66, 0x66, 0xa6, 0x66, 0x66, 0x50, - 0x0, 0x2b, 0x0, 0x0, 0xb3, 0x0, 0x40, 0x0, - 0x0, 0x2b, 0x18, 0x66, 0xc7, 0x66, 0xe0, 0x0, - 0x0, 0x3a, 0x0, 0x0, 0xa2, 0x0, 0xc4, 0x60, - 0x0, 0x3b, 0x76, 0x66, 0xc7, 0x66, 0xd6, 0x50, - 0x0, 0x49, 0x16, 0x66, 0xc7, 0x66, 0xc0, 0x0, - 0x0, 0x57, 0x3, 0x0, 0xa7, 0x0, 0x56, 0x0, - 0x0, 0x75, 0x8, 0x90, 0xa4, 0x50, 0x88, 0x10, - 0x0, 0xa1, 0x0, 0x96, 0xc2, 0x97, 0x20, 0x0, - 0x0, 0xa0, 0x6, 0x91, 0xa2, 0x1c, 0x20, 0x0, - 0x5, 0x35, 0xe5, 0x11, 0xc2, 0x2, 0xea, 0x50, - 0x7, 0x0, 0x30, 0x2b, 0xd0, 0x0, 0x19, 0x30, - 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5EE0 "廠" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x3, 0x90, 0x0, 0x29, 0x0, - 0x0, 0x98, 0x66, 0x66, 0x66, 0x66, 0x67, 0x30, - 0x0, 0x94, 0x0, 0x52, 0x10, 0x55, 0x0, 0x0, - 0x0, 0x93, 0x83, 0x50, 0xc3, 0x95, 0x0, 0x0, - 0x0, 0x93, 0x1a, 0x53, 0x40, 0xb3, 0x39, 0x10, - 0x0, 0xa2, 0x86, 0x97, 0xa5, 0xa2, 0x68, 0x10, - 0x0, 0xa1, 0xc0, 0x0, 0xa7, 0x70, 0x74, 0x0, - 0x0, 0xb0, 0xc2, 0xac, 0xa5, 0x52, 0x92, 0x0, - 0x0, 0xb0, 0xc2, 0x9b, 0xa2, 0x27, 0xb0, 0x0, - 0x0, 0x90, 0xc2, 0xbb, 0xa2, 0xc, 0x70, 0x0, - 0x5, 0x40, 0xc1, 0x44, 0xa2, 0x1c, 0xa0, 0x0, - 0x7, 0x0, 0xc0, 0x4, 0xc1, 0x91, 0x8a, 0x0, - 0x13, 0x0, 0x90, 0x4, 0x96, 0x10, 0x9, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - - /* U+5EFA "建" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x31, 0x0, 0xd, 0x0, 0x20, 0x0, - 0x5, 0x66, 0xe4, 0x36, 0x6e, 0x66, 0xe3, 0x0, - 0x0, 0x5, 0x80, 0x0, 0xd, 0x0, 0xd3, 0x20, - 0x0, 0xc, 0x3, 0x66, 0x6e, 0x66, 0xe6, 0x60, - 0x0, 0x75, 0x0, 0x0, 0xd, 0x0, 0xd0, 0x0, - 0x3, 0xd6, 0x7a, 0x46, 0x6e, 0x66, 0xa0, 0x0, - 0x0, 0x10, 0x66, 0x0, 0xd, 0x0, 0x30, 0x0, - 0x0, 0x20, 0x93, 0x46, 0x6e, 0x66, 0x70, 0x0, - 0x0, 0x60, 0xc0, 0x0, 0xd, 0x0, 0x6, 0x0, - 0x0, 0x38, 0xa4, 0x66, 0x6e, 0x66, 0x68, 0x20, - 0x0, 0xb, 0x80, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x56, 0x7c, 0x63, 0x9, 0x0, 0x0, 0x21, - 0x5, 0x40, 0x1, 0x7b, 0xde, 0xee, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5EFF "廿" */ - 0x0, 0x0, 0x9, 0x10, 0x0, 0x81, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x6, 0x30, - 0x6, 0x66, 0x6e, 0x66, 0x66, 0xe6, 0x67, 0x70, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - - /* U+5F0F "式" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0x23, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0x6c, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0xa4, 0x0, 0x17, 0x66, - 0x66, 0x66, 0xf6, 0x66, 0xda, 0x0, 0x10, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc2, 0x0, 0x0, 0x0, 0x56, 0x66, 0x6e, - 0x4a, 0x40, 0x0, 0x0, 0x1, 0x2, 0xb0, 0x0, - 0x77, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x4, - 0xb0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0xe, - 0x10, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x11, 0x88, - 0x0, 0x60, 0x0, 0x3, 0xd8, 0x64, 0x1, 0xe4, - 0x8, 0x5, 0xbd, 0x94, 0x0, 0x0, 0x4, 0xe7, - 0xb0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, - - /* U+5F15 "引" */ - 0x0, 0x0, 0x0, 0x20, 0x0, 0x91, 0x37, 0x66, - 0x68, 0xd0, 0x0, 0xe0, 0x0, 0x0, 0x3, 0xa0, - 0x0, 0xe0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0xe0, - 0xc, 0x66, 0x68, 0xb0, 0x0, 0xe0, 0xd, 0x0, - 0x1, 0x30, 0x0, 0xe0, 0x3a, 0x0, 0x0, 0x0, - 0x0, 0xe0, 0xaa, 0x66, 0x66, 0xb3, 0x0, 0xe0, - 0x21, 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, - 0x2, 0xb0, 0x0, 0xe0, 0x0, 0x0, 0x6, 0x80, - 0x0, 0xe0, 0x0, 0x0, 0xa, 0x40, 0x0, 0xe0, - 0x0, 0x45, 0x6e, 0x0, 0x0, 0xe0, 0x0, 0x7, - 0xe4, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x40, - - /* U+5F1F "弟" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x50, 0x0, 0x9, 0x50, 0x0, 0x0, 0x0, - 0xb7, 0x0, 0x1c, 0x10, 0x0, 0x0, 0x0, 0x26, - 0x0, 0x61, 0x3, 0x0, 0x2, 0x76, 0x66, 0x7b, - 0x66, 0x6d, 0x50, 0x0, 0x0, 0x0, 0x2b, 0x0, - 0xc, 0x20, 0x0, 0x41, 0x0, 0x2b, 0x0, 0xc, - 0x20, 0x0, 0xa9, 0x66, 0x7d, 0x66, 0x6c, 0x10, - 0x0, 0xe0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x6, - 0xd6, 0x66, 0xad, 0x66, 0x66, 0xc4, 0x0, 0x10, - 0x8, 0xbb, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x5b, - 0x2b, 0x0, 0x0, 0xe0, 0x0, 0x5, 0x90, 0x2b, - 0x0, 0x2, 0xc0, 0x0, 0x76, 0x0, 0x2b, 0x4, - 0xbd, 0x70, 0x36, 0x10, 0x0, 0x3c, 0x0, 0x26, - 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, - - /* U+5F31 "弱" */ - 0x0, 0x0, 0x0, 0x60, 0x23, 0x33, 0x39, 0x0, - 0x17, 0x66, 0x6e, 0x13, 0x43, 0x33, 0xd0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x6, - 0x66, 0x6e, 0x0, 0xb5, 0x55, 0xd0, 0x0, 0xa2, - 0x0, 0x70, 0x2b, 0x0, 0x4, 0x0, 0xc, 0x0, - 0x0, 0x5, 0x80, 0x0, 0x0, 0x2, 0xe6, 0x66, - 0xd2, 0xa9, 0x66, 0x6c, 0x50, 0x3, 0x0, 0xe, - 0x1, 0x30, 0x0, 0xb2, 0x0, 0xc, 0x20, 0xd0, - 0x3, 0xc0, 0xb, 0x20, 0x0, 0x65, 0xd, 0x0, - 0xa, 0x20, 0xb2, 0x0, 0x0, 0x65, 0xd0, 0x0, - 0x27, 0x4c, 0x20, 0x39, 0x91, 0x1b, 0x5, 0xb7, - 0x0, 0xd1, 0xb, 0x50, 0x4, 0x90, 0xa2, 0x10, - 0xe, 0x0, 0x0, 0x4b, 0xe3, 0x0, 0x1, 0x9f, - 0x90, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x40, - 0x0, - - /* U+5F35 "張" */ - 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x28, 0x0, - 0x4, 0x66, 0x6e, 0x1a, 0x76, 0x66, 0x66, 0x10, - 0x0, 0x0, 0xd, 0xa, 0x30, 0x0, 0x52, 0x0, - 0x0, 0x0, 0xd, 0xa, 0x76, 0x66, 0x64, 0x0, - 0x5, 0x86, 0x6e, 0xa, 0x30, 0x0, 0x34, 0x0, - 0x7, 0x60, 0x4, 0xa, 0x76, 0x66, 0x65, 0x0, - 0x8, 0x40, 0x0, 0xa, 0x30, 0x0, 0x4, 0x20, - 0xc, 0x20, 0x5, 0x7d, 0x69, 0x66, 0x67, 0x60, - 0x8, 0x66, 0x6d, 0x3d, 0x4, 0x20, 0x9, 0x0, - 0x0, 0x0, 0xd, 0xd, 0x0, 0x81, 0xa6, 0x10, - 0x0, 0x0, 0xc, 0xd, 0x0, 0x78, 0x0, 0x0, - 0x0, 0x0, 0x39, 0xd, 0x0, 0xc, 0x20, 0x0, - 0x0, 0x20, 0x85, 0xd, 0x48, 0x14, 0xe5, 0x0, - 0x0, 0x5e, 0xe0, 0xe, 0xa0, 0x0, 0x5f, 0x90, - 0x0, 0x4, 0x10, 0x3, 0x0, 0x0, 0x1, 0x0, - - /* U+5F37 "強" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x0, 0x5, 0xc0, 0x0, 0x0, - 0x6, 0x66, 0x6e, 0x20, 0xc, 0x20, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x82, 0x0, 0x31, 0x0, - 0x0, 0x0, 0xd, 0x18, 0x20, 0x12, 0x3d, 0x60, - 0x6, 0x86, 0x6e, 0x2e, 0xb8, 0xa4, 0x22, 0xe0, - 0x8, 0x50, 0x3, 0x0, 0x0, 0xd1, 0x0, 0x10, - 0x9, 0x30, 0x0, 0x8, 0x66, 0xe6, 0x6a, 0x20, - 0xd, 0x10, 0x5, 0xd, 0x0, 0xd0, 0xd, 0x0, - 0x7, 0x66, 0x6d, 0x4d, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0x0, 0xd, 0xd, 0x66, 0xe6, 0x6e, 0x0, - 0x0, 0x0, 0x1d, 0x8, 0x0, 0xd0, 0x5, 0x0, - 0x0, 0x0, 0x5a, 0x0, 0x0, 0xd0, 0x7, 0x0, - 0x0, 0x42, 0xc4, 0x13, 0x45, 0xe7, 0x68, 0xb0, - 0x0, 0x2e, 0xa0, 0x1d, 0x95, 0x30, 0x0, 0xc0, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5F53 "当" */ - 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x2, - 0x30, 0x0, 0xb3, 0x0, 0x66, 0x0, 0x0, 0x99, - 0x0, 0xb2, 0x1, 0xe7, 0x0, 0x0, 0xd, 0x60, - 0xb2, 0x9, 0x40, 0x0, 0x0, 0x3, 0x20, 0xb2, - 0x42, 0x0, 0x0, 0x5, 0x66, 0x66, 0xd7, 0x66, - 0x66, 0xc2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x1, - 0x86, 0x66, 0x66, 0x66, 0x66, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xe0, 0x28, 0x66, 0x66, 0x66, 0x66, - 0x66, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x50, - - /* U+5F62 "形" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x13, 0x0, - 0x4, 0x68, 0x76, 0x68, 0xa8, 0x0, 0xab, 0x0, - 0x0, 0x9, 0x40, 0x2a, 0x0, 0x5, 0xa0, 0x0, - 0x0, 0x9, 0x40, 0x2a, 0x0, 0x29, 0x0, 0x0, - 0x0, 0x9, 0x40, 0x2a, 0x2, 0x50, 0x2, 0x0, - 0x0, 0x9, 0x40, 0x2a, 0x46, 0x0, 0x2e, 0x40, - 0x6, 0x6c, 0x86, 0x7c, 0x65, 0x1, 0xd6, 0x0, - 0x0, 0xb, 0x20, 0x2a, 0x0, 0x1b, 0x30, 0x0, - 0x0, 0xc, 0x10, 0x2a, 0x2, 0x81, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x2a, 0x3, 0x0, 0x7, 0xc0, - 0x0, 0x48, 0x0, 0x2a, 0x0, 0x0, 0x5d, 0x30, - 0x0, 0xa1, 0x0, 0x3a, 0x0, 0x6, 0xb1, 0x0, - 0x3, 0x60, 0x0, 0x3a, 0x0, 0x87, 0x0, 0x0, - 0x6, 0x0, 0x0, 0x25, 0x38, 0x20, 0x0, 0x0, - 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+5F71 "影" */ - 0x0, 0x30, 0x0, 0x3, 0x10, 0x0, 0x21, 0x0, - 0x0, 0xe6, 0x66, 0x6b, 0x60, 0x0, 0xb9, 0x0, - 0x0, 0xd6, 0x66, 0x6b, 0x30, 0x7, 0x80, 0x0, - 0x0, 0xd0, 0x0, 0x9, 0x30, 0x46, 0x0, 0x0, - 0x0, 0xd6, 0x88, 0x6b, 0x33, 0x40, 0x1, 0x0, - 0x1, 0x11, 0x1c, 0x11, 0x80, 0x0, 0x1e, 0x50, - 0x6, 0x65, 0x55, 0x57, 0x52, 0x0, 0xb6, 0x0, - 0x0, 0xd6, 0x66, 0x6d, 0x30, 0x9, 0x40, 0x0, - 0x0, 0xd1, 0x0, 0xb, 0x11, 0x82, 0x0, 0x10, - 0x0, 0xd6, 0x68, 0x6d, 0x23, 0x0, 0x7, 0xd0, - 0x0, 0x43, 0xd, 0x13, 0x0, 0x0, 0x5c, 0x20, - 0x0, 0x3d, 0x1d, 0x4b, 0x20, 0x6, 0xa0, 0x0, - 0x1, 0xa1, 0xc, 0x6, 0x80, 0x97, 0x0, 0x0, - 0x6, 0x3, 0xca, 0x0, 0x67, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x2, 0x10, 0x0, 0x0, 0x0, - - /* U+5F79 "役" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xe2, 0x3, 0x76, 0x6a, 0x0, 0x0, - 0x0, 0xb, 0x60, 0x3, 0x90, 0xd, 0x0, 0x0, - 0x0, 0x77, 0x0, 0x4, 0x90, 0xd, 0x0, 0x0, - 0x4, 0x60, 0x52, 0x6, 0x60, 0xd, 0x0, 0x0, - 0x13, 0x1, 0xe6, 0xb, 0x10, 0xe, 0x21, 0x30, - 0x0, 0xa, 0x60, 0x83, 0x0, 0x5, 0x88, 0x80, - 0x0, 0x5f, 0x15, 0x25, 0x66, 0x66, 0xb0, 0x0, - 0x3, 0x8c, 0x10, 0x1, 0x40, 0x6, 0x90, 0x0, - 0x26, 0xc, 0x10, 0x0, 0x70, 0xc, 0x20, 0x0, - 0x10, 0xc, 0x10, 0x0, 0x53, 0x4a, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0xa, 0xc1, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0xc, 0xc0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x3, 0xb3, 0x4d, 0x60, 0x0, - 0x0, 0xc, 0x12, 0x76, 0x0, 0x2, 0xbf, 0x80, - 0x0, 0x4, 0x12, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+5F7C "彼" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x85, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, - 0x1e, 0x20, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x8, - 0x50, 0x7, 0x66, 0x6d, 0x66, 0xa7, 0x2, 0x70, - 0x91, 0x84, 0x0, 0xc0, 0xb, 0x30, 0x60, 0x3d, - 0x18, 0x40, 0xc, 0x3, 0x10, 0x0, 0xc, 0x40, - 0x84, 0x0, 0xc0, 0x0, 0x0, 0x5, 0xf0, 0x8, - 0x86, 0x6c, 0x69, 0x80, 0x1, 0xad, 0x0, 0x93, - 0x60, 0x0, 0xa3, 0x0, 0x70, 0xd0, 0xa, 0x22, - 0x60, 0x1c, 0x0, 0x10, 0xd, 0x0, 0xc0, 0xa, - 0x8, 0x40, 0x0, 0x0, 0xd0, 0xb, 0x0, 0x49, - 0xa0, 0x0, 0x0, 0xd, 0x4, 0x60, 0x2, 0xf5, - 0x0, 0x0, 0x0, 0xd0, 0x80, 0x6, 0x92, 0xc9, - 0x20, 0x0, 0xd, 0x33, 0x47, 0x20, 0x0, 0x9f, - 0x90, 0x0, 0x41, 0x20, 0x0, 0x0, 0x0, 0x10, - - /* U+5F80 "往" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0x10, 0x4, 0x20, 0x0, 0x0, 0x0, - 0x9, 0x80, 0x0, 0xc, 0x40, 0x0, 0x0, 0x4, - 0x90, 0x0, 0x0, 0x68, 0x0, 0x0, 0x1, 0x80, - 0x11, 0x66, 0x66, 0x66, 0x9c, 0x0, 0x50, 0xe, - 0x42, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xa0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0x2, 0xf1, 0x0, - 0x0, 0xe0, 0x0, 0x0, 0x0, 0xbe, 0x10, 0x0, - 0xe, 0x0, 0x52, 0x0, 0x73, 0xc1, 0x6, 0x76, - 0xe6, 0x66, 0x40, 0x32, 0xc, 0x10, 0x0, 0xe, - 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe0, - 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0xe, 0x0, - 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe0, 0x0, - 0x61, 0x0, 0xd, 0x28, 0x66, 0x68, 0x66, 0x68, - 0x60, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5F85 "待" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2c, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, - 0x9, 0x70, 0x0, 0xd, 0x0, 0x0, 0x0, 0x3, - 0xa0, 0x6, 0x66, 0xe6, 0x6c, 0x20, 0x0, 0x90, - 0x72, 0x0, 0xd, 0x0, 0x0, 0x0, 0x60, 0x1e, - 0x30, 0x0, 0xd0, 0x0, 0x10, 0x0, 0x9, 0x67, - 0x66, 0x6c, 0x66, 0x6b, 0x50, 0x3, 0xf1, 0x0, - 0x0, 0x0, 0x92, 0x0, 0x0, 0xad, 0x10, 0x0, - 0x0, 0xd, 0x7, 0x10, 0x71, 0xc1, 0x36, 0x66, - 0x66, 0xe6, 0x63, 0x10, 0xc, 0x10, 0x7, 0x30, - 0xd, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x1e, 0x10, - 0xd0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x70, 0xd, - 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0xd, 0x10, 0x0, 0x17, 0xbd, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x4, 0x20, 0x0, - - /* U+5F88 "很" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x59, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, - 0xc, 0x40, 0xd, 0x66, 0x66, 0xe3, 0x0, 0x5, - 0x70, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x1, 0x80, - 0x51, 0xd, 0x0, 0x0, 0xd0, 0x0, 0x50, 0xe, - 0x30, 0xd6, 0x66, 0x6e, 0x0, 0x0, 0x7, 0x70, - 0xd, 0x0, 0x0, 0xd0, 0x0, 0x1, 0xf0, 0x0, - 0xd6, 0x66, 0x6e, 0x0, 0x0, 0x9e, 0x0, 0xd, - 0x6, 0x0, 0x53, 0x0, 0x62, 0xd0, 0x0, 0xd0, - 0x70, 0x1c, 0x70, 0x22, 0xd, 0x0, 0xd, 0x2, - 0x87, 0x10, 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x9, - 0x20, 0x0, 0x0, 0xd, 0x0, 0xd, 0x0, 0x3c, - 0x40, 0x0, 0x0, 0xd0, 0x0, 0xe9, 0x70, 0x2e, - 0xa4, 0x0, 0xd, 0x0, 0xd, 0x30, 0x0, 0x8, - 0x30, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5F8B "律" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x30, 0x0, 0x1d, 0x10, 0x0, 0x0, - 0x0, 0x69, 0x0, 0x0, 0xd, 0x0, 0x10, 0x0, - 0x0, 0xb0, 0x0, 0x86, 0x6e, 0x66, 0xd4, 0x0, - 0x7, 0x12, 0xc1, 0x0, 0xd, 0x0, 0xc2, 0x10, - 0x1, 0x8, 0x96, 0x76, 0x6e, 0x66, 0xda, 0x90, - 0x0, 0x1e, 0x0, 0x0, 0xd, 0x0, 0xc1, 0x0, - 0x0, 0x9e, 0x0, 0x76, 0x6e, 0x66, 0xd1, 0x0, - 0x4, 0x6e, 0x0, 0x0, 0xd, 0x0, 0x20, 0x0, - 0x15, 0xe, 0x2, 0x76, 0x6e, 0x66, 0xb7, 0x0, - 0x0, 0xe, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x26, 0x66, 0x6e, 0x66, 0x6d, 0x60, - 0x0, 0xe, 0x1, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - - /* U+5F8C "後" */ - 0x0, 0x1, 0xb1, 0x0, 0xb, 0x30, 0x0, 0x0, - 0x0, 0x9, 0x90, 0x0, 0x79, 0x1, 0x50, 0x0, - 0x0, 0x49, 0x0, 0x7, 0x70, 0xc, 0xa0, 0x0, - 0x2, 0x80, 0x52, 0x8e, 0x76, 0xc5, 0x0, 0x0, - 0x15, 0x1, 0xe5, 0x11, 0x3a, 0x22, 0x40, 0x0, - 0x0, 0xa, 0x60, 0x7, 0x70, 0x0, 0x97, 0x0, - 0x0, 0x5f, 0x10, 0xdd, 0xc7, 0x65, 0x4e, 0x0, - 0x2, 0x9d, 0x10, 0x11, 0xe3, 0x0, 0x2, 0x0, - 0x26, 0xc, 0x10, 0x9, 0xa6, 0x66, 0xd1, 0x0, - 0x0, 0xc, 0x10, 0x47, 0x60, 0x8, 0x90, 0x0, - 0x0, 0xc, 0x12, 0x70, 0x44, 0x3c, 0x0, 0x0, - 0x0, 0xc, 0x13, 0x0, 0xa, 0xd2, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x4b, 0xa7, 0x10, 0x0, - 0x0, 0xd, 0x10, 0x49, 0x60, 0x6, 0xdc, 0x80, - 0x0, 0x6, 0x14, 0x20, 0x0, 0x0, 0x4, 0x10, - - /* U+5F92 "徒" */ - 0x0, 0x5, 0x80, 0x0, 0x9, 0x50, 0x0, 0x0, - 0x0, 0xc, 0x40, 0x0, 0xa, 0x30, 0x0, 0x0, - 0x0, 0x67, 0x0, 0x0, 0xa, 0x30, 0x36, 0x0, - 0x2, 0x90, 0x61, 0x66, 0x6c, 0x86, 0x65, 0x0, - 0x7, 0x2, 0xf3, 0x0, 0xa, 0x30, 0x0, 0x0, - 0x0, 0x9, 0x60, 0x0, 0xa, 0x30, 0x6, 0x30, - 0x0, 0x3f, 0x16, 0x66, 0x6c, 0x86, 0x66, 0x50, - 0x0, 0xad, 0x10, 0x32, 0xa, 0x50, 0x0, 0x0, - 0x7, 0x1c, 0x10, 0x79, 0xa, 0x30, 0x27, 0x0, - 0x21, 0xc, 0x10, 0x95, 0xa, 0x86, 0x66, 0x10, - 0x0, 0xc, 0x10, 0xc6, 0xa, 0x30, 0x0, 0x0, - 0x0, 0xc, 0x11, 0xa3, 0x6a, 0x30, 0x0, 0x0, - 0x0, 0xc, 0x18, 0x20, 0x3d, 0x83, 0x10, 0x10, - 0x0, 0xd, 0x44, 0x0, 0x0, 0x5a, 0xdf, 0x90, - 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5F93 "従" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xc3, 0x4, 0x0, 0x0, 0x38, 0x0, - 0x0, 0x8, 0xb1, 0x5, 0xb0, 0x0, 0x99, 0x0, - 0x0, 0x3a, 0x0, 0x0, 0xb7, 0x1, 0xa0, 0x0, - 0x1, 0xa0, 0x21, 0x0, 0x25, 0x6, 0x0, 0x0, - 0x6, 0x0, 0xba, 0x36, 0x66, 0x67, 0x6c, 0x80, - 0x0, 0x5, 0xb0, 0x1, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x1e, 0x20, 0x4, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0xae, 0x10, 0x1f, 0x20, 0xe0, 0x2, 0x0, - 0x7, 0x1c, 0x10, 0x1e, 0x0, 0xe6, 0x6a, 0x10, - 0x20, 0xc, 0x10, 0x2c, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x5c, 0x20, 0xe0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0xa1, 0x93, 0xe0, 0x0, 0x0, - 0x0, 0xd, 0x12, 0x70, 0xa, 0xe3, 0x0, 0x0, - 0x0, 0xd, 0x16, 0x0, 0x0, 0x5c, 0xec, 0xa1, - 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, 0x25, 0x20, - - /* U+5F97 "得" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa5, 0x3, 0x0, 0x0, 0x22, 0x0, - 0x0, 0x5, 0xd2, 0xe, 0x66, 0x66, 0xa9, 0x0, - 0x0, 0x3b, 0x0, 0xd, 0x0, 0x0, 0x76, 0x0, - 0x3, 0x80, 0x1a, 0x1d, 0x66, 0x66, 0xa6, 0x0, - 0x4, 0x0, 0x8c, 0x1d, 0x0, 0x0, 0x77, 0x0, - 0x0, 0x3, 0xd1, 0xe, 0x66, 0x66, 0xa7, 0x0, - 0x0, 0x1e, 0x20, 0x4, 0x0, 0x0, 0x25, 0x10, - 0x0, 0xae, 0x10, 0x76, 0x66, 0x67, 0xc6, 0x40, - 0x7, 0x1c, 0x10, 0x0, 0x0, 0x3, 0xa0, 0x50, - 0x10, 0xc, 0x16, 0x77, 0x66, 0x68, 0xc6, 0x71, - 0x0, 0xc, 0x10, 0x8, 0x40, 0x3, 0xa0, 0x0, - 0x0, 0xc, 0x10, 0x1, 0xe0, 0x3, 0xa0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x40, 0x3, 0xa0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x2, 0x9d, 0x80, 0x0, - 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, - - /* U+5F9E "從" */ - 0x0, 0x0, 0xa1, 0x5, 0x50, 0x1, 0x70, 0x0, - 0x0, 0x7, 0xc1, 0x9, 0x80, 0x3, 0xe1, 0x0, - 0x0, 0x2b, 0x0, 0xc, 0x20, 0x8, 0x60, 0x0, - 0x0, 0x90, 0x11, 0x1c, 0xa5, 0xc, 0x75, 0x0, - 0x5, 0x0, 0x9b, 0x64, 0x1e, 0x46, 0xc, 0x50, - 0x0, 0x3, 0xc1, 0x70, 0x1, 0x60, 0x2, 0x30, - 0x0, 0xd, 0x23, 0x0, 0x1, 0x60, 0x0, 0x0, - 0x0, 0xae, 0x10, 0x6, 0x10, 0xe0, 0x0, 0x0, - 0x7, 0x1d, 0x10, 0xf, 0x10, 0xd0, 0x24, 0x0, - 0x10, 0xd, 0x10, 0xd, 0x0, 0xe6, 0x65, 0x0, - 0x0, 0xd, 0x10, 0x2b, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x69, 0x81, 0xd0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0xa0, 0x1a, 0xe3, 0x0, 0x0, - 0x0, 0xd, 0x16, 0x20, 0x0, 0x4b, 0xec, 0xa2, - 0x0, 0x5, 0x11, 0x0, 0x0, 0x0, 0x14, 0x30, - - /* U+5FA1 "御" */ - 0x0, 0x2, 0xa0, 0xc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x70, 0x3a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x58, 0x0, 0x78, 0x6b, 0x5b, 0x66, 0xd0, - 0x3, 0x70, 0x51, 0x81, 0xa0, 0xd, 0x1, 0xa0, - 0x4, 0x1, 0xe6, 0x41, 0xa0, 0xd, 0x1, 0xa0, - 0x0, 0x9, 0x61, 0x1, 0xa3, 0x4d, 0x1, 0xa0, - 0x0, 0x4e, 0x4, 0x66, 0xc6, 0x5d, 0x1, 0xa0, - 0x1, 0x8d, 0x1, 0x51, 0xa0, 0xd, 0x1, 0xa0, - 0x6, 0xd, 0x1, 0xb1, 0xc8, 0x6d, 0x1, 0xa0, - 0x0, 0xd, 0x1, 0xa1, 0xa0, 0xd, 0x1, 0xa0, - 0x0, 0xd, 0x1, 0xa1, 0xa0, 0xd, 0x1, 0xa0, - 0x0, 0xd, 0x1, 0xa4, 0xc5, 0x3d, 0x2b, 0x70, - 0x0, 0xd, 0xa, 0xd6, 0x0, 0xd, 0x1, 0x0, - 0x0, 0xd, 0x2, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, - - /* U+5FA9 "復" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xb1, 0x6, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x90, 0xd, 0x30, 0x0, 0x6, 0x10, - 0x0, 0x49, 0x0, 0x59, 0x66, 0x66, 0x66, 0x40, - 0x3, 0x90, 0x1, 0x77, 0x66, 0x66, 0x6a, 0x10, - 0x16, 0x0, 0xc5, 0xc, 0x10, 0x0, 0xd, 0x0, - 0x0, 0x6, 0xb0, 0xb, 0x66, 0x66, 0x6d, 0x0, - 0x0, 0x1f, 0x10, 0xb, 0x10, 0x0, 0xd, 0x0, - 0x0, 0xae, 0x0, 0xc, 0x9a, 0x66, 0x6c, 0x0, - 0x7, 0x2d, 0x0, 0x0, 0xb2, 0x0, 0x12, 0x0, - 0x10, 0xd, 0x0, 0x7, 0xb6, 0x66, 0xcb, 0x0, - 0x0, 0xd, 0x0, 0x45, 0x16, 0x5, 0xc0, 0x0, - 0x0, 0xd, 0x3, 0x30, 0x5, 0xac, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x8, 0xcb, 0x20, 0x0, - 0x0, 0xd, 0x0, 0x16, 0x72, 0x4, 0xeb, 0x80, - 0x0, 0x4, 0x2, 0x30, 0x0, 0x0, 0x5, 0x20, - - /* U+5FC3 "心" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x60, 0xc, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xe, 0x30, 0x43, 0x0, 0x0, 0x0, 0x0, 0x20, - 0xe1, 0x0, 0x0, 0x4, 0x0, 0x0, 0x35, 0xe, - 0x10, 0x0, 0x0, 0x58, 0x0, 0x8, 0x50, 0xe1, - 0x0, 0x0, 0x0, 0xd6, 0x2, 0xf3, 0xe, 0x10, - 0x0, 0x2, 0x8, 0xc0, 0xac, 0x0, 0xe1, 0x0, - 0x0, 0x60, 0x37, 0x0, 0x0, 0xe, 0x10, 0x0, - 0x8, 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, - 0xc4, 0x0, 0x0, 0x0, 0x9, 0xdb, 0xbb, 0xcf, - 0x70, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x0, - 0x0, - - /* U+5FC5 "必" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x90, 0x0, 0xc6, 0x0, 0x0, - 0x0, 0x3, 0x9, 0x90, 0x1e, 0x0, 0x0, 0x0, - 0x0, 0xf1, 0x1b, 0x7, 0x80, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x4, 0x0, - 0xd0, 0x0, 0x69, 0x5, 0x0, 0x0, 0x71, 0xd, - 0x0, 0xd, 0x10, 0x39, 0x0, 0xc, 0x0, 0xd0, - 0x8, 0x70, 0x0, 0xc5, 0x6, 0xe0, 0xd, 0x3, - 0xc0, 0x0, 0x6, 0xa0, 0x33, 0x0, 0xd1, 0xc2, - 0x0, 0x50, 0x12, 0x0, 0x0, 0xe, 0xb3, 0x0, - 0x6, 0x10, 0x0, 0x0, 0x4, 0xf2, 0x0, 0x0, - 0x97, 0x0, 0x0, 0x58, 0x5b, 0xee, 0xee, 0xee, - 0x60, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5FD8 "忘" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x90, 0x0, 0x3, 0x0, 0x66, - 0x66, 0x66, 0x9a, 0x66, 0x68, 0xe5, 0x1, 0x0, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, - 0x0, 0x0, 0x9, 0x10, 0x0, 0x1, 0xc6, 0x67, - 0x66, 0x66, 0x63, 0x0, 0x0, 0x0, 0x0, 0x88, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, 0xd5, - 0x0, 0x40, 0x0, 0x6, 0x14, 0x90, 0x5, 0x20, - 0x13, 0xc2, 0x0, 0xd0, 0x49, 0x0, 0x0, 0x6, - 0x8, 0xb0, 0x9c, 0x4, 0xa0, 0x0, 0x0, 0xc0, - 0x16, 0x0, 0x0, 0x1d, 0xcc, 0xcc, 0xdc, 0x10, - 0x0, - - /* U+5FD9 "忙" */ - 0x0, 0xa, 0x10, 0x0, 0x14, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0x20, 0x4, 0x70, - 0x1, 0xe, 0xa8, 0x6e, 0x66, 0x66, 0x66, 0x61, - 0x6, 0x2e, 0x4b, 0xe, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x3e, 0x2, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x6, 0x10, - 0x0, 0xe, 0x0, 0x2a, 0x66, 0x66, 0x67, 0x50, - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5FEB "快" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x20, 0x0, 0x2c, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x1c, 0x0, 0x51, 0x0, - 0x0, 0xe, 0x40, 0x66, 0x6d, 0x66, 0xd5, 0x0, - 0x2, 0x2e, 0x6b, 0x0, 0x1c, 0x0, 0xc1, 0x0, - 0x7, 0x4e, 0xc, 0x0, 0x1b, 0x0, 0xc1, 0x0, - 0xe, 0x2e, 0x0, 0x0, 0x2b, 0x0, 0xc1, 0x0, - 0x2, 0xe, 0x5, 0x66, 0x8c, 0x66, 0xdb, 0xc1, - 0x0, 0xe, 0x1, 0x0, 0x77, 0x50, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0xb2, 0x70, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x3, 0xb0, 0x37, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xb, 0x20, 0xb, 0x40, 0x0, - 0x0, 0xe, 0x0, 0x94, 0x0, 0x2, 0xe7, 0x0, - 0x0, 0xf, 0x7, 0x30, 0x0, 0x0, 0x4f, 0xb1, - 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+5FF5 "念" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5e, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xd2, 0x9, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x3c, 0x38, 0x0, 0xa6, 0x0, 0x0, - 0x0, 0x4, 0xb1, 0x7, 0x90, 0x7, 0xe9, 0x51, - 0x0, 0x76, 0x0, 0x2, 0x50, 0x1, 0x2a, 0x91, - 0x5, 0x10, 0x66, 0x66, 0x66, 0xbc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x42, 0xb, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x2d, 0x34, 0x0, 0x10, 0x0, - 0x0, 0x7, 0xd, 0x8, 0x60, 0x1, 0x48, 0x0, - 0x0, 0x87, 0xd, 0x0, 0x0, 0x7, 0xc, 0x70, - 0x2, 0xc1, 0xe, 0x0, 0x0, 0xc, 0x14, 0x50, - 0x0, 0x0, 0xc, 0xdc, 0xcc, 0xdd, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+600E "怎" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xb0, 0x0, 0x0, 0x1, 0x20, 0x0, 0xc, 0x79, - 0x66, 0x66, 0x69, 0xa0, 0x0, 0x75, 0xe, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x70, 0xe, 0x66, 0x66, - 0xc7, 0x0, 0x16, 0x0, 0xe, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0xe, 0x0, 0x0, 0xa, 0x10, - 0x0, 0x0, 0xe, 0x66, 0x66, 0x67, 0x30, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x62, 0x47, 0x0, 0x1, 0x0, 0x2, 0x40, 0xe0, - 0xc, 0x40, 0x4, 0x90, 0x9, 0x20, 0xd0, 0x3, - 0x0, 0x50, 0x9a, 0x5e, 0x0, 0xe0, 0x0, 0x0, - 0x91, 0x19, 0x22, 0x0, 0xcc, 0xcc, 0xcc, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6012 "怒" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x1, 0x76, 0x66, 0x8b, 0x0, - 0x6, 0x69, 0xa6, 0xa9, 0x13, 0x0, 0x96, 0x0, - 0x0, 0xa, 0x10, 0xb2, 0x7, 0x2, 0xd0, 0x0, - 0x0, 0x1b, 0x2, 0xb0, 0x2, 0x9c, 0x30, 0x0, - 0x0, 0x4, 0x8e, 0x80, 0x0, 0xbc, 0x0, 0x0, - 0x0, 0x0, 0xa5, 0xb6, 0x1b, 0x45, 0xd5, 0x0, - 0x0, 0x58, 0x10, 0x18, 0x71, 0x0, 0x2c, 0xc1, - 0x4, 0x10, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x9, 0x13, 0xc1, 0x0, 0x50, 0x0, - 0x0, 0x16, 0xe, 0x0, 0xa6, 0x0, 0x6b, 0x10, - 0x0, 0xa5, 0xe, 0x0, 0x10, 0x5, 0xb, 0x70, - 0x2, 0xb0, 0xe, 0x0, 0x0, 0xb, 0x2, 0x10, - 0x0, 0x0, 0xa, 0xdd, 0xdd, 0xdb, 0x10, 0x0, - - /* U+6015 "怕" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x95, 0x0, 0x0, 0x3c, 0x10, 0x0, 0x0, - 0xa, 0x30, 0x0, 0x5, 0x70, 0x0, 0x0, 0x0, - 0xa3, 0x0, 0x0, 0x80, 0x0, 0x20, 0x0, 0xa, - 0x70, 0xd, 0x67, 0x66, 0x6f, 0x10, 0x14, 0xa8, - 0xa0, 0xd0, 0x0, 0x0, 0xe0, 0x5, 0x6a, 0x3a, - 0xd, 0x0, 0x0, 0xe, 0x0, 0xc5, 0xa3, 0x0, - 0xd0, 0x0, 0x0, 0xe0, 0x5, 0xa, 0x30, 0xe, - 0x66, 0x66, 0x6e, 0x0, 0x0, 0xa3, 0x0, 0xd0, - 0x0, 0x0, 0xe0, 0x0, 0xa, 0x30, 0xd, 0x0, - 0x0, 0xe, 0x0, 0x0, 0xa3, 0x0, 0xd0, 0x0, - 0x0, 0xe0, 0x0, 0xa, 0x30, 0xd, 0x0, 0x0, - 0xe, 0x0, 0x0, 0xa3, 0x0, 0xe6, 0x66, 0x66, - 0xe0, 0x0, 0xb, 0x40, 0xd, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x40, 0x0, 0x30, 0x0, 0x0, 0x10, - - /* U+601D "思" */ - 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, - 0x0, 0xd6, 0x66, 0xd7, 0x66, 0x8c, 0x0, 0x0, - 0xc, 0x10, 0xb, 0x20, 0x3, 0xa0, 0x0, 0x0, - 0xc1, 0x0, 0xb2, 0x0, 0x3a, 0x0, 0x0, 0xc, - 0x66, 0x6d, 0x76, 0x68, 0xa0, 0x0, 0x0, 0xc1, - 0x0, 0xb2, 0x0, 0x3a, 0x0, 0x0, 0xd, 0x10, - 0xb, 0x20, 0x3, 0xa0, 0x0, 0x0, 0xd6, 0x66, - 0x86, 0x66, 0x8b, 0x0, 0x0, 0x5, 0x0, 0x47, - 0x0, 0x1, 0x10, 0x0, 0x3, 0x5, 0x80, 0x9a, - 0x0, 0x4, 0x0, 0x0, 0x90, 0x57, 0x0, 0x70, - 0x4, 0x2c, 0x30, 0x3e, 0x5, 0x70, 0x0, 0x0, - 0x80, 0x7c, 0x9, 0x70, 0x58, 0x0, 0x0, 0xd, - 0x30, 0x50, 0x0, 0x2, 0xdd, 0xdd, 0xdd, 0xd3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+6025 "急" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd9, 0x66, 0x6c, 0x20, 0x0, 0x0, 0x0, - 0x94, 0x0, 0x5, 0xb2, 0x0, 0x0, 0x0, 0x74, - 0x0, 0x1, 0x80, 0x3, 0x20, 0x0, 0x65, 0x76, - 0x66, 0x66, 0x66, 0xb9, 0x0, 0x31, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x50, 0x0, 0x0, 0x57, 0x66, - 0x66, 0x66, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x60, 0x0, 0x4, 0x76, 0x66, 0x66, - 0x66, 0xb6, 0x0, 0x0, 0x0, 0x50, 0x77, 0x0, - 0x4, 0x10, 0x0, 0x5, 0xe, 0x10, 0xb5, 0x3, - 0x49, 0x10, 0x4, 0x70, 0xd0, 0x1, 0x0, 0x60, - 0x7c, 0x2, 0xe2, 0xe, 0x0, 0x0, 0x1c, 0x0, - 0x70, 0x1, 0x0, 0xcd, 0xcc, 0xce, 0xc1, 0x0, - 0x0, - - /* U+6027 "性" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x20, 0x0, 0x0, 0xb2, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x4, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0xe, 0x40, 0xd0, 0x0, 0x0, - 0x0, 0xe, 0x81, 0x1d, 0x0, 0xd0, 0x3, 0x0, - 0x2, 0x3e, 0x4b, 0x5a, 0x66, 0xe6, 0x6b, 0x50, - 0x7, 0x4e, 0x2, 0xa1, 0x0, 0xd0, 0x0, 0x0, - 0xe, 0x2e, 0x0, 0x80, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xe, 0x4, 0x0, 0x0, 0xd0, 0x5, 0x0, - 0x0, 0xe, 0x0, 0x18, 0x66, 0xe6, 0x78, 0x10, - 0x0, 0xe, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0xd0, 0x4, 0x80, - 0x0, 0xf, 0x5, 0x76, 0x66, 0x66, 0x66, 0x61, - 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+606F "息" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x69, 0x86, 0x66, 0xb5, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0xf, 0x66, 0x66, - 0x66, 0xd3, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, - 0xb3, 0x0, 0x0, 0xf, 0x66, 0x66, 0x66, 0xd3, - 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xb3, 0x0, - 0x0, 0xf, 0x66, 0x66, 0x66, 0xd3, 0x0, 0x0, - 0xa, 0x0, 0x60, 0x0, 0x71, 0x0, 0x0, 0x0, - 0x60, 0x5d, 0x10, 0x0, 0x0, 0x0, 0x50, 0xe1, - 0xc, 0x10, 0x15, 0x70, 0x7, 0x50, 0xd0, 0x0, - 0x0, 0x70, 0xc7, 0x4f, 0x20, 0xd0, 0x0, 0x1, - 0xb0, 0x57, 0x12, 0x0, 0x9c, 0xcc, 0xcc, 0xa0, - 0x0, - - /* U+60A8 "您" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2d, 0x10, 0x78, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x80, 0xe, 0x30, 0x0, 0x1, 0x0, 0x1, - 0xe0, 0x5, 0xb6, 0x66, 0x68, 0xe2, 0x0, 0xae, - 0x1, 0x90, 0x6, 0x10, 0x94, 0x0, 0x65, 0xe0, - 0x60, 0x30, 0xd2, 0x2, 0x0, 0x14, 0xe, 0x0, - 0x4e, 0x2c, 0x16, 0x20, 0x0, 0x0, 0xe0, 0x1a, - 0x10, 0xc1, 0xc, 0x40, 0x0, 0xe, 0x7, 0x5, - 0x5e, 0x0, 0x3b, 0x0, 0x0, 0xd0, 0x0, 0x8, - 0xa0, 0x0, 0x10, 0x0, 0x0, 0x18, 0x19, 0x20, - 0x0, 0x10, 0x0, 0x2, 0x51, 0xd0, 0x3e, 0x0, - 0x26, 0x60, 0x0, 0xa4, 0x1d, 0x0, 0x50, 0x6, - 0xb, 0x70, 0x7e, 0x0, 0xd0, 0x0, 0x0, 0xd1, - 0x28, 0x0, 0x0, 0xb, 0xbb, 0xbb, 0xcb, 0x10, - 0x0, - - /* U+60AA "悪" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x50, 0x7, - 0x66, 0x6d, 0x66, 0xd6, 0x66, 0x60, 0x0, 0x10, - 0xe, 0x0, 0xe0, 0x3, 0x0, 0x0, 0xe6, 0x6e, - 0x66, 0xe6, 0x6f, 0x20, 0x0, 0xe0, 0xe, 0x0, - 0xe0, 0xe, 0x0, 0x0, 0xe6, 0x6e, 0x66, 0xe6, - 0x6e, 0x0, 0x0, 0x60, 0xe, 0x0, 0xe0, 0x5, - 0x10, 0x26, 0x66, 0x6e, 0x66, 0xe6, 0x68, 0xf5, - 0x2, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x90, 0x4c, 0x10, 0x3, 0x10, 0x1, 0x64, - 0xa0, 0x9, 0x60, 0x20, 0xb1, 0x9, 0x54, 0xa0, - 0x0, 0x0, 0x70, 0x6a, 0x7e, 0x13, 0xa0, 0x0, - 0x0, 0xc2, 0x6, 0x1, 0x1, 0xed, 0xdd, 0xdd, - 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+60B2 "悲" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0xb, 0x40, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xc1, 0x0, 0x61, 0x1, 0x66, - 0x66, 0xd0, 0xc, 0x66, 0x66, 0x30, 0x0, 0x0, - 0xd, 0x0, 0xc1, 0x2, 0x30, 0x0, 0x36, 0x66, - 0xd0, 0xc, 0x66, 0x66, 0x0, 0x0, 0x0, 0xd, - 0x0, 0xc1, 0x0, 0x10, 0x3, 0x66, 0x66, 0xd0, - 0xc, 0x66, 0x6a, 0x80, 0x0, 0x0, 0xd, 0x0, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x15, - 0x0, 0x0, 0x0, 0x0, 0x11, 0xb0, 0x1d, 0x20, - 0x5, 0x30, 0x0, 0x43, 0xd, 0x0, 0x86, 0x1, - 0xc, 0x50, 0xd, 0x20, 0xd0, 0x0, 0x0, 0x60, - 0x39, 0x6, 0xa0, 0xe, 0x0, 0x0, 0xa, 0x40, - 0x0, 0x0, 0x0, 0xdc, 0xcc, 0xcc, 0xd4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+60C5 "情" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0x20, 0x0, 0xc, 0x30, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xd, 0x10, 0x15, 0x0, - 0x0, 0xe, 0x0, 0x76, 0x6d, 0x66, 0x67, 0x10, - 0x2, 0xe, 0xb4, 0x0, 0xc, 0x10, 0x60, 0x0, - 0x7, 0x2d, 0x37, 0x17, 0x6d, 0x66, 0x63, 0x0, - 0xd, 0x2d, 0x0, 0x0, 0xc, 0x10, 0x5, 0x40, - 0x17, 0xd, 0x6, 0x66, 0x66, 0x66, 0x66, 0x50, - 0x0, 0xd, 0x0, 0x29, 0x66, 0x66, 0xd2, 0x0, - 0x0, 0xd, 0x0, 0x2b, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x1d, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x1d, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xe, 0x0, 0x2b, 0x0, 0x5a, 0xe0, 0x0, - 0x0, 0x5, 0x0, 0x14, 0x0, 0x4, 0x30, 0x0, - - /* U+60F3 "想" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xc6, 0x66, 0x6e, 0x10, - 0x0, 0x0, 0xd0, 0x70, 0xd0, 0x0, 0xd, 0x0, - 0x4, 0x66, 0xf6, 0x62, 0xd6, 0x66, 0x6d, 0x0, - 0x0, 0x6, 0xf6, 0x0, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0xc, 0xe5, 0xd0, 0xd6, 0x66, 0x6d, 0x0, - 0x0, 0x74, 0xd0, 0x90, 0xd0, 0x0, 0xd, 0x0, - 0x3, 0x60, 0xd0, 0x0, 0xd6, 0x66, 0x6d, 0x0, - 0x4, 0x0, 0xd0, 0x0, 0xc0, 0x0, 0xa, 0x0, - 0x0, 0x0, 0x22, 0x9, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xe, 0x20, 0xe4, 0x1, 0x33, 0x0, - 0x0, 0x46, 0xd, 0x0, 0x41, 0x5, 0xb, 0x60, - 0x1, 0xd4, 0xd, 0x0, 0x0, 0xb, 0x3, 0xa0, - 0x1, 0x50, 0xa, 0xcb, 0xbb, 0xbc, 0x10, 0x0, - - /* U+6108 "愈" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8b, 0x63, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x98, 0x0, 0x86, 0x0, 0x0, 0x0, 0x4, - 0x98, 0x66, 0x6b, 0xad, 0x83, 0x10, 0x46, 0x70, - 0x0, 0x40, 0x0, 0x4a, 0xe4, 0x0, 0xc, 0x66, - 0x6b, 0x7, 0xc, 0x20, 0x0, 0x0, 0xc5, 0x56, - 0x90, 0xb0, 0xc0, 0x0, 0x0, 0xc, 0x66, 0x69, - 0xb, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x2, 0x90, - 0x70, 0xc0, 0x0, 0x0, 0xc, 0x2, 0xb6, 0x0, - 0x8d, 0x0, 0x0, 0x0, 0x0, 0x91, 0x6a, 0x0, - 0x10, 0x0, 0x0, 0x14, 0xe, 0x0, 0xa2, 0x3, - 0x48, 0x0, 0xb, 0x40, 0xe0, 0x0, 0x2, 0x80, - 0x97, 0x2, 0x70, 0xc, 0xbb, 0xbb, 0xd9, 0x1, - 0x20, - - /* U+610F "意" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, - 0x16, 0x66, 0x6c, 0x76, 0x6e, 0x40, 0x0, 0x0, - 0x0, 0x82, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x80, 0x28, 0x0, 0x7, 0x0, 0x76, 0x66, - 0x66, 0x67, 0x66, 0x67, 0x93, 0x0, 0x7, 0x66, - 0x66, 0x66, 0x6a, 0x0, 0x0, 0x0, 0xb2, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x76, 0x66, - 0x66, 0x6d, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0xb, 0x76, 0x76, 0x66, - 0x6c, 0x0, 0x0, 0x1, 0x15, 0x32, 0xb3, 0x0, - 0x3, 0x0, 0x0, 0x80, 0x85, 0x4, 0x90, 0x30, - 0x6a, 0x0, 0x3c, 0x8, 0x40, 0x0, 0x7, 0x0, - 0xb6, 0x9, 0x40, 0x4d, 0xbb, 0xbb, 0xd4, 0x1, - 0x10, - - /* U+611A "愚" */ - 0x0, 0x86, 0x66, 0x66, 0x66, 0xb4, 0x0, 0x0, - 0xc0, 0x0, 0xd0, 0x0, 0xd2, 0x0, 0x0, 0xb6, - 0x66, 0xe6, 0x66, 0xe2, 0x0, 0x0, 0xc0, 0x0, - 0xd0, 0x0, 0xd2, 0x0, 0x0, 0xc6, 0x66, 0xe6, - 0x66, 0xe3, 0x0, 0x3, 0x30, 0x0, 0xd0, 0x0, - 0x20, 0x50, 0xd, 0x66, 0x66, 0xe6, 0x76, 0x67, - 0xc0, 0xc, 0x10, 0x0, 0xd0, 0x3b, 0x22, 0xa0, - 0xc, 0x1b, 0xc9, 0x86, 0x46, 0x92, 0xa0, 0xd, - 0x12, 0x5, 0x20, 0x0, 0x69, 0x90, 0x6, 0x6, - 0x21, 0xd4, 0x0, 0x9, 0x20, 0x6, 0xa, 0x40, - 0x44, 0x3, 0x8, 0x50, 0x2d, 0xa, 0x30, 0x0, - 0x6, 0x30, 0xd4, 0x65, 0x6, 0xdb, 0xbb, 0xbd, - 0x90, 0x41, - - /* U+611B "愛" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x47, 0xbc, 0x0, 0x1, 0x45, - 0x67, 0x97, 0x76, 0xb4, 0x10, 0x0, 0x9, 0x40, - 0x96, 0x6, 0x90, 0x0, 0x6, 0x68, 0xa6, 0x7b, - 0x6a, 0x66, 0xa3, 0x2d, 0x0, 0x30, 0x73, 0x0, - 0x1, 0xa3, 0x76, 0x70, 0xe0, 0x1e, 0x30, 0x46, - 0x40, 0x2, 0xc0, 0xd0, 0x3, 0x0, 0x90, 0xc7, - 0x6, 0x50, 0x9c, 0xcc, 0xcd, 0xa0, 0x26, 0x0, - 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xd6, 0x66, 0x6a, 0x10, 0x0, 0x0, 0x48, 0x35, - 0x0, 0x8c, 0x30, 0x0, 0x3, 0x50, 0x6, 0x89, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x5, 0xde, 0x61, - 0x0, 0x0, 0x0, 0x36, 0x85, 0x1, 0x8e, 0xdb, - 0x91, 0x14, 0x10, 0x0, 0x0, 0x0, 0x25, 0x20, - - /* U+611F "感" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0x66, 0x40, 0x0, - 0x0, 0x11, 0x0, 0x0, 0x7, 0x50, 0xa1, 0x50, - 0x0, 0x3c, 0x66, 0x66, 0x69, 0xa6, 0x67, 0x71, - 0x0, 0x3a, 0x0, 0x0, 0x53, 0x90, 0x6, 0x0, - 0x0, 0x3a, 0x56, 0x66, 0x63, 0xb0, 0x6c, 0x10, - 0x0, 0x48, 0x27, 0x66, 0x91, 0xe2, 0xd1, 0x0, - 0x0, 0x66, 0x3a, 0x0, 0xd0, 0x9e, 0x40, 0x0, - 0x0, 0x92, 0x2a, 0x0, 0xd0, 0x9e, 0x20, 0x50, - 0x0, 0x90, 0x3c, 0x66, 0xb7, 0x54, 0xd4, 0x80, - 0x6, 0x10, 0x0, 0x2, 0x42, 0x0, 0x3d, 0xf1, - 0x2, 0x2, 0x39, 0x5, 0xb1, 0x0, 0x81, 0x32, - 0x0, 0x54, 0x3a, 0x0, 0x93, 0x4, 0x3d, 0x0, - 0x3, 0xe1, 0x2a, 0x0, 0x0, 0x18, 0xa, 0x10, - 0x2, 0x40, 0x1d, 0xbb, 0xbb, 0xda, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+614B "態" */ - 0x0, 0x3a, 0x0, 0x1, 0x50, 0x0, 0x0, 0x0, - 0x1b, 0x31, 0x20, 0x2b, 0x0, 0x83, 0x0, 0x58, - 0x21, 0x1a, 0x52, 0xb5, 0x75, 0x40, 0x7, 0xa7, - 0x53, 0x39, 0x2a, 0x0, 0x6, 0x30, 0xb, 0x55, - 0x5d, 0x21, 0xba, 0xaa, 0xa3, 0x0, 0xd6, 0x66, - 0xd0, 0x3c, 0x0, 0x52, 0x0, 0xd, 0x0, 0xd, - 0x2, 0xa2, 0x9b, 0x50, 0x0, 0xd6, 0x66, 0xd0, - 0x2b, 0x30, 0x4, 0x0, 0xd, 0x0, 0xd, 0x2, - 0xc1, 0x11, 0x93, 0x0, 0xc0, 0x4b, 0xa2, 0x8, - 0xaa, 0xa8, 0x10, 0x1, 0x8, 0x60, 0x4b, 0x10, - 0x11, 0x60, 0x0, 0x71, 0xa2, 0x0, 0x76, 0x5, - 0x8, 0x90, 0x6d, 0xa, 0x30, 0x0, 0x0, 0xa0, - 0x1d, 0x4, 0x20, 0x6d, 0xcc, 0xcc, 0xdc, 0x10, - 0x0, - - /* U+6163 "慣" */ - 0x0, 0xa, 0x10, 0x8, 0x66, 0x66, 0x6a, 0x0, - 0x0, 0xd, 0x0, 0xe, 0x0, 0xd0, 0x1d, 0x0, - 0x0, 0xd, 0x15, 0x6e, 0x67, 0xd6, 0x7d, 0xc2, - 0x0, 0x4d, 0x81, 0x2b, 0x5, 0x80, 0x59, 0x0, - 0x4, 0x5d, 0x75, 0x6b, 0x6a, 0xa6, 0xa7, 0x0, - 0xb, 0x4d, 0x31, 0x12, 0x0, 0x0, 0x42, 0x0, - 0x6, 0xd, 0x0, 0xa6, 0x66, 0x66, 0x6b, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, - 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0x6c, 0x0, - 0x0, 0xd, 0x0, 0x2b, 0x90, 0x4, 0x94, 0x0, - 0x0, 0xe, 0x2, 0x93, 0x0, 0x0, 0x2e, 0x60, - 0x0, 0x3, 0x13, 0x0, 0x0, 0x0, 0x2, 0x30, - - /* U+6167 "慧" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x6, - 0x66, 0xd6, 0xa3, 0x6c, 0x76, 0xc4, 0x0, 0x10, - 0xc, 0x1, 0x0, 0xb2, 0x2, 0x0, 0x3, 0x76, - 0xd7, 0x52, 0x7c, 0x76, 0x80, 0x2, 0x66, 0x6d, - 0x6a, 0x36, 0xc7, 0x67, 0x90, 0x2, 0x0, 0xc0, - 0x0, 0x1b, 0x20, 0x0, 0x0, 0x6, 0x76, 0x66, - 0x66, 0x66, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x1, 0x86, 0x66, 0x66, - 0x66, 0xe0, 0x0, 0x0, 0x56, 0x66, 0x66, 0x66, - 0x6e, 0x0, 0x0, 0x1, 0x5, 0x7, 0x20, 0x0, - 0x50, 0x0, 0x0, 0x60, 0xd2, 0x1d, 0x2, 0x34, - 0x80, 0x0, 0x94, 0xd, 0x0, 0x20, 0x38, 0x7, - 0x90, 0x7, 0x0, 0x9c, 0xbb, 0xbd, 0x90, 0x3, - 0x0, - - /* U+616E "慮" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe6, 0x69, 0x80, 0x0, - 0x0, 0x14, 0x0, 0x0, 0xd0, 0x0, 0x5, 0x0, - 0x0, 0x1e, 0x66, 0x66, 0xc6, 0x67, 0x6e, 0x60, - 0x0, 0x1c, 0x13, 0x55, 0xd5, 0x77, 0x44, 0x0, - 0x0, 0x1c, 0x4, 0x0, 0xd2, 0x22, 0x39, 0x0, - 0x0, 0x1b, 0x1, 0x0, 0x57, 0x88, 0xb3, 0x0, - 0x0, 0x2b, 0xe, 0x66, 0x99, 0x66, 0xe1, 0x0, - 0x0, 0x2a, 0xd, 0x66, 0x99, 0x66, 0xd0, 0x0, - 0x0, 0x48, 0xd, 0x0, 0x66, 0x0, 0xd0, 0x0, - 0x0, 0x65, 0xe, 0x66, 0x77, 0x66, 0xc0, 0x0, - 0x0, 0x90, 0x13, 0x40, 0x5a, 0x20, 0x17, 0x0, - 0x0, 0x80, 0x90, 0xf1, 0x5, 0x51, 0x5, 0xc0, - 0x6, 0x1c, 0x80, 0xe0, 0x0, 0x6, 0x10, 0x50, - 0x5, 0x2, 0x0, 0xcc, 0xcc, 0xcd, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+61C9 "應" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7a, 0x0, 0x0, 0x10, 0x0, - 0x96, 0x66, 0x66, 0xc6, 0x66, 0x6e, 0x80, 0xb, - 0x40, 0x24, 0x36, 0x37, 0x0, 0x0, 0x0, 0xb3, - 0xa, 0xa9, 0x90, 0x81, 0x4, 0x0, 0xb, 0x35, - 0xd1, 0xe6, 0x6c, 0x66, 0x70, 0x0, 0xb6, 0x7c, - 0x6d, 0x66, 0xd6, 0x95, 0x0, 0xc, 0x21, 0xc2, - 0xd0, 0xc, 0x1, 0x0, 0x0, 0xd0, 0x1c, 0xd, - 0x66, 0xd6, 0x95, 0x0, 0xd, 0x1, 0xc0, 0xd0, - 0xc, 0x0, 0x71, 0x0, 0xd0, 0x1c, 0xd, 0x66, - 0x66, 0x66, 0x30, 0x2b, 0x0, 0x30, 0x30, 0x0, - 0x0, 0x0, 0x5, 0x70, 0x26, 0x32, 0xb4, 0x0, - 0x28, 0x0, 0x92, 0x27, 0x75, 0x3, 0xd0, 0x40, - 0x79, 0x8, 0x1d, 0x47, 0x40, 0x0, 0x8, 0x21, - 0x84, 0x21, 0x50, 0x3d, 0xcc, 0xcc, 0xd5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+61F8 "懸" */ - 0x0, 0x66, 0x66, 0xa2, 0x0, 0x25, 0x9b, 0x0, - 0x0, 0x92, 0x0, 0xc0, 0x45, 0x9c, 0x31, 0x0, - 0x0, 0x97, 0x66, 0xd0, 0x16, 0x71, 0x88, 0x0, - 0x0, 0x97, 0x55, 0xd0, 0x3b, 0x8d, 0x81, 0x0, - 0x0, 0x97, 0x66, 0xd0, 0x5, 0x82, 0x8, 0x10, - 0x0, 0x92, 0x0, 0xc4, 0x6f, 0xcd, 0x78, 0xa0, - 0x7, 0xa6, 0xc6, 0x88, 0x55, 0xd, 0x0, 0x30, - 0x0, 0xc4, 0xc3, 0x70, 0x2d, 0x2d, 0x9, 0x30, - 0x7, 0x44, 0xd0, 0x95, 0x91, 0xc, 0x2, 0xe0, - 0x0, 0x5, 0x70, 0x2, 0x3, 0xc9, 0x0, 0x40, - 0x0, 0x10, 0xa4, 0x8, 0x70, 0x0, 0x32, 0x0, - 0x0, 0x80, 0xa2, 0x0, 0xc5, 0x4, 0xb, 0x50, - 0x6, 0xb0, 0xa3, 0x0, 0x10, 0xb, 0x3, 0xb0, - 0x6, 0x20, 0x6d, 0xcc, 0xcc, 0xda, 0x0, 0x0, - - /* U+6210 "成" */ - 0x0, 0x0, 0x0, 0x0, 0xa3, 0x24, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe3, 0xa, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc3, 0x2, 0xb2, 0x0, - 0x0, 0x87, 0x66, 0x66, 0xd8, 0x66, 0x6d, 0x50, - 0x0, 0x96, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, - 0x0, 0x96, 0x0, 0x0, 0x77, 0x0, 0x63, 0x0, - 0x0, 0x95, 0x0, 0x41, 0x4a, 0x0, 0xd7, 0x0, - 0x0, 0x99, 0x66, 0xd6, 0x1d, 0x4, 0xd0, 0x0, - 0x0, 0xa3, 0x0, 0xc1, 0xd, 0x1b, 0x60, 0x0, - 0x0, 0xb2, 0x0, 0xc0, 0x8, 0xad, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0xd0, 0x2, 0xf5, 0x0, 0x40, - 0x1, 0xa0, 0x78, 0xc0, 0x9, 0xbd, 0x10, 0x70, - 0x6, 0x40, 0xb, 0x40, 0x94, 0x8, 0xe6, 0xa0, - 0x8, 0x0, 0x0, 0x17, 0x20, 0x0, 0x5d, 0xc0, - 0x20, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x30, - - /* U+6211 "我" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xa0, 0xd4, 0x0, 0x0, 0x0, - 0x2, 0x57, 0xd9, 0x61, 0xd1, 0x8, 0x60, 0x0, - 0x1, 0x0, 0xb2, 0x0, 0xd1, 0x0, 0xd7, 0x0, - 0x0, 0x0, 0xb2, 0x0, 0xc1, 0x0, 0x35, 0x0, - 0x16, 0x66, 0xd7, 0x66, 0xd7, 0x66, 0x7f, 0x30, - 0x2, 0x0, 0xb2, 0x0, 0xa3, 0x0, 0x10, 0x0, - 0x0, 0x0, 0xb2, 0x0, 0x85, 0x2, 0xe1, 0x0, - 0x0, 0x0, 0xb6, 0x63, 0x66, 0xb, 0x50, 0x0, - 0x1, 0x5a, 0xe5, 0x0, 0x49, 0x78, 0x0, 0x0, - 0x3f, 0x92, 0xb2, 0x0, 0xe, 0xb0, 0x0, 0x0, - 0x1, 0x0, 0xb2, 0x0, 0x5e, 0x70, 0x0, 0x40, - 0x0, 0x0, 0xb2, 0x8, 0x70, 0xc6, 0x0, 0x70, - 0x0, 0x43, 0xd5, 0x61, 0x0, 0x1c, 0xa4, 0x90, - 0x0, 0x1c, 0xc0, 0x0, 0x0, 0x0, 0x6d, 0xd0, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, - - /* U+6216 "或" */ - 0x0, 0x0, 0x0, 0x0, 0x18, 0x18, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0x1, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x18, 0x20, - 0x6, 0x66, 0x66, 0x66, 0x6f, 0x66, 0x66, 0x40, - 0x0, 0x0, 0x0, 0x10, 0xe, 0x0, 0x10, 0x0, - 0x0, 0xd6, 0x66, 0xe3, 0xd, 0x10, 0x99, 0x0, - 0x0, 0xd1, 0x0, 0xe0, 0xb, 0x30, 0xe3, 0x0, - 0x0, 0xc1, 0x0, 0xe0, 0x9, 0x53, 0xc0, 0x0, - 0x0, 0xd6, 0x66, 0xe0, 0x5, 0x9a, 0x50, 0x0, - 0x0, 0xc0, 0x0, 0x80, 0x0, 0xec, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x42, 0xe9, 0x0, 0x40, - 0x14, 0x68, 0xa9, 0x62, 0x2c, 0x4d, 0x50, 0x70, - 0x1e, 0x94, 0x0, 0x5, 0x91, 0x2, 0xe8, 0xa0, - 0x0, 0x0, 0x2, 0x63, 0x0, 0x0, 0x1a, 0xd0, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x10, - - /* U+6226 "戦" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x14, 0x60, 0x8, 0x10, 0x5b, 0x20, 0x0, 0xc, - 0x2c, 0x41, 0xb0, 0x4, 0xa4, 0x80, 0x0, 0x63, - 0x30, 0x52, 0x0, 0x4a, 0xd, 0x20, 0x1d, 0x66, - 0xa6, 0xe3, 0x4, 0xa0, 0x12, 0x0, 0xc0, 0x1b, - 0xd, 0x2, 0x6c, 0x55, 0x82, 0xd, 0x66, 0xc6, - 0xe3, 0x44, 0xa0, 0x33, 0x0, 0xc0, 0x1b, 0xd, - 0x0, 0x1b, 0xa, 0x90, 0x1c, 0x1, 0xb0, 0xd0, - 0x0, 0xd2, 0xd0, 0x1, 0xd6, 0x6c, 0x6d, 0x0, - 0xd, 0xa4, 0x0, 0x1, 0x1, 0xb0, 0x0, 0x0, - 0xba, 0x0, 0x5, 0x66, 0x6c, 0x67, 0xc1, 0x1d, - 0xb0, 0x4, 0x0, 0x1, 0xb0, 0x0, 0xc, 0x3c, - 0x53, 0x60, 0x0, 0x1b, 0x0, 0x1a, 0x30, 0x2e, - 0xb4, 0x0, 0x1, 0xb0, 0x38, 0x0, 0x0, 0x4f, - 0x60, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x24, - - /* U+6230 "戰" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x7, 0x69, 0x18, 0x69, 0x20, 0xc5, 0x20, 0x0, - 0xb, 0xc, 0xc, 0xb, 0x0, 0xc2, 0x68, 0x0, - 0xb, 0xc, 0xc, 0xb, 0x0, 0xc2, 0xc, 0x0, - 0xc, 0x6d, 0xd, 0x6c, 0x0, 0xc2, 0x1, 0x0, - 0x5, 0x1, 0x2, 0x5, 0x0, 0xc6, 0x6a, 0x60, - 0x8, 0x86, 0xd6, 0x6d, 0x46, 0xc3, 0x3, 0x0, - 0x7, 0x40, 0xc0, 0x1b, 0x0, 0xa3, 0x2e, 0x30, - 0x7, 0x86, 0xd6, 0x6b, 0x0, 0x85, 0x96, 0x0, - 0x7, 0x40, 0xc0, 0x1b, 0x0, 0x69, 0xd0, 0x0, - 0x8, 0x86, 0xd6, 0x66, 0x0, 0x3f, 0x40, 0x0, - 0x0, 0x0, 0xc0, 0x5, 0x10, 0x6f, 0x20, 0x30, - 0x8, 0x66, 0xd6, 0x66, 0x33, 0xa5, 0xc0, 0x80, - 0x0, 0x0, 0xc0, 0x0, 0x38, 0x0, 0xaa, 0xc0, - 0x0, 0x0, 0xd0, 0x4, 0x40, 0x0, 0xb, 0xd0, - 0x0, 0x0, 0x30, 0x10, 0x0, 0x0, 0x0, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+623B "戻" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x78, 0x66, 0x68, 0x66, 0x6d, 0x30, 0x0, 0x7, - 0x70, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x87, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x8, 0xa6, - 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, 0xa5, 0x0, - 0x7, 0x20, 0x7, 0x0, 0x0, 0xb, 0x30, 0x0, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x66, 0x6e, - 0x66, 0x6b, 0x90, 0x0, 0x2a, 0x1, 0x7, 0x76, - 0x0, 0x0, 0x0, 0x8, 0x40, 0x1, 0xd0, 0x27, - 0x0, 0x0, 0x0, 0xb0, 0x0, 0xb3, 0x0, 0x78, - 0x0, 0x0, 0x63, 0x0, 0x93, 0x0, 0x0, 0x9d, - 0x61, 0x6, 0x4, 0x71, 0x0, 0x0, 0x0, 0x6e, - 0x51, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+623F "房" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x0, 0x0, 0xa0, 0x0, 0x32, 0x0, 0x0, - 0xd6, 0x66, 0x66, 0x66, 0x6b, 0x80, 0x0, 0xd, - 0x10, 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0xd6, - 0x66, 0x66, 0x66, 0x6b, 0x50, 0x0, 0xd, 0x0, - 0x0, 0x84, 0x0, 0x20, 0x0, 0x0, 0xd0, 0x0, - 0x2, 0xc0, 0x0, 0x20, 0x0, 0xd, 0x26, 0x68, - 0x86, 0x66, 0x6a, 0x50, 0x2, 0xa0, 0x0, 0x87, - 0x0, 0x0, 0x0, 0x0, 0x57, 0x0, 0xb, 0x96, - 0x66, 0xb7, 0x0, 0x9, 0x10, 0x1, 0xe0, 0x0, - 0xb, 0x30, 0x0, 0x90, 0x0, 0x97, 0x0, 0x0, - 0xd1, 0x0, 0x62, 0x0, 0x6a, 0x0, 0x0, 0xe, - 0x0, 0x15, 0x0, 0x77, 0x0, 0x1, 0x7c, 0xa0, - 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x50, 0x0, - - /* U+6240 "所" */ - 0x0, 0x0, 0x2, 0xa2, 0x0, 0x0, 0x4b, 0x40, - 0x0, 0x86, 0x78, 0x52, 0x85, 0x68, 0x75, 0x30, - 0x0, 0xc2, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, - 0x0, 0xc2, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, - 0x0, 0xc7, 0x66, 0xb1, 0xb3, 0x0, 0x0, 0x20, - 0x0, 0xc2, 0x0, 0xe0, 0xb8, 0x66, 0xa7, 0xa1, - 0x0, 0xc1, 0x0, 0xe0, 0xc3, 0x0, 0xd0, 0x0, - 0x0, 0xc1, 0x0, 0xe0, 0xd1, 0x0, 0xd0, 0x0, - 0x0, 0xd6, 0x66, 0xe0, 0xe0, 0x0, 0xd0, 0x0, - 0x0, 0xe0, 0x0, 0x23, 0xa0, 0x0, 0xd0, 0x0, - 0x0, 0xc0, 0x0, 0x9, 0x40, 0x0, 0xd0, 0x0, - 0x4, 0x70, 0x0, 0x1b, 0x0, 0x0, 0xd0, 0x0, - 0x8, 0x10, 0x0, 0x82, 0x0, 0x0, 0xd0, 0x0, - 0x16, 0x0, 0x4, 0x40, 0x0, 0x0, 0xe0, 0x0, - 0x20, 0x0, 0x3, 0x0, 0x0, 0x0, 0x20, 0x0, - - /* U+624B "手" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0x80, 0x0, - 0x0, 0x35, 0x67, 0x8b, 0xba, 0x87, 0x60, 0x0, - 0x0, 0x10, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x10, 0x0, - 0x0, 0x56, 0x66, 0x6e, 0x66, 0x6a, 0xe2, 0x0, - 0x0, 0x11, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x9, 0x30, - 0x27, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x68, 0x60, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x11, 0x1e, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x18, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, - - /* U+624D "才" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x6, 0x60, - 0x5, 0x76, 0x66, 0x66, 0xef, 0x66, 0x66, 0x60, - 0x0, 0x0, 0x0, 0x7, 0xbf, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0x1f, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb5, 0xf, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x70, 0xf, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x59, 0x0, 0xf, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x70, 0x0, 0xf, 0x0, 0x0, 0x0, - 0x0, 0x65, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, - 0x6, 0x10, 0x0, 0x10, 0xf, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x0, 0x4b, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, - - /* U+6253 "打" */ - 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x50, - 0x0, 0x0, 0xe0, 0x4, 0x66, 0x6c, 0x67, 0x81, - 0x5, 0x66, 0xe6, 0xc3, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x61, 0x0, 0x1d, 0x0, 0x0, - 0x1, 0x5a, 0xe2, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0xb, 0x91, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x1, 0x21, 0xe0, 0x0, 0x11, 0x2d, 0x0, 0x0, - 0x0, 0x7f, 0xb0, 0x0, 0x17, 0xfa, 0x0, 0x0, - 0x0, 0x4, 0x10, 0x0, 0x0, 0x40, 0x0, 0x0, - - /* U+6255 "払" */ - 0x0, 0x0, 0x81, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x4, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x7, 0xa0, 0x0, 0x0, - 0x5, 0x66, 0xe6, 0xc2, 0xb, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x3a, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe5, 0x61, 0x85, 0x0, 0x0, 0x0, - 0x0, 0x5a, 0xe2, 0x0, 0xc0, 0x0, 0x0, 0x0, - 0xc, 0xa2, 0xe0, 0x1, 0xa0, 0x0, 0x70, 0x0, - 0x1, 0x0, 0xe0, 0x6, 0x40, 0x0, 0x55, 0x0, - 0x0, 0x0, 0xe0, 0xa, 0x0, 0x0, 0xd, 0x10, - 0x0, 0x0, 0xe0, 0x29, 0x0, 0x0, 0x9, 0x80, - 0x1, 0x11, 0xd0, 0xcb, 0x9a, 0x98, 0x69, 0xd0, - 0x0, 0x7f, 0xa0, 0x68, 0x41, 0x0, 0x4, 0xd0, - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - - /* U+627E "找" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x1b, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x1e, 0x8, 0x80, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x1d, 0x0, 0xb7, 0x0, - 0x5, 0x66, 0xe6, 0xc1, 0x1d, 0x0, 0x15, 0x0, - 0x1, 0x10, 0xe0, 0x13, 0x5e, 0x66, 0x7b, 0x50, - 0x0, 0x0, 0xe0, 0x24, 0x3d, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe1, 0x61, 0xe, 0x0, 0x26, 0x0, - 0x0, 0x5, 0xf8, 0x0, 0xd, 0x0, 0xca, 0x0, - 0x8, 0xe9, 0xe0, 0x0, 0xd, 0x18, 0xb0, 0x0, - 0x9, 0x20, 0xe0, 0x0, 0xa, 0xac, 0x10, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x8, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x6a, 0xd2, 0x0, 0x60, - 0x0, 0x0, 0xe0, 0x18, 0x40, 0x3d, 0x20, 0x90, - 0x2, 0x66, 0xd0, 0x40, 0x0, 0x4, 0xea, 0xb0, - 0x0, 0x2d, 0x60, 0x0, 0x0, 0x0, 0x2a, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6280 "技" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xb0, 0x0, 0x0, 0xc3, 0x0, 0x0, - 0x0, 0x3, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x6, 0x67, 0xd7, 0xa4, 0x66, 0xe6, 0x6a, 0x90, - 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x2, 0xc6, 0x55, 0x66, 0xd6, 0x7b, 0x0, - 0x1, 0x6b, 0xd1, 0x0, 0x60, 0x0, 0x96, 0x0, - 0xb, 0x93, 0xb0, 0x0, 0x52, 0x0, 0xe0, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x8, 0x8, 0x70, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x7, 0x7d, 0x0, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x4, 0xf5, 0x0, 0x0, - 0x1, 0x3, 0xb0, 0x0, 0x89, 0x2c, 0x81, 0x0, - 0x1, 0x8f, 0x90, 0x68, 0x30, 0x0, 0x8f, 0xb2, - 0x0, 0x4, 0x4, 0x0, 0x0, 0x0, 0x1, 0x20, - - /* U+628A "把" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xa0, 0x9, 0x66, 0x66, 0x6b, 0x30, - 0x0, 0x3, 0xa0, 0xd, 0x0, 0xd0, 0xe, 0x0, - 0x6, 0x68, 0xc9, 0x8d, 0x0, 0xd0, 0xe, 0x0, - 0x0, 0x3, 0xa0, 0xd, 0x0, 0xd0, 0xe, 0x0, - 0x0, 0x3, 0xa0, 0xd, 0x0, 0xd0, 0xe, 0x0, - 0x0, 0x3, 0xc7, 0x4d, 0x66, 0xa6, 0x6e, 0x0, - 0x3, 0x8c, 0xc0, 0xd, 0x0, 0x0, 0x4, 0x0, - 0xb, 0x73, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x40, - 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x70, - 0x1, 0x4, 0xa0, 0xd, 0x10, 0x0, 0x0, 0xc0, - 0x2, 0x9f, 0x80, 0x8, 0xdc, 0xcc, 0xcc, 0xd1, - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6295 "投" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa4, 0x0, 0x11, 0x0, 0x40, 0x0, 0x0, - 0xb, 0x20, 0x3, 0xc6, 0x6e, 0x20, 0x0, 0x0, - 0xb2, 0x0, 0x3a, 0x0, 0xe0, 0x0, 0x16, 0x6d, - 0x7d, 0x45, 0x80, 0xe, 0x0, 0x0, 0x0, 0xb2, - 0x0, 0xa2, 0x0, 0xd0, 0x0, 0x0, 0xb, 0x20, - 0x39, 0x0, 0x7, 0xaa, 0x80, 0x0, 0xb8, 0x78, - 0x66, 0x66, 0x89, 0x0, 0x5, 0xbe, 0x30, 0x1, - 0x40, 0x8, 0x80, 0x1, 0xb2, 0xb2, 0x0, 0x7, - 0x0, 0xd1, 0x0, 0x0, 0xb, 0x20, 0x0, 0x44, - 0x68, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0xbc, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x2c, 0xc1, - 0x0, 0x0, 0x42, 0xd2, 0x0, 0x69, 0x13, 0xd8, - 0x20, 0x0, 0x9c, 0x4, 0x73, 0x0, 0x1, 0x9e, - 0x50, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+62BC "押" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, - 0xd, 0x0, 0x2c, 0x66, 0xb6, 0x6f, 0x20, 0x0, - 0xd0, 0x2, 0xc0, 0xd, 0x0, 0xe0, 0x16, 0x5e, - 0x7c, 0x4c, 0x0, 0xd0, 0xe, 0x0, 0x0, 0xd0, - 0x2, 0xd6, 0x6e, 0x66, 0xe0, 0x0, 0xd, 0x0, - 0x2c, 0x0, 0xd0, 0xe, 0x0, 0x0, 0xd6, 0x52, - 0xc0, 0xd, 0x0, 0xe0, 0x1, 0x8f, 0x20, 0x2c, - 0x0, 0xd0, 0xe, 0x4, 0xe5, 0xd0, 0x2, 0xd6, - 0x6e, 0x66, 0xe0, 0x2, 0xd, 0x0, 0x14, 0x0, - 0xd0, 0x1, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x21, 0xe0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x4, 0xdc, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, - - /* U+62C5 "担" */ - 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xc0, 0x0, 0x40, 0x0, 0x5, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0xe6, 0x66, 0x6e, 0x10, - 0x4, 0x67, 0xd7, 0xb1, 0xd0, 0x0, 0x1d, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0xd0, 0x0, 0x1d, 0x0, - 0x0, 0x2, 0xb0, 0x10, 0xe6, 0x66, 0x6d, 0x0, - 0x0, 0x2, 0xc7, 0x40, 0xd0, 0x0, 0x1d, 0x0, - 0x0, 0x4b, 0xc0, 0x0, 0xd0, 0x0, 0x1d, 0x0, - 0xb, 0xc4, 0xb0, 0x0, 0xd0, 0x0, 0x1d, 0x0, - 0x2, 0x2, 0xb0, 0x0, 0xe6, 0x66, 0x6e, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0xd0, 0x0, 0x1c, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x3, 0x90, - 0x1, 0x8e, 0x80, 0x76, 0x66, 0x66, 0x66, 0x61, - 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+62C9 "拉" */ - 0x0, 0x1, 0xa1, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x7, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xf2, 0x0, 0x0, - 0x4, 0x55, 0xe6, 0xa0, 0x0, 0x50, 0x3, 0x0, - 0x1, 0x11, 0xd1, 0x15, 0x76, 0x66, 0x69, 0x50, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x40, 0x0, - 0x0, 0x0, 0xd4, 0x60, 0x50, 0x0, 0xc7, 0x0, - 0x0, 0x6, 0xe3, 0x0, 0x90, 0x0, 0xe1, 0x0, - 0x8, 0xd7, 0xd0, 0x0, 0x77, 0x2, 0xb0, 0x0, - 0x5, 0x20, 0xd0, 0x0, 0x4d, 0x5, 0x60, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x2e, 0x9, 0x10, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x4, 0x9, 0x0, 0x0, - 0x0, 0x12, 0xd0, 0x0, 0x0, 0x16, 0x0, 0x60, - 0x0, 0x7f, 0xa0, 0x76, 0x66, 0x66, 0x67, 0x92, - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+62DB "招" */ - 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0xa2, 0x5, 0x67, 0x86, 0x66, 0xd5, 0x0, - 0xa, 0x20, 0x0, 0x69, 0x0, 0xd, 0x1, 0x66, - 0xc7, 0xb4, 0x9, 0x50, 0x0, 0xe0, 0x0, 0xa, - 0x20, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0x0, 0xa2, - 0x0, 0x58, 0x3, 0x25, 0xa0, 0x0, 0xa, 0x56, - 0x2a, 0x0, 0xa, 0xf4, 0x0, 0x5, 0xd7, 0x17, - 0x20, 0x0, 0x1, 0x20, 0x3e, 0x8b, 0x21, 0xd, - 0x66, 0x66, 0x7d, 0x0, 0x20, 0xa2, 0x0, 0xd0, - 0x0, 0x2, 0xb0, 0x0, 0xa, 0x20, 0xd, 0x0, - 0x0, 0x2b, 0x0, 0x0, 0xa2, 0x0, 0xd0, 0x0, - 0x2, 0xb0, 0x0, 0xb, 0x20, 0xd, 0x66, 0x66, - 0x7b, 0x0, 0x4c, 0xf0, 0x0, 0xc0, 0x0, 0x2, - 0x90, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+62E1 "拡" */ - 0x0, 0xb, 0x20, 0x0, 0x7, 0x50, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x24, 0x22, 0x63, 0x25, 0x70, - 0x0, 0xe, 0x6, 0x3c, 0x44, 0x44, 0x44, 0x30, - 0x16, 0x6e, 0x66, 0x4b, 0x0, 0x10, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x3b, 0x0, 0x7b, 0x0, 0x0, - 0x0, 0xe, 0x5, 0x3b, 0x0, 0xb5, 0x0, 0x0, - 0x0, 0x1e, 0x80, 0x3a, 0x0, 0xd0, 0x0, 0x0, - 0x18, 0xdf, 0x0, 0x49, 0x5, 0x70, 0x0, 0x0, - 0x3b, 0x1e, 0x0, 0x58, 0xa, 0x0, 0x20, 0x0, - 0x0, 0xe, 0x0, 0x85, 0x18, 0x0, 0x28, 0x0, - 0x0, 0xe, 0x0, 0xc0, 0x81, 0x0, 0xa, 0x50, - 0x0, 0xe, 0x4, 0x72, 0xeb, 0xa8, 0x68, 0xd0, - 0x6, 0xdd, 0x8, 0x0, 0x51, 0x0, 0x1, 0x70, - 0x0, 0x31, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+62EC "括" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x15, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x25, 0x8a, 0xca, 0x20, - 0x0, 0x2, 0xb0, 0x24, 0x42, 0xe0, 0x0, 0x0, - 0x6, 0x67, 0xd7, 0x90, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x40, - 0x0, 0x2, 0xb0, 0x67, 0x66, 0xe6, 0x67, 0x92, - 0x0, 0x2, 0xb4, 0x50, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x49, 0xd3, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0xd, 0xb5, 0xb0, 0xb, 0x66, 0xb6, 0x6d, 0x30, - 0x1, 0x2, 0xb0, 0xd, 0x10, 0x0, 0xe, 0x0, - 0x0, 0x2, 0xb0, 0xc, 0x10, 0x0, 0xe, 0x0, - 0x0, 0x2, 0xb0, 0xc, 0x10, 0x0, 0xe, 0x0, - 0x1, 0x35, 0xb0, 0xd, 0x66, 0x66, 0x6e, 0x0, - 0x0, 0x5f, 0x70, 0xd, 0x10, 0x0, 0xb, 0x0, - 0x0, 0x2, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - - /* U+62ED "拭" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x60, 0x0, 0x0, 0xc4, 0x41, 0x0, - 0x0, 0xb, 0x20, 0x0, 0x0, 0xc3, 0x2e, 0x10, - 0x0, 0xb, 0x20, 0x0, 0x0, 0xb3, 0x6, 0x10, - 0x26, 0x6d, 0x7c, 0x35, 0x66, 0xc7, 0x6c, 0x60, - 0x2, 0xb, 0x20, 0x1, 0x0, 0xa3, 0x0, 0x0, - 0x0, 0xb, 0x20, 0x0, 0x0, 0x94, 0x0, 0x0, - 0x0, 0xb, 0x36, 0x30, 0x4, 0x85, 0x0, 0x0, - 0x1, 0x5e, 0x81, 0x46, 0xe6, 0x77, 0x0, 0x0, - 0x4f, 0x8c, 0x20, 0x0, 0xe0, 0x3a, 0x0, 0x0, - 0x2, 0xb, 0x20, 0x0, 0xe0, 0xd, 0x0, 0x0, - 0x0, 0xb, 0x20, 0x0, 0xe0, 0xa, 0x40, 0x20, - 0x0, 0xb, 0x20, 0x3, 0xe7, 0x53, 0xd0, 0x60, - 0x0, 0xc, 0x23, 0xe9, 0x20, 0x0, 0x9b, 0x90, - 0x5, 0xce, 0x0, 0x10, 0x0, 0x0, 0x9, 0xc0, - 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, - - /* U+62FF "拿" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xc3, 0x62, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xa1, 0x0, 0x98, 0x20, 0x0, 0x0, 0x58, - 0x46, 0x66, 0x69, 0x4a, 0xda, 0x62, 0x52, 0x8, - 0x66, 0x66, 0x6c, 0x21, 0x60, 0x0, 0x0, 0xb2, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xb, 0x76, - 0x66, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x30, 0x1, - 0x35, 0x99, 0x0, 0x0, 0x4, 0x45, 0x66, 0xe7, - 0x55, 0x41, 0x0, 0x0, 0x0, 0x0, 0xd, 0x10, - 0x1a, 0x10, 0x0, 0x5, 0x76, 0x66, 0xe6, 0x66, - 0x63, 0x20, 0x28, 0x66, 0x66, 0x6e, 0x66, 0x66, - 0x9c, 0x20, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x16, 0xce, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, - - /* U+6301 "持" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0xd0, 0x4, 0x66, 0xd7, 0x6a, 0x70, 0x16, 0x6e, - 0x6d, 0x20, 0xc, 0x20, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0xc2, 0x0, 0x10, 0x0, 0xd, 0x4, - 0x76, 0x6a, 0x66, 0x6a, 0x60, 0x0, 0xd2, 0x61, - 0x0, 0x5, 0x90, 0x0, 0x0, 0x5e, 0x60, 0x0, - 0x0, 0x59, 0x4, 0x1, 0xe8, 0xd0, 0x37, 0x66, - 0x69, 0xb6, 0x84, 0x1, 0xd, 0x0, 0x24, 0x0, - 0x59, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xa7, 0x5, - 0x90, 0x0, 0x0, 0xd, 0x0, 0x2, 0x90, 0x59, - 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x5, 0x90, - 0x0, 0x4, 0xce, 0x0, 0x0, 0x8, 0xe6, 0x0, - 0x0, 0x2, 0x20, 0x0, 0x0, 0x5, 0x0, 0x0, - - /* U+6307 "指" */ - 0x0, 0x27, 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xc0, 0x3, 0xc0, 0x0, 0x66, 0x0, 0x0, - 0x2b, 0x0, 0x2b, 0x3, 0xba, 0x50, 0x4, 0x67, - 0xd7, 0xb4, 0xc5, 0x40, 0x0, 0x40, 0x11, 0x2b, - 0x0, 0x2b, 0x0, 0x0, 0x8, 0x0, 0x2, 0xb0, - 0x2, 0xe3, 0x22, 0x25, 0xe1, 0x0, 0x2b, 0x54, - 0x6, 0x88, 0x88, 0x84, 0x0, 0x3a, 0xc0, 0x1, - 0x86, 0x66, 0x6a, 0x20, 0xac, 0x4b, 0x0, 0x1d, - 0x0, 0x0, 0xe0, 0x2, 0x2, 0xb0, 0x0, 0xd0, - 0x0, 0xe, 0x0, 0x0, 0x2b, 0x0, 0xe, 0x66, - 0x66, 0xe0, 0x0, 0x2, 0xb0, 0x0, 0xd0, 0x0, - 0xe, 0x0, 0x11, 0x4b, 0x0, 0x1e, 0x66, 0x66, - 0xe0, 0x0, 0x6f, 0x70, 0x1, 0xc0, 0x0, 0xe, - 0x0, 0x0, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, - - /* U+6319 "挙" */ - 0x0, 0x2, 0x0, 0x14, 0x0, 0x9, 0x20, 0x0, - 0x0, 0x3, 0xb0, 0xa, 0x60, 0x1e, 0x30, 0x0, - 0x0, 0x0, 0xa8, 0x4, 0xc0, 0x83, 0x0, 0x0, - 0x0, 0x0, 0x23, 0x0, 0x21, 0x60, 0xa, 0x20, - 0x7, 0x66, 0x8c, 0x66, 0x69, 0x66, 0x67, 0x50, - 0x0, 0x0, 0xb3, 0x0, 0x2, 0x91, 0x0, 0x0, - 0x0, 0x8, 0x61, 0x46, 0xbe, 0x8c, 0x60, 0x0, - 0x0, 0x85, 0x34, 0x3d, 0x10, 0x2, 0xcf, 0x70, - 0x36, 0x46, 0x66, 0x6d, 0x66, 0x6c, 0x93, 0x0, - 0x0, 0x1, 0x0, 0xc, 0x0, 0x0, 0x1, 0x0, - 0x5, 0x66, 0x66, 0x6d, 0x66, 0x66, 0x7f, 0x50, - 0x1, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xde, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, - - /* U+6355 "捕" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x30, 0x0, 0xc, 0x53, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xc, 0x2, 0xd1, 0x0, - 0x0, 0xd, 0x0, 0x11, 0x1c, 0x11, 0x64, 0x70, - 0x5, 0x6e, 0x7b, 0x55, 0x5d, 0x55, 0x55, 0x50, - 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, 0x1, 0x0, - 0x0, 0xd, 0x0, 0xc6, 0x6d, 0x66, 0x6f, 0x10, - 0x0, 0xd, 0x74, 0xd0, 0xc, 0x0, 0xd, 0x0, - 0x1, 0x8f, 0x10, 0xd6, 0x6d, 0x66, 0x6d, 0x0, - 0x2f, 0x6d, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, - 0x1, 0xd, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xd6, 0x6d, 0x66, 0x6d, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, - 0x5, 0xbd, 0x0, 0xd0, 0xd, 0x15, 0xab, 0x0, - 0x0, 0x21, 0x0, 0x50, 0x4, 0x0, 0x41, 0x0, - - /* U+6368 "捨" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x40, 0x0, 0xa, 0x10, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x5d, 0x40, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0xc1, 0x72, 0x0, 0x0, - 0x2, 0x2d, 0x39, 0x9, 0x30, 0xb, 0x40, 0x0, - 0x4, 0x4d, 0x44, 0x84, 0x0, 0x6, 0xcb, 0x50, - 0x0, 0xd, 0x15, 0x33, 0x6c, 0x66, 0x38, 0x40, - 0x0, 0xd, 0x14, 0x10, 0xb, 0x10, 0x1, 0x0, - 0x0, 0x1d, 0x92, 0x76, 0x6d, 0x66, 0x7b, 0x10, - 0x1a, 0xce, 0x10, 0x0, 0xb, 0x10, 0x0, 0x0, - 0x7, 0xd, 0x10, 0x12, 0xb, 0x10, 0x41, 0x0, - 0x0, 0xd, 0x10, 0x2c, 0x66, 0x66, 0xd5, 0x0, - 0x0, 0xd, 0x10, 0x2a, 0x0, 0x0, 0xb2, 0x0, - 0x1, 0xd, 0x0, 0x2a, 0x0, 0x0, 0xb2, 0x0, - 0x4, 0xdd, 0x0, 0x2c, 0x66, 0x66, 0xd3, 0x0, - 0x0, 0x21, 0x0, 0x13, 0x0, 0x0, 0x40, 0x0, - - /* U+6388 "授" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x30, 0x0, 0x0, 0x1, 0x67, 0x0, - 0x0, 0xc, 0x10, 0x34, 0x56, 0x89, 0x87, 0x0, - 0x0, 0xc, 0x10, 0x11, 0x5, 0x0, 0x7b, 0x0, - 0x16, 0x6d, 0x7b, 0x1b, 0x17, 0x80, 0xc2, 0x0, - 0x0, 0xc, 0x10, 0x7, 0x53, 0x73, 0x60, 0x0, - 0x0, 0xc, 0x12, 0x86, 0x66, 0x6a, 0x69, 0x60, - 0x0, 0xc, 0x86, 0xa0, 0x0, 0x0, 0xa, 0x30, - 0x1, 0x9f, 0x15, 0x30, 0x0, 0x2, 0x51, 0x0, - 0x3e, 0x4c, 0x10, 0x7, 0x96, 0x6c, 0xb0, 0x0, - 0x2, 0xc, 0x10, 0x0, 0x70, 0x2d, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x29, 0xc2, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x1d, 0xb0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x3, 0xb3, 0x6c, 0x50, 0x0, - 0x5, 0xce, 0x2, 0x86, 0x0, 0x3, 0xbf, 0x90, - 0x0, 0x22, 0x13, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+6392 "排" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x20, 0x0, 0xb4, 0xc, 0x20, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x20, - 0x16, 0x6e, 0x89, 0x66, 0xd0, 0xd, 0x66, 0x90, - 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x1, 0x0, 0xc0, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x72, 0x56, 0xd0, 0xd, 0x67, 0x90, - 0x17, 0xce, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, - 0x2b, 0x1d, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x5, 0x66, 0xd0, 0xd, 0x66, 0xc1, - 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, - 0x2, 0x1e, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, - 0x3, 0xca, 0x0, 0x0, 0xd0, 0xd, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x20, 0x2, 0x0, 0x0, - - /* U+639B "掛" */ - 0x0, 0x9, 0x10, 0x0, 0x60, 0x0, 0x72, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, 0xd1, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x22, 0x66, 0xd7, 0x90, 0xd0, 0x0, - 0x6, 0x6e, 0x64, 0x0, 0xc0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xc0, 0x40, 0xd5, 0x0, - 0x0, 0xd, 0x4, 0x66, 0x76, 0x63, 0xd4, 0xc0, - 0x0, 0x1e, 0x60, 0x0, 0xd1, 0x0, 0xd0, 0xa5, - 0x18, 0xcd, 0x0, 0x0, 0xc0, 0x10, 0xd0, 0x11, - 0x8, 0xd, 0x2, 0x66, 0xd6, 0xa1, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x13, 0xd6, 0x52, 0xd0, 0x0, - 0x5, 0xda, 0x8, 0xe8, 0x20, 0x0, 0xd0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - - /* U+63A1 "採" */ - 0x0, 0x9, 0x20, 0x0, 0x0, 0x2, 0x68, 0x0, - 0x0, 0xd, 0x0, 0x35, 0x68, 0x99, 0x87, 0x10, - 0x0, 0xd, 0x0, 0x10, 0x12, 0x0, 0x5, 0x70, - 0x0, 0xd, 0x16, 0x65, 0xb, 0x40, 0xc, 0x40, - 0x16, 0x6e, 0x66, 0x1e, 0x34, 0xa0, 0x65, 0x0, - 0x0, 0xd, 0x0, 0x6, 0x11, 0x41, 0x50, 0x0, - 0x0, 0xd, 0x4, 0x10, 0x2, 0xc0, 0x1, 0x20, - 0x0, 0xd, 0x82, 0x66, 0x6c, 0xd6, 0x68, 0x80, - 0x18, 0xce, 0x0, 0x0, 0x5d, 0xb6, 0x0, 0x0, - 0x1a, 0xd, 0x0, 0x0, 0xc4, 0xa8, 0x10, 0x0, - 0x0, 0xd, 0x0, 0x8, 0x52, 0xa2, 0xb0, 0x0, - 0x0, 0xd, 0x0, 0x57, 0x2, 0xa0, 0x8a, 0x0, - 0x1, 0xd, 0x3, 0x60, 0x2, 0xa0, 0xb, 0xc3, - 0x5, 0xdd, 0x3, 0x0, 0x2, 0xb0, 0x0, 0x20, - 0x0, 0x21, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, - - /* U+63A2 "探" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x30, 0x5, 0x0, 0x0, 0x0, 0x40, - 0x0, 0xd, 0x0, 0x2a, 0x66, 0x66, 0x68, 0xe1, - 0x0, 0xd, 0x0, 0x96, 0x21, 0x0, 0x7, 0x20, - 0x16, 0x6e, 0x6c, 0x40, 0xb9, 0x7, 0x60, 0x0, - 0x0, 0xd, 0x0, 0x6, 0x90, 0x0, 0x8d, 0x10, - 0x0, 0xd, 0x2, 0x57, 0x2, 0xc0, 0x9, 0x20, - 0x0, 0xd, 0x73, 0x30, 0x1, 0xb0, 0x0, 0x20, - 0x1, 0x8f, 0x12, 0x86, 0x6a, 0xd7, 0x68, 0xa0, - 0x2e, 0x5d, 0x0, 0x0, 0x5d, 0xb6, 0x0, 0x0, - 0x1, 0xd, 0x0, 0x0, 0xc3, 0xb5, 0x40, 0x0, - 0x0, 0xd, 0x0, 0x8, 0x51, 0xb0, 0xb2, 0x0, - 0x0, 0xd, 0x0, 0x67, 0x1, 0xb0, 0x3e, 0x50, - 0x0, 0xd, 0x5, 0x50, 0x1, 0xb0, 0x4, 0xb3, - 0x3, 0xbc, 0x11, 0x0, 0x2, 0xb0, 0x0, 0x0, - 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+63A5 "接" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x20, 0x0, 0x19, 0x10, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x6, 0x70, 0x2, 0x0, - 0x0, 0xd, 0x1, 0x57, 0x66, 0x66, 0x6a, 0x20, - 0x16, 0x6e, 0x6c, 0x22, 0x70, 0xb, 0x50, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xa5, 0x1a, 0x0, 0x0, - 0x0, 0xd, 0x3, 0x66, 0x86, 0x97, 0x6a, 0x80, - 0x0, 0xd, 0x34, 0x0, 0x2c, 0x0, 0x0, 0x0, - 0x0, 0x6e, 0x40, 0x0, 0x87, 0x0, 0x0, 0x0, - 0x4e, 0x6d, 0x16, 0x66, 0xe6, 0x66, 0x78, 0xb0, - 0x1, 0xd, 0x0, 0x6, 0x60, 0xa, 0x50, 0x0, - 0x0, 0xd, 0x0, 0x1c, 0x0, 0x3c, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x3, 0x79, 0xd6, 0x0, 0x0, - 0x1, 0xd, 0x0, 0x0, 0x3c, 0x59, 0xc4, 0x0, - 0x3, 0xcc, 0x0, 0x49, 0x81, 0x0, 0x3e, 0x30, - 0x0, 0x11, 0x25, 0x30, 0x0, 0x0, 0x1, 0x10, - - /* U+63A7 "控" */ - 0x0, 0xa, 0x30, 0x0, 0x5, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x5, 0xd1, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x12, 0x0, 0x80, 0x0, 0x40, - 0x16, 0x6e, 0x89, 0x77, 0x55, 0x55, 0x58, 0xa0, - 0x0, 0xd, 0x10, 0xa1, 0x39, 0x3, 0x5, 0x0, - 0x0, 0xd, 0x10, 0x1, 0xd5, 0x2, 0xb5, 0x0, - 0x0, 0xd, 0x56, 0x1a, 0x20, 0x0, 0x1e, 0x40, - 0x1, 0x7f, 0x51, 0x60, 0x0, 0x0, 0x16, 0x30, - 0x3f, 0x6d, 0x10, 0x26, 0x67, 0x96, 0x98, 0x0, - 0x1, 0xd, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x3, 0xa0, 0x2, 0x80, - 0x6, 0xae, 0x4, 0x76, 0x66, 0x66, 0x66, 0x61, - 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+63A8 "推" */ - 0x0, 0xa, 0x30, 0x2, 0xa0, 0x60, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x69, 0x3, 0xd0, 0x0, 0x0, - 0xc, 0x0, 0xa, 0x40, 0x8, 0x6, 0x11, 0x66, - 0xd6, 0xc3, 0xe6, 0x6d, 0x66, 0x74, 0x0, 0xc, - 0x0, 0x4f, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xc0, - 0x18, 0xd0, 0xd, 0x1, 0x30, 0x0, 0xc, 0x75, - 0x5d, 0x66, 0xe6, 0x67, 0x0, 0x3a, 0xe0, 0x30, - 0xd0, 0xd, 0x0, 0x0, 0x4d, 0x2c, 0x0, 0xd, - 0x0, 0xd0, 0x3, 0x0, 0x10, 0xc0, 0x0, 0xd6, - 0x6e, 0x67, 0xa2, 0x0, 0xc, 0x0, 0xd, 0x0, - 0xd0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0xd, - 0x0, 0x0, 0x1, 0xd, 0x0, 0xd, 0x66, 0xe6, - 0x6d, 0x60, 0x4c, 0xd0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x11, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, - - /* U+63CF "描" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd4, 0x0, 0xc, 0x40, 0xa5, 0x0, 0x0, - 0xc, 0x10, 0x0, 0xd0, 0xa, 0x20, 0x0, 0x0, - 0xc1, 0x4, 0x4d, 0x44, 0xb5, 0xa4, 0x16, 0x6d, - 0x7c, 0x32, 0xd2, 0x2a, 0x42, 0x10, 0x10, 0xc1, - 0x0, 0xd, 0x0, 0xa2, 0x0, 0x0, 0xc, 0x10, - 0x0, 0x50, 0x3, 0x1, 0x0, 0x0, 0xc2, 0x49, - 0x66, 0x69, 0x66, 0xe2, 0x0, 0x3e, 0x80, 0xa3, - 0x0, 0xd0, 0xd, 0x2, 0xda, 0xd1, 0xa, 0x30, - 0xd, 0x0, 0xd0, 0x4, 0xc, 0x10, 0xa7, 0x66, - 0xe6, 0x6d, 0x0, 0x0, 0xc1, 0xa, 0x30, 0xd, - 0x0, 0xd0, 0x0, 0xc, 0x10, 0xa3, 0x0, 0xd0, - 0xd, 0x0, 0x31, 0xd1, 0xa, 0x76, 0x6e, 0x66, - 0xe0, 0x3, 0xcc, 0x0, 0xa2, 0x0, 0x0, 0xb, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+63D0 "提" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x3, 0x0, 0x0, 0x50, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe1, 0x0, - 0x0, 0xd, 0x1, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x6, 0x6e, 0x6b, 0x1d, 0x66, 0x66, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0xd, 0x64, 0x6, 0x0, 0x0, 0x31, 0x10, - 0x2, 0x9f, 0x16, 0x76, 0x66, 0x96, 0x69, 0xa0, - 0x2e, 0x4d, 0x0, 0x43, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x87, 0x0, 0xd0, 0x7, 0x0, - 0x0, 0xd, 0x0, 0xc4, 0x0, 0xe6, 0x66, 0x20, - 0x0, 0xd, 0x2, 0x96, 0x40, 0xd0, 0x0, 0x0, - 0x3, 0x2d, 0x9, 0x0, 0x8b, 0xd2, 0x0, 0x10, - 0x2, 0xb9, 0x52, 0x0, 0x3, 0x9c, 0xef, 0x70, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+63DB "換" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x96, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x3, 0xf7, 0x6b, 0x30, 0x0, - 0x0, 0xd, 0x0, 0x1a, 0x10, 0x4b, 0x20, 0x0, - 0x16, 0x6e, 0x86, 0x50, 0x0, 0x80, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xc6, 0x67, 0x66, 0x6e, 0x10, - 0x0, 0xd, 0x3, 0xd0, 0x87, 0x42, 0xd, 0x0, - 0x0, 0xd, 0x71, 0xd0, 0xb0, 0xb, 0x3d, 0x0, - 0x5, 0xbe, 0x0, 0xd6, 0x14, 0x24, 0x9d, 0x0, - 0xb, 0x2d, 0x0, 0xa0, 0x9, 0x70, 0xa, 0x0, - 0x0, 0xd, 0x5, 0x66, 0x6d, 0x76, 0x67, 0xc1, - 0x0, 0xd, 0x1, 0x0, 0x4a, 0x42, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x1, 0xc1, 0x9, 0x20, 0x0, - 0x0, 0xd, 0x0, 0x2b, 0x30, 0x1, 0xd7, 0x30, - 0x5, 0xdb, 0x26, 0x60, 0x0, 0x0, 0x1b, 0xb2, - 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+63EE "揮" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x12, 0x0, 0x0, 0x1, 0x40, - 0x0, 0xd, 0x0, 0x58, 0x66, 0x66, 0x6a, 0xc0, - 0x0, 0xd, 0x0, 0xd2, 0x0, 0xc1, 0x7, 0x0, - 0x0, 0xd, 0x33, 0x12, 0x22, 0xd2, 0x28, 0x10, - 0x16, 0x6e, 0x65, 0x25, 0x44, 0xd4, 0x44, 0x20, - 0x0, 0xd, 0x0, 0x18, 0x66, 0xe6, 0x6a, 0x20, - 0x0, 0xd, 0x4, 0x2b, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0xe, 0x71, 0x1d, 0x66, 0xe6, 0x6e, 0x0, - 0x16, 0xcd, 0x0, 0x1b, 0x0, 0xd0, 0xd, 0x0, - 0x1c, 0x1d, 0x0, 0x2d, 0x66, 0xe6, 0x6d, 0x0, - 0x0, 0xd, 0x0, 0x2, 0x0, 0xd0, 0x2, 0x20, - 0x0, 0xd, 0x1, 0x86, 0x66, 0xe6, 0x68, 0x80, - 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x7, 0xda, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x51, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, - - /* U+63FA "揺" */ - 0x0, 0x9, 0x10, 0x0, 0x0, 0x2, 0x69, 0x0, - 0x0, 0xd, 0x0, 0x35, 0x79, 0xaa, 0x98, 0x20, - 0x0, 0xd, 0x0, 0x20, 0x3, 0x0, 0xb, 0x50, - 0x0, 0xd, 0x23, 0x53, 0x8, 0x50, 0x2c, 0x10, - 0x6, 0x6e, 0x64, 0xd, 0x22, 0xd0, 0x81, 0x0, - 0x0, 0xd, 0x0, 0x6, 0x10, 0x21, 0x22, 0x0, - 0x0, 0xd, 0x15, 0x47, 0x66, 0xa6, 0x7a, 0x10, - 0x0, 0x2e, 0x60, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x2c, 0xbd, 0x4, 0x66, 0x66, 0xe6, 0x69, 0xb0, - 0x7, 0xd, 0x1, 0x10, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xa4, 0x0, 0xd0, 0x9, 0x20, - 0x0, 0xd, 0x0, 0xb0, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0xe, 0x0, 0xb0, 0x0, 0xd0, 0xd, 0x0, - 0x6, 0xec, 0x0, 0xc6, 0x66, 0x86, 0x6e, 0x0, - 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - - /* U+643A "携" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x19, 0x26, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x7, 0x90, 0xa6, 0x3, 0x0, 0x0, - 0xd0, 0x0, 0xd6, 0x6c, 0x66, 0x93, 0x17, 0x6e, - 0x89, 0x8d, 0x0, 0xc0, 0x6, 0x0, 0x0, 0xd0, - 0x35, 0xd6, 0x6d, 0x66, 0x50, 0x0, 0xd, 0x5, - 0xd, 0x66, 0xd6, 0x6a, 0x0, 0x0, 0xd8, 0x20, - 0xd0, 0xc, 0x0, 0x10, 0x4, 0xbf, 0x0, 0xe, - 0x66, 0xb6, 0x6a, 0x64, 0xe3, 0xd0, 0x0, 0x70, - 0x0, 0x3, 0x0, 0x1, 0xd, 0x0, 0x66, 0xe6, - 0x69, 0xb0, 0x0, 0x0, 0xd0, 0x0, 0x1c, 0x0, - 0xc8, 0x77, 0x0, 0xd, 0x0, 0x9, 0x50, 0x3, - 0x8, 0x60, 0x0, 0xd0, 0x5, 0xa0, 0x0, 0x0, - 0xc1, 0x5, 0xcc, 0x7, 0x60, 0x0, 0x19, 0xc9, - 0x0, 0x2, 0x13, 0x0, 0x0, 0x0, 0x5, 0x0, - - /* U+64C1 "擁" */ - 0x0, 0x7, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x6, 0x90, 0x0, 0x40, - 0x0, 0xc, 0x3, 0x69, 0x66, 0x66, 0x66, 0x93, - 0x0, 0xc, 0x10, 0x1c, 0x2, 0xc9, 0x40, 0x0, - 0x6, 0x6d, 0x74, 0x72, 0x37, 0x90, 0xa0, 0x20, - 0x0, 0xc, 0x0, 0x62, 0xdd, 0x66, 0xa6, 0xa2, - 0x0, 0xc, 0x27, 0x8b, 0x6e, 0x10, 0xd0, 0x0, - 0x0, 0xe, 0x50, 0x36, 0x3c, 0x66, 0xe6, 0xa1, - 0x2, 0xcc, 0x0, 0x82, 0xbc, 0x10, 0xd0, 0x0, - 0xd, 0x5c, 0x9, 0x9a, 0x7c, 0x10, 0xd0, 0x0, - 0x1, 0xc, 0x3, 0x1b, 0xc, 0x66, 0xe6, 0xa0, - 0x0, 0xc, 0x0, 0x46, 0xc, 0x10, 0xd0, 0x0, - 0x0, 0xc, 0x0, 0x90, 0xc, 0x10, 0xd0, 0x40, - 0x5, 0xda, 0x6, 0x0, 0xc, 0x66, 0x76, 0x74, - 0x0, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - - /* U+64C7 "擇" */ - 0x0, 0xa, 0x10, 0x10, 0x0, 0x0, 0x2, 0x0, - 0x0, 0xd, 0x0, 0xa6, 0x6b, 0x6c, 0x6d, 0x20, - 0x0, 0xd, 0x0, 0xa1, 0xb, 0xc, 0xc, 0x0, - 0x0, 0xd, 0x22, 0xa6, 0x6b, 0x6c, 0x6d, 0x0, - 0x6, 0x6e, 0x65, 0x50, 0x1, 0xa0, 0x3, 0x0, - 0x0, 0xd, 0x0, 0x26, 0x66, 0xc6, 0xb5, 0x0, - 0x0, 0xd, 0x22, 0x2, 0x1, 0xa0, 0x0, 0x20, - 0x0, 0xd, 0x61, 0x86, 0x66, 0x96, 0x68, 0x90, - 0x0, 0x9e, 0x0, 0x0, 0xa3, 0x8, 0x60, 0x0, - 0xe, 0x6d, 0x0, 0x0, 0x49, 0x7, 0x24, 0x0, - 0x3, 0xd, 0x0, 0x57, 0x66, 0xc6, 0x65, 0x0, - 0x0, 0xd, 0x5, 0x66, 0x66, 0xc6, 0x69, 0x90, - 0x0, 0xd, 0x1, 0x10, 0x1, 0xa0, 0x0, 0x0, - 0x5, 0xbc, 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, - 0x0, 0x31, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, - - /* U+64D4 "擔" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x0, 0x8a, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xe7, 0x67, 0x70, 0x0, - 0x0, 0xd, 0x0, 0x9, 0x40, 0x8, 0x50, 0x0, - 0x0, 0xd, 0x14, 0x3d, 0x66, 0x69, 0x69, 0x90, - 0x6, 0x6e, 0x65, 0x4d, 0xc, 0x40, 0x85, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x62, 0x3a, 0x9, 0x10, - 0x0, 0xd, 0x16, 0xe, 0x66, 0x6a, 0x68, 0xb0, - 0x0, 0xd, 0x80, 0xc, 0x0, 0x0, 0x23, 0x0, - 0x3, 0xbe, 0x0, 0x2a, 0x27, 0x66, 0x65, 0x0, - 0x1e, 0x4d, 0x0, 0x47, 0x17, 0x66, 0x6a, 0x0, - 0x0, 0xd, 0x0, 0x83, 0x30, 0x0, 0x4, 0x0, - 0x0, 0xd, 0x0, 0xb0, 0x79, 0x66, 0x6e, 0x0, - 0x1, 0xd, 0x5, 0x20, 0x75, 0x0, 0xd, 0x0, - 0x3, 0xdc, 0x25, 0x0, 0x79, 0x66, 0x6c, 0x0, - 0x0, 0x11, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - - /* U+64DA "據" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x10, 0x0, 0xb, 0x20, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xd, 0x66, 0x97, 0x0, - 0x0, 0xd, 0x0, 0x52, 0x2d, 0x22, 0x23, 0x30, - 0x0, 0xd, 0x23, 0xd4, 0x4b, 0x64, 0x49, 0x70, - 0x16, 0x6e, 0x65, 0xd0, 0x1c, 0x69, 0x43, 0x0, - 0x0, 0xd, 0x0, 0xc4, 0x4c, 0x0, 0x52, 0x0, - 0x0, 0xd, 0x13, 0xc0, 0x5, 0x99, 0x95, 0x0, - 0x0, 0xe, 0x70, 0xc5, 0x67, 0x86, 0x6a, 0x50, - 0x2, 0xbd, 0x0, 0xb0, 0x1d, 0x20, 0x48, 0x0, - 0x1e, 0x3d, 0x1, 0xa2, 0x74, 0xb4, 0x91, 0x0, - 0x0, 0xd, 0x4, 0x71, 0x58, 0x7a, 0x40, 0x0, - 0x0, 0xd, 0x8, 0x36, 0x36, 0xac, 0x73, 0x0, - 0x0, 0xd, 0x8, 0x3, 0x95, 0xc, 0xc, 0x90, - 0x6, 0xcb, 0x41, 0x43, 0x5, 0x8d, 0x0, 0x10, - 0x0, 0x41, 0x10, 0x0, 0x0, 0x42, 0x0, 0x0, - - /* U+652F "支" */ - 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x10, 0x0, 0x2a, 0x0, 0x76, - 0x66, 0x66, 0xe6, 0x66, 0x66, 0x63, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd1, 0x4, 0x10, 0x0, 0x0, 0x6, 0x86, - 0x66, 0x66, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x50, - 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x7, 0x10, - 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x8, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xdc, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x2b, 0x80, 0x4d, 0xb5, - 0x10, 0x0, 0x3, 0x88, 0x10, 0x0, 0x6, 0xcf, - 0xf7, 0x15, 0x30, 0x0, 0x0, 0x0, 0x0, 0x13, - 0x0, - - /* U+6539 "改" */ - 0x0, 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x30, 0x9, 0x70, 0x0, 0x0, 0x26, - 0x66, 0x6e, 0x30, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x4a, 0x0, 0x2, 0x50, 0x0, 0x0, - 0xd, 0xa, 0x86, 0x6a, 0x95, 0x0, 0x0, 0x0, - 0xd1, 0x85, 0x0, 0x94, 0x0, 0x1e, 0x66, 0x6c, - 0x70, 0x70, 0xb, 0x20, 0x0, 0xd0, 0x0, 0x2, - 0x8, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x63, 0x3a, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x1, - 0xa9, 0x40, 0x0, 0xd, 0x0, 0x3, 0x40, 0x8, - 0xc0, 0x0, 0x0, 0xd0, 0x69, 0x30, 0x1, 0xcc, - 0x40, 0x0, 0x2f, 0xd4, 0x0, 0x3, 0xa1, 0x1d, - 0x60, 0x0, 0x70, 0x0, 0x17, 0x60, 0x0, 0x1c, - 0xc2, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x2, - 0x0, - - /* U+653E "放" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x20, 0x0, 0x4, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xd4, 0x0, 0x7, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x44, 0x2, 0xb, 0x30, 0x1, 0x10, - 0x6, 0x6a, 0x66, 0x6a, 0x2d, 0x66, 0x7b, 0x80, - 0x0, 0xe, 0x0, 0x0, 0x48, 0x0, 0x95, 0x0, - 0x0, 0xe, 0x0, 0x20, 0x86, 0x0, 0xb3, 0x0, - 0x0, 0xe, 0x66, 0xc5, 0x67, 0x0, 0xe0, 0x0, - 0x0, 0x1c, 0x0, 0xb1, 0x6, 0x23, 0xb0, 0x0, - 0x0, 0x2a, 0x0, 0xc0, 0x2, 0x88, 0x50, 0x0, - 0x0, 0x58, 0x0, 0xd0, 0x0, 0xad, 0x0, 0x0, - 0x0, 0x84, 0x0, 0xd0, 0x0, 0xab, 0x0, 0x0, - 0x0, 0xb0, 0x1, 0xd0, 0x7, 0x79, 0x90, 0x0, - 0x4, 0x62, 0x8b, 0x80, 0x76, 0x0, 0xbb, 0x20, - 0x7, 0x0, 0x18, 0x27, 0x20, 0x0, 0x9, 0xb2, - 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+653F "政" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x13, 0xc, 0x40, 0x0, 0x0, - 0x7, 0x66, 0xa6, 0x89, 0x1e, 0x0, 0x1, 0x0, - 0x0, 0x0, 0xb1, 0x0, 0x4c, 0x66, 0x8a, 0x80, - 0x0, 0x10, 0xb1, 0x0, 0x84, 0x0, 0xb3, 0x0, - 0x0, 0xe1, 0xb1, 0x20, 0xa5, 0x0, 0xd1, 0x0, - 0x0, 0xd0, 0xb6, 0x96, 0x46, 0x0, 0xd0, 0x0, - 0x0, 0xd0, 0xb1, 0x5, 0x7, 0x3, 0xa0, 0x0, - 0x0, 0xd0, 0xb1, 0x0, 0x4, 0x58, 0x60, 0x0, - 0x0, 0xd0, 0xb1, 0x0, 0x0, 0xbd, 0x10, 0x0, - 0x0, 0xd0, 0xb4, 0x65, 0x0, 0xba, 0x0, 0x0, - 0x3, 0xea, 0xb6, 0x0, 0x8, 0x9b, 0x50, 0x0, - 0x1d, 0x72, 0x0, 0x0, 0x95, 0x1, 0xd8, 0x10, - 0x0, 0x0, 0x0, 0x57, 0x10, 0x0, 0x1c, 0xb1, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6545 "故" */ - 0x0, 0x0, 0x81, 0x0, 0x2, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x5, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x9, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x6, 0xd, 0x11, 0x14, 0x50, - 0x6, 0x66, 0xe6, 0x66, 0x4d, 0x55, 0x9a, 0x40, - 0x0, 0x0, 0xd0, 0x0, 0x77, 0x0, 0x86, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x75, 0x0, 0xa3, 0x0, - 0x0, 0xa6, 0xc6, 0xc5, 0x3, 0x40, 0xd0, 0x0, - 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x81, 0xc0, 0x0, - 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xa7, 0x60, 0x0, - 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x6e, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0xd0, 0x1, 0xbd, 0x30, 0x0, - 0x0, 0xd6, 0x66, 0xe0, 0x2b, 0x42, 0xd5, 0x0, - 0x0, 0x90, 0x0, 0x27, 0x70, 0x0, 0x3d, 0xb1, - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x1, 0x10, - - /* U+6548 "效" */ - 0x0, 0x14, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, - 0x0, 0x97, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, - 0x3, 0xc0, 0x52, 0x1d, 0x0, 0x0, 0x2, 0x86, - 0x66, 0x66, 0x56, 0x70, 0x2, 0x60, 0x0, 0xa4, - 0x19, 0x20, 0xa6, 0x68, 0xc5, 0x0, 0x2c, 0x0, - 0x3e, 0x1d, 0x0, 0x57, 0x0, 0xa, 0x20, 0x2, - 0x66, 0x52, 0x8, 0x40, 0x6, 0x32, 0x2, 0xe1, - 0x51, 0x60, 0xc0, 0x0, 0x20, 0x36, 0x95, 0x0, - 0x9, 0x1b, 0x0, 0x0, 0x0, 0x5e, 0x0, 0x0, - 0x8a, 0x50, 0x0, 0x0, 0xb, 0x8b, 0x0, 0x4, - 0xe0, 0x0, 0x0, 0x7, 0x60, 0xb6, 0x1, 0xbb, - 0x50, 0x0, 0x4, 0x60, 0x2, 0x52, 0x90, 0x1d, - 0x60, 0x4, 0x50, 0x0, 0x5, 0x60, 0x0, 0x2e, - 0xa1, 0x10, 0x0, 0x4, 0x0, 0x0, 0x0, 0x10, - 0x0, - - /* U+6557 "敗" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0xa2, 0x0, 0x0, - 0x3, 0xc6, 0x66, 0x6f, 0x12, 0xf1, 0x0, 0x0, - 0x2, 0xa0, 0x0, 0xd, 0x5, 0x90, 0x0, 0x20, - 0x2, 0xa0, 0x0, 0xd, 0x9, 0x86, 0x69, 0xc3, - 0x2, 0xc6, 0x66, 0x6d, 0xc, 0x0, 0xd, 0x0, - 0x2, 0xa0, 0x0, 0xd, 0x3a, 0x0, 0x2b, 0x0, - 0x2, 0xc6, 0x66, 0x6d, 0x72, 0x30, 0x58, 0x0, - 0x2, 0xa0, 0x0, 0xd, 0x40, 0x70, 0x94, 0x0, - 0x2, 0xa0, 0x0, 0xd, 0x0, 0x70, 0xd0, 0x0, - 0x3, 0xc6, 0x66, 0x6d, 0x0, 0x3b, 0x80, 0x0, - 0x1, 0x26, 0x25, 0x11, 0x0, 0x1f, 0x30, 0x0, - 0x0, 0x2d, 0x21, 0xd4, 0x0, 0xa5, 0xd1, 0x0, - 0x0, 0xa2, 0x0, 0x37, 0x9, 0x20, 0x5d, 0x30, - 0x7, 0x10, 0x0, 0x2, 0x61, 0x0, 0x5, 0xf5, - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x10, - - /* U+6559 "教" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb2, 0x0, 0x0, 0x88, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x3, 0x20, 0xc4, 0x0, 0x0, - 0x0, 0x66, 0xe8, 0x8c, 0x60, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x78, 0x3, 0xb3, 0x37, 0x80, - 0x5, 0x66, 0xe6, 0xe8, 0xa8, 0x52, 0x6a, 0x20, - 0x0, 0x0, 0xb, 0x20, 0xa, 0x20, 0x67, 0x0, - 0x0, 0x66, 0xb9, 0x7a, 0x34, 0x50, 0x84, 0x0, - 0x0, 0x8, 0x31, 0x93, 0x50, 0x70, 0xb1, 0x0, - 0x1, 0x71, 0x39, 0x0, 0x0, 0x80, 0xc0, 0x0, - 0x3, 0x0, 0x4b, 0x35, 0x30, 0x59, 0x70, 0x0, - 0x4, 0x8a, 0xbb, 0x20, 0x0, 0x1f, 0x0, 0x0, - 0x3, 0x50, 0x49, 0x0, 0x0, 0xaa, 0x70, 0x0, - 0x0, 0x0, 0x49, 0x0, 0x9, 0x30, 0xc7, 0x0, - 0x0, 0x6, 0xb7, 0x4, 0x71, 0x0, 0x1c, 0xb1, - 0x0, 0x0, 0x60, 0x31, 0x0, 0x0, 0x0, 0x0, - - /* U+6562 "敢" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x10, 0x0, 0xc1, 0x0, 0x0, - 0x1, 0x66, 0x6a, 0x90, 0x3, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x20, 0x6, 0x70, 0x0, 0x0, - 0x26, 0x66, 0x6d, 0x6a, 0x8a, 0x76, 0x69, 0x90, - 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, 0x94, 0x0, - 0x0, 0xd0, 0x0, 0xd0, 0x4b, 0x0, 0xb2, 0x0, - 0x0, 0xd6, 0x66, 0xd0, 0x83, 0x30, 0xd0, 0x0, - 0x0, 0xd0, 0x0, 0xd1, 0x50, 0x71, 0xc0, 0x0, - 0x0, 0xd6, 0x66, 0xd2, 0x0, 0x95, 0x80, 0x0, - 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x7d, 0x20, 0x0, - 0x0, 0xd1, 0x35, 0xe6, 0x30, 0x4e, 0x0, 0x0, - 0x4c, 0xea, 0x62, 0xd0, 0x0, 0xb8, 0x90, 0x0, - 0x5, 0x0, 0x0, 0xd0, 0x9, 0x10, 0xaa, 0x10, - 0x0, 0x0, 0x0, 0xd1, 0x61, 0x0, 0x9, 0xb1, - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, - - /* U+6570 "数" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x10, 0x1e, 0x3, 0x20, 0xd6, 0x0, 0x0, - 0x0, 0x93, 0xc, 0xb, 0x41, 0xe0, 0x0, 0x0, - 0x0, 0x3b, 0xc, 0x44, 0x5, 0x80, 0x0, 0x0, - 0x3, 0x68, 0x6d, 0x69, 0x9a, 0x86, 0x66, 0xd2, - 0x0, 0x10, 0xcd, 0x40, 0xd, 0x10, 0x4a, 0x0, - 0x0, 0x9, 0x3c, 0x7b, 0x56, 0x30, 0x58, 0x0, - 0x0, 0x82, 0xc, 0x4, 0x60, 0x60, 0x76, 0x0, - 0x4, 0x0, 0x67, 0x0, 0x0, 0x80, 0xa3, 0x0, - 0x3, 0x66, 0xd9, 0x6a, 0x10, 0x90, 0xd0, 0x0, - 0x1, 0x13, 0x90, 0x3b, 0x0, 0x68, 0xa0, 0x0, - 0x0, 0xb, 0x61, 0xb2, 0x0, 0x1f, 0x40, 0x0, - 0x0, 0x0, 0x3e, 0xd8, 0x0, 0x9b, 0xa0, 0x0, - 0x0, 0x3, 0xa4, 0x8, 0x59, 0x50, 0x9c, 0x40, - 0x4, 0x65, 0x0, 0x4, 0x71, 0x0, 0x7, 0xb2, - 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, - - /* U+6574 "整" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa6, 0x0, 0x2, 0xd0, 0x0, 0x0, - 0x4, 0x66, 0xc8, 0x6a, 0x77, 0x70, 0x1, 0x30, - 0x1, 0x10, 0xa3, 0x1, 0xb, 0x66, 0xaa, 0x70, - 0x0, 0xb6, 0xc8, 0x6d, 0x3a, 0x30, 0xa3, 0x0, - 0x0, 0xc0, 0xa3, 0xc, 0x70, 0x71, 0xd0, 0x0, - 0x0, 0xc6, 0xe8, 0x6b, 0x10, 0x5b, 0x60, 0x0, - 0x0, 0x19, 0xd9, 0x91, 0x0, 0x6e, 0x50, 0x0, - 0x0, 0x84, 0xa3, 0x75, 0x18, 0x50, 0xba, 0x40, - 0x16, 0x10, 0x71, 0x4, 0x40, 0x0, 0x97, 0x70, - 0x0, 0x28, 0x66, 0x69, 0xb6, 0x66, 0x62, 0x0, - 0x0, 0x0, 0x72, 0x5, 0x90, 0x6, 0x20, 0x0, - 0x0, 0x0, 0xd0, 0x5, 0xb6, 0x66, 0x40, 0x0, - 0x0, 0x0, 0xd0, 0x5, 0x90, 0x0, 0x1, 0x0, - 0x4, 0x66, 0xe6, 0x69, 0xb6, 0x66, 0x6e, 0x60, - 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6587 "文" */ - 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x70, 0x0, 0x6, 0x10, - 0x5, 0x76, 0x67, 0x66, 0x66, 0x97, 0x6a, 0x80, - 0x0, 0x0, 0x6, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x0, 0x2, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x20, 0x8, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x90, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x92, 0x5a, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1b, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xb4, 0x7c, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x59, 0x20, 0x4, 0xdc, 0x73, 0x10, - 0x0, 0x57, 0x30, 0x0, 0x0, 0x5, 0xcf, 0x70, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+6599 "料" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xd2, 0x0, - 0x1, 0x0, 0xd0, 0x10, 0x0, 0x0, 0xe0, 0x0, - 0x4, 0x60, 0xd0, 0xb4, 0x39, 0x0, 0xe0, 0x0, - 0x0, 0xe1, 0xd1, 0x80, 0x9, 0x70, 0xe0, 0x0, - 0x0, 0x60, 0xd5, 0x0, 0x1, 0x20, 0xe0, 0x0, - 0x3, 0x66, 0xe6, 0xb8, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x6, 0xe0, 0x0, 0x58, 0x0, 0xe0, 0x0, - 0x0, 0xc, 0xe9, 0x40, 0xa, 0x50, 0xe0, 0x0, - 0x0, 0x39, 0xd1, 0xd4, 0x1, 0x10, 0xe0, 0x91, - 0x0, 0xa1, 0xd0, 0x21, 0x1, 0x46, 0xe6, 0x51, - 0x5, 0x30, 0xd0, 0x37, 0x64, 0x10, 0xe0, 0x0, - 0x14, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xf0, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x40, 0x0, - - /* U+65AD "断" */ - 0x3, 0x0, 0x83, 0x0, 0x0, 0x0, 0x45, 0x1, - 0xe0, 0xb, 0x21, 0x3, 0x76, 0x88, 0x60, 0xc, - 0x71, 0xb2, 0x7a, 0x3a, 0x0, 0x0, 0x0, 0xc3, - 0xab, 0x2b, 0x13, 0xa0, 0x0, 0x0, 0xc, 0x5, - 0xb5, 0x20, 0x3a, 0x0, 0x0, 0x0, 0xc6, 0x6d, - 0x77, 0xa4, 0xc6, 0x66, 0xd4, 0xc, 0x3, 0xf4, - 0x0, 0x39, 0x1, 0xc0, 0x0, 0xc0, 0x8e, 0x69, - 0x3, 0x90, 0x1c, 0x0, 0xc, 0x9, 0xb2, 0x97, - 0x48, 0x1, 0xc0, 0x0, 0xc5, 0x2b, 0x21, 0x35, - 0x70, 0x1c, 0x0, 0xc, 0x40, 0xb2, 0x0, 0x93, - 0x1, 0xc0, 0x0, 0xc0, 0x9, 0x32, 0xb, 0x0, - 0x1c, 0x0, 0x4d, 0x66, 0x68, 0x88, 0x30, 0x1, - 0xc0, 0x0, 0x0, 0x0, 0x5, 0x40, 0x0, 0x1c, - 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x10, - 0x0, - - /* U+65B0 "新" */ - 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x5, 0x0, - 0x0, 0x0, 0x49, 0x3, 0x2, 0x56, 0xaa, 0x40, - 0x2, 0x86, 0x67, 0x89, 0x53, 0xa0, 0x0, 0x0, - 0x0, 0x38, 0x0, 0xb5, 0x3, 0xa0, 0x0, 0x0, - 0x0, 0xb, 0x21, 0x80, 0x2, 0xa0, 0x0, 0x0, - 0x5, 0x68, 0x69, 0x67, 0xc4, 0xc6, 0x69, 0xc0, - 0x0, 0x0, 0x2a, 0x0, 0x2, 0xa0, 0xc1, 0x0, - 0x0, 0x0, 0x2a, 0x3, 0x23, 0x90, 0xc1, 0x0, - 0x1, 0x66, 0x7c, 0x68, 0x74, 0x80, 0xc1, 0x0, - 0x0, 0x16, 0x2a, 0x30, 0x6, 0x60, 0xc1, 0x0, - 0x0, 0x7a, 0x2a, 0x68, 0xa, 0x20, 0xc1, 0x0, - 0x0, 0xb0, 0x2a, 0xc, 0x1b, 0x0, 0xc1, 0x0, - 0x6, 0x31, 0x3a, 0x0, 0x81, 0x0, 0xc1, 0x0, - 0x3, 0x5, 0xe7, 0x5, 0x30, 0x0, 0xc1, 0x0, - 0x0, 0x0, 0x10, 0x11, 0x0, 0x0, 0x40, 0x0, - - /* U+65B7 "斷" */ - 0x4, 0x13, 0x20, 0x15, 0x0, 0x0, 0x17, 0x20, - 0xb, 0x47, 0x20, 0x65, 0x8, 0x67, 0x86, 0x40, - 0xa, 0x59, 0xb3, 0xa9, 0x5a, 0x30, 0x0, 0x0, - 0xa, 0x35, 0x70, 0x48, 0x9, 0x30, 0x0, 0x0, - 0xa, 0x38, 0x63, 0x97, 0x39, 0x30, 0x0, 0x0, - 0xa, 0x58, 0x57, 0x74, 0x79, 0x86, 0x89, 0x90, - 0xa, 0x76, 0x66, 0x6a, 0x19, 0x30, 0xd0, 0x0, - 0xa, 0x26, 0x60, 0x66, 0x9, 0x30, 0xd0, 0x0, - 0xa, 0x28, 0x72, 0x77, 0x2a, 0x20, 0xd0, 0x0, - 0xa, 0x78, 0xa4, 0x9a, 0xb, 0x10, 0xd0, 0x0, - 0xa, 0x26, 0x50, 0x65, 0xb, 0x0, 0xd0, 0x0, - 0xa, 0x4b, 0x76, 0xc8, 0x5a, 0x0, 0xd0, 0x0, - 0xb, 0x20, 0x2, 0x73, 0x74, 0x0, 0xd0, 0x0, - 0x9, 0x66, 0x66, 0x64, 0x70, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x40, 0x0, - - /* U+65B9 "方" */ - 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x70, 0x0, 0x2, 0x60, - 0x7, 0x66, 0x66, 0x7b, 0x66, 0x66, 0x68, 0x81, - 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x8a, 0x66, 0x69, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xb2, 0x0, 0x8, 0x70, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0xa, 0x50, 0x0, - 0x0, 0x0, 0x7, 0x60, 0x0, 0xc, 0x20, 0x0, - 0x0, 0x0, 0x1b, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xa3, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x8, 0x30, 0x3, 0x30, 0x7a, 0x0, 0x0, - 0x1, 0x62, 0x0, 0x0, 0x6f, 0xf3, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, - - /* U+65BC "於" */ - 0x0, 0x5, 0x40, 0x0, 0x0, 0xb3, 0x0, 0x0, - 0x0, 0x0, 0xe1, 0x0, 0x1, 0xe4, 0x0, 0x0, - 0x0, 0x0, 0x50, 0x46, 0x5, 0x98, 0x0, 0x0, - 0x6, 0x7e, 0x66, 0x65, 0xa, 0x46, 0x40, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x1c, 0x0, 0xc0, 0x0, - 0x0, 0xe, 0x0, 0x50, 0x74, 0x0, 0x7b, 0x0, - 0x0, 0xe, 0x66, 0xe4, 0x81, 0x0, 0xc, 0xc1, - 0x0, 0xd, 0x0, 0xd6, 0x2, 0xa9, 0x11, 0x30, - 0x0, 0x1b, 0x0, 0xd0, 0x0, 0x9, 0x80, 0x0, - 0x0, 0x49, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x74, 0x1, 0xc0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xb0, 0x3, 0xa0, 0x18, 0xb7, 0x10, 0x0, - 0x2, 0x63, 0x5a, 0x60, 0x0, 0x2c, 0xe1, 0x0, - 0x7, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x92, 0x0, - 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+65BD "施" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, - 0x0, 0x6, 0xb0, 0x0, 0xe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x80, 0x30, 0x6b, 0x66, 0x69, 0xb0, - 0x5, 0x6a, 0x66, 0x96, 0xb0, 0x30, 0x0, 0x0, - 0x0, 0x1b, 0x0, 0x7, 0x20, 0xd3, 0x0, 0x0, - 0x0, 0x1b, 0x2, 0x22, 0xb1, 0xd0, 0x6, 0x0, - 0x0, 0x1d, 0x6b, 0x60, 0xd0, 0xd6, 0x6e, 0x10, - 0x0, 0x2a, 0x8, 0x42, 0xe7, 0xe0, 0xd, 0x0, - 0x0, 0x39, 0x9, 0x65, 0xd0, 0xd0, 0xd, 0x0, - 0x0, 0x57, 0x9, 0x30, 0xd0, 0xd0, 0xd, 0x0, - 0x0, 0x83, 0xa, 0x20, 0xd0, 0xd2, 0xb8, 0x0, - 0x0, 0xa0, 0xb, 0x10, 0xd0, 0xd0, 0x0, 0x50, - 0x3, 0x55, 0x5e, 0x0, 0xd0, 0x10, 0x0, 0xa0, - 0x6, 0x1, 0xc5, 0x0, 0xad, 0xcc, 0xcd, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+65C1 "旁" */ - 0x0, 0x0, 0x0, 0x2a, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x50, 0x0, 0x93, 0x0, - 0x0, 0x47, 0x69, 0x66, 0x66, 0xa6, 0x64, 0x0, - 0x0, 0x0, 0x9, 0x70, 0x4, 0xb0, 0x0, 0x0, - 0x0, 0x40, 0x2, 0x80, 0x7, 0x0, 0x4, 0x0, - 0x0, 0xb6, 0x66, 0x68, 0x66, 0x66, 0x6f, 0x40, - 0x7, 0x80, 0x0, 0x8, 0x80, 0x0, 0x52, 0x0, - 0x3, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6c, 0x90, - 0x0, 0x10, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf6, 0x66, 0x6a, 0x60, 0x0, - 0x0, 0x0, 0x5, 0x90, 0x0, 0xb, 0x30, 0x0, - 0x0, 0x0, 0xc, 0x20, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xa4, 0x0, 0x31, 0x4c, 0x0, 0x0, - 0x0, 0x48, 0x20, 0x0, 0x1a, 0xf5, 0x0, 0x0, - 0x4, 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - - /* U+65C5 "旅" */ - 0x0, 0x8, 0x10, 0x0, 0x1b, 0x20, 0x0, 0x0, - 0x0, 0x3, 0xe0, 0x0, 0x5b, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa0, 0x10, 0x93, 0x0, 0x5, 0x10, - 0x6, 0x68, 0x66, 0xa6, 0xb6, 0x66, 0x68, 0x50, - 0x0, 0x2b, 0x0, 0x5, 0x30, 0x0, 0x51, 0x0, - 0x0, 0x2b, 0x0, 0x44, 0x10, 0x5a, 0x94, 0x0, - 0x0, 0x2c, 0x66, 0xd0, 0xd5, 0x60, 0x0, 0x0, - 0x0, 0x39, 0x1, 0xb0, 0xd0, 0x60, 0xa, 0x10, - 0x0, 0x58, 0x2, 0xa0, 0xd0, 0x63, 0x94, 0x0, - 0x0, 0x75, 0x2, 0x90, 0xd0, 0x46, 0x0, 0x0, - 0x0, 0xb1, 0x4, 0x80, 0xd0, 0xb, 0x0, 0x0, - 0x1, 0x90, 0x6, 0x60, 0xd0, 0x7, 0x90, 0x0, - 0x7, 0x14, 0x9d, 0x10, 0xd5, 0x70, 0xbb, 0x30, - 0x14, 0x0, 0x63, 0x0, 0xe7, 0x0, 0x9, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - - /* U+65CF "族" */ - 0x0, 0x16, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x60, 0x0, 0xa5, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x40, 0x40, 0xd2, 0x22, 0x28, 0x50, - 0x5, 0x6c, 0x66, 0x76, 0x99, 0x44, 0x44, 0x30, - 0x0, 0xd, 0x0, 0x8, 0x7a, 0x0, 0x2, 0x0, - 0x0, 0xe, 0x6a, 0x51, 0xb6, 0x95, 0x6a, 0x10, - 0x0, 0xc, 0xc, 0x15, 0x40, 0xc0, 0x0, 0x0, - 0x0, 0x1c, 0xc, 0x5, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x2a, 0xc, 0x46, 0x66, 0xe6, 0x68, 0xd1, - 0x0, 0x58, 0xc, 0x11, 0x1, 0xc5, 0x0, 0x0, - 0x0, 0x83, 0xd, 0x0, 0x6, 0x76, 0x20, 0x0, - 0x0, 0xb0, 0xd, 0x0, 0x1c, 0x1, 0xb0, 0x0, - 0x4, 0x45, 0xc9, 0x1, 0xb2, 0x0, 0x6b, 0x10, - 0x6, 0x0, 0x51, 0x58, 0x10, 0x0, 0x8, 0xe3, - 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x10, - - /* U+65E2 "既" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, - 0xc6, 0x66, 0xe1, 0x66, 0x6c, 0x67, 0x80, 0xd, - 0x0, 0xd, 0x6, 0x20, 0xd0, 0x0, 0x0, 0xd0, - 0x0, 0xd0, 0xb3, 0x1c, 0x0, 0x0, 0xd, 0x66, - 0x6d, 0xc, 0x2, 0xb0, 0x0, 0x0, 0xd0, 0x0, - 0xd0, 0xc0, 0x49, 0x0, 0x10, 0xd, 0x66, 0x6d, - 0x2d, 0x5a, 0xa5, 0x7a, 0x10, 0xd0, 0x0, 0x80, - 0x0, 0xa8, 0x0, 0x0, 0xd, 0x1, 0x0, 0x0, - 0xd, 0xc2, 0x0, 0x0, 0xd0, 0x9, 0x20, 0x4, - 0x8c, 0x0, 0x0, 0xd, 0x0, 0x6e, 0x10, 0xc1, - 0xc0, 0x3, 0x0, 0xd5, 0x92, 0xb4, 0x76, 0xc, - 0x0, 0x60, 0x1f, 0x90, 0x1, 0x57, 0x0, 0xc0, - 0xa, 0x0, 0x30, 0x0, 0x65, 0x0, 0x8, 0xcb, - 0xe3, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+65E5 "日" */ - 0x20, 0x0, 0x0, 0x0, 0x30, 0xd6, 0x66, 0x66, - 0x66, 0xd5, 0xd1, 0x0, 0x0, 0x0, 0xb3, 0xc1, - 0x0, 0x0, 0x0, 0xb3, 0xc1, 0x0, 0x0, 0x0, - 0xb3, 0xc1, 0x0, 0x0, 0x0, 0xb3, 0xc6, 0x66, - 0x66, 0x66, 0xc3, 0xc1, 0x0, 0x0, 0x0, 0xb3, - 0xc1, 0x0, 0x0, 0x0, 0xb3, 0xc1, 0x0, 0x0, - 0x0, 0xb3, 0xc1, 0x0, 0x0, 0x0, 0xb3, 0xc1, - 0x0, 0x0, 0x0, 0xb3, 0xd6, 0x66, 0x66, 0x66, - 0xc3, 0xc0, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+65E6 "旦" */ - 0x0, 0x0, 0x96, 0x66, 0x66, 0x6b, 0x20, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xf6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, - 0x7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, - - /* U+65E9 "早" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x4, 0x10, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x60, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x30, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x30, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x30, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x30, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x30, 0x0, - 0x0, 0x1, 0xa0, 0x0, 0xe0, 0x7, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x1, 0x0, - 0x6, 0x76, 0x66, 0x66, 0xe6, 0x66, 0x6c, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+65F6 "时" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x0, 0xe0, 0x0, 0xc6, 0x67, 0xe0, - 0x0, 0x0, 0xe0, 0x0, 0xc1, 0x2, 0xc0, 0x0, - 0x0, 0xe0, 0x81, 0xc1, 0x2, 0xc7, 0x66, 0x66, - 0xe6, 0x63, 0xc1, 0x2, 0xc0, 0x0, 0x0, 0xe0, - 0x0, 0xc6, 0x67, 0xc0, 0x82, 0x0, 0xe0, 0x0, - 0xc1, 0x2, 0xc0, 0x2e, 0x10, 0xe0, 0x0, 0xc1, - 0x2, 0xc0, 0xb, 0x30, 0xe0, 0x0, 0xc1, 0x2, - 0xc0, 0x1, 0x0, 0xe0, 0x0, 0xc6, 0x67, 0xc0, - 0x0, 0x0, 0xe0, 0x0, 0xd1, 0x2, 0xb0, 0x0, - 0x0, 0xe0, 0x0, 0x70, 0x0, 0x0, 0x2, 0x34, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - - /* U+6607 "昇" */ - 0x0, 0x8, 0x66, 0x66, 0x66, 0x66, 0xb2, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, - 0xd, 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0xc6, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xc, - 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc6, - 0x66, 0x76, 0x66, 0x6c, 0x0, 0x0, 0x1, 0x15, - 0xcd, 0x10, 0xa3, 0x0, 0x0, 0x3, 0x66, 0xe1, - 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0xe, 0x0, - 0x0, 0xd1, 0x3, 0x0, 0x66, 0x66, 0xe6, 0x66, - 0x6e, 0x66, 0xd7, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0xc1, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, 0xd, - 0x10, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0xd1, - 0x0, 0x0, 0x5, 0x91, 0x0, 0x0, 0xd, 0x10, - 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, 0x40, 0x0, - 0x0, - - /* U+660E "明" */ - 0x0, 0x0, 0x0, 0x74, 0x44, 0x4a, 0x18, 0x66, - 0x6a, 0xc, 0x32, 0x22, 0xd0, 0xd0, 0x1, 0xc0, - 0xc1, 0x0, 0xd, 0xd, 0x0, 0x1b, 0xc, 0x10, - 0x0, 0xd0, 0xd0, 0x1, 0xb0, 0xc7, 0x66, 0x6d, - 0xd, 0x66, 0x6b, 0xc, 0x10, 0x0, 0xd0, 0xd0, - 0x1, 0xb0, 0xc0, 0x0, 0xd, 0xd, 0x0, 0x1b, - 0xd, 0x0, 0x0, 0xd0, 0xd6, 0x66, 0xb0, 0xe5, - 0x55, 0x5d, 0xd, 0x0, 0x1a, 0x1d, 0x0, 0x0, - 0xd0, 0x60, 0x0, 0x6, 0x70, 0x0, 0xd, 0x0, - 0x0, 0x1, 0xc0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x92, 0x0, 0x43, 0x4c, 0x0, 0x2, 0x71, 0x0, - 0x0, 0x5f, 0x70, 0x0, 0x20, 0x0, 0x0, 0x0, - 0x10, 0x0, - - /* U+6613 "易" */ - 0x0, 0x9, 0x66, 0x66, 0x66, 0xc1, 0x0, 0x0, - 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, - 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x66, - 0x66, 0x66, 0xe0, 0x0, 0x0, 0xd, 0x10, 0x0, - 0x0, 0xe0, 0x0, 0x0, 0xd, 0x96, 0x66, 0x66, - 0xe0, 0x0, 0x0, 0x2, 0xe4, 0x0, 0x0, 0x10, - 0x0, 0x0, 0xa, 0xb6, 0x86, 0x68, 0x67, 0xd0, - 0x0, 0x68, 0x6, 0xa0, 0x5a, 0x4, 0xa0, 0x5, - 0x50, 0x1d, 0x10, 0xc3, 0x7, 0x70, 0x11, 0x1, - 0xb3, 0x5, 0xa0, 0xa, 0x40, 0x0, 0x58, 0x10, - 0x3c, 0x10, 0xd, 0x10, 0x4, 0x20, 0x5, 0xb1, - 0x20, 0x3c, 0x0, 0x0, 0x3, 0x74, 0x0, 0x2b, - 0xf5, 0x0, 0x0, 0x31, 0x0, 0x0, 0x1, 0x20, - 0x0, - - /* U+6614 "昔" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x70, 0x1, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x60, 0x1, 0xd0, 0x1, 0x0, - 0x0, 0x46, 0x6a, 0xa6, 0x66, 0xe6, 0x8e, 0x20, - 0x0, 0x11, 0x7, 0x60, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x60, 0x0, 0xd0, 0x0, 0x10, - 0x5, 0x66, 0x6a, 0xa6, 0x66, 0xe6, 0x6a, 0xd1, - 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xa6, 0x66, 0x66, 0x6a, 0x70, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x9, 0x50, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x9, 0x40, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x40, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x9, 0x40, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x9, 0x40, 0x0, - 0x0, 0x1, 0xe6, 0x66, 0x66, 0x6c, 0x40, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, - - /* U+661F "星" */ - 0x0, 0x9, 0x66, 0x66, 0x66, 0x6b, 0x20, 0x0, - 0x0, 0xb2, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0xb, 0x20, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, - 0xb7, 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, 0xb, - 0x20, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xb7, - 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, 0x6, 0x30, - 0xd, 0x30, 0x1, 0x0, 0x0, 0x0, 0xc5, 0x0, - 0xe0, 0x0, 0x85, 0x0, 0x0, 0x3b, 0x66, 0x6e, - 0x66, 0x66, 0x50, 0x0, 0xa, 0x10, 0x0, 0xe0, - 0x0, 0x10, 0x0, 0x6, 0x24, 0x66, 0x6e, 0x66, - 0xac, 0x0, 0x0, 0x10, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x34, 0x1, 0x86, 0x66, 0x66, 0xa6, 0x66, 0x6a, - 0xa1, - - /* U+6620 "映" */ - 0x0, 0x0, 0x0, 0x0, 0x84, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x93, 0x0, 0x0, 0xa6, 0x6d, - 0x41, 0x10, 0x93, 0x3, 0x0, 0xb2, 0xd, 0x2, - 0xc6, 0xc8, 0x6d, 0x30, 0xa2, 0xd, 0x2, 0xa0, - 0x93, 0xc, 0x0, 0xa2, 0xd, 0x2, 0xa0, 0xa2, - 0xc, 0x0, 0xa7, 0x6e, 0x2, 0xa0, 0xb1, 0xc, - 0x0, 0xa2, 0xd, 0x2, 0xa0, 0xc0, 0xc, 0x63, - 0xa2, 0xd, 0x36, 0x66, 0xd8, 0x66, 0x64, 0xa2, - 0xd, 0x0, 0x3, 0xa5, 0x0, 0x0, 0xa7, 0x6e, - 0x0, 0xa, 0x32, 0x60, 0x0, 0xb2, 0xa, 0x0, - 0x49, 0x0, 0x92, 0x0, 0x71, 0x0, 0x5, 0x90, - 0x0, 0x1d, 0x50, 0x0, 0x2, 0x75, 0x0, 0x0, - 0x3, 0xe7, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, - 0x10, - - /* U+6625 "春" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5b, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x55, 0x0, - 0x3, 0x66, 0x66, 0xc9, 0x66, 0x66, 0x65, 0x0, - 0x0, 0x0, 0x0, 0xd1, 0x0, 0x8, 0x10, 0x0, - 0x0, 0x56, 0x69, 0xc6, 0x66, 0x66, 0x30, 0x0, - 0x26, 0x66, 0x6d, 0x86, 0x66, 0x66, 0x6d, 0x60, - 0x0, 0x0, 0x96, 0x0, 0x0, 0x70, 0x0, 0x0, - 0x0, 0x7, 0x90, 0x0, 0x0, 0x48, 0x0, 0x0, - 0x0, 0x85, 0xb7, 0x66, 0x66, 0xf7, 0xb4, 0x0, - 0x36, 0x10, 0xb3, 0x0, 0x0, 0xe0, 0x2c, 0xa1, - 0x0, 0x0, 0xa8, 0x66, 0x66, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xa3, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xa3, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xb8, 0x66, 0x66, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x40, 0x0, 0x0, - - /* U+6628 "昨" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x20, 0xd, 0x30, 0x0, 0x0, 0xc, 0x66, - 0x7d, 0x2, 0xc0, 0x0, 0x4, 0x0, 0xb1, 0x2, - 0xb0, 0x88, 0xa6, 0x66, 0xa7, 0xb, 0x10, 0x2b, - 0xa, 0xe, 0x0, 0x0, 0x0, 0xb1, 0x2, 0xb5, - 0x20, 0xe0, 0x0, 0x0, 0xb, 0x66, 0x7b, 0x40, - 0xe, 0x66, 0x9a, 0x0, 0xb1, 0x2, 0xb0, 0x0, - 0xe0, 0x0, 0x0, 0xb, 0x10, 0x2b, 0x0, 0xe, - 0x0, 0x0, 0x0, 0xb1, 0x2, 0xb0, 0x0, 0xe4, - 0x45, 0xd3, 0xb, 0x10, 0x2b, 0x0, 0xe, 0x11, - 0x11, 0x10, 0xb6, 0x67, 0xb0, 0x0, 0xe0, 0x0, - 0x0, 0xb, 0x10, 0x13, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - - /* U+662F "是" */ - 0x0, 0x0, 0x96, 0x66, 0x66, 0xa5, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0xb, 0x30, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, - 0xc, 0x66, 0x66, 0x6c, 0x30, 0x0, 0x0, 0x0, - 0xc1, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xd, - 0x66, 0x66, 0x6c, 0x30, 0x0, 0x0, 0x0, 0x40, - 0x0, 0x0, 0x20, 0x35, 0x0, 0x76, 0x66, 0x66, - 0xb6, 0x66, 0x68, 0x81, 0x0, 0x1, 0xd2, 0xc, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x4c, 0x0, 0xc7, - 0x66, 0x9c, 0x10, 0x0, 0xa, 0x90, 0xc, 0x20, - 0x0, 0x0, 0x0, 0x2, 0xb0, 0x82, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0xb1, 0x0, 0x9e, 0x73, 0x21, - 0x12, 0x20, 0x82, 0x0, 0x0, 0x17, 0xbd, 0xff, - 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+663C "昼" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x50, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x66, 0xd1, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x86, 0xc0, 0x0, - 0x0, 0x3, 0x90, 0x0, 0x0, 0x71, 0x0, 0x0, - 0x0, 0x7, 0x50, 0x0, 0x0, 0xa, 0x10, 0x0, - 0x0, 0xc, 0xa6, 0x66, 0x66, 0x6e, 0xc5, 0x0, - 0x0, 0x65, 0xa1, 0x0, 0x0, 0x1b, 0x1c, 0xd4, - 0x1, 0x80, 0xa7, 0x66, 0x66, 0x6b, 0x0, 0x40, - 0x5, 0x0, 0xa1, 0x0, 0x0, 0x1b, 0x0, 0x0, - 0x0, 0x0, 0xa1, 0x0, 0x0, 0x1b, 0x0, 0x0, - 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6a, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x20, - 0x0, 0x76, 0x66, 0x66, 0x66, 0x66, 0x67, 0x50, - - /* U+6642 "時" */ - 0x0, 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, 0x52, - 0x26, 0x10, 0x0, 0xc0, 0x0, 0x0, 0xd4, 0x4c, - 0x40, 0x0, 0xc0, 0x6, 0x0, 0xd0, 0xb, 0x14, - 0x66, 0xd6, 0x66, 0x20, 0xd0, 0xb, 0x10, 0x0, - 0xc0, 0x0, 0x0, 0xd0, 0xb, 0x44, 0x44, 0xd5, - 0x45, 0xc2, 0xd6, 0x6d, 0x21, 0x11, 0x11, 0x83, - 0x10, 0xd0, 0xb, 0x10, 0x0, 0x0, 0xb2, 0x50, - 0xd0, 0xb, 0x67, 0x66, 0x66, 0xd6, 0x74, 0xd0, - 0xb, 0x10, 0x57, 0x0, 0xb1, 0x0, 0xd6, 0x6d, - 0x10, 0xa, 0x50, 0xb1, 0x0, 0xd0, 0xb, 0x10, - 0x1, 0x20, 0xb1, 0x0, 0x60, 0x1, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, - 0x0, - - /* U+6669 "晩" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0x30, - 0x4, 0x0, 0x1e, 0x20, 0x11, 0x0, 0xd, 0x66, - 0xe4, 0xa, 0x96, 0x6b, 0xa0, 0x0, 0xd0, 0xd, - 0x4, 0xa0, 0x1, 0x90, 0x0, 0xd, 0x0, 0xd1, - 0xb9, 0x66, 0xa6, 0x6b, 0x10, 0xd0, 0xd, 0x52, - 0xa0, 0xd, 0x0, 0xd0, 0xd, 0x66, 0xe0, 0x2a, - 0x0, 0xd0, 0xd, 0x0, 0xd0, 0xd, 0x2, 0xc6, - 0x6e, 0x66, 0xd0, 0xd, 0x0, 0xd0, 0x27, 0xf, - 0x49, 0x4, 0x0, 0xd0, 0xd, 0x0, 0x1, 0xf3, - 0x90, 0x0, 0xd, 0x66, 0xe0, 0x0, 0x6a, 0x39, - 0x0, 0x10, 0xd0, 0xa, 0x0, 0xd, 0x33, 0x90, - 0x5, 0x4, 0x0, 0x0, 0xb, 0x60, 0x29, 0x0, - 0x90, 0x0, 0x0, 0x48, 0x20, 0x1, 0xdb, 0xbd, - 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+666E "普" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x30, 0x0, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xf1, 0x7, 0x50, 0x2, 0x0, - 0x0, 0x66, 0x66, 0xd6, 0x6b, 0x66, 0x8d, 0x30, - 0x0, 0x3, 0x0, 0xe0, 0xe, 0x0, 0x70, 0x0, - 0x0, 0x6, 0x70, 0xe0, 0xe, 0x5, 0xb1, 0x0, - 0x0, 0x0, 0xf0, 0xe0, 0xe, 0xa, 0x10, 0x0, - 0x0, 0x0, 0x30, 0xe0, 0xe, 0x22, 0x7, 0x70, - 0x17, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, - 0x0, 0x0, 0xa6, 0x66, 0x66, 0x6c, 0x20, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6f, 0x0, 0x0, - 0x0, 0x0, 0x50, 0x0, 0x0, 0x4, 0x0, 0x0, - - /* U+666F "景" */ - 0x0, 0x0, 0x96, 0x66, 0x66, 0x69, 0x60, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x8, 0x60, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6b, 0x60, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x8, 0x60, 0x0, - 0x0, 0x1, 0xd6, 0x69, 0x96, 0x6a, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x7, 0x50, - 0x6, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, - 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6d, 0x30, 0x0, - 0x0, 0x0, 0xc2, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xc7, 0x66, 0x86, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0x34, 0x0, 0xe0, 0x12, 0x0, 0x0, - 0x0, 0x0, 0x9c, 0x20, 0xe0, 0x39, 0x30, 0x0, - 0x0, 0x2a, 0x50, 0x0, 0xe0, 0x0, 0xbb, 0x0, - 0x5, 0x50, 0x0, 0x6b, 0xc0, 0x0, 0xa, 0x50, - 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, - - /* U+6674 "晴" */ - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x86, 0x6a, - 0x36, 0x66, 0xc7, 0x68, 0xb0, 0xc0, 0xd, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x56, - 0xc7, 0x6c, 0x50, 0xc0, 0xd, 0x0, 0x0, 0xb3, - 0x0, 0x0, 0xc1, 0x1d, 0x36, 0x66, 0xc7, 0x66, - 0xc6, 0xc5, 0x5d, 0x0, 0x10, 0x0, 0x2, 0x0, - 0xc0, 0xd, 0x0, 0xd6, 0x66, 0x6e, 0x20, 0xc0, - 0xd, 0x0, 0xe6, 0x66, 0x6e, 0x0, 0xc0, 0xd, - 0x0, 0xd0, 0x0, 0xd, 0x0, 0xc6, 0x6e, 0x0, - 0xd6, 0x66, 0x6e, 0x0, 0xd0, 0xa, 0x0, 0xd0, - 0x0, 0xd, 0x0, 0x20, 0x0, 0x0, 0xd0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x5, 0xae, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x32, 0x0, - - /* U+667A "智" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3c, 0x66, 0x8b, 0x8, 0x66, 0x6b, 0x10, 0x9, - 0x12, 0xa0, 0x0, 0xd0, 0x0, 0xd0, 0x2, 0x30, - 0x48, 0x3, 0xd, 0x0, 0xd, 0x0, 0x76, 0x69, - 0xa6, 0xa4, 0xd0, 0x0, 0xd0, 0x0, 0x0, 0xb8, - 0x30, 0xd, 0x0, 0xd, 0x0, 0x0, 0x4a, 0x9, - 0xb0, 0xd6, 0x66, 0xd0, 0x0, 0x3a, 0x10, 0xa, - 0x15, 0x0, 0x3, 0x0, 0x55, 0xc, 0x66, 0x66, - 0x66, 0xd4, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x0, 0xc, 0x66, 0x66, 0x66, - 0xe0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6e, 0x0, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x30, 0x0, - - /* U+6687 "暇" */ - 0x0, 0x0, 0x21, 0x14, 0x12, 0x22, 0x60, 0x8, - 0x66, 0xa5, 0x95, 0xc3, 0x44, 0x4d, 0x10, 0xc0, - 0xc, 0x46, 0xb, 0x0, 0x0, 0xc0, 0xc, 0x0, - 0xc4, 0x60, 0xb0, 0x0, 0xc, 0x0, 0xc0, 0xc, - 0x4a, 0x6d, 0x16, 0x66, 0xd0, 0xc, 0x66, 0xc4, - 0x60, 0x30, 0x0, 0x1, 0x0, 0xc0, 0xc, 0x46, - 0x2, 0x23, 0x33, 0x81, 0xc, 0x0, 0xc4, 0xa6, - 0x72, 0x73, 0x3e, 0x10, 0xc0, 0xc, 0x46, 0x0, - 0x6, 0x4, 0x90, 0xc, 0x66, 0xc4, 0xa6, 0xb2, - 0x44, 0xb3, 0x0, 0xc0, 0x8, 0x46, 0x0, 0x0, - 0xca, 0x0, 0x3, 0x0, 0x4, 0x60, 0x0, 0x2c, - 0xb0, 0x0, 0x0, 0x0, 0x56, 0x0, 0x39, 0x6, - 0xd5, 0x0, 0x0, 0x5, 0x60, 0x54, 0x0, 0x4, - 0x81, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, - - /* U+6691 "暑" */ - 0x0, 0x0, 0x96, 0x66, 0x66, 0x6b, 0x20, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x10, 0x0, - 0x0, 0x0, 0x80, 0xd, 0x20, 0x6, 0xc9, 0x0, - 0x0, 0x3, 0x66, 0x6e, 0x6d, 0x2b, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x1, 0xc6, 0x3, 0x0, - 0x5, 0x76, 0x66, 0x6c, 0x8d, 0x96, 0x6c, 0x80, - 0x0, 0x0, 0x0, 0x29, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4d, 0xb7, 0x66, 0x6c, 0x70, 0x0, - 0x1, 0x57, 0x6b, 0x0, 0x0, 0xa, 0x40, 0x0, - 0x12, 0x0, 0x1d, 0x66, 0x66, 0x6c, 0x40, 0x0, - 0x0, 0x0, 0x1b, 0x0, 0x0, 0xa, 0x40, 0x0, - 0x0, 0x0, 0x2d, 0x66, 0x66, 0x6c, 0x40, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, - - /* U+6696 "暖" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, 0x60, 0x30, - 0x4, 0x24, 0x56, 0x87, 0x66, 0x30, 0xd6, 0x6d, - 0x41, 0x50, 0x74, 0xe, 0x20, 0xd0, 0xb, 0x10, - 0x94, 0x29, 0x54, 0x0, 0xd0, 0xb, 0x16, 0x87, - 0x66, 0x97, 0xb0, 0xd0, 0xb, 0x10, 0x8, 0x50, - 0x0, 0x0, 0xd5, 0x5d, 0x36, 0x6c, 0x86, 0x66, - 0xb6, 0xd0, 0xb, 0x12, 0xd, 0x0, 0x0, 0x0, - 0xd0, 0xb, 0x10, 0x2d, 0x66, 0x6a, 0x30, 0xd0, - 0xb, 0x10, 0x97, 0x40, 0x4c, 0x10, 0xd6, 0x6d, - 0x21, 0xa0, 0x82, 0xd2, 0x0, 0xd0, 0x8, 0x1a, - 0x10, 0x2f, 0x50, 0x0, 0xa0, 0x0, 0x62, 0x1, - 0xa8, 0xd4, 0x0, 0x0, 0x1, 0x10, 0x58, 0x10, - 0x3d, 0xd7, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, - 0x50, - - /* U+6697 "暗" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x51, 0x15, - 0x0, 0x0, 0x58, 0x3, 0x30, 0xd5, 0x5d, 0x24, - 0x76, 0x66, 0x76, 0x50, 0xd0, 0xd, 0x0, 0x36, - 0x0, 0x97, 0x0, 0xd0, 0xd, 0x0, 0xb, 0x40, - 0xb0, 0x0, 0xd0, 0xd, 0x0, 0x4, 0x14, 0x30, - 0x72, 0xd6, 0x6e, 0x28, 0x66, 0x66, 0x66, 0x64, - 0xd0, 0xd, 0x0, 0x30, 0x0, 0x4, 0x0, 0xd0, - 0xd, 0x0, 0xe6, 0x66, 0x6e, 0x30, 0xd0, 0xd, - 0x0, 0xd0, 0x0, 0xd, 0x0, 0xd6, 0x6e, 0x0, - 0xd5, 0x55, 0x5e, 0x0, 0xd0, 0xb, 0x0, 0xd0, - 0x0, 0xd, 0x0, 0x40, 0x0, 0x0, 0xd6, 0x66, - 0x6e, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xc, - 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - - /* U+66C7 "曇" */ - 0x0, 0x11, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, - 0x4a, 0x66, 0x66, 0x66, 0xd3, 0x0, 0x0, 0x47, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x4a, 0x66, - 0x66, 0x66, 0xd0, 0x0, 0x0, 0x4a, 0x66, 0x66, - 0x66, 0xc0, 0x0, 0x0, 0x33, 0x22, 0x22, 0x22, - 0x84, 0x0, 0x2, 0x33, 0x33, 0xc4, 0x33, 0x33, - 0x21, 0xa, 0x66, 0x66, 0xd6, 0x66, 0x66, 0xc8, - 0x77, 0x46, 0x60, 0xb1, 0x36, 0x61, 0x50, 0x0, - 0x46, 0x60, 0x80, 0x36, 0x60, 0x0, 0x0, 0x37, - 0x66, 0x66, 0x68, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xa0, 0x57, 0x66, 0x6a, 0xa6, - 0x66, 0x66, 0x62, 0x0, 0x0, 0x59, 0x20, 0x7, - 0x40, 0x0, 0x0, 0x2b, 0xa6, 0x67, 0x66, 0xd5, - 0x0, 0x0, 0x18, 0x53, 0x10, 0x0, 0x13, 0x0, - - /* U+66DC "曜" */ - 0x0, 0x0, 0x1, 0x11, 0x50, 0x11, 0x51, 0x96, - 0x6b, 0x38, 0x55, 0xd3, 0x75, 0xc3, 0xd0, 0xd, - 0x3, 0xc0, 0xc0, 0x97, 0xb1, 0xc0, 0xd, 0x0, - 0x41, 0xc0, 0x5, 0xb1, 0xc0, 0xd, 0x5, 0x75, - 0xc2, 0x86, 0xc1, 0xc6, 0x6d, 0xa5, 0x30, 0x79, - 0x30, 0x70, 0xc0, 0xd, 0x0, 0xe5, 0xb, 0x40, - 0x0, 0xc0, 0xd, 0x6, 0xa6, 0x6b, 0x86, 0xc2, - 0xc0, 0xd, 0x1e, 0x30, 0xb, 0x1, 0x0, 0xc6, - 0x6d, 0x6a, 0x75, 0x5d, 0x5a, 0x60, 0xd0, 0xd, - 0xa, 0x30, 0xb, 0x1, 0x0, 0xc0, 0x2, 0xa, - 0x76, 0x6d, 0x68, 0x60, 0x10, 0x0, 0xa, 0x30, - 0xb, 0x0, 0x40, 0x0, 0x0, 0xa, 0x76, 0x68, - 0x66, 0x94, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, - 0x0, - - /* U+66F2 "曲" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xc0, 0xc, 0x20, 0x0, 0x0, 0x1, 0xc0, 0xd, - 0x0, 0x0, 0x0, 0x1, 0xc0, 0xd, 0x0, 0x0, - 0xa7, 0x66, 0xd6, 0x6e, 0x66, 0xc5, 0xb3, 0x1, - 0xc0, 0xd, 0x0, 0xc2, 0xb3, 0x1, 0xc0, 0xd, - 0x0, 0xc2, 0xa3, 0x1, 0xc0, 0xd, 0x0, 0xc2, - 0xa8, 0x66, 0xd6, 0x6e, 0x66, 0xd2, 0xa3, 0x1, - 0xc0, 0xd, 0x0, 0xc2, 0xa3, 0x1, 0xc0, 0xd, - 0x0, 0xc2, 0xa3, 0x1, 0xc0, 0xd, 0x0, 0xc2, - 0xb3, 0x1, 0xc0, 0xd, 0x0, 0xc2, 0xb8, 0x66, - 0xc6, 0x6c, 0x66, 0xd2, 0xb3, 0x0, 0x0, 0x0, - 0x0, 0xa1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+66F4 "更" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x10, - 0x5, 0x76, 0x66, 0x67, 0xb6, 0x66, 0x68, 0x50, - 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x10, 0x0, - 0x0, 0xd, 0x66, 0x67, 0xd6, 0x66, 0xf2, 0x0, - 0x0, 0xe, 0x0, 0x2, 0xb0, 0x0, 0xe0, 0x0, - 0x0, 0xe, 0x66, 0x67, 0xd6, 0x66, 0xe0, 0x0, - 0x0, 0xe, 0x0, 0x2, 0xb0, 0x0, 0xe0, 0x0, - 0x0, 0xe, 0x0, 0x3, 0xa0, 0x0, 0xe0, 0x0, - 0x0, 0xe, 0x66, 0x69, 0xb6, 0x66, 0xd0, 0x0, - 0x0, 0x0, 0x12, 0x8, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x3d, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0x75, 0xc8, 0x42, 0x10, 0x10, - 0x1, 0x57, 0x71, 0x0, 0x5, 0x9c, 0xef, 0x80, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+66F8 "書" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x36, 0x66, 0xe6, 0x66, 0x6b, 0x10, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xd1, 0x40, 0x47, 0x66, - 0x66, 0xe6, 0x66, 0x6e, 0x89, 0x10, 0x4, 0x66, - 0x6e, 0x66, 0x66, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x5, 0x0, 0x0, 0x36, 0x66, 0x6e, - 0x66, 0x66, 0xa7, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x75, 0x5, 0x76, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x50, 0x0, 0xc6, 0x66, 0x66, 0x66, - 0x6e, 0x10, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0xc6, 0x66, 0x66, 0x66, 0x6d, - 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x66, 0x6e, 0x0, - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, - - /* U+66FE "曾" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x10, 0x0, 0xb5, 0x0, 0x0, 0x4, 0xb0, 0x2, - 0xa0, 0x0, 0x9, 0x66, 0x96, 0x6a, 0x66, 0x88, - 0xd, 0x10, 0x0, 0xd0, 0x10, 0x67, 0xd, 0x1a, - 0x0, 0xd0, 0x97, 0x67, 0xd, 0x9, 0x60, 0xd1, - 0x90, 0x67, 0xd, 0x1, 0x10, 0xd3, 0x0, 0x67, - 0xd, 0x66, 0x66, 0x66, 0x66, 0x95, 0x0, 0x66, - 0x66, 0x66, 0x69, 0x20, 0x0, 0xa2, 0x0, 0x0, - 0xd, 0x0, 0x0, 0xa2, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xa7, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xa2, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xa7, 0x66, 0x66, - 0x6e, 0x0, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, - - /* U+66FF "替" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0xd2, 0x40, 0xd, 0x5, 0x10, 0x3, 0x66, 0xd6, - 0x63, 0x6e, 0x66, 0x40, 0x0, 0x2, 0xa1, 0x30, - 0xd, 0x0, 0x50, 0x6, 0x69, 0xa6, 0x65, 0x7c, - 0x96, 0x71, 0x0, 0xb, 0x78, 0x0, 0x84, 0x71, - 0x0, 0x0, 0x57, 0x7, 0x75, 0x70, 0x1b, 0x30, - 0x4, 0x61, 0x0, 0x64, 0x0, 0x33, 0xd5, 0x22, - 0xe, 0x66, 0x66, 0x66, 0xd6, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0xe, 0x66, - 0x66, 0x66, 0xd2, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xb2, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0xb3, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xd3, - 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x30, 0x0, - - /* U+6700 "最" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x86, 0x66, 0x66, 0x6b, 0x50, 0x0, - 0x0, 0x2, 0xd0, 0x0, 0x0, 0xb, 0x20, 0x0, - 0x0, 0x2, 0xe6, 0x66, 0x66, 0x6d, 0x20, 0x0, - 0x0, 0x2, 0xd0, 0x0, 0x0, 0xb, 0x20, 0x0, - 0x0, 0x2, 0xd6, 0x66, 0x66, 0x6c, 0x21, 0x0, - 0x5, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0xa0, - 0x1, 0xe, 0x0, 0xd, 0x0, 0x0, 0x2, 0x0, - 0x0, 0xe, 0x66, 0x6d, 0x57, 0x66, 0xad, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x5, 0x0, 0xc4, 0x0, - 0x0, 0xe, 0x66, 0x6d, 0x4, 0x24, 0xb0, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x22, 0x9c, 0x10, 0x0, - 0x0, 0xe, 0x69, 0x8e, 0x30, 0x9a, 0x0, 0x0, - 0xb, 0xe9, 0x41, 0xd, 0x5, 0x68, 0xb3, 0x0, - 0x1, 0x0, 0x0, 0xd, 0x44, 0x0, 0x5e, 0xa1, - 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, - - /* U+6703 "會" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xc4, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x30, 0x1a, 0x50, 0x0, 0x0, - 0x0, 0x3, 0xb8, 0x66, 0x6d, 0xed, 0x95, 0x31, - 0x0, 0x77, 0x0, 0x0, 0x0, 0x1, 0x9c, 0xb1, - 0x15, 0xb, 0x66, 0x69, 0x66, 0x66, 0xe1, 0x0, - 0x0, 0xd, 0x9, 0x2c, 0x3, 0xb0, 0xd0, 0x0, - 0x0, 0xd, 0x2, 0xac, 0x9, 0x20, 0xd0, 0x0, - 0x0, 0xc, 0x66, 0x69, 0x67, 0x66, 0xb0, 0x0, - 0x0, 0x0, 0x86, 0x66, 0x66, 0x69, 0x0, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x2b, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x7a, 0x0, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x2a, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x7b, 0x0, 0x0, - 0x0, 0x0, 0x60, 0x0, 0x0, 0x14, 0x0, 0x0, - - /* U+6708 "月" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x5, 0x0, 0x0, - 0xd, 0x66, 0x66, 0x66, 0xe3, 0x0, 0x0, 0xd1, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x10, 0x0, - 0x0, 0xe0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6e, - 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe6, 0x66, - 0x66, 0x6e, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, - 0xe0, 0x0, 0x5, 0x90, 0x0, 0x0, 0xe, 0x0, - 0x0, 0xb2, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x57, - 0x0, 0x0, 0x21, 0x1f, 0x0, 0x37, 0x0, 0x0, - 0x2, 0x7f, 0xc0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x30, 0x0, - - /* U+6709 "有" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x5, 0x10, - 0x6, 0x66, 0x66, 0xbb, 0x66, 0x66, 0x6c, 0x90, - 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x50, 0x0, 0x4, 0x10, 0x0, - 0x0, 0x0, 0x5d, 0x66, 0x66, 0x6c, 0x60, 0x0, - 0x0, 0x2, 0xcc, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x0, 0x29, 0x2d, 0x66, 0x66, 0x6c, 0x30, 0x0, - 0x2, 0x70, 0x1c, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x3, 0x0, 0x1c, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x0, 0x0, 0x1d, 0x66, 0x66, 0x6c, 0x30, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x0, 0x0, 0x2c, 0x0, 0x5, 0xbf, 0x10, 0x0, - 0x0, 0x0, 0x12, 0x0, 0x0, 0x23, 0x0, 0x0, - - /* U+670B "朋" */ - 0x0, 0x10, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, - 0xb, 0x66, 0x6e, 0x11, 0xc6, 0x66, 0xf1, 0x0, - 0xb1, 0x0, 0xd0, 0x1c, 0x0, 0xd, 0x0, 0xb, - 0x10, 0xd, 0x1, 0xc0, 0x0, 0xd0, 0x0, 0xb6, - 0x66, 0xd0, 0x1d, 0x66, 0x6d, 0x0, 0xb, 0x10, - 0xd, 0x1, 0xc0, 0x0, 0xd0, 0x0, 0xb1, 0x0, - 0xd0, 0x1c, 0x0, 0xd, 0x0, 0xb, 0x66, 0x6d, - 0x1, 0xd6, 0x66, 0xd0, 0x0, 0xc0, 0x0, 0xd0, - 0x2b, 0x0, 0xd, 0x0, 0xc, 0x0, 0xd, 0x3, - 0x90, 0x0, 0xd0, 0x0, 0xb0, 0x0, 0xd0, 0x66, - 0x0, 0xd, 0x0, 0x46, 0x0, 0xd, 0xa, 0x10, - 0x0, 0xd0, 0x8, 0x0, 0x68, 0xc3, 0x60, 0x0, - 0xd, 0x2, 0x40, 0x0, 0x95, 0x70, 0x2, 0x8f, - 0xa0, 0x10, 0x0, 0x0, 0x30, 0x0, 0x0, 0x40, - 0x0, - - /* U+670D "服" */ - 0x0, 0x20, 0x3, 0x0, 0x30, 0x0, 0x21, 0x0, - 0x0, 0xd6, 0x6c, 0x60, 0xe6, 0x66, 0xc8, 0x0, - 0x0, 0xd0, 0xa, 0x20, 0xd0, 0x0, 0xa3, 0x0, - 0x0, 0xd0, 0xa, 0x20, 0xd0, 0x0, 0xb2, 0x0, - 0x0, 0xd6, 0x6c, 0x20, 0xd0, 0x48, 0xe0, 0x0, - 0x0, 0xd0, 0xa, 0x20, 0xd0, 0x4, 0x20, 0x0, - 0x0, 0xd0, 0xa, 0x20, 0xd6, 0x55, 0x7c, 0x0, - 0x0, 0xd6, 0x6c, 0x20, 0xd3, 0x30, 0x78, 0x0, - 0x0, 0xc0, 0xa, 0x20, 0xd0, 0x70, 0xb2, 0x0, - 0x0, 0xc0, 0xa, 0x20, 0xd0, 0x74, 0xb0, 0x0, - 0x0, 0xb0, 0xa, 0x20, 0xd0, 0x1e, 0x30, 0x0, - 0x4, 0x60, 0xa, 0x20, 0xd0, 0x5a, 0xa0, 0x0, - 0x8, 0x4, 0x4c, 0x20, 0xd4, 0x60, 0x6e, 0x81, - 0x23, 0x0, 0x8c, 0x0, 0xe2, 0x0, 0x3, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - - /* U+671B "望" */ - 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0xc3, 0x0, 0x4a, 0x66, 0x6e, 0x30, 0x12, - 0x26, 0x25, 0x64, 0x80, 0x0, 0xd0, 0x3, 0x4d, - 0x44, 0x43, 0x4b, 0x66, 0x6e, 0x0, 0x0, 0xd0, - 0x0, 0x4, 0x70, 0x0, 0xd0, 0x0, 0xd, 0x0, - 0x34, 0x69, 0x66, 0x6e, 0x0, 0x1, 0xea, 0x93, - 0xa, 0x20, 0x0, 0xd0, 0x0, 0x1b, 0x30, 0x5, - 0x60, 0x4, 0xbc, 0x0, 0x0, 0x0, 0x4, 0x30, - 0x0, 0x2, 0x80, 0x0, 0x76, 0x66, 0x67, 0xd6, - 0x66, 0x66, 0x10, 0x0, 0x0, 0x0, 0x2b, 0x0, - 0x24, 0x0, 0x0, 0x6, 0x76, 0x67, 0xd6, 0x67, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, - 0x0, 0x4, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6c, - 0xc0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+671D "朝" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa2, 0x2, 0x32, 0xb6, 0x6c, 0x60, 0x56, - 0x6c, 0x76, 0x76, 0x2b, 0x0, 0xa2, 0x0, 0x0, - 0xa2, 0x0, 0x1, 0xb0, 0xa, 0x20, 0xb, 0x6a, - 0x76, 0xe1, 0x1b, 0x0, 0xa2, 0x0, 0xd0, 0x0, - 0xd, 0x1, 0xd6, 0x6c, 0x20, 0xd, 0x66, 0x66, - 0xd0, 0x1b, 0x0, 0xa2, 0x0, 0xd0, 0x0, 0xd, - 0x2, 0xa0, 0xa, 0x20, 0xd, 0x67, 0x66, 0xd0, - 0x3c, 0x66, 0xc2, 0x0, 0x70, 0xa2, 0x3, 0x5, - 0x80, 0xa, 0x21, 0x66, 0x6c, 0x76, 0xa6, 0x94, - 0x0, 0xa2, 0x0, 0x0, 0xa2, 0x0, 0xc, 0x0, - 0xa, 0x20, 0x0, 0xa, 0x20, 0x8, 0x30, 0x20, - 0xb2, 0x0, 0x0, 0xa3, 0x5, 0x40, 0x2, 0xbe, - 0x0, 0x0, 0x3, 0x0, 0x10, 0x0, 0x0, 0x10, - - /* U+671F "期" */ - 0x0, 0xa, 0x10, 0x94, 0x0, 0x0, 0x0, 0x20, - 0x0, 0xe, 0x0, 0xb2, 0x2, 0xc6, 0x67, 0xd0, - 0x4, 0x6e, 0x66, 0xd9, 0xb3, 0xc0, 0x2, 0xb0, - 0x0, 0xe, 0x0, 0xb2, 0x1, 0xc0, 0x2, 0xb0, - 0x0, 0xe, 0x66, 0xd2, 0x1, 0xd6, 0x67, 0xb0, - 0x0, 0xe, 0x0, 0xb2, 0x1, 0xc0, 0x2, 0xb0, - 0x0, 0xe, 0x0, 0xb2, 0x1, 0xc0, 0x2, 0xb0, - 0x0, 0xe, 0x66, 0xd2, 0x2, 0xb0, 0x2, 0xb0, - 0x0, 0xe, 0x0, 0xb3, 0x23, 0xd5, 0x57, 0xb0, - 0x5, 0x69, 0x66, 0x89, 0x86, 0x90, 0x2, 0xb0, - 0x0, 0x8, 0x70, 0x70, 0x9, 0x60, 0x2, 0xb0, - 0x0, 0x2d, 0x10, 0x5c, 0x1d, 0x0, 0x2, 0xb0, - 0x0, 0xa1, 0x0, 0x7, 0x93, 0x0, 0x3, 0xb0, - 0x7, 0x10, 0x0, 0x7, 0x30, 0x1, 0x7f, 0x80, - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x3, 0x0, - - /* U+6728 "木" */ - 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x6, 0x0, - 0x7, 0x66, 0x66, 0x9f, 0x86, 0x66, 0x8b, 0x40, - 0x0, 0x0, 0x0, 0xef, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xbd, 0x37, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x2d, 0x1a, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x87, 0xd, 0x13, 0xb0, 0x0, 0x0, - 0x0, 0x4, 0xb0, 0xd, 0x10, 0x8a, 0x0, 0x0, - 0x0, 0x2a, 0x0, 0xd, 0x10, 0xb, 0xd5, 0x0, - 0x3, 0x80, 0x0, 0xd, 0x10, 0x0, 0xaf, 0x80, - 0x24, 0x0, 0x0, 0xe, 0x20, 0x0, 0x2, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, - - /* U+672A "未" */ - 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x30, 0x8, 0x40, 0x0, 0x1, - 0x86, 0x66, 0xd8, 0x66, 0x65, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0x40, 0x6, 0x66, 0x66, - 0x8e, 0x96, 0x66, 0x8b, 0x20, 0x0, 0x0, 0xd, - 0xe6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8, 0x9b, - 0x39, 0x0, 0x0, 0x0, 0x0, 0x4, 0xb0, 0xb3, - 0x2b, 0x0, 0x0, 0x0, 0x3, 0xb0, 0xb, 0x30, - 0x6c, 0x20, 0x0, 0x5, 0x80, 0x0, 0xb3, 0x0, - 0x7f, 0x82, 0x6, 0x30, 0x0, 0xb, 0x30, 0x0, - 0x4d, 0x50, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x0, - - /* U+672B "末" */ - 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x30, 0x0, 0x3a, 0x0, 0x76, - 0x66, 0x66, 0xd8, 0x66, 0x66, 0x62, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0x0, 0x43, 0x0, 0x0, 0x37, 0x66, - 0xaf, 0xa6, 0x67, 0x70, 0x0, 0x0, 0x0, 0x1e, - 0xd5, 0x60, 0x0, 0x0, 0x0, 0x0, 0xb, 0x5b, - 0x38, 0x20, 0x0, 0x0, 0x0, 0x8, 0x70, 0xb3, - 0xc, 0x20, 0x0, 0x0, 0x7, 0x80, 0xb, 0x30, - 0x3e, 0x60, 0x0, 0x8, 0x50, 0x0, 0xb3, 0x0, - 0x3e, 0xe7, 0x16, 0x10, 0x0, 0xb, 0x30, 0x0, - 0x16, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x0, - - /* U+672C "本" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x1, 0x0, - 0x5, 0x66, 0x66, 0x6c, 0x96, 0x66, 0x7e, 0x30, - 0x0, 0x0, 0x0, 0x8f, 0x72, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xec, 0x47, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x7a, 0x46, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x3c, 0xa, 0x40, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0xa, 0x40, 0x4c, 0x10, 0x0, - 0x0, 0xa, 0x30, 0xa, 0x40, 0x7, 0xe4, 0x0, - 0x0, 0x93, 0x66, 0x6c, 0x86, 0xa8, 0x7f, 0x90, - 0x26, 0x0, 0x0, 0xa, 0x40, 0x0, 0x3, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, 0x0, - - /* U+672D "札" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe3, 0x0, 0xc, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x0, - 0x5, 0x66, 0xe6, 0x9a, 0xd, 0x10, 0x0, 0x0, - 0x1, 0x0, 0xf1, 0x0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x4, 0xf2, 0x0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x9, 0xf9, 0x91, 0xd, 0x10, 0x0, 0x0, - 0x0, 0xc, 0xe1, 0xba, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x74, 0xe1, 0x16, 0xd, 0x10, 0x0, 0x0, - 0x0, 0xa0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x0, - 0x6, 0x0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x50, - 0x2, 0x0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x80, - 0x0, 0x0, 0xe1, 0x0, 0xd, 0x20, 0x2, 0xe1, - 0x0, 0x0, 0xe1, 0x0, 0x9, 0xdc, 0xcd, 0xb0, - 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+673A "机" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0xa, 0x66, 0x6c, 0x40, 0x0, - 0x0, 0xc, 0x10, 0xd, 0x10, 0xe, 0x0, 0x0, - 0x0, 0xc, 0x17, 0xd, 0x10, 0xe, 0x0, 0x0, - 0x16, 0x6f, 0x66, 0x2c, 0x10, 0xe, 0x0, 0x0, - 0x0, 0x2f, 0x10, 0xc, 0x10, 0xe, 0x0, 0x0, - 0x0, 0x6f, 0x84, 0xc, 0x10, 0xe, 0x0, 0x0, - 0x0, 0xbe, 0x1c, 0x6c, 0x10, 0xe, 0x0, 0x0, - 0x1, 0x9c, 0x11, 0x4d, 0x0, 0xe, 0x0, 0x0, - 0x7, 0x2c, 0x10, 0xd, 0x0, 0xe, 0x0, 0x0, - 0x6, 0xc, 0x10, 0x39, 0x0, 0xe, 0x0, 0x20, - 0x40, 0xc, 0x10, 0x84, 0x0, 0xe, 0x0, 0x60, - 0x0, 0xc, 0x10, 0xa0, 0x0, 0xe, 0x1, 0xa0, - 0x0, 0xd, 0x27, 0x10, 0x0, 0xa, 0xdd, 0xc0, - 0x0, 0xa, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6750 "材" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x1, 0xf2, 0x0, 0x0, 0x2, 0xe1, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1, 0xd0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1, 0xd0, 0x0, - 0x5, 0x66, 0xf6, 0xc5, 0x46, 0x67, 0xe7, 0xd1, - 0x0, 0x2, 0xe0, 0x0, 0x0, 0x8, 0xd0, 0x0, - 0x0, 0x7, 0xf6, 0x0, 0x0, 0x1e, 0xd0, 0x0, - 0x0, 0xc, 0xe3, 0xd1, 0x0, 0x89, 0xd0, 0x0, - 0x0, 0x3b, 0xe0, 0x95, 0x3, 0xc1, 0xd0, 0x0, - 0x0, 0xa3, 0xe0, 0x0, 0xb, 0x11, 0xd0, 0x0, - 0x2, 0x70, 0xe0, 0x0, 0x92, 0x1, 0xd0, 0x0, - 0x7, 0x0, 0xe0, 0x7, 0x20, 0x1, 0xd0, 0x0, - 0x10, 0x0, 0xf0, 0x20, 0x0, 0x1, 0xd0, 0x0, - 0x0, 0x0, 0xf0, 0x0, 0x2, 0x34, 0xd0, 0x0, - 0x0, 0x1, 0xf0, 0x0, 0x0, 0x5e, 0x90, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x2, 0x0, 0x0, - - /* U+6751 "村" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x1, 0xf2, 0x0, 0x0, 0x0, 0xf2, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x5, 0x66, 0xf6, 0xc4, 0x46, 0x66, 0xf7, 0xc1, - 0x0, 0x4, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x8, 0xf4, 0x0, 0x20, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0xe6, 0xb0, 0x76, 0x0, 0xe0, 0x0, - 0x0, 0x39, 0xe0, 0xb5, 0xe, 0x30, 0xe0, 0x0, - 0x0, 0xa2, 0xe0, 0x11, 0x8, 0x40, 0xe0, 0x0, - 0x2, 0x70, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x7, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x1, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0xf0, 0x0, 0x3, 0x33, 0xe0, 0x0, - 0x0, 0x1, 0xf0, 0x0, 0x0, 0x5e, 0xb0, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x2, 0x0, 0x0, - - /* U+675F "束" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x20, 0x0, 0x5, 0x20, 0x66, - 0x66, 0x66, 0xd7, 0x66, 0x66, 0x75, 0x0, 0x0, - 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc6, - 0x66, 0xd7, 0x66, 0x6e, 0x10, 0x0, 0xf, 0x0, - 0xc, 0x20, 0x1, 0xd0, 0x0, 0x0, 0xf0, 0x0, - 0xc2, 0x0, 0x1d, 0x0, 0x0, 0xf, 0x66, 0x6d, - 0x76, 0x66, 0xe0, 0x0, 0x0, 0xf0, 0xd, 0xe6, - 0x30, 0x19, 0x0, 0x0, 0x1, 0x9, 0x7c, 0x29, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xa0, 0xc2, 0x1b, - 0x10, 0x0, 0x0, 0x5, 0x90, 0xc, 0x20, 0x3d, - 0x60, 0x0, 0x7, 0x60, 0x0, 0xc2, 0x0, 0x2d, - 0xf7, 0x16, 0x20, 0x0, 0xd, 0x30, 0x0, 0x5, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - - /* U+6761 "条" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xb0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x86, 0x66, 0x6f, 0x50, 0x0, - 0x0, 0x0, 0x89, 0x30, 0x0, 0x9b, 0x0, 0x0, - 0x0, 0x4, 0x80, 0x71, 0x4, 0xe1, 0x0, 0x0, - 0x0, 0x27, 0x0, 0xb, 0x5e, 0x30, 0x0, 0x0, - 0x0, 0x40, 0x0, 0x9, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xb7, 0x5b, 0xd8, 0x42, 0x10, - 0x2, 0x57, 0x73, 0x0, 0xf2, 0x39, 0xdf, 0xa2, - 0x2, 0x0, 0x0, 0x0, 0xe0, 0x1, 0x80, 0x0, - 0x0, 0x6, 0x76, 0x66, 0xf6, 0x66, 0x62, 0x0, - 0x0, 0x0, 0xd, 0x40, 0xe1, 0x61, 0x0, 0x0, - 0x0, 0x0, 0xb8, 0x0, 0xe0, 0x1c, 0x60, 0x0, - 0x0, 0x9, 0x50, 0x0, 0xe0, 0x1, 0xd9, 0x0, - 0x1, 0x72, 0x2, 0x8d, 0xc0, 0x0, 0x3a, 0x0, - 0x1, 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, 0x0, - - /* U+6765 "来" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x56, 0x66, 0x6d, 0x86, 0x66, 0xca, 0x0, - 0x0, 0x23, 0x0, 0xb, 0x30, 0x6, 0x10, 0x0, - 0x0, 0x1, 0xc3, 0xb, 0x30, 0x2e, 0x40, 0x0, - 0x0, 0x0, 0x6c, 0xb, 0x30, 0xa4, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xb, 0x34, 0x40, 0xa, 0x30, - 0x28, 0x66, 0x66, 0xbf, 0xb6, 0x66, 0x66, 0x50, - 0x0, 0x0, 0x1, 0xed, 0x47, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x5b, 0x36, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x88, 0xb, 0x30, 0xb6, 0x0, 0x0, - 0x0, 0x6, 0x90, 0xb, 0x30, 0xc, 0xb2, 0x0, - 0x0, 0x76, 0x0, 0xb, 0x30, 0x0, 0xaf, 0x90, - 0x16, 0x20, 0x0, 0xc, 0x40, 0x0, 0x3, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, - - /* U+676F "杯" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x46, 0x66, 0x66, 0x69, 0xb0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xa5, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x70, 0x0, 0xe0, 0x0, 0x0, - 0x6, 0x66, 0xe6, 0x62, 0x6, 0x80, 0x0, 0x0, - 0x0, 0x5, 0xe2, 0x0, 0xd, 0xb1, 0x0, 0x0, - 0x0, 0xb, 0xe9, 0x50, 0x59, 0xe2, 0x0, 0x0, - 0x0, 0x2a, 0xe1, 0xe0, 0xc1, 0xd1, 0x92, 0x0, - 0x0, 0x91, 0xe0, 0x39, 0x30, 0xd0, 0x2e, 0x30, - 0x3, 0x60, 0xe0, 0x54, 0x0, 0xd0, 0x8, 0x80, - 0x5, 0x0, 0xe2, 0x30, 0x0, 0xd0, 0x0, 0x10, - 0x10, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x1, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x70, 0x0, 0x0, 0x50, 0x0, 0x0, - - /* U+6771 "東" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x9, 0x0, 0x57, - 0x66, 0x66, 0xe6, 0x66, 0x66, 0x62, 0x0, 0x4, - 0x0, 0xd, 0x0, 0x1, 0x60, 0x0, 0x0, 0xd6, - 0x66, 0xe6, 0x66, 0x8d, 0x0, 0x0, 0xd, 0x10, - 0xd, 0x0, 0x3, 0xa0, 0x0, 0x0, 0xc6, 0x66, - 0xe6, 0x66, 0x8a, 0x0, 0x0, 0xd, 0x10, 0xd, - 0x0, 0x3, 0xb0, 0x0, 0x0, 0xd6, 0x6d, 0xfa, - 0x66, 0x78, 0x0, 0x0, 0x1, 0x4, 0xbd, 0x26, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xc1, 0xd0, 0x74, - 0x0, 0x0, 0x0, 0x0, 0xa2, 0xd, 0x0, 0xa6, - 0x0, 0x0, 0x1, 0x92, 0x0, 0xd1, 0x0, 0x9d, - 0x62, 0x4, 0x70, 0x0, 0xd, 0x10, 0x0, 0x4c, - 0x51, 0x20, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, - - /* U+6790 "析" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc3, 0x0, 0x0, 0x0, 0x39, 0x50, 0x0, - 0xd, 0x10, 0x9, 0x65, 0x76, 0x53, 0x0, 0x0, - 0xc1, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x16, 0x6e, - 0x6c, 0x3a, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe1, - 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, - 0xa, 0x86, 0x67, 0x6b, 0x70, 0x7, 0xf9, 0x80, - 0xa3, 0x0, 0xc1, 0x0, 0x0, 0xbd, 0x1d, 0x2a, - 0x20, 0xc, 0x10, 0x0, 0x27, 0xc1, 0x20, 0xc1, - 0x0, 0xc1, 0x0, 0x7, 0xc, 0x10, 0xd, 0x0, - 0xc, 0x10, 0x2, 0x20, 0xc1, 0x2, 0xb0, 0x0, - 0xc1, 0x0, 0x0, 0xd, 0x10, 0x75, 0x0, 0xd, - 0x10, 0x0, 0x0, 0xd1, 0x1a, 0x0, 0x0, 0xd1, - 0x0, 0x0, 0xd, 0x27, 0x0, 0x0, 0xd, 0x20, - 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, 0x30, 0x0, - - /* U+6797 "林" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe2, 0x0, 0x0, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x1, 0x0, - 0x4, 0x66, 0xe8, 0xb3, 0x66, 0xe6, 0x6d, 0x40, - 0x0, 0x1, 0xe0, 0x0, 0x8, 0xe3, 0x0, 0x0, - 0x0, 0x5, 0xf1, 0x0, 0xd, 0xe6, 0x0, 0x0, - 0x0, 0xb, 0xe9, 0x50, 0x3a, 0xe7, 0x0, 0x0, - 0x0, 0x2a, 0xe1, 0xe0, 0xa2, 0xe2, 0x70, 0x0, - 0x0, 0x91, 0xe0, 0x34, 0x70, 0xe0, 0xb2, 0x0, - 0x3, 0x50, 0xe0, 0x9, 0x0, 0xe0, 0x3e, 0x20, - 0x5, 0x0, 0xe0, 0x70, 0x0, 0xe0, 0x8, 0xc2, - 0x0, 0x0, 0xe2, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xf0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x30, 0x0, 0x0, - - /* U+679C "果" */ - 0x0, 0x8, 0x66, 0x66, 0x66, 0x66, 0xa0, 0x0, - 0x0, 0xd1, 0x0, 0xd1, 0x0, 0x3c, 0x0, 0x0, - 0xc, 0x10, 0xd, 0x10, 0x3, 0xb0, 0x0, 0x0, - 0xc6, 0x66, 0xe6, 0x66, 0x7b, 0x0, 0x0, 0xc, - 0x10, 0xd, 0x10, 0x3, 0xb0, 0x0, 0x0, 0xd1, - 0x0, 0xd1, 0x0, 0x3b, 0x0, 0x0, 0xd, 0x66, - 0x6e, 0x66, 0x67, 0xa0, 0x0, 0x0, 0x10, 0x0, - 0xd1, 0x0, 0x0, 0x70, 0x6, 0x76, 0x66, 0xcf, - 0x96, 0x66, 0x68, 0x30, 0x0, 0x0, 0x6a, 0xd7, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xd, 0x1a, - 0x40, 0x0, 0x0, 0x0, 0x4a, 0x0, 0xd1, 0xb, - 0x81, 0x0, 0x0, 0x76, 0x0, 0xe, 0x10, 0x8, - 0xe9, 0x31, 0x61, 0x0, 0x0, 0xe1, 0x0, 0x3, - 0x80, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, - 0x0, - - /* U+67D0 "某" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x10, 0x0, 0xc3, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xd1, 0x5, 0x20, - 0x3, 0x76, 0x6e, 0x66, 0x66, 0xd6, 0x68, 0x70, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x66, 0x66, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x66, 0x66, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x1, 0xc0, 0x40, 0x0, 0x10, - 0x5, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6a, 0xd2, - 0x0, 0x0, 0x0, 0xba, 0xc6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xb2, 0xc3, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x6b, 0x1, 0xc0, 0x6a, 0x20, 0x0, - 0x0, 0x9, 0x70, 0x2, 0xc0, 0x5, 0xfa, 0x61, - 0x5, 0x72, 0x0, 0x2, 0xc0, 0x0, 0x1a, 0x91, - 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, - - /* U+67E5 "查" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x9, 0x30, - 0x3, 0x76, 0x66, 0x7f, 0xd9, 0x66, 0x66, 0x50, - 0x0, 0x0, 0x0, 0xc7, 0xb4, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0x52, 0xb0, 0x78, 0x0, 0x0, - 0x0, 0x3, 0xa2, 0x3, 0xb0, 0x7, 0xd7, 0x20, - 0x1, 0x66, 0xa6, 0x66, 0x66, 0x6b, 0x6b, 0x91, - 0x4, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x6, 0x2, 0x0, - 0x2, 0x66, 0x66, 0x66, 0x66, 0x66, 0x8f, 0x60, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+67F1 "柱" */ - 0x0, 0x9, 0x30, 0x0, 0x6, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x5, 0xd0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x0, 0xe2, 0x0, 0x0, - 0x0, 0xc, 0x17, 0x15, 0x55, 0x65, 0x5c, 0x80, - 0x18, 0x6e, 0x66, 0x23, 0x11, 0xe1, 0x11, 0x10, - 0x0, 0x1f, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x5f, 0x94, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0xae, 0x2f, 0x20, 0x0, 0xe0, 0x7, 0x0, - 0x2, 0x9c, 0x15, 0x17, 0x66, 0xe6, 0x67, 0x20, - 0x7, 0x1c, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x23, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x10, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x3, 0x20, - 0x0, 0xd, 0x13, 0x76, 0x66, 0xa6, 0x69, 0x90, - 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+67FB "査" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x1, 0x0, - 0x4, 0x66, 0x66, 0x6c, 0x86, 0x66, 0x7f, 0x40, - 0x1, 0x10, 0x0, 0xae, 0x64, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x8a, 0x37, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x87, 0xa, 0x40, 0x8a, 0x30, 0x0, - 0x0, 0x29, 0x30, 0xb, 0x30, 0x5, 0xed, 0x90, - 0x5, 0x50, 0x96, 0x67, 0x66, 0x6d, 0x35, 0x20, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xc6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xc6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe, 0x2, 0x0, - 0x15, 0x66, 0xd6, 0x66, 0x66, 0x6e, 0x6e, 0xa0, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+67FF "柿" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x0, 0x8, 0x20, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x3, 0xf1, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x0, 0x90, 0x4, 0x10, - 0x0, 0xc, 0x16, 0x57, 0x66, 0xc6, 0x68, 0x60, - 0x16, 0x6f, 0x66, 0x20, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x1f, 0x10, 0x4, 0x0, 0xe0, 0x6, 0x0, - 0x0, 0x6f, 0x93, 0xe, 0x66, 0xe6, 0x6f, 0x10, - 0x0, 0xbe, 0x3e, 0xd, 0x0, 0xe0, 0xe, 0x0, - 0x1, 0x9c, 0x14, 0xd, 0x0, 0xe0, 0xe, 0x0, - 0x7, 0x2c, 0x10, 0xd, 0x0, 0xe0, 0xe, 0x0, - 0x15, 0xc, 0x10, 0xd, 0x0, 0xe0, 0xe, 0x0, - 0x10, 0xd, 0x10, 0xd, 0x0, 0xe3, 0xad, 0x0, - 0x0, 0xd, 0x10, 0x4, 0x0, 0xe0, 0x33, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x7, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, - - /* U+6811 "树" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0xb3, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xc, 0x12, 0x66, 0x6d, 0x10, 0xe0, 0x0, - 0x0, 0xc, 0x16, 0x0, 0x3b, 0x22, 0xe4, 0x70, - 0x16, 0x6e, 0x66, 0x20, 0x76, 0x44, 0xe4, 0x40, - 0x0, 0x1f, 0x10, 0x51, 0xb2, 0x0, 0xe0, 0x0, - 0x0, 0x5f, 0x94, 0x9, 0xc2, 0x40, 0xe0, 0x0, - 0x0, 0xae, 0x2e, 0x9, 0x80, 0xc1, 0xe0, 0x0, - 0x1, 0x9c, 0x13, 0xc, 0xd0, 0x85, 0xe0, 0x0, - 0x7, 0x1c, 0x10, 0x74, 0xa5, 0x21, 0xe0, 0x0, - 0x14, 0xc, 0x12, 0x70, 0x56, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0x27, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0x20, 0x0, 0x1, 0x10, 0xe0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x1, 0x7f, 0xd0, 0x0, - 0x0, 0x6, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, - - /* U+6821 "校" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x30, 0x0, 0xa, 0x10, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x6, 0xc0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x45, 0x55, 0xc5, 0x5c, 0x70, - 0x16, 0x6e, 0x6c, 0x51, 0x31, 0x11, 0x11, 0x0, - 0x0, 0xe, 0x10, 0x0, 0xe6, 0x5, 0x50, 0x0, - 0x0, 0x2f, 0x93, 0x9, 0x60, 0x0, 0x9c, 0x10, - 0x0, 0x7f, 0x3d, 0x46, 0x0, 0x3, 0x1b, 0x60, - 0x0, 0xbd, 0x14, 0x42, 0x20, 0xa, 0xb1, 0x20, - 0x4, 0x6c, 0x10, 0x0, 0x60, 0xe, 0x20, 0x0, - 0x7, 0xc, 0x10, 0x0, 0x62, 0x78, 0x0, 0x0, - 0x22, 0xd, 0x10, 0x0, 0xa, 0xc0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x1c, 0xc1, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x3, 0xa2, 0x5e, 0x82, 0x0, - 0x0, 0xd, 0x23, 0x75, 0x0, 0x1, 0x9f, 0xb1, - 0x0, 0x2, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+682A "株" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x40, 0x0, 0x1, 0xc2, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x6, 0x80, 0xd0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0xa, 0x50, 0xd0, 0x3, 0x0, - 0x5, 0x6e, 0x7d, 0x2c, 0x66, 0xe6, 0x79, 0x10, - 0x1, 0xe, 0x10, 0x46, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x2f, 0x20, 0x50, 0x0, 0xd0, 0x0, 0x10, - 0x0, 0x7f, 0xa7, 0x56, 0x66, 0xe6, 0x68, 0xc1, - 0x0, 0xbd, 0x2d, 0x0, 0x1e, 0xd5, 0x0, 0x0, - 0x4, 0x6d, 0x10, 0x0, 0x88, 0xd7, 0x10, 0x0, - 0x8, 0xd, 0x10, 0x2, 0xc0, 0xd1, 0xa0, 0x0, - 0x22, 0xd, 0x10, 0xb, 0x10, 0xd0, 0x96, 0x0, - 0x0, 0xd, 0x10, 0x83, 0x0, 0xd0, 0xd, 0xa1, - 0x0, 0xd, 0x16, 0x20, 0x0, 0xd0, 0x2, 0x71, - 0x0, 0xd, 0x20, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x5, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, - - /* U+6839 "根" */ - 0x0, 0xa, 0x30, 0x2, 0x0, 0x0, 0x40, 0x0, - 0x0, 0xd, 0x10, 0x1e, 0x66, 0x66, 0xe4, 0x0, - 0x0, 0xc, 0x10, 0xd, 0x0, 0x0, 0xe0, 0x0, - 0x2, 0x2d, 0x37, 0x2d, 0x0, 0x0, 0xe0, 0x0, - 0x14, 0x4e, 0x44, 0x2e, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0x1f, 0x20, 0xd, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x6f, 0x95, 0xe, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0xad, 0x2e, 0xd, 0x6, 0x0, 0x56, 0x0, - 0x2, 0x7c, 0x13, 0xd, 0x6, 0x0, 0xca, 0x10, - 0x7, 0xd, 0x10, 0xd, 0x5, 0x58, 0x30, 0x0, - 0x22, 0xd, 0x10, 0xd, 0x0, 0xb0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0xd, 0x0, 0x6a, 0x0, 0x0, - 0x0, 0xd, 0x10, 0xd, 0x37, 0x19, 0xd4, 0x0, - 0x0, 0xd, 0x10, 0x2f, 0x80, 0x0, 0x7f, 0x90, - 0x0, 0x5, 0x0, 0x4, 0x0, 0x0, 0x1, 0x0, - - /* U+683C "格" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x30, 0x0, 0xc6, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x1, 0xe0, 0x0, 0x20, 0x0, - 0x0, 0xd, 0x0, 0x8, 0xb6, 0x67, 0xe2, 0x0, - 0x5, 0x6e, 0x6c, 0x39, 0x60, 0x9, 0x60, 0x0, - 0x0, 0xf, 0x0, 0x71, 0x27, 0x4c, 0x0, 0x0, - 0x0, 0x3f, 0x21, 0x10, 0x9, 0xd1, 0x0, 0x0, - 0x0, 0x8f, 0x77, 0x0, 0x1c, 0xc4, 0x0, 0x0, - 0x0, 0xad, 0xc, 0x3, 0xa1, 0x1c, 0xa4, 0x0, - 0x3, 0x5d, 0x0, 0x79, 0x0, 0x0, 0x9d, 0xa1, - 0x7, 0xd, 0x25, 0xd, 0x66, 0x66, 0xf1, 0x0, - 0x22, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0x7, 0x0, 0x7, 0x0, 0x0, 0x50, 0x0, - - /* U+6843 "桃" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x30, 0x0, 0xa4, 0x2c, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xd0, 0x1b, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xc0, 0x1b, 0x0, 0x0, - 0x5, 0x6e, 0x79, 0x50, 0xc0, 0x1b, 0xc, 0x20, - 0x0, 0xe, 0x0, 0x75, 0xc0, 0x1b, 0x66, 0x0, - 0x0, 0x2f, 0x20, 0x49, 0xc0, 0x1d, 0x40, 0x0, - 0x0, 0x7f, 0x87, 0x1, 0xc0, 0x1b, 0x0, 0x0, - 0x0, 0xbe, 0xc, 0x0, 0xd0, 0x1d, 0x60, 0x0, - 0x2, 0x8d, 0x0, 0x28, 0xe0, 0x1b, 0x5e, 0x20, - 0x8, 0xd, 0x6, 0xc0, 0xe0, 0x1b, 0x5, 0x40, - 0x23, 0xd, 0x2, 0x13, 0xa0, 0x1b, 0x0, 0x10, - 0x0, 0xd, 0x0, 0x9, 0x40, 0x1b, 0x0, 0x50, - 0x0, 0xd, 0x0, 0x3a, 0x0, 0x1c, 0x2, 0x80, - 0x0, 0xd, 0x2, 0x90, 0x0, 0xc, 0xcd, 0xa0, - 0x0, 0x8, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6848 "案" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1a, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x4, 0x50, 0x0, 0x4, 0x0, - 0x0, 0x69, 0x66, 0x7c, 0x66, 0x66, 0x6e, 0x30, - 0x1, 0xd1, 0x0, 0x97, 0x0, 0x0, 0x46, 0x0, - 0x0, 0x66, 0x68, 0xc6, 0x66, 0xa6, 0x7b, 0x40, - 0x0, 0x0, 0x1c, 0x10, 0x6, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x15, 0x67, 0xae, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x6a, 0x63, 0x9e, 0x70, 0x0, - 0x0, 0x25, 0x66, 0x23, 0xa0, 0x1, 0x81, 0x0, - 0x2, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6c, 0xb0, - 0x0, 0x0, 0x0, 0x9a, 0xb7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x82, 0xb1, 0xa2, 0x0, 0x0, - 0x0, 0x2, 0xa4, 0x3, 0xb0, 0x1b, 0xb5, 0x30, - 0x2, 0x66, 0x0, 0x3, 0xc0, 0x0, 0x5c, 0xb1, - 0x3, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, - - /* U+689D "條" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xd2, 0x0, 0x1d, 0x20, 0x0, 0x0, - 0x0, 0x5, 0xb0, 0x0, 0x69, 0x0, 0x1, 0x0, - 0x0, 0xb, 0x40, 0x0, 0xc8, 0x66, 0xac, 0x0, - 0x0, 0x2d, 0x9, 0x4, 0x78, 0x2, 0xd1, 0x0, - 0x0, 0x9e, 0xd, 0x8, 0x5, 0x8c, 0x20, 0x0, - 0x2, 0x8d, 0xc, 0x10, 0x3, 0xea, 0x0, 0x0, - 0x7, 0xd, 0xc, 0x0, 0x68, 0x6, 0xe9, 0x51, - 0x0, 0xd, 0xc, 0x36, 0x20, 0xb3, 0x17, 0x80, - 0x0, 0xd, 0xc, 0x0, 0x0, 0xd0, 0x6, 0x20, - 0x0, 0xd, 0xd, 0x57, 0x66, 0xe6, 0x66, 0x40, - 0x0, 0xd, 0xd, 0x2, 0xa0, 0xd0, 0x40, 0x0, - 0x0, 0xd, 0x4, 0xa, 0x50, 0xd0, 0x4c, 0x20, - 0x0, 0xd, 0x0, 0x66, 0x0, 0xd0, 0x7, 0xc0, - 0x0, 0xe, 0x3, 0x40, 0x6b, 0xe0, 0x0, 0x50, - 0x0, 0x5, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, - - /* U+68B0 "械" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x0, 0xa4, 0x62, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0xa2, 0x1e, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0xa2, 0x4, 0x10, - 0x5, 0x6e, 0x97, 0x76, 0x66, 0xc7, 0x68, 0x80, - 0x1, 0x1d, 0x0, 0x51, 0x50, 0x93, 0x0, 0x0, - 0x0, 0x3e, 0x91, 0x93, 0xb2, 0x93, 0x8, 0x50, - 0x0, 0x8e, 0x4a, 0x92, 0xb0, 0x74, 0xd, 0x30, - 0x0, 0xad, 0x18, 0xb7, 0xd9, 0x86, 0x3b, 0x0, - 0x4, 0x5d, 0x1, 0xa1, 0xb0, 0x49, 0xa3, 0x0, - 0x7, 0xd, 0x0, 0xb0, 0xb0, 0x1d, 0xb0, 0x0, - 0x21, 0xd, 0x0, 0xa0, 0xb0, 0xe, 0x40, 0x40, - 0x0, 0xd, 0x4, 0x50, 0xc0, 0x98, 0xb0, 0x70, - 0x0, 0xe, 0x8, 0x0, 0x68, 0x30, 0x8a, 0xa0, - 0x0, 0xe, 0x31, 0x2, 0x71, 0x0, 0x8, 0xe0, - 0x0, 0x3, 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, - - /* U+68EE "森" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x65, 0x0, - 0x3, 0x76, 0x66, 0xcf, 0xb7, 0x66, 0x65, 0x0, - 0x0, 0x0, 0x4, 0xcb, 0x49, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4b, 0x1a, 0x32, 0xc3, 0x0, 0x0, - 0x0, 0x6, 0x80, 0xa, 0x40, 0x3d, 0xc6, 0x10, - 0x2, 0x63, 0xa1, 0xb, 0x40, 0xd3, 0x6a, 0x30, - 0x1, 0x0, 0xd0, 0x52, 0x0, 0xd0, 0x6, 0x0, - 0x6, 0x68, 0xf6, 0x64, 0x6b, 0xf9, 0x67, 0x30, - 0x0, 0x9, 0xf6, 0x0, 0xd, 0xe7, 0x0, 0x0, - 0x0, 0x39, 0xd4, 0xd0, 0x95, 0xd3, 0xa0, 0x0, - 0x0, 0x90, 0xd0, 0x45, 0x70, 0xd0, 0x99, 0x0, - 0x6, 0x0, 0xd0, 0x36, 0x0, 0xd0, 0xc, 0x80, - 0x10, 0x0, 0xe0, 0x20, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x60, 0x0, 0x0, 0x60, 0x0, 0x0, - - /* U+690D "植" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x40, 0x0, 0x9, 0x40, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0xb, 0x20, 0x1, 0x0, - 0x0, 0xd, 0x10, 0x76, 0x6d, 0x76, 0x7d, 0x30, - 0x4, 0x4d, 0x69, 0x0, 0xb, 0x10, 0x0, 0x0, - 0x3, 0x2e, 0x22, 0xa, 0x6c, 0x66, 0xb2, 0x0, - 0x0, 0x1f, 0x40, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x6f, 0x7a, 0xe, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0xad, 0x1a, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x2, 0x7d, 0x10, 0xd, 0x66, 0x66, 0xe0, 0x0, - 0x7, 0xd, 0x10, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x14, 0xd, 0x10, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x10, 0xd, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0xd, 0x10, 0xd, 0x0, 0x0, 0xd3, 0x30, - 0x0, 0xd, 0x27, 0x67, 0x66, 0x66, 0x77, 0x70, - 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+691C "検" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x40, 0x0, 0x9, 0x90, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x1e, 0x80, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0xa6, 0x1a, 0x20, 0x0, - 0x14, 0x4d, 0x5b, 0x16, 0x70, 0x1, 0xc9, 0x30, - 0x2, 0x2e, 0x32, 0x66, 0x66, 0x66, 0xc9, 0x90, - 0x0, 0x2f, 0x41, 0x20, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x7f, 0x99, 0xb, 0x66, 0xd6, 0x6c, 0x10, - 0x0, 0xbd, 0x1c, 0xd, 0x1, 0xb0, 0xd, 0x0, - 0x2, 0x7c, 0x10, 0xd, 0x2, 0xa0, 0xd, 0x0, - 0x7, 0xd, 0x10, 0xe, 0x68, 0xd6, 0x6d, 0x0, - 0x23, 0xd, 0x10, 0x4, 0x9, 0x95, 0x1, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x2c, 0xa, 0x30, 0x0, - 0x0, 0xd, 0x10, 0x1, 0xb2, 0x1, 0xc6, 0x0, - 0x0, 0xd, 0x10, 0x39, 0x10, 0x0, 0x1c, 0xb1, - 0x0, 0x6, 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+695A "楚" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x2c, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x10, 0x2, 0xb0, 0x0, 0x0, 0x66, - 0x6e, 0x6a, 0x36, 0x9c, 0x69, 0x60, 0x0, 0xa, - 0xe4, 0x0, 0x1e, 0xc1, 0x0, 0x0, 0x4, 0xad, - 0x5a, 0xa, 0x5b, 0x88, 0x0, 0x1, 0xa0, 0xd0, - 0x48, 0x42, 0xb0, 0xa5, 0x1, 0x70, 0xe, 0x6, - 0x20, 0x2b, 0x0, 0x0, 0x14, 0x66, 0x76, 0x66, - 0x66, 0x66, 0xa3, 0x0, 0x11, 0x0, 0x0, 0xd0, - 0x0, 0x48, 0x20, 0x0, 0x5, 0xc0, 0xd, 0x0, - 0x3, 0x0, 0x0, 0x0, 0xa6, 0x0, 0xd6, 0x66, - 0x87, 0x0, 0x0, 0x1c, 0x80, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x33, 0x91, 0xd0, 0x0, 0x0, - 0x0, 0x4, 0x60, 0x3, 0xce, 0x54, 0x34, 0x46, - 0x42, 0x60, 0x0, 0x0, 0x5a, 0xce, 0xff, 0xc0, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+696D "業" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x42, 0x0, 0xc1, 0xc, 0x30, 0x50, 0x0, - 0x0, 0xb, 0x80, 0xd0, 0xd, 0xa, 0x90, 0x0, - 0x0, 0x1, 0xd0, 0xd0, 0xd, 0x63, 0x0, 0x0, - 0x4, 0x66, 0x66, 0xd6, 0x6d, 0x66, 0x6a, 0xa0, - 0x0, 0x0, 0x19, 0x20, 0x6, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x90, 0x8, 0x0, 0x61, 0x0, - 0x0, 0x26, 0x66, 0x6a, 0x76, 0x66, 0x95, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x30, 0x5, 0x30, 0x0, - 0x0, 0x5, 0x66, 0x6c, 0x76, 0x66, 0x50, 0x0, - 0x3, 0x66, 0x66, 0x6c, 0x85, 0x55, 0x6d, 0x30, - 0x0, 0x0, 0x1, 0xce, 0x57, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x4a, 0x34, 0xa2, 0x0, 0x0, - 0x0, 0x6, 0xa1, 0xa, 0x30, 0x3c, 0xc7, 0x41, - 0x4, 0x73, 0x0, 0xa, 0x30, 0x0, 0x5b, 0x90, - 0x1, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - - /* U+6975 "極" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x16, 0x66, 0x66, 0xb4, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, - 0x15, 0x5e, 0x7a, 0x0, 0x0, 0xc2, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x86, 0x92, 0xc4, 0x66, 0x90, - 0x0, 0x2f, 0x40, 0xc0, 0xc0, 0xc0, 0x7, 0x60, - 0x0, 0x6f, 0x6a, 0xc0, 0xc0, 0xc4, 0x1c, 0x10, - 0x0, 0xbe, 0xa, 0xc0, 0xc0, 0xc0, 0x9b, 0x0, - 0x2, 0x9d, 0x0, 0xc0, 0xc0, 0xc0, 0x7c, 0x0, - 0x7, 0x1d, 0x0, 0xc6, 0xd0, 0xc0, 0x96, 0x90, - 0x14, 0xd, 0x0, 0xc0, 0x50, 0xc5, 0x20, 0x80, - 0x0, 0xd, 0x0, 0x20, 0x55, 0xc3, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, - 0x0, 0xd, 0x5, 0x66, 0x66, 0x66, 0x69, 0xd1, - 0x0, 0x6, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+697D "楽" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x7, 0x3, 0x0, 0x2, 0x0, 0x8, - 0xa1, 0xd6, 0x66, 0xd4, 0xa, 0x90, 0x0, 0x9, - 0x6c, 0x0, 0xc, 0x18, 0x30, 0x0, 0x0, 0x0, - 0xc6, 0x66, 0xd4, 0x20, 0x0, 0x0, 0x5, 0x5d, - 0x0, 0xc, 0x15, 0xb9, 0x10, 0x8b, 0x20, 0xd6, - 0x66, 0xd1, 0x0, 0x8a, 0x2, 0x0, 0xa, 0x6, - 0x28, 0x0, 0x0, 0x10, 0x56, 0x66, 0x66, 0xd7, - 0x66, 0x69, 0xe2, 0x1, 0x0, 0x0, 0xcf, 0x71, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0xc1, 0xa2, - 0x0, 0x0, 0x0, 0x1, 0xa4, 0xc, 0x11, 0xc7, - 0x10, 0x0, 0x4, 0x81, 0x0, 0xc1, 0x0, 0x9f, - 0xb6, 0x26, 0x30, 0x0, 0xc, 0x10, 0x0, 0x26, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - - /* U+6982 "概" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0xb6, 0xc4, 0x66, 0x97, 0x80, - 0x0, 0xc, 0x0, 0xc0, 0xb0, 0x0, 0xc0, 0x0, - 0x4, 0x5d, 0x95, 0xc0, 0xb0, 0x93, 0xc0, 0x0, - 0x1, 0x1d, 0x10, 0xd6, 0xc0, 0xb0, 0xc0, 0x0, - 0x0, 0x4e, 0x30, 0xc0, 0xb1, 0xa1, 0xb0, 0x0, - 0x0, 0x8e, 0x97, 0xc0, 0xb7, 0xb7, 0xc8, 0xb0, - 0x0, 0xbc, 0x1a, 0xd6, 0xb1, 0x16, 0x70, 0x0, - 0x3, 0x6c, 0x0, 0xc2, 0x10, 0xb, 0xe1, 0x0, - 0x8, 0xc, 0x0, 0xc0, 0xa1, 0x1b, 0xc0, 0x0, - 0x23, 0xc, 0x0, 0xc4, 0x98, 0x94, 0xc0, 0x0, - 0x0, 0xc, 0x0, 0xf6, 0x4, 0x90, 0xc0, 0x50, - 0x0, 0xd, 0x0, 0x40, 0x1a, 0x0, 0xc0, 0x80, - 0x0, 0xd, 0x0, 0x3, 0x70, 0x0, 0x9b, 0xd2, - 0x0, 0x4, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, - - /* U+69CB "構" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x1, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x95, 0x8, 0x70, 0x0, - 0x0, 0xc, 0x0, 0x56, 0xb7, 0x6b, 0x8c, 0x70, - 0x0, 0xc, 0x0, 0x0, 0x92, 0x8, 0x41, 0x0, - 0x2, 0x2c, 0x29, 0x36, 0xb7, 0x6b, 0x9c, 0x20, - 0x4, 0x4d, 0x44, 0x20, 0x92, 0x8, 0x42, 0x40, - 0x0, 0x3e, 0x73, 0x66, 0x76, 0xc7, 0x67, 0x70, - 0x0, 0x7d, 0x78, 0x3, 0x0, 0xc0, 0x5, 0x0, - 0x0, 0xbc, 0x16, 0x1d, 0x66, 0xd6, 0x6d, 0x0, - 0x3, 0x8c, 0x0, 0xd, 0x66, 0xd6, 0x6c, 0x0, - 0x8, 0xc, 0x0, 0xb, 0x0, 0xc0, 0xc, 0x0, - 0x23, 0xc, 0x5, 0x6d, 0x66, 0xd6, 0x6e, 0xc1, - 0x0, 0xc, 0x0, 0xb, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xc, 0x0, 0xb, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xd, 0x0, 0x1b, 0x0, 0x7, 0xd9, 0x0, - 0x0, 0x2, 0x0, 0x2, 0x0, 0x0, 0x30, 0x0, - - /* U+69D8 "様" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x20, 0x0, 0x92, 0x0, 0xb5, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x3d, 0x1, 0x91, 0x0, - 0x0, 0xc, 0x0, 0x26, 0x69, 0x98, 0x69, 0x80, - 0x2, 0x2c, 0x28, 0x0, 0x0, 0xd0, 0x1, 0x0, - 0x4, 0x4d, 0x44, 0x15, 0x66, 0xe6, 0x6b, 0x10, - 0x0, 0x1f, 0x70, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x5f, 0x5a, 0x46, 0x66, 0xd6, 0x69, 0xb0, - 0x0, 0xad, 0x7, 0x0, 0x0, 0xb3, 0x3, 0x0, - 0x1, 0x9c, 0x2, 0x66, 0x92, 0xd3, 0x1c, 0x40, - 0x7, 0x1c, 0x0, 0x0, 0xd2, 0xd7, 0x60, 0x0, - 0x23, 0xc, 0x0, 0x5, 0x80, 0xd2, 0x80, 0x0, - 0x0, 0xc, 0x0, 0xb, 0x0, 0xd0, 0xa6, 0x0, - 0x0, 0xc, 0x0, 0x92, 0x0, 0xd0, 0xd, 0xa0, - 0x0, 0xd, 0x6, 0x10, 0x7d, 0xd0, 0x1, 0x20, - 0x0, 0x2, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, - - /* U+6A02 "樂" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x7, 0x60, 0x1, 0xd1, 0x0, - 0x0, 0x3a, 0x0, 0x7a, 0x6a, 0x16, 0x70, 0x0, - 0x0, 0x91, 0x84, 0xc0, 0xc, 0xa, 0xa, 0x30, - 0x5, 0x84, 0xd2, 0xc0, 0xc, 0x76, 0x4b, 0x0, - 0x6, 0x6a, 0x40, 0xc6, 0x6c, 0x76, 0xb2, 0x0, - 0x0, 0x18, 0x20, 0xc0, 0xc, 0x3, 0x73, 0x0, - 0x0, 0x80, 0x64, 0xc6, 0x6c, 0x9, 0x7, 0x50, - 0x8, 0xd9, 0x6c, 0x92, 0x17, 0x9c, 0x85, 0xd0, - 0x0, 0x0, 0x4, 0x6, 0xa0, 0x10, 0x9, 0x30, - 0x6, 0x76, 0x66, 0xaf, 0xb8, 0x66, 0x67, 0x40, - 0x0, 0x0, 0x4, 0xd8, 0x77, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x6a, 0x16, 0x70, 0xb5, 0x0, 0x0, - 0x0, 0x29, 0x50, 0x6, 0x70, 0xa, 0xd8, 0x50, - 0x5, 0x50, 0x0, 0x6, 0x70, 0x0, 0x4b, 0x50, - 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, - - /* U+6A19 "標" */ - 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, 0x5, 0x30, - 0x0, 0xc, 0x0, 0x67, 0x6c, 0x6c, 0x66, 0x50, - 0x0, 0xc, 0x0, 0x0, 0xb, 0xb, 0x1, 0x0, - 0x16, 0x6d, 0x6c, 0x5b, 0x5c, 0x5c, 0x5d, 0x30, - 0x0, 0xf, 0x0, 0x1a, 0xb, 0xb, 0xc, 0x0, - 0x0, 0x4f, 0x60, 0x1a, 0xb, 0xb, 0xc, 0x0, - 0x0, 0x9f, 0x69, 0x2c, 0x66, 0x66, 0x69, 0x0, - 0x0, 0xac, 0x9, 0x5, 0x66, 0x66, 0x87, 0x0, - 0x6, 0x3c, 0x0, 0x1, 0x0, 0x0, 0x0, 0x20, - 0x6, 0xc, 0x1, 0x86, 0x66, 0x96, 0x66, 0xa1, - 0x20, 0xc, 0x0, 0x5, 0x50, 0xb2, 0x20, 0x0, - 0x0, 0xc, 0x0, 0x2c, 0x20, 0xb0, 0x69, 0x0, - 0x0, 0xc, 0x3, 0x90, 0x0, 0xb0, 0x9, 0x90, - 0x0, 0xc, 0x25, 0x0, 0x5a, 0xb0, 0x0, 0x50, - 0x0, 0x5, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, - - /* U+6A21 "模" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x30, 0x0, 0xc2, 0xd, 0x20, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xd0, 0xd, 0x5, 0x30, - 0x0, 0xd, 0x2, 0x66, 0xe6, 0x6e, 0x66, 0x50, - 0x16, 0x6e, 0x6d, 0x20, 0xa0, 0x9, 0x0, 0x0, - 0x0, 0x1f, 0x0, 0xd, 0x66, 0x66, 0xa8, 0x0, - 0x0, 0x4f, 0x30, 0xd, 0x0, 0x0, 0x85, 0x0, - 0x0, 0x9f, 0x79, 0xd, 0x66, 0x66, 0xb5, 0x0, - 0x0, 0xad, 0xd, 0xd, 0x0, 0x0, 0x85, 0x0, - 0x6, 0x3d, 0x1, 0xe, 0x6b, 0x86, 0xa4, 0x0, - 0x6, 0xd, 0x0, 0x1, 0xa, 0x30, 0x2, 0x30, - 0x20, 0xd, 0x6, 0x76, 0x6e, 0x96, 0x67, 0x80, - 0x0, 0xd, 0x0, 0x0, 0x4a, 0x36, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x1, 0xc1, 0x7, 0x91, 0x0, - 0x0, 0xd, 0x0, 0x49, 0x20, 0x0, 0x7f, 0xa0, - 0x0, 0x5, 0x14, 0x20, 0x0, 0x0, 0x2, 0x0, - - /* U+6A23 "樣" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x30, 0x0, 0x92, 0x5, 0xa0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x39, 0x7, 0x16, 0x0, - 0x0, 0xd, 0x0, 0x56, 0x66, 0xd6, 0x66, 0x10, - 0x16, 0x6e, 0x6c, 0x36, 0x66, 0xd6, 0x89, 0x0, - 0x0, 0x1f, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x10, - 0x0, 0x5f, 0x60, 0x66, 0x66, 0xa6, 0x67, 0x90, - 0x0, 0xaf, 0x5b, 0x0, 0x5, 0xc1, 0x0, 0x0, - 0x1, 0xad, 0x9, 0x0, 0x0, 0x70, 0x0, 0x0, - 0x7, 0x3d, 0x0, 0x16, 0x66, 0xe1, 0xd, 0x20, - 0x6, 0xd, 0x3, 0x66, 0x83, 0xd5, 0x83, 0x0, - 0x20, 0xd, 0x0, 0x2, 0xd2, 0xc7, 0x30, 0x0, - 0x0, 0xd, 0x0, 0xb, 0x30, 0xc0, 0xc2, 0x0, - 0x0, 0xd, 0x0, 0x84, 0x0, 0xd0, 0x2e, 0x71, - 0x0, 0xd, 0x17, 0x20, 0x6b, 0xd0, 0x2, 0x50, - 0x0, 0x4, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, - - /* U+6A2A "横" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x4, 0x90, 0xc, 0x20, 0x0, - 0x0, 0xd, 0x0, 0x3, 0x90, 0xd, 0x6, 0x0, - 0x0, 0xd, 0x2, 0x68, 0xb6, 0x6e, 0x66, 0x10, - 0x16, 0x6e, 0x87, 0x3, 0x90, 0xd, 0x0, 0x10, - 0x0, 0x3e, 0x7, 0x66, 0x89, 0x69, 0x67, 0x80, - 0x0, 0x6e, 0x10, 0x10, 0xa, 0x10, 0x2, 0x0, - 0x0, 0xad, 0x95, 0xc6, 0x6c, 0x66, 0x7c, 0x0, - 0x0, 0xad, 0x1b, 0xb0, 0xa, 0x10, 0x39, 0x0, - 0x6, 0x3d, 0x0, 0xb6, 0x6c, 0x66, 0x79, 0x0, - 0x8, 0xd, 0x0, 0xb0, 0xa, 0x10, 0x39, 0x0, - 0x21, 0xd, 0x0, 0xc6, 0x6b, 0x66, 0x79, 0x0, - 0x0, 0xd, 0x0, 0x71, 0x80, 0x14, 0x11, 0x0, - 0x0, 0xd, 0x0, 0x1c, 0x60, 0x2, 0xb5, 0x0, - 0x0, 0xe, 0x3, 0x82, 0x0, 0x0, 0xd, 0x40, - 0x0, 0x5, 0x13, 0x0, 0x0, 0x0, 0x1, 0x20, - - /* U+6A39 "樹" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x4, 0x90, 0x0, 0xb, 0x10, - 0x0, 0xd, 0x0, 0x4, 0x81, 0x40, 0xc, 0x0, - 0x0, 0xd, 0x4, 0x68, 0xb6, 0x50, 0xc, 0x0, - 0x6, 0x6e, 0x86, 0x3, 0x81, 0x2, 0x2c, 0x70, - 0x0, 0x1d, 0x0, 0x66, 0x88, 0x54, 0x4d, 0x41, - 0x0, 0x4e, 0x10, 0x76, 0x69, 0x10, 0xc, 0x0, - 0x0, 0x9e, 0xa5, 0xc0, 0xc, 0x18, 0xc, 0x0, - 0x0, 0xbd, 0x18, 0xc0, 0xc, 0xa, 0x4c, 0x0, - 0x5, 0x5d, 0x0, 0xc6, 0x6b, 0x5, 0x3c, 0x0, - 0x8, 0xd, 0x0, 0x50, 0xb, 0x20, 0xc, 0x0, - 0x21, 0xd, 0x0, 0x75, 0x29, 0x0, 0xc, 0x0, - 0x0, 0xd, 0x0, 0x25, 0x74, 0x50, 0xc, 0x0, - 0x0, 0xd, 0x7, 0xaa, 0x72, 0x0, 0xc, 0x0, - 0x0, 0xe, 0x5, 0x20, 0x0, 0x17, 0xdc, 0x0, - 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, - - /* U+6A4B "橋" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x20, 0x0, 0x2, 0x6a, 0xf6, 0x0, - 0x0, 0xd, 0x0, 0x35, 0x6d, 0x61, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x12, 0x3d, 0x22, 0x26, 0x30, - 0x6, 0x6e, 0x87, 0x34, 0xc5, 0x49, 0x44, 0x30, - 0x0, 0x1e, 0x0, 0x8, 0x60, 0x2, 0xb6, 0x0, - 0x0, 0x5e, 0x10, 0x76, 0xb6, 0x6b, 0x78, 0xc2, - 0x0, 0x9e, 0xa7, 0x2, 0x90, 0x9, 0x40, 0x0, - 0x0, 0xbd, 0x18, 0x2, 0x96, 0x69, 0x20, 0x0, - 0x5, 0x4d, 0x0, 0xc5, 0x55, 0x55, 0x56, 0xd0, - 0x7, 0xd, 0x0, 0xd0, 0x66, 0x69, 0x31, 0xa0, - 0x21, 0xd, 0x0, 0xd0, 0xb0, 0xc, 0x11, 0xa0, - 0x0, 0xd, 0x0, 0xd0, 0xb6, 0x6d, 0x1, 0xa0, - 0x0, 0xd, 0x0, 0xd0, 0x40, 0x2, 0x2, 0xa0, - 0x0, 0xe, 0x0, 0xd0, 0x0, 0x4, 0x9d, 0x80, - 0x0, 0x4, 0x0, 0x40, 0x0, 0x0, 0x4, 0x0, - - /* U+6A5F "機" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0x10, 0x8, 0x40, 0xd2, 0x49, 0x0, - 0x0, 0xd, 0x0, 0xb, 0x10, 0xd0, 0x93, 0x0, - 0x0, 0xd, 0x20, 0x62, 0x97, 0xc3, 0x65, 0x90, - 0x6, 0x6e, 0xa7, 0xda, 0xc0, 0xcb, 0xad, 0x20, - 0x0, 0x1d, 0x0, 0x8, 0x30, 0xc1, 0x45, 0x0, - 0x0, 0x4e, 0x10, 0x53, 0x55, 0xc2, 0x62, 0x90, - 0x0, 0x8e, 0xa5, 0xc7, 0x49, 0xc9, 0xa5, 0xb0, - 0x0, 0xad, 0x18, 0x9, 0x20, 0xb0, 0x65, 0x0, - 0x3, 0x5d, 0x2, 0x6d, 0x66, 0xd6, 0x6c, 0xd2, - 0x7, 0xd, 0x0, 0xc, 0x0, 0x92, 0x1, 0x0, - 0x13, 0xd, 0x0, 0xd, 0x0, 0x75, 0xe, 0x30, - 0x0, 0xd, 0x0, 0x38, 0xa3, 0x2b, 0xa9, 0x0, - 0x0, 0xd, 0x0, 0x91, 0x14, 0xd, 0xb0, 0x32, - 0x0, 0xd, 0x4, 0x60, 0x4, 0x94, 0xc8, 0x72, - 0x0, 0xd, 0x35, 0x0, 0x52, 0x0, 0x7, 0xd4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6B21 "次" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x10, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0xa, - 0x40, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, 0x2f, - 0x23, 0x4, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x91, - 0x50, 0xa9, 0x66, 0x66, 0xb5, 0x0, 0x0, 0x42, - 0x1b, 0x3, 0x0, 0x1d, 0x50, 0x0, 0x7, 0x8, - 0x20, 0xc6, 0x6, 0x20, 0x0, 0x2, 0x52, 0x70, - 0xd, 0x40, 0x10, 0x0, 0x0, 0x80, 0x60, 0x0, - 0xd5, 0x0, 0x0, 0x1, 0x38, 0x0, 0x0, 0x3a, - 0x60, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x8, 0x52, - 0x60, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0, 0xa, - 0x0, 0x0, 0xa, 0x50, 0x0, 0x93, 0x0, 0x5a, - 0x0, 0x0, 0xc7, 0x0, 0x75, 0x0, 0x0, 0xba, - 0x0, 0x3, 0x21, 0x83, 0x0, 0x0, 0x0, 0xcb, - 0x10, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6B32 "欲" */ - 0x0, 0x3, 0x1, 0x0, 0x3, 0xa0, 0x0, 0x0, - 0x0, 0x4d, 0x3, 0xa2, 0x6, 0x90, 0x0, 0x0, - 0x1, 0xb1, 0x0, 0x6a, 0xa, 0x20, 0x0, 0x0, - 0x8, 0x10, 0xb3, 0x2, 0xd, 0x66, 0x69, 0xb0, - 0x10, 0x4, 0xe2, 0x0, 0x54, 0x10, 0xa, 0x20, - 0x0, 0xc, 0x27, 0xc2, 0x70, 0xd4, 0x31, 0x0, - 0x0, 0x93, 0x0, 0x5a, 0x10, 0xc4, 0x0, 0x0, - 0x6, 0x40, 0x0, 0x10, 0x0, 0xc5, 0x0, 0x0, - 0x21, 0xb6, 0x66, 0xe0, 0x2, 0xa7, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0xc0, 0x6, 0x68, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0xc0, 0xb, 0x15, 0x60, 0x0, - 0x0, 0xc0, 0x0, 0xc0, 0x48, 0x0, 0xd0, 0x0, - 0x0, 0xc6, 0x66, 0xd1, 0xa0, 0x0, 0x7c, 0x10, - 0x0, 0x70, 0x0, 0x57, 0x0, 0x0, 0xc, 0xb1, - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+6B4C "歌" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x40, 0x78, 0x0, 0x0, - 0x4, 0x76, 0x66, 0x6d, 0x61, 0xb4, 0x0, 0x0, - 0x0, 0x66, 0x68, 0xc, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x84, 0xb, 0xc, 0x5, 0x96, 0x66, 0xe3, - 0x0, 0x88, 0x6b, 0xc, 0x8, 0x5, 0x5, 0x60, - 0x0, 0x72, 0x6, 0x1b, 0x31, 0xf, 0x13, 0x0, - 0x6, 0x66, 0x66, 0x68, 0xb0, 0x1f, 0x10, 0x0, - 0x1, 0x0, 0x0, 0x3a, 0x0, 0x3b, 0x40, 0x0, - 0x1, 0xc6, 0x6c, 0x3a, 0x0, 0x68, 0x70, 0x0, - 0x0, 0xd0, 0xc, 0x3a, 0x0, 0xa4, 0x90, 0x0, - 0x0, 0xe6, 0x6c, 0x3a, 0x0, 0xc0, 0x64, 0x0, - 0x1, 0xb0, 0x5, 0x3a, 0x6, 0x60, 0x1c, 0x0, - 0x0, 0x0, 0x5, 0x7a, 0x29, 0x0, 0x9, 0xb0, - 0x0, 0x0, 0x1, 0xc5, 0x70, 0x0, 0x0, 0xa3, - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - - /* U+6B50 "歐" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x0, 0x0, 0x16, 0x9, 0x60, 0x0, 0x0, - 0xc, 0x66, 0x66, 0x65, 0xc, 0x20, 0x0, 0x0, - 0xc, 0x6, 0x66, 0x85, 0xc, 0x0, 0x0, 0x0, - 0xc, 0x9, 0x10, 0x84, 0x5a, 0x66, 0x6d, 0x50, - 0xc, 0x9, 0x10, 0x83, 0x90, 0x51, 0x28, 0x0, - 0xc, 0xa, 0x66, 0xa5, 0x40, 0xa7, 0x30, 0x0, - 0xc, 0x3, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, - 0xc, 0x46, 0xc4, 0x98, 0x60, 0xc6, 0x0, 0x0, - 0xc, 0x53, 0xd0, 0xb6, 0x40, 0xe7, 0x0, 0x0, - 0xc, 0x53, 0xd0, 0xb6, 0x42, 0xc5, 0x30, 0x0, - 0xc, 0x58, 0xe0, 0xca, 0x46, 0x71, 0xa0, 0x0, - 0xc, 0x41, 0x10, 0x51, 0xc, 0x10, 0xa4, 0x0, - 0xc, 0x0, 0x0, 0x50, 0x84, 0x0, 0x3f, 0x40, - 0x9, 0x66, 0x66, 0x6a, 0x40, 0x0, 0x7, 0xc1, - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - - /* U+6B61 "歡" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x51, 0xb0, 0x0, 0x96, 0x0, 0x0, - 0x4, 0x7a, 0x86, 0xc8, 0x80, 0xd3, 0x0, 0x0, - 0x0, 0x6, 0x20, 0x80, 0x1, 0xd0, 0x0, 0x0, - 0x2, 0x96, 0xa8, 0x6b, 0x36, 0xb6, 0x69, 0xa0, - 0x2, 0xa2, 0x9a, 0xc, 0xa, 0x22, 0x9, 0x10, - 0x2, 0xa9, 0x87, 0x68, 0x26, 0x2d, 0x22, 0x0, - 0x0, 0x2d, 0x38, 0x0, 0x20, 0x3c, 0x0, 0x0, - 0x0, 0xa9, 0x6a, 0x69, 0x60, 0x4b, 0x0, 0x0, - 0x3, 0xd3, 0xc, 0x5, 0x0, 0x78, 0x30, 0x0, - 0x5, 0x88, 0x6d, 0x66, 0x10, 0xa3, 0x70, 0x0, - 0x0, 0x88, 0x6d, 0x69, 0x0, 0xd0, 0x90, 0x0, - 0x0, 0x83, 0xc, 0x2, 0x7, 0x60, 0x48, 0x0, - 0x0, 0x88, 0x69, 0x69, 0x59, 0x0, 0xd, 0x60, - 0x0, 0x92, 0x0, 0x4, 0x70, 0x0, 0x3, 0xc2, - 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, - - /* U+6B62 "止" */ - 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xe2, 0x0, 0xd1, 0x0, 0x4, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xd6, 0x66, 0x8a, 0x20, - 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x1, 0x0, - 0x5, 0x66, 0xe6, 0x66, 0xd6, 0x66, 0x6d, 0xc0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6B63 "正" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, - 0x0, 0x57, 0x66, 0x66, 0x96, 0x66, 0x6b, 0x60, - 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf2, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0xe6, 0x66, 0xd8, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0xb, 0x30, - 0x6, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, - - /* U+6B64 "此" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x10, 0xd, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x40, 0xd, 0x0, 0xd, 0x0, 0x7, 0x10, - 0x0, 0xd3, 0xd, 0x0, 0xd, 0x0, 0x8e, 0x40, - 0x0, 0xc0, 0xd, 0x6b, 0x6d, 0x19, 0x60, 0x0, - 0x0, 0xc0, 0xd, 0x0, 0xd, 0x60, 0x0, 0x0, - 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0xc0, 0xd, 0x3, 0x3d, 0x0, 0x0, 0x50, - 0x0, 0xc0, 0x4d, 0x72, 0xd, 0x0, 0x0, 0x70, - 0x17, 0xec, 0x60, 0x0, 0xd, 0x10, 0x4, 0xd0, - 0x2c, 0x40, 0x0, 0x0, 0x6, 0xbc, 0xcb, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6B65 "步" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe1, 0x0, 0xe6, 0x66, 0xa9, 0x0, 0x0, 0xd, - 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0xe0, 0x0, 0x0, 0x10, 0x56, 0x6d, 0x66, - 0x6d, 0x66, 0x66, 0xbc, 0x10, 0x0, 0x0, 0x0, - 0xa1, 0x0, 0x0, 0x0, 0x0, 0x3, 0x40, 0xe, - 0x0, 0x0, 0x60, 0x0, 0x0, 0xc7, 0x0, 0xe0, - 0x0, 0xad, 0x20, 0x0, 0x69, 0x0, 0xe, 0x0, - 0x8c, 0x10, 0x0, 0x2a, 0x0, 0x0, 0xf0, 0xaa, - 0x0, 0x0, 0x17, 0x0, 0x0, 0x6, 0xc6, 0x0, - 0x0, 0x1, 0x0, 0x0, 0x29, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x26, 0x76, 0x10, 0x0, 0x0, 0x0, - 0x3, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6B69 "歩" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x72, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd2, 0x0, 0xe6, 0x66, 0xd2, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0xe0, 0x0, 0x3, 0x20, - 0x6, 0x76, 0xa6, 0x66, 0xb6, 0x66, 0x6a, 0x90, - 0x0, 0x0, 0x0, 0x3, 0xd0, 0x23, 0x0, 0x0, - 0x0, 0x0, 0x98, 0x2, 0xb0, 0x4, 0xb4, 0x0, - 0x0, 0x4, 0xd2, 0x2, 0xb0, 0x1, 0x5e, 0x70, - 0x0, 0x1b, 0x10, 0x2, 0xb0, 0x1d, 0xc4, 0x90, - 0x1, 0x81, 0x0, 0x3, 0xb3, 0xe9, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x8d, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6b, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x88, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6B6F "歯" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0xa, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe1, 0xa, 0x30, 0x2, 0x20, 0x0, - 0x0, 0x0, 0xd0, 0xa, 0x86, 0x68, 0x70, 0x0, - 0x0, 0x0, 0xd0, 0xa, 0x30, 0x0, 0x1, 0x0, - 0x5, 0x66, 0xe6, 0x6c, 0x86, 0x66, 0x6e, 0x80, - 0x1, 0x0, 0x0, 0x6, 0x30, 0x11, 0x0, 0x0, - 0x0, 0x92, 0x2a, 0x9, 0x40, 0xa9, 0x5, 0x0, - 0x0, 0xd0, 0x7, 0x59, 0x34, 0x70, 0xe, 0x10, - 0x0, 0xd1, 0x66, 0x6b, 0x8a, 0x6d, 0x4e, 0x0, - 0x0, 0xd0, 0x20, 0x9e, 0x94, 0x0, 0xe, 0x0, - 0x0, 0xd0, 0x4, 0x89, 0x39, 0xb1, 0xe, 0x0, - 0x0, 0xd0, 0x38, 0x9, 0x30, 0x98, 0xe, 0x0, - 0x0, 0xd2, 0x40, 0x8, 0x20, 0x1, 0xe, 0x0, - 0x1, 0xd6, 0x66, 0x66, 0x66, 0x66, 0x6e, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+6B72 "歲" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x10, 0xb, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc2, 0xa, 0x76, 0x6b, 0x60, 0x0, - 0x0, 0x0, 0xc0, 0xa, 0x20, 0x0, 0x3, 0x20, - 0x7, 0x66, 0x96, 0x68, 0x86, 0x76, 0x69, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x7a, 0xa, 0x41, 0x0, - 0x0, 0x96, 0x66, 0x66, 0x9c, 0x67, 0x8c, 0x30, - 0x0, 0xa3, 0x0, 0x0, 0x2c, 0x0, 0x30, 0x0, - 0x0, 0xa4, 0x77, 0x7b, 0x1e, 0x0, 0xe7, 0x0, - 0x0, 0xb2, 0x15, 0x50, 0xb, 0x36, 0xb0, 0x0, - 0x0, 0xc1, 0xb7, 0x5a, 0x66, 0x9d, 0x20, 0x0, - 0x0, 0xd2, 0x75, 0xac, 0x11, 0xf5, 0x0, 0x10, - 0x1, 0xa3, 0x7, 0xe1, 0xb, 0xba, 0x0, 0x60, - 0x6, 0x30, 0x4a, 0x11, 0xb5, 0xa, 0xb3, 0x90, - 0x7, 0x17, 0x50, 0x68, 0x10, 0x0, 0x8f, 0xc0, - 0x20, 0x30, 0x5, 0x10, 0x0, 0x0, 0x0, 0x40, - - /* U+6B73 "歳" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x20, 0xa, 0x50, 0x1, 0x0, 0x0, - 0x0, 0x0, 0xc2, 0xa, 0x66, 0x6b, 0x60, 0x0, - 0x0, 0x0, 0xc0, 0xa, 0x10, 0x0, 0x6, 0x10, - 0x7, 0x66, 0x96, 0x68, 0x86, 0x76, 0x69, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x8b, 0xb, 0x41, 0x0, - 0x0, 0x96, 0x66, 0x66, 0x9c, 0x67, 0x7c, 0x30, - 0x0, 0xc1, 0x0, 0x1, 0x2b, 0x0, 0x20, 0x0, - 0x0, 0xc5, 0x77, 0x79, 0x6e, 0x0, 0xe7, 0x0, - 0x0, 0xc0, 0x5, 0x60, 0xb, 0x36, 0xc0, 0x0, - 0x0, 0xc0, 0xc6, 0x69, 0x16, 0xad, 0x20, 0x0, - 0x0, 0xc5, 0x55, 0x64, 0xa1, 0xf5, 0x0, 0x0, - 0x2, 0xa5, 0x5, 0x60, 0x3b, 0xc9, 0x0, 0x50, - 0x6, 0x30, 0x6e, 0x21, 0xa4, 0xb, 0xa1, 0x80, - 0x8, 0x0, 0x1, 0x57, 0x0, 0x0, 0x9f, 0xb0, - 0x20, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x40, - - /* U+6B77 "歷" */ - 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9, 0x20, - 0x0, 0xd6, 0x66, 0x68, 0x66, 0x66, 0x67, 0x40, - 0x0, 0xd1, 0x37, 0xbb, 0x21, 0x48, 0xc8, 0x0, - 0x0, 0xd2, 0x15, 0x70, 0x3, 0x2c, 0x0, 0x0, - 0x0, 0xd4, 0x69, 0xab, 0x36, 0x6d, 0x69, 0x70, - 0x0, 0xd0, 0xe, 0x91, 0x1, 0xcc, 0x60, 0x0, - 0x0, 0xd0, 0x5a, 0x8c, 0x18, 0x4c, 0x57, 0x0, - 0x0, 0xd1, 0x75, 0x71, 0x64, 0xc, 0x9, 0x90, - 0x0, 0xc5, 0x5, 0x62, 0x35, 0x9, 0x0, 0x0, - 0x0, 0xa0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, - 0x3, 0x70, 0xd, 0x10, 0x1c, 0x66, 0xc3, 0x0, - 0x7, 0x20, 0xc, 0x0, 0x1b, 0x0, 0x0, 0x0, - 0x9, 0x0, 0xc, 0x0, 0x1b, 0x0, 0x0, 0x10, - 0x25, 0x56, 0x6d, 0x66, 0x6c, 0x66, 0x6b, 0xd1, - 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6B7B "死" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, - 0x7, 0x66, 0x97, 0x66, 0x69, 0x66, 0x6a, 0x80, - 0x0, 0x0, 0xd2, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x1, 0xe0, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x5, 0x80, 0x15, 0xc, 0x10, 0xa, 0x20, - 0x0, 0xb, 0x76, 0x9d, 0xc, 0x10, 0x9b, 0x20, - 0x0, 0x2b, 0x0, 0x87, 0xc, 0x18, 0x60, 0x0, - 0x0, 0xa8, 0x50, 0xd2, 0xc, 0x72, 0x0, 0x0, - 0x4, 0x60, 0xe3, 0xc0, 0xc, 0x10, 0x0, 0x0, - 0x15, 0x0, 0x2a, 0x40, 0xc, 0x10, 0x0, 0x10, - 0x0, 0x0, 0x4b, 0x0, 0xc, 0x10, 0x0, 0x60, - 0x0, 0x1, 0xb1, 0x0, 0xc, 0x10, 0x1, 0x70, - 0x0, 0x1a, 0x10, 0x0, 0xc, 0x41, 0x16, 0xd1, - 0x3, 0x70, 0x0, 0x0, 0x5, 0xab, 0xba, 0x70, - 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6B8A "殊" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xc1, 0x0, 0x0, - 0x5, 0x66, 0x6b, 0x64, 0xc0, 0xd0, 0x0, 0x0, - 0x0, 0x3b, 0x0, 0x7, 0x70, 0xd0, 0x4, 0x0, - 0x0, 0x58, 0x0, 0xa, 0x66, 0xe6, 0x79, 0x10, - 0x0, 0x89, 0x6a, 0x38, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xb1, 0xe, 0x60, 0x0, 0xd0, 0x0, 0x20, - 0x0, 0xc0, 0x2b, 0x56, 0x68, 0xe6, 0x69, 0xb1, - 0x5, 0x88, 0x58, 0x0, 0x1e, 0xd6, 0x0, 0x0, - 0x7, 0xa, 0x94, 0x0, 0x87, 0xd7, 0x10, 0x0, - 0x10, 0x0, 0xc0, 0x2, 0xc0, 0xd2, 0x80, 0x0, - 0x0, 0x5, 0x70, 0xa, 0x10, 0xd0, 0xa5, 0x0, - 0x0, 0xa, 0x0, 0x83, 0x0, 0xd0, 0x1e, 0x70, - 0x0, 0x72, 0x7, 0x20, 0x0, 0xe0, 0x4, 0xa2, - 0x4, 0x30, 0x20, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - - /* U+6B8B "残" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0x51, 0x0, 0x0, - 0x6, 0x67, 0x66, 0xc1, 0xa, 0x34, 0x90, 0x0, - 0x0, 0xc, 0x0, 0x0, 0xa, 0x40, 0xa5, 0x0, - 0x0, 0x39, 0x0, 0x0, 0x9, 0x40, 0x16, 0x0, - 0x0, 0x75, 0x1, 0x54, 0x6b, 0x96, 0x67, 0x20, - 0x0, 0xb6, 0x69, 0xb1, 0x8, 0x50, 0x0, 0x0, - 0x1, 0xc0, 0x7, 0x50, 0x7, 0x62, 0x4b, 0x50, - 0x6, 0x4b, 0xb, 0x26, 0x69, 0xb3, 0x13, 0x0, - 0x6, 0xa, 0x3c, 0x0, 0x3, 0xa0, 0x6c, 0x0, - 0x10, 0x0, 0x57, 0x0, 0x0, 0xe3, 0xd1, 0x0, - 0x0, 0x0, 0xb1, 0x0, 0x0, 0xbd, 0x10, 0x0, - 0x0, 0x6, 0x50, 0x0, 0x5, 0xcd, 0x10, 0x50, - 0x0, 0x37, 0x0, 0x1, 0x97, 0x6, 0xc2, 0x80, - 0x2, 0x60, 0x2, 0x56, 0x10, 0x0, 0x6e, 0xd0, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x60, - - /* U+6BB5 "段" */ - 0x0, 0x0, 0x4, 0xa0, 0x10, 0x2, 0x0, 0x0, - 0x0, 0xa6, 0x86, 0x41, 0xc6, 0x6e, 0x30, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, - 0x0, 0xc0, 0x2, 0x0, 0xd0, 0xd, 0x0, 0x0, - 0x0, 0xc6, 0x68, 0x51, 0xb0, 0xc, 0x11, 0x0, - 0x0, 0xc0, 0x0, 0x8, 0x30, 0x6, 0xaa, 0x40, - 0x0, 0xc0, 0x3, 0x45, 0x22, 0x23, 0x80, 0x0, - 0x0, 0xc6, 0x66, 0x33, 0x73, 0x38, 0xb0, 0x0, - 0x0, 0xc0, 0x0, 0x0, 0x60, 0xc, 0x30, 0x0, - 0x0, 0xc0, 0x14, 0x62, 0x17, 0x3b, 0x0, 0x0, - 0x27, 0xeb, 0x83, 0x0, 0x8, 0xc2, 0x0, 0x0, - 0x18, 0xd0, 0x0, 0x0, 0xa, 0xd3, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0x3, 0xa3, 0x2d, 0x81, 0x0, - 0x0, 0xd1, 0x4, 0x75, 0x0, 0x1, 0xaf, 0x90, - 0x0, 0x30, 0x31, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+6BCD "母" */ - 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x60, 0x0, - 0x0, 0x3, 0xd6, 0x66, 0x66, 0x67, 0xe1, 0x0, - 0x0, 0x5, 0xa0, 0x2a, 0x10, 0x3, 0xb0, 0x0, - 0x0, 0x6, 0x80, 0x8, 0xa0, 0x4, 0xa0, 0x0, - 0x0, 0x8, 0x60, 0x1, 0x80, 0x5, 0x90, 0x0, - 0x16, 0x6b, 0x96, 0x66, 0x66, 0x6a, 0xbb, 0xb0, - 0x1, 0xb, 0x30, 0x20, 0x0, 0x7, 0x70, 0x0, - 0x0, 0xd, 0x10, 0x1c, 0x20, 0x8, 0x60, 0x0, - 0x0, 0xf, 0x0, 0x8, 0xb0, 0xa, 0x50, 0x0, - 0x0, 0x1d, 0x0, 0x1, 0x60, 0xb, 0x40, 0x0, - 0x0, 0x5d, 0x66, 0x66, 0x66, 0x6d, 0x8c, 0x90, - 0x0, 0x14, 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x32, 0x3e, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, - - /* U+6BCE "毎" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xf6, 0x66, 0x66, 0x66, 0xbb, 0x0, - 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x83, 0x30, 0x0, 0x0, 0x3, 0x30, 0x0, - 0x5, 0x22, 0xd6, 0x68, 0xc6, 0x6b, 0x90, 0x0, - 0x0, 0x4, 0xa0, 0x5, 0x80, 0x9, 0x40, 0x0, - 0x0, 0x5, 0x80, 0x7, 0x70, 0x9, 0x42, 0x0, - 0x26, 0x6a, 0xa6, 0x6b, 0x96, 0x6c, 0x8b, 0x80, - 0x0, 0xa, 0x40, 0xa, 0x30, 0xb, 0x20, 0x0, - 0x0, 0xc, 0x20, 0xc, 0x10, 0xc, 0x20, 0x0, - 0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x14, 0x0, - 0x0, 0x3e, 0x66, 0x69, 0x66, 0x6e, 0x6a, 0x40, - 0x0, 0x1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x39, 0xda, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, - - /* U+6BCF "每" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xe6, 0x66, 0x66, 0x66, 0xcb, 0x0, - 0x0, 0x1d, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa4, 0x30, 0x0, 0x0, 0x4, 0x30, 0x0, - 0x6, 0x42, 0xd6, 0x77, 0x66, 0x6b, 0x80, 0x0, - 0x22, 0x3, 0xa0, 0xa, 0x80, 0x9, 0x40, 0x0, - 0x0, 0x5, 0x80, 0x1, 0xd0, 0xa, 0x32, 0x0, - 0x26, 0x6a, 0xa6, 0x66, 0x66, 0x6c, 0x8b, 0x90, - 0x0, 0x9, 0x40, 0x27, 0x0, 0xc, 0x20, 0x0, - 0x0, 0xb, 0x20, 0x8, 0xb0, 0xd, 0x10, 0x0, - 0x0, 0xd, 0x0, 0x1, 0x90, 0xe, 0x4, 0x0, - 0x0, 0x2e, 0x66, 0x66, 0x66, 0x6f, 0x6a, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x39, 0xc9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, - - /* U+6BD4 "比" */ - 0x26, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x2c, - 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x2b, 0x0, - 0x0, 0xd, 0x0, 0x3, 0x0, 0x2b, 0x0, 0x0, - 0xd, 0x0, 0x2f, 0x60, 0x2b, 0x0, 0x0, 0xd, - 0x1, 0xc5, 0x0, 0x2d, 0x66, 0x9b, 0xd, 0xa, - 0x30, 0x0, 0x2b, 0x0, 0x0, 0xe, 0x71, 0x0, - 0x0, 0x2b, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x2b, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x2b, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x10, 0x2b, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x60, 0x2b, 0x4, 0x75, - 0xd, 0x0, 0x0, 0x80, 0x4e, 0xd6, 0x0, 0xf, - 0x21, 0x15, 0xe1, 0x9, 0x10, 0x0, 0x7, 0xbb, - 0xbb, 0x70, - - /* U+6BDB "毛" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x25, 0x9d, 0xdb, 0x20, 0x0, - 0x0, 0x35, 0x67, 0x7e, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x5, 0x60, 0x0, - 0x0, 0x23, 0x46, 0x6e, 0x66, 0x66, 0x50, 0x0, - 0x0, 0x23, 0x10, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x9, 0x40, - 0x0, 0x0, 0x23, 0x5e, 0x66, 0x66, 0x66, 0x40, - 0x6, 0x65, 0x32, 0x1d, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x40, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x70, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1, 0xc0, - 0x0, 0x0, 0x0, 0xb, 0xdd, 0xdd, 0xdd, 0xb1, - - /* U+6C0F "氏" */ - 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x1, - 0x0, 0x3, 0x69, 0xee, 0x80, 0x0, 0xd, 0x66, - 0x67, 0xb2, 0x0, 0x0, 0x0, 0xd, 0x0, 0x2, - 0xb0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x1, 0xc0, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x1a, 0x10, 0xe, 0x66, 0x66, 0xe6, 0x66, 0x66, - 0x30, 0xd, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x1e, 0x10, 0x0, 0x0, 0xd, 0x0, - 0x4, 0x18, 0xb0, 0x0, 0x40, 0xd, 0x5, 0x92, - 0x0, 0xca, 0x0, 0x80, 0x1f, 0xd7, 0x0, 0x0, - 0xb, 0xd6, 0x90, 0x1d, 0x30, 0x0, 0x0, 0x0, - 0x6e, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x30, - - /* U+6C11 "民" */ - 0x3, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, - 0xb7, 0x66, 0x66, 0x66, 0x6e, 0x30, 0x0, 0xb, - 0x20, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb2, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0xb, 0x76, - 0x66, 0xc6, 0x66, 0xe0, 0x0, 0x0, 0xb2, 0x0, - 0xd, 0x0, 0x1, 0x0, 0x0, 0xb, 0x20, 0x0, - 0xb2, 0x0, 0x0, 0x50, 0x0, 0xb7, 0x66, 0x6b, - 0x86, 0x66, 0x89, 0x30, 0xb, 0x20, 0x0, 0x58, - 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x8, 0x80, - 0x0, 0x11, 0x0, 0xb2, 0x6, 0x50, 0xd, 0x60, - 0x5, 0x20, 0xc, 0xac, 0x30, 0x0, 0x2d, 0x91, - 0x92, 0x0, 0xc9, 0x0, 0x0, 0x0, 0x19, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x43, - 0x0, - - /* U+6C14 "气" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x13, 0x0, - 0x0, 0x7, 0xb6, 0x66, 0x66, 0x66, 0xaa, 0x10, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x83, 0x27, 0x66, 0x66, 0x69, 0x60, 0x0, - 0x3, 0x60, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x5, 0x7, 0x66, 0x66, 0x66, 0x8d, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xc1, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x60, - - /* U+6C17 "気" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, 0x37, 0x0, - 0x0, 0x9, 0x86, 0x66, 0x66, 0x66, 0x66, 0x10, - 0x0, 0x2a, 0x46, 0x66, 0x66, 0x6a, 0x70, 0x0, - 0x0, 0xa1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x6, 0x26, 0x76, 0x66, 0x66, 0x6d, 0x50, 0x0, - 0x12, 0x0, 0x0, 0x0, 0xb5, 0xd, 0x0, 0x0, - 0x0, 0x4, 0x0, 0x4, 0xd1, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x66, 0x2d, 0x20, 0xc, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xf9, 0x0, 0xa, 0x20, 0x0, - 0x0, 0x0, 0x9, 0x7c, 0xa0, 0x8, 0x50, 0x10, - 0x0, 0x0, 0x95, 0x0, 0xd7, 0x3, 0xb0, 0x50, - 0x0, 0x18, 0x20, 0x0, 0x35, 0x0, 0xc4, 0x80, - 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, - - /* U+6C34 "水" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x60, 0x2, 0xe6, 0x0, - 0x5, 0x66, 0x6d, 0x2c, 0x80, 0x2a, 0x20, 0x0, - 0x1, 0x0, 0x3c, 0xc, 0x67, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x87, 0xc, 0x2a, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0xc, 0x27, 0x40, 0x0, 0x0, - 0x0, 0x5, 0x90, 0xc, 0x21, 0xd1, 0x0, 0x0, - 0x0, 0xc, 0x10, 0xc, 0x20, 0x7b, 0x0, 0x0, - 0x0, 0x76, 0x0, 0xc, 0x20, 0xb, 0xb0, 0x0, - 0x2, 0x80, 0x0, 0xc, 0x20, 0x1, 0xcd, 0x60, - 0x16, 0x0, 0x2, 0x1d, 0x20, 0x0, 0x9, 0x30, - 0x0, 0x0, 0x5, 0xde, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, - - /* U+6C37 "氷" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x5, - 0x20, 0x0, 0xb3, 0x0, 0x3, 0x0, 0x0, 0xb, - 0xb0, 0xb, 0x40, 0x6, 0xd0, 0x0, 0x0, 0xc, - 0x30, 0xb9, 0x3, 0xb1, 0x0, 0x0, 0x0, 0x3, - 0x1b, 0xa4, 0x80, 0x0, 0x0, 0x57, 0x66, 0xd6, - 0xb5, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xb, - 0x3b, 0x10, 0x0, 0x0, 0x0, 0x8, 0x60, 0xb3, - 0x5a, 0x0, 0x0, 0x0, 0x1, 0xc0, 0xb, 0x30, - 0xc7, 0x0, 0x0, 0x0, 0xa3, 0x0, 0xb3, 0x2, - 0xf7, 0x0, 0x0, 0x76, 0x0, 0xb, 0x30, 0x5, - 0xfb, 0x30, 0x66, 0x0, 0x0, 0xc3, 0x0, 0x4, - 0xb3, 0x32, 0x0, 0x6, 0xdf, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, - - /* U+6C38 "永" */ - 0x0, 0x0, 0x0, 0x39, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x47, 0x66, 0xe3, 0x0, 0x11, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf1, 0x0, 0x9b, 0x0, - 0x0, 0x0, 0x2, 0x0, 0xe6, 0x4, 0xb0, 0x0, - 0x2, 0x86, 0x6d, 0x70, 0xe7, 0x29, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0x0, 0xe4, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x87, 0x0, 0xe0, 0xb1, 0x0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0xe0, 0x5b, 0x0, 0x0, - 0x0, 0x9, 0x40, 0x0, 0xe0, 0xa, 0x90, 0x0, - 0x0, 0x57, 0x0, 0x0, 0xe0, 0x0, 0xdc, 0x30, - 0x2, 0x70, 0x2, 0x44, 0xd0, 0x0, 0x1b, 0xa1, - 0x4, 0x0, 0x0, 0x4e, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - - /* U+6C42 "求" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x31, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x6d, 0x20, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x8, 0x42, 0x0, - 0x5, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x8e, 0x20, - 0x0, 0x0, 0x0, 0xd, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x28, 0x10, 0xd, 0x70, 0x0, 0x80, 0x0, - 0x0, 0x5, 0xf2, 0xd, 0x71, 0x8, 0xc3, 0x0, - 0x0, 0x0, 0xb4, 0xd, 0x38, 0x86, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4e, 0x1a, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x49, 0x2d, 0x12, 0xd1, 0x0, 0x0, - 0x0, 0x4b, 0x70, 0xd, 0x10, 0x6d, 0x20, 0x0, - 0x2d, 0xc2, 0x0, 0xd, 0x10, 0x8, 0xf8, 0x20, - 0x6, 0x0, 0x1, 0x1e, 0x10, 0x0, 0x5e, 0x80, - 0x0, 0x0, 0x6, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, - - /* U+6C5A "汚" */ - 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x25, 0x0, - 0x0, 0x2d, 0x11, 0x86, 0x7d, 0x66, 0x65, 0x0, - 0x0, 0xa, 0x20, 0x0, 0x3a, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x0, 0x67, 0x0, 0x0, 0x0, - 0x19, 0x10, 0x46, 0x66, 0xb9, 0x66, 0x67, 0xc1, - 0x5, 0xd0, 0x60, 0x0, 0xb2, 0x0, 0x0, 0x0, - 0x0, 0x80, 0x60, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x20, 0x5, 0xd6, 0x66, 0x6b, 0x10, - 0x0, 0x9, 0x0, 0x1, 0x40, 0x0, 0x4c, 0x0, - 0x2, 0x49, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, - 0x4, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x86, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, - 0x0, 0xd3, 0x0, 0x0, 0x4, 0x13, 0xe0, 0x0, - 0x0, 0xa3, 0x0, 0x0, 0x1, 0xbf, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, - - /* U+6C60 "池" */ - 0x0, 0x71, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, - 0x3, 0xe0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x9, 0x10, 0x30, 0xd, 0x0, 0x0, 0x1, 0x0, - 0x4, 0xb, 0x30, 0xd0, 0x3, 0x10, 0x3a, 0x10, - 0x50, 0xb1, 0xd, 0x45, 0xb7, 0x0, 0x7a, 0x5, - 0x1c, 0x65, 0xd0, 0x8, 0x40, 0x1, 0x55, 0x34, - 0xb1, 0xd, 0x0, 0x84, 0x0, 0x0, 0x80, 0xb, - 0x10, 0xd0, 0x9, 0x30, 0x0, 0x17, 0x0, 0xb1, - 0xd, 0x0, 0xa3, 0x0, 0x9, 0x30, 0xb, 0x10, - 0xd4, 0xae, 0x0, 0x19, 0xf0, 0x0, 0xb1, 0xe, - 0x2, 0x33, 0x20, 0x1d, 0x0, 0xb, 0x10, 0x50, - 0x0, 0x44, 0x4, 0xd0, 0x0, 0xb3, 0x0, 0x0, - 0x7, 0xc0, 0x3c, 0x0, 0x4, 0xbc, 0xcc, 0xcc, - 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+6C7A "決" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x43, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, - 0xd4, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x5, - 0x60, 0x10, 0xe, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x53, 0x76, 0xe6, 0x6c, 0x60, 0x6, 0x60, 0x6, - 0x0, 0xd, 0x0, 0xb3, 0x0, 0xc, 0x54, 0x20, - 0x0, 0xd0, 0xb, 0x30, 0x0, 0x43, 0x80, 0x0, - 0xd, 0x0, 0xb3, 0x0, 0x0, 0x27, 0x56, 0x66, - 0xd6, 0x6c, 0x9c, 0x10, 0x9, 0x11, 0x10, 0x49, - 0x50, 0x0, 0x0, 0x46, 0xb0, 0x0, 0x9, 0x48, - 0x10, 0x0, 0x0, 0xa8, 0x0, 0x1, 0xd0, 0x2b, - 0x0, 0x0, 0x8, 0x70, 0x0, 0x95, 0x0, 0xa8, - 0x0, 0x0, 0xa7, 0x0, 0x68, 0x0, 0x1, 0xda, - 0x10, 0x4, 0x40, 0x57, 0x0, 0x0, 0x2, 0xdd, - 0x10, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6C88 "沈" */ - 0x0, 0x10, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, - 0x0, 0x87, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x20, 0x3b, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x11, 0xb6, 0x7c, 0x66, 0x6e, 0x30, - 0x15, 0x0, 0x48, 0x70, 0x3a, 0x0, 0x35, 0x0, - 0x8, 0x90, 0x52, 0x0, 0x49, 0x0, 0x10, 0x0, - 0x0, 0x63, 0x20, 0x0, 0x6d, 0x50, 0x0, 0x0, - 0x0, 0x7, 0x0, 0x0, 0x9c, 0x60, 0x0, 0x0, - 0x0, 0x8, 0x0, 0x0, 0xd8, 0x60, 0x0, 0x0, - 0x0, 0x65, 0x0, 0x3, 0xb7, 0x60, 0x0, 0x0, - 0x18, 0xf2, 0x0, 0xa, 0x37, 0x60, 0x0, 0x30, - 0x0, 0xf0, 0x0, 0x48, 0x7, 0x60, 0x0, 0x60, - 0x1, 0xf0, 0x2, 0x90, 0x6, 0x60, 0x0, 0xa0, - 0x3, 0xf0, 0x37, 0x0, 0x3, 0xdb, 0xbb, 0xc1, - 0x0, 0x31, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6C92 "沒" */ - 0x0, 0x31, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0x30, 0x7, 0x80, 0x0, 0x23, 0x0, - 0x0, 0x6, 0x71, 0xb, 0x66, 0x66, 0xaa, 0x0, - 0x0, 0x0, 0x5, 0x38, 0x0, 0x0, 0x85, 0x0, - 0x8, 0x20, 0x5, 0x90, 0x0, 0x0, 0xb2, 0x0, - 0x2, 0xe1, 0x47, 0x20, 0x0, 0x2b, 0xc0, 0x0, - 0x0, 0x81, 0x81, 0x66, 0x66, 0x67, 0x95, 0x0, - 0x0, 0x2, 0x60, 0x6, 0x0, 0x0, 0xd5, 0x0, - 0x0, 0x9, 0x10, 0x7, 0x0, 0x5, 0xa0, 0x0, - 0x4, 0x5a, 0x0, 0x2, 0x80, 0x1d, 0x10, 0x0, - 0x1, 0xc7, 0x0, 0x0, 0x95, 0xc4, 0x0, 0x0, - 0x0, 0x95, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x0, - 0x0, 0xb5, 0x0, 0x3, 0xc5, 0xab, 0x40, 0x0, - 0x0, 0x74, 0x3, 0x98, 0x10, 0x5, 0xee, 0xa2, - 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0x5, 0x30, - - /* U+6CB9 "油" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, - 0x4a, 0x10, 0x0, 0xb, 0x10, 0x0, 0x0, 0x0, - 0x96, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x1, - 0x14, 0x86, 0x6d, 0x66, 0x6b, 0x10, 0x60, 0x0, - 0x4d, 0x0, 0xb1, 0x0, 0xd0, 0x6, 0xb0, 0x50, - 0xd0, 0xb, 0x10, 0xd, 0x0, 0xa, 0x7, 0xd, - 0x0, 0xb1, 0x0, 0xd0, 0x0, 0x3, 0x60, 0xd0, - 0xb, 0x10, 0xd, 0x0, 0x0, 0x91, 0xd, 0x66, - 0xd6, 0x66, 0xd0, 0x0, 0x1b, 0x0, 0xd0, 0xb, - 0x10, 0xd, 0x0, 0x7e, 0x70, 0xd, 0x0, 0xb1, - 0x0, 0xd0, 0x0, 0xc4, 0x0, 0xd0, 0xb, 0x10, - 0xd, 0x0, 0xd, 0x40, 0xd, 0x66, 0xc6, 0x66, - 0xd0, 0x0, 0xe4, 0x0, 0xd0, 0x0, 0x0, 0xd, - 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, - - /* U+6CBB "治" */ - 0x1, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x0, - 0x1c, 0x40, 0x0, 0xe, 0x50, 0x0, 0x0, 0x0, - 0x5b, 0x1, 0x7, 0x60, 0x1, 0x0, 0x0, 0x0, - 0x21, 0x31, 0x90, 0x0, 0x83, 0x0, 0x50, 0x0, - 0x50, 0x90, 0x0, 0x0, 0xc5, 0x3, 0xd1, 0x6, - 0xbc, 0xa8, 0x76, 0x67, 0xf0, 0xb, 0x33, 0x44, - 0x30, 0x0, 0x0, 0x7, 0x0, 0x0, 0x80, 0x3, - 0x0, 0x0, 0x5, 0x0, 0x0, 0x19, 0x0, 0xe6, - 0x66, 0x67, 0xc0, 0x0, 0x8, 0x50, 0xd, 0x0, - 0x0, 0x2a, 0x0, 0x29, 0xf1, 0x0, 0xd0, 0x0, - 0x2, 0xa0, 0x0, 0x1f, 0x0, 0xd, 0x0, 0x0, - 0x2a, 0x0, 0x3, 0xe0, 0x0, 0xd6, 0x66, 0x67, - 0xa0, 0x0, 0x3d, 0x0, 0xd, 0x0, 0x0, 0x2a, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+6CC1 "況" */ - 0x0, 0x30, 0x0, 0x30, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x1d, 0x20, 0xb7, 0x66, 0x66, 0x7d, 0x0, - 0x0, 0x8, 0x61, 0xa2, 0x0, 0x0, 0x2b, 0x0, - 0x0, 0x0, 0x5, 0xa2, 0x0, 0x0, 0x2b, 0x0, - 0x27, 0x0, 0x41, 0xa2, 0x0, 0x0, 0x2b, 0x0, - 0x8, 0x90, 0x60, 0xa2, 0x0, 0x0, 0x2b, 0x0, - 0x1, 0x92, 0x50, 0xb7, 0xd6, 0xe6, 0x7a, 0x0, - 0x0, 0x8, 0x0, 0x10, 0xd0, 0xd0, 0x0, 0x0, - 0x0, 0x19, 0x0, 0x0, 0xd0, 0xd0, 0x0, 0x0, - 0x24, 0xa4, 0x0, 0x2, 0xb0, 0xd0, 0x0, 0x0, - 0x5, 0xf0, 0x0, 0x7, 0x60, 0xd0, 0x0, 0x20, - 0x0, 0xf0, 0x0, 0x1c, 0x0, 0xd0, 0x0, 0x60, - 0x3, 0xf0, 0x1, 0xb2, 0x0, 0xc0, 0x0, 0xb0, - 0x1, 0xa0, 0x38, 0x10, 0x0, 0x8c, 0xbb, 0xc1, - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6CCA "泊" */ - 0x1, 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x1, - 0xb2, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x79, - 0x0, 0x0, 0x80, 0x0, 0x10, 0x0, 0x2, 0x5, - 0xc6, 0x76, 0x66, 0xd5, 0x41, 0x0, 0x51, 0xc0, - 0x0, 0x0, 0xd1, 0x1d, 0x30, 0x60, 0xc0, 0x0, - 0x0, 0xd1, 0x6, 0x84, 0x30, 0xc0, 0x0, 0x0, - 0xd1, 0x0, 0x8, 0x0, 0xd6, 0x66, 0x66, 0xe1, - 0x0, 0x27, 0x0, 0xc0, 0x0, 0x0, 0xd1, 0x0, - 0xa2, 0x0, 0xc0, 0x0, 0x0, 0xd1, 0x3b, 0xd0, - 0x0, 0xc0, 0x0, 0x0, 0xd1, 0x3, 0xb0, 0x0, - 0xc0, 0x0, 0x0, 0xd1, 0x5, 0xb0, 0x0, 0xd6, - 0x66, 0x66, 0xe1, 0x5, 0xb0, 0x1, 0xc0, 0x0, - 0x0, 0xc1, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x10, - - /* U+6CD5 "法" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x40, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, - 0x0, 0x3d, 0x10, 0x0, 0xb, 0x10, 0x0, 0x0, - 0x0, 0xa, 0x31, 0x0, 0xb, 0x10, 0x1, 0x0, - 0x0, 0x0, 0x5, 0x76, 0x6d, 0x66, 0x79, 0x0, - 0x37, 0x0, 0x50, 0x0, 0xb, 0x10, 0x0, 0x0, - 0x9, 0x90, 0x60, 0x0, 0xb, 0x10, 0x0, 0x0, - 0x1, 0x83, 0x40, 0x0, 0xb, 0x10, 0x1, 0x40, - 0x0, 0x8, 0x18, 0x66, 0x6d, 0x66, 0x67, 0x70, - 0x0, 0x18, 0x0, 0x0, 0x6d, 0x10, 0x0, 0x0, - 0x23, 0xb3, 0x0, 0x1, 0xd2, 0x0, 0x0, 0x0, - 0x5, 0xf0, 0x0, 0x9, 0x40, 0x6, 0x30, 0x0, - 0x0, 0xe0, 0x0, 0x56, 0x0, 0x0, 0xb5, 0x0, - 0x3, 0xe0, 0x7, 0xb6, 0x78, 0x76, 0x6e, 0x40, - 0x1, 0xa0, 0x9, 0xb6, 0x30, 0x0, 0x8, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6CE2 "波" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x50, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, - 0x0, 0x3d, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, - 0x0, 0xa, 0x11, 0x20, 0x1, 0xb0, 0x2, 0x20, - 0x0, 0x0, 0x5, 0xd6, 0x66, 0xd6, 0x6c, 0xb0, - 0x19, 0x10, 0x23, 0xd0, 0x1, 0xb0, 0x17, 0x0, - 0x4, 0xd0, 0x60, 0xd0, 0x1, 0xb0, 0x0, 0x0, - 0x0, 0x71, 0x60, 0xd5, 0x66, 0xd6, 0x6a, 0x0, - 0x0, 0x7, 0x10, 0xd0, 0x50, 0x0, 0x78, 0x0, - 0x0, 0xa, 0x0, 0xc0, 0x33, 0x0, 0xd0, 0x0, - 0x12, 0x86, 0x3, 0x90, 0x9, 0x9, 0x50, 0x0, - 0x5, 0xf2, 0x7, 0x40, 0x2, 0xc9, 0x0, 0x0, - 0x0, 0xe0, 0xb, 0x0, 0x4, 0xcb, 0x0, 0x0, - 0x0, 0xf0, 0x63, 0x0, 0x89, 0x5, 0xd5, 0x0, - 0x0, 0xb3, 0x50, 0x68, 0x30, 0x0, 0x3d, 0xc1, - 0x0, 0x2, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+6CE3 "泣" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x3d, 0x10, 0x0, 0x4d, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x40, 0x0, 0xb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x66, 0x66, 0x66, 0xad, 0x10, - 0x8, 0x10, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xe0, 0x50, 0x20, 0x0, 0xa, 0x60, 0x0, - 0x0, 0x90, 0x70, 0x52, 0x0, 0xd, 0x30, 0x0, - 0x0, 0x3, 0x50, 0xb, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x9, 0x10, 0xc, 0x30, 0x39, 0x0, 0x0, - 0x1, 0x3b, 0x0, 0x9, 0x80, 0x64, 0x0, 0x0, - 0x5, 0xe7, 0x0, 0x7, 0x80, 0x90, 0x0, 0x0, - 0x0, 0xa5, 0x0, 0x1, 0x10, 0x80, 0x0, 0x0, - 0x0, 0xc5, 0x0, 0x0, 0x3, 0x40, 0x7, 0x60, - 0x0, 0xa4, 0x37, 0x66, 0x66, 0x66, 0x66, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6CE8 "注" */ - 0x0, 0x20, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, - 0x6, 0xa0, 0x0, 0x4, 0xe2, 0x0, 0x0, 0x0, - 0xd, 0x30, 0x0, 0xb, 0x30, 0x1, 0x0, 0x0, - 0x31, 0x56, 0x66, 0x66, 0x67, 0xf4, 0x32, 0x0, - 0x50, 0x20, 0xe, 0x0, 0x0, 0x0, 0xc6, 0x7, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x4, 0xb2, 0x50, - 0x0, 0xe, 0x0, 0x0, 0x0, 0x1, 0x81, 0x0, - 0x0, 0xe0, 0x7, 0x30, 0x0, 0xa, 0x2, 0x86, - 0x6e, 0x66, 0x65, 0x0, 0x6, 0x70, 0x0, 0x0, - 0xe0, 0x0, 0x0, 0x29, 0xf2, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0xe0, - 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0xe, 0x0, - 0x8, 0x30, 0x4e, 0x4, 0x76, 0x66, 0x66, 0x66, - 0x75, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+6CF3 "泳" */ - 0x0, 0x40, 0x0, 0x2, 0xa8, 0x0, 0x0, 0x0, - 0x2, 0xd2, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, - 0x9, 0x40, 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, - 0x2, 0x25, 0x76, 0xe4, 0x0, 0x20, 0x18, 0x10, - 0x50, 0x0, 0xe, 0x40, 0x5d, 0x10, 0x6d, 0x7, - 0x0, 0x30, 0xe6, 0x38, 0x0, 0x0, 0x82, 0x67, - 0x7f, 0x2e, 0x84, 0x0, 0x0, 0x0, 0x81, 0x3, - 0xa0, 0xe6, 0x30, 0x0, 0x0, 0xa, 0x0, 0x66, - 0xe, 0x19, 0x0, 0x0, 0x27, 0x80, 0xb, 0x10, - 0xe0, 0xb3, 0x0, 0x5, 0xf5, 0x3, 0x90, 0xe, - 0x3, 0xd1, 0x0, 0xe, 0x30, 0xa0, 0x0, 0xe0, - 0xa, 0xd3, 0x1, 0xf2, 0x62, 0x11, 0x1f, 0x0, - 0xb, 0x70, 0xc, 0x20, 0x0, 0x6f, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, - 0x0, - - /* U+6D0B "洋" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x24, 0x0, 0x8, 0x70, 0x0, - 0x0, 0x78, 0x0, 0xa, 0x80, 0xd, 0x20, 0x0, - 0x0, 0xd, 0x30, 0x2, 0xd0, 0x46, 0x0, 0x0, - 0x0, 0x3, 0x4, 0x66, 0x76, 0xa6, 0x7e, 0x30, - 0x13, 0x0, 0x22, 0x20, 0xc, 0x10, 0x0, 0x0, - 0x9, 0xa0, 0x60, 0x0, 0xc, 0x10, 0x10, 0x0, - 0x1, 0xd0, 0x70, 0x66, 0x6d, 0x66, 0xa8, 0x0, - 0x0, 0x3, 0x50, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x9, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x1b, 0x5, 0x66, 0x6d, 0x66, 0x6c, 0x90, - 0x6, 0xd8, 0x1, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0xb5, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0xd4, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0xe4, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, - - /* U+6D17 "洗" */ - 0x0, 0x10, 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, - 0x0, 0x88, 0x0, 0x38, 0xb, 0x10, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x79, 0xb, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x4, 0xb8, 0x6c, 0x66, 0xc9, 0x0, - 0x16, 0x0, 0x41, 0x90, 0xb, 0x0, 0x0, 0x0, - 0x6, 0xc0, 0x66, 0x10, 0xb, 0x0, 0x0, 0x0, - 0x0, 0x90, 0x61, 0x0, 0xb, 0x0, 0x6, 0x30, - 0x0, 0x4, 0x47, 0x67, 0xc6, 0xb8, 0x66, 0x40, - 0x0, 0x9, 0x0, 0x3, 0xa0, 0x93, 0x0, 0x0, - 0x0, 0x1b, 0x0, 0x5, 0x80, 0x93, 0x0, 0x0, - 0x6, 0xe9, 0x0, 0x9, 0x50, 0x93, 0x0, 0x20, - 0x0, 0x97, 0x0, 0xd, 0x0, 0x93, 0x0, 0x60, - 0x0, 0xd6, 0x0, 0xa5, 0x0, 0x94, 0x1, 0xa0, - 0x0, 0xc6, 0x19, 0x40, 0x0, 0x4d, 0xbc, 0xb0, - 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6D32 "洲" */ - 0x0, 0x41, 0x0, 0x13, 0x0, 0x0, 0x8, 0x20, - 0x1, 0xd2, 0x3, 0xc0, 0x9, 0x10, 0xb2, 0x0, - 0x7, 0x32, 0x2a, 0x0, 0xc0, 0xb, 0x10, 0x0, - 0x0, 0x42, 0xa0, 0xc, 0x0, 0xb1, 0x8, 0x30, - 0x50, 0x29, 0x0, 0xc0, 0xb, 0x10, 0x3f, 0x6, - 0x53, 0x97, 0xc, 0x43, 0xb1, 0x0, 0x50, 0x6b, - 0x49, 0x76, 0xc0, 0xdb, 0x10, 0x0, 0x65, 0xb5, - 0x74, 0x3c, 0x5, 0xb1, 0x0, 0xa, 0x0, 0x75, - 0x0, 0xc0, 0xb, 0x10, 0x36, 0x90, 0xa, 0x20, - 0xc, 0x0, 0xb1, 0x3, 0xe6, 0x0, 0xb0, 0x0, - 0xc0, 0xb, 0x10, 0xb, 0x40, 0x66, 0x0, 0xc, - 0x0, 0xb1, 0x0, 0xe4, 0xa, 0x0, 0x0, 0xd0, - 0xb, 0x10, 0xa, 0x37, 0x10, 0x0, 0x1, 0x0, - 0xb2, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, - 0x0, - - /* U+6D3B "活" */ - 0x0, 0x30, 0x0, 0x0, 0x0, 0x1, 0x70, 0x0, - 0x0, 0x2c, 0x10, 0x1, 0x47, 0xbe, 0xc5, 0x0, - 0x0, 0x8, 0x62, 0x55, 0x4d, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x17, 0x0, 0x40, 0x0, 0xc, 0x0, 0x0, 0x20, - 0x5, 0xc0, 0x56, 0x66, 0x6d, 0x66, 0x68, 0x80, - 0x0, 0xb1, 0x60, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x20, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x0, 0xa6, 0x6c, 0x66, 0xb6, 0x0, - 0x2, 0x58, 0x0, 0xd1, 0x0, 0x0, 0xb3, 0x0, - 0x4, 0xe4, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, - 0x0, 0xb3, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, - 0x0, 0xd2, 0x0, 0xd6, 0x66, 0x66, 0xd2, 0x0, - 0x0, 0xa2, 0x0, 0xd1, 0x0, 0x0, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x40, 0x0, - - /* U+6D3E "派" */ - 0x0, 0x33, 0x0, 0x0, 0x0, 0x1, 0x74, 0x0, - 0x0, 0xc, 0x50, 0x53, 0x56, 0x8a, 0x85, 0x0, - 0x0, 0x4, 0x60, 0x96, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x13, 0x94, 0x10, 0x16, 0xd9, 0x0, - 0x1b, 0x20, 0x50, 0x94, 0xc5, 0x82, 0x0, 0x0, - 0x5, 0xc0, 0x60, 0x94, 0xc0, 0x60, 0x7, 0x10, - 0x0, 0x42, 0x50, 0x93, 0xc0, 0x60, 0x8a, 0x30, - 0x0, 0x8, 0x0, 0xa2, 0xc0, 0x77, 0x20, 0x0, - 0x0, 0xa, 0x0, 0xc0, 0xc0, 0x45, 0x0, 0x0, - 0x15, 0xa7, 0x0, 0xc0, 0xc0, 0xb, 0x0, 0x0, - 0x2, 0xe4, 0x4, 0x70, 0xc0, 0x9, 0x40, 0x0, - 0x0, 0xe3, 0xa, 0x10, 0xc0, 0x12, 0xd3, 0x0, - 0x1, 0xf2, 0x46, 0x0, 0xd9, 0x50, 0x6f, 0x70, - 0x0, 0x82, 0x70, 0x0, 0xa3, 0x0, 0x6, 0x30, - 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6D41 "流" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, - 0x0, 0x5a, 0x0, 0x0, 0xa, 0x30, 0x9, 0x10, - 0x0, 0xb, 0x53, 0x86, 0x6d, 0x66, 0x66, 0x30, - 0x0, 0x1, 0x2, 0x0, 0x86, 0x1, 0x0, 0x0, - 0x16, 0x0, 0x4, 0x5, 0x50, 0x7, 0x30, 0x0, - 0x7, 0xb0, 0x50, 0x79, 0x44, 0x45, 0xe2, 0x0, - 0x0, 0xa0, 0x70, 0x88, 0x53, 0x10, 0x84, 0x0, - 0x0, 0x3, 0x50, 0x95, 0x8, 0x9, 0x30, 0x0, - 0x0, 0x9, 0x0, 0xb2, 0xd, 0xc, 0x0, 0x0, - 0x0, 0x2a, 0x0, 0xc1, 0xd, 0xc, 0x0, 0x0, - 0x7, 0xf6, 0x0, 0xd0, 0xd, 0xc, 0x0, 0x10, - 0x0, 0xc4, 0x1, 0xb0, 0xd, 0xc, 0x0, 0x50, - 0x0, 0xe3, 0x9, 0x30, 0xd, 0xc, 0x0, 0x80, - 0x0, 0xf3, 0x65, 0x0, 0xd, 0x9, 0xcb, 0xc1, - 0x0, 0x12, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, - - /* U+6D45 "浅" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x22, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, - 0xb7, 0x0, 0x0, 0xe0, 0x88, 0x0, 0x0, 0x3, - 0xa0, 0x10, 0xe, 0x0, 0xd2, 0x0, 0x0, 0x0, - 0x40, 0x0, 0xe0, 0x1, 0x60, 0x8, 0x40, 0x6, - 0x34, 0x5e, 0x66, 0x67, 0x30, 0x1f, 0x31, 0x52, - 0x10, 0xd0, 0x0, 0x10, 0x0, 0x61, 0x70, 0x0, - 0xd, 0x13, 0x5c, 0x70, 0x0, 0x9, 0x46, 0x66, - 0xd5, 0x22, 0x0, 0x0, 0x5, 0x60, 0x0, 0x9, - 0x40, 0xb9, 0x0, 0x11, 0xc1, 0x0, 0x0, 0x59, - 0xa9, 0x0, 0x3, 0xcd, 0x0, 0x0, 0x1, 0xf8, - 0x0, 0x10, 0x5, 0xb0, 0x0, 0x3, 0xb9, 0xb0, - 0x6, 0x0, 0x89, 0x0, 0x17, 0x60, 0x9, 0xb2, - 0xa0, 0x8, 0x90, 0x33, 0x0, 0x0, 0x8, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x60, - - /* U+6D74 "浴" */ - 0x0, 0x40, 0x0, 0x0, 0x80, 0x3, 0x0, 0x0, - 0x0, 0x4d, 0x20, 0x7, 0xb0, 0x4, 0xb3, 0x0, - 0x0, 0xb, 0x41, 0x2b, 0x2, 0x0, 0x5f, 0x10, - 0x0, 0x0, 0x5, 0x80, 0xc, 0x80, 0x8, 0x0, - 0x19, 0x20, 0x44, 0x0, 0x5c, 0x70, 0x0, 0x0, - 0x4, 0xf0, 0x70, 0x1, 0xd1, 0x19, 0x0, 0x0, - 0x0, 0x80, 0x80, 0xb, 0x40, 0x4, 0xc2, 0x0, - 0x0, 0x4, 0x40, 0x97, 0x0, 0x0, 0x6f, 0xa2, - 0x0, 0xa, 0x17, 0x3d, 0x66, 0x66, 0xe6, 0x50, - 0x0, 0x2b, 0x20, 0xe, 0x0, 0x0, 0xe0, 0x0, - 0x5, 0xe8, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xa6, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xe6, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0xb6, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x20, 0x0, - - /* U+6D77 "海" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x0, 0x1c, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x87, 0x0, 0x69, 0x0, 0x0, 0x4, 0x0, - 0x0, 0x1a, 0x0, 0xb6, 0x66, 0x66, 0x68, 0x40, - 0x10, 0x0, 0x33, 0x90, 0x0, 0x0, 0x20, 0x0, - 0xb, 0x10, 0x58, 0xa7, 0x66, 0x66, 0xe3, 0x0, - 0x6, 0x71, 0x70, 0xc1, 0x56, 0x0, 0xd0, 0x0, - 0x0, 0x15, 0x0, 0xe0, 0xc, 0x10, 0xd0, 0x0, - 0x0, 0x7, 0x57, 0xe6, 0x66, 0x66, 0xd6, 0xc2, - 0x0, 0x7, 0x4, 0x90, 0x41, 0x1, 0xb0, 0x0, - 0x1, 0x84, 0x6, 0x70, 0x2b, 0x1, 0xb0, 0x0, - 0x6, 0xf0, 0x9, 0x40, 0x7, 0x2, 0xa0, 0x30, - 0x0, 0xe0, 0xc, 0x66, 0x66, 0x68, 0xb6, 0x80, - 0x2, 0xf0, 0x0, 0x0, 0x2, 0x7, 0x70, 0x0, - 0x1, 0xc0, 0x0, 0x0, 0x3, 0xdf, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, - - /* U+6D88 "消" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x0, 0xc, 0x10, 0x10, 0x2, 0xc2, - 0x6, 0x60, 0xe, 0x0, 0xd5, 0x0, 0x78, 0x0, - 0xc6, 0xe, 0x7, 0x60, 0x0, 0x1, 0x4, 0x44, - 0xe, 0x25, 0x0, 0x63, 0x0, 0x42, 0x96, 0x6e, - 0x66, 0xc1, 0x1e, 0x40, 0x60, 0xd0, 0x0, 0x0, - 0xe0, 0x6, 0x31, 0x60, 0xd0, 0x0, 0x0, 0xe0, - 0x0, 0x7, 0x10, 0xe6, 0x66, 0x66, 0xe0, 0x0, - 0xa, 0x0, 0xd0, 0x0, 0x0, 0xe0, 0x0, 0x67, - 0x0, 0xe6, 0x66, 0x66, 0xe0, 0x38, 0xf3, 0x0, - 0xd0, 0x0, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xd0, - 0x0, 0x0, 0xe0, 0x0, 0xf0, 0x0, 0xd0, 0x0, - 0x1, 0xd0, 0x0, 0xf0, 0x1, 0xd0, 0x1, 0x7f, - 0xa0, 0x0, 0x10, 0x0, 0x20, 0x0, 0x3, 0x0, - - /* U+6DBC "涼" */ - 0x0, 0x10, 0x0, 0x0, 0x9, 0x20, 0x0, 0x0, - 0x0, 0x77, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, - 0x0, 0xd, 0x31, 0x56, 0x66, 0x96, 0x66, 0xd1, - 0x0, 0x3, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x14, 0x0, 0x4, 0x9, 0x66, 0x66, 0x68, 0x0, - 0x8, 0x80, 0x60, 0xd, 0x0, 0x0, 0x1c, 0x0, - 0x0, 0xe0, 0x70, 0xd, 0x0, 0x0, 0x1b, 0x0, - 0x0, 0x14, 0x40, 0xd, 0x66, 0x66, 0x6b, 0x0, - 0x0, 0xa, 0x0, 0xa, 0x0, 0xd0, 0x16, 0x0, - 0x0, 0x48, 0x0, 0x5, 0x0, 0xd0, 0x30, 0x0, - 0x6, 0xf4, 0x0, 0x1e, 0x40, 0xd0, 0x57, 0x0, - 0x0, 0xc2, 0x0, 0xa3, 0x0, 0xd0, 0xa, 0x80, - 0x0, 0xe2, 0x6, 0x40, 0x0, 0xc0, 0x1, 0xf0, - 0x0, 0xc2, 0x33, 0x0, 0x7c, 0xa0, 0x0, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, - - /* U+6DF1 "深" */ - 0x0, 0x30, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xa0, 0xa, 0x66, 0x66, 0x66, 0xb2, 0x0, - 0xc, 0x24, 0x90, 0x0, 0x0, 0x38, 0x0, 0x0, - 0x4, 0x31, 0x89, 0x1, 0x86, 0x0, 0x34, 0x0, - 0x50, 0x3a, 0x1, 0x0, 0xc7, 0x0, 0xb6, 0x24, - 0x16, 0x0, 0xa5, 0x1, 0x80, 0x2, 0x57, 0x2, - 0x0, 0xa, 0x30, 0x3, 0x0, 0x0, 0x80, 0x47, - 0x68, 0xd9, 0x66, 0xb6, 0x0, 0x36, 0x0, 0x0, - 0xdc, 0x82, 0x0, 0x0, 0xb, 0x20, 0x0, 0x87, - 0xa3, 0xa0, 0x0, 0x19, 0xf0, 0x0, 0x49, 0xa, - 0x35, 0x90, 0x0, 0x1e, 0x0, 0x49, 0x0, 0xa3, - 0xb, 0xb2, 0x4, 0xd0, 0x55, 0x0, 0xa, 0x30, - 0xb, 0x50, 0x3b, 0x0, 0x0, 0x0, 0xb4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, - - /* U+6DF7 "混" */ - 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x40, 0x87, 0x66, 0x66, 0x6d, 0x0, - 0x0, 0x4, 0x92, 0x85, 0x0, 0x0, 0x1b, 0x0, - 0x11, 0x0, 0x5, 0x89, 0x66, 0x66, 0x6b, 0x0, - 0xa, 0x40, 0x4, 0x85, 0x0, 0x0, 0x1b, 0x0, - 0x2, 0xe0, 0x60, 0x85, 0x0, 0x0, 0x1b, 0x0, - 0x0, 0x40, 0x70, 0x77, 0x66, 0x96, 0x68, 0x0, - 0x0, 0x3, 0x50, 0x92, 0x0, 0xd3, 0x3, 0x0, - 0x0, 0x9, 0x0, 0xd0, 0x20, 0xd0, 0x4d, 0x40, - 0x4, 0x5a, 0x0, 0xd6, 0x94, 0xd7, 0x70, 0x0, - 0x2, 0xc7, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x20, - 0x0, 0x95, 0x0, 0xd0, 0x1, 0xd0, 0x0, 0x60, - 0x0, 0xb5, 0x0, 0xe9, 0x70, 0xd0, 0x0, 0xb0, - 0x0, 0x74, 0x0, 0x92, 0x0, 0x8c, 0xcc, 0xc1, - - /* U+6E05 "清" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, - 0x5d, 0x0, 0x0, 0xd, 0x0, 0x27, 0x0, 0x0, - 0xc1, 0x47, 0x66, 0xe6, 0x66, 0x61, 0x0, 0x0, - 0x10, 0x46, 0x6e, 0x66, 0xc1, 0x1, 0xa2, 0x4, - 0x1, 0x10, 0xd0, 0x0, 0x0, 0x4, 0xe0, 0x66, - 0x66, 0x6d, 0x66, 0x6b, 0x80, 0x5, 0x42, 0x10, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x7, 0x0, 0xc6, - 0x66, 0x66, 0xc5, 0x0, 0x0, 0x90, 0xd, 0x0, - 0x0, 0xa, 0x20, 0x0, 0x56, 0x0, 0xd6, 0x66, - 0x66, 0xc2, 0x1, 0x8f, 0x30, 0xd, 0x66, 0x66, - 0x6c, 0x20, 0x0, 0xd1, 0x0, 0xd0, 0x0, 0x0, - 0xa2, 0x0, 0xf, 0x0, 0xd, 0x0, 0x0, 0xb, - 0x20, 0x1, 0xf0, 0x0, 0xd0, 0x0, 0x4b, 0xf0, - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x12, 0x0, - - /* U+6E07 "渇" */ - 0x0, 0x31, 0x0, 0x86, 0x66, 0x66, 0x93, 0x0, - 0x1, 0xd3, 0xc, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x6, 0x71, 0xc0, 0x0, 0x0, 0xb2, 0x0, 0x0, - 0x0, 0x5c, 0x66, 0x66, 0x6c, 0x20, 0x8, 0x10, - 0x5, 0xc0, 0x0, 0x0, 0xb2, 0x0, 0x3e, 0x5, - 0x1c, 0x76, 0x66, 0x6c, 0x20, 0x0, 0x90, 0x70, - 0x6c, 0x60, 0x0, 0x20, 0x0, 0x0, 0x45, 0x6, - 0xc6, 0x66, 0x66, 0xb3, 0x0, 0xa, 0x3, 0xa0, - 0x0, 0x10, 0xd, 0x10, 0x46, 0x93, 0x6a, 0x50, - 0x8b, 0x0, 0xd0, 0x2, 0xd5, 0x20, 0xa7, 0x72, - 0x1, 0xd, 0x0, 0xa, 0x40, 0xa, 0x30, 0x0, - 0x70, 0xd0, 0x0, 0xc4, 0x0, 0x5b, 0xbb, 0xa4, - 0xd, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, 0x4c, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, - 0x0, - - /* U+6E08 "済" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x30, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x1, - 0xc2, 0x0, 0x0, 0x5a, 0x0, 0x33, 0x0, 0x7, - 0x71, 0x79, 0x66, 0x66, 0xe7, 0x50, 0x0, 0x0, - 0x20, 0x54, 0x0, 0x96, 0x0, 0x6, 0x20, 0x5, - 0x0, 0xb3, 0x79, 0x0, 0x0, 0x1e, 0x22, 0x30, - 0x2, 0xfc, 0x0, 0x0, 0x0, 0x83, 0x70, 0x6, - 0xa4, 0x7c, 0x73, 0x10, 0x0, 0x18, 0x57, 0xa0, - 0x0, 0x1c, 0xcb, 0x10, 0x7, 0x20, 0x2d, 0x66, - 0x66, 0xe0, 0x0, 0x34, 0xc0, 0x2, 0xa0, 0x0, - 0xd, 0x0, 0x1, 0xb9, 0x0, 0x4b, 0x66, 0x66, - 0xd0, 0x0, 0x7, 0x70, 0x7, 0x40, 0x0, 0xd, - 0x0, 0x0, 0x97, 0x0, 0xb0, 0x0, 0x0, 0xd0, - 0x0, 0x6, 0x60, 0x64, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x60, 0x0, - - /* U+6E09 "渉" */ - 0x0, 0x31, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x0, 0x1d, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x6, 0x71, 0xb, 0x20, 0xd0, 0x3, 0x0, - 0x0, 0x0, 0x5, 0xc, 0x0, 0xd6, 0x68, 0x10, - 0x8, 0x20, 0x5, 0xc, 0x0, 0xd0, 0x0, 0x0, - 0x1, 0xe1, 0x55, 0x6d, 0x66, 0xe6, 0x66, 0xd2, - 0x0, 0x81, 0x81, 0x10, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0x3, 0x60, 0x8, 0x70, 0xd0, 0x63, 0x0, - 0x0, 0x9, 0x0, 0xd, 0x10, 0xd0, 0xb, 0x70, - 0x4, 0x7a, 0x0, 0x56, 0x0, 0xd0, 0xc4, 0xc0, - 0x0, 0xb7, 0x0, 0x90, 0x0, 0xdb, 0x80, 0x0, - 0x0, 0x85, 0x3, 0x10, 0x2, 0xc6, 0x0, 0x0, - 0x0, 0xb6, 0x0, 0x0, 0x6b, 0x20, 0x0, 0x0, - 0x0, 0x53, 0x0, 0x69, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x15, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+6E1B "減" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x2b, 0x31, 0x0, - 0x0, 0x78, 0x0, 0x0, 0x0, 0xb, 0x1d, 0x10, - 0x0, 0xe, 0x11, 0x10, 0x0, 0xc, 0x4, 0x70, - 0x0, 0x2, 0x6, 0xc6, 0x66, 0x6d, 0x66, 0x71, - 0x24, 0x0, 0x42, 0xb0, 0x0, 0xc, 0x0, 0x0, - 0xa, 0x70, 0x61, 0xb4, 0x6a, 0x9c, 0x4, 0x50, - 0x1, 0xc1, 0x51, 0xa0, 0x0, 0xb, 0xa, 0x60, - 0x0, 0x7, 0x12, 0xa7, 0x66, 0xbb, 0x1d, 0x0, - 0x0, 0x9, 0x2, 0x99, 0x31, 0xa8, 0x79, 0x0, - 0x0, 0x76, 0x4, 0x89, 0x31, 0xa5, 0xe2, 0x0, - 0x17, 0xf1, 0x6, 0x69, 0x86, 0xa4, 0xd0, 0x20, - 0x0, 0xe0, 0xa, 0x28, 0x21, 0x7c, 0xa4, 0x60, - 0x1, 0xf0, 0x1a, 0x0, 0x0, 0xa2, 0x2c, 0x90, - 0x1, 0xe0, 0x81, 0x0, 0x19, 0x10, 0x5, 0xf1, - 0x0, 0x1, 0x20, 0x0, 0x40, 0x0, 0x0, 0x31, - - /* U+6E21 "渡" */ - 0x0, 0x60, 0x0, 0x0, 0x5, 0x50, 0x0, 0x0, - 0x0, 0x4c, 0x1, 0x0, 0x0, 0xd1, 0x0, 0x40, - 0x0, 0xb, 0x13, 0xc6, 0x66, 0x76, 0x66, 0x93, - 0x12, 0x0, 0x14, 0xa0, 0x2b, 0x1, 0xb0, 0x0, - 0xa, 0x50, 0x53, 0xa0, 0x1a, 0x1, 0xa2, 0x50, - 0x2, 0xd0, 0x62, 0xc6, 0x6c, 0x66, 0xc6, 0x50, - 0x0, 0x22, 0x53, 0x90, 0x1a, 0x1, 0xa0, 0x0, - 0x0, 0x8, 0x3, 0x90, 0x1a, 0x66, 0x80, 0x0, - 0x0, 0xa, 0x5, 0x72, 0x66, 0x66, 0x92, 0x0, - 0x14, 0x96, 0x7, 0x50, 0x33, 0x3, 0xc0, 0x0, - 0x2, 0xe3, 0x9, 0x20, 0x9, 0x2c, 0x20, 0x0, - 0x0, 0xd1, 0xc, 0x0, 0x2, 0xf6, 0x0, 0x0, - 0x0, 0xf2, 0x45, 0x0, 0x4b, 0x5c, 0x70, 0x0, - 0x0, 0x82, 0x80, 0x48, 0x60, 0x0, 0x9f, 0xc3, - 0x0, 0x2, 0x4, 0x10, 0x0, 0x0, 0x1, 0x30, - - /* U+6E29 "温" */ - 0x0, 0x40, 0x0, 0x20, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x4c, 0x0, 0xd6, 0x66, 0x66, 0xf1, 0x0, - 0x0, 0x7, 0x1, 0xd1, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0x31, 0xd6, 0x66, 0x66, 0xe0, 0x0, - 0x9, 0x20, 0x50, 0xd1, 0x0, 0x0, 0xe0, 0x0, - 0x4, 0xb0, 0x60, 0xd1, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x23, 0x40, 0xe6, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0x8, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xc, 0x66, 0x86, 0x96, 0x6d, 0x0, - 0x0, 0x58, 0xd, 0x1, 0xa0, 0xc0, 0xc, 0x0, - 0x7, 0xf5, 0xd, 0x1, 0xa0, 0xc0, 0xc, 0x0, - 0x0, 0xd3, 0xd, 0x1, 0xa0, 0xc0, 0xc, 0x0, - 0x0, 0xf2, 0xd, 0x1, 0xa0, 0xc0, 0xc, 0x0, - 0x0, 0xd4, 0x6e, 0x66, 0xc6, 0xd6, 0x6d, 0xd4, - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6E2F "港" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x60, 0x0, 0x8, 0x60, 0xd, 0x0, 0x0, - 0x0, 0x4d, 0x0, 0x8, 0x50, 0xd, 0x0, 0x0, - 0x0, 0xa, 0x12, 0x6b, 0x96, 0x6e, 0x6c, 0x10, - 0x2, 0x0, 0x40, 0x28, 0x50, 0xd, 0x0, 0x0, - 0x9, 0x70, 0x50, 0x8, 0x50, 0xd, 0x0, 0x20, - 0x1, 0xd1, 0x68, 0x6a, 0xa6, 0x6b, 0x66, 0xa1, - 0x0, 0x15, 0x10, 0xb, 0x40, 0x6, 0x0, 0x0, - 0x0, 0x8, 0x0, 0x5b, 0x0, 0x5, 0xa0, 0x0, - 0x0, 0x8, 0x2, 0xcd, 0x66, 0x6c, 0x5d, 0x71, - 0x2, 0x85, 0x29, 0x1c, 0x0, 0xb, 0x2, 0x70, - 0x5, 0xf3, 0x50, 0xd, 0x66, 0x6c, 0x11, 0x0, - 0x0, 0xe0, 0x0, 0xc, 0x0, 0x2, 0x5, 0x0, - 0x1, 0xf0, 0x0, 0xc, 0x0, 0x0, 0x7, 0x30, - 0x0, 0xb0, 0x0, 0xb, 0xcc, 0xcc, 0xbc, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6E56 "湖" */ - 0x0, 0x20, 0x0, 0x57, 0x0, 0x0, 0x0, 0x0, - 0x9, 0x60, 0x5, 0x70, 0xa, 0x66, 0xc3, 0x0, - 0x19, 0x20, 0x57, 0x0, 0xc0, 0xb, 0x0, 0x0, - 0x5, 0x59, 0xa9, 0x6c, 0x0, 0xb0, 0x28, 0x0, - 0x51, 0x57, 0x0, 0xb6, 0x6d, 0x0, 0x88, 0x15, - 0x5, 0x70, 0xb, 0x0, 0xb0, 0x1, 0x55, 0x12, - 0x57, 0x30, 0xb0, 0xb, 0x0, 0x0, 0x80, 0xd6, - 0x6d, 0xc, 0x0, 0xb0, 0x0, 0x8, 0xc, 0x0, - 0xc0, 0xd6, 0x6d, 0x1, 0x38, 0x50, 0xc0, 0xc, - 0xc, 0x0, 0xb0, 0x3, 0xe2, 0xd, 0x66, 0xc4, - 0x80, 0xb, 0x0, 0xd, 0x0, 0xc0, 0x7, 0xb1, - 0x0, 0xb0, 0x0, 0xf0, 0x8, 0x0, 0x65, 0x4, - 0x3c, 0x0, 0xa, 0x0, 0x0, 0x54, 0x0, 0x2c, - 0xb0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, - - /* U+6E90 "源" */ - 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, - 0x0, 0x6c, 0x2, 0xc6, 0x66, 0x78, 0x68, 0x90, - 0x0, 0xc, 0x5, 0xb0, 0x0, 0x87, 0x0, 0x0, - 0x0, 0x0, 0x24, 0xb0, 0x86, 0xb6, 0x6b, 0x10, - 0x18, 0x10, 0x52, 0xb0, 0xd0, 0x0, 0xd, 0x0, - 0x6, 0xd0, 0x62, 0xb0, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0x92, 0x53, 0xb0, 0xd6, 0x66, 0x6d, 0x0, - 0x0, 0x7, 0x13, 0x90, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0x9, 0x6, 0x80, 0xe6, 0x79, 0x6d, 0x0, - 0x4, 0x78, 0x9, 0x40, 0x30, 0x3a, 0x1, 0x0, - 0x2, 0xe5, 0xc, 0x0, 0xd4, 0x3a, 0x82, 0x0, - 0x0, 0xb3, 0x37, 0x8, 0x60, 0x3a, 0x1d, 0x50, - 0x0, 0xe3, 0x80, 0x55, 0x0, 0x4a, 0x5, 0xc0, - 0x0, 0x86, 0x22, 0x30, 0x7, 0xf7, 0x0, 0x40, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - - /* U+6E96 "準" */ - 0x0, 0x72, 0x0, 0x1a, 0x4, 0x50, 0x0, 0x0, - 0x0, 0x2c, 0x1, 0x76, 0x0, 0xb0, 0x4, 0x0, - 0x2, 0x2, 0x41, 0xe6, 0x66, 0xa6, 0x69, 0x20, - 0x7, 0x70, 0x67, 0xd1, 0x0, 0xd0, 0x24, 0x0, - 0x0, 0x74, 0x63, 0xc6, 0x66, 0xe6, 0x66, 0x0, - 0x0, 0x9, 0x10, 0xc1, 0x0, 0xd1, 0x25, 0x0, - 0x4, 0x97, 0x0, 0xc6, 0x66, 0xd5, 0x54, 0x0, - 0x0, 0x85, 0x0, 0xc1, 0x0, 0xd0, 0x7, 0x10, - 0x0, 0x66, 0x0, 0x88, 0x66, 0x66, 0x66, 0x30, - 0x0, 0x23, 0x0, 0xd, 0x40, 0x0, 0x0, 0x10, - 0x7, 0x66, 0x66, 0x6e, 0x76, 0x66, 0x67, 0xa0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, - - /* U+6E9D "溝" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x5, 0x70, 0xc, 0x0, 0x0, - 0x0, 0x69, 0x0, 0x5, 0x60, 0xd, 0x4, 0x0, - 0x0, 0xd, 0x25, 0x79, 0xa6, 0x6e, 0x67, 0x40, - 0x0, 0x2, 0x4, 0x59, 0xa6, 0x6e, 0x6b, 0x10, - 0x33, 0x0, 0x40, 0x16, 0x60, 0xd, 0x0, 0x10, - 0xa, 0x70, 0x65, 0x78, 0x89, 0x6a, 0x68, 0x90, - 0x2, 0xb2, 0x50, 0x10, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x0, 0xd6, 0x6e, 0x66, 0xa9, 0x0, - 0x0, 0x9, 0x0, 0xd0, 0xd, 0x0, 0x76, 0x0, - 0x0, 0x85, 0x0, 0xd6, 0x6e, 0x66, 0xa6, 0x0, - 0x18, 0xf0, 0x26, 0xe6, 0x6e, 0x66, 0xaa, 0xa0, - 0x0, 0xe0, 0x1, 0xd0, 0x0, 0x0, 0x76, 0x0, - 0x2, 0xe0, 0x0, 0xd0, 0x0, 0x0, 0x76, 0x0, - 0x2, 0xd0, 0x0, 0xd0, 0x0, 0x29, 0xd4, 0x0, - 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x70, 0x0, - - /* U+6EFF "滿" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x30, 0x0, 0x0, 0xd0, 0x1, 0xb0, 0x0, 0x1, - 0xc2, 0x0, 0xd, 0x0, 0x1c, 0x5, 0x20, 0x7, - 0x75, 0x76, 0xe6, 0x66, 0xd6, 0x64, 0x0, 0x0, - 0x40, 0xd, 0x0, 0x1c, 0x0, 0x6, 0x20, 0x5, - 0x0, 0xe6, 0xc6, 0xc0, 0x0, 0xd, 0x32, 0x40, - 0x2, 0xd, 0x0, 0x0, 0x0, 0x65, 0x72, 0xb6, - 0x66, 0xe6, 0x67, 0xc0, 0x0, 0x8, 0x1b, 0x60, - 0xd, 0x50, 0x3a, 0x0, 0x5, 0x41, 0xb1, 0xb0, - 0xd1, 0xc3, 0xa0, 0x12, 0xc0, 0x1b, 0x3d, 0x8d, - 0x3d, 0xaa, 0x2, 0xbb, 0x1, 0xb7, 0x19, 0xd8, - 0x2b, 0xa0, 0x5, 0x90, 0x1c, 0x0, 0xd, 0x10, - 0x3a, 0x0, 0x89, 0x1, 0xb0, 0x0, 0xd0, 0x3, - 0xa0, 0x6, 0x80, 0x2b, 0x0, 0xd, 0x6, 0xa8, - 0x0, 0x0, 0x1, 0x50, 0x0, 0x20, 0x8, 0x10, - - /* U+6F22 "漢" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x0, 0xa, 0x30, 0xb, 0x20, 0x0, - 0x0, 0x4b, 0x5, 0x6c, 0x66, 0x6d, 0x69, 0x80, - 0x0, 0xb, 0x31, 0xa, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x1, 0x4, 0xb, 0x68, 0x6d, 0x0, 0x0, - 0x7, 0x10, 0x6, 0x3, 0xc, 0x3, 0x0, 0x0, - 0x3, 0xd1, 0x44, 0xc6, 0x6d, 0x66, 0x98, 0x0, - 0x0, 0xa1, 0x71, 0xb0, 0xc, 0x0, 0x66, 0x0, - 0x0, 0x2, 0x61, 0xd6, 0x6d, 0x66, 0x96, 0x0, - 0x0, 0x9, 0x10, 0x20, 0xc, 0x0, 0x61, 0x0, - 0x2, 0x3a, 0x0, 0x76, 0x6d, 0x66, 0x63, 0x0, - 0x4, 0xd7, 0x5, 0x66, 0x6d, 0x66, 0x66, 0xa0, - 0x0, 0x95, 0x1, 0x0, 0x57, 0x61, 0x0, 0x0, - 0x0, 0xc5, 0x0, 0x3, 0xa0, 0xa, 0x60, 0x0, - 0x0, 0x94, 0x0, 0x78, 0x0, 0x0, 0x9e, 0x91, - 0x0, 0x0, 0x15, 0x10, 0x0, 0x0, 0x2, 0x0, - - /* U+6F38 "漸" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x50, 0x0, 0xd, 0x10, 0x0, 0x0, 0x60, - 0x0, 0x3d, 0x0, 0xd, 0x3, 0x26, 0x79, 0x83, - 0x0, 0xa, 0x38, 0x6e, 0x68, 0x5a, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xd, 0x5, 0x3a, 0x0, 0x0, - 0x9, 0x20, 0x4e, 0x6e, 0x6e, 0x4a, 0x0, 0x50, - 0x3, 0xe1, 0x5d, 0xd, 0xd, 0x2c, 0x5d, 0x63, - 0x0, 0x85, 0x1d, 0x6e, 0x6d, 0x29, 0xd, 0x0, - 0x0, 0x8, 0xd, 0xd, 0xd, 0x29, 0xd, 0x0, - 0x0, 0x9, 0xe, 0x6e, 0x6d, 0x39, 0xd, 0x0, - 0x1, 0x86, 0x4, 0xd, 0x3, 0x47, 0xd, 0x0, - 0x6, 0xf3, 0x67, 0x6e, 0x6a, 0x85, 0xd, 0x0, - 0x0, 0xe1, 0x0, 0xd, 0x0, 0xa1, 0xd, 0x0, - 0x0, 0xf1, 0x0, 0xd, 0x1, 0x90, 0xd, 0x0, - 0x0, 0xc0, 0x0, 0xe, 0x8, 0x10, 0xd, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x21, 0x0, 0x7, 0x0, - - /* U+6FC3 "濃" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0xc0, 0xa3, 0x0, 0x0, - 0x0, 0x78, 0x2, 0x86, 0xd6, 0xc6, 0x6a, 0x0, - 0x0, 0xe, 0x24, 0x90, 0xb0, 0xa1, 0xd, 0x0, - 0x0, 0x2, 0x43, 0xb6, 0xd6, 0xc6, 0x6d, 0x0, - 0x8, 0x10, 0x63, 0x90, 0xb0, 0xa1, 0xd, 0x0, - 0x3, 0xe1, 0x63, 0x96, 0x66, 0x66, 0x68, 0x0, - 0x0, 0x96, 0x19, 0x76, 0x66, 0x66, 0x6a, 0x30, - 0x0, 0x9, 0x9, 0x40, 0x0, 0x0, 0x32, 0x0, - 0x0, 0x28, 0x9, 0x47, 0x66, 0x66, 0x64, 0x0, - 0x5, 0xc3, 0x9, 0x89, 0x67, 0x66, 0x67, 0x90, - 0x2, 0xf0, 0xa, 0x2d, 0x6, 0x1, 0xc3, 0x0, - 0x0, 0xe0, 0xc, 0xd, 0x2, 0x97, 0x20, 0x0, - 0x1, 0xf0, 0x28, 0xd, 0x14, 0x3b, 0x50, 0x0, - 0x0, 0x80, 0x80, 0xe, 0x81, 0x1, 0xaf, 0x91, - 0x0, 0x1, 0x10, 0x1, 0x0, 0x0, 0x0, 0x0, - - /* U+6FDF "濟" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x20, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, - 0x0, 0xa6, 0x0, 0x0, 0x8, 0x10, 0x6, 0x20, - 0x0, 0x2d, 0x17, 0x66, 0xa6, 0x98, 0x66, 0x40, - 0x0, 0x1, 0x40, 0x1, 0x94, 0xa3, 0x29, 0x0, - 0x29, 0x10, 0x56, 0xca, 0x89, 0x37, 0x91, 0x0, - 0x6, 0xb3, 0x21, 0xa7, 0x4c, 0xb, 0x45, 0x0, - 0x0, 0x77, 0x7, 0x49, 0x3c, 0xb, 0x3c, 0x20, - 0x0, 0x8, 0x18, 0x4d, 0xb, 0x1b, 0x25, 0xa1, - 0x0, 0x54, 0x20, 0xd2, 0x0, 0x0, 0x96, 0x0, - 0x13, 0xd0, 0x0, 0xe6, 0x66, 0x66, 0xb5, 0x0, - 0x7, 0xc0, 0x0, 0xd0, 0x0, 0x0, 0x95, 0x0, - 0x2, 0xb0, 0x0, 0xc6, 0x66, 0x66, 0xb5, 0x0, - 0x5, 0xb0, 0x6, 0x50, 0x0, 0x0, 0x95, 0x0, - 0x2, 0x80, 0x48, 0x0, 0x0, 0x0, 0x95, 0x0, - 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x52, 0x0, - - /* U+7063 "灣" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x9, 0x40, 0xa, 0x10, 0x57, 0x0, - 0x0, 0xa5, 0x26, 0x65, 0x79, 0x94, 0x65, 0x70, - 0x0, 0x2c, 0x88, 0xa0, 0x46, 0x76, 0x7b, 0x0, - 0x0, 0x2, 0x27, 0x32, 0x45, 0x50, 0x72, 0x50, - 0x46, 0x4, 0x99, 0x59, 0x54, 0x66, 0xb5, 0xb0, - 0xb, 0x66, 0x23, 0x21, 0xb6, 0xc2, 0x31, 0x30, - 0x3, 0x77, 0xa5, 0x6a, 0xb1, 0xb6, 0x5a, 0xb0, - 0x0, 0x35, 0x50, 0x22, 0x85, 0x86, 0x54, 0x20, - 0x0, 0x80, 0x6, 0x76, 0x66, 0x66, 0xe3, 0x0, - 0x1, 0xb0, 0x5, 0x86, 0x66, 0x66, 0xe0, 0x0, - 0x3c, 0x90, 0x8, 0x50, 0x0, 0x0, 0x34, 0x0, - 0x6, 0x80, 0x8, 0x66, 0x66, 0x66, 0x9c, 0x0, - 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, - 0x8, 0x80, 0x0, 0x0, 0x1, 0x53, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x70, 0x0, - - /* U+706B "火" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x30, 0x0, - 0x0, 0x2, 0x30, 0xc, 0x30, 0x4, 0xf2, 0x0, - 0x0, 0x9, 0x10, 0xd, 0x30, 0xc, 0x30, 0x0, - 0x0, 0x4d, 0x0, 0xe, 0x60, 0x92, 0x0, 0x0, - 0x2, 0xf5, 0x0, 0x1e, 0x46, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x69, 0x8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc3, 0x6, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xb0, 0x0, 0xc3, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x10, 0x0, 0x2d, 0x40, 0x0, - 0x0, 0x3, 0xb1, 0x0, 0x0, 0x3, 0xea, 0x30, - 0x1, 0x76, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x70, - 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+707D "災" */ - 0x0, 0x0, 0xa0, 0x2, 0x80, 0x0, 0x91, 0x0, - 0x0, 0x7, 0x70, 0xa, 0x50, 0x7, 0x80, 0x0, - 0x0, 0x27, 0x0, 0x45, 0x0, 0x18, 0x0, 0x0, - 0x0, 0x70, 0x0, 0x80, 0x0, 0x80, 0x0, 0x0, - 0x0, 0x1b, 0x20, 0x4a, 0x10, 0x1a, 0x10, 0x0, - 0x0, 0x4, 0xb0, 0x6, 0xa0, 0x3, 0xd0, 0x0, - 0x0, 0x0, 0x30, 0x0, 0x20, 0x0, 0x60, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x60, 0xd, 0x70, 0x7, 0x60, 0x0, - 0x0, 0x8, 0x60, 0xe, 0x51, 0x49, 0x10, 0x0, - 0x0, 0x4d, 0x10, 0x79, 0xa, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xd1, 0x4, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x3d, 0x30, 0x0, 0x8c, 0x30, 0x0, - 0x0, 0x39, 0x91, 0x0, 0x0, 0x5, 0xec, 0x81, - 0x5, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, - - /* U+70B9 "点" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3b, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x3c, 0x66, 0x66, 0xd3, 0x0, 0x0, 0x0, 0x3b, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, - 0x1, 0x0, 0x0, 0x1c, 0x66, 0x7a, 0x66, 0x6f, - 0x20, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0xe, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1f, - 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0x6, 0x0, - 0x0, 0x0, 0x4, 0x0, 0x0, 0x60, 0x6, 0x0, - 0x52, 0x6, 0x30, 0x3, 0x80, 0x9, 0x50, 0x1d, - 0x0, 0xd3, 0x2f, 0x30, 0x5, 0x70, 0xa, 0x0, - 0x77, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+70BA "為" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x71, 0x6, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3c, 0xa, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xe, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x67, 0x66, 0xab, 0x66, 0x6e, 0x50, 0x0, - 0x0, 0x0, 0x0, 0xc1, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xb6, 0x66, 0x8a, 0x8a, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0xa2, 0x0, - 0x0, 0x0, 0xa8, 0x66, 0x66, 0x66, 0xd7, 0xa0, - 0x0, 0x7, 0x50, 0x0, 0x0, 0x0, 0x4, 0xa0, - 0x0, 0x56, 0x11, 0x10, 0x51, 0x28, 0x6, 0x70, - 0x5, 0x40, 0x80, 0xa1, 0x1d, 0x18, 0x58, 0x50, - 0x1, 0x7, 0x80, 0x6a, 0x7, 0x21, 0x2a, 0x30, - 0x0, 0x1d, 0x20, 0x4, 0x0, 0x0, 0xe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, - - /* U+7121 "無" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x70, 0x0, 0x0, 0x5, 0x0, 0x0, 0x4f, 0x6b, - 0x66, 0xb6, 0xb7, 0x40, 0x1, 0x9d, 0xb, 0x0, - 0xb0, 0xd0, 0x0, 0x6, 0xd, 0xb, 0x0, 0xb0, - 0xd0, 0x0, 0x0, 0xd, 0xb, 0x0, 0xb0, 0xd0, - 0x60, 0x7, 0x6e, 0x6d, 0x66, 0xd6, 0xe6, 0x83, - 0x0, 0xd, 0xb, 0x0, 0xb0, 0xd0, 0x0, 0x0, - 0xd, 0xb, 0x0, 0xb0, 0xd0, 0x0, 0x0, 0xd, - 0xb, 0x0, 0xb0, 0xd0, 0x83, 0x47, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x64, 0x0, 0x60, 0x34, 0x0, - 0x90, 0x6, 0x50, 0x6, 0x70, 0xc, 0x20, 0x5a, - 0x0, 0xd3, 0x5e, 0x10, 0x9, 0x60, 0xa, 0x0, - 0x74, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - - /* U+7136 "然" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe3, 0x0, 0x1, 0xd2, 0x0, 0x0, - 0x0, 0x3, 0xd0, 0x0, 0x1, 0xd2, 0xa1, 0x0, - 0x0, 0x9, 0xa6, 0x6c, 0x11, 0xd0, 0x98, 0x0, - 0x0, 0xd, 0x0, 0x4b, 0x1, 0xc0, 0x25, 0x0, - 0x0, 0x77, 0xb3, 0x87, 0x87, 0xd6, 0x6b, 0x70, - 0x1, 0xb5, 0x27, 0xd1, 0x4, 0x96, 0x0, 0x0, - 0x7, 0xa, 0x55, 0x90, 0x7, 0x68, 0x0, 0x0, - 0x0, 0x2, 0x3c, 0x10, 0xc, 0x12, 0xa0, 0x0, - 0x0, 0x0, 0x95, 0x0, 0x76, 0x0, 0x98, 0x0, - 0x0, 0x8, 0x50, 0x6, 0x60, 0x0, 0xd, 0xd2, - 0x2, 0x72, 0x0, 0x51, 0x0, 0x0, 0x1, 0x10, - 0x1, 0x6, 0x2, 0x60, 0x8, 0x0, 0x83, 0x0, - 0x0, 0x4a, 0x0, 0xd2, 0x7, 0xa0, 0x1e, 0x20, - 0x1, 0xe5, 0x0, 0xb4, 0x2, 0xc0, 0xa, 0x40, - 0x0, 0x20, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+7159 "煙" */ - 0x0, 0x8, 0x20, 0x0, 0x0, 0x0, 0x3, 0x20, - 0x0, 0xd, 0x20, 0x67, 0x6c, 0x6c, 0x67, 0x60, - 0x0, 0xd, 0x10, 0x0, 0xd, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x1a, 0x4a, 0x6e, 0x6e, 0x6c, 0x30, - 0x2, 0x2c, 0x68, 0xc, 0xd, 0xd, 0xd, 0x0, - 0x7, 0x3c, 0x60, 0xc, 0xd, 0xd, 0xd, 0x0, - 0x2e, 0x1c, 0x0, 0xc, 0xd, 0xd, 0xd, 0x0, - 0x13, 0xd, 0x0, 0xd, 0x69, 0x69, 0x6c, 0x0, - 0x0, 0xe, 0x0, 0x4, 0x0, 0xe1, 0x0, 0x0, - 0x0, 0xe, 0x60, 0x0, 0x0, 0xd0, 0x2, 0x0, - 0x0, 0x2a, 0x4c, 0x17, 0x66, 0xe6, 0x78, 0x0, - 0x0, 0x75, 0xa, 0x50, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xb0, 0x1, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x8, 0x20, 0x3, 0x66, 0x66, 0xe6, 0x67, 0xd1, - 0x22, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+71B1 "熱" */ - 0x0, 0x0, 0xb3, 0x0, 0x3, 0x80, 0x0, 0x0, - 0x0, 0xc, 0x4, 0x0, 0x39, 0x0, 0x0, 0x0, - 0x76, 0xd6, 0x73, 0x25, 0xb4, 0xa0, 0x0, 0x0, - 0xc, 0x1, 0x44, 0x69, 0x3b, 0x0, 0x6, 0x79, - 0x68, 0x76, 0x5, 0x72, 0xa0, 0x0, 0x9, 0x82, - 0xa, 0x82, 0x75, 0x2a, 0x0, 0x7, 0x40, 0xc3, - 0xb, 0x3d, 0x51, 0xb0, 0x1, 0x26, 0x6d, 0x6c, - 0x21, 0xce, 0x4d, 0x2, 0x0, 0x20, 0xc0, 0x0, - 0x83, 0x34, 0x86, 0x60, 0x2, 0x5e, 0x75, 0x66, - 0x0, 0x1, 0xd9, 0x8, 0xb5, 0x10, 0x4, 0x0, - 0x0, 0x2, 0x70, 0x1, 0x60, 0x16, 0x1, 0x90, - 0x8, 0x30, 0x0, 0xa3, 0x0, 0xa4, 0x7, 0x90, - 0x1e, 0x10, 0x9b, 0x0, 0x5, 0x60, 0x18, 0x0, - 0xa3, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+71DF "營" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x60, 0x0, 0x29, 0x0, 0x0, 0x0, - 0x6, 0x75, 0x95, 0x33, 0x83, 0xb0, 0x0, 0x9, - 0x49, 0x82, 0x2b, 0x5a, 0x60, 0x0, 0x0, 0x40, - 0xc7, 0x85, 0x3a, 0x57, 0x40, 0x0, 0x0, 0x83, - 0x6, 0x55, 0x70, 0xb, 0x70, 0x0, 0x41, 0x0, - 0x2, 0x40, 0x0, 0x18, 0x0, 0x2a, 0x66, 0x66, - 0x66, 0x66, 0x69, 0xd2, 0xd, 0x30, 0xa6, 0x66, - 0x66, 0xd3, 0x60, 0x0, 0x20, 0xb, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0x0, 0xc6, 0x66, 0x66, - 0xd1, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x1, - 0x50, 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, 0x6d, - 0x50, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xb2, - 0x0, 0x0, 0xc, 0x66, 0x66, 0x66, 0x6d, 0x30, - 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x51, 0x0, - - /* U+722D "爭" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x6b, 0x20, 0x0, - 0x4, 0x56, 0x78, 0x9a, 0x98, 0x73, 0x0, 0x0, - 0x31, 0x0, 0x81, 0x0, 0x1c, 0x10, 0x0, 0x0, - 0xc3, 0x2, 0xd0, 0x9, 0x40, 0x0, 0x0, 0x4, - 0x60, 0x6, 0x4, 0x50, 0x0, 0x0, 0x3, 0x66, - 0x66, 0x66, 0x76, 0xc4, 0x0, 0x0, 0x0, 0x0, - 0x2a, 0x0, 0xd, 0x0, 0x2, 0x66, 0x66, 0x67, - 0xc6, 0x66, 0xe6, 0xd3, 0x1, 0x0, 0x0, 0x2a, - 0x0, 0xd, 0x0, 0x0, 0x3, 0x66, 0x67, 0xc6, - 0x66, 0xe0, 0x0, 0x0, 0x1, 0x0, 0x2a, 0x0, - 0x7, 0x0, 0x0, 0x0, 0x0, 0x2, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x3a, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xbf, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, - 0x0, - - /* U+7236 "父" */ - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x80, 0x2, 0x61, 0x0, 0x0, - 0x0, 0x0, 0xa9, 0x0, 0x0, 0x1a, 0x70, 0x0, - 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, - 0x0, 0x84, 0x10, 0x0, 0x0, 0x43, 0x1d, 0x20, - 0x6, 0x10, 0x23, 0x0, 0x0, 0xc6, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x0, 0x3, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x50, 0xb, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa2, 0x4a, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2c, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xd3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xb3, 0x2d, 0x81, 0x0, 0x0, - 0x0, 0x0, 0x79, 0x10, 0x0, 0x8f, 0xb6, 0x30, - 0x0, 0x68, 0x30, 0x0, 0x0, 0x1, 0x8d, 0x81, - 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7238 "爸" */ - 0x0, 0x0, 0x6, 0x60, 0x0, 0x54, 0x0, 0x0, - 0x0, 0x0, 0x5c, 0x30, 0x0, 0x5, 0xc4, 0x0, - 0x0, 0x7, 0x72, 0x40, 0x4, 0xc0, 0x3f, 0x0, - 0x1, 0x61, 0x0, 0x57, 0x4c, 0x10, 0x1, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x28, 0xb4, 0x8, 0xb8, 0x53, 0x31, - 0x4, 0x68, 0x92, 0x0, 0x0, 0x8, 0x8a, 0x91, - 0x0, 0x0, 0xd6, 0x67, 0xc6, 0x6e, 0x30, 0x0, - 0x0, 0x0, 0xc0, 0x3, 0xa0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xc0, 0x3, 0xa0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6a, 0x2, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x6, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xb, 0x10, - 0x0, 0x0, 0xbc, 0xcc, 0xcc, 0xcc, 0xcd, 0x30, - - /* U+7247 "片" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0xf, - 0x20, 0x0, 0xd1, 0x0, 0x0, 0x0, 0xe, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0xd1, 0x0, 0x10, 0x0, 0xe, 0x66, 0x66, 0xe6, - 0x66, 0xf5, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0x66, 0x66, 0x6c, 0x30, 0x0, 0x0, - 0x3b, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x67, - 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0xb1, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x3, 0x90, 0x0, 0x0, - 0xd, 0x10, 0x0, 0x9, 0x0, 0x0, 0x0, 0xd, - 0x10, 0x0, 0x50, 0x0, 0x0, 0x0, 0xd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - - /* U+725B "牛" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x9, 0x60, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe3, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4e, - 0x66, 0x6e, 0x66, 0x6b, 0xa0, 0x0, 0xa, 0x30, - 0x1, 0xd0, 0x0, 0x0, 0x0, 0x2, 0x90, 0x0, - 0x1d, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x1, - 0xd0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1d, - 0x0, 0x0, 0x84, 0x4, 0x76, 0x66, 0x66, 0xe6, - 0x66, 0x69, 0x80, 0x0, 0x0, 0x0, 0x1d, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, - - /* U+7260 "牠" */ - 0x0, 0x0, 0xc1, 0x0, 0x0, 0x85, 0x0, 0x0, - 0x0, 0x10, 0xd0, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0xf4, 0xd0, 0x0, 0x90, 0xa2, 0x0, 0x0, - 0x1, 0xd0, 0xd0, 0x0, 0xc0, 0xa2, 0x5, 0x10, - 0x4, 0xb6, 0xe9, 0x80, 0xc0, 0xb7, 0x6c, 0x60, - 0x8, 0x20, 0xd0, 0x26, 0xd6, 0xb2, 0x9, 0x30, - 0x8, 0x0, 0xd0, 0x31, 0xc0, 0xa2, 0x9, 0x30, - 0x21, 0x0, 0xd0, 0x10, 0xc0, 0xa2, 0xa, 0x20, - 0x0, 0x0, 0xe7, 0x20, 0xc0, 0xa2, 0xc, 0x10, - 0x2, 0x79, 0xd0, 0x0, 0xc0, 0xa6, 0xcd, 0x0, - 0xb, 0x50, 0xd0, 0x0, 0xc0, 0xa2, 0x31, 0x20, - 0x0, 0x0, 0xd0, 0x0, 0xc0, 0x71, 0x0, 0x60, - 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xd0, 0x0, 0x9b, 0xbb, 0xbc, 0xb1, - 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7269 "物" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x78, 0x0, 0x0, 0x0, - 0x0, 0x50, 0xd0, 0x0, 0xb4, 0x0, 0x0, 0x0, - 0x0, 0xe2, 0xd0, 0x1, 0xd0, 0x0, 0x0, 0x30, - 0x2, 0xb0, 0xd3, 0x36, 0x99, 0x97, 0xb6, 0xe0, - 0x6, 0x96, 0xe6, 0x5a, 0xb, 0x25, 0x91, 0xc0, - 0x8, 0x0, 0xd0, 0x52, 0xc, 0x8, 0x62, 0xb0, - 0x13, 0x0, 0xd0, 0x30, 0x75, 0xd, 0x13, 0xb0, - 0x0, 0x0, 0xd5, 0x41, 0xb0, 0x2c, 0x4, 0xa0, - 0x0, 0x39, 0xe1, 0x8, 0x10, 0x86, 0x5, 0x90, - 0xb, 0xa1, 0xd0, 0x43, 0x1, 0xc0, 0x6, 0x70, - 0x1, 0x0, 0xd0, 0x20, 0xa, 0x30, 0x8, 0x60, - 0x0, 0x0, 0xd0, 0x0, 0x74, 0x0, 0xa, 0x40, - 0x0, 0x0, 0xd0, 0x5, 0x40, 0x53, 0x4e, 0x10, - 0x0, 0x0, 0xe0, 0x41, 0x0, 0xa, 0xf6, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x1, 0x10, 0x0, - - /* U+7279 "特" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xc1, 0x0, 0x1, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x1, 0xd0, 0x0, 0x0, - 0x3, 0xd1, 0xd0, 0x18, 0x66, 0xe6, 0xa8, 0x0, - 0x5, 0x90, 0xd0, 0x10, 0x1, 0xd0, 0x0, 0x0, - 0x7, 0x86, 0xe7, 0xb0, 0x1, 0xd0, 0x0, 0x20, - 0x9, 0x0, 0xd0, 0x76, 0x66, 0xb6, 0x69, 0xb0, - 0x6, 0x0, 0xd0, 0x0, 0x0, 0x8, 0x60, 0x0, - 0x0, 0x0, 0xe6, 0x50, 0x0, 0x9, 0x51, 0x60, - 0x0, 0x28, 0xe1, 0x57, 0x66, 0x6b, 0x96, 0x71, - 0xa, 0xc4, 0xd0, 0x7, 0x0, 0x9, 0x50, 0x0, - 0x3, 0x0, 0xd0, 0x5, 0xc0, 0x9, 0x50, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x9, 0x50, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x10, 0x9, 0x40, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x5, 0xdf, 0x20, 0x0, - 0x0, 0x0, 0x60, 0x0, 0x0, 0x22, 0x0, 0x0, - - /* U+72AC "犬" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x3, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x0, 0xb9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0x0, 0x1f, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0x0, 0x4, 0x3, 0x20, - 0x5, 0x76, 0x66, 0x7d, 0x76, 0x66, 0x6a, 0xa0, - 0x0, 0x0, 0x0, 0x59, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x86, 0x52, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc2, 0x19, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xd0, 0x8, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x60, 0x1, 0xc1, 0x0, 0x0, - 0x0, 0x0, 0x5b, 0x0, 0x0, 0x5d, 0x20, 0x0, - 0x0, 0x5, 0xa0, 0x0, 0x0, 0x7, 0xf7, 0x10, - 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xb1, - 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+72AF "犯" */ - 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x72, 0x8, 0xc2, 0xa6, 0x66, 0x6c, 0x20, - 0x0, 0x9, 0x7b, 0x0, 0xd0, 0x0, 0xe, 0x0, - 0x0, 0x3, 0xf0, 0x0, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0x39, 0x84, 0x0, 0xd0, 0x0, 0xd, 0x0, - 0x4, 0x50, 0x49, 0x0, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x9c, 0x0, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0x3, 0xae, 0x0, 0xd0, 0x11, 0x1d, 0x0, - 0x0, 0x1a, 0xe, 0x0, 0xd0, 0x28, 0xfa, 0x0, - 0x0, 0x91, 0xe, 0x0, 0xd0, 0x0, 0x40, 0x0, - 0x6, 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0x40, - 0x0, 0x0, 0x2c, 0x0, 0xd0, 0x0, 0x0, 0x80, - 0x0, 0x0, 0x78, 0x0, 0xe0, 0x0, 0x0, 0xd3, - 0x0, 0x7d, 0xd1, 0x0, 0x7e, 0xdd, 0xdd, 0xd3, - 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+72B6 "状" */ - 0x0, 0x0, 0xa3, 0x0, 0x19, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x1d, 0x4, 0x91, 0x0, - 0x1, 0x0, 0xd1, 0x0, 0xd, 0x0, 0x8c, 0x0, - 0x9, 0x30, 0xc1, 0x0, 0xd, 0x0, 0x6, 0x0, - 0x2, 0xe1, 0xc1, 0x0, 0xd, 0x0, 0x8, 0x20, - 0x0, 0xc1, 0xc4, 0x76, 0x6e, 0x86, 0x67, 0x50, - 0x0, 0x0, 0xc1, 0x0, 0x2b, 0x60, 0x0, 0x0, - 0x0, 0x3, 0xe1, 0x0, 0x59, 0x70, 0x0, 0x0, - 0x0, 0x65, 0xc1, 0x0, 0x76, 0x45, 0x0, 0x0, - 0x1a, 0x70, 0xc1, 0x0, 0xc2, 0xb, 0x0, 0x0, - 0x29, 0x0, 0xc1, 0x2, 0xb0, 0xa, 0x40, 0x0, - 0x0, 0x0, 0xc1, 0xa, 0x40, 0x3, 0xd1, 0x0, - 0x0, 0x0, 0xd1, 0x39, 0x0, 0x0, 0xad, 0x20, - 0x0, 0x0, 0xd4, 0x90, 0x0, 0x0, 0xd, 0x90, - 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+72C0 "狀" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x10, 0xa, 0x50, 0x0, 0x0, - 0x0, 0xc1, 0xd, 0x0, 0xb, 0x23, 0x70, 0x0, - 0x0, 0xd0, 0xd, 0x0, 0xb, 0x20, 0x97, 0x0, - 0x0, 0xd0, 0xd, 0x0, 0xb, 0x20, 0x14, 0x0, - 0x0, 0xd0, 0xd, 0x13, 0x3c, 0x53, 0x35, 0xa0, - 0x3, 0xc6, 0x6d, 0x24, 0x3c, 0x93, 0x33, 0x31, - 0x0, 0x0, 0xd, 0x0, 0xd, 0x70, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0xd, 0x44, 0x0, 0x0, - 0x4, 0x9a, 0x6d, 0x0, 0x3b, 0x1a, 0x0, 0x0, - 0x0, 0x77, 0xd, 0x0, 0x76, 0xb, 0x20, 0x0, - 0x0, 0xa4, 0xd, 0x0, 0xc1, 0x5, 0xb0, 0x0, - 0x0, 0xc0, 0xd, 0x3, 0xa0, 0x0, 0xc6, 0x0, - 0x5, 0x50, 0xd, 0xa, 0x20, 0x0, 0x3f, 0x70, - 0x7, 0x0, 0xe, 0x54, 0x0, 0x0, 0x5, 0xa2, - 0x10, 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+72EC "独" */ - 0x0, 0x0, 0x5, 0x30, 0x0, 0xb1, 0x0, 0x0, - 0x2, 0x71, 0x1e, 0x40, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x1a, 0xb5, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x9, 0xc0, 0xa, 0x66, 0xe6, 0x6b, 0x20, - 0x0, 0x84, 0xc2, 0xe, 0x0, 0xe0, 0xe, 0x0, - 0x6, 0x10, 0x96, 0xe, 0x0, 0xe0, 0xe, 0x0, - 0x0, 0x2, 0xe9, 0xe, 0x0, 0xe0, 0xe, 0x0, - 0x0, 0xa, 0x6b, 0xe, 0x0, 0xe0, 0xe, 0x0, - 0x0, 0x57, 0x2c, 0xf, 0x66, 0xe6, 0x6f, 0x0, - 0x3, 0x80, 0x2c, 0x8, 0x0, 0xe0, 0x4, 0x0, - 0x15, 0x0, 0x3b, 0x0, 0x0, 0xe0, 0x35, 0x0, - 0x0, 0x0, 0x5a, 0x0, 0x0, 0xe0, 0x9, 0x50, - 0x0, 0x10, 0xa6, 0x46, 0x79, 0xe8, 0x64, 0xf0, - 0x0, 0x4e, 0xb0, 0x7a, 0x62, 0x0, 0x0, 0x80, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+72ED "狭" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x0, 0xc, 0x20, 0x0, 0x0, - 0x2, 0x60, 0x3b, 0x10, 0xe, 0x0, 0x0, 0x0, - 0x0, 0x3a, 0xb0, 0x0, 0xe, 0x0, 0x7, 0x0, - 0x0, 0x1d, 0x60, 0x76, 0x6e, 0x66, 0x68, 0x20, - 0x1, 0x92, 0xb0, 0x30, 0xe, 0x0, 0x91, 0x0, - 0x15, 0x0, 0xe0, 0x49, 0xe, 0x2, 0xc0, 0x0, - 0x0, 0x4, 0xf3, 0xe, 0x1e, 0x8, 0x10, 0x0, - 0x0, 0xb, 0x95, 0x4, 0xe, 0x3, 0x3, 0x30, - 0x0, 0x83, 0x78, 0x86, 0x6d, 0x86, 0x68, 0x70, - 0x4, 0x50, 0x77, 0x0, 0x58, 0x50, 0x0, 0x0, - 0x23, 0x0, 0x86, 0x0, 0xa3, 0x17, 0x0, 0x0, - 0x0, 0x0, 0xa4, 0x3, 0xa0, 0x9, 0x40, 0x0, - 0x1, 0x33, 0xe0, 0x1b, 0x10, 0x0, 0xd6, 0x0, - 0x0, 0x6e, 0x44, 0x81, 0x0, 0x0, 0x2d, 0xb1, - 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+732B "猫" */ - 0x1, 0x0, 0x6, 0x20, 0x55, 0x6, 0x60, 0x0, - 0x2, 0x70, 0x1e, 0x50, 0x76, 0x8, 0x50, 0x0, - 0x0, 0x1a, 0xc4, 0x0, 0x75, 0x8, 0x51, 0x40, - 0x0, 0xa, 0xa2, 0x86, 0xa9, 0x6b, 0x97, 0x81, - 0x0, 0x82, 0xb1, 0x0, 0x75, 0x8, 0x50, 0x0, - 0x5, 0x0, 0x95, 0x0, 0x53, 0x5, 0x20, 0x0, - 0x0, 0x1, 0xe8, 0xc, 0x66, 0x86, 0x6d, 0x20, - 0x0, 0x9, 0x6a, 0xd, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0x47, 0x2a, 0xd, 0x0, 0xd0, 0xd, 0x0, - 0x2, 0x70, 0x2a, 0xd, 0x66, 0xe6, 0x6e, 0x0, - 0x15, 0x0, 0x49, 0xd, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0x0, 0x77, 0xd, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0x44, 0xd2, 0xe, 0x66, 0xe6, 0x6e, 0x0, - 0x0, 0x1c, 0x70, 0xc, 0x0, 0x0, 0x9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+733F "猿" */ - 0x0, 0x0, 0x4, 0x0, 0xa, 0x20, 0x0, 0x0, - 0x5, 0x30, 0x5e, 0x10, 0xe, 0x0, 0x80, 0x0, - 0x0, 0x67, 0xd2, 0x27, 0x6e, 0x66, 0x62, 0x0, - 0x0, 0xe, 0x50, 0x0, 0xe, 0x0, 0x6, 0x50, - 0x0, 0x96, 0x85, 0x76, 0x66, 0x66, 0x66, 0x50, - 0x16, 0x11, 0xd0, 0x1a, 0x66, 0x66, 0xd2, 0x0, - 0x0, 0x6, 0xf0, 0xc, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xb, 0xb3, 0x1d, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0x82, 0xb3, 0x15, 0x86, 0x50, 0x37, 0x30, - 0x4, 0x50, 0xb4, 0x3, 0xb0, 0x80, 0x7a, 0x30, - 0x23, 0x0, 0xc3, 0x3e, 0x70, 0x3c, 0x20, 0x0, - 0x0, 0x0, 0xe5, 0x65, 0x50, 0xa, 0x70, 0x0, - 0x0, 0x15, 0xd0, 0x4, 0x77, 0x30, 0xcc, 0x50, - 0x0, 0x6f, 0x40, 0x6, 0xc1, 0x0, 0x9, 0x80, - 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - - /* U+7372 "獲" */ - 0x0, 0x0, 0x3, 0x0, 0x63, 0x4, 0x80, 0x0, - 0x5, 0x30, 0x3e, 0x66, 0xb7, 0x68, 0xb8, 0xa0, - 0x0, 0x76, 0xc3, 0x11, 0x84, 0x14, 0x80, 0x0, - 0x0, 0xd, 0x60, 0x8, 0x40, 0xc1, 0x0, 0x0, - 0x0, 0x87, 0x80, 0x1e, 0x66, 0xa6, 0x6c, 0x10, - 0x7, 0x30, 0xc0, 0x9c, 0x0, 0xd0, 0x24, 0x0, - 0x10, 0x5, 0xf4, 0x2d, 0x66, 0xe6, 0x66, 0x0, - 0x0, 0xc, 0xc2, 0xd, 0x55, 0xe5, 0x77, 0x0, - 0x0, 0x56, 0x93, 0xd, 0x66, 0xc6, 0x69, 0x60, - 0x2, 0x90, 0x94, 0x6, 0x0, 0x0, 0x40, 0x0, - 0x7, 0x0, 0xa3, 0x7, 0x96, 0x67, 0xe4, 0x0, - 0x10, 0x0, 0xb2, 0x0, 0x37, 0x1b, 0x30, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x7, 0xf4, 0x0, 0x0, - 0x1, 0x8d, 0xa0, 0x2, 0x89, 0x4b, 0xa7, 0x60, - 0x0, 0x8, 0x14, 0x54, 0x0, 0x0, 0x37, 0x20, - - /* U+73A9 "玩" */ - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x18, 0x6a, 0x6a, 0x54, 0x76, 0x66, 0x78, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x40, - 0x5, 0x6e, 0x7c, 0x37, 0x98, 0x6b, 0x67, 0x90, - 0x1, 0xd, 0x10, 0x0, 0xa4, 0xe, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0xb3, 0xe, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0xe0, 0xe, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x11, 0xd0, 0xe, 0x0, 0x0, - 0x0, 0xe, 0x86, 0x26, 0x80, 0xe, 0x0, 0x40, - 0x3c, 0xc5, 0x0, 0xd, 0x10, 0xe, 0x0, 0x70, - 0x6, 0x0, 0x0, 0xa4, 0x0, 0xe, 0x0, 0xb0, - 0x0, 0x0, 0x29, 0x30, 0x0, 0xc, 0xcc, 0xe2, - 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+73FE "現" */ - 0x0, 0x0, 0x3, 0x2, 0x0, 0x0, 0x3, 0x0, - 0x7, 0x6a, 0x69, 0x3e, 0x66, 0x66, 0x6e, 0x10, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0x6c, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xd, 0x5, 0xd, 0x33, 0x33, 0x3c, 0x0, - 0x6, 0x7e, 0x67, 0x2d, 0x33, 0x33, 0x3c, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, - 0x0, 0xd, 0x0, 0xe, 0x7b, 0x6c, 0x6c, 0x0, - 0x0, 0xd, 0x0, 0x3, 0x58, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x14, 0x30, 0xa3, 0xd, 0x0, 0x10, - 0x16, 0x9b, 0x61, 0x2, 0xb0, 0xd, 0x0, 0x60, - 0x1a, 0x30, 0x0, 0x1b, 0x20, 0xd, 0x0, 0xa0, - 0x0, 0x0, 0x3, 0x92, 0x0, 0xc, 0xcc, 0xe3, - 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7403 "球" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x40, 0x0, - 0x0, 0x0, 0x4, 0x0, 0x1, 0xc0, 0x6a, 0x0, - 0x7, 0x6d, 0x68, 0x20, 0x1, 0xc0, 0x8, 0x10, - 0x0, 0xe, 0x0, 0x66, 0x66, 0xd6, 0x68, 0xc1, - 0x0, 0xe, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x56, 0x1, 0xe3, 0x8, 0x60, - 0x7, 0x6e, 0x6a, 0xc, 0x61, 0xc7, 0x3b, 0x20, - 0x0, 0xe, 0x0, 0x4, 0x51, 0xc8, 0x60, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x4, 0xc3, 0x80, 0x0, - 0x0, 0xe, 0x2, 0x32, 0x84, 0xc0, 0xb3, 0x0, - 0x0, 0x3e, 0x85, 0x9b, 0x11, 0xc0, 0x2e, 0x40, - 0x2d, 0xa2, 0x1, 0x90, 0x1, 0xc0, 0x6, 0xd3, - 0x3, 0x0, 0x0, 0x1, 0x12, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x8f, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - - /* U+7406 "理" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x7, 0xc, 0x66, 0x96, 0x6e, 0x0, - 0x7, 0x6d, 0x67, 0x2c, 0x0, 0xc0, 0xc, 0x0, - 0x0, 0xd, 0x0, 0xc, 0x0, 0xc0, 0xc, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x66, 0xd6, 0x6c, 0x0, - 0x0, 0xd, 0x4, 0xc, 0x0, 0xc0, 0xc, 0x0, - 0x7, 0x6e, 0x69, 0x2c, 0x0, 0xc0, 0xc, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x66, 0xd6, 0x6c, 0x0, - 0x0, 0xd, 0x0, 0x4, 0x0, 0xc0, 0x1, 0x0, - 0x0, 0xd, 0x0, 0x20, 0x0, 0xc0, 0x3, 0x0, - 0x0, 0xd, 0x87, 0x27, 0x66, 0xd6, 0x79, 0x10, - 0x1a, 0xd7, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x6, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x1, 0x40, - 0x0, 0x0, 0x7, 0x66, 0x66, 0x86, 0x67, 0x80, - - /* U+74B0 "環" */ - 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x4, 0x0, - 0x7, 0x68, 0x7b, 0x3b, 0x6c, 0x6c, 0x6d, 0x0, - 0x0, 0xc, 0x0, 0x29, 0xb, 0xb, 0xb, 0x0, - 0x0, 0xc, 0x0, 0x2b, 0x69, 0x69, 0x6b, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, - 0x3, 0x4d, 0x68, 0x76, 0x66, 0x66, 0x66, 0x50, - 0x3, 0x3c, 0x21, 0x7, 0x66, 0x66, 0x95, 0x0, - 0x0, 0xc, 0x0, 0xc, 0x0, 0x0, 0x75, 0x0, - 0x0, 0xc, 0x0, 0xc, 0x66, 0x66, 0xa5, 0x0, - 0x0, 0xc, 0x0, 0x6, 0x4a, 0x50, 0x25, 0x80, - 0x0, 0x1d, 0x75, 0x2, 0xe1, 0x35, 0x78, 0x20, - 0x1d, 0xc4, 0x0, 0x3a, 0xc0, 0x7, 0x50, 0x0, - 0x2, 0x0, 0x5, 0x50, 0xb1, 0x50, 0x9b, 0x40, - 0x0, 0x0, 0x10, 0x0, 0xe9, 0x0, 0x6, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - - /* U+7518 "甘" */ - 0x0, 0x0, 0xa3, 0x0, 0x0, 0x93, 0x0, 0x0, - 0x0, 0xd, 0x10, 0x0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, - 0xc, 0x10, 0x0, 0xc, 0x10, 0xb3, 0x37, 0x66, - 0xd6, 0x66, 0x66, 0xd6, 0x66, 0x40, 0x0, 0xc, - 0x10, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0xc1, - 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x10, - 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0xc6, 0x66, - 0x66, 0xd1, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, - 0xc, 0x10, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, - 0xc1, 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0xc, - 0x10, 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0xd2, - 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0xc, 0x20, - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x20, 0x0, - 0x0, - - /* U+751A "甚" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x70, 0x0, 0xd, 0x20, 0x0, 0x0, - 0x0, 0x75, 0x0, 0x0, 0xe0, 0x24, 0x0, 0x37, - 0x6a, 0x96, 0x66, 0x6e, 0x67, 0x80, 0x0, 0x0, - 0x75, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x7, - 0x96, 0x66, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x75, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x7, 0x96, - 0x66, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, - 0x0, 0xe0, 0x0, 0x2, 0x66, 0x6a, 0x96, 0x66, - 0x6e, 0x66, 0xc7, 0x1, 0xb, 0x20, 0x22, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb2, 0xc, 0x80, 0x1a, - 0x50, 0x0, 0x0, 0xb, 0x26, 0x80, 0x0, 0x1e, - 0x60, 0x0, 0x0, 0xb6, 0x70, 0x0, 0x0, 0x37, - 0x0, 0x0, 0xd, 0xa6, 0x66, 0x66, 0x66, 0xc8, - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+751F "生" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x90, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x70, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0x0, 0xa, 0x40, 0x0, 0x82, 0x0, - 0x0, 0x6a, 0x66, 0x6c, 0x86, 0x66, 0x75, 0x0, - 0x0, 0xb0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x4, 0x50, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x7, 0x0, 0x0, 0xa, 0x40, 0x2, 0x30, 0x0, - 0x0, 0x6, 0x66, 0x6c, 0x86, 0x69, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x7, 0x20, - 0x18, 0x66, 0x66, 0x67, 0x66, 0x66, 0x69, 0x60, - - /* U+7522 "產" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, - 0x36, 0x66, 0x6a, 0x76, 0x66, 0xa7, 0x0, 0x0, - 0x10, 0x34, 0x0, 0x3d, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x29, 0xb8, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x27, 0x75, 0xc5, 0x0, 0x0, 0x0, 0x30, 0x33, - 0x0, 0x0, 0xa0, 0x45, 0x0, 0xa, 0x86, 0x76, - 0x69, 0x66, 0x66, 0x50, 0x0, 0x94, 0xc, 0x30, - 0xd2, 0x0, 0x0, 0x0, 0xa, 0x33, 0xd6, 0x6e, - 0x66, 0x7b, 0x0, 0x0, 0xb1, 0x80, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0xb, 0x23, 0x0, 0xd, 0x0, - 0x61, 0x0, 0x0, 0xa1, 0x7, 0x66, 0xe6, 0x66, - 0x30, 0x0, 0x44, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x7, 0x5, 0x66, 0x66, 0xe6, 0x66, 0x7e, - 0x31, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7523 "産" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x36, 0x66, 0x6a, 0x86, 0x66, 0xd8, 0x0, 0x0, - 0x10, 0x50, 0x0, 0x37, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x90, 0x7, 0x60, 0x0, 0x0, 0x3, 0x0, - 0x7, 0x0, 0x70, 0x1, 0x40, 0x0, 0xa8, 0x66, - 0x66, 0x86, 0x66, 0x77, 0x0, 0xa, 0x30, 0x83, - 0xd, 0x20, 0x0, 0x0, 0x0, 0xa3, 0xd, 0x10, - 0xd0, 0x0, 0x30, 0x0, 0xb, 0x26, 0x96, 0x6e, - 0x66, 0x69, 0x30, 0x0, 0xb0, 0x80, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0xb, 0x31, 0x56, 0x6e, 0x66, - 0xa8, 0x0, 0x0, 0x90, 0x1, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x54, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x7, 0x5, 0x66, 0x66, 0xe6, 0x66, 0x7e, - 0x20, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7528 "用" */ - 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, - 0x3, 0xd6, 0x66, 0x6d, 0x66, 0x66, 0xe0, 0x0, - 0x2b, 0x0, 0x1, 0xb0, 0x0, 0x1c, 0x0, 0x2, - 0xb0, 0x0, 0x1b, 0x0, 0x1, 0xc0, 0x0, 0x2d, - 0x66, 0x66, 0xd6, 0x66, 0x6c, 0x0, 0x2, 0xb0, - 0x0, 0x1b, 0x0, 0x1, 0xc0, 0x0, 0x3a, 0x0, - 0x1, 0xb0, 0x0, 0x1c, 0x0, 0x4, 0xa0, 0x0, - 0x1b, 0x0, 0x1, 0xc0, 0x0, 0x5b, 0x66, 0x66, - 0xd6, 0x66, 0x6c, 0x0, 0x7, 0x60, 0x0, 0x1b, - 0x0, 0x1, 0xc0, 0x0, 0xa3, 0x0, 0x1, 0xb0, - 0x0, 0x1c, 0x0, 0xc, 0x0, 0x0, 0x1b, 0x0, - 0x1, 0xc0, 0x4, 0x50, 0x0, 0x1, 0xc0, 0x22, - 0x5c, 0x0, 0x80, 0x0, 0x0, 0x29, 0x1, 0x6f, - 0x80, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, - 0x0, - - /* U+7530 "田" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x86, - 0x66, 0x66, 0x66, 0x66, 0xb3, 0x2b, 0x0, 0x0, - 0xe0, 0x0, 0xc, 0x12, 0xb0, 0x0, 0xe, 0x0, - 0x0, 0xc1, 0x2b, 0x0, 0x0, 0xe0, 0x0, 0xc, - 0x12, 0xb0, 0x0, 0xe, 0x0, 0x0, 0xc1, 0x2b, - 0x0, 0x0, 0xe0, 0x0, 0xc, 0x12, 0xd6, 0x66, - 0x6e, 0x66, 0x66, 0xd1, 0x2b, 0x0, 0x0, 0xe0, - 0x0, 0xc, 0x12, 0xb0, 0x0, 0xe, 0x0, 0x0, - 0xc1, 0x2b, 0x0, 0x0, 0xe0, 0x0, 0xc, 0x12, - 0xb0, 0x0, 0xe, 0x0, 0x0, 0xc1, 0x2d, 0x66, - 0x66, 0x66, 0x66, 0x6d, 0x22, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x40, - - /* U+7531 "由" */ - 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x1, 0x20, 0x0, 0xd, 0x0, - 0x0, 0x60, 0x3d, 0x66, 0x66, 0xe6, 0x66, 0x6f, - 0x22, 0xb0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x2b, - 0x0, 0x0, 0xd0, 0x0, 0xe, 0x2, 0xb0, 0x0, - 0xd, 0x0, 0x0, 0xe0, 0x2d, 0x66, 0x66, 0xe6, - 0x66, 0x6e, 0x2, 0xb0, 0x0, 0xd, 0x0, 0x0, - 0xe0, 0x2b, 0x0, 0x0, 0xd0, 0x0, 0xe, 0x2, - 0xb0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x2b, 0x0, - 0x0, 0xd0, 0x0, 0xe, 0x3, 0xd6, 0x66, 0x66, - 0x66, 0x66, 0xe0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, - - /* U+7533 "申" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x1, 0x96, 0x66, 0x6e, 0x66, - 0x66, 0xc1, 0x1d, 0x0, 0x0, 0xd0, 0x0, 0x1d, - 0x0, 0xd0, 0x0, 0xd, 0x0, 0x1, 0xd0, 0xd, - 0x0, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0xe6, 0x66, - 0x6e, 0x66, 0x66, 0xd0, 0xd, 0x0, 0x0, 0xd0, - 0x0, 0x1d, 0x1, 0xd0, 0x0, 0xd, 0x0, 0x1, - 0xd0, 0x1e, 0x66, 0x66, 0xe6, 0x66, 0x6d, 0x1, - 0x70, 0x0, 0xd, 0x0, 0x0, 0x40, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, - - /* U+7535 "电" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0xd0, 0x0, - 0x2, 0x0, 0xb7, 0x66, 0x6e, 0x66, 0x66, 0xf1, - 0xa, 0x30, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0xa3, - 0x0, 0xd, 0x0, 0x1, 0xd0, 0xa, 0x86, 0x66, - 0xe6, 0x66, 0x6d, 0x0, 0xa3, 0x0, 0xd, 0x0, - 0x1, 0xd0, 0xa, 0x30, 0x0, 0xd0, 0x0, 0x1d, - 0x0, 0xb8, 0x66, 0x6e, 0x66, 0x66, 0xd0, 0xa, - 0x20, 0x0, 0xd0, 0x0, 0x3, 0x40, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0xe0, - 0x0, 0x0, 0x76, 0x0, 0x0, 0xb, 0xcc, 0xcc, - 0xce, 0x70, - - /* U+7537 "男" */ - 0x0, 0x86, 0x66, 0x66, 0x66, 0x6a, 0x0, 0x0, - 0xc0, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0x0, 0xc0, - 0x0, 0xd0, 0x0, 0x1d, 0x0, 0x0, 0xc6, 0x66, - 0xe6, 0x66, 0x6d, 0x0, 0x0, 0xc0, 0x0, 0xd0, - 0x0, 0x1d, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, - 0x1d, 0x0, 0x0, 0xd6, 0x66, 0xa6, 0x66, 0x6c, - 0x0, 0x0, 0x10, 0x0, 0xe3, 0x0, 0x0, 0x0, - 0x6, 0x66, 0x66, 0xf6, 0x66, 0x66, 0xc0, 0x1, - 0x0, 0x3, 0xa0, 0x0, 0x4, 0xa0, 0x0, 0x0, - 0x9, 0x40, 0x0, 0x7, 0x60, 0x0, 0x0, 0x3b, - 0x0, 0x0, 0xa, 0x30, 0x0, 0x4, 0xc1, 0x2, - 0x41, 0x1d, 0x0, 0x2, 0x97, 0x0, 0x0, 0x3d, - 0xf7, 0x0, 0x43, 0x0, 0x0, 0x0, 0x2, 0x20, - 0x0, - - /* U+753A "町" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7, - 0x66, 0x66, 0xb5, 0x76, 0x68, 0x69, 0xa0, 0xb1, - 0x1c, 0xd, 0x0, 0x0, 0xe0, 0x0, 0xb, 0x11, - 0xc0, 0xd0, 0x0, 0xe, 0x0, 0x0, 0xb1, 0x1c, - 0xd, 0x0, 0x0, 0xe0, 0x0, 0xb, 0x11, 0xc0, - 0xd0, 0x0, 0xe, 0x0, 0x0, 0xb6, 0x6d, 0x6d, - 0x0, 0x0, 0xe0, 0x0, 0xb, 0x11, 0xc0, 0xd0, - 0x0, 0xe, 0x0, 0x0, 0xb1, 0x1c, 0xd, 0x0, - 0x0, 0xe0, 0x0, 0xb, 0x11, 0xc0, 0xd0, 0x0, - 0xe, 0x0, 0x0, 0xc6, 0x6c, 0x6e, 0x0, 0x0, - 0xe0, 0x0, 0xc, 0x10, 0x0, 0xa0, 0x0, 0xe, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x1, 0x11, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xea, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x0, - - /* U+753B "画" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x47, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x83, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa6, - 0x69, 0x66, 0xe0, 0x0, 0x2, 0x3, 0xa0, 0xc, - 0x0, 0xc0, 0xa2, 0xe, 0x12, 0xa0, 0xc, 0x0, - 0xc0, 0xd0, 0xd, 0x2, 0xa0, 0xc, 0x0, 0xc0, - 0xd0, 0xd, 0x2, 0xc6, 0x6d, 0x66, 0xc0, 0xd0, - 0xd, 0x2, 0xa0, 0xc, 0x0, 0xc0, 0xd0, 0xd, - 0x3, 0xa0, 0xc, 0x0, 0xc0, 0xd0, 0xd, 0x3, - 0xc6, 0x6d, 0x66, 0xd0, 0xd0, 0xd, 0x3, 0x70, - 0x0, 0x0, 0x60, 0xd0, 0x2e, 0x66, 0x66, 0x66, - 0x66, 0x66, 0xe0, 0x4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+754C "界" */ - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, - 0x0, 0xb, 0x76, 0x6e, 0x66, 0x67, 0xd0, 0x0, - 0x0, 0xa, 0x20, 0xd, 0x0, 0x3, 0xa0, 0x0, - 0x0, 0xa, 0x76, 0x6e, 0x66, 0x67, 0xa0, 0x0, - 0x0, 0xa, 0x20, 0xd, 0x0, 0x3, 0xa0, 0x0, - 0x0, 0xb, 0x76, 0x8b, 0x67, 0x67, 0xa0, 0x0, - 0x0, 0x3, 0x1, 0xd0, 0x8, 0x10, 0x10, 0x0, - 0x0, 0x0, 0xc, 0x50, 0x0, 0xa5, 0x0, 0x0, - 0x0, 0x3, 0xc6, 0xa0, 0x1, 0xa8, 0xea, 0x71, - 0x2, 0x77, 0x13, 0x60, 0x1, 0xc0, 0x17, 0x50, - 0x3, 0x0, 0x6, 0x20, 0x1, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x0, 0x1, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x83, 0x0, 0x1, 0xc0, 0x0, 0x0, - 0x0, 0x37, 0x20, 0x0, 0x1, 0xc0, 0x0, 0x0, - 0x2, 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - - /* U+7559 "留" */ - 0x0, 0x0, 0x29, 0x90, 0x0, 0x0, 0x0, 0x9, - 0x57, 0x63, 0x17, 0x77, 0x66, 0xc4, 0xd, 0x0, - 0x10, 0x0, 0x77, 0x0, 0xc1, 0xd, 0x0, 0x3a, - 0x10, 0xa3, 0x0, 0xd0, 0xd, 0x0, 0x39, 0xc1, - 0xb0, 0x0, 0xd0, 0xe, 0x89, 0x30, 0x6a, 0x22, - 0x68, 0x90, 0xa, 0x40, 0x1, 0x72, 0x0, 0x3b, - 0x10, 0x0, 0xa6, 0x68, 0x66, 0x66, 0x6b, 0x20, - 0x0, 0xe0, 0x0, 0x3a, 0x0, 0xe, 0x0, 0x0, - 0xe0, 0x0, 0x3a, 0x0, 0xe, 0x0, 0x0, 0xf6, - 0x66, 0x8c, 0x66, 0x6e, 0x0, 0x0, 0xe0, 0x0, - 0x3a, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x3a, - 0x0, 0xe, 0x0, 0x0, 0xf6, 0x66, 0x67, 0x66, - 0x6e, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x2, - 0x0, - - /* U+756A "番" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x6b, 0xc0, 0x0, - 0x0, 0x24, 0x56, 0x89, 0xe8, 0x66, 0x20, 0x0, - 0x0, 0x0, 0x35, 0x0, 0xd0, 0x3d, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0xd0, 0x81, 0x0, 0x20, - 0x4, 0x76, 0x68, 0x7a, 0xe7, 0x76, 0x68, 0x90, - 0x0, 0x0, 0x1, 0xc3, 0xd2, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x3b, 0x20, 0xd0, 0x3b, 0x40, 0x0, - 0x0, 0x18, 0x60, 0x0, 0xe0, 0x1, 0xae, 0xa2, - 0x4, 0x51, 0xb6, 0x66, 0xa6, 0x66, 0xd4, 0x30, - 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0xe6, 0x66, 0xd0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x66, 0xc0, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+756B "畫" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x66, 0x6e, 0x66, 0x6b, 0x20, 0x0, 0x0, - 0x10, 0x0, 0xd0, 0x0, 0xd0, 0x70, 0x4, 0x76, - 0x66, 0x6e, 0x66, 0x6e, 0x66, 0x20, 0x0, 0x66, - 0x55, 0xe5, 0x55, 0xc0, 0x0, 0x0, 0x5, 0x66, - 0x6e, 0x66, 0x67, 0x80, 0x0, 0x0, 0x10, 0x0, - 0xd0, 0x0, 0x1, 0x30, 0x0, 0x76, 0x66, 0x67, - 0x66, 0x66, 0x66, 0x0, 0x0, 0xa6, 0x66, 0x76, - 0x66, 0xa6, 0x0, 0x0, 0xd, 0x0, 0xd, 0x0, - 0xa, 0x30, 0x0, 0x0, 0xd6, 0x66, 0xe6, 0x66, - 0xc3, 0x0, 0x0, 0xd, 0x66, 0x6e, 0x66, 0x6c, - 0x30, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x51, - 0x40, 0x16, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7f, - 0x60, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7570 "異" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, - 0x0, 0xd6, 0x66, 0xd6, 0x66, 0x6e, 0x20, 0x0, - 0xd, 0x0, 0xb, 0x10, 0x0, 0xd0, 0x0, 0x0, - 0xd6, 0x66, 0xd6, 0x66, 0x6d, 0x0, 0x0, 0xd, - 0x0, 0xb, 0x10, 0x0, 0xd0, 0x0, 0x0, 0xd6, - 0x66, 0x96, 0x66, 0x6d, 0x0, 0x0, 0x5, 0xa, - 0x10, 0xa, 0x20, 0x30, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0xd0, 0x1, 0x60, 0x0, 0x76, 0x6e, 0x66, - 0x6e, 0x66, 0x65, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0xd0, 0x0, 0x0, 0x6, 0x76, 0x6b, 0x66, 0x6b, - 0x66, 0x6a, 0x70, 0x0, 0x0, 0x87, 0x0, 0x36, - 0x20, 0x0, 0x0, 0x2, 0xb9, 0x20, 0x0, 0x19, - 0xc4, 0x0, 0x28, 0x71, 0x0, 0x0, 0x0, 0x4, - 0xf2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x10, - - /* U+7576 "當" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0xc3, 0x0, 0x30, 0x0, 0x0, 0x2b, - 0x10, 0xc0, 0x6, 0xc0, 0x0, 0x1, 0x7, 0x40, - 0xc0, 0x9, 0x0, 0x0, 0x9, 0x66, 0x66, 0xb6, - 0x86, 0x66, 0xd7, 0x2b, 0x0, 0x0, 0x0, 0x1, - 0x3, 0x80, 0x75, 0x8, 0x86, 0x66, 0x6c, 0x52, - 0x0, 0x0, 0x7, 0x40, 0x0, 0xa, 0x20, 0x0, - 0x0, 0x7, 0x86, 0x66, 0x6c, 0x30, 0x0, 0x0, - 0x4, 0x10, 0x0, 0x4, 0x0, 0x0, 0x0, 0xc6, - 0x66, 0x76, 0x66, 0x7d, 0x0, 0x0, 0xd0, 0x0, - 0xa2, 0x0, 0x39, 0x0, 0x0, 0xd6, 0x66, 0xc7, - 0x66, 0x89, 0x0, 0x0, 0xd0, 0x0, 0xa2, 0x0, - 0x39, 0x0, 0x0, 0xe6, 0x66, 0xc7, 0x66, 0x8a, - 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x26, 0x0, - - /* U+75B2 "疲" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x0, 0x87, 0x0, 0x3, 0x20, - 0x0, 0x8, 0x86, 0x66, 0x77, 0x66, 0x69, 0x70, - 0x4, 0x8, 0x40, 0x0, 0xd, 0x20, 0x0, 0x0, - 0x7, 0x68, 0x40, 0x96, 0x6e, 0x66, 0x6b, 0x10, - 0x3, 0x98, 0x40, 0xc0, 0xd, 0x0, 0x67, 0x0, - 0x0, 0x8, 0x40, 0xc0, 0xd, 0x0, 0x30, 0x0, - 0x0, 0x5b, 0x40, 0xc0, 0xd, 0x0, 0x60, 0x0, - 0x2d, 0x3a, 0x21, 0xd6, 0x86, 0x67, 0xe2, 0x0, - 0x1, 0xb, 0x3, 0xa0, 0x60, 0xa, 0x50, 0x0, - 0x0, 0xb, 0x7, 0x60, 0x27, 0x4b, 0x0, 0x0, - 0x0, 0x66, 0xc, 0x0, 0x9, 0xd1, 0x0, 0x0, - 0x0, 0xa0, 0x65, 0x0, 0x5b, 0x8a, 0x40, 0x0, - 0x6, 0x13, 0x60, 0x48, 0x50, 0x2, 0xaf, 0x90, - 0x1, 0x1, 0x3, 0x10, 0x0, 0x0, 0x1, 0x0, - - /* U+75C5 "病" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1a, 0x10, 0x0, 0x0, 0x0, - 0x4, 0x0, 0x0, 0x76, 0x0, 0x5, 0x20, 0x0, - 0xc7, 0x66, 0x66, 0x66, 0x66, 0x64, 0x8, 0x2c, - 0x10, 0x0, 0x0, 0x0, 0x5, 0x0, 0x49, 0xc3, - 0x76, 0x66, 0xd6, 0x66, 0x82, 0x0, 0x1c, 0x10, - 0x0, 0xe, 0x0, 0x0, 0x0, 0x5, 0xd1, 0x86, - 0x66, 0xe6, 0x66, 0xb1, 0x2b, 0x2d, 0xd, 0x0, - 0x2b, 0x0, 0xe, 0x0, 0x30, 0xc0, 0xd0, 0x7, - 0x83, 0x0, 0xe0, 0x0, 0x1b, 0xc, 0x0, 0xc0, - 0x76, 0xe, 0x0, 0x4, 0x60, 0xc0, 0x83, 0x0, - 0xe1, 0xe0, 0x0, 0xa1, 0xc, 0x52, 0x0, 0x4, - 0xe, 0x0, 0x27, 0x0, 0xd0, 0x0, 0x1, 0x32, - 0xd0, 0x7, 0x0, 0xd, 0x0, 0x0, 0x5, 0xf9, - 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, 0x0, - - /* U+75DB "痛" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x10, 0x0, 0x2c, 0x0, 0x4, 0x50, - 0x0, 0x3, 0xc6, 0x66, 0x66, 0x66, 0x66, 0x60, - 0x8, 0x23, 0xb0, 0x76, 0x66, 0x66, 0xa8, 0x0, - 0x4, 0xc2, 0xb0, 0x0, 0x33, 0x18, 0x73, 0x0, - 0x0, 0x82, 0xb0, 0x20, 0xc, 0x60, 0x3, 0x0, - 0x0, 0x2, 0xb0, 0xe6, 0x6c, 0x76, 0x6e, 0x20, - 0x0, 0x59, 0xa0, 0xd0, 0xa, 0x20, 0xd, 0x0, - 0x2c, 0x74, 0x80, 0xe6, 0x6c, 0x76, 0x6e, 0x0, - 0x5, 0x7, 0x50, 0xd0, 0xa, 0x20, 0xd, 0x0, - 0x0, 0xb, 0x10, 0xd6, 0x6c, 0x76, 0x6e, 0x0, - 0x0, 0x2a, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, - 0x0, 0x91, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, - 0x5, 0x30, 0x0, 0xd0, 0xa, 0x35, 0xcd, 0x0, - 0x1, 0x0, 0x0, 0x40, 0x1, 0x0, 0x21, 0x0, - - /* U+767A "発" */ - 0x0, 0x0, 0x0, 0x43, 0x0, 0x32, 0x0, 0x0, - 0x46, 0x66, 0x8d, 0x43, 0x2c, 0x40, 0x0, 0x0, - 0x73, 0xb, 0x30, 0x95, 0x1, 0x90, 0x0, 0x2, - 0x97, 0x70, 0x3, 0x71, 0xa5, 0x0, 0x0, 0x6, - 0x80, 0x0, 0x6, 0xd2, 0x0, 0x0, 0x7, 0x60, - 0x0, 0x0, 0x19, 0xdc, 0x71, 0x36, 0x15, 0x7e, - 0x66, 0xe6, 0x50, 0x63, 0x0, 0x0, 0x0, 0xc0, - 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, - 0xd0, 0x0, 0x40, 0x0, 0x76, 0x66, 0xd6, 0x6e, - 0x66, 0x68, 0x30, 0x0, 0x0, 0x58, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0xd, 0x0, - 0x5, 0x0, 0x0, 0x9, 0x30, 0x0, 0xc0, 0x0, - 0x74, 0x1, 0x57, 0x0, 0x0, 0x8, 0xcb, 0xbd, - 0x50, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+767C "發" */ - 0x0, 0x0, 0x0, 0x51, 0x10, 0x32, 0x0, 0x0, - 0x3, 0x86, 0x6f, 0x55, 0xa, 0x20, 0x0, 0x0, - 0x38, 0x9, 0x70, 0x1a, 0x1, 0xc0, 0x0, 0x0, - 0x67, 0x80, 0x0, 0x38, 0x61, 0x0, 0x0, 0x8, - 0x60, 0x0, 0x0, 0x3b, 0x73, 0x10, 0x47, 0x67, - 0xb6, 0x7, 0x76, 0xc7, 0xb4, 0x1, 0x0, 0xb, - 0x20, 0x93, 0xd, 0x0, 0x0, 0x3, 0x11, 0xb2, - 0xb, 0x0, 0xd0, 0x0, 0x0, 0xb6, 0x59, 0x12, - 0x80, 0x7, 0xbb, 0x70, 0xc, 0x10, 0x11, 0x63, - 0x33, 0x37, 0x10, 0x0, 0xc6, 0x6c, 0x70, 0x43, - 0x35, 0xc1, 0x0, 0x0, 0x0, 0xc1, 0x4, 0x30, - 0xb2, 0x0, 0x0, 0x0, 0xd, 0x0, 0x3, 0xca, - 0x0, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x96, 0x6b, - 0x10, 0x0, 0x18, 0xc7, 0x4, 0x72, 0x0, 0x6b, - 0x0, 0x0, 0x5, 0x3, 0x10, 0x0, 0x0, 0x20, - - /* U+767D "白" */ - 0x0, 0x0, 0x1b, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, - 0x0, 0x20, 0xd, 0x67, 0x66, 0x66, 0x66, 0xd6, - 0xe, 0x0, 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, - 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0xe, 0x66, 0x66, 0x66, 0x66, 0xd1, - 0xe, 0x0, 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, - 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0xe, 0x0, 0x0, 0x0, 0x0, 0xc1, - 0xe, 0x66, 0x66, 0x66, 0x66, 0xd1, 0xe, 0x0, - 0x0, 0x0, 0x0, 0xc2, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+767E "百" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x2, - 0x86, 0x66, 0x68, 0x96, 0x66, 0x68, 0x90, 0x0, - 0x0, 0x0, 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, - 0x66, 0x96, 0x66, 0x6c, 0x0, 0x0, 0x1, 0xd0, - 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x1d, 0x0, - 0x0, 0x0, 0x3c, 0x0, 0x0, 0x1, 0xd0, 0x0, - 0x0, 0x3, 0xc0, 0x0, 0x0, 0x1e, 0x66, 0x66, - 0x66, 0x7c, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, - 0x3, 0xc0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, - 0x3c, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x3, - 0xc0, 0x0, 0x0, 0x1e, 0x66, 0x66, 0x66, 0x7c, - 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x3, 0xc0, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+7684 "的" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x30, 0x0, 0x2b, 0x10, 0x0, 0x0, 0xd0, 0x0, - 0x6, 0xc0, 0x0, 0x1, 0x44, 0x3, 0x0, 0xb3, - 0x0, 0x10, 0xe7, 0x66, 0xe4, 0x2d, 0x66, 0x6c, - 0x8d, 0x0, 0xd, 0x9, 0x30, 0x0, 0xb3, 0xd0, - 0x0, 0xd2, 0x60, 0x0, 0xb, 0x3d, 0x0, 0xd, - 0x41, 0x40, 0x0, 0xb3, 0xd6, 0x66, 0xd0, 0xa, - 0x40, 0xc, 0x2d, 0x0, 0xd, 0x0, 0x4b, 0x0, - 0xc2, 0xd0, 0x0, 0xd0, 0x0, 0x40, 0xd, 0x1d, - 0x0, 0xd, 0x0, 0x0, 0x0, 0xd1, 0xd0, 0x0, - 0xd0, 0x0, 0x0, 0xe, 0xe, 0x66, 0x6e, 0x0, - 0x5, 0x25, 0xd0, 0xd0, 0x0, 0xa0, 0x0, 0x1a, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+7686 "皆" */ - 0x28, 0x0, 0x0, 0x1b, 0x0, 0x10, 0x0, 0x2a, - 0x0, 0x0, 0x1c, 0x2, 0xe6, 0x0, 0x2c, 0x66, - 0xa8, 0x1c, 0x3b, 0x40, 0x0, 0x2a, 0x0, 0x0, - 0x1d, 0x40, 0x0, 0x40, 0x2a, 0x0, 0x14, 0x1c, - 0x0, 0x0, 0x70, 0x3d, 0xa9, 0x50, 0xd, 0x0, - 0x1, 0xe2, 0x2a, 0x20, 0xb, 0x28, 0xbb, 0xbb, - 0x80, 0x1, 0x0, 0x37, 0x0, 0x2, 0x0, 0x0, - 0x5, 0xc6, 0x66, 0x66, 0x6c, 0x60, 0x0, 0x4, - 0xa0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x4, 0xc6, - 0x66, 0x66, 0x6c, 0x30, 0x0, 0x4, 0xa0, 0x0, - 0x0, 0xb, 0x30, 0x0, 0x4, 0xa0, 0x0, 0x0, - 0xb, 0x30, 0x0, 0x5, 0xc6, 0x66, 0x66, 0x6c, - 0x30, 0x0, 0x1, 0x10, 0x0, 0x0, 0x1, 0x0, - 0x0, - - /* U+76BF "皿" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x1c, 0x66, 0xa6, 0x6a, 0x66, 0xf2, 0x0, - 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, - 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, - 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, - 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, - 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, - 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, - 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, - 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, - 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe2, 0x90, - 0x6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, - - /* U+76D7 "盗" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x31, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x0, - 0xc3, 0x1, 0x1e, 0x20, 0x0, 0x10, 0x0, 0x4, - 0x74, 0x29, 0x96, 0x66, 0x6e, 0x60, 0x0, 0x1, - 0x83, 0x90, 0x86, 0x4, 0x60, 0x0, 0x0, 0xb2, - 0x70, 0xd, 0x70, 0x20, 0x0, 0x6, 0xe6, 0x0, - 0x4, 0xb6, 0x30, 0x0, 0x0, 0xd, 0x0, 0x0, - 0xc3, 0xb, 0x20, 0x0, 0x0, 0xf0, 0x0, 0x95, - 0x0, 0x3e, 0x82, 0x0, 0x8, 0x4, 0x71, 0x0, - 0x0, 0x38, 0x10, 0x0, 0x96, 0x66, 0x66, 0x66, - 0x6d, 0x20, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, - 0xd0, 0x0, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0xd, - 0x0, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, - 0x0, 0x46, 0xe6, 0x6e, 0x66, 0xe6, 0x6e, 0xab, - 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+76EE "目" */ - 0x1, 0x0, 0x0, 0x0, 0x2, 0x1, 0xd6, 0x66, - 0x66, 0x67, 0xe1, 0x1e, 0x0, 0x0, 0x0, 0x3c, - 0x0, 0xe0, 0x0, 0x0, 0x3, 0xc0, 0xe, 0x0, - 0x0, 0x0, 0x3c, 0x0, 0xf6, 0x66, 0x66, 0x67, - 0xc0, 0xe, 0x0, 0x0, 0x0, 0x3c, 0x0, 0xe0, - 0x0, 0x0, 0x3, 0xc0, 0xf, 0x66, 0x66, 0x66, - 0x7c, 0x0, 0xe0, 0x0, 0x0, 0x3, 0xc0, 0xe, - 0x0, 0x0, 0x0, 0x3c, 0x0, 0xe0, 0x0, 0x0, - 0x3, 0xc0, 0xf, 0x66, 0x66, 0x66, 0x7c, 0x1, - 0xd0, 0x0, 0x0, 0x3, 0xc0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+76F4 "直" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, 0x37, 0x0, - 0x0, 0x76, 0x66, 0x6b, 0x86, 0x66, 0x66, 0x10, - 0x0, 0x0, 0x30, 0xb, 0x10, 0x5, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x20, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x6, 0x40, - 0x6, 0x66, 0x76, 0x66, 0x66, 0x67, 0x67, 0x70, - - /* U+76F8 "相" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x96, 0x66, 0x6c, 0x30, 0x0, - 0xd, 0x0, 0xd, 0x10, 0x0, 0xe0, 0x0, 0x0, - 0xd0, 0x52, 0xd1, 0x0, 0xe, 0x0, 0x67, 0x6f, - 0x67, 0x4c, 0x10, 0x0, 0xe0, 0x0, 0x4, 0xf0, - 0x0, 0xc6, 0x66, 0x6e, 0x0, 0x0, 0x9f, 0x95, - 0xc, 0x10, 0x0, 0xe0, 0x0, 0xc, 0xd1, 0xe0, - 0xc1, 0x0, 0xe, 0x0, 0x6, 0x5d, 0x3, 0xc, - 0x66, 0x66, 0xe0, 0x0, 0xa0, 0xd0, 0x0, 0xc1, - 0x0, 0xe, 0x0, 0x62, 0xd, 0x0, 0xc, 0x10, - 0x0, 0xe0, 0x13, 0x0, 0xd0, 0x0, 0xc1, 0x0, - 0xe, 0x0, 0x0, 0xe, 0x0, 0xd, 0x66, 0x66, - 0xe0, 0x0, 0x0, 0xe0, 0x0, 0xd1, 0x0, 0xd, - 0x0, 0x0, 0x3, 0x0, 0x2, 0x0, 0x0, 0x0, - - /* U+770B "看" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xc0, 0x0, - 0x0, 0x55, 0x67, 0x7e, 0x97, 0x53, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x30, 0x0, - 0x0, 0x37, 0x66, 0xaa, 0x66, 0x68, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1, 0x30, - 0x7, 0x66, 0x69, 0xb6, 0x66, 0x66, 0x69, 0x90, - 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8d, 0x66, 0x66, 0x6c, 0x40, 0x0, - 0x0, 0x4, 0x8d, 0x0, 0x0, 0xb, 0x20, 0x0, - 0x0, 0x38, 0xe, 0x66, 0x66, 0x6d, 0x20, 0x0, - 0x4, 0x50, 0xd, 0x0, 0x0, 0xb, 0x20, 0x0, - 0x1, 0x0, 0xe, 0x66, 0x66, 0x6d, 0x20, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xb, 0x20, 0x0, - 0x0, 0x0, 0xe, 0x66, 0x66, 0x6d, 0x20, 0x0, - 0x0, 0x0, 0x9, 0x0, 0x0, 0x7, 0x10, 0x0, - - /* U+771F "真" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x56, 0x66, 0x6b, 0x96, 0x66, 0x6e, 0x30, - 0x0, 0x20, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x30, 0xc, 0x10, 0x7, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6c, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0x0, 0xc6, 0x66, 0x66, 0x6c, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0x0, 0xc6, 0x66, 0x66, 0x6c, 0x0, 0x0, - 0x5, 0x66, 0xd6, 0x66, 0x66, 0x6d, 0x68, 0xd1, - 0x1, 0x0, 0x6, 0x90, 0x3, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x8a, 0x10, 0x0, 0x3c, 0x60, 0x0, - 0x0, 0x28, 0x40, 0x0, 0x0, 0x1, 0xc7, 0x0, - 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, - - /* U+7720 "眠" */ - 0x0, 0x0, 0x5, 0x22, 0x22, 0x22, 0x70, 0xa, - 0x66, 0xc2, 0xb5, 0x44, 0x44, 0x4e, 0x0, 0xd0, - 0xd, 0xa, 0x20, 0x0, 0x0, 0xd0, 0xd, 0x0, - 0xd0, 0xa2, 0x0, 0x0, 0xd, 0x0, 0xd0, 0xd, - 0xa, 0x76, 0x7a, 0x66, 0xd0, 0xd, 0x66, 0xe0, - 0xa2, 0x3, 0xa0, 0x0, 0x0, 0xd0, 0xd, 0xa, - 0x20, 0x2a, 0x0, 0x21, 0xd, 0x0, 0xd0, 0xa7, - 0x56, 0xd5, 0x58, 0x50, 0xd6, 0x6e, 0xa, 0x20, - 0xd, 0x0, 0x0, 0xd, 0x0, 0xd0, 0xa2, 0x0, - 0xa3, 0x0, 0x0, 0xd0, 0xd, 0xa, 0x20, 0x5, - 0xa0, 0x4, 0xd, 0x66, 0xe0, 0xa2, 0x45, 0xd, - 0x50, 0x50, 0xd0, 0x8, 0xb, 0xc6, 0x0, 0x3e, - 0x77, 0x1, 0x0, 0x0, 0x95, 0x0, 0x0, 0x3d, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x0, - - /* U+773E "眾" */ - 0x1, 0x86, 0x66, 0x66, 0x66, 0x69, 0x70, 0x1, - 0xc0, 0xc, 0x0, 0x30, 0x8, 0x60, 0x0, 0xc0, - 0xc, 0x0, 0x30, 0x8, 0x40, 0x0, 0xc0, 0xc, - 0x0, 0x30, 0x8, 0x40, 0x1, 0xd6, 0x66, 0x66, - 0x66, 0x69, 0x30, 0x0, 0x10, 0x0, 0x0, 0x25, - 0x9c, 0x10, 0x4, 0x56, 0x78, 0x9c, 0x87, 0x54, - 0x10, 0x0, 0x3, 0x10, 0x29, 0x0, 0x50, 0x0, - 0x0, 0xa, 0x70, 0x29, 0x3, 0xe1, 0x0, 0x0, - 0x1e, 0x0, 0x29, 0x6, 0xc0, 0x0, 0x0, 0x88, - 0xb3, 0x29, 0xb, 0x85, 0x0, 0x3, 0xa0, 0x1e, - 0x49, 0x38, 0xc, 0x40, 0x37, 0x0, 0x4, 0x4a, - 0x70, 0x2, 0xe5, 0x0, 0x0, 0x0, 0x29, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, - 0x0, - - /* U+7740 "着" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x83, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x2, 0xe0, 0x6, 0x40, 0x3, 0x0, 0x28, - 0x66, 0x69, 0x96, 0x86, 0x68, 0xb1, 0x0, 0x0, - 0x0, 0x1c, 0x0, 0x4, 0x0, 0x0, 0x0, 0x76, - 0x6a, 0xa6, 0x66, 0x93, 0x0, 0x0, 0x0, 0x0, - 0xc0, 0x0, 0x0, 0x6, 0x0, 0x76, 0x66, 0xb9, - 0x66, 0x66, 0x66, 0x84, 0x0, 0x0, 0x3e, 0x66, - 0x66, 0x69, 0x40, 0x0, 0x0, 0x29, 0xd0, 0x0, - 0x0, 0xa3, 0x0, 0x0, 0x38, 0xd, 0x66, 0x66, - 0x6c, 0x20, 0x0, 0x44, 0x0, 0xd0, 0x0, 0x0, - 0xa2, 0x0, 0x10, 0x0, 0xd, 0x66, 0x66, 0x6c, - 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa2, - 0x0, 0x0, 0x0, 0xd, 0x66, 0x66, 0x6c, 0x30, - 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x40, 0x0, - - /* U+77E5 "知" */ - 0x0, 0x47, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc1, 0x0, 0x20, 0x10, 0x0, 0x2, 0x0, 0x1c, - 0x68, 0x7b, 0x1a, 0x76, 0x67, 0xd0, 0x7, 0x22, - 0xb0, 0x0, 0xa2, 0x0, 0x2a, 0x0, 0x70, 0x2b, - 0x0, 0xa, 0x20, 0x2, 0xa0, 0x20, 0x2, 0xb0, - 0x31, 0xa2, 0x0, 0x2a, 0x5, 0x76, 0x7c, 0x69, - 0x6a, 0x20, 0x2, 0xa0, 0x0, 0x5, 0x80, 0x0, - 0xa2, 0x0, 0x2a, 0x0, 0x0, 0x89, 0x50, 0xa, - 0x20, 0x2, 0xa0, 0x0, 0xd, 0x7, 0x90, 0xa2, - 0x0, 0x2b, 0x0, 0x6, 0x70, 0xc, 0x7a, 0x76, - 0x67, 0xb0, 0x2, 0xa0, 0x0, 0x37, 0xa2, 0x0, - 0x2b, 0x2, 0x80, 0x0, 0x0, 0x5, 0x0, 0x1, - 0x40, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+77ED "短" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0xe0, 0x0, 0x76, 0x66, 0x66, 0x89, 0x0, 0x58, - 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0xb, 0x7c, - 0x67, 0x2, 0x0, 0x0, 0x30, 0x3, 0x70, 0xd0, - 0x0, 0xe6, 0x66, 0x6f, 0x10, 0x40, 0xd, 0x0, - 0xd, 0x0, 0x0, 0xd0, 0x1, 0x11, 0xd1, 0x81, - 0xd0, 0x0, 0xd, 0x0, 0x45, 0x5d, 0x44, 0x2e, - 0x66, 0x66, 0xd0, 0x0, 0x3, 0xb0, 0x0, 0xb0, - 0x0, 0x7, 0x0, 0x0, 0x59, 0x70, 0x3, 0x0, - 0xb, 0x60, 0x0, 0x9, 0x36, 0x90, 0x92, 0x0, - 0xe1, 0x0, 0x0, 0xb0, 0xc, 0x6, 0x90, 0x29, - 0x0, 0x0, 0x64, 0x0, 0x0, 0x24, 0x6, 0x10, - 0x40, 0x27, 0x0, 0x6, 0x76, 0x66, 0x86, 0x6a, - 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+77F3 "石" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6d, 0xb0, - 0x1, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9c, 0x66, 0x66, 0x66, 0xc2, 0x0, - 0x0, 0x5, 0x9e, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x2a, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x2, 0x80, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x15, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7802 "砂" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, - 0x16, 0x66, 0x69, 0xa0, 0x0, 0xd0, 0x0, 0x0, - 0x2, 0x2d, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x58, 0x0, 0x5, 0xb0, 0xd0, 0x61, 0x0, - 0x0, 0x93, 0x0, 0x8, 0x60, 0xd0, 0x1d, 0x40, - 0x0, 0xd0, 0x4, 0xb, 0x0, 0xd0, 0x5, 0xd0, - 0x4, 0xf6, 0x6e, 0x38, 0x0, 0xe0, 0x0, 0x50, - 0x9, 0xd0, 0xd, 0x61, 0x0, 0xe0, 0x24, 0x0, - 0x34, 0xc0, 0xd, 0x40, 0x0, 0xe0, 0xbb, 0x0, - 0x10, 0xc0, 0xd, 0x0, 0x0, 0x37, 0xc0, 0x0, - 0x0, 0xc0, 0xd, 0x0, 0x0, 0x5b, 0x0, 0x0, - 0x0, 0xc6, 0x6d, 0x0, 0x6, 0xa0, 0x0, 0x0, - 0x0, 0xd0, 0x7, 0x2, 0xa6, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x3, 0x66, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7814 "研" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x50, - 0x4, 0x66, 0x6a, 0xa6, 0x7e, 0x66, 0xe6, 0x50, - 0x1, 0x1b, 0x20, 0x0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0x29, 0x0, 0x0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0x7b, 0x6b, 0x50, 0xd, 0x0, 0xd0, 0x10, - 0x0, 0xda, 0xb, 0x37, 0x6e, 0x66, 0xe6, 0xd2, - 0x4, 0x7a, 0xb, 0x20, 0x1c, 0x0, 0xd0, 0x0, - 0x6, 0x2a, 0xb, 0x20, 0x2a, 0x0, 0xd0, 0x0, - 0x0, 0x2a, 0xb, 0x20, 0x57, 0x0, 0xd0, 0x0, - 0x0, 0x2c, 0x6c, 0x20, 0xb2, 0x0, 0xd0, 0x0, - 0x0, 0x3a, 0x9, 0x13, 0x90, 0x0, 0xd0, 0x0, - 0x0, 0x24, 0x0, 0x1a, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, 0x0, - - /* U+7834 "破" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, - 0x1, 0x11, 0x17, 0x20, 0x0, 0xd0, 0x0, 0x0, - 0x7, 0x5e, 0x75, 0x29, 0x66, 0xe6, 0x6b, 0x50, - 0x0, 0xe, 0x0, 0xc, 0x0, 0xd0, 0xb, 0x20, - 0x0, 0x58, 0x0, 0xc, 0x0, 0xd0, 0x11, 0x0, - 0x0, 0xa2, 0x5, 0xc, 0x0, 0xd0, 0x0, 0x0, - 0x1, 0xf6, 0x6e, 0xc, 0x66, 0xe6, 0x97, 0x0, - 0x8, 0xe0, 0xd, 0xd, 0x5, 0x0, 0xa3, 0x0, - 0x26, 0xc0, 0xd, 0xd, 0x7, 0x0, 0xc0, 0x0, - 0x20, 0xc0, 0xd, 0x1c, 0x4, 0x45, 0x70, 0x0, - 0x0, 0xc0, 0xd, 0x48, 0x0, 0xbc, 0x10, 0x0, - 0x0, 0xc6, 0x6d, 0x82, 0x0, 0xac, 0x10, 0x0, - 0x0, 0xd0, 0x7, 0x70, 0x9, 0x54, 0xd6, 0x10, - 0x0, 0x70, 0x6, 0x16, 0x71, 0x0, 0x2c, 0xa0, - 0x0, 0x0, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+78BA "確" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x0, 0xa5, 0x0, 0x0, - 0x18, 0x79, 0x6a, 0x32, 0x0, 0xd1, 0x0, 0x40, - 0x0, 0x49, 0x0, 0x9, 0x68, 0xb6, 0x68, 0xc1, - 0x0, 0x65, 0x0, 0x2a, 0xa, 0x44, 0x4, 0x0, - 0x0, 0xa2, 0x2, 0x0, 0x2a, 0xb, 0x30, 0x0, - 0x0, 0xe5, 0x5e, 0x10, 0xc7, 0x6a, 0x78, 0x90, - 0x3, 0xf0, 0xc, 0x7, 0xc0, 0xd, 0x0, 0x0, - 0x8, 0xd0, 0xc, 0x56, 0xc0, 0xd, 0x4, 0x0, - 0x15, 0xc0, 0xc, 0x20, 0xd6, 0x6e, 0x66, 0x20, - 0x10, 0xc0, 0xc, 0x0, 0xc0, 0xd, 0x1, 0x0, - 0x0, 0xc6, 0x6c, 0x0, 0xd6, 0x6e, 0x6a, 0x20, - 0x0, 0xc0, 0x9, 0x0, 0xc0, 0xd, 0x0, 0x0, - 0x0, 0xa0, 0x0, 0x0, 0xc0, 0xd, 0x1, 0x50, - 0x0, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - - /* U+793A "示" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, - 0x0, 0x6, 0x66, 0x66, 0x66, 0x66, 0xa6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, - 0x6, 0x76, 0x66, 0x66, 0x86, 0x66, 0x68, 0xb2, - 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x59, 0x3, 0xb0, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xc7, 0x3, 0xb0, 0x19, 0x10, 0x0, - 0x0, 0x6, 0xb0, 0x3, 0xb0, 0x2, 0xd3, 0x0, - 0x0, 0x2c, 0x0, 0x3, 0xb0, 0x0, 0x4f, 0x20, - 0x0, 0xa1, 0x0, 0x3, 0xb0, 0x0, 0xb, 0x90, - 0x7, 0x10, 0x4, 0x37, 0xb0, 0x0, 0x2, 0x30, - 0x0, 0x0, 0x1, 0xaf, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, - - /* U+793C "礼" */ - 0x0, 0x3, 0x30, 0x0, 0x2a, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x30, 0x2, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x75, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x36, - 0x66, 0x6b, 0x12, 0xb0, 0x0, 0x0, 0x0, 0x10, - 0x8, 0xa0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xc0, 0x2, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xd3, - 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0xae, 0x97, - 0x2, 0xb0, 0x0, 0x0, 0x0, 0x92, 0xc1, 0xb5, - 0x2b, 0x0, 0x0, 0x1, 0x61, 0xc, 0x12, 0x22, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x2b, - 0x0, 0x4, 0x0, 0x0, 0xd, 0x10, 0x2, 0xb0, - 0x0, 0x51, 0x0, 0x0, 0xd1, 0x0, 0x1c, 0x0, - 0x8, 0x60, 0x0, 0xd, 0x10, 0x0, 0xad, 0xdd, - 0xd6, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+793E "社" */ - 0x0, 0x6, 0x20, 0x0, 0x0, 0x71, 0x0, 0x0, - 0x0, 0x1, 0xe1, 0x0, 0x0, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x71, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x4, 0x66, 0x6a, 0x90, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x30, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x78, 0x0, 0x0, 0xe0, 0x8, 0x20, - 0x0, 0x2, 0xe1, 0x7, 0x66, 0xe6, 0x66, 0x40, - 0x0, 0xc, 0xdb, 0x60, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x85, 0xc1, 0xd0, 0x0, 0xe0, 0x0, 0x0, - 0x5, 0x31, 0xc0, 0x10, 0x0, 0xe0, 0x0, 0x0, - 0x1, 0x1, 0xc0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x1, 0xc0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x1, 0xc0, 0x56, 0x66, 0xe6, 0x67, 0xe2, - 0x0, 0x2, 0xd0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7956 "祖" */ - 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0xa, 0x80, 0xc, 0x66, 0x66, 0xe3, 0x0, - 0x0, 0x3, 0x50, 0xd, 0x10, 0x0, 0xe0, 0x0, - 0x7, 0x66, 0x9a, 0xd, 0x10, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0xd2, 0xd, 0x10, 0x0, 0xe0, 0x0, - 0x0, 0x7, 0x80, 0xd, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0x1e, 0x50, 0xc, 0x10, 0x0, 0xe0, 0x0, - 0x0, 0x9e, 0x6b, 0xc, 0x10, 0x0, 0xe0, 0x0, - 0x5, 0x4d, 0xc, 0x1c, 0x10, 0x0, 0xe0, 0x0, - 0x23, 0xd, 0x0, 0xc, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0xc, 0x10, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0xc, 0x10, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0xc, 0x10, 0x0, 0xe2, 0x60, - 0x0, 0xd, 0x7, 0x66, 0x66, 0x66, 0x66, 0x60, - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+795D "祝" */ - 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x70, 0x9, 0x66, 0x66, 0x96, 0x0, - 0x0, 0x4, 0x50, 0xd, 0x0, 0x0, 0x74, 0x0, - 0x7, 0x66, 0x7d, 0x1d, 0x0, 0x0, 0x74, 0x0, - 0x0, 0x0, 0x96, 0xd, 0x0, 0x0, 0x74, 0x0, - 0x0, 0x2, 0xb0, 0xd, 0x0, 0x0, 0x74, 0x0, - 0x0, 0xc, 0x50, 0xe, 0x67, 0x68, 0xa5, 0x0, - 0x0, 0x7e, 0x89, 0x5, 0x48, 0x2b, 0x31, 0x0, - 0x4, 0x6b, 0x1d, 0x10, 0x48, 0x2b, 0x0, 0x0, - 0x25, 0xb, 0x11, 0x0, 0x75, 0x2b, 0x0, 0x0, - 0x0, 0xb, 0x10, 0x0, 0xb1, 0x2b, 0x0, 0x30, - 0x0, 0xb, 0x10, 0x3, 0x90, 0x2b, 0x0, 0x60, - 0x0, 0xc, 0x10, 0x1a, 0x0, 0x2b, 0x1, 0x90, - 0x0, 0xc, 0x22, 0x80, 0x0, 0xd, 0xbc, 0xb0, - 0x0, 0x5, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+795E "神" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x70, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, - 0x9, 0x70, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x35, 0x0, 0x30, 0xd, 0x0, 0x40, 0x17, 0x66, - 0x7c, 0xd, 0x66, 0xe6, 0x6e, 0x20, 0x0, 0x9, - 0x50, 0xd0, 0xd, 0x0, 0xd0, 0x0, 0x2, 0xa0, - 0xd, 0x66, 0xe6, 0x6e, 0x0, 0x0, 0xc8, 0x10, - 0xd0, 0xd, 0x0, 0xd0, 0x0, 0x8e, 0x2e, 0x1d, - 0x0, 0xd0, 0xd, 0x0, 0x63, 0xc0, 0x61, 0xd6, - 0x6e, 0x66, 0xe0, 0x32, 0xc, 0x0, 0xc, 0x0, - 0xd0, 0x9, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd, - 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, - - /* U+796D "祭" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc5, 0x0, 0x5, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xe6, 0x69, 0x58, 0x66, 0x7e, 0x20, - 0x0, 0xa, 0x70, 0xd, 0x26, 0x0, 0x96, 0x0, - 0x0, 0x39, 0x5b, 0x4a, 0x2, 0x64, 0x50, 0x0, - 0x0, 0xa7, 0x15, 0xc2, 0x0, 0xa6, 0x0, 0x0, - 0x6, 0x4, 0xa7, 0x70, 0x0, 0x1c, 0x10, 0x0, - 0x0, 0x0, 0x5b, 0x66, 0x66, 0xc5, 0xd6, 0x0, - 0x0, 0x5, 0x70, 0x20, 0x0, 0x0, 0x3d, 0xc1, - 0x1, 0x74, 0x0, 0x0, 0x0, 0x0, 0x71, 0x0, - 0x14, 0x7, 0x66, 0x66, 0xd6, 0x66, 0x73, 0x0, - 0x0, 0x0, 0x1e, 0x50, 0xd0, 0x64, 0x0, 0x0, - 0x0, 0x0, 0xc7, 0x0, 0xd0, 0x6, 0xc3, 0x0, - 0x0, 0x1a, 0x30, 0x0, 0xd0, 0x0, 0x4e, 0x0, - 0x1, 0x60, 0x2, 0x7c, 0xb0, 0x0, 0x4, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, - - /* U+7981 "禁" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0x10, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0xc0, 0x20, 0x0, 0xd0, 0x2, 0x0, 0x66, - 0x7e, 0x6a, 0x27, 0x8f, 0x66, 0xa3, 0x0, 0xc, - 0xf6, 0x10, 0xb, 0xf7, 0x0, 0x0, 0x5, 0x8c, - 0x3d, 0x5, 0x8d, 0x39, 0x0, 0x2, 0xa0, 0xc0, - 0x53, 0x80, 0xd0, 0x6d, 0x61, 0x70, 0xc, 0x11, - 0x50, 0xc, 0x0, 0x40, 0x0, 0x5, 0x66, 0x66, - 0x66, 0x6c, 0x50, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x30, 0x27, 0x66, 0x66, 0x69, 0x66, - 0x66, 0x6a, 0x60, 0x0, 0x6, 0x40, 0xc2, 0x4, - 0x0, 0x0, 0x0, 0x4, 0xd3, 0xc, 0x20, 0x2b, - 0x40, 0x0, 0x4, 0x90, 0x0, 0xc2, 0x0, 0x1d, - 0x60, 0x3, 0x40, 0x6, 0xcf, 0x0, 0x0, 0x27, - 0x0, 0x0, 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, - - /* U+79C0 "秀" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x46, 0x9d, 0xc0, 0x0, - 0x0, 0x4, 0x56, 0x67, 0xc2, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x2, 0x30, - 0x3, 0x76, 0x66, 0x8b, 0xd8, 0x66, 0x68, 0x80, - 0x0, 0x0, 0x2, 0xd4, 0xb2, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0x21, 0xb0, 0x59, 0x0, 0x0, - 0x0, 0x5, 0xa1, 0x2, 0x80, 0x4, 0xd8, 0x30, - 0x1, 0x75, 0x66, 0x86, 0x66, 0xd2, 0x19, 0xa2, - 0x3, 0x0, 0x0, 0xe0, 0x4, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xb0, 0xd, 0x86, 0x97, 0x0, - 0x0, 0x0, 0x9, 0x50, 0x3, 0x0, 0xa3, 0x0, - 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x1, 0xb1, 0x0, 0x2, 0x2, 0xc0, 0x0, - 0x0, 0x48, 0x10, 0x0, 0x4, 0xcf, 0x50, 0x0, - 0x2, 0x20, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, - - /* U+79C1 "私" */ - 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x14, 0x7b, 0xb8, 0x20, 0x1e, 0x20, 0x0, - 0x1, 0x32, 0x1d, 0x0, 0x0, 0x4d, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x78, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x4, 0x50, 0xa3, 0x0, 0x0, - 0x4, 0x76, 0x7e, 0x66, 0x50, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x7e, 0x10, 0x2, 0x90, 0x0, 0x0, - 0x0, 0x1, 0xdd, 0xa8, 0x7, 0x40, 0x0, 0x0, - 0x0, 0x9, 0x4d, 0xd, 0x3a, 0x0, 0x60, 0x0, - 0x0, 0x56, 0xd, 0x2, 0x28, 0x0, 0x38, 0x0, - 0x3, 0x50, 0xd, 0x0, 0x62, 0x0, 0xc, 0x40, - 0x3, 0x0, 0xd, 0x0, 0xa0, 0x1, 0x29, 0xd0, - 0x0, 0x0, 0x1d, 0x6, 0xfd, 0x96, 0x33, 0xf1, - 0x0, 0x0, 0x1e, 0x0, 0x40, 0x0, 0x0, 0x70, - 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+79CB "秋" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x60, 0x2, 0xd1, 0x0, 0x0, - 0x0, 0x36, 0xca, 0x70, 0x2, 0xd0, 0x0, 0x0, - 0x1, 0x20, 0xe0, 0x0, 0x2, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x32, 0xc0, 0xd, 0x30, - 0x5, 0x66, 0xe6, 0xd3, 0x83, 0xd0, 0x98, 0x0, - 0x1, 0x13, 0xf0, 0x3, 0xb4, 0xe5, 0x70, 0x0, - 0x0, 0x8, 0xf0, 0xa, 0x65, 0xd4, 0x0, 0x0, - 0x0, 0xc, 0xe9, 0x50, 0x7, 0x95, 0x0, 0x0, - 0x0, 0x64, 0xe1, 0xe0, 0xa, 0x49, 0x0, 0x0, - 0x0, 0x90, 0xe0, 0x30, 0xd, 0x19, 0x10, 0x0, - 0x6, 0x0, 0xe0, 0x0, 0x4a, 0x4, 0x90, 0x0, - 0x10, 0x0, 0xe0, 0x0, 0xc1, 0x0, 0xc4, 0x0, - 0x0, 0x0, 0xe0, 0x9, 0x30, 0x0, 0x3f, 0x50, - 0x0, 0x0, 0xe2, 0x82, 0x0, 0x0, 0x7, 0x91, - 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+79CD "种" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x60, 0x0, 0x3b, 0x0, 0x0, - 0x1, 0x47, 0xba, 0x81, 0x0, 0x2a, 0x0, 0x0, - 0x1, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x41, 0x3a, 0x11, 0x70, - 0x6, 0x66, 0xe6, 0xd3, 0xe5, 0x6c, 0x56, 0xc0, - 0x0, 0x2, 0xd0, 0x0, 0xd0, 0x2a, 0x2, 0xa0, - 0x0, 0x7, 0xe6, 0x0, 0xd0, 0x2a, 0x2, 0xa0, - 0x0, 0xc, 0xd5, 0xd0, 0xd0, 0x2a, 0x2, 0xa0, - 0x0, 0x65, 0xd0, 0x80, 0xe6, 0x7c, 0x67, 0xb0, - 0x1, 0x90, 0xd0, 0x0, 0x80, 0x2a, 0x1, 0x30, - 0x7, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x0, 0x0, - 0x10, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x3b, 0x0, 0x0, - 0x0, 0x0, 0x50, 0x0, 0x0, 0x13, 0x0, 0x0, - - /* U+79D1 "科" */ - 0x0, 0x0, 0x1, 0x70, 0x0, 0x0, 0xc2, 0x0, - 0x0, 0x36, 0xbb, 0x81, 0x0, 0x0, 0xd0, 0x0, - 0x2, 0x20, 0xd0, 0x0, 0x56, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0xb, 0x50, 0xd0, 0x0, - 0x0, 0x0, 0xd0, 0x53, 0x2, 0x10, 0xd0, 0x0, - 0x7, 0x66, 0xf6, 0x64, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x4, 0xf1, 0x0, 0x57, 0x0, 0xd0, 0x0, - 0x0, 0xb, 0xe8, 0x80, 0xd, 0x10, 0xd0, 0x0, - 0x0, 0x48, 0xd0, 0xd1, 0x2, 0x0, 0xd4, 0xd1, - 0x0, 0xa0, 0xd0, 0x10, 0x35, 0x66, 0xd3, 0x0, - 0x7, 0x10, 0xd0, 0x26, 0x30, 0x0, 0xd0, 0x0, - 0x11, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x80, 0x0, - - /* U+79D8 "秘" */ - 0x0, 0x0, 0x3, 0x40, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x37, 0xbb, 0x80, 0x5, 0x90, 0x19, 0x0, - 0x3, 0x20, 0xc0, 0x0, 0x0, 0xd2, 0x4d, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x18, 0x40, 0x78, 0x0, - 0x0, 0x0, 0xc0, 0x70, 0x1d, 0x0, 0xb4, 0x0, - 0x6, 0x68, 0xd6, 0x62, 0xc, 0x0, 0xf0, 0x0, - 0x0, 0x9, 0xd5, 0x2, 0xc, 0x4, 0xb6, 0x0, - 0x0, 0xc, 0xc8, 0x88, 0xc, 0xb, 0x56, 0x80, - 0x0, 0x74, 0xc0, 0x5d, 0x1c, 0x2d, 0x1, 0xf1, - 0x1, 0x80, 0xc0, 0x5c, 0xc, 0xc4, 0x0, 0x90, - 0x6, 0x0, 0xc0, 0x0, 0xf, 0xa0, 0x4, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x6d, 0x0, 0x7, 0x0, - 0x0, 0x0, 0xc0, 0x7, 0x7d, 0x0, 0xc, 0x20, - 0x0, 0x1, 0xd2, 0x62, 0xb, 0xcc, 0xcc, 0x20, - 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+79FB "移" */ - 0x0, 0x0, 0x3, 0x30, 0x0, 0x90, 0x0, 0x0, - 0x0, 0x37, 0xbb, 0x70, 0x7, 0x80, 0x1, 0x0, - 0x2, 0x31, 0xd0, 0x0, 0x2b, 0x66, 0x6e, 0x50, - 0x0, 0x0, 0xd0, 0x0, 0x88, 0x30, 0x79, 0x0, - 0x0, 0x0, 0xd0, 0x74, 0x2, 0xa6, 0xa0, 0x0, - 0x7, 0x67, 0xe6, 0x62, 0x0, 0x79, 0x0, 0x0, - 0x0, 0x7, 0xe0, 0x0, 0x18, 0x59, 0x10, 0x0, - 0x0, 0xc, 0xea, 0x54, 0x60, 0x8b, 0x10, 0x10, - 0x0, 0x47, 0xd1, 0xc0, 0x6, 0xc6, 0x67, 0xe1, - 0x0, 0xa0, 0xd0, 0x10, 0x6a, 0x0, 0xb, 0x50, - 0x5, 0x20, 0xd0, 0x6, 0x35, 0x80, 0x88, 0x0, - 0x3, 0x0, 0xe0, 0x10, 0x0, 0x88, 0x90, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x3, 0xa6, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x5, 0x87, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x32, 0x31, 0x0, 0x0, 0x0, 0x0, - - /* U+7A0B "程" */ - 0x0, 0x0, 0x17, 0x70, 0x30, 0x0, 0x3, 0x0, - 0x3, 0x58, 0xd6, 0x40, 0xe6, 0x66, 0x6e, 0x30, - 0x0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xd, 0x0, - 0x5, 0x66, 0xd6, 0xc1, 0xe6, 0x66, 0x6e, 0x0, - 0x2, 0x6, 0xb0, 0x0, 0xc0, 0x0, 0x8, 0x0, - 0x0, 0xa, 0xd5, 0x0, 0x0, 0x0, 0x4, 0x30, - 0x0, 0xd, 0xb7, 0x94, 0x76, 0x7c, 0x66, 0x40, - 0x0, 0x57, 0xb0, 0x80, 0x0, 0x3a, 0x0, 0x0, - 0x0, 0xa1, 0xb0, 0x0, 0x0, 0x3a, 0x5, 0x0, - 0x4, 0x31, 0xb0, 0x1, 0x86, 0x7c, 0x66, 0x30, - 0x5, 0x1, 0xb0, 0x0, 0x0, 0x3a, 0x0, 0x0, - 0x0, 0x1, 0xb0, 0x0, 0x0, 0x3a, 0x0, 0x30, - 0x0, 0x2, 0xc0, 0x47, 0x66, 0x68, 0x67, 0x91, - 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7A2E "種" */ - 0x0, 0x0, 0x2, 0x0, 0x0, 0x25, 0xa4, 0x0, - 0x1, 0x48, 0xba, 0x14, 0x56, 0xe5, 0x31, 0x0, - 0x3, 0x1b, 0x10, 0x0, 0x0, 0xd0, 0x3, 0x40, - 0x0, 0xb, 0x10, 0x57, 0x66, 0xe6, 0x66, 0x50, - 0x4, 0x5c, 0x6c, 0x23, 0x0, 0xd0, 0x3, 0x0, - 0x2, 0x2f, 0x21, 0xd, 0x66, 0xe6, 0x6e, 0x0, - 0x0, 0x4f, 0x81, 0xc, 0x0, 0xd0, 0x1c, 0x0, - 0x0, 0xae, 0x3b, 0xd, 0x66, 0xe6, 0x6c, 0x0, - 0x1, 0x9b, 0x18, 0xc, 0x0, 0xd0, 0x1c, 0x0, - 0x8, 0x1b, 0x10, 0xc, 0x66, 0xe6, 0x6a, 0x0, - 0x23, 0xb, 0x10, 0x0, 0x0, 0xd0, 0x4, 0x0, - 0x0, 0xb, 0x10, 0x28, 0x66, 0xe6, 0x69, 0x30, - 0x0, 0xb, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xc, 0x21, 0x66, 0x66, 0xe6, 0x6a, 0xc0, - 0x0, 0x4, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+7A4D "積" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x45, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x3, 0x6c, 0x96, 0x26, 0x66, 0xe6, 0x6b, 0x50, - 0x0, 0xc, 0x0, 0x2, 0x0, 0xd0, 0x2, 0x0, - 0x0, 0xc, 0x2, 0x3, 0x76, 0xe6, 0x67, 0x0, - 0x18, 0x6e, 0x7a, 0x10, 0x0, 0xd0, 0x3, 0x60, - 0x0, 0x2f, 0x30, 0x57, 0x66, 0x66, 0x67, 0x50, - 0x0, 0x8f, 0x66, 0xb, 0x66, 0x66, 0x6e, 0x10, - 0x0, 0xbc, 0xc, 0xc, 0x0, 0x0, 0xd, 0x0, - 0x4, 0x5c, 0x0, 0xc, 0x66, 0x66, 0x6d, 0x0, - 0x8, 0xc, 0x0, 0xc, 0x66, 0x66, 0x6d, 0x0, - 0x31, 0xc, 0x0, 0xc, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xc, 0x0, 0xc, 0x76, 0x66, 0x6d, 0x0, - 0x0, 0xd, 0x0, 0x2, 0xc7, 0x1, 0x66, 0x0, - 0x0, 0xc, 0x0, 0x58, 0x20, 0x0, 0x6, 0xb0, - 0x0, 0x1, 0x3, 0x10, 0x0, 0x0, 0x0, 0x50, - - /* U+7A76 "究" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0x4b, 0x0, 0x0, 0x30, 0x0, 0x39, - 0x67, 0x66, 0x76, 0x66, 0x7e, 0x10, 0xc, 0x31, - 0xd4, 0x0, 0x65, 0x7, 0x20, 0x0, 0x33, 0xb3, - 0x63, 0x0, 0x5e, 0x70, 0x0, 0x5, 0x50, 0xb, - 0x30, 0x0, 0x2c, 0x0, 0x0, 0x6, 0x77, 0xe7, - 0x77, 0xc0, 0x0, 0x0, 0x0, 0x10, 0xd, 0x0, - 0x2b, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x2, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, 0x3a, - 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x3, 0xa0, - 0x0, 0x20, 0x0, 0x8, 0x70, 0x0, 0x3a, 0x0, - 0x15, 0x0, 0x5, 0xa0, 0x0, 0x3, 0xa0, 0x3, - 0xb0, 0x5, 0x70, 0x0, 0x0, 0xc, 0xcc, 0xd8, - 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7A7A "空" */ - 0x0, 0x0, 0x0, 0x29, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x0, - 0x76, 0x66, 0x66, 0x96, 0x66, 0x6a, 0x20, 0x2b, - 0x0, 0x41, 0x0, 0x0, 0x1, 0xc4, 0xa, 0x70, - 0x2e, 0x60, 0x4, 0x95, 0x41, 0x0, 0x0, 0x3c, - 0x30, 0x0, 0x0, 0x9e, 0x40, 0x0, 0x67, 0x0, - 0x0, 0x0, 0x0, 0x7c, 0x0, 0x41, 0x56, 0x66, - 0x66, 0x66, 0xd4, 0x10, 0x0, 0x1, 0x10, 0xb, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x2, 0x0, 0x56, 0x66, 0x66, 0xd8, 0x66, 0x67, - 0xf4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+7A93 "窓" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x10, 0x0, 0xe, 0x40, 0x0, 0x1, 0x0, 0x38, - 0x66, 0x66, 0x86, 0x66, 0x69, 0xd0, 0xd, 0x20, - 0x4c, 0x0, 0x47, 0x40, 0x81, 0x2, 0x51, 0x89, - 0x26, 0x70, 0x18, 0xe2, 0x0, 0x3, 0x50, 0x3, - 0xd5, 0x2, 0x4, 0x30, 0x0, 0x0, 0x4, 0xa1, - 0x0, 0x66, 0x0, 0x0, 0x0, 0xb, 0xb7, 0x77, - 0x66, 0xe4, 0x0, 0x0, 0x0, 0x88, 0x53, 0x10, - 0x6, 0x80, 0x0, 0x0, 0x2, 0x50, 0x84, 0x0, - 0x1, 0x0, 0x0, 0x5, 0x2d, 0x0, 0xe3, 0x2, - 0x46, 0x0, 0x3, 0x72, 0xb0, 0x4, 0x0, 0x60, - 0xa7, 0x4, 0xe2, 0x2c, 0x0, 0x0, 0x8, 0x43, - 0x90, 0x1, 0x0, 0xdd, 0xdd, 0xdd, 0xe6, 0x0, - 0x0, - - /* U+7ACB "立" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, 0x15, 0x0, - 0x1, 0x86, 0x66, 0x66, 0x66, 0x66, 0x89, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, - 0x0, 0x0, 0x60, 0x0, 0x0, 0x9c, 0x0, 0x0, - 0x0, 0x0, 0x37, 0x0, 0x0, 0xc4, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x10, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x80, 0x3, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xc0, 0x8, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xa0, 0x9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, 0x10, - 0x16, 0x66, 0x66, 0x66, 0x96, 0x66, 0x6b, 0xd1, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7AD9 "站" */ - 0x0, 0x2, 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, - 0x0, 0xa, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x6, 0xa0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x1, 0x40, 0x44, 0x0, 0xd1, 0x13, 0x80, - 0x6, 0x66, 0x66, 0x77, 0x0, 0xd5, 0x55, 0x50, - 0x0, 0x10, 0x8, 0x50, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x70, 0xc, 0x30, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x74, 0xd, 0x0, 0x96, 0xe6, 0x6c, 0x30, - 0x0, 0x5a, 0x19, 0x0, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0x3b, 0x43, 0x0, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0x2, 0x60, 0x33, 0xd0, 0x0, 0xd, 0x0, - 0x1, 0x48, 0xb7, 0x20, 0xd0, 0x0, 0xd, 0x0, - 0xa, 0xa3, 0x0, 0x0, 0xe6, 0x66, 0x6e, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+7AE5 "童" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x66, 0x66, 0xd6, 0x66, 0xc6, 0x0, - 0x0, 0x2, 0x6, 0x60, 0x0, 0xc3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x4, 0x40, 0x4, 0x0, - 0x2, 0x76, 0x55, 0x65, 0x57, 0x55, 0x59, 0x50, - 0x0, 0x1, 0x86, 0x66, 0x66, 0x66, 0xa1, 0x0, - 0x0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xd0, 0x0, - 0x0, 0x1, 0xd6, 0x66, 0xe6, 0x66, 0xe0, 0x0, - 0x0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xd0, 0x0, - 0x0, 0x1, 0xd6, 0x66, 0xe6, 0x66, 0xe0, 0x0, - 0x0, 0x1, 0x30, 0x0, 0xd0, 0x0, 0x33, 0x0, - 0x0, 0x18, 0x66, 0x66, 0xe6, 0x66, 0x7a, 0x20, - 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x40, - 0x6, 0x76, 0x66, 0x66, 0xa6, 0x66, 0x66, 0xa5, - - /* U+7AEF "端" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x41, 0x0, 0x2, 0x0, 0xb1, 0x0, 0x0, - 0x0, 0x1c, 0x0, 0xd, 0x10, 0xb0, 0xc, 0x20, - 0x0, 0x9, 0x0, 0xc, 0x0, 0xb0, 0xc, 0x0, - 0x5, 0x66, 0x6c, 0x2d, 0x66, 0xd6, 0x6d, 0x0, - 0x0, 0x0, 0x33, 0x4, 0x0, 0x0, 0x5, 0x0, - 0x1, 0x40, 0x78, 0x56, 0x66, 0x66, 0x66, 0xb1, - 0x0, 0x90, 0x92, 0x11, 0x6, 0x60, 0x0, 0x0, - 0x0, 0xb1, 0xa0, 0x12, 0x7, 0x0, 0x1, 0x40, - 0x0, 0xa1, 0x80, 0x2d, 0x6d, 0x6d, 0x6a, 0x90, - 0x0, 0x12, 0x41, 0x4b, 0xc, 0xc, 0x7, 0x60, - 0x0, 0x3a, 0x84, 0x1b, 0xc, 0xc, 0x7, 0x60, - 0xc, 0xa2, 0x0, 0x1b, 0xc, 0xc, 0x7, 0x60, - 0x0, 0x0, 0x0, 0x1b, 0xc, 0xb, 0x7, 0x60, - 0x0, 0x0, 0x0, 0x2b, 0x5, 0x2, 0x7d, 0x50, - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x6, 0x0, - - /* U+7B11 "笑" */ - 0x0, 0x2, 0xa0, 0x0, 0x0, 0x91, 0x0, 0x0, - 0x0, 0x8, 0x80, 0x4, 0x5, 0xc0, 0x3, 0x10, - 0x0, 0x1d, 0x77, 0x69, 0x4c, 0x78, 0x69, 0x80, - 0x0, 0x93, 0xc, 0x10, 0x65, 0x5, 0xa0, 0x0, - 0x5, 0x40, 0x9, 0x32, 0x50, 0x1, 0xa0, 0x0, - 0x2, 0x0, 0x0, 0x14, 0x68, 0xcf, 0x50, 0x0, - 0x0, 0x4, 0x56, 0x6d, 0x62, 0x11, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x5, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x6e, 0x50, - 0x1, 0x0, 0x0, 0x3a, 0x41, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa4, 0x9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x90, 0x3, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0x87, 0x0, 0x0, 0x3d, 0x82, 0x0, - 0x1, 0x57, 0x10, 0x0, 0x0, 0x1, 0xaf, 0x80, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+7B26 "符" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xc1, 0x0, 0x0, 0x96, 0x0, 0x0, - 0x0, 0x8, 0x90, 0x2, 0x20, 0xd1, 0x0, 0x50, - 0x0, 0x1c, 0x69, 0x76, 0x57, 0x86, 0xb6, 0x72, - 0x0, 0x92, 0x1, 0xc0, 0x28, 0x0, 0x95, 0x0, - 0x5, 0x20, 0x7, 0x30, 0x70, 0x1, 0x31, 0x0, - 0x0, 0x0, 0x5c, 0x20, 0x0, 0x3, 0xc0, 0x0, - 0x0, 0x1, 0xd2, 0x56, 0x66, 0x67, 0xc6, 0xc5, - 0x0, 0xb, 0xc0, 0x11, 0x0, 0x3, 0xa0, 0x0, - 0x0, 0x76, 0xa0, 0x8, 0x10, 0x3, 0xa0, 0x0, - 0x6, 0x22, 0xa0, 0x3, 0xd0, 0x3, 0xa0, 0x0, - 0x0, 0x2, 0xa0, 0x0, 0xc0, 0x3, 0xa0, 0x0, - 0x0, 0x2, 0xa0, 0x0, 0x0, 0x3, 0xa0, 0x0, - 0x0, 0x2, 0xa0, 0x0, 0x0, 0x3, 0x90, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x3, 0x9d, 0x80, 0x0, - 0x0, 0x1, 0x20, 0x0, 0x0, 0x5, 0x0, 0x0, - - /* U+7B2C "第" */ - 0x0, 0x1, 0xb1, 0x0, 0x3, 0x90, 0x0, 0x0, - 0x0, 0x9a, 0x0, 0x70, 0x98, 0x0, 0x53, 0x0, - 0x4b, 0x7b, 0x66, 0x6b, 0x7b, 0x66, 0x40, 0x28, - 0x0, 0xa3, 0x18, 0x0, 0xb3, 0x0, 0x2, 0x5, - 0x68, 0x67, 0x66, 0x68, 0xb2, 0x0, 0x0, 0x10, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x3, 0x20, - 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, 0x99, 0x66, - 0x6e, 0x66, 0x6c, 0x0, 0x0, 0xd, 0x10, 0x0, - 0xd0, 0x0, 0x1, 0x0, 0x3, 0xd6, 0x66, 0xae, - 0x66, 0x66, 0xc7, 0x0, 0x1, 0x0, 0xb5, 0xd0, - 0x0, 0xc, 0x10, 0x0, 0x1, 0xa5, 0xd, 0x0, - 0x0, 0xe0, 0x0, 0x4, 0xa2, 0x0, 0xd0, 0x19, - 0xd9, 0x0, 0x47, 0x40, 0x0, 0xd, 0x0, 0x6, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, - 0x0, - - /* U+7B46 "筆" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xd0, 0x0, 0x0, 0xe2, 0x0, 0x0, - 0x0, 0xa, 0x60, 0x5, 0x16, 0xa0, 0x0, 0x70, - 0x0, 0x2d, 0x6b, 0x66, 0x5c, 0x67, 0xb6, 0x72, - 0x0, 0xa2, 0x5, 0xc0, 0x74, 0x0, 0x7b, 0x0, - 0x6, 0x30, 0x0, 0xa3, 0xb0, 0x0, 0x1a, 0x0, - 0x1, 0x1, 0x86, 0x68, 0xc6, 0x66, 0xe2, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0xe4, 0x60, - 0x0, 0x76, 0x66, 0x68, 0xc6, 0x66, 0xe6, 0x50, - 0x0, 0x1, 0x66, 0x68, 0xc6, 0x66, 0xe0, 0x0, - 0x0, 0x0, 0x20, 0x3, 0xa0, 0x0, 0x40, 0x0, - 0x0, 0x3, 0x66, 0x68, 0xc6, 0x6a, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x8, 0x30, - 0x2, 0x86, 0x66, 0x68, 0xc6, 0x66, 0x66, 0x50, - 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, - - /* U+7B49 "等" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xc1, 0x0, 0x0, 0xc4, 0x0, 0x0, - 0x0, 0xa, 0xa0, 0x6, 0x23, 0xd0, 0x0, 0x60, - 0x0, 0x2d, 0x79, 0x66, 0x4a, 0x6a, 0x76, 0x61, - 0x0, 0xa1, 0xc, 0x20, 0x44, 0x2, 0xc0, 0x0, - 0x6, 0x20, 0x7, 0x30, 0xe1, 0x0, 0x80, 0x0, - 0x0, 0x4, 0x76, 0x66, 0xe6, 0x66, 0x9a, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, - 0x5, 0x76, 0x66, 0x66, 0xd6, 0x66, 0x66, 0xc2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, - 0x0, 0x56, 0x66, 0x66, 0x66, 0x6e, 0x67, 0xc1, - 0x0, 0x10, 0x5, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x90, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x18, 0xeb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, - - /* U+7B54 "答" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xb1, 0x0, 0x5, 0xa0, 0x0, 0x0, - 0x0, 0x8, 0xb0, 0x4, 0xa, 0x60, 0x2, 0x20, - 0x0, 0xd, 0x87, 0x67, 0x6b, 0x6a, 0x67, 0x50, - 0x0, 0x84, 0xc, 0x3, 0x61, 0x5, 0xa0, 0x0, - 0x3, 0x60, 0x8, 0x3e, 0x70, 0x0, 0xb0, 0x0, - 0x2, 0x0, 0x2, 0xd4, 0x46, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3c, 0x20, 0x4, 0xa4, 0x0, 0x0, - 0x0, 0x7, 0x80, 0x0, 0x0, 0x89, 0xda, 0x72, - 0x3, 0x73, 0x37, 0x66, 0x66, 0x61, 0x17, 0x70, - 0x1, 0x0, 0x30, 0x0, 0x0, 0x5, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x30, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x3, 0x0, 0x0, - - /* U+7B56 "策" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4a, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, - 0xb, 0x50, 0x15, 0xd, 0x40, 0x6, 0x0, 0x5, - 0xa8, 0x86, 0x5a, 0x88, 0x96, 0x61, 0x2, 0x90, - 0xc, 0x3, 0x30, 0xd, 0x10, 0x0, 0x50, 0x0, - 0x40, 0xa4, 0x0, 0x40, 0x50, 0x6, 0x76, 0x66, - 0x6c, 0x76, 0x66, 0x6a, 0x40, 0x0, 0x20, 0x0, - 0xb2, 0x0, 0x4, 0x0, 0x0, 0xd, 0x66, 0x6c, - 0x76, 0x66, 0xe0, 0x0, 0x0, 0xc0, 0x0, 0xc2, - 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, 0x7f, 0x70, - 0x56, 0xc0, 0x0, 0x0, 0xa0, 0x69, 0xb3, 0x70, - 0x85, 0x0, 0x0, 0x0, 0x87, 0xb, 0x22, 0xa2, - 0x0, 0x0, 0x2, 0x93, 0x0, 0xb2, 0x1, 0xab, - 0x63, 0x6, 0x50, 0x0, 0xb, 0x20, 0x0, 0x4b, - 0x31, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, - - /* U+7B97 "算" */ - 0x0, 0x0, 0x20, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x2, 0xe1, 0x0, 0x0, 0xd3, 0x0, 0x0, - 0x0, 0x9, 0x96, 0x6b, 0x65, 0xc6, 0x66, 0xc1, - 0x0, 0x19, 0x7, 0x60, 0x9, 0x0, 0x94, 0x0, - 0x0, 0x91, 0x21, 0x60, 0x40, 0x0, 0x66, 0x0, - 0x4, 0x10, 0xe6, 0x66, 0x66, 0x67, 0xd0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x67, 0xb0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x3, 0xb0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x67, 0xb0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x67, 0xb0, 0x0, - 0x0, 0x0, 0x90, 0xf0, 0x0, 0xe1, 0x50, 0x0, - 0x0, 0x0, 0x1, 0xd0, 0x0, 0xe0, 0x0, 0x80, - 0x6, 0x76, 0x69, 0xc6, 0x66, 0xe6, 0x66, 0x73, - 0x0, 0x0, 0x1c, 0x20, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x4, 0xa2, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x52, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, - - /* U+7BA1 "管" */ - 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0xa7, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, - 0x2e, 0x66, 0x88, 0x2d, 0x66, 0x6c, 0x20, 0xa, - 0x15, 0x40, 0x7, 0x3, 0x60, 0x0, 0x5, 0x20, - 0x1a, 0xa, 0x10, 0xb, 0x0, 0x0, 0x13, 0x0, - 0x0, 0x75, 0x0, 0x0, 0x62, 0x2, 0xb6, 0x66, - 0x66, 0x66, 0x66, 0x6e, 0x70, 0xc4, 0x9, 0x66, - 0x66, 0x6a, 0x43, 0x40, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xa2, 0x0, 0x0, 0x0, 0xd, 0x66, 0x66, - 0x6c, 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x61, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x60, 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x1, 0xb0, - 0x0, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x0, - 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x20, 0x0, - - /* U+7BC0 "節" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xc0, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, - 0xb9, 0x66, 0xc5, 0xa9, 0x66, 0x9c, 0x10, 0x48, - 0x7, 0x80, 0x19, 0x2, 0x92, 0x0, 0x18, 0x0, - 0xa, 0x16, 0x0, 0x3, 0xd0, 0x5, 0x3, 0x0, - 0x5, 0x3, 0x0, 0x7, 0x0, 0x0, 0xd6, 0x66, - 0xe1, 0xd6, 0x66, 0xe1, 0x0, 0xd, 0x66, 0x6d, - 0xd, 0x0, 0xd, 0x0, 0x0, 0xc0, 0x0, 0xd0, - 0xd0, 0x0, 0xd0, 0x0, 0xc, 0x0, 0xd, 0xd, - 0x0, 0xd, 0x0, 0x0, 0xd6, 0x66, 0xa0, 0xd0, - 0x0, 0xd0, 0x0, 0xc, 0x1, 0x60, 0xd, 0x0, - 0xd, 0x0, 0x0, 0xc0, 0x8, 0x80, 0xd0, 0x3b, - 0xa0, 0x0, 0x1d, 0x78, 0x3f, 0x1d, 0x0, 0x20, - 0x0, 0x0, 0xc4, 0x0, 0x60, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, - - /* U+7BC4 "範" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc5, 0x0, 0x0, 0x79, 0x0, 0x10, 0x0, - 0x4f, 0x76, 0x6d, 0x3d, 0x86, 0x6d, 0x30, 0xb, - 0x24, 0x80, 0x5, 0x60, 0x87, 0x0, 0x6, 0x30, - 0x49, 0x70, 0x70, 0x0, 0xb7, 0x1, 0x41, 0x1b, - 0x52, 0x70, 0x20, 0x5, 0x30, 0x2, 0x65, 0xc6, - 0x55, 0x1d, 0x66, 0xd3, 0x0, 0xa, 0x6c, 0x66, - 0xc1, 0xb0, 0xb, 0x0, 0x0, 0xc0, 0xa1, 0xb, - 0xb, 0x0, 0xb0, 0x0, 0xc, 0x6c, 0x66, 0xb0, - 0xb0, 0xb, 0x0, 0x0, 0xc0, 0xa1, 0xb, 0xb, - 0x0, 0xc0, 0x0, 0xb, 0x6c, 0x66, 0x90, 0xb3, - 0x8c, 0x0, 0x4, 0x66, 0xc6, 0x6b, 0x2b, 0x0, - 0x3, 0x0, 0x11, 0xa, 0x10, 0x0, 0xb0, 0x0, - 0x70, 0x0, 0x0, 0xb2, 0x0, 0xc, 0xbb, 0xbe, - 0x40, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7C21 "簡" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa6, 0x0, 0x0, 0xf4, 0x0, 0x10, 0x0, - 0x2e, 0x76, 0x7b, 0x6d, 0x76, 0x6c, 0x60, 0xa, - 0x23, 0xa0, 0x9, 0x4, 0xb2, 0x0, 0x6, 0x20, - 0x8, 0x23, 0x0, 0x5, 0x51, 0x0, 0xc, 0x66, - 0x6c, 0x19, 0x76, 0x67, 0xd0, 0x0, 0xd0, 0x0, - 0xb0, 0x92, 0x0, 0x1b, 0x0, 0xd, 0x66, 0x6c, - 0x9, 0x76, 0x66, 0xb0, 0x0, 0xd6, 0x66, 0xc0, - 0xa7, 0x66, 0x6b, 0x0, 0xd, 0x0, 0x21, 0x2, - 0x5, 0x1, 0xb0, 0x0, 0xd0, 0xd, 0x66, 0x66, - 0xe1, 0x1b, 0x0, 0xd, 0x0, 0xc6, 0x66, 0x6d, - 0x1, 0xb0, 0x0, 0xd0, 0xc, 0x0, 0x1, 0xd0, - 0x1b, 0x0, 0xd, 0x0, 0xb6, 0x66, 0x6a, 0x1, - 0xb0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x26, 0xaa, - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, - - /* U+7C73 "米" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x0, 0xc, 0x20, 0xa, 0x90, 0x0, - 0x0, 0x5, 0xb0, 0xc, 0x20, 0x2e, 0x20, 0x0, - 0x0, 0x0, 0xe6, 0xc, 0x20, 0xa4, 0x0, 0x0, - 0x0, 0x0, 0x74, 0xc, 0x25, 0x50, 0x1, 0x0, - 0x5, 0x66, 0x66, 0x6d, 0x7a, 0x66, 0x6f, 0x50, - 0x1, 0x0, 0x0, 0xcf, 0x71, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xbc, 0x38, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x1c, 0x27, 0x50, 0x0, 0x0, - 0x0, 0x0, 0xc4, 0xc, 0x20, 0xc4, 0x0, 0x0, - 0x0, 0xa, 0x50, 0xc, 0x20, 0x2e, 0x80, 0x0, - 0x0, 0x93, 0x0, 0xc, 0x20, 0x2, 0xee, 0x70, - 0x16, 0x10, 0x0, 0xc, 0x20, 0x0, 0x1a, 0x20, - 0x10, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, - - /* U+7CBE "精" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x50, 0x0, 0x0, 0xd2, 0x0, 0x0, - 0x1, 0xa, 0x22, 0x10, 0x0, 0xd0, 0x5, 0x10, - 0x7, 0x3a, 0x29, 0x64, 0x76, 0xe6, 0x66, 0x30, - 0x1, 0xda, 0x38, 0x0, 0x0, 0xd0, 0x5, 0x0, - 0x0, 0x4a, 0x51, 0x1, 0x76, 0xe6, 0x65, 0x0, - 0x18, 0x6d, 0x7a, 0x60, 0x0, 0xd0, 0x2, 0x50, - 0x0, 0xf, 0x20, 0x7, 0x66, 0x66, 0x66, 0x50, - 0x0, 0x5f, 0x95, 0x1, 0xa6, 0x66, 0x7b, 0x0, - 0x0, 0xac, 0x2e, 0x21, 0xc0, 0x0, 0x3a, 0x0, - 0x2, 0x8a, 0x23, 0x1, 0xd6, 0x66, 0x7a, 0x0, - 0x8, 0x1a, 0x20, 0x1, 0xc0, 0x0, 0x3a, 0x0, - 0x23, 0xa, 0x20, 0x1, 0xd6, 0x66, 0x7a, 0x0, - 0x10, 0xa, 0x20, 0x1, 0xc0, 0x0, 0x3a, 0x0, - 0x0, 0xb, 0x30, 0x1, 0xc0, 0x17, 0x99, 0x0, - 0x0, 0x5, 0x0, 0x1, 0x60, 0x0, 0x92, 0x0, - - /* U+7CD6 "糖" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x30, 0x0, 0x1, 0xb3, 0x0, 0x0, - 0x1, 0xc, 0x13, 0x3, 0x0, 0x34, 0x3, 0x60, - 0x8, 0x1c, 0x1d, 0x4e, 0x66, 0xb8, 0x66, 0x50, - 0x5, 0x8c, 0x66, 0xd, 0x0, 0xb1, 0x3, 0x0, - 0x2, 0x4c, 0x60, 0xd, 0x37, 0xd7, 0x6e, 0x0, - 0x6, 0x6d, 0x6b, 0x6d, 0x0, 0xb1, 0xd, 0x40, - 0x1, 0xf, 0x10, 0xc, 0x66, 0xd7, 0x6e, 0x61, - 0x0, 0x4f, 0x81, 0xc, 0x0, 0xb1, 0xd, 0x0, - 0x0, 0x9e, 0x4d, 0x1b, 0x37, 0xd7, 0x6c, 0x0, - 0x1, 0x9c, 0x16, 0x39, 0x10, 0x81, 0x3, 0x0, - 0x7, 0x1c, 0x10, 0x65, 0x87, 0x66, 0x6e, 0x10, - 0x14, 0xc, 0x10, 0xa0, 0x82, 0x0, 0xd, 0x0, - 0x0, 0xc, 0x12, 0x60, 0x82, 0x0, 0xd, 0x0, - 0x0, 0xc, 0x17, 0x0, 0x87, 0x66, 0x6e, 0x0, - 0x0, 0x5, 0x10, 0x0, 0x30, 0x0, 0x2, 0x0, - - /* U+7CFB "系" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x47, 0xcf, 0x30, 0x0, - 0x14, 0x56, 0x7b, 0xa6, 0x42, 0x10, 0x0, 0x0, - 0x0, 0x2, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xa1, 0x0, 0xb, 0x30, 0x0, 0x0, 0x28, - 0x93, 0x34, 0x5c, 0x71, 0x0, 0x0, 0x3, 0xe9, - 0x64, 0xa9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x92, 0x1, 0x61, 0x0, 0x0, 0x0, 0x6a, 0x40, - 0x0, 0x15, 0xe6, 0x0, 0x0, 0xdf, 0xa8, 0x8e, - 0x54, 0x35, 0xf0, 0x0, 0x2, 0x3, 0x0, 0xe0, - 0x10, 0x4, 0x0, 0x0, 0x2, 0xf5, 0xe, 0x5, - 0x82, 0x0, 0x0, 0x2, 0xc4, 0x0, 0xe0, 0x3, - 0xe9, 0x0, 0x4, 0x91, 0x12, 0x1e, 0x0, 0x2, - 0xf5, 0x5, 0x30, 0x0, 0x4e, 0xc0, 0x0, 0x5, - 0x30, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+7D00 "紀" */ - 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x90, 0x4, 0x76, 0x66, 0x6e, 0x20, - 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x91, 0xa, 0x50, 0x0, 0x0, 0xe, 0x0, - 0xa, 0xa7, 0x7b, 0x0, 0x0, 0x0, 0xe, 0x0, - 0x4, 0x41, 0xa1, 0x0, 0x86, 0x66, 0x6e, 0x0, - 0x0, 0xa, 0x15, 0x30, 0xe0, 0x0, 0x8, 0x0, - 0x2, 0xa2, 0x15, 0xe0, 0xe0, 0x0, 0x0, 0x0, - 0xa, 0xe9, 0x62, 0xc1, 0xe0, 0x0, 0x0, 0x0, - 0x2, 0x20, 0x2, 0x10, 0xe0, 0x0, 0x0, 0x0, - 0x1, 0x16, 0x12, 0xa0, 0xe0, 0x0, 0x0, 0x30, - 0x6, 0x24, 0xa0, 0xd4, 0xe0, 0x0, 0x0, 0x60, - 0xc, 0x31, 0xe0, 0x61, 0xd1, 0x0, 0x2, 0xa0, - 0x19, 0x0, 0x20, 0x0, 0x8e, 0xdd, 0xde, 0xc0, - - /* U+7D04 "約" */ - 0x0, 0x0, 0x81, 0x0, 0x4, 0x80, 0x0, 0x0, - 0x0, 0x2c, 0x10, 0x0, 0x99, 0x0, 0x0, 0x0, - 0xa, 0x10, 0x0, 0xd, 0x10, 0x0, 0x0, 0x8, - 0x40, 0x87, 0x4, 0xc6, 0x66, 0xb9, 0x8, 0xb7, - 0x6d, 0x10, 0x91, 0x0, 0x8, 0x50, 0x47, 0x2a, - 0x20, 0x44, 0x0, 0x0, 0x94, 0x0, 0x9, 0x34, - 0x41, 0x10, 0x0, 0xa, 0x30, 0x1a, 0x30, 0x1e, - 0x10, 0xb5, 0x0, 0xb3, 0x9, 0xea, 0x85, 0xa4, - 0x2, 0xf4, 0xb, 0x20, 0x12, 0x0, 0x3, 0x0, - 0x7, 0x20, 0xc1, 0x0, 0x33, 0x30, 0xa1, 0x0, - 0x0, 0xd, 0x0, 0x45, 0xd, 0x6, 0xa0, 0x0, - 0x0, 0xe0, 0xc, 0x50, 0xd2, 0x29, 0x0, 0x0, - 0x2c, 0x0, 0xa1, 0x3, 0x0, 0x0, 0x5, 0xcf, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, - 0x0, - - /* U+7D19 "紙" */ - 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x34, 0x0, - 0x0, 0xb5, 0x0, 0x30, 0x36, 0xbb, 0x70, 0x0, - 0x57, 0x0, 0xa, 0x64, 0xb2, 0x0, 0x0, 0x29, - 0x0, 0xc2, 0xa1, 0xa, 0x20, 0x0, 0x1e, 0x87, - 0xa8, 0xa, 0x10, 0xa2, 0x0, 0x0, 0x73, 0x49, - 0x0, 0xa1, 0x9, 0x20, 0x50, 0x0, 0x39, 0x7, - 0xa, 0x66, 0xb8, 0x68, 0x40, 0x59, 0x1, 0xa6, - 0xa1, 0x6, 0x60, 0x0, 0xe, 0xc9, 0x66, 0xaa, - 0x10, 0x39, 0x0, 0x0, 0x20, 0x0, 0x11, 0xa1, - 0x0, 0xd0, 0x0, 0x3, 0x5, 0xa, 0x2a, 0x10, - 0xb, 0x30, 0x40, 0x90, 0xb2, 0x4a, 0xa1, 0x11, - 0x3c, 0x8, 0x2d, 0x9, 0x50, 0x2b, 0x85, 0x0, - 0x8d, 0x95, 0x70, 0x0, 0x0, 0xc4, 0x0, 0x0, - 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+7D20 "素" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x3, - 0x66, 0x66, 0x8c, 0x66, 0x68, 0xc0, 0x0, 0x0, - 0x0, 0x3, 0xa0, 0x0, 0x10, 0x0, 0x0, 0x28, - 0x66, 0x8c, 0x66, 0x88, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xa0, 0x0, 0x1, 0x60, 0x67, 0x66, 0x6d, - 0xa6, 0x66, 0x66, 0x67, 0x10, 0x0, 0x29, 0x60, - 0x7, 0xc0, 0x0, 0x0, 0x0, 0x2f, 0x97, 0x6c, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x20, 0x69, 0x20, - 0x57, 0x0, 0x0, 0x0, 0x38, 0xc7, 0x56, 0x76, - 0xac, 0x0, 0x0, 0x8, 0xc8, 0x55, 0xa0, 0x0, - 0xa0, 0x0, 0x0, 0x5, 0xd1, 0x3a, 0x17, 0x50, - 0x0, 0x0, 0x5, 0xb2, 0x3, 0xa0, 0x6, 0xe5, - 0x0, 0x17, 0x40, 0x39, 0xe9, 0x0, 0x4, 0xe0, - 0x1, 0x0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x0, - - /* U+7D30 "細" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x30, 0x8, 0x66, 0x66, 0x6c, 0x30, 0x7, - 0x50, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x3, 0x80, - 0xd, 0x1d, 0x0, 0xd0, 0xd, 0x2, 0xe7, 0x7a, - 0x70, 0xd0, 0xd, 0x0, 0xd0, 0x8, 0x35, 0x80, - 0xd, 0x0, 0xd0, 0xd, 0x0, 0x3, 0x92, 0x40, - 0xd0, 0xd, 0x0, 0xd0, 0x4, 0xa0, 0xc, 0x2d, - 0x66, 0xe6, 0x6e, 0x1, 0xfb, 0x97, 0xa7, 0xd0, - 0xd, 0x0, 0xd0, 0x4, 0x0, 0x2, 0x1d, 0x0, - 0xd0, 0xd, 0x0, 0x20, 0x50, 0xa0, 0xd0, 0xd, - 0x0, 0xd0, 0x9, 0xb, 0x27, 0x9d, 0x0, 0xd0, - 0xd, 0x1, 0xd0, 0x87, 0x15, 0xd6, 0x6c, 0x66, - 0xe0, 0x48, 0x1, 0x0, 0xd, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x20, - - /* U+7D39 "紹" */ - 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x4c, 0x10, 0x56, 0x88, 0x66, 0xc7, 0x0, - 0xb, 0x10, 0x0, 0x9, 0x50, 0xc, 0x20, 0x8, - 0x20, 0x75, 0x0, 0xb2, 0x0, 0xd0, 0x9, 0x95, - 0x5d, 0x20, 0x1d, 0x0, 0xe, 0x0, 0x78, 0x3b, - 0x20, 0x7, 0x60, 0x1, 0xd0, 0x0, 0x9, 0x36, - 0x1, 0x90, 0x17, 0xaa, 0x0, 0xa, 0x30, 0x59, - 0x60, 0x0, 0x9, 0x30, 0xb, 0xd9, 0x86, 0xd0, - 0xc6, 0x66, 0x6d, 0x40, 0x22, 0x0, 0x32, 0xd, - 0x0, 0x0, 0xc1, 0x0, 0x34, 0x22, 0xb0, 0xd0, - 0x0, 0xc, 0x10, 0x26, 0x1d, 0xb, 0x5d, 0x0, - 0x0, 0xc1, 0xa, 0x60, 0xd0, 0x21, 0xe6, 0x66, - 0x6d, 0x10, 0x91, 0x0, 0x0, 0xc, 0x0, 0x0, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+7D42 "終" */ - 0x0, 0x0, 0x80, 0x0, 0xb, 0x30, 0x0, 0x0, - 0x0, 0x7, 0x90, 0x0, 0x3d, 0x0, 0x2, 0x0, - 0x0, 0x1b, 0x0, 0x0, 0xa7, 0x66, 0x8e, 0x10, - 0x0, 0x91, 0xa, 0x43, 0x95, 0x0, 0xa5, 0x0, - 0xa, 0xa7, 0x7b, 0x16, 0x8, 0x3, 0xb0, 0x0, - 0x5, 0x52, 0xa0, 0x0, 0x2, 0xac, 0x10, 0x0, - 0x0, 0xa, 0x16, 0x10, 0x0, 0xda, 0x0, 0x0, - 0x1, 0xa2, 0x4, 0xb0, 0xa, 0x48, 0xc3, 0x0, - 0xa, 0xd9, 0x74, 0xb3, 0x72, 0x40, 0x6f, 0xb2, - 0x2, 0x10, 0x3, 0x32, 0x0, 0x6d, 0x11, 0x10, - 0x2, 0x16, 0x6, 0x60, 0x0, 0x9, 0x20, 0x0, - 0x6, 0x25, 0x80, 0xf0, 0x28, 0x61, 0x0, 0x0, - 0xd, 0x23, 0xb0, 0x30, 0x0, 0x5e, 0x80, 0x0, - 0x1a, 0x0, 0x0, 0x0, 0x0, 0x2, 0xe4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, - - /* U+7D44 "組" */ - 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x7, 0x90, 0x0, 0xd6, 0x66, 0x7e, 0x10, - 0x0, 0x1b, 0x0, 0x0, 0xe0, 0x0, 0x1c, 0x0, - 0x0, 0xa1, 0x9, 0x40, 0xe0, 0x0, 0x1c, 0x0, - 0xb, 0x97, 0x7c, 0x0, 0xe0, 0x0, 0x1c, 0x0, - 0x6, 0x52, 0xb0, 0x0, 0xe6, 0x66, 0x6c, 0x0, - 0x0, 0x1a, 0x16, 0x20, 0xe0, 0x0, 0x1c, 0x0, - 0x2, 0xb1, 0x3, 0xd0, 0xe0, 0x0, 0x1c, 0x0, - 0xc, 0xd9, 0x74, 0xd1, 0xe0, 0x0, 0x1c, 0x0, - 0x2, 0x10, 0x3, 0x20, 0xe6, 0x66, 0x6c, 0x0, - 0x1, 0x25, 0x15, 0x80, 0xe0, 0x0, 0x1c, 0x0, - 0x4, 0x43, 0xa0, 0xe0, 0xe0, 0x0, 0x1c, 0x0, - 0xb, 0x41, 0xd0, 0x20, 0xe0, 0x0, 0x1c, 0x10, - 0xa, 0x0, 0x1, 0x66, 0xe6, 0x66, 0x6e, 0xe3, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+7D4C "経" */ - 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x9, 0x60, 0x17, 0xa6, 0x66, 0x8f, 0x20, - 0x0, 0x2a, 0x0, 0x0, 0x62, 0x0, 0xb6, 0x0, - 0x0, 0x90, 0xa, 0x10, 0xa, 0x6, 0xa0, 0x0, - 0xa, 0x85, 0x79, 0x0, 0x5, 0xbb, 0x0, 0x0, - 0x7, 0x75, 0xb0, 0x0, 0x6, 0xdb, 0x10, 0x0, - 0x0, 0xa, 0x15, 0x0, 0x87, 0x5, 0xeb, 0x71, - 0x0, 0xa2, 0x7, 0x66, 0x10, 0xb4, 0x7, 0x30, - 0xb, 0xb9, 0x78, 0xa0, 0x0, 0xb2, 0x1, 0x0, - 0x4, 0x40, 0x1, 0x34, 0x76, 0xd7, 0x6b, 0x20, - 0x1, 0x15, 0x8, 0x30, 0x0, 0xb2, 0x0, 0x0, - 0x7, 0x25, 0x72, 0xd0, 0x0, 0xb2, 0x0, 0x0, - 0x1e, 0x13, 0xb0, 0x80, 0x0, 0xb2, 0x2, 0x70, - 0x18, 0x0, 0x10, 0x57, 0x66, 0x66, 0x66, 0x50, - - /* U+7D50 "結" */ - 0x0, 0x1, 0x70, 0x0, 0x0, 0x93, 0x0, 0x0, - 0x0, 0x8, 0x80, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0x2a, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0xa0, 0xa, 0x35, 0x66, 0xc7, 0x67, 0xc1, - 0xc, 0x86, 0x7b, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x7, 0x43, 0xa0, 0x0, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0x2a, 0x6, 0x11, 0x66, 0xc7, 0x6c, 0x20, - 0x4, 0xa0, 0x16, 0xc0, 0x10, 0x0, 0x0, 0x0, - 0xd, 0xc9, 0x63, 0xd0, 0x96, 0x66, 0x6b, 0x10, - 0x1, 0x0, 0x4, 0x10, 0xd0, 0x0, 0xd, 0x0, - 0x2, 0x16, 0x23, 0xa0, 0xd0, 0x0, 0xd, 0x0, - 0x6, 0x33, 0xb0, 0xd2, 0xd0, 0x0, 0xd, 0x0, - 0xd, 0x21, 0xc0, 0x20, 0xe6, 0x66, 0x6d, 0x0, - 0x18, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - - /* U+7D61 "絡" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x30, 0x0, 0xd, 0x40, 0x0, 0x0, - 0x0, 0xa, 0x60, 0x0, 0x4c, 0x0, 0x0, 0x0, - 0x0, 0x29, 0x0, 0x0, 0xa8, 0x66, 0x6e, 0x20, - 0x0, 0x90, 0x9, 0x2, 0xc0, 0x0, 0x7a, 0x0, - 0xa, 0x63, 0x7a, 0x8, 0x18, 0x3, 0xc0, 0x0, - 0xa, 0x86, 0xb0, 0x31, 0x3, 0x9c, 0x10, 0x0, - 0x0, 0xa, 0x14, 0x0, 0x2, 0xcb, 0x10, 0x0, - 0x0, 0xa2, 0xa, 0x20, 0x59, 0x13, 0xd8, 0x30, - 0xc, 0xa8, 0x79, 0xa6, 0x40, 0x0, 0x19, 0xa2, - 0x7, 0x50, 0x2, 0x40, 0xe6, 0x66, 0x8c, 0x0, - 0x0, 0x12, 0x5, 0x0, 0xd0, 0x0, 0x2a, 0x0, - 0x2, 0x57, 0x27, 0x70, 0xd0, 0x0, 0x2a, 0x0, - 0x9, 0x45, 0x92, 0xa0, 0xd0, 0x0, 0x2a, 0x0, - 0x1e, 0x13, 0x50, 0x0, 0xe6, 0x66, 0x7b, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x12, 0x0, - - /* U+7D66 "給" */ - 0x0, 0x0, 0x70, 0x0, 0x0, 0x84, 0x0, 0x0, - 0x0, 0x4, 0xb0, 0x0, 0x0, 0xf8, 0x0, 0x0, - 0x0, 0xb, 0x10, 0x0, 0x7, 0x86, 0x10, 0x0, - 0x0, 0x73, 0x9, 0x30, 0xc, 0x10, 0xa0, 0x0, - 0x5, 0xb6, 0x6b, 0x0, 0x93, 0x0, 0x5a, 0x0, - 0x3, 0x83, 0xb1, 0x6, 0x40, 0x0, 0x29, 0xd5, - 0x0, 0x8, 0x26, 0x43, 0x76, 0x66, 0xa4, 0x70, - 0x0, 0x94, 0x4, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xea, 0x85, 0xd2, 0x96, 0x66, 0x6c, 0x10, - 0x0, 0x30, 0x2, 0x21, 0xb0, 0x0, 0xd, 0x0, - 0x0, 0x42, 0x56, 0x61, 0xb0, 0x0, 0xd, 0x0, - 0x4, 0x60, 0xd1, 0xf2, 0xb0, 0x0, 0xd, 0x0, - 0xd, 0x40, 0xd0, 0x42, 0xd6, 0x66, 0x6d, 0x0, - 0x5, 0x0, 0x0, 0x2, 0xb0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+7D71 "統" */ - 0x0, 0x5, 0x50, 0x0, 0x8, 0x40, 0x0, 0x0, - 0x0, 0xc, 0x30, 0x0, 0x1, 0xf1, 0x0, 0x0, - 0x0, 0x75, 0x0, 0x36, 0x66, 0x96, 0x6c, 0x70, - 0x2, 0x80, 0x1c, 0x11, 0xb, 0x40, 0x0, 0x0, - 0x2e, 0x76, 0xb6, 0x0, 0x78, 0x2, 0x40, 0x0, - 0x8, 0x36, 0x70, 0x6, 0x60, 0x0, 0x96, 0x0, - 0x0, 0x38, 0x7, 0x2e, 0x97, 0x54, 0x4f, 0x0, - 0x5, 0x90, 0xa, 0x61, 0x62, 0x6, 0x14, 0x0, - 0x1f, 0xb9, 0x77, 0xa0, 0xb3, 0xd, 0x0, 0x0, - 0x3, 0x0, 0x5, 0x10, 0xc1, 0xd, 0x0, 0x0, - 0x4, 0x8, 0x8, 0x60, 0xd0, 0xd, 0x0, 0x10, - 0xa, 0xb, 0x22, 0xb3, 0xa0, 0xd, 0x0, 0x50, - 0x4c, 0x7, 0x10, 0x1b, 0x20, 0xd, 0x0, 0x80, - 0x11, 0x0, 0x3, 0x82, 0x0, 0x9, 0xdd, 0xc0, - 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7D75 "絵" */ - 0x0, 0x4, 0x30, 0x0, 0x1, 0x90, 0x0, 0x0, - 0x0, 0xc, 0x50, 0x0, 0x7, 0xe1, 0x0, 0x0, - 0x0, 0x58, 0x0, 0x0, 0xd, 0x28, 0x0, 0x0, - 0x1, 0x90, 0xa, 0x0, 0x86, 0x5, 0x80, 0x0, - 0x1c, 0x55, 0x98, 0x4, 0x80, 0x0, 0x99, 0x0, - 0xa, 0x56, 0x90, 0x46, 0x0, 0x2, 0x6a, 0xd2, - 0x0, 0x39, 0x6, 0x20, 0x76, 0x66, 0x50, 0x10, - 0x4, 0x90, 0x9, 0x50, 0x0, 0x0, 0x2, 0x0, - 0x1f, 0xb9, 0x77, 0xa7, 0x67, 0x66, 0x6a, 0x40, - 0x4, 0x0, 0x2, 0x10, 0x9, 0x90, 0x0, 0x0, - 0x2, 0x7, 0xa, 0x30, 0x3c, 0x0, 0x10, 0x0, - 0x8, 0x8, 0x64, 0xc0, 0xb1, 0x0, 0x82, 0x0, - 0xd, 0x5, 0x70, 0x5a, 0x53, 0x45, 0x7e, 0x10, - 0x16, 0x0, 0x0, 0xc, 0x95, 0x31, 0xa, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7D93 "經" */ - 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0xc, 0x10, 0x47, 0x66, 0x66, 0x6a, 0x60, - 0x0, 0x74, 0x0, 0x3, 0x50, 0x92, 0x28, 0x0, - 0x1, 0x80, 0x46, 0x9, 0x62, 0xc0, 0x96, 0x0, - 0x1b, 0x44, 0xb3, 0x29, 0x9, 0x13, 0x70, 0x0, - 0xa, 0x58, 0x60, 0x53, 0x8, 0x5, 0x60, 0x0, - 0x0, 0x29, 0x21, 0xc, 0x33, 0xc0, 0xa7, 0x0, - 0x1, 0xa0, 0xb, 0x6, 0x90, 0xc1, 0x19, 0x0, - 0xe, 0x99, 0x8d, 0x30, 0x10, 0x0, 0x3, 0x0, - 0x8, 0x40, 0x4, 0x17, 0x66, 0xb6, 0x68, 0x30, - 0x1, 0x4, 0x9, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x6, 0x28, 0x36, 0x90, 0x0, 0xd0, 0x0, 0x0, - 0xc, 0x26, 0x81, 0x50, 0x0, 0xd0, 0x0, 0x10, - 0x1b, 0x1, 0x10, 0x46, 0x66, 0xe6, 0x6a, 0xc0, - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - - /* U+7D9A "続" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x30, 0x0, 0x0, 0xb2, 0x0, 0x0, - 0x0, 0xb, 0x40, 0x0, 0x0, 0xd0, 0x1, 0x10, - 0x0, 0x38, 0x0, 0x18, 0x66, 0xe6, 0x69, 0x80, - 0x0, 0x90, 0x18, 0x0, 0x0, 0xd0, 0x1, 0x0, - 0x9, 0x74, 0x95, 0x0, 0x76, 0xb6, 0x7a, 0x0, - 0x8, 0x66, 0x80, 0x2, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x9, 0x13, 0xa, 0x66, 0x66, 0x67, 0xe1, - 0x0, 0x91, 0xb, 0x4a, 0x23, 0x2, 0x7, 0x40, - 0xa, 0xb9, 0x7b, 0x51, 0x4c, 0xd, 0x22, 0x0, - 0x5, 0x50, 0x3, 0x10, 0x58, 0xd, 0x10, 0x0, - 0x1, 0x4, 0x8, 0x20, 0x75, 0xc, 0x10, 0x20, - 0x5, 0x26, 0x44, 0xb0, 0xb1, 0xc, 0x10, 0x50, - 0xa, 0x33, 0xa0, 0x66, 0x60, 0xc, 0x10, 0xa0, - 0x9, 0x0, 0x21, 0x75, 0x0, 0xa, 0xdc, 0xe1, - 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7DAD "維" */ - 0x0, 0x8, 0x10, 0x0, 0x67, 0x43, 0x0, 0x0, - 0x0, 0x2c, 0x0, 0x0, 0xa5, 0xe, 0x30, 0x0, - 0x0, 0x92, 0x0, 0x0, 0xe0, 0x6, 0x31, 0x20, - 0x4, 0x50, 0x76, 0x5, 0xd6, 0x6a, 0x68, 0x80, - 0x2c, 0x66, 0xd2, 0xb, 0xb0, 0x1c, 0x0, 0x0, - 0x8, 0x2a, 0x30, 0x46, 0xb0, 0x1c, 0x1, 0x0, - 0x0, 0x56, 0x42, 0x52, 0xc6, 0x6d, 0x6b, 0x50, - 0x5, 0x80, 0x1d, 0x2, 0xb0, 0x1c, 0x0, 0x0, - 0x2f, 0xa8, 0x6c, 0x32, 0xb0, 0x1c, 0x0, 0x0, - 0x5, 0x0, 0x12, 0x2, 0xc6, 0x6d, 0x6b, 0x50, - 0x3, 0x14, 0x1a, 0x12, 0xb0, 0x1c, 0x0, 0x0, - 0x8, 0xc, 0x18, 0x92, 0xb0, 0x1c, 0x0, 0x0, - 0x4b, 0xb, 0x31, 0x32, 0xb0, 0x1c, 0x3, 0x70, - 0x64, 0x1, 0x0, 0x2, 0xc6, 0x66, 0x66, 0x50, - 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, - - /* U+7DB2 "網" */ - 0x0, 0x5, 0x10, 0x1, 0x0, 0x0, 0x0, 0x30, - 0x0, 0xc, 0x20, 0x1d, 0x66, 0x66, 0x76, 0xf2, - 0x0, 0x65, 0x0, 0x1b, 0x17, 0x1, 0xe1, 0xd0, - 0x1, 0x80, 0x48, 0x1b, 0x7, 0x77, 0x30, 0xd0, - 0xd, 0x76, 0xc2, 0x1b, 0x56, 0x8a, 0xa6, 0xd0, - 0x6, 0x27, 0x50, 0x1b, 0x13, 0x30, 0x0, 0xd0, - 0x0, 0x47, 0x24, 0x1b, 0x0, 0xc5, 0x0, 0xd0, - 0x4, 0x90, 0x1d, 0x3c, 0x56, 0x98, 0xb7, 0xd0, - 0xe, 0xc9, 0x6a, 0x5b, 0x1d, 0x0, 0x0, 0xd0, - 0x3, 0x0, 0x11, 0x1b, 0xd, 0x0, 0x0, 0xd0, - 0x4, 0x7, 0x29, 0x1b, 0x2e, 0x66, 0xc2, 0xd0, - 0x9, 0xc, 0xc, 0x5b, 0x3, 0x0, 0x0, 0xd0, - 0x3d, 0xb, 0x23, 0x2b, 0x0, 0x1, 0x11, 0xd0, - 0x34, 0x0, 0x0, 0x1b, 0x0, 0x1, 0x6f, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+7DD1 "緑" */ - 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, 0x50, 0x0, - 0x0, 0xc, 0x20, 0x7, 0x66, 0x66, 0xe2, 0x0, - 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x2, 0x80, 0x48, 0x3, 0x76, 0x66, 0xe0, 0x0, - 0xd, 0x76, 0xb2, 0x0, 0x0, 0x0, 0xe1, 0x20, - 0x7, 0x27, 0x40, 0x37, 0x66, 0xa6, 0xa8, 0x90, - 0x0, 0x47, 0x24, 0x0, 0x0, 0xe2, 0x5, 0x0, - 0x4, 0x80, 0x1d, 0x2a, 0x30, 0xe4, 0x5b, 0x20, - 0xe, 0xb8, 0x5a, 0x43, 0xd0, 0xe7, 0x40, 0x0, - 0x2, 0x1, 0x33, 0x0, 0x35, 0xe4, 0x30, 0x0, - 0x4, 0x19, 0xd, 0x10, 0x83, 0xe0, 0xa0, 0x0, - 0xa, 0xb, 0x37, 0x7b, 0x20, 0xe0, 0x4c, 0x10, - 0x4d, 0x6, 0x20, 0x81, 0x0, 0xe0, 0x8, 0xb1, - 0x12, 0x0, 0x0, 0x0, 0x6d, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, - - /* U+7DD2 "緒" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x20, 0x0, 0x6, 0x60, 0x0, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x6, 0x60, 0x9, 0x20, - 0x0, 0x73, 0x0, 0x5, 0x69, 0x9b, 0x7b, 0x0, - 0x2, 0x70, 0x58, 0x2, 0x5, 0x60, 0xc2, 0x0, - 0x1d, 0x66, 0xc2, 0x0, 0x5, 0x66, 0x80, 0x10, - 0x9, 0x48, 0x50, 0x76, 0x68, 0xae, 0x67, 0xc1, - 0x0, 0x37, 0x23, 0x0, 0x2, 0xb1, 0x0, 0x0, - 0x3, 0x90, 0xc, 0x10, 0x3b, 0x10, 0x4, 0x0, - 0xe, 0xb8, 0x7b, 0x55, 0xc6, 0x66, 0x6d, 0x0, - 0x4, 0x10, 0x2, 0x67, 0xa0, 0x0, 0xb, 0x0, - 0x3, 0x5, 0x38, 0x1, 0xc6, 0x66, 0x6b, 0x0, - 0x9, 0xc, 0xd, 0x21, 0xa0, 0x0, 0xb, 0x0, - 0x1d, 0xb, 0x36, 0x22, 0xa0, 0x0, 0xb, 0x0, - 0x35, 0x2, 0x0, 0x2, 0xc6, 0x66, 0x6b, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x2, 0x0, - - /* U+7DDA "線" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x0, 0x0, 0x4, 0xa0, 0x0, 0x0, - 0x0, 0xd, 0x20, 0x2, 0x9, 0x10, 0x4, 0x0, - 0x0, 0x74, 0x0, 0xd, 0x66, 0x66, 0x6e, 0x0, - 0x2, 0x80, 0x44, 0xd, 0x0, 0x0, 0xd, 0x0, - 0x1c, 0x44, 0xc3, 0xd, 0x66, 0x66, 0x6d, 0x0, - 0xa, 0x59, 0x50, 0xd, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x38, 0x40, 0xd, 0x66, 0xa6, 0x6c, 0x0, - 0x2, 0x90, 0x48, 0x2, 0x0, 0xf0, 0x1, 0x10, - 0x1e, 0xa8, 0x7e, 0x57, 0x95, 0xd5, 0xb, 0x70, - 0x6, 0x20, 0x23, 0x0, 0xc5, 0xd8, 0x82, 0x0, - 0x4, 0x25, 0x49, 0x3, 0x90, 0xd4, 0x70, 0x0, - 0xa, 0xd, 0xd, 0xa, 0x10, 0xd0, 0xb4, 0x0, - 0x79, 0xb, 0x1, 0x82, 0x0, 0xd0, 0x1e, 0x90, - 0x31, 0x0, 0x15, 0x11, 0x7c, 0xc0, 0x3, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x5, 0x20, 0x0, 0x0, - - /* U+7DE0 "締" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x10, 0x0, 0x8, 0x70, 0x0, 0x0, - 0x0, 0xd, 0x20, 0x0, 0x0, 0xc2, 0x5, 0x10, - 0x0, 0x65, 0x0, 0x57, 0x66, 0x66, 0x77, 0x50, - 0x1, 0x80, 0x46, 0x0, 0xa3, 0x3, 0xd0, 0x0, - 0xb, 0x44, 0xb4, 0x0, 0x49, 0x8, 0x20, 0x0, - 0xa, 0x58, 0x60, 0x76, 0x66, 0x68, 0x66, 0xe2, - 0x0, 0x28, 0x23, 0xe0, 0x0, 0xb0, 0x4, 0x30, - 0x2, 0xa0, 0xb, 0x20, 0x0, 0xc0, 0x1, 0x0, - 0xe, 0xa8, 0x7c, 0x2a, 0x66, 0xd6, 0x6d, 0x10, - 0x6, 0x30, 0x13, 0xc, 0x0, 0xc0, 0xc, 0x0, - 0x2, 0x22, 0x38, 0xc, 0x0, 0xc0, 0xc, 0x0, - 0x8, 0xc, 0xc, 0x3c, 0x0, 0xc2, 0x3b, 0x0, - 0x2c, 0xc, 0x23, 0x9, 0x0, 0xc1, 0xa6, 0x0, - 0x45, 0x1, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - - /* U+7DE9 "緩" */ - 0x0, 0x5, 0x20, 0x0, 0x0, 0x14, 0x8b, 0x10, - 0x0, 0xd, 0x40, 0x25, 0x68, 0x75, 0x63, 0x10, - 0x0, 0x58, 0x0, 0x6, 0x5, 0x60, 0x98, 0x0, - 0x1, 0x90, 0x47, 0x6, 0x70, 0xa0, 0xa0, 0x0, - 0xb, 0x55, 0xc4, 0x27, 0x76, 0x67, 0x7c, 0x30, - 0x7, 0x48, 0x60, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x38, 0x24, 0x56, 0x6d, 0x66, 0x67, 0xc1, - 0x3, 0x80, 0x1d, 0x31, 0x68, 0x0, 0x0, 0x0, - 0xe, 0xc9, 0x5a, 0x40, 0xa8, 0x66, 0x78, 0x0, - 0x2, 0x0, 0x11, 0x1, 0xc8, 0x0, 0xc5, 0x0, - 0x5, 0x8, 0x2a, 0x8, 0x42, 0x88, 0x80, 0x0, - 0xb, 0xb, 0x3c, 0x58, 0x0, 0xac, 0x0, 0x0, - 0x5b, 0x6, 0x24, 0x70, 0x7, 0x9a, 0xa1, 0x0, - 0x0, 0x0, 0x3, 0x2, 0x84, 0x0, 0x7f, 0xb2, - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x20, - - /* U+7DF4 "練" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x40, 0x0, 0x0, 0xb0, 0x0, 0x0, - 0x0, 0xc, 0x20, 0x0, 0x0, 0xc0, 0x0, 0x20, - 0x0, 0x55, 0x0, 0x57, 0x66, 0xd6, 0x67, 0x80, - 0x1, 0x80, 0x39, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0xc, 0x76, 0xb3, 0xb, 0x66, 0xd6, 0x6d, 0x20, - 0x7, 0x36, 0x60, 0xc, 0x50, 0xc1, 0x9c, 0x0, - 0x0, 0x28, 0x14, 0xc, 0x49, 0xc6, 0x4c, 0x0, - 0x1, 0xa0, 0xb, 0x1c, 0x4, 0xc4, 0xc, 0x0, - 0xd, 0xb9, 0x7b, 0x5c, 0x6c, 0xe9, 0x6b, 0x0, - 0x4, 0x20, 0x3, 0x1, 0x2c, 0xc7, 0x0, 0x0, - 0x2, 0x5, 0xb, 0x10, 0xa3, 0xc2, 0x70, 0x0, - 0x7, 0x18, 0x47, 0x75, 0x60, 0xc0, 0x96, 0x0, - 0xd, 0x6, 0x81, 0x56, 0x0, 0xc0, 0xc, 0xb2, - 0x19, 0x0, 0x2, 0x40, 0x0, 0xd0, 0x1, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - - /* U+7E3D "總" */ - 0x0, 0x5, 0x30, 0x0, 0x1, 0xc0, 0x0, 0x0, - 0x0, 0xc2, 0x0, 0x30, 0x64, 0x0, 0x40, 0x0, - 0x65, 0x0, 0xc, 0x56, 0xa5, 0x5e, 0x20, 0x18, - 0x3, 0x90, 0xc0, 0x9b, 0x68, 0xd0, 0xd, 0x87, - 0xc2, 0xc, 0x36, 0x6, 0x8d, 0x0, 0x62, 0x65, - 0x0, 0xc3, 0x39, 0xc0, 0xd0, 0x0, 0x29, 0x14, - 0xc, 0x2, 0xac, 0x6d, 0x0, 0x1a, 0x0, 0xb1, - 0xc3, 0x50, 0x5, 0xd0, 0xd, 0xa8, 0x7b, 0x5b, - 0x78, 0x77, 0x7b, 0x0, 0x42, 0x1, 0x21, 0x7, - 0x1b, 0x10, 0x20, 0x2, 0x22, 0x93, 0x41, 0xc0, - 0x69, 0x9, 0x60, 0x70, 0xc3, 0x9b, 0xc, 0x0, - 0x24, 0x1e, 0xd, 0xb, 0x5, 0xc0, 0xc0, 0x0, - 0x62, 0x14, 0x80, 0x0, 0x0, 0xd, 0xcc, 0xce, - 0x60, - - /* U+7E3E "績" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x40, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xb, 0x20, 0x36, 0x66, 0xe6, 0x6d, 0x50, - 0x0, 0x46, 0x0, 0x11, 0x0, 0xd0, 0x12, 0x0, - 0x0, 0x90, 0x28, 0x5, 0x76, 0xe6, 0x78, 0x0, - 0xa, 0x75, 0xa4, 0x22, 0x22, 0xd2, 0x25, 0x90, - 0x7, 0x56, 0x70, 0x56, 0x44, 0x44, 0x46, 0x41, - 0x0, 0x19, 0x13, 0xe, 0x66, 0x66, 0x6e, 0x30, - 0x1, 0xa1, 0xb, 0x1d, 0x66, 0x66, 0x6e, 0x0, - 0xb, 0xc9, 0x8b, 0x5d, 0x0, 0x0, 0xd, 0x0, - 0x4, 0x30, 0x2, 0xe, 0x66, 0x66, 0x6e, 0x0, - 0x1, 0x15, 0xa, 0xe, 0x66, 0x66, 0x6e, 0x0, - 0x6, 0x2a, 0x38, 0x66, 0x22, 0x2, 0x6, 0x0, - 0xd, 0x17, 0x61, 0x11, 0xd7, 0x2, 0xa7, 0x0, - 0x6, 0x0, 0x0, 0x2a, 0x30, 0x0, 0xa, 0xb0, - 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x40, - - /* U+7E54 "織" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x0, 0x6, 0x50, 0x9, 0x10, 0x0, - 0x0, 0x49, 0x0, 0x0, 0xa3, 0x2b, 0x20, 0x0, - 0x0, 0x90, 0x1, 0x96, 0x68, 0x4b, 0xb, 0x0, - 0x5, 0x30, 0x90, 0x73, 0xc, 0x2b, 0x8, 0x20, - 0x3b, 0x57, 0x90, 0x39, 0x26, 0xb, 0x0, 0x0, - 0x18, 0x3b, 0x4, 0x66, 0x96, 0x6c, 0x68, 0xb0, - 0x0, 0x82, 0x51, 0x30, 0x2, 0xa, 0x3, 0x0, - 0x6, 0x50, 0x85, 0xc6, 0x6d, 0x1a, 0xe, 0x10, - 0x3e, 0xa7, 0x79, 0xc0, 0xc, 0x9, 0x78, 0x0, - 0x5, 0x0, 0x11, 0xc6, 0x6c, 0x7, 0xe1, 0x0, - 0x2, 0x31, 0xa3, 0xc0, 0xc, 0x6, 0xb0, 0x20, - 0x9, 0x39, 0x59, 0xc0, 0xc, 0xb, 0xd0, 0x60, - 0x5b, 0xd, 0x1, 0xc6, 0x6b, 0x72, 0x6a, 0x90, - 0x43, 0x0, 0x0, 0x40, 0x6, 0x20, 0x8, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - - /* U+7E70 "繰" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x20, 0x2, 0x96, 0x66, 0x90, 0x0, - 0x0, 0x2b, 0x0, 0x2, 0xc0, 0x0, 0xb0, 0x0, - 0x0, 0x91, 0x0, 0x2, 0xc0, 0x0, 0xa0, 0x0, - 0x4, 0x50, 0x74, 0x2, 0xa6, 0x66, 0x70, 0x0, - 0x1e, 0x86, 0xc0, 0x66, 0x69, 0x8, 0x69, 0x20, - 0x5, 0xa, 0x20, 0x92, 0xc, 0xc, 0xb, 0x10, - 0x0, 0x65, 0x43, 0x97, 0x6c, 0xd, 0x6c, 0x10, - 0x5, 0x80, 0x2d, 0x71, 0x5, 0x28, 0x5, 0x0, - 0xf, 0xb9, 0x6c, 0x10, 0x0, 0xd0, 0x7, 0x30, - 0x4, 0x0, 0x11, 0x47, 0x6c, 0xe7, 0x66, 0x60, - 0x2, 0x32, 0x47, 0x0, 0x59, 0xb8, 0x0, 0x0, - 0x9, 0xd, 0xd, 0x3, 0x90, 0xb3, 0xb1, 0x0, - 0x59, 0xc, 0x12, 0x57, 0x0, 0xc0, 0x7e, 0x71, - 0x42, 0x0, 0x5, 0x20, 0x0, 0xc0, 0x7, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - - /* U+7E7C "繼" */ - 0x0, 0x7, 0x0, 0x50, 0x20, 0x0, 0x10, 0x0, - 0x0, 0x2c, 0x0, 0xc1, 0xb2, 0x0, 0xb1, 0x0, - 0x0, 0x92, 0x0, 0xc6, 0x36, 0x87, 0x29, 0x40, - 0x4, 0x50, 0x83, 0xc9, 0x8a, 0xa, 0x88, 0x0, - 0x1d, 0x76, 0xb0, 0xc1, 0x84, 0x11, 0x83, 0x10, - 0x7, 0x19, 0x10, 0xca, 0x86, 0x9c, 0x74, 0xa0, - 0x0, 0x74, 0x51, 0xc1, 0x0, 0x12, 0x5, 0x30, - 0x6, 0x60, 0x4b, 0xc6, 0x76, 0x66, 0x88, 0x40, - 0x1f, 0xb8, 0x4c, 0xc0, 0xa3, 0x0, 0xa2, 0x0, - 0x3, 0x0, 0x0, 0xc5, 0x45, 0x76, 0x37, 0x50, - 0x3, 0x31, 0x81, 0xc7, 0x7a, 0xa, 0x98, 0x0, - 0x9, 0x29, 0x4a, 0xc0, 0x83, 0x3, 0x72, 0x60, - 0x4b, 0xd, 0x5, 0xc9, 0x86, 0x8c, 0x75, 0x90, - 0x42, 0x0, 0x0, 0xe6, 0x66, 0x86, 0x6b, 0xb0, - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, - - /* U+7E8C "續" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x10, 0x0, 0x0, 0xc1, 0x1, 0x0, - 0x0, 0x9, 0x70, 0x47, 0x66, 0xd6, 0x69, 0x80, - 0x0, 0x1a, 0x0, 0x3, 0x44, 0xd4, 0x59, 0x0, - 0x0, 0x91, 0x6, 0x4, 0x32, 0x22, 0x25, 0x0, - 0x7, 0x62, 0x79, 0xd, 0x6c, 0x6c, 0x6c, 0x40, - 0xa, 0x87, 0xb0, 0xc, 0xb, 0xb, 0xa, 0x10, - 0x0, 0xa, 0x13, 0xc, 0x68, 0x68, 0x6a, 0x10, - 0x0, 0x93, 0xa, 0x16, 0x76, 0x66, 0x6a, 0x0, - 0xa, 0xa8, 0x8b, 0x77, 0x60, 0x0, 0x1a, 0x0, - 0x5, 0x61, 0x2, 0x27, 0x96, 0x66, 0x7a, 0x0, - 0x1, 0x12, 0x24, 0x7, 0x95, 0x55, 0x6a, 0x0, - 0x7, 0xb, 0xc, 0x27, 0x96, 0x66, 0x7a, 0x0, - 0xd, 0xa, 0x46, 0x33, 0x8b, 0x2, 0x86, 0x0, - 0x29, 0x2, 0x0, 0x39, 0x60, 0x0, 0x9, 0xc0, - 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, 0x50, - - /* U+7EDF "统" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc3, 0x0, 0x4, 0x80, 0x0, 0x0, 0x0, - 0x4c, 0x0, 0x0, 0xc, 0x40, 0x1, 0x0, 0xb, - 0x10, 0x17, 0x66, 0x96, 0x6a, 0xb0, 0x6, 0x50, - 0x5a, 0x0, 0x6a, 0x0, 0x0, 0x4, 0xa3, 0x4d, - 0x30, 0x19, 0x2, 0x0, 0x0, 0x59, 0x4a, 0x40, - 0x8, 0x0, 0xb, 0x70, 0x0, 0x7, 0x60, 0xb, - 0x98, 0x8b, 0x6d, 0x70, 0x6, 0x70, 0x1, 0x75, - 0xf0, 0xd0, 0x24, 0x4, 0xfb, 0x86, 0x20, 0x1d, - 0xd, 0x0, 0x0, 0x6, 0x0, 0x0, 0x2, 0xb0, - 0xd0, 0x0, 0x0, 0x0, 0x3, 0x50, 0x58, 0xd, - 0x0, 0x0, 0x49, 0xb8, 0x30, 0xb, 0x30, 0xd0, - 0x6, 0x4, 0x70, 0x0, 0x7, 0x90, 0xc, 0x0, - 0x90, 0x0, 0x0, 0x18, 0x50, 0x0, 0x8d, 0xcd, - 0x20, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7F3A "缺" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x30, 0x0, 0x0, 0xd2, 0x0, 0x0, - 0x0, 0x1d, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x56, 0x0, 0x60, 0x0, 0xd0, 0x3, 0x0, - 0x0, 0xa6, 0xc6, 0x74, 0x77, 0xe6, 0x6d, 0x0, - 0x2, 0x50, 0xc0, 0x0, 0x0, 0xd0, 0x1b, 0x0, - 0x3, 0x0, 0xc0, 0x2, 0x0, 0xc0, 0x1b, 0x0, - 0x7, 0x66, 0xd6, 0x8b, 0x10, 0xc0, 0x1b, 0x0, - 0x0, 0x10, 0xc0, 0x14, 0x76, 0xd6, 0x6b, 0xa6, - 0x0, 0xd0, 0xc0, 0xa3, 0x4, 0x86, 0x0, 0x0, - 0x0, 0xc0, 0xc0, 0xb1, 0x9, 0x46, 0x10, 0x0, - 0x0, 0xc0, 0xc0, 0xb1, 0xc, 0x1, 0x90, 0x0, - 0x1, 0xd8, 0xb6, 0xc1, 0x84, 0x0, 0xa4, 0x0, - 0x0, 0xa2, 0x0, 0x36, 0x70, 0x0, 0x2e, 0x50, - 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x5, 0xd4, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7F6E "置" */ - 0x0, 0x28, 0x77, 0x77, 0x77, 0x77, 0x98, 0x0, - 0x0, 0x2b, 0x0, 0xe0, 0xc, 0x10, 0x78, 0x0, - 0x0, 0x2b, 0x0, 0xe0, 0xc, 0x10, 0x78, 0x0, - 0x0, 0x3d, 0x77, 0x99, 0x79, 0x77, 0xa7, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x60, 0x0, 0x54, 0x0, - 0x0, 0x78, 0x77, 0x7d, 0x77, 0x77, 0x76, 0x0, - 0x0, 0x0, 0xa7, 0x7d, 0x77, 0x7d, 0x30, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xf7, 0x77, 0x77, 0x7e, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xf7, 0x77, 0x77, 0x7e, 0x0, 0x0, - 0x0, 0x0, 0xf7, 0x77, 0x77, 0x7e, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x10, - 0x6, 0x77, 0xf7, 0x77, 0x77, 0x7e, 0x7b, 0xd1, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7F8E "美" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0x50, 0x0, 0x88, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x50, 0xb, 0x10, 0x10, 0x0, 0x27, - 0x66, 0xa7, 0x68, 0x76, 0x6e, 0x50, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x3, 0x66, - 0x66, 0xe6, 0x66, 0xb8, 0x0, 0x0, 0x2, 0x0, - 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0xb1, 0x18, 0x66, 0x66, 0x6b, - 0x66, 0x66, 0x66, 0x30, 0x0, 0x0, 0x0, 0xf2, - 0x0, 0x4, 0x0, 0x4, 0x76, 0x66, 0x8c, 0x86, - 0x66, 0x94, 0x0, 0x0, 0x0, 0xb, 0x47, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xb0, 0xa, 0x30, - 0x0, 0x0, 0x0, 0x4, 0xb1, 0x0, 0x1b, 0x93, - 0x0, 0x0, 0x48, 0x60, 0x0, 0x0, 0x7, 0xef, - 0x71, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, - - /* U+7FA9 "義" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x30, 0x1, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x90, 0x7, 0x30, 0x73, 0x0, - 0x0, 0x66, 0x66, 0x6b, 0x76, 0x66, 0x76, 0x0, - 0x0, 0x5, 0x66, 0x6c, 0x76, 0x69, 0xb0, 0x0, - 0x0, 0x1, 0x0, 0xa, 0x20, 0x0, 0x5, 0x0, - 0x3, 0x76, 0x66, 0x69, 0x66, 0x66, 0x7b, 0x30, - 0x0, 0x0, 0x0, 0x48, 0x1b, 0x27, 0x20, 0x0, - 0x0, 0x45, 0x7d, 0x86, 0x1e, 0x2, 0xe1, 0x0, - 0x0, 0x0, 0xc, 0x0, 0xc, 0x10, 0x27, 0x40, - 0x8, 0x66, 0x6d, 0x66, 0x6b, 0x96, 0x76, 0x50, - 0x0, 0x0, 0xc, 0x4, 0x6, 0x70, 0xa9, 0x0, - 0x3, 0x57, 0xae, 0x61, 0x2, 0xc6, 0xc1, 0x0, - 0x4, 0xa4, 0xc, 0x0, 0x0, 0xdb, 0x0, 0x50, - 0x0, 0x3, 0x2c, 0x0, 0x4a, 0x7c, 0x51, 0x80, - 0x0, 0x2, 0xbb, 0x26, 0x30, 0x1, 0x8d, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7FD2 "習" */ - 0x26, 0x66, 0x6b, 0x14, 0x66, 0x69, 0x70, 0x40, - 0x0, 0xe0, 0x32, 0x0, 0x86, 0x3, 0xd3, 0xd, - 0x1, 0xc7, 0x8, 0x60, 0x5, 0x40, 0xd0, 0x1, - 0x60, 0x86, 0x0, 0x16, 0x5d, 0x0, 0x27, 0x8a, - 0x64, 0xa8, 0x0, 0xe0, 0x8d, 0x40, 0x85, 0x44, - 0x0, 0x2, 0xc4, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x46, 0x0, 0x0, 0x30, 0x0, 0xc6, 0x66, 0x66, - 0x66, 0x8d, 0x0, 0xc, 0x10, 0x0, 0x0, 0x3, - 0xb0, 0x0, 0xc6, 0x66, 0x66, 0x66, 0x7b, 0x0, - 0xc, 0x10, 0x0, 0x0, 0x3, 0xb0, 0x0, 0xc1, - 0x0, 0x0, 0x0, 0x3b, 0x0, 0xd, 0x66, 0x66, - 0x66, 0x67, 0xb0, 0x0, 0x40, 0x0, 0x0, 0x0, - 0x12, 0x0, - - /* U+8001 "老" */ - 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4a, 0x0, 0x2, 0xb1, 0x0, - 0x0, 0x0, 0x0, 0x4a, 0x12, 0x89, 0xb1, 0x0, - 0x0, 0x27, 0x66, 0x8c, 0x55, 0x8d, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x4a, 0x1, 0xd2, 0x0, 0x0, - 0x5, 0x66, 0x66, 0x8c, 0x6c, 0xa6, 0x6d, 0x80, - 0x2, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2c, 0x40, 0x1, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xb1, 0x0, 0xad, 0x0, 0x0, - 0x0, 0x4, 0xbe, 0x10, 0x4c, 0x71, 0x0, 0x0, - 0x4, 0x86, 0xd, 0x58, 0x50, 0x0, 0x40, 0x0, - 0x12, 0x0, 0xd, 0x30, 0x0, 0x0, 0x60, 0x0, - 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x95, 0x0, - 0x0, 0x0, 0x8, 0xed, 0xdd, 0xdd, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8003 "考" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x20, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x6, 0xd0, 0x0, - 0x0, 0x5, 0x66, 0x6e, 0x6c, 0x6d, 0x20, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x1, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x1c, 0x30, 0x1, 0x80, - 0x7, 0x66, 0x66, 0x67, 0xe6, 0x66, 0x66, 0x62, - 0x0, 0x0, 0x0, 0x2c, 0x20, 0x0, 0x11, 0x0, - 0x0, 0x0, 0x5, 0xb9, 0x86, 0x66, 0x99, 0x0, - 0x0, 0x1, 0x95, 0x6, 0x70, 0x0, 0x0, 0x0, - 0x1, 0x56, 0x0, 0xd, 0x76, 0x66, 0xb3, 0x0, - 0x2, 0x0, 0x0, 0x3, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x6, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x6b, 0xae, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x72, 0x0, 0x0, - - /* U+8005 "者" */ - 0x0, 0x0, 0x0, 0x19, 0x10, 0x0, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0x1, 0x5, 0xd0, 0x0, - 0x0, 0x6, 0x66, 0x6d, 0x7e, 0x4e, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0x0, 0xc5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xa, 0x60, 0x4, 0x40, - 0x6, 0x76, 0x66, 0x68, 0xc9, 0x66, 0x68, 0x80, - 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xd8, 0x66, 0x6c, 0x30, 0x0, - 0x0, 0x0, 0x7e, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x29, 0x4e, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x5, 0x40, 0xe, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x0, 0x0, 0x3, 0x0, 0x0, - - /* U+800C "而" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x2, - 0x86, 0x66, 0x66, 0x87, 0x66, 0x67, 0xc4, 0x0, - 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x0, 0x86, - 0x66, 0x96, 0x66, 0x66, 0xb3, 0x0, 0xb, 0x20, - 0x3a, 0x0, 0xd0, 0xe, 0x10, 0x0, 0xb2, 0x3, - 0xa0, 0xd, 0x0, 0xe0, 0x0, 0xb, 0x20, 0x3a, - 0x0, 0xd0, 0xe, 0x0, 0x0, 0xb2, 0x3, 0xa0, - 0xd, 0x0, 0xe0, 0x0, 0xb, 0x20, 0x3a, 0x0, - 0xd0, 0xe, 0x0, 0x0, 0xb2, 0x3, 0xa0, 0xd, - 0x0, 0xe0, 0x0, 0xb, 0x20, 0x3a, 0x0, 0xd0, - 0xe, 0x0, 0x0, 0xc2, 0x3, 0xa0, 0xd, 0x10, - 0xe0, 0x0, 0xb, 0x10, 0x12, 0x0, 0x35, 0xec, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, - - /* U+8033 "耳" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x10, - 0x4, 0x76, 0xf6, 0x66, 0x66, 0xe6, 0x66, 0x30, - 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xf6, 0x66, 0x66, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xf6, 0x66, 0x66, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x17, 0x90, - 0x2, 0x45, 0xe5, 0x55, 0x55, 0xe6, 0x43, 0x10, - 0x4, 0x20, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, - - /* U+805E "聞" */ - 0x19, 0x66, 0x68, 0x80, 0x96, 0x66, 0x7a, 0x0, - 0xc0, 0x0, 0x57, 0xd, 0x0, 0x2, 0xb0, 0xd, - 0x66, 0x69, 0x70, 0xd6, 0x66, 0x7b, 0x0, 0xc0, - 0x0, 0x57, 0xd, 0x0, 0x2, 0xb0, 0xd, 0x66, - 0x69, 0x60, 0xd6, 0x66, 0x7b, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x2, 0x2, 0xb0, 0xc, 0x6, 0x69, - 0x66, 0x78, 0xa6, 0x2b, 0x0, 0xc0, 0x1, 0xc0, - 0x5, 0x80, 0x2, 0xb0, 0xc, 0x0, 0x1d, 0x66, - 0x98, 0x0, 0x2b, 0x0, 0xc0, 0x1, 0xd6, 0x69, - 0x80, 0x2, 0xb0, 0xc, 0x0, 0x1c, 0x0, 0x58, - 0x3, 0x2b, 0x0, 0xc2, 0x35, 0xd5, 0x59, 0xb6, - 0xa5, 0xb0, 0xc, 0x12, 0x10, 0x0, 0x58, 0x12, - 0x3a, 0x1, 0xc0, 0x0, 0x0, 0x4, 0x50, 0x6f, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, - - /* U+806F "聯" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x20, 0xc5, 0x0, 0x56, 0x0, - 0x7, 0xa6, 0x6b, 0x95, 0x90, 0x10, 0xa0, 0x0, - 0x0, 0xd0, 0xd, 0x18, 0x8, 0x85, 0x31, 0xd1, - 0x0, 0xd0, 0xd, 0x7a, 0xa8, 0xd, 0x7b, 0x30, - 0x0, 0xd6, 0x6d, 0x2, 0x75, 0x2, 0x53, 0x50, - 0x0, 0xd0, 0xd, 0x27, 0x19, 0x46, 0x63, 0xc2, - 0x0, 0xd0, 0xd, 0x7a, 0x55, 0x56, 0x73, 0x62, - 0x0, 0xd6, 0x6d, 0x0, 0x2, 0x90, 0xb0, 0x0, - 0x0, 0xd0, 0xd, 0xb, 0x21, 0xa0, 0xc0, 0xb0, - 0x0, 0xd0, 0xd, 0x3c, 0x1, 0xa0, 0xc0, 0xc0, - 0x16, 0xea, 0x8d, 0xc, 0x57, 0xa0, 0xc0, 0xc0, - 0xb, 0x50, 0xd, 0x7, 0x44, 0x80, 0xd6, 0x90, - 0x0, 0x0, 0xd, 0x0, 0xa, 0x20, 0xc0, 0x0, - 0x0, 0x0, 0xe, 0x3, 0x84, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x3, 0x33, 0x0, 0x0, 0x40, 0x0, - - /* U+8072 "聲" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb1, 0x1, 0x6, 0x33, 0x70, 0x0, - 0x6, 0x76, 0xd6, 0x7a, 0x1b, 0x33, 0xc0, 0x0, - 0x1, 0x33, 0xc3, 0x61, 0x37, 0x0, 0xd7, 0x91, - 0x0, 0x73, 0x33, 0x53, 0x82, 0x22, 0x56, 0x30, - 0x0, 0xd6, 0xc6, 0xd3, 0x29, 0x44, 0xc5, 0x0, - 0x0, 0xc0, 0xc0, 0xb0, 0x1, 0x9a, 0x50, 0x0, - 0x1, 0xc6, 0x66, 0x60, 0x4, 0x7a, 0x83, 0x10, - 0x5, 0x50, 0x0, 0x3, 0x41, 0x0, 0x8a, 0x90, - 0x7, 0x37, 0xa8, 0x66, 0x66, 0x6d, 0x64, 0x0, - 0x0, 0x0, 0x88, 0x66, 0x66, 0x6c, 0x0, 0x0, - 0x0, 0x0, 0x84, 0x0, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0x0, 0x88, 0x66, 0x66, 0x6c, 0x2, 0x40, - 0x2, 0x45, 0xa8, 0x66, 0x66, 0x6d, 0x57, 0x80, - 0x1, 0x10, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, - - /* U+8077 "職" */ - 0x0, 0x0, 0x0, 0x40, 0x80, 0x4, 0x50, 0x0, - 0x7, 0xb6, 0x6b, 0x83, 0x75, 0x45, 0x82, 0x0, - 0x0, 0xc0, 0xc, 0x37, 0x66, 0x86, 0x88, 0x40, - 0x0, 0xc0, 0xc, 0x7, 0x2, 0xc4, 0x82, 0xa0, - 0x0, 0xd6, 0x6c, 0x7, 0x56, 0x24, 0x80, 0x0, - 0x0, 0xc0, 0xc, 0x57, 0x79, 0x68, 0xb8, 0xb0, - 0x0, 0xc0, 0xc, 0x12, 0x0, 0x13, 0x83, 0x50, - 0x0, 0xd6, 0x6c, 0xd, 0x69, 0x92, 0x98, 0x70, - 0x0, 0xc0, 0xc, 0xc, 0x5, 0x70, 0xab, 0x0, - 0x0, 0xc0, 0xc, 0x1d, 0x69, 0x70, 0xca, 0x0, - 0x4, 0xd9, 0x7d, 0x2c, 0x5, 0x70, 0xb4, 0x2, - 0x9, 0x50, 0xc, 0xd, 0x69, 0x73, 0xa9, 0x32, - 0x0, 0x0, 0xc, 0x8, 0x2, 0x38, 0xa, 0xc0, - 0x0, 0x0, 0xc, 0x0, 0x1, 0x60, 0x1, 0xd1, - 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, - - /* U+807D "聽" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x40, 0x0, 0x4a, 0x0, 0x0, - 0x7, 0xb6, 0x6a, 0xaa, 0x44, 0x98, 0x47, 0xa0, - 0x0, 0xc6, 0x6b, 0x21, 0x10, 0x80, 0x1, 0x0, - 0x0, 0xc0, 0x9, 0x22, 0x96, 0xa7, 0x7b, 0x60, - 0x0, 0xc6, 0x6b, 0x21, 0xa1, 0xa5, 0x68, 0x40, - 0x0, 0xc0, 0x9, 0x21, 0xa1, 0xa5, 0x68, 0x40, - 0x7, 0xa6, 0x6b, 0x21, 0xa1, 0xa5, 0x68, 0x40, - 0x0, 0x0, 0x49, 0x22, 0xb6, 0x66, 0x69, 0x20, - 0x5, 0x8b, 0x59, 0x22, 0x22, 0x22, 0x25, 0x90, - 0x0, 0x38, 0x39, 0x23, 0x53, 0x53, 0x33, 0x30, - 0x4, 0x8b, 0x59, 0x20, 0x29, 0x4a, 0x4, 0x10, - 0x0, 0x38, 0x9, 0x24, 0x4c, 0x8, 0x14, 0xd1, - 0x8, 0x97, 0x39, 0x3e, 0xc, 0x0, 0x7, 0x71, - 0x3, 0x0, 0xa, 0x32, 0xb, 0xbb, 0xbc, 0x0, - 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8089 "肉" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa6, 0x0, 0x0, 0x0, 0x10, 0x0, 0xa, - 0x40, 0x0, 0x1, 0xd, 0x66, 0x66, 0xd7, 0x66, - 0x67, 0xf1, 0xe1, 0x0, 0xe, 0x0, 0x0, 0x1d, - 0xd, 0x10, 0x7, 0x99, 0x70, 0x1, 0xd0, 0xd1, - 0x3, 0xa0, 0x8, 0xe2, 0x1d, 0xd, 0x14, 0x70, - 0xa7, 0x9, 0x61, 0xd0, 0xd3, 0x20, 0xe, 0x20, - 0x0, 0x1d, 0xd, 0x10, 0x6, 0xb7, 0x10, 0x1, - 0xd0, 0xd1, 0x2, 0xc0, 0x1c, 0x80, 0x1d, 0xd, - 0x12, 0xa1, 0x0, 0x1e, 0x41, 0xd0, 0xe3, 0x50, - 0x0, 0x0, 0x31, 0x1d, 0xe, 0x10, 0x0, 0x0, - 0x5, 0x68, 0xd0, 0xe1, 0x0, 0x0, 0x0, 0x4, - 0xf7, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+80A9 "肩" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x80, 0x0, 0x0, 0x0, 0x3, - 0x0, 0x0, 0xa0, 0x0, 0x14, 0x0, 0xe, 0x66, - 0x66, 0x66, 0x66, 0x9a, 0x0, 0xe, 0x10, 0x0, - 0x0, 0x0, 0x68, 0x0, 0xd, 0x66, 0x66, 0x66, - 0x66, 0x98, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x0, 0xd, 0xc, 0x66, 0x66, 0x66, 0xe3, - 0x0, 0xd, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, - 0xd, 0xc, 0x66, 0x66, 0x66, 0xe0, 0x0, 0x2a, - 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x75, 0xc, - 0x66, 0x66, 0x66, 0xe0, 0x0, 0xb0, 0xc, 0x10, - 0x0, 0x0, 0xe0, 0x5, 0x40, 0xc, 0x10, 0x1, - 0x10, 0xe0, 0x16, 0x0, 0xd, 0x10, 0x1, 0x7f, - 0xc0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x2, 0x10, - - /* U+80AF "肯" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, - 0x2, 0xf2, 0x0, 0xe0, 0x0, 0x70, 0x0, 0x0, - 0x1e, 0x0, 0xf, 0x66, 0x67, 0x30, 0x0, 0x1, - 0xe0, 0x0, 0xe0, 0x0, 0x5, 0x2, 0x86, 0x6a, - 0x66, 0x6a, 0x66, 0x66, 0xa6, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0xa8, 0x66, - 0x66, 0x66, 0xf4, 0x0, 0x0, 0xa, 0x40, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x0, 0xa8, 0x66, 0x66, - 0x66, 0xf0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, - 0xe, 0x0, 0x0, 0x0, 0xa8, 0x66, 0x66, 0x66, - 0xf0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0xe0, - 0x0, 0x0, 0xb, 0x50, 0x0, 0x17, 0xee, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x3, 0x20, 0x0, - - /* U+80B2 "育" */ - 0x0, 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x48, 0x0, 0x1, 0x90, 0x47, 0x66, - 0x6d, 0xa6, 0x66, 0x66, 0x62, 0x0, 0x1, 0x98, - 0x10, 0x16, 0x20, 0x0, 0x0, 0x7a, 0x43, 0x34, - 0x46, 0xeb, 0x0, 0x0, 0x6a, 0x76, 0x43, 0x10, - 0xc, 0x20, 0x0, 0xa, 0x66, 0x66, 0x66, 0xc2, - 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xe, 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, - 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, - 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x21, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x4c, - 0xc0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x1, 0x0, - 0x0, - - /* U+80CC "背" */ - 0x0, 0x0, 0x3, 0x90, 0xa, 0x10, 0x0, 0x0, - 0x2, 0x66, 0x67, 0xb0, 0xe, 0x0, 0x8d, 0x0, - 0x0, 0x10, 0x3, 0xb0, 0xe, 0x67, 0x51, 0x10, - 0x0, 0x2, 0x57, 0xb0, 0xe, 0x0, 0x0, 0x60, - 0xb, 0xc6, 0x23, 0xb0, 0xc, 0xca, 0xac, 0xd0, - 0x0, 0x0, 0x2, 0x60, 0x0, 0x34, 0x33, 0x0, - 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6c, 0x80, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb, 0x40, 0x0, - 0x0, 0x0, 0xf6, 0x66, 0x66, 0x6d, 0x30, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x0, 0x0, 0xf6, 0x66, 0x66, 0x6d, 0x30, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x30, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x16, 0xcf, 0x10, 0x0, - 0x0, 0x0, 0x60, 0x0, 0x0, 0x23, 0x0, 0x0, - - /* U+80F8 "胸" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x3, 0x0, 0xb2, 0x0, 0x0, 0x0, - 0x0, 0xd6, 0x6e, 0x21, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0xd, 0x7, 0x96, 0x66, 0x66, 0xb0, - 0x0, 0xd0, 0xd, 0xa, 0x0, 0x52, 0x0, 0xc0, - 0x0, 0xd6, 0x6e, 0x42, 0x50, 0xc6, 0x0, 0xc0, - 0x0, 0xd0, 0xd, 0x11, 0x44, 0xd0, 0x0, 0xc0, - 0x0, 0xd0, 0xd, 0xc, 0x1c, 0x70, 0xc0, 0xc0, - 0x0, 0xd0, 0xd, 0xc, 0xa, 0x40, 0xb0, 0xc0, - 0x0, 0xe6, 0x6e, 0xc, 0x19, 0xb0, 0xb0, 0xb0, - 0x0, 0xc0, 0xd, 0xc, 0x61, 0xb0, 0xb0, 0xb0, - 0x2, 0xa0, 0xd, 0xc, 0x30, 0x40, 0xb1, 0xb0, - 0x5, 0x60, 0xd, 0x9, 0x66, 0x66, 0xa2, 0xa0, - 0x8, 0x13, 0x3e, 0x0, 0x0, 0x14, 0x38, 0x80, - 0x6, 0x1, 0xba, 0x0, 0x0, 0x1, 0x8f, 0x30, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+80FD "能" */ - 0x0, 0x9, 0x10, 0x0, 0x40, 0x0, 0x0, 0x0, - 0x6, 0xa1, 0x0, 0xc, 0x30, 0x21, 0x0, 0x2, - 0x90, 0x8, 0x0, 0xc1, 0x2d, 0x60, 0x3, 0x91, - 0x11, 0x7c, 0xc, 0x77, 0x10, 0x0, 0x6b, 0x85, - 0x42, 0xc1, 0xc1, 0x0, 0x23, 0x0, 0x40, 0x0, - 0x61, 0xb, 0x40, 0x5, 0x90, 0xe, 0x55, 0x5e, - 0x20, 0x4a, 0xaa, 0xa5, 0x0, 0xe6, 0x66, 0xe0, - 0x7, 0x10, 0x1, 0x0, 0xe, 0x0, 0xd, 0x0, - 0xe0, 0x9, 0xb0, 0x0, 0xe0, 0x0, 0xd0, 0xd, - 0x9, 0x70, 0x0, 0xe, 0x66, 0x6e, 0x0, 0xd5, - 0x0, 0x1, 0x0, 0xe0, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0x60, 0xe, 0x0, 0xd, 0x0, 0xd0, 0x0, - 0x1a, 0x0, 0xe0, 0x4c, 0xd0, 0xa, 0xcc, 0xcd, - 0xb0, 0x3, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+8131 "脱" */ - 0x0, 0x30, 0x4, 0x1, 0x20, 0x1, 0x90, 0x0, - 0x0, 0xd6, 0x6e, 0x10, 0xb2, 0x6, 0x70, 0x0, - 0x0, 0xd0, 0xd, 0x0, 0x77, 0x9, 0x0, 0x0, - 0x0, 0xd0, 0xd, 0x5, 0x43, 0x37, 0x44, 0x0, - 0x0, 0xd6, 0x6d, 0xd, 0x44, 0x44, 0x87, 0x0, - 0x0, 0xd0, 0xd, 0xd, 0x0, 0x0, 0x56, 0x0, - 0x0, 0xd0, 0xd, 0xd, 0x0, 0x0, 0x56, 0x0, - 0x0, 0xd6, 0x6d, 0xd, 0x6b, 0x5a, 0x96, 0x0, - 0x0, 0xc0, 0xd, 0x7, 0x1d, 0xc, 0x10, 0x0, - 0x0, 0xc0, 0xd, 0x0, 0x2b, 0xc, 0x0, 0x0, - 0x0, 0xa0, 0xd, 0x0, 0x49, 0xc, 0x0, 0x10, - 0x3, 0x60, 0xd, 0x0, 0x85, 0xc, 0x0, 0x50, - 0x7, 0x13, 0x4d, 0x2, 0xc0, 0xd, 0x0, 0xa0, - 0x6, 0x0, 0x89, 0x38, 0x10, 0xb, 0xbb, 0xb0, - 0x10, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+814A "腊" */ - 0x0, 0x30, 0x4, 0x0, 0x76, 0xa, 0x30, 0x0, - 0x0, 0xd6, 0x6e, 0x10, 0x84, 0xc, 0x0, 0x0, - 0x0, 0xd0, 0xd, 0x26, 0xb8, 0x6d, 0x7c, 0x10, - 0x0, 0xd0, 0xd, 0x1, 0x84, 0xc, 0x0, 0x0, - 0x0, 0xd6, 0x6d, 0x0, 0x84, 0xc, 0x0, 0x0, - 0x0, 0xd0, 0xd, 0x46, 0xb8, 0x6d, 0x6b, 0x90, - 0x0, 0xd0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd3, 0x3d, 0x4, 0x0, 0x0, 0x33, 0x0, - 0x0, 0xd3, 0x3d, 0xc, 0x66, 0x66, 0xa9, 0x0, - 0x0, 0xc0, 0xd, 0xc, 0x0, 0x0, 0x66, 0x0, - 0x0, 0xb0, 0xd, 0xc, 0x66, 0x66, 0xa6, 0x0, - 0x3, 0x80, 0xd, 0xc, 0x0, 0x0, 0x66, 0x0, - 0x7, 0x22, 0x1d, 0xc, 0x66, 0x66, 0xa6, 0x0, - 0x6, 0x3, 0xca, 0xd, 0x0, 0x0, 0x66, 0x0, - 0x10, 0x0, 0x10, 0x1, 0x0, 0x0, 0x0, 0x0, - - /* U+8155 "腕" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, - 0x0, 0xb6, 0x6d, 0x1, 0x0, 0x96, 0x0, 0x0, - 0x0, 0xd0, 0xd, 0xa, 0x66, 0x97, 0x67, 0xb0, - 0x0, 0xd0, 0xd, 0x49, 0x71, 0x0, 0x6, 0x20, - 0x0, 0xd3, 0x3d, 0x21, 0xd0, 0x0, 0x1, 0x0, - 0x0, 0xd2, 0x2d, 0x5, 0x82, 0x3a, 0x6d, 0x10, - 0x0, 0xd0, 0xd, 0xa, 0x6a, 0x9b, 0xc, 0x0, - 0x0, 0xd0, 0xd, 0x1a, 0x9, 0x4b, 0xc, 0x0, - 0x0, 0xe6, 0x6d, 0x67, 0x5c, 0x1b, 0xc, 0x0, - 0x0, 0xc0, 0xd, 0x10, 0x6b, 0xb, 0xc, 0x0, - 0x2, 0xa0, 0xd, 0x0, 0x84, 0xb, 0x99, 0x10, - 0x5, 0x60, 0xd, 0x2, 0xa0, 0xb, 0x0, 0x50, - 0x8, 0x11, 0x2c, 0x9, 0x0, 0xb, 0x0, 0xa0, - 0x7, 0x3, 0xc9, 0x71, 0x0, 0xc, 0xbb, 0xc2, - 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8166 "腦" */ - 0x0, 0x30, 0x4, 0x1, 0x90, 0x16, 0x4, 0x10, - 0xd, 0x66, 0xe1, 0x6a, 0x6, 0x90, 0xc5, 0x0, - 0xd0, 0xd, 0xa, 0x0, 0xa0, 0x28, 0x0, 0xd, - 0x0, 0xd4, 0x30, 0x62, 0x8, 0x0, 0x0, 0xd6, - 0x6d, 0xa, 0x21, 0xa2, 0x49, 0x10, 0xd, 0x0, - 0xd0, 0x4d, 0x33, 0xe0, 0x6c, 0x0, 0xd0, 0xd, - 0x0, 0x8b, 0x35, 0x0, 0x40, 0xd, 0x66, 0xd0, - 0xb6, 0x96, 0x66, 0xd3, 0x0, 0xc0, 0xd, 0xd, - 0x0, 0x4, 0x5c, 0x0, 0xc, 0x0, 0xd0, 0xd2, - 0x61, 0xc3, 0xc0, 0x0, 0xa0, 0xd, 0xd, 0x1, - 0xe8, 0xc, 0x0, 0x36, 0x0, 0xd0, 0xd0, 0x67, - 0xc5, 0xc0, 0x7, 0x10, 0xc, 0xd, 0x55, 0x2, - 0x9c, 0x0, 0x60, 0x6e, 0x90, 0xd6, 0x66, 0x66, - 0xd1, 0x20, 0x0, 0x30, 0x7, 0x0, 0x0, 0x6, - 0x0, - - /* U+8170 "腰" */ - 0x0, 0x30, 0x4, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0xe6, 0x6e, 0x57, 0x69, 0x69, 0x69, 0x90, - 0x0, 0xd0, 0xc, 0x0, 0xc, 0xc, 0x0, 0x0, - 0x0, 0xd0, 0xc, 0x3a, 0x6d, 0x6d, 0x6c, 0x30, - 0x0, 0xd6, 0x6c, 0x29, 0xc, 0xc, 0xb, 0x10, - 0x0, 0xd0, 0xc, 0x29, 0xc, 0xc, 0xb, 0x10, - 0x0, 0xd0, 0xc, 0x3b, 0x6a, 0x6a, 0x6d, 0x20, - 0x0, 0xd3, 0x3c, 0x13, 0xc, 0x30, 0x3, 0x0, - 0x0, 0xd3, 0x3c, 0x0, 0x2c, 0x0, 0x2, 0x70, - 0x0, 0xc0, 0xc, 0x66, 0xc7, 0x68, 0xb6, 0x61, - 0x1, 0xa0, 0xc, 0x2, 0xa0, 0x8, 0x30, 0x0, - 0x4, 0x60, 0xc, 0x5, 0x85, 0x3a, 0x0, 0x0, - 0x7, 0x11, 0x1c, 0x0, 0x4, 0xdb, 0x82, 0x0, - 0x7, 0x4, 0xe9, 0x2, 0x88, 0x0, 0x5e, 0x30, - 0x10, 0x0, 0x22, 0x44, 0x0, 0x0, 0x1, 0x20, - - /* U+819D "膝" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x1, 0xc6, 0xd5, 0x46, 0x66, 0xe6, 0x6d, 0x70, - 0x1, 0xb0, 0xc1, 0x11, 0x1c, 0xe3, 0x0, 0x0, - 0x1, 0xb0, 0xc1, 0x0, 0xa3, 0xc4, 0xb7, 0x0, - 0x1, 0xd6, 0xd1, 0x9, 0x22, 0x50, 0xc, 0x80, - 0x1, 0xb0, 0xc2, 0x70, 0xb, 0xc0, 0x1, 0x40, - 0x1, 0xb0, 0xc1, 0x0, 0x89, 0x9, 0x20, 0x0, - 0x1, 0xb0, 0xc1, 0x7, 0x80, 0x92, 0xb9, 0x30, - 0x1, 0xc6, 0xd1, 0x77, 0x0, 0xd0, 0x67, 0xc2, - 0x2, 0x90, 0xc3, 0x3, 0xb0, 0xd7, 0x82, 0x0, - 0x4, 0x70, 0xc1, 0x0, 0x35, 0xe2, 0x0, 0x0, - 0x7, 0x30, 0xc1, 0x4, 0x92, 0xd5, 0xb5, 0x0, - 0x8, 0x0, 0xc0, 0xab, 0x0, 0xd0, 0x1c, 0x60, - 0x6, 0x2a, 0xd0, 0x10, 0x4b, 0xc0, 0x1, 0x30, - 0x10, 0x0, 0x10, 0x0, 0x3, 0x30, 0x0, 0x0, - - /* U+81C9 "臉" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x3, 0x0, 0x5, 0xc0, 0x0, 0x0, - 0x0, 0xd6, 0x7c, 0x0, 0xc, 0x63, 0x0, 0x0, - 0x0, 0xc0, 0x29, 0x0, 0x66, 0x7, 0x20, 0x0, - 0x0, 0xb0, 0x29, 0x2, 0x80, 0x1, 0xa4, 0x0, - 0x0, 0xd6, 0x79, 0x26, 0x56, 0x69, 0x6a, 0xb1, - 0x0, 0xb0, 0x29, 0x31, 0x2, 0x2, 0x0, 0x30, - 0x0, 0xb0, 0x29, 0xd, 0x6d, 0x1d, 0x67, 0xb0, - 0x0, 0xc4, 0x69, 0xb, 0xb, 0xb, 0x1, 0x90, - 0x0, 0xb1, 0x39, 0xc, 0x6c, 0xd, 0x66, 0x90, - 0x1, 0xa0, 0x29, 0x6, 0x43, 0x5, 0x52, 0x20, - 0x2, 0x70, 0x29, 0x2, 0xb0, 0x0, 0xd1, 0x0, - 0x6, 0x30, 0x29, 0x7, 0x91, 0x2, 0xd1, 0x0, - 0x7, 0x4, 0x78, 0x9, 0x1d, 0x1a, 0x28, 0x90, - 0x14, 0x2, 0xc2, 0x61, 0x2, 0x63, 0x0, 0xa1, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x10, 0x0, 0x0, - - /* U+81EA "自" */ - 0x0, 0x2, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x69, - 0x0, 0x0, 0x0, 0x40, 0x9, 0x0, 0x0, 0x17, - 0xe, 0x66, 0x66, 0x66, 0x68, 0xd1, 0xe1, 0x0, - 0x0, 0x0, 0x3b, 0xd, 0x10, 0x0, 0x0, 0x3, - 0xb0, 0xd6, 0x66, 0x66, 0x66, 0x8b, 0xd, 0x10, - 0x0, 0x0, 0x3, 0xb0, 0xd1, 0x0, 0x0, 0x0, - 0x3b, 0xd, 0x66, 0x66, 0x66, 0x68, 0xb0, 0xd1, - 0x0, 0x0, 0x0, 0x3b, 0xd, 0x10, 0x0, 0x0, - 0x3, 0xb0, 0xe1, 0x0, 0x0, 0x0, 0x3b, 0xe, - 0x66, 0x66, 0x66, 0x68, 0xc0, 0x70, 0x0, 0x0, - 0x0, 0x25, 0x0, - - /* U+81F3 "至" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x0, - 0x47, 0x66, 0x6a, 0xa6, 0x66, 0x68, 0x81, 0x0, - 0x0, 0x1, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb3, 0x1, 0x73, 0x0, 0x0, 0x0, 0x0, - 0x93, 0x0, 0x0, 0xab, 0x10, 0x0, 0x4, 0xa4, - 0x23, 0x45, 0x66, 0xde, 0x10, 0x0, 0x7e, 0xa7, - 0x5c, 0x50, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x30, 0x2, 0x70, 0x0, 0x5, 0x76, 0x66, 0xd8, - 0x66, 0x88, 0x10, 0x0, 0x0, 0x0, 0xb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x1c, 0x31, 0x86, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x64, - - /* U+81FA "臺" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x3, 0x90, - 0x4, 0x76, 0x66, 0x66, 0xe6, 0x66, 0x76, 0x62, - 0x0, 0x7, 0x66, 0x66, 0xc6, 0x66, 0xb5, 0x0, - 0x0, 0x2, 0x86, 0x66, 0x66, 0x66, 0xc1, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x0, 0x1, 0xd0, 0x0, - 0x0, 0x2, 0xc6, 0x66, 0x66, 0x66, 0xb0, 0x0, - 0x1, 0xa6, 0x66, 0x66, 0x66, 0x66, 0x66, 0xd1, - 0xb, 0x50, 0x0, 0x0, 0x0, 0x3, 0x65, 0x81, - 0x8, 0x6, 0x66, 0xcc, 0x66, 0x86, 0x52, 0x0, - 0x0, 0x1, 0x57, 0x30, 0x0, 0x19, 0x80, 0x0, - 0x0, 0x6, 0xeb, 0xa9, 0xe6, 0x54, 0xa7, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xd0, 0x1, 0xa1, 0x0, - 0x0, 0x6, 0x66, 0x66, 0xe6, 0x66, 0x62, 0x0, - 0x2, 0x66, 0x66, 0x66, 0xe6, 0x66, 0x6c, 0x90, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8207 "與" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x29, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xa6, 0xa7, 0xa3, 0x3, 0x66, 0xb8, 0x0, 0xe, - 0x0, 0xa, 0x76, 0x81, 0x8, 0x50, 0x0, 0xd0, - 0x50, 0xa3, 0x0, 0x0, 0x94, 0x0, 0xc, 0x66, - 0x3d, 0x76, 0xd4, 0x7c, 0x30, 0x0, 0xc1, 0x0, - 0x20, 0xd, 0x0, 0xa3, 0x0, 0xc, 0x15, 0x1c, - 0x20, 0xc0, 0xa, 0x20, 0x0, 0xb7, 0x63, 0xd0, - 0xc, 0x27, 0xc2, 0x0, 0xb, 0x20, 0xd, 0x0, - 0xc0, 0xb, 0x20, 0x16, 0xc6, 0x55, 0xd5, 0x5d, - 0x55, 0xdb, 0x60, 0x31, 0x11, 0x51, 0x11, 0x22, - 0x11, 0x10, 0x0, 0x0, 0xad, 0x20, 0x0, 0x69, - 0x40, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0x1c, - 0xc1, 0x3, 0xa3, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x61, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8208 "興" */ - 0x0, 0x0, 0x33, 0x0, 0x2, 0x10, 0x0, 0x0, - 0x9, 0x96, 0xc6, 0x66, 0x98, 0x7b, 0x70, 0x0, - 0xd0, 0xc, 0x0, 0x56, 0x50, 0x93, 0x0, 0xc, - 0x32, 0xc5, 0x66, 0x85, 0xa, 0x20, 0x0, 0xb5, - 0x3c, 0x36, 0x87, 0x65, 0xd1, 0x0, 0xa, 0x10, - 0xc6, 0x5b, 0x65, 0xc, 0x10, 0x0, 0xa5, 0x3c, - 0x65, 0xb5, 0x50, 0xd0, 0x0, 0xa, 0x74, 0xc6, - 0x9c, 0x56, 0x7e, 0x0, 0x0, 0xa3, 0xc, 0x10, - 0x15, 0x50, 0xd0, 0x1, 0x6c, 0x86, 0xd6, 0x66, - 0x99, 0x6e, 0xd6, 0x1, 0x0, 0x6, 0x0, 0x2, - 0x20, 0x0, 0x0, 0x0, 0x9, 0xd2, 0x0, 0x5, - 0xb6, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x1, - 0xce, 0x10, 0x38, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xc4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+8209 "舉" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x22, 0x6d, 0x5c, 0x3, 0x12, 0x36, 0x0, - 0x0, 0x5a, 0x20, 0x1d, 0x68, 0x46, 0x7b, 0x0, - 0x0, 0x4a, 0x48, 0x1c, 0x0, 0x3, 0x68, 0x0, - 0x0, 0x2b, 0x33, 0x5d, 0x6c, 0x75, 0x86, 0x0, - 0x0, 0x2a, 0x7, 0x5, 0xb, 0x20, 0x65, 0x0, - 0x0, 0x1d, 0x66, 0x2d, 0xc, 0x47, 0xb4, 0x0, - 0x0, 0xc, 0x0, 0x1c, 0xc, 0x10, 0x86, 0x50, - 0x6, 0x76, 0x6d, 0x97, 0x76, 0x86, 0x66, 0x60, - 0x0, 0x0, 0x7b, 0x1, 0xa0, 0x8, 0x0, 0x0, - 0x0, 0x6, 0x96, 0x76, 0xb6, 0xb4, 0xb1, 0x0, - 0x1, 0x85, 0x0, 0x1, 0x90, 0x0, 0x6e, 0xa1, - 0x4, 0x6, 0x76, 0x66, 0xb6, 0x69, 0xb4, 0x20, - 0x0, 0x0, 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+822A "航" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd2, 0x0, 0x2, 0x20, 0x0, 0x0, - 0x0, 0x11, 0x80, 0x10, 0x0, 0xc2, 0x0, 0x0, - 0x0, 0xc7, 0x66, 0xe0, 0x0, 0x52, 0x5, 0x0, - 0x0, 0xc2, 0x0, 0xd5, 0x66, 0x66, 0x69, 0x30, - 0x0, 0xc1, 0xa0, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc1, 0x91, 0xd0, 0x87, 0x66, 0xc0, 0x0, - 0x0, 0xc1, 0x0, 0xd0, 0x84, 0x1, 0xb0, 0x0, - 0x17, 0xd6, 0x66, 0xd0, 0x84, 0x1, 0xb0, 0x0, - 0x0, 0xc1, 0x50, 0xd0, 0x93, 0x1, 0xb0, 0x0, - 0x0, 0xb0, 0xa3, 0xd0, 0xa2, 0x1, 0xb0, 0x0, - 0x0, 0xa0, 0x42, 0xd0, 0xb0, 0x1, 0xb0, 0x0, - 0x3, 0x70, 0x0, 0xd0, 0xa0, 0x1, 0xb0, 0x60, - 0x7, 0x10, 0x33, 0xc5, 0x40, 0x1, 0xb0, 0xa0, - 0x15, 0x0, 0x3e, 0x86, 0x0, 0x0, 0xcc, 0xd1, - 0x10, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+822C "般" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x10, 0x0, 0x20, 0x0, - 0x0, 0x24, 0x40, 0x40, 0x3c, 0x66, 0xe1, 0x0, - 0x0, 0x98, 0x66, 0xe2, 0x39, 0x0, 0xd0, 0x0, - 0x0, 0x95, 0x50, 0xd0, 0x48, 0x0, 0xd0, 0x0, - 0x0, 0x93, 0xb2, 0xd0, 0x74, 0x0, 0xdc, 0xe4, - 0x0, 0x93, 0x41, 0xd0, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x93, 0x0, 0xd6, 0x44, 0x44, 0x78, 0x0, - 0x7, 0xc8, 0x66, 0xd0, 0x26, 0x22, 0x99, 0x0, - 0x0, 0xa5, 0x40, 0xd0, 0x6, 0x0, 0xd1, 0x0, - 0x0, 0xb1, 0xc2, 0xd0, 0x5, 0x35, 0x90, 0x0, - 0x0, 0xc0, 0x51, 0xd0, 0x0, 0xbd, 0x10, 0x0, - 0x1, 0xa0, 0x0, 0xd0, 0x0, 0xbc, 0x10, 0x0, - 0x6, 0x30, 0x32, 0xc0, 0x1a, 0x44, 0xe6, 0x0, - 0x7, 0x0, 0x3d, 0x75, 0x81, 0x0, 0x2d, 0xd2, - 0x20, 0x0, 0x1, 0x31, 0x0, 0x0, 0x0, 0x20, - - /* U+8239 "船" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd2, 0x0, 0x4, 0x0, 0x50, 0x0, - 0x0, 0x25, 0x40, 0x40, 0xd, 0x66, 0xe2, 0x0, - 0x0, 0xd6, 0x66, 0xe1, 0xc, 0x0, 0xd0, 0x0, - 0x0, 0xd1, 0x20, 0xd0, 0xc, 0x0, 0xd0, 0x0, - 0x0, 0xd0, 0xb1, 0xd0, 0x2a, 0x0, 0xd0, 0x0, - 0x0, 0xd0, 0x51, 0xd0, 0x64, 0x0, 0xac, 0xd1, - 0x15, 0xe5, 0x55, 0xd2, 0x60, 0x0, 0x0, 0x0, - 0x2, 0xd1, 0x11, 0xd3, 0x11, 0x0, 0x5, 0x0, - 0x0, 0xc1, 0x50, 0xd0, 0x2d, 0x66, 0x6e, 0x10, - 0x0, 0xb0, 0xb2, 0xd0, 0x1b, 0x0, 0x1c, 0x0, - 0x0, 0xa0, 0x31, 0xd0, 0x1b, 0x0, 0x1c, 0x0, - 0x4, 0x50, 0x0, 0xd0, 0x1b, 0x0, 0x1c, 0x0, - 0x8, 0x0, 0x44, 0xc0, 0x2d, 0x66, 0x6c, 0x0, - 0x15, 0x0, 0x1b, 0x50, 0x2b, 0x0, 0x1a, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+826F "良" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x40, 0x0, 0x0, 0x0, 0xb6, 0x66, 0x96, 0x66, - 0xe1, 0x0, 0xb, 0x20, 0x0, 0x0, 0x1d, 0x0, - 0x0, 0xb2, 0x0, 0x0, 0x1, 0xd0, 0x0, 0xb, - 0x76, 0x66, 0x66, 0x6d, 0x0, 0x0, 0xb2, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0xb, 0x76, 0x66, 0x66, - 0x6d, 0x0, 0x0, 0xb2, 0x6, 0x0, 0x0, 0x77, - 0x0, 0xb, 0x20, 0x26, 0x0, 0x7c, 0x70, 0x0, - 0xb2, 0x0, 0x87, 0x73, 0x0, 0x0, 0xb, 0x20, - 0x13, 0xb6, 0x0, 0x0, 0x0, 0xb5, 0x86, 0x0, - 0x9d, 0x84, 0x10, 0xc, 0xb1, 0x0, 0x0, 0x2a, - 0xfe, 0x40, 0x10, 0x0, 0x0, 0x0, 0x0, 0x10, - - /* U+8272 "色" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5e, 0x66, 0x6a, 0xa0, 0x0, 0x0, - 0x0, 0x1, 0xd2, 0x0, 0x2d, 0x50, 0x0, 0x0, - 0x0, 0xa, 0x50, 0x0, 0x92, 0x0, 0x0, 0x0, - 0x0, 0x7d, 0x66, 0x68, 0x86, 0x66, 0xc1, 0x0, - 0x5, 0x4d, 0x0, 0xa, 0x20, 0x0, 0xd0, 0x0, - 0x1, 0xd, 0x0, 0xa, 0x20, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xa, 0x20, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x66, 0x67, 0x66, 0x66, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc1, - 0x0, 0xa, 0xdc, 0xcc, 0xcc, 0xcc, 0xcd, 0xa0, - - /* U+8282 "节" */ - 0x0, 0x0, 0x7, 0x20, 0x1, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x30, 0x1, 0xd0, 0x2, 0x0, - 0x26, 0x66, 0x6d, 0x76, 0x66, 0xe6, 0x6e, 0x90, - 0x1, 0x0, 0xb, 0x20, 0x1, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x10, 0x0, 0x90, 0x0, 0x0, - 0x0, 0x56, 0x66, 0x66, 0x66, 0x66, 0xc1, 0x0, - 0x0, 0x10, 0x0, 0x77, 0x0, 0x1, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x77, 0x0, 0x1, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x77, 0x0, 0x1, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x77, 0x0, 0x1, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x77, 0x4, 0x44, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x77, 0x0, 0x5e, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x77, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+82B1 "花" */ - 0x0, 0x0, 0x7, 0x50, 0x4, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x60, 0x5, 0x80, 0x2, 0x10, - 0x7, 0x66, 0x6b, 0x96, 0x69, 0xb6, 0x6c, 0x90, - 0x0, 0x0, 0x8, 0x60, 0x5, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x20, 0x3, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x5d, 0x0, 0x8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc3, 0x0, 0xe, 0x0, 0x6d, 0x0, - 0x0, 0x6, 0xd0, 0x0, 0xd, 0x6, 0xc2, 0x0, - 0x0, 0x2b, 0xd0, 0x0, 0xe, 0xa8, 0x0, 0x0, - 0x1, 0x91, 0xd0, 0x0, 0x7e, 0x20, 0x0, 0x0, - 0x16, 0x0, 0xd0, 0x57, 0x2d, 0x0, 0x0, 0x20, - 0x0, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, 0x60, - 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, 0xb0, - 0x0, 0x0, 0xe0, 0x0, 0xc, 0xdc, 0xcd, 0xd1, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+82E5 "若" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x70, 0x1, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x60, 0x0, 0xd0, 0x5, 0x10, - 0x2, 0x76, 0x6a, 0xa6, 0x66, 0xe6, 0x68, 0x60, - 0x0, 0x0, 0x8, 0x64, 0x0, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x1e, 0x50, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x1, 0x50, - 0x5, 0x66, 0x66, 0xd9, 0x66, 0x66, 0x68, 0x92, - 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x10, 0x0, 0x2, 0x40, 0x0, - 0x0, 0x1, 0xce, 0x66, 0x66, 0x69, 0xb0, 0x0, - 0x0, 0x2a, 0x3d, 0x0, 0x0, 0x5, 0x80, 0x0, - 0x4, 0x60, 0xd, 0x0, 0x0, 0x5, 0x80, 0x0, - 0x1, 0x0, 0xe, 0x66, 0x66, 0x69, 0x90, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x5, 0x80, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+82E6 "苦" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x20, 0x0, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xd0, 0x6, 0x40, - 0x17, 0x66, 0x6e, 0x66, 0x66, 0xe6, 0x67, 0x70, - 0x0, 0x0, 0xe, 0x3, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xc, 0x40, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x8, 0x30, - 0x27, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x67, 0x50, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x66, 0x6e, 0x66, 0x68, 0x70, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, - 0x0, 0xd, 0x66, 0x66, 0x66, 0x6a, 0x60, 0x0, - 0x0, 0x5, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - - /* U+82F1 "英" */ - 0x0, 0x0, 0xb, 0x20, 0x1, 0x91, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x1, 0xc0, 0x7, 0x60, - 0x8, 0x66, 0x6e, 0x66, 0x66, 0xd6, 0x66, 0x50, - 0x0, 0x0, 0xd, 0x9, 0x31, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xc, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x66, 0x6d, 0x66, 0x6b, 0x80, 0x0, - 0x0, 0xc, 0x0, 0xd, 0x0, 0x8, 0x50, 0x0, - 0x0, 0xc, 0x0, 0xd, 0x0, 0x8, 0x50, 0x0, - 0x0, 0xc, 0x0, 0xe, 0x0, 0x8, 0x54, 0x30, - 0x28, 0x68, 0x66, 0x8d, 0x86, 0x67, 0x68, 0x70, - 0x0, 0x0, 0x0, 0xa5, 0x26, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xb0, 0x6, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x6b, 0x10, 0x0, 0x5d, 0x61, 0x0, - 0x0, 0x48, 0x40, 0x0, 0x0, 0x2, 0xbf, 0x90, - 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+8336 "茶" */ - 0x0, 0x0, 0xb, 0x40, 0x0, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x10, 0x0, 0xd0, 0x6, 0x80, - 0x6, 0x66, 0x6e, 0x66, 0x66, 0xe6, 0x66, 0x61, - 0x0, 0x0, 0xd, 0x8, 0xb0, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x4c, 0x44, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xc1, 0x4, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x79, 0x2, 0x40, 0x3c, 0x71, 0x0, - 0x0, 0x47, 0x20, 0x3, 0xc0, 0x0, 0x9f, 0xc3, - 0x4, 0x26, 0x66, 0x68, 0xc6, 0x6a, 0xd2, 0x10, - 0x0, 0x2, 0x1, 0x3, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6d, 0x3, 0xa1, 0x83, 0x0, 0x0, - 0x0, 0x3, 0xb1, 0x3, 0xa0, 0xb, 0x80, 0x0, - 0x0, 0x39, 0x1, 0x4, 0xa0, 0x0, 0xc8, 0x0, - 0x2, 0x40, 0x0, 0x8f, 0x70, 0x0, 0x24, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - - /* U+8377 "荷" */ - 0x0, 0x0, 0xa, 0x40, 0x5, 0x70, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x20, 0x6, 0x80, 0x7, 0x20, - 0x7, 0x66, 0x6d, 0x76, 0x69, 0xb6, 0x68, 0x60, - 0x0, 0x0, 0xb, 0x20, 0x6, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xd3, 0x0, 0x1, 0x10, 0x2, 0x10, - 0x0, 0x7, 0x84, 0x76, 0x66, 0x66, 0x9b, 0x90, - 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x9f, 0x33, 0x86, 0x6c, 0x10, 0xe0, 0x0, - 0x5, 0x5e, 0x4, 0xa0, 0xd, 0x0, 0xe0, 0x0, - 0x24, 0xe, 0x3, 0xa0, 0xd, 0x0, 0xe0, 0x0, - 0x0, 0xe, 0x3, 0xa0, 0xd, 0x0, 0xe0, 0x0, - 0x0, 0xe, 0x4, 0xc6, 0x6c, 0x0, 0xe0, 0x0, - 0x0, 0xe, 0x3, 0x60, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xe, 0x0, 0x0, 0x1, 0x6b, 0xd0, 0x0, - 0x0, 0x7, 0x0, 0x0, 0x0, 0x6, 0x30, 0x0, - - /* U+83D3 "菓" */ - 0x0, 0x0, 0xb, 0x10, 0x3, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x3b, 0x1, 0x90, 0x8, - 0x66, 0x6e, 0x66, 0x67, 0xc6, 0x67, 0x30, 0x0, - 0x0, 0xb0, 0x0, 0x29, 0x20, 0x0, 0x0, 0xc, - 0x66, 0x6a, 0x66, 0x6c, 0x70, 0x0, 0x0, 0xc0, - 0x0, 0xe0, 0x0, 0xb3, 0x0, 0x0, 0xc, 0x66, - 0x6e, 0x66, 0x6c, 0x30, 0x0, 0x0, 0xc0, 0x0, - 0xe0, 0x0, 0xb3, 0x0, 0x0, 0xa, 0x66, 0x6e, - 0x66, 0x69, 0x20, 0x0, 0x26, 0x66, 0x66, 0xe6, - 0x66, 0x6e, 0x70, 0x0, 0x10, 0x2, 0xce, 0x35, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xb1, 0xe0, 0x68, - 0x0, 0x0, 0x0, 0x6, 0x80, 0xe, 0x0, 0x6d, - 0x61, 0x0, 0x46, 0x20, 0x0, 0xe0, 0x0, 0x3c, - 0xe3, 0x10, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x0, - - /* U+83DC "菜" */ - 0x0, 0x0, 0xa, 0x30, 0xb, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xb2, 0x0, 0xe0, 0x1, 0xb2, 0x27, - 0x66, 0x6d, 0x76, 0x6e, 0x66, 0x66, 0x40, 0x0, - 0x0, 0x81, 0x0, 0x95, 0xa5, 0x0, 0x0, 0x35, - 0x56, 0x78, 0x98, 0x65, 0x30, 0x0, 0x0, 0x10, - 0x2, 0x70, 0x0, 0xa4, 0x0, 0x0, 0x7, 0x80, - 0x7, 0x70, 0x2c, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x62, 0x9, 0x10, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x42, 0x10, 0x1c, 0x23, 0x76, 0x66, 0x6e, 0xe9, - 0x76, 0x66, 0x64, 0x0, 0x0, 0x9, 0x6c, 0x18, - 0x0, 0x0, 0x0, 0x0, 0x9, 0x60, 0xc1, 0x1b, - 0x20, 0x0, 0x0, 0x29, 0x30, 0xc, 0x10, 0x2c, - 0xa4, 0x10, 0x56, 0x0, 0x0, 0xd1, 0x0, 0x7, - 0xe5, 0x20, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, - 0x0, - - /* U+843D "落" */ - 0x0, 0x0, 0x9, 0x20, 0xa, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0xc, 0x0, 0x6, 0x90, - 0x7, 0x66, 0x6e, 0x66, 0x6d, 0x66, 0x66, 0x61, - 0x0, 0x72, 0x6, 0x3, 0x94, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0x2, 0x9, 0x86, 0x67, 0x80, 0x0, - 0x0, 0x3, 0x4, 0x19, 0x50, 0xc, 0x30, 0x0, - 0x9, 0x30, 0x50, 0x81, 0x53, 0xa4, 0x0, 0x0, - 0x2, 0xb0, 0x73, 0x30, 0x1f, 0x90, 0x0, 0x0, - 0x0, 0x5, 0x40, 0x1, 0xb3, 0x7b, 0x40, 0x0, - 0x0, 0xb, 0x0, 0x5a, 0x10, 0x2, 0xde, 0xa2, - 0x5, 0xaa, 0x25, 0x4c, 0x66, 0x67, 0xd2, 0x30, - 0x0, 0x97, 0x0, 0x2a, 0x0, 0x1, 0xb0, 0x0, - 0x0, 0x97, 0x0, 0x2a, 0x0, 0x1, 0xb0, 0x0, - 0x0, 0x86, 0x0, 0x2c, 0x66, 0x66, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x20, 0x0, - - /* U+8449 "葉" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x20, 0x1, 0xc0, 0x1, 0x0, - 0x6, 0x66, 0x6c, 0x66, 0x66, 0xd6, 0x6d, 0xa0, - 0x0, 0x0, 0xa, 0x0, 0x0, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xb1, 0x84, 0x0, 0x71, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0xa3, 0x0, 0xd0, 0x25, 0x0, - 0x1, 0x76, 0xe6, 0xc7, 0x66, 0xe6, 0x66, 0x0, - 0x0, 0x0, 0xd0, 0xa5, 0x44, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x52, 0x22, 0x70, 0x60, 0x0, - 0x0, 0x1, 0xb6, 0x6b, 0x96, 0x66, 0x61, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x2b, 0x0, - 0x3, 0x66, 0x66, 0xef, 0xa9, 0x66, 0x66, 0x20, - 0x0, 0x0, 0xb, 0x8a, 0x54, 0x60, 0x0, 0x0, - 0x0, 0x3, 0xb4, 0xa, 0x50, 0x4b, 0x50, 0x0, - 0x3, 0x65, 0x0, 0xa, 0x60, 0x1, 0xaf, 0x80, - 0x1, 0x0, 0x0, 0x6, 0x20, 0x0, 0x2, 0x0, - - /* U+8457 "著" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x50, 0xa, 0x60, 0x1, 0x0, - 0x3, 0x66, 0x6b, 0x86, 0x6c, 0x76, 0x6f, 0x60, - 0x0, 0x10, 0x9, 0x31, 0xa, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x1c, 0x35, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x8, 0x5, 0xd2, 0x0, - 0x0, 0x3, 0x76, 0x6e, 0x66, 0x8d, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x7, 0xb1, 0x7, 0x50, - 0x4, 0x76, 0x66, 0x66, 0xe8, 0x66, 0x66, 0x50, - 0x0, 0x0, 0x0, 0x3a, 0x30, 0x0, 0x30, 0x0, - 0x0, 0x0, 0x1e, 0x96, 0x66, 0x67, 0xd0, 0x0, - 0x0, 0x17, 0x8d, 0x0, 0x0, 0x2, 0xa0, 0x0, - 0x5, 0x40, 0xd, 0x66, 0x66, 0x67, 0xa0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x2, 0xa0, 0x0, - 0x0, 0x0, 0xe, 0x66, 0x66, 0x67, 0xb0, 0x0, - 0x0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x30, 0x0, - - /* U+8535 "蔵" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x50, 0x6, 0x70, 0x1, 0x0, - 0x4, 0x66, 0x6c, 0x76, 0x69, 0xa6, 0x6e, 0xa0, - 0x1, 0x10, 0xa, 0x20, 0x6, 0x72, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x0, 0x4, 0x38, 0x70, 0x0, - 0x0, 0x13, 0x0, 0x0, 0x4, 0xb0, 0x4a, 0x20, - 0x0, 0x3c, 0x66, 0x66, 0x67, 0xc6, 0x66, 0x40, - 0x0, 0x3a, 0x86, 0x87, 0xa2, 0xb0, 0x5, 0x0, - 0x0, 0x29, 0x81, 0x92, 0x10, 0xc0, 0x1f, 0x20, - 0x0, 0x39, 0x86, 0x86, 0xd2, 0xc0, 0x78, 0x0, - 0x0, 0x48, 0x81, 0x0, 0xc0, 0x94, 0xd1, 0x0, - 0x0, 0x66, 0x86, 0x96, 0xa0, 0x5e, 0x60, 0x0, - 0x0, 0x92, 0x81, 0x92, 0x40, 0x6f, 0x20, 0x60, - 0x0, 0x90, 0x86, 0x76, 0x88, 0x73, 0xd3, 0x80, - 0x5, 0x10, 0x0, 0x1, 0x73, 0x0, 0x3e, 0x90, - 0x2, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x40, - - /* U+8584 "薄" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xb0, 0x3, 0xb0, 0x0, 0x0, 0x16, - 0x66, 0x7c, 0x66, 0x7c, 0x66, 0xca, 0x0, 0x40, - 0x2, 0xa0, 0x3, 0x87, 0x30, 0x0, 0x5, 0xa0, - 0x0, 0x0, 0xb3, 0x19, 0x51, 0x0, 0x9, 0x3, - 0x76, 0x6d, 0x66, 0x67, 0x50, 0x30, 0x2, 0x28, - 0x66, 0xd6, 0x69, 0x70, 0x1, 0xd1, 0x60, 0xa1, - 0xc, 0x10, 0x76, 0x0, 0x6, 0x16, 0xa, 0x76, - 0xd6, 0x6a, 0x60, 0x0, 0x7, 0x10, 0xa7, 0x6d, - 0x66, 0xa6, 0x0, 0x2, 0xa0, 0x8, 0x10, 0x90, - 0x55, 0x20, 0x4, 0xc8, 0x27, 0x66, 0x66, 0x6c, - 0x89, 0xa0, 0x6, 0x70, 0x2, 0x81, 0x0, 0xb2, - 0x0, 0x0, 0x97, 0x0, 0x5, 0x70, 0xb, 0x20, - 0x0, 0x9, 0x80, 0x0, 0x0, 0x5a, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, - - /* U+85AC "薬" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0x40, 0xa, 0x40, 0x1, 0x0, - 0x6, 0x66, 0x6c, 0x76, 0x6d, 0x66, 0x6d, 0x90, - 0x1, 0x0, 0xa, 0x13, 0xb, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x76, 0x8, 0x78, 0x69, 0x60, 0x29, 0x0, - 0x0, 0xa, 0x4c, 0x0, 0x8, 0x36, 0xa4, 0x0, - 0x0, 0x0, 0x1c, 0x66, 0x6b, 0x61, 0x0, 0x0, - 0x1, 0x58, 0x5c, 0x0, 0x8, 0x47, 0x93, 0x0, - 0x9, 0x60, 0xc, 0x66, 0x6b, 0x40, 0x3e, 0x0, - 0x0, 0x0, 0x4, 0x7, 0x33, 0x0, 0x5, 0x0, - 0x7, 0x66, 0x66, 0x9d, 0x96, 0x66, 0x8c, 0x50, - 0x0, 0x0, 0x7, 0xba, 0x56, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xa7, 0x9, 0x30, 0x98, 0x20, 0x0, - 0x2, 0x66, 0x10, 0x9, 0x40, 0x5, 0xdf, 0x70, - 0x11, 0x0, 0x0, 0x5, 0x10, 0x0, 0x2, 0x0, - - /* U+85DD "藝" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x60, 0x2, 0xb0, 0x1, 0x20, - 0x7, 0x66, 0x6b, 0x86, 0x67, 0xc6, 0x6b, 0xa0, - 0x0, 0x0, 0x26, 0x20, 0x1, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xb2, 0x40, 0x0, 0xb1, 0x0, 0x0, - 0x0, 0x76, 0xc6, 0x65, 0x56, 0xd6, 0xc1, 0x0, - 0x4, 0x76, 0xa6, 0x7b, 0x20, 0xb0, 0xd0, 0x0, - 0x0, 0x95, 0xa2, 0x76, 0x5, 0xb0, 0xd0, 0x0, - 0x6, 0x37, 0xd6, 0x77, 0x8, 0x99, 0xc1, 0x20, - 0x0, 0x0, 0xb3, 0x51, 0x46, 0x3, 0x7a, 0x60, - 0x0, 0xca, 0x73, 0x13, 0x31, 0x47, 0x9, 0x60, - 0x0, 0x1, 0x75, 0x55, 0x55, 0x54, 0x63, 0x0, - 0x2, 0x86, 0x66, 0x9b, 0x66, 0x66, 0x77, 0x0, - 0x0, 0x0, 0x6, 0x93, 0x2, 0x85, 0x0, 0x0, - 0x0, 0x6, 0xeb, 0xa9, 0x76, 0x5b, 0x80, 0x0, - 0x0, 0x2, 0x52, 0x0, 0x0, 0x0, 0x20, 0x0, - - /* U+8607 "蘇" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x20, 0x3, 0x90, 0x0, 0x0, - 0x5, 0x66, 0x6c, 0x66, 0x67, 0xb6, 0x6b, 0xa0, - 0x1, 0x0, 0xa, 0x0, 0x2, 0x90, 0x0, 0x0, - 0x0, 0x8, 0x72, 0x0, 0x0, 0x11, 0x67, 0x0, - 0x0, 0x1e, 0x69, 0x70, 0x46, 0x9c, 0x64, 0x0, - 0x0, 0xa3, 0x8, 0x10, 0x0, 0x28, 0x0, 0x0, - 0x6, 0xd5, 0xa6, 0xc3, 0x56, 0x7b, 0x6c, 0x40, - 0x1, 0xb0, 0xb0, 0xb0, 0x22, 0xfd, 0x0, 0x0, - 0x0, 0xb6, 0xc6, 0xc0, 0x6, 0x99, 0x60, 0x0, - 0x0, 0xb0, 0xb0, 0xb0, 0xb, 0x38, 0x91, 0x0, - 0x0, 0xb6, 0xc6, 0xc0, 0x64, 0x28, 0x3b, 0x0, - 0x0, 0x30, 0x0, 0x32, 0x50, 0x28, 0x9, 0xb0, - 0x0, 0x57, 0x46, 0xa4, 0x0, 0x39, 0x0, 0x0, - 0x9, 0x68, 0x3a, 0x43, 0x0, 0x39, 0x0, 0x0, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, - - /* U+8655 "處" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x66, 0x69, 0xb0, 0x0, - 0x0, 0x30, 0x0, 0xd, 0x0, 0x0, 0x3, 0x20, - 0x0, 0x99, 0x66, 0x6c, 0x66, 0x66, 0x6c, 0x80, - 0x0, 0x94, 0x0, 0xe, 0x22, 0x4a, 0x26, 0x0, - 0x0, 0x86, 0x87, 0x7e, 0x53, 0x20, 0x4, 0x0, - 0x0, 0x84, 0x0, 0xd, 0x0, 0x0, 0x58, 0x0, - 0x0, 0x93, 0x9, 0x16, 0x9a, 0xaa, 0x94, 0x0, - 0x0, 0xa2, 0x3e, 0x66, 0x95, 0x75, 0xa0, 0x0, - 0x0, 0xb0, 0x93, 0x6, 0x86, 0x50, 0xc0, 0x10, - 0x0, 0xb2, 0x67, 0x1c, 0x9, 0x20, 0xc0, 0x60, - 0x2, 0x75, 0x3, 0xe5, 0x17, 0x0, 0xc9, 0xd0, - 0x6, 0x0, 0x1a, 0x6b, 0xa4, 0x20, 0x0, 0x0, - 0x23, 0x4, 0x71, 0x0, 0x38, 0xce, 0xff, 0xb1, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+884C "行" */ - 0x0, 0x6, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xd3, 0x2, 0x66, 0x66, 0x6e, 0x40, 0x0, - 0xa3, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x63, - 0x8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x21, 0x3, - 0xd2, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0xc3, - 0x37, 0x66, 0x68, 0x67, 0xb3, 0x0, 0x9d, 0x0, - 0x0, 0x2, 0xb0, 0x0, 0x0, 0x66, 0xe0, 0x0, - 0x0, 0x2b, 0x0, 0x0, 0x45, 0xd, 0x0, 0x0, - 0x2, 0xb0, 0x0, 0x1, 0x0, 0xd0, 0x0, 0x0, - 0x2b, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x2, - 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x2b, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x3, 0x26, 0xa0, - 0x0, 0x0, 0x0, 0xd0, 0x0, 0x3a, 0xf7, 0x0, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x4, 0x0, 0x0, - 0x0, - - /* U+8853 "術" */ - 0x0, 0x7, 0x50, 0x9, 0x20, 0x0, 0x0, 0x10, - 0x0, 0xc, 0x10, 0xd, 0x31, 0x4, 0x76, 0xb1, - 0x0, 0x83, 0x0, 0xd, 0xc, 0x20, 0x0, 0x0, - 0x3, 0x41, 0xb0, 0xd, 0x5, 0x10, 0x0, 0x0, - 0x2, 0x9, 0x84, 0x4d, 0x4a, 0x20, 0x0, 0x51, - 0x0, 0x2d, 0x3, 0x9f, 0x22, 0x17, 0x6e, 0x63, - 0x0, 0xae, 0x10, 0xbe, 0x30, 0x0, 0xd, 0x0, - 0x6, 0x2d, 0x0, 0xbd, 0x69, 0x0, 0xd, 0x0, - 0x1, 0xd, 0x4, 0x6d, 0xa, 0x50, 0xd, 0x0, - 0x0, 0xd, 0x8, 0xd, 0x1, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x16, 0xd, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x50, 0xd, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x18, 0xdb, 0x0, - 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x40, 0x0, - - /* U+8868 "表" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x26, 0x0, - 0x0, 0x76, 0x66, 0x6d, 0x66, 0x66, 0x77, 0x10, - 0x0, 0x0, 0x0, 0xc, 0x10, 0x1, 0x40, 0x0, - 0x0, 0x6, 0x66, 0x6d, 0x66, 0x67, 0x81, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x3, 0x10, - 0x6, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x6b, 0x90, - 0x0, 0x0, 0x0, 0xb8, 0x50, 0x1, 0xa0, 0x0, - 0x0, 0x0, 0x9, 0x90, 0x90, 0x1b, 0x50, 0x0, - 0x0, 0x0, 0xae, 0x0, 0x39, 0x70, 0x0, 0x0, - 0x0, 0x2a, 0x6d, 0x0, 0x9, 0x50, 0x0, 0x0, - 0x16, 0x50, 0x1d, 0x0, 0x20, 0xa8, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x38, 0x40, 0x7, 0xfa, 0x71, - 0x0, 0x0, 0x3f, 0x90, 0x0, 0x0, 0x29, 0x40, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+88AB "被" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x38, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, - 0x0, 0xa, 0x50, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x1, 0x11, 0x3, 0x0, 0xd0, 0x2, 0x20, - 0x6, 0x76, 0xba, 0xe, 0x66, 0xe6, 0x6c, 0xa0, - 0x0, 0x0, 0xd1, 0xd, 0x0, 0xd0, 0x17, 0x0, - 0x0, 0x6, 0x74, 0x1d, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xe, 0x1c, 0x2e, 0x66, 0xe6, 0x78, 0x0, - 0x0, 0x8e, 0x71, 0x1c, 0x31, 0x0, 0x88, 0x0, - 0x5, 0x3d, 0x77, 0x2a, 0x6, 0x0, 0xd1, 0x0, - 0x12, 0xd, 0xd, 0x48, 0x8, 0x16, 0x80, 0x0, - 0x0, 0xd, 0x1, 0x74, 0x1, 0xbc, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xb0, 0x2, 0xd9, 0x0, 0x0, - 0x0, 0xd, 0x4, 0x60, 0x4a, 0x16, 0xc4, 0x0, - 0x0, 0xd, 0x18, 0x27, 0x50, 0x0, 0x4d, 0xb1, - 0x0, 0x2, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+88CF "裏" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x36, 0x66, - 0x66, 0x6d, 0x66, 0x66, 0xc5, 0x0, 0x12, 0x0, - 0x0, 0x0, 0x5, 0x0, 0x0, 0x2c, 0x66, 0x6d, - 0x66, 0x6e, 0x0, 0x0, 0x2c, 0x66, 0x6d, 0x66, - 0x6d, 0x0, 0x0, 0x2a, 0x0, 0x1c, 0x0, 0xd, - 0x0, 0x0, 0x28, 0x66, 0x6d, 0x66, 0x66, 0x0, - 0x0, 0x76, 0x66, 0x6d, 0x66, 0x6b, 0x40, 0x0, - 0x0, 0x0, 0x1c, 0x0, 0x0, 0x53, 0x28, 0x66, - 0x66, 0xf9, 0x66, 0x69, 0x64, 0x0, 0x0, 0x2c, - 0x67, 0x0, 0x6c, 0x30, 0x0, 0x18, 0xd7, 0x1, - 0xa8, 0x40, 0x0, 0x16, 0x71, 0x77, 0x5, 0x49, - 0xb7, 0x42, 0x0, 0x0, 0x9d, 0x92, 0x0, 0x28, - 0xc4, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, - - /* U+88DC "補" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x19, 0x0, 0x0, 0x0, 0xb4, 0x20, 0x0, - 0x0, 0x6, 0xa0, 0x0, 0x0, 0xd0, 0xb4, 0x0, - 0x0, 0x0, 0x50, 0x0, 0x0, 0xd0, 0x38, 0x10, - 0x7, 0x66, 0xc8, 0x76, 0x66, 0xe6, 0x69, 0x70, - 0x0, 0x0, 0xd0, 0x2, 0x0, 0xd0, 0x4, 0x0, - 0x0, 0x6, 0x82, 0xe, 0x66, 0xe6, 0x6e, 0x20, - 0x0, 0xe, 0x1b, 0x4d, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0x9e, 0x56, 0xd, 0x66, 0xe6, 0x6d, 0x0, - 0x5, 0x4c, 0x95, 0xd, 0x0, 0xd0, 0xd, 0x0, - 0x33, 0xc, 0x1e, 0x2d, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0xc, 0x4, 0xd, 0x66, 0xe6, 0x6d, 0x0, - 0x0, 0xc, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0xc, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0xd, 0x10, 0xd, 0x0, 0xc3, 0x9c, 0x0, - 0x0, 0x4, 0x0, 0x6, 0x0, 0x20, 0x32, 0x0, - - /* U+88E1 "裡" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xa0, 0xb, 0x66, 0x66, 0x6d, 0x10, - 0x0, 0x0, 0x50, 0xc, 0x0, 0xd0, 0xc, 0x0, - 0x7, 0x66, 0xc9, 0xc, 0x0, 0xd0, 0xc, 0x0, - 0x0, 0x0, 0xe0, 0xd, 0x66, 0xe6, 0x6c, 0x0, - 0x0, 0x7, 0x82, 0xc, 0x0, 0xd0, 0xc, 0x0, - 0x0, 0x1e, 0x1b, 0x4c, 0x0, 0xd0, 0xc, 0x0, - 0x0, 0x9e, 0x56, 0xd, 0x66, 0xe6, 0x6c, 0x0, - 0x6, 0x3c, 0x95, 0xa, 0x0, 0xd0, 0x4, 0x0, - 0x33, 0xc, 0xe, 0x30, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xc, 0x4, 0x37, 0x66, 0xe6, 0x6d, 0x20, - 0x0, 0xc, 0x0, 0x1, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x10, - 0x0, 0xd, 0x13, 0x66, 0x66, 0xe6, 0x6a, 0xc0, - 0x0, 0x4, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+88FD "製" */ - 0x0, 0x18, 0xb, 0x10, 0x0, 0x0, 0x6, 0x0, - 0x0, 0x85, 0xc, 0x2, 0x50, 0x0, 0xd, 0x0, - 0x3, 0x86, 0x6d, 0x66, 0x60, 0xb3, 0xc, 0x0, - 0x6, 0x75, 0x5d, 0x56, 0xb2, 0xd0, 0xc, 0x0, - 0x0, 0x76, 0x6d, 0x66, 0x80, 0xd0, 0xc, 0x0, - 0x0, 0xc0, 0xc, 0x2, 0x90, 0xd0, 0xc, 0x0, - 0x0, 0xc0, 0xc, 0x37, 0x80, 0x20, 0xc, 0x0, - 0x0, 0xb0, 0xd, 0x9, 0x20, 0x6, 0xca, 0x0, - 0x0, 0x0, 0x3, 0x4, 0xa0, 0x0, 0x38, 0x0, - 0x6, 0x76, 0x66, 0xc7, 0x96, 0x66, 0x89, 0x50, - 0x0, 0x0, 0x2c, 0x40, 0x42, 0x6, 0xc1, 0x0, - 0x0, 0x18, 0x9d, 0x0, 0x6, 0x76, 0x0, 0x0, - 0x15, 0x50, 0xd, 0x16, 0x60, 0x8a, 0x40, 0x0, - 0x0, 0x0, 0xf, 0xb2, 0x0, 0x3, 0xbf, 0x70, - 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8907 "複" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x36, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x60, 0x0, 0xe1, 0x0, 0x3, 0x40, - 0x0, 0x2, 0x40, 0x4, 0xb6, 0x66, 0x66, 0x60, - 0x6, 0x55, 0xc7, 0xa, 0xa6, 0x66, 0x6a, 0x10, - 0x0, 0x1, 0xe0, 0x43, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0x7, 0x72, 0x30, 0xd6, 0x66, 0x6d, 0x0, - 0x0, 0x1e, 0xb, 0x40, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0x9d, 0x45, 0x0, 0xda, 0x86, 0x6b, 0x0, - 0x5, 0x4c, 0xa4, 0x0, 0x1c, 0x0, 0x13, 0x0, - 0x13, 0xc, 0xd, 0x20, 0x9a, 0x66, 0xba, 0x0, - 0x0, 0xc, 0x2, 0x6, 0x45, 0x11, 0xc0, 0x0, - 0x0, 0xc, 0x0, 0x21, 0x0, 0x9c, 0x20, 0x0, - 0x0, 0xc, 0x0, 0x0, 0x5, 0xcb, 0x30, 0x0, - 0x0, 0xd, 0x0, 0x16, 0x85, 0x2, 0xbc, 0x81, - 0x0, 0x3, 0x4, 0x30, 0x0, 0x0, 0x1, 0x10, - - /* U+897F "西" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x76, 0x66, 0x67, 0x66, 0x86, 0x66, 0xc5, 0x0, - 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3a, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x86, - 0x67, 0xc6, 0x6e, 0x66, 0x6c, 0x0, 0xd, 0x0, - 0x39, 0x0, 0xd0, 0x1, 0xb0, 0x0, 0xd0, 0x5, - 0x80, 0xd, 0x0, 0x1b, 0x0, 0xd, 0x0, 0x75, - 0x0, 0xd0, 0x1, 0xb0, 0x0, 0xd0, 0xb, 0x10, - 0xd, 0x0, 0x1b, 0x0, 0xd, 0x4, 0x60, 0x0, - 0xcc, 0xd4, 0xb0, 0x0, 0xd1, 0x70, 0x0, 0x0, - 0x0, 0x1b, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, - 0x1, 0xb0, 0x0, 0xd6, 0x66, 0x66, 0x66, 0x66, - 0x6c, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xa0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+8981 "要" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x0, - 0x2, 0x76, 0x66, 0xc6, 0x6c, 0x66, 0x68, 0x40, - 0x0, 0x0, 0x0, 0xd0, 0xd, 0x0, 0x10, 0x0, - 0x0, 0xd, 0x66, 0xe6, 0x6e, 0x66, 0xe3, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xe, 0x66, 0x96, 0x66, 0x66, 0xc0, 0x0, - 0x0, 0x1, 0x0, 0xd5, 0x0, 0x0, 0x1, 0x0, - 0x6, 0x66, 0x68, 0xd6, 0x66, 0x66, 0x6d, 0xa0, - 0x0, 0x0, 0xc, 0x20, 0x2, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x89, 0x10, 0xb, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x68, 0xdd, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5b, 0x63, 0x9e, 0xa1, 0x0, - 0x0, 0x25, 0x88, 0x50, 0x0, 0x0, 0x8b, 0x0, - 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+898B "見" */ - 0x0, 0x3, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, - 0x0, 0xb, 0x86, 0x66, 0x66, 0x6e, 0x40, 0x0, - 0x0, 0xa, 0x30, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xa, 0x86, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0xa, 0x30, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xa, 0x86, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0xa, 0x30, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xa, 0x30, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0xa, 0x87, 0xa6, 0x6a, 0x6f, 0x0, 0x0, - 0x0, 0x8, 0x13, 0xb0, 0x1d, 0x5, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x90, 0x1d, 0x0, 0x0, 0x40, - 0x0, 0x0, 0xb, 0x40, 0x1d, 0x0, 0x0, 0x60, - 0x0, 0x0, 0x7a, 0x0, 0x1d, 0x0, 0x3, 0x90, - 0x0, 0x48, 0x60, 0x0, 0xd, 0xcc, 0xce, 0xb0, - 0x24, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+898F "規" */ - 0x0, 0x9, 0x30, 0x2, 0x0, 0x0, 0x5, 0x0, - 0x0, 0xb, 0x10, 0xe, 0x66, 0x66, 0x6e, 0x10, - 0x0, 0xb, 0x10, 0xd, 0x0, 0x0, 0xd, 0x0, - 0x5, 0x6d, 0x7b, 0x1d, 0x66, 0x66, 0x6d, 0x0, - 0x1, 0xb, 0x10, 0xd, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xb, 0x10, 0xd, 0x33, 0x33, 0x3d, 0x0, - 0x26, 0x6d, 0x6a, 0x7d, 0x22, 0x22, 0x2d, 0x0, - 0x2, 0xc, 0x10, 0xd, 0x0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x10, 0xe, 0x6b, 0x6a, 0x6d, 0x0, - 0x0, 0xd, 0x74, 0x6, 0x1d, 0xd, 0x2, 0x0, - 0x0, 0x29, 0xa, 0x70, 0x3b, 0xd, 0x0, 0x0, - 0x0, 0x82, 0x1, 0x90, 0x86, 0xd, 0x0, 0x40, - 0x2, 0x70, 0x0, 0x3, 0xa0, 0xd, 0x0, 0x80, - 0x16, 0x0, 0x0, 0x66, 0x0, 0xd, 0xcc, 0xd1, - 0x10, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8996 "視" */ - 0x0, 0x8, 0x0, 0x3, 0x0, 0x0, 0x5, 0x0, - 0x0, 0x5, 0xb0, 0xe, 0x66, 0x66, 0x6e, 0x0, - 0x0, 0x0, 0x71, 0xd, 0x0, 0x0, 0xd, 0x0, - 0x7, 0x66, 0xab, 0xd, 0x66, 0x66, 0x6d, 0x0, - 0x0, 0x0, 0xc2, 0xd, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x6, 0x70, 0xd, 0x66, 0x66, 0x6d, 0x0, - 0x0, 0x2f, 0x30, 0xd, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x9c, 0x88, 0xd, 0x0, 0x0, 0xd, 0x0, - 0x7, 0x1b, 0x1b, 0x5e, 0x6b, 0x6a, 0x6d, 0x0, - 0x20, 0xb, 0x11, 0x15, 0x1d, 0xd, 0x2, 0x0, - 0x0, 0xb, 0x10, 0x0, 0x4a, 0xd, 0x0, 0x0, - 0x0, 0xb, 0x10, 0x0, 0xa4, 0xd, 0x0, 0x40, - 0x0, 0xb, 0x10, 0x5, 0x80, 0xd, 0x0, 0x70, - 0x0, 0xc, 0x11, 0x65, 0x0, 0xd, 0xcc, 0xc0, - 0x0, 0x2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+899A "覚" */ - 0x0, 0x2, 0x0, 0x26, 0x0, 0x7, 0x40, 0x0, - 0x0, 0x0, 0xc3, 0xa, 0x60, 0xc, 0x30, 0x0, - 0x0, 0x30, 0x57, 0x3, 0x50, 0x54, 0x2, 0x10, - 0x2, 0xa6, 0x66, 0x66, 0x66, 0x76, 0x6b, 0xb0, - 0xc, 0x50, 0x10, 0x0, 0x0, 0x3, 0x9, 0x0, - 0x5, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x40, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0xb8, 0x6c, 0x6d, 0x0, 0x0, - 0x0, 0x0, 0x10, 0xe1, 0xd, 0x0, 0x0, 0x50, - 0x0, 0x0, 0x9, 0x80, 0xd, 0x0, 0x2, 0x70, - 0x0, 0x26, 0x84, 0x0, 0xd, 0xcc, 0xce, 0xa0, - 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+89AA "親" */ - 0x0, 0x4, 0x50, 0x0, 0x20, 0x0, 0x3, 0x0, - 0x0, 0x0, 0xc2, 0x31, 0xc6, 0x66, 0x6b, 0x50, - 0x3, 0x86, 0x78, 0xa4, 0xb0, 0x0, 0x9, 0x10, - 0x0, 0x54, 0x6, 0x70, 0xb6, 0x66, 0x6b, 0x10, - 0x0, 0xd, 0x7, 0x0, 0xb0, 0x0, 0x9, 0x10, - 0x7, 0x67, 0x88, 0x79, 0xb6, 0x66, 0x6b, 0x10, - 0x0, 0x0, 0xc0, 0x0, 0xb0, 0x0, 0x9, 0x10, - 0x0, 0x0, 0xc0, 0x40, 0xb0, 0x0, 0x9, 0x20, - 0x3, 0x76, 0xd6, 0x73, 0xb7, 0xa6, 0xab, 0x20, - 0x0, 0x30, 0xc1, 0x0, 0x54, 0x81, 0xa2, 0x0, - 0x0, 0xb5, 0xc2, 0x80, 0x6, 0x61, 0xa0, 0x0, - 0x3, 0x70, 0xc0, 0x79, 0xa, 0x21, 0xa0, 0x40, - 0x7, 0x10, 0xc0, 0x6, 0x39, 0x1, 0xa0, 0x70, - 0x0, 0x3c, 0xb0, 0x4, 0x60, 0x0, 0xcb, 0xe2, - 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, - - /* U+89BA "覺" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x23, 0x8a, 0x13, 0x49, 0x46, 0x96, 0x0, - 0x0, 0x3b, 0x0, 0x7, 0xc7, 0x10, 0x84, 0x0, - 0x0, 0x1c, 0x69, 0x31, 0x4, 0x37, 0xc2, 0x0, - 0x0, 0xb, 0x4, 0x6, 0x8a, 0x0, 0xb1, 0x0, - 0x0, 0xd, 0x65, 0x36, 0x98, 0x27, 0xd0, 0x0, - 0x5, 0x7b, 0x66, 0x66, 0x67, 0x66, 0xb8, 0xb0, - 0x1e, 0x10, 0x74, 0x44, 0x44, 0x48, 0x18, 0x10, - 0x2, 0x0, 0xd2, 0x22, 0x22, 0x2c, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, - 0x0, 0x0, 0x50, 0xc1, 0xb, 0x4, 0x0, 0x50, - 0x0, 0x0, 0x8, 0x70, 0xb, 0x0, 0x0, 0x80, - 0x0, 0x15, 0x74, 0x0, 0xd, 0xbb, 0xbc, 0xd0, - 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+89C0 "觀" */ - 0x0, 0x47, 0x9, 0x10, 0x20, 0x0, 0x3, 0x0, - 0x0, 0x57, 0xc, 0x33, 0xc6, 0x66, 0x6c, 0x40, - 0x7, 0x9a, 0x6d, 0x64, 0xc0, 0x0, 0xa, 0x0, - 0x2, 0x36, 0x25, 0x12, 0xc6, 0x66, 0x6c, 0x0, - 0xb, 0x6c, 0x6a, 0x97, 0xc0, 0x0, 0xa, 0x0, - 0xb, 0x5c, 0x4a, 0x85, 0xc6, 0x66, 0x6c, 0x0, - 0x4, 0x74, 0x80, 0x0, 0xc0, 0x0, 0xa, 0x0, - 0x0, 0xc1, 0x72, 0x30, 0xc0, 0x0, 0xa, 0x10, - 0x7, 0xb6, 0xa6, 0x83, 0xc7, 0xa7, 0xac, 0x10, - 0x19, 0xb6, 0xc6, 0x91, 0x44, 0x82, 0x92, 0x0, - 0x3, 0x90, 0xb1, 0x0, 0x6, 0x62, 0x90, 0x0, - 0x3, 0xb6, 0xc6, 0xa1, 0xa, 0x22, 0x90, 0x40, - 0x3, 0x90, 0xb1, 0x40, 0x39, 0x2, 0x90, 0x70, - 0x3, 0xa6, 0x66, 0x67, 0x60, 0x0, 0xdb, 0xd1, - 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, - - /* U+89D2 "角" */ - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0x76, 0x67, 0xc1, 0x0, 0x0, 0x0, - 0x9, 0x70, 0x0, 0x89, 0x10, 0x0, 0x0, 0x4, - 0xc0, 0x0, 0x8, 0x0, 0x2, 0x0, 0x2, 0xcd, - 0x66, 0x6b, 0x66, 0x68, 0xe0, 0x3, 0x80, 0xd0, - 0x0, 0xe0, 0x0, 0x3a, 0x0, 0x10, 0xe, 0x66, - 0x6e, 0x66, 0x68, 0xa0, 0x0, 0x0, 0xd0, 0x0, - 0xe0, 0x0, 0x3a, 0x0, 0x0, 0xd, 0x0, 0xe, - 0x0, 0x3, 0xa0, 0x0, 0x1, 0xd6, 0x66, 0xe6, - 0x66, 0x8a, 0x0, 0x0, 0x48, 0x0, 0xe, 0x0, - 0x3, 0xa0, 0x0, 0x9, 0x30, 0x0, 0xe0, 0x0, - 0x3a, 0x0, 0x3, 0xa0, 0x0, 0xe, 0x0, 0x3, - 0xa0, 0x2, 0x80, 0x0, 0x0, 0xe0, 0x49, 0xd9, - 0x0, 0x40, 0x0, 0x0, 0x1, 0x0, 0x7, 0x10, - - /* U+89E3 "解" */ - 0x0, 0x6, 0x60, 0x0, 0x0, 0x0, 0x2, 0x10, - 0x0, 0xc, 0x20, 0x0, 0x66, 0xd6, 0x6b, 0x60, - 0x0, 0x3c, 0x6c, 0x70, 0x3, 0xb0, 0x9, 0x30, - 0x0, 0xa2, 0xa, 0x0, 0xa, 0x40, 0xb, 0x20, - 0x4, 0xd6, 0x97, 0xa3, 0x58, 0x4, 0x9d, 0x0, - 0x15, 0xc0, 0xc0, 0xc3, 0x33, 0xa, 0x31, 0x0, - 0x0, 0xc1, 0xc1, 0xc0, 0xe, 0x2d, 0x0, 0x0, - 0x0, 0xd5, 0xd5, 0xd0, 0x6b, 0x6e, 0x6c, 0x30, - 0x0, 0xc0, 0xc0, 0xc0, 0xa0, 0xd, 0x0, 0x0, - 0x0, 0xd6, 0xd6, 0xd3, 0x10, 0xd, 0x0, 0x40, - 0x0, 0xb0, 0xc0, 0xc4, 0x76, 0x6e, 0x66, 0x81, - 0x2, 0x80, 0xc0, 0xc0, 0x0, 0xd, 0x0, 0x0, - 0x7, 0x20, 0xc0, 0xc0, 0x0, 0xd, 0x0, 0x0, - 0x7, 0x0, 0x56, 0xd0, 0x0, 0xe, 0x0, 0x0, - 0x20, 0x0, 0x0, 0x40, 0x0, 0x5, 0x0, 0x0, - - /* U+89E6 "触" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x80, 0x0, 0x0, 0x9, 0x10, 0x0, - 0x0, 0xc, 0x31, 0x0, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x3c, 0x6c, 0x80, 0x0, 0xc, 0x0, 0x0, - 0x0, 0xb2, 0xa, 0x0, 0x20, 0xc, 0x3, 0x0, - 0x6, 0xd6, 0x97, 0xc3, 0xb6, 0x6d, 0x6c, 0x40, - 0x14, 0xc0, 0xb0, 0xb0, 0xa1, 0xc, 0xa, 0x10, - 0x0, 0xc6, 0xc6, 0xd0, 0xa1, 0xc, 0xa, 0x10, - 0x0, 0xc0, 0xb0, 0xb0, 0xa1, 0xc, 0xa, 0x10, - 0x0, 0xc0, 0xb0, 0xb0, 0xb4, 0x3c, 0x3b, 0x10, - 0x0, 0xd6, 0xc6, 0xd0, 0x93, 0x3c, 0x37, 0x10, - 0x0, 0xb0, 0xb0, 0xb0, 0x0, 0xc, 0x11, 0x0, - 0x2, 0x80, 0xb0, 0xb0, 0x0, 0xc, 0x9, 0x10, - 0x7, 0x10, 0xb0, 0xb2, 0x45, 0x6d, 0x57, 0xb0, - 0x6, 0x0, 0x56, 0xe4, 0xb6, 0x30, 0x0, 0x90, - 0x10, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - - /* U+8A00 "言" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7a, 0x0, 0x0, 0x10, 0x36, 0x66, 0x66, - 0x78, 0x66, 0x67, 0xe3, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa2, 0x0, 0x0, 0x27, 0x66, 0x66, 0x66, 0x64, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, - 0x0, 0x37, 0x66, 0x66, 0x66, 0xa7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0x66, 0x66, 0x66, 0xd4, 0x0, 0x0, 0x1e, 0x0, - 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1e, 0x0, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0x1e, 0x66, 0x66, 0x66, - 0xe1, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0xd1, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, 0x0, - - /* U+8A08 "計" */ - 0x0, 0x5, 0x50, 0x0, 0x0, 0xb, 0x10, 0x0, - 0x0, 0x0, 0xd3, 0x1, 0x0, 0xe, 0x0, 0x0, - 0x6, 0x66, 0xb6, 0x8c, 0x10, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x1, 0x44, 0x44, 0xa0, 0x0, 0xd, 0x0, 0x30, - 0x0, 0x32, 0x22, 0x22, 0x86, 0x6e, 0x66, 0x94, - 0x0, 0x0, 0x0, 0x60, 0x0, 0xd, 0x0, 0x0, - 0x1, 0x76, 0x66, 0x73, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x10, 0x0, 0xd, 0x0, 0x0, - 0x3, 0xc6, 0x66, 0xe1, 0x0, 0xd, 0x0, 0x0, - 0x2, 0xa0, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, - 0x2, 0xa0, 0x0, 0xd0, 0x0, 0xe, 0x0, 0x0, - 0x2, 0xc6, 0x66, 0xd0, 0x0, 0xe, 0x0, 0x0, - 0x3, 0xa0, 0x0, 0xd0, 0x0, 0x1e, 0x0, 0x0, - 0x1, 0x20, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, - - /* U+8A0A "訊" */ - 0x0, 0x7, 0x30, 0x0, 0x0, 0x1, 0x50, 0x0, - 0x0, 0x2, 0xf0, 0x17, 0xd7, 0x68, 0xc0, 0x0, - 0x6, 0x66, 0xc6, 0xa4, 0xb2, 0x3, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb2, 0x3, 0x90, 0x0, - 0x1, 0x66, 0x68, 0x70, 0xb2, 0x3, 0x90, 0x0, - 0x0, 0x20, 0x0, 0x0, 0xb2, 0x3, 0x90, 0x0, - 0x0, 0x0, 0x4, 0x27, 0xd8, 0xc4, 0x90, 0x0, - 0x1, 0x76, 0x66, 0x40, 0xb2, 0x1, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x10, 0xb2, 0x0, 0xc0, 0x0, - 0x3, 0xc6, 0x68, 0xc0, 0xb2, 0x0, 0xd0, 0x0, - 0x2, 0xa0, 0x3, 0xa0, 0xb2, 0x0, 0xb2, 0x30, - 0x2, 0xa0, 0x3, 0xa0, 0xb2, 0x0, 0x68, 0x70, - 0x2, 0xc6, 0x67, 0xa0, 0xb2, 0x0, 0xd, 0xc0, - 0x3, 0xa0, 0x3, 0xa0, 0xb2, 0x0, 0x3, 0xe0, - 0x1, 0x20, 0x0, 0x0, 0x10, 0x0, 0x0, 0x10, - - /* U+8A0E "討" */ - 0x0, 0x6, 0x20, 0x0, 0x0, 0x1, 0xb1, 0x0, - 0x0, 0x1, 0xe1, 0x0, 0x0, 0x1, 0xe0, 0x0, - 0x6, 0x66, 0xc6, 0xa8, 0x0, 0x1, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x50, - 0x1, 0x66, 0x68, 0x94, 0x65, 0x56, 0xe6, 0x83, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, - 0x0, 0x0, 0x3, 0x11, 0x70, 0x1, 0xe0, 0x0, - 0x1, 0x76, 0x67, 0x50, 0x6a, 0x1, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x10, 0xe, 0x21, 0xe0, 0x0, - 0x3, 0xb6, 0x67, 0xd0, 0x3, 0x1, 0xe0, 0x0, - 0x2, 0xa0, 0x3, 0xa0, 0x0, 0x1, 0xe0, 0x0, - 0x2, 0xa0, 0x3, 0xa0, 0x0, 0x1, 0xe0, 0x0, - 0x2, 0xc6, 0x67, 0xa0, 0x2, 0x2, 0xe0, 0x0, - 0x3, 0xa0, 0x3, 0xa0, 0x3, 0xaf, 0xc0, 0x0, - 0x1, 0x20, 0x0, 0x10, 0x0, 0x6, 0x10, 0x0, - - /* U+8A13 "訓" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x30, 0x0, 0x74, 0x2, 0x0, 0xb0, - 0x0, 0x5, 0xc0, 0x10, 0xa4, 0xd, 0x20, 0xd0, - 0x6, 0x67, 0x86, 0x94, 0x93, 0xd, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0x10, 0x93, 0xd, 0x0, 0xd0, - 0x1, 0x76, 0x67, 0x70, 0x93, 0xd, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x93, 0xd, 0x0, 0xd0, - 0x0, 0x76, 0x69, 0x70, 0xa3, 0xd, 0x0, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0xb2, 0xd, 0x0, 0xd0, - 0x2, 0x86, 0x67, 0x90, 0xc0, 0xd, 0x0, 0xd0, - 0x3, 0xa0, 0x3, 0xa0, 0xc0, 0xd, 0x0, 0xd0, - 0x2, 0xa0, 0x3, 0xa3, 0x90, 0xd, 0x0, 0xd0, - 0x2, 0xa0, 0x3, 0xa9, 0x30, 0xd, 0x0, 0xd0, - 0x3, 0xc6, 0x67, 0xa8, 0x0, 0x8, 0x0, 0xd0, - 0x2, 0x40, 0x1, 0x80, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x10, - - /* U+8A18 "記" */ - 0x0, 0x8, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x6, 0xa0, 0x2, 0x76, 0x66, 0x6f, 0x30, - 0x7, 0x67, 0x96, 0xa5, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, - 0x1, 0x66, 0x66, 0xa0, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x85, 0x55, 0x5e, 0x0, - 0x0, 0x0, 0x3, 0x30, 0xc1, 0x0, 0x9, 0x0, - 0x1, 0x76, 0x66, 0x50, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x20, 0xc1, 0x0, 0x0, 0x0, - 0x3, 0xc6, 0x66, 0xe0, 0xc1, 0x0, 0x0, 0x0, - 0x2, 0xa0, 0x0, 0xd0, 0xc1, 0x0, 0x0, 0x40, - 0x2, 0xa0, 0x0, 0xd0, 0xc1, 0x0, 0x0, 0x70, - 0x2, 0xc6, 0x66, 0xd0, 0xc2, 0x0, 0x0, 0xc0, - 0x3, 0xa0, 0x0, 0xd0, 0x5d, 0xdd, 0xde, 0xc1, - 0x1, 0x20, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+8A2A "訪" */ - 0x0, 0x54, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, - 0x0, 0xe, 0x20, 0x0, 0x0, 0xa9, 0x0, 0x0, - 0x37, 0x6b, 0x69, 0x70, 0x0, 0x37, 0x1, 0x10, - 0x0, 0x0, 0x0, 0x7, 0x5b, 0x55, 0x58, 0x70, - 0x5, 0x66, 0x6a, 0x0, 0xf, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x0, 0x1e, 0x66, 0x6e, 0x20, - 0x5, 0x66, 0x66, 0x0, 0x2a, 0x0, 0xe, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x57, 0x0, 0xd, 0x0, - 0xb, 0x66, 0x6e, 0x10, 0x83, 0x0, 0xc, 0x0, - 0xb, 0x10, 0xd, 0x0, 0xb0, 0x0, 0x2b, 0x0, - 0xb, 0x10, 0xd, 0x4, 0x60, 0x0, 0x49, 0x0, - 0xb, 0x66, 0x6d, 0x9, 0x1, 0x30, 0x96, 0x0, - 0xc, 0x10, 0xc, 0x61, 0x0, 0x4e, 0xd0, 0x0, - 0x1, 0x0, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, - - /* U+8A2D "設" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x68, 0x0, 0x0, 0x96, 0x6b, 0x40, 0x0, - 0x0, 0xd, 0x22, 0x0, 0xe0, 0xb, 0x20, 0x0, - 0x37, 0x69, 0x69, 0x50, 0xd0, 0xb, 0x20, 0x0, - 0x0, 0x0, 0x1, 0x0, 0xc0, 0xb, 0x20, 0x0, - 0x6, 0x66, 0x69, 0x5, 0x70, 0xa, 0x42, 0x30, - 0x0, 0x0, 0x0, 0xa, 0x0, 0x4, 0xaa, 0x70, - 0x3, 0x66, 0x79, 0x56, 0x66, 0x66, 0xd4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x50, 0x3, 0xf5, 0x0, - 0x3, 0x0, 0x4, 0x0, 0x60, 0xa, 0x90, 0x0, - 0xb, 0x66, 0x6d, 0x0, 0x27, 0x3d, 0x0, 0x0, - 0xb, 0x10, 0x1c, 0x0, 0xa, 0xc2, 0x0, 0x0, - 0xb, 0x10, 0x1c, 0x0, 0xa, 0xc1, 0x0, 0x0, - 0xb, 0x66, 0x6c, 0x0, 0x93, 0x4d, 0x40, 0x0, - 0xb, 0x10, 0x8, 0x38, 0x10, 0x4, 0xec, 0x71, - 0x1, 0x0, 0x2, 0x20, 0x0, 0x0, 0x18, 0x10, - - /* U+8A31 "許" */ - 0x0, 0x46, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, - 0x0, 0xd5, 0x0, 0x7, 0x70, 0x0, 0x0, 0x27, - 0x6a, 0x77, 0x80, 0xb1, 0x0, 0x12, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0x6a, 0x67, 0x80, 0x4, 0x66, - 0x79, 0x7, 0x20, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x70, 0xc, 0x10, 0x0, 0x3, 0x66, 0x78, - 0x30, 0x0, 0xc1, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x22, 0x2d, 0x32, 0x95, 0x2, 0x0, 0x4, 0x5, - 0x33, 0xd4, 0x33, 0x30, 0xb6, 0x66, 0xe0, 0x0, - 0xc, 0x10, 0x0, 0xb, 0x10, 0x1c, 0x0, 0x0, - 0xc1, 0x0, 0x0, 0xb1, 0x1, 0xc0, 0x0, 0xc, - 0x10, 0x0, 0xb, 0x66, 0x6c, 0x0, 0x0, 0xd1, - 0x0, 0x0, 0xc1, 0x0, 0x90, 0x0, 0xd, 0x10, - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, - 0x0, - - /* U+8A33 "訳" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x1d, 0x1, 0x1a, 0x76, 0x66, 0x6e, 0x20, - 0x37, 0x67, 0x67, 0x5a, 0x30, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x2, 0xa, 0x30, 0x0, 0xd, 0x0, - 0x4, 0x76, 0x66, 0xa, 0x30, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x87, 0x66, 0x6e, 0x0, - 0x4, 0x66, 0x78, 0xa, 0x34, 0x20, 0x3, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x21, 0x60, 0x0, 0x0, - 0x8, 0x66, 0x6a, 0xb, 0x10, 0x90, 0x0, 0x0, - 0xc, 0x0, 0xd, 0xc, 0x0, 0xa1, 0x0, 0x0, - 0xc, 0x0, 0xd, 0xb, 0x0, 0x49, 0x0, 0x0, - 0xc, 0x0, 0xd, 0x47, 0x0, 0xc, 0x40, 0x0, - 0xc, 0x66, 0x6d, 0x91, 0x0, 0x2, 0xe3, 0x0, - 0x7, 0x0, 0x4, 0x60, 0x0, 0x0, 0x6f, 0x90, - 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x10, - - /* U+8A34 "訴" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x80, 0x0, 0x0, 0x0, 0x29, 0x60, 0x0, - 0xd, 0x30, 0x10, 0xa7, 0x99, 0x64, 0x2, 0x76, - 0x86, 0x77, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x37, 0x66, - 0x80, 0xe, 0x66, 0x66, 0xa8, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0xc, 0x20, 0x0, 0x37, 0x66, 0x90, - 0xd, 0x10, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xc0, 0x6e, 0x60, 0x0, 0x76, 0x66, 0xa1, 0x3a, - 0x0, 0xc9, 0xe3, 0xa, 0x20, 0xd, 0x5, 0x70, - 0xc, 0x25, 0x90, 0xa2, 0x0, 0xd0, 0xa2, 0x0, - 0xc2, 0x0, 0xa, 0x20, 0xd, 0x1b, 0x0, 0xc, - 0x20, 0x0, 0xa7, 0x66, 0xd8, 0x20, 0x0, 0xc2, - 0x0, 0x8, 0x10, 0x5, 0x50, 0x0, 0xc, 0x20, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x10, 0x0, - - /* U+8A55 "評" */ - 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, - 0x0, 0xd, 0x40, 0x4, 0x66, 0xd6, 0x66, 0x20, - 0x27, 0x6a, 0x79, 0x64, 0x0, 0xc1, 0x8, 0x20, - 0x0, 0x0, 0x0, 0x5, 0x90, 0xc1, 0x1e, 0x20, - 0x4, 0x66, 0x78, 0x0, 0xe3, 0xc1, 0x66, 0x0, - 0x1, 0x0, 0x0, 0x0, 0xa3, 0xc1, 0x80, 0x0, - 0x0, 0x0, 0x23, 0x0, 0x0, 0xc2, 0x11, 0x10, - 0x5, 0x66, 0x64, 0x27, 0x66, 0xd6, 0x6a, 0x90, - 0x1, 0x0, 0x2, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0xc, 0x66, 0x6e, 0x10, 0x0, 0xc1, 0x0, 0x0, - 0xb, 0x10, 0xd, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0xb, 0x10, 0xd, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0xb, 0x66, 0x6d, 0x0, 0x0, 0xd1, 0x0, 0x0, - 0xc, 0x10, 0xd, 0x0, 0x0, 0xd1, 0x0, 0x0, - 0x2, 0x0, 0x1, 0x0, 0x0, 0x20, 0x0, 0x0, - - /* U+8A66 "試" */ - 0x0, 0x53, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, - 0x0, 0xe2, 0x0, 0x0, 0xc, 0x19, 0x70, 0x26, - 0x6b, 0x68, 0x80, 0x0, 0xc1, 0xb, 0x0, 0x0, - 0x0, 0x4, 0x55, 0x5d, 0x55, 0xb4, 0x4, 0x66, - 0x78, 0x10, 0x0, 0xb1, 0x0, 0x0, 0x11, 0x0, - 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x12, - 0x24, 0x49, 0x94, 0x0, 0x0, 0x56, 0x66, 0x61, - 0x2d, 0x27, 0x60, 0x0, 0x0, 0x0, 0x1, 0x0, - 0xd0, 0x48, 0x0, 0x0, 0xb6, 0x66, 0xe0, 0xd, - 0x0, 0xc0, 0x0, 0xb, 0x10, 0x1c, 0x0, 0xd0, - 0x2b, 0x20, 0x20, 0xb1, 0x1, 0xc2, 0x7d, 0x60, - 0x4a, 0x24, 0xb, 0x66, 0x6c, 0x57, 0x0, 0x0, - 0xbc, 0x40, 0xb1, 0x1, 0xc0, 0x0, 0x0, 0x1, - 0xb7, 0x4, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x10, - - /* U+8A71 "話" */ - 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x6, 0x20, - 0x0, 0xe, 0x20, 0x3, 0x57, 0x9b, 0xdc, 0x70, - 0x27, 0x6a, 0x68, 0x61, 0x11, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x3, 0x44, 0x56, 0x0, 0x0, 0xd0, 0x2, 0x70, - 0x2, 0x22, 0x21, 0x46, 0x66, 0xe6, 0x66, 0x50, - 0x0, 0x0, 0x13, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x5, 0x66, 0x64, 0x1, 0x0, 0xd0, 0x2, 0x0, - 0x1, 0x0, 0x2, 0xd, 0x66, 0x96, 0x7e, 0x0, - 0xb, 0x66, 0x7d, 0xd, 0x0, 0x0, 0x1c, 0x0, - 0xb, 0x10, 0x1c, 0xd, 0x0, 0x0, 0x1c, 0x0, - 0xb, 0x10, 0x1c, 0xd, 0x0, 0x0, 0x1c, 0x0, - 0xb, 0x66, 0x6c, 0xd, 0x66, 0x66, 0x6c, 0x0, - 0xb, 0x10, 0x1b, 0xd, 0x0, 0x0, 0x1c, 0x0, - 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x0, - - /* U+8A72 "該" */ - 0x0, 0x52, 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, - 0x0, 0x1e, 0x20, 0x0, 0x0, 0xe3, 0x0, 0x0, - 0x26, 0x6c, 0x68, 0x80, 0x0, 0x42, 0x1, 0x60, - 0x0, 0x0, 0x0, 0x17, 0x67, 0x96, 0x66, 0x71, - 0x4, 0x66, 0x78, 0x0, 0xa, 0x90, 0x10, 0x0, - 0x1, 0x10, 0x0, 0x0, 0x78, 0x0, 0x8c, 0x0, - 0x0, 0x0, 0x12, 0xa, 0xa6, 0x77, 0xe3, 0x0, - 0x5, 0x66, 0x66, 0x7, 0x74, 0x2c, 0x30, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x1, 0xb3, 0x1e, 0x30, - 0xb, 0x66, 0x6e, 0x0, 0x49, 0x10, 0xb9, 0x0, - 0xb, 0x10, 0x1c, 0x26, 0x30, 0x9, 0x90, 0x0, - 0xb, 0x10, 0x1c, 0x0, 0x0, 0xa8, 0x96, 0x0, - 0xb, 0x66, 0x6c, 0x0, 0x2b, 0x50, 0xa, 0xa0, - 0xc, 0x10, 0x1c, 0x7, 0x81, 0x0, 0x1, 0xf0, - 0x4, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x20, - - /* U+8A73 "詳" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x45, 0x0, 0x1, 0x50, 0x0, 0xb7, 0x0, - 0x0, 0xe, 0x30, 0x10, 0x87, 0x1, 0xd1, 0x0, - 0x27, 0x69, 0x68, 0x80, 0x2d, 0x6, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x36, 0x68, 0x6b, 0x6a, 0x90, - 0x4, 0x66, 0x79, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1, 0x0, - 0x0, 0x0, 0x23, 0x4, 0x76, 0xe6, 0x8a, 0x0, - 0x5, 0x66, 0x64, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0x1, 0x0, 0x2, 0x0, 0x0, 0xe0, 0x0, 0x10, - 0xb, 0x65, 0x6e, 0x47, 0x66, 0xe6, 0x69, 0xa0, - 0xb, 0x10, 0x1c, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0xb, 0x10, 0x1c, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0xb, 0x66, 0x6c, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0xb, 0x10, 0x9, 0x0, 0x0, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, - - /* U+8A8C "誌" */ - 0x0, 0x64, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, - 0x0, 0xf, 0x20, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x27, 0x6b, 0x68, 0x70, 0x0, 0xd0, 0x3, 0x10, - 0x0, 0x0, 0x0, 0x17, 0x55, 0xe5, 0x59, 0x70, - 0x4, 0x66, 0x78, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x1, 0x10, 0x0, 0x0, 0x0, 0xd0, 0x3, 0x0, - 0x0, 0x0, 0x13, 0x4, 0x76, 0x96, 0x79, 0x0, - 0x5, 0x66, 0x65, 0x0, 0x2, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x20, 0xb4, 0x0, 0x0, - 0xb, 0x66, 0x6e, 0x2, 0xd2, 0x4c, 0x6, 0x0, - 0xb, 0x10, 0x1c, 0x16, 0xd0, 0x1, 0x5, 0xd0, - 0xb, 0x10, 0x1c, 0x86, 0xd0, 0x0, 0x50, 0xb2, - 0xb, 0x66, 0x6c, 0xa1, 0xc2, 0x0, 0xa1, 0x0, - 0xb, 0x10, 0x1c, 0x0, 0x5b, 0xcc, 0xa1, 0x0, - 0x4, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8A8D "認" */ - 0x0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0xd, 0x30, 0x4, 0x77, 0x86, 0x6d, 0x40, - 0x27, 0x69, 0x68, 0x61, 0x6, 0x70, 0xd, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x9, 0x50, 0xd, 0x0, - 0x4, 0x66, 0x78, 0x2d, 0xd, 0x0, 0xe, 0x0, - 0x1, 0x10, 0x0, 0x12, 0x68, 0x0, 0x3c, 0x0, - 0x0, 0x0, 0x12, 0x2, 0xb0, 0x38, 0xb7, 0x0, - 0x5, 0x66, 0x64, 0x17, 0x1, 0x43, 0x80, 0x0, - 0x2, 0x0, 0x2, 0x0, 0x20, 0x95, 0x0, 0x0, - 0xb, 0x66, 0x6e, 0x2, 0xd2, 0x4a, 0x14, 0x0, - 0xb, 0x10, 0x1c, 0x26, 0xd0, 0x0, 0x7, 0x80, - 0xb, 0x10, 0x1c, 0xa5, 0xd0, 0x0, 0x60, 0xc0, - 0xb, 0x66, 0x6c, 0x60, 0xc2, 0x0, 0xc1, 0x0, - 0xb, 0x10, 0x1c, 0x0, 0x4b, 0xcc, 0xa1, 0x0, - 0x3, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8A95 "誕" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x4a, 0x4, 0x76, 0xd1, 0x15, 0xad, 0x50, - 0x27, 0x69, 0x97, 0x5, 0xa0, 0x43, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0xc0, 0x0, - 0x5, 0x66, 0xa1, 0x2c, 0x0, 0x60, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xa5, 0x20, 0xc0, 0xd8, 0x50, - 0x4, 0x66, 0xa2, 0xb6, 0xd6, 0xc0, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe1, 0xc0, 0xc0, 0x0, - 0x7, 0x66, 0xa5, 0x11, 0xd0, 0xc0, 0xc0, 0x0, - 0xa, 0x10, 0xa3, 0x86, 0x70, 0xc0, 0xc1, 0x0, - 0xa, 0x10, 0xa2, 0x5e, 0x11, 0xc6, 0x98, 0x60, - 0xa, 0x10, 0xa2, 0x6b, 0xa0, 0x0, 0x0, 0x0, - 0xa, 0x66, 0xb4, 0x90, 0x5d, 0xa6, 0x43, 0x30, - 0x5, 0x0, 0x27, 0x0, 0x0, 0x5a, 0xdf, 0x60, - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8A98 "誘" */ - 0x0, 0x82, 0x0, 0x0, 0x0, 0x37, 0xc6, 0x0, - 0x0, 0x3b, 0x10, 0x5, 0x78, 0xe5, 0x43, 0x0, - 0x27, 0x68, 0x87, 0x0, 0x0, 0xd0, 0x2, 0x10, - 0x0, 0x0, 0x10, 0x66, 0x6a, 0xe7, 0x68, 0x70, - 0x5, 0x66, 0xa1, 0x0, 0x4b, 0xd6, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xa0, 0xd0, 0xc3, 0x0, - 0x5, 0x65, 0xa1, 0x76, 0x0, 0xe0, 0x2d, 0x90, - 0x0, 0x0, 0x2, 0x15, 0x66, 0x86, 0x91, 0x10, - 0x8, 0x55, 0xa3, 0x2, 0x4a, 0x2, 0xc1, 0x0, - 0xb, 0x10, 0xb2, 0x0, 0x68, 0x8, 0x62, 0x20, - 0xb, 0x10, 0xb2, 0x0, 0xb4, 0x7, 0x6b, 0x90, - 0xb, 0x10, 0xb2, 0x2, 0xc0, 0x0, 0xa, 0x40, - 0xc, 0x66, 0xc2, 0x1b, 0x20, 0x0, 0xd, 0x10, - 0x6, 0x0, 0x14, 0x81, 0x0, 0x39, 0xc9, 0x0, - 0x0, 0x0, 0x21, 0x0, 0x0, 0x2, 0x60, 0x0, - - /* U+8A9E "語" */ - 0x0, 0x53, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0xe, 0x20, 0x37, 0x6b, 0x66, 0x79, 0x0, - 0x26, 0x6b, 0x6a, 0x30, 0x3c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x9c, 0x55, 0xc1, 0x0, - 0x4, 0x66, 0x77, 0x0, 0x77, 0x0, 0xe0, 0x0, - 0x1, 0x10, 0x0, 0x0, 0x95, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x12, 0x11, 0xb5, 0x12, 0xd3, 0x90, - 0x5, 0x66, 0x65, 0x45, 0x55, 0x55, 0x55, 0x50, - 0x0, 0x0, 0x1, 0x4, 0x11, 0x11, 0x26, 0x0, - 0xb, 0x66, 0x6d, 0xb, 0x75, 0x55, 0x7c, 0x0, - 0xb, 0x10, 0x1c, 0xb, 0x30, 0x0, 0x3a, 0x0, - 0xb, 0x10, 0x1c, 0xb, 0x30, 0x0, 0x3a, 0x0, - 0xb, 0x66, 0x6c, 0xb, 0x76, 0x66, 0x8b, 0x0, - 0xb, 0x10, 0xb, 0xb, 0x20, 0x0, 0x3a, 0x0, - 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - - /* U+8AAA "說" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x44, 0x0, 0x0, 0xc, 0x27, 0x0, 0x0, - 0x0, 0xd, 0x30, 0x0, 0x69, 0x8, 0x10, 0x0, - 0x27, 0x6a, 0x69, 0x70, 0xc0, 0x2, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0x7c, 0x20, - 0x4, 0x66, 0x79, 0x54, 0xa6, 0x66, 0x9e, 0x70, - 0x1, 0x0, 0x0, 0x10, 0xd0, 0x0, 0x75, 0x0, - 0x0, 0x0, 0x13, 0x0, 0xd0, 0x0, 0x75, 0x0, - 0x5, 0x66, 0x65, 0x0, 0xd0, 0x0, 0x76, 0x0, - 0x1, 0x0, 0x2, 0x0, 0xe9, 0x7a, 0xa5, 0x0, - 0xb, 0x66, 0x6f, 0x10, 0x1a, 0x2d, 0x0, 0x0, - 0xb, 0x10, 0xd, 0x0, 0xc, 0xd, 0x0, 0x0, - 0xb, 0x10, 0xd, 0x0, 0x2a, 0xd, 0x0, 0x40, - 0xb, 0x66, 0x6d, 0x0, 0x92, 0xd, 0x0, 0x70, - 0xb, 0x10, 0xc, 0x7, 0x30, 0xa, 0xbc, 0xa0, - 0x1, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, - - /* U+8AAC "説" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x64, 0x0, 0x3, 0x40, 0x0, 0xd3, 0x0, - 0x0, 0xf, 0x20, 0x0, 0xb3, 0x5, 0xb0, 0x0, - 0x27, 0x6b, 0x6a, 0x30, 0x79, 0xa, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x55, 0x58, 0x58, 0x0, - 0x5, 0x66, 0x6a, 0xd, 0x22, 0x22, 0x4b, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x3a, 0x0, - 0x4, 0x66, 0x69, 0xd, 0x0, 0x0, 0x3a, 0x0, - 0x1, 0x10, 0x0, 0xd, 0x55, 0x55, 0x7a, 0x0, - 0x3, 0x0, 0x6, 0xb, 0x3b, 0x1d, 0x33, 0x0, - 0xb, 0x66, 0x6e, 0x0, 0x2a, 0xd, 0x0, 0x0, - 0xb, 0x10, 0xd, 0x0, 0x48, 0xd, 0x0, 0x30, - 0xb, 0x10, 0xd, 0x0, 0xa3, 0xd, 0x0, 0x60, - 0xb, 0x66, 0x6d, 0x5, 0x80, 0xd, 0x0, 0xa0, - 0x9, 0x0, 0x4, 0x77, 0x0, 0xa, 0xbb, 0xd1, - 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+8AAD "読" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x72, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x0, - 0x0, 0x3a, 0x1, 0x0, 0x1, 0xd0, 0x2, 0x0, - 0x27, 0x68, 0x87, 0x57, 0x66, 0xe6, 0x6a, 0x60, - 0x0, 0x0, 0x10, 0x0, 0x1, 0xd0, 0x0, 0x0, - 0x5, 0x66, 0x93, 0x6, 0x66, 0xa6, 0x6a, 0x0, - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x10, - 0x5, 0x66, 0xa3, 0x68, 0x66, 0x66, 0x6a, 0xc0, - 0x0, 0x0, 0x0, 0xd1, 0x41, 0x3, 0x8, 0x10, - 0x8, 0x66, 0xa3, 0x0, 0xa6, 0xe, 0x10, 0x0, - 0xc, 0x10, 0xb2, 0x0, 0xb3, 0xd, 0x0, 0x0, - 0xb, 0x10, 0xb2, 0x0, 0xe0, 0xd, 0x0, 0x40, - 0xb, 0x10, 0xb2, 0x4, 0xa0, 0xd, 0x0, 0x50, - 0xc, 0x66, 0xc2, 0x1c, 0x10, 0xd, 0x2, 0x70, - 0x7, 0x0, 0x22, 0x92, 0x0, 0x9, 0xcd, 0xa0, - 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8AB0 "誰" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x64, 0x0, 0x0, 0x69, 0x53, 0x0, 0x0, - 0x0, 0xe, 0x20, 0x0, 0xb3, 0xd, 0x40, 0x0, - 0x37, 0x6b, 0x6a, 0x61, 0xc0, 0x4, 0x14, 0x40, - 0x0, 0x0, 0x0, 0x6, 0xc6, 0x6d, 0x66, 0x50, - 0x5, 0x66, 0x78, 0xc, 0xb0, 0x1c, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x66, 0xb0, 0x1c, 0x4, 0x0, - 0x0, 0x0, 0x13, 0x52, 0xc6, 0x6d, 0x68, 0x50, - 0x6, 0x66, 0x65, 0x2, 0xb0, 0x1c, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x2, 0xb0, 0x1c, 0x0, 0x0, - 0xb, 0x66, 0x6e, 0x2, 0xc6, 0x6d, 0x6b, 0x50, - 0xb, 0x10, 0x1c, 0x2, 0xb0, 0x1c, 0x0, 0x0, - 0xb, 0x10, 0x1c, 0x2, 0xb0, 0x1c, 0x0, 0x0, - 0xb, 0x76, 0x6c, 0x2, 0xb0, 0x1c, 0x3, 0x70, - 0xb, 0x10, 0x1c, 0x2, 0xc6, 0x66, 0x66, 0x50, - 0x4, 0x0, 0x1, 0x1, 0x30, 0x0, 0x0, 0x0, - - /* U+8AB2 "課" */ - 0x0, 0x52, 0x0, 0x4, 0x0, 0x0, 0x5, 0x0, - 0x0, 0x1f, 0x0, 0xd, 0x66, 0xe6, 0x7d, 0x0, - 0x27, 0x6b, 0x6a, 0x2d, 0x0, 0xd0, 0x2b, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x66, 0xe6, 0x7b, 0x0, - 0x5, 0x66, 0x88, 0xd, 0x0, 0xd0, 0x2b, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x66, 0xe6, 0x7b, 0x0, - 0x4, 0x66, 0x87, 0x7, 0x0, 0xd0, 0x14, 0x0, - 0x1, 0x0, 0x0, 0x11, 0x11, 0xd1, 0x14, 0x70, - 0x7, 0x66, 0x69, 0x34, 0x3e, 0xe8, 0x33, 0x30, - 0xa, 0x20, 0x3a, 0x0, 0x4a, 0xd8, 0x0, 0x0, - 0xa, 0x20, 0x3a, 0x0, 0xc2, 0xd4, 0x70, 0x0, - 0xa, 0x20, 0x3a, 0x8, 0x50, 0xd0, 0xb3, 0x0, - 0xa, 0x76, 0x7a, 0x66, 0x0, 0xd0, 0x2e, 0x80, - 0x6, 0x10, 0x5, 0x30, 0x0, 0xe0, 0x2, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, - - /* U+8ABF "調" */ - 0x0, 0x83, 0x0, 0x4, 0x0, 0x0, 0x1, 0x60, - 0x0, 0x2f, 0x0, 0xe, 0x66, 0xa8, 0x67, 0xc0, - 0x27, 0x6a, 0x6a, 0x3d, 0x0, 0x84, 0x3, 0xa0, - 0x0, 0x0, 0x0, 0xd, 0x17, 0xb8, 0xa4, 0xa0, - 0x5, 0x76, 0x6a, 0xd, 0x0, 0x84, 0x3, 0xa0, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x84, 0x44, 0xa0, - 0x2, 0x33, 0x37, 0xd, 0x66, 0x66, 0x66, 0xa0, - 0x2, 0x32, 0x22, 0xc, 0x8, 0x66, 0x93, 0xa0, - 0x3, 0x0, 0x4, 0xc, 0xc, 0x1, 0xb3, 0xa0, - 0xc, 0x66, 0x6e, 0x2b, 0xc, 0x1, 0xb3, 0xa0, - 0xb, 0x10, 0x1c, 0x48, 0xd, 0x66, 0xb3, 0xa0, - 0xb, 0x10, 0x1c, 0x83, 0x6, 0x0, 0x43, 0xa0, - 0xc, 0x66, 0x6a, 0xa0, 0x0, 0x3, 0x36, 0x90, - 0x4, 0x0, 0x5, 0x20, 0x0, 0x0, 0x5e, 0x50, - 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+8AC7 "談" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x93, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, - 0x0, 0x2f, 0x1, 0x0, 0x5a, 0x30, 0x4e, 0x20, - 0x37, 0x69, 0x6a, 0x34, 0x8a, 0x39, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0x3b, 0xb2, 0x0, 0x0, - 0x6, 0x66, 0x97, 0x1, 0x1f, 0x77, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa8, 0x1, 0xb9, 0x0, - 0x5, 0x66, 0x96, 0x19, 0x58, 0x60, 0xb, 0x0, - 0x1, 0x0, 0x0, 0x20, 0x9, 0x60, 0x2, 0x0, - 0x3, 0x0, 0x5, 0x0, 0x7b, 0x70, 0x9e, 0x10, - 0xb, 0x66, 0x6e, 0x1c, 0x4d, 0x99, 0x40, 0x0, - 0xb, 0x10, 0x1c, 0x26, 0x2c, 0x72, 0x0, 0x0, - 0xb, 0x10, 0x1c, 0x0, 0xa5, 0x1b, 0x0, 0x0, - 0xb, 0x66, 0x6c, 0x4, 0xa0, 0x9, 0xa1, 0x0, - 0xc, 0x10, 0x9, 0x58, 0x0, 0x0, 0xce, 0x81, - 0x2, 0x0, 0x5, 0x30, 0x0, 0x0, 0x7, 0x20, - - /* U+8ACB "請" */ - 0x0, 0x63, 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, - 0x0, 0xf, 0x10, 0x0, 0x0, 0xd0, 0x3, 0x10, - 0x26, 0x5a, 0x5a, 0x47, 0x66, 0xe6, 0x68, 0x60, - 0x0, 0x0, 0x0, 0x5, 0x66, 0xe6, 0x6b, 0x10, - 0x5, 0x76, 0x7a, 0x1, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x46, 0x66, 0xe6, 0x69, 0xc0, - 0x0, 0x0, 0x14, 0x11, 0x0, 0x0, 0x2, 0x0, - 0x5, 0x66, 0x65, 0xb, 0x66, 0x66, 0x6e, 0x10, - 0x1, 0x0, 0x2, 0xb, 0x21, 0x11, 0x1d, 0x0, - 0xb, 0x66, 0x6e, 0xb, 0x65, 0x55, 0x5d, 0x0, - 0xb, 0x10, 0x1c, 0xb, 0x76, 0x66, 0x6d, 0x0, - 0xb, 0x10, 0x1c, 0xb, 0x20, 0x0, 0xd, 0x0, - 0xb, 0x66, 0x6c, 0xb, 0x20, 0x0, 0xd, 0x0, - 0x8, 0x0, 0x6, 0xb, 0x20, 0x18, 0xeb, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x41, 0x0, - - /* U+8AD6 "論" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x61, 0x0, 0x0, 0x2, 0xc1, 0x0, 0x0, - 0x0, 0x2c, 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, - 0x27, 0x6b, 0x6c, 0x30, 0x2d, 0x26, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb3, 0x9, 0x30, 0x0, - 0x3, 0x44, 0x92, 0xa, 0x40, 0x3, 0xd5, 0x0, - 0x2, 0x22, 0x22, 0x93, 0x76, 0x6a, 0x7d, 0xb1, - 0x0, 0x0, 0x44, 0x2, 0x0, 0x0, 0x4, 0x10, - 0x5, 0x66, 0x62, 0xd, 0x6c, 0x6c, 0x6d, 0x20, - 0x1, 0x0, 0x20, 0xc, 0xc, 0xc, 0xc, 0x0, - 0xa, 0x65, 0xd5, 0xd, 0x6d, 0x6d, 0x6d, 0x0, - 0xa, 0x10, 0xb1, 0xc, 0xc, 0xc, 0xc, 0x0, - 0xa, 0x10, 0xb1, 0xc, 0xc, 0xc, 0xc, 0x0, - 0xa, 0x66, 0xc1, 0xc, 0xb, 0x9, 0xc, 0x0, - 0xb, 0x10, 0xa1, 0xc, 0x0, 0x4, 0x9e, 0x0, - 0x3, 0x0, 0x10, 0x2, 0x0, 0x0, 0x34, 0x0, - - /* U+8AF8 "諸" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x73, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x1c, 0x1, 0x0, 0xd, 0x0, 0xb, 0x70, - 0x27, 0x68, 0x78, 0x26, 0x6e, 0x6c, 0x6d, 0x0, - 0x0, 0x0, 0x10, 0x2, 0xd, 0x0, 0xc3, 0x0, - 0x5, 0x66, 0xa2, 0x0, 0xd, 0x9, 0x61, 0x10, - 0x0, 0x0, 0x1, 0x76, 0x6a, 0xad, 0x69, 0x90, - 0x5, 0x66, 0xb1, 0x0, 0x7, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xa7, 0x0, 0x5, 0x0, - 0x3, 0x0, 0x40, 0x1d, 0x76, 0x66, 0x8d, 0x0, - 0xa, 0x76, 0xc8, 0x6b, 0x20, 0x0, 0x3a, 0x0, - 0xa, 0x20, 0xb2, 0xb, 0x76, 0x66, 0x7a, 0x0, - 0xa, 0x20, 0xb2, 0xb, 0x20, 0x0, 0x3a, 0x0, - 0xa, 0x75, 0xc2, 0xb, 0x76, 0x66, 0x7a, 0x0, - 0x7, 0x10, 0x61, 0xa, 0x10, 0x0, 0x28, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8B02 "謂" */ - 0x0, 0x56, 0x0, 0x3, 0x0, 0x0, 0x1, 0x30, - 0x0, 0xe, 0x31, 0xe, 0x66, 0xe6, 0x69, 0xb0, - 0x37, 0x59, 0x58, 0x5d, 0x0, 0xd0, 0x5, 0x80, - 0x0, 0x0, 0x1, 0xd, 0x66, 0xe6, 0x69, 0x80, - 0x6, 0x66, 0x6a, 0xd, 0x0, 0xd0, 0x5, 0x80, - 0x0, 0x0, 0x0, 0xe, 0x66, 0x86, 0x69, 0x70, - 0x5, 0x66, 0x6b, 0x4, 0x10, 0x0, 0x5, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xb6, 0x66, 0x6e, 0x10, - 0x7, 0x66, 0x6a, 0x4, 0xb5, 0x55, 0x5d, 0x0, - 0xb, 0x10, 0xd, 0x4, 0x80, 0x0, 0xd, 0x0, - 0xb, 0x10, 0xd, 0x4, 0xb6, 0x66, 0x6d, 0x0, - 0xb, 0x10, 0xd, 0x4, 0x80, 0x0, 0xd, 0x0, - 0xc, 0x66, 0x6d, 0x4, 0x80, 0x0, 0xd, 0x0, - 0xa, 0x0, 0x9, 0x4, 0x80, 0x17, 0xda, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x30, 0x0, - - /* U+8B1B "講" */ - 0x0, 0x61, 0x0, 0x0, 0x83, 0x4, 0x60, 0x0, - 0x0, 0x2e, 0x0, 0x0, 0xa2, 0x5, 0x62, 0x40, - 0x26, 0x5b, 0x69, 0x66, 0xc7, 0x69, 0xa6, 0x50, - 0x0, 0x0, 0x0, 0x16, 0xc7, 0x69, 0xa9, 0x30, - 0x5, 0x66, 0xb2, 0x2, 0xa2, 0x5, 0x60, 0x20, - 0x0, 0x0, 0x1, 0x76, 0x96, 0x77, 0x86, 0xa2, - 0x2, 0x33, 0x81, 0x2, 0x0, 0xd1, 0x4, 0x0, - 0x3, 0x33, 0x31, 0xc, 0x66, 0xd6, 0x6d, 0x0, - 0x4, 0x11, 0x60, 0xc, 0x0, 0xc0, 0xb, 0x0, - 0xc, 0x55, 0xd2, 0xc, 0x66, 0xd6, 0x6b, 0x0, - 0xc, 0x0, 0xc0, 0xc, 0x0, 0xc0, 0xb, 0x50, - 0xc, 0x0, 0xc1, 0x7d, 0x66, 0x76, 0x6d, 0x61, - 0xc, 0x66, 0xd0, 0xc, 0x0, 0x0, 0xb, 0x0, - 0x9, 0x0, 0x50, 0xc, 0x0, 0x6, 0xba, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x42, 0x0, - - /* U+8B1D "謝" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x70, 0x0, 0x3, 0xa0, 0x0, 0x9, 0x0, - 0x0, 0x6a, 0x0, 0x6, 0x22, 0x0, 0xc, 0x0, - 0x26, 0x7a, 0x96, 0xc7, 0x6d, 0x10, 0xc, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0xc, 0x0, 0xc, 0x20, - 0x5, 0x66, 0xa0, 0xc6, 0x6d, 0x47, 0x6e, 0x90, - 0x1, 0x0, 0x0, 0xc0, 0xc, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x50, 0xc6, 0x6d, 0x34, 0xc, 0x0, - 0x5, 0x66, 0x61, 0xc0, 0xc, 0xb, 0x4c, 0x0, - 0x2, 0x0, 0x25, 0xb5, 0x8d, 0x5, 0x5c, 0x0, - 0xa, 0x66, 0xd1, 0x1, 0xcc, 0x0, 0xc, 0x0, - 0xa, 0x10, 0xc0, 0x9, 0x3c, 0x0, 0xc, 0x0, - 0xa, 0x10, 0xc0, 0x47, 0xc, 0x0, 0xc, 0x0, - 0xa, 0x66, 0xd3, 0x70, 0xc, 0x1, 0x1c, 0x0, - 0x7, 0x0, 0x44, 0x3, 0xbd, 0x5, 0xe8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x20, 0x0, - - /* U+8B58 "識" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x15, 0x0, 0x0, 0x80, 0x0, 0xa2, 0x0, 0x0, - 0xb5, 0x0, 0x8, 0x52, 0xb, 0x11, 0x2, 0x6a, - 0x7a, 0x57, 0x66, 0x93, 0xb0, 0xa4, 0x0, 0x0, - 0x1, 0x80, 0xd, 0x2b, 0x3, 0x80, 0x56, 0x78, - 0xb, 0x34, 0x50, 0xb0, 0x0, 0x0, 0x0, 0x5, - 0x86, 0xa6, 0x6d, 0x6c, 0x50, 0x22, 0x46, 0x11, - 0x0, 0x10, 0xb0, 0x61, 0x4, 0x44, 0x30, 0xd6, - 0x6d, 0xa, 0x1e, 0x20, 0x30, 0x15, 0xc, 0x0, - 0xc0, 0x97, 0xa0, 0xc, 0x55, 0xd0, 0xd6, 0x6c, - 0x6, 0xe3, 0x0, 0xc0, 0xc, 0xc, 0x0, 0xc0, - 0x5d, 0x2, 0xc, 0x0, 0xc0, 0xc0, 0xc, 0xd, - 0xd1, 0x60, 0xc6, 0x6c, 0xd, 0x66, 0xb8, 0x53, - 0xb9, 0xa, 0x0, 0x90, 0x40, 0x6, 0x50, 0x6, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x2, - - /* U+8B70 "議" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x81, 0x0, 0x0, 0x84, 0x2, 0xd0, 0x0, - 0x0, 0x59, 0x0, 0x0, 0x1d, 0x7, 0x25, 0x0, - 0x37, 0x69, 0x89, 0x37, 0x67, 0xc6, 0x67, 0x40, - 0x0, 0x0, 0x0, 0x2, 0x33, 0xc3, 0x64, 0x0, - 0x5, 0x66, 0xa0, 0x2, 0x43, 0xc3, 0x32, 0x0, - 0x0, 0x0, 0x0, 0x46, 0x55, 0xc5, 0x59, 0x90, - 0x4, 0x66, 0xa0, 0x0, 0x6, 0x37, 0x21, 0x0, - 0x1, 0x0, 0x0, 0x47, 0xe6, 0x49, 0x1c, 0x0, - 0x5, 0x22, 0x71, 0x0, 0xc0, 0x1a, 0x4, 0x50, - 0xc, 0x44, 0xd3, 0x76, 0xd6, 0x6d, 0x67, 0x70, - 0xc, 0x0, 0xc0, 0x0, 0xc5, 0x2b, 0x2d, 0x0, - 0xc, 0x0, 0xc1, 0xaa, 0xd0, 0x8, 0xc2, 0x0, - 0xc, 0x66, 0xd0, 0x20, 0xc0, 0x1b, 0xc1, 0x40, - 0x8, 0x0, 0x70, 0x39, 0xe4, 0x70, 0x4d, 0xb0, - 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x1, 0x70, - - /* U+8B77 "護" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x82, 0x0, 0x0, 0x85, 0x9, 0x40, 0x0, - 0x0, 0x2c, 0x1, 0x56, 0xa8, 0x6b, 0x87, 0xc0, - 0x37, 0x69, 0x79, 0x21, 0x75, 0x28, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x9, 0x60, 0xd1, 0x3, 0x0, - 0x6, 0x65, 0xa1, 0x1f, 0x55, 0xc5, 0x5a, 0x30, - 0x0, 0x0, 0x0, 0x9d, 0x66, 0xd6, 0x78, 0x0, - 0x4, 0x55, 0xa5, 0x3c, 0x0, 0xc0, 0x13, 0x0, - 0x1, 0x11, 0x10, 0xc, 0x66, 0xd6, 0x67, 0x0, - 0x6, 0x33, 0x81, 0xc, 0x66, 0xa6, 0x69, 0x90, - 0xc, 0x22, 0xc1, 0x38, 0x66, 0x66, 0xa2, 0x0, - 0xc, 0x0, 0xc0, 0x1, 0x60, 0x4, 0xc3, 0x0, - 0xc, 0x0, 0xc0, 0x0, 0x28, 0x4a, 0x0, 0x0, - 0xc, 0x66, 0xd0, 0x0, 0xb, 0xe1, 0x0, 0x0, - 0xa, 0x0, 0x80, 0x6, 0xb4, 0x6e, 0x84, 0x20, - 0x0, 0x0, 0x5, 0x73, 0x0, 0x3, 0xae, 0x80, - - /* U+8B8A "變" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0x10, 0x8, 0x40, 0x0, 0x86, 0x0, - 0x0, 0xa6, 0x12, 0x76, 0x6a, 0x22, 0xc1, 0x0, - 0x9, 0x80, 0xc1, 0x56, 0x6a, 0x4d, 0x17, 0x50, - 0x6, 0x38, 0x30, 0x20, 0x4, 0x25, 0x38, 0x0, - 0x0, 0x54, 0x61, 0x88, 0x78, 0x1, 0x91, 0x60, - 0x4, 0xb2, 0x28, 0x86, 0x6b, 0xc, 0x50, 0xb0, - 0x0, 0x10, 0x40, 0xa1, 0xb, 0x2, 0x1, 0x0, - 0x2, 0x49, 0x48, 0x96, 0x69, 0x7, 0x63, 0xb0, - 0x9, 0x17, 0x3a, 0x0, 0x0, 0x35, 0x85, 0x50, - 0x0, 0x0, 0xc9, 0x66, 0x66, 0xc8, 0x74, 0x0, - 0x0, 0x9, 0x34, 0x20, 0x5, 0xb0, 0x0, 0x0, - 0x0, 0x61, 0x0, 0x83, 0x3c, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xb6, 0x8c, 0x63, 0x10, 0x0, - 0x1, 0x57, 0x85, 0x0, 0x1, 0x8c, 0xfd, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8B93 "讓" */ - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x70, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, - 0x0, 0x69, 0x0, 0x56, 0x66, 0xe6, 0x6a, 0xb0, - 0x38, 0x8a, 0xa7, 0x12, 0x2, 0x1, 0x2, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x6d, 0x2c, 0x6d, 0x20, - 0x5, 0x65, 0xa1, 0xc, 0x6c, 0xc, 0x6c, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x43, 0x6, 0x3, 0x0, - 0x0, 0x0, 0x50, 0x22, 0x85, 0x29, 0x59, 0x30, - 0x6, 0x66, 0x50, 0x44, 0x95, 0x4a, 0x54, 0x20, - 0x3, 0x0, 0x30, 0x7, 0xa7, 0x6b, 0x7a, 0x20, - 0xb, 0x66, 0xc3, 0x0, 0x72, 0x8, 0x22, 0x70, - 0xb, 0x0, 0xb0, 0x76, 0x9d, 0xa6, 0x6a, 0x50, - 0xb, 0x0, 0xb0, 0x3, 0xe1, 0x56, 0x85, 0x0, - 0xb, 0x66, 0xc1, 0x78, 0xa0, 0x3a, 0xa1, 0x0, - 0x6, 0x0, 0x5, 0x10, 0xba, 0x20, 0x7f, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x1, 0x0, - - /* U+8BA1 "计" */ - 0x0, 0x42, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, - 0x0, 0xc5, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, - 0x3, 0xa0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x30, 0x0, 0x1, 0x66, 0xc4, - 0x36, 0x66, 0xd8, 0x66, 0xc7, 0x0, 0xd, 0x0, - 0x10, 0xb, 0x30, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xb3, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0xb, 0x30, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0xb3, 0x0, 0x0, 0x0, 0xd, 0x5, 0x20, 0xb, - 0x30, 0x0, 0x0, 0x0, 0xd7, 0x60, 0x0, 0xb3, - 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0xb, 0x30, - 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0xc4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x0, - - /* U+8BDE "诞" */ - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, - 0x3b, 0x4, 0x69, 0x70, 0x3, 0x9d, 0x90, 0x0, - 0xb2, 0x0, 0xb2, 0x36, 0x4d, 0x0, 0x0, 0x0, - 0x0, 0x1b, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, - 0x7, 0x50, 0x7, 0xd, 0x0, 0x3, 0x7b, 0x61, - 0xd0, 0x40, 0xd0, 0xd6, 0xc3, 0x0, 0xa2, 0x29, - 0x7d, 0xc, 0xd, 0x0, 0x0, 0xa, 0x21, 0x3, - 0x90, 0xc0, 0xd0, 0x0, 0x0, 0xa2, 0x5, 0x66, - 0xc, 0xd, 0x0, 0x0, 0xa, 0x20, 0x8b, 0x20, - 0xc0, 0xd0, 0x71, 0x0, 0xa2, 0x64, 0xd0, 0x4b, - 0x66, 0x66, 0x30, 0xb, 0xb1, 0x9b, 0x70, 0x0, - 0x0, 0x0, 0x0, 0xa4, 0x66, 0x6, 0xc9, 0x64, - 0x22, 0x10, 0x0, 0x64, 0x0, 0x0, 0x59, 0xce, - 0xe3, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+8C50 "豐" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x10, 0xb0, 0xc2, 0xa, 0x3, 0x0, 0x0, - 0xb1, 0x2d, 0x7c, 0x26, 0xd6, 0xc1, 0x0, 0xb, - 0x12, 0xb1, 0xc0, 0xb, 0x1c, 0x0, 0x0, 0xb2, - 0x7d, 0x5c, 0x37, 0xd6, 0xc0, 0x0, 0xb, 0x26, - 0xd7, 0xc2, 0x6d, 0x7c, 0x0, 0x0, 0xd0, 0x1b, - 0xc, 0x1, 0xb0, 0xc0, 0x0, 0x8, 0x66, 0x66, - 0x66, 0x66, 0x67, 0x0, 0x2, 0x76, 0x66, 0x66, - 0x66, 0x66, 0xa9, 0x0, 0x0, 0x21, 0x0, 0x0, - 0x0, 0x30, 0x0, 0x0, 0x5, 0xb6, 0x66, 0x66, - 0x6d, 0x10, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, - 0xb0, 0x0, 0x0, 0x6, 0xa8, 0x66, 0x67, 0x9a, - 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x79, 0x0, - 0x10, 0x5, 0x66, 0x68, 0xa6, 0x6b, 0x66, 0x6e, - 0x70, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8C61 "象" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xe6, 0x66, 0xab, 0x0, 0x0, 0x0, 0x7, - 0xa0, 0x0, 0x29, 0x10, 0x0, 0x0, 0x8, 0xe6, - 0x66, 0x6b, 0x66, 0x6d, 0x10, 0x5, 0x1d, 0x0, - 0xa, 0x50, 0x0, 0xe0, 0x0, 0x0, 0xd6, 0x66, - 0xf6, 0x66, 0x6e, 0x0, 0x0, 0x9, 0x0, 0xaa, - 0x0, 0x0, 0x80, 0x0, 0x0, 0x1, 0xa5, 0x85, - 0x3, 0xc9, 0x10, 0x0, 0x5, 0x71, 0x6a, 0xb7, - 0x80, 0x0, 0x0, 0x4, 0x1, 0x97, 0x1c, 0x76, - 0x20, 0x0, 0x0, 0x16, 0x81, 0x1b, 0x6b, 0xc, - 0x20, 0x0, 0x14, 0x0, 0x6a, 0x13, 0xb0, 0x3e, - 0x71, 0x0, 0x5, 0x95, 0x10, 0x79, 0x0, 0x3d, - 0xa1, 0x46, 0x20, 0x6, 0xfe, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, - - /* U+8CA0 "負" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0x76, 0x6a, 0x80, 0x0, 0x0, 0x3, 0xd2, - 0x0, 0x1d, 0x50, 0x0, 0x0, 0x3b, 0x10, 0x0, - 0x82, 0x0, 0x0, 0x5, 0x76, 0x33, 0x35, 0x63, - 0x39, 0x0, 0x1, 0xd, 0x33, 0x33, 0x33, 0x3e, - 0x10, 0x0, 0xd, 0x66, 0x66, 0x66, 0x6e, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, - 0xd, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xd, - 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x66, - 0x66, 0x66, 0x6e, 0x0, 0x0, 0x7, 0x28, 0x0, - 0x5, 0x18, 0x0, 0x0, 0x3, 0xd7, 0x0, 0x1, - 0xab, 0x20, 0x0, 0x78, 0x10, 0x0, 0x0, 0x7, - 0xe0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x30, - - /* U+8CA1 "財" */ - 0x2, 0x0, 0x3, 0x0, 0x0, 0x1, 0xa0, 0x0, - 0xb, 0x76, 0x6d, 0x40, 0x0, 0x1, 0xc0, 0x0, - 0xa, 0x20, 0xc, 0x10, 0x0, 0x1, 0xc0, 0x0, - 0xa, 0x20, 0xc, 0x10, 0x0, 0x1, 0xc1, 0x70, - 0xa, 0x76, 0x6d, 0x16, 0x66, 0x6e, 0xd6, 0x61, - 0xa, 0x20, 0xc, 0x10, 0x0, 0x4c, 0xc0, 0x0, - 0xa, 0x76, 0x6d, 0x10, 0x0, 0xc3, 0xc0, 0x0, - 0xa, 0x20, 0xc, 0x10, 0x7, 0x81, 0xc0, 0x0, - 0xa, 0x20, 0xc, 0x10, 0x3b, 0x1, 0xc0, 0x0, - 0xa, 0x76, 0x6d, 0x11, 0xa0, 0x1, 0xc0, 0x0, - 0x8, 0x20, 0x6, 0x18, 0x0, 0x1, 0xc0, 0x0, - 0x0, 0xb6, 0x37, 0x40, 0x0, 0x1, 0xc0, 0x0, - 0x5, 0x90, 0x9, 0x60, 0x0, 0x1, 0xc0, 0x0, - 0x28, 0x0, 0x2, 0x80, 0x2, 0x8e, 0xa0, 0x0, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, - - /* U+8CA7 "貧" */ - 0x0, 0x0, 0x37, 0x0, 0x25, 0x0, 0x0, 0x0, - 0x0, 0x2c, 0x40, 0x0, 0x73, 0x0, 0x0, 0x0, - 0x49, 0x10, 0x0, 0x0, 0xb9, 0x30, 0x1, 0x54, - 0x37, 0xc9, 0x66, 0x6e, 0x7c, 0xc2, 0x0, 0x0, - 0x79, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x3, 0x94, - 0x0, 0x16, 0xb6, 0x0, 0x0, 0x4, 0x48, 0x66, - 0x66, 0x69, 0x6a, 0x0, 0x0, 0x1, 0xb0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0x1d, 0x66, 0x66, - 0x66, 0x6d, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, - 0x66, 0xd0, 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, - 0xd, 0x0, 0x0, 0x1, 0xc6, 0x76, 0x66, 0x66, - 0xa0, 0x0, 0x0, 0x1, 0x7d, 0x20, 0x5, 0x89, - 0x30, 0x0, 0x6, 0xa5, 0x0, 0x0, 0x0, 0x3d, - 0x50, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x12, - 0x0, - - /* U+8CA9 "販" */ - 0x1, 0x10, 0x0, 0x30, 0x0, 0x0, 0x39, 0x50, - 0x3, 0xc6, 0x66, 0xe0, 0x86, 0x79, 0x86, 0x40, - 0x2, 0xa0, 0x0, 0xd0, 0xd0, 0x0, 0x0, 0x0, - 0x2, 0xb4, 0x44, 0xd0, 0xd0, 0x0, 0x0, 0x0, - 0x2, 0xb1, 0x11, 0xd0, 0xd6, 0x66, 0x6a, 0x10, - 0x2, 0xa0, 0x0, 0xd0, 0xc3, 0x20, 0x1d, 0x0, - 0x2, 0xc6, 0x66, 0xd0, 0xc0, 0x60, 0x49, 0x0, - 0x2, 0xa0, 0x0, 0xd0, 0xc0, 0x80, 0x84, 0x0, - 0x2, 0xa0, 0x0, 0xd0, 0xb0, 0x81, 0xd0, 0x0, - 0x2, 0xc6, 0x66, 0xd1, 0x90, 0x3b, 0x80, 0x0, - 0x2, 0x71, 0x20, 0x75, 0x50, 0xf, 0x20, 0x0, - 0x0, 0x6b, 0x2b, 0x8, 0x0, 0x96, 0xc0, 0x0, - 0x0, 0xb1, 0x9, 0x47, 0x8, 0x30, 0x6d, 0x20, - 0x7, 0x20, 0x0, 0x51, 0x61, 0x0, 0x7, 0xa1, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8CAC "責" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd1, 0x0, 0x1, 0x0, 0x2, - 0x66, 0x66, 0x6e, 0x66, 0x67, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x50, 0x0, 0x0, 0x27, - 0x66, 0x6e, 0x66, 0x68, 0x30, 0x0, 0x22, 0x22, - 0x22, 0xe2, 0x22, 0x25, 0xb0, 0x15, 0x55, 0x44, - 0x44, 0x44, 0x48, 0x44, 0x10, 0x3, 0xc6, 0x66, - 0x66, 0x66, 0xd3, 0x0, 0x0, 0x3c, 0x66, 0x66, - 0x66, 0x6d, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, - 0x0, 0xc1, 0x0, 0x0, 0x3c, 0x66, 0x66, 0x66, - 0x6d, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, - 0xc1, 0x0, 0x0, 0x39, 0x6b, 0x66, 0x76, 0x69, - 0x10, 0x0, 0x0, 0x1b, 0xc2, 0x2, 0x8a, 0x71, - 0x0, 0x0, 0x7a, 0x30, 0x0, 0x0, 0x9, 0xe0, - 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, - - /* U+8CB7 "買" */ - 0x3, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0xb7, - 0x67, 0xc6, 0x6e, 0x66, 0xe3, 0xb, 0x20, 0x3a, - 0x0, 0xd0, 0xd, 0x0, 0xb2, 0x3, 0xa0, 0xd, - 0x0, 0xd0, 0x9, 0x66, 0x66, 0x66, 0x66, 0x6a, - 0x0, 0x6, 0x66, 0x66, 0x66, 0x6c, 0x20, 0x0, - 0x96, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x9, 0x96, - 0x66, 0x66, 0x6e, 0x0, 0x0, 0x96, 0x0, 0x0, - 0x0, 0xe0, 0x0, 0x9, 0x96, 0x66, 0x66, 0x6e, - 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0xe0, 0x0, - 0x8, 0x88, 0x76, 0x66, 0x6a, 0x0, 0x0, 0x4, - 0xe8, 0x0, 0x38, 0x93, 0x0, 0x29, 0x81, 0x0, - 0x0, 0x2, 0xc6, 0x34, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, - - /* U+8CB8 "貸" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa9, 0xb, 0x48, 0x50, 0x0, 0x0, - 0x0, 0xa8, 0x0, 0x85, 0x1c, 0x2, 0x0, 0x0, - 0xae, 0x15, 0x58, 0xc6, 0x66, 0xc2, 0x4, 0x71, - 0xd0, 0x0, 0x9, 0x40, 0x0, 0x10, 0x10, 0xd, - 0x0, 0x0, 0x1c, 0x40, 0x4, 0x0, 0x0, 0xb0, - 0x0, 0x0, 0x1c, 0xb8, 0x50, 0x0, 0x39, 0x66, - 0x66, 0x66, 0x6f, 0x96, 0x0, 0x3, 0xa0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x0, 0x3c, 0x66, 0x66, - 0x66, 0x6d, 0x0, 0x0, 0x3, 0xc6, 0x66, 0x66, - 0x66, 0xd0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, - 0x1d, 0x0, 0x0, 0x3, 0xb6, 0x86, 0x66, 0x66, - 0xa0, 0x0, 0x0, 0x1, 0xbb, 0x0, 0x5, 0x98, - 0x20, 0x0, 0x7, 0xa4, 0x0, 0x0, 0x0, 0x5f, - 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x30, - - /* U+8CBB "費" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb2, 0xb, 0x10, 0x0, 0x0, 0x1, - 0x76, 0x6d, 0x66, 0xd6, 0x6c, 0x30, 0x0, 0x3, - 0x0, 0xc0, 0xc, 0x0, 0xc0, 0x0, 0x0, 0xe8, - 0x6d, 0x66, 0xd6, 0x69, 0x0, 0x0, 0x2e, 0x66, - 0xc6, 0x6d, 0x66, 0x66, 0xd0, 0x0, 0x1, 0xa2, - 0x0, 0xc0, 0x2, 0x68, 0x0, 0x15, 0x71, 0x0, - 0x8, 0x0, 0x7a, 0x10, 0x2, 0x1d, 0x66, 0x66, - 0x66, 0x7d, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, - 0x67, 0xb0, 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, - 0x2b, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, 0x67, - 0xb0, 0x0, 0x0, 0x1d, 0x66, 0x66, 0x66, 0x7b, - 0x0, 0x0, 0x0, 0x4c, 0x50, 0x4, 0x78, 0x40, - 0x0, 0x1, 0x8a, 0x30, 0x0, 0x0, 0x2b, 0xa0, - 0x1, 0x51, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, - - /* U+8CBF "貿" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6d, 0x40, 0x0, 0x0, 0x10, 0x2, 0xa6, - 0x40, 0x17, 0x88, 0x66, 0xc7, 0x2, 0xa0, 0x28, - 0x0, 0x85, 0x0, 0xb2, 0x2, 0xa0, 0x1a, 0x80, - 0xc1, 0x0, 0xd0, 0x4, 0xc9, 0x61, 0x48, 0x61, - 0x68, 0xb0, 0x1, 0x80, 0x0, 0x65, 0x0, 0x8, - 0x20, 0x0, 0x9, 0x67, 0x66, 0x66, 0x6c, 0x10, - 0x0, 0xd, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0xe, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xe, - 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x68, 0x66, - 0x66, 0x6c, 0x0, 0x0, 0x1, 0xac, 0x10, 0x6, - 0xa7, 0x10, 0x0, 0x5a, 0x40, 0x0, 0x0, 0x7, - 0xe0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x20, - - /* U+8CC3 "賃" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x69, 0x0, 0x0, 0x25, 0x95, 0x0, 0x0, - 0x2d, 0x24, 0x57, 0xd7, 0x55, 0x40, 0x0, 0x1c, - 0xa0, 0x0, 0xc, 0x10, 0x2, 0x40, 0x19, 0x3b, - 0x56, 0x66, 0xd6, 0x66, 0x77, 0x1, 0x1, 0xb0, - 0x0, 0xc, 0x10, 0x3, 0x0, 0x0, 0x18, 0x6, - 0x66, 0x96, 0x67, 0x90, 0x0, 0x1, 0x96, 0x66, - 0x66, 0x66, 0xc1, 0x0, 0x0, 0x1b, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, - 0x66, 0xd0, 0x0, 0x0, 0x1d, 0x66, 0x66, 0x66, - 0x6d, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0x1c, 0x67, 0x66, 0x66, 0x6b, - 0x0, 0x0, 0x0, 0x1b, 0xa0, 0x2, 0x69, 0x50, - 0x0, 0x0, 0x6a, 0x30, 0x0, 0x0, 0x19, 0xb0, - 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - - /* U+8CC7 "資" */ - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x54, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xd1, 0x51, 0xd7, 0x66, 0x66, 0xa0, 0x0, 0x1, - 0x62, 0x57, 0x7, 0x40, 0x64, 0x0, 0x24, 0x84, - 0x19, 0x0, 0xe7, 0x2, 0x0, 0x0, 0x6a, 0x3, - 0x0, 0x88, 0x66, 0x0, 0x0, 0x5, 0x80, 0x0, - 0x79, 0x0, 0xaa, 0x41, 0x0, 0x68, 0x13, 0x73, - 0x0, 0x0, 0x9c, 0x50, 0x0, 0x2d, 0x66, 0x66, - 0x66, 0x7e, 0x0, 0x0, 0x2, 0xd6, 0x66, 0x66, - 0x67, 0xc0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, - 0x2c, 0x0, 0x0, 0x2, 0xd6, 0x66, 0x66, 0x67, - 0xc0, 0x0, 0x0, 0x2d, 0x76, 0x66, 0x66, 0x7c, - 0x0, 0x0, 0x0, 0x3c, 0x90, 0x0, 0x59, 0x71, - 0x0, 0x0, 0x7a, 0x40, 0x0, 0x0, 0x6, 0xe0, - 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - - /* U+8CEA "質" */ - 0x0, 0x0, 0x3, 0x80, 0x0, 0x17, 0x70, 0x0, - 0x96, 0x76, 0x51, 0xb6, 0x86, 0x40, 0x0, 0xa3, - 0x0, 0x51, 0xd0, 0x0, 0x61, 0x0, 0xb7, 0x6e, - 0x63, 0xe6, 0x9a, 0x63, 0x1, 0xc0, 0xc, 0x4, - 0x90, 0x57, 0x0, 0x9, 0x20, 0xd, 0x1a, 0x0, - 0x57, 0x0, 0x41, 0x28, 0x67, 0xa6, 0x66, 0xa3, - 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0xb3, 0x0, - 0x0, 0x2d, 0x66, 0x66, 0x66, 0xd2, 0x0, 0x0, - 0x2c, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x2d, - 0x66, 0x66, 0x66, 0xd2, 0x0, 0x0, 0x2d, 0x66, - 0x66, 0x66, 0xc2, 0x0, 0x0, 0x1, 0x8b, 0x0, - 0x27, 0x83, 0x0, 0x0, 0x4a, 0x60, 0x0, 0x0, - 0x3d, 0x60, 0x4, 0x30, 0x0, 0x0, 0x0, 0x1, - 0x40, - - /* U+8CFD "賽" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x66, 0x66, 0x6a, 0x86, 0x66, 0x6a, 0x10, - 0x4, 0xc0, 0x6, 0x30, 0x9, 0x10, 0x57, 0x0, - 0x0, 0x37, 0x6b, 0x86, 0x6d, 0x67, 0x90, 0x0, - 0x0, 0x4, 0x4a, 0x74, 0x4d, 0x46, 0x60, 0x0, - 0x0, 0x3, 0x19, 0x41, 0x1c, 0x11, 0x26, 0x0, - 0x3, 0x76, 0x7e, 0x66, 0x69, 0x76, 0x66, 0x10, - 0x0, 0x3, 0xf3, 0x11, 0x11, 0xc6, 0x0, 0x0, - 0x2, 0x76, 0xc4, 0x44, 0x44, 0xba, 0xd9, 0x71, - 0x13, 0x0, 0xc6, 0x66, 0x66, 0xc3, 0x6, 0x30, - 0x0, 0x0, 0xc6, 0x66, 0x66, 0xc3, 0x0, 0x0, - 0x0, 0x0, 0xd6, 0x66, 0x66, 0xc3, 0x0, 0x0, - 0x0, 0x0, 0x57, 0x80, 0x4, 0x70, 0x0, 0x0, - 0x0, 0x3, 0x96, 0x0, 0x0, 0x3d, 0x70, 0x0, - 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, - - /* U+8D39 "费" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x10, 0xc1, 0x0, 0x0, 0x3, 0x66, - 0x6e, 0x66, 0xe6, 0x6a, 0x30, 0x0, 0x10, 0xd, - 0x0, 0xd0, 0xb, 0x20, 0x2, 0xb6, 0x6e, 0x66, - 0xe6, 0x6d, 0x10, 0x6, 0x80, 0xd, 0x0, 0xd0, - 0x4, 0x22, 0x6, 0x76, 0xaa, 0x66, 0xe6, 0x66, - 0xc7, 0x0, 0x7, 0x70, 0x0, 0xd0, 0x18, 0xc0, - 0x15, 0x69, 0x66, 0x66, 0x86, 0x95, 0x10, 0x0, - 0xd, 0x0, 0x63, 0x0, 0xd1, 0x0, 0x0, 0xd, - 0x0, 0xc5, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, - 0xf1, 0x0, 0xd0, 0x0, 0x0, 0x7, 0x7, 0xa2, - 0x63, 0x40, 0x0, 0x0, 0x0, 0x6c, 0x10, 0x17, - 0xe8, 0x0, 0x1, 0x58, 0x60, 0x0, 0x0, 0x2e, - 0x40, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8D64 "赤" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x66, 0x66, 0xe6, 0x66, 0xc7, 0x0, 0x0, 0x11, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x36, 0x66, 0x66, - 0x6e, 0x66, 0x66, 0x6e, 0x40, 0x10, 0x0, 0xe0, - 0x2, 0xb0, 0x0, 0x0, 0x0, 0x5c, 0xe, 0x0, - 0x2b, 0x50, 0x0, 0x0, 0xc, 0x51, 0xc0, 0x2, - 0xb1, 0xa2, 0x0, 0x5, 0x70, 0x59, 0x0, 0x2b, - 0x2, 0xe2, 0x1, 0x70, 0xb, 0x30, 0x2, 0xb0, - 0x9, 0x80, 0x40, 0x4, 0xa0, 0x0, 0x2b, 0x0, - 0x12, 0x0, 0x2, 0x90, 0x0, 0x3, 0xb0, 0x0, - 0x0, 0x5, 0x60, 0x0, 0x29, 0xf9, 0x0, 0x0, - 0x2, 0x10, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - - /* U+8D70 "走" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x1, 0x0, 0x0, - 0x0, 0x16, 0x66, 0x6d, 0x76, 0x6d, 0x80, 0x0, - 0x0, 0x1, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x1, 0x0, - 0x16, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x8f, 0x30, - 0x1, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xa0, 0xb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x90, 0xb, 0x20, 0x3, 0x70, 0x0, - 0x0, 0xa, 0x50, 0xb, 0x76, 0x66, 0x61, 0x0, - 0x0, 0xe, 0x60, 0xb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x58, 0x9, 0x2b, 0x20, 0x0, 0x0, 0x0, - 0x0, 0xb0, 0x1, 0xbf, 0x85, 0x43, 0x33, 0x40, - 0x8, 0x10, 0x0, 0x3, 0x7b, 0xde, 0xfe, 0x20, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8D77 "起" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x4, 0x0, - 0x0, 0x56, 0x6d, 0x6d, 0x17, 0x66, 0x6e, 0x10, - 0x0, 0x10, 0xc, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x3, 0x66, 0x6d, 0x6b, 0x78, 0x66, 0x6e, 0x0, - 0x1, 0x10, 0xd, 0x10, 0xd, 0x0, 0x8, 0x0, - 0x0, 0x44, 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x79, 0xd, 0x7, 0xd, 0x0, 0x0, 0x50, - 0x0, 0x94, 0xd, 0x66, 0x2d, 0x0, 0x0, 0x70, - 0x0, 0xb4, 0xd, 0x0, 0xc, 0x21, 0x12, 0xd1, - 0x0, 0xb7, 0x3d, 0x0, 0x3, 0x9a, 0xa9, 0x60, - 0x2, 0x70, 0xae, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x7, 0x10, 0x6, 0xd9, 0x53, 0x22, 0x23, 0x42, - 0x6, 0x0, 0x0, 0x4, 0x8a, 0xce, 0xee, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8D85 "超" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, 0x0, 0xd0, 0x0, 0x67, 0xb6, 0x6a, 0x80, - 0x3, 0x66, 0xe6, 0xb5, 0x0, 0xe0, 0x9, 0x50, - 0x0, 0x10, 0xd0, 0x0, 0x3, 0xa0, 0xa, 0x30, - 0x0, 0x0, 0xd0, 0x0, 0x9, 0x30, 0xc, 0x10, - 0x5, 0x66, 0xe6, 0xb8, 0x38, 0x2, 0xcc, 0x0, - 0x2, 0x0, 0xd0, 0x3, 0x70, 0x0, 0x11, 0x0, - 0x0, 0x71, 0xd0, 0x1, 0x3a, 0x66, 0x6d, 0x40, - 0x0, 0xe0, 0xd0, 0x26, 0x2b, 0x0, 0xd, 0x0, - 0x0, 0xc0, 0xd6, 0x65, 0x3b, 0x0, 0xd, 0x0, - 0x2, 0xb0, 0xd0, 0x0, 0x2b, 0x0, 0xd, 0x0, - 0x4, 0x77, 0xd0, 0x0, 0x2d, 0x66, 0x6e, 0x0, - 0x8, 0x13, 0xe1, 0x0, 0x38, 0x0, 0x5, 0x0, - 0x7, 0x0, 0x2a, 0xa5, 0x31, 0x11, 0x1, 0x10, - 0x32, 0x0, 0x0, 0x26, 0x9b, 0xde, 0xef, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8D8A "越" */ - 0x0, 0x0, 0xa0, 0x0, 0x0, 0x83, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa2, 0x86, 0x0, - 0x3, 0x55, 0xd5, 0xc3, 0x0, 0xa2, 0x1b, 0x0, - 0x1, 0x21, 0xd1, 0x10, 0x96, 0xc7, 0x6b, 0x80, - 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x93, 0x0, 0x0, - 0x16, 0x66, 0xd6, 0x98, 0xd0, 0x84, 0xd, 0x10, - 0x0, 0x0, 0xb2, 0x0, 0xd0, 0x66, 0x5a, 0x0, - 0x0, 0xb3, 0xc1, 0x0, 0xd0, 0x3a, 0xb1, 0x0, - 0x0, 0xd1, 0xc6, 0xa7, 0xd2, 0x2e, 0x80, 0x30, - 0x0, 0xe0, 0xc1, 0x0, 0xe7, 0x1d, 0x80, 0x70, - 0x2, 0xd1, 0xc1, 0x0, 0x60, 0xa2, 0xb8, 0x80, - 0x5, 0x68, 0xd1, 0x0, 0x18, 0x10, 0xb, 0x90, - 0x8, 0x0, 0x7b, 0x73, 0x40, 0x0, 0x0, 0x30, - 0x16, 0x0, 0x1, 0x6b, 0xde, 0xee, 0xff, 0x80, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, - - /* U+8DA3 "趣" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0x12, 0x66, 0x66, 0xb5, 0x0, 0x0, 0x0, - 0xa2, 0x71, 0xc0, 0xc0, 0x0, 0x20, 0x5, 0x6c, - 0x65, 0xc, 0xc, 0x27, 0x6b, 0x60, 0x0, 0xa1, - 0x0, 0xd5, 0xd0, 0x0, 0xc0, 0x26, 0x6c, 0x69, - 0x7c, 0xc, 0x5, 0xc, 0x0, 0x10, 0x66, 0x0, - 0xc0, 0xc0, 0x39, 0x80, 0x4, 0x46, 0x50, 0xd, - 0x6d, 0x0, 0xb4, 0x0, 0x77, 0x69, 0xa3, 0xc0, - 0xc0, 0x1a, 0xb0, 0x8, 0x46, 0x50, 0xc, 0x6d, - 0x58, 0x2a, 0x40, 0xa4, 0x65, 0x1d, 0x82, 0xc2, - 0x40, 0x44, 0xa, 0x4b, 0x50, 0x0, 0xc, 0x10, - 0x0, 0x1, 0x60, 0x3a, 0x73, 0x10, 0x40, 0x0, - 0x12, 0x40, 0x0, 0x3, 0x8c, 0xdf, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8DB3 "足" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x96, 0x66, 0x66, 0x6c, 0x30, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x67, 0xb6, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0x10, 0x2, 0xb0, 0x2, 0x0, 0x0, - 0x0, 0x2, 0x30, 0x2, 0xb0, 0x0, 0x20, 0x0, - 0x0, 0x6, 0xd0, 0x2, 0xd6, 0x67, 0xd3, 0x0, - 0x0, 0xa, 0x60, 0x2, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x81, 0x2, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x76, 0x1b, 0x42, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xa0, 0x0, 0xad, 0xd5, 0x42, 0x23, 0x40, - 0x7, 0x10, 0x0, 0x2, 0x8b, 0xde, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8DDF "跟" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, 0x0, - 0x0, 0xc6, 0x66, 0xe0, 0xc6, 0x66, 0x6f, 0x10, - 0x0, 0xc0, 0x1, 0xa0, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0xc0, 0x1, 0xa0, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0xc0, 0x1, 0xa0, 0xd6, 0x66, 0x6d, 0x0, - 0x0, 0xc6, 0xc7, 0x80, 0xd0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0xd6, 0x66, 0x6d, 0x0, - 0x0, 0xd0, 0xc0, 0x40, 0xd0, 0x60, 0x6, 0x10, - 0x0, 0xc0, 0xc6, 0x82, 0xd0, 0x80, 0xb, 0x80, - 0x0, 0xc0, 0xc0, 0x0, 0xd0, 0x56, 0x94, 0x0, - 0x0, 0xc0, 0xc0, 0x0, 0xd0, 0xc, 0x10, 0x0, - 0x0, 0xc0, 0xc6, 0x51, 0xd0, 0x24, 0xc1, 0x0, - 0x5, 0xeb, 0x70, 0x0, 0xd9, 0x40, 0x5e, 0x82, - 0xa, 0x40, 0x0, 0x0, 0xb4, 0x0, 0x2, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8DEF "路" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, - 0x0, 0xb6, 0x68, 0x90, 0x3c, 0x0, 0x4, 0x0, - 0x0, 0xd0, 0x4, 0x70, 0x88, 0x66, 0x7e, 0x20, - 0x0, 0xd0, 0x4, 0x70, 0xa5, 0x0, 0x95, 0x0, - 0x0, 0xd0, 0x4, 0x75, 0x26, 0x34, 0xb0, 0x0, - 0x0, 0xe6, 0xc8, 0x66, 0x0, 0xbd, 0x10, 0x0, - 0x0, 0x10, 0xc0, 0x0, 0x2, 0xdc, 0x80, 0x0, - 0x1, 0x90, 0xd6, 0x70, 0x3a, 0x10, 0x8e, 0x82, - 0x0, 0xb0, 0xc1, 0x15, 0xc6, 0x66, 0x6c, 0x91, - 0x0, 0xb0, 0xc0, 0x41, 0xa3, 0x0, 0x1c, 0x0, - 0x0, 0xb0, 0xc0, 0x0, 0xa3, 0x0, 0x1c, 0x0, - 0x0, 0xb3, 0xd6, 0x40, 0xa3, 0x0, 0x1c, 0x0, - 0xa, 0xc6, 0x10, 0x0, 0xa7, 0x66, 0x6c, 0x0, - 0x1, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x1b, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+8EAB "身" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x64, 0x0, 0x4, 0x0, 0x0, 0x0, - 0xd, 0x66, 0x66, 0x66, 0xe2, 0x0, 0x0, 0x0, - 0xd1, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xc, - 0x66, 0x66, 0x66, 0xe0, 0x40, 0x0, 0x0, 0xc1, - 0x0, 0x0, 0xe, 0x1e, 0x50, 0x0, 0xc, 0x66, - 0x66, 0x66, 0xeb, 0x50, 0x0, 0x0, 0xc1, 0x0, - 0x0, 0x1e, 0x60, 0x0, 0x36, 0x6d, 0x66, 0x66, - 0x6c, 0xf0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1b, - 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x20, - 0xe0, 0x0, 0x0, 0x0, 0x1, 0x97, 0x0, 0xe, - 0x0, 0x0, 0x0, 0x7, 0x82, 0x0, 0x0, 0xe0, - 0x0, 0x3, 0x56, 0x10, 0x0, 0x17, 0xed, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, - - /* U+8ECA "車" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x0, 0x0, 0x32, 0x0, 0x27, - 0x66, 0x66, 0xd6, 0x66, 0x68, 0x70, 0x0, 0x1, - 0x0, 0xc, 0x0, 0x3, 0x20, 0x0, 0x0, 0xd6, - 0x66, 0xd6, 0x66, 0xb8, 0x0, 0x0, 0xd, 0x0, - 0xc, 0x0, 0x9, 0x40, 0x0, 0x0, 0xd6, 0x66, - 0xd6, 0x66, 0xb4, 0x0, 0x0, 0xd, 0x0, 0xc, - 0x0, 0x9, 0x40, 0x0, 0x0, 0xd6, 0x66, 0xd6, - 0x66, 0xb4, 0x0, 0x0, 0xa, 0x0, 0xc, 0x0, - 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0xa2, 0x17, 0x66, 0x66, 0x6d, 0x66, 0x66, - 0x67, 0x50, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, - - /* U+8EDF "軟" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc3, 0x0, 0x4, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xc0, 0x22, 0x7, 0x70, 0x0, 0x0, - 0x4, 0x76, 0xd6, 0x77, 0xb, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xc0, 0x20, 0x1d, 0x66, 0x69, 0xc0, - 0x2, 0xc6, 0xd6, 0xd4, 0x73, 0x83, 0x9, 0x30, - 0x1, 0xb0, 0xc0, 0xc0, 0x70, 0xc3, 0x2, 0x0, - 0x1, 0xd6, 0xd6, 0xd3, 0x0, 0xc4, 0x0, 0x0, - 0x1, 0xb0, 0xc0, 0xc0, 0x0, 0xd6, 0x0, 0x0, - 0x1, 0xd6, 0xd6, 0xd0, 0x1, 0xc7, 0x0, 0x0, - 0x1, 0x70, 0xc0, 0x50, 0x6, 0x88, 0x20, 0x0, - 0x5, 0x66, 0xd6, 0x7c, 0x1c, 0x13, 0x90, 0x0, - 0x1, 0x0, 0xc0, 0x0, 0x67, 0x0, 0xc4, 0x0, - 0x0, 0x0, 0xc0, 0x4, 0x90, 0x0, 0x2e, 0x60, - 0x0, 0x0, 0xd0, 0x46, 0x0, 0x0, 0x4, 0xa2, - 0x0, 0x0, 0x40, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+8EE2 "転" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc0, 0x13, 0x0, 0x0, 0x5, 0x0, - 0x4, 0x76, 0xd6, 0x77, 0x28, 0x66, 0x69, 0x20, - 0x0, 0x0, 0xc0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x2, 0xc6, 0xd6, 0xc5, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xb0, 0xc0, 0xa1, 0x0, 0x0, 0x0, 0x30, - 0x1, 0xd6, 0xd6, 0xc3, 0x86, 0x76, 0x66, 0xa2, - 0x1, 0xb0, 0xc0, 0xa1, 0x0, 0x79, 0x0, 0x0, - 0x1, 0xd6, 0xd6, 0xc2, 0x0, 0xc1, 0x0, 0x0, - 0x1, 0x80, 0xc0, 0x51, 0x4, 0x70, 0x10, 0x0, - 0x5, 0x66, 0xd6, 0x9b, 0x9, 0x0, 0x37, 0x0, - 0x1, 0x0, 0xc0, 0x0, 0x72, 0x0, 0x8, 0x70, - 0x0, 0x0, 0xc0, 0x3, 0xec, 0x98, 0x65, 0xe0, - 0x0, 0x0, 0xd0, 0x0, 0x30, 0x0, 0x0, 0x60, - 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8EFD "軽" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x15, 0x0, - 0x0, 0xa, 0x20, 0x54, 0x86, 0x66, 0xbb, 0x0, - 0x7, 0x6c, 0x76, 0x82, 0x32, 0x1, 0xc0, 0x0, - 0x1, 0xa, 0x20, 0x20, 0x8, 0xa, 0x30, 0x0, - 0xb, 0x7c, 0x76, 0xf1, 0x4, 0xc6, 0x0, 0x0, - 0xa, 0x2a, 0x20, 0xc0, 0x7, 0xaa, 0x10, 0x0, - 0xa, 0x7c, 0x76, 0xc0, 0x84, 0x3, 0xda, 0x50, - 0xa, 0x2a, 0x20, 0xd5, 0x0, 0xc4, 0x6, 0x10, - 0xa, 0x7c, 0x76, 0xc0, 0x0, 0xd0, 0x1, 0x0, - 0x8, 0x1a, 0x20, 0x52, 0x75, 0xe5, 0x7b, 0x10, - 0x26, 0x6c, 0x76, 0xa7, 0x0, 0xd0, 0x0, 0x0, - 0x1, 0xa, 0x20, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xa, 0x20, 0x0, 0x0, 0xd0, 0x3, 0x20, - 0x0, 0xa, 0x20, 0x27, 0x66, 0x96, 0x69, 0x70, - 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8F03 "較" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x80, 0x0, 0x1, 0xa2, 0x0, 0x0, - 0x0, 0xa, 0x20, 0x40, 0x0, 0x4b, 0x0, 0x0, - 0x7, 0x6c, 0x76, 0x92, 0x11, 0x13, 0x17, 0x20, - 0x0, 0xa, 0x20, 0x22, 0x68, 0x65, 0x55, 0x30, - 0xa, 0x7c, 0x76, 0xe2, 0xc, 0x60, 0x64, 0x0, - 0xa, 0x2a, 0x20, 0xc0, 0x58, 0x0, 0x8, 0xa0, - 0xa, 0x7c, 0x76, 0xc1, 0xa2, 0x0, 0x50, 0xc1, - 0xa, 0x2a, 0x20, 0xc7, 0x6, 0x0, 0xe3, 0x0, - 0xa, 0x7c, 0x76, 0xc0, 0x7, 0x14, 0x90, 0x0, - 0x8, 0x1a, 0x20, 0x50, 0x2, 0x9b, 0x20, 0x0, - 0x26, 0x6c, 0x76, 0xb7, 0x0, 0xaa, 0x0, 0x0, - 0x1, 0xa, 0x20, 0x0, 0x4, 0xac, 0x40, 0x0, - 0x0, 0xa, 0x20, 0x0, 0x77, 0x1, 0xd9, 0x30, - 0x0, 0xa, 0x20, 0x37, 0x20, 0x0, 0x9, 0x40, - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8F09 "載" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x10, 0x3, 0xc3, 0x10, 0x0, - 0x0, 0x56, 0x6d, 0x6d, 0x33, 0xa0, 0xc3, 0x0, - 0x0, 0x10, 0xb, 0x0, 0x3, 0xa0, 0x43, 0x30, - 0x17, 0x66, 0x6a, 0x66, 0x67, 0xc6, 0x67, 0xb2, - 0x0, 0x0, 0x1c, 0x3, 0x12, 0xa0, 0x0, 0x0, - 0x2, 0x76, 0x6d, 0x68, 0x61, 0xa0, 0x4, 0x0, - 0x0, 0x86, 0x6d, 0x69, 0x30, 0xc0, 0xe, 0x40, - 0x0, 0xd0, 0xb, 0xc, 0x10, 0xd0, 0x4a, 0x0, - 0x0, 0xd6, 0x6d, 0x6d, 0x0, 0xc0, 0xc3, 0x0, - 0x0, 0xd0, 0xb, 0xc, 0x0, 0x8a, 0xa0, 0x0, - 0x0, 0xc6, 0x6d, 0x69, 0x0, 0x4f, 0x10, 0x0, - 0x5, 0x66, 0x6d, 0x69, 0xa1, 0xcc, 0x50, 0x5, - 0x1, 0x0, 0xb, 0x0, 0x2a, 0x21, 0xd5, 0x44, - 0x0, 0x0, 0x1c, 0x5, 0x70, 0x0, 0x1c, 0xe4, - 0x0, 0x0, 0x4, 0x1, 0x0, 0x0, 0x0, 0x43, - - /* U+8F15 "輕" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0xa, 0x20, 0x52, 0x76, 0x66, 0x6a, 0x70, - 0x17, 0x6c, 0x76, 0x82, 0x46, 0x57, 0xb, 0x30, - 0x1, 0xa, 0x20, 0x20, 0x93, 0xa3, 0x4b, 0x0, - 0xb, 0x7c, 0x76, 0xe3, 0x80, 0x60, 0x90, 0x0, - 0xa, 0x2a, 0x20, 0xc3, 0x51, 0x70, 0x92, 0x0, - 0xa, 0x7c, 0x76, 0xc0, 0x95, 0x77, 0x1e, 0x20, - 0xa, 0x2a, 0x20, 0xc0, 0x3b, 0x28, 0x6, 0x30, - 0xa, 0x4a, 0x32, 0xc0, 0x0, 0x0, 0x8, 0x0, - 0xa, 0x5b, 0x54, 0x80, 0x66, 0xd6, 0x66, 0x30, - 0x36, 0x6c, 0x76, 0x79, 0x0, 0xc1, 0x0, 0x0, - 0x1, 0xa, 0x20, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x0, 0xa, 0x20, 0x0, 0x0, 0xc1, 0x0, 0x10, - 0x0, 0xa, 0x20, 0x16, 0x66, 0xd6, 0x68, 0xe2, - 0x0, 0x9, 0x20, 0x1, 0x0, 0x0, 0x0, 0x0, - - /* U+8F2A "輪" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0x30, 0x0, 0x1, 0xe2, 0x0, 0x0, - 0x0, 0xc, 0x5, 0x10, 0x6, 0xb2, 0x0, 0x0, - 0x7, 0x6d, 0x66, 0x40, 0xd, 0x29, 0x0, 0x0, - 0x1, 0xc, 0x2, 0x0, 0x87, 0x3, 0xb0, 0x0, - 0xc, 0x6d, 0x6d, 0x44, 0x80, 0x1, 0xae, 0x70, - 0xb, 0x1c, 0xc, 0x45, 0x37, 0x66, 0x54, 0x10, - 0xb, 0x6d, 0x6d, 0x12, 0x0, 0x0, 0x4, 0x0, - 0xb, 0x1c, 0xc, 0xc, 0x6c, 0x6c, 0x6d, 0x30, - 0xb, 0x6d, 0x6d, 0xc, 0xb, 0xb, 0xc, 0x0, - 0x8, 0xc, 0x5, 0xc, 0xb, 0xb, 0xc, 0x0, - 0x26, 0x6d, 0x6b, 0x7c, 0x6c, 0x6c, 0x6d, 0x0, - 0x1, 0xc, 0x0, 0xc, 0xb, 0xb, 0xc, 0x0, - 0x0, 0xc, 0x0, 0xc, 0xb, 0xb, 0xc, 0x0, - 0x0, 0xc, 0x0, 0xc, 0x7, 0x6, 0x7d, 0x0, - 0x0, 0x5, 0x0, 0x2, 0x0, 0x0, 0x2, 0x0, - - /* U+8F38 "輸" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0x30, 0x0, 0x3, 0xb1, 0x0, 0x0, - 0x0, 0xc, 0x2, 0x0, 0x9, 0xb4, 0x0, 0x0, - 0x17, 0x6d, 0x69, 0x50, 0x2e, 0x27, 0x10, 0x0, - 0x0, 0xc, 0x1, 0x0, 0xc5, 0x2, 0xb1, 0x0, - 0xb, 0x6d, 0x6d, 0x58, 0x77, 0x68, 0x8e, 0x70, - 0xc, 0x1c, 0xc, 0x54, 0x0, 0x10, 0x6, 0x20, - 0xb, 0x6d, 0x6d, 0xb, 0x66, 0xd1, 0xc, 0x0, - 0xb, 0x1c, 0xc, 0xc, 0x1, 0xba, 0x2b, 0x0, - 0xc, 0x6d, 0x6d, 0xc, 0x56, 0xbb, 0xb, 0x0, - 0x9, 0xc, 0x5, 0xc, 0x1, 0xbb, 0xb, 0x0, - 0x26, 0x6d, 0x6b, 0x8c, 0x66, 0xbb, 0xb, 0x0, - 0x1, 0xc, 0x0, 0xc, 0x1, 0xba, 0x1b, 0x0, - 0x0, 0xc, 0x0, 0xc, 0x1, 0xb0, 0xb, 0x0, - 0x0, 0xc, 0x10, 0xc, 0x3b, 0x83, 0xab, 0x0, - 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8F9B "辛" */ - 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf4, 0x0, 0x1, 0x0, 0x0, - 0x46, 0x66, 0x6c, 0x76, 0x68, 0xd1, 0x0, 0x0, - 0x2, 0x20, 0x0, 0x39, 0x0, 0x0, 0x0, 0x0, - 0xc, 0x30, 0x8, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x7a, 0x0, 0xa0, 0x0, 0x10, 0x5, 0x66, 0x67, - 0x96, 0x88, 0x66, 0x7f, 0x40, 0x10, 0x0, 0x0, - 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, - 0x0, 0x68, 0x0, 0x0, 0x47, 0x66, 0x6d, 0x86, - 0x66, 0x61, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - 0x0, - - /* U+8F9E "辞" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x30, 0x1, 0xb0, 0x0, 0x0, - 0x0, 0x26, 0xad, 0xa0, 0x0, 0x92, 0x2, 0x0, - 0x3, 0x43, 0xd0, 0x5, 0x76, 0x66, 0x69, 0x30, - 0x0, 0x0, 0xd0, 0x0, 0x40, 0x0, 0x92, 0x0, - 0x0, 0x0, 0xd0, 0x51, 0x49, 0x2, 0xe1, 0x0, - 0x6, 0x66, 0xe6, 0x63, 0xe, 0x7, 0x40, 0x0, - 0x0, 0x0, 0xd0, 0x1, 0x12, 0x18, 0x13, 0x50, - 0x0, 0x10, 0xd0, 0x36, 0x54, 0xd4, 0x44, 0x40, - 0x1, 0xe6, 0x76, 0xe0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xd0, 0x1, 0xb0, 0x0, 0xd0, 0x6, 0x0, - 0x0, 0xd0, 0x1, 0xb5, 0x76, 0xe6, 0x66, 0x10, - 0x0, 0xd0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0xe6, 0x66, 0xb0, 0x0, 0xd0, 0x0, 0x0, - 0x1, 0xb0, 0x0, 0x40, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, - - /* U+8FA6 "辦" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x43, 0x0, 0xb, 0x20, 0x6, 0x50, 0x0, - 0x0, 0xe, 0x0, 0xc, 0x0, 0x0, 0xd0, 0x0, - 0x5, 0x6b, 0x95, 0xc, 0x1, 0x66, 0x78, 0x90, - 0x1, 0x0, 0x72, 0x6d, 0x6d, 0x20, 0x5, 0x20, - 0x1, 0xa0, 0xc0, 0xb, 0xb, 0x19, 0xc, 0x30, - 0x0, 0xa4, 0x50, 0xb, 0xb, 0xc, 0x28, 0x0, - 0x7, 0x6b, 0x7a, 0x2a, 0xb, 0x56, 0x96, 0xd2, - 0x0, 0xc, 0x0, 0x47, 0x19, 0x10, 0xc0, 0x0, - 0x0, 0xc, 0x10, 0x83, 0x28, 0x0, 0xc0, 0x0, - 0x5, 0x6c, 0x74, 0xb0, 0x47, 0x46, 0xd7, 0xa0, - 0x0, 0x38, 0x4, 0x60, 0x65, 0x10, 0xc0, 0x0, - 0x0, 0x83, 0xa, 0x0, 0xa2, 0x0, 0xc0, 0x0, - 0x1, 0x90, 0x72, 0x3c, 0xc0, 0x0, 0xc0, 0x0, - 0x7, 0x15, 0x30, 0x1, 0x0, 0x0, 0xd0, 0x0, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, - - /* U+8FB2 "農" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xd0, 0xd, 0x20, 0x10, 0x0, - 0x0, 0xe, 0x66, 0xd6, 0x6e, 0x66, 0xd3, 0x0, - 0x0, 0xd, 0x0, 0xb0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x66, 0xd6, 0x6e, 0x66, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0xb0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xb, 0x66, 0x76, 0x67, 0x66, 0xa0, 0x0, - 0x0, 0x9, 0x66, 0x66, 0x66, 0x66, 0xb8, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0x0, 0xd, 0x47, 0x66, 0x66, 0x68, 0x10, 0x0, - 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x7d, 0x20, - 0x0, 0x1c, 0xb, 0x11, 0x50, 0x4, 0x60, 0x0, - 0x0, 0x67, 0xb, 0x10, 0x47, 0x3a, 0x20, 0x0, - 0x0, 0xb0, 0xb, 0x11, 0x43, 0xd5, 0x0, 0x0, - 0x7, 0x20, 0xe, 0xc6, 0x0, 0x19, 0xeb, 0x60, - 0x21, 0x0, 0x4, 0x0, 0x0, 0x0, 0x5, 0x0, - - /* U+8FBA "辺" */ - 0x0, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0x20, 0x0, 0x0, 0x0, 0x7, 0x0, - 0x0, 0xa, 0x34, 0x76, 0xb9, 0x66, 0x6d, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x1b, 0x0, - 0x0, 0x7, 0x0, 0x0, 0xc1, 0x0, 0x2a, 0x0, - 0x27, 0x6e, 0x30, 0x0, 0xd0, 0x0, 0x39, 0x0, - 0x0, 0xd, 0x0, 0x4, 0x90, 0x0, 0x48, 0x0, - 0x0, 0xd, 0x0, 0x9, 0x40, 0x0, 0x67, 0x0, - 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0x76, 0x0, - 0x0, 0xd, 0x0, 0x82, 0x0, 0x0, 0xb3, 0x0, - 0x0, 0xd, 0x4, 0x50, 0x2, 0x56, 0xe0, 0x0, - 0x2, 0xa9, 0x74, 0x0, 0x0, 0x2d, 0x40, 0x0, - 0x2e, 0x30, 0x4b, 0x41, 0x0, 0x0, 0x1, 0x21, - 0x2, 0x0, 0x1, 0x8c, 0xef, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+8FBC "込" */ - 0x0, 0x50, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x6c, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x30, 0x0, 0x33, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, - 0x17, 0x6e, 0x50, 0x0, 0x79, 0x50, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xd0, 0xa0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x7, 0x60, 0x74, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x2a, 0x0, 0x1d, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x90, 0x0, 0x7, 0xb0, 0x0, - 0x0, 0xd, 0x6, 0x0, 0x0, 0x0, 0xbd, 0x40, - 0x2, 0xaa, 0x80, 0x0, 0x0, 0x0, 0x8, 0x40, - 0x1e, 0x50, 0x4a, 0x41, 0x0, 0x0, 0x0, 0x10, - 0x2, 0x0, 0x1, 0x7b, 0xde, 0xee, 0xff, 0x71, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8FCE "迎" */ - 0x0, 0x30, 0x0, 0x0, 0x1a, 0x10, 0x0, 0x0, - 0x0, 0x69, 0x0, 0x56, 0x84, 0x10, 0x1, 0x0, - 0x0, 0xf, 0x10, 0xd0, 0x0, 0xd6, 0x6d, 0x30, - 0x0, 0x2, 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0x1, 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, - 0x7, 0x6e, 0x20, 0xd0, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xd0, 0x2, 0xd0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xd7, 0x70, 0xd0, 0xd, 0x0, - 0x0, 0xd, 0x1, 0xf6, 0x0, 0xd3, 0xad, 0x0, - 0x0, 0xd, 0x0, 0x10, 0x0, 0xd0, 0x11, 0x0, - 0x4, 0xb6, 0x80, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x2d, 0x10, 0x2a, 0x74, 0x32, 0x42, 0x24, 0x51, - 0x0, 0x0, 0x0, 0x37, 0xab, 0xcd, 0xdd, 0x30, - - /* U+8FD1 "近" */ - 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x62, 0x0, - 0x0, 0x4b, 0x0, 0x16, 0x47, 0x9a, 0x85, 0x0, - 0x0, 0xc, 0x20, 0x1c, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x1c, 0x0, 0x0, 0x2, 0x30, - 0x18, 0x6e, 0x30, 0x1d, 0x66, 0x6c, 0x67, 0x60, - 0x0, 0xd, 0x0, 0x1b, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x39, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x65, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xa0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xd, 0x4, 0x50, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x5a, 0x43, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x9, 0x80, 0x49, 0x30, 0x0, 0x2, 0x0, 0x10, - 0x19, 0x0, 0x1, 0x8c, 0xde, 0xff, 0xff, 0x91, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+8FD4 "返" */ - 0x0, 0x30, 0x0, 0x0, 0x0, 0x3, 0x80, 0x0, - 0x0, 0x3b, 0x0, 0x65, 0x78, 0x99, 0x82, 0x0, - 0x0, 0xc, 0x30, 0xa3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa8, 0x66, 0x66, 0xc2, 0x0, - 0x17, 0x6c, 0x30, 0xb2, 0x0, 0x2, 0xd0, 0x0, - 0x1, 0xd, 0x0, 0xc3, 0x10, 0x9, 0x50, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0x47, 0x3c, 0x0, 0x0, - 0x0, 0xd, 0x1, 0xa0, 0x1, 0xf9, 0x0, 0x0, - 0x0, 0xd, 0x6, 0x30, 0x9, 0x68, 0xc1, 0x0, - 0x0, 0xd, 0x8, 0x0, 0x95, 0x0, 0x8b, 0x0, - 0x0, 0x1c, 0x40, 0x37, 0x10, 0x0, 0x5, 0x0, - 0x7, 0x90, 0x58, 0x51, 0x0, 0x0, 0x1, 0x20, - 0x19, 0x0, 0x1, 0x7c, 0xef, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8FEB "迫" */ - 0x0, 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, - 0x0, 0x74, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, - 0x0, 0xf, 0x30, 0x10, 0x80, 0x0, 0x30, 0x0, - 0x0, 0x9, 0x20, 0xb7, 0x76, 0x66, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xe0, 0x0, - 0x14, 0x4a, 0x20, 0xb3, 0x0, 0x0, 0xe0, 0x0, - 0x3, 0x1d, 0x10, 0xb7, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0xb7, 0x66, 0x66, 0xe0, 0x0, - 0x1, 0x99, 0x80, 0x91, 0x0, 0x0, 0x90, 0x0, - 0x2e, 0x40, 0x3a, 0x64, 0x22, 0x22, 0x34, 0x50, - 0x3, 0x0, 0x0, 0x58, 0xbc, 0xde, 0xee, 0x30, - - /* U+8FFD "追" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, - 0x0, 0x95, 0x0, 0x0, 0x56, 0x0, 0x10, 0x0, - 0x0, 0x2f, 0x0, 0xb6, 0x86, 0x66, 0xe1, 0x0, - 0x0, 0x6, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, - 0x16, 0x6b, 0x30, 0xc6, 0x55, 0x55, 0xd0, 0x0, - 0x1, 0xd, 0x0, 0xc0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0xd, 0x0, 0xc6, 0x66, 0x66, 0x98, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0x0, 0x0, 0x76, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0x0, 0x0, 0x76, 0x0, - 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0xa6, 0x0, - 0x1, 0x99, 0x70, 0xd0, 0x0, 0x0, 0x64, 0x0, - 0x2e, 0x40, 0x3a, 0x61, 0x0, 0x0, 0x0, 0x20, - 0x4, 0x0, 0x1, 0x7b, 0xde, 0xee, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, - - /* U+9000 "退" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x87, 0x0, 0x4a, 0x66, 0x66, 0xe1, 0x0, - 0x0, 0x1f, 0x0, 0x3a, 0x0, 0x0, 0xe0, 0x0, - 0x0, 0x2, 0x0, 0x3c, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0xe0, 0x0, - 0x6, 0x6c, 0x30, 0x3a, 0x0, 0x0, 0xe0, 0x0, - 0x1, 0xe, 0x0, 0x3c, 0x66, 0x66, 0xb2, 0x0, - 0x0, 0xe, 0x0, 0x3a, 0x10, 0x0, 0x8a, 0x0, - 0x0, 0xe, 0x0, 0x3a, 0x6, 0x77, 0x30, 0x0, - 0x0, 0xe, 0x0, 0x3a, 0x1, 0x4b, 0x70, 0x0, - 0x0, 0xe, 0x0, 0x3c, 0x85, 0x0, 0xab, 0x0, - 0x2, 0x97, 0x80, 0x3d, 0x20, 0x0, 0x9, 0x0, - 0x1e, 0x20, 0x1a, 0x74, 0x21, 0x11, 0x23, 0x41, - 0x0, 0x0, 0x0, 0x59, 0xbd, 0xef, 0xff, 0x40, - - /* U+9001 "送" */ - 0x0, 0x20, 0x0, 0x14, 0x0, 0x7, 0x30, 0x0, - 0x0, 0x78, 0x0, 0x9, 0x60, 0xd, 0x20, 0x0, - 0x0, 0xf, 0x10, 0x3, 0xb0, 0x46, 0x0, 0x0, - 0x0, 0x3, 0x0, 0x56, 0x66, 0xa6, 0x7c, 0x10, - 0x0, 0x0, 0x0, 0x10, 0xb, 0x20, 0x0, 0x0, - 0x27, 0x6d, 0x10, 0x0, 0xc, 0x10, 0x2, 0x10, - 0x0, 0xd, 0x6, 0x66, 0x6e, 0x66, 0x6a, 0x80, - 0x0, 0xd, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x6b, 0x60, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x1, 0xc1, 0x2c, 0x60, 0x0, - 0x0, 0xd, 0x0, 0xa, 0x20, 0x1, 0xd7, 0x0, - 0x0, 0x8b, 0x62, 0x71, 0x0, 0x0, 0x28, 0x0, - 0x2d, 0x50, 0x5b, 0x40, 0x0, 0x0, 0x1, 0x21, - 0x4, 0x0, 0x1, 0x8c, 0xcd, 0xee, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+9003 "逃" */ - 0x0, 0x10, 0x0, 0x0, 0x91, 0x92, 0x0, 0x0, - 0x0, 0x76, 0x0, 0x0, 0xd0, 0xd0, 0x0, 0x0, - 0x0, 0x1f, 0x4, 0x10, 0xd0, 0xd0, 0x3e, 0x10, - 0x0, 0x4, 0x1, 0xd0, 0xd0, 0xd2, 0xa1, 0x0, - 0x0, 0x0, 0x0, 0xa0, 0xd0, 0xd5, 0x0, 0x0, - 0x5, 0x6c, 0x20, 0x0, 0xd0, 0xd0, 0x0, 0x0, - 0x1, 0xd, 0x0, 0x7, 0xe0, 0xd7, 0x92, 0x0, - 0x0, 0xd, 0x5, 0xa1, 0xd0, 0xd0, 0x6d, 0x0, - 0x0, 0xd, 0x1b, 0x13, 0xa0, 0xd0, 0x3, 0x20, - 0x0, 0xd, 0x0, 0x9, 0x30, 0xd0, 0x0, 0x60, - 0x0, 0xd, 0x0, 0x37, 0x0, 0xc3, 0x14, 0xb0, - 0x0, 0x4b, 0x42, 0x50, 0x0, 0x49, 0x99, 0x50, - 0xc, 0x70, 0x59, 0x41, 0x0, 0x0, 0x12, 0x31, - 0x3, 0x0, 0x1, 0x7b, 0xde, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+900F "透" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x60, 0x0, - 0x0, 0x93, 0x0, 0x45, 0x7d, 0x75, 0x30, 0x0, - 0x0, 0x3e, 0x0, 0x0, 0xc, 0x0, 0x5, 0x10, - 0x0, 0x4, 0x7, 0x66, 0xce, 0x96, 0x67, 0x50, - 0x0, 0x0, 0x0, 0x7, 0x6c, 0x28, 0x0, 0x0, - 0x14, 0x4a, 0x10, 0x75, 0xc, 0x3, 0xc8, 0x40, - 0x3, 0x1d, 0x26, 0x76, 0x6a, 0x69, 0x28, 0x40, - 0x0, 0xd, 0x0, 0x12, 0xc0, 0xc, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x3, 0x90, 0x7a, 0xa5, 0x0, - 0x0, 0xd, 0x0, 0x9, 0x20, 0x10, 0xa3, 0x0, - 0x0, 0xd, 0x0, 0x38, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x6b, 0x32, 0x60, 0x2, 0x8b, 0x90, 0x0, - 0x1d, 0x50, 0x59, 0x30, 0x0, 0x17, 0x0, 0x10, - 0x5, 0x0, 0x2, 0x8c, 0xde, 0xee, 0xef, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, - - /* U+9010 "逐" */ - 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x6a, 0x2, 0x76, 0x67, 0x76, 0x6a, 0xa0, - 0x0, 0xe, 0x10, 0x0, 0x1c, 0x20, 0x0, 0x0, - 0x0, 0x1, 0x0, 0x1, 0xa7, 0x0, 0x9, 0x30, - 0x0, 0x0, 0x0, 0x37, 0x6, 0x50, 0x88, 0x10, - 0x16, 0x6c, 0x32, 0x20, 0x2b, 0xc7, 0x20, 0x0, - 0x0, 0xd, 0x0, 0x4, 0x80, 0x85, 0x0, 0x0, - 0x0, 0xd, 0x1, 0x64, 0x2, 0xeb, 0x70, 0x0, - 0x0, 0xd, 0x2, 0x0, 0x3c, 0x5a, 0x3d, 0x20, - 0x0, 0xd, 0x0, 0x7, 0x90, 0x3a, 0x6, 0xc0, - 0x0, 0xd, 0x3, 0x73, 0x0, 0x68, 0x0, 0x60, - 0x0, 0x78, 0x61, 0x0, 0x5b, 0xe2, 0x0, 0x0, - 0x1d, 0x40, 0x39, 0x41, 0x3, 0x30, 0x0, 0x0, - 0x4, 0x0, 0x1, 0x7b, 0xde, 0xee, 0xef, 0xa1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, - - /* U+9019 "這" */ - 0x0, 0x70, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, - 0x0, 0x5d, 0x0, 0x0, 0x7, 0x70, 0x0, 0x0, - 0x0, 0xb, 0x3, 0x66, 0x67, 0x76, 0x8d, 0x10, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x26, 0x66, 0x67, 0xd1, 0x0, - 0x18, 0x6f, 0x40, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x17, 0x66, 0x67, 0xc0, 0x0, - 0x0, 0xd, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x39, 0x66, 0x66, 0xc4, 0x0, - 0x0, 0xd, 0x0, 0x2a, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0x2a, 0x0, 0x0, 0xd0, 0x0, - 0x3, 0xb8, 0x70, 0x2c, 0x66, 0x66, 0xe0, 0x0, - 0x3e, 0x10, 0x2a, 0x76, 0x0, 0x0, 0x11, 0x31, - 0x1, 0x0, 0x0, 0x5a, 0xce, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+901A "通" */ - 0x0, 0x10, 0x0, 0x56, 0x66, 0x66, 0xa2, 0x0, - 0x0, 0xb4, 0x0, 0x11, 0x20, 0x8, 0x83, 0x0, - 0x0, 0x4c, 0x0, 0x0, 0x4c, 0x61, 0x0, 0x0, - 0x0, 0x3, 0x1, 0xa6, 0x6d, 0x86, 0x6c, 0x10, - 0x0, 0x0, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, - 0x17, 0x6d, 0x30, 0xc0, 0xd, 0x0, 0xd, 0x0, - 0x1, 0xd, 0x0, 0xd6, 0x6e, 0x66, 0x6d, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xd6, 0x6e, 0x66, 0x6d, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, - 0x0, 0x6a, 0x51, 0xa0, 0x8, 0x5, 0xcb, 0x0, - 0x1c, 0x60, 0x49, 0x41, 0x0, 0x0, 0x22, 0x21, - 0x6, 0x0, 0x1, 0x7b, 0xef, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, - - /* U+901F "速" */ - 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, - 0x1, 0x91, 0x0, 0x0, 0xd, 0x0, 0x2, 0x0, - 0x0, 0x7c, 0x7, 0x66, 0x6e, 0x66, 0x6a, 0x30, - 0x0, 0x16, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa6, 0x6e, 0x66, 0xd4, 0x0, - 0x1, 0x16, 0x10, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x17, 0x5d, 0x20, 0xd0, 0xd, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xc6, 0x9f, 0x66, 0xc0, 0x0, - 0x0, 0xd, 0x0, 0x11, 0xbe, 0x51, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xa, 0x2d, 0x1a, 0xa1, 0x0, - 0x0, 0xd, 0x1, 0x81, 0xd, 0x0, 0x7d, 0x0, - 0x0, 0x7a, 0x65, 0x0, 0xe, 0x0, 0x4, 0x0, - 0x1d, 0x50, 0x49, 0x30, 0x8, 0x0, 0x1, 0x21, - 0x3, 0x0, 0x1, 0x7c, 0xde, 0xef, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9020 "造" */ - 0x0, 0x10, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, - 0x0, 0xa6, 0x0, 0x2b, 0x1d, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0x0, 0x5b, 0xd, 0x0, 0x81, 0x0, - 0x0, 0x4, 0x0, 0x96, 0x6e, 0x66, 0x63, 0x0, - 0x0, 0x0, 0x0, 0x70, 0xd, 0x0, 0x0, 0x0, - 0x3, 0x39, 0x12, 0x0, 0xd, 0x0, 0x7, 0x40, - 0x5, 0x3d, 0x16, 0x66, 0x66, 0x66, 0x66, 0x50, - 0x0, 0xd, 0x0, 0x9, 0x66, 0x66, 0xa2, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, - 0x2, 0xa9, 0x50, 0xe, 0x66, 0x66, 0xd0, 0x0, - 0x2e, 0x30, 0x5a, 0x43, 0x0, 0x0, 0x0, 0x11, - 0x2, 0x0, 0x1, 0x8b, 0xdd, 0xef, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9023 "連" */ - 0x0, 0x50, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, - 0x0, 0x5a, 0x0, 0x0, 0xc, 0x0, 0x25, 0x0, - 0x0, 0xd, 0x13, 0x76, 0x6d, 0x66, 0x65, 0x0, - 0x0, 0x0, 0x0, 0x86, 0x6d, 0x66, 0xa3, 0x0, - 0x0, 0x4, 0x0, 0xc0, 0xc, 0x0, 0xb1, 0x0, - 0x27, 0x5e, 0x40, 0xc6, 0x6d, 0x66, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0xc, 0x0, 0xb0, 0x0, - 0x0, 0xd, 0x0, 0xc6, 0x6d, 0x66, 0xd1, 0x0, - 0x0, 0xd, 0x0, 0x70, 0xc, 0x0, 0x50, 0x0, - 0x0, 0xd, 0x26, 0x66, 0x6d, 0x66, 0x6c, 0x50, - 0x0, 0x1e, 0x1, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x6, 0xc5, 0x91, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x2d, 0x10, 0x2b, 0x84, 0x27, 0x22, 0x34, 0x50, - 0x0, 0x0, 0x0, 0x38, 0xab, 0xcc, 0xcc, 0x20, - - /* U+902E "逮" */ - 0x0, 0x20, 0x0, 0x0, 0xb, 0x10, 0x0, 0x0, - 0x0, 0x78, 0x0, 0x0, 0xd, 0x0, 0x50, 0x0, - 0x0, 0xe, 0x10, 0x76, 0x6e, 0x66, 0xe2, 0x0, - 0x0, 0x1, 0x0, 0x0, 0xd, 0x0, 0xe3, 0x40, - 0x0, 0x0, 0x7, 0x66, 0x6e, 0x66, 0xe6, 0x50, - 0x17, 0x6e, 0x40, 0x56, 0x6e, 0x66, 0xe0, 0x0, - 0x0, 0xd, 0x1, 0x40, 0xd, 0x0, 0x40, 0x0, - 0x0, 0xd, 0x0, 0x7b, 0xd, 0x8, 0xc0, 0x0, - 0x0, 0xd, 0x0, 0x5, 0x3d, 0x73, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x58, 0x3d, 0x78, 0x20, 0x0, - 0x0, 0xd, 0xd, 0x70, 0xd, 0x1, 0xc8, 0x0, - 0x0, 0x87, 0x50, 0x7, 0x8d, 0x0, 0x7, 0x0, - 0x1c, 0x30, 0x49, 0x30, 0x86, 0x0, 0x0, 0x10, - 0x4, 0x0, 0x1, 0x8c, 0xdd, 0xde, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+9031 "週" */ - 0x0, 0x71, 0x0, 0x40, 0x0, 0x0, 0x5, 0x0, - 0x0, 0x2e, 0x20, 0xd6, 0x6a, 0xb6, 0x6e, 0x10, - 0x0, 0x8, 0x30, 0xc0, 0x7, 0x54, 0xc, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0x7a, 0x97, 0x1c, 0x0, - 0x0, 0x6, 0x0, 0xc0, 0x7, 0x52, 0xc, 0x0, - 0x27, 0x6e, 0x30, 0xb4, 0x77, 0x68, 0x5c, 0x0, - 0x0, 0xd, 0x0, 0xb0, 0x86, 0x6a, 0xc, 0x0, - 0x0, 0xd, 0x0, 0xa0, 0xc0, 0xc, 0xc, 0x0, - 0x0, 0xd, 0x2, 0x60, 0xc0, 0xb, 0xc, 0x0, - 0x0, 0xd, 0x6, 0x20, 0xd6, 0x6b, 0xc, 0x0, - 0x0, 0xd, 0x7, 0x0, 0x40, 0x0, 0xb, 0x0, - 0x3, 0xa8, 0x82, 0x0, 0x0, 0x15, 0xd8, 0x0, - 0x2e, 0x20, 0x4a, 0x41, 0x0, 0x0, 0x10, 0x11, - 0x2, 0x0, 0x1, 0x7b, 0xde, 0xee, 0xff, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9032 "進" */ - 0x0, 0x51, 0x0, 0x1a, 0x27, 0x30, 0x0, 0x0, - 0x0, 0x3e, 0x10, 0x5c, 0x11, 0xe0, 0x0, 0x0, - 0x0, 0xa, 0x30, 0xa4, 0x0, 0x50, 0x26, 0x0, - 0x0, 0x0, 0x1, 0xf7, 0x66, 0xc6, 0x66, 0x10, - 0x0, 0x5, 0x7, 0xc2, 0x0, 0xc0, 0x10, 0x0, - 0x7, 0x6e, 0x57, 0x97, 0x66, 0xd6, 0xa6, 0x0, - 0x0, 0xd, 0x10, 0x92, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x97, 0x66, 0xd6, 0xb7, 0x0, - 0x0, 0xd, 0x0, 0x92, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x92, 0x0, 0xc0, 0x1, 0x0, - 0x0, 0xd, 0x0, 0x97, 0x66, 0xc6, 0x8d, 0x20, - 0x3, 0xc8, 0x90, 0x81, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0x30, 0x3b, 0x62, 0x0, 0x0, 0x12, 0x31, - 0x2, 0x0, 0x0, 0x7c, 0xef, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+9045 "遅" */ - 0x0, 0x61, 0x0, 0x40, 0x0, 0x0, 0x4, 0x0, - 0x0, 0x3d, 0x0, 0xd6, 0x66, 0x66, 0x6e, 0x30, - 0x0, 0xb, 0x20, 0xd0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, - 0x0, 0x3, 0x0, 0xd0, 0x75, 0x4, 0xb0, 0x0, - 0x18, 0x6e, 0x50, 0xc0, 0xc, 0x9, 0x27, 0x0, - 0x0, 0xd, 0x0, 0xc6, 0x76, 0xe6, 0x66, 0x10, - 0x0, 0xd, 0x1, 0x93, 0x66, 0xe6, 0x88, 0x0, - 0x0, 0xd, 0x5, 0x40, 0x10, 0xd0, 0x0, 0x0, - 0x0, 0xd, 0x8, 0x47, 0x66, 0xe6, 0x69, 0xa0, - 0x0, 0xd, 0x23, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x2, 0xb9, 0x90, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x2e, 0x40, 0x4b, 0x40, 0x0, 0x60, 0x0, 0x10, - 0x3, 0x0, 0x1, 0x7c, 0xdd, 0xdd, 0xef, 0x81, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+904A "遊" */ - 0x0, 0x81, 0x0, 0x43, 0x0, 0x8, 0x0, 0x0, - 0x0, 0x3e, 0x10, 0xe, 0x0, 0x3b, 0x10, 0x0, - 0x0, 0x9, 0x10, 0x3, 0x10, 0xa7, 0x46, 0xa0, - 0x0, 0x0, 0x7, 0xa6, 0x89, 0x82, 0x22, 0x20, - 0x0, 0x5, 0x0, 0xb0, 0x15, 0x46, 0x6a, 0x60, - 0x27, 0x6f, 0x30, 0xc6, 0xc5, 0x0, 0x38, 0x10, - 0x0, 0xd, 0x0, 0xc0, 0xb1, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x1, 0xa0, 0xc3, 0x66, 0xc7, 0xc1, - 0x0, 0xd, 0x5, 0x50, 0xc0, 0x0, 0xb0, 0x0, - 0x0, 0xd, 0x9, 0x0, 0xc0, 0x0, 0xb0, 0x0, - 0x0, 0xd, 0x43, 0x36, 0x80, 0x0, 0xa0, 0x0, - 0x3, 0xaa, 0x60, 0x2c, 0x10, 0x4c, 0x80, 0x0, - 0x2e, 0x20, 0x68, 0x20, 0x0, 0x2, 0x0, 0x11, - 0x1, 0x0, 0x2, 0x8b, 0xcd, 0xdd, 0xef, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, - - /* U+904B "運" */ - 0x1, 0x70, 0x1, 0x40, 0x0, 0x0, 0x6, 0x0, - 0x0, 0x7c, 0x5, 0x96, 0x66, 0x66, 0x7e, 0x40, - 0x0, 0xd, 0xd, 0x20, 0xb, 0x30, 0x51, 0x0, - 0x0, 0x0, 0x3, 0x76, 0x6d, 0x66, 0x97, 0x0, - 0x0, 0x1, 0x0, 0x30, 0xb, 0x0, 0x40, 0x0, - 0x17, 0x6e, 0x30, 0xb6, 0x6d, 0x66, 0xd3, 0x0, - 0x0, 0xd, 0x0, 0xb6, 0x6d, 0x66, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xb0, 0xb, 0x0, 0xb0, 0x0, - 0x0, 0xd, 0x0, 0xb6, 0x6d, 0x66, 0xd1, 0x0, - 0x0, 0xd, 0x0, 0x30, 0xb, 0x0, 0x25, 0x0, - 0x0, 0xd, 0x7, 0x66, 0x6d, 0x66, 0x67, 0x40, - 0x2, 0xa9, 0x50, 0x0, 0xb, 0x0, 0x0, 0x0, - 0x2e, 0x30, 0x59, 0x30, 0x9, 0x0, 0x0, 0x10, - 0x2, 0x0, 0x1, 0x8c, 0xde, 0xee, 0xef, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+904E "過" */ - 0x0, 0x70, 0x0, 0x4, 0x0, 0x0, 0x40, 0x0, - 0x0, 0x4d, 0x0, 0xf, 0x66, 0x66, 0xc0, 0x0, - 0x0, 0xc, 0x10, 0xf, 0x66, 0x91, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x4, 0x81, 0xa0, 0x0, - 0x0, 0x5, 0x1, 0xe, 0x4, 0x71, 0xa2, 0x0, - 0x27, 0x6f, 0x2a, 0x78, 0x66, 0x76, 0x7d, 0x40, - 0x0, 0xd, 0xa, 0x20, 0x86, 0x69, 0x1c, 0x0, - 0x0, 0xd, 0x9, 0x20, 0xc0, 0xc, 0xc, 0x0, - 0x0, 0xd, 0x9, 0x20, 0xc0, 0xc, 0xc, 0x0, - 0x0, 0xd, 0x9, 0x20, 0xd6, 0x6d, 0xc, 0x0, - 0x0, 0xd, 0xa, 0x30, 0x60, 0x4, 0xd, 0x0, - 0x3, 0xa9, 0x56, 0x10, 0x0, 0x2, 0x9b, 0x0, - 0x3e, 0x20, 0x5a, 0x41, 0x0, 0x0, 0x0, 0x20, - 0x2, 0x0, 0x1, 0x7c, 0xde, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+9053 "道" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x60, 0x0, 0x7, 0x10, 0x6, 0x80, 0x0, - 0x0, 0x4d, 0x0, 0x3, 0xd0, 0xc, 0x20, 0x0, - 0x0, 0xc, 0x10, 0x0, 0x80, 0x53, 0x6, 0x40, - 0x0, 0x0, 0x6, 0x76, 0x6d, 0x66, 0x66, 0x50, - 0x0, 0x2, 0x0, 0x5, 0x29, 0x22, 0x72, 0x0, - 0x17, 0x6e, 0x40, 0x1d, 0x33, 0x33, 0xd2, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0xc, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe0, 0x0, - 0x0, 0xd, 0x0, 0xc, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe0, 0x0, - 0x4, 0xa3, 0x80, 0x1a, 0x0, 0x0, 0x90, 0x0, - 0xb, 0x10, 0x1a, 0x73, 0x10, 0x0, 0x12, 0x30, - 0x0, 0x0, 0x0, 0x48, 0xbd, 0xee, 0xff, 0x60, - - /* U+9054 "達" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x85, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, - 0x0, 0xe, 0x20, 0x56, 0x6c, 0x76, 0xd3, 0x0, - 0x0, 0x5, 0x10, 0x10, 0xa, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x66, 0x6c, 0x76, 0x6c, 0x90, - 0x0, 0x7, 0x1, 0x6, 0x40, 0xa, 0x20, 0x0, - 0x28, 0x6e, 0x30, 0x1, 0xe0, 0x49, 0x4, 0x0, - 0x0, 0xd, 0x3, 0x76, 0x89, 0x96, 0x69, 0x30, - 0x0, 0xd, 0x0, 0x0, 0xa, 0x20, 0x60, 0x0, - 0x0, 0xd, 0x0, 0x57, 0x6c, 0x76, 0x72, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xa, 0x20, 0x8, 0x10, - 0x0, 0xd, 0x6, 0x66, 0x6c, 0x76, 0x66, 0x30, - 0x5, 0xb8, 0x70, 0x0, 0xa, 0x20, 0x0, 0x0, - 0x3e, 0x20, 0x4a, 0x41, 0x8, 0x10, 0x0, 0x10, - 0x1, 0x0, 0x1, 0x7c, 0xde, 0xef, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9055 "違" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x70, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, - 0x0, 0x6d, 0x0, 0x57, 0xc6, 0x6b, 0x50, 0x0, - 0x0, 0xd, 0x10, 0x0, 0x90, 0xa, 0x10, 0x0, - 0x0, 0x0, 0x5, 0x66, 0xb6, 0x6c, 0x6c, 0x60, - 0x0, 0x4, 0x1, 0x22, 0x0, 0x0, 0x40, 0x0, - 0x37, 0x6f, 0x30, 0x1c, 0x66, 0x67, 0xc0, 0x0, - 0x0, 0xd, 0x0, 0x1c, 0x66, 0x67, 0xa0, 0x0, - 0x0, 0xd, 0x0, 0x14, 0xc, 0x1, 0x50, 0x0, - 0x0, 0xd, 0x4, 0x76, 0x6d, 0x66, 0xa3, 0x0, - 0x0, 0xd, 0x0, 0x95, 0xc, 0x0, 0x3, 0x0, - 0x0, 0xd, 0x2, 0xe6, 0x6d, 0x66, 0x69, 0x50, - 0x4, 0xb9, 0x50, 0x0, 0xc, 0x0, 0x0, 0x0, - 0x4e, 0x20, 0x79, 0x20, 0x7, 0x0, 0x0, 0x10, - 0x1, 0x0, 0x3, 0xad, 0xdd, 0xde, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9060 "遠" */ - 0x0, 0x30, 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, - 0x0, 0x3b, 0x0, 0x0, 0x8, 0x30, 0x70, 0x0, - 0x0, 0xb, 0x50, 0x76, 0x6b, 0x86, 0x63, 0x0, - 0x0, 0x1, 0x15, 0x66, 0x6b, 0x86, 0x69, 0x80, - 0x0, 0x1, 0x2, 0x20, 0x0, 0x0, 0x40, 0x0, - 0x28, 0x6f, 0x20, 0xc7, 0x66, 0x66, 0xe2, 0x0, - 0x0, 0xd, 0x0, 0xb1, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0xd, 0x0, 0xc6, 0x7e, 0x66, 0xa0, 0x0, - 0x0, 0xd, 0x0, 0x12, 0xcd, 0x0, 0x78, 0x0, - 0x0, 0xd, 0x0, 0x69, 0x2c, 0x5a, 0x50, 0x0, - 0x0, 0xd, 0x25, 0x30, 0xc, 0x1, 0xa9, 0x0, - 0x3, 0xb9, 0x50, 0x0, 0x1d, 0x0, 0x8, 0x20, - 0x3e, 0x20, 0x49, 0x30, 0x6, 0x0, 0x0, 0x10, - 0x1, 0x0, 0x1, 0x7b, 0xcd, 0xee, 0xff, 0x81, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9069 "適" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x50, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, - 0x0, 0x79, 0x0, 0x0, 0x5, 0x40, 0x3, 0x0, - 0x0, 0x1e, 0x3, 0x77, 0x66, 0x69, 0x69, 0x50, - 0x0, 0x0, 0x0, 0x3, 0xa0, 0x1b, 0x10, 0x0, - 0x0, 0x3, 0x0, 0x96, 0xb6, 0xa7, 0x6a, 0x10, - 0x27, 0x6f, 0x40, 0xc0, 0x6, 0x70, 0xc, 0x0, - 0x0, 0xd, 0x0, 0xc3, 0x7a, 0x8a, 0x4c, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0x6, 0x41, 0xc, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0xd7, 0x7d, 0xc, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0xc0, 0xc, 0xc, 0x0, - 0x0, 0xd, 0x0, 0xc0, 0xd6, 0x6c, 0xc, 0x0, - 0x3, 0xa9, 0x50, 0xa0, 0x30, 0x5, 0x7c, 0x0, - 0x3e, 0x20, 0x59, 0x30, 0x0, 0x0, 0x54, 0x11, - 0x2, 0x0, 0x1, 0x8c, 0xde, 0xee, 0xff, 0x71, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+9078 "選" */ - 0x0, 0x71, 0x0, 0x20, 0x20, 0x30, 0x4, 0x0, - 0x0, 0x3e, 0x10, 0xc6, 0xa3, 0xb6, 0x6d, 0x0, - 0x0, 0xa, 0x20, 0xc6, 0xa1, 0xb6, 0x6b, 0x0, - 0x0, 0x0, 0x0, 0xb0, 0x22, 0xb0, 0x6, 0x30, - 0x0, 0x3, 0x0, 0xb6, 0x69, 0x87, 0x57, 0x80, - 0x27, 0x6f, 0x30, 0x3, 0x91, 0x17, 0x32, 0x0, - 0x0, 0xd, 0x0, 0x0, 0xc0, 0x2d, 0x17, 0x0, - 0x0, 0xd, 0x1, 0x76, 0xd6, 0x7c, 0x66, 0x20, - 0x0, 0xd, 0x0, 0x0, 0xc0, 0x2b, 0x1, 0x30, - 0x0, 0xd, 0x17, 0x66, 0x96, 0x77, 0x66, 0x70, - 0x0, 0xd, 0x0, 0x7, 0xc0, 0x29, 0x70, 0x0, - 0x4, 0xca, 0x61, 0x85, 0x0, 0x0, 0x8a, 0x0, - 0x3f, 0x30, 0x5b, 0x30, 0x0, 0x0, 0x2, 0x0, - 0x2, 0x0, 0x1, 0x8b, 0xcc, 0xdd, 0xde, 0x91, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, - - /* U+907F "避" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x40, 0x0, 0x0, 0x0, 0x8, 0x30, 0x0, - 0x0, 0x79, 0x9, 0x66, 0xc3, 0x2, 0xb0, 0x40, - 0x0, 0xd, 0xa, 0x10, 0xc4, 0x76, 0x67, 0x60, - 0x0, 0x0, 0xa, 0x10, 0xc0, 0x70, 0xd, 0x10, - 0x0, 0x1, 0xa, 0x65, 0xd1, 0x67, 0x46, 0x0, - 0x17, 0x6f, 0x2b, 0x0, 0x24, 0x77, 0x96, 0xc2, - 0x0, 0xd, 0xb, 0x20, 0x22, 0x11, 0xa0, 0x0, - 0x0, 0xd, 0xa, 0xe6, 0xa7, 0x1, 0xa0, 0x0, - 0x0, 0xd, 0x26, 0xd0, 0x77, 0x77, 0xc6, 0xb1, - 0x0, 0xd, 0x60, 0xd0, 0x75, 0x1, 0xa0, 0x0, - 0x0, 0xd, 0x30, 0xe6, 0xa5, 0x1, 0xa0, 0x0, - 0x1, 0x97, 0x50, 0x80, 0x42, 0x2, 0xb0, 0x0, - 0xd, 0x20, 0x4a, 0x41, 0x0, 0x0, 0x20, 0x11, - 0x0, 0x0, 0x0, 0x7b, 0xde, 0xee, 0xff, 0xa1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9084 "還" */ - 0x0, 0x92, 0x0, 0x86, 0x66, 0x66, 0x6b, 0x10, - 0x0, 0x3e, 0x10, 0xd0, 0xb0, 0xb, 0xc, 0x0, - 0x0, 0xa, 0x10, 0xd0, 0xb0, 0xb, 0xc, 0x0, - 0x0, 0x0, 0x0, 0xd6, 0x86, 0x68, 0x6a, 0x10, - 0x0, 0x2, 0x6, 0x65, 0x55, 0x55, 0x57, 0xa0, - 0x17, 0x6f, 0x20, 0x56, 0x66, 0x66, 0x85, 0x0, - 0x0, 0xd, 0x0, 0x84, 0x0, 0x0, 0x65, 0x0, - 0x0, 0xd, 0x0, 0x88, 0x87, 0x66, 0x95, 0x0, - 0x0, 0xd, 0x0, 0x25, 0xc1, 0x0, 0x95, 0x0, - 0x0, 0xd, 0x0, 0x5d, 0x55, 0x99, 0x40, 0x0, - 0x0, 0xd, 0x7, 0x65, 0x50, 0x4b, 0xc3, 0x0, - 0x0, 0x9a, 0x50, 0x7, 0xd9, 0x30, 0x5d, 0x0, - 0x1d, 0x40, 0x68, 0x32, 0x40, 0x0, 0x1, 0x0, - 0x16, 0x0, 0x2, 0x8c, 0xdd, 0xee, 0xef, 0x71, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+908A "邊" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x7, 0x60, 0x10, 0x0, - 0x0, 0x79, 0x0, 0xd, 0x67, 0x66, 0xd2, 0x0, - 0x0, 0xe, 0x40, 0xd, 0x66, 0x66, 0xd0, 0x0, - 0x0, 0x4, 0x0, 0xd, 0x66, 0x66, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x66, 0x66, 0xd1, 0x0, - 0x13, 0x3a, 0x10, 0x24, 0x5, 0x70, 0x32, 0x0, - 0x14, 0x3e, 0x25, 0x96, 0x86, 0x86, 0x6b, 0x70, - 0x0, 0xd, 0x7, 0x27, 0x86, 0x55, 0x94, 0x0, - 0x0, 0xd, 0x2, 0x75, 0x56, 0x95, 0x7c, 0x30, - 0x0, 0xd, 0x0, 0x0, 0xa8, 0x66, 0x93, 0x0, - 0x0, 0xd, 0x0, 0x6, 0x90, 0x0, 0xc1, 0x0, - 0x4, 0xc9, 0x80, 0x76, 0x0, 0x49, 0xa0, 0x0, - 0x3d, 0x10, 0x5d, 0x62, 0x0, 0x6, 0x11, 0x20, - 0x1, 0x0, 0x1, 0x8c, 0xee, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+90A3 "那" */ - 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x2, 0x0, - 0x37, 0x6b, 0x66, 0xe3, 0xc6, 0x66, 0xf4, 0x0, - 0x0, 0xc1, 0xd, 0xc, 0x0, 0x3a, 0x0, 0x0, - 0xc, 0x10, 0xd0, 0xc0, 0x8, 0x20, 0x1, 0x66, - 0xd6, 0x6e, 0xc, 0x0, 0x80, 0x0, 0x2, 0xc, - 0x0, 0xd0, 0xc0, 0x23, 0x0, 0x0, 0x0, 0xc0, - 0xd, 0xc, 0x0, 0x70, 0x0, 0x0, 0xc, 0x0, - 0xd0, 0xc0, 0x2, 0x80, 0x3, 0x76, 0xd6, 0x6e, - 0xc, 0x0, 0xb, 0x10, 0x0, 0x37, 0x0, 0xd0, - 0xc0, 0x0, 0x94, 0x0, 0x8, 0x20, 0xd, 0xc, - 0x14, 0x4d, 0x40, 0x1, 0x90, 0x0, 0xd0, 0xc0, - 0x3d, 0xa0, 0x0, 0x91, 0x39, 0xcb, 0xc, 0x0, - 0x10, 0x0, 0x62, 0x0, 0x8, 0x10, 0xd1, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, - 0x0, - - /* U+90AA "邪" */ - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x10, - 0x1, 0x76, 0x66, 0xa8, 0xa4, 0xb6, 0x6a, 0xd0, - 0x0, 0x10, 0x0, 0xd0, 0x2, 0xa0, 0xb, 0x40, - 0x0, 0x6a, 0x0, 0xd0, 0x2, 0xa0, 0x1a, 0x0, - 0x0, 0xb3, 0x0, 0xd0, 0x2, 0xa0, 0x62, 0x0, - 0x3, 0xe6, 0x66, 0xe7, 0xe5, 0xa0, 0x70, 0x0, - 0x0, 0x20, 0xd, 0xd0, 0x2, 0xa0, 0x61, 0x0, - 0x0, 0x0, 0x68, 0xd0, 0x2, 0xa0, 0x9, 0x0, - 0x0, 0x1, 0xc0, 0xd0, 0x2, 0xa0, 0x5, 0x60, - 0x0, 0x9, 0x30, 0xd0, 0x2, 0xa0, 0x2, 0xc0, - 0x0, 0x65, 0x0, 0xd0, 0x2, 0xa2, 0x27, 0xc0, - 0x5, 0x40, 0x0, 0xd0, 0x2, 0xa1, 0x9f, 0x50, - 0x12, 0x1, 0x66, 0xc0, 0x2, 0xa0, 0x1, 0x0, - 0x0, 0x0, 0x1b, 0x60, 0x3, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, - - /* U+90E8 "部" */ - 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0x0, 0x0, 0x95, 0x55, 0x90, - 0x3, 0x66, 0x6b, 0x68, 0xb0, 0xd1, 0x17, 0x90, - 0x0, 0x11, 0x0, 0x25, 0x0, 0xd0, 0xb, 0x10, - 0x0, 0xb, 0x20, 0x79, 0x0, 0xd0, 0x19, 0x0, - 0x0, 0x6, 0x70, 0xa0, 0x0, 0xd0, 0x52, 0x0, - 0x16, 0x66, 0x67, 0x96, 0xb7, 0xd0, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x18, 0x0, - 0x0, 0x86, 0x66, 0x6c, 0x20, 0xd0, 0x7, 0x40, - 0x0, 0xb2, 0x0, 0xd, 0x0, 0xd0, 0x2, 0xa0, - 0x0, 0xa2, 0x0, 0xd, 0x0, 0xd0, 0x3, 0xc0, - 0x0, 0xa2, 0x0, 0xd, 0x0, 0xd4, 0xae, 0x60, - 0x0, 0xb7, 0x66, 0x6d, 0x0, 0xd0, 0x24, 0x0, - 0x0, 0xa1, 0x0, 0x9, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, - - /* U+90F5 "郵" */ - 0x0, 0x0, 0x37, 0xc1, 0x2, 0x0, 0x2, 0x0, - 0x67, 0x9d, 0x64, 0x10, 0xc6, 0x6b, 0xd0, 0x0, - 0x0, 0xc0, 0x0, 0xc, 0x0, 0xc2, 0x4, 0x78, - 0x6d, 0x68, 0xa5, 0xc0, 0x37, 0x0, 0x0, 0xb0, - 0xc0, 0xc0, 0xc, 0x8, 0x0, 0x0, 0xb, 0xc, - 0xc, 0x0, 0xc0, 0x60, 0x0, 0x27, 0xd6, 0xd6, - 0xd8, 0x4c, 0x5, 0x30, 0x0, 0xb, 0xc, 0xc, - 0x0, 0xc0, 0x8, 0x20, 0x0, 0xb0, 0xc0, 0xc1, - 0xc, 0x0, 0xc, 0x5, 0x69, 0x6d, 0x69, 0x86, - 0xc0, 0x0, 0xa2, 0x0, 0x0, 0xc0, 0x0, 0xc, - 0x0, 0xd, 0x30, 0x0, 0xc, 0x56, 0x50, 0xc3, - 0x8f, 0xc0, 0x2c, 0xda, 0x62, 0x0, 0xc, 0x0, - 0x30, 0x0, 0x40, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, - - /* U+90FD "都" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x66, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, 0x0, 0x65, 0x2, 0x90, 0xc6, 0x67, 0xe1, - 0x0, 0x76, 0xa9, 0xbb, 0xa0, 0xd0, 0x7, 0x70, - 0x0, 0x0, 0x65, 0x3d, 0x0, 0xd0, 0xb, 0x0, - 0x0, 0x0, 0x66, 0xc2, 0x31, 0xd0, 0x27, 0x0, - 0x7, 0x66, 0x6c, 0x96, 0x75, 0xd0, 0x60, 0x0, - 0x0, 0x0, 0x68, 0x1, 0x0, 0xd0, 0x44, 0x0, - 0x0, 0xb, 0xb6, 0x6d, 0x40, 0xd0, 0xa, 0x10, - 0x2, 0x7d, 0x0, 0xd, 0x0, 0xd0, 0x4, 0xa0, - 0x2, 0xd, 0x66, 0x6e, 0x0, 0xd0, 0x0, 0xe0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0xd2, 0x36, 0xd0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0xd0, 0x6f, 0x50, - 0x0, 0xd, 0x66, 0x6e, 0x10, 0xd0, 0x1, 0x0, - 0x0, 0xd, 0x0, 0x9, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x3, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, - - /* U+914D "配" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x0, - 0x7, 0x67, 0x89, 0x69, 0x57, 0x66, 0x6d, 0x30, - 0x0, 0x5, 0x6c, 0x0, 0x0, 0x0, 0xc, 0x10, - 0x2, 0x79, 0xad, 0x6a, 0x10, 0x0, 0xc, 0x10, - 0x3, 0xa5, 0x5c, 0xd, 0x0, 0x0, 0xc, 0x10, - 0x2, 0xa6, 0x4c, 0xd, 0x8, 0x66, 0x6d, 0x10, - 0x2, 0xa9, 0xc, 0xd, 0xd, 0x0, 0x8, 0x0, - 0x2, 0xb7, 0x9, 0xbd, 0xd, 0x0, 0x0, 0x0, - 0x2, 0xc0, 0x0, 0xd, 0xd, 0x0, 0x0, 0x0, - 0x2, 0xc6, 0x66, 0x6d, 0xd, 0x0, 0x0, 0x0, - 0x2, 0xa0, 0x0, 0xd, 0xd, 0x0, 0x0, 0x40, - 0x2, 0xa0, 0x0, 0xd, 0xd, 0x0, 0x0, 0x60, - 0x2, 0xc6, 0x66, 0x6d, 0xc, 0x10, 0x0, 0xc0, - 0x3, 0xa0, 0x0, 0xd, 0x7, 0xcb, 0xbc, 0xc0, - 0x1, 0x30, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - - /* U+9152 "酒" */ - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, - 0x0, 0x77, 0x7, 0x66, 0x6a, 0x69, 0x67, 0x80, - 0x0, 0xc, 0x1, 0x0, 0x1b, 0x28, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x96, 0x6c, 0x7b, 0x6a, 0x20, - 0x8, 0x20, 0x51, 0xd0, 0x1a, 0x28, 0xd, 0x10, - 0x1, 0xe0, 0x70, 0xd0, 0x39, 0x28, 0xd, 0x0, - 0x0, 0x41, 0x70, 0xd0, 0x74, 0x19, 0xd, 0x0, - 0x0, 0x7, 0x20, 0xd0, 0x90, 0xc, 0x9e, 0x0, - 0x0, 0xb, 0x0, 0xd6, 0x10, 0x0, 0xd, 0x0, - 0x5, 0xba, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, - 0x0, 0x68, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x58, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x69, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, - 0x0, 0x26, 0x0, 0xd0, 0x0, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+9154 "酔" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0xd1, 0x0, 0x0, - 0x27, 0x6a, 0x96, 0x79, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0xb, 0xa0, 0x0, 0x56, 0xe6, 0xc4, 0x0, - 0x3, 0x1b, 0xa0, 0x51, 0x1, 0xb0, 0xa1, 0x0, - 0xb, 0x5c, 0xc6, 0xd3, 0x5, 0x70, 0xb0, 0x10, - 0xb, 0xa, 0xa0, 0xc0, 0xb, 0x0, 0xb0, 0x50, - 0xb, 0x18, 0xa0, 0xc0, 0x83, 0x13, 0xb7, 0xc1, - 0xb, 0x53, 0xa2, 0xc4, 0x20, 0x2b, 0x13, 0x20, - 0xb, 0x60, 0x39, 0xe0, 0x0, 0x28, 0x0, 0x0, - 0xb, 0x0, 0x0, 0xc4, 0x76, 0x7b, 0x69, 0x70, - 0xb, 0x66, 0x66, 0xd0, 0x0, 0x18, 0x0, 0x0, - 0xb, 0x0, 0x0, 0xc0, 0x0, 0x18, 0x0, 0x0, - 0xb, 0x66, 0x66, 0xd0, 0x0, 0x29, 0x0, 0x0, - 0xb, 0x0, 0x0, 0xb0, 0x0, 0x29, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x10, 0x0, 0x11, 0x0, 0x0, - - /* U+9178 "酸" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, - 0x27, 0x68, 0x86, 0x95, 0x8, 0x70, 0x31, 0x0, - 0x0, 0xb, 0xb0, 0x1, 0x73, 0x1, 0x3c, 0x30, - 0x3, 0xb, 0xb0, 0x55, 0xeb, 0x86, 0x46, 0xa0, - 0xb, 0x7c, 0xc6, 0xd0, 0x16, 0x20, 0x62, 0x10, - 0xa, 0x2a, 0xb0, 0xc0, 0x5a, 0x20, 0x1c, 0x80, - 0xa, 0x38, 0xb0, 0xc4, 0x54, 0xa0, 0x0, 0xd0, - 0xa, 0x64, 0x99, 0xc1, 0xb, 0x96, 0x69, 0x10, - 0xa, 0x70, 0x1, 0xc0, 0x49, 0x0, 0x87, 0x0, - 0xa, 0x10, 0x0, 0xc1, 0x87, 0x1, 0xc0, 0x0, - 0xa, 0x66, 0x66, 0xc5, 0x3, 0x6a, 0x40, 0x0, - 0xa, 0x10, 0x0, 0xc0, 0x0, 0xba, 0x0, 0x0, - 0xa, 0x66, 0x66, 0xc0, 0x6, 0x9b, 0x50, 0x0, - 0xb, 0x10, 0x0, 0xb1, 0x84, 0x0, 0xbd, 0x80, - 0x4, 0x0, 0x0, 0x34, 0x0, 0x0, 0x6, 0x20, - - /* U+91AB "醫" */ - 0x0, 0x96, 0x66, 0x8a, 0x8, 0x66, 0xb0, 0x0, - 0x0, 0xc1, 0xa0, 0x10, 0xc, 0x0, 0xb0, 0x0, - 0x0, 0xc7, 0x7a, 0x74, 0x37, 0x0, 0xa8, 0x30, - 0x0, 0xc6, 0x6c, 0x79, 0x56, 0x66, 0x92, 0x0, - 0x0, 0xc0, 0x68, 0x40, 0x5, 0x12, 0xb1, 0x0, - 0x0, 0xc2, 0x60, 0x81, 0x1, 0x9e, 0x70, 0x0, - 0x2, 0xd8, 0x66, 0x6a, 0x57, 0x70, 0x79, 0x0, - 0x5, 0x66, 0x66, 0x66, 0x96, 0x66, 0x66, 0xc1, - 0x1, 0x1, 0x0, 0xd0, 0xc, 0x0, 0x30, 0x0, - 0x0, 0xd, 0x66, 0xe6, 0x6d, 0x66, 0xd3, 0x0, - 0x0, 0xb, 0x6, 0x60, 0xc, 0x33, 0xb0, 0x0, - 0x0, 0xb, 0x33, 0x0, 0x3, 0x55, 0xc0, 0x0, - 0x0, 0xd, 0x66, 0x66, 0x66, 0x66, 0xc0, 0x0, - 0x0, 0xd, 0x66, 0x66, 0x66, 0x66, 0xd0, 0x0, - 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, - - /* U+91CD "重" */ - 0x0, 0x0, 0x0, 0x0, 0x14, 0x8c, 0x10, 0x0, - 0x2, 0x45, 0x67, 0xe7, 0x54, 0x31, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0x35, 0x0, 0x57, - 0x66, 0x66, 0xe6, 0x66, 0x67, 0x70, 0x0, 0x3, - 0x0, 0xd, 0x0, 0x5, 0x0, 0x0, 0x0, 0xb8, - 0x66, 0xe6, 0x66, 0xe2, 0x0, 0x0, 0xa, 0x30, - 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, 0xa8, 0x66, - 0xe6, 0x66, 0xe0, 0x0, 0x0, 0xa, 0x30, 0xd, - 0x0, 0xd, 0x0, 0x0, 0x0, 0xa7, 0x66, 0xe6, - 0x66, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x2, 0x60, 0x0, 0x6, 0x76, 0x66, 0xe6, 0x66, - 0x66, 0x10, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x5, 0x13, 0x76, 0x66, 0x66, 0xa6, 0x66, 0x66, - 0xa7, - - /* U+91CE "野" */ - 0x1, 0x20, 0x0, 0x4, 0x0, 0x0, 0x4, 0x0, - 0x1, 0xd6, 0xc7, 0x6e, 0x37, 0x66, 0x7e, 0x60, - 0x1, 0xb0, 0xa2, 0xd, 0x1, 0x40, 0x81, 0x0, - 0x1, 0xd6, 0xc7, 0x6e, 0x0, 0x5e, 0x20, 0x0, - 0x1, 0xb0, 0xa2, 0xd, 0x0, 0x9, 0x60, 0x10, - 0x1, 0xb0, 0xa2, 0xd, 0x57, 0x69, 0x68, 0xe1, - 0x1, 0xd6, 0xc7, 0x6e, 0x0, 0xd, 0x8, 0x30, - 0x1, 0x70, 0xa2, 0x7, 0x0, 0xd, 0x3, 0x0, - 0x0, 0x0, 0xa2, 0x2, 0x0, 0xd, 0x0, 0x0, - 0x3, 0x76, 0xc7, 0x6c, 0x50, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xa2, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xa2, 0x24, 0x40, 0xd, 0x0, 0x0, - 0x6, 0x8a, 0xb8, 0x40, 0x0, 0xd, 0x0, 0x0, - 0xa, 0x51, 0x0, 0x0, 0x6, 0xde, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, - - /* U+91CF "量" */ - 0x0, 0x6, 0x66, 0x66, 0x66, 0x6b, 0x10, 0x0, - 0x0, 0x9, 0x30, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x9, 0x86, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x9, 0x86, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x7, 0x10, 0x0, 0x0, 0x5, 0x2, 0x30, - 0x27, 0x66, 0x66, 0x66, 0x66, 0x66, 0x68, 0x70, - 0x0, 0x8, 0x66, 0x66, 0x66, 0x69, 0x30, 0x0, - 0x0, 0xc, 0x0, 0xd, 0x0, 0xa, 0x20, 0x0, - 0x0, 0xc, 0x66, 0x6e, 0x66, 0x6c, 0x20, 0x0, - 0x0, 0xc, 0x0, 0xd, 0x0, 0xa, 0x20, 0x0, - 0x0, 0xb, 0x66, 0x6e, 0x66, 0x69, 0x10, 0x0, - 0x0, 0x46, 0x66, 0x6e, 0x66, 0x67, 0xc1, 0x0, - 0x0, 0x11, 0x0, 0xd, 0x0, 0x0, 0x1, 0x0, - 0x5, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x6d, 0x90, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+91D1 "金" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3d, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xba, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xd0, 0x82, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0x30, 0xb, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x1, 0xc7, 0x0, 0x0, - 0x0, 0x1a, 0x30, 0x0, 0x0, 0x3a, 0xe9, 0x50, - 0x5, 0x70, 0x67, 0x6b, 0x66, 0x93, 0x4b, 0x50, - 0x11, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x70, 0x0, - 0x0, 0x57, 0x66, 0x6e, 0x66, 0x66, 0x61, 0x0, - 0x0, 0x3, 0x70, 0xe, 0x0, 0x79, 0x0, 0x0, - 0x0, 0x0, 0x9a, 0xe, 0x0, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xe, 0x5, 0x50, 0x0, 0x0, - 0x16, 0x66, 0x67, 0x6e, 0x6a, 0x66, 0x6c, 0x80, - 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+91DD "針" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0x1d, 0x20, 0x0, - 0x0, 0x4, 0xe3, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xb, 0x37, 0xb1, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x49, 0x0, 0x86, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xa0, 0x1, 0x10, 0x0, 0xd, 0x0, 0x0, - 0x7, 0x36, 0xa7, 0x60, 0x0, 0xd, 0x0, 0x80, - 0x1, 0x0, 0xd0, 0x2, 0x86, 0x6e, 0x66, 0x62, - 0x0, 0x0, 0xd0, 0x70, 0x0, 0xd, 0x0, 0x0, - 0x1, 0x86, 0xe6, 0x62, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x60, 0xd0, 0xb3, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x94, 0xd1, 0xb0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x65, 0xd5, 0x11, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x25, 0xe8, 0x62, 0x0, 0xe, 0x0, 0x0, - 0x4, 0xd6, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, - - /* U+9244 "鉄" */ - 0x0, 0x1, 0xb2, 0x0, 0x0, 0x74, 0x0, 0x0, - 0x0, 0x6, 0xd2, 0x0, 0x41, 0x94, 0x0, 0x0, - 0x0, 0xd, 0x28, 0xa0, 0xe4, 0x93, 0x0, 0x0, - 0x0, 0x67, 0x0, 0xa6, 0xc0, 0x93, 0x7, 0x0, - 0x1, 0x90, 0x4, 0x26, 0x96, 0xb8, 0x67, 0x20, - 0x7, 0x37, 0xe6, 0x3a, 0x0, 0xa2, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x13, 0x0, 0xb1, 0x0, 0x10, - 0x2, 0x66, 0xe6, 0xa6, 0x75, 0xd7, 0x57, 0xb1, - 0x0, 0x20, 0xd0, 0x30, 0x0, 0xc6, 0x0, 0x0, - 0x0, 0x90, 0xd1, 0xe1, 0x5, 0x88, 0x0, 0x0, - 0x0, 0xa3, 0xd6, 0x40, 0xc, 0x14, 0x80, 0x0, - 0x0, 0x51, 0xd5, 0x52, 0x67, 0x0, 0xb5, 0x0, - 0x4, 0x9b, 0xa5, 0x13, 0x80, 0x0, 0x2e, 0x80, - 0x4, 0x60, 0x0, 0x45, 0x0, 0x0, 0x3, 0xa2, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - - /* U+925B "鉛" */ - 0x0, 0x1, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xd2, 0x0, 0x58, 0x66, 0xa4, 0x0, - 0x0, 0xd, 0x18, 0xb0, 0x59, 0x0, 0xb1, 0x0, - 0x0, 0x66, 0x0, 0x94, 0x58, 0x0, 0xb1, 0x0, - 0x1, 0xa1, 0x15, 0x10, 0x66, 0x0, 0xb1, 0x0, - 0x7, 0x26, 0xd5, 0x20, 0xa1, 0x0, 0xb2, 0x0, - 0x0, 0x0, 0xd0, 0x3, 0x70, 0x0, 0x5b, 0xb0, - 0x2, 0x55, 0xd6, 0xc5, 0x10, 0x0, 0x1, 0x0, - 0x0, 0x21, 0xd1, 0x30, 0xd6, 0x66, 0x8d, 0x0, - 0x0, 0x80, 0xd1, 0xe1, 0xd0, 0x0, 0x2a, 0x0, - 0x0, 0xa3, 0xd6, 0x40, 0xd0, 0x0, 0x2a, 0x0, - 0x0, 0x61, 0xd4, 0x42, 0xd0, 0x0, 0x2a, 0x0, - 0x3, 0x8a, 0xb6, 0x10, 0xd6, 0x66, 0x7a, 0x0, - 0x4, 0x70, 0x0, 0x0, 0xd0, 0x0, 0x27, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - - /* U+9280 "銀" */ - 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0x30, 0x9, 0x66, 0x66, 0xa3, 0x0, - 0x0, 0xa5, 0x6b, 0x1c, 0x10, 0x0, 0xd1, 0x0, - 0x2, 0xa0, 0x8, 0x7c, 0x10, 0x0, 0xd0, 0x0, - 0xa, 0x10, 0x22, 0xc, 0x66, 0x66, 0xe0, 0x0, - 0x42, 0x7d, 0x64, 0xc, 0x10, 0x0, 0xd0, 0x0, - 0x0, 0xc, 0x0, 0xc, 0x43, 0x33, 0xd0, 0x0, - 0x5, 0x6d, 0x6c, 0x2c, 0x27, 0x11, 0x65, 0x0, - 0x2, 0xc, 0x3, 0xc, 0x16, 0x10, 0x7a, 0x10, - 0x8, 0xc, 0xd, 0x3c, 0x11, 0x96, 0x40, 0x0, - 0x7, 0x7c, 0x36, 0xc, 0x10, 0x86, 0x0, 0x0, - 0x3, 0x3c, 0x45, 0x3c, 0x13, 0x2b, 0x91, 0x0, - 0x28, 0xba, 0x61, 0xd, 0xa3, 0x0, 0x8f, 0x70, - 0x18, 0x0, 0x0, 0x8, 0x10, 0x0, 0x0, 0x0, - - /* U+9322 "錢" */ - 0x0, 0x1, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xe, 0x50, 0x0, 0xb6, 0xb, 0x40, 0x0, - 0x0, 0x5c, 0x72, 0x0, 0x69, 0x25, 0x9b, 0x10, - 0x0, 0xb2, 0x1d, 0x46, 0x6e, 0x31, 0x40, 0x0, - 0x5, 0x60, 0x3, 0x30, 0xb, 0x4a, 0xb1, 0x0, - 0x18, 0x56, 0x7a, 0x0, 0x6, 0xf7, 0x0, 0x20, - 0x20, 0x1a, 0x20, 0x3, 0x88, 0x7d, 0x40, 0x70, - 0x0, 0xa, 0x21, 0x53, 0x72, 0x66, 0xce, 0xc0, - 0x6, 0x6c, 0x7d, 0x30, 0x95, 0x2c, 0x4, 0x30, - 0x1, 0xa, 0x23, 0x0, 0x59, 0x36, 0x6b, 0x30, - 0x7, 0x1a, 0x2b, 0x78, 0x7e, 0x20, 0x10, 0x0, - 0x4, 0x9a, 0x3a, 0x0, 0xc, 0x25, 0xd0, 0x0, - 0x1, 0x4a, 0x53, 0x40, 0x5, 0xbd, 0x10, 0x0, - 0x4, 0x7d, 0x95, 0x0, 0x3, 0xf7, 0x0, 0x50, - 0xd, 0x60, 0x0, 0x1, 0x77, 0x2d, 0x93, 0x80, - 0x0, 0x0, 0x0, 0x34, 0x10, 0x0, 0x7c, 0xd0, - - /* U+932F "錯" */ - 0x0, 0xb, 0x40, 0x0, 0x85, 0xa, 0x30, 0x0, - 0x0, 0x4e, 0x40, 0x0, 0x95, 0xc, 0x20, 0x0, - 0x0, 0xb3, 0x5c, 0x36, 0xb9, 0x6d, 0x9b, 0x0, - 0x5, 0x70, 0x7, 0x50, 0x95, 0xc, 0x20, 0x0, - 0x19, 0x33, 0x55, 0x0, 0x95, 0xc, 0x20, 0x0, - 0x30, 0x4c, 0x32, 0x56, 0xb9, 0x6d, 0x7b, 0x80, - 0x0, 0xb, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x3c, 0x5c, 0x4, 0x0, 0x0, 0x43, 0x0, - 0x4, 0x3c, 0x44, 0xb, 0x76, 0x66, 0xb8, 0x0, - 0x7, 0xb, 0x1c, 0x4b, 0x30, 0x0, 0x95, 0x0, - 0x6, 0x7b, 0x38, 0xb, 0x76, 0x66, 0xb5, 0x0, - 0x3, 0x5b, 0x54, 0x3b, 0x30, 0x0, 0x95, 0x0, - 0x17, 0xab, 0x72, 0xb, 0x76, 0x66, 0xb5, 0x0, - 0xa, 0x10, 0x0, 0xb, 0x20, 0x0, 0x62, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, - - /* U+9332 "録" */ - 0x0, 0x9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5e, 0x20, 0x5, 0x76, 0x66, 0xc5, 0x0, - 0x0, 0xb3, 0x89, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x4, 0x80, 0xa, 0x40, 0x66, 0x66, 0xe0, 0x0, - 0xa, 0x22, 0x45, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x41, 0x5d, 0x32, 0x36, 0x66, 0x66, 0xe9, 0x90, - 0x0, 0xd, 0x0, 0x1, 0x0, 0xd0, 0x1, 0x0, - 0x16, 0x6e, 0x6d, 0x17, 0x40, 0xe0, 0x2e, 0x20, - 0x2, 0xd, 0x3, 0x0, 0xe0, 0xd6, 0x81, 0x0, - 0x8, 0xd, 0xd, 0x40, 0x21, 0xd7, 0x0, 0x0, - 0x7, 0x6d, 0x37, 0x0, 0x63, 0xd2, 0xa0, 0x0, - 0x3, 0x3d, 0x45, 0x4a, 0x20, 0xd0, 0x7b, 0x10, - 0x28, 0xba, 0x61, 0x94, 0x0, 0xd0, 0xa, 0x60, - 0x17, 0x0, 0x0, 0x0, 0x6e, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - - /* U+9577 "長" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x50, 0x0, - 0x0, 0x0, 0xb8, 0x66, 0x66, 0x66, 0x71, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0x2, 0x0, 0x0, - 0x0, 0x0, 0xb8, 0x66, 0x66, 0x6a, 0x30, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb8, 0x66, 0x66, 0x6c, 0x50, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x3, 0x70, - 0x6, 0x76, 0xe6, 0x6a, 0x66, 0x66, 0x66, 0x50, - 0x0, 0x1, 0xd0, 0x2, 0x60, 0x8, 0xb0, 0x0, - 0x0, 0x1, 0xd0, 0x0, 0x75, 0x85, 0x10, 0x0, - 0x0, 0x1, 0xd0, 0x3, 0xa, 0x60, 0x0, 0x0, - 0x0, 0x1, 0xd4, 0x82, 0x0, 0x8c, 0x51, 0x0, - 0x0, 0x3, 0xf9, 0x0, 0x0, 0x3, 0xbf, 0xa1, - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x2, 0x0, - - /* U+9589 "閉" */ - 0x50, 0x0, 0x70, 0x4, 0x0, 0x7, 0xe, 0x66, - 0x6e, 0x10, 0xe6, 0x66, 0xf2, 0xe0, 0x0, 0xd0, - 0xd, 0x0, 0xe, 0xe, 0x66, 0x6d, 0x0, 0xd6, - 0x66, 0xe0, 0xe6, 0x66, 0xd0, 0xe, 0x66, 0x6e, - 0xe, 0x0, 0x4, 0x1, 0x60, 0x0, 0xe0, 0xe0, - 0x0, 0x0, 0xd1, 0x0, 0xe, 0xe, 0x5, 0x66, - 0x6e, 0x67, 0xa0, 0xe0, 0xe0, 0x10, 0x1c, 0xe0, - 0x0, 0xe, 0xe, 0x0, 0xb, 0x3d, 0x0, 0x0, - 0xe0, 0xe0, 0x19, 0x20, 0xd0, 0x0, 0xe, 0xe, - 0x26, 0x0, 0xd, 0x0, 0x0, 0xe0, 0xe0, 0x0, - 0x3b, 0xd0, 0x0, 0xd, 0xe, 0x0, 0x0, 0x11, - 0x1, 0x8e, 0xa0, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x40, 0x0, - - /* U+958B "開" */ - 0x40, 0x0, 0x60, 0x4, 0x0, 0x6, 0xf, 0x66, - 0x6e, 0x10, 0xe6, 0x66, 0xf1, 0xe6, 0x66, 0xd0, - 0xe, 0x66, 0x6e, 0xe, 0x0, 0xd, 0x0, 0xe0, - 0x0, 0xe0, 0xe6, 0x66, 0xd0, 0xe, 0x66, 0x6e, - 0xe, 0x0, 0x3, 0x0, 0x60, 0x0, 0xe0, 0xe0, - 0x16, 0x66, 0x66, 0xb2, 0xe, 0xe, 0x0, 0x2c, - 0x2, 0xa0, 0x0, 0xe0, 0xe0, 0x0, 0xc0, 0x2a, - 0x2, 0xe, 0xe, 0x7, 0x6d, 0x67, 0xc7, 0xa0, - 0xe0, 0xe0, 0x0, 0xc0, 0x2a, 0x0, 0xe, 0xe, - 0x0, 0x57, 0x2, 0xa0, 0x0, 0xe0, 0xe0, 0x49, - 0x0, 0x2a, 0x0, 0xd, 0xe, 0x13, 0x0, 0x1, - 0x11, 0x7d, 0xb0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x41, 0x0, - - /* U+9593 "間" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x66, - 0x6b, 0x0, 0x96, 0x66, 0xc1, 0xe0, 0x1, 0xc0, - 0xd, 0x0, 0xe, 0xe, 0x66, 0x6c, 0x0, 0xd6, - 0x66, 0xe0, 0xe0, 0x1, 0xc0, 0xd, 0x0, 0xe, - 0xe, 0x66, 0x6c, 0x0, 0xd6, 0x66, 0xe0, 0xe0, - 0x0, 0x10, 0x4, 0x0, 0xe, 0xe, 0x0, 0x96, - 0x66, 0x97, 0x0, 0xe0, 0xe0, 0xd, 0x10, 0x8, - 0x50, 0xe, 0xe, 0x0, 0xd1, 0x0, 0x85, 0x0, - 0xe0, 0xe0, 0xd, 0x66, 0x6b, 0x50, 0xe, 0xe, - 0x0, 0xd1, 0x0, 0x85, 0x0, 0xe0, 0xe0, 0xd, - 0x66, 0x6b, 0x50, 0xe, 0xe, 0x0, 0x80, 0x0, - 0x42, 0x0, 0xd0, 0xe0, 0x0, 0x0, 0x0, 0x18, - 0xdb, 0x5, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, - - /* U+95A2 "関" */ - 0xa6, 0x66, 0xb1, 0xa, 0x66, 0x6c, 0x1e, 0x0, - 0xd, 0x0, 0xd0, 0x0, 0xe0, 0xe6, 0x66, 0xd0, - 0xd, 0x66, 0x6e, 0xe, 0x0, 0xd, 0x0, 0xd0, - 0x0, 0xe0, 0xe6, 0x66, 0xd0, 0xe, 0x66, 0x6e, - 0xe, 0x0, 0x34, 0x0, 0x70, 0x0, 0xe0, 0xe0, - 0x0, 0xc1, 0x1b, 0x0, 0xe, 0xe, 0x2, 0x68, - 0x69, 0x69, 0x40, 0xe0, 0xe0, 0x2, 0x7, 0x60, - 0x0, 0xe, 0xe, 0x6, 0x76, 0xb8, 0x66, 0xa0, - 0xe0, 0xe0, 0x0, 0x1d, 0x73, 0x0, 0xe, 0xe, - 0x0, 0x1b, 0x20, 0x7d, 0x10, 0xe0, 0xe0, 0x58, - 0x10, 0x0, 0x31, 0xe, 0xe, 0x0, 0x0, 0x0, - 0x1, 0x7b, 0xd0, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x52, 0x0, - - /* U+95DC "關" */ - 0x96, 0x66, 0xa1, 0x8, 0x66, 0x6b, 0x3d, 0x0, - 0xb, 0x0, 0xd0, 0x0, 0xd0, 0xe6, 0x66, 0xc0, - 0xd, 0x66, 0x6e, 0xd, 0x66, 0x6c, 0x0, 0xd6, - 0x66, 0xe0, 0xd0, 0x1, 0x70, 0x6, 0x70, 0xd, - 0xd, 0x0, 0x73, 0x11, 0x92, 0x30, 0xd0, 0xd0, - 0xa9, 0xb6, 0x97, 0xa9, 0xd, 0xd, 0x2, 0x63, - 0x42, 0x72, 0x50, 0xd0, 0xd0, 0x98, 0x69, 0x69, - 0x59, 0xd, 0xd, 0x9, 0x15, 0x65, 0x70, 0x60, - 0xd0, 0xd0, 0xc6, 0x86, 0x4a, 0x6d, 0xd, 0xd, - 0x2, 0x6, 0x44, 0x70, 0x50, 0xd0, 0xd0, 0x3, - 0x80, 0x57, 0x0, 0xd, 0xd, 0x1, 0x30, 0x1, - 0x10, 0x6c, 0xc0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x21, 0x0, - - /* U+95F0 "闰" */ - 0x0, 0x83, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x2f, 0x2, 0x86, 0x66, 0x66, 0xe2, 0xa, 0x16, - 0x0, 0x0, 0x0, 0x0, 0xe0, 0xe, 0x0, 0x0, - 0x0, 0x1, 0x50, 0xe0, 0xd, 0x6, 0x76, 0x7c, - 0x66, 0x60, 0xe0, 0xd, 0x0, 0x0, 0x2b, 0x0, - 0x0, 0xe0, 0xd, 0x0, 0x0, 0x2b, 0x3, 0x0, - 0xe0, 0xd, 0x0, 0x76, 0x7d, 0x68, 0x40, 0xe0, - 0xd, 0x0, 0x0, 0x2b, 0x0, 0x0, 0xe0, 0xd, - 0x0, 0x0, 0x2b, 0x0, 0x0, 0xe0, 0xd, 0x26, - 0x66, 0x7d, 0x66, 0xe3, 0xe0, 0xd, 0x2, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0xd, 0x0, 0x0, 0x0, - 0x0, 0x22, 0xe0, 0xd, 0x0, 0x0, 0x0, 0x0, - 0x5d, 0xc0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, - - /* U+9633 "阳" */ - 0x40, 0x1, 0x40, 0x0, 0x0, 0x0, 0xe, 0x66, - 0xad, 0x19, 0x66, 0x66, 0xb2, 0xd0, 0xb, 0x20, - 0xc0, 0x0, 0xd, 0xd, 0x1, 0x90, 0xc, 0x0, - 0x0, 0xd0, 0xd0, 0x51, 0x0, 0xc0, 0x0, 0xd, - 0xd, 0x5, 0x10, 0xc, 0x0, 0x0, 0xd0, 0xd0, - 0x8, 0x10, 0xd6, 0x66, 0x6d, 0xd, 0x0, 0x18, - 0xc, 0x0, 0x0, 0xd0, 0xd0, 0x0, 0xb0, 0xc0, - 0x0, 0xd, 0xd, 0x24, 0x98, 0xc, 0x0, 0x0, - 0xd0, 0xd0, 0x8a, 0x0, 0xc0, 0x0, 0xd, 0xd, - 0x0, 0x0, 0xd, 0x66, 0x66, 0xd0, 0xd0, 0x0, - 0x0, 0xc0, 0x0, 0xd, 0xd, 0x0, 0x0, 0x6, - 0x0, 0x0, 0x60, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+9644 "附" */ - 0x20, 0x3, 0x0, 0x73, 0x0, 0x82, 0x0, 0xe6, - 0x6e, 0x10, 0xd1, 0x0, 0xd0, 0x0, 0xd0, 0x56, - 0x4, 0x80, 0x0, 0xc0, 0x0, 0xd0, 0x90, 0xa, - 0x10, 0x0, 0xc0, 0x0, 0xd0, 0x80, 0x2f, 0x25, - 0x66, 0xd7, 0xa0, 0xd0, 0x50, 0x7c, 0x1, 0x0, - 0xc0, 0x0, 0xd0, 0x55, 0x2c, 0x2, 0x0, 0xc0, - 0x0, 0xd0, 0xa, 0xc, 0x3, 0xb1, 0xc0, 0x0, - 0xd0, 0xd, 0xc, 0x0, 0x85, 0xc0, 0x0, 0xd3, - 0x4c, 0xc, 0x0, 0x0, 0xc0, 0x0, 0xd4, 0xd3, - 0xc, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, 0xc, - 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, 0xc, 0x0, - 0x21, 0xd0, 0x0, 0xd0, 0x0, 0xb, 0x0, 0x2c, - 0xc0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+964D "降" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, - 0x4, 0x0, 0x68, 0x0, 0x0, 0x0, 0xe6, 0x6f, - 0x30, 0xb7, 0x66, 0xaa, 0x0, 0xd0, 0x39, 0x2, - 0xc1, 0x2, 0xd1, 0x0, 0xd0, 0x72, 0x8, 0x18, - 0x1c, 0x20, 0x0, 0xd0, 0x60, 0x32, 0x3, 0xe3, - 0x0, 0x0, 0xd0, 0x60, 0x0, 0x2a, 0x6b, 0x61, - 0x0, 0xd0, 0x18, 0x5, 0x80, 0x83, 0x7d, 0xa1, - 0xd0, 0xa, 0x51, 0x0, 0xc1, 0x6, 0x0, 0xd0, - 0x8, 0x67, 0x66, 0xd6, 0x66, 0x10, 0xd5, 0x3d, - 0x3c, 0x20, 0xc0, 0x0, 0x0, 0xd2, 0xe7, 0x3a, - 0x0, 0xc0, 0x1, 0x60, 0xd0, 0x0, 0x57, 0x66, - 0xd6, 0x66, 0x50, 0xd0, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x70, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, - - /* U+9650 "限" */ - 0x2, 0x0, 0x30, 0x20, 0x0, 0x3, 0x10, 0x0, - 0xe6, 0x7d, 0xd, 0x66, 0x66, 0xc6, 0x0, 0xd, - 0x6, 0x60, 0xd0, 0x0, 0xb, 0x30, 0x0, 0xd0, - 0x90, 0xd, 0x0, 0x0, 0xb3, 0x0, 0xd, 0x7, - 0x0, 0xd6, 0x66, 0x6c, 0x30, 0x0, 0xd0, 0x50, - 0xd, 0x0, 0x0, 0xb3, 0x0, 0xd, 0x6, 0x20, - 0xd6, 0x66, 0x6c, 0x30, 0x0, 0xd0, 0xa, 0xd, - 0x6, 0x0, 0x45, 0x0, 0xd, 0x0, 0xc0, 0xd0, - 0x61, 0x8, 0xd2, 0x0, 0xd2, 0x2e, 0xd, 0x2, - 0x88, 0x50, 0x0, 0xd, 0x4f, 0x90, 0xd0, 0xa, - 0x40, 0x0, 0x0, 0xd0, 0x20, 0xd, 0x1, 0x3d, - 0x30, 0x0, 0xd, 0x0, 0x0, 0xd8, 0x60, 0x2e, - 0xa4, 0x0, 0xe0, 0x0, 0xd, 0x50, 0x0, 0x2c, - 0x60, 0x5, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x0, - - /* U+9662 "院" */ - 0x0, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x1, - 0xc6, 0x6e, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xb, - 0x3, 0x72, 0x96, 0x6a, 0x66, 0xa6, 0x0, 0xb0, - 0x70, 0x86, 0x0, 0x0, 0x8, 0x0, 0xb, 0x5, - 0x4, 0x0, 0x0, 0x6, 0x0, 0x0, 0xb0, 0x30, - 0x2, 0x86, 0x66, 0x50, 0x0, 0xb, 0x5, 0x30, - 0x0, 0x0, 0x0, 0x10, 0x0, 0xb0, 0xb, 0x38, - 0x67, 0x68, 0x6b, 0x30, 0xb, 0x0, 0xb2, 0x3, - 0x91, 0xb0, 0x0, 0x0, 0xb2, 0x3d, 0x20, 0x57, - 0x1b, 0x0, 0x0, 0xb, 0x1c, 0x80, 0x9, 0x41, - 0xb0, 0x2, 0x0, 0xb0, 0x0, 0x0, 0xd0, 0x1b, - 0x0, 0x60, 0xb, 0x0, 0x0, 0xa4, 0x1, 0xb0, - 0xb, 0x1, 0xb0, 0x2, 0x82, 0x0, 0xc, 0xbc, - 0xc1, 0x15, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+9664 "除" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x1, 0x10, 0x2, 0xd1, 0x0, 0x0, 0xa7, 0x6c, - 0x80, 0xa, 0x94, 0x0, 0x0, 0x92, 0xd, 0x0, - 0x3c, 0x8, 0x20, 0x0, 0x92, 0x55, 0x0, 0xb2, - 0x0, 0xc3, 0x0, 0x92, 0x70, 0x8, 0x40, 0x0, - 0x2d, 0xa3, 0x92, 0x60, 0x63, 0x76, 0x86, 0xb3, - 0x95, 0x92, 0x28, 0x0, 0x0, 0xc1, 0x0, 0x0, - 0x92, 0xb, 0x20, 0x0, 0xc1, 0x1, 0x40, 0x92, - 0x9, 0x68, 0x66, 0xd6, 0x67, 0x70, 0x96, 0x5d, - 0x30, 0x60, 0xc1, 0x20, 0x0, 0x93, 0xb6, 0x6, - 0xd1, 0xc1, 0x28, 0x0, 0x92, 0x0, 0x2b, 0x0, - 0xc1, 0x3, 0xd1, 0xa2, 0x1, 0x80, 0x0, 0xc0, - 0x0, 0x96, 0xa2, 0x2, 0x1, 0x6c, 0xe0, 0x0, - 0x10, 0x40, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, - - /* U+9678 "陸" */ - 0x11, 0x0, 0x20, 0x0, 0xc, 0x10, 0x0, 0x3, - 0xc6, 0x6d, 0x50, 0x0, 0xd0, 0x0, 0x0, 0x2a, - 0x1, 0xb0, 0x66, 0x6e, 0x66, 0xc2, 0x2, 0xa0, - 0x72, 0x1, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x6, - 0x0, 0x0, 0xd, 0x0, 0x5, 0x2, 0xa0, 0x51, - 0x86, 0x76, 0x76, 0x66, 0x82, 0x2a, 0x5, 0x30, - 0xc, 0x70, 0x39, 0x40, 0x2, 0xa0, 0xb, 0x9, - 0x50, 0xc1, 0x1d, 0x30, 0x2a, 0x0, 0xe4, 0x10, - 0xd, 0x0, 0x21, 0x2, 0xc6, 0xa9, 0x0, 0x0, - 0xd0, 0x5, 0x0, 0x2a, 0x28, 0x1, 0x86, 0x6e, - 0x66, 0x72, 0x2, 0xa0, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0xd, 0x0, - 0x3, 0x3, 0xa0, 0x7, 0x66, 0x66, 0xa6, 0x67, - 0xa2, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+967D "陽" */ - 0x40, 0x1, 0x40, 0x52, 0x22, 0x26, 0x10, 0xc6, - 0x6a, 0xb0, 0xd4, 0x44, 0x4d, 0x20, 0xb1, 0xb, - 0x10, 0xd6, 0x66, 0x6e, 0x0, 0xb1, 0x27, 0x0, - 0xd0, 0x0, 0xd, 0x0, 0xb1, 0x60, 0x0, 0xe6, - 0x66, 0x6e, 0x0, 0xb1, 0x51, 0x0, 0x70, 0x0, - 0x4, 0x0, 0xb1, 0xa, 0x27, 0x66, 0x66, 0x66, - 0xb4, 0xb1, 0x8, 0x40, 0x2d, 0x0, 0x0, 0x0, - 0xb1, 0x7, 0x70, 0xb8, 0x86, 0x86, 0xd3, 0xb6, - 0x7d, 0x39, 0x42, 0xb2, 0xb0, 0xd0, 0xb1, 0x85, - 0x62, 0xb, 0x19, 0x50, 0xd0, 0xb1, 0x0, 0x1, - 0x92, 0x4a, 0x2, 0xb0, 0xb1, 0x0, 0x15, 0x3, - 0xa0, 0x5, 0x90, 0xb1, 0x0, 0x0, 0x66, 0x5, - 0xbe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, - 0x0, - - /* U+968E "階" */ - 0x12, 0x0, 0x41, 0x60, 0x0, 0x90, 0x0, 0x3, - 0xb6, 0x6e, 0x4d, 0x0, 0xd, 0x3, 0x10, 0x29, - 0x4, 0x70, 0xd0, 0x51, 0xd2, 0xc5, 0x2, 0x90, - 0x90, 0xe, 0x66, 0x3e, 0x60, 0x10, 0x29, 0x24, - 0x0, 0xd0, 0x1, 0xd0, 0x5, 0x2, 0x90, 0x70, - 0xd, 0x76, 0xe, 0x0, 0xa0, 0x29, 0x4, 0x71, - 0xc3, 0x11, 0x8b, 0xba, 0x12, 0x90, 0xd, 0x0, - 0x7, 0x80, 0x0, 0x0, 0x29, 0x11, 0xe0, 0xa6, - 0xa6, 0x66, 0xb1, 0x2, 0x95, 0xf6, 0xd, 0x0, - 0x0, 0xd, 0x0, 0x29, 0x0, 0x0, 0xd6, 0x66, - 0x66, 0xd0, 0x2, 0x90, 0x0, 0xd, 0x0, 0x0, - 0xd, 0x0, 0x39, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0xd0, 0x3, 0x90, 0x0, 0xd, 0x66, 0x66, 0x6d, - 0x0, 0x10, 0x0, 0x0, 0x30, 0x0, 0x0, 0x20, - 0x0, - - /* U+969B "際" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x5, - 0x0, 0x44, 0xd, 0x50, 0x40, 0x0, 0x0, 0xc8, - 0x7d, 0x82, 0xf6, 0xa8, 0x66, 0xc3, 0xc, 0x1, - 0xc0, 0xa6, 0xc, 0x43, 0x1b, 0x0, 0xc0, 0x63, - 0x38, 0x95, 0xa0, 0x67, 0x10, 0xc, 0x6, 0x7, - 0x93, 0xa2, 0x7, 0x60, 0x0, 0xc0, 0x60, 0x2, - 0x57, 0x0, 0xc, 0x50, 0xc, 0x2, 0x80, 0x47, - 0x0, 0x2, 0x4c, 0x90, 0xc0, 0xb, 0x43, 0x18, - 0x66, 0x64, 0x0, 0xc, 0x0, 0xa4, 0x0, 0x0, - 0x0, 0x6, 0x0, 0xc4, 0xad, 0x6, 0x76, 0x6e, - 0x66, 0x62, 0xc, 0x3, 0x10, 0x6, 0x40, 0xd0, - 0x50, 0x0, 0xc0, 0x0, 0x4, 0xc3, 0xd, 0x3, - 0xc2, 0xc, 0x0, 0x5, 0x70, 0x0, 0xd0, 0x5, - 0xd0, 0xd0, 0x2, 0x20, 0x17, 0xdb, 0x0, 0x4, - 0x4, 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, - - /* U+969C "障" */ - 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, 0x0, 0xb6, - 0x8d, 0x0, 0x0, 0xc0, 0x6, 0x0, 0xc1, 0x76, - 0x7, 0x97, 0x66, 0xd6, 0x30, 0xb1, 0xa0, 0x0, - 0xc, 0x4, 0x90, 0x0, 0xb1, 0x71, 0x66, 0x6c, - 0x6a, 0x66, 0xc5, 0xb2, 0x40, 0x22, 0x0, 0x0, - 0x3, 0x0, 0xb1, 0x43, 0xb, 0x76, 0x66, 0x6c, - 0x50, 0xb1, 0xb, 0xb, 0x20, 0x0, 0xb, 0x20, - 0xb1, 0xd, 0xb, 0x76, 0x66, 0x6c, 0x20, 0xb5, - 0x4e, 0xb, 0x76, 0x66, 0x6c, 0x20, 0xb3, 0xd5, - 0x5, 0x0, 0xd0, 0x4, 0x30, 0xb1, 0x2, 0x86, - 0x66, 0xe6, 0x66, 0xa6, 0xb1, 0x0, 0x0, 0x0, - 0xd0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x60, 0x0, - 0x0, - - /* U+96A3 "隣" */ - 0x20, 0x3, 0x0, 0x20, 0x29, 0x3, 0x0, 0xc, - 0x66, 0xe5, 0x8, 0x62, 0xb0, 0xd5, 0x0, 0xc0, - 0x3a, 0x0, 0x7, 0x2b, 0x64, 0x0, 0xc, 0x9, - 0x10, 0x67, 0x7a, 0xd9, 0x69, 0x60, 0xc2, 0x40, - 0x0, 0x1b, 0x4b, 0x72, 0x0, 0xc, 0x7, 0x0, - 0x58, 0x2, 0xb0, 0xac, 0x70, 0xc0, 0x37, 0x32, - 0x20, 0x29, 0x2, 0x21, 0xc, 0x0, 0xc0, 0x5c, - 0x0, 0x0, 0xd0, 0x0, 0xc1, 0xd, 0x1c, 0x78, - 0xc4, 0x7d, 0x69, 0xc, 0x4e, 0x88, 0x70, 0x95, - 0x51, 0xc0, 0x0, 0xc0, 0x13, 0x4a, 0x2c, 0xc, - 0x1c, 0x5, 0xc, 0x0, 0x0, 0x3a, 0x41, 0x86, - 0xd6, 0x61, 0xc0, 0x0, 0x7, 0x70, 0x0, 0xc, - 0x0, 0xd, 0x0, 0x7, 0x40, 0x0, 0x0, 0xd0, - 0x0, 0x30, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, - 0x0, - - /* U+96A8 "隨" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x11, 0x50, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xc5, - 0x7d, 0x30, 0x46, 0x6e, 0x66, 0xa3, 0xc, 0x7, - 0x34, 0x91, 0x19, 0x30, 0x2, 0x0, 0xc0, 0x70, - 0xc, 0x8, 0x96, 0xb6, 0x80, 0xc, 0x22, 0x0, - 0x5, 0x66, 0x6d, 0x67, 0x70, 0xc0, 0x90, 0x3, - 0x1, 0x10, 0x0, 0x10, 0xc, 0x4, 0x87, 0xd5, - 0x2b, 0x66, 0x6d, 0x0, 0xc0, 0xd, 0xc, 0x1, - 0xa0, 0x0, 0xc0, 0xc, 0x1, 0xd0, 0xc0, 0x1c, - 0x66, 0x6c, 0x0, 0xc5, 0xe4, 0xc, 0x1, 0xc6, - 0x66, 0xc0, 0xc, 0x0, 0x0, 0xc0, 0x2a, 0x0, - 0xc, 0x0, 0xc0, 0x0, 0x1a, 0x22, 0xa0, 0x38, - 0xa0, 0xc, 0x0, 0x3a, 0x6, 0x84, 0x10, 0x42, - 0x10, 0xb0, 0x5, 0x20, 0x2, 0x9d, 0xee, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+96BB "隻" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x5, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xb0, 0xd, 0x0, 0x0, 0x10, 0x0, 0x3, - 0xf6, 0x66, 0x76, 0x66, 0x9c, 0x10, 0x1, 0xac, - 0x0, 0xe, 0x0, 0x2, 0x0, 0x1, 0x71, 0xd6, - 0x66, 0xe6, 0x66, 0xa1, 0x0, 0x20, 0xc, 0x0, - 0xe, 0x0, 0x6, 0x0, 0x0, 0x0, 0xd6, 0x66, - 0xe6, 0x66, 0x62, 0x0, 0x0, 0xd, 0x66, 0x6e, - 0x66, 0x66, 0xd2, 0x0, 0x0, 0x60, 0x0, 0x0, - 0x2, 0x0, 0x0, 0x0, 0x77, 0x66, 0x66, 0x67, - 0xf3, 0x0, 0x0, 0x0, 0x8, 0x10, 0x2, 0xc4, - 0x0, 0x0, 0x0, 0x0, 0x9, 0x56, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5e, 0xe6, 0x10, 0x0, - 0x0, 0x0, 0x47, 0x85, 0x0, 0x6b, 0xcb, 0xa9, - 0x13, 0x41, 0x0, 0x0, 0x0, 0x0, 0x24, 0x20, - - /* U+96C6 "集" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0x5, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb5, 0x0, 0xc2, 0x0, 0x2, 0x0, - 0x0, 0x4, 0xe6, 0x66, 0xa6, 0x66, 0x6b, 0x10, - 0x0, 0x1d, 0xa0, 0x0, 0xc0, 0x0, 0x20, 0x0, - 0x0, 0x94, 0xc6, 0x66, 0xd6, 0x66, 0x93, 0x0, - 0x6, 0x12, 0xa0, 0x0, 0xc0, 0x0, 0x60, 0x0, - 0x0, 0x2, 0xc6, 0x66, 0xd6, 0x66, 0x62, 0x0, - 0x0, 0x3, 0xc6, 0x66, 0xd6, 0x66, 0x7b, 0x0, - 0x0, 0x3, 0x90, 0x1, 0xa0, 0x0, 0x0, 0x0, - 0x5, 0x66, 0x66, 0x66, 0xd6, 0x66, 0x66, 0xd2, - 0x1, 0x0, 0x0, 0x98, 0xb5, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x1a, 0x51, 0xb0, 0x94, 0x0, 0x0, - 0x0, 0x4, 0x92, 0x1, 0xb0, 0x9, 0xb5, 0x20, - 0x3, 0x64, 0x0, 0x2, 0xc0, 0x0, 0x3b, 0xd3, - 0x1, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, - - /* U+96D1 "雑" */ - 0x0, 0xa, 0x10, 0x0, 0x2, 0x5, 0x0, 0x0, - 0x0, 0xd, 0x2, 0x0, 0x3e, 0x9, 0x60, 0x0, - 0x3, 0x6e, 0x6e, 0x10, 0x66, 0x4, 0x52, 0x0, - 0x0, 0x1b, 0xb, 0x0, 0xb7, 0x6a, 0x69, 0x60, - 0x0, 0x65, 0x38, 0x42, 0xf2, 0xd, 0x0, 0x0, - 0x2, 0x90, 0x2b, 0xb9, 0xc2, 0xd, 0x0, 0x0, - 0x15, 0x1, 0xb0, 0x5, 0xa7, 0x6e, 0x6b, 0x20, - 0x0, 0x1, 0xb0, 0x20, 0xa2, 0xd, 0x0, 0x0, - 0x6, 0x66, 0xd6, 0x84, 0xa2, 0xd, 0x0, 0x0, - 0x0, 0x31, 0xb2, 0x0, 0xa7, 0x6e, 0x6c, 0x20, - 0x0, 0xd4, 0xb4, 0x80, 0xa2, 0xd, 0x0, 0x0, - 0x5, 0x51, 0xb0, 0x88, 0xa2, 0xd, 0x0, 0x0, - 0x17, 0x1, 0xb0, 0x4, 0xb2, 0xd, 0x2, 0x50, - 0x0, 0x3a, 0xa0, 0x0, 0xb7, 0x66, 0x66, 0x50, - 0x0, 0x3, 0x10, 0x0, 0x50, 0x0, 0x0, 0x0, - - /* U+96D6 "雖" */ - 0x0, 0x0, 0x0, 0x0, 0x34, 0x30, 0x0, 0x0, - 0x86, 0x66, 0xd3, 0x7, 0xb7, 0xa0, 0x0, 0x8, - 0x20, 0xc, 0x0, 0xb2, 0xa, 0x1, 0x0, 0x82, - 0x0, 0xc0, 0x1d, 0x66, 0x86, 0xb2, 0x9, 0x7a, - 0x6d, 0x17, 0xc0, 0x1b, 0x0, 0x0, 0x20, 0xc0, - 0x0, 0x7c, 0x1, 0xb0, 0x0, 0x28, 0x6d, 0x66, - 0xb0, 0xd6, 0x6c, 0x6b, 0x2, 0x90, 0xc0, 0x4a, - 0xc, 0x1, 0xb0, 0x0, 0x29, 0xc, 0x4, 0xa0, - 0xc0, 0x1b, 0x0, 0x2, 0xb6, 0xd6, 0x8a, 0xd, - 0x66, 0xc6, 0xb0, 0x13, 0xc, 0x3, 0x10, 0xc0, - 0x1b, 0x0, 0x0, 0x0, 0xc0, 0x73, 0xc, 0x1, - 0xb0, 0x0, 0x45, 0x7d, 0x88, 0xc0, 0xc0, 0x1b, - 0x6, 0x26, 0x95, 0x10, 0xc, 0xd, 0x66, 0x66, - 0x63, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, - - /* U+96D9 "雙" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x28, 0x0, 0x27, 0x39, 0x0, 0x0, - 0x0, 0x4c, 0xa, 0x10, 0x78, 0xa, 0x3, 0x0, - 0x0, 0xd7, 0x68, 0x85, 0xc6, 0x6a, 0x68, 0x20, - 0x7, 0xe0, 0x1a, 0x23, 0xf0, 0x1a, 0x2, 0x0, - 0x13, 0xc6, 0x6c, 0x76, 0xc6, 0x6c, 0x66, 0x0, - 0x0, 0xc0, 0x1a, 0x20, 0xc0, 0x1a, 0x2, 0x0, - 0x0, 0xc6, 0x6c, 0x62, 0xc6, 0x6c, 0x66, 0x0, - 0x0, 0xc3, 0x4b, 0x54, 0xc0, 0x1a, 0x5, 0x10, - 0x0, 0xa3, 0x33, 0x32, 0xa6, 0x66, 0x66, 0x30, - 0x0, 0x56, 0x76, 0x66, 0x66, 0x6b, 0x50, 0x0, - 0x0, 0x0, 0x26, 0x0, 0x0, 0x98, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x82, 0x5a, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4d, 0xd3, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x78, 0x50, 0x17, 0xbb, 0x98, 0x83, - 0x4, 0x52, 0x0, 0x0, 0x0, 0x1, 0x46, 0x50, - - /* U+96E2 "離" */ - 0x0, 0x8, 0x0, 0x0, 0x24, 0x11, 0x0, 0x0, - 0x0, 0x84, 0x5, 0x16, 0xc0, 0xb1, 0x0, 0x46, - 0x66, 0x97, 0x62, 0x93, 0x7, 0x40, 0x0, 0x93, - 0x6b, 0x36, 0xd, 0x66, 0x86, 0xb2, 0xb, 0xa, - 0x80, 0xc3, 0xf0, 0xd, 0x0, 0x0, 0xc4, 0x9, - 0xc, 0x6d, 0x0, 0xd0, 0x0, 0x2c, 0x68, 0x66, - 0xc1, 0xd6, 0x6e, 0x6a, 0x0, 0x0, 0xc2, 0x2, - 0xd, 0x0, 0xd0, 0x0, 0x2a, 0x6b, 0x55, 0xd2, - 0xd0, 0xd, 0x0, 0x2, 0x97, 0x15, 0xb, 0xd, - 0x66, 0xe6, 0xb0, 0x2b, 0xc8, 0xa4, 0xb0, 0xd0, - 0xd, 0x0, 0x2, 0x94, 0x1, 0xb, 0xd, 0x0, - 0xd0, 0x0, 0x29, 0x0, 0x0, 0xb0, 0xd0, 0xd, - 0x5, 0x2, 0x90, 0x5, 0xcb, 0xd, 0x66, 0x66, - 0x63, 0x13, 0x0, 0x1, 0x0, 0x30, 0x0, 0x0, - 0x0, - - /* U+96E3 "難" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x16, 0x2, 0x60, 0x4, 0xc5, 0x40, 0x0, - 0x0, 0x29, 0x2, 0xb0, 0x7, 0xa0, 0xe1, 0x0, - 0x5, 0x8b, 0x67, 0xd8, 0x5b, 0x20, 0x50, 0x60, - 0x0, 0x29, 0x2, 0xb0, 0x1f, 0x66, 0xd6, 0x72, - 0x0, 0x28, 0xc7, 0x70, 0x6e, 0x0, 0xc0, 0x0, - 0x0, 0x86, 0xd6, 0x69, 0x6d, 0x0, 0xc0, 0x0, - 0x0, 0xc0, 0xc0, 0xb, 0xd, 0x66, 0xd6, 0x90, - 0x0, 0xd6, 0xd6, 0x6b, 0xd, 0x0, 0xc0, 0x0, - 0x0, 0x30, 0xc0, 0x5, 0xd, 0x0, 0xc0, 0x0, - 0x0, 0x76, 0xd6, 0x66, 0xd, 0x66, 0xd6, 0xa0, - 0x5, 0x76, 0xd6, 0x6a, 0x4d, 0x0, 0xc0, 0x0, - 0x0, 0x1, 0x93, 0x10, 0xd, 0x0, 0xc0, 0x0, - 0x0, 0xa, 0x21, 0xd3, 0xd, 0x0, 0xc0, 0x40, - 0x1, 0x82, 0x0, 0x44, 0xd, 0x66, 0x76, 0x73, - 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, - - /* U+96E8 "雨" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x67, - 0x66, 0x66, 0x86, 0x66, 0x68, 0xc1, 0x0, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - 0xd0, 0x0, 0x5, 0x0, 0xd, 0x66, 0x66, 0xe6, - 0x66, 0x6e, 0x20, 0xc, 0x16, 0x20, 0xd1, 0x50, - 0xe, 0x0, 0xc, 0x11, 0xe3, 0xd0, 0x6c, 0xe, - 0x0, 0xc, 0x10, 0x53, 0xd0, 0x8, 0xe, 0x0, - 0xc, 0x10, 0x0, 0xd0, 0x0, 0xe, 0x0, 0xc, - 0x1a, 0x50, 0xd1, 0x93, 0xe, 0x0, 0xc, 0x11, - 0xe0, 0xd0, 0x2e, 0xe, 0x0, 0xc, 0x10, 0x10, - 0xd0, 0x3, 0xe, 0x0, 0xc, 0x10, 0x0, 0xd0, - 0x15, 0x5f, 0x0, 0xc, 0x10, 0x0, 0x90, 0x2, - 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - 0x0, - - /* U+96EA "雪" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x50, 0x0, - 0x4, 0x76, 0x66, 0xd6, 0x66, 0x66, 0x0, 0x1, - 0x20, 0x0, 0xd, 0x0, 0x0, 0x5, 0x10, 0x59, - 0x66, 0x66, 0xe6, 0x66, 0x66, 0xe5, 0xd, 0x45, - 0x66, 0x1d, 0x5, 0x66, 0x42, 0x0, 0x30, 0x0, - 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x66, - 0x1d, 0x5, 0x66, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x70, 0x0, 0x10, 0x0, 0x0, 0x37, 0x66, 0x66, - 0x66, 0x6b, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x76, 0x0, 0x0, 0x6, 0x66, 0x66, 0x66, - 0x6a, 0x60, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, - 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0x60, 0x0, 0x6, 0x76, 0x66, 0x66, 0x66, 0xa6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, - 0x0, - - /* U+96F2 "雲" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x56, 0x66, 0x66, 0x66, 0x98, 0x0, 0x0, 0x20, - 0x0, 0xa3, 0x0, 0x0, 0x0, 0x9, 0x66, 0x66, - 0xc8, 0x66, 0x66, 0xb1, 0x59, 0x0, 0x0, 0xa3, - 0x0, 0x1, 0xc3, 0x82, 0x56, 0x60, 0xa3, 0x56, - 0x64, 0x10, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, - 0x0, 0x0, 0x56, 0x60, 0xa2, 0x56, 0x61, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x76, 0x66, 0x66, 0x66, 0x95, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x70, 0x47, 0x66, 0x6b, - 0x76, 0x66, 0x66, 0x83, 0x0, 0x0, 0x8b, 0x40, - 0x35, 0x0, 0x0, 0x0, 0x49, 0x30, 0x0, 0x4, - 0xd4, 0x0, 0x5, 0xfc, 0xba, 0x87, 0x65, 0x7e, - 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x4, 0x0, - - /* U+96FB "電" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x56, 0x66, 0x66, 0x66, 0x99, 0x0, 0x2, 0x10, - 0x0, 0xe0, 0x0, 0x0, 0x10, 0x9, 0x66, 0x66, - 0xe6, 0x66, 0x66, 0xd5, 0x5a, 0x0, 0x0, 0xe0, - 0x0, 0x0, 0x90, 0x42, 0x46, 0x60, 0xe0, 0x26, - 0x65, 0x20, 0x0, 0x45, 0x50, 0xd0, 0x26, 0x64, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0xc6, 0x66, 0x96, 0x66, 0x7e, 0x0, 0x0, - 0xd0, 0x0, 0xe0, 0x0, 0x1b, 0x0, 0x0, 0xd6, - 0x66, 0xe6, 0x66, 0x6b, 0x0, 0x0, 0xd0, 0x0, - 0xe0, 0x0, 0x1b, 0x0, 0x0, 0xd6, 0x66, 0xe6, - 0x66, 0x6b, 0x40, 0x0, 0x40, 0x0, 0xe0, 0x0, - 0x1, 0x72, 0x0, 0x0, 0x0, 0xbd, 0xbb, 0xbb, - 0xd6, - - /* U+9700 "需" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x20, 0x0, - 0x5, 0x66, 0x68, 0xb6, 0x66, 0x64, 0x0, 0x7, - 0x66, 0x66, 0x8b, 0x66, 0x66, 0x7c, 0x11, 0xd0, - 0x0, 0x4, 0x90, 0x0, 0x7, 0x20, 0x13, 0x6, - 0x63, 0x49, 0x46, 0x63, 0x10, 0x0, 0x1, 0x66, - 0x34, 0x94, 0x66, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x11, 0x0, 0x0, 0x61, 0x0, 0x76, 0x66, 0x6d, - 0x66, 0x66, 0x66, 0x40, 0x0, 0x30, 0x4, 0x30, - 0x0, 0x0, 0x40, 0x0, 0xe, 0x66, 0xe6, 0x6e, - 0x66, 0x7c, 0x0, 0x0, 0xd0, 0xd, 0x0, 0xd0, - 0x2, 0xa0, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, - 0x2a, 0x0, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x2, - 0xa0, 0x0, 0xd, 0x0, 0x90, 0x7, 0x5, 0xc9, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, - - /* U+9707 "震" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x46, 0x66, 0x66, 0x66, 0xd6, 0x0, 0x0, - 0x21, 0x10, 0xa, 0x20, 0x0, 0x2, 0x0, 0x9, - 0x66, 0x66, 0xc7, 0x66, 0x66, 0xf3, 0x3, 0xd2, - 0x66, 0x3a, 0x25, 0x66, 0x53, 0x0, 0x11, 0x0, - 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x13, 0x66, - 0x38, 0x15, 0x66, 0x50, 0x0, 0x3, 0xb6, 0x66, - 0x66, 0x66, 0x6a, 0x40, 0x0, 0x3a, 0x16, 0x66, - 0x66, 0x6a, 0x50, 0x0, 0x3, 0xa0, 0x20, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x3c, 0x69, 0x67, 0x66, - 0x66, 0x6b, 0x30, 0x5, 0x80, 0xd0, 0x25, 0x0, - 0xb4, 0x0, 0x0, 0x84, 0xd, 0x0, 0x66, 0x84, - 0x0, 0x0, 0xb, 0x0, 0xd0, 0x52, 0x7a, 0x30, - 0x0, 0x6, 0x20, 0xe, 0xa1, 0x0, 0x3b, 0xfc, - 0x70, 0x20, 0x0, 0x30, 0x0, 0x0, 0x1, 0x40, - - /* U+9752 "青" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x58, 0x0, - 0x5, 0x76, 0x66, 0x6e, 0x66, 0x66, 0x66, 0x10, - 0x0, 0x26, 0x66, 0x6e, 0x66, 0x68, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x10, - 0x6, 0x66, 0x66, 0x6d, 0x66, 0x66, 0x6b, 0xc0, - 0x1, 0x0, 0x20, 0x0, 0x0, 0x4, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x20, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x6, 0xce, 0x0, 0x0, - 0x0, 0x0, 0x70, 0x0, 0x0, 0x43, 0x0, 0x0, - - /* U+9759 "静" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x91, 0x0, 0xa, 0x40, 0x0, 0x0, - 0x0, 0x11, 0xc1, 0x42, 0x1d, 0x0, 0x60, 0x0, - 0x3, 0x65, 0xd5, 0x53, 0x87, 0x68, 0xd2, 0x0, - 0x1, 0x66, 0xd6, 0xa4, 0x60, 0x8, 0x10, 0x0, - 0x0, 0x10, 0xc0, 0x3, 0x76, 0x97, 0x6d, 0x30, - 0x7, 0x66, 0xa6, 0x79, 0x0, 0xc0, 0xc, 0x0, - 0x0, 0x30, 0x0, 0x40, 0x0, 0xc0, 0xc, 0x70, - 0x0, 0xd6, 0x66, 0xd4, 0x76, 0xd6, 0x6d, 0x52, - 0x0, 0xd6, 0x66, 0xb0, 0x0, 0xc0, 0xc, 0x0, - 0x0, 0xc0, 0x0, 0xb1, 0x66, 0xd6, 0x6d, 0x0, - 0x0, 0xd6, 0x66, 0xb0, 0x10, 0xc0, 0x4, 0x0, - 0x0, 0xc0, 0x0, 0xb0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0xb0, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0xc0, 0x5a, 0x90, 0x59, 0xd0, 0x0, 0x0, - 0x0, 0x40, 0x6, 0x10, 0x5, 0x40, 0x0, 0x0, - - /* U+975E "非" */ - 0x0, 0x0, 0x0, 0x91, 0xa, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x1, 0x0, - 0x4, 0x76, 0x66, 0xe0, 0xd, 0x66, 0x6a, 0x50, - 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x56, 0x66, 0xe0, 0xd, 0x66, 0x6c, 0x20, - 0x0, 0x10, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x1, 0x50, - 0x7, 0x66, 0x66, 0xe0, 0xd, 0x66, 0x66, 0x70, - 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x40, 0x3, 0x0, 0x0, 0x0, - - /* U+9762 "面" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa0, - 0x18, 0x66, 0x66, 0x6f, 0x76, 0x66, 0x66, 0x61, - 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x61, 0x0, 0x0, 0x5, 0x0, - 0x0, 0xd6, 0x66, 0xd6, 0x6d, 0x66, 0x6e, 0x10, - 0x0, 0xd1, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, - 0x0, 0xc1, 0x0, 0xd6, 0x6e, 0x0, 0xd, 0x0, - 0x0, 0xc1, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, - 0x0, 0xc1, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, - 0x0, 0xc1, 0x0, 0xd6, 0x6e, 0x0, 0xd, 0x0, - 0x0, 0xc1, 0x0, 0xc0, 0xd, 0x0, 0xe, 0x0, - 0x0, 0xc1, 0x0, 0xc0, 0xd, 0x0, 0xe, 0x0, - 0x0, 0xd6, 0x66, 0xd6, 0x6e, 0x66, 0x6e, 0x0, - 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - - /* U+9769 "革" */ - 0x0, 0x0, 0xa, 0x20, 0x0, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x8, 0x10, - 0x2, 0x86, 0x6e, 0x66, 0x66, 0xe6, 0x66, 0x30, - 0x0, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x6b, 0x76, 0xa0, 0x0, 0x0, - 0x0, 0x2, 0x0, 0xb, 0x20, 0x0, 0x30, 0x0, - 0x0, 0xd, 0x66, 0x6d, 0x76, 0x66, 0xf1, 0x0, - 0x0, 0xd, 0x10, 0xb, 0x20, 0x0, 0xe0, 0x0, - 0x0, 0xd, 0x66, 0x6d, 0x76, 0x66, 0xe0, 0x0, - 0x0, 0x8, 0x0, 0xb, 0x20, 0x0, 0x30, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x3, 0x90, - 0x7, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x66, 0x61, - 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, - - /* U+9774 "靴" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x66, 0x7, 0x40, 0x8, 0x17, 0x10, 0x0, - 0x0, 0x66, 0x8, 0x52, 0xe, 0x1c, 0x0, 0x0, - 0x6, 0xa9, 0x6b, 0x84, 0x48, 0xc, 0x0, 0x0, - 0x0, 0x66, 0x8, 0x40, 0x81, 0xc, 0x4, 0xa0, - 0x0, 0x68, 0xc9, 0x30, 0xa0, 0xc, 0xb, 0x30, - 0x0, 0x20, 0xc0, 0x53, 0xe2, 0xc, 0x48, 0x0, - 0x0, 0xd6, 0xd6, 0xd6, 0xb0, 0xc, 0x90, 0x0, - 0x0, 0xc0, 0xc0, 0xc1, 0xb0, 0xd, 0x20, 0x0, - 0x0, 0xd6, 0xd6, 0xc0, 0xb0, 0x7d, 0x0, 0x0, - 0x0, 0x30, 0xc0, 0x10, 0xb3, 0x1c, 0x0, 0x0, - 0x5, 0x66, 0xd6, 0xa6, 0xb0, 0xc, 0x0, 0x10, - 0x1, 0x0, 0xc0, 0x0, 0xb0, 0xc, 0x0, 0x60, - 0x0, 0x0, 0xc0, 0x0, 0xb0, 0xb, 0x0, 0x90, - 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x8, 0xcb, 0xe2, - 0x0, 0x0, 0x50, 0x0, 0x30, 0x0, 0x0, 0x0, - - /* U+97F3 "音" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x70, 0x0, 0x70, 0x0, 0x3, - 0x76, 0x76, 0x66, 0x68, 0x68, 0x30, 0x0, 0x0, - 0xa, 0x20, 0x1, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x5c, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x60, 0x8, 0x0, 0x1b, 0x30, 0x76, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x64, 0x0, 0x0, 0x40, 0x0, - 0x0, 0x7, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, - 0x66, 0xe2, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, - 0xe, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, - 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, - 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xe0, - 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, 0x0, - - /* U+97FF "響" */ - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x23, 0x1, 0x28, 0x10, 0x0, 0x10, 0x0, 0xb4, - 0xb, 0x66, 0xc3, 0xc6, 0xc3, 0x28, 0x15, 0x7b, - 0x66, 0xc0, 0xb2, 0x60, 0x49, 0x86, 0xb, 0x0, - 0xb0, 0xb4, 0x20, 0x5, 0x34, 0x8b, 0x68, 0x70, - 0xb0, 0x92, 0xa, 0x6b, 0x2b, 0x36, 0xa0, 0xb2, - 0x75, 0x0, 0x68, 0x9, 0x80, 0x40, 0xb3, 0xa0, - 0x36, 0x40, 0x0, 0x46, 0x0, 0x36, 0x0, 0x1, - 0x76, 0xb9, 0x66, 0xb8, 0x66, 0x10, 0x0, 0x0, - 0x18, 0x3, 0x81, 0x0, 0x71, 0x56, 0x58, 0x55, - 0x55, 0x55, 0x85, 0x53, 0x0, 0xd, 0x66, 0x66, - 0x66, 0xd2, 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, - 0xd0, 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, 0xd0, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x30, 0x0, - - /* U+9803 "頃" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x0, - 0xa1, 0x0, 0x7, 0x66, 0xe6, 0x66, 0x50, 0xd, - 0x0, 0x0, 0x0, 0x19, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x2, 0xb6, 0x76, 0x6d, 0x30, 0xd, 0x0, - 0x20, 0x2b, 0x0, 0x0, 0xd0, 0x0, 0xd6, 0x69, - 0x21, 0xd6, 0x66, 0x6e, 0x0, 0xd, 0x0, 0x0, - 0x1b, 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x1, - 0xd6, 0x66, 0x6e, 0x0, 0xd, 0x0, 0x0, 0x1b, - 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x5, 0x31, 0xb0, - 0x0, 0xd, 0x0, 0xd, 0x5a, 0x20, 0x2a, 0x76, - 0x66, 0xa0, 0x0, 0xfa, 0x0, 0x0, 0xd, 0x30, - 0x71, 0x0, 0x3, 0x0, 0x0, 0xa, 0x50, 0x1, - 0xd3, 0x0, 0x0, 0x0, 0x17, 0x20, 0x0, 0x5, - 0xa0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, - 0x0, - - /* U+9805 "項" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x30, - 0x0, 0x0, 0x4, 0x7, 0x66, 0xd6, 0x66, 0x50, - 0x6, 0x7c, 0x67, 0x20, 0x1, 0x90, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x3, 0x97, 0x76, 0x6c, 0x30, - 0x0, 0xd, 0x0, 0x3, 0xa0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0x2, 0xc6, 0x66, 0x6e, 0x0, - 0x0, 0xd, 0x0, 0x2, 0xa0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0x2, 0xa0, 0x0, 0xd, 0x0, - 0x0, 0xd, 0x0, 0x2, 0xc6, 0x66, 0x6e, 0x0, - 0x0, 0xd, 0x36, 0x32, 0xa0, 0x0, 0xd, 0x0, - 0x15, 0xac, 0x50, 0x3, 0xb6, 0x66, 0x6c, 0x0, - 0x1d, 0x50, 0x0, 0x0, 0xc, 0x30, 0x71, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x96, 0x0, 0x2c, 0x20, - 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x6, 0xa0, - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x20, - - /* U+9808 "須" */ - 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x6, 0x0, - 0x0, 0x9a, 0x6, 0x66, 0xb8, 0x66, 0x73, 0x0, - 0x5a, 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x48, - 0x0, 0x0, 0xa6, 0x96, 0x66, 0xd0, 0x43, 0x0, - 0x20, 0xd, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x1e, - 0x40, 0xe6, 0x66, 0x67, 0xb0, 0x0, 0xb, 0x50, - 0xd, 0x0, 0x0, 0x2b, 0x0, 0x1a, 0x30, 0x0, - 0xd0, 0x0, 0x2, 0xb0, 0x36, 0x0, 0x0, 0xe, - 0x66, 0x66, 0x7b, 0x0, 0x0, 0x3, 0xd1, 0xd0, - 0x0, 0x2, 0xb0, 0x0, 0x2, 0xd4, 0xd, 0x66, - 0x66, 0x79, 0x0, 0x3, 0xb2, 0x0, 0x8, 0x60, - 0x71, 0x0, 0x5, 0x70, 0x0, 0x5, 0xc1, 0x2, - 0xc2, 0x2, 0x10, 0x0, 0x6, 0x70, 0x0, 0x6, - 0xa0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x2, - 0x0, - - /* U+9817 "頗" */ - 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x60, - 0x0, 0x0, 0xc0, 0x4, 0x76, 0xa8, 0x66, 0x82, - 0x0, 0x10, 0xc0, 0x20, 0x0, 0xb2, 0x0, 0x0, - 0x1, 0xc6, 0xd6, 0xc6, 0x96, 0x96, 0x67, 0xc0, - 0x1, 0xb0, 0xc0, 0x80, 0xd0, 0x0, 0x2, 0xa0, - 0x1, 0xb0, 0xc0, 0x20, 0xd4, 0x44, 0x45, 0xa0, - 0x1, 0xc6, 0xd6, 0xb2, 0xd2, 0x22, 0x24, 0xa0, - 0x2, 0xa0, 0x0, 0xc0, 0xd0, 0x0, 0x2, 0xa0, - 0x3, 0x92, 0x4, 0x70, 0xd6, 0x66, 0x67, 0xa0, - 0x4, 0x71, 0x8b, 0x20, 0xd0, 0x0, 0x2, 0xb0, - 0x6, 0x40, 0x6d, 0x0, 0xd6, 0x66, 0x67, 0x90, - 0x8, 0x2, 0x98, 0x80, 0x8, 0x80, 0x61, 0x0, - 0x6, 0x28, 0x0, 0x80, 0x4c, 0x10, 0x1c, 0x40, - 0x22, 0x40, 0x0, 0x5, 0x70, 0x0, 0x3, 0xd0, - 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x20, - - /* U+9818 "領" */ - 0x0, 0x3, 0x50, 0x0, 0x0, 0x0, 0x4, 0x30, - 0x0, 0x8, 0x90, 0x6, 0x66, 0xc7, 0x66, 0x60, - 0x0, 0xd, 0x66, 0x0, 0x0, 0xa0, 0x0, 0x0, - 0x0, 0x49, 0x8, 0x90, 0xa6, 0x86, 0x6c, 0x30, - 0x0, 0xa3, 0x0, 0xd2, 0xd0, 0x0, 0xc, 0x0, - 0x5, 0x40, 0xb1, 0x20, 0xd6, 0x66, 0x6d, 0x0, - 0x15, 0x0, 0x74, 0x0, 0xd0, 0x0, 0xc, 0x0, - 0x1, 0x55, 0x55, 0xa0, 0xd0, 0x0, 0xc, 0x0, - 0x0, 0x31, 0x15, 0xb1, 0xd6, 0x66, 0x6d, 0x0, - 0x0, 0x0, 0xa, 0x0, 0xd0, 0x0, 0xc, 0x10, - 0x0, 0x71, 0x53, 0x0, 0xc6, 0x66, 0x6c, 0x0, - 0x0, 0xb, 0x80, 0x0, 0xa, 0x50, 0x62, 0x0, - 0x0, 0x1, 0xe3, 0x0, 0x79, 0x0, 0xc, 0x40, - 0x0, 0x0, 0x53, 0x6, 0x50, 0x0, 0x3, 0xd0, - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x20, - - /* U+982D "頭" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x5, - 0x76, 0x66, 0xa7, 0x76, 0x7c, 0x66, 0x73, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, 0x96, - 0x66, 0xb2, 0x2a, 0x75, 0x55, 0xe1, 0xd, 0x0, - 0xd, 0x2, 0xb0, 0x0, 0xd, 0x0, 0xd0, 0x0, - 0xd0, 0x2c, 0x66, 0x66, 0xd0, 0xd, 0x0, 0xd, - 0x2, 0xb0, 0x0, 0xd, 0x0, 0xb6, 0x66, 0x80, - 0x2b, 0x0, 0x0, 0xd0, 0x3, 0x0, 0x35, 0x2, - 0xc6, 0x66, 0x6d, 0x0, 0x64, 0x8, 0x60, 0x2b, - 0x0, 0x0, 0xd0, 0x2, 0xb0, 0x90, 0x2, 0xb6, - 0x66, 0x6b, 0x0, 0x4, 0x29, 0x54, 0x1, 0xd2, - 0x53, 0x0, 0x8d, 0xa7, 0x30, 0x0, 0xb5, 0x0, - 0xa6, 0x1, 0x0, 0x0, 0x2, 0x82, 0x0, 0x1, - 0xf0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x3, - 0x0, - - /* U+983C "頼" */ - 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, 0x60, - 0x0, 0x0, 0xc0, 0x0, 0x67, 0x6d, 0x66, 0x72, - 0x4, 0x66, 0xd6, 0x6c, 0x10, 0xa, 0x0, 0x0, - 0x1, 0x10, 0xc0, 0x0, 0xa, 0x77, 0x66, 0xd1, - 0x1, 0x41, 0xc1, 0x15, 0xd, 0x0, 0x0, 0xd0, - 0x1, 0xb4, 0xd4, 0x5c, 0xe, 0x66, 0x66, 0xd0, - 0x1, 0xa0, 0xc0, 0x2b, 0xd, 0x0, 0x0, 0xd0, - 0x1, 0xa1, 0xc1, 0x2b, 0xc, 0x0, 0x0, 0xd0, - 0x2, 0x99, 0xf5, 0x56, 0xd, 0x66, 0x66, 0xd0, - 0x0, 0xb, 0xe7, 0x30, 0xd, 0x0, 0x0, 0xd0, - 0x0, 0x38, 0xc0, 0xc6, 0xd, 0x66, 0x66, 0xb0, - 0x0, 0x90, 0xc0, 0x19, 0x1, 0xd2, 0x53, 0x0, - 0x6, 0x0, 0xc0, 0x0, 0x9, 0x60, 0xa, 0x70, - 0x0, 0x0, 0xc0, 0x0, 0x64, 0x0, 0x1, 0xe0, - 0x0, 0x0, 0x30, 0x1, 0x10, 0x0, 0x0, 0x20, - - /* U+984C "題" */ - 0x0, 0x30, 0x0, 0x60, 0x0, 0x0, 0x1, 0x40, - 0x0, 0xc6, 0x66, 0xd2, 0x76, 0x79, 0x66, 0x70, - 0x0, 0xb0, 0x0, 0xc0, 0x0, 0x54, 0x1, 0x0, - 0x0, 0xc6, 0x66, 0xc0, 0x2b, 0x76, 0x6e, 0x10, - 0x0, 0xc1, 0x11, 0xc0, 0x1a, 0x0, 0xc, 0x0, - 0x0, 0xb5, 0x55, 0x90, 0x1c, 0x66, 0x6c, 0x0, - 0x0, 0x0, 0x0, 0x16, 0x1b, 0x22, 0x2c, 0x0, - 0x5, 0x76, 0xd6, 0x66, 0x3b, 0x44, 0x4c, 0x0, - 0x0, 0xa0, 0xc0, 0x0, 0x1c, 0x55, 0x5c, 0x0, - 0x0, 0xb0, 0xc6, 0x88, 0x14, 0x40, 0x12, 0x0, - 0x2, 0xc0, 0xc0, 0x0, 0x8, 0x80, 0x85, 0x0, - 0x5, 0x57, 0xc0, 0x0, 0x56, 0x0, 0xd, 0x10, - 0x8, 0x1, 0xd6, 0x11, 0x20, 0x0, 0x2, 0x21, - 0x5, 0x0, 0x6, 0xcd, 0xdd, 0xde, 0xef, 0x90, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9854 "顔" */ - 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x60, - 0x0, 0x0, 0x76, 0x6, 0x76, 0x6c, 0x66, 0x72, - 0x2, 0x96, 0x66, 0xd6, 0x10, 0x28, 0x0, 0x0, - 0x0, 0xa, 0x2, 0xb0, 0x39, 0x86, 0x66, 0xd0, - 0x0, 0x8, 0x36, 0x12, 0x2a, 0x0, 0x1, 0xb0, - 0x3, 0xb6, 0x67, 0x69, 0x5c, 0x66, 0x66, 0xb0, - 0x2, 0x90, 0x0, 0xa2, 0x2a, 0x0, 0x1, 0xb0, - 0x2, 0x90, 0x2a, 0x50, 0x2c, 0x66, 0x66, 0xb0, - 0x3, 0x83, 0x40, 0x49, 0x2a, 0x0, 0x1, 0xc0, - 0x3, 0x80, 0x5, 0xc3, 0x2a, 0x0, 0x1, 0xc0, - 0x4, 0x62, 0x65, 0x2, 0x3b, 0x66, 0x66, 0x90, - 0x7, 0x21, 0x0, 0x6e, 0x32, 0xe1, 0x63, 0x0, - 0x7, 0x0, 0x2a, 0x80, 0xb, 0x30, 0xb, 0x60, - 0x13, 0x25, 0x61, 0x0, 0x82, 0x0, 0x2, 0xd0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, - - /* U+9858 "願" */ - 0x1, 0x0, 0x0, 0x20, 0x0, 0x0, 0x6, 0x20, - 0x8, 0x76, 0x86, 0x96, 0x76, 0xc8, 0x66, 0x40, - 0x8, 0x30, 0xa1, 0x0, 0x0, 0xa0, 0x0, 0x0, - 0x8, 0x57, 0x96, 0xa1, 0xb6, 0x86, 0x6d, 0x40, - 0x8, 0x58, 0x0, 0xb0, 0xd0, 0x0, 0xb, 0x10, - 0x8, 0x4b, 0x66, 0xc0, 0xd6, 0x66, 0x6d, 0x10, - 0x8, 0x48, 0x0, 0xb0, 0xc0, 0x0, 0xb, 0x10, - 0x9, 0x3b, 0x76, 0xc0, 0xc6, 0x66, 0x6d, 0x10, - 0xa, 0x11, 0x92, 0x10, 0xc0, 0x0, 0xb, 0x10, - 0x9, 0x18, 0x93, 0x10, 0xd0, 0x0, 0xb, 0x10, - 0x7, 0x75, 0x92, 0xa0, 0xc6, 0x66, 0x6b, 0x10, - 0x42, 0x70, 0x92, 0x86, 0xb, 0x60, 0x64, 0x0, - 0x23, 0x13, 0xb2, 0x22, 0x69, 0x0, 0xa, 0x70, - 0x0, 0x7, 0xd0, 0x4, 0x60, 0x0, 0x1, 0xe0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, - - /* U+985E "類" */ - 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x70, - 0x3, 0x70, 0xd0, 0xb5, 0x67, 0x6d, 0x76, 0x62, - 0x0, 0xb3, 0xd2, 0x90, 0x0, 0xa, 0x0, 0x10, - 0x5, 0x76, 0xea, 0x6d, 0x2c, 0x67, 0x56, 0xe1, - 0x2, 0x1d, 0xe7, 0x30, 0xd, 0x0, 0x0, 0xc0, - 0x0, 0xa3, 0xd0, 0xb6, 0xe, 0x66, 0x66, 0xc0, - 0x7, 0x10, 0xd0, 0x14, 0xd, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x73, 0xa0, 0xd, 0x66, 0x66, 0xc0, - 0x0, 0x0, 0xd2, 0x53, 0xd, 0x0, 0x0, 0xc0, - 0x8, 0x76, 0xe6, 0x6c, 0x4d, 0x0, 0x0, 0xd0, - 0x0, 0x3, 0xc3, 0x0, 0xc, 0x66, 0x66, 0xa0, - 0x0, 0xa, 0x46, 0xb2, 0x0, 0xd4, 0x64, 0x0, - 0x0, 0x48, 0x0, 0x58, 0x9, 0x60, 0xa, 0x70, - 0x4, 0x60, 0x0, 0x0, 0x73, 0x0, 0x1, 0xe0, - 0x2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, - - /* U+986F "顯" */ - 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x71, - 0x0, 0xd6, 0x66, 0x6e, 0x67, 0x6d, 0x76, 0x63, - 0x0, 0xd6, 0x66, 0x6c, 0x0, 0xb, 0x0, 0x10, - 0x0, 0xc0, 0x0, 0xc, 0xc, 0x78, 0x67, 0xe1, - 0x0, 0xd6, 0x66, 0x6a, 0xc, 0x0, 0x0, 0xc0, - 0x0, 0x47, 0x0, 0x53, 0xd, 0x66, 0x66, 0xc0, - 0x0, 0x82, 0x21, 0x84, 0x1c, 0x0, 0x0, 0xc0, - 0x7, 0x5b, 0x49, 0x6b, 0x2d, 0x66, 0x66, 0xc0, - 0x0, 0x84, 0x2, 0x74, 0xc, 0x0, 0x0, 0xc0, - 0xc, 0x87, 0xad, 0x78, 0x6c, 0x0, 0x0, 0xc0, - 0x2, 0x0, 0x41, 0x1, 0x3c, 0x66, 0x66, 0xa0, - 0x0, 0x56, 0x17, 0x18, 0x10, 0xd3, 0x72, 0x0, - 0x7, 0x64, 0x85, 0x85, 0x86, 0x70, 0xc, 0x40, - 0x8, 0x11, 0x20, 0x10, 0x46, 0x0, 0x3, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x10, - - /* U+98A8 "風" */ - 0x0, 0x9, 0x66, 0x66, 0x66, 0x67, 0x90, 0x0, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x14, 0x80, 0x0, - 0x0, 0xd, 0x0, 0x35, 0x9c, 0xc5, 0x80, 0x0, - 0x0, 0xd, 0x36, 0x5d, 0x0, 0x4, 0x80, 0x0, - 0x0, 0xd, 0x0, 0xd, 0x0, 0x4, 0x80, 0x0, - 0x0, 0xd, 0xb, 0x6e, 0x66, 0xc4, 0x80, 0x0, - 0x0, 0xd, 0xd, 0xd, 0x2, 0xa4, 0x80, 0x0, - 0x0, 0xd, 0xd, 0xd, 0x2, 0xa3, 0x80, 0x0, - 0x0, 0xc, 0xe, 0x6e, 0x67, 0xa3, 0x80, 0x0, - 0x0, 0x1b, 0x3, 0xd, 0x1, 0x21, 0xa0, 0x0, - 0x0, 0x48, 0x0, 0xd, 0x0, 0x92, 0xc0, 0x20, - 0x0, 0x93, 0x23, 0x5e, 0x98, 0x8c, 0xa3, 0x70, - 0x1, 0x90, 0xda, 0x62, 0x0, 0xb, 0x3c, 0xa0, - 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd0, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - - /* U+98DB "飛" */ - 0x0, 0x56, 0x66, 0x66, 0x69, 0x50, 0x0, 0x0, - 0x0, 0x11, 0x0, 0x10, 0x7, 0x20, 0xa2, 0x0, - 0x0, 0x0, 0x37, 0xa5, 0x7, 0x1a, 0x82, 0x0, - 0x0, 0x3, 0xe6, 0xa1, 0x7, 0x82, 0x0, 0x0, - 0x0, 0x7b, 0x90, 0xa1, 0x5, 0x66, 0xa1, 0x0, - 0x2, 0x12, 0x90, 0xa1, 0x1, 0xd1, 0x43, 0x60, - 0x0, 0x2, 0x90, 0xa1, 0x3, 0x7e, 0x74, 0x80, - 0x8, 0x67, 0xb6, 0xc7, 0x6d, 0x25, 0xdf, 0xc0, - 0x0, 0x3, 0x80, 0xa1, 0xc, 0x2, 0x82, 0x40, - 0x0, 0x5, 0x70, 0xa1, 0xc, 0x57, 0x30, 0x0, - 0x0, 0x7, 0x40, 0xa1, 0xa, 0x4a, 0x50, 0x0, - 0x0, 0xb, 0x0, 0xa1, 0x7, 0x51, 0xc0, 0x20, - 0x0, 0x37, 0x0, 0xa2, 0x1, 0xc0, 0x0, 0x70, - 0x1, 0x80, 0x0, 0xa2, 0x0, 0x4b, 0x40, 0xa0, - 0x6, 0x0, 0x0, 0x60, 0x0, 0x2, 0x8c, 0xc0, - - /* U+98DF "食" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1e, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb9, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xb0, 0x19, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x7a, 0xa, 0x21, 0xb7, 0x0, 0x0, - 0x0, 0x8, 0x70, 0x5, 0x90, 0xa, 0xfa, 0x72, - 0x3, 0x72, 0xd6, 0x66, 0x76, 0x8c, 0x29, 0x80, - 0x1, 0x0, 0xe0, 0x0, 0x0, 0x3a, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x8a, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x0, 0x0, 0x3a, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x89, 0x30, 0x0, - 0x0, 0x0, 0xe0, 0x25, 0x10, 0xa, 0x90, 0x0, - 0x0, 0x0, 0xe0, 0x1, 0x89, 0x91, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x47, 0x31, 0xad, 0x50, 0x0, - 0x0, 0x0, 0xfc, 0x40, 0x0, 0x5, 0xf2, 0x0, - 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x31, 0x0, - - /* U+98EF "飯" */ - 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x5, 0x0, - 0x0, 0x4, 0xd1, 0x0, 0x54, 0x68, 0xaa, 0x40, - 0x0, 0xb, 0x27, 0x91, 0x94, 0x0, 0x0, 0x0, - 0x0, 0x74, 0x60, 0x69, 0x93, 0x0, 0x0, 0x0, - 0x3, 0x60, 0x76, 0x1, 0x93, 0x0, 0x1, 0x0, - 0x14, 0x96, 0x67, 0xb1, 0x98, 0x66, 0x6b, 0x80, - 0x0, 0xc0, 0x0, 0xc0, 0x93, 0x40, 0xb, 0x10, - 0x0, 0xc6, 0x66, 0xd0, 0x93, 0x50, 0xb, 0x0, - 0x0, 0xc0, 0x0, 0xc0, 0xa2, 0x60, 0x56, 0x0, - 0x0, 0xc6, 0x66, 0xb0, 0xb0, 0x35, 0xb0, 0x0, - 0x0, 0xc0, 0x8, 0x0, 0xb0, 0xb, 0x60, 0x0, - 0x0, 0xc0, 0x19, 0xa1, 0x90, 0x3c, 0x90, 0x0, - 0x0, 0xda, 0x80, 0xa6, 0x21, 0x90, 0x97, 0x0, - 0x0, 0x93, 0x0, 0x5, 0x17, 0x0, 0xc, 0xa1, - 0x0, 0x0, 0x0, 0x20, 0x40, 0x0, 0x0, 0x30, - - /* U+98F2 "飲" */ - 0x0, 0x0, 0xa2, 0x0, 0x6, 0x60, 0x0, 0x0, - 0x0, 0x4, 0xe1, 0x0, 0xa, 0x50, 0x0, 0x0, - 0x0, 0xb, 0x28, 0x90, 0xc, 0x0, 0x0, 0x0, - 0x0, 0x65, 0x50, 0x79, 0x3c, 0x66, 0x6c, 0x60, - 0x2, 0x70, 0x75, 0x1, 0x81, 0x10, 0xc, 0x10, - 0x14, 0x86, 0x77, 0xa3, 0x70, 0xf2, 0x35, 0x0, - 0x0, 0xc0, 0x0, 0xc5, 0x0, 0xf1, 0x40, 0x0, - 0x0, 0xc6, 0x66, 0xd0, 0x1, 0xe3, 0x0, 0x0, - 0x0, 0xc0, 0x0, 0xc0, 0x3, 0xa5, 0x0, 0x0, - 0x0, 0xc6, 0x66, 0xb0, 0x6, 0x77, 0x0, 0x0, - 0x0, 0xc0, 0x8, 0x0, 0xa, 0x28, 0x20, 0x0, - 0x0, 0xc0, 0x28, 0xa0, 0x1b, 0x2, 0xb0, 0x0, - 0x0, 0xdb, 0x70, 0x90, 0x81, 0x0, 0x89, 0x0, - 0x0, 0x72, 0x0, 0x6, 0x20, 0x0, 0xb, 0xc2, - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x10, - - /* U+9928 "館" */ - 0x0, 0x0, 0xa1, 0x0, 0x0, 0x74, 0x0, 0x0, - 0x0, 0x5, 0xd0, 0x0, 0x20, 0xe, 0x20, 0x20, - 0x0, 0xc, 0x3a, 0x62, 0x96, 0x68, 0x66, 0xe3, - 0x0, 0x86, 0x30, 0xce, 0x30, 0x0, 0x4, 0x50, - 0x4, 0x60, 0xb1, 0x0, 0x41, 0x11, 0x28, 0x0, - 0x14, 0x96, 0x96, 0xa0, 0xb5, 0x44, 0x5c, 0x0, - 0x0, 0xc0, 0x0, 0xc0, 0xa2, 0x0, 0x1b, 0x0, - 0x0, 0xd6, 0x66, 0xc0, 0xa7, 0x66, 0x6b, 0x0, - 0x0, 0xc0, 0x0, 0xc0, 0xa2, 0x0, 0x1, 0x0, - 0x0, 0xd6, 0x66, 0xa0, 0xa7, 0x66, 0x6c, 0x60, - 0x0, 0xc0, 0x7, 0x0, 0xa2, 0x0, 0xa, 0x20, - 0x0, 0xc0, 0x19, 0x90, 0xa2, 0x0, 0xa, 0x20, - 0x1, 0xeb, 0x70, 0xa0, 0xa7, 0x66, 0x6c, 0x20, - 0x0, 0xa2, 0x0, 0x0, 0xb2, 0x0, 0x8, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - - /* U+9996 "首" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x16, 0x0, 0x0, 0xc2, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xa0, 0x4, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xd0, 0x8, 0x0, 0x8, 0x30, - 0x6, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x67, 0x50, - 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb6, 0x86, 0x66, 0x6d, 0x30, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, - 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, - - /* U+9999 "香" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x49, 0xe5, 0x0, 0x0, - 0x14, 0x56, 0x7d, 0x75, 0x31, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc1, 0x0, 0x0, 0x10, 0x5, 0x66, - 0x66, 0x6d, 0x66, 0x66, 0x6e, 0x30, 0x10, 0x0, - 0x3c, 0xd4, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2c, - 0x1c, 0x16, 0x70, 0x0, 0x0, 0x0, 0x3a, 0x10, - 0xc1, 0x6, 0xc5, 0x0, 0x0, 0x57, 0x20, 0x7, - 0x0, 0x8, 0xcf, 0x71, 0x52, 0xd, 0x66, 0x66, - 0x66, 0xe1, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, - 0xc, 0x0, 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, - 0xc0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xc0, - 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, - 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x20, 0x0, - - /* U+99C4 "駄" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, 0x96, 0x66, 0x6b, 0x0, 0x97, 0x0, 0x0, - 0x0, 0xd0, 0xa1, 0x0, 0x0, 0x93, 0x0, 0x0, - 0x0, 0xd0, 0xa1, 0x23, 0x0, 0x93, 0x0, 0x0, - 0x0, 0xe6, 0xc6, 0x64, 0x0, 0x92, 0x0, 0x30, - 0x0, 0xd0, 0xa1, 0x12, 0x76, 0xc9, 0x67, 0x80, - 0x0, 0xd6, 0xc6, 0x75, 0x0, 0xb6, 0x0, 0x0, - 0x0, 0xd0, 0xa1, 0x0, 0x0, 0xc7, 0x0, 0x0, - 0x0, 0xe5, 0x95, 0x5e, 0x10, 0xb6, 0x10, 0x0, - 0x0, 0x90, 0x0, 0xd, 0x3, 0x84, 0x50, 0x0, - 0x0, 0x24, 0x29, 0xc, 0x8, 0x30, 0xa0, 0x0, - 0x5, 0x54, 0xc7, 0x3a, 0xb, 0x0, 0xb1, 0x0, - 0xb, 0x46, 0x30, 0x58, 0x57, 0x60, 0x5a, 0x0, - 0x4, 0x1, 0x21, 0xb4, 0x90, 0x77, 0xe, 0x50, - 0x0, 0x0, 0x5f, 0x97, 0x10, 0x16, 0x4, 0xd2, - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - - /* U+99C5 "駅" */ - 0x0, 0x53, 0x33, 0x38, 0x13, 0x0, 0x0, 0x50, - 0x0, 0xd3, 0xb5, 0x33, 0x2d, 0x66, 0x67, 0xc0, - 0x0, 0xc0, 0xa2, 0x31, 0x1c, 0x0, 0x2, 0xa0, - 0x0, 0xd6, 0xc7, 0x63, 0x1c, 0x0, 0x2, 0xa0, - 0x0, 0xc0, 0xa2, 0x20, 0x1c, 0x0, 0x2, 0xa0, - 0x0, 0xd6, 0xc7, 0x74, 0xd, 0x68, 0x67, 0xa0, - 0x0, 0xc0, 0xa2, 0x0, 0xc, 0x6, 0x0, 0x0, - 0x0, 0xd5, 0x95, 0x6d, 0x2b, 0x7, 0x0, 0x0, - 0x0, 0x80, 0x0, 0x2a, 0x39, 0x8, 0x0, 0x0, - 0x1, 0x23, 0x39, 0x49, 0x56, 0x6, 0x50, 0x0, - 0x7, 0x45, 0xc4, 0x87, 0x82, 0x1, 0xc0, 0x0, - 0xd, 0x37, 0x30, 0x84, 0xa0, 0x0, 0x98, 0x0, - 0x4, 0x0, 0x10, 0xd4, 0x50, 0x0, 0xd, 0x80, - 0x0, 0x0, 0x5f, 0x77, 0x0, 0x0, 0x2, 0xa3, - 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, - - /* U+9A12 "騒" */ - 0x0, 0x30, 0x0, 0x32, 0x12, 0x22, 0x27, 0x0, - 0x0, 0xe6, 0xd6, 0x63, 0x48, 0x44, 0x6e, 0x20, - 0x0, 0xd0, 0xc0, 0x20, 0x4, 0x40, 0x96, 0x0, - 0x0, 0xe6, 0xd6, 0x83, 0x0, 0xa5, 0xc0, 0x0, - 0x0, 0xd0, 0xc0, 0x0, 0x0, 0x3f, 0x40, 0x0, - 0x0, 0xd6, 0xd6, 0xa2, 0x4, 0x94, 0xca, 0x50, - 0x0, 0xd0, 0xc0, 0x1, 0x54, 0xd, 0x6, 0x71, - 0x0, 0xe5, 0xc5, 0x6b, 0x56, 0x6e, 0x69, 0x30, - 0x0, 0x40, 0x0, 0x39, 0x66, 0xd, 0xc, 0x10, - 0x0, 0x23, 0x38, 0x48, 0x66, 0xd, 0xc, 0x0, - 0x6, 0x36, 0xa8, 0x76, 0x79, 0x6e, 0x6d, 0x0, - 0xc, 0x29, 0x30, 0x84, 0x10, 0xd, 0x23, 0x0, - 0x14, 0x0, 0x0, 0xc1, 0x0, 0xd, 0x3c, 0x60, - 0x0, 0x2, 0x7e, 0x81, 0xdc, 0xa7, 0x41, 0xc0, - 0x0, 0x0, 0x2, 0x0, 0x20, 0x0, 0x0, 0x0, - - /* U+9A13 "験" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x50, 0x0, 0x5a, 0x0, 0x0, - 0x0, 0xd6, 0xd6, 0x62, 0x0, 0xc8, 0x0, 0x0, - 0x0, 0xc0, 0xc0, 0x20, 0x7, 0x80, 0x80, 0x0, - 0x0, 0xd6, 0xd6, 0x71, 0x59, 0x0, 0x4d, 0x61, - 0x0, 0xc0, 0xc0, 0x5, 0x88, 0x6a, 0x78, 0x60, - 0x0, 0xd6, 0xd6, 0x91, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xc0, 0xc0, 0x0, 0xb6, 0x6e, 0x6d, 0x20, - 0x0, 0xd5, 0xc5, 0x96, 0xc0, 0xd, 0xc, 0x0, - 0x0, 0x60, 0x0, 0x84, 0xc0, 0xd, 0xc, 0x0, - 0x1, 0x24, 0x29, 0x93, 0xc6, 0x6d, 0x6d, 0x0, - 0xa, 0x55, 0xa8, 0xb2, 0x30, 0x4b, 0x2, 0x0, - 0x2d, 0x36, 0x20, 0xb1, 0x0, 0xb3, 0x60, 0x0, - 0x12, 0x0, 0x1, 0xc0, 0x8, 0x50, 0x85, 0x0, - 0x0, 0x2, 0x7e, 0x62, 0x83, 0x0, 0xb, 0xb1, - 0x0, 0x0, 0x1, 0x13, 0x0, 0x0, 0x0, 0x10, - - /* U+9A57 "驗" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x50, 0x0, 0x77, 0x0, 0x0, - 0x0, 0xd6, 0xc6, 0x71, 0x0, 0xc6, 0x0, 0x0, - 0x0, 0xc0, 0xc0, 0x10, 0x8, 0x44, 0x70, 0x0, - 0x0, 0xd6, 0xd6, 0x80, 0x38, 0x0, 0x99, 0x0, - 0x0, 0xc0, 0xc0, 0x3, 0x86, 0x66, 0xaa, 0xc2, - 0x0, 0xd6, 0xd6, 0x83, 0x0, 0x0, 0x1, 0x0, - 0x0, 0xc0, 0xc0, 0x1, 0xc6, 0xc6, 0x8c, 0x40, - 0x0, 0xd5, 0xc4, 0xa5, 0xb0, 0xb5, 0x49, 0x10, - 0x0, 0xa0, 0x0, 0xb2, 0xb0, 0xb5, 0x49, 0x10, - 0x1, 0x23, 0x26, 0xb1, 0xd6, 0xa6, 0x8b, 0x10, - 0x7, 0x63, 0xa8, 0xc0, 0x2c, 0x10, 0x65, 0x0, - 0xc, 0x54, 0x40, 0xc0, 0x5a, 0x0, 0xa2, 0x0, - 0x13, 0x0, 0x2, 0xb0, 0xb5, 0x70, 0xa9, 0x10, - 0x0, 0x1, 0x7f, 0x48, 0x30, 0xa7, 0x13, 0x90, - 0x0, 0x0, 0x1, 0x21, 0x0, 0x12, 0x0, 0x10, - - /* U+9AD4 "體" */ - 0x0, 0x10, 0x3, 0x0, 0x1, 0xb0, 0xb0, 0x0, - 0x0, 0xc6, 0x6d, 0x30, 0x1, 0xc0, 0xc0, 0x30, - 0x0, 0xc6, 0x7b, 0x0, 0xd6, 0xd5, 0xd7, 0xc0, - 0x0, 0xc3, 0x7b, 0x0, 0xd4, 0xd3, 0xc6, 0x90, - 0x3, 0xc3, 0x7b, 0x20, 0xd3, 0xc2, 0xc5, 0x90, - 0xb, 0x76, 0x67, 0xc5, 0xd4, 0xd3, 0xc6, 0xa0, - 0x47, 0x86, 0x69, 0x60, 0x71, 0x11, 0x12, 0x60, - 0x0, 0xd0, 0xa, 0x25, 0x76, 0x66, 0x66, 0x72, - 0x0, 0xd6, 0x6c, 0x10, 0x67, 0x66, 0x6a, 0x50, - 0x0, 0xd0, 0xa, 0x10, 0x84, 0x0, 0x9, 0x30, - 0x0, 0xd6, 0x6c, 0x10, 0x88, 0x66, 0x6b, 0x30, - 0x0, 0xd0, 0xa, 0x10, 0x46, 0x0, 0x77, 0x0, - 0x0, 0xd0, 0xa, 0x10, 0x4, 0x80, 0xa1, 0x0, - 0x0, 0xd1, 0x8e, 0x16, 0x66, 0x86, 0xa6, 0xc3, - 0x0, 0x30, 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, - - /* U+9AD8 "高" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2b, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x63, 0x0, 0x0, 0x15, 0x6, 0x76, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x60, 0x0, 0x8, - 0x66, 0x66, 0x66, 0x80, 0x0, 0x0, 0x0, 0xd1, - 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0xd, 0x66, - 0x66, 0x68, 0x80, 0x0, 0x0, 0x0, 0x90, 0x0, - 0x0, 0x24, 0x0, 0x0, 0xa, 0x66, 0x66, 0x66, - 0x66, 0x66, 0xd2, 0x0, 0xd0, 0x2, 0x0, 0x0, - 0x30, 0xe, 0x0, 0xd, 0x0, 0xe6, 0x66, 0x7d, - 0x0, 0xe0, 0x0, 0xd0, 0xd, 0x0, 0x1, 0xb0, - 0xe, 0x0, 0xd, 0x0, 0xe6, 0x66, 0x6b, 0x0, - 0xe0, 0x0, 0xd0, 0x9, 0x0, 0x1, 0x60, 0xe, - 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xd0, - 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, - - /* U+9AEA "髪" */ - 0x0, 0x2, 0x0, 0x4, 0x0, 0x0, 0x30, 0x0, - 0x0, 0xe, 0x66, 0x66, 0x10, 0x6, 0xc3, 0x0, - 0x0, 0xe, 0x66, 0x6a, 0x3, 0xa6, 0x0, 0x0, - 0x0, 0xd, 0x0, 0x14, 0x24, 0x0, 0x5b, 0x0, - 0x0, 0xe, 0x55, 0x55, 0x10, 0x29, 0x71, 0x0, - 0x5, 0x7a, 0x96, 0x67, 0x95, 0x50, 0x4, 0x60, - 0x0, 0x8, 0x80, 0x73, 0x0, 0x3, 0xa9, 0x40, - 0x0, 0xcb, 0x76, 0x5c, 0x16, 0x75, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x77, 0x10, 0x0, 0x3, 0x0, - 0x6, 0x65, 0x56, 0xd7, 0x55, 0x55, 0x6a, 0x70, - 0x0, 0x0, 0x9, 0xa6, 0x66, 0x68, 0x10, 0x0, - 0x0, 0x0, 0x78, 0x60, 0x0, 0xa9, 0x10, 0x0, - 0x0, 0x7, 0x60, 0x8, 0x5c, 0x50, 0x0, 0x0, - 0x1, 0x73, 0x0, 0x29, 0xab, 0x40, 0x0, 0x0, - 0x3, 0x2, 0x67, 0x61, 0x1, 0x7c, 0xca, 0x70, - 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x14, 0x10, - - /* U+9B5A "魚" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xc1, 0x0, 0x60, 0x0, 0x0, 0x0, - 0x3, 0xc6, 0x66, 0xbc, 0x20, 0x0, 0x0, 0x3, - 0xa0, 0x0, 0x9, 0x0, 0x10, 0x0, 0x3, 0x9b, - 0x66, 0x6b, 0x66, 0x6e, 0x50, 0x4, 0x41, 0xb0, - 0x0, 0xe0, 0x0, 0xd1, 0x0, 0x0, 0x1b, 0x0, - 0xe, 0x0, 0xd, 0x10, 0x0, 0x1, 0xd6, 0x66, - 0xe6, 0x66, 0xe1, 0x0, 0x0, 0x1b, 0x0, 0xe, - 0x0, 0xd, 0x10, 0x0, 0x1, 0xd6, 0x66, 0xd6, - 0x66, 0xe1, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, - 0x5, 0x0, 0x0, 0x6, 0x4, 0x30, 0x56, 0x1, - 0x92, 0x0, 0x5, 0xa0, 0xe, 0x0, 0xc5, 0x2, - 0xf4, 0x3, 0xe2, 0x0, 0xd2, 0x6, 0x70, 0x8, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9CE5 "鳥" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x3, 0x50, 0x0, 0x30, 0x0, 0x0, 0x0, - 0xd6, 0x66, 0x66, 0x6c, 0x50, 0x0, 0x0, 0xd, - 0x66, 0x66, 0x66, 0xc2, 0x0, 0x0, 0x0, 0xd0, - 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0xd, 0x66, - 0x66, 0x66, 0xc3, 0x0, 0x0, 0x0, 0xd0, 0x0, - 0x0, 0x2, 0x0, 0x62, 0x0, 0xd, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x40, 0x0, 0xd6, 0x66, 0x66, - 0x66, 0x67, 0xc0, 0x0, 0x6, 0x0, 0x0, 0x3, - 0x0, 0x4a, 0x0, 0x3, 0x4, 0x4, 0x70, 0x3b, - 0x6, 0x80, 0x0, 0x80, 0xa4, 0xa, 0x60, 0x96, - 0x85, 0x0, 0x78, 0x5, 0x80, 0x24, 0x11, 0x1c, - 0x30, 0x9, 0x10, 0x1, 0x0, 0x3, 0x9d, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, - - /* U+9E97 "麗" */ - 0x2, 0x33, 0x33, 0x54, 0x23, 0x33, 0x38, 0x10, - 0x2, 0x73, 0x33, 0x62, 0x27, 0x33, 0x63, 0x10, - 0x0, 0xc6, 0x86, 0xd0, 0xe, 0x86, 0xd2, 0x0, - 0x0, 0xc0, 0x81, 0xc0, 0xd, 0x29, 0xc0, 0x0, - 0x0, 0xa0, 0x10, 0x96, 0x6a, 0x2, 0x94, 0x0, - 0x0, 0x79, 0x66, 0xa6, 0x79, 0x66, 0x79, 0x20, - 0x0, 0x76, 0x0, 0xc0, 0x9, 0x20, 0x23, 0x0, - 0x0, 0x7a, 0x66, 0xd6, 0x6b, 0x76, 0x9a, 0x0, - 0x0, 0x7a, 0x66, 0xc6, 0x6b, 0x76, 0x97, 0x0, - 0x0, 0x85, 0xb, 0x0, 0x8, 0x40, 0x21, 0x0, - 0x0, 0xa3, 0xd, 0x68, 0x89, 0x25, 0xc8, 0x0, - 0x0, 0xc0, 0xc, 0x0, 0x9, 0x73, 0x0, 0x50, - 0x2, 0x70, 0xc, 0x47, 0x48, 0x20, 0x0, 0xb0, - 0x7, 0x0, 0x1d, 0x60, 0x5, 0xdc, 0xcd, 0xc0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9EBC "麼" */ - 0x0, 0x0, 0x0, 0x5, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x50, 0x0, 0x0, 0xb2, 0x0, 0x8, 0x40, - 0x0, 0xd6, 0x66, 0x96, 0x66, 0x68, 0x66, 0x50, - 0x0, 0xc0, 0x0, 0xd1, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0xc3, 0x77, 0xd7, 0x57, 0x8d, 0x68, 0x40, - 0x0, 0xc0, 0xa, 0xd7, 0x10, 0xba, 0x70, 0x0, - 0x0, 0xc0, 0x65, 0xc3, 0x77, 0x6a, 0x4a, 0x20, - 0x0, 0xc5, 0x30, 0xc0, 0x33, 0x29, 0x5, 0x70, - 0x0, 0xb0, 0x0, 0x27, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0xb0, 0x4, 0x73, 0x0, 0x5e, 0x20, 0x0, - 0x1, 0x90, 0x9d, 0x97, 0x6b, 0x81, 0x0, 0x0, - 0x4, 0x50, 0x0, 0x6, 0x71, 0x2, 0x60, 0x0, - 0x8, 0x0, 0x37, 0x73, 0x34, 0x55, 0xb6, 0x0, - 0x6, 0x0, 0x9d, 0xa7, 0x53, 0x10, 0x2b, 0x0, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+9EC4 "黄" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc2, 0x0, 0xb3, 0x0, 0x0, 0x0, - 0x0, 0xd, 0x0, 0xc, 0x10, 0x72, 0x0, 0x7, - 0x66, 0xe6, 0x66, 0xd6, 0x66, 0x40, 0x0, 0x0, - 0xd, 0x0, 0xc, 0x10, 0x4, 0x3, 0x76, 0x66, - 0xa6, 0xa6, 0x96, 0x66, 0xa6, 0x0, 0x1, 0x0, - 0xd, 0x0, 0x2, 0x0, 0x0, 0x0, 0xc6, 0x66, - 0xe6, 0x66, 0xc5, 0x0, 0x0, 0xc, 0x10, 0xd, - 0x0, 0xb, 0x20, 0x0, 0x0, 0xc6, 0x66, 0xe6, - 0x66, 0xc2, 0x0, 0x0, 0xc, 0x10, 0xd, 0x0, - 0xb, 0x20, 0x0, 0x0, 0xc6, 0x66, 0xd6, 0x66, - 0xc2, 0x0, 0x0, 0x6, 0x2c, 0x30, 0x4, 0x44, - 0x0, 0x0, 0x0, 0x3d, 0x70, 0x0, 0x3, 0xb9, - 0x10, 0x0, 0x89, 0x10, 0x0, 0x0, 0x0, 0x9d, - 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, - - /* U+9ED2 "黒" */ - 0x0, 0x30, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, - 0xe6, 0x66, 0x7b, 0x66, 0x6e, 0x40, 0x0, 0xd0, - 0x0, 0x2a, 0x0, 0xd, 0x0, 0x0, 0xd6, 0x66, - 0x7c, 0x66, 0x6e, 0x0, 0x0, 0xd0, 0x0, 0x2a, - 0x0, 0xd, 0x0, 0x0, 0xe6, 0x66, 0x7c, 0x66, - 0x6e, 0x0, 0x0, 0x60, 0x0, 0x2a, 0x0, 0x3, - 0x0, 0x4, 0x66, 0x66, 0x7c, 0x66, 0x6d, 0x70, - 0x1, 0x10, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0x0, 0x1, 0xd3, 0x57, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x64, 0x0, 0x60, 0x35, - 0x0, 0x90, 0x8, 0x20, 0x3, 0x90, 0xd, 0x0, - 0x87, 0x4, 0xd0, 0xd, 0x50, 0xa, 0x10, 0x36, - 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+9EDE "點" */ - 0x3, 0x0, 0x0, 0x30, 0x0, 0xa3, 0x0, 0x0, - 0x9, 0x66, 0xc6, 0xd2, 0x0, 0xd0, 0x0, 0x0, - 0x9, 0x42, 0xb8, 0xc0, 0x0, 0xd0, 0x0, 0x0, - 0x9, 0x2a, 0xc4, 0xc0, 0x0, 0xd5, 0x56, 0xa0, - 0x9, 0x67, 0xd6, 0xd0, 0x0, 0xd0, 0x0, 0x0, - 0x6, 0x1, 0xb0, 0x50, 0x0, 0xd0, 0x0, 0x0, - 0x0, 0x11, 0xb1, 0x70, 0x0, 0xd0, 0x0, 0x0, - 0x4, 0x65, 0xc5, 0x51, 0x96, 0xe6, 0x6b, 0x10, - 0x0, 0x1, 0xb0, 0x41, 0xc0, 0x0, 0xd, 0x0, - 0x4, 0x69, 0xa5, 0x10, 0xc0, 0x0, 0xd, 0x0, - 0xb, 0x50, 0x0, 0x40, 0xc0, 0x0, 0xd, 0x0, - 0x2, 0x6, 0x9, 0x38, 0xc0, 0x0, 0xd, 0x0, - 0x9, 0x9, 0x2a, 0x8, 0xd6, 0x66, 0x6d, 0x0, - 0x2a, 0x2, 0x0, 0x0, 0xc0, 0x0, 0xd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, - - /* U+9EE8 "黨" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x50, 0xb, 0x30, 0x18, 0x0, 0x0, - 0x0, 0x0, 0x88, 0xb, 0x0, 0x96, 0x0, 0x0, - 0x0, 0x95, 0x58, 0x5b, 0x57, 0x75, 0x5a, 0x70, - 0x6, 0x70, 0x47, 0x66, 0x66, 0x91, 0x18, 0x10, - 0x8, 0x10, 0x56, 0x0, 0x0, 0xc0, 0x10, 0x0, - 0x0, 0x0, 0x5a, 0x66, 0x66, 0xc0, 0x0, 0x0, - 0x0, 0xa, 0x66, 0x66, 0x66, 0x66, 0xb2, 0x0, - 0x0, 0xd, 0x8, 0x18, 0x30, 0x90, 0xc0, 0x0, - 0x0, 0xd, 0x3, 0x48, 0x35, 0x20, 0xc0, 0x0, - 0x0, 0xd, 0x66, 0x6b, 0x86, 0x66, 0xa0, 0x0, - 0x0, 0x47, 0x55, 0x5b, 0x85, 0x55, 0x97, 0x0, - 0x5, 0x66, 0x66, 0x6b, 0x86, 0x66, 0x6b, 0x80, - 0x1, 0x13, 0x2, 0x30, 0x5, 0x0, 0x13, 0x0, - 0x0, 0x94, 0x0, 0xb0, 0x9, 0x20, 0xb, 0x10, - 0x2, 0x70, 0x0, 0x30, 0x2, 0x0, 0x3, 0x0, - - /* U+9F13 "鼓" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb4, 0x0, 0x0, 0xd, 0x10, 0x0, - 0x0, 0x0, 0xc0, 0x0, 0x20, 0xd, 0x0, 0x0, - 0x7, 0x66, 0xd6, 0x67, 0x60, 0xd, 0x0, 0x20, - 0x0, 0x0, 0xc0, 0x0, 0x57, 0x6e, 0x66, 0xa1, - 0x1, 0x86, 0xb6, 0x6a, 0x30, 0xd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0xd, 0x0, 0x0, - 0x0, 0xd6, 0x66, 0x6e, 0x38, 0x69, 0x6b, 0x90, - 0x0, 0xd1, 0x0, 0x1b, 0x4, 0x10, 0xd, 0x10, - 0x0, 0xd6, 0x66, 0x6c, 0x0, 0x70, 0x59, 0x0, - 0x0, 0x70, 0x0, 0x25, 0x0, 0x81, 0xc1, 0x0, - 0x0, 0x26, 0x1, 0xd0, 0x0, 0x2e, 0x60, 0x0, - 0x0, 0xb, 0x4, 0x20, 0x0, 0x6d, 0x80, 0x0, - 0x0, 0x14, 0x48, 0x76, 0x47, 0x70, 0x9b, 0x10, - 0x1e, 0xc8, 0x41, 0x2, 0x73, 0x0, 0x8, 0xd3, - 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, - - /* U+9F3B "鼻" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0x10, 0x1, 0x0, 0x0, 0x0, - 0xb, 0x67, 0x76, 0x66, 0xe1, 0x0, 0x0, 0x0, - 0xc6, 0x66, 0x66, 0x6c, 0x0, 0x0, 0x0, 0xc, - 0x10, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc6, - 0x66, 0x66, 0x6c, 0x0, 0x0, 0x0, 0xc, 0x66, - 0x66, 0x66, 0xc0, 0x0, 0x0, 0xb, 0x65, 0x55, - 0x85, 0x55, 0xb5, 0x0, 0x0, 0xd6, 0x66, 0x6d, - 0x66, 0x6c, 0x20, 0x0, 0xc, 0x0, 0x0, 0xb0, - 0x0, 0xa2, 0x0, 0x0, 0xd6, 0x66, 0x68, 0x66, - 0x6c, 0x20, 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x67, 0xc1, 0x11, 0x0, 0xa5, 0x0, 0xc, 0x0, - 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0xc0, 0x0, - 0x0, 0x0, 0x3a, 0x20, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x33, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, - - /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, - 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, - 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, - 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, - 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F008 "" */ - 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, - 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, - 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, - 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, - 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, - 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, - 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, - 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, - - /* U+F00B "" */ - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, - 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, - 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, - 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, - 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, - - /* U+F00D "" */ - 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, - 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, - 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, - 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, - 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, - 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, - 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, - 0x4, 0xa1, - - /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, - 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, - 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, - 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, - 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, - 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, - 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, - 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, - 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, - 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, - 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, - 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, - 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, - - /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, - 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, - 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, - 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, - 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, - 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, - 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, - 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, - - /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, - 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, - 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, - 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, - 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, - 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, - 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, - 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, - 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, - 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, - 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, - 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, - 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F01C "" */ - 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, - 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, - 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, - - /* U+F021 "" */ - 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, - 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, - 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, - 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, - 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, - 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, - 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, - 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, - 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, - 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, - 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, - 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, - 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, - 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, - 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, - 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, - 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, - 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, - 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, - 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, - 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, - 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, - 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, - 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, - 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, - - /* U+F03E "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, - 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, - 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, - 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F043 "" */ - 0x0, 0x0, 0x4e, 0x40, 0x0, 0x0, 0x0, 0xb, - 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0x30, 0x0, 0xc, 0xff, 0xff, 0xfc, - 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xf2, 0xbf, 0xff, - 0xff, 0xfe, 0x9f, 0xa1, 0xbf, 0xff, 0xff, 0x92, - 0xff, 0xa2, 0x2f, 0xff, 0xf2, 0x4, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x2, 0x9e, 0xfe, 0x92, 0x0, - - /* U+F048 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, - 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, - 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, - 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, - 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, - 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04B "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, - 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, - 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, - 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, - 0xf7, - - /* U+F04D "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, - - /* U+F051 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, - 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, - 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, - 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, - 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, - 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, - 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, - 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, - 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, - 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, - 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, - 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, - 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, - - /* U+F054 "" */ - 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, - 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, - 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, - 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, - 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, - 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, - 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, - 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, - 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, - 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, - 0x0, 0x0, - - /* U+F068 "" */ - 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xb7, - - /* U+F06E "" */ - 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, - 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, - 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, - 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, - 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, - 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, - 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, - 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, - 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, - 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, - 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, - 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, - 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, - 0xda, 0x50, 0x0, 0x0, - - /* U+F070 "" */ - 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, - 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, - 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, - 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, - 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, - 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, - 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, - 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, - 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, - 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, - 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, - - /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, - 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, - 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, - 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, - 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - - /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, - 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, - 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, - 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, - 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, - 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, - 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, - 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, - 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, - 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, - 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, - 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, - 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F078 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, - 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, - 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, - 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, - 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, - 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, - 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, - 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, - 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, - 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, - 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, - 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F07B "" */ - 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F095 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, - 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, - 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, - 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, - 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, - 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F0C4 "" */ - 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, - 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, - 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, - 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, - 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, - 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, - 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, - 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, - 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, - 0x10, - - /* U+F0C5 "" */ - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, - 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, - 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - - /* U+F0C7 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, - - /* U+F0C9 "" */ - 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x21, - - /* U+F0E0 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, - 0xd2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2d, - 0xff, 0x62, 0xcf, 0xff, 0xff, 0xfc, 0x26, 0xff, - 0xff, 0xfa, 0x18, 0xff, 0xff, 0x81, 0xaf, 0xff, - 0xff, 0xff, 0xe3, 0x4d, 0xd4, 0x3e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x81, 0x18, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F0E7 "" */ - 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, - 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, - 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, - - /* U+F0EA "" */ - 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, - 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, - 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, - 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, - 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, - 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, - - /* U+F11C "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, - 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, - 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, - 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, - 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, - 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, - 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+F15B "" */ - 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, - 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, - 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, - 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, - 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, - 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, - 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, - 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, - 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, - 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, - 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, - 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, - 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, - - /* U+F240 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F241 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, - 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F242 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F243 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F244 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, - - /* U+F287 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, - 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, - 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, - 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, - 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, - 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, - 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, - 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, - 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, - 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, - 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, - 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, - 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, - 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, - 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, - 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, - 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, - 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, - - /* U+F2ED "" */ - 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, - 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, - 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, - 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, - 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, - 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, - 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, - 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - - /* U+F304 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, - 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F55A "" */ - 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, - 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, - 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, - 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, - 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, - 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, - 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, - 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, - - /* U+F7C2 "" */ - 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, - 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, - 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, - 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, - 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+FF08 "(" */ - 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, 0x73, 0x0, - 0x65, 0x0, 0x2b, 0x0, 0x8, 0x50, 0x0, 0xb3, - 0x0, 0xc, 0x20, 0x0, 0xa3, 0x0, 0x6, 0x70, - 0x0, 0xb, 0x0, 0x0, 0x29, 0x0, 0x0, 0x28, - 0x0, 0x0, 0x2, - - /* U+FF09 ")" */ - 0x0, 0x0, 0x2, 0x60, 0x0, 0x2, 0x80, 0x0, - 0x4, 0x80, 0x0, 0xb, 0x30, 0x0, 0x59, 0x0, - 0x2, 0xd0, 0x0, 0x1e, 0x0, 0x2, 0xb0, 0x0, - 0x68, 0x0, 0x1d, 0x10, 0xa, 0x30, 0x8, 0x30, - 0x2, 0x0, 0x0, - - /* U+FF0C "," */ - 0x4, 0x91, 0xb, 0xf6, 0x1, 0xc3, 0x2, 0x90, - 0x5, 0x0, - - /* U+FF11 "1" */ - 0x1, 0x74, 0x0, 0x26, 0xd5, 0x0, 0x0, 0xb5, - 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb5, 0x0, 0x0, - 0xb5, 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb5, 0x0, - 0x0, 0xb5, 0x0, 0x1, 0xc7, 0x0, 0x45, 0x55, - 0x50, - - /* U+FF12 "2" */ - 0x0, 0x4, 0x41, 0x0, 0x5, 0x92, 0x3c, 0x60, - 0xf, 0x40, 0x5, 0xf0, 0xc, 0x60, 0x5, 0xf0, - 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x3d, 0x10, - 0x0, 0x1, 0xc2, 0x0, 0x0, 0xa, 0x20, 0x0, - 0x0, 0x93, 0x0, 0x0, 0x8, 0x30, 0x0, 0x70, - 0x2f, 0xdd, 0xdd, 0x80, 0x0, 0x0, 0x0, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 128, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 128, .box_w = 2, .box_h = 12, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 12, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, - {.bitmap_index = 27, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 75, .adv_w = 128, .box_w = 6, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 120, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 168, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 216, .adv_w = 128, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 226, .adv_w = 128, .box_w = 5, .box_h = 16, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 266, .adv_w = 128, .box_w = 5, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 306, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 342, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 378, .adv_w = 128, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 388, .adv_w = 128, .box_w = 8, .box_h = 1, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 392, .adv_w = 128, .box_w = 2, .box_h = 3, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 395, .adv_w = 128, .box_w = 8, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 459, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 507, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 543, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 585, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 627, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 675, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 717, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 765, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 807, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 855, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 903, .adv_w = 128, .box_w = 2, .box_h = 8, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 911, .adv_w = 128, .box_w = 2, .box_h = 10, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 921, .adv_w = 128, .box_w = 6, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 960, .adv_w = 128, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 976, .adv_w = 128, .box_w = 6, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1015, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1063, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1111, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1159, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1207, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1255, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1303, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1351, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1399, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1447, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1495, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1531, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1587, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1635, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1683, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1731, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1779, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1827, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1875, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1931, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1979, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2027, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2075, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2123, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2171, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2219, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2267, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2315, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2363, .adv_w = 128, .box_w = 4, .box_h = 15, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 2393, .adv_w = 128, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 2446, .adv_w = 128, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2476, .adv_w = 128, .box_w = 6, .box_h = 2, .ofs_x = 1, .ofs_y = 12}, - {.bitmap_index = 2482, .adv_w = 128, .box_w = 8, .box_h = 1, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2486, .adv_w = 128, .box_w = 4, .box_h = 2, .ofs_x = 1, .ofs_y = 12}, - {.bitmap_index = 2490, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2522, .adv_w = 128, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2574, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2602, .adv_w = 128, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2654, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2682, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2730, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2770, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2818, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2854, .adv_w = 128, .box_w = 6, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 2896, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2944, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2980, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3012, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3044, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3076, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3116, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3156, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3188, .adv_w = 128, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3212, .adv_w = 128, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3245, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3277, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3309, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3341, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3373, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3413, .adv_w = 128, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3437, .adv_w = 128, .box_w = 4, .box_h = 16, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 3469, .adv_w = 128, .box_w = 2, .box_h = 18, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 3487, .adv_w = 128, .box_w = 4, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 3519, .adv_w = 128, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 11}, - {.bitmap_index = 3535, .adv_w = 128, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3535, .adv_w = 256, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3548, .adv_w = 256, .box_w = 4, .box_h = 5, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 3558, .adv_w = 256, .box_w = 9, .box_h = 12, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 3612, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 10, .ofs_y = -1}, - {.bitmap_index = 3640, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 3668, .adv_w = 256, .box_w = 10, .box_h = 11, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 3723, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 3807, .adv_w = 256, .box_w = 10, .box_h = 7, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 3842, .adv_w = 256, .box_w = 12, .box_h = 9, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 3896, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 3955, .adv_w = 256, .box_w = 8, .box_h = 11, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 3999, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4071, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4149, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4240, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4331, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 4396, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4481, .adv_w = 256, .box_w = 7, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 4530, .adv_w = 256, .box_w = 11, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 4607, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4685, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4783, .adv_w = 256, .box_w = 10, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 4838, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4923, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 4982, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 5066, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 5131, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 5196, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5287, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5400, .adv_w = 256, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5472, .adv_w = 256, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5570, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 5642, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5740, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 5818, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5909, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5975, .adv_w = 256, .box_w = 10, .box_h = 7, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6010, .adv_w = 256, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6075, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 6159, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6225, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6303, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6362, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6434, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6512, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6573, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6651, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6742, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6820, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6898, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6996, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7081, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7159, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7257, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7355, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7427, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7505, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7583, .adv_w = 256, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 7635, .adv_w = 256, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 7700, .adv_w = 256, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 7759, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7831, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7915, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7999, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 8058, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8143, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8209, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8287, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 8346, .adv_w = 256, .box_w = 11, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8401, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8492, .adv_w = 256, .box_w = 10, .box_h = 9, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 8537, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8615, .adv_w = 256, .box_w = 8, .box_h = 9, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 8651, .adv_w = 256, .box_w = 9, .box_h = 12, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8705, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 8770, .adv_w = 256, .box_w = 8, .box_h = 13, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 8822, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 8887, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8978, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 9043, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 9128, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 9200, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 9285, .adv_w = 256, .box_w = 9, .box_h = 11, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 9335, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 9413, .adv_w = 256, .box_w = 8, .box_h = 11, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 9457, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 9522, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 9594, .adv_w = 256, .box_w = 10, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 9629, .adv_w = 256, .box_w = 12, .box_h = 9, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 9683, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 9768, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 9840, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 9931, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10003, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10081, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 10151, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 10235, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10313, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 10398, .adv_w = 256, .box_w = 10, .box_h = 9, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 10443, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 10515, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 10599, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10704, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10776, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10848, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10909, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11000, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11066, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11151, .adv_w = 256, .box_w = 10, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 11211, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 11283, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 11381, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 11459, .adv_w = 256, .box_w = 9, .box_h = 9, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 11500, .adv_w = 256, .box_w = 10, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 11560, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 11626, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 11724, .adv_w = 256, .box_w = 7, .box_h = 13, .ofs_x = 6, .ofs_y = -1}, - {.bitmap_index = 11770, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 11829, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 11907, .adv_w = 256, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 11959, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 12037, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12098, .adv_w = 256, .box_w = 13, .box_h = 7, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 12144, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 12214, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 12284, .adv_w = 256, .box_w = 9, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 12334, .adv_w = 256, .box_w = 10, .box_h = 11, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12389, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12455, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12521, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 12619, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 12717, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 12794, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 12871, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12937, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 13021, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13087, .adv_w = 256, .box_w = 12, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13141, .adv_w = 256, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 13189, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13250, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 13316, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13376, .adv_w = 256, .box_w = 11, .box_h = 10, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 13431, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 13516, .adv_w = 256, .box_w = 10, .box_h = 7, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 13551, .adv_w = 256, .box_w = 8, .box_h = 8, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 13583, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13644, .adv_w = 256, .box_w = 10, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 13704, .adv_w = 256, .box_w = 7, .box_h = 13, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 13750, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 13820, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 13870, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 13920, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 13986, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14052, .adv_w = 256, .box_w = 10, .box_h = 9, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 14097, .adv_w = 256, .box_w = 15, .box_h = 3, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 14120, .adv_w = 256, .box_w = 16, .box_h = 2, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 14136, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 14248, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 14353, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14473, .adv_w = 256, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 14577, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 14689, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 14794, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14907, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15035, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 15147, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15267, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15387, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 15492, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 15596, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 15701, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15821, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 15933, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 16046, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 16151, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16271, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 16384, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 16489, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 16587, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 16700, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16828, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16948, .adv_w = 256, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17036, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 17148, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 17260, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 17372, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17500, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 17620, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 17740, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17860, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17980, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18108, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18228, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18356, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18476, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18604, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18724, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18852, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18980, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 19078, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19206, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19334, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19454, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19574, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 19694, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19822, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 19942, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20070, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20190, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20310, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20438, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20558, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20686, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20814, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20927, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21055, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21175, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21303, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21431, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21559, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21679, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21799, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21912, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22032, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22160, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22273, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22393, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22513, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22641, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22769, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22897, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23017, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23137, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23265, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23393, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23513, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23641, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23769, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23897, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24017, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24137, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24265, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24393, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24521, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24634, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24762, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24890, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25018, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25131, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25251, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25371, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25491, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 25596, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 25716, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25836, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25956, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 26076, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26204, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 26324, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26437, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26557, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 26661, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26789, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 26902, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27022, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 27135, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27255, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27375, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27503, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27623, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 27727, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 27825, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27945, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28058, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 28170, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 28283, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 28396, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28524, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 28637, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28757, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28877, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 28975, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29088, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 29201, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 29314, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 29427, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 29555, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 29675, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 29788, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 29908, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 30021, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 30141, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 30269, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 30397, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 30510, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 30622, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 30742, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 30847, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 30967, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31095, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31223, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31343, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31463, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31583, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31696, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31816, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31944, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32072, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32192, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32312, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32432, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32560, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32688, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32808, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 32920, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 33033, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 33146, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 33259, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 33364, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 33484, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 33604, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 33724, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 33852, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 33972, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 34092, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 34212, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 34325, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 34445, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 34550, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 34670, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 34783, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 34888, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35001, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35121, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 35257, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 35393, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35513, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35633, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35761, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35881, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36001, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36121, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 36193, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 36313, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36433, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 36538, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 36636, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 36741, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36861, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 36965, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37093, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37213, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 37318, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 37416, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 37521, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37649, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37777, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 37875, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 37987, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 38091, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 38196, .adv_w = 256, .box_w = 15, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 38294, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 38407, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 38512, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 38617, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38730, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 38850, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 38963, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 39091, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 39204, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39324, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39429, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39533, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39646, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 39766, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39879, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39984, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 40097, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 40225, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 40338, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 40466, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 40571, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 40691, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 40804, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 40917, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 41022, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 41142, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 41262, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 41360, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 41458, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 41563, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 41661, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 41781, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 41879, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 41999, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 42111, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 42223, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 42335, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 42447, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 42559, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42687, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 42799, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42912, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43025, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 43137, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 43249, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43377, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43505, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43633, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43753, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43881, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44009, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44137, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44265, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44385, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44505, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44633, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44761, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 44866, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44986, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 45099, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 45212, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 45332, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 45437, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 45550, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 45662, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 45790, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 45910, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46038, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46158, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46286, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46406, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46526, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46646, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46774, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46894, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47022, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 47135, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47263, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47383, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47496, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47616, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47744, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47872, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 48008, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48128, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48256, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48384, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48504, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48632, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48760, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48888, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49016, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49136, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49256, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49376, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49496, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49624, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49752, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49872, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 49985, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50105, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50225, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50353, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 50458, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 50578, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 50698, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50818, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50946, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 51066, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 51186, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 51299, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 51412, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 51532, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 51652, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 51780, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 51900, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 52012, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 52117, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52245, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 52365, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52485, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52605, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52725, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 52837, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52957, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53085, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 53205, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 53325, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53445, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53573, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53693, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53821, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 53941, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 54061, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54189, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54309, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 54414, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54527, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 54631, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54751, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54879, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54999, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55112, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55232, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55345, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55465, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55578, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55698, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55818, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 55909, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 56029, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 56149, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 56247, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56352, .adv_w = 256, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 56450, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 56555, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 56675, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 56773, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 56871, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 56991, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57111, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 57224, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57352, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 57472, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57592, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57720, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57840, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 57953, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58073, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 58185, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 58290, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58410, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58538, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58666, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58794, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58907, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59035, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59163, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59283, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59411, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59531, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59651, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59771, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59899, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 60027, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 60155, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 60283, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 60403, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 60523, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 60613, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 60725, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 60838, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 60958, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61086, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 61191, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61311, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61431, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61559, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61679, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61799, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61919, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62039, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62167, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62287, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62407, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62535, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62663, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62783, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62903, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63031, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 63136, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 63241, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 63354, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63474, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63602, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63730, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 63842, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 63962, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64082, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64195, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 64308, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64436, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 64541, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 64654, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 64759, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 64879, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65007, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 65127, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 65240, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 65353, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 65451, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 65563, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65691, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 65796, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65916, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 66029, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 66165, .adv_w = 256, .box_w = 15, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 66293, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 66405, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 66525, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 66653, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 66773, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 66893, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 67029, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67149, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67269, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67389, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67509, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67637, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67757, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67877, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 68013, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68141, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68269, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68389, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68509, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68629, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68749, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68862, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68982, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69110, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69238, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69358, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69478, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 69591, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69711, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69839, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69967, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70095, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70223, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70343, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70463, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70591, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70719, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70839, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70952, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71072, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71200, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71328, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71456, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71576, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71696, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71816, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71936, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72064, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72192, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72305, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 72418, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72546, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72674, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72794, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 72907, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73027, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73155, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73283, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73411, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73539, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73659, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73787, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 73900, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74020, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74140, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74260, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74380, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74508, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74628, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74748, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74868, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 74981, .adv_w = 256, .box_w = 10, .box_h = 15, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 75056, .adv_w = 256, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 75160, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75280, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 75392, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75505, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 75603, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 75708, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75836, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 75941, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 76046, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76174, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 76294, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76407, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 76519, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 76624, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 76744, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76872, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76992, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 77104, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 77224, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 77337, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 77457, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 77562, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 77674, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 77786, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 77891, .adv_w = 256, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 77987, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78107, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 78227, .adv_w = 256, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 78323, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 78435, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78563, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78691, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78789, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78917, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79030, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79150, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 79263, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79383, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79503, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79623, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79736, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79849, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79977, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80105, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80233, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80361, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80489, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80609, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80737, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80865, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80993, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81113, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81233, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81361, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81474, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81602, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81730, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81850, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81978, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82106, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82234, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82362, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82490, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82610, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82738, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82866, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 82994, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83122, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83250, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83378, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83506, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83634, .adv_w = 256, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 83762, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 83890, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84018, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84138, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84266, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84394, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84522, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84650, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84770, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84898, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85026, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85154, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85282, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85410, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 85546, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 85666, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85786, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85914, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86042, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86170, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 86282, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 86394, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86522, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 86642, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86770, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86898, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87026, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87154, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87274, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87394, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87522, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87650, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87770, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87890, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88018, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88146, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 88244, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 88356, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 88461, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 88574, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88702, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88830, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88958, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89078, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89198, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89326, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89446, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89559, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 89679, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89799, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 89919, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90039, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 90152, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90272, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 90377, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90505, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90633, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90761, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90874, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90987, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91115, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91235, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91348, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91468, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91588, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91716, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 91836, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91956, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 92084, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 92196, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 92316, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 92429, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 92541, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 92661, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 92774, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 92894, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93014, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93142, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93262, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93382, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93510, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93623, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93743, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93863, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 93991, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 94111, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94239, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94367, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94495, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94623, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94751, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94879, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94999, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 95111, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95239, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 95351, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95479, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95599, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95712, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95832, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 95945, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96065, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 96177, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 96289, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 96409, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96529, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96657, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96785, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96913, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97033, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97153, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97281, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97401, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97529, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97649, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97769, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 97889, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98009, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98129, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98257, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 98369, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98489, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98602, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98722, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 98842, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98962, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 99082, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 99195, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 99286, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 99384, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 99488, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 99586, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 99691, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 99804, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 99909, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100029, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 100134, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100262, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100382, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100495, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 100607, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100735, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100855, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 100983, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 101096, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 101216, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 101306, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 101419, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 101523, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 101628, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 101724, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 101844, .adv_w = 256, .box_w = 11, .box_h = 15, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 101927, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 102047, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102167, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102295, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102423, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 102536, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 102641, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102761, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 102874, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 102994, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103114, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103242, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103362, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103482, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103610, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103730, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103843, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103963, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104083, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104203, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104323, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104451, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104571, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104699, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104819, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 104947, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105075, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105195, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105315, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105435, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105555, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105675, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 105803, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 105923, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106036, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 106149, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 106269, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106389, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 106509, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106637, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106757, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106885, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 106998, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107126, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107254, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107382, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107502, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107630, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107750, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 107870, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 107990, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108110, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108238, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108366, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108494, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108614, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 108726, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108839, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 108952, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 109072, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 109192, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 109305, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 109425, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 109545, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 109657, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 109777, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 109905, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 110025, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 110145, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 110265, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 110385, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 110513, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 110633, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 110753, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 110873, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111001, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111129, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111257, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111377, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111505, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 111610, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111738, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111866, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 111994, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 112114, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 112242, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 112362, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 112490, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 112610, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 112730, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 112866, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 112964, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113084, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113212, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113332, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113445, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113565, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 113678, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113806, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 113934, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114054, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114182, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 114286, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114398, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114518, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 114623, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114743, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 114871, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 114984, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115104, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115224, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115344, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115457, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115577, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115705, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 115833, .adv_w = 256, .box_w = 11, .box_h = 15, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 115916, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 116021, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116149, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116269, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116382, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116510, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116638, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116766, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 116894, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 116998, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 117118, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 117238, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 117358, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 117486, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 117614, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 117734, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 117854, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 117974, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 118087, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 118200, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 118320, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 118448, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 118576, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 118704, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 118824, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 118952, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 119080, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 119208, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 119336, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 119449, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 119569, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 119697, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 119825, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 119937, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 120065, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 120193, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 120313, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 120441, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 120554, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 120674, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 120794, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 120914, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 121034, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 121154, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 121274, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 121402, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 121522, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 121642, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 121762, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 121890, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 122002, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 122122, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 122242, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 122362, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 122490, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 122610, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 122730, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 122858, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 122971, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 123099, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 123219, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 123339, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 123452, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 123572, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 123692, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 123820, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 123940, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 124060, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 124188, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 124308, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 124428, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 124556, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 124684, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 124812, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 124940, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 125060, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 125180, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 125308, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 125428, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 125556, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 125684, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 125804, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 125924, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 126052, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 126172, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 126300, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 126428, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 126564, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 126692, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 126805, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 126918, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 127038, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 127158, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 127270, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 127390, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 127503, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 127623, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 127743, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 127841, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 127961, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 128081, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 128193, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 128313, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 128433, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 128538, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 128666, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 128778, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 128898, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 129026, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 129162, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 129298, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 129418, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 129538, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 129666, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 129786, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 129914, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 130034, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 130154, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 130282, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 130410, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 130538, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 130666, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 130794, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 130922, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 131050, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 131178, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 131291, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 131419, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 131547, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 131675, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 131795, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 131915, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 132027, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 132147, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 132267, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 132379, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 132507, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 132619, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 132739, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 132859, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 132979, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 133099, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 133219, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 133339, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 133459, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 133579, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 133691, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 133811, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 133931, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 134051, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 134171, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 134291, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 134411, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 134531, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 134651, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 134779, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 134907, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 135027, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 135155, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 135275, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 135403, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 135523, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 135651, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 135764, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 135884, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 136004, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 136117, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 136245, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 136365, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 136485, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 136613, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 136741, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 136861, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 136966, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 137086, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 137206, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 137334, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 137462, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 137582, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 137702, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 137814, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 137942, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 138062, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 138182, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 138302, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 138400, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 138498, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 138602, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 138700, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 138798, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 138903, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 139001, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 139106, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 139218, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 139331, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 139444, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 139556, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 139669, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 139774, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 139887, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 140007, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 140112, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 140225, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 140345, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 140465, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 140593, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 140713, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 140826, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 140954, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 141067, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 141195, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 141300, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 141413, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 141525, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 141630, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 141743, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 141863, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 141991, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 142119, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 142239, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 142359, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 142479, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 142607, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 142727, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 142839, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 142952, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 143072, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 143185, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 143305, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 143425, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 143538, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 143658, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 143778, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 143898, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 144018, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 144138, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 144258, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 144378, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 144498, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 144626, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 144746, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 144866, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 144986, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 145114, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 145234, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 145362, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 145482, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 145602, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 145730, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 145858, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 145978, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 146098, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 146226, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 146346, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 146466, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 146586, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 146706, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 146826, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 146931, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 147051, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 147179, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 147307, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 147427, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 147563, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 147659, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 147771, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 147867, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 147933, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 148061, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 148189, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 148315, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 148443, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 148551, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 148679, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 148735, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 148819, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 148963, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 149059, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 149147, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 149227, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 149353, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 149458, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 149556, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 149636, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 149748, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 149818, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 149888, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 149986, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 150014, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 150122, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 150282, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 150442, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 150570, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 150640, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 150710, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 150850, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 150946, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 151074, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 151219, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 151324, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 151436, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 151534, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 151632, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 151728, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 151824, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 151936, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 152048, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 152156, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 152318, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 152414, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 152564, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 152664, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 152764, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 152864, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 152964, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 153064, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 153211, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 153307, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 153419, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 153564, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 153684, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 153780, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 153874, .adv_w = 256, .box_w = 5, .box_h = 14, .ofs_x = 9, .ofs_y = -1}, - {.bitmap_index = 153909, .adv_w = 256, .box_w = 5, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 153944, .adv_w = 256, .box_w = 4, .box_h = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 153954, .adv_w = 256, .box_w = 6, .box_h = 11, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 153987, .adv_w = 256, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = 0} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x1, 0x4, 0xb, 0xc, 0x40, 0x41, 0x42, - 0x43, 0x45, 0x46, 0x47 -}; - -static const uint8_t glyph_id_ofs_list_4[] = { - 0, 0, 0, 1, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 4, 5, 6, 0, 7, - 8, 9, 0, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 0, - 30, 31, 32, 0, 33, 34, 0, 35, - 36, 37, 38, 39, 40, 0, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, - 51, 0, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 0, - 65, 66, 67, 68, 69, 70, 71 -}; - -static const uint16_t unicode_list_5[] = { - 0x0, 0x4, 0x7, 0xd, 0x1d11, 0x1d14, 0x1d18, 0x1d19, - 0x1d1a, 0x1d1b, 0x1d1c, 0x1d1e, 0x1d24, 0x1d25, 0x1d27, 0x1d32, - 0x1d37, 0x1d3e, 0x1d4c, 0x1d56, 0x1d5c, 0x1d5f, 0x1d60, 0x1d68, - 0x1d6e, 0x1d70, 0x1d97, 0x1d99, 0x1d9a, 0x1d9c, 0x1d9d, 0x1da5, - 0x1dac, 0x1db2, 0x1db5, 0x1db7, 0x1dbd, 0x1dcb, 0x1dd1, 0x1ddb, - 0x1ddc, 0x1dde, 0x1de6, 0x1de7, 0x1de9, 0x1df4, 0x1df5, 0x1df6, - 0x1dff, 0x1e07, 0x1e0c, 0x1e0e, 0x1e12, 0x1e1b, 0x1e22, 0x1e2b, - 0x1e2e, 0x1e49, 0x1e4d, 0x1e57, 0x1e5e, 0x1e5f, 0x1e60, 0x1e64, - 0x1e66, 0x1e6a, 0x1e6d, 0x1e71, 0x1e90, 0x1e97, 0x1e9c, 0x1eac, - 0x1eae, 0x1eb2, 0x1ed0, 0x1ed3, 0x1eee, 0x1ef2, 0x1eff, 0x1f1c, - 0x1f22, 0x1f2a, 0x1f30, 0x1f35, 0x1f4d, 0x1f6b, 0x1f6d, 0x1f76, - 0x1f85, 0x1faa, 0x1fc4, 0x1fd6, 0x1fde, 0x1fe0, 0x1fe6, 0x200a, - 0x2015, 0x203b, 0x2050, 0x2054, 0x2055, 0x2056, 0x2059, 0x205a, - 0x205c, 0x205e, 0x2063, 0x206b, 0x2076, 0x2078, 0x2079, 0x207a, - 0x207c, 0x207d, 0x207e, 0x2082, 0x2087, 0x2088, 0x2096, 0x2097, - 0x209b, 0x209e, 0x20aa, 0x20ac, 0x20bd, 0x20c8, 0x20de, 0x20ee, - 0x20f7, 0x210b, 0x2117, 0x2118, 0x211b, 0x2128, 0x212e, 0x2135, - 0x2136, 0x213a, 0x2141, 0x2147, 0x2149, 0x214c, 0x2158, 0x215b, - 0x215e, 0x216c, 0x2183, 0x2186, 0x2194, 0x21ac, 0x21b0, 0x21b1, - 0x21b9, 0x21ba, 0x21bb, 0x21c4, 0x21da, 0x21e6, 0x21ea, 0x21ee, - 0x21f5, 0x2206, 0x2216, 0x2227, 0x2228, 0x224c, 0x2251, 0x2252, - 0x2254, 0x2259, 0x225b, 0x2263, 0x2265, 0x2268, 0x2269, 0x2282, - 0x2284, 0x228c, 0x22ab, 0x22b0, 0x22c4, 0x22cc, 0x22d3, 0x22d4, - 0x22d9, 0x22db, 0x22dc, 0x22de, 0x22e7, 0x22e8, 0x22f4, 0x22f5, - 0x22f6, 0x22f7, 0x22fb, 0x22fc, 0x2300, 0x2301, 0x2303, 0x2304, - 0x2308, 0x2309, 0x2314, 0x2315, 0x2319, 0x231d, 0x231e, 0x2322, - 0x2337, 0x2338, 0x2351, 0x235b, 0x2373, 0x2379, 0x2384, 0x238d, - 0x238e, 0x239d, 0x23c3, 0x23d2, 0x23f2, 0x23fb, 0x2457, 0x245b, - 0x2460, 0x2477, 0x2495, 0x249a, 0x24ad, 0x24ae, 0x24bf, 0x24c7, - 0x24df, 0x2500, 0x252c, 0x25c5, 0x25ec, 0x25ef, 0x25f1, 0x2601, - 0x2604, 0x260e, 0x261c, 0x261e, 0x2623, 0x2629, 0x2630, 0x2634, - 0x2639, 0x2641, 0x2658, 0x265b, 0x2661, 0x269c, 0x26f0, 0x2708, - 0x270b, 0x2742, 0x2745, 0x275b, 0x277a, 0x2794, 0x27a8, 0x27af, - 0x27db, 0x27e4, 0x27fc, 0x2801, 0x2803, 0x281a, 0x2820, 0x2826, - 0x2827, 0x282b, 0x282d, 0x2831, 0x2838, 0x283a, 0x283b, 0x283c, - 0x283f, 0x2842, 0x2858, 0x2862, 0x2868, 0x2884, 0x288a, 0x288e, - 0x2893, 0x2898, 0x28c4, 0x28ca, 0x28cc, 0x28da, 0x28dc, 0x28e1, - 0x28e5, 0x2929, 0x296b, 0x2977, 0x29a3, 0x29ce, 0x29dd, 0x2a1a, - 0x2a61, 0x2a68, 0x2a69, 0x2a74, 0x2a77, 0x2a7a, 0x2a7c, 0x2a89, - 0x2a94, 0x2a96, 0x2a98, 0x2a99, 0x2a9a, 0x2a9d, 0x2aa9, 0x2aaa, - 0x2aab, 0x2aaf, 0x2ab0, 0x2ab3, 0x2ab5, 0x2ac4, 0x2ac6, 0x2ac7, - 0x2aca, 0x2ad0, 0x2ad5, 0x2ad7, 0x2add, 0x2ae3, 0x2aee, 0x2af0, - 0x2af7, 0x2afc, 0x2b0b, 0x2b0f, 0x2b15, 0x2b18, 0x2b19, 0x2b1e, - 0x2b1f, 0x2b20, 0x2b22, 0x2b2b, 0x2b35, 0x2b42, 0x2b4b, 0x2b51, - 0x2b56, 0x2b5b, 0x2b5c, 0x2b66, 0x2b76, 0x2b7d, 0x2b82, 0x2c07, - 0x2c5d, 0x2cee, 0x2cef, 0x2cf6, 0x2cf7, 0x2cff, 0x2d02, 0x2d03, - 0x2d13, 0x2d14, 0x2d19, 0x2d1d, 0x2d3c, 0x2d3e, 0x2d40, 0x2d41, - 0x2d44, 0x2d47, 0x2d49, 0x2d56, 0x2d84, 0x2d85, 0x2d89, 0x2d8f, - 0x2d94, 0x2d97, 0x2da6, 0x2da8, 0x2dad, 0x2db7, 0x2db8, 0x2dbc, - 0x2dbe, 0x2dc8, 0x2df1, 0x2e0b, 0x2e10, 0x2e20, 0x2e26, 0x2e30, - 0x2e42, 0x2e46, 0x2e48, 0x2e64, 0x2e73, 0x2e82, 0x2e8a, 0x2e8d, - 0x2e91, 0x2e96, 0x2e99, 0x2e9c, 0x2e9d, 0x2ea3, 0x2ea4, 0x2ea8, - 0x2eaf, 0x2eb2, 0x2eba, 0x2ed4, 0x2ed6, 0x2ee9, 0x2eea, 0x2efc, - 0x2f06, 0x2f1f, 0x2f23, 0x2f26, 0x2f2e, 0x2f36, 0x2f38, 0x2f80, - 0x2fb9, 0x2fbb, 0x2fc3, 0x2fd6, 0x3004, 0x3019, 0x3020, 0x302b, - 0x302c, 0x3030, 0x305c, 0x3074, 0x3078, 0x307f, 0x30da, 0x3109, - 0x3121, 0x3122, 0x3127, 0x3137, 0x3141, 0x314c, 0x3150, 0x3151, - 0x315c, 0x315e, 0x3164, 0x3166, 0x318f, 0x3191, 0x319b, 0x31a6, - 0x31cd, 0x31d6, 0x31da, 0x31ec, 0x31f2, 0x31fd, 0x31fe, 0x3210, - 0x3212, 0x3218, 0x322a, 0x3266, 0x3279, 0x3299, 0x32a3, 0x32ac, - 0x32b2, 0x32b3, 0x32b6, 0x32b8, 0x32b9, 0x32e0, 0x32e1, 0x32ec, - 0x32ff, 0x330b, 0x334b, 0x33d2, 0x33d8, 0x33e5, 0x33eb, 0x3440, - 0x344a, 0x344f, 0x3450, 0x3456, 0x3459, 0x3468, 0x346a, 0x3473, - 0x3481, 0x3485, 0x3498, 0x34aa, 0x34be, 0x34c1, 0x34c8, 0x34ca, - 0x34cd, 0x34ce, 0x34d2, 0x34d6, 0x34e0, 0x34f3, 0x34f6, 0x34f7, - 0x34fa, 0x3507, 0x3518, 0x351f, 0x3524, 0x3525, 0x3530, 0x3531, - 0x3536, 0x3539, 0x3540, 0x354d, 0x3553, 0x357a, 0x357f, 0x3580, - 0x3585, 0x358b, 0x3598, 0x35a2, 0x35a7, 0x35a8, 0x35d8, 0x35ed, - 0x3603, 0x3605, 0x3609, 0x360f, 0x3610, 0x3611, 0x3614, 0x3619, - 0x361a, 0x361c, 0x361e, 0x362c, 0x362e, 0x3630, 0x3639, 0x363b, - 0x363c, 0x363d, 0x363e, 0x364b, 0x3661, 0x3662, 0x3670, 0x3672, - 0x3676, 0x3680, 0x3682, 0x36a1, 0x36a8, 0x36ad, 0x36e1, 0x36f6, - 0x3702, 0x370c, 0x3710, 0x3722, 0x3732, 0x373b, 0x374a, 0x374d, - 0x3754, 0x3759, 0x37ae, 0x37c1, 0x37ff, 0x381e, 0x382d, 0x386b, - 0x387e, 0x3886, 0x388e, 0x3893, 0x38dc, 0x38e9, 0x3913, 0x392a, - 0x3932, 0x3934, 0x393b, 0x394a, 0x395c, 0x3970, 0x3a32, 0x3a43, - 0x3a5d, 0x3a61, 0x3a72, 0x3a73, 0x3a74, 0x3a75, 0x3a76, 0x3a7a, - 0x3a80, 0x3a83, 0x3a84, 0x3a88, 0x3a8c, 0x3a9b, 0x3a9c, 0x3ac6, - 0x3ade, 0x3adf, 0x3ae0, 0x3ae5, 0x3aec, 0x3b20, 0x3b22, 0x3b25, - 0x3b28, 0x3b45, 0x3b48, 0x3b49, 0x3b53, 0x3b6b, 0x3b71, 0x3b8b, - 0x3b99, 0x3ba3, 0x3bca, 0x3bcc, 0x3bd2, 0x3bdb, 0x3be6, 0x3bf3, - 0x3bf4, 0x3bf9, 0x3c04, 0x3c1c, 0x3c28, 0x3c43, 0x3c4c, 0x3c4f, - 0x3c52, 0x3c56, 0x3c85, 0x3c88, 0x3c99, 0x3ccd, 0x3d02, 0x3d08, - 0x3d16, 0x3d18, 0x3d19, 0x3d1a, 0x3d2c, 0x3d32, 0x3d3a, 0x3d40, - 0x3d67, 0x3da1, 0x3da7, 0x3dae, 0x3e10, 0x3e33, 0x3e49, 0x3ed4, - 0x3ef0, 0x3f74, 0x3f7c, 0x3f8e, 0x3fca, 0x3fcb, 0x4032, 0x4047, - 0x406a, 0x40c2, 0x40f0, 0x413e, 0x4147, 0x4149, 0x4158, 0x416c, - 0x4171, 0x417a, 0x418a, 0x41bd, 0x41c0, 0x41c7, 0x41d1, 0x41fd, - 0x41fe, 0x423c, 0x4250, 0x4283, 0x42ba, 0x430f, 0x4314, 0x4317, - 0x43c1, 0x4429, 0x442b, 0x4430, 0x4433, 0x4434, 0x4439, 0x4441, - 0x4442, 0x4444, 0x4446, 0x4448, 0x444b, 0x444c, 0x445d, 0x446a, - 0x447b, 0x447c, 0x4481, 0x4487, 0x44c3, 0x44d6, 0x44ec, 0x458b, - 0x458d, 0x458e, 0x458f, 0x4595, 0x4597, 0x45d0, 0x45e8, 0x45ff, - 0x4605, 0x4609, 0x461c, 0x4630, 0x4631, 0x464f, 0x4651, 0x46f6, - 0x46fe, 0x4704, 0x4713, 0x4725, 0x4745, 0x47cb, 0x484b, 0x484d, - 0x484f, 0x4867, 0x486e, 0x486f, 0x487e, 0x4892, 0x48d1, 0x48d2, - 0x48dc, 0x48de, 0x48e2, 0x48e9, 0x490c, 0x491c, 0x493f, 0x495e, - 0x4987, 0x498b, 0x49a4, 0x49dc, 0x49ea, 0x49f6, 0x4a00, 0x4a22, - 0x4a37, 0x4a3d, 0x4a57, 0x4a5a, 0x4a65, 0x4a67, 0x4aa8, 0x4ab2, - 0x4ad1, 0x4ad5, 0x4b32, 0x4b84, 0x4bcf, 0x4be7, 0x4c0c, 0x4c11, - 0x4c15, 0x4c2a, 0x4c31, 0x4c41, 0x4c4a, 0x4c53, 0x4c55, 0x4c5d, - 0x4c61, 0x4c72, 0x4c77, 0x4c82, 0x4c86, 0x4ca4, 0x4cab, 0x4cbe, - 0x4cc3, 0x4ce2, 0x4ce3, 0x4ceb, 0x4cf1, 0x4cfa, 0x4d05, 0x4d4e, - 0x4d4f, 0x4d65, 0x4d81, 0x4d8d, 0x4d9d, 0x4df0, 0x4e4b, 0x4e7f, - 0x4e9f, 0x4eba, 0x4ee3, 0x4f12, 0x4f14, 0x4f16, 0x4f1d, 0x4f44, - 0x4f6f, 0x4f80, 0x4f83, 0x4f88, 0x4f8e, 0x4f9a, 0x4fba, 0x4fc0, - 0x4fc3, 0x4fdd, 0x5009, 0x500e, 0x5042, 0x505b, 0x5066, 0x5077, - 0x5081, 0x50ae, 0x50da, 0x50fb, 0x5104, 0x510b, 0x5118, 0x5119, - 0x511a, 0x513b, 0x513d, 0x514a, 0x5180, 0x5183, 0x5193, 0x51c2, - 0x51f6, 0x51f7, 0x5202, 0x5247, 0x5288, 0x52e4, 0x52ed, 0x534e, - 0x535a, 0x5368, 0x5446, 0x5495, 0x54bd, 0x54ee, 0x5518, 0x5566, - 0x575d, 0x5764, 0x5779, 0x57bc, 0x57e0, 0x57ed, 0x57f2, 0x580e, - 0x5818, 0x5890, 0x5892, 0x589c, 0x58a0, 0x58a7, 0x58ab, 0x58bb, - 0x58cb, 0x58d1, 0x58e3, 0x58f4, 0x58f7, 0x5911, 0x5919, 0x591b, - 0x591f, 0x5924, 0x5929, 0x593b, 0x593e, 0x5942, 0x5944, 0x5945, - 0x5966, 0x5977, 0x5982, 0x5983, 0x5984, 0x599d, 0x599e, 0x59a6, - 0x59a9, 0x59af, 0x59bb, 0x59bd, 0x59be, 0x59c1, 0x59c3, 0x59d0, - 0x59d8, 0x59dc, 0x59e7, 0x5a09, 0x5a13, 0x5a2c, 0x5a2e, 0x5a69, - 0x5a81, 0x5a88, 0x5a9b, 0x5aa4, 0x5ab2, 0x5aef, 0x5b61, 0x5b72, - 0x5bb1, 0x5bb2, 0x5bb8, 0x5bba, 0x5bbd, 0x5bc8, 0x5bc9, 0x5bcc, - 0x5bd0, 0x5bd4, 0x5bd8, 0x5bfb, 0x5c0e, 0x5c4a, 0x5c75, 0x5c81, - 0x5c88, 0x5c96, 0x5c9b, 0x5cb4, 0x5cc4, 0x5cf0, 0x5d00, 0x5dbc, - 0x5ddb, 0x5df0, 0x5df3, 0x5e0e, 0x5e14, 0x5e1a, 0x5e26, 0x5e3b, - 0x5e49, 0x5eac, 0x5eaf, 0x5eb7, 0x5ec3, 0x5ecb, 0x5ecd, 0x5edf, - 0x5ee2, 0x5ee5, 0x5efc, 0x5f0e, 0x5f11, 0x5f12, 0x5f14, 0x5f20, - 0x5f21, 0x5f2a, 0x5f2b, 0x5f30, 0x5f31, 0x5f34, 0x5f3f, 0x5f42, - 0x5f43, 0x5f56, 0x5f5b, 0x5f5c, 0x5f5f, 0x5f64, 0x5f65, 0x5f66, - 0x5f71, 0x5f7a, 0x5f89, 0x5f90, 0x5f95, 0x5f9b, 0x5fb4, 0x5fbb, - 0x5ff9, 0x6006, 0x600e, 0x605e, 0x6063, 0x6065, 0x6089, 0x60bc, - 0x60de, 0x60df, 0x60e0, 0x60e2, 0x60ee, 0x6155, 0x616c, 0x6191, - 0x6233, 0x6240, 0x6243, 0x6488, 0x649a, 0x649c, 0x64a4, 0x64b3, - 0x64ed, 0x6501, 0x6544, 0x6555, 0x655e, 0x6561, 0x6573, 0x6575, - 0x6589, 0x658e, 0x659f, 0x65ac, 0x65ad, 0x65b4, 0x65b9, 0x65cc, - 0x65d7, 0x65e2, 0x65e7, 0x65ea, 0x65f3, 0x65f4, 0x65f9, 0x65fb, - 0x6603, 0x660c, 0x6611, 0x6618, 0x6663, 0x666a, 0x666f, 0x6673, - 0x667a, 0x6685, 0x6704, 0x6710, 0x6714, 0x6716, 0x6719, 0x6728, - 0x6729, 0x673e, 0x674d, 0x675d, 0x6765, 0x6769, 0x676f, 0x6780, - 0x67b9, 0x67ec, 0x67f0, 0x6800, 0x6803, 0x6839, 0x68a7, 0x68aa, - 0x68d5, 0x68d6, 0x6923, 0x6924, 0x6968, 0x69e5, 0x69e9, 0x69fb, - 0x6a6b, 0x6bf6, 0x6da8, 0x6dcd, 0x6dd5, 0x6de3, 0x6def, 0x6df9, - 0x6e24, 0x6e4c, 0xbf12, 0xbf19, 0xbf1c, 0xbf1d, 0xbf1e, 0xbf22, - 0xbf24, 0xbf26, 0xbf2a, 0xbf2d, 0xbf32, 0xbf37, 0xbf38, 0xbf39, - 0xbf4f, 0xbf54, 0xbf59, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf62, 0xbf63, - 0xbf64, 0xbf65, 0xbf78, 0xbf79, 0xbf7f, 0xbf81, 0xbf82, 0xbf85, - 0xbf88, 0xbf89, 0xbf8a, 0xbf8c, 0xbfa4, 0xbfa6, 0xbfd5, 0xbfd6, - 0xbfd8, 0xbfda, 0xbff1, 0xbff8, 0xbffb, 0xc004, 0xc02d, 0xc035, - 0xc06c, 0xc0fc, 0xc151, 0xc152, 0xc153, 0xc154, 0xc155, 0xc198, - 0xc1a4, 0xc1fe, 0xc215, 0xc46b, 0xc6d3, 0xc7b3, 0xce19, 0xce1a, - 0xce1d, 0xce22, 0xce23 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 96, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 12289, .range_length = 72, .glyph_id_start = 97, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 12, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - }, - { - .range_start = 12362, .range_length = 24, .glyph_id_start = 109, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 12387, .range_length = 43, .glyph_id_start = 133, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 12431, .range_length = 95, .glyph_id_start = 176, - .unicode_list = NULL, .glyph_id_ofs_list = glyph_id_ofs_list_4, .list_length = 95, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL - }, - { - .range_start = 12527, .range_length = 52772, .glyph_id_start = 248, - .unicode_list = unicode_list_5, .glyph_id_ofs_list = NULL, .list_length = 1187, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = NULL, - .kern_scale = 0, - .cmap_num = 6, - .bpp = 4, - .kern_classes = 0, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_simsun_16_cjk = { -#else -lv_font_t lv_font_simsun_16_cjk = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 19, /*The maximum line height required by the font*/ - .base_line = 3, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -2, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_SIMSUN_16_CJK*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_unscii_16.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_unscii_16.c deleted file mode 100644 index b95d51a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_unscii_16.c +++ /dev/null @@ -1,641 +0,0 @@ -/******************************************************************************* - * Size: 16 px - * Bpp: 1 - * Opts: --no-compress --no-prefilter --bpp 1 --size 16 --font unscii-8.ttf -r 0x20-0x7F --format lvgl -o lv_font_unscii_16.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_UNSCII_16 - #define LV_FONT_UNSCII_16 1 -#endif - -#if LV_FONT_UNSCII_16 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - 0x0, - - /* U+0021 "!" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - - /* U+0022 "\"" */ - 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, - - /* U+0023 "#" */ - 0x3c, 0xf0, 0xf3, 0xc3, 0xcf, 0xf, 0x3c, 0xff, - 0xff, 0xff, 0xf3, 0xcf, 0xf, 0x3c, 0xff, 0xff, - 0xff, 0xf3, 0xcf, 0xf, 0x3c, 0x3c, 0xf0, 0xf3, - 0xc0, - - /* U+0024 "$" */ - 0xf, 0x0, 0xf0, 0x3f, 0xf3, 0xff, 0xf0, 0xf, - 0x0, 0x3f, 0xc3, 0xfc, 0x0, 0xf0, 0xf, 0xff, - 0xcf, 0xfc, 0xf, 0x0, 0xf0, - - /* U+0025 "%" */ - 0xf0, 0x3f, 0xc0, 0xff, 0xf, 0x3c, 0x3c, 0x3, - 0xc0, 0xf, 0x0, 0xf0, 0x3, 0xc0, 0x3c, 0x3c, - 0xf0, 0xff, 0x3, 0xfc, 0xf, - - /* U+0026 "&" */ - 0xf, 0xc0, 0x3f, 0x3, 0xcf, 0xf, 0x3c, 0xf, - 0xc0, 0x3f, 0x3, 0xf3, 0xcf, 0xcf, 0xf3, 0xf3, - 0xcf, 0xcf, 0xf, 0x3c, 0x3c, 0x3f, 0x3c, 0xfc, - 0xf0, - - /* U+0027 "'" */ - 0x3c, 0xf3, 0xcf, 0xf3, 0xc0, - - /* U+0028 "(" */ - 0xf, 0xf, 0x3c, 0x3c, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, - - /* U+0029 ")" */ - 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, 0xf, 0xf, - 0xf, 0xf, 0x3c, 0x3c, 0xf0, 0xf0, - - /* U+002A "*" */ - 0x3c, 0x3c, 0x3c, 0x3c, 0xf, 0xf0, 0xf, 0xf0, - 0xff, 0xff, 0xff, 0xff, 0xf, 0xf0, 0xf, 0xf0, - 0x3c, 0x3c, 0x3c, 0x3c, - - /* U+002B "+" */ - 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xff, 0xff, - 0xff, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, - - /* U+002C "," */ - 0x3c, 0xf3, 0xcf, 0xf3, 0xc0, - - /* U+002D "-" */ - 0xff, 0xff, 0xff, - - /* U+002E "." */ - 0xff, 0xff, - - /* U+002F "/" */ - 0x0, 0xf, 0x0, 0xf, 0x0, 0x3c, 0x0, 0x3c, - 0x0, 0xf0, 0x0, 0xf0, 0x3, 0xc0, 0x3, 0xc0, - 0xf, 0x0, 0xf, 0x0, 0x3c, 0x0, 0x3c, 0x0, - 0xf0, 0x0, 0xf0, 0x0, - - /* U+0030 "0" */ - 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf3, 0xff, - 0x3f, 0xfc, 0xff, 0xcf, 0xf0, 0xff, 0xf, 0xf0, - 0xff, 0xf, 0x3f, 0xc3, 0xfc, - - /* U+0031 "1" */ - 0xf, 0x0, 0xf0, 0x3f, 0x3, 0xf0, 0xf, 0x0, - 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, - 0x0, 0xf0, 0xff, 0xff, 0xff, - - /* U+0032 "2" */ - 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0x3, 0xc0, - 0x3c, 0xf, 0x0, 0xf0, 0x3c, 0x3, 0xc0, 0xf0, - 0xf, 0x0, 0xff, 0xff, 0xff, - - /* U+0033 "3" */ - 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0x0, 0xf0, - 0xf, 0xf, 0xc0, 0xfc, 0x0, 0xf0, 0xf, 0xf0, - 0xff, 0xf, 0x3f, 0xc3, 0xfc, - - /* U+0034 "4" */ - 0x3, 0xf0, 0xf, 0xc0, 0xff, 0x3, 0xfc, 0x3c, - 0xf0, 0xf3, 0xcf, 0xf, 0x3c, 0x3c, 0xff, 0xff, - 0xff, 0xf0, 0xf, 0x0, 0x3c, 0x0, 0xf0, 0x3, - 0xc0, - - /* U+0035 "5" */ - 0xff, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xff, 0xcf, - 0xfc, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0xf0, - 0xff, 0xf, 0x3f, 0xc3, 0xfc, - - /* U+0036 "6" */ - 0xf, 0xc0, 0xfc, 0x3c, 0x3, 0xc0, 0xf0, 0xf, - 0x0, 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, - 0xff, 0xf, 0x3f, 0xc3, 0xfc, - - /* U+0037 "7" */ - 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, - 0xf, 0x3, 0xc0, 0x3c, 0xf, 0x0, 0xf0, 0xf, - 0x0, 0xf0, 0xf, 0x0, 0xf0, - - /* U+0038 "8" */ - 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, - 0xff, 0xf, 0x3f, 0xc3, 0xfc, - - /* U+0039 "9" */ - 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0x3, - 0xc0, 0x3c, 0x3f, 0x3, 0xf0, - - /* U+003A ":" */ - 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, - - /* U+003B ";" */ - 0x3c, 0xf3, 0xcf, 0x0, 0x0, 0x0, 0x3c, 0xf3, - 0xcf, 0xf3, 0xc0, - - /* U+003C "<" */ - 0x3, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, - 0x3, 0xc0, 0x3c, 0xf, 0x0, 0xf0, 0x3c, 0x3, - 0xc0, 0xf0, - - /* U+003D "=" */ - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, - - /* U+003E ">" */ - 0xf0, 0x3c, 0x3, 0xc0, 0xf0, 0xf, 0x3, 0xc0, - 0x3c, 0xf, 0xf, 0x3, 0xc3, 0xc0, 0xf0, 0xf0, - 0x3c, 0x0, - - /* U+003F "?" */ - 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0x0, 0xf0, - 0xf, 0x3, 0xc0, 0x3c, 0xf, 0x0, 0xf0, 0x0, - 0x0, 0x0, 0xf, 0x0, 0xf0, - - /* U+0040 "@" */ - 0x3f, 0xf0, 0xff, 0xcf, 0x3, 0xfc, 0xf, 0xf3, - 0xff, 0xcf, 0xff, 0x3f, 0xfc, 0xff, 0xf3, 0xff, - 0xcf, 0xff, 0x0, 0x3c, 0x0, 0x3f, 0xf0, 0xff, - 0xc0, - - /* U+0041 "A" */ - 0xf, 0x0, 0xf0, 0x3f, 0xc3, 0xfc, 0xf0, 0xff, - 0xf, 0xf0, 0xff, 0xf, 0xff, 0xff, 0xff, 0xf0, - 0xff, 0xf, 0xf0, 0xff, 0xf, - - /* U+0042 "B" */ - 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, - 0xff, 0xf, 0xff, 0xcf, 0xfc, - - /* U+0043 "C" */ - 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, - 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, - 0xff, 0xf, 0x3f, 0xc3, 0xfc, - - /* U+0044 "D" */ - 0xff, 0xf, 0xf0, 0xf3, 0xcf, 0x3c, 0xf0, 0xff, - 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf3, - 0xcf, 0x3c, 0xff, 0xf, 0xf0, - - /* U+0045 "E" */ - 0xff, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xf0, 0xf, - 0x0, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, - 0xf, 0x0, 0xff, 0xff, 0xff, - - /* U+0046 "F" */ - 0xff, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xf0, 0xf, - 0x0, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, - 0xf, 0x0, 0xf0, 0xf, 0x0, - - /* U+0047 "G" */ - 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, - 0x0, 0xf3, 0xff, 0x3f, 0xf0, 0xff, 0xf, 0xf0, - 0xff, 0xf, 0x3f, 0xf3, 0xff, - - /* U+0048 "H" */ - 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xf, 0xf0, - 0xff, 0xf, 0xf0, 0xff, 0xf, - - /* U+0049 "I" */ - 0xff, 0xff, 0xff, 0xf, 0x0, 0xf0, 0xf, 0x0, - 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, - 0x0, 0xf0, 0xff, 0xff, 0xff, - - /* U+004A "J" */ - 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, - 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0xf0, - 0xff, 0xf, 0x3f, 0xc3, 0xfc, - - /* U+004B "K" */ - 0xf0, 0x3f, 0xc0, 0xff, 0xf, 0x3c, 0x3c, 0xf3, - 0xc3, 0xcf, 0xf, 0xf0, 0x3f, 0xc0, 0xf3, 0xc3, - 0xcf, 0xf, 0xf, 0x3c, 0x3c, 0xf0, 0x3f, 0xc0, - 0xf0, - - /* U+004C "L" */ - 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, - 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, - 0xf, 0x0, 0xff, 0xff, 0xff, - - /* U+004D "M" */ - 0xf0, 0x3f, 0xc0, 0xff, 0xcf, 0xff, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0x33, 0xfc, 0xcf, 0xf0, 0x3f, - 0xc0, 0xff, 0x3, 0xfc, 0xf, 0xf0, 0x3f, 0xc0, - 0xf0, - - /* U+004E "N" */ - 0xf0, 0x3f, 0xc0, 0xff, 0xc3, 0xff, 0xf, 0xff, - 0x3f, 0xfc, 0xff, 0x3f, 0xfc, 0xff, 0xf0, 0xff, - 0xc3, 0xff, 0x3, 0xfc, 0xf, 0xf0, 0x3f, 0xc0, - 0xf0, - - /* U+004F "O" */ - 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, - 0xff, 0xf, 0x3f, 0xc3, 0xfc, - - /* U+0050 "P" */ - 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, - 0xf, 0x0, 0xf0, 0xf, 0x0, - - /* U+0051 "Q" */ - 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf3, - 0xcf, 0x3c, 0x3c, 0xf3, 0xcf, - - /* U+0052 "R" */ - 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0xff, 0xcf, 0xfc, 0xf3, 0xcf, 0x3c, 0xf0, - 0xff, 0xf, 0xf0, 0xff, 0xf, - - /* U+0053 "S" */ - 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, - 0x0, 0x3f, 0xc3, 0xfc, 0x0, 0xf0, 0xf, 0xf0, - 0xff, 0xf, 0x3f, 0xc3, 0xfc, - - /* U+0054 "T" */ - 0xff, 0xff, 0xff, 0xf, 0x0, 0xf0, 0xf, 0x0, - 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, - 0x0, 0xf0, 0xf, 0x0, 0xf0, - - /* U+0055 "U" */ - 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, - 0xff, 0xf, 0x3f, 0xc3, 0xfc, - - /* U+0056 "V" */ - 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0x3f, - 0xc3, 0xfc, 0xf, 0x0, 0xf0, - - /* U+0057 "W" */ - 0xf0, 0x3f, 0xc0, 0xff, 0x3, 0xfc, 0xf, 0xf0, - 0x3f, 0xc0, 0xff, 0x33, 0xfc, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0x3f, 0xf0, 0x3f, 0xc0, - 0xf0, - - /* U+0058 "X" */ - 0xf0, 0xf, 0xf0, 0xf, 0x3c, 0x3c, 0x3c, 0x3c, - 0xf, 0xf0, 0xf, 0xf0, 0x3, 0xc0, 0x3, 0xc0, - 0xf, 0xf0, 0xf, 0xf0, 0x3c, 0x3c, 0x3c, 0x3c, - 0xf0, 0xf, 0xf0, 0xf, - - /* U+0059 "Y" */ - 0xf0, 0xf, 0xf0, 0xf, 0x3c, 0x3c, 0x3c, 0x3c, - 0xf, 0xf0, 0xf, 0xf0, 0x3, 0xc0, 0x3, 0xc0, - 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, - 0x3, 0xc0, 0x3, 0xc0, - - /* U+005A "Z" */ - 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x3, 0xc0, - 0x3c, 0xf, 0x0, 0xf0, 0x3c, 0x3, 0xc0, 0xf0, - 0xf, 0x0, 0xff, 0xff, 0xff, - - /* U+005B "[" */ - 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, - - /* U+005C "\\" */ - 0xf0, 0x0, 0xf0, 0x0, 0x3c, 0x0, 0x3c, 0x0, - 0xf, 0x0, 0xf, 0x0, 0x3, 0xc0, 0x3, 0xc0, - 0x0, 0xf0, 0x0, 0xf0, 0x0, 0x3c, 0x0, 0x3c, - 0x0, 0xf, 0x0, 0xf, - - /* U+005D "]" */ - 0xff, 0xff, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, - 0xf, 0xf, 0xf, 0xf, 0xff, 0xff, - - /* U+005E "^" */ - 0x3, 0x0, 0xc, 0x0, 0xfc, 0x3, 0xf0, 0x3c, - 0xf0, 0xf3, 0xcf, 0x3, 0xfc, 0xf, - - /* U+005F "_" */ - 0xff, 0xff, 0xff, 0xff, - - /* U+0060 "`" */ - 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, - - /* U+0061 "a" */ - 0x3f, 0xc3, 0xfc, 0x0, 0xf0, 0xf, 0x3f, 0xf3, - 0xff, 0xf0, 0xff, 0xf, 0x3f, 0xf3, 0xff, - - /* U+0062 "b" */ - 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xff, 0xcf, - 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, - 0xff, 0xf, 0xff, 0xcf, 0xfc, - - /* U+0063 "c" */ - 0x3f, 0xcf, 0xff, 0x3, 0xc0, 0xf0, 0x3c, 0xf, - 0x3, 0xc0, 0x3f, 0xcf, 0xf0, - - /* U+0064 "d" */ - 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x3f, 0xf3, - 0xff, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, - 0xff, 0xf, 0x3f, 0xf3, 0xff, - - /* U+0065 "e" */ - 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xff, 0xff, - 0xff, 0xf0, 0xf, 0x0, 0x3f, 0xc3, 0xfc, - - /* U+0066 "f" */ - 0xf, 0xc3, 0xf3, 0xc0, 0xf0, 0xff, 0xff, 0xf3, - 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3c, - 0xf, 0x0, - - /* U+0067 "g" */ - 0x3f, 0xf3, 0xff, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0xff, - 0xcf, 0xfc, - - /* U+0068 "h" */ - 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xff, 0xcf, - 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, - 0xff, 0xf, 0xf0, 0xff, 0xf, - - /* U+0069 "i" */ - 0x3c, 0xf, 0x0, 0x0, 0x0, 0xfc, 0x3f, 0x3, - 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3f, - 0xcf, 0xf0, - - /* U+006A "j" */ - 0x3, 0xc0, 0xf0, 0x0, 0x0, 0x3, 0xc0, 0xf0, - 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3c, 0xf, 0x3, - 0xc0, 0xff, 0xf3, 0xfc, - - /* U+006B "k" */ - 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xff, - 0xf, 0xf3, 0xcf, 0x3c, 0xff, 0xf, 0xf0, 0xf3, - 0xcf, 0x3c, 0xf0, 0xff, 0xf, - - /* U+006C "l" */ - 0xfc, 0x3f, 0x3, 0xc0, 0xf0, 0x3c, 0xf, 0x3, - 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3f, - 0xcf, 0xf0, - - /* U+006D "m" */ - 0xf0, 0xf3, 0xc3, 0xcf, 0xff, 0xff, 0xff, 0xf3, - 0x3f, 0xcc, 0xff, 0x33, 0xfc, 0xcf, 0xf0, 0x3f, - 0xc0, 0xf0, - - /* U+006E "n" */ - 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, - - /* U+006F "o" */ - 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0xf0, 0xff, 0xf, 0x3f, 0xc3, 0xfc, - - /* U+0070 "p" */ - 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, - 0xf, 0x0, - - /* U+0071 "q" */ - 0x3f, 0xf3, 0xff, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0x0, - 0xf0, 0xf, - - /* U+0072 "r" */ - 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, - 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, - - /* U+0073 "s" */ - 0x3f, 0xf3, 0xff, 0xf0, 0xf, 0x0, 0x3f, 0xc3, - 0xfc, 0x0, 0xf0, 0xf, 0xff, 0xcf, 0xfc, - - /* U+0074 "t" */ - 0x3c, 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0xff, 0xff, - 0xff, 0x3c, 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0x3c, - 0x3, 0xc0, 0xf, 0xf0, 0xff, - - /* U+0075 "u" */ - 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0xf0, 0xff, 0xf, 0x3f, 0xf3, 0xff, - - /* U+0076 "v" */ - 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0x3f, 0xc3, 0xfc, 0xf, 0x0, 0xf0, - - /* U+0077 "w" */ - 0xf0, 0x3f, 0xc0, 0xff, 0x3, 0xfc, 0xf, 0xf3, - 0x3f, 0xcc, 0xf3, 0xff, 0xf, 0xfc, 0x3c, 0xf0, - 0xf3, 0xc0, - - /* U+0078 "x" */ - 0xf0, 0x3f, 0xc0, 0xf3, 0xcf, 0xf, 0x3c, 0xf, - 0xc0, 0x3f, 0x3, 0xcf, 0xf, 0x3c, 0xf0, 0x3f, - 0xc0, 0xf0, - - /* U+0079 "y" */ - 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, - 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0x3f, - 0xc3, 0xfc, - - /* U+007A "z" */ - 0xff, 0xff, 0xff, 0x3, 0xc0, 0x3c, 0xf, 0x0, - 0xf0, 0x3c, 0x3, 0xc0, 0xff, 0xff, 0xff, - - /* U+007B "{" */ - 0x3, 0xf0, 0x3f, 0xf, 0x0, 0xf0, 0xf, 0x0, - 0xf0, 0xfc, 0xf, 0xc0, 0xf, 0x0, 0xf0, 0xf, - 0x0, 0xf0, 0x3, 0xf0, 0x3f, - - /* U+007C "|" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - - /* U+007D "}" */ - 0xfc, 0xf, 0xc0, 0xf, 0x0, 0xf0, 0xf, 0x0, - 0xf0, 0x3, 0xf0, 0x3f, 0xf, 0x0, 0xf0, 0xf, - 0x0, 0xf0, 0xfc, 0xf, 0xc0, - - /* U+007E "~" */ - 0x3f, 0x3c, 0xfc, 0xff, 0x3f, 0x3c, 0xfc, - - /* U+007F "" */ - 0xf0, 0x3, 0xc0, 0xc, 0xc0, 0x33, 0x0, 0xcc, - 0xff, 0x33, 0xfc, 0xc3, 0x33, 0xc, 0xf0, 0x33, - 0xc0, 0xc0, 0x3, 0x0, 0xc, 0x0, 0x30, 0x0, - 0xc0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 256, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 16}, - {.bitmap_index = 1, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 6, .ofs_y = 2}, - {.bitmap_index = 8, .adv_w = 256, .box_w = 12, .box_h = 6, .ofs_x = 2, .ofs_y = 10}, - {.bitmap_index = 17, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 42, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 63, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 84, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 109, .adv_w = 256, .box_w = 6, .box_h = 6, .ofs_x = 4, .ofs_y = 10}, - {.bitmap_index = 114, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, - {.bitmap_index = 128, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, - {.bitmap_index = 142, .adv_w = 256, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 162, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 177, .adv_w = 256, .box_w = 6, .box_h = 6, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 182, .adv_w = 256, .box_w = 12, .box_h = 2, .ofs_x = 2, .ofs_y = 8}, - {.bitmap_index = 185, .adv_w = 256, .box_w = 4, .box_h = 4, .ofs_x = 6, .ofs_y = 2}, - {.bitmap_index = 187, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 215, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 236, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 257, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 278, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 299, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 324, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 345, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 366, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 387, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 408, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 429, .adv_w = 256, .box_w = 4, .box_h = 12, .ofs_x = 6, .ofs_y = 2}, - {.bitmap_index = 435, .adv_w = 256, .box_w = 6, .box_h = 14, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 446, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 464, .adv_w = 256, .box_w = 12, .box_h = 6, .ofs_x = 2, .ofs_y = 6}, - {.bitmap_index = 473, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 491, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 512, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 537, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 558, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 579, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 600, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 621, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 642, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 663, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 684, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 705, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 726, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 747, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 772, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 793, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 818, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 843, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 864, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 885, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 906, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 927, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 948, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 969, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 990, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1011, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 1036, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 1064, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 1092, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1113, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, - {.bitmap_index = 1127, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 1155, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, - {.bitmap_index = 1169, .adv_w = 256, .box_w = 14, .box_h = 8, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 1183, .adv_w = 256, .box_w = 16, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1187, .adv_w = 256, .box_w = 8, .box_h = 6, .ofs_x = 6, .ofs_y = 10}, - {.bitmap_index = 1193, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1208, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1229, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1242, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1263, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1278, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1296, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1314, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1335, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, - {.bitmap_index = 1353, .adv_w = 256, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1373, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1394, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, - {.bitmap_index = 1412, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 1430, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1445, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1460, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1478, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1496, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1511, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1526, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1547, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1562, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1577, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 1595, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 1613, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1631, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1646, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1667, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 6, .ofs_y = 2}, - {.bitmap_index = 1674, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 1695, .adv_w = 256, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 12}, - {.bitmap_index = 1702, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 96, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - } -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = NULL, - .kern_scale = 0, - .cmap_num = 1, - .bpp = 1, - .kern_classes = 0, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_unscii_16 = { -#else -lv_font_t lv_font_unscii_16 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 17, /*The maximum line height required by the font*/ - .base_line = 0, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = 0, - .underline_thickness = 0, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_UNSCII_16*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_unscii_8.c b/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_unscii_8.c deleted file mode 100644 index 26b92fb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_font_unscii_8.c +++ /dev/null @@ -1,477 +0,0 @@ -/******************************************************************************* - * Size: 8 px - * Bpp: 1 - * Opts: --no-compress --no-prefilter --bpp 1 --size 8 --font unscii-8.ttf -r 0x20-0x7F --format lvgl -o lv_font_unscii_8.c --force-fast-kern-format - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE - #include "lvgl.h" -#else - #include "../../lvgl.h" -#endif - -#ifndef LV_FONT_UNSCII_8 - #define LV_FONT_UNSCII_8 1 -#endif - -#if LV_FONT_UNSCII_8 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - 0x0, - - /* U+0021 "!" */ - 0xff, 0xcc, - - /* U+0022 "\"" */ - 0xcf, 0x3c, 0xc0, - - /* U+0023 "#" */ - 0x6c, 0xdb, 0xfb, 0x6f, 0xed, 0x9b, 0x0, - - /* U+0024 "$" */ - 0x31, 0xfc, 0x1e, 0xf, 0xe3, 0x0, - - /* U+0025 "%" */ - 0xc7, 0x98, 0x61, 0x86, 0x78, 0xc0, - - /* U+0026 "&" */ - 0x38, 0xd8, 0xe3, 0xbd, 0xd9, 0x9d, 0x80, - - /* U+0027 "'" */ - 0x6f, 0x0, - - /* U+0028 "(" */ - 0x36, 0xcc, 0xc6, 0x30, - - /* U+0029 ")" */ - 0xc6, 0x33, 0x36, 0xc0, - - /* U+002A "*" */ - 0x66, 0x3c, 0xff, 0x3c, 0x66, - - /* U+002B "+" */ - 0x30, 0xcf, 0xcc, 0x30, - - /* U+002C "," */ - 0x6f, 0x0, - - /* U+002D "-" */ - 0xfc, - - /* U+002E "." */ - 0xf0, - - /* U+002F "/" */ - 0x3, 0x6, 0xc, 0x18, 0x30, 0x60, 0xc0, - - /* U+0030 "0" */ - 0x7b, 0x3d, 0xfb, 0xcf, 0x37, 0x80, - - /* U+0031 "1" */ - 0x31, 0xc3, 0xc, 0x30, 0xcf, 0xc0, - - /* U+0032 "2" */ - 0x7b, 0x31, 0x8c, 0x63, 0xf, 0xc0, - - /* U+0033 "3" */ - 0x7b, 0x30, 0xce, 0xf, 0x37, 0x80, - - /* U+0034 "4" */ - 0x1c, 0x79, 0xb6, 0x6f, 0xe1, 0x83, 0x0, - - /* U+0035 "5" */ - 0xff, 0xf, 0x83, 0xf, 0x37, 0x80, - - /* U+0036 "6" */ - 0x39, 0x8c, 0x3e, 0xcf, 0x37, 0x80, - - /* U+0037 "7" */ - 0xfc, 0x30, 0xc6, 0x30, 0xc3, 0x0, - - /* U+0038 "8" */ - 0x7b, 0x3c, 0xde, 0xcf, 0x37, 0x80, - - /* U+0039 "9" */ - 0x7b, 0x3c, 0xdf, 0xc, 0x67, 0x0, - - /* U+003A ":" */ - 0xf0, 0xf0, - - /* U+003B ";" */ - 0x6c, 0x6, 0xf0, - - /* U+003C "<" */ - 0x19, 0x99, 0x86, 0x18, 0x60, - - /* U+003D "=" */ - 0xfc, 0xf, 0xc0, - - /* U+003E ">" */ - 0xc3, 0xc, 0x33, 0x33, 0x0, - - /* U+003F "?" */ - 0x7b, 0x30, 0xc6, 0x30, 0x3, 0x0, - - /* U+0040 "@" */ - 0x7d, 0x8f, 0x7e, 0xfd, 0xf8, 0x1f, 0x0, - - /* U+0041 "A" */ - 0x31, 0xec, 0xf3, 0xff, 0x3c, 0xc0, - - /* U+0042 "B" */ - 0xfb, 0x3c, 0xfe, 0xcf, 0x3f, 0x80, - - /* U+0043 "C" */ - 0x7b, 0x3c, 0x30, 0xc3, 0x37, 0x80, - - /* U+0044 "D" */ - 0xf3, 0x6c, 0xf3, 0xcf, 0x6f, 0x0, - - /* U+0045 "E" */ - 0xff, 0xc, 0x3e, 0xc3, 0xf, 0xc0, - - /* U+0046 "F" */ - 0xff, 0xc, 0x3e, 0xc3, 0xc, 0x0, - - /* U+0047 "G" */ - 0x7b, 0x3c, 0x37, 0xcf, 0x37, 0xc0, - - /* U+0048 "H" */ - 0xcf, 0x3c, 0xff, 0xcf, 0x3c, 0xc0, - - /* U+0049 "I" */ - 0xfc, 0xc3, 0xc, 0x30, 0xcf, 0xc0, - - /* U+004A "J" */ - 0xc, 0x30, 0xc3, 0xf, 0x37, 0x80, - - /* U+004B "K" */ - 0xc7, 0x9b, 0x67, 0x8d, 0x99, 0xb1, 0x80, - - /* U+004C "L" */ - 0xc3, 0xc, 0x30, 0xc3, 0xf, 0xc0, - - /* U+004D "M" */ - 0xc7, 0xdf, 0xfe, 0xbc, 0x78, 0xf1, 0x80, - - /* U+004E "N" */ - 0xc7, 0xcf, 0xde, 0xfc, 0xf8, 0xf1, 0x80, - - /* U+004F "O" */ - 0x7b, 0x3c, 0xf3, 0xcf, 0x37, 0x80, - - /* U+0050 "P" */ - 0xfb, 0x3c, 0xfe, 0xc3, 0xc, 0x0, - - /* U+0051 "Q" */ - 0x7b, 0x3c, 0xf3, 0xcf, 0x66, 0xc0, - - /* U+0052 "R" */ - 0xfb, 0x3c, 0xfe, 0xdb, 0x3c, 0xc0, - - /* U+0053 "S" */ - 0x7b, 0x3c, 0x1e, 0xf, 0x37, 0x80, - - /* U+0054 "T" */ - 0xfc, 0xc3, 0xc, 0x30, 0xc3, 0x0, - - /* U+0055 "U" */ - 0xcf, 0x3c, 0xf3, 0xcf, 0x37, 0x80, - - /* U+0056 "V" */ - 0xcf, 0x3c, 0xf3, 0xcd, 0xe3, 0x0, - - /* U+0057 "W" */ - 0xc7, 0x8f, 0x1e, 0xbf, 0xfd, 0xf1, 0x80, - - /* U+0058 "X" */ - 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, - - /* U+0059 "Y" */ - 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, - - /* U+005A "Z" */ - 0xfc, 0x31, 0x8c, 0x63, 0xf, 0xc0, - - /* U+005B "[" */ - 0xfc, 0xcc, 0xcc, 0xf0, - - /* U+005C "\\" */ - 0xc0, 0x60, 0x30, 0x18, 0xc, 0x6, 0x3, - - /* U+005D "]" */ - 0xf3, 0x33, 0x33, 0xf0, - - /* U+005E "^" */ - 0x10, 0x71, 0xb6, 0x30, - - /* U+005F "_" */ - 0xff, - - /* U+0060 "`" */ - 0xc6, 0x30, - - /* U+0061 "a" */ - 0x78, 0x37, 0xf3, 0x7c, - - /* U+0062 "b" */ - 0xc3, 0xf, 0xb3, 0xcf, 0x3f, 0x80, - - /* U+0063 "c" */ - 0x7e, 0x31, 0x87, 0x80, - - /* U+0064 "d" */ - 0xc, 0x37, 0xf3, 0xcf, 0x37, 0xc0, - - /* U+0065 "e" */ - 0x7b, 0x3f, 0xf0, 0x78, - - /* U+0066 "f" */ - 0x3b, 0x3e, 0xc6, 0x31, 0x80, - - /* U+0067 "g" */ - 0x7f, 0x3c, 0xdf, 0xf, 0xe0, - - /* U+0068 "h" */ - 0xc3, 0xf, 0xb3, 0xcf, 0x3c, 0xc0, - - /* U+0069 "i" */ - 0x60, 0x38, 0xc6, 0x31, 0xe0, - - /* U+006A "j" */ - 0x18, 0x6, 0x31, 0x8c, 0x7e, - - /* U+006B "k" */ - 0xc3, 0xc, 0xf6, 0xf3, 0x6c, 0xc0, - - /* U+006C "l" */ - 0xe3, 0x18, 0xc6, 0x31, 0xe0, - - /* U+006D "m" */ - 0xcd, 0xff, 0x5e, 0xbc, 0x60, - - /* U+006E "n" */ - 0xfb, 0x3c, 0xf3, 0xcc, - - /* U+006F "o" */ - 0x7b, 0x3c, 0xf3, 0x78, - - /* U+0070 "p" */ - 0xfb, 0x3c, 0xfe, 0xc3, 0x0, - - /* U+0071 "q" */ - 0x7f, 0x3c, 0xdf, 0xc, 0x30, - - /* U+0072 "r" */ - 0xfb, 0x3c, 0x30, 0xc0, - - /* U+0073 "s" */ - 0x7f, 0x7, 0x83, 0xf8, - - /* U+0074 "t" */ - 0x61, 0x8f, 0xd8, 0x61, 0x83, 0xc0, - - /* U+0075 "u" */ - 0xcf, 0x3c, 0xf3, 0x7c, - - /* U+0076 "v" */ - 0xcf, 0x3c, 0xde, 0x30, - - /* U+0077 "w" */ - 0xc7, 0x8f, 0x5b, 0xe6, 0xc0, - - /* U+0078 "x" */ - 0xc6, 0xd8, 0xe3, 0x6c, 0x60, - - /* U+0079 "y" */ - 0xcf, 0x3c, 0xdf, 0xd, 0xe0, - - /* U+007A "z" */ - 0xfc, 0x63, 0x18, 0xfc, - - /* U+007B "{" */ - 0x1c, 0xc3, 0x38, 0x30, 0xc1, 0xc0, - - /* U+007C "|" */ - 0xff, 0xfc, - - /* U+007D "}" */ - 0xe0, 0xc3, 0x7, 0x30, 0xce, 0x0, - - /* U+007E "~" */ - 0x77, 0xb8, - - /* U+007F "" */ - 0xc1, 0x42, 0xbd, 0x2c, 0x40, 0x81, 0x0 -}; - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 128, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 1, .adv_w = 128, .box_w = 2, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 3, .adv_w = 128, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 6, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 13, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 19, .adv_w = 128, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 25, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 32, .adv_w = 128, .box_w = 3, .box_h = 3, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 34, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 38, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 42, .adv_w = 128, .box_w = 8, .box_h = 5, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 47, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 51, .adv_w = 128, .box_w = 3, .box_h = 3, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 53, .adv_w = 128, .box_w = 6, .box_h = 1, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 54, .adv_w = 128, .box_w = 2, .box_h = 2, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 55, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 62, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 68, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 74, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 80, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 86, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 93, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 99, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 105, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 111, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 117, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 123, .adv_w = 128, .box_w = 2, .box_h = 6, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 125, .adv_w = 128, .box_w = 3, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 128, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 133, .adv_w = 128, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 136, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 141, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 147, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 154, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 160, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 166, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 172, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 178, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 184, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 190, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 196, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 202, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 208, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 214, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 221, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 227, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 234, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 241, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 247, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 253, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 259, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 265, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 271, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 277, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 283, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 289, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 296, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 303, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 310, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 316, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 320, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 327, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 331, .adv_w = 128, .box_w = 7, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 335, .adv_w = 128, .box_w = 8, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 336, .adv_w = 128, .box_w = 4, .box_h = 3, .ofs_x = 3, .ofs_y = 5}, - {.bitmap_index = 338, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 342, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 348, .adv_w = 128, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 352, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 358, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 362, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 367, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 372, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 378, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 383, .adv_w = 128, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 388, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 394, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 399, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 404, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 408, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 412, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 417, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 422, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 426, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 430, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 436, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 440, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 444, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 449, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 454, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 459, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 463, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 469, .adv_w = 128, .box_w = 2, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 471, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 477, .adv_w = 128, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 479, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = { - { - .range_start = 32, .range_length = 96, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - } -}; - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR >= 8 -/*Store all the custom data of the font*/ - -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = NULL, - .kern_scale = 0, - .cmap_num = 1, - .bpp = 1, - .kern_classes = 0, - .bitmap_format = 0, - -}; - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t lv_font_unscii_8 = { -#else -lv_font_t lv_font_unscii_8 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 9, /*The maximum line height required by the font*/ - .base_line = 0, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = 0, - .underline_thickness = 0, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - -#endif /*#if LV_FONT_UNSCII_8*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/font/lv_symbol_def.h b/software/Power_Pico/Middlewares/LVGL/src/font/lv_symbol_def.h deleted file mode 100644 index d78f389..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/font/lv_symbol_def.h +++ /dev/null @@ -1,357 +0,0 @@ -/** - * @file lv_symbol_def.h - * - */ - -#ifndef LV_SYMBOL_DEF_H -#define LV_SYMBOL_DEF_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../lv_conf_internal.h" - -/*------------------------------- - * Symbols from "normal" font - *-----------------------------*/ -#if !defined LV_SYMBOL_BULLET -#define LV_SYMBOL_BULLET "\xE2\x80\xA2" /*20042, 0x2022*/ -#endif - -/*------------------------------- - * Symbols from FontAwesome font - *-----------------------------*/ - -/*In the font converter use this list as range: - 61441, 61448, 61451, 61452, 61453, 61457, 61459, 61461, 61465, 61468, - 61473, 61478, 61479, 61480, 61502, 61507, 61512, 61515, 61516, 61517, - 61521, 61522, 61523, 61524, 61543, 61544, 61550, 61552, 61553, 61556, - 61559, 61560, 61561, 61563, 61587, 61589, 61636, 61637, 61639, 61641, - 61664, 61671, 61674, 61683, 61724, 61732, 61787, 61931, 62016, 62017, - 62018, 62019, 62020, 62087, 62099, 62189, 62212, 62810, 63426, 63650 -*/ - -/* These symbols can be predefined in the lv_conf.h file. - * If they are not predefined, they will use the following values - */ - -#if !defined LV_SYMBOL_AUDIO -#define LV_SYMBOL_AUDIO "\xEF\x80\x81" /*61441, 0xF001*/ -#endif - -#if !defined LV_SYMBOL_VIDEO -#define LV_SYMBOL_VIDEO "\xEF\x80\x88" /*61448, 0xF008*/ -#endif - -#if !defined LV_SYMBOL_LIST -#define LV_SYMBOL_LIST "\xEF\x80\x8B" /*61451, 0xF00B*/ -#endif - -#if !defined LV_SYMBOL_OK -#define LV_SYMBOL_OK "\xEF\x80\x8C" /*61452, 0xF00C*/ -#endif - -#if !defined LV_SYMBOL_CLOSE -#define LV_SYMBOL_CLOSE "\xEF\x80\x8D" /*61453, 0xF00D*/ -#endif - -#if !defined LV_SYMBOL_POWER -#define LV_SYMBOL_POWER "\xEF\x80\x91" /*61457, 0xF011*/ -#endif - -#if !defined LV_SYMBOL_SETTINGS -#define LV_SYMBOL_SETTINGS "\xEF\x80\x93" /*61459, 0xF013*/ -#endif - -#if !defined LV_SYMBOL_HOME -#define LV_SYMBOL_HOME "\xEF\x80\x95" /*61461, 0xF015*/ -#endif - -#if !defined LV_SYMBOL_DOWNLOAD -#define LV_SYMBOL_DOWNLOAD "\xEF\x80\x99" /*61465, 0xF019*/ -#endif - -#if !defined LV_SYMBOL_DRIVE -#define LV_SYMBOL_DRIVE "\xEF\x80\x9C" /*61468, 0xF01C*/ -#endif - -#if !defined LV_SYMBOL_REFRESH -#define LV_SYMBOL_REFRESH "\xEF\x80\xA1" /*61473, 0xF021*/ -#endif - -#if !defined LV_SYMBOL_MUTE -#define LV_SYMBOL_MUTE "\xEF\x80\xA6" /*61478, 0xF026*/ -#endif - -#if !defined LV_SYMBOL_VOLUME_MID -#define LV_SYMBOL_VOLUME_MID "\xEF\x80\xA7" /*61479, 0xF027*/ -#endif - -#if !defined LV_SYMBOL_VOLUME_MAX -#define LV_SYMBOL_VOLUME_MAX "\xEF\x80\xA8" /*61480, 0xF028*/ -#endif - -#if !defined LV_SYMBOL_IMAGE -#define LV_SYMBOL_IMAGE "\xEF\x80\xBE" /*61502, 0xF03E*/ -#endif - -#if !defined LV_SYMBOL_TINT -#define LV_SYMBOL_TINT "\xEF\x81\x83" /*61507, 0xF043*/ -#endif - -#if !defined LV_SYMBOL_PREV -#define LV_SYMBOL_PREV "\xEF\x81\x88" /*61512, 0xF048*/ -#endif - -#if !defined LV_SYMBOL_PLAY -#define LV_SYMBOL_PLAY "\xEF\x81\x8B" /*61515, 0xF04B*/ -#endif - -#if !defined LV_SYMBOL_PAUSE -#define LV_SYMBOL_PAUSE "\xEF\x81\x8C" /*61516, 0xF04C*/ -#endif - -#if !defined LV_SYMBOL_STOP -#define LV_SYMBOL_STOP "\xEF\x81\x8D" /*61517, 0xF04D*/ -#endif - -#if !defined LV_SYMBOL_NEXT -#define LV_SYMBOL_NEXT "\xEF\x81\x91" /*61521, 0xF051*/ -#endif - -#if !defined LV_SYMBOL_EJECT -#define LV_SYMBOL_EJECT "\xEF\x81\x92" /*61522, 0xF052*/ -#endif - -#if !defined LV_SYMBOL_LEFT -#define LV_SYMBOL_LEFT "\xEF\x81\x93" /*61523, 0xF053*/ -#endif - -#if !defined LV_SYMBOL_RIGHT -#define LV_SYMBOL_RIGHT "\xEF\x81\x94" /*61524, 0xF054*/ -#endif - -#if !defined LV_SYMBOL_PLUS -#define LV_SYMBOL_PLUS "\xEF\x81\xA7" /*61543, 0xF067*/ -#endif - -#if !defined LV_SYMBOL_MINUS -#define LV_SYMBOL_MINUS "\xEF\x81\xA8" /*61544, 0xF068*/ -#endif - -#if !defined LV_SYMBOL_EYE_OPEN -#define LV_SYMBOL_EYE_OPEN "\xEF\x81\xAE" /*61550, 0xF06E*/ -#endif - -#if !defined LV_SYMBOL_EYE_CLOSE -#define LV_SYMBOL_EYE_CLOSE "\xEF\x81\xB0" /*61552, 0xF070*/ -#endif - -#if !defined LV_SYMBOL_WARNING -#define LV_SYMBOL_WARNING "\xEF\x81\xB1" /*61553, 0xF071*/ -#endif - -#if !defined LV_SYMBOL_SHUFFLE -#define LV_SYMBOL_SHUFFLE "\xEF\x81\xB4" /*61556, 0xF074*/ -#endif - -#if !defined LV_SYMBOL_UP -#define LV_SYMBOL_UP "\xEF\x81\xB7" /*61559, 0xF077*/ -#endif - -#if !defined LV_SYMBOL_DOWN -#define LV_SYMBOL_DOWN "\xEF\x81\xB8" /*61560, 0xF078*/ -#endif - -#if !defined LV_SYMBOL_LOOP -#define LV_SYMBOL_LOOP "\xEF\x81\xB9" /*61561, 0xF079*/ -#endif - -#if !defined LV_SYMBOL_DIRECTORY -#define LV_SYMBOL_DIRECTORY "\xEF\x81\xBB" /*61563, 0xF07B*/ -#endif - -#if !defined LV_SYMBOL_UPLOAD -#define LV_SYMBOL_UPLOAD "\xEF\x82\x93" /*61587, 0xF093*/ -#endif - -#if !defined LV_SYMBOL_CALL -#define LV_SYMBOL_CALL "\xEF\x82\x95" /*61589, 0xF095*/ -#endif - -#if !defined LV_SYMBOL_CUT -#define LV_SYMBOL_CUT "\xEF\x83\x84" /*61636, 0xF0C4*/ -#endif - -#if !defined LV_SYMBOL_COPY -#define LV_SYMBOL_COPY "\xEF\x83\x85" /*61637, 0xF0C5*/ -#endif - -#if !defined LV_SYMBOL_SAVE -#define LV_SYMBOL_SAVE "\xEF\x83\x87" /*61639, 0xF0C7*/ -#endif - -#if !defined LV_SYMBOL_BARS -#define LV_SYMBOL_BARS "\xEF\x83\x89" /*61641, 0xF0C9*/ -#endif - -#if !defined LV_SYMBOL_ENVELOPE -#define LV_SYMBOL_ENVELOPE "\xEF\x83\xA0" /*61664, 0xF0E0*/ -#endif - -#if !defined LV_SYMBOL_CHARGE -#define LV_SYMBOL_CHARGE "\xEF\x83\xA7" /*61671, 0xF0E7*/ -#endif - -#if !defined LV_SYMBOL_PASTE -#define LV_SYMBOL_PASTE "\xEF\x83\xAA" /*61674, 0xF0EA*/ -#endif - -#if !defined LV_SYMBOL_BELL -#define LV_SYMBOL_BELL "\xEF\x83\xB3" /*61683, 0xF0F3*/ -#endif - -#if !defined LV_SYMBOL_KEYBOARD -#define LV_SYMBOL_KEYBOARD "\xEF\x84\x9C" /*61724, 0xF11C*/ -#endif - -#if !defined LV_SYMBOL_GPS -#define LV_SYMBOL_GPS "\xEF\x84\xA4" /*61732, 0xF124*/ -#endif - -#if !defined LV_SYMBOL_FILE -#define LV_SYMBOL_FILE "\xEF\x85\x9B" /*61787, 0xF158*/ -#endif - -#if !defined LV_SYMBOL_WIFI -#define LV_SYMBOL_WIFI "\xEF\x87\xAB" /*61931, 0xF1EB*/ -#endif - -#if !defined LV_SYMBOL_BATTERY_FULL -#define LV_SYMBOL_BATTERY_FULL "\xEF\x89\x80" /*62016, 0xF240*/ -#endif - -#if !defined LV_SYMBOL_BATTERY_3 -#define LV_SYMBOL_BATTERY_3 "\xEF\x89\x81" /*62017, 0xF241*/ -#endif - -#if !defined LV_SYMBOL_BATTERY_2 -#define LV_SYMBOL_BATTERY_2 "\xEF\x89\x82" /*62018, 0xF242*/ -#endif - -#if !defined LV_SYMBOL_BATTERY_1 -#define LV_SYMBOL_BATTERY_1 "\xEF\x89\x83" /*62019, 0xF243*/ -#endif - -#if !defined LV_SYMBOL_BATTERY_EMPTY -#define LV_SYMBOL_BATTERY_EMPTY "\xEF\x89\x84" /*62020, 0xF244*/ -#endif - -#if !defined LV_SYMBOL_USB -#define LV_SYMBOL_USB "\xEF\x8a\x87" /*62087, 0xF287*/ -#endif - -#if !defined LV_SYMBOL_BLUETOOTH -#define LV_SYMBOL_BLUETOOTH "\xEF\x8a\x93" /*62099, 0xF293*/ -#endif - -#if !defined LV_SYMBOL_TRASH -#define LV_SYMBOL_TRASH "\xEF\x8B\xAD" /*62189, 0xF2ED*/ -#endif - -#if !defined LV_SYMBOL_EDIT -#define LV_SYMBOL_EDIT "\xEF\x8C\x84" /*62212, 0xF304*/ -#endif - -#if !defined LV_SYMBOL_BACKSPACE -#define LV_SYMBOL_BACKSPACE "\xEF\x95\x9A" /*62810, 0xF55A*/ -#endif - -#if !defined LV_SYMBOL_SD_CARD -#define LV_SYMBOL_SD_CARD "\xEF\x9F\x82" /*63426, 0xF7C2*/ -#endif - -#if !defined LV_SYMBOL_NEW_LINE -#define LV_SYMBOL_NEW_LINE "\xEF\xA2\xA2" /*63650, 0xF8A2*/ -#endif - -#if !defined LV_SYMBOL_DUMMY -/** Invalid symbol at (U+F8FF). If written before a string then `lv_img` will show it as a label*/ -#define LV_SYMBOL_DUMMY "\xEF\xA3\xBF" -#endif - -/* - * The following list is generated using - * cat src/font/lv_symbol_def.h | sed -E -n 's/^#define\s+LV_(SYMBOL_\w+).*".*$/ LV_STR_\1,/p' - */ -enum { - LV_STR_SYMBOL_BULLET, - LV_STR_SYMBOL_AUDIO, - LV_STR_SYMBOL_VIDEO, - LV_STR_SYMBOL_LIST, - LV_STR_SYMBOL_OK, - LV_STR_SYMBOL_CLOSE, - LV_STR_SYMBOL_POWER, - LV_STR_SYMBOL_SETTINGS, - LV_STR_SYMBOL_HOME, - LV_STR_SYMBOL_DOWNLOAD, - LV_STR_SYMBOL_DRIVE, - LV_STR_SYMBOL_REFRESH, - LV_STR_SYMBOL_MUTE, - LV_STR_SYMBOL_VOLUME_MID, - LV_STR_SYMBOL_VOLUME_MAX, - LV_STR_SYMBOL_IMAGE, - LV_STR_SYMBOL_TINT, - LV_STR_SYMBOL_PREV, - LV_STR_SYMBOL_PLAY, - LV_STR_SYMBOL_PAUSE, - LV_STR_SYMBOL_STOP, - LV_STR_SYMBOL_NEXT, - LV_STR_SYMBOL_EJECT, - LV_STR_SYMBOL_LEFT, - LV_STR_SYMBOL_RIGHT, - LV_STR_SYMBOL_PLUS, - LV_STR_SYMBOL_MINUS, - LV_STR_SYMBOL_EYE_OPEN, - LV_STR_SYMBOL_EYE_CLOSE, - LV_STR_SYMBOL_WARNING, - LV_STR_SYMBOL_SHUFFLE, - LV_STR_SYMBOL_UP, - LV_STR_SYMBOL_DOWN, - LV_STR_SYMBOL_LOOP, - LV_STR_SYMBOL_DIRECTORY, - LV_STR_SYMBOL_UPLOAD, - LV_STR_SYMBOL_CALL, - LV_STR_SYMBOL_CUT, - LV_STR_SYMBOL_COPY, - LV_STR_SYMBOL_SAVE, - LV_STR_SYMBOL_BARS, - LV_STR_SYMBOL_ENVELOPE, - LV_STR_SYMBOL_CHARGE, - LV_STR_SYMBOL_PASTE, - LV_STR_SYMBOL_BELL, - LV_STR_SYMBOL_KEYBOARD, - LV_STR_SYMBOL_GPS, - LV_STR_SYMBOL_FILE, - LV_STR_SYMBOL_WIFI, - LV_STR_SYMBOL_BATTERY_FULL, - LV_STR_SYMBOL_BATTERY_3, - LV_STR_SYMBOL_BATTERY_2, - LV_STR_SYMBOL_BATTERY_1, - LV_STR_SYMBOL_BATTERY_EMPTY, - LV_STR_SYMBOL_USB, - LV_STR_SYMBOL_BLUETOOTH, - LV_STR_SYMBOL_TRASH, - LV_STR_SYMBOL_EDIT, - LV_STR_SYMBOL_BACKSPACE, - LV_STR_SYMBOL_SD_CARD, - LV_STR_SYMBOL_NEW_LINE, - LV_STR_SYMBOL_DUMMY, -}; - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_SYMBOL_DEF_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev.c b/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev.c deleted file mode 100644 index 3a4a572..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev.c +++ /dev/null @@ -1,1741 +0,0 @@ -#include "lv_indev_private.h" -#include "../misc/lv_event_private.h" -#include "../misc/lv_area_private.h" -#include "../misc/lv_anim_private.h" -#include "../core/lv_obj_draw_private.h" -/** - * @file lv_indev.c - * - */ - -/********************* - * INCLUDES - ********************/ -#include "lv_indev_scroll.h" -#include "../display/lv_display_private.h" -#include "../core/lv_global.h" -#include "../core/lv_obj_private.h" -#include "../core/lv_group.h" -#include "../core/lv_refr.h" - -#include "../tick/lv_tick.h" -#include "../misc/lv_timer_private.h" -#include "../misc/lv_math.h" -#include "../misc/lv_profiler.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -/*Drag threshold in pixels*/ -#define LV_INDEV_DEF_SCROLL_LIMIT 10 - -/*Drag throw slow-down in [%]. Greater value -> faster slow-down*/ -#define LV_INDEV_DEF_SCROLL_THROW 10 - -/*Long press time in milliseconds. - *Time to send `LV_EVENT_LONG_PRESSED`)*/ -#define LV_INDEV_DEF_LONG_PRESS_TIME 400 - -/*Repeated trigger period in long press [ms] - *Time between `LV_EVENT_LONG_PRESSED_REPEAT*/ -#define LV_INDEV_DEF_LONG_PRESS_REP_TIME 100 - -/*Gesture threshold in pixels*/ -#define LV_INDEV_DEF_GESTURE_LIMIT 50 - -/*Gesture min velocity at release before swipe (pixels)*/ -#define LV_INDEV_DEF_GESTURE_MIN_VELOCITY 3 - -/**< Rotary diff count will be multiplied by this and divided by 256 */ -#define LV_INDEV_DEF_ROTARY_SENSITIVITY 256 - -#if LV_INDEV_DEF_SCROLL_THROW <= 0 - #warning "LV_INDEV_DEF_SCROLL_THROW must be greater than 0" -#endif - -#define indev_act LV_GLOBAL_DEFAULT()->indev_active -#define indev_obj_act LV_GLOBAL_DEFAULT()->indev_obj_active -#define indev_ll_head &(LV_GLOBAL_DEFAULT()->indev_ll) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data); -static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data); -static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data); -static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data); -static void indev_proc_press(lv_indev_t * indev); -static void indev_proc_release(lv_indev_t * indev); -static void indev_proc_pointer_diff(lv_indev_t * indev); -static lv_obj_t * pointer_search_obj(lv_display_t * disp, lv_point_t * p); -static void indev_proc_reset_query_handler(lv_indev_t * indev); -static void indev_click_focus(lv_indev_t * indev); -static void indev_gesture(lv_indev_t * indev); -static bool indev_reset_check(lv_indev_t * indev); -static void indev_read_core(lv_indev_t * indev, lv_indev_data_t * data); -static void indev_reset_core(lv_indev_t * indev, lv_obj_t * obj); -static lv_result_t send_event(lv_event_code_t code, void * param); - -static void indev_scroll_throw_anim_start(lv_indev_t * indev); -static void indev_scroll_throw_anim_cb(void * var, int32_t v); -static void indev_scroll_throw_anim_completed_cb(lv_anim_t * anim); -static inline void indev_scroll_throw_anim_reset(lv_indev_t * indev) -{ - if(indev) { - indev->pointer.scroll_throw_vect.x = 0; - indev->pointer.scroll_throw_vect.y = 0; - indev->scroll_throw_anim = NULL; - } -} - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ -#if LV_USE_LOG && LV_LOG_TRACE_INDEV - #define LV_TRACE_INDEV(...) LV_LOG_TRACE(__VA_ARGS__) -#else - #define LV_TRACE_INDEV(...) -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_indev_t * lv_indev_create(void) -{ - lv_display_t * disp = lv_display_get_default(); - if(disp == NULL) { - LV_LOG_WARN("no display was created so far"); - } - - lv_indev_t * indev = lv_ll_ins_head(indev_ll_head); - LV_ASSERT_MALLOC(indev); - if(indev == NULL) { - return NULL; - } - - lv_memzero(indev, sizeof(lv_indev_t)); - indev->reset_query = 1; - indev->enabled = 1; - - indev->read_timer = lv_timer_create(lv_indev_read_timer_cb, LV_DEF_REFR_PERIOD, indev); - - indev->disp = lv_display_get_default(); - indev->type = LV_INDEV_TYPE_NONE; - indev->mode = LV_INDEV_MODE_TIMER; - indev->scroll_limit = LV_INDEV_DEF_SCROLL_LIMIT; - indev->scroll_throw = LV_INDEV_DEF_SCROLL_THROW; - indev->long_press_time = LV_INDEV_DEF_LONG_PRESS_TIME; - indev->long_press_repeat_time = LV_INDEV_DEF_LONG_PRESS_REP_TIME; - indev->gesture_limit = LV_INDEV_DEF_GESTURE_LIMIT; - indev->gesture_min_velocity = LV_INDEV_DEF_GESTURE_MIN_VELOCITY; - indev->rotary_sensitivity = LV_INDEV_DEF_ROTARY_SENSITIVITY; - return indev; -} - -void lv_indev_delete(lv_indev_t * indev) -{ - LV_ASSERT_NULL(indev); - - lv_indev_send_event(indev, LV_EVENT_DELETE, NULL); - lv_event_remove_all(&(indev->event_list)); - - /*Clean up the read timer first*/ - if(indev->read_timer) lv_timer_delete(indev->read_timer); - - /*Remove the input device from the list*/ - lv_ll_remove(indev_ll_head, indev); - /*Free the memory of the input device*/ - lv_free(indev); -} - -lv_indev_t * lv_indev_get_next(lv_indev_t * indev) -{ - if(indev == NULL) - return lv_ll_get_head(indev_ll_head); - else - return lv_ll_get_next(indev_ll_head, indev); -} - -void indev_read_core(lv_indev_t * indev, lv_indev_data_t * data) -{ - LV_PROFILER_BEGIN; - lv_memzero(data, sizeof(lv_indev_data_t)); - - /* For touchpad sometimes users don't set the last pressed coordinate on release. - * So be sure a coordinates are initialized to the last point */ - if(indev->type == LV_INDEV_TYPE_POINTER) { - data->point.x = indev->pointer.last_raw_point.x; - data->point.y = indev->pointer.last_raw_point.y; - } - /*Similarly set at least the last key in case of the user doesn't set it on release*/ - else if(indev->type == LV_INDEV_TYPE_KEYPAD) { - data->key = indev->keypad.last_key; - } - /*For compatibility assume that used button was enter (encoder push)*/ - else if(indev->type == LV_INDEV_TYPE_ENCODER) { - data->key = LV_KEY_ENTER; - } - - if(indev->read_cb) { - LV_TRACE_INDEV("calling indev_read_cb"); - indev->read_cb(indev, data); - } - else { - LV_LOG_WARN("indev_read_cb is not registered"); - } - LV_PROFILER_END; -} - -void lv_indev_read_timer_cb(lv_timer_t * timer) -{ - lv_indev_read(timer->user_data); -} - -void lv_indev_read(lv_indev_t * indev) -{ - if(indev == NULL) return; - - LV_TRACE_INDEV("begin"); - - indev_act = indev; - - /*Read and process all indevs*/ - if(indev->disp == NULL) return; /*Not assigned to any displays*/ - - /*Handle reset query before processing the point*/ - indev_proc_reset_query_handler(indev); - - if(indev->enabled == 0) return; - if(indev->disp->prev_scr != NULL) { - LV_TRACE_INDEV("input blocked while screen animation active"); - return; - } - - LV_PROFILER_BEGIN; - - bool continue_reading; - lv_indev_data_t data; - - do { - /*Read the data*/ - indev_read_core(indev, &data); - continue_reading = indev->mode != LV_INDEV_MODE_EVENT && data.continue_reading; - - /*The active object might be deleted even in the read function*/ - indev_proc_reset_query_handler(indev); - indev_obj_act = NULL; - - indev->state = data.state; - - /*Save the last activity time*/ - if(indev->state == LV_INDEV_STATE_PRESSED) { - indev->disp->last_activity_time = lv_tick_get(); - } - else if(indev->type == LV_INDEV_TYPE_ENCODER && data.enc_diff) { - indev->disp->last_activity_time = lv_tick_get(); - } - - if(indev->type == LV_INDEV_TYPE_POINTER) { - indev_pointer_proc(indev, &data); - } - else if(indev->type == LV_INDEV_TYPE_KEYPAD) { - indev_keypad_proc(indev, &data); - } - else if(indev->type == LV_INDEV_TYPE_ENCODER) { - indev_encoder_proc(indev, &data); - } - else if(indev->type == LV_INDEV_TYPE_BUTTON) { - indev_button_proc(indev, &data); - } - /*Handle reset query if it happened in during processing*/ - indev_proc_reset_query_handler(indev); - } while(continue_reading); - - /*End of indev processing, so no act indev*/ - indev_act = NULL; - indev_obj_act = NULL; - - LV_TRACE_INDEV("finished"); - LV_PROFILER_END; -} - -void lv_indev_enable(lv_indev_t * indev, bool enable) -{ - if(indev) { - indev->enabled = (uint8_t) enable; - } - else { - lv_indev_t * i = lv_indev_get_next(NULL); - while(i) { - i->enabled = (uint8_t) enable; - i = lv_indev_get_next(i); - } - } -} - -lv_indev_t * lv_indev_active(void) -{ - return indev_act; -} - -void lv_indev_set_type(lv_indev_t * indev, lv_indev_type_t indev_type) -{ - if(indev == NULL) return; - - indev->type = indev_type; - indev->reset_query = 1; -} - -void lv_indev_set_read_cb(lv_indev_t * indev, lv_indev_read_cb_t read_cb) -{ - if(indev == NULL) return; - - indev->read_cb = read_cb; -} - -void lv_indev_set_user_data(lv_indev_t * indev, void * user_data) -{ - if(indev == NULL) return; - indev->user_data = user_data; -} - -void lv_indev_set_driver_data(lv_indev_t * indev, void * driver_data) -{ - if(indev == NULL) return; - indev->driver_data = driver_data; -} - -lv_indev_read_cb_t lv_indev_get_read_cb(lv_indev_t * indev) -{ - if(indev == NULL) { - LV_LOG_WARN("lv_indev_get_read_cb: indev was NULL"); - return NULL; - } - - return indev->read_cb; -} - -lv_indev_type_t lv_indev_get_type(const lv_indev_t * indev) -{ - if(indev == NULL) return LV_INDEV_TYPE_NONE; - - return indev->type; -} - -lv_indev_state_t lv_indev_get_state(const lv_indev_t * indev) -{ - if(indev == NULL) return LV_INDEV_STATE_RELEASED; - - return indev->state; -} - -lv_group_t * lv_indev_get_group(const lv_indev_t * indev) -{ - if(indev == NULL) return NULL; - - return indev->group; -} - -lv_display_t * lv_indev_get_display(const lv_indev_t * indev) -{ - if(indev == NULL) return NULL; - - return indev->disp; -} - -void lv_indev_set_display(lv_indev_t * indev, lv_display_t * disp) -{ - if(indev == NULL) return; - - indev->disp = disp; -} - -void lv_indev_set_long_press_time(lv_indev_t * indev, uint16_t long_press_time) -{ - if(indev == NULL) return; - - indev->long_press_time = long_press_time; -} - -void lv_indev_set_scroll_limit(lv_indev_t * indev, uint8_t scroll_limit) -{ - if(indev == NULL) return; - - indev->scroll_limit = scroll_limit; -} - -void lv_indev_set_scroll_throw(lv_indev_t * indev, uint8_t scroll_throw) -{ - if(indev == NULL) return; - - indev->scroll_throw = scroll_throw; -} - -void * lv_indev_get_user_data(const lv_indev_t * indev) -{ - if(indev == NULL) return NULL; - return indev->user_data; -} - -void * lv_indev_get_driver_data(const lv_indev_t * indev) -{ - if(indev == NULL) return NULL; - - return indev->driver_data; -} - -bool lv_indev_get_press_moved(const lv_indev_t * indev) -{ - if(indev == NULL) return false; - - return indev->pointer.press_moved; -} - -void lv_indev_reset(lv_indev_t * indev, lv_obj_t * obj) -{ - if(indev) { - indev_reset_core(indev, obj); - } - else { - lv_indev_t * i = lv_indev_get_next(NULL); - while(i) { - indev_reset_core(i, obj); - i = lv_indev_get_next(i); - } - indev_obj_act = NULL; - } -} - -void lv_indev_stop_processing(lv_indev_t * indev) -{ - if(indev == NULL) return; - indev->stop_processing_query = 1; -} - -void lv_indev_reset_long_press(lv_indev_t * indev) -{ - indev->long_pr_sent = 0; - indev->longpr_rep_timestamp = lv_tick_get(); - indev->pr_timestamp = lv_tick_get(); -} - -void lv_indev_set_cursor(lv_indev_t * indev, lv_obj_t * cur_obj) -{ - if(indev->type != LV_INDEV_TYPE_POINTER) return; - - indev->cursor = cur_obj; - lv_obj_set_parent(indev->cursor, lv_display_get_layer_sys(indev->disp)); - lv_obj_set_pos(indev->cursor, indev->pointer.act_point.x, indev->pointer.act_point.y); - lv_obj_remove_flag(indev->cursor, LV_OBJ_FLAG_CLICKABLE); - lv_obj_add_flag(indev->cursor, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_FLOATING); -} - -void lv_indev_set_group(lv_indev_t * indev, lv_group_t * group) -{ - if(indev && (indev->type == LV_INDEV_TYPE_KEYPAD || indev->type == LV_INDEV_TYPE_ENCODER)) { - indev->group = group; - } -} - -void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t points[]) -{ - if(indev && indev->type == LV_INDEV_TYPE_BUTTON) { - indev->btn_points = points; - } -} - -void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point) -{ - if(indev == NULL) { - point->x = 0; - point->y = 0; - } - else if(indev->type != LV_INDEV_TYPE_POINTER && indev->type != LV_INDEV_TYPE_BUTTON) { - point->x = -1; - point->y = -1; - } - else { - point->x = indev->pointer.act_point.x; - point->y = indev->pointer.act_point.y; - } -} - -lv_dir_t lv_indev_get_gesture_dir(const lv_indev_t * indev) -{ - return indev->pointer.gesture_dir; -} - -uint32_t lv_indev_get_key(const lv_indev_t * indev) -{ - uint32_t key = 0; - - if(indev && indev->type == LV_INDEV_TYPE_KEYPAD) - key = indev->keypad.last_key; - - return key; -} - -lv_dir_t lv_indev_get_scroll_dir(const lv_indev_t * indev) -{ - if(indev == NULL) return false; - if(indev->type != LV_INDEV_TYPE_POINTER && indev->type != LV_INDEV_TYPE_BUTTON) return false; - return indev->pointer.scroll_dir; -} - -lv_obj_t * lv_indev_get_scroll_obj(const lv_indev_t * indev) -{ - if(indev == NULL) return NULL; - if(indev->type != LV_INDEV_TYPE_POINTER && indev->type != LV_INDEV_TYPE_BUTTON) return NULL; - return indev->pointer.scroll_obj; -} - -void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point) -{ - point->x = 0; - point->y = 0; - - if(indev == NULL) return; - - if(indev->type == LV_INDEV_TYPE_POINTER || indev->type == LV_INDEV_TYPE_BUTTON) { - point->x = indev->pointer.vect.x; - point->y = indev->pointer.vect.y; - } -} - -void lv_indev_wait_release(lv_indev_t * indev) -{ - if(indev == NULL)return; - indev->wait_until_release = 1; -} - -lv_obj_t * lv_indev_get_active_obj(void) -{ - return indev_obj_act; -} - -lv_timer_t * lv_indev_get_read_timer(lv_indev_t * indev) -{ - if(indev == NULL) { - LV_LOG_WARN("lv_indev_get_read_timer: indev was NULL"); - return NULL; - } - - return indev->read_timer; -} - -lv_indev_mode_t lv_indev_get_mode(lv_indev_t * indev) -{ - if(indev) return indev->mode; - return LV_INDEV_MODE_NONE; -} - -void lv_indev_set_mode(lv_indev_t * indev, lv_indev_mode_t mode) -{ - if(indev == NULL || indev->mode == mode) - return; - - indev->mode = mode; - if(indev->read_timer) { - if(mode == LV_INDEV_MODE_EVENT) { - lv_timer_pause(indev->read_timer); - } - else if(mode == LV_INDEV_MODE_TIMER) { - /* use default timer mode*/ - lv_timer_set_cb(indev->read_timer, lv_indev_read_timer_cb); - lv_timer_resume(indev->read_timer); - } - } -} - -lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point) -{ - lv_obj_t * found_p = NULL; - - /*If this obj is hidden the children are hidden too so return immediately*/ - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return NULL; - - lv_point_t p_trans = *point; - lv_obj_transform_point(obj, &p_trans, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE); - - bool hit_test_ok = lv_obj_hit_test(obj, &p_trans); - - /*If the point is on this object check its children too*/ - lv_area_t obj_coords = obj->coords; - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { - int32_t ext_draw_size = lv_obj_get_ext_draw_size(obj); - lv_area_increase(&obj_coords, ext_draw_size, ext_draw_size); - } - if(lv_area_is_point_on(&obj_coords, &p_trans, 0)) { - int32_t i; - uint32_t child_cnt = lv_obj_get_child_count(obj); - - /*If a child matches use it*/ - for(i = child_cnt - 1; i >= 0; i--) { - lv_obj_t * child = obj->spec_attr->children[i]; - found_p = lv_indev_search_obj(child, &p_trans); - if(found_p) return found_p; - } - } - - /*If not return earlier for a clicked child and this obj's hittest was ok use it - *else return NULL*/ - if(hit_test_ok) return obj; - else return NULL; -} - -void lv_indev_add_event_cb(lv_indev_t * indev, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data) -{ - LV_ASSERT_NULL(indev); - - lv_event_add(&indev->event_list, event_cb, filter, user_data); -} - -uint32_t lv_indev_get_event_count(lv_indev_t * indev) -{ - LV_ASSERT_NULL(indev); - return lv_event_get_count(&indev->event_list); -} - -lv_event_dsc_t * lv_indev_get_event_dsc(lv_indev_t * indev, uint32_t index) -{ - LV_ASSERT_NULL(indev); - return lv_event_get_dsc(&indev->event_list, index); - -} - -bool lv_indev_remove_event(lv_indev_t * indev, uint32_t index) -{ - LV_ASSERT_NULL(indev); - - return lv_event_remove(&indev->event_list, index); -} - -uint32_t lv_indev_remove_event_cb_with_user_data(lv_indev_t * indev, lv_event_cb_t event_cb, void * user_data) -{ - LV_ASSERT_NULL(indev); - - uint32_t event_cnt = lv_indev_get_event_count(indev); - uint32_t removed_count = 0; - int32_t i; - - for(i = event_cnt - 1; i >= 0; i--) { - lv_event_dsc_t * dsc = lv_indev_get_event_dsc(indev, i); - if(dsc && dsc->cb == event_cb && dsc->user_data == user_data) { - lv_indev_remove_event(indev, i); - removed_count ++; - } - } - - return removed_count; -} - -lv_result_t lv_indev_send_event(lv_indev_t * indev, lv_event_code_t code, void * param) -{ - - lv_event_t e; - lv_memzero(&e, sizeof(e)); - e.code = code; - e.current_target = indev; - e.original_target = indev; - e.param = param; - lv_result_t res; - res = lv_event_send(&indev->event_list, &e, true); - if(res != LV_RESULT_OK) return res; - - res = lv_event_send(&indev->event_list, &e, false); - if(res != LV_RESULT_OK) return res; - - return res; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Process a new point from LV_INDEV_TYPE_POINTER input device - * @param i pointer to an input device - * @param data pointer to the data read from the input device - */ -static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data) -{ - lv_display_t * disp = i->disp; - /*Save the raw points so they can be used again in indev_read_core*/ - i->pointer.last_raw_point.x = data->point.x; - i->pointer.last_raw_point.y = data->point.y; - - if(disp->rotation == LV_DISPLAY_ROTATION_180 || disp->rotation == LV_DISPLAY_ROTATION_270) { - data->point.x = disp->hor_res - data->point.x - 1; - data->point.y = disp->ver_res - data->point.y - 1; - } - if(disp->rotation == LV_DISPLAY_ROTATION_90 || disp->rotation == LV_DISPLAY_ROTATION_270) { - int32_t tmp = data->point.y; - data->point.y = data->point.x; - data->point.x = disp->ver_res - tmp - 1; - } - - /*Simple sanity check*/ - if(data->point.x < 0) { - LV_LOG_WARN("X is %d which is smaller than zero", (int)data->point.x); - } - if(data->point.x >= lv_display_get_horizontal_resolution(i->disp)) { - LV_LOG_WARN("X is %d which is greater than hor. res", (int)data->point.x); - } - if(data->point.y < 0) { - LV_LOG_WARN("Y is %d which is smaller than zero", (int)data->point.y); - } - if(data->point.y >= lv_display_get_vertical_resolution(i->disp)) { - LV_LOG_WARN("Y is %d which is greater than ver. res", (int)data->point.y); - } - - /*Move the cursor if set and moved*/ - if(i->cursor != NULL && - (i->pointer.last_point.x != data->point.x || i->pointer.last_point.y != data->point.y)) { - lv_obj_set_pos(i->cursor, data->point.x, data->point.y); - } - - i->pointer.act_point.x = data->point.x; - i->pointer.act_point.y = data->point.y; - i->pointer.diff = data->enc_diff; - - /*Process the diff first as scrolling will be processed in indev_proc_release*/ - indev_proc_pointer_diff(i); - - if(i->state == LV_INDEV_STATE_PRESSED) { - indev_proc_press(i); - } - else { - indev_proc_release(i); - } - - i->pointer.last_point.x = i->pointer.act_point.x; - i->pointer.last_point.y = i->pointer.act_point.y; -} - -/** - * Process a new point from LV_INDEV_TYPE_KEYPAD input device - * @param i pointer to an input device - * @param data pointer to the data read from the input device - */ -static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) -{ - if(data->state == LV_INDEV_STATE_PRESSED && i->wait_until_release) return; - - if(i->wait_until_release) { - i->wait_until_release = 0; - i->pr_timestamp = 0; - i->long_pr_sent = 0; - i->keypad.last_state = LV_INDEV_STATE_RELEASED; /*To skip the processing of release*/ - } - - /*Save the last key. *It must be done here else `lv_indev_get_key` will return the last key in events*/ - uint32_t prev_key = i->keypad.last_key; - i->keypad.last_key = data->key; - - lv_group_t * g = i->group; - if(g == NULL) return; - - indev_obj_act = lv_group_get_focused(g); - if(indev_obj_act == NULL) return; - - const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); - - /*Save the previous state so we can detect state changes below and also set the last state now - *so if any event handler on the way returns `LV_RESULT_INVALID` the last state is remembered - *for the next time*/ - uint32_t prev_state = i->keypad.last_state; - i->keypad.last_state = data->state; - - /*Key press happened*/ - if(data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_RELEASED) { - LV_LOG_INFO("%" LV_PRIu32 " key is pressed", data->key); - i->pr_timestamp = lv_tick_get(); - - /*Move the focus on NEXT*/ - if(data->key == LV_KEY_NEXT) { - lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ - lv_group_focus_next(g); - if(indev_reset_check(i)) return; - } - /*Move the focus on PREV*/ - else if(data->key == LV_KEY_PREV) { - lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ - lv_group_focus_prev(g); - if(indev_reset_check(i)) return; - } - else if(is_enabled) { - /*Simulate a press on the object if ENTER was pressed*/ - if(data->key == LV_KEY_ENTER) { - /*Send the ENTER as a normal KEY*/ - lv_group_send_data(g, LV_KEY_ENTER); - if(indev_reset_check(i)) return; - - if(send_event(LV_EVENT_PRESSED, indev_act) == LV_RESULT_INVALID) return; - - } - else if(data->key == LV_KEY_ESC) { - /*Send the ESC as a normal KEY*/ - lv_group_send_data(g, LV_KEY_ESC); - if(indev_reset_check(i)) return; - - if(send_event(LV_EVENT_CANCEL, indev_act) == LV_RESULT_INVALID) return; - } - /*Just send other keys to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT`)*/ - else { - lv_group_send_data(g, data->key); - if(indev_reset_check(i)) return; - } - } - } - /*Pressing*/ - else if(is_enabled && data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_PRESSED) { - - if(data->key == LV_KEY_ENTER) { - if(send_event(LV_EVENT_PRESSING, indev_act) == LV_RESULT_INVALID) return; - } - - /*Long press time has elapsed?*/ - if(i->long_pr_sent == 0 && lv_tick_elaps(i->pr_timestamp) > i->long_press_time) { - i->long_pr_sent = 1; - if(data->key == LV_KEY_ENTER) { - i->longpr_rep_timestamp = lv_tick_get(); - - if(send_event(LV_EVENT_LONG_PRESSED, indev_act) == LV_RESULT_INVALID) return; - } - } - /*Long press repeated time has elapsed?*/ - else if(i->long_pr_sent != 0 && - lv_tick_elaps(i->longpr_rep_timestamp) > i->long_press_repeat_time) { - - i->longpr_rep_timestamp = lv_tick_get(); - - /*Send LONG_PRESS_REP on ENTER*/ - if(data->key == LV_KEY_ENTER) { - if(send_event(LV_EVENT_LONG_PRESSED_REPEAT, indev_act) == LV_RESULT_INVALID) return; - } - /*Move the focus on NEXT again*/ - else if(data->key == LV_KEY_NEXT) { - lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ - lv_group_focus_next(g); - if(indev_reset_check(i)) return; - } - /*Move the focus on PREV again*/ - else if(data->key == LV_KEY_PREV) { - lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ - lv_group_focus_prev(g); - if(indev_reset_check(i)) return; - } - /*Just send other keys again to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT)*/ - else { - lv_group_send_data(g, data->key); - if(indev_reset_check(i)) return; - } - } - } - /*Release happened*/ - else if(is_enabled && data->state == LV_INDEV_STATE_RELEASED && prev_state == LV_INDEV_STATE_PRESSED) { - LV_LOG_INFO("%" LV_PRIu32 " key is released", data->key); - /*The user might clear the key when it was released. Always release the pressed key*/ - data->key = prev_key; - if(data->key == LV_KEY_ENTER) { - - if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return; - - if(i->long_pr_sent == 0) { - if(send_event(LV_EVENT_SHORT_CLICKED, indev_act) == LV_RESULT_INVALID) return; - } - - if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return; - - } - i->pr_timestamp = 0; - i->long_pr_sent = 0; - } - indev_obj_act = NULL; -} - -/** - * Process a new point from LV_INDEV_TYPE_ENCODER input device - * @param i pointer to an input device - * @param data pointer to the data read from the input device - */ -static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) -{ - if(data->state == LV_INDEV_STATE_PRESSED && i->wait_until_release) return; - - if(i->wait_until_release) { - i->wait_until_release = 0; - i->pr_timestamp = 0; - i->long_pr_sent = 0; - i->keypad.last_state = LV_INDEV_STATE_RELEASED; /*To skip the processing of release*/ - } - - /*Save the last keys before anything else. - *They need to be already saved if the function returns for any reason*/ - lv_indev_state_t last_state = i->keypad.last_state; - i->keypad.last_state = data->state; - i->keypad.last_key = data->key; - - lv_group_t * g = i->group; - if(g == NULL) return; - - indev_obj_act = lv_group_get_focused(g); - if(indev_obj_act == NULL) return; - - /*Process the steps they are valid only with released button*/ - if(data->state != LV_INDEV_STATE_RELEASED) { - data->enc_diff = 0; - } - - const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); - - /*Button press happened*/ - if(data->state == LV_INDEV_STATE_PRESSED && last_state == LV_INDEV_STATE_RELEASED) { - LV_LOG_INFO("pressed"); - - i->pr_timestamp = lv_tick_get(); - - if(data->key == LV_KEY_ENTER) { - bool editable_or_scrollable = lv_obj_is_editable(indev_obj_act) || - lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_SCROLLABLE); - if(lv_group_get_editing(g) == true || editable_or_scrollable == false) { - - if(is_enabled) { - if(send_event(LV_EVENT_PRESSED, indev_act) == LV_RESULT_INVALID) return; - } - } - } - else if(data->key == LV_KEY_LEFT) { - /*emulate encoder left*/ - data->enc_diff--; - } - else if(data->key == LV_KEY_RIGHT) { - /*emulate encoder right*/ - data->enc_diff++; - } - else if(data->key == LV_KEY_ESC) { - /*Send the ESC as a normal KEY*/ - lv_group_send_data(g, LV_KEY_ESC); - if(indev_reset_check(i)) return; - - if(is_enabled) { - if(send_event(LV_EVENT_CANCEL, indev_act) == LV_RESULT_INVALID) return; - } - } - /*Just send other keys to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT`)*/ - else { - lv_group_send_data(g, data->key); - if(indev_reset_check(i)) return; - } - } - /*Pressing*/ - else if(data->state == LV_INDEV_STATE_PRESSED && last_state == LV_INDEV_STATE_PRESSED) { - /*Long press*/ - if(i->long_pr_sent == 0 && lv_tick_elaps(i->pr_timestamp) > i->long_press_time) { - - i->long_pr_sent = 1; - i->longpr_rep_timestamp = lv_tick_get(); - - if(data->key == LV_KEY_ENTER) { - /* Always send event to indev callbacks*/ - lv_indev_send_event(indev_act, LV_EVENT_LONG_PRESSED, indev_obj_act); - if(indev_reset_check(indev_act)) return; - - bool editable_or_scrollable = lv_obj_is_editable(indev_obj_act) || - lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_SCROLLABLE); - - /*On enter long press toggle edit mode.*/ - if(editable_or_scrollable) { - /*Don't leave edit mode if there is only one object (nowhere to navigate)*/ - if(lv_group_get_obj_count(g) > 1) { - LV_LOG_INFO("toggling edit mode"); - lv_group_set_editing(g, lv_group_get_editing(g) ? false : true); /*Toggle edit mode on long press*/ - lv_obj_remove_state(indev_obj_act, LV_STATE_PRESSED); /*Remove the pressed state manually*/ - } - } - /*If not editable then just send a long press event*/ - else { - if(is_enabled) { - lv_obj_send_event(indev_obj_act, LV_EVENT_LONG_PRESSED, indev_act); - if(indev_reset_check(indev_act)) return; - } - } - } - - i->long_pr_sent = 1; - } - /*Long press repeated time has elapsed?*/ - else if(i->long_pr_sent != 0 && lv_tick_elaps(i->longpr_rep_timestamp) > i->long_press_repeat_time) { - - i->longpr_rep_timestamp = lv_tick_get(); - - if(data->key == LV_KEY_ENTER) { - if(is_enabled) { - if(send_event(LV_EVENT_LONG_PRESSED_REPEAT, indev_act) == LV_RESULT_INVALID) return; - } - } - else if(data->key == LV_KEY_LEFT) { - /*emulate encoder left*/ - data->enc_diff--; - } - else if(data->key == LV_KEY_RIGHT) { - /*emulate encoder right*/ - data->enc_diff++; - } - else { - lv_group_send_data(g, data->key); - if(indev_reset_check(i)) return; - } - - } - - } - /*Release happened*/ - else if(data->state == LV_INDEV_STATE_RELEASED && last_state == LV_INDEV_STATE_PRESSED) { - LV_LOG_INFO("released"); - - if(data->key == LV_KEY_ENTER) { - bool editable_or_scrollable = lv_obj_is_editable(indev_obj_act) || - lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_SCROLLABLE); - - /*The button was released on a non-editable object. Just send enter*/ - if(editable_or_scrollable == false) { - if(is_enabled) { - if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return; - } - - if(i->long_pr_sent == 0 && is_enabled) { - if(send_event(LV_EVENT_SHORT_CLICKED, indev_act) == LV_RESULT_INVALID) return; - } - - if(is_enabled) { - if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return; - } - - } - /*An object is being edited and the button is released.*/ - else if(lv_group_get_editing(g)) { - /*Ignore long pressed enter release because it comes from mode switch*/ - if(!i->long_pr_sent || lv_group_get_obj_count(g) <= 1) { - if(is_enabled) { - if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return; - if(send_event(LV_EVENT_SHORT_CLICKED, indev_act) == LV_RESULT_INVALID) return; - if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return; - } - - lv_group_send_data(g, LV_KEY_ENTER); - if(indev_reset_check(i)) return; - } - else { - lv_obj_remove_state(indev_obj_act, LV_STATE_PRESSED); /*Remove the pressed state manually*/ - } - } - /*If the focused object is editable and now in navigate mode then on enter switch edit - mode*/ - else if(!i->long_pr_sent) { - LV_LOG_INFO("entering edit mode"); - lv_group_set_editing(g, true); /*Set edit mode*/ - } - } - - i->pr_timestamp = 0; - i->long_pr_sent = 0; - } - indev_obj_act = NULL; - - /*if encoder steps or simulated steps via left/right keys*/ - if(data->enc_diff != 0) { - /*In edit mode send LEFT/RIGHT keys*/ - if(lv_group_get_editing(g)) { - LV_LOG_INFO("rotated by %+d (edit)", data->enc_diff); - int32_t s; - if(data->enc_diff < 0) { - for(s = 0; s < -data->enc_diff; s++) { - lv_group_send_data(g, LV_KEY_LEFT); - if(indev_reset_check(i)) return; - } - } - else if(data->enc_diff > 0) { - for(s = 0; s < data->enc_diff; s++) { - lv_group_send_data(g, LV_KEY_RIGHT); - if(indev_reset_check(i)) return; - } - } - } - /*In navigate mode focus on the next/prev objects*/ - else { - LV_LOG_INFO("rotated by %+d (nav)", data->enc_diff); - int32_t s; - if(data->enc_diff < 0) { - for(s = 0; s < -data->enc_diff; s++) { - lv_group_focus_prev(g); - if(indev_reset_check(i)) return; - } - } - else if(data->enc_diff > 0) { - for(s = 0; s < data->enc_diff; s++) { - lv_group_focus_next(g); - if(indev_reset_check(i)) return; - } - } - } - } -} - -/** - * Process new points from an input device. indev->state.pressed has to be set - * @param indev pointer to an input device state - * @param x x coordinate of the next point - * @param y y coordinate of the next point - */ -static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data) -{ - /*Die gracefully if i->btn_points is NULL*/ - if(i->btn_points == NULL) { - LV_LOG_WARN("btn_points is NULL"); - return; - } - - int32_t x = i->btn_points[data->btn_id].x; - int32_t y = i->btn_points[data->btn_id].y; - - if(LV_INDEV_STATE_RELEASED != data->state) { - if(data->state == LV_INDEV_STATE_PRESSED) { - LV_LOG_INFO("button %" LV_PRIu32 " is pressed (x:%d y:%d)", data->btn_id, (int)x, (int)y); - } - else { - LV_LOG_INFO("button %" LV_PRIu32 " is released (x:%d y:%d)", data->btn_id, (int)x, (int)y); - } - } - - /*If a new point comes always make a release*/ - if(data->state == LV_INDEV_STATE_PRESSED) { - if(i->pointer.last_point.x != x || - i->pointer.last_point.y != y) { - indev_proc_release(i); - } - } - - if(indev_reset_check(i)) return; - - /*Save the new points*/ - i->pointer.act_point.x = x; - i->pointer.act_point.y = y; - - if(data->state == LV_INDEV_STATE_PRESSED) indev_proc_press(i); - else indev_proc_release(i); - - if(indev_reset_check(i)) return; - - i->pointer.last_point.x = i->pointer.act_point.x; - i->pointer.last_point.y = i->pointer.act_point.y; -} - -/** - * Process the pressed state of LV_INDEV_TYPE_POINTER input devices - * @param indev pointer to an input device 'proc' - */ -static void indev_proc_press(lv_indev_t * indev) -{ - LV_LOG_INFO("pressed at x:%d y:%d", (int)indev->pointer.act_point.x, - (int)indev->pointer.act_point.y); - indev_obj_act = indev->pointer.act_obj; - - if(indev->wait_until_release != 0) return; - - lv_display_t * disp = indev_act->disp; - bool new_obj_searched = false; - - /*If there is no last object then search*/ - if(indev_obj_act == NULL) { - indev_obj_act = pointer_search_obj(disp, &indev->pointer.act_point); - new_obj_searched = true; - } - /*If there is an active object it's not scrolled and not press locked also search*/ - else if(indev->pointer.scroll_obj == NULL && - lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_PRESS_LOCK) == false) { - indev_obj_act = pointer_search_obj(disp, &indev->pointer.act_point); - new_obj_searched = true; - } - - /*The scroll object might have scroll throw. Stop it manually*/ - if(new_obj_searched && indev->pointer.scroll_obj) { - /*Attempt to stop scroll throw animation firstly*/ - if(indev->scroll_throw_anim) { - lv_anim_delete(indev, indev_scroll_throw_anim_cb); - indev->scroll_throw_anim = NULL; - } - - lv_indev_scroll_throw_handler(indev); - if(indev_reset_check(indev)) return; - } - - /*If a new object was found reset some variables and send a pressed event handler*/ - if(indev_obj_act != indev->pointer.act_obj) { - indev->pointer.last_point.x = indev->pointer.act_point.x; - indev->pointer.last_point.y = indev->pointer.act_point.y; - - /*Without `LV_OBJ_FLAG_PRESS_LOCK` new widget can be found while pressing.*/ - if(indev->pointer.last_hovered && indev->pointer.last_hovered != indev_obj_act) { - lv_obj_send_event(indev->pointer.last_hovered, LV_EVENT_HOVER_LEAVE, indev); - if(indev_reset_check(indev)) return; - - lv_indev_send_event(indev, LV_EVENT_HOVER_LEAVE, indev->pointer.last_hovered); - if(indev_reset_check(indev)) return; - - indev->pointer.last_hovered = indev_obj_act; - } - - /*If a new object found the previous was lost, so send a PRESS_LOST event*/ - if(indev->pointer.act_obj != NULL) { - /*Save the obj because in special cases `act_obj` can change in the event */ - lv_obj_t * last_obj = indev->pointer.act_obj; - - lv_obj_send_event(last_obj, LV_EVENT_PRESS_LOST, indev_act); - if(indev_reset_check(indev)) return; - } - - indev->pointer.act_obj = indev_obj_act; /*Save the pressed object*/ - indev->pointer.last_obj = indev_obj_act; - - if(indev_obj_act != NULL) { - - /*Save the time when the obj pressed to count long press time.*/ - indev->pr_timestamp = lv_tick_get(); - indev->long_pr_sent = 0; - indev->pointer.scroll_sum.x = 0; - indev->pointer.scroll_sum.y = 0; - indev->pointer.scroll_dir = LV_DIR_NONE; - indev->pointer.scroll_obj = NULL; - indev->pointer.gesture_dir = LV_DIR_NONE; - indev->pointer.gesture_sent = 0; - indev->pointer.gesture_sum.x = 0; - indev->pointer.gesture_sum.y = 0; - indev->pointer.press_moved = 0; - indev->pointer.vect.x = 0; - indev->pointer.vect.y = 0; - - const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); - if(is_enabled) { - if(indev->pointer.last_hovered != indev_obj_act) { - if(send_event(LV_EVENT_HOVER_OVER, indev_act) == LV_RESULT_INVALID) return; - } - if(send_event(LV_EVENT_PRESSED, indev_act) == LV_RESULT_INVALID) return; - } - - if(indev_act->wait_until_release) return; - - /*Handle focus*/ - indev_click_focus(indev_act); - if(indev_reset_check(indev)) return; - - } - } - - /*Calculate the vector and apply a low pass filter: new value = 0.5 * old_value + 0.5 * new_value*/ - indev->pointer.vect.x = indev->pointer.act_point.x - indev->pointer.last_point.x; - indev->pointer.vect.y = indev->pointer.act_point.y - indev->pointer.last_point.y; - - indev->pointer.scroll_throw_vect.x = (indev->pointer.scroll_throw_vect.x + indev->pointer.vect.x) / 2; - indev->pointer.scroll_throw_vect.y = (indev->pointer.scroll_throw_vect.y + indev->pointer.vect.y) / 2; - - indev->pointer.scroll_throw_vect_ori = indev->pointer.scroll_throw_vect; - - if(LV_ABS(indev->pointer.vect.x) > indev->scroll_limit || LV_ABS(indev->pointer.vect.y) > indev->scroll_limit) { - indev->pointer.press_moved = 1; - } - - if(indev_obj_act) { - const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); - - if(is_enabled) { - if(send_event(LV_EVENT_PRESSING, indev_act) == LV_RESULT_INVALID) return; - } - - if(indev_act->wait_until_release) return; - - lv_indev_scroll_handler(indev); - if(indev_reset_check(indev)) return; - indev_gesture(indev); - if(indev_reset_check(indev)) return; - - if(indev->mode == LV_INDEV_MODE_EVENT && indev->read_timer && lv_timer_get_paused(indev->read_timer)) { - lv_timer_resume(indev->read_timer); - } - - /*If there is no scrolling then check for long press time*/ - if(indev->pointer.scroll_obj == NULL && indev->long_pr_sent == 0) { - /*Send a long press event if enough time elapsed*/ - if(lv_tick_elaps(indev->pr_timestamp) > indev_act->long_press_time) { - if(is_enabled) { - if(send_event(LV_EVENT_LONG_PRESSED, indev_act) == LV_RESULT_INVALID) return; - } - /*Mark it to do not send the event again*/ - indev->long_pr_sent = 1; - - /*Save the long press time stamp for the long press repeat handler*/ - indev->longpr_rep_timestamp = lv_tick_get(); - } - } - - if(indev->pointer.scroll_obj == NULL && indev->long_pr_sent == 1) { - if(lv_tick_elaps(indev->longpr_rep_timestamp) > indev_act->long_press_repeat_time) { - if(is_enabled) { - if(send_event(LV_EVENT_LONG_PRESSED_REPEAT, indev_act) == LV_RESULT_INVALID) return; - } - indev->longpr_rep_timestamp = lv_tick_get(); - } - } - } -} - -/** - * Process the released state of LV_INDEV_TYPE_POINTER input devices - * @param proc pointer to an input device 'proc' - */ -static void indev_proc_release(lv_indev_t * indev) -{ - if(indev->wait_until_release || /*Hover the new widget even if the coordinates didn't changed*/ - (indev->pointer.last_point.x != indev->pointer.act_point.x || - indev->pointer.last_point.y != indev->pointer.act_point.y)) { - lv_obj_t ** last = &indev->pointer.last_hovered; - lv_obj_t * hovered = pointer_search_obj(lv_display_get_default(), &indev->pointer.act_point); - if(*last != hovered) { - lv_obj_send_event(hovered, LV_EVENT_HOVER_OVER, indev); - if(indev_reset_check(indev)) return; - lv_indev_send_event(indev, LV_EVENT_HOVER_OVER, hovered); - if(indev_reset_check(indev)) return; - - lv_obj_send_event(*last, LV_EVENT_HOVER_LEAVE, indev); - if(indev_reset_check(indev)) return; - lv_indev_send_event(indev, LV_EVENT_HOVER_LEAVE, *last); - if(indev_reset_check(indev)) return; - *last = hovered; - } - } - - if(indev->wait_until_release) { - lv_obj_send_event(indev->pointer.act_obj, LV_EVENT_PRESS_LOST, indev_act); - if(indev_reset_check(indev)) return; - - indev->pointer.act_obj = NULL; - indev->pointer.last_obj = NULL; - indev->pr_timestamp = 0; - indev->longpr_rep_timestamp = 0; - indev->wait_until_release = 0; - } - indev_obj_act = indev->pointer.act_obj; - lv_obj_t * scroll_obj = indev->pointer.scroll_obj; - - if(indev->mode == LV_INDEV_MODE_EVENT && indev->read_timer && !lv_timer_get_paused(indev->read_timer)) { - lv_timer_pause(indev->read_timer); - } - - if(indev_obj_act) { - LV_LOG_INFO("released"); - - const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); - - if(is_enabled) { - if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return; - } - - if(is_enabled) { - if(scroll_obj == NULL) { - if(indev->long_pr_sent == 0) { - if(send_event(LV_EVENT_SHORT_CLICKED, indev_act) == LV_RESULT_INVALID) return; - } - if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return; - } - else { - lv_obj_send_event(scroll_obj, LV_EVENT_SCROLL_THROW_BEGIN, indev_act); - if(indev_reset_check(indev)) return; - } - } - indev->pointer.act_obj = NULL; - indev->pr_timestamp = 0; - indev->longpr_rep_timestamp = 0; - - /*Get the transformed vector with this object*/ - if(scroll_obj) { - int16_t angle = 0; - int16_t scale_x = 256; - int16_t scale_y = 256; - lv_point_t pivot = { 0, 0 }; - lv_obj_t * parent = scroll_obj; - while(parent) { - angle += lv_obj_get_style_transform_rotation(parent, 0); - int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, 0); - int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, 0); - scale_x = (scale_x * zoom_act_x) >> 8; - scale_y = (scale_x * zoom_act_y) >> 8; - parent = lv_obj_get_parent(parent); - } - - if(angle != 0 || scale_y != LV_SCALE_NONE || scale_x != LV_SCALE_NONE) { - angle = -angle; - scale_x = (256 * 256) / scale_x; - scale_y = (256 * 256) / scale_y; - lv_point_transform(&indev->pointer.scroll_throw_vect, angle, scale_x, scale_y, &pivot, false); - lv_point_transform(&indev->pointer.scroll_throw_vect_ori, angle, scale_x, scale_y, &pivot, false); - } - } - } - - if(scroll_obj) { - if(!indev->scroll_throw_anim) { - indev_scroll_throw_anim_start(indev); - } - - if(indev_reset_check(indev)) return; - } -} - -static void indev_proc_pointer_diff(lv_indev_t * indev) -{ - lv_obj_t * obj = indev->pointer.last_pressed; - if(obj == NULL) return; - if(indev->pointer.diff == 0) return; - - indev_obj_act = obj; - - bool editable = lv_obj_is_editable(obj); - - if(editable) { - uint32_t indev_sensitivity = indev->rotary_sensitivity; - uint32_t obj_sensitivity = lv_obj_get_style_rotary_sensitivity(indev_obj_act, 0); - int32_t diff = (int32_t)((int32_t)indev->pointer.diff * indev_sensitivity * obj_sensitivity + 32768) >> 16; - send_event(LV_EVENT_ROTARY, &diff); - } - else { - - int32_t vect = indev->pointer.diff > 0 ? indev->scroll_limit : -indev->scroll_limit; - indev->pointer.vect.y = vect; - indev->pointer.act_obj = obj; - lv_obj_t * scroll_obj = lv_indev_find_scroll_obj(indev); - if(scroll_obj == NULL) return; - uint32_t indev_sensitivity = indev->rotary_sensitivity; - uint32_t obj_sensitivity = lv_obj_get_style_rotary_sensitivity(scroll_obj, 0); - int32_t diff = (int32_t)((int32_t)indev->pointer.diff * indev_sensitivity * obj_sensitivity + 32768) >> 16; - - indev->pointer.scroll_throw_vect.y = diff; - indev->pointer.scroll_throw_vect_ori.y = diff; - lv_indev_scroll_handler(indev); - } - -} - -static lv_obj_t * pointer_search_obj(lv_display_t * disp, lv_point_t * p) -{ - indev_obj_act = lv_indev_search_obj(lv_display_get_layer_sys(disp), p); - if(indev_obj_act) return indev_obj_act; - - indev_obj_act = lv_indev_search_obj(lv_display_get_layer_top(disp), p); - if(indev_obj_act) return indev_obj_act; - - /* Search the object in the active screen */ - indev_obj_act = lv_indev_search_obj(lv_display_get_screen_active(disp), p); - if(indev_obj_act) return indev_obj_act; - - indev_obj_act = lv_indev_search_obj(lv_display_get_layer_bottom(disp), p); - return indev_obj_act; -} - -/** - * Process a new point from LV_INDEV_TYPE_BUTTON input device - * @param i pointer to an input device - * @param data pointer to the data read from the input device - * Reset input device if a reset query has been sent to it - * @param indev pointer to an input device - */ -static void indev_proc_reset_query_handler(lv_indev_t * indev) -{ - if(indev->reset_query) { - indev->pointer.act_obj = NULL; - indev->pointer.last_obj = NULL; - indev->pointer.scroll_obj = NULL; - indev->pointer.last_hovered = NULL; - indev->long_pr_sent = 0; - indev->pr_timestamp = 0; - indev->longpr_rep_timestamp = 0; - indev->pointer.scroll_sum.x = 0; - indev->pointer.scroll_sum.y = 0; - indev->pointer.scroll_dir = LV_DIR_NONE; - indev->pointer.scroll_obj = NULL; - indev->pointer.scroll_throw_vect.x = 0; - indev->pointer.scroll_throw_vect.y = 0; - indev->pointer.gesture_sum.x = 0; - indev->pointer.gesture_sum.y = 0; - indev->reset_query = 0; - indev->stop_processing_query = 0; - indev_obj_act = NULL; - } -} - -/** - * Handle focus/defocus on click for POINTER input devices - * @param proc pointer to the state of the indev - */ -static void indev_click_focus(lv_indev_t * indev) -{ - /*Handle click focus*/ - if(lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_CLICK_FOCUSABLE) == false) { - return; - } - - lv_group_t * g_act = lv_obj_get_group(indev_obj_act); - lv_group_t * g_prev = indev->pointer.last_pressed ? lv_obj_get_group(indev->pointer.last_pressed) : NULL; - - /*If both the last and act. obj. are in the same group (or have no group)*/ - if(g_act == g_prev) { - /*The objects are in a group*/ - if(g_act) { - lv_group_focus_obj(indev_obj_act); - if(indev_reset_check(indev)) return; - } - /*The object are not in group*/ - else { - if(indev->pointer.last_pressed != indev_obj_act) { - lv_obj_send_event(indev->pointer.last_pressed, LV_EVENT_DEFOCUSED, indev_act); - if(indev_reset_check(indev)) return; - - lv_obj_send_event(indev_obj_act, LV_EVENT_FOCUSED, indev_act); - if(indev_reset_check(indev)) return; - } - } - } - /*The object are not in the same group (in different groups or one has no group)*/ - else { - /*If the prev. obj. is not in a group then defocus it.*/ - if(g_prev == NULL && indev->pointer.last_pressed) { - lv_obj_send_event(indev->pointer.last_pressed, LV_EVENT_DEFOCUSED, indev_act); - if(indev_reset_check(indev)) return; - } - /*Focus on a non-group object*/ - else { - if(indev->pointer.last_pressed) { - /*If the prev. object also wasn't in a group defocus it*/ - if(g_prev == NULL) { - lv_obj_send_event(indev->pointer.last_pressed, LV_EVENT_DEFOCUSED, indev_act); - if(indev_reset_check(indev)) return; - } - /*If the prev. object also was in a group at least "LEAVE" it instead of defocus*/ - else { - lv_obj_send_event(indev->pointer.last_pressed, LV_EVENT_LEAVE, indev_act); - if(indev_reset_check(indev)) return; - } - } - } - - /*Focus to the act. in its group*/ - if(g_act) { - lv_group_focus_obj(indev_obj_act); - if(indev_reset_check(indev)) return; - } - else { - lv_obj_send_event(indev_obj_act, LV_EVENT_FOCUSED, indev_act); - if(indev_reset_check(indev)) return; - } - } - indev->pointer.last_pressed = indev_obj_act; -} - -/** -* Handle the gesture of indev_proc_p->pointer.act_obj -* @param indev pointer to an input device state -*/ -void indev_gesture(lv_indev_t * indev) -{ - if(indev->pointer.scroll_obj) return; - if(indev->pointer.gesture_sent) return; - - lv_obj_t * gesture_obj = indev->pointer.act_obj; - - /*If gesture parent is active check recursively the gesture attribute*/ - while(gesture_obj && lv_obj_has_flag(gesture_obj, LV_OBJ_FLAG_GESTURE_BUBBLE)) { - gesture_obj = lv_obj_get_parent(gesture_obj); - } - - if(gesture_obj == NULL) return; - - if((LV_ABS(indev->pointer.vect.x) < indev_act->gesture_min_velocity) && - (LV_ABS(indev->pointer.vect.y) < indev_act->gesture_min_velocity)) { - indev->pointer.gesture_sum.x = 0; - indev->pointer.gesture_sum.y = 0; - } - - /*Count the movement by gesture*/ - indev->pointer.gesture_sum.x += indev->pointer.vect.x; - indev->pointer.gesture_sum.y += indev->pointer.vect.y; - - if((LV_ABS(indev->pointer.gesture_sum.x) > indev_act->gesture_limit) || - (LV_ABS(indev->pointer.gesture_sum.y) > indev_act->gesture_limit)) { - - indev->pointer.gesture_sent = 1; - - if(LV_ABS(indev->pointer.gesture_sum.x) > LV_ABS(indev->pointer.gesture_sum.y)) { - if(indev->pointer.gesture_sum.x > 0) - indev->pointer.gesture_dir = LV_DIR_RIGHT; - else - indev->pointer.gesture_dir = LV_DIR_LEFT; - } - else { - if(indev->pointer.gesture_sum.y > 0) - indev->pointer.gesture_dir = LV_DIR_BOTTOM; - else - indev->pointer.gesture_dir = LV_DIR_TOP; - } - - lv_obj_send_event(gesture_obj, LV_EVENT_GESTURE, indev_act); - if(indev_reset_check(indev)) return; - - lv_indev_send_event(indev_act, LV_EVENT_GESTURE, gesture_obj); - if(indev_reset_check(indev_act)) return; - } -} - -/** - * Checks if the reset_query flag has been set. If so, perform necessary global indev cleanup actions - * @param proc pointer to an input device 'proc' - * @return true if indev query should be immediately truncated. - */ -static bool indev_reset_check(lv_indev_t * indev) -{ - if(indev->reset_query) { - indev_obj_act = NULL; - } - - return indev->reset_query; -} - -/** - * Checks if the stop_processing_query flag has been set. If so, do not send any events to the object - * @param indev pointer to an input device - * @return true if indev should stop processing the event. - */ -static bool indev_stop_processing_check(lv_indev_t * indev) -{ - return indev->stop_processing_query; -} - -/** - * Reset the indev and send event to active obj and scroll obj - * @param indev pointer to an input device - * @param obj pointer to obj -*/ -static void indev_reset_core(lv_indev_t * indev, lv_obj_t * obj) -{ - lv_obj_t * act_obj = NULL; - lv_obj_t * scroll_obj = NULL; - - indev->reset_query = 1; - if(indev_act == indev) indev_obj_act = NULL; - if(indev->type == LV_INDEV_TYPE_POINTER || indev->type == LV_INDEV_TYPE_KEYPAD) { - if(obj == NULL || indev->pointer.last_pressed == obj) { - indev->pointer.last_pressed = NULL; - } - if(obj == NULL || indev->pointer.act_obj == obj) { - if(indev->pointer.act_obj) { - /* Avoid recursive calls */ - act_obj = indev->pointer.act_obj; - indev->pointer.act_obj = NULL; - lv_obj_send_event(act_obj, LV_EVENT_INDEV_RESET, indev); - lv_indev_send_event(indev, LV_EVENT_INDEV_RESET, act_obj); - act_obj = NULL; - } - } - if(obj == NULL || indev->pointer.last_obj == obj) { - indev->pointer.last_obj = NULL; - } - if(obj == NULL || indev->pointer.scroll_obj == obj) { - if(indev->pointer.scroll_obj) { - /* Avoid recursive calls */ - scroll_obj = indev->pointer.scroll_obj; - indev->pointer.scroll_obj = NULL; - lv_obj_send_event(scroll_obj, LV_EVENT_INDEV_RESET, indev); - lv_indev_send_event(indev, LV_EVENT_INDEV_RESET, act_obj); - scroll_obj = NULL; - } - } - if(obj == NULL || indev->pointer.last_hovered == obj) { - indev->pointer.last_hovered = NULL; - } - } -} - -static lv_result_t send_event(lv_event_code_t code, void * param) -{ - lv_indev_t * indev = indev_act; - - if(code == LV_EVENT_PRESSED || - code == LV_EVENT_SHORT_CLICKED || - code == LV_EVENT_CLICKED || - code == LV_EVENT_RELEASED || - code == LV_EVENT_LONG_PRESSED || - code == LV_EVENT_LONG_PRESSED_REPEAT || - code == LV_EVENT_ROTARY) { - lv_indev_send_event(indev, code, indev_obj_act); - if(indev_reset_check(indev)) return LV_RESULT_INVALID; - - if(indev_stop_processing_check(indev)) { - /* Not send event to the object if stop processing query is set */ - indev->stop_processing_query = 0; - return LV_RESULT_OK; - } - } - - lv_obj_send_event(indev_obj_act, code, param); - if(indev_reset_check(indev)) return LV_RESULT_INVALID; - - return LV_RESULT_OK; -} - -static void indev_scroll_throw_anim_cb(void * var, int32_t v) -{ - LV_ASSERT_NULL(var); - LV_UNUSED(v); - lv_indev_t * indev = (lv_indev_t *)var; - - lv_indev_scroll_throw_handler(indev); - - if(indev->pointer.scroll_dir == LV_DIR_NONE || indev->pointer.scroll_obj == NULL) { - if(indev->scroll_throw_anim) { - LV_LOG_INFO("stop animation"); - lv_anim_delete(indev, indev_scroll_throw_anim_cb); - } - } -} - -static void indev_scroll_throw_anim_completed_cb(lv_anim_t * anim) -{ - if(anim) { - indev_scroll_throw_anim_reset((lv_indev_t *)anim->var); - } -} - -static void indev_scroll_throw_anim_start(lv_indev_t * indev) -{ - LV_ASSERT_NULL(indev); - - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, indev); - lv_anim_set_duration(&a, 1024); - lv_anim_set_values(&a, 0, 1024); - lv_anim_set_exec_cb(&a, indev_scroll_throw_anim_cb); - lv_anim_set_completed_cb(&a, indev_scroll_throw_anim_completed_cb); - lv_anim_set_deleted_cb(&a, indev_scroll_throw_anim_completed_cb); - lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); - - indev->scroll_throw_anim = lv_anim_start(&a); -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev.h b/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev.h deleted file mode 100644 index 9b0ee45..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev.h +++ /dev/null @@ -1,413 +0,0 @@ -/** - * @file lv_indev.h - * - */ - -#ifndef LV_INDEV_H -#define LV_INDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../core/lv_group.h" -#include "../misc/lv_area.h" -#include "../misc/lv_timer.h" -#include "../misc/lv_event.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Possible input device types*/ -typedef enum { - LV_INDEV_TYPE_NONE, /**< Uninitialized state*/ - LV_INDEV_TYPE_POINTER, /**< Touch pad, mouse, external button*/ - LV_INDEV_TYPE_KEYPAD, /**< Keypad or keyboard*/ - LV_INDEV_TYPE_BUTTON, /**< External (hardware button) which is assigned to a specific point of the screen*/ - LV_INDEV_TYPE_ENCODER, /**< Encoder with only Left, Right turn and a Button*/ -} lv_indev_type_t; - -/** States for input devices*/ -typedef enum { - LV_INDEV_STATE_RELEASED = 0, - LV_INDEV_STATE_PRESSED -} lv_indev_state_t; - -typedef enum { - LV_INDEV_MODE_NONE = 0, - LV_INDEV_MODE_TIMER, - LV_INDEV_MODE_EVENT, -} lv_indev_mode_t; - -/** Data structure passed to an input driver to fill*/ -typedef struct { - lv_point_t point; /**< For LV_INDEV_TYPE_POINTER the currently pressed point*/ - uint32_t key; /**< For LV_INDEV_TYPE_KEYPAD the currently pressed key*/ - uint32_t btn_id; /**< For LV_INDEV_TYPE_BUTTON the currently pressed button*/ - int16_t enc_diff; /**< For LV_INDEV_TYPE_ENCODER number of steps since the previous read*/ - - lv_indev_state_t state; /**< LV_INDEV_STATE_RELEASED or LV_INDEV_STATE_PRESSED*/ - bool continue_reading; /**< If set to true, the read callback is invoked again, unless the device is in event-driven mode*/ -} lv_indev_data_t; - -typedef void (*lv_indev_read_cb_t)(lv_indev_t * indev, lv_indev_data_t * data); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an indev - * @return Pointer to the created indev or NULL when allocation failed - */ -lv_indev_t * lv_indev_create(void); - -/** - * Remove the provided input device. Make sure not to use the provided input device afterwards anymore. - * @param indev pointer to delete - */ -void lv_indev_delete(lv_indev_t * indev); - -/** - * Get the next input device. - * @param indev pointer to the current input device. NULL to initialize. - * @return the next input device or NULL if there are no more. Provide the first input device when - * the parameter is NULL - */ -lv_indev_t * lv_indev_get_next(lv_indev_t * indev); - -/** - * Read data from an input device. - * @param indev pointer to an input device - */ -void lv_indev_read(lv_indev_t * indev); - -/** - * Called periodically to read the input devices - * @param timer pointer to a timer to read - */ -void lv_indev_read_timer_cb(lv_timer_t * timer); - -/** - * Enable or disable one or all input devices (default enabled) - * @param indev pointer to an input device or NULL to enable/disable all of them - * @param enable true to enable, false to disable - */ -void lv_indev_enable(lv_indev_t * indev, bool enable); - -/** - * Get the currently processed input device. Can be used in action functions too. - * @return pointer to the currently processed input device or NULL if no input device processing - * right now - */ -lv_indev_t * lv_indev_active(void); - -/** - * Set the type of an input device - * @param indev pointer to an input device - * @param indev_type the type of the input device from `lv_indev_type_t` (`LV_INDEV_TYPE_...`) - */ -void lv_indev_set_type(lv_indev_t * indev, lv_indev_type_t indev_type); - -/** - * Set a callback function to read input device data to the indev - * @param indev pointer to an input device - * @param read_cb pointer to callback function to read input device data - */ -void lv_indev_set_read_cb(lv_indev_t * indev, lv_indev_read_cb_t read_cb); - -/** - * Set user data to the indev - * @param indev pointer to an input device - * @param user_data pointer to user data - */ -void lv_indev_set_user_data(lv_indev_t * indev, void * user_data); - -/** - * Set driver data to the indev - * @param indev pointer to an input device - * @param driver_data pointer to driver data - */ -void lv_indev_set_driver_data(lv_indev_t * indev, void * driver_data); - -/** - * Assign a display to the indev - * @param indev pointer to an input device - * @param disp pointer to an display - */ -void lv_indev_set_display(lv_indev_t * indev, struct lv_display_t * disp); - -/** - * Set long press time to indev - * @param indev pointer to input device - * @param long_press_time time long press time in ms - */ -void lv_indev_set_long_press_time(lv_indev_t * indev, uint16_t long_press_time); - -/** - * Set scroll limit to the input device - * @param indev pointer to an input device - * @param scroll_limit the number of pixels to slide before actually drag the object - */ -void lv_indev_set_scroll_limit(lv_indev_t * indev, uint8_t scroll_limit); - -/** - * Set scroll throw slow-down to the indev. Greater value means faster slow-down - * @param indev pointer to an input device - * @param scroll_throw the slow-down in [%] - */ -void lv_indev_set_scroll_throw(lv_indev_t * indev, uint8_t scroll_throw); - -/** - * Get the type of an input device - * @param indev pointer to an input device - * @return the type of the input device from `lv_hal_indev_type_t` (`LV_INDEV_TYPE_...`) - */ -lv_indev_type_t lv_indev_get_type(const lv_indev_t * indev); - -/** - * Get the callback function to read input device data to the indev - * @param indev pointer to an input device - * @return Pointer to callback function to read input device data or NULL if indev is NULL - */ -lv_indev_read_cb_t lv_indev_get_read_cb(lv_indev_t * indev); - -/** - * Get the indev state - * @param indev pointer to an input device - * @return Indev state or LV_INDEV_STATE_RELEASED if indev is NULL - */ -lv_indev_state_t lv_indev_get_state(const lv_indev_t * indev); - -/** - * Get the indev assigned group - * @param indev pointer to an input device - * @return Pointer to indev assigned group or NULL if indev is NULL - */ -lv_group_t * lv_indev_get_group(const lv_indev_t * indev); - -/** - * Get a pointer to the assigned display of the indev - * @param indev pointer to an input device - * @return pointer to the assigned display or NULL if indev is NULL - */ -lv_display_t * lv_indev_get_display(const lv_indev_t * indev); - -/** - * Get a pointer to the user data of the indev - * @param indev pointer to an input device - * @return pointer to the user data or NULL if indev is NULL - */ -void * lv_indev_get_user_data(const lv_indev_t * indev); - -/** - * Get a pointer to the driver data of the indev - * @param indev pointer to an input device - * @return pointer to the driver data or NULL if indev is NULL - */ -void * lv_indev_get_driver_data(const lv_indev_t * indev); - -/** - * Get whether indev is moved while pressed - * @param indev pointer to an input device - * @return true: indev is moved while pressed; false: indev is not moved while pressed - */ -bool lv_indev_get_press_moved(const lv_indev_t * indev); - -/** - * Reset one or all input devices - * @param indev pointer to an input device to reset or NULL to reset all of them - * @param obj pointer to an object which triggers the reset. - */ -void lv_indev_reset(lv_indev_t * indev, lv_obj_t * obj); - -/** - * Touch and key related events are sent to the input device first and to the widget after that. - * If this functions called in an indev event, the event won't be sent to the widget. - * @param indev pointer to an input device - */ -void lv_indev_stop_processing(lv_indev_t * indev); - -/** - * Reset the long press state of an input device - * @param indev pointer to an input device - */ -void lv_indev_reset_long_press(lv_indev_t * indev); - -/** - * Set a cursor for a pointer input device (for LV_INPUT_TYPE_POINTER and LV_INPUT_TYPE_BUTTON) - * @param indev pointer to an input device - * @param cur_obj pointer to an object to be used as cursor - */ -void lv_indev_set_cursor(lv_indev_t * indev, lv_obj_t * cur_obj); - -/** - * Set a destination group for a keypad input device (for LV_INDEV_TYPE_KEYPAD) - * @param indev pointer to an input device - * @param group pointer to a group - */ -void lv_indev_set_group(lv_indev_t * indev, lv_group_t * group); - -/** - * Set the an array of points for LV_INDEV_TYPE_BUTTON. - * These points will be assigned to the buttons to press a specific point on the screen - * @param indev pointer to an input device - * @param points array of points - */ -void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t points[]); - -/** - * Get the last point of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON) - * @param indev pointer to an input device - * @param point pointer to a point to store the result - */ -void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point); - -/** -* Get the current gesture direct -* @param indev pointer to an input device -* @return current gesture direct -*/ -lv_dir_t lv_indev_get_gesture_dir(const lv_indev_t * indev); - -/** - * Get the last pressed key of an input device (for LV_INDEV_TYPE_KEYPAD) - * @param indev pointer to an input device - * @return the last pressed key (0 on error) - */ -uint32_t lv_indev_get_key(const lv_indev_t * indev); - -/** - * Check the current scroll direction of an input device (for LV_INDEV_TYPE_POINTER and - * LV_INDEV_TYPE_BUTTON) - * @param indev pointer to an input device - * @return LV_DIR_NONE: no scrolling now - * LV_DIR_HOR/VER - */ -lv_dir_t lv_indev_get_scroll_dir(const lv_indev_t * indev); - -/** - * Get the currently scrolled object (for LV_INDEV_TYPE_POINTER and - * LV_INDEV_TYPE_BUTTON) - * @param indev pointer to an input device - * @return pointer to the currently scrolled object or NULL if no scrolling by this indev - */ -lv_obj_t * lv_indev_get_scroll_obj(const lv_indev_t * indev); - -/** - * Get the movement vector of an input device (for LV_INDEV_TYPE_POINTER and - * LV_INDEV_TYPE_BUTTON) - * @param indev pointer to an input device - * @param point pointer to a point to store the types.pointer.vector - */ -void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point); - -/** - * Do nothing until the next release - * @param indev pointer to an input device - */ -void lv_indev_wait_release(lv_indev_t * indev); - -/** - * Gets a pointer to the currently active object in the currently processed input device. - * @return pointer to currently active object or NULL if no active object - */ -lv_obj_t * lv_indev_get_active_obj(void); - -/** - * Get a pointer to the indev read timer to - * modify its parameters with `lv_timer_...` functions. - * @param indev pointer to an input device - * @return pointer to the indev read refresher timer. (NULL on error) - */ -lv_timer_t * lv_indev_get_read_timer(lv_indev_t * indev); - -/** -* Set the input device's event model: event-driven mode or timer mode. -* @param indev pointer to an input device -* @param mode the mode of input device -*/ -void lv_indev_set_mode(lv_indev_t * indev, lv_indev_mode_t mode); - -/** - * Get the input device's running mode. - * @param indev pointer to an input device - * @return the running mode for the specified input device. - */ -lv_indev_mode_t lv_indev_get_mode(lv_indev_t * indev); - -/** - * Search the most top, clickable object by a point - * @param obj pointer to a start object, typically the screen - * @param point pointer to a point for searching the most top child - * @return pointer to the found object or NULL if there was no suitable object - */ -lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point); - -/** - * Add an event handler to the indev - * @param indev pointer to an indev - * @param event_cb an event callback - * @param filter event code to react or `LV_EVENT_ALL` - * @param user_data optional user_data - */ -void lv_indev_add_event_cb(lv_indev_t * indev, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data); - -/** - * Get the number of event attached to an indev - * @param indev pointer to an indev - * @return number of events - */ -uint32_t lv_indev_get_event_count(lv_indev_t * indev); - -/** - * Get an event descriptor for an event - * @param indev pointer to an indev - * @param index the index of the event - * @return the event descriptor - */ -lv_event_dsc_t * lv_indev_get_event_dsc(lv_indev_t * indev, uint32_t index); - -/** - * Remove an event - * @param indev pointer to an indev - * @param index the index of the event to remove - * @return true: and event was removed; false: no event was removed - */ -bool lv_indev_remove_event(lv_indev_t * indev, uint32_t index); - -/** - * Remove an event_cb with user_data - * @param indev pointer to a indev - * @param event_cb the event_cb of the event to remove - * @param user_data user_data - * @return the count of the event removed - */ -uint32_t lv_indev_remove_event_cb_with_user_data(lv_indev_t * indev, lv_event_cb_t event_cb, void * user_data); - -/** - * Send an event to an indev - * @param indev pointer to an indev - * @param code an event code. LV_EVENT_... - * @param param optional param - * @return LV_RESULT_OK: indev wasn't deleted in the event. - */ -lv_result_t lv_indev_send_event(lv_indev_t * indev, lv_event_code_t code, void * param); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_INDEV_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev_private.h b/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev_private.h deleted file mode 100644 index a5fa231..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev_private.h +++ /dev/null @@ -1,134 +0,0 @@ -/** - * @file lv_indev_private.h - * - */ - -#ifndef LV_INDEV_PRIVATE_H -#define LV_INDEV_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_indev.h" -#include "../misc/lv_anim.h" -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_indev_t { - /** Input device type*/ - lv_indev_type_t type; - - /** Function pointer to read input device data.*/ - lv_indev_read_cb_t read_cb; - - lv_indev_state_t state; /**< Current state of the input device.*/ - lv_indev_mode_t mode; - - /*Flags*/ - uint8_t long_pr_sent : 1; - uint8_t reset_query : 1; - uint8_t enabled : 1; - uint8_t wait_until_release : 1; - uint8_t stop_processing_query : 1; - - uint32_t pr_timestamp; /**< Pressed time stamp*/ - uint32_t longpr_rep_timestamp; /**< Long press repeat time stamp*/ - - void * driver_data; - void * user_data; - - /**< Pointer to the assigned display*/ - lv_display_t * disp; - - /**< Timer to periodically read the input device*/ - lv_timer_t * read_timer; - - /**< Number of pixels to slide before actually drag the object*/ - uint8_t scroll_limit; - - /**< Drag throw slow-down in [%]. Greater value means faster slow-down*/ - uint8_t scroll_throw; - - /**< At least this difference should be between two points to evaluate as gesture*/ - uint8_t gesture_min_velocity; - - /**< At least this difference should be to send a gesture*/ - uint8_t gesture_limit; - - /**< Long press time in milliseconds*/ - uint16_t long_press_time; - - /**< Repeated trigger period in long press [ms]*/ - uint16_t long_press_repeat_time; - - /**< Rotary diff count will be multiplied by this value and divided by 256*/ - int32_t rotary_sensitivity; - - struct { - /*Pointer and button data*/ - lv_point_t act_point; /**< Current point of input device.*/ - lv_point_t last_point; /**< Last point of input device.*/ - lv_point_t last_raw_point; /**< Last point read from read_cb. */ - lv_point_t vect; /**< Difference between `act_point` and `last_point`.*/ - lv_point_t scroll_sum; /*Count the dragged pixels to check LV_INDEV_DEF_SCROLL_LIMIT*/ - lv_point_t scroll_throw_vect; - lv_point_t scroll_throw_vect_ori; - lv_obj_t * act_obj; /*The object being pressed*/ - lv_obj_t * last_obj; /*The last object which was pressed*/ - lv_obj_t * scroll_obj; /*The object being scrolled*/ - lv_obj_t * last_pressed; /*The lastly pressed object*/ - lv_obj_t * last_hovered; /*The lastly hovered object*/ - lv_area_t scroll_area; - lv_point_t gesture_sum; /*Count the gesture pixels to check LV_INDEV_DEF_GESTURE_LIMIT*/ - int32_t diff; - - /*Flags*/ - uint8_t scroll_dir : 4; - uint8_t gesture_dir : 4; - uint8_t gesture_sent : 1; - uint8_t press_moved : 1; - } pointer; - struct { - /*Keypad data*/ - lv_indev_state_t last_state; - uint32_t last_key; - } keypad; - - lv_obj_t * cursor; /**< Cursor for LV_INPUT_TYPE_POINTER*/ - lv_group_t * group; /**< Keypad destination group*/ - const lv_point_t * btn_points; /**< Array points assigned to the button ()screen will be pressed - here by the buttons*/ - lv_event_list_t event_list; - lv_anim_t * scroll_throw_anim; -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Find a scrollable object based on the current scroll vector in the indev. - * In handles scroll propagation to the parent if needed, and scroll directions too. - * @param indev pointer to an indev - * @return the found scrollable object or NULL if not found. - */ -lv_obj_t * lv_indev_find_scroll_obj(lv_indev_t * indev); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_INDEV_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev_scroll.c b/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev_scroll.c deleted file mode 100644 index f327865..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev_scroll.c +++ /dev/null @@ -1,733 +0,0 @@ -/** - * @file lv_indev_scroll.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../core/lv_obj_scroll_private.h" -#include "../core/lv_obj_private.h" -#include "lv_indev.h" -#include "lv_indev_private.h" -#include "lv_indev_scroll.h" - -/********************* - * DEFINES - *********************/ -#define ELASTIC_SLOWNESS_FACTOR 4 /*Scrolling on elastic parts are slower by this factor*/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void init_scroll_limits(lv_indev_t * indev); -static int32_t find_snap_point_x(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs); -static int32_t find_snap_point_y(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs); -static void scroll_limit_diff(lv_indev_t * indev, int32_t * diff_x, int32_t * diff_y); -static int32_t elastic_diff(lv_obj_t * scroll_obj, int32_t diff, int32_t scroll_start, int32_t scroll_end, - lv_dir_t dir); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_indev_scroll_handler(lv_indev_t * indev) -{ - if(indev->pointer.vect.x == 0 && indev->pointer.vect.y == 0) { - return; - } - - lv_obj_t * scroll_obj = indev->pointer.scroll_obj; - /*If there is no scroll object yet try to find one*/ - if(scroll_obj == NULL) { - scroll_obj = lv_indev_find_scroll_obj(indev); - if(scroll_obj == NULL) return; - - init_scroll_limits(indev); - - lv_obj_remove_state(indev->pointer.act_obj, LV_STATE_PRESSED); - lv_obj_send_event(scroll_obj, LV_EVENT_SCROLL_BEGIN, NULL); - if(indev->reset_query) return; - } - - /*Set new position or scroll if the vector is not zero*/ - int16_t angle = 0; - int16_t scale_x = 256; - int16_t scale_y = 256; - lv_obj_t * parent = scroll_obj; - while(parent) { - angle += lv_obj_get_style_transform_rotation(parent, 0); - int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, 0); - int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, 0); - scale_x = (scale_x * zoom_act_x) >> 8; - scale_y = (scale_y * zoom_act_y) >> 8; - parent = lv_obj_get_parent(parent); - } - - if(angle != 0 || scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { - angle = -angle; - scale_x = (256 * 256) / scale_x; - scale_y = (256 * 256) / scale_y; - lv_point_t pivot = { 0, 0 }; - lv_point_transform(&indev->pointer.vect, angle, scale_x, scale_y, &pivot, false); - } - - int32_t diff_x = 0; - int32_t diff_y = 0; - if(indev->pointer.scroll_dir == LV_DIR_HOR) { - int32_t sr = lv_obj_get_scroll_right(scroll_obj); - int32_t sl = lv_obj_get_scroll_left(scroll_obj); - diff_x = elastic_diff(scroll_obj, indev->pointer.vect.x, sl, sr, LV_DIR_HOR); - } - else { - int32_t st = lv_obj_get_scroll_top(scroll_obj); - int32_t sb = lv_obj_get_scroll_bottom(scroll_obj); - diff_y = elastic_diff(scroll_obj, indev->pointer.vect.y, st, sb, LV_DIR_VER); - } - - lv_dir_t scroll_dir = lv_obj_get_scroll_dir(scroll_obj); - if((scroll_dir & LV_DIR_LEFT) == 0 && diff_x > 0) diff_x = 0; - if((scroll_dir & LV_DIR_RIGHT) == 0 && diff_x < 0) diff_x = 0; - if((scroll_dir & LV_DIR_TOP) == 0 && diff_y > 0) diff_y = 0; - if((scroll_dir & LV_DIR_BOTTOM) == 0 && diff_y < 0) diff_y = 0; - - /*Respect the scroll limit area*/ - scroll_limit_diff(indev, &diff_x, &diff_y); - - lv_obj_scroll_by_raw(scroll_obj, diff_x, diff_y); - if(indev->reset_query) return; - indev->pointer.scroll_sum.x += diff_x; - indev->pointer.scroll_sum.y += diff_y; -} - -void lv_indev_scroll_throw_handler(lv_indev_t * indev) -{ - lv_obj_t * scroll_obj = indev->pointer.scroll_obj; - if(scroll_obj == NULL) return; - if(indev->pointer.scroll_dir == LV_DIR_NONE) return; - - int32_t scroll_throw = indev->scroll_throw; - - if(lv_obj_has_flag(scroll_obj, LV_OBJ_FLAG_SCROLL_MOMENTUM) == false) { - indev->pointer.scroll_throw_vect.y = 0; - indev->pointer.scroll_throw_vect.x = 0; - } - - lv_scroll_snap_t align_x = lv_obj_get_scroll_snap_x(scroll_obj); - lv_scroll_snap_t align_y = lv_obj_get_scroll_snap_y(scroll_obj); - - if(indev->pointer.scroll_dir == LV_DIR_VER) { - indev->pointer.scroll_throw_vect.x = 0; - /*If no snapping "throw"*/ - if(align_y == LV_SCROLL_SNAP_NONE) { - indev->pointer.scroll_throw_vect.y = - indev->pointer.scroll_throw_vect.y * (100 - scroll_throw) / 100; - - int32_t sb = lv_obj_get_scroll_bottom(scroll_obj); - int32_t st = lv_obj_get_scroll_top(scroll_obj); - - indev->pointer.scroll_throw_vect.y = elastic_diff(scroll_obj, indev->pointer.scroll_throw_vect.y, st, sb, - LV_DIR_VER); - - lv_obj_scroll_by_raw(scroll_obj, 0, indev->pointer.scroll_throw_vect.y); - if(indev->reset_query) return; - } - /*With snapping find the nearest snap point and scroll there*/ - else { - int32_t diff_y = lv_indev_scroll_throw_predict(indev, LV_DIR_VER); - indev->pointer.scroll_throw_vect.y = 0; - scroll_limit_diff(indev, NULL, &diff_y); - int32_t y = find_snap_point_y(scroll_obj, LV_COORD_MIN, LV_COORD_MAX, diff_y); - lv_obj_scroll_by(scroll_obj, 0, diff_y + y, LV_ANIM_ON); - if(indev->reset_query) return; - } - } - else if(indev->pointer.scroll_dir == LV_DIR_HOR) { - indev->pointer.scroll_throw_vect.y = 0; - /*If no snapping "throw"*/ - if(align_x == LV_SCROLL_SNAP_NONE) { - indev->pointer.scroll_throw_vect.x = - indev->pointer.scroll_throw_vect.x * (100 - scroll_throw) / 100; - - int32_t sl = lv_obj_get_scroll_left(scroll_obj); - int32_t sr = lv_obj_get_scroll_right(scroll_obj); - - indev->pointer.scroll_throw_vect.x = elastic_diff(scroll_obj, indev->pointer.scroll_throw_vect.x, sl, sr, - LV_DIR_HOR); - - lv_obj_scroll_by_raw(scroll_obj, indev->pointer.scroll_throw_vect.x, 0); - if(indev->reset_query) return; - } - /*With snapping find the nearest snap point and scroll there*/ - else { - int32_t diff_x = lv_indev_scroll_throw_predict(indev, LV_DIR_HOR); - indev->pointer.scroll_throw_vect.x = 0; - scroll_limit_diff(indev, &diff_x, NULL); - int32_t x = find_snap_point_x(scroll_obj, LV_COORD_MIN, LV_COORD_MAX, diff_x); - lv_obj_scroll_by(scroll_obj, x + diff_x, 0, LV_ANIM_ON); - if(indev->reset_query) return; - } - } - - /*Check if the scroll has finished*/ - if(indev->pointer.scroll_throw_vect.x == 0 && indev->pointer.scroll_throw_vect.y == 0) { - /*Revert if scrolled in*/ - /*If vertically scrollable and not controlled by snap*/ - if(align_y == LV_SCROLL_SNAP_NONE) { - int32_t st = lv_obj_get_scroll_top(scroll_obj); - int32_t sb = lv_obj_get_scroll_bottom(scroll_obj); - if(st > 0 || sb > 0) { - if(st < 0) { - lv_obj_scroll_by(scroll_obj, 0, st, LV_ANIM_ON); - if(indev->reset_query) return; - } - else if(sb < 0) { - lv_obj_scroll_by(scroll_obj, 0, -sb, LV_ANIM_ON); - if(indev->reset_query) return; - } - } - } - - /*If horizontally scrollable and not controlled by snap*/ - if(align_x == LV_SCROLL_SNAP_NONE) { - int32_t sl = lv_obj_get_scroll_left(scroll_obj); - int32_t sr = lv_obj_get_scroll_right(scroll_obj); - if(sl > 0 || sr > 0) { - if(sl < 0) { - lv_obj_scroll_by(scroll_obj, sl, 0, LV_ANIM_ON); - if(indev->reset_query) return; - } - else if(sr < 0) { - lv_obj_scroll_by(scroll_obj, -sr, 0, LV_ANIM_ON); - if(indev->reset_query) return; - } - } - } - - lv_obj_send_event(scroll_obj, LV_EVENT_SCROLL_END, indev); - if(indev->reset_query) return; - - indev->pointer.scroll_dir = LV_DIR_NONE; - indev->pointer.scroll_obj = NULL; - } -} - -int32_t lv_indev_scroll_throw_predict(lv_indev_t * indev, lv_dir_t dir) -{ - if(indev == NULL) return 0; - int32_t v; - switch(dir) { - case LV_DIR_VER: - v = indev->pointer.scroll_throw_vect_ori.y; - break; - case LV_DIR_HOR: - v = indev->pointer.scroll_throw_vect_ori.x; - break; - default: - return 0; - } - - int32_t scroll_throw = indev->scroll_throw; - int32_t sum = 0; - while(v) { - sum += v; - v = v * (100 - scroll_throw) / 100; - } - - return sum; -} - -void lv_indev_scroll_get_snap_dist(lv_obj_t * obj, lv_point_t * p) -{ - p->x = find_snap_point_x(obj, obj->coords.x1, obj->coords.x2, 0); - p->y = find_snap_point_y(obj, obj->coords.y1, obj->coords.y2, 0); -} - -lv_obj_t * lv_indev_find_scroll_obj(lv_indev_t * indev) -{ - lv_obj_t * obj_candidate = NULL; - lv_dir_t dir_candidate = LV_DIR_NONE; - int32_t scroll_limit = indev->scroll_limit; - - /*Go until find a scrollable object in the current direction - *More precisely: - * 1. Check the pressed object and all of its ancestors and try to find an object which is scrollable - * 2. Scrollable means it has some content out of its area - * 3. If an object can be scrolled into the current direction then use it ("real match"") - * 4. If can be scrolled on the current axis (hor/ver) save it as candidate (at least show an elastic scroll effect) - * 5. Use the last candidate. Always the "deepest" parent or the object from point 3*/ - lv_obj_t * obj_act = indev->pointer.act_obj; - - /*Decide if it's a horizontal or vertical scroll*/ - bool hor_en = false; - bool ver_en = false; - indev->pointer.scroll_sum.x += indev->pointer.vect.x; - indev->pointer.scroll_sum.y += indev->pointer.vect.y; - - while(obj_act) { - /*Get the transformed scroll_sum with this object*/ - int16_t angle = 0; - int32_t scale_x = 256; - int32_t scale_y = 256; - lv_point_t pivot = { 0, 0 }; - lv_obj_t * parent = obj_act; - while(parent) { - angle += lv_obj_get_style_transform_rotation(parent, 0); - int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, 0); - int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, 0); - scale_x = (scale_x * zoom_act_x) >> 8; - scale_y = (scale_y * zoom_act_y) >> 8; - parent = lv_obj_get_parent(parent); - } - - lv_point_t obj_scroll_sum = indev->pointer.scroll_sum; - if(angle != 0 || scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { - angle = -angle; - scale_x = (256 * 256) / scale_x; - scale_y = (256 * 256) / scale_y; - lv_point_transform(&obj_scroll_sum, angle, scale_x, scale_y, &pivot, false); - } - - if(LV_ABS(obj_scroll_sum.x) > LV_ABS(obj_scroll_sum.y)) { - hor_en = true; - } - else { - ver_en = true; - } - - if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLLABLE) == false) { - /*If this object don't want to chain the scroll to the parent stop searching*/ - if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_HOR) == false && hor_en) break; - if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_VER) == false && ver_en) break; - - obj_act = lv_obj_get_parent(obj_act); - continue; - } - - /*Consider both up-down or left/right scrollable according to the current direction*/ - bool up_en = ver_en; - bool down_en = ver_en; - bool left_en = hor_en; - bool right_en = hor_en; - - /*The object might have disabled some directions.*/ - lv_dir_t scroll_dir = lv_obj_get_scroll_dir(obj_act); - if((scroll_dir & LV_DIR_LEFT) == 0) left_en = false; - if((scroll_dir & LV_DIR_RIGHT) == 0) right_en = false; - if((scroll_dir & LV_DIR_TOP) == 0) up_en = false; - if((scroll_dir & LV_DIR_BOTTOM) == 0) down_en = false; - - /*The object is scrollable to a direction if its content overflow in that direction. - *If there are at least 2 snapable children always assume - *scrolling to allow scrolling to the other child*/ - uint32_t snap_cnt = 0; - - /*Horizontal scroll*/ - int32_t sl = 0; - int32_t sr = 0; - lv_scroll_snap_t snap_x = lv_obj_get_scroll_snap_x(obj_act); - if(snap_x != LV_SCROLL_SNAP_NONE) { - uint32_t child_cnt = lv_obj_get_child_count(obj_act); - uint32_t i; - for(i = 0; i < child_cnt; i++) { - if(lv_obj_has_flag(lv_obj_get_child(obj_act, i), LV_OBJ_FLAG_SNAPPABLE)) { - snap_cnt++; - if(snap_cnt == 2) { - sl = 1; /*Assume scrolling*/ - sr = 1; - break; - } - } - } - } - if(snap_x == LV_SCROLL_SNAP_NONE || snap_cnt < 2) { - sl = lv_obj_get_scroll_left(obj_act); - sr = lv_obj_get_scroll_right(obj_act); - } - - /*Vertical scroll*/ - snap_cnt = 0; - int32_t st = 0; - int32_t sb = 0; - lv_scroll_snap_t snap_y = lv_obj_get_scroll_snap_y(obj_act); - if(snap_y != LV_SCROLL_SNAP_NONE) { - uint32_t child_cnt = lv_obj_get_child_count(obj_act); - uint32_t i; - for(i = 0; i < child_cnt; i++) { - if(lv_obj_has_flag(lv_obj_get_child(obj_act, i), LV_OBJ_FLAG_SNAPPABLE)) { - snap_cnt++; - if(snap_cnt == 2) { - st = 1; /*Assume scrolling*/ - sb = 1; - break; - } - } - } - } - if(snap_y == LV_SCROLL_SNAP_NONE || snap_cnt < 2) { - st = lv_obj_get_scroll_top(obj_act); - sb = lv_obj_get_scroll_bottom(obj_act); - } - - - /*If this object is scrollable into the current scroll direction then save it as a candidate. - *It's important only to be scrollable on the current axis (hor/ver) because if the scroll - *is propagated to this object it can show at least elastic scroll effect. - *But if not hor/ver scrollable do not scroll it at all (so it's not a good candidate)*/ - if((st > 0 || sb > 0) && - ((up_en && obj_scroll_sum.y >= scroll_limit) || - (down_en && obj_scroll_sum.y <= - scroll_limit))) { - obj_candidate = obj_act; - dir_candidate = LV_DIR_VER; - } - - if((sl > 0 || sr > 0) && - ((left_en && obj_scroll_sum.x >= scroll_limit) || - (right_en && obj_scroll_sum.x <= - scroll_limit))) { - obj_candidate = obj_act; - dir_candidate = LV_DIR_HOR; - } - - if(st <= 0) up_en = false; - if(sb <= 0) down_en = false; - if(sl <= 0) left_en = false; - if(sr <= 0) right_en = false; - - /*If the object really can be scrolled into the current direction then use it.*/ - if((left_en && obj_scroll_sum.x >= scroll_limit) || - (right_en && obj_scroll_sum.x <= - scroll_limit) || - (up_en && obj_scroll_sum.y >= scroll_limit) || - (down_en && obj_scroll_sum.y <= - scroll_limit)) { - indev->pointer.scroll_dir = hor_en ? LV_DIR_HOR : LV_DIR_VER; - break; - } - - /*If this object don't want to chain the scroll to the parent stop searching*/ - if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_HOR) == false && hor_en) break; - if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_VER) == false && ver_en) break; - - /*Try the parent*/ - obj_act = lv_obj_get_parent(obj_act); - } - - /*Use the last candidate*/ - if(obj_candidate) { - indev->pointer.scroll_dir = dir_candidate; - indev->pointer.scroll_obj = obj_candidate; - indev->pointer.scroll_sum.x = 0; - indev->pointer.scroll_sum.y = 0; - } - - return obj_candidate; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void init_scroll_limits(lv_indev_t * indev) -{ - lv_obj_t * obj = indev->pointer.scroll_obj; - /*If there no STOP allow scrolling anywhere*/ - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLL_ONE) == false) { - lv_area_set(&indev->pointer.scroll_area, LV_COORD_MIN, LV_COORD_MIN, LV_COORD_MAX, LV_COORD_MAX); - } - /*With STOP limit the scrolling to the perv and next snap point*/ - else { - switch(lv_obj_get_scroll_snap_y(obj)) { - case LV_SCROLL_SNAP_START: - indev->pointer.scroll_area.y1 = find_snap_point_y(obj, obj->coords.y1 + 1, LV_COORD_MAX, 0); - indev->pointer.scroll_area.y2 = find_snap_point_y(obj, LV_COORD_MIN, obj->coords.y1 - 1, 0); - break; - case LV_SCROLL_SNAP_END: - indev->pointer.scroll_area.y1 = find_snap_point_y(obj, obj->coords.y2, LV_COORD_MAX, 0); - indev->pointer.scroll_area.y2 = find_snap_point_y(obj, LV_COORD_MIN, obj->coords.y2, 0); - break; - case LV_SCROLL_SNAP_CENTER: { - int32_t y_mid = obj->coords.y1 + lv_area_get_height(&obj->coords) / 2; - indev->pointer.scroll_area.y1 = find_snap_point_y(obj, y_mid + 1, LV_COORD_MAX, 0); - indev->pointer.scroll_area.y2 = find_snap_point_y(obj, LV_COORD_MIN, y_mid - 1, 0); - break; - } - default: - indev->pointer.scroll_area.y1 = LV_COORD_MIN; - indev->pointer.scroll_area.y2 = LV_COORD_MAX; - break; - } - - switch(lv_obj_get_scroll_snap_x(obj)) { - case LV_SCROLL_SNAP_START: - indev->pointer.scroll_area.x1 = find_snap_point_x(obj, obj->coords.x1, LV_COORD_MAX, 0); - indev->pointer.scroll_area.x2 = find_snap_point_x(obj, LV_COORD_MIN, obj->coords.x1, 0); - break; - case LV_SCROLL_SNAP_END: - indev->pointer.scroll_area.x1 = find_snap_point_x(obj, obj->coords.x2, LV_COORD_MAX, 0); - indev->pointer.scroll_area.x2 = find_snap_point_x(obj, LV_COORD_MIN, obj->coords.x2, 0); - break; - case LV_SCROLL_SNAP_CENTER: { - int32_t x_mid = obj->coords.x1 + lv_area_get_width(&obj->coords) / 2; - indev->pointer.scroll_area.x1 = find_snap_point_x(obj, x_mid + 1, LV_COORD_MAX, 0); - indev->pointer.scroll_area.x2 = find_snap_point_x(obj, LV_COORD_MIN, x_mid - 1, 0); - break; - } - default: - indev->pointer.scroll_area.x1 = LV_COORD_MIN; - indev->pointer.scroll_area.x2 = LV_COORD_MAX; - break; - } - } - - /*`find_snap_point_x/y()` return LV_COORD_MAX is not snap point was found, - *but x1/y1 should be small. */ - if(indev->pointer.scroll_area.x1 == LV_COORD_MAX) indev->pointer.scroll_area.x1 = LV_COORD_MIN; - if(indev->pointer.scroll_area.y1 == LV_COORD_MAX) indev->pointer.scroll_area.y1 = LV_COORD_MIN; - - /*Allow scrolling on the edges. It will be reverted to the edge due to snapping anyway*/ - if(indev->pointer.scroll_area.x1 == 0) indev->pointer.scroll_area.x1 = LV_COORD_MIN; - if(indev->pointer.scroll_area.x2 == 0) indev->pointer.scroll_area.x2 = LV_COORD_MAX; - if(indev->pointer.scroll_area.y1 == 0) indev->pointer.scroll_area.y1 = LV_COORD_MIN; - if(indev->pointer.scroll_area.y2 == 0) indev->pointer.scroll_area.y2 = LV_COORD_MAX; -} - -/** - * Search for snap point in the min..max range. - * @param obj the object on which snap point should be found - * @param min ignore snap points smaller than this. (Absolute coordinate) - * @param max ignore snap points greater than this. (Absolute coordinate) - * @param ofs offset to snap points. Useful the get a snap point in an imagined case - * what if children are already moved by this value - * @return the absolute x coordinate of the nearest snap point - * or `LV_COORD_MAX` if there is no snap point in the min..max range - */ -static int32_t find_snap_point_x(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs) -{ - lv_scroll_snap_t align = lv_obj_get_scroll_snap_x(obj); - if(align == LV_SCROLL_SNAP_NONE) return LV_COORD_MAX; - - int32_t dist = LV_COORD_MAX; - - int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t pad_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - - uint32_t i; - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; - if(lv_obj_has_flag(child, LV_OBJ_FLAG_SNAPPABLE)) { - int32_t x_child = 0; - int32_t x_parent = 0; - switch(align) { - case LV_SCROLL_SNAP_START: - x_child = child->coords.x1; - x_parent = obj->coords.x1 + pad_left; - break; - case LV_SCROLL_SNAP_END: - x_child = child->coords.x2; - x_parent = obj->coords.x2 - pad_right; - break; - case LV_SCROLL_SNAP_CENTER: - x_child = child->coords.x1 + lv_area_get_width(&child->coords) / 2; - x_parent = obj->coords.x1 + pad_left + (lv_area_get_width(&obj->coords) - pad_left - pad_right) / 2; - break; - default: - continue; - } - - x_child += ofs; - if(x_child >= min && x_child <= max) { - int32_t x = x_child - x_parent; - if(LV_ABS(x) < LV_ABS(dist)) dist = x; - } - } - } - - return dist == LV_COORD_MAX ? LV_COORD_MAX : -dist; -} - -/** - * Search for snap point in the min..max range. - * @param obj the object on which snap point should be found - * @param min ignore snap points smaller than this. (Absolute coordinate) - * @param max ignore snap points greater than this. (Absolute coordinate) - * @param ofs offset to snap points. Useful to get a snap point in an imagined case - * what if children are already moved by this value - * @return the absolute y coordinate of the nearest snap point - * or `LV_COORD_MAX` if there is no snap point in the min..max range - */ -static int32_t find_snap_point_y(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs) -{ - lv_scroll_snap_t align = lv_obj_get_scroll_snap_y(obj); - if(align == LV_SCROLL_SNAP_NONE) return LV_COORD_MAX; - - int32_t dist = LV_COORD_MAX; - - int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - int32_t pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - - uint32_t i; - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = obj->spec_attr->children[i]; - if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; - if(lv_obj_has_flag(child, LV_OBJ_FLAG_SNAPPABLE)) { - int32_t y_child = 0; - int32_t y_parent = 0; - switch(align) { - case LV_SCROLL_SNAP_START: - y_child = child->coords.y1; - y_parent = obj->coords.y1 + pad_top; - break; - case LV_SCROLL_SNAP_END: - y_child = child->coords.y2; - y_parent = obj->coords.y2 - pad_bottom; - break; - case LV_SCROLL_SNAP_CENTER: - y_child = child->coords.y1 + lv_area_get_height(&child->coords) / 2; - y_parent = obj->coords.y1 + pad_top + (lv_area_get_height(&obj->coords) - pad_top - pad_bottom) / 2; - break; - default: - continue; - } - - y_child += ofs; - if(y_child >= min && y_child <= max) { - int32_t y = y_child - y_parent; - if(LV_ABS(y) < LV_ABS(dist)) dist = y; - } - } - } - - return dist == LV_COORD_MAX ? LV_COORD_MAX : -dist; -} - -static void scroll_limit_diff(lv_indev_t * indev, int32_t * diff_x, int32_t * diff_y) -{ - if(diff_y) { - if(indev->pointer.scroll_sum.y + *diff_y < indev->pointer.scroll_area.y1) { - *diff_y = indev->pointer.scroll_area.y1 - indev->pointer.scroll_sum.y; - } - - if(indev->pointer.scroll_sum.y + *diff_y > indev->pointer.scroll_area.y2) { - *diff_y = indev->pointer.scroll_area.y2 - indev->pointer.scroll_sum.y; - } - } - - if(diff_x) { - if(indev->pointer.scroll_sum.x + *diff_x < indev->pointer.scroll_area.x1) { - *diff_x = indev->pointer.scroll_area.x1 - indev->pointer.scroll_sum.x; - } - - if(indev->pointer.scroll_sum.x + *diff_x > indev->pointer.scroll_area.x2) { - *diff_x = indev->pointer.scroll_area.x2 - indev->pointer.scroll_sum.x; - } - } -} - -static int32_t elastic_diff(lv_obj_t * scroll_obj, int32_t diff, int32_t scroll_start, int32_t scroll_end, - lv_dir_t dir) -{ - /*Scroll back to the edge if required*/ - if(!lv_obj_has_flag(scroll_obj, LV_OBJ_FLAG_SCROLL_ELASTIC)) { - if(scroll_end + diff < 0) diff = - scroll_end; - if(scroll_start - diff < 0) diff = scroll_start; - } - /*Handle elastic scrolling*/ - else { - /*If there is snapping in the current direction don't use the elastic factor because - *it's natural that the first and last items are scrolled (snapped) in.*/ - lv_scroll_snap_t snap; - snap = dir == LV_DIR_HOR ? lv_obj_get_scroll_snap_x(scroll_obj) : lv_obj_get_scroll_snap_y(scroll_obj); - - bool no_more_start_snap = false; - bool no_more_end_snap = false; - - /*Without snapping just scale down the diff is scrolled out*/ - if(snap == LV_SCROLL_SNAP_NONE) { - if(scroll_end < 0 || scroll_start < 0) { - /*Rounding*/ - if(diff < 0) diff -= ELASTIC_SLOWNESS_FACTOR / 2; - if(diff > 0) diff += ELASTIC_SLOWNESS_FACTOR / 2; - diff = diff / ELASTIC_SLOWNESS_FACTOR; - } - } - /*With snapping the widget is scrolled out if there are no more snap points*/ - else { - if(dir == LV_DIR_HOR) { - int32_t x = 0; - switch(snap) { - case LV_SCROLL_SNAP_CENTER: { - int32_t pad_left = lv_obj_get_style_pad_left(scroll_obj, 0); - int32_t pad_right = lv_obj_get_style_pad_right(scroll_obj, 0); - x = scroll_obj->coords.x1; - x += (lv_area_get_width(&scroll_obj->coords) - pad_left - pad_right) / 2; - x += pad_left; - } - break; - case LV_SCROLL_SNAP_START: - x = scroll_obj->coords.x1 + lv_obj_get_style_pad_left(scroll_obj, 0); - break; - case LV_SCROLL_SNAP_END: - x = scroll_obj->coords.x2 - lv_obj_get_style_pad_right(scroll_obj, 0); - break; - default: - break; - } - int32_t d; - d = find_snap_point_x(scroll_obj, x + 1, LV_COORD_MAX, 0); - if(d == LV_COORD_MAX) no_more_end_snap = true; - d = find_snap_point_x(scroll_obj, LV_COORD_MIN, x, 0); - if(d == LV_COORD_MAX) no_more_start_snap = true; - } - else { - int32_t y = 0; - switch(snap) { - case LV_SCROLL_SNAP_CENTER: { - int32_t pad_top = lv_obj_get_style_pad_top(scroll_obj, 0); - int32_t pad_bottom = lv_obj_get_style_pad_bottom(scroll_obj, 0); - y = scroll_obj->coords.y1; - y += (lv_area_get_height(&scroll_obj->coords) - pad_top - pad_bottom) / 2; - y += pad_top; - } - break; - case LV_SCROLL_SNAP_START: - y = scroll_obj->coords.y1 + lv_obj_get_style_pad_top(scroll_obj, 0); - break; - case LV_SCROLL_SNAP_END: - y = scroll_obj->coords.y2 - lv_obj_get_style_pad_bottom(scroll_obj, 0); - break; - default: - break; - } - int32_t d; - d = find_snap_point_y(scroll_obj, y, LV_COORD_MAX, 0); - if(d == LV_COORD_MAX) no_more_end_snap = true; - d = find_snap_point_y(scroll_obj, LV_COORD_MIN, y, 0); - if(d == LV_COORD_MAX) no_more_start_snap = true; - } - } - - if(no_more_start_snap || no_more_end_snap) { - if(diff < 0) diff -= ELASTIC_SLOWNESS_FACTOR / 2; - if(diff > 0) diff += ELASTIC_SLOWNESS_FACTOR / 2; - return diff / ELASTIC_SLOWNESS_FACTOR; - } - else { - return diff; - } - } - - return diff; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev_scroll.h b/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev_scroll.h deleted file mode 100644 index 413376f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/indev/lv_indev_scroll.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @file lv_indev_scroll.h - * - */ - -#ifndef LV_INDEV_SCROLL_H -#define LV_INDEV_SCROLL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Handle scrolling. Called by LVGL during input device processing - * @param indev pointer to an input device - */ -void lv_indev_scroll_handler(lv_indev_t * indev); - -/** - * Handle throwing after scrolling. Called by LVGL during input device processing - * @param indev pointer to an input device - */ -void lv_indev_scroll_throw_handler(lv_indev_t * indev); - -/** - * Predict where would a scroll throw end - * @param indev pointer to an input device - * @param dir ` LV_DIR_VER` or `LV_DIR_HOR` - * @return the difference compared to the current position when the throw would be finished - */ -int32_t lv_indev_scroll_throw_predict(lv_indev_t * indev, lv_dir_t dir); - -/** - * Get the distance of the nearest snap point - * @param obj the object on which snap points should be found - * @param p save the distance of the found snap point there - */ -void lv_indev_scroll_get_snap_dist(lv_obj_t * obj, lv_point_t * p); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_INDEV_SCROLL_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/layouts/flex/lv_flex.c b/software/Power_Pico/Middlewares/LVGL/src/layouts/flex/lv_flex.c deleted file mode 100644 index 2af3bf3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/layouts/flex/lv_flex.c +++ /dev/null @@ -1,536 +0,0 @@ -/** - * @file lv_flex.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_flex.h" -#include "../lv_layout.h" -#include "../../core/lv_obj_private.h" - -#if LV_USE_FLEX - -#include "../../core/lv_global.h" -/********************* - * DEFINES - *********************/ -#define layout_list_def LV_GLOBAL_DEFAULT()->layout_list - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_flex_align_t main_place; - lv_flex_align_t cross_place; - lv_flex_align_t track_place; - uint8_t row : 1; - uint8_t wrap : 1; - uint8_t rev : 1; -} flex_t; - -typedef struct { - lv_obj_t * item; - int32_t min_size; - int32_t max_size; - int32_t final_size; - uint32_t grow_value; - uint32_t clamped : 1; -} grow_dsc_t; - -typedef struct { - int32_t track_cross_size; - int32_t track_main_size; /*For all items*/ - int32_t track_fix_main_size; /*For non grow items*/ - uint32_t item_cnt; - grow_dsc_t * grow_dsc; - uint32_t grow_item_cnt; - uint32_t grow_dsc_calc : 1; -} track_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void flex_update(lv_obj_t * cont, void * user_data); -static int32_t find_track_end(lv_obj_t * cont, flex_t * f, int32_t item_start_id, int32_t max_main_size, - int32_t item_gap, track_t * t); -static void children_repos(lv_obj_t * cont, flex_t * f, int32_t item_first_id, int32_t item_last_id, int32_t abs_x, - int32_t abs_y, int32_t max_main_size, int32_t item_gap, track_t * t); -static void place_content(lv_flex_align_t place, int32_t max_size, int32_t content_size, int32_t item_cnt, - int32_t * start_pos, int32_t * gap); -static lv_obj_t * get_next_item(lv_obj_t * cont, bool rev, int32_t * item_id); -static int32_t lv_obj_get_width_with_margin(const lv_obj_t * obj); -static int32_t lv_obj_get_height_with_margin(const lv_obj_t * obj); - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ -#if LV_USE_LOG && LV_LOG_TRACE_LAYOUT - #define LV_TRACE_LAYOUT(...) LV_LOG_TRACE(__VA_ARGS__) -#else - #define LV_TRACE_LAYOUT(...) -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/*===================== - * Setter functions - *====================*/ - -void lv_flex_init(void) -{ - layout_list_def[LV_LAYOUT_FLEX].cb = flex_update; - layout_list_def[LV_LAYOUT_FLEX].user_data = NULL; -} - -void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow) -{ - lv_obj_set_style_flex_flow(obj, flow, 0); - lv_obj_set_style_layout(obj, LV_LAYOUT_FLEX, 0); -} - -void lv_obj_set_flex_align(lv_obj_t * obj, lv_flex_align_t main_place, lv_flex_align_t cross_place, - lv_flex_align_t track_place) -{ - lv_obj_set_style_flex_main_place(obj, main_place, 0); - lv_obj_set_style_flex_cross_place(obj, cross_place, 0); - lv_obj_set_style_flex_track_place(obj, track_place, 0); - lv_obj_set_style_layout(obj, LV_LAYOUT_FLEX, 0); -} - -void lv_obj_set_flex_grow(lv_obj_t * obj, uint8_t grow) -{ - lv_obj_set_style_flex_grow(obj, grow, 0); - lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void flex_update(lv_obj_t * cont, void * user_data) -{ - LV_LOG_INFO("update %p container", (void *)cont); - LV_UNUSED(user_data); - - flex_t f; - lv_flex_flow_t flow = lv_obj_get_style_flex_flow(cont, LV_PART_MAIN); - f.row = flow & LV_FLEX_COLUMN ? 0 : 1; - f.wrap = flow & LV_FLEX_WRAP ? 1 : 0; - f.rev = flow & LV_FLEX_REVERSE ? 1 : 0; - f.main_place = lv_obj_get_style_flex_main_place(cont, LV_PART_MAIN); - f.cross_place = lv_obj_get_style_flex_cross_place(cont, LV_PART_MAIN); - f.track_place = lv_obj_get_style_flex_track_place(cont, LV_PART_MAIN); - - bool rtl = lv_obj_get_style_base_dir(cont, LV_PART_MAIN) == LV_BASE_DIR_RTL; - int32_t track_gap = !f.row ? lv_obj_get_style_pad_column(cont, LV_PART_MAIN) : lv_obj_get_style_pad_row(cont, - LV_PART_MAIN); - int32_t item_gap = f.row ? lv_obj_get_style_pad_column(cont, LV_PART_MAIN) : lv_obj_get_style_pad_row(cont, - LV_PART_MAIN); - int32_t max_main_size = (f.row ? lv_obj_get_content_width(cont) : lv_obj_get_content_height(cont)); - int32_t abs_y = cont->coords.y1 + lv_obj_get_style_space_top(cont, - LV_PART_MAIN) - lv_obj_get_scroll_y(cont); - int32_t abs_x = cont->coords.x1 + lv_obj_get_style_space_left(cont, - LV_PART_MAIN) - lv_obj_get_scroll_x(cont); - - lv_flex_align_t track_cross_place = f.track_place; - int32_t * cross_pos = (f.row ? &abs_y : &abs_x); - - int32_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); - int32_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); - - /*Content sized objects should squeeze the gap between the children, therefore any alignment will look like `START`*/ - if((f.row && h_set == LV_SIZE_CONTENT && cont->h_layout == 0) || - (!f.row && w_set == LV_SIZE_CONTENT && cont->w_layout == 0)) { - track_cross_place = LV_FLEX_ALIGN_START; - } - - if(rtl && !f.row) { - if(track_cross_place == LV_FLEX_ALIGN_START) track_cross_place = LV_FLEX_ALIGN_END; - else if(track_cross_place == LV_FLEX_ALIGN_END) track_cross_place = LV_FLEX_ALIGN_START; - } - - int32_t total_track_cross_size = 0; - int32_t gap = 0; - uint32_t track_cnt = 0; - int32_t track_first_item; - int32_t next_track_first_item; - - if(track_cross_place != LV_FLEX_ALIGN_START) { - track_first_item = f.rev ? cont->spec_attr->child_cnt - 1 : 0; - track_t t; - while(track_first_item < (int32_t)cont->spec_attr->child_cnt && track_first_item >= 0) { - /*Search the first item of the next row*/ - t.grow_dsc_calc = 0; - next_track_first_item = find_track_end(cont, &f, track_first_item, max_main_size, item_gap, &t); - total_track_cross_size += t.track_cross_size + track_gap; - track_cnt++; - track_first_item = next_track_first_item; - } - - if(track_cnt) total_track_cross_size -= track_gap; /*No gap after the last track*/ - - /*Place the tracks to get the start position*/ - int32_t max_cross_size = (f.row ? lv_obj_get_content_height(cont) : lv_obj_get_content_width(cont)); - place_content(track_cross_place, max_cross_size, total_track_cross_size, track_cnt, cross_pos, &gap); - } - - track_first_item = f.rev ? cont->spec_attr->child_cnt - 1 : 0; - - if(rtl && !f.row) { - *cross_pos += total_track_cross_size; - } - - while(track_first_item < (int32_t)cont->spec_attr->child_cnt && track_first_item >= 0) { - track_t t; - t.grow_dsc_calc = 1; - /*Search the first item of the next row*/ - next_track_first_item = find_track_end(cont, &f, track_first_item, max_main_size, item_gap, &t); - - if(rtl && !f.row) { - *cross_pos -= t.track_cross_size; - } - children_repos(cont, &f, track_first_item, next_track_first_item, abs_x, abs_y, max_main_size, item_gap, &t); - track_first_item = next_track_first_item; - lv_free(t.grow_dsc); - t.grow_dsc = NULL; - if(rtl && !f.row) { - *cross_pos -= gap + track_gap; - } - else { - *cross_pos += t.track_cross_size + gap + track_gap; - } - } - LV_ASSERT_MEM_INTEGRITY(); - - if(w_set == LV_SIZE_CONTENT || h_set == LV_SIZE_CONTENT) { - lv_obj_refr_size(cont); - } - - lv_obj_send_event(cont, LV_EVENT_LAYOUT_CHANGED, NULL); - - LV_TRACE_LAYOUT("finished"); -} - -/** - * Find the last item of a track - */ -static int32_t find_track_end(lv_obj_t * cont, flex_t * f, int32_t item_start_id, int32_t max_main_size, - int32_t item_gap, track_t * t) -{ - int32_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); - int32_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); - - /*Can't wrap if the size is auto (i.e. the size depends on the children)*/ - if(f->wrap && ((f->row && w_set == LV_SIZE_CONTENT) || (!f->row && h_set == LV_SIZE_CONTENT))) { - f->wrap = false; - } - int32_t(*get_main_size)(const lv_obj_t *) = (f->row ? lv_obj_get_width_with_margin : lv_obj_get_height_with_margin); - int32_t(*get_cross_size)(const lv_obj_t *) = (!f->row ? lv_obj_get_width_with_margin : - lv_obj_get_height_with_margin); - - t->track_main_size = 0; - t->track_fix_main_size = 0; - t->grow_item_cnt = 0; - t->track_cross_size = 0; - t->item_cnt = 0; - t->grow_dsc = NULL; - - int32_t item_id = item_start_id; - - lv_obj_t * item = lv_obj_get_child(cont, item_id); - while(item) { - if(item_id != item_start_id && lv_obj_has_flag(item, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK)) break; - - if(!lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) { - uint8_t grow_value = lv_obj_get_style_flex_grow(item, LV_PART_MAIN); - if(grow_value) { - t->grow_item_cnt++; - t->track_fix_main_size += item_gap; - if(t->grow_dsc_calc) { - grow_dsc_t * new_dsc = lv_realloc(t->grow_dsc, sizeof(grow_dsc_t) * (t->grow_item_cnt)); - LV_ASSERT_MALLOC(new_dsc); - if(new_dsc == NULL) return item_id; - - new_dsc[t->grow_item_cnt - 1].item = item; - new_dsc[t->grow_item_cnt - 1].min_size = f->row ? lv_obj_get_style_min_width(item, LV_PART_MAIN) - : lv_obj_get_style_min_height(item, LV_PART_MAIN); - new_dsc[t->grow_item_cnt - 1].max_size = f->row ? lv_obj_get_style_max_width(item, LV_PART_MAIN) - : lv_obj_get_style_max_height(item, LV_PART_MAIN); - new_dsc[t->grow_item_cnt - 1].grow_value = grow_value; - new_dsc[t->grow_item_cnt - 1].clamped = 0; - t->grow_dsc = new_dsc; - } - } - else { - int32_t item_size = get_main_size(item); - if(f->wrap && t->track_fix_main_size + item_size > max_main_size) break; - t->track_fix_main_size += item_size + item_gap; - } - - t->track_cross_size = LV_MAX(get_cross_size(item), t->track_cross_size); - t->item_cnt++; - } - - item_id += f->rev ? -1 : +1; - if(item_id < 0) break; - item = lv_obj_get_child(cont, item_id); - } - - if(t->track_fix_main_size > 0) t->track_fix_main_size -= item_gap; /*There is no gap after the last item*/ - - /*If there is at least one "grow item" the track takes the full space*/ - t->track_main_size = t->grow_item_cnt ? max_main_size : t->track_fix_main_size; - - /*Have at least one item in a row*/ - if(item && item_id == item_start_id) { - item = cont->spec_attr->children[item_id]; - get_next_item(cont, f->rev, &item_id); - if(item) { - t->track_cross_size = get_cross_size(item); - t->track_main_size = get_main_size(item); - t->item_cnt = 1; - } - } - - return item_id; -} - -/** - * Position the children in the same track - */ -static void children_repos(lv_obj_t * cont, flex_t * f, int32_t item_first_id, int32_t item_last_id, int32_t abs_x, - int32_t abs_y, int32_t max_main_size, int32_t item_gap, track_t * t) -{ - void (*area_set_main_size)(lv_area_t *, int32_t) = (f->row ? lv_area_set_width : lv_area_set_height); - int32_t (*area_get_main_size)(const lv_area_t *) = (f->row ? lv_area_get_width : lv_area_get_height); - int32_t (*area_get_cross_size)(const lv_area_t *) = (!f->row ? lv_area_get_width : lv_area_get_height); - - typedef int32_t (*margin_func_t)(const lv_obj_t *, uint32_t); - margin_func_t get_margin_main_start = (f->row ? lv_obj_get_style_margin_left : lv_obj_get_style_margin_top); - margin_func_t get_margin_main_end = (f->row ? lv_obj_get_style_margin_right : lv_obj_get_style_margin_bottom); - margin_func_t get_margin_cross_start = (!f->row ? lv_obj_get_style_margin_left : lv_obj_get_style_margin_top); - margin_func_t get_margin_cross_end = (!f->row ? lv_obj_get_style_margin_right : lv_obj_get_style_margin_bottom); - - /*Calculate the size of grow items first*/ - uint32_t i; - bool grow_reiterate = true; - while(grow_reiterate && t->grow_item_cnt) { - grow_reiterate = false; - int32_t grow_value_sum = 0; - int32_t grow_max_size = t->track_main_size - t->track_fix_main_size; - for(i = 0; i < t->grow_item_cnt; i++) { - if(t->grow_dsc[i].clamped == 0) { - grow_value_sum += t->grow_dsc[i].grow_value; - } - else { - grow_max_size -= t->grow_dsc[i].final_size; - } - } - int32_t grow_unit; - - for(i = 0; i < t->grow_item_cnt; i++) { - if(t->grow_dsc[i].clamped == 0) { - LV_ASSERT(grow_value_sum != 0); - grow_unit = grow_max_size / grow_value_sum; - int32_t size = grow_unit * t->grow_dsc[i].grow_value; - int32_t size_clamp = LV_CLAMP(t->grow_dsc[i].min_size, size, t->grow_dsc[i].max_size); - - if(size_clamp != size) { - t->grow_dsc[i].clamped = 1; - grow_reiterate = true; - } - t->grow_dsc[i].final_size = size_clamp; - grow_value_sum -= t->grow_dsc[i].grow_value; - grow_max_size -= t->grow_dsc[i].final_size; - } - } - } - - bool rtl = lv_obj_get_style_base_dir(cont, LV_PART_MAIN) == LV_BASE_DIR_RTL; - - int32_t main_pos = 0; - - int32_t place_gap = 0; - place_content(f->main_place, max_main_size, t->track_main_size, t->item_cnt, &main_pos, &place_gap); - if(f->row && rtl) main_pos += lv_obj_get_content_width(cont); - - lv_obj_t * item = lv_obj_get_child(cont, item_first_id); - /*Reposition the children*/ - while(item && item_first_id != item_last_id) { - if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) { - item = get_next_item(cont, f->rev, &item_first_id); - continue; - } - int32_t grow_size = lv_obj_get_style_flex_grow(item, LV_PART_MAIN); - if(grow_size) { - int32_t s = 0; - for(i = 0; i < t->grow_item_cnt; i++) { - if(t->grow_dsc[i].item == item) { - s = t->grow_dsc[i].final_size; - break; - } - } - - if(f->row) { - item->w_layout = 1; - item->h_layout = 0; - } - else { - item->h_layout = 1; - item->w_layout = 0; - } - - if(s != area_get_main_size(&item->coords)) { - lv_obj_invalidate(item); - - lv_area_t old_coords; - lv_area_copy(&old_coords, &item->coords); - area_set_main_size(&item->coords, s); - lv_obj_send_event(item, LV_EVENT_SIZE_CHANGED, &old_coords); - lv_obj_send_event(lv_obj_get_parent(item), LV_EVENT_CHILD_CHANGED, item); - lv_obj_invalidate(item); - } - } - else { - item->w_layout = 0; - item->h_layout = 0; - } - - int32_t cross_pos = 0; - switch(f->cross_place) { - case LV_FLEX_ALIGN_CENTER: - /*Round up the cross size to avoid rounding error when dividing by 2 - *The issue comes up e,g, with column direction with center cross direction if an element's width changes*/ - cross_pos = (((t->track_cross_size + 1) & (~1)) - area_get_cross_size(&item->coords)) / 2; - cross_pos += (get_margin_cross_start(item, LV_PART_MAIN) - get_margin_cross_end(item, LV_PART_MAIN)) / 2; - break; - case LV_FLEX_ALIGN_END: - cross_pos = t->track_cross_size - area_get_cross_size(&item->coords); - cross_pos -= get_margin_cross_end(item, LV_PART_MAIN); - break; - default: - cross_pos += get_margin_cross_start(item, LV_PART_MAIN); - break; - } - - if(f->row && rtl) main_pos -= area_get_main_size(&item->coords); - - /*Handle percentage value of translate*/ - int32_t tr_x = lv_obj_get_style_translate_x(item, LV_PART_MAIN); - int32_t tr_y = lv_obj_get_style_translate_y(item, LV_PART_MAIN); - int32_t w = lv_obj_get_width(item); - int32_t h = lv_obj_get_height(item); - if(LV_COORD_IS_PCT(tr_x)) tr_x = (w * LV_COORD_GET_PCT(tr_x)) / 100; - if(LV_COORD_IS_PCT(tr_y)) tr_y = (h * LV_COORD_GET_PCT(tr_y)) / 100; - - int32_t diff_x = abs_x - item->coords.x1 + tr_x; - int32_t diff_y = abs_y - item->coords.y1 + tr_y; - diff_x += f->row ? main_pos + get_margin_main_start(item, LV_PART_MAIN) : cross_pos; - diff_y += f->row ? cross_pos : main_pos + get_margin_main_start(item, LV_PART_MAIN); - - if(diff_x || diff_y) { - lv_obj_invalidate(item); - item->coords.x1 += diff_x; - item->coords.x2 += diff_x; - item->coords.y1 += diff_y; - item->coords.y2 += diff_y; - lv_obj_invalidate(item); - lv_obj_move_children_by(item, diff_x, diff_y, false); - } - - if(!(f->row && rtl)) main_pos += area_get_main_size(&item->coords) + item_gap + place_gap - + get_margin_main_start(item, LV_PART_MAIN) - + get_margin_main_end(item, LV_PART_MAIN); - else main_pos -= item_gap + place_gap; - - item = get_next_item(cont, f->rev, &item_first_id); - } -} - -/** - * Tell a start coordinate and gap for a placement type. - */ -static void place_content(lv_flex_align_t place, int32_t max_size, int32_t content_size, int32_t item_cnt, - int32_t * start_pos, int32_t * gap) -{ - if(item_cnt <= 1) { - switch(place) { - case LV_FLEX_ALIGN_SPACE_AROUND: - case LV_FLEX_ALIGN_SPACE_EVENLY: - place = LV_FLEX_ALIGN_CENTER; - break; - default: - break; - } - } - - switch(place) { - case LV_FLEX_ALIGN_CENTER: - *gap = 0; - *start_pos += (max_size - content_size) / 2; - break; - case LV_FLEX_ALIGN_END: - *gap = 0; - *start_pos += max_size - content_size; - break; - case LV_FLEX_ALIGN_SPACE_BETWEEN: - if(item_cnt > 1) *gap = (int32_t)(max_size - content_size) / (int32_t)(item_cnt - 1); - break; - case LV_FLEX_ALIGN_SPACE_AROUND: - *gap += (int32_t)(max_size - content_size) / (int32_t)(item_cnt); - *start_pos += *gap / 2; - break; - case LV_FLEX_ALIGN_SPACE_EVENLY: - *gap = (int32_t)(max_size - content_size) / (int32_t)(item_cnt + 1); - *start_pos += *gap; - break; - default: - *gap = 0; - } -} - -static lv_obj_t * get_next_item(lv_obj_t * cont, bool rev, int32_t * item_id) -{ - if(rev) { - (*item_id)--; - if(*item_id >= 0) return cont->spec_attr->children[*item_id]; - else return NULL; - } - else { - (*item_id)++; - if((*item_id) < (int32_t)cont->spec_attr->child_cnt) return cont->spec_attr->children[*item_id]; - else return NULL; - } -} - -static int32_t lv_obj_get_width_with_margin(const lv_obj_t * obj) -{ - return lv_obj_get_style_margin_left(obj, LV_PART_MAIN) - + lv_obj_get_width(obj) - + lv_obj_get_style_margin_right(obj, LV_PART_MAIN); -} - -static int32_t lv_obj_get_height_with_margin(const lv_obj_t * obj) -{ - return lv_obj_get_style_margin_top(obj, LV_PART_MAIN) - + lv_obj_get_height(obj) - + lv_obj_get_style_margin_bottom(obj, LV_PART_MAIN); -} - -#endif /*LV_USE_FLEX*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/layouts/flex/lv_flex.h b/software/Power_Pico/Middlewares/LVGL/src/layouts/flex/lv_flex.h deleted file mode 100644 index 9724f9b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/layouts/flex/lv_flex.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - * @file lv_flex.h - * - */ - -#ifndef LV_FLEX_H -#define LV_FLEX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../misc/lv_area.h" - -#if LV_USE_FLEX - -/********************* - * DEFINES - *********************/ - -#define LV_FLEX_COLUMN (1 << 0) -#define LV_FLEX_WRAP (1 << 2) -#define LV_FLEX_REVERSE (1 << 3) - -/********************** - * TYPEDEFS - **********************/ - -/*Can't include lv_obj.h because it includes this header file*/ - -typedef enum { - LV_FLEX_ALIGN_START, - LV_FLEX_ALIGN_END, - LV_FLEX_ALIGN_CENTER, - LV_FLEX_ALIGN_SPACE_EVENLY, - LV_FLEX_ALIGN_SPACE_AROUND, - LV_FLEX_ALIGN_SPACE_BETWEEN, -} lv_flex_align_t; - -typedef enum { - LV_FLEX_FLOW_ROW = 0x00, - LV_FLEX_FLOW_COLUMN = LV_FLEX_COLUMN, - LV_FLEX_FLOW_ROW_WRAP = LV_FLEX_FLOW_ROW | LV_FLEX_WRAP, - LV_FLEX_FLOW_ROW_REVERSE = LV_FLEX_FLOW_ROW | LV_FLEX_REVERSE, - LV_FLEX_FLOW_ROW_WRAP_REVERSE = LV_FLEX_FLOW_ROW | LV_FLEX_WRAP | LV_FLEX_REVERSE, - LV_FLEX_FLOW_COLUMN_WRAP = LV_FLEX_FLOW_COLUMN | LV_FLEX_WRAP, - LV_FLEX_FLOW_COLUMN_REVERSE = LV_FLEX_FLOW_COLUMN | LV_FLEX_REVERSE, - LV_FLEX_FLOW_COLUMN_WRAP_REVERSE = LV_FLEX_FLOW_COLUMN | LV_FLEX_WRAP | LV_FLEX_REVERSE, -} lv_flex_flow_t; - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize a flex layout to default values - */ -void lv_flex_init(void); - -/** - * Set how the item should flow - * @param obj pointer to an object. The parent must have flex layout else nothing will happen. - * @param flow an element of `lv_flex_flow_t`. - */ -void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow); - -/** - * Set how to place (where to align) the items and tracks - * @param obj pointer to an object. The parent must have flex layout else nothing will happen. - * @param main_place where to place the items on main axis (in their track). Any value of `lv_flex_align_t`. - * @param cross_place where to place the item in their track on the cross axis. `LV_FLEX_ALIGN_START/END/CENTER` - * @param track_cross_place where to place the tracks in the cross direction. Any value of `lv_flex_align_t`. - */ -void lv_obj_set_flex_align(lv_obj_t * obj, lv_flex_align_t main_place, lv_flex_align_t cross_place, - lv_flex_align_t track_cross_place); - -/** - * Sets the width or height (on main axis) to grow the object in order fill the free space - * @param obj pointer to an object. The parent must have flex layout else nothing will happen. - * @param grow a value to set how much free space to take proportionally to other growing items. - */ -void lv_obj_set_flex_grow(lv_obj_t * obj, uint8_t grow); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_FLEX*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_FLEX_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/layouts/grid/lv_grid.c b/software/Power_Pico/Middlewares/LVGL/src/layouts/grid/lv_grid.c deleted file mode 100644 index 70d3f79..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/layouts/grid/lv_grid.c +++ /dev/null @@ -1,665 +0,0 @@ -/** - * @file lv_grid.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_grid.h" - -#if LV_USE_GRID - -#include "../../stdlib/lv_string.h" -#include "../lv_layout.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_global.h" -/********************* - * DEFINES - *********************/ -#define layout_list_def LV_GLOBAL_DEFAULT()->layout_list - -/** - * Some helper defines - */ -#define IS_FR(x) (x >= LV_COORD_MAX - 100) -#define IS_CONTENT(x) (x == LV_COORD_MAX - 101) -#define GET_FR(x) (x - (LV_COORD_MAX - 100)) - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - uint32_t col; - uint32_t row; - lv_point_t grid_abs; -} item_repos_hint_t; - -typedef struct { - int32_t * x; - int32_t * y; - int32_t * w; - int32_t * h; - uint32_t col_num; - uint32_t row_num; - int32_t grid_w; - int32_t grid_h; -} lv_grid_calc_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void grid_update(lv_obj_t * cont, void * user_data); -static void calc(lv_obj_t * obj, lv_grid_calc_t * calc); -static void calc_free(lv_grid_calc_t * calc); -static void calc_cols(lv_obj_t * cont, lv_grid_calc_t * c); -static void calc_rows(lv_obj_t * cont, lv_grid_calc_t * c); -static void item_repos(lv_obj_t * item, lv_grid_calc_t * c, item_repos_hint_t * hint); -static int32_t grid_align(int32_t cont_size, bool auto_size, lv_grid_align_t align, int32_t gap, - uint32_t track_num, - int32_t * size_array, int32_t * pos_array, bool reverse); -static uint32_t count_tracks(const int32_t * templ); - -static inline const int32_t * get_col_dsc(lv_obj_t * obj) -{ - return lv_obj_get_style_grid_column_dsc_array(obj, 0); -} -static inline const int32_t * get_row_dsc(lv_obj_t * obj) -{ - return lv_obj_get_style_grid_row_dsc_array(obj, 0); -} -static inline int32_t get_col_pos(lv_obj_t * obj) -{ - return lv_obj_get_style_grid_cell_column_pos(obj, 0); -} -static inline int32_t get_row_pos(lv_obj_t * obj) -{ - return lv_obj_get_style_grid_cell_row_pos(obj, 0); -} -static inline int32_t get_col_span(lv_obj_t * obj) -{ - return lv_obj_get_style_grid_cell_column_span(obj, 0); -} -static inline int32_t get_row_span(lv_obj_t * obj) -{ - return lv_obj_get_style_grid_cell_row_span(obj, 0); -} -static inline lv_grid_align_t get_cell_col_align(lv_obj_t * obj) -{ - return lv_obj_get_style_grid_cell_x_align(obj, 0); -} -static inline lv_grid_align_t get_cell_row_align(lv_obj_t * obj) -{ - return lv_obj_get_style_grid_cell_y_align(obj, 0); -} -static inline lv_grid_align_t get_grid_col_align(lv_obj_t * obj) -{ - return lv_obj_get_style_grid_column_align(obj, 0); -} -static inline lv_grid_align_t get_grid_row_align(lv_obj_t * obj) -{ - return lv_obj_get_style_grid_row_align(obj, 0); -} -static inline int32_t get_margin_hor(lv_obj_t * obj) -{ - return lv_obj_get_style_margin_left(obj, LV_PART_MAIN) - + lv_obj_get_style_margin_right(obj, LV_PART_MAIN); -} -static inline int32_t get_margin_ver(lv_obj_t * obj) -{ - return lv_obj_get_style_margin_top(obj, LV_PART_MAIN) - + lv_obj_get_style_margin_bottom(obj, LV_PART_MAIN); -} - -static inline int32_t div_round_closest(int32_t dividend, int32_t divisor) -{ - return (dividend + divisor / 2) / divisor; -} - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ -#if LV_USE_LOG && LV_LOG_TRACE_LAYOUT - #define LV_TRACE_LAYOUT(...) LV_LOG_TRACE(__VA_ARGS__) -#else - #define LV_TRACE_LAYOUT(...) -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_grid_init(void) -{ - layout_list_def[LV_LAYOUT_GRID].cb = grid_update; - layout_list_def[LV_LAYOUT_GRID].user_data = NULL; -} - -void lv_obj_set_grid_dsc_array(lv_obj_t * obj, const int32_t col_dsc[], const int32_t row_dsc[]) -{ - lv_obj_set_style_grid_column_dsc_array(obj, col_dsc, 0); - lv_obj_set_style_grid_row_dsc_array(obj, row_dsc, 0); - lv_obj_set_style_layout(obj, LV_LAYOUT_GRID, 0); -} - -void lv_obj_set_grid_align(lv_obj_t * obj, lv_grid_align_t column_align, lv_grid_align_t row_align) -{ - lv_obj_set_style_grid_column_align(obj, column_align, 0); - lv_obj_set_style_grid_row_align(obj, row_align, 0); - -} - -void lv_obj_set_grid_cell(lv_obj_t * obj, lv_grid_align_t x_align, int32_t col_pos, int32_t col_span, - lv_grid_align_t y_align, int32_t row_pos, int32_t row_span) - -{ - lv_obj_set_style_grid_cell_column_pos(obj, col_pos, 0); - lv_obj_set_style_grid_cell_row_pos(obj, row_pos, 0); - lv_obj_set_style_grid_cell_x_align(obj, x_align, 0); - lv_obj_set_style_grid_cell_column_span(obj, col_span, 0); - lv_obj_set_style_grid_cell_row_span(obj, row_span, 0); - lv_obj_set_style_grid_cell_y_align(obj, y_align, 0); - - lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); -} - -int32_t lv_grid_fr(uint8_t x) -{ - return LV_GRID_FR(x); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void grid_update(lv_obj_t * cont, void * user_data) -{ - LV_LOG_INFO("update %p container", (void *)cont); - LV_UNUSED(user_data); - - // const int32_t * col_templ = get_col_dsc(cont); - // const int32_t * row_templ = get_row_dsc(cont); - // if(col_templ == NULL || row_templ == NULL) return; - - lv_grid_calc_t c; - calc(cont, &c); - - item_repos_hint_t hint; - lv_memzero(&hint, sizeof(hint)); - - /*Calculate the grids absolute x and y coordinates. - *It will be used as helper during item repositioning to avoid calculating this value for every children*/ - int32_t pad_left = lv_obj_get_style_space_left(cont, LV_PART_MAIN); - int32_t pad_top = lv_obj_get_style_space_top(cont, LV_PART_MAIN); - hint.grid_abs.x = pad_left + cont->coords.x1 - lv_obj_get_scroll_x(cont); - hint.grid_abs.y = pad_top + cont->coords.y1 - lv_obj_get_scroll_y(cont); - - uint32_t i; - for(i = 0; i < cont->spec_attr->child_cnt; i++) { - lv_obj_t * item = cont->spec_attr->children[i]; - item_repos(item, &c, &hint); - } - calc_free(&c); - - int32_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); - int32_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); - if(w_set == LV_SIZE_CONTENT || h_set == LV_SIZE_CONTENT) { - lv_obj_refr_size(cont); - } - - lv_obj_send_event(cont, LV_EVENT_LAYOUT_CHANGED, NULL); - - LV_TRACE_LAYOUT("finished"); -} - -/** - * Calculate the grid cells coordinates - * @param cont an object that has a grid - * @param calc store the calculated cells sizes here - * @note `lv_grid_calc_free(calc_out)` needs to be called when `calc_out` is not needed anymore - */ -static void calc(lv_obj_t * cont, lv_grid_calc_t * calc_out) -{ - if(lv_obj_get_child(cont, 0) == NULL) { - lv_memzero(calc_out, sizeof(lv_grid_calc_t)); - return; - } - - calc_rows(cont, calc_out); - calc_cols(cont, calc_out); - - int32_t col_gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN); - int32_t row_gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN); - - bool rev = lv_obj_get_style_base_dir(cont, LV_PART_MAIN) == LV_BASE_DIR_RTL; - - int32_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); - int32_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); - bool auto_w = w_set == LV_SIZE_CONTENT && !cont->w_layout; - int32_t cont_w = lv_obj_get_content_width(cont); - calc_out->grid_w = grid_align(cont_w, auto_w, get_grid_col_align(cont), col_gap, calc_out->col_num, calc_out->w, - calc_out->x, rev); - - bool auto_h = h_set == LV_SIZE_CONTENT && !cont->h_layout; - int32_t cont_h = lv_obj_get_content_height(cont); - calc_out->grid_h = grid_align(cont_h, auto_h, get_grid_row_align(cont), row_gap, calc_out->row_num, calc_out->h, - calc_out->y, false); - - LV_ASSERT_MEM_INTEGRITY(); -} - -/** - * Free the a grid calculation's data - * @param calc pointer to the calculated grid cell coordinates - */ -static void calc_free(lv_grid_calc_t * calc) -{ - lv_free(calc->x); - lv_free(calc->y); - lv_free(calc->w); - lv_free(calc->h); -} - -static void calc_cols(lv_obj_t * cont, lv_grid_calc_t * c) -{ - - const int32_t * col_templ; - col_templ = get_col_dsc(cont); - bool subgrid = false; - if(col_templ == NULL) { - lv_obj_t * parent = lv_obj_get_parent(cont); - col_templ = get_col_dsc(parent); - if(col_templ == NULL) { - LV_LOG_WARN("No col descriptor found even on the parent"); - return; - } - - int32_t pos = get_col_pos(cont); - int32_t span = get_col_span(cont); - - int32_t * col_templ_sub = lv_malloc(sizeof(int32_t) * (span + 1)); - lv_memcpy(col_templ_sub, &col_templ[pos], sizeof(int32_t) * span); - col_templ_sub[span] = LV_GRID_TEMPLATE_LAST; - col_templ = col_templ_sub; - subgrid = true; - } - - int32_t cont_w = lv_obj_get_content_width(cont); - - c->col_num = count_tracks(col_templ); - c->x = lv_malloc(sizeof(int32_t) * c->col_num); - c->w = lv_malloc(sizeof(int32_t) * c->col_num); - - /*Set sizes for CONTENT cells*/ - uint32_t i; - for(i = 0; i < c->col_num; i++) { - int32_t size = LV_COORD_MIN; - if(IS_CONTENT(col_templ[i])) { - /*Check the size of children of this cell*/ - uint32_t ci; - for(ci = 0; ci < lv_obj_get_child_count(cont); ci++) { - lv_obj_t * item = lv_obj_get_child(cont, ci); - if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; - uint32_t col_span = get_col_span(item); - if(col_span != 1) continue; - - uint32_t col_pos = get_col_pos(item); - if(col_pos != i) continue; - - size = LV_MAX(size, lv_obj_get_width(item)); - } - if(size >= 0) c->w[i] = size; - else c->w[i] = 0; - } - } - - uint32_t col_fr_cnt = 0; - int32_t grid_w = 0; - - for(i = 0; i < c->col_num; i++) { - int32_t x = col_templ[i]; - if(IS_FR(x)) { - col_fr_cnt += GET_FR(x); - } - else if(IS_CONTENT(x)) { - grid_w += c->w[i]; - } - else { - c->w[i] = x; - grid_w += x; - } - } - - int32_t col_gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN); - cont_w -= col_gap * (c->col_num - 1); - int32_t free_w = cont_w - grid_w; - if(free_w < 0) free_w = 0; - - for(i = 0; i < c->col_num && col_fr_cnt; i++) { - int32_t x = col_templ[i]; - if(IS_FR(x)) { - int32_t f = GET_FR(x); - c->w[i] = div_round_closest(free_w * f, col_fr_cnt); - /*By updating remaining fr and width, we ensure f == col_fr_cnt - *in the last loop iteration. That means the last iteration will - *not have rounding errors and use all remaining space.*/ - col_fr_cnt -= f; - free_w -= c->w[i]; - } - } - - if(subgrid) { - lv_free((void *)col_templ); - } -} - -static void calc_rows(lv_obj_t * cont, lv_grid_calc_t * c) -{ - const int32_t * row_templ; - row_templ = get_row_dsc(cont); - bool subgrid = false; - if(row_templ == NULL) { - lv_obj_t * parent = lv_obj_get_parent(cont); - row_templ = get_row_dsc(parent); - if(row_templ == NULL) { - LV_LOG_WARN("No row descriptor found even on the parent"); - return; - } - - int32_t pos = get_row_pos(cont); - int32_t span = get_row_span(cont); - - int32_t * row_templ_sub = lv_malloc(sizeof(int32_t) * (span + 1)); - lv_memcpy(row_templ_sub, &row_templ[pos], sizeof(int32_t) * span); - row_templ_sub[span] = LV_GRID_TEMPLATE_LAST; - row_templ = row_templ_sub; - subgrid = true; - } - - c->row_num = count_tracks(row_templ); - c->y = lv_malloc(sizeof(int32_t) * c->row_num); - c->h = lv_malloc(sizeof(int32_t) * c->row_num); - /*Set sizes for CONTENT cells*/ - uint32_t i; - for(i = 0; i < c->row_num; i++) { - int32_t size = LV_COORD_MIN; - if(IS_CONTENT(row_templ[i])) { - /*Check the size of children of this cell*/ - uint32_t ci; - for(ci = 0; ci < lv_obj_get_child_count(cont); ci++) { - lv_obj_t * item = lv_obj_get_child(cont, ci); - if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; - uint32_t row_span = get_row_span(item); - if(row_span != 1) continue; - - uint32_t row_pos = get_row_pos(item); - if(row_pos != i) continue; - - size = LV_MAX(size, lv_obj_get_height(item)); - } - if(size >= 0) c->h[i] = size; - else c->h[i] = 0; - } - } - - uint32_t row_fr_cnt = 0; - int32_t grid_h = 0; - - for(i = 0; i < c->row_num; i++) { - int32_t x = row_templ[i]; - if(IS_FR(x)) { - row_fr_cnt += GET_FR(x); - } - else if(IS_CONTENT(x)) { - grid_h += c->h[i]; - } - else { - c->h[i] = x; - grid_h += x; - } - } - - int32_t row_gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN); - int32_t cont_h = lv_obj_get_content_height(cont) - row_gap * (c->row_num - 1); - int32_t free_h = cont_h - grid_h; - if(free_h < 0) free_h = 0; - - for(i = 0; i < c->row_num && row_fr_cnt; i++) { - int32_t x = row_templ[i]; - if(IS_FR(x)) { - int32_t f = GET_FR(x); - c->h[i] = div_round_closest(free_h * f, row_fr_cnt); - /*By updating remaining fr and height, we ensure f == row_fr_cnt - *in the last loop iteration. That means the last iteration will - *not have rounding errors and use all remaining space.*/ - row_fr_cnt -= f; - free_h -= c->h[i]; - } - } - - if(subgrid) { - lv_free((void *)row_templ); - } -} - -/** - * Reposition a grid item in its cell - * @param item a grid item to reposition - * @param calc the calculated grid of `cont` - * @param child_id_ext helper value if the ID of the child is know (order from the oldest) else -1 - * @param grid_abs helper value, the absolute position of the grid, NULL if unknown - */ -static void item_repos(lv_obj_t * item, lv_grid_calc_t * c, item_repos_hint_t * hint) -{ - if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) return; - uint32_t col_span = get_col_span(item); - uint32_t row_span = get_row_span(item); - if(row_span == 0 || col_span == 0) return; - - uint32_t col_pos = get_col_pos(item); - uint32_t row_pos = get_row_pos(item); - lv_grid_align_t col_align = get_cell_col_align(item); - lv_grid_align_t row_align = get_cell_row_align(item); - - int32_t col_x1 = c->x[col_pos]; - int32_t col_x2 = c->x[col_pos + col_span - 1] + c->w[col_pos + col_span - 1]; - int32_t col_w = col_x2 - col_x1; - - int32_t row_y1 = c->y[row_pos]; - int32_t row_y2 = c->y[row_pos + row_span - 1] + c->h[row_pos + row_span - 1]; - int32_t row_h = row_y2 - row_y1; - - /*If the item has RTL base dir switch start and end*/ - if(lv_obj_get_style_base_dir(item, LV_PART_MAIN) == LV_BASE_DIR_RTL) { - if(col_align == LV_GRID_ALIGN_START) col_align = LV_GRID_ALIGN_END; - else if(col_align == LV_GRID_ALIGN_END) col_align = LV_GRID_ALIGN_START; - } - - int32_t x; - int32_t y; - int32_t item_w = lv_area_get_width(&item->coords); - int32_t item_h = lv_area_get_height(&item->coords); - - switch(col_align) { - default: - case LV_GRID_ALIGN_START: - x = c->x[col_pos] + lv_obj_get_style_margin_left(item, LV_PART_MAIN); - item->w_layout = 0; - break; - case LV_GRID_ALIGN_STRETCH: - x = c->x[col_pos] + lv_obj_get_style_margin_left(item, LV_PART_MAIN); - item_w = col_w - get_margin_hor(item); - item->w_layout = 1; - break; - case LV_GRID_ALIGN_CENTER: - x = c->x[col_pos] + (col_w - item_w) / 2 + (lv_obj_get_style_margin_left(item, LV_PART_MAIN) - - lv_obj_get_style_margin_right(item, LV_PART_MAIN)) / 2; - item->w_layout = 0; - break; - case LV_GRID_ALIGN_END: - x = c->x[col_pos] + col_w - lv_obj_get_width(item) - lv_obj_get_style_margin_right(item, LV_PART_MAIN); - item->w_layout = 0; - break; - } - - switch(row_align) { - default: - case LV_GRID_ALIGN_START: - y = c->y[row_pos] + lv_obj_get_style_margin_top(item, LV_PART_MAIN); - item->h_layout = 0; - break; - case LV_GRID_ALIGN_STRETCH: - y = c->y[row_pos] + lv_obj_get_style_margin_top(item, LV_PART_MAIN); - item_h = row_h - get_margin_ver(item); - item->h_layout = 1; - break; - case LV_GRID_ALIGN_CENTER: - y = c->y[row_pos] + (row_h - item_h) / 2 + (lv_obj_get_style_margin_top(item, LV_PART_MAIN) - - lv_obj_get_style_margin_bottom(item, LV_PART_MAIN)) / 2; - item->h_layout = 0; - break; - case LV_GRID_ALIGN_END: - y = c->y[row_pos] + row_h - lv_obj_get_height(item) - lv_obj_get_style_margin_bottom(item, LV_PART_MAIN); - item->h_layout = 0; - break; - } - - /*Set a new size if required*/ - if(lv_obj_get_width(item) != item_w || lv_obj_get_height(item) != item_h) { - lv_area_t old_coords; - lv_area_copy(&old_coords, &item->coords); - lv_obj_invalidate(item); - lv_area_set_width(&item->coords, item_w); - lv_area_set_height(&item->coords, item_h); - lv_obj_invalidate(item); - lv_obj_send_event(item, LV_EVENT_SIZE_CHANGED, &old_coords); - lv_obj_send_event(lv_obj_get_parent(item), LV_EVENT_CHILD_CHANGED, item); - - } - - /*Handle percentage value of translate*/ - int32_t tr_x = lv_obj_get_style_translate_x(item, LV_PART_MAIN); - int32_t tr_y = lv_obj_get_style_translate_y(item, LV_PART_MAIN); - int32_t w = lv_obj_get_width(item); - int32_t h = lv_obj_get_height(item); - if(LV_COORD_IS_PCT(tr_x)) tr_x = (w * LV_COORD_GET_PCT(tr_x)) / 100; - if(LV_COORD_IS_PCT(tr_y)) tr_y = (h * LV_COORD_GET_PCT(tr_y)) / 100; - - x += tr_x; - y += tr_y; - - int32_t diff_x = hint->grid_abs.x + x - item->coords.x1; - int32_t diff_y = hint->grid_abs.y + y - item->coords.y1; - if(diff_x || diff_y) { - lv_obj_invalidate(item); - item->coords.x1 += diff_x; - item->coords.x2 += diff_x; - item->coords.y1 += diff_y; - item->coords.y2 += diff_y; - lv_obj_invalidate(item); - lv_obj_move_children_by(item, diff_x, diff_y, false); - } -} - -/** - * Place the grid track according to align methods. It keeps the track sizes but sets their position. - * It can process both columns or rows according to the passed parameters. - * @param cont_size size of the containers content area (width/height) - * @param auto_size true: the container has auto size in the current direction - * @param align align method - * @param gap grid gap - * @param track_num number of tracks - * @param size_array array with the track sizes - * @param pos_array write the positions of the tracks here - * @return the total size of the grid - */ -static int32_t grid_align(int32_t cont_size, bool auto_size, lv_grid_align_t align, int32_t gap, - uint32_t track_num, - int32_t * size_array, int32_t * pos_array, bool reverse) -{ - int32_t grid_size = 0; - uint32_t i; - - if(auto_size) { - pos_array[0] = 0; - } - else { - /*With spaced alignment gap will be calculated from the remaining space*/ - if(align == LV_GRID_ALIGN_SPACE_AROUND || align == LV_GRID_ALIGN_SPACE_BETWEEN || align == LV_GRID_ALIGN_SPACE_EVENLY) { - gap = 0; - if(track_num == 1) align = LV_GRID_ALIGN_CENTER; - } - - /*Get the full grid size with gap*/ - for(i = 0; i < track_num; i++) { - grid_size += size_array[i] + gap; - } - grid_size -= gap; - - /*Calculate the position of the first item and set gap is necessary*/ - switch(align) { - case LV_GRID_ALIGN_START: - pos_array[0] = 0; - break; - case LV_GRID_ALIGN_CENTER: - pos_array[0] = (cont_size - grid_size) / 2; - break; - case LV_GRID_ALIGN_END: - pos_array[0] = cont_size - grid_size; - break; - case LV_GRID_ALIGN_SPACE_BETWEEN: - pos_array[0] = 0; - gap = (int32_t)(cont_size - grid_size) / (int32_t)(track_num - 1); - break; - case LV_GRID_ALIGN_SPACE_AROUND: - gap = (int32_t)(cont_size - grid_size) / (int32_t)(track_num); - pos_array[0] = gap / 2; - break; - case LV_GRID_ALIGN_SPACE_EVENLY: - gap = (int32_t)(cont_size - grid_size) / (int32_t)(track_num + 1); - pos_array[0] = gap; - break; - default: - break; - } - } - - /*Set the position of all tracks from the start position, gaps and track sizes*/ - for(i = 0; i < track_num - 1; i++) { - pos_array[i + 1] = pos_array[i] + size_array[i] + gap; - } - - int32_t total_gird_size = pos_array[track_num - 1] + size_array[track_num - 1] - pos_array[0]; - - if(reverse) { - for(i = 0; i < track_num; i++) { - pos_array[i] = cont_size - pos_array[i] - size_array[i]; - } - - } - - /*Return the full size of the grid*/ - return total_gird_size; -} - -static uint32_t count_tracks(const int32_t * templ) -{ - uint32_t i; - for(i = 0; templ[i] != LV_GRID_TEMPLATE_LAST; i++); - - return i; -} - -#endif /*LV_USE_GRID*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/layouts/grid/lv_grid.h b/software/Power_Pico/Middlewares/LVGL/src/layouts/grid/lv_grid.h deleted file mode 100644 index a7bf738..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/layouts/grid/lv_grid.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - * @file lv_grid.h - * - */ - -#ifndef LV_GRID_H -#define LV_GRID_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../misc/lv_area.h" - -#if LV_USE_GRID - -/********************* - * DEFINES - *********************/ -/** - * Can be used track size to make the track fill the free space. - * @param x how much space to take proportionally to other FR tracks - * @return a special track size - */ -#define LV_GRID_FR(x) (LV_COORD_MAX - 100 + x) - -#define LV_GRID_CONTENT (LV_COORD_MAX - 101) -LV_EXPORT_CONST_INT(LV_GRID_CONTENT); - -#define LV_GRID_TEMPLATE_LAST (LV_COORD_MAX) -LV_EXPORT_CONST_INT(LV_GRID_TEMPLATE_LAST); - -/********************** - * TYPEDEFS - **********************/ - -/*Can't include lv_obj.h because it includes this header file*/ - -typedef enum { - LV_GRID_ALIGN_START, - LV_GRID_ALIGN_CENTER, - LV_GRID_ALIGN_END, - LV_GRID_ALIGN_STRETCH, - LV_GRID_ALIGN_SPACE_EVENLY, - LV_GRID_ALIGN_SPACE_AROUND, - LV_GRID_ALIGN_SPACE_BETWEEN, -} lv_grid_align_t; - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_grid_init(void); - -void lv_obj_set_grid_dsc_array(lv_obj_t * obj, const int32_t col_dsc[], const int32_t row_dsc[]); - -void lv_obj_set_grid_align(lv_obj_t * obj, lv_grid_align_t column_align, lv_grid_align_t row_align); - -/** - * Set the cell of an object. The object's parent needs to have grid layout, else nothing will happen - * @param obj pointer to an object - * @param column_align the vertical alignment in the cell. `LV_GRID_START/END/CENTER/STRETCH` - * @param col_pos column ID - * @param col_span number of columns to take (>= 1) - * @param row_align the horizontal alignment in the cell. `LV_GRID_START/END/CENTER/STRETCH` - * @param row_pos row ID - * @param row_span number of rows to take (>= 1) - */ -void lv_obj_set_grid_cell(lv_obj_t * obj, lv_grid_align_t column_align, int32_t col_pos, int32_t col_span, - lv_grid_align_t row_align, int32_t row_pos, int32_t row_span); - -/** - * Just a wrapper to `LV_GRID_FR` for bindings. - */ -int32_t lv_grid_fr(uint8_t x); - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_GRID*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_GRID_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/layouts/lv_layout.c b/software/Power_Pico/Middlewares/LVGL/src/layouts/lv_layout.c deleted file mode 100644 index ddb3b0e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/layouts/lv_layout.c +++ /dev/null @@ -1,79 +0,0 @@ -/** - * @file lv_layout.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_layout_private.h" -#include "../core/lv_global.h" -#include "../core/lv_obj.h" - -/********************* - * DEFINES - *********************/ -#define layout_cnt LV_GLOBAL_DEFAULT()->layout_count -#define layout_list_def LV_GLOBAL_DEFAULT()->layout_list - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_layout_init(void) -{ - /*Malloc a list for the built in layouts*/ - layout_list_def = lv_malloc(layout_cnt * sizeof(lv_layout_dsc_t)); - -#if LV_USE_FLEX - lv_flex_init(); -#endif - -#if LV_USE_GRID - lv_grid_init(); -#endif -} - -void lv_layout_deinit(void) -{ - lv_free(layout_list_def); -} - -uint32_t lv_layout_register(lv_layout_update_cb_t cb, void * user_data) -{ - layout_list_def = lv_realloc(layout_list_def, (layout_cnt + 1) * sizeof(lv_layout_dsc_t)); - LV_ASSERT_MALLOC(layout_list_def); - - layout_list_def[layout_cnt].cb = cb; - layout_list_def[layout_cnt].user_data = user_data; - return layout_cnt++; -} - -void lv_layout_apply(lv_obj_t * obj) -{ - lv_layout_t layout_id = lv_obj_get_style_layout(obj, LV_PART_MAIN); - if(layout_id > 0 && layout_id <= layout_cnt) { - void * user_data = layout_list_def[layout_id].user_data; - layout_list_def[layout_id].cb(obj, user_data); - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/layouts/lv_layout.h b/software/Power_Pico/Middlewares/LVGL/src/layouts/lv_layout.h deleted file mode 100644 index a783d2b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/layouts/lv_layout.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @file lv_layout.h - * - */ - -#ifndef LV_LAYOUT_H -#define LV_LAYOUT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "../misc/lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef void (*lv_layout_update_cb_t)(lv_obj_t *, void * user_data); - -typedef enum { - LV_LAYOUT_NONE = 0, - -#if LV_USE_FLEX - LV_LAYOUT_FLEX, -#endif - -#if LV_USE_GRID - LV_LAYOUT_GRID, -#endif - - LV_LAYOUT_LAST -} lv_layout_t; - -/** - * Register a new layout - * @param cb the layout update callback - * @param user_data custom data that will be passed to `cb` - * @return the ID of the new layout - */ -uint32_t lv_layout_register(lv_layout_update_cb_t cb, void * user_data); - -/********************** - * MACROS - **********************/ - -#if LV_USE_FLEX -#include "flex/lv_flex.h" -#endif /* LV_USE_FLEX */ - -#if LV_USE_GRID -#include "grid/lv_grid.h" -#endif /* LV_USE_GRID */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LAYOUT_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/layouts/lv_layout_private.h b/software/Power_Pico/Middlewares/LVGL/src/layouts/lv_layout_private.h deleted file mode 100644 index dace2fc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/layouts/lv_layout_private.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file lv_layout_private.h - * - */ - -#ifndef LV_LAYOUT_PRIVATE_H -#define LV_LAYOUT_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_layout.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_layout_update_cb_t cb; - void * user_data; -} lv_layout_dsc_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_layout_init(void); - -void lv_layout_deinit(void); - -/** - * Update the layout of a widget - * @param obj pointer to a widget - */ -void lv_layout_apply(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LAYOUT_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/code128.c b/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/code128.c deleted file mode 100644 index 4fc00cb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/code128.c +++ /dev/null @@ -1,582 +0,0 @@ -// Copyright (c) 2013, LKC Technologies, 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: -// -// Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. Redistributions in binary -// form must reproduce the above copyright notice, this list of conditions and -// the following disclaimer in the documentation and/or other materials -// provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT -// HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (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 "../../../lvgl.h" -#if LV_USE_BARCODE - -#include "code128.h" -#include - -#define CODE128_MALLOC lv_malloc -#define CODE128_REALLOC lv_realloc -#define CODE128_FREE lv_free -#define CODE128_MEMSET lv_memset -#define CODE128_STRLEN lv_strlen -#define CODE128_ASSERT LV_ASSERT - -#define CODE128_QUIET_ZONE_LEN 10 -#define CODE128_CHAR_LEN 11 -#define CODE128_STOP_CODE_LEN 13 - -#define CODE128_START_CODE_A 103 -#define CODE128_START_CODE_B 104 -#define CODE128_START_CODE_C 105 - -#define CODE128_MODE_A 'a' -#define CODE128_MODE_B 'b' -#define CODE128_MODE_C 'c' - -#define CODE128_MIN_ENCODE_LEN (CODE128_QUIET_ZONE_LEN * 2 + CODE128_CHAR_LEN * 2 + CODE128_STOP_CODE_LEN) - -static const int code128_pattern[] = { - // value: pattern, bar/space widths - 1740, // 0: 11011001100, 212222 - 1644, // 1: 11001101100, 222122 - 1638, // 2: 11001100110, 222221 - 1176, // 3: 10010011000, 121223 - 1164, // 4: 10010001100, 121322 - 1100, // 5: 10001001100, 131222 - 1224, // 6: 10011001000, 122213 - 1220, // 7: 10011000100, 122312 - 1124, // 8: 10001100100, 132212 - 1608, // 9: 11001001000, 221213 - 1604, // 10: 11001000100, 221312 - 1572, // 11: 11000100100, 231212 - 1436, // 12: 10110011100, 112232 - 1244, // 13: 10011011100, 122132 - 1230, // 14: 10011001110, 122231 - 1484, // 15: 10111001100, 113222 - 1260, // 16: 10011101100, 123122 - 1254, // 17: 10011100110, 123221 - 1650, // 18: 11001110010, 223211 - 1628, // 19: 11001011100, 221132 - 1614, // 20: 11001001110, 221231 - 1764, // 21: 11011100100, 213212 - 1652, // 22: 11001110100, 223112 - 1902, // 23: 11101101110, 312131 - 1868, // 24: 11101001100, 311222 - 1836, // 25: 11100101100, 321122 - 1830, // 26: 11100100110, 321221 - 1892, // 27: 11101100100, 312212 - 1844, // 28: 11100110100, 322112 - 1842, // 29: 11100110010, 322211 - 1752, // 30: 11011011000, 212123 - 1734, // 31: 11011000110, 212321 - 1590, // 32: 11000110110, 232121 - 1304, // 33: 10100011000, 111323 - 1112, // 34: 10001011000, 131123 - 1094, // 35: 10001000110, 131321 - 1416, // 36: 10110001000, 112313 - 1128, // 37: 10001101000, 132113 - 1122, // 38: 10001100010, 132311 - 1672, // 39: 11010001000, 211313 - 1576, // 40: 11000101000, 231113 - 1570, // 41: 11000100010, 231311 - 1464, // 42: 10110111000, 112133 - 1422, // 43: 10110001110 - 1134, // 44: 10001101110 - 1496, // 45: 10111011000, 113123 - 1478, // 46: 10111000110, 113321 - 1142, // 47: 10001110110, 133121 - 1910, // 48: 11101110110, 313121 - 1678, // 49: 11010001110, 211331 - 1582, // 50: 11000101110, 231131 - 1768, // 51: 11011101000, 213113 - 1762, // 52: 11011100010, 213311 - 1774, // 53: 11011101110, 213131 - 1880, // 54: 11101011000, 311123 - 1862, // 55: 11101000110, 311321 - 1814, // 56: 11100010110, 331121 - 1896, // 57: 11101101000, 312113 - 1890, // 58: 11101100010, 312311 - 1818, // 59: 11100011010, 332111 - 1914, // 60: 11101111010, 314111 - 1602, // 61: 11001000010, 221411 - 1930, // 62: 11110001010, 431111 - 1328, // 63: 10100110000, 111224 - 1292, // 64: 10100001100, 111422 - 1200, // 65: 10010110000, 121124 - 1158, // 66: 10010000110, 121421 - 1068, // 67: 10000101100, 141122 - 1062, // 68: 10000100110, 141221 - 1424, // 69: 10110010000, 112214 - 1412, // 70: 10110000100, 112412 - 1232, // 71: 10011010000, 122114 - 1218, // 72: 10011000010, 122411 - 1076, // 73: 10000110100, 142112 - 1074, // 74: 10000110010, 142211 - 1554, // 75: 11000010010, 241211 - 1616, // 76: 11001010000, 221114 - 1978, // 77: 11110111010, 413111 - 1556, // 78: 11000010100, 241112 - 1146, // 79: 10001111010, 134111 - 1340, // 80: 10100111100, 111242 - 1212, // 81: 10010111100, 121142 - 1182, // 82: 10010011110, 121241 - 1508, // 83: 10111100100, 114212 - 1268, // 84: 10011110100, 124112 - 1266, // 85: 10011110010, 124211 - 1956, // 86: 11110100100, 411212 - 1940, // 87: 11110010100, 421112 - 1938, // 88: 11110010010, 421211 - 1758, // 89: 11011011110, 212141 - 1782, // 90: 11011110110, 214121 - 1974, // 91: 11110110110, 412121 - 1400, // 92: 10101111000, 111143 - 1310, // 93: 10100011110, 111341 - 1118, // 94: 10001011110, 131141 - 1512, // 95: 10111101000, 114113 - 1506, // 96: 10111100010, 114311 - 1960, // 97: 11110101000, 411113 - 1954, // 98: 11110100010, 411311 - 1502, // 99: 10111011110, 113141 - 1518, // 100: 10111101110, 114131 - 1886, // 101: 11101011110, 311141 - 1966, // 102: 11110101110, 411131 - 1668, // 103: 11010000100, 211412 - 1680, // 104: 11010010000, 211214 - 1692 // 105: 11010011100, 211232 -}; - -static const int code128_stop_pattern = 6379; // 1100011101011, 2331112 - -struct code128_step { - int prev_ix; // Index of previous step, if any - const char * next_input; // Remaining input - unsigned short len; // The length of the pattern so far (includes this step) - char mode; // State for the current encoding - signed char code; // What code should be written for this step -}; - -struct code128_state { - struct code128_step * steps; - int allocated_steps; - int current_ix; - int todo_ix; - int best_ix; - - size_t maxlength; -}; - -size_t code128_estimate_len(const char * s) -{ - return CODE128_QUIET_ZONE_LEN - + CODE128_CHAR_LEN // start code - + CODE128_CHAR_LEN * (CODE128_STRLEN(s) * 11 / 10) // contents + 10% padding - + CODE128_CHAR_LEN // checksum - + CODE128_STOP_CODE_LEN - + CODE128_QUIET_ZONE_LEN; -} - -static void code128_append_pattern(int pattern, int pattern_length, char * out) -{ - // All patterns have their first bit set by design - CODE128_ASSERT(pattern & (1 << (pattern_length - 1))); - - int i; - for(i = pattern_length - 1; i >= 0; i--) { - // cast avoids warning: implicit conversion from 'int' to 'char' changes value from 255 to -1 [-Wconstant-conversion] - *out++ = (unsigned char)((pattern & (1 << i)) ? 255 : 0); - } -} - -static int code128_append_code(int code, char * out) -{ - CODE128_ASSERT(code >= 0 && code < (int)(sizeof(code128_pattern) / sizeof(code128_pattern[0]))); - code128_append_pattern(code128_pattern[code], CODE128_CHAR_LEN, out); - return CODE128_CHAR_LEN; -} - -static int code128_append_stop_code(char * out) -{ - code128_append_pattern(code128_stop_pattern, CODE128_STOP_CODE_LEN, out); - return CODE128_STOP_CODE_LEN; -} - -static signed char code128_switch_code(char from_mode, char to_mode) -{ - switch(from_mode) { - case CODE128_MODE_A: - switch(to_mode) { - case CODE128_MODE_B: - return 100; - case CODE128_MODE_C: - return 99; - } - break; - - case CODE128_MODE_B: - switch(to_mode) { - case CODE128_MODE_A: - return 101; - case CODE128_MODE_C: - return 99; - } - break; - - case CODE128_MODE_C: - switch(to_mode) { - case CODE128_MODE_B: - return 100; - case CODE128_MODE_A: - return 101; - } - break; - default: - break; - } - - CODE128_ASSERT(0); // Invalid mode switch - return -1; -} - -static signed char code128a_ascii_to_code(signed char value) -{ - if(value >= ' ' && value <= '_') - return (signed char)(value - ' '); - else if(value >= 0 && value < ' ') - return (signed char)(value + 64); - else if(value == (signed char)CODE128_FNC1) - return 102; - else if(value == (signed char)CODE128_FNC2) - return 97; - else if(value == (signed char)CODE128_FNC3) - return 96; - else if(value == (signed char)CODE128_FNC4) - return 101; - else - return -1; -} - -static signed char code128b_ascii_to_code(signed char value) -{ - if(value >= ' ') // value <= 127 is implied - return (signed char)(value - ' '); - else if(value == (signed char)CODE128_FNC1) - return 102; - else if(value == (signed char)CODE128_FNC2) - return 97; - else if(value == (signed char)CODE128_FNC3) - return 96; - else if(value == (signed char)CODE128_FNC4) - return 100; - else - return -1; -} - -static signed char code128c_ascii_to_code(const char * values) -{ - if(values[0] == CODE128_FNC1) - return 102; - - if(values[0] >= '0' && values[0] <= '9' && - values[1] >= '0' && values[1] <= '9') { - char code = 10 * (values[0] - '0') + (values[1] - '0'); - return code; - } - - return -1; -} - -static int code128_do_a_step(struct code128_step * base, int prev_ix, int ix) -{ - struct code128_step * previous_step = &base[prev_ix]; - struct code128_step * step = &base[ix]; - - char value = *previous_step->next_input; - // NOTE: Currently we can't encode NULL - if(value == 0) - return 0; - - step->code = code128a_ascii_to_code(value); - if(step->code < 0) - return 0; - - step->prev_ix = prev_ix; - step->next_input = previous_step->next_input + 1; - step->mode = CODE128_MODE_A; - step->len = previous_step->len + CODE128_CHAR_LEN; - if(step->mode != previous_step->mode) - step->len += CODE128_CHAR_LEN; // Need to switch modes - - return 1; -} - -static int code128_do_b_step(struct code128_step * base, int prev_ix, int ix) -{ - struct code128_step * previous_step = &base[prev_ix]; - struct code128_step * step = &base[ix]; - - char value = *previous_step->next_input; - // NOTE: Currently we can't encode NULL - if(value == 0) - return 0; - - step->code = code128b_ascii_to_code(value); - if(step->code < 0) - return 0; - - step->prev_ix = prev_ix; - step->next_input = previous_step->next_input + 1; - step->mode = CODE128_MODE_B; - step->len = previous_step->len + CODE128_CHAR_LEN; - if(step->mode != previous_step->mode) - step->len += CODE128_CHAR_LEN; // Need to switch modes - - return 1; -} - -static int code128_do_c_step(struct code128_step * base, int prev_ix, int ix) -{ - struct code128_step * previous_step = &base[prev_ix]; - struct code128_step * step = &base[ix]; - - char value = *previous_step->next_input; - // NOTE: Currently we can't encode NULL - if(value == 0) - return 0; - - step->code = code128c_ascii_to_code(previous_step->next_input); - if(step->code < 0) - return 0; - - step->prev_ix = prev_ix; - step->next_input = previous_step->next_input + 1; - - // Mode C consumes 2 characters for codes 0-99 - if(step->code < 100) - step->next_input++; - - step->mode = CODE128_MODE_C; - step->len = previous_step->len + CODE128_CHAR_LEN; - if(step->mode != previous_step->mode) - step->len += CODE128_CHAR_LEN; // Need to switch modes - - return 1; -} - -static struct code128_step * code128_alloc_step(struct code128_state * state) -{ - if(state->todo_ix >= state->allocated_steps) { - state->allocated_steps += 1024; - state->steps = (struct code128_step *) CODE128_REALLOC(state->steps, - state->allocated_steps * sizeof(struct code128_step)); - } - - struct code128_step * step = &state->steps[state->todo_ix]; - - CODE128_MEMSET(step, 0, sizeof(*step)); - return step; -} - -static void code128_do_step(struct code128_state * state) -{ - struct code128_step * step = &state->steps[state->current_ix]; - if(*step->next_input == 0) { - // Done, so see if we have a new shortest encoding. - if((step->len < state->maxlength) || - (state->best_ix < 0 && step->len == state->maxlength)) { - state->best_ix = state->current_ix; - - // Update maxlength to avoid considering anything longer - state->maxlength = step->len; - } - return; - } - - // Don't try if we're already at or beyond the max acceptable - // length; - if(step->len >= state->maxlength) - return; - char mode = step->mode; - - code128_alloc_step(state); - int mode_c_worked = 0; - - // Always try mode C - if(code128_do_c_step(state->steps, state->current_ix, state->todo_ix)) { - state->todo_ix++; - code128_alloc_step(state); - mode_c_worked = 1; - } - - if(mode == CODE128_MODE_A) { - // If A works, stick with A. There's no advantage to switching - // to B proactively if A still works. - if(code128_do_a_step(state->steps, state->current_ix, state->todo_ix) || - code128_do_b_step(state->steps, state->current_ix, state->todo_ix)) - state->todo_ix++; - } - else if(mode == CODE128_MODE_B) { - // The same logic applies here. There's no advantage to switching - // proactively to A if B still works. - if(code128_do_b_step(state->steps, state->current_ix, state->todo_ix) || - code128_do_a_step(state->steps, state->current_ix, state->todo_ix)) - state->todo_ix++; - } - else if(!mode_c_worked) { - // In mode C. If mode C worked and we're in mode C, trying anything - // else is pointless since the mode C encoding will be shorter and - // there won't be any mode switches. - - // If we're leaving mode C, though, try both in case one ends up - // better than the other. - if(code128_do_a_step(state->steps, state->current_ix, state->todo_ix)) { - state->todo_ix++; - code128_alloc_step(state); - } - if(code128_do_b_step(state->steps, state->current_ix, state->todo_ix)) - state->todo_ix++; - } -} - -size_t code128_encode_raw(const char * s, char * out, size_t maxlength) -{ - struct code128_state state; - - const size_t overhead = CODE128_QUIET_ZONE_LEN - + CODE128_CHAR_LEN // checksum - + CODE128_STOP_CODE_LEN - + CODE128_QUIET_ZONE_LEN; - if(maxlength < overhead + CODE128_CHAR_LEN + CODE128_CHAR_LEN) { - // Need space to encode the start character and one additional - // character. - return 0; - } - - state.allocated_steps = 256; - state.steps = (struct code128_step *) CODE128_MALLOC(state.allocated_steps * sizeof(struct code128_step)); - state.current_ix = 0; - state.todo_ix = 0; - state.maxlength = maxlength - overhead; - state.best_ix = -1; - - // Initialize the first 3 steps for the 3 encoding routes (A, B, C) - state.steps[0].prev_ix = -1; - state.steps[0].next_input = s; - state.steps[0].len = CODE128_CHAR_LEN; - state.steps[0].mode = CODE128_MODE_C; - state.steps[0].code = CODE128_START_CODE_C; - - state.steps[1].prev_ix = -1; - state.steps[1].next_input = s; - state.steps[1].len = CODE128_CHAR_LEN; - state.steps[1].mode = CODE128_MODE_A; - state.steps[1].code = CODE128_START_CODE_A; - - state.steps[2].prev_ix = -1; - state.steps[2].next_input = s; - state.steps[2].len = CODE128_CHAR_LEN; - state.steps[2].mode = CODE128_MODE_B; - state.steps[2].code = CODE128_START_CODE_B; - - state.todo_ix = 3; - - // Keep going until no more work - do { - code128_do_step(&state); - state.current_ix++; - } while(state.current_ix != state.todo_ix); - - // If no best_step, then fail. - if(state.best_ix < 0) { - CODE128_FREE(state.steps); - return 0; - } - - // Determine the list of codes - size_t num_codes = state.maxlength / CODE128_CHAR_LEN; - char * codes = CODE128_MALLOC(num_codes); - CODE128_ASSERT(codes); - - struct code128_step * step = &state.steps[state.best_ix]; - size_t i; - for(i = num_codes - 1; i > 0; --i) { - struct code128_step * prev_step = &state.steps[step->prev_ix]; - codes[i] = step->code; - if(step->mode != prev_step->mode) { - --i; - codes[i] = code128_switch_code(prev_step->mode, step->mode); - } - step = prev_step; - } - codes[0] = step->code; - - // Encode everything up to the checksum - size_t actual_length = state.maxlength + overhead; - CODE128_MEMSET(out, 0, CODE128_QUIET_ZONE_LEN); - out += CODE128_QUIET_ZONE_LEN; - for(i = 0; i < num_codes; i++) - out += code128_append_code(codes[i], out); - - // Compute the checksum - int sum = codes[0]; - for(i = 1; i < num_codes; i++) - sum += (int)(codes[i] * i); - out += code128_append_code(sum % 103, out); - - // Finalize the code. - out += code128_append_stop_code(out); - CODE128_MEMSET(out, 0, CODE128_QUIET_ZONE_LEN); - - CODE128_FREE(codes); - CODE128_FREE(state.steps); - return actual_length; -} - -/** - * @brief Encode the GS1 string - * - * This converts [FNC1] sequences to raw FNC1 characters and - * removes spaces before encoding the barcodes. - * - * @return the length of barcode data in bytes - */ -size_t code128_encode_gs1(const char * s, char * out, size_t maxlength) -{ - size_t raw_size = CODE128_STRLEN(s) + 1; - char * raw = CODE128_MALLOC(raw_size); - CODE128_ASSERT(raw); - if(!raw) { - return 0; - } - - char * p = raw; - for(; *s != '\0'; s++) { - if(strncmp(s, "[FNC1]", 6) == 0) { - *p++ = CODE128_FNC1; - s += 5; - } - else if(*s != ' ') { - *p++ = *s; - } - } - *p = '\0'; - - size_t length = code128_encode_raw(raw, out, maxlength); - - CODE128_FREE(raw); - - return length; -} - -#endif /*LV_USE_BARCODE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/code128.h b/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/code128.h deleted file mode 100644 index 51d53d0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/code128.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2013-15, LKC Technologies, 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: -// -// Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. Redistributions in binary -// form must reproduce the above copyright notice, this list of conditions and -// the following disclaimer in the documentation and/or other materials -// provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT -// HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (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 CODE128_H -#define CODE128_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// Since the FNCn characters are not ASCII, define versions here to -// simplify encoding strings that include them. -#define CODE128_FNC1 '\xf1' -#define CODE128_FNC2 '\xf2' -#define CODE128_FNC3 '\xf3' -#define CODE128_FNC4 '\xf4' - -size_t code128_estimate_len(const char * s); -size_t code128_encode_gs1(const char * s, char * out, size_t maxlength); -size_t code128_encode_raw(const char * s, char * out, size_t maxlength); - -#ifdef __cplusplus -} -#endif - -#endif // CODE128_H diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/lv_barcode.c b/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/lv_barcode.c deleted file mode 100644 index 5688533..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/lv_barcode.c +++ /dev/null @@ -1,300 +0,0 @@ -/** - * @file lv_barcode.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj_class_private.h" -#include "lv_barcode_private.h" -#include "../../lvgl.h" - -#if LV_USE_BARCODE - -#include "code128.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_barcode_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_barcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_barcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static bool lv_barcode_change_buf_size(lv_obj_t * obj, int32_t w, int32_t h); -static void lv_barcode_clear(lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_barcode_class = { - .constructor_cb = lv_barcode_constructor, - .destructor_cb = lv_barcode_destructor, - .width_def = LV_SIZE_CONTENT, - .instance_size = sizeof(lv_barcode_t), - .base_class = &lv_canvas_class, - .name = "barcode", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_barcode_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -void lv_barcode_set_dark_color(lv_obj_t * obj, lv_color_t color) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_barcode_t * barcode = (lv_barcode_t *)obj; - barcode->dark_color = color; -} - -void lv_barcode_set_light_color(lv_obj_t * obj, lv_color_t color) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_barcode_t * barcode = (lv_barcode_t *)obj; - barcode->light_color = color; -} - -void lv_barcode_set_scale(lv_obj_t * obj, uint16_t scale) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - if(scale == 0) { - scale = 1; - } - - lv_barcode_t * barcode = (lv_barcode_t *)obj; - barcode->scale = scale; -} - -void lv_barcode_set_direction(lv_obj_t * obj, lv_dir_t direction) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_barcode_t * barcode = (lv_barcode_t *)obj; - barcode->direction = direction; -} - -void lv_barcode_set_tiled(lv_obj_t * obj, bool tiled) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_barcode_t * barcode = (lv_barcode_t *)obj; - barcode->tiled = tiled; - lv_image_set_inner_align(obj, tiled ? LV_IMAGE_ALIGN_TILE : LV_IMAGE_ALIGN_DEFAULT); -} - -lv_result_t lv_barcode_update(lv_obj_t * obj, const char * data) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(data); - - if(data == NULL || lv_strlen(data) == 0) { - LV_LOG_WARN("data is empty"); - lv_barcode_clear(obj); - return LV_RESULT_INVALID; - } - - size_t len = code128_estimate_len(data); - LV_LOG_INFO("data: %s, len = %zu", data, len); - - char * out_buf = lv_malloc(len); - LV_ASSERT_MALLOC(out_buf); - if(!out_buf) { - LV_LOG_ERROR("malloc failed for out_buf"); - lv_barcode_clear(obj); - return LV_RESULT_INVALID; - } - - int32_t barcode_w = (int32_t) code128_encode_gs1(data, out_buf, len); - LV_LOG_INFO("barcode width = %" LV_PRId32, barcode_w); - - lv_barcode_t * barcode = (lv_barcode_t *)obj; - LV_ASSERT(barcode->scale > 0); - uint16_t scale = barcode->scale; - - int32_t buf_w; - int32_t buf_h; - - if(barcode->tiled) { - buf_w = (barcode->direction == LV_DIR_HOR) ? barcode_w * scale : 1; - buf_h = (barcode->direction == LV_DIR_VER) ? barcode_w * scale : 1; - } - else { - lv_obj_update_layout(obj); - buf_w = (barcode->direction == LV_DIR_HOR) ? barcode_w * scale : lv_obj_get_width(obj); - buf_h = (barcode->direction == LV_DIR_VER) ? barcode_w * scale : lv_obj_get_height(obj); - } - - if(!lv_barcode_change_buf_size(obj, buf_w, buf_h)) { - lv_barcode_clear(obj); - lv_free(out_buf); - return LV_RESULT_INVALID; - } - - /* Temporarily disable invalidation to improve the efficiency of lv_canvas_set_px */ - lv_display_enable_invalidation(lv_obj_get_display(obj), false); - - lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); - uint32_t stride = draw_buf->header.stride; - const lv_color_t color = lv_color_hex(1); - - /* Clear the canvas */ - lv_draw_buf_clear(draw_buf, NULL); - - /* Set the palette */ - lv_canvas_set_palette(obj, 0, lv_color_to_32(barcode->light_color, LV_OPA_COVER)); - lv_canvas_set_palette(obj, 1, lv_color_to_32(barcode->dark_color, LV_OPA_COVER)); - - for(int32_t x = 0; x < barcode_w; x++) { - /*skip empty data*/ - if(out_buf[x] == 0) { - continue; - } - - for(uint16_t i = 0; i < scale; i++) { - int32_t offset = x * scale + i; - if(barcode->direction == LV_DIR_HOR) { - lv_canvas_set_px(obj, offset, 0, color, LV_OPA_COVER); - } - else { /*LV_DIR_VER*/ - if(barcode->tiled) { - lv_canvas_set_px(obj, 0, offset, color, LV_OPA_COVER); - } - else { - uint8_t * dest = lv_draw_buf_goto_xy(draw_buf, 0, offset); - lv_memset(dest, 0xFF, stride); - } - } - } - } - - /* Copy pixels by row */ - if(!barcode->tiled && barcode->direction == LV_DIR_HOR && buf_h > 1) { - /* Skip the first row */ - int32_t h = buf_h - 1; - const uint8_t * src = lv_draw_buf_goto_xy(draw_buf, 0, 0); - uint8_t * dest = lv_draw_buf_goto_xy(draw_buf, 0, 1); - while(h--) { - lv_memcpy(dest, src, stride); - dest += stride; - } - } - - /* invalidate the canvas to refresh it */ - lv_display_enable_invalidation(lv_obj_get_display(obj), true); - lv_obj_invalidate(obj); - - lv_free(out_buf); - - return LV_RESULT_OK; -} - -lv_color_t lv_barcode_get_dark_color(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_barcode_t * barcode = (lv_barcode_t *)obj; - return barcode->dark_color; -} - -lv_color_t lv_barcode_get_light_color(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_barcode_t * barcode = (lv_barcode_t *)obj; - return barcode->light_color; -} - -uint16_t lv_barcode_get_scale(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_barcode_t * barcode = (lv_barcode_t *)obj; - return barcode->scale; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_barcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - - lv_barcode_t * barcode = (lv_barcode_t *)obj; - barcode->dark_color = lv_color_black(); - barcode->light_color = lv_color_white(); - barcode->scale = 1; - barcode->direction = LV_DIR_HOR; - lv_image_set_inner_align(obj, LV_IMAGE_ALIGN_DEFAULT); -} - -static void lv_barcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - - lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); - if(draw_buf == NULL) return; - lv_image_cache_drop(draw_buf); - - /*@fixme destroy buffer in cache free_cb.*/ - lv_draw_buf_destroy(draw_buf); -} - -static bool lv_barcode_change_buf_size(lv_obj_t * obj, int32_t w, int32_t h) -{ - LV_ASSERT_NULL(obj); - if(w <= 0 || h <= 0) { - LV_LOG_WARN("invalid size: %" LV_PRId32 " x %" LV_PRId32, w, h); - return false; - } - - lv_draw_buf_t * old_buf = lv_canvas_get_draw_buf(obj); - lv_draw_buf_t * new_buf = lv_draw_buf_create(w, h, LV_COLOR_FORMAT_I1, LV_STRIDE_AUTO); - if(new_buf == NULL) { - LV_LOG_ERROR("malloc failed for canvas buffer"); - return false; - } - - lv_canvas_set_draw_buf(obj, new_buf); - LV_LOG_INFO("set canvas buffer: %p, width = %" LV_PRId32, (void *)new_buf, w); - - if(old_buf != NULL) lv_draw_buf_destroy(old_buf); - return true; -} - -static void lv_barcode_clear(lv_obj_t * obj) -{ - lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); - if(!draw_buf) { - return; - } - - lv_draw_buf_clear(draw_buf, NULL); - lv_image_cache_drop(draw_buf); - lv_obj_invalidate(obj); -} - -#endif /*LV_USE_BARCODE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/lv_barcode.h b/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/lv_barcode.h deleted file mode 100644 index c9c0ce6..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/lv_barcode.h +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @file lv_barcode.h - * - */ - -#ifndef LV_BARCODE_H -#define LV_BARCODE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../misc/lv_types.h" -#include "../../misc/lv_color.h" -#include "../../widgets/canvas/lv_canvas.h" - -#if LV_USE_BARCODE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_barcode_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an empty barcode (an `lv_canvas`) object. - * @param parent point to an object where to create the barcode - * @return pointer to the created barcode object - */ -lv_obj_t * lv_barcode_create(lv_obj_t * parent); - -/** - * Set the dark color of a barcode object - * @param obj pointer to barcode object - * @param color dark color of the barcode - */ -void lv_barcode_set_dark_color(lv_obj_t * obj, lv_color_t color); - -/** - * Set the light color of a barcode object - * @param obj pointer to barcode object - * @param color light color of the barcode - */ -void lv_barcode_set_light_color(lv_obj_t * obj, lv_color_t color); - -/** - * Set the scale of a barcode object - * @param obj pointer to barcode object - * @param scale scale factor - */ -void lv_barcode_set_scale(lv_obj_t * obj, uint16_t scale); - -/** - * Set the direction of a barcode object - * @param obj pointer to barcode object - * @param direction draw direction (`LV_DIR_HOR` or `LB_DIR_VER`) - */ -void lv_barcode_set_direction(lv_obj_t * obj, lv_dir_t direction); - -/** - * Set the tiled mode of a barcode object - * @param obj pointer to barcode object - * @param tiled true: tiled mode, false: normal mode (default) - */ -void lv_barcode_set_tiled(lv_obj_t * obj, bool tiled); - -/** - * Set the data of a barcode object - * @param obj pointer to barcode object - * @param data data to display - * @return LV_RESULT_OK: if no error; LV_RESULT_INVALID: on error - */ -lv_result_t lv_barcode_update(lv_obj_t * obj, const char * data); - -/** - * Get the dark color of a barcode object - * @param obj pointer to barcode object - * @return dark color of the barcode - */ -lv_color_t lv_barcode_get_dark_color(lv_obj_t * obj); - -/** - * Get the light color of a barcode object - * @param obj pointer to barcode object - * @return light color of the barcode - */ -lv_color_t lv_barcode_get_light_color(lv_obj_t * obj); - -/** - * Get the scale of a barcode object - * @param obj pointer to barcode object - * @return scale factor - */ -uint16_t lv_barcode_get_scale(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_BARCODE*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_BARCODE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/lv_barcode_private.h b/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/lv_barcode_private.h deleted file mode 100644 index e6d1819..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/barcode/lv_barcode_private.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @file lv_barcode_private.h - * - */ - -#ifndef LV_BARCODE_PRIVATE_H -#define LV_BARCODE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../widgets/canvas/lv_canvas_private.h" -#include "lv_barcode.h" - -#if LV_USE_BARCODE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*Data of barcode*/ -struct lv_barcode_t { - lv_canvas_t canvas; - lv_color_t dark_color; - lv_color_t light_color; - uint16_t scale; - lv_dir_t direction; - bool tiled; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_BARCODE */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_BARCODE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/bin_decoder/lv_bin_decoder.c b/software/Power_Pico/Middlewares/LVGL/src/libs/bin_decoder/lv_bin_decoder.c deleted file mode 100644 index 45edd65..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/bin_decoder/lv_bin_decoder.c +++ /dev/null @@ -1,1157 +0,0 @@ -/** - * @file lv_image_decoder.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../draw/lv_image_decoder_private.h" -#include "lv_bin_decoder.h" -#include "../../draw/lv_draw_image.h" -#include "../../draw/lv_draw_buf.h" -#include "../../stdlib/lv_string.h" -#include "../../stdlib/lv_sprintf.h" -#include "../../libs/rle/lv_rle.h" -#include "../../core/lv_global.h" - -#if LV_USE_LZ4_EXTERNAL - #include -#endif - -#if LV_USE_LZ4_INTERNAL - #include "../../libs/lz4/lz4.h" -#endif - -/********************* - * DEFINES - *********************/ - -#define DECODER_NAME "BIN" - -#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) - -/********************** - * TYPEDEFS - **********************/ - -/** - * Data format for compressed image data. - */ - -typedef struct lv_image_compressed_t { - uint32_t method: 4; /*Compression method, see `lv_image_compress_t`*/ - uint32_t reserved : 28; /*Reserved to be used later*/ - uint32_t compressed_size; /*Compressed data size in byte*/ - uint32_t decompressed_size; /*Decompressed data size in byte*/ - const uint8_t * data; /*Compressed data*/ -} lv_image_compressed_t; - -typedef struct { - lv_fs_file_t * f; - lv_color32_t * palette; - lv_opa_t * opa; - lv_image_compressed_t compressed; - lv_draw_buf_t * decoded; /*A draw buf to store decoded image*/ - lv_draw_buf_t * decompressed; /*Decompressed data could be used directly, thus must also be draw buf*/ - lv_draw_buf_t c_array; /*An C-array image that need to be converted to a draw buf*/ - lv_draw_buf_t * decoded_partial; /*A draw buf for decoded image via get_area_cb*/ -} decoder_data_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static decoder_data_t * get_decoder_data(lv_image_decoder_dsc_t * dsc); -static void free_decoder_data(lv_image_decoder_dsc_t * dsc); -static lv_result_t decode_indexed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -static lv_result_t load_indexed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -#if LV_BIN_DECODER_RAM_LOAD - static lv_result_t decode_rgb(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -#endif -static lv_result_t decode_alpha_only(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -static lv_result_t decode_indexed_line(lv_color_format_t color_format, const lv_color32_t * palette, int32_t x, - int32_t w_px, const uint8_t * in, lv_color32_t * out); -static lv_result_t decode_compressed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); - -static lv_fs_res_t fs_read_file_at(lv_fs_file_t * f, uint32_t pos, void * buff, uint32_t btr, uint32_t * br); - -static lv_result_t decompress_image(lv_image_decoder_dsc_t * dsc, const lv_image_compressed_t * compressed); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the lvgl binary image decoder module - */ -void lv_bin_decoder_init(void) -{ - lv_image_decoder_t * decoder; - - decoder = lv_image_decoder_create(); - LV_ASSERT_MALLOC(decoder); - if(decoder == NULL) { - LV_LOG_WARN("Out of memory"); - return; - } - - lv_image_decoder_set_info_cb(decoder, lv_bin_decoder_info); - lv_image_decoder_set_open_cb(decoder, lv_bin_decoder_open); - lv_image_decoder_set_get_area_cb(decoder, lv_bin_decoder_get_area); - lv_image_decoder_set_close_cb(decoder, lv_bin_decoder_close); - - decoder->name = DECODER_NAME; -} - -lv_result_t lv_bin_decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) -{ - LV_UNUSED(decoder); /*Unused*/ - - const void * src = dsc->src; - lv_image_src_t src_type = dsc->src_type; - - if(src_type == LV_IMAGE_SRC_VARIABLE) { - lv_image_dsc_t * image = (lv_image_dsc_t *)src; - lv_memcpy(header, &image->header, sizeof(lv_image_header_t)); - } - else if(src_type == LV_IMAGE_SRC_FILE) { - /*Support only "*.bin" files*/ - if(lv_strcmp(lv_fs_get_ext(src), "bin")) return LV_RESULT_INVALID; - - lv_fs_res_t res; - uint32_t rn; - res = lv_fs_read(&dsc->file, header, sizeof(lv_image_header_t), &rn); - - if(res != LV_FS_RES_OK || rn != sizeof(lv_image_header_t)) { - LV_LOG_WARN("Read file header failed: %d", res); - return LV_RESULT_INVALID; - } - - /** - * @todo - * This is a temp backward compatibility solution after adding - * magic in image header. - */ - if(header->magic != LV_IMAGE_HEADER_MAGIC) { - LV_LOG_WARN("Legacy bin image detected: %s", (char *)src); - header->cf = header->magic; - header->magic = LV_IMAGE_HEADER_MAGIC; - } - - /*File is always read to buf, thus data can be modified.*/ - header->flags |= LV_IMAGE_FLAGS_MODIFIABLE; - } - else if(src_type == LV_IMAGE_SRC_SYMBOL) { - /*The size depend on the font but it is unknown here. It should be handled outside of the - *function*/ - header->w = 1; - header->h = 1; - /*Symbols always have transparent parts. Important because of cover check in the draw - *function. The actual value doesn't matter because lv_draw_label will draw it*/ - header->cf = LV_COLOR_FORMAT_A8; - } - else { - LV_LOG_WARN("Image get info found unknown src type"); - return LV_RESULT_INVALID; - } - - /*For backward compatibility, all images are not premultiplied for now.*/ - if(header->magic != LV_IMAGE_HEADER_MAGIC) { - header->flags &= ~LV_IMAGE_FLAGS_PREMULTIPLIED; - } - - return LV_RESULT_OK; -} - -/** - * Decode an image from a binary file - * @param decoder pointer to the decoder - * @param dsc pointer to the decoder descriptor - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image - */ -lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); - - lv_result_t res = LV_RESULT_INVALID; - lv_fs_res_t fs_res = LV_FS_RES_UNKNOWN; - bool use_directly = false; /*If the image is already decoded and can be used directly*/ - - /*Open the file if it's a file*/ - if(dsc->src_type == LV_IMAGE_SRC_FILE) { - /*Support only "*.bin" files*/ - if(lv_strcmp(lv_fs_get_ext(dsc->src), "bin")) return LV_RESULT_INVALID; - - /*If the file was open successfully save the file descriptor*/ - decoder_data_t * decoder_data = get_decoder_data(dsc); - if(decoder_data == NULL) { - return LV_RESULT_INVALID; - } - - dsc->user_data = decoder_data; - lv_fs_file_t * f = lv_malloc(sizeof(*f)); - if(f == NULL) { - free_decoder_data(dsc); - return LV_RESULT_INVALID; - } - - fs_res = lv_fs_open(f, dsc->src, LV_FS_MODE_RD); - if(fs_res != LV_FS_RES_OK) { - LV_LOG_WARN("Open file failed: %d", fs_res); - lv_free(f); - free_decoder_data(dsc); - return LV_RESULT_INVALID; - } - - decoder_data->f = f; /*Now free_decoder_data will take care of the file*/ - - lv_color_format_t cf = dsc->header.cf; - - if(dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED) { - res = decode_compressed(decoder, dsc); - } - else if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { - if(dsc->args.use_indexed) { - /*Palette for indexed image and whole image of A8 image are always loaded to RAM for simplicity*/ - res = load_indexed(decoder, dsc); - } - else { - res = decode_indexed(decoder, dsc); - } - } - else if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf)) { - res = decode_alpha_only(decoder, dsc); - } -#if LV_BIN_DECODER_RAM_LOAD - else if(cf == LV_COLOR_FORMAT_ARGB8888 \ - || cf == LV_COLOR_FORMAT_XRGB8888 \ - || cf == LV_COLOR_FORMAT_RGB888 \ - || cf == LV_COLOR_FORMAT_RGB565 \ - || cf == LV_COLOR_FORMAT_RGB565A8 \ - || cf == LV_COLOR_FORMAT_ARGB8565) { - res = decode_rgb(decoder, dsc); - } -#else - else { - /* decode them in get_area_cb */ - res = LV_RESULT_OK; - } -#endif - } - - else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { - /*The variables should have valid data*/ - lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; - if(image->data == NULL) { - return LV_RESULT_INVALID; - } - - lv_color_format_t cf = image->header.cf; - if(dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED) { - res = decode_compressed(decoder, dsc); - } - else if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { - /*Need decoder data to store converted image*/ - decoder_data_t * decoder_data = get_decoder_data(dsc); - if(decoder_data == NULL) { - return LV_RESULT_INVALID; - } - - if(dsc->args.use_indexed) { - /*Palette for indexed image and whole image of A8 image are always loaded to RAM for simplicity*/ - res = load_indexed(decoder, dsc); - use_directly = true; /*If draw unit supports indexed image, it can be used directly.*/ - } - else { - res = decode_indexed(decoder, dsc); - } - } - else if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf)) { - /*Alpha only image will need decoder data to store pointer to decoded image, to free it when decoder closes*/ - decoder_data_t * decoder_data = get_decoder_data(dsc); - if(decoder_data == NULL) { - return LV_RESULT_INVALID; - } - - res = decode_alpha_only(decoder, dsc); - } - else { - /*In case of uncompressed formats the image stored in the ROM/RAM. - *So simply give its pointer*/ - - decoder_data_t * decoder_data = get_decoder_data(dsc); - lv_draw_buf_t * decoded; - if(image->header.flags & LV_IMAGE_FLAGS_ALLOCATED) { - decoded = (lv_draw_buf_t *)image; - } - else { - decoded = &decoder_data->c_array; - if(image->header.stride == 0) { - /*If image doesn't have stride, treat it as lvgl v8 legacy image format*/ - lv_image_dsc_t tmp = *image; - tmp.header.stride = (tmp.header.w * lv_color_format_get_bpp(cf) + 7) >> 3; - lv_draw_buf_from_image(decoded, &tmp); - } - else - lv_draw_buf_from_image(decoded, image); - } - - dsc->decoded = decoded; - - if(decoded->header.stride == 0) { - /*Use the auto calculated value from decoder_info callback*/ - decoded->header.stride = dsc->header.stride; - } - - res = LV_RESULT_OK; - use_directly = true; /*A variable image that can be used directly.*/ - } - } - - if(res != LV_RESULT_OK) { - free_decoder_data(dsc); - return res; - } - - if(dsc->decoded == NULL) return LV_RESULT_OK; /*Need to read via get_area_cb*/ - - lv_draw_buf_t * decoded = (lv_draw_buf_t *)dsc->decoded; - lv_draw_buf_t * adjusted = lv_image_decoder_post_process(dsc, decoded); - if(adjusted == NULL) { - free_decoder_data(dsc); - return LV_RESULT_INVALID; - } - - /*The adjusted draw buffer is newly allocated.*/ - if(adjusted != decoded) { - use_directly = false; /*Cannot use original image directly*/ - free_decoder_data(dsc); - decoder_data_t * decoder_data = get_decoder_data(dsc); - decoder_data->decoded = adjusted; /*Now this new buffer need to be free'd on decoder close*/ - } - dsc->decoded = adjusted; - - if(use_directly || dsc->args.no_cache) return LV_RESULT_OK; /*Do not put image to cache if it can be used directly.*/ - - /*If the image cache is disabled, just return the decoded image*/ - if(!lv_image_cache_is_enabled()) return LV_RESULT_OK; - - /*Add it to cache*/ - lv_image_cache_data_t search_key; - search_key.src_type = dsc->src_type; - search_key.src = dsc->src; - search_key.slot.size = dsc->decoded->data_size; - - lv_cache_entry_t * cache_entry = lv_image_decoder_add_to_cache(decoder, &search_key, dsc->decoded, dsc->user_data); - if(cache_entry == NULL) { - free_decoder_data(dsc); - return LV_RESULT_INVALID; - } - dsc->cache_entry = cache_entry; - decoder_data_t * decoder_data = get_decoder_data(dsc); - decoder_data->decoded = NULL; /*Cache will take care of it*/ - - return LV_RESULT_OK; -} - -void lv_bin_decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); /*Unused*/ - - decoder_data_t * decoder_data = dsc->user_data; - if(decoder_data && decoder_data->decoded_partial) { - lv_draw_buf_destroy(decoder_data->decoded_partial); - decoder_data->decoded_partial = NULL; - } - - free_decoder_data(dsc); -} - -lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, - const lv_area_t * full_area, lv_area_t * decoded_area) -{ - LV_UNUSED(decoder); /*Unused*/ - - lv_color_format_t cf = dsc->header.cf; - /*Check if cf is supported*/ - - bool supported = LV_COLOR_FORMAT_IS_INDEXED(cf) - || cf == LV_COLOR_FORMAT_ARGB8888 \ - || cf == LV_COLOR_FORMAT_XRGB8888 \ - || cf == LV_COLOR_FORMAT_RGB888 \ - || cf == LV_COLOR_FORMAT_RGB565 \ - || cf == LV_COLOR_FORMAT_ARGB8565 \ - || cf == LV_COLOR_FORMAT_RGB565A8; - if(!supported) { - LV_LOG_WARN("CF: %d is not supported", cf); - return LV_RESULT_INVALID; - } - - lv_fs_res_t res = LV_FS_RES_UNKNOWN; - decoder_data_t * decoder_data = dsc->user_data; - if(decoder_data == NULL) { - LV_LOG_ERROR("Unexpected null decoder data"); - return LV_RESULT_INVALID; - } - - lv_fs_file_t * f = decoder_data->f; - uint32_t bpp = lv_color_format_get_bpp(cf); - int32_t w_px = lv_area_get_width(full_area); - uint8_t * img_data = NULL; - lv_draw_buf_t * decoded = NULL; - uint32_t offset = dsc->src_type == LV_IMAGE_SRC_FILE ? sizeof(lv_image_header_t) : 0; /*Skip the image header*/ - - /*We only support read line by line for now*/ - if(decoded_area->y1 == LV_COORD_MIN) { - /*Indexed image is converted to ARGB888*/ - lv_color_format_t cf_decoded = LV_COLOR_FORMAT_IS_INDEXED(cf) ? LV_COLOR_FORMAT_ARGB8888 : cf; - - decoded = lv_draw_buf_reshape(decoder_data->decoded_partial, cf_decoded, w_px, 1, LV_STRIDE_AUTO); - if(decoded == NULL) { - if(decoder_data->decoded_partial != NULL) { - lv_draw_buf_destroy(decoder_data->decoded_partial); - decoder_data->decoded_partial = NULL; - } - decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, w_px, 1, cf_decoded, LV_STRIDE_AUTO); - if(decoded == NULL) return LV_RESULT_INVALID; - decoder_data->decoded_partial = decoded; /*Free on decoder close*/ - } - *decoded_area = *full_area; - decoded_area->y2 = decoded_area->y1; - } - else { - decoded_area->y1++; - decoded_area->y2++; - decoded = decoder_data->decoded_partial; /*Already allocated*/ - } - - img_data = decoded->data; /*Get the buffer to operate on*/ - - if(decoded_area->y1 > full_area->y2) { - return LV_RESULT_INVALID; - } - - if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { - int32_t x_fraction = decoded_area->x1 % (8 / bpp); - uint32_t len = (w_px * bpp + 7) / 8 + 1; /*10px for 1bpp may across 3bytes*/ - uint8_t * buf = NULL; - - offset += dsc->palette_size * 4; /*Skip palette*/ - offset += decoded_area->y1 * dsc->header.stride; - offset += decoded_area->x1 * bpp / 8; /*Move to x1*/ - if(dsc->src_type == LV_IMAGE_SRC_FILE) { - buf = lv_malloc(len); - LV_ASSERT_NULL(buf); - if(buf == NULL) - return LV_RESULT_INVALID; - - res = fs_read_file_at(f, offset, buf, len, NULL); - if(res != LV_FS_RES_OK) { - lv_free(buf); - return LV_RESULT_INVALID; - } - } - else { - const lv_image_dsc_t * image = dsc->src; - buf = (void *)(image->data + offset); - } - - decode_indexed_line(cf, dsc->palette, x_fraction, w_px, buf, (lv_color32_t *)img_data); - - if(dsc->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)buf); - - dsc->decoded = decoded; /*Return decoded image*/ - return LV_RESULT_OK; - } - - if(cf == LV_COLOR_FORMAT_ARGB8888 || cf == LV_COLOR_FORMAT_XRGB8888 || cf == LV_COLOR_FORMAT_RGB888 - || cf == LV_COLOR_FORMAT_RGB565 || cf == LV_COLOR_FORMAT_ARGB8565) { - uint32_t len = (w_px * bpp) / 8; - offset += decoded_area->y1 * dsc->header.stride; - offset += decoded_area->x1 * bpp / 8; /*Move to x1*/ - res = fs_read_file_at(f, offset, img_data, len, NULL); - if(res != LV_FS_RES_OK) { - return LV_RESULT_INVALID; - } - - dsc->decoded = decoded; /*Return decoded image*/ - return LV_RESULT_OK; - } - - if(cf == LV_COLOR_FORMAT_RGB565A8) { - bpp = 16; /* RGB565 + A8 mask*/ - uint32_t len = decoded->header.stride; - offset += decoded_area->y1 * dsc->header.stride; /*Move to y1*/ - offset += decoded_area->x1 * bpp / 8; /*Move to x1*/ - res = fs_read_file_at(f, offset, img_data, len, NULL); - if(res != LV_FS_RES_OK) { - return LV_RESULT_INVALID; - } - - /*Now the A8 mask*/ - offset = sizeof(lv_image_header_t); - offset += dsc->header.h * dsc->header.stride; /*Move to A8 map*/ - offset += decoded_area->y1 * (dsc->header.stride / 2); /*Move to y1*/ - offset += decoded_area->x1 * 1; /*Move to x1*/ - res = fs_read_file_at(f, offset, img_data + len, w_px * 1, NULL); - if(res != LV_FS_RES_OK) { - return LV_RESULT_INVALID; - } - - dsc->decoded = decoded; /*Return decoded image*/ - return LV_RESULT_OK; - } - - return LV_RESULT_INVALID; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static decoder_data_t * get_decoder_data(lv_image_decoder_dsc_t * dsc) -{ - decoder_data_t * data = dsc->user_data; - if(data == NULL) { - data = lv_malloc_zeroed(sizeof(decoder_data_t)); - LV_ASSERT_MALLOC(data); - if(data == NULL) { - LV_LOG_ERROR("Out of memory"); - return NULL; - } - - dsc->user_data = data; - } - - return data; -} - -static void free_decoder_data(lv_image_decoder_dsc_t * dsc) -{ - decoder_data_t * decoder_data = dsc->user_data; - if(decoder_data == NULL) return; - - if(decoder_data->f) { - lv_fs_close(decoder_data->f); - lv_free(decoder_data->f); - } - - if(decoder_data->decoded) lv_draw_buf_destroy(decoder_data->decoded); - if(decoder_data->decompressed) lv_draw_buf_destroy(decoder_data->decompressed); - lv_free(decoder_data->palette); - lv_free(decoder_data); - dsc->user_data = NULL; -} - -static lv_result_t decode_indexed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); /*Unused*/ - lv_fs_res_t res; - uint32_t rn; - decoder_data_t * decoder_data = dsc->user_data; - lv_fs_file_t * f = decoder_data->f; - lv_color_format_t cf = dsc->header.cf; - uint32_t palette_len = sizeof(lv_color32_t) * LV_COLOR_INDEXED_PALETTE_SIZE(cf); - const lv_color32_t * palette; - const uint8_t * indexed_data = NULL; - lv_draw_buf_t * draw_buf_indexed = NULL; - uint32_t stride = dsc->header.stride; - - bool is_compressed = dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED; - if(is_compressed) { - uint8_t * data = decoder_data->decompressed->data; - palette = (lv_color32_t *)data; - indexed_data = data + palette_len; - } - else if(dsc->src_type == LV_IMAGE_SRC_FILE) { - /*read palette for indexed image*/ - palette = lv_malloc(palette_len); - LV_ASSERT_MALLOC(palette); - if(palette == NULL) { - LV_LOG_ERROR("Out of memory"); - return LV_RESULT_INVALID; - } - - res = fs_read_file_at(f, sizeof(lv_image_header_t), (uint8_t *)palette, palette_len, &rn); - if(res != LV_FS_RES_OK || rn != palette_len) { - LV_LOG_WARN("Read palette failed: %d", res); - lv_free((void *)palette); - return LV_RESULT_INVALID; - } - - decoder_data->palette = (void *)palette; /*Need to free when decoder closes*/ - -#if LV_BIN_DECODER_RAM_LOAD - draw_buf_indexed = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, cf, - dsc->header.stride); - if(draw_buf_indexed == NULL) { - LV_LOG_ERROR("Draw buffer alloc failed"); - goto exit_with_buf; - } - - indexed_data = draw_buf_indexed->data; - - uint32_t data_len = 0; - if(lv_fs_seek(f, 0, LV_FS_SEEK_END) != LV_FS_RES_OK || - lv_fs_tell(f, &data_len) != LV_FS_RES_OK) { - LV_LOG_WARN("Failed to get file to size"); - goto exit_with_buf; - } - - uint32_t data_offset = sizeof(lv_image_header_t) + palette_len; - data_len -= data_offset; - res = fs_read_file_at(f, data_offset, (uint8_t *)indexed_data, data_len, &rn); - if(res != LV_FS_RES_OK || rn != data_len) { - LV_LOG_WARN("Read indexed image failed: %d", res); - goto exit_with_buf; - } -#endif - } - else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { - lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; - palette = (lv_color32_t *)image->data; - indexed_data = image->data + palette_len; - } - else { - return LV_RESULT_INVALID; - } - - dsc->palette = palette; - dsc->palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(cf); - -#if LV_BIN_DECODER_RAM_LOAD - /*Convert to ARGB8888, since sw renderer cannot render it directly even it's in RAM*/ - lv_draw_buf_t * decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, - LV_COLOR_FORMAT_ARGB8888, - 0); - if(decoded == NULL) { - LV_LOG_ERROR("No memory for indexed image"); - goto exit_with_buf; - } - - stride = decoded->header.stride; - uint8_t * img_data = decoded->data; - - const uint8_t * in = indexed_data; - uint8_t * out = img_data; - for(uint32_t y = 0; y < dsc->header.h; y++) { - decode_indexed_line(cf, dsc->palette, 0, dsc->header.w, in, (lv_color32_t *)out); - in += dsc->header.stride; - out += stride; - } - - dsc->decoded = decoded; - decoder_data->decoded = decoded; /*Free when decoder closes*/ - if(dsc->src_type == LV_IMAGE_SRC_FILE && !is_compressed) { - decoder_data->palette = (void *)palette; /*Free decoder data on close*/ - lv_draw_buf_destroy(draw_buf_indexed); - } - - return LV_RESULT_OK; -exit_with_buf: - if(dsc->src_type == LV_IMAGE_SRC_FILE && !is_compressed) { - lv_free((void *)palette); - decoder_data->palette = NULL; - } - - if(draw_buf_indexed) lv_draw_buf_destroy(draw_buf_indexed); - return LV_RESULT_INVALID; -#else - LV_UNUSED(stride); - LV_UNUSED(indexed_data); - LV_UNUSED(draw_buf_indexed); - /*It needs to be read by get_area_cb later*/ - return LV_RESULT_OK; -#endif -} - -static lv_result_t load_indexed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ -#if LV_BIN_DECODER_RAM_LOAD == 0 - LV_UNUSED(decoder); /*Unused*/ - LV_UNUSED(dsc); /*Unused*/ - LV_LOG_ERROR("LV_BIN_DECODER_RAM_LOAD is disabled"); - return LV_RESULT_INVALID; -#else - - LV_UNUSED(decoder); /*Unused*/ - - lv_fs_res_t res; - uint32_t rn; - decoder_data_t * decoder_data = dsc->user_data; - - if(dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED) { - /*The decompressed image is already loaded to RAM*/ - dsc->decoded = decoder_data->decompressed; - - /*Transfer ownership to decoded pointer because it's the final data we use.*/ - decoder_data->decoded = decoder_data->decompressed; - decoder_data->decompressed = NULL; - return LV_RESULT_OK; - } - - if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { - lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; - lv_draw_buf_t * decoded; - if(image->header.flags & LV_IMAGE_FLAGS_ALLOCATED) { - decoded = (lv_draw_buf_t *)image; - } - else { - decoded = &decoder_data->c_array; - lv_draw_buf_from_image(decoded, image); - } - - dsc->decoded = decoded; - - if(decoded->header.stride == 0) { - /*Use the auto calculated value from decoder_info callback*/ - decoded->header.stride = dsc->header.stride; - } - - return LV_RESULT_OK; - } - - if(dsc->src_type == LV_IMAGE_SRC_FILE) { - lv_color_format_t cf = dsc->header.cf; - lv_fs_file_t * f = decoder_data->f; - lv_draw_buf_t * decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, cf, - dsc->header.stride); - if(decoded == NULL) { - LV_LOG_ERROR("Draw buffer alloc failed"); - return LV_RESULT_INVALID; - } - - uint8_t * data = decoded->data; - uint32_t palette_len = sizeof(lv_color32_t) * LV_COLOR_INDEXED_PALETTE_SIZE(cf); - res = fs_read_file_at(f, sizeof(lv_image_header_t), data, palette_len, &rn); - if(res != LV_FS_RES_OK || rn != palette_len) { - LV_LOG_WARN("Read palette failed: %d", res); - lv_draw_buf_destroy(decoded); - return LV_RESULT_INVALID; - } - - uint32_t data_len = 0; - if(lv_fs_seek(f, 0, LV_FS_SEEK_END) != LV_FS_RES_OK || - lv_fs_tell(f, &data_len) != LV_FS_RES_OK) { - LV_LOG_WARN("Failed to get file to size"); - lv_draw_buf_destroy(decoded); - return LV_RESULT_INVALID; - } - - uint32_t data_offset = sizeof(lv_image_header_t) + palette_len; - data_len -= data_offset; - data += palette_len; - res = fs_read_file_at(f, data_offset, data, data_len, &rn); - if(res != LV_FS_RES_OK || rn != data_len) { - LV_LOG_WARN("Read indexed image failed: %d", res); - lv_draw_buf_destroy(decoded); - return LV_RESULT_INVALID; - } - - decoder_data->decoded = decoded; - dsc->decoded = decoded; - return LV_RESULT_OK; - } - - LV_LOG_ERROR("Unknown src type: %d", dsc->src_type); - return LV_RESULT_INVALID; -#endif -} - -#if LV_BIN_DECODER_RAM_LOAD -static lv_result_t decode_rgb(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); - lv_fs_res_t res; - decoder_data_t * decoder_data = dsc->user_data; - lv_fs_file_t * f = decoder_data->f; - lv_color_format_t cf = dsc->header.cf; - - uint32_t len = dsc->header.stride * dsc->header.h; - if(cf == LV_COLOR_FORMAT_RGB565A8) { - len += (dsc->header.stride / 2) * dsc->header.h; /*A8 mask*/ - } - - lv_draw_buf_t * decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, cf, - dsc->header.stride); - if(decoded == NULL) { - LV_LOG_ERROR("No memory for rgb file read"); - return LV_RESULT_INVALID; - } - - uint8_t * img_data = decoded->data; - - uint32_t rn; - res = fs_read_file_at(f, sizeof(lv_image_header_t), img_data, len, &rn); - if(res != LV_FS_RES_OK || rn != len) { - LV_LOG_WARN("Read rgb file failed: %d", res); - lv_draw_buf_destroy(decoded); - return LV_RESULT_INVALID; - } - - dsc->decoded = decoded; - decoder_data->decoded = decoded; /*Free when decoder closes*/ - return LV_RESULT_OK; -} -#endif - -/** - * Extend A1/2/4 to A8 with interpolation to reduce rounding error. - */ -static inline uint8_t bit_extend(uint8_t value, uint8_t bpp) -{ - if(value == 0) return 0; - - uint8_t res = value; - uint8_t bpp_now = bpp; - while(bpp_now < 8) { - res |= value << (8 - bpp_now); - bpp_now += bpp; - }; - - return res; -} - -static lv_result_t decode_alpha_only(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); - lv_fs_res_t res; - uint32_t rn; - decoder_data_t * decoder_data = dsc->user_data; - uint8_t bpp = lv_color_format_get_bpp(dsc->header.cf); - uint32_t w = (dsc->header.stride * 8) / bpp; - uint32_t buf_stride = (w * 8 + 7) >> 3; /*stride for img_data*/ - uint32_t buf_len = w * dsc->header.h; /*always decode to A8 format*/ - lv_draw_buf_t * decoded; - uint32_t file_len = (uint32_t)dsc->header.stride * dsc->header.h; - - decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, LV_COLOR_FORMAT_A8, - buf_stride); - if(decoded == NULL) { - LV_LOG_ERROR("Out of memory"); - return LV_RESULT_INVALID; - } - - uint8_t * img_data = decoded->data; - - if(dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED) { - /*Copy from image data*/ - lv_memcpy(img_data, decoder_data->decompressed->data, file_len); - } - else if(dsc->src_type == LV_IMAGE_SRC_FILE) { - res = fs_read_file_at(decoder_data->f, sizeof(lv_image_header_t), img_data, file_len, &rn); - if(res != LV_FS_RES_OK || rn != file_len) { - LV_LOG_WARN("Read header failed: %d", res); - lv_draw_buf_destroy(decoded); - return LV_RESULT_INVALID; - } - } - else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { - /*Copy from image data*/ - lv_memcpy(img_data, ((lv_image_dsc_t *)dsc->src)->data, file_len); - } - - if(dsc->header.cf != LV_COLOR_FORMAT_A8) { - /*Convert A1/2/4 to A8 from last pixel to first pixel*/ - uint8_t * in = img_data + file_len - 1; - uint8_t * out = img_data + buf_len - 1; - uint8_t mask = (1 << bpp) - 1; - uint8_t shift = 0; - for(uint32_t i = 0; i < buf_len; i++) { - /** - * Rounding error: - * Take bpp = 4 as example, alpha value of 0x0 to 0x0F should be - * mapped to 0x00 to 0xFF. Using below equation will give us 0x00 to 0xF0 - * thus causes error. We can simply interpolate the value to fix it. - * - * Equation: *out = ((*in >> shift) & mask) << (8 - bpp); - * Ideal: *out = ((*in >> shift) & mask) * 255 / ((1L << bpp) - 1) - */ - uint8_t value = ((*in >> shift) & mask); - *out = bit_extend(value, bpp); - shift += bpp; - if(shift >= 8) { - shift = 0; - in--; - } - out--; - } - } - - decoder_data->decoded = decoded; - dsc->decoded = decoded; - return LV_RESULT_OK; -} - -static lv_result_t decode_compressed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ -#if LV_BIN_DECODER_RAM_LOAD - uint32_t rn; - uint32_t len; - uint32_t compressed_len; - decoder_data_t * decoder_data = get_decoder_data(dsc); - lv_result_t res; - lv_fs_res_t fs_res; - uint8_t * file_buf = NULL; - lv_image_compressed_t * compressed = &decoder_data->compressed; - - lv_memzero(compressed, sizeof(lv_image_compressed_t)); - - if(dsc->src_type == LV_IMAGE_SRC_FILE) { - lv_fs_file_t * f = decoder_data->f; - - if(lv_fs_seek(f, 0, LV_FS_SEEK_END) != LV_FS_RES_OK || - lv_fs_tell(f, &compressed_len) != LV_FS_RES_OK) { - LV_LOG_WARN("Failed to get compressed file len"); - return LV_RESULT_INVALID; - } - - compressed_len -= sizeof(lv_image_header_t); - compressed_len -= 12; - - /*Read compress header*/ - len = 12; - fs_res = fs_read_file_at(f, sizeof(lv_image_header_t), compressed, len, &rn); - if(fs_res != LV_FS_RES_OK || rn != len) { - LV_LOG_WARN("Read compressed header failed: %d", fs_res); - return LV_RESULT_INVALID; - } - - if(compressed->compressed_size != compressed_len) { - LV_LOG_WARN("Compressed size mismatch: %" LV_PRIu32" != %" LV_PRIu32, compressed->compressed_size, compressed_len); - return LV_RESULT_INVALID; - } - - file_buf = lv_malloc(compressed_len); - if(file_buf == NULL) { - LV_LOG_WARN("No memory for compressed file"); - return LV_RESULT_INVALID; - - } - - /*Continue to read the compressed data following compression header*/ - fs_res = lv_fs_read(f, file_buf, compressed_len, &rn); - if(fs_res != LV_FS_RES_OK || rn != compressed_len) { - LV_LOG_WARN("Read compressed file failed: %d", fs_res); - lv_free(file_buf); - return LV_RESULT_INVALID; - } - - /*Decompress the image*/ - compressed->data = file_buf; - } - else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { - lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; - compressed_len = image->data_size; - - /*Read compress header*/ - len = 12; - compressed_len -= len; - lv_memcpy(compressed, image->data, len); - compressed->data = image->data + len; - if(compressed->compressed_size != compressed_len) { - LV_LOG_WARN("Compressed size mismatch: %" LV_PRIu32" != %" LV_PRIu32, compressed->compressed_size, compressed_len); - return LV_RESULT_INVALID; - } - } - else { - LV_LOG_WARN("Compressed image only support file or variable"); - return LV_RESULT_INVALID; - } - - res = decompress_image(dsc, compressed); - compressed->data = NULL; /*No need to store the data any more*/ - lv_free(file_buf); - if(res != LV_RESULT_OK) { - LV_LOG_WARN("Decompress failed"); - return LV_RESULT_INVALID; - } - - /*Depends on the cf, need to further decode image like an C-array image*/ - lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; - if(image->data == NULL) { - return LV_RESULT_INVALID; - } - - lv_color_format_t cf = dsc->header.cf; - if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { - if(dsc->args.use_indexed) res = load_indexed(decoder, dsc); - else res = decode_indexed(decoder, dsc); - } - else if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf)) { - res = decode_alpha_only(decoder, dsc); - } - else { - /*The decompressed data is the original image data.*/ - dsc->decoded = decoder_data->decompressed; - - /*Transfer ownership of decompressed to `decoded` since it can be used directly*/ - decoder_data->decoded = decoder_data->decompressed; - decoder_data->decompressed = NULL; - res = LV_RESULT_OK; - } - - return res; -#else - LV_UNUSED(decompress_image); - LV_UNUSED(decoder); - LV_UNUSED(dsc); - LV_LOG_ERROR("Need LV_BIN_DECODER_RAM_LOAD to be enabled"); - return LV_RESULT_INVALID; -#endif -} - -static lv_result_t decode_indexed_line(lv_color_format_t color_format, const lv_color32_t * palette, int32_t x, - int32_t w_px, const uint8_t * in, lv_color32_t * out) -{ - uint8_t px_size; - uint16_t mask; - - int8_t shift = 0; - switch(color_format) { - case LV_COLOR_FORMAT_I1: - px_size = 1; - in += x / 8; /*8pixel per byte*/ - shift = 7 - (x & 0x7); - break; - case LV_COLOR_FORMAT_I2: - px_size = 2; - in += x / 4; /*4pixel per byte*/ - shift = 6 - 2 * (x & 0x3); - break; - case LV_COLOR_FORMAT_I4: - px_size = 4; - in += x / 2; /*2pixel per byte*/ - shift = 4 - 4 * (x & 0x1); - break; - case LV_COLOR_FORMAT_I8: - px_size = 8; - in += x; - shift = 0; - break; - default: - return LV_RESULT_INVALID; - } - - mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/ - - int32_t i; - for(i = 0; i < w_px; i++) { - uint8_t val_act = (*in >> shift) & mask; - out[i] = palette[val_act]; - - shift -= px_size; - if(shift < 0) { - shift = 8 - px_size; - in++; - } - } - return LV_RESULT_OK; -} - -static lv_fs_res_t fs_read_file_at(lv_fs_file_t * f, uint32_t pos, void * buff, uint32_t btr, uint32_t * br) -{ - lv_fs_res_t res; - if(br) *br = 0; - - res = lv_fs_seek(f, pos, LV_FS_SEEK_SET); - if(res != LV_FS_RES_OK) { - return res; - } - - res |= lv_fs_read(f, buff, btr, br); - if(res != LV_FS_RES_OK) { - return res; - } - - return LV_FS_RES_OK; -} - -static lv_result_t decompress_image(lv_image_decoder_dsc_t * dsc, const lv_image_compressed_t * compressed) -{ - /*Need to store decompressed data to decoder to free on close*/ - decoder_data_t * decoder_data = get_decoder_data(dsc); - if(decoder_data == NULL) { - return LV_RESULT_INVALID; - } - - uint8_t * img_data; - uint32_t out_len = compressed->decompressed_size; - uint32_t input_len = compressed->compressed_size; - LV_UNUSED(input_len); - LV_UNUSED(out_len); - - lv_draw_buf_t * decompressed = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, - dsc->header.cf, - dsc->header.stride); - if(decompressed == NULL) { - LV_LOG_WARN("No memory for decompressed image, input: %" LV_PRIu32 ", output: %" LV_PRIu32, input_len, out_len); - return LV_RESULT_INVALID; - } - - if(out_len > decompressed->data_size) { - LV_LOG_ERROR("Decompressed size mismatch: %" LV_PRIu32 " > %" LV_PRIu32, out_len, decompressed->data_size); - lv_draw_buf_destroy(decompressed); - return LV_RESULT_INVALID; - } - - img_data = decompressed->data; - - if(compressed->method == LV_IMAGE_COMPRESS_RLE) { -#if LV_USE_RLE - /*Compress always happen on byte*/ - uint32_t pixel_byte; - if(dsc->header.cf == LV_COLOR_FORMAT_RGB565A8) - pixel_byte = 2; - else - pixel_byte = (lv_color_format_get_bpp(dsc->header.cf) + 7) >> 3; - const uint8_t * input = compressed->data; - uint8_t * output = img_data; - uint32_t len; - len = lv_rle_decompress(input, input_len, output, out_len, pixel_byte); - if(len != compressed->decompressed_size) { - LV_LOG_WARN("Decompress failed: %" LV_PRIu32 ", got: %" LV_PRIu32, out_len, len); - lv_draw_buf_destroy(decompressed); - return LV_RESULT_INVALID; - } -#else - LV_LOG_WARN("RLE decompress is not enabled"); - lv_draw_buf_destroy(decompressed); - return LV_RESULT_INVALID; -#endif - } - else if(compressed->method == LV_IMAGE_COMPRESS_LZ4) { -#if LV_USE_LZ4 - const char * input = (const char *)compressed->data; - char * output = (char *)img_data; - int len; - len = LZ4_decompress_safe(input, output, input_len, out_len); - if(len < 0 || (uint32_t)len != compressed->decompressed_size) { - LV_LOG_WARN("Decompress failed: %" LV_PRId32 ", got: %" LV_PRId32, out_len, len); - lv_draw_buf_destroy(decompressed); - return LV_RESULT_INVALID; - } -#else - LV_LOG_WARN("LZ4 decompress is not enabled"); - lv_draw_buf_destroy(decompressed); - return LV_RESULT_INVALID; -#endif - } - else { - LV_UNUSED(img_data); - LV_LOG_WARN("Unknown compression method: %d", compressed->method); - lv_draw_buf_destroy(decompressed); - return LV_RESULT_INVALID; - } - - decoder_data->decompressed = decompressed; /*Free on decoder close*/ - return LV_RESULT_OK; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/bin_decoder/lv_bin_decoder.h b/software/Power_Pico/Middlewares/LVGL/src/libs/bin_decoder/lv_bin_decoder.h deleted file mode 100644 index d441230..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/bin_decoder/lv_bin_decoder.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @file lv_bin_decoder.h - * - */ - -#ifndef LV_BIN_DECODER_H -#define LV_BIN_DECODER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../draw/lv_image_decoder.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the binary image decoder module - */ -void lv_bin_decoder_init(void); - -/** - * Get info about a lvgl binary image - * @param decoder the decoder where this function belongs - * @param dsc image descriptor containing the source and type of the image and other info. - * @param header store the image data here - * @return LV_RESULT_OK: the info is successfully stored in `header`; LV_RESULT_INVALID: unknown format or other error. - */ -lv_result_t lv_bin_decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header); - -lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, - const lv_area_t * full_area, lv_area_t * decoded_area); - -/** - * Open a lvgl binary image - * @param decoder the decoder where this function belongs - * @param dsc pointer to decoder descriptor. `src`, `style` are already initialized in it. - * @return LV_RESULT_OK: the info is successfully stored in `header`; LV_RESULT_INVALID: unknown format or other error. - */ -lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); - -/** - * Close the pending decoding. Free resources etc. - * @param decoder pointer to the decoder the function associated with - * @param dsc pointer to decoder descriptor - */ -void lv_bin_decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_BIN_DECODER_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/bmp/lv_bmp.c b/software/Power_Pico/Middlewares/LVGL/src/libs/bmp/lv_bmp.c deleted file mode 100644 index aeb9dad..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/bmp/lv_bmp.c +++ /dev/null @@ -1,253 +0,0 @@ -/** - * @file lv_bmp.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../draw/lv_image_decoder_private.h" -#include "../../../lvgl.h" -#if LV_USE_BMP - -#include -#include "../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ - -#define DECODER_NAME "BMP" - -#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_fs_file_t f; - unsigned int px_offset; - int px_width; - int px_height; - unsigned int bpp; - int row_size_bytes; -} bmp_dsc_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * src, lv_image_header_t * header); -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); - -static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, - const lv_area_t * full_area, lv_area_t * decoded_area); - -static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ -void lv_bmp_init(void) -{ - lv_image_decoder_t * dec = lv_image_decoder_create(); - lv_image_decoder_set_info_cb(dec, decoder_info); - lv_image_decoder_set_open_cb(dec, decoder_open); - lv_image_decoder_set_get_area_cb(dec, decoder_get_area); - lv_image_decoder_set_close_cb(dec, decoder_close); - - dec->name = DECODER_NAME; -} - -void lv_bmp_deinit(void) -{ - lv_image_decoder_t * dec = NULL; - while((dec = lv_image_decoder_get_next(dec)) != NULL) { - if(dec->info_cb == decoder_info) { - lv_image_decoder_delete(dec); - break; - } - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Get info about a BMP image - * @param dsc image descriptor containing the source and type of the image and other info. - * @param header store the info here - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info - */ -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) -{ - LV_UNUSED(decoder); - - const void * src = dsc->src; - lv_image_src_t src_type = dsc->src_type; /*Get the source type*/ - - /*If it's a BMP file...*/ - if(src_type == LV_IMAGE_SRC_FILE) { - const char * fn = src; - if(lv_strcmp(lv_fs_get_ext(fn), "bmp") == 0) { /*Check the extension*/ - /*Save the data in the header*/ - uint8_t headers[54]; - - lv_fs_read(&dsc->file, headers, 54, NULL); - uint32_t w; - uint32_t h; - lv_memcpy(&w, headers + 18, 4); - lv_memcpy(&h, headers + 22, 4); - header->w = w; - header->h = h; - - uint16_t bpp; - lv_memcpy(&bpp, headers + 28, 2); - switch(bpp) { - case 16: - header->cf = LV_COLOR_FORMAT_RGB565; - break; - case 24: - header->cf = LV_COLOR_FORMAT_RGB888; - break; - case 32: - header->cf = LV_COLOR_FORMAT_ARGB8888; - break; - default: - LV_LOG_WARN("Not supported bpp: %d", bpp); - return LV_RESULT_OK; - } - return LV_RESULT_OK; - } - } - /* BMP file as data not supported for simplicity. - * Convert them to LVGL compatible C arrays directly. */ - else if(src_type == LV_IMAGE_SRC_VARIABLE) { - return LV_RESULT_INVALID; - } - - return LV_RESULT_INVALID; /*If didn't succeeded earlier then it's an error*/ -} - -/** - * Open a BMP image and return the decided image - * @param decoder pointer to the decoder - * @param dsc pointer to the decoder descriptor - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image - */ -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); - - /*If it's a BMP file...*/ - if(dsc->src_type == LV_IMAGE_SRC_FILE) { - const char * fn = dsc->src; - - if(lv_strcmp(lv_fs_get_ext(fn), "bmp") != 0) { - return LV_RESULT_INVALID; /*Check the extension*/ - } - - bmp_dsc_t b; - lv_memset(&b, 0x00, sizeof(b)); - - lv_fs_res_t res = lv_fs_open(&b.f, dsc->src, LV_FS_MODE_RD); - if(res != LV_FS_RES_OK) return LV_RESULT_INVALID; - - uint8_t header[54]; - lv_fs_read(&b.f, header, 54, NULL); - - if(0x42 != header[0] || 0x4d != header[1]) { - lv_fs_close(&b.f); - return LV_RESULT_INVALID; - } - - lv_memcpy(&b.px_offset, header + 10, 4); - lv_memcpy(&b.px_width, header + 18, 4); - lv_memcpy(&b.px_height, header + 22, 4); - lv_memcpy(&b.bpp, header + 28, 2); - b.row_size_bytes = ((b.bpp * b.px_width + 31) / 32) * 4; - - dsc->user_data = lv_malloc(sizeof(bmp_dsc_t)); - LV_ASSERT_MALLOC(dsc->user_data); - if(dsc->user_data == NULL) return LV_RESULT_INVALID; - lv_memcpy(dsc->user_data, &b, sizeof(b)); - return LV_RESULT_OK; - } - /* BMP file as data not supported for simplicity. - * Convert them to LVGL compatible C arrays directly. */ - else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { - return LV_RESULT_INVALID; - } - - return LV_RESULT_INVALID; /*If not returned earlier then it failed*/ -} - -static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, - const lv_area_t * full_area, lv_area_t * decoded_area) -{ - LV_UNUSED(decoder); - bmp_dsc_t * b = dsc->user_data; - lv_draw_buf_t * decoded = (void *)dsc->decoded; - - if(decoded_area->y1 == LV_COORD_MIN) { - *decoded_area = *full_area; - decoded_area->y2 = decoded_area->y1; - int32_t w_px = lv_area_get_width(full_area); - lv_draw_buf_t * reshaped = lv_draw_buf_reshape(decoded, dsc->header.cf, w_px, 1, LV_STRIDE_AUTO); - if(reshaped == NULL) { - if(decoded != NULL) { - lv_draw_buf_destroy(decoded); - decoded = NULL; - dsc->decoded = NULL; - } - decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, w_px, 1, dsc->header.cf, LV_STRIDE_AUTO); - if(decoded == NULL) return LV_RESULT_INVALID; - } - else { - decoded = reshaped; - } - dsc->decoded = decoded; - } - else { - decoded_area->y1++; - decoded_area->y2++; - } - - if(decoded_area->y1 > full_area->y2) { - return LV_RESULT_INVALID; - } - else { - int32_t y = (b->px_height - 1) - (decoded_area->y1); /*BMP images are stored upside down*/ - uint32_t p = b->px_offset + b->row_size_bytes * y; - p += (decoded_area->x1) * (b->bpp / 8); - lv_fs_seek(&b->f, p, LV_FS_SEEK_SET); - uint32_t line_width_byte = lv_area_get_width(full_area) * (b->bpp / 8); - lv_fs_read(&b->f, decoded->data, line_width_byte, NULL); - - return LV_RESULT_OK; - } -} - -/** - * Free the allocated resources - */ -static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); - bmp_dsc_t * b = dsc->user_data; - lv_fs_close(&b->f); - lv_free(dsc->user_data); - if(dsc->decoded) lv_draw_buf_destroy((void *)dsc->decoded); - -} - -#endif /*LV_USE_BMP*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/bmp/lv_bmp.h b/software/Power_Pico/Middlewares/LVGL/src/libs/bmp/lv_bmp.h deleted file mode 100644 index a7dbe27..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/bmp/lv_bmp.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @file lv_bmp.h - * - */ - -#ifndef LV_BMP_H -#define LV_BMP_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_BMP - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ -void lv_bmp_init(void); -void lv_bmp_deinit(void); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_BMP*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_BMP_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/ffmpeg/lv_ffmpeg.c b/software/Power_Pico/Middlewares/LVGL/src/libs/ffmpeg/lv_ffmpeg.c deleted file mode 100644 index 839ab2a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/ffmpeg/lv_ffmpeg.c +++ /dev/null @@ -1,873 +0,0 @@ -/** - * @file lv_ffmpeg.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_ffmpeg_private.h" -#if LV_USE_FFMPEG != 0 -#include "../../draw/lv_image_decoder_private.h" -#include "../../core/lv_obj_class_private.h" - -#include -#include -#include -#include -#include -#include - -/********************* - * DEFINES - *********************/ - -#define DECODER_NAME "FFMPEG" - -#if LV_COLOR_DEPTH == 8 - #define AV_PIX_FMT_TRUE_COLOR AV_PIX_FMT_RGB8 -#elif LV_COLOR_DEPTH == 16 - #define AV_PIX_FMT_TRUE_COLOR AV_PIX_FMT_RGB565LE -#elif LV_COLOR_DEPTH == 32 - #define AV_PIX_FMT_TRUE_COLOR AV_PIX_FMT_BGR0 -#else - #error Unsupported LV_COLOR_DEPTH -#endif - -#define MY_CLASS (&lv_ffmpeg_player_class) - -#define FRAME_DEF_REFR_PERIOD 33 /*[ms]*/ - -/********************** - * TYPEDEFS - **********************/ -struct ffmpeg_context_s { - AVFormatContext * fmt_ctx; - AVCodecContext * video_dec_ctx; - AVStream * video_stream; - uint8_t * video_src_data[4]; - uint8_t * video_dst_data[4]; - struct SwsContext * sws_ctx; - AVFrame * frame; - AVPacket * pkt; - int video_stream_idx; - int video_src_linesize[4]; - int video_dst_linesize[4]; - enum AVPixelFormat video_dst_pix_fmt; - bool has_alpha; - lv_draw_buf_t draw_buf; -}; - -#pragma pack(1) - -struct lv_image_pixel_color_s { - lv_color_t c; - uint8_t alpha; -}; - -#pragma pack() - -/********************** - * STATIC PROTOTYPES - **********************/ - -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * src, lv_image_header_t * header); -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc); - -static struct ffmpeg_context_s * ffmpeg_open_file(const char * path); -static void ffmpeg_close(struct ffmpeg_context_s * ffmpeg_ctx); -static void ffmpeg_close_src_ctx(struct ffmpeg_context_s * ffmpeg_ctx); -static void ffmpeg_close_dst_ctx(struct ffmpeg_context_s * ffmpeg_ctx); -static int ffmpeg_image_allocate(struct ffmpeg_context_s * ffmpeg_ctx); -static int ffmpeg_get_image_header(const char * path, lv_image_header_t * header); -static int ffmpeg_get_frame_refr_period(struct ffmpeg_context_s * ffmpeg_ctx); -static uint8_t * ffmpeg_get_image_data(struct ffmpeg_context_s * ffmpeg_ctx); -static int ffmpeg_update_next_frame(struct ffmpeg_context_s * ffmpeg_ctx); -static int ffmpeg_output_video_frame(struct ffmpeg_context_s * ffmpeg_ctx); -static bool ffmpeg_pix_fmt_has_alpha(enum AVPixelFormat pix_fmt); -static bool ffmpeg_pix_fmt_is_yuv(enum AVPixelFormat pix_fmt); - -static void lv_ffmpeg_player_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_ffmpeg_player_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_ffmpeg_player_class = { - .constructor_cb = lv_ffmpeg_player_constructor, - .destructor_cb = lv_ffmpeg_player_destructor, - .instance_size = sizeof(lv_ffmpeg_player_t), - .base_class = &lv_image_class, - .name = "ffmpeg-player", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_ffmpeg_init(void) -{ - lv_image_decoder_t * dec = lv_image_decoder_create(); - lv_image_decoder_set_info_cb(dec, decoder_info); - lv_image_decoder_set_open_cb(dec, decoder_open); - lv_image_decoder_set_close_cb(dec, decoder_close); - - dec->name = DECODER_NAME; - -#if LV_FFMPEG_AV_DUMP_FORMAT == 0 - av_log_set_level(AV_LOG_QUIET); -#endif -} - -int lv_ffmpeg_get_frame_num(const char * path) -{ - int ret = -1; - struct ffmpeg_context_s * ffmpeg_ctx = ffmpeg_open_file(path); - - if(ffmpeg_ctx) { - ret = ffmpeg_ctx->video_stream->nb_frames; - ffmpeg_close(ffmpeg_ctx); - } - - return ret; -} - -lv_obj_t * lv_ffmpeg_player_create(lv_obj_t * parent) -{ - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -lv_result_t lv_ffmpeg_player_set_src(lv_obj_t * obj, const char * path) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_result_t res = LV_RESULT_INVALID; - - lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; - - if(player->ffmpeg_ctx) { - ffmpeg_close(player->ffmpeg_ctx); - player->ffmpeg_ctx = NULL; - } - - lv_timer_pause(player->timer); - - player->ffmpeg_ctx = ffmpeg_open_file(path); - - if(!player->ffmpeg_ctx) { - LV_LOG_ERROR("ffmpeg file open failed: %s", path); - goto failed; - } - - if(ffmpeg_image_allocate(player->ffmpeg_ctx) < 0) { - LV_LOG_ERROR("ffmpeg image allocate failed"); - ffmpeg_close(player->ffmpeg_ctx); - goto failed; - } - - bool has_alpha = player->ffmpeg_ctx->has_alpha; - int width = player->ffmpeg_ctx->video_dec_ctx->width; - int height = player->ffmpeg_ctx->video_dec_ctx->height; - uint32_t data_size = 0; - - data_size = width * height * 4; - uint8_t * data = ffmpeg_get_image_data(player->ffmpeg_ctx); - lv_color_format_t cf = has_alpha ? LV_COLOR_FORMAT_ARGB8888 : LV_COLOR_FORMAT_NATIVE; - uint32_t stride = width * lv_color_format_get_size(cf); - lv_memzero(data, stride * height); - - player->imgdsc.header.w = width; - player->imgdsc.header.h = height; - player->imgdsc.data_size = data_size; - player->imgdsc.header.cf = cf; - player->imgdsc.header.stride = stride; - player->imgdsc.data = data; - - lv_image_set_src(&player->img.obj, &(player->imgdsc)); - - int period = ffmpeg_get_frame_refr_period(player->ffmpeg_ctx); - - if(period > 0) { - LV_LOG_INFO("frame refresh period = %d ms, rate = %d fps", - period, 1000 / period); - lv_timer_set_period(player->timer, period); - } - else { - LV_LOG_WARN("unable to get frame refresh period"); - } - - res = LV_RESULT_OK; - -failed: - return res; -} - -void lv_ffmpeg_player_set_cmd(lv_obj_t * obj, lv_ffmpeg_player_cmd_t cmd) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; - - if(!player->ffmpeg_ctx) { - LV_LOG_ERROR("ffmpeg_ctx is NULL"); - return; - } - - lv_timer_t * timer = player->timer; - - switch(cmd) { - case LV_FFMPEG_PLAYER_CMD_START: - av_seek_frame(player->ffmpeg_ctx->fmt_ctx, - 0, 0, AVSEEK_FLAG_BACKWARD); - lv_timer_resume(timer); - LV_LOG_INFO("ffmpeg player start"); - break; - case LV_FFMPEG_PLAYER_CMD_STOP: - av_seek_frame(player->ffmpeg_ctx->fmt_ctx, - 0, 0, AVSEEK_FLAG_BACKWARD); - lv_timer_pause(timer); - LV_LOG_INFO("ffmpeg player stop"); - break; - case LV_FFMPEG_PLAYER_CMD_PAUSE: - lv_timer_pause(timer); - LV_LOG_INFO("ffmpeg player pause"); - break; - case LV_FFMPEG_PLAYER_CMD_RESUME: - lv_timer_resume(timer); - LV_LOG_INFO("ffmpeg player resume"); - break; - default: - LV_LOG_ERROR("Error cmd: %d", cmd); - break; - } -} - -void lv_ffmpeg_player_set_auto_restart(lv_obj_t * obj, bool en) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; - player->auto_restart = en; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) -{ - LV_UNUSED(decoder); - - /* Get the source type */ - const void * src = dsc->src; - lv_image_src_t src_type = dsc->src_type; - - if(src_type == LV_IMAGE_SRC_FILE) { - const char * fn = src; - - if(ffmpeg_get_image_header(fn, header) < 0) { - LV_LOG_ERROR("ffmpeg can't get image header"); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; - } - - /* If didn't succeeded earlier then it's an error */ - return LV_RESULT_INVALID; -} - -/** - * Decode an image using ffmpeg library - * @param decoder pointer to the decoder - * @param dsc pointer to the decoder descriptor - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image - */ -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); - - if(dsc->src_type == LV_IMAGE_SRC_FILE) { - const char * path = dsc->src; - - struct ffmpeg_context_s * ffmpeg_ctx = ffmpeg_open_file(path); - - if(ffmpeg_ctx == NULL) { - return LV_RESULT_INVALID; - } - - if(ffmpeg_image_allocate(ffmpeg_ctx) < 0) { - LV_LOG_ERROR("ffmpeg image allocate failed"); - ffmpeg_close(ffmpeg_ctx); - return LV_RESULT_INVALID; - } - - if(ffmpeg_update_next_frame(ffmpeg_ctx) < 0) { - ffmpeg_close(ffmpeg_ctx); - LV_LOG_ERROR("ffmpeg update frame failed"); - return LV_RESULT_INVALID; - } - - ffmpeg_close_src_ctx(ffmpeg_ctx); - uint8_t * img_data = ffmpeg_get_image_data(ffmpeg_ctx); - - dsc->user_data = ffmpeg_ctx; - lv_draw_buf_t * decoded = &ffmpeg_ctx->draw_buf; - decoded->header = dsc->header; - decoded->header.flags |= LV_IMAGE_FLAGS_MODIFIABLE; - decoded->data = img_data; - decoded->data_size = (uint32_t)dsc->header.stride * dsc->header.h; - decoded->unaligned_data = NULL; - dsc->decoded = decoded; - - /* The image is fully decoded. Return with its pointer */ - return LV_RESULT_OK; - } - - /* If not returned earlier then it failed */ - return LV_RESULT_INVALID; -} - -static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); - struct ffmpeg_context_s * ffmpeg_ctx = dsc->user_data; - ffmpeg_close(ffmpeg_ctx); -} - -static uint8_t * ffmpeg_get_image_data(struct ffmpeg_context_s * ffmpeg_ctx) -{ - uint8_t * img_data = ffmpeg_ctx->video_dst_data[0]; - - if(img_data == NULL) { - LV_LOG_ERROR("ffmpeg video dst data is NULL"); - } - - return img_data; -} - -static bool ffmpeg_pix_fmt_has_alpha(enum AVPixelFormat pix_fmt) -{ - const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get(pix_fmt); - - if(desc == NULL) { - return false; - } - - if(pix_fmt == AV_PIX_FMT_PAL8) { - return true; - } - - return desc->flags & AV_PIX_FMT_FLAG_ALPHA; -} - -static bool ffmpeg_pix_fmt_is_yuv(enum AVPixelFormat pix_fmt) -{ - const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get(pix_fmt); - - if(desc == NULL) { - return false; - } - - return !(desc->flags & AV_PIX_FMT_FLAG_RGB) && desc->nb_components >= 2; -} - -static int ffmpeg_output_video_frame(struct ffmpeg_context_s * ffmpeg_ctx) -{ - int ret = -1; - - int width = ffmpeg_ctx->video_dec_ctx->width; - int height = ffmpeg_ctx->video_dec_ctx->height; - AVFrame * frame = ffmpeg_ctx->frame; - - if(frame->width != width - || frame->height != height - || frame->format != ffmpeg_ctx->video_dec_ctx->pix_fmt) { - - /* To handle this change, one could call av_image_alloc again and - * decode the following frames into another rawvideo file. - */ - LV_LOG_ERROR("Width, height and pixel format have to be " - "constant in a rawvideo file, but the width, height or " - "pixel format of the input video changed:\n" - "old: width = %d, height = %d, format = %s\n" - "new: width = %d, height = %d, format = %s\n", - width, - height, - av_get_pix_fmt_name(ffmpeg_ctx->video_dec_ctx->pix_fmt), - frame->width, frame->height, - av_get_pix_fmt_name(frame->format)); - goto failed; - } - - LV_LOG_TRACE("video_frame coded_n:%d", frame->coded_picture_number); - - /* copy decoded frame to destination buffer: - * this is required since rawvideo expects non aligned data - */ - av_image_copy(ffmpeg_ctx->video_src_data, ffmpeg_ctx->video_src_linesize, - (const uint8_t **)(frame->data), frame->linesize, - ffmpeg_ctx->video_dec_ctx->pix_fmt, width, height); - - if(ffmpeg_ctx->sws_ctx == NULL) { - int swsFlags = SWS_BILINEAR; - - if(ffmpeg_pix_fmt_is_yuv(ffmpeg_ctx->video_dec_ctx->pix_fmt)) { - - /* When the video width and height are not multiples of 8, - * and there is no size change in the conversion, - * a blurry screen will appear on the right side - * This problem was discovered in 2012 and - * continues to exist in version 4.1.3 in 2019 - * This problem can be avoided by increasing SWS_ACCURATE_RND - */ - if((width & 0x7) || (height & 0x7)) { - LV_LOG_WARN("The width(%d) and height(%d) the image " - "is not a multiple of 8, " - "the decoding speed may be reduced", - width, height); - swsFlags |= SWS_ACCURATE_RND; - } - } - - ffmpeg_ctx->sws_ctx = sws_getContext( - width, height, ffmpeg_ctx->video_dec_ctx->pix_fmt, - width, height, ffmpeg_ctx->video_dst_pix_fmt, - swsFlags, - NULL, NULL, NULL); - } - - if(!ffmpeg_ctx->has_alpha) { - int lv_linesize = lv_color_format_get_size(LV_COLOR_FORMAT_NATIVE) * width; - int dst_linesize = ffmpeg_ctx->video_dst_linesize[0]; - if(dst_linesize != lv_linesize) { - LV_LOG_WARN("ffmpeg linesize = %d, but lvgl image require %d", - dst_linesize, - lv_linesize); - ffmpeg_ctx->video_dst_linesize[0] = lv_linesize; - } - } - - ret = sws_scale( - ffmpeg_ctx->sws_ctx, - (const uint8_t * const *)(ffmpeg_ctx->video_src_data), - ffmpeg_ctx->video_src_linesize, - 0, - height, - ffmpeg_ctx->video_dst_data, - ffmpeg_ctx->video_dst_linesize); - -failed: - return ret; -} - -static int ffmpeg_decode_packet(AVCodecContext * dec, const AVPacket * pkt, - struct ffmpeg_context_s * ffmpeg_ctx) -{ - int ret = 0; - - /* submit the packet to the decoder */ - ret = avcodec_send_packet(dec, pkt); - if(ret < 0) { - LV_LOG_ERROR("Error submitting a packet for decoding (%s)", - av_err2str(ret)); - return ret; - } - - /* get all the available frames from the decoder */ - while(ret >= 0) { - ret = avcodec_receive_frame(dec, ffmpeg_ctx->frame); - if(ret < 0) { - - /* those two return values are special and mean there is - * no output frame available, - * but there were no errors during decoding - */ - if(ret == AVERROR_EOF || ret == AVERROR(EAGAIN)) { - return 0; - } - - LV_LOG_ERROR("Error during decoding (%s)", av_err2str(ret)); - return ret; - } - - /* write the frame data to output file */ - if(dec->codec->type == AVMEDIA_TYPE_VIDEO) { - ret = ffmpeg_output_video_frame(ffmpeg_ctx); - } - - av_frame_unref(ffmpeg_ctx->frame); - if(ret < 0) { - LV_LOG_WARN("ffmpeg_decode_packet ended %d", ret); - return ret; - } - } - - return 0; -} - -static int ffmpeg_open_codec_context(int * stream_idx, - AVCodecContext ** dec_ctx, AVFormatContext * fmt_ctx, - enum AVMediaType type) -{ - int ret; - int stream_index; - AVStream * st; - const AVCodec * dec = NULL; - AVDictionary * opts = NULL; - - ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0); - if(ret < 0) { - LV_LOG_ERROR("Could not find %s stream in input file", - av_get_media_type_string(type)); - return ret; - } - else { - stream_index = ret; - st = fmt_ctx->streams[stream_index]; - - /* find decoder for the stream */ - dec = avcodec_find_decoder(st->codecpar->codec_id); - if(dec == NULL) { - LV_LOG_ERROR("Failed to find %s codec", - av_get_media_type_string(type)); - return AVERROR(EINVAL); - } - - /* Allocate a codec context for the decoder */ - *dec_ctx = avcodec_alloc_context3(dec); - if(*dec_ctx == NULL) { - LV_LOG_ERROR("Failed to allocate the %s codec context", - av_get_media_type_string(type)); - return AVERROR(ENOMEM); - } - - /* Copy codec parameters from input stream to output codec context */ - if((ret = avcodec_parameters_to_context(*dec_ctx, st->codecpar)) < 0) { - LV_LOG_ERROR( - "Failed to copy %s codec parameters to decoder context", - av_get_media_type_string(type)); - return ret; - } - - /* Init the decoders */ - if((ret = avcodec_open2(*dec_ctx, dec, &opts)) < 0) { - LV_LOG_ERROR("Failed to open %s codec", - av_get_media_type_string(type)); - return ret; - } - - *stream_idx = stream_index; - } - - return 0; -} - -static int ffmpeg_get_image_header(const char * filepath, - lv_image_header_t * header) -{ - int ret = -1; - - AVFormatContext * fmt_ctx = NULL; - AVCodecContext * video_dec_ctx = NULL; - int video_stream_idx; - - /* open input file, and allocate format context */ - if(avformat_open_input(&fmt_ctx, filepath, NULL, NULL) < 0) { - LV_LOG_ERROR("Could not open source file %s", filepath); - goto failed; - } - - /* retrieve stream information */ - if(avformat_find_stream_info(fmt_ctx, NULL) < 0) { - LV_LOG_ERROR("Could not find stream information"); - goto failed; - } - - if(ffmpeg_open_codec_context(&video_stream_idx, &video_dec_ctx, - fmt_ctx, AVMEDIA_TYPE_VIDEO) - >= 0) { - bool has_alpha = ffmpeg_pix_fmt_has_alpha(video_dec_ctx->pix_fmt); - - /* allocate image where the decoded image will be put */ - header->w = video_dec_ctx->width; - header->h = video_dec_ctx->height; - header->cf = has_alpha ? LV_COLOR_FORMAT_ARGB8888 : LV_COLOR_FORMAT_NATIVE; - header->stride = header->w * lv_color_format_get_size(header->cf); - - ret = 0; - } - -failed: - avcodec_free_context(&video_dec_ctx); - avformat_close_input(&fmt_ctx); - - return ret; -} - -static int ffmpeg_get_frame_refr_period(struct ffmpeg_context_s * ffmpeg_ctx) -{ - int avg_frame_rate_num = ffmpeg_ctx->video_stream->avg_frame_rate.num; - if(avg_frame_rate_num > 0) { - int period = 1000 * (int64_t)ffmpeg_ctx->video_stream->avg_frame_rate.den - / avg_frame_rate_num; - return period; - } - - return -1; -} - -static int ffmpeg_update_next_frame(struct ffmpeg_context_s * ffmpeg_ctx) -{ - int ret = 0; - - while(1) { - - /* read frames from the file */ - if(av_read_frame(ffmpeg_ctx->fmt_ctx, ffmpeg_ctx->pkt) >= 0) { - bool is_image = false; - - /* check if the packet belongs to a stream we are interested in, - * otherwise skip it - */ - if(ffmpeg_ctx->pkt->stream_index == ffmpeg_ctx->video_stream_idx) { - ret = ffmpeg_decode_packet(ffmpeg_ctx->video_dec_ctx, - ffmpeg_ctx->pkt, ffmpeg_ctx); - is_image = true; - } - - av_packet_unref(ffmpeg_ctx->pkt); - - if(ret < 0) { - LV_LOG_WARN("video frame is empty %d", ret); - break; - } - - /* Used to filter data that is not an image */ - if(is_image) { - break; - } - } - else { - ret = -1; - break; - } - } - - return ret; -} - -struct ffmpeg_context_s * ffmpeg_open_file(const char * path) -{ - if(path == NULL || lv_strlen(path) == 0) { - LV_LOG_ERROR("file path is empty"); - return NULL; - } - - struct ffmpeg_context_s * ffmpeg_ctx = calloc(1, sizeof(struct ffmpeg_context_s)); - - if(ffmpeg_ctx == NULL) { - LV_LOG_ERROR("ffmpeg_ctx malloc failed"); - goto failed; - } - - /* open input file, and allocate format context */ - - if(avformat_open_input(&(ffmpeg_ctx->fmt_ctx), path, NULL, NULL) < 0) { - LV_LOG_ERROR("Could not open source file %s", path); - goto failed; - } - - /* retrieve stream information */ - - if(avformat_find_stream_info(ffmpeg_ctx->fmt_ctx, NULL) < 0) { - LV_LOG_ERROR("Could not find stream information"); - goto failed; - } - - if(ffmpeg_open_codec_context( - &(ffmpeg_ctx->video_stream_idx), - &(ffmpeg_ctx->video_dec_ctx), - ffmpeg_ctx->fmt_ctx, AVMEDIA_TYPE_VIDEO) - >= 0) { - ffmpeg_ctx->video_stream = ffmpeg_ctx->fmt_ctx->streams[ffmpeg_ctx->video_stream_idx]; - - ffmpeg_ctx->has_alpha = ffmpeg_pix_fmt_has_alpha(ffmpeg_ctx->video_dec_ctx->pix_fmt); - - ffmpeg_ctx->video_dst_pix_fmt = (ffmpeg_ctx->has_alpha ? AV_PIX_FMT_BGRA : AV_PIX_FMT_TRUE_COLOR); - } - -#if LV_FFMPEG_AV_DUMP_FORMAT != 0 - /* dump input information to stderr */ - av_dump_format(ffmpeg_ctx->fmt_ctx, 0, path, 0); -#endif - - if(ffmpeg_ctx->video_stream == NULL) { - LV_LOG_ERROR("Could not find video stream in the input, aborting"); - goto failed; - } - - return ffmpeg_ctx; - -failed: - ffmpeg_close(ffmpeg_ctx); - return NULL; -} - -static int ffmpeg_image_allocate(struct ffmpeg_context_s * ffmpeg_ctx) -{ - int ret; - - /* allocate image where the decoded image will be put */ - ret = av_image_alloc( - ffmpeg_ctx->video_src_data, - ffmpeg_ctx->video_src_linesize, - ffmpeg_ctx->video_dec_ctx->width, - ffmpeg_ctx->video_dec_ctx->height, - ffmpeg_ctx->video_dec_ctx->pix_fmt, - 4); - - if(ret < 0) { - LV_LOG_ERROR("Could not allocate src raw video buffer"); - return ret; - } - - LV_LOG_INFO("alloc video_src_bufsize = %d", ret); - - ret = av_image_alloc( - ffmpeg_ctx->video_dst_data, - ffmpeg_ctx->video_dst_linesize, - ffmpeg_ctx->video_dec_ctx->width, - ffmpeg_ctx->video_dec_ctx->height, - ffmpeg_ctx->video_dst_pix_fmt, - 4); - - if(ret < 0) { - LV_LOG_ERROR("Could not allocate dst raw video buffer"); - return ret; - } - - LV_LOG_INFO("allocate video_dst_bufsize = %d", ret); - - ffmpeg_ctx->frame = av_frame_alloc(); - - if(ffmpeg_ctx->frame == NULL) { - LV_LOG_ERROR("Could not allocate frame"); - return -1; - } - - /* allocate packet, set data to NULL, let the demuxer fill it */ - - ffmpeg_ctx->pkt = av_packet_alloc(); - if(ffmpeg_ctx->pkt == NULL) { - LV_LOG_ERROR("av_packet_alloc failed"); - return -1; - } - ffmpeg_ctx->pkt->data = NULL; - ffmpeg_ctx->pkt->size = 0; - - return 0; -} - -static void ffmpeg_close_src_ctx(struct ffmpeg_context_s * ffmpeg_ctx) -{ - avcodec_free_context(&(ffmpeg_ctx->video_dec_ctx)); - avformat_close_input(&(ffmpeg_ctx->fmt_ctx)); - av_packet_free(&ffmpeg_ctx->pkt); - av_frame_free(&(ffmpeg_ctx->frame)); - if(ffmpeg_ctx->video_src_data[0] != NULL) { - av_free(ffmpeg_ctx->video_src_data[0]); - ffmpeg_ctx->video_src_data[0] = NULL; - } -} - -static void ffmpeg_close_dst_ctx(struct ffmpeg_context_s * ffmpeg_ctx) -{ - if(ffmpeg_ctx->video_dst_data[0] != NULL) { - av_free(ffmpeg_ctx->video_dst_data[0]); - ffmpeg_ctx->video_dst_data[0] = NULL; - } -} - -static void ffmpeg_close(struct ffmpeg_context_s * ffmpeg_ctx) -{ - if(ffmpeg_ctx == NULL) { - LV_LOG_WARN("ffmpeg_ctx is NULL"); - return; - } - - sws_freeContext(ffmpeg_ctx->sws_ctx); - ffmpeg_close_src_ctx(ffmpeg_ctx); - ffmpeg_close_dst_ctx(ffmpeg_ctx); - free(ffmpeg_ctx); - - LV_LOG_INFO("ffmpeg_ctx closed"); -} - -static void lv_ffmpeg_player_frame_update_cb(lv_timer_t * timer) -{ - lv_obj_t * obj = (lv_obj_t *)lv_timer_get_user_data(timer); - lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; - - if(!player->ffmpeg_ctx) { - return; - } - - int has_next = ffmpeg_update_next_frame(player->ffmpeg_ctx); - - if(has_next < 0) { - lv_ffmpeg_player_set_cmd(obj, player->auto_restart ? LV_FFMPEG_PLAYER_CMD_START : LV_FFMPEG_PLAYER_CMD_STOP); - return; - } - - lv_image_cache_drop(lv_image_get_src(obj)); - - lv_obj_invalidate(obj); -} - -static void lv_ffmpeg_player_constructor(const lv_obj_class_t * class_p, - lv_obj_t * obj) -{ - - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; - - player->auto_restart = false; - player->ffmpeg_ctx = NULL; - player->timer = lv_timer_create(lv_ffmpeg_player_frame_update_cb, - FRAME_DEF_REFR_PERIOD, obj); - lv_timer_pause(player->timer); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_ffmpeg_player_destructor(const lv_obj_class_t * class_p, - lv_obj_t * obj) -{ - LV_UNUSED(class_p); - - LV_TRACE_OBJ_CREATE("begin"); - - lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; - - if(player->timer) { - lv_timer_delete(player->timer); - player->timer = NULL; - } - - lv_image_cache_drop(lv_image_get_src(obj)); - - ffmpeg_close(player->ffmpeg_ctx); - player->ffmpeg_ctx = NULL; - - LV_TRACE_OBJ_CREATE("finished"); -} - -#endif /*LV_USE_FFMPEG*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/ffmpeg/lv_ffmpeg.h b/software/Power_Pico/Middlewares/LVGL/src/libs/ffmpeg/lv_ffmpeg.h deleted file mode 100644 index 1cb86b9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/ffmpeg/lv_ffmpeg.h +++ /dev/null @@ -1,97 +0,0 @@ -/** - * @file lv_ffmpeg.h - * - */ -#ifndef LV_FFMPEG_H -#define LV_FFMPEG_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_FFMPEG != 0 -#include "../../misc/lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -struct ffmpeg_context_s; - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_ffmpeg_player_class; - -typedef enum { - LV_FFMPEG_PLAYER_CMD_START, - LV_FFMPEG_PLAYER_CMD_STOP, - LV_FFMPEG_PLAYER_CMD_PAUSE, - LV_FFMPEG_PLAYER_CMD_RESUME, - LV_FFMPEG_PLAYER_CMD_LAST -} lv_ffmpeg_player_cmd_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Register FFMPEG image decoder - */ -void lv_ffmpeg_init(void); - -/** - * Get the number of frames contained in the file - * @param path image or video file name - * @return Number of frames, less than 0 means failed - */ -int lv_ffmpeg_get_frame_num(const char * path); - -/** - * Create ffmpeg_player object - * @param parent pointer to an object, it will be the parent of the new player - * @return pointer to the created ffmpeg_player - */ -lv_obj_t * lv_ffmpeg_player_create(lv_obj_t * parent); - -/** - * Set the path of the file to be played - * @param obj pointer to a ffmpeg_player object - * @param path video file path - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info. - */ -lv_result_t lv_ffmpeg_player_set_src(lv_obj_t * obj, const char * path); - -/** - * Set command control video player - * @param obj pointer to a ffmpeg_player object - * @param cmd control commands - */ -void lv_ffmpeg_player_set_cmd(lv_obj_t * obj, lv_ffmpeg_player_cmd_t cmd); - -/** - * Set the video to automatically replay - * @param obj pointer to a ffmpeg_player object - * @param en true: enable the auto restart - */ -void lv_ffmpeg_player_set_auto_restart(lv_obj_t * obj, bool en); - -/*===================== - * Other functions - *====================*/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_FFMPEG*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_FFMPEG_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/ffmpeg/lv_ffmpeg_private.h b/software/Power_Pico/Middlewares/LVGL/src/libs/ffmpeg/lv_ffmpeg_private.h deleted file mode 100644 index b27b6bf..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/ffmpeg/lv_ffmpeg_private.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @file lv_ffmpeg_private.h - * - */ - -#ifndef LV_FFMPEG_PRIVATE_H -#define LV_FFMPEG_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_ffmpeg.h" -#if LV_USE_FFMPEG != 0 -#include "../../widgets/image/lv_image_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_ffmpeg_player_t { - lv_image_t img; - lv_timer_t * timer; - lv_image_dsc_t imgdsc; - bool auto_restart; - struct ffmpeg_context_s * ffmpeg_ctx; -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_FFMPEG*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_FFMPEG_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/arial.ttf b/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/arial.ttf deleted file mode 100644 index 886789b..0000000 Binary files a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/arial.ttf and /dev/null differ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/ftmodule.h b/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/ftmodule.h deleted file mode 100644 index b804b6e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/ftmodule.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This file registers the FreeType modules compiled into the library. - * - * If you use GNU make, this file IS NOT USED! Instead, it is created in - * the objects directory (normally `/objs/`) based on information - * from `/modules.cfg`. - * - * Please read `docs/INSTALL.ANY` and `docs/CUSTOMIZE` how to compile - * FreeType without GNU make. - * - */ - -/* FT_USE_MODULE( FT_Module_Class, autofit_module_class ) */ -FT_USE_MODULE(FT_Driver_ClassRec, tt_driver_class) -/* FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) */ -/* FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) */ -/* FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) */ -/* FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) */ -/* FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) */ -/* FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) */ -/* FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) */ -/* FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) */ -/* FT_USE_MODULE( FT_Module_Class, psaux_module_class ) */ -/* FT_USE_MODULE( FT_Module_Class, psnames_module_class ) */ -/* FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) */ -FT_USE_MODULE(FT_Module_Class, sfnt_module_class) -FT_USE_MODULE(FT_Renderer_Class, ft_smooth_renderer_class) -/* FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) */ -/* FT_USE_MODULE( FT_Renderer_Class, ft_sdf_renderer_class ) */ -/* FT_USE_MODULE( FT_Renderer_Class, ft_bitmap_sdf_renderer_class ) */ -/* FT_USE_MODULE( FT_Renderer_Class, ft_svg_renderer_class ) */ - -/* EOF */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/ftoption.h b/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/ftoption.h deleted file mode 100644 index 141278b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/ftoption.h +++ /dev/null @@ -1,964 +0,0 @@ -/**************************************************************************** - * - * ftoption.h - * - * User-selectable configuration macros (specification only). - * - * Copyright (C) 1996-2022 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - -#ifndef FTOPTION_H_ -#define FTOPTION_H_ - -#include - -FT_BEGIN_HEADER - -/************************************************************************** - * - * USER-SELECTABLE CONFIGURATION MACROS - * - * This file contains the default configuration macro definitions for a - * standard build of the FreeType library. There are three ways to use - * this file to build project-specific versions of the library: - * - * - You can modify this file by hand, but this is not recommended in - * cases where you would like to build several versions of the library - * from a single source directory. - * - * - You can put a copy of this file in your build directory, more - * precisely in `$BUILD/freetype/config/ftoption.h`, where `$BUILD` is - * the name of a directory that is included _before_ the FreeType include - * path during compilation. - * - * The default FreeType Makefiles use the build directory - * `builds/` by default, but you can easily change that for your - * own projects. - * - * - Copy the file to `$BUILD/ft2build.h` and modify it - * slightly to pre-define the macro `FT_CONFIG_OPTIONS_H` used to locate - * this file during the build. For example, - * - * ``` - * #define FT_CONFIG_OPTIONS_H - * #include - * ``` - * - * will use `$BUILD/myftoptions.h` instead of this file for macro - * definitions. - * - * Note also that you can similarly pre-define the macro - * `FT_CONFIG_MODULES_H` used to locate the file listing of the modules - * that are statically linked to the library at compile time. By - * default, this file is ``. - * - * We highly recommend using the third method whenever possible. - * - */ - -/*************************************************************************/ -/*************************************************************************/ -/**** ****/ -/**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ -/**** ****/ -/*************************************************************************/ -/*************************************************************************/ - -/*#************************************************************************ - * - * If you enable this configuration option, FreeType recognizes an - * environment variable called `FREETYPE_PROPERTIES`, which can be used to - * control the various font drivers and modules. The controllable - * properties are listed in the section @properties. - * - * You have to undefine this configuration option on platforms that lack - * the concept of environment variables (and thus don't have the `getenv` - * function), for example Windows CE. - * - * `FREETYPE_PROPERTIES` has the following syntax form (broken here into - * multiple lines for better readability). - * - * ``` - * - * ':' - * '=' - * - * ':' - * '=' - * ... - * ``` - * - * Example: - * - * ``` - * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ - * cff:no-stem-darkening=1 - * ``` - * - */ -#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES - -/************************************************************************** - * - * Uncomment the line below if you want to activate LCD rendering - * technology similar to ClearType in this build of the library. This - * technology triples the resolution in the direction color subpixels. To - * mitigate color fringes inherent to this technology, you also need to - * explicitly set up LCD filtering. - * - * When this macro is not defined, FreeType offers alternative LCD - * rendering technology that produces excellent output. - */ -/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ - -/************************************************************************** - * - * Many compilers provide a non-ANSI 64-bit data type that can be used by - * FreeType to speed up some computations. However, this will create some - * problems when compiling the library in strict ANSI mode. - * - * For this reason, the use of 64-bit integers is normally disabled when - * the `__STDC__` macro is defined. You can however disable this by - * defining the macro `FT_CONFIG_OPTION_FORCE_INT64` here. - * - * For most compilers, this will only create compilation warnings when - * building the library. - * - * ObNote: The compiler-specific 64-bit integers are detected in the - * file `ftconfig.h` either statically or through the `configure` - * script on supported platforms. - */ -#undef FT_CONFIG_OPTION_FORCE_INT64 - -/************************************************************************** - * - * If this macro is defined, do not try to use an assembler version of - * performance-critical functions (e.g., @FT_MulFix). You should only do - * that to verify that the assembler function works properly, or to execute - * benchmark tests of the various implementations. - */ -/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ - -/************************************************************************** - * - * If this macro is defined, try to use an inlined assembler version of the - * @FT_MulFix function, which is a 'hotspot' when loading and hinting - * glyphs, and which should be executed as fast as possible. - * - * Note that if your compiler or CPU is not supported, this will default to - * the standard and portable implementation found in `ftcalc.c`. - */ -#define FT_CONFIG_OPTION_INLINE_MULFIX - -/************************************************************************** - * - * LZW-compressed file support. - * - * FreeType now handles font files that have been compressed with the - * `compress` program. This is mostly used to parse many of the PCF - * files that come with various X11 distributions. The implementation - * uses NetBSD's `zopen` to partially uncompress the file on the fly (see - * `src/lzw/ftgzip.c`). - * - * Define this macro if you want to enable this 'feature'. - */ -#define FT_CONFIG_OPTION_USE_LZW - -/************************************************************************** - * - * Gzip-compressed file support. - * - * FreeType now handles font files that have been compressed with the - * `gzip` program. This is mostly used to parse many of the PCF files - * that come with XFree86. The implementation uses 'zlib' to partially - * uncompress the file on the fly (see `src/gzip/ftgzip.c`). - * - * Define this macro if you want to enable this 'feature'. See also the - * macro `FT_CONFIG_OPTION_SYSTEM_ZLIB` below. - */ -#define FT_CONFIG_OPTION_USE_ZLIB - -/************************************************************************** - * - * ZLib library selection - * - * This macro is only used when `FT_CONFIG_OPTION_USE_ZLIB` is defined. - * It allows FreeType's 'ftgzip' component to link to the system's - * installation of the ZLib library. This is useful on systems like - * Unix or VMS where it generally is already available. - * - * If you let it undefined, the component will use its own copy of the - * zlib sources instead. These have been modified to be included - * directly within the component and **not** export external function - * names. This allows you to link any program with FreeType _and_ ZLib - * without linking conflicts. - * - * Do not `#undef` this macro here since the build system might define - * it for certain configurations only. - * - * If you use a build system like cmake or the `configure` script, - * options set by those programs have precedence, overwriting the value - * here with the configured one. - * - * If you use the GNU make build system directly (that is, without the - * `configure` script) and you define this macro, you also have to pass - * `SYSTEM_ZLIB=yes` as an argument to make. - */ -/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ - -/************************************************************************** - * - * Bzip2-compressed file support. - * - * FreeType now handles font files that have been compressed with the - * `bzip2` program. This is mostly used to parse many of the PCF files - * that come with XFree86. The implementation uses `libbz2` to partially - * uncompress the file on the fly (see `src/bzip2/ftbzip2.c`). Contrary - * to gzip, bzip2 currently is not included and need to use the system - * available bzip2 implementation. - * - * Define this macro if you want to enable this 'feature'. - * - * If you use a build system like cmake or the `configure` script, - * options set by those programs have precedence, overwriting the value - * here with the configured one. - */ -/* #define FT_CONFIG_OPTION_USE_BZIP2 */ - -/************************************************************************** - * - * Define to disable the use of file stream functions and types, `FILE`, - * `fopen`, etc. Enables the use of smaller system libraries on embedded - * systems that have multiple system libraries, some with or without file - * stream support, in the cases where file stream support is not necessary - * such as memory loading of font files. - */ -/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ - -/************************************************************************** - * - * PNG bitmap support. - * - * FreeType now handles loading color bitmap glyphs in the PNG format. - * This requires help from the external libpng library. Uncompressed - * color bitmaps do not need any external libraries and will be supported - * regardless of this configuration. - * - * Define this macro if you want to enable this 'feature'. - * - * If you use a build system like cmake or the `configure` script, - * options set by those programs have precedence, overwriting the value - * here with the configured one. - */ -/* #define FT_CONFIG_OPTION_USE_PNG */ - -/************************************************************************** - * - * HarfBuzz support. - * - * FreeType uses the HarfBuzz library to improve auto-hinting of OpenType - * fonts. If available, many glyphs not directly addressable by a font's - * character map will be hinted also. - * - * Define this macro if you want to enable this 'feature'. - * - * If you use a build system like cmake or the `configure` script, - * options set by those programs have precedence, overwriting the value - * here with the configured one. - */ -/* #define FT_CONFIG_OPTION_USE_HARFBUZZ */ - -/************************************************************************** - * - * Brotli support. - * - * FreeType uses the Brotli library to provide support for decompressing - * WOFF2 streams. - * - * Define this macro if you want to enable this 'feature'. - * - * If you use a build system like cmake or the `configure` script, - * options set by those programs have precedence, overwriting the value - * here with the configured one. - */ -/* #define FT_CONFIG_OPTION_USE_BROTLI */ - -/************************************************************************** - * - * Glyph Postscript Names handling - * - * By default, FreeType 2 is compiled with the 'psnames' module. This - * module is in charge of converting a glyph name string into a Unicode - * value, or return a Macintosh standard glyph name for the use with the - * TrueType 'post' table. - * - * Undefine this macro if you do not want 'psnames' compiled in your - * build of FreeType. This has the following effects: - * - * - The TrueType driver will provide its own set of glyph names, if you - * build it to support postscript names in the TrueType 'post' table, - * but will not synthesize a missing Unicode charmap. - * - * - The Type~1 driver will not be able to synthesize a Unicode charmap - * out of the glyphs found in the fonts. - * - * You would normally undefine this configuration macro when building a - * version of FreeType that doesn't contain a Type~1 or CFF driver. - */ -#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES - -/************************************************************************** - * - * Postscript Names to Unicode Values support - * - * By default, FreeType~2 is built with the 'psnames' module compiled in. - * Among other things, the module is used to convert a glyph name into a - * Unicode value. This is especially useful in order to synthesize on - * the fly a Unicode charmap from the CFF/Type~1 driver through a big - * table named the 'Adobe Glyph List' (AGL). - * - * Undefine this macro if you do not want the Adobe Glyph List compiled - * in your 'psnames' module. The Type~1 driver will not be able to - * synthesize a Unicode charmap out of the glyphs found in the fonts. - */ -#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - -/************************************************************************** - * - * Support for Mac fonts - * - * Define this macro if you want support for outline fonts in Mac format - * (mac dfont, mac resource, macbinary containing a mac resource) on - * non-Mac platforms. - * - * Note that the 'FOND' resource isn't checked. - */ -/* #define FT_CONFIG_OPTION_MAC_FONTS */ - -/************************************************************************** - * - * Guessing methods to access embedded resource forks - * - * Enable extra Mac fonts support on non-Mac platforms (e.g., GNU/Linux). - * - * Resource forks which include fonts data are stored sometimes in - * locations which users or developers don't expected. In some cases, - * resource forks start with some offset from the head of a file. In - * other cases, the actual resource fork is stored in file different from - * what the user specifies. If this option is activated, FreeType tries - * to guess whether such offsets or different file names must be used. - * - * Note that normal, direct access of resource forks is controlled via - * the `FT_CONFIG_OPTION_MAC_FONTS` option. - */ -#ifdef FT_CONFIG_OPTION_MAC_FONTS - #define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK -#endif - -/************************************************************************** - * - * Allow the use of `FT_Incremental_Interface` to load typefaces that - * contain no glyph data, but supply it via a callback function. This is - * required by clients supporting document formats which supply font data - * incrementally as the document is parsed, such as the Ghostscript - * interpreter for the PostScript language. - */ -#define FT_CONFIG_OPTION_INCREMENTAL - -/************************************************************************** - * - * The size in bytes of the render pool used by the scan-line converter to - * do all of its work. - */ -#define FT_RENDER_POOL_SIZE 16384L - -/************************************************************************** - * - * FT_MAX_MODULES - * - * The maximum number of modules that can be registered in a single - * FreeType library object. 32~is the default. - */ -#define FT_MAX_MODULES 32 - -/************************************************************************** - * - * Debug level - * - * FreeType can be compiled in debug or trace mode. In debug mode, - * errors are reported through the 'ftdebug' component. In trace mode, - * additional messages are sent to the standard output during execution. - * - * Define `FT_DEBUG_LEVEL_ERROR` to build the library in debug mode. - * Define `FT_DEBUG_LEVEL_TRACE` to build it in trace mode. - * - * Don't define any of these macros to compile in 'release' mode! - * - * Do not `#undef` these macros here since the build system might define - * them for certain configurations only. - */ -/* #define FT_DEBUG_LEVEL_ERROR */ -/* #define FT_DEBUG_LEVEL_TRACE */ - -/************************************************************************** - * - * Logging - * - * Compiling FreeType in debug or trace mode makes FreeType write error - * and trace log messages to `stderr`. Enabling this macro - * automatically forces the `FT_DEBUG_LEVEL_ERROR` and - * `FT_DEBUG_LEVEL_TRACE` macros and allows FreeType to write error and - * trace log messages to a file instead of `stderr`. For writing logs - * to a file, FreeType uses an the external `dlg` library (the source - * code is in `src/dlg`). - * - * This option needs a C99 compiler. - */ -/* #define FT_DEBUG_LOGGING */ - -/************************************************************************** - * - * Autofitter debugging - * - * If `FT_DEBUG_AUTOFIT` is defined, FreeType provides some means to - * control the autofitter behaviour for debugging purposes with global - * boolean variables (consequently, you should **never** enable this - * while compiling in 'release' mode): - * - * ``` - * _af_debug_disable_horz_hints - * _af_debug_disable_vert_hints - * _af_debug_disable_blue_hints - * ``` - * - * Additionally, the following functions provide dumps of various - * internal autofit structures to stdout (using `printf`): - * - * ``` - * af_glyph_hints_dump_points - * af_glyph_hints_dump_segments - * af_glyph_hints_dump_edges - * af_glyph_hints_get_num_segments - * af_glyph_hints_get_segment_offset - * ``` - * - * As an argument, they use another global variable: - * - * ``` - * _af_debug_hints - * ``` - * - * Please have a look at the `ftgrid` demo program to see how those - * variables and macros should be used. - * - * Do not `#undef` these macros here since the build system might define - * them for certain configurations only. - */ -/* #define FT_DEBUG_AUTOFIT */ - -/************************************************************************** - * - * Memory Debugging - * - * FreeType now comes with an integrated memory debugger that is capable - * of detecting simple errors like memory leaks or double deletes. To - * compile it within your build of the library, you should define - * `FT_DEBUG_MEMORY` here. - * - * Note that the memory debugger is only activated at runtime when when - * the _environment_ variable `FT2_DEBUG_MEMORY` is defined also! - * - * Do not `#undef` this macro here since the build system might define it - * for certain configurations only. - */ -/* #define FT_DEBUG_MEMORY */ - -/************************************************************************** - * - * Module errors - * - * If this macro is set (which is _not_ the default), the higher byte of - * an error code gives the module in which the error has occurred, while - * the lower byte is the real error code. - * - * Setting this macro makes sense for debugging purposes only, since it - * would break source compatibility of certain programs that use - * FreeType~2. - * - * More details can be found in the files `ftmoderr.h` and `fterrors.h`. - */ -#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS - -/************************************************************************** - * - * OpenType SVG Glyph Support - * - * Setting this macro enables support for OpenType SVG glyphs. By - * default, FreeType can only fetch SVG documents. However, it can also - * render them if external rendering hook functions are plugged in at - * runtime. - * - * More details on the hooks can be found in file `otsvg.h`. - */ -#define FT_CONFIG_OPTION_SVG - -/************************************************************************** - * - * Error Strings - * - * If this macro is set, `FT_Error_String` will return meaningful - * descriptions. This is not enabled by default to reduce the overall - * size of FreeType. - * - * More details can be found in the file `fterrors.h`. - */ -#define FT_CONFIG_OPTION_ERROR_STRINGS - -/*************************************************************************/ -/*************************************************************************/ -/**** ****/ -/**** S F N T D R I V E R C O N F I G U R A T I O N ****/ -/**** ****/ -/*************************************************************************/ -/*************************************************************************/ - -/************************************************************************** - * - * Define `TT_CONFIG_OPTION_EMBEDDED_BITMAPS` if you want to support - * embedded bitmaps in all formats using the 'sfnt' module (namely - * TrueType~& OpenType). - */ -#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS - -/************************************************************************** - * - * Define `TT_CONFIG_OPTION_COLOR_LAYERS` if you want to support colored - * outlines (from the 'COLR'/'CPAL' tables) in all formats using the 'sfnt' - * module (namely TrueType~& OpenType). - */ -#define TT_CONFIG_OPTION_COLOR_LAYERS - -/************************************************************************** - * - * Define `TT_CONFIG_OPTION_POSTSCRIPT_NAMES` if you want to be able to - * load and enumerate the glyph Postscript names in a TrueType or OpenType - * file. - * - * Note that when you do not compile the 'psnames' module by undefining the - * above `FT_CONFIG_OPTION_POSTSCRIPT_NAMES`, the 'sfnt' module will - * contain additional code used to read the PS Names table from a font. - * - * (By default, the module uses 'psnames' to extract glyph names.) - */ -#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES - -/************************************************************************** - * - * Define `TT_CONFIG_OPTION_SFNT_NAMES` if your applications need to access - * the internal name table in a SFNT-based format like TrueType or - * OpenType. The name table contains various strings used to describe the - * font, like family name, copyright, version, etc. It does not contain - * any glyph name though. - * - * Accessing SFNT names is done through the functions declared in - * `ftsnames.h`. - */ -#define TT_CONFIG_OPTION_SFNT_NAMES - -/************************************************************************** - * - * TrueType CMap support - * - * Here you can fine-tune which TrueType CMap table format shall be - * supported. - */ -#define TT_CONFIG_CMAP_FORMAT_0 -#define TT_CONFIG_CMAP_FORMAT_2 -#define TT_CONFIG_CMAP_FORMAT_4 -#define TT_CONFIG_CMAP_FORMAT_6 -#define TT_CONFIG_CMAP_FORMAT_8 -#define TT_CONFIG_CMAP_FORMAT_10 -#define TT_CONFIG_CMAP_FORMAT_12 -#define TT_CONFIG_CMAP_FORMAT_13 -#define TT_CONFIG_CMAP_FORMAT_14 - -/*************************************************************************/ -/*************************************************************************/ -/**** ****/ -/**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ -/**** ****/ -/*************************************************************************/ -/*************************************************************************/ - -/************************************************************************** - * - * Define `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` if you want to compile a - * bytecode interpreter in the TrueType driver. - * - * By undefining this, you will only compile the code necessary to load - * TrueType glyphs without hinting. - * - * Do not `#undef` this macro here, since the build system might define it - * for certain configurations only. - */ -#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER - -/************************************************************************** - * - * Define `TT_CONFIG_OPTION_SUBPIXEL_HINTING` if you want to compile - * subpixel hinting support into the TrueType driver. This modifies the - * TrueType hinting mechanism when anything but `FT_RENDER_MODE_MONO` is - * requested. - * - * In particular, it modifies the bytecode interpreter to interpret (or - * not) instructions in a certain way so that all TrueType fonts look like - * they do in a Windows ClearType (DirectWrite) environment. See [1] for a - * technical overview on what this means. See `ttinterp.h` for more - * details on the LEAN option. - * - * There are three possible values. - * - * Value 1: - * This value is associated with the 'Infinality' moniker, contributed by - * an individual nicknamed Infinality with the goal of making TrueType - * fonts render better than on Windows. A high amount of configurability - * and flexibility, down to rules for single glyphs in fonts, but also - * very slow. Its experimental and slow nature and the original - * developer losing interest meant that this option was never enabled in - * default builds. - * - * The corresponding interpreter version is v38. - * - * Value 2: - * The new default mode for the TrueType driver. The Infinality code - * base was stripped to the bare minimum and all configurability removed - * in the name of speed and simplicity. The configurability was mainly - * aimed at legacy fonts like 'Arial', 'Times New Roman', or 'Courier'. - * Legacy fonts are fonts that modify vertical stems to achieve clean - * black-and-white bitmaps. The new mode focuses on applying a minimal - * set of rules to all fonts indiscriminately so that modern and web - * fonts render well while legacy fonts render okay. - * - * The corresponding interpreter version is v40. - * - * Value 3: - * Compile both, making both v38 and v40 available (the latter is the - * default). - * - * By undefining these, you get rendering behavior like on Windows without - * ClearType, i.e., Windows XP without ClearType enabled and Win9x - * (interpreter version v35). Or not, depending on how much hinting blood - * and testing tears the font designer put into a given font. If you - * define one or both subpixel hinting options, you can switch between - * between v35 and the ones you define (using `FT_Property_Set`). - * - * This option requires `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` to be - * defined. - * - * [1] - * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx - */ -/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */ -#define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 -/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) */ - -/************************************************************************** - * - * Define `TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED` to compile the - * TrueType glyph loader to use Apple's definition of how to handle - * component offsets in composite glyphs. - * - * Apple and MS disagree on the default behavior of component offsets in - * composites. Apple says that they should be scaled by the scaling - * factors in the transformation matrix (roughly, it's more complex) while - * MS says they should not. OpenType defines two bits in the composite - * flags array which can be used to disambiguate, but old fonts will not - * have them. - * - * https://www.microsoft.com/typography/otspec/glyf.htm - * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html - */ -#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED - -/************************************************************************** - * - * Define `TT_CONFIG_OPTION_GX_VAR_SUPPORT` if you want to include support - * for Apple's distortable font technology ('fvar', 'gvar', 'cvar', and - * 'avar' tables). Tagged 'Font Variations', this is now part of OpenType - * also. This has many similarities to Type~1 Multiple Masters support. - */ -#define TT_CONFIG_OPTION_GX_VAR_SUPPORT - -/************************************************************************** - * - * Define `TT_CONFIG_OPTION_BDF` if you want to include support for an - * embedded 'BDF~' table within SFNT-based bitmap formats. - */ -#define TT_CONFIG_OPTION_BDF - -/************************************************************************** - * - * Option `TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES` controls the maximum - * number of bytecode instructions executed for a single run of the - * bytecode interpreter, needed to prevent infinite loops. You don't want - * to change this except for very special situations (e.g., making a - * library fuzzer spend less time to handle broken fonts). - * - * It is not expected that this value is ever modified by a configuring - * script; instead, it gets surrounded with `#ifndef ... #endif` so that - * the value can be set as a preprocessor option on the compiler's command - * line. - */ -#ifndef TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES - #define TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES 1000000L -#endif - -/*************************************************************************/ -/*************************************************************************/ -/**** ****/ -/**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ -/**** ****/ -/*************************************************************************/ -/*************************************************************************/ - -/************************************************************************** - * - * `T1_MAX_DICT_DEPTH` is the maximum depth of nest dictionaries and arrays - * in the Type~1 stream (see `t1load.c`). A minimum of~4 is required. - */ -#define T1_MAX_DICT_DEPTH 5 - -/************************************************************************** - * - * `T1_MAX_SUBRS_CALLS` details the maximum number of nested sub-routine - * calls during glyph loading. - */ -#define T1_MAX_SUBRS_CALLS 16 - -/************************************************************************** - * - * `T1_MAX_CHARSTRING_OPERANDS` is the charstring stack's capacity. A - * minimum of~16 is required. - * - * The Chinese font 'MingTiEG-Medium' (covering the CNS 11643 character - * set) needs 256. - */ -#define T1_MAX_CHARSTRINGS_OPERANDS 256 - -/************************************************************************** - * - * Define this configuration macro if you want to prevent the compilation - * of the 't1afm' module, which is in charge of reading Type~1 AFM files - * into an existing face. Note that if set, the Type~1 driver will be - * unable to produce kerning distances. - */ -#undef T1_CONFIG_OPTION_NO_AFM - -/************************************************************************** - * - * Define this configuration macro if you want to prevent the compilation - * of the Multiple Masters font support in the Type~1 driver. - */ -#undef T1_CONFIG_OPTION_NO_MM_SUPPORT - -/************************************************************************** - * - * `T1_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe Type~1 - * engine gets compiled into FreeType. If defined, it is possible to - * switch between the two engines using the `hinting-engine` property of - * the 'type1' driver module. - */ -/* #define T1_CONFIG_OPTION_OLD_ENGINE */ - -/*************************************************************************/ -/*************************************************************************/ -/**** ****/ -/**** C F F D R I V E R C O N F I G U R A T I O N ****/ -/**** ****/ -/*************************************************************************/ -/*************************************************************************/ - -/************************************************************************** - * - * Using `CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4}` it is - * possible to set up the default values of the four control points that - * define the stem darkening behaviour of the (new) CFF engine. For more - * details please read the documentation of the `darkening-parameters` - * property (file `ftdriver.h`), which allows the control at run-time. - * - * Do **not** undefine these macros! - */ -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 500 -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 400 - -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 1000 -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 275 - -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 1667 -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 275 - -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 2333 -#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 0 - -/************************************************************************** - * - * `CFF_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe CFF engine - * gets compiled into FreeType. If defined, it is possible to switch - * between the two engines using the `hinting-engine` property of the 'cff' - * driver module. - */ -/* #define CFF_CONFIG_OPTION_OLD_ENGINE */ - -/*************************************************************************/ -/*************************************************************************/ -/**** ****/ -/**** P C F D R I V E R C O N F I G U R A T I O N ****/ -/**** ****/ -/*************************************************************************/ -/*************************************************************************/ - -/************************************************************************** - * - * There are many PCF fonts just called 'Fixed' which look completely - * different, and which have nothing to do with each other. When selecting - * 'Fixed' in KDE or Gnome one gets results that appear rather random, the - * style changes often if one changes the size and one cannot select some - * fonts at all. This option makes the 'pcf' module prepend the foundry - * name (plus a space) to the family name. - * - * We also check whether we have 'wide' characters; all put together, we - * get family names like 'Sony Fixed' or 'Misc Fixed Wide'. - * - * If this option is activated, it can be controlled with the - * `no-long-family-names` property of the 'pcf' driver module. - */ -/* #define PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ - -/*************************************************************************/ -/*************************************************************************/ -/**** ****/ -/**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ -/**** ****/ -/*************************************************************************/ -/*************************************************************************/ - -/************************************************************************** - * - * Compile 'autofit' module with CJK (Chinese, Japanese, Korean) script - * support. - */ -#define AF_CONFIG_OPTION_CJK - -/************************************************************************** - * - * Compile 'autofit' module with fallback Indic script support, covering - * some scripts that the 'latin' submodule of the 'autofit' module doesn't - * (yet) handle. Currently, this needs option `AF_CONFIG_OPTION_CJK`. - */ -#ifdef AF_CONFIG_OPTION_CJK - #define AF_CONFIG_OPTION_INDIC -#endif - -/************************************************************************** - * - * Use TrueType-like size metrics for 'light' auto-hinting. - * - * It is strongly recommended to avoid this option, which exists only to - * help some legacy applications retain its appearance and behaviour with - * respect to auto-hinted TrueType fonts. - * - * The very reason this option exists at all are GNU/Linux distributions - * like Fedora that did not un-patch the following change (which was - * present in FreeType between versions 2.4.6 and 2.7.1, inclusive). - * - * ``` - * 2011-07-16 Steven Chu - * - * [truetype] Fix metrics on size request for scalable fonts. - * ``` - * - * This problematic commit is now reverted (more or less). - */ -/* #define AF_CONFIG_OPTION_TT_SIZE_METRICS */ - -/* */ - -/* - * This macro is obsolete. Support has been removed in FreeType version - * 2.5. - */ -/* #define FT_CONFIG_OPTION_OLD_INTERNALS */ - -/* - * The next three macros are defined if native TrueType hinting is - * requested by the definitions above. Don't change this. - */ -#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER - #define TT_USE_BYTECODE_INTERPRETER - - #ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - #if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1 - #define TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - #endif - - #if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 2 - #define TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - #endif - #endif -#endif - -/* - * The TT_SUPPORT_COLRV1 macro is defined to indicate to clients that this - * version of FreeType has support for 'COLR' v1 API. This definition is - * useful to FreeType clients that want to build in support for 'COLR' v1 - * depending on a tip-of-tree checkout before it is officially released in - * FreeType, and while the feature cannot yet be tested against using - * version macros. Don't change this macro. This may be removed once the - * feature is in a FreeType release version and version macros can be used - * to test for availability. - */ -#ifdef TT_CONFIG_OPTION_COLOR_LAYERS - #define TT_SUPPORT_COLRV1 -#endif - -/* - * Check CFF darkening parameters. The checks are the same as in function - * `cff_property_set` in file `cffdrivr.c`. - */ -#if CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 < 0 || \ - \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 < 0 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 < 0 || \ - \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 > \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 > \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 > \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 || \ - \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 > 500 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 > 500 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 > 500 || \ - CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 > 500 - #error "Invalid CFF darkening parameters!" -#endif - -FT_END_HEADER - -#endif /* FTOPTION_H_ */ - -/* END */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype.c b/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype.c deleted file mode 100644 index b1da8f1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype.c +++ /dev/null @@ -1,408 +0,0 @@ -/** - * @file lv_freetype.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_fs_private.h" -#include "lv_freetype_private.h" - -#if LV_USE_FREETYPE - -#include "lv_freetype_private.h" -#include "../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ - -#define ft_ctx LV_GLOBAL_DEFAULT()->ft_context -#define LV_FREETYPE_OUTLINE_REF_SIZE_DEF 128 - -/**< This value is from the FreeType's function `FT_GlyphSlot_Oblique` in `ftsynth.c` */ -#define LV_FREETYPE_OBLIQUE_SLANT_DEF 0x0366A - -#if LV_FREETYPE_CACHE_FT_GLYPH_CNT <= 0 - #error "LV_FREETYPE_CACHE_FT_GLYPH_CNT must be greater than 0" -#endif - -/********************** - * TYPEDEFS - **********************/ - -/* Use the pointer storing pathname as the unique request ID of the face */ -typedef struct { - char * pathname; - int ref_cnt; -} face_id_node_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_freetype_cleanup(lv_freetype_context_t * ctx); -static FTC_FaceID lv_freetype_req_face_id(lv_freetype_context_t * ctx, const char * pathname); -static void lv_freetype_drop_face_id(lv_freetype_context_t * ctx, FTC_FaceID face_id); -static bool freetype_on_font_create(lv_freetype_font_dsc_t * dsc, uint32_t max_glyph_cnt); -static void freetype_on_font_set_cbs(lv_freetype_font_dsc_t * dsc); - -static bool cache_node_cache_create_cb(lv_freetype_cache_node_t * node, void * user_data); -static void cache_node_cache_free_cb(lv_freetype_cache_node_t * node, void * user_data); -static lv_cache_compare_res_t cache_node_cache_compare_cb(const lv_freetype_cache_node_t * lhs, - const lv_freetype_cache_node_t * rhs); -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_result_t lv_freetype_init(uint32_t max_glyph_cnt) -{ - if(ft_ctx) { - LV_LOG_WARN("freetype already initialized"); - return LV_RESULT_INVALID; - } - - ft_ctx = lv_malloc_zeroed(sizeof(lv_freetype_context_t)); - LV_ASSERT_MALLOC(ft_ctx); - if(!ft_ctx) { - LV_LOG_ERROR("malloc failed for lv_freetype_context_t"); - return LV_RESULT_INVALID; - } - - lv_freetype_context_t * ctx = lv_freetype_get_context(); - - ctx->max_glyph_cnt = max_glyph_cnt; - - FT_Error error; - - error = FT_Init_FreeType(&ctx->library); - if(error) { - FT_ERROR_MSG("FT_Init_FreeType", error); - return LV_RESULT_INVALID; - } - - lv_ll_init(&ctx->face_id_ll, sizeof(face_id_node_t)); - - lv_cache_ops_t ops = { - .compare_cb = (lv_cache_compare_cb_t)cache_node_cache_compare_cb, - .create_cb = (lv_cache_create_cb_t)cache_node_cache_create_cb, - .free_cb = (lv_cache_free_cb_t)cache_node_cache_free_cb, - }; - ctx->cache_node_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_cache_node_t), INT32_MAX, ops); - lv_cache_set_name(ctx->cache_node_cache, "FREETYPE_CACHE_NODE"); - - return LV_RESULT_OK; -} - -void lv_freetype_uninit(void) -{ - lv_freetype_context_t * ctx = lv_freetype_get_context(); - lv_freetype_cleanup(ctx); - - lv_free(ft_ctx); - ft_ctx = NULL; -} - -lv_font_t * lv_freetype_font_create(const char * pathname, lv_freetype_font_render_mode_t render_mode, uint32_t size, - lv_freetype_font_style_t style) -{ - LV_ASSERT_NULL(pathname); - LV_ASSERT(size > 0); - - size_t pathname_len = lv_strlen(pathname); - LV_ASSERT(pathname_len > 0); - - lv_freetype_context_t * ctx = lv_freetype_get_context(); - - lv_freetype_cache_node_t search_key = { - .pathname = lv_freetype_req_face_id(ctx, pathname), - .style = style, - .render_mode = render_mode, - }; - - bool cache_hitting = true; - lv_cache_entry_t * cache_node_entry = lv_cache_acquire(ctx->cache_node_cache, &search_key, NULL); - if(cache_node_entry == NULL) { - cache_hitting = false; - cache_node_entry = lv_cache_acquire_or_create(ctx->cache_node_cache, &search_key, NULL); - if(cache_node_entry == NULL) { - lv_freetype_drop_face_id(ctx, (FTC_FaceID)search_key.pathname); - LV_LOG_ERROR("cache node creating failed"); - return NULL; - } - } - - lv_freetype_font_dsc_t * dsc = lv_malloc_zeroed(sizeof(lv_freetype_font_dsc_t)); - LV_ASSERT_MALLOC(dsc); - - dsc->face_id = (FTC_FaceID)search_key.pathname; - dsc->render_mode = render_mode; - dsc->context = ctx; - dsc->size = size; - dsc->style = style; - dsc->magic_num = LV_FREETYPE_FONT_DSC_MAGIC_NUM; - dsc->cache_node = lv_cache_entry_get_data(cache_node_entry); - dsc->cache_node_entry = cache_node_entry; - - if(cache_hitting == false && freetype_on_font_create(dsc, ctx->max_glyph_cnt) == false) { - lv_cache_release(ctx->cache_node_cache, dsc->cache_node_entry, NULL); - lv_freetype_drop_face_id(ctx, dsc->face_id); - lv_free(dsc); - return NULL; - } - freetype_on_font_set_cbs(dsc); - - FT_Face face = dsc->cache_node->face; - FT_Set_Pixel_Sizes(face, 0, size); - - lv_font_t * font = &dsc->font; - font->dsc = dsc; - font->subpx = LV_FONT_SUBPX_NONE; - font->line_height = FT_F26DOT6_TO_INT(face->size->metrics.height); - font->base_line = -FT_F26DOT6_TO_INT(face->size->metrics.descender); - - FT_Fixed scale = face->size->metrics.y_scale; - int8_t thickness = FT_F26DOT6_TO_INT(FT_MulFix(scale, face->underline_thickness)); - font->underline_position = FT_F26DOT6_TO_INT(FT_MulFix(scale, face->underline_position)); - font->underline_thickness = thickness < 1 ? 1 : thickness; - - return font; -} - -void lv_freetype_font_delete(lv_font_t * font) -{ - LV_ASSERT_NULL(font); - lv_freetype_context_t * ctx = lv_freetype_get_context(); - lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)(font->dsc); - LV_ASSERT_FREETYPE_FONT_DSC(dsc); - - lv_cache_release(ctx->cache_node_cache, dsc->cache_node_entry, NULL); - if(lv_cache_entry_get_ref(dsc->cache_node_entry) == 0) { - lv_cache_drop(ctx->cache_node_cache, dsc->cache_node, NULL); - } - - lv_freetype_drop_face_id(dsc->context, dsc->face_id); - - /* invalidate magic number */ - lv_memzero(dsc, sizeof(lv_freetype_font_dsc_t)); - lv_free(dsc); -} - -lv_freetype_context_t * lv_freetype_get_context(void) -{ - return LV_GLOBAL_DEFAULT()->ft_context; -} - -void lv_freetype_italic_transform(FT_Face face) -{ - LV_ASSERT_NULL(face); - FT_Matrix matrix; - matrix.xx = FT_INT_TO_F16DOT16(1); - matrix.xy = LV_FREETYPE_OBLIQUE_SLANT_DEF; - matrix.yx = 0; - matrix.yy = FT_INT_TO_F16DOT16(1); - FT_Set_Transform(face, &matrix, NULL); -} - -int32_t lv_freetype_italic_transform_on_pos(lv_point_t point) -{ - return point.x + FT_F16DOT16_TO_INT(point.y * LV_FREETYPE_OBLIQUE_SLANT_DEF); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static bool freetype_on_font_create(lv_freetype_font_dsc_t * dsc, uint32_t max_glyph_cnt) -{ - /* - * Glyph info uses a small amount of memory, and uses glyph info more frequently, - * so it plans to use twice the maximum number of caches here to - * get a better info acquisition performance.*/ - lv_cache_t * glyph_cache = lv_freetype_create_glyph_cache(max_glyph_cnt * 2); - if(glyph_cache == NULL) { - LV_LOG_ERROR("glyph cache creating failed"); - return false; - } - dsc->cache_node->glyph_cache = glyph_cache; - - lv_cache_t * draw_data_cache = NULL; - if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_BITMAP) { - draw_data_cache = lv_freetype_create_draw_data_image(max_glyph_cnt); - } - else if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE) { - draw_data_cache = lv_freetype_create_draw_data_outline(max_glyph_cnt); - } - else { - LV_LOG_ERROR("unknown render mode"); - return false; - } - - if(draw_data_cache == NULL) { - LV_LOG_ERROR("draw data cache creating failed"); - return false; - } - - dsc->cache_node->draw_data_cache = draw_data_cache; - - return true; -} - -static void freetype_on_font_set_cbs(lv_freetype_font_dsc_t * dsc) -{ - lv_freetype_set_cbs_glyph(dsc); - if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_BITMAP) { - lv_freetype_set_cbs_image_font(dsc); - } - else if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE) { - lv_freetype_set_cbs_outline_font(dsc); - } -} - -static void lv_freetype_cleanup(lv_freetype_context_t * ctx) -{ - LV_ASSERT_NULL(ctx); - if(ctx->cache_node_cache) { - lv_cache_destroy(ctx->cache_node_cache, NULL); - ctx->cache_node_cache = NULL; - } - - if(ctx->library) { - FT_Done_FreeType(ctx->library); - ctx->library = NULL; - } -} - -static FTC_FaceID lv_freetype_req_face_id(lv_freetype_context_t * ctx, const char * pathname) -{ - size_t len = lv_strlen(pathname); - LV_ASSERT(len > 0); - - lv_ll_t * ll_p = &ctx->face_id_ll; - face_id_node_t * node; - - /* search cache */ - LV_LL_READ(ll_p, node) { - if(strcmp(node->pathname, pathname) == 0) { - node->ref_cnt++; - LV_LOG_INFO("reuse face_id: %s, ref_cnt = %d", node->pathname, node->ref_cnt); - return node->pathname; - } - } - - /* insert new cache */ - node = lv_ll_ins_tail(ll_p); - LV_ASSERT_MALLOC(node); - -#if LV_USE_FS_MEMFS - if(pathname[0] == LV_FS_MEMFS_LETTER) { -#if !LV_FREETYPE_USE_LVGL_PORT - LV_LOG_WARN("LV_FREETYPE_USE_LVGL_PORT is not enabled"); -#endif - node->pathname = lv_malloc(sizeof(lv_fs_path_ex_t)); - LV_ASSERT_MALLOC(node->pathname); - lv_memcpy(node->pathname, pathname, sizeof(lv_fs_path_ex_t)); - } - else -#endif - { - node->pathname = lv_strdup(pathname); - LV_ASSERT_NULL(node->pathname); - } - - LV_LOG_INFO("add face_id: %s", node->pathname); - - node->ref_cnt = 1; - return node->pathname; -} - -static void lv_freetype_drop_face_id(lv_freetype_context_t * ctx, FTC_FaceID face_id) -{ - lv_ll_t * ll_p = &ctx->face_id_ll; - face_id_node_t * node; - LV_LL_READ(ll_p, node) { - if(face_id == node->pathname) { - LV_LOG_INFO("found face_id: %s, ref_cnt = %d", node->pathname, node->ref_cnt); - node->ref_cnt--; - if(node->ref_cnt == 0) { - LV_LOG_INFO("drop face_id: %s", node->pathname); - lv_ll_remove(ll_p, node); - lv_free(node->pathname); - lv_free(node); - } - return; - } - } - - LV_ASSERT_MSG(false, "face_id not found"); -} - -/*----------------- - * Cache Node Cache Callbacks - *----------------*/ - -static bool cache_node_cache_create_cb(lv_freetype_cache_node_t * node, void * user_data) -{ - LV_UNUSED(user_data); - lv_freetype_context_t * ctx = lv_freetype_get_context(); - - /* Cache miss, load face */ - FT_Face face; - FT_Error error = FT_New_Face(ctx->library, node->pathname, 0, &face); - if(error) { - FT_ERROR_MSG("FT_New_Face", error); - return false; - } - - node->ref_size = LV_FREETYPE_OUTLINE_REF_SIZE_DEF; - - if(node->style & LV_FREETYPE_FONT_STYLE_ITALIC) { - lv_freetype_italic_transform(face); - } - - node->face = face; - lv_mutex_init(&node->face_lock); - - return true; -} -static void cache_node_cache_free_cb(lv_freetype_cache_node_t * node, void * user_data) -{ - FT_Done_Face(node->face); - lv_mutex_delete(&node->face_lock); - - if(node->glyph_cache) { - lv_cache_destroy(node->glyph_cache, user_data); - node->glyph_cache = NULL; - } - if(node->draw_data_cache) { - lv_cache_destroy(node->draw_data_cache, user_data); - node->draw_data_cache = NULL; - } -} -static lv_cache_compare_res_t cache_node_cache_compare_cb(const lv_freetype_cache_node_t * lhs, - const lv_freetype_cache_node_t * rhs) -{ - if(lhs->render_mode != rhs->render_mode) { - return lhs->render_mode > rhs->render_mode ? 1 : -1; - } - if(lhs->style != rhs->style) { - return lhs->style > rhs->style ? 1 : -1; - } - - int32_t cmp_res = lv_strcmp(lhs->pathname, rhs->pathname); - if(cmp_res != 0) { - return cmp_res > 0 ? 1 : -1; - } - - return 0; -} - -#endif /*LV_USE_FREETYPE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype.h b/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype.h deleted file mode 100644 index 76b9f7b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype.h +++ /dev/null @@ -1,127 +0,0 @@ -/** - * @file lv_freetype.h - * - */ -#ifndef LV_FREETYPE_H -#define LV_FREETYPE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../misc/lv_types.h" -#include "../../misc/lv_event.h" -#include LV_STDBOOL_INCLUDE - -#if LV_USE_FREETYPE - -/********************* - * DEFINES - *********************/ - -#define LV_FREETYPE_F26DOT6_TO_INT(x) ((x) >> 6) -#define LV_FREETYPE_F26DOT6_TO_FLOAT(x) ((float)(x) / 64) - -#define FT_FONT_STYLE_NORMAL LV_FREETYPE_FONT_STYLE_NORMAL -#define FT_FONT_STYLE_ITALIC LV_FREETYPE_FONT_STYLE_ITALIC -#define FT_FONT_STYLE_BOLD LV_FREETYPE_FONT_STYLE_BOLD - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - LV_FREETYPE_FONT_STYLE_NORMAL = 0, - LV_FREETYPE_FONT_STYLE_ITALIC = 1 << 0, - LV_FREETYPE_FONT_STYLE_BOLD = 1 << 1, -} lv_freetype_font_style_t; - -typedef lv_freetype_font_style_t LV_FT_FONT_STYLE; - -typedef enum { - LV_FREETYPE_FONT_RENDER_MODE_BITMAP = 0, - LV_FREETYPE_FONT_RENDER_MODE_OUTLINE = 1, -} lv_freetype_font_render_mode_t; - -typedef void * lv_freetype_outline_t; - -typedef enum { - LV_FREETYPE_OUTLINE_END, - LV_FREETYPE_OUTLINE_MOVE_TO, - LV_FREETYPE_OUTLINE_LINE_TO, - LV_FREETYPE_OUTLINE_CUBIC_TO, - LV_FREETYPE_OUTLINE_CONIC_TO, -} lv_freetype_outline_type_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the freetype library. - * @return LV_RESULT_OK on success, otherwise LV_RESULT_INVALID. - */ -lv_result_t lv_freetype_init(uint32_t max_glyph_cnt); - -/** - * Uninitialize the freetype library - */ -void lv_freetype_uninit(void); - -/** - * Create a freetype font. - * @param pathname font file path. - * @param render_mode font render mode(see @lv_freetype_font_render_mode_t for details). - * @param size font size. - * @param style font style(see lv_freetype_font_style_t for details). - * @return Created font, or NULL on failure. - */ -lv_font_t * lv_freetype_font_create(const char * pathname, lv_freetype_font_render_mode_t render_mode, uint32_t size, - lv_freetype_font_style_t style); - -/** - * Delete a freetype font. - * @param font freetype font to be deleted. - */ -void lv_freetype_font_delete(lv_font_t * font); - -/** - * Register a callback function to generate outlines for FreeType fonts. - * - * @param cb The callback function to be registered. - * @param user_data User data to be passed to the callback function. - * @return The ID of the registered callback function, or a negative value on failure. - */ -void lv_freetype_outline_add_event(lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data); - -/** - * Get the scale of a FreeType font. - * - * @param font The FreeType font to get the scale of. - * @return The scale of the FreeType font. - */ -uint32_t lv_freetype_outline_get_scale(const lv_font_t * font); - -/** - * Check if the font is an outline font. - * - * @param font The FreeType font. - * @return Is outline font on success, otherwise false. - */ -bool lv_freetype_is_outline_font(const lv_font_t * font); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_FREETYPE*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_FREETYPE_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype_glyph.c b/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype_glyph.c deleted file mode 100644 index 7ed2178..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype_glyph.c +++ /dev/null @@ -1,201 +0,0 @@ -/** - * @file lv_freetype_glyph.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../lvgl.h" -#include "lv_freetype_private.h" - -#if LV_USE_FREETYPE - -/********************* - * DEFINES - *********************/ - -#define CACHE_NAME "FREETYPE_GLYPH" - -/********************** - * TYPEDEFS - **********************/ -typedef struct lv_freetype_glyph_cache_data_t { - uint32_t unicode; - uint32_t size; - - lv_font_glyph_dsc_t glyph_dsc; -} lv_freetype_glyph_cache_data_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static bool freetype_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc, uint32_t unicode_letter, - uint32_t unicode_letter_next); - -static bool freetype_glyph_create_cb(lv_freetype_glyph_cache_data_t * data, void * user_data); -static void freetype_glyph_free_cb(lv_freetype_glyph_cache_data_t * data, void * user_data); -static lv_cache_compare_res_t freetype_glyph_compare_cb(const lv_freetype_glyph_cache_data_t * lhs, - const lv_freetype_glyph_cache_data_t * rhs); -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_cache_t * lv_freetype_create_glyph_cache(uint32_t cache_size) -{ - lv_cache_ops_t ops = { - .create_cb = (lv_cache_create_cb_t)freetype_glyph_create_cb, - .free_cb = (lv_cache_free_cb_t)freetype_glyph_free_cb, - .compare_cb = (lv_cache_compare_cb_t)freetype_glyph_compare_cb, - }; - - lv_cache_t * glyph_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_glyph_cache_data_t), - cache_size, ops); - lv_cache_set_name(glyph_cache, CACHE_NAME); - - return glyph_cache; -} - -void lv_freetype_set_cbs_glyph(lv_freetype_font_dsc_t * dsc) -{ - LV_ASSERT_FREETYPE_FONT_DSC(dsc); - dsc->font.get_glyph_dsc = freetype_get_glyph_dsc_cb; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static bool freetype_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc, uint32_t unicode_letter, - uint32_t unicode_letter_next) -{ - LV_ASSERT_NULL(font); - LV_ASSERT_NULL(g_dsc); - - if(unicode_letter < 0x20) { - g_dsc->adv_w = 0; - g_dsc->box_h = 0; - g_dsc->box_w = 0; - g_dsc->ofs_x = 0; - g_dsc->ofs_y = 0; - g_dsc->format = LV_FONT_GLYPH_FORMAT_NONE; - return true; - } - - lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; - LV_ASSERT_FREETYPE_FONT_DSC(dsc); - - lv_freetype_glyph_cache_data_t search_key = { - .unicode = unicode_letter, - .size = dsc->size, - }; - - lv_cache_t * glyph_cache = dsc->cache_node->glyph_cache; - - lv_cache_entry_t * entry = lv_cache_acquire_or_create(glyph_cache, &search_key, dsc); - if(entry == NULL) { - LV_LOG_ERROR("glyph lookup failed for unicode = 0x%" LV_PRIx32, unicode_letter); - return false; - } - lv_freetype_glyph_cache_data_t * data = lv_cache_entry_get_data(entry); - *g_dsc = data->glyph_dsc; - - if((dsc->style & LV_FREETYPE_FONT_STYLE_ITALIC) && (unicode_letter_next == '\0')) { - g_dsc->adv_w = g_dsc->box_w + g_dsc->ofs_x; - } - - g_dsc->entry = NULL; - - lv_cache_release(glyph_cache, entry, NULL); - return true; -} - -/*----------------- - * Cache Callbacks - *----------------*/ - -static bool freetype_glyph_create_cb(lv_freetype_glyph_cache_data_t * data, void * user_data) -{ - lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)user_data; - - FT_Error error; - - lv_font_glyph_dsc_t * dsc_out = &data->glyph_dsc; - - lv_mutex_lock(&dsc->cache_node->face_lock); - FT_Face face = dsc->cache_node->face; - FT_UInt glyph_index = FT_Get_Char_Index(face, data->unicode); - - FT_Set_Pixel_Sizes(face, 0, dsc->size); - error = FT_Load_Glyph(face, glyph_index, FT_LOAD_COMPUTE_METRICS | FT_LOAD_NO_BITMAP | FT_LOAD_NO_AUTOHINT); - if(error) { - FT_ERROR_MSG("FT_Load_Glyph", error); - lv_mutex_unlock(&dsc->cache_node->face_lock); - return false; - } - - FT_GlyphSlot glyph = face->glyph; - - if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE) { - dsc_out->adv_w = FT_F26DOT6_TO_INT(glyph->metrics.horiAdvance); - dsc_out->box_h = FT_F26DOT6_TO_INT(glyph->metrics.height); /*Height of the bitmap in [px]*/ - dsc_out->box_w = FT_F26DOT6_TO_INT(glyph->metrics.width); /*Width of the bitmap in [px]*/ - dsc_out->ofs_x = FT_F26DOT6_TO_INT(glyph->metrics.horiBearingX); /*X offset of the bitmap in [pf]*/ - dsc_out->ofs_y = FT_F26DOT6_TO_INT(glyph->metrics.horiBearingY - - glyph->metrics.height); /*Y offset of the bitmap measured from the as line*/ - dsc_out->format = LV_FONT_GLYPH_FORMAT_VECTOR; - - /*Transform the glyph to italic if required*/ - if(dsc->style & LV_FREETYPE_FONT_STYLE_ITALIC) { - dsc_out->box_w = lv_freetype_italic_transform_on_pos((lv_point_t) { - dsc_out->box_w, dsc_out->box_h - }); - } - } - else if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_BITMAP) { - FT_Bitmap * glyph_bitmap = &face->glyph->bitmap; - - dsc_out->adv_w = FT_F26DOT6_TO_INT(glyph->advance.x); /*Width of the glyph in [pf]*/ - dsc_out->box_h = glyph_bitmap->rows; /*Height of the bitmap in [px]*/ - dsc_out->box_w = glyph_bitmap->width; /*Width of the bitmap in [px]*/ - dsc_out->ofs_x = glyph->bitmap_left; /*X offset of the bitmap in [pf]*/ - dsc_out->ofs_y = glyph->bitmap_top - - dsc_out->box_h; /*Y offset of the bitmap measured from the as line*/ - dsc_out->format = LV_FONT_GLYPH_FORMAT_A8; - } - - dsc_out->is_placeholder = glyph_index == 0; - dsc_out->gid.index = (uint32_t)glyph_index; - - lv_mutex_unlock(&dsc->cache_node->face_lock); - - return true; -} -static void freetype_glyph_free_cb(lv_freetype_glyph_cache_data_t * data, void * user_data) -{ - LV_UNUSED(data); - LV_UNUSED(user_data); -} -static lv_cache_compare_res_t freetype_glyph_compare_cb(const lv_freetype_glyph_cache_data_t * lhs, - const lv_freetype_glyph_cache_data_t * rhs) -{ - if(lhs->unicode != rhs->unicode) { - return lhs->unicode > rhs->unicode ? 1 : -1; - } - if(lhs->size != rhs->size) { - return lhs->size > rhs->size ? 1 : -1; - } - return 0; -} - -#endif /*LV_USE_FREETYPE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype_image.c b/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype_image.c deleted file mode 100644 index ab7dad2..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype_image.c +++ /dev/null @@ -1,188 +0,0 @@ -/** - * @file lv_freetype_image.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../lvgl.h" -#include "lv_freetype_private.h" - -#if LV_USE_FREETYPE - -#include "../../core/lv_global.h" - -#define font_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->font_draw_buf_handlers) - -/********************* - * DEFINES - *********************/ - -#define CACHE_NAME "FREETYPE_IMAGE" - -/********************** - * TYPEDEFS - **********************/ - -typedef struct lv_freetype_image_cache_data_t { - FT_UInt glyph_index; - uint32_t size; - - lv_draw_buf_t * draw_buf; -} lv_freetype_image_cache_data_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static const void * freetype_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf); - -static bool freetype_image_create_cb(lv_freetype_image_cache_data_t * data, void * user_data); -static void freetype_image_free_cb(lv_freetype_image_cache_data_t * node, void * user_data); -static lv_cache_compare_res_t freetype_image_compare_cb(const lv_freetype_image_cache_data_t * lhs, - const lv_freetype_image_cache_data_t * rhs); - -static void freetype_image_release_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc); -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_cache_t * lv_freetype_create_draw_data_image(uint32_t cache_size) -{ - lv_cache_ops_t ops = { - .compare_cb = (lv_cache_compare_cb_t)freetype_image_compare_cb, - .create_cb = (lv_cache_create_cb_t)freetype_image_create_cb, - .free_cb = (lv_cache_free_cb_t)freetype_image_free_cb, - }; - - lv_cache_t * draw_data_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_image_cache_data_t), - cache_size, ops); - lv_cache_set_name(draw_data_cache, CACHE_NAME); - - return draw_data_cache; -} - -void lv_freetype_set_cbs_image_font(lv_freetype_font_dsc_t * dsc) -{ - LV_ASSERT_FREETYPE_FONT_DSC(dsc); - dsc->font.get_glyph_bitmap = freetype_get_glyph_bitmap_cb; - dsc->font.release_glyph = freetype_image_release_cb; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static const void * freetype_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf) -{ - LV_UNUSED(draw_buf); - const lv_font_t * font = g_dsc->resolved_font; - lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; - LV_ASSERT_FREETYPE_FONT_DSC(dsc); - - FT_UInt glyph_index = (FT_UInt)g_dsc->gid.index; - - lv_cache_t * cache = dsc->cache_node->draw_data_cache; - - lv_freetype_image_cache_data_t search_key = { - .glyph_index = glyph_index, - .size = dsc->size, - }; - - lv_cache_entry_t * entry = lv_cache_acquire_or_create(cache, &search_key, dsc); - - g_dsc->entry = entry; - lv_freetype_image_cache_data_t * cache_node = lv_cache_entry_get_data(entry); - - return cache_node->draw_buf; -} - -static void freetype_image_release_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc) -{ - LV_ASSERT_NULL(font); - lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; - lv_cache_release(dsc->cache_node->draw_data_cache, g_dsc->entry, NULL); - g_dsc->entry = NULL; -} - -/*----------------- - * Cache Callbacks - *----------------*/ - -static bool freetype_image_create_cb(lv_freetype_image_cache_data_t * data, void * user_data) -{ - lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)user_data; - - FT_Error error; - - lv_mutex_lock(&dsc->cache_node->face_lock); - - FT_Face face = dsc->cache_node->face; - FT_Set_Pixel_Sizes(face, 0, dsc->size); - error = FT_Load_Glyph(face, data->glyph_index, FT_LOAD_RENDER | FT_LOAD_TARGET_NORMAL | FT_LOAD_NO_AUTOHINT); - if(error) { - FT_ERROR_MSG("FT_Load_Glyph", error); - lv_mutex_unlock(&dsc->cache_node->face_lock); - return false; - } - error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL); - if(error) { - FT_ERROR_MSG("FT_Render_Glyph", error); - lv_mutex_unlock(&dsc->cache_node->face_lock); - return false; - } - - FT_Glyph glyph; - error = FT_Get_Glyph(face->glyph, &glyph); - if(error) { - FT_ERROR_MSG("FT_Get_Glyph", error); - lv_mutex_unlock(&dsc->cache_node->face_lock); - return false; - } - - FT_BitmapGlyph glyph_bitmap = (FT_BitmapGlyph)glyph; - - uint16_t box_h = glyph_bitmap->bitmap.rows; /*Height of the bitmap in [px]*/ - uint16_t box_w = glyph_bitmap->bitmap.width; /*Width of the bitmap in [px]*/ - - uint32_t stride = lv_draw_buf_width_to_stride(box_w, LV_COLOR_FORMAT_A8); - data->draw_buf = lv_draw_buf_create_ex(font_draw_buf_handlers, box_w, box_h, LV_COLOR_FORMAT_A8, stride); - - for(int y = 0; y < box_h; ++y) { - lv_memcpy((uint8_t *)(data->draw_buf->data) + y * stride, glyph_bitmap->bitmap.buffer + y * box_w, - box_w); - } - - FT_Done_Glyph(glyph); - - lv_mutex_unlock(&dsc->cache_node->face_lock); - - return true; -} -static void freetype_image_free_cb(lv_freetype_image_cache_data_t * data, void * user_data) -{ - LV_UNUSED(user_data); - lv_draw_buf_destroy(data->draw_buf); -} -static lv_cache_compare_res_t freetype_image_compare_cb(const lv_freetype_image_cache_data_t * lhs, - const lv_freetype_image_cache_data_t * rhs) -{ - if(lhs->glyph_index != rhs->glyph_index) { - return lhs->glyph_index > rhs->glyph_index ? 1 : -1; - } - if(lhs->size != rhs->size) { - return lhs->size > rhs->size ? 1 : -1; - } - return 0; -} - -#endif /*LV_USE_FREETYPE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype_outline.c b/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype_outline.c deleted file mode 100644 index 77d40fe..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype_outline.c +++ /dev/null @@ -1,373 +0,0 @@ -/** - * @file lv_freetype_outline.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../misc/lv_event_private.h" -#include "../../lvgl.h" -#include "lv_freetype_private.h" - -#if LV_USE_FREETYPE - -/********************* - * DEFINES - *********************/ - -#define CACHE_NAME "FREETYPE_OUTLINE" - -/********************** - * TYPEDEFS - **********************/ - -typedef struct lv_freetype_outline_node_t { - FT_UInt glyph_index; - lv_freetype_outline_t outline; -} lv_freetype_outline_node_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static lv_freetype_outline_t outline_create(lv_freetype_context_t * ctx, FT_Face face, FT_UInt glyph_index, - uint32_t size, uint32_t strength); -static lv_result_t outline_delete(lv_freetype_context_t * ctx, lv_freetype_outline_t outline); -static const void * freetype_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf); -static void freetype_release_glyph_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc); - -static lv_cache_entry_t * lv_freetype_outline_lookup(lv_freetype_font_dsc_t * dsc, FT_UInt glyph_index); - -/*glyph dsc cache lru callbacks*/ -static bool freetype_glyph_outline_create_cb(lv_freetype_outline_node_t * node, lv_freetype_font_dsc_t * dsc); -static void freetype_glyph_outline_free_cb(lv_freetype_outline_node_t * node, lv_freetype_font_dsc_t * dsc); -static lv_cache_compare_res_t freetype_glyph_outline_cmp_cb(const lv_freetype_outline_node_t * node_a, - const lv_freetype_outline_node_t * node_b); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_cache_t * lv_freetype_create_draw_data_outline(uint32_t cache_size) -{ - lv_cache_ops_t glyph_outline_cache_ops = { - .create_cb = (lv_cache_create_cb_t)freetype_glyph_outline_create_cb, - .free_cb = (lv_cache_free_cb_t)freetype_glyph_outline_free_cb, - .compare_cb = (lv_cache_compare_cb_t)freetype_glyph_outline_cmp_cb, - }; - - lv_cache_t * draw_data_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_outline_node_t), - cache_size, - glyph_outline_cache_ops); - lv_cache_set_name(draw_data_cache, CACHE_NAME); - - return draw_data_cache; -} - -void lv_freetype_set_cbs_outline_font(lv_freetype_font_dsc_t * dsc) -{ - LV_ASSERT_FREETYPE_FONT_DSC(dsc); - dsc->font.get_glyph_bitmap = freetype_get_glyph_bitmap_cb; - dsc->font.release_glyph = freetype_release_glyph_cb; -} - -void lv_freetype_outline_add_event(lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data) -{ - LV_UNUSED(user_data); - lv_freetype_context_t * ctx = lv_freetype_get_context(); - - LV_UNUSED(filter); - ctx->event_cb = event_cb; -} - -uint32_t lv_freetype_outline_get_scale(const lv_font_t * font) -{ - LV_ASSERT_NULL(font); - const lv_freetype_font_dsc_t * dsc = font->dsc; - LV_ASSERT_FREETYPE_FONT_DSC(dsc); - - return FT_INT_TO_F26DOT6(dsc->size) / dsc->cache_node->ref_size; -} - -bool lv_freetype_is_outline_font(const lv_font_t * font) -{ - LV_ASSERT_NULL(font); - const lv_freetype_font_dsc_t * dsc = font->dsc; - if(!LV_FREETYPE_FONT_DSC_HAS_MAGIC_NUM(dsc)) { - return false; - } - - return dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/*------------------- - * OUTLINE CACHE - *------------------*/ - -static bool freetype_glyph_outline_create_cb(lv_freetype_outline_node_t * node, lv_freetype_font_dsc_t * dsc) -{ - lv_freetype_outline_t outline; - - lv_mutex_lock(&dsc->cache_node->face_lock); - outline = outline_create(dsc->context, - dsc->cache_node->face, - node->glyph_index, - dsc->cache_node->ref_size, - dsc->style & LV_FREETYPE_FONT_STYLE_BOLD ? 1 : 0); - lv_mutex_unlock(&dsc->cache_node->face_lock); - - if(!outline) { - return false; - } - - LV_LOG_INFO("glyph_index = 0x%" LV_PRIx32, (uint32_t)node->glyph_index); - - node->outline = outline; - return true; -} - -static void freetype_glyph_outline_free_cb(lv_freetype_outline_node_t * node, lv_freetype_font_dsc_t * dsc) -{ - LV_UNUSED(dsc); - - lv_freetype_outline_t outline = node->outline; - lv_freetype_context_t * ctx = lv_freetype_get_context(); - outline_delete(ctx, outline); -} - -static lv_cache_compare_res_t freetype_glyph_outline_cmp_cb(const lv_freetype_outline_node_t * node_a, - const lv_freetype_outline_node_t * node_b) -{ - if(node_a->glyph_index == node_b->glyph_index) { - return 0; - } - return node_a->glyph_index > node_b->glyph_index ? 1 : -1; -} - -static const void * freetype_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf) -{ - LV_UNUSED(draw_buf); - - const lv_font_t * font = g_dsc->resolved_font; - lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; - LV_ASSERT_FREETYPE_FONT_DSC(dsc); - lv_cache_entry_t * entry = lv_freetype_outline_lookup(dsc, (FT_UInt)g_dsc->gid.index); - if(entry == NULL) { - return NULL; - } - lv_freetype_outline_node_t * node = lv_cache_entry_get_data(entry); - - g_dsc->entry = entry; - - return node ? node->outline : NULL; -} - -static void freetype_release_glyph_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc) -{ - LV_ASSERT_NULL(font); - lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; - - if(g_dsc->entry == NULL) { - return; - } - lv_cache_release(dsc->cache_node->draw_data_cache, g_dsc->entry, NULL); - g_dsc->entry = NULL; -} - -static lv_cache_entry_t * lv_freetype_outline_lookup(lv_freetype_font_dsc_t * dsc, FT_UInt glyph_index) -{ - lv_freetype_cache_node_t * cache_node = dsc->cache_node; - - lv_freetype_outline_node_t tmp_node; - tmp_node.glyph_index = glyph_index; - - lv_cache_entry_t * entry = lv_cache_acquire_or_create(cache_node->draw_data_cache, &tmp_node, dsc); - if(!entry) { - LV_LOG_ERROR("glyph outline lookup failed for glyph_index = 0x%" LV_PRIx32, (uint32_t)glyph_index); - return NULL; - } - return entry; -} - -static void ft_vector_to_lv_vector(lv_freetype_outline_vector_t * dest, const FT_Vector * src) -{ - dest->x = src ? src->x : 0; - dest->y = src ? src->y : 0; -} - -static lv_result_t outline_send_event(lv_freetype_context_t * ctx, lv_event_code_t code, - lv_freetype_outline_event_param_t * param) -{ - if(!ctx->event_cb) { - LV_LOG_ERROR("event_cb is not set"); - return LV_RESULT_INVALID; - } - - lv_event_t e; - lv_memzero(&e, sizeof(e)); - e.code = code; - e.param = param; - e.user_data = NULL; - - ctx->event_cb(&e); - - return LV_RESULT_OK; -} - -static lv_result_t outline_push_point( - lv_freetype_outline_t outline, - lv_freetype_outline_type_t type, - const FT_Vector * control1, - const FT_Vector * control2, - const FT_Vector * to) -{ - lv_freetype_context_t * ctx = lv_freetype_get_context(); - - lv_freetype_outline_event_param_t param; - lv_memzero(¶m, sizeof(param)); - param.outline = outline; - param.type = type; - ft_vector_to_lv_vector(¶m.control1, control1); - ft_vector_to_lv_vector(¶m.control2, control2); - ft_vector_to_lv_vector(¶m.to, to); - - return outline_send_event(ctx, LV_EVENT_INSERT, ¶m); -} - -static int outline_move_to_cb( - const FT_Vector * to, - void * user) -{ - lv_freetype_outline_t outline = user; - outline_push_point(outline, LV_FREETYPE_OUTLINE_MOVE_TO, NULL, NULL, to); - return FT_Err_Ok; -} - -static int outline_line_to_cb( - const FT_Vector * to, - void * user) -{ - lv_freetype_outline_t outline = user; - outline_push_point(outline, LV_FREETYPE_OUTLINE_LINE_TO, NULL, NULL, to); - return FT_Err_Ok; -} - -static int outline_conic_to_cb( - const FT_Vector * control, - const FT_Vector * to, - void * user) -{ - lv_freetype_outline_t outline = user; - outline_push_point(outline, LV_FREETYPE_OUTLINE_CONIC_TO, control, NULL, to); - return FT_Err_Ok; -} - -static int outline_cubic_to_cb( - const FT_Vector * control1, - const FT_Vector * control2, - const FT_Vector * to, - void * user) -{ - lv_freetype_outline_t outline = user; - outline_push_point(outline, LV_FREETYPE_OUTLINE_CUBIC_TO, control1, control2, to); - return FT_Err_Ok; -} - -static lv_freetype_outline_t outline_create( - lv_freetype_context_t * ctx, - FT_Face face, - FT_UInt glyph_index, - uint32_t size, - uint32_t strength) -{ - LV_ASSERT_NULL(ctx); - FT_Error error; - - error = FT_Set_Pixel_Sizes(face, 0, size); - if(error) { - FT_ERROR_MSG("FT_Set_Char_Size", error); - return NULL; - } - - /** - * Disable AUTOHINT(https://freetype.org/autohinting/hinter.html) to avoid display clipping - * caused by inconsistent glyph measurement and outline. - */ - error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP | FT_LOAD_NO_AUTOHINT); - if(error) { - FT_ERROR_MSG("FT_Load_Glyph", error); - return NULL; - } - - if(strength > 0) { - error = FT_Outline_Embolden(&face->glyph->outline, FT_INT_TO_F26DOT6(strength)); - if(error) { - FT_ERROR_MSG("FT_Outline_Embolden", error); - } - } - - lv_result_t res; - lv_freetype_outline_event_param_t param; - - lv_memzero(¶m, sizeof(param)); - res = outline_send_event(ctx, LV_EVENT_CREATE, ¶m); - - lv_freetype_outline_t outline = param.outline; - - if(res != LV_RESULT_OK || !outline) { - LV_LOG_ERROR("Outline object create failed"); - return NULL; - } - - FT_Outline_Funcs outline_funcs = { - .move_to = outline_move_to_cb, - .line_to = outline_line_to_cb, - .conic_to = outline_conic_to_cb, - .cubic_to = outline_cubic_to_cb, - .shift = 0, - .delta = 0 - }; - - /* Run outline decompose again to fill outline data */ - error = FT_Outline_Decompose(&face->glyph->outline, &outline_funcs, outline); - if(error) { - FT_ERROR_MSG("FT_Outline_Decompose", error); - outline_delete(ctx, outline); - return NULL; - } - - /* close outline */ - res = outline_push_point(outline, LV_FREETYPE_OUTLINE_END, NULL, NULL, NULL); - if(res != LV_RESULT_OK) { - LV_LOG_ERROR("Outline object close failed"); - outline_delete(ctx, outline); - return NULL; - } - - return outline; -} - -static lv_result_t outline_delete(lv_freetype_context_t * ctx, lv_freetype_outline_t outline) -{ - lv_freetype_outline_event_param_t param; - lv_memzero(¶m, sizeof(param)); - param.outline = outline; - - return outline_send_event(ctx, LV_EVENT_DELETE, ¶m); -} - -#endif /*LV_USE_FREETYPE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype_private.h b/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype_private.h deleted file mode 100644 index 7644101..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_freetype_private.h +++ /dev/null @@ -1,151 +0,0 @@ -/** - * @file lv_freetype_private.h - * - */ - -#ifndef LV_FREETYPE_PRIVATE_H -#define LV_FREETYPE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_freetype.h" -#include "../../misc/cache/lv_cache.h" -#include "../../misc/lv_ll.h" -#include "../../font/lv_font.h" - -#if LV_USE_FREETYPE - -#include "ft2build.h" -#include FT_FREETYPE_H -#include FT_GLYPH_H -#include FT_CACHE_H -#include FT_SIZES_H -#include FT_IMAGE_H -#include FT_OUTLINE_H - -/********************* - * DEFINES - *********************/ - -#ifdef FT_CONFIG_OPTION_ERROR_STRINGS -#define FT_ERROR_MSG(msg, error_code) \ - LV_LOG_ERROR(msg " error(0x%x): %s", (int)error_code, FT_Error_String(error_code)) -#else -#define FT_ERROR_MSG(msg, error_code) \ - LV_LOG_ERROR(msg " error(0x%x)", (int)error_code) -#endif - -#define LV_FREETYPE_FONT_DSC_MAGIC_NUM 0x5F5F4654 /* '__FT' */ -#define LV_FREETYPE_FONT_DSC_HAS_MAGIC_NUM(dsc) ((dsc)->magic_num == LV_FREETYPE_FONT_DSC_MAGIC_NUM) -#define LV_ASSERT_FREETYPE_FONT_DSC(dsc) \ - do { \ - LV_ASSERT_NULL(dsc); \ - LV_ASSERT_FORMAT_MSG(LV_FREETYPE_FONT_DSC_HAS_MAGIC_NUM(dsc), \ - "Invalid font descriptor: 0x%" LV_PRIx32, (dsc)->magic_num); \ - } while (0) - -#define FT_INT_TO_F26DOT6(x) ((x) << 6) -#define FT_F26DOT6_TO_INT(x) ((x) >> 6) - -#define FT_INT_TO_F16DOT16(x) ((x) << 16) -#define FT_F16DOT16_TO_INT(x) ((x) >> 16) - -/********************** - * TYPEDEFS - **********************/ - -struct lv_freetype_outline_vector_t { - int32_t x; - int32_t y; -}; - -struct lv_freetype_outline_event_param_t { - lv_freetype_outline_t outline; - lv_freetype_outline_type_t type; - lv_freetype_outline_vector_t to; - lv_freetype_outline_vector_t control1; - lv_freetype_outline_vector_t control2; -}; - - -typedef struct lv_freetype_cache_node_t lv_freetype_cache_node_t; - -struct lv_freetype_cache_node_t { - const char * pathname; - lv_freetype_font_style_t style; - lv_freetype_font_render_mode_t render_mode; - - uint32_t ref_size; /**< Reference size for calculating outline glyph's real size.*/ - - FT_Face face; - lv_mutex_t face_lock; - - /*glyph cache*/ - lv_cache_t * glyph_cache; - - /*draw data cache*/ - lv_cache_t * draw_data_cache; -}; - -typedef struct lv_freetype_context_t { - FT_Library library; - lv_ll_t face_id_ll; - lv_event_cb_t event_cb; - - uint32_t max_glyph_cnt; - - lv_cache_t * cache_node_cache; -} lv_freetype_context_t; - -typedef struct lv_freetype_font_dsc_t { - uint32_t magic_num; - lv_font_t font; - uint32_t size; - lv_freetype_font_style_t style; - lv_freetype_font_render_mode_t render_mode; - lv_freetype_context_t * context; - lv_freetype_cache_node_t * cache_node; - lv_cache_entry_t * cache_node_entry; - FTC_FaceID face_id; -} lv_freetype_font_dsc_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Get the FreeType context. - * - * @return A pointer to the FreeType context used by LittlevGL. - */ -lv_freetype_context_t * lv_freetype_get_context(void); - -void lv_freetype_italic_transform(FT_Face face); -int32_t lv_freetype_italic_transform_on_pos(lv_point_t point); - -lv_cache_t * lv_freetype_create_glyph_cache(uint32_t cache_size); -void lv_freetype_set_cbs_glyph(lv_freetype_font_dsc_t * dsc); - -lv_cache_t * lv_freetype_create_draw_data_image(uint32_t cache_size); -void lv_freetype_set_cbs_image_font(lv_freetype_font_dsc_t * dsc); - -lv_cache_t * lv_freetype_create_draw_data_outline(uint32_t cache_size); -void lv_freetype_set_cbs_outline_font(lv_freetype_font_dsc_t * dsc); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_FREETYPE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_FREETYPE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_ftsystem.c b/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_ftsystem.c deleted file mode 100644 index ee0e836..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/freetype/lv_ftsystem.c +++ /dev/null @@ -1,291 +0,0 @@ -/** - * @file lv_ftsystem.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../../lvgl.h" -#if LV_USE_FREETYPE && LV_FREETYPE_USE_LVGL_PORT - -#include -#include FT_CONFIG_CONFIG_H -#include -#include -#include -#include -#include - -/********************* - * DEFINES - *********************/ - -/* The macro FT_COMPONENT is used in trace mode. It is an implicit - * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log - * messages during execution. - */ -#undef FT_COMPONENT -#define FT_COMPONENT io - -/* We use the macro STREAM_FILE for convenience to extract the */ -/* system-specific stream handle from a given FreeType stream object */ -#define STREAM_FILE( stream ) ( (lv_fs_file_t*)stream->descriptor.pointer ) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -FT_CALLBACK_DEF(unsigned long) -ft_lv_fs_stream_io(FT_Stream stream, - unsigned long offset, - unsigned char * buffer, - unsigned long count); -FT_CALLBACK_DEF(void) -ft_lv_fs_stream_close(FT_Stream stream); -FT_CALLBACK_DEF(void *) -ft_alloc(FT_Memory memory, - long size); -FT_CALLBACK_DEF(void *) -ft_realloc(FT_Memory memory, - long cur_size, - long new_size, - void * block); -FT_CALLBACK_DEF(void) -ft_free(FT_Memory memory, - void * block); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef FT_DEBUG_MEMORY - - extern FT_Int - ft_mem_debug_init(FT_Memory memory); - - extern void - ft_mem_debug_done(FT_Memory memory); - -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT - -/* documentation is in ftstream.h */ - -FT_BASE_DEF(FT_Error) -FT_Stream_Open(FT_Stream stream, - const char * filepathname) -{ - lv_fs_file_t file; - - if(!stream) - return FT_THROW(Invalid_Stream_Handle); - - stream->descriptor.pointer = NULL; - stream->pathname.pointer = (char *)filepathname; - stream->base = NULL; - stream->pos = 0; - stream->read = NULL; - stream->close = NULL; - - lv_fs_res_t res = lv_fs_open(&file, filepathname, LV_FS_MODE_RD); - - if(res != LV_FS_RES_OK) { - FT_ERROR(("FT_Stream_Open:" - " could not open `%s'\n", filepathname)); - - return FT_THROW(Cannot_Open_Resource); - } - - lv_fs_seek(&file, 0, LV_FS_SEEK_END); - - uint32_t pos; - res = lv_fs_tell(&file, &pos); - if(res != LV_FS_RES_OK) { - FT_ERROR(("FT_Stream_Open:")); - FT_ERROR((" opened `%s' but zero-sized\n", filepathname)); - lv_fs_close(&file); - return FT_THROW(Cannot_Open_Stream); - } - stream->size = pos; - lv_fs_seek(&file, 0, LV_FS_SEEK_SET); - - lv_fs_file_t * file_p = lv_malloc(sizeof(lv_fs_file_t)); - LV_ASSERT_MALLOC(file_p); - - if(!file_p) { - FT_ERROR(("FT_Stream_Open: malloc failed for file_p")); - lv_fs_close(&file); - return FT_THROW(Cannot_Open_Stream); - } - - *file_p = file; - - stream->descriptor.pointer = file_p; - stream->read = ft_lv_fs_stream_io; - stream->close = ft_lv_fs_stream_close; - - FT_TRACE1(("FT_Stream_Open:")); - FT_TRACE1((" opened `%s' (%ld bytes) successfully\n", - filepathname, stream->size)); - - return FT_Err_Ok; -} - -#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ - -/* documentation is in ftobjs.h */ - -FT_BASE_DEF(FT_Memory) -FT_New_Memory(void) -{ - FT_Memory memory; - - memory = (FT_Memory)lv_malloc(sizeof(*memory)); - if(memory) { - memory->user = NULL; - memory->alloc = ft_alloc; - memory->realloc = ft_realloc; - memory->free = ft_free; -#ifdef FT_DEBUG_MEMORY - ft_mem_debug_init(memory); -#endif - } - - return memory; -} - -/* documentation is in ftobjs.h */ - -FT_BASE_DEF(void) -FT_Done_Memory(FT_Memory memory) -{ -#ifdef FT_DEBUG_MEMORY - ft_mem_debug_done(memory); -#endif - lv_free(memory); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * The memory allocation function. - * @param memory A pointer to the memory object. - * @param size The requested size in bytes. - * @return The address of newly allocated block. - */ -FT_CALLBACK_DEF(void *) -ft_alloc(FT_Memory memory, - long size) -{ - FT_UNUSED(memory); - - return lv_malloc((size_t)size); -} - -/** - * The memory reallocation function. - * @param memory A pointer to the memory object. - * @param cur_size The current size of the allocated memory block. - * @param new_size The newly requested size in bytes. - * @param block The current address of the block in memory. - * @return The address of the reallocated memory block. - */ -FT_CALLBACK_DEF(void *) -ft_realloc(FT_Memory memory, - long cur_size, - long new_size, - void * block) -{ - FT_UNUSED(memory); - FT_UNUSED(cur_size); - - return lv_realloc(block, (size_t)new_size); -} - -/** - * The memory release function. - * @param memory A pointer to the memory object. - * @param block The address of block in memory to be freed. - */ -FT_CALLBACK_DEF(void) -ft_free(FT_Memory memory, - void * block) -{ - FT_UNUSED(memory); - - lv_free(block); -} - -#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT - -/** - * The function to close a stream. - * @param stream A pointer to the stream object. - */ -FT_CALLBACK_DEF(void) -ft_lv_fs_stream_close(FT_Stream stream) -{ - lv_fs_file_t * file_p = STREAM_FILE(stream); - lv_fs_close(file_p); - lv_free(file_p); - - stream->descriptor.pointer = NULL; - stream->size = 0; - stream->base = NULL; -} - -/** - * The function to open a stream. - * @param stream A pointer to the stream object. - * @param offset The position in the data stream to start reading. - * @param buffer The address of buffer to store the read data. - * @param count The number of bytes to read from the stream. - * @return The number of bytes actually read. If `count' is zero (this is, - * the function is used for seeking), a non-zero return value - * indicates an error. - */ -FT_CALLBACK_DEF(unsigned long) -ft_lv_fs_stream_io(FT_Stream stream, - unsigned long offset, - unsigned char * buffer, - unsigned long count) -{ - lv_fs_file_t * file_p; - - if(!count && offset > stream->size) - return 1; - - file_p = STREAM_FILE(stream); - - if(stream->pos != offset) - lv_fs_seek(file_p, (long)offset, LV_FS_SEEK_SET); - - if(count == 0) - return 0; - - uint32_t br; - lv_fs_res_t res = lv_fs_read(file_p, buffer, count, &br); - - return res == LV_FS_RES_OK ? br : 0; -} - -#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ - -#endif/*LV_FREETYPE_USE_LV_FTSYSTEM*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_arduino_esp_littlefs.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_arduino_esp_littlefs.cpp deleted file mode 100644 index cd8df4c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_arduino_esp_littlefs.cpp +++ /dev/null @@ -1,201 +0,0 @@ -#include "../../../lvgl.h" -#if LV_USE_FS_ARDUINO_ESP_LITTLEFS - -#include "../../core/lv_global.h" -#include "LittleFS.h" - -#if LV_FS_ARDUINO_ESP_LITTLEFS_LETTER == '\0' - #error "LV_FS_ARDUINO_ESP_LITTLEFS_LETTER must be set to a valid value" -#else - #if (LV_FS_ARDUINO_ESP_LITTLEFS_LETTER < 'A') || (LV_FS_ARDUINO_ESP_LITTLEFS_LETTER > 'Z') - #if LV_FS_DEFAULT_DRIVE_LETTER != '\0' /*When using default drive letter, strict format (X:) is mandatory*/ - #error "LV_FS_ARDUINO_ESP_LITTLEFS_LETTER must be an upper case ASCII letter" - #else /*Lean rules for backward compatibility*/ - #warning LV_FS_ARDUINO_ESP_LITTLEFS_LETTER should be an upper case ASCII letter. \ - Using a slash symbol as drive letter should be replaced with LV_FS_DEFAULT_DRIVE_LETTER mechanism - #endif - #endif -#endif - -typedef struct ArduinoEspLittleFile { - File file; -} ArduinoEspLittleFile; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void fs_init(void); -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); - -/** - * Register a driver for the LittleFS File System interface - */ -extern "C" void lv_fs_arduino_esp_littlefs_init(void) -{ - fs_init(); - - lv_fs_drv_t * fs_drv = &(LV_GLOBAL_DEFAULT()->arduino_esp_littlefs_fs_drv); - lv_fs_drv_init(fs_drv); - - fs_drv->letter = LV_FS_ARDUINO_ESP_LITTLEFS_LETTER; - fs_drv->open_cb = fs_open; - fs_drv->close_cb = fs_close; - fs_drv->read_cb = fs_read; - fs_drv->write_cb = fs_write; - fs_drv->seek_cb = fs_seek; - fs_drv->tell_cb = fs_tell; - - fs_drv->dir_close_cb = NULL; - fs_drv->dir_open_cb = NULL; - fs_drv->dir_read_cb = NULL; - - lv_fs_drv_register(fs_drv); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/*Initialize your Storage device and File system.*/ -static void fs_init(void) -{ - LittleFS.begin(); -} - -/** - * Open a file - * @param drv pointer to a driver where this function belongs - * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) - * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR - * @return a file descriptor or NULL on error - */ -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) -{ - LV_UNUSED(drv); - - const char * flags; - if(mode == LV_FS_MODE_WR) - flags = FILE_WRITE; - else if(mode == LV_FS_MODE_RD) - flags = FILE_READ; - else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) - flags = FILE_WRITE; - - File file = LittleFS.open(path, flags); - if(!file) { - return NULL; - } - - ArduinoEspLittleFile * lf = new ArduinoEspLittleFile{file}; - - return (void *)lf; -} - -/** - * Close an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_t variable. (opened with fs_open) - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) -{ - LV_UNUSED(drv); - ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p; - lf->file.close(); - delete lf; - - return LV_FS_RES_OK; -} - -/** - * Read data from an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_t variable. - * @param buf pointer to a memory block where to store the read data - * @param btr number of Bytes To Read - * @param br the real number of read bytes (Byte Read) - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) -{ - LV_UNUSED(drv); - ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p; - *br = lf->file.read((uint8_t *)buf, btr); - - return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -/** - * Write into a file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_t variable - * @param buf pointer to a buffer with the bytes to write - * @param btw Bytes To Write - * @param bw the number of real written bytes (Bytes Written) - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) -{ - LV_UNUSED(drv); - ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p; - *bw = lf->file.write((uint8_t *)buf, btw); - - return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -/** - * Set the read write pointer. Also expand the file size if necessary. - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_t variable. (opened with fs_open ) - * @param pos the new position of read write pointer - * @param whence tells from where to interpret the `pos`. See @lv_fs_whence_t - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) -{ - LV_UNUSED(drv); - SeekMode mode; - if(whence == LV_FS_SEEK_SET) - mode = SeekSet; - else if(whence == LV_FS_SEEK_CUR) - mode = SeekCur; - else if(whence == LV_FS_SEEK_END) - mode = SeekEnd; - - ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p; - - int rc = lf->file.seek(pos, mode); - - return rc < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -/** - * Give the position of the read write pointer - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_p variable - * @param pos_p pointer to store the result - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) -{ - LV_UNUSED(drv); - ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p; - - *pos_p = lf->file.position(); - - return (int32_t)(*pos_p) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -#else /*LV_USE_FS_ARDUINO_ESP_LITTLEFS == 0*/ - -#if defined(LV_FS_ARDUINO_ESP_LITTLEFS_LETTER) && LV_FS_ARDUINO_ESP_LITTLEFS_LETTER != '\0' - #warning "LV_USE_FS_ARDUINO_ESP_LITTLEFS is not enabled but LV_FS_ARDUINO_ESP_LITTLEFS_LETTER is set" -#endif - -#endif /*LV_USE_FS_ARDUINO_ESP_LITTLEFS*/ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_arduino_sd.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_arduino_sd.cpp deleted file mode 100644 index 14941ac..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_arduino_sd.cpp +++ /dev/null @@ -1,192 +0,0 @@ -#include "../../../lvgl.h" -#if LV_USE_FS_ARDUINO_SD - -#include "../../core/lv_global.h" -#include -#include "SD.h" - -#if LV_FS_ARDUINO_SD_LETTER == '\0' - #error "LV_FS_ARDUINO_SD_LETTER must be set to a valid value" -#else - #if (LV_FS_ARDUINO_SD_LETTER < 'A') || (LV_FS_ARDUINO_SD_LETTER > 'Z') - #if LV_FS_DEFAULT_DRIVE_LETTER != '\0' /*When using default drive letter, strict format (X:) is mandatory*/ - #error "LV_FS_ARDUINO_SD_LETTER must be an upper case ASCII letter" - #else /*Lean rules for backward compatibility*/ - #warning LV_FS_ARDUINO_SD_LETTER should be an upper case ASCII letter. \ - Using a slash symbol as drive letter should be replaced with LV_FS_DEFAULT_DRIVE_LETTER mechanism - #endif - #endif -#endif - -typedef struct SdFile { - File file; -} SdFile; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); - -/** - * Register a driver for the SD File System interface - */ -extern "C" void lv_fs_arduino_sd_init(void) -{ - lv_fs_drv_t * fs_drv = &(LV_GLOBAL_DEFAULT()->arduino_sd_fs_drv); - lv_fs_drv_init(fs_drv); - - fs_drv->letter = LV_FS_ARDUINO_SD_LETTER; - fs_drv->open_cb = fs_open; - fs_drv->close_cb = fs_close; - fs_drv->read_cb = fs_read; - fs_drv->write_cb = fs_write; - fs_drv->seek_cb = fs_seek; - fs_drv->tell_cb = fs_tell; - - fs_drv->dir_close_cb = NULL; - fs_drv->dir_open_cb = NULL; - fs_drv->dir_read_cb = NULL; - - lv_fs_drv_register(fs_drv); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Open a file - * @param drv pointer to a driver where this function belongs - * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) - * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR - * @return a file descriptor or NULL on error - */ -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) -{ - LV_UNUSED(drv); - - const char * flags; - if(mode == LV_FS_MODE_WR) - flags = FILE_WRITE; - else if(mode == LV_FS_MODE_RD) - flags = FILE_READ; - else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) - flags = FILE_WRITE; - - File file = SD.open(path, flags); - if(!file) { - return NULL; - } - - SdFile * lf = new SdFile{file}; - - return (void *)lf; -} - -/** - * Close an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_t variable. (opened with fs_open) - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) -{ - LV_UNUSED(drv); - SdFile * lf = (SdFile *)file_p; - lf->file.close(); - delete lf; - - return LV_FS_RES_OK; -} - -/** - * Read data from an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_t variable. - * @param buf pointer to a memory block where to store the read data - * @param btr number of Bytes To Read - * @param br the real number of read bytes (Byte Read) - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) -{ - LV_UNUSED(drv); - SdFile * lf = (SdFile *)file_p; - *br = lf->file.read((uint8_t *)buf, btr); - - return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -/** - * Write into a file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_t variable - * @param buf pointer to a buffer with the bytes to write - * @param btw Bytes To Write - * @param bw the number of real written bytes (Bytes Written) - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) -{ - LV_UNUSED(drv); - SdFile * lf = (SdFile *)file_p; - *bw = lf->file.write((uint8_t *)buf, btw); - - return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -/** - * Set the read write pointer. Also expand the file size if necessary. - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_t variable. (opened with fs_open ) - * @param pos the new position of read write pointer - * @param whence tells from where to interpret the `pos`. See @lv_fs_whence_t - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) -{ - LV_UNUSED(drv); - SeekMode mode; - if(whence == LV_FS_SEEK_SET) - mode = SeekSet; - else if(whence == LV_FS_SEEK_CUR) - mode = SeekCur; - else if(whence == LV_FS_SEEK_END) - mode = SeekEnd; - - SdFile * lf = (SdFile *)file_p; - - int rc = lf->file.seek(pos, mode); - - return rc < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -/** - * Give the position of the read write pointer - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_p variable - * @param pos_p pointer to store the result - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) -{ - LV_UNUSED(drv); - SdFile * lf = (SdFile *)file_p; - - *pos_p = lf->file.position(); - - return (int32_t)(*pos_p) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -#else /*LV_USE_FS_ARDUINO_SD == 0*/ - -#if defined(LV_FS_ARDUINO_SD_LETTER) && LV_FS_ARDUINO_SD_LETTER != '\0' - #warning "LV_USE_FS_ARDUINO_SD is not enabled but LV_FS_ARDUINO_SD_LETTER is set" -#endif - -#endif /*LV_USE_FS_ARDUINO_SD*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_cbfs.c b/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_cbfs.c deleted file mode 100644 index 6f1245b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_cbfs.c +++ /dev/null @@ -1,10 +0,0 @@ -// this file should not exist -#ifdef __GNUC__ - #define IS_NOT_USED __attribute__ ((unused)) -#else - #define IS_NOT_USED -#endif -IS_NOT_USED static void nothing(void) -{ - // do nothing -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_fatfs.c b/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_fatfs.c deleted file mode 100644 index 79c62a3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_fatfs.c +++ /dev/null @@ -1,306 +0,0 @@ -/** - * @file lv_fs_fatfs.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../../lvgl.h" - -#if LV_USE_FS_FATFS -#include "ff.h" - -#include "../../core/lv_global.h" -/********************* - * DEFINES - *********************/ - -#ifdef ESP_PLATFORM - #define DIR FF_DIR /* ESP IDF typedefs `DIR` as `FF_DIR` in its version of ff.h. Use `FF_DIR` in LVGL too */ -#endif - -#if LV_FS_FATFS_LETTER == '\0' - #error "LV_FS_FATFS_LETTER must be set to a valid value" -#else - #if (LV_FS_FATFS_LETTER < 'A') || (LV_FS_FATFS_LETTER > 'Z') - #if LV_FS_DEFAULT_DRIVE_LETTER != '\0' /*When using default drive letter, strict format (X:) is mandatory*/ - #error "LV_FS_FATFS_LETTER must be an upper case ASCII letter" - #else /*Lean rules for backward compatibility*/ - #warning LV_FS_FATFS_LETTER should be an upper case ASCII letter. \ - Using a slash symbol as drive letter should be replaced with LV_FS_DEFAULT_DRIVE_LETTER mechanism - #endif - #endif -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void fs_init(void); - -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); -static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); -static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_fs_fatfs_init(void) -{ - /*---------------------------------------------------- - * Initialize your storage device and File System - * -------------------------------------------------*/ - fs_init(); - - /*--------------------------------------------------- - * Register the file system interface in LVGL - *--------------------------------------------------*/ - - lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->fatfs_fs_drv); - lv_fs_drv_init(fs_drv_p); - - /*Set up fields...*/ - fs_drv_p->letter = LV_FS_FATFS_LETTER; - fs_drv_p->cache_size = LV_FS_FATFS_CACHE_SIZE; - - fs_drv_p->open_cb = fs_open; - fs_drv_p->close_cb = fs_close; - fs_drv_p->read_cb = fs_read; - fs_drv_p->write_cb = fs_write; - fs_drv_p->seek_cb = fs_seek; - fs_drv_p->tell_cb = fs_tell; - - fs_drv_p->dir_close_cb = fs_dir_close; - fs_drv_p->dir_open_cb = fs_dir_open; - fs_drv_p->dir_read_cb = fs_dir_read; - - lv_fs_drv_register(fs_drv_p); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/*Initialize your Storage device and File system.*/ -static void fs_init(void) -{ - /*Initialize the SD card and FatFS itself. - *Better to do it in your code to keep this library untouched for easy updating*/ -} - -/** - * Open a file - * @param drv pointer to a driver where this function belongs - * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) - * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR - * @return pointer to FIL struct or NULL in case of fail - */ -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) -{ - LV_UNUSED(drv); - uint8_t flags = 0; - - if(mode == LV_FS_MODE_WR) flags = FA_WRITE | FA_OPEN_ALWAYS; - else if(mode == LV_FS_MODE_RD) flags = FA_READ; - else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = FA_READ | FA_WRITE | FA_OPEN_ALWAYS; - - FIL * f = lv_malloc(sizeof(FIL)); - if(f == NULL) return NULL; - - FRESULT res = f_open(f, path, flags); - if(res == FR_OK) { - return f; - } - else { - lv_free(f); - return NULL; - } -} - -/** - * Close an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FIL variable. (opened with fs_open) - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) -{ - LV_UNUSED(drv); - f_close(file_p); - lv_free(file_p); - return LV_FS_RES_OK; -} - -/** - * Read data from an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FIL variable. - * @param buf pointer to a memory block where to store the read data - * @param btr number of Bytes To Read - * @param br the real number of read bytes (Byte Read) - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) -{ - LV_UNUSED(drv); - FRESULT res = f_read(file_p, buf, btr, (UINT *)br); - if(res == FR_OK) return LV_FS_RES_OK; - else return LV_FS_RES_UNKNOWN; -} - -/** - * Write into a file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FIL variable - * @param buf pointer to a buffer with the bytes to write - * @param btw Bytes To Write - * @param bw the number of real written bytes (Bytes Written). NULL if unused. - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) -{ - LV_UNUSED(drv); - FRESULT res = f_write(file_p, buf, btw, (UINT *)bw); - if(res == FR_OK) return LV_FS_RES_OK; - else return LV_FS_RES_UNKNOWN; -} - -/** - * Set the read write pointer. Also expand the file size if necessary. - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FIL variable. (opened with fs_open ) - * @param pos the new position of read write pointer - * @param whence only LV_SEEK_SET is supported - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) -{ - LV_UNUSED(drv); - switch(whence) { - case LV_FS_SEEK_SET: - f_lseek(file_p, pos); - break; - case LV_FS_SEEK_CUR: - f_lseek(file_p, f_tell((FIL *)file_p) + pos); - break; - case LV_FS_SEEK_END: - f_lseek(file_p, f_size((FIL *)file_p) + pos); - break; - default: - break; - } - return LV_FS_RES_OK; -} - -/** - * Give the position of the read write pointer - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FIL variable - * @param pos_p pointer to store the result - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) -{ - LV_UNUSED(drv); - *pos_p = f_tell((FIL *)file_p); - return LV_FS_RES_OK; -} - -/** - * Initialize a 'DIR' variable for directory reading - * @param drv pointer to a driver where this function belongs - * @param path path to a directory - * @return pointer to an initialized 'DIR' variable - */ -static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) -{ - LV_UNUSED(drv); - DIR * d = lv_malloc(sizeof(DIR)); - if(d == NULL) return NULL; - - FRESULT res = f_opendir(d, path); - if(res != FR_OK) { - lv_free(d); - d = NULL; - } - return d; -} - -/** - * Read the next filename from a directory. - * The name of the directories will begin with '/' - * @param drv pointer to a driver where this function belongs - * @param dir_p pointer to an initialized 'DIR' variable - * @param fn pointer to a buffer to store the filename - * @param fn_len length of the buffer to store the filename - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) -{ - LV_UNUSED(drv); - if(fn_len == 0) return LV_FS_RES_INV_PARAM; - - FRESULT res; - FILINFO fno; - fn[0] = '\0'; - - do { - res = f_readdir(dir_p, &fno); - if(res != FR_OK) return LV_FS_RES_UNKNOWN; - - if(fno.fname[0] == 0) break; /* End of the directory */ - - if(fno.fattrib & AM_DIR) { - lv_snprintf(fn, fn_len, "/%s", fno.fname); - } - else lv_strlcpy(fn, fno.fname, fn_len); - - } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); - - return LV_FS_RES_OK; -} - -/** - * Close the directory reading - * @param drv pointer to a driver where this function belongs - * @param dir_p pointer to an initialized 'DIR' variable - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) -{ - LV_UNUSED(drv); - f_closedir(dir_p); - lv_free(dir_p); - return LV_FS_RES_OK; -} - -#else /*LV_USE_FS_FATFS == 0*/ - -#if defined(LV_FS_FATFS_LETTER) && LV_FS_FATFS_LETTER != '\0' - #warning "LV_USE_FS_FATFS is not enabled but LV_FS_FATFS_LETTER is set" -#endif - -#endif /*LV_USE_FS_FATFS*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_littlefs.c b/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_littlefs.c deleted file mode 100644 index 490c6fe..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_littlefs.c +++ /dev/null @@ -1,286 +0,0 @@ -#include "../../../lvgl.h" -#if LV_USE_FS_LITTLEFS - -#include "lfs.h" -#include "../../core/lv_global.h" - -#if LV_FS_LITTLEFS_LETTER == '\0' - #error "LV_FS_LITTLEFS_LETTER must be set to a valid value" -#else - #if (LV_FS_LITTLEFS_LETTER < 'A') || (LV_FS_LITTLEFS_LETTER > 'Z') - #if LV_FS_DEFAULT_DRIVE_LETTER != '\0' /*When using default drive letter, strict format (X:) is mandatory*/ - #error "LV_FS_LITTLEFS_LETTER must be an upper case ASCII letter" - #else /*Lean rules for backward compatibility*/ - #warning LV_FS_LITTLEFS_LETTER should be an upper case ASCII letter. \ - Using a slash symbol as drive letter should be replaced with LV_FS_DEFAULT_DRIVE_LETTER mechanism - #endif - #endif -#endif - -typedef struct LittleFile { - lfs_file_t file; -} LittleFile; - -typedef struct LittleDirectory { - lfs_dir_t dir; -} LittleDirectory; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); -static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); -static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); - -void lv_littlefs_set_handler(lfs_t * lfs) -{ - lv_fs_drv_t * drv = lv_fs_get_drv(LV_FS_LITTLEFS_LETTER); - drv->user_data = lfs; -} - -/** - * Register a driver for the LittleFS File System interface - */ -void lv_fs_littlefs_init(void) -{ - lv_fs_drv_t * fs_drv = &(LV_GLOBAL_DEFAULT()->littlefs_fs_drv); - lv_fs_drv_init(fs_drv); - - fs_drv->letter = LV_FS_LITTLEFS_LETTER; - fs_drv->open_cb = fs_open; - fs_drv->close_cb = fs_close; - fs_drv->read_cb = fs_read; - fs_drv->write_cb = fs_write; - fs_drv->seek_cb = fs_seek; - fs_drv->tell_cb = fs_tell; - - fs_drv->dir_open_cb = fs_dir_open; - fs_drv->dir_close_cb = fs_dir_close; - fs_drv->dir_read_cb = fs_dir_read; - - lv_fs_drv_register(fs_drv); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Open a file - * @param drv pointer to a driver where this function belongs - * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) - * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR - * @return a file descriptor or NULL on error - */ -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) -{ - int flags = 0; - if(mode == LV_FS_MODE_WR) - flags = LFS_O_WRONLY; - else if(mode == LV_FS_MODE_RD) - flags = LFS_O_RDONLY; - else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) - flags = LFS_O_RDWR; - - LittleFile * lf = lv_malloc(sizeof(LittleFile)); - LV_ASSERT_MALLOC(lf); - - lfs_t * lfs = drv->user_data; - int err = lfs_file_open(lfs, &lf->file, path, flags); - if(err) { - return NULL; - } - - return (void *)lf; -} - -/** - * Close an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_t variable. (opened with fs_open) - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) -{ - LittleFile * lf = file_p; - - lfs_t * lfs = drv->user_data; - lfs_file_close(lfs, &lf->file); - lv_free(lf); - - return LV_FS_RES_OK; -} - -/** - * Read data from an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_t variable. - * @param buf pointer to a memory block where to store the read data - * @param btr number of Bytes To Read - * @param br the real number of read bytes (Byte Read) - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) -{ - LittleFile * lf = file_p; - - lfs_t * lfs = drv->user_data; - *br = lfs_file_read(lfs, &lf->file, (uint8_t *)buf, btr); - - return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -/** - * Write into a file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_t variable - * @param buf pointer to a buffer with the bytes to write - * @param btw Bytes To Write - * @param bw the number of real written bytes (Bytes Written) - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) -{ - LittleFile * lf = file_p; - - lfs_t * lfs = drv->user_data; - *bw = lfs_file_write(lfs, &lf->file, (uint8_t *)buf, btw); - - return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -/** - * Set the read write pointer. Also expand the file size if necessary. - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_t variable. (opened with fs_open) - * @param pos the new position of read write pointer - * @param whence tells from where to interpret the `pos`. See @lv_fs_whence_t - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) -{ - int mode = 0; - if(whence == LV_FS_SEEK_SET) - mode = LFS_SEEK_SET; - else if(whence == LV_FS_SEEK_CUR) - mode = LFS_SEEK_CUR; - else if(whence == LV_FS_SEEK_END) - mode = LFS_SEEK_END; - - LittleFile * lf = file_p; - - lfs_t * lfs = drv->user_data; - int rc = lfs_file_seek(lfs, &lf->file, pos, mode); - - return rc < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -/** - * Give the position of the read write pointer - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a file_p variable - * @param pos_p pointer to store the result - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) -{ - LittleFile * lf = file_p; - - lfs_t * lfs = drv->user_data; - *pos_p = lfs_file_tell(lfs, &lf->file); - - return (int32_t)(*pos_p) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -/** - * Open a directory - * @param drv pointer to a driver where this function belongs - * @param path path to the directory beginning with the driver letter (e.g. S:/folder) - * @return a directory descriptor or NULL on error - */ -static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) -{ - LittleDirectory * ld = lv_malloc(sizeof(LittleDirectory)); - LV_ASSERT_MALLOC(ld); - - lfs_t * lfs = drv->user_data; - int err = lfs_dir_open(lfs, &ld->dir, path); - if(err != LFS_ERR_OK) { - lv_free(ld); - return NULL; - } - - return (void *)ld; -} - -/** - * Close an opened directory - * @param drv pointer to a driver where this function belongs - * @param dir_p pointer to a dir_p variable. (opened with fs_dir_open) - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) -{ - LittleDirectory * ld = dir_p; - - lfs_t * lfs = drv->user_data; - int rc = lfs_dir_close(lfs, &ld->dir); - - if(rc < 0) return LV_FS_RES_UNKNOWN; - lv_free(ld); - - return LV_FS_RES_OK; -} - -/** - * Read data from an opened directory - * @param drv pointer to a driver where this function belongs - * @param dir_p pointer to a file_t variable. - * @param fn pointer to a buffer to store the filename - * @param fn_len length of the buffer to store the filename - * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum - */ -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) -{ - if(fn_len == 0) return LV_FS_RES_INV_PARAM; - - LittleDirectory * lf = dir_p; - - lfs_t * lfs = drv->user_data; - - fn[0] = '\0'; - do { - struct lfs_info info; - int res = lfs_dir_read(lfs, &lf->dir, &info); - - if(res < 0) return LV_FS_RES_UNKNOWN; - if(res == 0) { /* End of the directory */ - fn[0] = '\0'; - break; - } - - if(info.type != LFS_TYPE_DIR) { - lv_strlcpy(fn, info.name, fn_len); - } - else { - lv_snprintf(fn, fn_len, "/%s", info.name); - } - - } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); - - return LV_FS_RES_OK; -} - -#else /*LV_USE_FS_LITTLEFS == 0*/ - -#if defined(LV_FS_LITTLEFS_LETTER) && LV_FS_LITTLEFS_LETTER != '\0' - #warning "LV_USE_FS_LITTLEFS is not enabled but LV_FS_LITTLEFS_LETTER is set" -#endif - -#endif /*LV_USE_FS_LITTLEFS*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_memfs.c b/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_memfs.c deleted file mode 100644 index c207c76..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_memfs.c +++ /dev/null @@ -1,227 +0,0 @@ -/** - * @file lv_fs_memfs.c - * - * File System Interface driver for memory-mapped files - * - * This driver allows using a memory area as a file that can be read by normal file operations. It can - * be used, e.g., to store font files in slow flash memory, and load them into RAM on demand. - * - * You can enable it in lv_conf.h: - * - * #define LV_USE_FS_MEMFS 1 - * - * The actual implementation uses the built-in cache mechanism of the file system interface. - * - * Since this is not an actual file system, file write and directories are not supported. - * - * The default drive letter is 'M', but this can be changed in lv_conf.h: - * - * #define LV_FS_MEMFS_LETTER 'M' - * - * To use it seamlessly with the file system interface a new extended path object has been introduced: - * - * lv_fs_path_ex_t mempath; - * - * This structure can be initialized with the helper function: - * - * lv_fs_make_path_ex(&mempath, (const uint8_t *) & my_mem_buffer, sizeof(my_mem_buffer)); - * - * Then the "file" can be opened with: - * - * lv_fs_file_t file; - * lv_fs_res_t res = lv_fs_open(&file, (const char *) & mempath, LV_FS_MODE_RD); - * - * The path object can be used at any place where a file path is required, e.g.: - * - * lv_font_t* my_font = lv_binfont_create((const char *) & mempath); - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_fs_private.h" -#include "../../../lvgl.h" -#if LV_USE_FS_MEMFS - -/********************* - * DEFINES - *********************/ -#if LV_FS_MEMFS_LETTER == '\0' - #error "LV_FS_MEMFS_LETTER must be set to a valid value" -#else - #if (LV_FS_MEMFS_LETTER < 'A') || (LV_FS_MEMFS_LETTER > 'Z') - #if LV_FS_DEFAULT_DRIVE_LETTER != '\0' /*When using default drive letter, strict format (X:) is mandatory*/ - #error "LV_FS_MEMFS_LETTER must be an upper case ASCII letter" - #else /*Lean rules for backward compatibility*/ - #warning LV_FS_MEMFS_LETTER should be an upper case ASCII letter. \ - Using a slash symbol as drive letter should be replaced with LV_FS_DEFAULT_DRIVE_LETTER mechanism - #endif - #endif -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** -* STATIC PROTOTYPES -**********************/ - -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); - -/********************** - * STATIC VARIABLES - **********************/ - -static lv_fs_drv_t fs_drv; /*A driver descriptor*/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Register a driver for the File system interface - */ -void lv_fs_memfs_init(void) -{ - /*--------------------------------------------------- - * Register the file system interface in LVGL - *--------------------------------------------------*/ - - lv_fs_drv_init(&fs_drv); - - /*Set up fields...*/ - fs_drv.letter = LV_FS_MEMFS_LETTER; - fs_drv.cache_size = LV_FS_CACHE_FROM_BUFFER; - - fs_drv.open_cb = fs_open; - fs_drv.close_cb = fs_close; - fs_drv.read_cb = fs_read; - fs_drv.write_cb = NULL; - fs_drv.seek_cb = fs_seek; - fs_drv.tell_cb = fs_tell; - - fs_drv.dir_close_cb = NULL; - fs_drv.dir_open_cb = NULL; - fs_drv.dir_read_cb = NULL; - - lv_fs_drv_register(&fs_drv); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Open a file - * @param drv pointer to a driver where this function belongs - * @param path pointer to an extended path object containing the memory buffer address and size - * @param mode read: FS_MODE_RD (currently only reading from the buffer is supported) - * @return pointer to FIL struct or NULL in case of fail - */ -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) -{ - LV_UNUSED(drv); - LV_UNUSED(mode); - return (void *)path; -} - -/** - * Close an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable. (opened with fs_open) - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) -{ - LV_UNUSED(drv); - LV_UNUSED(file_p); - return LV_FS_RES_OK; -} - -/** - * Read data from an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable. - * @param buf pointer to a memory block where to store the read data - * @param btr number of Bytes To Read - * @param br the real number of read bytes (Byte Read) - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) -{ - LV_UNUSED(drv); - LV_UNUSED(file_p); - LV_UNUSED(buf); - LV_UNUSED(btr); - *br = 0; - return LV_FS_RES_OK; -} - -/** - * Set the read pointer. - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable. (opened with fs_open ) - * @param pos the new position of read pointer - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) -{ - /* NOTE: this function is only called to determine the end of the buffer when LV_FS_SEEK_END was given to lv_fs_seek() */ - LV_UNUSED(drv); - lv_fs_file_t * fp = (lv_fs_file_t *)file_p; - switch(whence) { - case LV_FS_SEEK_SET: { - fp->cache->file_position = pos; - break; - } - case LV_FS_SEEK_CUR: { - fp->cache->file_position += pos; - break; - } - case LV_FS_SEEK_END: { - fp->cache->file_position = fp->cache->end - pos; - break; - } - } - if(fp->cache->file_position < fp->cache->start) - fp->cache->file_position = fp->cache->start; - else if(fp->cache->file_position > fp->cache->end) - fp->cache->file_position = fp->cache->end; - return LV_FS_RES_OK; -} - -/** - * Give the position of the read write pointer - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable - * @param pos_p pointer to store the result - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) -{ - LV_UNUSED(drv); - *pos_p = ((lv_fs_file_t *)file_p)->cache->file_position; - return LV_FS_RES_OK; -} - -#else /*LV_USE_FS_MEMFS == 0*/ - -#if defined(LV_FS_MEMFS_LETTER) && LV_FS_MEMFS_LETTER != '\0' - #warning "LV_USE_FS_MEMFS is not enabled but LV_FS_MEMFS_LETTER is set" -#endif - -#endif /*LV_USE_FS_MEMFS*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_posix.c b/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_posix.c deleted file mode 100644 index f1e66fd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_posix.c +++ /dev/null @@ -1,341 +0,0 @@ -/** - * @file lv_fs_posix.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../../lvgl.h" - -#if LV_USE_FS_POSIX - -#include -#include -#include -#include -#include -#include -#include "../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ - -#if LV_FS_POSIX_LETTER == '\0' - #error "LV_FS_POSIX_LETTER must be set to a valid value" -#else - #if (LV_FS_POSIX_LETTER < 'A') || (LV_FS_POSIX_LETTER > 'Z') - #if LV_FS_DEFAULT_DRIVE_LETTER != '\0' /*When using default drive letter, strict format (X:) is mandatory*/ - #error "LV_FS_POSIX_LETTER must be an upper case ASCII letter" - #else /*Lean rules for backward compatibility*/ - #warning LV_FS_POSIX_LETTER should be an upper case ASCII letter. \ - Using a slash symbol as drive letter should be replaced with LV_FS_DEFAULT_DRIVE_LETTER mechanism - #endif - #endif -#endif - -/** The reason for 'fd + 1' is because open() may return a legal fd with a value of 0, - * preventing it from being judged as NULL when converted to a pointer type. - */ -#define FILEP2FD(file_p) ((lv_uintptr_t)file_p - 1) -#define FD2FILEP(fd) ((void *)(lv_uintptr_t)(fd + 1)) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); -static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); -static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Register a driver for the File system interface - */ -void lv_fs_posix_init(void) -{ - /*--------------------------------------------------- - * Register the file system interface in LVGL - *--------------------------------------------------*/ - - lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->posix_fs_drv); - lv_fs_drv_init(fs_drv_p); - - /*Set up fields...*/ - fs_drv_p->letter = LV_FS_POSIX_LETTER; - fs_drv_p->cache_size = LV_FS_POSIX_CACHE_SIZE; - - fs_drv_p->open_cb = fs_open; - fs_drv_p->close_cb = fs_close; - fs_drv_p->read_cb = fs_read; - fs_drv_p->write_cb = fs_write; - fs_drv_p->seek_cb = fs_seek; - fs_drv_p->tell_cb = fs_tell; - - fs_drv_p->dir_close_cb = fs_dir_close; - fs_drv_p->dir_open_cb = fs_dir_open; - fs_drv_p->dir_read_cb = fs_dir_read; - - lv_fs_drv_register(fs_drv_p); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Open a file - * @param drv pointer to a driver where this function belongs - * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) - * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR - * @return a file handle or -1 in case of fail - */ -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) -{ - LV_UNUSED(drv); - - int flags = 0; - if(mode == LV_FS_MODE_WR) flags = O_WRONLY | O_CREAT; - else if(mode == LV_FS_MODE_RD) flags = O_RDONLY; - else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = O_RDWR | O_CREAT; - - /*Make the path relative to the current directory (the projects root folder)*/ - char buf[256]; - lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s", path); - - int fd = open(buf, flags, 0666); - if(fd < 0) { - LV_LOG_WARN("Could not open file: %s, flags: 0x%x, errno: %d", buf, flags, errno); - return NULL; - } - - return FD2FILEP(fd); -} - -/** - * Close an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p a file handle. (opened with fs_open) - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) -{ - LV_UNUSED(drv); - - int fd = FILEP2FD(file_p); - int ret = close(fd); - if(ret < 0) { - LV_LOG_WARN("Could not close file: %d, errno: %d", fd, errno); - return LV_FS_RES_FS_ERR; - } - - return LV_FS_RES_OK; -} - -/** - * Read data from an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p a file handle variable. - * @param buf pointer to a memory block where to store the read data - * @param btr number of Bytes To Read - * @param br the real number of read bytes (Byte Read) - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) -{ - LV_UNUSED(drv); - - int fd = FILEP2FD(file_p); - ssize_t ret = read(fd, buf, btr); - if(ret < 0) { - LV_LOG_WARN("Could not read file: %d, errno: %d", fd, errno); - return LV_FS_RES_FS_ERR; - } - - *br = (uint32_t)ret; - return LV_FS_RES_OK; -} - -/** - * Write into a file - * @param drv pointer to a driver where this function belongs - * @param file_p a file handle variable - * @param buf pointer to a buffer with the bytes to write - * @param btw Bytes To Write - * @param bw the number of real written bytes (Bytes Written). NULL if unused. - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) -{ - LV_UNUSED(drv); - - int fd = FILEP2FD(file_p); - ssize_t ret = write(fd, buf, btw); - if(ret < 0) { - LV_LOG_WARN("Could not write file: %d, errno: %d", fd, errno); - return LV_FS_RES_FS_ERR; - } - - *bw = (uint32_t)ret; - return LV_FS_RES_OK; -} - -/** - * Set the read write pointer. Also expand the file size if necessary. - * @param drv pointer to a driver where this function belongs - * @param file_p a file handle variable. (opened with fs_open ) - * @param pos the new position of read write pointer - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) -{ - LV_UNUSED(drv); - int w; - switch(whence) { - case LV_FS_SEEK_SET: - w = SEEK_SET; - break; - case LV_FS_SEEK_CUR: - w = SEEK_CUR; - break; - case LV_FS_SEEK_END: - w = SEEK_END; - break; - default: - return LV_FS_RES_INV_PARAM; - } - - int fd = FILEP2FD(file_p); - off_t offset = lseek(fd, pos, w); - if(offset < 0) { - LV_LOG_WARN("Could not seek file: %d, errno: %d", fd, errno); - return LV_FS_RES_FS_ERR; - } - - return LV_FS_RES_OK; -} - -/** - * Give the position of the read write pointer - * @param drv pointer to a driver where this function belongs - * @param file_p a file handle variable - * @param pos_p pointer to store the result - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) -{ - LV_UNUSED(drv); - - int fd = FILEP2FD(file_p); - off_t offset = lseek(fd, 0, SEEK_CUR); - if(offset < 0) { - LV_LOG_WARN("Could not get position of file: %d, errno: %d", fd, errno); - return LV_FS_RES_FS_ERR; - } - - *pos_p = (uint32_t)offset; - return LV_FS_RES_OK; -} - -/** - * Initialize a 'fs_read_dir_t' variable for directory reading - * @param drv pointer to a driver where this function belongs - * @param path path to a directory - * @return pointer to an initialized 'DIR' or 'HANDLE' variable - */ -static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) -{ - LV_UNUSED(drv); - - /*Make the path relative to the current directory (the projects root folder)*/ - char buf[256]; - lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s", path); - - void * dir = opendir(buf); - if(!dir) { - LV_LOG_WARN("Could not open directory: %s, errno: %d", buf, errno); - return NULL; - } - - return dir; -} - -/** - * Read the next filename from a directory. - * The name of the directories will begin with '/' - * @param drv pointer to a driver where this function belongs - * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable - * @param fn pointer to a buffer to store the filename - * @param fn_len length of the buffer to store the filename - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) -{ - LV_UNUSED(drv); - if(fn_len == 0) return LV_FS_RES_INV_PARAM; - - struct dirent * entry; - do { - entry = readdir(dir_p); - if(entry) { - if(entry->d_type == DT_DIR) lv_snprintf(fn, fn_len, "/%s", entry->d_name); - else lv_strlcpy(fn, entry->d_name, fn_len); - } - else { - lv_strlcpy(fn, "", fn_len); - } - } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); - - return LV_FS_RES_OK; -} - -/** - * Close the directory reading - * @param drv pointer to a driver where this function belongs - * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) -{ - LV_UNUSED(drv); - - int ret = closedir(dir_p); - if(ret < 0) { - LV_LOG_WARN("Could not close directory: errno: %d", errno); - return LV_FS_RES_FS_ERR; - } - - return LV_FS_RES_OK; -} -#else /*LV_USE_FS_POSIX == 0*/ - -#if defined(LV_FS_POSIX_LETTER) && LV_FS_POSIX_LETTER != '\0' - #warning "LV_USE_FS_POSIX is not enabled but LV_FS_POSIX_LETTER is set" -#endif - -#endif /*LV_USE_FS_POSIX*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_stdio.c b/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_stdio.c deleted file mode 100644 index a6c901e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_stdio.c +++ /dev/null @@ -1,359 +0,0 @@ -/** - * @file lv_fs_stdio.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../../lvgl.h" -#if LV_USE_FS_STDIO != '\0' - -#include -#ifndef WIN32 - #include - #include -#else - #include -#endif - -#include "../../core/lv_global.h" -/********************* - * DEFINES - *********************/ -#if LV_FS_STDIO_LETTER == '\0' - #error "LV_FS_STDIO_LETTER must be set to a valid value" -#else - #if (LV_FS_STDIO_LETTER < 'A') || (LV_FS_STDIO_LETTER > 'Z') - #if LV_FS_DEFAULT_DRIVE_LETTER != '\0' /*When using default drive letter, strict format (X:) is mandatory*/ - #error "LV_FS_STDIO_LETTER must be an upper case ASCII letter" - #else /*Lean rules for backward compatibility*/ - #warning LV_FS_STDIO_LETTER should be an upper case ASCII letter. \ - Using a slash symbol as drive letter should be replaced with LV_FS_DEFAULT_DRIVE_LETTER mechanism - #endif - #endif -#endif - -#define MAX_PATH_LEN 256 - -/********************** - * TYPEDEFS - **********************/ -typedef struct { -#ifdef _WIN32 - HANDLE dir_p; - char next_fn[MAX_PATH_LEN]; -#else - DIR * dir_p; -#endif -} dir_handle_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); -static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); -static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Register a driver for the File system interface - */ -void lv_fs_stdio_init(void) -{ - /*--------------------------------------------------- - * Register the file system interface in LVGL - *--------------------------------------------------*/ - - lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->stdio_fs_drv); - lv_fs_drv_init(fs_drv_p); - - /*Set up fields...*/ - fs_drv_p->letter = LV_FS_STDIO_LETTER; - fs_drv_p->cache_size = LV_FS_STDIO_CACHE_SIZE; - - fs_drv_p->open_cb = fs_open; - fs_drv_p->close_cb = fs_close; - fs_drv_p->read_cb = fs_read; - fs_drv_p->write_cb = fs_write; - fs_drv_p->seek_cb = fs_seek; - fs_drv_p->tell_cb = fs_tell; - - fs_drv_p->dir_close_cb = fs_dir_close; - fs_drv_p->dir_open_cb = fs_dir_open; - fs_drv_p->dir_read_cb = fs_dir_read; - - lv_fs_drv_register(fs_drv_p); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Open a file - * @param drv pointer to a driver where this function belongs - * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) - * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR - * @return pointer to FIL struct or NULL in case of fail - */ -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) -{ - LV_UNUSED(drv); - - const char * flags = ""; - - if(mode == LV_FS_MODE_WR) flags = "wb"; - else if(mode == LV_FS_MODE_RD) flags = "rb"; - else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = "rb+"; - - /*Make the path relative to the current directory (the projects root folder)*/ - - char buf[MAX_PATH_LEN]; - lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s", path); - - return fopen(buf, flags); -} - -/** - * Close an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable. (opened with fs_open) - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) -{ - LV_UNUSED(drv); - fclose(file_p); - return LV_FS_RES_OK; -} - -/** - * Read data from an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable. - * @param buf pointer to a memory block where to store the read data - * @param btr number of Bytes To Read - * @param br the real number of read bytes (Byte Read) - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) -{ - LV_UNUSED(drv); - *br = fread(buf, 1, btr, file_p); - return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -/** - * Write into a file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable - * @param buf pointer to a buffer with the bytes to write - * @param btw Bytes To Write - * @param bw the number of real written bytes (Bytes Written). NULL if unused. - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) -{ - LV_UNUSED(drv); - *bw = fwrite(buf, 1, btw, file_p); - return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -/** - * Set the read write pointer. Also expand the file size if necessary. - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable. (opened with fs_open ) - * @param pos the new position of read write pointer - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) -{ - LV_UNUSED(drv); - int w; - switch(whence) { - case LV_FS_SEEK_SET: - w = SEEK_SET; - break; - case LV_FS_SEEK_CUR: - w = SEEK_CUR; - break; - case LV_FS_SEEK_END: - w = SEEK_END; - break; - default: - return LV_FS_RES_INV_PARAM; - } - - fseek(file_p, pos, w); - return LV_FS_RES_OK; -} - -/** - * Give the position of the read write pointer - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable - * @param pos_p pointer to store the result - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) -{ - LV_UNUSED(drv); - *pos_p = ftell(file_p); - return LV_FS_RES_OK; -} - -/** - * Initialize a 'DIR' or 'HANDLE' variable for directory reading - * @param drv pointer to a driver where this function belongs - * @param path path to a directory - * @return pointer to an initialized 'DIR' or 'HANDLE' variable - */ -static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) -{ - LV_UNUSED(drv); - dir_handle_t * handle = (dir_handle_t *)lv_malloc(sizeof(dir_handle_t)); -#ifndef WIN32 - /*Make the path relative to the current directory (the projects root folder)*/ - char buf[MAX_PATH_LEN]; - lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s", path); - handle->dir_p = opendir(buf); - if(handle->dir_p == NULL) { - lv_free(handle); - return NULL; - } - return handle; -#else - handle->dir_p = INVALID_HANDLE_VALUE; - WIN32_FIND_DATAA fdata; - - /*Make the path relative to the current directory (the projects root folder)*/ - char buf[MAX_PATH_LEN]; - lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s\\*", path); - - lv_strcpy(handle->next_fn, ""); - handle->dir_p = FindFirstFileA(buf, &fdata); - do { - if(lv_strcmp(fdata.cFileName, ".") == 0 || lv_strcmp(fdata.cFileName, "..") == 0) { - continue; - } - else { - if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); - } - else { - lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); - } - break; - } - } while(FindNextFileA(handle->dir_p, &fdata)); - - if(handle->dir_p == INVALID_HANDLE_VALUE) { - lv_free(handle); - return INVALID_HANDLE_VALUE; - } - return handle; -#endif -} - -/** - * Read the next filename form a directory. - * The name of the directories will begin with '/' - * @param drv pointer to a driver where this function belongs - * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable - * @param fn pointer to a buffer to store the filename - * @param fn_len length of the buffer to store the filename - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) -{ - LV_UNUSED(drv); - if(fn_len == 0) return LV_FS_RES_INV_PARAM; - - dir_handle_t * handle = (dir_handle_t *)dir_p; -#ifndef WIN32 - struct dirent * entry; - do { - entry = readdir(handle->dir_p); - if(entry) { - /*Note, DT_DIR is not defined in C99*/ - if(entry->d_type == DT_DIR) lv_snprintf(fn, fn_len, "/%s", entry->d_name); - else lv_strlcpy(fn, entry->d_name, fn_len); - } - else { - lv_strlcpy(fn, "", fn_len); - } - } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); -#else - lv_strlcpy(fn, handle->next_fn, fn_len); - - lv_strcpy(handle->next_fn, ""); - WIN32_FIND_DATAA fdata; - - if(FindNextFileA(handle->dir_p, &fdata) == false) return LV_FS_RES_OK; - do { - if(lv_strcmp(fdata.cFileName, ".") == 0 || lv_strcmp(fdata.cFileName, "..") == 0) { - continue; - } - else { - if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); - } - else { - lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); - } - break; - } - } while(FindNextFileA(handle->dir_p, &fdata)); - -#endif - return LV_FS_RES_OK; -} - -/** - * Close the directory reading - * @param drv pointer to a driver where this function belongs - * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) -{ - LV_UNUSED(drv); - dir_handle_t * handle = (dir_handle_t *)dir_p; -#ifndef WIN32 - closedir(handle->dir_p); -#else - FindClose(handle->dir_p); -#endif - lv_free(handle); - return LV_FS_RES_OK; -} - -#else /*LV_USE_FS_STDIO == 0*/ - -#if defined(LV_FS_STDIO_LETTER) && LV_FS_STDIO_LETTER != '\0' - #warning "LV_USE_FS_STDIO is not enabled but LV_FS_STDIO_LETTER is set" -#endif - -#endif /*LV_USE_FS_POSIX*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_win32.c b/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_win32.c deleted file mode 100644 index d5fb364..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fs_win32.c +++ /dev/null @@ -1,483 +0,0 @@ -/** - * @file lv_fs_win32.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../../lvgl.h" -#if LV_USE_FS_WIN32 != '\0' - -#include -#include -#include - -#include "../../core/lv_global.h" -/********************* - * DEFINES - *********************/ -#if LV_FS_WIN32_LETTER == '\0' - #error "LV_FS_WIN32_LETTER must be set to a valid value" -#else - #if (LV_FS_WIN32_LETTER < 'A') || (LV_FS_WIN32_LETTER > 'Z') - #if LV_FS_DEFAULT_DRIVE_LETTER != '\0' /*When using default drive letter, strict format (X:) is mandatory*/ - #error "LV_FS_WIN32_LETTER must be an upper case ASCII letter" - #else /*Lean rules for backward compatibility*/ - #warning LV_FS_WIN32_LETTER should be an upper case ASCII letter. \ - Using a slash symbol as drive letter should be replaced with LV_FS_DEFAULT_DRIVE_LETTER mechanism - #endif - #endif -#endif - -#define MAX_PATH_LEN 256 - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - HANDLE dir_p; - char next_fn[MAX_PATH_LEN]; - lv_fs_res_t next_error; -} dir_handle_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static bool is_dots_name(const char * name); -static lv_fs_res_t fs_error_from_win32(DWORD error); -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); -static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); -static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Register a driver for the File system interface - */ -void lv_fs_win32_init(void) -{ - /*--------------------------------------------------- - * Register the file system interface in LVGL - *--------------------------------------------------*/ - - /*Add a simple driver to open images*/ - lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->win32_fs_drv); - lv_fs_drv_init(fs_drv_p); - - /*Set up fields...*/ - fs_drv_p->letter = LV_FS_WIN32_LETTER; - fs_drv_p->cache_size = LV_FS_WIN32_CACHE_SIZE; - - fs_drv_p->open_cb = fs_open; - fs_drv_p->close_cb = fs_close; - fs_drv_p->read_cb = fs_read; - fs_drv_p->write_cb = fs_write; - fs_drv_p->seek_cb = fs_seek; - fs_drv_p->tell_cb = fs_tell; - - fs_drv_p->dir_close_cb = fs_dir_close; - fs_drv_p->dir_open_cb = fs_dir_open; - fs_drv_p->dir_read_cb = fs_dir_read; - - lv_fs_drv_register(fs_drv_p); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Check the dots name - * @param name file or dir name - * @return true if the name is dots name - */ -static bool is_dots_name(const char * name) -{ - return name[0] == '.' && (!name[1] || (name[1] == '.' && !name[2])); -} - -/** - * Convert Win32 error code to error from lv_fs_res_t enum - * @param error Win32 error code - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_error_from_win32(DWORD error) -{ - lv_fs_res_t res; - - switch(error) { - case ERROR_SUCCESS: - res = LV_FS_RES_OK; - break; - case ERROR_BAD_UNIT: - case ERROR_NOT_READY: - case ERROR_CRC: - case ERROR_SEEK: - case ERROR_NOT_DOS_DISK: - case ERROR_WRITE_FAULT: - case ERROR_READ_FAULT: - case ERROR_GEN_FAILURE: - case ERROR_WRONG_DISK: - res = LV_FS_RES_HW_ERR; - break; - case ERROR_INVALID_HANDLE: - case ERROR_INVALID_TARGET_HANDLE: - res = LV_FS_RES_FS_ERR; - break; - case ERROR_FILE_NOT_FOUND: - case ERROR_PATH_NOT_FOUND: - case ERROR_INVALID_DRIVE: - case ERROR_NO_MORE_FILES: - case ERROR_SECTOR_NOT_FOUND: - case ERROR_BAD_NETPATH: - case ERROR_BAD_NET_NAME: - case ERROR_BAD_PATHNAME: - case ERROR_FILENAME_EXCED_RANGE: - res = LV_FS_RES_NOT_EX; - break; - case ERROR_DISK_FULL: - res = LV_FS_RES_FULL; - break; - case ERROR_SHARING_VIOLATION: - case ERROR_LOCK_VIOLATION: - case ERROR_DRIVE_LOCKED: - res = LV_FS_RES_LOCKED; - break; - case ERROR_ACCESS_DENIED: - case ERROR_CURRENT_DIRECTORY: - case ERROR_WRITE_PROTECT: - case ERROR_NETWORK_ACCESS_DENIED: - case ERROR_CANNOT_MAKE: - case ERROR_FAIL_I24: - case ERROR_SEEK_ON_DEVICE: - case ERROR_NOT_LOCKED: - case ERROR_LOCK_FAILED: - res = LV_FS_RES_DENIED; - break; - case ERROR_BUSY: - res = LV_FS_RES_BUSY; - break; - case ERROR_TIMEOUT: - res = LV_FS_RES_TOUT; - break; - case ERROR_NOT_SAME_DEVICE: - case ERROR_DIRECT_ACCESS_HANDLE: - res = LV_FS_RES_NOT_IMP; - break; - case ERROR_TOO_MANY_OPEN_FILES: - case ERROR_ARENA_TRASHED: - case ERROR_NOT_ENOUGH_MEMORY: - case ERROR_INVALID_BLOCK: - case ERROR_OUT_OF_PAPER: - case ERROR_SHARING_BUFFER_EXCEEDED: - case ERROR_NOT_ENOUGH_QUOTA: - res = LV_FS_RES_OUT_OF_MEM; - break; - case ERROR_INVALID_FUNCTION: - case ERROR_INVALID_ACCESS: - case ERROR_INVALID_DATA: - case ERROR_BAD_COMMAND: - case ERROR_BAD_LENGTH: - case ERROR_INVALID_PARAMETER: - case ERROR_NEGATIVE_SEEK: - res = LV_FS_RES_INV_PARAM; - break; - default: - res = LV_FS_RES_UNKNOWN; - break; - } - - return res; -} - -/** - * Open a file - * @param drv pointer to a driver where this function belongs - * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) - * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR - * @return pointer to FIL struct or NULL in case of fail - */ -static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) -{ - LV_UNUSED(drv); - - DWORD desired_access = 0; - - if(mode & LV_FS_MODE_RD) { - desired_access |= GENERIC_READ; - } - - if(mode & LV_FS_MODE_WR) { - desired_access |= GENERIC_WRITE; - } - - /*Make the path relative to the current directory (the projects root folder)*/ - - char buf[MAX_PATH]; - lv_snprintf(buf, sizeof(buf), LV_FS_WIN32_PATH "%s", path); - - return (void *)CreateFileA( - buf, - desired_access, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); -} - -/** - * Close an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable. (opened with fs_open) - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) -{ - LV_UNUSED(drv); - return CloseHandle((HANDLE)file_p) - ? LV_FS_RES_OK - : fs_error_from_win32(GetLastError()); -} - -/** - * Read data from an opened file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable. - * @param buf pointer to a memory block where to store the read data - * @param btr number of Bytes To Read - * @param br the real number of read bytes (Byte Read) - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) -{ - LV_UNUSED(drv); - return ReadFile((HANDLE)file_p, buf, btr, (LPDWORD)br, NULL) - ? LV_FS_RES_OK - : fs_error_from_win32(GetLastError()); -} - -/** - * Write into a file - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable - * @param buf pointer to a buffer with the bytes to write - * @param btw Bytes To Write - * @param bw the number of real written bytes (Bytes Written). NULL if unused. - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) -{ - LV_UNUSED(drv); - return WriteFile((HANDLE)file_p, buf, btw, (LPDWORD)bw, NULL) - ? LV_FS_RES_OK - : fs_error_from_win32(GetLastError()); -} - -/** - * Set the read write pointer. Also expand the file size if necessary. - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable. (opened with fs_open ) - * @param pos the new position of read write pointer - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) -{ - LV_UNUSED(drv); - - DWORD move_method = (DWORD) -1; - if(whence == LV_FS_SEEK_SET) { - move_method = FILE_BEGIN; - } - else if(whence == LV_FS_SEEK_CUR) { - move_method = FILE_CURRENT; - } - else if(whence == LV_FS_SEEK_END) { - move_method = FILE_END; - } - - LARGE_INTEGER distance_to_move; - distance_to_move.QuadPart = pos; - return SetFilePointerEx((HANDLE)file_p, distance_to_move, NULL, move_method) - ? LV_FS_RES_OK - : fs_error_from_win32(GetLastError()); -} - -/** - * Give the position of the read write pointer - * @param drv pointer to a driver where this function belongs - * @param file_p pointer to a FILE variable - * @param pos_p pointer to store the result - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) -{ - LV_UNUSED(drv); - - if(!pos_p) { - return LV_FS_RES_INV_PARAM; - } - - LARGE_INTEGER file_pointer; - file_pointer.QuadPart = 0; - - LARGE_INTEGER distance_to_move; - distance_to_move.QuadPart = 0; - if(SetFilePointerEx( - (HANDLE)file_p, - distance_to_move, - &file_pointer, - FILE_CURRENT)) { - if(file_pointer.QuadPart > LONG_MAX) { - return LV_FS_RES_INV_PARAM; - } - else { - *pos_p = file_pointer.LowPart; - return LV_FS_RES_OK; - } - } - else { - return fs_error_from_win32(GetLastError()); - } -} - -/** - * Initialize a 'DIR' or 'HANDLE' variable for directory reading - * @param drv pointer to a driver where this function belongs - * @param path path to a directory - * @return pointer to an initialized 'DIR' or 'HANDLE' variable - */ -static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) -{ - LV_UNUSED(drv); - dir_handle_t * handle = (dir_handle_t *)lv_malloc(sizeof(dir_handle_t)); - handle->dir_p = INVALID_HANDLE_VALUE; - handle->next_error = LV_FS_RES_OK; - WIN32_FIND_DATAA fdata; - - /*Make the path relative to the current directory (the projects root folder)*/ - char buf[MAX_PATH_LEN]; -#ifdef LV_FS_WIN32_PATH - lv_snprintf(buf, sizeof(buf), LV_FS_WIN32_PATH "%s\\*", path); -#else - lv_snprintf(buf, sizeof(buf), "%s\\*", path); -#endif - - lv_strcpy(handle->next_fn, ""); - handle->dir_p = FindFirstFileA(buf, &fdata); - do { - if(is_dots_name(fdata.cFileName)) { - continue; - } - else { - if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); - } - else { - lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); - } - break; - } - } while(FindNextFileA(handle->dir_p, &fdata)); - - if(handle->dir_p == INVALID_HANDLE_VALUE) { - lv_free(handle); - handle->next_error = fs_error_from_win32(GetLastError()); - return INVALID_HANDLE_VALUE; - } - else { - handle->next_error = LV_FS_RES_OK; - return handle; - } -} - -/** - * Read the next filename from a directory. - * The name of the directories will begin with '/' - * @param drv pointer to a driver where this function belongs - * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable - * @param fn pointer to a buffer to store the filename - * @param fn_len length of the buffer to store the filename - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) -{ - LV_UNUSED(drv); - if(fn_len == 0) return LV_FS_RES_INV_PARAM; - - dir_handle_t * handle = (dir_handle_t *)dir_p; - lv_strlcpy(fn, handle->next_fn, fn_len); - lv_fs_res_t current_error = handle->next_error; - lv_strcpy(handle->next_fn, ""); - - WIN32_FIND_DATAA fdata; - - while(FindNextFileA(handle->dir_p, &fdata)) { - if(is_dots_name(fdata.cFileName)) { - continue; - } - else { - if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); - } - else { - lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); - } - break; - } - } - - if(handle->next_fn[0] == '\0') { - handle->next_error = fs_error_from_win32(GetLastError()); - } - - return current_error; -} - -/** - * Close the directory reading - * @param drv pointer to a driver where this function belongs - * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) -{ - LV_UNUSED(drv); - dir_handle_t * handle = (dir_handle_t *)dir_p; - lv_fs_res_t res = FindClose(handle->dir_p) - ? LV_FS_RES_OK - : fs_error_from_win32(GetLastError()); - lv_free(handle); - return res; -} - -#else /*LV_USE_FS_WIN32 == 0*/ - -#if defined(LV_FS_WIN32_LETTER) && LV_FS_WIN32_LETTER != '\0' - #warning "LV_USE_FS_WIN32 is not enabled but LV_FS_WIN32_LETTER is set" -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fsdrv.h b/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fsdrv.h deleted file mode 100644 index f830c3a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/fsdrv/lv_fsdrv.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * @file lv_fsdrv.h - * - */ - -#ifndef LV_FSDRV_H -#define LV_FSDRV_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -#if LV_USE_FS_FATFS -void lv_fs_fatfs_init(void); -#endif - -#if LV_USE_FS_STDIO -void lv_fs_stdio_init(void); -#endif - -#if LV_USE_FS_POSIX -void lv_fs_posix_init(void); -#endif - -#if LV_USE_FS_WIN32 -void lv_fs_win32_init(void); -#endif - -#if LV_USE_FS_MEMFS -void lv_fs_memfs_init(void); -#endif - -#if LV_USE_FS_LITTLEFS -struct lfs; -void lv_littlefs_set_handler(struct lfs *); -void lv_fs_littlefs_init(void); -#endif - -#if LV_USE_FS_ARDUINO_ESP_LITTLEFS -void lv_fs_arduino_esp_littlefs_init(void); -#endif - -#if LV_USE_FS_ARDUINO_SD -void lv_fs_arduino_sd_init(void); -#endif - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_FSDRV_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/gif/gifdec.c b/software/Power_Pico/Middlewares/LVGL/src/libs/gif/gifdec.c deleted file mode 100644 index 3057e03..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/gif/gifdec.c +++ /dev/null @@ -1,822 +0,0 @@ -#include "gifdec.h" -#include "../../misc/lv_log.h" -#include "../../stdlib/lv_mem.h" -#include "../../misc/lv_color.h" -#if LV_USE_GIF - -#include -#include -#include - -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#define MAX(A, B) ((A) > (B) ? (A) : (B)) - -typedef struct Entry { - uint16_t length; - uint16_t prefix; - uint8_t suffix; -} Entry; - -typedef struct Table { - int bulk; - int nentries; - Entry * entries; -} Table; - -#if LV_GIF_CACHE_DECODE_DATA -#define LZW_MAXBITS 12 -#define LZW_TABLE_SIZE (1 << LZW_MAXBITS) -#define LZW_CACHE_SIZE (LZW_TABLE_SIZE * 4) -#endif - -static gd_GIF * gif_open(gd_GIF * gif); -static bool f_gif_open(gd_GIF * gif, const void * path, bool is_file); -static void f_gif_read(gd_GIF * gif, void * buf, size_t len); -static int f_gif_seek(gd_GIF * gif, size_t pos, int k); -static void f_gif_close(gd_GIF * gif); - -#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM - #include "gifdec_mve.h" -#endif - -static uint16_t -read_num(gd_GIF * gif) -{ - uint8_t bytes[2]; - - f_gif_read(gif, bytes, 2); - return bytes[0] + (((uint16_t) bytes[1]) << 8); -} - -gd_GIF * -gd_open_gif_file(const char * fname) -{ - gd_GIF gif_base; - memset(&gif_base, 0, sizeof(gif_base)); - - bool res = f_gif_open(&gif_base, fname, true); - if(!res) return NULL; - - return gif_open(&gif_base); -} - -gd_GIF * -gd_open_gif_data(const void * data) -{ - gd_GIF gif_base; - memset(&gif_base, 0, sizeof(gif_base)); - - bool res = f_gif_open(&gif_base, data, false); - if(!res) return NULL; - - return gif_open(&gif_base); -} - -static gd_GIF * gif_open(gd_GIF * gif_base) -{ - uint8_t sigver[3]; - uint16_t width, height, depth; - uint8_t fdsz, bgidx, aspect; - uint8_t * bgcolor; - int gct_sz; - gd_GIF * gif = NULL; - - /* Header */ - f_gif_read(gif_base, sigver, 3); - if(memcmp(sigver, "GIF", 3) != 0) { - LV_LOG_WARN("invalid signature"); - goto fail; - } - /* Version */ - f_gif_read(gif_base, sigver, 3); - if(memcmp(sigver, "89a", 3) != 0) { - LV_LOG_WARN("invalid version"); - goto fail; - } - /* Width x Height */ - width = read_num(gif_base); - height = read_num(gif_base); - /* FDSZ */ - f_gif_read(gif_base, &fdsz, 1); - /* Presence of GCT */ - if(!(fdsz & 0x80)) { - LV_LOG_WARN("no global color table"); - goto fail; - } - /* Color Space's Depth */ - depth = ((fdsz >> 4) & 7) + 1; - /* Ignore Sort Flag. */ - /* GCT Size */ - gct_sz = 1 << ((fdsz & 0x07) + 1); - /* Background Color Index */ - f_gif_read(gif_base, &bgidx, 1); - /* Aspect Ratio */ - f_gif_read(gif_base, &aspect, 1); - /* Create gd_GIF Structure. */ - if(0 == width || 0 == height){ - LV_LOG_WARN("Zero size image"); - goto fail; - } -#if LV_GIF_CACHE_DECODE_DATA - if(0 == (INT_MAX - sizeof(gd_GIF) - LZW_CACHE_SIZE) / width / height / 5){ - LV_LOG_WARN("Image dimensions are too large"); - goto fail; - } - gif = lv_malloc(sizeof(gd_GIF) + 5 * width * height + LZW_CACHE_SIZE); - #else - if(0 == (INT_MAX - sizeof(gd_GIF)) / width / height / 5){ - LV_LOG_WARN("Image dimensions are too large"); - goto fail; - } - gif = lv_malloc(sizeof(gd_GIF) + 5 * width * height); - #endif - if(!gif) goto fail; - memcpy(gif, gif_base, sizeof(gd_GIF)); - gif->width = width; - gif->height = height; - gif->depth = depth; - /* Read GCT */ - gif->gct.size = gct_sz; - f_gif_read(gif, gif->gct.colors, 3 * gif->gct.size); - gif->palette = &gif->gct; - gif->bgindex = bgidx; - gif->canvas = (uint8_t *) &gif[1]; - gif->frame = &gif->canvas[4 * width * height]; - if(gif->bgindex) { - memset(gif->frame, gif->bgindex, gif->width * gif->height); - } - bgcolor = &gif->palette->colors[gif->bgindex * 3]; - #if LV_GIF_CACHE_DECODE_DATA - gif->lzw_cache = gif->frame + width * height; - #endif - -#ifdef GIFDEC_FILL_BG - GIFDEC_FILL_BG(gif->canvas, gif->width * gif->height, 1, gif->width * gif->height, bgcolor, 0xff); -#else - for(int i = 0; i < gif->width * gif->height; i++) { - gif->canvas[i * 4 + 0] = *(bgcolor + 2); - gif->canvas[i * 4 + 1] = *(bgcolor + 1); - gif->canvas[i * 4 + 2] = *(bgcolor + 0); - gif->canvas[i * 4 + 3] = 0xff; - } -#endif - gif->anim_start = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); - gif->loop_count = -1; - goto ok; -fail: - f_gif_close(gif_base); -ok: - return gif; -} - -static void -discard_sub_blocks(gd_GIF * gif) -{ - uint8_t size; - - do { - f_gif_read(gif, &size, 1); - f_gif_seek(gif, size, LV_FS_SEEK_CUR); - } while(size); -} - -static void -read_plain_text_ext(gd_GIF * gif) -{ - if(gif->plain_text) { - uint16_t tx, ty, tw, th; - uint8_t cw, ch, fg, bg; - size_t sub_block; - f_gif_seek(gif, 1, LV_FS_SEEK_CUR); /* block size = 12 */ - tx = read_num(gif); - ty = read_num(gif); - tw = read_num(gif); - th = read_num(gif); - f_gif_read(gif, &cw, 1); - f_gif_read(gif, &ch, 1); - f_gif_read(gif, &fg, 1); - f_gif_read(gif, &bg, 1); - sub_block = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); - gif->plain_text(gif, tx, ty, tw, th, cw, ch, fg, bg); - f_gif_seek(gif, sub_block, LV_FS_SEEK_SET); - } - else { - /* Discard plain text metadata. */ - f_gif_seek(gif, 13, LV_FS_SEEK_CUR); - } - /* Discard plain text sub-blocks. */ - discard_sub_blocks(gif); -} - -static void -read_graphic_control_ext(gd_GIF * gif) -{ - uint8_t rdit; - - /* Discard block size (always 0x04). */ - f_gif_seek(gif, 1, LV_FS_SEEK_CUR); - f_gif_read(gif, &rdit, 1); - gif->gce.disposal = (rdit >> 2) & 3; - gif->gce.input = rdit & 2; - gif->gce.transparency = rdit & 1; - gif->gce.delay = read_num(gif); - f_gif_read(gif, &gif->gce.tindex, 1); - /* Skip block terminator. */ - f_gif_seek(gif, 1, LV_FS_SEEK_CUR); -} - -static void -read_comment_ext(gd_GIF * gif) -{ - if(gif->comment) { - size_t sub_block = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); - gif->comment(gif); - f_gif_seek(gif, sub_block, LV_FS_SEEK_SET); - } - /* Discard comment sub-blocks. */ - discard_sub_blocks(gif); -} - -static void -read_application_ext(gd_GIF * gif) -{ - char app_id[8]; - char app_auth_code[3]; - uint16_t loop_count; - - /* Discard block size (always 0x0B). */ - f_gif_seek(gif, 1, LV_FS_SEEK_CUR); - /* Application Identifier. */ - f_gif_read(gif, app_id, 8); - /* Application Authentication Code. */ - f_gif_read(gif, app_auth_code, 3); - if(!strncmp(app_id, "NETSCAPE", sizeof(app_id))) { - /* Discard block size (0x03) and constant byte (0x01). */ - f_gif_seek(gif, 2, LV_FS_SEEK_CUR); - loop_count = read_num(gif); - if(gif->loop_count < 0) { - if(loop_count == 0) { - gif->loop_count = 0; - } - else { - gif->loop_count = loop_count + 1; - } - } - /* Skip block terminator. */ - f_gif_seek(gif, 1, LV_FS_SEEK_CUR); - } - else if(gif->application) { - size_t sub_block = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); - gif->application(gif, app_id, app_auth_code); - f_gif_seek(gif, sub_block, LV_FS_SEEK_SET); - discard_sub_blocks(gif); - } - else { - discard_sub_blocks(gif); - } -} - -static void -read_ext(gd_GIF * gif) -{ - uint8_t label; - - f_gif_read(gif, &label, 1); - switch(label) { - case 0x01: - read_plain_text_ext(gif); - break; - case 0xF9: - read_graphic_control_ext(gif); - break; - case 0xFE: - read_comment_ext(gif); - break; - case 0xFF: - read_application_ext(gif); - break; - default: - LV_LOG_WARN("unknown extension: %02X\n", label); - } -} - -static uint16_t -get_key(gd_GIF *gif, int key_size, uint8_t *sub_len, uint8_t *shift, uint8_t *byte) -{ - int bits_read; - int rpad; - int frag_size; - uint16_t key; - - key = 0; - for (bits_read = 0; bits_read < key_size; bits_read += frag_size) { - rpad = (*shift + bits_read) % 8; - if (rpad == 0) { - /* Update byte. */ - if (*sub_len == 0) { - f_gif_read(gif, sub_len, 1); /* Must be nonzero! */ - if (*sub_len == 0) return 0x1000; - } - f_gif_read(gif, byte, 1); - (*sub_len)--; - } - frag_size = MIN(key_size - bits_read, 8 - rpad); - key |= ((uint16_t) ((*byte) >> rpad)) << bits_read; - } - /* Clear extra bits to the left. */ - key &= (1 << key_size) - 1; - *shift = (*shift + key_size) % 8; - return key; -} - -#if LV_GIF_CACHE_DECODE_DATA -/* Decompress image pixels. - * Return 0 on success or -1 on out-of-memory (w.r.t. LZW code table) or parse error. */ -static int -read_image_data(gd_GIF *gif, int interlace) -{ - uint8_t sub_len, shift, byte; - int ret = 0; - int key_size; - int y, pass, linesize; - uint8_t *ptr = NULL; - uint8_t *ptr_row_start = NULL; - uint8_t *ptr_base = NULL; - size_t start, end; - uint16_t key, clear_code, stop_code, curr_code; - int frm_off, frm_size,curr_size,top_slot,new_codes,slot; - /* The first value of the value sequence corresponding to key */ - int first_value; - int last_key; - uint8_t *sp = NULL; - uint8_t *p_stack = NULL; - uint8_t *p_suffix = NULL; - uint16_t *p_prefix = NULL; - - /* get initial key size and clear code, stop code */ - f_gif_read(gif, &byte, 1); - key_size = (int) byte; - clear_code = 1 << key_size; - stop_code = clear_code + 1; - key = 0; - - start = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); - discard_sub_blocks(gif); - end = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); - f_gif_seek(gif, start, LV_FS_SEEK_SET); - - linesize = gif->width; - ptr_base = &gif->frame[gif->fy * linesize + gif->fx]; - ptr_row_start = ptr_base; - ptr = ptr_row_start; - sub_len = shift = 0; - /* decoder */ - pass = 0; - y = 0; - p_stack = gif->lzw_cache; - p_suffix = gif->lzw_cache + LZW_TABLE_SIZE; - p_prefix = (uint16_t*)(gif->lzw_cache + LZW_TABLE_SIZE * 2); - frm_off = 0; - frm_size = gif->fw * gif->fh; - curr_size = key_size + 1; - top_slot = 1 << curr_size; - new_codes = clear_code + 2; - slot = new_codes; - first_value = -1; - last_key = -1; - sp = p_stack; - - while (frm_off < frm_size) { - /* copy data to frame buffer */ - while (sp > p_stack) { - if(frm_off >= frm_size){ - LV_LOG_WARN("LZW table token overflows the frame buffer"); - return -1; - } - *ptr++ = *(--sp); - frm_off += 1; - /* read one line */ - if ((ptr - ptr_row_start) == gif->fw) { - if (interlace) { - switch(pass) { - case 0: - case 1: - y += 8; - ptr_row_start += linesize * 8; - break; - case 2: - y += 4; - ptr_row_start += linesize * 4; - break; - case 3: - y += 2; - ptr_row_start += linesize * 2; - break; - default: - break; - } - while (y >= gif->fh) { - y = 4 >> pass; - ptr_row_start = ptr_base + linesize * y; - pass++; - } - } else { - ptr_row_start += linesize; - } - ptr = ptr_row_start; - } - } - - key = get_key(gif, curr_size, &sub_len, &shift, &byte); - - if (key == stop_code || key >= LZW_TABLE_SIZE) - break; - - if (key == clear_code) { - curr_size = key_size + 1; - slot = new_codes; - top_slot = 1 << curr_size; - first_value = last_key = -1; - sp = p_stack; - continue; - } - - curr_code = key; - /* - * If the current code is a code that will be added to the decoding - * dictionary, it is composed of the data list corresponding to the - * previous key and its first data. - * */ - if (curr_code == slot && first_value >= 0) { - *sp++ = first_value; - curr_code = last_key; - }else if(curr_code >= slot) - break; - - while (curr_code >= new_codes) { - *sp++ = p_suffix[curr_code]; - curr_code = p_prefix[curr_code]; - } - *sp++ = curr_code; - - /* Add code to decoding dictionary */ - if (slot < top_slot && last_key >= 0) { - p_suffix[slot] = curr_code; - p_prefix[slot++] = last_key; - } - first_value = curr_code; - last_key = key; - if (slot >= top_slot) { - if (curr_size < LZW_MAXBITS) { - top_slot <<= 1; - curr_size += 1; - } - } - } - - if (key == stop_code) f_gif_read(gif, &sub_len, 1); /* Must be zero! */ - f_gif_seek(gif, end, LV_FS_SEEK_SET); - return ret; -} -#else -static Table * -new_table(int key_size) -{ - int key; - int init_bulk = MAX(1 << (key_size + 1), 0x100); - Table * table = lv_malloc(sizeof(*table) + sizeof(Entry) * init_bulk); - if(table) { - table->bulk = init_bulk; - table->nentries = (1 << key_size) + 2; - table->entries = (Entry *) &table[1]; - for(key = 0; key < (1 << key_size); key++) - table->entries[key] = (Entry) { - 1, 0xFFF, key - }; - } - return table; -} - -/* Add table entry. Return value: - * 0 on success - * +1 if key size must be incremented after this addition - * -1 if could not realloc table */ -static int -add_entry(Table ** tablep, uint16_t length, uint16_t prefix, uint8_t suffix) -{ - Table * table = *tablep; - if(table->nentries == table->bulk) { - table->bulk *= 2; - table = lv_realloc(table, sizeof(*table) + sizeof(Entry) * table->bulk); - if(!table) return -1; - table->entries = (Entry *) &table[1]; - *tablep = table; - } - table->entries[table->nentries] = (Entry) { - length, prefix, suffix - }; - table->nentries++; - if((table->nentries & (table->nentries - 1)) == 0) - return 1; - return 0; -} - -/* Compute output index of y-th input line, in frame of height h. */ -static int -interlaced_line_index(int h, int y) -{ - int p; /* number of lines in current pass */ - - p = (h - 1) / 8 + 1; - if(y < p) /* pass 1 */ - return y * 8; - y -= p; - p = (h - 5) / 8 + 1; - if(y < p) /* pass 2 */ - return y * 8 + 4; - y -= p; - p = (h - 3) / 4 + 1; - if(y < p) /* pass 3 */ - return y * 4 + 2; - y -= p; - /* pass 4 */ - return y * 2 + 1; -} - -/* Decompress image pixels. - * Return 0 on success or -1 on out-of-memory (w.r.t. LZW code table) or parse error. */ -static int -read_image_data(gd_GIF * gif, int interlace) -{ - uint8_t sub_len, shift, byte; - int init_key_size, key_size, table_is_full = 0; - int frm_off, frm_size, str_len = 0, i, p, x, y; - uint16_t key, clear, stop; - int ret; - Table * table; - Entry entry = {0}; - size_t start, end; - - f_gif_read(gif, &byte, 1); - key_size = (int) byte; - start = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); - discard_sub_blocks(gif); - end = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); - f_gif_seek(gif, start, LV_FS_SEEK_SET); - clear = 1 << key_size; - stop = clear + 1; - table = new_table(key_size); - key_size++; - init_key_size = key_size; - sub_len = shift = 0; - key = get_key(gif, key_size, &sub_len, &shift, &byte); /* clear code */ - frm_off = 0; - ret = 0; - frm_size = gif->fw * gif->fh; - while(frm_off < frm_size) { - if(key == clear) { - key_size = init_key_size; - table->nentries = (1 << (key_size - 1)) + 2; - table_is_full = 0; - } - else if(!table_is_full) { - ret = add_entry(&table, str_len + 1, key, entry.suffix); - if(ret == -1) { - lv_free(table); - return -1; - } - if(table->nentries == 0x1000) { - ret = 0; - table_is_full = 1; - } - } - key = get_key(gif, key_size, &sub_len, &shift, &byte); - if(key == clear) continue; - if(key == stop || key == 0x1000) break; - if(ret == 1) key_size++; - entry = table->entries[key]; - str_len = entry.length; - if(frm_off + str_len > frm_size){ - LV_LOG_WARN("LZW table token overflows the frame buffer"); - return -1; - } - for(i = 0; i < str_len; i++) { - p = frm_off + entry.length - 1; - x = p % gif->fw; - y = p / gif->fw; - if(interlace) - y = interlaced_line_index((int) gif->fh, y); - gif->frame[(gif->fy + y) * gif->width + gif->fx + x] = entry.suffix; - if(entry.prefix == 0xFFF) - break; - else - entry = table->entries[entry.prefix]; - } - frm_off += str_len; - if(key < table->nentries - 1 && !table_is_full) - table->entries[table->nentries - 1].suffix = entry.suffix; - } - lv_free(table); - if(key == stop) f_gif_read(gif, &sub_len, 1); /* Must be zero! */ - f_gif_seek(gif, end, LV_FS_SEEK_SET); - return 0; -} - -#endif - -/* Read image. - * Return 0 on success or -1 on out-of-memory (w.r.t. LZW code table) or parse error. */ -static int -read_image(gd_GIF * gif) -{ - uint8_t fisrz; - int interlace; - - /* Image Descriptor. */ - gif->fx = read_num(gif); - gif->fy = read_num(gif); - gif->fw = read_num(gif); - gif->fh = read_num(gif); - if(gif->fx + (uint32_t)gif->fw > gif->width || gif->fy + (uint32_t)gif->fh > gif->height){ - LV_LOG_WARN("Frame coordinates out of image bounds"); - return -1; - } - f_gif_read(gif, &fisrz, 1); - interlace = fisrz & 0x40; - /* Ignore Sort Flag. */ - /* Local Color Table? */ - if(fisrz & 0x80) { - /* Read LCT */ - gif->lct.size = 1 << ((fisrz & 0x07) + 1); - f_gif_read(gif, gif->lct.colors, 3 * gif->lct.size); - gif->palette = &gif->lct; - } - else - gif->palette = &gif->gct; - /* Image Data. */ - return read_image_data(gif, interlace); -} - -static void -render_frame_rect(gd_GIF * gif, uint8_t * buffer) -{ - int i = gif->fy * gif->width + gif->fx; -#ifdef GIFDEC_RENDER_FRAME - GIFDEC_RENDER_FRAME(&buffer[i * 4], gif->fw, gif->fh, gif->width, - &gif->frame[i], gif->palette->colors, - gif->gce.transparency ? gif->gce.tindex : 0x100); -#else - int j, k; - uint8_t index, * color; - - for(j = 0; j < gif->fh; j++) { - for(k = 0; k < gif->fw; k++) { - index = gif->frame[(gif->fy + j) * gif->width + gif->fx + k]; - color = &gif->palette->colors[index * 3]; - if(!gif->gce.transparency || index != gif->gce.tindex) { - buffer[(i + k) * 4 + 0] = *(color + 2); - buffer[(i + k) * 4 + 1] = *(color + 1); - buffer[(i + k) * 4 + 2] = *(color + 0); - buffer[(i + k) * 4 + 3] = 0xFF; - } - } - i += gif->width; - } -#endif -} - -static void -dispose(gd_GIF * gif) -{ - int i; - uint8_t * bgcolor; - switch(gif->gce.disposal) { - case 2: /* Restore to background color. */ - bgcolor = &gif->palette->colors[gif->bgindex * 3]; - - uint8_t opa = 0xff; - if(gif->gce.transparency) opa = 0x00; - - i = gif->fy * gif->width + gif->fx; -#ifdef GIFDEC_FILL_BG - GIFDEC_FILL_BG(&(gif->canvas[i * 4]), gif->fw, gif->fh, gif->width, bgcolor, opa); -#else - int j, k; - for(j = 0; j < gif->fh; j++) { - for(k = 0; k < gif->fw; k++) { - gif->canvas[(i + k) * 4 + 0] = *(bgcolor + 2); - gif->canvas[(i + k) * 4 + 1] = *(bgcolor + 1); - gif->canvas[(i + k) * 4 + 2] = *(bgcolor + 0); - gif->canvas[(i + k) * 4 + 3] = opa; - } - i += gif->width; - } -#endif - break; - case 3: /* Restore to previous, i.e., don't update canvas.*/ - break; - default: - /* Add frame non-transparent pixels to canvas. */ - render_frame_rect(gif, gif->canvas); - } -} - -/* Return 1 if got a frame; 0 if got GIF trailer; -1 if error. */ -int -gd_get_frame(gd_GIF * gif) -{ - char sep; - - dispose(gif); - f_gif_read(gif, &sep, 1); - while(sep != ',') { - if(sep == ';') { - f_gif_seek(gif, gif->anim_start, LV_FS_SEEK_SET); - if(gif->loop_count == 1 || gif->loop_count < 0) { - return 0; - } - else if(gif->loop_count > 1) { - gif->loop_count--; - } - } - else if(sep == '!') - read_ext(gif); - else return -1; - f_gif_read(gif, &sep, 1); - } - if(read_image(gif) == -1) - return -1; - return 1; -} - -void -gd_render_frame(gd_GIF * gif, uint8_t * buffer) -{ - render_frame_rect(gif, buffer); -} - -void -gd_rewind(gd_GIF * gif) -{ - gif->loop_count = -1; - f_gif_seek(gif, gif->anim_start, LV_FS_SEEK_SET); -} - -void -gd_close_gif(gd_GIF * gif) -{ - f_gif_close(gif); - lv_free(gif); -} - -static bool f_gif_open(gd_GIF * gif, const void * path, bool is_file) -{ - gif->f_rw_p = 0; - gif->data = NULL; - gif->is_file = is_file; - - if(is_file) { - lv_fs_res_t res = lv_fs_open(&gif->fd, path, LV_FS_MODE_RD); - if(res != LV_FS_RES_OK) return false; - else return true; - } - else { - gif->data = path; - return true; - } -} - -static void f_gif_read(gd_GIF * gif, void * buf, size_t len) -{ - if(gif->is_file) { - lv_fs_read(&gif->fd, buf, len, NULL); - } - else { - memcpy(buf, &gif->data[gif->f_rw_p], len); - gif->f_rw_p += len; - } -} - -static int f_gif_seek(gd_GIF * gif, size_t pos, int k) -{ - if(gif->is_file) { - lv_fs_seek(&gif->fd, pos, k); - uint32_t x; - lv_fs_tell(&gif->fd, &x); - return x; - } - else { - if(k == LV_FS_SEEK_CUR) gif->f_rw_p += pos; - else if(k == LV_FS_SEEK_SET) gif->f_rw_p = pos; - return gif->f_rw_p; - } -} - -static void f_gif_close(gd_GIF * gif) -{ - if(gif->is_file) { - lv_fs_close(&gif->fd); - } -} - -#endif /*LV_USE_GIF*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/gif/gifdec.h b/software/Power_Pico/Middlewares/LVGL/src/libs/gif/gifdec.h deleted file mode 100644 index 21ff210..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/gif/gifdec.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef GIFDEC_H -#define GIFDEC_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../../misc/lv_fs.h" - -#if LV_USE_GIF -#include - -typedef struct _gd_Palette { - int size; - uint8_t colors[0x100 * 3]; -} gd_Palette; - -typedef struct _gd_GCE { - uint16_t delay; - uint8_t tindex; - uint8_t disposal; - int input; - int transparency; -} gd_GCE; - - - -typedef struct _gd_GIF { - lv_fs_file_t fd; - const char * data; - uint8_t is_file; - uint32_t f_rw_p; - int32_t anim_start; - uint16_t width, height; - uint16_t depth; - int32_t loop_count; - gd_GCE gce; - gd_Palette * palette; - gd_Palette lct, gct; - void (*plain_text)( - struct _gd_GIF * gif, uint16_t tx, uint16_t ty, - uint16_t tw, uint16_t th, uint8_t cw, uint8_t ch, - uint8_t fg, uint8_t bg - ); - void (*comment)(struct _gd_GIF * gif); - void (*application)(struct _gd_GIF * gif, char id[8], char auth[3]); - uint16_t fx, fy, fw, fh; - uint8_t bgindex; - uint8_t * canvas, * frame; - #if LV_GIF_CACHE_DECODE_DATA - uint8_t *lzw_cache; - #endif -} gd_GIF; - -gd_GIF * gd_open_gif_file(const char * fname); - -gd_GIF * gd_open_gif_data(const void * data); - -void gd_render_frame(gd_GIF * gif, uint8_t * buffer); - -int gd_get_frame(gd_GIF * gif); -void gd_rewind(gd_GIF * gif); -void gd_close_gif(gd_GIF * gif); - -#endif /*LV_USE_GIF*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* GIFDEC_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/gif/gifdec_mve.h b/software/Power_Pico/Middlewares/LVGL/src/libs/gif/gifdec_mve.h deleted file mode 100644 index 6d83393..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/gif/gifdec_mve.h +++ /dev/null @@ -1,140 +0,0 @@ -/** - * @file gifdec_mve.h - * - */ - -#ifndef GIFDEC_MVE_H -#define GIFDEC_MVE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include -#include "../../misc/lv_color.h" - -/********************* - * DEFINES - *********************/ - -#define GIFDEC_FILL_BG(dst, w, h, stride, color, opa) \ - _gifdec_fill_bg_mve(dst, w, h, stride, color, opa) - -#define GIFDEC_RENDER_FRAME(dst, w, h, stride, frame, pattern, tindex) \ - _gifdec_render_frame_mve(dst, w, h, stride, frame, pattern, tindex) - -/********************** - * MACROS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -static inline void _gifdec_fill_bg_mve(uint8_t * dst, uint16_t w, uint16_t h, uint16_t stride, uint8_t * color, - uint8_t opa) -{ - lv_color32_t c = lv_color32_make(*(color + 0), *(color + 1), *(color + 2), opa); - uint32_t color_32 = *(uint32_t *)&c; - - __asm volatile( - ".p2align 2 \n" - "vdup.32 q0, %[src] \n" - "3: \n" - "mov r0, %[dst] \n" - - "wlstp.32 lr, %[w], 1f \n" - "2: \n" - - "vstrw.32 q0, [r0], #16 \n" - "letp lr, 2b \n" - "1: \n" - "add %[dst], %[iTargetStride] \n" - "subs %[h], #1 \n" - "bne 3b \n" - : [dst] "+r"(dst), - [h] "+r"(h) - : [src] "r"(color_32), - [w] "r"(w), - [iTargetStride] "r"(stride * sizeof(uint32_t)) - : "r0", "q0", "memory", "r14", "cc"); -} - -static inline void _gifdec_render_frame_mve(uint8_t * dst, uint16_t w, uint16_t h, uint16_t stride, uint8_t * frame, - uint8_t * pattern, uint16_t tindex) -{ - if(w == 0 || h == 0) { - return; - } - - __asm volatile( - "vmov.u16 q3, #255 \n" - "vshl.u16 q3, q3, #8 \n" /* left shift 8 for a*/ - - "mov r0, #2 \n" - "vidup.u16 q6, r0, #4 \n" /* [2, 6, 10, 14, 18, 22, 26, 30] */ - "mov r0, #0 \n" - "vidup.u16 q7, r0, #4 \n" /* [0, 4, 8, 12, 16, 20, 24, 28] */ - - "3: \n" - "mov r1, %[dst] \n" - "mov r2, %[frame] \n" - - "wlstp.16 lr, %[w], 1f \n" - "2: \n" - - "mov r0, #3 \n" - "vldrb.u16 q4, [r2], #8 \n" - "vmul.u16 q5, q4, r0 \n" - - "mov r0, #1 \n" - "vldrb.u16 q2, [%[pattern], q5] \n" /* load 8 pixel r*/ - - "vadd.u16 q5, q5, r0 \n" - "vldrb.u16 q1, [%[pattern], q5] \n" /* load 8 pixel g*/ - - "vadd.u16 q5, q5, r0 \n" - "vldrb.u16 q0, [%[pattern], q5] \n" /* load 8 pixel b*/ - - "vshl.u16 q1, q1, #8 \n" /* left shift 8 for g*/ - - "vorr.u16 q0, q0, q1 \n" /* make 8 pixel gb*/ - "vorr.u16 q1, q2, q3 \n" /* make 8 pixel ar*/ - - "vcmp.i16 ne, q4, %[tindex] \n" - "vpstt \n" - "vstrht.16 q0, [r1, q7] \n" - "vstrht.16 q1, [r1, q6] \n" - "add r1, r1, #32 \n" - - "letp lr, 2b \n" - - "1: \n" - "mov r0, %[stride], LSL #2 \n" - "add %[dst], r0 \n" - "add %[frame], %[stride] \n" - "subs %[h], #1 \n" - "bne 3b \n" - - : [dst] "+r"(dst), - [frame] "+r"(frame), - [h] "+r"(h) - : [pattern] "r"(pattern), - [w] "r"(w), - [stride] "r"(stride), - [tindex] "r"(tindex) - : "r0", "r1", "r2", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "memory", "r14", "cc"); -} - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*GIFDEC_MVE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/gif/lv_gif.c b/software/Power_Pico/Middlewares/LVGL/src/libs/gif/lv_gif.c deleted file mode 100644 index 920f776..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/gif/lv_gif.c +++ /dev/null @@ -1,220 +0,0 @@ -/** - * @file lv_gifenc.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_timer_private.h" -#include "../../core/lv_obj_class_private.h" -#include "lv_gif_private.h" -#if LV_USE_GIF - -#include "gifdec.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_gif_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_gif_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_gif_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void next_frame_task_cb(lv_timer_t * t); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_gif_class = { - .constructor_cb = lv_gif_constructor, - .destructor_cb = lv_gif_destructor, - .instance_size = sizeof(lv_gif_t), - .base_class = &lv_image_class, - .name = "gif", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_gif_create(lv_obj_t * parent) -{ - - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -void lv_gif_set_src(lv_obj_t * obj, const void * src) -{ - lv_gif_t * gifobj = (lv_gif_t *) obj; - gd_GIF * gif = gifobj->gif; - - /*Close previous gif if any*/ - if(gif != NULL) { - lv_image_cache_drop(lv_image_get_src(obj)); - - gd_close_gif(gif); - gifobj->gif = NULL; - gifobj->imgdsc.data = NULL; - } - - if(lv_image_src_get_type(src) == LV_IMAGE_SRC_VARIABLE) { - const lv_image_dsc_t * img_dsc = src; - gif = gd_open_gif_data(img_dsc->data); - } - else if(lv_image_src_get_type(src) == LV_IMAGE_SRC_FILE) { - gif = gd_open_gif_file(src); - } - if(gif == NULL) { - LV_LOG_WARN("Couldn't load the source"); - return; - } - - gifobj->gif = gif; - gifobj->imgdsc.data = gif->canvas; - gifobj->imgdsc.header.magic = LV_IMAGE_HEADER_MAGIC; - gifobj->imgdsc.header.flags = LV_IMAGE_FLAGS_MODIFIABLE; - gifobj->imgdsc.header.cf = LV_COLOR_FORMAT_ARGB8888; - gifobj->imgdsc.header.h = gif->height; - gifobj->imgdsc.header.w = gif->width; - gifobj->imgdsc.header.stride = gif->width * 4; - gifobj->imgdsc.data_size = gif->width * gif->height * 4; - - gifobj->last_call = lv_tick_get(); - - lv_image_set_src(obj, &gifobj->imgdsc); - - lv_timer_resume(gifobj->timer); - lv_timer_reset(gifobj->timer); - - next_frame_task_cb(gifobj->timer); - -} - -void lv_gif_restart(lv_obj_t * obj) -{ - lv_gif_t * gifobj = (lv_gif_t *) obj; - - if(gifobj->gif == NULL) { - LV_LOG_WARN("Gif resource not loaded correctly"); - return; - } - - gd_rewind(gifobj->gif); - lv_timer_resume(gifobj->timer); - lv_timer_reset(gifobj->timer); -} - -void lv_gif_pause(lv_obj_t * obj) -{ - lv_gif_t * gifobj = (lv_gif_t *) obj; - lv_timer_pause(gifobj->timer); -} - -void lv_gif_resume(lv_obj_t * obj) -{ - lv_gif_t * gifobj = (lv_gif_t *) obj; - - if(gifobj->gif == NULL) { - LV_LOG_WARN("Gif resource not loaded correctly"); - return; - } - - lv_timer_resume(gifobj->timer); -} - -bool lv_gif_is_loaded(lv_obj_t * obj) -{ - lv_gif_t * gifobj = (lv_gif_t *) obj; - - return (gifobj->gif != NULL); -} - -int32_t lv_gif_get_loop_count(lv_obj_t * obj) -{ - lv_gif_t * gifobj = (lv_gif_t *) obj; - - if(gifobj->gif == NULL) { - return -1; - } - - return gifobj->gif->loop_count; -} - -void lv_gif_set_loop_count(lv_obj_t * obj, int32_t count) -{ - lv_gif_t * gifobj = (lv_gif_t *) obj; - - if(gifobj->gif == NULL) { - LV_LOG_WARN("Gif resource not loaded correctly"); - return; - } - - gifobj->gif->loop_count = count; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_gif_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - - lv_gif_t * gifobj = (lv_gif_t *) obj; - - gifobj->gif = NULL; - gifobj->timer = lv_timer_create(next_frame_task_cb, 10, obj); - lv_timer_pause(gifobj->timer); -} - -static void lv_gif_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_gif_t * gifobj = (lv_gif_t *) obj; - - lv_image_cache_drop(lv_image_get_src(obj)); - - if(gifobj->gif) - gd_close_gif(gifobj->gif); - lv_timer_delete(gifobj->timer); -} - -static void next_frame_task_cb(lv_timer_t * t) -{ - lv_obj_t * obj = t->user_data; - lv_gif_t * gifobj = (lv_gif_t *) obj; - uint32_t elaps = lv_tick_elaps(gifobj->last_call); - if(elaps < gifobj->gif->gce.delay * 10) return; - - gifobj->last_call = lv_tick_get(); - - int has_next = gd_get_frame(gifobj->gif); - if(has_next == 0) { - /*It was the last repeat*/ - lv_result_t res = lv_obj_send_event(obj, LV_EVENT_READY, NULL); - lv_timer_pause(t); - if(res != LV_RESULT_OK) return; - } - - gd_render_frame(gifobj->gif, (uint8_t *)gifobj->imgdsc.data); - - lv_image_cache_drop(lv_image_get_src(obj)); - lv_obj_invalidate(obj); -} - -#endif /*LV_USE_GIF*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/gif/lv_gif.h b/software/Power_Pico/Middlewares/LVGL/src/libs/gif/lv_gif.h deleted file mode 100644 index cf1bee4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/gif/lv_gif.h +++ /dev/null @@ -1,104 +0,0 @@ -/** - * @file lv_gif.h - * - */ - -#ifndef LV_GIF_H -#define LV_GIF_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" -#include "../../misc/lv_types.h" -#include "../../draw/lv_draw_buf.h" -#include "../../widgets/image/lv_image.h" -#include "../../core/lv_obj_class.h" -#include LV_STDBOOL_INCLUDE -#include LV_STDINT_INCLUDE -#if LV_USE_GIF - -#include "gifdec.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_gif_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a gif object - * @param parent pointer to an object, it will be the parent of the new gif. - * @return pointer to the gif obj - */ -lv_obj_t * lv_gif_create(lv_obj_t * parent); - -/** - * Set the gif data to display on the object - * @param obj pointer to a gif object - * @param src 1) pointer to an ::lv_image_dsc_t descriptor (which contains gif raw data) or - * 2) path to a gif file (e.g. "S:/dir/anim.gif") - */ -void lv_gif_set_src(lv_obj_t * obj, const void * src); - -/** - * Restart a gif animation. - * @param obj pointer to a gif obj - */ -void lv_gif_restart(lv_obj_t * obj); - -/** - * Pause a gif animation. - * @param obj pointer to a gif obj - */ -void lv_gif_pause(lv_obj_t * obj); - -/** - * Resume a gif animation. - * @param obj pointer to a gif obj - */ -void lv_gif_resume(lv_obj_t * obj); - -/** - * Checks if the GIF was loaded correctly. - * @param obj pointer to a gif obj - */ -bool lv_gif_is_loaded(lv_obj_t * obj); - -/** - * Get the loop count for the GIF. - * @param obj pointer to a gif obj - */ -int32_t lv_gif_get_loop_count(lv_obj_t * obj); - -/** - * Set the loop count for the GIF. - * @param obj pointer to a gif obj - * @param count the loop count to set - */ -void lv_gif_set_loop_count(lv_obj_t * obj, int32_t count); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_GIF*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_GIF_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/gif/lv_gif_private.h b/software/Power_Pico/Middlewares/LVGL/src/libs/gif/lv_gif_private.h deleted file mode 100644 index c4ea17a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/gif/lv_gif_private.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @file lv_gif_private.h - * - */ - -#ifndef LV_GIF_PRIVATE_H -#define LV_GIF_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../widgets/image/lv_image_private.h" -#include "lv_gif.h" - -#if LV_USE_GIF - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_gif_t { - lv_image_t img; - gd_GIF * gif; - lv_timer_t * timer; - lv_image_dsc_t imgdsc; - uint32_t last_call; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_GIF */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_GIF_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c b/software/Power_Pico/Middlewares/LVGL/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c deleted file mode 100644 index f058728..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c +++ /dev/null @@ -1,598 +0,0 @@ -/** - * @file lv_libjpeg_turbo.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../draw/lv_image_decoder_private.h" -#include "../../../lvgl.h" -#if LV_USE_LIBJPEG_TURBO - -#include "lv_libjpeg_turbo.h" -#include -#include -#include -#include -#include "../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ - -#define DECODER_NAME "JPEG_TURBO" - -#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) - -#define JPEG_PIXEL_SIZE 3 /* RGB888 */ -#define JPEG_SIGNATURE 0xFFD8FF -#define IS_JPEG_SIGNATURE(x) (((x) & 0x00FFFFFF) == JPEG_SIGNATURE) - -/********************** - * TYPEDEFS - **********************/ -typedef struct error_mgr_s { - struct jpeg_error_mgr pub; - jmp_buf jb; -} error_mgr_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header); -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -static lv_draw_buf_t * decode_jpeg_file(const char * filename); -static uint8_t * read_file(const char * filename, uint32_t * size); -static bool get_jpeg_head_info(const char * filename, uint32_t * width, uint32_t * height, uint32_t * orientation); -static bool get_jpeg_size(uint8_t * data, uint32_t data_size, uint32_t * width, uint32_t * height); -static bool get_jpeg_direction(uint8_t * data, uint32_t data_size, uint32_t * orientation); -static void rotate_buffer(lv_draw_buf_t * decoded, uint8_t * buffer, uint32_t line_index, uint32_t angle); -static void error_exit(j_common_ptr cinfo); -/********************** - * STATIC VARIABLES - **********************/ -const int JPEG_EXIF = 0x45786966; /* Exif data structure tag */ -const int JPEG_BIG_ENDIAN_TAG = 0x4d4d; -const int JPEG_LITTLE_ENDIAN_TAG = 0x4949; - -/********************** - * MACROS - **********************/ -#define TRANS_32_VALUE(big_endian, data) big_endian ? \ - ((*(data) << 24) | (*((data) + 1) << 16) | (*((data) + 2) << 8) | *((data) + 3)) : \ - (*(data) | (*((data) + 1) << 8) | (*((data) + 2) << 16) | (*((data) + 3) << 24)) -#define TRANS_16_VALUE(big_endian, data) big_endian ? \ - ((*(data) << 8) | *((data) + 1)) : (*(data) | (*((data) + 1) << 8)) - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Register the JPEG decoder functions in LVGL - */ -void lv_libjpeg_turbo_init(void) -{ - lv_image_decoder_t * dec = lv_image_decoder_create(); - lv_image_decoder_set_info_cb(dec, decoder_info); - lv_image_decoder_set_open_cb(dec, decoder_open); - lv_image_decoder_set_close_cb(dec, decoder_close); - - dec->name = DECODER_NAME; -} - -void lv_libjpeg_turbo_deinit(void) -{ - lv_image_decoder_t * dec = NULL; - while((dec = lv_image_decoder_get_next(dec)) != NULL) { - if(dec->info_cb == decoder_info) { - lv_image_decoder_delete(dec); - break; - } - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Get info about a JPEG image - * @param dsc image descriptor containing the source and type of the image and other info. - * @param header store the info here - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info - */ -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) -{ - LV_UNUSED(decoder); /*Unused*/ - lv_image_src_t src_type = dsc->src_type; /*Get the source type*/ - - /*If it's a JPEG file...*/ - if(src_type == LV_IMAGE_SRC_FILE) { - const char * src = dsc->src; - uint32_t jpg_signature = 0; - uint32_t rn; - lv_fs_read(&dsc->file, &jpg_signature, sizeof(jpg_signature), &rn); - - if(rn != sizeof(jpg_signature)) { - LV_LOG_WARN("file: %s signature len = %" LV_PRIu32 " error", src, rn); - return LV_RESULT_INVALID; - } - - const char * ext = lv_fs_get_ext(src); - bool is_jpeg_ext = (lv_strcmp(ext, "jpg") == 0) - || (lv_strcmp(ext, "jpeg") == 0); - - if(!IS_JPEG_SIGNATURE(jpg_signature)) { - if(is_jpeg_ext) { - LV_LOG_WARN("file: %s signature = 0X%" LV_PRIX32 " error", src, jpg_signature); - } - return LV_RESULT_INVALID; - } - - uint32_t width; - uint32_t height; - uint32_t orientation = 0; - - if(!get_jpeg_head_info(src, &width, &height, &orientation)) { - return LV_RESULT_INVALID; - } - - /*Save the data in the header*/ - header->cf = LV_COLOR_FORMAT_RGB888; - header->w = (orientation % 180) ? height : width; - header->h = (orientation % 180) ? width : height; - - return LV_RESULT_OK; - } - - return LV_RESULT_INVALID; /*If didn't succeeded earlier then it's an error*/ -} - -/** - * Open a JPEG image and return the decided image - * @param decoder pointer to the decoder - * @param dsc pointer to the decoder descriptor - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image - */ -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); /*Unused*/ - - /*If it's a JPEG file...*/ - if(dsc->src_type == LV_IMAGE_SRC_FILE) { - const char * fn = dsc->src; - lv_draw_buf_t * decoded = decode_jpeg_file(fn); - if(decoded == NULL) { - LV_LOG_WARN("decode jpeg file failed"); - return LV_RESULT_INVALID; - } - - dsc->decoded = decoded; - - if(dsc->args.no_cache) return LV_RESULT_OK; - - /*If the image cache is disabled, just return the decoded image*/ - if(!lv_image_cache_is_enabled()) return LV_RESULT_OK; - - /*Add the decoded image to the cache*/ - lv_image_cache_data_t search_key; - search_key.src_type = dsc->src_type; - search_key.src = dsc->src; - search_key.slot.size = decoded->data_size; - - lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, decoded, NULL); - - if(entry == NULL) { - lv_draw_buf_destroy(decoded); - return LV_RESULT_INVALID; - } - dsc->cache_entry = entry; - return LV_RESULT_OK; /*If not returned earlier then it failed*/ - } - - return LV_RESULT_INVALID; /*If not returned earlier then it failed*/ -} - -/** - * Free the allocated resources - */ -static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); /*Unused*/ - - if(dsc->args.no_cache || - !lv_image_cache_is_enabled()) lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); -} - -static uint8_t * read_file(const char * filename, uint32_t * size) -{ - uint8_t * data = NULL; - lv_fs_file_t f; - uint32_t data_size; - uint32_t rn; - lv_fs_res_t res; - - *size = 0; - - res = lv_fs_open(&f, filename, LV_FS_MODE_RD); - if(res != LV_FS_RES_OK) { - LV_LOG_WARN("can't open %s", filename); - return NULL; - } - - res = lv_fs_seek(&f, 0, LV_FS_SEEK_END); - if(res != LV_FS_RES_OK) { - goto failed; - } - - res = lv_fs_tell(&f, &data_size); - if(res != LV_FS_RES_OK) { - goto failed; - } - - res = lv_fs_seek(&f, 0, LV_FS_SEEK_SET); - if(res != LV_FS_RES_OK) { - goto failed; - } - - /*Read file to buffer*/ - data = lv_malloc(data_size); - if(data == NULL) { - LV_LOG_WARN("malloc failed for data"); - goto failed; - } - - res = lv_fs_read(&f, data, data_size, &rn); - - if(res == LV_FS_RES_OK && rn == data_size) { - *size = rn; - } - else { - LV_LOG_WARN("read file failed"); - lv_free(data); - data = NULL; - } - -failed: - lv_fs_close(&f); - - return data; -} - -static lv_draw_buf_t * decode_jpeg_file(const char * filename) -{ - /* This struct contains the JPEG decompression parameters and pointers to - * working space (which is allocated as needed by the JPEG library). - */ - struct jpeg_decompress_struct cinfo; - /* We use our private extension JPEG error handler. - * Note that this struct must live as long as the main JPEG parameter - * struct, to avoid dangling-pointer problems. - */ - error_mgr_t jerr; - - /* More stuff */ - JSAMPARRAY buffer; /* Output row buffer */ - - int row_stride; /* physical row width in output buffer */ - uint32_t image_angle = 0; /* image rotate angle */ - - lv_draw_buf_t * decoded = NULL; - - /* In this example we want to open the input file before doing anything else, - * so that the setjmp() error recovery below can assume the file is open. - * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that - * requires it in order to read binary files. - */ - - uint32_t data_size; - uint8_t * data = read_file(filename, &data_size); - if(data == NULL) { - LV_LOG_WARN("can't load file %s", filename); - return NULL; - } - - /* allocate and initialize JPEG decompression object */ - - /* We set up the normal JPEG error routines, then override error_exit. */ - cinfo.err = jpeg_std_error(&jerr.pub); - jerr.pub.error_exit = error_exit; - /* Establish the setjmp return context for my_error_exit to use. */ - if(setjmp(jerr.jb)) { - - LV_LOG_WARN("decoding error"); - - if(decoded) { - lv_draw_buf_destroy(decoded); - } - - /* If we get here, the JPEG code has signaled an error. - * We need to clean up the JPEG object, close the input file, and return. - */ - jpeg_destroy_decompress(&cinfo); - lv_free(data); - return NULL; - } - - /* Get rotate angle from Exif data */ - if(!get_jpeg_direction(data, data_size, &image_angle)) { - LV_LOG_WARN("read jpeg orientation failed."); - } - - /* Now we can initialize the JPEG decompression object. */ - jpeg_create_decompress(&cinfo); - - /* specify data source (eg, a file or buffer) */ - - jpeg_mem_src(&cinfo, data, data_size); - - /* read file parameters with jpeg_read_header() */ - - jpeg_read_header(&cinfo, TRUE); - - /* We can ignore the return value from jpeg_read_header since - * (a) suspension is not possible with the stdio data source, and - * (b) we passed TRUE to reject a tables-only JPEG file as an error. - * See libjpeg.doc for more info. - */ - - /* set parameters for decompression */ - - cinfo.out_color_space = JCS_EXT_BGR; - - /* In this example, we don't need to change any of the defaults set by - * jpeg_read_header(), so we do nothing here. - */ - - /* Start decompressor */ - - jpeg_start_decompress(&cinfo); - - /* We can ignore the return value since suspension is not possible - * with the stdio data source. - */ - - /* We may need to do some setup of our own at this point before reading - * the data. After jpeg_start_decompress() we have the correct scaled - * output image dimensions available, as well as the output colormap - * if we asked for color quantization. - * In this example, we need to make an output work buffer of the right size. - */ - /* JSAMPLEs per row in output buffer */ - row_stride = cinfo.output_width * cinfo.output_components; - /* Make a one-row-high sample array that will go away when done with image */ - buffer = (*cinfo.mem->alloc_sarray) - ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); - uint32_t buf_width = (image_angle % 180) ? cinfo.output_height : cinfo.output_width; - uint32_t buf_height = (image_angle % 180) ? cinfo.output_width : cinfo.output_height; - decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, buf_width, buf_height, LV_COLOR_FORMAT_RGB888, - LV_STRIDE_AUTO); - if(decoded != NULL) { - uint32_t line_index = 0; - /* while (scan lines remain to be read) */ - /* jpeg_read_scanlines(...); */ - - /* Here we use the library's state variable cinfo.output_scanline as the - * loop counter, so that we don't have to keep track ourselves. - */ - while(cinfo.output_scanline < cinfo.output_height) { - /* jpeg_read_scanlines expects an array of pointers to scanlines. - * Here the array is only one element long, but you could ask for - * more than one scanline at a time if that's more convenient. - */ - jpeg_read_scanlines(&cinfo, buffer, 1); - - /* Assume put_scanline_someplace wants a pointer and sample count. */ - rotate_buffer(decoded, buffer[0], line_index, image_angle); - - line_index++; - } - } - - /* Finish decompression */ - - jpeg_finish_decompress(&cinfo); - - /* We can ignore the return value since suspension is not possible - * with the stdio data source. - */ - - /* Release JPEG decompression object */ - - /* This is an important step since it will release a good deal of memory. */ - jpeg_destroy_decompress(&cinfo); - - /* After finish_decompress, we can close the input file. - * Here we postpone it until after no more JPEG errors are possible, - * so as to simplify the setjmp error logic above. (Actually, I don't - * think that jpeg_destroy can do an error exit, but why assume anything...) - */ - lv_free(data); - - /* At this point you may want to check to see whether any corrupt-data - * warnings occurred (test whether jerr.pub.num_warnings is nonzero). - */ - - /* And we're done! */ - return decoded; -} - -static bool get_jpeg_head_info(const char * filename, uint32_t * width, uint32_t * height, uint32_t * orientation) -{ - uint8_t * data = NULL; - uint32_t data_size; - data = read_file(filename, &data_size); - if(data == NULL) { - return false; - } - - if(!get_jpeg_size(data, data_size, width, height)) { - LV_LOG_WARN("read jpeg size failed."); - } - - if(!get_jpeg_direction(data, data_size, orientation)) { - LV_LOG_WARN("read jpeg orientation failed."); - } - - lv_free(data); - - return JPEG_HEADER_OK; -} - -static bool get_jpeg_size(uint8_t * data, uint32_t data_size, uint32_t * width, uint32_t * height) -{ - struct jpeg_decompress_struct cinfo; - error_mgr_t jerr; - - cinfo.err = jpeg_std_error(&jerr.pub); - jerr.pub.error_exit = error_exit; - - if(setjmp(jerr.jb)) { - LV_LOG_WARN("read jpeg head failed"); - jpeg_destroy_decompress(&cinfo); - return false; - } - - jpeg_create_decompress(&cinfo); - - jpeg_mem_src(&cinfo, data, data_size); - - int ret = jpeg_read_header(&cinfo, TRUE); - - if(ret == JPEG_HEADER_OK) { - *width = cinfo.image_width; - *height = cinfo.image_height; - } - else { - LV_LOG_WARN("read jpeg head failed: %d", ret); - } - - jpeg_destroy_decompress(&cinfo); - - return JPEG_HEADER_OK; -} - -static bool get_jpeg_direction(uint8_t * data, uint32_t data_size, uint32_t * orientation) -{ - struct jpeg_decompress_struct cinfo; - error_mgr_t jerr; - - cinfo.err = jpeg_std_error(&jerr.pub); - jerr.pub.error_exit = error_exit; - - if(setjmp(jerr.jb)) { - LV_LOG_WARN("read jpeg orientation failed"); - jpeg_destroy_decompress(&cinfo); - return false; - } - - jpeg_create_decompress(&cinfo); - - jpeg_mem_src(&cinfo, data, data_size); - - jpeg_save_markers(&cinfo, JPEG_APP0 + 1, 0xFFFF); - - cinfo.marker->read_markers(&cinfo); - - jpeg_saved_marker_ptr marker = cinfo.marker_list; - while(marker != NULL) { - if(marker->marker == JPEG_APP0 + 1) { - JOCTET FAR * app1_data = marker->data; - if(TRANS_32_VALUE(true, app1_data) == JPEG_EXIF) { - uint16_t endian_tag = TRANS_16_VALUE(true, app1_data + 4 + 2); - if(!(endian_tag == JPEG_LITTLE_ENDIAN_TAG || endian_tag == JPEG_BIG_ENDIAN_TAG)) { - jpeg_destroy_decompress(&cinfo); - return false; - } - bool is_big_endian = endian_tag == JPEG_BIG_ENDIAN_TAG; - /* first ifd offset addr : 4bytes(Exif) + 2bytes(0x00) + 2bytes(align) + 2bytes(tag mark) */ - unsigned int offset = TRANS_32_VALUE(is_big_endian, app1_data + 8 + 2); - /* ifd base : 4bytes(Exif) + 2bytes(0x00) */ - unsigned char * ifd = 0; - do { - /* ifd start: 4bytes(Exif) + 2bytes(0x00) + offset value(2bytes(align) + 2bytes(tag mark) + 4bytes(offset size)) */ - unsigned int entry_offset = 4 + 2 + offset + 2; - if(entry_offset >= marker->data_length) { - jpeg_destroy_decompress(&cinfo); - return false; - } - ifd = app1_data + entry_offset; - unsigned short num_entries = TRANS_16_VALUE(is_big_endian, ifd - 2); - if(entry_offset + num_entries * 12 >= marker->data_length) { - jpeg_destroy_decompress(&cinfo); - return false; - } - for(int i = 0; i < num_entries; i++) { - unsigned short tag = TRANS_16_VALUE(is_big_endian, ifd); - if(tag == 0x0112) { - /* ifd entry: 12bytes = 2bytes(tag number) + 2bytes(kind of data) + 4bytes(number of components) + 4bytes(data) - * orientation kind(0x03) of data is unsigned short */ - int dirc = TRANS_16_VALUE(is_big_endian, ifd + 2 + 2 + 4); - switch(dirc) { - case 1: - *orientation = 0; - break; - case 3: - *orientation = 180; - break; - case 6: - *orientation = 90; - break; - case 8: - *orientation = 270; - break; - default: - *orientation = 0; - } - } - ifd += 12; - } - offset = TRANS_32_VALUE(is_big_endian, ifd); - } while(offset != 0); - } - break; - } - marker = marker->next; - } - - jpeg_destroy_decompress(&cinfo); - - return JPEG_HEADER_OK; -} - -static void rotate_buffer(lv_draw_buf_t * decoded, uint8_t * buffer, uint32_t line_index, uint32_t angle) -{ - if(angle == 90) { - for(uint32_t x = 0; x < decoded->header.h; x++) { - uint32_t dst_index = x * decoded->header.stride + (decoded->header.w - line_index - 1) * JPEG_PIXEL_SIZE; - lv_memcpy(decoded->data + dst_index, buffer + x * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE); - } - } - else if(angle == 180) { - for(uint32_t x = 0; x < decoded->header.w; x++) { - uint32_t dst_index = (decoded->header.h - line_index - 1) * decoded->header.stride + x * JPEG_PIXEL_SIZE; - lv_memcpy(decoded->data + dst_index, buffer + (decoded->header.w - x - 1) * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE); - } - } - else if(angle == 270) { - for(uint32_t x = 0; x < decoded->header.h; x++) { - uint32_t dst_index = (decoded->header.h - x - 1) * decoded->header.stride + line_index * JPEG_PIXEL_SIZE; - lv_memcpy(decoded->data + dst_index, buffer + x * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE); - } - } - else { - lv_memcpy(decoded->data + line_index * decoded->header.stride, buffer, decoded->header.stride); - } -} - -static void error_exit(j_common_ptr cinfo) -{ - error_mgr_t * myerr = (error_mgr_t *)cinfo->err; - (*cinfo->err->output_message)(cinfo); - longjmp(myerr->jb, 1); -} - -#endif /*LV_USE_LIBJPEG_TURBO*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h b/software/Power_Pico/Middlewares/LVGL/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h deleted file mode 100644 index 177c83a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @file lv_libjpeg_turbo.h - * - */ - -#ifndef LV_LIBJPEG_TURBO_H -#define LV_LIBJPEG_TURBO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_LIBJPEG_TURBO - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Register the JPEG-Turbo decoder functions in LVGL - */ -void lv_libjpeg_turbo_init(void); - -void lv_libjpeg_turbo_deinit(void); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_LIBJPEG_TURBO*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_LIBJPEG_TURBO_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/libpng/lv_libpng.c b/software/Power_Pico/Middlewares/LVGL/src/libs/libpng/lv_libpng.c deleted file mode 100644 index 587e5fc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/libpng/lv_libpng.c +++ /dev/null @@ -1,331 +0,0 @@ -/** - * @file lv_libpng.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../draw/lv_image_decoder_private.h" -#include "../../../lvgl.h" -#if LV_USE_LIBPNG - -#include "lv_libpng.h" -#include -#include -#include "../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ - -#define DECODER_NAME "PNG" - -#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * src, lv_image_header_t * header); -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -static lv_draw_buf_t * decode_png(lv_image_decoder_dsc_t * dsc); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Register the PNG decoder functions in LVGL - */ -void lv_libpng_init(void) -{ - lv_image_decoder_t * dec = lv_image_decoder_create(); - lv_image_decoder_set_info_cb(dec, decoder_info); - lv_image_decoder_set_open_cb(dec, decoder_open); - lv_image_decoder_set_close_cb(dec, decoder_close); - - dec->name = DECODER_NAME; -} - -void lv_libpng_deinit(void) -{ - lv_image_decoder_t * dec = NULL; - while((dec = lv_image_decoder_get_next(dec)) != NULL) { - if(dec->info_cb == decoder_info) { - lv_image_decoder_delete(dec); - break; - } - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Get info about a PNG image - * @param dsc can be file name or pointer to a C array - * @param header store the info here - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info - */ -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) -{ - LV_UNUSED(decoder); /*Unused*/ - - lv_image_src_t src_type = dsc->src_type; /*Get the source type*/ - - if(src_type == LV_IMAGE_SRC_FILE || src_type == LV_IMAGE_SRC_VARIABLE) { - uint32_t * size; - static const uint8_t magic[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}; - uint8_t buf[24]; - - /*If it's a PNG file...*/ - if(src_type == LV_IMAGE_SRC_FILE) { - /* Read the width and height from the file. They have a constant location: - * [16..19]: width - * [20..23]: height - */ - uint32_t rn; - lv_fs_read(&dsc->file, buf, sizeof(buf), &rn); - - if(rn != sizeof(buf)) return LV_RESULT_INVALID; - - if(lv_memcmp(buf, magic, sizeof(magic)) != 0) return LV_RESULT_INVALID; - - size = (uint32_t *)&buf[16]; - } - /*If it's a PNG file in a C array...*/ - else { - const lv_image_dsc_t * img_dsc = dsc->src; - const uint32_t data_size = img_dsc->data_size; - size = ((uint32_t *)img_dsc->data) + 4; - - if(data_size < sizeof(magic)) return LV_RESULT_INVALID; - if(lv_memcmp(img_dsc->data, magic, sizeof(magic)) != 0) return LV_RESULT_INVALID; - } - - /*Save the data in the header*/ - header->cf = LV_COLOR_FORMAT_ARGB8888; - /*The width and height are stored in Big endian format so convert them to little endian*/ - header->w = (int32_t)((size[0] & 0xff000000) >> 24) + ((size[0] & 0x00ff0000) >> 8); - header->h = (int32_t)((size[1] & 0xff000000) >> 24) + ((size[1] & 0x00ff0000) >> 8); - - return LV_RESULT_OK; - } - - return LV_RESULT_INVALID; /*If didn't succeeded earlier then it's an error*/ -} - -/** - * Open a PNG image and return the decided image - * @param decoder pointer to the decoder - * @param dsc pointer to the decoder descriptor - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image - */ -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); /*Unused*/ - lv_draw_buf_t * decoded; - decoded = decode_png(dsc); - - if(decoded == NULL) { - return LV_RESULT_INVALID; - } - - lv_draw_buf_t * adjusted = lv_image_decoder_post_process(dsc, decoded); - if(adjusted == NULL) { - lv_draw_buf_destroy_user(image_cache_draw_buf_handlers, decoded); - return LV_RESULT_INVALID; - } - - /*The adjusted draw buffer is newly allocated.*/ - if(adjusted != decoded) { - lv_draw_buf_destroy_user(image_cache_draw_buf_handlers, decoded); - decoded = adjusted; - } - - dsc->decoded = decoded; - - if(dsc->args.no_cache) return LV_RESULT_OK; - - /*If the image cache is disabled, just return the decoded image*/ - if(!lv_image_cache_is_enabled()) return LV_RESULT_OK; - - /*Add the decoded image to the cache*/ - lv_image_cache_data_t search_key; - search_key.src_type = dsc->src_type; - search_key.src = dsc->src; - search_key.slot.size = decoded->data_size; - - lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, decoded, NULL); - - if(entry == NULL) { - lv_draw_buf_destroy_user(image_cache_draw_buf_handlers, decoded); - return LV_RESULT_INVALID; - } - dsc->cache_entry = entry; - - return LV_RESULT_OK; /*The image is fully decoded. Return with its pointer*/ -} - -/** - * Free the allocated resources - */ -static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); /*Unused*/ - - if(dsc->args.no_cache || - !lv_image_cache_is_enabled()) lv_draw_buf_destroy_user(image_cache_draw_buf_handlers, (lv_draw_buf_t *)dsc->decoded); -} - -static uint8_t * alloc_file(const char * filename, uint32_t * size) -{ - uint8_t * data = NULL; - lv_fs_file_t f; - uint32_t data_size; - uint32_t rn; - lv_fs_res_t res; - - *size = 0; - - res = lv_fs_open(&f, filename, LV_FS_MODE_RD); - if(res != LV_FS_RES_OK) { - LV_LOG_WARN("can't open %s", filename); - return NULL; - } - - res = lv_fs_seek(&f, 0, LV_FS_SEEK_END); - if(res != LV_FS_RES_OK) { - goto failed; - } - - res = lv_fs_tell(&f, &data_size); - if(res != LV_FS_RES_OK) { - goto failed; - } - - res = lv_fs_seek(&f, 0, LV_FS_SEEK_SET); - if(res != LV_FS_RES_OK) { - goto failed; - } - - /*Read file to buffer*/ - data = lv_malloc(data_size); - if(data == NULL) { - LV_LOG_WARN("malloc failed for data"); - goto failed; - } - - res = lv_fs_read(&f, data, data_size, &rn); - - if(res == LV_FS_RES_OK && rn == data_size) { - *size = rn; - } - else { - LV_LOG_WARN("read file failed"); - lv_free(data); - data = NULL; - } - -failed: - lv_fs_close(&f); - - return data; -} - -static lv_draw_buf_t * decode_png(lv_image_decoder_dsc_t * dsc) -{ - int ret; - uint8_t * png_data; - uint32_t png_data_size; - /*Prepare png_image*/ - png_image image; - lv_memzero(&image, sizeof(image)); - image.version = PNG_IMAGE_VERSION; - - if(dsc->src_type == LV_IMAGE_SRC_FILE) { - if(lv_strcmp(lv_fs_get_ext(dsc->src), "png") != 0) { /*Check the extension*/ - return NULL; - } - - png_data = alloc_file(dsc->src, &png_data_size); - if(png_data == NULL) { - LV_LOG_WARN("can't load file: %s", (const char *)dsc->src); - return NULL; - } - } - else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { - const lv_image_dsc_t * img_dsc = dsc->src; - png_data = (uint8_t *)img_dsc->data; - png_data_size = img_dsc->data_size; - } - else - return NULL; - - /*Ready to read file*/ - ret = png_image_begin_read_from_memory(&image, png_data, png_data_size); - if(!ret) { - LV_LOG_ERROR("png read failed: %d", ret); - if(dsc->src_type == LV_IMAGE_SRC_FILE) - lv_free(png_data); - return NULL; - } - - lv_color_format_t cf; - if(dsc->args.use_indexed && (image.format & PNG_FORMAT_FLAG_COLORMAP)) { - cf = LV_COLOR_FORMAT_I8; - image.format = PNG_FORMAT_BGRA_COLORMAP; - } - else { - cf = LV_COLOR_FORMAT_ARGB8888; - image.format = PNG_FORMAT_BGRA; - } - - /*Alloc image buffer*/ - lv_draw_buf_t * decoded; - decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, image.width, image.height, cf, LV_STRIDE_AUTO); - if(decoded == NULL) { - - if(dsc->src_type == LV_IMAGE_SRC_FILE) { - LV_LOG_ERROR("alloc PNG_IMAGE_SIZE(%" LV_PRIu32 ") failed: %s", (uint32_t)PNG_IMAGE_SIZE(image), - (const char *)dsc->src); - lv_free(png_data); - } - else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) - LV_LOG_ERROR("alloc PNG_IMAGE_SIZE(%" LV_PRIu32 ")", (uint32_t)PNG_IMAGE_SIZE(image)); - - return NULL; - } - - void * palette = decoded->data; - void * map = decoded->data + LV_COLOR_INDEXED_PALETTE_SIZE(cf) * sizeof(lv_color32_t); - - /*Start decoding*/ - ret = png_image_finish_read(&image, NULL, map, decoded->header.stride, palette); - png_image_free(&image); - if(dsc->src_type == LV_IMAGE_SRC_FILE) - lv_free(png_data); - if(!ret) { - LV_LOG_ERROR("png decode failed: %s", image.message); - lv_draw_buf_destroy_user(image_cache_draw_buf_handlers, decoded); - return NULL; - } - - return decoded; -} - -#endif /*LV_USE_LIBPNG*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/libpng/lv_libpng.h b/software/Power_Pico/Middlewares/LVGL/src/libs/libpng/lv_libpng.h deleted file mode 100644 index 1279458..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/libpng/lv_libpng.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @file lv_libpng.h - * - */ - -#ifndef LV_LIBPNG_H -#define LV_LIBPNG_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_LIBPNG - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Register the PNG decoder functions in LVGL - */ -void lv_libpng_init(void); - -void lv_libpng_deinit(void); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_LIBPNG*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_LIBPNG_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/lodepng/lodepng.c b/software/Power_Pico/Middlewares/LVGL/src/libs/lodepng/lodepng.c deleted file mode 100644 index a3f0b59..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/lodepng/lodepng.c +++ /dev/null @@ -1,7657 +0,0 @@ -/* -LodePNG version 20230410 - -Copyright (c) 2005-2023 Lode Vandevenne - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. -*/ - -/* -The manual and changelog are in the header file "lodepng.h" -Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. -*/ - -#include "lodepng.h" -#if LV_USE_LODEPNG -#include "../../core/lv_global.h" - -#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) - -#ifdef LODEPNG_COMPILE_DISK - #include /* LONG_MAX */ - #include /* file handling */ -#endif /* LODEPNG_COMPILE_DISK */ - -#ifdef LODEPNG_COMPILE_ALLOCATORS - #include /* allocations */ -#endif /* LODEPNG_COMPILE_ALLOCATORS */ - -#if defined(_MSC_VER) && (_MSC_VER >= 1310) /*Visual Studio: A few warning types are not desired here.*/ - #pragma warning( disable : 4244 ) /*implicit conversions: not warned by gcc -Wall -Wextra and requires too much casts*/ - #pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/ -#endif /*_MSC_VER */ - -const char * LODEPNG_VERSION_STRING = "20230410"; - -/* -This source file is divided into the following large parts. The code sections -with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. --Tools for C and common code for PNG and Zlib --C Code for Zlib (huffman, deflate, ...) --C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) --The C++ wrapper around all of the above -*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // Tools for C, and common code for PNG and Zlib. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*The malloc, realloc and free functions defined here with "lodepng_" in front -of the name, so that you can easily change them to others related to your -platform if needed. Everything else in the code calls these. Pass --DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out -#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and -define them in your own project's source files without needing to change -lodepng source code. Don't forget to remove "static" if you copypaste them -from here.*/ - -#ifdef LODEPNG_COMPILE_ALLOCATORS -static void * lodepng_malloc(size_t size) -{ -#ifdef LODEPNG_MAX_ALLOC - if(size > LODEPNG_MAX_ALLOC) return 0; -#endif - return lv_malloc(size); -} - -/* NOTE: when realloc returns NULL, it leaves the original memory untouched */ -static void * lodepng_realloc(void * ptr, size_t new_size) -{ -#ifdef LODEPNG_MAX_ALLOC - if(new_size > LODEPNG_MAX_ALLOC) return 0; -#endif - return lv_realloc(ptr, new_size); -} - -static void lodepng_free(void * ptr) -{ - lv_free(ptr); -} -#else /*LODEPNG_COMPILE_ALLOCATORS*/ -/* TODO: support giving additional void* payload to the custom allocators */ -void * lodepng_malloc(size_t size); -void * lodepng_realloc(void * ptr, size_t new_size); -void lodepng_free(void * ptr); -#endif /*LODEPNG_COMPILE_ALLOCATORS*/ - -/* convince the compiler to inline a function, for use when this measurably improves performance */ -/* inline is not available in C90, but use it when supported by the compiler */ -#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || (defined(__cplusplus) && (__cplusplus >= 199711L)) - #define LODEPNG_INLINE inline -#else - #define LODEPNG_INLINE /* not available */ -#endif - -/* restrict is not available in C90, but use it when supported by the compiler */ -#if (defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) ||\ - (defined(_MSC_VER) && (_MSC_VER >= 1400)) || \ - (defined(__WATCOMC__) && (__WATCOMC__ >= 1250) && !defined(__cplusplus)) - #define LODEPNG_RESTRICT __restrict -#else - #define LODEPNG_RESTRICT /* not available */ -#endif - -/* Replacements for C library functions such as memcpy and strlen, to support platforms -where a full C library is not available. The compiler can recognize them and compile -to something as fast. */ - -static void lodepng_memcpy(void * LODEPNG_RESTRICT dst, - const void * LODEPNG_RESTRICT src, size_t size) -{ - lv_memcpy(dst, src, size); -} - -static void lodepng_memset(void * LODEPNG_RESTRICT dst, - int value, size_t num) -{ - lv_memset(dst, value, num); -} - -/* does not check memory out of bounds, do not use on untrusted data */ -static size_t lodepng_strlen(const char * a) -{ - const char * orig = a; - /* avoid warning about unused function in case of disabled COMPILE... macros */ - (void)(&lodepng_strlen); - while(*a) a++; - return (size_t)(a - orig); -} - -#define LODEPNG_MAX(a, b) (((a) > (b)) ? (a) : (b)) -#define LODEPNG_MIN(a, b) (((a) < (b)) ? (a) : (b)) - -#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER) -/* Safely check if adding two integers will overflow (no undefined -behavior, compiler removing the code, etc...) and output result. */ -static int lodepng_addofl(size_t a, size_t b, size_t * result) -{ - *result = a + b; /* Unsigned addition is well defined and safe in C90 */ - return *result < a; -} -#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER)*/ - -#ifdef LODEPNG_COMPILE_DECODER -/* Safely check if multiplying two integers will overflow (no undefined -behavior, compiler removing the code, etc...) and output result. */ -static int lodepng_mulofl(size_t a, size_t b, size_t * result) -{ - *result = a * b; /* Unsigned multiplication is well defined and safe in C90 */ - return (a != 0 && *result / a != b); -} - -#ifdef LODEPNG_COMPILE_ZLIB -/* Safely check if a + b > c, even if overflow could happen. */ -static int lodepng_gtofl(size_t a, size_t b, size_t c) -{ - size_t d; - if(lodepng_addofl(a, b, &d)) return 1; - return d > c; -} -#endif /*LODEPNG_COMPILE_ZLIB*/ -#endif /*LODEPNG_COMPILE_DECODER*/ - - -/* -Often in case of an error a value is assigned to a variable and then it breaks -out of a loop (to go to the cleanup phase of a function). This macro does that. -It makes the error handling code shorter and more readable. - -Example: if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83); -*/ -#define CERROR_BREAK(errorvar, code){\ - errorvar = code;\ - break;\ - } - -/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ -#define ERROR_BREAK(code) CERROR_BREAK(error, code) - -/*Set error var to the error code, and return it.*/ -#define CERROR_RETURN_ERROR(errorvar, code){\ - errorvar = code;\ - return code;\ - } - -/*Try the code, if it returns error, also return the error.*/ -#define CERROR_TRY_RETURN(call){\ - unsigned error = call;\ - if(error) return error;\ - } - -/*Set error var to the error code, and return from the void function.*/ -#define CERROR_RETURN(errorvar, code){\ - errorvar = code;\ - return;\ - } - -/* -About uivector, ucvector and string: --All of them wrap dynamic arrays or text strings in a similar way. --LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. --The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. --They're not used in the interface, only internally in this file as static functions. --As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. -*/ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_ENCODER -/*dynamic vector of unsigned ints*/ -typedef struct uivector { - unsigned * data; - size_t size; /*size in number of unsigned longs*/ - size_t allocsize; /*allocated size in bytes*/ -} uivector; - -static void uivector_cleanup(void * p) -{ - ((uivector *)p)->size = ((uivector *)p)->allocsize = 0; - lodepng_free(((uivector *)p)->data); - ((uivector *)p)->data = NULL; -} - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned uivector_resize(uivector * p, size_t size) -{ - size_t allocsize = size * sizeof(unsigned); - if(allocsize > p->allocsize) { - size_t newsize = allocsize + (p->allocsize >> 1u); - void * data = lodepng_realloc(p->data, newsize); - if(data) { - p->allocsize = newsize; - p->data = (unsigned *)data; - } - else return 0; /*error: not enough memory*/ - } - p->size = size; - return 1; /*success*/ -} - -static void uivector_init(uivector * p) -{ - p->data = NULL; - p->size = p->allocsize = 0; -} - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned uivector_push_back(uivector * p, unsigned c) -{ - if(!uivector_resize(p, p->size + 1)) return 0; - p->data[p->size - 1] = c; - return 1; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_ZLIB*/ - -/* /////////////////////////////////////////////////////////////////////////// */ - -/*dynamic vector of unsigned chars*/ -typedef struct ucvector { - unsigned char * data; - size_t size; /*used size*/ - size_t allocsize; /*allocated size*/ -} ucvector; - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned ucvector_reserve(ucvector * p, size_t size) -{ - if(size > p->allocsize) { - size_t newsize = size + (p->allocsize >> 1u); - void * data = lodepng_realloc(p->data, newsize); - if(data) { - p->allocsize = newsize; - p->data = (unsigned char *)data; - } - else return 0; /*error: not enough memory*/ - } - return 1; /*success*/ -} - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned ucvector_resize(ucvector * p, size_t size) -{ - p->size = size; - return ucvector_reserve(p, size); -} - -static ucvector ucvector_init(unsigned char * buffer, size_t size) -{ - ucvector v; - v.data = buffer; - v.allocsize = v.size = size; - return v; -} - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_PNG -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - -/*free string pointer and set it to NULL*/ -static void string_cleanup(char ** out) -{ - lodepng_free(*out); - *out = NULL; -} - -/*also appends null termination character*/ -static char * alloc_string_sized(const char * in, size_t insize) -{ - char * out = (char *)lodepng_malloc(insize + 1); - if(out) { - lodepng_memcpy(out, in, insize); - out[insize] = 0; - } - return out; -} - -/* dynamically allocates a new string with a copy of the null terminated input text */ -static char * alloc_string(const char * in) -{ - return alloc_string_sized(in, lodepng_strlen(in)); -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG) -static unsigned lodepng_read32bitInt(const unsigned char * buffer) -{ - return (((unsigned)buffer[0] << 24u) | ((unsigned)buffer[1] << 16u) | - ((unsigned)buffer[2] << 8u) | (unsigned)buffer[3]); -} -#endif /*defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG)*/ - -#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) -/*buffer must have at least 4 allocated bytes available*/ -static void lodepng_set32bitInt(unsigned char * buffer, unsigned value) -{ - buffer[0] = (unsigned char)((value >> 24) & 0xff); - buffer[1] = (unsigned char)((value >> 16) & 0xff); - buffer[2] = (unsigned char)((value >> 8) & 0xff); - buffer[3] = (unsigned char)((value) & 0xff); -} -#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / File IO / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_DISK - -/* returns negative value on error. This should be pure C compatible, so no fstat. */ -static long lodepng_filesize(const char * filename) -{ - lv_fs_file_t f; - lv_fs_res_t res = lv_fs_open(&f, filename, LV_FS_MODE_RD); - if(res != LV_FS_RES_OK) return -1; - uint32_t size = 0; - if(lv_fs_seek(&f, 0, LV_FS_SEEK_END) != 0) { - lv_fs_close(&f); - return -1; - } - - lv_fs_tell(&f, &size); - lv_fs_close(&f); - return size; -} - -/* load file into buffer that already has the correct allocated size. Returns error code.*/ -static unsigned lodepng_buffer_file(unsigned char * out, size_t size, const char * filename) -{ - lv_fs_file_t f; - lv_fs_res_t res = lv_fs_open(&f, filename, LV_FS_MODE_RD); - if(res != LV_FS_RES_OK) return 78; - - uint32_t br; - res = lv_fs_read(&f, out, size, &br); - lv_fs_close(&f); - - if(res != LV_FS_RES_OK) return 78; - if(br != size) return 78; - - return 0; -} - -unsigned lodepng_load_file(unsigned char ** out, size_t * outsize, const char * filename) -{ - long size = lodepng_filesize(filename); - if(size < 0) return 78; - *outsize = (size_t)size; - - *out = (unsigned char *)lodepng_malloc((size_t)size); - if(!(*out) && size > 0) return 83; /*the above malloc failed*/ - - return lodepng_buffer_file(*out, (size_t)size, filename); -} - -/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ -unsigned lodepng_save_file(const unsigned char * buffer, size_t buffersize, const char * filename) -{ - lv_fs_file_t f; - lv_fs_res_t res = lv_fs_open(&f, filename, LV_FS_MODE_WR); - if(res != LV_FS_RES_OK) return 79; - - uint32_t bw; - res = lv_fs_write(&f, buffer, buffersize, &bw); - lv_fs_close(&f); - return 0; -} - -#endif /*LODEPNG_COMPILE_DISK*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // End of common code and tools. Begin of Zlib related code. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_ENCODER - -typedef struct { - ucvector * data; - unsigned char bp; /*ok to overflow, indicates bit pos inside byte*/ -} LodePNGBitWriter; - -static void LodePNGBitWriter_init(LodePNGBitWriter * writer, ucvector * data) -{ - writer->data = data; - writer->bp = 0; -} - -/*TODO: this ignores potential out of memory errors*/ -#define WRITEBIT(writer, bit){\ - /* append new byte */\ - if(((writer->bp) & 7u) == 0) {\ - if(!ucvector_resize(writer->data, writer->data->size + 1)) return;\ - writer->data->data[writer->data->size - 1] = 0;\ - }\ - (writer->data->data[writer->data->size - 1]) |= (bit << ((writer->bp) & 7u));\ - ++writer->bp;\ - } - -/* LSB of value is written first, and LSB of bytes is used first */ -static void writeBits(LodePNGBitWriter * writer, unsigned value, size_t nbits) -{ - if(nbits == 1) { /* compiler should statically compile this case if nbits == 1 */ - WRITEBIT(writer, value); - } - else { - /* TODO: increase output size only once here rather than in each WRITEBIT */ - size_t i; - for(i = 0; i != nbits; ++i) { - WRITEBIT(writer, (unsigned char)((value >> i) & 1)); - } - } -} - -/* This one is to use for adding huffman symbol, the value bits are written MSB first */ -static void writeBitsReversed(LodePNGBitWriter * writer, unsigned value, size_t nbits) -{ - size_t i; - for(i = 0; i != nbits; ++i) { - /* TODO: increase output size only once here rather than in each WRITEBIT */ - WRITEBIT(writer, (unsigned char)((value >> (nbits - 1u - i)) & 1u)); - } -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -typedef struct { - const unsigned char * data; - size_t size; /*size of data in bytes*/ - size_t bitsize; /*size of data in bits, end of valid bp values, should be 8*size*/ - size_t bp; - unsigned buffer; /*buffer for reading bits. NOTE: 'unsigned' must support at least 32 bits*/ -} LodePNGBitReader; - -/* data size argument is in bytes. Returns error if size too large causing overflow */ -static unsigned LodePNGBitReader_init(LodePNGBitReader * reader, const unsigned char * data, size_t size) -{ - size_t temp; - reader->data = data; - reader->size = size; - /* size in bits, return error if overflow (if size_t is 32 bit this supports up to 500MB) */ - if(lodepng_mulofl(size, 8u, &reader->bitsize)) return 105; - /*ensure incremented bp can be compared to bitsize without overflow even when it would be incremented 32 too much and - trying to ensure 32 more bits*/ - if(lodepng_addofl(reader->bitsize, 64u, &temp)) return 105; - reader->bp = 0; - reader->buffer = 0; - return 0; /*ok*/ -} - -/* -ensureBits functions: -Ensures the reader can at least read nbits bits in one or more readBits calls, -safely even if not enough bits are available. -The nbits parameter is unused but is given for documentation purposes, error -checking for amount of bits must be done beforehand. -*/ - -/*See ensureBits documentation above. This one ensures up to 9 bits */ -static LODEPNG_INLINE void ensureBits9(LodePNGBitReader * reader, size_t nbits) -{ - size_t start = reader->bp >> 3u; - size_t size = reader->size; - if(start + 1u < size) { - reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u); - reader->buffer >>= (reader->bp & 7u); - } - else { - reader->buffer = 0; - if(start + 0u < size) reader->buffer = reader->data[start + 0]; - reader->buffer >>= (reader->bp & 7u); - } - (void)nbits; -} - -/*See ensureBits documentation above. This one ensures up to 17 bits */ -static LODEPNG_INLINE void ensureBits17(LodePNGBitReader * reader, size_t nbits) -{ - size_t start = reader->bp >> 3u; - size_t size = reader->size; - if(start + 2u < size) { - reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | - ((unsigned)reader->data[start + 2] << 16u); - reader->buffer >>= (reader->bp & 7u); - } - else { - reader->buffer = 0; - if(start + 0u < size) reader->buffer |= reader->data[start + 0]; - if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); - reader->buffer >>= (reader->bp & 7u); - } - (void)nbits; -} - -/*See ensureBits documentation above. This one ensures up to 25 bits */ -static LODEPNG_INLINE void ensureBits25(LodePNGBitReader * reader, size_t nbits) -{ - size_t start = reader->bp >> 3u; - size_t size = reader->size; - if(start + 3u < size) { - reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | - ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u); - reader->buffer >>= (reader->bp & 7u); - } - else { - reader->buffer = 0; - if(start + 0u < size) reader->buffer |= reader->data[start + 0]; - if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); - if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u); - reader->buffer >>= (reader->bp & 7u); - } - (void)nbits; -} - -/*See ensureBits documentation above. This one ensures up to 32 bits */ -static LODEPNG_INLINE void ensureBits32(LodePNGBitReader * reader, size_t nbits) -{ - size_t start = reader->bp >> 3u; - size_t size = reader->size; - if(start + 4u < size) { - reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | - ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u); - reader->buffer >>= (reader->bp & 7u); - reader->buffer |= (((unsigned)reader->data[start + 4] << 24u) << (8u - (reader->bp & 7u))); - } - else { - reader->buffer = 0; - if(start + 0u < size) reader->buffer |= reader->data[start + 0]; - if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); - if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u); - if(start + 3u < size) reader->buffer |= ((unsigned)reader->data[start + 3] << 24u); - reader->buffer >>= (reader->bp & 7u); - } - (void)nbits; -} - -/* Get bits without advancing the bit pointer. Must have enough bits available with ensureBits. Max nbits is 31. */ -static LODEPNG_INLINE unsigned peekBits(LodePNGBitReader * reader, size_t nbits) -{ - /* The shift allows nbits to be only up to 31. */ - return reader->buffer & ((1u << nbits) - 1u); -} - -/* Must have enough bits available with ensureBits */ -static LODEPNG_INLINE void advanceBits(LodePNGBitReader * reader, size_t nbits) -{ - reader->buffer >>= nbits; - reader->bp += nbits; -} - -/* Must have enough bits available with ensureBits */ -static LODEPNG_INLINE unsigned readBits(LodePNGBitReader * reader, size_t nbits) -{ - unsigned result = peekBits(reader, nbits); - advanceBits(reader, nbits); - return result; -} -#endif /*LODEPNG_COMPILE_DECODER*/ - -static unsigned reverseBits(unsigned bits, unsigned num) -{ - /*TODO: implement faster lookup table based version when needed*/ - unsigned i, result = 0; - for(i = 0; i < num; i++) result |= ((bits >> (num - i - 1u)) & 1u) << i; - return result; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Deflate - Huffman / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#define FIRST_LENGTH_CODE_INDEX 257 -#define LAST_LENGTH_CODE_INDEX 285 -/*256 literals, the end code, some length codes, and 2 unused codes*/ -#define NUM_DEFLATE_CODE_SYMBOLS 288 -/*the distance codes have their own symbols, 30 used, 2 unused*/ -#define NUM_DISTANCE_SYMBOLS 32 -/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ -#define NUM_CODE_LENGTH_CODES 19 - -/*the base lengths represented by codes 257-285*/ -static const unsigned LENGTHBASE[29] - = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, - 67, 83, 99, 115, 131, 163, 195, 227, 258 - }; - -/*the extra bits used by codes 257-285 (added to base length)*/ -static const unsigned LENGTHEXTRA[29] - = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, - 4, 4, 4, 4, 5, 5, 5, 5, 0 - }; - -/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ -static const unsigned DISTANCEBASE[30] - = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, - 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 - }; - -/*the extra bits of backwards distances (added to base)*/ -static const unsigned DISTANCEEXTRA[30] - = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, - 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 - }; - -/*the order in which "code length alphabet code lengths" are stored as specified by deflate, out of this the huffman -tree of the dynamic huffman tree lengths is generated*/ -static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] - = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - -/* ////////////////////////////////////////////////////////////////////////// */ - -/* -Huffman tree struct, containing multiple representations of the tree -*/ -typedef struct HuffmanTree { - unsigned * codes; /*the huffman codes (bit patterns representing the symbols)*/ - unsigned * lengths; /*the lengths of the huffman codes*/ - unsigned maxbitlen; /*maximum number of bits a single code can get*/ - unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ - /* for reading only */ - unsigned char * table_len; /*length of symbol from lookup table, or max length if secondary lookup needed*/ - unsigned short * table_value; /*value of symbol from lookup table, or pointer to secondary table if needed*/ -} HuffmanTree; - -static void HuffmanTree_init(HuffmanTree * tree) -{ - tree->codes = 0; - tree->lengths = 0; - tree->table_len = 0; - tree->table_value = 0; -} - -static void HuffmanTree_cleanup(HuffmanTree * tree) -{ - lodepng_free(tree->codes); - lodepng_free(tree->lengths); - lodepng_free(tree->table_len); - lodepng_free(tree->table_value); -} - -/* amount of bits for first huffman table lookup (aka root bits), see HuffmanTree_makeTable and huffmanDecodeSymbol.*/ -/* values 8u and 9u work the fastest */ -#define FIRSTBITS 9u - -/* a symbol value too big to represent any valid symbol, to indicate reading disallowed huffman bits combination, -which is possible in case of only 0 or 1 present symbols. */ -#define INVALIDSYMBOL 65535u - -/* make table for huffman decoding */ -static unsigned HuffmanTree_makeTable(HuffmanTree * tree) -{ - static const unsigned headsize = 1u << FIRSTBITS; /*size of the first table*/ - static const unsigned mask = (1u << FIRSTBITS) /*headsize*/ - 1u; - size_t i, numpresent, pointer, size; /*total table size*/ - unsigned * maxlens = (unsigned *)lodepng_malloc(headsize * sizeof(unsigned)); - if(!maxlens) return 83; /*alloc fail*/ - - /* compute maxlens: max total bit length of symbols sharing prefix in the first table*/ - lodepng_memset(maxlens, 0, headsize * sizeof(*maxlens)); - for(i = 0; i < tree->numcodes; i++) { - unsigned symbol = tree->codes[i]; - unsigned l = tree->lengths[i]; - unsigned index; - if(l <= FIRSTBITS) continue; /*symbols that fit in first table don't increase secondary table size*/ - /*get the FIRSTBITS MSBs, the MSBs of the symbol are encoded first. See later comment about the reversing*/ - index = reverseBits(symbol >> (l - FIRSTBITS), FIRSTBITS); - maxlens[index] = LODEPNG_MAX(maxlens[index], l); - } - /* compute total table size: size of first table plus all secondary tables for symbols longer than FIRSTBITS */ - size = headsize; - for(i = 0; i < headsize; ++i) { - unsigned l = maxlens[i]; - if(l > FIRSTBITS) size += (((size_t)1) << (l - FIRSTBITS)); - } - tree->table_len = (unsigned char *)lodepng_malloc(size * sizeof(*tree->table_len)); - tree->table_value = (unsigned short *)lodepng_malloc(size * sizeof(*tree->table_value)); - if(!tree->table_len || !tree->table_value) { - lodepng_free(maxlens); - /* freeing tree->table values is done at a higher scope */ - return 83; /*alloc fail*/ - } - /*initialize with an invalid length to indicate unused entries*/ - for(i = 0; i < size; ++i) tree->table_len[i] = 16; - - /*fill in the first table for long symbols: max prefix size and pointer to secondary tables*/ - pointer = headsize; - for(i = 0; i < headsize; ++i) { - unsigned l = maxlens[i]; - if(l <= FIRSTBITS) continue; - tree->table_len[i] = l; - tree->table_value[i] = (unsigned short)pointer; - pointer += (((size_t)1) << (l - FIRSTBITS)); - } - lodepng_free(maxlens); - - /*fill in the first table for short symbols, or secondary table for long symbols*/ - numpresent = 0; - for(i = 0; i < tree->numcodes; ++i) { - unsigned l = tree->lengths[i]; - unsigned symbol, reverse; - if(l == 0) continue; - symbol = tree->codes[i]; /*the huffman bit pattern. i itself is the value.*/ - /*reverse bits, because the huffman bits are given in MSB first order but the bit reader reads LSB first*/ - reverse = reverseBits(symbol, l); - numpresent++; - - if(l <= FIRSTBITS) { - /*short symbol, fully in first table, replicated num times if l < FIRSTBITS*/ - unsigned num = 1u << (FIRSTBITS - l); - unsigned j; - for(j = 0; j < num; ++j) { - /*bit reader will read the l bits of symbol first, the remaining FIRSTBITS - l bits go to the MSB's*/ - unsigned index = reverse | (j << l); - if(tree->table_len[index] != 16) return 55; /*invalid tree: long symbol shares prefix with short symbol*/ - tree->table_len[index] = l; - tree->table_value[index] = (unsigned short)i; - } - } - else { - /*long symbol, shares prefix with other long symbols in first lookup table, needs second lookup*/ - /*the FIRSTBITS MSBs of the symbol are the first table index*/ - unsigned index = reverse & mask; - unsigned maxlen = tree->table_len[index]; - /*log2 of secondary table length, should be >= l - FIRSTBITS*/ - unsigned tablelen = maxlen - FIRSTBITS; - unsigned start = tree->table_value[index]; /*starting index in secondary table*/ - unsigned num = 1u << (tablelen - (l - FIRSTBITS)); /*amount of entries of this symbol in secondary table*/ - unsigned j; - if(maxlen < l) return 55; /*invalid tree: long symbol shares prefix with short symbol*/ - for(j = 0; j < num; ++j) { - unsigned reverse2 = reverse >> FIRSTBITS; /* l - FIRSTBITS bits */ - unsigned index2 = start + (reverse2 | (j << (l - FIRSTBITS))); - tree->table_len[index2] = l; - tree->table_value[index2] = (unsigned short)i; - } - } - } - - if(numpresent < 2) { - /* In case of exactly 1 symbol, in theory the huffman symbol needs 0 bits, - but deflate uses 1 bit instead. In case of 0 symbols, no symbols can - appear at all, but such huffman tree could still exist (e.g. if distance - codes are never used). In both cases, not all symbols of the table will be - filled in. Fill them in with an invalid symbol value so returning them from - huffmanDecodeSymbol will cause error. */ - for(i = 0; i < size; ++i) { - if(tree->table_len[i] == 16) { - /* As length, use a value smaller than FIRSTBITS for the head table, - and a value larger than FIRSTBITS for the secondary table, to ensure - valid behavior for advanceBits when reading this symbol. */ - tree->table_len[i] = (i < headsize) ? 1 : (FIRSTBITS + 1); - tree->table_value[i] = INVALIDSYMBOL; - } - } - } - else { - /* A good huffman tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. - If that is not the case (due to too long length codes), the table will not - have been fully used, and this is an error (not all bit combinations can be - decoded): an oversubscribed huffman tree, indicated by error 55. */ - for(i = 0; i < size; ++i) { - if(tree->table_len[i] == 16) return 55; - } - } - - return 0; -} - -/* -Second step for the ...makeFromLengths and ...makeFromFrequencies functions. -numcodes, lengths and maxbitlen must already be filled in correctly. return -value is error. -*/ -static unsigned HuffmanTree_makeFromLengths2(HuffmanTree * tree) -{ - unsigned * blcount; - unsigned * nextcode; - unsigned error = 0; - unsigned bits, n; - - tree->codes = (unsigned *)lodepng_malloc(tree->numcodes * sizeof(unsigned)); - blcount = (unsigned *)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned)); - nextcode = (unsigned *)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned)); - if(!tree->codes || !blcount || !nextcode) error = 83; /*alloc fail*/ - - if(!error) { - for(n = 0; n != tree->maxbitlen + 1; n++) blcount[n] = nextcode[n] = 0; - /*step 1: count number of instances of each code length*/ - for(bits = 0; bits != tree->numcodes; ++bits) ++blcount[tree->lengths[bits]]; - /*step 2: generate the nextcode values*/ - for(bits = 1; bits <= tree->maxbitlen; ++bits) { - nextcode[bits] = (nextcode[bits - 1] + blcount[bits - 1]) << 1u; - } - /*step 3: generate all the codes*/ - for(n = 0; n != tree->numcodes; ++n) { - if(tree->lengths[n] != 0) { - tree->codes[n] = nextcode[tree->lengths[n]]++; - /*remove superfluous bits from the code*/ - tree->codes[n] &= ((1u << tree->lengths[n]) - 1u); - } - } - } - - lodepng_free(blcount); - lodepng_free(nextcode); - - if(!error) error = HuffmanTree_makeTable(tree); - return error; -} - -/* -given the code lengths (as stored in the PNG file), generate the tree as defined -by Deflate. maxbitlen is the maximum bits that a code in the tree can have. -return value is error. -*/ -static unsigned HuffmanTree_makeFromLengths(HuffmanTree * tree, const unsigned * bitlen, - size_t numcodes, unsigned maxbitlen) -{ - unsigned i; - tree->lengths = (unsigned *)lodepng_malloc(numcodes * sizeof(unsigned)); - if(!tree->lengths) return 83; /*alloc fail*/ - for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i]; - tree->numcodes = (unsigned)numcodes; /*number of symbols*/ - tree->maxbitlen = maxbitlen; - return HuffmanTree_makeFromLengths2(tree); -} - -#ifdef LODEPNG_COMPILE_ENCODER - -/*BPM: Boundary Package Merge, see "A Fast and Space-Economical Algorithm for Length-Limited Coding", -Jyrki Katajainen, Alistair Moffat, Andrew Turpin, 1995.*/ - -/*chain node for boundary package merge*/ -typedef struct BPMNode { - int weight; /*the sum of all weights in this chain*/ - unsigned index; /*index of this leaf node (called "count" in the paper)*/ - struct BPMNode * tail; /*the next nodes in this chain (null if last)*/ - int in_use; -} BPMNode; - -/*lists of chains*/ -typedef struct BPMLists { - /*memory pool*/ - unsigned memsize; - BPMNode * memory; - unsigned numfree; - unsigned nextfree; - BPMNode ** freelist; - /*two heads of lookahead chains per list*/ - unsigned listsize; - BPMNode ** chains0; - BPMNode ** chains1; -} BPMLists; - -/*creates a new chain node with the given parameters, from the memory in the lists */ -static BPMNode * bpmnode_create(BPMLists * lists, int weight, unsigned index, BPMNode * tail) -{ - unsigned i; - BPMNode * result; - - /*memory full, so garbage collect*/ - if(lists->nextfree >= lists->numfree) { - /*mark only those that are in use*/ - for(i = 0; i != lists->memsize; ++i) lists->memory[i].in_use = 0; - for(i = 0; i != lists->listsize; ++i) { - BPMNode * node; - for(node = lists->chains0[i]; node != 0; node = node->tail) node->in_use = 1; - for(node = lists->chains1[i]; node != 0; node = node->tail) node->in_use = 1; - } - /*collect those that are free*/ - lists->numfree = 0; - for(i = 0; i != lists->memsize; ++i) { - if(!lists->memory[i].in_use) lists->freelist[lists->numfree++] = &lists->memory[i]; - } - lists->nextfree = 0; - } - - result = lists->freelist[lists->nextfree++]; - result->weight = weight; - result->index = index; - result->tail = tail; - return result; -} - -/*sort the leaves with stable mergesort*/ -static void bpmnode_sort(BPMNode * leaves, size_t num) -{ - BPMNode * mem = (BPMNode *)lodepng_malloc(sizeof(*leaves) * num); - size_t width, counter = 0; - for(width = 1; width < num; width *= 2) { - BPMNode * a = (counter & 1) ? mem : leaves; - BPMNode * b = (counter & 1) ? leaves : mem; - size_t p; - for(p = 0; p < num; p += 2 * width) { - size_t q = (p + width > num) ? num : (p + width); - size_t r = (p + 2 * width > num) ? num : (p + 2 * width); - size_t i = p, j = q, k; - for(k = p; k < r; k++) { - if(i < q && (j >= r || a[i].weight <= a[j].weight)) b[k] = a[i++]; - else b[k] = a[j++]; - } - } - counter++; - } - if(counter & 1) lodepng_memcpy(leaves, mem, sizeof(*leaves) * num); - lodepng_free(mem); -} - -/*Boundary Package Merge step, numpresent is the amount of leaves, and c is the current chain.*/ -static void boundaryPM(BPMLists * lists, BPMNode * leaves, size_t numpresent, int c, int num) -{ - unsigned lastindex = lists->chains1[c]->index; - - if(c == 0) { - if(lastindex >= numpresent) return; - lists->chains0[c] = lists->chains1[c]; - lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, 0); - } - else { - /*sum of the weights of the head nodes of the previous lookahead chains.*/ - int sum = lists->chains0[c - 1]->weight + lists->chains1[c - 1]->weight; - lists->chains0[c] = lists->chains1[c]; - if(lastindex < numpresent && sum > leaves[lastindex].weight) { - lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, lists->chains1[c]->tail); - return; - } - lists->chains1[c] = bpmnode_create(lists, sum, lastindex, lists->chains1[c - 1]); - /*in the end we are only interested in the chain of the last list, so no - need to recurse if we're at the last one (this gives measurable speedup)*/ - if(num + 1 < (int)(2 * numpresent - 2)) { - boundaryPM(lists, leaves, numpresent, c - 1, num); - boundaryPM(lists, leaves, numpresent, c - 1, num); - } - } -} - -unsigned lodepng_huffman_code_lengths(unsigned * lengths, const unsigned * frequencies, - size_t numcodes, unsigned maxbitlen) -{ - unsigned error = 0; - unsigned i; - size_t numpresent = 0; /*number of symbols with non-zero frequency*/ - BPMNode * leaves; /*the symbols, only those with > 0 frequency*/ - - if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ - if((1u << maxbitlen) < (unsigned)numcodes) return 80; /*error: represent all symbols*/ - - leaves = (BPMNode *)lodepng_malloc(numcodes * sizeof(*leaves)); - if(!leaves) return 83; /*alloc fail*/ - - for(i = 0; i != numcodes; ++i) { - if(frequencies[i] > 0) { - leaves[numpresent].weight = (int)frequencies[i]; - leaves[numpresent].index = i; - ++numpresent; - } - } - - lodepng_memset(lengths, 0, numcodes * sizeof(*lengths)); - - /*ensure at least two present symbols. There should be at least one symbol - according to RFC 1951 section 3.2.7. Some decoders incorrectly require two. To - make these work as well ensure there are at least two symbols. The - Package-Merge code below also doesn't work correctly if there's only one - symbol, it'd give it the theoretical 0 bits but in practice zlib wants 1 bit*/ - if(numpresent == 0) { - lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/ - } - else if(numpresent == 1) { - lengths[leaves[0].index] = 1; - lengths[leaves[0].index == 0 ? 1 : 0] = 1; - } - else { - BPMLists lists; - BPMNode * node; - - bpmnode_sort(leaves, numpresent); - - lists.listsize = maxbitlen; - lists.memsize = 2 * maxbitlen * (maxbitlen + 1); - lists.nextfree = 0; - lists.numfree = lists.memsize; - lists.memory = (BPMNode *)lodepng_malloc(lists.memsize * sizeof(*lists.memory)); - lists.freelist = (BPMNode **)lodepng_malloc(lists.memsize * sizeof(BPMNode *)); - lists.chains0 = (BPMNode **)lodepng_malloc(lists.listsize * sizeof(BPMNode *)); - lists.chains1 = (BPMNode **)lodepng_malloc(lists.listsize * sizeof(BPMNode *)); - if(!lists.memory || !lists.freelist || !lists.chains0 || !lists.chains1) error = 83; /*alloc fail*/ - - if(!error) { - for(i = 0; i != lists.memsize; ++i) lists.freelist[i] = &lists.memory[i]; - - bpmnode_create(&lists, leaves[0].weight, 1, 0); - bpmnode_create(&lists, leaves[1].weight, 2, 0); - - for(i = 0; i != lists.listsize; ++i) { - lists.chains0[i] = &lists.memory[0]; - lists.chains1[i] = &lists.memory[1]; - } - - /*each boundaryPM call adds one chain to the last list, and we need 2 * numpresent - 2 chains.*/ - for(i = 2; i != 2 * numpresent - 2; ++i) boundaryPM(&lists, leaves, numpresent, (int)maxbitlen - 1, (int)i); - - for(node = lists.chains1[maxbitlen - 1]; node; node = node->tail) { - for(i = 0; i != node->index; ++i) ++lengths[leaves[i].index]; - } - } - - lodepng_free(lists.memory); - lodepng_free(lists.freelist); - lodepng_free(lists.chains0); - lodepng_free(lists.chains1); - } - - lodepng_free(leaves); - return error; -} - -/*Create the Huffman tree given the symbol frequencies*/ -static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree * tree, const unsigned * frequencies, - size_t mincodes, size_t numcodes, unsigned maxbitlen) -{ - unsigned error = 0; - while(!frequencies[numcodes - 1] && numcodes > mincodes) --numcodes; /*trim zeroes*/ - tree->lengths = (unsigned *)lodepng_malloc(numcodes * sizeof(unsigned)); - if(!tree->lengths) return 83; /*alloc fail*/ - tree->maxbitlen = maxbitlen; - tree->numcodes = (unsigned)numcodes; /*number of symbols*/ - - error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); - if(!error) error = HuffmanTree_makeFromLengths2(tree); - return error; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/ -static unsigned generateFixedLitLenTree(HuffmanTree * tree) -{ - unsigned i, error = 0; - unsigned * bitlen = (unsigned *)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); - if(!bitlen) return 83; /*alloc fail*/ - - /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ - for(i = 0; i <= 143; ++i) bitlen[i] = 8; - for(i = 144; i <= 255; ++i) bitlen[i] = 9; - for(i = 256; i <= 279; ++i) bitlen[i] = 7; - for(i = 280; i <= 287; ++i) bitlen[i] = 8; - - error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); - - lodepng_free(bitlen); - return error; -} - -/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/ -static unsigned generateFixedDistanceTree(HuffmanTree * tree) -{ - unsigned i, error = 0; - unsigned * bitlen = (unsigned *)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); - if(!bitlen) return 83; /*alloc fail*/ - - /*there are 32 distance codes, but 30-31 are unused*/ - for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen[i] = 5; - error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); - - lodepng_free(bitlen); - return error; -} - -#ifdef LODEPNG_COMPILE_DECODER - -/* -returns the code. The bit reader must already have been ensured at least 15 bits -*/ -static unsigned huffmanDecodeSymbol(LodePNGBitReader * reader, const HuffmanTree * codetree) -{ - unsigned short code = peekBits(reader, FIRSTBITS); - unsigned short l = codetree->table_len[code]; - unsigned short value = codetree->table_value[code]; - if(l <= FIRSTBITS) { - advanceBits(reader, l); - return value; - } - else { - advanceBits(reader, FIRSTBITS); - value += peekBits(reader, l - FIRSTBITS); - advanceBits(reader, codetree->table_len[value] - FIRSTBITS); - return codetree->table_value[value]; - } -} -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Inflator (Decompressor) / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*get the tree of a deflated block with fixed tree, as specified in the deflate specification -Returns error code.*/ -static unsigned getTreeInflateFixed(HuffmanTree * tree_ll, HuffmanTree * tree_d) -{ - unsigned error = generateFixedLitLenTree(tree_ll); - if(error) return error; - return generateFixedDistanceTree(tree_d); -} - -/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/ -static unsigned getTreeInflateDynamic(HuffmanTree * tree_ll, HuffmanTree * tree_d, - LodePNGBitReader * reader) -{ - /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/ - unsigned error = 0; - unsigned n, HLIT, HDIST, HCLEN, i; - - /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/ - unsigned * bitlen_ll = 0; /*lit,len code lengths*/ - unsigned * bitlen_d = 0; /*dist code lengths*/ - /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/ - unsigned * bitlen_cl = 0; - HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ - - if(reader->bitsize - reader->bp < 14) return 49; /*error: the bit pointer is or will go past the memory*/ - ensureBits17(reader, 14); - - /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ - HLIT = readBits(reader, 5) + 257; - /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/ - HDIST = readBits(reader, 5) + 1; - /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ - HCLEN = readBits(reader, 4) + 4; - - bitlen_cl = (unsigned *)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); - if(!bitlen_cl) return 83 /*alloc fail*/; - - HuffmanTree_init(&tree_cl); - - while(!error) { - /*read the code length codes out of 3 * (amount of code length codes) bits*/ - if(lodepng_gtofl(reader->bp, HCLEN * 3, reader->bitsize)) { - ERROR_BREAK(50); /*error: the bit pointer is or will go past the memory*/ - } - for(i = 0; i != HCLEN; ++i) { - ensureBits9(reader, 3); /*out of bounds already checked above */ - bitlen_cl[CLCL_ORDER[i]] = readBits(reader, 3); - } - for(i = HCLEN; i != NUM_CODE_LENGTH_CODES; ++i) { - bitlen_cl[CLCL_ORDER[i]] = 0; - } - - error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7); - if(error) break; - - /*now we can use this tree to read the lengths for the tree that this function will return*/ - bitlen_ll = (unsigned *)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); - bitlen_d = (unsigned *)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); - if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); - lodepng_memset(bitlen_ll, 0, NUM_DEFLATE_CODE_SYMBOLS * sizeof(*bitlen_ll)); - lodepng_memset(bitlen_d, 0, NUM_DISTANCE_SYMBOLS * sizeof(*bitlen_d)); - - /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ - i = 0; - while(i < HLIT + HDIST) { - unsigned code; - ensureBits25(reader, 22); /* up to 15 bits for huffman code, up to 7 extra bits below*/ - code = huffmanDecodeSymbol(reader, &tree_cl); - if(code <= 15) { /*a length code*/ - if(i < HLIT) bitlen_ll[i] = code; - else bitlen_d[i - HLIT] = code; - ++i; - } - else if(code == 16) { /*repeat previous*/ - unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ - unsigned value; /*set value to the previous code*/ - - if(i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ - - replength += readBits(reader, 2); - - if(i < HLIT + 1) value = bitlen_ll[i - 1]; - else value = bitlen_d[i - HLIT - 1]; - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; ++n) { - if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ - if(i < HLIT) bitlen_ll[i] = value; - else bitlen_d[i - HLIT] = value; - ++i; - } - } - else if(code == 17) { /*repeat "0" 3-10 times*/ - unsigned replength = 3; /*read in the bits that indicate repeat length*/ - replength += readBits(reader, 3); - - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; ++n) { - if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ - - if(i < HLIT) bitlen_ll[i] = 0; - else bitlen_d[i - HLIT] = 0; - ++i; - } - } - else if(code == 18) { /*repeat "0" 11-138 times*/ - unsigned replength = 11; /*read in the bits that indicate repeat length*/ - replength += readBits(reader, 7); - - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; ++n) { - if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ - - if(i < HLIT) bitlen_ll[i] = 0; - else bitlen_d[i - HLIT] = 0; - ++i; - } - } - else { /*if(code == INVALIDSYMBOL)*/ - ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ - } - /*check if any of the ensureBits above went out of bounds*/ - if(reader->bp > reader->bitsize) { - /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol - (10=no endcode, 11=wrong jump outside of tree)*/ - /* TODO: revise error codes 10,11,50: the above comment is no longer valid */ - ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ - } - } - if(error) break; - - if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/ - - /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/ - error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15); - if(error) break; - error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15); - - break; /*end of error-while*/ - } - - lodepng_free(bitlen_cl); - lodepng_free(bitlen_ll); - lodepng_free(bitlen_d); - HuffmanTree_cleanup(&tree_cl); - - return error; -} - -/*inflate a block with dynamic of fixed Huffman tree. btype must be 1 or 2.*/ -static unsigned inflateHuffmanBlock(ucvector * out, LodePNGBitReader * reader, - unsigned btype, size_t max_output_size) -{ - unsigned error = 0; - HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/ - HuffmanTree tree_d; /*the huffman tree for distance codes*/ - const size_t reserved_size = - 260; /* must be at least 258 for max length, and a few extra for adding a few extra literals */ - int done = 0; - - if(!ucvector_reserve(out, out->size + reserved_size)) return 83; /*alloc fail*/ - - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - - if(btype == 1) error = getTreeInflateFixed(&tree_ll, &tree_d); - else /*if(btype == 2)*/ error = getTreeInflateDynamic(&tree_ll, &tree_d, reader); - - - while(!error && !done) { /*decode all symbols until end reached, breaks at end code*/ - /*code_ll is literal, length or end code*/ - unsigned code_ll; - /* ensure enough bits for 2 huffman code reads (15 bits each): if the first is a literal, a second literal is read at once. This - appears to be slightly faster, than ensuring 20 bits here for 1 huffman symbol and the potential 5 extra bits for the length symbol.*/ - ensureBits32(reader, 30); - code_ll = huffmanDecodeSymbol(reader, &tree_ll); - if(code_ll <= 255) { - /*slightly faster code path if multiple literals in a row*/ - out->data[out->size++] = (unsigned char)code_ll; - code_ll = huffmanDecodeSymbol(reader, &tree_ll); - } - if(code_ll <= 255) { /*literal symbol*/ - out->data[out->size++] = (unsigned char)code_ll; - } - else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) { /*length code*/ - unsigned code_d, distance; - unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/ - size_t start, backward, length; - - /*part 1: get length base*/ - length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX]; - - /*part 2: get extra bits and add the value of that to length*/ - numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; - if(numextrabits_l != 0) { - /* bits already ensured above */ - ensureBits25(reader, 5); - length += readBits(reader, numextrabits_l); - } - - /*part 3: get distance code*/ - ensureBits32(reader, 28); /* up to 15 for the huffman symbol, up to 13 for the extra bits */ - code_d = huffmanDecodeSymbol(reader, &tree_d); - if(code_d > 29) { - if(code_d <= 31) { - ERROR_BREAK(18); /*error: invalid distance code (30-31 are never used)*/ - } - else { /* if(code_d == INVALIDSYMBOL) */ - ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ - } - } - distance = DISTANCEBASE[code_d]; - - /*part 4: get extra bits from distance*/ - numextrabits_d = DISTANCEEXTRA[code_d]; - if(numextrabits_d != 0) { - /* bits already ensured above */ - distance += readBits(reader, numextrabits_d); - } - - /*part 5: fill in all the out[n] values based on the length and dist*/ - start = out->size; - if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ - backward = start - distance; - - out->size += length; - if(distance < length) { - size_t forward; - lodepng_memcpy(out->data + start, out->data + backward, distance); - start += distance; - for(forward = distance; forward < length; ++forward) { - out->data[start++] = out->data[backward++]; - } - } - else { - lodepng_memcpy(out->data + start, out->data + backward, length); - } - } - else if(code_ll == 256) { - done = 1; /*end code, finish the loop*/ - } - else { /*if(code_ll == INVALIDSYMBOL)*/ - ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ - } - if(out->allocsize - out->size < reserved_size) { - if(!ucvector_reserve(out, out->size + reserved_size)) ERROR_BREAK(83); /*alloc fail*/ - } - /*check if any of the ensureBits above went out of bounds*/ - if(reader->bp > reader->bitsize) { - /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol - (10=no endcode, 11=wrong jump outside of tree)*/ - /* TODO: revise error codes 10,11,50: the above comment is no longer valid */ - ERROR_BREAK(51); /*error, bit pointer jumps past memory*/ - } - if(max_output_size && out->size > max_output_size) { - ERROR_BREAK(109); /*error, larger than max size*/ - } - } - - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - - return error; -} - -static unsigned inflateNoCompression(ucvector * out, LodePNGBitReader * reader, - const LodePNGDecompressSettings * settings) -{ - size_t bytepos; - size_t size = reader->size; - unsigned LEN, NLEN, error = 0; - - /*go to first boundary of byte*/ - bytepos = (reader->bp + 7u) >> 3u; - - /*read LEN (2 bytes) and NLEN (2 bytes)*/ - if(bytepos + 4 >= size) return 52; /*error, bit pointer will jump past memory*/ - LEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); - bytepos += 2; - NLEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); - bytepos += 2; - - /*check if 16-bit NLEN is really the one's complement of LEN*/ - if(!settings->ignore_nlen && LEN + NLEN != 65535) { - return 21; /*error: NLEN is not one's complement of LEN*/ - } - - if(!ucvector_resize(out, out->size + LEN)) return 83; /*alloc fail*/ - - /*read the literal data: LEN bytes are now stored in the out buffer*/ - if(bytepos + LEN > size) return 23; /*error: reading outside of in buffer*/ - - /*out->data can be NULL (when LEN is zero), and arithmetics on NULL ptr is undefined*/ - if(LEN) { - lodepng_memcpy(out->data + out->size - LEN, reader->data + bytepos, LEN); - bytepos += LEN; - } - - reader->bp = bytepos << 3u; - - return error; -} - -static unsigned lodepng_inflatev(ucvector * out, - const unsigned char * in, size_t insize, - const LodePNGDecompressSettings * settings) -{ - unsigned BFINAL = 0; - LodePNGBitReader reader; - unsigned error = LodePNGBitReader_init(&reader, in, insize); - - if(error) return error; - - while(!BFINAL) { - unsigned BTYPE; - if(reader.bitsize - reader.bp < 3) return 52; /*error, bit pointer will jump past memory*/ - ensureBits9(&reader, 3); - BFINAL = readBits(&reader, 1); - BTYPE = readBits(&reader, 2); - - if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ - else if(BTYPE == 0) error = inflateNoCompression(out, &reader, settings); /*no compression*/ - else error = inflateHuffmanBlock(out, &reader, BTYPE, settings->max_output_size); /*compression, BTYPE 01 or 10*/ - if(!error && settings->max_output_size && out->size > settings->max_output_size) error = 109; - if(error) break; - } - - return error; -} - -unsigned lodepng_inflate(unsigned char ** out, size_t * outsize, - const unsigned char * in, size_t insize, - const LodePNGDecompressSettings * settings) -{ - ucvector v = ucvector_init(*out, *outsize); - unsigned error = lodepng_inflatev(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; -} - -static unsigned inflatev(ucvector * out, const unsigned char * in, size_t insize, - const LodePNGDecompressSettings * settings) -{ - if(settings->custom_inflate) { - unsigned error = settings->custom_inflate(&out->data, &out->size, in, insize, settings); - out->allocsize = out->size; - if(error) { - /*the custom inflate is allowed to have its own error codes, however, we translate it to code 110*/ - error = 110; - /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/ - if(settings->max_output_size && out->size > settings->max_output_size) error = 109; - } - return error; - } - else { - return lodepng_inflatev(out, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Deflator (Compressor) / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -static const unsigned MAX_SUPPORTED_DEFLATE_LENGTH = 258; - -/*search the index in the array, that has the largest value smaller than or equal to the given value, -given array must be sorted (if no value is smaller, it returns the size of the given array)*/ -static size_t searchCodeIndex(const unsigned * array, size_t array_size, size_t value) -{ - /*binary search (only small gain over linear). TODO: use CPU log2 instruction for getting symbols instead*/ - size_t left = 1; - size_t right = array_size - 1; - - while(left <= right) { - size_t mid = (left + right) >> 1; - if(array[mid] >= value) right = mid - 1; - else left = mid + 1; - } - if(left >= array_size || array[left] > value) left--; - return left; -} - -static void addLengthDistance(uivector * values, size_t length, size_t distance) -{ - /*values in encoded vector are those used by deflate: - 0-255: literal bytes - 256: end - 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits) - 286-287: invalid*/ - - unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length); - unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]); - unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance); - unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]); - - size_t pos = values->size; - /*TODO: return error when this fails (out of memory)*/ - unsigned ok = uivector_resize(values, values->size + 4); - if(ok) { - values->data[pos + 0] = length_code + FIRST_LENGTH_CODE_INDEX; - values->data[pos + 1] = extra_length; - values->data[pos + 2] = dist_code; - values->data[pos + 3] = extra_distance; - } -} - -/*3 bytes of data get encoded into two bytes. The hash cannot use more than 3 -bytes as input because 3 is the minimum match length for deflate*/ -static const unsigned HASH_NUM_VALUES = 65536; -static const unsigned HASH_BIT_MASK = 65535; /*HASH_NUM_VALUES - 1, but C90 does not like that as initializer*/ - -typedef struct Hash { - int * head; /*hash value to head circular pos - can be outdated if went around window*/ - /*circular pos to prev circular pos*/ - unsigned short * chain; - int * val; /*circular pos to hash value*/ - - /*TODO: do this not only for zeros but for any repeated byte. However for PNG - it's always going to be the zeros that dominate, so not important for PNG*/ - int * headz; /*similar to head, but for chainz*/ - unsigned short * chainz; /*those with same amount of zeros*/ - unsigned short * zeros; /*length of zeros streak, used as a second hash chain*/ -} Hash; - -static unsigned hash_init(Hash * hash, unsigned windowsize) -{ - unsigned i; - hash->head = (int *)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES); - hash->val = (int *)lodepng_malloc(sizeof(int) * windowsize); - hash->chain = (unsigned short *)lodepng_malloc(sizeof(unsigned short) * windowsize); - - hash->zeros = (unsigned short *)lodepng_malloc(sizeof(unsigned short) * windowsize); - hash->headz = (int *)lodepng_malloc(sizeof(int) * (MAX_SUPPORTED_DEFLATE_LENGTH + 1)); - hash->chainz = (unsigned short *)lodepng_malloc(sizeof(unsigned short) * windowsize); - - if(!hash->head || !hash->chain || !hash->val || !hash->headz || !hash->chainz || !hash->zeros) { - return 83; /*alloc fail*/ - } - - /*initialize hash table*/ - for(i = 0; i != HASH_NUM_VALUES; ++i) hash->head[i] = -1; - for(i = 0; i != windowsize; ++i) hash->val[i] = -1; - for(i = 0; i != windowsize; ++i) hash->chain[i] = i; /*same value as index indicates uninitialized*/ - - for(i = 0; i <= MAX_SUPPORTED_DEFLATE_LENGTH; ++i) hash->headz[i] = -1; - for(i = 0; i != windowsize; ++i) hash->chainz[i] = i; /*same value as index indicates uninitialized*/ - - return 0; -} - -static void hash_cleanup(Hash * hash) -{ - lodepng_free(hash->head); - lodepng_free(hash->val); - lodepng_free(hash->chain); - - lodepng_free(hash->zeros); - lodepng_free(hash->headz); - lodepng_free(hash->chainz); -} - - - -static unsigned getHash(const unsigned char * data, size_t size, size_t pos) -{ - unsigned result = 0; - if(pos + 2 < size) { - /*A simple shift and xor hash is used. Since the data of PNGs is dominated - by zeroes due to the filters, a better hash does not have a significant - effect on speed in traversing the chain, and causes more time spend on - calculating the hash.*/ - result ^= ((unsigned)data[pos + 0] << 0u); - result ^= ((unsigned)data[pos + 1] << 4u); - result ^= ((unsigned)data[pos + 2] << 8u); - } - else { - size_t amount, i; - if(pos >= size) return 0; - amount = size - pos; - for(i = 0; i != amount; ++i) result ^= ((unsigned)data[pos + i] << (i * 8u)); - } - return result & HASH_BIT_MASK; -} - -static unsigned countZeros(const unsigned char * data, size_t size, size_t pos) -{ - const unsigned char * start = data + pos; - const unsigned char * end = start + MAX_SUPPORTED_DEFLATE_LENGTH; - if(end > data + size) end = data + size; - data = start; - while(data != end && *data == 0) ++data; - /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/ - return (unsigned)(data - start); -} - -/*wpos = pos & (windowsize - 1)*/ -static void updateHashChain(Hash * hash, size_t wpos, unsigned hashval, unsigned short numzeros) -{ - hash->val[wpos] = (int)hashval; - if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval]; - hash->head[hashval] = (int)wpos; - - hash->zeros[wpos] = numzeros; - if(hash->headz[numzeros] != -1) hash->chainz[wpos] = hash->headz[numzeros]; - hash->headz[numzeros] = (int)wpos; -} - -/* -LZ77-encode the data. Return value is error code. The input are raw bytes, the output -is in the form of unsigned integers with codes representing for example literal bytes, or -length/distance pairs. -It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a -sliding window (of windowsize) is used, and all past bytes in that window can be used as -the "dictionary". A brute force search through all possible distances would be slow, and -this hash technique is one out of several ways to speed this up. -*/ -static unsigned encodeLZ77(uivector * out, Hash * hash, - const unsigned char * in, size_t inpos, size_t insize, unsigned windowsize, - unsigned minmatch, unsigned nicematch, unsigned lazymatching) -{ - size_t pos; - unsigned i, error = 0; - /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ - unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8u; - unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64; - - unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/ - unsigned numzeros = 0; - - unsigned offset; /*the offset represents the distance in LZ77 terminology*/ - unsigned length; - unsigned lazy = 0; - unsigned lazylength = 0, lazyoffset = 0; - unsigned hashval; - unsigned current_offset, current_length; - unsigned prev_offset; - const unsigned char * lastptr, * foreptr, * backptr; - unsigned hashpos; - - if(windowsize == 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/ - if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/ - - if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH; - - for(pos = inpos; pos < insize; ++pos) { - size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/ - unsigned chainlength = 0; - - hashval = getHash(in, insize, pos); - - if(usezeros && hashval == 0) { - if(numzeros == 0) numzeros = countZeros(in, insize, pos); - else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; - } - else { - numzeros = 0; - } - - updateHashChain(hash, wpos, hashval, numzeros); - - /*the length and offset found for the current position*/ - length = 0; - offset = 0; - - hashpos = hash->chain[wpos]; - - lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; - - /*search for the longest string*/ - prev_offset = 0; - for(;;) { - if(chainlength++ >= maxchainlength) break; - current_offset = (unsigned)(hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize); - - if(current_offset < prev_offset) break; /*stop when went completely around the circular buffer*/ - prev_offset = current_offset; - if(current_offset > 0) { - /*test the next characters*/ - foreptr = &in[pos]; - backptr = &in[pos - current_offset]; - - /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ - if(numzeros >= 3) { - unsigned skip = hash->zeros[hashpos]; - if(skip > numzeros) skip = numzeros; - backptr += skip; - foreptr += skip; - } - - while(foreptr != lastptr && *backptr == *foreptr) { /*maximum supported length by deflate is max length*/ - ++backptr; - ++foreptr; - } - current_length = (unsigned)(foreptr - &in[pos]); - - if(current_length > length) { - length = current_length; /*the longest length*/ - offset = current_offset; /*the offset that is related to this longest length*/ - /*jump out once a length of max length is found (speed gain). This also jumps - out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/ - if(current_length >= nicematch) break; - } - } - - if(hashpos == hash->chain[hashpos]) break; - - if(numzeros >= 3 && length > numzeros) { - hashpos = hash->chainz[hashpos]; - if(hash->zeros[hashpos] != numzeros) break; - } - else { - hashpos = hash->chain[hashpos]; - /*outdated hash value, happens if particular value was not encountered in whole last window*/ - if(hash->val[hashpos] != (int)hashval) break; - } - } - - if(lazymatching) { - if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) { - lazy = 1; - lazylength = length; - lazyoffset = offset; - continue; /*try the next byte*/ - } - if(lazy) { - lazy = 0; - if(pos == 0) ERROR_BREAK(81); - if(length > lazylength + 1) { - /*push the previous character as literal*/ - if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/); - } - else { - length = lazylength; - offset = lazyoffset; - hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ - hash->headz[numzeros] = -1; /*idem*/ - --pos; - } - } - } - if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/); - - /*encode it as length/distance pair or literal value*/ - if(length < 3) { /*only lengths of 3 or higher are supported as length/distance pair*/ - if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); - } - else if(length < minmatch || (length == 3 && offset > 4096)) { - /*compensate for the fact that longer offsets have more extra bits, a - length of only 3 may be not worth it then*/ - if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); - } - else { - addLengthDistance(out, length, offset); - for(i = 1; i < length; ++i) { - ++pos; - wpos = pos & (windowsize - 1); - hashval = getHash(in, insize, pos); - if(usezeros && hashval == 0) { - if(numzeros == 0) numzeros = countZeros(in, insize, pos); - else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; - } - else { - numzeros = 0; - } - updateHashChain(hash, wpos, hashval, numzeros); - } - } - } /*end of the loop through each character of input*/ - - return error; -} - -/* /////////////////////////////////////////////////////////////////////////// */ - -static unsigned deflateNoCompression(ucvector * out, const unsigned char * data, size_t datasize) -{ - /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, - 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/ - - size_t i, numdeflateblocks = (datasize + 65534u) / 65535u; - unsigned datapos = 0; - for(i = 0; i != numdeflateblocks; ++i) { - unsigned BFINAL, BTYPE, LEN, NLEN; - unsigned char firstbyte; - size_t pos = out->size; - - BFINAL = (i == numdeflateblocks - 1); - BTYPE = 0; - - LEN = 65535; - if(datasize - datapos < 65535u) LEN = (unsigned)datasize - datapos; - NLEN = 65535 - LEN; - - if(!ucvector_resize(out, out->size + LEN + 5)) return 83; /*alloc fail*/ - - firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1u) << 1u) + ((BTYPE & 2u) << 1u)); - out->data[pos + 0] = firstbyte; - out->data[pos + 1] = (unsigned char)(LEN & 255); - out->data[pos + 2] = (unsigned char)(LEN >> 8u); - out->data[pos + 3] = (unsigned char)(NLEN & 255); - out->data[pos + 4] = (unsigned char)(NLEN >> 8u); - lodepng_memcpy(out->data + pos + 5, data + datapos, LEN); - datapos += LEN; - } - - return 0; -} - -/* -write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees. -tree_ll: the tree for lit and len codes. -tree_d: the tree for distance codes. -*/ -static void writeLZ77data(LodePNGBitWriter * writer, const uivector * lz77_encoded, - const HuffmanTree * tree_ll, const HuffmanTree * tree_d) -{ - size_t i = 0; - for(i = 0; i != lz77_encoded->size; ++i) { - unsigned val = lz77_encoded->data[i]; - writeBitsReversed(writer, tree_ll->codes[val], tree_ll->lengths[val]); - if(val > 256) { /*for a length code, 3 more things have to be added*/ - unsigned length_index = val - FIRST_LENGTH_CODE_INDEX; - unsigned n_length_extra_bits = LENGTHEXTRA[length_index]; - unsigned length_extra_bits = lz77_encoded->data[++i]; - - unsigned distance_code = lz77_encoded->data[++i]; - - unsigned distance_index = distance_code; - unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index]; - unsigned distance_extra_bits = lz77_encoded->data[++i]; - - writeBits(writer, length_extra_bits, n_length_extra_bits); - writeBitsReversed(writer, tree_d->codes[distance_code], tree_d->lengths[distance_code]); - writeBits(writer, distance_extra_bits, n_distance_extra_bits); - } - } -} - -/*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ -static unsigned deflateDynamic(LodePNGBitWriter * writer, Hash * hash, - const unsigned char * data, size_t datapos, size_t dataend, - const LodePNGCompressSettings * settings, unsigned final) -{ - unsigned error = 0; - - /* - A block is compressed as follows: The PNG data is lz77 encoded, resulting in - literal bytes and length/distance pairs. This is then huffman compressed with - two huffman trees. One huffman tree is used for the lit and len values ("ll"), - another huffman tree is used for the dist values ("d"). These two trees are - stored using their code lengths, and to compress even more these code lengths - are also run-length encoded and huffman compressed. This gives a huffman tree - of code lengths "cl". The code lengths used to describe this third tree are - the code length code lengths ("clcl"). - */ - - /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/ - uivector lz77_encoded; - HuffmanTree tree_ll; /*tree for lit,len values*/ - HuffmanTree tree_d; /*tree for distance codes*/ - HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/ - unsigned * frequencies_ll = 0; /*frequency of lit,len codes*/ - unsigned * frequencies_d = 0; /*frequency of dist codes*/ - unsigned * frequencies_cl = 0; /*frequency of code length codes*/ - unsigned * bitlen_lld = 0; /*lit,len,dist code lengths (int bits), literally (without repeat codes).*/ - unsigned * bitlen_lld_e = 0; /*bitlen_lld encoded with repeat codes (this is a rudimentary run length compression)*/ - size_t datasize = dataend - datapos; - - /* - If we could call "bitlen_cl" the code length code lengths ("clcl"), that is the bit lengths of codes to represent - tree_cl in CLCL_ORDER, then due to the huffman compression of huffman tree representations ("two levels"), there are - some analogies: - bitlen_lld is to tree_cl what data is to tree_ll and tree_d. - bitlen_lld_e is to bitlen_lld what lz77_encoded is to data. - bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded. - */ - - unsigned BFINAL = final; - size_t i; - size_t numcodes_ll, numcodes_d, numcodes_lld, numcodes_lld_e, numcodes_cl; - unsigned HLIT, HDIST, HCLEN; - - uivector_init(&lz77_encoded); - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - HuffmanTree_init(&tree_cl); - /* could fit on stack, but >1KB is on the larger side so allocate instead */ - frequencies_ll = (unsigned *)lodepng_malloc(286 * sizeof(*frequencies_ll)); - frequencies_d = (unsigned *)lodepng_malloc(30 * sizeof(*frequencies_d)); - frequencies_cl = (unsigned *)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl)); - - if(!frequencies_ll || !frequencies_d || !frequencies_cl) error = 83; /*alloc fail*/ - - /*This while loop never loops due to a break at the end, it is here to - allow breaking out of it to the cleanup phase on error conditions.*/ - while(!error) { - lodepng_memset(frequencies_ll, 0, 286 * sizeof(*frequencies_ll)); - lodepng_memset(frequencies_d, 0, 30 * sizeof(*frequencies_d)); - lodepng_memset(frequencies_cl, 0, NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl)); - - if(settings->use_lz77) { - error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, - settings->minmatch, settings->nicematch, settings->lazymatching); - if(error) break; - } - else { - if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); - for(i = datapos; i < dataend; - ++i) lz77_encoded.data[i - datapos] = data[i]; /*no LZ77, but still will be Huffman compressed*/ - } - - /*Count the frequencies of lit, len and dist codes*/ - for(i = 0; i != lz77_encoded.size; ++i) { - unsigned symbol = lz77_encoded.data[i]; - ++frequencies_ll[symbol]; - if(symbol > 256) { - unsigned dist = lz77_encoded.data[i + 2]; - ++frequencies_d[dist]; - i += 3; - } - } - frequencies_ll[256] = 1; /*there will be exactly 1 end code, at the end of the block*/ - - /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/ - error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll, 257, 286, 15); - if(error) break; - /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/ - error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d, 2, 30, 15); - if(error) break; - - numcodes_ll = LODEPNG_MIN(tree_ll.numcodes, 286); - numcodes_d = LODEPNG_MIN(tree_d.numcodes, 30); - /*store the code lengths of both generated trees in bitlen_lld*/ - numcodes_lld = numcodes_ll + numcodes_d; - bitlen_lld = (unsigned *)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld)); - /*numcodes_lld_e never needs more size than bitlen_lld*/ - bitlen_lld_e = (unsigned *)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld_e)); - if(!bitlen_lld || !bitlen_lld_e) ERROR_BREAK(83); /*alloc fail*/ - numcodes_lld_e = 0; - - for(i = 0; i != numcodes_ll; ++i) bitlen_lld[i] = tree_ll.lengths[i]; - for(i = 0; i != numcodes_d; ++i) bitlen_lld[numcodes_ll + i] = tree_d.lengths[i]; - - /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), - 17 (3-10 zeroes), 18 (11-138 zeroes)*/ - for(i = 0; i != numcodes_lld; ++i) { - unsigned j = 0; /*amount of repetitions*/ - while(i + j + 1 < numcodes_lld && bitlen_lld[i + j + 1] == bitlen_lld[i]) ++j; - - if(bitlen_lld[i] == 0 && j >= 2) { /*repeat code for zeroes*/ - ++j; /*include the first zero*/ - if(j <= 10) { /*repeat code 17 supports max 10 zeroes*/ - bitlen_lld_e[numcodes_lld_e++] = 17; - bitlen_lld_e[numcodes_lld_e++] = j - 3; - } - else { /*repeat code 18 supports max 138 zeroes*/ - if(j > 138) j = 138; - bitlen_lld_e[numcodes_lld_e++] = 18; - bitlen_lld_e[numcodes_lld_e++] = j - 11; - } - i += (j - 1); - } - else if(j >= 3) { /*repeat code for value other than zero*/ - size_t k; - unsigned num = j / 6u, rest = j % 6u; - bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i]; - for(k = 0; k < num; ++k) { - bitlen_lld_e[numcodes_lld_e++] = 16; - bitlen_lld_e[numcodes_lld_e++] = 6 - 3; - } - if(rest >= 3) { - bitlen_lld_e[numcodes_lld_e++] = 16; - bitlen_lld_e[numcodes_lld_e++] = rest - 3; - } - else j -= rest; - i += j; - } - else { /*too short to benefit from repeat code*/ - bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i]; - } - } - - /*generate tree_cl, the huffmantree of huffmantrees*/ - for(i = 0; i != numcodes_lld_e; ++i) { - ++frequencies_cl[bitlen_lld_e[i]]; - /*after a repeat code come the bits that specify the number of repetitions, - those don't need to be in the frequencies_cl calculation*/ - if(bitlen_lld_e[i] >= 16) ++i; - } - - error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl, - NUM_CODE_LENGTH_CODES, NUM_CODE_LENGTH_CODES, 7); - if(error) break; - - /*compute amount of code-length-code-lengths to output*/ - numcodes_cl = NUM_CODE_LENGTH_CODES; - /*trim zeros at the end (using CLCL_ORDER), but minimum size must be 4 (see HCLEN below)*/ - while(numcodes_cl > 4u && tree_cl.lengths[CLCL_ORDER[numcodes_cl - 1u]] == 0) { - numcodes_cl--; - } - - /* - Write everything into the output - - After the BFINAL and BTYPE, the dynamic block consists out of the following: - - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN - - (HCLEN+4)*3 bits code lengths of code length alphabet - - HLIT + 257 code lengths of lit/length alphabet (encoded using the code length - alphabet, + possible repetition codes 16, 17, 18) - - HDIST + 1 code lengths of distance alphabet (encoded using the code length - alphabet, + possible repetition codes 16, 17, 18) - - compressed data - - 256 (end code) - */ - - /*Write block type*/ - writeBits(writer, BFINAL, 1); - writeBits(writer, 0, 1); /*first bit of BTYPE "dynamic"*/ - writeBits(writer, 1, 1); /*second bit of BTYPE "dynamic"*/ - - /*write the HLIT, HDIST and HCLEN values*/ - /*all three sizes take trimmed ending zeroes into account, done either by HuffmanTree_makeFromFrequencies - or in the loop for numcodes_cl above, which saves space. */ - HLIT = (unsigned)(numcodes_ll - 257); - HDIST = (unsigned)(numcodes_d - 1); - HCLEN = (unsigned)(numcodes_cl - 4); - writeBits(writer, HLIT, 5); - writeBits(writer, HDIST, 5); - writeBits(writer, HCLEN, 4); - - /*write the code lengths of the code length alphabet ("bitlen_cl")*/ - for(i = 0; i != numcodes_cl; ++i) writeBits(writer, tree_cl.lengths[CLCL_ORDER[i]], 3); - - /*write the lengths of the lit/len AND the dist alphabet*/ - for(i = 0; i != numcodes_lld_e; ++i) { - writeBitsReversed(writer, tree_cl.codes[bitlen_lld_e[i]], tree_cl.lengths[bitlen_lld_e[i]]); - /*extra bits of repeat codes*/ - if(bitlen_lld_e[i] == 16) writeBits(writer, bitlen_lld_e[++i], 2); - else if(bitlen_lld_e[i] == 17) writeBits(writer, bitlen_lld_e[++i], 3); - else if(bitlen_lld_e[i] == 18) writeBits(writer, bitlen_lld_e[++i], 7); - } - - /*write the compressed data symbols*/ - writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d); - /*error: the length of the end code 256 must be larger than 0*/ - if(tree_ll.lengths[256] == 0) ERROR_BREAK(64); - - /*write the end code*/ - writeBitsReversed(writer, tree_ll.codes[256], tree_ll.lengths[256]); - - break; /*end of error-while*/ - } - - /*cleanup*/ - uivector_cleanup(&lz77_encoded); - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - HuffmanTree_cleanup(&tree_cl); - lodepng_free(frequencies_ll); - lodepng_free(frequencies_d); - lodepng_free(frequencies_cl); - lodepng_free(bitlen_lld); - lodepng_free(bitlen_lld_e); - - return error; -} - -static unsigned deflateFixed(LodePNGBitWriter * writer, Hash * hash, - const unsigned char * data, - size_t datapos, size_t dataend, - const LodePNGCompressSettings * settings, unsigned final) -{ - HuffmanTree tree_ll; /*tree for literal values and length codes*/ - HuffmanTree tree_d; /*tree for distance codes*/ - - unsigned BFINAL = final; - unsigned error = 0; - size_t i; - - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - - error = generateFixedLitLenTree(&tree_ll); - if(!error) error = generateFixedDistanceTree(&tree_d); - - if(!error) { - writeBits(writer, BFINAL, 1); - writeBits(writer, 1, 1); /*first bit of BTYPE*/ - writeBits(writer, 0, 1); /*second bit of BTYPE*/ - - if(settings->use_lz77) { /*LZ77 encoded*/ - uivector lz77_encoded; - uivector_init(&lz77_encoded); - error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, - settings->minmatch, settings->nicematch, settings->lazymatching); - if(!error) writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d); - uivector_cleanup(&lz77_encoded); - } - else { /*no LZ77, but still will be Huffman compressed*/ - for(i = datapos; i < dataend; ++i) { - writeBitsReversed(writer, tree_ll.codes[data[i]], tree_ll.lengths[data[i]]); - } - } - /*add END code*/ - if(!error) writeBitsReversed(writer, tree_ll.codes[256], tree_ll.lengths[256]); - } - - /*cleanup*/ - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - - return error; -} - -static unsigned lodepng_deflatev(ucvector * out, const unsigned char * in, size_t insize, - const LodePNGCompressSettings * settings) -{ - unsigned error = 0; - size_t i, blocksize, numdeflateblocks; - Hash hash; - LodePNGBitWriter writer; - - LodePNGBitWriter_init(&writer, out); - - if(settings->btype > 2) return 61; - else if(settings->btype == 0) return deflateNoCompression(out, in, insize); - else if(settings->btype == 1) blocksize = insize; - else { /*if(settings->btype == 2)*/ - /*on PNGs, deflate blocks of 65-262k seem to give most dense encoding*/ - blocksize = insize / 8u + 8; - if(blocksize < 65536) blocksize = 65536; - if(blocksize > 262144) blocksize = 262144; - } - - numdeflateblocks = (insize + blocksize - 1) / blocksize; - if(numdeflateblocks == 0) numdeflateblocks = 1; - - error = hash_init(&hash, settings->windowsize); - - if(!error) { - for(i = 0; i != numdeflateblocks && !error; ++i) { - unsigned final = (i == numdeflateblocks - 1); - size_t start = i * blocksize; - size_t end = start + blocksize; - if(end > insize) end = insize; - - if(settings->btype == 1) error = deflateFixed(&writer, &hash, in, start, end, settings, final); - else if(settings->btype == 2) error = deflateDynamic(&writer, &hash, in, start, end, settings, final); - } - } - - hash_cleanup(&hash); - - return error; -} - -unsigned lodepng_deflate(unsigned char ** out, size_t * outsize, - const unsigned char * in, size_t insize, - const LodePNGCompressSettings * settings) -{ - ucvector v = ucvector_init(*out, *outsize); - unsigned error = lodepng_deflatev(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; -} - -static unsigned deflate(unsigned char ** out, size_t * outsize, - const unsigned char * in, size_t insize, - const LodePNGCompressSettings * settings) -{ - if(settings->custom_deflate) { - unsigned error = settings->custom_deflate(out, outsize, in, insize, settings); - /*the custom deflate is allowed to have its own error codes, however, we translate it to code 111*/ - return error ? 111 : 0; - } - else { - return lodepng_deflate(out, outsize, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Adler32 / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -static unsigned update_adler32(unsigned adler, const unsigned char * data, unsigned len) -{ - unsigned s1 = adler & 0xffffu; - unsigned s2 = (adler >> 16u) & 0xffffu; - - while(len != 0u) { - unsigned i; - /*at least 5552 sums can be done before the sums overflow, saving a lot of module divisions*/ - unsigned amount = len > 5552u ? 5552u : len; - len -= amount; - for(i = 0; i != amount; ++i) { - s1 += (*data++); - s2 += s1; - } - s1 %= 65521u; - s2 %= 65521u; - } - - return (s2 << 16u) | s1; -} - -/*Return the adler32 of the bytes data[0..len-1]*/ -static unsigned adler32(const unsigned char * data, unsigned len) -{ - return update_adler32(1u, data, len); -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Zlib / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_DECODER - -static unsigned lodepng_zlib_decompressv(ucvector * out, - const unsigned char * in, size_t insize, - const LodePNGDecompressSettings * settings) -{ - unsigned error = 0; - unsigned CM, CINFO, FDICT; - - if(insize < 2) return 53; /*error, size of zlib data too small*/ - /*read information from zlib header*/ - if((in[0] * 256 + in[1]) % 31 != 0) { - /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/ - return 24; - } - - CM = in[0] & 15; - CINFO = (in[0] >> 4) & 15; - /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/ - FDICT = (in[1] >> 5) & 1; - /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/ - - if(CM != 8 || CINFO > 7) { - /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/ - return 25; - } - if(FDICT != 0) { - /*error: the specification of PNG says about the zlib stream: - "The additional flags shall not specify a preset dictionary."*/ - return 26; - } - - error = inflatev(out, in + 2, insize - 2, settings); - if(error) return error; - - if(!settings->ignore_adler32) { - unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]); - unsigned checksum = adler32(out->data, (unsigned)(out->size)); - if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/ - } - - return 0; /*no error*/ -} - - -unsigned lodepng_zlib_decompress(unsigned char ** out, size_t * outsize, const unsigned char * in, - size_t insize, const LodePNGDecompressSettings * settings) -{ - ucvector v = ucvector_init(*out, *outsize); - unsigned error = lodepng_zlib_decompressv(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; -} - -/*expected_size is expected output size, to avoid intermediate allocations. Set to 0 if not known. */ -static unsigned zlib_decompress(unsigned char ** out, size_t * outsize, size_t expected_size, - const unsigned char * in, size_t insize, const LodePNGDecompressSettings * settings) -{ - unsigned error; - if(settings->custom_zlib) { - error = settings->custom_zlib(out, outsize, in, insize, settings); - if(error) { - /*the custom zlib is allowed to have its own error codes, however, we translate it to code 110*/ - error = 110; - /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/ - if(settings->max_output_size && *outsize > settings->max_output_size) error = 109; - } - } - else { - ucvector v = ucvector_init(*out, *outsize); - if(expected_size) { - /*reserve the memory to avoid intermediate reallocations*/ - ucvector_resize(&v, *outsize + expected_size); - v.size = *outsize; - } - error = lodepng_zlib_decompressv(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - } - return error; -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER - -unsigned lodepng_zlib_compress(unsigned char ** out, size_t * outsize, const unsigned char * in, - size_t insize, const LodePNGCompressSettings * settings) -{ - size_t i; - unsigned error; - unsigned char * deflatedata = 0; - size_t deflatesize = 0; - - error = deflate(&deflatedata, &deflatesize, in, insize, settings); - - *out = NULL; - *outsize = 0; - if(!error) { - *outsize = deflatesize + 6; - *out = (unsigned char *)lodepng_malloc(*outsize); - if(!*out) error = 83; /*alloc fail*/ - } - - if(!error) { - unsigned ADLER32 = adler32(in, (unsigned)insize); - /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ - unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ - unsigned FLEVEL = 0; - unsigned FDICT = 0; - unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64; - unsigned FCHECK = 31 - CMFFLG % 31; - CMFFLG += FCHECK; - - (*out)[0] = (unsigned char)(CMFFLG >> 8); - (*out)[1] = (unsigned char)(CMFFLG & 255); - for(i = 0; i != deflatesize; ++i)(*out)[i + 2] = deflatedata[i]; - lodepng_set32bitInt(&(*out)[*outsize - 4], ADLER32); - } - - lodepng_free(deflatedata); - return error; -} - -/* compress using the default or custom zlib function */ -static unsigned zlib_compress(unsigned char ** out, size_t * outsize, const unsigned char * in, - size_t insize, const LodePNGCompressSettings * settings) -{ - if(settings->custom_zlib) { - unsigned error = settings->custom_zlib(out, outsize, in, insize, settings); - /*the custom zlib is allowed to have its own error codes, however, we translate it to code 111*/ - return error ? 111 : 0; - } - else { - return lodepng_zlib_compress(out, outsize, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#else /*no LODEPNG_COMPILE_ZLIB*/ - -#ifdef LODEPNG_COMPILE_DECODER -static unsigned zlib_decompress(unsigned char ** out, size_t * outsize, size_t expected_size, - const unsigned char * in, size_t insize, const LodePNGDecompressSettings * settings) -{ - if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ - (void)expected_size; - return settings->custom_zlib(out, outsize, in, insize, settings); -} -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER -static unsigned zlib_compress(unsigned char ** out, size_t * outsize, const unsigned char * in, - size_t insize, const LodePNGCompressSettings * settings) -{ - if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ - return settings->custom_zlib(out, outsize, in, insize, settings); -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#endif /*LODEPNG_COMPILE_ZLIB*/ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_ENCODER - -/*this is a good tradeoff between speed and compression ratio*/ -#define DEFAULT_WINDOWSIZE 2048 - -void lodepng_compress_settings_init(LodePNGCompressSettings * settings) -{ - /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/ - settings->btype = 2; - settings->use_lz77 = 1; - settings->windowsize = DEFAULT_WINDOWSIZE; - settings->minmatch = 3; - settings->nicematch = 128; - settings->lazymatching = 1; - - settings->custom_zlib = 0; - settings->custom_deflate = 0; - settings->custom_context = 0; -} - -const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0}; - - -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -void lodepng_decompress_settings_init(LodePNGDecompressSettings * settings) -{ - settings->ignore_adler32 = 0; - settings->ignore_nlen = 0; - settings->max_output_size = 0; - - settings->custom_zlib = 0; - settings->custom_inflate = 0; - settings->custom_context = 0; -} - -const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0, 0, 0}; - -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // End of Zlib related code. Begin of PNG related code. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_PNG - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / CRC32 / */ -/* ////////////////////////////////////////////////////////////////////////// */ - - -#ifdef LODEPNG_COMPILE_CRC - -static const unsigned lodepng_crc32_table0[256] = { - 0x00000000u, 0x77073096u, 0xee0e612cu, 0x990951bau, 0x076dc419u, 0x706af48fu, 0xe963a535u, 0x9e6495a3u, - 0x0edb8832u, 0x79dcb8a4u, 0xe0d5e91eu, 0x97d2d988u, 0x09b64c2bu, 0x7eb17cbdu, 0xe7b82d07u, 0x90bf1d91u, - 0x1db71064u, 0x6ab020f2u, 0xf3b97148u, 0x84be41deu, 0x1adad47du, 0x6ddde4ebu, 0xf4d4b551u, 0x83d385c7u, - 0x136c9856u, 0x646ba8c0u, 0xfd62f97au, 0x8a65c9ecu, 0x14015c4fu, 0x63066cd9u, 0xfa0f3d63u, 0x8d080df5u, - 0x3b6e20c8u, 0x4c69105eu, 0xd56041e4u, 0xa2677172u, 0x3c03e4d1u, 0x4b04d447u, 0xd20d85fdu, 0xa50ab56bu, - 0x35b5a8fau, 0x42b2986cu, 0xdbbbc9d6u, 0xacbcf940u, 0x32d86ce3u, 0x45df5c75u, 0xdcd60dcfu, 0xabd13d59u, - 0x26d930acu, 0x51de003au, 0xc8d75180u, 0xbfd06116u, 0x21b4f4b5u, 0x56b3c423u, 0xcfba9599u, 0xb8bda50fu, - 0x2802b89eu, 0x5f058808u, 0xc60cd9b2u, 0xb10be924u, 0x2f6f7c87u, 0x58684c11u, 0xc1611dabu, 0xb6662d3du, - 0x76dc4190u, 0x01db7106u, 0x98d220bcu, 0xefd5102au, 0x71b18589u, 0x06b6b51fu, 0x9fbfe4a5u, 0xe8b8d433u, - 0x7807c9a2u, 0x0f00f934u, 0x9609a88eu, 0xe10e9818u, 0x7f6a0dbbu, 0x086d3d2du, 0x91646c97u, 0xe6635c01u, - 0x6b6b51f4u, 0x1c6c6162u, 0x856530d8u, 0xf262004eu, 0x6c0695edu, 0x1b01a57bu, 0x8208f4c1u, 0xf50fc457u, - 0x65b0d9c6u, 0x12b7e950u, 0x8bbeb8eau, 0xfcb9887cu, 0x62dd1ddfu, 0x15da2d49u, 0x8cd37cf3u, 0xfbd44c65u, - 0x4db26158u, 0x3ab551ceu, 0xa3bc0074u, 0xd4bb30e2u, 0x4adfa541u, 0x3dd895d7u, 0xa4d1c46du, 0xd3d6f4fbu, - 0x4369e96au, 0x346ed9fcu, 0xad678846u, 0xda60b8d0u, 0x44042d73u, 0x33031de5u, 0xaa0a4c5fu, 0xdd0d7cc9u, - 0x5005713cu, 0x270241aau, 0xbe0b1010u, 0xc90c2086u, 0x5768b525u, 0x206f85b3u, 0xb966d409u, 0xce61e49fu, - 0x5edef90eu, 0x29d9c998u, 0xb0d09822u, 0xc7d7a8b4u, 0x59b33d17u, 0x2eb40d81u, 0xb7bd5c3bu, 0xc0ba6cadu, - 0xedb88320u, 0x9abfb3b6u, 0x03b6e20cu, 0x74b1d29au, 0xead54739u, 0x9dd277afu, 0x04db2615u, 0x73dc1683u, - 0xe3630b12u, 0x94643b84u, 0x0d6d6a3eu, 0x7a6a5aa8u, 0xe40ecf0bu, 0x9309ff9du, 0x0a00ae27u, 0x7d079eb1u, - 0xf00f9344u, 0x8708a3d2u, 0x1e01f268u, 0x6906c2feu, 0xf762575du, 0x806567cbu, 0x196c3671u, 0x6e6b06e7u, - 0xfed41b76u, 0x89d32be0u, 0x10da7a5au, 0x67dd4accu, 0xf9b9df6fu, 0x8ebeeff9u, 0x17b7be43u, 0x60b08ed5u, - 0xd6d6a3e8u, 0xa1d1937eu, 0x38d8c2c4u, 0x4fdff252u, 0xd1bb67f1u, 0xa6bc5767u, 0x3fb506ddu, 0x48b2364bu, - 0xd80d2bdau, 0xaf0a1b4cu, 0x36034af6u, 0x41047a60u, 0xdf60efc3u, 0xa867df55u, 0x316e8eefu, 0x4669be79u, - 0xcb61b38cu, 0xbc66831au, 0x256fd2a0u, 0x5268e236u, 0xcc0c7795u, 0xbb0b4703u, 0x220216b9u, 0x5505262fu, - 0xc5ba3bbeu, 0xb2bd0b28u, 0x2bb45a92u, 0x5cb36a04u, 0xc2d7ffa7u, 0xb5d0cf31u, 0x2cd99e8bu, 0x5bdeae1du, - 0x9b64c2b0u, 0xec63f226u, 0x756aa39cu, 0x026d930au, 0x9c0906a9u, 0xeb0e363fu, 0x72076785u, 0x05005713u, - 0x95bf4a82u, 0xe2b87a14u, 0x7bb12baeu, 0x0cb61b38u, 0x92d28e9bu, 0xe5d5be0du, 0x7cdcefb7u, 0x0bdbdf21u, - 0x86d3d2d4u, 0xf1d4e242u, 0x68ddb3f8u, 0x1fda836eu, 0x81be16cdu, 0xf6b9265bu, 0x6fb077e1u, 0x18b74777u, - 0x88085ae6u, 0xff0f6a70u, 0x66063bcau, 0x11010b5cu, 0x8f659effu, 0xf862ae69u, 0x616bffd3u, 0x166ccf45u, - 0xa00ae278u, 0xd70dd2eeu, 0x4e048354u, 0x3903b3c2u, 0xa7672661u, 0xd06016f7u, 0x4969474du, 0x3e6e77dbu, - 0xaed16a4au, 0xd9d65adcu, 0x40df0b66u, 0x37d83bf0u, 0xa9bcae53u, 0xdebb9ec5u, 0x47b2cf7fu, 0x30b5ffe9u, - 0xbdbdf21cu, 0xcabac28au, 0x53b39330u, 0x24b4a3a6u, 0xbad03605u, 0xcdd70693u, 0x54de5729u, 0x23d967bfu, - 0xb3667a2eu, 0xc4614ab8u, 0x5d681b02u, 0x2a6f2b94u, 0xb40bbe37u, 0xc30c8ea1u, 0x5a05df1bu, 0x2d02ef8du -}; - -static const unsigned lodepng_crc32_table1[256] = { - 0x00000000u, 0x191b3141u, 0x32366282u, 0x2b2d53c3u, 0x646cc504u, 0x7d77f445u, 0x565aa786u, 0x4f4196c7u, - 0xc8d98a08u, 0xd1c2bb49u, 0xfaefe88au, 0xe3f4d9cbu, 0xacb54f0cu, 0xb5ae7e4du, 0x9e832d8eu, 0x87981ccfu, - 0x4ac21251u, 0x53d92310u, 0x78f470d3u, 0x61ef4192u, 0x2eaed755u, 0x37b5e614u, 0x1c98b5d7u, 0x05838496u, - 0x821b9859u, 0x9b00a918u, 0xb02dfadbu, 0xa936cb9au, 0xe6775d5du, 0xff6c6c1cu, 0xd4413fdfu, 0xcd5a0e9eu, - 0x958424a2u, 0x8c9f15e3u, 0xa7b24620u, 0xbea97761u, 0xf1e8e1a6u, 0xe8f3d0e7u, 0xc3de8324u, 0xdac5b265u, - 0x5d5daeaau, 0x44469febu, 0x6f6bcc28u, 0x7670fd69u, 0x39316baeu, 0x202a5aefu, 0x0b07092cu, 0x121c386du, - 0xdf4636f3u, 0xc65d07b2u, 0xed705471u, 0xf46b6530u, 0xbb2af3f7u, 0xa231c2b6u, 0x891c9175u, 0x9007a034u, - 0x179fbcfbu, 0x0e848dbau, 0x25a9de79u, 0x3cb2ef38u, 0x73f379ffu, 0x6ae848beu, 0x41c51b7du, 0x58de2a3cu, - 0xf0794f05u, 0xe9627e44u, 0xc24f2d87u, 0xdb541cc6u, 0x94158a01u, 0x8d0ebb40u, 0xa623e883u, 0xbf38d9c2u, - 0x38a0c50du, 0x21bbf44cu, 0x0a96a78fu, 0x138d96ceu, 0x5ccc0009u, 0x45d73148u, 0x6efa628bu, 0x77e153cau, - 0xbabb5d54u, 0xa3a06c15u, 0x888d3fd6u, 0x91960e97u, 0xded79850u, 0xc7cca911u, 0xece1fad2u, 0xf5facb93u, - 0x7262d75cu, 0x6b79e61du, 0x4054b5deu, 0x594f849fu, 0x160e1258u, 0x0f152319u, 0x243870dau, 0x3d23419bu, - 0x65fd6ba7u, 0x7ce65ae6u, 0x57cb0925u, 0x4ed03864u, 0x0191aea3u, 0x188a9fe2u, 0x33a7cc21u, 0x2abcfd60u, - 0xad24e1afu, 0xb43fd0eeu, 0x9f12832du, 0x8609b26cu, 0xc94824abu, 0xd05315eau, 0xfb7e4629u, 0xe2657768u, - 0x2f3f79f6u, 0x362448b7u, 0x1d091b74u, 0x04122a35u, 0x4b53bcf2u, 0x52488db3u, 0x7965de70u, 0x607eef31u, - 0xe7e6f3feu, 0xfefdc2bfu, 0xd5d0917cu, 0xcccba03du, 0x838a36fau, 0x9a9107bbu, 0xb1bc5478u, 0xa8a76539u, - 0x3b83984bu, 0x2298a90au, 0x09b5fac9u, 0x10aecb88u, 0x5fef5d4fu, 0x46f46c0eu, 0x6dd93fcdu, 0x74c20e8cu, - 0xf35a1243u, 0xea412302u, 0xc16c70c1u, 0xd8774180u, 0x9736d747u, 0x8e2de606u, 0xa500b5c5u, 0xbc1b8484u, - 0x71418a1au, 0x685abb5bu, 0x4377e898u, 0x5a6cd9d9u, 0x152d4f1eu, 0x0c367e5fu, 0x271b2d9cu, 0x3e001cddu, - 0xb9980012u, 0xa0833153u, 0x8bae6290u, 0x92b553d1u, 0xddf4c516u, 0xc4eff457u, 0xefc2a794u, 0xf6d996d5u, - 0xae07bce9u, 0xb71c8da8u, 0x9c31de6bu, 0x852aef2au, 0xca6b79edu, 0xd37048acu, 0xf85d1b6fu, 0xe1462a2eu, - 0x66de36e1u, 0x7fc507a0u, 0x54e85463u, 0x4df36522u, 0x02b2f3e5u, 0x1ba9c2a4u, 0x30849167u, 0x299fa026u, - 0xe4c5aeb8u, 0xfdde9ff9u, 0xd6f3cc3au, 0xcfe8fd7bu, 0x80a96bbcu, 0x99b25afdu, 0xb29f093eu, 0xab84387fu, - 0x2c1c24b0u, 0x350715f1u, 0x1e2a4632u, 0x07317773u, 0x4870e1b4u, 0x516bd0f5u, 0x7a468336u, 0x635db277u, - 0xcbfad74eu, 0xd2e1e60fu, 0xf9ccb5ccu, 0xe0d7848du, 0xaf96124au, 0xb68d230bu, 0x9da070c8u, 0x84bb4189u, - 0x03235d46u, 0x1a386c07u, 0x31153fc4u, 0x280e0e85u, 0x674f9842u, 0x7e54a903u, 0x5579fac0u, 0x4c62cb81u, - 0x8138c51fu, 0x9823f45eu, 0xb30ea79du, 0xaa1596dcu, 0xe554001bu, 0xfc4f315au, 0xd7626299u, 0xce7953d8u, - 0x49e14f17u, 0x50fa7e56u, 0x7bd72d95u, 0x62cc1cd4u, 0x2d8d8a13u, 0x3496bb52u, 0x1fbbe891u, 0x06a0d9d0u, - 0x5e7ef3ecu, 0x4765c2adu, 0x6c48916eu, 0x7553a02fu, 0x3a1236e8u, 0x230907a9u, 0x0824546au, 0x113f652bu, - 0x96a779e4u, 0x8fbc48a5u, 0xa4911b66u, 0xbd8a2a27u, 0xf2cbbce0u, 0xebd08da1u, 0xc0fdde62u, 0xd9e6ef23u, - 0x14bce1bdu, 0x0da7d0fcu, 0x268a833fu, 0x3f91b27eu, 0x70d024b9u, 0x69cb15f8u, 0x42e6463bu, 0x5bfd777au, - 0xdc656bb5u, 0xc57e5af4u, 0xee530937u, 0xf7483876u, 0xb809aeb1u, 0xa1129ff0u, 0x8a3fcc33u, 0x9324fd72u -}; - -static const unsigned lodepng_crc32_table2[256] = { - 0x00000000u, 0x01c26a37u, 0x0384d46eu, 0x0246be59u, 0x0709a8dcu, 0x06cbc2ebu, 0x048d7cb2u, 0x054f1685u, - 0x0e1351b8u, 0x0fd13b8fu, 0x0d9785d6u, 0x0c55efe1u, 0x091af964u, 0x08d89353u, 0x0a9e2d0au, 0x0b5c473du, - 0x1c26a370u, 0x1de4c947u, 0x1fa2771eu, 0x1e601d29u, 0x1b2f0bacu, 0x1aed619bu, 0x18abdfc2u, 0x1969b5f5u, - 0x1235f2c8u, 0x13f798ffu, 0x11b126a6u, 0x10734c91u, 0x153c5a14u, 0x14fe3023u, 0x16b88e7au, 0x177ae44du, - 0x384d46e0u, 0x398f2cd7u, 0x3bc9928eu, 0x3a0bf8b9u, 0x3f44ee3cu, 0x3e86840bu, 0x3cc03a52u, 0x3d025065u, - 0x365e1758u, 0x379c7d6fu, 0x35dac336u, 0x3418a901u, 0x3157bf84u, 0x3095d5b3u, 0x32d36beau, 0x331101ddu, - 0x246be590u, 0x25a98fa7u, 0x27ef31feu, 0x262d5bc9u, 0x23624d4cu, 0x22a0277bu, 0x20e69922u, 0x2124f315u, - 0x2a78b428u, 0x2bbade1fu, 0x29fc6046u, 0x283e0a71u, 0x2d711cf4u, 0x2cb376c3u, 0x2ef5c89au, 0x2f37a2adu, - 0x709a8dc0u, 0x7158e7f7u, 0x731e59aeu, 0x72dc3399u, 0x7793251cu, 0x76514f2bu, 0x7417f172u, 0x75d59b45u, - 0x7e89dc78u, 0x7f4bb64fu, 0x7d0d0816u, 0x7ccf6221u, 0x798074a4u, 0x78421e93u, 0x7a04a0cau, 0x7bc6cafdu, - 0x6cbc2eb0u, 0x6d7e4487u, 0x6f38fadeu, 0x6efa90e9u, 0x6bb5866cu, 0x6a77ec5bu, 0x68315202u, 0x69f33835u, - 0x62af7f08u, 0x636d153fu, 0x612bab66u, 0x60e9c151u, 0x65a6d7d4u, 0x6464bde3u, 0x662203bau, 0x67e0698du, - 0x48d7cb20u, 0x4915a117u, 0x4b531f4eu, 0x4a917579u, 0x4fde63fcu, 0x4e1c09cbu, 0x4c5ab792u, 0x4d98dda5u, - 0x46c49a98u, 0x4706f0afu, 0x45404ef6u, 0x448224c1u, 0x41cd3244u, 0x400f5873u, 0x4249e62au, 0x438b8c1du, - 0x54f16850u, 0x55330267u, 0x5775bc3eu, 0x56b7d609u, 0x53f8c08cu, 0x523aaabbu, 0x507c14e2u, 0x51be7ed5u, - 0x5ae239e8u, 0x5b2053dfu, 0x5966ed86u, 0x58a487b1u, 0x5deb9134u, 0x5c29fb03u, 0x5e6f455au, 0x5fad2f6du, - 0xe1351b80u, 0xe0f771b7u, 0xe2b1cfeeu, 0xe373a5d9u, 0xe63cb35cu, 0xe7fed96bu, 0xe5b86732u, 0xe47a0d05u, - 0xef264a38u, 0xeee4200fu, 0xeca29e56u, 0xed60f461u, 0xe82fe2e4u, 0xe9ed88d3u, 0xebab368au, 0xea695cbdu, - 0xfd13b8f0u, 0xfcd1d2c7u, 0xfe976c9eu, 0xff5506a9u, 0xfa1a102cu, 0xfbd87a1bu, 0xf99ec442u, 0xf85cae75u, - 0xf300e948u, 0xf2c2837fu, 0xf0843d26u, 0xf1465711u, 0xf4094194u, 0xf5cb2ba3u, 0xf78d95fau, 0xf64fffcdu, - 0xd9785d60u, 0xd8ba3757u, 0xdafc890eu, 0xdb3ee339u, 0xde71f5bcu, 0xdfb39f8bu, 0xddf521d2u, 0xdc374be5u, - 0xd76b0cd8u, 0xd6a966efu, 0xd4efd8b6u, 0xd52db281u, 0xd062a404u, 0xd1a0ce33u, 0xd3e6706au, 0xd2241a5du, - 0xc55efe10u, 0xc49c9427u, 0xc6da2a7eu, 0xc7184049u, 0xc25756ccu, 0xc3953cfbu, 0xc1d382a2u, 0xc011e895u, - 0xcb4dafa8u, 0xca8fc59fu, 0xc8c97bc6u, 0xc90b11f1u, 0xcc440774u, 0xcd866d43u, 0xcfc0d31au, 0xce02b92du, - 0x91af9640u, 0x906dfc77u, 0x922b422eu, 0x93e92819u, 0x96a63e9cu, 0x976454abu, 0x9522eaf2u, 0x94e080c5u, - 0x9fbcc7f8u, 0x9e7eadcfu, 0x9c381396u, 0x9dfa79a1u, 0x98b56f24u, 0x99770513u, 0x9b31bb4au, 0x9af3d17du, - 0x8d893530u, 0x8c4b5f07u, 0x8e0de15eu, 0x8fcf8b69u, 0x8a809decu, 0x8b42f7dbu, 0x89044982u, 0x88c623b5u, - 0x839a6488u, 0x82580ebfu, 0x801eb0e6u, 0x81dcdad1u, 0x8493cc54u, 0x8551a663u, 0x8717183au, 0x86d5720du, - 0xa9e2d0a0u, 0xa820ba97u, 0xaa6604ceu, 0xaba46ef9u, 0xaeeb787cu, 0xaf29124bu, 0xad6fac12u, 0xacadc625u, - 0xa7f18118u, 0xa633eb2fu, 0xa4755576u, 0xa5b73f41u, 0xa0f829c4u, 0xa13a43f3u, 0xa37cfdaau, 0xa2be979du, - 0xb5c473d0u, 0xb40619e7u, 0xb640a7beu, 0xb782cd89u, 0xb2cddb0cu, 0xb30fb13bu, 0xb1490f62u, 0xb08b6555u, - 0xbbd72268u, 0xba15485fu, 0xb853f606u, 0xb9919c31u, 0xbcde8ab4u, 0xbd1ce083u, 0xbf5a5edau, 0xbe9834edu -}; - -static const unsigned lodepng_crc32_table3[256] = { - 0x00000000u, 0xb8bc6765u, 0xaa09c88bu, 0x12b5afeeu, 0x8f629757u, 0x37def032u, 0x256b5fdcu, 0x9dd738b9u, - 0xc5b428efu, 0x7d084f8au, 0x6fbde064u, 0xd7018701u, 0x4ad6bfb8u, 0xf26ad8ddu, 0xe0df7733u, 0x58631056u, - 0x5019579fu, 0xe8a530fau, 0xfa109f14u, 0x42acf871u, 0xdf7bc0c8u, 0x67c7a7adu, 0x75720843u, 0xcdce6f26u, - 0x95ad7f70u, 0x2d111815u, 0x3fa4b7fbu, 0x8718d09eu, 0x1acfe827u, 0xa2738f42u, 0xb0c620acu, 0x087a47c9u, - 0xa032af3eu, 0x188ec85bu, 0x0a3b67b5u, 0xb28700d0u, 0x2f503869u, 0x97ec5f0cu, 0x8559f0e2u, 0x3de59787u, - 0x658687d1u, 0xdd3ae0b4u, 0xcf8f4f5au, 0x7733283fu, 0xeae41086u, 0x525877e3u, 0x40edd80du, 0xf851bf68u, - 0xf02bf8a1u, 0x48979fc4u, 0x5a22302au, 0xe29e574fu, 0x7f496ff6u, 0xc7f50893u, 0xd540a77du, 0x6dfcc018u, - 0x359fd04eu, 0x8d23b72bu, 0x9f9618c5u, 0x272a7fa0u, 0xbafd4719u, 0x0241207cu, 0x10f48f92u, 0xa848e8f7u, - 0x9b14583du, 0x23a83f58u, 0x311d90b6u, 0x89a1f7d3u, 0x1476cf6au, 0xaccaa80fu, 0xbe7f07e1u, 0x06c36084u, - 0x5ea070d2u, 0xe61c17b7u, 0xf4a9b859u, 0x4c15df3cu, 0xd1c2e785u, 0x697e80e0u, 0x7bcb2f0eu, 0xc377486bu, - 0xcb0d0fa2u, 0x73b168c7u, 0x6104c729u, 0xd9b8a04cu, 0x446f98f5u, 0xfcd3ff90u, 0xee66507eu, 0x56da371bu, - 0x0eb9274du, 0xb6054028u, 0xa4b0efc6u, 0x1c0c88a3u, 0x81dbb01au, 0x3967d77fu, 0x2bd27891u, 0x936e1ff4u, - 0x3b26f703u, 0x839a9066u, 0x912f3f88u, 0x299358edu, 0xb4446054u, 0x0cf80731u, 0x1e4da8dfu, 0xa6f1cfbau, - 0xfe92dfecu, 0x462eb889u, 0x549b1767u, 0xec277002u, 0x71f048bbu, 0xc94c2fdeu, 0xdbf98030u, 0x6345e755u, - 0x6b3fa09cu, 0xd383c7f9u, 0xc1366817u, 0x798a0f72u, 0xe45d37cbu, 0x5ce150aeu, 0x4e54ff40u, 0xf6e89825u, - 0xae8b8873u, 0x1637ef16u, 0x048240f8u, 0xbc3e279du, 0x21e91f24u, 0x99557841u, 0x8be0d7afu, 0x335cb0cau, - 0xed59b63bu, 0x55e5d15eu, 0x47507eb0u, 0xffec19d5u, 0x623b216cu, 0xda874609u, 0xc832e9e7u, 0x708e8e82u, - 0x28ed9ed4u, 0x9051f9b1u, 0x82e4565fu, 0x3a58313au, 0xa78f0983u, 0x1f336ee6u, 0x0d86c108u, 0xb53aa66du, - 0xbd40e1a4u, 0x05fc86c1u, 0x1749292fu, 0xaff54e4au, 0x322276f3u, 0x8a9e1196u, 0x982bbe78u, 0x2097d91du, - 0x78f4c94bu, 0xc048ae2eu, 0xd2fd01c0u, 0x6a4166a5u, 0xf7965e1cu, 0x4f2a3979u, 0x5d9f9697u, 0xe523f1f2u, - 0x4d6b1905u, 0xf5d77e60u, 0xe762d18eu, 0x5fdeb6ebu, 0xc2098e52u, 0x7ab5e937u, 0x680046d9u, 0xd0bc21bcu, - 0x88df31eau, 0x3063568fu, 0x22d6f961u, 0x9a6a9e04u, 0x07bda6bdu, 0xbf01c1d8u, 0xadb46e36u, 0x15080953u, - 0x1d724e9au, 0xa5ce29ffu, 0xb77b8611u, 0x0fc7e174u, 0x9210d9cdu, 0x2aacbea8u, 0x38191146u, 0x80a57623u, - 0xd8c66675u, 0x607a0110u, 0x72cfaefeu, 0xca73c99bu, 0x57a4f122u, 0xef189647u, 0xfdad39a9u, 0x45115eccu, - 0x764dee06u, 0xcef18963u, 0xdc44268du, 0x64f841e8u, 0xf92f7951u, 0x41931e34u, 0x5326b1dau, 0xeb9ad6bfu, - 0xb3f9c6e9u, 0x0b45a18cu, 0x19f00e62u, 0xa14c6907u, 0x3c9b51beu, 0x842736dbu, 0x96929935u, 0x2e2efe50u, - 0x2654b999u, 0x9ee8defcu, 0x8c5d7112u, 0x34e11677u, 0xa9362eceu, 0x118a49abu, 0x033fe645u, 0xbb838120u, - 0xe3e09176u, 0x5b5cf613u, 0x49e959fdu, 0xf1553e98u, 0x6c820621u, 0xd43e6144u, 0xc68bceaau, 0x7e37a9cfu, - 0xd67f4138u, 0x6ec3265du, 0x7c7689b3u, 0xc4caeed6u, 0x591dd66fu, 0xe1a1b10au, 0xf3141ee4u, 0x4ba87981u, - 0x13cb69d7u, 0xab770eb2u, 0xb9c2a15cu, 0x017ec639u, 0x9ca9fe80u, 0x241599e5u, 0x36a0360bu, 0x8e1c516eu, - 0x866616a7u, 0x3eda71c2u, 0x2c6fde2cu, 0x94d3b949u, 0x090481f0u, 0xb1b8e695u, 0xa30d497bu, 0x1bb12e1eu, - 0x43d23e48u, 0xfb6e592du, 0xe9dbf6c3u, 0x516791a6u, 0xccb0a91fu, 0x740cce7au, 0x66b96194u, 0xde0506f1u -}; - -static const unsigned lodepng_crc32_table4[256] = { - 0x00000000u, 0x3d6029b0u, 0x7ac05360u, 0x47a07ad0u, 0xf580a6c0u, 0xc8e08f70u, 0x8f40f5a0u, 0xb220dc10u, - 0x30704bc1u, 0x0d106271u, 0x4ab018a1u, 0x77d03111u, 0xc5f0ed01u, 0xf890c4b1u, 0xbf30be61u, 0x825097d1u, - 0x60e09782u, 0x5d80be32u, 0x1a20c4e2u, 0x2740ed52u, 0x95603142u, 0xa80018f2u, 0xefa06222u, 0xd2c04b92u, - 0x5090dc43u, 0x6df0f5f3u, 0x2a508f23u, 0x1730a693u, 0xa5107a83u, 0x98705333u, 0xdfd029e3u, 0xe2b00053u, - 0xc1c12f04u, 0xfca106b4u, 0xbb017c64u, 0x866155d4u, 0x344189c4u, 0x0921a074u, 0x4e81daa4u, 0x73e1f314u, - 0xf1b164c5u, 0xccd14d75u, 0x8b7137a5u, 0xb6111e15u, 0x0431c205u, 0x3951ebb5u, 0x7ef19165u, 0x4391b8d5u, - 0xa121b886u, 0x9c419136u, 0xdbe1ebe6u, 0xe681c256u, 0x54a11e46u, 0x69c137f6u, 0x2e614d26u, 0x13016496u, - 0x9151f347u, 0xac31daf7u, 0xeb91a027u, 0xd6f18997u, 0x64d15587u, 0x59b17c37u, 0x1e1106e7u, 0x23712f57u, - 0x58f35849u, 0x659371f9u, 0x22330b29u, 0x1f532299u, 0xad73fe89u, 0x9013d739u, 0xd7b3ade9u, 0xead38459u, - 0x68831388u, 0x55e33a38u, 0x124340e8u, 0x2f236958u, 0x9d03b548u, 0xa0639cf8u, 0xe7c3e628u, 0xdaa3cf98u, - 0x3813cfcbu, 0x0573e67bu, 0x42d39cabu, 0x7fb3b51bu, 0xcd93690bu, 0xf0f340bbu, 0xb7533a6bu, 0x8a3313dbu, - 0x0863840au, 0x3503adbau, 0x72a3d76au, 0x4fc3fedau, 0xfde322cau, 0xc0830b7au, 0x872371aau, 0xba43581au, - 0x9932774du, 0xa4525efdu, 0xe3f2242du, 0xde920d9du, 0x6cb2d18du, 0x51d2f83du, 0x167282edu, 0x2b12ab5du, - 0xa9423c8cu, 0x9422153cu, 0xd3826fecu, 0xeee2465cu, 0x5cc29a4cu, 0x61a2b3fcu, 0x2602c92cu, 0x1b62e09cu, - 0xf9d2e0cfu, 0xc4b2c97fu, 0x8312b3afu, 0xbe729a1fu, 0x0c52460fu, 0x31326fbfu, 0x7692156fu, 0x4bf23cdfu, - 0xc9a2ab0eu, 0xf4c282beu, 0xb362f86eu, 0x8e02d1deu, 0x3c220dceu, 0x0142247eu, 0x46e25eaeu, 0x7b82771eu, - 0xb1e6b092u, 0x8c869922u, 0xcb26e3f2u, 0xf646ca42u, 0x44661652u, 0x79063fe2u, 0x3ea64532u, 0x03c66c82u, - 0x8196fb53u, 0xbcf6d2e3u, 0xfb56a833u, 0xc6368183u, 0x74165d93u, 0x49767423u, 0x0ed60ef3u, 0x33b62743u, - 0xd1062710u, 0xec660ea0u, 0xabc67470u, 0x96a65dc0u, 0x248681d0u, 0x19e6a860u, 0x5e46d2b0u, 0x6326fb00u, - 0xe1766cd1u, 0xdc164561u, 0x9bb63fb1u, 0xa6d61601u, 0x14f6ca11u, 0x2996e3a1u, 0x6e369971u, 0x5356b0c1u, - 0x70279f96u, 0x4d47b626u, 0x0ae7ccf6u, 0x3787e546u, 0x85a73956u, 0xb8c710e6u, 0xff676a36u, 0xc2074386u, - 0x4057d457u, 0x7d37fde7u, 0x3a978737u, 0x07f7ae87u, 0xb5d77297u, 0x88b75b27u, 0xcf1721f7u, 0xf2770847u, - 0x10c70814u, 0x2da721a4u, 0x6a075b74u, 0x576772c4u, 0xe547aed4u, 0xd8278764u, 0x9f87fdb4u, 0xa2e7d404u, - 0x20b743d5u, 0x1dd76a65u, 0x5a7710b5u, 0x67173905u, 0xd537e515u, 0xe857cca5u, 0xaff7b675u, 0x92979fc5u, - 0xe915e8dbu, 0xd475c16bu, 0x93d5bbbbu, 0xaeb5920bu, 0x1c954e1bu, 0x21f567abu, 0x66551d7bu, 0x5b3534cbu, - 0xd965a31au, 0xe4058aaau, 0xa3a5f07au, 0x9ec5d9cau, 0x2ce505dau, 0x11852c6au, 0x562556bau, 0x6b457f0au, - 0x89f57f59u, 0xb49556e9u, 0xf3352c39u, 0xce550589u, 0x7c75d999u, 0x4115f029u, 0x06b58af9u, 0x3bd5a349u, - 0xb9853498u, 0x84e51d28u, 0xc34567f8u, 0xfe254e48u, 0x4c059258u, 0x7165bbe8u, 0x36c5c138u, 0x0ba5e888u, - 0x28d4c7dfu, 0x15b4ee6fu, 0x521494bfu, 0x6f74bd0fu, 0xdd54611fu, 0xe03448afu, 0xa794327fu, 0x9af41bcfu, - 0x18a48c1eu, 0x25c4a5aeu, 0x6264df7eu, 0x5f04f6ceu, 0xed242adeu, 0xd044036eu, 0x97e479beu, 0xaa84500eu, - 0x4834505du, 0x755479edu, 0x32f4033du, 0x0f942a8du, 0xbdb4f69du, 0x80d4df2du, 0xc774a5fdu, 0xfa148c4du, - 0x78441b9cu, 0x4524322cu, 0x028448fcu, 0x3fe4614cu, 0x8dc4bd5cu, 0xb0a494ecu, 0xf704ee3cu, 0xca64c78cu -}; - -static const unsigned lodepng_crc32_table5[256] = { - 0x00000000u, 0xcb5cd3a5u, 0x4dc8a10bu, 0x869472aeu, 0x9b914216u, 0x50cd91b3u, 0xd659e31du, 0x1d0530b8u, - 0xec53826du, 0x270f51c8u, 0xa19b2366u, 0x6ac7f0c3u, 0x77c2c07bu, 0xbc9e13deu, 0x3a0a6170u, 0xf156b2d5u, - 0x03d6029bu, 0xc88ad13eu, 0x4e1ea390u, 0x85427035u, 0x9847408du, 0x531b9328u, 0xd58fe186u, 0x1ed33223u, - 0xef8580f6u, 0x24d95353u, 0xa24d21fdu, 0x6911f258u, 0x7414c2e0u, 0xbf481145u, 0x39dc63ebu, 0xf280b04eu, - 0x07ac0536u, 0xccf0d693u, 0x4a64a43du, 0x81387798u, 0x9c3d4720u, 0x57619485u, 0xd1f5e62bu, 0x1aa9358eu, - 0xebff875bu, 0x20a354feu, 0xa6372650u, 0x6d6bf5f5u, 0x706ec54du, 0xbb3216e8u, 0x3da66446u, 0xf6fab7e3u, - 0x047a07adu, 0xcf26d408u, 0x49b2a6a6u, 0x82ee7503u, 0x9feb45bbu, 0x54b7961eu, 0xd223e4b0u, 0x197f3715u, - 0xe82985c0u, 0x23755665u, 0xa5e124cbu, 0x6ebdf76eu, 0x73b8c7d6u, 0xb8e41473u, 0x3e7066ddu, 0xf52cb578u, - 0x0f580a6cu, 0xc404d9c9u, 0x4290ab67u, 0x89cc78c2u, 0x94c9487au, 0x5f959bdfu, 0xd901e971u, 0x125d3ad4u, - 0xe30b8801u, 0x28575ba4u, 0xaec3290au, 0x659ffaafu, 0x789aca17u, 0xb3c619b2u, 0x35526b1cu, 0xfe0eb8b9u, - 0x0c8e08f7u, 0xc7d2db52u, 0x4146a9fcu, 0x8a1a7a59u, 0x971f4ae1u, 0x5c439944u, 0xdad7ebeau, 0x118b384fu, - 0xe0dd8a9au, 0x2b81593fu, 0xad152b91u, 0x6649f834u, 0x7b4cc88cu, 0xb0101b29u, 0x36846987u, 0xfdd8ba22u, - 0x08f40f5au, 0xc3a8dcffu, 0x453cae51u, 0x8e607df4u, 0x93654d4cu, 0x58399ee9u, 0xdeadec47u, 0x15f13fe2u, - 0xe4a78d37u, 0x2ffb5e92u, 0xa96f2c3cu, 0x6233ff99u, 0x7f36cf21u, 0xb46a1c84u, 0x32fe6e2au, 0xf9a2bd8fu, - 0x0b220dc1u, 0xc07ede64u, 0x46eaaccau, 0x8db67f6fu, 0x90b34fd7u, 0x5bef9c72u, 0xdd7beedcu, 0x16273d79u, - 0xe7718facu, 0x2c2d5c09u, 0xaab92ea7u, 0x61e5fd02u, 0x7ce0cdbau, 0xb7bc1e1fu, 0x31286cb1u, 0xfa74bf14u, - 0x1eb014d8u, 0xd5ecc77du, 0x5378b5d3u, 0x98246676u, 0x852156ceu, 0x4e7d856bu, 0xc8e9f7c5u, 0x03b52460u, - 0xf2e396b5u, 0x39bf4510u, 0xbf2b37beu, 0x7477e41bu, 0x6972d4a3u, 0xa22e0706u, 0x24ba75a8u, 0xefe6a60du, - 0x1d661643u, 0xd63ac5e6u, 0x50aeb748u, 0x9bf264edu, 0x86f75455u, 0x4dab87f0u, 0xcb3ff55eu, 0x006326fbu, - 0xf135942eu, 0x3a69478bu, 0xbcfd3525u, 0x77a1e680u, 0x6aa4d638u, 0xa1f8059du, 0x276c7733u, 0xec30a496u, - 0x191c11eeu, 0xd240c24bu, 0x54d4b0e5u, 0x9f886340u, 0x828d53f8u, 0x49d1805du, 0xcf45f2f3u, 0x04192156u, - 0xf54f9383u, 0x3e134026u, 0xb8873288u, 0x73dbe12du, 0x6eded195u, 0xa5820230u, 0x2316709eu, 0xe84aa33bu, - 0x1aca1375u, 0xd196c0d0u, 0x5702b27eu, 0x9c5e61dbu, 0x815b5163u, 0x4a0782c6u, 0xcc93f068u, 0x07cf23cdu, - 0xf6999118u, 0x3dc542bdu, 0xbb513013u, 0x700de3b6u, 0x6d08d30eu, 0xa65400abu, 0x20c07205u, 0xeb9ca1a0u, - 0x11e81eb4u, 0xdab4cd11u, 0x5c20bfbfu, 0x977c6c1au, 0x8a795ca2u, 0x41258f07u, 0xc7b1fda9u, 0x0ced2e0cu, - 0xfdbb9cd9u, 0x36e74f7cu, 0xb0733dd2u, 0x7b2fee77u, 0x662adecfu, 0xad760d6au, 0x2be27fc4u, 0xe0beac61u, - 0x123e1c2fu, 0xd962cf8au, 0x5ff6bd24u, 0x94aa6e81u, 0x89af5e39u, 0x42f38d9cu, 0xc467ff32u, 0x0f3b2c97u, - 0xfe6d9e42u, 0x35314de7u, 0xb3a53f49u, 0x78f9ececu, 0x65fcdc54u, 0xaea00ff1u, 0x28347d5fu, 0xe368aefau, - 0x16441b82u, 0xdd18c827u, 0x5b8cba89u, 0x90d0692cu, 0x8dd55994u, 0x46898a31u, 0xc01df89fu, 0x0b412b3au, - 0xfa1799efu, 0x314b4a4au, 0xb7df38e4u, 0x7c83eb41u, 0x6186dbf9u, 0xaada085cu, 0x2c4e7af2u, 0xe712a957u, - 0x15921919u, 0xdececabcu, 0x585ab812u, 0x93066bb7u, 0x8e035b0fu, 0x455f88aau, 0xc3cbfa04u, 0x089729a1u, - 0xf9c19b74u, 0x329d48d1u, 0xb4093a7fu, 0x7f55e9dau, 0x6250d962u, 0xa90c0ac7u, 0x2f987869u, 0xe4c4abccu -}; - -static const unsigned lodepng_crc32_table6[256] = { - 0x00000000u, 0xa6770bb4u, 0x979f1129u, 0x31e81a9du, 0xf44f2413u, 0x52382fa7u, 0x63d0353au, 0xc5a73e8eu, - 0x33ef4e67u, 0x959845d3u, 0xa4705f4eu, 0x020754fau, 0xc7a06a74u, 0x61d761c0u, 0x503f7b5du, 0xf64870e9u, - 0x67de9cceu, 0xc1a9977au, 0xf0418de7u, 0x56368653u, 0x9391b8ddu, 0x35e6b369u, 0x040ea9f4u, 0xa279a240u, - 0x5431d2a9u, 0xf246d91du, 0xc3aec380u, 0x65d9c834u, 0xa07ef6bau, 0x0609fd0eu, 0x37e1e793u, 0x9196ec27u, - 0xcfbd399cu, 0x69ca3228u, 0x582228b5u, 0xfe552301u, 0x3bf21d8fu, 0x9d85163bu, 0xac6d0ca6u, 0x0a1a0712u, - 0xfc5277fbu, 0x5a257c4fu, 0x6bcd66d2u, 0xcdba6d66u, 0x081d53e8u, 0xae6a585cu, 0x9f8242c1u, 0x39f54975u, - 0xa863a552u, 0x0e14aee6u, 0x3ffcb47bu, 0x998bbfcfu, 0x5c2c8141u, 0xfa5b8af5u, 0xcbb39068u, 0x6dc49bdcu, - 0x9b8ceb35u, 0x3dfbe081u, 0x0c13fa1cu, 0xaa64f1a8u, 0x6fc3cf26u, 0xc9b4c492u, 0xf85cde0fu, 0x5e2bd5bbu, - 0x440b7579u, 0xe27c7ecdu, 0xd3946450u, 0x75e36fe4u, 0xb044516au, 0x16335adeu, 0x27db4043u, 0x81ac4bf7u, - 0x77e43b1eu, 0xd19330aau, 0xe07b2a37u, 0x460c2183u, 0x83ab1f0du, 0x25dc14b9u, 0x14340e24u, 0xb2430590u, - 0x23d5e9b7u, 0x85a2e203u, 0xb44af89eu, 0x123df32au, 0xd79acda4u, 0x71edc610u, 0x4005dc8du, 0xe672d739u, - 0x103aa7d0u, 0xb64dac64u, 0x87a5b6f9u, 0x21d2bd4du, 0xe47583c3u, 0x42028877u, 0x73ea92eau, 0xd59d995eu, - 0x8bb64ce5u, 0x2dc14751u, 0x1c295dccu, 0xba5e5678u, 0x7ff968f6u, 0xd98e6342u, 0xe86679dfu, 0x4e11726bu, - 0xb8590282u, 0x1e2e0936u, 0x2fc613abu, 0x89b1181fu, 0x4c162691u, 0xea612d25u, 0xdb8937b8u, 0x7dfe3c0cu, - 0xec68d02bu, 0x4a1fdb9fu, 0x7bf7c102u, 0xdd80cab6u, 0x1827f438u, 0xbe50ff8cu, 0x8fb8e511u, 0x29cfeea5u, - 0xdf879e4cu, 0x79f095f8u, 0x48188f65u, 0xee6f84d1u, 0x2bc8ba5fu, 0x8dbfb1ebu, 0xbc57ab76u, 0x1a20a0c2u, - 0x8816eaf2u, 0x2e61e146u, 0x1f89fbdbu, 0xb9fef06fu, 0x7c59cee1u, 0xda2ec555u, 0xebc6dfc8u, 0x4db1d47cu, - 0xbbf9a495u, 0x1d8eaf21u, 0x2c66b5bcu, 0x8a11be08u, 0x4fb68086u, 0xe9c18b32u, 0xd82991afu, 0x7e5e9a1bu, - 0xefc8763cu, 0x49bf7d88u, 0x78576715u, 0xde206ca1u, 0x1b87522fu, 0xbdf0599bu, 0x8c184306u, 0x2a6f48b2u, - 0xdc27385bu, 0x7a5033efu, 0x4bb82972u, 0xedcf22c6u, 0x28681c48u, 0x8e1f17fcu, 0xbff70d61u, 0x198006d5u, - 0x47abd36eu, 0xe1dcd8dau, 0xd034c247u, 0x7643c9f3u, 0xb3e4f77du, 0x1593fcc9u, 0x247be654u, 0x820cede0u, - 0x74449d09u, 0xd23396bdu, 0xe3db8c20u, 0x45ac8794u, 0x800bb91au, 0x267cb2aeu, 0x1794a833u, 0xb1e3a387u, - 0x20754fa0u, 0x86024414u, 0xb7ea5e89u, 0x119d553du, 0xd43a6bb3u, 0x724d6007u, 0x43a57a9au, 0xe5d2712eu, - 0x139a01c7u, 0xb5ed0a73u, 0x840510eeu, 0x22721b5au, 0xe7d525d4u, 0x41a22e60u, 0x704a34fdu, 0xd63d3f49u, - 0xcc1d9f8bu, 0x6a6a943fu, 0x5b828ea2u, 0xfdf58516u, 0x3852bb98u, 0x9e25b02cu, 0xafcdaab1u, 0x09baa105u, - 0xfff2d1ecu, 0x5985da58u, 0x686dc0c5u, 0xce1acb71u, 0x0bbdf5ffu, 0xadcafe4bu, 0x9c22e4d6u, 0x3a55ef62u, - 0xabc30345u, 0x0db408f1u, 0x3c5c126cu, 0x9a2b19d8u, 0x5f8c2756u, 0xf9fb2ce2u, 0xc813367fu, 0x6e643dcbu, - 0x982c4d22u, 0x3e5b4696u, 0x0fb35c0bu, 0xa9c457bfu, 0x6c636931u, 0xca146285u, 0xfbfc7818u, 0x5d8b73acu, - 0x03a0a617u, 0xa5d7ada3u, 0x943fb73eu, 0x3248bc8au, 0xf7ef8204u, 0x519889b0u, 0x6070932du, 0xc6079899u, - 0x304fe870u, 0x9638e3c4u, 0xa7d0f959u, 0x01a7f2edu, 0xc400cc63u, 0x6277c7d7u, 0x539fdd4au, 0xf5e8d6feu, - 0x647e3ad9u, 0xc209316du, 0xf3e12bf0u, 0x55962044u, 0x90311ecau, 0x3646157eu, 0x07ae0fe3u, 0xa1d90457u, - 0x579174beu, 0xf1e67f0au, 0xc00e6597u, 0x66796e23u, 0xa3de50adu, 0x05a95b19u, 0x34414184u, 0x92364a30u -}; - -static const unsigned lodepng_crc32_table7[256] = { - 0x00000000u, 0xccaa009eu, 0x4225077du, 0x8e8f07e3u, 0x844a0efau, 0x48e00e64u, 0xc66f0987u, 0x0ac50919u, - 0xd3e51bb5u, 0x1f4f1b2bu, 0x91c01cc8u, 0x5d6a1c56u, 0x57af154fu, 0x9b0515d1u, 0x158a1232u, 0xd92012acu, - 0x7cbb312bu, 0xb01131b5u, 0x3e9e3656u, 0xf23436c8u, 0xf8f13fd1u, 0x345b3f4fu, 0xbad438acu, 0x767e3832u, - 0xaf5e2a9eu, 0x63f42a00u, 0xed7b2de3u, 0x21d12d7du, 0x2b142464u, 0xe7be24fau, 0x69312319u, 0xa59b2387u, - 0xf9766256u, 0x35dc62c8u, 0xbb53652bu, 0x77f965b5u, 0x7d3c6cacu, 0xb1966c32u, 0x3f196bd1u, 0xf3b36b4fu, - 0x2a9379e3u, 0xe639797du, 0x68b67e9eu, 0xa41c7e00u, 0xaed97719u, 0x62737787u, 0xecfc7064u, 0x205670fau, - 0x85cd537du, 0x496753e3u, 0xc7e85400u, 0x0b42549eu, 0x01875d87u, 0xcd2d5d19u, 0x43a25afau, 0x8f085a64u, - 0x562848c8u, 0x9a824856u, 0x140d4fb5u, 0xd8a74f2bu, 0xd2624632u, 0x1ec846acu, 0x9047414fu, 0x5ced41d1u, - 0x299dc2edu, 0xe537c273u, 0x6bb8c590u, 0xa712c50eu, 0xadd7cc17u, 0x617dcc89u, 0xeff2cb6au, 0x2358cbf4u, - 0xfa78d958u, 0x36d2d9c6u, 0xb85dde25u, 0x74f7debbu, 0x7e32d7a2u, 0xb298d73cu, 0x3c17d0dfu, 0xf0bdd041u, - 0x5526f3c6u, 0x998cf358u, 0x1703f4bbu, 0xdba9f425u, 0xd16cfd3cu, 0x1dc6fda2u, 0x9349fa41u, 0x5fe3fadfu, - 0x86c3e873u, 0x4a69e8edu, 0xc4e6ef0eu, 0x084cef90u, 0x0289e689u, 0xce23e617u, 0x40ace1f4u, 0x8c06e16au, - 0xd0eba0bbu, 0x1c41a025u, 0x92cea7c6u, 0x5e64a758u, 0x54a1ae41u, 0x980baedfu, 0x1684a93cu, 0xda2ea9a2u, - 0x030ebb0eu, 0xcfa4bb90u, 0x412bbc73u, 0x8d81bcedu, 0x8744b5f4u, 0x4beeb56au, 0xc561b289u, 0x09cbb217u, - 0xac509190u, 0x60fa910eu, 0xee7596edu, 0x22df9673u, 0x281a9f6au, 0xe4b09ff4u, 0x6a3f9817u, 0xa6959889u, - 0x7fb58a25u, 0xb31f8abbu, 0x3d908d58u, 0xf13a8dc6u, 0xfbff84dfu, 0x37558441u, 0xb9da83a2u, 0x7570833cu, - 0x533b85dau, 0x9f918544u, 0x111e82a7u, 0xddb48239u, 0xd7718b20u, 0x1bdb8bbeu, 0x95548c5du, 0x59fe8cc3u, - 0x80de9e6fu, 0x4c749ef1u, 0xc2fb9912u, 0x0e51998cu, 0x04949095u, 0xc83e900bu, 0x46b197e8u, 0x8a1b9776u, - 0x2f80b4f1u, 0xe32ab46fu, 0x6da5b38cu, 0xa10fb312u, 0xabcaba0bu, 0x6760ba95u, 0xe9efbd76u, 0x2545bde8u, - 0xfc65af44u, 0x30cfafdau, 0xbe40a839u, 0x72eaa8a7u, 0x782fa1beu, 0xb485a120u, 0x3a0aa6c3u, 0xf6a0a65du, - 0xaa4de78cu, 0x66e7e712u, 0xe868e0f1u, 0x24c2e06fu, 0x2e07e976u, 0xe2ade9e8u, 0x6c22ee0bu, 0xa088ee95u, - 0x79a8fc39u, 0xb502fca7u, 0x3b8dfb44u, 0xf727fbdau, 0xfde2f2c3u, 0x3148f25du, 0xbfc7f5beu, 0x736df520u, - 0xd6f6d6a7u, 0x1a5cd639u, 0x94d3d1dau, 0x5879d144u, 0x52bcd85du, 0x9e16d8c3u, 0x1099df20u, 0xdc33dfbeu, - 0x0513cd12u, 0xc9b9cd8cu, 0x4736ca6fu, 0x8b9ccaf1u, 0x8159c3e8u, 0x4df3c376u, 0xc37cc495u, 0x0fd6c40bu, - 0x7aa64737u, 0xb60c47a9u, 0x3883404au, 0xf42940d4u, 0xfeec49cdu, 0x32464953u, 0xbcc94eb0u, 0x70634e2eu, - 0xa9435c82u, 0x65e95c1cu, 0xeb665bffu, 0x27cc5b61u, 0x2d095278u, 0xe1a352e6u, 0x6f2c5505u, 0xa386559bu, - 0x061d761cu, 0xcab77682u, 0x44387161u, 0x889271ffu, 0x825778e6u, 0x4efd7878u, 0xc0727f9bu, 0x0cd87f05u, - 0xd5f86da9u, 0x19526d37u, 0x97dd6ad4u, 0x5b776a4au, 0x51b26353u, 0x9d1863cdu, 0x1397642eu, 0xdf3d64b0u, - 0x83d02561u, 0x4f7a25ffu, 0xc1f5221cu, 0x0d5f2282u, 0x079a2b9bu, 0xcb302b05u, 0x45bf2ce6u, 0x89152c78u, - 0x50353ed4u, 0x9c9f3e4au, 0x121039a9u, 0xdeba3937u, 0xd47f302eu, 0x18d530b0u, 0x965a3753u, 0x5af037cdu, - 0xff6b144au, 0x33c114d4u, 0xbd4e1337u, 0x71e413a9u, 0x7b211ab0u, 0xb78b1a2eu, 0x39041dcdu, 0xf5ae1d53u, - 0x2c8e0fffu, 0xe0240f61u, 0x6eab0882u, 0xa201081cu, 0xa8c40105u, 0x646e019bu, 0xeae10678u, 0x264b06e6u -}; - -/* Computes the cyclic redundancy check as used by PNG chunks*/ -unsigned lodepng_crc32(const unsigned char * data, size_t length) -{ - /*Using the Slicing by Eight algorithm*/ - unsigned r = 0xffffffffu; - while(length >= 8) { - r = lodepng_crc32_table7[(data[0] ^ (r & 0xffu))] ^ - lodepng_crc32_table6[(data[1] ^ ((r >> 8) & 0xffu))] ^ - lodepng_crc32_table5[(data[2] ^ ((r >> 16) & 0xffu))] ^ - lodepng_crc32_table4[(data[3] ^ ((r >> 24) & 0xffu))] ^ - lodepng_crc32_table3[data[4]] ^ - lodepng_crc32_table2[data[5]] ^ - lodepng_crc32_table1[data[6]] ^ - lodepng_crc32_table0[data[7]]; - data += 8; - length -= 8; - } - while(length--) { - r = lodepng_crc32_table0[(r ^ *data++) & 0xffu] ^ (r >> 8); - } - return r ^ 0xffffffffu; -} -#else /* LODEPNG_COMPILE_CRC */ -/*in this case, the function is only declared here, and must be defined externally -so that it will be linked in. - -Example implementation that uses a much smaller lookup table for memory constrained cases: - -unsigned lodepng_crc32(const unsigned char* data, size_t length) { - unsigned r = 0xffffffffu; - static const unsigned table[16] = { - 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, - 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c - }; - while(length--) { - r = table[(r ^ *data) & 0xf] ^ (r >> 4); - r = table[(r ^ (*data >> 4)) & 0xf] ^ (r >> 4); - data++; - } - return r ^ 0xffffffffu; -} -*/ -unsigned lodepng_crc32(const unsigned char * data, size_t length); -#endif /* LODEPNG_COMPILE_CRC */ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Reading and writing PNG color channel bits / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/* The color channel bits of less-than-8-bit pixels are read with the MSB of bytes first, -so LodePNGBitWriter and LodePNGBitReader can't be used for those. */ - -static unsigned char readBitFromReversedStream(size_t * bitpointer, const unsigned char * bitstream) -{ - unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); - ++(*bitpointer); - return result; -} - -/* TODO: make this faster */ -static unsigned readBitsFromReversedStream(size_t * bitpointer, const unsigned char * bitstream, size_t nbits) -{ - unsigned result = 0; - size_t i; - for(i = 0 ; i < nbits; ++i) { - result <<= 1u; - result |= (unsigned)readBitFromReversedStream(bitpointer, bitstream); - } - return result; -} - -static void setBitOfReversedStream(size_t * bitpointer, unsigned char * bitstream, unsigned char bit) -{ - /*the current bit in bitstream may be 0 or 1 for this to work*/ - if(bit == 0) bitstream[(*bitpointer) >> 3u] &= (unsigned char)(~(1u << (7u - ((*bitpointer) & 7u)))); - else bitstream[(*bitpointer) >> 3u] |= (1u << (7u - ((*bitpointer) & 7u))); - ++(*bitpointer); -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG chunks / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -unsigned lodepng_chunk_length(const unsigned char * chunk) -{ - return lodepng_read32bitInt(chunk); -} - -void lodepng_chunk_type(char type[5], const unsigned char * chunk) -{ - unsigned i; - for(i = 0; i != 4; ++i) type[i] = (char)chunk[4 + i]; - type[4] = 0; /*null termination char*/ -} - -unsigned char lodepng_chunk_type_equals(const unsigned char * chunk, const char * type) -{ - if(lodepng_strlen(type) != 4) return 0; - return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]); -} - -unsigned char lodepng_chunk_ancillary(const unsigned char * chunk) -{ - return((chunk[4] & 32) != 0); -} - -unsigned char lodepng_chunk_private(const unsigned char * chunk) -{ - return((chunk[6] & 32) != 0); -} - -unsigned char lodepng_chunk_safetocopy(const unsigned char * chunk) -{ - return((chunk[7] & 32) != 0); -} - -unsigned char * lodepng_chunk_data(unsigned char * chunk) -{ - return &chunk[8]; -} - -const unsigned char * lodepng_chunk_data_const(const unsigned char * chunk) -{ - return &chunk[8]; -} - -unsigned lodepng_chunk_check_crc(const unsigned char * chunk) -{ - unsigned length = lodepng_chunk_length(chunk); - unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]); - /*the CRC is taken of the data and the 4 chunk type letters, not the length*/ - unsigned checksum = lodepng_crc32(&chunk[4], length + 4); - if(CRC != checksum) return 1; - else return 0; -} - -void lodepng_chunk_generate_crc(unsigned char * chunk) -{ - unsigned length = lodepng_chunk_length(chunk); - unsigned CRC = lodepng_crc32(&chunk[4], length + 4); - lodepng_set32bitInt(chunk + 8 + length, CRC); -} - -unsigned char * lodepng_chunk_next(unsigned char * chunk, unsigned char * end) -{ - size_t available_size = (size_t)(end - chunk); - if(chunk >= end || available_size < 12) return end; /*too small to contain a chunk*/ - if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 - && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { - /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ - return chunk + 8; - } - else { - size_t total_chunk_length; - if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; - if(total_chunk_length > available_size) return end; /*outside of range*/ - return chunk + total_chunk_length; - } -} - -const unsigned char * lodepng_chunk_next_const(const unsigned char * chunk, const unsigned char * end) -{ - size_t available_size = (size_t)(end - chunk); - if(chunk >= end || available_size < 12) return end; /*too small to contain a chunk*/ - if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 - && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { - /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ - return chunk + 8; - } - else { - size_t total_chunk_length; - if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; - if(total_chunk_length > available_size) return end; /*outside of range*/ - return chunk + total_chunk_length; - } -} - -unsigned char * lodepng_chunk_find(unsigned char * chunk, unsigned char * end, const char type[5]) -{ - for(;;) { - if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */ - if(lodepng_chunk_type_equals(chunk, type)) return chunk; - chunk = lodepng_chunk_next(chunk, end); - } -} - -const unsigned char * lodepng_chunk_find_const(const unsigned char * chunk, const unsigned char * end, - const char type[5]) -{ - for(;;) { - if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */ - if(lodepng_chunk_type_equals(chunk, type)) return chunk; - chunk = lodepng_chunk_next_const(chunk, end); - } -} - -unsigned lodepng_chunk_append(unsigned char ** out, size_t * outsize, const unsigned char * chunk) -{ - unsigned i; - size_t total_chunk_length, new_length; - unsigned char * chunk_start, * new_buffer; - - if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return 77; - if(lodepng_addofl(*outsize, total_chunk_length, &new_length)) return 77; - - new_buffer = (unsigned char *)lodepng_realloc(*out, new_length); - if(!new_buffer) return 83; /*alloc fail*/ - (*out) = new_buffer; - (*outsize) = new_length; - chunk_start = &(*out)[new_length - total_chunk_length]; - - for(i = 0; i != total_chunk_length; ++i) chunk_start[i] = chunk[i]; - - return 0; -} - -/*Sets length and name and allocates the space for data and crc but does not -set data or crc yet. Returns the start of the chunk in chunk. The start of -the data is at chunk + 8. To finalize chunk, add the data, then use -lodepng_chunk_generate_crc */ -static unsigned lodepng_chunk_init(unsigned char ** chunk, - ucvector * out, - size_t length, const char * type) -{ - size_t new_length = out->size; - if(lodepng_addofl(new_length, length, &new_length)) return 77; - if(lodepng_addofl(new_length, 12, &new_length)) return 77; - if(!ucvector_resize(out, new_length)) return 83; /*alloc fail*/ - *chunk = out->data + new_length - length - 12u; - - /*1: length*/ - lodepng_set32bitInt(*chunk, (unsigned)length); - - /*2: chunk name (4 letters)*/ - lodepng_memcpy(*chunk + 4, type, 4); - - return 0; -} - -/* like lodepng_chunk_create but with custom allocsize */ -static unsigned lodepng_chunk_createv(ucvector * out, - size_t length, const char * type, const unsigned char * data) -{ - unsigned char * chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, length, type)); - - /*3: the data*/ - lodepng_memcpy(chunk + 8, data, length); - - /*4: CRC (of the chunkname characters and the data)*/ - lodepng_chunk_generate_crc(chunk); - - return 0; -} - -unsigned lodepng_chunk_create(unsigned char ** out, size_t * outsize, - size_t length, const char * type, const unsigned char * data) -{ - ucvector v = ucvector_init(*out, *outsize); - unsigned error = lodepng_chunk_createv(&v, length, type, data); - *out = v.data; - *outsize = v.size; - return error; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Color types, channels, bits / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*checks if the colortype is valid and the bitdepth bd is allowed for this colortype. -Return value is a LodePNG error code.*/ -static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) -{ - switch(colortype) { - case LCT_GREY: - if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; - break; - case LCT_RGB: - if(!(bd == 8 || bd == 16)) return 37; - break; - case LCT_PALETTE: - if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8)) return 37; - break; - case LCT_GREY_ALPHA: - if(!(bd == 8 || bd == 16)) return 37; - break; - case LCT_RGBA: - if(!(bd == 8 || bd == 16)) return 37; - break; - case LCT_MAX_OCTET_VALUE: - return 31; /* invalid color type */ - default: - return 31; /* invalid color type */ - } - return 0; /*allowed color type / bits combination*/ -} - -static unsigned getNumColorChannels(LodePNGColorType colortype) -{ - switch(colortype) { - case LCT_GREY: - return 1; - case LCT_RGB: - return 3; - case LCT_PALETTE: - return 1; - case LCT_GREY_ALPHA: - return 2; - case LCT_RGBA: - return 4; - case LCT_MAX_OCTET_VALUE: - return 0; /* invalid color type */ - default: - return 0; /*invalid color type*/ - } -} - -static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) -{ - /*bits per pixel is amount of channels * bits per channel*/ - return getNumColorChannels(colortype) * bitdepth; -} - -/* ////////////////////////////////////////////////////////////////////////// */ - -void lodepng_color_mode_init(LodePNGColorMode * info) -{ - info->key_defined = 0; - info->key_r = info->key_g = info->key_b = 0; - info->colortype = LCT_RGBA; - info->bitdepth = 8; - info->palette = 0; - info->palettesize = 0; -} - -/*allocates palette memory if needed, and initializes all colors to black*/ -static void lodepng_color_mode_alloc_palette(LodePNGColorMode * info) -{ - size_t i; - /*if the palette is already allocated, it will have size 1024 so no reallocation needed in that case*/ - /*the palette must have room for up to 256 colors with 4 bytes each.*/ - if(!info->palette) info->palette = (unsigned char *)lodepng_malloc(1024); - if(!info->palette) return; /*alloc fail*/ - for(i = 0; i != 256; ++i) { - /*Initialize all unused colors with black, the value used for invalid palette indices. - This is an error according to the PNG spec, but common PNG decoders make it black instead. - That makes color conversion slightly faster due to no error handling needed.*/ - info->palette[i * 4 + 0] = 0; - info->palette[i * 4 + 1] = 0; - info->palette[i * 4 + 2] = 0; - info->palette[i * 4 + 3] = 255; - } -} - -void lodepng_color_mode_cleanup(LodePNGColorMode * info) -{ - lodepng_palette_clear(info); -} - -unsigned lodepng_color_mode_copy(LodePNGColorMode * dest, const LodePNGColorMode * source) -{ - lodepng_color_mode_cleanup(dest); - lodepng_memcpy(dest, source, sizeof(LodePNGColorMode)); - if(source->palette) { - dest->palette = (unsigned char *)lodepng_malloc(1024); - if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ - lodepng_memcpy(dest->palette, source->palette, source->palettesize * 4); - } - return 0; -} - -LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth) -{ - LodePNGColorMode result; - lodepng_color_mode_init(&result); - result.colortype = colortype; - result.bitdepth = bitdepth; - return result; -} - -static int lodepng_color_mode_equal(const LodePNGColorMode * a, const LodePNGColorMode * b) -{ - size_t i; - if(a->colortype != b->colortype) return 0; - if(a->bitdepth != b->bitdepth) return 0; - if(a->key_defined != b->key_defined) return 0; - if(a->key_defined) { - if(a->key_r != b->key_r) return 0; - if(a->key_g != b->key_g) return 0; - if(a->key_b != b->key_b) return 0; - } - if(a->palettesize != b->palettesize) return 0; - for(i = 0; i != a->palettesize * 4; ++i) { - if(a->palette[i] != b->palette[i]) return 0; - } - return 1; -} - -void lodepng_palette_clear(LodePNGColorMode * info) -{ - if(info->palette) lodepng_free(info->palette); - info->palette = 0; - info->palettesize = 0; -} - -unsigned lodepng_palette_add(LodePNGColorMode * info, - unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - if(!info->palette) { /*allocate palette if empty*/ - lodepng_color_mode_alloc_palette(info); - if(!info->palette) return 83; /*alloc fail*/ - } - if(info->palettesize >= 256) { - return 108; /*too many palette values*/ - } - info->palette[4 * info->palettesize + 0] = r; - info->palette[4 * info->palettesize + 1] = g; - info->palette[4 * info->palettesize + 2] = b; - info->palette[4 * info->palettesize + 3] = a; - ++info->palettesize; - return 0; -} - -/*calculate bits per pixel out of colortype and bitdepth*/ -unsigned lodepng_get_bpp(const LodePNGColorMode * info) -{ - return lodepng_get_bpp_lct(info->colortype, info->bitdepth); -} - -unsigned lodepng_get_channels(const LodePNGColorMode * info) -{ - return getNumColorChannels(info->colortype); -} - -unsigned lodepng_is_greyscale_type(const LodePNGColorMode * info) -{ - return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA; -} - -unsigned lodepng_is_alpha_type(const LodePNGColorMode * info) -{ - return (info->colortype & 4) != 0; /*4 or 6*/ -} - -unsigned lodepng_is_palette_type(const LodePNGColorMode * info) -{ - return info->colortype == LCT_PALETTE; -} - -unsigned lodepng_has_palette_alpha(const LodePNGColorMode * info) -{ - size_t i; - for(i = 0; i != info->palettesize; ++i) { - if(info->palette[i * 4 + 3] < 255) return 1; - } - return 0; -} - -unsigned lodepng_can_have_alpha(const LodePNGColorMode * info) -{ - return info->key_defined - || lodepng_is_alpha_type(info) - || lodepng_has_palette_alpha(info); -} - -static size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) -{ - size_t bpp = lodepng_get_bpp_lct(colortype, bitdepth); - size_t n = (size_t)w * (size_t)h; - return ((n / 8u) * bpp) + ((n & 7u) * bpp + 7u) / 8u; -} - -size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode * color) -{ - return lodepng_get_raw_size_lct(w, h, color->colortype, color->bitdepth); -} - - -#ifdef LODEPNG_COMPILE_PNG - -/*in an idat chunk, each scanline is a multiple of 8 bits, unlike the lodepng output buffer, -and in addition has one extra byte per line: the filter byte. So this gives a larger -result than lodepng_get_raw_size. Set h to 1 to get the size of 1 row including filter byte. */ -static size_t lodepng_get_raw_size_idat(unsigned w, unsigned h, unsigned bpp) -{ - /* + 1 for the filter byte, and possibly plus padding bits per line. */ - /* Ignoring casts, the expression is equal to (w * bpp + 7) / 8 + 1, but avoids overflow of w * bpp */ - size_t line = ((size_t)(w / 8u) * bpp) + 1u + ((w & 7u) * bpp + 7u) / 8u; - return (size_t)h * line; -} - -#ifdef LODEPNG_COMPILE_DECODER -/*Safely checks whether size_t overflow can be caused due to amount of pixels. -This check is overcautious rather than precise. If this check indicates no overflow, -you can safely compute in a size_t (but not an unsigned): --(size_t)w * (size_t)h * 8 --amount of bytes in IDAT (including filter, padding and Adam7 bytes) --amount of bytes in raw color model -Returns 1 if overflow possible, 0 if not. -*/ -static int lodepng_pixel_overflow(unsigned w, unsigned h, - const LodePNGColorMode * pngcolor, const LodePNGColorMode * rawcolor) -{ - size_t bpp = LODEPNG_MAX(lodepng_get_bpp(pngcolor), lodepng_get_bpp(rawcolor)); - size_t numpixels, total; - size_t line; /* bytes per line in worst case */ - - if(lodepng_mulofl((size_t)w, (size_t)h, &numpixels)) return 1; - if(lodepng_mulofl(numpixels, 8, &total)) return 1; /* bit pointer with 8-bit color, or 8 bytes per channel color */ - - /* Bytes per scanline with the expression "(w / 8u) * bpp) + ((w & 7u) * bpp + 7u) / 8u" */ - if(lodepng_mulofl((size_t)(w / 8u), bpp, &line)) return 1; - if(lodepng_addofl(line, ((w & 7u) * bpp + 7u) / 8u, &line)) return 1; - - if(lodepng_addofl(line, 5, &line)) return 1; /* 5 bytes overhead per line: 1 filterbyte, 4 for Adam7 worst case */ - if(lodepng_mulofl(line, h, &total)) return 1; /* Total bytes in worst case */ - - return 0; /* no overflow */ -} -#endif /*LODEPNG_COMPILE_DECODER*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - -static void LodePNGUnknownChunks_init(LodePNGInfo * info) -{ - unsigned i; - for(i = 0; i != 3; ++i) info->unknown_chunks_data[i] = 0; - for(i = 0; i != 3; ++i) info->unknown_chunks_size[i] = 0; -} - -static void LodePNGUnknownChunks_cleanup(LodePNGInfo * info) -{ - unsigned i; - for(i = 0; i != 3; ++i) lodepng_free(info->unknown_chunks_data[i]); -} - -static unsigned LodePNGUnknownChunks_copy(LodePNGInfo * dest, const LodePNGInfo * src) -{ - unsigned i; - - LodePNGUnknownChunks_cleanup(dest); - - for(i = 0; i != 3; ++i) { - size_t j; - dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; - dest->unknown_chunks_data[i] = (unsigned char *)lodepng_malloc(src->unknown_chunks_size[i]); - if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ - for(j = 0; j < src->unknown_chunks_size[i]; ++j) { - dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; - } - } - - return 0; -} - -/******************************************************************************/ - -static void LodePNGText_init(LodePNGInfo * info) -{ - info->text_num = 0; - info->text_keys = NULL; - info->text_strings = NULL; -} - -static void LodePNGText_cleanup(LodePNGInfo * info) -{ - size_t i; - for(i = 0; i != info->text_num; ++i) { - string_cleanup(&info->text_keys[i]); - string_cleanup(&info->text_strings[i]); - } - lodepng_free(info->text_keys); - lodepng_free(info->text_strings); -} - -static unsigned LodePNGText_copy(LodePNGInfo * dest, const LodePNGInfo * source) -{ - size_t i = 0; - dest->text_keys = NULL; - dest->text_strings = NULL; - dest->text_num = 0; - for(i = 0; i != source->text_num; ++i) { - CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); - } - return 0; -} - -static unsigned lodepng_add_text_sized(LodePNGInfo * info, const char * key, const char * str, size_t size) -{ - char ** new_keys = (char **)(lodepng_realloc(info->text_keys, sizeof(char *) * (info->text_num + 1))); - char ** new_strings = (char **)(lodepng_realloc(info->text_strings, sizeof(char *) * (info->text_num + 1))); - - if(new_keys) info->text_keys = new_keys; - if(new_strings) info->text_strings = new_strings; - - if(!new_keys || !new_strings) return 83; /*alloc fail*/ - - ++info->text_num; - info->text_keys[info->text_num - 1] = alloc_string(key); - info->text_strings[info->text_num - 1] = alloc_string_sized(str, size); - if(!info->text_keys[info->text_num - 1] || !info->text_strings[info->text_num - 1]) return 83; /*alloc fail*/ - - return 0; -} - -unsigned lodepng_add_text(LodePNGInfo * info, const char * key, const char * str) -{ - return lodepng_add_text_sized(info, key, str, lodepng_strlen(str)); -} - -void lodepng_clear_text(LodePNGInfo * info) -{ - LodePNGText_cleanup(info); -} - -/******************************************************************************/ - -static void LodePNGIText_init(LodePNGInfo * info) -{ - info->itext_num = 0; - info->itext_keys = NULL; - info->itext_langtags = NULL; - info->itext_transkeys = NULL; - info->itext_strings = NULL; -} - -static void LodePNGIText_cleanup(LodePNGInfo * info) -{ - size_t i; - for(i = 0; i != info->itext_num; ++i) { - string_cleanup(&info->itext_keys[i]); - string_cleanup(&info->itext_langtags[i]); - string_cleanup(&info->itext_transkeys[i]); - string_cleanup(&info->itext_strings[i]); - } - lodepng_free(info->itext_keys); - lodepng_free(info->itext_langtags); - lodepng_free(info->itext_transkeys); - lodepng_free(info->itext_strings); -} - -static unsigned LodePNGIText_copy(LodePNGInfo * dest, const LodePNGInfo * source) -{ - size_t i = 0; - dest->itext_keys = NULL; - dest->itext_langtags = NULL; - dest->itext_transkeys = NULL; - dest->itext_strings = NULL; - dest->itext_num = 0; - for(i = 0; i != source->itext_num; ++i) { - CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], - source->itext_transkeys[i], source->itext_strings[i])); - } - return 0; -} - -void lodepng_clear_itext(LodePNGInfo * info) -{ - LodePNGIText_cleanup(info); -} - -static unsigned lodepng_add_itext_sized(LodePNGInfo * info, const char * key, const char * langtag, - const char * transkey, const char * str, size_t size) -{ - char ** new_keys = (char **)(lodepng_realloc(info->itext_keys, sizeof(char *) * (info->itext_num + 1))); - char ** new_langtags = (char **)(lodepng_realloc(info->itext_langtags, sizeof(char *) * (info->itext_num + 1))); - char ** new_transkeys = (char **)(lodepng_realloc(info->itext_transkeys, sizeof(char *) * (info->itext_num + 1))); - char ** new_strings = (char **)(lodepng_realloc(info->itext_strings, sizeof(char *) * (info->itext_num + 1))); - - if(new_keys) info->itext_keys = new_keys; - if(new_langtags) info->itext_langtags = new_langtags; - if(new_transkeys) info->itext_transkeys = new_transkeys; - if(new_strings) info->itext_strings = new_strings; - - if(!new_keys || !new_langtags || !new_transkeys || !new_strings) return 83; /*alloc fail*/ - - ++info->itext_num; - - info->itext_keys[info->itext_num - 1] = alloc_string(key); - info->itext_langtags[info->itext_num - 1] = alloc_string(langtag); - info->itext_transkeys[info->itext_num - 1] = alloc_string(transkey); - info->itext_strings[info->itext_num - 1] = alloc_string_sized(str, size); - - return 0; -} - -unsigned lodepng_add_itext(LodePNGInfo * info, const char * key, const char * langtag, - const char * transkey, const char * str) -{ - return lodepng_add_itext_sized(info, key, langtag, transkey, str, lodepng_strlen(str)); -} - -/* same as set but does not delete */ -static unsigned lodepng_assign_icc(LodePNGInfo * info, const char * name, const unsigned char * profile, - unsigned profile_size) -{ - if(profile_size == 0) return 100; /*invalid ICC profile size*/ - - info->iccp_name = alloc_string(name); - info->iccp_profile = (unsigned char *)lodepng_malloc(profile_size); - - if(!info->iccp_name || !info->iccp_profile) return 83; /*alloc fail*/ - - lodepng_memcpy(info->iccp_profile, profile, profile_size); - info->iccp_profile_size = profile_size; - - return 0; /*ok*/ -} - -unsigned lodepng_set_icc(LodePNGInfo * info, const char * name, const unsigned char * profile, unsigned profile_size) -{ - if(info->iccp_name) lodepng_clear_icc(info); - info->iccp_defined = 1; - - return lodepng_assign_icc(info, name, profile, profile_size); -} - -void lodepng_clear_icc(LodePNGInfo * info) -{ - string_cleanup(&info->iccp_name); - lodepng_free(info->iccp_profile); - info->iccp_profile = NULL; - info->iccp_profile_size = 0; - info->iccp_defined = 0; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -void lodepng_info_init(LodePNGInfo * info) -{ - lodepng_color_mode_init(&info->color); - info->interlace_method = 0; - info->compression_method = 0; - info->filter_method = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - info->background_defined = 0; - info->background_r = info->background_g = info->background_b = 0; - - LodePNGText_init(info); - LodePNGIText_init(info); - - info->time_defined = 0; - info->phys_defined = 0; - - info->gama_defined = 0; - info->chrm_defined = 0; - info->srgb_defined = 0; - info->iccp_defined = 0; - info->iccp_name = NULL; - info->iccp_profile = NULL; - - info->sbit_defined = 0; - info->sbit_r = info->sbit_g = info->sbit_b = info->sbit_a = 0; - - LodePNGUnknownChunks_init(info); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -void lodepng_info_cleanup(LodePNGInfo * info) -{ - lodepng_color_mode_cleanup(&info->color); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - LodePNGText_cleanup(info); - LodePNGIText_cleanup(info); - - lodepng_clear_icc(info); - - LodePNGUnknownChunks_cleanup(info); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -unsigned lodepng_info_copy(LodePNGInfo * dest, const LodePNGInfo * source) -{ - lodepng_info_cleanup(dest); - lodepng_memcpy(dest, source, sizeof(LodePNGInfo)); - lodepng_color_mode_init(&dest->color); - CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color)); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - CERROR_TRY_RETURN(LodePNGText_copy(dest, source)); - CERROR_TRY_RETURN(LodePNGIText_copy(dest, source)); - if(source->iccp_defined) { - CERROR_TRY_RETURN(lodepng_assign_icc(dest, source->iccp_name, source->iccp_profile, source->iccp_profile_size)); - } - - LodePNGUnknownChunks_init(dest); - CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source)); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - return 0; -} - -/* ////////////////////////////////////////////////////////////////////////// */ - -/*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/ -static void addColorBits(unsigned char * out, size_t index, unsigned bits, unsigned in) -{ - unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/ - /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ - unsigned p = index & m; - in &= (1u << bits) - 1u; /*filter out any other bits of the input value*/ - in = in << (bits * (m - p)); - if(p == 0) out[index * bits / 8u] = in; - else out[index * bits / 8u] |= in; -} - -typedef struct ColorTree ColorTree; - -/* -One node of a color tree -This is the data structure used to count the number of unique colors and to get a palette -index for a color. It's like an octree, but because the alpha channel is used too, each -node has 16 instead of 8 children. -*/ -struct ColorTree { - ColorTree * children[16]; /*up to 16 pointers to ColorTree of next level*/ - int index; /*the payload. Only has a meaningful value if this is in the last level*/ -}; - -static void color_tree_init(ColorTree * tree) -{ - lodepng_memset(tree->children, 0, 16 * sizeof(*tree->children)); - tree->index = -1; -} - -static void color_tree_cleanup(ColorTree * tree) -{ - int i; - for(i = 0; i != 16; ++i) { - if(tree->children[i]) { - color_tree_cleanup(tree->children[i]); - lodepng_free(tree->children[i]); - } - } -} - -/*returns -1 if color not present, its index otherwise*/ -static int color_tree_get(ColorTree * tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - int bit = 0; - for(bit = 0; bit < 8; ++bit) { - int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); - if(!tree->children[i]) return -1; - else tree = tree->children[i]; - } - return tree ? tree->index : -1; -} - -#ifdef LODEPNG_COMPILE_ENCODER -static int color_tree_has(ColorTree * tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - return color_tree_get(tree, r, g, b, a) >= 0; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/*color is not allowed to already exist. -Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist") -Returns error code, or 0 if ok*/ -static unsigned color_tree_add(ColorTree * tree, - unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned index) -{ - int bit; - for(bit = 0; bit < 8; ++bit) { - int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); - if(!tree->children[i]) { - tree->children[i] = (ColorTree *)lodepng_malloc(sizeof(ColorTree)); - if(!tree->children[i]) return 83; /*alloc fail*/ - color_tree_init(tree->children[i]); - } - tree = tree->children[i]; - } - tree->index = (int)index; - return 0; -} - -/*put a pixel, given its RGBA color, into image of any color type*/ -static unsigned rgba8ToPixel(unsigned char * out, size_t i, - const LodePNGColorMode * mode, ColorTree * tree /*for palette*/, - unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - if(mode->colortype == LCT_GREY) { - unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/ - if(mode->bitdepth == 8) out[i] = gray; - else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = gray; - else { - /*take the most significant bits of gray*/ - gray = ((unsigned)gray >> (8u - mode->bitdepth)) & ((1u << mode->bitdepth) - 1u); - addColorBits(out, i, mode->bitdepth, gray); - } - } - else if(mode->colortype == LCT_RGB) { - if(mode->bitdepth == 8) { - out[i * 3 + 0] = r; - out[i * 3 + 1] = g; - out[i * 3 + 2] = b; - } - else { - out[i * 6 + 0] = out[i * 6 + 1] = r; - out[i * 6 + 2] = out[i * 6 + 3] = g; - out[i * 6 + 4] = out[i * 6 + 5] = b; - } - } - else if(mode->colortype == LCT_PALETTE) { - int index = color_tree_get(tree, r, g, b, a); - if(index < 0) return 82; /*color not in palette*/ - if(mode->bitdepth == 8) out[i] = index; - else addColorBits(out, i, mode->bitdepth, (unsigned)index); - } - else if(mode->colortype == LCT_GREY_ALPHA) { - unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/ - if(mode->bitdepth == 8) { - out[i * 2 + 0] = gray; - out[i * 2 + 1] = a; - } - else if(mode->bitdepth == 16) { - out[i * 4 + 0] = out[i * 4 + 1] = gray; - out[i * 4 + 2] = out[i * 4 + 3] = a; - } - } - else if(mode->colortype == LCT_RGBA) { - if(mode->bitdepth == 8) { - out[i * 4 + 0] = r; - out[i * 4 + 1] = g; - out[i * 4 + 2] = b; - out[i * 4 + 3] = a; - } - else { - out[i * 8 + 0] = out[i * 8 + 1] = r; - out[i * 8 + 2] = out[i * 8 + 3] = g; - out[i * 8 + 4] = out[i * 8 + 5] = b; - out[i * 8 + 6] = out[i * 8 + 7] = a; - } - } - - return 0; /*no error*/ -} - -/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ -static void rgba16ToPixel(unsigned char * out, size_t i, - const LodePNGColorMode * mode, - unsigned short r, unsigned short g, unsigned short b, unsigned short a) -{ - if(mode->colortype == LCT_GREY) { - unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/ - out[i * 2 + 0] = (gray >> 8) & 255; - out[i * 2 + 1] = gray & 255; - } - else if(mode->colortype == LCT_RGB) { - out[i * 6 + 0] = (r >> 8) & 255; - out[i * 6 + 1] = r & 255; - out[i * 6 + 2] = (g >> 8) & 255; - out[i * 6 + 3] = g & 255; - out[i * 6 + 4] = (b >> 8) & 255; - out[i * 6 + 5] = b & 255; - } - else if(mode->colortype == LCT_GREY_ALPHA) { - unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/ - out[i * 4 + 0] = (gray >> 8) & 255; - out[i * 4 + 1] = gray & 255; - out[i * 4 + 2] = (a >> 8) & 255; - out[i * 4 + 3] = a & 255; - } - else if(mode->colortype == LCT_RGBA) { - out[i * 8 + 0] = (r >> 8) & 255; - out[i * 8 + 1] = r & 255; - out[i * 8 + 2] = (g >> 8) & 255; - out[i * 8 + 3] = g & 255; - out[i * 8 + 4] = (b >> 8) & 255; - out[i * 8 + 5] = b & 255; - out[i * 8 + 6] = (a >> 8) & 255; - out[i * 8 + 7] = a & 255; - } -} - -/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ -static void getPixelColorRGBA8(unsigned char * r, unsigned char * g, - unsigned char * b, unsigned char * a, - const unsigned char * in, size_t i, - const LodePNGColorMode * mode) -{ - if(mode->colortype == LCT_GREY) { - if(mode->bitdepth == 8) { - *r = *g = *b = in[i]; - if(mode->key_defined && *r == mode->key_r) *a = 0; - else *a = 255; - } - else if(mode->bitdepth == 16) { - *r = *g = *b = in[i * 2 + 0]; - if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; - else *a = 255; - } - else { - unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ - size_t j = i * mode->bitdepth; - unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); - *r = *g = *b = (value * 255) / highest; - if(mode->key_defined && value == mode->key_r) *a = 0; - else *a = 255; - } - } - else if(mode->colortype == LCT_RGB) { - if(mode->bitdepth == 8) { - *r = in[i * 3 + 0]; - *g = in[i * 3 + 1]; - *b = in[i * 3 + 2]; - if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0; - else *a = 255; - } - else { - *r = in[i * 6 + 0]; - *g = in[i * 6 + 2]; - *b = in[i * 6 + 4]; - if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; - else *a = 255; - } - } - else if(mode->colortype == LCT_PALETTE) { - unsigned index; - if(mode->bitdepth == 8) index = in[i]; - else { - size_t j = i * mode->bitdepth; - index = readBitsFromReversedStream(&j, in, mode->bitdepth); - } - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - *r = mode->palette[index * 4 + 0]; - *g = mode->palette[index * 4 + 1]; - *b = mode->palette[index * 4 + 2]; - *a = mode->palette[index * 4 + 3]; - } - else if(mode->colortype == LCT_GREY_ALPHA) { - if(mode->bitdepth == 8) { - *r = *g = *b = in[i * 2 + 0]; - *a = in[i * 2 + 1]; - } - else { - *r = *g = *b = in[i * 4 + 0]; - *a = in[i * 4 + 2]; - } - } - else if(mode->colortype == LCT_RGBA) { - if(mode->bitdepth == 8) { - *r = in[i * 4 + 0]; - *g = in[i * 4 + 1]; - *b = in[i * 4 + 2]; - *a = in[i * 4 + 3]; - } - else { - *r = in[i * 8 + 0]; - *g = in[i * 8 + 2]; - *b = in[i * 8 + 4]; - *a = in[i * 8 + 6]; - } - } -} - -/*Similar to getPixelColorRGBA8, but with all the for loops inside of the color -mode test cases, optimized to convert the colors much faster, when converting -to the common case of RGBA with 8 bit per channel. buffer must be RGBA with -enough memory.*/ -static void getPixelColorsRGBA8(unsigned char * LODEPNG_RESTRICT buffer, size_t numpixels, - const unsigned char * LODEPNG_RESTRICT in, - const LodePNGColorMode * mode) -{ - unsigned num_channels = 4; - size_t i; - if(mode->colortype == LCT_GREY) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i]; - buffer[3] = 255; - } - if(mode->key_defined) { - buffer -= numpixels * num_channels; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - if(buffer[0] == mode->key_r) buffer[3] = 0; - } - } - } - else if(mode->bitdepth == 16) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 2]; - buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255; - } - } - else { - unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ - size_t j = 0; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); - buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; - buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255; - } - } - } - else if(mode->colortype == LCT_RGB) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - lodepng_memcpy(buffer, &in[i * 3], 3); - buffer[3] = 255; - } - if(mode->key_defined) { - buffer -= numpixels * num_channels; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - if(buffer[0] == mode->key_r && buffer[1] == mode->key_g && buffer[2] == mode->key_b) buffer[3] = 0; - } - } - } - else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = in[i * 6 + 0]; - buffer[1] = in[i * 6 + 2]; - buffer[2] = in[i * 6 + 4]; - buffer[3] = mode->key_defined - && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255; - } - } - } - else if(mode->colortype == LCT_PALETTE) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned index = in[i]; - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - lodepng_memcpy(buffer, &mode->palette[index * 4], 4); - } - } - else { - size_t j = 0; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth); - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - lodepng_memcpy(buffer, &mode->palette[index * 4], 4); - } - } - } - else if(mode->colortype == LCT_GREY_ALPHA) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; - buffer[3] = in[i * 2 + 1]; - } - } - else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; - buffer[3] = in[i * 4 + 2]; - } - } - } - else if(mode->colortype == LCT_RGBA) { - if(mode->bitdepth == 8) { - lodepng_memcpy(buffer, in, numpixels * 4); - } - else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = in[i * 8 + 0]; - buffer[1] = in[i * 8 + 2]; - buffer[2] = in[i * 8 + 4]; - buffer[3] = in[i * 8 + 6]; - } - } - } -} - -/*Similar to getPixelColorsRGBA8, but with 3-channel RGB output.*/ -static void getPixelColorsRGB8(unsigned char * LODEPNG_RESTRICT buffer, size_t numpixels, - const unsigned char * LODEPNG_RESTRICT in, - const LodePNGColorMode * mode) -{ - const unsigned num_channels = 3; - size_t i; - if(mode->colortype == LCT_GREY) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i]; - } - } - else if(mode->bitdepth == 16) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 2]; - } - } - else { - unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ - size_t j = 0; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); - buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; - } - } - } - else if(mode->colortype == LCT_RGB) { - if(mode->bitdepth == 8) { - lodepng_memcpy(buffer, in, numpixels * 3); - } - else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = in[i * 6 + 0]; - buffer[1] = in[i * 6 + 2]; - buffer[2] = in[i * 6 + 4]; - } - } - } - else if(mode->colortype == LCT_PALETTE) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned index = in[i]; - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - lodepng_memcpy(buffer, &mode->palette[index * 4], 3); - } - } - else { - size_t j = 0; - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth); - /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ - lodepng_memcpy(buffer, &mode->palette[index * 4], 3); - } - } - } - else if(mode->colortype == LCT_GREY_ALPHA) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; - } - } - else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; - } - } - } - else if(mode->colortype == LCT_RGBA) { - if(mode->bitdepth == 8) { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - lodepng_memcpy(buffer, &in[i * 4], 3); - } - } - else { - for(i = 0; i != numpixels; ++i, buffer += num_channels) { - buffer[0] = in[i * 8 + 0]; - buffer[1] = in[i * 8 + 2]; - buffer[2] = in[i * 8 + 4]; - } - } - } -} - -/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with -given color type, but the given color type must be 16-bit itself.*/ -static void getPixelColorRGBA16(unsigned short * r, unsigned short * g, unsigned short * b, unsigned short * a, - const unsigned char * in, size_t i, const LodePNGColorMode * mode) -{ - if(mode->colortype == LCT_GREY) { - *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; - if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; - else *a = 65535; - } - else if(mode->colortype == LCT_RGB) { - *r = 256u * in[i * 6 + 0] + in[i * 6 + 1]; - *g = 256u * in[i * 6 + 2] + in[i * 6 + 3]; - *b = 256u * in[i * 6 + 4] + in[i * 6 + 5]; - if(mode->key_defined - && 256u * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256u * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256u * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; - else *a = 65535; - } - else if(mode->colortype == LCT_GREY_ALPHA) { - *r = *g = *b = 256u * in[i * 4 + 0] + in[i * 4 + 1]; - *a = 256u * in[i * 4 + 2] + in[i * 4 + 3]; - } - else if(mode->colortype == LCT_RGBA) { - *r = 256u * in[i * 8 + 0] + in[i * 8 + 1]; - *g = 256u * in[i * 8 + 2] + in[i * 8 + 3]; - *b = 256u * in[i * 8 + 4] + in[i * 8 + 5]; - *a = 256u * in[i * 8 + 6] + in[i * 8 + 7]; - } -} - -unsigned lodepng_convert(unsigned char * out, const unsigned char * in, - const LodePNGColorMode * mode_out, const LodePNGColorMode * mode_in, - unsigned w, unsigned h) -{ - size_t i; - ColorTree tree; - size_t numpixels = (size_t)w * (size_t)h; - unsigned error = 0; - - if(mode_in->colortype == LCT_PALETTE && !mode_in->palette) { - return 107; /* error: must provide palette if input mode is palette */ - } - - if(lodepng_color_mode_equal(mode_out, mode_in)) { - size_t numbytes = lodepng_get_raw_size(w, h, mode_in); - lodepng_memcpy(out, in, numbytes); - return 0; - } - - if(mode_out->colortype == LCT_PALETTE) { - size_t palettesize = mode_out->palettesize; - const unsigned char * palette = mode_out->palette; - size_t palsize = (size_t)1u << mode_out->bitdepth; - /*if the user specified output palette but did not give the values, assume - they want the values of the input color type (assuming that one is palette). - Note that we never create a new palette ourselves.*/ - if(palettesize == 0) { - palettesize = mode_in->palettesize; - palette = mode_in->palette; - /*if the input was also palette with same bitdepth, then the color types are also - equal, so copy literally. This to preserve the exact indices that were in the PNG - even in case there are duplicate colors in the palette.*/ - if(mode_in->colortype == LCT_PALETTE && mode_in->bitdepth == mode_out->bitdepth) { - size_t numbytes = lodepng_get_raw_size(w, h, mode_in); - lodepng_memcpy(out, in, numbytes); - return 0; - } - } - if(palettesize < palsize) palsize = palettesize; - color_tree_init(&tree); - for(i = 0; i != palsize; ++i) { - const unsigned char * p = &palette[i * 4]; - error = color_tree_add(&tree, p[0], p[1], p[2], p[3], (unsigned)i); - if(error) break; - } - } - - if(!error) { - if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) { - for(i = 0; i != numpixels; ++i) { - unsigned short r = 0, g = 0, b = 0, a = 0; - getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - rgba16ToPixel(out, i, mode_out, r, g, b, a); - } - } - else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) { - getPixelColorsRGBA8(out, numpixels, in, mode_in); - } - else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) { - getPixelColorsRGB8(out, numpixels, in, mode_in); - } - else { - unsigned char r = 0, g = 0, b = 0, a = 0; - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); - error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); - if(error) break; - } - } - } - - if(mode_out->colortype == LCT_PALETTE) { - color_tree_cleanup(&tree); - } - - return error; -} - - -/* Converts a single rgb color without alpha from one type to another, color bits truncated to -their bitdepth. In case of single channel (gray or palette), only the r channel is used. Slow -function, do not use to process all pixels of an image. Alpha channel not supported on purpose: -this is for bKGD, supporting alpha may prevent it from finding a color in the palette, from the -specification it looks like bKGD should ignore the alpha values of the palette since it can use -any palette index but doesn't have an alpha channel. Idem with ignoring color key. */ -static unsigned lodepng_convert_rgb( - unsigned * r_out, unsigned * g_out, unsigned * b_out, - unsigned r_in, unsigned g_in, unsigned b_in, - const LodePNGColorMode * mode_out, const LodePNGColorMode * mode_in) -{ - unsigned r = 0, g = 0, b = 0; - unsigned mul = 65535 / ((1u << mode_in->bitdepth) - 1u); /*65535, 21845, 4369, 257, 1*/ - unsigned shift = 16 - mode_out->bitdepth; - - if(mode_in->colortype == LCT_GREY || mode_in->colortype == LCT_GREY_ALPHA) { - r = g = b = r_in * mul; - } - else if(mode_in->colortype == LCT_RGB || mode_in->colortype == LCT_RGBA) { - r = r_in * mul; - g = g_in * mul; - b = b_in * mul; - } - else if(mode_in->colortype == LCT_PALETTE) { - if(r_in >= mode_in->palettesize) return 82; - r = mode_in->palette[r_in * 4 + 0] * 257u; - g = mode_in->palette[r_in * 4 + 1] * 257u; - b = mode_in->palette[r_in * 4 + 2] * 257u; - } - else { - return 31; - } - - /* now convert to output format */ - if(mode_out->colortype == LCT_GREY || mode_out->colortype == LCT_GREY_ALPHA) { - *r_out = r >> shift ; - } - else if(mode_out->colortype == LCT_RGB || mode_out->colortype == LCT_RGBA) { - *r_out = r >> shift ; - *g_out = g >> shift ; - *b_out = b >> shift ; - } - else if(mode_out->colortype == LCT_PALETTE) { - unsigned i; - /* a 16-bit color cannot be in the palette */ - if((r >> 8) != (r & 255) || (g >> 8) != (g & 255) || (b >> 8) != (b & 255)) return 82; - for(i = 0; i < mode_out->palettesize; i++) { - unsigned j = i * 4; - if((r >> 8) == mode_out->palette[j + 0] && (g >> 8) == mode_out->palette[j + 1] && - (b >> 8) == mode_out->palette[j + 2]) { - *r_out = i; - return 0; - } - } - return 82; - } - else { - return 31; - } - - return 0; -} - -#ifdef LODEPNG_COMPILE_ENCODER - -void lodepng_color_stats_init(LodePNGColorStats * stats) -{ - /*stats*/ - stats->colored = 0; - stats->key = 0; - stats->key_r = stats->key_g = stats->key_b = 0; - stats->alpha = 0; - stats->numcolors = 0; - stats->bits = 1; - stats->numpixels = 0; - /*settings*/ - stats->allow_palette = 1; - stats->allow_greyscale = 1; -} - -/*function used for debug purposes with C++*/ -/*void printColorStats(LodePNGColorStats* p) { - std::cout << "colored: " << (int)p->colored << ", "; - std::cout << "key: " << (int)p->key << ", "; - std::cout << "key_r: " << (int)p->key_r << ", "; - std::cout << "key_g: " << (int)p->key_g << ", "; - std::cout << "key_b: " << (int)p->key_b << ", "; - std::cout << "alpha: " << (int)p->alpha << ", "; - std::cout << "numcolors: " << (int)p->numcolors << ", "; - std::cout << "bits: " << (int)p->bits << std::endl; -}*/ - -/*Returns how many bits needed to represent given value (max 8 bit)*/ -static unsigned getValueRequiredBits(unsigned char value) -{ - if(value == 0 || value == 255) return 1; - /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ - if(value % 17 == 0) return value % 85 == 0 ? 2 : 4; - return 8; -} - -/*stats must already have been inited. */ -unsigned lodepng_compute_color_stats(LodePNGColorStats * stats, - const unsigned char * in, unsigned w, unsigned h, - const LodePNGColorMode * mode_in) -{ - size_t i; - ColorTree tree; - size_t numpixels = (size_t)w * (size_t)h; - unsigned error = 0; - - /* mark things as done already if it would be impossible to have a more expensive case */ - unsigned colored_done = lodepng_is_greyscale_type(mode_in) ? 1 : 0; - unsigned alpha_done = lodepng_can_have_alpha(mode_in) ? 0 : 1; - unsigned numcolors_done = 0; - unsigned bpp = lodepng_get_bpp(mode_in); - unsigned bits_done = (stats->bits == 1 && bpp == 1) ? 1 : 0; - unsigned sixteen = 0; /* whether the input image is 16 bit */ - unsigned maxnumcolors = 257; - if(bpp <= 8) maxnumcolors = LODEPNG_MIN(257, stats->numcolors + (1u << bpp)); - - stats->numpixels += numpixels; - - /*if palette not allowed, no need to compute numcolors*/ - if(!stats->allow_palette) numcolors_done = 1; - - color_tree_init(&tree); - - /*If the stats was already filled in from previous data, fill its palette in tree - and mark things as done already if we know they are the most expensive case already*/ - if(stats->alpha) alpha_done = 1; - if(stats->colored) colored_done = 1; - if(stats->bits == 16) numcolors_done = 1; - if(stats->bits >= bpp) bits_done = 1; - if(stats->numcolors >= maxnumcolors) numcolors_done = 1; - - if(!numcolors_done) { - for(i = 0; i < stats->numcolors; i++) { - const unsigned char * color = &stats->palette[i * 4]; - error = color_tree_add(&tree, color[0], color[1], color[2], color[3], (unsigned)i); - if(error) goto cleanup; - } - } - - /*Check if the 16-bit input is truly 16-bit*/ - if(mode_in->bitdepth == 16 && !sixteen) { - unsigned short r = 0, g = 0, b = 0, a = 0; - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - if((r & 255) != ((r >> 8) & 255) || (g & 255) != ((g >> 8) & 255) || - (b & 255) != ((b >> 8) & 255) || (a & 255) != ((a >> 8) & 255)) { /*first and second byte differ*/ - stats->bits = 16; - sixteen = 1; - bits_done = 1; - numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ - break; - } - } - } - - if(sixteen) { - unsigned short r = 0, g = 0, b = 0, a = 0; - - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - - if(!colored_done && (r != g || r != b)) { - stats->colored = 1; - colored_done = 1; - } - - if(!alpha_done) { - unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b); - if(a != 65535 && (a != 0 || (stats->key && !matchkey))) { - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - } - else if(a == 0 && !stats->alpha && !stats->key) { - stats->key = 1; - stats->key_r = r; - stats->key_g = g; - stats->key_b = b; - } - else if(a == 65535 && stats->key && matchkey) { - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - } - } - if(alpha_done && numcolors_done && colored_done && bits_done) break; - } - - if(stats->key && !stats->alpha) { - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) { - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - } - } - } - } - else { /* < 16-bit */ - unsigned char r = 0, g = 0, b = 0, a = 0; - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); - - if(!bits_done && stats->bits < 8) { - /*only r is checked, < 8 bits is only relevant for grayscale*/ - unsigned bits = getValueRequiredBits(r); - if(bits > stats->bits) stats->bits = bits; - } - bits_done = (stats->bits >= bpp); - - if(!colored_done && (r != g || r != b)) { - stats->colored = 1; - colored_done = 1; - if(stats->bits < 8) stats->bits = 8; /*PNG has no colored modes with less than 8-bit per channel*/ - } - - if(!alpha_done) { - unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b); - if(a != 255 && (a != 0 || (stats->key && !matchkey))) { - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ - } - else if(a == 0 && !stats->alpha && !stats->key) { - stats->key = 1; - stats->key_r = r; - stats->key_g = g; - stats->key_b = b; - } - else if(a == 255 && stats->key && matchkey) { - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ - } - } - - if(!numcolors_done) { - if(!color_tree_has(&tree, r, g, b, a)) { - error = color_tree_add(&tree, r, g, b, a, stats->numcolors); - if(error) goto cleanup; - if(stats->numcolors < 256) { - unsigned char * p = stats->palette; - unsigned n = stats->numcolors; - p[n * 4 + 0] = r; - p[n * 4 + 1] = g; - p[n * 4 + 2] = b; - p[n * 4 + 3] = a; - } - ++stats->numcolors; - numcolors_done = stats->numcolors >= maxnumcolors; - } - } - - if(alpha_done && numcolors_done && colored_done && bits_done) break; - } - - if(stats->key && !stats->alpha) { - for(i = 0; i != numpixels; ++i) { - getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); - if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) { - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - stats->alpha = 1; - stats->key = 0; - alpha_done = 1; - if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ - } - } - } - - /*make the stats's key always 16-bit for consistency - repeat each byte twice*/ - stats->key_r += (stats->key_r << 8); - stats->key_g += (stats->key_g << 8); - stats->key_b += (stats->key_b << 8); - } - -cleanup: - color_tree_cleanup(&tree); - return error; -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*Adds a single color to the color stats. The stats must already have been inited. The color must be given as 16-bit -(with 2 bytes repeating for 8-bit and 65535 for opaque alpha channel). This function is expensive, do not call it for -all pixels of an image but only for a few additional values. */ -static unsigned lodepng_color_stats_add(LodePNGColorStats * stats, - unsigned r, unsigned g, unsigned b, unsigned a) -{ - unsigned error = 0; - unsigned char image[8]; - LodePNGColorMode mode; - lodepng_color_mode_init(&mode); - image[0] = r >> 8; - image[1] = r; - image[2] = g >> 8; - image[3] = g; - image[4] = b >> 8; - image[5] = b; - image[6] = a >> 8; - image[7] = a; - mode.bitdepth = 16; - mode.colortype = LCT_RGBA; - error = lodepng_compute_color_stats(stats, image, 1, 1, &mode); - lodepng_color_mode_cleanup(&mode); - return error; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/*Computes a minimal PNG color model that can contain all colors as indicated by the stats. -The stats should be computed with lodepng_compute_color_stats. -mode_in is raw color profile of the image the stats were computed on, to copy palette order from when relevant. -Minimal PNG color model means the color type and bit depth that gives smallest amount of bits in the output image, -e.g. gray if only grayscale pixels, palette if less than 256 colors, color key if only single transparent color, ... -This is used if auto_convert is enabled (it is by default). -*/ -static unsigned auto_choose_color(LodePNGColorMode * mode_out, - const LodePNGColorMode * mode_in, - const LodePNGColorStats * stats) -{ - unsigned error = 0; - unsigned palettebits; - size_t i, n; - size_t numpixels = stats->numpixels; - unsigned palette_ok, gray_ok; - - unsigned alpha = stats->alpha; - unsigned key = stats->key; - unsigned bits = stats->bits; - - mode_out->key_defined = 0; - - if(key && numpixels <= 16) { - alpha = 1; /*too few pixels to justify tRNS chunk overhead*/ - key = 0; - if(bits < 8) bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ - } - - gray_ok = !stats->colored; - if(!stats->allow_greyscale) gray_ok = 0; - if(!gray_ok && bits < 8) bits = 8; - - n = stats->numcolors; - palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); - palette_ok = n <= 256 && bits <= 8 && n != 0; /*n==0 means likely numcolors wasn't computed*/ - if(numpixels < n * 2) palette_ok = 0; /*don't add palette overhead if image has only a few pixels*/ - if(gray_ok && !alpha && bits <= palettebits) palette_ok = 0; /*gray is less overhead*/ - if(!stats->allow_palette) palette_ok = 0; - - if(palette_ok) { - const unsigned char * p = stats->palette; - lodepng_palette_clear(mode_out); /*remove potential earlier palette*/ - for(i = 0; i != stats->numcolors; ++i) { - error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); - if(error) break; - } - - mode_out->colortype = LCT_PALETTE; - mode_out->bitdepth = palettebits; - - if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize - && mode_in->bitdepth == mode_out->bitdepth) { - /*If input should have same palette colors, keep original to preserve its order and prevent conversion*/ - lodepng_color_mode_cleanup(mode_out); /*clears palette, keeps the above set colortype and bitdepth fields as-is*/ - lodepng_color_mode_copy(mode_out, mode_in); - } - } - else { /*8-bit or 16-bit per channel*/ - mode_out->bitdepth = bits; - mode_out->colortype = alpha ? (gray_ok ? LCT_GREY_ALPHA : LCT_RGBA) - : (gray_ok ? LCT_GREY : LCT_RGB); - if(key) { - unsigned mask = (1u << mode_out->bitdepth) - 1u; /*stats always uses 16-bit, mask converts it*/ - mode_out->key_r = stats->key_r & mask; - mode_out->key_g = stats->key_g & mask; - mode_out->key_b = stats->key_b & mask; - mode_out->key_defined = 1; - } - } - - return error; -} - -#endif /* #ifdef LODEPNG_COMPILE_ENCODER */ - -/*Paeth predictor, used by PNG filter type 4*/ -static unsigned char paethPredictor(unsigned char a, unsigned char b, unsigned char c) -{ - /* the subtractions of unsigned char cast it to a signed type. - With gcc, short is faster than int, with clang int is as fast (as of april 2023)*/ - short pa = (b - c) < 0 ? -(b - c) : (b - c); - short pb = (a - c) < 0 ? -(a - c) : (a - c); - /* writing it out like this compiles to something faster than introducing a temp variable*/ - short pc = (a + b - c - c) < 0 ? -(a + b - c - c) : (a + b - c - c); - /* return input value associated with smallest of pa, pb, pc (with certain priority if equal) */ - if(pb < pa) { - a = b; - pa = pb; - } - return (pc < pa) ? c : a; -} - -/*shared values used by multiple Adam7 related functions*/ - -static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/ -static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/ -static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/ -static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/ - -/* -Outputs various dimensions and positions in the image related to the Adam7 reduced images. -passw: output containing the width of the 7 passes -passh: output containing the height of the 7 passes -filter_passstart: output containing the index of the start and end of each - reduced image with filter bytes -padded_passstart output containing the index of the start and end of each - reduced image when without filter bytes but with padded scanlines -passstart: output containing the index of the start and end of each reduced - image without padding between scanlines, but still padding between the images -w, h: width and height of non-interlaced image -bpp: bits per pixel -"padded" is only relevant if bpp is less than 8 and a scanline or image does not - end at a full byte -*/ -static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], - size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) -{ - /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/ - unsigned i; - - /*calculate width and height in pixels of each pass*/ - for(i = 0; i != 7; ++i) { - passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; - passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; - if(passw[i] == 0) passh[i] = 0; - if(passh[i] == 0) passw[i] = 0; - } - - filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; - for(i = 0; i != 7; ++i) { - /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ - filter_passstart[i + 1] = filter_passstart[i] - + ((passw[i] && passh[i]) ? passh[i] * (1u + (passw[i] * bpp + 7u) / 8u) : 0); - /*bits padded if needed to fill full byte at end of each scanline*/ - padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7u) / 8u); - /*only padded at end of reduced image*/ - passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7u) / 8u; - } -} - -#ifdef LODEPNG_COMPILE_DECODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG Decoder / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*read the information from the header and store it in the LodePNGInfo. return value is error*/ -unsigned lodepng_inspect(unsigned * w, unsigned * h, LodePNGState * state, - const unsigned char * in, size_t insize) -{ - unsigned width, height; - LodePNGInfo * info = &state->info_png; - if(insize == 0 || in == 0) { - CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ - } - if(insize < 33) { - CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ - } - - /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/ - /* TODO: remove this. One should use a new LodePNGState for new sessions */ - lodepng_info_cleanup(info); - lodepng_info_init(info); - - if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 - || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) { - CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/ - } - if(lodepng_chunk_length(in + 8) != 13) { - CERROR_RETURN_ERROR(state->error, 94); /*error: header size must be 13 bytes*/ - } - if(!lodepng_chunk_type_equals(in + 8, "IHDR")) { - CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/ - } - - /*read the values given in the header*/ - width = lodepng_read32bitInt(&in[16]); - height = lodepng_read32bitInt(&in[20]); - /*TODO: remove the undocumented feature that allows to give null pointers to width or height*/ - if(w) *w = width; - if(h) *h = height; - info->color.bitdepth = in[24]; - info->color.colortype = (LodePNGColorType)in[25]; - info->compression_method = in[26]; - info->filter_method = in[27]; - info->interlace_method = in[28]; - - /*errors returned only after the parsing so other values are still output*/ - - /*error: invalid image size*/ - if(width == 0 || height == 0) CERROR_RETURN_ERROR(state->error, 93); - /*error: invalid colortype or bitdepth combination*/ - state->error = checkColorValidity(info->color.colortype, info->color.bitdepth); - if(state->error) return state->error; - /*error: only compression method 0 is allowed in the specification*/ - if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32); - /*error: only filter method 0 is allowed in the specification*/ - if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); - /*error: only interlace methods 0 and 1 exist in the specification*/ - if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); - - if(!state->decoder.ignore_crc) { - unsigned CRC = lodepng_read32bitInt(&in[29]); - unsigned checksum = lodepng_crc32(&in[12], 17); - if(CRC != checksum) { - CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/ - } - } - - return state->error; -} - -static unsigned unfilterScanline(unsigned char * recon, const unsigned char * scanline, const unsigned char * precon, - size_t bytewidth, unsigned char filterType, size_t length) -{ - /* - For PNG filter method 0 - unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, - the filter works byte per byte (bytewidth = 1) - precon is the previous unfiltered scanline, recon the result, scanline the current one - the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead - recon and scanline MAY be the same memory address! precon must be disjoint. - */ - - size_t i; - switch(filterType) { - case 0: - for(i = 0; i != length; ++i) recon[i] = scanline[i]; - break; - case 1: { - size_t j = 0; - for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; - for(i = bytewidth; i != length; ++i, ++j) recon[i] = scanline[i] + recon[j]; - break; - } - case 2: - if(precon) { - for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i]; - } - else { - for(i = 0; i != length; ++i) recon[i] = scanline[i]; - } - break; - case 3: - if(precon) { - size_t j = 0; - for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1u); - /* Unroll independent paths of this predictor. A 6x and 8x version is also possible but that adds - too much code. Whether this speeds up anything depends on compiler and settings. */ - if(bytewidth >= 4) { - for(; i + 3 < length; i += 4, j += 4) { - unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2], s3 = scanline[i + 3]; - unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2], r3 = recon[j + 3]; - unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2], p3 = precon[i + 3]; - recon[i + 0] = s0 + ((r0 + p0) >> 1u); - recon[i + 1] = s1 + ((r1 + p1) >> 1u); - recon[i + 2] = s2 + ((r2 + p2) >> 1u); - recon[i + 3] = s3 + ((r3 + p3) >> 1u); - } - } - else if(bytewidth >= 3) { - for(; i + 2 < length; i += 3, j += 3) { - unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2]; - unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2]; - unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2]; - recon[i + 0] = s0 + ((r0 + p0) >> 1u); - recon[i + 1] = s1 + ((r1 + p1) >> 1u); - recon[i + 2] = s2 + ((r2 + p2) >> 1u); - } - } - else if(bytewidth >= 2) { - for(; i + 1 < length; i += 2, j += 2) { - unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1]; - unsigned char r0 = recon[j + 0], r1 = recon[j + 1]; - unsigned char p0 = precon[i + 0], p1 = precon[i + 1]; - recon[i + 0] = s0 + ((r0 + p0) >> 1u); - recon[i + 1] = s1 + ((r1 + p1) >> 1u); - } - } - for(; i != length; ++i, ++j) recon[i] = scanline[i] + ((recon[j] + precon[i]) >> 1u); - } - else { - size_t j = 0; - for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; - for(i = bytewidth; i != length; ++i, ++j) recon[i] = scanline[i] + (recon[j] >> 1u); - } - break; - case 4: - if(precon) { - /* Unroll independent paths of this predictor. Whether this speeds up - anything depends on compiler and settings. */ - if(bytewidth == 8) { - unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0; - unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0; - unsigned char a4, b4 = 0, c4, d4 = 0, a5, b5 = 0, c5, d5 = 0; - unsigned char a6, b6 = 0, c6, d6 = 0, a7, b7 = 0, c7, d7 = 0; - for(i = 0; i + 7 < length; i += 8) { - c0 = b0; - c1 = b1; - c2 = b2; - c3 = b3; - c4 = b4; - c5 = b5; - c6 = b6; - c7 = b7; - b0 = precon[i + 0]; - b1 = precon[i + 1]; - b2 = precon[i + 2]; - b3 = precon[i + 3]; - b4 = precon[i + 4]; - b5 = precon[i + 5]; - b6 = precon[i + 6]; - b7 = precon[i + 7]; - a0 = d0; - a1 = d1; - a2 = d2; - a3 = d3; - a4 = d4; - a5 = d5; - a6 = d6; - a7 = d7; - d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); - d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); - d2 = scanline[i + 2] + paethPredictor(a2, b2, c2); - d3 = scanline[i + 3] + paethPredictor(a3, b3, c3); - d4 = scanline[i + 4] + paethPredictor(a4, b4, c4); - d5 = scanline[i + 5] + paethPredictor(a5, b5, c5); - d6 = scanline[i + 6] + paethPredictor(a6, b6, c6); - d7 = scanline[i + 7] + paethPredictor(a7, b7, c7); - recon[i + 0] = d0; - recon[i + 1] = d1; - recon[i + 2] = d2; - recon[i + 3] = d3; - recon[i + 4] = d4; - recon[i + 5] = d5; - recon[i + 6] = d6; - recon[i + 7] = d7; - } - } - else if(bytewidth == 6) { - unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0; - unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0; - unsigned char a4, b4 = 0, c4, d4 = 0, a5, b5 = 0, c5, d5 = 0; - for(i = 0; i + 5 < length; i += 6) { - c0 = b0; - c1 = b1; - c2 = b2; - c3 = b3; - c4 = b4; - c5 = b5; - b0 = precon[i + 0]; - b1 = precon[i + 1]; - b2 = precon[i + 2]; - b3 = precon[i + 3]; - b4 = precon[i + 4]; - b5 = precon[i + 5]; - a0 = d0; - a1 = d1; - a2 = d2; - a3 = d3; - a4 = d4; - a5 = d5; - d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); - d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); - d2 = scanline[i + 2] + paethPredictor(a2, b2, c2); - d3 = scanline[i + 3] + paethPredictor(a3, b3, c3); - d4 = scanline[i + 4] + paethPredictor(a4, b4, c4); - d5 = scanline[i + 5] + paethPredictor(a5, b5, c5); - recon[i + 0] = d0; - recon[i + 1] = d1; - recon[i + 2] = d2; - recon[i + 3] = d3; - recon[i + 4] = d4; - recon[i + 5] = d5; - } - } - else if(bytewidth == 4) { - unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0; - unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0; - for(i = 0; i + 3 < length; i += 4) { - c0 = b0; - c1 = b1; - c2 = b2; - c3 = b3; - b0 = precon[i + 0]; - b1 = precon[i + 1]; - b2 = precon[i + 2]; - b3 = precon[i + 3]; - a0 = d0; - a1 = d1; - a2 = d2; - a3 = d3; - d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); - d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); - d2 = scanline[i + 2] + paethPredictor(a2, b2, c2); - d3 = scanline[i + 3] + paethPredictor(a3, b3, c3); - recon[i + 0] = d0; - recon[i + 1] = d1; - recon[i + 2] = d2; - recon[i + 3] = d3; - } - } - else if(bytewidth == 3) { - unsigned char a0, b0 = 0, c0, d0 = 0; - unsigned char a1, b1 = 0, c1, d1 = 0; - unsigned char a2, b2 = 0, c2, d2 = 0; - for(i = 0; i + 2 < length; i += 3) { - c0 = b0; - c1 = b1; - c2 = b2; - b0 = precon[i + 0]; - b1 = precon[i + 1]; - b2 = precon[i + 2]; - a0 = d0; - a1 = d1; - a2 = d2; - d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); - d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); - d2 = scanline[i + 2] + paethPredictor(a2, b2, c2); - recon[i + 0] = d0; - recon[i + 1] = d1; - recon[i + 2] = d2; - } - } - else if(bytewidth == 2) { - unsigned char a0, b0 = 0, c0, d0 = 0; - unsigned char a1, b1 = 0, c1, d1 = 0; - for(i = 0; i + 1 < length; i += 2) { - c0 = b0; - c1 = b1; - b0 = precon[i + 0]; - b1 = precon[i + 1]; - a0 = d0; - a1 = d1; - d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); - d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); - recon[i + 0] = d0; - recon[i + 1] = d1; - } - } - else if(bytewidth == 1) { - unsigned char a, b = 0, c, d = 0; - for(i = 0; i != length; ++i) { - c = b; - b = precon[i]; - a = d; - d = scanline[i] + paethPredictor(a, b, c); - recon[i] = d; - } - } - else { - /* Normally not a possible case, but this would handle it correctly */ - for(i = 0; i != bytewidth; ++i) { - recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ - } - } - /* finish any remaining bytes */ - for(; i != length; ++i) { - recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); - } - } - else { - size_t j = 0; - for(i = 0; i != bytewidth; ++i) { - recon[i] = scanline[i]; - } - for(i = bytewidth; i != length; ++i, ++j) { - /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ - recon[i] = (scanline[i] + recon[j]); - } - } - break; - default: - return 36; /*error: invalid filter type given*/ - } - return 0; -} - -static unsigned unfilter(unsigned char * out, const unsigned char * in, unsigned w, unsigned h, unsigned bpp) -{ - /* - For PNG filter method 0 - this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times) - out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline - w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel - in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes) - */ - - unsigned y; - unsigned char * prevline = 0; - - /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ - size_t bytewidth = (bpp + 7u) / 8u; - /*the width of a scanline in bytes, not including the filter type*/ - size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u; - - for(y = 0; y < h; ++y) { - size_t outindex = linebytes * y; - size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - unsigned char filterType = in[inindex]; - - CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes)); - - prevline = &out[outindex]; - } - - return 0; -} - -/* -in: Adam7 interlaced image, with no padding bits between scanlines, but between - reduced images so that each reduced image starts at a byte. -out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h -bpp: bits per pixel -out has the following size in bits: w * h * bpp. -in is possibly bigger due to padding bits between reduced images. -out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation -(because that's likely a little bit faster) -NOTE: comments about padding bits are only relevant if bpp < 8 -*/ -static void Adam7_deinterlace(unsigned char * out, const unsigned char * in, unsigned w, unsigned h, unsigned bpp) -{ - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - if(bpp >= 8) { - for(i = 0; i != 7; ++i) { - unsigned x, y, b; - size_t bytewidth = bpp / 8u; - for(y = 0; y < passh[i]; ++y) - for(x = 0; x < passw[i]; ++x) { - size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; - size_t pixeloutstart = ((ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * (size_t)w - + ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bytewidth; - for(b = 0; b < bytewidth; ++b) { - out[pixeloutstart + b] = in[pixelinstart + b]; - } - } - } - } - else { /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ - for(i = 0; i != 7; ++i) { - unsigned x, y, b; - unsigned ilinebits = bpp * passw[i]; - unsigned olinebits = bpp * w; - size_t obp, ibp; /*bit pointers (for out and in buffer)*/ - for(y = 0; y < passh[i]; ++y) - for(x = 0; x < passw[i]; ++x) { - ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); - obp = (ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bpp; - for(b = 0; b < bpp; ++b) { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - } - } - } -} - -static void removePaddingBits(unsigned char * out, const unsigned char * in, - size_t olinebits, size_t ilinebits, unsigned h) -{ - /* - After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need - to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers - for the Adam7 code, the color convert code and the output to the user. - in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must - have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits - also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7 - only useful if (ilinebits - olinebits) is a value in the range 1..7 - */ - unsigned y; - size_t diff = ilinebits - olinebits; - size_t ibp = 0, obp = 0; /*input and output bit pointers*/ - for(y = 0; y < h; ++y) { - size_t x; - for(x = 0; x < olinebits; ++x) { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - ibp += diff; - } -} - -/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from -the IDAT chunks (with filter index bytes and possible padding bits) -return value is error*/ -static unsigned postProcessScanlines(unsigned char * out, unsigned char * in, - unsigned w, unsigned h, const LodePNGInfo * info_png) -{ - /* - This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. - Steps: - *) if no Adam7: 1) unfilter 2) remove padding bits (= possible extra bits per scanline if bpp < 8) - *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace - NOTE: the in buffer will be overwritten with intermediate data! - */ - unsigned bpp = lodepng_get_bpp(&info_png->color); - if(bpp == 0) return 31; /*error: invalid colortype*/ - - if(info_png->interlace_method == 0) { - if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) { - CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp)); - removePaddingBits(out, in, w * bpp, ((w * bpp + 7u) / 8u) * 8u, h); - } - /*we can immediately filter into the out buffer, no other steps needed*/ - else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp)); - } - else { /*interlace_method is 1 (Adam7)*/ - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - for(i = 0; i != 7; ++i) { - CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); - /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, - move bytes instead of bits or move not at all*/ - if(bpp < 8) { - /*remove padding bits in scanlines; after this there still may be padding - bits between the different reduced images: each reduced image still starts nicely at a byte*/ - removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, - ((passw[i] * bpp + 7u) / 8u) * 8u, passh[i]); - } - } - - Adam7_deinterlace(out, in, w, h, bpp); - } - - return 0; -} - -static unsigned readChunk_PLTE(LodePNGColorMode * color, const unsigned char * data, size_t chunkLength) -{ - unsigned pos = 0, i; - color->palettesize = chunkLength / 3u; - if(color->palettesize == 0 || color->palettesize > 256) return 38; /*error: palette too small or big*/ - lodepng_color_mode_alloc_palette(color); - if(!color->palette && color->palettesize) { - color->palettesize = 0; - return 83; /*alloc fail*/ - } - - for(i = 0; i != color->palettesize; ++i) { - color->palette[4 * i + 0] = data[pos++]; /*R*/ - color->palette[4 * i + 1] = data[pos++]; /*G*/ - color->palette[4 * i + 2] = data[pos++]; /*B*/ - color->palette[4 * i + 3] = 255; /*alpha*/ - } - - return 0; /* OK */ -} - -static unsigned readChunk_tRNS(LodePNGColorMode * color, const unsigned char * data, size_t chunkLength) -{ - unsigned i; - if(color->colortype == LCT_PALETTE) { - /*error: more alpha values given than there are palette entries*/ - if(chunkLength > color->palettesize) return 39; - - for(i = 0; i != chunkLength; ++i) color->palette[4 * i + 3] = data[i]; - } - else if(color->colortype == LCT_GREY) { - /*error: this chunk must be 2 bytes for grayscale image*/ - if(chunkLength != 2) return 30; - - color->key_defined = 1; - color->key_r = color->key_g = color->key_b = 256u * data[0] + data[1]; - } - else if(color->colortype == LCT_RGB) { - /*error: this chunk must be 6 bytes for RGB image*/ - if(chunkLength != 6) return 41; - - color->key_defined = 1; - color->key_r = 256u * data[0] + data[1]; - color->key_g = 256u * data[2] + data[3]; - color->key_b = 256u * data[4] + data[5]; - } - else return 42; /*error: tRNS chunk not allowed for other color models*/ - - return 0; /* OK */ -} - - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*background color chunk (bKGD)*/ -static unsigned readChunk_bKGD(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) -{ - if(info->color.colortype == LCT_PALETTE) { - /*error: this chunk must be 1 byte for indexed color image*/ - if(chunkLength != 1) return 43; - - /*error: invalid palette index, or maybe this chunk appeared before PLTE*/ - if(data[0] >= info->color.palettesize) return 103; - - info->background_defined = 1; - info->background_r = info->background_g = info->background_b = data[0]; - } - else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { - /*error: this chunk must be 2 bytes for grayscale image*/ - if(chunkLength != 2) return 44; - - /*the values are truncated to bitdepth in the PNG file*/ - info->background_defined = 1; - info->background_r = info->background_g = info->background_b = 256u * data[0] + data[1]; - } - else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { - /*error: this chunk must be 6 bytes for grayscale image*/ - if(chunkLength != 6) return 45; - - /*the values are truncated to bitdepth in the PNG file*/ - info->background_defined = 1; - info->background_r = 256u * data[0] + data[1]; - info->background_g = 256u * data[2] + data[3]; - info->background_b = 256u * data[4] + data[5]; - } - - return 0; /* OK */ -} - -/*text chunk (tEXt)*/ -static unsigned readChunk_tEXt(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) -{ - unsigned error = 0; - char * key = 0, * str = 0; - - while(!error) { /*not really a while loop, only used to break on error*/ - unsigned length, string2_begin; - - length = 0; - while(length < chunkLength && data[length] != 0) ++length; - /*even though it's not allowed by the standard, no error is thrown if - there's no null termination char, if the text is empty*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char *)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(key, data, length); - key[length] = 0; - - string2_begin = length + 1; /*skip keyword null terminator*/ - - length = (unsigned)(chunkLength < string2_begin ? 0 : chunkLength - string2_begin); - str = (char *)lodepng_malloc(length + 1); - if(!str) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(str, data + string2_begin, length); - str[length] = 0; - - error = lodepng_add_text(info, key, str); - - break; - } - - lodepng_free(key); - lodepng_free(str); - - return error; -} - -/*compressed text chunk (zTXt)*/ -static unsigned readChunk_zTXt(LodePNGInfo * info, const LodePNGDecoderSettings * decoder, - const unsigned char * data, size_t chunkLength) -{ - unsigned error = 0; - - /*copy the object to change parameters in it*/ - LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; - - unsigned length, string2_begin; - char * key = 0; - unsigned char * str = 0; - size_t size = 0; - - while(!error) { /*not really a while loop, only used to break on error*/ - for(length = 0; length < chunkLength && data[length] != 0; ++length) ; - if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char *)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(key, data, length); - key[length] = 0; - - if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ - - string2_begin = length + 2; - if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ - - length = (unsigned)chunkLength - string2_begin; - zlibsettings.max_output_size = decoder->max_text_size; - /*will fail if zlib error, e.g. if length is too small*/ - error = zlib_decompress(&str, &size, 0, &data[string2_begin], - length, &zlibsettings); - /*error: compressed text larger than decoder->max_text_size*/ - if(error && size > zlibsettings.max_output_size) error = 112; - if(error) break; - error = lodepng_add_text_sized(info, key, (char *)str, size); - break; - } - - lodepng_free(key); - lodepng_free(str); - - return error; -} - -/*international text chunk (iTXt)*/ -static unsigned readChunk_iTXt(LodePNGInfo * info, const LodePNGDecoderSettings * decoder, - const unsigned char * data, size_t chunkLength) -{ - unsigned error = 0; - unsigned i; - - /*copy the object to change parameters in it*/ - LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; - - unsigned length, begin, compressed; - char * key = 0, * langtag = 0, * transkey = 0; - - while(!error) { /*not really a while loop, only used to break on error*/ - /*Quick check if the chunk length isn't too small. Even without check - it'd still fail with other error checks below if it's too short. This just gives a different error code.*/ - if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/ - - /*read the key*/ - for(length = 0; length < chunkLength && data[length] != 0; ++length) ; - if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char *)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(key, data, length); - key[length] = 0; - - /*read the compression method*/ - compressed = data[length + 1]; - if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ - - /*even though it's not allowed by the standard, no error is thrown if - there's no null termination char, if the text is empty for the next 3 texts*/ - - /*read the langtag*/ - begin = length + 3; - length = 0; - for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; - - langtag = (char *)lodepng_malloc(length + 1); - if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(langtag, data + begin, length); - langtag[length] = 0; - - /*read the transkey*/ - begin += length + 1; - length = 0; - for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; - - transkey = (char *)lodepng_malloc(length + 1); - if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/ - - lodepng_memcpy(transkey, data + begin, length); - transkey[length] = 0; - - /*read the actual text*/ - begin += length + 1; - - length = (unsigned)chunkLength < begin ? 0 : (unsigned)chunkLength - begin; - - if(compressed) { - unsigned char * str = 0; - size_t size = 0; - zlibsettings.max_output_size = decoder->max_text_size; - /*will fail if zlib error, e.g. if length is too small*/ - error = zlib_decompress(&str, &size, 0, &data[begin], - length, &zlibsettings); - /*error: compressed text larger than decoder->max_text_size*/ - if(error && size > zlibsettings.max_output_size) error = 112; - if(!error) error = lodepng_add_itext_sized(info, key, langtag, transkey, (char *)str, size); - lodepng_free(str); - } - else { - error = lodepng_add_itext_sized(info, key, langtag, transkey, (char *)(data + begin), length); - } - - break; - } - - lodepng_free(key); - lodepng_free(langtag); - lodepng_free(transkey); - - return error; -} - -static unsigned readChunk_tIME(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) -{ - if(chunkLength != 7) return 73; /*invalid tIME chunk size*/ - - info->time_defined = 1; - info->time.year = 256u * data[0] + data[1]; - info->time.month = data[2]; - info->time.day = data[3]; - info->time.hour = data[4]; - info->time.minute = data[5]; - info->time.second = data[6]; - - return 0; /* OK */ -} - -static unsigned readChunk_pHYs(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) -{ - if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/ - - info->phys_defined = 1; - info->phys_x = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; - info->phys_y = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7]; - info->phys_unit = data[8]; - - return 0; /* OK */ -} - -static unsigned readChunk_gAMA(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) -{ - if(chunkLength != 4) return 96; /*invalid gAMA chunk size*/ - - info->gama_defined = 1; - info->gama_gamma = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; - - return 0; /* OK */ -} - -static unsigned readChunk_cHRM(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) -{ - if(chunkLength != 32) return 97; /*invalid cHRM chunk size*/ - - info->chrm_defined = 1; - info->chrm_white_x = 16777216u * data[ 0] + 65536u * data[ 1] + 256u * data[ 2] + data[ 3]; - info->chrm_white_y = 16777216u * data[ 4] + 65536u * data[ 5] + 256u * data[ 6] + data[ 7]; - info->chrm_red_x = 16777216u * data[ 8] + 65536u * data[ 9] + 256u * data[10] + data[11]; - info->chrm_red_y = 16777216u * data[12] + 65536u * data[13] + 256u * data[14] + data[15]; - info->chrm_green_x = 16777216u * data[16] + 65536u * data[17] + 256u * data[18] + data[19]; - info->chrm_green_y = 16777216u * data[20] + 65536u * data[21] + 256u * data[22] + data[23]; - info->chrm_blue_x = 16777216u * data[24] + 65536u * data[25] + 256u * data[26] + data[27]; - info->chrm_blue_y = 16777216u * data[28] + 65536u * data[29] + 256u * data[30] + data[31]; - - return 0; /* OK */ -} - -static unsigned readChunk_sRGB(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) -{ - if(chunkLength != 1) return 98; /*invalid sRGB chunk size (this one is never ignored)*/ - - info->srgb_defined = 1; - info->srgb_intent = data[0]; - - return 0; /* OK */ -} - -static unsigned readChunk_iCCP(LodePNGInfo * info, const LodePNGDecoderSettings * decoder, - const unsigned char * data, size_t chunkLength) -{ - unsigned error = 0; - unsigned i; - size_t size = 0; - /*copy the object to change parameters in it*/ - LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; - - unsigned length, string2_begin; - - info->iccp_defined = 1; - if(info->iccp_name) lodepng_clear_icc(info); - - for(length = 0; length < chunkLength && data[length] != 0; ++length) ; - if(length + 2 >= chunkLength) return 75; /*no null termination, corrupt?*/ - if(length < 1 || length > 79) return 89; /*keyword too short or long*/ - - info->iccp_name = (char *)lodepng_malloc(length + 1); - if(!info->iccp_name) return 83; /*alloc fail*/ - - info->iccp_name[length] = 0; - for(i = 0; i != length; ++i) info->iccp_name[i] = (char)data[i]; - - if(data[length + 1] != 0) return 72; /*the 0 byte indicating compression must be 0*/ - - string2_begin = length + 2; - if(string2_begin > chunkLength) return 75; /*no null termination, corrupt?*/ - - length = (unsigned)chunkLength - string2_begin; - zlibsettings.max_output_size = decoder->max_icc_size; - error = zlib_decompress(&info->iccp_profile, &size, 0, - &data[string2_begin], - length, &zlibsettings); - /*error: ICC profile larger than decoder->max_icc_size*/ - if(error && size > zlibsettings.max_output_size) error = 113; - info->iccp_profile_size = (unsigned)size; - if(!error && !info->iccp_profile_size) error = 100; /*invalid ICC profile size*/ - return error; -} - -/*significant bits chunk (sBIT)*/ -static unsigned readChunk_sBIT(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) -{ - unsigned bitdepth = (info->color.colortype == LCT_PALETTE) ? 8 : info->color.bitdepth; - if(info->color.colortype == LCT_GREY) { - /*error: this chunk must be 1 bytes for grayscale image*/ - if(chunkLength != 1) return 114; - if(data[0] == 0 || data[0] > bitdepth) return 115; - info->sbit_defined = 1; - info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/ - } - else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_PALETTE) { - /*error: this chunk must be 3 bytes for RGB and palette image*/ - if(chunkLength != 3) return 114; - if(data[0] == 0 || data[1] == 0 || data[2] == 0) return 115; - if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth) return 115; - info->sbit_defined = 1; - info->sbit_r = data[0]; - info->sbit_g = data[1]; - info->sbit_b = data[2]; - } - else if(info->color.colortype == LCT_GREY_ALPHA) { - /*error: this chunk must be 2 byte for grayscale with alpha image*/ - if(chunkLength != 2) return 114; - if(data[0] == 0 || data[1] == 0) return 115; - if(data[0] > bitdepth || data[1] > bitdepth) return 115; - info->sbit_defined = 1; - info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/ - info->sbit_a = data[1]; - } - else if(info->color.colortype == LCT_RGBA) { - /*error: this chunk must be 4 bytes for grayscale image*/ - if(chunkLength != 4) return 114; - if(data[0] == 0 || data[1] == 0 || data[2] == 0 || data[3] == 0) return 115; - if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth || data[3] > bitdepth) return 115; - info->sbit_defined = 1; - info->sbit_r = data[0]; - info->sbit_g = data[1]; - info->sbit_b = data[2]; - info->sbit_a = data[3]; - } - - return 0; /* OK */ -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -unsigned lodepng_inspect_chunk(LodePNGState * state, size_t pos, - const unsigned char * in, size_t insize) -{ - const unsigned char * chunk = in + pos; - unsigned chunkLength; - const unsigned char * data; - unsigned unhandled = 0; - unsigned error = 0; - - if(pos + 4 > insize) return 30; - chunkLength = lodepng_chunk_length(chunk); - if(chunkLength > 2147483647) return 63; - data = lodepng_chunk_data_const(chunk); - if(chunkLength + 12 > insize - pos) return 30; - - if(lodepng_chunk_type_equals(chunk, "PLTE")) { - error = readChunk_PLTE(&state->info_png.color, data, chunkLength); - } - else if(lodepng_chunk_type_equals(chunk, "tRNS")) { - error = readChunk_tRNS(&state->info_png.color, data, chunkLength); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - } - else if(lodepng_chunk_type_equals(chunk, "bKGD")) { - error = readChunk_bKGD(&state->info_png, data, chunkLength); - } - else if(lodepng_chunk_type_equals(chunk, "tEXt")) { - error = readChunk_tEXt(&state->info_png, data, chunkLength); - } - else if(lodepng_chunk_type_equals(chunk, "zTXt")) { - error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength); - } - else if(lodepng_chunk_type_equals(chunk, "iTXt")) { - error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength); - } - else if(lodepng_chunk_type_equals(chunk, "tIME")) { - error = readChunk_tIME(&state->info_png, data, chunkLength); - } - else if(lodepng_chunk_type_equals(chunk, "pHYs")) { - error = readChunk_pHYs(&state->info_png, data, chunkLength); - } - else if(lodepng_chunk_type_equals(chunk, "gAMA")) { - error = readChunk_gAMA(&state->info_png, data, chunkLength); - } - else if(lodepng_chunk_type_equals(chunk, "cHRM")) { - error = readChunk_cHRM(&state->info_png, data, chunkLength); - } - else if(lodepng_chunk_type_equals(chunk, "sRGB")) { - error = readChunk_sRGB(&state->info_png, data, chunkLength); - } - else if(lodepng_chunk_type_equals(chunk, "iCCP")) { - error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength); - } - else if(lodepng_chunk_type_equals(chunk, "sBIT")) { - error = readChunk_sBIT(&state->info_png, data, chunkLength); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } - else { - /* unhandled chunk is ok (is not an error) */ - unhandled = 1; - } - - if(!error && !unhandled && !state->decoder.ignore_crc) { - if(lodepng_chunk_check_crc(chunk)) return 57; /*invalid CRC*/ - } - - return error; -} - -/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/ -static void decodeGeneric(unsigned char ** out, unsigned * w, unsigned * h, - LodePNGState * state, - const unsigned char * in, size_t insize) -{ - unsigned char IEND = 0; - const unsigned char * chunk; /*points to beginning of next chunk*/ - unsigned char * idat; /*the data from idat chunks, zlib compressed*/ - size_t idatsize = 0; - unsigned char * scanlines = 0; - size_t scanlines_size = 0, expected_size = 0; - size_t outsize = 0; - - /*for unknown chunk order*/ - unsigned unknown = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - - - /* safe output values in case error happens */ - *out = 0; - *w = *h = 0; - - state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ - if(state->error) return; - - if(lodepng_pixel_overflow(*w, *h, &state->info_png.color, &state->info_raw)) { - CERROR_RETURN(state->error, 92); /*overflow possible due to amount of pixels*/ - } - - /*the input filesize is a safe upper bound for the sum of idat chunks size*/ - idat = (unsigned char *)lodepng_malloc(insize); - if(!idat) CERROR_RETURN(state->error, 83); /*alloc fail*/ - - chunk = &in[33]; /*first byte of the first chunk after the header*/ - - /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. - IDAT data is put at the start of the in buffer*/ - while(!IEND && !state->error) { - unsigned chunkLength; - const unsigned char * data; /*the data in the chunk*/ - size_t pos = (size_t)(chunk - in); - - /*error: next chunk out of bounds of the in buffer*/ - if(chunk < in || pos + 12 > insize) { - if(state->decoder.ignore_end) break; /*other errors may still happen though*/ - CERROR_BREAK(state->error, 30); - } - - /*length of the data of the chunk, excluding the 12 bytes for length, chunk type and CRC*/ - chunkLength = lodepng_chunk_length(chunk); - /*error: chunk length larger than the max PNG chunk size*/ - if(chunkLength > 2147483647) { - if(state->decoder.ignore_end) break; /*other errors may still happen though*/ - CERROR_BREAK(state->error, 63); - } - - if(pos + (size_t)chunkLength + 12 > insize || pos + (size_t)chunkLength + 12 < pos) { - CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk (or int overflow)*/ - } - - data = lodepng_chunk_data_const(chunk); - - unknown = 0; - - /*IDAT chunk, containing compressed image data*/ - if(lodepng_chunk_type_equals(chunk, "IDAT")) { - size_t newsize; - if(lodepng_addofl(idatsize, chunkLength, &newsize)) CERROR_BREAK(state->error, 95); - if(newsize > insize) CERROR_BREAK(state->error, 95); - lodepng_memcpy(idat + idatsize, data, chunkLength); - idatsize += chunkLength; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - critical_pos = 3; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } - else if(lodepng_chunk_type_equals(chunk, "IEND")) { - /*IEND chunk*/ - IEND = 1; - } - else if(lodepng_chunk_type_equals(chunk, "PLTE")) { - /*palette chunk (PLTE)*/ - state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength); - if(state->error) break; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - critical_pos = 2; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } - else if(lodepng_chunk_type_equals(chunk, "tRNS")) { - /*palette transparency chunk (tRNS). Even though this one is an ancillary chunk , it is still compiled - in without 'LODEPNG_COMPILE_ANCILLARY_CHUNKS' because it contains essential color information that - affects the alpha channel of pixels. */ - state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength); - if(state->error) break; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*background color chunk (bKGD)*/ - } - else if(lodepng_chunk_type_equals(chunk, "bKGD")) { - state->error = readChunk_bKGD(&state->info_png, data, chunkLength); - if(state->error) break; - } - else if(lodepng_chunk_type_equals(chunk, "tEXt")) { - /*text chunk (tEXt)*/ - if(state->decoder.read_text_chunks) { - state->error = readChunk_tEXt(&state->info_png, data, chunkLength); - if(state->error) break; - } - } - else if(lodepng_chunk_type_equals(chunk, "zTXt")) { - /*compressed text chunk (zTXt)*/ - if(state->decoder.read_text_chunks) { - state->error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength); - if(state->error) break; - } - } - else if(lodepng_chunk_type_equals(chunk, "iTXt")) { - /*international text chunk (iTXt)*/ - if(state->decoder.read_text_chunks) { - state->error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength); - if(state->error) break; - } - } - else if(lodepng_chunk_type_equals(chunk, "tIME")) { - state->error = readChunk_tIME(&state->info_png, data, chunkLength); - if(state->error) break; - } - else if(lodepng_chunk_type_equals(chunk, "pHYs")) { - state->error = readChunk_pHYs(&state->info_png, data, chunkLength); - if(state->error) break; - } - else if(lodepng_chunk_type_equals(chunk, "gAMA")) { - state->error = readChunk_gAMA(&state->info_png, data, chunkLength); - if(state->error) break; - } - else if(lodepng_chunk_type_equals(chunk, "cHRM")) { - state->error = readChunk_cHRM(&state->info_png, data, chunkLength); - if(state->error) break; - } - else if(lodepng_chunk_type_equals(chunk, "sRGB")) { - state->error = readChunk_sRGB(&state->info_png, data, chunkLength); - if(state->error) break; - } - else if(lodepng_chunk_type_equals(chunk, "iCCP")) { - state->error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength); - if(state->error) break; - } - else if(lodepng_chunk_type_equals(chunk, "sBIT")) { - state->error = readChunk_sBIT(&state->info_png, data, chunkLength); - if(state->error) break; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } - else /*it's not an implemented chunk type, so ignore it: skip over the data*/ { - /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ - if(!state->decoder.ignore_critical && !lodepng_chunk_ancillary(chunk)) { - CERROR_BREAK(state->error, 69); - } - - unknown = 1; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(state->decoder.remember_unknown_chunks) { - state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1], - &state->info_png.unknown_chunks_size[critical_pos - 1], chunk); - if(state->error) break; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } - - if(!state->decoder.ignore_crc && !unknown) { /*check CRC if wanted, only on known chunk types*/ - if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/ - } - - if(!IEND) chunk = lodepng_chunk_next_const(chunk, in + insize); - } - - if(!state->error && state->info_png.color.colortype == LCT_PALETTE && !state->info_png.color.palette) { - state->error = 106; /* error: PNG file must have PLTE chunk if color type is palette */ - } - - if(!state->error) { - /*predict output size, to allocate exact size for output buffer to avoid more dynamic allocation. - If the decompressed size does not match the prediction, the image must be corrupt.*/ - if(state->info_png.interlace_method == 0) { - unsigned bpp = lodepng_get_bpp(&state->info_png.color); - expected_size = lodepng_get_raw_size_idat(*w, *h, bpp); - } - else { - unsigned bpp = lodepng_get_bpp(&state->info_png.color); - /*Adam-7 interlaced: expected size is the sum of the 7 sub-images sizes*/ - expected_size = 0; - expected_size += lodepng_get_raw_size_idat((*w + 7) >> 3, (*h + 7) >> 3, bpp); - if(*w > 4) expected_size += lodepng_get_raw_size_idat((*w + 3) >> 3, (*h + 7) >> 3, bpp); - expected_size += lodepng_get_raw_size_idat((*w + 3) >> 2, (*h + 3) >> 3, bpp); - if(*w > 2) expected_size += lodepng_get_raw_size_idat((*w + 1) >> 2, (*h + 3) >> 2, bpp); - expected_size += lodepng_get_raw_size_idat((*w + 1) >> 1, (*h + 1) >> 2, bpp); - if(*w > 1) expected_size += lodepng_get_raw_size_idat((*w + 0) >> 1, (*h + 1) >> 1, bpp); - expected_size += lodepng_get_raw_size_idat((*w + 0), (*h + 0) >> 1, bpp); - } - - state->error = zlib_decompress(&scanlines, &scanlines_size, expected_size, idat, idatsize, - &state->decoder.zlibsettings); - } - if(!state->error && scanlines_size != expected_size) state->error = 91; /*decompressed size doesn't match prediction*/ - lodepng_free(idat); - - if(!state->error) { - lv_draw_buf_t * decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, *w, *h, LV_COLOR_FORMAT_ARGB8888, 4 * *w); - if(decoded) { - *out = (unsigned char*)decoded; - outsize = decoded->data_size; - } - else state->error = 83; /*alloc fail*/ - } - if(!state->error) { - lv_draw_buf_t * decoded = (lv_draw_buf_t *)*out; - lodepng_memset(decoded->data, 0, outsize); - state->error = postProcessScanlines(decoded->data, scanlines, *w, *h, &state->info_png); - } - lodepng_free(scanlines); -} - -unsigned lodepng_decode(unsigned char ** out, unsigned * w, unsigned * h, - LodePNGState * state, - const unsigned char * in, size_t insize) -{ - *out = NULL; - decodeGeneric(out, w, h, state, in, insize); - if(state->error) return state->error; - if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) { - /*same color type, no copying or converting of data needed*/ - /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype - the raw image has to the end user*/ - if(!state->decoder.color_convert) { - state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color); - if(state->error) return state->error; - } - } - else { /*color conversion needed*/ - lv_draw_buf_t * old_buf = (lv_draw_buf_t *)*out; - - /*TODO: check if this works according to the statement in the documentation: "The converter can convert - from grayscale input color type, to 8-bit grayscale or grayscale with alpha"*/ - if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA) - && !(state->info_raw.bitdepth == 8)) { - return 56; /*unsupported color mode conversion*/ - } - - lv_draw_buf_t * new_buf = lv_draw_buf_create_user(image_cache_draw_buf_handlers,*w, *h, LV_COLOR_FORMAT_ARGB8888, 4 * *w); - if(new_buf == NULL) { - state->error = 83; /*alloc fail*/ - } - else { - state->error = lodepng_convert(new_buf->data, old_buf->data, - &state->info_raw, &state->info_png.color, *w, *h); - - if (state->error) { - lv_draw_buf_destroy(new_buf); - new_buf = NULL; - } - } - - *out = (unsigned char*)new_buf; - lv_draw_buf_destroy(old_buf); - } - return state->error; -} - -unsigned lodepng_decode_memory(unsigned char ** out, unsigned * w, unsigned * h, const unsigned char * in, - size_t insize, LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned error; - LodePNGState state; - lodepng_state_init(&state); - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*disable reading things that this function doesn't output*/ - state.decoder.read_text_chunks = 0; - state.decoder.remember_unknown_chunks = 0; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - error = lodepng_decode(out, w, h, &state, in, insize); - lodepng_state_cleanup(&state); - return error; -} - -unsigned lodepng_decode32(unsigned char ** out, unsigned * w, unsigned * h, const unsigned char * in, size_t insize) -{ - return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8); -} - -unsigned lodepng_decode24(unsigned char ** out, unsigned * w, unsigned * h, const unsigned char * in, size_t insize) -{ - return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned lodepng_decode_file(unsigned char ** out, unsigned * w, unsigned * h, const char * filename, - LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned char * buffer = 0; - size_t buffersize; - unsigned error; - /* safe output values in case error happens */ - *out = 0; - *w = *h = 0; - error = lodepng_load_file(&buffer, &buffersize, filename); - if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth); - lodepng_free(buffer); - return error; -} - -unsigned lodepng_decode32_file(unsigned char ** out, unsigned * w, unsigned * h, const char * filename) -{ - return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8); -} - -unsigned lodepng_decode24_file(unsigned char ** out, unsigned * w, unsigned * h, const char * filename) -{ - return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8); -} -#endif /*LODEPNG_COMPILE_DISK*/ - -void lodepng_decoder_settings_init(LodePNGDecoderSettings * settings) -{ - settings->color_convert = 1; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - settings->read_text_chunks = 1; - settings->remember_unknown_chunks = 0; - settings->max_text_size = 16777216; - settings->max_icc_size = 16777216; /* 16MB is much more than enough for any reasonable ICC profile */ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - settings->ignore_crc = 0; - settings->ignore_critical = 0; - settings->ignore_end = 0; - lodepng_decompress_settings_init(&settings->zlibsettings); -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) - -void lodepng_state_init(LodePNGState * state) -{ -#ifdef LODEPNG_COMPILE_DECODER - lodepng_decoder_settings_init(&state->decoder); -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER - lodepng_encoder_settings_init(&state->encoder); -#endif /*LODEPNG_COMPILE_ENCODER*/ - lodepng_color_mode_init(&state->info_raw); - lodepng_info_init(&state->info_png); - state->error = 1; -} - -void lodepng_state_cleanup(LodePNGState * state) -{ - lodepng_color_mode_cleanup(&state->info_raw); - lodepng_info_cleanup(&state->info_png); -} - -void lodepng_state_copy(LodePNGState * dest, const LodePNGState * source) -{ - lodepng_state_cleanup(dest); - *dest = *source; - lodepng_color_mode_init(&dest->info_raw); - lodepng_info_init(&dest->info_png); - dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); - if(dest->error) return; - dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); - if(dest->error) return; -} - -#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ - -#ifdef LODEPNG_COMPILE_ENCODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG Encoder / */ -/* ////////////////////////////////////////////////////////////////////////// */ - - -static unsigned writeSignature(ucvector * out) -{ - size_t pos = out->size; - const unsigned char signature[] = {137, 80, 78, 71, 13, 10, 26, 10}; - /*8 bytes PNG signature, aka the magic bytes*/ - if(!ucvector_resize(out, out->size + 8)) return 83; /*alloc fail*/ - lodepng_memcpy(out->data + pos, signature, 8); - return 0; -} - -static unsigned addChunk_IHDR(ucvector * out, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) -{ - unsigned char * chunk, * data; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 13, "IHDR")); - data = chunk + 8; - - lodepng_set32bitInt(data + 0, w); /*width*/ - lodepng_set32bitInt(data + 4, h); /*height*/ - data[8] = (unsigned char)bitdepth; /*bit depth*/ - data[9] = (unsigned char)colortype; /*color type*/ - data[10] = 0; /*compression method*/ - data[11] = 0; /*filter method*/ - data[12] = interlace_method; /*interlace method*/ - - lodepng_chunk_generate_crc(chunk); - return 0; -} - -/* only adds the chunk if needed (there is a key or palette with alpha) */ -static unsigned addChunk_PLTE(ucvector * out, const LodePNGColorMode * info) -{ - unsigned char * chunk; - size_t i, j = 8; - - if(info->palettesize == 0 || info->palettesize > 256) { - return 68; /*invalid palette size, it is only allowed to be 1-256*/ - } - - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, info->palettesize * 3, "PLTE")); - - for(i = 0; i != info->palettesize; ++i) { - /*add all channels except alpha channel*/ - chunk[j++] = info->palette[i * 4 + 0]; - chunk[j++] = info->palette[i * 4 + 1]; - chunk[j++] = info->palette[i * 4 + 2]; - } - - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_tRNS(ucvector * out, const LodePNGColorMode * info) -{ - unsigned char * chunk = 0; - - if(info->colortype == LCT_PALETTE) { - size_t i, amount = info->palettesize; - /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ - for(i = info->palettesize; i != 0; --i) { - if(info->palette[4 * (i - 1) + 3] != 255) break; - --amount; - } - if(amount) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, amount, "tRNS")); - /*add the alpha channel values from the palette*/ - for(i = 0; i != amount; ++i) chunk[8 + i] = info->palette[4 * i + 3]; - } - } - else if(info->colortype == LCT_GREY) { - if(info->key_defined) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "tRNS")); - chunk[8] = (unsigned char)(info->key_r >> 8); - chunk[9] = (unsigned char)(info->key_r & 255); - } - } - else if(info->colortype == LCT_RGB) { - if(info->key_defined) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "tRNS")); - chunk[8] = (unsigned char)(info->key_r >> 8); - chunk[9] = (unsigned char)(info->key_r & 255); - chunk[10] = (unsigned char)(info->key_g >> 8); - chunk[11] = (unsigned char)(info->key_g & 255); - chunk[12] = (unsigned char)(info->key_b >> 8); - chunk[13] = (unsigned char)(info->key_b & 255); - } - } - - if(chunk) lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_IDAT(ucvector * out, const unsigned char * data, size_t datasize, - LodePNGCompressSettings * zlibsettings) -{ - unsigned error = 0; - unsigned char * zlib = 0; - size_t zlibsize = 0; - - error = zlib_compress(&zlib, &zlibsize, data, datasize, zlibsettings); - if(!error) { - error = lodepng_chunk_createv(out, zlibsize, "IDAT", zlib); - } - lodepng_free(zlib); - return error; -} - -static unsigned addChunk_IEND(ucvector * out) -{ - return lodepng_chunk_createv(out, 0, "IEND", 0); -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - -static unsigned addChunk_tEXt(ucvector * out, const char * keyword, const char * textstring) -{ - unsigned char * chunk = 0; - size_t keysize = lodepng_strlen(keyword), textsize = lodepng_strlen(textstring); - size_t size = keysize + 1 + textsize; - if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, size, "tEXt")); - lodepng_memcpy(chunk + 8, keyword, keysize); - chunk[8 + keysize] = 0; /*null termination char*/ - lodepng_memcpy(chunk + 9 + keysize, textstring, textsize); - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_zTXt(ucvector * out, const char * keyword, const char * textstring, - LodePNGCompressSettings * zlibsettings) -{ - unsigned error = 0; - unsigned char * chunk = 0; - unsigned char * compressed = 0; - size_t compressedsize = 0; - size_t textsize = lodepng_strlen(textstring); - size_t keysize = lodepng_strlen(keyword); - if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ - - error = zlib_compress(&compressed, &compressedsize, - (const unsigned char *)textstring, textsize, zlibsettings); - if(!error) { - size_t size = keysize + 2 + compressedsize; - error = lodepng_chunk_init(&chunk, out, size, "zTXt"); - } - if(!error) { - lodepng_memcpy(chunk + 8, keyword, keysize); - chunk[8 + keysize] = 0; /*null termination char*/ - chunk[9 + keysize] = 0; /*compression method: 0*/ - lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize); - lodepng_chunk_generate_crc(chunk); - } - - lodepng_free(compressed); - return error; -} - -static unsigned addChunk_iTXt(ucvector * out, unsigned compress, const char * keyword, const char * langtag, - const char * transkey, const char * textstring, LodePNGCompressSettings * zlibsettings) -{ - unsigned error = 0; - unsigned char * chunk = 0; - unsigned char * compressed = 0; - size_t compressedsize = 0; - size_t textsize = lodepng_strlen(textstring); - size_t keysize = lodepng_strlen(keyword), langsize = lodepng_strlen(langtag), transsize = lodepng_strlen(transkey); - - if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ - - if(compress) { - error = zlib_compress(&compressed, &compressedsize, - (const unsigned char *)textstring, textsize, zlibsettings); - } - if(!error) { - size_t size = keysize + 3 + langsize + 1 + transsize + 1 + (compress ? compressedsize : textsize); - error = lodepng_chunk_init(&chunk, out, size, "iTXt"); - } - if(!error) { - size_t pos = 8; - lodepng_memcpy(chunk + pos, keyword, keysize); - pos += keysize; - chunk[pos++] = 0; /*null termination char*/ - chunk[pos++] = (compress ? 1 : 0); /*compression flag*/ - chunk[pos++] = 0; /*compression method: 0*/ - lodepng_memcpy(chunk + pos, langtag, langsize); - pos += langsize; - chunk[pos++] = 0; /*null termination char*/ - lodepng_memcpy(chunk + pos, transkey, transsize); - pos += transsize; - chunk[pos++] = 0; /*null termination char*/ - if(compress) { - lodepng_memcpy(chunk + pos, compressed, compressedsize); - } - else { - lodepng_memcpy(chunk + pos, textstring, textsize); - } - lodepng_chunk_generate_crc(chunk); - } - - lodepng_free(compressed); - return error; -} - -static unsigned addChunk_bKGD(ucvector * out, const LodePNGInfo * info) -{ - unsigned char * chunk = 0; - if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "bKGD")); - chunk[8] = (unsigned char)(info->background_r >> 8); - chunk[9] = (unsigned char)(info->background_r & 255); - } - else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "bKGD")); - chunk[8] = (unsigned char)(info->background_r >> 8); - chunk[9] = (unsigned char)(info->background_r & 255); - chunk[10] = (unsigned char)(info->background_g >> 8); - chunk[11] = (unsigned char)(info->background_g & 255); - chunk[12] = (unsigned char)(info->background_b >> 8); - chunk[13] = (unsigned char)(info->background_b & 255); - } - else if(info->color.colortype == LCT_PALETTE) { - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, "bKGD")); - chunk[8] = (unsigned char)(info->background_r & 255); /*palette index*/ - } - if(chunk) lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_tIME(ucvector * out, const LodePNGTime * time) -{ - unsigned char * chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 7, "tIME")); - chunk[8] = (unsigned char)(time->year >> 8); - chunk[9] = (unsigned char)(time->year & 255); - chunk[10] = (unsigned char)time->month; - chunk[11] = (unsigned char)time->day; - chunk[12] = (unsigned char)time->hour; - chunk[13] = (unsigned char)time->minute; - chunk[14] = (unsigned char)time->second; - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_pHYs(ucvector * out, const LodePNGInfo * info) -{ - unsigned char * chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 9, "pHYs")); - lodepng_set32bitInt(chunk + 8, info->phys_x); - lodepng_set32bitInt(chunk + 12, info->phys_y); - chunk[16] = info->phys_unit; - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_gAMA(ucvector * out, const LodePNGInfo * info) -{ - unsigned char * chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "gAMA")); - lodepng_set32bitInt(chunk + 8, info->gama_gamma); - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_cHRM(ucvector * out, const LodePNGInfo * info) -{ - unsigned char * chunk; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 32, "cHRM")); - lodepng_set32bitInt(chunk + 8, info->chrm_white_x); - lodepng_set32bitInt(chunk + 12, info->chrm_white_y); - lodepng_set32bitInt(chunk + 16, info->chrm_red_x); - lodepng_set32bitInt(chunk + 20, info->chrm_red_y); - lodepng_set32bitInt(chunk + 24, info->chrm_green_x); - lodepng_set32bitInt(chunk + 28, info->chrm_green_y); - lodepng_set32bitInt(chunk + 32, info->chrm_blue_x); - lodepng_set32bitInt(chunk + 36, info->chrm_blue_y); - lodepng_chunk_generate_crc(chunk); - return 0; -} - -static unsigned addChunk_sRGB(ucvector * out, const LodePNGInfo * info) -{ - unsigned char data = info->srgb_intent; - return lodepng_chunk_createv(out, 1, "sRGB", &data); -} - -static unsigned addChunk_iCCP(ucvector * out, const LodePNGInfo * info, LodePNGCompressSettings * zlibsettings) -{ - unsigned error = 0; - unsigned char * chunk = 0; - unsigned char * compressed = 0; - size_t compressedsize = 0; - size_t keysize = lodepng_strlen(info->iccp_name); - - if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ - error = zlib_compress(&compressed, &compressedsize, - info->iccp_profile, info->iccp_profile_size, zlibsettings); - if(!error) { - size_t size = keysize + 2 + compressedsize; - error = lodepng_chunk_init(&chunk, out, size, "iCCP"); - } - if(!error) { - lodepng_memcpy(chunk + 8, info->iccp_name, keysize); - chunk[8 + keysize] = 0; /*null termination char*/ - chunk[9 + keysize] = 0; /*compression method: 0*/ - lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize); - lodepng_chunk_generate_crc(chunk); - } - - lodepng_free(compressed); - return error; -} - -static unsigned addChunk_sBIT(ucvector * out, const LodePNGInfo * info) -{ - unsigned bitdepth = (info->color.colortype == LCT_PALETTE) ? 8 : info->color.bitdepth; - unsigned char * chunk = 0; - if(info->color.colortype == LCT_GREY) { - if(info->sbit_r == 0 || info->sbit_r > bitdepth) return 115; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, "sBIT")); - chunk[8] = info->sbit_r; - } - else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_PALETTE) { - if(info->sbit_r == 0 || info->sbit_g == 0 || info->sbit_b == 0) return 115; - if(info->sbit_r > bitdepth || info->sbit_g > bitdepth || info->sbit_b > bitdepth) return 115; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 3, "sBIT")); - chunk[8] = info->sbit_r; - chunk[9] = info->sbit_g; - chunk[10] = info->sbit_b; - } - else if(info->color.colortype == LCT_GREY_ALPHA) { - if(info->sbit_r == 0 || info->sbit_a == 0) return 115; - if(info->sbit_r > bitdepth || info->sbit_a > bitdepth) return 115; - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "sBIT")); - chunk[8] = info->sbit_r; - chunk[9] = info->sbit_a; - } - else if(info->color.colortype == LCT_RGBA) { - if(info->sbit_r == 0 || info->sbit_g == 0 || info->sbit_b == 0 || info->sbit_a == 0 || - info->sbit_r > bitdepth || info->sbit_g > bitdepth || - info->sbit_b > bitdepth || info->sbit_a > bitdepth) { - return 115; - } - CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "sBIT")); - chunk[8] = info->sbit_r; - chunk[9] = info->sbit_g; - chunk[10] = info->sbit_b; - chunk[11] = info->sbit_a; - } - if(chunk) lodepng_chunk_generate_crc(chunk); - return 0; -} - -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -static void filterScanline(unsigned char * out, const unsigned char * scanline, const unsigned char * prevline, - size_t length, size_t bytewidth, unsigned char filterType) -{ - size_t i; - switch(filterType) { - case 0: /*None*/ - for(i = 0; i != length; ++i) out[i] = scanline[i]; - break; - case 1: /*Sub*/ - for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; - for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - scanline[i - bytewidth]; - break; - case 2: /*Up*/ - if(prevline) { - for(i = 0; i != length; ++i) out[i] = scanline[i] - prevline[i]; - } - else { - for(i = 0; i != length; ++i) out[i] = scanline[i]; - } - break; - case 3: /*Average*/ - if(prevline) { - for(i = 0; i != bytewidth; ++i) out[i] = scanline[i] - (prevline[i] >> 1); - for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) >> 1); - } - else { - for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; - for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - (scanline[i - bytewidth] >> 1); - } - break; - case 4: /*Paeth*/ - if(prevline) { - /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ - for(i = 0; i != bytewidth; ++i) out[i] = (scanline[i] - prevline[i]); - for(i = bytewidth; i < length; ++i) { - out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); - } - } - else { - for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; - /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ - for(i = bytewidth; i < length; ++i) out[i] = (scanline[i] - scanline[i - bytewidth]); - } - break; - default: - return; /*invalid filter type given*/ - } -} - -/* integer binary logarithm, max return value is 31 */ -static size_t ilog2(size_t i) -{ - size_t result = 0; - if(i >= 65536) { - result += 16; - i >>= 16; - } - if(i >= 256) { - result += 8; - i >>= 8; - } - if(i >= 16) { - result += 4; - i >>= 4; - } - if(i >= 4) { - result += 2; - i >>= 2; - } - if(i >= 2) { - result += 1; /*i >>= 1;*/ - } - return result; -} - -/* integer approximation for i * log2(i), helper function for LFS_ENTROPY */ -static size_t ilog2i(size_t i) -{ - size_t l; - if(i == 0) return 0; - l = ilog2(i); - /* approximate i*log2(i): l is integer logarithm, ((i - (1u << l)) << 1u) - linearly approximates the missing fractional part multiplied by i */ - return i * l + ((i - (((size_t)1) << l)) << 1u); -} - -static unsigned filter(unsigned char * out, const unsigned char * in, unsigned w, unsigned h, - const LodePNGColorMode * color, const LodePNGEncoderSettings * settings) -{ - /* - For PNG filter method 0 - out must be a buffer with as size: h + (w * h * bpp + 7u) / 8u, because there are - the scanlines with 1 extra byte per scanline - */ - - unsigned bpp = lodepng_get_bpp(color); - /*the width of a scanline in bytes, not including the filter type*/ - size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u; - - /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ - size_t bytewidth = (bpp + 7u) / 8u; - const unsigned char * prevline = 0; - unsigned x, y; - unsigned error = 0; - LodePNGFilterStrategy strategy = settings->filter_strategy; - - /* - There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard: - * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. - use fixed filtering, with the filter None). - * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is - not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply - all five filters and select the filter that produces the smallest sum of absolute values per row. - This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true. - - If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed, - but for "the other case", whatever strategy filter_strategy is set to instead of the minimum sum - heuristic is used. - */ - if(settings->filter_palette_zero && - (color->colortype == LCT_PALETTE || color->bitdepth < 8)) strategy = LFS_ZERO; - - if(bpp == 0) return 31; /*error: invalid color type*/ - - if(strategy >= LFS_ZERO && strategy <= LFS_FOUR) { - unsigned char type = (unsigned char)strategy; - for(y = 0; y != h; ++y) { - size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - size_t inindex = linebytes * y; - out[outindex] = type; /*filter type byte*/ - filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); - prevline = &in[inindex]; - } - } - else if(strategy == LFS_MINSUM) { - /*adaptive filtering*/ - unsigned char * attempt[5]; /*five filtering attempts, one for each filter type*/ - size_t smallest = 0; - unsigned char type, bestType = 0; - - for(type = 0; type != 5; ++type) { - attempt[type] = (unsigned char *)lodepng_malloc(linebytes); - if(!attempt[type]) error = 83; /*alloc fail*/ - } - - if(!error) { - for(y = 0; y != h; ++y) { - /*try the 5 filter types*/ - for(type = 0; type != 5; ++type) { - size_t sum = 0; - filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); - - /*calculate the sum of the result*/ - if(type == 0) { - for(x = 0; x != linebytes; ++x) sum += (unsigned char)(attempt[type][x]); - } - else { - for(x = 0; x != linebytes; ++x) { - /*For differences, each byte should be treated as signed, values above 127 are negative - (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. - This means filtertype 0 is almost never chosen, but that is justified.*/ - unsigned char s = attempt[type][x]; - sum += s < 128 ? s : (255U - s); - } - } - - /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || sum < smallest) { - bestType = type; - smallest = sum; - } - } - - prevline = &in[y * linebytes]; - - /*now fill the out values*/ - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; - } - } - - for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); - } - else if(strategy == LFS_ENTROPY) { - unsigned char * attempt[5]; /*five filtering attempts, one for each filter type*/ - size_t bestSum = 0; - unsigned type, bestType = 0; - unsigned count[256]; - - for(type = 0; type != 5; ++type) { - attempt[type] = (unsigned char *)lodepng_malloc(linebytes); - if(!attempt[type]) error = 83; /*alloc fail*/ - } - - if(!error) { - for(y = 0; y != h; ++y) { - /*try the 5 filter types*/ - for(type = 0; type != 5; ++type) { - size_t sum = 0; - filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); - lodepng_memset(count, 0, 256 * sizeof(*count)); - for(x = 0; x != linebytes; ++x) ++count[attempt[type][x]]; - ++count[type]; /*the filter type itself is part of the scanline*/ - for(x = 0; x != 256; ++x) { - sum += ilog2i(count[x]); - } - /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || sum > bestSum) { - bestType = type; - bestSum = sum; - } - } - - prevline = &in[y * linebytes]; - - /*now fill the out values*/ - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; - } - } - - for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); - } - else if(strategy == LFS_PREDEFINED) { - for(y = 0; y != h; ++y) { - size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - size_t inindex = linebytes * y; - unsigned char type = settings->predefined_filters[y]; - out[outindex] = type; /*filter type byte*/ - filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); - prevline = &in[inindex]; - } - } - else if(strategy == LFS_BRUTE_FORCE) { - /*brute force filter chooser. - deflate the scanline after every filter attempt to see which one deflates best. - This is very slow and gives only slightly smaller, sometimes even larger, result*/ - size_t size[5]; - unsigned char * attempt[5]; /*five filtering attempts, one for each filter type*/ - size_t smallest = 0; - unsigned type = 0, bestType = 0; - unsigned char * dummy; - LodePNGCompressSettings zlibsettings; - lodepng_memcpy(&zlibsettings, &settings->zlibsettings, sizeof(LodePNGCompressSettings)); - /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, - to simulate the true case where the tree is the same for the whole image. Sometimes it gives - better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare - cases better compression. It does make this a bit less slow, so it's worth doing this.*/ - zlibsettings.btype = 1; - /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG - images only, so disable it*/ - zlibsettings.custom_zlib = 0; - zlibsettings.custom_deflate = 0; - for(type = 0; type != 5; ++type) { - attempt[type] = (unsigned char *)lodepng_malloc(linebytes); - if(!attempt[type]) error = 83; /*alloc fail*/ - } - if(!error) { - for(y = 0; y != h; ++y) { /*try the 5 filter types*/ - for(type = 0; type != 5; ++type) { - unsigned testsize = (unsigned)linebytes; - /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ - - filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); - size[type] = 0; - dummy = 0; - zlib_compress(&dummy, &size[type], attempt[type], testsize, &zlibsettings); - lodepng_free(dummy); - /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || size[type] < smallest) { - bestType = type; - smallest = size[type]; - } - } - prevline = &in[y * linebytes]; - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; - } - } - for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); - } - else return 88; /* unknown filter strategy */ - - return error; -} - -static void addPaddingBits(unsigned char * out, const unsigned char * in, - size_t olinebits, size_t ilinebits, unsigned h) -{ - /*The opposite of the removePaddingBits function - olinebits must be >= ilinebits*/ - unsigned y; - size_t diff = olinebits - ilinebits; - size_t obp = 0, ibp = 0; /*bit pointers*/ - for(y = 0; y != h; ++y) { - size_t x; - for(x = 0; x < ilinebits; ++x) { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - /*obp += diff; --> no, fill in some value in the padding bits too, to avoid - "Use of uninitialised value of size ###" warning from valgrind*/ - for(x = 0; x != diff; ++x) setBitOfReversedStream(&obp, out, 0); - } -} - -/* -in: non-interlaced image with size w*h -out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with - no padding bits between scanlines, but between reduced images so that each - reduced image starts at a byte. -bpp: bits per pixel -there are no padding bits, not between scanlines, not between reduced images -in has the following size in bits: w * h * bpp. -out is possibly bigger due to padding bits between reduced images -NOTE: comments about padding bits are only relevant if bpp < 8 -*/ -static void Adam7_interlace(unsigned char * out, const unsigned char * in, unsigned w, unsigned h, unsigned bpp) -{ - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - if(bpp >= 8) { - for(i = 0; i != 7; ++i) { - unsigned x, y, b; - size_t bytewidth = bpp / 8u; - for(y = 0; y < passh[i]; ++y) - for(x = 0; x < passw[i]; ++x) { - size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; - size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; - for(b = 0; b < bytewidth; ++b) { - out[pixeloutstart + b] = in[pixelinstart + b]; - } - } - } - } - else { /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ - for(i = 0; i != 7; ++i) { - unsigned x, y, b; - unsigned ilinebits = bpp * passw[i]; - unsigned olinebits = bpp * w; - size_t obp, ibp; /*bit pointers (for out and in buffer)*/ - for(y = 0; y < passh[i]; ++y) - for(x = 0; x < passw[i]; ++x) { - ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; - obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); - for(b = 0; b < bpp; ++b) { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - } - } - } -} - -/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image. -return value is error**/ -static unsigned preProcessScanlines(unsigned char ** out, size_t * outsize, const unsigned char * in, - unsigned w, unsigned h, - const LodePNGInfo * info_png, const LodePNGEncoderSettings * settings) -{ - /* - This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps: - *) if no Adam7: 1) add padding bits (= possible extra bits per scanline if bpp < 8) 2) filter - *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter - */ - unsigned bpp = lodepng_get_bpp(&info_png->color); - unsigned error = 0; - - if(info_png->interlace_method == 0) { - *outsize = h + (h * ((w * bpp + 7u) / 8u)); /*image size plus an extra byte per scanline + possible padding bits*/ - *out = (unsigned char *)lodepng_malloc(*outsize); - if(!(*out) && (*outsize)) error = 83; /*alloc fail*/ - - if(!error) { - /*non multiple of 8 bits per scanline, padding bits needed per scanline*/ - if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) { - unsigned char * padded = (unsigned char *)lodepng_malloc(h * ((w * bpp + 7u) / 8u)); - if(!padded) error = 83; /*alloc fail*/ - if(!error) { - addPaddingBits(padded, in, ((w * bpp + 7u) / 8u) * 8u, w * bpp, h); - error = filter(*out, padded, w, h, &info_png->color, settings); - } - lodepng_free(padded); - } - else { - /*we can immediately filter into the out buffer, no other steps needed*/ - error = filter(*out, in, w, h, &info_png->color, settings); - } - } - } - else { /*interlace_method is 1 (Adam7)*/ - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned char * adam7; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/ - *out = (unsigned char *)lodepng_malloc(*outsize); - if(!(*out)) error = 83; /*alloc fail*/ - - adam7 = (unsigned char *)lodepng_malloc(passstart[7]); - if(!adam7 && passstart[7]) error = 83; /*alloc fail*/ - - if(!error) { - unsigned i; - - Adam7_interlace(adam7, in, w, h, bpp); - for(i = 0; i != 7; ++i) { - if(bpp < 8) { - unsigned char * padded = (unsigned char *)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]); - if(!padded) ERROR_BREAK(83); /*alloc fail*/ - addPaddingBits(padded, &adam7[passstart[i]], - ((passw[i] * bpp + 7u) / 8u) * 8u, passw[i] * bpp, passh[i]); - error = filter(&(*out)[filter_passstart[i]], padded, - passw[i], passh[i], &info_png->color, settings); - lodepng_free(padded); - } - else { - error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], - passw[i], passh[i], &info_png->color, settings); - } - - if(error) break; - } - } - - lodepng_free(adam7); - } - - return error; -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -static unsigned addUnknownChunks(ucvector * out, unsigned char * data, size_t datasize) -{ - unsigned char * inchunk = data; - while((size_t)(inchunk - data) < datasize) { - CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk)); - out->allocsize = out->size; /*fix the allocsize again*/ - inchunk = lodepng_chunk_next(inchunk, data + datasize); - } - return 0; -} - -static unsigned isGrayICCProfile(const unsigned char * profile, unsigned size) -{ - /* - It is a gray profile if bytes 16-19 are "GRAY", rgb profile if bytes 16-19 - are "RGB ". We do not perform any full parsing of the ICC profile here, other - than check those 4 bytes to grayscale profile. Other than that, validity of - the profile is not checked. This is needed only because the PNG specification - requires using a non-gray color model if there is an ICC profile with "RGB " - (sadly limiting compression opportunities if the input data is grayscale RGB - data), and requires using a gray color model if it is "GRAY". - */ - if(size < 20) return 0; - return profile[16] == 'G' && profile[17] == 'R' && profile[18] == 'A' && profile[19] == 'Y'; -} - -static unsigned isRGBICCProfile(const unsigned char * profile, unsigned size) -{ - /* See comment in isGrayICCProfile*/ - if(size < 20) return 0; - return profile[16] == 'R' && profile[17] == 'G' && profile[18] == 'B' && profile[19] == ' '; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -unsigned lodepng_encode(unsigned char ** out, size_t * outsize, - const unsigned char * image, unsigned w, unsigned h, - LodePNGState * state) -{ - unsigned char * data = 0; /*uncompressed version of the IDAT chunk data*/ - size_t datasize = 0; - ucvector outv = ucvector_init(NULL, 0); - LodePNGInfo info; - const LodePNGInfo * info_png = &state->info_png; - LodePNGColorMode auto_color; - - lodepng_info_init(&info); - lodepng_color_mode_init(&auto_color); - - /*provide some proper output values if error will happen*/ - *out = 0; - *outsize = 0; - state->error = 0; - - /*check input values validity*/ - if((info_png->color.colortype == LCT_PALETTE || state->encoder.force_palette) - && (info_png->color.palettesize == 0 || info_png->color.palettesize > 256)) { - /*this error is returned even if auto_convert is enabled and thus encoder could - generate the palette by itself: while allowing this could be possible in theory, - it may complicate the code or edge cases, and always requiring to give a palette - when setting this color type is a simpler contract*/ - state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/ - goto cleanup; - } - if(state->encoder.zlibsettings.btype > 2) { - state->error = 61; /*error: invalid btype*/ - goto cleanup; - } - if(info_png->interlace_method > 1) { - state->error = 71; /*error: invalid interlace mode*/ - goto cleanup; - } - state->error = checkColorValidity(info_png->color.colortype, info_png->color.bitdepth); - if(state->error) goto cleanup; /*error: invalid color type given*/ - state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth); - if(state->error) goto cleanup; /*error: invalid color type given*/ - - /* color convert and compute scanline filter types */ - lodepng_info_copy(&info, &state->info_png); - if(state->encoder.auto_convert) { - LodePNGColorStats stats; - unsigned allow_convert = 1; - lodepng_color_stats_init(&stats); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(info_png->iccp_defined && - isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) { - /*the PNG specification does not allow to use palette with a GRAY ICC profile, even - if the palette has only gray colors, so disallow it.*/ - stats.allow_palette = 0; - } - if(info_png->iccp_defined && - isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) { - /*the PNG specification does not allow to use grayscale color with RGB ICC profile, so disallow gray.*/ - stats.allow_greyscale = 0; - } -#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ - state->error = lodepng_compute_color_stats(&stats, image, w, h, &state->info_raw); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(info_png->background_defined) { - /*the background chunk's color must be taken into account as well*/ - unsigned r = 0, g = 0, b = 0; - LodePNGColorMode mode16 = lodepng_color_mode_make(LCT_RGB, 16); - lodepng_convert_rgb(&r, &g, &b, - info_png->background_r, info_png->background_g, info_png->background_b, &mode16, &info_png->color); - state->error = lodepng_color_stats_add(&stats, r, g, b, 65535); - if(state->error) goto cleanup; - } -#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ - state->error = auto_choose_color(&auto_color, &state->info_raw, &stats); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(info_png->sbit_defined) { - /*if sbit is defined, due to strict requirements of which sbit values can be present for which color modes, - auto_convert can't be done in many cases. However, do support a few cases here. - TODO: more conversions may be possible, and it may also be possible to get a more appropriate color type out of - auto_choose_color if knowledge about sbit is used beforehand - */ - unsigned sbit_max = LODEPNG_MAX(LODEPNG_MAX(LODEPNG_MAX(info_png->sbit_r, info_png->sbit_g), - info_png->sbit_b), info_png->sbit_a); - unsigned equal = (!info_png->sbit_g || info_png->sbit_g == info_png->sbit_r) - && (!info_png->sbit_b || info_png->sbit_b == info_png->sbit_r) - && (!info_png->sbit_a || info_png->sbit_a == info_png->sbit_r); - allow_convert = 0; - if(info.color.colortype == LCT_PALETTE && - auto_color.colortype == LCT_PALETTE) { - /* input and output are palette, and in this case it may happen that palette data is - expected to be copied from info_raw into the info_png */ - allow_convert = 1; - } - /*going from 8-bit RGB to palette (or 16-bit as long as sbit_max <= 8) is possible - since both are 8-bit RGB for sBIT's purposes*/ - if(info.color.colortype == LCT_RGB && - auto_color.colortype == LCT_PALETTE && sbit_max <= 8) { - allow_convert = 1; - } - /*going from 8-bit RGBA to palette is also ok but only if sbit_a is exactly 8*/ - if(info.color.colortype == LCT_RGBA && auto_color.colortype == LCT_PALETTE && - info_png->sbit_a == 8 && sbit_max <= 8) { - allow_convert = 1; - } - /*going from 16-bit RGB(A) to 8-bit RGB(A) is ok if all sbit values are <= 8*/ - if((info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA) && info.color.bitdepth == 16 && - auto_color.colortype == info.color.colortype && auto_color.bitdepth == 8 && - sbit_max <= 8) { - allow_convert = 1; - } - /*going to less channels is ok if all bit values are equal (all possible values in sbit, - as well as the chosen bitdepth of the result). Due to how auto_convert works, - we already know that auto_color.colortype has less than or equal amount of channels than - info.colortype. Palette is not used here. This conversion is not allowed if - info_png->sbit_r < auto_color.bitdepth, because specifically for alpha, non-presence of - an sbit value heavily implies that alpha's bit depth is equal to the PNG bit depth (rather - than the bit depths set in the r, g and b sbit values, by how the PNG specification describes - handling tRNS chunk case with sBIT), so be conservative here about ignoring user input.*/ - if(info.color.colortype != LCT_PALETTE && auto_color.colortype != LCT_PALETTE && - equal && info_png->sbit_r == auto_color.bitdepth) { - allow_convert = 1; - } - } -#endif - if(state->encoder.force_palette) { - if(info.color.colortype != LCT_GREY && info.color.colortype != LCT_GREY_ALPHA && - (auto_color.colortype == LCT_GREY || auto_color.colortype == LCT_GREY_ALPHA)) { - /*user speficially forced a PLTE palette, so cannot convert to grayscale types because - the PNG specification only allows writing a suggested palette in PLTE for truecolor types*/ - allow_convert = 0; - } - } - if(allow_convert) { - lodepng_color_mode_copy(&info.color, &auto_color); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*also convert the background chunk*/ - if(info_png->background_defined) { - if(lodepng_convert_rgb(&info.background_r, &info.background_g, &info.background_b, - info_png->background_r, info_png->background_g, info_png->background_b, &info.color, &info_png->color)) { - state->error = 104; - goto cleanup; - } - } -#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ - } - } -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(info_png->iccp_defined) { - unsigned gray_icc = isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size); - unsigned rgb_icc = isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size); - unsigned gray_png = info.color.colortype == LCT_GREY || info.color.colortype == LCT_GREY_ALPHA; - if(!gray_icc && !rgb_icc) { - state->error = 100; /* Disallowed profile color type for PNG */ - goto cleanup; - } - if(gray_icc != gray_png) { - /*Not allowed to use RGB/RGBA/palette with GRAY ICC profile or vice versa, - or in case of auto_convert, it wasn't possible to find appropriate model*/ - state->error = state->encoder.auto_convert ? 102 : 101; - goto cleanup; - } - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) { - unsigned char * converted; - size_t size = ((size_t)w * (size_t)h * (size_t)lodepng_get_bpp(&info.color) + 7u) / 8u; - - converted = (unsigned char *)lodepng_malloc(size); - if(!converted && size) state->error = 83; /*alloc fail*/ - if(!state->error) { - state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h); - } - if(!state->error) { - state->error = preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); - } - lodepng_free(converted); - if(state->error) goto cleanup; - } - else { - state->error = preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder); - if(state->error) goto cleanup; - } - - /* output all PNG chunks */ { -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - size_t i; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*write signature and chunks*/ - state->error = writeSignature(&outv); - if(state->error) goto cleanup; - /*IHDR*/ - state->error = addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*unknown chunks between IHDR and PLTE*/ - if(info.unknown_chunks_data[0]) { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]); - if(state->error) goto cleanup; - } - /*color profile chunks must come before PLTE */ - if(info.iccp_defined) { - state->error = addChunk_iCCP(&outv, &info, &state->encoder.zlibsettings); - if(state->error) goto cleanup; - } - if(info.srgb_defined) { - state->error = addChunk_sRGB(&outv, &info); - if(state->error) goto cleanup; - } - if(info.gama_defined) { - state->error = addChunk_gAMA(&outv, &info); - if(state->error) goto cleanup; - } - if(info.chrm_defined) { - state->error = addChunk_cHRM(&outv, &info); - if(state->error) goto cleanup; - } - if(info_png->sbit_defined) { - state->error = addChunk_sBIT(&outv, &info); - if(state->error) goto cleanup; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*PLTE*/ - if(info.color.colortype == LCT_PALETTE) { - state->error = addChunk_PLTE(&outv, &info.color); - if(state->error) goto cleanup; - } - if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) { - /*force_palette means: write suggested palette for truecolor in PLTE chunk*/ - state->error = addChunk_PLTE(&outv, &info.color); - if(state->error) goto cleanup; - } - /*tRNS (this will only add if when necessary) */ - state->error = addChunk_tRNS(&outv, &info.color); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*bKGD (must come between PLTE and the IDAt chunks*/ - if(info.background_defined) { - state->error = addChunk_bKGD(&outv, &info); - if(state->error) goto cleanup; - } - /*pHYs (must come before the IDAT chunks)*/ - if(info.phys_defined) { - state->error = addChunk_pHYs(&outv, &info); - if(state->error) goto cleanup; - } - - /*unknown chunks between PLTE and IDAT*/ - if(info.unknown_chunks_data[1]) { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]); - if(state->error) goto cleanup; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*IDAT (multiple IDAT chunks must be consecutive)*/ - state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings); - if(state->error) goto cleanup; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*tIME*/ - if(info.time_defined) { - state->error = addChunk_tIME(&outv, &info.time); - if(state->error) goto cleanup; - } - /*tEXt and/or zTXt*/ - for(i = 0; i != info.text_num; ++i) { - if(lodepng_strlen(info.text_keys[i]) > 79) { - state->error = 66; /*text chunk too large*/ - goto cleanup; - } - if(lodepng_strlen(info.text_keys[i]) < 1) { - state->error = 67; /*text chunk too small*/ - goto cleanup; - } - if(state->encoder.text_compression) { - state->error = addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings); - if(state->error) goto cleanup; - } - else { - state->error = addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]); - if(state->error) goto cleanup; - } - } - /*LodePNG version id in text chunk*/ - if(state->encoder.add_id) { - unsigned already_added_id_text = 0; - for(i = 0; i != info.text_num; ++i) { - const char * k = info.text_keys[i]; - /* Could use strcmp, but we're not calling or reimplementing this C library function for this use only */ - if(k[0] == 'L' && k[1] == 'o' && k[2] == 'd' && k[3] == 'e' && - k[4] == 'P' && k[5] == 'N' && k[6] == 'G' && k[7] == '\0') { - already_added_id_text = 1; - break; - } - } - if(already_added_id_text == 0) { - state->error = addChunk_tEXt(&outv, "LodePNG", LODEPNG_VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ - if(state->error) goto cleanup; - } - } - /*iTXt*/ - for(i = 0; i != info.itext_num; ++i) { - if(lodepng_strlen(info.itext_keys[i]) > 79) { - state->error = 66; /*text chunk too large*/ - goto cleanup; - } - if(lodepng_strlen(info.itext_keys[i]) < 1) { - state->error = 67; /*text chunk too small*/ - goto cleanup; - } - state->error = addChunk_iTXt( - &outv, state->encoder.text_compression, - info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i], - &state->encoder.zlibsettings); - if(state->error) goto cleanup; - } - - /*unknown chunks between IDAT and IEND*/ - if(info.unknown_chunks_data[2]) { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]); - if(state->error) goto cleanup; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - state->error = addChunk_IEND(&outv); - if(state->error) goto cleanup; - } - -cleanup: - lodepng_info_cleanup(&info); - lodepng_free(data); - lodepng_color_mode_cleanup(&auto_color); - - /*instead of cleaning the vector up, give it to the output*/ - *out = outv.data; - *outsize = outv.size; - - return state->error; -} - -unsigned lodepng_encode_memory(unsigned char ** out, size_t * outsize, const unsigned char * image, - unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned error; - LodePNGState state; - lodepng_state_init(&state); - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; - state.info_png.color.colortype = colortype; - state.info_png.color.bitdepth = bitdepth; - lodepng_encode(out, outsize, image, w, h, &state); - error = state.error; - lodepng_state_cleanup(&state); - return error; -} - -unsigned lodepng_encode32(unsigned char ** out, size_t * outsize, const unsigned char * image, unsigned w, unsigned h) -{ - return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8); -} - -unsigned lodepng_encode24(unsigned char ** out, size_t * outsize, const unsigned char * image, unsigned w, unsigned h) -{ - return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned lodepng_encode_file(const char * filename, const unsigned char * image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned char * buffer; - size_t buffersize; - unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth); - if(!error) error = lodepng_save_file(buffer, buffersize, filename); - lodepng_free(buffer); - return error; -} - -unsigned lodepng_encode32_file(const char * filename, const unsigned char * image, unsigned w, unsigned h) -{ - return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8); -} - -unsigned lodepng_encode24_file(const char * filename, const unsigned char * image, unsigned w, unsigned h) -{ - return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8); -} -#endif /*LODEPNG_COMPILE_DISK*/ - -void lodepng_encoder_settings_init(LodePNGEncoderSettings * settings) -{ - lodepng_compress_settings_init(&settings->zlibsettings); - settings->filter_palette_zero = 1; - settings->filter_strategy = LFS_MINSUM; - settings->auto_convert = 1; - settings->force_palette = 0; - settings->predefined_filters = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - settings->add_id = 0; - settings->text_compression = 1; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ERROR_TEXT -/* -This returns the description of a numerical error code in English. This is also -the documentation of all the error codes. -*/ -const char * lodepng_error_text(unsigned code) -{ - switch(code) { - case 0: - return "no error, everything went ok"; - case 1: - return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/ - case 10: - return "end of input memory reached without huffman end code"; /*while huffman decoding*/ - case 11: - return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/ - case 13: - return "problem while processing dynamic deflate block"; - case 14: - return "problem while processing dynamic deflate block"; - case 15: - return "problem while processing dynamic deflate block"; - /*this error could happen if there are only 0 or 1 symbols present in the huffman code:*/ - case 16: - return "invalid code while processing dynamic deflate block"; - case 17: - return "end of out buffer memory reached while inflating"; - case 18: - return "invalid distance code while inflating"; - case 19: - return "end of out buffer memory reached while inflating"; - case 20: - return "invalid deflate block BTYPE encountered while decoding"; - case 21: - return "NLEN is not ones complement of LEN in a deflate block"; - - /*end of out buffer memory reached while inflating: - This can happen if the inflated deflate data is longer than the amount of bytes required to fill up - all the pixels of the image, given the color depth and image dimensions. Something that doesn't - happen in a normal, well encoded, PNG image.*/ - case 22: - return "end of out buffer memory reached while inflating"; - case 23: - return "end of in buffer memory reached while inflating"; - case 24: - return "invalid FCHECK in zlib header"; - case 25: - return "invalid compression method in zlib header"; - case 26: - return "FDICT encountered in zlib header while it's not used for PNG"; - case 27: - return "PNG file is smaller than a PNG header"; - /*Checks the magic file header, the first 8 bytes of the PNG file*/ - case 28: - return "incorrect PNG signature, it's no PNG or corrupted"; - case 29: - return "first chunk is not the header chunk"; - case 30: - return "chunk length too large, chunk broken off at end of file"; - case 31: - return "illegal PNG color type or bpp"; - case 32: - return "illegal PNG compression method"; - case 33: - return "illegal PNG filter method"; - case 34: - return "illegal PNG interlace method"; - case 35: - return "chunk length of a chunk is too large or the chunk too small"; - case 36: - return "illegal PNG filter type encountered"; - case 37: - return "illegal bit depth for this color type given"; - case 38: - return "the palette is too small or too big"; /*0, or more than 256 colors*/ - case 39: - return "tRNS chunk before PLTE or has more entries than palette size"; - case 40: - return "tRNS chunk has wrong size for grayscale image"; - case 41: - return "tRNS chunk has wrong size for RGB image"; - case 42: - return "tRNS chunk appeared while it was not allowed for this color type"; - case 43: - return "bKGD chunk has wrong size for palette image"; - case 44: - return "bKGD chunk has wrong size for grayscale image"; - case 45: - return "bKGD chunk has wrong size for RGB image"; - case 48: - return "empty input buffer given to decoder. Maybe caused by non-existing file?"; - case 49: - return "jumped past memory while generating dynamic huffman tree"; - case 50: - return "jumped past memory while generating dynamic huffman tree"; - case 51: - return "jumped past memory while inflating huffman block"; - case 52: - return "jumped past memory while inflating"; - case 53: - return "size of zlib data too small"; - case 54: - return "repeat symbol in tree while there was no value symbol yet"; - /*jumped past tree while generating huffman tree, this could be when the - tree will have more leaves than symbols after generating it out of the - given lengths. They call this an oversubscribed dynamic bit lengths tree in zlib.*/ - case 55: - return "jumped past tree while generating huffman tree"; - case 56: - return "given output image colortype or bitdepth not supported for color conversion"; - case 57: - return "invalid CRC encountered (checking CRC can be disabled)"; - case 58: - return "invalid ADLER32 encountered (checking ADLER32 can be disabled)"; - case 59: - return "requested color conversion not supported"; - case 60: - return "invalid window size given in the settings of the encoder (must be 0-32768)"; - case 61: - return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)"; - /*LodePNG leaves the choice of RGB to grayscale conversion formula to the user.*/ - case 62: - return "conversion from color to grayscale not supported"; - /*(2^31-1)*/ - case 63: - return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; - /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/ - case 64: - return "the length of the END symbol 256 in the Huffman tree is 0"; - case 66: - return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes"; - case 67: - return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte"; - case 68: - return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors"; - case 69: - return "unknown chunk type with 'critical' flag encountered by the decoder"; - case 71: - return "invalid interlace mode given to encoder (must be 0 or 1)"; - case 72: - return "while decoding, invalid compression method encountering in zTXt or iTXt chunk (it must be 0)"; - case 73: - return "invalid tIME chunk size"; - case 74: - return "invalid pHYs chunk size"; - /*length could be wrong, or data chopped off*/ - case 75: - return "no null termination char found while decoding text chunk"; - case 76: - return "iTXt chunk too short to contain required bytes"; - case 77: - return "integer overflow in buffer size"; - case 78: - return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/ - case 79: - return "failed to open file for writing"; - case 80: - return "tried creating a tree of 0 symbols"; - case 81: - return "lazy matching at pos 0 is impossible"; - case 82: - return "color conversion to palette requested while a color isn't in palette, or index out of bounds"; - case 83: - return "memory allocation failed"; - case 84: - return "given image too small to contain all pixels to be encoded"; - case 86: - return "impossible offset in lz77 encoding (internal bug)"; - case 87: - return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined"; - case 88: - return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy"; - case 89: - return "text chunk keyword too short or long: must have size 1-79"; - /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/ - case 90: - return "windowsize must be a power of two"; - case 91: - return "invalid decompressed idat size"; - case 92: - return "integer overflow due to too many pixels"; - case 93: - return "zero width or height is invalid"; - case 94: - return "header chunk must have a size of 13 bytes"; - case 95: - return "integer overflow with combined idat chunk size"; - case 96: - return "invalid gAMA chunk size"; - case 97: - return "invalid cHRM chunk size"; - case 98: - return "invalid sRGB chunk size"; - case 99: - return "invalid sRGB rendering intent"; - case 100: - return "invalid ICC profile color type, the PNG specification only allows RGB or GRAY"; - case 101: - return "PNG specification does not allow RGB ICC profile on gray color types and vice versa"; - case 102: - return "not allowed to set grayscale ICC profile with colored pixels by PNG specification"; - case 103: - return "invalid palette index in bKGD chunk. Maybe it came before PLTE chunk?"; - case 104: - return "invalid bKGD color while encoding (e.g. palette index out of range)"; - case 105: - return "integer overflow of bitsize"; - case 106: - return "PNG file must have PLTE chunk if color type is palette"; - case 107: - return "color convert from palette mode requested without setting the palette data in it"; - case 108: - return "tried to add more than 256 values to a palette"; - /*this limit can be configured in LodePNGDecompressSettings*/ - case 109: - return "tried to decompress zlib or deflate data larger than desired max_output_size"; - case 110: - return "custom zlib or inflate decompression failed"; - case 111: - return "custom zlib or deflate compression failed"; - /*max text size limit can be configured in LodePNGDecoderSettings. This error prevents - unreasonable memory consumption when decoding due to impossibly large text sizes.*/ - case 112: - return "compressed text unreasonably large"; - /*max ICC size limit can be configured in LodePNGDecoderSettings. This error prevents - unreasonable memory consumption when decoding due to impossibly large ICC profile*/ - case 113: - return "ICC profile unreasonably large"; - case 114: - return "sBIT chunk has wrong size for the color type of the image"; - case 115: - return "sBIT value out of range"; - } - return "unknown error code"; -} -#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // C++ Wrapper // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_CPP -namespace lodepng -{ - -#ifdef LODEPNG_COMPILE_DISK -unsigned load_file(std::vector & buffer, const std::string & filename) -{ - long size = lodepng_filesize(filename.c_str()); - if(size < 0) return 78; - buffer.resize((size_t)size); - return size == 0 ? 0 : lodepng_buffer_file(&buffer[0], (size_t)size, filename.c_str()); -} - -/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ -unsigned save_file(const std::vector & buffer, const std::string & filename) -{ - return lodepng_save_file(buffer.empty() ? 0 : &buffer[0], buffer.size(), filename.c_str()); -} -#endif /* LODEPNG_COMPILE_DISK */ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_DECODER -unsigned decompress(std::vector & out, const unsigned char * in, size_t insize, - const LodePNGDecompressSettings & settings) -{ - unsigned char * buffer = 0; - size_t buffersize = 0; - unsigned error = zlib_decompress(&buffer, &buffersize, 0, in, insize, &settings); - if(buffer) { - out.insert(out.end(), buffer, &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned decompress(std::vector & out, const std::vector & in, - const LodePNGDecompressSettings & settings) -{ - return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings); -} -#endif /* LODEPNG_COMPILE_DECODER */ - -#ifdef LODEPNG_COMPILE_ENCODER -unsigned compress(std::vector & out, const unsigned char * in, size_t insize, - const LodePNGCompressSettings & settings) -{ - unsigned char * buffer = 0; - size_t buffersize = 0; - unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings); - if(buffer) { - out.insert(out.end(), buffer, &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned compress(std::vector & out, const std::vector & in, - const LodePNGCompressSettings & settings) -{ - return compress(out, in.empty() ? 0 : &in[0], in.size(), settings); -} -#endif /* LODEPNG_COMPILE_ENCODER */ -#endif /* LODEPNG_COMPILE_ZLIB */ - - -#ifdef LODEPNG_COMPILE_PNG - -State::State() -{ - lodepng_state_init(this); -} - -State::State(const State & other) -{ - lodepng_state_init(this); - lodepng_state_copy(this, &other); -} - -State::~State() -{ - lodepng_state_cleanup(this); -} - -State & State::operator=(const State & other) -{ - lodepng_state_copy(this, &other); - return *this; -} - -#ifdef LODEPNG_COMPILE_DECODER - -unsigned decode(std::vector & out, unsigned & w, unsigned & h, const unsigned char * in, - size_t insize, LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned char * buffer = 0; - unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth); - if(buffer && !error) { - State state; - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; - size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); - out.insert(out.end(), buffer, &buffer[buffersize]); - } - lodepng_free(buffer); - return error; -} - -unsigned decode(std::vector & out, unsigned & w, unsigned & h, - const std::vector & in, LodePNGColorType colortype, unsigned bitdepth) -{ - return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth); -} - -unsigned decode(std::vector & out, unsigned & w, unsigned & h, - State & state, - const unsigned char * in, size_t insize) -{ - unsigned char * buffer = NULL; - unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); - if(buffer && !error) { - size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); - out.insert(out.end(), buffer, &buffer[buffersize]); - } - lodepng_free(buffer); - return error; -} - -unsigned decode(std::vector & out, unsigned & w, unsigned & h, - State & state, - const std::vector & in) -{ - return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size()); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned decode(std::vector & out, unsigned & w, unsigned & h, const std::string & filename, - LodePNGColorType colortype, unsigned bitdepth) -{ - std::vector buffer; - /* safe output values in case error happens */ - w = h = 0; - unsigned error = load_file(buffer, filename); - if(error) return error; - return decode(out, w, h, buffer, colortype, bitdepth); -} -#endif /* LODEPNG_COMPILE_DECODER */ -#endif /* LODEPNG_COMPILE_DISK */ - -#ifdef LODEPNG_COMPILE_ENCODER -unsigned encode(std::vector & out, const unsigned char * in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned char * buffer; - size_t buffersize; - unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); - if(buffer) { - out.insert(out.end(), buffer, &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned encode(std::vector & out, - const std::vector & in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; - return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); -} - -unsigned encode(std::vector & out, - const unsigned char * in, unsigned w, unsigned h, - State & state) -{ - unsigned char * buffer; - size_t buffersize; - unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); - if(buffer) { - out.insert(out.end(), buffer, &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned encode(std::vector & out, - const std::vector & in, unsigned w, unsigned h, - State & state) -{ - if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84; - return encode(out, in.empty() ? 0 : &in[0], w, h, state); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned encode(const std::string & filename, - const unsigned char * in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - std::vector buffer; - unsigned error = encode(buffer, in, w, h, colortype, bitdepth); - if(!error) error = save_file(buffer, filename); - return error; -} - -unsigned encode(const std::string & filename, - const std::vector & in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; - return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); -} -#endif /* LODEPNG_COMPILE_DISK */ -#endif /* LODEPNG_COMPILE_ENCODER */ -#endif /* LODEPNG_COMPILE_PNG */ -} /* namespace lodepng */ -#endif /*LODEPNG_COMPILE_CPP*/ - -#endif /*LV_USE_LODEPNG*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/lodepng/lodepng.h b/software/Power_Pico/Middlewares/LVGL/src/libs/lodepng/lodepng.h deleted file mode 100644 index 1ae3496..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/lodepng/lodepng.h +++ /dev/null @@ -1,2105 +0,0 @@ -/* -LodePNG version 20230410 - -Copyright (c) 2005-2023 Lode Vandevenne - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. -*/ - -#ifndef LODEPNG_H -#define LODEPNG_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../../../lvgl.h" -#if LV_USE_LODEPNG -#include LV_STDDEF_INCLUDE /*for size_t*/ -LV_ATTRIBUTE_EXTERN_DATA extern const char * LODEPNG_VERSION_STRING; - -/* -The following #defines are used to create code sections. They can be disabled -to disable code sections, which can give faster compile time and smaller binary. -The "NO_COMPILE" defines are designed to be used to pass as defines to the -compiler command to disable them without modifying this header, e.g. --DLODEPNG_NO_COMPILE_ZLIB for gcc or clang. -*/ -/*deflate & zlib. If disabled, you must specify alternative zlib functions in -the custom_zlib field of the compress and decompress settings*/ -#ifndef LODEPNG_NO_COMPILE_ZLIB - /*pass -DLODEPNG_NO_COMPILE_ZLIB to the compiler to disable this, or comment out LODEPNG_COMPILE_ZLIB below*/ - #define LODEPNG_COMPILE_ZLIB -#endif - -/*png encoder and png decoder*/ -#ifndef LODEPNG_NO_COMPILE_PNG - /*pass -DLODEPNG_NO_COMPILE_PNG to the compiler to disable this, or comment out LODEPNG_COMPILE_PNG below*/ - #define LODEPNG_COMPILE_PNG -#endif - -/*deflate&zlib decoder and png decoder*/ -#ifndef LODEPNG_NO_COMPILE_DECODER - /*pass -DLODEPNG_NO_COMPILE_DECODER to the compiler to disable this, or comment out LODEPNG_COMPILE_DECODER below*/ - #define LODEPNG_COMPILE_DECODER -#endif - -/*deflate&zlib encoder and png encoder*/ -#ifndef LODEPNG_NO_COMPILE_ENCODER - /*pass -DLODEPNG_NO_COMPILE_ENCODER to the compiler to disable this, or comment out LODEPNG_COMPILE_ENCODER below*/ - #define LODEPNG_COMPILE_ENCODER -#endif - -/*the optional built in harddisk file loading and saving functions*/ -#ifndef LODEPNG_NO_COMPILE_DISK - /*pass -DLODEPNG_NO_COMPILE_DISK to the compiler to disable this, or comment out LODEPNG_COMPILE_DISK below*/ - #define LODEPNG_COMPILE_DISK -#endif - -/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ -#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS - /*pass -DLODEPNG_NO_COMPILE_ANCILLARY_CHUNKS to the compiler to disable this, - or comment out LODEPNG_COMPILE_ANCILLARY_CHUNKS below*/ - #define LODEPNG_COMPILE_ANCILLARY_CHUNKS -#endif - -/*ability to convert error numerical codes to English text string*/ -#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT - /*pass -DLODEPNG_NO_COMPILE_ERROR_TEXT to the compiler to disable this, - or comment out LODEPNG_COMPILE_ERROR_TEXT below*/ - #define LODEPNG_COMPILE_ERROR_TEXT -#endif - -/*Compile the default allocators (C's free, malloc and realloc). If you disable this, -you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your -source files with custom allocators.*/ -#ifndef LODEPNG_NO_COMPILE_ALLOCATORS - /*pass -DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler to disable the built-in ones, - or comment out LODEPNG_COMPILE_ALLOCATORS below*/ - #define LODEPNG_COMPILE_ALLOCATORS -#endif - -/*Disable built-in CRC function, in that case a custom implementation of -lodepng_crc32 must be defined externally so that it can be linked in. -The default built-in CRC code comes with 8KB of lookup tables, so for memory constrained environment you may want it -disabled and provide a much smaller implementation externally as said above. You can find such an example implementation -in a comment in the lodepng.c(pp) file in the 'else' case of the searchable LODEPNG_COMPILE_CRC section.*/ -#ifndef LODEPNG_NO_COMPILE_CRC - /*pass -DLODEPNG_NO_COMPILE_CRC to the compiler to disable the built-in one, - or comment out LODEPNG_COMPILE_CRC below*/ - #define LODEPNG_COMPILE_CRC -#endif - -/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ -#ifdef __cplusplus - #ifndef LODEPNG_NO_COMPILE_CPP - /*pass -DLODEPNG_NO_COMPILE_CPP to the compiler to disable C++ (not needed if a C-only compiler), - or comment out LODEPNG_COMPILE_CPP below*/ - #define LODEPNG_COMPILE_CPP - #endif -#endif - -#ifdef LODEPNG_COMPILE_CPP - #include - #include -#endif /*LODEPNG_COMPILE_CPP*/ - -#ifdef LODEPNG_COMPILE_PNG -/*The PNG color types (also used for raw image).*/ -typedef enum LodePNGColorType { - LCT_GREY = 0, /*grayscale: 1,2,4,8,16 bit*/ - LCT_RGB = 2, /*RGB: 8,16 bit*/ - LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/ - LCT_GREY_ALPHA = 4, /*grayscale with alpha: 8,16 bit*/ - LCT_RGBA = 6, /*RGB with alpha: 8,16 bit*/ - /*LCT_MAX_OCTET_VALUE lets the compiler allow this enum to represent any invalid - byte value from 0 to 255 that could be present in an invalid PNG file header. Do - not use, compare with or set the name LCT_MAX_OCTET_VALUE, instead either use - the valid color type names above, or numeric values like 1 or 7 when checking for - particular disallowed color type byte values, or cast to integer to print it.*/ - LCT_MAX_OCTET_VALUE = 255 -} LodePNGColorType; - -#ifdef LODEPNG_COMPILE_DECODER -/* -Converts PNG data in memory to raw pixel data. -out: Output parameter. Pointer to buffer that will contain the raw pixel data. - After decoding, its size is w * h * (bytes per pixel) bytes larger than - initially. Bytes per pixel depends on colortype and bitdepth. - Must be freed after usage with free(*out). - Note: for 16-bit per channel colors, uses big endian format like PNG does. -w: Output parameter. Pointer to width of pixel data. -h: Output parameter. Pointer to height of pixel data. -in: Memory buffer with the PNG file. -insize: size of the in buffer. -colortype: the desired color type for the raw output image. See explanation on PNG color types. -bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. -Return value: LodePNG error code (0 means no error). -*/ -unsigned lodepng_decode_memory(unsigned char ** out, unsigned * w, unsigned * h, - const unsigned char * in, size_t insize, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ -unsigned lodepng_decode32(unsigned char ** out, unsigned * w, unsigned * h, - const unsigned char * in, size_t insize); - -/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ -unsigned lodepng_decode24(unsigned char ** out, unsigned * w, unsigned * h, - const unsigned char * in, size_t insize); - -#ifdef LODEPNG_COMPILE_DISK -/* -Load PNG from disk, from file with given name. -Same as the other decode functions, but instead takes a filename as input. - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and decode in-memory.*/ -unsigned lodepng_decode_file(unsigned char ** out, unsigned * w, unsigned * h, - const char * filename, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image. - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and decode in-memory.*/ -unsigned lodepng_decode32_file(unsigned char ** out, unsigned * w, unsigned * h, - const char * filename); - -/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image. - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and decode in-memory.*/ -unsigned lodepng_decode24_file(unsigned char ** out, unsigned * w, unsigned * h, - const char * filename); -#endif /*LODEPNG_COMPILE_DISK*/ -#endif /*LODEPNG_COMPILE_DECODER*/ - - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Converts raw pixel data into a PNG image in memory. The colortype and bitdepth - of the output PNG image cannot be chosen, they are automatically determined - by the colortype, bitdepth and content of the input pixel data. - Note: for 16-bit per channel colors, needs big endian format like PNG does. -out: Output parameter. Pointer to buffer that will contain the PNG image data. - Must be freed after usage with free(*out). -outsize: Output parameter. Pointer to the size in bytes of the out buffer. -image: The raw pixel data to encode. The size of this buffer should be - w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth. -w: width of the raw pixel data in pixels. -h: height of the raw pixel data in pixels. -colortype: the color type of the raw input image. See explanation on PNG color types. -bitdepth: the bit depth of the raw input image. See explanation on PNG color types. -Return value: LodePNG error code (0 means no error). -*/ -unsigned lodepng_encode_memory(unsigned char ** out, size_t * outsize, - const unsigned char * image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ -unsigned lodepng_encode32(unsigned char ** out, size_t * outsize, - const unsigned char * image, unsigned w, unsigned h); - -/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ -unsigned lodepng_encode24(unsigned char ** out, size_t * outsize, - const unsigned char * image, unsigned w, unsigned h); - -#ifdef LODEPNG_COMPILE_DISK -/* -Converts raw pixel data into a PNG file on disk. -Same as the other encode functions, but instead takes a filename as output. - -NOTE: This overwrites existing files without warning! - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and encode in-memory.*/ -unsigned lodepng_encode_file(const char * filename, - const unsigned char * image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image. - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and encode in-memory.*/ -unsigned lodepng_encode32_file(const char * filename, - const unsigned char * image, unsigned w, unsigned h); - -/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image. - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and encode in-memory.*/ -unsigned lodepng_encode24_file(const char * filename, - const unsigned char * image, unsigned w, unsigned h); -#endif /*LODEPNG_COMPILE_DISK*/ -#endif /*LODEPNG_COMPILE_ENCODER*/ - - -#ifdef LODEPNG_COMPILE_CPP -namespace lodepng -{ -#ifdef LODEPNG_COMPILE_DECODER -/*Same as lodepng_decode_memory, but decodes to an std::vector. The colortype -is the format to output the pixels to. Default is RGBA 8-bit per channel.*/ -unsigned decode(std::vector & out, unsigned & w, unsigned & h, - const unsigned char * in, size_t insize, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned decode(std::vector & out, unsigned & w, unsigned & h, - const std::vector & in, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#ifdef LODEPNG_COMPILE_DISK -/* -Converts PNG file from disk to raw pixel data in memory. -Same as the other decode functions, but instead takes a filename as input. - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and decode in-memory. -*/ -unsigned decode(std::vector & out, unsigned & w, unsigned & h, - const std::string & filename, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#endif /* LODEPNG_COMPILE_DISK */ -#endif /* LODEPNG_COMPILE_DECODER */ - -#ifdef LODEPNG_COMPILE_ENCODER -/*Same as lodepng_encode_memory, but encodes to an std::vector. colortype -is that of the raw input data. The output PNG color type will be auto chosen.*/ -unsigned encode(std::vector & out, - const unsigned char * in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned encode(std::vector & out, - const std::vector & in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#ifdef LODEPNG_COMPILE_DISK -/* -Converts 32-bit RGBA raw pixel data into a PNG file on disk. -Same as the other encode functions, but instead takes a filename as output. - -NOTE: This overwrites existing files without warning! - -NOTE: Wide-character filenames are not supported, you can use an external method -to handle such files and decode in-memory. -*/ -unsigned encode(const std::string & filename, - const unsigned char * in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned encode(const std::string & filename, - const std::vector & in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#endif /* LODEPNG_COMPILE_DISK */ -#endif /* LODEPNG_COMPILE_ENCODER */ -} /* namespace lodepng */ -#endif /*LODEPNG_COMPILE_CPP*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ERROR_TEXT - /*Returns an English description of the numerical error code.*/ - const char * lodepng_error_text(unsigned code); -#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ - -#ifdef LODEPNG_COMPILE_DECODER -/*Settings for zlib decompression*/ -typedef struct LodePNGDecompressSettings LodePNGDecompressSettings; -struct LodePNGDecompressSettings { - /* Check LodePNGDecoderSettings for more ignorable errors such as ignore_crc */ - unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/ - unsigned ignore_nlen; /*ignore complement of len checksum in uncompressed blocks*/ - - /*Maximum decompressed size, beyond this the decoder may (and is encouraged to) stop decoding, - return an error, output a data size > max_output_size and all the data up to that point. This is - neither a hard limit nor a guarantee, but can prevent excessive memory usage. This setting is - ignored by the PNG decoder, but is used by the deflate/zlib decoder and can be used by custom ones. - Set to 0 to impose no limit (the default).*/ - size_t max_output_size; - - /*use custom zlib decoder instead of built in one (default: null). - Should return 0 if success, any non-0 if error (numeric value not exposed).*/ - unsigned(*custom_zlib)(unsigned char **, size_t *, - const unsigned char *, size_t, - const LodePNGDecompressSettings *); - /*use custom deflate decoder instead of built in one (default: null) - if custom_zlib is not null, custom_inflate is ignored (the zlib format uses deflate). - Should return 0 if success, any non-0 if error (numeric value not exposed).*/ - unsigned(*custom_inflate)(unsigned char **, size_t *, - const unsigned char *, size_t, - const LodePNGDecompressSettings *); - - const void * custom_context; /*optional custom settings for custom functions*/ -}; - -LV_ATTRIBUTE_EXTERN_DATA extern const LodePNGDecompressSettings lodepng_default_decompress_settings; -void lodepng_decompress_settings_init(LodePNGDecompressSettings * settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Settings for zlib compression. Tweaking these settings tweaks the balance -between speed and compression ratio. -*/ -typedef struct LodePNGCompressSettings LodePNGCompressSettings; -struct LodePNGCompressSettings { /*deflate = compress*/ - /*LZ77 related settings*/ - unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ - unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ - unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Default value: 2048.*/ - unsigned minmatch; /*minimum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/ - unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/ - unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/ - - /*use custom zlib encoder instead of built in one (default: null)*/ - unsigned(*custom_zlib)(unsigned char **, size_t *, - const unsigned char *, size_t, - const LodePNGCompressSettings *); - /*use custom deflate encoder instead of built in one (default: null) - if custom_zlib is used, custom_deflate is ignored since only the built in - zlib function will call custom_deflate*/ - unsigned(*custom_deflate)(unsigned char **, size_t *, - const unsigned char *, size_t, - const LodePNGCompressSettings *); - - const void * custom_context; /*optional custom settings for custom functions*/ -}; - -LV_ATTRIBUTE_EXTERN_DATA extern const LodePNGCompressSettings lodepng_default_compress_settings; -void lodepng_compress_settings_init(LodePNGCompressSettings * settings); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_PNG -/* -Color mode of an image. Contains all information required to decode the pixel -bits to RGBA colors. This information is the same as used in the PNG file -format, and is used both for PNG and raw image data in LodePNG. -*/ -typedef struct LodePNGColorMode { - /*header (IHDR)*/ - LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/ - unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/ - - /* - palette (PLTE and tRNS) - - Dynamically allocated with the colors of the palette, including alpha. - This field may not be allocated directly, use lodepng_color_mode_init first, - then lodepng_palette_add per color to correctly initialize it (to ensure size - of exactly 1024 bytes). - - The alpha channels must be set as well, set them to 255 for opaque images. - - When decoding, with the default settings you can ignore this palette, since - LodePNG already fills the palette colors in the pixels of the raw RGBA output, - but when decoding to the original PNG color mode it is needed to reconstruct - the colors. - - The palette is only supported for color type 3. - */ - unsigned char * palette; /*palette in RGBARGBA... order. Must be either 0, or when allocated must have 1024 bytes*/ - size_t palettesize; /*palette size in number of colors (amount of used bytes is 4 * palettesize)*/ - - /* - transparent color key (tRNS) - - This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit. - For grayscale PNGs, r, g and b will all 3 be set to the same. - - When decoding, by default you can ignore this information, since LodePNG sets - pixels with this key to transparent already in the raw RGBA output. - - The color key is only supported for color types 0 and 2. - */ - unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/ - unsigned key_r; /*red/grayscale component of color key*/ - unsigned key_g; /*green component of color key*/ - unsigned key_b; /*blue component of color key*/ -} LodePNGColorMode; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_color_mode_init(LodePNGColorMode * info); -void lodepng_color_mode_cleanup(LodePNGColorMode * info); -/*return value is error code (0 means no error)*/ -unsigned lodepng_color_mode_copy(LodePNGColorMode * dest, const LodePNGColorMode * source); -/* Makes a temporary LodePNGColorMode that does not need cleanup (no palette) */ -LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth); - -void lodepng_palette_clear(LodePNGColorMode * info); -/*add 1 color to the palette*/ -unsigned lodepng_palette_add(LodePNGColorMode * info, - unsigned char r, unsigned char g, unsigned char b, unsigned char a); - -/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/ -unsigned lodepng_get_bpp(const LodePNGColorMode * info); -/*get the amount of color channels used, based on colortype in the struct. -If a palette is used, it counts as 1 channel.*/ -unsigned lodepng_get_channels(const LodePNGColorMode * info); -/*is it a grayscale type? (only colortype 0 or 4)*/ -unsigned lodepng_is_greyscale_type(const LodePNGColorMode * info); -/*has it got an alpha channel? (only colortype 2 or 6)*/ -unsigned lodepng_is_alpha_type(const LodePNGColorMode * info); -/*has it got a palette? (only colortype 3)*/ -unsigned lodepng_is_palette_type(const LodePNGColorMode * info); -/*only returns true if there is a palette and there is a value in the palette with alpha < 255. -Loops through the palette to check this.*/ -unsigned lodepng_has_palette_alpha(const LodePNGColorMode * info); -/* -Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image. -Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels). -Returns false if the image can only have opaque pixels. -In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values, -or if "key_defined" is true. -*/ -unsigned lodepng_can_have_alpha(const LodePNGColorMode * info); -/*Returns the byte size of a raw image buffer with given width, height and color mode*/ -size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode * color); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*The information of a Time chunk in PNG.*/ -typedef struct LodePNGTime { - unsigned year; /*2 bytes used (0-65535)*/ - unsigned month; /*1-12*/ - unsigned day; /*1-31*/ - unsigned hour; /*0-23*/ - unsigned minute; /*0-59*/ - unsigned second; /*0-60 (to allow for leap seconds)*/ -} LodePNGTime; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/*Information about the PNG image, except pixels, width and height.*/ -typedef struct LodePNGInfo { - /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/ - unsigned compression_method;/*compression method of the original file. Always 0.*/ - unsigned filter_method; /*filter method of the original file*/ - unsigned interlace_method; /*interlace method of the original file: 0=none, 1=Adam7*/ - LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/ - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /* - Suggested background color chunk (bKGD) - - This uses the same color mode and bit depth as the PNG (except no alpha channel), - with values truncated to the bit depth in the unsigned integer. - - For grayscale and palette PNGs, the value is stored in background_r. The values - in background_g and background_b are then unused. The decoder will set them - equal to background_r, the encoder ignores them in this case. - - When decoding, you may get these in a different color mode than the one you requested - for the raw pixels: the colortype and bitdepth defined by info_png.color, that is the - ones defined in the header of the PNG image, are used. - - When encoding with auto_convert, you must use the color model defined in info_png.color for - these values. The encoder normally ignores info_png.color when auto_convert is on, but will - use it to interpret these values (and convert copies of them to its chosen color model). - - When encoding, avoid setting this to an expensive color, such as a non-gray value - when the image is gray, or the compression will be worse since it will be forced to - write the PNG with a more expensive color mode (when auto_convert is on). - - The decoder does not use this background color to edit the color of pixels. This is a - completely optional metadata feature. - */ - unsigned background_defined; /*is a suggested background color given?*/ - unsigned background_r; /*red/gray/palette component of suggested background color*/ - unsigned background_g; /*green component of suggested background color*/ - unsigned background_b; /*blue component of suggested background color*/ - - /* - Non-international text chunks (tEXt and zTXt) - - The char** arrays each contain num strings. The actual messages are in - text_strings, while text_keys are keywords that give a short description what - the actual text represents, e.g. Title, Author, Description, or anything else. - - All the string fields below including strings, keys, names and language tags are null terminated. - The PNG specification uses null characters for the keys, names and tags, and forbids null - characters to appear in the main text which is why we can use null termination everywhere here. - - A keyword is minimum 1 character and maximum 79 characters long (plus the - additional null terminator). It's discouraged to use a single line length - longer than 79 characters for texts. - - Don't allocate these text buffers yourself. Use the init/cleanup functions - correctly and use lodepng_add_text and lodepng_clear_text. - - Standard text chunk keywords and strings are encoded using Latin-1. - */ - size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/ - char ** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/ - char ** text_strings; /*the actual text*/ - - /* - International text chunks (iTXt) - Similar to the non-international text chunks, but with additional strings - "langtags" and "transkeys", and the following text encodings are used: - keys: Latin-1, langtags: ASCII, transkeys and strings: UTF-8. - keys must be 1-79 characters (plus the additional null terminator), the other - strings are any length. - */ - size_t itext_num; /*the amount of international texts in this PNG*/ - char ** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/ - char ** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/ - char ** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/ - char ** itext_strings; /*the actual international text - UTF-8 string*/ - - /*time chunk (tIME)*/ - unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/ - LodePNGTime time; - - /*phys chunk (pHYs)*/ - unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/ - unsigned phys_x; /*pixels per unit in x direction*/ - unsigned phys_y; /*pixels per unit in y direction*/ - unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ - - /* - Color profile related chunks: gAMA, cHRM, sRGB, iCPP, sBIT - - LodePNG does not apply any color conversions on pixels in the encoder or decoder and does not interpret these color - profile values. It merely passes on the information. If you wish to use color profiles and convert colors, please - use these values with a color management library. - - See the PNG, ICC and sRGB specifications for more information about the meaning of these values. - */ - - /* gAMA chunk: optional, overridden by sRGB or iCCP if those are present. */ - unsigned gama_defined; /* Whether a gAMA chunk is present (0 = not present, 1 = present). */ - unsigned gama_gamma; /* Gamma exponent times 100000 */ - - /* cHRM chunk: optional, overridden by sRGB or iCCP if those are present. */ - unsigned chrm_defined; /* Whether a cHRM chunk is present (0 = not present, 1 = present). */ - unsigned chrm_white_x; /* White Point x times 100000 */ - unsigned chrm_white_y; /* White Point y times 100000 */ - unsigned chrm_red_x; /* Red x times 100000 */ - unsigned chrm_red_y; /* Red y times 100000 */ - unsigned chrm_green_x; /* Green x times 100000 */ - unsigned chrm_green_y; /* Green y times 100000 */ - unsigned chrm_blue_x; /* Blue x times 100000 */ - unsigned chrm_blue_y; /* Blue y times 100000 */ - - /* - sRGB chunk: optional. May not appear at the same time as iCCP. - If gAMA is also present gAMA must contain value 45455. - If cHRM is also present cHRM must contain respectively 31270,32900,64000,33000,30000,60000,15000,6000. - */ - unsigned srgb_defined; /* Whether an sRGB chunk is present (0 = not present, 1 = present). */ - unsigned srgb_intent; /* Rendering intent: 0=perceptual, 1=rel. colorimetric, 2=saturation, 3=abs. colorimetric */ - - /* - iCCP chunk: optional. May not appear at the same time as sRGB. - - LodePNG does not parse or use the ICC profile (except its color space header field for an edge case), a - separate library to handle the ICC data (not included in LodePNG) format is needed to use it for color - management and conversions. - - For encoding, if iCCP is present, gAMA and cHRM are recommended to be added as well with values that match the ICC - profile as closely as possible, if you wish to do this you should provide the correct values for gAMA and cHRM and - enable their '_defined' flags since LodePNG will not automatically compute them from the ICC profile. - - For encoding, the ICC profile is required by the PNG specification to be an "RGB" profile for non-gray - PNG color types and a "GRAY" profile for gray PNG color types. If you disable auto_convert, you must ensure - the ICC profile type matches your requested color type, else the encoder gives an error. If auto_convert is - enabled (the default), and the ICC profile is not a good match for the pixel data, this will result in an encoder - error if the pixel data has non-gray pixels for a GRAY profile, or a silent less-optimal compression of the pixel - data if the pixels could be encoded as grayscale but the ICC profile is RGB. - - To avoid this do not set an ICC profile in the image unless there is a good reason for it, and when doing so - make sure you compute it carefully to avoid the above problems. - */ - unsigned iccp_defined; /* Whether an iCCP chunk is present (0 = not present, 1 = present). */ - char * iccp_name; /* Null terminated string with profile name, 1-79 bytes */ - /* - The ICC profile in iccp_profile_size bytes. - Don't allocate this buffer yourself. Use the init/cleanup functions - correctly and use lodepng_set_icc and lodepng_clear_icc. - */ - unsigned char * iccp_profile; - unsigned iccp_profile_size; /* The size of iccp_profile in bytes */ - - /* - sBIT chunk: significant bits. Optional metadata, only set this if needed. - - If defined, these values give the bit depth of the original data. Since PNG only stores 1, 2, 4, 8 or 16-bit - per channel data, the significant bits value can be used to indicate the original encoded data has another - sample depth, such as 10 or 12. - - Encoders using this value, when storing the pixel data, should use the most significant bits - of the data to store the original bits, and use a good sample depth scaling method such as - "left bit replication" to fill in the least significant bits, rather than fill zeroes. - - Decoders using this value, if able to work with data that's e.g. 10-bit or 12-bit, should right - shift the data to go back to the original bit depth, but decoders are also allowed to ignore - sbit and work e.g. with the 8-bit or 16-bit data from the PNG directly, since thanks - to the encoder contract, the values encoded in PNG are in valid range for the PNG bit depth. - - For grayscale images, sbit_g and sbit_b are not used, and for images that don't use color - type RGBA or grayscale+alpha, sbit_a is not used (it's not used even for palette images with - translucent palette values, or images with color key). The values that are used must be - greater than zero and smaller than or equal to the PNG bit depth. - - The color type from the header in the PNG image defines these used and unused fields: if - decoding with a color mode conversion, such as always decoding to RGBA, this metadata still - only uses the color type of the original PNG, and may e.g. lack the alpha channel info - if the PNG was RGB. When encoding with auto_convert (as well as without), also always the - color model defined in info_png.color determines this. - - NOTE: enabling sbit can hurt compression, because the encoder can then not always use - auto_convert to choose a more optimal color mode for the data, because the PNG format has - strict requirements for the allowed sbit values in combination with color modes. - For example, setting these fields to 10-bit will force the encoder to keep using a 16-bit per channel - color mode, even if the pixel data would in fact fit in a more efficient 8-bit mode. - */ - unsigned sbit_defined; /*is significant bits given? if not, the values below are unused*/ - unsigned sbit_r; /*red or gray component of significant bits*/ - unsigned sbit_g; /*green component of significant bits*/ - unsigned sbit_b; /*blue component of significant bits*/ - unsigned sbit_a; /*alpha component of significant bits*/ - - /* End of color profile related chunks */ - - - /* - unknown chunks: chunks not known by LodePNG, passed on byte for byte. - - There are 3 buffers, one for each position in the PNG where unknown chunks can appear. - Each buffer contains all unknown chunks for that position consecutively. - The 3 positions are: - 0: between IHDR and PLTE, 1: between PLTE and IDAT, 2: between IDAT and IEND. - - For encoding, do not store critical chunks or known chunks that are enabled with a "_defined" flag - above in here, since the encoder will blindly follow this and could then encode an invalid PNG file - (such as one with two IHDR chunks or the disallowed combination of sRGB with iCCP). But do use - this if you wish to store an ancillary chunk that is not supported by LodePNG (such as sPLT or hIST), - or any non-standard PNG chunk. - - Do not allocate or traverse this data yourself. Use the chunk traversing functions declared - later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct. - */ - unsigned char * unknown_chunks_data[3]; - size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGInfo; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_info_init(LodePNGInfo * info); -void lodepng_info_cleanup(LodePNGInfo * info); -/*return value is error code (0 means no error)*/ -unsigned lodepng_info_copy(LodePNGInfo * dest, const LodePNGInfo * source); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -unsigned lodepng_add_text(LodePNGInfo * info, const char * key, const char * str); /*push back both texts at once*/ -void lodepng_clear_text(LodePNGInfo * info); /*use this to clear the texts again after you filled them in*/ - -unsigned lodepng_add_itext(LodePNGInfo * info, const char * key, const char * langtag, - const char * transkey, const char * str); /*push back the 4 texts of 1 chunk at once*/ -void lodepng_clear_itext(LodePNGInfo * info); /*use this to clear the itexts again after you filled them in*/ - -/*replaces if exists*/ -unsigned lodepng_set_icc(LodePNGInfo * info, const char * name, const unsigned char * profile, unsigned profile_size); -void lodepng_clear_icc(LodePNGInfo * info); /*use this to clear the texts again after you filled them in*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/* -Converts raw buffer from one color type to another color type, based on -LodePNGColorMode structs to describe the input and output color type. -See the reference manual at the end of this header file to see which color conversions are supported. -return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) -The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel -of the output color type (lodepng_get_bpp). -For < 8 bpp images, there should not be padding bits at the end of scanlines. -For 16-bit per channel colors, uses big endian format like PNG does. -Return value is LodePNG error code -*/ -unsigned lodepng_convert(unsigned char * out, const unsigned char * in, - const LodePNGColorMode * mode_out, const LodePNGColorMode * mode_in, - unsigned w, unsigned h); - -#ifdef LODEPNG_COMPILE_DECODER -/* -Settings for the decoder. This contains settings for the PNG and the Zlib -decoder, but not the Info settings from the Info structs. -*/ -typedef struct LodePNGDecoderSettings { - LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ - - /* Check LodePNGDecompressSettings for more ignorable errors such as ignore_adler32 */ - unsigned ignore_crc; /*ignore CRC checksums*/ - unsigned ignore_critical; /*ignore unknown critical chunks*/ - unsigned ignore_end; /*ignore issues at end of file if possible (missing IEND chunk, too large chunk, ...)*/ - /* TODO: make a system involving warnings with levels and a strict mode instead. Other potentially recoverable - errors: srgb rendering intent value, size of content of ancillary chunks, more than 79 characters for some - strings, placement/combination rules for ancillary chunks, crc of unknown chunks, allowed characters - in string keys, etc... */ - - unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/ - - /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/ - unsigned remember_unknown_chunks; - - /* maximum size for decompressed text chunks. If a text chunk's text is larger than this, an error is returned, - unless reading text chunks is disabled or this limit is set higher or disabled. Set to 0 to allow any size. - By default it is a value that prevents unreasonably large strings from hogging memory. */ - size_t max_text_size; - - /* maximum size for compressed ICC chunks. If the ICC profile is larger than this, an error will be returned. Set to - 0 to allow any size. By default this is a value that prevents ICC profiles that would be much larger than any - legitimate profile could be to hog memory. */ - size_t max_icc_size; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGDecoderSettings; - -void lodepng_decoder_settings_init(LodePNGDecoderSettings * settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/ -typedef enum LodePNGFilterStrategy { - /*every filter at zero*/ - LFS_ZERO = 0, - /*every filter at 1, 2, 3 or 4 (paeth), unlike LFS_ZERO not a good choice, but for testing*/ - LFS_ONE = 1, - LFS_TWO = 2, - LFS_THREE = 3, - LFS_FOUR = 4, - /*Use filter that gives minimum sum, as described in the official PNG filter heuristic.*/ - LFS_MINSUM, - /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending - on the image, this is better or worse than minsum.*/ - LFS_ENTROPY, - /* - Brute-force-search PNG filters by compressing each filter for each scanline. - Experimental, very slow, and only rarely gives better compression than MINSUM. - */ - LFS_BRUTE_FORCE, - /*use predefined_filters buffer: you specify the filter type for each scanline*/ - LFS_PREDEFINED -} LodePNGFilterStrategy; - -/*Gives characteristics about the integer RGBA colors of the image (count, alpha channel usage, bit depth, ...), -which helps decide which color model to use for encoding. -Used internally by default if "auto_convert" is enabled. Public because it's useful for custom algorithms.*/ -typedef struct LodePNGColorStats { - unsigned colored; /*not grayscale*/ - unsigned key; /*image is not opaque and color key is possible instead of full alpha*/ - unsigned short key_r; /*key values, always as 16-bit, in 8-bit case the byte is duplicated, e.g. 65535 means 255*/ - unsigned short key_g; - unsigned short key_b; - unsigned alpha; /*image is not opaque and alpha channel or alpha palette required*/ - unsigned numcolors; /*amount of colors, up to 257. Not valid if bits == 16 or allow_palette is disabled.*/ - unsigned char - palette[1024]; /*Remembers up to the first 256 RGBA colors, in no particular order, only valid when numcolors is valid*/ - unsigned bits; /*bits per channel (not for palette). 1,2 or 4 for grayscale only. 16 if 16-bit per channel required.*/ - size_t numpixels; - - /*user settings for computing/using the stats*/ - unsigned allow_palette; /*default 1. if 0, disallow choosing palette colortype in auto_choose_color, and don't count numcolors*/ - unsigned allow_greyscale; /*default 1. if 0, choose RGB or RGBA even if the image only has gray colors*/ -} LodePNGColorStats; - -void lodepng_color_stats_init(LodePNGColorStats * stats); - -/*Get a LodePNGColorStats of the image. The stats must already have been inited. -Returns error code (e.g. alloc fail) or 0 if ok.*/ -unsigned lodepng_compute_color_stats(LodePNGColorStats * stats, - const unsigned char * image, unsigned w, unsigned h, - const LodePNGColorMode * mode_in); - -/*Settings for the encoder.*/ -typedef struct LodePNGEncoderSettings { - LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ - - unsigned auto_convert; /*automatically choose output PNG color type. Default: true*/ - - /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than - 8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to - completely follow the official PNG heuristic, filter_palette_zero must be true and - filter_strategy must be LFS_MINSUM*/ - unsigned filter_palette_zero; - /*Which filter strategy to use when not using zeroes due to filter_palette_zero. - Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/ - LodePNGFilterStrategy filter_strategy; - /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with - the same length as the amount of scanlines in the image, and each value must <= 5. You - have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero - must be set to 0 to ensure this is also used on palette or low bitdepth images.*/ - const unsigned char * predefined_filters; - - /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). - If colortype is 3, PLTE is always created. If color type is explicitely set - to a grayscale type (1 or 4), this is not done and is ignored. If enabling this, - a palette must be present in the info_png. - NOTE: enabling this may worsen compression if auto_convert is used to choose - optimal color mode, because it cannot use grayscale color modes in this case*/ - unsigned force_palette; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*add LodePNG identifier and version as a text chunk, for debugging*/ - unsigned add_id; - /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/ - unsigned text_compression; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGEncoderSettings; - -void lodepng_encoder_settings_init(LodePNGEncoderSettings * settings); -#endif /*LODEPNG_COMPILE_ENCODER*/ - - -#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) -/*The settings, state and information for extended encoding and decoding.*/ -typedef struct LodePNGState { -#ifdef LODEPNG_COMPILE_DECODER - LodePNGDecoderSettings decoder; /*the decoding settings*/ -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER - LodePNGEncoderSettings encoder; /*the encoding settings*/ -#endif /*LODEPNG_COMPILE_ENCODER*/ - LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ - LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ - unsigned error; -} LodePNGState; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_state_init(LodePNGState * state); -void lodepng_state_cleanup(LodePNGState * state); -void lodepng_state_copy(LodePNGState * dest, const LodePNGState * source); -#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ - -#ifdef LODEPNG_COMPILE_DECODER -/* -Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and -getting much more information about the PNG image and color mode. -*/ -unsigned lodepng_decode(unsigned char ** out, unsigned * w, unsigned * h, - LodePNGState * state, - const unsigned char * in, size_t insize); - -/* -Read the PNG header, but not the actual data. This returns only the information -that is in the IHDR chunk of the PNG, such as width, height and color type. The -information is placed in the info_png field of the LodePNGState. -*/ -unsigned lodepng_inspect(unsigned * w, unsigned * h, - LodePNGState * state, - const unsigned char * in, size_t insize); -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* -Reads one metadata chunk (other than IHDR, which is handled by lodepng_inspect) -of the PNG file and outputs what it read in the state. Returns error code on failure. -Use lodepng_inspect first with a new state, then e.g. lodepng_chunk_find_const -to find the desired chunk type, and if non null use lodepng_inspect_chunk (with -chunk_pointer - start_of_file as pos). -Supports most metadata chunks from the PNG standard (gAMA, bKGD, tEXt, ...). -Ignores unsupported, unknown, non-metadata or IHDR chunks (without error). -Requirements: &in[pos] must point to start of a chunk, must use regular -lodepng_inspect first since format of most other chunks depends on IHDR, and if -there is a PLTE chunk, that one must be inspected before tRNS or bKGD. -*/ -unsigned lodepng_inspect_chunk(LodePNGState * state, size_t pos, - const unsigned char * in, size_t insize); - -#ifdef LODEPNG_COMPILE_ENCODER -/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/ -unsigned lodepng_encode(unsigned char ** out, size_t * outsize, - const unsigned char * image, unsigned w, unsigned h, - LodePNGState * state); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/* -The lodepng_chunk functions are normally not needed, except to traverse the -unknown chunks stored in the LodePNGInfo struct, or add new ones to it. -It also allows traversing the chunks of an encoded PNG file yourself. - -The chunk pointer always points to the beginning of the chunk itself, that is -the first byte of the 4 length bytes. - -In the PNG file format, chunks have the following format: --4 bytes length: length of the data of the chunk in bytes (chunk itself is 12 bytes longer) --4 bytes chunk type (ASCII a-z,A-Z only, see below) --length bytes of data (may be 0 bytes if length was 0) --4 bytes of CRC, computed on chunk name + data - -The first chunk starts at the 8th byte of the PNG file, the entire rest of the file -exists out of concatenated chunks with the above format. - -PNG standard chunk ASCII naming conventions: --First byte: uppercase = critical, lowercase = ancillary --Second byte: uppercase = public, lowercase = private --Third byte: must be uppercase --Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy -*/ - -/* -Gets the length of the data of the chunk. Total chunk length has 12 bytes more. -There must be at least 4 bytes to read from. If the result value is too large, -it may be corrupt data. -*/ -unsigned lodepng_chunk_length(const unsigned char * chunk); - -/*puts the 4-byte type in null terminated string*/ -void lodepng_chunk_type(char type[5], const unsigned char * chunk); - -/*check if the type is the given type*/ -unsigned char lodepng_chunk_type_equals(const unsigned char * chunk, const char * type); - -/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/ -unsigned char lodepng_chunk_ancillary(const unsigned char * chunk); - -/*0: public, 1: private (see PNG standard)*/ -unsigned char lodepng_chunk_private(const unsigned char * chunk); - -/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/ -unsigned char lodepng_chunk_safetocopy(const unsigned char * chunk); - -/*get pointer to the data of the chunk, where the input points to the header of the chunk*/ -unsigned char * lodepng_chunk_data(unsigned char * chunk); -const unsigned char * lodepng_chunk_data_const(const unsigned char * chunk); - -/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/ -unsigned lodepng_chunk_check_crc(const unsigned char * chunk); - -/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/ -void lodepng_chunk_generate_crc(unsigned char * chunk); - -/* -Iterate to next chunks, allows iterating through all chunks of the PNG file. -Input must be at the beginning of a chunk (result of a previous lodepng_chunk_next call, -or the 8th byte of a PNG file which always has the first chunk), or alternatively may -point to the first byte of the PNG file (which is not a chunk but the magic header, the -function will then skip over it and return the first real chunk). -Will output pointer to the start of the next chunk, or at or beyond end of the file if there -is no more chunk after this or possibly if the chunk is corrupt. -Start this process at the 8th byte of the PNG file. -In a non-corrupt PNG file, the last chunk should have name "IEND". -*/ -unsigned char * lodepng_chunk_next(unsigned char * chunk, unsigned char * end); -const unsigned char * lodepng_chunk_next_const(const unsigned char * chunk, const unsigned char * end); - -/*Finds the first chunk with the given type in the range [chunk, end), or returns NULL if not found.*/ -unsigned char * lodepng_chunk_find(unsigned char * chunk, unsigned char * end, const char type[5]); -const unsigned char * lodepng_chunk_find_const(const unsigned char * chunk, const unsigned char * end, - const char type[5]); - -/* -Appends chunk to the data in out. The given chunk should already have its chunk header. -The out variable and outsize are updated to reflect the new reallocated buffer. -Returns error code (0 if it went ok) -*/ -unsigned lodepng_chunk_append(unsigned char ** out, size_t * outsize, const unsigned char * chunk); - -/* -Appends new chunk to out. The chunk to append is given by giving its length, type -and data separately. The type is a 4-letter string. -The out variable and outsize are updated to reflect the new reallocated buffer. -Returne error code (0 if it went ok) -*/ -unsigned lodepng_chunk_create(unsigned char ** out, size_t * outsize, size_t length, - const char * type, const unsigned char * data); - - -/*Calculate CRC32 of buffer*/ -unsigned lodepng_crc32(const unsigned char * buf, size_t len); -#endif /*LODEPNG_COMPILE_PNG*/ - - -#ifdef LODEPNG_COMPILE_ZLIB -/* -This zlib part can be used independently to zlib compress and decompress a -buffer. It cannot be used to create gzip files however, and it only supports the -part of zlib that is required for PNG, it does not support dictionaries. -*/ - -#ifdef LODEPNG_COMPILE_DECODER -/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/ -unsigned lodepng_inflate(unsigned char ** out, size_t * outsize, - const unsigned char * in, size_t insize, - const LodePNGDecompressSettings * settings); - -/* -Decompresses Zlib data. Reallocates the out buffer and appends the data. The -data must be according to the zlib specification. -Either, *out must be NULL and *outsize must be 0, or, *out must be a valid -buffer and *outsize its size in bytes. out must be freed by user after usage. -*/ -unsigned lodepng_zlib_decompress(unsigned char ** out, size_t * outsize, - const unsigned char * in, size_t insize, - const LodePNGDecompressSettings * settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Compresses data with Zlib. Reallocates the out buffer and appends the data. -Zlib adds a small header and trailer around the deflate data. -The data is output in the format of the zlib specification. -Either, *out must be NULL and *outsize must be 0, or, *out must be a valid -buffer and *outsize its size in bytes. out must be freed by user after usage. -*/ -unsigned lodepng_zlib_compress(unsigned char ** out, size_t * outsize, - const unsigned char * in, size_t insize, - const LodePNGCompressSettings * settings); - -/* -Find length-limited Huffman code for given frequencies. This function is in the -public interface only for tests, it's used internally by lodepng_deflate. -*/ -unsigned lodepng_huffman_code_lengths(unsigned * lengths, const unsigned * frequencies, - size_t numcodes, unsigned maxbitlen); - -/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/ -unsigned lodepng_deflate(unsigned char ** out, size_t * outsize, - const unsigned char * in, size_t insize, - const LodePNGCompressSettings * settings); - -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_ZLIB*/ - -#ifdef LODEPNG_COMPILE_DISK - /* - Load a file from disk into buffer. The function allocates the out buffer, and - after usage you should free it. - out: output parameter, contains pointer to loaded buffer. - outsize: output parameter, size of the allocated out buffer - filename: the path to the file to load - return value: error code (0 means ok) - - NOTE: Wide-character filenames are not supported, you can use an external method - to handle such files and decode in-memory. - */ - unsigned lodepng_load_file(unsigned char ** out, size_t * outsize, const char * filename); - - /* - Save a file from buffer to disk. Warning, if it exists, this function overwrites - the file without warning! - buffer: the buffer to write - buffersize: size of the buffer to write - filename: the path to the file to save to - return value: error code (0 means ok) - - NOTE: Wide-character filenames are not supported, you can use an external method - to handle such files and encode in-memory - */ - unsigned lodepng_save_file(const unsigned char * buffer, size_t buffersize, const char * filename); -#endif /*LODEPNG_COMPILE_DISK*/ - -#ifdef LODEPNG_COMPILE_CPP -/* The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. */ -namespace lodepng -{ -#ifdef LODEPNG_COMPILE_PNG -class State : public LodePNGState -{ - public: - State(); - State(const State & other); - ~State(); - State & operator=(const State & other); -}; - -#ifdef LODEPNG_COMPILE_DECODER -/* Same as other lodepng::decode, but using a State for more settings and information. */ -unsigned decode(std::vector & out, unsigned & w, unsigned & h, - State & state, - const unsigned char * in, size_t insize); -unsigned decode(std::vector & out, unsigned & w, unsigned & h, - State & state, - const std::vector & in); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/* Same as other lodepng::encode, but using a State for more settings and information. */ -unsigned encode(std::vector & out, - const unsigned char * in, unsigned w, unsigned h, - State & state); -unsigned encode(std::vector & out, - const std::vector & in, unsigned w, unsigned h, - State & state); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DISK - /* - Load a file from disk into an std::vector. - return value: error code (0 means ok) - - NOTE: Wide-character filenames are not supported, you can use an external method - to handle such files and decode in-memory - */ - unsigned load_file(std::vector & buffer, const std::string & filename); - - /* - Save the binary data in an std::vector to a file on disk. The file is overwritten - without warning. - - NOTE: Wide-character filenames are not supported, you can use an external method - to handle such files and encode in-memory - */ - unsigned save_file(const std::vector & buffer, const std::string & filename); -#endif /* LODEPNG_COMPILE_DISK */ -#endif /* LODEPNG_COMPILE_PNG */ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_DECODER -/* Zlib-decompress an unsigned char buffer */ -unsigned decompress(std::vector & out, const unsigned char * in, size_t insize, - const LodePNGDecompressSettings & settings = lodepng_default_decompress_settings); - -/* Zlib-decompress an std::vector */ -unsigned decompress(std::vector & out, const std::vector & in, - const LodePNGDecompressSettings & settings = lodepng_default_decompress_settings); -#endif /* LODEPNG_COMPILE_DECODER */ - -#ifdef LODEPNG_COMPILE_ENCODER -/* Zlib-compress an unsigned char buffer */ -unsigned compress(std::vector & out, const unsigned char * in, size_t insize, - const LodePNGCompressSettings & settings = lodepng_default_compress_settings); - -/* Zlib-compress an std::vector */ -unsigned compress(std::vector & out, const std::vector & in, - const LodePNGCompressSettings & settings = lodepng_default_compress_settings); -#endif /* LODEPNG_COMPILE_ENCODER */ -#endif /* LODEPNG_COMPILE_ZLIB */ -} /* namespace lodepng */ -#endif /*LODEPNG_COMPILE_CPP*/ - -/* -TODO: -[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often -[.] check compatibility with various compilers - done but needs to be redone for every newer version -[X] converting color to 16-bit per channel types -[X] support color profile chunk types (but never let them touch RGB values by default) -[ ] support all public PNG chunk types (almost done except sPLT and hIST) -[ ] make sure encoder generates no chunks with size > (2^31)-1 -[ ] partial decoding (stream processing) -[X] let the "isFullyOpaque" function check color keys and transparent palettes too -[X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" -[ ] allow treating some errors like warnings, when image is recoverable (e.g. 69, 57, 58) -[ ] make warnings like: oob palette, checksum fail, data after iend, wrong/unknown crit chunk, no null terminator in text, ... -[ ] error messages with line numbers (and version) -[ ] errors in state instead of as return code? -[ ] new errors/warnings like suspiciously big decompressed ztxt or iccp chunk -[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes -[ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ... -[ ] allow user to give data (void*) to custom allocator -[X] provide alternatives for C library functions not present on some platforms (memcpy, ...) -*/ - -#endif /*LV_USE_LODEPNG*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LODEPNG_H inclusion guard*/ - -/* -LodePNG Documentation ---------------------- - -0. table of contents --------------------- - - 1. about - 1.1. supported features - 1.2. features not supported - 2. C and C++ version - 3. security - 4. decoding - 5. encoding - 6. color conversions - 6.1. PNG color types - 6.2. color conversions - 6.3. padding bits - 6.4. A note about 16-bits per channel and endianness - 7. error values - 8. chunks and PNG editing - 9. compiler support - 10. examples - 10.1. decoder C++ example - 10.2. decoder C example - 11. state settings reference - 12. changes - 13. contact information - - -1. about --------- - -PNG is a file format to store raster images losslessly with good compression, -supporting different color types and alpha channel. - -LodePNG is a PNG codec according to the Portable Network Graphics (PNG) -Specification (Second Edition) - W3C Recommendation 10 November 2003. - -The specifications used are: - -*) Portable Network Graphics (PNG) Specification (Second Edition): - http://www.w3.org/TR/2003/REC-PNG-20031110 -*) RFC 1950 ZLIB Compressed Data Format version 3.3: - http://www.gzip.org/zlib/rfc-zlib.html -*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3: - http://www.gzip.org/zlib/rfc-deflate.html - -The most recent version of LodePNG can currently be found at -http://lodev.org/lodepng/ - -LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds -extra functionality. - -LodePNG exists out of two files: --lodepng.h: the header file for both C and C++ --lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage - -If you want to start using LodePNG right away without reading this doc, get the -examples from the LodePNG website to see how to use it in code, or check the -smaller examples in chapter 13 here. - -LodePNG is simple but only supports the basic requirements. To achieve -simplicity, the following design choices were made: There are no dependencies -on any external library. There are functions to decode and encode a PNG with -a single function call, and extended versions of these functions taking a -LodePNGState struct allowing to specify or get more information. By default -the colors of the raw image are always RGB or RGBA, no matter what color type -the PNG file uses. To read and write files, there are simple functions to -convert the files to/from buffers in memory. - -This all makes LodePNG suitable for loading textures in games, demos and small -programs, ... It's less suitable for full fledged image editors, loading PNGs -over network (it requires all the image data to be available before decoding can -begin), life-critical systems, ... - -1.1. supported features ------------------------ - -The following features are supported by the decoder: - -*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, - or the same color type as the PNG -*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image -*) Adam7 interlace and deinterlace for any color type -*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk -*) support for alpha channels, including RGBA color model, translucent palettes and color keying -*) zlib decompression (inflate) -*) zlib compression (deflate) -*) CRC32 and ADLER32 checksums -*) colorimetric color profile conversions: currently experimentally available in lodepng_util.cpp only, - plus alternatively ability to pass on chroma/gamma/ICC profile information to other color management system. -*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks. -*) the following chunks are supported by both encoder and decoder: - IHDR: header information - PLTE: color palette - IDAT: pixel data - IEND: the final chunk - tRNS: transparency for palettized images - tEXt: textual information - zTXt: compressed textual information - iTXt: international textual information - bKGD: suggested background color - pHYs: physical dimensions - tIME: modification time - cHRM: RGB chromaticities - gAMA: RGB gamma correction - iCCP: ICC color profile - sRGB: rendering intent - sBIT: significant bits - -1.2. features not supported ---------------------------- - -The following features are not (yet) supported: - -*) some features needed to make a conformant PNG-Editor might be still missing. -*) partial loading/stream processing. All data must be available and is processed in one call. -*) The hIST and sPLT public chunks are not (yet) supported but treated as unknown chunks - - -2. C and C++ version --------------------- - -The C version uses buffers allocated with alloc that you need to free() -yourself. You need to use init and cleanup functions for each struct whenever -using a struct from the C version to avoid exploits and memory leaks. - -The C++ version has extra functions with std::vectors in the interface and the -lodepng::State class which is a LodePNGState with constructor and destructor. - -These files work without modification for both C and C++ compilers because all -the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers -ignore it, and the C code is made to compile both with strict ISO C90 and C++. - -To use the C++ version, you need to rename the source file to lodepng.cpp -(instead of lodepng.c), and compile it with a C++ compiler. - -To use the C version, you need to rename the source file to lodepng.c (instead -of lodepng.cpp), and compile it with a C compiler. - - -3. Security ------------ - -Even if carefully designed, it's always possible that LodePNG contains possible -exploits. If you discover one, please let me know, and it will be fixed. - -When using LodePNG, care has to be taken with the C version of LodePNG, as well -as the C-style structs when working with C++. The following conventions are used -for all C-style structs: - --if a struct has a corresponding init function, always call the init function when making a new one --if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks --if a struct has a corresponding copy function, use the copy function instead of "=". - The destination must also be inited already. - - -4. Decoding ------------ - -Decoding converts a PNG compressed image to a raw pixel buffer. - -Most documentation on using the decoder is at its declarations in the header -above. For C, simple decoding can be done with functions such as -lodepng_decode32, and more advanced decoding can be done with the struct -LodePNGState and lodepng_decode. For C++, all decoding can be done with the -various lodepng::decode functions, and lodepng::State can be used for advanced -features. - -When using the LodePNGState, it uses the following fields for decoding: -*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here -*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get -*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use - -LodePNGInfo info_png --------------------- - -After decoding, this contains extra information of the PNG image, except the actual -pixels, width and height because these are already gotten directly from the decoder -functions. - -It contains for example the original color type of the PNG image, text comments, -suggested background color, etc... More details about the LodePNGInfo struct are -at its declaration documentation. - -LodePNGColorMode info_raw -------------------------- - -When decoding, here you can specify which color type you want -the resulting raw image to be. If this is different from the colortype of the -PNG, then the decoder will automatically convert the result. This conversion -always works, except if you want it to convert a color PNG to grayscale or to -a palette with missing colors. - -By default, 32-bit color is used for the result. - -LodePNGDecoderSettings decoder ------------------------------- - -The settings can be used to ignore the errors created by invalid CRC and Adler32 -chunks, and to disable the decoding of tEXt chunks. - -There's also a setting color_convert, true by default. If false, no conversion -is done, the resulting data will be as it was in the PNG (after decompression) -and you'll have to puzzle the colors of the pixels together yourself using the -color type information in the LodePNGInfo. - - -5. Encoding ------------ - -Encoding converts a raw pixel buffer to a PNG compressed image. - -Most documentation on using the encoder is at its declarations in the header -above. For C, simple encoding can be done with functions such as -lodepng_encode32, and more advanced decoding can be done with the struct -LodePNGState and lodepng_encode. For C++, all encoding can be done with the -various lodepng::encode functions, and lodepng::State can be used for advanced -features. - -Like the decoder, the encoder can also give errors. However it gives less errors -since the encoder input is trusted, the decoder input (a PNG image that could -be forged by anyone) is not trusted. - -When using the LodePNGState, it uses the following fields for encoding: -*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be. -*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has -*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use - -LodePNGInfo info_png --------------------- - -When encoding, you use this the opposite way as when decoding: for encoding, -you fill in the values you want the PNG to have before encoding. By default it's -not needed to specify a color type for the PNG since it's automatically chosen, -but it's possible to choose it yourself given the right settings. - -The encoder will not always exactly match the LodePNGInfo struct you give, -it tries as close as possible. Some things are ignored by the encoder. The -encoder uses, for example, the following settings from it when applicable: -colortype and bitdepth, text chunks, time chunk, the color key, the palette, the -background color, the interlace method, unknown chunks, ... - -When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk. -If the palette contains any colors for which the alpha channel is not 255 (so -there are translucent colors in the palette), it'll add a tRNS chunk. - -LodePNGColorMode info_raw -------------------------- - -You specify the color type of the raw image that you give to the input here, -including a possible transparent color key and palette you happen to be using in -your raw image data. - -By default, 32-bit color is assumed, meaning your input has to be in RGBA -format with 4 bytes (unsigned chars) per pixel. - -LodePNGEncoderSettings encoder ------------------------------- - -The following settings are supported (some are in sub-structs): -*) auto_convert: when this option is enabled, the encoder will -automatically choose the smallest possible color mode (including color key) that -can encode the colors of all pixels without information loss. -*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, - 2 = dynamic huffman tree (best compression). Should be 2 for proper - compression. -*) use_lz77: whether or not to use LZ77 for compressed block types. Should be - true for proper compression. -*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value - 2048 by default, but can be set to 32768 for better, but slow, compression. -*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE - chunk if force_palette is true. This can used as suggested palette to convert - to by viewers that don't support more than 256 colors (if those still exist) -*) add_id: add text chunk "Encoder: LodePNG " to the image. -*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks. - zTXt chunks use zlib compression on the text. This gives a smaller result on - large texts but a larger result on small texts (such as a single program name). - It's all tEXt or all zTXt though, there's no separate setting per text yet. - - -6. color conversions --------------------- - -An important thing to note about LodePNG, is that the color type of the PNG, and -the color type of the raw image, are completely independent. By default, when -you decode a PNG, you get the result as a raw image in the color type you want, -no matter whether the PNG was encoded with a palette, grayscale or RGBA color. -And if you encode an image, by default LodePNG will automatically choose the PNG -color type that gives good compression based on the values of colors and amount -of colors in the image. It can be configured to let you control it instead as -well, though. - -To be able to do this, LodePNG does conversions from one color mode to another. -It can convert from almost any color type to any other color type, except the -following conversions: RGB to grayscale is not supported, and converting to a -palette when the palette doesn't have a required color is not supported. This is -not supported on purpose: this is information loss which requires a color -reduction algorithm that is beyond the scope of a PNG encoder (yes, RGB to gray -is easy, but there are multiple ways if you want to give some channels more -weight). - -By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB -color, no matter what color type the PNG has. And by default when encoding, -LodePNG automatically picks the best color model for the output PNG, and expects -the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control -the color format of the images yourself, you can skip this chapter. - -6.1. PNG color types --------------------- - -A PNG image can have many color types, ranging from 1-bit color to 64-bit color, -as well as palettized color modes. After the zlib decompression and unfiltering -in the PNG image is done, the raw pixel data will have that color type and thus -a certain amount of bits per pixel. If you want the output raw image after -decoding to have another color type, a conversion is done by LodePNG. - -The PNG specification gives the following color types: - -0: grayscale, bit depths 1, 2, 4, 8, 16 -2: RGB, bit depths 8 and 16 -3: palette, bit depths 1, 2, 4 and 8 -4: grayscale with alpha, bit depths 8 and 16 -6: RGBA, bit depths 8 and 16 - -Bit depth is the amount of bits per pixel per color channel. So the total amount -of bits per pixel is: amount of channels * bitdepth. - -6.2. color conversions ----------------------- - -As explained in the sections about the encoder and decoder, you can specify -color types and bit depths in info_png and info_raw to change the default -behaviour. - -If, when decoding, you want the raw image to be something else than the default, -you need to set the color type and bit depth you want in the LodePNGColorMode, -or the parameters colortype and bitdepth of the simple decoding function. - -If, when encoding, you use another color type than the default in the raw input -image, you need to specify its color type and bit depth in the LodePNGColorMode -of the raw image, or use the parameters colortype and bitdepth of the simple -encoding function. - -If, when encoding, you don't want LodePNG to choose the output PNG color type -but control it yourself, you need to set auto_convert in the encoder settings -to false, and specify the color type you want in the LodePNGInfo of the -encoder (including palette: it can generate a palette if auto_convert is true, -otherwise not). - -If the input and output color type differ (whether user chosen or auto chosen), -LodePNG will do a color conversion, which follows the rules below, and may -sometimes result in an error. - -To avoid some confusion: --the decoder converts from PNG to raw image --the encoder converts from raw image to PNG --the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image --the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG --when encoding, the color type in LodePNGInfo is ignored if auto_convert - is enabled, it is automatically generated instead --when decoding, the color type in LodePNGInfo is set by the decoder to that of the original - PNG image, but it can be ignored since the raw image has the color type you requested instead --if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion - between the color types is done if the color types are supported. If it is not - supported, an error is returned. If the types are the same, no conversion is done. --even though some conversions aren't supported, LodePNG supports loading PNGs from any - colortype and saving PNGs to any colortype, sometimes it just requires preparing - the raw image correctly before encoding. --both encoder and decoder use the same color converter. - -The function lodepng_convert does the color conversion. It is available in the -interface but normally isn't needed since the encoder and decoder already call -it. - -Non supported color conversions: --color to grayscale when non-gray pixels are present: no error is thrown, but -the result will look ugly because only the red channel is taken (it assumes all -three channels are the same in this case so ignores green and blue). The reason -no error is given is to allow converting from three-channel grayscale images to -one-channel even if there are numerical imprecisions. --anything to palette when the palette does not have an exact match for a from-color -in it: in this case an error is thrown - -Supported color conversions: --anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA --any gray or gray+alpha, to gray or gray+alpha --anything to a palette, as long as the palette has the requested colors in it --removing alpha channel --higher to smaller bitdepth, and vice versa - -If you want no color conversion to be done (e.g. for speed or control): --In the encoder, you can make it save a PNG with any color type by giving the -raw color mode and LodePNGInfo the same color mode, and setting auto_convert to -false. --In the decoder, you can make it store the pixel data in the same color type -as the PNG has, by setting the color_convert setting to false. Settings in -info_raw are then ignored. - -6.3. padding bits ------------------ - -In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines -have a bit amount that isn't a multiple of 8, then padding bits are used so that each -scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output. -The raw input image you give to the encoder, and the raw output image you get from the decoder -will NOT have these padding bits, e.g. in the case of a 1-bit image with a width -of 7 pixels, the first pixel of the second scanline will the 8th bit of the first byte, -not the first bit of a new byte. - -6.4. A note about 16-bits per channel and endianness ----------------------------------------------------- - -LodePNG uses unsigned char arrays for 16-bit per channel colors too, just like -for any other color format. The 16-bit values are stored in big endian (most -significant byte first) in these arrays. This is the opposite order of the -little endian used by x86 CPU's. - -LodePNG always uses big endian because the PNG file format does so internally. -Conversions to other formats than PNG uses internally are not supported by -LodePNG on purpose, there are myriads of formats, including endianness of 16-bit -colors, the order in which you store R, G, B and A, and so on. Supporting and -converting to/from all that is outside the scope of LodePNG. - -This may mean that, depending on your use case, you may want to convert the big -endian output of LodePNG to little endian with a for loop. This is certainly not -always needed, many applications and libraries support big endian 16-bit colors -anyway, but it means you cannot simply cast the unsigned char* buffer to an -unsigned short* buffer on x86 CPUs. - - -7. error values ---------------- - -All functions in LodePNG that return an error code, return 0 if everything went -OK, or a non-zero code if there was an error. - -The meaning of the LodePNG error values can be retrieved with the function -lodepng_error_text: given the numerical error code, it returns a description -of the error in English as a string. - -Check the implementation of lodepng_error_text to see the meaning of each code. - -It is not recommended to use the numerical values to programmatically make -different decisions based on error types as the numbers are not guaranteed to -stay backwards compatible. They are for human consumption only. Programmatically -only 0 or non-0 matter. - - -8. chunks and PNG editing -------------------------- - -If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG -editor that should follow the rules about handling of unknown chunks, or if your -program is able to read other types of chunks than the ones handled by LodePNG, -then that's possible with the chunk functions of LodePNG. - -A PNG chunk has the following layout: - -4 bytes length -4 bytes type name -length bytes data -4 bytes CRC - -8.1. iterating through chunks ------------------------------ - -If you have a buffer containing the PNG image data, then the first chunk (the -IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the -signature of the PNG and are not part of a chunk. But if you start at byte 8 -then you have a chunk, and can check the following things of it. - -NOTE: none of these functions check for memory buffer boundaries. To avoid -exploits, always make sure the buffer contains all the data of the chunks. -When using lodepng_chunk_next, make sure the returned value is within the -allocated memory. - -unsigned lodepng_chunk_length(const unsigned char* chunk): - -Get the length of the chunk's data. The total chunk length is this length + 12. - -void lodepng_chunk_type(char type[5], const unsigned char* chunk): -unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type): - -Get the type of the chunk or compare if it's a certain type - -unsigned char lodepng_chunk_critical(const unsigned char* chunk): -unsigned char lodepng_chunk_private(const unsigned char* chunk): -unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk): - -Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are). -Check if the chunk is private (public chunks are part of the standard, private ones not). -Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical -chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your -program doesn't handle that type of unknown chunk. - -unsigned char* lodepng_chunk_data(unsigned char* chunk): -const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk): - -Get a pointer to the start of the data of the chunk. - -unsigned lodepng_chunk_check_crc(const unsigned char* chunk): -void lodepng_chunk_generate_crc(unsigned char* chunk): - -Check if the crc is correct or generate a correct one. - -unsigned char* lodepng_chunk_next(unsigned char* chunk): -const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk): - -Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these -functions do no boundary checking of the allocated data whatsoever, so make sure there is enough -data available in the buffer to be able to go to the next chunk. - -unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk): -unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length, - const char* type, const unsigned char* data): - -These functions are used to create new chunks that are appended to the data in *out that has -length *outsize. The append function appends an existing chunk to the new data. The create -function creates a new chunk with the given parameters and appends it. Type is the 4-letter -name of the chunk. - -8.2. chunks in info_png ------------------------ - -The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3 -buffers (each with size) to contain 3 types of unknown chunks: -the ones that come before the PLTE chunk, the ones that come between the PLTE -and the IDAT chunks, and the ones that come after the IDAT chunks. -It's necessary to make the distinction between these 3 cases because the PNG -standard forces to keep the ordering of unknown chunks compared to the critical -chunks, but does not force any other ordering rules. - -info_png.unknown_chunks_data[0] is the chunks before PLTE -info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT -info_png.unknown_chunks_data[2] is the chunks after IDAT - -The chunks in these 3 buffers can be iterated through and read by using the same -way described in the previous subchapter. - -When using the decoder to decode a PNG, you can make it store all unknown chunks -if you set the option settings.remember_unknown_chunks to 1. By default, this -option is off (0). - -The encoder will always encode unknown chunks that are stored in the info_png. -If you need it to add a particular chunk that isn't known by LodePNG, you can -use lodepng_chunk_append or lodepng_chunk_create to the chunk data in -info_png.unknown_chunks_data[x]. - -Chunks that are known by LodePNG should not be added in that way. E.g. to make -LodePNG add a bKGD chunk, set background_defined to true and add the correct -parameters there instead. - - -9. compiler support -------------------- - -No libraries other than the current standard C library are needed to compile -LodePNG. For the C++ version, only the standard C++ library is needed on top. -Add the files lodepng.c(pp) and lodepng.h to your project, include -lodepng.h where needed, and your program can read/write PNG files. - -It is compatible with C90 and up, and C++03 and up. - -If performance is important, use optimization when compiling! For both the -encoder and decoder, this makes a large difference. - -Make sure that LodePNG is compiled with the same compiler of the same version -and with the same settings as the rest of the program, or the interfaces with -std::vectors and std::strings in C++ can be incompatible. - -CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets. - -*) gcc and g++ - -LodePNG is developed in gcc so this compiler is natively supported. It gives no -warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ -version 4.7.1 on Linux, 32-bit and 64-bit. - -*) Clang - -Fully supported and warning-free. - -*) Mingw - -The Mingw compiler (a port of gcc for Windows) should be fully supported by -LodePNG. - -*) Visual Studio and Visual C++ Express Edition - -LodePNG should be warning-free with warning level W4. Two warnings were disabled -with pragmas though: warning 4244 about implicit conversions, and warning 4996 -where it wants to use a non-standard function fopen_s instead of the standard C -fopen. - -Visual Studio may want "stdafx.h" files to be included in each source file and -give an error "unexpected end of file while looking for precompiled header". -This is not standard C++ and will not be added to the stock LodePNG. You can -disable it for lodepng.cpp only by right clicking it, Properties, C/C++, -Precompiled Headers, and set it to Not Using Precompiled Headers there. - -NOTE: Modern versions of VS should be fully supported, but old versions, e.g. -VS6, are not guaranteed to work. - -*) Compilers on Macintosh - -LodePNG has been reported to work both with gcc and LLVM for Macintosh, both for -C and C++. - -*) Other Compilers - -If you encounter problems on any compilers, feel free to let me know and I may -try to fix it if the compiler is modern and standards compliant. - - -10. examples ------------- - -This decoder example shows the most basic usage of LodePNG. More complex -examples can be found on the LodePNG website. - -NOTE: these examples do not support wide-character filenames, you can use an -external method to handle such files and encode or decode in-memory - -10.1. decoder C++ example -------------------------- - -#include "lodepng.h" -#include - -int main(int argc, char *argv[]) { - const char* filename = argc > 1 ? argv[1] : "test.png"; - - //load and decode - std::vector image; - unsigned width, height; - unsigned error = lodepng::decode(image, width, height, filename); - - //if there's an error, display it - if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl; - - //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ... -} - -10.2. decoder C example ------------------------ - -#include "lodepng.h" - -int main(int argc, char *argv[]) { - unsigned error; - unsigned char* image; - size_t width, height; - const char* filename = argc > 1 ? argv[1] : "test.png"; - - error = lodepng_decode32_file(&image, &width, &height, filename); - - if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error)); - - / * use image here * / - - free(image); - return 0; -} - -11. state settings reference ----------------------------- - -A quick reference of some settings to set on the LodePNGState - -For decoding: - -state.decoder.zlibsettings.ignore_adler32: ignore ADLER32 checksums -state.decoder.zlibsettings.custom_...: use custom inflate function -state.decoder.ignore_crc: ignore CRC checksums -state.decoder.ignore_critical: ignore unknown critical chunks -state.decoder.ignore_end: ignore missing IEND chunk. May fail if this corruption causes other errors -state.decoder.color_convert: convert internal PNG color to chosen one -state.decoder.read_text_chunks: whether to read in text metadata chunks -state.decoder.remember_unknown_chunks: whether to read in unknown chunks -state.info_raw.colortype: desired color type for decoded image -state.info_raw.bitdepth: desired bit depth for decoded image -state.info_raw....: more color settings, see struct LodePNGColorMode -state.info_png....: no settings for decoder but ouput, see struct LodePNGInfo - -For encoding: - -state.encoder.zlibsettings.btype: disable compression by setting it to 0 -state.encoder.zlibsettings.use_lz77: use LZ77 in compression -state.encoder.zlibsettings.windowsize: tweak LZ77 windowsize -state.encoder.zlibsettings.minmatch: tweak min LZ77 length to match -state.encoder.zlibsettings.nicematch: tweak LZ77 match where to stop searching -state.encoder.zlibsettings.lazymatching: try one more LZ77 matching -state.encoder.zlibsettings.custom_...: use custom deflate function -state.encoder.auto_convert: choose optimal PNG color type, if 0 uses info_png -state.encoder.filter_palette_zero: PNG filter strategy for palette -state.encoder.filter_strategy: PNG filter strategy to encode with -state.encoder.force_palette: add palette even if not encoding to one -state.encoder.add_id: add LodePNG identifier and version as a text chunk -state.encoder.text_compression: use compressed text chunks for metadata -state.info_raw.colortype: color type of raw input image you provide -state.info_raw.bitdepth: bit depth of raw input image you provide -state.info_raw: more color settings, see struct LodePNGColorMode -state.info_png.color.colortype: desired color type if auto_convert is false -state.info_png.color.bitdepth: desired bit depth if auto_convert is false -state.info_png.color....: more color settings, see struct LodePNGColorMode -state.info_png....: more PNG related settings, see struct LodePNGInfo - - -12. changes ------------ - -The version number of LodePNG is the date of the change given in the format -yyyymmdd. - -Some changes aren't backwards compatible. Those are indicated with a (!) -symbol. - -Not all changes are listed here, the commit history in github lists more: -https://github.com/lvandeve/lodepng - -*) 10 apr 2023: faster CRC32 implementation, but with larger lookup table. -*) 13 jun 2022: added support for the sBIT chunk. -*) 09 jan 2022: minor decoder speed improvements. -*) 27 jun 2021: added warnings that file reading/writing functions don't support - wide-character filenames (support for this is not planned, opening files is - not the core part of PNG decoding/decoding and is platform dependent). -*) 17 okt 2020: prevent decoding too large text/icc chunks by default. -*) 06 mar 2020: simplified some of the dynamic memory allocations. -*) 12 jan 2020: (!) added 'end' argument to lodepng_chunk_next to allow correct - overflow checks. -*) 14 aug 2019: around 25% faster decoding thanks to huffman lookup tables. -*) 15 jun 2019: (!) auto_choose_color API changed (for bugfix: don't use palette - if gray ICC profile) and non-ICC LodePNGColorProfile renamed to - LodePNGColorStats. -*) 30 dec 2018: code style changes only: removed newlines before opening braces. -*) 10 sep 2018: added way to inspect metadata chunks without full decoding. -*) 19 aug 2018: (!) fixed color mode bKGD is encoded with and made it use - palette index in case of palette. -*) 10 aug 2018: (!) added support for gAMA, cHRM, sRGB and iCCP chunks. This - change is backwards compatible unless you relied on unknown_chunks for those. -*) 11 jun 2018: less restrictive check for pixel size integer overflow -*) 14 jan 2018: allow optionally ignoring a few more recoverable errors -*) 17 sep 2017: fix memory leak for some encoder input error cases -*) 27 nov 2016: grey+alpha auto color model detection bugfix -*) 18 apr 2016: Changed qsort to custom stable sort (for platforms w/o qsort). -*) 09 apr 2016: Fixed colorkey usage detection, and better file loading (within - the limits of pure C90). -*) 08 dec 2015: Made load_file function return error if file can't be opened. -*) 24 okt 2015: Bugfix with decoding to palette output. -*) 18 apr 2015: Boundary PM instead of just package-merge for faster encoding. -*) 24 aug 2014: Moved to github -*) 23 aug 2014: Reduced needless memory usage of decoder. -*) 28 jun 2014: Removed fix_png setting, always support palette OOB for - simplicity. Made ColorProfile public. -*) 09 jun 2014: Faster encoder by fixing hash bug and more zeros optimization. -*) 22 dec 2013: Power of two windowsize required for optimization. -*) 15 apr 2013: Fixed bug with LAC_ALPHA and color key. -*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). -*) 11 mar 2013: (!) Bugfix with custom free. Changed from "my" to "lodepng_" - prefix for the custom allocators and made it possible with a new #define to - use custom ones in your project without needing to change lodepng's code. -*) 28 jan 2013: Bugfix with color key. -*) 27 okt 2012: Tweaks in text chunk keyword length error handling. -*) 8 okt 2012: (!) Added new filter strategy (entropy) and new auto color mode. - (no palette). Better deflate tree encoding. New compression tweak settings. - Faster color conversions while decoding. Some internal cleanups. -*) 23 sep 2012: Reduced warnings in Visual Studio a little bit. -*) 1 sep 2012: (!) Removed #define's for giving custom (de)compression functions - and made it work with function pointers instead. -*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc - and free functions and toggle #defines from compiler flags. Small fixes. -*) 6 may 2012: (!) Made plugging in custom zlib/deflate functions more flexible. -*) 22 apr 2012: (!) Made interface more consistent, renaming a lot. Removed - redundant C++ codec classes. Reduced amount of structs. Everything changed, - but it is cleaner now imho and functionality remains the same. Also fixed - several bugs and shrunk the implementation code. Made new samples. -*) 6 nov 2011: (!) By default, the encoder now automatically chooses the best - PNG color model and bit depth, based on the amount and type of colors of the - raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. -*) 9 okt 2011: simpler hash chain implementation for the encoder. -*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching. -*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking. - A bug with the PNG filtertype heuristic was fixed, so that it chooses much - better ones (it's quite significant). A setting to do an experimental, slow, - brute force search for PNG filter types is added. -*) 17 aug 2011: (!) changed some C zlib related function names. -*) 16 aug 2011: made the code less wide (max 120 characters per line). -*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. -*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. -*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman - to optimize long sequences of zeros. -*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and - LodePNG_InfoColor_canHaveAlpha functions for convenience. -*) 7 nov 2010: added LodePNG_error_text function to get error code description. -*) 30 okt 2010: made decoding slightly faster -*) 26 okt 2010: (!) changed some C function and struct names (more consistent). - Reorganized the documentation and the declaration order in the header. -*) 08 aug 2010: only changed some comments and external samples. -*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version. -*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers. -*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could - read by ignoring the problem but windows apps couldn't. -*) 06 jun 2008: added more error checks for out of memory cases. -*) 26 apr 2008: added a few more checks here and there to ensure more safety. -*) 06 mar 2008: crash with encoding of strings fixed -*) 02 feb 2008: support for international text chunks added (iTXt) -*) 23 jan 2008: small cleanups, and #defines to divide code in sections -*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. -*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. -*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added - Also various fixes, such as in the deflate and the padding bits code. -*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved - filtering code of encoder. -*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A - C++ wrapper around this provides an interface almost identical to before. - Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code - are together in these files but it works both for C and C++ compilers. -*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks -*) 30 aug 2007: bug fixed which makes this Borland C++ compatible -*) 09 aug 2007: some VS2005 warnings removed again -*) 21 jul 2007: deflate code placed in new namespace separate from zlib code -*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images -*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing - invalid std::vector element [0] fixed, and level 3 and 4 warnings removed -*) 02 jun 2007: made the encoder add a tag with version by default -*) 27 may 2007: zlib and png code separated (but still in the same file), - simple encoder/decoder functions added for more simple usage cases -*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69), - moved some examples from here to lodepng_examples.cpp -*) 12 may 2007: palette decoding bug fixed -*) 24 apr 2007: changed the license from BSD to the zlib license -*) 11 mar 2007: very simple addition: ability to encode bKGD chunks. -*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding - palettized PNG images. Plus little interface change with palette and texts. -*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes. - Fixed a bug where the end code of a block had length 0 in the Huffman tree. -*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented - and supported by the encoder, resulting in smaller PNGs at the output. -*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone. -*) 24 jan 2007: gave encoder an error interface. Added color conversion from any - greyscale type to 8-bit greyscale with or without alpha. -*) 21 jan 2007: (!) Totally changed the interface. It allows more color types - to convert to and is more uniform. See the manual for how it works now. -*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days: - encode/decode custom tEXt chunks, separate classes for zlib & deflate, and - at last made the decoder give errors for incorrect Adler32 or Crc. -*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel. -*) 29 dec 2006: Added support for encoding images without alpha channel, and - cleaned out code as well as making certain parts faster. -*) 28 dec 2006: Added "Settings" to the encoder. -*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now. - Removed some code duplication in the decoder. Fixed little bug in an example. -*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter. - Fixed a bug of the decoder with 16-bit per color. -*) 15 okt 2006: Changed documentation structure -*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the - given image buffer, however for now it's not compressed. -*) 08 sep 2006: (!) Changed to interface with a Decoder class -*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different - way. Renamed decodePNG to decodePNGGeneric. -*) 29 jul 2006: (!) Changed the interface: image info is now returned as a - struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy. -*) 28 jul 2006: Cleaned the code and added new error checks. - Corrected terminology "deflate" into "inflate". -*) 23 jun 2006: Added SDL example in the documentation in the header, this - example allows easy debugging by displaying the PNG and its transparency. -*) 22 jun 2006: (!) Changed way to obtain error value. Added - loadFile function for convenience. Made decodePNG32 faster. -*) 21 jun 2006: (!) Changed type of info vector to unsigned. - Changed position of palette in info vector. Fixed an important bug that - happened on PNGs with an uncompressed block. -*) 16 jun 2006: Internally changed unsigned into unsigned where - needed, and performed some optimizations. -*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them - in LodePNG namespace. Changed the order of the parameters. Rewrote the - documentation in the header. Renamed files to lodepng.cpp and lodepng.h -*) 22 apr 2006: Optimized and improved some code -*) 07 sep 2005: (!) Changed to std::vector interface -*) 12 aug 2005: Initial release (C++, decoder only) - - -13. contact information ------------------------ - -Feel free to contact me with suggestions, problems, comments, ... concerning -LodePNG. If you encounter a PNG image that doesn't work properly with this -decoder, feel free to send it and I'll use it to find and fix the problem. - -My email address is (puzzle the account and domain together with an @ symbol): -Domain: gmail dot com. -Account: lode dot vandevenne. - - -Copyright (c) 2005-2022 Lode Vandevenne -*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/lodepng/lv_lodepng.c b/software/Power_Pico/Middlewares/LVGL/src/libs/lodepng/lv_lodepng.c deleted file mode 100644 index e5b55de..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/lodepng/lv_lodepng.c +++ /dev/null @@ -1,261 +0,0 @@ -/** - * @file lv_lodepng.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../draw/lv_image_decoder_private.h" -#include "../../../lvgl.h" -#include "../../core/lv_global.h" -#if LV_USE_LODEPNG - -#include "lv_lodepng.h" -#include "lodepng.h" -#include - -/********************* - * DEFINES - *********************/ - -#define DECODER_NAME "LODEPNG" - -#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * src, lv_image_header_t * header); -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc); -static void convert_color_depth(uint8_t * img_p, uint32_t px_cnt); -static lv_draw_buf_t * decode_png_data(const void * png_data, size_t png_data_size); -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Register the PNG decoder functions in LVGL - */ -void lv_lodepng_init(void) -{ - lv_image_decoder_t * dec = lv_image_decoder_create(); - lv_image_decoder_set_info_cb(dec, decoder_info); - lv_image_decoder_set_open_cb(dec, decoder_open); - lv_image_decoder_set_close_cb(dec, decoder_close); - - dec->name = DECODER_NAME; -} - -void lv_lodepng_deinit(void) -{ - lv_image_decoder_t * dec = NULL; - while((dec = lv_image_decoder_get_next(dec)) != NULL) { - if(dec->info_cb == decoder_info) { - lv_image_decoder_delete(dec); - break; - } - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Get info about a PNG image - * @param decoder pointer to the decoder where this function belongs - * @param dsc image descriptor containing the source and type of the image and other info. - * @param header image information is set in header parameter - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info - */ -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) -{ - LV_UNUSED(decoder); /*Unused*/ - - lv_image_src_t src_type = dsc->src_type; /*Get the source type*/ - - if(src_type == LV_IMAGE_SRC_FILE || src_type == LV_IMAGE_SRC_VARIABLE) { - uint32_t * size; - static const uint8_t magic[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}; - uint8_t buf[24]; - - /*If it's a PNG file...*/ - if(src_type == LV_IMAGE_SRC_FILE) { - /* Read the width and height from the file. They have a constant location: - * [16..19]: width - * [20..23]: height - */ - uint32_t rn; - lv_fs_read(&dsc->file, buf, sizeof(buf), &rn); - - if(rn != sizeof(buf)) return LV_RESULT_INVALID; - - if(lv_memcmp(buf, magic, sizeof(magic)) != 0) return LV_RESULT_INVALID; - - size = (uint32_t *)&buf[16]; - } - /*If it's a PNG file in a C array...*/ - else { - const lv_image_dsc_t * img_dsc = dsc->src; - const uint32_t data_size = img_dsc->data_size; - size = ((uint32_t *)img_dsc->data) + 4; - - if(data_size < sizeof(magic)) return LV_RESULT_INVALID; - if(lv_memcmp(img_dsc->data, magic, sizeof(magic)) != 0) return LV_RESULT_INVALID; - } - - /*Save the data in the header*/ - header->cf = LV_COLOR_FORMAT_ARGB8888; - /*The width and height are stored in Big endian format so convert them to little endian*/ - header->w = (int32_t)((size[0] & 0xff000000) >> 24) + ((size[0] & 0x00ff0000) >> 8); - header->h = (int32_t)((size[1] & 0xff000000) >> 24) + ((size[1] & 0x00ff0000) >> 8); - - return LV_RESULT_OK; - } - - return LV_RESULT_INVALID; /*If didn't succeeded earlier then it's an error*/ -} - -/** - * Open a PNG image and decode it into dsc.decoded - * @param decoder pointer to the decoder where this function belongs - * @param dsc decoded image descriptor - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image - */ -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); - - const uint8_t * png_data = NULL; - size_t png_data_size = 0; - if(dsc->src_type == LV_IMAGE_SRC_FILE) { - const char * fn = dsc->src; - if(lv_strcmp(lv_fs_get_ext(fn), "png") == 0) { /*Check the extension*/ - unsigned error; - error = lodepng_load_file((void *)&png_data, &png_data_size, fn); /*Load the file*/ - if(error) { - if(png_data != NULL) { - lv_free((void *)png_data); - } - LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error)); - return LV_RESULT_INVALID; - } - } - } - else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { - const lv_image_dsc_t * img_dsc = dsc->src; - png_data = img_dsc->data; - png_data_size = img_dsc->data_size; - } - else { - return LV_RESULT_INVALID; - } - - lv_draw_buf_t * decoded = decode_png_data(png_data, png_data_size); - - if(dsc->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)png_data); - - if(!decoded) { - LV_LOG_WARN("Error decoding PNG"); - return LV_RESULT_INVALID; - } - - lv_draw_buf_t * adjusted = lv_image_decoder_post_process(dsc, decoded); - if(adjusted == NULL) { - lv_draw_buf_destroy(decoded); - return LV_RESULT_INVALID; - } - - /*The adjusted draw buffer is newly allocated.*/ - if(adjusted != decoded) { - lv_draw_buf_destroy(decoded); - decoded = adjusted; - } - - dsc->decoded = decoded; - - if(dsc->args.no_cache) return LV_RESULT_OK; - - /*If the image cache is disabled, just return the decoded image*/ - if(!lv_image_cache_is_enabled()) return LV_RESULT_OK; - - /*Add the decoded image to the cache*/ - lv_image_cache_data_t search_key; - search_key.src_type = dsc->src_type; - search_key.src = dsc->src; - search_key.slot.size = decoded->data_size; - - lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, decoded, NULL); - - if(entry == NULL) { - return LV_RESULT_INVALID; - } - dsc->cache_entry = entry; - - return LV_RESULT_OK; /*If not returned earlier then it failed*/ -} - -/** - * Close PNG image and free data - * @param decoder pointer to the decoder where this function belongs - * @param dsc decoded image descriptor - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image - */ -static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); - - if(dsc->args.no_cache || - !lv_image_cache_is_enabled()) lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); -} - -static lv_draw_buf_t * decode_png_data(const void * png_data, size_t png_data_size) -{ - unsigned png_width; /*Not used, just required by the decoder*/ - unsigned png_height; /*Not used, just required by the decoder*/ - lv_draw_buf_t * decoded = NULL; - - /*Decode the image in ARGB8888 */ - unsigned error = lodepng_decode32((unsigned char **)&decoded, &png_width, &png_height, png_data, png_data_size); - if(error) { - if(decoded != NULL) lv_draw_buf_destroy(decoded); - return NULL; - } - - /*Convert the image to the system's color depth*/ - convert_color_depth(decoded->data, png_width * png_height); - - return decoded; -} - -/** - * If the display is not in 32 bit format (ARGB888) then convert the image to the current color depth - * @param img the ARGB888 image - * @param px_cnt number of pixels in `img` - */ -static void convert_color_depth(uint8_t * img_p, uint32_t px_cnt) -{ - lv_color32_t * img_argb = (lv_color32_t *)img_p; - uint32_t i; - for(i = 0; i < px_cnt; i++) { - uint8_t blue = img_argb[i].blue; - img_argb[i].blue = img_argb[i].red; - img_argb[i].red = blue; - } -} - -#endif /*LV_USE_LODEPNG*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/lodepng/lv_lodepng.h b/software/Power_Pico/Middlewares/LVGL/src/libs/lodepng/lv_lodepng.h deleted file mode 100644 index f3dc4b7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/lodepng/lv_lodepng.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @file lv_lodepng.h - * - */ - -#ifndef LV_LODEPNG_H -#define LV_LODEPNG_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_LODEPNG - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Register the PNG decoder functions in LVGL - */ -void lv_lodepng_init(void); - -void lv_lodepng_deinit(void); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_LODEPNG*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_LODEPNG_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/lz4/LICENSE b/software/Power_Pico/Middlewares/LVGL/src/libs/lz4/LICENSE deleted file mode 100644 index 4884916..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/lz4/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -LZ4 Library -Copyright (c) 2011-2020, Yann Collet -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/lz4/lz4.c b/software/Power_Pico/Middlewares/LVGL/src/libs/lz4/lz4.c deleted file mode 100644 index 145f5fb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/lz4/lz4.c +++ /dev/null @@ -1,2761 +0,0 @@ -/* - LZ4 - Fast LZ compression algorithm - Copyright (C) 2011-2020, Yann Collet. - - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - You can contact the author at : - - LZ4 homepage : http://www.lz4.org - - LZ4 source repository : https://github.com/lz4/lz4 -*/ - -#include "../../lv_conf_internal.h" -#if LV_USE_LZ4_INTERNAL - -/*-************************************ -* Tuning parameters -**************************************/ -/* - * LZ4_HEAPMODE : - * Select how stateless compression functions like `LZ4_compress_default()` - * allocate memory for their hash table, - * in memory stack (0:default, fastest), or in memory heap (1:requires malloc()). - */ -#ifndef LZ4_HEAPMODE -# define LZ4_HEAPMODE 0 -#endif - -/* - * LZ4_ACCELERATION_DEFAULT : - * Select "acceleration" for LZ4_compress_fast() when parameter value <= 0 - */ -#define LZ4_ACCELERATION_DEFAULT 1 -/* - * LZ4_ACCELERATION_MAX : - * Any "acceleration" value higher than this threshold - * get treated as LZ4_ACCELERATION_MAX instead (fix #876) - */ -#define LZ4_ACCELERATION_MAX 65537 - - -/*-************************************ -* CPU Feature Detection -**************************************/ -/* LZ4_FORCE_MEMORY_ACCESS - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - * It can generate buggy code on targets which assembly generation depends on alignment. - * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See https://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef LZ4_FORCE_MEMORY_ACCESS /* can be defined externally */ -# if defined(__GNUC__) && \ - ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) \ - || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) -# define LZ4_FORCE_MEMORY_ACCESS 2 -# elif (defined(__INTEL_COMPILER) && !defined(_WIN32)) || defined(__GNUC__) || defined(_MSC_VER) -# define LZ4_FORCE_MEMORY_ACCESS 1 -# endif -#endif - -/* - * LZ4_FORCE_SW_BITCOUNT - * Define this parameter if your target system or compiler does not support hardware bit count - */ -#if defined(_MSC_VER) && defined(_WIN32_WCE) /* Visual Studio for WinCE doesn't support Hardware bit count */ -# undef LZ4_FORCE_SW_BITCOUNT /* avoid double def */ -# define LZ4_FORCE_SW_BITCOUNT -#endif - - - -/*-************************************ -* Dependency -**************************************/ -/* - * LZ4_SRC_INCLUDED: - * Amalgamation flag, whether lz4.c is included - */ -#ifndef LZ4_SRC_INCLUDED -# define LZ4_SRC_INCLUDED 1 -#endif - -#ifndef LZ4_STATIC_LINKING_ONLY -#define LZ4_STATIC_LINKING_ONLY -#endif - -#ifndef LZ4_DISABLE_DEPRECATE_WARNINGS -#define LZ4_DISABLE_DEPRECATE_WARNINGS /* due to LZ4_decompress_safe_withPrefix64k */ -#endif - -#define LZ4_STATIC_LINKING_ONLY /* LZ4_DISTANCE_MAX */ -#include "lz4.h" -/* see also "memory routines" below */ - - -/*-************************************ -* Compiler Options -**************************************/ -#if defined(_MSC_VER) && (_MSC_VER >= 1400) /* Visual Studio 2005+ */ -# include /* only present in VS2005+ */ -# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ -# pragma warning(disable : 6237) /* disable: C6237: conditional expression is always 0 */ -#endif /* _MSC_VER */ - -#ifndef LZ4_FORCE_INLINE -# ifdef _MSC_VER /* Visual Studio */ -# define LZ4_FORCE_INLINE static __forceinline -# else -# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ -# ifdef __GNUC__ -# define LZ4_FORCE_INLINE static inline __attribute__((always_inline)) -# else -# define LZ4_FORCE_INLINE static inline -# endif -# else -# define LZ4_FORCE_INLINE static -# endif /* __STDC_VERSION__ */ -# endif /* _MSC_VER */ -#endif /* LZ4_FORCE_INLINE */ - -/* LZ4_FORCE_O2 and LZ4_FORCE_INLINE - * gcc on ppc64le generates an unrolled SIMDized loop for LZ4_wildCopy8, - * together with a simple 8-byte copy loop as a fall-back path. - * However, this optimization hurts the decompression speed by >30%, - * because the execution does not go to the optimized loop - * for typical compressible data, and all of the preamble checks - * before going to the fall-back path become useless overhead. - * This optimization happens only with the -O3 flag, and -O2 generates - * a simple 8-byte copy loop. - * With gcc on ppc64le, all of the LZ4_decompress_* and LZ4_wildCopy8 - * functions are annotated with __attribute__((optimize("O2"))), - * and also LZ4_wildCopy8 is forcibly inlined, so that the O2 attribute - * of LZ4_wildCopy8 does not affect the compression speed. - */ -#if defined(__PPC64__) && defined(__LITTLE_ENDIAN__) && defined(__GNUC__) && !defined(__clang__) -# define LZ4_FORCE_O2 __attribute__((optimize("O2"))) -# undef LZ4_FORCE_INLINE -# define LZ4_FORCE_INLINE static __inline __attribute__((optimize("O2"),always_inline)) -#else -# define LZ4_FORCE_O2 -#endif - -#if (defined(__GNUC__) && (__GNUC__ >= 3)) || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) || defined(__clang__) -# define expect(expr,value) (__builtin_expect ((expr),(value)) ) -#else -# define expect(expr,value) (expr) -#endif - -#ifndef likely -#define likely(expr) expect((expr) != 0, 1) -#endif -#ifndef unlikely -#define unlikely(expr) expect((expr) != 0, 0) -#endif - -/* Should the alignment test prove unreliable, for some reason, - * it can be disabled by setting LZ4_ALIGN_TEST to 0 */ -#ifndef LZ4_ALIGN_TEST /* can be externally provided */ -# define LZ4_ALIGN_TEST 1 -#endif - - -/*-************************************ -* Memory routines -**************************************/ - -/*! LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION : - * Disable relatively high-level LZ4/HC functions that use dynamic memory - * allocation functions (malloc(), calloc(), free()). - * - * Note that this is a compile-time switch. And since it disables - * public/stable LZ4 v1 API functions, we don't recommend using this - * symbol to generate a library for distribution. - * - * The following public functions are removed when this symbol is defined. - * - lz4 : LZ4_createStream, LZ4_freeStream, - * LZ4_createStreamDecode, LZ4_freeStreamDecode, LZ4_create (deprecated) - * - lz4hc : LZ4_createStreamHC, LZ4_freeStreamHC, - * LZ4_createHC (deprecated), LZ4_freeHC (deprecated) - * - lz4frame, lz4file : All LZ4F_* functions - */ -#if defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -# define ALLOC(s) lz4_error_memory_allocation_is_disabled -# define ALLOC_AND_ZERO(s) lz4_error_memory_allocation_is_disabled -# define FREEMEM(p) lz4_error_memory_allocation_is_disabled -#elif defined(LZ4_USER_MEMORY_FUNCTIONS) -/* memory management functions can be customized by user project. - * Below functions must exist somewhere in the Project - * and be available at link time */ -void* LZ4_malloc(size_t s); -void* LZ4_calloc(size_t n, size_t s); -void LZ4_free(void* p); -# define ALLOC(s) LZ4_malloc(s) -# define ALLOC_AND_ZERO(s) LZ4_calloc(1,s) -# define FREEMEM(p) LZ4_free(p) -#else -# include /* malloc, calloc, free */ -# define ALLOC(s) malloc(s) -# define ALLOC_AND_ZERO(s) calloc(1,s) -# define FREEMEM(p) free(p) -#endif - -#if ! LZ4_FREESTANDING -# include /* memset, memcpy */ -#endif -#if !defined(LZ4_memset) -# define LZ4_memset(p,v,s) memset((p),(v),(s)) -#endif -#define MEM_INIT(p,v,s) LZ4_memset((p),(v),(s)) - - -/*-************************************ -* Common Constants -**************************************/ -#define MINMATCH 4 - -#define WILDCOPYLENGTH 8 -#define LASTLITERALS 5 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ -#define MFLIMIT 12 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ -#define MATCH_SAFEGUARD_DISTANCE ((2*WILDCOPYLENGTH) - MINMATCH) /* ensure it's possible to write 2 x wildcopyLength without overflowing output buffer */ -#define FASTLOOP_SAFE_DISTANCE 64 -static const int LZ4_minLength = (MFLIMIT+1); - -#define KB *(1 <<10) -#define MB *(1 <<20) -#define GB *(1U<<30) - -#define LZ4_DISTANCE_ABSOLUTE_MAX 65535 -#if (LZ4_DISTANCE_MAX > LZ4_DISTANCE_ABSOLUTE_MAX) /* max supported by LZ4 format */ -# error "LZ4_DISTANCE_MAX is too big : must be <= 65535" -#endif - -#define ML_BITS 4 -#define ML_MASK ((1U<=1) -# include -#else -# ifndef assert -# define assert(condition) ((void)0) -# endif -#endif - -#define LZ4_STATIC_ASSERT(c) { enum { LZ4_static_assert = 1/(int)(!!(c)) }; } /* use after variable declarations */ - -#if defined(LZ4_DEBUG) && (LZ4_DEBUG>=2) -# include - static int g_debuglog_enable = 1; -# define DEBUGLOG(l, ...) { \ - if ((g_debuglog_enable) && (l<=LZ4_DEBUG)) { \ - fprintf(stderr, __FILE__ " %i: ", __LINE__); \ - fprintf(stderr, __VA_ARGS__); \ - fprintf(stderr, " \n"); \ - } } -#else -# define DEBUGLOG(l, ...) {} /* disabled */ -#endif - -static int LZ4_isAligned(const void* ptr, size_t alignment) -{ - return ((size_t)ptr & (alignment -1)) == 0; -} - - -/*-************************************ -* Types -**************************************/ -#include -#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) -# include - typedef uint8_t BYTE; - typedef uint16_t U16; - typedef uint32_t U32; - typedef int32_t S32; - typedef uint64_t U64; - typedef uintptr_t uptrval; -#else -# if UINT_MAX != 4294967295UL -# error "LZ4 code (when not C++ or C99) assumes that sizeof(int) == 4" -# endif - typedef unsigned char BYTE; - typedef unsigned short U16; - typedef unsigned int U32; - typedef signed int S32; - typedef unsigned long long U64; - typedef size_t uptrval; /* generally true, except OpenVMS-64 */ -#endif - -#if defined(__x86_64__) - typedef U64 reg_t; /* 64-bits in x32 mode */ -#else - typedef size_t reg_t; /* 32-bits in x32 mode */ -#endif - -typedef enum { - notLimited = 0, - limitedOutput = 1, - fillOutput = 2 -} limitedOutput_directive; - - -/*-************************************ -* Reading and writing into memory -**************************************/ - -/** - * LZ4 relies on memcpy with a constant size being inlined. In freestanding - * environments, the compiler can't assume the implementation of memcpy() is - * standard compliant, so it can't apply its specialized memcpy() inlining - * logic. When possible, use __builtin_memcpy() to tell the compiler to analyze - * memcpy() as if it were standard compliant, so it can inline it in freestanding - * environments. This is needed when decompressing the Linux Kernel, for example. - */ -#if !defined(LZ4_memcpy) -# if defined(__GNUC__) && (__GNUC__ >= 4) -# define LZ4_memcpy(dst, src, size) __builtin_memcpy(dst, src, size) -# else -# define LZ4_memcpy(dst, src, size) memcpy(dst, src, size) -# endif -#endif - -#if !defined(LZ4_memmove) -# if defined(__GNUC__) && (__GNUC__ >= 4) -# define LZ4_memmove __builtin_memmove -# else -# define LZ4_memmove memmove -# endif -#endif - -static unsigned LZ4_isLittleEndian(void) -{ - const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ - return one.c[0]; -} - -#if defined(__GNUC__) || defined(__INTEL_COMPILER) -#define LZ4_PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__)) -#elif defined(_MSC_VER) -#define LZ4_PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop)) -#endif - -#if defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==2) -/* lie to the compiler about data alignment; use with caution */ - -static U16 LZ4_read16(const void* memPtr) { return *(const U16*) memPtr; } -static U32 LZ4_read32(const void* memPtr) { return *(const U32*) memPtr; } -static reg_t LZ4_read_ARCH(const void* memPtr) { return *(const reg_t*) memPtr; } - -static void LZ4_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } -static void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } - -#elif defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -LZ4_PACK(typedef struct { U16 u16; }) LZ4_unalign16; -LZ4_PACK(typedef struct { U32 u32; }) LZ4_unalign32; -LZ4_PACK(typedef struct { reg_t uArch; }) LZ4_unalignST; - -static U16 LZ4_read16(const void* ptr) { return ((const LZ4_unalign16*)ptr)->u16; } -static U32 LZ4_read32(const void* ptr) { return ((const LZ4_unalign32*)ptr)->u32; } -static reg_t LZ4_read_ARCH(const void* ptr) { return ((const LZ4_unalignST*)ptr)->uArch; } - -static void LZ4_write16(void* memPtr, U16 value) { ((LZ4_unalign16*)memPtr)->u16 = value; } -static void LZ4_write32(void* memPtr, U32 value) { ((LZ4_unalign32*)memPtr)->u32 = value; } - -#else /* safe and portable access using memcpy() */ - -static U16 LZ4_read16(const void* memPtr) -{ - U16 val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; -} - -static U32 LZ4_read32(const void* memPtr) -{ - U32 val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; -} - -static reg_t LZ4_read_ARCH(const void* memPtr) -{ - reg_t val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; -} - -static void LZ4_write16(void* memPtr, U16 value) -{ - LZ4_memcpy(memPtr, &value, sizeof(value)); -} - -static void LZ4_write32(void* memPtr, U32 value) -{ - LZ4_memcpy(memPtr, &value, sizeof(value)); -} - -#endif /* LZ4_FORCE_MEMORY_ACCESS */ - - -static U16 LZ4_readLE16(const void* memPtr) -{ - if (LZ4_isLittleEndian()) { - return LZ4_read16(memPtr); - } else { - const BYTE* p = (const BYTE*)memPtr; - return (U16)((U16)p[0] + (p[1]<<8)); - } -} - -static void LZ4_writeLE16(void* memPtr, U16 value) -{ - if (LZ4_isLittleEndian()) { - LZ4_write16(memPtr, value); - } else { - BYTE* p = (BYTE*)memPtr; - p[0] = (BYTE) value; - p[1] = (BYTE)(value>>8); - } -} - -/* customized variant of memcpy, which can overwrite up to 8 bytes beyond dstEnd */ -LZ4_FORCE_INLINE -void LZ4_wildCopy8(void* dstPtr, const void* srcPtr, void* dstEnd) -{ - BYTE* d = (BYTE*)dstPtr; - const BYTE* s = (const BYTE*)srcPtr; - BYTE* const e = (BYTE*)dstEnd; - - do { LZ4_memcpy(d,s,8); d+=8; s+=8; } while (d= 16. */ -LZ4_FORCE_INLINE void -LZ4_wildCopy32(void* dstPtr, const void* srcPtr, void* dstEnd) -{ - BYTE* d = (BYTE*)dstPtr; - const BYTE* s = (const BYTE*)srcPtr; - BYTE* const e = (BYTE*)dstEnd; - - do { LZ4_memcpy(d,s,16); LZ4_memcpy(d+16,s+16,16); d+=32; s+=32; } while (d= dstPtr + MINMATCH - * - there is at least 8 bytes available to write after dstEnd */ -LZ4_FORCE_INLINE void -LZ4_memcpy_using_offset(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const size_t offset) -{ - BYTE v[8]; - - assert(dstEnd >= dstPtr + MINMATCH); - - switch(offset) { - case 1: - MEM_INIT(v, *srcPtr, 8); - break; - case 2: - LZ4_memcpy(v, srcPtr, 2); - LZ4_memcpy(&v[2], srcPtr, 2); -#if defined(_MSC_VER) && (_MSC_VER <= 1937) /* MSVC 2022 ver 17.7 or earlier */ -# pragma warning(push) -# pragma warning(disable : 6385) /* warning C6385: Reading invalid data from 'v'. */ -#endif - LZ4_memcpy(&v[4], v, 4); -#if defined(_MSC_VER) && (_MSC_VER <= 1937) /* MSVC 2022 ver 17.7 or earlier */ -# pragma warning(pop) -#endif - break; - case 4: - LZ4_memcpy(v, srcPtr, 4); - LZ4_memcpy(&v[4], srcPtr, 4); - break; - default: - LZ4_memcpy_using_offset_base(dstPtr, srcPtr, dstEnd, offset); - return; - } - - LZ4_memcpy(dstPtr, v, 8); - dstPtr += 8; - while (dstPtr < dstEnd) { - LZ4_memcpy(dstPtr, v, 8); - dstPtr += 8; - } -} -#endif - - -/*-************************************ -* Common functions -**************************************/ -static unsigned LZ4_NbCommonBytes (reg_t val) -{ - assert(val != 0); - if (LZ4_isLittleEndian()) { - if (sizeof(val) == 8) { -# if defined(_MSC_VER) && (_MSC_VER >= 1800) && (defined(_M_AMD64) && !defined(_M_ARM64EC)) && !defined(LZ4_FORCE_SW_BITCOUNT) -/*-************************************************************************************************* -* ARM64EC is a Microsoft-designed ARM64 ABI compatible with AMD64 applications on ARM64 Windows 11. -* The ARM64EC ABI does not support AVX/AVX2/AVX512 instructions, nor their relevant intrinsics -* including _tzcnt_u64. Therefore, we need to neuter the _tzcnt_u64 code path for ARM64EC. -****************************************************************************************************/ -# if defined(__clang__) && (__clang_major__ < 10) - /* Avoid undefined clang-cl intrinsics issue. - * See https://github.com/lz4/lz4/pull/1017 for details. */ - return (unsigned)__builtin_ia32_tzcnt_u64(val) >> 3; -# else - /* x64 CPUS without BMI support interpret `TZCNT` as `REP BSF` */ - return (unsigned)_tzcnt_u64(val) >> 3; -# endif -# elif defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) - unsigned long r = 0; - _BitScanForward64(&r, (U64)val); - return (unsigned)r >> 3; -# elif (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ - ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ - !defined(LZ4_FORCE_SW_BITCOUNT) - return (unsigned)__builtin_ctzll((U64)val) >> 3; -# else - const U64 m = 0x0101010101010101ULL; - val ^= val - 1; - return (unsigned)(((U64)((val & (m - 1)) * m)) >> 56); -# endif - } else /* 32 bits */ { -# if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(LZ4_FORCE_SW_BITCOUNT) - unsigned long r; - _BitScanForward(&r, (U32)val); - return (unsigned)r >> 3; -# elif (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ - ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ - !defined(__TINYC__) && !defined(LZ4_FORCE_SW_BITCOUNT) - return (unsigned)__builtin_ctz((U32)val) >> 3; -# else - const U32 m = 0x01010101; - return (unsigned)((((val - 1) ^ val) & (m - 1)) * m) >> 24; -# endif - } - } else /* Big Endian CPU */ { - if (sizeof(val)==8) { -# if (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ - ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ - !defined(__TINYC__) && !defined(LZ4_FORCE_SW_BITCOUNT) - return (unsigned)__builtin_clzll((U64)val) >> 3; -# else -#if 1 - /* this method is probably faster, - * but adds a 128 bytes lookup table */ - static const unsigned char ctz7_tab[128] = { - 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - }; - U64 const mask = 0x0101010101010101ULL; - U64 const t = (((val >> 8) - mask) | val) & mask; - return ctz7_tab[(t * 0x0080402010080402ULL) >> 57]; -#else - /* this method doesn't consume memory space like the previous one, - * but it contains several branches, - * that may end up slowing execution */ - static const U32 by32 = sizeof(val)*4; /* 32 on 64 bits (goal), 16 on 32 bits. - Just to avoid some static analyzer complaining about shift by 32 on 32-bits target. - Note that this code path is never triggered in 32-bits mode. */ - unsigned r; - if (!(val>>by32)) { r=4; } else { r=0; val>>=by32; } - if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } - r += (!val); - return r; -#endif -# endif - } else /* 32 bits */ { -# if (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ - ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ - !defined(LZ4_FORCE_SW_BITCOUNT) - return (unsigned)__builtin_clz((U32)val) >> 3; -# else - val >>= 8; - val = ((((val + 0x00FFFF00) | 0x00FFFFFF) + val) | - (val + 0x00FF0000)) >> 24; - return (unsigned)val ^ 3; -# endif - } - } -} - - -#define STEPSIZE sizeof(reg_t) -LZ4_FORCE_INLINE -unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit) -{ - const BYTE* const pStart = pIn; - - if (likely(pIn < pInLimit-(STEPSIZE-1))) { - reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); - if (!diff) { - pIn+=STEPSIZE; pMatch+=STEPSIZE; - } else { - return LZ4_NbCommonBytes(diff); - } } - - while (likely(pIn < pInLimit-(STEPSIZE-1))) { - reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); - if (!diff) { pIn+=STEPSIZE; pMatch+=STEPSIZE; continue; } - pIn += LZ4_NbCommonBytes(diff); - return (unsigned)(pIn - pStart); - } - - if ((STEPSIZE==8) && (pIn<(pInLimit-3)) && (LZ4_read32(pMatch) == LZ4_read32(pIn))) { pIn+=4; pMatch+=4; } - if ((pIn<(pInLimit-1)) && (LZ4_read16(pMatch) == LZ4_read16(pIn))) { pIn+=2; pMatch+=2; } - if ((pIn compression run slower on incompressible data */ - - -/*-************************************ -* Local Structures and types -**************************************/ -typedef enum { clearedTable = 0, byPtr, byU32, byU16 } tableType_t; - -/** - * This enum distinguishes several different modes of accessing previous - * content in the stream. - * - * - noDict : There is no preceding content. - * - withPrefix64k : Table entries up to ctx->dictSize before the current blob - * blob being compressed are valid and refer to the preceding - * content (of length ctx->dictSize), which is available - * contiguously preceding in memory the content currently - * being compressed. - * - usingExtDict : Like withPrefix64k, but the preceding content is somewhere - * else in memory, starting at ctx->dictionary with length - * ctx->dictSize. - * - usingDictCtx : Everything concerning the preceding content is - * in a separate context, pointed to by ctx->dictCtx. - * ctx->dictionary, ctx->dictSize, and table entries - * in the current context that refer to positions - * preceding the beginning of the current compression are - * ignored. Instead, ctx->dictCtx->dictionary and ctx->dictCtx - * ->dictSize describe the location and size of the preceding - * content, and matches are found by looking in the ctx - * ->dictCtx->hashTable. - */ -typedef enum { noDict = 0, withPrefix64k, usingExtDict, usingDictCtx } dict_directive; -typedef enum { noDictIssue = 0, dictSmall } dictIssue_directive; - - -/*-************************************ -* Local Utils -**************************************/ -int LZ4_versionNumber (void) { return LZ4_VERSION_NUMBER; } -const char* LZ4_versionString(void) { return LZ4_VERSION_STRING; } -int LZ4_compressBound(int isize) { return LZ4_COMPRESSBOUND(isize); } -int LZ4_sizeofState(void) { return sizeof(LZ4_stream_t); } - - -/*-**************************************** -* Internal Definitions, used only in Tests -*******************************************/ -#if defined (__cplusplus) -extern "C" { -#endif - -int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize); - -int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, - int compressedSize, int maxOutputSize, - const void* dictStart, size_t dictSize); -int LZ4_decompress_safe_partial_forceExtDict(const char* source, char* dest, - int compressedSize, int targetOutputSize, int dstCapacity, - const void* dictStart, size_t dictSize); -#if defined (__cplusplus) -} -#endif - -/*-****************************** -* Compression functions -********************************/ -LZ4_FORCE_INLINE U32 LZ4_hash4(U32 sequence, tableType_t const tableType) -{ - if (tableType == byU16) - return ((sequence * 2654435761U) >> ((MINMATCH*8)-(LZ4_HASHLOG+1))); - else - return ((sequence * 2654435761U) >> ((MINMATCH*8)-LZ4_HASHLOG)); -} - -LZ4_FORCE_INLINE U32 LZ4_hash5(U64 sequence, tableType_t const tableType) -{ - const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG+1 : LZ4_HASHLOG; - if (LZ4_isLittleEndian()) { - const U64 prime5bytes = 889523592379ULL; - return (U32)(((sequence << 24) * prime5bytes) >> (64 - hashLog)); - } else { - const U64 prime8bytes = 11400714785074694791ULL; - return (U32)(((sequence >> 24) * prime8bytes) >> (64 - hashLog)); - } -} - -LZ4_FORCE_INLINE U32 LZ4_hashPosition(const void* const p, tableType_t const tableType) -{ - if ((sizeof(reg_t)==8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType); - return LZ4_hash4(LZ4_read32(p), tableType); -} - -LZ4_FORCE_INLINE void LZ4_clearHash(U32 h, void* tableBase, tableType_t const tableType) -{ - switch (tableType) - { - default: /* fallthrough */ - case clearedTable: { /* illegal! */ assert(0); return; } - case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = NULL; return; } - case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = 0; return; } - case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = 0; return; } - } -} - -LZ4_FORCE_INLINE void LZ4_putIndexOnHash(U32 idx, U32 h, void* tableBase, tableType_t const tableType) -{ - switch (tableType) - { - default: /* fallthrough */ - case clearedTable: /* fallthrough */ - case byPtr: { /* illegal! */ assert(0); return; } - case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = idx; return; } - case byU16: { U16* hashTable = (U16*) tableBase; assert(idx < 65536); hashTable[h] = (U16)idx; return; } - } -} - -/* LZ4_putPosition*() : only used in byPtr mode */ -LZ4_FORCE_INLINE void LZ4_putPositionOnHash(const BYTE* p, U32 h, - void* tableBase, tableType_t const tableType) -{ - const BYTE** const hashTable = (const BYTE**)tableBase; - assert(tableType == byPtr); (void)tableType; - hashTable[h] = p; -} - -LZ4_FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType) -{ - U32 const h = LZ4_hashPosition(p, tableType); - LZ4_putPositionOnHash(p, h, tableBase, tableType); -} - -/* LZ4_getIndexOnHash() : - * Index of match position registered in hash table. - * hash position must be calculated by using base+index, or dictBase+index. - * Assumption 1 : only valid if tableType == byU32 or byU16. - * Assumption 2 : h is presumed valid (within limits of hash table) - */ -LZ4_FORCE_INLINE U32 LZ4_getIndexOnHash(U32 h, const void* tableBase, tableType_t tableType) -{ - LZ4_STATIC_ASSERT(LZ4_MEMORY_USAGE > 2); - if (tableType == byU32) { - const U32* const hashTable = (const U32*) tableBase; - assert(h < (1U << (LZ4_MEMORY_USAGE-2))); - return hashTable[h]; - } - if (tableType == byU16) { - const U16* const hashTable = (const U16*) tableBase; - assert(h < (1U << (LZ4_MEMORY_USAGE-1))); - return hashTable[h]; - } - assert(0); return 0; /* forbidden case */ -} - -static const BYTE* LZ4_getPositionOnHash(U32 h, const void* tableBase, tableType_t tableType) -{ - assert(tableType == byPtr); (void)tableType; - { const BYTE* const* hashTable = (const BYTE* const*) tableBase; return hashTable[h]; } -} - -LZ4_FORCE_INLINE const BYTE* -LZ4_getPosition(const BYTE* p, - const void* tableBase, tableType_t tableType) -{ - U32 const h = LZ4_hashPosition(p, tableType); - return LZ4_getPositionOnHash(h, tableBase, tableType); -} - -LZ4_FORCE_INLINE void -LZ4_prepareTable(LZ4_stream_t_internal* const cctx, - const int inputSize, - const tableType_t tableType) { - /* If the table hasn't been used, it's guaranteed to be zeroed out, and is - * therefore safe to use no matter what mode we're in. Otherwise, we figure - * out if it's safe to leave as is or whether it needs to be reset. - */ - if ((tableType_t)cctx->tableType != clearedTable) { - assert(inputSize >= 0); - if ((tableType_t)cctx->tableType != tableType - || ((tableType == byU16) && cctx->currentOffset + (unsigned)inputSize >= 0xFFFFU) - || ((tableType == byU32) && cctx->currentOffset > 1 GB) - || tableType == byPtr - || inputSize >= 4 KB) - { - DEBUGLOG(4, "LZ4_prepareTable: Resetting table in %p", cctx); - MEM_INIT(cctx->hashTable, 0, LZ4_HASHTABLESIZE); - cctx->currentOffset = 0; - cctx->tableType = (U32)clearedTable; - } else { - DEBUGLOG(4, "LZ4_prepareTable: Re-use hash table (no reset)"); - } - } - - /* Adding a gap, so all previous entries are > LZ4_DISTANCE_MAX back, - * is faster than compressing without a gap. - * However, compressing with currentOffset == 0 is faster still, - * so we preserve that case. - */ - if (cctx->currentOffset != 0 && tableType == byU32) { - DEBUGLOG(5, "LZ4_prepareTable: adding 64KB to currentOffset"); - cctx->currentOffset += 64 KB; - } - - /* Finally, clear history */ - cctx->dictCtx = NULL; - cctx->dictionary = NULL; - cctx->dictSize = 0; -} - -/** LZ4_compress_generic_validated() : - * inlined, to ensure branches are decided at compilation time. - * The following conditions are presumed already validated: - * - source != NULL - * - inputSize > 0 - */ -LZ4_FORCE_INLINE int LZ4_compress_generic_validated( - LZ4_stream_t_internal* const cctx, - const char* const source, - char* const dest, - const int inputSize, - int* inputConsumed, /* only written when outputDirective == fillOutput */ - const int maxOutputSize, - const limitedOutput_directive outputDirective, - const tableType_t tableType, - const dict_directive dictDirective, - const dictIssue_directive dictIssue, - const int acceleration) -{ - int result; - const BYTE* ip = (const BYTE*)source; - - U32 const startIndex = cctx->currentOffset; - const BYTE* base = (const BYTE*)source - startIndex; - const BYTE* lowLimit; - - const LZ4_stream_t_internal* dictCtx = (const LZ4_stream_t_internal*) cctx->dictCtx; - const BYTE* const dictionary = - dictDirective == usingDictCtx ? dictCtx->dictionary : cctx->dictionary; - const U32 dictSize = - dictDirective == usingDictCtx ? dictCtx->dictSize : cctx->dictSize; - const U32 dictDelta = - (dictDirective == usingDictCtx) ? startIndex - dictCtx->currentOffset : 0; /* make indexes in dictCtx comparable with indexes in current context */ - - int const maybe_extMem = (dictDirective == usingExtDict) || (dictDirective == usingDictCtx); - U32 const prefixIdxLimit = startIndex - dictSize; /* used when dictDirective == dictSmall */ - const BYTE* const dictEnd = dictionary ? dictionary + dictSize : dictionary; - const BYTE* anchor = (const BYTE*) source; - const BYTE* const iend = ip + inputSize; - const BYTE* const mflimitPlusOne = iend - MFLIMIT + 1; - const BYTE* const matchlimit = iend - LASTLITERALS; - - /* the dictCtx currentOffset is indexed on the start of the dictionary, - * while a dictionary in the current context precedes the currentOffset */ - const BYTE* dictBase = (dictionary == NULL) ? NULL : - (dictDirective == usingDictCtx) ? - dictionary + dictSize - dictCtx->currentOffset : - dictionary + dictSize - startIndex; - - BYTE* op = (BYTE*) dest; - BYTE* const olimit = op + maxOutputSize; - - U32 offset = 0; - U32 forwardH; - - DEBUGLOG(5, "LZ4_compress_generic_validated: srcSize=%i, tableType=%u", inputSize, tableType); - assert(ip != NULL); - if (tableType == byU16) assert(inputSize= 1); - - lowLimit = (const BYTE*)source - (dictDirective == withPrefix64k ? dictSize : 0); - - /* Update context state */ - if (dictDirective == usingDictCtx) { - /* Subsequent linked blocks can't use the dictionary. */ - /* Instead, they use the block we just compressed. */ - cctx->dictCtx = NULL; - cctx->dictSize = (U32)inputSize; - } else { - cctx->dictSize += (U32)inputSize; - } - cctx->currentOffset += (U32)inputSize; - cctx->tableType = (U32)tableType; - - if (inputSizehashTable, byPtr); - } else { - LZ4_putIndexOnHash(startIndex, h, cctx->hashTable, tableType); - } } - ip++; forwardH = LZ4_hashPosition(ip, tableType); - - /* Main Loop */ - for ( ; ; ) { - const BYTE* match; - BYTE* token; - const BYTE* filledIp; - - /* Find a match */ - if (tableType == byPtr) { - const BYTE* forwardIp = ip; - int step = 1; - int searchMatchNb = acceleration << LZ4_skipTrigger; - do { - U32 const h = forwardH; - ip = forwardIp; - forwardIp += step; - step = (searchMatchNb++ >> LZ4_skipTrigger); - - if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; - assert(ip < mflimitPlusOne); - - match = LZ4_getPositionOnHash(h, cctx->hashTable, tableType); - forwardH = LZ4_hashPosition(forwardIp, tableType); - LZ4_putPositionOnHash(ip, h, cctx->hashTable, tableType); - - } while ( (match+LZ4_DISTANCE_MAX < ip) - || (LZ4_read32(match) != LZ4_read32(ip)) ); - - } else { /* byU32, byU16 */ - - const BYTE* forwardIp = ip; - int step = 1; - int searchMatchNb = acceleration << LZ4_skipTrigger; - do { - U32 const h = forwardH; - U32 const current = (U32)(forwardIp - base); - U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); - assert(matchIndex <= current); - assert(forwardIp - base < (ptrdiff_t)(2 GB - 1)); - ip = forwardIp; - forwardIp += step; - step = (searchMatchNb++ >> LZ4_skipTrigger); - - if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; - assert(ip < mflimitPlusOne); - - if (dictDirective == usingDictCtx) { - if (matchIndex < startIndex) { - /* there was no match, try the dictionary */ - assert(tableType == byU32); - matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); - match = dictBase + matchIndex; - matchIndex += dictDelta; /* make dictCtx index comparable with current context */ - lowLimit = dictionary; - } else { - match = base + matchIndex; - lowLimit = (const BYTE*)source; - } - } else if (dictDirective == usingExtDict) { - if (matchIndex < startIndex) { - DEBUGLOG(7, "extDict candidate: matchIndex=%5u < startIndex=%5u", matchIndex, startIndex); - assert(startIndex - matchIndex >= MINMATCH); - assert(dictBase); - match = dictBase + matchIndex; - lowLimit = dictionary; - } else { - match = base + matchIndex; - lowLimit = (const BYTE*)source; - } - } else { /* single continuous memory segment */ - match = base + matchIndex; - } - forwardH = LZ4_hashPosition(forwardIp, tableType); - LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); - - DEBUGLOG(7, "candidate at pos=%u (offset=%u \n", matchIndex, current - matchIndex); - if ((dictIssue == dictSmall) && (matchIndex < prefixIdxLimit)) { continue; } /* match outside of valid area */ - assert(matchIndex < current); - if ( ((tableType != byU16) || (LZ4_DISTANCE_MAX < LZ4_DISTANCE_ABSOLUTE_MAX)) - && (matchIndex+LZ4_DISTANCE_MAX < current)) { - continue; - } /* too far */ - assert((current - matchIndex) <= LZ4_DISTANCE_MAX); /* match now expected within distance */ - - if (LZ4_read32(match) == LZ4_read32(ip)) { - if (maybe_extMem) offset = current - matchIndex; - break; /* match found */ - } - - } while(1); - } - - /* Catch up */ - filledIp = ip; - assert(ip > anchor); /* this is always true as ip has been advanced before entering the main loop */ - if ((match > lowLimit) && unlikely(ip[-1] == match[-1])) { - do { ip--; match--; } while (((ip > anchor) & (match > lowLimit)) && (unlikely(ip[-1] == match[-1]))); - } - - /* Encode Literals */ - { unsigned const litLength = (unsigned)(ip - anchor); - token = op++; - if ((outputDirective == limitedOutput) && /* Check output buffer overflow */ - (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength/255) > olimit)) ) { - return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ - } - if ((outputDirective == fillOutput) && - (unlikely(op + (litLength+240)/255 /* litlen */ + litLength /* literals */ + 2 /* offset */ + 1 /* token */ + MFLIMIT - MINMATCH /* min last literals so last match is <= end - MFLIMIT */ > olimit))) { - op--; - goto _last_literals; - } - if (litLength >= RUN_MASK) { - int len = (int)(litLength - RUN_MASK); - *token = (RUN_MASK<= 255 ; len-=255) *op++ = 255; - *op++ = (BYTE)len; - } - else *token = (BYTE)(litLength< olimit)) { - /* the match was too close to the end, rewind and go to last literals */ - op = token; - goto _last_literals; - } - - /* Encode Offset */ - if (maybe_extMem) { /* static test */ - DEBUGLOG(6, " with offset=%u (ext if > %i)", offset, (int)(ip - (const BYTE*)source)); - assert(offset <= LZ4_DISTANCE_MAX && offset > 0); - LZ4_writeLE16(op, (U16)offset); op+=2; - } else { - DEBUGLOG(6, " with offset=%u (same segment)", (U32)(ip - match)); - assert(ip-match <= LZ4_DISTANCE_MAX); - LZ4_writeLE16(op, (U16)(ip - match)); op+=2; - } - - /* Encode MatchLength */ - { unsigned matchCode; - - if ( (dictDirective==usingExtDict || dictDirective==usingDictCtx) - && (lowLimit==dictionary) /* match within extDict */ ) { - const BYTE* limit = ip + (dictEnd-match); - assert(dictEnd > match); - if (limit > matchlimit) limit = matchlimit; - matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, limit); - ip += (size_t)matchCode + MINMATCH; - if (ip==limit) { - unsigned const more = LZ4_count(limit, (const BYTE*)source, matchlimit); - matchCode += more; - ip += more; - } - DEBUGLOG(6, " with matchLength=%u starting in extDict", matchCode+MINMATCH); - } else { - matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit); - ip += (size_t)matchCode + MINMATCH; - DEBUGLOG(6, " with matchLength=%u", matchCode+MINMATCH); - } - - if ((outputDirective) && /* Check output buffer overflow */ - (unlikely(op + (1 + LASTLITERALS) + (matchCode+240)/255 > olimit)) ) { - if (outputDirective == fillOutput) { - /* Match description too long : reduce it */ - U32 newMatchCode = 15 /* in token */ - 1 /* to avoid needing a zero byte */ + ((U32)(olimit - op) - 1 - LASTLITERALS) * 255; - ip -= matchCode - newMatchCode; - assert(newMatchCode < matchCode); - matchCode = newMatchCode; - if (unlikely(ip <= filledIp)) { - /* We have already filled up to filledIp so if ip ends up less than filledIp - * we have positions in the hash table beyond the current position. This is - * a problem if we reuse the hash table. So we have to remove these positions - * from the hash table. - */ - const BYTE* ptr; - DEBUGLOG(5, "Clearing %u positions", (U32)(filledIp - ip)); - for (ptr = ip; ptr <= filledIp; ++ptr) { - U32 const h = LZ4_hashPosition(ptr, tableType); - LZ4_clearHash(h, cctx->hashTable, tableType); - } - } - } else { - assert(outputDirective == limitedOutput); - return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ - } - } - if (matchCode >= ML_MASK) { - *token += ML_MASK; - matchCode -= ML_MASK; - LZ4_write32(op, 0xFFFFFFFF); - while (matchCode >= 4*255) { - op+=4; - LZ4_write32(op, 0xFFFFFFFF); - matchCode -= 4*255; - } - op += matchCode / 255; - *op++ = (BYTE)(matchCode % 255); - } else - *token += (BYTE)(matchCode); - } - /* Ensure we have enough space for the last literals. */ - assert(!(outputDirective == fillOutput && op + 1 + LASTLITERALS > olimit)); - - anchor = ip; - - /* Test end of chunk */ - if (ip >= mflimitPlusOne) break; - - /* Fill table */ - { U32 const h = LZ4_hashPosition(ip-2, tableType); - if (tableType == byPtr) { - LZ4_putPositionOnHash(ip-2, h, cctx->hashTable, byPtr); - } else { - U32 const idx = (U32)((ip-2) - base); - LZ4_putIndexOnHash(idx, h, cctx->hashTable, tableType); - } } - - /* Test next position */ - if (tableType == byPtr) { - - match = LZ4_getPosition(ip, cctx->hashTable, tableType); - LZ4_putPosition(ip, cctx->hashTable, tableType); - if ( (match+LZ4_DISTANCE_MAX >= ip) - && (LZ4_read32(match) == LZ4_read32(ip)) ) - { token=op++; *token=0; goto _next_match; } - - } else { /* byU32, byU16 */ - - U32 const h = LZ4_hashPosition(ip, tableType); - U32 const current = (U32)(ip-base); - U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); - assert(matchIndex < current); - if (dictDirective == usingDictCtx) { - if (matchIndex < startIndex) { - /* there was no match, try the dictionary */ - assert(tableType == byU32); - matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); - match = dictBase + matchIndex; - lowLimit = dictionary; /* required for match length counter */ - matchIndex += dictDelta; - } else { - match = base + matchIndex; - lowLimit = (const BYTE*)source; /* required for match length counter */ - } - } else if (dictDirective==usingExtDict) { - if (matchIndex < startIndex) { - assert(dictBase); - match = dictBase + matchIndex; - lowLimit = dictionary; /* required for match length counter */ - } else { - match = base + matchIndex; - lowLimit = (const BYTE*)source; /* required for match length counter */ - } - } else { /* single memory segment */ - match = base + matchIndex; - } - LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); - assert(matchIndex < current); - if ( ((dictIssue==dictSmall) ? (matchIndex >= prefixIdxLimit) : 1) - && (((tableType==byU16) && (LZ4_DISTANCE_MAX == LZ4_DISTANCE_ABSOLUTE_MAX)) ? 1 : (matchIndex+LZ4_DISTANCE_MAX >= current)) - && (LZ4_read32(match) == LZ4_read32(ip)) ) { - token=op++; - *token=0; - if (maybe_extMem) offset = current - matchIndex; - DEBUGLOG(6, "seq.start:%i, literals=%u, match.start:%i", - (int)(anchor-(const BYTE*)source), 0, (int)(ip-(const BYTE*)source)); - goto _next_match; - } - } - - /* Prepare next loop */ - forwardH = LZ4_hashPosition(++ip, tableType); - - } - -_last_literals: - /* Encode Last Literals */ - { size_t lastRun = (size_t)(iend - anchor); - if ( (outputDirective) && /* Check output buffer overflow */ - (op + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > olimit)) { - if (outputDirective == fillOutput) { - /* adapt lastRun to fill 'dst' */ - assert(olimit >= op); - lastRun = (size_t)(olimit-op) - 1/*token*/; - lastRun -= (lastRun + 256 - RUN_MASK) / 256; /*additional length tokens*/ - } else { - assert(outputDirective == limitedOutput); - return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ - } - } - DEBUGLOG(6, "Final literal run : %i literals", (int)lastRun); - if (lastRun >= RUN_MASK) { - size_t accumulator = lastRun - RUN_MASK; - *op++ = RUN_MASK << ML_BITS; - for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; - *op++ = (BYTE) accumulator; - } else { - *op++ = (BYTE)(lastRun< 0); - DEBUGLOG(5, "LZ4_compress_generic: compressed %i bytes into %i bytes", inputSize, result); - return result; -} - -/** LZ4_compress_generic() : - * inlined, to ensure branches are decided at compilation time; - * takes care of src == (NULL, 0) - * and forward the rest to LZ4_compress_generic_validated */ -LZ4_FORCE_INLINE int LZ4_compress_generic( - LZ4_stream_t_internal* const cctx, - const char* const src, - char* const dst, - const int srcSize, - int *inputConsumed, /* only written when outputDirective == fillOutput */ - const int dstCapacity, - const limitedOutput_directive outputDirective, - const tableType_t tableType, - const dict_directive dictDirective, - const dictIssue_directive dictIssue, - const int acceleration) -{ - DEBUGLOG(5, "LZ4_compress_generic: srcSize=%i, dstCapacity=%i", - srcSize, dstCapacity); - - if ((U32)srcSize > (U32)LZ4_MAX_INPUT_SIZE) { return 0; } /* Unsupported srcSize, too large (or negative) */ - if (srcSize == 0) { /* src == NULL supported if srcSize == 0 */ - if (outputDirective != notLimited && dstCapacity <= 0) return 0; /* no output, can't write anything */ - DEBUGLOG(5, "Generating an empty block"); - assert(outputDirective == notLimited || dstCapacity >= 1); - assert(dst != NULL); - dst[0] = 0; - if (outputDirective == fillOutput) { - assert (inputConsumed != NULL); - *inputConsumed = 0; - } - return 1; - } - assert(src != NULL); - - return LZ4_compress_generic_validated(cctx, src, dst, srcSize, - inputConsumed, /* only written into if outputDirective == fillOutput */ - dstCapacity, outputDirective, - tableType, dictDirective, dictIssue, acceleration); -} - - -int LZ4_compress_fast_extState(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) -{ - LZ4_stream_t_internal* const ctx = & LZ4_initStream(state, sizeof(LZ4_stream_t)) -> internal_donotuse; - assert(ctx != NULL); - if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; - if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; - if (maxOutputSize >= LZ4_compressBound(inputSize)) { - if (inputSize < LZ4_64Klimit) { - return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, byU16, noDict, noDictIssue, acceleration); - } else { - const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; - return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); - } - } else { - if (inputSize < LZ4_64Klimit) { - return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); - } else { - const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; - return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, noDict, noDictIssue, acceleration); - } - } -} - -/** - * LZ4_compress_fast_extState_fastReset() : - * A variant of LZ4_compress_fast_extState(). - * - * Using this variant avoids an expensive initialization step. It is only safe - * to call if the state buffer is known to be correctly initialized already - * (see comment in lz4.h on LZ4_resetStream_fast() for a definition of - * "correctly initialized"). - */ -int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration) -{ - LZ4_stream_t_internal* const ctx = &((LZ4_stream_t*)state)->internal_donotuse; - if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; - if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; - assert(ctx != NULL); - - if (dstCapacity >= LZ4_compressBound(srcSize)) { - if (srcSize < LZ4_64Klimit) { - const tableType_t tableType = byU16; - LZ4_prepareTable(ctx, srcSize, tableType); - if (ctx->currentOffset) { - return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, dictSmall, acceleration); - } else { - return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); - } - } else { - const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; - LZ4_prepareTable(ctx, srcSize, tableType); - return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); - } - } else { - if (srcSize < LZ4_64Klimit) { - const tableType_t tableType = byU16; - LZ4_prepareTable(ctx, srcSize, tableType); - if (ctx->currentOffset) { - return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, dictSmall, acceleration); - } else { - return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); - } - } else { - const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; - LZ4_prepareTable(ctx, srcSize, tableType); - return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); - } - } -} - - -int LZ4_compress_fast(const char* src, char* dest, int srcSize, int dstCapacity, int acceleration) -{ - int result; -#if (LZ4_HEAPMODE) - LZ4_stream_t* const ctxPtr = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ - if (ctxPtr == NULL) return 0; -#else - LZ4_stream_t ctx; - LZ4_stream_t* const ctxPtr = &ctx; -#endif - result = LZ4_compress_fast_extState(ctxPtr, src, dest, srcSize, dstCapacity, acceleration); - -#if (LZ4_HEAPMODE) - FREEMEM(ctxPtr); -#endif - return result; -} - - -int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity) -{ - return LZ4_compress_fast(src, dst, srcSize, dstCapacity, 1); -} - - -/* Note!: This function leaves the stream in an unclean/broken state! - * It is not safe to subsequently use the same state with a _fastReset() or - * _continue() call without resetting it. */ -static int LZ4_compress_destSize_extState (LZ4_stream_t* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize) -{ - void* const s = LZ4_initStream(state, sizeof (*state)); - assert(s != NULL); (void)s; - - if (targetDstSize >= LZ4_compressBound(*srcSizePtr)) { /* compression success is guaranteed */ - return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, 1); - } else { - if (*srcSizePtr < LZ4_64Klimit) { - return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, byU16, noDict, noDictIssue, 1); - } else { - tableType_t const addrMode = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; - return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, addrMode, noDict, noDictIssue, 1); - } } -} - - -int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize) -{ -#if (LZ4_HEAPMODE) - LZ4_stream_t* const ctx = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ - if (ctx == NULL) return 0; -#else - LZ4_stream_t ctxBody; - LZ4_stream_t* const ctx = &ctxBody; -#endif - - int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize); - -#if (LZ4_HEAPMODE) - FREEMEM(ctx); -#endif - return result; -} - - - -/*-****************************** -* Streaming functions -********************************/ - -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -LZ4_stream_t* LZ4_createStream(void) -{ - LZ4_stream_t* const lz4s = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); - LZ4_STATIC_ASSERT(sizeof(LZ4_stream_t) >= sizeof(LZ4_stream_t_internal)); - DEBUGLOG(4, "LZ4_createStream %p", lz4s); - if (lz4s == NULL) return NULL; - LZ4_initStream(lz4s, sizeof(*lz4s)); - return lz4s; -} -#endif - -static size_t LZ4_stream_t_alignment(void) -{ -#if LZ4_ALIGN_TEST - typedef struct { char c; LZ4_stream_t t; } t_a; - return sizeof(t_a) - sizeof(LZ4_stream_t); -#else - return 1; /* effectively disabled */ -#endif -} - -LZ4_stream_t* LZ4_initStream (void* buffer, size_t size) -{ - DEBUGLOG(5, "LZ4_initStream"); - if (buffer == NULL) { return NULL; } - if (size < sizeof(LZ4_stream_t)) { return NULL; } - if (!LZ4_isAligned(buffer, LZ4_stream_t_alignment())) return NULL; - MEM_INIT(buffer, 0, sizeof(LZ4_stream_t_internal)); - return (LZ4_stream_t*)buffer; -} - -/* resetStream is now deprecated, - * prefer initStream() which is more general */ -void LZ4_resetStream (LZ4_stream_t* LZ4_stream) -{ - DEBUGLOG(5, "LZ4_resetStream (ctx:%p)", LZ4_stream); - MEM_INIT(LZ4_stream, 0, sizeof(LZ4_stream_t_internal)); -} - -void LZ4_resetStream_fast(LZ4_stream_t* ctx) { - LZ4_prepareTable(&(ctx->internal_donotuse), 0, byU32); -} - -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -int LZ4_freeStream (LZ4_stream_t* LZ4_stream) -{ - if (!LZ4_stream) return 0; /* support free on NULL */ - DEBUGLOG(5, "LZ4_freeStream %p", LZ4_stream); - FREEMEM(LZ4_stream); - return (0); -} -#endif - - -#define HASH_UNIT sizeof(reg_t) -int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) -{ - LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; - const tableType_t tableType = byU32; - const BYTE* p = (const BYTE*)dictionary; - const BYTE* const dictEnd = p + dictSize; - U32 idx32; - - DEBUGLOG(4, "LZ4_loadDict (%i bytes from %p into %p)", dictSize, dictionary, LZ4_dict); - - /* It's necessary to reset the context, - * and not just continue it with prepareTable() - * to avoid any risk of generating overflowing matchIndex - * when compressing using this dictionary */ - LZ4_resetStream(LZ4_dict); - - /* We always increment the offset by 64 KB, since, if the dict is longer, - * we truncate it to the last 64k, and if it's shorter, we still want to - * advance by a whole window length so we can provide the guarantee that - * there are only valid offsets in the window, which allows an optimization - * in LZ4_compress_fast_continue() where it uses noDictIssue even when the - * dictionary isn't a full 64k. */ - dict->currentOffset += 64 KB; - - if (dictSize < (int)HASH_UNIT) { - return 0; - } - - if ((dictEnd - p) > 64 KB) p = dictEnd - 64 KB; - dict->dictionary = p; - dict->dictSize = (U32)(dictEnd - p); - dict->tableType = (U32)tableType; - idx32 = dict->currentOffset - dict->dictSize; - - while (p <= dictEnd-HASH_UNIT) { - U32 const h = LZ4_hashPosition(p, tableType); - LZ4_putIndexOnHash(idx32, h, dict->hashTable, tableType); - p+=3; idx32+=3; - } - - return (int)dict->dictSize; -} - -void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream) -{ - const LZ4_stream_t_internal* dictCtx = (dictionaryStream == NULL) ? NULL : - &(dictionaryStream->internal_donotuse); - - DEBUGLOG(4, "LZ4_attach_dictionary (%p, %p, size %u)", - workingStream, dictionaryStream, - dictCtx != NULL ? dictCtx->dictSize : 0); - - if (dictCtx != NULL) { - /* If the current offset is zero, we will never look in the - * external dictionary context, since there is no value a table - * entry can take that indicate a miss. In that case, we need - * to bump the offset to something non-zero. - */ - if (workingStream->internal_donotuse.currentOffset == 0) { - workingStream->internal_donotuse.currentOffset = 64 KB; - } - - /* Don't actually attach an empty dictionary. - */ - if (dictCtx->dictSize == 0) { - dictCtx = NULL; - } - } - workingStream->internal_donotuse.dictCtx = dictCtx; -} - - -static void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, int nextSize) -{ - assert(nextSize >= 0); - if (LZ4_dict->currentOffset + (unsigned)nextSize > 0x80000000) { /* potential ptrdiff_t overflow (32-bits mode) */ - /* rescale hash table */ - U32 const delta = LZ4_dict->currentOffset - 64 KB; - const BYTE* dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize; - int i; - DEBUGLOG(4, "LZ4_renormDictT"); - for (i=0; ihashTable[i] < delta) LZ4_dict->hashTable[i]=0; - else LZ4_dict->hashTable[i] -= delta; - } - LZ4_dict->currentOffset = 64 KB; - if (LZ4_dict->dictSize > 64 KB) LZ4_dict->dictSize = 64 KB; - LZ4_dict->dictionary = dictEnd - LZ4_dict->dictSize; - } -} - - -int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, - const char* source, char* dest, - int inputSize, int maxOutputSize, - int acceleration) -{ - const tableType_t tableType = byU32; - LZ4_stream_t_internal* const streamPtr = &LZ4_stream->internal_donotuse; - const char* dictEnd = streamPtr->dictSize ? (const char*)streamPtr->dictionary + streamPtr->dictSize : NULL; - - DEBUGLOG(5, "LZ4_compress_fast_continue (inputSize=%i, dictSize=%u)", inputSize, streamPtr->dictSize); - - LZ4_renormDictT(streamPtr, inputSize); /* fix index overflow */ - if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; - if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; - - /* invalidate tiny dictionaries */ - if ( (streamPtr->dictSize < 4) /* tiny dictionary : not enough for a hash */ - && (dictEnd != source) /* prefix mode */ - && (inputSize > 0) /* tolerance : don't lose history, in case next invocation would use prefix mode */ - && (streamPtr->dictCtx == NULL) /* usingDictCtx */ - ) { - DEBUGLOG(5, "LZ4_compress_fast_continue: dictSize(%u) at addr:%p is too small", streamPtr->dictSize, streamPtr->dictionary); - /* remove dictionary existence from history, to employ faster prefix mode */ - streamPtr->dictSize = 0; - streamPtr->dictionary = (const BYTE*)source; - dictEnd = source; - } - - /* Check overlapping input/dictionary space */ - { const char* const sourceEnd = source + inputSize; - if ((sourceEnd > (const char*)streamPtr->dictionary) && (sourceEnd < dictEnd)) { - streamPtr->dictSize = (U32)(dictEnd - sourceEnd); - if (streamPtr->dictSize > 64 KB) streamPtr->dictSize = 64 KB; - if (streamPtr->dictSize < 4) streamPtr->dictSize = 0; - streamPtr->dictionary = (const BYTE*)dictEnd - streamPtr->dictSize; - } - } - - /* prefix mode : source data follows dictionary */ - if (dictEnd == source) { - if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) - return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, dictSmall, acceleration); - else - return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, noDictIssue, acceleration); - } - - /* external dictionary mode */ - { int result; - if (streamPtr->dictCtx) { - /* We depend here on the fact that dictCtx'es (produced by - * LZ4_loadDict) guarantee that their tables contain no references - * to offsets between dictCtx->currentOffset - 64 KB and - * dictCtx->currentOffset - dictCtx->dictSize. This makes it safe - * to use noDictIssue even when the dict isn't a full 64 KB. - */ - if (inputSize > 4 KB) { - /* For compressing large blobs, it is faster to pay the setup - * cost to copy the dictionary's tables into the active context, - * so that the compression loop is only looking into one table. - */ - LZ4_memcpy(streamPtr, streamPtr->dictCtx, sizeof(*streamPtr)); - result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); - } else { - result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingDictCtx, noDictIssue, acceleration); - } - } else { /* small data <= 4 KB */ - if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { - result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, dictSmall, acceleration); - } else { - result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); - } - } - streamPtr->dictionary = (const BYTE*)source; - streamPtr->dictSize = (U32)inputSize; - return result; - } -} - - -/* Hidden debug function, to force-test external dictionary mode */ -int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize) -{ - LZ4_stream_t_internal* const streamPtr = &LZ4_dict->internal_donotuse; - int result; - - LZ4_renormDictT(streamPtr, srcSize); - - if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { - result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, dictSmall, 1); - } else { - result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, noDictIssue, 1); - } - - streamPtr->dictionary = (const BYTE*)source; - streamPtr->dictSize = (U32)srcSize; - - return result; -} - - -/*! LZ4_saveDict() : - * If previously compressed data block is not guaranteed to remain available at its memory location, - * save it into a safer place (char* safeBuffer). - * Note : no need to call LZ4_loadDict() afterwards, dictionary is immediately usable, - * one can therefore call LZ4_compress_fast_continue() right after. - * @return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error. - */ -int LZ4_saveDict (LZ4_stream_t* LZ4_dict, char* safeBuffer, int dictSize) -{ - LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; - - DEBUGLOG(5, "LZ4_saveDict : dictSize=%i, safeBuffer=%p", dictSize, safeBuffer); - - if ((U32)dictSize > 64 KB) { dictSize = 64 KB; } /* useless to define a dictionary > 64 KB */ - if ((U32)dictSize > dict->dictSize) { dictSize = (int)dict->dictSize; } - - if (safeBuffer == NULL) assert(dictSize == 0); - if (dictSize > 0) { - const BYTE* const previousDictEnd = dict->dictionary + dict->dictSize; - assert(dict->dictionary); - LZ4_memmove(safeBuffer, previousDictEnd - dictSize, (size_t)dictSize); - } - - dict->dictionary = (const BYTE*)safeBuffer; - dict->dictSize = (U32)dictSize; - - return dictSize; -} - - - -/*-******************************* - * Decompression functions - ********************************/ - -typedef enum { decode_full_block = 0, partial_decode = 1 } earlyEnd_directive; - -#undef MIN -#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) - - -/* variant for decompress_unsafe() - * does not know end of input - * presumes input is well formed - * note : will consume at least one byte */ -static size_t read_long_length_no_check(const BYTE** pp) -{ - size_t b, l = 0; - do { b = **pp; (*pp)++; l += b; } while (b==255); - DEBUGLOG(6, "read_long_length_no_check: +length=%zu using %zu input bytes", l, l/255 + 1) - return l; -} - -/* core decoder variant for LZ4_decompress_fast*() - * for legacy support only : these entry points are deprecated. - * - Presumes input is correctly formed (no defense vs malformed inputs) - * - Does not know input size (presume input buffer is "large enough") - * - Decompress a full block (only) - * @return : nb of bytes read from input. - * Note : this variant is not optimized for speed, just for maintenance. - * the goal is to remove support of decompress_fast*() variants by v2.0 -**/ -LZ4_FORCE_INLINE int -LZ4_decompress_unsafe_generic( - const BYTE* const istart, - BYTE* const ostart, - int decompressedSize, - - size_t prefixSize, - const BYTE* const dictStart, /* only if dict==usingExtDict */ - const size_t dictSize /* note: =0 if dictStart==NULL */ - ) -{ - const BYTE* ip = istart; - BYTE* op = (BYTE*)ostart; - BYTE* const oend = ostart + decompressedSize; - const BYTE* const prefixStart = ostart - prefixSize; - - DEBUGLOG(5, "LZ4_decompress_unsafe_generic"); - if (dictStart == NULL) assert(dictSize == 0); - - while (1) { - /* start new sequence */ - unsigned token = *ip++; - - /* literals */ - { size_t ll = token >> ML_BITS; - if (ll==15) { - /* long literal length */ - ll += read_long_length_no_check(&ip); - } - if ((size_t)(oend-op) < ll) return -1; /* output buffer overflow */ - LZ4_memmove(op, ip, ll); /* support in-place decompression */ - op += ll; - ip += ll; - if ((size_t)(oend-op) < MFLIMIT) { - if (op==oend) break; /* end of block */ - DEBUGLOG(5, "invalid: literals end at distance %zi from end of block", oend-op); - /* incorrect end of block : - * last match must start at least MFLIMIT==12 bytes before end of output block */ - return -1; - } } - - /* match */ - { size_t ml = token & 15; - size_t const offset = LZ4_readLE16(ip); - ip+=2; - - if (ml==15) { - /* long literal length */ - ml += read_long_length_no_check(&ip); - } - ml += MINMATCH; - - if ((size_t)(oend-op) < ml) return -1; /* output buffer overflow */ - - { const BYTE* match = op - offset; - - /* out of range */ - if (offset > (size_t)(op - prefixStart) + dictSize) { - DEBUGLOG(6, "offset out of range"); - return -1; - } - - /* check special case : extDict */ - if (offset > (size_t)(op - prefixStart)) { - /* extDict scenario */ - const BYTE* const dictEnd = dictStart + dictSize; - const BYTE* extMatch = dictEnd - (offset - (size_t)(op-prefixStart)); - size_t const extml = (size_t)(dictEnd - extMatch); - if (extml > ml) { - /* match entirely within extDict */ - LZ4_memmove(op, extMatch, ml); - op += ml; - ml = 0; - } else { - /* match split between extDict & prefix */ - LZ4_memmove(op, extMatch, extml); - op += extml; - ml -= extml; - } - match = prefixStart; - } - - /* match copy - slow variant, supporting overlap copy */ - { size_t u; - for (u=0; u= ipmax before start of loop. Returns initial_error if so. - * @error (output) - error code. Must be set to 0 before call. -**/ -typedef size_t Rvl_t; -static const Rvl_t rvl_error = (Rvl_t)(-1); -LZ4_FORCE_INLINE Rvl_t -read_variable_length(const BYTE** ip, const BYTE* ilimit, - int initial_check) -{ - Rvl_t s, length = 0; - assert(ip != NULL); - assert(*ip != NULL); - assert(ilimit != NULL); - if (initial_check && unlikely((*ip) >= ilimit)) { /* read limit reached */ - return rvl_error; - } - do { - s = **ip; - (*ip)++; - length += s; - if (unlikely((*ip) > ilimit)) { /* read limit reached */ - return rvl_error; - } - /* accumulator overflow detection (32-bit mode only) */ - if ((sizeof(length)<8) && unlikely(length > ((Rvl_t)(-1)/2)) ) { - return rvl_error; - } - } while (s==255); - - return length; -} - -/*! LZ4_decompress_generic() : - * This generic decompression function covers all use cases. - * It shall be instantiated several times, using different sets of directives. - * Note that it is important for performance that this function really get inlined, - * in order to remove useless branches during compilation optimization. - */ -LZ4_FORCE_INLINE int -LZ4_decompress_generic( - const char* const src, - char* const dst, - int srcSize, - int outputSize, /* If endOnInput==endOnInputSize, this value is `dstCapacity` */ - - earlyEnd_directive partialDecoding, /* full, partial */ - dict_directive dict, /* noDict, withPrefix64k, usingExtDict */ - const BYTE* const lowPrefix, /* always <= dst, == dst when no prefix */ - const BYTE* const dictStart, /* only if dict==usingExtDict */ - const size_t dictSize /* note : = 0 if noDict */ - ) -{ - if ((src == NULL) || (outputSize < 0)) { return -1; } - - { const BYTE* ip = (const BYTE*) src; - const BYTE* const iend = ip + srcSize; - - BYTE* op = (BYTE*) dst; - BYTE* const oend = op + outputSize; - BYTE* cpy; - - const BYTE* const dictEnd = (dictStart == NULL) ? NULL : dictStart + dictSize; - - const int checkOffset = (dictSize < (int)(64 KB)); - - - /* Set up the "end" pointers for the shortcut. */ - const BYTE* const shortiend = iend - 14 /*maxLL*/ - 2 /*offset*/; - const BYTE* const shortoend = oend - 14 /*maxLL*/ - 18 /*maxML*/; - - const BYTE* match; - size_t offset; - unsigned token; - size_t length; - - - DEBUGLOG(5, "LZ4_decompress_generic (srcSize:%i, dstSize:%i)", srcSize, outputSize); - - /* Special cases */ - assert(lowPrefix <= op); - if (unlikely(outputSize==0)) { - /* Empty output buffer */ - if (partialDecoding) return 0; - return ((srcSize==1) && (*ip==0)) ? 0 : -1; - } - if (unlikely(srcSize==0)) { return -1; } - - /* LZ4_FAST_DEC_LOOP: - * designed for modern OoO performance cpus, - * where copying reliably 32-bytes is preferable to an unpredictable branch. - * note : fast loop may show a regression for some client arm chips. */ -#if LZ4_FAST_DEC_LOOP - if ((oend - op) < FASTLOOP_SAFE_DISTANCE) { - DEBUGLOG(6, "skip fast decode loop"); - goto safe_decode; - } - - /* Fast loop : decode sequences as long as output < oend-FASTLOOP_SAFE_DISTANCE */ - DEBUGLOG(6, "using fast decode loop"); - while (1) { - /* Main fastloop assertion: We can always wildcopy FASTLOOP_SAFE_DISTANCE */ - assert(oend - op >= FASTLOOP_SAFE_DISTANCE); - assert(ip < iend); - token = *ip++; - length = token >> ML_BITS; /* literal length */ - - /* decode literal length */ - if (length == RUN_MASK) { - size_t const addl = read_variable_length(&ip, iend-RUN_MASK, 1); - if (addl == rvl_error) { - DEBUGLOG(6, "error reading long literal length"); - goto _output_error; - } - length += addl; - if (unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ - if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ - - /* copy literals */ - LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); - if ((op+length>oend-32) || (ip+length>iend-32)) { goto safe_literal_copy; } - LZ4_wildCopy32(op, ip, op+length); - ip += length; op += length; - } else if (ip <= iend-(16 + 1/*max lit + offset + nextToken*/)) { - /* We don't need to check oend, since we check it once for each loop below */ - DEBUGLOG(7, "copy %u bytes in a 16-bytes stripe", (unsigned)length); - /* Literals can only be <= 14, but hope compilers optimize better when copy by a register size */ - LZ4_memcpy(op, ip, 16); - ip += length; op += length; - } else { - goto safe_literal_copy; - } - - /* get offset */ - offset = LZ4_readLE16(ip); ip+=2; - DEBUGLOG(6, " offset = %zu", offset); - match = op - offset; - assert(match <= op); /* overflow check */ - - /* get matchlength */ - length = token & ML_MASK; - - if (length == ML_MASK) { - size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0); - if (addl == rvl_error) { - DEBUGLOG(6, "error reading long match length"); - goto _output_error; - } - length += addl; - length += MINMATCH; - if (unlikely((uptrval)(op)+length<(uptrval)op)) { goto _output_error; } /* overflow detection */ - if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { - goto safe_match_copy; - } - } else { - length += MINMATCH; - if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { - goto safe_match_copy; - } - - /* Fastpath check: skip LZ4_wildCopy32 when true */ - if ((dict == withPrefix64k) || (match >= lowPrefix)) { - if (offset >= 8) { - assert(match >= lowPrefix); - assert(match <= op); - assert(op + 18 <= oend); - - LZ4_memcpy(op, match, 8); - LZ4_memcpy(op+8, match+8, 8); - LZ4_memcpy(op+16, match+16, 2); - op += length; - continue; - } } } - - if ( checkOffset && (unlikely(match + dictSize < lowPrefix)) ) { - DEBUGLOG(6, "Error : pos=%zi, offset=%zi => outside buffers", op-lowPrefix, op-match); - goto _output_error; - } - /* match starting within external dictionary */ - if ((dict==usingExtDict) && (match < lowPrefix)) { - assert(dictEnd != NULL); - if (unlikely(op+length > oend-LASTLITERALS)) { - if (partialDecoding) { - DEBUGLOG(7, "partialDecoding: dictionary match, close to dstEnd"); - length = MIN(length, (size_t)(oend-op)); - } else { - DEBUGLOG(6, "end-of-block condition violated") - goto _output_error; - } } - - if (length <= (size_t)(lowPrefix-match)) { - /* match fits entirely within external dictionary : just copy */ - LZ4_memmove(op, dictEnd - (lowPrefix-match), length); - op += length; - } else { - /* match stretches into both external dictionary and current block */ - size_t const copySize = (size_t)(lowPrefix - match); - size_t const restSize = length - copySize; - LZ4_memcpy(op, dictEnd - copySize, copySize); - op += copySize; - if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ - BYTE* const endOfMatch = op + restSize; - const BYTE* copyFrom = lowPrefix; - while (op < endOfMatch) { *op++ = *copyFrom++; } - } else { - LZ4_memcpy(op, lowPrefix, restSize); - op += restSize; - } } - continue; - } - - /* copy match within block */ - cpy = op + length; - - assert((op <= oend) && (oend-op >= 32)); - if (unlikely(offset<16)) { - LZ4_memcpy_using_offset(op, match, cpy, offset); - } else { - LZ4_wildCopy32(op, match, cpy); - } - - op = cpy; /* wildcopy correction */ - } - safe_decode: -#endif - - /* Main Loop : decode remaining sequences where output < FASTLOOP_SAFE_DISTANCE */ - DEBUGLOG(6, "using safe decode loop"); - while (1) { - assert(ip < iend); - token = *ip++; - length = token >> ML_BITS; /* literal length */ - - /* A two-stage shortcut for the most common case: - * 1) If the literal length is 0..14, and there is enough space, - * enter the shortcut and copy 16 bytes on behalf of the literals - * (in the fast mode, only 8 bytes can be safely copied this way). - * 2) Further if the match length is 4..18, copy 18 bytes in a similar - * manner; but we ensure that there's enough space in the output for - * those 18 bytes earlier, upon entering the shortcut (in other words, - * there is a combined check for both stages). - */ - if ( (length != RUN_MASK) - /* strictly "less than" on input, to re-enter the loop with at least one byte */ - && likely((ip < shortiend) & (op <= shortoend)) ) { - /* Copy the literals */ - LZ4_memcpy(op, ip, 16); - op += length; ip += length; - - /* The second stage: prepare for match copying, decode full info. - * If it doesn't work out, the info won't be wasted. */ - length = token & ML_MASK; /* match length */ - offset = LZ4_readLE16(ip); ip += 2; - match = op - offset; - assert(match <= op); /* check overflow */ - - /* Do not deal with overlapping matches. */ - if ( (length != ML_MASK) - && (offset >= 8) - && (dict==withPrefix64k || match >= lowPrefix) ) { - /* Copy the match. */ - LZ4_memcpy(op + 0, match + 0, 8); - LZ4_memcpy(op + 8, match + 8, 8); - LZ4_memcpy(op +16, match +16, 2); - op += length + MINMATCH; - /* Both stages worked, load the next token. */ - continue; - } - - /* The second stage didn't work out, but the info is ready. - * Propel it right to the point of match copying. */ - goto _copy_match; - } - - /* decode literal length */ - if (length == RUN_MASK) { - size_t const addl = read_variable_length(&ip, iend-RUN_MASK, 1); - if (addl == rvl_error) { goto _output_error; } - length += addl; - if (unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ - if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ - } - -#if LZ4_FAST_DEC_LOOP - safe_literal_copy: -#endif - /* copy literals */ - cpy = op+length; - - LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); - if ((cpy>oend-MFLIMIT) || (ip+length>iend-(2+1+LASTLITERALS))) { - /* We've either hit the input parsing restriction or the output parsing restriction. - * In the normal scenario, decoding a full block, it must be the last sequence, - * otherwise it's an error (invalid input or dimensions). - * In partialDecoding scenario, it's necessary to ensure there is no buffer overflow. - */ - if (partialDecoding) { - /* Since we are partial decoding we may be in this block because of the output parsing - * restriction, which is not valid since the output buffer is allowed to be undersized. - */ - DEBUGLOG(7, "partialDecoding: copying literals, close to input or output end") - DEBUGLOG(7, "partialDecoding: literal length = %u", (unsigned)length); - DEBUGLOG(7, "partialDecoding: remaining space in dstBuffer : %i", (int)(oend - op)); - DEBUGLOG(7, "partialDecoding: remaining space in srcBuffer : %i", (int)(iend - ip)); - /* Finishing in the middle of a literals segment, - * due to lack of input. - */ - if (ip+length > iend) { - length = (size_t)(iend-ip); - cpy = op + length; - } - /* Finishing in the middle of a literals segment, - * due to lack of output space. - */ - if (cpy > oend) { - cpy = oend; - assert(op<=oend); - length = (size_t)(oend-op); - } - } else { - /* We must be on the last sequence (or invalid) because of the parsing limitations - * so check that we exactly consume the input and don't overrun the output buffer. - */ - if ((ip+length != iend) || (cpy > oend)) { - DEBUGLOG(6, "should have been last run of literals") - DEBUGLOG(6, "ip(%p) + length(%i) = %p != iend (%p)", ip, (int)length, ip+length, iend); - DEBUGLOG(6, "or cpy(%p) > oend(%p)", cpy, oend); - goto _output_error; - } - } - LZ4_memmove(op, ip, length); /* supports overlapping memory regions, for in-place decompression scenarios */ - ip += length; - op += length; - /* Necessarily EOF when !partialDecoding. - * When partialDecoding, it is EOF if we've either - * filled the output buffer or - * can't proceed with reading an offset for following match. - */ - if (!partialDecoding || (cpy == oend) || (ip >= (iend-2))) { - break; - } - } else { - LZ4_wildCopy8(op, ip, cpy); /* can overwrite up to 8 bytes beyond cpy */ - ip += length; op = cpy; - } - - /* get offset */ - offset = LZ4_readLE16(ip); ip+=2; - match = op - offset; - - /* get matchlength */ - length = token & ML_MASK; - - _copy_match: - if (length == ML_MASK) { - size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0); - if (addl == rvl_error) { goto _output_error; } - length += addl; - if (unlikely((uptrval)(op)+length<(uptrval)op)) goto _output_error; /* overflow detection */ - } - length += MINMATCH; - -#if LZ4_FAST_DEC_LOOP - safe_match_copy: -#endif - if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) goto _output_error; /* Error : offset outside buffers */ - /* match starting within external dictionary */ - if ((dict==usingExtDict) && (match < lowPrefix)) { - assert(dictEnd != NULL); - if (unlikely(op+length > oend-LASTLITERALS)) { - if (partialDecoding) length = MIN(length, (size_t)(oend-op)); - else goto _output_error; /* doesn't respect parsing restriction */ - } - - if (length <= (size_t)(lowPrefix-match)) { - /* match fits entirely within external dictionary : just copy */ - LZ4_memmove(op, dictEnd - (lowPrefix-match), length); - op += length; - } else { - /* match stretches into both external dictionary and current block */ - size_t const copySize = (size_t)(lowPrefix - match); - size_t const restSize = length - copySize; - LZ4_memcpy(op, dictEnd - copySize, copySize); - op += copySize; - if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ - BYTE* const endOfMatch = op + restSize; - const BYTE* copyFrom = lowPrefix; - while (op < endOfMatch) *op++ = *copyFrom++; - } else { - LZ4_memcpy(op, lowPrefix, restSize); - op += restSize; - } } - continue; - } - assert(match >= lowPrefix); - - /* copy match within block */ - cpy = op + length; - - /* partialDecoding : may end anywhere within the block */ - assert(op<=oend); - if (partialDecoding && (cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { - size_t const mlen = MIN(length, (size_t)(oend-op)); - const BYTE* const matchEnd = match + mlen; - BYTE* const copyEnd = op + mlen; - if (matchEnd > op) { /* overlap copy */ - while (op < copyEnd) { *op++ = *match++; } - } else { - LZ4_memcpy(op, match, mlen); - } - op = copyEnd; - if (op == oend) { break; } - continue; - } - - if (unlikely(offset<8)) { - LZ4_write32(op, 0); /* silence msan warning when offset==0 */ - op[0] = match[0]; - op[1] = match[1]; - op[2] = match[2]; - op[3] = match[3]; - match += inc32table[offset]; - LZ4_memcpy(op+4, match, 4); - match -= dec64table[offset]; - } else { - LZ4_memcpy(op, match, 8); - match += 8; - } - op += 8; - - if (unlikely(cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { - BYTE* const oCopyLimit = oend - (WILDCOPYLENGTH-1); - if (cpy > oend-LASTLITERALS) { goto _output_error; } /* Error : last LASTLITERALS bytes must be literals (uncompressed) */ - if (op < oCopyLimit) { - LZ4_wildCopy8(op, match, oCopyLimit); - match += oCopyLimit - op; - op = oCopyLimit; - } - while (op < cpy) { *op++ = *match++; } - } else { - LZ4_memcpy(op, match, 8); - if (length > 16) { LZ4_wildCopy8(op+8, match+8, cpy); } - } - op = cpy; /* wildcopy correction */ - } - - /* end of decoding */ - DEBUGLOG(5, "decoded %i bytes", (int) (((char*)op)-dst)); - return (int) (((char*)op)-dst); /* Nb of output bytes decoded */ - - /* Overflow error detected */ - _output_error: - return (int) (-(((const char*)ip)-src))-1; - } -} - - -/*===== Instantiate the API decoding functions. =====*/ - -LZ4_FORCE_O2 -int LZ4_decompress_safe(const char* source, char* dest, int compressedSize, int maxDecompressedSize) -{ - return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, - decode_full_block, noDict, - (BYTE*)dest, NULL, 0); -} - -LZ4_FORCE_O2 -int LZ4_decompress_safe_partial(const char* src, char* dst, int compressedSize, int targetOutputSize, int dstCapacity) -{ - dstCapacity = MIN(targetOutputSize, dstCapacity); - return LZ4_decompress_generic(src, dst, compressedSize, dstCapacity, - partial_decode, - noDict, (BYTE*)dst, NULL, 0); -} - -LZ4_FORCE_O2 -int LZ4_decompress_fast(const char* source, char* dest, int originalSize) -{ - DEBUGLOG(5, "LZ4_decompress_fast"); - return LZ4_decompress_unsafe_generic( - (const BYTE*)source, (BYTE*)dest, originalSize, - 0, NULL, 0); -} - -/*===== Instantiate a few more decoding cases, used more than once. =====*/ - -LZ4_FORCE_O2 /* Exported, an obsolete API function. */ -int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize) -{ - return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, - decode_full_block, withPrefix64k, - (BYTE*)dest - 64 KB, NULL, 0); -} - -LZ4_FORCE_O2 -static int LZ4_decompress_safe_partial_withPrefix64k(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity) -{ - dstCapacity = MIN(targetOutputSize, dstCapacity); - return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, - partial_decode, withPrefix64k, - (BYTE*)dest - 64 KB, NULL, 0); -} - -/* Another obsolete API function, paired with the previous one. */ -int LZ4_decompress_fast_withPrefix64k(const char* source, char* dest, int originalSize) -{ - return LZ4_decompress_unsafe_generic( - (const BYTE*)source, (BYTE*)dest, originalSize, - 64 KB, NULL, 0); -} - -LZ4_FORCE_O2 -static int LZ4_decompress_safe_withSmallPrefix(const char* source, char* dest, int compressedSize, int maxOutputSize, - size_t prefixSize) -{ - return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, - decode_full_block, noDict, - (BYTE*)dest-prefixSize, NULL, 0); -} - -LZ4_FORCE_O2 -static int LZ4_decompress_safe_partial_withSmallPrefix(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity, - size_t prefixSize) -{ - dstCapacity = MIN(targetOutputSize, dstCapacity); - return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, - partial_decode, noDict, - (BYTE*)dest-prefixSize, NULL, 0); -} - -LZ4_FORCE_O2 -int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, - int compressedSize, int maxOutputSize, - const void* dictStart, size_t dictSize) -{ - DEBUGLOG(5, "LZ4_decompress_safe_forceExtDict"); - return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, - decode_full_block, usingExtDict, - (BYTE*)dest, (const BYTE*)dictStart, dictSize); -} - -LZ4_FORCE_O2 -int LZ4_decompress_safe_partial_forceExtDict(const char* source, char* dest, - int compressedSize, int targetOutputSize, int dstCapacity, - const void* dictStart, size_t dictSize) -{ - dstCapacity = MIN(targetOutputSize, dstCapacity); - return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, - partial_decode, usingExtDict, - (BYTE*)dest, (const BYTE*)dictStart, dictSize); -} - -LZ4_FORCE_O2 -static int LZ4_decompress_fast_extDict(const char* source, char* dest, int originalSize, - const void* dictStart, size_t dictSize) -{ - return LZ4_decompress_unsafe_generic( - (const BYTE*)source, (BYTE*)dest, originalSize, - 0, (const BYTE*)dictStart, dictSize); -} - -/* The "double dictionary" mode, for use with e.g. ring buffers: the first part - * of the dictionary is passed as prefix, and the second via dictStart + dictSize. - * These routines are used only once, in LZ4_decompress_*_continue(). - */ -LZ4_FORCE_INLINE -int LZ4_decompress_safe_doubleDict(const char* source, char* dest, int compressedSize, int maxOutputSize, - size_t prefixSize, const void* dictStart, size_t dictSize) -{ - return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, - decode_full_block, usingExtDict, - (BYTE*)dest-prefixSize, (const BYTE*)dictStart, dictSize); -} - -/*===== streaming decompression functions =====*/ - -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -LZ4_streamDecode_t* LZ4_createStreamDecode(void) -{ - LZ4_STATIC_ASSERT(sizeof(LZ4_streamDecode_t) >= sizeof(LZ4_streamDecode_t_internal)); - return (LZ4_streamDecode_t*) ALLOC_AND_ZERO(sizeof(LZ4_streamDecode_t)); -} - -int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream) -{ - if (LZ4_stream == NULL) { return 0; } /* support free on NULL */ - FREEMEM(LZ4_stream); - return 0; -} -#endif - -/*! LZ4_setStreamDecode() : - * Use this function to instruct where to find the dictionary. - * This function is not necessary if previous data is still available where it was decoded. - * Loading a size of 0 is allowed (same effect as no dictionary). - * @return : 1 if OK, 0 if error - */ -int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize) -{ - LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; - lz4sd->prefixSize = (size_t)dictSize; - if (dictSize) { - assert(dictionary != NULL); - lz4sd->prefixEnd = (const BYTE*) dictionary + dictSize; - } else { - lz4sd->prefixEnd = (const BYTE*) dictionary; - } - lz4sd->externalDict = NULL; - lz4sd->extDictSize = 0; - return 1; -} - -/*! LZ4_decoderRingBufferSize() : - * when setting a ring buffer for streaming decompression (optional scenario), - * provides the minimum size of this ring buffer - * to be compatible with any source respecting maxBlockSize condition. - * Note : in a ring buffer scenario, - * blocks are presumed decompressed next to each other. - * When not enough space remains for next block (remainingSize < maxBlockSize), - * decoding resumes from beginning of ring buffer. - * @return : minimum ring buffer size, - * or 0 if there is an error (invalid maxBlockSize). - */ -int LZ4_decoderRingBufferSize(int maxBlockSize) -{ - if (maxBlockSize < 0) return 0; - if (maxBlockSize > LZ4_MAX_INPUT_SIZE) return 0; - if (maxBlockSize < 16) maxBlockSize = 16; - return LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize); -} - -/* -*_continue() : - These decoding functions allow decompression of multiple blocks in "streaming" mode. - Previously decoded blocks must still be available at the memory position where they were decoded. - If it's not possible, save the relevant part of decoded data into a safe buffer, - and indicate where it stands using LZ4_setStreamDecode() -*/ -LZ4_FORCE_O2 -int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxOutputSize) -{ - LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; - int result; - - if (lz4sd->prefixSize == 0) { - /* The first call, no dictionary yet. */ - assert(lz4sd->extDictSize == 0); - result = LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); - if (result <= 0) return result; - lz4sd->prefixSize = (size_t)result; - lz4sd->prefixEnd = (BYTE*)dest + result; - } else if (lz4sd->prefixEnd == (BYTE*)dest) { - /* They're rolling the current segment. */ - if (lz4sd->prefixSize >= 64 KB - 1) - result = LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); - else if (lz4sd->extDictSize == 0) - result = LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, - lz4sd->prefixSize); - else - result = LZ4_decompress_safe_doubleDict(source, dest, compressedSize, maxOutputSize, - lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); - if (result <= 0) return result; - lz4sd->prefixSize += (size_t)result; - lz4sd->prefixEnd += result; - } else { - /* The buffer wraps around, or they're switching to another buffer. */ - lz4sd->extDictSize = lz4sd->prefixSize; - lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; - result = LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, - lz4sd->externalDict, lz4sd->extDictSize); - if (result <= 0) return result; - lz4sd->prefixSize = (size_t)result; - lz4sd->prefixEnd = (BYTE*)dest + result; - } - - return result; -} - -LZ4_FORCE_O2 int -LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, - const char* source, char* dest, int originalSize) -{ - LZ4_streamDecode_t_internal* const lz4sd = - (assert(LZ4_streamDecode!=NULL), &LZ4_streamDecode->internal_donotuse); - int result; - - DEBUGLOG(5, "LZ4_decompress_fast_continue (toDecodeSize=%i)", originalSize); - assert(originalSize >= 0); - - if (lz4sd->prefixSize == 0) { - DEBUGLOG(5, "first invocation : no prefix nor extDict"); - assert(lz4sd->extDictSize == 0); - result = LZ4_decompress_fast(source, dest, originalSize); - if (result <= 0) return result; - lz4sd->prefixSize = (size_t)originalSize; - lz4sd->prefixEnd = (BYTE*)dest + originalSize; - } else if (lz4sd->prefixEnd == (BYTE*)dest) { - DEBUGLOG(5, "continue using existing prefix"); - result = LZ4_decompress_unsafe_generic( - (const BYTE*)source, (BYTE*)dest, originalSize, - lz4sd->prefixSize, - lz4sd->externalDict, lz4sd->extDictSize); - if (result <= 0) return result; - lz4sd->prefixSize += (size_t)originalSize; - lz4sd->prefixEnd += originalSize; - } else { - DEBUGLOG(5, "prefix becomes extDict"); - lz4sd->extDictSize = lz4sd->prefixSize; - lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; - result = LZ4_decompress_fast_extDict(source, dest, originalSize, - lz4sd->externalDict, lz4sd->extDictSize); - if (result <= 0) return result; - lz4sd->prefixSize = (size_t)originalSize; - lz4sd->prefixEnd = (BYTE*)dest + originalSize; - } - - return result; -} - - -/* -Advanced decoding functions : -*_usingDict() : - These decoding functions work the same as "_continue" ones, - the dictionary must be explicitly provided within parameters -*/ - -int LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) -{ - if (dictSize==0) - return LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); - if (dictStart+dictSize == dest) { - if (dictSize >= 64 KB - 1) { - return LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); - } - assert(dictSize >= 0); - return LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, (size_t)dictSize); - } - assert(dictSize >= 0); - return LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, dictStart, (size_t)dictSize); -} - -int LZ4_decompress_safe_partial_usingDict(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity, const char* dictStart, int dictSize) -{ - if (dictSize==0) - return LZ4_decompress_safe_partial(source, dest, compressedSize, targetOutputSize, dstCapacity); - if (dictStart+dictSize == dest) { - if (dictSize >= 64 KB - 1) { - return LZ4_decompress_safe_partial_withPrefix64k(source, dest, compressedSize, targetOutputSize, dstCapacity); - } - assert(dictSize >= 0); - return LZ4_decompress_safe_partial_withSmallPrefix(source, dest, compressedSize, targetOutputSize, dstCapacity, (size_t)dictSize); - } - assert(dictSize >= 0); - return LZ4_decompress_safe_partial_forceExtDict(source, dest, compressedSize, targetOutputSize, dstCapacity, dictStart, (size_t)dictSize); -} - -int LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSize, const char* dictStart, int dictSize) -{ - if (dictSize==0 || dictStart+dictSize == dest) - return LZ4_decompress_unsafe_generic( - (const BYTE*)source, (BYTE*)dest, originalSize, - (size_t)dictSize, NULL, 0); - assert(dictSize >= 0); - return LZ4_decompress_fast_extDict(source, dest, originalSize, dictStart, (size_t)dictSize); -} - - -/*=************************************************* -* Obsolete Functions -***************************************************/ -/* obsolete compression functions */ -int LZ4_compress_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize) -{ - return LZ4_compress_default(source, dest, inputSize, maxOutputSize); -} -int LZ4_compress(const char* src, char* dest, int srcSize) -{ - return LZ4_compress_default(src, dest, srcSize, LZ4_compressBound(srcSize)); -} -int LZ4_compress_limitedOutput_withState (void* state, const char* src, char* dst, int srcSize, int dstSize) -{ - return LZ4_compress_fast_extState(state, src, dst, srcSize, dstSize, 1); -} -int LZ4_compress_withState (void* state, const char* src, char* dst, int srcSize) -{ - return LZ4_compress_fast_extState(state, src, dst, srcSize, LZ4_compressBound(srcSize), 1); -} -int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_stream, const char* src, char* dst, int srcSize, int dstCapacity) -{ - return LZ4_compress_fast_continue(LZ4_stream, src, dst, srcSize, dstCapacity, 1); -} -int LZ4_compress_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize) -{ - return LZ4_compress_fast_continue(LZ4_stream, source, dest, inputSize, LZ4_compressBound(inputSize), 1); -} - -/* -These decompression functions are deprecated and should no longer be used. -They are only provided here for compatibility with older user programs. -- LZ4_uncompress is totally equivalent to LZ4_decompress_fast -- LZ4_uncompress_unknownOutputSize is totally equivalent to LZ4_decompress_safe -*/ -int LZ4_uncompress (const char* source, char* dest, int outputSize) -{ - return LZ4_decompress_fast(source, dest, outputSize); -} -int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize) -{ - return LZ4_decompress_safe(source, dest, isize, maxOutputSize); -} - -/* Obsolete Streaming functions */ - -int LZ4_sizeofStreamState(void) { return sizeof(LZ4_stream_t); } - -int LZ4_resetStreamState(void* state, char* inputBuffer) -{ - (void)inputBuffer; - LZ4_resetStream((LZ4_stream_t*)state); - return 0; -} - -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -void* LZ4_create (char* inputBuffer) -{ - (void)inputBuffer; - return LZ4_createStream(); -} -#endif - -char* LZ4_slideInputBuffer (void* state) -{ - /* avoid const char * -> char * conversion warning */ - return (char *)(uptrval)((LZ4_stream_t*)state)->internal_donotuse.dictionary; -} - -#endif /* LZ4_COMMONDEFS_ONLY */ - -#endif /* LV_USE_LZ4_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/lz4/lz4.h b/software/Power_Pico/Middlewares/LVGL/src/libs/lz4/lz4.h deleted file mode 100644 index ce763af..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/lz4/lz4.h +++ /dev/null @@ -1,877 +0,0 @@ -/* - * LZ4 - Fast LZ compression algorithm - * Header File - * Copyright (C) 2011-2020, Yann Collet. - - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - You can contact the author at : - - LZ4 homepage : http://www.lz4.org - - LZ4 source repository : https://github.com/lz4/lz4 -*/ - -#include "../../lv_conf_internal.h" -#if LV_USE_LZ4_INTERNAL -#if defined (__cplusplus) -extern "C" { -#endif - -/** - * LVGL's porting - */ -#include "../../lvgl.h" -#define LZ4_FREESTANDING 1 -#define LZ4_memset lv_memset -#define LZ4_memcpy lv_memcpy -#define LZ4_memmove lv_memmove - -#ifndef LZ4_H_2983827168210 -#define LZ4_H_2983827168210 - -/* --- Dependency --- */ -#include /* size_t */ - - -/** - Introduction - - LZ4 is lossless compression algorithm, providing compression speed >500 MB/s per core, - scalable with multi-cores CPU. It features an extremely fast decoder, with speed in - multiple GB/s per core, typically reaching RAM speed limits on multi-core systems. - - The LZ4 compression library provides in-memory compression and decompression functions. - It gives full buffer control to user. - Compression can be done in: - - a single step (described as Simple Functions) - - a single step, reusing a context (described in Advanced Functions) - - unbounded multiple steps (described as Streaming compression) - - lz4.h generates and decodes LZ4-compressed blocks (doc/lz4_Block_format.md). - Decompressing such a compressed block requires additional metadata. - Exact metadata depends on exact decompression function. - For the typical case of LZ4_decompress_safe(), - metadata includes block's compressed size, and maximum bound of decompressed size. - Each application is free to encode and pass such metadata in whichever way it wants. - - lz4.h only handle blocks, it cannot generate Frames. - - Blocks are different from Frames (doc/lz4_Frame_format.md). - Frames bundle both blocks and metadata in a specified manner. - Embedding metadata is required for compressed data to be self-contained and portable. - Frame format is delivered through a companion API, declared in lz4frame.h. - The `lz4` CLI can only manage frames. -*/ - -/*^*************************************************************** -* Export parameters -*****************************************************************/ -/* -* LZ4_DLL_EXPORT : -* Enable exporting of functions when building a Windows DLL -* LZ4LIB_VISIBILITY : -* Control library symbols visibility. -*/ -#ifndef LZ4LIB_VISIBILITY -# if defined(__GNUC__) && (__GNUC__ >= 4) -# define LZ4LIB_VISIBILITY __attribute__ ((visibility ("default"))) -# else -# define LZ4LIB_VISIBILITY -# endif -#endif -#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1) -# define LZ4LIB_API __declspec(dllexport) LZ4LIB_VISIBILITY -#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1) -# define LZ4LIB_API __declspec(dllimport) LZ4LIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ -#else -# define LZ4LIB_API LZ4LIB_VISIBILITY -#endif - -/*! LZ4_FREESTANDING : - * When this macro is set to 1, it enables "freestanding mode" that is - * suitable for typical freestanding environment which doesn't support - * standard C library. - * - * - LZ4_FREESTANDING is a compile-time switch. - * - It requires the following macros to be defined: - * LZ4_memcpy, LZ4_memmove, LZ4_memset. - * - It only enables LZ4/HC functions which don't use heap. - * All LZ4F_* functions are not supported. - * - See tests/freestanding.c to check its basic setup. - */ -#if defined(LZ4_FREESTANDING) && (LZ4_FREESTANDING == 1) -# define LZ4_HEAPMODE 0 -# define LZ4HC_HEAPMODE 0 -# define LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION 1 -# if !defined(LZ4_memcpy) -# error "LZ4_FREESTANDING requires macro 'LZ4_memcpy'." -# endif -# if !defined(LZ4_memset) -# error "LZ4_FREESTANDING requires macro 'LZ4_memset'." -# endif -# if !defined(LZ4_memmove) -# error "LZ4_FREESTANDING requires macro 'LZ4_memmove'." -# endif -#elif ! defined(LZ4_FREESTANDING) -# define LZ4_FREESTANDING 0 -#endif - - -/*------ Version ------*/ -#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */ -#define LZ4_VERSION_MINOR 9 /* for new (non-breaking) interface capabilities */ -#define LZ4_VERSION_RELEASE 5 /* for tweaks, bug-fixes, or development */ - -#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE) - -#define LZ4_LIB_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE -#define LZ4_QUOTE(str) #str -#define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str) -#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION) /* requires v1.7.3+ */ - -LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version; requires v1.3.0+ */ -LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; useful to check dll version; requires v1.7.5+ */ - - -/*-************************************ -* Tuning parameter -**************************************/ -#define LZ4_MEMORY_USAGE_MIN 10 -#define LZ4_MEMORY_USAGE_DEFAULT 14 -#define LZ4_MEMORY_USAGE_MAX 20 - -/*! - * LZ4_MEMORY_USAGE : - * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; ) - * Increasing memory usage improves compression ratio, at the cost of speed. - * Reduced memory usage may improve speed at the cost of ratio, thanks to better cache locality. - * Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache - */ -#ifndef LZ4_MEMORY_USAGE -# define LZ4_MEMORY_USAGE LZ4_MEMORY_USAGE_DEFAULT -#endif - -#if (LZ4_MEMORY_USAGE < LZ4_MEMORY_USAGE_MIN) -# error "LZ4_MEMORY_USAGE is too small !" -#endif - -#if (LZ4_MEMORY_USAGE > LZ4_MEMORY_USAGE_MAX) -# error "LZ4_MEMORY_USAGE is too large !" -#endif - -/*-************************************ -* Simple Functions -**************************************/ -/*! LZ4_compress_default() : - * Compresses 'srcSize' bytes from buffer 'src' - * into already allocated 'dst' buffer of size 'dstCapacity'. - * Compression is guaranteed to succeed if 'dstCapacity' >= LZ4_compressBound(srcSize). - * It also runs faster, so it's a recommended setting. - * If the function cannot compress 'src' into a more limited 'dst' budget, - * compression stops *immediately*, and the function result is zero. - * In which case, 'dst' content is undefined (invalid). - * srcSize : max supported value is LZ4_MAX_INPUT_SIZE. - * dstCapacity : size of buffer 'dst' (which must be already allocated) - * @return : the number of bytes written into buffer 'dst' (necessarily <= dstCapacity) - * or 0 if compression fails - * Note : This function is protected against buffer overflow scenarios (never writes outside 'dst' buffer, nor read outside 'source' buffer). - */ -LZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity); - -/*! LZ4_decompress_safe() : - * @compressedSize : is the exact complete size of the compressed block. - * @dstCapacity : is the size of destination buffer (which must be already allocated), - * is an upper bound of decompressed size. - * @return : the number of bytes decompressed into destination buffer (necessarily <= dstCapacity) - * If destination buffer is not large enough, decoding will stop and output an error code (negative value). - * If the source stream is detected malformed, the function will stop decoding and return a negative result. - * Note 1 : This function is protected against malicious data packets : - * it will never writes outside 'dst' buffer, nor read outside 'source' buffer, - * even if the compressed block is maliciously modified to order the decoder to do these actions. - * In such case, the decoder stops immediately, and considers the compressed block malformed. - * Note 2 : compressedSize and dstCapacity must be provided to the function, the compressed block does not contain them. - * The implementation is free to send / store / derive this information in whichever way is most beneficial. - * If there is a need for a different format which bundles together both compressed data and its metadata, consider looking at lz4frame.h instead. - */ -LZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSize, int dstCapacity); - - -/*-************************************ -* Advanced Functions -**************************************/ -#define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */ -#define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16) - -/*! LZ4_compressBound() : - Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible) - This function is primarily useful for memory allocation purposes (destination buffer size). - Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example). - Note that LZ4_compress_default() compresses faster when dstCapacity is >= LZ4_compressBound(srcSize) - inputSize : max supported value is LZ4_MAX_INPUT_SIZE - return : maximum output size in a "worst case" scenario - or 0, if input size is incorrect (too large or negative) -*/ -LZ4LIB_API int LZ4_compressBound(int inputSize); - -/*! LZ4_compress_fast() : - Same as LZ4_compress_default(), but allows selection of "acceleration" factor. - The larger the acceleration value, the faster the algorithm, but also the lesser the compression. - It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed. - An acceleration value of "1" is the same as regular LZ4_compress_default() - Values <= 0 will be replaced by LZ4_ACCELERATION_DEFAULT (currently == 1, see lz4.c). - Values > LZ4_ACCELERATION_MAX will be replaced by LZ4_ACCELERATION_MAX (currently == 65537, see lz4.c). -*/ -LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); - - -/*! LZ4_compress_fast_extState() : - * Same as LZ4_compress_fast(), using an externally allocated memory space for its state. - * Use LZ4_sizeofState() to know how much memory must be allocated, - * and allocate it on 8-bytes boundaries (using `malloc()` typically). - * Then, provide this buffer as `void* state` to compression function. - */ -LZ4LIB_API int LZ4_sizeofState(void); -LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); - - -/*! LZ4_compress_destSize() : - * Reverse the logic : compresses as much data as possible from 'src' buffer - * into already allocated buffer 'dst', of size >= 'targetDestSize'. - * This function either compresses the entire 'src' content into 'dst' if it's large enough, - * or fill 'dst' buffer completely with as much data as possible from 'src'. - * note: acceleration parameter is fixed to "default". - * - * *srcSizePtr : will be modified to indicate how many bytes where read from 'src' to fill 'dst'. - * New value is necessarily <= input value. - * @return : Nb bytes written into 'dst' (necessarily <= targetDestSize) - * or 0 if compression fails. - * - * Note : from v1.8.2 to v1.9.1, this function had a bug (fixed in v1.9.2+): - * the produced compressed content could, in specific circumstances, - * require to be decompressed into a destination buffer larger - * by at least 1 byte than the content to decompress. - * If an application uses `LZ4_compress_destSize()`, - * it's highly recommended to update liblz4 to v1.9.2 or better. - * If this can't be done or ensured, - * the receiving decompression function should provide - * a dstCapacity which is > decompressedSize, by at least 1 byte. - * See https://github.com/lz4/lz4/issues/859 for details - */ -LZ4LIB_API int LZ4_compress_destSize (const char* src, char* dst, int* srcSizePtr, int targetDstSize); - - -/*! LZ4_decompress_safe_partial() : - * Decompress an LZ4 compressed block, of size 'srcSize' at position 'src', - * into destination buffer 'dst' of size 'dstCapacity'. - * Up to 'targetOutputSize' bytes will be decoded. - * The function stops decoding on reaching this objective. - * This can be useful to boost performance - * whenever only the beginning of a block is required. - * - * @return : the number of bytes decoded in `dst` (necessarily <= targetOutputSize) - * If source stream is detected malformed, function returns a negative result. - * - * Note 1 : @return can be < targetOutputSize, if compressed block contains less data. - * - * Note 2 : targetOutputSize must be <= dstCapacity - * - * Note 3 : this function effectively stops decoding on reaching targetOutputSize, - * so dstCapacity is kind of redundant. - * This is because in older versions of this function, - * decoding operation would still write complete sequences. - * Therefore, there was no guarantee that it would stop writing at exactly targetOutputSize, - * it could write more bytes, though only up to dstCapacity. - * Some "margin" used to be required for this operation to work properly. - * Thankfully, this is no longer necessary. - * The function nonetheless keeps the same signature, in an effort to preserve API compatibility. - * - * Note 4 : If srcSize is the exact size of the block, - * then targetOutputSize can be any value, - * including larger than the block's decompressed size. - * The function will, at most, generate block's decompressed size. - * - * Note 5 : If srcSize is _larger_ than block's compressed size, - * then targetOutputSize **MUST** be <= block's decompressed size. - * Otherwise, *silent corruption will occur*. - */ -LZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcSize, int targetOutputSize, int dstCapacity); - - -/*-********************************************* -* Streaming Compression Functions -***********************************************/ -typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */ - -/** - Note about RC_INVOKED - - - RC_INVOKED is predefined symbol of rc.exe (the resource compiler which is part of MSVC/Visual Studio). - https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros - - - Since rc.exe is a legacy compiler, it truncates long symbol (> 30 chars) - and reports warning "RC4011: identifier truncated". - - - To eliminate the warning, we surround long preprocessor symbol with - "#if !defined(RC_INVOKED) ... #endif" block that means - "skip this block when rc.exe is trying to read it". -*/ -#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -LZ4LIB_API LZ4_stream_t* LZ4_createStream(void); -LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr); -#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ -#endif - -/*! LZ4_resetStream_fast() : v1.9.0+ - * Use this to prepare an LZ4_stream_t for a new chain of dependent blocks - * (e.g., LZ4_compress_fast_continue()). - * - * An LZ4_stream_t must be initialized once before usage. - * This is automatically done when created by LZ4_createStream(). - * However, should the LZ4_stream_t be simply declared on stack (for example), - * it's necessary to initialize it first, using LZ4_initStream(). - * - * After init, start any new stream with LZ4_resetStream_fast(). - * A same LZ4_stream_t can be re-used multiple times consecutively - * and compress multiple streams, - * provided that it starts each new stream with LZ4_resetStream_fast(). - * - * LZ4_resetStream_fast() is much faster than LZ4_initStream(), - * but is not compatible with memory regions containing garbage data. - * - * Note: it's only useful to call LZ4_resetStream_fast() - * in the context of streaming compression. - * The *extState* functions perform their own resets. - * Invoking LZ4_resetStream_fast() before is redundant, and even counterproductive. - */ -LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr); - -/*! LZ4_loadDict() : - * Use this function to reference a static dictionary into LZ4_stream_t. - * The dictionary must remain available during compression. - * LZ4_loadDict() triggers a reset, so any previous data will be forgotten. - * The same dictionary will have to be loaded on decompression side for successful decoding. - * Dictionary are useful for better compression of small data (KB range). - * While LZ4 accept any input as dictionary, - * results are generally better when using Zstandard's Dictionary Builder. - * Loading a size of 0 is allowed, and is the same as reset. - * @return : loaded dictionary size, in bytes (necessarily <= 64 KB) - */ -LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); - -/*! LZ4_compress_fast_continue() : - * Compress 'src' content using data from previously compressed blocks, for better compression ratio. - * 'dst' buffer must be already allocated. - * If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster. - * - * @return : size of compressed block - * or 0 if there is an error (typically, cannot fit into 'dst'). - * - * Note 1 : Each invocation to LZ4_compress_fast_continue() generates a new block. - * Each block has precise boundaries. - * Each block must be decompressed separately, calling LZ4_decompress_*() with relevant metadata. - * It's not possible to append blocks together and expect a single invocation of LZ4_decompress_*() to decompress them together. - * - * Note 2 : The previous 64KB of source data is __assumed__ to remain present, unmodified, at same address in memory ! - * - * Note 3 : When input is structured as a double-buffer, each buffer can have any size, including < 64 KB. - * Make sure that buffers are separated, by at least one byte. - * This construction ensures that each block only depends on previous block. - * - * Note 4 : If input buffer is a ring-buffer, it can have any size, including < 64 KB. - * - * Note 5 : After an error, the stream status is undefined (invalid), it can only be reset or freed. - */ -LZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); - -/*! LZ4_saveDict() : - * If last 64KB data cannot be guaranteed to remain available at its current memory location, - * save it into a safer place (char* safeBuffer). - * This is schematically equivalent to a memcpy() followed by LZ4_loadDict(), - * but is much faster, because LZ4_saveDict() doesn't need to rebuild tables. - * @return : saved dictionary size in bytes (necessarily <= maxDictSize), or 0 if error. - */ -LZ4LIB_API int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int maxDictSize); - - -/*-********************************************** -* Streaming Decompression Functions -* Bufferless synchronous API -************************************************/ -typedef union LZ4_streamDecode_u LZ4_streamDecode_t; /* tracking context */ - -/*! LZ4_createStreamDecode() and LZ4_freeStreamDecode() : - * creation / destruction of streaming decompression tracking context. - * A tracking context can be re-used multiple times. - */ -#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -LZ4LIB_API LZ4_streamDecode_t* LZ4_createStreamDecode(void); -LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream); -#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ -#endif - -/*! LZ4_setStreamDecode() : - * An LZ4_streamDecode_t context can be allocated once and re-used multiple times. - * Use this function to start decompression of a new stream of blocks. - * A dictionary can optionally be set. Use NULL or size 0 for a reset order. - * Dictionary is presumed stable : it must remain accessible and unmodified during next decompression. - * @return : 1 if OK, 0 if error - */ -LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize); - -/*! LZ4_decoderRingBufferSize() : v1.8.2+ - * Note : in a ring buffer scenario (optional), - * blocks are presumed decompressed next to each other - * up to the moment there is not enough remaining space for next block (remainingSize < maxBlockSize), - * at which stage it resumes from beginning of ring buffer. - * When setting such a ring buffer for streaming decompression, - * provides the minimum size of this ring buffer - * to be compatible with any source respecting maxBlockSize condition. - * @return : minimum ring buffer size, - * or 0 if there is an error (invalid maxBlockSize). - */ -LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize); -#define LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize) (65536 + 14 + (maxBlockSize)) /* for static allocation; maxBlockSize presumed valid */ - -/*! LZ4_decompress_safe_continue() : - * This decoding function allows decompression of consecutive blocks in "streaming" mode. - * The difference with the usual independent blocks is that - * new blocks are allowed to find references into former blocks. - * A block is an unsplittable entity, and must be presented entirely to the decompression function. - * LZ4_decompress_safe_continue() only accepts one block at a time. - * It's modeled after `LZ4_decompress_safe()` and behaves similarly. - * - * @LZ4_streamDecode : decompression state, tracking the position in memory of past data - * @compressedSize : exact complete size of one compressed block. - * @dstCapacity : size of destination buffer (which must be already allocated), - * must be an upper bound of decompressed size. - * @return : number of bytes decompressed into destination buffer (necessarily <= dstCapacity) - * If destination buffer is not large enough, decoding will stop and output an error code (negative value). - * If the source stream is detected malformed, the function will stop decoding and return a negative result. - * - * The last 64KB of previously decoded data *must* remain available and unmodified - * at the memory position where they were previously decoded. - * If less than 64KB of data has been decoded, all the data must be present. - * - * Special : if decompression side sets a ring buffer, it must respect one of the following conditions : - * - Decompression buffer size is _at least_ LZ4_decoderRingBufferSize(maxBlockSize). - * maxBlockSize is the maximum size of any single block. It can have any value > 16 bytes. - * In which case, encoding and decoding buffers do not need to be synchronized. - * Actually, data can be produced by any source compliant with LZ4 format specification, and respecting maxBlockSize. - * - Synchronized mode : - * Decompression buffer size is _exactly_ the same as compression buffer size, - * and follows exactly same update rule (block boundaries at same positions), - * and decoding function is provided with exact decompressed size of each block (exception for last block of the stream), - * _then_ decoding & encoding ring buffer can have any size, including small ones ( < 64 KB). - * - Decompression buffer is larger than encoding buffer, by a minimum of maxBlockSize more bytes. - * In which case, encoding and decoding buffers do not need to be synchronized, - * and encoding ring buffer can have any size, including small ones ( < 64 KB). - * - * Whenever these conditions are not possible, - * save the last 64KB of decoded data into a safe buffer where it can't be modified during decompression, - * then indicate where this data is saved using LZ4_setStreamDecode(), before decompressing next block. -*/ -LZ4LIB_API int -LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, - const char* src, char* dst, - int srcSize, int dstCapacity); - - -/*! LZ4_decompress_safe_usingDict() : - * Works the same as - * a combination of LZ4_setStreamDecode() followed by LZ4_decompress_safe_continue() - * However, it's stateless: it doesn't need any LZ4_streamDecode_t state. - * Dictionary is presumed stable : it must remain accessible and unmodified during decompression. - * Performance tip : Decompression speed can be substantially increased - * when dst == dictStart + dictSize. - */ -LZ4LIB_API int -LZ4_decompress_safe_usingDict(const char* src, char* dst, - int srcSize, int dstCapacity, - const char* dictStart, int dictSize); - -/*! LZ4_decompress_safe_partial_usingDict() : - * Behaves the same as LZ4_decompress_safe_partial() - * with the added ability to specify a memory segment for past data. - * Performance tip : Decompression speed can be substantially increased - * when dst == dictStart + dictSize. - */ -LZ4LIB_API int -LZ4_decompress_safe_partial_usingDict(const char* src, char* dst, - int compressedSize, - int targetOutputSize, int maxOutputSize, - const char* dictStart, int dictSize); - -#endif /* LZ4_H_2983827168210 */ - - -/*^************************************* - * !!!!!! STATIC LINKING ONLY !!!!!! - ***************************************/ - -/*-**************************************************************************** - * Experimental section - * - * Symbols declared in this section must be considered unstable. Their - * signatures or semantics may change, or they may be removed altogether in the - * future. They are therefore only safe to depend on when the caller is - * statically linked against the library. - * - * To protect against unsafe usage, not only are the declarations guarded, - * the definitions are hidden by default - * when building LZ4 as a shared/dynamic library. - * - * In order to access these declarations, - * define LZ4_STATIC_LINKING_ONLY in your application - * before including LZ4's headers. - * - * In order to make their implementations accessible dynamically, you must - * define LZ4_PUBLISH_STATIC_FUNCTIONS when building the LZ4 library. - ******************************************************************************/ - -#ifdef LZ4_STATIC_LINKING_ONLY - -#ifndef LZ4_STATIC_3504398509 -#define LZ4_STATIC_3504398509 - -#ifdef LZ4_PUBLISH_STATIC_FUNCTIONS -#define LZ4LIB_STATIC_API LZ4LIB_API -#else -#define LZ4LIB_STATIC_API -#endif - - -/*! LZ4_compress_fast_extState_fastReset() : - * A variant of LZ4_compress_fast_extState(). - * - * Using this variant avoids an expensive initialization step. - * It is only safe to call if the state buffer is known to be correctly initialized already - * (see above comment on LZ4_resetStream_fast() for a definition of "correctly initialized"). - * From a high level, the difference is that - * this function initializes the provided state with a call to something like LZ4_resetStream_fast() - * while LZ4_compress_fast_extState() starts with a call to LZ4_resetStream(). - */ -LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); - -/*! LZ4_attach_dictionary() : - * This is an experimental API that allows - * efficient use of a static dictionary many times. - * - * Rather than re-loading the dictionary buffer into a working context before - * each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a - * working LZ4_stream_t, this function introduces a no-copy setup mechanism, - * in which the working stream references the dictionary stream in-place. - * - * Several assumptions are made about the state of the dictionary stream. - * Currently, only streams which have been prepared by LZ4_loadDict() should - * be expected to work. - * - * Alternatively, the provided dictionaryStream may be NULL, - * in which case any existing dictionary stream is unset. - * - * If a dictionary is provided, it replaces any preexisting stream history. - * The dictionary contents are the only history that can be referenced and - * logically immediately precede the data compressed in the first subsequent - * compression call. - * - * The dictionary will only remain attached to the working stream through the - * first compression call, at the end of which it is cleared. The dictionary - * stream (and source buffer) must remain in-place / accessible / unchanged - * through the completion of the first compression call on the stream. - */ -LZ4LIB_STATIC_API void -LZ4_attach_dictionary(LZ4_stream_t* workingStream, - const LZ4_stream_t* dictionaryStream); - - -/*! In-place compression and decompression - * - * It's possible to have input and output sharing the same buffer, - * for highly constrained memory environments. - * In both cases, it requires input to lay at the end of the buffer, - * and decompression to start at beginning of the buffer. - * Buffer size must feature some margin, hence be larger than final size. - * - * |<------------------------buffer--------------------------------->| - * |<-----------compressed data--------->| - * |<-----------decompressed size------------------>| - * |<----margin---->| - * - * This technique is more useful for decompression, - * since decompressed size is typically larger, - * and margin is short. - * - * In-place decompression will work inside any buffer - * which size is >= LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize). - * This presumes that decompressedSize > compressedSize. - * Otherwise, it means compression actually expanded data, - * and it would be more efficient to store such data with a flag indicating it's not compressed. - * This can happen when data is not compressible (already compressed, or encrypted). - * - * For in-place compression, margin is larger, as it must be able to cope with both - * history preservation, requiring input data to remain unmodified up to LZ4_DISTANCE_MAX, - * and data expansion, which can happen when input is not compressible. - * As a consequence, buffer size requirements are much higher, - * and memory savings offered by in-place compression are more limited. - * - * There are ways to limit this cost for compression : - * - Reduce history size, by modifying LZ4_DISTANCE_MAX. - * Note that it is a compile-time constant, so all compressions will apply this limit. - * Lower values will reduce compression ratio, except when input_size < LZ4_DISTANCE_MAX, - * so it's a reasonable trick when inputs are known to be small. - * - Require the compressor to deliver a "maximum compressed size". - * This is the `dstCapacity` parameter in `LZ4_compress*()`. - * When this size is < LZ4_COMPRESSBOUND(inputSize), then compression can fail, - * in which case, the return code will be 0 (zero). - * The caller must be ready for these cases to happen, - * and typically design a backup scheme to send data uncompressed. - * The combination of both techniques can significantly reduce - * the amount of margin required for in-place compression. - * - * In-place compression can work in any buffer - * which size is >= (maxCompressedSize) - * with maxCompressedSize == LZ4_COMPRESSBOUND(srcSize) for guaranteed compression success. - * LZ4_COMPRESS_INPLACE_BUFFER_SIZE() depends on both maxCompressedSize and LZ4_DISTANCE_MAX, - * so it's possible to reduce memory requirements by playing with them. - */ - -#define LZ4_DECOMPRESS_INPLACE_MARGIN(compressedSize) (((compressedSize) >> 8) + 32) -#define LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize) ((decompressedSize) + LZ4_DECOMPRESS_INPLACE_MARGIN(decompressedSize)) /**< note: presumes that compressedSize < decompressedSize. note2: margin is overestimated a bit, since it could use compressedSize instead */ - -#ifndef LZ4_DISTANCE_MAX /* history window size; can be user-defined at compile time */ -# define LZ4_DISTANCE_MAX 65535 /* set to maximum value by default */ -#endif - -#define LZ4_COMPRESS_INPLACE_MARGIN (LZ4_DISTANCE_MAX + 32) /* LZ4_DISTANCE_MAX can be safely replaced by srcSize when it's smaller */ -#define LZ4_COMPRESS_INPLACE_BUFFER_SIZE(maxCompressedSize) ((maxCompressedSize) + LZ4_COMPRESS_INPLACE_MARGIN) /**< maxCompressedSize is generally LZ4_COMPRESSBOUND(inputSize), but can be set to any lower value, with the risk that compression can fail (return code 0(zero)) */ - -#endif /* LZ4_STATIC_3504398509 */ -#endif /* LZ4_STATIC_LINKING_ONLY */ - - - -#ifndef LZ4_H_98237428734687 -#define LZ4_H_98237428734687 - -/*-************************************************************ - * Private Definitions - ************************************************************** - * Do not use these definitions directly. - * They are only exposed to allow static allocation of `LZ4_stream_t` and `LZ4_streamDecode_t`. - * Accessing members will expose user code to API and/or ABI break in future versions of the library. - **************************************************************/ -#define LZ4_HASHLOG (LZ4_MEMORY_USAGE-2) -#define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE) -#define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */ - -#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) -# include - typedef int8_t LZ4_i8; - typedef uint8_t LZ4_byte; - typedef uint16_t LZ4_u16; - typedef uint32_t LZ4_u32; -#else - typedef signed char LZ4_i8; - typedef unsigned char LZ4_byte; - typedef unsigned short LZ4_u16; - typedef unsigned int LZ4_u32; -#endif - -/*! LZ4_stream_t : - * Never ever use below internal definitions directly ! - * These definitions are not API/ABI safe, and may change in future versions. - * If you need static allocation, declare or allocate an LZ4_stream_t object. -**/ - -typedef struct LZ4_stream_t_internal LZ4_stream_t_internal; -struct LZ4_stream_t_internal { - LZ4_u32 hashTable[LZ4_HASH_SIZE_U32]; - const LZ4_byte* dictionary; - const LZ4_stream_t_internal* dictCtx; - LZ4_u32 currentOffset; - LZ4_u32 tableType; - LZ4_u32 dictSize; - /* Implicit padding to ensure structure is aligned */ -}; - -#define LZ4_STREAM_MINSIZE ((1UL << LZ4_MEMORY_USAGE) + 32) /* static size, for inter-version compatibility */ -union LZ4_stream_u { - char minStateSize[LZ4_STREAM_MINSIZE]; - LZ4_stream_t_internal internal_donotuse; -}; /* previously typedef'd to LZ4_stream_t */ - - -/*! LZ4_initStream() : v1.9.0+ - * An LZ4_stream_t structure must be initialized at least once. - * This is automatically done when invoking LZ4_createStream(), - * but it's not when the structure is simply declared on stack (for example). - * - * Use LZ4_initStream() to properly initialize a newly declared LZ4_stream_t. - * It can also initialize any arbitrary buffer of sufficient size, - * and will @return a pointer of proper type upon initialization. - * - * Note : initialization fails if size and alignment conditions are not respected. - * In which case, the function will @return NULL. - * Note2: An LZ4_stream_t structure guarantees correct alignment and size. - * Note3: Before v1.9.0, use LZ4_resetStream() instead -**/ -LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* buffer, size_t size); - - -/*! LZ4_streamDecode_t : - * Never ever use below internal definitions directly ! - * These definitions are not API/ABI safe, and may change in future versions. - * If you need static allocation, declare or allocate an LZ4_streamDecode_t object. -**/ -typedef struct { - const LZ4_byte* externalDict; - const LZ4_byte* prefixEnd; - size_t extDictSize; - size_t prefixSize; -} LZ4_streamDecode_t_internal; - -#define LZ4_STREAMDECODE_MINSIZE 32 -union LZ4_streamDecode_u { - char minStateSize[LZ4_STREAMDECODE_MINSIZE]; - LZ4_streamDecode_t_internal internal_donotuse; -} ; /* previously typedef'd to LZ4_streamDecode_t */ - - - -/*-************************************ -* Obsolete Functions -**************************************/ - -/*! Deprecation warnings - * - * Deprecated functions make the compiler generate a warning when invoked. - * This is meant to invite users to update their source code. - * Should deprecation warnings be a problem, it is generally possible to disable them, - * typically with -Wno-deprecated-declarations for gcc - * or _CRT_SECURE_NO_WARNINGS in Visual. - * - * Another method is to define LZ4_DISABLE_DEPRECATE_WARNINGS - * before including the header file. - */ -#ifdef LZ4_DISABLE_DEPRECATE_WARNINGS -# define LZ4_DEPRECATED(message) /* disable deprecation warnings */ -#else -# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ -# define LZ4_DEPRECATED(message) [[deprecated(message)]] -# elif defined(_MSC_VER) -# define LZ4_DEPRECATED(message) __declspec(deprecated(message)) -# elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 45)) -# define LZ4_DEPRECATED(message) __attribute__((deprecated(message))) -# elif defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 31) -# define LZ4_DEPRECATED(message) __attribute__((deprecated)) -# else -# pragma message("WARNING: LZ4_DEPRECATED needs custom implementation for this compiler") -# define LZ4_DEPRECATED(message) /* disabled */ -# endif -#endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */ - -/*! Obsolete compression functions (since v1.7.3) */ -LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress (const char* src, char* dest, int srcSize); -LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress_limitedOutput (const char* src, char* dest, int srcSize, int maxOutputSize); -LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize); -LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); -LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize); -LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize); - -/*! Obsolete decompression functions (since v1.8.0) */ -LZ4_DEPRECATED("use LZ4_decompress_fast() instead") LZ4LIB_API int LZ4_uncompress (const char* source, char* dest, int outputSize); -LZ4_DEPRECATED("use LZ4_decompress_safe() instead") LZ4LIB_API int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); - -/* Obsolete streaming functions (since v1.7.0) - * degraded functionality; do not use! - * - * In order to perform streaming compression, these functions depended on data - * that is no longer tracked in the state. They have been preserved as well as - * possible: using them will still produce a correct output. However, they don't - * actually retain any history between compression calls. The compression ratio - * achieved will therefore be no better than compressing each chunk - * independently. - */ -LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API void* LZ4_create (char* inputBuffer); -LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API int LZ4_sizeofStreamState(void); -LZ4_DEPRECATED("Use LZ4_resetStream() instead") LZ4LIB_API int LZ4_resetStreamState(void* state, char* inputBuffer); -LZ4_DEPRECATED("Use LZ4_saveDict() instead") LZ4LIB_API char* LZ4_slideInputBuffer (void* state); - -/*! Obsolete streaming decoding functions (since v1.7.0) */ -LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") LZ4LIB_API int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize); -LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize); - -/*! Obsolete LZ4_decompress_fast variants (since v1.9.0) : - * These functions used to be faster than LZ4_decompress_safe(), - * but this is no longer the case. They are now slower. - * This is because LZ4_decompress_fast() doesn't know the input size, - * and therefore must progress more cautiously into the input buffer to not read beyond the end of block. - * On top of that `LZ4_decompress_fast()` is not protected vs malformed or malicious inputs, making it a security liability. - * As a consequence, LZ4_decompress_fast() is strongly discouraged, and deprecated. - * - * The last remaining LZ4_decompress_fast() specificity is that - * it can decompress a block without knowing its compressed size. - * Such functionality can be achieved in a more secure manner - * by employing LZ4_decompress_safe_partial(). - * - * Parameters: - * originalSize : is the uncompressed size to regenerate. - * `dst` must be already allocated, its size must be >= 'originalSize' bytes. - * @return : number of bytes read from source buffer (== compressed size). - * The function expects to finish at block's end exactly. - * If the source stream is detected malformed, the function stops decoding and returns a negative result. - * note : LZ4_decompress_fast*() requires originalSize. Thanks to this information, it never writes past the output buffer. - * However, since it doesn't know its 'src' size, it may read an unknown amount of input, past input buffer bounds. - * Also, since match offsets are not validated, match reads from 'src' may underflow too. - * These issues never happen if input (compressed) data is correct. - * But they may happen if input data is invalid (error or intentional tampering). - * As a consequence, use these functions in trusted environments with trusted data **only**. - */ -LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe() instead") -LZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize); -LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_continue() instead") -LZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int originalSize); -LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_usingDict() instead") -LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int originalSize, const char* dictStart, int dictSize); - -/*! LZ4_resetStream() : - * An LZ4_stream_t structure must be initialized at least once. - * This is done with LZ4_initStream(), or LZ4_resetStream(). - * Consider switching to LZ4_initStream(), - * invoking LZ4_resetStream() will trigger deprecation warnings in the future. - */ -LZ4LIB_API void LZ4_resetStream (LZ4_stream_t* streamPtr); - - -#endif /* LZ4_H_98237428734687 */ - - -#if defined (__cplusplus) -} -#endif - -#endif /* LV_USE_LZ4_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/lv_qrcode.c b/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/lv_qrcode.c deleted file mode 100644 index f4b5b54..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/lv_qrcode.c +++ /dev/null @@ -1,242 +0,0 @@ -/** - * @file lv_qrcode.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj_class_private.h" -#include "lv_qrcode_private.h" - -#if LV_USE_QRCODE - -#include "qrcodegen.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_qrcode_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_qrcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_qrcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_qrcode_class = { - .constructor_cb = lv_qrcode_constructor, - .destructor_cb = lv_qrcode_destructor, - .instance_size = sizeof(lv_qrcode_t), - .base_class = &lv_canvas_class, - .name = "qrcode", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_qrcode_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -void lv_qrcode_set_size(lv_obj_t * obj, int32_t size) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_draw_buf_t * old_buf = lv_canvas_get_draw_buf(obj); - lv_draw_buf_t * new_buf = lv_draw_buf_create(size, size, LV_COLOR_FORMAT_I1, LV_STRIDE_AUTO); - if(new_buf == NULL) { - LV_LOG_ERROR("malloc failed for canvas buffer"); - return; - } - - lv_canvas_set_draw_buf(obj, new_buf); - LV_LOG_INFO("set canvas buffer: %p, size = %d", (void *)new_buf, (int)size); - - /*Clear canvas buffer*/ - lv_draw_buf_clear(new_buf, NULL); - - if(old_buf != NULL) lv_draw_buf_destroy(old_buf); -} - -void lv_qrcode_set_dark_color(lv_obj_t * obj, lv_color_t color) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_qrcode_t * qrcode = (lv_qrcode_t *)obj; - qrcode->dark_color = color; -} - -void lv_qrcode_set_light_color(lv_obj_t * obj, lv_color_t color) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_qrcode_t * qrcode = (lv_qrcode_t *)obj; - qrcode->light_color = color; -} - -lv_result_t lv_qrcode_update(lv_obj_t * obj, const void * data, uint32_t data_len) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_qrcode_t * qrcode = (lv_qrcode_t *)obj; - - lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); - if(draw_buf == NULL) { - LV_LOG_ERROR("canvas draw buffer is NULL"); - return LV_RESULT_INVALID; - } - - lv_draw_buf_clear(draw_buf, NULL); - lv_canvas_set_palette(obj, 0, lv_color_to_32(qrcode->light_color, LV_OPA_COVER)); - lv_canvas_set_palette(obj, 1, lv_color_to_32(qrcode->dark_color, LV_OPA_COVER)); - lv_image_cache_drop(draw_buf); - - lv_obj_invalidate(obj); - - if(data_len > qrcodegen_BUFFER_LEN_MAX) return LV_RESULT_INVALID; - - int32_t qr_version = qrcodegen_getMinFitVersion(qrcodegen_Ecc_MEDIUM, data_len); - if(qr_version <= 0) return LV_RESULT_INVALID; - int32_t qr_size = qrcodegen_version2size(qr_version); - if(qr_size <= 0) return LV_RESULT_INVALID; - int32_t scale = draw_buf->header.w / qr_size; - if(scale <= 0) return LV_RESULT_INVALID; - - /* Pick the largest QR code that still maintains scale. */ - for(int32_t i = qr_version + 1; i < qrcodegen_VERSION_MAX; i++) { - if(qrcodegen_version2size(i) * scale > draw_buf->header.w) - break; - - qr_version = i; - } - qr_size = qrcodegen_version2size(qr_version); - - uint8_t * qr0 = lv_malloc(qrcodegen_BUFFER_LEN_FOR_VERSION(qr_version)); - LV_ASSERT_MALLOC(qr0); - uint8_t * data_tmp = lv_malloc(qrcodegen_BUFFER_LEN_FOR_VERSION(qr_version)); - LV_ASSERT_MALLOC(data_tmp); - lv_memcpy(data_tmp, data, data_len); - - bool ok = qrcodegen_encodeBinary(data_tmp, data_len, - qr0, qrcodegen_Ecc_MEDIUM, - qr_version, qr_version, - qrcodegen_Mask_AUTO, true); - - if(!ok) { - lv_free(qr0); - lv_free(data_tmp); - return LV_RESULT_INVALID; - } - - /* Temporarily disable invalidation to improve the efficiency of lv_canvas_set_px */ - lv_display_enable_invalidation(lv_obj_get_display(obj), false); - - int32_t obj_w = draw_buf->header.w; - qr_size = qrcodegen_getSize(qr0); - scale = obj_w / qr_size; - int scaled = qr_size * scale; - int margin = (obj_w - scaled) / 2; - uint8_t * buf_u8 = (uint8_t *)draw_buf->data + 8; /*+8 skip the palette*/ - lv_color_t c = lv_color_hex(1); - - /* Copy the qr code canvas: - * A simple `lv_canvas_set_px` would work but it's slow for so many pixels. - * So buffer 1 byte (8 px) from the qr code and set it in the canvas image */ - uint32_t row_byte_cnt = draw_buf->header.stride; - int y; - for(y = margin; y < scaled + margin; y += scale) { - uint8_t b = 0; - uint8_t p = 0; - bool aligned = false; - int x; - for(x = margin; x < scaled + margin; x++) { - bool a = qrcodegen_getModule(qr0, (x - margin) / scale, (y - margin) / scale); - - if(aligned == false && (x & 0x7) == 0) aligned = true; - - if(aligned == false) { - if(a) { - lv_canvas_set_px(obj, x, y, c, LV_OPA_COVER); - } - } - else { - if(!a) b |= (1 << (7 - p)); - p++; - if(p == 8) { - uint32_t px = row_byte_cnt * y + (x >> 3); - buf_u8[px] = ~b; - b = 0; - p = 0; - } - } - } - - /*Process the last byte of the row*/ - if(p) { - /*Make the rest of the bits white*/ - b |= (1 << (8 - p)) - 1; - - uint32_t px = row_byte_cnt * y + (x >> 3); - buf_u8[px] = ~b; - } - - /*The Qr is probably scaled so simply to the repeated rows*/ - int s; - const uint8_t * row_ori = buf_u8 + row_byte_cnt * y; - for(s = 1; s < scale; s++) { - lv_memcpy((uint8_t *)buf_u8 + row_byte_cnt * (y + s), row_ori, row_byte_cnt); - } - } - - /* invalidate the canvas to refresh it */ - lv_display_enable_invalidation(lv_obj_get_display(obj), true); - - lv_free(qr0); - lv_free(data_tmp); - return LV_RESULT_OK; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_qrcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - - /*Set default size*/ - lv_qrcode_set_size(obj, LV_DPI_DEF); - - /*Set default color*/ - lv_qrcode_set_dark_color(obj, lv_color_black()); - lv_qrcode_set_light_color(obj, lv_color_white()); -} - -static void lv_qrcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - - lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); - if(draw_buf == NULL) return; - lv_image_cache_drop(draw_buf); - - /*@fixme destroy buffer in cache free_cb.*/ - lv_draw_buf_destroy(draw_buf); -} - -#endif /*LV_USE_QRCODE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/lv_qrcode.h b/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/lv_qrcode.h deleted file mode 100644 index ba9b0e8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/lv_qrcode.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * @file lv_qrcode.h - * - */ - -#ifndef LV_QRCODE_H -#define LV_QRCODE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../misc/lv_color.h" -#include "../../misc/lv_types.h" -#include "../../widgets/canvas/lv_canvas.h" -#include LV_STDBOOL_INCLUDE -#include LV_STDINT_INCLUDE -#if LV_USE_QRCODE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_qrcode_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an empty QR code (an `lv_canvas`) object. - * @param parent point to an object where to create the QR code - * @return pointer to the created QR code object - */ -lv_obj_t * lv_qrcode_create(lv_obj_t * parent); - -/** - * Set QR code size. - * @param obj pointer to a QR code object - * @param size width and height of the QR code - */ -void lv_qrcode_set_size(lv_obj_t * obj, int32_t size); - -/** - * Set QR code dark color. - * @param obj pointer to a QR code object - * @param color dark color of the QR code - */ -void lv_qrcode_set_dark_color(lv_obj_t * obj, lv_color_t color); - -/** - * Set QR code light color. - * @param obj pointer to a QR code object - * @param color light color of the QR code - */ -void lv_qrcode_set_light_color(lv_obj_t * obj, lv_color_t color); - -/** - * Set the data of a QR code object - * @param obj pointer to a QR code object - * @param data data to display - * @param data_len length of data in bytes - * @return LV_RESULT_OK: if no error; LV_RESULT_INVALID: on error - */ -lv_result_t lv_qrcode_update(lv_obj_t * obj, const void * data, uint32_t data_len); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_QRCODE*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_QRCODE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/lv_qrcode_private.h b/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/lv_qrcode_private.h deleted file mode 100644 index b912d65..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/lv_qrcode_private.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file lv_qrcode_private.h - * - */ - -#ifndef LV_QRCODE_PRIVATE_H -#define LV_QRCODE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../widgets/canvas/lv_canvas_private.h" -#include "lv_qrcode.h" - -#if LV_USE_QRCODE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*Data of qrcode*/ -struct lv_qrcode_t { - lv_canvas_t canvas; - lv_color_t dark_color; - lv_color_t light_color; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_QRCODE */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_QRCODE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/qrcodegen.c b/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/qrcodegen.c deleted file mode 100644 index f501a24..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/qrcodegen.c +++ /dev/null @@ -1,1116 +0,0 @@ -/* - * QR Code generator library (C) - * - * Copyright (c) Project Nayuki. (MIT License) - * https://www.nayuki.io/page/qr-code-generator-library - * - * 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 "qrcodegen.h" -#include "../../misc/lv_assert.h" - -#if LV_USE_QRCODE -#include -#include -#include - -#ifndef QRCODEGEN_TEST - #define testable static // Keep functions private -#else - #define testable // Expose private functions -#endif - - -/*---- Forward declarations for private functions ----*/ - -// Regarding all public and private functions defined in this source file: -// - They require all pointer/array arguments to be not null unless the array length is zero. -// - They only read input scalar/array arguments, write to output pointer/array -// arguments, and return scalar values; they are "pure" functions. -// - They don't read mutable global variables or write to any global variables. -// - They don't perform I/O, read the clock, print to console, etc. -// - They allocate a small and constant amount of stack memory. -// - They don't allocate or free any memory on the heap. -// - They don't recurse or mutually recurse. All the code -// could be inlined into the top-level public functions. -// - They run in at most quadratic time with respect to input arguments. -// Most functions run in linear time, and some in constant time. -// There are no unbounded loops or non-obvious termination conditions. -// - They are completely thread-safe if the caller does not give the -// same writable buffer to concurrent calls to these functions. - -testable void appendBitsToBuffer(unsigned int val, int numBits, uint8_t buffer[], int * bitLen); - -testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[]); -testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl); -testable int getNumRawDataModules(int ver); - -testable void calcReedSolomonGenerator(int degree, uint8_t result[]); -testable void calcReedSolomonRemainder(const uint8_t data[], int dataLen, - const uint8_t generator[], int degree, uint8_t result[]); -testable uint8_t finiteFieldMultiply(uint8_t x, uint8_t y); - -testable void initializeFunctionModules(int version, uint8_t qrcode[]); -static void drawWhiteFunctionModules(uint8_t qrcode[], int version); -static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uint8_t qrcode[]); -testable int getAlignmentPatternPositions(int version, uint8_t result[7]); -static void fillRectangle(int left, int top, int width, int height, uint8_t qrcode[]); - -static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]); -static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask); -static long getPenaltyScore(const uint8_t qrcode[]); -static void addRunToHistory(unsigned char run, unsigned char history[7]); -static bool hasFinderLikePattern(const unsigned char runHistory[7]); - -testable bool getModule(const uint8_t qrcode[], int x, int y); -testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack); -testable void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack); -static bool getBit(int x, int i); - -testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars); -testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version); -static int numCharCountBits(enum qrcodegen_Mode mode, int version); - - - -/*---- Private tables of constants ----*/ - -// The set of all legal characters in alphanumeric mode, where each character -// value maps to the index in the string. For checking text and encoding segments. -static const char * ALPHANUMERIC_CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"; - -// For generating error correction codes. -testable const int8_t ECC_CODEWORDS_PER_BLOCK[4][41] = { - // Version: (note that index 0 is for padding, and is set to an illegal value) - //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level - {-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Low - {-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, // Medium - {-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Quartile - {-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // High -}; - -#define qrcodegen_REED_SOLOMON_DEGREE_MAX 30 // Based on the table above - -// For generating error correction codes. -testable const int8_t NUM_ERROR_CORRECTION_BLOCKS[4][41] = { - // Version: (note that index 0 is for padding, and is set to an illegal value) - //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level - {-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25}, // Low - {-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49}, // Medium - {-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68}, // Quartile - {-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81}, // High -}; - -// For automatic mask pattern selection. -static const int PENALTY_N1 = 3; -static const int PENALTY_N2 = 3; -static const int PENALTY_N3 = 40; -static const int PENALTY_N4 = 10; - - - -/*---- High-level QR Code encoding functions ----*/ - -// Public function - see documentation comment in header file. -bool qrcodegen_encodeText(const char * text, uint8_t tempBuffer[], uint8_t qrcode[], - enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) -{ - - size_t textLen = strlen(text); - if(textLen == 0) - return qrcodegen_encodeSegmentsAdvanced(NULL, 0, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode); - size_t bufLen = qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion); - - struct qrcodegen_Segment seg; - if(qrcodegen_isNumeric(text)) { - if(qrcodegen_calcSegmentBufferSize(qrcodegen_Mode_NUMERIC, textLen) > bufLen) - goto fail; - seg = qrcodegen_makeNumeric(text, tempBuffer); - } - else if(qrcodegen_isAlphanumeric(text)) { - if(qrcodegen_calcSegmentBufferSize(qrcodegen_Mode_ALPHANUMERIC, textLen) > bufLen) - goto fail; - seg = qrcodegen_makeAlphanumeric(text, tempBuffer); - } - else { - if(textLen > bufLen) - goto fail; - for(size_t i = 0; i < textLen; i++) - tempBuffer[i] = (uint8_t)text[i]; - seg.mode = qrcodegen_Mode_BYTE; - seg.bitLength = calcSegmentBitLength(seg.mode, textLen); - if(seg.bitLength == -1) - goto fail; - seg.numChars = (int)textLen; - seg.data = tempBuffer; - } - return qrcodegen_encodeSegmentsAdvanced(&seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode); - -fail: - qrcode[0] = 0; // Set size to invalid value for safety - return false; -} - - -// Public function - see documentation comment in header file. -bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcode[], - enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) -{ - - struct qrcodegen_Segment seg; - seg.mode = qrcodegen_Mode_BYTE; - seg.bitLength = calcSegmentBitLength(seg.mode, dataLen); - if(seg.bitLength == -1) { - qrcode[0] = 0; // Set size to invalid value for safety - return false; - } - seg.numChars = (int)dataLen; - seg.data = dataAndTemp; - return qrcodegen_encodeSegmentsAdvanced(&seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, dataAndTemp, qrcode); -} - - -// Appends the given number of low-order bits of the given value to the given byte-based -// bit buffer, increasing the bit length. Requires 0 <= numBits <= 16 and val < 2^numBits. -testable void appendBitsToBuffer(unsigned int val, int numBits, uint8_t buffer[], int * bitLen) -{ - LV_ASSERT(0 <= numBits && numBits <= 16 && (unsigned long)val >> numBits == 0); - for(int i = numBits - 1; i >= 0; i--, (*bitLen)++) - buffer[*bitLen >> 3] |= ((val >> i) & 1) << (7 - (*bitLen & 7)); -} - - - -/*---- Low-level QR Code encoding functions ----*/ - -// Public function - see documentation comment in header file. -bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len, - enum qrcodegen_Ecc ecl, uint8_t tempBuffer[], uint8_t qrcode[]) -{ - return qrcodegen_encodeSegmentsAdvanced(segs, len, ecl, - qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX, -1, true, tempBuffer, qrcode); -} - - -// Public function - see documentation comment in header file. -bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], size_t len, enum qrcodegen_Ecc ecl, - int minVersion, int maxVersion, int mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]) -{ - LV_ASSERT(segs != NULL || len == 0); - LV_ASSERT(qrcodegen_VERSION_MIN <= minVersion && minVersion <= maxVersion && maxVersion <= qrcodegen_VERSION_MAX); - LV_ASSERT(0 <= (int)ecl && (int)ecl <= 3 && -1 <= (int)mask && (int)mask <= 7); - - // Find the minimal version number to use - int version, dataUsedBits; - for(version = minVersion; ; version++) { - int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; // Number of data bits available - dataUsedBits = getTotalBits(segs, len, version); - if(dataUsedBits != -1 && dataUsedBits <= dataCapacityBits) - break; // This version number is found to be suitable - if(version >= maxVersion) { // All versions in the range could not fit the given data - qrcode[0] = 0; // Set size to invalid value for safety - return false; - } - } - LV_ASSERT(dataUsedBits != -1); - - // Increase the error correction level while the data still fits in the current version number - for(int i = (int)qrcodegen_Ecc_MEDIUM; i <= (int)qrcodegen_Ecc_HIGH; i++) { // From low to high - if(boostEcl && dataUsedBits <= getNumDataCodewords(version, (enum qrcodegen_Ecc)i) * 8) - ecl = (enum qrcodegen_Ecc)i; - } - - // Concatenate all segments to create the data bit string - memset(qrcode, 0, qrcodegen_BUFFER_LEN_FOR_VERSION(version) * sizeof(qrcode[0])); - int bitLen = 0; - for(size_t i = 0; i < len; i++) { - const struct qrcodegen_Segment * seg = &segs[i]; - appendBitsToBuffer((int)seg->mode, 4, qrcode, &bitLen); - appendBitsToBuffer(seg->numChars, numCharCountBits(seg->mode, version), qrcode, &bitLen); - for(int j = 0; j < seg->bitLength; j++) - appendBitsToBuffer((seg->data[j >> 3] >> (7 - (j & 7))) & 1, 1, qrcode, &bitLen); - } - LV_ASSERT(bitLen == dataUsedBits); - - // Add terminator and pad up to a byte if applicable - int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; - LV_ASSERT(bitLen <= dataCapacityBits); - int terminatorBits = dataCapacityBits - bitLen; - if(terminatorBits > 4) - terminatorBits = 4; - appendBitsToBuffer(0, terminatorBits, qrcode, &bitLen); - appendBitsToBuffer(0, (8 - bitLen % 8) % 8, qrcode, &bitLen); - LV_ASSERT(bitLen % 8 == 0); - - // Pad with alternating bytes until data capacity is reached - for(uint8_t padByte = 0xEC; bitLen < dataCapacityBits; padByte ^= 0xEC ^ 0x11) - appendBitsToBuffer(padByte, 8, qrcode, &bitLen); - - // Draw function and data codeword modules - addEccAndInterleave(qrcode, version, ecl, tempBuffer); - initializeFunctionModules(version, qrcode); - drawCodewords(tempBuffer, getNumRawDataModules(version) / 8, qrcode); - drawWhiteFunctionModules(qrcode, version); - initializeFunctionModules(version, tempBuffer); - - // Handle masking - if(mask == qrcodegen_Mask_AUTO) { // Automatically choose best mask - long minPenalty = LONG_MAX; - for(int i = 0; i < 8; i++) { - enum qrcodegen_Mask msk = (enum qrcodegen_Mask)i; - applyMask(tempBuffer, qrcode, msk); - drawFormatBits(ecl, msk, qrcode); - long penalty = getPenaltyScore(qrcode); - if(penalty < minPenalty) { - mask = msk; - minPenalty = penalty; - } - applyMask(tempBuffer, qrcode, msk); // Undoes the mask due to XOR - } - } - LV_ASSERT(0 <= (int)mask && (int)mask <= 7); - applyMask(tempBuffer, qrcode, mask); - drawFormatBits(ecl, mask, qrcode); - return true; -} - - - -/*---- Error correction code generation functions ----*/ - -// Appends error correction bytes to each block of the given data array, then interleaves -// bytes from the blocks and stores them in the result array. data[0 : dataLen] contains -// the input data. data[dataLen : rawCodewords] is used as a temporary work area and will -// be clobbered by this function. The final answer is stored in result[0 : rawCodewords]. -testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[]) -{ - // Calculate parameter numbers - LV_ASSERT(0 <= (int)ecl && (int)ecl < 4 && qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); - int numBlocks = NUM_ERROR_CORRECTION_BLOCKS[(int)ecl][version]; - int blockEccLen = ECC_CODEWORDS_PER_BLOCK [(int)ecl][version]; - int rawCodewords = getNumRawDataModules(version) / 8; - int dataLen = getNumDataCodewords(version, ecl); - int numShortBlocks = numBlocks - rawCodewords % numBlocks; - int shortBlockDataLen = rawCodewords / numBlocks - blockEccLen; - - // Split data into blocks, calculate ECC, and interleave - // (not concatenate) the bytes into a single sequence - uint8_t generator[qrcodegen_REED_SOLOMON_DEGREE_MAX]; - calcReedSolomonGenerator(blockEccLen, generator); - const uint8_t * dat = data; - for(int i = 0; i < numBlocks; i++) { - int datLen = shortBlockDataLen + (i < numShortBlocks ? 0 : 1); - uint8_t * ecc = &data[dataLen]; // Temporary storage - calcReedSolomonRemainder(dat, datLen, generator, blockEccLen, ecc); - for(int j = 0, k = i; j < datLen; j++, k += numBlocks) { // Copy data - if(j == shortBlockDataLen) - k -= numShortBlocks; - result[k] = dat[j]; - } - for(int j = 0, k = dataLen + i; j < blockEccLen; j++, k += numBlocks) // Copy ECC - result[k] = ecc[j]; - dat += datLen; - } -} - - -// Returns the number of 8-bit codewords that can be used for storing data (not ECC), -// for the given version number and error correction level. The result is in the range [9, 2956]. -testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl) -{ - int v = version, e = (int)ecl; - LV_ASSERT(0 <= e && e < 4); - return getNumRawDataModules(v) / 8 - - ECC_CODEWORDS_PER_BLOCK [e][v] - * NUM_ERROR_CORRECTION_BLOCKS[e][v]; -} - - -// Returns the number of data bits that can be stored in a QR Code of the given version number, after -// all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8. -// The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table. -testable int getNumRawDataModules(int ver) -{ - LV_ASSERT(qrcodegen_VERSION_MIN <= ver && ver <= qrcodegen_VERSION_MAX); - int result = (16 * ver + 128) * ver + 64; - if(ver >= 2) { - int numAlign = ver / 7 + 2; - result -= (25 * numAlign - 10) * numAlign - 55; - if(ver >= 7) - result -= 36; - } - return result; -} - - - -/*---- Reed-Solomon ECC generator functions ----*/ - -// Calculates the Reed-Solomon generator polynomial of the given degree, storing in result[0 : degree]. -testable void calcReedSolomonGenerator(int degree, uint8_t result[]) -{ - // Start with the monomial x^0 - LV_ASSERT(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); - memset(result, 0, degree * sizeof(result[0])); - result[degree - 1] = 1; - - // Compute the product polynomial (x - r^0) * (x - r^1) * (x - r^2) * ... * (x - r^{degree-1}), - // drop the highest term, and store the rest of the coefficients in order of descending powers. - // Note that r = 0x02, which is a generator element of this field GF(2^8/0x11D). - uint8_t root = 1; - for(int i = 0; i < degree; i++) { - // Multiply the current product by (x - r^i) - for(int j = 0; j < degree; j++) { - result[j] = finiteFieldMultiply(result[j], root); - if(j + 1 < degree) - result[j] ^= result[j + 1]; - } - root = finiteFieldMultiply(root, 0x02); - } -} - - -// Calculates the remainder of the polynomial data[0 : dataLen] when divided by the generator[0 : degree], where all -// polynomials are in big endian and the generator has an implicit leading 1 term, storing the result in result[0 : degree]. -testable void calcReedSolomonRemainder(const uint8_t data[], int dataLen, - const uint8_t generator[], int degree, uint8_t result[]) -{ - - // Perform polynomial division - LV_ASSERT(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); - memset(result, 0, degree * sizeof(result[0])); - for(int i = 0; i < dataLen; i++) { - uint8_t factor = data[i] ^ result[0]; - memmove(&result[0], &result[1], (degree - 1) * sizeof(result[0])); - result[degree - 1] = 0; - for(int j = 0; j < degree; j++) - result[j] ^= finiteFieldMultiply(generator[j], factor); - } -} - -#undef qrcodegen_REED_SOLOMON_DEGREE_MAX - - -// Returns the product of the two given field elements modulo GF(2^8/0x11D). -// All inputs are valid. This could be implemented as a 256*256 lookup table. -testable uint8_t finiteFieldMultiply(uint8_t x, uint8_t y) -{ - // Russian peasant multiplication - uint8_t z = 0; - for(int i = 7; i >= 0; i--) { - z = (z << 1) ^ ((z >> 7) * 0x11D); - z ^= ((y >> i) & 1) * x; - } - return z; -} - - - -/*---- Drawing function modules ----*/ - -// Clears the given QR Code grid with white modules for the given -// version's size, then marks every function module as black. -testable void initializeFunctionModules(int version, uint8_t qrcode[]) -{ - // Initialize QR Code - int qrsize = version * 4 + 17; - memset(qrcode, 0, ((qrsize * qrsize + 7) / 8 + 1) * sizeof(qrcode[0])); - qrcode[0] = (uint8_t)qrsize; - - // Fill horizontal and vertical timing patterns - fillRectangle(6, 0, 1, qrsize, qrcode); - fillRectangle(0, 6, qrsize, 1, qrcode); - - // Fill 3 finder patterns (all corners except bottom right) and format bits - fillRectangle(0, 0, 9, 9, qrcode); - fillRectangle(qrsize - 8, 0, 8, 9, qrcode); - fillRectangle(0, qrsize - 8, 9, 8, qrcode); - - // Fill numerous alignment patterns - uint8_t alignPatPos[7]; - int numAlign = getAlignmentPatternPositions(version, alignPatPos); - for(int i = 0; i < numAlign; i++) { - for(int j = 0; j < numAlign; j++) { - // Don't draw on the three finder corners - if(!((i == 0 && j == 0) || (i == 0 && j == numAlign - 1) || (i == numAlign - 1 && j == 0))) - fillRectangle(alignPatPos[i] - 2, alignPatPos[j] - 2, 5, 5, qrcode); - } - } - - // Fill version blocks - if(version >= 7) { - fillRectangle(qrsize - 11, 0, 3, 6, qrcode); - fillRectangle(0, qrsize - 11, 6, 3, qrcode); - } -} - - -// Draws white function modules and possibly some black modules onto the given QR Code, without changing -// non-function modules. This does not draw the format bits. This requires all function modules to be previously -// marked black (namely by initializeFunctionModules()), because this may skip redrawing black function modules. -static void drawWhiteFunctionModules(uint8_t qrcode[], int version) -{ - // Draw horizontal and vertical timing patterns - int qrsize = qrcodegen_getSize(qrcode); - for(int i = 7; i < qrsize - 7; i += 2) { - setModule(qrcode, 6, i, false); - setModule(qrcode, i, 6, false); - } - - // Draw 3 finder patterns (all corners except bottom right; overwrites some timing modules) - for(int dy = -4; dy <= 4; dy++) { - for(int dx = -4; dx <= 4; dx++) { - int dist = abs(dx); - if(abs(dy) > dist) - dist = abs(dy); - if(dist == 2 || dist == 4) { - setModuleBounded(qrcode, 3 + dx, 3 + dy, false); - setModuleBounded(qrcode, qrsize - 4 + dx, 3 + dy, false); - setModuleBounded(qrcode, 3 + dx, qrsize - 4 + dy, false); - } - } - } - - // Draw numerous alignment patterns - uint8_t alignPatPos[7]; - int numAlign = getAlignmentPatternPositions(version, alignPatPos); - for(int i = 0; i < numAlign; i++) { - for(int j = 0; j < numAlign; j++) { - if((i == 0 && j == 0) || (i == 0 && j == numAlign - 1) || (i == numAlign - 1 && j == 0)) - continue; // Don't draw on the three finder corners - for(int dy = -1; dy <= 1; dy++) { - for(int dx = -1; dx <= 1; dx++) - setModule(qrcode, alignPatPos[i] + dx, alignPatPos[j] + dy, dx == 0 && dy == 0); - } - } - } - - // Draw version blocks - if(version >= 7) { - // Calculate error correction code and pack bits - int rem = version; // version is uint6, in the range [7, 40] - for(int i = 0; i < 12; i++) - rem = (rem << 1) ^ ((rem >> 11) * 0x1F25); - long bits = (long)version << 12 | rem; // uint18 - LV_ASSERT(bits >> 18 == 0); - - // Draw two copies - for(int i = 0; i < 6; i++) { - for(int j = 0; j < 3; j++) { - int k = qrsize - 11 + j; - setModule(qrcode, k, i, (bits & 1) != 0); - setModule(qrcode, i, k, (bits & 1) != 0); - bits >>= 1; - } - } - } -} - - -// Draws two copies of the format bits (with its own error correction code) based -// on the given mask and error correction level. This always draws all modules of -// the format bits, unlike drawWhiteFunctionModules() which might skip black modules. -static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uint8_t qrcode[]) -{ - // Calculate error correction code and pack bits - LV_ASSERT(0 <= (int)mask && (int)mask <= 7); - static const int table[] = {1, 0, 3, 2}; - int data = table[(int)ecl] << 3 | (int)mask; // errCorrLvl is uint2, mask is uint3 - int rem = data; - for(int i = 0; i < 10; i++) - rem = (rem << 1) ^ ((rem >> 9) * 0x537); - int bits = (data << 10 | rem) ^ 0x5412; // uint15 - LV_ASSERT(bits >> 15 == 0); - - // Draw first copy - for(int i = 0; i <= 5; i++) - setModule(qrcode, 8, i, getBit(bits, i)); - setModule(qrcode, 8, 7, getBit(bits, 6)); - setModule(qrcode, 8, 8, getBit(bits, 7)); - setModule(qrcode, 7, 8, getBit(bits, 8)); - for(int i = 9; i < 15; i++) - setModule(qrcode, 14 - i, 8, getBit(bits, i)); - - // Draw second copy - int qrsize = qrcodegen_getSize(qrcode); - for(int i = 0; i < 8; i++) - setModule(qrcode, qrsize - 1 - i, 8, getBit(bits, i)); - for(int i = 8; i < 15; i++) - setModule(qrcode, 8, qrsize - 15 + i, getBit(bits, i)); - setModule(qrcode, 8, qrsize - 8, true); // Always black -} - - -// Calculates and stores an ascending list of positions of alignment patterns -// for this version number, returning the length of the list (in the range [0,7]). -// Each position is in the range [0,177), and are used on both the x and y axes. -// This could be implemented as lookup table of 40 variable-length lists of unsigned bytes. -testable int getAlignmentPatternPositions(int version, uint8_t result[7]) -{ - if(version == 1) - return 0; - int numAlign = version / 7 + 2; - int step = (version == 32) ? 26 : - (version * 4 + numAlign * 2 + 1) / (numAlign * 2 - 2) * 2; - for(int i = numAlign - 1, pos = version * 4 + 10; i >= 1; i--, pos -= step) - result[i] = pos; - result[0] = 6; - return numAlign; -} - - -// Sets every pixel in the range [left : left + width] * [top : top + height] to black. -static void fillRectangle(int left, int top, int width, int height, uint8_t qrcode[]) -{ - for(int dy = 0; dy < height; dy++) { - for(int dx = 0; dx < width; dx++) - setModule(qrcode, left + dx, top + dy, true); - } -} - - - -/*---- Drawing data modules and masking ----*/ - -// Draws the raw codewords (including data and ECC) onto the given QR Code. This requires the initial state of -// the QR Code to be black at function modules and white at codeword modules (including unused remainder bits). -static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]) -{ - int qrsize = qrcodegen_getSize(qrcode); - int i = 0; // Bit index into the data - // Do the funny zigzag scan - for(int right = qrsize - 1; right >= 1; right -= 2) { // Index of right column in each column pair - if(right == 6) - right = 5; - for(int vert = 0; vert < qrsize; vert++) { // Vertical counter - for(int j = 0; j < 2; j++) { - int x = right - j; // Actual x coordinate - bool upward = ((right + 1) & 2) == 0; - int y = upward ? qrsize - 1 - vert : vert; // Actual y coordinate - if(!getModule(qrcode, x, y) && i < dataLen * 8) { - bool black = getBit(data[i >> 3], 7 - (i & 7)); - setModule(qrcode, x, y, black); - i++; - } - // If this QR Code has any remainder bits (0 to 7), they were assigned as - // 0/false/white by the constructor and are left unchanged by this method - } - } - } - LV_ASSERT(i == dataLen * 8); -} - - -// XORs the codeword modules in this QR Code with the given mask pattern. -// The function modules must be marked and the codeword bits must be drawn -// before masking. Due to the arithmetic of XOR, calling applyMask() with -// the same mask value a second time will undo the mask. A final well-formed -// QR Code needs exactly one (not zero, two, etc.) mask applied. -static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask) -{ - LV_ASSERT(0 <= (int)mask && (int)mask <= 7); // Disallows qrcodegen_Mask_AUTO - int qrsize = qrcodegen_getSize(qrcode); - for(int y = 0; y < qrsize; y++) { - for(int x = 0; x < qrsize; x++) { - if(getModule(functionModules, x, y)) - continue; - bool invert; - switch((int)mask) { - case 0: - invert = (x + y) % 2 == 0; - break; - case 1: - invert = y % 2 == 0; - break; - case 2: - invert = x % 3 == 0; - break; - case 3: - invert = (x + y) % 3 == 0; - break; - case 4: - invert = (x / 3 + y / 2) % 2 == 0; - break; - case 5: - invert = x * y % 2 + x * y % 3 == 0; - break; - case 6: - invert = (x * y % 2 + x * y % 3) % 2 == 0; - break; - case 7: - invert = ((x + y) % 2 + x * y % 3) % 2 == 0; - break; - default: - LV_ASSERT(false); - return; - } - bool val = getModule(qrcode, x, y); - setModule(qrcode, x, y, val ^ invert); - } - } -} - - -// Calculates and returns the penalty score based on state of the given QR Code's current modules. -// This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score. -static long getPenaltyScore(const uint8_t qrcode[]) -{ - int qrsize = qrcodegen_getSize(qrcode); - long result = 0; - - // Adjacent modules in row having same color, and finder-like patterns - for(int y = 0; y < qrsize; y++) { - unsigned char runHistory[7] = {0}; - bool color = false; - unsigned char runX = 0; - for(int x = 0; x < qrsize; x++) { - if(getModule(qrcode, x, y) == color) { - runX++; - if(runX == 5) - result += PENALTY_N1; - else if(runX > 5) - result++; - } - else { - addRunToHistory(runX, runHistory); - if(!color && hasFinderLikePattern(runHistory)) - result += PENALTY_N3; - color = getModule(qrcode, x, y); - runX = 1; - } - } - addRunToHistory(runX, runHistory); - if(color) - addRunToHistory(0, runHistory); // Dummy run of white - if(hasFinderLikePattern(runHistory)) - result += PENALTY_N3; - } - // Adjacent modules in column having same color, and finder-like patterns - for(int x = 0; x < qrsize; x++) { - unsigned char runHistory[7] = {0}; - bool color = false; - unsigned char runY = 0; - for(int y = 0; y < qrsize; y++) { - if(getModule(qrcode, x, y) == color) { - runY++; - if(runY == 5) - result += PENALTY_N1; - else if(runY > 5) - result++; - } - else { - addRunToHistory(runY, runHistory); - if(!color && hasFinderLikePattern(runHistory)) - result += PENALTY_N3; - color = getModule(qrcode, x, y); - runY = 1; - } - } - addRunToHistory(runY, runHistory); - if(color) - addRunToHistory(0, runHistory); // Dummy run of white - if(hasFinderLikePattern(runHistory)) - result += PENALTY_N3; - } - - // 2*2 blocks of modules having same color - for(int y = 0; y < qrsize - 1; y++) { - for(int x = 0; x < qrsize - 1; x++) { - bool color = getModule(qrcode, x, y); - if(color == getModule(qrcode, x + 1, y) && - color == getModule(qrcode, x, y + 1) && - color == getModule(qrcode, x + 1, y + 1)) - result += PENALTY_N2; - } - } - - // Balance of black and white modules - int black = 0; - for(int y = 0; y < qrsize; y++) { - for(int x = 0; x < qrsize; x++) { - if(getModule(qrcode, x, y)) - black++; - } - } - int total = qrsize * qrsize; // Note that size is odd, so black/total != 1/2 - // Compute the smallest integer k >= 0 such that (45-5k)% <= black/total <= (55+5k)% - int k = (int)((labs(black * 20L - total * 10L) + total - 1) / total) - 1; - result += k * PENALTY_N4; - return result; -} - - -// Inserts the given value to the front of the given array, which shifts over the -// existing values and deletes the last value. A helper function for getPenaltyScore(). -static void addRunToHistory(unsigned char run, unsigned char history[7]) -{ - memmove(&history[1], &history[0], 6 * sizeof(history[0])); - history[0] = run; -} - - -// Tests whether the given run history has the pattern of ratio 1:1:3:1:1 in the middle, and -// surrounded by at least 4 on either or both ends. A helper function for getPenaltyScore(). -// Must only be called immediately after a run of white modules has ended. -static bool hasFinderLikePattern(const unsigned char runHistory[7]) -{ - unsigned char n = runHistory[1]; - // The maximum QR Code size is 177, hence the run length n <= 177. - // Arithmetic is promoted to int, so n*4 will not overflow. - return n > 0 && runHistory[2] == n && runHistory[4] == n && runHistory[5] == n - && runHistory[3] == n * 3 && (runHistory[0] >= n * 4 || runHistory[6] >= n * 4); -} - - - -/*---- Basic QR Code information ----*/ - -// Public function - see documentation comment in header file. -int qrcodegen_getSize(const uint8_t qrcode[]) -{ - LV_ASSERT(qrcode != NULL); - int result = qrcode[0]; - LV_ASSERT((qrcodegen_VERSION_MIN * 4 + 17) <= result - && result <= (qrcodegen_VERSION_MAX * 4 + 17)); - return result; -} - - -// Public function - see documentation comment in header file. -bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y) -{ - LV_ASSERT(qrcode != NULL); - int qrsize = qrcode[0]; - return (0 <= x && x < qrsize && 0 <= y && y < qrsize) && getModule(qrcode, x, y); -} - - -// Gets the module at the given coordinates, which must be in bounds. -testable bool getModule(const uint8_t qrcode[], int x, int y) -{ - int qrsize = qrcode[0]; - LV_ASSERT(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); - int index = y * qrsize + x; - return getBit(qrcode[(index >> 3) + 1], index & 7); -} - - -// Sets the module at the given coordinates, which must be in bounds. -testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack) -{ - int qrsize = qrcode[0]; - LV_ASSERT(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); - int index = y * qrsize + x; - int bitIndex = index & 7; - int byteIndex = (index >> 3) + 1; - if(isBlack) - qrcode[byteIndex] |= 1 << bitIndex; - else - qrcode[byteIndex] &= (1 << bitIndex) ^ 0xFF; -} - - -// Sets the module at the given coordinates, doing nothing if out of bounds. -testable void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack) -{ - int qrsize = qrcode[0]; - if(0 <= x && x < qrsize && 0 <= y && y < qrsize) - setModule(qrcode, x, y, isBlack); -} - - -// Returns true iff the i'th bit of x is set to 1. Requires x >= 0 and 0 <= i <= 14. -static bool getBit(int x, int i) -{ - return ((x >> i) & 1) != 0; -} - - - -/*---- Segment handling ----*/ - -// Public function - see documentation comment in header file. -bool qrcodegen_isAlphanumeric(const char * text) -{ - LV_ASSERT(text != NULL); - for(; *text != '\0'; text++) { - if(strchr(ALPHANUMERIC_CHARSET, *text) == NULL) - return false; - } - return true; -} - - -// Public function - see documentation comment in header file. -bool qrcodegen_isNumeric(const char * text) -{ - LV_ASSERT(text != NULL); - for(; *text != '\0'; text++) { - if(*text < '0' || *text > '9') - return false; - } - return true; -} - - -// Public function - see documentation comment in header file. -size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars) -{ - int temp = calcSegmentBitLength(mode, numChars); - if(temp == -1) - return SIZE_MAX; - LV_ASSERT(0 <= temp && temp <= INT16_MAX); - return ((size_t)temp + 7) / 8; -} - - -// Returns the number of data bits needed to represent a segment -// containing the given number of characters using the given mode. Notes: -// - Returns -1 on failure, i.e. numChars > INT16_MAX or -// the number of needed bits exceeds INT16_MAX (i.e. 32767). -// - Otherwise, all valid results are in the range [0, INT16_MAX]. -// - For byte mode, numChars measures the number of bytes, not Unicode code points. -// - For ECI mode, numChars must be 0, and the worst-case number of bits is returned. -// An actual ECI segment can have shorter data. For non-ECI modes, the result is exact. -testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars) -{ - // All calculations are designed to avoid overflow on all platforms - if(numChars > (unsigned int)INT16_MAX) - return -1; - long result = (long)numChars; - if(mode == qrcodegen_Mode_NUMERIC) - result = (result * 10 + 2) / 3; // ceil(10/3 * n) - else if(mode == qrcodegen_Mode_ALPHANUMERIC) - result = (result * 11 + 1) / 2; // ceil(11/2 * n) - else if(mode == qrcodegen_Mode_BYTE) - result *= 8; - else if(mode == qrcodegen_Mode_KANJI) - result *= 13; - else if(mode == qrcodegen_Mode_ECI && numChars == 0) - result = 3 * 8; - else { // Invalid argument - LV_ASSERT(false); - return -1; - } - LV_ASSERT(result >= 0); - if((unsigned int)result > (unsigned int)INT16_MAX) - return -1; - return (int)result; -} - - -// Public function - see documentation comment in header file. -struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]) -{ - LV_ASSERT(data != NULL || len == 0); - struct qrcodegen_Segment result; - result.mode = qrcodegen_Mode_BYTE; - result.bitLength = calcSegmentBitLength(result.mode, len); - LV_ASSERT(result.bitLength != -1); - result.numChars = (int)len; - if(len > 0) - memcpy(buf, data, len * sizeof(buf[0])); - result.data = buf; - return result; -} - - -// Public function - see documentation comment in header file. -struct qrcodegen_Segment qrcodegen_makeNumeric(const char * digits, uint8_t buf[]) -{ - LV_ASSERT(digits != NULL); - struct qrcodegen_Segment result; - size_t len = strlen(digits); - result.mode = qrcodegen_Mode_NUMERIC; - int bitLen = calcSegmentBitLength(result.mode, len); - LV_ASSERT(bitLen != -1); - result.numChars = (int)len; - if(bitLen > 0) - memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0])); - result.bitLength = 0; - - unsigned int accumData = 0; - int accumCount = 0; - for(; *digits != '\0'; digits++) { - char c = *digits; - LV_ASSERT('0' <= c && c <= '9'); - accumData = accumData * 10 + (unsigned int)(c - '0'); - accumCount++; - if(accumCount == 3) { - appendBitsToBuffer(accumData, 10, buf, &result.bitLength); - accumData = 0; - accumCount = 0; - } - } - if(accumCount > 0) // 1 or 2 digits remaining - appendBitsToBuffer(accumData, accumCount * 3 + 1, buf, &result.bitLength); - LV_ASSERT(result.bitLength == bitLen); - result.data = buf; - return result; -} - - -// Public function - see documentation comment in header file. -struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char * text, uint8_t buf[]) -{ - LV_ASSERT(text != NULL); - struct qrcodegen_Segment result; - size_t len = strlen(text); - result.mode = qrcodegen_Mode_ALPHANUMERIC; - int bitLen = calcSegmentBitLength(result.mode, len); - LV_ASSERT(bitLen != -1); - result.numChars = (int)len; - if(bitLen > 0) - memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0])); - result.bitLength = 0; - - unsigned int accumData = 0; - int accumCount = 0; - for(; *text != '\0'; text++) { - const char * temp = strchr(ALPHANUMERIC_CHARSET, *text); - LV_ASSERT(temp != NULL); - accumData = accumData * 45 + (unsigned int)(temp - ALPHANUMERIC_CHARSET); - accumCount++; - if(accumCount == 2) { - appendBitsToBuffer(accumData, 11, buf, &result.bitLength); - accumData = 0; - accumCount = 0; - } - } - if(accumCount > 0) // 1 character remaining - appendBitsToBuffer(accumData, 6, buf, &result.bitLength); - LV_ASSERT(result.bitLength == bitLen); - result.data = buf; - return result; -} - - -// Public function - see documentation comment in header file. -struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]) -{ - struct qrcodegen_Segment result; - result.mode = qrcodegen_Mode_ECI; - result.numChars = 0; - result.bitLength = 0; - if(assignVal < 0) { - LV_ASSERT(false); - } - else if(assignVal < (1 << 7)) { - memset(buf, 0, 1 * sizeof(buf[0])); - appendBitsToBuffer(assignVal, 8, buf, &result.bitLength); - } - else if(assignVal < (1 << 14)) { - memset(buf, 0, 2 * sizeof(buf[0])); - appendBitsToBuffer(2, 2, buf, &result.bitLength); - appendBitsToBuffer(assignVal, 14, buf, &result.bitLength); - } - else if(assignVal < 1000000L) { - memset(buf, 0, 3 * sizeof(buf[0])); - appendBitsToBuffer(6, 3, buf, &result.bitLength); - appendBitsToBuffer(assignVal >> 10, 11, buf, &result.bitLength); - appendBitsToBuffer(assignVal & 0x3FF, 10, buf, &result.bitLength); - } - else { - LV_ASSERT(false); - } - result.data = buf; - return result; -} - - -// Calculates the number of bits needed to encode the given segments at the given version. -// Returns a non-negative number if successful. Otherwise returns -1 if a segment has too -// many characters to fit its length field, or the total bits exceeds INT16_MAX. -testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version) -{ - LV_ASSERT(segs != NULL || len == 0); - long result = 0; - for(size_t i = 0; i < len; i++) { - int numChars = segs[i].numChars; - int bitLength = segs[i].bitLength; - LV_ASSERT(0 <= numChars && numChars <= INT16_MAX); - LV_ASSERT(0 <= bitLength && bitLength <= INT16_MAX); - int ccbits = numCharCountBits(segs[i].mode, version); - LV_ASSERT(0 <= ccbits && ccbits <= 16); - if(numChars >= (1L << ccbits)) - return -1; // The segment's length doesn't fit the field's bit width - result += 4L + ccbits + bitLength; - if(result > INT16_MAX) - return -1; // The sum might overflow an int type - } - LV_ASSERT(0 <= result && result <= INT16_MAX); - return (int)result; -} - - -// Returns the bit width of the character count field for a segment in the given mode -// in a QR Code at the given version number. The result is in the range [0, 16]. -static int numCharCountBits(enum qrcodegen_Mode mode, int version) -{ - LV_ASSERT(qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); - int i = (version + 7) / 17; - switch(mode) { - case qrcodegen_Mode_NUMERIC : { - static const int temp[] = {10, 12, 14}; - return temp[i]; - } - case qrcodegen_Mode_ALPHANUMERIC: { - static const int temp[] = { 9, 11, 13}; - return temp[i]; - } - case qrcodegen_Mode_BYTE : { - static const int temp[] = { 8, 16, 16}; - return temp[i]; - } - case qrcodegen_Mode_KANJI : { - static const int temp[] = { 8, 10, 12}; - return temp[i]; - } - case qrcodegen_Mode_ECI : - return 0; - default: - LV_ASSERT(false); - return -1; // Dummy value - } -} - -int qrcodegen_getMinFitVersion(enum qrcodegen_Ecc ecl, size_t dataLen) -{ - struct qrcodegen_Segment seg; - seg.mode = qrcodegen_Mode_BYTE; - seg.bitLength = calcSegmentBitLength(seg.mode, dataLen); - seg.numChars = (int)dataLen; - - for(int version = qrcodegen_VERSION_MIN; version <= qrcodegen_VERSION_MAX; version++) { - int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; // Number of data bits available - int dataUsedBits = getTotalBits(&seg, 1, version); - if(dataUsedBits != -1 && dataUsedBits <= dataCapacityBits) - return version; - } - return -1; -} - -int qrcodegen_version2size(int version) -{ - if(version < qrcodegen_VERSION_MIN || version > qrcodegen_VERSION_MAX) { - return -1; - } - - return ((version - 1) * 4 + 21); -} -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/qrcodegen.h b/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/qrcodegen.h deleted file mode 100644 index 9509486..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/qrcode/qrcodegen.h +++ /dev/null @@ -1,324 +0,0 @@ -/* - * QR Code generator library (C) - * - * Copyright (c) Project Nayuki. (MIT License) - * https://www.nayuki.io/page/qr-code-generator-library - * - * 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. - */ - -#pragma once - -#include "../../../lvgl.h" -#ifdef LV_USE_QRCODE - -#include -#include -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - -/* - * This library creates QR Code symbols, which is a type of two-dimension barcode. - * Invented by Denso Wave and described in the ISO/IEC 18004 standard. - * A QR Code structure is an immutable square grid of black and white cells. - * The library provides functions to create a QR Code from text or binary data. - * The library covers the QR Code Model 2 specification, supporting all versions (sizes) - * from 1 to 40, all 4 error correction levels, and 4 character encoding modes. - * - * Ways to create a QR Code object: - * - High level: Take the payload data and call qrcodegen_encodeText() or qrcodegen_encodeBinary(). - * - Low level: Custom-make the list of segments and call - * qrcodegen_encodeSegments() or qrcodegen_encodeSegmentsAdvanced(). - * (Note that all ways require supplying the desired error correction level and various byte buffers.) - */ - - -/*---- Enum and struct types----*/ - -/* - * The error correction level in a QR Code symbol. - */ -enum qrcodegen_Ecc { - // Must be declared in ascending order of error protection - // so that an internal qrcodegen function works properly - qrcodegen_Ecc_LOW = 0, // The QR Code can tolerate about 7% erroneous codewords - qrcodegen_Ecc_MEDIUM, // The QR Code can tolerate about 15% erroneous codewords - qrcodegen_Ecc_QUARTILE, // The QR Code can tolerate about 25% erroneous codewords - qrcodegen_Ecc_HIGH, // The QR Code can tolerate about 30% erroneous codewords -}; - - -/* - * The mask pattern used in a QR Code symbol. - */ -enum qrcodegen_Mask { - // A special value to tell the QR Code encoder to - // automatically select an appropriate mask pattern - qrcodegen_Mask_AUTO = -1, - // The eight actual mask patterns - qrcodegen_Mask_0 = 0, - qrcodegen_Mask_1, - qrcodegen_Mask_2, - qrcodegen_Mask_3, - qrcodegen_Mask_4, - qrcodegen_Mask_5, - qrcodegen_Mask_6, - qrcodegen_Mask_7, -}; - - -/* - * Describes how a segment's data bits are interpreted. - */ -enum qrcodegen_Mode { - qrcodegen_Mode_NUMERIC = 0x1, - qrcodegen_Mode_ALPHANUMERIC = 0x2, - qrcodegen_Mode_BYTE = 0x4, - qrcodegen_Mode_KANJI = 0x8, - qrcodegen_Mode_ECI = 0x7, -}; - - -/* - * A segment of character/binary/control data in a QR Code symbol. - * The mid-level way to create a segment is to take the payload data - * and call a factory function such as qrcodegen_makeNumeric(). - * The low-level way to create a segment is to custom-make the bit buffer - * and initialize a qrcodegen_Segment struct with appropriate values. - * Even in the most favorable conditions, a QR Code can only hold 7089 characters of data. - * Any segment longer than this is meaningless for the purpose of generating QR Codes. - * Moreover, the maximum allowed bit length is 32767 because - * the largest QR Code (version 40) has 31329 modules. - */ -struct qrcodegen_Segment { - // The mode indicator of this segment. - enum qrcodegen_Mode mode; - - // The length of this segment's unencoded data. Measured in characters for - // numeric/alphanumeric/kanji mode, bytes for byte mode, and 0 for ECI mode. - // Always zero or positive. Not the same as the data's bit length. - int numChars; - - // The data bits of this segment, packed in bitwise big endian. - // Can be null if the bit length is zero. - uint8_t * data; - - // The number of valid data bits used in the buffer. Requires - // 0 <= bitLength <= 32767, and bitLength <= (capacity of data array) * 8. - // The character count (numChars) must agree with the mode and the bit buffer length. - int bitLength; -}; - - - -/*---- Macro constants and functions ----*/ - -#define qrcodegen_VERSION_MIN 1 // The minimum version number supported in the QR Code Model 2 standard -#define qrcodegen_VERSION_MAX 40 // The maximum version number supported in the QR Code Model 2 standard - -// Calculates the number of bytes needed to store any QR Code up to and including the given version number, -// as a compile-time constant. For example, 'uint8_t buffer[qrcodegen_BUFFER_LEN_FOR_VERSION(25)];' -// can store any single QR Code from version 1 to 25 (inclusive). The result fits in an int (or int16). -// Requires qrcodegen_VERSION_MIN <= n <= qrcodegen_VERSION_MAX. -#define qrcodegen_BUFFER_LEN_FOR_VERSION(n) ((((n) * 4 + 17) * ((n) * 4 + 17) + 7) / 8 + 1) - -// The worst-case number of bytes needed to store one QR Code, up to and including -// version 40. This value equals 3918, which is just under 4 kilobytes. -// Use this more convenient value to avoid calculating tighter memory bounds for buffers. -#define qrcodegen_BUFFER_LEN_MAX qrcodegen_BUFFER_LEN_FOR_VERSION(qrcodegen_VERSION_MAX) - - - -/*---- Functions (high level) to generate QR Codes ----*/ - -/* - * Encodes the given text string to a QR Code, returning true if encoding succeeded. - * If the data is too long to fit in any version in the given range - * at the given ECC level, then false is returned. - * - The input text must be encoded in UTF-8 and contain no NULs. - * - The variables ecl and mask must correspond to enum constant values. - * - Requires 1 <= minVersion <= maxVersion <= 40. - * - The arrays tempBuffer and qrcode must each have a length - * of at least qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion). - * - After the function returns, tempBuffer contains no useful data. - * - If successful, the resulting QR Code may use numeric, - * alphanumeric, or byte mode to encode the text. - * - In the most optimistic case, a QR Code at version 40 with low ECC - * can hold any UTF-8 string up to 2953 bytes, or any alphanumeric string - * up to 4296 characters, or any digit string up to 7089 characters. - * These numbers represent the hard upper limit of the QR Code standard. - * - Please consult the QR Code specification for information on - * data capacities per version, ECC level, and text encoding mode. - */ -bool qrcodegen_encodeText(const char * text, uint8_t tempBuffer[], uint8_t qrcode[], - enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl); - - -/* - * Encodes the given binary data to a QR Code, returning true if encoding succeeded. - * If the data is too long to fit in any version in the given range - * at the given ECC level, then false is returned. - * - The input array range dataAndTemp[0 : dataLen] should normally be - * valid UTF-8 text, but is not required by the QR Code standard. - * - The variables ecl and mask must correspond to enum constant values. - * - Requires 1 <= minVersion <= maxVersion <= 40. - * - The arrays dataAndTemp and qrcode must each have a length - * of at least qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion). - * - After the function returns, the contents of dataAndTemp may have changed, - * and does not represent useful data anymore. - * - If successful, the resulting QR Code will use byte mode to encode the data. - * - In the most optimistic case, a QR Code at version 40 with low ECC can hold any byte - * sequence up to length 2953. This is the hard upper limit of the QR Code standard. - * - Please consult the QR Code specification for information on - * data capacities per version, ECC level, and text encoding mode. - */ -bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcode[], - enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl); - - -/*---- Functions (low level) to generate QR Codes ----*/ - -/* - * Renders a QR Code representing the given segments at the given error correction level. - * The smallest possible QR Code version is automatically chosen for the output. Returns true if - * QR Code creation succeeded, or false if the data is too long to fit in any version. The ECC level - * of the result may be higher than the ecl argument if it can be done without increasing the version. - * This function allows the user to create a custom sequence of segments that switches - * between modes (such as alphanumeric and byte) to encode text in less space. - * This is a low-level API; the high-level API is qrcodegen_encodeText() and qrcodegen_encodeBinary(). - * To save memory, the segments' data buffers can alias/overlap tempBuffer, and will - * result in them being clobbered, but the QR Code output will still be correct. - * But the qrcode array must not overlap tempBuffer or any segment's data buffer. - */ -bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len, - enum qrcodegen_Ecc ecl, uint8_t tempBuffer[], uint8_t qrcode[]); - - -/* - * Renders a QR Code representing the given segments with the given encoding parameters. - * Returns true if QR Code creation succeeded, or false if the data is too long to fit in the range of versions. - * The smallest possible QR Code version within the given range is automatically - * chosen for the output. Iff boostEcl is true, then the ECC level of the result - * may be higher than the ecl argument if it can be done without increasing the - * version. The mask number is either between 0 to 7 (inclusive) to force that - * mask, or -1 to automatically choose an appropriate mask (which may be slow). - * This function allows the user to create a custom sequence of segments that switches - * between modes (such as alphanumeric and byte) to encode text in less space. - * This is a low-level API; the high-level API is qrcodegen_encodeText() and qrcodegen_encodeBinary(). - * To save memory, the segments' data buffers can alias/overlap tempBuffer, and will - * result in them being clobbered, but the QR Code output will still be correct. - * But the qrcode array must not overlap tempBuffer or any segment's data buffer. - */ -bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], size_t len, enum qrcodegen_Ecc ecl, - int minVersion, int maxVersion, int mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]); - - -/* - * Tests whether the given string can be encoded as a segment in alphanumeric mode. - * A string is encodable iff each character is in the following set: 0 to 9, A to Z - * (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon. - */ -bool qrcodegen_isAlphanumeric(const char * text); - - -/* - * Tests whether the given string can be encoded as a segment in numeric mode. - * A string is encodable iff each character is in the range 0 to 9. - */ -bool qrcodegen_isNumeric(const char * text); - - -/* - * Returns the number of bytes (uint8_t) needed for the data buffer of a segment - * containing the given number of characters using the given mode. Notes: - * - Returns SIZE_MAX on failure, i.e. numChars > INT16_MAX or - * the number of needed bits exceeds INT16_MAX (i.e. 32767). - * - Otherwise, all valid results are in the range [0, ceil(INT16_MAX / 8)], i.e. at most 4096. - * - It is okay for the user to allocate more bytes for the buffer than needed. - * - For byte mode, numChars measures the number of bytes, not Unicode code points. - * - For ECI mode, numChars must be 0, and the worst-case number of bytes is returned. - * An actual ECI segment can have shorter data. For non-ECI modes, the result is exact. - */ -size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars); - - -/* - * Returns a segment representing the given binary data encoded in - * byte mode. All input byte arrays are acceptable. Any text string - * can be converted to UTF-8 bytes and encoded as a byte mode segment. - */ -struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]); - - -/* - * Returns a segment representing the given string of decimal digits encoded in numeric mode. - */ -struct qrcodegen_Segment qrcodegen_makeNumeric(const char * digits, uint8_t buf[]); - - -/* - * Returns a segment representing the given text string encoded in alphanumeric mode. - * The characters allowed are: 0 to 9, A to Z (uppercase only), space, - * dollar, percent, asterisk, plus, hyphen, period, slash, colon. - */ -struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char * text, uint8_t buf[]); - - -/* - * Returns a segment representing an Extended Channel Interpretation - * (ECI) designator with the given assignment value. - */ -struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]); - - -/*---- Functions to extract raw data from QR Codes ----*/ - -/* - * Returns the side length of the given QR Code, assuming that encoding succeeded. - * The result is in the range [21, 177]. Note that the length of the array buffer - * is related to the side length - every 'uint8_t qrcode[]' must have length at least - * qrcodegen_BUFFER_LEN_FOR_VERSION(version), which equals ceil(size^2 / 8 + 1). - */ -int qrcodegen_getSize(const uint8_t qrcode[]); - - -/* - * Returns the color of the module (pixel) at the given coordinates, which is false - * for white or true for black. The top left corner has the coordinates (x=0, y=0). - * If the given coordinates are out of bounds, then false (white) is returned. - */ -bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y); - -/* - * Returns the qrcode size of the specified version. Returns -1 on failure - */ -int qrcodegen_version2size(int version); -/* - * Returns the min version of the data that can be stored. Returns -1 on failure - */ -int qrcodegen_getMinFitVersion(enum qrcodegen_Ecc ecl, size_t dataLen); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/rle/lv_rle.c b/software/Power_Pico/Middlewares/LVGL/src/libs/rle/lv_rle.c deleted file mode 100644 index e715b7c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/rle/lv_rle.c +++ /dev/null @@ -1,112 +0,0 @@ -/** - * @file lv_rle.c - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../stdlib/lv_string.h" -#include "lv_rle.h" - -#if LV_USE_RLE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -uint32_t lv_rle_decompress(const uint8_t * input, - uint32_t input_buff_len, uint8_t * output, - uint32_t output_buff_len, uint8_t blk_size) -{ - uint32_t ctrl_byte; - uint32_t rd_len = 0; - uint32_t wr_len = 0; - - while(rd_len < input_buff_len) { - ctrl_byte = input[0]; - rd_len++; - input++; - if(rd_len > input_buff_len) - return 0; - - if(ctrl_byte & 0x80) { - /* copy directly from input to output */ - uint32_t bytes = blk_size * (ctrl_byte & 0x7f); - rd_len += bytes; - if(rd_len > input_buff_len) - return 0; - - wr_len += bytes; - if(wr_len > output_buff_len) { - if(wr_len > output_buff_len + blk_size) - return 0; /* Error */ - lv_memcpy(output, input, output_buff_len - (wr_len - bytes)); - return output_buff_len; - } - - lv_memcpy(output, input, bytes); - output += bytes; - input += bytes; - } - else { - rd_len += blk_size; - if(rd_len > input_buff_len) - return 0; - - wr_len += blk_size * ctrl_byte; - if(wr_len > output_buff_len) { - if(wr_len > output_buff_len + blk_size) - return 0; /* Error happened */ - - /* Skip the last pixel, which could overflow output buffer.*/ - for(uint32_t i = 0; i < ctrl_byte - 1; i++) { - lv_memcpy(output, input, blk_size); - output += blk_size; - } - return output_buff_len; - } - - if(blk_size == 1) { - /* optimize the most common case. */ - lv_memset(output, input[0], ctrl_byte); - output += ctrl_byte; - } - else { - for(uint32_t i = 0; i < ctrl_byte; i++) { - lv_memcpy(output, input, blk_size); - output += blk_size; - } - } - input += blk_size; - } - } - - return wr_len; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_RLE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/rle/lv_rle.h b/software/Power_Pico/Middlewares/LVGL/src/libs/rle/lv_rle.h deleted file mode 100644 index 02ab6a3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/rle/lv_rle.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @file lv_rle.h - * - */ - -#ifndef LV_RLE_H -#define LV_RLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -#if LV_USE_RLE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -uint32_t lv_rle_decompress(const uint8_t * input, - uint32_t input_buff_len, uint8_t * output, - uint32_t output_buff_len, uint8_t blk_size); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_RLE*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_RLE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/rlottie/lv_rlottie.c b/software/Power_Pico/Middlewares/LVGL/src/libs/rlottie/lv_rlottie.c deleted file mode 100644 index 3c723ec..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/rlottie/lv_rlottie.c +++ /dev/null @@ -1,244 +0,0 @@ -/** - * @file lv_rlottie.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../lvgl.h" -#if LV_USE_RLOTTIE - -#include "lv_rlottie_private.h" -#include "../../core/lv_obj_class_private.h" -#include -#include - -/********************* -* DEFINES -*********************/ -#define MY_CLASS (&lv_rlottie_class) -#define LV_ARGB32 32 - -/********************** -* TYPEDEFS -**********************/ -#define LV_ARGB32 32 - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_rlottie_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_rlottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void next_frame_task_cb(lv_timer_t * t); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_rlottie_class = { - .constructor_cb = lv_rlottie_constructor, - .destructor_cb = lv_rlottie_destructor, - .instance_size = sizeof(lv_rlottie_t), - .base_class = &lv_image_class, - .name = "rlottie", -}; - -typedef struct { - int32_t width; - int32_t height; - const char * rlottie_desc; - const char * path; -} lv_rlottie_create_info_t; - -/*Only used in lv_obj_class_create_obj, no affect multiple instances*/ -static lv_rlottie_create_info_t create_info; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_rlottie_create_from_file(lv_obj_t * parent, int32_t width, int32_t height, const char * path) -{ - create_info.width = width; - create_info.height = height; - create_info.path = path; - create_info.rlottie_desc = NULL; - - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - - return obj; -} - -lv_obj_t * lv_rlottie_create_from_raw(lv_obj_t * parent, int32_t width, int32_t height, const char * rlottie_desc) -{ - create_info.width = width; - create_info.height = height; - create_info.rlottie_desc = rlottie_desc; - create_info.path = NULL; - - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - - return obj; -} - -void lv_rlottie_set_play_mode(lv_obj_t * obj, const lv_rlottie_ctrl_t ctrl) -{ - lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; - rlottie->play_ctrl = ctrl; - - if(rlottie->task && (rlottie->dest_frame != rlottie->current_frame || - (rlottie->play_ctrl & LV_RLOTTIE_CTRL_PAUSE) == LV_RLOTTIE_CTRL_PLAY)) { - lv_timer_resume(rlottie->task); - } -} - -void lv_rlottie_set_current_frame(lv_obj_t * obj, const size_t goto_frame) -{ - lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; - rlottie->current_frame = goto_frame < rlottie->total_frames ? goto_frame : rlottie->total_frames - 1; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_rlottie_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; - - if(create_info.rlottie_desc) { - rlottie->animation = lottie_animation_from_data(create_info.rlottie_desc, create_info.rlottie_desc, ""); - } - else if(create_info.path) { - rlottie->animation = lottie_animation_from_file(create_info.path); - } - if(rlottie->animation == NULL) { - LV_LOG_WARN("The animation can't be opened"); - return; - } - - rlottie->total_frames = lottie_animation_get_totalframe(rlottie->animation); - rlottie->framerate = (size_t)lottie_animation_get_framerate(rlottie->animation); - rlottie->current_frame = 0; - - rlottie->scanline_width = create_info.width * LV_ARGB32 / 8; - - size_t allocated_buf_size = (create_info.width * create_info.height * LV_ARGB32 / 8); - rlottie->allocated_buf = lv_malloc(allocated_buf_size); - if(rlottie->allocated_buf != NULL) { - rlottie->allocated_buffer_size = allocated_buf_size; - memset(rlottie->allocated_buf, 0, allocated_buf_size); - } - - rlottie->imgdsc.header.cf = LV_COLOR_FORMAT_ARGB8888; - rlottie->imgdsc.header.h = create_info.height; - rlottie->imgdsc.header.w = create_info.width; - rlottie->imgdsc.data = (void *)rlottie->allocated_buf; - rlottie->imgdsc.data_size = allocated_buf_size; - - lv_image_set_src(obj, &rlottie->imgdsc); - - rlottie->play_ctrl = LV_RLOTTIE_CTRL_FORWARD | LV_RLOTTIE_CTRL_PLAY | LV_RLOTTIE_CTRL_LOOP; - rlottie->dest_frame = rlottie->total_frames; /* invalid destination frame so it's possible to pause on frame 0 */ - - rlottie->task = lv_timer_create(next_frame_task_cb, 1000 / rlottie->framerate, obj); - - lv_obj_update_layout(obj); -} - -static void lv_rlottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; - - if(rlottie->animation) { - lottie_animation_destroy(rlottie->animation); - rlottie->animation = 0; - rlottie->current_frame = 0; - rlottie->framerate = 0; - rlottie->scanline_width = 0; - rlottie->total_frames = 0; - } - - if(rlottie->task) { - lv_timer_delete(rlottie->task); - rlottie->task = NULL; - rlottie->play_ctrl = LV_RLOTTIE_CTRL_FORWARD; - rlottie->dest_frame = 0; - } - - lv_image_cache_drop(&rlottie->imgdsc); - - if(rlottie->allocated_buf) { - lv_free(rlottie->allocated_buf); - rlottie->allocated_buf = NULL; - rlottie->allocated_buffer_size = 0; - } - -} - -static void next_frame_task_cb(lv_timer_t * t) -{ - lv_obj_t * obj = lv_timer_get_user_data(t); - lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; - - if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_PAUSE) == LV_RLOTTIE_CTRL_PAUSE) { - if(rlottie->current_frame == rlottie->dest_frame) { - /* Pause the timer too when it has run once to avoid CPU consumption */ - lv_timer_pause(t); - return; - } - rlottie->dest_frame = rlottie->current_frame; - } - else { - if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_BACKWARD) == LV_RLOTTIE_CTRL_BACKWARD) { - if(rlottie->current_frame > 0) - --rlottie->current_frame; - else { /* Looping ? */ - if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_LOOP) == LV_RLOTTIE_CTRL_LOOP) - rlottie->current_frame = rlottie->total_frames - 1; - else { - lv_obj_send_event(obj, LV_EVENT_READY, NULL); - lv_timer_pause(t); - return; - } - } - } - else { - if(rlottie->current_frame < rlottie->total_frames) - ++rlottie->current_frame; - else { /* Looping ? */ - if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_LOOP) == LV_RLOTTIE_CTRL_LOOP) - rlottie->current_frame = 0; - else { - lv_obj_send_event(obj, LV_EVENT_READY, NULL); - lv_timer_pause(t); - return; - } - } - } - } - - lottie_animation_render( - rlottie->animation, - rlottie->current_frame, - rlottie->allocated_buf, - rlottie->imgdsc.header.w, - rlottie->imgdsc.header.h, - rlottie->scanline_width - ); - - lv_obj_invalidate(obj); -} - -#endif /*LV_USE_RLOTTIE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/rlottie/lv_rlottie.h b/software/Power_Pico/Middlewares/LVGL/src/libs/rlottie/lv_rlottie.h deleted file mode 100644 index 44bcf2e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/rlottie/lv_rlottie.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file lv_rlottie.h - * - */ - -#ifndef LV_RLOTTIE_H -#define LV_RLOTTIE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_RLOTTIE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef enum { - LV_RLOTTIE_CTRL_FORWARD = 0, - LV_RLOTTIE_CTRL_BACKWARD = 1, - LV_RLOTTIE_CTRL_PAUSE = 2, - LV_RLOTTIE_CTRL_PLAY = 0, /* Yes, play = 0 is the default mode */ - LV_RLOTTIE_CTRL_LOOP = 8, -} lv_rlottie_ctrl_t; - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_rlottie_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -lv_obj_t * lv_rlottie_create_from_file(lv_obj_t * parent, int32_t width, int32_t height, const char * path); - -lv_obj_t * lv_rlottie_create_from_raw(lv_obj_t * parent, int32_t width, int32_t height, - const char * rlottie_desc); - -void lv_rlottie_set_play_mode(lv_obj_t * rlottie, const lv_rlottie_ctrl_t ctrl); -void lv_rlottie_set_current_frame(lv_obj_t * rlottie, const size_t goto_frame); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_RLOTTIE*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_RLOTTIE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/rlottie/lv_rlottie_private.h b/software/Power_Pico/Middlewares/LVGL/src/libs/rlottie/lv_rlottie_private.h deleted file mode 100644 index 91587bd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/rlottie/lv_rlottie_private.h +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @file lv_rlottie_private.h - * - */ - -#ifndef LV_RLOTTIE_PRIVATE_H -#define LV_RLOTTIE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_rlottie.h" -#if LV_USE_RLOTTIE -#include "../../widgets/image/lv_image_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** definition in lottieanimation_capi.c */ -struct Lottie_Animation_S; - -struct lv_rlottie_t { - lv_image_t img_ext; - struct Lottie_Animation_S * animation; - lv_timer_t * task; - lv_image_dsc_t imgdsc; - size_t total_frames; - size_t current_frame; - size_t framerate; - uint32_t * allocated_buf; - size_t allocated_buffer_size; - size_t scanline_width; - lv_rlottie_ctrl_t play_ctrl; - size_t dest_frame; -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_RLOTTIE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_RLOTTIE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/add_lvgl_if.sh b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/add_lvgl_if.sh deleted file mode 100644 index 43ce903..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/add_lvgl_if.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -#Add LVGL #if LV_USE_THORVG_INTERNAL guard -#Usage -# find -name "*.cpp" | xargs ./add_lvgl_if.sh -# find -name "t*.h" | xargs ./add_lvgl_if.sh - -sed '0,/\*\/$/ {/\*\/$/ {n; s|^|\n#include "../../lv_conf_internal.h"\n#if LV_USE_THORVG_INTERNAL\n|}}' $@ -i - -sed -i -e '$a\ -\ -#endif /* LV_USE_THORVG_INTERNAL */\ -' $@ -i diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/config.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/config.h deleted file mode 100644 index baa258a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/config.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Autogenerated by the Meson build system. - * Do not edit, your changes will be lost. - */ - -#pragma once - -#define THORVG_SW_RASTER_SUPPORT 1 - -#define THORVG_SVG_LOADER_SUPPORT LV_USE_LOTTIE - -#define THORVG_LOTTIE_LOADER_SUPPORT LV_USE_LOTTIE - -#define THORVG_VERSION_STRING "0.13.5" - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/allocators.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/allocators.h deleted file mode 100644 index a943cf1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/allocators.h +++ /dev/null @@ -1,693 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_ALLOCATORS_H_ -#define RAPIDJSON_ALLOCATORS_H_ - -#include "rapidjson.h" -#include "internal/meta.h" - -#include -#include - -#if RAPIDJSON_HAS_CXX11 -#include -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -/////////////////////////////////////////////////////////////////////////////// -// Allocator - -/*! \class rapidjson::Allocator - \brief Concept for allocating, resizing and freeing memory block. - - Note that Malloc() and Realloc() are non-static but Free() is static. - - So if an allocator need to support Free(), it needs to put its pointer in - the header of memory block. - -\code -concept Allocator { - static const bool kNeedFree; //!< Whether this allocator needs to call Free(). - - // Allocate a memory block. - // \param size of the memory block in bytes. - // \returns pointer to the memory block. - void* Malloc(size_t size); - - // Resize a memory block. - // \param originalPtr The pointer to current memory block. Null pointer is permitted. - // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.) - // \param newSize the new size in bytes. - void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); - - // Free a memory block. - // \param pointer to the memory block. Null pointer is permitted. - static void Free(void *ptr); -}; -\endcode -*/ - - -/*! \def RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY - \ingroup RAPIDJSON_CONFIG - \brief User-defined kDefaultChunkCapacity definition. - - User can define this as any \c size that is a power of 2. -*/ - -#ifndef RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY -#define RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY (64 * 1024) -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// CrtAllocator - -//! C-runtime library allocator. -/*! This class is just wrapper for standard C library memory routines. - \note implements Allocator concept -*/ -class CrtAllocator { -public: - static const bool kNeedFree = true; - void* Malloc(size_t size) { - if (size) // behavior of malloc(0) is implementation defined. - return RAPIDJSON_MALLOC(size); - else - return NULL; // standardize to returning NULL. - } - void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { - (void)originalSize; - if (newSize == 0) { - RAPIDJSON_FREE(originalPtr); - return NULL; - } - return RAPIDJSON_REALLOC(originalPtr, newSize); - } - static void Free(void *ptr) RAPIDJSON_NOEXCEPT { RAPIDJSON_FREE(ptr); } - - bool operator==(const CrtAllocator&) const RAPIDJSON_NOEXCEPT { - return true; - } - bool operator!=(const CrtAllocator&) const RAPIDJSON_NOEXCEPT { - return false; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// MemoryPoolAllocator - -//! Default memory allocator used by the parser and DOM. -/*! This allocator allocate memory blocks from pre-allocated memory chunks. - - It does not free memory blocks. And Realloc() only allocate new memory. - - The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default. - - User may also supply a buffer as the first chunk. - - If the user-buffer is full then additional chunks are allocated by BaseAllocator. - - The user-buffer is not deallocated by this allocator. - - \tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator. - \note implements Allocator concept -*/ -template -class MemoryPoolAllocator { - //! Chunk header for perpending to each chunk. - /*! Chunks are stored as a singly linked list. - */ - struct ChunkHeader { - size_t capacity; //!< Capacity of the chunk in bytes (excluding the header itself). - size_t size; //!< Current size of allocated memory in bytes. - ChunkHeader *next; //!< Next chunk in the linked list. - }; - - struct SharedData { - ChunkHeader *chunkHead; //!< Head of the chunk linked-list. Only the head chunk serves allocation. - BaseAllocator* ownBaseAllocator; //!< base allocator created by this object. - size_t refcount; - bool ownBuffer; - }; - - static const size_t SIZEOF_SHARED_DATA = RAPIDJSON_ALIGN(sizeof(SharedData)); - static const size_t SIZEOF_CHUNK_HEADER = RAPIDJSON_ALIGN(sizeof(ChunkHeader)); - - static inline ChunkHeader *GetChunkHead(SharedData *shared) - { - return reinterpret_cast(reinterpret_cast(shared) + SIZEOF_SHARED_DATA); - } - static inline uint8_t *GetChunkBuffer(SharedData *shared) - { - return reinterpret_cast(shared->chunkHead) + SIZEOF_CHUNK_HEADER; - } - - static const size_t kDefaultChunkCapacity = RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY; //!< Default chunk capacity. - -public: - static const bool kNeedFree = false; //!< Tell users that no need to call Free() with this allocator. (concept Allocator) - static const bool kRefCounted = true; //!< Tell users that this allocator is reference counted on copy - - //! Constructor with chunkSize. - /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. - \param baseAllocator The allocator for allocating memory chunks. - */ - explicit - MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : - chunk_capacity_(chunkSize), - baseAllocator_(baseAllocator ? baseAllocator : RAPIDJSON_NEW(BaseAllocator)()), - shared_(static_cast(baseAllocator_ ? baseAllocator_->Malloc(SIZEOF_SHARED_DATA + SIZEOF_CHUNK_HEADER) : 0)) - { - RAPIDJSON_ASSERT(baseAllocator_ != 0); - RAPIDJSON_ASSERT(shared_ != 0); - if (baseAllocator) { - shared_->ownBaseAllocator = 0; - } - else { - shared_->ownBaseAllocator = baseAllocator_; - } - shared_->chunkHead = GetChunkHead(shared_); - shared_->chunkHead->capacity = 0; - shared_->chunkHead->size = 0; - shared_->chunkHead->next = 0; - shared_->ownBuffer = true; - shared_->refcount = 1; - } - - //! Constructor with user-supplied buffer. - /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size. - - The user buffer will not be deallocated when this allocator is destructed. - - \param buffer User supplied buffer. - \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader). - \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. - \param baseAllocator The allocator for allocating memory chunks. - */ - MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : - chunk_capacity_(chunkSize), - baseAllocator_(baseAllocator), - shared_(static_cast(AlignBuffer(buffer, size))) - { - RAPIDJSON_ASSERT(size >= SIZEOF_SHARED_DATA + SIZEOF_CHUNK_HEADER); - shared_->chunkHead = GetChunkHead(shared_); - shared_->chunkHead->capacity = size - SIZEOF_SHARED_DATA - SIZEOF_CHUNK_HEADER; - shared_->chunkHead->size = 0; - shared_->chunkHead->next = 0; - shared_->ownBaseAllocator = 0; - shared_->ownBuffer = false; - shared_->refcount = 1; - } - - MemoryPoolAllocator(const MemoryPoolAllocator& rhs) RAPIDJSON_NOEXCEPT : - chunk_capacity_(rhs.chunk_capacity_), - baseAllocator_(rhs.baseAllocator_), - shared_(rhs.shared_) - { - RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); - ++shared_->refcount; - } - MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) RAPIDJSON_NOEXCEPT - { - RAPIDJSON_NOEXCEPT_ASSERT(rhs.shared_->refcount > 0); - ++rhs.shared_->refcount; - this->~MemoryPoolAllocator(); - baseAllocator_ = rhs.baseAllocator_; - chunk_capacity_ = rhs.chunk_capacity_; - shared_ = rhs.shared_; - return *this; - } - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - MemoryPoolAllocator(MemoryPoolAllocator&& rhs) RAPIDJSON_NOEXCEPT : - chunk_capacity_(rhs.chunk_capacity_), - baseAllocator_(rhs.baseAllocator_), - shared_(rhs.shared_) - { - RAPIDJSON_NOEXCEPT_ASSERT(rhs.shared_->refcount > 0); - rhs.shared_ = 0; - } - MemoryPoolAllocator& operator=(MemoryPoolAllocator&& rhs) RAPIDJSON_NOEXCEPT - { - RAPIDJSON_NOEXCEPT_ASSERT(rhs.shared_->refcount > 0); - this->~MemoryPoolAllocator(); - baseAllocator_ = rhs.baseAllocator_; - chunk_capacity_ = rhs.chunk_capacity_; - shared_ = rhs.shared_; - rhs.shared_ = 0; - return *this; - } -#endif - - //! Destructor. - /*! This deallocates all memory chunks, excluding the user-supplied buffer. - */ - ~MemoryPoolAllocator() RAPIDJSON_NOEXCEPT { - if (!shared_) { - // do nothing if moved - return; - } - if (shared_->refcount > 1) { - --shared_->refcount; - return; - } - Clear(); - BaseAllocator *a = shared_->ownBaseAllocator; - if (shared_->ownBuffer) { - baseAllocator_->Free(shared_); - } - RAPIDJSON_DELETE(a); - } - - //! Deallocates all memory chunks, excluding the first/user one. - void Clear() RAPIDJSON_NOEXCEPT { - RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); - for (;;) { - ChunkHeader* c = shared_->chunkHead; - if (!c->next) { - break; - } - shared_->chunkHead = c->next; - baseAllocator_->Free(c); - } - shared_->chunkHead->size = 0; - } - - //! Computes the total capacity of allocated memory chunks. - /*! \return total capacity in bytes. - */ - size_t Capacity() const RAPIDJSON_NOEXCEPT { - RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); - size_t capacity = 0; - for (ChunkHeader* c = shared_->chunkHead; c != 0; c = c->next) - capacity += c->capacity; - return capacity; - } - - //! Computes the memory blocks allocated. - /*! \return total used bytes. - */ - size_t Size() const RAPIDJSON_NOEXCEPT { - RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); - size_t size = 0; - for (ChunkHeader* c = shared_->chunkHead; c != 0; c = c->next) - size += c->size; - return size; - } - - //! Whether the allocator is shared. - /*! \return true or false. - */ - bool Shared() const RAPIDJSON_NOEXCEPT { - RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); - return shared_->refcount > 1; - } - - //! Allocates a memory block. (concept Allocator) - void* Malloc(size_t size) { - RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); - if (!size) - return NULL; - - size = RAPIDJSON_ALIGN(size); - if (RAPIDJSON_UNLIKELY(shared_->chunkHead->size + size > shared_->chunkHead->capacity)) - if (!AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size)) - return NULL; - - void *buffer = GetChunkBuffer(shared_) + shared_->chunkHead->size; - shared_->chunkHead->size += size; - return buffer; - } - - //! Resizes a memory block (concept Allocator) - void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { - if (originalPtr == 0) - return Malloc(newSize); - - RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); - if (newSize == 0) - return NULL; - - originalSize = RAPIDJSON_ALIGN(originalSize); - newSize = RAPIDJSON_ALIGN(newSize); - - // Do not shrink if new size is smaller than original - if (originalSize >= newSize) - return originalPtr; - - // Simply expand it if it is the last allocation and there is sufficient space - if (originalPtr == GetChunkBuffer(shared_) + shared_->chunkHead->size - originalSize) { - size_t increment = static_cast(newSize - originalSize); - if (shared_->chunkHead->size + increment <= shared_->chunkHead->capacity) { - shared_->chunkHead->size += increment; - return originalPtr; - } - } - - // Realloc process: allocate and copy memory, do not free original buffer. - if (void* newBuffer = Malloc(newSize)) { - if (originalSize) - std::memcpy(newBuffer, originalPtr, originalSize); - return newBuffer; - } - else - return NULL; - } - - //! Frees a memory block (concept Allocator) - static void Free(void *ptr) RAPIDJSON_NOEXCEPT { (void)ptr; } // Do nothing - - //! Compare (equality) with another MemoryPoolAllocator - bool operator==(const MemoryPoolAllocator& rhs) const RAPIDJSON_NOEXCEPT { - RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); - RAPIDJSON_NOEXCEPT_ASSERT(rhs.shared_->refcount > 0); - return shared_ == rhs.shared_; - } - //! Compare (inequality) with another MemoryPoolAllocator - bool operator!=(const MemoryPoolAllocator& rhs) const RAPIDJSON_NOEXCEPT { - return !operator==(rhs); - } - -private: - //! Creates a new chunk. - /*! \param capacity Capacity of the chunk in bytes. - \return true if success. - */ - bool AddChunk(size_t capacity) { - if (!baseAllocator_) - shared_->ownBaseAllocator = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator)(); - if (ChunkHeader* chunk = static_cast(baseAllocator_->Malloc(SIZEOF_CHUNK_HEADER + capacity))) { - chunk->capacity = capacity; - chunk->size = 0; - chunk->next = shared_->chunkHead; - shared_->chunkHead = chunk; - return true; - } - else - return false; - } - - static inline void* AlignBuffer(void* buf, size_t &size) - { - RAPIDJSON_NOEXCEPT_ASSERT(buf != 0); - const uintptr_t mask = sizeof(void*) - 1; - const uintptr_t ubuf = reinterpret_cast(buf); - if (RAPIDJSON_UNLIKELY(ubuf & mask)) { - const uintptr_t abuf = (ubuf + mask) & ~mask; - RAPIDJSON_ASSERT(size >= abuf - ubuf); - buf = reinterpret_cast(abuf); - size -= abuf - ubuf; - } - return buf; - } - - size_t chunk_capacity_; //!< The minimum capacity of chunk when they are allocated. - BaseAllocator* baseAllocator_; //!< base allocator for allocating memory chunks. - SharedData *shared_; //!< The shared data of the allocator -}; - -namespace internal { - template - struct IsRefCounted : - public FalseType - { }; - template - struct IsRefCounted::Type> : - public TrueType - { }; -} - -template -inline T* Realloc(A& a, T* old_p, size_t old_n, size_t new_n) -{ - RAPIDJSON_NOEXCEPT_ASSERT(old_n <= (std::numeric_limits::max)() / sizeof(T) && new_n <= (std::numeric_limits::max)() / sizeof(T)); - return static_cast(a.Realloc(old_p, old_n * sizeof(T), new_n * sizeof(T))); -} - -template -inline T *Malloc(A& a, size_t n = 1) -{ - return Realloc(a, NULL, 0, n); -} - -template -inline void Free(A& a, T *p, size_t n = 1) -{ - static_cast(Realloc(a, p, n, 0)); -} - -#ifdef __GNUC__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(effc++) // std::allocator can safely be inherited -#endif - -template -class StdAllocator : - public std::allocator -{ - typedef std::allocator allocator_type; -#if RAPIDJSON_HAS_CXX11 - typedef std::allocator_traits traits_type; -#else - typedef allocator_type traits_type; -#endif - -public: - typedef BaseAllocator BaseAllocatorType; - - StdAllocator() RAPIDJSON_NOEXCEPT : - allocator_type(), - baseAllocator_() - { } - - StdAllocator(const StdAllocator& rhs) RAPIDJSON_NOEXCEPT : - allocator_type(rhs), - baseAllocator_(rhs.baseAllocator_) - { } - - template - StdAllocator(const StdAllocator& rhs) RAPIDJSON_NOEXCEPT : - allocator_type(rhs), - baseAllocator_(rhs.baseAllocator_) - { } - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - StdAllocator(StdAllocator&& rhs) RAPIDJSON_NOEXCEPT : - allocator_type(std::move(rhs)), - baseAllocator_(std::move(rhs.baseAllocator_)) - { } -#endif -#if RAPIDJSON_HAS_CXX11 - using propagate_on_container_move_assignment = std::true_type; - using propagate_on_container_swap = std::true_type; -#endif - - /* implicit */ - StdAllocator(const BaseAllocator& allocator) RAPIDJSON_NOEXCEPT : - allocator_type(), - baseAllocator_(allocator) - { } - - ~StdAllocator() RAPIDJSON_NOEXCEPT - { } - - template - struct rebind { - typedef StdAllocator other; - }; - - typedef typename traits_type::size_type size_type; - typedef typename traits_type::difference_type difference_type; - - typedef typename traits_type::value_type value_type; - typedef typename traits_type::pointer pointer; - typedef typename traits_type::const_pointer const_pointer; - -#if RAPIDJSON_HAS_CXX11 - - typedef typename std::add_lvalue_reference::type &reference; - typedef typename std::add_lvalue_reference::type>::type &const_reference; - - pointer address(reference r) const RAPIDJSON_NOEXCEPT - { - return std::addressof(r); - } - const_pointer address(const_reference r) const RAPIDJSON_NOEXCEPT - { - return std::addressof(r); - } - - size_type max_size() const RAPIDJSON_NOEXCEPT - { - return traits_type::max_size(*this); - } - - template - void construct(pointer p, Args&&... args) - { - traits_type::construct(*this, p, std::forward(args)...); - } - void destroy(pointer p) - { - traits_type::destroy(*this, p); - } - -#else // !RAPIDJSON_HAS_CXX11 - - typedef typename allocator_type::reference reference; - typedef typename allocator_type::const_reference const_reference; - - pointer address(reference r) const RAPIDJSON_NOEXCEPT - { - return allocator_type::address(r); - } - const_pointer address(const_reference r) const RAPIDJSON_NOEXCEPT - { - return allocator_type::address(r); - } - - size_type max_size() const RAPIDJSON_NOEXCEPT - { - return allocator_type::max_size(); - } - - void construct(pointer p, const_reference r) - { - allocator_type::construct(p, r); - } - void destroy(pointer p) - { - allocator_type::destroy(p); - } - -#endif // !RAPIDJSON_HAS_CXX11 - - template - U* allocate(size_type n = 1, const void* = 0) - { - return RAPIDJSON_NAMESPACE::Malloc(baseAllocator_, n); - } - template - void deallocate(U* p, size_type n = 1) - { - RAPIDJSON_NAMESPACE::Free(baseAllocator_, p, n); - } - - pointer allocate(size_type n = 1, const void* = 0) - { - return allocate(n); - } - void deallocate(pointer p, size_type n = 1) - { - deallocate(p, n); - } - -#if RAPIDJSON_HAS_CXX11 - using is_always_equal = std::is_empty; -#endif - - template - bool operator==(const StdAllocator& rhs) const RAPIDJSON_NOEXCEPT - { - return baseAllocator_ == rhs.baseAllocator_; - } - template - bool operator!=(const StdAllocator& rhs) const RAPIDJSON_NOEXCEPT - { - return !operator==(rhs); - } - - //! rapidjson Allocator concept - static const bool kNeedFree = BaseAllocator::kNeedFree; - static const bool kRefCounted = internal::IsRefCounted::Value; - void* Malloc(size_t size) - { - return baseAllocator_.Malloc(size); - } - void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) - { - return baseAllocator_.Realloc(originalPtr, originalSize, newSize); - } - static void Free(void *ptr) RAPIDJSON_NOEXCEPT - { - BaseAllocator::Free(ptr); - } - -private: - template - friend class StdAllocator; // access to StdAllocator.* - - BaseAllocator baseAllocator_; -}; - -#if !RAPIDJSON_HAS_CXX17 // std::allocator deprecated in C++17 -template -class StdAllocator : - public std::allocator -{ - typedef std::allocator allocator_type; - -public: - typedef BaseAllocator BaseAllocatorType; - - StdAllocator() RAPIDJSON_NOEXCEPT : - allocator_type(), - baseAllocator_() - { } - - StdAllocator(const StdAllocator& rhs) RAPIDJSON_NOEXCEPT : - allocator_type(rhs), - baseAllocator_(rhs.baseAllocator_) - { } - - template - StdAllocator(const StdAllocator& rhs) RAPIDJSON_NOEXCEPT : - allocator_type(rhs), - baseAllocator_(rhs.baseAllocator_) - { } - - /* implicit */ - StdAllocator(const BaseAllocator& baseAllocator) RAPIDJSON_NOEXCEPT : - allocator_type(), - baseAllocator_(baseAllocator) - { } - - ~StdAllocator() RAPIDJSON_NOEXCEPT - { } - - template - struct rebind { - typedef StdAllocator other; - }; - - typedef typename allocator_type::value_type value_type; - -private: - template - friend class StdAllocator; // access to StdAllocator.* - - BaseAllocator baseAllocator_; -}; -#endif - -#ifdef __GNUC__ -RAPIDJSON_DIAG_POP -#endif - -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/cursorstreamwrapper.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/cursorstreamwrapper.h deleted file mode 100644 index fd6513d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/cursorstreamwrapper.h +++ /dev/null @@ -1,78 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_CURSORSTREAMWRAPPER_H_ -#define RAPIDJSON_CURSORSTREAMWRAPPER_H_ - -#include "stream.h" - -#if defined(__GNUC__) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(effc++) -#endif - -#if defined(_MSC_VER) && _MSC_VER <= 1800 -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(4702) // unreachable code -RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated -#endif - -RAPIDJSON_NAMESPACE_BEGIN - - -//! Cursor stream wrapper for counting line and column number if error exists. -/*! - \tparam InputStream Any stream that implements Stream Concept -*/ -template > -class CursorStreamWrapper : public GenericStreamWrapper { -public: - typedef typename Encoding::Ch Ch; - - CursorStreamWrapper(InputStream& is): - GenericStreamWrapper(is), line_(1), col_(0) {} - - // counting line and column number - Ch Take() { - Ch ch = this->is_.Take(); - if(ch == '\n') { - line_ ++; - col_ = 0; - } else { - col_ ++; - } - return ch; - } - - //! Get the error line number, if error exists. - size_t GetLine() const { return line_; } - //! Get the error column number, if error exists. - size_t GetColumn() const { return col_; } - -private: - size_t line_; //!< Current Line - size_t col_; //!< Current Column -}; - -#if defined(_MSC_VER) && _MSC_VER <= 1800 -RAPIDJSON_DIAG_POP -#endif - -#if defined(__GNUC__) -RAPIDJSON_DIAG_POP -#endif - -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_CURSORSTREAMWRAPPER_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/document.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/document.h deleted file mode 100644 index f18fbd5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/document.h +++ /dev/null @@ -1,3043 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_DOCUMENT_H_ -#define RAPIDJSON_DOCUMENT_H_ - -/*! \file document.h */ - -#include "reader.h" -#include "internal/meta.h" -#include "internal/strfunc.h" -#include "memorystream.h" -#include "encodedstream.h" -#include // placement new -#include -#ifdef __cpp_lib_three_way_comparison -#include -#endif - -RAPIDJSON_DIAG_PUSH -#ifdef __clang__ -RAPIDJSON_DIAG_OFF(padded) -RAPIDJSON_DIAG_OFF(switch-enum) -RAPIDJSON_DIAG_OFF(c++98-compat) -#elif defined(_MSC_VER) -RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant -RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data -#endif - -#ifdef __GNUC__ -RAPIDJSON_DIAG_OFF(effc++) -#endif // __GNUC__ - -#ifdef GetObject -// see https://github.com/Tencent/rapidjson/issues/1448 -// a former included windows.h might have defined a macro called GetObject, which affects -// GetObject defined here. This ensures the macro does not get applied -#pragma push_macro("GetObject") -#define RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED -#undef GetObject -#endif - -#ifndef RAPIDJSON_NOMEMBERITERATORCLASS -#include // std::random_access_iterator_tag -#endif - -#if RAPIDJSON_USE_MEMBERSMAP -#include // std::multimap -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -// Forward declaration. -template -class GenericValue; - -template -class GenericDocument; - -/*! \def RAPIDJSON_DEFAULT_ALLOCATOR - \ingroup RAPIDJSON_CONFIG - \brief Allows to choose default allocator. - - User can define this to use CrtAllocator or MemoryPoolAllocator. -*/ -#ifndef RAPIDJSON_DEFAULT_ALLOCATOR -#define RAPIDJSON_DEFAULT_ALLOCATOR ::RAPIDJSON_NAMESPACE::MemoryPoolAllocator<::RAPIDJSON_NAMESPACE::CrtAllocator> -#endif - -/*! \def RAPIDJSON_DEFAULT_STACK_ALLOCATOR - \ingroup RAPIDJSON_CONFIG - \brief Allows to choose default stack allocator for Document. - - User can define this to use CrtAllocator or MemoryPoolAllocator. -*/ -#ifndef RAPIDJSON_DEFAULT_STACK_ALLOCATOR -#define RAPIDJSON_DEFAULT_STACK_ALLOCATOR ::RAPIDJSON_NAMESPACE::CrtAllocator -#endif - -/*! \def RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY - \ingroup RAPIDJSON_CONFIG - \brief User defined kDefaultObjectCapacity value. - - User can define this as any natural number. -*/ -#ifndef RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY -// number of objects that rapidjson::Value allocates memory for by default -#define RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY 16 -#endif - -/*! \def RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY - \ingroup RAPIDJSON_CONFIG - \brief User defined kDefaultArrayCapacity value. - - User can define this as any natural number. -*/ -#ifndef RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY -// number of array elements that rapidjson::Value allocates memory for by default -#define RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY 16 -#endif - -//! Name-value pair in a JSON object value. -/*! - This class was internal to GenericValue. It used to be a inner struct. - But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct. - https://code.google.com/p/rapidjson/issues/detail?id=64 -*/ -template -class GenericMember { -public: - GenericValue name; //!< name of member (must be a string) - GenericValue value; //!< value of member. - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - //! Move constructor in C++11 - GenericMember(GenericMember&& rhs) RAPIDJSON_NOEXCEPT - : name(std::move(rhs.name)), - value(std::move(rhs.value)) - { - } - - //! Move assignment in C++11 - GenericMember& operator=(GenericMember&& rhs) RAPIDJSON_NOEXCEPT { - return *this = static_cast(rhs); - } -#endif - - //! Assignment with move semantics. - /*! \param rhs Source of the assignment. Its name and value will become a null value after assignment. - */ - GenericMember& operator=(GenericMember& rhs) RAPIDJSON_NOEXCEPT { - if (RAPIDJSON_LIKELY(this != &rhs)) { - name = rhs.name; - value = rhs.value; - } - return *this; - } - - // swap() for std::sort() and other potential use in STL. - friend inline void swap(GenericMember& a, GenericMember& b) RAPIDJSON_NOEXCEPT { - a.name.Swap(b.name); - a.value.Swap(b.value); - } - -private: - //! Copy constructor is not permitted. - GenericMember(const GenericMember& rhs); -}; - -/////////////////////////////////////////////////////////////////////////////// -// GenericMemberIterator - -#ifndef RAPIDJSON_NOMEMBERITERATORCLASS - -//! (Constant) member iterator for a JSON object value -/*! - \tparam Const Is this a constant iterator? - \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) - \tparam Allocator Allocator type for allocating memory of object, array and string. - - This class implements a Random Access Iterator for GenericMember elements - of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements]. - - \note This iterator implementation is mainly intended to avoid implicit - conversions from iterator values to \c NULL, - e.g. from GenericValue::FindMember. - - \note Define \c RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a - pointer-based implementation, if your platform doesn't provide - the C++ header. - - \see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator - */ -template -class GenericMemberIterator { - - friend class GenericValue; - template friend class GenericMemberIterator; - - typedef GenericMember PlainType; - typedef typename internal::MaybeAddConst::Type ValueType; - -public: - //! Iterator type itself - typedef GenericMemberIterator Iterator; - //! Constant iterator type - typedef GenericMemberIterator ConstIterator; - //! Non-constant iterator type - typedef GenericMemberIterator NonConstIterator; - - /** \name std::iterator_traits support */ - //@{ - typedef ValueType value_type; - typedef ValueType * pointer; - typedef ValueType & reference; - typedef std::ptrdiff_t difference_type; - typedef std::random_access_iterator_tag iterator_category; - //@} - - //! Pointer to (const) GenericMember - typedef pointer Pointer; - //! Reference to (const) GenericMember - typedef reference Reference; - //! Signed integer type (e.g. \c ptrdiff_t) - typedef difference_type DifferenceType; - - //! Default constructor (singular value) - /*! Creates an iterator pointing to no element. - \note All operations, except for comparisons, are undefined on such values. - */ - GenericMemberIterator() : ptr_() {} - - //! Iterator conversions to more const - /*! - \param it (Non-const) iterator to copy from - - Allows the creation of an iterator from another GenericMemberIterator - that is "less const". Especially, creating a non-constant iterator - from a constant iterator are disabled: - \li const -> non-const (not ok) - \li const -> const (ok) - \li non-const -> const (ok) - \li non-const -> non-const (ok) - - \note If the \c Const template parameter is already \c false, this - constructor effectively defines a regular copy-constructor. - Otherwise, the copy constructor is implicitly defined. - */ - GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {} - Iterator& operator=(const NonConstIterator & it) { ptr_ = it.ptr_; return *this; } - - //! @name stepping - //@{ - Iterator& operator++(){ ++ptr_; return *this; } - Iterator& operator--(){ --ptr_; return *this; } - Iterator operator++(int){ Iterator old(*this); ++ptr_; return old; } - Iterator operator--(int){ Iterator old(*this); --ptr_; return old; } - //@} - - //! @name increment/decrement - //@{ - Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); } - Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); } - - Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; } - Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; } - //@} - - //! @name relations - //@{ - template bool operator==(const GenericMemberIterator& that) const { return ptr_ == that.ptr_; } - template bool operator!=(const GenericMemberIterator& that) const { return ptr_ != that.ptr_; } - template bool operator<=(const GenericMemberIterator& that) const { return ptr_ <= that.ptr_; } - template bool operator>=(const GenericMemberIterator& that) const { return ptr_ >= that.ptr_; } - template bool operator< (const GenericMemberIterator& that) const { return ptr_ < that.ptr_; } - template bool operator> (const GenericMemberIterator& that) const { return ptr_ > that.ptr_; } - -#ifdef __cpp_lib_three_way_comparison - template std::strong_ordering operator<=>(const GenericMemberIterator& that) const { return ptr_ <=> that.ptr_; } -#endif - //@} - - //! @name dereference - //@{ - Reference operator*() const { return *ptr_; } - Pointer operator->() const { return ptr_; } - Reference operator[](DifferenceType n) const { return ptr_[n]; } - //@} - - //! Distance - DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; } - -private: - //! Internal constructor from plain pointer - explicit GenericMemberIterator(Pointer p) : ptr_(p) {} - - Pointer ptr_; //!< raw pointer -}; - -#else // RAPIDJSON_NOMEMBERITERATORCLASS - -// class-based member iterator implementation disabled, use plain pointers - -template -class GenericMemberIterator; - -//! non-const GenericMemberIterator -template -class GenericMemberIterator { -public: - //! use plain pointer as iterator type - typedef GenericMember* Iterator; -}; -//! const GenericMemberIterator -template -class GenericMemberIterator { -public: - //! use plain const pointer as iterator type - typedef const GenericMember* Iterator; -}; - -#endif // RAPIDJSON_NOMEMBERITERATORCLASS - -/////////////////////////////////////////////////////////////////////////////// -// GenericStringRef - -//! Reference to a constant string (not taking a copy) -/*! - \tparam CharType character type of the string - - This helper class is used to automatically infer constant string - references for string literals, especially from \c const \b (!) - character arrays. - - The main use is for creating JSON string values without copying the - source string via an \ref Allocator. This requires that the referenced - string pointers have a sufficient lifetime, which exceeds the lifetime - of the associated GenericValue. - - \b Example - \code - Value v("foo"); // ok, no need to copy & calculate length - const char foo[] = "foo"; - v.SetString(foo); // ok - - const char* bar = foo; - // Value x(bar); // not ok, can't rely on bar's lifetime - Value x(StringRef(bar)); // lifetime explicitly guaranteed by user - Value y(StringRef(bar, 3)); // ok, explicitly pass length - \endcode - - \see StringRef, GenericValue::SetString -*/ -template -struct GenericStringRef { - typedef CharType Ch; //!< character type of the string - - //! Create string reference from \c const character array -#ifndef __clang__ // -Wdocumentation - /*! - This constructor implicitly creates a constant string reference from - a \c const character array. It has better performance than - \ref StringRef(const CharType*) by inferring the string \ref length - from the array length, and also supports strings containing null - characters. - - \tparam N length of the string, automatically inferred - - \param str Constant character array, lifetime assumed to be longer - than the use of the string in e.g. a GenericValue - - \post \ref s == str - - \note Constant complexity. - \note There is a hidden, private overload to disallow references to - non-const character arrays to be created via this constructor. - By this, e.g. function-scope arrays used to be filled via - \c snprintf are excluded from consideration. - In such cases, the referenced string should be \b copied to the - GenericValue instead. - */ -#endif - template - GenericStringRef(const CharType (&str)[N]) RAPIDJSON_NOEXCEPT - : s(str), length(N-1) {} - - //! Explicitly create string reference from \c const character pointer -#ifndef __clang__ // -Wdocumentation - /*! - This constructor can be used to \b explicitly create a reference to - a constant string pointer. - - \see StringRef(const CharType*) - - \param str Constant character pointer, lifetime assumed to be longer - than the use of the string in e.g. a GenericValue - - \post \ref s == str - - \note There is a hidden, private overload to disallow references to - non-const character arrays to be created via this constructor. - By this, e.g. function-scope arrays used to be filled via - \c snprintf are excluded from consideration. - In such cases, the referenced string should be \b copied to the - GenericValue instead. - */ -#endif - explicit GenericStringRef(const CharType* str) - : s(str), length(NotNullStrLen(str)) {} - - //! Create constant string reference from pointer and length -#ifndef __clang__ // -Wdocumentation - /*! \param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue - \param len length of the string, excluding the trailing NULL terminator - - \post \ref s == str && \ref length == len - \note Constant complexity. - */ -#endif - GenericStringRef(const CharType* str, SizeType len) - : s(RAPIDJSON_LIKELY(str) ? str : emptyString), length(len) { RAPIDJSON_ASSERT(str != 0 || len == 0u); } - - GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {} - - //! implicit conversion to plain CharType pointer - operator const Ch *() const { return s; } - - const Ch* const s; //!< plain CharType pointer - const SizeType length; //!< length of the string (excluding the trailing NULL terminator) - -private: - SizeType NotNullStrLen(const CharType* str) { - RAPIDJSON_ASSERT(str != 0); - return internal::StrLen(str); - } - - /// Empty string - used when passing in a NULL pointer - static const Ch emptyString[]; - - //! Disallow construction from non-const array - template - GenericStringRef(CharType (&str)[N]) /* = delete */; - //! Copy assignment operator not permitted - immutable type - GenericStringRef& operator=(const GenericStringRef& rhs) /* = delete */; -}; - -template -const CharType GenericStringRef::emptyString[] = { CharType() }; - -//! Mark a character pointer as constant string -/*! Mark a plain character pointer as a "string literal". This function - can be used to avoid copying a character string to be referenced as a - value in a JSON GenericValue object, if the string's lifetime is known - to be valid long enough. - \tparam CharType Character type of the string - \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue - \return GenericStringRef string reference object - \relatesalso GenericStringRef - - \see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember -*/ -template -inline GenericStringRef StringRef(const CharType* str) { - return GenericStringRef(str); -} - -//! Mark a character pointer as constant string -/*! Mark a plain character pointer as a "string literal". This function - can be used to avoid copying a character string to be referenced as a - value in a JSON GenericValue object, if the string's lifetime is known - to be valid long enough. - - This version has better performance with supplied length, and also - supports string containing null characters. - - \tparam CharType character type of the string - \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue - \param length The length of source string. - \return GenericStringRef string reference object - \relatesalso GenericStringRef -*/ -template -inline GenericStringRef StringRef(const CharType* str, size_t length) { - return GenericStringRef(str, SizeType(length)); -} - -#if RAPIDJSON_HAS_STDSTRING -//! Mark a string object as constant string -/*! Mark a string object (e.g. \c std::string) as a "string literal". - This function can be used to avoid copying a string to be referenced as a - value in a JSON GenericValue object, if the string's lifetime is known - to be valid long enough. - - \tparam CharType character type of the string - \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue - \return GenericStringRef string reference object - \relatesalso GenericStringRef - \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. -*/ -template -inline GenericStringRef StringRef(const std::basic_string& str) { - return GenericStringRef(str.data(), SizeType(str.size())); -} -#endif - -/////////////////////////////////////////////////////////////////////////////// -// GenericValue type traits -namespace internal { - -template -struct IsGenericValueImpl : FalseType {}; - -// select candidates according to nested encoding and allocator types -template struct IsGenericValueImpl::Type, typename Void::Type> - : IsBaseOf, T>::Type {}; - -// helper to match arbitrary GenericValue instantiations, including derived classes -template struct IsGenericValue : IsGenericValueImpl::Type {}; - -} // namespace internal - -/////////////////////////////////////////////////////////////////////////////// -// TypeHelper - -namespace internal { - -template -struct TypeHelper {}; - -template -struct TypeHelper { - static bool Is(const ValueType& v) { return v.IsBool(); } - static bool Get(const ValueType& v) { return v.GetBool(); } - static ValueType& Set(ValueType& v, bool data) { return v.SetBool(data); } - static ValueType& Set(ValueType& v, bool data, typename ValueType::AllocatorType&) { return v.SetBool(data); } -}; - -template -struct TypeHelper { - static bool Is(const ValueType& v) { return v.IsInt(); } - static int Get(const ValueType& v) { return v.GetInt(); } - static ValueType& Set(ValueType& v, int data) { return v.SetInt(data); } - static ValueType& Set(ValueType& v, int data, typename ValueType::AllocatorType&) { return v.SetInt(data); } -}; - -template -struct TypeHelper { - static bool Is(const ValueType& v) { return v.IsUint(); } - static unsigned Get(const ValueType& v) { return v.GetUint(); } - static ValueType& Set(ValueType& v, unsigned data) { return v.SetUint(data); } - static ValueType& Set(ValueType& v, unsigned data, typename ValueType::AllocatorType&) { return v.SetUint(data); } -}; - -#ifdef _MSC_VER -RAPIDJSON_STATIC_ASSERT(sizeof(long) == sizeof(int)); -template -struct TypeHelper { - static bool Is(const ValueType& v) { return v.IsInt(); } - static long Get(const ValueType& v) { return v.GetInt(); } - static ValueType& Set(ValueType& v, long data) { return v.SetInt(data); } - static ValueType& Set(ValueType& v, long data, typename ValueType::AllocatorType&) { return v.SetInt(data); } -}; - -RAPIDJSON_STATIC_ASSERT(sizeof(unsigned long) == sizeof(unsigned)); -template -struct TypeHelper { - static bool Is(const ValueType& v) { return v.IsUint(); } - static unsigned long Get(const ValueType& v) { return v.GetUint(); } - static ValueType& Set(ValueType& v, unsigned long data) { return v.SetUint(data); } - static ValueType& Set(ValueType& v, unsigned long data, typename ValueType::AllocatorType&) { return v.SetUint(data); } -}; -#endif - -template -struct TypeHelper { - static bool Is(const ValueType& v) { return v.IsInt64(); } - static int64_t Get(const ValueType& v) { return v.GetInt64(); } - static ValueType& Set(ValueType& v, int64_t data) { return v.SetInt64(data); } - static ValueType& Set(ValueType& v, int64_t data, typename ValueType::AllocatorType&) { return v.SetInt64(data); } -}; - -template -struct TypeHelper { - static bool Is(const ValueType& v) { return v.IsUint64(); } - static uint64_t Get(const ValueType& v) { return v.GetUint64(); } - static ValueType& Set(ValueType& v, uint64_t data) { return v.SetUint64(data); } - static ValueType& Set(ValueType& v, uint64_t data, typename ValueType::AllocatorType&) { return v.SetUint64(data); } -}; - -template -struct TypeHelper { - static bool Is(const ValueType& v) { return v.IsDouble(); } - static double Get(const ValueType& v) { return v.GetDouble(); } - static ValueType& Set(ValueType& v, double data) { return v.SetDouble(data); } - static ValueType& Set(ValueType& v, double data, typename ValueType::AllocatorType&) { return v.SetDouble(data); } -}; - -template -struct TypeHelper { - static bool Is(const ValueType& v) { return v.IsFloat(); } - static float Get(const ValueType& v) { return v.GetFloat(); } - static ValueType& Set(ValueType& v, float data) { return v.SetFloat(data); } - static ValueType& Set(ValueType& v, float data, typename ValueType::AllocatorType&) { return v.SetFloat(data); } -}; - -template -struct TypeHelper { - typedef const typename ValueType::Ch* StringType; - static bool Is(const ValueType& v) { return v.IsString(); } - static StringType Get(const ValueType& v) { return v.GetString(); } - static ValueType& Set(ValueType& v, const StringType data) { return v.SetString(typename ValueType::StringRefType(data)); } - static ValueType& Set(ValueType& v, const StringType data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } -}; - -#if RAPIDJSON_HAS_STDSTRING -template -struct TypeHelper > { - typedef std::basic_string StringType; - static bool Is(const ValueType& v) { return v.IsString(); } - static StringType Get(const ValueType& v) { return StringType(v.GetString(), v.GetStringLength()); } - static ValueType& Set(ValueType& v, const StringType& data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } -}; -#endif - -template -struct TypeHelper { - typedef typename ValueType::Array ArrayType; - static bool Is(const ValueType& v) { return v.IsArray(); } - static ArrayType Get(ValueType& v) { return v.GetArray(); } - static ValueType& Set(ValueType& v, ArrayType data) { return v = data; } - static ValueType& Set(ValueType& v, ArrayType data, typename ValueType::AllocatorType&) { return v = data; } -}; - -template -struct TypeHelper { - typedef typename ValueType::ConstArray ArrayType; - static bool Is(const ValueType& v) { return v.IsArray(); } - static ArrayType Get(const ValueType& v) { return v.GetArray(); } -}; - -template -struct TypeHelper { - typedef typename ValueType::Object ObjectType; - static bool Is(const ValueType& v) { return v.IsObject(); } - static ObjectType Get(ValueType& v) { return v.GetObject(); } - static ValueType& Set(ValueType& v, ObjectType data) { return v = data; } - static ValueType& Set(ValueType& v, ObjectType data, typename ValueType::AllocatorType&) { return v = data; } -}; - -template -struct TypeHelper { - typedef typename ValueType::ConstObject ObjectType; - static bool Is(const ValueType& v) { return v.IsObject(); } - static ObjectType Get(const ValueType& v) { return v.GetObject(); } -}; - -} // namespace internal - -// Forward declarations -template class GenericArray; -template class GenericObject; - -/////////////////////////////////////////////////////////////////////////////// -// GenericValue - -//! Represents a JSON value. Use Value for UTF8 encoding and default allocator. -/*! - A JSON value can be one of 7 types. This class is a variant type supporting - these types. - - Use the Value if UTF8 and default allocator - - \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) - \tparam Allocator Allocator type for allocating memory of object, array and string. -*/ -template -class GenericValue { -public: - //! Name-value pair in an object. - typedef GenericMember Member; - typedef Encoding EncodingType; //!< Encoding type from template parameter. - typedef Allocator AllocatorType; //!< Allocator type from template parameter. - typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. - typedef GenericStringRef StringRefType; //!< Reference to a constant string - typedef typename GenericMemberIterator::Iterator MemberIterator; //!< Member iterator for iterating in object. - typedef typename GenericMemberIterator::Iterator ConstMemberIterator; //!< Constant member iterator for iterating in object. - typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array. - typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array. - typedef GenericValue ValueType; //!< Value type of itself. - typedef GenericArray Array; - typedef GenericArray ConstArray; - typedef GenericObject Object; - typedef GenericObject ConstObject; - - //!@name Constructors and destructor. - //@{ - - //! Default constructor creates a null value. - GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; } - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - //! Move constructor in C++11 - GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_) { - rhs.data_.f.flags = kNullFlag; // give up contents - } -#endif - -private: - //! Copy constructor is not permitted. - GenericValue(const GenericValue& rhs); - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - //! Moving from a GenericDocument is not permitted. - template - GenericValue(GenericDocument&& rhs); - - //! Move assignment from a GenericDocument is not permitted. - template - GenericValue& operator=(GenericDocument&& rhs); -#endif - -public: - - //! Constructor with JSON value type. - /*! This creates a Value of specified type with default content. - \param type Type of the value. - \note Default content for number is zero. - */ - explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_() { - static const uint16_t defaultFlags[] = { - kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag, - kNumberAnyFlag - }; - RAPIDJSON_NOEXCEPT_ASSERT(type >= kNullType && type <= kNumberType); - data_.f.flags = defaultFlags[type]; - - // Use ShortString to store empty string. - if (type == kStringType) - data_.ss.SetLength(0); - } - - //! Explicit copy constructor (with allocator) - /*! Creates a copy of a Value by using the given Allocator - \tparam SourceAllocator allocator of \c rhs - \param rhs Value to copy from (read-only) - \param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator(). - \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) - \see CopyFrom() - */ - template - GenericValue(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { - switch (rhs.GetType()) { - case kObjectType: - DoCopyMembers(rhs, allocator, copyConstStrings); - break; - case kArrayType: { - SizeType count = rhs.data_.a.size; - GenericValue* le = reinterpret_cast(allocator.Malloc(count * sizeof(GenericValue))); - const GenericValue* re = rhs.GetElementsPointer(); - for (SizeType i = 0; i < count; i++) - new (&le[i]) GenericValue(re[i], allocator, copyConstStrings); - data_.f.flags = kArrayFlag; - data_.a.size = data_.a.capacity = count; - SetElementsPointer(le); - } - break; - case kStringType: - if (rhs.data_.f.flags == kConstStringFlag && !copyConstStrings) { - data_.f.flags = rhs.data_.f.flags; - data_ = *reinterpret_cast(&rhs.data_); - } - else - SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator); - break; - default: - data_.f.flags = rhs.data_.f.flags; - data_ = *reinterpret_cast(&rhs.data_); - break; - } - } - - //! Constructor for boolean value. - /*! \param b Boolean value - \note This constructor is limited to \em real boolean values and rejects - implicitly converted types like arbitrary pointers. Use an explicit cast - to \c bool, if you want to construct a boolean JSON value in such cases. - */ -#ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen - template - explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame))) RAPIDJSON_NOEXCEPT // See #472 -#else - explicit GenericValue(bool b) RAPIDJSON_NOEXCEPT -#endif - : data_() { - // safe-guard against failing SFINAE - RAPIDJSON_STATIC_ASSERT((internal::IsSame::Value)); - data_.f.flags = b ? kTrueFlag : kFalseFlag; - } - - //! Constructor for int value. - explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_() { - data_.n.i64 = i; - data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag; - } - - //! Constructor for unsigned value. - explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_() { - data_.n.u64 = u; - data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag); - } - - //! Constructor for int64_t value. - explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_() { - data_.n.i64 = i64; - data_.f.flags = kNumberInt64Flag; - if (i64 >= 0) { - data_.f.flags |= kNumberUint64Flag; - if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) - data_.f.flags |= kUintFlag; - if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) - data_.f.flags |= kIntFlag; - } - else if (i64 >= static_cast(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) - data_.f.flags |= kIntFlag; - } - - //! Constructor for uint64_t value. - explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_() { - data_.n.u64 = u64; - data_.f.flags = kNumberUint64Flag; - if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))) - data_.f.flags |= kInt64Flag; - if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) - data_.f.flags |= kUintFlag; - if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) - data_.f.flags |= kIntFlag; - } - - //! Constructor for double value. - explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; } - - //! Constructor for float value. - explicit GenericValue(float f) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = static_cast(f); data_.f.flags = kNumberDoubleFlag; } - - //! Constructor for constant string (i.e. do not make a copy of string) - GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(StringRef(s, length)); } - - //! Constructor for constant string (i.e. do not make a copy of string) - explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); } - - //! Constructor for copy-string (i.e. do make a copy of string) - GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_() { SetStringRaw(StringRef(s, length), allocator); } - - //! Constructor for copy-string (i.e. do make a copy of string) - GenericValue(const Ch*s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } - -#if RAPIDJSON_HAS_STDSTRING - //! Constructor for copy-string from a string object (i.e. do make a copy of string) - /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. - */ - GenericValue(const std::basic_string& s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } -#endif - - //! Constructor for Array. - /*! - \param a An array obtained by \c GetArray(). - \note \c Array is always pass-by-value. - \note the source array is moved into this value and the source array becomes empty. - */ - GenericValue(Array a) RAPIDJSON_NOEXCEPT : data_(a.value_.data_) { - a.value_.data_ = Data(); - a.value_.data_.f.flags = kArrayFlag; - } - - //! Constructor for Object. - /*! - \param o An object obtained by \c GetObject(). - \note \c Object is always pass-by-value. - \note the source object is moved into this value and the source object becomes empty. - */ - GenericValue(Object o) RAPIDJSON_NOEXCEPT : data_(o.value_.data_) { - o.value_.data_ = Data(); - o.value_.data_.f.flags = kObjectFlag; - } - - //! Destructor. - /*! Need to destruct elements of array, members of object, or copy-string. - */ - ~GenericValue() { - // With RAPIDJSON_USE_MEMBERSMAP, the maps need to be destroyed to release - // their Allocator if it's refcounted (e.g. MemoryPoolAllocator). - if (Allocator::kNeedFree || (RAPIDJSON_USE_MEMBERSMAP+0 && - internal::IsRefCounted::Value)) { - switch(data_.f.flags) { - case kArrayFlag: - { - GenericValue* e = GetElementsPointer(); - for (GenericValue* v = e; v != e + data_.a.size; ++v) - v->~GenericValue(); - if (Allocator::kNeedFree) { // Shortcut by Allocator's trait - Allocator::Free(e); - } - } - break; - - case kObjectFlag: - DoFreeMembers(); - break; - - case kCopyStringFlag: - if (Allocator::kNeedFree) { // Shortcut by Allocator's trait - Allocator::Free(const_cast(GetStringPointer())); - } - break; - - default: - break; // Do nothing for other types. - } - } - } - - //@} - - //!@name Assignment operators - //@{ - - //! Assignment with move semantics. - /*! \param rhs Source of the assignment. It will become a null value after assignment. - */ - GenericValue& operator=(GenericValue& rhs) RAPIDJSON_NOEXCEPT { - if (RAPIDJSON_LIKELY(this != &rhs)) { - // Can't destroy "this" before assigning "rhs", otherwise "rhs" - // could be used after free if it's an sub-Value of "this", - // hence the temporary dance. - GenericValue temp; - temp.RawAssign(rhs); - this->~GenericValue(); - RawAssign(temp); - } - return *this; - } - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - //! Move assignment in C++11 - GenericValue& operator=(GenericValue&& rhs) RAPIDJSON_NOEXCEPT { - return *this = rhs.Move(); - } -#endif - - //! Assignment of constant string reference (no copy) - /*! \param str Constant string reference to be assigned - \note This overload is needed to avoid clashes with the generic primitive type assignment overload below. - \see GenericStringRef, operator=(T) - */ - GenericValue& operator=(StringRefType str) RAPIDJSON_NOEXCEPT { - GenericValue s(str); - return *this = s; - } - - //! Assignment with primitive types. - /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t - \param value The value to be assigned. - - \note The source type \c T explicitly disallows all pointer types, - especially (\c const) \ref Ch*. This helps avoiding implicitly - referencing character strings with insufficient lifetime, use - \ref SetString(const Ch*, Allocator&) (for copying) or - \ref StringRef() (to explicitly mark the pointer as constant) instead. - All other pointer types would implicitly convert to \c bool, - use \ref SetBool() instead. - */ - template - RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer), (GenericValue&)) - operator=(T value) { - GenericValue v(value); - return *this = v; - } - - //! Deep-copy assignment from Value - /*! Assigns a \b copy of the Value to the current Value object - \tparam SourceAllocator Allocator type of \c rhs - \param rhs Value to copy from (read-only) - \param allocator Allocator to use for copying - \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) - */ - template - GenericValue& CopyFrom(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { - RAPIDJSON_ASSERT(static_cast(this) != static_cast(&rhs)); - this->~GenericValue(); - new (this) GenericValue(rhs, allocator, copyConstStrings); - return *this; - } - - //! Exchange the contents of this value with those of other. - /*! - \param other Another value. - \note Constant complexity. - */ - GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT { - GenericValue temp; - temp.RawAssign(*this); - RawAssign(other); - other.RawAssign(temp); - return *this; - } - - //! free-standing swap function helper - /*! - Helper function to enable support for common swap implementation pattern based on \c std::swap: - \code - void swap(MyClass& a, MyClass& b) { - using std::swap; - swap(a.value, b.value); - // ... - } - \endcode - \see Swap() - */ - friend inline void swap(GenericValue& a, GenericValue& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } - - //! Prepare Value for move semantics - /*! \return *this */ - GenericValue& Move() RAPIDJSON_NOEXCEPT { return *this; } - //@} - - //!@name Equal-to and not-equal-to operators - //@{ - //! Equal-to operator - /*! - \note If an object contains duplicated named member, comparing equality with any object is always \c false. - \note Complexity is quadratic in Object's member number and linear for the rest (number of all values in the subtree and total lengths of all strings). - */ - template - bool operator==(const GenericValue& rhs) const { - typedef GenericValue RhsType; - if (GetType() != rhs.GetType()) - return false; - - switch (GetType()) { - case kObjectType: // Warning: O(n^2) inner-loop - if (data_.o.size != rhs.data_.o.size) - return false; - for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) { - typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name); - if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value) - return false; - } - return true; - - case kArrayType: - if (data_.a.size != rhs.data_.a.size) - return false; - for (SizeType i = 0; i < data_.a.size; i++) - if ((*this)[i] != rhs[i]) - return false; - return true; - - case kStringType: - return StringEqual(rhs); - - case kNumberType: - if (IsDouble() || rhs.IsDouble()) { - double a = GetDouble(); // May convert from integer to double. - double b = rhs.GetDouble(); // Ditto - return a >= b && a <= b; // Prevent -Wfloat-equal - } - else - return data_.n.u64 == rhs.data_.n.u64; - - default: - return true; - } - } - - //! Equal-to operator with const C-string pointer - bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); } - -#if RAPIDJSON_HAS_STDSTRING - //! Equal-to operator with string object - /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. - */ - bool operator==(const std::basic_string& rhs) const { return *this == GenericValue(StringRef(rhs)); } -#endif - - //! Equal-to operator with primitive types - /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c true, \c false - */ - template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr,internal::IsGenericValue >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); } - -#ifndef __cpp_impl_three_way_comparison - //! Not-equal-to operator - /*! \return !(*this == rhs) - */ - template - bool operator!=(const GenericValue& rhs) const { return !(*this == rhs); } - - //! Not-equal-to operator with const C-string pointer - bool operator!=(const Ch* rhs) const { return !(*this == rhs); } - - //! Not-equal-to operator with arbitrary types - /*! \return !(*this == rhs) - */ - template RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); } - - //! Equal-to operator with arbitrary types (symmetric version) - /*! \return (rhs == lhs) - */ - template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; } - - //! Not-Equal-to operator with arbitrary types (symmetric version) - /*! \return !(rhs == lhs) - */ - template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); } - //@} -#endif - - //!@name Type - //@{ - - Type GetType() const { return static_cast(data_.f.flags & kTypeMask); } - bool IsNull() const { return data_.f.flags == kNullFlag; } - bool IsFalse() const { return data_.f.flags == kFalseFlag; } - bool IsTrue() const { return data_.f.flags == kTrueFlag; } - bool IsBool() const { return (data_.f.flags & kBoolFlag) != 0; } - bool IsObject() const { return data_.f.flags == kObjectFlag; } - bool IsArray() const { return data_.f.flags == kArrayFlag; } - bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; } - bool IsInt() const { return (data_.f.flags & kIntFlag) != 0; } - bool IsUint() const { return (data_.f.flags & kUintFlag) != 0; } - bool IsInt64() const { return (data_.f.flags & kInt64Flag) != 0; } - bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; } - bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; } - bool IsString() const { return (data_.f.flags & kStringFlag) != 0; } - - // Checks whether a number can be losslessly converted to a double. - bool IsLosslessDouble() const { - if (!IsNumber()) return false; - if (IsUint64()) { - uint64_t u = GetUint64(); - volatile double d = static_cast(u); - return (d >= 0.0) - && (d < static_cast((std::numeric_limits::max)())) - && (u == static_cast(d)); - } - if (IsInt64()) { - int64_t i = GetInt64(); - volatile double d = static_cast(i); - return (d >= static_cast((std::numeric_limits::min)())) - && (d < static_cast((std::numeric_limits::max)())) - && (i == static_cast(d)); - } - return true; // double, int, uint are always lossless - } - - // Checks whether a number is a float (possible lossy). - bool IsFloat() const { - if ((data_.f.flags & kDoubleFlag) == 0) - return false; - double d = GetDouble(); - return d >= -3.4028234e38 && d <= 3.4028234e38; - } - // Checks whether a number can be losslessly converted to a float. - bool IsLosslessFloat() const { - if (!IsNumber()) return false; - double a = GetDouble(); - if (a < static_cast(-(std::numeric_limits::max)()) - || a > static_cast((std::numeric_limits::max)())) - return false; - double b = static_cast(static_cast(a)); - return a >= b && a <= b; // Prevent -Wfloat-equal - } - - //@} - - //!@name Null - //@{ - - GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; } - - //@} - - //!@name Bool - //@{ - - bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return data_.f.flags == kTrueFlag; } - //!< Set boolean value - /*! \post IsBool() == true */ - GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; } - - //@} - - //!@name Object - //@{ - - //! Set this value as an empty object. - /*! \post IsObject() == true */ - GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; } - - //! Get the number of members in the object. - SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; } - - //! Get the capacity of object. - SizeType MemberCapacity() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.capacity; } - - //! Check whether the object is empty. - bool ObjectEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } - - //! Get a value from an object associated with the name. - /*! \pre IsObject() == true - \tparam T Either \c Ch or \c const \c Ch (template used for disambiguation with \ref operator[](SizeType)) - \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7. - Since 0.2, if the name is not correct, it will assert. - If user is unsure whether a member exists, user should use HasMember() first. - A better approach is to use FindMember(). - \note Linear time complexity. - */ - template - RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(GenericValue&)) operator[](T* name) { - GenericValue n(StringRef(name)); - return (*this)[n]; - } - template - RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast(*this)[name]; } - - //! Get a value from an object associated with the name. - /*! \pre IsObject() == true - \tparam SourceAllocator Allocator of the \c name value - - \note Compared to \ref operator[](T*), this version is faster because it does not need a StrLen(). - And it can also handle strings with embedded null characters. - - \note Linear time complexity. - */ - template - GenericValue& operator[](const GenericValue& name) { - MemberIterator member = FindMember(name); - if (member != MemberEnd()) - return member->value; - else { - RAPIDJSON_ASSERT(false); // see above note - -#if RAPIDJSON_HAS_CXX11 - // Use thread-local storage to prevent races between threads. - // Use static buffer and placement-new to prevent destruction, with - // alignas() to ensure proper alignment. - alignas(GenericValue) thread_local static char buffer[sizeof(GenericValue)]; - return *new (buffer) GenericValue(); -#elif defined(_MSC_VER) && _MSC_VER < 1900 - // There's no way to solve both thread locality and proper alignment - // simultaneously. - __declspec(thread) static char buffer[sizeof(GenericValue)]; - return *new (buffer) GenericValue(); -#elif defined(__GNUC__) || defined(__clang__) - // This will generate -Wexit-time-destructors in clang, but that's - // better than having under-alignment. - __thread static GenericValue buffer; - return buffer; -#else - // Don't know what compiler this is, so don't know how to ensure - // thread-locality. - static GenericValue buffer; - return buffer; -#endif - } - } - template - const GenericValue& operator[](const GenericValue& name) const { return const_cast(*this)[name]; } - -#if RAPIDJSON_HAS_STDSTRING - //! Get a value from an object associated with name (string object). - GenericValue& operator[](const std::basic_string& name) { return (*this)[GenericValue(StringRef(name))]; } - const GenericValue& operator[](const std::basic_string& name) const { return (*this)[GenericValue(StringRef(name))]; } -#endif - - //! Const member iterator - /*! \pre IsObject() == true */ - ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer()); } - //! Const \em past-the-end member iterator - /*! \pre IsObject() == true */ - ConstMemberIterator MemberEnd() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer() + data_.o.size); } - //! Member iterator - /*! \pre IsObject() == true */ - MemberIterator MemberBegin() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer()); } - //! \em Past-the-end member iterator - /*! \pre IsObject() == true */ - MemberIterator MemberEnd() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer() + data_.o.size); } - - //! Request the object to have enough capacity to store members. - /*! \param newCapacity The capacity that the object at least need to have. - \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). - \return The value itself for fluent API. - \note Linear time complexity. - */ - GenericValue& MemberReserve(SizeType newCapacity, Allocator &allocator) { - RAPIDJSON_ASSERT(IsObject()); - DoReserveMembers(newCapacity, allocator); - return *this; - } - - //! Check whether a member exists in the object. - /*! - \param name Member name to be searched. - \pre IsObject() == true - \return Whether a member with that name exists. - \note It is better to use FindMember() directly if you need the obtain the value as well. - \note Linear time complexity. - */ - bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); } - -#if RAPIDJSON_HAS_STDSTRING - //! Check whether a member exists in the object with string object. - /*! - \param name Member name to be searched. - \pre IsObject() == true - \return Whether a member with that name exists. - \note It is better to use FindMember() directly if you need the obtain the value as well. - \note Linear time complexity. - */ - bool HasMember(const std::basic_string& name) const { return FindMember(name) != MemberEnd(); } -#endif - - //! Check whether a member exists in the object with GenericValue name. - /*! - This version is faster because it does not need a StrLen(). It can also handle string with null character. - \param name Member name to be searched. - \pre IsObject() == true - \return Whether a member with that name exists. - \note It is better to use FindMember() directly if you need the obtain the value as well. - \note Linear time complexity. - */ - template - bool HasMember(const GenericValue& name) const { return FindMember(name) != MemberEnd(); } - - //! Find member by name. - /*! - \param name Member name to be searched. - \pre IsObject() == true - \return Iterator to member, if it exists. - Otherwise returns \ref MemberEnd(). - - \note Earlier versions of Rapidjson returned a \c NULL pointer, in case - the requested member doesn't exist. For consistency with e.g. - \c std::map, this has been changed to MemberEnd() now. - \note Linear time complexity. - */ - MemberIterator FindMember(const Ch* name) { - GenericValue n(StringRef(name)); - return FindMember(n); - } - - ConstMemberIterator FindMember(const Ch* name) const { return const_cast(*this).FindMember(name); } - - //! Find member by name. - /*! - This version is faster because it does not need a StrLen(). It can also handle string with null character. - \param name Member name to be searched. - \pre IsObject() == true - \return Iterator to member, if it exists. - Otherwise returns \ref MemberEnd(). - - \note Earlier versions of Rapidjson returned a \c NULL pointer, in case - the requested member doesn't exist. For consistency with e.g. - \c std::map, this has been changed to MemberEnd() now. - \note Linear time complexity. - */ - template - MemberIterator FindMember(const GenericValue& name) { - RAPIDJSON_ASSERT(IsObject()); - RAPIDJSON_ASSERT(name.IsString()); - return DoFindMember(name); - } - template ConstMemberIterator FindMember(const GenericValue& name) const { return const_cast(*this).FindMember(name); } - -#if RAPIDJSON_HAS_STDSTRING - //! Find member by string object name. - /*! - \param name Member name to be searched. - \pre IsObject() == true - \return Iterator to member, if it exists. - Otherwise returns \ref MemberEnd(). - */ - MemberIterator FindMember(const std::basic_string& name) { return FindMember(GenericValue(StringRef(name))); } - ConstMemberIterator FindMember(const std::basic_string& name) const { return FindMember(GenericValue(StringRef(name))); } -#endif - - //! Add a member (name-value pair) to the object. - /*! \param name A string value as name of member. - \param value Value of any type. - \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). - \return The value itself for fluent API. - \note The ownership of \c name and \c value will be transferred to this object on success. - \pre IsObject() && name.IsString() - \post name.IsNull() && value.IsNull() - \note Amortized Constant time complexity. - */ - GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { - RAPIDJSON_ASSERT(IsObject()); - RAPIDJSON_ASSERT(name.IsString()); - DoAddMember(name, value, allocator); - return *this; - } - - //! Add a constant string value as member (name-value pair) to the object. - /*! \param name A string value as name of member. - \param value constant string reference as value of member. - \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). - \return The value itself for fluent API. - \pre IsObject() - \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. - \note Amortized Constant time complexity. - */ - GenericValue& AddMember(GenericValue& name, StringRefType value, Allocator& allocator) { - GenericValue v(value); - return AddMember(name, v, allocator); - } - -#if RAPIDJSON_HAS_STDSTRING - //! Add a string object as member (name-value pair) to the object. - /*! \param name A string value as name of member. - \param value constant string reference as value of member. - \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). - \return The value itself for fluent API. - \pre IsObject() - \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. - \note Amortized Constant time complexity. - */ - GenericValue& AddMember(GenericValue& name, std::basic_string& value, Allocator& allocator) { - GenericValue v(value, allocator); - return AddMember(name, v, allocator); - } -#endif - - //! Add any primitive value as member (name-value pair) to the object. - /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t - \param name A string value as name of member. - \param value Value of primitive type \c T as value of member - \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). - \return The value itself for fluent API. - \pre IsObject() - - \note The source type \c T explicitly disallows all pointer types, - especially (\c const) \ref Ch*. This helps avoiding implicitly - referencing character strings with insufficient lifetime, use - \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref - AddMember(StringRefType, StringRefType, Allocator&). - All other pointer types would implicitly convert to \c bool, - use an explicit cast instead, if needed. - \note Amortized Constant time complexity. - */ - template - RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) - AddMember(GenericValue& name, T value, Allocator& allocator) { - GenericValue v(value); - return AddMember(name, v, allocator); - } - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) { - return AddMember(name, value, allocator); - } - GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) { - return AddMember(name, value, allocator); - } - GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) { - return AddMember(name, value, allocator); - } - GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) { - GenericValue n(name); - return AddMember(n, value, allocator); - } -#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS - - - //! Add a member (name-value pair) to the object. - /*! \param name A constant string reference as name of member. - \param value Value of any type. - \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). - \return The value itself for fluent API. - \note The ownership of \c value will be transferred to this object on success. - \pre IsObject() - \post value.IsNull() - \note Amortized Constant time complexity. - */ - GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) { - GenericValue n(name); - return AddMember(n, value, allocator); - } - - //! Add a constant string value as member (name-value pair) to the object. - /*! \param name A constant string reference as name of member. - \param value constant string reference as value of member. - \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). - \return The value itself for fluent API. - \pre IsObject() - \note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below. - \note Amortized Constant time complexity. - */ - GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) { - GenericValue v(value); - return AddMember(name, v, allocator); - } - - //! Add any primitive value as member (name-value pair) to the object. - /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t - \param name A constant string reference as name of member. - \param value Value of primitive type \c T as value of member - \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). - \return The value itself for fluent API. - \pre IsObject() - - \note The source type \c T explicitly disallows all pointer types, - especially (\c const) \ref Ch*. This helps avoiding implicitly - referencing character strings with insufficient lifetime, use - \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref - AddMember(StringRefType, StringRefType, Allocator&). - All other pointer types would implicitly convert to \c bool, - use an explicit cast instead, if needed. - \note Amortized Constant time complexity. - */ - template - RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) - AddMember(StringRefType name, T value, Allocator& allocator) { - GenericValue n(name); - return AddMember(n, value, allocator); - } - - //! Remove all members in the object. - /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged. - \note Linear time complexity. - */ - void RemoveAllMembers() { - RAPIDJSON_ASSERT(IsObject()); - DoClearMembers(); - } - - //! Remove a member in object by its name. - /*! \param name Name of member to be removed. - \return Whether the member existed. - \note This function may reorder the object members. Use \ref - EraseMember(ConstMemberIterator) if you need to preserve the - relative order of the remaining members. - \note Linear time complexity. - */ - bool RemoveMember(const Ch* name) { - GenericValue n(StringRef(name)); - return RemoveMember(n); - } - -#if RAPIDJSON_HAS_STDSTRING - bool RemoveMember(const std::basic_string& name) { return RemoveMember(GenericValue(StringRef(name))); } -#endif - - template - bool RemoveMember(const GenericValue& name) { - MemberIterator m = FindMember(name); - if (m != MemberEnd()) { - RemoveMember(m); - return true; - } - else - return false; - } - - //! Remove a member in object by iterator. - /*! \param m member iterator (obtained by FindMember() or MemberBegin()). - \return the new iterator after removal. - \note This function may reorder the object members. Use \ref - EraseMember(ConstMemberIterator) if you need to preserve the - relative order of the remaining members. - \note Constant time complexity. - */ - MemberIterator RemoveMember(MemberIterator m) { - RAPIDJSON_ASSERT(IsObject()); - RAPIDJSON_ASSERT(data_.o.size > 0); - RAPIDJSON_ASSERT(GetMembersPointer() != 0); - RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd()); - return DoRemoveMember(m); - } - - //! Remove a member from an object by iterator. - /*! \param pos iterator to the member to remove - \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd() - \return Iterator following the removed element. - If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned. - \note This function preserves the relative order of the remaining object - members. If you do not need this, use the more efficient \ref RemoveMember(MemberIterator). - \note Linear time complexity. - */ - MemberIterator EraseMember(ConstMemberIterator pos) { - return EraseMember(pos, pos +1); - } - - //! Remove members in the range [first, last) from an object. - /*! \param first iterator to the first member to remove - \param last iterator following the last member to remove - \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd() - \return Iterator following the last removed element. - \note This function preserves the relative order of the remaining object - members. - \note Linear time complexity. - */ - MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) { - RAPIDJSON_ASSERT(IsObject()); - RAPIDJSON_ASSERT(data_.o.size > 0); - RAPIDJSON_ASSERT(GetMembersPointer() != 0); - RAPIDJSON_ASSERT(first >= MemberBegin()); - RAPIDJSON_ASSERT(first <= last); - RAPIDJSON_ASSERT(last <= MemberEnd()); - return DoEraseMembers(first, last); - } - - //! Erase a member in object by its name. - /*! \param name Name of member to be removed. - \return Whether the member existed. - \note Linear time complexity. - */ - bool EraseMember(const Ch* name) { - GenericValue n(StringRef(name)); - return EraseMember(n); - } - -#if RAPIDJSON_HAS_STDSTRING - bool EraseMember(const std::basic_string& name) { return EraseMember(GenericValue(StringRef(name))); } -#endif - - template - bool EraseMember(const GenericValue& name) { - MemberIterator m = FindMember(name); - if (m != MemberEnd()) { - EraseMember(m); - return true; - } - else - return false; - } - - Object GetObject() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } - Object GetObj() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } - ConstObject GetObject() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } - ConstObject GetObj() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } - - //@} - - //!@name Array - //@{ - - //! Set this value as an empty array. - /*! \post IsArray == true */ - GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; } - - //! Get the number of elements in array. - SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; } - - //! Get the capacity of array. - SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; } - - //! Check whether the array is empty. - bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; } - - //! Remove all elements in the array. - /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged. - \note Linear time complexity. - */ - void Clear() { - RAPIDJSON_ASSERT(IsArray()); - GenericValue* e = GetElementsPointer(); - for (GenericValue* v = e; v != e + data_.a.size; ++v) - v->~GenericValue(); - data_.a.size = 0; - } - - //! Get an element from array by index. - /*! \pre IsArray() == true - \param index Zero-based index of element. - \see operator[](T*) - */ - GenericValue& operator[](SizeType index) { - RAPIDJSON_ASSERT(IsArray()); - RAPIDJSON_ASSERT(index < data_.a.size); - return GetElementsPointer()[index]; - } - const GenericValue& operator[](SizeType index) const { return const_cast(*this)[index]; } - - //! Element iterator - /*! \pre IsArray() == true */ - ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer(); } - //! \em Past-the-end element iterator - /*! \pre IsArray() == true */ - ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer() + data_.a.size; } - //! Constant element iterator - /*! \pre IsArray() == true */ - ConstValueIterator Begin() const { return const_cast(*this).Begin(); } - //! Constant \em past-the-end element iterator - /*! \pre IsArray() == true */ - ConstValueIterator End() const { return const_cast(*this).End(); } - - //! Request the array to have enough capacity to store elements. - /*! \param newCapacity The capacity that the array at least need to have. - \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). - \return The value itself for fluent API. - \note Linear time complexity. - */ - GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) { - RAPIDJSON_ASSERT(IsArray()); - if (newCapacity > data_.a.capacity) { - SetElementsPointer(reinterpret_cast(allocator.Realloc(GetElementsPointer(), data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue)))); - data_.a.capacity = newCapacity; - } - return *this; - } - - //! Append a GenericValue at the end of the array. - /*! \param value Value to be appended. - \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). - \pre IsArray() == true - \post value.IsNull() == true - \return The value itself for fluent API. - \note The ownership of \c value will be transferred to this array on success. - \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. - \note Amortized constant time complexity. - */ - GenericValue& PushBack(GenericValue& value, Allocator& allocator) { - RAPIDJSON_ASSERT(IsArray()); - if (data_.a.size >= data_.a.capacity) - Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator); - GetElementsPointer()[data_.a.size++].RawAssign(value); - return *this; - } - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - GenericValue& PushBack(GenericValue&& value, Allocator& allocator) { - return PushBack(value, allocator); - } -#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS - - //! Append a constant string reference at the end of the array. - /*! \param value Constant string reference to be appended. - \param allocator Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator(). - \pre IsArray() == true - \return The value itself for fluent API. - \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. - \note Amortized constant time complexity. - \see GenericStringRef - */ - GenericValue& PushBack(StringRefType value, Allocator& allocator) { - return (*this).template PushBack(value, allocator); - } - - //! Append a primitive value at the end of the array. - /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t - \param value Value of primitive type T to be appended. - \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). - \pre IsArray() == true - \return The value itself for fluent API. - \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. - - \note The source type \c T explicitly disallows all pointer types, - especially (\c const) \ref Ch*. This helps avoiding implicitly - referencing character strings with insufficient lifetime, use - \ref PushBack(GenericValue&, Allocator&) or \ref - PushBack(StringRefType, Allocator&). - All other pointer types would implicitly convert to \c bool, - use an explicit cast instead, if needed. - \note Amortized constant time complexity. - */ - template - RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) - PushBack(T value, Allocator& allocator) { - GenericValue v(value); - return PushBack(v, allocator); - } - - //! Remove the last element in the array. - /*! - \note Constant time complexity. - */ - GenericValue& PopBack() { - RAPIDJSON_ASSERT(IsArray()); - RAPIDJSON_ASSERT(!Empty()); - GetElementsPointer()[--data_.a.size].~GenericValue(); - return *this; - } - - //! Remove an element of array by iterator. - /*! - \param pos iterator to the element to remove - \pre IsArray() == true && \ref Begin() <= \c pos < \ref End() - \return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned. - \note Linear time complexity. - */ - ValueIterator Erase(ConstValueIterator pos) { - return Erase(pos, pos + 1); - } - - //! Remove elements in the range [first, last) of the array. - /*! - \param first iterator to the first element to remove - \param last iterator following the last element to remove - \pre IsArray() == true && \ref Begin() <= \c first <= \c last <= \ref End() - \return Iterator following the last removed element. - \note Linear time complexity. - */ - ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) { - RAPIDJSON_ASSERT(IsArray()); - RAPIDJSON_ASSERT(data_.a.size > 0); - RAPIDJSON_ASSERT(GetElementsPointer() != 0); - RAPIDJSON_ASSERT(first >= Begin()); - RAPIDJSON_ASSERT(first <= last); - RAPIDJSON_ASSERT(last <= End()); - ValueIterator pos = Begin() + (first - Begin()); - for (ValueIterator itr = pos; itr != last; ++itr) - itr->~GenericValue(); - std::memmove(static_cast(pos), last, static_cast(End() - last) * sizeof(GenericValue)); - data_.a.size -= static_cast(last - first); - return pos; - } - - Array GetArray() { RAPIDJSON_ASSERT(IsArray()); return Array(*this); } - ConstArray GetArray() const { RAPIDJSON_ASSERT(IsArray()); return ConstArray(*this); } - - //@} - - //!@name Number - //@{ - - int GetInt() const { RAPIDJSON_ASSERT(data_.f.flags & kIntFlag); return data_.n.i.i; } - unsigned GetUint() const { RAPIDJSON_ASSERT(data_.f.flags & kUintFlag); return data_.n.u.u; } - int64_t GetInt64() const { RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag); return data_.n.i64; } - uint64_t GetUint64() const { RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag); return data_.n.u64; } - - //! Get the value as double type. - /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessDouble() to check whether the conversion is lossless. - */ - double GetDouble() const { - RAPIDJSON_ASSERT(IsNumber()); - if ((data_.f.flags & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion. - if ((data_.f.flags & kIntFlag) != 0) return data_.n.i.i; // int -> double - if ((data_.f.flags & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double - if ((data_.f.flags & kInt64Flag) != 0) return static_cast(data_.n.i64); // int64_t -> double (may lose precision) - RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0); return static_cast(data_.n.u64); // uint64_t -> double (may lose precision) - } - - //! Get the value as float type. - /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessFloat() to check whether the conversion is lossless. - */ - float GetFloat() const { - return static_cast(GetDouble()); - } - - GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; } - GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; } - GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; } - GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; } - GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; } - GenericValue& SetFloat(float f) { this->~GenericValue(); new (this) GenericValue(static_cast(f)); return *this; } - - //@} - - //!@name String - //@{ - - const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return DataString(data_); } - - //! Get the length of string. - /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength(). - */ - SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return DataStringLength(data_); } - - //! Set this value as a string without copying source string. - /*! This version has better performance with supplied length, and also support string containing null character. - \param s source string pointer. - \param length The length of source string, excluding the trailing null terminator. - \return The value itself for fluent API. - \post IsString() == true && GetString() == s && GetStringLength() == length - \see SetString(StringRefType) - */ - GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); } - - //! Set this value as a string without copying source string. - /*! \param s source string reference - \return The value itself for fluent API. - \post IsString() == true && GetString() == s && GetStringLength() == s.length - */ - GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; } - - //! Set this value as a string by copying from source string. - /*! This version has better performance with supplied length, and also support string containing null character. - \param s source string. - \param length The length of source string, excluding the trailing null terminator. - \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). - \return The value itself for fluent API. - \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length - */ - GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { return SetString(StringRef(s, length), allocator); } - - //! Set this value as a string by copying from source string. - /*! \param s source string. - \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). - \return The value itself for fluent API. - \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length - */ - GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(StringRef(s), allocator); } - - //! Set this value as a string by copying from source string. - /*! \param s source string reference - \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). - \return The value itself for fluent API. - \post IsString() == true && GetString() != s.s && strcmp(GetString(),s) == 0 && GetStringLength() == length - */ - GenericValue& SetString(StringRefType s, Allocator& allocator) { this->~GenericValue(); SetStringRaw(s, allocator); return *this; } - -#if RAPIDJSON_HAS_STDSTRING - //! Set this value as a string by copying from source string. - /*! \param s source string. - \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). - \return The value itself for fluent API. - \post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size() - \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. - */ - GenericValue& SetString(const std::basic_string& s, Allocator& allocator) { return SetString(StringRef(s), allocator); } -#endif - - //@} - - //!@name Array - //@{ - - //! Templated version for checking whether this value is type T. - /*! - \tparam T Either \c bool, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c float, \c const \c char*, \c std::basic_string - */ - template - bool Is() const { return internal::TypeHelper::Is(*this); } - - template - T Get() const { return internal::TypeHelper::Get(*this); } - - template - T Get() { return internal::TypeHelper::Get(*this); } - - template - ValueType& Set(const T& data) { return internal::TypeHelper::Set(*this, data); } - - template - ValueType& Set(const T& data, AllocatorType& allocator) { return internal::TypeHelper::Set(*this, data, allocator); } - - //@} - - //! Generate events of this value to a Handler. - /*! This function adopts the GoF visitor pattern. - Typical usage is to output this JSON value as JSON text via Writer, which is a Handler. - It can also be used to deep clone this value via GenericDocument, which is also a Handler. - \tparam Handler type of handler. - \param handler An object implementing concept Handler. - */ - template - bool Accept(Handler& handler) const { - switch(GetType()) { - case kNullType: return handler.Null(); - case kFalseType: return handler.Bool(false); - case kTrueType: return handler.Bool(true); - - case kObjectType: - if (RAPIDJSON_UNLIKELY(!handler.StartObject())) - return false; - for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) { - RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator. - if (RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0))) - return false; - if (RAPIDJSON_UNLIKELY(!m->value.Accept(handler))) - return false; - } - return handler.EndObject(data_.o.size); - - case kArrayType: - if (RAPIDJSON_UNLIKELY(!handler.StartArray())) - return false; - for (ConstValueIterator v = Begin(); v != End(); ++v) - if (RAPIDJSON_UNLIKELY(!v->Accept(handler))) - return false; - return handler.EndArray(data_.a.size); - - case kStringType: - return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0); - - default: - RAPIDJSON_ASSERT(GetType() == kNumberType); - if (IsDouble()) return handler.Double(data_.n.d); - else if (IsInt()) return handler.Int(data_.n.i.i); - else if (IsUint()) return handler.Uint(data_.n.u.u); - else if (IsInt64()) return handler.Int64(data_.n.i64); - else return handler.Uint64(data_.n.u64); - } - } - -private: - template friend class GenericValue; - template friend class GenericDocument; - - enum { - kBoolFlag = 0x0008, - kNumberFlag = 0x0010, - kIntFlag = 0x0020, - kUintFlag = 0x0040, - kInt64Flag = 0x0080, - kUint64Flag = 0x0100, - kDoubleFlag = 0x0200, - kStringFlag = 0x0400, - kCopyFlag = 0x0800, - kInlineStrFlag = 0x1000, - - // Initial flags of different types. - kNullFlag = kNullType, - // These casts are added to suppress the warning on MSVC about bitwise operations between enums of different types. - kTrueFlag = static_cast(kTrueType) | static_cast(kBoolFlag), - kFalseFlag = static_cast(kFalseType) | static_cast(kBoolFlag), - kNumberIntFlag = static_cast(kNumberType) | static_cast(kNumberFlag | kIntFlag | kInt64Flag), - kNumberUintFlag = static_cast(kNumberType) | static_cast(kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag), - kNumberInt64Flag = static_cast(kNumberType) | static_cast(kNumberFlag | kInt64Flag), - kNumberUint64Flag = static_cast(kNumberType) | static_cast(kNumberFlag | kUint64Flag), - kNumberDoubleFlag = static_cast(kNumberType) | static_cast(kNumberFlag | kDoubleFlag), - kNumberAnyFlag = static_cast(kNumberType) | static_cast(kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag), - kConstStringFlag = static_cast(kStringType) | static_cast(kStringFlag), - kCopyStringFlag = static_cast(kStringType) | static_cast(kStringFlag | kCopyFlag), - kShortStringFlag = static_cast(kStringType) | static_cast(kStringFlag | kCopyFlag | kInlineStrFlag), - kObjectFlag = kObjectType, - kArrayFlag = kArrayType, - - kTypeMask = 0x07 - }; - - static const SizeType kDefaultArrayCapacity = RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY; - static const SizeType kDefaultObjectCapacity = RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY; - - struct Flag { -#if RAPIDJSON_48BITPOINTER_OPTIMIZATION - char payload[sizeof(SizeType) * 2 + 6]; // 2 x SizeType + lower 48-bit pointer -#elif RAPIDJSON_64BIT - char payload[sizeof(SizeType) * 2 + sizeof(void*) + 6]; // 6 padding bytes -#else - char payload[sizeof(SizeType) * 2 + sizeof(void*) + 2]; // 2 padding bytes -#endif - uint16_t flags; - }; - - struct String { - SizeType length; - SizeType hashcode; //!< reserved - const Ch* str; - }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode - - // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars - // (excluding the terminating zero) and store a value to determine the length of the contained - // string in the last character str[LenPos] by storing "MaxSize - length" there. If the string - // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as - // the string terminator as well. For getting the string length back from that value just use - // "MaxSize - str[LenPos]". - // This allows to store 13-chars strings in 32-bit mode, 21-chars strings in 64-bit mode, - // 13-chars strings for RAPIDJSON_48BITPOINTER_OPTIMIZATION=1 inline (for `UTF8`-encoded strings). - struct ShortString { - enum { MaxChars = sizeof(static_cast(0)->payload) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize }; - Ch str[MaxChars]; - - inline static bool Usable(SizeType len) { return (MaxSize >= len); } - inline void SetLength(SizeType len) { str[LenPos] = static_cast(MaxSize - len); } - inline SizeType GetLength() const { return static_cast(MaxSize - str[LenPos]); } - }; // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode - - // By using proper binary layout, retrieval of different integer types do not need conversions. - union Number { -#if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN - struct I { - int i; - char padding[4]; - }i; - struct U { - unsigned u; - char padding2[4]; - }u; -#else - struct I { - char padding[4]; - int i; - }i; - struct U { - char padding2[4]; - unsigned u; - }u; -#endif - int64_t i64; - uint64_t u64; - double d; - }; // 8 bytes - - struct ObjectData { - SizeType size; - SizeType capacity; - Member* members; - }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode - - struct ArrayData { - SizeType size; - SizeType capacity; - GenericValue* elements; - }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode - - union Data { - String s; - ShortString ss; - Number n; - ObjectData o; - ArrayData a; - Flag f; - }; // 16 bytes in 32-bit mode, 24 bytes in 64-bit mode, 16 bytes in 64-bit with RAPIDJSON_48BITPOINTER_OPTIMIZATION - - static RAPIDJSON_FORCEINLINE const Ch* DataString(const Data& data) { - return (data.f.flags & kInlineStrFlag) ? data.ss.str : RAPIDJSON_GETPOINTER(Ch, data.s.str); - } - static RAPIDJSON_FORCEINLINE SizeType DataStringLength(const Data& data) { - return (data.f.flags & kInlineStrFlag) ? data.ss.GetLength() : data.s.length; - } - - RAPIDJSON_FORCEINLINE const Ch* GetStringPointer() const { return RAPIDJSON_GETPOINTER(Ch, data_.s.str); } - RAPIDJSON_FORCEINLINE const Ch* SetStringPointer(const Ch* str) { return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); } - RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer() const { return RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); } - RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) { return RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); } - RAPIDJSON_FORCEINLINE Member* GetMembersPointer() const { return RAPIDJSON_GETPOINTER(Member, data_.o.members); } - RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) { return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); } - -#if RAPIDJSON_USE_MEMBERSMAP - - struct MapTraits { - struct Less { - bool operator()(const Data& s1, const Data& s2) const { - SizeType n1 = DataStringLength(s1), n2 = DataStringLength(s2); - int cmp = std::memcmp(DataString(s1), DataString(s2), sizeof(Ch) * (n1 < n2 ? n1 : n2)); - return cmp < 0 || (cmp == 0 && n1 < n2); - } - }; - typedef std::pair Pair; - typedef std::multimap > Map; - typedef typename Map::iterator Iterator; - }; - typedef typename MapTraits::Map Map; - typedef typename MapTraits::Less MapLess; - typedef typename MapTraits::Pair MapPair; - typedef typename MapTraits::Iterator MapIterator; - - // - // Layout of the members' map/array, re(al)located according to the needed capacity: - // - // {Map*}<>{capacity}<>{Member[capacity]}<>{MapIterator[capacity]} - // - // (where <> stands for the RAPIDJSON_ALIGN-ment, if needed) - // - - static RAPIDJSON_FORCEINLINE size_t GetMapLayoutSize(SizeType capacity) { - return RAPIDJSON_ALIGN(sizeof(Map*)) + - RAPIDJSON_ALIGN(sizeof(SizeType)) + - RAPIDJSON_ALIGN(capacity * sizeof(Member)) + - capacity * sizeof(MapIterator); - } - - static RAPIDJSON_FORCEINLINE SizeType &GetMapCapacity(Map* &map) { - return *reinterpret_cast(reinterpret_cast(&map) + - RAPIDJSON_ALIGN(sizeof(Map*))); - } - - static RAPIDJSON_FORCEINLINE Member* GetMapMembers(Map* &map) { - return reinterpret_cast(reinterpret_cast(&map) + - RAPIDJSON_ALIGN(sizeof(Map*)) + - RAPIDJSON_ALIGN(sizeof(SizeType))); - } - - static RAPIDJSON_FORCEINLINE MapIterator* GetMapIterators(Map* &map) { - return reinterpret_cast(reinterpret_cast(&map) + - RAPIDJSON_ALIGN(sizeof(Map*)) + - RAPIDJSON_ALIGN(sizeof(SizeType)) + - RAPIDJSON_ALIGN(GetMapCapacity(map) * sizeof(Member))); - } - - static RAPIDJSON_FORCEINLINE Map* &GetMap(Member* members) { - RAPIDJSON_ASSERT(members != 0); - return *reinterpret_cast(reinterpret_cast(members) - - RAPIDJSON_ALIGN(sizeof(SizeType)) - - RAPIDJSON_ALIGN(sizeof(Map*))); - } - - // Some compilers' debug mechanisms want all iterators to be destroyed, for their accounting.. - RAPIDJSON_FORCEINLINE MapIterator DropMapIterator(MapIterator& rhs) { -#if RAPIDJSON_HAS_CXX11 - MapIterator ret = std::move(rhs); -#else - MapIterator ret = rhs; -#endif - rhs.~MapIterator(); - return ret; - } - - Map* &DoReallocMap(Map** oldMap, SizeType newCapacity, Allocator& allocator) { - Map **newMap = static_cast(allocator.Malloc(GetMapLayoutSize(newCapacity))); - GetMapCapacity(*newMap) = newCapacity; - if (!oldMap) { - *newMap = new (allocator.Malloc(sizeof(Map))) Map(MapLess(), allocator); - } - else { - *newMap = *oldMap; - size_t count = (*oldMap)->size(); - std::memcpy(static_cast(GetMapMembers(*newMap)), - static_cast(GetMapMembers(*oldMap)), - count * sizeof(Member)); - MapIterator *oldIt = GetMapIterators(*oldMap), - *newIt = GetMapIterators(*newMap); - while (count--) { - new (&newIt[count]) MapIterator(DropMapIterator(oldIt[count])); - } - Allocator::Free(oldMap); - } - return *newMap; - } - - RAPIDJSON_FORCEINLINE Member* DoAllocMembers(SizeType capacity, Allocator& allocator) { - return GetMapMembers(DoReallocMap(0, capacity, allocator)); - } - - void DoReserveMembers(SizeType newCapacity, Allocator& allocator) { - ObjectData& o = data_.o; - if (newCapacity > o.capacity) { - Member* oldMembers = GetMembersPointer(); - Map **oldMap = oldMembers ? &GetMap(oldMembers) : 0, - *&newMap = DoReallocMap(oldMap, newCapacity, allocator); - RAPIDJSON_SETPOINTER(Member, o.members, GetMapMembers(newMap)); - o.capacity = newCapacity; - } - } - - template - MemberIterator DoFindMember(const GenericValue& name) { - if (Member* members = GetMembersPointer()) { - Map* &map = GetMap(members); - MapIterator mit = map->find(reinterpret_cast(name.data_)); - if (mit != map->end()) { - return MemberIterator(&members[mit->second]); - } - } - return MemberEnd(); - } - - void DoClearMembers() { - if (Member* members = GetMembersPointer()) { - Map* &map = GetMap(members); - MapIterator* mit = GetMapIterators(map); - for (SizeType i = 0; i < data_.o.size; i++) { - map->erase(DropMapIterator(mit[i])); - members[i].~Member(); - } - data_.o.size = 0; - } - } - - void DoFreeMembers() { - if (Member* members = GetMembersPointer()) { - GetMap(members)->~Map(); - for (SizeType i = 0; i < data_.o.size; i++) { - members[i].~Member(); - } - if (Allocator::kNeedFree) { // Shortcut by Allocator's trait - Map** map = &GetMap(members); - Allocator::Free(*map); - Allocator::Free(map); - } - } - } - -#else // !RAPIDJSON_USE_MEMBERSMAP - - RAPIDJSON_FORCEINLINE Member* DoAllocMembers(SizeType capacity, Allocator& allocator) { - return Malloc(allocator, capacity); - } - - void DoReserveMembers(SizeType newCapacity, Allocator& allocator) { - ObjectData& o = data_.o; - if (newCapacity > o.capacity) { - Member* newMembers = Realloc(allocator, GetMembersPointer(), o.capacity, newCapacity); - RAPIDJSON_SETPOINTER(Member, o.members, newMembers); - o.capacity = newCapacity; - } - } - - template - MemberIterator DoFindMember(const GenericValue& name) { - MemberIterator member = MemberBegin(); - for ( ; member != MemberEnd(); ++member) - if (name.StringEqual(member->name)) - break; - return member; - } - - void DoClearMembers() { - for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) - m->~Member(); - data_.o.size = 0; - } - - void DoFreeMembers() { - for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) - m->~Member(); - Allocator::Free(GetMembersPointer()); - } - -#endif // !RAPIDJSON_USE_MEMBERSMAP - - void DoAddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { - ObjectData& o = data_.o; - if (o.size >= o.capacity) - DoReserveMembers(o.capacity ? (o.capacity + (o.capacity + 1) / 2) : kDefaultObjectCapacity, allocator); - Member* members = GetMembersPointer(); - Member* m = members + o.size; - m->name.RawAssign(name); - m->value.RawAssign(value); -#if RAPIDJSON_USE_MEMBERSMAP - Map* &map = GetMap(members); - MapIterator* mit = GetMapIterators(map); - new (&mit[o.size]) MapIterator(map->insert(MapPair(m->name.data_, o.size))); -#endif - ++o.size; - } - - MemberIterator DoRemoveMember(MemberIterator m) { - ObjectData& o = data_.o; - Member* members = GetMembersPointer(); -#if RAPIDJSON_USE_MEMBERSMAP - Map* &map = GetMap(members); - MapIterator* mit = GetMapIterators(map); - SizeType mpos = static_cast(&*m - members); - map->erase(DropMapIterator(mit[mpos])); -#endif - MemberIterator last(members + (o.size - 1)); - if (o.size > 1 && m != last) { -#if RAPIDJSON_USE_MEMBERSMAP - new (&mit[mpos]) MapIterator(DropMapIterator(mit[&*last - members])); - mit[mpos]->second = mpos; -#endif - *m = *last; // Move the last one to this place - } - else { - m->~Member(); // Only one left, just destroy - } - --o.size; - return m; - } - - MemberIterator DoEraseMembers(ConstMemberIterator first, ConstMemberIterator last) { - ObjectData& o = data_.o; - MemberIterator beg = MemberBegin(), - pos = beg + (first - beg), - end = MemberEnd(); -#if RAPIDJSON_USE_MEMBERSMAP - Map* &map = GetMap(GetMembersPointer()); - MapIterator* mit = GetMapIterators(map); -#endif - for (MemberIterator itr = pos; itr != last; ++itr) { -#if RAPIDJSON_USE_MEMBERSMAP - map->erase(DropMapIterator(mit[itr - beg])); -#endif - itr->~Member(); - } -#if RAPIDJSON_USE_MEMBERSMAP - if (first != last) { - // Move remaining members/iterators - MemberIterator next = pos + (last - first); - for (MemberIterator itr = pos; next != end; ++itr, ++next) { - std::memcpy(static_cast(&*itr), &*next, sizeof(Member)); - SizeType mpos = static_cast(itr - beg); - new (&mit[mpos]) MapIterator(DropMapIterator(mit[next - beg])); - mit[mpos]->second = mpos; - } - } -#else - std::memmove(static_cast(&*pos), &*last, - static_cast(end - last) * sizeof(Member)); -#endif - o.size -= static_cast(last - first); - return pos; - } - - template - void DoCopyMembers(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings) { - RAPIDJSON_ASSERT(rhs.GetType() == kObjectType); - - data_.f.flags = kObjectFlag; - SizeType count = rhs.data_.o.size; - Member* lm = DoAllocMembers(count, allocator); - const typename GenericValue::Member* rm = rhs.GetMembersPointer(); -#if RAPIDJSON_USE_MEMBERSMAP - Map* &map = GetMap(lm); - MapIterator* mit = GetMapIterators(map); -#endif - for (SizeType i = 0; i < count; i++) { - new (&lm[i].name) GenericValue(rm[i].name, allocator, copyConstStrings); - new (&lm[i].value) GenericValue(rm[i].value, allocator, copyConstStrings); -#if RAPIDJSON_USE_MEMBERSMAP - new (&mit[i]) MapIterator(map->insert(MapPair(lm[i].name.data_, i))); -#endif - } - data_.o.size = data_.o.capacity = count; - SetMembersPointer(lm); - } - - // Initialize this value as array with initial data, without calling destructor. - void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) { - data_.f.flags = kArrayFlag; - if (count) { - GenericValue* e = static_cast(allocator.Malloc(count * sizeof(GenericValue))); - SetElementsPointer(e); - std::memcpy(static_cast(e), values, count * sizeof(GenericValue)); - } - else - SetElementsPointer(0); - data_.a.size = data_.a.capacity = count; - } - - //! Initialize this value as object with initial data, without calling destructor. - void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) { - data_.f.flags = kObjectFlag; - if (count) { - Member* m = DoAllocMembers(count, allocator); - SetMembersPointer(m); - std::memcpy(static_cast(m), members, count * sizeof(Member)); -#if RAPIDJSON_USE_MEMBERSMAP - Map* &map = GetMap(m); - MapIterator* mit = GetMapIterators(map); - for (SizeType i = 0; i < count; i++) { - new (&mit[i]) MapIterator(map->insert(MapPair(m[i].name.data_, i))); - } -#endif - } - else - SetMembersPointer(0); - data_.o.size = data_.o.capacity = count; - } - - //! Initialize this value as constant string, without calling destructor. - void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT { - data_.f.flags = kConstStringFlag; - SetStringPointer(s); - data_.s.length = s.length; - } - - //! Initialize this value as copy string with initial data, without calling destructor. - void SetStringRaw(StringRefType s, Allocator& allocator) { - Ch* str = 0; - if (ShortString::Usable(s.length)) { - data_.f.flags = kShortStringFlag; - data_.ss.SetLength(s.length); - str = data_.ss.str; - } else { - data_.f.flags = kCopyStringFlag; - data_.s.length = s.length; - str = static_cast(allocator.Malloc((s.length + 1) * sizeof(Ch))); - SetStringPointer(str); - } - std::memcpy(str, s, s.length * sizeof(Ch)); - str[s.length] = '\0'; - } - - //! Assignment without calling destructor - void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT { - data_ = rhs.data_; - // data_.f.flags = rhs.data_.f.flags; - rhs.data_.f.flags = kNullFlag; - } - - template - bool StringEqual(const GenericValue& rhs) const { - RAPIDJSON_ASSERT(IsString()); - RAPIDJSON_ASSERT(rhs.IsString()); - - const SizeType len1 = GetStringLength(); - const SizeType len2 = rhs.GetStringLength(); - if(len1 != len2) { return false; } - - const Ch* const str1 = GetString(); - const Ch* const str2 = rhs.GetString(); - if(str1 == str2) { return true; } // fast path for constant string - - return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0); - } - - Data data_; -}; - -//! GenericValue with UTF8 encoding -typedef GenericValue > Value; - -/////////////////////////////////////////////////////////////////////////////// -// GenericDocument - -//! A document for parsing JSON text as DOM. -/*! - \note implements Handler concept - \tparam Encoding Encoding for both parsing and string storage. - \tparam Allocator Allocator for allocating memory for the DOM - \tparam StackAllocator Allocator for allocating memory for stack during parsing. - \warning Although GenericDocument inherits from GenericValue, the API does \b not provide any virtual functions, especially no virtual destructor. To avoid memory leaks, do not \c delete a GenericDocument object via a pointer to a GenericValue. -*/ -template -class GenericDocument : public GenericValue { -public: - typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. - typedef GenericValue ValueType; //!< Value type of the document. - typedef Allocator AllocatorType; //!< Allocator type from template parameter. - typedef StackAllocator StackAllocatorType; //!< StackAllocator type from template parameter. - - //! Constructor - /*! Creates an empty document of specified type. - \param type Mandatory type of object to create. - \param allocator Optional allocator for allocating memory. - \param stackCapacity Optional initial capacity of stack in bytes. - \param stackAllocator Optional allocator for allocating memory for stack. - */ - explicit GenericDocument(Type type, Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : - GenericValue(type), allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() - { - if (!allocator_) - ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); - } - - //! Constructor - /*! Creates an empty document which type is Null. - \param allocator Optional allocator for allocating memory. - \param stackCapacity Optional initial capacity of stack in bytes. - \param stackAllocator Optional allocator for allocating memory for stack. - */ - GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : - allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() - { - if (!allocator_) - ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); - } - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - //! Move constructor in C++11 - GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT - : ValueType(std::forward(rhs)), // explicit cast to avoid prohibited move from Document - allocator_(rhs.allocator_), - ownAllocator_(rhs.ownAllocator_), - stack_(std::move(rhs.stack_)), - parseResult_(rhs.parseResult_) - { - rhs.allocator_ = 0; - rhs.ownAllocator_ = 0; - rhs.parseResult_ = ParseResult(); - } -#endif - - ~GenericDocument() { - // Clear the ::ValueType before ownAllocator is destroyed, ~ValueType() - // runs last and may access its elements or members which would be freed - // with an allocator like MemoryPoolAllocator (CrtAllocator does not - // free its data when destroyed, but MemoryPoolAllocator does). - if (ownAllocator_) { - ValueType::SetNull(); - } - Destroy(); - } - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - //! Move assignment in C++11 - GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT - { - // The cast to ValueType is necessary here, because otherwise it would - // attempt to call GenericValue's templated assignment operator. - ValueType::operator=(std::forward(rhs)); - - // Calling the destructor here would prematurely call stack_'s destructor - Destroy(); - - allocator_ = rhs.allocator_; - ownAllocator_ = rhs.ownAllocator_; - stack_ = std::move(rhs.stack_); - parseResult_ = rhs.parseResult_; - - rhs.allocator_ = 0; - rhs.ownAllocator_ = 0; - rhs.parseResult_ = ParseResult(); - - return *this; - } -#endif - - //! Exchange the contents of this document with those of another. - /*! - \param rhs Another document. - \note Constant complexity. - \see GenericValue::Swap - */ - GenericDocument& Swap(GenericDocument& rhs) RAPIDJSON_NOEXCEPT { - ValueType::Swap(rhs); - stack_.Swap(rhs.stack_); - internal::Swap(allocator_, rhs.allocator_); - internal::Swap(ownAllocator_, rhs.ownAllocator_); - internal::Swap(parseResult_, rhs.parseResult_); - return *this; - } - - // Allow Swap with ValueType. - // Refer to Effective C++ 3rd Edition/Item 33: Avoid hiding inherited names. - using ValueType::Swap; - - //! free-standing swap function helper - /*! - Helper function to enable support for common swap implementation pattern based on \c std::swap: - \code - void swap(MyClass& a, MyClass& b) { - using std::swap; - swap(a.doc, b.doc); - // ... - } - \endcode - \see Swap() - */ - friend inline void swap(GenericDocument& a, GenericDocument& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } - - //! Populate this document by a generator which produces SAX events. - /*! \tparam Generator A functor with bool f(Handler) prototype. - \param g Generator functor which sends SAX events to the parameter. - \return The document itself for fluent API. - */ - template - GenericDocument& Populate(Generator& g) { - ClearStackOnExit scope(*this); - if (g(*this)) { - RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object - ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document - } - return *this; - } - - //!@name Parse from stream - //!@{ - - //! Parse JSON text from an input stream (with Encoding conversion) - /*! \tparam parseFlags Combination of \ref ParseFlag. - \tparam SourceEncoding Encoding of input stream - \tparam InputStream Type of input stream, implementing Stream concept - \param is Input stream to be parsed. - \return The document itself for fluent API. - */ - template - GenericDocument& ParseStream(InputStream& is) { - GenericReader reader( - stack_.HasAllocator() ? &stack_.GetAllocator() : 0); - ClearStackOnExit scope(*this); - parseResult_ = reader.template Parse(is, *this); - if (parseResult_) { - RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object - ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document - } - return *this; - } - - //! Parse JSON text from an input stream - /*! \tparam parseFlags Combination of \ref ParseFlag. - \tparam InputStream Type of input stream, implementing Stream concept - \param is Input stream to be parsed. - \return The document itself for fluent API. - */ - template - GenericDocument& ParseStream(InputStream& is) { - return ParseStream(is); - } - - //! Parse JSON text from an input stream (with \ref kParseDefaultFlags) - /*! \tparam InputStream Type of input stream, implementing Stream concept - \param is Input stream to be parsed. - \return The document itself for fluent API. - */ - template - GenericDocument& ParseStream(InputStream& is) { - return ParseStream(is); - } - //!@} - - //!@name Parse in-place from mutable string - //!@{ - - //! Parse JSON text from a mutable string - /*! \tparam parseFlags Combination of \ref ParseFlag. - \param str Mutable zero-terminated string to be parsed. - \return The document itself for fluent API. - */ - template - GenericDocument& ParseInsitu(Ch* str) { - GenericInsituStringStream s(str); - return ParseStream(s); - } - - //! Parse JSON text from a mutable string (with \ref kParseDefaultFlags) - /*! \param str Mutable zero-terminated string to be parsed. - \return The document itself for fluent API. - */ - GenericDocument& ParseInsitu(Ch* str) { - return ParseInsitu(str); - } - //!@} - - //!@name Parse from read-only string - //!@{ - - //! Parse JSON text from a read-only string (with Encoding conversion) - /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). - \tparam SourceEncoding Transcoding from input Encoding - \param str Read-only zero-terminated string to be parsed. - */ - template - GenericDocument& Parse(const typename SourceEncoding::Ch* str) { - RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); - GenericStringStream s(str); - return ParseStream(s); - } - - //! Parse JSON text from a read-only string - /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). - \param str Read-only zero-terminated string to be parsed. - */ - template - GenericDocument& Parse(const Ch* str) { - return Parse(str); - } - - //! Parse JSON text from a read-only string (with \ref kParseDefaultFlags) - /*! \param str Read-only zero-terminated string to be parsed. - */ - GenericDocument& Parse(const Ch* str) { - return Parse(str); - } - - template - GenericDocument& Parse(const typename SourceEncoding::Ch* str, size_t length) { - RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); - MemoryStream ms(reinterpret_cast(str), length * sizeof(typename SourceEncoding::Ch)); - EncodedInputStream is(ms); - ParseStream(is); - return *this; - } - - template - GenericDocument& Parse(const Ch* str, size_t length) { - return Parse(str, length); - } - - GenericDocument& Parse(const Ch* str, size_t length) { - return Parse(str, length); - } - -#if RAPIDJSON_HAS_STDSTRING - template - GenericDocument& Parse(const std::basic_string& str) { - // c_str() is constant complexity according to standard. Should be faster than Parse(const char*, size_t) - return Parse(str.c_str()); - } - - template - GenericDocument& Parse(const std::basic_string& str) { - return Parse(str.c_str()); - } - - GenericDocument& Parse(const std::basic_string& str) { - return Parse(str); - } -#endif // RAPIDJSON_HAS_STDSTRING - - //!@} - - //!@name Handling parse errors - //!@{ - - //! Whether a parse error has occurred in the last parsing. - bool HasParseError() const { return parseResult_.IsError(); } - - //! Get the \ref ParseErrorCode of last parsing. - ParseErrorCode GetParseError() const { return parseResult_.Code(); } - - //! Get the position of last parsing error in input, 0 otherwise. - size_t GetErrorOffset() const { return parseResult_.Offset(); } - - //! Implicit conversion to get the last parse result -#ifndef __clang // -Wdocumentation - /*! \return \ref ParseResult of the last parse operation - - \code - Document doc; - ParseResult ok = doc.Parse(json); - if (!ok) - printf( "JSON parse error: %s (%u)\n", GetParseError_En(ok.Code()), ok.Offset()); - \endcode - */ -#endif - operator ParseResult() const { return parseResult_; } - //!@} - - //! Get the allocator of this document. - Allocator& GetAllocator() { - RAPIDJSON_ASSERT(allocator_); - return *allocator_; - } - - //! Get the capacity of stack in bytes. - size_t GetStackCapacity() const { return stack_.GetCapacity(); } - -private: - // clear stack on any exit from ParseStream, e.g. due to exception - struct ClearStackOnExit { - explicit ClearStackOnExit(GenericDocument& d) : d_(d) {} - ~ClearStackOnExit() { d_.ClearStack(); } - private: - ClearStackOnExit(const ClearStackOnExit&); - ClearStackOnExit& operator=(const ClearStackOnExit&); - GenericDocument& d_; - }; - - // callers of the following private Handler functions - // template friend class GenericReader; // for parsing - template friend class GenericValue; // for deep copying - -public: - // Implementation of Handler - bool Null() { new (stack_.template Push()) ValueType(); return true; } - bool Bool(bool b) { new (stack_.template Push()) ValueType(b); return true; } - bool Int(int i) { new (stack_.template Push()) ValueType(i); return true; } - bool Uint(unsigned i) { new (stack_.template Push()) ValueType(i); return true; } - bool Int64(int64_t i) { new (stack_.template Push()) ValueType(i); return true; } - bool Uint64(uint64_t i) { new (stack_.template Push()) ValueType(i); return true; } - bool Double(double d) { new (stack_.template Push()) ValueType(d); return true; } - - bool RawNumber(const Ch* str, SizeType length, bool copy) { - if (copy) - new (stack_.template Push()) ValueType(str, length, GetAllocator()); - else - new (stack_.template Push()) ValueType(str, length); - return true; - } - - bool String(const Ch* str, SizeType length, bool copy) { - if (copy) - new (stack_.template Push()) ValueType(str, length, GetAllocator()); - else - new (stack_.template Push()) ValueType(str, length); - return true; - } - - bool StartObject() { new (stack_.template Push()) ValueType(kObjectType); return true; } - - bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); } - - bool EndObject(SizeType memberCount) { - typename ValueType::Member* members = stack_.template Pop(memberCount); - stack_.template Top()->SetObjectRaw(members, memberCount, GetAllocator()); - return true; - } - - bool StartArray() { new (stack_.template Push()) ValueType(kArrayType); return true; } - - bool EndArray(SizeType elementCount) { - ValueType* elements = stack_.template Pop(elementCount); - stack_.template Top()->SetArrayRaw(elements, elementCount, GetAllocator()); - return true; - } - -private: - //! Prohibit copying - GenericDocument(const GenericDocument&); - //! Prohibit assignment - GenericDocument& operator=(const GenericDocument&); - - void ClearStack() { - if (Allocator::kNeedFree) - while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects) - (stack_.template Pop(1))->~ValueType(); - else - stack_.Clear(); - stack_.ShrinkToFit(); - } - - void Destroy() { - RAPIDJSON_DELETE(ownAllocator_); - } - - static const size_t kDefaultStackCapacity = 1024; - Allocator* allocator_; - Allocator* ownAllocator_; - internal::Stack stack_; - ParseResult parseResult_; -}; - -//! GenericDocument with UTF8 encoding -typedef GenericDocument > Document; - - -//! Helper class for accessing Value of array type. -/*! - Instance of this helper class is obtained by \c GenericValue::GetArray(). - In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. -*/ -template -class GenericArray { -public: - typedef GenericArray ConstArray; - typedef GenericArray Array; - typedef ValueT PlainType; - typedef typename internal::MaybeAddConst::Type ValueType; - typedef ValueType* ValueIterator; // This may be const or non-const iterator - typedef const ValueT* ConstValueIterator; - typedef typename ValueType::AllocatorType AllocatorType; - typedef typename ValueType::StringRefType StringRefType; - - template - friend class GenericValue; - - GenericArray(const GenericArray& rhs) : value_(rhs.value_) {} - GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; } - ~GenericArray() {} - - operator ValueType&() const { return value_; } - SizeType Size() const { return value_.Size(); } - SizeType Capacity() const { return value_.Capacity(); } - bool Empty() const { return value_.Empty(); } - void Clear() const { value_.Clear(); } - ValueType& operator[](SizeType index) const { return value_[index]; } - ValueIterator Begin() const { return value_.Begin(); } - ValueIterator End() const { return value_.End(); } - GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const { value_.Reserve(newCapacity, allocator); return *this; } - GenericArray PushBack(ValueType& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - GenericArray PushBack(ValueType&& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } -#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS - GenericArray PushBack(StringRefType value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } - template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (const GenericArray&)) PushBack(T value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } - GenericArray PopBack() const { value_.PopBack(); return *this; } - ValueIterator Erase(ConstValueIterator pos) const { return value_.Erase(pos); } - ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const { return value_.Erase(first, last); } - -#if RAPIDJSON_HAS_CXX11_RANGE_FOR - ValueIterator begin() const { return value_.Begin(); } - ValueIterator end() const { return value_.End(); } -#endif - -private: - GenericArray(); - GenericArray(ValueType& value) : value_(value) {} - ValueType& value_; -}; - -//! Helper class for accessing Value of object type. -/*! - Instance of this helper class is obtained by \c GenericValue::GetObject(). - In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. -*/ -template -class GenericObject { -public: - typedef GenericObject ConstObject; - typedef GenericObject Object; - typedef ValueT PlainType; - typedef typename internal::MaybeAddConst::Type ValueType; - typedef GenericMemberIterator MemberIterator; // This may be const or non-const iterator - typedef GenericMemberIterator ConstMemberIterator; - typedef typename ValueType::AllocatorType AllocatorType; - typedef typename ValueType::StringRefType StringRefType; - typedef typename ValueType::EncodingType EncodingType; - typedef typename ValueType::Ch Ch; - - template - friend class GenericValue; - - GenericObject(const GenericObject& rhs) : value_(rhs.value_) {} - GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; } - ~GenericObject() {} - - operator ValueType&() const { return value_; } - SizeType MemberCount() const { return value_.MemberCount(); } - SizeType MemberCapacity() const { return value_.MemberCapacity(); } - bool ObjectEmpty() const { return value_.ObjectEmpty(); } - template ValueType& operator[](T* name) const { return value_[name]; } - template ValueType& operator[](const GenericValue& name) const { return value_[name]; } -#if RAPIDJSON_HAS_STDSTRING - ValueType& operator[](const std::basic_string& name) const { return value_[name]; } -#endif - MemberIterator MemberBegin() const { return value_.MemberBegin(); } - MemberIterator MemberEnd() const { return value_.MemberEnd(); } - GenericObject MemberReserve(SizeType newCapacity, AllocatorType &allocator) const { value_.MemberReserve(newCapacity, allocator); return *this; } - bool HasMember(const Ch* name) const { return value_.HasMember(name); } -#if RAPIDJSON_HAS_STDSTRING - bool HasMember(const std::basic_string& name) const { return value_.HasMember(name); } -#endif - template bool HasMember(const GenericValue& name) const { return value_.HasMember(name); } - MemberIterator FindMember(const Ch* name) const { return value_.FindMember(name); } - template MemberIterator FindMember(const GenericValue& name) const { return value_.FindMember(name); } -#if RAPIDJSON_HAS_STDSTRING - MemberIterator FindMember(const std::basic_string& name) const { return value_.FindMember(name); } -#endif - GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } - GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } -#if RAPIDJSON_HAS_STDSTRING - GenericObject AddMember(ValueType& name, std::basic_string& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } -#endif - template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } - GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } - GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } - GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } -#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS - GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } - GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } - template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } - void RemoveAllMembers() { value_.RemoveAllMembers(); } - bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); } -#if RAPIDJSON_HAS_STDSTRING - bool RemoveMember(const std::basic_string& name) const { return value_.RemoveMember(name); } -#endif - template bool RemoveMember(const GenericValue& name) const { return value_.RemoveMember(name); } - MemberIterator RemoveMember(MemberIterator m) const { return value_.RemoveMember(m); } - MemberIterator EraseMember(ConstMemberIterator pos) const { return value_.EraseMember(pos); } - MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const { return value_.EraseMember(first, last); } - bool EraseMember(const Ch* name) const { return value_.EraseMember(name); } -#if RAPIDJSON_HAS_STDSTRING - bool EraseMember(const std::basic_string& name) const { return EraseMember(ValueType(StringRef(name))); } -#endif - template bool EraseMember(const GenericValue& name) const { return value_.EraseMember(name); } - -#if RAPIDJSON_HAS_CXX11_RANGE_FOR - MemberIterator begin() const { return value_.MemberBegin(); } - MemberIterator end() const { return value_.MemberEnd(); } -#endif - -private: - GenericObject(); - GenericObject(ValueType& value) : value_(value) {} - ValueType& value_; -}; - -RAPIDJSON_NAMESPACE_END -RAPIDJSON_DIAG_POP - -#ifdef RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED -#pragma pop_macro("GetObject") -#undef RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED -#endif - -#endif // RAPIDJSON_DOCUMENT_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/encodedstream.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/encodedstream.h deleted file mode 100644 index 309499d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/encodedstream.h +++ /dev/null @@ -1,299 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_ENCODEDSTREAM_H_ -#define RAPIDJSON_ENCODEDSTREAM_H_ - -#include "stream.h" -#include "memorystream.h" - -#ifdef __GNUC__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(effc++) -#endif - -#ifdef __clang__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(padded) -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -//! Input byte stream wrapper with a statically bound encoding. -/*! - \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. - \tparam InputByteStream Type of input byte stream. For example, FileReadStream. -*/ -template -class EncodedInputStream { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); -public: - typedef typename Encoding::Ch Ch; - - EncodedInputStream(InputByteStream& is) : is_(is) { - current_ = Encoding::TakeBOM(is_); - } - - Ch Peek() const { return current_; } - Ch Take() { Ch c = current_; current_ = Encoding::Take(is_); return c; } - size_t Tell() const { return is_.Tell(); } - - // Not implemented - void Put(Ch) { RAPIDJSON_ASSERT(false); } - void Flush() { RAPIDJSON_ASSERT(false); } - Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } - size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } - -private: - EncodedInputStream(const EncodedInputStream&); - EncodedInputStream& operator=(const EncodedInputStream&); - - InputByteStream& is_; - Ch current_; -}; - -//! Specialized for UTF8 MemoryStream. -template <> -class EncodedInputStream, MemoryStream> { -public: - typedef UTF8<>::Ch Ch; - - EncodedInputStream(MemoryStream& is) : is_(is) { - if (static_cast(is_.Peek()) == 0xEFu) is_.Take(); - if (static_cast(is_.Peek()) == 0xBBu) is_.Take(); - if (static_cast(is_.Peek()) == 0xBFu) is_.Take(); - } - Ch Peek() const { return is_.Peek(); } - Ch Take() { return is_.Take(); } - size_t Tell() const { return is_.Tell(); } - - // Not implemented - void Put(Ch) {} - void Flush() {} - Ch* PutBegin() { return 0; } - size_t PutEnd(Ch*) { return 0; } - - MemoryStream& is_; - -private: - EncodedInputStream(const EncodedInputStream&); - EncodedInputStream& operator=(const EncodedInputStream&); -}; - -//! Output byte stream wrapper with statically bound encoding. -/*! - \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. - \tparam OutputByteStream Type of input byte stream. For example, FileWriteStream. -*/ -template -class EncodedOutputStream { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); -public: - typedef typename Encoding::Ch Ch; - - EncodedOutputStream(OutputByteStream& os, bool putBOM = true) : os_(os) { - if (putBOM) - Encoding::PutBOM(os_); - } - - void Put(Ch c) { Encoding::Put(os_, c); } - void Flush() { os_.Flush(); } - - // Not implemented - Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} - Ch Take() { RAPIDJSON_ASSERT(false); return 0;} - size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } - Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } - size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } - -private: - EncodedOutputStream(const EncodedOutputStream&); - EncodedOutputStream& operator=(const EncodedOutputStream&); - - OutputByteStream& os_; -}; - -#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x - -//! Input stream wrapper with dynamically bound encoding and automatic encoding detection. -/*! - \tparam CharType Type of character for reading. - \tparam InputByteStream type of input byte stream to be wrapped. -*/ -template -class AutoUTFInputStream { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); -public: - typedef CharType Ch; - - //! Constructor. - /*! - \param is input stream to be wrapped. - \param type UTF encoding type if it is not detected from the stream. - */ - AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) { - RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); - DetectType(); - static const TakeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Take) }; - takeFunc_ = f[type_]; - current_ = takeFunc_(*is_); - } - - UTFType GetType() const { return type_; } - bool HasBOM() const { return hasBOM_; } - - Ch Peek() const { return current_; } - Ch Take() { Ch c = current_; current_ = takeFunc_(*is_); return c; } - size_t Tell() const { return is_->Tell(); } - - // Not implemented - void Put(Ch) { RAPIDJSON_ASSERT(false); } - void Flush() { RAPIDJSON_ASSERT(false); } - Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } - size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } - -private: - AutoUTFInputStream(const AutoUTFInputStream&); - AutoUTFInputStream& operator=(const AutoUTFInputStream&); - - // Detect encoding type with BOM or RFC 4627 - void DetectType() { - // BOM (Byte Order Mark): - // 00 00 FE FF UTF-32BE - // FF FE 00 00 UTF-32LE - // FE FF UTF-16BE - // FF FE UTF-16LE - // EF BB BF UTF-8 - - const unsigned char* c = reinterpret_cast(is_->Peek4()); - if (!c) - return; - - unsigned bom = static_cast(c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24)); - hasBOM_ = false; - if (bom == 0xFFFE0000) { type_ = kUTF32BE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } - else if (bom == 0x0000FEFF) { type_ = kUTF32LE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } - else if ((bom & 0xFFFF) == 0xFFFE) { type_ = kUTF16BE; hasBOM_ = true; is_->Take(); is_->Take(); } - else if ((bom & 0xFFFF) == 0xFEFF) { type_ = kUTF16LE; hasBOM_ = true; is_->Take(); is_->Take(); } - else if ((bom & 0xFFFFFF) == 0xBFBBEF) { type_ = kUTF8; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); } - - // RFC 4627: Section 3 - // "Since the first two characters of a JSON text will always be ASCII - // characters [RFC0020], it is possible to determine whether an octet - // stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking - // at the pattern of nulls in the first four octets." - // 00 00 00 xx UTF-32BE - // 00 xx 00 xx UTF-16BE - // xx 00 00 00 UTF-32LE - // xx 00 xx 00 UTF-16LE - // xx xx xx xx UTF-8 - - if (!hasBOM_) { - int pattern = (c[0] ? 1 : 0) | (c[1] ? 2 : 0) | (c[2] ? 4 : 0) | (c[3] ? 8 : 0); - switch (pattern) { - case 0x08: type_ = kUTF32BE; break; - case 0x0A: type_ = kUTF16BE; break; - case 0x01: type_ = kUTF32LE; break; - case 0x05: type_ = kUTF16LE; break; - case 0x0F: type_ = kUTF8; break; - default: break; // Use type defined by user. - } - } - - // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. - if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); - if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); - } - - typedef Ch (*TakeFunc)(InputByteStream& is); - InputByteStream* is_; - UTFType type_; - Ch current_; - TakeFunc takeFunc_; - bool hasBOM_; -}; - -//! Output stream wrapper with dynamically bound encoding and automatic encoding detection. -/*! - \tparam CharType Type of character for writing. - \tparam OutputByteStream type of output byte stream to be wrapped. -*/ -template -class AutoUTFOutputStream { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); -public: - typedef CharType Ch; - - //! Constructor. - /*! - \param os output stream to be wrapped. - \param type UTF encoding type. - \param putBOM Whether to write BOM at the beginning of the stream. - */ - AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) { - RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); - - // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. - if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); - if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); - - static const PutFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Put) }; - putFunc_ = f[type_]; - - if (putBOM) - PutBOM(); - } - - UTFType GetType() const { return type_; } - - void Put(Ch c) { putFunc_(*os_, c); } - void Flush() { os_->Flush(); } - - // Not implemented - Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} - Ch Take() { RAPIDJSON_ASSERT(false); return 0;} - size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } - Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } - size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } - -private: - AutoUTFOutputStream(const AutoUTFOutputStream&); - AutoUTFOutputStream& operator=(const AutoUTFOutputStream&); - - void PutBOM() { - typedef void (*PutBOMFunc)(OutputByteStream&); - static const PutBOMFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(PutBOM) }; - f[type_](*os_); - } - - typedef void (*PutFunc)(OutputByteStream&, Ch); - - OutputByteStream* os_; - UTFType type_; - PutFunc putFunc_; -}; - -#undef RAPIDJSON_ENCODINGS_FUNC - -RAPIDJSON_NAMESPACE_END - -#ifdef __clang__ -RAPIDJSON_DIAG_POP -#endif - -#ifdef __GNUC__ -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/encodings.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/encodings.h deleted file mode 100644 index 5ee169e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/encodings.h +++ /dev/null @@ -1,716 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_ENCODINGS_H_ -#define RAPIDJSON_ENCODINGS_H_ - -#include "rapidjson.h" - -#if defined(_MSC_VER) && !defined(__clang__) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(4244) // conversion from 'type1' to 'type2', possible loss of data -RAPIDJSON_DIAG_OFF(4702) // unreachable code -#elif defined(__GNUC__) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(effc++) -RAPIDJSON_DIAG_OFF(overflow) -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -/////////////////////////////////////////////////////////////////////////////// -// Encoding - -/*! \class rapidjson::Encoding - \brief Concept for encoding of Unicode characters. - -\code -concept Encoding { - typename Ch; //! Type of character. A "character" is actually a code unit in unicode's definition. - - enum { supportUnicode = 1 }; // or 0 if not supporting unicode - - //! \brief Encode a Unicode codepoint to an output stream. - //! \param os Output stream. - //! \param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively. - template - static void Encode(OutputStream& os, unsigned codepoint); - - //! \brief Decode a Unicode codepoint from an input stream. - //! \param is Input stream. - //! \param codepoint Output of the unicode codepoint. - //! \return true if a valid codepoint can be decoded from the stream. - template - static bool Decode(InputStream& is, unsigned* codepoint); - - //! \brief Validate one Unicode codepoint from an encoded stream. - //! \param is Input stream to obtain codepoint. - //! \param os Output for copying one codepoint. - //! \return true if it is valid. - //! \note This function just validating and copying the codepoint without actually decode it. - template - static bool Validate(InputStream& is, OutputStream& os); - - // The following functions are deal with byte streams. - - //! Take a character from input byte stream, skip BOM if exist. - template - static CharType TakeBOM(InputByteStream& is); - - //! Take a character from input byte stream. - template - static Ch Take(InputByteStream& is); - - //! Put BOM to output byte stream. - template - static void PutBOM(OutputByteStream& os); - - //! Put a character to output byte stream. - template - static void Put(OutputByteStream& os, Ch c); -}; -\endcode -*/ - -/////////////////////////////////////////////////////////////////////////////// -// UTF8 - -//! UTF-8 encoding. -/*! http://en.wikipedia.org/wiki/UTF-8 - http://tools.ietf.org/html/rfc3629 - \tparam CharType Code unit for storing 8-bit UTF-8 data. Default is char. - \note implements Encoding concept -*/ -template -struct UTF8 { - typedef CharType Ch; - - enum { supportUnicode = 1 }; - - template - static void Encode(OutputStream& os, unsigned codepoint) { - if (codepoint <= 0x7F) - os.Put(static_cast(codepoint & 0xFF)); - else if (codepoint <= 0x7FF) { - os.Put(static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); - os.Put(static_cast(0x80 | ((codepoint & 0x3F)))); - } - else if (codepoint <= 0xFFFF) { - os.Put(static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); - os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); - os.Put(static_cast(0x80 | (codepoint & 0x3F))); - } - else { - RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); - os.Put(static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); - os.Put(static_cast(0x80 | ((codepoint >> 12) & 0x3F))); - os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); - os.Put(static_cast(0x80 | (codepoint & 0x3F))); - } - } - - template - static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { - if (codepoint <= 0x7F) - PutUnsafe(os, static_cast(codepoint & 0xFF)); - else if (codepoint <= 0x7FF) { - PutUnsafe(os, static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); - PutUnsafe(os, static_cast(0x80 | ((codepoint & 0x3F)))); - } - else if (codepoint <= 0xFFFF) { - PutUnsafe(os, static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); - PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); - PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); - } - else { - RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); - PutUnsafe(os, static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); - PutUnsafe(os, static_cast(0x80 | ((codepoint >> 12) & 0x3F))); - PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); - PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); - } - } - - template - static bool Decode(InputStream& is, unsigned* codepoint) { -#define RAPIDJSON_COPY() c = is.Take(); *codepoint = (*codepoint << 6) | (static_cast(c) & 0x3Fu) -#define RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) -#define RAPIDJSON_TAIL() RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x70) - typename InputStream::Ch c = is.Take(); - if (!(c & 0x80)) { - *codepoint = static_cast(c); - return true; - } - - unsigned char type = GetRange(static_cast(c)); - if (type >= 32) { - *codepoint = 0; - } else { - *codepoint = (0xFFu >> type) & static_cast(c); - } - bool result = true; - switch (type) { - case 2: RAPIDJSON_TAIL(); return result; - case 3: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; - case 4: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x50); RAPIDJSON_TAIL(); return result; - case 5: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x10); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; - case 6: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; - case 10: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x20); RAPIDJSON_TAIL(); return result; - case 11: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x60); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; - default: return false; - } -#undef RAPIDJSON_COPY -#undef RAPIDJSON_TRANS -#undef RAPIDJSON_TAIL - } - - template - static bool Validate(InputStream& is, OutputStream& os) { -#define RAPIDJSON_COPY() os.Put(c = is.Take()) -#define RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) -#define RAPIDJSON_TAIL() RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x70) - Ch c; - RAPIDJSON_COPY(); - if (!(c & 0x80)) - return true; - - bool result = true; - switch (GetRange(static_cast(c))) { - case 2: RAPIDJSON_TAIL(); return result; - case 3: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; - case 4: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x50); RAPIDJSON_TAIL(); return result; - case 5: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x10); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; - case 6: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; - case 10: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x20); RAPIDJSON_TAIL(); return result; - case 11: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x60); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; - default: return false; - } -#undef RAPIDJSON_COPY -#undef RAPIDJSON_TRANS -#undef RAPIDJSON_TAIL - } - - static unsigned char GetRange(unsigned char c) { - // Referring to DFA of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ - // With new mapping 1 -> 0x10, 7 -> 0x20, 9 -> 0x40, such that AND operation can test multiple types. - static const unsigned char type[] = { - 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,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, - 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, - 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, - }; - return type[c]; - } - - template - static CharType TakeBOM(InputByteStream& is) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); - typename InputByteStream::Ch c = Take(is); - if (static_cast(c) != 0xEFu) return c; - c = is.Take(); - if (static_cast(c) != 0xBBu) return c; - c = is.Take(); - if (static_cast(c) != 0xBFu) return c; - c = is.Take(); - return c; - } - - template - static Ch Take(InputByteStream& is) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); - return static_cast(is.Take()); - } - - template - static void PutBOM(OutputByteStream& os) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); - os.Put(static_cast(0xEFu)); - os.Put(static_cast(0xBBu)); - os.Put(static_cast(0xBFu)); - } - - template - static void Put(OutputByteStream& os, Ch c) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); - os.Put(static_cast(c)); - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// UTF16 - -//! UTF-16 encoding. -/*! http://en.wikipedia.org/wiki/UTF-16 - http://tools.ietf.org/html/rfc2781 - \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead. - \note implements Encoding concept - - \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. - For streaming, use UTF16LE and UTF16BE, which handle endianness. -*/ -template -struct UTF16 { - typedef CharType Ch; - RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 2); - - enum { supportUnicode = 1 }; - - template - static void Encode(OutputStream& os, unsigned codepoint) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); - if (codepoint <= 0xFFFF) { - RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair - os.Put(static_cast(codepoint)); - } - else { - RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); - unsigned v = codepoint - 0x10000; - os.Put(static_cast((v >> 10) | 0xD800)); - os.Put(static_cast((v & 0x3FF) | 0xDC00)); - } - } - - - template - static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); - if (codepoint <= 0xFFFF) { - RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair - PutUnsafe(os, static_cast(codepoint)); - } - else { - RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); - unsigned v = codepoint - 0x10000; - PutUnsafe(os, static_cast((v >> 10) | 0xD800)); - PutUnsafe(os, static_cast((v & 0x3FF) | 0xDC00)); - } - } - - template - static bool Decode(InputStream& is, unsigned* codepoint) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); - typename InputStream::Ch c = is.Take(); - if (c < 0xD800 || c > 0xDFFF) { - *codepoint = static_cast(c); - return true; - } - else if (c <= 0xDBFF) { - *codepoint = (static_cast(c) & 0x3FF) << 10; - c = is.Take(); - *codepoint |= (static_cast(c) & 0x3FF); - *codepoint += 0x10000; - return c >= 0xDC00 && c <= 0xDFFF; - } - return false; - } - - template - static bool Validate(InputStream& is, OutputStream& os) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); - typename InputStream::Ch c; - os.Put(static_cast(c = is.Take())); - if (c < 0xD800 || c > 0xDFFF) - return true; - else if (c <= 0xDBFF) { - os.Put(c = is.Take()); - return c >= 0xDC00 && c <= 0xDFFF; - } - return false; - } -}; - -//! UTF-16 little endian encoding. -template -struct UTF16LE : UTF16 { - template - static CharType TakeBOM(InputByteStream& is) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); - CharType c = Take(is); - return static_cast(c) == 0xFEFFu ? Take(is) : c; - } - - template - static CharType Take(InputByteStream& is) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); - unsigned c = static_cast(is.Take()); - c |= static_cast(static_cast(is.Take())) << 8; - return static_cast(c); - } - - template - static void PutBOM(OutputByteStream& os) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); - os.Put(static_cast(0xFFu)); - os.Put(static_cast(0xFEu)); - } - - template - static void Put(OutputByteStream& os, CharType c) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); - os.Put(static_cast(static_cast(c) & 0xFFu)); - os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); - } -}; - -//! UTF-16 big endian encoding. -template -struct UTF16BE : UTF16 { - template - static CharType TakeBOM(InputByteStream& is) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); - CharType c = Take(is); - return static_cast(c) == 0xFEFFu ? Take(is) : c; - } - - template - static CharType Take(InputByteStream& is) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); - unsigned c = static_cast(static_cast(is.Take())) << 8; - c |= static_cast(static_cast(is.Take())); - return static_cast(c); - } - - template - static void PutBOM(OutputByteStream& os) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); - os.Put(static_cast(0xFEu)); - os.Put(static_cast(0xFFu)); - } - - template - static void Put(OutputByteStream& os, CharType c) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); - os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); - os.Put(static_cast(static_cast(c) & 0xFFu)); - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// UTF32 - -//! UTF-32 encoding. -/*! http://en.wikipedia.org/wiki/UTF-32 - \tparam CharType Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead. - \note implements Encoding concept - - \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. - For streaming, use UTF32LE and UTF32BE, which handle endianness. -*/ -template -struct UTF32 { - typedef CharType Ch; - RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 4); - - enum { supportUnicode = 1 }; - - template - static void Encode(OutputStream& os, unsigned codepoint) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); - RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); - os.Put(codepoint); - } - - template - static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); - RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); - PutUnsafe(os, codepoint); - } - - template - static bool Decode(InputStream& is, unsigned* codepoint) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); - Ch c = is.Take(); - *codepoint = c; - return c <= 0x10FFFF; - } - - template - static bool Validate(InputStream& is, OutputStream& os) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); - Ch c; - os.Put(c = is.Take()); - return c <= 0x10FFFF; - } -}; - -//! UTF-32 little endian encoding. -template -struct UTF32LE : UTF32 { - template - static CharType TakeBOM(InputByteStream& is) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); - CharType c = Take(is); - return static_cast(c) == 0x0000FEFFu ? Take(is) : c; - } - - template - static CharType Take(InputByteStream& is) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); - unsigned c = static_cast(is.Take()); - c |= static_cast(static_cast(is.Take())) << 8; - c |= static_cast(static_cast(is.Take())) << 16; - c |= static_cast(static_cast(is.Take())) << 24; - return static_cast(c); - } - - template - static void PutBOM(OutputByteStream& os) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); - os.Put(static_cast(0xFFu)); - os.Put(static_cast(0xFEu)); - os.Put(static_cast(0x00u)); - os.Put(static_cast(0x00u)); - } - - template - static void Put(OutputByteStream& os, CharType c) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); - os.Put(static_cast(c & 0xFFu)); - os.Put(static_cast((c >> 8) & 0xFFu)); - os.Put(static_cast((c >> 16) & 0xFFu)); - os.Put(static_cast((c >> 24) & 0xFFu)); - } -}; - -//! UTF-32 big endian encoding. -template -struct UTF32BE : UTF32 { - template - static CharType TakeBOM(InputByteStream& is) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); - CharType c = Take(is); - return static_cast(c) == 0x0000FEFFu ? Take(is) : c; - } - - template - static CharType Take(InputByteStream& is) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); - unsigned c = static_cast(static_cast(is.Take())) << 24; - c |= static_cast(static_cast(is.Take())) << 16; - c |= static_cast(static_cast(is.Take())) << 8; - c |= static_cast(static_cast(is.Take())); - return static_cast(c); - } - - template - static void PutBOM(OutputByteStream& os) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); - os.Put(static_cast(0x00u)); - os.Put(static_cast(0x00u)); - os.Put(static_cast(0xFEu)); - os.Put(static_cast(0xFFu)); - } - - template - static void Put(OutputByteStream& os, CharType c) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); - os.Put(static_cast((c >> 24) & 0xFFu)); - os.Put(static_cast((c >> 16) & 0xFFu)); - os.Put(static_cast((c >> 8) & 0xFFu)); - os.Put(static_cast(c & 0xFFu)); - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// ASCII - -//! ASCII encoding. -/*! http://en.wikipedia.org/wiki/ASCII - \tparam CharType Code unit for storing 7-bit ASCII data. Default is char. - \note implements Encoding concept -*/ -template -struct ASCII { - typedef CharType Ch; - - enum { supportUnicode = 0 }; - - template - static void Encode(OutputStream& os, unsigned codepoint) { - RAPIDJSON_ASSERT(codepoint <= 0x7F); - os.Put(static_cast(codepoint & 0xFF)); - } - - template - static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { - RAPIDJSON_ASSERT(codepoint <= 0x7F); - PutUnsafe(os, static_cast(codepoint & 0xFF)); - } - - template - static bool Decode(InputStream& is, unsigned* codepoint) { - uint8_t c = static_cast(is.Take()); - *codepoint = c; - return c <= 0X7F; - } - - template - static bool Validate(InputStream& is, OutputStream& os) { - uint8_t c = static_cast(is.Take()); - os.Put(static_cast(c)); - return c <= 0x7F; - } - - template - static CharType TakeBOM(InputByteStream& is) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); - uint8_t c = static_cast(Take(is)); - return static_cast(c); - } - - template - static Ch Take(InputByteStream& is) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); - return static_cast(is.Take()); - } - - template - static void PutBOM(OutputByteStream& os) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); - (void)os; - } - - template - static void Put(OutputByteStream& os, Ch c) { - RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); - os.Put(static_cast(c)); - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// AutoUTF - -//! Runtime-specified UTF encoding type of a stream. -enum UTFType { - kUTF8 = 0, //!< UTF-8. - kUTF16LE = 1, //!< UTF-16 little endian. - kUTF16BE = 2, //!< UTF-16 big endian. - kUTF32LE = 3, //!< UTF-32 little endian. - kUTF32BE = 4 //!< UTF-32 big endian. -}; - -//! Dynamically select encoding according to stream's runtime-specified UTF encoding type. -/*! \note This class can be used with AutoUTFInputStream and AutoUTFOutputStream, which provides GetType(). -*/ -template -struct AutoUTF { - typedef CharType Ch; - - enum { supportUnicode = 1 }; - -#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x - - template - static RAPIDJSON_FORCEINLINE void Encode(OutputStream& os, unsigned codepoint) { - typedef void (*EncodeFunc)(OutputStream&, unsigned); - static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Encode) }; - (*f[os.GetType()])(os, codepoint); - } - - template - static RAPIDJSON_FORCEINLINE void EncodeUnsafe(OutputStream& os, unsigned codepoint) { - typedef void (*EncodeFunc)(OutputStream&, unsigned); - static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(EncodeUnsafe) }; - (*f[os.GetType()])(os, codepoint); - } - - template - static RAPIDJSON_FORCEINLINE bool Decode(InputStream& is, unsigned* codepoint) { - typedef bool (*DecodeFunc)(InputStream&, unsigned*); - static const DecodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Decode) }; - return (*f[is.GetType()])(is, codepoint); - } - - template - static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { - typedef bool (*ValidateFunc)(InputStream&, OutputStream&); - static const ValidateFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Validate) }; - return (*f[is.GetType()])(is, os); - } - -#undef RAPIDJSON_ENCODINGS_FUNC -}; - -/////////////////////////////////////////////////////////////////////////////// -// Transcoder - -//! Encoding conversion. -template -struct Transcoder { - //! Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the output stream. - template - static RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { - unsigned codepoint; - if (!SourceEncoding::Decode(is, &codepoint)) - return false; - TargetEncoding::Encode(os, codepoint); - return true; - } - - template - static RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { - unsigned codepoint; - if (!SourceEncoding::Decode(is, &codepoint)) - return false; - TargetEncoding::EncodeUnsafe(os, codepoint); - return true; - } - - //! Validate one Unicode codepoint from an encoded stream. - template - static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { - return Transcode(is, os); // Since source/target encoding is different, must transcode. - } -}; - -// Forward declaration. -template -inline void PutUnsafe(Stream& stream, typename Stream::Ch c); - -//! Specialization of Transcoder with same source and target encoding. -template -struct Transcoder { - template - static RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { - os.Put(is.Take()); // Just copy one code unit. This semantic is different from primary template class. - return true; - } - - template - static RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { - PutUnsafe(os, is.Take()); // Just copy one code unit. This semantic is different from primary template class. - return true; - } - - template - static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { - return Encoding::Validate(is, os); // source/target encoding are the same - } -}; - -RAPIDJSON_NAMESPACE_END - -#if defined(__GNUC__) || (defined(_MSC_VER) && !defined(__clang__)) -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/error/en.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/error/en.h deleted file mode 100644 index c87b04e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/error/en.h +++ /dev/null @@ -1,176 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_ERROR_EN_H_ -#define RAPIDJSON_ERROR_EN_H_ - -#include "error.h" - -#ifdef __clang__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(switch-enum) -RAPIDJSON_DIAG_OFF(covered-switch-default) -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -//! Maps error code of parsing into error message. -/*! - \ingroup RAPIDJSON_ERRORS - \param parseErrorCode Error code obtained in parsing. - \return the error message. - \note User can make a copy of this function for localization. - Using switch-case is safer for future modification of error codes. -*/ -inline const RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) { - switch (parseErrorCode) { - case kParseErrorNone: return RAPIDJSON_ERROR_STRING("No error."); - - case kParseErrorDocumentEmpty: return RAPIDJSON_ERROR_STRING("The document is empty."); - case kParseErrorDocumentRootNotSingular: return RAPIDJSON_ERROR_STRING("The document root must not be followed by other values."); - - case kParseErrorValueInvalid: return RAPIDJSON_ERROR_STRING("Invalid value."); - - case kParseErrorObjectMissName: return RAPIDJSON_ERROR_STRING("Missing a name for object member."); - case kParseErrorObjectMissColon: return RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member."); - case kParseErrorObjectMissCommaOrCurlyBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member."); - - case kParseErrorArrayMissCommaOrSquareBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element."); - - case kParseErrorStringUnicodeEscapeInvalidHex: return RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string."); - case kParseErrorStringUnicodeSurrogateInvalid: return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid."); - case kParseErrorStringEscapeInvalid: return RAPIDJSON_ERROR_STRING("Invalid escape character in string."); - case kParseErrorStringMissQuotationMark: return RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string."); - case kParseErrorStringInvalidEncoding: return RAPIDJSON_ERROR_STRING("Invalid encoding in string."); - - case kParseErrorNumberTooBig: return RAPIDJSON_ERROR_STRING("Number too big to be stored in double."); - case kParseErrorNumberMissFraction: return RAPIDJSON_ERROR_STRING("Miss fraction part in number."); - case kParseErrorNumberMissExponent: return RAPIDJSON_ERROR_STRING("Miss exponent in number."); - - case kParseErrorTermination: return RAPIDJSON_ERROR_STRING("Terminate parsing due to Handler error."); - case kParseErrorUnspecificSyntaxError: return RAPIDJSON_ERROR_STRING("Unspecific syntax error."); - - default: return RAPIDJSON_ERROR_STRING("Unknown error."); - } -} - -//! Maps error code of validation into error message. -/*! - \ingroup RAPIDJSON_ERRORS - \param validateErrorCode Error code obtained from validator. - \return the error message. - \note User can make a copy of this function for localization. - Using switch-case is safer for future modification of error codes. -*/ -inline const RAPIDJSON_ERROR_CHARTYPE* GetValidateError_En(ValidateErrorCode validateErrorCode) { - switch (validateErrorCode) { - case kValidateErrors: return RAPIDJSON_ERROR_STRING("One or more validation errors have occurred"); - case kValidateErrorNone: return RAPIDJSON_ERROR_STRING("No error."); - - case kValidateErrorMultipleOf: return RAPIDJSON_ERROR_STRING("Number '%actual' is not a multiple of the 'multipleOf' value '%expected'."); - case kValidateErrorMaximum: return RAPIDJSON_ERROR_STRING("Number '%actual' is greater than the 'maximum' value '%expected'."); - case kValidateErrorExclusiveMaximum: return RAPIDJSON_ERROR_STRING("Number '%actual' is greater than or equal to the 'exclusiveMaximum' value '%expected'."); - case kValidateErrorMinimum: return RAPIDJSON_ERROR_STRING("Number '%actual' is less than the 'minimum' value '%expected'."); - case kValidateErrorExclusiveMinimum: return RAPIDJSON_ERROR_STRING("Number '%actual' is less than or equal to the 'exclusiveMinimum' value '%expected'."); - - case kValidateErrorMaxLength: return RAPIDJSON_ERROR_STRING("String '%actual' is longer than the 'maxLength' value '%expected'."); - case kValidateErrorMinLength: return RAPIDJSON_ERROR_STRING("String '%actual' is shorter than the 'minLength' value '%expected'."); - case kValidateErrorPattern: return RAPIDJSON_ERROR_STRING("String '%actual' does not match the 'pattern' regular expression."); - - case kValidateErrorMaxItems: return RAPIDJSON_ERROR_STRING("Array of length '%actual' is longer than the 'maxItems' value '%expected'."); - case kValidateErrorMinItems: return RAPIDJSON_ERROR_STRING("Array of length '%actual' is shorter than the 'minItems' value '%expected'."); - case kValidateErrorUniqueItems: return RAPIDJSON_ERROR_STRING("Array has duplicate items at indices '%duplicates' but 'uniqueItems' is true."); - case kValidateErrorAdditionalItems: return RAPIDJSON_ERROR_STRING("Array has an additional item at index '%disallowed' that is not allowed by the schema."); - - case kValidateErrorMaxProperties: return RAPIDJSON_ERROR_STRING("Object has '%actual' members which is more than 'maxProperties' value '%expected'."); - case kValidateErrorMinProperties: return RAPIDJSON_ERROR_STRING("Object has '%actual' members which is less than 'minProperties' value '%expected'."); - case kValidateErrorRequired: return RAPIDJSON_ERROR_STRING("Object is missing the following members required by the schema: '%missing'."); - case kValidateErrorAdditionalProperties: return RAPIDJSON_ERROR_STRING("Object has an additional member '%disallowed' that is not allowed by the schema."); - case kValidateErrorPatternProperties: return RAPIDJSON_ERROR_STRING("Object has 'patternProperties' that are not allowed by the schema."); - case kValidateErrorDependencies: return RAPIDJSON_ERROR_STRING("Object has missing property or schema dependencies, refer to following errors."); - - case kValidateErrorEnum: return RAPIDJSON_ERROR_STRING("Property has a value that is not one of its allowed enumerated values."); - case kValidateErrorType: return RAPIDJSON_ERROR_STRING("Property has a type '%actual' that is not in the following list: '%expected'."); - - case kValidateErrorOneOf: return RAPIDJSON_ERROR_STRING("Property did not match any of the sub-schemas specified by 'oneOf', refer to following errors."); - case kValidateErrorOneOfMatch: return RAPIDJSON_ERROR_STRING("Property matched more than one of the sub-schemas specified by 'oneOf', indices '%matches'."); - case kValidateErrorAllOf: return RAPIDJSON_ERROR_STRING("Property did not match all of the sub-schemas specified by 'allOf', refer to following errors."); - case kValidateErrorAnyOf: return RAPIDJSON_ERROR_STRING("Property did not match any of the sub-schemas specified by 'anyOf', refer to following errors."); - case kValidateErrorNot: return RAPIDJSON_ERROR_STRING("Property matched the sub-schema specified by 'not'."); - - case kValidateErrorReadOnly: return RAPIDJSON_ERROR_STRING("Property is read-only but has been provided when validation is for writing."); - case kValidateErrorWriteOnly: return RAPIDJSON_ERROR_STRING("Property is write-only but has been provided when validation is for reading."); - - default: return RAPIDJSON_ERROR_STRING("Unknown error."); - } -} - -//! Maps error code of schema document compilation into error message. -/*! - \ingroup RAPIDJSON_ERRORS - \param schemaErrorCode Error code obtained from compiling the schema document. - \return the error message. - \note User can make a copy of this function for localization. - Using switch-case is safer for future modification of error codes. -*/ - inline const RAPIDJSON_ERROR_CHARTYPE* GetSchemaError_En(SchemaErrorCode schemaErrorCode) { - switch (schemaErrorCode) { - case kSchemaErrorNone: return RAPIDJSON_ERROR_STRING("No error."); - - case kSchemaErrorStartUnknown: return RAPIDJSON_ERROR_STRING("Pointer '%value' to start of schema does not resolve to a location in the document."); - case kSchemaErrorRefPlainName: return RAPIDJSON_ERROR_STRING("$ref fragment '%value' must be a JSON pointer."); - case kSchemaErrorRefInvalid: return RAPIDJSON_ERROR_STRING("$ref must not be an empty string."); - case kSchemaErrorRefPointerInvalid: return RAPIDJSON_ERROR_STRING("$ref fragment '%value' is not a valid JSON pointer at offset '%offset'."); - case kSchemaErrorRefUnknown: return RAPIDJSON_ERROR_STRING("$ref '%value' does not resolve to a location in the target document."); - case kSchemaErrorRefCyclical: return RAPIDJSON_ERROR_STRING("$ref '%value' is cyclical."); - case kSchemaErrorRefNoRemoteProvider: return RAPIDJSON_ERROR_STRING("$ref is remote but there is no remote provider."); - case kSchemaErrorRefNoRemoteSchema: return RAPIDJSON_ERROR_STRING("$ref '%value' is remote but the remote provider did not return a schema."); - case kSchemaErrorRegexInvalid: return RAPIDJSON_ERROR_STRING("Invalid regular expression '%value' in 'pattern' or 'patternProperties'."); - case kSchemaErrorSpecUnknown: return RAPIDJSON_ERROR_STRING("JSON schema draft or OpenAPI version is not recognized."); - case kSchemaErrorSpecUnsupported: return RAPIDJSON_ERROR_STRING("JSON schema draft or OpenAPI version is not supported."); - case kSchemaErrorSpecIllegal: return RAPIDJSON_ERROR_STRING("Both JSON schema draft and OpenAPI version found in document."); - case kSchemaErrorReadOnlyAndWriteOnly: return RAPIDJSON_ERROR_STRING("Property must not be both 'readOnly' and 'writeOnly'."); - - default: return RAPIDJSON_ERROR_STRING("Unknown error."); - } - } - -//! Maps error code of pointer parse into error message. -/*! - \ingroup RAPIDJSON_ERRORS - \param pointerParseErrorCode Error code obtained from pointer parse. - \return the error message. - \note User can make a copy of this function for localization. - Using switch-case is safer for future modification of error codes. -*/ -inline const RAPIDJSON_ERROR_CHARTYPE* GetPointerParseError_En(PointerParseErrorCode pointerParseErrorCode) { - switch (pointerParseErrorCode) { - case kPointerParseErrorNone: return RAPIDJSON_ERROR_STRING("No error."); - - case kPointerParseErrorTokenMustBeginWithSolidus: return RAPIDJSON_ERROR_STRING("A token must begin with a '/'."); - case kPointerParseErrorInvalidEscape: return RAPIDJSON_ERROR_STRING("Invalid escape."); - case kPointerParseErrorInvalidPercentEncoding: return RAPIDJSON_ERROR_STRING("Invalid percent encoding in URI fragment."); - case kPointerParseErrorCharacterMustPercentEncode: return RAPIDJSON_ERROR_STRING("A character must be percent encoded in a URI fragment."); - - default: return RAPIDJSON_ERROR_STRING("Unknown error."); - } -} - -RAPIDJSON_NAMESPACE_END - -#ifdef __clang__ -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_ERROR_EN_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/error/error.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/error/error.h deleted file mode 100644 index cae345d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/error/error.h +++ /dev/null @@ -1,285 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_ERROR_ERROR_H_ -#define RAPIDJSON_ERROR_ERROR_H_ - -#include "../rapidjson.h" - -#ifdef __clang__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(padded) -#endif - -/*! \file error.h */ - -/*! \defgroup RAPIDJSON_ERRORS RapidJSON error handling */ - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_ERROR_CHARTYPE - -//! Character type of error messages. -/*! \ingroup RAPIDJSON_ERRORS - The default character type is \c char. - On Windows, user can define this macro as \c TCHAR for supporting both - unicode/non-unicode settings. -*/ -#ifndef RAPIDJSON_ERROR_CHARTYPE -#define RAPIDJSON_ERROR_CHARTYPE char -#endif - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_ERROR_STRING - -//! Macro for converting string literal to \ref RAPIDJSON_ERROR_CHARTYPE[]. -/*! \ingroup RAPIDJSON_ERRORS - By default this conversion macro does nothing. - On Windows, user can define this macro as \c _T(x) for supporting both - unicode/non-unicode settings. -*/ -#ifndef RAPIDJSON_ERROR_STRING -#define RAPIDJSON_ERROR_STRING(x) x -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -/////////////////////////////////////////////////////////////////////////////// -// ParseErrorCode - -//! Error code of parsing. -/*! \ingroup RAPIDJSON_ERRORS - \see GenericReader::Parse, GenericReader::GetParseErrorCode -*/ -enum ParseErrorCode { - kParseErrorNone = 0, //!< No error. - - kParseErrorDocumentEmpty, //!< The document is empty. - kParseErrorDocumentRootNotSingular, //!< The document root must not follow by other values. - - kParseErrorValueInvalid, //!< Invalid value. - - kParseErrorObjectMissName, //!< Missing a name for object member. - kParseErrorObjectMissColon, //!< Missing a colon after a name of object member. - kParseErrorObjectMissCommaOrCurlyBracket, //!< Missing a comma or '}' after an object member. - - kParseErrorArrayMissCommaOrSquareBracket, //!< Missing a comma or ']' after an array element. - - kParseErrorStringUnicodeEscapeInvalidHex, //!< Incorrect hex digit after \\u escape in string. - kParseErrorStringUnicodeSurrogateInvalid, //!< The surrogate pair in string is invalid. - kParseErrorStringEscapeInvalid, //!< Invalid escape character in string. - kParseErrorStringMissQuotationMark, //!< Missing a closing quotation mark in string. - kParseErrorStringInvalidEncoding, //!< Invalid encoding in string. - - kParseErrorNumberTooBig, //!< Number too big to be stored in double. - kParseErrorNumberMissFraction, //!< Miss fraction part in number. - kParseErrorNumberMissExponent, //!< Miss exponent in number. - - kParseErrorTermination, //!< Parsing was terminated. - kParseErrorUnspecificSyntaxError //!< Unspecific syntax error. -}; - -//! Result of parsing (wraps ParseErrorCode) -/*! - \ingroup RAPIDJSON_ERRORS - \code - Document doc; - ParseResult ok = doc.Parse("[42]"); - if (!ok) { - fprintf(stderr, "JSON parse error: %s (%u)", - GetParseError_En(ok.Code()), ok.Offset()); - exit(EXIT_FAILURE); - } - \endcode - \see GenericReader::Parse, GenericDocument::Parse -*/ -struct ParseResult { - //!! Unspecified boolean type - typedef bool (ParseResult::*BooleanType)() const; -public: - //! Default constructor, no error. - ParseResult() : code_(kParseErrorNone), offset_(0) {} - //! Constructor to set an error. - ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {} - - //! Get the error code. - ParseErrorCode Code() const { return code_; } - //! Get the error offset, if \ref IsError(), 0 otherwise. - size_t Offset() const { return offset_; } - - //! Explicit conversion to \c bool, returns \c true, iff !\ref IsError(). - operator BooleanType() const { return !IsError() ? &ParseResult::IsError : NULL; } - //! Whether the result is an error. - bool IsError() const { return code_ != kParseErrorNone; } - - bool operator==(const ParseResult& that) const { return code_ == that.code_; } - bool operator==(ParseErrorCode code) const { return code_ == code; } - friend bool operator==(ParseErrorCode code, const ParseResult & err) { return code == err.code_; } - - bool operator!=(const ParseResult& that) const { return !(*this == that); } - bool operator!=(ParseErrorCode code) const { return !(*this == code); } - friend bool operator!=(ParseErrorCode code, const ParseResult & err) { return err != code; } - - //! Reset error code. - void Clear() { Set(kParseErrorNone); } - //! Update error code and offset. - void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; } - -private: - ParseErrorCode code_; - size_t offset_; -}; - -//! Function pointer type of GetParseError(). -/*! \ingroup RAPIDJSON_ERRORS - - This is the prototype for \c GetParseError_X(), where \c X is a locale. - User can dynamically change locale in runtime, e.g.: -\code - GetParseErrorFunc GetParseError = GetParseError_En; // or whatever - const RAPIDJSON_ERROR_CHARTYPE* s = GetParseError(document.GetParseErrorCode()); -\endcode -*/ -typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetParseErrorFunc)(ParseErrorCode); - -/////////////////////////////////////////////////////////////////////////////// -// ValidateErrorCode - -//! Error codes when validating. -/*! \ingroup RAPIDJSON_ERRORS - \see GenericSchemaValidator -*/ -enum ValidateErrorCode { - kValidateErrors = -1, //!< Top level error code when kValidateContinueOnErrorsFlag set. - kValidateErrorNone = 0, //!< No error. - - kValidateErrorMultipleOf, //!< Number is not a multiple of the 'multipleOf' value. - kValidateErrorMaximum, //!< Number is greater than the 'maximum' value. - kValidateErrorExclusiveMaximum, //!< Number is greater than or equal to the 'maximum' value. - kValidateErrorMinimum, //!< Number is less than the 'minimum' value. - kValidateErrorExclusiveMinimum, //!< Number is less than or equal to the 'minimum' value. - - kValidateErrorMaxLength, //!< String is longer than the 'maxLength' value. - kValidateErrorMinLength, //!< String is longer than the 'maxLength' value. - kValidateErrorPattern, //!< String does not match the 'pattern' regular expression. - - kValidateErrorMaxItems, //!< Array is longer than the 'maxItems' value. - kValidateErrorMinItems, //!< Array is shorter than the 'minItems' value. - kValidateErrorUniqueItems, //!< Array has duplicate items but 'uniqueItems' is true. - kValidateErrorAdditionalItems, //!< Array has additional items that are not allowed by the schema. - - kValidateErrorMaxProperties, //!< Object has more members than 'maxProperties' value. - kValidateErrorMinProperties, //!< Object has less members than 'minProperties' value. - kValidateErrorRequired, //!< Object is missing one or more members required by the schema. - kValidateErrorAdditionalProperties, //!< Object has additional members that are not allowed by the schema. - kValidateErrorPatternProperties, //!< See other errors. - kValidateErrorDependencies, //!< Object has missing property or schema dependencies. - - kValidateErrorEnum, //!< Property has a value that is not one of its allowed enumerated values. - kValidateErrorType, //!< Property has a type that is not allowed by the schema. - - kValidateErrorOneOf, //!< Property did not match any of the sub-schemas specified by 'oneOf'. - kValidateErrorOneOfMatch, //!< Property matched more than one of the sub-schemas specified by 'oneOf'. - kValidateErrorAllOf, //!< Property did not match all of the sub-schemas specified by 'allOf'. - kValidateErrorAnyOf, //!< Property did not match any of the sub-schemas specified by 'anyOf'. - kValidateErrorNot, //!< Property matched the sub-schema specified by 'not'. - - kValidateErrorReadOnly, //!< Property is read-only but has been provided when validation is for writing - kValidateErrorWriteOnly //!< Property is write-only but has been provided when validation is for reading -}; - -//! Function pointer type of GetValidateError(). -/*! \ingroup RAPIDJSON_ERRORS - - This is the prototype for \c GetValidateError_X(), where \c X is a locale. - User can dynamically change locale in runtime, e.g.: -\code - GetValidateErrorFunc GetValidateError = GetValidateError_En; // or whatever - const RAPIDJSON_ERROR_CHARTYPE* s = GetValidateError(validator.GetInvalidSchemaCode()); -\endcode -*/ -typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetValidateErrorFunc)(ValidateErrorCode); - -/////////////////////////////////////////////////////////////////////////////// -// SchemaErrorCode - -//! Error codes when validating. -/*! \ingroup RAPIDJSON_ERRORS - \see GenericSchemaValidator -*/ -enum SchemaErrorCode { - kSchemaErrorNone = 0, //!< No error. - - kSchemaErrorStartUnknown, //!< Pointer to start of schema does not resolve to a location in the document - kSchemaErrorRefPlainName, //!< $ref fragment must be a JSON pointer - kSchemaErrorRefInvalid, //!< $ref must not be an empty string - kSchemaErrorRefPointerInvalid, //!< $ref fragment is not a valid JSON pointer at offset - kSchemaErrorRefUnknown, //!< $ref does not resolve to a location in the target document - kSchemaErrorRefCyclical, //!< $ref is cyclical - kSchemaErrorRefNoRemoteProvider, //!< $ref is remote but there is no remote provider - kSchemaErrorRefNoRemoteSchema, //!< $ref is remote but the remote provider did not return a schema - kSchemaErrorRegexInvalid, //!< Invalid regular expression in 'pattern' or 'patternProperties' - kSchemaErrorSpecUnknown, //!< JSON schema draft or OpenAPI version is not recognized - kSchemaErrorSpecUnsupported, //!< JSON schema draft or OpenAPI version is not supported - kSchemaErrorSpecIllegal, //!< Both JSON schema draft and OpenAPI version found in document - kSchemaErrorReadOnlyAndWriteOnly //!< Property must not be both 'readOnly' and 'writeOnly' -}; - -//! Function pointer type of GetSchemaError(). -/*! \ingroup RAPIDJSON_ERRORS - - This is the prototype for \c GetSchemaError_X(), where \c X is a locale. - User can dynamically change locale in runtime, e.g.: -\code - GetSchemaErrorFunc GetSchemaError = GetSchemaError_En; // or whatever - const RAPIDJSON_ERROR_CHARTYPE* s = GetSchemaError(validator.GetInvalidSchemaCode()); -\endcode -*/ -typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetSchemaErrorFunc)(SchemaErrorCode); - -/////////////////////////////////////////////////////////////////////////////// -// PointerParseErrorCode - -//! Error code of JSON pointer parsing. -/*! \ingroup RAPIDJSON_ERRORS - \see GenericPointer::GenericPointer, GenericPointer::GetParseErrorCode -*/ -enum PointerParseErrorCode { - kPointerParseErrorNone = 0, //!< The parse is successful - - kPointerParseErrorTokenMustBeginWithSolidus, //!< A token must begin with a '/' - kPointerParseErrorInvalidEscape, //!< Invalid escape - kPointerParseErrorInvalidPercentEncoding, //!< Invalid percent encoding in URI fragment - kPointerParseErrorCharacterMustPercentEncode //!< A character must percent encoded in URI fragment -}; - -//! Function pointer type of GetPointerParseError(). -/*! \ingroup RAPIDJSON_ERRORS - - This is the prototype for \c GetPointerParseError_X(), where \c X is a locale. - User can dynamically change locale in runtime, e.g.: -\code - GetPointerParseErrorFunc GetPointerParseError = GetPointerParseError_En; // or whatever - const RAPIDJSON_ERROR_CHARTYPE* s = GetPointerParseError(pointer.GetParseErrorCode()); -\endcode -*/ -typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetPointerParseErrorFunc)(PointerParseErrorCode); - - -RAPIDJSON_NAMESPACE_END - -#ifdef __clang__ -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_ERROR_ERROR_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/filereadstream.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/filereadstream.h deleted file mode 100644 index 3daff09..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/filereadstream.h +++ /dev/null @@ -1,99 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_FILEREADSTREAM_H_ -#define RAPIDJSON_FILEREADSTREAM_H_ - -#include "stream.h" -#include - -#ifdef __clang__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(padded) -RAPIDJSON_DIAG_OFF(unreachable-code) -RAPIDJSON_DIAG_OFF(missing-noreturn) -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -//! File byte stream for input using fread(). -/*! - \note implements Stream concept -*/ -class FileReadStream { -public: - typedef char Ch; //!< Character type (byte). - - //! Constructor. - /*! - \param fp File pointer opened for read. - \param buffer user-supplied buffer. - \param bufferSize size of buffer in bytes. Must >=4 bytes. - */ - FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { - RAPIDJSON_ASSERT(fp_ != 0); - RAPIDJSON_ASSERT(bufferSize >= 4); - Read(); - } - - Ch Peek() const { return *current_; } - Ch Take() { Ch c = *current_; Read(); return c; } - size_t Tell() const { return count_ + static_cast(current_ - buffer_); } - - // Not implemented - void Put(Ch) { RAPIDJSON_ASSERT(false); } - void Flush() { RAPIDJSON_ASSERT(false); } - Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } - size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } - - // For encoding detection only. - const Ch* Peek4() const { - return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0; - } - -private: - void Read() { - if (current_ < bufferLast_) - ++current_; - else if (!eof_) { - count_ += readCount_; - readCount_ = std::fread(buffer_, 1, bufferSize_, fp_); - bufferLast_ = buffer_ + readCount_ - 1; - current_ = buffer_; - - if (readCount_ < bufferSize_) { - buffer_[readCount_] = '\0'; - ++bufferLast_; - eof_ = true; - } - } - } - - std::FILE* fp_; - Ch *buffer_; - size_t bufferSize_; - Ch *bufferLast_; - Ch *current_; - size_t readCount_; - size_t count_; //!< Number of characters read - bool eof_; -}; - -RAPIDJSON_NAMESPACE_END - -#ifdef __clang__ -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/filewritestream.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/filewritestream.h deleted file mode 100644 index 8a78ef7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/filewritestream.h +++ /dev/null @@ -1,104 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_FILEWRITESTREAM_H_ -#define RAPIDJSON_FILEWRITESTREAM_H_ - -#include "stream.h" -#include - -#ifdef __clang__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(unreachable-code) -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -//! Wrapper of C file stream for output using fwrite(). -/*! - \note implements Stream concept -*/ -class FileWriteStream { -public: - typedef char Ch; //!< Character type. Only support char. - - FileWriteStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) { - RAPIDJSON_ASSERT(fp_ != 0); - } - - void Put(char c) { - if (current_ >= bufferEnd_) - Flush(); - - *current_++ = c; - } - - void PutN(char c, size_t n) { - size_t avail = static_cast(bufferEnd_ - current_); - while (n > avail) { - std::memset(current_, c, avail); - current_ += avail; - Flush(); - n -= avail; - avail = static_cast(bufferEnd_ - current_); - } - - if (n > 0) { - std::memset(current_, c, n); - current_ += n; - } - } - - void Flush() { - if (current_ != buffer_) { - size_t result = std::fwrite(buffer_, 1, static_cast(current_ - buffer_), fp_); - if (result < static_cast(current_ - buffer_)) { - // failure deliberately ignored at this time - // added to avoid warn_unused_result build errors - } - current_ = buffer_; - } - } - - // Not implemented - char Peek() const { RAPIDJSON_ASSERT(false); return 0; } - char Take() { RAPIDJSON_ASSERT(false); return 0; } - size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } - char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } - size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } - -private: - // Prohibit copy constructor & assignment operator. - FileWriteStream(const FileWriteStream&); - FileWriteStream& operator=(const FileWriteStream&); - - std::FILE* fp_; - char *buffer_; - char *bufferEnd_; - char *current_; -}; - -//! Implement specialized version of PutN() with memset() for better performance. -template<> -inline void PutN(FileWriteStream& stream, char c, size_t n) { - stream.PutN(c, n); -} - -RAPIDJSON_NAMESPACE_END - -#ifdef __clang__ -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/fwd.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/fwd.h deleted file mode 100644 index 07358d8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/fwd.h +++ /dev/null @@ -1,151 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_FWD_H_ -#define RAPIDJSON_FWD_H_ - -#include "rapidjson.h" - -RAPIDJSON_NAMESPACE_BEGIN - -// encodings.h - -template struct UTF8; -template struct UTF16; -template struct UTF16BE; -template struct UTF16LE; -template struct UTF32; -template struct UTF32BE; -template struct UTF32LE; -template struct ASCII; -template struct AutoUTF; - -template -struct Transcoder; - -// allocators.h - -class CrtAllocator; - -template -class MemoryPoolAllocator; - -// stream.h - -template -struct GenericStringStream; - -typedef GenericStringStream > StringStream; - -template -struct GenericInsituStringStream; - -typedef GenericInsituStringStream > InsituStringStream; - -// stringbuffer.h - -template -class GenericStringBuffer; - -typedef GenericStringBuffer, CrtAllocator> StringBuffer; - -// filereadstream.h - -class FileReadStream; - -// filewritestream.h - -class FileWriteStream; - -// memorybuffer.h - -template -struct GenericMemoryBuffer; - -typedef GenericMemoryBuffer MemoryBuffer; - -// memorystream.h - -struct MemoryStream; - -// reader.h - -template -struct BaseReaderHandler; - -template -class GenericReader; - -typedef GenericReader, UTF8, CrtAllocator> Reader; - -// writer.h - -template -class Writer; - -// prettywriter.h - -template -class PrettyWriter; - -// document.h - -template -class GenericMember; - -template -class GenericMemberIterator; - -template -struct GenericStringRef; - -template -class GenericValue; - -typedef GenericValue, MemoryPoolAllocator > Value; - -template -class GenericDocument; - -typedef GenericDocument, MemoryPoolAllocator, CrtAllocator> Document; - -// pointer.h - -template -class GenericPointer; - -typedef GenericPointer Pointer; - -// schema.h - -template -class IGenericRemoteSchemaDocumentProvider; - -template -class GenericSchemaDocument; - -typedef GenericSchemaDocument SchemaDocument; -typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; - -template < - typename SchemaDocumentType, - typename OutputHandler, - typename StateAllocator> -class GenericSchemaValidator; - -typedef GenericSchemaValidator, void>, CrtAllocator> SchemaValidator; - -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_RAPIDJSONFWD_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/biginteger.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/biginteger.h deleted file mode 100644 index 09d0387..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/biginteger.h +++ /dev/null @@ -1,297 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_BIGINTEGER_H_ -#define RAPIDJSON_BIGINTEGER_H_ - -#include "../rapidjson.h" - -#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_M_AMD64) -#include // for _umul128 -#if !defined(_ARM64EC_) -#pragma intrinsic(_umul128) -#else -#pragma comment(lib,"softintrin") -#endif -#endif - -RAPIDJSON_NAMESPACE_BEGIN -namespace internal { - -class BigInteger { -public: - typedef uint64_t Type; - - BigInteger(const BigInteger& rhs) : count_(rhs.count_) { - std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); - } - - explicit BigInteger(uint64_t u) : count_(1) { - digits_[0] = u; - } - - template - BigInteger(const Ch* decimals, size_t length) : count_(1) { - RAPIDJSON_ASSERT(length > 0); - digits_[0] = 0; - size_t i = 0; - const size_t kMaxDigitPerIteration = 19; // 2^64 = 18446744073709551616 > 10^19 - while (length >= kMaxDigitPerIteration) { - AppendDecimal64(decimals + i, decimals + i + kMaxDigitPerIteration); - length -= kMaxDigitPerIteration; - i += kMaxDigitPerIteration; - } - - if (length > 0) - AppendDecimal64(decimals + i, decimals + i + length); - } - - BigInteger& operator=(const BigInteger &rhs) - { - if (this != &rhs) { - count_ = rhs.count_; - std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); - } - return *this; - } - - BigInteger& operator=(uint64_t u) { - digits_[0] = u; - count_ = 1; - return *this; - } - - BigInteger& operator+=(uint64_t u) { - Type backup = digits_[0]; - digits_[0] += u; - for (size_t i = 0; i < count_ - 1; i++) { - if (digits_[i] >= backup) - return *this; // no carry - backup = digits_[i + 1]; - digits_[i + 1] += 1; - } - - // Last carry - if (digits_[count_ - 1] < backup) - PushBack(1); - - return *this; - } - - BigInteger& operator*=(uint64_t u) { - if (u == 0) return *this = 0; - if (u == 1) return *this; - if (*this == 1) return *this = u; - - uint64_t k = 0; - for (size_t i = 0; i < count_; i++) { - uint64_t hi; - digits_[i] = MulAdd64(digits_[i], u, k, &hi); - k = hi; - } - - if (k > 0) - PushBack(k); - - return *this; - } - - BigInteger& operator*=(uint32_t u) { - if (u == 0) return *this = 0; - if (u == 1) return *this; - if (*this == 1) return *this = u; - - uint64_t k = 0; - for (size_t i = 0; i < count_; i++) { - const uint64_t c = digits_[i] >> 32; - const uint64_t d = digits_[i] & 0xFFFFFFFF; - const uint64_t uc = u * c; - const uint64_t ud = u * d; - const uint64_t p0 = ud + k; - const uint64_t p1 = uc + (p0 >> 32); - digits_[i] = (p0 & 0xFFFFFFFF) | (p1 << 32); - k = p1 >> 32; - } - - if (k > 0) - PushBack(k); - - return *this; - } - - BigInteger& operator<<=(size_t shift) { - if (IsZero() || shift == 0) return *this; - - size_t offset = shift / kTypeBit; - size_t interShift = shift % kTypeBit; - RAPIDJSON_ASSERT(count_ + offset <= kCapacity); - - if (interShift == 0) { - std::memmove(digits_ + offset, digits_, count_ * sizeof(Type)); - count_ += offset; - } - else { - digits_[count_] = 0; - for (size_t i = count_; i > 0; i--) - digits_[i + offset] = (digits_[i] << interShift) | (digits_[i - 1] >> (kTypeBit - interShift)); - digits_[offset] = digits_[0] << interShift; - count_ += offset; - if (digits_[count_]) - count_++; - } - - std::memset(digits_, 0, offset * sizeof(Type)); - - return *this; - } - - bool operator==(const BigInteger& rhs) const { - return count_ == rhs.count_ && std::memcmp(digits_, rhs.digits_, count_ * sizeof(Type)) == 0; - } - - bool operator==(const Type rhs) const { - return count_ == 1 && digits_[0] == rhs; - } - - BigInteger& MultiplyPow5(unsigned exp) { - static const uint32_t kPow5[12] = { - 5, - 5 * 5, - 5 * 5 * 5, - 5 * 5 * 5 * 5, - 5 * 5 * 5 * 5 * 5, - 5 * 5 * 5 * 5 * 5 * 5, - 5 * 5 * 5 * 5 * 5 * 5 * 5, - 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, - 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, - 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, - 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, - 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 - }; - if (exp == 0) return *this; - for (; exp >= 27; exp -= 27) *this *= RAPIDJSON_UINT64_C2(0X6765C793, 0XFA10079D); // 5^27 - for (; exp >= 13; exp -= 13) *this *= static_cast(1220703125u); // 5^13 - if (exp > 0) *this *= kPow5[exp - 1]; - return *this; - } - - // Compute absolute difference of this and rhs. - // Assume this != rhs - bool Difference(const BigInteger& rhs, BigInteger* out) const { - int cmp = Compare(rhs); - RAPIDJSON_ASSERT(cmp != 0); - const BigInteger *a, *b; // Makes a > b - bool ret; - if (cmp < 0) { a = &rhs; b = this; ret = true; } - else { a = this; b = &rhs; ret = false; } - - Type borrow = 0; - for (size_t i = 0; i < a->count_; i++) { - Type d = a->digits_[i] - borrow; - if (i < b->count_) - d -= b->digits_[i]; - borrow = (d > a->digits_[i]) ? 1 : 0; - out->digits_[i] = d; - if (d != 0) - out->count_ = i + 1; - } - - return ret; - } - - int Compare(const BigInteger& rhs) const { - if (count_ != rhs.count_) - return count_ < rhs.count_ ? -1 : 1; - - for (size_t i = count_; i-- > 0;) - if (digits_[i] != rhs.digits_[i]) - return digits_[i] < rhs.digits_[i] ? -1 : 1; - - return 0; - } - - size_t GetCount() const { return count_; } - Type GetDigit(size_t index) const { RAPIDJSON_ASSERT(index < count_); return digits_[index]; } - bool IsZero() const { return count_ == 1 && digits_[0] == 0; } - -private: - template - void AppendDecimal64(const Ch* begin, const Ch* end) { - uint64_t u = ParseUint64(begin, end); - if (IsZero()) - *this = u; - else { - unsigned exp = static_cast(end - begin); - (MultiplyPow5(exp) <<= exp) += u; // *this = *this * 10^exp + u - } - } - - void PushBack(Type digit) { - RAPIDJSON_ASSERT(count_ < kCapacity); - digits_[count_++] = digit; - } - - template - static uint64_t ParseUint64(const Ch* begin, const Ch* end) { - uint64_t r = 0; - for (const Ch* p = begin; p != end; ++p) { - RAPIDJSON_ASSERT(*p >= Ch('0') && *p <= Ch('9')); - r = r * 10u + static_cast(*p - Ch('0')); - } - return r; - } - - // Assume a * b + k < 2^128 - static uint64_t MulAdd64(uint64_t a, uint64_t b, uint64_t k, uint64_t* outHigh) { -#if defined(_MSC_VER) && defined(_M_AMD64) - uint64_t low = _umul128(a, b, outHigh) + k; - if (low < k) - (*outHigh)++; - return low; -#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) - __extension__ typedef unsigned __int128 uint128; - uint128 p = static_cast(a) * static_cast(b); - p += k; - *outHigh = static_cast(p >> 64); - return static_cast(p); -#else - const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32; - uint64_t x0 = a0 * b0, x1 = a0 * b1, x2 = a1 * b0, x3 = a1 * b1; - x1 += (x0 >> 32); // can't give carry - x1 += x2; - if (x1 < x2) - x3 += (static_cast(1) << 32); - uint64_t lo = (x1 << 32) + (x0 & 0xFFFFFFFF); - uint64_t hi = x3 + (x1 >> 32); - - lo += k; - if (lo < k) - hi++; - *outHigh = hi; - return lo; -#endif - } - - static const size_t kBitCount = 3328; // 64bit * 54 > 10^1000 - static const size_t kCapacity = kBitCount / sizeof(Type); - static const size_t kTypeBit = sizeof(Type) * 8; - - Type digits_[kCapacity]; - size_t count_; -}; - -} // namespace internal -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_BIGINTEGER_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/clzll.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/clzll.h deleted file mode 100644 index 8fc5118..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/clzll.h +++ /dev/null @@ -1,71 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_CLZLL_H_ -#define RAPIDJSON_CLZLL_H_ - -#include "../rapidjson.h" - -#if defined(_MSC_VER) && !defined(UNDER_CE) -#include -#if defined(_WIN64) -#pragma intrinsic(_BitScanReverse64) -#else -#pragma intrinsic(_BitScanReverse) -#endif -#endif - -RAPIDJSON_NAMESPACE_BEGIN -namespace internal { - -inline uint32_t clzll(uint64_t x) { - // Passing 0 to __builtin_clzll is UB in GCC and results in an - // infinite loop in the software implementation. - RAPIDJSON_ASSERT(x != 0); - -#if defined(_MSC_VER) && !defined(UNDER_CE) - unsigned long r = 0; -#if defined(_WIN64) - _BitScanReverse64(&r, x); -#else - // Scan the high 32 bits. - if (_BitScanReverse(&r, static_cast(x >> 32))) - return 63 - (r + 32); - - // Scan the low 32 bits. - _BitScanReverse(&r, static_cast(x & 0xFFFFFFFF)); -#endif // _WIN64 - - return 63 - r; -#elif (defined(__GNUC__) && __GNUC__ >= 4) || RAPIDJSON_HAS_BUILTIN(__builtin_clzll) - // __builtin_clzll wrapper - return static_cast(__builtin_clzll(x)); -#else - // naive version - uint32_t r = 0; - while (!(x & (static_cast(1) << 63))) { - x <<= 1; - ++r; - } - - return r; -#endif // _MSC_VER -} - -#define RAPIDJSON_CLZLL RAPIDJSON_NAMESPACE::internal::clzll - -} // namespace internal -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_CLZLL_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/diyfp.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/diyfp.h deleted file mode 100644 index 1f60fb6..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/diyfp.h +++ /dev/null @@ -1,261 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -// This is a C++ header-only implementation of Grisu2 algorithm from the publication: -// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with -// integers." ACM Sigplan Notices 45.6 (2010): 233-243. - -#ifndef RAPIDJSON_DIYFP_H_ -#define RAPIDJSON_DIYFP_H_ - -#include "../rapidjson.h" -#include "clzll.h" -#include - -#if defined(_MSC_VER) && defined(_M_AMD64) && !defined(__INTEL_COMPILER) -#include -#if !defined(_ARM64EC_) -#pragma intrinsic(_umul128) -#else -#pragma comment(lib,"softintrin") -#endif -#endif - -RAPIDJSON_NAMESPACE_BEGIN -namespace internal { - -#ifdef __GNUC__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(effc++) -#endif - -#ifdef __clang__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(padded) -#endif - -struct DiyFp { - DiyFp() : f(), e() {} - - DiyFp(uint64_t fp, int exp) : f(fp), e(exp) {} - - explicit DiyFp(double d) { - union { - double d; - uint64_t u64; - } u = { d }; - - int biased_e = static_cast((u.u64 & kDpExponentMask) >> kDpSignificandSize); - uint64_t significand = (u.u64 & kDpSignificandMask); - if (biased_e != 0) { - f = significand + kDpHiddenBit; - e = biased_e - kDpExponentBias; - } - else { - f = significand; - e = kDpMinExponent + 1; - } - } - - DiyFp operator-(const DiyFp& rhs) const { - return DiyFp(f - rhs.f, e); - } - - DiyFp operator*(const DiyFp& rhs) const { -#if defined(_MSC_VER) && defined(_M_AMD64) - uint64_t h; - uint64_t l = _umul128(f, rhs.f, &h); - if (l & (uint64_t(1) << 63)) // rounding - h++; - return DiyFp(h, e + rhs.e + 64); -#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) - __extension__ typedef unsigned __int128 uint128; - uint128 p = static_cast(f) * static_cast(rhs.f); - uint64_t h = static_cast(p >> 64); - uint64_t l = static_cast(p); - if (l & (uint64_t(1) << 63)) // rounding - h++; - return DiyFp(h, e + rhs.e + 64); -#else - const uint64_t M32 = 0xFFFFFFFF; - const uint64_t a = f >> 32; - const uint64_t b = f & M32; - const uint64_t c = rhs.f >> 32; - const uint64_t d = rhs.f & M32; - const uint64_t ac = a * c; - const uint64_t bc = b * c; - const uint64_t ad = a * d; - const uint64_t bd = b * d; - uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32); - tmp += 1U << 31; /// mult_round - return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs.e + 64); -#endif - } - - DiyFp Normalize() const { - int s = static_cast(clzll(f)); - return DiyFp(f << s, e - s); - } - - DiyFp NormalizeBoundary() const { - DiyFp res = *this; - while (!(res.f & (kDpHiddenBit << 1))) { - res.f <<= 1; - res.e--; - } - res.f <<= (kDiySignificandSize - kDpSignificandSize - 2); - res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2); - return res; - } - - void NormalizedBoundaries(DiyFp* minus, DiyFp* plus) const { - DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary(); - DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1); - mi.f <<= mi.e - pl.e; - mi.e = pl.e; - *plus = pl; - *minus = mi; - } - - double ToDouble() const { - union { - double d; - uint64_t u64; - }u; - RAPIDJSON_ASSERT(f <= kDpHiddenBit + kDpSignificandMask); - if (e < kDpDenormalExponent) { - // Underflow. - return 0.0; - } - if (e >= kDpMaxExponent) { - // Overflow. - return std::numeric_limits::infinity(); - } - const uint64_t be = (e == kDpDenormalExponent && (f & kDpHiddenBit) == 0) ? 0 : - static_cast(e + kDpExponentBias); - u.u64 = (f & kDpSignificandMask) | (be << kDpSignificandSize); - return u.d; - } - - static const int kDiySignificandSize = 64; - static const int kDpSignificandSize = 52; - static const int kDpExponentBias = 0x3FF + kDpSignificandSize; - static const int kDpMaxExponent = 0x7FF - kDpExponentBias; - static const int kDpMinExponent = -kDpExponentBias; - static const int kDpDenormalExponent = -kDpExponentBias + 1; - static const uint64_t kDpExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); - static const uint64_t kDpSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); - static const uint64_t kDpHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); - - uint64_t f; - int e; -}; - -inline DiyFp GetCachedPowerByIndex(size_t index) { - // 10^-348, 10^-340, ..., 10^340 - static const uint64_t kCachedPowers_F[] = { - RAPIDJSON_UINT64_C2(0xfa8fd5a0, 0x081c0288), RAPIDJSON_UINT64_C2(0xbaaee17f, 0xa23ebf76), - RAPIDJSON_UINT64_C2(0x8b16fb20, 0x3055ac76), RAPIDJSON_UINT64_C2(0xcf42894a, 0x5dce35ea), - RAPIDJSON_UINT64_C2(0x9a6bb0aa, 0x55653b2d), RAPIDJSON_UINT64_C2(0xe61acf03, 0x3d1a45df), - RAPIDJSON_UINT64_C2(0xab70fe17, 0xc79ac6ca), RAPIDJSON_UINT64_C2(0xff77b1fc, 0xbebcdc4f), - RAPIDJSON_UINT64_C2(0xbe5691ef, 0x416bd60c), RAPIDJSON_UINT64_C2(0x8dd01fad, 0x907ffc3c), - RAPIDJSON_UINT64_C2(0xd3515c28, 0x31559a83), RAPIDJSON_UINT64_C2(0x9d71ac8f, 0xada6c9b5), - RAPIDJSON_UINT64_C2(0xea9c2277, 0x23ee8bcb), RAPIDJSON_UINT64_C2(0xaecc4991, 0x4078536d), - RAPIDJSON_UINT64_C2(0x823c1279, 0x5db6ce57), RAPIDJSON_UINT64_C2(0xc2109436, 0x4dfb5637), - RAPIDJSON_UINT64_C2(0x9096ea6f, 0x3848984f), RAPIDJSON_UINT64_C2(0xd77485cb, 0x25823ac7), - RAPIDJSON_UINT64_C2(0xa086cfcd, 0x97bf97f4), RAPIDJSON_UINT64_C2(0xef340a98, 0x172aace5), - RAPIDJSON_UINT64_C2(0xb23867fb, 0x2a35b28e), RAPIDJSON_UINT64_C2(0x84c8d4df, 0xd2c63f3b), - RAPIDJSON_UINT64_C2(0xc5dd4427, 0x1ad3cdba), RAPIDJSON_UINT64_C2(0x936b9fce, 0xbb25c996), - RAPIDJSON_UINT64_C2(0xdbac6c24, 0x7d62a584), RAPIDJSON_UINT64_C2(0xa3ab6658, 0x0d5fdaf6), - RAPIDJSON_UINT64_C2(0xf3e2f893, 0xdec3f126), RAPIDJSON_UINT64_C2(0xb5b5ada8, 0xaaff80b8), - RAPIDJSON_UINT64_C2(0x87625f05, 0x6c7c4a8b), RAPIDJSON_UINT64_C2(0xc9bcff60, 0x34c13053), - RAPIDJSON_UINT64_C2(0x964e858c, 0x91ba2655), RAPIDJSON_UINT64_C2(0xdff97724, 0x70297ebd), - RAPIDJSON_UINT64_C2(0xa6dfbd9f, 0xb8e5b88f), RAPIDJSON_UINT64_C2(0xf8a95fcf, 0x88747d94), - RAPIDJSON_UINT64_C2(0xb9447093, 0x8fa89bcf), RAPIDJSON_UINT64_C2(0x8a08f0f8, 0xbf0f156b), - RAPIDJSON_UINT64_C2(0xcdb02555, 0x653131b6), RAPIDJSON_UINT64_C2(0x993fe2c6, 0xd07b7fac), - RAPIDJSON_UINT64_C2(0xe45c10c4, 0x2a2b3b06), RAPIDJSON_UINT64_C2(0xaa242499, 0x697392d3), - RAPIDJSON_UINT64_C2(0xfd87b5f2, 0x8300ca0e), RAPIDJSON_UINT64_C2(0xbce50864, 0x92111aeb), - RAPIDJSON_UINT64_C2(0x8cbccc09, 0x6f5088cc), RAPIDJSON_UINT64_C2(0xd1b71758, 0xe219652c), - RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), RAPIDJSON_UINT64_C2(0xe8d4a510, 0x00000000), - RAPIDJSON_UINT64_C2(0xad78ebc5, 0xac620000), RAPIDJSON_UINT64_C2(0x813f3978, 0xf8940984), - RAPIDJSON_UINT64_C2(0xc097ce7b, 0xc90715b3), RAPIDJSON_UINT64_C2(0x8f7e32ce, 0x7bea5c70), - RAPIDJSON_UINT64_C2(0xd5d238a4, 0xabe98068), RAPIDJSON_UINT64_C2(0x9f4f2726, 0x179a2245), - RAPIDJSON_UINT64_C2(0xed63a231, 0xd4c4fb27), RAPIDJSON_UINT64_C2(0xb0de6538, 0x8cc8ada8), - RAPIDJSON_UINT64_C2(0x83c7088e, 0x1aab65db), RAPIDJSON_UINT64_C2(0xc45d1df9, 0x42711d9a), - RAPIDJSON_UINT64_C2(0x924d692c, 0xa61be758), RAPIDJSON_UINT64_C2(0xda01ee64, 0x1a708dea), - RAPIDJSON_UINT64_C2(0xa26da399, 0x9aef774a), RAPIDJSON_UINT64_C2(0xf209787b, 0xb47d6b85), - RAPIDJSON_UINT64_C2(0xb454e4a1, 0x79dd1877), RAPIDJSON_UINT64_C2(0x865b8692, 0x5b9bc5c2), - RAPIDJSON_UINT64_C2(0xc83553c5, 0xc8965d3d), RAPIDJSON_UINT64_C2(0x952ab45c, 0xfa97a0b3), - RAPIDJSON_UINT64_C2(0xde469fbd, 0x99a05fe3), RAPIDJSON_UINT64_C2(0xa59bc234, 0xdb398c25), - RAPIDJSON_UINT64_C2(0xf6c69a72, 0xa3989f5c), RAPIDJSON_UINT64_C2(0xb7dcbf53, 0x54e9bece), - RAPIDJSON_UINT64_C2(0x88fcf317, 0xf22241e2), RAPIDJSON_UINT64_C2(0xcc20ce9b, 0xd35c78a5), - RAPIDJSON_UINT64_C2(0x98165af3, 0x7b2153df), RAPIDJSON_UINT64_C2(0xe2a0b5dc, 0x971f303a), - RAPIDJSON_UINT64_C2(0xa8d9d153, 0x5ce3b396), RAPIDJSON_UINT64_C2(0xfb9b7cd9, 0xa4a7443c), - RAPIDJSON_UINT64_C2(0xbb764c4c, 0xa7a44410), RAPIDJSON_UINT64_C2(0x8bab8eef, 0xb6409c1a), - RAPIDJSON_UINT64_C2(0xd01fef10, 0xa657842c), RAPIDJSON_UINT64_C2(0x9b10a4e5, 0xe9913129), - RAPIDJSON_UINT64_C2(0xe7109bfb, 0xa19c0c9d), RAPIDJSON_UINT64_C2(0xac2820d9, 0x623bf429), - RAPIDJSON_UINT64_C2(0x80444b5e, 0x7aa7cf85), RAPIDJSON_UINT64_C2(0xbf21e440, 0x03acdd2d), - RAPIDJSON_UINT64_C2(0x8e679c2f, 0x5e44ff8f), RAPIDJSON_UINT64_C2(0xd433179d, 0x9c8cb841), - RAPIDJSON_UINT64_C2(0x9e19db92, 0xb4e31ba9), RAPIDJSON_UINT64_C2(0xeb96bf6e, 0xbadf77d9), - RAPIDJSON_UINT64_C2(0xaf87023b, 0x9bf0ee6b) - }; - static const int16_t kCachedPowers_E[] = { - -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, - -954, -927, -901, -874, -847, -821, -794, -768, -741, -715, - -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, - -422, -396, -369, -343, -316, -289, -263, -236, -210, -183, - -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, - 109, 136, 162, 189, 216, 242, 269, 295, 322, 348, - 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, - 641, 667, 694, 720, 747, 774, 800, 827, 853, 880, - 907, 933, 960, 986, 1013, 1039, 1066 - }; - RAPIDJSON_ASSERT(index < 87); - return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]); -} - -inline DiyFp GetCachedPower(int e, int* K) { - - //int k = static_cast(ceil((-61 - e) * 0.30102999566398114)) + 374; - double dk = (-61 - e) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive - int k = static_cast(dk); - if (dk - k > 0.0) - k++; - - unsigned index = static_cast((k >> 3) + 1); - *K = -(-348 + static_cast(index << 3)); // decimal exponent no need lookup table - - return GetCachedPowerByIndex(index); -} - -inline DiyFp GetCachedPower10(int exp, int *outExp) { - RAPIDJSON_ASSERT(exp >= -348); - unsigned index = static_cast(exp + 348) / 8u; - *outExp = -348 + static_cast(index) * 8; - return GetCachedPowerByIndex(index); -} - -#ifdef __GNUC__ -RAPIDJSON_DIAG_POP -#endif - -#ifdef __clang__ -RAPIDJSON_DIAG_POP -RAPIDJSON_DIAG_OFF(padded) -#endif - -} // namespace internal -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_DIYFP_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/dtoa.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/dtoa.h deleted file mode 100644 index 91c5756..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/dtoa.h +++ /dev/null @@ -1,249 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -// This is a C++ header-only implementation of Grisu2 algorithm from the publication: -// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with -// integers." ACM Sigplan Notices 45.6 (2010): 233-243. - -#ifndef RAPIDJSON_DTOA_ -#define RAPIDJSON_DTOA_ - -#include "itoa.h" // GetDigitsLut() -#include "diyfp.h" -#include "ieee754.h" - -RAPIDJSON_NAMESPACE_BEGIN -namespace internal { - -#ifdef __GNUC__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(effc++) -RAPIDJSON_DIAG_OFF(array-bounds) // some gcc versions generate wrong warnings https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59124 -#endif - -inline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) { - while (rest < wp_w && delta - rest >= ten_kappa && - (rest + ten_kappa < wp_w || /// closer - wp_w - rest > rest + ten_kappa - wp_w)) { - buffer[len - 1]--; - rest += ten_kappa; - } -} - -inline int CountDecimalDigit32(uint32_t n) { - // Simple pure C++ implementation was faster than __builtin_clz version in this situation. - if (n < 10) return 1; - if (n < 100) return 2; - if (n < 1000) return 3; - if (n < 10000) return 4; - if (n < 100000) return 5; - if (n < 1000000) return 6; - if (n < 10000000) return 7; - if (n < 100000000) return 8; - // Will not reach 10 digits in DigitGen() - //if (n < 1000000000) return 9; - //return 10; - return 9; -} - -inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) { - static const uint64_t kPow10[] = { 1ULL, 10ULL, 100ULL, 1000ULL, 10000ULL, 100000ULL, 1000000ULL, 10000000ULL, 100000000ULL, - 1000000000ULL, 10000000000ULL, 100000000000ULL, 1000000000000ULL, - 10000000000000ULL, 100000000000000ULL, 1000000000000000ULL, - 10000000000000000ULL, 100000000000000000ULL, 1000000000000000000ULL, - 10000000000000000000ULL }; - const DiyFp one(uint64_t(1) << -Mp.e, Mp.e); - const DiyFp wp_w = Mp - W; - uint32_t p1 = static_cast(Mp.f >> -one.e); - uint64_t p2 = Mp.f & (one.f - 1); - int kappa = CountDecimalDigit32(p1); // kappa in [0, 9] - *len = 0; - - while (kappa > 0) { - uint32_t d = 0; - switch (kappa) { - case 9: d = p1 / 100000000; p1 %= 100000000; break; - case 8: d = p1 / 10000000; p1 %= 10000000; break; - case 7: d = p1 / 1000000; p1 %= 1000000; break; - case 6: d = p1 / 100000; p1 %= 100000; break; - case 5: d = p1 / 10000; p1 %= 10000; break; - case 4: d = p1 / 1000; p1 %= 1000; break; - case 3: d = p1 / 100; p1 %= 100; break; - case 2: d = p1 / 10; p1 %= 10; break; - case 1: d = p1; p1 = 0; break; - default:; - } - if (d || *len) - buffer[(*len)++] = static_cast('0' + static_cast(d)); - kappa--; - uint64_t tmp = (static_cast(p1) << -one.e) + p2; - if (tmp <= delta) { - *K += kappa; - GrisuRound(buffer, *len, delta, tmp, kPow10[kappa] << -one.e, wp_w.f); - return; - } - } - - // kappa = 0 - for (;;) { - p2 *= 10; - delta *= 10; - char d = static_cast(p2 >> -one.e); - if (d || *len) - buffer[(*len)++] = static_cast('0' + d); - p2 &= one.f - 1; - kappa--; - if (p2 < delta) { - *K += kappa; - int index = -kappa; - GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 20 ? kPow10[index] : 0)); - return; - } - } -} - -inline void Grisu2(double value, char* buffer, int* length, int* K) { - const DiyFp v(value); - DiyFp w_m, w_p; - v.NormalizedBoundaries(&w_m, &w_p); - - const DiyFp c_mk = GetCachedPower(w_p.e, K); - const DiyFp W = v.Normalize() * c_mk; - DiyFp Wp = w_p * c_mk; - DiyFp Wm = w_m * c_mk; - Wm.f++; - Wp.f--; - DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K); -} - -inline char* WriteExponent(int K, char* buffer) { - if (K < 0) { - *buffer++ = '-'; - K = -K; - } - - if (K >= 100) { - *buffer++ = static_cast('0' + static_cast(K / 100)); - K %= 100; - const char* d = GetDigitsLut() + K * 2; - *buffer++ = d[0]; - *buffer++ = d[1]; - } - else if (K >= 10) { - const char* d = GetDigitsLut() + K * 2; - *buffer++ = d[0]; - *buffer++ = d[1]; - } - else - *buffer++ = static_cast('0' + static_cast(K)); - - return buffer; -} - -inline char* Prettify(char* buffer, int length, int k, int maxDecimalPlaces) { - const int kk = length + k; // 10^(kk-1) <= v < 10^kk - - if (0 <= k && kk <= 21) { - // 1234e7 -> 12340000000 - for (int i = length; i < kk; i++) - buffer[i] = '0'; - buffer[kk] = '.'; - buffer[kk + 1] = '0'; - return &buffer[kk + 2]; - } - else if (0 < kk && kk <= 21) { - // 1234e-2 -> 12.34 - std::memmove(&buffer[kk + 1], &buffer[kk], static_cast(length - kk)); - buffer[kk] = '.'; - if (0 > k + maxDecimalPlaces) { - // When maxDecimalPlaces = 2, 1.2345 -> 1.23, 1.102 -> 1.1 - // Remove extra trailing zeros (at least one) after truncation. - for (int i = kk + maxDecimalPlaces; i > kk + 1; i--) - if (buffer[i] != '0') - return &buffer[i + 1]; - return &buffer[kk + 2]; // Reserve one zero - } - else - return &buffer[length + 1]; - } - else if (-6 < kk && kk <= 0) { - // 1234e-6 -> 0.001234 - const int offset = 2 - kk; - std::memmove(&buffer[offset], &buffer[0], static_cast(length)); - buffer[0] = '0'; - buffer[1] = '.'; - for (int i = 2; i < offset; i++) - buffer[i] = '0'; - if (length - kk > maxDecimalPlaces) { - // When maxDecimalPlaces = 2, 0.123 -> 0.12, 0.102 -> 0.1 - // Remove extra trailing zeros (at least one) after truncation. - for (int i = maxDecimalPlaces + 1; i > 2; i--) - if (buffer[i] != '0') - return &buffer[i + 1]; - return &buffer[3]; // Reserve one zero - } - else - return &buffer[length + offset]; - } - else if (kk < -maxDecimalPlaces) { - // Truncate to zero - buffer[0] = '0'; - buffer[1] = '.'; - buffer[2] = '0'; - return &buffer[3]; - } - else if (length == 1) { - // 1e30 - buffer[1] = 'e'; - return WriteExponent(kk - 1, &buffer[2]); - } - else { - // 1234e30 -> 1.234e33 - std::memmove(&buffer[2], &buffer[1], static_cast(length - 1)); - buffer[1] = '.'; - buffer[length + 1] = 'e'; - return WriteExponent(kk - 1, &buffer[0 + length + 2]); - } -} - -inline char* dtoa(double value, char* buffer, int maxDecimalPlaces = 324) { - RAPIDJSON_ASSERT(maxDecimalPlaces >= 1); - Double d(value); - if (d.IsZero()) { - if (d.Sign()) - *buffer++ = '-'; // -0.0, Issue #289 - buffer[0] = '0'; - buffer[1] = '.'; - buffer[2] = '0'; - return &buffer[3]; - } - else { - if (value < 0) { - *buffer++ = '-'; - value = -value; - } - int length, K; - Grisu2(value, buffer, &length, &K); - return Prettify(buffer, length, K, maxDecimalPlaces); - } -} - -#ifdef __GNUC__ -RAPIDJSON_DIAG_POP -#endif - -} // namespace internal -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_DTOA_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/ieee754.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/ieee754.h deleted file mode 100644 index f887d1b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/ieee754.h +++ /dev/null @@ -1,78 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_IEEE754_ -#define RAPIDJSON_IEEE754_ - -#include "../rapidjson.h" - -RAPIDJSON_NAMESPACE_BEGIN -namespace internal { - -class Double { -public: - Double() {} - Double(double d) : d_(d) {} - Double(uint64_t u) : u_(u) {} - - double Value() const { return d_; } - uint64_t Uint64Value() const { return u_; } - - double NextPositiveDouble() const { - RAPIDJSON_ASSERT(!Sign()); - return Double(u_ + 1).Value(); - } - - bool Sign() const { return (u_ & kSignMask) != 0; } - uint64_t Significand() const { return u_ & kSignificandMask; } - int Exponent() const { return static_cast(((u_ & kExponentMask) >> kSignificandSize) - kExponentBias); } - - bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; } - bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; } - bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; } - bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; } - bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; } - - uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); } - int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; } - uint64_t ToBias() const { return (u_ & kSignMask) ? ~u_ + 1 : u_ | kSignMask; } - - static int EffectiveSignificandSize(int order) { - if (order >= -1021) - return 53; - else if (order <= -1074) - return 0; - else - return order + 1074; - } - -private: - static const int kSignificandSize = 52; - static const int kExponentBias = 0x3FF; - static const int kDenormalExponent = 1 - kExponentBias; - static const uint64_t kSignMask = RAPIDJSON_UINT64_C2(0x80000000, 0x00000000); - static const uint64_t kExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); - static const uint64_t kSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); - static const uint64_t kHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); - - union { - double d_; - uint64_t u_; - }; -}; - -} // namespace internal -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_IEEE754_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/itoa.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/itoa.h deleted file mode 100644 index 9fe8c93..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/itoa.h +++ /dev/null @@ -1,308 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_ITOA_ -#define RAPIDJSON_ITOA_ - -#include "../rapidjson.h" - -RAPIDJSON_NAMESPACE_BEGIN -namespace internal { - -inline const char* GetDigitsLut() { - static const char cDigitsLut[200] = { - '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', - '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', - '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', - '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', - '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', - '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9', - '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9', - '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9', - '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9', - '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' - }; - return cDigitsLut; -} - -inline char* u32toa(uint32_t value, char* buffer) { - RAPIDJSON_ASSERT(buffer != 0); - - const char* cDigitsLut = GetDigitsLut(); - - if (value < 10000) { - const uint32_t d1 = (value / 100) << 1; - const uint32_t d2 = (value % 100) << 1; - - if (value >= 1000) - *buffer++ = cDigitsLut[d1]; - if (value >= 100) - *buffer++ = cDigitsLut[d1 + 1]; - if (value >= 10) - *buffer++ = cDigitsLut[d2]; - *buffer++ = cDigitsLut[d2 + 1]; - } - else if (value < 100000000) { - // value = bbbbcccc - const uint32_t b = value / 10000; - const uint32_t c = value % 10000; - - const uint32_t d1 = (b / 100) << 1; - const uint32_t d2 = (b % 100) << 1; - - const uint32_t d3 = (c / 100) << 1; - const uint32_t d4 = (c % 100) << 1; - - if (value >= 10000000) - *buffer++ = cDigitsLut[d1]; - if (value >= 1000000) - *buffer++ = cDigitsLut[d1 + 1]; - if (value >= 100000) - *buffer++ = cDigitsLut[d2]; - *buffer++ = cDigitsLut[d2 + 1]; - - *buffer++ = cDigitsLut[d3]; - *buffer++ = cDigitsLut[d3 + 1]; - *buffer++ = cDigitsLut[d4]; - *buffer++ = cDigitsLut[d4 + 1]; - } - else { - // value = aabbbbcccc in decimal - - const uint32_t a = value / 100000000; // 1 to 42 - value %= 100000000; - - if (a >= 10) { - const unsigned i = a << 1; - *buffer++ = cDigitsLut[i]; - *buffer++ = cDigitsLut[i + 1]; - } - else - *buffer++ = static_cast('0' + static_cast(a)); - - const uint32_t b = value / 10000; // 0 to 9999 - const uint32_t c = value % 10000; // 0 to 9999 - - const uint32_t d1 = (b / 100) << 1; - const uint32_t d2 = (b % 100) << 1; - - const uint32_t d3 = (c / 100) << 1; - const uint32_t d4 = (c % 100) << 1; - - *buffer++ = cDigitsLut[d1]; - *buffer++ = cDigitsLut[d1 + 1]; - *buffer++ = cDigitsLut[d2]; - *buffer++ = cDigitsLut[d2 + 1]; - *buffer++ = cDigitsLut[d3]; - *buffer++ = cDigitsLut[d3 + 1]; - *buffer++ = cDigitsLut[d4]; - *buffer++ = cDigitsLut[d4 + 1]; - } - return buffer; -} - -inline char* i32toa(int32_t value, char* buffer) { - RAPIDJSON_ASSERT(buffer != 0); - uint32_t u = static_cast(value); - if (value < 0) { - *buffer++ = '-'; - u = ~u + 1; - } - - return u32toa(u, buffer); -} - -inline char* u64toa(uint64_t value, char* buffer) { - RAPIDJSON_ASSERT(buffer != 0); - const char* cDigitsLut = GetDigitsLut(); - const uint64_t kTen8 = 100000000; - const uint64_t kTen9 = kTen8 * 10; - const uint64_t kTen10 = kTen8 * 100; - const uint64_t kTen11 = kTen8 * 1000; - const uint64_t kTen12 = kTen8 * 10000; - const uint64_t kTen13 = kTen8 * 100000; - const uint64_t kTen14 = kTen8 * 1000000; - const uint64_t kTen15 = kTen8 * 10000000; - const uint64_t kTen16 = kTen8 * kTen8; - - if (value < kTen8) { - uint32_t v = static_cast(value); - if (v < 10000) { - const uint32_t d1 = (v / 100) << 1; - const uint32_t d2 = (v % 100) << 1; - - if (v >= 1000) - *buffer++ = cDigitsLut[d1]; - if (v >= 100) - *buffer++ = cDigitsLut[d1 + 1]; - if (v >= 10) - *buffer++ = cDigitsLut[d2]; - *buffer++ = cDigitsLut[d2 + 1]; - } - else { - // value = bbbbcccc - const uint32_t b = v / 10000; - const uint32_t c = v % 10000; - - const uint32_t d1 = (b / 100) << 1; - const uint32_t d2 = (b % 100) << 1; - - const uint32_t d3 = (c / 100) << 1; - const uint32_t d4 = (c % 100) << 1; - - if (value >= 10000000) - *buffer++ = cDigitsLut[d1]; - if (value >= 1000000) - *buffer++ = cDigitsLut[d1 + 1]; - if (value >= 100000) - *buffer++ = cDigitsLut[d2]; - *buffer++ = cDigitsLut[d2 + 1]; - - *buffer++ = cDigitsLut[d3]; - *buffer++ = cDigitsLut[d3 + 1]; - *buffer++ = cDigitsLut[d4]; - *buffer++ = cDigitsLut[d4 + 1]; - } - } - else if (value < kTen16) { - const uint32_t v0 = static_cast(value / kTen8); - const uint32_t v1 = static_cast(value % kTen8); - - const uint32_t b0 = v0 / 10000; - const uint32_t c0 = v0 % 10000; - - const uint32_t d1 = (b0 / 100) << 1; - const uint32_t d2 = (b0 % 100) << 1; - - const uint32_t d3 = (c0 / 100) << 1; - const uint32_t d4 = (c0 % 100) << 1; - - const uint32_t b1 = v1 / 10000; - const uint32_t c1 = v1 % 10000; - - const uint32_t d5 = (b1 / 100) << 1; - const uint32_t d6 = (b1 % 100) << 1; - - const uint32_t d7 = (c1 / 100) << 1; - const uint32_t d8 = (c1 % 100) << 1; - - if (value >= kTen15) - *buffer++ = cDigitsLut[d1]; - if (value >= kTen14) - *buffer++ = cDigitsLut[d1 + 1]; - if (value >= kTen13) - *buffer++ = cDigitsLut[d2]; - if (value >= kTen12) - *buffer++ = cDigitsLut[d2 + 1]; - if (value >= kTen11) - *buffer++ = cDigitsLut[d3]; - if (value >= kTen10) - *buffer++ = cDigitsLut[d3 + 1]; - if (value >= kTen9) - *buffer++ = cDigitsLut[d4]; - - *buffer++ = cDigitsLut[d4 + 1]; - *buffer++ = cDigitsLut[d5]; - *buffer++ = cDigitsLut[d5 + 1]; - *buffer++ = cDigitsLut[d6]; - *buffer++ = cDigitsLut[d6 + 1]; - *buffer++ = cDigitsLut[d7]; - *buffer++ = cDigitsLut[d7 + 1]; - *buffer++ = cDigitsLut[d8]; - *buffer++ = cDigitsLut[d8 + 1]; - } - else { - const uint32_t a = static_cast(value / kTen16); // 1 to 1844 - value %= kTen16; - - if (a < 10) - *buffer++ = static_cast('0' + static_cast(a)); - else if (a < 100) { - const uint32_t i = a << 1; - *buffer++ = cDigitsLut[i]; - *buffer++ = cDigitsLut[i + 1]; - } - else if (a < 1000) { - *buffer++ = static_cast('0' + static_cast(a / 100)); - - const uint32_t i = (a % 100) << 1; - *buffer++ = cDigitsLut[i]; - *buffer++ = cDigitsLut[i + 1]; - } - else { - const uint32_t i = (a / 100) << 1; - const uint32_t j = (a % 100) << 1; - *buffer++ = cDigitsLut[i]; - *buffer++ = cDigitsLut[i + 1]; - *buffer++ = cDigitsLut[j]; - *buffer++ = cDigitsLut[j + 1]; - } - - const uint32_t v0 = static_cast(value / kTen8); - const uint32_t v1 = static_cast(value % kTen8); - - const uint32_t b0 = v0 / 10000; - const uint32_t c0 = v0 % 10000; - - const uint32_t d1 = (b0 / 100) << 1; - const uint32_t d2 = (b0 % 100) << 1; - - const uint32_t d3 = (c0 / 100) << 1; - const uint32_t d4 = (c0 % 100) << 1; - - const uint32_t b1 = v1 / 10000; - const uint32_t c1 = v1 % 10000; - - const uint32_t d5 = (b1 / 100) << 1; - const uint32_t d6 = (b1 % 100) << 1; - - const uint32_t d7 = (c1 / 100) << 1; - const uint32_t d8 = (c1 % 100) << 1; - - *buffer++ = cDigitsLut[d1]; - *buffer++ = cDigitsLut[d1 + 1]; - *buffer++ = cDigitsLut[d2]; - *buffer++ = cDigitsLut[d2 + 1]; - *buffer++ = cDigitsLut[d3]; - *buffer++ = cDigitsLut[d3 + 1]; - *buffer++ = cDigitsLut[d4]; - *buffer++ = cDigitsLut[d4 + 1]; - *buffer++ = cDigitsLut[d5]; - *buffer++ = cDigitsLut[d5 + 1]; - *buffer++ = cDigitsLut[d6]; - *buffer++ = cDigitsLut[d6 + 1]; - *buffer++ = cDigitsLut[d7]; - *buffer++ = cDigitsLut[d7 + 1]; - *buffer++ = cDigitsLut[d8]; - *buffer++ = cDigitsLut[d8 + 1]; - } - - return buffer; -} - -inline char* i64toa(int64_t value, char* buffer) { - RAPIDJSON_ASSERT(buffer != 0); - uint64_t u = static_cast(value); - if (value < 0) { - *buffer++ = '-'; - u = ~u + 1; - } - - return u64toa(u, buffer); -} - -} // namespace internal -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_ITOA_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/meta.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/meta.h deleted file mode 100644 index 76a1d5b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/meta.h +++ /dev/null @@ -1,186 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_INTERNAL_META_H_ -#define RAPIDJSON_INTERNAL_META_H_ - -#include "../rapidjson.h" - -#ifdef __GNUC__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(effc++) -#endif - -#if defined(_MSC_VER) && !defined(__clang__) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(6334) -#endif - -#if RAPIDJSON_HAS_CXX11_TYPETRAITS -#include -#endif - -//@cond RAPIDJSON_INTERNAL -RAPIDJSON_NAMESPACE_BEGIN -namespace internal { - -// Helper to wrap/convert arbitrary types to void, useful for arbitrary type matching -template struct Void { typedef void Type; }; - -/////////////////////////////////////////////////////////////////////////////// -// BoolType, TrueType, FalseType -// -template struct BoolType { - static const bool Value = Cond; - typedef BoolType Type; -}; -typedef BoolType TrueType; -typedef BoolType FalseType; - - -/////////////////////////////////////////////////////////////////////////////// -// SelectIf, BoolExpr, NotExpr, AndExpr, OrExpr -// - -template struct SelectIfImpl { template struct Apply { typedef T1 Type; }; }; -template <> struct SelectIfImpl { template struct Apply { typedef T2 Type; }; }; -template struct SelectIfCond : SelectIfImpl::template Apply {}; -template struct SelectIf : SelectIfCond {}; - -template struct AndExprCond : FalseType {}; -template <> struct AndExprCond : TrueType {}; -template struct OrExprCond : TrueType {}; -template <> struct OrExprCond : FalseType {}; - -template struct BoolExpr : SelectIf::Type {}; -template struct NotExpr : SelectIf::Type {}; -template struct AndExpr : AndExprCond::Type {}; -template struct OrExpr : OrExprCond::Type {}; - - -/////////////////////////////////////////////////////////////////////////////// -// AddConst, MaybeAddConst, RemoveConst -template struct AddConst { typedef const T Type; }; -template struct MaybeAddConst : SelectIfCond {}; -template struct RemoveConst { typedef T Type; }; -template struct RemoveConst { typedef T Type; }; - - -/////////////////////////////////////////////////////////////////////////////// -// IsSame, IsConst, IsMoreConst, IsPointer -// -template struct IsSame : FalseType {}; -template struct IsSame : TrueType {}; - -template struct IsConst : FalseType {}; -template struct IsConst : TrueType {}; - -template -struct IsMoreConst - : AndExpr::Type, typename RemoveConst::Type>, - BoolType::Value >= IsConst::Value> >::Type {}; - -template struct IsPointer : FalseType {}; -template struct IsPointer : TrueType {}; - -/////////////////////////////////////////////////////////////////////////////// -// IsBaseOf -// -#if RAPIDJSON_HAS_CXX11_TYPETRAITS - -template struct IsBaseOf - : BoolType< ::std::is_base_of::value> {}; - -#else // simplified version adopted from Boost - -template struct IsBaseOfImpl { - RAPIDJSON_STATIC_ASSERT(sizeof(B) != 0); - RAPIDJSON_STATIC_ASSERT(sizeof(D) != 0); - - typedef char (&Yes)[1]; - typedef char (&No) [2]; - - template - static Yes Check(const D*, T); - static No Check(const B*, int); - - struct Host { - operator const B*() const; - operator const D*(); - }; - - enum { Value = (sizeof(Check(Host(), 0)) == sizeof(Yes)) }; -}; - -template struct IsBaseOf - : OrExpr, BoolExpr > >::Type {}; - -#endif // RAPIDJSON_HAS_CXX11_TYPETRAITS - - -////////////////////////////////////////////////////////////////////////// -// EnableIf / DisableIf -// -template struct EnableIfCond { typedef T Type; }; -template struct EnableIfCond { /* empty */ }; - -template struct DisableIfCond { typedef T Type; }; -template struct DisableIfCond { /* empty */ }; - -template -struct EnableIf : EnableIfCond {}; - -template -struct DisableIf : DisableIfCond {}; - -// SFINAE helpers -struct SfinaeTag {}; -template struct RemoveSfinaeTag; -template struct RemoveSfinaeTag { typedef T Type; }; - -#define RAPIDJSON_REMOVEFPTR_(type) \ - typename ::RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \ - < ::RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type - -#define RAPIDJSON_ENABLEIF(cond) \ - typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ - ::Type * = NULL - -#define RAPIDJSON_DISABLEIF(cond) \ - typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ - ::Type * = NULL - -#define RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \ - typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ - ::Type - -#define RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \ - typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ - ::Type - -} // namespace internal -RAPIDJSON_NAMESPACE_END -//@endcond - -#if defined(_MSC_VER) && !defined(__clang__) -RAPIDJSON_DIAG_POP -#endif - -#ifdef __GNUC__ -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_INTERNAL_META_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/pow10.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/pow10.h deleted file mode 100644 index 04ee1f6..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/pow10.h +++ /dev/null @@ -1,55 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_POW10_ -#define RAPIDJSON_POW10_ - -#include "../rapidjson.h" - -RAPIDJSON_NAMESPACE_BEGIN -namespace internal { - -//! Computes integer powers of 10 in double (10.0^n). -/*! This function uses lookup table for fast and accurate results. - \param n non-negative exponent. Must <= 308. - \return 10.0^n -*/ -inline double Pow10(int n) { - static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes - 1e+0, - 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, - 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, - 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, - 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, - 1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, - 1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120, - 1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140, - 1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160, - 1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180, - 1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200, - 1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220, - 1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240, - 1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260, - 1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280, - 1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300, - 1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308 - }; - RAPIDJSON_ASSERT(n >= 0 && n <= 308); - return e[n]; -} - -} // namespace internal -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_POW10_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/regex.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/regex.h deleted file mode 100644 index e371261..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/regex.h +++ /dev/null @@ -1,739 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_INTERNAL_REGEX_H_ -#define RAPIDJSON_INTERNAL_REGEX_H_ - -#include "../allocators.h" -#include "../stream.h" -#include "stack.h" - -#ifdef __clang__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(padded) -RAPIDJSON_DIAG_OFF(switch-enum) -#elif defined(_MSC_VER) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated -#endif - -#ifdef __GNUC__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(effc++) -#endif - -#ifndef RAPIDJSON_REGEX_VERBOSE -#define RAPIDJSON_REGEX_VERBOSE 0 -#endif - -RAPIDJSON_NAMESPACE_BEGIN -namespace internal { - -/////////////////////////////////////////////////////////////////////////////// -// DecodedStream - -template -class DecodedStream { -public: - DecodedStream(SourceStream& ss) : ss_(ss), codepoint_() { Decode(); } - unsigned Peek() { return codepoint_; } - unsigned Take() { - unsigned c = codepoint_; - if (c) // No further decoding when '\0' - Decode(); - return c; - } - -private: - void Decode() { - if (!Encoding::Decode(ss_, &codepoint_)) - codepoint_ = 0; - } - - SourceStream& ss_; - unsigned codepoint_; -}; - -/////////////////////////////////////////////////////////////////////////////// -// GenericRegex - -static const SizeType kRegexInvalidState = ~SizeType(0); //!< Represents an invalid index in GenericRegex::State::out, out1 -static const SizeType kRegexInvalidRange = ~SizeType(0); - -template -class GenericRegexSearch; - -//! Regular expression engine with subset of ECMAscript grammar. -/*! - Supported regular expression syntax: - - \c ab Concatenation - - \c a|b Alternation - - \c a? Zero or one - - \c a* Zero or more - - \c a+ One or more - - \c a{3} Exactly 3 times - - \c a{3,} At least 3 times - - \c a{3,5} 3 to 5 times - - \c (ab) Grouping - - \c ^a At the beginning - - \c a$ At the end - - \c . Any character - - \c [abc] Character classes - - \c [a-c] Character class range - - \c [a-z0-9_] Character class combination - - \c [^abc] Negated character classes - - \c [^a-c] Negated character class range - - \c [\b] Backspace (U+0008) - - \c \\| \\\\ ... Escape characters - - \c \\f Form feed (U+000C) - - \c \\n Line feed (U+000A) - - \c \\r Carriage return (U+000D) - - \c \\t Tab (U+0009) - - \c \\v Vertical tab (U+000B) - - \note This is a Thompson NFA engine, implemented with reference to - Cox, Russ. "Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby,...).", - https://swtch.com/~rsc/regexp/regexp1.html -*/ -template -class GenericRegex { -public: - typedef Encoding EncodingType; - typedef typename Encoding::Ch Ch; - template friend class GenericRegexSearch; - - GenericRegex(const Ch* source, Allocator* allocator = 0) : - ownAllocator_(allocator ? 0 : RAPIDJSON_NEW(Allocator)()), allocator_(allocator ? allocator : ownAllocator_), - states_(allocator_, 256), ranges_(allocator_, 256), root_(kRegexInvalidState), stateCount_(), rangeCount_(), - anchorBegin_(), anchorEnd_() - { - GenericStringStream ss(source); - DecodedStream, Encoding> ds(ss); - Parse(ds); - } - - ~GenericRegex() - { - RAPIDJSON_DELETE(ownAllocator_); - } - - bool IsValid() const { - return root_ != kRegexInvalidState; - } - -private: - enum Operator { - kZeroOrOne, - kZeroOrMore, - kOneOrMore, - kConcatenation, - kAlternation, - kLeftParenthesis - }; - - static const unsigned kAnyCharacterClass = 0xFFFFFFFF; //!< For '.' - static const unsigned kRangeCharacterClass = 0xFFFFFFFE; - static const unsigned kRangeNegationFlag = 0x80000000; - - struct Range { - unsigned start; // - unsigned end; - SizeType next; - }; - - struct State { - SizeType out; //!< Equals to kInvalid for matching state - SizeType out1; //!< Equals to non-kInvalid for split - SizeType rangeStart; - unsigned codepoint; - }; - - struct Frag { - Frag(SizeType s, SizeType o, SizeType m) : start(s), out(o), minIndex(m) {} - SizeType start; - SizeType out; //!< link-list of all output states - SizeType minIndex; - }; - - State& GetState(SizeType index) { - RAPIDJSON_ASSERT(index < stateCount_); - return states_.template Bottom()[index]; - } - - const State& GetState(SizeType index) const { - RAPIDJSON_ASSERT(index < stateCount_); - return states_.template Bottom()[index]; - } - - Range& GetRange(SizeType index) { - RAPIDJSON_ASSERT(index < rangeCount_); - return ranges_.template Bottom()[index]; - } - - const Range& GetRange(SizeType index) const { - RAPIDJSON_ASSERT(index < rangeCount_); - return ranges_.template Bottom()[index]; - } - - template - void Parse(DecodedStream& ds) { - Stack operandStack(allocator_, 256); // Frag - Stack operatorStack(allocator_, 256); // Operator - Stack atomCountStack(allocator_, 256); // unsigned (Atom per parenthesis) - - *atomCountStack.template Push() = 0; - - unsigned codepoint; - while (ds.Peek() != 0) { - switch (codepoint = ds.Take()) { - case '^': - anchorBegin_ = true; - break; - - case '$': - anchorEnd_ = true; - break; - - case '|': - while (!operatorStack.Empty() && *operatorStack.template Top() < kAlternation) - if (!Eval(operandStack, *operatorStack.template Pop(1))) - return; - *operatorStack.template Push() = kAlternation; - *atomCountStack.template Top() = 0; - break; - - case '(': - *operatorStack.template Push() = kLeftParenthesis; - *atomCountStack.template Push() = 0; - break; - - case ')': - while (!operatorStack.Empty() && *operatorStack.template Top() != kLeftParenthesis) - if (!Eval(operandStack, *operatorStack.template Pop(1))) - return; - if (operatorStack.Empty()) - return; - operatorStack.template Pop(1); - atomCountStack.template Pop(1); - ImplicitConcatenation(atomCountStack, operatorStack); - break; - - case '?': - if (!Eval(operandStack, kZeroOrOne)) - return; - break; - - case '*': - if (!Eval(operandStack, kZeroOrMore)) - return; - break; - - case '+': - if (!Eval(operandStack, kOneOrMore)) - return; - break; - - case '{': - { - unsigned n, m; - if (!ParseUnsigned(ds, &n)) - return; - - if (ds.Peek() == ',') { - ds.Take(); - if (ds.Peek() == '}') - m = kInfinityQuantifier; - else if (!ParseUnsigned(ds, &m) || m < n) - return; - } - else - m = n; - - if (!EvalQuantifier(operandStack, n, m) || ds.Peek() != '}') - return; - ds.Take(); - } - break; - - case '.': - PushOperand(operandStack, kAnyCharacterClass); - ImplicitConcatenation(atomCountStack, operatorStack); - break; - - case '[': - { - SizeType range; - if (!ParseRange(ds, &range)) - return; - SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, kRangeCharacterClass); - GetState(s).rangeStart = range; - *operandStack.template Push() = Frag(s, s, s); - } - ImplicitConcatenation(atomCountStack, operatorStack); - break; - - case '\\': // Escape character - if (!CharacterEscape(ds, &codepoint)) - return; // Unsupported escape character - // fall through to default - RAPIDJSON_DELIBERATE_FALLTHROUGH; - - default: // Pattern character - PushOperand(operandStack, codepoint); - ImplicitConcatenation(atomCountStack, operatorStack); - } - } - - while (!operatorStack.Empty()) - if (!Eval(operandStack, *operatorStack.template Pop(1))) - return; - - // Link the operand to matching state. - if (operandStack.GetSize() == sizeof(Frag)) { - Frag* e = operandStack.template Pop(1); - Patch(e->out, NewState(kRegexInvalidState, kRegexInvalidState, 0)); - root_ = e->start; - -#if RAPIDJSON_REGEX_VERBOSE - printf("root: %d\n", root_); - for (SizeType i = 0; i < stateCount_ ; i++) { - State& s = GetState(i); - printf("[%2d] out: %2d out1: %2d c: '%c'\n", i, s.out, s.out1, (char)s.codepoint); - } - printf("\n"); -#endif - } - } - - SizeType NewState(SizeType out, SizeType out1, unsigned codepoint) { - State* s = states_.template Push(); - s->out = out; - s->out1 = out1; - s->codepoint = codepoint; - s->rangeStart = kRegexInvalidRange; - return stateCount_++; - } - - void PushOperand(Stack& operandStack, unsigned codepoint) { - SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, codepoint); - *operandStack.template Push() = Frag(s, s, s); - } - - void ImplicitConcatenation(Stack& atomCountStack, Stack& operatorStack) { - if (*atomCountStack.template Top()) - *operatorStack.template Push() = kConcatenation; - (*atomCountStack.template Top())++; - } - - SizeType Append(SizeType l1, SizeType l2) { - SizeType old = l1; - while (GetState(l1).out != kRegexInvalidState) - l1 = GetState(l1).out; - GetState(l1).out = l2; - return old; - } - - void Patch(SizeType l, SizeType s) { - for (SizeType next; l != kRegexInvalidState; l = next) { - next = GetState(l).out; - GetState(l).out = s; - } - } - - bool Eval(Stack& operandStack, Operator op) { - switch (op) { - case kConcatenation: - RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag) * 2); - { - Frag e2 = *operandStack.template Pop(1); - Frag e1 = *operandStack.template Pop(1); - Patch(e1.out, e2.start); - *operandStack.template Push() = Frag(e1.start, e2.out, Min(e1.minIndex, e2.minIndex)); - } - return true; - - case kAlternation: - if (operandStack.GetSize() >= sizeof(Frag) * 2) { - Frag e2 = *operandStack.template Pop(1); - Frag e1 = *operandStack.template Pop(1); - SizeType s = NewState(e1.start, e2.start, 0); - *operandStack.template Push() = Frag(s, Append(e1.out, e2.out), Min(e1.minIndex, e2.minIndex)); - return true; - } - return false; - - case kZeroOrOne: - if (operandStack.GetSize() >= sizeof(Frag)) { - Frag e = *operandStack.template Pop(1); - SizeType s = NewState(kRegexInvalidState, e.start, 0); - *operandStack.template Push() = Frag(s, Append(e.out, s), e.minIndex); - return true; - } - return false; - - case kZeroOrMore: - if (operandStack.GetSize() >= sizeof(Frag)) { - Frag e = *operandStack.template Pop(1); - SizeType s = NewState(kRegexInvalidState, e.start, 0); - Patch(e.out, s); - *operandStack.template Push() = Frag(s, s, e.minIndex); - return true; - } - return false; - - case kOneOrMore: - if (operandStack.GetSize() >= sizeof(Frag)) { - Frag e = *operandStack.template Pop(1); - SizeType s = NewState(kRegexInvalidState, e.start, 0); - Patch(e.out, s); - *operandStack.template Push() = Frag(e.start, s, e.minIndex); - return true; - } - return false; - - default: - // syntax error (e.g. unclosed kLeftParenthesis) - return false; - } - } - - bool EvalQuantifier(Stack& operandStack, unsigned n, unsigned m) { - RAPIDJSON_ASSERT(n <= m); - RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag)); - - if (n == 0) { - if (m == 0) // a{0} not support - return false; - else if (m == kInfinityQuantifier) - Eval(operandStack, kZeroOrMore); // a{0,} -> a* - else { - Eval(operandStack, kZeroOrOne); // a{0,5} -> a? - for (unsigned i = 0; i < m - 1; i++) - CloneTopOperand(operandStack); // a{0,5} -> a? a? a? a? a? - for (unsigned i = 0; i < m - 1; i++) - Eval(operandStack, kConcatenation); // a{0,5} -> a?a?a?a?a? - } - return true; - } - - for (unsigned i = 0; i < n - 1; i++) // a{3} -> a a a - CloneTopOperand(operandStack); - - if (m == kInfinityQuantifier) - Eval(operandStack, kOneOrMore); // a{3,} -> a a a+ - else if (m > n) { - CloneTopOperand(operandStack); // a{3,5} -> a a a a - Eval(operandStack, kZeroOrOne); // a{3,5} -> a a a a? - for (unsigned i = n; i < m - 1; i++) - CloneTopOperand(operandStack); // a{3,5} -> a a a a? a? - for (unsigned i = n; i < m; i++) - Eval(operandStack, kConcatenation); // a{3,5} -> a a aa?a? - } - - for (unsigned i = 0; i < n - 1; i++) - Eval(operandStack, kConcatenation); // a{3} -> aaa, a{3,} -> aaa+, a{3.5} -> aaaa?a? - - return true; - } - - static SizeType Min(SizeType a, SizeType b) { return a < b ? a : b; } - - void CloneTopOperand(Stack& operandStack) { - const Frag src = *operandStack.template Top(); // Copy constructor to prevent invalidation - SizeType count = stateCount_ - src.minIndex; // Assumes top operand contains states in [src->minIndex, stateCount_) - State* s = states_.template Push(count); - memcpy(s, &GetState(src.minIndex), count * sizeof(State)); - for (SizeType j = 0; j < count; j++) { - if (s[j].out != kRegexInvalidState) - s[j].out += count; - if (s[j].out1 != kRegexInvalidState) - s[j].out1 += count; - } - *operandStack.template Push() = Frag(src.start + count, src.out + count, src.minIndex + count); - stateCount_ += count; - } - - template - bool ParseUnsigned(DecodedStream& ds, unsigned* u) { - unsigned r = 0; - if (ds.Peek() < '0' || ds.Peek() > '9') - return false; - while (ds.Peek() >= '0' && ds.Peek() <= '9') { - if (r >= 429496729 && ds.Peek() > '5') // 2^32 - 1 = 4294967295 - return false; // overflow - r = r * 10 + (ds.Take() - '0'); - } - *u = r; - return true; - } - - template - bool ParseRange(DecodedStream& ds, SizeType* range) { - bool isBegin = true; - bool negate = false; - int step = 0; - SizeType start = kRegexInvalidRange; - SizeType current = kRegexInvalidRange; - unsigned codepoint; - while ((codepoint = ds.Take()) != 0) { - if (isBegin) { - isBegin = false; - if (codepoint == '^') { - negate = true; - continue; - } - } - - switch (codepoint) { - case ']': - if (start == kRegexInvalidRange) - return false; // Error: nothing inside [] - if (step == 2) { // Add trailing '-' - SizeType r = NewRange('-'); - RAPIDJSON_ASSERT(current != kRegexInvalidRange); - GetRange(current).next = r; - } - if (negate) - GetRange(start).start |= kRangeNegationFlag; - *range = start; - return true; - - case '\\': - if (ds.Peek() == 'b') { - ds.Take(); - codepoint = 0x0008; // Escape backspace character - } - else if (!CharacterEscape(ds, &codepoint)) - return false; - // fall through to default - RAPIDJSON_DELIBERATE_FALLTHROUGH; - - default: - switch (step) { - case 1: - if (codepoint == '-') { - step++; - break; - } - // fall through to step 0 for other characters - RAPIDJSON_DELIBERATE_FALLTHROUGH; - - case 0: - { - SizeType r = NewRange(codepoint); - if (current != kRegexInvalidRange) - GetRange(current).next = r; - if (start == kRegexInvalidRange) - start = r; - current = r; - } - step = 1; - break; - - default: - RAPIDJSON_ASSERT(step == 2); - GetRange(current).end = codepoint; - step = 0; - } - } - } - return false; - } - - SizeType NewRange(unsigned codepoint) { - Range* r = ranges_.template Push(); - r->start = r->end = codepoint; - r->next = kRegexInvalidRange; - return rangeCount_++; - } - - template - bool CharacterEscape(DecodedStream& ds, unsigned* escapedCodepoint) { - unsigned codepoint; - switch (codepoint = ds.Take()) { - case '^': - case '$': - case '|': - case '(': - case ')': - case '?': - case '*': - case '+': - case '.': - case '[': - case ']': - case '{': - case '}': - case '\\': - *escapedCodepoint = codepoint; return true; - case 'f': *escapedCodepoint = 0x000C; return true; - case 'n': *escapedCodepoint = 0x000A; return true; - case 'r': *escapedCodepoint = 0x000D; return true; - case 't': *escapedCodepoint = 0x0009; return true; - case 'v': *escapedCodepoint = 0x000B; return true; - default: - return false; // Unsupported escape character - } - } - - Allocator* ownAllocator_; - Allocator* allocator_; - Stack states_; - Stack ranges_; - SizeType root_; - SizeType stateCount_; - SizeType rangeCount_; - - static const unsigned kInfinityQuantifier = ~0u; - - // For SearchWithAnchoring() - bool anchorBegin_; - bool anchorEnd_; -}; - -template -class GenericRegexSearch { -public: - typedef typename RegexType::EncodingType Encoding; - typedef typename Encoding::Ch Ch; - - GenericRegexSearch(const RegexType& regex, Allocator* allocator = 0) : - regex_(regex), allocator_(allocator), ownAllocator_(0), - state0_(allocator, 0), state1_(allocator, 0), stateSet_() - { - RAPIDJSON_ASSERT(regex_.IsValid()); - if (!allocator_) - ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); - stateSet_ = static_cast(allocator_->Malloc(GetStateSetSize())); - state0_.template Reserve(regex_.stateCount_); - state1_.template Reserve(regex_.stateCount_); - } - - ~GenericRegexSearch() { - Allocator::Free(stateSet_); - RAPIDJSON_DELETE(ownAllocator_); - } - - template - bool Match(InputStream& is) { - return SearchWithAnchoring(is, true, true); - } - - bool Match(const Ch* s) { - GenericStringStream is(s); - return Match(is); - } - - template - bool Search(InputStream& is) { - return SearchWithAnchoring(is, regex_.anchorBegin_, regex_.anchorEnd_); - } - - bool Search(const Ch* s) { - GenericStringStream is(s); - return Search(is); - } - -private: - typedef typename RegexType::State State; - typedef typename RegexType::Range Range; - - template - bool SearchWithAnchoring(InputStream& is, bool anchorBegin, bool anchorEnd) { - DecodedStream ds(is); - - state0_.Clear(); - Stack *current = &state0_, *next = &state1_; - const size_t stateSetSize = GetStateSetSize(); - std::memset(stateSet_, 0, stateSetSize); - - bool matched = AddState(*current, regex_.root_); - unsigned codepoint; - while (!current->Empty() && (codepoint = ds.Take()) != 0) { - std::memset(stateSet_, 0, stateSetSize); - next->Clear(); - matched = false; - for (const SizeType* s = current->template Bottom(); s != current->template End(); ++s) { - const State& sr = regex_.GetState(*s); - if (sr.codepoint == codepoint || - sr.codepoint == RegexType::kAnyCharacterClass || - (sr.codepoint == RegexType::kRangeCharacterClass && MatchRange(sr.rangeStart, codepoint))) - { - matched = AddState(*next, sr.out) || matched; - if (!anchorEnd && matched) - return true; - } - if (!anchorBegin) - AddState(*next, regex_.root_); - } - internal::Swap(current, next); - } - - return matched; - } - - size_t GetStateSetSize() const { - return (regex_.stateCount_ + 31) / 32 * 4; - } - - // Return whether the added states is a match state - bool AddState(Stack& l, SizeType index) { - RAPIDJSON_ASSERT(index != kRegexInvalidState); - - const State& s = regex_.GetState(index); - if (s.out1 != kRegexInvalidState) { // Split - bool matched = AddState(l, s.out); - return AddState(l, s.out1) || matched; - } - else if (!(stateSet_[index >> 5] & (1u << (index & 31)))) { - stateSet_[index >> 5] |= (1u << (index & 31)); - *l.template PushUnsafe() = index; - } - return s.out == kRegexInvalidState; // by using PushUnsafe() above, we can ensure s is not validated due to reallocation. - } - - bool MatchRange(SizeType rangeIndex, unsigned codepoint) const { - bool yes = (regex_.GetRange(rangeIndex).start & RegexType::kRangeNegationFlag) == 0; - while (rangeIndex != kRegexInvalidRange) { - const Range& r = regex_.GetRange(rangeIndex); - if (codepoint >= (r.start & ~RegexType::kRangeNegationFlag) && codepoint <= r.end) - return yes; - rangeIndex = r.next; - } - return !yes; - } - - const RegexType& regex_; - Allocator* allocator_; - Allocator* ownAllocator_; - Stack state0_; - Stack state1_; - uint32_t* stateSet_; -}; - -typedef GenericRegex > Regex; -typedef GenericRegexSearch RegexSearch; - -} // namespace internal -RAPIDJSON_NAMESPACE_END - -#ifdef __GNUC__ -RAPIDJSON_DIAG_POP -#endif - -#if defined(__clang__) || defined(_MSC_VER) -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_INTERNAL_REGEX_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/stack.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/stack.h deleted file mode 100644 index ceead44..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/stack.h +++ /dev/null @@ -1,232 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_INTERNAL_STACK_H_ -#define RAPIDJSON_INTERNAL_STACK_H_ - -#include "../allocators.h" -#include "swap.h" -#include - -#if defined(__clang__) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(c++98-compat) -#endif - -RAPIDJSON_NAMESPACE_BEGIN -namespace internal { - -/////////////////////////////////////////////////////////////////////////////// -// Stack - -//! A type-unsafe stack for storing different types of data. -/*! \tparam Allocator Allocator for allocating stack memory. -*/ -template -class Stack { -public: - // Optimization note: Do not allocate memory for stack_ in constructor. - // Do it lazily when first Push() -> Expand() -> Resize(). - Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { - } - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - Stack(Stack&& rhs) - : allocator_(rhs.allocator_), - ownAllocator_(rhs.ownAllocator_), - stack_(rhs.stack_), - stackTop_(rhs.stackTop_), - stackEnd_(rhs.stackEnd_), - initialCapacity_(rhs.initialCapacity_) - { - rhs.allocator_ = 0; - rhs.ownAllocator_ = 0; - rhs.stack_ = 0; - rhs.stackTop_ = 0; - rhs.stackEnd_ = 0; - rhs.initialCapacity_ = 0; - } -#endif - - ~Stack() { - Destroy(); - } - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - Stack& operator=(Stack&& rhs) { - if (&rhs != this) - { - Destroy(); - - allocator_ = rhs.allocator_; - ownAllocator_ = rhs.ownAllocator_; - stack_ = rhs.stack_; - stackTop_ = rhs.stackTop_; - stackEnd_ = rhs.stackEnd_; - initialCapacity_ = rhs.initialCapacity_; - - rhs.allocator_ = 0; - rhs.ownAllocator_ = 0; - rhs.stack_ = 0; - rhs.stackTop_ = 0; - rhs.stackEnd_ = 0; - rhs.initialCapacity_ = 0; - } - return *this; - } -#endif - - void Swap(Stack& rhs) RAPIDJSON_NOEXCEPT { - internal::Swap(allocator_, rhs.allocator_); - internal::Swap(ownAllocator_, rhs.ownAllocator_); - internal::Swap(stack_, rhs.stack_); - internal::Swap(stackTop_, rhs.stackTop_); - internal::Swap(stackEnd_, rhs.stackEnd_); - internal::Swap(initialCapacity_, rhs.initialCapacity_); - } - - void Clear() { stackTop_ = stack_; } - - void ShrinkToFit() { - if (Empty()) { - // If the stack is empty, completely deallocate the memory. - Allocator::Free(stack_); // NOLINT (+clang-analyzer-unix.Malloc) - stack_ = 0; - stackTop_ = 0; - stackEnd_ = 0; - } - else - Resize(GetSize()); - } - - // Optimization note: try to minimize the size of this function for force inline. - // Expansion is run very infrequently, so it is moved to another (probably non-inline) function. - template - RAPIDJSON_FORCEINLINE void Reserve(size_t count = 1) { - // Expand the stack if needed - if (RAPIDJSON_UNLIKELY(static_cast(sizeof(T) * count) > (stackEnd_ - stackTop_))) - Expand(count); - } - - template - RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) { - Reserve(count); - return PushUnsafe(count); - } - - template - RAPIDJSON_FORCEINLINE T* PushUnsafe(size_t count = 1) { - RAPIDJSON_ASSERT(stackTop_); - RAPIDJSON_ASSERT(static_cast(sizeof(T) * count) <= (stackEnd_ - stackTop_)); - T* ret = reinterpret_cast(stackTop_); - stackTop_ += sizeof(T) * count; - return ret; - } - - template - T* Pop(size_t count) { - RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T)); - stackTop_ -= count * sizeof(T); - return reinterpret_cast(stackTop_); - } - - template - T* Top() { - RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); - return reinterpret_cast(stackTop_ - sizeof(T)); - } - - template - const T* Top() const { - RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); - return reinterpret_cast(stackTop_ - sizeof(T)); - } - - template - T* End() { return reinterpret_cast(stackTop_); } - - template - const T* End() const { return reinterpret_cast(stackTop_); } - - template - T* Bottom() { return reinterpret_cast(stack_); } - - template - const T* Bottom() const { return reinterpret_cast(stack_); } - - bool HasAllocator() const { - return allocator_ != 0; - } - - Allocator& GetAllocator() { - RAPIDJSON_ASSERT(allocator_); - return *allocator_; - } - - bool Empty() const { return stackTop_ == stack_; } - size_t GetSize() const { return static_cast(stackTop_ - stack_); } - size_t GetCapacity() const { return static_cast(stackEnd_ - stack_); } - -private: - template - void Expand(size_t count) { - // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity. - size_t newCapacity; - if (stack_ == 0) { - if (!allocator_) - ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); - newCapacity = initialCapacity_; - } else { - newCapacity = GetCapacity(); - newCapacity += (newCapacity + 1) / 2; - } - size_t newSize = GetSize() + sizeof(T) * count; - if (newCapacity < newSize) - newCapacity = newSize; - - Resize(newCapacity); - } - - void Resize(size_t newCapacity) { - const size_t size = GetSize(); // Backup the current size - stack_ = static_cast(allocator_->Realloc(stack_, GetCapacity(), newCapacity)); - stackTop_ = stack_ + size; - stackEnd_ = stack_ + newCapacity; - } - - void Destroy() { - Allocator::Free(stack_); - RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack - } - - // Prohibit copy constructor & assignment operator. - Stack(const Stack&); - Stack& operator=(const Stack&); - - Allocator* allocator_; - Allocator* ownAllocator_; - char *stack_; - char *stackTop_; - char *stackEnd_; - size_t initialCapacity_; -}; - -} // namespace internal -RAPIDJSON_NAMESPACE_END - -#if defined(__clang__) -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_STACK_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/strfunc.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/strfunc.h deleted file mode 100644 index 1a88f49..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/strfunc.h +++ /dev/null @@ -1,83 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_INTERNAL_STRFUNC_H_ -#define RAPIDJSON_INTERNAL_STRFUNC_H_ - -#include "../stream.h" -#include - -RAPIDJSON_NAMESPACE_BEGIN -namespace internal { - -//! Custom strlen() which works on different character types. -/*! \tparam Ch Character type (e.g. char, wchar_t, short) - \param s Null-terminated input string. - \return Number of characters in the string. - \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints. -*/ -template -inline SizeType StrLen(const Ch* s) { - RAPIDJSON_ASSERT(s != 0); - const Ch* p = s; - while (*p) ++p; - return SizeType(p - s); -} - -template <> -inline SizeType StrLen(const char* s) { - return SizeType(std::strlen(s)); -} - -template <> -inline SizeType StrLen(const wchar_t* s) { - return SizeType(std::wcslen(s)); -} - -//! Custom strcmpn() which works on different character types. -/*! \tparam Ch Character type (e.g. char, wchar_t, short) - \param s1 Null-terminated input string. - \param s2 Null-terminated input string. - \return 0 if equal -*/ -template -inline int StrCmp(const Ch* s1, const Ch* s2) { - RAPIDJSON_ASSERT(s1 != 0); - RAPIDJSON_ASSERT(s2 != 0); - while(*s1 && (*s1 == *s2)) { s1++; s2++; } - return static_cast(*s1) < static_cast(*s2) ? -1 : static_cast(*s1) > static_cast(*s2); -} - -//! Returns number of code points in a encoded string. -template -bool CountStringCodePoint(const typename Encoding::Ch* s, SizeType length, SizeType* outCount) { - RAPIDJSON_ASSERT(s != 0); - RAPIDJSON_ASSERT(outCount != 0); - GenericStringStream is(s); - const typename Encoding::Ch* end = s + length; - SizeType count = 0; - while (is.src_ < end) { - unsigned codepoint; - if (!Encoding::Decode(is, &codepoint)) - return false; - count++; - } - *outCount = count; - return true; -} - -} // namespace internal -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_INTERNAL_STRFUNC_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/strtod.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/strtod.h deleted file mode 100644 index 62a42c6..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/strtod.h +++ /dev/null @@ -1,293 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_STRTOD_ -#define RAPIDJSON_STRTOD_ - -#include "ieee754.h" -#include "biginteger.h" -#include "diyfp.h" -#include "pow10.h" -#include -#include - -RAPIDJSON_NAMESPACE_BEGIN -namespace internal { - -inline double FastPath(double significand, int exp) { - if (exp < -308) - return 0.0; - else if (exp >= 0) - return significand * internal::Pow10(exp); - else - return significand / internal::Pow10(-exp); -} - -inline double StrtodNormalPrecision(double d, int p) { - if (p < -308) { - // Prevent expSum < -308, making Pow10(p) = 0 - d = FastPath(d, -308); - d = FastPath(d, p + 308); - } - else - d = FastPath(d, p); - return d; -} - -template -inline T Min3(T a, T b, T c) { - T m = a; - if (m > b) m = b; - if (m > c) m = c; - return m; -} - -inline int CheckWithinHalfULP(double b, const BigInteger& d, int dExp) { - const Double db(b); - const uint64_t bInt = db.IntegerSignificand(); - const int bExp = db.IntegerExponent(); - const int hExp = bExp - 1; - - int dS_Exp2 = 0, dS_Exp5 = 0, bS_Exp2 = 0, bS_Exp5 = 0, hS_Exp2 = 0, hS_Exp5 = 0; - - // Adjust for decimal exponent - if (dExp >= 0) { - dS_Exp2 += dExp; - dS_Exp5 += dExp; - } - else { - bS_Exp2 -= dExp; - bS_Exp5 -= dExp; - hS_Exp2 -= dExp; - hS_Exp5 -= dExp; - } - - // Adjust for binary exponent - if (bExp >= 0) - bS_Exp2 += bExp; - else { - dS_Exp2 -= bExp; - hS_Exp2 -= bExp; - } - - // Adjust for half ulp exponent - if (hExp >= 0) - hS_Exp2 += hExp; - else { - dS_Exp2 -= hExp; - bS_Exp2 -= hExp; - } - - // Remove common power of two factor from all three scaled values - int common_Exp2 = Min3(dS_Exp2, bS_Exp2, hS_Exp2); - dS_Exp2 -= common_Exp2; - bS_Exp2 -= common_Exp2; - hS_Exp2 -= common_Exp2; - - BigInteger dS = d; - dS.MultiplyPow5(static_cast(dS_Exp5)) <<= static_cast(dS_Exp2); - - BigInteger bS(bInt); - bS.MultiplyPow5(static_cast(bS_Exp5)) <<= static_cast(bS_Exp2); - - BigInteger hS(1); - hS.MultiplyPow5(static_cast(hS_Exp5)) <<= static_cast(hS_Exp2); - - BigInteger delta(0); - dS.Difference(bS, &delta); - - return delta.Compare(hS); -} - -inline bool StrtodFast(double d, int p, double* result) { - // Use fast path for string-to-double conversion if possible - // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ - if (p > 22 && p < 22 + 16) { - // Fast Path Cases In Disguise - d *= internal::Pow10(p - 22); - p = 22; - } - - if (p >= -22 && p <= 22 && d <= 9007199254740991.0) { // 2^53 - 1 - *result = FastPath(d, p); - return true; - } - else - return false; -} - -// Compute an approximation and see if it is within 1/2 ULP -template -inline bool StrtodDiyFp(const Ch* decimals, int dLen, int dExp, double* result) { - uint64_t significand = 0; - int i = 0; // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999 - for (; i < dLen; i++) { - if (significand > RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || - (significand == RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > Ch('5'))) - break; - significand = significand * 10u + static_cast(decimals[i] - Ch('0')); - } - - if (i < dLen && decimals[i] >= Ch('5')) // Rounding - significand++; - - int remaining = dLen - i; - const int kUlpShift = 3; - const int kUlp = 1 << kUlpShift; - int64_t error = (remaining == 0) ? 0 : kUlp / 2; - - DiyFp v(significand, 0); - v = v.Normalize(); - error <<= -v.e; - - dExp += remaining; - - int actualExp; - DiyFp cachedPower = GetCachedPower10(dExp, &actualExp); - if (actualExp != dExp) { - static const DiyFp kPow10[] = { - DiyFp(RAPIDJSON_UINT64_C2(0xa0000000, 0x00000000), -60), // 10^1 - DiyFp(RAPIDJSON_UINT64_C2(0xc8000000, 0x00000000), -57), // 10^2 - DiyFp(RAPIDJSON_UINT64_C2(0xfa000000, 0x00000000), -54), // 10^3 - DiyFp(RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), -50), // 10^4 - DiyFp(RAPIDJSON_UINT64_C2(0xc3500000, 0x00000000), -47), // 10^5 - DiyFp(RAPIDJSON_UINT64_C2(0xf4240000, 0x00000000), -44), // 10^6 - DiyFp(RAPIDJSON_UINT64_C2(0x98968000, 0x00000000), -40) // 10^7 - }; - int adjustment = dExp - actualExp; - RAPIDJSON_ASSERT(adjustment >= 1 && adjustment < 8); - v = v * kPow10[adjustment - 1]; - if (dLen + adjustment > 19) // has more digits than decimal digits in 64-bit - error += kUlp / 2; - } - - v = v * cachedPower; - - error += kUlp + (error == 0 ? 0 : 1); - - const int oldExp = v.e; - v = v.Normalize(); - error <<= oldExp - v.e; - - const int effectiveSignificandSize = Double::EffectiveSignificandSize(64 + v.e); - int precisionSize = 64 - effectiveSignificandSize; - if (precisionSize + kUlpShift >= 64) { - int scaleExp = (precisionSize + kUlpShift) - 63; - v.f >>= scaleExp; - v.e += scaleExp; - error = (error >> scaleExp) + 1 + kUlp; - precisionSize -= scaleExp; - } - - DiyFp rounded(v.f >> precisionSize, v.e + precisionSize); - const uint64_t precisionBits = (v.f & ((uint64_t(1) << precisionSize) - 1)) * kUlp; - const uint64_t halfWay = (uint64_t(1) << (precisionSize - 1)) * kUlp; - if (precisionBits >= halfWay + static_cast(error)) { - rounded.f++; - if (rounded.f & (DiyFp::kDpHiddenBit << 1)) { // rounding overflows mantissa (issue #340) - rounded.f >>= 1; - rounded.e++; - } - } - - *result = rounded.ToDouble(); - - return halfWay - static_cast(error) >= precisionBits || precisionBits >= halfWay + static_cast(error); -} - -template -inline double StrtodBigInteger(double approx, const Ch* decimals, int dLen, int dExp) { - RAPIDJSON_ASSERT(dLen >= 0); - const BigInteger dInt(decimals, static_cast(dLen)); - Double a(approx); - int cmp = CheckWithinHalfULP(a.Value(), dInt, dExp); - if (cmp < 0) - return a.Value(); // within half ULP - else if (cmp == 0) { - // Round towards even - if (a.Significand() & 1) - return a.NextPositiveDouble(); - else - return a.Value(); - } - else // adjustment - return a.NextPositiveDouble(); -} - -template -inline double StrtodFullPrecision(double d, int p, const Ch* decimals, size_t length, size_t decimalPosition, int exp) { - RAPIDJSON_ASSERT(d >= 0.0); - RAPIDJSON_ASSERT(length >= 1); - - double result = 0.0; - if (StrtodFast(d, p, &result)) - return result; - - RAPIDJSON_ASSERT(length <= INT_MAX); - int dLen = static_cast(length); - - RAPIDJSON_ASSERT(length >= decimalPosition); - RAPIDJSON_ASSERT(length - decimalPosition <= INT_MAX); - int dExpAdjust = static_cast(length - decimalPosition); - - RAPIDJSON_ASSERT(exp >= INT_MIN + dExpAdjust); - int dExp = exp - dExpAdjust; - - // Make sure length+dExp does not overflow - RAPIDJSON_ASSERT(dExp <= INT_MAX - dLen); - - // Trim leading zeros - while (dLen > 0 && *decimals == '0') { - dLen--; - decimals++; - } - - // Trim trailing zeros - while (dLen > 0 && decimals[dLen - 1] == '0') { - dLen--; - dExp++; - } - - if (dLen == 0) { // Buffer only contains zeros. - return 0.0; - } - - // Trim right-most digits - const int kMaxDecimalDigit = 767 + 1; - if (dLen > kMaxDecimalDigit) { - dExp += dLen - kMaxDecimalDigit; - dLen = kMaxDecimalDigit; - } - - // If too small, underflow to zero. - // Any x <= 10^-324 is interpreted as zero. - if (dLen + dExp <= -324) - return 0.0; - - // If too large, overflow to infinity. - // Any x >= 10^309 is interpreted as +infinity. - if (dLen + dExp > 309) - return std::numeric_limits::infinity(); - - if (StrtodDiyFp(decimals, dLen, dExp, &result)) - return result; - - // Use approximation from StrtodDiyFp and make adjustment with BigInteger comparison - return StrtodBigInteger(result, decimals, dLen, dExp); -} - -} // namespace internal -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_STRTOD_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/swap.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/swap.h deleted file mode 100644 index 2cf92f9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/internal/swap.h +++ /dev/null @@ -1,46 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_INTERNAL_SWAP_H_ -#define RAPIDJSON_INTERNAL_SWAP_H_ - -#include "../rapidjson.h" - -#if defined(__clang__) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(c++98-compat) -#endif - -RAPIDJSON_NAMESPACE_BEGIN -namespace internal { - -//! Custom swap() to avoid dependency on C++ header -/*! \tparam T Type of the arguments to swap, should be instantiated with primitive C++ types only. - \note This has the same semantics as std::swap(). -*/ -template -inline void Swap(T& a, T& b) RAPIDJSON_NOEXCEPT { - T tmp = a; - a = b; - b = tmp; -} - -} // namespace internal -RAPIDJSON_NAMESPACE_END - -#if defined(__clang__) -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_INTERNAL_SWAP_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/istreamwrapper.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/istreamwrapper.h deleted file mode 100644 index 23dd83e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/istreamwrapper.h +++ /dev/null @@ -1,128 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_ISTREAMWRAPPER_H_ -#define RAPIDJSON_ISTREAMWRAPPER_H_ - -#include "stream.h" -#include -#include - -#ifdef __clang__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(padded) -#elif defined(_MSC_VER) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(4351) // new behavior: elements of array 'array' will be default initialized -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -//! Wrapper of \c std::basic_istream into RapidJSON's Stream concept. -/*! - The classes can be wrapped including but not limited to: - - - \c std::istringstream - - \c std::stringstream - - \c std::wistringstream - - \c std::wstringstream - - \c std::ifstream - - \c std::fstream - - \c std::wifstream - - \c std::wfstream - - \tparam StreamType Class derived from \c std::basic_istream. -*/ - -template -class BasicIStreamWrapper { -public: - typedef typename StreamType::char_type Ch; - - //! Constructor. - /*! - \param stream stream opened for read. - */ - BasicIStreamWrapper(StreamType &stream) : stream_(stream), buffer_(peekBuffer_), bufferSize_(4), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { - Read(); - } - - //! Constructor. - /*! - \param stream stream opened for read. - \param buffer user-supplied buffer. - \param bufferSize size of buffer in bytes. Must >=4 bytes. - */ - BasicIStreamWrapper(StreamType &stream, char* buffer, size_t bufferSize) : stream_(stream), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { - RAPIDJSON_ASSERT(bufferSize >= 4); - Read(); - } - - Ch Peek() const { return *current_; } - Ch Take() { Ch c = *current_; Read(); return c; } - size_t Tell() const { return count_ + static_cast(current_ - buffer_); } - - // Not implemented - void Put(Ch) { RAPIDJSON_ASSERT(false); } - void Flush() { RAPIDJSON_ASSERT(false); } - Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } - size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } - - // For encoding detection only. - const Ch* Peek4() const { - return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0; - } - -private: - BasicIStreamWrapper(); - BasicIStreamWrapper(const BasicIStreamWrapper&); - BasicIStreamWrapper& operator=(const BasicIStreamWrapper&); - - void Read() { - if (current_ < bufferLast_) - ++current_; - else if (!eof_) { - count_ += readCount_; - readCount_ = bufferSize_; - bufferLast_ = buffer_ + readCount_ - 1; - current_ = buffer_; - - if (!stream_.read(buffer_, static_cast(bufferSize_))) { - readCount_ = static_cast(stream_.gcount()); - *(bufferLast_ = buffer_ + readCount_) = '\0'; - eof_ = true; - } - } - } - - StreamType &stream_; - Ch peekBuffer_[4], *buffer_; - size_t bufferSize_; - Ch *bufferLast_; - Ch *current_; - size_t readCount_; - size_t count_; //!< Number of characters read - bool eof_; -}; - -typedef BasicIStreamWrapper IStreamWrapper; -typedef BasicIStreamWrapper WIStreamWrapper; - -#if defined(__clang__) || defined(_MSC_VER) -RAPIDJSON_DIAG_POP -#endif - -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_ISTREAMWRAPPER_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/memorybuffer.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/memorybuffer.h deleted file mode 100644 index 14aad68..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/memorybuffer.h +++ /dev/null @@ -1,70 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_MEMORYBUFFER_H_ -#define RAPIDJSON_MEMORYBUFFER_H_ - -#include "stream.h" -#include "internal/stack.h" - -RAPIDJSON_NAMESPACE_BEGIN - -//! Represents an in-memory output byte stream. -/*! - This class is mainly for being wrapped by EncodedOutputStream or AutoUTFOutputStream. - - It is similar to FileWriteBuffer but the destination is an in-memory buffer instead of a file. - - Differences between MemoryBuffer and StringBuffer: - 1. StringBuffer has Encoding but MemoryBuffer is only a byte buffer. - 2. StringBuffer::GetString() returns a null-terminated string. MemoryBuffer::GetBuffer() returns a buffer without terminator. - - \tparam Allocator type for allocating memory buffer. - \note implements Stream concept -*/ -template -struct GenericMemoryBuffer { - typedef char Ch; // byte - - GenericMemoryBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} - - void Put(Ch c) { *stack_.template Push() = c; } - void Flush() {} - - void Clear() { stack_.Clear(); } - void ShrinkToFit() { stack_.ShrinkToFit(); } - Ch* Push(size_t count) { return stack_.template Push(count); } - void Pop(size_t count) { stack_.template Pop(count); } - - const Ch* GetBuffer() const { - return stack_.template Bottom(); - } - - size_t GetSize() const { return stack_.GetSize(); } - - static const size_t kDefaultCapacity = 256; - mutable internal::Stack stack_; -}; - -typedef GenericMemoryBuffer<> MemoryBuffer; - -//! Implement specialized version of PutN() with memset() for better performance. -template<> -inline void PutN(MemoryBuffer& memoryBuffer, char c, size_t n) { - std::memset(memoryBuffer.stack_.Push(n), c, n * sizeof(c)); -} - -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/memorystream.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/memorystream.h deleted file mode 100644 index 1bc393f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/memorystream.h +++ /dev/null @@ -1,71 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_MEMORYSTREAM_H_ -#define RAPIDJSON_MEMORYSTREAM_H_ - -#include "stream.h" - -#ifdef __clang__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(unreachable-code) -RAPIDJSON_DIAG_OFF(missing-noreturn) -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -//! Represents an in-memory input byte stream. -/*! - This class is mainly for being wrapped by EncodedInputStream or AutoUTFInputStream. - - It is similar to FileReadBuffer but the source is an in-memory buffer instead of a file. - - Differences between MemoryStream and StringStream: - 1. StringStream has encoding but MemoryStream is a byte stream. - 2. MemoryStream needs size of the source buffer and the buffer don't need to be null terminated. StringStream assume null-terminated string as source. - 3. MemoryStream supports Peek4() for encoding detection. StringStream is specified with an encoding so it should not have Peek4(). - \note implements Stream concept -*/ -struct MemoryStream { - typedef char Ch; // byte - - MemoryStream(const Ch *src, size_t size) : src_(src), begin_(src), end_(src + size), size_(size) {} - - Ch Peek() const { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_; } - Ch Take() { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_++; } - size_t Tell() const { return static_cast(src_ - begin_); } - - Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } - void Put(Ch) { RAPIDJSON_ASSERT(false); } - void Flush() { RAPIDJSON_ASSERT(false); } - size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } - - // For encoding detection only. - const Ch* Peek4() const { - return Tell() + 4 <= size_ ? src_ : 0; - } - - const Ch* src_; //!< Current read position. - const Ch* begin_; //!< Original head of the string. - const Ch* end_; //!< End of stream. - size_t size_; //!< Size of the stream. -}; - -RAPIDJSON_NAMESPACE_END - -#ifdef __clang__ -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/msinttypes/inttypes.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/msinttypes/inttypes.h deleted file mode 100644 index 1620402..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/msinttypes/inttypes.h +++ /dev/null @@ -1,316 +0,0 @@ -// ISO C9x compliant inttypes.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2013 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the product nor the names of its contributors may -// be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -// The above software in this distribution may have been modified by -// THL A29 Limited ("Tencent Modifications"). -// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_INTTYPES_H_ // [ -#define _MSC_INTTYPES_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include "stdint.h" - -// miloyip: VC supports inttypes.h since VC2013 -#if _MSC_VER >= 1800 -#include -#else - -// 7.8 Format conversion of integer types - -typedef struct { - intmax_t quot; - intmax_t rem; -} imaxdiv_t; - -// 7.8.1 Macros for format specifiers - -#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 - -// The fprintf macros for signed integers are: -#define PRId8 "d" -#define PRIi8 "i" -#define PRIdLEAST8 "d" -#define PRIiLEAST8 "i" -#define PRIdFAST8 "d" -#define PRIiFAST8 "i" - -#define PRId16 "hd" -#define PRIi16 "hi" -#define PRIdLEAST16 "hd" -#define PRIiLEAST16 "hi" -#define PRIdFAST16 "hd" -#define PRIiFAST16 "hi" - -#define PRId32 "I32d" -#define PRIi32 "I32i" -#define PRIdLEAST32 "I32d" -#define PRIiLEAST32 "I32i" -#define PRIdFAST32 "I32d" -#define PRIiFAST32 "I32i" - -#define PRId64 "I64d" -#define PRIi64 "I64i" -#define PRIdLEAST64 "I64d" -#define PRIiLEAST64 "I64i" -#define PRIdFAST64 "I64d" -#define PRIiFAST64 "I64i" - -#define PRIdMAX "I64d" -#define PRIiMAX "I64i" - -#define PRIdPTR "Id" -#define PRIiPTR "Ii" - -// The fprintf macros for unsigned integers are: -#define PRIo8 "o" -#define PRIu8 "u" -#define PRIx8 "x" -#define PRIX8 "X" -#define PRIoLEAST8 "o" -#define PRIuLEAST8 "u" -#define PRIxLEAST8 "x" -#define PRIXLEAST8 "X" -#define PRIoFAST8 "o" -#define PRIuFAST8 "u" -#define PRIxFAST8 "x" -#define PRIXFAST8 "X" - -#define PRIo16 "ho" -#define PRIu16 "hu" -#define PRIx16 "hx" -#define PRIX16 "hX" -#define PRIoLEAST16 "ho" -#define PRIuLEAST16 "hu" -#define PRIxLEAST16 "hx" -#define PRIXLEAST16 "hX" -#define PRIoFAST16 "ho" -#define PRIuFAST16 "hu" -#define PRIxFAST16 "hx" -#define PRIXFAST16 "hX" - -#define PRIo32 "I32o" -#define PRIu32 "I32u" -#define PRIx32 "I32x" -#define PRIX32 "I32X" -#define PRIoLEAST32 "I32o" -#define PRIuLEAST32 "I32u" -#define PRIxLEAST32 "I32x" -#define PRIXLEAST32 "I32X" -#define PRIoFAST32 "I32o" -#define PRIuFAST32 "I32u" -#define PRIxFAST32 "I32x" -#define PRIXFAST32 "I32X" - -#define PRIo64 "I64o" -#define PRIu64 "I64u" -#define PRIx64 "I64x" -#define PRIX64 "I64X" -#define PRIoLEAST64 "I64o" -#define PRIuLEAST64 "I64u" -#define PRIxLEAST64 "I64x" -#define PRIXLEAST64 "I64X" -#define PRIoFAST64 "I64o" -#define PRIuFAST64 "I64u" -#define PRIxFAST64 "I64x" -#define PRIXFAST64 "I64X" - -#define PRIoMAX "I64o" -#define PRIuMAX "I64u" -#define PRIxMAX "I64x" -#define PRIXMAX "I64X" - -#define PRIoPTR "Io" -#define PRIuPTR "Iu" -#define PRIxPTR "Ix" -#define PRIXPTR "IX" - -// The fscanf macros for signed integers are: -#define SCNd8 "d" -#define SCNi8 "i" -#define SCNdLEAST8 "d" -#define SCNiLEAST8 "i" -#define SCNdFAST8 "d" -#define SCNiFAST8 "i" - -#define SCNd16 "hd" -#define SCNi16 "hi" -#define SCNdLEAST16 "hd" -#define SCNiLEAST16 "hi" -#define SCNdFAST16 "hd" -#define SCNiFAST16 "hi" - -#define SCNd32 "ld" -#define SCNi32 "li" -#define SCNdLEAST32 "ld" -#define SCNiLEAST32 "li" -#define SCNdFAST32 "ld" -#define SCNiFAST32 "li" - -#define SCNd64 "I64d" -#define SCNi64 "I64i" -#define SCNdLEAST64 "I64d" -#define SCNiLEAST64 "I64i" -#define SCNdFAST64 "I64d" -#define SCNiFAST64 "I64i" - -#define SCNdMAX "I64d" -#define SCNiMAX "I64i" - -#ifdef _WIN64 // [ -# define SCNdPTR "I64d" -# define SCNiPTR "I64i" -#else // _WIN64 ][ -# define SCNdPTR "ld" -# define SCNiPTR "li" -#endif // _WIN64 ] - -// The fscanf macros for unsigned integers are: -#define SCNo8 "o" -#define SCNu8 "u" -#define SCNx8 "x" -#define SCNX8 "X" -#define SCNoLEAST8 "o" -#define SCNuLEAST8 "u" -#define SCNxLEAST8 "x" -#define SCNXLEAST8 "X" -#define SCNoFAST8 "o" -#define SCNuFAST8 "u" -#define SCNxFAST8 "x" -#define SCNXFAST8 "X" - -#define SCNo16 "ho" -#define SCNu16 "hu" -#define SCNx16 "hx" -#define SCNX16 "hX" -#define SCNoLEAST16 "ho" -#define SCNuLEAST16 "hu" -#define SCNxLEAST16 "hx" -#define SCNXLEAST16 "hX" -#define SCNoFAST16 "ho" -#define SCNuFAST16 "hu" -#define SCNxFAST16 "hx" -#define SCNXFAST16 "hX" - -#define SCNo32 "lo" -#define SCNu32 "lu" -#define SCNx32 "lx" -#define SCNX32 "lX" -#define SCNoLEAST32 "lo" -#define SCNuLEAST32 "lu" -#define SCNxLEAST32 "lx" -#define SCNXLEAST32 "lX" -#define SCNoFAST32 "lo" -#define SCNuFAST32 "lu" -#define SCNxFAST32 "lx" -#define SCNXFAST32 "lX" - -#define SCNo64 "I64o" -#define SCNu64 "I64u" -#define SCNx64 "I64x" -#define SCNX64 "I64X" -#define SCNoLEAST64 "I64o" -#define SCNuLEAST64 "I64u" -#define SCNxLEAST64 "I64x" -#define SCNXLEAST64 "I64X" -#define SCNoFAST64 "I64o" -#define SCNuFAST64 "I64u" -#define SCNxFAST64 "I64x" -#define SCNXFAST64 "I64X" - -#define SCNoMAX "I64o" -#define SCNuMAX "I64u" -#define SCNxMAX "I64x" -#define SCNXMAX "I64X" - -#ifdef _WIN64 // [ -# define SCNoPTR "I64o" -# define SCNuPTR "I64u" -# define SCNxPTR "I64x" -# define SCNXPTR "I64X" -#else // _WIN64 ][ -# define SCNoPTR "lo" -# define SCNuPTR "lu" -# define SCNxPTR "lx" -# define SCNXPTR "lX" -#endif // _WIN64 ] - -#endif // __STDC_FORMAT_MACROS ] - -// 7.8.2 Functions for greatest-width integer types - -// 7.8.2.1 The imaxabs function -#define imaxabs _abs64 - -// 7.8.2.2 The imaxdiv function - -// This is modified version of div() function from Microsoft's div.c found -// in %MSVC.NET%\crt\src\div.c -#ifdef STATIC_IMAXDIV // [ -static -#else // STATIC_IMAXDIV ][ -_inline -#endif // STATIC_IMAXDIV ] -imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) -{ - imaxdiv_t result; - - result.quot = numer / denom; - result.rem = numer % denom; - - if (numer < 0 && result.rem > 0) { - // did division wrong; must fix up - ++result.quot; - result.rem -= denom; - } - - return result; -} - -// 7.8.2.3 The strtoimax and strtoumax functions -#define strtoimax _strtoi64 -#define strtoumax _strtoui64 - -// 7.8.2.4 The wcstoimax and wcstoumax functions -#define wcstoimax _wcstoi64 -#define wcstoumax _wcstoui64 - -#endif // _MSC_VER >= 1800 - -#endif // _MSC_INTTYPES_H_ ] diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/msinttypes/stdint.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/msinttypes/stdint.h deleted file mode 100644 index 1c266ec..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/msinttypes/stdint.h +++ /dev/null @@ -1,300 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2013 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the product nor the names of its contributors may -// be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -// The above software in this distribution may have been modified by -// THL A29 Limited ("Tencent Modifications"). -// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -// miloyip: Originally Visual Studio 2010 uses its own stdint.h. However it generates warning with INT64_C(), so change to use this file for vs2010. -#if _MSC_VER >= 1600 // [ -#include - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -#undef INT8_C -#undef INT16_C -#undef INT32_C -#undef INT64_C -#undef UINT8_C -#undef UINT16_C -#undef UINT32_C -#undef UINT64_C - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -// These #ifndef's are needed to prevent collisions with . -// Check out Issue 9 for the details. -#ifndef INTMAX_C // [ -# define INTMAX_C INT64_C -#endif // INTMAX_C ] -#ifndef UINTMAX_C // [ -# define UINTMAX_C UINT64_C -#endif // UINTMAX_C ] - -#endif // __STDC_CONSTANT_MACROS ] - -#else // ] _MSC_VER >= 1700 [ - -#include - -// For Visual Studio 6 in C++ mode and for many Visual Studio versions when -// compiling for ARM we have to wrap include with 'extern "C++" {}' -// or compiler would give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#if defined(__cplusplus) && !defined(_M_ARM) -extern "C" { -#endif -# include -#if defined(__cplusplus) && !defined(_M_ARM) -} -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types - -// Visual Studio 6 and Embedded Visual C++ 4 doesn't -// realize that, e.g. char has the same size as __int8 -// so we give up on __intX for them. -#if (_MSC_VER < 1300) - typedef signed char int8_t; - typedef signed short int16_t; - typedef signed int int32_t; - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; -#else - typedef signed __int8 int8_t; - typedef signed __int16 int16_t; - typedef signed __int32 int32_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; -#endif -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; - - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef signed __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 signed int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -// These #ifndef's are needed to prevent collisions with . -// Check out Issue 9 for the details. -#ifndef INTMAX_C // [ -# define INTMAX_C INT64_C -#endif // INTMAX_C ] -#ifndef UINTMAX_C // [ -# define UINTMAX_C UINT64_C -#endif // UINTMAX_C ] - -#endif // __STDC_CONSTANT_MACROS ] - -#endif // _MSC_VER >= 1600 ] - -#endif // _MSC_STDINT_H_ ] diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/ostreamwrapper.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/ostreamwrapper.h deleted file mode 100644 index bfd4d6d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/ostreamwrapper.h +++ /dev/null @@ -1,81 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_OSTREAMWRAPPER_H_ -#define RAPIDJSON_OSTREAMWRAPPER_H_ - -#include "stream.h" -#include - -#ifdef __clang__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(padded) -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -//! Wrapper of \c std::basic_ostream into RapidJSON's Stream concept. -/*! - The classes can be wrapped including but not limited to: - - - \c std::ostringstream - - \c std::stringstream - - \c std::wpstringstream - - \c std::wstringstream - - \c std::ifstream - - \c std::fstream - - \c std::wofstream - - \c std::wfstream - - \tparam StreamType Class derived from \c std::basic_ostream. -*/ - -template -class BasicOStreamWrapper { -public: - typedef typename StreamType::char_type Ch; - BasicOStreamWrapper(StreamType& stream) : stream_(stream) {} - - void Put(Ch c) { - stream_.put(c); - } - - void Flush() { - stream_.flush(); - } - - // Not implemented - char Peek() const { RAPIDJSON_ASSERT(false); return 0; } - char Take() { RAPIDJSON_ASSERT(false); return 0; } - size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } - char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } - size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } - -private: - BasicOStreamWrapper(const BasicOStreamWrapper&); - BasicOStreamWrapper& operator=(const BasicOStreamWrapper&); - - StreamType& stream_; -}; - -typedef BasicOStreamWrapper OStreamWrapper; -typedef BasicOStreamWrapper WOStreamWrapper; - -#ifdef __clang__ -RAPIDJSON_DIAG_POP -#endif - -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_OSTREAMWRAPPER_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/pointer.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/pointer.h deleted file mode 100644 index d0d762d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/pointer.h +++ /dev/null @@ -1,1470 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_POINTER_H_ -#define RAPIDJSON_POINTER_H_ - -#include "document.h" -#include "uri.h" -#include "internal/itoa.h" -#include "error/error.h" // PointerParseErrorCode - -#ifdef __clang__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(switch-enum) -#elif defined(_MSC_VER) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -static const SizeType kPointerInvalidIndex = ~SizeType(0); //!< Represents an invalid index in GenericPointer::Token - -/////////////////////////////////////////////////////////////////////////////// -// GenericPointer - -//! Represents a JSON Pointer. Use Pointer for UTF8 encoding and default allocator. -/*! - This class implements RFC 6901 "JavaScript Object Notation (JSON) Pointer" - (https://tools.ietf.org/html/rfc6901). - - A JSON pointer is for identifying a specific value in a JSON document - (GenericDocument). It can simplify coding of DOM tree manipulation, because it - can access multiple-level depth of DOM tree with single API call. - - After it parses a string representation (e.g. "/foo/0" or URI fragment - representation (e.g. "#/foo/0") into its internal representation (tokens), - it can be used to resolve a specific value in multiple documents, or sub-tree - of documents. - - Contrary to GenericValue, Pointer can be copy constructed and copy assigned. - Apart from assignment, a Pointer cannot be modified after construction. - - Although Pointer is very convenient, please aware that constructing Pointer - involves parsing and dynamic memory allocation. A special constructor with user- - supplied tokens eliminates these. - - GenericPointer depends on GenericDocument and GenericValue. - - \tparam ValueType The value type of the DOM tree. E.g. GenericValue > - \tparam Allocator The allocator type for allocating memory for internal representation. - - \note GenericPointer uses same encoding of ValueType. - However, Allocator of GenericPointer is independent of Allocator of Value. -*/ -template -class GenericPointer { -public: - typedef typename ValueType::EncodingType EncodingType; //!< Encoding type from Value - typedef typename ValueType::Ch Ch; //!< Character type from Value - typedef GenericUri UriType; - - - //! A token is the basic units of internal representation. - /*! - A JSON pointer string representation "/foo/123" is parsed to two tokens: - "foo" and 123. 123 will be represented in both numeric form and string form. - They are resolved according to the actual value type (object or array). - - For token that are not numbers, or the numeric value is out of bound - (greater than limits of SizeType), they are only treated as string form - (i.e. the token's index will be equal to kPointerInvalidIndex). - - This struct is public so that user can create a Pointer without parsing and - allocation, using a special constructor. - */ - struct Token { - const Ch* name; //!< Name of the token. It has null character at the end but it can contain null character. - SizeType length; //!< Length of the name. - SizeType index; //!< A valid array index, if it is not equal to kPointerInvalidIndex. - }; - - //!@name Constructors and destructor. - //@{ - - //! Default constructor. - GenericPointer(Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} - - //! Constructor that parses a string or URI fragment representation. - /*! - \param source A null-terminated, string or URI fragment representation of JSON pointer. - \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. - */ - explicit GenericPointer(const Ch* source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { - Parse(source, internal::StrLen(source)); - } - -#if RAPIDJSON_HAS_STDSTRING - //! Constructor that parses a string or URI fragment representation. - /*! - \param source A string or URI fragment representation of JSON pointer. - \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. - \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. - */ - explicit GenericPointer(const std::basic_string& source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { - Parse(source.c_str(), source.size()); - } -#endif - - //! Constructor that parses a string or URI fragment representation, with length of the source string. - /*! - \param source A string or URI fragment representation of JSON pointer. - \param length Length of source. - \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. - \note Slightly faster than the overload without length. - */ - GenericPointer(const Ch* source, size_t length, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { - Parse(source, length); - } - - //! Constructor with user-supplied tokens. - /*! - This constructor let user supplies const array of tokens. - This prevents the parsing process and eliminates allocation. - This is preferred for memory constrained environments. - - \param tokens An constant array of tokens representing the JSON pointer. - \param tokenCount Number of tokens. - - \b Example - \code - #define NAME(s) { s, sizeof(s) / sizeof(s[0]) - 1, kPointerInvalidIndex } - #define INDEX(i) { #i, sizeof(#i) - 1, i } - - static const Pointer::Token kTokens[] = { NAME("foo"), INDEX(123) }; - static const Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); - // Equivalent to static const Pointer p("/foo/123"); - - #undef NAME - #undef INDEX - \endcode - */ - GenericPointer(const Token* tokens, size_t tokenCount) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(const_cast(tokens)), tokenCount_(tokenCount), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} - - //! Copy constructor. - GenericPointer(const GenericPointer& rhs) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { - *this = rhs; - } - - //! Copy constructor. - GenericPointer(const GenericPointer& rhs, Allocator* allocator) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { - *this = rhs; - } - - //! Destructor. - ~GenericPointer() { - if (nameBuffer_) // If user-supplied tokens constructor is used, nameBuffer_ is nullptr and tokens_ are not deallocated. - Allocator::Free(tokens_); - RAPIDJSON_DELETE(ownAllocator_); - } - - //! Assignment operator. - GenericPointer& operator=(const GenericPointer& rhs) { - if (this != &rhs) { - // Do not delete ownAllocator - if (nameBuffer_) - Allocator::Free(tokens_); - - tokenCount_ = rhs.tokenCount_; - parseErrorOffset_ = rhs.parseErrorOffset_; - parseErrorCode_ = rhs.parseErrorCode_; - - if (rhs.nameBuffer_) - CopyFromRaw(rhs); // Normally parsed tokens. - else { - tokens_ = rhs.tokens_; // User supplied const tokens. - nameBuffer_ = 0; - } - } - return *this; - } - - //! Swap the content of this pointer with another. - /*! - \param other The pointer to swap with. - \note Constant complexity. - */ - GenericPointer& Swap(GenericPointer& other) RAPIDJSON_NOEXCEPT { - internal::Swap(allocator_, other.allocator_); - internal::Swap(ownAllocator_, other.ownAllocator_); - internal::Swap(nameBuffer_, other.nameBuffer_); - internal::Swap(tokens_, other.tokens_); - internal::Swap(tokenCount_, other.tokenCount_); - internal::Swap(parseErrorOffset_, other.parseErrorOffset_); - internal::Swap(parseErrorCode_, other.parseErrorCode_); - return *this; - } - - //! free-standing swap function helper - /*! - Helper function to enable support for common swap implementation pattern based on \c std::swap: - \code - void swap(MyClass& a, MyClass& b) { - using std::swap; - swap(a.pointer, b.pointer); - // ... - } - \endcode - \see Swap() - */ - friend inline void swap(GenericPointer& a, GenericPointer& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } - - //@} - - //!@name Append token - //@{ - - //! Append a token and return a new Pointer - /*! - \param token Token to be appended. - \param allocator Allocator for the newly return Pointer. - \return A new Pointer with appended token. - */ - GenericPointer Append(const Token& token, Allocator* allocator = 0) const { - GenericPointer r; - r.allocator_ = allocator; - Ch *p = r.CopyFromRaw(*this, 1, token.length + 1); - std::memcpy(p, token.name, (token.length + 1) * sizeof(Ch)); - r.tokens_[tokenCount_].name = p; - r.tokens_[tokenCount_].length = token.length; - r.tokens_[tokenCount_].index = token.index; - return r; - } - - //! Append a name token with length, and return a new Pointer - /*! - \param name Name to be appended. - \param length Length of name. - \param allocator Allocator for the newly return Pointer. - \return A new Pointer with appended token. - */ - GenericPointer Append(const Ch* name, SizeType length, Allocator* allocator = 0) const { - Token token = { name, length, kPointerInvalidIndex }; - return Append(token, allocator); - } - - //! Append a name token without length, and return a new Pointer - /*! - \param name Name (const Ch*) to be appended. - \param allocator Allocator for the newly return Pointer. - \return A new Pointer with appended token. - */ - template - RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >), (GenericPointer)) - Append(T* name, Allocator* allocator = 0) const { - return Append(name, internal::StrLen(name), allocator); - } - -#if RAPIDJSON_HAS_STDSTRING - //! Append a name token, and return a new Pointer - /*! - \param name Name to be appended. - \param allocator Allocator for the newly return Pointer. - \return A new Pointer with appended token. - */ - GenericPointer Append(const std::basic_string& name, Allocator* allocator = 0) const { - return Append(name.c_str(), static_cast(name.size()), allocator); - } -#endif - - //! Append a index token, and return a new Pointer - /*! - \param index Index to be appended. - \param allocator Allocator for the newly return Pointer. - \return A new Pointer with appended token. - */ - GenericPointer Append(SizeType index, Allocator* allocator = 0) const { - char buffer[21]; - char* end = sizeof(SizeType) == 4 ? internal::u32toa(index, buffer) : internal::u64toa(index, buffer); - SizeType length = static_cast(end - buffer); - buffer[length] = '\0'; - - if (sizeof(Ch) == 1) { - Token token = { reinterpret_cast(buffer), length, index }; - return Append(token, allocator); - } - else { - Ch name[21]; - for (size_t i = 0; i <= length; i++) - name[i] = static_cast(buffer[i]); - Token token = { name, length, index }; - return Append(token, allocator); - } - } - - //! Append a token by value, and return a new Pointer - /*! - \param token token to be appended. - \param allocator Allocator for the newly return Pointer. - \return A new Pointer with appended token. - */ - GenericPointer Append(const ValueType& token, Allocator* allocator = 0) const { - if (token.IsString()) - return Append(token.GetString(), token.GetStringLength(), allocator); - else { - RAPIDJSON_ASSERT(token.IsUint64()); - RAPIDJSON_ASSERT(token.GetUint64() <= SizeType(~0)); - return Append(static_cast(token.GetUint64()), allocator); - } - } - - //!@name Handling Parse Error - //@{ - - //! Check whether this is a valid pointer. - bool IsValid() const { return parseErrorCode_ == kPointerParseErrorNone; } - - //! Get the parsing error offset in code unit. - size_t GetParseErrorOffset() const { return parseErrorOffset_; } - - //! Get the parsing error code. - PointerParseErrorCode GetParseErrorCode() const { return parseErrorCode_; } - - //@} - - //! Get the allocator of this pointer. - Allocator& GetAllocator() { return *allocator_; } - - //!@name Tokens - //@{ - - //! Get the token array (const version only). - const Token* GetTokens() const { return tokens_; } - - //! Get the number of tokens. - size_t GetTokenCount() const { return tokenCount_; } - - //@} - - //!@name Equality/inequality operators - //@{ - - //! Equality operator. - /*! - \note When any pointers are invalid, always returns false. - */ - bool operator==(const GenericPointer& rhs) const { - if (!IsValid() || !rhs.IsValid() || tokenCount_ != rhs.tokenCount_) - return false; - - for (size_t i = 0; i < tokenCount_; i++) { - if (tokens_[i].index != rhs.tokens_[i].index || - tokens_[i].length != rhs.tokens_[i].length || - (tokens_[i].length != 0 && std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch)* tokens_[i].length) != 0)) - { - return false; - } - } - - return true; - } - - //! Inequality operator. - /*! - \note When any pointers are invalid, always returns true. - */ - bool operator!=(const GenericPointer& rhs) const { return !(*this == rhs); } - - //! Less than operator. - /*! - \note Invalid pointers are always greater than valid ones. - */ - bool operator<(const GenericPointer& rhs) const { - if (!IsValid()) - return false; - if (!rhs.IsValid()) - return true; - - if (tokenCount_ != rhs.tokenCount_) - return tokenCount_ < rhs.tokenCount_; - - for (size_t i = 0; i < tokenCount_; i++) { - if (tokens_[i].index != rhs.tokens_[i].index) - return tokens_[i].index < rhs.tokens_[i].index; - - if (tokens_[i].length != rhs.tokens_[i].length) - return tokens_[i].length < rhs.tokens_[i].length; - - if (int cmp = std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch) * tokens_[i].length)) - return cmp < 0; - } - - return false; - } - - //@} - - //!@name Stringify - //@{ - - //! Stringify the pointer into string representation. - /*! - \tparam OutputStream Type of output stream. - \param os The output stream. - */ - template - bool Stringify(OutputStream& os) const { - return Stringify(os); - } - - //! Stringify the pointer into URI fragment representation. - /*! - \tparam OutputStream Type of output stream. - \param os The output stream. - */ - template - bool StringifyUriFragment(OutputStream& os) const { - return Stringify(os); - } - - //@} - - //!@name Create value - //@{ - - //! Create a value in a subtree. - /*! - If the value is not exist, it creates all parent values and a JSON Null value. - So it always succeed and return the newly created or existing value. - - Remind that it may change types of parents according to tokens, so it - potentially removes previously stored values. For example, if a document - was an array, and "/foo" is used to create a value, then the document - will be changed to an object, and all existing array elements are lost. - - \param root Root value of a DOM subtree to be resolved. It can be any value other than document root. - \param allocator Allocator for creating the values if the specified value or its parents are not exist. - \param alreadyExist If non-null, it stores whether the resolved value is already exist. - \return The resolved newly created (a JSON Null value), or already exists value. - */ - ValueType& Create(ValueType& root, typename ValueType::AllocatorType& allocator, bool* alreadyExist = 0) const { - RAPIDJSON_ASSERT(IsValid()); - ValueType* v = &root; - bool exist = true; - for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { - if (v->IsArray() && t->name[0] == '-' && t->length == 1) { - v->PushBack(ValueType().Move(), allocator); - v = &((*v)[v->Size() - 1]); - exist = false; - } - else { - if (t->index == kPointerInvalidIndex) { // must be object name - if (!v->IsObject()) - v->SetObject(); // Change to Object - } - else { // object name or array index - if (!v->IsArray() && !v->IsObject()) - v->SetArray(); // Change to Array - } - - if (v->IsArray()) { - if (t->index >= v->Size()) { - v->Reserve(t->index + 1, allocator); - while (t->index >= v->Size()) - v->PushBack(ValueType().Move(), allocator); - exist = false; - } - v = &((*v)[t->index]); - } - else { - typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); - if (m == v->MemberEnd()) { - v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator); - m = v->MemberEnd(); - v = &(--m)->value; // Assumes AddMember() appends at the end - exist = false; - } - else - v = &m->value; - } - } - } - - if (alreadyExist) - *alreadyExist = exist; - - return *v; - } - - //! Creates a value in a document. - /*! - \param document A document to be resolved. - \param alreadyExist If non-null, it stores whether the resolved value is already exist. - \return The resolved newly created, or already exists value. - */ - template - ValueType& Create(GenericDocument& document, bool* alreadyExist = 0) const { - return Create(document, document.GetAllocator(), alreadyExist); - } - - //@} - - //!@name Compute URI - //@{ - - //! Compute the in-scope URI for a subtree. - // For use with JSON pointers into JSON schema documents. - /*! - \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. - \param rootUri Root URI - \param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token. - \param allocator Allocator for Uris - \return Uri if it can be resolved. Otherwise null. - - \note - There are only 3 situations when a URI cannot be resolved: - 1. A value in the path is neither an array nor object. - 2. An object value does not contain the token. - 3. A token is out of range of an array value. - - Use unresolvedTokenIndex to retrieve the token index. - */ - UriType GetUri(ValueType& root, const UriType& rootUri, size_t* unresolvedTokenIndex = 0, Allocator* allocator = 0) const { - static const Ch kIdString[] = { 'i', 'd', '\0' }; - static const ValueType kIdValue(kIdString, 2); - UriType base = UriType(rootUri, allocator); - RAPIDJSON_ASSERT(IsValid()); - ValueType* v = &root; - for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { - switch (v->GetType()) { - case kObjectType: - { - // See if we have an id, and if so resolve with the current base - typename ValueType::MemberIterator m = v->FindMember(kIdValue); - if (m != v->MemberEnd() && (m->value).IsString()) { - UriType here = UriType(m->value, allocator).Resolve(base, allocator); - base = here; - } - m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); - if (m == v->MemberEnd()) - break; - v = &m->value; - } - continue; - case kArrayType: - if (t->index == kPointerInvalidIndex || t->index >= v->Size()) - break; - v = &((*v)[t->index]); - continue; - default: - break; - } - - // Error: unresolved token - if (unresolvedTokenIndex) - *unresolvedTokenIndex = static_cast(t - tokens_); - return UriType(allocator); - } - return base; - } - - UriType GetUri(const ValueType& root, const UriType& rootUri, size_t* unresolvedTokenIndex = 0, Allocator* allocator = 0) const { - return GetUri(const_cast(root), rootUri, unresolvedTokenIndex, allocator); - } - - - //!@name Query value - //@{ - - //! Query a value in a subtree. - /*! - \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. - \param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token. - \return Pointer to the value if it can be resolved. Otherwise null. - - \note - There are only 3 situations when a value cannot be resolved: - 1. A value in the path is neither an array nor object. - 2. An object value does not contain the token. - 3. A token is out of range of an array value. - - Use unresolvedTokenIndex to retrieve the token index. - */ - ValueType* Get(ValueType& root, size_t* unresolvedTokenIndex = 0) const { - RAPIDJSON_ASSERT(IsValid()); - ValueType* v = &root; - for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { - switch (v->GetType()) { - case kObjectType: - { - typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); - if (m == v->MemberEnd()) - break; - v = &m->value; - } - continue; - case kArrayType: - if (t->index == kPointerInvalidIndex || t->index >= v->Size()) - break; - v = &((*v)[t->index]); - continue; - default: - break; - } - - // Error: unresolved token - if (unresolvedTokenIndex) - *unresolvedTokenIndex = static_cast(t - tokens_); - return 0; - } - return v; - } - - //! Query a const value in a const subtree. - /*! - \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. - \return Pointer to the value if it can be resolved. Otherwise null. - */ - const ValueType* Get(const ValueType& root, size_t* unresolvedTokenIndex = 0) const { - return Get(const_cast(root), unresolvedTokenIndex); - } - - //@} - - //!@name Query a value with default - //@{ - - //! Query a value in a subtree with default value. - /*! - Similar to Get(), but if the specified value do not exists, it creates all parents and clone the default value. - So that this function always succeed. - - \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. - \param defaultValue Default value to be cloned if the value was not exists. - \param allocator Allocator for creating the values if the specified value or its parents are not exist. - \see Create() - */ - ValueType& GetWithDefault(ValueType& root, const ValueType& defaultValue, typename ValueType::AllocatorType& allocator) const { - bool alreadyExist; - ValueType& v = Create(root, allocator, &alreadyExist); - return alreadyExist ? v : v.CopyFrom(defaultValue, allocator); - } - - //! Query a value in a subtree with default null-terminated string. - ValueType& GetWithDefault(ValueType& root, const Ch* defaultValue, typename ValueType::AllocatorType& allocator) const { - bool alreadyExist; - ValueType& v = Create(root, allocator, &alreadyExist); - return alreadyExist ? v : v.SetString(defaultValue, allocator); - } - -#if RAPIDJSON_HAS_STDSTRING - //! Query a value in a subtree with default std::basic_string. - ValueType& GetWithDefault(ValueType& root, const std::basic_string& defaultValue, typename ValueType::AllocatorType& allocator) const { - bool alreadyExist; - ValueType& v = Create(root, allocator, &alreadyExist); - return alreadyExist ? v : v.SetString(defaultValue, allocator); - } -#endif - - //! Query a value in a subtree with default primitive value. - /*! - \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool - */ - template - RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) - GetWithDefault(ValueType& root, T defaultValue, typename ValueType::AllocatorType& allocator) const { - return GetWithDefault(root, ValueType(defaultValue).Move(), allocator); - } - - //! Query a value in a document with default value. - template - ValueType& GetWithDefault(GenericDocument& document, const ValueType& defaultValue) const { - return GetWithDefault(document, defaultValue, document.GetAllocator()); - } - - //! Query a value in a document with default null-terminated string. - template - ValueType& GetWithDefault(GenericDocument& document, const Ch* defaultValue) const { - return GetWithDefault(document, defaultValue, document.GetAllocator()); - } - -#if RAPIDJSON_HAS_STDSTRING - //! Query a value in a document with default std::basic_string. - template - ValueType& GetWithDefault(GenericDocument& document, const std::basic_string& defaultValue) const { - return GetWithDefault(document, defaultValue, document.GetAllocator()); - } -#endif - - //! Query a value in a document with default primitive value. - /*! - \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool - */ - template - RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) - GetWithDefault(GenericDocument& document, T defaultValue) const { - return GetWithDefault(document, defaultValue, document.GetAllocator()); - } - - //@} - - //!@name Set a value - //@{ - - //! Set a value in a subtree, with move semantics. - /*! - It creates all parents if they are not exist or types are different to the tokens. - So this function always succeeds but potentially remove existing values. - - \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. - \param value Value to be set. - \param allocator Allocator for creating the values if the specified value or its parents are not exist. - \see Create() - */ - ValueType& Set(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { - return Create(root, allocator) = value; - } - - //! Set a value in a subtree, with copy semantics. - ValueType& Set(ValueType& root, const ValueType& value, typename ValueType::AllocatorType& allocator) const { - return Create(root, allocator).CopyFrom(value, allocator); - } - - //! Set a null-terminated string in a subtree. - ValueType& Set(ValueType& root, const Ch* value, typename ValueType::AllocatorType& allocator) const { - return Create(root, allocator) = ValueType(value, allocator).Move(); - } - -#if RAPIDJSON_HAS_STDSTRING - //! Set a std::basic_string in a subtree. - ValueType& Set(ValueType& root, const std::basic_string& value, typename ValueType::AllocatorType& allocator) const { - return Create(root, allocator) = ValueType(value, allocator).Move(); - } -#endif - - //! Set a primitive value in a subtree. - /*! - \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool - */ - template - RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) - Set(ValueType& root, T value, typename ValueType::AllocatorType& allocator) const { - return Create(root, allocator) = ValueType(value).Move(); - } - - //! Set a value in a document, with move semantics. - template - ValueType& Set(GenericDocument& document, ValueType& value) const { - return Create(document) = value; - } - - //! Set a value in a document, with copy semantics. - template - ValueType& Set(GenericDocument& document, const ValueType& value) const { - return Create(document).CopyFrom(value, document.GetAllocator()); - } - - //! Set a null-terminated string in a document. - template - ValueType& Set(GenericDocument& document, const Ch* value) const { - return Create(document) = ValueType(value, document.GetAllocator()).Move(); - } - -#if RAPIDJSON_HAS_STDSTRING - //! Sets a std::basic_string in a document. - template - ValueType& Set(GenericDocument& document, const std::basic_string& value) const { - return Create(document) = ValueType(value, document.GetAllocator()).Move(); - } -#endif - - //! Set a primitive value in a document. - /*! - \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool - */ - template - RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) - Set(GenericDocument& document, T value) const { - return Create(document) = value; - } - - //@} - - //!@name Swap a value - //@{ - - //! Swap a value with a value in a subtree. - /*! - It creates all parents if they are not exist or types are different to the tokens. - So this function always succeeds but potentially remove existing values. - - \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. - \param value Value to be swapped. - \param allocator Allocator for creating the values if the specified value or its parents are not exist. - \see Create() - */ - ValueType& Swap(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { - return Create(root, allocator).Swap(value); - } - - //! Swap a value with a value in a document. - template - ValueType& Swap(GenericDocument& document, ValueType& value) const { - return Create(document).Swap(value); - } - - //@} - - //! Erase a value in a subtree. - /*! - \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. - \return Whether the resolved value is found and erased. - - \note Erasing with an empty pointer \c Pointer(""), i.e. the root, always fail and return false. - */ - bool Erase(ValueType& root) const { - RAPIDJSON_ASSERT(IsValid()); - if (tokenCount_ == 0) // Cannot erase the root - return false; - - ValueType* v = &root; - const Token* last = tokens_ + (tokenCount_ - 1); - for (const Token *t = tokens_; t != last; ++t) { - switch (v->GetType()) { - case kObjectType: - { - typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); - if (m == v->MemberEnd()) - return false; - v = &m->value; - } - break; - case kArrayType: - if (t->index == kPointerInvalidIndex || t->index >= v->Size()) - return false; - v = &((*v)[t->index]); - break; - default: - return false; - } - } - - switch (v->GetType()) { - case kObjectType: - return v->EraseMember(GenericStringRef(last->name, last->length)); - case kArrayType: - if (last->index == kPointerInvalidIndex || last->index >= v->Size()) - return false; - v->Erase(v->Begin() + last->index); - return true; - default: - return false; - } - } - -private: - //! Clone the content from rhs to this. - /*! - \param rhs Source pointer. - \param extraToken Extra tokens to be allocated. - \param extraNameBufferSize Extra name buffer size (in number of Ch) to be allocated. - \return Start of non-occupied name buffer, for storing extra names. - */ - Ch* CopyFromRaw(const GenericPointer& rhs, size_t extraToken = 0, size_t extraNameBufferSize = 0) { - if (!allocator_) // allocator is independently owned. - ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); - - size_t nameBufferSize = rhs.tokenCount_; // null terminators for tokens - for (Token *t = rhs.tokens_; t != rhs.tokens_ + rhs.tokenCount_; ++t) - nameBufferSize += t->length; - - tokenCount_ = rhs.tokenCount_ + extraToken; - tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + (nameBufferSize + extraNameBufferSize) * sizeof(Ch))); - nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); - if (rhs.tokenCount_ > 0) { - std::memcpy(tokens_, rhs.tokens_, rhs.tokenCount_ * sizeof(Token)); - } - if (nameBufferSize > 0) { - std::memcpy(nameBuffer_, rhs.nameBuffer_, nameBufferSize * sizeof(Ch)); - } - - // Adjust pointers to name buffer - std::ptrdiff_t diff = nameBuffer_ - rhs.nameBuffer_; - for (Token *t = tokens_; t != tokens_ + rhs.tokenCount_; ++t) - t->name += diff; - - return nameBuffer_ + nameBufferSize; - } - - //! Check whether a character should be percent-encoded. - /*! - According to RFC 3986 2.3 Unreserved Characters. - \param c The character (code unit) to be tested. - */ - bool NeedPercentEncode(Ch c) const { - return !((c >= '0' && c <= '9') || (c >= 'A' && c <='Z') || (c >= 'a' && c <= 'z') || c == '-' || c == '.' || c == '_' || c =='~'); - } - - //! Parse a JSON String or its URI fragment representation into tokens. -#ifndef __clang__ // -Wdocumentation - /*! - \param source Either a JSON Pointer string, or its URI fragment representation. Not need to be null terminated. - \param length Length of the source string. - \note Source cannot be JSON String Representation of JSON Pointer, e.g. In "/\u0000", \u0000 will not be unescaped. - */ -#endif - void Parse(const Ch* source, size_t length) { - RAPIDJSON_ASSERT(source != NULL); - RAPIDJSON_ASSERT(nameBuffer_ == 0); - RAPIDJSON_ASSERT(tokens_ == 0); - - // Create own allocator if user did not supply. - if (!allocator_) - ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); - - // Count number of '/' as tokenCount - tokenCount_ = 0; - for (const Ch* s = source; s != source + length; s++) - if (*s == '/') - tokenCount_++; - - Token* token = tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + length * sizeof(Ch))); - Ch* name = nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); - size_t i = 0; - - // Detect if it is a URI fragment - bool uriFragment = false; - if (source[i] == '#') { - uriFragment = true; - i++; - } - - if (i != length && source[i] != '/') { - parseErrorCode_ = kPointerParseErrorTokenMustBeginWithSolidus; - goto error; - } - - while (i < length) { - RAPIDJSON_ASSERT(source[i] == '/'); - i++; // consumes '/' - - token->name = name; - bool isNumber = true; - - while (i < length && source[i] != '/') { - Ch c = source[i]; - if (uriFragment) { - // Decoding percent-encoding for URI fragment - if (c == '%') { - PercentDecodeStream is(&source[i], source + length); - GenericInsituStringStream os(name); - Ch* begin = os.PutBegin(); - if (!Transcoder, EncodingType>().Validate(is, os) || !is.IsValid()) { - parseErrorCode_ = kPointerParseErrorInvalidPercentEncoding; - goto error; - } - size_t len = os.PutEnd(begin); - i += is.Tell() - 1; - if (len == 1) - c = *name; - else { - name += len; - isNumber = false; - i++; - continue; - } - } - else if (NeedPercentEncode(c)) { - parseErrorCode_ = kPointerParseErrorCharacterMustPercentEncode; - goto error; - } - } - - i++; - - // Escaping "~0" -> '~', "~1" -> '/' - if (c == '~') { - if (i < length) { - c = source[i]; - if (c == '0') c = '~'; - else if (c == '1') c = '/'; - else { - parseErrorCode_ = kPointerParseErrorInvalidEscape; - goto error; - } - i++; - } - else { - parseErrorCode_ = kPointerParseErrorInvalidEscape; - goto error; - } - } - - // First check for index: all of characters are digit - if (c < '0' || c > '9') - isNumber = false; - - *name++ = c; - } - token->length = static_cast(name - token->name); - if (token->length == 0) - isNumber = false; - *name++ = '\0'; // Null terminator - - // Second check for index: more than one digit cannot have leading zero - if (isNumber && token->length > 1 && token->name[0] == '0') - isNumber = false; - - // String to SizeType conversion - SizeType n = 0; - if (isNumber) { - for (size_t j = 0; j < token->length; j++) { - SizeType m = n * 10 + static_cast(token->name[j] - '0'); - if (m < n) { // overflow detection - isNumber = false; - break; - } - n = m; - } - } - - token->index = isNumber ? n : kPointerInvalidIndex; - token++; - } - - RAPIDJSON_ASSERT(name <= nameBuffer_ + length); // Should not overflow buffer - parseErrorCode_ = kPointerParseErrorNone; - return; - - error: - Allocator::Free(tokens_); - nameBuffer_ = 0; - tokens_ = 0; - tokenCount_ = 0; - parseErrorOffset_ = i; - return; - } - - //! Stringify to string or URI fragment representation. - /*! - \tparam uriFragment True for stringifying to URI fragment representation. False for string representation. - \tparam OutputStream type of output stream. - \param os The output stream. - */ - template - bool Stringify(OutputStream& os) const { - RAPIDJSON_ASSERT(IsValid()); - - if (uriFragment) - os.Put('#'); - - for (Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { - os.Put('/'); - for (size_t j = 0; j < t->length; j++) { - Ch c = t->name[j]; - if (c == '~') { - os.Put('~'); - os.Put('0'); - } - else if (c == '/') { - os.Put('~'); - os.Put('1'); - } - else if (uriFragment && NeedPercentEncode(c)) { - // Transcode to UTF8 sequence - GenericStringStream source(&t->name[j]); - PercentEncodeStream target(os); - if (!Transcoder >().Validate(source, target)) - return false; - j += source.Tell() - 1; - } - else - os.Put(c); - } - } - return true; - } - - //! A helper stream for decoding a percent-encoded sequence into code unit. - /*! - This stream decodes %XY triplet into code unit (0-255). - If it encounters invalid characters, it sets output code unit as 0 and - mark invalid, and to be checked by IsValid(). - */ - class PercentDecodeStream { - public: - typedef typename ValueType::Ch Ch; - - //! Constructor - /*! - \param source Start of the stream - \param end Past-the-end of the stream. - */ - PercentDecodeStream(const Ch* source, const Ch* end) : src_(source), head_(source), end_(end), valid_(true) {} - - Ch Take() { - if (*src_ != '%' || src_ + 3 > end_) { // %XY triplet - valid_ = false; - return 0; - } - src_++; - Ch c = 0; - for (int j = 0; j < 2; j++) { - c = static_cast(c << 4); - Ch h = *src_; - if (h >= '0' && h <= '9') c = static_cast(c + h - '0'); - else if (h >= 'A' && h <= 'F') c = static_cast(c + h - 'A' + 10); - else if (h >= 'a' && h <= 'f') c = static_cast(c + h - 'a' + 10); - else { - valid_ = false; - return 0; - } - src_++; - } - return c; - } - - size_t Tell() const { return static_cast(src_ - head_); } - bool IsValid() const { return valid_; } - - private: - const Ch* src_; //!< Current read position. - const Ch* head_; //!< Original head of the string. - const Ch* end_; //!< Past-the-end position. - bool valid_; //!< Whether the parsing is valid. - }; - - //! A helper stream to encode character (UTF-8 code unit) into percent-encoded sequence. - template - class PercentEncodeStream { - public: - PercentEncodeStream(OutputStream& os) : os_(os) {} - void Put(char c) { // UTF-8 must be byte - unsigned char u = static_cast(c); - static const char hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - os_.Put('%'); - os_.Put(static_cast(hexDigits[u >> 4])); - os_.Put(static_cast(hexDigits[u & 15])); - } - private: - OutputStream& os_; - }; - - Allocator* allocator_; //!< The current allocator. It is either user-supplied or equal to ownAllocator_. - Allocator* ownAllocator_; //!< Allocator owned by this Pointer. - Ch* nameBuffer_; //!< A buffer containing all names in tokens. - Token* tokens_; //!< A list of tokens. - size_t tokenCount_; //!< Number of tokens in tokens_. - size_t parseErrorOffset_; //!< Offset in code unit when parsing fail. - PointerParseErrorCode parseErrorCode_; //!< Parsing error code. -}; - -//! GenericPointer for Value (UTF-8, default allocator). -typedef GenericPointer Pointer; - -//!@name Helper functions for GenericPointer -//@{ - -////////////////////////////////////////////////////////////////////////////// - -template -typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer& pointer, typename T::AllocatorType& a) { - return pointer.Create(root, a); -} - -template -typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N], typename T::AllocatorType& a) { - return GenericPointer(source, N - 1).Create(root, a); -} - -// No allocator parameter - -template -typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const GenericPointer& pointer) { - return pointer.Create(document); -} - -template -typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const CharType(&source)[N]) { - return GenericPointer(source, N - 1).Create(document); -} - -////////////////////////////////////////////////////////////////////////////// - -template -typename T::ValueType* GetValueByPointer(T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { - return pointer.Get(root, unresolvedTokenIndex); -} - -template -const typename T::ValueType* GetValueByPointer(const T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { - return pointer.Get(root, unresolvedTokenIndex); -} - -template -typename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N], size_t* unresolvedTokenIndex = 0) { - return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); -} - -template -const typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N], size_t* unresolvedTokenIndex = 0) { - return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); -} - -////////////////////////////////////////////////////////////////////////////// - -template -typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { - return pointer.GetWithDefault(root, defaultValue, a); -} - -template -typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::Ch* defaultValue, typename T::AllocatorType& a) { - return pointer.GetWithDefault(root, defaultValue, a); -} - -#if RAPIDJSON_HAS_STDSTRING -template -typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const std::basic_string& defaultValue, typename T::AllocatorType& a) { - return pointer.GetWithDefault(root, defaultValue, a); -} -#endif - -template -RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) -GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, T2 defaultValue, typename T::AllocatorType& a) { - return pointer.GetWithDefault(root, defaultValue, a); -} - -template -typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { - return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); -} - -template -typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue, typename T::AllocatorType& a) { - return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); -} - -#if RAPIDJSON_HAS_STDSTRING -template -typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const std::basic_string& defaultValue, typename T::AllocatorType& a) { - return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); -} -#endif - -template -RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) -GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue, typename T::AllocatorType& a) { - return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); -} - -// No allocator parameter - -template -typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& defaultValue) { - return pointer.GetWithDefault(document, defaultValue); -} - -template -typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* defaultValue) { - return pointer.GetWithDefault(document, defaultValue); -} - -#if RAPIDJSON_HAS_STDSTRING -template -typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const std::basic_string& defaultValue) { - return pointer.GetWithDefault(document, defaultValue); -} -#endif - -template -RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) -GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, T2 defaultValue) { - return pointer.GetWithDefault(document, defaultValue); -} - -template -typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& defaultValue) { - return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); -} - -template -typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* defaultValue) { - return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); -} - -#if RAPIDJSON_HAS_STDSTRING -template -typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const std::basic_string& defaultValue) { - return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); -} -#endif - -template -RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) -GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], T2 defaultValue) { - return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); -} - -////////////////////////////////////////////////////////////////////////////// - -template -typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { - return pointer.Set(root, value, a); -} - -template -typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::ValueType& value, typename T::AllocatorType& a) { - return pointer.Set(root, value, a); -} - -template -typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::Ch* value, typename T::AllocatorType& a) { - return pointer.Set(root, value, a); -} - -#if RAPIDJSON_HAS_STDSTRING -template -typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const std::basic_string& value, typename T::AllocatorType& a) { - return pointer.Set(root, value, a); -} -#endif - -template -RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) -SetValueByPointer(T& root, const GenericPointer& pointer, T2 value, typename T::AllocatorType& a) { - return pointer.Set(root, value, a); -} - -template -typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { - return GenericPointer(source, N - 1).Set(root, value, a); -} - -template -typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::ValueType& value, typename T::AllocatorType& a) { - return GenericPointer(source, N - 1).Set(root, value, a); -} - -template -typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value, typename T::AllocatorType& a) { - return GenericPointer(source, N - 1).Set(root, value, a); -} - -#if RAPIDJSON_HAS_STDSTRING -template -typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const std::basic_string& value, typename T::AllocatorType& a) { - return GenericPointer(source, N - 1).Set(root, value, a); -} -#endif - -template -RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) -SetValueByPointer(T& root, const CharType(&source)[N], T2 value, typename T::AllocatorType& a) { - return GenericPointer(source, N - 1).Set(root, value, a); -} - -// No allocator parameter - -template -typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { - return pointer.Set(document, value); -} - -template -typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& value) { - return pointer.Set(document, value); -} - -template -typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* value) { - return pointer.Set(document, value); -} - -#if RAPIDJSON_HAS_STDSTRING -template -typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const std::basic_string& value) { - return pointer.Set(document, value); -} -#endif - -template -RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) -SetValueByPointer(DocumentType& document, const GenericPointer& pointer, T2 value) { - return pointer.Set(document, value); -} - -template -typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { - return GenericPointer(source, N - 1).Set(document, value); -} - -template -typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& value) { - return GenericPointer(source, N - 1).Set(document, value); -} - -template -typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* value) { - return GenericPointer(source, N - 1).Set(document, value); -} - -#if RAPIDJSON_HAS_STDSTRING -template -typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const std::basic_string& value) { - return GenericPointer(source, N - 1).Set(document, value); -} -#endif - -template -RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) -SetValueByPointer(DocumentType& document, const CharType(&source)[N], T2 value) { - return GenericPointer(source, N - 1).Set(document, value); -} - -////////////////////////////////////////////////////////////////////////////// - -template -typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { - return pointer.Swap(root, value, a); -} - -template -typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { - return GenericPointer(source, N - 1).Swap(root, value, a); -} - -template -typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { - return pointer.Swap(document, value); -} - -template -typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { - return GenericPointer(source, N - 1).Swap(document, value); -} - -////////////////////////////////////////////////////////////////////////////// - -template -bool EraseValueByPointer(T& root, const GenericPointer& pointer) { - return pointer.Erase(root); -} - -template -bool EraseValueByPointer(T& root, const CharType(&source)[N]) { - return GenericPointer(source, N - 1).Erase(root); -} - -//@} - -RAPIDJSON_NAMESPACE_END - -#if defined(__clang__) || defined(_MSC_VER) -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_POINTER_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/prettywriter.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/prettywriter.h deleted file mode 100644 index cea596e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/prettywriter.h +++ /dev/null @@ -1,277 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_PRETTYWRITER_H_ -#define RAPIDJSON_PRETTYWRITER_H_ - -#include "writer.h" - -#ifdef __GNUC__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(effc++) -#endif - -#if defined(__clang__) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(c++98-compat) -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -//! Combination of PrettyWriter format flags. -/*! \see PrettyWriter::SetFormatOptions - */ -enum PrettyFormatOptions { - kFormatDefault = 0, //!< Default pretty formatting. - kFormatSingleLineArray = 1 //!< Format arrays on a single line. -}; - -//! Writer with indentation and spacing. -/*! - \tparam OutputStream Type of output os. - \tparam SourceEncoding Encoding of source string. - \tparam TargetEncoding Encoding of output stream. - \tparam StackAllocator Type of allocator for allocating memory of stack. -*/ -template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> -class PrettyWriter : public Writer { -public: - typedef Writer Base; - typedef typename Base::Ch Ch; - - //! Constructor - /*! \param os Output stream. - \param allocator User supplied allocator. If it is null, it will create a private one. - \param levelDepth Initial capacity of stack. - */ - explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : - Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} - - - explicit PrettyWriter(StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : - Base(allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - PrettyWriter(PrettyWriter&& rhs) : - Base(std::forward(rhs)), indentChar_(rhs.indentChar_), indentCharCount_(rhs.indentCharCount_), formatOptions_(rhs.formatOptions_) {} -#endif - - //! Set custom indentation. - /*! \param indentChar Character for indentation. Must be whitespace character (' ', '\\t', '\\n', '\\r'). - \param indentCharCount Number of indent characters for each indentation level. - \note The default indentation is 4 spaces. - */ - PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) { - RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r'); - indentChar_ = indentChar; - indentCharCount_ = indentCharCount; - return *this; - } - - //! Set pretty writer formatting options. - /*! \param options Formatting options. - */ - PrettyWriter& SetFormatOptions(PrettyFormatOptions options) { - formatOptions_ = options; - return *this; - } - - /*! @name Implementation of Handler - \see Handler - */ - //@{ - - bool Null() { PrettyPrefix(kNullType); return Base::EndValue(Base::WriteNull()); } - bool Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); return Base::EndValue(Base::WriteBool(b)); } - bool Int(int i) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt(i)); } - bool Uint(unsigned u) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint(u)); } - bool Int64(int64_t i64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt64(i64)); } - bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint64(u64)); } - bool Double(double d) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteDouble(d)); } - - bool RawNumber(const Ch* str, SizeType length, bool copy = false) { - RAPIDJSON_ASSERT(str != 0); - (void)copy; - PrettyPrefix(kNumberType); - return Base::EndValue(Base::WriteString(str, length)); - } - - bool String(const Ch* str, SizeType length, bool copy = false) { - RAPIDJSON_ASSERT(str != 0); - (void)copy; - PrettyPrefix(kStringType); - return Base::EndValue(Base::WriteString(str, length)); - } - -#if RAPIDJSON_HAS_STDSTRING - bool String(const std::basic_string& str) { - return String(str.data(), SizeType(str.size())); - } -#endif - - bool StartObject() { - PrettyPrefix(kObjectType); - new (Base::level_stack_.template Push()) typename Base::Level(false); - return Base::WriteStartObject(); - } - - bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } - -#if RAPIDJSON_HAS_STDSTRING - bool Key(const std::basic_string& str) { - return Key(str.data(), SizeType(str.size())); - } -#endif - - bool EndObject(SizeType memberCount = 0) { - (void)memberCount; - RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); // not inside an Object - RAPIDJSON_ASSERT(!Base::level_stack_.template Top()->inArray); // currently inside an Array, not Object - RAPIDJSON_ASSERT(0 == Base::level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value - - bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; - - if (!empty) { - Base::os_->Put('\n'); - WriteIndent(); - } - bool ret = Base::EndValue(Base::WriteEndObject()); - (void)ret; - RAPIDJSON_ASSERT(ret == true); - if (Base::level_stack_.Empty()) // end of json text - Base::Flush(); - return true; - } - - bool StartArray() { - PrettyPrefix(kArrayType); - new (Base::level_stack_.template Push()) typename Base::Level(true); - return Base::WriteStartArray(); - } - - bool EndArray(SizeType memberCount = 0) { - (void)memberCount; - RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); - RAPIDJSON_ASSERT(Base::level_stack_.template Top()->inArray); - bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; - - if (!empty && !(formatOptions_ & kFormatSingleLineArray)) { - Base::os_->Put('\n'); - WriteIndent(); - } - bool ret = Base::EndValue(Base::WriteEndArray()); - (void)ret; - RAPIDJSON_ASSERT(ret == true); - if (Base::level_stack_.Empty()) // end of json text - Base::Flush(); - return true; - } - - //@} - - /*! @name Convenience extensions */ - //@{ - - //! Simpler but slower overload. - bool String(const Ch* str) { return String(str, internal::StrLen(str)); } - bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } - - //@} - - //! Write a raw JSON value. - /*! - For user to write a stringified JSON as a value. - - \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. - \param length Length of the json. - \param type Type of the root of json. - \note When using PrettyWriter::RawValue(), the result json may not be indented correctly. - */ - bool RawValue(const Ch* json, size_t length, Type type) { - RAPIDJSON_ASSERT(json != 0); - PrettyPrefix(type); - return Base::EndValue(Base::WriteRawValue(json, length)); - } - -protected: - void PrettyPrefix(Type type) { - (void)type; - if (Base::level_stack_.GetSize() != 0) { // this value is not at root - typename Base::Level* level = Base::level_stack_.template Top(); - - if (level->inArray) { - if (level->valueCount > 0) { - Base::os_->Put(','); // add comma if it is not the first element in array - if (formatOptions_ & kFormatSingleLineArray) - Base::os_->Put(' '); - } - - if (!(formatOptions_ & kFormatSingleLineArray)) { - Base::os_->Put('\n'); - WriteIndent(); - } - } - else { // in object - if (level->valueCount > 0) { - if (level->valueCount % 2 == 0) { - Base::os_->Put(','); - Base::os_->Put('\n'); - } - else { - Base::os_->Put(':'); - Base::os_->Put(' '); - } - } - else - Base::os_->Put('\n'); - - if (level->valueCount % 2 == 0) - WriteIndent(); - } - if (!level->inArray && level->valueCount % 2 == 0) - RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name - level->valueCount++; - } - else { - RAPIDJSON_ASSERT(!Base::hasRoot_); // Should only has one and only one root. - Base::hasRoot_ = true; - } - } - - void WriteIndent() { - size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_; - PutN(*Base::os_, static_cast(indentChar_), count); - } - - Ch indentChar_; - unsigned indentCharCount_; - PrettyFormatOptions formatOptions_; - -private: - // Prohibit copy constructor & assignment operator. - PrettyWriter(const PrettyWriter&); - PrettyWriter& operator=(const PrettyWriter&); -}; - -RAPIDJSON_NAMESPACE_END - -#if defined(__clang__) -RAPIDJSON_DIAG_POP -#endif - -#ifdef __GNUC__ -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/rapidjson.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/rapidjson.h deleted file mode 100644 index 89de838..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/rapidjson.h +++ /dev/null @@ -1,741 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_RAPIDJSON_H_ -#define RAPIDJSON_RAPIDJSON_H_ - -/*!\file rapidjson.h - \brief common definitions and configuration - - \see RAPIDJSON_CONFIG - */ - -/*! \defgroup RAPIDJSON_CONFIG RapidJSON configuration - \brief Configuration macros for library features - - Some RapidJSON features are configurable to adapt the library to a wide - variety of platforms, environments and usage scenarios. Most of the - features can be configured in terms of overridden or predefined - preprocessor macros at compile-time. - - Some additional customization is available in the \ref RAPIDJSON_ERRORS APIs. - - \note These macros should be given on the compiler command-line - (where applicable) to avoid inconsistent values when compiling - different translation units of a single application. - */ - -#include // malloc(), realloc(), free(), size_t -#include // memset(), memcpy(), memmove(), memcmp() - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_VERSION_STRING -// -// ALWAYS synchronize the following 3 macros with corresponding variables in /CMakeLists.txt. -// - -//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN -// token stringification -#define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x) -#define RAPIDJSON_DO_STRINGIFY(x) #x - -// token concatenation -#define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y) -#define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y) -#define RAPIDJSON_DO_JOIN2(X, Y) X##Y -//!@endcond - -/*! \def RAPIDJSON_MAJOR_VERSION - \ingroup RAPIDJSON_CONFIG - \brief Major version of RapidJSON in integer. -*/ -/*! \def RAPIDJSON_MINOR_VERSION - \ingroup RAPIDJSON_CONFIG - \brief Minor version of RapidJSON in integer. -*/ -/*! \def RAPIDJSON_PATCH_VERSION - \ingroup RAPIDJSON_CONFIG - \brief Patch version of RapidJSON in integer. -*/ -/*! \def RAPIDJSON_VERSION_STRING - \ingroup RAPIDJSON_CONFIG - \brief Version of RapidJSON in ".." string format. -*/ -#define RAPIDJSON_MAJOR_VERSION 1 -#define RAPIDJSON_MINOR_VERSION 1 -#define RAPIDJSON_PATCH_VERSION 0 -#define RAPIDJSON_VERSION_STRING \ - RAPIDJSON_STRINGIFY(RAPIDJSON_MAJOR_VERSION.RAPIDJSON_MINOR_VERSION.RAPIDJSON_PATCH_VERSION) - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_NAMESPACE_(BEGIN|END) -/*! \def RAPIDJSON_NAMESPACE - \ingroup RAPIDJSON_CONFIG - \brief provide custom rapidjson namespace - - In order to avoid symbol clashes and/or "One Definition Rule" errors - between multiple inclusions of (different versions of) RapidJSON in - a single binary, users can customize the name of the main RapidJSON - namespace. - - In case of a single nesting level, defining \c RAPIDJSON_NAMESPACE - to a custom name (e.g. \c MyRapidJSON) is sufficient. If multiple - levels are needed, both \ref RAPIDJSON_NAMESPACE_BEGIN and \ref - RAPIDJSON_NAMESPACE_END need to be defined as well: - - \code - // in some .cpp file - #define RAPIDJSON_NAMESPACE my::rapidjson - #define RAPIDJSON_NAMESPACE_BEGIN namespace my { namespace rapidjson { - #define RAPIDJSON_NAMESPACE_END } } - #include "rapidjson/..." - \endcode - - \see rapidjson - */ -/*! \def RAPIDJSON_NAMESPACE_BEGIN - \ingroup RAPIDJSON_CONFIG - \brief provide custom rapidjson namespace (opening expression) - \see RAPIDJSON_NAMESPACE -*/ -/*! \def RAPIDJSON_NAMESPACE_END - \ingroup RAPIDJSON_CONFIG - \brief provide custom rapidjson namespace (closing expression) - \see RAPIDJSON_NAMESPACE -*/ -#ifndef RAPIDJSON_NAMESPACE -#define RAPIDJSON_NAMESPACE rapidjson -#endif -#ifndef RAPIDJSON_NAMESPACE_BEGIN -#define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE { -#endif -#ifndef RAPIDJSON_NAMESPACE_END -#define RAPIDJSON_NAMESPACE_END } -#endif - -/////////////////////////////////////////////////////////////////////////////// -// __cplusplus macro - -//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN - -#if defined(_MSC_VER) -#define RAPIDJSON_CPLUSPLUS _MSVC_LANG -#else -#define RAPIDJSON_CPLUSPLUS __cplusplus -#endif - -//!@endcond - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_HAS_STDSTRING - -#ifndef RAPIDJSON_HAS_STDSTRING -#ifdef RAPIDJSON_DOXYGEN_RUNNING -#define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation -#else -#define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default -#endif -/*! \def RAPIDJSON_HAS_STDSTRING - \ingroup RAPIDJSON_CONFIG - \brief Enable RapidJSON support for \c std::string - - By defining this preprocessor symbol to \c 1, several convenience functions for using - \ref rapidjson::GenericValue with \c std::string are enabled, especially - for construction and comparison. - - \hideinitializer -*/ -#endif // !defined(RAPIDJSON_HAS_STDSTRING) - -#if RAPIDJSON_HAS_STDSTRING -#include -#endif // RAPIDJSON_HAS_STDSTRING - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_USE_MEMBERSMAP - -/*! \def RAPIDJSON_USE_MEMBERSMAP - \ingroup RAPIDJSON_CONFIG - \brief Enable RapidJSON support for object members handling in a \c std::multimap - - By defining this preprocessor symbol to \c 1, \ref rapidjson::GenericValue object - members are stored in a \c std::multimap for faster lookup and deletion times, a - trade off with a slightly slower insertion time and a small object allocat(or)ed - memory overhead. - - \hideinitializer -*/ -#ifndef RAPIDJSON_USE_MEMBERSMAP -#define RAPIDJSON_USE_MEMBERSMAP 0 // not by default -#endif - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_NO_INT64DEFINE - -/*! \def RAPIDJSON_NO_INT64DEFINE - \ingroup RAPIDJSON_CONFIG - \brief Use external 64-bit integer types. - - RapidJSON requires the 64-bit integer types \c int64_t and \c uint64_t types - to be available at global scope. - - If users have their own definition, define RAPIDJSON_NO_INT64DEFINE to - prevent RapidJSON from defining its own types. -*/ -#ifndef RAPIDJSON_NO_INT64DEFINE -//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN -#if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 -#include "msinttypes/stdint.h" -#include "msinttypes/inttypes.h" -#else -// Other compilers should have this. -#include -#include -#endif -//!@endcond -#ifdef RAPIDJSON_DOXYGEN_RUNNING -#define RAPIDJSON_NO_INT64DEFINE -#endif -#endif // RAPIDJSON_NO_INT64TYPEDEF - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_FORCEINLINE - -#ifndef RAPIDJSON_FORCEINLINE -//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN -#if defined(_MSC_VER) && defined(NDEBUG) -#define RAPIDJSON_FORCEINLINE __forceinline -#elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG) -#define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) -#else -#define RAPIDJSON_FORCEINLINE -#endif -//!@endcond -#endif // RAPIDJSON_FORCEINLINE - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_ENDIAN -#define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine -#define RAPIDJSON_BIGENDIAN 1 //!< Big endian machine - -//! Endianness of the machine. -/*! - \def RAPIDJSON_ENDIAN - \ingroup RAPIDJSON_CONFIG - - GCC 4.6 provided macro for detecting endianness of the target machine. But other - compilers may not have this. User can define RAPIDJSON_ENDIAN to either - \ref RAPIDJSON_LITTLEENDIAN or \ref RAPIDJSON_BIGENDIAN. - - Default detection implemented with reference to - \li https://gcc.gnu.org/onlinedocs/gcc-4.6.0/cpp/Common-Predefined-Macros.html - \li http://www.boost.org/doc/libs/1_42_0/boost/detail/endian.hpp -*/ -#ifndef RAPIDJSON_ENDIAN -// Detect with GCC 4.6's macro -# ifdef __BYTE_ORDER__ -# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN -# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ -# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN -# else -# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. -# endif // __BYTE_ORDER__ -// Detect with GLIBC's endian.h -# elif defined(__GLIBC__) -# include -# if (__BYTE_ORDER == __LITTLE_ENDIAN) -# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN -# elif (__BYTE_ORDER == __BIG_ENDIAN) -# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN -# else -# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. -# endif // __GLIBC__ -// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro -# elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) -# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN -# elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) -# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN -// Detect with architecture macros -# elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) -# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN -# elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__) -# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN -# elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64)) -# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN -# elif defined(RAPIDJSON_DOXYGEN_RUNNING) -# define RAPIDJSON_ENDIAN -# else -# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. -# endif -#endif // RAPIDJSON_ENDIAN - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_64BIT - -//! Whether using 64-bit architecture -#ifndef RAPIDJSON_64BIT -#if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__) -#define RAPIDJSON_64BIT 1 -#else -#define RAPIDJSON_64BIT 0 -#endif -#endif // RAPIDJSON_64BIT - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_ALIGN - -//! Data alignment of the machine. -/*! \ingroup RAPIDJSON_CONFIG - \param x pointer to align - - Some machines require strict data alignment. The default is 8 bytes. - User can customize by defining the RAPIDJSON_ALIGN function macro. -*/ -#ifndef RAPIDJSON_ALIGN -#define RAPIDJSON_ALIGN(x) (((x) + static_cast(7u)) & ~static_cast(7u)) -#endif - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_UINT64_C2 - -//! Construct a 64-bit literal by a pair of 32-bit integer. -/*! - 64-bit literal with or without ULL suffix is prone to compiler warnings. - UINT64_C() is C macro which cause compilation problems. - Use this macro to define 64-bit constants by a pair of 32-bit integer. -*/ -#ifndef RAPIDJSON_UINT64_C2 -#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast(high32) << 32) | static_cast(low32)) -#endif - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_48BITPOINTER_OPTIMIZATION - -//! Use only lower 48-bit address for some pointers. -/*! - \ingroup RAPIDJSON_CONFIG - - This optimization uses the fact that current X86-64 architecture only implement lower 48-bit virtual address. - The higher 16-bit can be used for storing other data. - \c GenericValue uses this optimization to reduce its size form 24 bytes to 16 bytes in 64-bit architecture. -*/ -#ifndef RAPIDJSON_48BITPOINTER_OPTIMIZATION -#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) -#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 -#else -#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 -#endif -#endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION - -#if RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 -#if RAPIDJSON_64BIT != 1 -#error RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when RAPIDJSON_64BIT=1 -#endif -#define RAPIDJSON_SETPOINTER(type, p, x) (p = reinterpret_cast((reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0xFFFF0000, 0x00000000))) | reinterpret_cast(reinterpret_cast(x)))) -#define RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast(reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF)))) -#else -#define RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) -#define RAPIDJSON_GETPOINTER(type, p) (p) -#endif - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_NEON/RAPIDJSON_SIMD - -/*! \def RAPIDJSON_SIMD - \ingroup RAPIDJSON_CONFIG - \brief Enable SSE2/SSE4.2/Neon optimization. - - RapidJSON supports optimized implementations for some parsing operations - based on the SSE2, SSE4.2 or NEon SIMD extensions on modern Intel - or ARM compatible processors. - - To enable these optimizations, three different symbols can be defined; - \code - // Enable SSE2 optimization. - #define RAPIDJSON_SSE2 - - // Enable SSE4.2 optimization. - #define RAPIDJSON_SSE42 - \endcode - - // Enable ARM Neon optimization. - #define RAPIDJSON_NEON - \endcode - - \c RAPIDJSON_SSE42 takes precedence over SSE2, if both are defined. - - If any of these symbols is defined, RapidJSON defines the macro - \c RAPIDJSON_SIMD to indicate the availability of the optimized code. -*/ -#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \ - || defined(RAPIDJSON_NEON) || defined(RAPIDJSON_DOXYGEN_RUNNING) -#define RAPIDJSON_SIMD -#endif - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_NO_SIZETYPEDEFINE - -#ifndef RAPIDJSON_NO_SIZETYPEDEFINE -/*! \def RAPIDJSON_NO_SIZETYPEDEFINE - \ingroup RAPIDJSON_CONFIG - \brief User-provided \c SizeType definition. - - In order to avoid using 32-bit size types for indexing strings and arrays, - define this preprocessor symbol and provide the type rapidjson::SizeType - before including RapidJSON: - \code - #define RAPIDJSON_NO_SIZETYPEDEFINE - namespace rapidjson { typedef ::std::size_t SizeType; } - #include "rapidjson/..." - \endcode - - \see rapidjson::SizeType -*/ -#ifdef RAPIDJSON_DOXYGEN_RUNNING -#define RAPIDJSON_NO_SIZETYPEDEFINE -#endif -RAPIDJSON_NAMESPACE_BEGIN -//! Size type (for string lengths, array sizes, etc.) -/*! RapidJSON uses 32-bit array/string indices even on 64-bit platforms, - instead of using \c size_t. Users may override the SizeType by defining - \ref RAPIDJSON_NO_SIZETYPEDEFINE. -*/ -typedef unsigned SizeType; -RAPIDJSON_NAMESPACE_END -#endif - -// always import std::size_t to rapidjson namespace -RAPIDJSON_NAMESPACE_BEGIN -using std::size_t; -RAPIDJSON_NAMESPACE_END - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_ASSERT - -//! Assertion. -/*! \ingroup RAPIDJSON_CONFIG - By default, rapidjson uses C \c assert() for internal assertions. - User can override it by defining RAPIDJSON_ASSERT(x) macro. - - \note Parsing errors are handled and can be customized by the - \ref RAPIDJSON_ERRORS APIs. -*/ -#ifndef RAPIDJSON_ASSERT -#include -#define RAPIDJSON_ASSERT(x) assert(x) -#endif // RAPIDJSON_ASSERT - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_STATIC_ASSERT - -// Prefer C++11 static_assert, if available -#ifndef RAPIDJSON_STATIC_ASSERT -#if RAPIDJSON_CPLUSPLUS >= 201103L || ( defined(_MSC_VER) && _MSC_VER >= 1800 ) -#define RAPIDJSON_STATIC_ASSERT(x) \ - static_assert(x, RAPIDJSON_STRINGIFY(x)) -#endif // C++11 -#endif // RAPIDJSON_STATIC_ASSERT - -// Adopt C++03 implementation from boost -#ifndef RAPIDJSON_STATIC_ASSERT -#ifndef __clang__ -//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN -#endif -RAPIDJSON_NAMESPACE_BEGIN -template struct STATIC_ASSERTION_FAILURE; -template <> struct STATIC_ASSERTION_FAILURE { enum { value = 1 }; }; -template struct StaticAssertTest {}; -RAPIDJSON_NAMESPACE_END - -#if defined(__GNUC__) || defined(__clang__) -#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) -#else -#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE -#endif -#ifndef __clang__ -//!@endcond -#endif - -/*! \def RAPIDJSON_STATIC_ASSERT - \brief (Internal) macro to check for conditions at compile-time - \param x compile-time condition - \hideinitializer - */ -#define RAPIDJSON_STATIC_ASSERT(x) \ - typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ - sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE)> \ - RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE -#endif // RAPIDJSON_STATIC_ASSERT - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_LIKELY, RAPIDJSON_UNLIKELY - -//! Compiler branching hint for expression with high probability to be true. -/*! - \ingroup RAPIDJSON_CONFIG - \param x Boolean expression likely to be true. -*/ -#ifndef RAPIDJSON_LIKELY -#if defined(__GNUC__) || defined(__clang__) -#define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) -#else -#define RAPIDJSON_LIKELY(x) (x) -#endif -#endif - -//! Compiler branching hint for expression with low probability to be true. -/*! - \ingroup RAPIDJSON_CONFIG - \param x Boolean expression unlikely to be true. -*/ -#ifndef RAPIDJSON_UNLIKELY -#if defined(__GNUC__) || defined(__clang__) -#define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) -#else -#define RAPIDJSON_UNLIKELY(x) (x) -#endif -#endif - -/////////////////////////////////////////////////////////////////////////////// -// Helpers - -//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN - -#define RAPIDJSON_MULTILINEMACRO_BEGIN do { -#define RAPIDJSON_MULTILINEMACRO_END \ -} while((void)0, 0) - -// adopted from Boost -#define RAPIDJSON_VERSION_CODE(x,y,z) \ - (((x)*100000) + ((y)*100) + (z)) - -#if defined(__has_builtin) -#define RAPIDJSON_HAS_BUILTIN(x) __has_builtin(x) -#else -#define RAPIDJSON_HAS_BUILTIN(x) 0 -#endif - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_DIAG_PUSH/POP, RAPIDJSON_DIAG_OFF - -#if defined(__GNUC__) -#define RAPIDJSON_GNUC \ - RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) -#endif - -#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0)) - -#define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) -#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) -#define RAPIDJSON_DIAG_OFF(x) \ - RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x))) - -// push/pop support in Clang and GCC>=4.6 -#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) -#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) -#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) -#else // GCC >= 4.2, < 4.6 -#define RAPIDJSON_DIAG_PUSH /* ignored */ -#define RAPIDJSON_DIAG_POP /* ignored */ -#endif - -#elif defined(_MSC_VER) - -// pragma (MSVC specific) -#define RAPIDJSON_PRAGMA(x) __pragma(x) -#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) - -#define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x) -#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) -#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) - -#else - -#define RAPIDJSON_DIAG_OFF(x) /* ignored */ -#define RAPIDJSON_DIAG_PUSH /* ignored */ -#define RAPIDJSON_DIAG_POP /* ignored */ - -#endif // RAPIDJSON_DIAG_* - -/////////////////////////////////////////////////////////////////////////////// -// C++11 features - -#ifndef RAPIDJSON_HAS_CXX11 -#define RAPIDJSON_HAS_CXX11 (RAPIDJSON_CPLUSPLUS >= 201103L) -#endif - -#ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS -#if RAPIDJSON_HAS_CXX11 -#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 -#elif defined(__clang__) -#if __has_feature(cxx_rvalue_references) && \ - (defined(_MSC_VER) || defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306) -#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 -#else -#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 -#endif -#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ - (defined(_MSC_VER) && _MSC_VER >= 1600) || \ - (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) - -#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 -#else -#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 -#endif -#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS -#include // std::move -#endif - -#ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT -#if RAPIDJSON_HAS_CXX11 -#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 -#elif defined(__clang__) -#define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) -#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ - (defined(_MSC_VER) && _MSC_VER >= 1900) || \ - (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) -#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 -#else -#define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 -#endif -#endif -#ifndef RAPIDJSON_NOEXCEPT -#if RAPIDJSON_HAS_CXX11_NOEXCEPT -#define RAPIDJSON_NOEXCEPT noexcept -#else -#define RAPIDJSON_NOEXCEPT throw() -#endif // RAPIDJSON_HAS_CXX11_NOEXCEPT -#endif - -// no automatic detection, yet -#ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS -#if (defined(_MSC_VER) && _MSC_VER >= 1700) -#define RAPIDJSON_HAS_CXX11_TYPETRAITS 1 -#else -#define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 -#endif -#endif - -#ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR -#if defined(__clang__) -#define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) -#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ - (defined(_MSC_VER) && _MSC_VER >= 1700) || \ - (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) -#define RAPIDJSON_HAS_CXX11_RANGE_FOR 1 -#else -#define RAPIDJSON_HAS_CXX11_RANGE_FOR 0 -#endif -#endif // RAPIDJSON_HAS_CXX11_RANGE_FOR - -/////////////////////////////////////////////////////////////////////////////// -// C++17 features - -#ifndef RAPIDJSON_HAS_CXX17 -#define RAPIDJSON_HAS_CXX17 (RAPIDJSON_CPLUSPLUS >= 201703L) -#endif - -#if RAPIDJSON_HAS_CXX17 -# define RAPIDJSON_DELIBERATE_FALLTHROUGH [[fallthrough]] -#elif defined(__has_cpp_attribute) -# if __has_cpp_attribute(clang::fallthrough) -# define RAPIDJSON_DELIBERATE_FALLTHROUGH [[clang::fallthrough]] -# elif __has_cpp_attribute(fallthrough) -# define RAPIDJSON_DELIBERATE_FALLTHROUGH __attribute__((fallthrough)) -# else -# define RAPIDJSON_DELIBERATE_FALLTHROUGH -# endif -#else -# define RAPIDJSON_DELIBERATE_FALLTHROUGH -#endif - -//!@endcond - -//! Assertion (in non-throwing contexts). - /*! \ingroup RAPIDJSON_CONFIG - Some functions provide a \c noexcept guarantee, if the compiler supports it. - In these cases, the \ref RAPIDJSON_ASSERT macro cannot be overridden to - throw an exception. This macro adds a separate customization point for - such cases. - - Defaults to C \c assert() (as \ref RAPIDJSON_ASSERT), if \c noexcept is - supported, and to \ref RAPIDJSON_ASSERT otherwise. - */ - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_NOEXCEPT_ASSERT - -#ifndef RAPIDJSON_NOEXCEPT_ASSERT -#ifdef RAPIDJSON_ASSERT_THROWS -#include -#define RAPIDJSON_NOEXCEPT_ASSERT(x) assert(x) -#else -#define RAPIDJSON_NOEXCEPT_ASSERT(x) RAPIDJSON_ASSERT(x) -#endif // RAPIDJSON_ASSERT_THROWS -#endif // RAPIDJSON_NOEXCEPT_ASSERT - -/////////////////////////////////////////////////////////////////////////////// -// malloc/realloc/free - -#ifndef RAPIDJSON_MALLOC -///! customization point for global \c malloc -#define RAPIDJSON_MALLOC(size) std::malloc(size) -#endif -#ifndef RAPIDJSON_REALLOC -///! customization point for global \c realloc -#define RAPIDJSON_REALLOC(ptr, new_size) std::realloc(ptr, new_size) -#endif -#ifndef RAPIDJSON_FREE -///! customization point for global \c free -#define RAPIDJSON_FREE(ptr) std::free(ptr) -#endif - -/////////////////////////////////////////////////////////////////////////////// -// new/delete - -#ifndef RAPIDJSON_NEW -///! customization point for global \c new -#define RAPIDJSON_NEW(TypeName) new TypeName -#endif -#ifndef RAPIDJSON_DELETE -///! customization point for global \c delete -#define RAPIDJSON_DELETE(x) delete x -#endif - -/////////////////////////////////////////////////////////////////////////////// -// Type - -/*! \namespace rapidjson - \brief main RapidJSON namespace - \see RAPIDJSON_NAMESPACE -*/ -RAPIDJSON_NAMESPACE_BEGIN - -//! Type of JSON value -enum Type { - kNullType = 0, //!< null - kFalseType = 1, //!< false - kTrueType = 2, //!< true - kObjectType = 3, //!< object - kArrayType = 4, //!< array - kStringType = 5, //!< string - kNumberType = 6 //!< number -}; - -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/reader.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/reader.h deleted file mode 100644 index 86c1f28..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/reader.h +++ /dev/null @@ -1,2246 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_READER_H_ -#define RAPIDJSON_READER_H_ - -/*! \file reader.h */ - -#include "allocators.h" -#include "stream.h" -#include "encodedstream.h" -#include "internal/clzll.h" -#include "internal/meta.h" -#include "internal/stack.h" -#include "internal/strtod.h" -#include - -#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) -#include -#pragma intrinsic(_BitScanForward) -#endif -#ifdef RAPIDJSON_SSE42 -#include -#elif defined(RAPIDJSON_SSE2) -#include -#elif defined(RAPIDJSON_NEON) -#include -#endif - -#ifdef __clang__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(old-style-cast) -RAPIDJSON_DIAG_OFF(padded) -RAPIDJSON_DIAG_OFF(switch-enum) -#elif defined(_MSC_VER) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant -RAPIDJSON_DIAG_OFF(4702) // unreachable code -#endif - -#ifdef __GNUC__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(effc++) -#endif - -//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN -#define RAPIDJSON_NOTHING /* deliberately empty */ -#ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN -#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \ - RAPIDJSON_MULTILINEMACRO_BEGIN \ - if (RAPIDJSON_UNLIKELY(HasParseError())) { return value; } \ - RAPIDJSON_MULTILINEMACRO_END -#endif -#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \ - RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING) -//!@endcond - -/*! \def RAPIDJSON_PARSE_ERROR_NORETURN - \ingroup RAPIDJSON_ERRORS - \brief Macro to indicate a parse error. - \param parseErrorCode \ref rapidjson::ParseErrorCode of the error - \param offset position of the error in JSON input (\c size_t) - - This macros can be used as a customization point for the internal - error handling mechanism of RapidJSON. - - A common usage model is to throw an exception instead of requiring the - caller to explicitly check the \ref rapidjson::GenericReader::Parse's - return value: - - \code - #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode,offset) \ - throw ParseException(parseErrorCode, #parseErrorCode, offset) - - #include // std::runtime_error - #include "rapidjson/error/error.h" // rapidjson::ParseResult - - struct ParseException : std::runtime_error, rapidjson::ParseResult { - ParseException(rapidjson::ParseErrorCode code, const char* msg, size_t offset) - : std::runtime_error(msg), ParseResult(code, offset) {} - }; - - #include "rapidjson/reader.h" - \endcode - - \see RAPIDJSON_PARSE_ERROR, rapidjson::GenericReader::Parse - */ -#ifndef RAPIDJSON_PARSE_ERROR_NORETURN -#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \ - RAPIDJSON_MULTILINEMACRO_BEGIN \ - RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \ - SetParseError(parseErrorCode, offset); \ - RAPIDJSON_MULTILINEMACRO_END -#endif - -/*! \def RAPIDJSON_PARSE_ERROR - \ingroup RAPIDJSON_ERRORS - \brief (Internal) macro to indicate and handle a parse error. - \param parseErrorCode \ref rapidjson::ParseErrorCode of the error - \param offset position of the error in JSON input (\c size_t) - - Invokes RAPIDJSON_PARSE_ERROR_NORETURN and stops the parsing. - - \see RAPIDJSON_PARSE_ERROR_NORETURN - \hideinitializer - */ -#ifndef RAPIDJSON_PARSE_ERROR -#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \ - RAPIDJSON_MULTILINEMACRO_BEGIN \ - RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \ - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \ - RAPIDJSON_MULTILINEMACRO_END -#endif - -#include "error/error.h" // ParseErrorCode, ParseResult - -RAPIDJSON_NAMESPACE_BEGIN - -/////////////////////////////////////////////////////////////////////////////// -// ParseFlag - -/*! \def RAPIDJSON_PARSE_DEFAULT_FLAGS - \ingroup RAPIDJSON_CONFIG - \brief User-defined kParseDefaultFlags definition. - - User can define this as any \c ParseFlag combinations. -*/ -#ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS -#define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags -#endif - -//! Combination of parseFlags -/*! \see Reader::Parse, Document::Parse, Document::ParseInsitu, Document::ParseStream - */ -enum ParseFlag { - kParseNoFlags = 0, //!< No flags are set. - kParseInsituFlag = 1, //!< In-situ(destructive) parsing. - kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings. - kParseIterativeFlag = 4, //!< Iterative(constant complexity in terms of function call stack size) parsing. - kParseStopWhenDoneFlag = 8, //!< After parsing a complete JSON root from stream, stop further processing the rest of stream. When this flag is used, parser will not generate kParseErrorDocumentRootNotSingular error. - kParseFullPrecisionFlag = 16, //!< Parse number in full precision (but slower). - kParseCommentsFlag = 32, //!< Allow one-line (//) and multi-line (/**/) comments. - kParseNumbersAsStringsFlag = 64, //!< Parse all numbers (ints/doubles) as strings. - kParseTrailingCommasFlag = 128, //!< Allow trailing commas at the end of objects and arrays. - kParseNanAndInfFlag = 256, //!< Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles. - kParseEscapedApostropheFlag = 512, //!< Allow escaped apostrophe in strings. - kParseDefaultFlags = RAPIDJSON_PARSE_DEFAULT_FLAGS //!< Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS -}; - -/////////////////////////////////////////////////////////////////////////////// -// Handler - -/*! \class rapidjson::Handler - \brief Concept for receiving events from GenericReader upon parsing. - The functions return true if no error occurs. If they return false, - the event publisher should terminate the process. -\code -concept Handler { - typename Ch; - - bool Null(); - bool Bool(bool b); - bool Int(int i); - bool Uint(unsigned i); - bool Int64(int64_t i); - bool Uint64(uint64_t i); - bool Double(double d); - /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) - bool RawNumber(const Ch* str, SizeType length, bool copy); - bool String(const Ch* str, SizeType length, bool copy); - bool StartObject(); - bool Key(const Ch* str, SizeType length, bool copy); - bool EndObject(SizeType memberCount); - bool StartArray(); - bool EndArray(SizeType elementCount); -}; -\endcode -*/ -/////////////////////////////////////////////////////////////////////////////// -// BaseReaderHandler - -//! Default implementation of Handler. -/*! This can be used as base class of any reader handler. - \note implements Handler concept -*/ -template, typename Derived = void> -struct BaseReaderHandler { - typedef typename Encoding::Ch Ch; - - typedef typename internal::SelectIf, BaseReaderHandler, Derived>::Type Override; - - bool Default() { return true; } - bool Null() { return static_cast(*this).Default(); } - bool Bool(bool) { return static_cast(*this).Default(); } - bool Int(int) { return static_cast(*this).Default(); } - bool Uint(unsigned) { return static_cast(*this).Default(); } - bool Int64(int64_t) { return static_cast(*this).Default(); } - bool Uint64(uint64_t) { return static_cast(*this).Default(); } - bool Double(double) { return static_cast(*this).Default(); } - /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) - bool RawNumber(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } - bool String(const Ch*, SizeType, bool) { return static_cast(*this).Default(); } - bool StartObject() { return static_cast(*this).Default(); } - bool Key(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } - bool EndObject(SizeType) { return static_cast(*this).Default(); } - bool StartArray() { return static_cast(*this).Default(); } - bool EndArray(SizeType) { return static_cast(*this).Default(); } -}; - -/////////////////////////////////////////////////////////////////////////////// -// StreamLocalCopy - -namespace internal { - -template::copyOptimization> -class StreamLocalCopy; - -//! Do copy optimization. -template -class StreamLocalCopy { -public: - StreamLocalCopy(Stream& original) : s(original), original_(original) {} - ~StreamLocalCopy() { original_ = s; } - - Stream s; - -private: - StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; - - Stream& original_; -}; - -//! Keep reference. -template -class StreamLocalCopy { -public: - StreamLocalCopy(Stream& original) : s(original) {} - - Stream& s; - -private: - StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; -}; - -} // namespace internal - -/////////////////////////////////////////////////////////////////////////////// -// SkipWhitespace - -//! Skip the JSON white spaces in a stream. -/*! \param is A input stream for skipping white spaces. - \note This function has SSE2/SSE4.2 specialization. -*/ -template -void SkipWhitespace(InputStream& is) { - internal::StreamLocalCopy copy(is); - InputStream& s(copy.s); - - typename InputStream::Ch c; - while ((c = s.Peek()) == ' ' || c == '\n' || c == '\r' || c == '\t') - s.Take(); -} - -inline const char* SkipWhitespace(const char* p, const char* end) { - while (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) - ++p; - return p; -} - -#ifdef RAPIDJSON_SSE42 -//! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. -inline const char *SkipWhitespace_SIMD(const char* p) { - // Fast return for single non-whitespace - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') - ++p; - else - return p; - - // 16-byte align to the next boundary - const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); - while (p != nextAligned) - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') - ++p; - else - return p; - - // The rest of string using SIMD - static const char whitespace[16] = " \n\r\t"; - const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); - - for (;; p += 16) { - const __m128i s = _mm_load_si128(reinterpret_cast(p)); - const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); - if (r != 16) // some of characters is non-whitespace - return p + r; - } -} - -inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { - // Fast return for single non-whitespace - if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) - ++p; - else - return p; - - // The middle of string using SIMD - static const char whitespace[16] = " \n\r\t"; - const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); - - for (; p <= end - 16; p += 16) { - const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); - const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); - if (r != 16) // some of characters is non-whitespace - return p + r; - } - - return SkipWhitespace(p, end); -} - -#elif defined(RAPIDJSON_SSE2) - -//! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. -inline const char *SkipWhitespace_SIMD(const char* p) { - // Fast return for single non-whitespace - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') - ++p; - else - return p; - - // 16-byte align to the next boundary - const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); - while (p != nextAligned) - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') - ++p; - else - return p; - - // The rest of string - #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } - static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; - #undef C16 - - const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); - const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); - const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); - const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); - - for (;; p += 16) { - const __m128i s = _mm_load_si128(reinterpret_cast(p)); - __m128i x = _mm_cmpeq_epi8(s, w0); - x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); - x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); - x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); - unsigned short r = static_cast(~_mm_movemask_epi8(x)); - if (r != 0) { // some of characters may be non-whitespace -#ifdef _MSC_VER // Find the index of first non-whitespace - unsigned long offset; - _BitScanForward(&offset, r); - return p + offset; -#else - return p + __builtin_ffs(r) - 1; -#endif - } - } -} - -inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { - // Fast return for single non-whitespace - if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) - ++p; - else - return p; - - // The rest of string - #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } - static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; - #undef C16 - - const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); - const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); - const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); - const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); - - for (; p <= end - 16; p += 16) { - const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); - __m128i x = _mm_cmpeq_epi8(s, w0); - x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); - x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); - x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); - unsigned short r = static_cast(~_mm_movemask_epi8(x)); - if (r != 0) { // some of characters may be non-whitespace -#ifdef _MSC_VER // Find the index of first non-whitespace - unsigned long offset; - _BitScanForward(&offset, r); - return p + offset; -#else - return p + __builtin_ffs(r) - 1; -#endif - } - } - - return SkipWhitespace(p, end); -} - -#elif defined(RAPIDJSON_NEON) - -//! Skip whitespace with ARM Neon instructions, testing 16 8-byte characters at once. -inline const char *SkipWhitespace_SIMD(const char* p) { - // Fast return for single non-whitespace - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') - ++p; - else - return p; - - // 16-byte align to the next boundary - const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); - while (p != nextAligned) - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') - ++p; - else - return p; - - const uint8x16_t w0 = vmovq_n_u8(' '); - const uint8x16_t w1 = vmovq_n_u8('\n'); - const uint8x16_t w2 = vmovq_n_u8('\r'); - const uint8x16_t w3 = vmovq_n_u8('\t'); - - for (;; p += 16) { - const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); - uint8x16_t x = vceqq_u8(s, w0); - x = vorrq_u8(x, vceqq_u8(s, w1)); - x = vorrq_u8(x, vceqq_u8(s, w2)); - x = vorrq_u8(x, vceqq_u8(s, w3)); - - x = vmvnq_u8(x); // Negate - x = vrev64q_u8(x); // Rev in 64 - uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract - uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract - - if (low == 0) { - if (high != 0) { - uint32_t lz = internal::clzll(high); - return p + 8 + (lz >> 3); - } - } else { - uint32_t lz = internal::clzll(low); - return p + (lz >> 3); - } - } -} - -inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { - // Fast return for single non-whitespace - if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) - ++p; - else - return p; - - const uint8x16_t w0 = vmovq_n_u8(' '); - const uint8x16_t w1 = vmovq_n_u8('\n'); - const uint8x16_t w2 = vmovq_n_u8('\r'); - const uint8x16_t w3 = vmovq_n_u8('\t'); - - for (; p <= end - 16; p += 16) { - const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); - uint8x16_t x = vceqq_u8(s, w0); - x = vorrq_u8(x, vceqq_u8(s, w1)); - x = vorrq_u8(x, vceqq_u8(s, w2)); - x = vorrq_u8(x, vceqq_u8(s, w3)); - - x = vmvnq_u8(x); // Negate - x = vrev64q_u8(x); // Rev in 64 - uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract - uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract - - if (low == 0) { - if (high != 0) { - uint32_t lz = internal::clzll(high); - return p + 8 + (lz >> 3); - } - } else { - uint32_t lz = internal::clzll(low); - return p + (lz >> 3); - } - } - - return SkipWhitespace(p, end); -} - -#endif // RAPIDJSON_NEON - -#ifdef RAPIDJSON_SIMD -//! Template function specialization for InsituStringStream -template<> inline void SkipWhitespace(InsituStringStream& is) { - is.src_ = const_cast(SkipWhitespace_SIMD(is.src_)); -} - -//! Template function specialization for StringStream -template<> inline void SkipWhitespace(StringStream& is) { - is.src_ = SkipWhitespace_SIMD(is.src_); -} - -template<> inline void SkipWhitespace(EncodedInputStream, MemoryStream>& is) { - is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_); -} -#endif // RAPIDJSON_SIMD - -/////////////////////////////////////////////////////////////////////////////// -// GenericReader - -//! SAX-style JSON parser. Use \ref Reader for UTF8 encoding and default allocator. -/*! GenericReader parses JSON text from a stream, and send events synchronously to an - object implementing Handler concept. - - It needs to allocate a stack for storing a single decoded string during - non-destructive parsing. - - For in-situ parsing, the decoded string is directly written to the source - text string, no temporary buffer is required. - - A GenericReader object can be reused for parsing multiple JSON text. - - \tparam SourceEncoding Encoding of the input stream. - \tparam TargetEncoding Encoding of the parse output. - \tparam StackAllocator Allocator type for stack. -*/ -template -class GenericReader { -public: - typedef typename SourceEncoding::Ch Ch; //!< SourceEncoding character type - - //! Constructor. - /*! \param stackAllocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing) - \param stackCapacity stack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing) - */ - GenericReader(StackAllocator* stackAllocator = 0, size_t stackCapacity = kDefaultStackCapacity) : - stack_(stackAllocator, stackCapacity), parseResult_(), state_(IterativeParsingStartState) {} - - //! Parse JSON text. - /*! \tparam parseFlags Combination of \ref ParseFlag. - \tparam InputStream Type of input stream, implementing Stream concept. - \tparam Handler Type of handler, implementing Handler concept. - \param is Input stream to be parsed. - \param handler The handler to receive events. - \return Whether the parsing is successful. - */ - template - ParseResult Parse(InputStream& is, Handler& handler) { - if (parseFlags & kParseIterativeFlag) - return IterativeParse(is, handler); - - parseResult_.Clear(); - - ClearStackOnExit scope(*this); - - SkipWhitespaceAndComments(is); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); - - if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) { - RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentEmpty, is.Tell()); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); - } - else { - ParseValue(is, handler); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); - - if (!(parseFlags & kParseStopWhenDoneFlag)) { - SkipWhitespaceAndComments(is); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); - - if (RAPIDJSON_UNLIKELY(is.Peek() != '\0')) { - RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell()); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); - } - } - } - - return parseResult_; - } - - //! Parse JSON text (with \ref kParseDefaultFlags) - /*! \tparam InputStream Type of input stream, implementing Stream concept - \tparam Handler Type of handler, implementing Handler concept. - \param is Input stream to be parsed. - \param handler The handler to receive events. - \return Whether the parsing is successful. - */ - template - ParseResult Parse(InputStream& is, Handler& handler) { - return Parse(is, handler); - } - - //! Initialize JSON text token-by-token parsing - /*! - */ - void IterativeParseInit() { - parseResult_.Clear(); - state_ = IterativeParsingStartState; - } - - //! Parse one token from JSON text - /*! \tparam InputStream Type of input stream, implementing Stream concept - \tparam Handler Type of handler, implementing Handler concept. - \param is Input stream to be parsed. - \param handler The handler to receive events. - \return Whether the parsing is successful. - */ - template - bool IterativeParseNext(InputStream& is, Handler& handler) { - while (RAPIDJSON_LIKELY(is.Peek() != '\0')) { - SkipWhitespaceAndComments(is); - - Token t = Tokenize(is.Peek()); - IterativeParsingState n = Predict(state_, t); - IterativeParsingState d = Transit(state_, t, n, is, handler); - - // If we've finished or hit an error... - if (RAPIDJSON_UNLIKELY(IsIterativeParsingCompleteState(d))) { - // Report errors. - if (d == IterativeParsingErrorState) { - HandleError(state_, is); - return false; - } - - // Transition to the finish state. - RAPIDJSON_ASSERT(d == IterativeParsingFinishState); - state_ = d; - - // If StopWhenDone is not set... - if (!(parseFlags & kParseStopWhenDoneFlag)) { - // ... and extra non-whitespace data is found... - SkipWhitespaceAndComments(is); - if (is.Peek() != '\0') { - // ... this is considered an error. - HandleError(state_, is); - return false; - } - } - - // Success! We are done! - return true; - } - - // Transition to the new state. - state_ = d; - - // If we parsed anything other than a delimiter, we invoked the handler, so we can return true now. - if (!IsIterativeParsingDelimiterState(n)) - return true; - } - - // We reached the end of file. - stack_.Clear(); - - if (state_ != IterativeParsingFinishState) { - HandleError(state_, is); - return false; - } - - return true; - } - - //! Check if token-by-token parsing JSON text is complete - /*! \return Whether the JSON has been fully decoded. - */ - RAPIDJSON_FORCEINLINE bool IterativeParseComplete() const { - return IsIterativeParsingCompleteState(state_); - } - - //! Whether a parse error has occurred in the last parsing. - bool HasParseError() const { return parseResult_.IsError(); } - - //! Get the \ref ParseErrorCode of last parsing. - ParseErrorCode GetParseErrorCode() const { return parseResult_.Code(); } - - //! Get the position of last parsing error in input, 0 otherwise. - size_t GetErrorOffset() const { return parseResult_.Offset(); } - -protected: - void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); } - -private: - // Prohibit copy constructor & assignment operator. - GenericReader(const GenericReader&); - GenericReader& operator=(const GenericReader&); - - void ClearStack() { stack_.Clear(); } - - // clear stack on any exit from ParseStream, e.g. due to exception - struct ClearStackOnExit { - explicit ClearStackOnExit(GenericReader& r) : r_(r) {} - ~ClearStackOnExit() { r_.ClearStack(); } - private: - GenericReader& r_; - ClearStackOnExit(const ClearStackOnExit&); - ClearStackOnExit& operator=(const ClearStackOnExit&); - }; - - template - void SkipWhitespaceAndComments(InputStream& is) { - SkipWhitespace(is); - - if (parseFlags & kParseCommentsFlag) { - while (RAPIDJSON_UNLIKELY(Consume(is, '/'))) { - if (Consume(is, '*')) { - while (true) { - if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) - RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); - else if (Consume(is, '*')) { - if (Consume(is, '/')) - break; - } - else - is.Take(); - } - } - else if (RAPIDJSON_LIKELY(Consume(is, '/'))) - while (is.Peek() != '\0' && is.Take() != '\n') {} - else - RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); - - SkipWhitespace(is); - } - } - } - - // Parse object: { string : value, ... } - template - void ParseObject(InputStream& is, Handler& handler) { - RAPIDJSON_ASSERT(is.Peek() == '{'); - is.Take(); // Skip '{' - - if (RAPIDJSON_UNLIKELY(!handler.StartObject())) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); - - SkipWhitespaceAndComments(is); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - - if (Consume(is, '}')) { - if (RAPIDJSON_UNLIKELY(!handler.EndObject(0))) // empty object - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); - return; - } - - for (SizeType memberCount = 0;;) { - if (RAPIDJSON_UNLIKELY(is.Peek() != '"')) - RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); - - ParseString(is, handler, true); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - - SkipWhitespaceAndComments(is); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - - if (RAPIDJSON_UNLIKELY(!Consume(is, ':'))) - RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); - - SkipWhitespaceAndComments(is); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - - ParseValue(is, handler); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - - SkipWhitespaceAndComments(is); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - - ++memberCount; - - switch (is.Peek()) { - case ',': - is.Take(); - SkipWhitespaceAndComments(is); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - break; - case '}': - is.Take(); - if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); - return; - default: - RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); break; // This useless break is only for making warning and coverage happy - } - - if (parseFlags & kParseTrailingCommasFlag) { - if (is.Peek() == '}') { - if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); - is.Take(); - return; - } - } - } - } - - // Parse array: [ value, ... ] - template - void ParseArray(InputStream& is, Handler& handler) { - RAPIDJSON_ASSERT(is.Peek() == '['); - is.Take(); // Skip '[' - - if (RAPIDJSON_UNLIKELY(!handler.StartArray())) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); - - SkipWhitespaceAndComments(is); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - - if (Consume(is, ']')) { - if (RAPIDJSON_UNLIKELY(!handler.EndArray(0))) // empty array - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); - return; - } - - for (SizeType elementCount = 0;;) { - ParseValue(is, handler); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - - ++elementCount; - SkipWhitespaceAndComments(is); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - - if (Consume(is, ',')) { - SkipWhitespaceAndComments(is); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - } - else if (Consume(is, ']')) { - if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); - return; - } - else - RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); - - if (parseFlags & kParseTrailingCommasFlag) { - if (is.Peek() == ']') { - if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); - is.Take(); - return; - } - } - } - } - - template - void ParseNull(InputStream& is, Handler& handler) { - RAPIDJSON_ASSERT(is.Peek() == 'n'); - is.Take(); - - if (RAPIDJSON_LIKELY(Consume(is, 'u') && Consume(is, 'l') && Consume(is, 'l'))) { - if (RAPIDJSON_UNLIKELY(!handler.Null())) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); - } - else - RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); - } - - template - void ParseTrue(InputStream& is, Handler& handler) { - RAPIDJSON_ASSERT(is.Peek() == 't'); - is.Take(); - - if (RAPIDJSON_LIKELY(Consume(is, 'r') && Consume(is, 'u') && Consume(is, 'e'))) { - if (RAPIDJSON_UNLIKELY(!handler.Bool(true))) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); - } - else - RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); - } - - template - void ParseFalse(InputStream& is, Handler& handler) { - RAPIDJSON_ASSERT(is.Peek() == 'f'); - is.Take(); - - if (RAPIDJSON_LIKELY(Consume(is, 'a') && Consume(is, 'l') && Consume(is, 's') && Consume(is, 'e'))) { - if (RAPIDJSON_UNLIKELY(!handler.Bool(false))) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); - } - else - RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); - } - - template - RAPIDJSON_FORCEINLINE static bool Consume(InputStream& is, typename InputStream::Ch expect) { - if (RAPIDJSON_LIKELY(is.Peek() == expect)) { - is.Take(); - return true; - } - else - return false; - } - - // Helper function to parse four hexadecimal digits in \uXXXX in ParseString(). - template - unsigned ParseHex4(InputStream& is, size_t escapeOffset) { - unsigned codepoint = 0; - for (int i = 0; i < 4; i++) { - Ch c = is.Peek(); - codepoint <<= 4; - codepoint += static_cast(c); - if (c >= '0' && c <= '9') - codepoint -= '0'; - else if (c >= 'A' && c <= 'F') - codepoint -= 'A' - 10; - else if (c >= 'a' && c <= 'f') - codepoint -= 'a' - 10; - else { - RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, escapeOffset); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0); - } - is.Take(); - } - return codepoint; - } - - template - class StackStream { - public: - typedef CharType Ch; - - StackStream(internal::Stack& stack) : stack_(stack), length_(0) {} - RAPIDJSON_FORCEINLINE void Put(Ch c) { - *stack_.template Push() = c; - ++length_; - } - - RAPIDJSON_FORCEINLINE void* Push(SizeType count) { - length_ += count; - return stack_.template Push(count); - } - - size_t Length() const { return length_; } - - Ch* Pop() { - return stack_.template Pop(length_); - } - - private: - StackStream(const StackStream&); - StackStream& operator=(const StackStream&); - - internal::Stack& stack_; - SizeType length_; - }; - - // Parse string and generate String event. Different code paths for kParseInsituFlag. - template - void ParseString(InputStream& is, Handler& handler, bool isKey = false) { - internal::StreamLocalCopy copy(is); - InputStream& s(copy.s); - - RAPIDJSON_ASSERT(s.Peek() == '\"'); - s.Take(); // Skip '\"' - - bool success = false; - if (parseFlags & kParseInsituFlag) { - typename InputStream::Ch *head = s.PutBegin(); - ParseStringToStream(s, s); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - size_t length = s.PutEnd(head) - 1; - RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); - const typename TargetEncoding::Ch* const str = reinterpret_cast(head); - success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false)); - } - else { - StackStream stackStream(stack_); - ParseStringToStream(s, stackStream); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - SizeType length = static_cast(stackStream.Length()) - 1; - const typename TargetEncoding::Ch* const str = stackStream.Pop(); - success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true)); - } - if (RAPIDJSON_UNLIKELY(!success)) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); - } - - // Parse string to an output is - // This function handles the prefix/suffix double quotes, escaping, and optional encoding validation. - template - RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) { -//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN -#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - static const char escape[256] = { - Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '/', - Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, - 0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, - 0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 - }; -#undef Z16 -//!@endcond - - for (;;) { - // Scan and copy string before "\\\"" or < 0x20. This is an optional optimization. - if (!(parseFlags & kParseValidateEncodingFlag)) - ScanCopyUnescapedString(is, os); - - Ch c = is.Peek(); - if (RAPIDJSON_UNLIKELY(c == '\\')) { // Escape - size_t escapeOffset = is.Tell(); // For invalid escaping, report the initial '\\' as error offset - is.Take(); - Ch e = is.Peek(); - if ((sizeof(Ch) == 1 || unsigned(e) < 256) && RAPIDJSON_LIKELY(escape[static_cast(e)])) { - is.Take(); - os.Put(static_cast(escape[static_cast(e)])); - } - else if ((parseFlags & kParseEscapedApostropheFlag) && RAPIDJSON_LIKELY(e == '\'')) { // Allow escaped apostrophe - is.Take(); - os.Put('\''); - } - else if (RAPIDJSON_LIKELY(e == 'u')) { // Unicode - is.Take(); - unsigned codepoint = ParseHex4(is, escapeOffset); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - if (RAPIDJSON_UNLIKELY(codepoint >= 0xD800 && codepoint <= 0xDFFF)) { - // high surrogate, check if followed by valid low surrogate - if (RAPIDJSON_LIKELY(codepoint <= 0xDBFF)) { - // Handle UTF-16 surrogate pair - if (RAPIDJSON_UNLIKELY(!Consume(is, '\\') || !Consume(is, 'u'))) - RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); - unsigned codepoint2 = ParseHex4(is, escapeOffset); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - if (RAPIDJSON_UNLIKELY(codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)) - RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); - codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000; - } - // single low surrogate - else - { - RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); - } - } - TEncoding::Encode(os, codepoint); - } - else - RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, escapeOffset); - } - else if (RAPIDJSON_UNLIKELY(c == '"')) { // Closing double quote - is.Take(); - os.Put('\0'); // null-terminate the string - return; - } - else if (RAPIDJSON_UNLIKELY(static_cast(c) < 0x20)) { // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF - if (c == '\0') - RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell()); - else - RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, is.Tell()); - } - else { - size_t offset = is.Tell(); - if (RAPIDJSON_UNLIKELY((parseFlags & kParseValidateEncodingFlag ? - !Transcoder::Validate(is, os) : - !Transcoder::Transcode(is, os)))) - RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, offset); - } - } - } - - template - static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InputStream&, OutputStream&) { - // Do nothing for generic version - } - -#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) - // StringStream -> StackStream - static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { - const char* p = is.src_; - - // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) - const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); - while (p != nextAligned) - if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { - is.src_ = p; - return; - } - else - os.Put(*p++); - - // The rest of string using SIMD - static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; - static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; - static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; - const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); - const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); - const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); - - for (;; p += 16) { - const __m128i s = _mm_load_si128(reinterpret_cast(p)); - const __m128i t1 = _mm_cmpeq_epi8(s, dq); - const __m128i t2 = _mm_cmpeq_epi8(s, bs); - const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F - const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); - unsigned short r = static_cast(_mm_movemask_epi8(x)); - if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped - SizeType length; - #ifdef _MSC_VER // Find the index of first escaped - unsigned long offset; - _BitScanForward(&offset, r); - length = offset; - #else - length = static_cast(__builtin_ffs(r) - 1); - #endif - if (length != 0) { - char* q = reinterpret_cast(os.Push(length)); - for (size_t i = 0; i < length; i++) - q[i] = p[i]; - - p += length; - } - break; - } - _mm_storeu_si128(reinterpret_cast<__m128i *>(os.Push(16)), s); - } - - is.src_ = p; - } - - // InsituStringStream -> InsituStringStream - static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { - RAPIDJSON_ASSERT(&is == &os); - (void)os; - - if (is.src_ == is.dst_) { - SkipUnescapedString(is); - return; - } - - char* p = is.src_; - char *q = is.dst_; - - // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) - const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); - while (p != nextAligned) - if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { - is.src_ = p; - is.dst_ = q; - return; - } - else - *q++ = *p++; - - // The rest of string using SIMD - static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; - static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; - static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; - const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); - const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); - const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); - - for (;; p += 16, q += 16) { - const __m128i s = _mm_load_si128(reinterpret_cast(p)); - const __m128i t1 = _mm_cmpeq_epi8(s, dq); - const __m128i t2 = _mm_cmpeq_epi8(s, bs); - const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F - const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); - unsigned short r = static_cast(_mm_movemask_epi8(x)); - if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped - size_t length; -#ifdef _MSC_VER // Find the index of first escaped - unsigned long offset; - _BitScanForward(&offset, r); - length = offset; -#else - length = static_cast(__builtin_ffs(r) - 1); -#endif - for (const char* pend = p + length; p != pend; ) - *q++ = *p++; - break; - } - _mm_storeu_si128(reinterpret_cast<__m128i *>(q), s); - } - - is.src_ = p; - is.dst_ = q; - } - - // When read/write pointers are the same for insitu stream, just skip unescaped characters - static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { - RAPIDJSON_ASSERT(is.src_ == is.dst_); - char* p = is.src_; - - // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) - const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); - for (; p != nextAligned; p++) - if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { - is.src_ = is.dst_ = p; - return; - } - - // The rest of string using SIMD - static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; - static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; - static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; - const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); - const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); - const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); - - for (;; p += 16) { - const __m128i s = _mm_load_si128(reinterpret_cast(p)); - const __m128i t1 = _mm_cmpeq_epi8(s, dq); - const __m128i t2 = _mm_cmpeq_epi8(s, bs); - const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F - const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); - unsigned short r = static_cast(_mm_movemask_epi8(x)); - if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped - size_t length; -#ifdef _MSC_VER // Find the index of first escaped - unsigned long offset; - _BitScanForward(&offset, r); - length = offset; -#else - length = static_cast(__builtin_ffs(r) - 1); -#endif - p += length; - break; - } - } - - is.src_ = is.dst_ = p; - } -#elif defined(RAPIDJSON_NEON) - // StringStream -> StackStream - static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { - const char* p = is.src_; - - // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) - const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); - while (p != nextAligned) - if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { - is.src_ = p; - return; - } - else - os.Put(*p++); - - // The rest of string using SIMD - const uint8x16_t s0 = vmovq_n_u8('"'); - const uint8x16_t s1 = vmovq_n_u8('\\'); - const uint8x16_t s2 = vmovq_n_u8('\b'); - const uint8x16_t s3 = vmovq_n_u8(32); - - for (;; p += 16) { - const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); - uint8x16_t x = vceqq_u8(s, s0); - x = vorrq_u8(x, vceqq_u8(s, s1)); - x = vorrq_u8(x, vceqq_u8(s, s2)); - x = vorrq_u8(x, vcltq_u8(s, s3)); - - x = vrev64q_u8(x); // Rev in 64 - uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract - uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract - - SizeType length = 0; - bool escaped = false; - if (low == 0) { - if (high != 0) { - uint32_t lz = internal::clzll(high); - length = 8 + (lz >> 3); - escaped = true; - } - } else { - uint32_t lz = internal::clzll(low); - length = lz >> 3; - escaped = true; - } - if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped - if (length != 0) { - char* q = reinterpret_cast(os.Push(length)); - for (size_t i = 0; i < length; i++) - q[i] = p[i]; - - p += length; - } - break; - } - vst1q_u8(reinterpret_cast(os.Push(16)), s); - } - - is.src_ = p; - } - - // InsituStringStream -> InsituStringStream - static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { - RAPIDJSON_ASSERT(&is == &os); - (void)os; - - if (is.src_ == is.dst_) { - SkipUnescapedString(is); - return; - } - - char* p = is.src_; - char *q = is.dst_; - - // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) - const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); - while (p != nextAligned) - if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { - is.src_ = p; - is.dst_ = q; - return; - } - else - *q++ = *p++; - - // The rest of string using SIMD - const uint8x16_t s0 = vmovq_n_u8('"'); - const uint8x16_t s1 = vmovq_n_u8('\\'); - const uint8x16_t s2 = vmovq_n_u8('\b'); - const uint8x16_t s3 = vmovq_n_u8(32); - - for (;; p += 16, q += 16) { - const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); - uint8x16_t x = vceqq_u8(s, s0); - x = vorrq_u8(x, vceqq_u8(s, s1)); - x = vorrq_u8(x, vceqq_u8(s, s2)); - x = vorrq_u8(x, vcltq_u8(s, s3)); - - x = vrev64q_u8(x); // Rev in 64 - uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract - uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract - - SizeType length = 0; - bool escaped = false; - if (low == 0) { - if (high != 0) { - uint32_t lz = internal::clzll(high); - length = 8 + (lz >> 3); - escaped = true; - } - } else { - uint32_t lz = internal::clzll(low); - length = lz >> 3; - escaped = true; - } - if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped - for (const char* pend = p + length; p != pend; ) { - *q++ = *p++; - } - break; - } - vst1q_u8(reinterpret_cast(q), s); - } - - is.src_ = p; - is.dst_ = q; - } - - // When read/write pointers are the same for insitu stream, just skip unescaped characters - static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { - RAPIDJSON_ASSERT(is.src_ == is.dst_); - char* p = is.src_; - - // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) - const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); - for (; p != nextAligned; p++) - if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { - is.src_ = is.dst_ = p; - return; - } - - // The rest of string using SIMD - const uint8x16_t s0 = vmovq_n_u8('"'); - const uint8x16_t s1 = vmovq_n_u8('\\'); - const uint8x16_t s2 = vmovq_n_u8('\b'); - const uint8x16_t s3 = vmovq_n_u8(32); - - for (;; p += 16) { - const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); - uint8x16_t x = vceqq_u8(s, s0); - x = vorrq_u8(x, vceqq_u8(s, s1)); - x = vorrq_u8(x, vceqq_u8(s, s2)); - x = vorrq_u8(x, vcltq_u8(s, s3)); - - x = vrev64q_u8(x); // Rev in 64 - uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract - uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract - - if (low == 0) { - if (high != 0) { - uint32_t lz = internal::clzll(high); - p += 8 + (lz >> 3); - break; - } - } else { - uint32_t lz = internal::clzll(low); - p += lz >> 3; - break; - } - } - - is.src_ = is.dst_ = p; - } -#endif // RAPIDJSON_NEON - - template - class NumberStream; - - template - class NumberStream { - public: - typedef typename InputStream::Ch Ch; - - NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader; } - - RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); } - RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); } - RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); } - RAPIDJSON_FORCEINLINE void Push(char) {} - - size_t Tell() { return is.Tell(); } - size_t Length() { return 0; } - const StackCharacter* Pop() { return 0; } - - protected: - NumberStream& operator=(const NumberStream&); - - InputStream& is; - }; - - template - class NumberStream : public NumberStream { - typedef NumberStream Base; - public: - NumberStream(GenericReader& reader, InputStream& s) : Base(reader, s), stackStream(reader.stack_) {} - - RAPIDJSON_FORCEINLINE Ch TakePush() { - stackStream.Put(static_cast(Base::is.Peek())); - return Base::is.Take(); - } - - RAPIDJSON_FORCEINLINE void Push(StackCharacter c) { - stackStream.Put(c); - } - - size_t Length() { return stackStream.Length(); } - - const StackCharacter* Pop() { - stackStream.Put('\0'); - return stackStream.Pop(); - } - - private: - StackStream stackStream; - }; - - template - class NumberStream : public NumberStream { - typedef NumberStream Base; - public: - NumberStream(GenericReader& reader, InputStream& s) : Base(reader, s) {} - - RAPIDJSON_FORCEINLINE Ch Take() { return Base::TakePush(); } - }; - - template - void ParseNumber(InputStream& is, Handler& handler) { - typedef typename internal::SelectIf, typename TargetEncoding::Ch, char>::Type NumberCharacter; - - internal::StreamLocalCopy copy(is); - NumberStream s(*this, copy.s); - - size_t startOffset = s.Tell(); - double d = 0.0; - bool useNanOrInf = false; - - // Parse minus - bool minus = Consume(s, '-'); - - // Parse int: zero / ( digit1-9 *DIGIT ) - unsigned i = 0; - uint64_t i64 = 0; - bool use64bit = false; - int significandDigit = 0; - if (RAPIDJSON_UNLIKELY(s.Peek() == '0')) { - i = 0; - s.TakePush(); - } - else if (RAPIDJSON_LIKELY(s.Peek() >= '1' && s.Peek() <= '9')) { - i = static_cast(s.TakePush() - '0'); - - if (minus) - while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { - if (RAPIDJSON_UNLIKELY(i >= 214748364)) { // 2^31 = 2147483648 - if (RAPIDJSON_LIKELY(i != 214748364 || s.Peek() > '8')) { - i64 = i; - use64bit = true; - break; - } - } - i = i * 10 + static_cast(s.TakePush() - '0'); - significandDigit++; - } - else - while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { - if (RAPIDJSON_UNLIKELY(i >= 429496729)) { // 2^32 - 1 = 4294967295 - if (RAPIDJSON_LIKELY(i != 429496729 || s.Peek() > '5')) { - i64 = i; - use64bit = true; - break; - } - } - i = i * 10 + static_cast(s.TakePush() - '0'); - significandDigit++; - } - } - // Parse NaN or Infinity here - else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) { - if (Consume(s, 'N')) { - if (Consume(s, 'a') && Consume(s, 'N')) { - d = std::numeric_limits::quiet_NaN(); - useNanOrInf = true; - } - } - else if (RAPIDJSON_LIKELY(Consume(s, 'I'))) { - if (Consume(s, 'n') && Consume(s, 'f')) { - d = (minus ? -std::numeric_limits::infinity() : std::numeric_limits::infinity()); - useNanOrInf = true; - - if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n') - && Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) { - RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); - } - } - } - - if (RAPIDJSON_UNLIKELY(!useNanOrInf)) { - RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); - } - } - else - RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); - - // Parse 64bit int - bool useDouble = false; - if (use64bit) { - if (minus) - while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { - if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC))) // 2^63 = 9223372036854775808 - if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8')) { - d = static_cast(i64); - useDouble = true; - break; - } - i64 = i64 * 10 + static_cast(s.TakePush() - '0'); - significandDigit++; - } - else - while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { - if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999))) // 2^64 - 1 = 18446744073709551615 - if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5')) { - d = static_cast(i64); - useDouble = true; - break; - } - i64 = i64 * 10 + static_cast(s.TakePush() - '0'); - significandDigit++; - } - } - - // Force double for big integer - if (useDouble) { - while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { - d = d * 10 + (s.TakePush() - '0'); - } - } - - // Parse frac = decimal-point 1*DIGIT - int expFrac = 0; - size_t decimalPosition; - if (Consume(s, '.')) { - decimalPosition = s.Length(); - - if (RAPIDJSON_UNLIKELY(!(s.Peek() >= '0' && s.Peek() <= '9'))) - RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell()); - - if (!useDouble) { -#if RAPIDJSON_64BIT - // Use i64 to store significand in 64-bit architecture - if (!use64bit) - i64 = i; - - while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { - if (i64 > RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path - break; - else { - i64 = i64 * 10 + static_cast(s.TakePush() - '0'); - --expFrac; - if (i64 != 0) - significandDigit++; - } - } - - d = static_cast(i64); -#else - // Use double to store significand in 32-bit architecture - d = static_cast(use64bit ? i64 : i); -#endif - useDouble = true; - } - - while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { - if (significandDigit < 17) { - d = d * 10.0 + (s.TakePush() - '0'); - --expFrac; - if (RAPIDJSON_LIKELY(d > 0.0)) - significandDigit++; - } - else - s.TakePush(); - } - } - else - decimalPosition = s.Length(); // decimal position at the end of integer. - - // Parse exp = e [ minus / plus ] 1*DIGIT - int exp = 0; - if (Consume(s, 'e') || Consume(s, 'E')) { - if (!useDouble) { - d = static_cast(use64bit ? i64 : i); - useDouble = true; - } - - bool expMinus = false; - if (Consume(s, '+')) - ; - else if (Consume(s, '-')) - expMinus = true; - - if (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { - exp = static_cast(s.Take() - '0'); - if (expMinus) { - // (exp + expFrac) must not underflow int => we're detecting when -exp gets - // dangerously close to INT_MIN (a pessimistic next digit 9 would push it into - // underflow territory): - // - // -(exp * 10 + 9) + expFrac >= INT_MIN - // <=> exp <= (expFrac - INT_MIN - 9) / 10 - RAPIDJSON_ASSERT(expFrac <= 0); - int maxExp = (expFrac + 2147483639) / 10; - - while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { - exp = exp * 10 + static_cast(s.Take() - '0'); - if (RAPIDJSON_UNLIKELY(exp > maxExp)) { - while (RAPIDJSON_UNLIKELY(s.Peek() >= '0' && s.Peek() <= '9')) // Consume the rest of exponent - s.Take(); - } - } - } - else { // positive exp - int maxExp = 308 - expFrac; - while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { - exp = exp * 10 + static_cast(s.Take() - '0'); - if (RAPIDJSON_UNLIKELY(exp > maxExp)) - RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); - } - } - } - else - RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell()); - - if (expMinus) - exp = -exp; - } - - // Finish parsing, call event according to the type of number. - bool cont = true; - - if (parseFlags & kParseNumbersAsStringsFlag) { - if (parseFlags & kParseInsituFlag) { - s.Pop(); // Pop stack no matter if it will be used or not. - typename InputStream::Ch* head = is.PutBegin(); - const size_t length = s.Tell() - startOffset; - RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); - // unable to insert the \0 character here, it will erase the comma after this number - const typename TargetEncoding::Ch* const str = reinterpret_cast(head); - cont = handler.RawNumber(str, SizeType(length), false); - } - else { - SizeType numCharsToCopy = static_cast(s.Length()); - GenericStringStream > srcStream(s.Pop()); - StackStream dstStream(stack_); - while (numCharsToCopy--) { - Transcoder, TargetEncoding>::Transcode(srcStream, dstStream); - } - dstStream.Put('\0'); - const typename TargetEncoding::Ch* str = dstStream.Pop(); - const SizeType length = static_cast(dstStream.Length()) - 1; - cont = handler.RawNumber(str, SizeType(length), true); - } - } - else { - size_t length = s.Length(); - const NumberCharacter* decimal = s.Pop(); // Pop stack no matter if it will be used or not. - - if (useDouble) { - int p = exp + expFrac; - if (parseFlags & kParseFullPrecisionFlag) - d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp); - else - d = internal::StrtodNormalPrecision(d, p); - - // Use > max, instead of == inf, to fix bogus warning -Wfloat-equal - if (d > (std::numeric_limits::max)()) { - // Overflow - // TODO: internal::StrtodX should report overflow (or underflow) - RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); - } - - cont = handler.Double(minus ? -d : d); - } - else if (useNanOrInf) { - cont = handler.Double(d); - } - else { - if (use64bit) { - if (minus) - cont = handler.Int64(static_cast(~i64 + 1)); - else - cont = handler.Uint64(i64); - } - else { - if (minus) - cont = handler.Int(static_cast(~i + 1)); - else - cont = handler.Uint(i); - } - } - } - if (RAPIDJSON_UNLIKELY(!cont)) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, startOffset); - } - - // Parse any JSON value - template - void ParseValue(InputStream& is, Handler& handler) { - switch (is.Peek()) { - case 'n': ParseNull (is, handler); break; - case 't': ParseTrue (is, handler); break; - case 'f': ParseFalse (is, handler); break; - case '"': ParseString(is, handler); break; - case '{': ParseObject(is, handler); break; - case '[': ParseArray (is, handler); break; - default : - ParseNumber(is, handler); - break; - - } - } - - // Iterative Parsing - - // States - enum IterativeParsingState { - IterativeParsingFinishState = 0, // sink states at top - IterativeParsingErrorState, // sink states at top - IterativeParsingStartState, - - // Object states - IterativeParsingObjectInitialState, - IterativeParsingMemberKeyState, - IterativeParsingMemberValueState, - IterativeParsingObjectFinishState, - - // Array states - IterativeParsingArrayInitialState, - IterativeParsingElementState, - IterativeParsingArrayFinishState, - - // Single value state - IterativeParsingValueState, - - // Delimiter states (at bottom) - IterativeParsingElementDelimiterState, - IterativeParsingMemberDelimiterState, - IterativeParsingKeyValueDelimiterState, - - cIterativeParsingStateCount - }; - - // Tokens - enum Token { - LeftBracketToken = 0, - RightBracketToken, - - LeftCurlyBracketToken, - RightCurlyBracketToken, - - CommaToken, - ColonToken, - - StringToken, - FalseToken, - TrueToken, - NullToken, - NumberToken, - - kTokenCount - }; - - RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) const { - -//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN -#define N NumberToken -#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N - // Maps from ASCII to Token - static const unsigned char tokenMap[256] = { - N16, // 00~0F - N16, // 10~1F - N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F - N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F - N16, // 40~4F - N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F - N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F - N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F - N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF - }; -#undef N -#undef N16 -//!@endcond - - if (sizeof(Ch) == 1 || static_cast(c) < 256) - return static_cast(tokenMap[static_cast(c)]); - else - return NumberToken; - } - - RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) const { - // current state x one lookahead token -> new state - static const char G[cIterativeParsingStateCount][kTokenCount] = { - // Finish(sink state) - { - IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, - IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, - IterativeParsingErrorState - }, - // Error(sink state) - { - IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, - IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, - IterativeParsingErrorState - }, - // Start - { - IterativeParsingArrayInitialState, // Left bracket - IterativeParsingErrorState, // Right bracket - IterativeParsingObjectInitialState, // Left curly bracket - IterativeParsingErrorState, // Right curly bracket - IterativeParsingErrorState, // Comma - IterativeParsingErrorState, // Colon - IterativeParsingValueState, // String - IterativeParsingValueState, // False - IterativeParsingValueState, // True - IterativeParsingValueState, // Null - IterativeParsingValueState // Number - }, - // ObjectInitial - { - IterativeParsingErrorState, // Left bracket - IterativeParsingErrorState, // Right bracket - IterativeParsingErrorState, // Left curly bracket - IterativeParsingObjectFinishState, // Right curly bracket - IterativeParsingErrorState, // Comma - IterativeParsingErrorState, // Colon - IterativeParsingMemberKeyState, // String - IterativeParsingErrorState, // False - IterativeParsingErrorState, // True - IterativeParsingErrorState, // Null - IterativeParsingErrorState // Number - }, - // MemberKey - { - IterativeParsingErrorState, // Left bracket - IterativeParsingErrorState, // Right bracket - IterativeParsingErrorState, // Left curly bracket - IterativeParsingErrorState, // Right curly bracket - IterativeParsingErrorState, // Comma - IterativeParsingKeyValueDelimiterState, // Colon - IterativeParsingErrorState, // String - IterativeParsingErrorState, // False - IterativeParsingErrorState, // True - IterativeParsingErrorState, // Null - IterativeParsingErrorState // Number - }, - // MemberValue - { - IterativeParsingErrorState, // Left bracket - IterativeParsingErrorState, // Right bracket - IterativeParsingErrorState, // Left curly bracket - IterativeParsingObjectFinishState, // Right curly bracket - IterativeParsingMemberDelimiterState, // Comma - IterativeParsingErrorState, // Colon - IterativeParsingErrorState, // String - IterativeParsingErrorState, // False - IterativeParsingErrorState, // True - IterativeParsingErrorState, // Null - IterativeParsingErrorState // Number - }, - // ObjectFinish(sink state) - { - IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, - IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, - IterativeParsingErrorState - }, - // ArrayInitial - { - IterativeParsingArrayInitialState, // Left bracket(push Element state) - IterativeParsingArrayFinishState, // Right bracket - IterativeParsingObjectInitialState, // Left curly bracket(push Element state) - IterativeParsingErrorState, // Right curly bracket - IterativeParsingErrorState, // Comma - IterativeParsingErrorState, // Colon - IterativeParsingElementState, // String - IterativeParsingElementState, // False - IterativeParsingElementState, // True - IterativeParsingElementState, // Null - IterativeParsingElementState // Number - }, - // Element - { - IterativeParsingErrorState, // Left bracket - IterativeParsingArrayFinishState, // Right bracket - IterativeParsingErrorState, // Left curly bracket - IterativeParsingErrorState, // Right curly bracket - IterativeParsingElementDelimiterState, // Comma - IterativeParsingErrorState, // Colon - IterativeParsingErrorState, // String - IterativeParsingErrorState, // False - IterativeParsingErrorState, // True - IterativeParsingErrorState, // Null - IterativeParsingErrorState // Number - }, - // ArrayFinish(sink state) - { - IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, - IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, - IterativeParsingErrorState - }, - // Single Value (sink state) - { - IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, - IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, - IterativeParsingErrorState - }, - // ElementDelimiter - { - IterativeParsingArrayInitialState, // Left bracket(push Element state) - IterativeParsingArrayFinishState, // Right bracket - IterativeParsingObjectInitialState, // Left curly bracket(push Element state) - IterativeParsingErrorState, // Right curly bracket - IterativeParsingErrorState, // Comma - IterativeParsingErrorState, // Colon - IterativeParsingElementState, // String - IterativeParsingElementState, // False - IterativeParsingElementState, // True - IterativeParsingElementState, // Null - IterativeParsingElementState // Number - }, - // MemberDelimiter - { - IterativeParsingErrorState, // Left bracket - IterativeParsingErrorState, // Right bracket - IterativeParsingErrorState, // Left curly bracket - IterativeParsingObjectFinishState, // Right curly bracket - IterativeParsingErrorState, // Comma - IterativeParsingErrorState, // Colon - IterativeParsingMemberKeyState, // String - IterativeParsingErrorState, // False - IterativeParsingErrorState, // True - IterativeParsingErrorState, // Null - IterativeParsingErrorState // Number - }, - // KeyValueDelimiter - { - IterativeParsingArrayInitialState, // Left bracket(push MemberValue state) - IterativeParsingErrorState, // Right bracket - IterativeParsingObjectInitialState, // Left curly bracket(push MemberValue state) - IterativeParsingErrorState, // Right curly bracket - IterativeParsingErrorState, // Comma - IterativeParsingErrorState, // Colon - IterativeParsingMemberValueState, // String - IterativeParsingMemberValueState, // False - IterativeParsingMemberValueState, // True - IterativeParsingMemberValueState, // Null - IterativeParsingMemberValueState // Number - }, - }; // End of G - - return static_cast(G[state][token]); - } - - // Make an advance in the token stream and state based on the candidate destination state which was returned by Transit(). - // May return a new state on state pop. - template - RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) { - (void)token; - - switch (dst) { - case IterativeParsingErrorState: - return dst; - - case IterativeParsingObjectInitialState: - case IterativeParsingArrayInitialState: - { - // Push the state(Element or MemberValue) if we are nested in another array or value of member. - // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop. - IterativeParsingState n = src; - if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState) - n = IterativeParsingElementState; - else if (src == IterativeParsingKeyValueDelimiterState) - n = IterativeParsingMemberValueState; - // Push current state. - *stack_.template Push(1) = n; - // Initialize and push the member/element count. - *stack_.template Push(1) = 0; - // Call handler - bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray(); - // On handler short circuits the parsing. - if (!hr) { - RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); - return IterativeParsingErrorState; - } - else { - is.Take(); - return dst; - } - } - - case IterativeParsingMemberKeyState: - ParseString(is, handler, true); - if (HasParseError()) - return IterativeParsingErrorState; - else - return dst; - - case IterativeParsingKeyValueDelimiterState: - RAPIDJSON_ASSERT(token == ColonToken); - is.Take(); - return dst; - - case IterativeParsingMemberValueState: - // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. - ParseValue(is, handler); - if (HasParseError()) { - return IterativeParsingErrorState; - } - return dst; - - case IterativeParsingElementState: - // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. - ParseValue(is, handler); - if (HasParseError()) { - return IterativeParsingErrorState; - } - return dst; - - case IterativeParsingMemberDelimiterState: - case IterativeParsingElementDelimiterState: - is.Take(); - // Update member/element count. - *stack_.template Top() = *stack_.template Top() + 1; - return dst; - - case IterativeParsingObjectFinishState: - { - // Transit from delimiter is only allowed when trailing commas are enabled - if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingMemberDelimiterState) { - RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissName, is.Tell()); - return IterativeParsingErrorState; - } - // Get member count. - SizeType c = *stack_.template Pop(1); - // If the object is not empty, count the last member. - if (src == IterativeParsingMemberValueState) - ++c; - // Restore the state. - IterativeParsingState n = static_cast(*stack_.template Pop(1)); - // Transit to Finish state if this is the topmost scope. - if (n == IterativeParsingStartState) - n = IterativeParsingFinishState; - // Call handler - bool hr = handler.EndObject(c); - // On handler short circuits the parsing. - if (!hr) { - RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); - return IterativeParsingErrorState; - } - else { - is.Take(); - return n; - } - } - - case IterativeParsingArrayFinishState: - { - // Transit from delimiter is only allowed when trailing commas are enabled - if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingElementDelimiterState) { - RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorValueInvalid, is.Tell()); - return IterativeParsingErrorState; - } - // Get element count. - SizeType c = *stack_.template Pop(1); - // If the array is not empty, count the last element. - if (src == IterativeParsingElementState) - ++c; - // Restore the state. - IterativeParsingState n = static_cast(*stack_.template Pop(1)); - // Transit to Finish state if this is the topmost scope. - if (n == IterativeParsingStartState) - n = IterativeParsingFinishState; - // Call handler - bool hr = handler.EndArray(c); - // On handler short circuits the parsing. - if (!hr) { - RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); - return IterativeParsingErrorState; - } - else { - is.Take(); - return n; - } - } - - default: - // This branch is for IterativeParsingValueState actually. - // Use `default:` rather than - // `case IterativeParsingValueState:` is for code coverage. - - // The IterativeParsingStartState is not enumerated in this switch-case. - // It is impossible for that case. And it can be caught by following assertion. - - // The IterativeParsingFinishState is not enumerated in this switch-case either. - // It is a "derivative" state which cannot triggered from Predict() directly. - // Therefore it cannot happen here. And it can be caught by following assertion. - RAPIDJSON_ASSERT(dst == IterativeParsingValueState); - - // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. - ParseValue(is, handler); - if (HasParseError()) { - return IterativeParsingErrorState; - } - return IterativeParsingFinishState; - } - } - - template - void HandleError(IterativeParsingState src, InputStream& is) { - if (HasParseError()) { - // Error flag has been set. - return; - } - - switch (src) { - case IterativeParsingStartState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return; - case IterativeParsingFinishState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return; - case IterativeParsingObjectInitialState: - case IterativeParsingMemberDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return; - case IterativeParsingMemberKeyState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return; - case IterativeParsingMemberValueState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return; - case IterativeParsingKeyValueDelimiterState: - case IterativeParsingArrayInitialState: - case IterativeParsingElementDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); return; - default: RAPIDJSON_ASSERT(src == IterativeParsingElementState); RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return; - } - } - - RAPIDJSON_FORCEINLINE bool IsIterativeParsingDelimiterState(IterativeParsingState s) const { - return s >= IterativeParsingElementDelimiterState; - } - - RAPIDJSON_FORCEINLINE bool IsIterativeParsingCompleteState(IterativeParsingState s) const { - return s <= IterativeParsingErrorState; - } - - template - ParseResult IterativeParse(InputStream& is, Handler& handler) { - parseResult_.Clear(); - ClearStackOnExit scope(*this); - IterativeParsingState state = IterativeParsingStartState; - - SkipWhitespaceAndComments(is); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); - while (is.Peek() != '\0') { - Token t = Tokenize(is.Peek()); - IterativeParsingState n = Predict(state, t); - IterativeParsingState d = Transit(state, t, n, is, handler); - - if (d == IterativeParsingErrorState) { - HandleError(state, is); - break; - } - - state = d; - - // Do not further consume streams if a root JSON has been parsed. - if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) - break; - - SkipWhitespaceAndComments(is); - RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); - } - - // Handle the end of file. - if (state != IterativeParsingFinishState) - HandleError(state, is); - - return parseResult_; - } - - static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. - internal::Stack stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. - ParseResult parseResult_; - IterativeParsingState state_; -}; // class GenericReader - -//! Reader with UTF8 encoding and default allocator. -typedef GenericReader, UTF8<> > Reader; - -RAPIDJSON_NAMESPACE_END - -#if defined(__clang__) || defined(_MSC_VER) -RAPIDJSON_DIAG_POP -#endif - - -#ifdef __GNUC__ -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_READER_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/schema.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/schema.h deleted file mode 100644 index 453e43e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/schema.h +++ /dev/null @@ -1,3262 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available-> -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip-> All rights reserved-> -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License-> You may obtain a copy of the License at -// -// http://opensource->org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied-> See the License for the -// specific language governing permissions and limitations under the License-> - -#ifndef RAPIDJSON_SCHEMA_H_ -#define RAPIDJSON_SCHEMA_H_ - -#include "document.h" -#include "pointer.h" -#include "stringbuffer.h" -#include "error/en.h" -#include "uri.h" -#include // abs, floor - -#if !defined(RAPIDJSON_SCHEMA_USE_INTERNALREGEX) -#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 1 -#else -#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 0 -#endif - -#if !RAPIDJSON_SCHEMA_USE_INTERNALREGEX && defined(RAPIDJSON_SCHEMA_USE_STDREGEX) && (__cplusplus >=201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)) -#define RAPIDJSON_SCHEMA_USE_STDREGEX 1 -#else -#define RAPIDJSON_SCHEMA_USE_STDREGEX 0 -#endif - -#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX -#include "internal/regex.h" -#elif RAPIDJSON_SCHEMA_USE_STDREGEX -#include -#endif - -#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX || RAPIDJSON_SCHEMA_USE_STDREGEX -#define RAPIDJSON_SCHEMA_HAS_REGEX 1 -#else -#define RAPIDJSON_SCHEMA_HAS_REGEX 0 -#endif - -#ifndef RAPIDJSON_SCHEMA_VERBOSE -#define RAPIDJSON_SCHEMA_VERBOSE 0 -#endif - -RAPIDJSON_DIAG_PUSH - -#if defined(__GNUC__) -RAPIDJSON_DIAG_OFF(effc++) -#endif - -#ifdef __clang__ -RAPIDJSON_DIAG_OFF(weak-vtables) -RAPIDJSON_DIAG_OFF(exit-time-destructors) -RAPIDJSON_DIAG_OFF(c++98-compat-pedantic) -RAPIDJSON_DIAG_OFF(variadic-macros) -#elif defined(_MSC_VER) -RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -/////////////////////////////////////////////////////////////////////////////// -// Verbose Utilities - -#if RAPIDJSON_SCHEMA_VERBOSE - -namespace internal { - -inline void PrintInvalidKeywordData(const char* keyword) { - printf(" Fail keyword: '%s'\n", keyword); -} - -inline void PrintInvalidKeywordData(const wchar_t* keyword) { - wprintf(L" Fail keyword: '%ls'\n", keyword); -} - -inline void PrintInvalidDocumentData(const char* document) { - printf(" Fail document: '%s'\n", document); -} - -inline void PrintInvalidDocumentData(const wchar_t* document) { - wprintf(L" Fail document: '%ls'\n", document); -} - -inline void PrintValidatorPointersData(const char* s, const char* d, unsigned depth) { - printf(" Sch: %*s'%s'\n Doc: %*s'%s'\n", depth * 4, " ", s, depth * 4, " ", d); -} - -inline void PrintValidatorPointersData(const wchar_t* s, const wchar_t* d, unsigned depth) { - wprintf(L" Sch: %*ls'%ls'\n Doc: %*ls'%ls'\n", depth * 4, L" ", s, depth * 4, L" ", d); -} - -inline void PrintSchemaIdsData(const char* base, const char* local, const char* resolved) { - printf(" Resolving id: Base: '%s', Local: '%s', Resolved: '%s'\n", base, local, resolved); -} - -inline void PrintSchemaIdsData(const wchar_t* base, const wchar_t* local, const wchar_t* resolved) { - wprintf(L" Resolving id: Base: '%ls', Local: '%ls', Resolved: '%ls'\n", base, local, resolved); -} - -inline void PrintMethodData(const char* method) { - printf("%s\n", method); -} - -inline void PrintMethodData(const char* method, bool b) { - printf("%s, Data: '%s'\n", method, b ? "true" : "false"); -} - -inline void PrintMethodData(const char* method, int64_t i) { - printf("%s, Data: '%" PRId64 "'\n", method, i); -} - -inline void PrintMethodData(const char* method, uint64_t u) { - printf("%s, Data: '%" PRIu64 "'\n", method, u); -} - -inline void PrintMethodData(const char* method, double d) { - printf("%s, Data: '%lf'\n", method, d); -} - -inline void PrintMethodData(const char* method, const char* s) { - printf("%s, Data: '%s'\n", method, s); -} - -inline void PrintMethodData(const char* method, const wchar_t* s) { - wprintf(L"%hs, Data: '%ls'\n", method, s); -} - -inline void PrintMethodData(const char* method, const char* s1, const char* s2) { - printf("%s, Data: '%s', '%s'\n", method, s1, s2); -} - -inline void PrintMethodData(const char* method, const wchar_t* s1, const wchar_t* s2) { - wprintf(L"%hs, Data: '%ls', '%ls'\n", method, s1, s2); -} - -} // namespace internal - -#endif // RAPIDJSON_SCHEMA_VERBOSE - -#ifndef RAPIDJSON_SCHEMA_PRINT -#if RAPIDJSON_SCHEMA_VERBOSE -#define RAPIDJSON_SCHEMA_PRINT(name, ...) internal::Print##name##Data(__VA_ARGS__) -#else -#define RAPIDJSON_SCHEMA_PRINT(name, ...) -#endif -#endif - -/////////////////////////////////////////////////////////////////////////////// -// RAPIDJSON_INVALID_KEYWORD_RETURN - -#define RAPIDJSON_INVALID_KEYWORD_RETURN(code)\ -RAPIDJSON_MULTILINEMACRO_BEGIN\ - context.invalidCode = code;\ - context.invalidKeyword = SchemaType::GetValidateErrorKeyword(code).GetString();\ - RAPIDJSON_SCHEMA_PRINT(InvalidKeyword, context.invalidKeyword);\ - return false;\ -RAPIDJSON_MULTILINEMACRO_END - -/////////////////////////////////////////////////////////////////////////////// -// ValidateFlag - -/*! \def RAPIDJSON_VALIDATE_DEFAULT_FLAGS - \ingroup RAPIDJSON_CONFIG - \brief User-defined kValidateDefaultFlags definition. - - User can define this as any \c ValidateFlag combinations. -*/ -#ifndef RAPIDJSON_VALIDATE_DEFAULT_FLAGS -#define RAPIDJSON_VALIDATE_DEFAULT_FLAGS kValidateNoFlags -#endif - -//! Combination of validate flags -/*! \see - */ -enum ValidateFlag { - kValidateNoFlags = 0, //!< No flags are set. - kValidateContinueOnErrorFlag = 1, //!< Don't stop after first validation error. - kValidateReadFlag = 2, //!< Validation is for a read semantic. - kValidateWriteFlag = 4, //!< Validation is for a write semantic. - kValidateDefaultFlags = RAPIDJSON_VALIDATE_DEFAULT_FLAGS //!< Default validate flags. Can be customized by defining RAPIDJSON_VALIDATE_DEFAULT_FLAGS -}; - -/////////////////////////////////////////////////////////////////////////////// -// Specification -enum SchemaDraft { - kDraftUnknown = -1, - kDraftNone = 0, - kDraft03 = 3, - kDraftMin = 4, //!< Current minimum supported draft - kDraft04 = 4, - kDraft05 = 5, - kDraftMax = 5, //!< Current maximum supported draft - kDraft06 = 6, - kDraft07 = 7, - kDraft2019_09 = 8, - kDraft2020_12 = 9 -}; - -enum OpenApiVersion { - kVersionUnknown = -1, - kVersionNone = 0, - kVersionMin = 2, //!< Current minimum supported version - kVersion20 = 2, - kVersion30 = 3, - kVersionMax = 3, //!< Current maximum supported version - kVersion31 = 4, -}; - -struct Specification { - Specification(SchemaDraft d) : draft(d), oapi(kVersionNone) {} - Specification(OpenApiVersion o) : oapi(o) { - if (oapi == kVersion20) draft = kDraft04; - else if (oapi == kVersion30) draft = kDraft05; - else if (oapi == kVersion31) draft = kDraft2020_12; - else draft = kDraft04; - } - ~Specification() {} - bool IsSupported() const { - return ((draft >= kDraftMin && draft <= kDraftMax) && ((oapi == kVersionNone) || (oapi >= kVersionMin && oapi <= kVersionMax))); - } - SchemaDraft draft; - OpenApiVersion oapi; -}; - -/////////////////////////////////////////////////////////////////////////////// -// Forward declarations - -template -class GenericSchemaDocument; - -namespace internal { - -template -class Schema; - -/////////////////////////////////////////////////////////////////////////////// -// ISchemaValidator - -class ISchemaValidator { -public: - virtual ~ISchemaValidator() {} - virtual bool IsValid() const = 0; - virtual void SetValidateFlags(unsigned flags) = 0; - virtual unsigned GetValidateFlags() const = 0; -}; - -/////////////////////////////////////////////////////////////////////////////// -// ISchemaStateFactory - -template -class ISchemaStateFactory { -public: - virtual ~ISchemaStateFactory() {} - virtual ISchemaValidator* CreateSchemaValidator(const SchemaType&, const bool inheritContinueOnErrors) = 0; - virtual void DestroySchemaValidator(ISchemaValidator* validator) = 0; - virtual void* CreateHasher() = 0; - virtual uint64_t GetHashCode(void* hasher) = 0; - virtual void DestroyHasher(void* hasher) = 0; - virtual void* MallocState(size_t size) = 0; - virtual void FreeState(void* p) = 0; -}; - -/////////////////////////////////////////////////////////////////////////////// -// IValidationErrorHandler - -template -class IValidationErrorHandler { -public: - typedef typename SchemaType::Ch Ch; - typedef typename SchemaType::SValue SValue; - - virtual ~IValidationErrorHandler() {} - - virtual void NotMultipleOf(int64_t actual, const SValue& expected) = 0; - virtual void NotMultipleOf(uint64_t actual, const SValue& expected) = 0; - virtual void NotMultipleOf(double actual, const SValue& expected) = 0; - virtual void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) = 0; - virtual void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) = 0; - virtual void AboveMaximum(double actual, const SValue& expected, bool exclusive) = 0; - virtual void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) = 0; - virtual void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) = 0; - virtual void BelowMinimum(double actual, const SValue& expected, bool exclusive) = 0; - - virtual void TooLong(const Ch* str, SizeType length, SizeType expected) = 0; - virtual void TooShort(const Ch* str, SizeType length, SizeType expected) = 0; - virtual void DoesNotMatch(const Ch* str, SizeType length) = 0; - - virtual void DisallowedItem(SizeType index) = 0; - virtual void TooFewItems(SizeType actualCount, SizeType expectedCount) = 0; - virtual void TooManyItems(SizeType actualCount, SizeType expectedCount) = 0; - virtual void DuplicateItems(SizeType index1, SizeType index2) = 0; - - virtual void TooManyProperties(SizeType actualCount, SizeType expectedCount) = 0; - virtual void TooFewProperties(SizeType actualCount, SizeType expectedCount) = 0; - virtual void StartMissingProperties() = 0; - virtual void AddMissingProperty(const SValue& name) = 0; - virtual bool EndMissingProperties() = 0; - virtual void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) = 0; - virtual void DisallowedProperty(const Ch* name, SizeType length) = 0; - - virtual void StartDependencyErrors() = 0; - virtual void StartMissingDependentProperties() = 0; - virtual void AddMissingDependentProperty(const SValue& targetName) = 0; - virtual void EndMissingDependentProperties(const SValue& sourceName) = 0; - virtual void AddDependencySchemaError(const SValue& sourceName, ISchemaValidator* subvalidator) = 0; - virtual bool EndDependencyErrors() = 0; - - virtual void DisallowedValue(const ValidateErrorCode code) = 0; - virtual void StartDisallowedType() = 0; - virtual void AddExpectedType(const typename SchemaType::ValueType& expectedType) = 0; - virtual void EndDisallowedType(const typename SchemaType::ValueType& actualType) = 0; - virtual void NotAllOf(ISchemaValidator** subvalidators, SizeType count) = 0; - virtual void NoneOf(ISchemaValidator** subvalidators, SizeType count) = 0; - virtual void NotOneOf(ISchemaValidator** subvalidators, SizeType count) = 0; - virtual void MultipleOneOf(SizeType index1, SizeType index2) = 0; - virtual void Disallowed() = 0; - virtual void DisallowedWhenWriting() = 0; - virtual void DisallowedWhenReading() = 0; -}; - - -/////////////////////////////////////////////////////////////////////////////// -// Hasher - -// For comparison of compound value -template -class Hasher { -public: - typedef typename Encoding::Ch Ch; - - Hasher(Allocator* allocator = 0, size_t stackCapacity = kDefaultSize) : stack_(allocator, stackCapacity) {} - - bool Null() { return WriteType(kNullType); } - bool Bool(bool b) { return WriteType(b ? kTrueType : kFalseType); } - bool Int(int i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } - bool Uint(unsigned u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } - bool Int64(int64_t i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } - bool Uint64(uint64_t u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } - bool Double(double d) { - Number n; - if (d < 0) n.u.i = static_cast(d); - else n.u.u = static_cast(d); - n.d = d; - return WriteNumber(n); - } - - bool RawNumber(const Ch* str, SizeType len, bool) { - WriteBuffer(kNumberType, str, len * sizeof(Ch)); - return true; - } - - bool String(const Ch* str, SizeType len, bool) { - WriteBuffer(kStringType, str, len * sizeof(Ch)); - return true; - } - - bool StartObject() { return true; } - bool Key(const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } - bool EndObject(SizeType memberCount) { - uint64_t h = Hash(0, kObjectType); - uint64_t* kv = stack_.template Pop(memberCount * 2); - for (SizeType i = 0; i < memberCount; i++) - h ^= Hash(kv[i * 2], kv[i * 2 + 1]); // Use xor to achieve member order insensitive - *stack_.template Push() = h; - return true; - } - - bool StartArray() { return true; } - bool EndArray(SizeType elementCount) { - uint64_t h = Hash(0, kArrayType); - uint64_t* e = stack_.template Pop(elementCount); - for (SizeType i = 0; i < elementCount; i++) - h = Hash(h, e[i]); // Use hash to achieve element order sensitive - *stack_.template Push() = h; - return true; - } - - bool IsValid() const { return stack_.GetSize() == sizeof(uint64_t); } - - uint64_t GetHashCode() const { - RAPIDJSON_ASSERT(IsValid()); - return *stack_.template Top(); - } - -private: - static const size_t kDefaultSize = 256; - struct Number { - union U { - uint64_t u; - int64_t i; - }u; - double d; - }; - - bool WriteType(Type type) { return WriteBuffer(type, 0, 0); } - - bool WriteNumber(const Number& n) { return WriteBuffer(kNumberType, &n, sizeof(n)); } - - bool WriteBuffer(Type type, const void* data, size_t len) { - // FNV-1a from http://isthe.com/chongo/tech/comp/fnv/ - uint64_t h = Hash(RAPIDJSON_UINT64_C2(0x84222325, 0xcbf29ce4), type); - const unsigned char* d = static_cast(data); - for (size_t i = 0; i < len; i++) - h = Hash(h, d[i]); - *stack_.template Push() = h; - return true; - } - - static uint64_t Hash(uint64_t h, uint64_t d) { - static const uint64_t kPrime = RAPIDJSON_UINT64_C2(0x00000100, 0x000001b3); - h ^= d; - h *= kPrime; - return h; - } - - Stack stack_; -}; - -/////////////////////////////////////////////////////////////////////////////// -// SchemaValidationContext - -template -struct SchemaValidationContext { - typedef Schema SchemaType; - typedef ISchemaStateFactory SchemaValidatorFactoryType; - typedef IValidationErrorHandler ErrorHandlerType; - typedef typename SchemaType::ValueType ValueType; - typedef typename ValueType::Ch Ch; - - enum PatternValidatorType { - kPatternValidatorOnly, - kPatternValidatorWithProperty, - kPatternValidatorWithAdditionalProperty - }; - - SchemaValidationContext(SchemaValidatorFactoryType& f, ErrorHandlerType& eh, const SchemaType* s, unsigned fl = 0) : - factory(f), - error_handler(eh), - schema(s), - flags(fl), - valueSchema(), - invalidKeyword(), - invalidCode(), - hasher(), - arrayElementHashCodes(), - validators(), - validatorCount(), - patternPropertiesValidators(), - patternPropertiesValidatorCount(), - patternPropertiesSchemas(), - patternPropertiesSchemaCount(), - valuePatternValidatorType(kPatternValidatorOnly), - propertyExist(), - inArray(false), - valueUniqueness(false), - arrayUniqueness(false) - { - } - - ~SchemaValidationContext() { - if (hasher) - factory.DestroyHasher(hasher); - if (validators) { - for (SizeType i = 0; i < validatorCount; i++) { - if (validators[i]) { - factory.DestroySchemaValidator(validators[i]); - } - } - factory.FreeState(validators); - } - if (patternPropertiesValidators) { - for (SizeType i = 0; i < patternPropertiesValidatorCount; i++) { - if (patternPropertiesValidators[i]) { - factory.DestroySchemaValidator(patternPropertiesValidators[i]); - } - } - factory.FreeState(patternPropertiesValidators); - } - if (patternPropertiesSchemas) - factory.FreeState(patternPropertiesSchemas); - if (propertyExist) - factory.FreeState(propertyExist); - } - - SchemaValidatorFactoryType& factory; - ErrorHandlerType& error_handler; - const SchemaType* schema; - unsigned flags; - const SchemaType* valueSchema; - const Ch* invalidKeyword; - ValidateErrorCode invalidCode; - void* hasher; // Only validator access - void* arrayElementHashCodes; // Only validator access this - ISchemaValidator** validators; - SizeType validatorCount; - ISchemaValidator** patternPropertiesValidators; - SizeType patternPropertiesValidatorCount; - const SchemaType** patternPropertiesSchemas; - SizeType patternPropertiesSchemaCount; - PatternValidatorType valuePatternValidatorType; - PatternValidatorType objectPatternValidatorType; - SizeType arrayElementIndex; - bool* propertyExist; - bool inArray; - bool valueUniqueness; - bool arrayUniqueness; -}; - -/////////////////////////////////////////////////////////////////////////////// -// Schema - -template -class Schema { -public: - typedef typename SchemaDocumentType::ValueType ValueType; - typedef typename SchemaDocumentType::AllocatorType AllocatorType; - typedef typename SchemaDocumentType::PointerType PointerType; - typedef typename ValueType::EncodingType EncodingType; - typedef typename EncodingType::Ch Ch; - typedef SchemaValidationContext Context; - typedef Schema SchemaType; - typedef GenericValue SValue; - typedef IValidationErrorHandler ErrorHandler; - typedef GenericUri UriType; - friend class GenericSchemaDocument; - - Schema(SchemaDocumentType* schemaDocument, const PointerType& p, const ValueType& value, const ValueType& document, AllocatorType* allocator, const UriType& id = UriType()) : - allocator_(allocator), - uri_(schemaDocument->GetURI(), *allocator), - id_(id, allocator), - spec_(schemaDocument->GetSpecification()), - pointer_(p, allocator), - typeless_(schemaDocument->GetTypeless()), - enum_(), - enumCount_(), - not_(), - type_((1 << kTotalSchemaType) - 1), // typeless - validatorCount_(), - notValidatorIndex_(), - properties_(), - additionalPropertiesSchema_(), - patternProperties_(), - patternPropertyCount_(), - propertyCount_(), - minProperties_(), - maxProperties_(SizeType(~0)), - additionalProperties_(true), - hasDependencies_(), - hasRequired_(), - hasSchemaDependencies_(), - additionalItemsSchema_(), - itemsList_(), - itemsTuple_(), - itemsTupleCount_(), - minItems_(), - maxItems_(SizeType(~0)), - additionalItems_(true), - uniqueItems_(false), - pattern_(), - minLength_(0), - maxLength_(~SizeType(0)), - exclusiveMinimum_(false), - exclusiveMaximum_(false), - defaultValueLength_(0), - readOnly_(false), - writeOnly_(false), - nullable_(false) - { - GenericStringBuffer sb; - p.StringifyUriFragment(sb); - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Schema", sb.GetString(), id.GetString()); - - typedef typename ValueType::ConstValueIterator ConstValueIterator; - typedef typename ValueType::ConstMemberIterator ConstMemberIterator; - - // PR #1393 - // Early add this Schema and its $ref(s) in schemaDocument's map to avoid infinite - // recursion (with recursive schemas), since schemaDocument->getSchema() is always - // checked before creating a new one. Don't cache typeless_, though. - if (this != typeless_) { - typedef typename SchemaDocumentType::SchemaEntry SchemaEntry; - SchemaEntry *entry = schemaDocument->schemaMap_.template Push(); - new (entry) SchemaEntry(pointer_, this, true, allocator_); - schemaDocument->AddSchemaRefs(this); - } - - if (!value.IsObject()) - return; - - // If we have an id property, resolve it with the in-scope id - // Not supported for open api 2.0 or 3.0 - if (spec_.oapi != kVersion20 && spec_.oapi != kVersion30) - if (const ValueType* v = GetMember(value, GetIdString())) { - if (v->IsString()) { - UriType local(*v, allocator); - id_ = local.Resolve(id_, allocator); - RAPIDJSON_SCHEMA_PRINT(SchemaIds, id.GetString(), v->GetString(), id_.GetString()); - } - } - - if (const ValueType* v = GetMember(value, GetTypeString())) { - type_ = 0; - if (v->IsString()) - AddType(*v); - else if (v->IsArray()) - for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) - AddType(*itr); - } - - if (const ValueType* v = GetMember(value, GetEnumString())) { - if (v->IsArray() && v->Size() > 0) { - enum_ = static_cast(allocator_->Malloc(sizeof(uint64_t) * v->Size())); - for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) { - typedef Hasher > EnumHasherType; - char buffer[256u + 24]; - MemoryPoolAllocator hasherAllocator(buffer, sizeof(buffer)); - EnumHasherType h(&hasherAllocator, 256); - itr->Accept(h); - enum_[enumCount_++] = h.GetHashCode(); - } - } - } - - if (schemaDocument) - AssignIfExist(allOf_, *schemaDocument, p, value, GetAllOfString(), document); - - // AnyOf, OneOf, Not not supported for open api 2.0 - if (schemaDocument && spec_.oapi != kVersion20) { - AssignIfExist(anyOf_, *schemaDocument, p, value, GetAnyOfString(), document); - AssignIfExist(oneOf_, *schemaDocument, p, value, GetOneOfString(), document); - - if (const ValueType* v = GetMember(value, GetNotString())) { - schemaDocument->CreateSchema(¬_, p.Append(GetNotString(), allocator_), *v, document, id_); - notValidatorIndex_ = validatorCount_; - validatorCount_++; - } - } - - // Object - - const ValueType* properties = GetMember(value, GetPropertiesString()); - const ValueType* required = GetMember(value, GetRequiredString()); - const ValueType* dependencies = GetMember(value, GetDependenciesString()); - { - // Gather properties from properties/required/dependencies - SValue allProperties(kArrayType); - - if (properties && properties->IsObject()) - for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) - AddUniqueElement(allProperties, itr->name); - - if (required && required->IsArray()) - for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) - if (itr->IsString()) - AddUniqueElement(allProperties, *itr); - - // Dependencies not supported for open api 2.0 and 3.0 - if (spec_.oapi != kVersion20 && spec_.oapi != kVersion30) - if (dependencies && dependencies->IsObject()) - for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { - AddUniqueElement(allProperties, itr->name); - if (itr->value.IsArray()) - for (ConstValueIterator i = itr->value.Begin(); i != itr->value.End(); ++i) - if (i->IsString()) - AddUniqueElement(allProperties, *i); - } - - if (allProperties.Size() > 0) { - propertyCount_ = allProperties.Size(); - properties_ = static_cast(allocator_->Malloc(sizeof(Property) * propertyCount_)); - for (SizeType i = 0; i < propertyCount_; i++) { - new (&properties_[i]) Property(); - properties_[i].name = allProperties[i]; - properties_[i].schema = typeless_; - } - } - } - - if (properties && properties->IsObject()) { - PointerType q = p.Append(GetPropertiesString(), allocator_); - for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) { - SizeType index; - if (FindPropertyIndex(itr->name, &index)) - schemaDocument->CreateSchema(&properties_[index].schema, q.Append(itr->name, allocator_), itr->value, document, id_); - } - } - - // PatternProperties not supported for open api 2.0 and 3.0 - if (spec_.oapi != kVersion20 && spec_.oapi != kVersion30) - if (const ValueType* v = GetMember(value, GetPatternPropertiesString())) { - PointerType q = p.Append(GetPatternPropertiesString(), allocator_); - patternProperties_ = static_cast(allocator_->Malloc(sizeof(PatternProperty) * v->MemberCount())); - patternPropertyCount_ = 0; - - for (ConstMemberIterator itr = v->MemberBegin(); itr != v->MemberEnd(); ++itr) { - new (&patternProperties_[patternPropertyCount_]) PatternProperty(); - PointerType r = q.Append(itr->name, allocator_); - patternProperties_[patternPropertyCount_].pattern = CreatePattern(itr->name, schemaDocument, r); - schemaDocument->CreateSchema(&patternProperties_[patternPropertyCount_].schema, r, itr->value, document, id_); - patternPropertyCount_++; - } - } - - if (required && required->IsArray()) - for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) - if (itr->IsString()) { - SizeType index; - if (FindPropertyIndex(*itr, &index)) { - properties_[index].required = true; - hasRequired_ = true; - } - } - - // Dependencies not supported for open api 2.0 and 3.0 - if (spec_.oapi != kVersion20 && spec_.oapi != kVersion30) - if (dependencies && dependencies->IsObject()) { - PointerType q = p.Append(GetDependenciesString(), allocator_); - hasDependencies_ = true; - for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { - SizeType sourceIndex; - if (FindPropertyIndex(itr->name, &sourceIndex)) { - if (itr->value.IsArray()) { - properties_[sourceIndex].dependencies = static_cast(allocator_->Malloc(sizeof(bool) * propertyCount_)); - std::memset(properties_[sourceIndex].dependencies, 0, sizeof(bool)* propertyCount_); - for (ConstValueIterator targetItr = itr->value.Begin(); targetItr != itr->value.End(); ++targetItr) { - SizeType targetIndex; - if (FindPropertyIndex(*targetItr, &targetIndex)) - properties_[sourceIndex].dependencies[targetIndex] = true; - } - } - else if (itr->value.IsObject()) { - hasSchemaDependencies_ = true; - schemaDocument->CreateSchema(&properties_[sourceIndex].dependenciesSchema, q.Append(itr->name, allocator_), itr->value, document, id_); - properties_[sourceIndex].dependenciesValidatorIndex = validatorCount_; - validatorCount_++; - } - } - } - } - - if (const ValueType* v = GetMember(value, GetAdditionalPropertiesString())) { - if (v->IsBool()) - additionalProperties_ = v->GetBool(); - else if (v->IsObject()) - schemaDocument->CreateSchema(&additionalPropertiesSchema_, p.Append(GetAdditionalPropertiesString(), allocator_), *v, document, id_); - } - - AssignIfExist(minProperties_, value, GetMinPropertiesString()); - AssignIfExist(maxProperties_, value, GetMaxPropertiesString()); - - // Array - if (const ValueType* v = GetMember(value, GetItemsString())) { - PointerType q = p.Append(GetItemsString(), allocator_); - if (v->IsObject()) // List validation - schemaDocument->CreateSchema(&itemsList_, q, *v, document, id_); - else if (v->IsArray()) { // Tuple validation - itemsTuple_ = static_cast(allocator_->Malloc(sizeof(const Schema*) * v->Size())); - SizeType index = 0; - for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr, index++) - schemaDocument->CreateSchema(&itemsTuple_[itemsTupleCount_++], q.Append(index, allocator_), *itr, document, id_); - } - } - - AssignIfExist(minItems_, value, GetMinItemsString()); - AssignIfExist(maxItems_, value, GetMaxItemsString()); - - // AdditionalItems not supported for openapi 2.0 and 3.0 - if (spec_.oapi != kVersion20 && spec_.oapi != kVersion30) - if (const ValueType* v = GetMember(value, GetAdditionalItemsString())) { - if (v->IsBool()) - additionalItems_ = v->GetBool(); - else if (v->IsObject()) - schemaDocument->CreateSchema(&additionalItemsSchema_, p.Append(GetAdditionalItemsString(), allocator_), *v, document, id_); - } - - AssignIfExist(uniqueItems_, value, GetUniqueItemsString()); - - // String - AssignIfExist(minLength_, value, GetMinLengthString()); - AssignIfExist(maxLength_, value, GetMaxLengthString()); - - if (const ValueType* v = GetMember(value, GetPatternString())) - pattern_ = CreatePattern(*v, schemaDocument, p.Append(GetPatternString(), allocator_)); - - // Number - if (const ValueType* v = GetMember(value, GetMinimumString())) - if (v->IsNumber()) - minimum_.CopyFrom(*v, *allocator_); - - if (const ValueType* v = GetMember(value, GetMaximumString())) - if (v->IsNumber()) - maximum_.CopyFrom(*v, *allocator_); - - AssignIfExist(exclusiveMinimum_, value, GetExclusiveMinimumString()); - AssignIfExist(exclusiveMaximum_, value, GetExclusiveMaximumString()); - - if (const ValueType* v = GetMember(value, GetMultipleOfString())) - if (v->IsNumber() && v->GetDouble() > 0.0) - multipleOf_.CopyFrom(*v, *allocator_); - - // Default - if (const ValueType* v = GetMember(value, GetDefaultValueString())) - if (v->IsString()) - defaultValueLength_ = v->GetStringLength(); - - // ReadOnly - open api only (until draft 7 supported) - // WriteOnly - open api 3 only (until draft 7 supported) - // Both can't be true - if (spec_.oapi != kVersionNone) - AssignIfExist(readOnly_, value, GetReadOnlyString()); - if (spec_.oapi >= kVersion30) - AssignIfExist(writeOnly_, value, GetWriteOnlyString()); - if (readOnly_ && writeOnly_) - schemaDocument->SchemaError(kSchemaErrorReadOnlyAndWriteOnly, p); - - // Nullable - open api 3 only - // If true add 'null' as allowable type - if (spec_.oapi >= kVersion30) { - AssignIfExist(nullable_, value, GetNullableString()); - if (nullable_) - AddType(GetNullString()); - } - } - - ~Schema() { - AllocatorType::Free(enum_); - if (properties_) { - for (SizeType i = 0; i < propertyCount_; i++) - properties_[i].~Property(); - AllocatorType::Free(properties_); - } - if (patternProperties_) { - for (SizeType i = 0; i < patternPropertyCount_; i++) - patternProperties_[i].~PatternProperty(); - AllocatorType::Free(patternProperties_); - } - AllocatorType::Free(itemsTuple_); -#if RAPIDJSON_SCHEMA_HAS_REGEX - if (pattern_) { - pattern_->~RegexType(); - AllocatorType::Free(pattern_); - } -#endif - } - - const SValue& GetURI() const { - return uri_; - } - - const UriType& GetId() const { - return id_; - } - - const Specification& GetSpecification() const { - return spec_; - } - - const PointerType& GetPointer() const { - return pointer_; - } - - bool BeginValue(Context& context) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::BeginValue"); - if (context.inArray) { - if (uniqueItems_) - context.valueUniqueness = true; - - if (itemsList_) - context.valueSchema = itemsList_; - else if (itemsTuple_) { - if (context.arrayElementIndex < itemsTupleCount_) - context.valueSchema = itemsTuple_[context.arrayElementIndex]; - else if (additionalItemsSchema_) - context.valueSchema = additionalItemsSchema_; - else if (additionalItems_) - context.valueSchema = typeless_; - else { - context.error_handler.DisallowedItem(context.arrayElementIndex); - // Must set valueSchema for when kValidateContinueOnErrorFlag is set, else reports spurious type error - context.valueSchema = typeless_; - // Must bump arrayElementIndex for when kValidateContinueOnErrorFlag is set - context.arrayElementIndex++; - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorAdditionalItems); - } - } - else - context.valueSchema = typeless_; - - context.arrayElementIndex++; - } - return true; - } - - RAPIDJSON_FORCEINLINE bool EndValue(Context& context) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::EndValue"); - // Only check pattern properties if we have validators - if (context.patternPropertiesValidatorCount > 0) { - bool otherValid = false; - SizeType count = context.patternPropertiesValidatorCount; - if (context.objectPatternValidatorType != Context::kPatternValidatorOnly) - otherValid = context.patternPropertiesValidators[--count]->IsValid(); - - bool patternValid = true; - for (SizeType i = 0; i < count; i++) - if (!context.patternPropertiesValidators[i]->IsValid()) { - patternValid = false; - break; - } - - if (context.objectPatternValidatorType == Context::kPatternValidatorOnly) { - if (!patternValid) { - context.error_handler.PropertyViolations(context.patternPropertiesValidators, count); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPatternProperties); - } - } - else if (context.objectPatternValidatorType == Context::kPatternValidatorWithProperty) { - if (!patternValid || !otherValid) { - context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPatternProperties); - } - } - else if (!patternValid && !otherValid) { // kPatternValidatorWithAdditionalProperty) - context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPatternProperties); - } - } - - // For enums only check if we have a hasher - if (enum_ && context.hasher) { - const uint64_t h = context.factory.GetHashCode(context.hasher); - for (SizeType i = 0; i < enumCount_; i++) - if (enum_[i] == h) - goto foundEnum; - context.error_handler.DisallowedValue(kValidateErrorEnum); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorEnum); - foundEnum:; - } - - // Only check allOf etc if we have validators - if (context.validatorCount > 0) { - if (allOf_.schemas) - for (SizeType i = allOf_.begin; i < allOf_.begin + allOf_.count; i++) - if (!context.validators[i]->IsValid()) { - context.error_handler.NotAllOf(&context.validators[allOf_.begin], allOf_.count); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorAllOf); - } - - if (anyOf_.schemas) { - for (SizeType i = anyOf_.begin; i < anyOf_.begin + anyOf_.count; i++) - if (context.validators[i]->IsValid()) - goto foundAny; - context.error_handler.NoneOf(&context.validators[anyOf_.begin], anyOf_.count); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorAnyOf); - foundAny:; - } - - if (oneOf_.schemas) { - bool oneValid = false; - SizeType firstMatch = 0; - for (SizeType i = oneOf_.begin; i < oneOf_.begin + oneOf_.count; i++) - if (context.validators[i]->IsValid()) { - if (oneValid) { - context.error_handler.MultipleOneOf(firstMatch, i - oneOf_.begin); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorOneOfMatch); - } else { - oneValid = true; - firstMatch = i - oneOf_.begin; - } - } - if (!oneValid) { - context.error_handler.NotOneOf(&context.validators[oneOf_.begin], oneOf_.count); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorOneOf); - } - } - - if (not_ && context.validators[notValidatorIndex_]->IsValid()) { - context.error_handler.Disallowed(); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorNot); - } - } - - return true; - } - - bool Null(Context& context) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Null"); - if (!(type_ & (1 << kNullSchemaType))) { - DisallowedType(context, GetNullString()); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); - } - return CreateParallelValidator(context); - } - - bool Bool(Context& context, bool b) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Bool", b); - if (!CheckBool(context, b)) - return false; - return CreateParallelValidator(context); - } - - bool Int(Context& context, int i) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Int", (int64_t)i); - if (!CheckInt(context, i)) - return false; - return CreateParallelValidator(context); - } - - bool Uint(Context& context, unsigned u) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Uint", (uint64_t)u); - if (!CheckUint(context, u)) - return false; - return CreateParallelValidator(context); - } - - bool Int64(Context& context, int64_t i) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Int64", i); - if (!CheckInt(context, i)) - return false; - return CreateParallelValidator(context); - } - - bool Uint64(Context& context, uint64_t u) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Uint64", u); - if (!CheckUint(context, u)) - return false; - return CreateParallelValidator(context); - } - - bool Double(Context& context, double d) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Double", d); - if (!(type_ & (1 << kNumberSchemaType))) { - DisallowedType(context, GetNumberString()); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); - } - - if (!minimum_.IsNull() && !CheckDoubleMinimum(context, d)) - return false; - - if (!maximum_.IsNull() && !CheckDoubleMaximum(context, d)) - return false; - - if (!multipleOf_.IsNull() && !CheckDoubleMultipleOf(context, d)) - return false; - - return CreateParallelValidator(context); - } - - bool String(Context& context, const Ch* str, SizeType length, bool) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::String", str); - if (!(type_ & (1 << kStringSchemaType))) { - DisallowedType(context, GetStringString()); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); - } - - if (minLength_ != 0 || maxLength_ != SizeType(~0)) { - SizeType count; - if (internal::CountStringCodePoint(str, length, &count)) { - if (count < minLength_) { - context.error_handler.TooShort(str, length, minLength_); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMinLength); - } - if (count > maxLength_) { - context.error_handler.TooLong(str, length, maxLength_); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMaxLength); - } - } - } - - if (pattern_ && !IsPatternMatch(pattern_, str, length)) { - context.error_handler.DoesNotMatch(str, length); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPattern); - } - - return CreateParallelValidator(context); - } - - bool StartObject(Context& context) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::StartObject"); - if (!(type_ & (1 << kObjectSchemaType))) { - DisallowedType(context, GetObjectString()); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); - } - - if (hasDependencies_ || hasRequired_) { - context.propertyExist = static_cast(context.factory.MallocState(sizeof(bool) * propertyCount_)); - std::memset(context.propertyExist, 0, sizeof(bool) * propertyCount_); - } - - if (patternProperties_) { // pre-allocate schema array - SizeType count = patternPropertyCount_ + 1; // extra for valuePatternValidatorType - context.patternPropertiesSchemas = static_cast(context.factory.MallocState(sizeof(const SchemaType*) * count)); - context.patternPropertiesSchemaCount = 0; - std::memset(context.patternPropertiesSchemas, 0, sizeof(SchemaType*) * count); - } - - return CreateParallelValidator(context); - } - - bool Key(Context& context, const Ch* str, SizeType len, bool) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::Key", str); - - if (patternProperties_) { - context.patternPropertiesSchemaCount = 0; - for (SizeType i = 0; i < patternPropertyCount_; i++) - if (patternProperties_[i].pattern && IsPatternMatch(patternProperties_[i].pattern, str, len)) { - context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = patternProperties_[i].schema; - context.valueSchema = typeless_; - } - } - - SizeType index = 0; - if (FindPropertyIndex(ValueType(str, len).Move(), &index)) { - if (context.patternPropertiesSchemaCount > 0) { - context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = properties_[index].schema; - context.valueSchema = typeless_; - context.valuePatternValidatorType = Context::kPatternValidatorWithProperty; - } - else - context.valueSchema = properties_[index].schema; - - if (context.propertyExist) - context.propertyExist[index] = true; - - return true; - } - - if (additionalPropertiesSchema_) { - if (context.patternPropertiesSchemaCount > 0) { - context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = additionalPropertiesSchema_; - context.valueSchema = typeless_; - context.valuePatternValidatorType = Context::kPatternValidatorWithAdditionalProperty; - } - else - context.valueSchema = additionalPropertiesSchema_; - return true; - } - else if (additionalProperties_) { - context.valueSchema = typeless_; - return true; - } - - if (context.patternPropertiesSchemaCount == 0) { // patternProperties are not additional properties - // Must set valueSchema for when kValidateContinueOnErrorFlag is set, else reports spurious type error - context.valueSchema = typeless_; - context.error_handler.DisallowedProperty(str, len); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorAdditionalProperties); - } - - return true; - } - - bool EndObject(Context& context, SizeType memberCount) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::EndObject"); - if (hasRequired_) { - context.error_handler.StartMissingProperties(); - for (SizeType index = 0; index < propertyCount_; index++) - if (properties_[index].required && !context.propertyExist[index]) - if (properties_[index].schema->defaultValueLength_ == 0 ) - context.error_handler.AddMissingProperty(properties_[index].name); - if (context.error_handler.EndMissingProperties()) - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorRequired); - } - - if (memberCount < minProperties_) { - context.error_handler.TooFewProperties(memberCount, minProperties_); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMinProperties); - } - - if (memberCount > maxProperties_) { - context.error_handler.TooManyProperties(memberCount, maxProperties_); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMaxProperties); - } - - if (hasDependencies_) { - context.error_handler.StartDependencyErrors(); - for (SizeType sourceIndex = 0; sourceIndex < propertyCount_; sourceIndex++) { - const Property& source = properties_[sourceIndex]; - if (context.propertyExist[sourceIndex]) { - if (source.dependencies) { - context.error_handler.StartMissingDependentProperties(); - for (SizeType targetIndex = 0; targetIndex < propertyCount_; targetIndex++) - if (source.dependencies[targetIndex] && !context.propertyExist[targetIndex]) - context.error_handler.AddMissingDependentProperty(properties_[targetIndex].name); - context.error_handler.EndMissingDependentProperties(source.name); - } - else if (source.dependenciesSchema) { - ISchemaValidator* dependenciesValidator = context.validators[source.dependenciesValidatorIndex]; - if (!dependenciesValidator->IsValid()) - context.error_handler.AddDependencySchemaError(source.name, dependenciesValidator); - } - } - } - if (context.error_handler.EndDependencyErrors()) - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorDependencies); - } - - return true; - } - - bool StartArray(Context& context) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::StartArray"); - context.arrayElementIndex = 0; - context.inArray = true; // Ensure we note that we are in an array - - if (!(type_ & (1 << kArraySchemaType))) { - DisallowedType(context, GetArrayString()); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); - } - - return CreateParallelValidator(context); - } - - bool EndArray(Context& context, SizeType elementCount) const { - RAPIDJSON_SCHEMA_PRINT(Method, "Schema::EndArray"); - context.inArray = false; - - if (elementCount < minItems_) { - context.error_handler.TooFewItems(elementCount, minItems_); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMinItems); - } - - if (elementCount > maxItems_) { - context.error_handler.TooManyItems(elementCount, maxItems_); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMaxItems); - } - - return true; - } - - static const ValueType& GetValidateErrorKeyword(ValidateErrorCode validateErrorCode) { - switch (validateErrorCode) { - case kValidateErrorMultipleOf: return GetMultipleOfString(); - case kValidateErrorMaximum: return GetMaximumString(); - case kValidateErrorExclusiveMaximum: return GetMaximumString(); // Same - case kValidateErrorMinimum: return GetMinimumString(); - case kValidateErrorExclusiveMinimum: return GetMinimumString(); // Same - - case kValidateErrorMaxLength: return GetMaxLengthString(); - case kValidateErrorMinLength: return GetMinLengthString(); - case kValidateErrorPattern: return GetPatternString(); - - case kValidateErrorMaxItems: return GetMaxItemsString(); - case kValidateErrorMinItems: return GetMinItemsString(); - case kValidateErrorUniqueItems: return GetUniqueItemsString(); - case kValidateErrorAdditionalItems: return GetAdditionalItemsString(); - - case kValidateErrorMaxProperties: return GetMaxPropertiesString(); - case kValidateErrorMinProperties: return GetMinPropertiesString(); - case kValidateErrorRequired: return GetRequiredString(); - case kValidateErrorAdditionalProperties: return GetAdditionalPropertiesString(); - case kValidateErrorPatternProperties: return GetPatternPropertiesString(); - case kValidateErrorDependencies: return GetDependenciesString(); - - case kValidateErrorEnum: return GetEnumString(); - case kValidateErrorType: return GetTypeString(); - - case kValidateErrorOneOf: return GetOneOfString(); - case kValidateErrorOneOfMatch: return GetOneOfString(); // Same - case kValidateErrorAllOf: return GetAllOfString(); - case kValidateErrorAnyOf: return GetAnyOfString(); - case kValidateErrorNot: return GetNotString(); - - case kValidateErrorReadOnly: return GetReadOnlyString(); - case kValidateErrorWriteOnly: return GetWriteOnlyString(); - - default: return GetNullString(); - } - } - - - // Generate functions for string literal according to Ch -#define RAPIDJSON_STRING_(name, ...) \ - static const ValueType& Get##name##String() {\ - static const Ch s[] = { __VA_ARGS__, '\0' };\ - static const ValueType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1));\ - return v;\ - } - - RAPIDJSON_STRING_(Null, 'n', 'u', 'l', 'l') - RAPIDJSON_STRING_(Boolean, 'b', 'o', 'o', 'l', 'e', 'a', 'n') - RAPIDJSON_STRING_(Object, 'o', 'b', 'j', 'e', 'c', 't') - RAPIDJSON_STRING_(Array, 'a', 'r', 'r', 'a', 'y') - RAPIDJSON_STRING_(String, 's', 't', 'r', 'i', 'n', 'g') - RAPIDJSON_STRING_(Number, 'n', 'u', 'm', 'b', 'e', 'r') - RAPIDJSON_STRING_(Integer, 'i', 'n', 't', 'e', 'g', 'e', 'r') - RAPIDJSON_STRING_(Type, 't', 'y', 'p', 'e') - RAPIDJSON_STRING_(Enum, 'e', 'n', 'u', 'm') - RAPIDJSON_STRING_(AllOf, 'a', 'l', 'l', 'O', 'f') - RAPIDJSON_STRING_(AnyOf, 'a', 'n', 'y', 'O', 'f') - RAPIDJSON_STRING_(OneOf, 'o', 'n', 'e', 'O', 'f') - RAPIDJSON_STRING_(Not, 'n', 'o', 't') - RAPIDJSON_STRING_(Properties, 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') - RAPIDJSON_STRING_(Required, 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd') - RAPIDJSON_STRING_(Dependencies, 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 'c', 'i', 'e', 's') - RAPIDJSON_STRING_(PatternProperties, 'p', 'a', 't', 't', 'e', 'r', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') - RAPIDJSON_STRING_(AdditionalProperties, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') - RAPIDJSON_STRING_(MinProperties, 'm', 'i', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') - RAPIDJSON_STRING_(MaxProperties, 'm', 'a', 'x', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') - RAPIDJSON_STRING_(Items, 'i', 't', 'e', 'm', 's') - RAPIDJSON_STRING_(MinItems, 'm', 'i', 'n', 'I', 't', 'e', 'm', 's') - RAPIDJSON_STRING_(MaxItems, 'm', 'a', 'x', 'I', 't', 'e', 'm', 's') - RAPIDJSON_STRING_(AdditionalItems, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'I', 't', 'e', 'm', 's') - RAPIDJSON_STRING_(UniqueItems, 'u', 'n', 'i', 'q', 'u', 'e', 'I', 't', 'e', 'm', 's') - RAPIDJSON_STRING_(MinLength, 'm', 'i', 'n', 'L', 'e', 'n', 'g', 't', 'h') - RAPIDJSON_STRING_(MaxLength, 'm', 'a', 'x', 'L', 'e', 'n', 'g', 't', 'h') - RAPIDJSON_STRING_(Pattern, 'p', 'a', 't', 't', 'e', 'r', 'n') - RAPIDJSON_STRING_(Minimum, 'm', 'i', 'n', 'i', 'm', 'u', 'm') - RAPIDJSON_STRING_(Maximum, 'm', 'a', 'x', 'i', 'm', 'u', 'm') - RAPIDJSON_STRING_(ExclusiveMinimum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'i', 'n', 'i', 'm', 'u', 'm') - RAPIDJSON_STRING_(ExclusiveMaximum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'a', 'x', 'i', 'm', 'u', 'm') - RAPIDJSON_STRING_(MultipleOf, 'm', 'u', 'l', 't', 'i', 'p', 'l', 'e', 'O', 'f') - RAPIDJSON_STRING_(DefaultValue, 'd', 'e', 'f', 'a', 'u', 'l', 't') - RAPIDJSON_STRING_(Schema, '$', 's', 'c', 'h', 'e', 'm', 'a') - RAPIDJSON_STRING_(Ref, '$', 'r', 'e', 'f') - RAPIDJSON_STRING_(Id, 'i', 'd') - RAPIDJSON_STRING_(Swagger, 's', 'w', 'a', 'g', 'g', 'e', 'r') - RAPIDJSON_STRING_(OpenApi, 'o', 'p', 'e', 'n', 'a', 'p', 'i') - RAPIDJSON_STRING_(ReadOnly, 'r', 'e', 'a', 'd', 'O', 'n', 'l', 'y') - RAPIDJSON_STRING_(WriteOnly, 'w', 'r', 'i', 't', 'e', 'O', 'n', 'l', 'y') - RAPIDJSON_STRING_(Nullable, 'n', 'u', 'l', 'l', 'a', 'b', 'l', 'e') - -#undef RAPIDJSON_STRING_ - -private: - enum SchemaValueType { - kNullSchemaType, - kBooleanSchemaType, - kObjectSchemaType, - kArraySchemaType, - kStringSchemaType, - kNumberSchemaType, - kIntegerSchemaType, - kTotalSchemaType - }; - -#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX - typedef internal::GenericRegex RegexType; -#elif RAPIDJSON_SCHEMA_USE_STDREGEX - typedef std::basic_regex RegexType; -#else - typedef char RegexType; -#endif - - struct SchemaArray { - SchemaArray() : schemas(), count() {} - ~SchemaArray() { AllocatorType::Free(schemas); } - const SchemaType** schemas; - SizeType begin; // begin index of context.validators - SizeType count; - }; - - template - void AddUniqueElement(V1& a, const V2& v) { - for (typename V1::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) - if (*itr == v) - return; - V1 c(v, *allocator_); - a.PushBack(c, *allocator_); - } - - static const ValueType* GetMember(const ValueType& value, const ValueType& name) { - typename ValueType::ConstMemberIterator itr = value.FindMember(name); - return itr != value.MemberEnd() ? &(itr->value) : 0; - } - - static void AssignIfExist(bool& out, const ValueType& value, const ValueType& name) { - if (const ValueType* v = GetMember(value, name)) - if (v->IsBool()) - out = v->GetBool(); - } - - static void AssignIfExist(SizeType& out, const ValueType& value, const ValueType& name) { - if (const ValueType* v = GetMember(value, name)) - if (v->IsUint64() && v->GetUint64() <= SizeType(~0)) - out = static_cast(v->GetUint64()); - } - - void AssignIfExist(SchemaArray& out, SchemaDocumentType& schemaDocument, const PointerType& p, const ValueType& value, const ValueType& name, const ValueType& document) { - if (const ValueType* v = GetMember(value, name)) { - if (v->IsArray() && v->Size() > 0) { - PointerType q = p.Append(name, allocator_); - out.count = v->Size(); - out.schemas = static_cast(allocator_->Malloc(out.count * sizeof(const Schema*))); - memset(out.schemas, 0, sizeof(Schema*)* out.count); - for (SizeType i = 0; i < out.count; i++) - schemaDocument.CreateSchema(&out.schemas[i], q.Append(i, allocator_), (*v)[i], document, id_); - out.begin = validatorCount_; - validatorCount_ += out.count; - } - } - } - -#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX - template - RegexType* CreatePattern(const ValueType& value, SchemaDocumentType* sd, const PointerType& p) { - if (value.IsString()) { - RegexType* r = new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString(), allocator_); - if (!r->IsValid()) { - sd->SchemaErrorValue(kSchemaErrorRegexInvalid, p, value.GetString(), value.GetStringLength()); - r->~RegexType(); - AllocatorType::Free(r); - r = 0; - } - return r; - } - return 0; - } - - static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType) { - GenericRegexSearch rs(*pattern); - return rs.Search(str); - } -#elif RAPIDJSON_SCHEMA_USE_STDREGEX - template - RegexType* CreatePattern(const ValueType& value, SchemaDocumentType* sd, const PointerType& p) { - if (value.IsString()) { - RegexType *r = static_cast(allocator_->Malloc(sizeof(RegexType))); - try { - return new (r) RegexType(value.GetString(), std::size_t(value.GetStringLength()), std::regex_constants::ECMAScript); - } - catch (const std::regex_error& e) { - sd->SchemaErrorValue(kSchemaErrorRegexInvalid, p, value.GetString(), value.GetStringLength()); - AllocatorType::Free(r); - } - } - return 0; - } - - static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType length) { - std::match_results r; - return std::regex_search(str, str + length, r, *pattern); - } -#else - template - RegexType* CreatePattern(const ValueType&) { - return 0; - } - - static bool IsPatternMatch(const RegexType*, const Ch *, SizeType) { return true; } -#endif // RAPIDJSON_SCHEMA_USE_STDREGEX - - void AddType(const ValueType& type) { - if (type == GetNullString() ) type_ |= 1 << kNullSchemaType; - else if (type == GetBooleanString()) type_ |= 1 << kBooleanSchemaType; - else if (type == GetObjectString() ) type_ |= 1 << kObjectSchemaType; - else if (type == GetArrayString() ) type_ |= 1 << kArraySchemaType; - else if (type == GetStringString() ) type_ |= 1 << kStringSchemaType; - else if (type == GetIntegerString()) type_ |= 1 << kIntegerSchemaType; - else if (type == GetNumberString() ) type_ |= (1 << kNumberSchemaType) | (1 << kIntegerSchemaType); - } - - // Creates parallel validators for allOf, anyOf, oneOf, not and schema dependencies, if required. - // Also creates a hasher for enums and array uniqueness, if required. - // Also a useful place to add type-independent error checks. - bool CreateParallelValidator(Context& context) const { - if (enum_ || context.arrayUniqueness) - context.hasher = context.factory.CreateHasher(); - - if (validatorCount_) { - RAPIDJSON_ASSERT(context.validators == 0); - context.validators = static_cast(context.factory.MallocState(sizeof(ISchemaValidator*) * validatorCount_)); - std::memset(context.validators, 0, sizeof(ISchemaValidator*) * validatorCount_); - context.validatorCount = validatorCount_; - - // Always return after first failure for these sub-validators - if (allOf_.schemas) - CreateSchemaValidators(context, allOf_, false); - - if (anyOf_.schemas) - CreateSchemaValidators(context, anyOf_, false); - - if (oneOf_.schemas) - CreateSchemaValidators(context, oneOf_, false); - - if (not_) - context.validators[notValidatorIndex_] = context.factory.CreateSchemaValidator(*not_, false); - - if (hasSchemaDependencies_) { - for (SizeType i = 0; i < propertyCount_; i++) - if (properties_[i].dependenciesSchema) - context.validators[properties_[i].dependenciesValidatorIndex] = context.factory.CreateSchemaValidator(*properties_[i].dependenciesSchema, false); - } - } - - // Add any other type-independent checks here - if (readOnly_ && (context.flags & kValidateWriteFlag)) { - context.error_handler.DisallowedWhenWriting(); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorReadOnly); - } - if (writeOnly_ && (context.flags & kValidateReadFlag)) { - context.error_handler.DisallowedWhenReading(); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorWriteOnly); - } - - return true; - } - - void CreateSchemaValidators(Context& context, const SchemaArray& schemas, const bool inheritContinueOnErrors) const { - for (SizeType i = 0; i < schemas.count; i++) - context.validators[schemas.begin + i] = context.factory.CreateSchemaValidator(*schemas.schemas[i], inheritContinueOnErrors); - } - - // O(n) - bool FindPropertyIndex(const ValueType& name, SizeType* outIndex) const { - SizeType len = name.GetStringLength(); - const Ch* str = name.GetString(); - for (SizeType index = 0; index < propertyCount_; index++) - if (properties_[index].name.GetStringLength() == len && - (std::memcmp(properties_[index].name.GetString(), str, sizeof(Ch) * len) == 0)) - { - *outIndex = index; - return true; - } - return false; - } - - bool CheckBool(Context& context, bool) const { - if (!(type_ & (1 << kBooleanSchemaType))) { - DisallowedType(context, GetBooleanString()); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); - } - return true; - } - - bool CheckInt(Context& context, int64_t i) const { - if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) { - DisallowedType(context, GetIntegerString()); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); - } - - if (!minimum_.IsNull()) { - if (minimum_.IsInt64()) { - if (exclusiveMinimum_ ? i <= minimum_.GetInt64() : i < minimum_.GetInt64()) { - context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); - RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMinimum_ ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum); - } - } - else if (minimum_.IsUint64()) { - context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); - RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMinimum_ ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum); // i <= max(int64_t) < minimum.GetUint64() - } - else if (!CheckDoubleMinimum(context, static_cast(i))) - return false; - } - - if (!maximum_.IsNull()) { - if (maximum_.IsInt64()) { - if (exclusiveMaximum_ ? i >= maximum_.GetInt64() : i > maximum_.GetInt64()) { - context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); - RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMaximum_ ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum); - } - } - else if (maximum_.IsUint64()) { } - /* do nothing */ // i <= max(int64_t) < maximum_.GetUint64() - else if (!CheckDoubleMaximum(context, static_cast(i))) - return false; - } - - if (!multipleOf_.IsNull()) { - if (multipleOf_.IsUint64()) { - if (static_cast(i >= 0 ? i : -i) % multipleOf_.GetUint64() != 0) { - context.error_handler.NotMultipleOf(i, multipleOf_); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMultipleOf); - } - } - else if (!CheckDoubleMultipleOf(context, static_cast(i))) - return false; - } - - return true; - } - - bool CheckUint(Context& context, uint64_t i) const { - if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) { - DisallowedType(context, GetIntegerString()); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); - } - - if (!minimum_.IsNull()) { - if (minimum_.IsUint64()) { - if (exclusiveMinimum_ ? i <= minimum_.GetUint64() : i < minimum_.GetUint64()) { - context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); - RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMinimum_ ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum); - } - } - else if (minimum_.IsInt64()) - /* do nothing */; // i >= 0 > minimum.Getint64() - else if (!CheckDoubleMinimum(context, static_cast(i))) - return false; - } - - if (!maximum_.IsNull()) { - if (maximum_.IsUint64()) { - if (exclusiveMaximum_ ? i >= maximum_.GetUint64() : i > maximum_.GetUint64()) { - context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); - RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMaximum_ ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum); - } - } - else if (maximum_.IsInt64()) { - context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); - RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMaximum_ ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum); // i >= 0 > maximum_ - } - else if (!CheckDoubleMaximum(context, static_cast(i))) - return false; - } - - if (!multipleOf_.IsNull()) { - if (multipleOf_.IsUint64()) { - if (i % multipleOf_.GetUint64() != 0) { - context.error_handler.NotMultipleOf(i, multipleOf_); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMultipleOf); - } - } - else if (!CheckDoubleMultipleOf(context, static_cast(i))) - return false; - } - - return true; - } - - bool CheckDoubleMinimum(Context& context, double d) const { - if (exclusiveMinimum_ ? d <= minimum_.GetDouble() : d < minimum_.GetDouble()) { - context.error_handler.BelowMinimum(d, minimum_, exclusiveMinimum_); - RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMinimum_ ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum); - } - return true; - } - - bool CheckDoubleMaximum(Context& context, double d) const { - if (exclusiveMaximum_ ? d >= maximum_.GetDouble() : d > maximum_.GetDouble()) { - context.error_handler.AboveMaximum(d, maximum_, exclusiveMaximum_); - RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMaximum_ ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum); - } - return true; - } - - bool CheckDoubleMultipleOf(Context& context, double d) const { - double a = std::abs(d), b = std::abs(multipleOf_.GetDouble()); - double q = std::floor(a / b); - double r = a - q * b; - if (r > 0.0) { - context.error_handler.NotMultipleOf(d, multipleOf_); - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMultipleOf); - } - return true; - } - - void DisallowedType(Context& context, const ValueType& actualType) const { - ErrorHandler& eh = context.error_handler; - eh.StartDisallowedType(); - - if (type_ & (1 << kNullSchemaType)) eh.AddExpectedType(GetNullString()); - if (type_ & (1 << kBooleanSchemaType)) eh.AddExpectedType(GetBooleanString()); - if (type_ & (1 << kObjectSchemaType)) eh.AddExpectedType(GetObjectString()); - if (type_ & (1 << kArraySchemaType)) eh.AddExpectedType(GetArrayString()); - if (type_ & (1 << kStringSchemaType)) eh.AddExpectedType(GetStringString()); - - if (type_ & (1 << kNumberSchemaType)) eh.AddExpectedType(GetNumberString()); - else if (type_ & (1 << kIntegerSchemaType)) eh.AddExpectedType(GetIntegerString()); - - eh.EndDisallowedType(actualType); - } - - struct Property { - Property() : schema(), dependenciesSchema(), dependenciesValidatorIndex(), dependencies(), required(false) {} - ~Property() { AllocatorType::Free(dependencies); } - SValue name; - const SchemaType* schema; - const SchemaType* dependenciesSchema; - SizeType dependenciesValidatorIndex; - bool* dependencies; - bool required; - }; - - struct PatternProperty { - PatternProperty() : schema(), pattern() {} - ~PatternProperty() { - if (pattern) { - pattern->~RegexType(); - AllocatorType::Free(pattern); - } - } - const SchemaType* schema; - RegexType* pattern; - }; - - AllocatorType* allocator_; - SValue uri_; - UriType id_; - Specification spec_; - PointerType pointer_; - const SchemaType* typeless_; - uint64_t* enum_; - SizeType enumCount_; - SchemaArray allOf_; - SchemaArray anyOf_; - SchemaArray oneOf_; - const SchemaType* not_; - unsigned type_; // bitmask of kSchemaType - SizeType validatorCount_; - SizeType notValidatorIndex_; - - Property* properties_; - const SchemaType* additionalPropertiesSchema_; - PatternProperty* patternProperties_; - SizeType patternPropertyCount_; - SizeType propertyCount_; - SizeType minProperties_; - SizeType maxProperties_; - bool additionalProperties_; - bool hasDependencies_; - bool hasRequired_; - bool hasSchemaDependencies_; - - const SchemaType* additionalItemsSchema_; - const SchemaType* itemsList_; - const SchemaType** itemsTuple_; - SizeType itemsTupleCount_; - SizeType minItems_; - SizeType maxItems_; - bool additionalItems_; - bool uniqueItems_; - - RegexType* pattern_; - SizeType minLength_; - SizeType maxLength_; - - SValue minimum_; - SValue maximum_; - SValue multipleOf_; - bool exclusiveMinimum_; - bool exclusiveMaximum_; - - SizeType defaultValueLength_; - - bool readOnly_; - bool writeOnly_; - bool nullable_; -}; - -template -struct TokenHelper { - RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { - *documentStack.template Push() = '/'; - char buffer[21]; - size_t length = static_cast((sizeof(SizeType) == 4 ? u32toa(index, buffer) : u64toa(index, buffer)) - buffer); - for (size_t i = 0; i < length; i++) - *documentStack.template Push() = static_cast(buffer[i]); - } -}; - -// Partial specialized version for char to prevent buffer copying. -template -struct TokenHelper { - RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { - if (sizeof(SizeType) == 4) { - char *buffer = documentStack.template Push(1 + 10); // '/' + uint - *buffer++ = '/'; - const char* end = internal::u32toa(index, buffer); - documentStack.template Pop(static_cast(10 - (end - buffer))); - } - else { - char *buffer = documentStack.template Push(1 + 20); // '/' + uint64 - *buffer++ = '/'; - const char* end = internal::u64toa(index, buffer); - documentStack.template Pop(static_cast(20 - (end - buffer))); - } - } -}; - -} // namespace internal - -/////////////////////////////////////////////////////////////////////////////// -// IGenericRemoteSchemaDocumentProvider - -template -class IGenericRemoteSchemaDocumentProvider { -public: - typedef typename SchemaDocumentType::Ch Ch; - typedef typename SchemaDocumentType::ValueType ValueType; - typedef typename SchemaDocumentType::AllocatorType AllocatorType; - - virtual ~IGenericRemoteSchemaDocumentProvider() {} - virtual const SchemaDocumentType* GetRemoteDocument(const Ch* uri, SizeType length) = 0; - virtual const SchemaDocumentType* GetRemoteDocument(const GenericUri uri, Specification& spec) { - // Default implementation just calls through for compatibility - // Following line suppresses unused parameter warning - (void)spec; - // printf("GetRemoteDocument: %d %d\n", spec.draft, spec.oapi); - return GetRemoteDocument(uri.GetBaseString(), uri.GetBaseStringLength()); - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// GenericSchemaDocument - -//! JSON schema document. -/*! - A JSON schema document is a compiled version of a JSON schema. - It is basically a tree of internal::Schema. - - \note This is an immutable class (i.e. its instance cannot be modified after construction). - \tparam ValueT Type of JSON value (e.g. \c Value ), which also determine the encoding. - \tparam Allocator Allocator type for allocating memory of this document. -*/ -template -class GenericSchemaDocument { -public: - typedef ValueT ValueType; - typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProviderType; - typedef Allocator AllocatorType; - typedef typename ValueType::EncodingType EncodingType; - typedef typename EncodingType::Ch Ch; - typedef internal::Schema SchemaType; - typedef GenericPointer PointerType; - typedef GenericValue GValue; - typedef GenericUri UriType; - typedef GenericStringRef StringRefType; - friend class internal::Schema; - template - friend class GenericSchemaValidator; - - //! Constructor. - /*! - Compile a JSON document into schema document. - - \param document A JSON document as source. - \param uri The base URI of this schema document for purposes of violation reporting. - \param uriLength Length of \c name, in code points. - \param remoteProvider An optional remote schema document provider for resolving remote reference. Can be null. - \param allocator An optional allocator instance for allocating memory. Can be null. - \param pointer An optional JSON pointer to the start of the schema document - \param spec Optional schema draft or OpenAPI version. Used if no specification in document. Defaults to draft-04. - */ - explicit GenericSchemaDocument(const ValueType& document, const Ch* uri = 0, SizeType uriLength = 0, - IRemoteSchemaDocumentProviderType* remoteProvider = 0, Allocator* allocator = 0, - const PointerType& pointer = PointerType(), // PR #1393 - const Specification& spec = Specification(kDraft04)) : - remoteProvider_(remoteProvider), - allocator_(allocator), - ownAllocator_(), - root_(), - typeless_(), - schemaMap_(allocator, kInitialSchemaMapSize), - schemaRef_(allocator, kInitialSchemaRefSize), - spec_(spec), - error_(kObjectType), - currentError_() - { - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaDocument::GenericSchemaDocument"); - if (!allocator_) - ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); - - Ch noUri[1] = {0}; - uri_.SetString(uri ? uri : noUri, uriLength, *allocator_); - docId_ = UriType(uri_, allocator_); - - typeless_ = static_cast(allocator_->Malloc(sizeof(SchemaType))); - new (typeless_) SchemaType(this, PointerType(), ValueType(kObjectType).Move(), ValueType(kObjectType).Move(), allocator_, docId_); - - // Establish the schema draft or open api version. - // We only ever look for '$schema' or 'swagger' or 'openapi' at the root of the document. - SetSchemaSpecification(document); - - // Generate root schema, it will call CreateSchema() to create sub-schemas, - // And call HandleRefSchema() if there are $ref. - // PR #1393 use input pointer if supplied - root_ = typeless_; - if (pointer.GetTokenCount() == 0) { - CreateSchemaRecursive(&root_, pointer, document, document, docId_); - } - else if (const ValueType* v = pointer.Get(document)) { - CreateSchema(&root_, pointer, *v, document, docId_); - } - else { - GenericStringBuffer sb; - pointer.StringifyUriFragment(sb); - SchemaErrorValue(kSchemaErrorStartUnknown, PointerType(), sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch))); - } - - RAPIDJSON_ASSERT(root_ != 0); - - schemaRef_.ShrinkToFit(); // Deallocate all memory for ref - } - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - //! Move constructor in C++11 - GenericSchemaDocument(GenericSchemaDocument&& rhs) RAPIDJSON_NOEXCEPT : - remoteProvider_(rhs.remoteProvider_), - allocator_(rhs.allocator_), - ownAllocator_(rhs.ownAllocator_), - root_(rhs.root_), - typeless_(rhs.typeless_), - schemaMap_(std::move(rhs.schemaMap_)), - schemaRef_(std::move(rhs.schemaRef_)), - uri_(std::move(rhs.uri_)), - docId_(std::move(rhs.docId_)), - spec_(rhs.spec_), - error_(std::move(rhs.error_)), - currentError_(std::move(rhs.currentError_)) - { - rhs.remoteProvider_ = 0; - rhs.allocator_ = 0; - rhs.ownAllocator_ = 0; - rhs.typeless_ = 0; - } -#endif - - //! Destructor - ~GenericSchemaDocument() { - while (!schemaMap_.Empty()) - schemaMap_.template Pop(1)->~SchemaEntry(); - - if (typeless_) { - typeless_->~SchemaType(); - Allocator::Free(typeless_); - } - - // these may contain some allocator data so clear before deleting ownAllocator_ - uri_.SetNull(); - error_.SetNull(); - currentError_.SetNull(); - - RAPIDJSON_DELETE(ownAllocator_); - } - - const GValue& GetURI() const { return uri_; } - - const Specification& GetSpecification() const { return spec_; } - bool IsSupportedSpecification() const { return spec_.IsSupported(); } - - //! Static method to get the specification of any schema document - // Returns kDraftNone if document is silent - static const Specification GetSpecification(const ValueType& document) { - SchemaDraft draft = GetSchemaDraft(document); - if (draft != kDraftNone) - return Specification(draft); - else { - OpenApiVersion oapi = GetOpenApiVersion(document); - if (oapi != kVersionNone) - return Specification(oapi); - } - return Specification(kDraftNone); - } - - //! Get the root schema. - const SchemaType& GetRoot() const { return *root_; } - - //! Gets the error object. - GValue& GetError() { return error_; } - const GValue& GetError() const { return error_; } - - static const StringRefType& GetSchemaErrorKeyword(SchemaErrorCode schemaErrorCode) { - switch (schemaErrorCode) { - case kSchemaErrorStartUnknown: return GetStartUnknownString(); - case kSchemaErrorRefPlainName: return GetRefPlainNameString(); - case kSchemaErrorRefInvalid: return GetRefInvalidString(); - case kSchemaErrorRefPointerInvalid: return GetRefPointerInvalidString(); - case kSchemaErrorRefUnknown: return GetRefUnknownString(); - case kSchemaErrorRefCyclical: return GetRefCyclicalString(); - case kSchemaErrorRefNoRemoteProvider: return GetRefNoRemoteProviderString(); - case kSchemaErrorRefNoRemoteSchema: return GetRefNoRemoteSchemaString(); - case kSchemaErrorRegexInvalid: return GetRegexInvalidString(); - case kSchemaErrorSpecUnknown: return GetSpecUnknownString(); - case kSchemaErrorSpecUnsupported: return GetSpecUnsupportedString(); - case kSchemaErrorSpecIllegal: return GetSpecIllegalString(); - case kSchemaErrorReadOnlyAndWriteOnly: return GetReadOnlyAndWriteOnlyString(); - default: return GetNullString(); - } - } - - //! Default error method - void SchemaError(const SchemaErrorCode code, const PointerType& location) { - currentError_ = GValue(kObjectType); - AddCurrentError(code, location); - } - - //! Method for error with single string value insert - void SchemaErrorValue(const SchemaErrorCode code, const PointerType& location, const Ch* value, SizeType length) { - currentError_ = GValue(kObjectType); - currentError_.AddMember(GetValueString(), GValue(value, length, *allocator_).Move(), *allocator_); - AddCurrentError(code, location); - } - - //! Method for error with invalid pointer - void SchemaErrorPointer(const SchemaErrorCode code, const PointerType& location, const Ch* value, SizeType length, const PointerType& pointer) { - currentError_ = GValue(kObjectType); - currentError_.AddMember(GetValueString(), GValue(value, length, *allocator_).Move(), *allocator_); - currentError_.AddMember(GetOffsetString(), static_cast(pointer.GetParseErrorOffset() / sizeof(Ch)), *allocator_); - AddCurrentError(code, location); - } - - private: - //! Prohibit copying - GenericSchemaDocument(const GenericSchemaDocument&); - //! Prohibit assignment - GenericSchemaDocument& operator=(const GenericSchemaDocument&); - - typedef const PointerType* SchemaRefPtr; // PR #1393 - - struct SchemaEntry { - SchemaEntry(const PointerType& p, SchemaType* s, bool o, Allocator* allocator) : pointer(p, allocator), schema(s), owned(o) {} - ~SchemaEntry() { - if (owned) { - schema->~SchemaType(); - Allocator::Free(schema); - } - } - PointerType pointer; - SchemaType* schema; - bool owned; - }; - - void AddErrorInstanceLocation(GValue& result, const PointerType& location) { - GenericStringBuffer sb; - location.StringifyUriFragment(sb); - GValue instanceRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), *allocator_); - result.AddMember(GetInstanceRefString(), instanceRef, *allocator_); - } - - void AddError(GValue& keyword, GValue& error) { - typename GValue::MemberIterator member = error_.FindMember(keyword); - if (member == error_.MemberEnd()) - error_.AddMember(keyword, error, *allocator_); - else { - if (member->value.IsObject()) { - GValue errors(kArrayType); - errors.PushBack(member->value, *allocator_); - member->value = errors; - } - member->value.PushBack(error, *allocator_); - } - } - - void AddCurrentError(const SchemaErrorCode code, const PointerType& location) { - RAPIDJSON_SCHEMA_PRINT(InvalidKeyword, GetSchemaErrorKeyword(code)); - currentError_.AddMember(GetErrorCodeString(), code, *allocator_); - AddErrorInstanceLocation(currentError_, location); - AddError(GValue(GetSchemaErrorKeyword(code)).Move(), currentError_); - } - -#define RAPIDJSON_STRING_(name, ...) \ - static const StringRefType& Get##name##String() {\ - static const Ch s[] = { __VA_ARGS__, '\0' };\ - static const StringRefType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1)); \ - return v;\ - } - - RAPIDJSON_STRING_(InstanceRef, 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', 'R', 'e', 'f') - RAPIDJSON_STRING_(ErrorCode, 'e', 'r', 'r', 'o', 'r', 'C', 'o', 'd', 'e') - RAPIDJSON_STRING_(Value, 'v', 'a', 'l', 'u', 'e') - RAPIDJSON_STRING_(Offset, 'o', 'f', 'f', 's', 'e', 't') - - RAPIDJSON_STRING_(Null, 'n', 'u', 'l', 'l') - RAPIDJSON_STRING_(SpecUnknown, 'S', 'p', 'e', 'c', 'U', 'n', 'k', 'n', 'o', 'w', 'n') - RAPIDJSON_STRING_(SpecUnsupported, 'S', 'p', 'e', 'c', 'U', 'n', 's', 'u', 'p', 'p', 'o', 'r', 't', 'e', 'd') - RAPIDJSON_STRING_(SpecIllegal, 'S', 'p', 'e', 'c', 'I', 'l', 'l', 'e', 'g', 'a', 'l') - RAPIDJSON_STRING_(StartUnknown, 'S', 't', 'a', 'r', 't', 'U', 'n', 'k', 'n', 'o', 'w', 'n') - RAPIDJSON_STRING_(RefPlainName, 'R', 'e', 'f', 'P', 'l', 'a', 'i', 'n', 'N', 'a', 'm', 'e') - RAPIDJSON_STRING_(RefInvalid, 'R', 'e', 'f', 'I', 'n', 'v', 'a', 'l', 'i', 'd') - RAPIDJSON_STRING_(RefPointerInvalid, 'R', 'e', 'f', 'P', 'o', 'i', 'n', 't', 'e', 'r', 'I', 'n', 'v', 'a', 'l', 'i', 'd') - RAPIDJSON_STRING_(RefUnknown, 'R', 'e', 'f', 'U', 'n', 'k', 'n', 'o', 'w', 'n') - RAPIDJSON_STRING_(RefCyclical, 'R', 'e', 'f', 'C', 'y', 'c', 'l', 'i', 'c', 'a', 'l') - RAPIDJSON_STRING_(RefNoRemoteProvider, 'R', 'e', 'f', 'N', 'o', 'R', 'e', 'm', 'o', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r') - RAPIDJSON_STRING_(RefNoRemoteSchema, 'R', 'e', 'f', 'N', 'o', 'R', 'e', 'm', 'o', 't', 'e', 'S', 'c', 'h', 'e', 'm', 'a') - RAPIDJSON_STRING_(ReadOnlyAndWriteOnly, 'R', 'e', 'a', 'd', 'O', 'n', 'l', 'y', 'A', 'n', 'd', 'W', 'r', 'i', 't', 'e', 'O', 'n', 'l', 'y') - RAPIDJSON_STRING_(RegexInvalid, 'R', 'e', 'g', 'e', 'x', 'I', 'n', 'v', 'a', 'l', 'i', 'd') - -#undef RAPIDJSON_STRING_ - - // Static method to get schema draft of any schema document - static SchemaDraft GetSchemaDraft(const ValueType& document) { - static const Ch kDraft03String[] = { 'h', 't', 't', 'p', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '-', '0', '3', '/', 's', 'c', 'h', 'e', 'm', 'a', '#', '\0' }; - static const Ch kDraft04String[] = { 'h', 't', 't', 'p', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '-', '0', '4', '/', 's', 'c', 'h', 'e', 'm', 'a', '#', '\0' }; - static const Ch kDraft05String[] = { 'h', 't', 't', 'p', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '-', '0', '5', '/', 's', 'c', 'h', 'e', 'm', 'a', '#', '\0' }; - static const Ch kDraft06String[] = { 'h', 't', 't', 'p', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '-', '0', '6', '/', 's', 'c', 'h', 'e', 'm', 'a', '#', '\0' }; - static const Ch kDraft07String[] = { 'h', 't', 't', 'p', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '-', '0', '7', '/', 's', 'c', 'h', 'e', 'm', 'a', '#', '\0' }; - static const Ch kDraft2019_09String[] = { 'h', 't', 't', 'p', 's', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '/', '2', '0', '1', '9', '-', '0', '9', '/', 's', 'c', 'h', 'e', 'm', 'a', '\0' }; - static const Ch kDraft2020_12String[] = { 'h', 't', 't', 'p', 's', ':', '/', '/', 'j', 's', 'o', 'n', '-', 's', 'c', 'h', 'e', 'm', 'a', '.', 'o', 'r', 'g', '/', 'd', 'r', 'a', 'f', 't', '/', '2', '0', '2', '0', '-', '1', '2', '/', 's', 'c', 'h', 'e', 'm', 'a', '\0' }; - - if (!document.IsObject()) { - return kDraftNone; - } - - // Get the schema draft from the $schema keyword at the supplied location - typename ValueType::ConstMemberIterator itr = document.FindMember(SchemaType::GetSchemaString()); - if (itr != document.MemberEnd()) { - if (!itr->value.IsString()) return kDraftUnknown; - const UriType draftUri(itr->value); - // Check base uri for match - if (draftUri.Match(UriType(kDraft04String), false)) return kDraft04; - if (draftUri.Match(UriType(kDraft05String), false)) return kDraft05; - if (draftUri.Match(UriType(kDraft06String), false)) return kDraft06; - if (draftUri.Match(UriType(kDraft07String), false)) return kDraft07; - if (draftUri.Match(UriType(kDraft03String), false)) return kDraft03; - if (draftUri.Match(UriType(kDraft2019_09String), false)) return kDraft2019_09; - if (draftUri.Match(UriType(kDraft2020_12String), false)) return kDraft2020_12; - return kDraftUnknown; - } - // $schema not found - return kDraftNone; - } - - - // Get open api version of any schema document - static OpenApiVersion GetOpenApiVersion(const ValueType& document) { - static const Ch kVersion20String[] = { '2', '.', '0', '\0' }; - static const Ch kVersion30String[] = { '3', '.', '0', '.', '\0' }; // ignore patch level - static const Ch kVersion31String[] = { '3', '.', '1', '.', '\0' }; // ignore patch level - static SizeType len = internal::StrLen(kVersion30String); - - if (!document.IsObject()) { - return kVersionNone; - } - - // Get the open api version from the swagger / openapi keyword at the supplied location - typename ValueType::ConstMemberIterator itr = document.FindMember(SchemaType::GetSwaggerString()); - if (itr == document.MemberEnd()) itr = document.FindMember(SchemaType::GetOpenApiString()); - if (itr != document.MemberEnd()) { - if (!itr->value.IsString()) return kVersionUnknown; - const ValueType kVersion20Value(kVersion20String); - if (kVersion20Value == itr->value) return kVersion20; // must match 2.0 exactly - const ValueType kVersion30Value(kVersion30String); - if (itr->value.GetStringLength() > len && kVersion30Value == ValueType(itr->value.GetString(), len)) return kVersion30; // must match 3.0.x - const ValueType kVersion31Value(kVersion31String); - if (itr->value.GetStringLength() > len && kVersion31Value == ValueType(itr->value.GetString(), len)) return kVersion31; // must match 3.1.x - return kVersionUnknown; - } - // swagger or openapi not found - return kVersionNone; - } - - // Get the draft of the schema or the open api version (which implies the draft). - // Report an error if schema draft or open api version not supported or not recognized, or both in document, and carry on. - void SetSchemaSpecification(const ValueType& document) { - // Look for '$schema', 'swagger' or 'openapi' keyword at document root - SchemaDraft docDraft = GetSchemaDraft(document); - OpenApiVersion docOapi = GetOpenApiVersion(document); - // Error if both in document - if (docDraft != kDraftNone && docOapi != kVersionNone) - SchemaError(kSchemaErrorSpecIllegal, PointerType()); - // Use document draft or open api version if present or use spec from constructor - if (docDraft != kDraftNone) - spec_ = Specification(docDraft); - else if (docOapi != kVersionNone) - spec_ = Specification(docOapi); - // Error if draft or version unknown - if (spec_.draft == kDraftUnknown || spec_.oapi == kVersionUnknown) - SchemaError(kSchemaErrorSpecUnknown, PointerType()); - else if (!spec_.IsSupported()) - SchemaError(kSchemaErrorSpecUnsupported, PointerType()); - } - - // Changed by PR #1393 - void CreateSchemaRecursive(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document, const UriType& id) { - if (v.GetType() == kObjectType) { - UriType newid = UriType(CreateSchema(schema, pointer, v, document, id), allocator_); - - for (typename ValueType::ConstMemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr) - CreateSchemaRecursive(0, pointer.Append(itr->name, allocator_), itr->value, document, newid); - } - else if (v.GetType() == kArrayType) - for (SizeType i = 0; i < v.Size(); i++) - CreateSchemaRecursive(0, pointer.Append(i, allocator_), v[i], document, id); - } - - // Changed by PR #1393 - const UriType& CreateSchema(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document, const UriType& id) { - RAPIDJSON_ASSERT(pointer.IsValid()); - GenericStringBuffer sb; - pointer.StringifyUriFragment(sb); - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaDocument::CreateSchema", sb.GetString(), id.GetString()); - if (v.IsObject()) { - if (const SchemaType* sc = GetSchema(pointer)) { - if (schema) - *schema = sc; - AddSchemaRefs(const_cast(sc)); - } - else if (!HandleRefSchema(pointer, schema, v, document, id)) { - // The new schema constructor adds itself and its $ref(s) to schemaMap_ - SchemaType* s = new (allocator_->Malloc(sizeof(SchemaType))) SchemaType(this, pointer, v, document, allocator_, id); - if (schema) - *schema = s; - return s->GetId(); - } - } - else { - if (schema) - *schema = typeless_; - AddSchemaRefs(typeless_); - } - return id; - } - - // Changed by PR #1393 - // TODO should this return a UriType& ? - bool HandleRefSchema(const PointerType& source, const SchemaType** schema, const ValueType& v, const ValueType& document, const UriType& id) { - typename ValueType::ConstMemberIterator itr = v.FindMember(SchemaType::GetRefString()); - if (itr == v.MemberEnd()) - return false; - - GenericStringBuffer sb; - source.StringifyUriFragment(sb); - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaDocument::HandleRefSchema", sb.GetString(), id.GetString()); - // Resolve the source pointer to the $ref'ed schema (finally) - new (schemaRef_.template Push()) SchemaRefPtr(&source); - - if (itr->value.IsString()) { - SizeType len = itr->value.GetStringLength(); - if (len == 0) - SchemaError(kSchemaErrorRefInvalid, source); - else { - // First resolve $ref against the in-scope id - UriType scopeId = UriType(id, allocator_); - UriType ref = UriType(itr->value, allocator_).Resolve(scopeId, allocator_); - RAPIDJSON_SCHEMA_PRINT(SchemaIds, id.GetString(), itr->value.GetString(), ref.GetString()); - // See if the resolved $ref minus the fragment matches a resolved id in this document - // Search from the root. Returns the subschema in the document and its absolute JSON pointer. - PointerType basePointer = PointerType(); - const ValueType *base = FindId(document, ref, basePointer, docId_, false); - if (!base) { - // Remote reference - call the remote document provider - if (!remoteProvider_) - SchemaError(kSchemaErrorRefNoRemoteProvider, source); - else { - if (const GenericSchemaDocument* remoteDocument = remoteProvider_->GetRemoteDocument(ref, spec_)) { - const Ch* s = ref.GetFragString(); - len = ref.GetFragStringLength(); - if (len <= 1 || s[1] == '/') { - // JSON pointer fragment, absolute in the remote schema - const PointerType pointer(s, len, allocator_); - if (!pointer.IsValid()) - SchemaErrorPointer(kSchemaErrorRefPointerInvalid, source, s, len, pointer); - else { - // Get the subschema - if (const SchemaType *sc = remoteDocument->GetSchema(pointer)) { - if (schema) - *schema = sc; - AddSchemaRefs(const_cast(sc)); - return true; - } else - SchemaErrorValue(kSchemaErrorRefUnknown, source, ref.GetString(), ref.GetStringLength()); - } - } else - // Plain name fragment, not allowed in remote schema - SchemaErrorValue(kSchemaErrorRefPlainName, source, s, len); - } else - SchemaErrorValue(kSchemaErrorRefNoRemoteSchema, source, ref.GetString(), ref.GetStringLength()); - } - } - else { // Local reference - const Ch* s = ref.GetFragString(); - len = ref.GetFragStringLength(); - if (len <= 1 || s[1] == '/') { - // JSON pointer fragment, relative to the resolved URI - const PointerType relPointer(s, len, allocator_); - if (!relPointer.IsValid()) - SchemaErrorPointer(kSchemaErrorRefPointerInvalid, source, s, len, relPointer); - else { - // Get the subschema - if (const ValueType *pv = relPointer.Get(*base)) { - // Now get the absolute JSON pointer by adding relative to base - PointerType pointer(basePointer, allocator_); - for (SizeType i = 0; i < relPointer.GetTokenCount(); i++) - pointer = pointer.Append(relPointer.GetTokens()[i], allocator_); - if (IsCyclicRef(pointer)) - SchemaErrorValue(kSchemaErrorRefCyclical, source, ref.GetString(), ref.GetStringLength()); - else { - // Call CreateSchema recursively, but first compute the in-scope id for the $ref target as we have jumped there - // TODO: cache pointer <-> id mapping - size_t unresolvedTokenIndex; - scopeId = pointer.GetUri(document, docId_, &unresolvedTokenIndex, allocator_); - CreateSchema(schema, pointer, *pv, document, scopeId); - return true; - } - } else - SchemaErrorValue(kSchemaErrorRefUnknown, source, ref.GetString(), ref.GetStringLength()); - } - } else { - // Plain name fragment, relative to the resolved URI - // Not supported in open api 2.0 and 3.0 - PointerType pointer(allocator_); - if (spec_.oapi == kVersion20 || spec_.oapi == kVersion30) - SchemaErrorValue(kSchemaErrorRefPlainName, source, s, len); - // See if the fragment matches an id in this document. - // Search from the base we just established. Returns the subschema in the document and its absolute JSON pointer. - else if (const ValueType *pv = FindId(*base, ref, pointer, UriType(ref.GetBaseString(), ref.GetBaseStringLength(), allocator_), true, basePointer)) { - if (IsCyclicRef(pointer)) - SchemaErrorValue(kSchemaErrorRefCyclical, source, ref.GetString(), ref.GetStringLength()); - else { - // Call CreateSchema recursively, but first compute the in-scope id for the $ref target as we have jumped there - // TODO: cache pointer <-> id mapping - size_t unresolvedTokenIndex; - scopeId = pointer.GetUri(document, docId_, &unresolvedTokenIndex, allocator_); - CreateSchema(schema, pointer, *pv, document, scopeId); - return true; - } - } else - SchemaErrorValue(kSchemaErrorRefUnknown, source, ref.GetString(), ref.GetStringLength()); - } - } - } - } - - // Invalid/Unknown $ref - if (schema) - *schema = typeless_; - AddSchemaRefs(typeless_); - return true; - } - - //! Find the first subschema with a resolved 'id' that matches the specified URI. - // If full specified use all URI else ignore fragment. - // If found, return a pointer to the subschema and its JSON pointer. - // TODO cache pointer <-> id mapping - ValueType* FindId(const ValueType& doc, const UriType& finduri, PointerType& resptr, const UriType& baseuri, bool full, const PointerType& here = PointerType()) const { - SizeType i = 0; - ValueType* resval = 0; - UriType tempuri = UriType(finduri, allocator_); - UriType localuri = UriType(baseuri, allocator_); - if (doc.GetType() == kObjectType) { - // Establish the base URI of this object - typename ValueType::ConstMemberIterator m = doc.FindMember(SchemaType::GetIdString()); - if (m != doc.MemberEnd() && m->value.GetType() == kStringType) { - localuri = UriType(m->value, allocator_).Resolve(baseuri, allocator_); - } - // See if it matches - if (localuri.Match(finduri, full)) { - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaDocument::FindId (match)", full ? localuri.GetString() : localuri.GetBaseString()); - resval = const_cast(&doc); - resptr = here; - return resval; - } - // No match, continue looking - for (m = doc.MemberBegin(); m != doc.MemberEnd(); ++m) { - if (m->value.GetType() == kObjectType || m->value.GetType() == kArrayType) { - resval = FindId(m->value, finduri, resptr, localuri, full, here.Append(m->name.GetString(), m->name.GetStringLength(), allocator_)); - } - if (resval) break; - } - } else if (doc.GetType() == kArrayType) { - // Continue looking - for (typename ValueType::ConstValueIterator v = doc.Begin(); v != doc.End(); ++v) { - if (v->GetType() == kObjectType || v->GetType() == kArrayType) { - resval = FindId(*v, finduri, resptr, localuri, full, here.Append(i, allocator_)); - } - if (resval) break; - i++; - } - } - return resval; - } - - // Added by PR #1393 - void AddSchemaRefs(SchemaType* schema) { - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaDocument::AddSchemaRefs"); - while (!schemaRef_.Empty()) { - SchemaRefPtr *ref = schemaRef_.template Pop(1); - SchemaEntry *entry = schemaMap_.template Push(); - new (entry) SchemaEntry(**ref, schema, false, allocator_); - } - } - - // Added by PR #1393 - bool IsCyclicRef(const PointerType& pointer) const { - for (const SchemaRefPtr* ref = schemaRef_.template Bottom(); ref != schemaRef_.template End(); ++ref) - if (pointer == **ref) - return true; - return false; - } - - const SchemaType* GetSchema(const PointerType& pointer) const { - for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) - if (pointer == target->pointer) - return target->schema; - return 0; - } - - PointerType GetPointer(const SchemaType* schema) const { - for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) - if (schema == target->schema) - return target->pointer; - return PointerType(); - } - - const SchemaType* GetTypeless() const { return typeless_; } - - static const size_t kInitialSchemaMapSize = 64; - static const size_t kInitialSchemaRefSize = 64; - - IRemoteSchemaDocumentProviderType* remoteProvider_; - Allocator *allocator_; - Allocator *ownAllocator_; - const SchemaType* root_; //!< Root schema. - SchemaType* typeless_; - internal::Stack schemaMap_; // Stores created Pointer -> Schemas - internal::Stack schemaRef_; // Stores Pointer(s) from $ref(s) until resolved - GValue uri_; // Schema document URI - UriType docId_; - Specification spec_; - GValue error_; - GValue currentError_; -}; - -//! GenericSchemaDocument using Value type. -typedef GenericSchemaDocument SchemaDocument; -//! IGenericRemoteSchemaDocumentProvider using SchemaDocument. -typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; - -/////////////////////////////////////////////////////////////////////////////// -// GenericSchemaValidator - -//! JSON Schema Validator. -/*! - A SAX style JSON schema validator. - It uses a \c GenericSchemaDocument to validate SAX events. - It delegates the incoming SAX events to an output handler. - The default output handler does nothing. - It can be reused multiple times by calling \c Reset(). - - \tparam SchemaDocumentType Type of schema document. - \tparam OutputHandler Type of output handler. Default handler does nothing. - \tparam StateAllocator Allocator for storing the internal validation states. -*/ -template < - typename SchemaDocumentType, - typename OutputHandler = BaseReaderHandler, - typename StateAllocator = CrtAllocator> -class GenericSchemaValidator : - public internal::ISchemaStateFactory, - public internal::ISchemaValidator, - public internal::IValidationErrorHandler { -public: - typedef typename SchemaDocumentType::SchemaType SchemaType; - typedef typename SchemaDocumentType::PointerType PointerType; - typedef typename SchemaType::EncodingType EncodingType; - typedef typename SchemaType::SValue SValue; - typedef typename EncodingType::Ch Ch; - typedef GenericStringRef StringRefType; - typedef GenericValue ValueType; - - //! Constructor without output handler. - /*! - \param schemaDocument The schema document to conform to. - \param allocator Optional allocator for storing internal validation states. - \param schemaStackCapacity Optional initial capacity of schema path stack. - \param documentStackCapacity Optional initial capacity of document path stack. - */ - GenericSchemaValidator( - const SchemaDocumentType& schemaDocument, - StateAllocator* allocator = 0, - size_t schemaStackCapacity = kDefaultSchemaStackCapacity, - size_t documentStackCapacity = kDefaultDocumentStackCapacity) - : - schemaDocument_(&schemaDocument), - root_(schemaDocument.GetRoot()), - stateAllocator_(allocator), - ownStateAllocator_(0), - schemaStack_(allocator, schemaStackCapacity), - documentStack_(allocator, documentStackCapacity), - outputHandler_(0), - error_(kObjectType), - currentError_(), - missingDependents_(), - valid_(true), - flags_(kValidateDefaultFlags), - depth_(0) - { - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::GenericSchemaValidator"); - } - - //! Constructor with output handler. - /*! - \param schemaDocument The schema document to conform to. - \param allocator Optional allocator for storing internal validation states. - \param schemaStackCapacity Optional initial capacity of schema path stack. - \param documentStackCapacity Optional initial capacity of document path stack. - */ - GenericSchemaValidator( - const SchemaDocumentType& schemaDocument, - OutputHandler& outputHandler, - StateAllocator* allocator = 0, - size_t schemaStackCapacity = kDefaultSchemaStackCapacity, - size_t documentStackCapacity = kDefaultDocumentStackCapacity) - : - schemaDocument_(&schemaDocument), - root_(schemaDocument.GetRoot()), - stateAllocator_(allocator), - ownStateAllocator_(0), - schemaStack_(allocator, schemaStackCapacity), - documentStack_(allocator, documentStackCapacity), - outputHandler_(&outputHandler), - error_(kObjectType), - currentError_(), - missingDependents_(), - valid_(true), - flags_(kValidateDefaultFlags), - depth_(0) - { - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::GenericSchemaValidator (output handler)"); - } - - //! Destructor. - ~GenericSchemaValidator() { - Reset(); - RAPIDJSON_DELETE(ownStateAllocator_); - } - - //! Reset the internal states. - void Reset() { - while (!schemaStack_.Empty()) - PopSchema(); - documentStack_.Clear(); - ResetError(); - } - - //! Reset the error state. - void ResetError() { - error_.SetObject(); - currentError_.SetNull(); - missingDependents_.SetNull(); - valid_ = true; - } - - //! Implementation of ISchemaValidator - void SetValidateFlags(unsigned flags) { - flags_ = flags; - } - virtual unsigned GetValidateFlags() const { - return flags_; - } - - virtual bool IsValid() const { - if (!valid_) return false; - if (GetContinueOnErrors() && !error_.ObjectEmpty()) return false; - return true; - } - //! End of Implementation of ISchemaValidator - - //! Gets the error object. - ValueType& GetError() { return error_; } - const ValueType& GetError() const { return error_; } - - //! Gets the JSON pointer pointed to the invalid schema. - // If reporting all errors, the stack will be empty. - PointerType GetInvalidSchemaPointer() const { - return schemaStack_.Empty() ? PointerType() : CurrentSchema().GetPointer(); - } - - //! Gets the keyword of invalid schema. - // If reporting all errors, the stack will be empty, so return "errors". - const Ch* GetInvalidSchemaKeyword() const { - if (!schemaStack_.Empty()) return CurrentContext().invalidKeyword; - if (GetContinueOnErrors() && !error_.ObjectEmpty()) return (const Ch*)GetErrorsString(); - return 0; - } - - //! Gets the error code of invalid schema. - // If reporting all errors, the stack will be empty, so return kValidateErrors. - ValidateErrorCode GetInvalidSchemaCode() const { - if (!schemaStack_.Empty()) return CurrentContext().invalidCode; - if (GetContinueOnErrors() && !error_.ObjectEmpty()) return kValidateErrors; - return kValidateErrorNone; - } - - //! Gets the JSON pointer pointed to the invalid value. - // If reporting all errors, the stack will be empty. - PointerType GetInvalidDocumentPointer() const { - if (documentStack_.Empty()) { - return PointerType(); - } - else { - return PointerType(documentStack_.template Bottom(), documentStack_.GetSize() / sizeof(Ch)); - } - } - - void NotMultipleOf(int64_t actual, const SValue& expected) { - AddNumberError(kValidateErrorMultipleOf, ValueType(actual).Move(), expected); - } - void NotMultipleOf(uint64_t actual, const SValue& expected) { - AddNumberError(kValidateErrorMultipleOf, ValueType(actual).Move(), expected); - } - void NotMultipleOf(double actual, const SValue& expected) { - AddNumberError(kValidateErrorMultipleOf, ValueType(actual).Move(), expected); - } - void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) { - AddNumberError(exclusive ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum, ValueType(actual).Move(), expected, - exclusive ? &SchemaType::GetExclusiveMaximumString : 0); - } - void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) { - AddNumberError(exclusive ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum, ValueType(actual).Move(), expected, - exclusive ? &SchemaType::GetExclusiveMaximumString : 0); - } - void AboveMaximum(double actual, const SValue& expected, bool exclusive) { - AddNumberError(exclusive ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum, ValueType(actual).Move(), expected, - exclusive ? &SchemaType::GetExclusiveMaximumString : 0); - } - void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) { - AddNumberError(exclusive ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum, ValueType(actual).Move(), expected, - exclusive ? &SchemaType::GetExclusiveMinimumString : 0); - } - void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) { - AddNumberError(exclusive ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum, ValueType(actual).Move(), expected, - exclusive ? &SchemaType::GetExclusiveMinimumString : 0); - } - void BelowMinimum(double actual, const SValue& expected, bool exclusive) { - AddNumberError(exclusive ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum, ValueType(actual).Move(), expected, - exclusive ? &SchemaType::GetExclusiveMinimumString : 0); - } - - void TooLong(const Ch* str, SizeType length, SizeType expected) { - AddNumberError(kValidateErrorMaxLength, - ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move()); - } - void TooShort(const Ch* str, SizeType length, SizeType expected) { - AddNumberError(kValidateErrorMinLength, - ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move()); - } - void DoesNotMatch(const Ch* str, SizeType length) { - currentError_.SetObject(); - currentError_.AddMember(GetActualString(), ValueType(str, length, GetStateAllocator()).Move(), GetStateAllocator()); - AddCurrentError(kValidateErrorPattern); - } - - void DisallowedItem(SizeType index) { - currentError_.SetObject(); - currentError_.AddMember(GetDisallowedString(), ValueType(index).Move(), GetStateAllocator()); - AddCurrentError(kValidateErrorAdditionalItems, true); - } - void TooFewItems(SizeType actualCount, SizeType expectedCount) { - AddNumberError(kValidateErrorMinItems, - ValueType(actualCount).Move(), SValue(expectedCount).Move()); - } - void TooManyItems(SizeType actualCount, SizeType expectedCount) { - AddNumberError(kValidateErrorMaxItems, - ValueType(actualCount).Move(), SValue(expectedCount).Move()); - } - void DuplicateItems(SizeType index1, SizeType index2) { - ValueType duplicates(kArrayType); - duplicates.PushBack(index1, GetStateAllocator()); - duplicates.PushBack(index2, GetStateAllocator()); - currentError_.SetObject(); - currentError_.AddMember(GetDuplicatesString(), duplicates, GetStateAllocator()); - AddCurrentError(kValidateErrorUniqueItems, true); - } - - void TooManyProperties(SizeType actualCount, SizeType expectedCount) { - AddNumberError(kValidateErrorMaxProperties, - ValueType(actualCount).Move(), SValue(expectedCount).Move()); - } - void TooFewProperties(SizeType actualCount, SizeType expectedCount) { - AddNumberError(kValidateErrorMinProperties, - ValueType(actualCount).Move(), SValue(expectedCount).Move()); - } - void StartMissingProperties() { - currentError_.SetArray(); - } - void AddMissingProperty(const SValue& name) { - currentError_.PushBack(ValueType(name, GetStateAllocator()).Move(), GetStateAllocator()); - } - bool EndMissingProperties() { - if (currentError_.Empty()) - return false; - ValueType error(kObjectType); - error.AddMember(GetMissingString(), currentError_, GetStateAllocator()); - currentError_ = error; - AddCurrentError(kValidateErrorRequired); - return true; - } - void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) { - for (SizeType i = 0; i < count; ++i) - MergeError(static_cast(subvalidators[i])->GetError()); - } - void DisallowedProperty(const Ch* name, SizeType length) { - currentError_.SetObject(); - currentError_.AddMember(GetDisallowedString(), ValueType(name, length, GetStateAllocator()).Move(), GetStateAllocator()); - AddCurrentError(kValidateErrorAdditionalProperties, true); - } - - void StartDependencyErrors() { - currentError_.SetObject(); - } - void StartMissingDependentProperties() { - missingDependents_.SetArray(); - } - void AddMissingDependentProperty(const SValue& targetName) { - missingDependents_.PushBack(ValueType(targetName, GetStateAllocator()).Move(), GetStateAllocator()); - } - void EndMissingDependentProperties(const SValue& sourceName) { - if (!missingDependents_.Empty()) { - // Create equivalent 'required' error - ValueType error(kObjectType); - ValidateErrorCode code = kValidateErrorRequired; - error.AddMember(GetMissingString(), missingDependents_.Move(), GetStateAllocator()); - AddErrorCode(error, code); - AddErrorInstanceLocation(error, false); - // When appending to a pointer ensure its allocator is used - PointerType schemaRef = GetInvalidSchemaPointer().Append(SchemaType::GetValidateErrorKeyword(kValidateErrorDependencies), &GetInvalidSchemaPointer().GetAllocator()); - AddErrorSchemaLocation(error, schemaRef.Append(sourceName.GetString(), sourceName.GetStringLength(), &GetInvalidSchemaPointer().GetAllocator())); - ValueType wrapper(kObjectType); - wrapper.AddMember(ValueType(SchemaType::GetValidateErrorKeyword(code), GetStateAllocator()).Move(), error, GetStateAllocator()); - currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(), wrapper, GetStateAllocator()); - } - } - void AddDependencySchemaError(const SValue& sourceName, ISchemaValidator* subvalidator) { - currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(), - static_cast(subvalidator)->GetError(), GetStateAllocator()); - } - bool EndDependencyErrors() { - if (currentError_.ObjectEmpty()) - return false; - ValueType error(kObjectType); - error.AddMember(GetErrorsString(), currentError_, GetStateAllocator()); - currentError_ = error; - AddCurrentError(kValidateErrorDependencies); - return true; - } - - void DisallowedValue(const ValidateErrorCode code = kValidateErrorEnum) { - currentError_.SetObject(); - AddCurrentError(code); - } - void StartDisallowedType() { - currentError_.SetArray(); - } - void AddExpectedType(const typename SchemaType::ValueType& expectedType) { - currentError_.PushBack(ValueType(expectedType, GetStateAllocator()).Move(), GetStateAllocator()); - } - void EndDisallowedType(const typename SchemaType::ValueType& actualType) { - ValueType error(kObjectType); - error.AddMember(GetExpectedString(), currentError_, GetStateAllocator()); - error.AddMember(GetActualString(), ValueType(actualType, GetStateAllocator()).Move(), GetStateAllocator()); - currentError_ = error; - AddCurrentError(kValidateErrorType); - } - void NotAllOf(ISchemaValidator** subvalidators, SizeType count) { - // Treat allOf like oneOf and anyOf to match https://rapidjson.org/md_doc_schema.html#allOf-anyOf-oneOf - AddErrorArray(kValidateErrorAllOf, subvalidators, count); - //for (SizeType i = 0; i < count; ++i) { - // MergeError(static_cast(subvalidators[i])->GetError()); - //} - } - void NoneOf(ISchemaValidator** subvalidators, SizeType count) { - AddErrorArray(kValidateErrorAnyOf, subvalidators, count); - } - void NotOneOf(ISchemaValidator** subvalidators, SizeType count) { - AddErrorArray(kValidateErrorOneOf, subvalidators, count); - } - void MultipleOneOf(SizeType index1, SizeType index2) { - ValueType matches(kArrayType); - matches.PushBack(index1, GetStateAllocator()); - matches.PushBack(index2, GetStateAllocator()); - currentError_.SetObject(); - currentError_.AddMember(GetMatchesString(), matches, GetStateAllocator()); - AddCurrentError(kValidateErrorOneOfMatch); - } - void Disallowed() { - currentError_.SetObject(); - AddCurrentError(kValidateErrorNot); - } - void DisallowedWhenWriting() { - currentError_.SetObject(); - AddCurrentError(kValidateErrorReadOnly); - } - void DisallowedWhenReading() { - currentError_.SetObject(); - AddCurrentError(kValidateErrorWriteOnly); - } - -#define RAPIDJSON_STRING_(name, ...) \ - static const StringRefType& Get##name##String() {\ - static const Ch s[] = { __VA_ARGS__, '\0' };\ - static const StringRefType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1)); \ - return v;\ - } - - RAPIDJSON_STRING_(InstanceRef, 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', 'R', 'e', 'f') - RAPIDJSON_STRING_(SchemaRef, 's', 'c', 'h', 'e', 'm', 'a', 'R', 'e', 'f') - RAPIDJSON_STRING_(Expected, 'e', 'x', 'p', 'e', 'c', 't', 'e', 'd') - RAPIDJSON_STRING_(Actual, 'a', 'c', 't', 'u', 'a', 'l') - RAPIDJSON_STRING_(Disallowed, 'd', 'i', 's', 'a', 'l', 'l', 'o', 'w', 'e', 'd') - RAPIDJSON_STRING_(Missing, 'm', 'i', 's', 's', 'i', 'n', 'g') - RAPIDJSON_STRING_(Errors, 'e', 'r', 'r', 'o', 'r', 's') - RAPIDJSON_STRING_(ErrorCode, 'e', 'r', 'r', 'o', 'r', 'C', 'o', 'd', 'e') - RAPIDJSON_STRING_(ErrorMessage, 'e', 'r', 'r', 'o', 'r', 'M', 'e', 's', 's', 'a', 'g', 'e') - RAPIDJSON_STRING_(Duplicates, 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', 's') - RAPIDJSON_STRING_(Matches, 'm', 'a', 't', 'c', 'h', 'e', 's') - -#undef RAPIDJSON_STRING_ - -#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_(method, arg1)\ - if (!valid_) return false; \ - if ((!BeginValue() && !GetContinueOnErrors()) || (!CurrentSchema().method arg1 && !GetContinueOnErrors())) {\ - *documentStack_.template Push() = '\0';\ - documentStack_.template Pop(1);\ - RAPIDJSON_SCHEMA_PRINT(InvalidDocument, documentStack_.template Bottom());\ - valid_ = false;\ - return valid_;\ - } - -#define RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2)\ - for (Context* context = schemaStack_.template Bottom(); context != schemaStack_.template End(); context++) {\ - if (context->hasher)\ - static_cast(context->hasher)->method arg2;\ - if (context->validators)\ - for (SizeType i_ = 0; i_ < context->validatorCount; i_++)\ - static_cast(context->validators[i_])->method arg2;\ - if (context->patternPropertiesValidators)\ - for (SizeType i_ = 0; i_ < context->patternPropertiesValidatorCount; i_++)\ - static_cast(context->patternPropertiesValidators[i_])->method arg2;\ - } - -#define RAPIDJSON_SCHEMA_HANDLE_END_(method, arg2)\ - valid_ = (EndValue() || GetContinueOnErrors()) && (!outputHandler_ || outputHandler_->method arg2);\ - return valid_; - -#define RAPIDJSON_SCHEMA_HANDLE_VALUE_(method, arg1, arg2) \ - RAPIDJSON_SCHEMA_HANDLE_BEGIN_ (method, arg1);\ - RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2);\ - RAPIDJSON_SCHEMA_HANDLE_END_ (method, arg2) - - bool Null() { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null, (CurrentContext()), ( )); } - bool Bool(bool b) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool, (CurrentContext(), b), (b)); } - bool Int(int i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int, (CurrentContext(), i), (i)); } - bool Uint(unsigned u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint, (CurrentContext(), u), (u)); } - bool Int64(int64_t i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64, (CurrentContext(), i), (i)); } - bool Uint64(uint64_t u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); } - bool Double(double d) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); } - bool RawNumber(const Ch* str, SizeType length, bool copy) - { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } - bool String(const Ch* str, SizeType length, bool copy) - { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } - - bool StartObject() { - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::StartObject"); - RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartObject, (CurrentContext())); - RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartObject, ()); - valid_ = !outputHandler_ || outputHandler_->StartObject(); - return valid_; - } - - bool Key(const Ch* str, SizeType len, bool copy) { - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::Key", str); - if (!valid_) return false; - AppendToken(str, len); - if (!CurrentSchema().Key(CurrentContext(), str, len, copy) && !GetContinueOnErrors()) { - valid_ = false; - return valid_; - } - RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(Key, (str, len, copy)); - valid_ = !outputHandler_ || outputHandler_->Key(str, len, copy); - return valid_; - } - - bool EndObject(SizeType memberCount) { - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::EndObject"); - if (!valid_) return false; - RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndObject, (memberCount)); - if (!CurrentSchema().EndObject(CurrentContext(), memberCount) && !GetContinueOnErrors()) { - valid_ = false; - return valid_; - } - RAPIDJSON_SCHEMA_HANDLE_END_(EndObject, (memberCount)); - } - - bool StartArray() { - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::StartArray"); - RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartArray, (CurrentContext())); - RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartArray, ()); - valid_ = !outputHandler_ || outputHandler_->StartArray(); - return valid_; - } - - bool EndArray(SizeType elementCount) { - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::EndArray"); - if (!valid_) return false; - RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndArray, (elementCount)); - if (!CurrentSchema().EndArray(CurrentContext(), elementCount) && !GetContinueOnErrors()) { - valid_ = false; - return valid_; - } - RAPIDJSON_SCHEMA_HANDLE_END_(EndArray, (elementCount)); - } - -#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_ -#undef RAPIDJSON_SCHEMA_HANDLE_PARALLEL_ -#undef RAPIDJSON_SCHEMA_HANDLE_VALUE_ - - // Implementation of ISchemaStateFactory - virtual ISchemaValidator* CreateSchemaValidator(const SchemaType& root, const bool inheritContinueOnErrors) { - *documentStack_.template Push() = '\0'; - documentStack_.template Pop(1); - ISchemaValidator* sv = new (GetStateAllocator().Malloc(sizeof(GenericSchemaValidator))) GenericSchemaValidator(*schemaDocument_, root, documentStack_.template Bottom(), documentStack_.GetSize(), - depth_ + 1, - &GetStateAllocator()); - sv->SetValidateFlags(inheritContinueOnErrors ? GetValidateFlags() : GetValidateFlags() & ~(unsigned)kValidateContinueOnErrorFlag); - return sv; - } - - virtual void DestroySchemaValidator(ISchemaValidator* validator) { - GenericSchemaValidator* v = static_cast(validator); - v->~GenericSchemaValidator(); - StateAllocator::Free(v); - } - - virtual void* CreateHasher() { - return new (GetStateAllocator().Malloc(sizeof(HasherType))) HasherType(&GetStateAllocator()); - } - - virtual uint64_t GetHashCode(void* hasher) { - return static_cast(hasher)->GetHashCode(); - } - - virtual void DestroyHasher(void* hasher) { - HasherType* h = static_cast(hasher); - h->~HasherType(); - StateAllocator::Free(h); - } - - virtual void* MallocState(size_t size) { - return GetStateAllocator().Malloc(size); - } - - virtual void FreeState(void* p) { - StateAllocator::Free(p); - } - // End of implementation of ISchemaStateFactory - -private: - typedef typename SchemaType::Context Context; - typedef GenericValue, StateAllocator> HashCodeArray; - typedef internal::Hasher HasherType; - - GenericSchemaValidator( - const SchemaDocumentType& schemaDocument, - const SchemaType& root, - const char* basePath, size_t basePathSize, - unsigned depth, - StateAllocator* allocator = 0, - size_t schemaStackCapacity = kDefaultSchemaStackCapacity, - size_t documentStackCapacity = kDefaultDocumentStackCapacity) - : - schemaDocument_(&schemaDocument), - root_(root), - stateAllocator_(allocator), - ownStateAllocator_(0), - schemaStack_(allocator, schemaStackCapacity), - documentStack_(allocator, documentStackCapacity), - outputHandler_(0), - error_(kObjectType), - currentError_(), - missingDependents_(), - valid_(true), - flags_(kValidateDefaultFlags), - depth_(depth) - { - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::GenericSchemaValidator (internal)", basePath && basePathSize ? basePath : ""); - if (basePath && basePathSize) - memcpy(documentStack_.template Push(basePathSize), basePath, basePathSize); - } - - StateAllocator& GetStateAllocator() { - if (!stateAllocator_) - stateAllocator_ = ownStateAllocator_ = RAPIDJSON_NEW(StateAllocator)(); - return *stateAllocator_; - } - - bool GetContinueOnErrors() const { - return flags_ & kValidateContinueOnErrorFlag; - } - - bool BeginValue() { - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::BeginValue"); - if (schemaStack_.Empty()) - PushSchema(root_); - else { - if (CurrentContext().inArray) - internal::TokenHelper, Ch>::AppendIndexToken(documentStack_, CurrentContext().arrayElementIndex); - - if (!CurrentSchema().BeginValue(CurrentContext()) && !GetContinueOnErrors()) - return false; - - SizeType count = CurrentContext().patternPropertiesSchemaCount; - const SchemaType** sa = CurrentContext().patternPropertiesSchemas; - typename Context::PatternValidatorType patternValidatorType = CurrentContext().valuePatternValidatorType; - bool valueUniqueness = CurrentContext().valueUniqueness; - RAPIDJSON_ASSERT(CurrentContext().valueSchema); - PushSchema(*CurrentContext().valueSchema); - - if (count > 0) { - CurrentContext().objectPatternValidatorType = patternValidatorType; - ISchemaValidator**& va = CurrentContext().patternPropertiesValidators; - SizeType& validatorCount = CurrentContext().patternPropertiesValidatorCount; - va = static_cast(MallocState(sizeof(ISchemaValidator*) * count)); - std::memset(va, 0, sizeof(ISchemaValidator*) * count); - for (SizeType i = 0; i < count; i++) - va[validatorCount++] = CreateSchemaValidator(*sa[i], true); // Inherit continueOnError - } - - CurrentContext().arrayUniqueness = valueUniqueness; - } - return true; - } - - bool EndValue() { - RAPIDJSON_SCHEMA_PRINT(Method, "GenericSchemaValidator::EndValue"); - if (!CurrentSchema().EndValue(CurrentContext()) && !GetContinueOnErrors()) - return false; - - GenericStringBuffer sb; - schemaDocument_->GetPointer(&CurrentSchema()).StringifyUriFragment(sb); - *documentStack_.template Push() = '\0'; - documentStack_.template Pop(1); - RAPIDJSON_SCHEMA_PRINT(ValidatorPointers, sb.GetString(), documentStack_.template Bottom(), depth_); - void* hasher = CurrentContext().hasher; - uint64_t h = hasher && CurrentContext().arrayUniqueness ? static_cast(hasher)->GetHashCode() : 0; - - PopSchema(); - - if (!schemaStack_.Empty()) { - Context& context = CurrentContext(); - // Only check uniqueness if there is a hasher - if (hasher && context.valueUniqueness) { - HashCodeArray* a = static_cast(context.arrayElementHashCodes); - if (!a) - CurrentContext().arrayElementHashCodes = a = new (GetStateAllocator().Malloc(sizeof(HashCodeArray))) HashCodeArray(kArrayType); - for (typename HashCodeArray::ConstValueIterator itr = a->Begin(); itr != a->End(); ++itr) - if (itr->GetUint64() == h) { - DuplicateItems(static_cast(itr - a->Begin()), a->Size()); - // Cleanup before returning if continuing - if (GetContinueOnErrors()) { - a->PushBack(h, GetStateAllocator()); - while (!documentStack_.Empty() && *documentStack_.template Pop(1) != '/'); - } - RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorUniqueItems); - } - a->PushBack(h, GetStateAllocator()); - } - } - - // Remove the last token of document pointer - while (!documentStack_.Empty() && *documentStack_.template Pop(1) != '/') - ; - - return true; - } - - void AppendToken(const Ch* str, SizeType len) { - documentStack_.template Reserve(1 + len * 2); // worst case all characters are escaped as two characters - *documentStack_.template PushUnsafe() = '/'; - for (SizeType i = 0; i < len; i++) { - if (str[i] == '~') { - *documentStack_.template PushUnsafe() = '~'; - *documentStack_.template PushUnsafe() = '0'; - } - else if (str[i] == '/') { - *documentStack_.template PushUnsafe() = '~'; - *documentStack_.template PushUnsafe() = '1'; - } - else - *documentStack_.template PushUnsafe() = str[i]; - } - } - - RAPIDJSON_FORCEINLINE void PushSchema(const SchemaType& schema) { new (schemaStack_.template Push()) Context(*this, *this, &schema, flags_); } - - RAPIDJSON_FORCEINLINE void PopSchema() { - Context* c = schemaStack_.template Pop(1); - if (HashCodeArray* a = static_cast(c->arrayElementHashCodes)) { - a->~HashCodeArray(); - StateAllocator::Free(a); - } - c->~Context(); - } - - void AddErrorInstanceLocation(ValueType& result, bool parent) { - GenericStringBuffer sb; - PointerType instancePointer = GetInvalidDocumentPointer(); - ((parent && instancePointer.GetTokenCount() > 0) - ? PointerType(instancePointer.GetTokens(), instancePointer.GetTokenCount() - 1) - : instancePointer).StringifyUriFragment(sb); - ValueType instanceRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), - GetStateAllocator()); - result.AddMember(GetInstanceRefString(), instanceRef, GetStateAllocator()); - } - - void AddErrorSchemaLocation(ValueType& result, PointerType schema = PointerType()) { - GenericStringBuffer sb; - SizeType len = CurrentSchema().GetURI().GetStringLength(); - if (len) memcpy(sb.Push(len), CurrentSchema().GetURI().GetString(), len * sizeof(Ch)); - if (schema.GetTokenCount()) schema.StringifyUriFragment(sb); - else GetInvalidSchemaPointer().StringifyUriFragment(sb); - ValueType schemaRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), - GetStateAllocator()); - result.AddMember(GetSchemaRefString(), schemaRef, GetStateAllocator()); - } - - void AddErrorCode(ValueType& result, const ValidateErrorCode code) { - result.AddMember(GetErrorCodeString(), code, GetStateAllocator()); - } - - void AddError(ValueType& keyword, ValueType& error) { - typename ValueType::MemberIterator member = error_.FindMember(keyword); - if (member == error_.MemberEnd()) - error_.AddMember(keyword, error, GetStateAllocator()); - else { - if (member->value.IsObject()) { - ValueType errors(kArrayType); - errors.PushBack(member->value, GetStateAllocator()); - member->value = errors; - } - member->value.PushBack(error, GetStateAllocator()); - } - } - - void AddCurrentError(const ValidateErrorCode code, bool parent = false) { - AddErrorCode(currentError_, code); - AddErrorInstanceLocation(currentError_, parent); - AddErrorSchemaLocation(currentError_); - AddError(ValueType(SchemaType::GetValidateErrorKeyword(code), GetStateAllocator(), false).Move(), currentError_); - } - - void MergeError(ValueType& other) { - for (typename ValueType::MemberIterator it = other.MemberBegin(), end = other.MemberEnd(); it != end; ++it) { - AddError(it->name, it->value); - } - } - - void AddNumberError(const ValidateErrorCode code, ValueType& actual, const SValue& expected, - const typename SchemaType::ValueType& (*exclusive)() = 0) { - currentError_.SetObject(); - currentError_.AddMember(GetActualString(), actual, GetStateAllocator()); - currentError_.AddMember(GetExpectedString(), ValueType(expected, GetStateAllocator()).Move(), GetStateAllocator()); - if (exclusive) - currentError_.AddMember(ValueType(exclusive(), GetStateAllocator()).Move(), true, GetStateAllocator()); - AddCurrentError(code); - } - - void AddErrorArray(const ValidateErrorCode code, - ISchemaValidator** subvalidators, SizeType count) { - ValueType errors(kArrayType); - for (SizeType i = 0; i < count; ++i) - errors.PushBack(static_cast(subvalidators[i])->GetError(), GetStateAllocator()); - currentError_.SetObject(); - currentError_.AddMember(GetErrorsString(), errors, GetStateAllocator()); - AddCurrentError(code); - } - - const SchemaType& CurrentSchema() const { return *schemaStack_.template Top()->schema; } - Context& CurrentContext() { return *schemaStack_.template Top(); } - const Context& CurrentContext() const { return *schemaStack_.template Top(); } - - static const size_t kDefaultSchemaStackCapacity = 1024; - static const size_t kDefaultDocumentStackCapacity = 256; - const SchemaDocumentType* schemaDocument_; - const SchemaType& root_; - StateAllocator* stateAllocator_; - StateAllocator* ownStateAllocator_; - internal::Stack schemaStack_; //!< stack to store the current path of schema (BaseSchemaType *) - internal::Stack documentStack_; //!< stack to store the current path of validating document (Ch) - OutputHandler* outputHandler_; - ValueType error_; - ValueType currentError_; - ValueType missingDependents_; - bool valid_; - unsigned flags_; - unsigned depth_; -}; - -typedef GenericSchemaValidator SchemaValidator; - -/////////////////////////////////////////////////////////////////////////////// -// SchemaValidatingReader - -//! A helper class for parsing with validation. -/*! - This helper class is a functor, designed as a parameter of \ref GenericDocument::Populate(). - - \tparam parseFlags Combination of \ref ParseFlag. - \tparam InputStream Type of input stream, implementing Stream concept. - \tparam SourceEncoding Encoding of the input stream. - \tparam SchemaDocumentType Type of schema document. - \tparam StackAllocator Allocator type for stack. -*/ -template < - unsigned parseFlags, - typename InputStream, - typename SourceEncoding, - typename SchemaDocumentType = SchemaDocument, - typename StackAllocator = CrtAllocator> -class SchemaValidatingReader { -public: - typedef typename SchemaDocumentType::PointerType PointerType; - typedef typename InputStream::Ch Ch; - typedef GenericValue ValueType; - - //! Constructor - /*! - \param is Input stream. - \param sd Schema document. - */ - SchemaValidatingReader(InputStream& is, const SchemaDocumentType& sd) : is_(is), sd_(sd), invalidSchemaKeyword_(), invalidSchemaCode_(kValidateErrorNone), error_(kObjectType), isValid_(true) {} - - template - bool operator()(Handler& handler) { - GenericReader reader; - GenericSchemaValidator validator(sd_, handler); - parseResult_ = reader.template Parse(is_, validator); - - isValid_ = validator.IsValid(); - if (isValid_) { - invalidSchemaPointer_ = PointerType(); - invalidSchemaKeyword_ = 0; - invalidDocumentPointer_ = PointerType(); - error_.SetObject(); - } - else { - invalidSchemaPointer_ = validator.GetInvalidSchemaPointer(); - invalidSchemaKeyword_ = validator.GetInvalidSchemaKeyword(); - invalidSchemaCode_ = validator.GetInvalidSchemaCode(); - invalidDocumentPointer_ = validator.GetInvalidDocumentPointer(); - error_.CopyFrom(validator.GetError(), allocator_); - } - - return parseResult_; - } - - const ParseResult& GetParseResult() const { return parseResult_; } - bool IsValid() const { return isValid_; } - const PointerType& GetInvalidSchemaPointer() const { return invalidSchemaPointer_; } - const Ch* GetInvalidSchemaKeyword() const { return invalidSchemaKeyword_; } - const PointerType& GetInvalidDocumentPointer() const { return invalidDocumentPointer_; } - const ValueType& GetError() const { return error_; } - ValidateErrorCode GetInvalidSchemaCode() const { return invalidSchemaCode_; } - -private: - InputStream& is_; - const SchemaDocumentType& sd_; - - ParseResult parseResult_; - PointerType invalidSchemaPointer_; - const Ch* invalidSchemaKeyword_; - PointerType invalidDocumentPointer_; - ValidateErrorCode invalidSchemaCode_; - StackAllocator allocator_; - ValueType error_; - bool isValid_; -}; - -RAPIDJSON_NAMESPACE_END -RAPIDJSON_DIAG_POP - -#endif // RAPIDJSON_SCHEMA_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/stream.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/stream.h deleted file mode 100644 index 1fd7091..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/stream.h +++ /dev/null @@ -1,223 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#include "rapidjson.h" - -#ifndef RAPIDJSON_STREAM_H_ -#define RAPIDJSON_STREAM_H_ - -#include "encodings.h" - -RAPIDJSON_NAMESPACE_BEGIN - -/////////////////////////////////////////////////////////////////////////////// -// Stream - -/*! \class rapidjson::Stream - \brief Concept for reading and writing characters. - - For read-only stream, no need to implement PutBegin(), Put(), Flush() and PutEnd(). - - For write-only stream, only need to implement Put() and Flush(). - -\code -concept Stream { - typename Ch; //!< Character type of the stream. - - //! Read the current character from stream without moving the read cursor. - Ch Peek() const; - - //! Read the current character from stream and moving the read cursor to next character. - Ch Take(); - - //! Get the current read cursor. - //! \return Number of characters read from start. - size_t Tell(); - - //! Begin writing operation at the current read pointer. - //! \return The begin writer pointer. - Ch* PutBegin(); - - //! Write a character. - void Put(Ch c); - - //! Flush the buffer. - void Flush(); - - //! End the writing operation. - //! \param begin The begin write pointer returned by PutBegin(). - //! \return Number of characters written. - size_t PutEnd(Ch* begin); -} -\endcode -*/ - -//! Provides additional information for stream. -/*! - By using traits pattern, this type provides a default configuration for stream. - For custom stream, this type can be specialized for other configuration. - See TEST(Reader, CustomStringStream) in readertest.cpp for example. -*/ -template -struct StreamTraits { - //! Whether to make local copy of stream for optimization during parsing. - /*! - By default, for safety, streams do not use local copy optimization. - Stream that can be copied fast should specialize this, like StreamTraits. - */ - enum { copyOptimization = 0 }; -}; - -//! Reserve n characters for writing to a stream. -template -inline void PutReserve(Stream& stream, size_t count) { - (void)stream; - (void)count; -} - -//! Write character to a stream, presuming buffer is reserved. -template -inline void PutUnsafe(Stream& stream, typename Stream::Ch c) { - stream.Put(c); -} - -//! Put N copies of a character to a stream. -template -inline void PutN(Stream& stream, Ch c, size_t n) { - PutReserve(stream, n); - for (size_t i = 0; i < n; i++) - PutUnsafe(stream, c); -} - -/////////////////////////////////////////////////////////////////////////////// -// GenericStreamWrapper - -//! A Stream Wrapper -/*! \tThis string stream is a wrapper for any stream by just forwarding any - \treceived message to the origin stream. - \note implements Stream concept -*/ - -#if defined(_MSC_VER) && _MSC_VER <= 1800 -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(4702) // unreachable code -RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated -#endif - -template > -class GenericStreamWrapper { -public: - typedef typename Encoding::Ch Ch; - GenericStreamWrapper(InputStream& is): is_(is) {} - - Ch Peek() const { return is_.Peek(); } - Ch Take() { return is_.Take(); } - size_t Tell() { return is_.Tell(); } - Ch* PutBegin() { return is_.PutBegin(); } - void Put(Ch ch) { is_.Put(ch); } - void Flush() { is_.Flush(); } - size_t PutEnd(Ch* ch) { return is_.PutEnd(ch); } - - // wrapper for MemoryStream - const Ch* Peek4() const { return is_.Peek4(); } - - // wrapper for AutoUTFInputStream - UTFType GetType() const { return is_.GetType(); } - bool HasBOM() const { return is_.HasBOM(); } - -protected: - InputStream& is_; -}; - -#if defined(_MSC_VER) && _MSC_VER <= 1800 -RAPIDJSON_DIAG_POP -#endif - -/////////////////////////////////////////////////////////////////////////////// -// StringStream - -//! Read-only string stream. -/*! \note implements Stream concept -*/ -template -struct GenericStringStream { - typedef typename Encoding::Ch Ch; - - GenericStringStream(const Ch *src) : src_(src), head_(src) {} - - Ch Peek() const { return *src_; } - Ch Take() { return *src_++; } - size_t Tell() const { return static_cast(src_ - head_); } - - Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } - void Put(Ch) { RAPIDJSON_ASSERT(false); } - void Flush() { RAPIDJSON_ASSERT(false); } - size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } - - const Ch* src_; //!< Current read position. - const Ch* head_; //!< Original head of the string. -}; - -template -struct StreamTraits > { - enum { copyOptimization = 1 }; -}; - -//! String stream with UTF8 encoding. -typedef GenericStringStream > StringStream; - -/////////////////////////////////////////////////////////////////////////////// -// InsituStringStream - -//! A read-write string stream. -/*! This string stream is particularly designed for in-situ parsing. - \note implements Stream concept -*/ -template -struct GenericInsituStringStream { - typedef typename Encoding::Ch Ch; - - GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {} - - // Read - Ch Peek() { return *src_; } - Ch Take() { return *src_++; } - size_t Tell() { return static_cast(src_ - head_); } - - // Write - void Put(Ch c) { RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; } - - Ch* PutBegin() { return dst_ = src_; } - size_t PutEnd(Ch* begin) { return static_cast(dst_ - begin); } - void Flush() {} - - Ch* Push(size_t count) { Ch* begin = dst_; dst_ += count; return begin; } - void Pop(size_t count) { dst_ -= count; } - - Ch* src_; - Ch* dst_; - Ch* head_; -}; - -template -struct StreamTraits > { - enum { copyOptimization = 1 }; -}; - -//! Insitu string stream with UTF8 encoding. -typedef GenericInsituStringStream > InsituStringStream; - -RAPIDJSON_NAMESPACE_END - -#endif // RAPIDJSON_STREAM_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/stringbuffer.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/stringbuffer.h deleted file mode 100644 index 17bfeac..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/stringbuffer.h +++ /dev/null @@ -1,121 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_STRINGBUFFER_H_ -#define RAPIDJSON_STRINGBUFFER_H_ - -#include "stream.h" -#include "internal/stack.h" - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS -#include // std::move -#endif - -#include "internal/stack.h" - -#if defined(__clang__) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(c++98-compat) -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -//! Represents an in-memory output stream. -/*! - \tparam Encoding Encoding of the stream. - \tparam Allocator type for allocating memory buffer. - \note implements Stream concept -*/ -template -class GenericStringBuffer { -public: - typedef typename Encoding::Ch Ch; - - GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - GenericStringBuffer(GenericStringBuffer&& rhs) : stack_(std::move(rhs.stack_)) {} - GenericStringBuffer& operator=(GenericStringBuffer&& rhs) { - if (&rhs != this) - stack_ = std::move(rhs.stack_); - return *this; - } -#endif - - void Put(Ch c) { *stack_.template Push() = c; } - void PutUnsafe(Ch c) { *stack_.template PushUnsafe() = c; } - void Flush() {} - - void Clear() { stack_.Clear(); } - void ShrinkToFit() { - // Push and pop a null terminator. This is safe. - *stack_.template Push() = '\0'; - stack_.ShrinkToFit(); - stack_.template Pop(1); - } - - void Reserve(size_t count) { stack_.template Reserve(count); } - Ch* Push(size_t count) { return stack_.template Push(count); } - Ch* PushUnsafe(size_t count) { return stack_.template PushUnsafe(count); } - void Pop(size_t count) { stack_.template Pop(count); } - - const Ch* GetString() const { - // Push and pop a null terminator. This is safe. - *stack_.template Push() = '\0'; - stack_.template Pop(1); - - return stack_.template Bottom(); - } - - //! Get the size of string in bytes in the string buffer. - size_t GetSize() const { return stack_.GetSize(); } - - //! Get the length of string in Ch in the string buffer. - size_t GetLength() const { return stack_.GetSize() / sizeof(Ch); } - - static const size_t kDefaultCapacity = 256; - mutable internal::Stack stack_; - -private: - // Prohibit copy constructor & assignment operator. - GenericStringBuffer(const GenericStringBuffer&); - GenericStringBuffer& operator=(const GenericStringBuffer&); -}; - -//! String buffer with UTF8 encoding -typedef GenericStringBuffer > StringBuffer; - -template -inline void PutReserve(GenericStringBuffer& stream, size_t count) { - stream.Reserve(count); -} - -template -inline void PutUnsafe(GenericStringBuffer& stream, typename Encoding::Ch c) { - stream.PutUnsafe(c); -} - -//! Implement specialized version of PutN() with memset() for better performance. -template<> -inline void PutN(GenericStringBuffer >& stream, char c, size_t n) { - std::memset(stream.stack_.Push(n), c, n * sizeof(c)); -} - -RAPIDJSON_NAMESPACE_END - -#if defined(__clang__) -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_STRINGBUFFER_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/uri.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/uri.h deleted file mode 100644 index f93e508..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/uri.h +++ /dev/null @@ -1,481 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// (C) Copyright IBM Corporation 2021 -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_URI_H_ -#define RAPIDJSON_URI_H_ - -#include "internal/strfunc.h" - -#if defined(__clang__) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(c++98-compat) -#elif defined(_MSC_VER) -RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -/////////////////////////////////////////////////////////////////////////////// -// GenericUri - -template -class GenericUri { -public: - typedef typename ValueType::Ch Ch; -#if RAPIDJSON_HAS_STDSTRING - typedef std::basic_string String; -#endif - - //! Constructors - GenericUri(Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { - } - - GenericUri(const Ch* uri, SizeType len, Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { - Parse(uri, len); - } - - GenericUri(const Ch* uri, Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { - Parse(uri, internal::StrLen(uri)); - } - - // Use with specializations of GenericValue - template GenericUri(const T& uri, Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { - const Ch* u = uri.template Get(); // TypeHelper from document.h - Parse(u, internal::StrLen(u)); - } - -#if RAPIDJSON_HAS_STDSTRING - GenericUri(const String& uri, Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { - Parse(uri.c_str(), internal::StrLen(uri.c_str())); - } -#endif - - //! Copy constructor - GenericUri(const GenericUri& rhs) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(), ownAllocator_() { - *this = rhs; - } - - //! Copy constructor - GenericUri(const GenericUri& rhs, Allocator* allocator) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { - *this = rhs; - } - - //! Destructor. - ~GenericUri() { - Free(); - RAPIDJSON_DELETE(ownAllocator_); - } - - //! Assignment operator - GenericUri& operator=(const GenericUri& rhs) { - if (this != &rhs) { - // Do not delete ownAllocator - Free(); - Allocate(rhs.GetStringLength()); - auth_ = CopyPart(scheme_, rhs.scheme_, rhs.GetSchemeStringLength()); - path_ = CopyPart(auth_, rhs.auth_, rhs.GetAuthStringLength()); - query_ = CopyPart(path_, rhs.path_, rhs.GetPathStringLength()); - frag_ = CopyPart(query_, rhs.query_, rhs.GetQueryStringLength()); - base_ = CopyPart(frag_, rhs.frag_, rhs.GetFragStringLength()); - uri_ = CopyPart(base_, rhs.base_, rhs.GetBaseStringLength()); - CopyPart(uri_, rhs.uri_, rhs.GetStringLength()); - } - return *this; - } - - //! Getters - // Use with specializations of GenericValue - template void Get(T& uri, Allocator& allocator) { - uri.template Set(this->GetString(), allocator); // TypeHelper from document.h - } - - const Ch* GetString() const { return uri_; } - SizeType GetStringLength() const { return uri_ == 0 ? 0 : internal::StrLen(uri_); } - const Ch* GetBaseString() const { return base_; } - SizeType GetBaseStringLength() const { return base_ == 0 ? 0 : internal::StrLen(base_); } - const Ch* GetSchemeString() const { return scheme_; } - SizeType GetSchemeStringLength() const { return scheme_ == 0 ? 0 : internal::StrLen(scheme_); } - const Ch* GetAuthString() const { return auth_; } - SizeType GetAuthStringLength() const { return auth_ == 0 ? 0 : internal::StrLen(auth_); } - const Ch* GetPathString() const { return path_; } - SizeType GetPathStringLength() const { return path_ == 0 ? 0 : internal::StrLen(path_); } - const Ch* GetQueryString() const { return query_; } - SizeType GetQueryStringLength() const { return query_ == 0 ? 0 : internal::StrLen(query_); } - const Ch* GetFragString() const { return frag_; } - SizeType GetFragStringLength() const { return frag_ == 0 ? 0 : internal::StrLen(frag_); } - -#if RAPIDJSON_HAS_STDSTRING - static String Get(const GenericUri& uri) { return String(uri.GetString(), uri.GetStringLength()); } - static String GetBase(const GenericUri& uri) { return String(uri.GetBaseString(), uri.GetBaseStringLength()); } - static String GetScheme(const GenericUri& uri) { return String(uri.GetSchemeString(), uri.GetSchemeStringLength()); } - static String GetAuth(const GenericUri& uri) { return String(uri.GetAuthString(), uri.GetAuthStringLength()); } - static String GetPath(const GenericUri& uri) { return String(uri.GetPathString(), uri.GetPathStringLength()); } - static String GetQuery(const GenericUri& uri) { return String(uri.GetQueryString(), uri.GetQueryStringLength()); } - static String GetFrag(const GenericUri& uri) { return String(uri.GetFragString(), uri.GetFragStringLength()); } -#endif - - //! Equality operators - bool operator==(const GenericUri& rhs) const { - return Match(rhs, true); - } - - bool operator!=(const GenericUri& rhs) const { - return !Match(rhs, true); - } - - bool Match(const GenericUri& uri, bool full = true) const { - Ch* s1; - Ch* s2; - if (full) { - s1 = uri_; - s2 = uri.uri_; - } else { - s1 = base_; - s2 = uri.base_; - } - if (s1 == s2) return true; - if (s1 == 0 || s2 == 0) return false; - return internal::StrCmp(s1, s2) == 0; - } - - //! Resolve this URI against another (base) URI in accordance with URI resolution rules. - // See https://tools.ietf.org/html/rfc3986 - // Use for resolving an id or $ref with an in-scope id. - // Returns a new GenericUri for the resolved URI. - GenericUri Resolve(const GenericUri& baseuri, Allocator* allocator = 0) { - GenericUri resuri; - resuri.allocator_ = allocator; - // Ensure enough space for combining paths - resuri.Allocate(GetStringLength() + baseuri.GetStringLength() + 1); // + 1 for joining slash - - if (!(GetSchemeStringLength() == 0)) { - // Use all of this URI - resuri.auth_ = CopyPart(resuri.scheme_, scheme_, GetSchemeStringLength()); - resuri.path_ = CopyPart(resuri.auth_, auth_, GetAuthStringLength()); - resuri.query_ = CopyPart(resuri.path_, path_, GetPathStringLength()); - resuri.frag_ = CopyPart(resuri.query_, query_, GetQueryStringLength()); - resuri.RemoveDotSegments(); - } else { - // Use the base scheme - resuri.auth_ = CopyPart(resuri.scheme_, baseuri.scheme_, baseuri.GetSchemeStringLength()); - if (!(GetAuthStringLength() == 0)) { - // Use this auth, path, query - resuri.path_ = CopyPart(resuri.auth_, auth_, GetAuthStringLength()); - resuri.query_ = CopyPart(resuri.path_, path_, GetPathStringLength()); - resuri.frag_ = CopyPart(resuri.query_, query_, GetQueryStringLength()); - resuri.RemoveDotSegments(); - } else { - // Use the base auth - resuri.path_ = CopyPart(resuri.auth_, baseuri.auth_, baseuri.GetAuthStringLength()); - if (GetPathStringLength() == 0) { - // Use the base path - resuri.query_ = CopyPart(resuri.path_, baseuri.path_, baseuri.GetPathStringLength()); - if (GetQueryStringLength() == 0) { - // Use the base query - resuri.frag_ = CopyPart(resuri.query_, baseuri.query_, baseuri.GetQueryStringLength()); - } else { - // Use this query - resuri.frag_ = CopyPart(resuri.query_, query_, GetQueryStringLength()); - } - } else { - if (path_[0] == '/') { - // Absolute path - use all of this path - resuri.query_ = CopyPart(resuri.path_, path_, GetPathStringLength()); - resuri.RemoveDotSegments(); - } else { - // Relative path - append this path to base path after base path's last slash - size_t pos = 0; - if (!(baseuri.GetAuthStringLength() == 0) && baseuri.GetPathStringLength() == 0) { - resuri.path_[pos] = '/'; - pos++; - } - size_t lastslashpos = baseuri.GetPathStringLength(); - while (lastslashpos > 0) { - if (baseuri.path_[lastslashpos - 1] == '/') break; - lastslashpos--; - } - std::memcpy(&resuri.path_[pos], baseuri.path_, lastslashpos * sizeof(Ch)); - pos += lastslashpos; - resuri.query_ = CopyPart(&resuri.path_[pos], path_, GetPathStringLength()); - resuri.RemoveDotSegments(); - } - // Use this query - resuri.frag_ = CopyPart(resuri.query_, query_, GetQueryStringLength()); - } - } - } - // Always use this frag - resuri.base_ = CopyPart(resuri.frag_, frag_, GetFragStringLength()); - - // Re-constitute base_ and uri_ - resuri.SetBase(); - resuri.uri_ = resuri.base_ + resuri.GetBaseStringLength() + 1; - resuri.SetUri(); - return resuri; - } - - //! Get the allocator of this GenericUri. - Allocator& GetAllocator() { return *allocator_; } - -private: - // Allocate memory for a URI - // Returns total amount allocated - std::size_t Allocate(std::size_t len) { - // Create own allocator if user did not supply. - if (!allocator_) - ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); - - // Allocate one block containing each part of the URI (5) plus base plus full URI, all null terminated. - // Order: scheme, auth, path, query, frag, base, uri - // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. - size_t total = (3 * len + 7) * sizeof(Ch); - scheme_ = static_cast(allocator_->Malloc(total)); - *scheme_ = '\0'; - auth_ = scheme_; - auth_++; - *auth_ = '\0'; - path_ = auth_; - path_++; - *path_ = '\0'; - query_ = path_; - query_++; - *query_ = '\0'; - frag_ = query_; - frag_++; - *frag_ = '\0'; - base_ = frag_; - base_++; - *base_ = '\0'; - uri_ = base_; - uri_++; - *uri_ = '\0'; - return total; - } - - // Free memory for a URI - void Free() { - if (scheme_) { - Allocator::Free(scheme_); - scheme_ = 0; - } - } - - // Parse a URI into constituent scheme, authority, path, query, & fragment parts - // Supports URIs that match regex ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? as per - // https://tools.ietf.org/html/rfc3986 - void Parse(const Ch* uri, std::size_t len) { - std::size_t start = 0, pos1 = 0, pos2 = 0; - Allocate(len); - - // Look for scheme ([^:/?#]+):)? - if (start < len) { - while (pos1 < len) { - if (uri[pos1] == ':') break; - pos1++; - } - if (pos1 != len) { - while (pos2 < len) { - if (uri[pos2] == '/') break; - if (uri[pos2] == '?') break; - if (uri[pos2] == '#') break; - pos2++; - } - if (pos1 < pos2) { - pos1++; - std::memcpy(scheme_, &uri[start], pos1 * sizeof(Ch)); - scheme_[pos1] = '\0'; - start = pos1; - } - } - } - // Look for auth (//([^/?#]*))? - // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. - auth_ = scheme_ + GetSchemeStringLength(); - auth_++; - *auth_ = '\0'; - if (start < len - 1 && uri[start] == '/' && uri[start + 1] == '/') { - pos2 = start + 2; - while (pos2 < len) { - if (uri[pos2] == '/') break; - if (uri[pos2] == '?') break; - if (uri[pos2] == '#') break; - pos2++; - } - std::memcpy(auth_, &uri[start], (pos2 - start) * sizeof(Ch)); - auth_[pos2 - start] = '\0'; - start = pos2; - } - // Look for path ([^?#]*) - // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. - path_ = auth_ + GetAuthStringLength(); - path_++; - *path_ = '\0'; - if (start < len) { - pos2 = start; - while (pos2 < len) { - if (uri[pos2] == '?') break; - if (uri[pos2] == '#') break; - pos2++; - } - if (start != pos2) { - std::memcpy(path_, &uri[start], (pos2 - start) * sizeof(Ch)); - path_[pos2 - start] = '\0'; - if (path_[0] == '/') - RemoveDotSegments(); // absolute path - normalize - start = pos2; - } - } - // Look for query (\?([^#]*))? - // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. - query_ = path_ + GetPathStringLength(); - query_++; - *query_ = '\0'; - if (start < len && uri[start] == '?') { - pos2 = start + 1; - while (pos2 < len) { - if (uri[pos2] == '#') break; - pos2++; - } - if (start != pos2) { - std::memcpy(query_, &uri[start], (pos2 - start) * sizeof(Ch)); - query_[pos2 - start] = '\0'; - start = pos2; - } - } - // Look for fragment (#(.*))? - // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. - frag_ = query_ + GetQueryStringLength(); - frag_++; - *frag_ = '\0'; - if (start < len && uri[start] == '#') { - std::memcpy(frag_, &uri[start], (len - start) * sizeof(Ch)); - frag_[len - start] = '\0'; - } - - // Re-constitute base_ and uri_ - base_ = frag_ + GetFragStringLength() + 1; - SetBase(); - uri_ = base_ + GetBaseStringLength() + 1; - SetUri(); - } - - // Reconstitute base - void SetBase() { - Ch* next = base_; - std::memcpy(next, scheme_, GetSchemeStringLength() * sizeof(Ch)); - next+= GetSchemeStringLength(); - std::memcpy(next, auth_, GetAuthStringLength() * sizeof(Ch)); - next+= GetAuthStringLength(); - std::memcpy(next, path_, GetPathStringLength() * sizeof(Ch)); - next+= GetPathStringLength(); - std::memcpy(next, query_, GetQueryStringLength() * sizeof(Ch)); - next+= GetQueryStringLength(); - *next = '\0'; - } - - // Reconstitute uri - void SetUri() { - Ch* next = uri_; - std::memcpy(next, base_, GetBaseStringLength() * sizeof(Ch)); - next+= GetBaseStringLength(); - std::memcpy(next, frag_, GetFragStringLength() * sizeof(Ch)); - next+= GetFragStringLength(); - *next = '\0'; - } - - // Copy a part from one GenericUri to another - // Return the pointer to the next part to be copied to - Ch* CopyPart(Ch* to, Ch* from, std::size_t len) { - RAPIDJSON_ASSERT(to != 0); - RAPIDJSON_ASSERT(from != 0); - std::memcpy(to, from, len * sizeof(Ch)); - to[len] = '\0'; - Ch* next = to + len + 1; - return next; - } - - // Remove . and .. segments from the path_ member. - // https://tools.ietf.org/html/rfc3986 - // This is done in place as we are only removing segments. - void RemoveDotSegments() { - std::size_t pathlen = GetPathStringLength(); - std::size_t pathpos = 0; // Position in path_ - std::size_t newpos = 0; // Position in new path_ - - // Loop through each segment in original path_ - while (pathpos < pathlen) { - // Get next segment, bounded by '/' or end - size_t slashpos = 0; - while ((pathpos + slashpos) < pathlen) { - if (path_[pathpos + slashpos] == '/') break; - slashpos++; - } - // Check for .. and . segments - if (slashpos == 2 && path_[pathpos] == '.' && path_[pathpos + 1] == '.') { - // Backup a .. segment in the new path_ - // We expect to find a previously added slash at the end or nothing - RAPIDJSON_ASSERT(newpos == 0 || path_[newpos - 1] == '/'); - size_t lastslashpos = newpos; - // Make sure we don't go beyond the start segment - if (lastslashpos > 1) { - // Find the next to last slash and back up to it - lastslashpos--; - while (lastslashpos > 0) { - if (path_[lastslashpos - 1] == '/') break; - lastslashpos--; - } - // Set the new path_ position - newpos = lastslashpos; - } - } else if (slashpos == 1 && path_[pathpos] == '.') { - // Discard . segment, leaves new path_ unchanged - } else { - // Move any other kind of segment to the new path_ - RAPIDJSON_ASSERT(newpos <= pathpos); - std::memmove(&path_[newpos], &path_[pathpos], slashpos * sizeof(Ch)); - newpos += slashpos; - // Add slash if not at end - if ((pathpos + slashpos) < pathlen) { - path_[newpos] = '/'; - newpos++; - } - } - // Move to next segment - pathpos += slashpos + 1; - } - path_[newpos] = '\0'; - } - - Ch* uri_; // Everything - Ch* base_; // Everything except fragment - Ch* scheme_; // Includes the : - Ch* auth_; // Includes the // - Ch* path_; // Absolute if starts with / - Ch* query_; // Includes the ? - Ch* frag_; // Includes the # - - Allocator* allocator_; //!< The current allocator. It is either user-supplied or equal to ownAllocator_. - Allocator* ownAllocator_; //!< Allocator owned by this Uri. -}; - -//! GenericUri for Value (UTF-8, default allocator). -typedef GenericUri Uri; - -RAPIDJSON_NAMESPACE_END - -#if defined(__clang__) -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_URI_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/writer.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/writer.h deleted file mode 100644 index 81f34fc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/rapidjson/writer.h +++ /dev/null @@ -1,710 +0,0 @@ -// Tencent is pleased to support the open source community by making RapidJSON available. -// -// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -// -// Licensed under the MIT License (the "License"); you may not use this file except -// in compliance with the License. You may obtain a copy of the License at -// -// http://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software distributed -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See the License for the -// specific language governing permissions and limitations under the License. - -#ifndef RAPIDJSON_WRITER_H_ -#define RAPIDJSON_WRITER_H_ - -#include "stream.h" -#include "internal/clzll.h" -#include "internal/meta.h" -#include "internal/stack.h" -#include "internal/strfunc.h" -#include "internal/dtoa.h" -#include "internal/itoa.h" -#include "stringbuffer.h" -#include // placement new - -#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) -#include -#pragma intrinsic(_BitScanForward) -#endif -#ifdef RAPIDJSON_SSE42 -#include -#elif defined(RAPIDJSON_SSE2) -#include -#elif defined(RAPIDJSON_NEON) -#include -#endif - -#ifdef __clang__ -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(padded) -RAPIDJSON_DIAG_OFF(unreachable-code) -RAPIDJSON_DIAG_OFF(c++98-compat) -#elif defined(_MSC_VER) -RAPIDJSON_DIAG_PUSH -RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant -#endif - -RAPIDJSON_NAMESPACE_BEGIN - -/////////////////////////////////////////////////////////////////////////////// -// WriteFlag - -/*! \def RAPIDJSON_WRITE_DEFAULT_FLAGS - \ingroup RAPIDJSON_CONFIG - \brief User-defined kWriteDefaultFlags definition. - - User can define this as any \c WriteFlag combinations. -*/ -#ifndef RAPIDJSON_WRITE_DEFAULT_FLAGS -#define RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNoFlags -#endif - -//! Combination of writeFlags -enum WriteFlag { - kWriteNoFlags = 0, //!< No flags are set. - kWriteValidateEncodingFlag = 1, //!< Validate encoding of JSON strings. - kWriteNanAndInfFlag = 2, //!< Allow writing of Infinity, -Infinity and NaN. - kWriteDefaultFlags = RAPIDJSON_WRITE_DEFAULT_FLAGS //!< Default write flags. Can be customized by defining RAPIDJSON_WRITE_DEFAULT_FLAGS -}; - -//! JSON writer -/*! Writer implements the concept Handler. - It generates JSON text by events to an output os. - - User may programmatically calls the functions of a writer to generate JSON text. - - On the other side, a writer can also be passed to objects that generates events, - - for example Reader::Parse() and Document::Accept(). - - \tparam OutputStream Type of output stream. - \tparam SourceEncoding Encoding of source string. - \tparam TargetEncoding Encoding of output stream. - \tparam StackAllocator Type of allocator for allocating memory of stack. - \note implements Handler concept -*/ -template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> -class Writer { -public: - typedef typename SourceEncoding::Ch Ch; - - static const int kDefaultMaxDecimalPlaces = 324; - - //! Constructor - /*! \param os Output stream. - \param stackAllocator User supplied allocator. If it is null, it will create a private one. - \param levelDepth Initial capacity of stack. - */ - explicit - Writer(OutputStream& os, StackAllocator* stackAllocator = 0, size_t levelDepth = kDefaultLevelDepth) : - os_(&os), level_stack_(stackAllocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} - - explicit - Writer(StackAllocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) : - os_(0), level_stack_(allocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} - -#if RAPIDJSON_HAS_CXX11_RVALUE_REFS - Writer(Writer&& rhs) : - os_(rhs.os_), level_stack_(std::move(rhs.level_stack_)), maxDecimalPlaces_(rhs.maxDecimalPlaces_), hasRoot_(rhs.hasRoot_) { - rhs.os_ = 0; - } -#endif - - //! Reset the writer with a new stream. - /*! - This function reset the writer with a new stream and default settings, - in order to make a Writer object reusable for output multiple JSONs. - - \param os New output stream. - \code - Writer writer(os1); - writer.StartObject(); - // ... - writer.EndObject(); - - writer.Reset(os2); - writer.StartObject(); - // ... - writer.EndObject(); - \endcode - */ - void Reset(OutputStream& os) { - os_ = &os; - hasRoot_ = false; - level_stack_.Clear(); - } - - //! Checks whether the output is a complete JSON. - /*! - A complete JSON has a complete root object or array. - */ - bool IsComplete() const { - return hasRoot_ && level_stack_.Empty(); - } - - int GetMaxDecimalPlaces() const { - return maxDecimalPlaces_; - } - - //! Sets the maximum number of decimal places for double output. - /*! - This setting truncates the output with specified number of decimal places. - - For example, - - \code - writer.SetMaxDecimalPlaces(3); - writer.StartArray(); - writer.Double(0.12345); // "0.123" - writer.Double(0.0001); // "0.0" - writer.Double(1.234567890123456e30); // "1.234567890123456e30" (do not truncate significand for positive exponent) - writer.Double(1.23e-4); // "0.0" (do truncate significand for negative exponent) - writer.EndArray(); - \endcode - - The default setting does not truncate any decimal places. You can restore to this setting by calling - \code - writer.SetMaxDecimalPlaces(Writer::kDefaultMaxDecimalPlaces); - \endcode - */ - void SetMaxDecimalPlaces(int maxDecimalPlaces) { - maxDecimalPlaces_ = maxDecimalPlaces; - } - - /*!@name Implementation of Handler - \see Handler - */ - //@{ - - bool Null() { Prefix(kNullType); return EndValue(WriteNull()); } - bool Bool(bool b) { Prefix(b ? kTrueType : kFalseType); return EndValue(WriteBool(b)); } - bool Int(int i) { Prefix(kNumberType); return EndValue(WriteInt(i)); } - bool Uint(unsigned u) { Prefix(kNumberType); return EndValue(WriteUint(u)); } - bool Int64(int64_t i64) { Prefix(kNumberType); return EndValue(WriteInt64(i64)); } - bool Uint64(uint64_t u64) { Prefix(kNumberType); return EndValue(WriteUint64(u64)); } - - //! Writes the given \c double value to the stream - /*! - \param d The value to be written. - \return Whether it is succeed. - */ - bool Double(double d) { Prefix(kNumberType); return EndValue(WriteDouble(d)); } - - bool RawNumber(const Ch* str, SizeType length, bool copy = false) { - RAPIDJSON_ASSERT(str != 0); - (void)copy; - Prefix(kNumberType); - return EndValue(WriteString(str, length)); - } - - bool String(const Ch* str, SizeType length, bool copy = false) { - RAPIDJSON_ASSERT(str != 0); - (void)copy; - Prefix(kStringType); - return EndValue(WriteString(str, length)); - } - -#if RAPIDJSON_HAS_STDSTRING - bool String(const std::basic_string& str) { - return String(str.data(), SizeType(str.size())); - } -#endif - - bool StartObject() { - Prefix(kObjectType); - new (level_stack_.template Push()) Level(false); - return WriteStartObject(); - } - - bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } - -#if RAPIDJSON_HAS_STDSTRING - bool Key(const std::basic_string& str) - { - return Key(str.data(), SizeType(str.size())); - } -#endif - - bool EndObject(SizeType memberCount = 0) { - (void)memberCount; - RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); // not inside an Object - RAPIDJSON_ASSERT(!level_stack_.template Top()->inArray); // currently inside an Array, not Object - RAPIDJSON_ASSERT(0 == level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value - level_stack_.template Pop(1); - return EndValue(WriteEndObject()); - } - - bool StartArray() { - Prefix(kArrayType); - new (level_stack_.template Push()) Level(true); - return WriteStartArray(); - } - - bool EndArray(SizeType elementCount = 0) { - (void)elementCount; - RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); - RAPIDJSON_ASSERT(level_stack_.template Top()->inArray); - level_stack_.template Pop(1); - return EndValue(WriteEndArray()); - } - //@} - - /*! @name Convenience extensions */ - //@{ - - //! Simpler but slower overload. - bool String(const Ch* const& str) { return String(str, internal::StrLen(str)); } - bool Key(const Ch* const& str) { return Key(str, internal::StrLen(str)); } - - //@} - - //! Write a raw JSON value. - /*! - For user to write a stringified JSON as a value. - - \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. - \param length Length of the json. - \param type Type of the root of json. - */ - bool RawValue(const Ch* json, size_t length, Type type) { - RAPIDJSON_ASSERT(json != 0); - Prefix(type); - return EndValue(WriteRawValue(json, length)); - } - - //! Flush the output stream. - /*! - Allows the user to flush the output stream immediately. - */ - void Flush() { - os_->Flush(); - } - - static const size_t kDefaultLevelDepth = 32; - -protected: - //! Information for each nested level - struct Level { - Level(bool inArray_) : valueCount(0), inArray(inArray_) {} - size_t valueCount; //!< number of values in this level - bool inArray; //!< true if in array, otherwise in object - }; - - bool WriteNull() { - PutReserve(*os_, 4); - PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 'l'); return true; - } - - bool WriteBool(bool b) { - if (b) { - PutReserve(*os_, 4); - PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'r'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'e'); - } - else { - PutReserve(*os_, 5); - PutUnsafe(*os_, 'f'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 's'); PutUnsafe(*os_, 'e'); - } - return true; - } - - bool WriteInt(int i) { - char buffer[11]; - const char* end = internal::i32toa(i, buffer); - PutReserve(*os_, static_cast(end - buffer)); - for (const char* p = buffer; p != end; ++p) - PutUnsafe(*os_, static_cast(*p)); - return true; - } - - bool WriteUint(unsigned u) { - char buffer[10]; - const char* end = internal::u32toa(u, buffer); - PutReserve(*os_, static_cast(end - buffer)); - for (const char* p = buffer; p != end; ++p) - PutUnsafe(*os_, static_cast(*p)); - return true; - } - - bool WriteInt64(int64_t i64) { - char buffer[21]; - const char* end = internal::i64toa(i64, buffer); - PutReserve(*os_, static_cast(end - buffer)); - for (const char* p = buffer; p != end; ++p) - PutUnsafe(*os_, static_cast(*p)); - return true; - } - - bool WriteUint64(uint64_t u64) { - char buffer[20]; - char* end = internal::u64toa(u64, buffer); - PutReserve(*os_, static_cast(end - buffer)); - for (char* p = buffer; p != end; ++p) - PutUnsafe(*os_, static_cast(*p)); - return true; - } - - bool WriteDouble(double d) { - if (internal::Double(d).IsNanOrInf()) { - if (!(writeFlags & kWriteNanAndInfFlag)) - return false; - if (internal::Double(d).IsNan()) { - PutReserve(*os_, 3); - PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); - return true; - } - if (internal::Double(d).Sign()) { - PutReserve(*os_, 9); - PutUnsafe(*os_, '-'); - } - else - PutReserve(*os_, 8); - PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); - PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); - return true; - } - - char buffer[25]; - char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); - PutReserve(*os_, static_cast(end - buffer)); - for (char* p = buffer; p != end; ++p) - PutUnsafe(*os_, static_cast(*p)); - return true; - } - - bool WriteString(const Ch* str, SizeType length) { - static const typename OutputStream::Ch hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - static const char escape[256] = { -#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - //0 1 2 3 4 5 6 7 8 9 A B C D E F - 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00 - 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10 - 0, 0, '"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 - Z16, Z16, // 30~4F - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, // 50 - Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 // 60~FF -#undef Z16 - }; - - if (TargetEncoding::supportUnicode) - PutReserve(*os_, 2 + length * 6); // "\uxxxx..." - else - PutReserve(*os_, 2 + length * 12); // "\uxxxx\uyyyy..." - - PutUnsafe(*os_, '\"'); - GenericStringStream is(str); - while (ScanWriteUnescapedString(is, length)) { - const Ch c = is.Peek(); - if (!TargetEncoding::supportUnicode && static_cast(c) >= 0x80) { - // Unicode escaping - unsigned codepoint; - if (RAPIDJSON_UNLIKELY(!SourceEncoding::Decode(is, &codepoint))) - return false; - PutUnsafe(*os_, '\\'); - PutUnsafe(*os_, 'u'); - if (codepoint <= 0xD7FF || (codepoint >= 0xE000 && codepoint <= 0xFFFF)) { - PutUnsafe(*os_, hexDigits[(codepoint >> 12) & 15]); - PutUnsafe(*os_, hexDigits[(codepoint >> 8) & 15]); - PutUnsafe(*os_, hexDigits[(codepoint >> 4) & 15]); - PutUnsafe(*os_, hexDigits[(codepoint ) & 15]); - } - else { - RAPIDJSON_ASSERT(codepoint >= 0x010000 && codepoint <= 0x10FFFF); - // Surrogate pair - unsigned s = codepoint - 0x010000; - unsigned lead = (s >> 10) + 0xD800; - unsigned trail = (s & 0x3FF) + 0xDC00; - PutUnsafe(*os_, hexDigits[(lead >> 12) & 15]); - PutUnsafe(*os_, hexDigits[(lead >> 8) & 15]); - PutUnsafe(*os_, hexDigits[(lead >> 4) & 15]); - PutUnsafe(*os_, hexDigits[(lead ) & 15]); - PutUnsafe(*os_, '\\'); - PutUnsafe(*os_, 'u'); - PutUnsafe(*os_, hexDigits[(trail >> 12) & 15]); - PutUnsafe(*os_, hexDigits[(trail >> 8) & 15]); - PutUnsafe(*os_, hexDigits[(trail >> 4) & 15]); - PutUnsafe(*os_, hexDigits[(trail ) & 15]); - } - } - else if ((sizeof(Ch) == 1 || static_cast(c) < 256) && RAPIDJSON_UNLIKELY(escape[static_cast(c)])) { - is.Take(); - PutUnsafe(*os_, '\\'); - PutUnsafe(*os_, static_cast(escape[static_cast(c)])); - if (escape[static_cast(c)] == 'u') { - PutUnsafe(*os_, '0'); - PutUnsafe(*os_, '0'); - PutUnsafe(*os_, hexDigits[static_cast(c) >> 4]); - PutUnsafe(*os_, hexDigits[static_cast(c) & 0xF]); - } - } - else if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? - Transcoder::Validate(is, *os_) : - Transcoder::TranscodeUnsafe(is, *os_)))) - return false; - } - PutUnsafe(*os_, '\"'); - return true; - } - - bool ScanWriteUnescapedString(GenericStringStream& is, size_t length) { - return RAPIDJSON_LIKELY(is.Tell() < length); - } - - bool WriteStartObject() { os_->Put('{'); return true; } - bool WriteEndObject() { os_->Put('}'); return true; } - bool WriteStartArray() { os_->Put('['); return true; } - bool WriteEndArray() { os_->Put(']'); return true; } - - bool WriteRawValue(const Ch* json, size_t length) { - PutReserve(*os_, length); - GenericStringStream is(json); - while (RAPIDJSON_LIKELY(is.Tell() < length)) { - RAPIDJSON_ASSERT(is.Peek() != '\0'); - if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? - Transcoder::Validate(is, *os_) : - Transcoder::TranscodeUnsafe(is, *os_)))) - return false; - } - return true; - } - - void Prefix(Type type) { - (void)type; - if (RAPIDJSON_LIKELY(level_stack_.GetSize() != 0)) { // this value is not at root - Level* level = level_stack_.template Top(); - if (level->valueCount > 0) { - if (level->inArray) - os_->Put(','); // add comma if it is not the first element in array - else // in object - os_->Put((level->valueCount % 2 == 0) ? ',' : ':'); - } - if (!level->inArray && level->valueCount % 2 == 0) - RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name - level->valueCount++; - } - else { - RAPIDJSON_ASSERT(!hasRoot_); // Should only has one and only one root. - hasRoot_ = true; - } - } - - // Flush the value if it is the top level one. - bool EndValue(bool ret) { - if (RAPIDJSON_UNLIKELY(level_stack_.Empty())) // end of json text - Flush(); - return ret; - } - - OutputStream* os_; - internal::Stack level_stack_; - int maxDecimalPlaces_; - bool hasRoot_; - -private: - // Prohibit copy constructor & assignment operator. - Writer(const Writer&); - Writer& operator=(const Writer&); -}; - -// Full specialization for StringStream to prevent memory copying - -template<> -inline bool Writer::WriteInt(int i) { - char *buffer = os_->Push(11); - const char* end = internal::i32toa(i, buffer); - os_->Pop(static_cast(11 - (end - buffer))); - return true; -} - -template<> -inline bool Writer::WriteUint(unsigned u) { - char *buffer = os_->Push(10); - const char* end = internal::u32toa(u, buffer); - os_->Pop(static_cast(10 - (end - buffer))); - return true; -} - -template<> -inline bool Writer::WriteInt64(int64_t i64) { - char *buffer = os_->Push(21); - const char* end = internal::i64toa(i64, buffer); - os_->Pop(static_cast(21 - (end - buffer))); - return true; -} - -template<> -inline bool Writer::WriteUint64(uint64_t u) { - char *buffer = os_->Push(20); - const char* end = internal::u64toa(u, buffer); - os_->Pop(static_cast(20 - (end - buffer))); - return true; -} - -template<> -inline bool Writer::WriteDouble(double d) { - if (internal::Double(d).IsNanOrInf()) { - // Note: This code path can only be reached if (RAPIDJSON_WRITE_DEFAULT_FLAGS & kWriteNanAndInfFlag). - if (!(kWriteDefaultFlags & kWriteNanAndInfFlag)) - return false; - if (internal::Double(d).IsNan()) { - PutReserve(*os_, 3); - PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); - return true; - } - if (internal::Double(d).Sign()) { - PutReserve(*os_, 9); - PutUnsafe(*os_, '-'); - } - else - PutReserve(*os_, 8); - PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); - PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); - return true; - } - - char *buffer = os_->Push(25); - char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); - os_->Pop(static_cast(25 - (end - buffer))); - return true; -} - -#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) -template<> -inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { - if (length < 16) - return RAPIDJSON_LIKELY(is.Tell() < length); - - if (!RAPIDJSON_LIKELY(is.Tell() < length)) - return false; - - const char* p = is.src_; - const char* end = is.head_ + length; - const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); - const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); - if (nextAligned > end) - return true; - - while (p != nextAligned) - if (*p < 0x20 || *p == '\"' || *p == '\\') { - is.src_ = p; - return RAPIDJSON_LIKELY(is.Tell() < length); - } - else - os_->PutUnsafe(*p++); - - // The rest of string using SIMD - static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; - static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; - static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; - const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); - const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); - const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); - - for (; p != endAligned; p += 16) { - const __m128i s = _mm_load_si128(reinterpret_cast(p)); - const __m128i t1 = _mm_cmpeq_epi8(s, dq); - const __m128i t2 = _mm_cmpeq_epi8(s, bs); - const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F - const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); - unsigned short r = static_cast(_mm_movemask_epi8(x)); - if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped - SizeType len; -#ifdef _MSC_VER // Find the index of first escaped - unsigned long offset; - _BitScanForward(&offset, r); - len = offset; -#else - len = static_cast(__builtin_ffs(r) - 1); -#endif - char* q = reinterpret_cast(os_->PushUnsafe(len)); - for (size_t i = 0; i < len; i++) - q[i] = p[i]; - - p += len; - break; - } - _mm_storeu_si128(reinterpret_cast<__m128i *>(os_->PushUnsafe(16)), s); - } - - is.src_ = p; - return RAPIDJSON_LIKELY(is.Tell() < length); -} -#elif defined(RAPIDJSON_NEON) -template<> -inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { - if (length < 16) - return RAPIDJSON_LIKELY(is.Tell() < length); - - if (!RAPIDJSON_LIKELY(is.Tell() < length)) - return false; - - const char* p = is.src_; - const char* end = is.head_ + length; - const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); - const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); - if (nextAligned > end) - return true; - - while (p != nextAligned) - if (*p < 0x20 || *p == '\"' || *p == '\\') { - is.src_ = p; - return RAPIDJSON_LIKELY(is.Tell() < length); - } - else - os_->PutUnsafe(*p++); - - // The rest of string using SIMD - const uint8x16_t s0 = vmovq_n_u8('"'); - const uint8x16_t s1 = vmovq_n_u8('\\'); - const uint8x16_t s2 = vmovq_n_u8('\b'); - const uint8x16_t s3 = vmovq_n_u8(32); - - for (; p != endAligned; p += 16) { - const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); - uint8x16_t x = vceqq_u8(s, s0); - x = vorrq_u8(x, vceqq_u8(s, s1)); - x = vorrq_u8(x, vceqq_u8(s, s2)); - x = vorrq_u8(x, vcltq_u8(s, s3)); - - x = vrev64q_u8(x); // Rev in 64 - uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract - uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract - - SizeType len = 0; - bool escaped = false; - if (low == 0) { - if (high != 0) { - uint32_t lz = internal::clzll(high); - len = 8 + (lz >> 3); - escaped = true; - } - } else { - uint32_t lz = internal::clzll(low); - len = lz >> 3; - escaped = true; - } - if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped - char* q = reinterpret_cast(os_->PushUnsafe(len)); - for (size_t i = 0; i < len; i++) - q[i] = p[i]; - - p += len; - break; - } - vst1q_u8(reinterpret_cast(os_->PushUnsafe(16)), s); - } - - is.src_ = p; - return RAPIDJSON_LIKELY(is.Tell() < length); -} -#endif // RAPIDJSON_NEON - -RAPIDJSON_NAMESPACE_END - -#if defined(_MSC_VER) || defined(__clang__) -RAPIDJSON_DIAG_POP -#endif - -#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/thorvg.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/thorvg.h deleted file mode 100644 index da3944c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/thorvg.h +++ /dev/null @@ -1,2182 +0,0 @@ -#ifndef _THORVG_H_ -#define _THORVG_H_ - -#include "../../lv_conf_internal.h" - -/*Testing of dependencies*/ -#if LV_USE_THORVG && LV_USE_VECTOR_GRAPHIC == 0 -#error "ThorVG: LV_USE_VECTOR_GRAPHIC is required. Enable it in lv_conf.h" -#endif - -#if LV_USE_THORVG_INTERNAL -#define TVG_BUILD 1 - - -#include -#include -#include -#include - -#ifdef TVG_API - #undef TVG_API -#endif - -#ifndef TVG_STATIC - #ifdef _WIN32 - #if TVG_BUILD - #define TVG_API __declspec(dllexport) - #else - #define TVG_API __declspec(dllimport) - #endif - #elif (defined(__SUNPRO_C) || defined(__SUNPRO_CC)) - #define TVG_API __global - #else - #if (defined(__GNUC__) && __GNUC__ >= 4) || defined(__INTEL_COMPILER) - #define TVG_API __attribute__ ((visibility("default"))) - #else - #define TVG_API - #endif - #endif -#else - #define TVG_API -#endif - -#ifdef TVG_DEPRECATED - #undef TVG_DEPRECATED -#endif - -#ifdef _WIN32 - #define TVG_DEPRECATED __declspec(deprecated) -#elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) - #define TVG_DEPRECATED __attribute__ ((__deprecated__)) -#else - #define TVG_DEPRECATED -#endif - -#define _TVG_DECLARE_PRIVATE(A) \ - struct Impl; \ - Impl* pImpl; \ -protected: \ - A(const A&) = delete; \ - const A& operator=(const A&) = delete; \ - A() - -#define _TVG_DISABLE_CTOR(A) \ - A() = delete; \ - ~A() = delete - -#define _TVG_DECLARE_ACCESSOR(A) \ - friend A - -namespace tvg -{ - -class RenderMethod; -class Animation; - -/** - * @defgroup ThorVG ThorVG - * @brief ThorVG classes and enumerations providing C++ APIs. - */ - -/**@{*/ - -/** - * @brief Enumeration specifying the result from the APIs. - */ -enum class Result -{ - Success = 0, ///< The value returned in case of a correct request execution. - InvalidArguments, ///< The value returned in the event of a problem with the arguments given to the API - e.g. empty paths or null pointers. - InsufficientCondition, ///< The value returned in case the request cannot be processed - e.g. asking for properties of an object, which does not exist. - FailedAllocation, ///< The value returned in case of unsuccessful memory allocation. - MemoryCorruption, ///< The value returned in the event of bad memory handling - e.g. failing in pointer releasing or casting - NonSupport, ///< The value returned in case of choosing unsupported options. - Unknown ///< The value returned in all other cases. -}; - - -/** - * @brief Enumeration specifying the values of the path commands accepted by TVG. - * - * Not to be confused with the path commands from the svg path element (like M, L, Q, H and many others). - * TVG interprets all of them and translates to the ones from the PathCommand values. - */ -enum class PathCommand -{ - Close = 0, ///< Ends the current sub-path and connects it with its initial point. This command doesn't expect any points. - MoveTo, ///< Sets a new initial point of the sub-path and a new current point. This command expects 1 point: the starting position. - LineTo, ///< Draws a line from the current point to the given point and sets a new value of the current point. This command expects 1 point: the end-position of the line. - CubicTo ///< Draws a cubic Bezier curve from the current point to the given point using two given control points and sets a new value of the current point. This command expects 3 points: the 1st control-point, the 2nd control-point, the end-point of the curve. -}; - - -/** - * @brief Enumeration determining the ending type of a stroke in the open sub-paths. - */ -enum class StrokeCap -{ - Square = 0, ///< The stroke is extended in both end-points of a sub-path by a rectangle, with the width equal to the stroke width and the length equal to the half of the stroke width. For zero length sub-paths the square is rendered with the size of the stroke width. - Round, ///< The stroke is extended in both end-points of a sub-path by a half circle, with a radius equal to the half of a stroke width. For zero length sub-paths a full circle is rendered. - Butt ///< The stroke ends exactly at each of the two end-points of a sub-path. For zero length sub-paths no stroke is rendered. -}; - - -/** - * @brief Enumeration determining the style used at the corners of joined stroked path segments. - */ -enum class StrokeJoin -{ - Bevel = 0, ///< The outer corner of the joined path segments is bevelled at the join point. The triangular region of the corner is enclosed by a straight line between the outer corners of each stroke. - Round, ///< The outer corner of the joined path segments is rounded. The circular region is centered at the join point. - Miter ///< The outer corner of the joined path segments is spiked. The spike is created by extension beyond the join point of the outer edges of the stroke until they intersect. In case the extension goes beyond the limit, the join style is converted to the Bevel style. -}; - - -/** - * @brief Enumeration specifying how to fill the area outside the gradient bounds. - */ -enum class FillSpread -{ - Pad = 0, ///< The remaining area is filled with the closest stop color. - Reflect, ///< The gradient pattern is reflected outside the gradient area until the expected region is filled. - Repeat ///< The gradient pattern is repeated continuously beyond the gradient area until the expected region is filled. -}; - - -/** - * @brief Enumeration specifying the algorithm used to establish which parts of the shape are treated as the inside of the shape. - */ -enum class FillRule -{ - Winding = 0, ///< A line from the point to a location outside the shape is drawn. The intersections of the line with the path segment of the shape are counted. Starting from zero, if the path segment of the shape crosses the line clockwise, one is added, otherwise one is subtracted. If the resulting sum is non zero, the point is inside the shape. - EvenOdd ///< A line from the point to a location outside the shape is drawn and its intersections with the path segments of the shape are counted. If the number of intersections is an odd number, the point is inside the shape. -}; - - -/** - * @brief Enumeration indicating the method used in the composition of two objects - the target and the source. - * - * Notation: S(Source), T(Target), SA(Source Alpha), TA(Target Alpha) - * - * @see Paint::composite() - */ -enum class CompositeMethod -{ - None = 0, ///< No composition is applied. - ClipPath, ///< The intersection of the source and the target is determined and only the resulting pixels from the source are rendered. - AlphaMask, ///< Alpha Masking using the compositing target's pixels as an alpha value. - InvAlphaMask, ///< Alpha Masking using the complement to the compositing target's pixels as an alpha value. - LumaMask, ///< Alpha Masking using the grayscale (0.2125R + 0.7154G + 0.0721*B) of the compositing target's pixels. @since 0.9 - InvLumaMask, ///< Alpha Masking using the grayscale (0.2125R + 0.7154G + 0.0721*B) of the complement to the compositing target's pixels. - AddMask, ///< Combines the target and source objects pixels using target alpha. (T * TA) + (S * (255 - TA)) (Experimental API) - SubtractMask, ///< Subtracts the source color from the target color while considering their respective target alpha. (T * TA) - (S * (255 - TA)) (Experimental API) - IntersectMask, ///< Computes the result by taking the minimum value between the target alpha and the source alpha and multiplies it with the target color. (T * min(TA, SA)) (Experimental API) - DifferenceMask ///< Calculates the absolute difference between the target color and the source color multiplied by the complement of the target alpha. abs(T - S * (255 - TA)) (Experimental API) -}; - - -/** - * @brief Enumeration indicates the method used for blending paint. Please refer to the respective formulas for each method. - * - * Notation: S(source paint as the top layer), D(destination as the bottom layer), Sa(source paint alpha), Da(destination alpha) - * - * @see Paint::blend() - * - * @note Experimental API - */ -enum class BlendMethod : uint8_t -{ - Normal = 0, ///< Perform the alpha blending(default). S if (Sa == 255), otherwise (Sa * S) + (255 - Sa) * D - Add, ///< Simply adds pixel values of one layer with the other. (S + D) - Screen, ///< The values of the pixels in the two layers are inverted, multiplied, and then inverted again. (S + D) - (S * D) - Multiply, ///< Takes the RGB channel values from 0 to 255 of each pixel in the top layer and multiples them with the values for the corresponding pixel from the bottom layer. (S * D) - Overlay, ///< Combines Multiply and Screen blend modes. (2 * S * D) if (2 * D < Da), otherwise (Sa * Da) - 2 * (Da - S) * (Sa - D) - Difference, ///< Subtracts the bottom layer from the top layer or the other way around, to always get a non-negative value. (S - D) if (S > D), otherwise (D - S) - Exclusion, ///< The result is twice the product of the top and bottom layers, subtracted from their sum. s + d - (2 * s * d) - SrcOver, ///< Replace the bottom layer with the top layer. - Darken, ///< Creates a pixel that retains the smallest components of the top and bottom layer pixels. min(S, D) - Lighten, ///< Only has the opposite action of Darken Only. max(S, D) - ColorDodge, ///< Divides the bottom layer by the inverted top layer. D / (255 - S) - ColorBurn, ///< Divides the inverted bottom layer by the top layer, and then inverts the result. 255 - (255 - D) / S - HardLight, ///< The same as Overlay but with the color roles reversed. (2 * S * D) if (S < Sa), otherwise (Sa * Da) - 2 * (Da - S) * (Sa - D) - SoftLight ///< The same as Overlay but with applying pure black or white does not result in pure black or white. (1 - 2 * S) * (D ^ 2) + (2 * S * D) -}; - - -/** - * @brief Enumeration specifying the engine type used for the graphics backend. For multiple backends bitwise operation is allowed. - */ -enum class CanvasEngine -{ - Sw = (1 << 1), ///< CPU rasterizer. - Gl = (1 << 2), ///< OpenGL rasterizer. - Wg = (1 << 3), ///< WebGPU rasterizer. (Experimental API) -}; - - -/** - * @brief A data structure representing a point in two-dimensional space. - */ -struct Point -{ - float x, y; -}; - - -/** - * @brief A data structure representing a three-dimensional matrix. - * - * The elements e11, e12, e21 and e22 represent the rotation matrix, including the scaling factor. - * The elements e13 and e23 determine the translation of the object along the x and y-axis, respectively. - * The elements e31 and e32 are set to 0, e33 is set to 1. - */ -struct Matrix -{ - float e11, e12, e13; - float e21, e22, e23; - float e31, e32, e33; -}; - - -/** - * @brief A data structure representing a texture mesh vertex - * - * @param pt The vertex coordinate - * @param uv The normalized texture coordinate in the range (0.0..1.0, 0.0..1.0) - * - * @note Experimental API - */ -struct Vertex -{ - Point pt; - Point uv; -}; - - -/** - * @brief A data structure representing a triangle in a texture mesh - * - * @param vertex The three vertices that make up the polygon - * - * @note Experimental API - */ -struct Polygon -{ - Vertex vertex[3]; -}; - - -/** - * @class Paint - * - * @brief An abstract class for managing graphical elements. - * - * A graphical element in TVG is any object composed into a Canvas. - * Paint represents such a graphical object and its behaviors such as duplication, transformation and composition. - * TVG recommends the user to regard a paint as a set of volatile commands. They can prepare a Paint and then request a Canvas to run them. - */ -class TVG_API Paint -{ -public: - virtual ~Paint(); - - /** - * @brief Sets the angle by which the object is rotated. - * - * The angle in measured clockwise from the horizontal axis. - * The rotational axis passes through the point on the object with zero coordinates. - * - * @param[in] degree The value of the angle in degrees. - * - * @retval Result::Success when succeed, Result::FailedAllocation otherwise. - */ - Result rotate(float degree) noexcept; - - /** - * @brief Sets the scale value of the object. - * - * @param[in] factor The value of the scaling factor. The default value is 1. - * - * @retval Result::Success when succeed, Result::FailedAllocation otherwise. - */ - Result scale(float factor) noexcept; - - /** - * @brief Sets the values by which the object is moved in a two-dimensional space. - * - * The origin of the coordinate system is in the upper left corner of the canvas. - * The horizontal and vertical axes point to the right and down, respectively. - * - * @param[in] x The value of the horizontal shift. - * @param[in] y The value of the vertical shift. - * - * @retval Result::Success when succeed, Result::FailedAllocation otherwise. - */ - Result translate(float x, float y) noexcept; - - /** - * @brief Sets the matrix of the affine transformation for the object. - * - * The augmented matrix of the transformation is expected to be given. - * - * @param[in] m The 3x3 augmented matrix. - * - * @retval Result::Success when succeed, Result::FailedAllocation otherwise. - */ - Result transform(const Matrix& m) noexcept; - - /** - * @brief Gets the matrix of the affine transformation of the object. - * - * The values of the matrix can be set by the transform() API, as well by the translate(), - * scale() and rotate(). In case no transformation was applied, the identity matrix is returned. - * - * @return The augmented transformation matrix. - * - * @since 0.4 - */ - Matrix transform() noexcept; - - /** - * @brief Sets the opacity of the object. - * - * @param[in] o The opacity value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. - * - * @retval Result::Success when succeed. - * - * @note Setting the opacity with this API may require multiple render pass for composition. It is recommended to avoid changing the opacity if possible. - * @note ClipPath won't use the opacity value. (see: enum class CompositeMethod::ClipPath) - */ - Result opacity(uint8_t o) noexcept; - - /** - * @brief Sets the composition target object and the composition method. - * - * @param[in] target The paint of the target object. - * @param[in] method The method used to composite the source object with the target. - * - * @retval Result::Success when succeed, Result::InvalidArguments otherwise. - */ - Result composite(std::unique_ptr target, CompositeMethod method) noexcept; - - /** - * @brief Sets the blending method for the paint object. - * - * The blending feature allows you to combine colors to create visually appealing effects, including transparency, lighting, shading, and color mixing, among others. - * its process involves the combination of colors or images from the source paint object with the destination (the lower layer image) using blending operations. - * The blending operation is determined by the chosen @p BlendMethod, which specifies how the colors or images are combined. - * - * @param[in] method The blending method to be set. - * - * @retval Result::Success when the blending method is successfully set. - * - * @note Experimental API - */ - Result blend(BlendMethod method) const noexcept; - - /** - * @brief Gets the bounding box of the paint object before any transformation. - * - * @param[out] x The x coordinate of the upper left corner of the object. - * @param[out] y The y coordinate of the upper left corner of the object. - * @param[out] w The width of the object. - * @param[out] h The height of the object. - * - * @return Result::Success when succeed, Result::InsufficientCondition otherwise. - * - * @note The bounding box doesn't indicate the final rendered region. It's the smallest rectangle that encloses the object. - * @see Paint::bounds(float* x, float* y, float* w, float* h, bool transformed); - * @deprecated Use bounds(float* x, float* y, float* w, float* h, bool transformed) instead - */ - TVG_DEPRECATED Result bounds(float* x, float* y, float* w, float* h) const noexcept; - - /** - * @brief Gets the axis-aligned bounding box of the paint object. - * - * In case @p transform is @c true, all object's transformations are applied first, and then the bounding box is established. Otherwise, the bounding box is determined before any transformations. - * - * @param[out] x The x coordinate of the upper left corner of the object. - * @param[out] y The y coordinate of the upper left corner of the object. - * @param[out] w The width of the object. - * @param[out] h The height of the object. - * @param[in] transformed If @c true, the paint's transformations are taken into account, otherwise they aren't. - * - * @retval Result::Success when succeed, Result::InsufficientCondition otherwise. - * - * @note The bounding box doesn't indicate the actual drawing region. It's the smallest rectangle that encloses the object. - */ - Result bounds(float* x, float* y, float* w, float* h, bool transformed) const noexcept; - - /** - * @brief Duplicates the object. - * - * Creates a new object and sets its all properties as in the original object. - * - * @return The created object when succeed, @c nullptr otherwise. - */ - Paint* duplicate() const noexcept; - - /** - * @brief Gets the opacity value of the object. - * - * @return The opacity value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. - */ - uint8_t opacity() const noexcept; - - /** - * @brief Gets the composition target object and the composition method. - * - * @param[out] target The paint of the target object. - * - * @return The method used to composite the source object with the target. - * - * @since 0.5 - */ - CompositeMethod composite(const Paint** target) const noexcept; - - /** - * @brief Gets the blending method of the object. - * - * @return The blending method - * - * @note Experimental API - */ - BlendMethod blend() const noexcept; - - /** - * @brief Return the unique id value of the paint instance. - * - * This method can be called for checking the current concrete instance type. - * - * @return The type id of the Paint instance. - */ - uint32_t identifier() const noexcept; - - _TVG_DECLARE_PRIVATE(Paint); -}; - - -/** - * @class Fill - * - * @brief An abstract class representing the gradient fill of the Shape object. - * - * It contains the information about the gradient colors and their arrangement - * inside the gradient bounds. The gradients bounds are defined in the LinearGradient - * or RadialGradient class, depending on the type of the gradient to be used. - * It specifies the gradient behavior in case the area defined by the gradient bounds - * is smaller than the area to be filled. - */ -class TVG_API Fill -{ -public: - /** - * @brief A data structure storing the information about the color and its relative position inside the gradient bounds. - */ - struct ColorStop - { - float offset; /**< The relative position of the color. */ - uint8_t r; /**< The red color channel value in the range [0 ~ 255]. */ - uint8_t g; /**< The green color channel value in the range [0 ~ 255]. */ - uint8_t b; /**< The blue color channel value in the range [0 ~ 255]. */ - uint8_t a; /**< The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. */ - }; - - virtual ~Fill(); - - /** - * @brief Sets the parameters of the colors of the gradient and their position. - * - * @param[in] colorStops An array of ColorStop data structure. - * @param[in] cnt The count of the @p colorStops array equal to the colors number used in the gradient. - * - * @retval Result::Success when succeed. - */ - Result colorStops(const ColorStop* colorStops, uint32_t cnt) noexcept; - - /** - * @brief Sets the FillSpread value, which specifies how to fill the area outside the gradient bounds. - * - * @param[in] s The FillSpread value. - * - * @retval Result::Success when succeed. - */ - Result spread(FillSpread s) noexcept; - - /** - * @brief Sets the matrix of the affine transformation for the gradient fill. - * - * The augmented matrix of the transformation is expected to be given. - * - * @param[in] m The 3x3 augmented matrix. - * - * @retval Result::Success when succeed, Result::FailedAllocation otherwise. - */ - Result transform(const Matrix& m) noexcept; - - /** - * @brief Gets the parameters of the colors of the gradient, their position and number. - * - * @param[out] colorStops A pointer to the memory location, where the array of the gradient's ColorStop is stored. - * - * @return The number of colors used in the gradient. This value corresponds to the length of the @p colorStops array. - */ - uint32_t colorStops(const ColorStop** colorStops) const noexcept; - - /** - * @brief Gets the FillSpread value of the fill. - * - * @return The FillSpread value of this Fill. - */ - FillSpread spread() const noexcept; - - /** - * @brief Gets the matrix of the affine transformation of the gradient fill. - * - * In case no transformation was applied, the identity matrix is returned. - * - * @return The augmented transformation matrix. - */ - Matrix transform() const noexcept; - - /** - * @brief Creates a copy of the Fill object. - * - * Return a newly created Fill object with the properties copied from the original. - * - * @return A copied Fill object when succeed, @c nullptr otherwise. - */ - Fill* duplicate() const noexcept; - - /** - * @brief Return the unique id value of the Fill instance. - * - * This method can be called for checking the current concrete instance type. - * - * @return The type id of the Fill instance. - */ - uint32_t identifier() const noexcept; - - _TVG_DECLARE_PRIVATE(Fill); -}; - - -/** - * @class Canvas - * - * @brief An abstract class for drawing graphical elements. - * - * A canvas is an entity responsible for drawing the target. It sets up the drawing engine and the buffer, which can be drawn on the screen. It also manages given Paint objects. - * - * @note A Canvas behavior depends on the raster engine though the final content of the buffer is expected to be identical. - * @warning The Paint objects belonging to one Canvas can't be shared among multiple Canvases. - */ -class TVG_API Canvas -{ -public: - Canvas(RenderMethod*); - virtual ~Canvas(); - - /** - * @brief Sets the size of the container, where all the paints pushed into the Canvas are stored. - * - * If the number of objects pushed into the Canvas is known in advance, calling the function - * prevents multiple memory reallocation, thus improving the performance. - * - * @param[in] n The number of objects for which the memory is to be reserved. - * - * @return Result::Success when succeed. - */ - TVG_DEPRECATED Result reserve(uint32_t n) noexcept; - - /** - * @brief Returns the list of the paints that currently held by the Canvas. - * - * This function provides the list of paint nodes, allowing users a direct opportunity to modify the scene tree. - * - * @warning Please avoid accessing the paints during Canvas update/draw. You can access them after calling sync(). - * @see Canvas::sync() - * - * @note Experimental API - */ - std::list& paints() noexcept; - - /** - * @brief Passes drawing elements to the Canvas using Paint objects. - * - * Only pushed paints in the canvas will be drawing targets. - * They are retained by the canvas until you call Canvas::clear(). - * - * @param[in] paint A Paint object to be drawn. - * - * @retval Result::Success When succeed. - * @retval Result::MemoryCorruption In case a @c nullptr is passed as the argument. - * @retval Result::InsufficientCondition An internal error. - * - * @note The rendering order of the paints is the same as the order as they were pushed into the canvas. Consider sorting the paints before pushing them if you intend to use layering. - * @see Canvas::paints() - * @see Canvas::clear() - */ - virtual Result push(std::unique_ptr paint) noexcept; - - /** - * @brief Clear the internal canvas resources that used for the drawing. - * - * This API sets the total number of paints pushed into the canvas to zero. - * Depending on the value of the @p free argument, the paints are either freed or retained. - * So if you need to update paint properties while maintaining the existing scene structure, you can set @p free = false. - * - * @param[in] free If @c true, the memory occupied by paints is deallocated, otherwise it is not. - * - * @retval Result::Success when succeed, Result::InsufficientCondition otherwise. - * - * @see Canvas::push() - * @see Canvas::paints() - */ - virtual Result clear(bool free = true) noexcept; - - /** - * @brief Request the canvas to update the paint objects. - * - * If a @c nullptr is passed all paint objects retained by the Canvas are updated, - * otherwise only the paint to which the given @p paint points. - * - * @param[in] paint A pointer to the Paint object or @c nullptr. - * - * @retval Result::Success when succeed, Result::InsufficientCondition otherwise. - * - * @note The Update behavior can be asynchronous if the assigned thread number is greater than zero. - */ - virtual Result update(Paint* paint = nullptr) noexcept; - - /** - * @brief Requests the canvas to draw the Paint objects. - * - * @retval Result::Success when succeed, Result::InsufficientCondition otherwise. - * - * @note Drawing can be asynchronous if the assigned thread number is greater than zero. To guarantee the drawing is done, call sync() afterwards. - * @see Canvas::sync() - */ - virtual Result draw() noexcept; - - /** - * @brief Sets the drawing region in the canvas. - * - * This function defines the rectangular area of the canvas that will be used for drawing operations. - * The specified viewport is used to clip the rendering output to the boundaries of the rectangle. - * - * @param[in] x The x-coordinate of the upper-left corner of the rectangle. - * @param[in] y The y-coordinate of the upper-left corner of the rectangle. - * @param[in] w The width of the rectangle. - * @param[in] h The height of the rectangle. - * - * @retval Result::Success when succeed, Result::InsufficientCondition otherwise. - * - * @see SwCanvas::target() - * @see GlCanvas::target() - * @see WgCanvas::target() - * - * @warning It's not allowed to change the viewport during Canvas::push() - Canvas::sync() or Canvas::update() - Canvas::sync(). - * - * @note When resetting the target, the viewport will also be reset to the target size. - * @note Experimental API - */ - virtual Result viewport(int32_t x, int32_t y, int32_t w, int32_t h) noexcept; - - /** - * @brief Guarantees that drawing task is finished. - * - * The Canvas rendering can be performed asynchronously. To make sure that rendering is finished, - * the sync() must be called after the draw() regardless of threading. - * - * @retval Result::Success when succeed, Result::InsufficientCondition otherwise. - * @see Canvas::draw() - */ - virtual Result sync() noexcept; - - _TVG_DECLARE_PRIVATE(Canvas); -}; - - -/** - * @class LinearGradient - * - * @brief A class representing the linear gradient fill of the Shape object. - * - * Besides the APIs inherited from the Fill class, it enables setting and getting the linear gradient bounds. - * The behavior outside the gradient bounds depends on the value specified in the spread API. - */ -class TVG_API LinearGradient final : public Fill -{ -public: - ~LinearGradient(); - - /** - * @brief Sets the linear gradient bounds. - * - * The bounds of the linear gradient are defined as a surface constrained by two parallel lines crossing - * the given points (@p x1, @p y1) and (@p x2, @p y2), respectively. Both lines are perpendicular to the line linking - * (@p x1, @p y1) and (@p x2, @p y2). - * - * @param[in] x1 The horizontal coordinate of the first point used to determine the gradient bounds. - * @param[in] y1 The vertical coordinate of the first point used to determine the gradient bounds. - * @param[in] x2 The horizontal coordinate of the second point used to determine the gradient bounds. - * @param[in] y2 The vertical coordinate of the second point used to determine the gradient bounds. - * - * @retval Result::Success when succeed. - * - * @note In case the first and the second points are equal, an object filled with such a gradient fill is not rendered. - */ - Result linear(float x1, float y1, float x2, float y2) noexcept; - - /** - * @brief Gets the linear gradient bounds. - * - * The bounds of the linear gradient are defined as a surface constrained by two parallel lines crossing - * the given points (@p x1, @p y1) and (@p x2, @p y2), respectively. Both lines are perpendicular to the line linking - * (@p x1, @p y1) and (@p x2, @p y2). - * - * @param[out] x1 The horizontal coordinate of the first point used to determine the gradient bounds. - * @param[out] y1 The vertical coordinate of the first point used to determine the gradient bounds. - * @param[out] x2 The horizontal coordinate of the second point used to determine the gradient bounds. - * @param[out] y2 The vertical coordinate of the second point used to determine the gradient bounds. - * - * @retval Result::Success when succeed. - */ - Result linear(float* x1, float* y1, float* x2, float* y2) const noexcept; - - /** - * @brief Creates a new LinearGradient object. - * - * @return A new LinearGradient object. - */ - static std::unique_ptr gen() noexcept; - - /** - * @brief Return the unique id value of this class. - * - * This method can be referred for identifying the LinearGradient class type. - * - * @return The type id of the LinearGradient class. - */ - static uint32_t identifier() noexcept; - - _TVG_DECLARE_PRIVATE(LinearGradient); -}; - - -/** - * @class RadialGradient - * - * @brief A class representing the radial gradient fill of the Shape object. - * - */ -class TVG_API RadialGradient final : public Fill -{ -public: - ~RadialGradient(); - - /** - * @brief Sets the radial gradient bounds. - * - * The radial gradient bounds are defined as a circle centered in a given point (@p cx, @p cy) of a given radius. - * - * @param[in] cx The horizontal coordinate of the center of the bounding circle. - * @param[in] cy The vertical coordinate of the center of the bounding circle. - * @param[in] radius The radius of the bounding circle. - * - * @retval Result::Success when succeed, Result::InvalidArguments in case the @p radius value is zero or less. - */ - Result radial(float cx, float cy, float radius) noexcept; - - /** - * @brief Gets the radial gradient bounds. - * - * The radial gradient bounds are defined as a circle centered in a given point (@p cx, @p cy) of a given radius. - * - * @param[out] cx The horizontal coordinate of the center of the bounding circle. - * @param[out] cy The vertical coordinate of the center of the bounding circle. - * @param[out] radius The radius of the bounding circle. - * - * @retval Result::Success when succeed. - */ - Result radial(float* cx, float* cy, float* radius) const noexcept; - - /** - * @brief Creates a new RadialGradient object. - * - * @return A new RadialGradient object. - */ - static std::unique_ptr gen() noexcept; - - /** - * @brief Return the unique id value of this class. - * - * This method can be referred for identifying the RadialGradient class type. - * - * @return The type id of the RadialGradient class. - */ - static uint32_t identifier() noexcept; - - _TVG_DECLARE_PRIVATE(RadialGradient); -}; - - -/** - * @class Shape - * - * @brief A class representing two-dimensional figures and their properties. - * - * A shape has three major properties: shape outline, stroking, filling. The outline in the Shape is retained as the path. - * Path can be composed by accumulating primitive commands such as moveTo(), lineTo(), cubicTo(), or complete shape interfaces such as appendRect(), appendCircle(), etc. - * Path can consists of sub-paths. One sub-path is determined by a close command. - * - * The stroke of Shape is an optional property in case the Shape needs to be represented with/without the outline borders. - * It's efficient since the shape path and the stroking path can be shared with each other. It's also convenient when controlling both in one context. - */ -class TVG_API Shape final : public Paint -{ -public: - ~Shape(); - - /** - * @brief Resets the properties of the shape path. - * - * The transformation matrix, the color, the fill and the stroke properties are retained. - * - * @retval Result::Success when succeed. - * - * @note The memory, where the path data is stored, is not deallocated at this stage for caching effect. - */ - Result reset() noexcept; - - /** - * @brief Sets the initial point of the sub-path. - * - * The value of the current point is set to the given point. - * - * @param[in] x The horizontal coordinate of the initial point of the sub-path. - * @param[in] y The vertical coordinate of the initial point of the sub-path. - * - * @retval Result::Success when succeed. - */ - Result moveTo(float x, float y) noexcept; - - /** - * @brief Adds a new point to the sub-path, which results in drawing a line from the current point to the given end-point. - * - * The value of the current point is set to the given end-point. - * - * @param[in] x The horizontal coordinate of the end-point of the line. - * @param[in] y The vertical coordinate of the end-point of the line. - * - * @retval Result::Success when succeed. - * - * @note In case this is the first command in the path, it corresponds to the moveTo() call. - */ - Result lineTo(float x, float y) noexcept; - - /** - * @brief Adds new points to the sub-path, which results in drawing a cubic Bezier curve starting - * at the current point and ending at the given end-point (@p x, @p y) using the control points (@p cx1, @p cy1) and (@p cx2, @p cy2). - * - * The value of the current point is set to the given end-point. - * - * @param[in] cx1 The horizontal coordinate of the 1st control point. - * @param[in] cy1 The vertical coordinate of the 1st control point. - * @param[in] cx2 The horizontal coordinate of the 2nd control point. - * @param[in] cy2 The vertical coordinate of the 2nd control point. - * @param[in] x The horizontal coordinate of the end-point of the curve. - * @param[in] y The vertical coordinate of the end-point of the curve. - * - * @retval Result::Success when succeed. - * - * @note In case this is the first command in the path, no data from the path are rendered. - */ - Result cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float y) noexcept; - - /** - * @brief Closes the current sub-path by drawing a line from the current point to the initial point of the sub-path. - * - * The value of the current point is set to the initial point of the closed sub-path. - * - * @retval Result::Success when succeed. - * - * @note In case the sub-path does not contain any points, this function has no effect. - */ - Result close() noexcept; - - /** - * @brief Appends a rectangle to the path. - * - * The rectangle with rounded corners can be achieved by setting non-zero values to @p rx and @p ry arguments. - * The @p rx and @p ry values specify the radii of the ellipse defining the rounding of the corners. - * - * The position of the rectangle is specified by the coordinates of its upper left corner - @p x and @p y arguments. - * - * The rectangle is treated as a new sub-path - it is not connected with the previous sub-path. - * - * The value of the current point is set to (@p x + @p rx, @p y) - in case @p rx is greater - * than @p w/2 the current point is set to (@p x + @p w/2, @p y) - * - * @param[in] x The horizontal coordinate of the upper left corner of the rectangle. - * @param[in] y The vertical coordinate of the upper left corner of the rectangle. - * @param[in] w The width of the rectangle. - * @param[in] h The height of the rectangle. - * @param[in] rx The x-axis radius of the ellipse defining the rounded corners of the rectangle. - * @param[in] ry The y-axis radius of the ellipse defining the rounded corners of the rectangle. - * - * @retval Result::Success when succeed. - * - * @note For @p rx and @p ry greater than or equal to the half of @p w and the half of @p h, respectively, the shape become an ellipse. - */ - Result appendRect(float x, float y, float w, float h, float rx = 0, float ry = 0) noexcept; - - /** - * @brief Appends an ellipse to the path. - * - * The position of the ellipse is specified by the coordinates of its center - @p cx and @p cy arguments. - * - * The ellipse is treated as a new sub-path - it is not connected with the previous sub-path. - * - * The value of the current point is set to (@p cx, @p cy - @p ry). - * - * @param[in] cx The horizontal coordinate of the center of the ellipse. - * @param[in] cy The vertical coordinate of the center of the ellipse. - * @param[in] rx The x-axis radius of the ellipse. - * @param[in] ry The y-axis radius of the ellipse. - * - * @retval Result::Success when succeed. - */ - Result appendCircle(float cx, float cy, float rx, float ry) noexcept; - - /** - * @brief Appends a circular arc to the path. - * - * The arc is treated as a new sub-path - it is not connected with the previous sub-path. - * The current point value is set to the end-point of the arc in case @p pie is @c false, and to the center of the arc otherwise. - * - * @param[in] cx The horizontal coordinate of the center of the arc. - * @param[in] cy The vertical coordinate of the center of the arc. - * @param[in] radius The radius of the arc. - * @param[in] startAngle The start angle of the arc given in degrees, measured counter-clockwise from the horizontal line. - * @param[in] sweep The central angle of the arc given in degrees, measured counter-clockwise from @p startAngle. - * @param[in] pie Specifies whether to draw radii from the arc's center to both of its end-point - drawn if @c true. - * - * @retval Result::Success when succeed. - * - * @note Setting @p sweep value greater than 360 degrees, is equivalent to calling appendCircle(cx, cy, radius, radius). - */ - Result appendArc(float cx, float cy, float radius, float startAngle, float sweep, bool pie) noexcept; - - /** - * @brief Appends a given sub-path to the path. - * - * The current point value is set to the last point from the sub-path. - * For each command from the @p cmds array, an appropriate number of points in @p pts array should be specified. - * If the number of points in the @p pts array is different than the number required by the @p cmds array, the shape with this sub-path will not be displayed on the screen. - * - * @param[in] cmds The array of the commands in the sub-path. - * @param[in] cmdCnt The number of the sub-path's commands. - * @param[in] pts The array of the two-dimensional points. - * @param[in] ptsCnt The number of the points in the @p pts array. - * - * @retval Result::Success when succeed, Result::InvalidArguments otherwise. - * - * @note The interface is designed for optimal path setting if the caller has a completed path commands already. - */ - Result appendPath(const PathCommand* cmds, uint32_t cmdCnt, const Point* pts, uint32_t ptsCnt) noexcept; - - /** - * @brief Sets the stroke width for all of the figures from the path. - * - * @param[in] width The width of the stroke. The default value is 0. - * - * @retval Result::Success when succeed, Result::FailedAllocation otherwise. - */ - Result stroke(float width) noexcept; - - /** - * @brief Sets the color of the stroke for all of the figures from the path. - * - * @param[in] r The red color channel value in the range [0 ~ 255]. The default value is 0. - * @param[in] g The green color channel value in the range [0 ~ 255]. The default value is 0. - * @param[in] b The blue color channel value in the range [0 ~ 255]. The default value is 0. - * @param[in] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. The default value is 0. - * - * @retval Result::Success when succeed, Result::FailedAllocation otherwise. - */ - Result stroke(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) noexcept; - - /** - * @brief Sets the gradient fill of the stroke for all of the figures from the path. - * - * @param[in] f The gradient fill. - * - * @retval Result::Success When succeed. - * @retval Result::FailedAllocation An internal error with a memory allocation for an object to be filled. - * @retval Result::MemoryCorruption In case a @c nullptr is passed as the argument. - */ - Result stroke(std::unique_ptr f) noexcept; - - /** - * @brief Sets the dash pattern of the stroke. - * - * @param[in] dashPattern The array of consecutive pair values of the dash length and the gap length. - * @param[in] cnt The length of the @p dashPattern array. - * - * @retval Result::Success When succeed. - * @retval Result::FailedAllocation An internal error with a memory allocation for an object to be dashed. - * @retval Result::InvalidArguments In case @p dashPattern is @c nullptr and @p cnt > 0, @p cnt is zero, any of the dash pattern values is zero or less. - * - * @note To reset the stroke dash pattern, pass @c nullptr to @p dashPattern and zero to @p cnt. - * @warning @p cnt must be greater than 1 if the dash pattern is valid. - */ - Result stroke(const float* dashPattern, uint32_t cnt) noexcept; - - /** - * @brief Sets the cap style of the stroke in the open sub-paths. - * - * @param[in] cap The cap style value. The default value is @c StrokeCap::Square. - * - * @retval Result::Success when succeed, Result::FailedAllocation otherwise. - */ - Result stroke(StrokeCap cap) noexcept; - - /** - * @brief Sets the join style for stroked path segments. - * - * The join style is used for joining the two line segment while stroking the path. - * - * @param[in] join The join style value. The default value is @c StrokeJoin::Bevel. - * - * @retval Result::Success when succeed, Result::FailedAllocation otherwise. - */ - Result stroke(StrokeJoin join) noexcept; - - - /** - * @brief Sets the stroke miterlimit. - * - * @param[in] miterlimit The miterlimit imposes a limit on the extent of the stroke join, when the @c StrokeJoin::Miter join style is set. The default value is 4. - * - * @retval Result::Success when succeed, Result::NonSupport unsupported value, Result::FailedAllocation otherwise. - * - * @since 0.11 - */ - Result strokeMiterlimit(float miterlimit) noexcept; - - /** - * @brief Sets the solid color for all of the figures from the path. - * - * The parts of the shape defined as inner are colored. - * - * @param[in] r The red color channel value in the range [0 ~ 255]. The default value is 0. - * @param[in] g The green color channel value in the range [0 ~ 255]. The default value is 0. - * @param[in] b The blue color channel value in the range [0 ~ 255]. The default value is 0. - * @param[in] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. The default value is 0. - * - * @retval Result::Success when succeed. - * - * @note Either a solid color or a gradient fill is applied, depending on what was set as last. - * @note ClipPath won't use the fill values. (see: enum class CompositeMethod::ClipPath) - */ - Result fill(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) noexcept; - - /** - * @brief Sets the gradient fill for all of the figures from the path. - * - * The parts of the shape defined as inner are filled. - * - * @param[in] f The unique pointer to the gradient fill. - * - * @retval Result::Success when succeed, Result::MemoryCorruption otherwise. - * - * @note Either a solid color or a gradient fill is applied, depending on what was set as last. - */ - Result fill(std::unique_ptr f) noexcept; - - /** - * @brief Sets the fill rule for the Shape object. - * - * @param[in] r The fill rule value. The default value is @c FillRule::Winding. - * - * @retval Result::Success when succeed. - */ - Result fill(FillRule r) noexcept; - - - /** - * @brief Sets the rendering order of the stroke and the fill. - * - * @param[in] strokeFirst If @c true the stroke is rendered before the fill, otherwise the stroke is rendered as the second one (the default option). - * - * @retval Result::Success when succeed, Result::FailedAllocation otherwise. - * - * @since 0.10 - */ - Result order(bool strokeFirst) noexcept; - - - /** - * @brief Gets the commands data of the path. - * - * @param[out] cmds The pointer to the array of the commands from the path. - * - * @return The length of the @p cmds array when succeed, zero otherwise. - */ - uint32_t pathCommands(const PathCommand** cmds) const noexcept; - - /** - * @brief Gets the points values of the path. - * - * @param[out] pts The pointer to the array of the two-dimensional points from the path. - * - * @return The length of the @p pts array when succeed, zero otherwise. - */ - uint32_t pathCoords(const Point** pts) const noexcept; - - /** - * @brief Gets the pointer to the gradient fill of the shape. - * - * @return The pointer to the gradient fill of the stroke when succeed, @c nullptr in case no fill was set. - */ - const Fill* fill() const noexcept; - - /** - * @brief Gets the solid color of the shape. - * - * @param[out] r The red color channel value in the range [0 ~ 255]. - * @param[out] g The green color channel value in the range [0 ~ 255]. - * @param[out] b The blue color channel value in the range [0 ~ 255]. - * @param[out] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. - * - * @return Result::Success when succeed. - */ - Result fillColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a = nullptr) const noexcept; - - /** - * @brief Gets the fill rule value. - * - * @return The fill rule value of the shape. - */ - FillRule fillRule() const noexcept; - - /** - * @brief Gets the stroke width. - * - * @return The stroke width value when succeed, zero if no stroke was set. - */ - float strokeWidth() const noexcept; - - /** - * @brief Gets the color of the shape's stroke. - * - * @param[out] r The red color channel value in the range [0 ~ 255]. - * @param[out] g The green color channel value in the range [0 ~ 255]. - * @param[out] b The blue color channel value in the range [0 ~ 255]. - * @param[out] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. - * - * @retval Result::Success when succeed, Result::InsufficientCondition otherwise. - */ - Result strokeColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a = nullptr) const noexcept; - - /** - * @brief Gets the pointer to the gradient fill of the stroke. - * - * @return The pointer to the gradient fill of the stroke when succeed, @c nullptr otherwise. - */ - const Fill* strokeFill() const noexcept; - - /** - * @brief Gets the dash pattern of the stroke. - * - * @param[out] dashPattern The pointer to the memory, where the dash pattern array is stored. - * - * @return The length of the @p dashPattern array. - */ - uint32_t strokeDash(const float** dashPattern) const noexcept; - - /** - * @brief Gets the cap style used for stroking the path. - * - * @return The cap style value of the stroke. - */ - StrokeCap strokeCap() const noexcept; - - /** - * @brief Gets the join style value used for stroking the path. - * - * @return The join style value of the stroke. - */ - StrokeJoin strokeJoin() const noexcept; - - /** - * @brief Gets the stroke miterlimit. - * - * @return The stroke miterlimit value when succeed, 4 if no stroke was set. - * - * @since 0.11 - */ - float strokeMiterlimit() const noexcept; - - /** - * @brief Creates a new Shape object. - * - * @return A new Shape object. - */ - static std::unique_ptr gen() noexcept; - - /** - * @brief Return the unique id value of this class. - * - * This method can be referred for identifying the Shape class type. - * - * @return The type id of the Shape class. - */ - static uint32_t identifier() noexcept; - - _TVG_DECLARE_PRIVATE(Shape); -}; - - -/** - * @class Picture - * - * @brief A class representing an image read in one of the supported formats: raw, svg, png, jpg, lottie(json) and etc. - * Besides the methods inherited from the Paint, it provides methods to load & draw images on the canvas. - * - * @note Supported formats are depended on the available TVG loaders. - * @note See Animation class if the picture data is animatable. - */ -class TVG_API Picture final : public Paint -{ -public: - ~Picture(); - - /** - * @brief Loads a picture data directly from a file. - * - * ThorVG efficiently caches the loaded data using the specified @p path as a key. - * This means that loading the same file again will not result in duplicate operations; - * instead, ThorVG will reuse the previously loaded picture data. - * - * @param[in] path A path to the picture file. - * - * @retval Result::Success When succeed. - * @retval Result::InvalidArguments In case the @p path is invalid. - * @retval Result::NonSupport When trying to load a file with an unknown extension. - * @retval Result::Unknown If an error occurs at a later stage. - * - * @note The Load behavior can be asynchronous if the assigned thread number is greater than zero. - * @see Initializer::init() - */ - Result load(const std::string& path) noexcept; - - /** - * @brief Loads a picture data from a memory block of a given size. - * - * ThorVG efficiently caches the loaded data using the specified @p data address as a key - * when the @p copy has @c false. This means that loading the same data again will not result in duplicate operations - * for the sharable @p data. Instead, ThorVG will reuse the previously loaded picture data. - * - * @param[in] data A pointer to a memory location where the content of the picture file is stored. - * @param[in] size The size in bytes of the memory occupied by the @p data. - * @param[in] copy Decides whether the data should be copied into the engine local buffer. - * - * @retval Result::Success When succeed. - * @retval Result::InvalidArguments In case no data are provided or the @p size is zero or less. - * @retval Result::NonSupport When trying to load a file with an unknown extension. - * @retval Result::Unknown If an error occurs at a later stage. - * - * @warning: you have responsibility to release the @p data memory if the @p copy is true - * @deprecated Use load(const char* data, uint32_t size, const std::string& mimeType, bool copy) instead. - * @see Result load(const char* data, uint32_t size, const std::string& mimeType, bool copy = false) noexcept - */ - TVG_DEPRECATED Result load(const char* data, uint32_t size, bool copy = false) noexcept; - - /** - * @brief Loads a picture data from a memory block of a given size. - * - * @param[in] data A pointer to a memory location where the content of the picture file is stored. - * @param[in] size The size in bytes of the memory occupied by the @p data. - * @param[in] mimeType Mimetype or extension of data such as "jpg", "jpeg", "lottie", "svg", "svg+xml", "png", etc. In case an empty string or an unknown type is provided, the loaders will be tried one by one. - * @param[in] copy If @c true the data are copied into the engine local buffer, otherwise they are not. - * - * @retval Result::Success When succeed. - * @retval Result::InvalidArguments In case no data are provided or the @p size is zero or less. - * @retval Result::NonSupport When trying to load a file with an unknown extension. - * @retval Result::Unknown If an error occurs at a later stage. - * - * @warning: It's the user responsibility to release the @p data memory if the @p copy is @c true. - * - * @note If you are unsure about the MIME type, you can provide an empty value like @c "", and thorvg will attempt to figure it out. - * @since 0.5 - */ - Result load(const char* data, uint32_t size, const std::string& mimeType, bool copy = false) noexcept; - - /** - * @brief Resizes the picture content to the given width and height. - * - * The picture content is resized while keeping the default size aspect ratio. - * The scaling factor is established for each of dimensions and the smaller value is applied to both of them. - * - * @param[in] w A new width of the image in pixels. - * @param[in] h A new height of the image in pixels. - * - * @retval Result::Success when succeed, Result::InsufficientCondition otherwise. - */ - Result size(float w, float h) noexcept; - - /** - * @brief Gets the size of the image. - * - * @param[out] w The width of the image in pixels. - * @param[out] h The height of the image in pixels. - * - * @retval Result::Success when succeed. - */ - Result size(float* w, float* h) const noexcept; - - /** - * @brief Loads a raw data from a memory block with a given size. - * - * ThorVG efficiently caches the loaded data using the specified @p data address as a key - * when the @p copy has @c false. This means that loading the same data again will not result in duplicate operations - * for the sharable @p data. Instead, ThorVG will reuse the previously loaded picture data. - * - * @param[in] paint A Tvg_Paint pointer to the picture object. - * @param[in] data A pointer to a memory location where the content of the picture raw data is stored. - * @param[in] w The width of the image @p data in pixels. - * @param[in] h The height of the image @p data in pixels. - * @param[in] premultiplied If @c true, the given image data is alpha-premultiplied. - * @param[in] copy If @c true the data are copied into the engine local buffer, otherwise they are not. - * - * @retval Result::Success When succeed, Result::InsufficientCondition otherwise. - * @retval Result::FailedAllocation An internal error possibly with memory allocation. - * - * @since 0.9 - */ - Result load(uint32_t* data, uint32_t w, uint32_t h, bool copy) noexcept; - - /** - * @brief Sets or removes the triangle mesh to deform the image. - * - * If a mesh is provided, the transform property of the Picture will apply to the triangle mesh, and the - * image data will be used as the texture. - * - * If @p triangles is @c nullptr, or @p triangleCnt is 0, the mesh will be removed. - * - * Only raster image types are supported at this time (png, jpg). Vector types like svg and tvg do not support. - * mesh deformation. However, if required you should be able to render a vector image to a raster image and then apply a mesh. - * - * @param[in] triangles An array of Polygons(triangles) that make up the mesh, or null to remove the mesh. - * @param[in] triangleCnt The number of Polygons(triangles) provided, or 0 to remove the mesh. - * - * @retval Result::Success When succeed. - * @retval Result::Unknown If fails - * - * @note The Polygons are copied internally, so modifying them after calling Mesh::mesh has no affect. - * @warning Please do not use it, this API is not official one. It could be modified in the next version. - * - * @note Experimental API - */ - Result mesh(const Polygon* triangles, uint32_t triangleCnt) noexcept; - - /** - * @brief Return the number of triangles in the mesh, and optionally get a pointer to the array of triangles in the mesh. - * - * @param[out] triangles Optional. A pointer to the array of Polygons used by this mesh. - * - * @return The number of polygons in the array. - * - * @note Modifying the triangles returned by this method will modify them directly within the mesh. - * @warning Please do not use it, this API is not official one. It could be modified in the next version. - * - * @note Experimental API - */ - uint32_t mesh(const Polygon** triangles) const noexcept; - - /** - * @brief Creates a new Picture object. - * - * @return A new Picture object. - */ - static std::unique_ptr gen() noexcept; - - /** - * @brief Return the unique id value of this class. - * - * This method can be referred for identifying the Picture class type. - * - * @return The type id of the Picture class. - */ - static uint32_t identifier() noexcept; - - _TVG_DECLARE_ACCESSOR(Animation); - _TVG_DECLARE_PRIVATE(Picture); -}; - - -/** - * @class Scene - * - * @brief A class to composite children paints. - * - * As the traditional graphics rendering method, TVG also enables scene-graph mechanism. - * This feature supports an array function for managing the multiple paints as one group paint. - * - * As a group, the scene can be transformed, made translucent and composited with other target paints, - * its children will be affected by the scene world. - */ -class TVG_API Scene final : public Paint -{ -public: - ~Scene(); - - /** - * @brief Passes drawing elements to the Scene using Paint objects. - * - * Only the paints pushed into the scene will be the drawn targets. - * The paints are retained by the scene until Scene::clear() is called. - * - * @param[in] paint A Paint object to be drawn. - * - * @retval Result::Success when succeed, Result::MemoryCorruption otherwise. - * - * @note The rendering order of the paints is the same as the order as they were pushed. Consider sorting the paints before pushing them if you intend to use layering. - * @see Scene::paints() - * @see Scene::clear() - */ - Result push(std::unique_ptr paint) noexcept; - - /** - * @brief Sets the size of the container, where all the paints pushed into the Scene are stored. - * - * If the number of objects pushed into the scene is known in advance, calling the function - * prevents multiple memory reallocation, thus improving the performance. - * - * @param[in] size The number of objects for which the memory is to be reserved. - * - * @return Result::Success when succeed, Result::FailedAllocation otherwise. - */ - TVG_DEPRECATED Result reserve(uint32_t size) noexcept; - - /** - * @brief Returns the list of the paints that currently held by the Scene. - * - * This function provides the list of paint nodes, allowing users a direct opportunity to modify the scene tree. - * - * @warning Please avoid accessing the paints during Scene update/draw. You can access them after calling Canvas::sync(). - * @see Canvas::sync() - * @see Scene::push() - * @see Scene::clear() - * - * @note Experimental API - */ - std::list& paints() noexcept; - - /** - * @brief Sets the total number of the paints pushed into the scene to be zero. - * Depending on the value of the @p free argument, the paints are freed or not. - * - * @param[in] free If @c true, the memory occupied by paints is deallocated, otherwise it is not. - * - * @retval Result::Success when succeed - * - * @warning If you don't free the paints they become dangled. They are supposed to be reused, otherwise you are responsible for their lives. Thus please use the @p free argument only when you know how it works, otherwise it's not recommended. - * - * @since 0.2 - */ - Result clear(bool free = true) noexcept; - - /** - * @brief Creates a new Scene object. - * - * @return A new Scene object. - */ - static std::unique_ptr gen() noexcept; - - /** - * @brief Return the unique id value of this class. - * - * This method can be referred for identifying the Scene class type. - * - * @return The type id of the Scene class. - */ - static uint32_t identifier() noexcept; - - _TVG_DECLARE_PRIVATE(Scene); -}; - - -/** - * @class Text - * - * @brief A class to represent text objects in a graphical context, allowing for rendering and manipulation of unicode text. - * - * @note Experimental API - */ -class TVG_API Text final : public Paint -{ -public: - ~Text(); - - /** - * @brief Sets the font properties for the text. - * - * This function allows you to define the font characteristics used for text rendering. - * It sets the font name, size and optionally the style. - * - * @param[in] name The name of the font. This should correspond to a font available in the canvas. - * @param[in] size The size of the font in points. This determines how large the text will appear. - * @param[in] style The style of the font. It can be used to set the font to 'italic'. - * If not specified, the default style is used. Only 'italic' style is supported currently. - * - * @retval Result::Success when the font properties are set successfully. - * @retval Result::InsufficientCondition when the specified @p name cannot be found. - * - * @note Experimental API - */ - Result font(const char* name, float size, const char* style = nullptr) noexcept; - - /** - * @brief Assigns the given unicode text to be rendered. - * - * This function sets the unicode string that will be displayed by the rendering system. - * The text is set according to the specified UTF encoding method, which defaults to UTF-8. - * - * @param[in] text The multi-byte text encoded with utf8 string to be rendered. - * - * @retval Result::Success when succeed. - * - * @note Experimental API - */ - Result text(const char* text) noexcept; - - /** - * @brief Sets the text color. - * - * @param[in] r The red color channel value in the range [0 ~ 255]. The default value is 0. - * @param[in] g The green color channel value in the range [0 ~ 255]. The default value is 0. - * @param[in] b The blue color channel value in the range [0 ~ 255]. The default value is 0. - * - * @retval Result::Success when succeed. - * @retval Result::InsufficientCondition when the font has not been set up prior to this operation. - * - * @see Text::font() - * - * @note Experimental API - */ - Result fill(uint8_t r, uint8_t g, uint8_t b) noexcept; - - /** - * @brief Sets the gradient fill for all of the figures from the text. - * - * The parts of the text defined as inner are filled. - * - * @param[in] f The unique pointer to the gradient fill. - * - * @retval Result::Success when succeed, Result::MemoryCorruption otherwise. - * @retval Result::InsufficientCondition when the font has not been set up prior to this operation. - * - * @note Either a solid color or a gradient fill is applied, depending on what was set as last. - * @note Experimental API - * - * @see Text::font() - */ - Result fill(std::unique_ptr f) noexcept; - - /** - * @brief Loads a scalable font data(ttf) from a file. - * - * ThorVG efficiently caches the loaded data using the specified @p path as a key. - * This means that loading the same file again will not result in duplicate operations; - * instead, ThorVG will reuse the previously loaded font data. - * - * @param[in] path The path to the font file. - * - * @retval Result::Success When succeed. - * @retval Result::InvalidArguments In case the @p path is invalid. - * @retval Result::NonSupport When trying to load a file with an unknown extension. - * @retval Result::Unknown If an error occurs at a later stage. - * - * @note Experimental API - * - * @see Text::unload(const std::string& path) - */ - static Result load(const std::string& path) noexcept; - - /** - * @brief Unloads the specified scalable font data (TTF) that was previously loaded. - * - * This function is used to release resources associated with a font file that has been loaded into memory. - * - * @param[in] path The file path of the loaded font. - * - * @retval Result::Success Successfully unloads the font data. - * @retval Result::InsufficientCondition Fails if the loader is not initialized. - * - * @note If the font data is currently in use, it will not be immediately unloaded. - * @note Experimental API - * - * @see Text::load(const std::string& path) - */ - static Result unload(const std::string& path) noexcept; - - /** - * @brief Creates a new Text object. - * - * @return A new Text object. - * - * @note Experimental API - */ - static std::unique_ptr gen() noexcept; - - /** - * @brief Return the unique id value of this class. - * - * This method can be referred for identifying the Text class type. - * - * @return The type id of the Text class. - */ - static uint32_t identifier() noexcept; - - _TVG_DECLARE_PRIVATE(Text); -}; - - -/** - * @class SwCanvas - * - * @brief A class for the rendering graphical elements with a software raster engine. - */ -class TVG_API SwCanvas final : public Canvas -{ -public: - ~SwCanvas(); - - /** - * @brief Enumeration specifying the methods of combining the 8-bit color channels into 32-bit color. - */ - enum Colorspace - { - ABGR8888 = 0, ///< The channels are joined in the order: alpha, blue, green, red. Colors are alpha-premultiplied. (a << 24 | b << 16 | g << 8 | r) - ARGB8888, ///< The channels are joined in the order: alpha, red, green, blue. Colors are alpha-premultiplied. (a << 24 | r << 16 | g << 8 | b) - ABGR8888S, ///< The channels are joined in the order: alpha, blue, green, red. Colors are un-alpha-premultiplied. @since 0.12 - ARGB8888S, ///< The channels are joined in the order: alpha, red, green, blue. Colors are un-alpha-premultiplied. @since 0.12 - }; - - /** - * @brief Enumeration specifying the methods of Memory Pool behavior policy. - * @since 0.4 - */ - enum MempoolPolicy - { - Default = 0, ///< Default behavior that ThorVG is designed to. - Shareable, ///< Memory Pool is shared among the SwCanvases. - Individual ///< Allocate designated memory pool that is only used by current instance. - }; - - /** - * @brief Sets the drawing target for the rasterization. - * - * The buffer of a desirable size should be allocated and owned by the caller. - * - * @param[in] buffer A pointer to a memory block of the size @p stride x @p h, where the raster data are stored. - * @param[in] stride The stride of the raster image - greater than or equal to @p w. - * @param[in] w The width of the raster image. - * @param[in] h The height of the raster image. - * @param[in] cs The value specifying the way the 32-bits colors should be read/written. - * - * @retval Result::Success When succeed. - * @retval Result::MemoryCorruption When casting in the internal function implementation failed. - * @retval Result::InvalidArguments In case no valid pointer is provided or the width, or the height or the stride is zero. - * @retval Result::NonSupport In case the software engine is not supported. - * - * @warning Do not access @p buffer during Canvas::push() - Canvas::sync(). It should not be accessed while the engine is writing on it. - * - * @see Canvas::viewport() - */ - Result target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h, Colorspace cs) noexcept; - - /** - * @brief Set sw engine memory pool behavior policy. - * - * Basically ThorVG draws a lot of shapes, it allocates/deallocates a few chunk of memory - * while processing rendering. It internally uses one shared memory pool - * which can be reused among the canvases in order to avoid memory overhead. - * - * Thus ThorVG suggests using a memory pool policy to satisfy user demands, - * if it needs to guarantee the thread-safety of the internal data access. - * - * @param[in] policy The method specifying the Memory Pool behavior. The default value is @c MempoolPolicy::Default. - * - * @retval Result::Success When succeed. - * @retval Result::InsufficientCondition If the canvas contains some paints already. - * @retval Result::NonSupport In case the software engine is not supported. - * - * @note When @c policy is set as @c MempoolPolicy::Individual, the current instance of canvas uses its own individual - * memory data, which is not shared with others. This is necessary when the canvas is accessed on a worker-thread. - * - * @warning It's not allowed after pushing any paints. - * - * @since 0.4 - */ - Result mempool(MempoolPolicy policy) noexcept; - - /** - * @brief Creates a new SwCanvas object. - * @return A new SwCanvas object. - */ - static std::unique_ptr gen() noexcept; - - _TVG_DECLARE_PRIVATE(SwCanvas); -}; - - -/** - * @class GlCanvas - * - * @brief A class for the rendering graphic elements with a GL raster engine. - * - * @warning Please do not use it. This class is not fully supported yet. - * - * @note Experimental API - */ -class TVG_API GlCanvas final : public Canvas -{ -public: - ~GlCanvas(); - - /** - * @brief Sets the drawing target for rasterization. - * - * This function specifies the drawing target where the rasterization will occur. It can target - * a specific framebuffer object (FBO) or the main surface. - * - * @param[in] id The GL target ID, usually indicating the FBO ID. A value of @c 0 specifies the main surface. - * @param[in] w The width (in pixels) of the raster image. - * @param[in] h The height (in pixels) of the raster image. - * - * @warning This API is experimental and not officially supported. It may be modified or removed in future versions. - * @warning Drawing on the main surface is currently not permitted. If the identifier (@p id) is set to @c 0, the operation will be aborted. - * - * @see Canvas::viewport() - * - * @note Currently, this only allows the GL_RGBA8 color space format. - * @note Experimental API - */ - Result target(int32_t id, uint32_t w, uint32_t h) noexcept; - - /** - * @brief Creates a new GlCanvas object. - * - * @return A new GlCanvas object. - * - * @note Experimental API - */ - static std::unique_ptr gen() noexcept; - - _TVG_DECLARE_PRIVATE(GlCanvas); -}; - - -/** - * @class WgCanvas - * - * @brief A class for the rendering graphic elements with a WebGPU raster engine. - * - * @warning Please do not use it. This class is not fully supported yet. - * - * @note Experimental API - */ -class TVG_API WgCanvas final : public Canvas -{ -public: - ~WgCanvas(); - - /** - * @brief Sets the target window for the rasterization. - * - * @warning Please do not use it, this API is not official one. It could be modified in the next version. - * - * @note Experimental API - * @see Canvas::viewport() - */ - Result target(void* window, uint32_t w, uint32_t h) noexcept; - - /** - * @brief Creates a new WgCanvas object. - * - * @return A new WgCanvas object. - * - * @note Experimental API - */ - static std::unique_ptr gen() noexcept; - - _TVG_DECLARE_PRIVATE(WgCanvas); -}; - - -/** - * @class Initializer - * - * @brief A class that enables initialization and termination of the TVG engines. - */ -class TVG_API Initializer final -{ -public: - /** - * @brief Initializes TVG engines. - * - * TVG requires the running-engine environment. - * TVG runs its own task-scheduler for parallelizing rendering tasks efficiently. - * You can indicate the number of threads, the count of which is designated @p threads. - * In the initialization step, TVG will generate/spawn the threads as set by @p threads count. - * - * @param[in] engine The engine types to initialize. This is relative to the Canvas types, in which it will be used. For multiple backends bitwise operation is allowed. - * @param[in] threads The number of additional threads. Zero indicates only the main thread is to be used. - * - * @retval Result::Success When succeed. - * @retval Result::FailedAllocation An internal error possibly with memory allocation. - * @retval Result::InvalidArguments If unknown engine type chosen. - * @retval Result::NonSupport In case the engine type is not supported on the system. - * @retval Result::Unknown Others. - * - * @note The Initializer keeps track of the number of times it was called. Threads count is fixed at the first init() call. - * @see Initializer::term() - */ - static Result init(CanvasEngine engine, uint32_t threads) noexcept; - - /** - * @brief Terminates TVG engines. - * - * @param[in] engine The engine types to terminate. This is relative to the Canvas types, in which it will be used. For multiple backends bitwise operation is allowed - * - * @retval Result::Success When succeed. - * @retval Result::InsufficientCondition In case there is nothing to be terminated. - * @retval Result::InvalidArguments If unknown engine type chosen. - * @retval Result::NonSupport In case the engine type is not supported on the system. - * @retval Result::Unknown Others. - * - * @note Initializer does own reference counting for multiple calls. - * @see Initializer::init() - */ - static Result term(CanvasEngine engine) noexcept; - - _TVG_DISABLE_CTOR(Initializer); -}; - - -/** - * @class Animation - * - * @brief The Animation class enables manipulation of animatable images. - * - * This class supports the display and control of animation frames. - * - * @since 0.13 - */ - -class TVG_API Animation -{ -public: - ~Animation(); - - /** - * @brief Specifies the current frame in the animation. - * - * @param[in] no The index of the animation frame to be displayed. The index should be less than the totalFrame(). - * - * @retval Result::Success Successfully set the frame. - * @retval Result::InsufficientCondition if the given @p no is the same as the current frame value. - * @retval Result::NonSupport The current Picture data does not support animations. - * - * @note For efficiency, ThorVG ignores updates to the new frame value if the difference from the current frame value - * is less than 0.001. In such cases, it returns @c Result::InsufficientCondition. - * Values less than 0.001 may be disregarded and may not be accurately retained by the Animation. - * - * @see totalFrame() - * - */ - Result frame(float no) noexcept; - - /** - * @brief Retrieves a picture instance associated with this animation instance. - * - * This function provides access to the picture instance that can be used to load animation formats, such as Lottie(json). - * After setting up the picture, it can be pushed to the designated canvas, enabling control over animation frames - * with this Animation instance. - * - * @return A picture instance that is tied to this animation. - * - * @warning The picture instance is owned by Animation. It should not be deleted manually. - * - */ - Picture* picture() const noexcept; - - /** - * @brief Retrieves the current frame number of the animation. - * - * @return The current frame number of the animation, between 0 and totalFrame() - 1. - * - * @note If the Picture is not properly configured, this function will return 0. - * - * @see Animation::frame(float no) - * @see Animation::totalFrame() - * - */ - float curFrame() const noexcept; - - /** - * @brief Retrieves the total number of frames in the animation. - * - * @return The total number of frames in the animation. - * - * @note Frame numbering starts from 0. - * @note If the Picture is not properly configured, this function will return 0. - * - */ - float totalFrame() const noexcept; - - /** - * @brief Retrieves the duration of the animation in seconds. - * - * @return The duration of the animation in seconds. - * - * @note If the Picture is not properly configured, this function will return 0. - * - */ - float duration() const noexcept; - - /** - * @brief Specifies the playback segment of the animation. - * - * The set segment is designated as the play area of the animation. - * This is useful for playing a specific segment within the entire animation. - * After setting, the number of animation frames and the playback time are calculated - * by mapping the playback segment as the entire range. - * - * @param[in] begin segment start. - * @param[in] end segment end. - * - * @retval Result::Success When succeed. - * @retval Result::InsufficientCondition In case the animation is not loaded. - * @retval Result::InvalidArguments When the given parameter is invalid. - * @retval Result::NonSupport When it's not animatable. - * - * @note Range from 0.0~1.0 - * @note If a marker has been specified, its range will be disregarded. - * @see LottieAnimation::segment(const char* marker) - * @note Experimental API - */ - Result segment(float begin, float end) noexcept; - - /** - * @brief Gets the current segment. - * - * @param[out] begin segment start. - * @param[out] end segment end. - * - * @retval Result::Success When succeed. - * @retval Result::InsufficientCondition In case the animation is not loaded. - * @retval Result::InvalidArguments When the given parameter is invalid. - * @retval Result::NonSupport When it's not animatable. - * - * @note Experimental API - */ - Result segment(float* begin, float* end = nullptr) noexcept; - - /** - * @brief Creates a new Animation object. - * - * @return A new Animation object. - * - */ - static std::unique_ptr gen() noexcept; - - _TVG_DECLARE_PRIVATE(Animation); -}; - - -/** - * @class Saver - * - * @brief A class for exporting a paint object into a specified file, from which to recover the paint data later. - * - * ThorVG provides a feature for exporting & importing paint data. The Saver role is to export the paint data to a file. - * It's useful when you need to save the composed scene or image from a paint object and recreate it later. - * - * The file format is decided by the extension name(i.e. "*.tvg") while the supported formats depend on the TVG packaging environment. - * If it doesn't support the file format, the save() method returns the @c Result::NonSupport result. - * - * Once you export a paint to the file successfully, you can recreate it using the Picture class. - * - * @see Picture::load() - * - * @since 0.5 - */ -class TVG_API Saver final -{ -public: - ~Saver(); - - /** - * @brief Sets the base background content for the saved image. - * - * @param[in] paint The paint to be drawn as the background image for the saving paint. - * - * @note Experimental API - */ - Result background(std::unique_ptr paint) noexcept; - - /** - * @brief Exports the given @p paint data to the given @p path - * - * If the saver module supports any compression mechanism, it will optimize the data size. - * This might affect the encoding/decoding time in some cases. You can turn off the compression - * if you wish to optimize for speed. - * - * @param[in] paint The paint to be saved with all its associated properties. - * @param[in] path A path to the file, in which the paint data is to be saved. - * @param[in] compress If @c true then compress data if possible. - * - * @retval Result::Success When succeed. - * @retval Result::InsufficientCondition If currently saving other resources. - * @retval Result::NonSupport When trying to save a file with an unknown extension or in an unsupported format. - * @retval Result::MemoryCorruption An internal error. - * @retval Result::Unknown In case an empty paint is to be saved. - * - * @note Saving can be asynchronous if the assigned thread number is greater than zero. To guarantee the saving is done, call sync() afterwards. - * @see Saver::sync() - * - * @since 0.5 - */ - Result save(std::unique_ptr paint, const std::string& path, bool compress = true) noexcept; - - /** - * @brief Export the provided animation data to the specified file path. - * - * This function exports the given animation data to the provided file path. You can also specify the desired frame rate in frames per second (FPS) by providing the fps parameter. - * - * @param[in] animation The animation to be saved, including all associated properties. - * @param[in] path The path to the file where the animation will be saved. - * @param[in] quality The encoded quality level. @c 0 is the minimum, @c 100 is the maximum value(recommended). - * @param[in] fps The desired frames per second (FPS). For example, to encode data at 60 FPS, pass 60. Pass 0 to keep the original frame data. - * - * @retval Result::Success if the export succeeds. - * @retval Result::InsufficientCondition if there are ongoing resource-saving operations. - * @retval Result::NonSupport if an attempt is made to save the file with an unknown extension or in an unsupported format. - * @retval Result::MemoryCorruption in case of an internal error. - * @retval Result::Unknown if attempting to save an empty paint. - * - * @note A higher frames per second (FPS) would result in a larger file size. It is recommended to use the default value. - * @note Saving can be asynchronous if the assigned thread number is greater than zero. To guarantee the saving is done, call sync() afterwards. - * - * @see Saver::sync() - * - * @note Experimental API - */ - Result save(std::unique_ptr animation, const std::string& path, uint32_t quality = 100, uint32_t fps = 0) noexcept; - - /** - * @brief Guarantees that the saving task is finished. - * - * The behavior of the Saver works on a sync/async basis, depending on the threading setting of the Initializer. - * Thus, if you wish to have a benefit of it, you must call sync() after the save() in the proper delayed time. - * Otherwise, you can call sync() immediately. - * - * @retval Result::Success when succeed. - * @retval Result::InsufficientCondition otherwise. - * - * @note The asynchronous tasking is dependent on the Saver module implementation. - * @see Saver::save() - * - * @since 0.5 - */ - Result sync() noexcept; - - /** - * @brief Creates a new Saver object. - * - * @return A new Saver object. - * - * @since 0.5 - */ - static std::unique_ptr gen() noexcept; - - _TVG_DECLARE_PRIVATE(Saver); -}; - - -/** - * @class Accessor - * - * @brief The Accessor is a utility class to debug the Scene structure by traversing the scene-tree. - * - * The Accessor helps you search specific nodes to read the property information, figure out the structure of the scene tree and its size. - * - * @warning We strongly warn you not to change the paints of a scene unless you really know the design-structure. - * - * @since 0.10 - */ -class TVG_API Accessor final -{ -public: - ~Accessor(); - - /** - * @brief Set the access function for traversing the Picture scene tree nodes. - * - * @param[in] picture The picture node to traverse the internal scene-tree. - * @param[in] func The callback function calling for every paint nodes of the Picture. - * - * @return Return the given @p picture instance. - * - * @note The bitmap based picture might not have the scene-tree. - */ - std::unique_ptr set(std::unique_ptr picture, std::function func) noexcept; - - /** - * @brief Creates a new Accessor object. - * - * @return A new Accessor object. - */ - static std::unique_ptr gen() noexcept; - - _TVG_DECLARE_PRIVATE(Accessor); -}; - - -/** - * @brief The cast() function is a utility function used to cast a 'Paint' to type 'T'. - * @since 0.11 - */ -template -std::unique_ptr cast(Paint* paint) -{ - return std::unique_ptr(static_cast(paint)); -} - - -/** - * @brief The cast() function is a utility function used to cast a 'Fill' to type 'T'. - * @since 0.11 - */ -template -std::unique_ptr cast(Fill* fill) -{ - return std::unique_ptr(static_cast(fill)); -} - - -/** @}*/ - -} //namespace - -#endif //_THORVG_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/thorvg_capi.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/thorvg_capi.h deleted file mode 100644 index 98b709e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/thorvg_capi.h +++ /dev/null @@ -1,2508 +0,0 @@ -/*! -* \file thorvg_capi.h -* -* \brief The module provides C bindings for the ThorVG library. -* Please refer to src/examples/Capi.cpp to find the thorvg_capi usage examples. -* -* The thorvg_capi module allows to implement the ThorVG client and provides -* the following functionalities: -* - drawing shapes: line, arc, curve, polygon, circle, user-defined, ... -* - filling: solid, linear and radial gradient -* - scene graph & affine transformation (translation, rotation, scale, ...) -* - stroking: width, join, cap, dash -* - composition: blending, masking, path clipping -* - pictures: SVG, PNG, JPG, bitmap -* -*/ - -#include "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL -#define TVG_BUILD 1 - -#define TVG_BUILD 1 - -#ifndef __THORVG_CAPI_H__ -#define __THORVG_CAPI_H__ - -#include -#include - -#ifdef TVG_API - #undef TVG_API -#endif - -#ifndef TVG_STATIC - #ifdef _WIN32 - #if TVG_BUILD - #define TVG_API __declspec(dllexport) - #else - #define TVG_API __declspec(dllimport) - #endif - #elif (defined(__SUNPRO_C) || defined(__SUNPRO_CC)) - #define TVG_API __global - #else - #if (defined(__GNUC__) && __GNUC__ >= 4) || defined(__INTEL_COMPILER) - #define TVG_API __attribute__ ((visibility("default"))) - #else - #define TVG_API - #endif - #endif -#else - #define TVG_API -#endif - -#ifdef TVG_DEPRECATED - #undef TVG_DEPRECATED -#endif - -#ifdef _WIN32 - #define TVG_DEPRECATED __declspec(deprecated) -#elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) - #define TVG_DEPRECATED __attribute__ ((__deprecated__)) -#else - #define TVG_DEPRECATED -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** -* \defgroup ThorVG_CAPI ThorVG_CAPI -* \brief ThorVG C language binding APIs. -* -* \{ -*/ - - -/** -* \brief A structure responsible for managing and drawing graphical elements. -* -* It sets up the target buffer, which can be drawn on the screen. It stores the Tvg_Paint objects (Shape, Scene, Picture). -*/ -typedef struct _Tvg_Canvas Tvg_Canvas; - - -/** -* \brief A structure representing a graphical element. -* -* \warning The TvgPaint objects cannot be shared between Canvases. -*/ -typedef struct _Tvg_Paint Tvg_Paint; - - -/** -* \brief A structure representing a gradient fill of a Tvg_Paint object. -*/ -typedef struct _Tvg_Gradient Tvg_Gradient; - - -/** -* \brief A structure representing an object that enables to save a Tvg_Paint object into a file. -*/ -typedef struct _Tvg_Saver Tvg_Saver; - -/** -* \brief A structure representing an animation controller object. -*/ -typedef struct _Tvg_Animation Tvg_Animation; - - -/** -* \brief Enumeration specifying the engine type used for the graphics backend. For multiple backends bitwise operation is allowed. -* -* \ingroup ThorVGCapi_Initializer -*/ -typedef enum { - TVG_ENGINE_SW = (1 << 1), ///< CPU rasterizer. - TVG_ENGINE_GL = (1 << 2) ///< OpenGL rasterizer. -} Tvg_Engine; - - -/** - * \brief Enumeration specifying the result from the APIs. - */ -typedef enum { - TVG_RESULT_SUCCESS = 0, ///< The value returned in case of a correct request execution. - TVG_RESULT_INVALID_ARGUMENT, ///< The value returned in the event of a problem with the arguments given to the API - e.g. empty paths or null pointers. - TVG_RESULT_INSUFFICIENT_CONDITION, ///< The value returned in case the request cannot be processed - e.g. asking for properties of an object, which does not exist. - TVG_RESULT_FAILED_ALLOCATION, ///< The value returned in case of unsuccessful memory allocation. - TVG_RESULT_MEMORY_CORRUPTION, ///< The value returned in the event of bad memory handling - e.g. failing in pointer releasing or casting - TVG_RESULT_NOT_SUPPORTED, ///< The value returned in case of choosing unsupported options. - TVG_RESULT_UNKNOWN ///< The value returned in all other cases. -} Tvg_Result; - - -/** - * \brief Enumeration indicating the method used in the composition of two objects - the target and the source. - * - * \ingroup ThorVGCapi_Paint - */ -typedef enum { - TVG_COMPOSITE_METHOD_NONE = 0, ///< No composition is applied. - TVG_COMPOSITE_METHOD_CLIP_PATH, ///< The intersection of the source and the target is determined and only the resulting pixels from the source are rendered. - TVG_COMPOSITE_METHOD_ALPHA_MASK, ///< The pixels of the source and the target are alpha blended. As a result, only the part of the source, which intersects with the target is visible. - TVG_COMPOSITE_METHOD_INVERSE_ALPHA_MASK, ///< The pixels of the source and the complement to the target's pixels are alpha blended. As a result, only the part of the source which is not covered by the target is visible. - TVG_COMPOSITE_METHOD_LUMA_MASK, ///< The source pixels are converted to grayscale (luma value) and alpha blended with the target. As a result, only the part of the source which intersects with the target is visible. \since 0.9 - TVG_COMPOSITE_METHOD_INVERSE_LUMA_MASK ///< The source pixels are converted to grayscale (luma value) and complement to the target's pixels are alpha blended. As a result, only the part of the source which is not covered by the target is visible. \Experimental API -} Tvg_Composite_Method; - -/** - * @brief Enumeration indicates the method used for blending paint. Please refer to the respective formulas for each method. - * - * \ingroup ThorVGCapi_Paint - * - * @note Experimental API - */ -typedef enum { - TVG_BLEND_METHOD_NORMAL = 0, ///< Perform the alpha blending(default). S if (Sa == 255), otherwise (Sa * S) + (255 - Sa) * D - TVG_BLEND_METHOD_ADD, ///< Simply adds pixel values of one layer with the other. (S + D) - TVG_BLEND_METHOD_SCREEN, ///< The values of the pixels in the two layers are inverted, multiplied, and then inverted again. (S + D) - (S * D) - TVG_BLEND_METHOD_MULTIPLY, ///< Takes the RGB channel values from 0 to 255 of each pixel in the top layer and multiples them with the values for the corresponding pixel from the bottom layer. (S * D) - TVG_BLEND_METHOD_OVERLAY, ///< Combines Multiply and Screen blend modes. (2 * S * D) if (2 * D < Da), otherwise (Sa * Da) - 2 * (Da - S) * (Sa - D) - TVG_BLEND_METHOD_DIFFERENCE, ///< Subtracts the bottom layer from the top layer or the other way around, to always get a non-negative value. (S - D) if (S > D), otherwise (D - S) - TVG_BLEND_METHOD_EXCLUSION, ///< The result is twice the product of the top and bottom layers, subtracted from their sum. s + d - (2 * s * d) - TVG_BLEND_METHOD_SRCOVER, ///< Replace the bottom layer with the top layer. - TVG_BLEND_METHOD_DARKEN, ///< Creates a pixel that retains the smallest components of the top and bottom layer pixels. min(S, D) - TVG_BLEND_METHOD_LIGHTEN, ///< Only has the opposite action of Darken Only. max(S, D) - TVG_BLEND_METHOD_COLORDODGE, ///< Divides the bottom layer by the inverted top layer. D / (255 - S) - TVG_BLEND_METHOD_COLORBURN, ///< Divides the inverted bottom layer by the top layer, and then inverts the result. 255 - (255 - D) / S - TVG_BLEND_METHOD_HARDLIGHT, ///< The same as Overlay but with the color roles reversed. (2 * S * D) if (S < Sa), otherwise (Sa * Da) - 2 * (Da - S) * (Sa - D) - TVG_BLEND_METHOD_SOFTLIGHT ///< The same as Overlay but with applying pure black or white does not result in pure black or white. (1 - 2 * S) * (D ^ 2) + (2 * S * D) -} Tvg_Blend_Method; - - -/** - * \brief Enumeration indicating the ThorVG class type. - * - * \ingroup ThorVGCapi_Paint - * - * \since 0.9 - */ -typedef enum { - TVG_IDENTIFIER_UNDEF = 0, ///< Undefined type. - TVG_IDENTIFIER_SHAPE, ///< A shape type paint. - TVG_IDENTIFIER_SCENE, ///< A scene type paint. - TVG_IDENTIFIER_PICTURE, ///< A picture type paint. - TVG_IDENTIFIER_LINEAR_GRAD, ///< A linear gradient type. - TVG_IDENTIFIER_RADIAL_GRAD ///< A radial gradient type. -} Tvg_Identifier; - - -/** - * \addtogroup ThorVGCapi_Shape - * \{ - */ - -/** - * \brief Enumeration specifying the values of the path commands accepted by TVG. - * - * Not to be confused with the path commands from the svg path element (like M, L, Q, H and many others). - * TVG interprets all of them and translates to the ones from the PathCommand values. - */ -typedef enum { - TVG_PATH_COMMAND_CLOSE = 0, ///< Ends the current sub-path and connects it with its initial point - corresponds to Z command in the svg path commands. - TVG_PATH_COMMAND_MOVE_TO, ///< Sets a new initial point of the sub-path and a new current point - corresponds to M command in the svg path commands. - TVG_PATH_COMMAND_LINE_TO, ///< Draws a line from the current point to the given point and sets a new value of the current point - corresponds to L command in the svg path commands. - TVG_PATH_COMMAND_CUBIC_TO ///< Draws a cubic Bezier curve from the current point to the given point using two given control points and sets a new value of the current point - corresponds to C command in the svg path commands. -} Tvg_Path_Command; - - -/** - * \brief Enumeration determining the ending type of a stroke in the open sub-paths. - */ -typedef enum { - TVG_STROKE_CAP_SQUARE = 0, ///< The stroke is extended in both endpoints of a sub-path by a rectangle, with the width equal to the stroke width and the length equal to the half of the stroke width. For zero length sub-paths the square is rendered with the size of the stroke width. - TVG_STROKE_CAP_ROUND, ///< The stroke is extended in both endpoints of a sub-path by a half circle, with a radius equal to the half of a stroke width. For zero length sub-paths a full circle is rendered. - TVG_STROKE_CAP_BUTT ///< The stroke ends exactly at each of the two endpoints of a sub-path. For zero length sub-paths no stroke is rendered. -} Tvg_Stroke_Cap; - - -/** - * \brief Enumeration specifying how to fill the area outside the gradient bounds. - */ -typedef enum { - TVG_STROKE_JOIN_BEVEL = 0, ///< The outer corner of the joined path segments is bevelled at the join point. The triangular region of the corner is enclosed by a straight line between the outer corners of each stroke. - TVG_STROKE_JOIN_ROUND, ///< The outer corner of the joined path segments is rounded. The circular region is centered at the join point. - TVG_STROKE_JOIN_MITER ///< The outer corner of the joined path segments is spiked. The spike is created by extension beyond the join point of the outer edges of the stroke until they intersect. In case the extension goes beyond the limit, the join style is converted to the Bevel style. -} Tvg_Stroke_Join; - - -/** - * \brief Enumeration specifying how to fill the area outside the gradient bounds. - */ -typedef enum { - TVG_STROKE_FILL_PAD = 0, ///< The remaining area is filled with the closest stop color. - TVG_STROKE_FILL_REFLECT, ///< The gradient pattern is reflected outside the gradient area until the expected region is filled. - TVG_STROKE_FILL_REPEAT ///< The gradient pattern is repeated continuously beyond the gradient area until the expected region is filled. -} Tvg_Stroke_Fill; - - -/** - * \brief Enumeration specifying the algorithm used to establish which parts of the shape are treated as the inside of the shape. - */ -typedef enum { - TVG_FILL_RULE_WINDING = 0, ///< A line from the point to a location outside the shape is drawn. The intersections of the line with the path segment of the shape are counted. Starting from zero, if the path segment of the shape crosses the line clockwise, one is added, otherwise one is subtracted. If the resulting sum is non zero, the point is inside the shape. - TVG_FILL_RULE_EVEN_ODD ///< A line from the point to a location outside the shape is drawn and its intersections with the path segments of the shape are counted. If the number of intersections is an odd number, the point is inside the shape. -} Tvg_Fill_Rule; - -/** \} */ // end addtogroup ThorVGCapi_Shape - - -/*! -* \addtogroup ThorVGCapi_Gradient -* \{ -*/ - -/*! -* \brief A data structure storing the information about the color and its relative position inside the gradient bounds. -*/ -typedef struct -{ - float offset; /**< The relative position of the color. */ - uint8_t r; /**< The red color channel value in the range [0 ~ 255]. */ - uint8_t g; /**< The green color channel value in the range [0 ~ 255]. */ - uint8_t b; /**< The blue color channel value in the range [0 ~ 255]. */ - uint8_t a; /**< The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. */ -} Tvg_Color_Stop; - -/** \} */ // end addtogroup ThorVGCapi_Gradient - - -/** - * \brief A data structure representing a point in two-dimensional space. - */ -typedef struct -{ - float x, y; -} Tvg_Point; - - -/** - * \brief A data structure representing a three-dimensional matrix. - * - * The elements e11, e12, e21 and e22 represent the rotation matrix, including the scaling factor. - * The elements e13 and e23 determine the translation of the object along the x and y-axis, respectively. - * The elements e31 and e32 are set to 0, e33 is set to 1. - */ -typedef struct -{ - float e11, e12, e13; - float e21, e22, e23; - float e31, e32, e33; -} Tvg_Matrix; - - -/** -* \defgroup ThorVGCapi_Initializer Initializer -* \brief A module enabling initialization and termination of the TVG engines. -* -* \{ -*/ - -/************************************************************************/ -/* Engine API */ -/************************************************************************/ -/*! -* \brief Initializes TVG engines. -* -* TVG requires the running-engine environment. -* TVG runs its own task-scheduler for parallelizing rendering tasks efficiently. -* You can indicate the number of threads, the count of which is designated @p threads. -* In the initialization step, TVG will generate/spawn the threads as set by @p threads count. -* -* \code -* tvg_engine_init(TVG_ENGINE_SW, 0); //Initialize software renderer and use the main thread only -* \endcode -* -* \param[in] engine_method The engine types to initialize. This is relative to the Canvas types, in which it will be used. For multiple backends bitwise operation is allowed. -* - TVG_ENGINE_SW: CPU rasterizer -* - TVG_ENGINE_GL: OpenGL rasterizer (not supported yet) -* \param[in] threads The number of additional threads used to perform rendering. Zero indicates only the main thread is to be used. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error possibly with memory allocation. -* \retval TVG_RESULT_INVALID_ARGUMENT Unknown engine type. -* \retval TVG_RESULT_NOT_SUPPORTED Unsupported engine type. -* \retval TVG_RESULT_UNKNOWN Other error. -* -* \note The Initializer keeps track of the number of times it was called. Threads count is fixed at the first init() call. -* \see tvg_engine_term() -* \see Tvg_Engine -*/ -TVG_API Tvg_Result tvg_engine_init(Tvg_Engine engine_method, unsigned threads); - - -/*! -* \brief Terminates TVG engines. -* -* It should be called in case of termination of the TVG client with the same engine types as were passed when tvg_engine_init() was called. -* -* \code -* tvg_engine_init(TVG_ENGINE_SW, 0); -* //define canvas and shapes, update shapes, general rendering calls -* tvg_engine_term(TVG_ENGINE_SW); -* \endcode -* -* \param engine_method The engine types to terminate. This is relative to the Canvas types, in which it will be used. For multiple backends bitwise operation is allowed -* - TVG_ENGINE_SW: CPU rasterizer -* - TVG_ENGINE_GL: OpenGL rasterizer (not supported yet) -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION Nothing to be terminated. -* \retval TVG_RESULT_INVALID_ARGUMENT Unknown engine type. -* \retval TVG_RESULT_NOT_SUPPORTED Unsupported engine type. -* \retval TVG_RESULT_UNKNOWN An internal error. -* -* \see tvg_engine_init() -* \see Tvg_Engine -*/ -TVG_API Tvg_Result tvg_engine_term(Tvg_Engine engine_method); - - -/** \} */ // end defgroup ThorVGCapi_Initializer - - -/** -* \defgroup ThorVGCapi_Canvas Canvas -* \brief A module for managing and drawing graphical elements. -* -* A canvas is an entity responsible for drawing the target. It sets up the drawing engine and the buffer, which can be drawn on the screen. It also manages given Paint objects. -* -* \note A Canvas behavior depends on the raster engine though the final content of the buffer is expected to be identical. -* \warning The Paint objects belonging to one Canvas can't be shared among multiple Canvases. -\{ -*/ - - -/** -* \defgroup ThorVGCapi_SwCanvas SwCanvas -* \ingroup ThorVGCapi_Canvas -* -* \brief A module for rendering the graphical elements using the software engine. -* -* \{ -*/ - -/************************************************************************/ -/* SwCanvas API */ -/************************************************************************/ - -/** - * \brief Enumeration specifying the methods of Memory Pool behavior policy. - */ -typedef enum { - TVG_MEMPOOL_POLICY_DEFAULT = 0, ///< Default behavior that ThorVG is designed to. - TVG_MEMPOOL_POLICY_SHAREABLE, ///< Memory Pool is shared among canvases. - TVG_MEMPOOL_POLICY_INDIVIDUAL ///< Allocate designated memory pool that is used only by the current canvas instance. -} Tvg_Mempool_Policy; - - -/** - * \brief Enumeration specifying the methods of combining the 8-bit color channels into 32-bit color. - */ -typedef enum { - TVG_COLORSPACE_ABGR8888 = 0, ///< The channels are joined in the order: alpha, blue, green, red. Colors are alpha-premultiplied. (a << 24 | b << 16 | g << 8 | r) - TVG_COLORSPACE_ARGB8888, ///< The channels are joined in the order: alpha, red, green, blue. Colors are alpha-premultiplied. (a << 24 | r << 16 | g << 8 | b) - TVG_COLORSPACE_ABGR8888S, ///< The channels are joined in the order: alpha, blue, green, red. Colors are un-alpha-premultiplied. @since 0.13 - TVG_COLORSPACE_ARGB8888S ///< The channels are joined in the order: alpha, red, green, blue. Colors are un-alpha-premultiplied. @since 0.13 -} Tvg_Colorspace; - - -/*! -* \brief Creates a Canvas object. -* -* \code -* Tvg_Canvas *canvas = NULL; -* -* tvg_engine_init(TVG_ENGINE_SW, 4); -* canvas = tvg_swcanvas_create(); -* -* //set up the canvas buffer -* uint32_t *buffer = NULL; -* buffer = (uint32_t*) malloc(sizeof(uint32_t) * 100 * 100); -* if (!buffer) return; -* -* tvg_swcanvas_set_target(canvas, buffer, 100, 100, 100, TVG_COLORSPACE_ARGB8888); -* -* //set up paints and add them into the canvas before drawing it -* -* tvg_canvas_destroy(canvas); -* tvg_engine_term(TVG_ENGINE_SW); -* \endcode -* -* \return A new Tvg_Canvas object. -*/ -TVG_API Tvg_Canvas* tvg_swcanvas_create(void); - - -/*! -* \brief Sets the buffer used in the rasterization process and defines the used colorspace. -* -* For optimisation reasons TVG does not allocate memory for the output buffer on its own. -* The buffer of a desirable size should be allocated and owned by the caller. -* -* \param[in] canvas The Tvg_Canvas object managing the @p buffer. -* \param[in] buffer A pointer to the allocated memory block of the size @p stride x @p h. -* \param[in] stride The stride of the raster image - in most cases same value as @p w. -* \param[in] w The width of the raster image. -* \param[in] h The height of the raster image. -* \param[in] cs The colorspace value defining the way the 32-bits colors should be read/written. -* - TVG_COLORSPACE_ABGR8888 -* - TVG_COLORSPACE_ARGB8888 -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_MEMORY_CORRUPTION Casting in the internal function implementation failed. -* \retval TVG_RESULT_INVALID_ARGUMENTS An invalid canvas or buffer pointer passed or one of the @p stride, @p w or @p h being zero. -* \retval TVG_RESULT_NOT_SUPPORTED The software engine is not supported. -* -* \warning Do not access @p buffer during tvg_canvas_draw() - tvg_canvas_sync(). It should not be accessed while the engine is writing on it. -* -* \see Tvg_Colorspace -*/ -TVG_API Tvg_Result tvg_swcanvas_set_target(Tvg_Canvas* canvas, uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h, Tvg_Colorspace cs); - - -/*! -* \brief Sets the software engine memory pool behavior policy. -* -* ThorVG draws a lot of shapes, it allocates/deallocates a few chunk of memory -* while processing rendering. It internally uses one shared memory pool -* which can be reused among the canvases in order to avoid memory overhead. -* -* Thus ThorVG suggests using a memory pool policy to satisfy user demands, -* if it needs to guarantee the thread-safety of the internal data access. -* -* \param[in] canvas The Tvg_Canvas object of which the Memory Pool behavior is to be specified. -* \param[in] policy The method specifying the Memory Pool behavior. The default value is @c TVG_MEMPOOL_POLICY_DEFAULT. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENTS An invalid canvas pointer passed. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION The canvas contains some paints already. -* \retval TVG_RESULT_NOT_SUPPORTED The software engine is not supported. -* -* \note When @c policy is set as @c TVG_MEMPOOL_POLICY_INDIVIDUAL, the current instance of canvas uses its own individual -* memory data, which is not shared with others. This is necessary when the canvas is accessed on a worker-thread. -* -* \warning It's not allowed after pushing any paints. -*/ -TVG_API Tvg_Result tvg_swcanvas_set_mempool(Tvg_Canvas* canvas, Tvg_Mempool_Policy policy); - -/** \} */ // end defgroup ThorVGCapi_SwCanvas - - -/************************************************************************/ -/* Common Canvas API */ -/************************************************************************/ -/*! -* \brief Clears the canvas internal data, releases all paints stored by the canvas and destroys the canvas object itself. -* -* \code -* static Tvg_Canvas *canvas = NULL; -* static uint32_t *buffer = NULL; -* -* static void _init() { -* canvas = tvg_swcanvas_create(); -* buffer = (uint32_t*) malloc(sizeof(uint32_t) * 100 * 100); -* tvg_swcanvas_set_target(canvas, buffer, 100, 100, 100, TVG_COLORSPACE_ARGB8888); -* } -* -* //a task called from main function in a loop -* static void _job(const int cmd) { -* //define a valid rectangle shape -* switch (cmd) { -* case CMD_EXIT: return 0; -* case CMD_ADD_RECT: -* tvg_canvas_push(canvas, rect); -* break; -* case CMD_DEL_RECT: -* tvg_paint_del(rect); -* //now to safely delete Tvg_Canvas, tvg_canvas_clear() API have to be used -* break; -* default: -* break; -* } -* } -* -* int main(int argc, char **argv) { -* int cmd = 0; -* int stop = 1; -* -* tvg_engine_init(TVG_ENGINE_SW, 4); -* -* while (stop) { -* //wait for a command e.g. from a console -* stop = _job(cmd); -* } -* tvg_canvas_clear(canvas, false); -* tvg_canvas_destroy(canvas); -* tvg_engine_term(TVG_ENGINE_SW); -* return 0; -* } -* -* tvg_canvas_destroy(canvas); -* tvg_engine_term(TVG_ENGINE_SW) -* \endcode -* -* \param[in] canvas The Tvg_Canvas object to be destroyed. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer to the Tvg_Canvas object is passed. -* -* \note If the paints from the canvas should not be released, the tvg_canvas_clear() with a @c free argument value set to @c false should be called. -* Please be aware that in such a case TVG is not responsible for the paints release anymore and it has to be done manually in order to avoid memory leaks. -* -* \see tvg_paint_del(), tvg_canvas_clear() -*/ -TVG_API Tvg_Result tvg_canvas_destroy(Tvg_Canvas* canvas); - - -/*! -* \brief Inserts a drawing element into the canvas using a Tvg_Paint object. -* -* \param[in] canvas The Tvg_Canvas object managing the @p paint. -* \param[in] paint The Tvg_Paint object to be drawn. -* -* Only the paints pushed into the canvas will be drawing targets. -* They are retained by the canvas until you call tvg_canvas_clear(). -* If you know the number of the pushed objects in advance, please call tvg_canvas_reserve(). -* -* \return Tvg_Result return values: -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION An internal error. -* -* \note The rendering order of the paints is the same as the order as they were pushed. Consider sorting the paints before pushing them if you intend to use layering. -* \see tvg_canvas_clear() -*/ -TVG_API Tvg_Result tvg_canvas_push(Tvg_Canvas* canvas, Tvg_Paint* paint); - - -/*! -* \brief Reserves a memory block where the objects pushed into a canvas are stored. -* -* If the number of Tvg_Paints to be stored in a canvas is known in advance, calling this function reduces the multiple -* memory allocations thus improves the performance. -* -* \code -* Tvg_Canvas *canvas = NULL; -* -* tvg_engine_init(TVG_ENGINE_SW, 4); -* canvas = tvg_swcanvas_create(); -* -* uint32_t *buffer = NULL; -* buffer = (uint32_t*) malloc(sizeof(uint32_t) * 100 * 100); -* if (!buffer) return; -* -* tvg_swcanvas_set_target(canvas, buffer, 100, 100, 100, TVG_COLORSPACE_ARGB8888); -* -* tvg_canvas_destroy(canvas); -* tvg_engine_term(TVG_ENGINE_SW) -* \endcode -* -* \param[in] canvas The Tvg_Canvas object managing the reserved memory. -* \param[in] n The number of objects for which the memory is to be reserved. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Canvas pointer. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with memory allocation. -*/ -TVG_DEPRECATED TVG_API Tvg_Result tvg_canvas_reserve(Tvg_Canvas* canvas, uint32_t n); - - -/*! -* \brief Sets the total number of the paints pushed into the canvas to be zero. -* Tvg_Paint objects stored in the canvas are released if @p free is set to @c true, otherwise the memory is not deallocated and -* all paints should be released manually in order to avoid memory leaks. -* -* \param[in] canvas The Tvg_Canvas object to be cleared. -* \param[in] free If @c true the memory occupied by paints is deallocated, otherwise it is not. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Canvas pointer. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION An internal error. -* -* \warning Please use the @p free argument only when you know how it works, otherwise it's not recommended. -* -* \see tvg_canvas_destroy() -*/ -TVG_API Tvg_Result tvg_canvas_clear(Tvg_Canvas* canvas, bool free); - - -/*! -* \brief Updates all paints in a canvas. -* -* Should be called before drawing in order to prepare paints for the rendering. -* -* \code -* //A frame drawing example. Thread safety and events implementation is skipped to show only TVG code. -* -* static Tvg_Canvas *canvas = NULL; -* static Tvg_Paint *rect = NULL; -* -* int _frame_render(void) { -* tvg_canvas_update(canvas); -* tvg_canvas_draw(canvas); -* tvg_canvas_sync(canvas); -* } -* -* //event handler from your code or third party library -* void _event_handler(event *event_data) { -* if (!event_data) return NULL; -* switch(event_data.type) { -* case EVENT_RECT_ADD: -* if (!rect) { -* tvg_shape_append_rect(rect, 10, 10, 50, 50, 0, 0); -* tvg_shape_set_stroke_width(rect, 1.0f); -* tvg_shape_set_stroke_color(rect, 255, 0, 0, 255); -* tvg_canvas_push(canvas, rect); -* } -* break; -* case EVENT_RECT_MOVE: -* if (rect) tvg_paint_translate(rect, 10.0, 10.0); -* break; -* default: -* break; -* } -* } -* -* int main(int argc, char **argv) { -* //example handler from your code or third party lib -* event_handler_add(handler, _event_handler); -* -* //create frame rendering process which calls _frame_render() function. -* app_loop_begin(_frame_render); -* app_loop_finish(); -* cleanup(); -* } -* \endcode -* -* \param[in] canvas The Tvg_Canvas object to be updated. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Canvas pointer. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION An internal error. -* -* \see tvg_canvas_update_paint() -*/ -TVG_API Tvg_Result tvg_canvas_update(Tvg_Canvas* canvas); - - -/*! -* \brief Updates the given Tvg_Paint object from the canvas before the rendering. -* -* If a client application using the TVG library does not update the entire canvas with tvg_canvas_update() in the frame -* rendering process, Tvg_Paint objects previously added to the canvas should be updated manually with this function. -* -* \param[in] canvas The Tvg_Canvas object to which the @p paint belongs. -* \param[in] paint The Tvg_Paint object to be updated. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. -* -* \see tvg_canvas_update() -*/ -TVG_API Tvg_Result tvg_canvas_update_paint(Tvg_Canvas* canvas, Tvg_Paint* paint); - - -/*! -* \brief Requests the canvas to draw the Tvg_Paint objects. -* -* All paints from the given canvas will be rasterized to the buffer. -* -* \param[in] canvas The Tvg_Canvas object containing elements to be drawn. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Canvas pointer. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION An internal error. -* -* \note Drawing can be asynchronous based on the assigned thread number. To guarantee the drawing is done, call tvg_canvas_sync() afterwards. -* \see tvg_canvas_sync() -*/ -TVG_API Tvg_Result tvg_canvas_draw(Tvg_Canvas* canvas); - - -/*! -* \brief Guarantees that the drawing process is finished. -* -* Since the canvas rendering can be performed asynchronously, it should be called after the tvg_canvas_draw(). -* -* \param[in] canvas The Tvg_Canvas object containing elements which were drawn. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Canvas pointer. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION An internal error. -* -* \see tvg_canvas_draw() -*/ -TVG_API Tvg_Result tvg_canvas_sync(Tvg_Canvas* canvas); - - -/*! -* \brief Sets the drawing region in the canvas. -* -* This function defines the rectangular area of the canvas that will be used for drawing operations. -* The specified viewport is used to clip the rendering output to the boundaries of the rectangle. -* -* \param[in] canvas The Tvg_Canvas object containing elements which were drawn. -* \param[in] x The x-coordinate of the upper-left corner of the rectangle. -* \param[in] y The y-coordinate of the upper-left corner of the rectangle. -* \param[in] w The width of the rectangle. -* \param[in] h The height of the rectangle. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION An internal error. -* -* \warning It's not allowed to change the viewport during tvg_canvas_update() - tvg_canvas_sync() or tvg_canvas_push() - tvg_canvas_sync(). -* -* \note When resetting the target, the viewport will also be reset to the target size. -* \note Experimental API -* \see tvg_swcanvas_set_target() -*/ -TVG_API Tvg_Result tvg_canvas_set_viewport(Tvg_Canvas* canvas, int32_t x, int32_t y, int32_t w, int32_t h); - -/** \} */ // end defgroup ThorVGCapi_Canvas - - -/** -* \defgroup ThorVGCapi_Paint Paint -* \brief A module for managing graphical elements. It enables duplication, transformation and composition. -* -* \{ -*/ - -/************************************************************************/ -/* Paint API */ -/************************************************************************/ -/*! -* \brief Releases the given Tvg_Paint object. -* -* \code -* //example of cleanup function -* Tvg_Paint *rect = NULL; //rectangle shape added in other function -* -* //rectangle delete API -* int rectangle_delete(void) { -* if (rect) tvg_paint_del(rect); -* rect = NULL; -* } -* -* int cleanup(void) { -* tvg_canvas_clear(canvas, false); -* tvg_canvas_destroy(canvas); -* canvas = NULL; -* } -* \endcode -* -* \param[in] paint The Tvg_Paint object to be released. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* -* \warning If this function is used, tvg_canvas_clear() with the @c free argument value set to @c false should be used in order to avoid unexpected behaviours. -* -* \see tvg_canvas_clear(), tvg_canvas_destroy() -*/ -TVG_API Tvg_Result tvg_paint_del(Tvg_Paint* paint); - - -/*! -* \brief Scales the given Tvg_Paint object by the given factor. -* -* \param[in] paint The Tvg_Paint object to be scaled. -* \param[in] factor The value of the scaling factor. The default value is 1. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with memory allocation. -*/ -TVG_API Tvg_Result tvg_paint_scale(Tvg_Paint* paint, float factor); - - -/*! -* \brief Rotates the given Tvg_Paint by the given angle. -* -* The angle in measured clockwise from the horizontal axis. -* The rotational axis passes through the point on the object with zero coordinates. -* -* \param[in] paint The Tvg_Paint object to be rotated. -* \param[in] degree The value of the rotation angle in degrees. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with memory allocation. -*/ -TVG_API Tvg_Result tvg_paint_rotate(Tvg_Paint* paint, float degree); - - -/*! -* \brief Moves the given Tvg_Paint in a two-dimensional space. -* -* The origin of the coordinate system is in the upper left corner of the canvas. -* The horizontal and vertical axes point to the right and down, respectively. -* -* \param[in] paint The Tvg_Paint object to be shifted. -* \param[in] x The value of the horizontal shift. -* \param[in] y The value of the vertical shift. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with memory allocation. -*/ -TVG_API Tvg_Result tvg_paint_translate(Tvg_Paint* paint, float x, float y); - - -/*! -* \brief Transforms the given Tvg_Paint using the augmented transformation matrix. -* -* The augmented matrix of the transformation is expected to be given. -* -* \param[in] paint The Tvg_Paint object to be transformed. -* \param[in] m The 3x3 augmented matrix. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr is passed as the argument. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with memory allocation. -*/ -TVG_API Tvg_Result tvg_paint_set_transform(Tvg_Paint* paint, const Tvg_Matrix* m); - - -/*! -* \brief Gets the matrix of the affine transformation of the given Tvg_Paint object. -* -* In case no transformation was applied, the identity matrix is returned. -* -* \param[in] paint The Tvg_Paint object of which to get the transformation matrix. -* \param[out] m The 3x3 augmented matrix. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr is passed as the argument. -*/ -TVG_API Tvg_Result tvg_paint_get_transform(Tvg_Paint* paint, Tvg_Matrix* m); - - -/*! -* \brief Sets the opacity of the given Tvg_Paint. -* -* \param[in] paint The Tvg_Paint object of which the opacity value is to be set. -* \param[in] opacity The opacity value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* -* \note Setting the opacity with this API may require multiple renderings using a composition. It is recommended to avoid changing the opacity if possible. -*/ -TVG_API Tvg_Result tvg_paint_set_opacity(Tvg_Paint* paint, uint8_t opacity); - - -/*! -* \brief Gets the opacity of the given Tvg_Paint. -* -* \param[in] paint The Tvg_Paint object of which to get the opacity value. -* \param[out] opacity The opacity value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. -*/ -TVG_API Tvg_Result tvg_paint_get_opacity(const Tvg_Paint* paint, uint8_t* opacity); - - -/*! -* \brief Duplicates the given Tvg_Paint object. -* -* Creates a new object and sets its all properties as in the original object. -* -* \param[in] paint The Tvg_Paint object to be copied. -* -* \return A copied Tvg_Paint object if succeed, @c nullptr otherwise. -*/ -TVG_API Tvg_Paint* tvg_paint_duplicate(Tvg_Paint* paint); - - -/*! -* \brief Gets the axis-aligned bounding box of the Tvg_Paint object. -* -* \param[in] paint The Tvg_Paint object of which to get the bounds. -* \param[out] x The x coordinate of the upper left corner of the object. -* \param[out] y The y coordinate of the upper left corner of the object. -* \param[out] w The width of the object. -* \param[out] h The height of the object. -* \param[in] transformed If @c true, the transformation of the paint is taken into account, otherwise it isn't. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION Other errors. -* -* \note The bounding box doesn't indicate the actual drawing region. It's the smallest rectangle that encloses the object. -*/ -TVG_API Tvg_Result tvg_paint_get_bounds(const Tvg_Paint* paint, float* x, float* y, float* w, float* h, bool transformed); - - -/*! -* \brief Sets the composition target object and the composition method. -* -* \param[in] paint The source object of the composition. -* \param[in] target The target object of the composition. -* \param[in] method The method used to composite the source object with the target. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid @p paint or @p target object or the @p method equal to TVG_COMPOSITE_METHOD_NONE. -*/ -TVG_API Tvg_Result tvg_paint_set_composite_method(Tvg_Paint* paint, Tvg_Paint* target, Tvg_Composite_Method method); - - -/** -* \brief Gets the composition target object and the composition method. -* -* \param[in] paint The source object of the composition. -* \param[out] target The target object of the composition. -* \param[out] method The method used to composite the source object with the target. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr is passed as the argument. -*/ -TVG_API Tvg_Result tvg_paint_get_composite_method(const Tvg_Paint* paint, const Tvg_Paint** target, Tvg_Composite_Method* method); - - -/** -* \brief Gets the unique id value of the paint instance indicating the instance type. -* -* \param[in] paint The Tvg_Paint object of which to get the identifier value. -* \param[out] identifier The unique identifier of the paint instance type. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. -* -* \since 0.9 -*/ -TVG_API Tvg_Result tvg_paint_get_identifier(const Tvg_Paint* paint, Tvg_Identifier* identifier); - - -/** - * @brief Sets the blending method for the paint object. - * - * The blending feature allows you to combine colors to create visually appealing effects, including transparency, lighting, shading, and color mixing, among others. - * its process involves the combination of colors or images from the source paint object with the destination (the lower layer image) using blending operations. - * The blending operation is determined by the chosen @p BlendMethod, which specifies how the colors or images are combined. - * - * \param[in] paint The Tvg_Paint object of which to get the identifier value. - * \param[in] method The blending method to be set. - * - * \return Tvg_Result enumeration. - * \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. - * - * @note Experimental API - */ -TVG_API Tvg_Result tvg_paint_set_blend_method(const Tvg_Paint* paint, Tvg_Blend_Method method); - - -/** - * @brief Gets the blending method for the paint object. - * - * The blending feature allows you to combine colors to create visually appealing effects, including transparency, lighting, shading, and color mixing, among others. - * its process involves the combination of colors or images from the source paint object with the destination (the lower layer image) using blending operations. - * The blending operation is determined by the chosen @p BlendMethod, which specifies how the colors or images are combined. - * - * \param[in] paint The Tvg_Paint object of which to get the identifier value. - * \param[out] method The blending method of the paint. - * - * \return Tvg_Result enumeration. - * \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. - * - * @note Experimental API - */ -TVG_API Tvg_Result tvg_paint_get_blend_method(const Tvg_Paint* paint, Tvg_Blend_Method* method); - - -/** \} */ // end defgroup ThorVGCapi_Paint - -/** -* \defgroup ThorVGCapi_Shape Shape -* -* \brief A module for managing two-dimensional figures and their properties. -* -* A shape has three major properties: shape outline, stroking, filling. The outline in the shape is retained as the path. -* Path can be composed by accumulating primitive commands such as tvg_shape_move_to(), tvg_shape_line_to(), tvg_shape_cubic_to() or complete shape interfaces such as tvg_shape_append_rect(), tvg_shape_append_circle(), etc. -* Path can consists of sub-paths. One sub-path is determined by a close command. -* -* The stroke of a shape is an optional property in case the shape needs to be represented with/without the outline borders. -* It's efficient since the shape path and the stroking path can be shared with each other. It's also convenient when controlling both in one context. -* -* \{ -*/ - -/************************************************************************/ -/* Shape API */ -/************************************************************************/ -/*! -* \brief Creates a new shape object. -* -* \return A new shape object. -*/ -TVG_API Tvg_Paint* tvg_shape_new(void); - - -/*! -* \brief Resets the shape path properties. -* -* The color, the fill and the stroke properties are retained. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* -* \note The memory, where the path data is stored, is not deallocated at this stage for caching effect. -*/ -TVG_API Tvg_Result tvg_shape_reset(Tvg_Paint* paint); - - -/*! -* \brief Sets the initial point of the sub-path. -* -* The value of the current point is set to the given point. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] x The horizontal coordinate of the initial point of the sub-path. -* \param[in] y The vertical coordinate of the initial point of the sub-path. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -*/ -TVG_API Tvg_Result tvg_shape_move_to(Tvg_Paint* paint, float x, float y); - - -/*! -* \brief Adds a new point to the sub-path, which results in drawing a line from the current point to the given end-point. -* -* The value of the current point is set to the given end-point. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] x The horizontal coordinate of the end-point of the line. -* \param[in] y The vertical coordinate of the end-point of the line. - -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* -* \note In case this is the first command in the path, it corresponds to the tvg_shape_move_to() call. -*/ -TVG_API Tvg_Result tvg_shape_line_to(Tvg_Paint* paint, float x, float y); - - -/*! -* \brief Adds new points to the sub-path, which results in drawing a cubic Bezier curve. -* -* The Bezier curve starts at the current point and ends at the given end-point (@p x, @p y). Two control points (@p cx1, @p cy1) and (@p cx2, @p cy2) are used to determine the shape of the curve. -* The value of the current point is set to the given end-point. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] cx1 The horizontal coordinate of the 1st control point. -* \param[in] cy1 The vertical coordinate of the 1st control point. -* \param[in] cx2 The horizontal coordinate of the 2nd control point. -* \param[in] cy2 The vertical coordinate of the 2nd control point. -* \param[in] x The horizontal coordinate of the endpoint of the curve. -* \param[in] y The vertical coordinate of the endpoint of the curve. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* -* \note In case this is the first command in the path, no data from the path are rendered. -*/ -TVG_API Tvg_Result tvg_shape_cubic_to(Tvg_Paint* paint, float cx1, float cy1, float cx2, float cy2, float x, float y); - - -/*! -* \brief Closes the current sub-path by drawing a line from the current point to the initial point of the sub-path. -* -* The value of the current point is set to the initial point of the closed sub-path. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* -* \note In case the sub-path does not contain any points, this function has no effect. -*/ -TVG_API Tvg_Result tvg_shape_close(Tvg_Paint* paint); - - -/*! -* \brief Appends a rectangle to the path. -* -* The rectangle with rounded corners can be achieved by setting non-zero values to @p rx and @p ry arguments. -* The @p rx and @p ry values specify the radii of the ellipse defining the rounding of the corners. -* -* The position of the rectangle is specified by the coordinates of its upper left corner - @p x and @p y arguments. -* -* The rectangle is treated as a new sub-path - it is not connected with the previous sub-path. -* -* The value of the current point is set to (@p x + @p rx, @p y) - in case @p rx is greater -* than @p w/2 the current point is set to (@p x + @p w/2, @p y) -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] x The horizontal coordinate of the upper left corner of the rectangle. -* \param[in] y The vertical coordinate of the upper left corner of the rectangle. -* \param[in] w The width of the rectangle. -* \param[in] h The height of the rectangle. -* \param[in] rx The x-axis radius of the ellipse defining the rounded corners of the rectangle. -* \param[in] ry The y-axis radius of the ellipse defining the rounded corners of the rectangle. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* -& \note For @p rx and @p ry greater than or equal to the half of @p w and the half of @p h, respectively, the shape become an ellipse. -*/ -TVG_API Tvg_Result tvg_shape_append_rect(Tvg_Paint* paint, float x, float y, float w, float h, float rx, float ry); - - -/*! -* \brief Appends an ellipse to the path. -* -* The position of the ellipse is specified by the coordinates of its center - @p cx and @p cy arguments. -* -* The ellipse is treated as a new sub-path - it is not connected with the previous sub-path. -* -* The value of the current point is set to (@p cx, @p cy - @p ry). -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] cx The horizontal coordinate of the center of the ellipse. -* \param[in] cy The vertical coordinate of the center of the ellipse. -* \param[in] rx The x-axis radius of the ellipse. -* \param[in] ry The y-axis radius of the ellipse. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -*/ -TVG_API Tvg_Result tvg_shape_append_circle(Tvg_Paint* paint, float cx, float cy, float rx, float ry); - - -/*! -* \brief Appends a circular arc to the path. -* -* The arc is treated as a new sub-path - it is not connected with the previous sub-path. -* The current point value is set to the end-point of the arc in case @p pie is @c false, and to the center of the arc otherwise. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] cx The horizontal coordinate of the center of the arc. -* \param[in] cy The vertical coordinate of the center of the arc. -* \param[in] radius The radius of the arc. -* \param[in] startAngle The start angle of the arc given in degrees, measured counter-clockwise from the horizontal line. -* \param[in] sweep The central angle of the arc given in degrees, measured counter-clockwise from @p startAngle. -* \param[in] pie Specifies whether to draw radii from the arc's center to both of its end-point - drawn if @c true. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* -* \note Setting @p sweep value greater than 360 degrees, is equivalent to calling tvg_shape_append_circle(paint, cx, cy, radius, radius). -*/ -TVG_API Tvg_Result tvg_shape_append_arc(Tvg_Paint* paint, float cx, float cy, float radius, float startAngle, float sweep, uint8_t pie); - - -/*! -* \brief Appends a given sub-path to the path. -* -* The current point value is set to the last point from the sub-path. -* For each command from the @p cmds array, an appropriate number of points in @p pts array should be specified. -* If the number of points in the @p pts array is different than the number required by the @p cmds array, the shape with this sub-path will not be displayed on the screen. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] cmds The array of the commands in the sub-path. -* \param[in] cmdCnt The length of the @p cmds array. -* \param[in] pts The array of the two-dimensional points. -* \param[in] ptsCnt The length of the @p pts array. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument or @p cmdCnt or @p ptsCnt equal to zero. -*/ -TVG_API Tvg_Result tvg_shape_append_path(Tvg_Paint* paint, const Tvg_Path_Command* cmds, uint32_t cmdCnt, const Tvg_Point* pts, uint32_t ptsCnt); - - -/*! -* \brief Gets the points values of the path. -* -* The function does not allocate any data, it operates on internal memory. There is no need to free the @p pts array. -* -* \code -* Tvg_Shape *shape = tvg_shape_new(); -* Tvg_Point *coords = NULL; -* uint32_t len = 0; -* -* tvg_shape_append_circle(shape, 10, 10, 50, 50); -* tvg_shape_get_path_coords(shape, (const Tvg_Point**)&coords, &len); -* //TVG approximates a circle by four Bezier curves. In the example above the coords array stores their coordinates. -* \endcode -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[out] pts The pointer to the array of the two-dimensional points from the path. -* \param[out] cnt The length of the @p pts array. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. -*/ -TVG_API Tvg_Result tvg_shape_get_path_coords(const Tvg_Paint* paint, const Tvg_Point** pts, uint32_t* cnt); - - -/*! -* \brief Gets the commands data of the path. -* -* The function does not allocate any data. There is no need to free the @p cmds array. -* -* \code -* Tvg_Shape *shape = tvg_shape_new(); -* Tvg_Path_Command *cmds = NULL; -* uint32_t len = 0; -* -* tvg_shape_append_circle(shape, 10, 10, 50, 50); -* tvg_shape_get_path_commands(shape, (const Tvg_Path_Command**)&cmds, &len); -* //TVG approximates a circle by four Bezier curves. In the example above the cmds array stores the commands of the path data. -* \endcode -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[out] cmds The pointer to the array of the commands from the path. -* \param[out] cnt The length of the @p cmds array. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. -*/ -TVG_API Tvg_Result tvg_shape_get_path_commands(const Tvg_Paint* paint, const Tvg_Path_Command** cmds, uint32_t* cnt); - - -/*! -* \brief Sets the stroke width for all of the figures from the @p paint. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] width The width of the stroke. The default value is 0. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. -*/ -TVG_API Tvg_Result tvg_shape_set_stroke_width(Tvg_Paint* paint, float width); - - -/*! -* \brief Gets the shape's stroke width. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[out] width The stroke width. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. -*/ -TVG_API Tvg_Result tvg_shape_get_stroke_width(const Tvg_Paint* paint, float* width); - - -/*! -* \brief Sets the shape's stroke color. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] r The red color channel value in the range [0 ~ 255]. The default value is 0. -* \param[in] g The green color channel value in the range [0 ~ 255]. The default value is 0. -* \param[in] b The blue color channel value in the range [0 ~ 255]. The default value is 0. -* \param[in] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. -* -* \note Either a solid color or a gradient fill is applied, depending on what was set as last. -*/ -TVG_API Tvg_Result tvg_shape_set_stroke_color(Tvg_Paint* paint, uint8_t r, uint8_t g, uint8_t b, uint8_t a); - - -/*! -* \brief Gets the shape's stroke color. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[out] r The red color channel value in the range [0 ~ 255]. The default value is 0. -* \param[out] g The green color channel value in the range [0 ~ 255]. The default value is 0. -* \param[out] b The blue color channel value in the range [0 ~ 255]. The default value is 0. -* \param[out] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION No stroke was set. -*/ -TVG_API Tvg_Result tvg_shape_get_stroke_color(const Tvg_Paint* paint, uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a); - - -/*! -* \brief Sets the linear gradient fill of the stroke for all of the figures from the path. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] grad The linear gradient fill. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. -* \retval TVG_RESULT_MEMORY_CORRUPTION An invalid Tvg_Gradient pointer. -* -* \note Either a solid color or a gradient fill is applied, depending on what was set as last. -*/ -TVG_API Tvg_Result tvg_shape_set_stroke_linear_gradient(Tvg_Paint* paint, Tvg_Gradient* grad); - - -/*! -* \brief Sets the radial gradient fill of the stroke for all of the figures from the path. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] grad The radial gradient fill. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. -* \retval TVG_RESULT_MEMORY_CORRUPTION An invalid Tvg_Gradient pointer. -* -* \note Either a solid color or a gradient fill is applied, depending on what was set as last. -*/ -TVG_API Tvg_Result tvg_shape_set_stroke_radial_gradient(Tvg_Paint* paint, Tvg_Gradient* grad); - - -/*! -* \brief Gets the gradient fill of the shape's stroke. -* -* The function does not allocate any memory. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[out] grad The gradient fill. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. -*/ -TVG_API Tvg_Result tvg_shape_get_stroke_gradient(const Tvg_Paint* paint, Tvg_Gradient** grad); - - -/*! -* \brief Sets the shape's stroke dash pattern. -* -* \code -* //dash pattern examples -* float dashPattern[2] = {20, 10}; // -- -- -- -* float dashPattern[2] = {40, 20}; // ---- ---- ---- -* float dashPattern[4] = {10, 20, 30, 40} // - --- - --- -* \endcode -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] dashPattern The array of consecutive pair values of the dash length and the gap length. -* \param[in] cnt The size of the @p dashPattern array. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument and @p cnt > 0, the given length of the array is less than two or any of the @p dashPattern values is zero or less. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. -* -* \note To reset the stroke dash pattern, pass @c nullptr to @p dashPattern and zero to @p cnt. -*/ -TVG_API Tvg_Result tvg_shape_set_stroke_dash(Tvg_Paint* paint, const float* dashPattern, uint32_t cnt); - - -/*! -* \brief Gets the dash pattern of the stroke. -* -* The function does not allocate any memory. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[out] dashPattern The array of consecutive pair values of the dash length and the gap length. -* \param[out] cnt The size of the @p dashPattern array. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. -*/ -TVG_API Tvg_Result tvg_shape_get_stroke_dash(const Tvg_Paint* paint, const float** dashPattern, uint32_t* cnt); - - -/*! -* \brief Sets the cap style used for stroking the path. -* -* The cap style specifies the shape to be used at the end of the open stroked sub-paths. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] cap The cap style value. The default value is @c TVG_STROKE_CAP_SQUARE. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. -*/ -TVG_API Tvg_Result tvg_shape_set_stroke_cap(Tvg_Paint* paint, Tvg_Stroke_Cap cap); - - -/*! -* \brief Gets the stroke cap style used for stroking the path. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[out] cap The cap style value. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. -*/ -TVG_API Tvg_Result tvg_shape_get_stroke_cap(const Tvg_Paint* paint, Tvg_Stroke_Cap* cap); - - -/*! -* \brief Sets the join style for stroked path segments. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] join The join style value. The default value is @c TVG_STROKE_JOIN_BEVEL. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. -*/ -TVG_API Tvg_Result tvg_shape_set_stroke_join(Tvg_Paint* paint, Tvg_Stroke_Join join); - - -/*! -* \brief The function gets the stroke join method -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[out] join The join style value. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. -*/ -TVG_API Tvg_Result tvg_shape_get_stroke_join(const Tvg_Paint* paint, Tvg_Stroke_Join* join); - - -/*! -* \brief Sets the stroke miterlimit. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] miterlimit The miterlimit imposes a limit on the extent of the stroke join when the @c TVG_STROKE_JOIN_MITER join style is set. The default value is 4. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_NOT_SUPPORTED Unsupported value. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. -* -* \since 0.11 -*/ -TVG_API Tvg_Result tvg_shape_set_stroke_miterlimit(Tvg_Paint* paint, float miterlimit); - - -/*! -* \brief The function gets the stroke miterlimit. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[out] miterlimit The stroke miterlimit. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. -* -* \since 0.11 -*/ -TVG_API Tvg_Result tvg_shape_get_stroke_miterlimit(const Tvg_Paint* paint, float* miterlimit); - - -/*! -* \brief Sets the shape's solid color. -* -* The parts of the shape defined as inner are colored. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] r The red color channel value in the range [0 ~ 255]. The default value is 0. -* \param[in] g The green color channel value in the range [0 ~ 255]. The default value is 0. -* \param[in] b The blue color channel value in the range [0 ~ 255]. The default value is 0. -* \param[in] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. The default value is 0. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* -* \note Either a solid color or a gradient fill is applied, depending on what was set as last. -* \see tvg_shape_set_fill_rule() -*/ -TVG_API Tvg_Result tvg_shape_set_fill_color(Tvg_Paint* paint, uint8_t r, uint8_t g, uint8_t b, uint8_t a); - - -/*! -* \brief Gets the shape's solid color. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[out] r The red color channel value in the range [0 ~ 255]. The default value is 0. -* \param[out] g The green color channel value in the range [0 ~ 255]. The default value is 0. -* \param[out] b The blue color channel value in the range [0 ~ 255]. The default value is 0. -* \param[out] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. The default value is 0. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -*/ -TVG_API Tvg_Result tvg_shape_get_fill_color(const Tvg_Paint* paint, uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a); - - -/*! -* \brief Sets the shape's fill rule. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] rule The fill rule value. The default value is @c TVG_FILL_RULE_WINDING. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -*/ -TVG_API Tvg_Result tvg_shape_set_fill_rule(Tvg_Paint* paint, Tvg_Fill_Rule rule); - - -/*! -* \brief Gets the shape's fill rule. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[out] rule shape's fill rule -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. -*/ -TVG_API Tvg_Result tvg_shape_get_fill_rule(const Tvg_Paint* paint, Tvg_Fill_Rule* rule); - - -/*! -* \brief Sets the rendering order of the stroke and the fill. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] strokeFirst If @c true the stroke is rendered before the fill, otherwise the stroke is rendered as the second one (the default option). -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. -* -* \since 0.10 -*/ -TVG_API Tvg_Result tvg_shape_set_paint_order(Tvg_Paint* paint, bool strokeFirst); - - -/*! -* \brief Sets the linear gradient fill for all of the figures from the path. -* -* The parts of the shape defined as inner are filled. -* -* \code -* Tvg_Gradient* grad = tvg_linear_gradient_new(); -* tvg_linear_gradient_set(grad, 700, 700, 800, 800); -* Tvg_Color_Stop color_stops[4] = -* { -* {0.0 , 0, 0, 0, 255}, -* {0.25, 255, 0, 0, 255}, -* {0.5 , 0, 255, 0, 255}, -* {1.0 , 0, 0, 255, 255} -* }; -* tvg_gradient_set_color_stops(grad, color_stops, 4); -* tvg_shape_set_linear_gradient(shape, grad); -* \endcode -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] grad The linear gradient fill. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_MEMORY_CORRUPTION An invalid Tvg_Gradient pointer. -* -* \note Either a solid color or a gradient fill is applied, depending on what was set as last. -* \see tvg_shape_set_fill_rule() -*/ -TVG_API Tvg_Result tvg_shape_set_linear_gradient(Tvg_Paint* paint, Tvg_Gradient* grad); - - -/*! -* \brief Sets the radial gradient fill for all of the figures from the path. -* -* The parts of the shape defined as inner are filled. -* -* \code -* Tvg_Gradient* grad = tvg_radial_gradient_new(); -* tvg_radial_gradient_set(grad, 550, 550, 50); -* Tvg_Color_Stop color_stops[4] = -* { -* {0.0 , 0, 0, 0, 255}, -* {0.25, 255, 0, 0, 255}, -* {0.5 , 0, 255, 0, 255}, -* {1.0 , 0, 0, 255, 255} -* }; -* tvg_gradient_set_color_stops(grad, color_stops, 4); -* tvg_shape_set_radial_gradient(shape, grad); -* \endcode -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[in] grad The radial gradient fill. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_MEMORY_CORRUPTION An invalid Tvg_Gradient pointer. -* -* \note Either a solid color or a gradient fill is applied, depending on what was set as last. -* \see tvg_shape_set_fill_rule() -*/ -TVG_API Tvg_Result tvg_shape_set_radial_gradient(Tvg_Paint* paint, Tvg_Gradient* grad); - - -/*! -* \brief Gets the gradient fill of the shape. -* -* The function does not allocate any data. -* -* \param[in] paint A Tvg_Paint pointer to the shape object. -* \param[out] grad The gradient fill. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. -*/ -TVG_API Tvg_Result tvg_shape_get_gradient(const Tvg_Paint* paint, Tvg_Gradient** grad); - - -/** \} */ // end defgroup ThorVGCapi_Shape - - -/** -* \defgroup ThorVGCapi_Gradient Gradient -* \brief A module managing the gradient fill of objects. -* -* The module enables to set and to get the gradient colors and their arrangement inside the gradient bounds, -* to specify the gradient bounds and the gradient behavior in case the area defined by the gradient bounds -* is smaller than the area to be filled. -* -* \{ -*/ - -/************************************************************************/ -/* Gradient API */ -/************************************************************************/ -/*! -* \brief Creates a new linear gradient object. -* -* \code -* Tvg_Paint* shape = tvg_shape_new(); -* tvg_shape_append_rect(shape, 700, 700, 100, 100, 20, 20); -* Tvg_Gradient* grad = tvg_linear_gradient_new(); -* tvg_linear_gradient_set(grad, 700, 700, 800, 800); -* Tvg_Color_Stop color_stops[2] = -* { -* {0.0, 0, 0, 0, 255}, -* {1.0, 0, 255, 0, 255}, -* }; -* tvg_gradient_set_color_stops(grad, color_stops, 2); -* tvg_shape_set_linear_gradient(shape, grad); -* \endcode -* -* \return A new linear gradient object. -*/ -TVG_API Tvg_Gradient* tvg_linear_gradient_new(void); - - -/*! -* \brief Creates a new radial gradient object. -* -* \code -* Tvg_Paint* shape = tvg_shape_new(); -* tvg_shape_append_rect(shape, 700, 700, 100, 100, 20, 20); -* Tvg_Gradient* grad = tvg_radial_gradient_new(); -* tvg_radial_gradient_set(grad, 550, 550, 50); -* Tvg_Color_Stop color_stops[2] = -* { -* {0.0, 0, 0, 0, 255}, -* {1.0, 0, 255, 0, 255}, -* }; -* tvg_gradient_set_color_stops(grad, color_stops, 2); -* tvg_shape_set_radial_gradient(shape, grad); -* \endcode -* -* \return A new radial gradient object. -*/ -TVG_API Tvg_Gradient* tvg_radial_gradient_new(void); - - -/*! -* \brief Sets the linear gradient bounds. -* -* The bounds of the linear gradient are defined as a surface constrained by two parallel lines crossing -* the given points (@p x1, @p y1) and (@p x2, @p y2), respectively. Both lines are perpendicular to the line linking -* (@p x1, @p y1) and (@p x2, @p y2). -* -* \param[in] grad The Tvg_Gradient object of which bounds are to be set. -* @param[in] x1 The horizontal coordinate of the first point used to determine the gradient bounds. -* @param[in] y1 The vertical coordinate of the first point used to determine the gradient bounds. -* @param[in] x2 The horizontal coordinate of the second point used to determine the gradient bounds. -* @param[in] y2 The vertical coordinate of the second point used to determine the gradient bounds. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer. -* -* \note In case the first and the second points are equal, an object filled with such a gradient fill is not rendered. -*/ -TVG_API Tvg_Result tvg_linear_gradient_set(Tvg_Gradient* grad, float x1, float y1, float x2, float y2); - - -/*! -* \brief Gets the linear gradient bounds. -* -* The bounds of the linear gradient are defined as a surface constrained by two parallel lines crossing -* the given points (@p x1, @p y1) and (@p x2, @p y2), respectively. Both lines are perpendicular to the line linking -* (@p x1, @p y1) and (@p x2, @p y2). -* -* \param[in] grad The Tvg_Gradient object of which to get the bounds. -* \param[out] x1 The horizontal coordinate of the first point used to determine the gradient bounds. -* \param[out] y1 The vertical coordinate of the first point used to determine the gradient bounds. -* \param[out] x2 The horizontal coordinate of the second point used to determine the gradient bounds. -* \param[out] y2 The vertical coordinate of the second point used to determine the gradient bounds. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer. -*/ -TVG_API Tvg_Result tvg_linear_gradient_get(Tvg_Gradient* grad, float* x1, float* y1, float* x2, float* y2); - - -/*! -* \brief Sets the radial gradient bounds. -* -* The radial gradient bounds are defined as a circle centered in a given point (@p cx, @p cy) of a given radius. -* -* \param[in] grad The Tvg_Gradient object of which bounds are to be set. -* \param[in] cx The horizontal coordinate of the center of the bounding circle. -* \param[in] cy The vertical coordinate of the center of the bounding circle. -* \param[in] radius The radius of the bounding circle. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer or the @p radius value less than zero. -*/ -TVG_API Tvg_Result tvg_radial_gradient_set(Tvg_Gradient* grad, float cx, float cy, float radius); - - -/*! -* \brief The function gets radial gradient center point ant radius -* -* \param[in] grad The Tvg_Gradient object of which bounds are to be set. -* \param[out] cx The horizontal coordinate of the center of the bounding circle. -* \param[out] cy The vertical coordinate of the center of the bounding circle. -* \param[out] radius The radius of the bounding circle. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer. -*/ -TVG_API Tvg_Result tvg_radial_gradient_get(Tvg_Gradient* grad, float* cx, float* cy, float* radius); - - -/*! -* \brief Sets the parameters of the colors of the gradient and their position. -* -* \param[in] grad The Tvg_Gradient object of which the color information is to be set. -* \param[in] color_stop An array of Tvg_Color_Stop data structure. -* \param[in] cnt The size of the @p color_stop array equal to the colors number used in the gradient. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer. -*/ -TVG_API Tvg_Result tvg_gradient_set_color_stops(Tvg_Gradient* grad, const Tvg_Color_Stop* color_stop, uint32_t cnt); - - -/*! -* \brief Gets the parameters of the colors of the gradient, their position and number -* -* The function does not allocate any memory. -* -* \param[in] grad The Tvg_Gradient object of which to get the color information. -* \param[out] color_stop An array of Tvg_Color_Stop data structure. -* \param[out] cnt The size of the @p color_stop array equal to the colors number used in the gradient. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. -*/ -TVG_API Tvg_Result tvg_gradient_get_color_stops(const Tvg_Gradient* grad, const Tvg_Color_Stop** color_stop, uint32_t* cnt); - - -/*! -* \brief Sets the Tvg_Stroke_Fill value, which specifies how to fill the area outside the gradient bounds. -* -* \param[in] grad The Tvg_Gradient object. -* \param[in] spread The FillSpread value. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer. -*/ -TVG_API Tvg_Result tvg_gradient_set_spread(Tvg_Gradient* grad, const Tvg_Stroke_Fill spread); - - -/*! -* \brief Gets the FillSpread value of the gradient object. -* -* \param[in] grad The Tvg_Gradient object. -* \param[out] spread The FillSpread value. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. -*/ -TVG_API Tvg_Result tvg_gradient_get_spread(const Tvg_Gradient* grad, Tvg_Stroke_Fill* spread); - - -/*! -* \brief Sets the matrix of the affine transformation for the gradient object. -* -* The augmented matrix of the transformation is expected to be given. -* -* \param[in] grad The Tvg_Gradient object to be transformed. -* \param[in] m The 3x3 augmented matrix. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr is passed as the argument. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. -*/ -TVG_API Tvg_Result tvg_gradient_set_transform(Tvg_Gradient* grad, const Tvg_Matrix* m); - - -/*! -* \brief Gets the matrix of the affine transformation of the gradient object. -* -* In case no transformation was applied, the identity matrix is set. -* -* \param[in] grad The Tvg_Gradient object of which to get the transformation matrix. -* \param[out] m The 3x3 augmented matrix. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr is passed as the argument. -*/ -TVG_API Tvg_Result tvg_gradient_get_transform(const Tvg_Gradient* grad, Tvg_Matrix* m); - -/** -* \brief Gets the unique id value of the gradient instance indicating the instance type. -* -* \param[in] grad The Tvg_Gradient object of which to get the identifier value. -* \param[out] identifier The unique identifier of the gradient instance type. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. -* -* \since 0.9 -*/ -TVG_API Tvg_Result tvg_gradient_get_identifier(const Tvg_Gradient* grad, Tvg_Identifier* identifier); - - -/*! -* \brief Duplicates the given Tvg_Gradient object. -* -* Creates a new object and sets its all properties as in the original object. -* -* \param[in] grad The Tvg_Gradient object to be copied. -* -* \return A copied Tvg_Gradient object if succeed, @c nullptr otherwise. -*/ -TVG_API Tvg_Gradient* tvg_gradient_duplicate(Tvg_Gradient* grad); - - -/*! -* \brief Deletes the given gradient object. -* -* \param[in] grad The gradient object to be deleted. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer. -*/ -TVG_API Tvg_Result tvg_gradient_del(Tvg_Gradient* grad); - - -/** \} */ // end defgroup ThorVGCapi_Gradient - - -/** -* \defgroup ThorVGCapi_Picture Picture -* -* \brief A module enabling to create and to load an image in one of the supported formats: svg, png, jpg, lottie and raw. -* -* -* \{ -*/ - -/************************************************************************/ -/* Picture API */ -/************************************************************************/ -/*! -* \brief Creates a new picture object. -* -* \return A new picture object. -*/ -TVG_API Tvg_Paint* tvg_picture_new(void); - - -/*! -* \brief Loads a picture data directly from a file. -* -* ThorVG efficiently caches the loaded data using the specified @p path as a key. -* This means that loading the same file again will not result in duplicate operations; -* instead, ThorVG will reuse the previously loaded picture data. -* -* \param[in] paint A Tvg_Paint pointer to the picture object. -* \param[in] path The absolute path to the image file. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer or an empty @p path. -* \retval TVG_RESULT_NOT_SUPPORTED A file with an unknown extension. -* \retval TVG_RESULT_UNKNOWN An error at a later stage. -*/ -TVG_API Tvg_Result tvg_picture_load(Tvg_Paint* paint, const char* path); - - -/*! -* \brief Loads a picture data from a memory block of a given size. -* -* ThorVG efficiently caches the loaded data using the specified @p data address as a key -* when the @p copy has @c false. This means that loading the same data again will not result in duplicate operations -* for the sharable @p data. Instead, ThorVG will reuse the previously loaded picture data. -* -* \param[in] paint A Tvg_Paint pointer to the picture object. -* \param[in] data A pointer to a memory location where the content of the picture raw data is stored. -* \param[in] w The width of the image @p data in pixels. -* \param[in] h The height of the image @p data in pixels. -* \param[in] premultiplied If @c true, the given image data is alpha-premultiplied. -* \param[in] copy If @c true the data are copied into the engine local buffer, otherwise they are not. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer or no data are provided or the @p width or @p height value is zero or less. -* \retval TVG_RESULT_FAILED_ALLOCATION A problem with memory allocation occurs. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION An error occurs at a later stage. -* -* \since 0.9 -*/ -TVG_API Tvg_Result tvg_picture_load_raw(Tvg_Paint* paint, uint32_t *data, uint32_t w, uint32_t h, bool copy); - - -/*! -* \brief Loads a picture data from a memory block of a given size. -* -* ThorVG efficiently caches the loaded data using the specified @p data address as a key -* when the @p copy has @c false. This means that loading the same data again will not result in duplicate operations -* for the sharable @p data. Instead, ThorVG will reuse the previously loaded picture data. -* -* \param[in] paint A Tvg_Paint pointer to the picture object. -* \param[in] data A pointer to a memory location where the content of the picture file is stored. -* \param[in] size The size in bytes of the memory occupied by the @p data. -* \param[in] mimetype Mimetype or extension of data such as "jpg", "jpeg", "svg", "svg+xml", "lottie", "png", etc. In case an empty string or an unknown type is provided, the loaders will be tried one by one. -* \param[in] copy If @c true the data are copied into the engine local buffer, otherwise they are not. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument or the @p size is zero or less. -* \retval TVG_RESULT_NOT_SUPPORTED A file with an unknown extension. -* \retval TVG_RESULT_UNKNOWN An error at a later stage. -* -* \warning: It's the user responsibility to release the @p data memory if the @p copy is @c true. -*/ -TVG_API Tvg_Result tvg_picture_load_data(Tvg_Paint* paint, const char *data, uint32_t size, const char *mimetype, bool copy); - - -/*! -* \brief Resizes the picture content to the given width and height. -* -* The picture content is resized while keeping the default size aspect ratio. -* The scaling factor is established for each of dimensions and the smaller value is applied to both of them. -* -* \param[in] paint A Tvg_Paint pointer to the picture object. -* \param[in] w A new width of the image in pixels. -* \param[in] h A new height of the image in pixels. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION An internal error. -*/ -TVG_API Tvg_Result tvg_picture_set_size(Tvg_Paint* paint, float w, float h); - - -/*! -* \brief Gets the size of the loaded picture. -* -* \param[in] paint A Tvg_Paint pointer to the picture object. -* \param[out] w A width of the image in pixels. -* \param[out] h A height of the image in pixels. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -*/ -TVG_API Tvg_Result tvg_picture_get_size(const Tvg_Paint* paint, float* w, float* h); - - -/** \} */ // end defgroup ThorVGCapi_Picture - - -/** -* \defgroup ThorVGCapi_Scene Scene -* \brief A module managing the multiple paints as one group paint. -* -* As a group, scene can be transformed, translucent, composited with other target paints, -* its children will be affected by the scene world. -* -* \{ -*/ - -/************************************************************************/ -/* Scene API */ -/************************************************************************/ -/*! -* \brief Creates a new scene object. -* -* A scene object is used to group many paints into one object, which can be manipulated using TVG APIs. -* -* \return A new scene object. -*/ -TVG_API Tvg_Paint* tvg_scene_new(void); - - -/*! -* \brief Sets the size of the container, where all the paints pushed into the scene are stored. -* -* If the number of objects pushed into the scene is known in advance, calling the function -* prevents multiple memory reallocation, thus improving the performance. -* -* \param[in] scene A Tvg_Paint pointer to the scene object. -* \param[in] size The number of objects for which the memory is to be reserved. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. -*/ -TVG_DEPRECATED TVG_API Tvg_Result tvg_scene_reserve(Tvg_Paint* scene, uint32_t size); - - -/*! -* \brief Passes drawing elements to the scene using Tvg_Paint objects. -* -* Only the paints pushed into the scene will be the drawn targets. -* The paints are retained by the scene until the tvg_scene_clear() is called. -* If you know the number of pushed objects in advance, please call tvg_scene_reserve(). -* -* \param[in] scene A Tvg_Paint pointer to the scene object. -* \param[in] paint A graphical object to be drawn. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. -* \retval TVG_RESULT_MEMORY_CORRUPTION An internal error. -* -* \note The rendering order of the paints is the same as the order as they were pushed. Consider sorting the paints before pushing them if you intend to use layering. -*/ -TVG_API Tvg_Result tvg_scene_push(Tvg_Paint* scene, Tvg_Paint* paint); - - -/*! -* \brief Clears a Tvg_Scene objects from pushed paints. -* -* Tvg_Paint objects stored in the scene are released if @p free is set to @c true, otherwise the memory is not deallocated and -* all paints should be released manually in order to avoid memory leaks. -* -* \param[in] scene The Tvg_Scene object to be cleared. -* \param[in] free If @c true the memory occupied by paints is deallocated, otherwise it is not. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Canvas pointer. -* -* \warning Please use the @p free argument only when you know how it works, otherwise it's not recommended. -*/ -TVG_API Tvg_Result tvg_scene_clear(Tvg_Paint* scene, bool free); - -/** \} */ // end defgroup ThorVGCapi_Scene - - -/** -* \defgroup ThorVGCapi_Saver Saver -* \brief A module for exporting a paint object into a specified file. -* -* The module enables to save the composed scene and/or image from a paint object. -* Once it's successfully exported to a file, it can be recreated using the Picture module. -* -* \{ -*/ - -/************************************************************************/ -/* Saver API */ -/************************************************************************/ -/*! -* \brief Creates a new Tvg_Saver object. -* -* \return A new Tvg_Saver object. -*/ -TVG_API Tvg_Saver* tvg_saver_new(void); - - -/*! -* \brief Exports the given @p paint data to the given @p path -* -* If the saver module supports any compression mechanism, it will optimize the data size. -* This might affect the encoding/decoding time in some cases. You can turn off the compression -* if you wish to optimize for speed. -* -* \param[in] saver The Tvg_Saver object connected with the saving task. -* \param[in] paint The paint to be saved with all its associated properties. -* \param[in] path A path to the file, in which the paint data is to be saved. -* \param[in] compress If @c true then compress data if possible. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION Currently saving other resources. -* \retval TVG_RESULT_NOT_SUPPORTED Trying to save a file with an unknown extension or in an unsupported format. -* \retval TVG_RESULT_MEMORY_CORRUPTION An internal error. -* \retval TVG_RESULT_UNKNOWN An empty paint is to be saved. -* -* \note Saving can be asynchronous if the assigned thread number is greater than zero. To guarantee the saving is done, call tvg_saver_sync() afterwards. -* \see tvg_saver_sync() -*/ -TVG_API Tvg_Result tvg_saver_save(Tvg_Saver* saver, Tvg_Paint* paint, const char* path, bool compress); - - -/*! -* \brief Guarantees that the saving task is finished. -* -* The behavior of the Saver module works on a sync/async basis, depending on the threading setting of the Initializer. -* Thus, if you wish to have a benefit of it, you must call tvg_saver_sync() after the tvg_saver_save() in the proper delayed time. -* Otherwise, you can call tvg_saver_sync() immediately. -* -* \param[in] saver The Tvg_Saver object connected with the saving task. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION No saving task is running. -* -* \note The asynchronous tasking is dependent on the Saver module implementation. -* \see tvg_saver_save() -*/ -TVG_API Tvg_Result tvg_saver_sync(Tvg_Saver* saver); - - -/*! -* \brief Deletes the given Tvg_Saver object. -* -* \param[in] saver The Tvg_Saver object to be deleted. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Saver pointer. -*/ -TVG_API Tvg_Result tvg_saver_del(Tvg_Saver* saver); - - -/** \} */ // end defgroup ThorVGCapi_Saver - - -/** -* \defgroup ThorVGCapi_Animation Animation -* \brief A module for manipulation of animatable images. -* -* The module supports the display and control of animation frames. -* -* \{ -*/ - -/************************************************************************/ -/* Animation API */ -/************************************************************************/ - -/*! -* \brief Creates a new Animation object. -* -* \return Tvg_Animation A new Tvg_Animation object. -* -* \since 0.13 -*/ -TVG_API Tvg_Animation* tvg_animation_new(void); - - -/*! -* \brief Specifies the current frame in the animation. -* -* \param[in] animation A Tvg_Animation pointer to the animation object. -* \param[in] no The index of the animation frame to be displayed. The index should be less than the tvg_animation_total_frame(). -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Animation pointer. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION No animatable data loaded from the Picture. -* \retval TVG_RESULT_NOT_SUPPORTED The picture data does not support animations. -* -* \note For efficiency, ThorVG ignores updates to the new frame value if the difference from the current frame value -* is less than 0.001. In such cases, it returns @c Result::InsufficientCondition. -* Values less than 0.001 may be disregarded and may not be accurately retained by the Animation. -* \see tvg_animation_get_total_frame() -* -* \since 0.13 -*/ -TVG_API Tvg_Result tvg_animation_set_frame(Tvg_Animation* animation, float no); - - -/*! -* \brief Retrieves a picture instance associated with this animation instance. -* -* This function provides access to the picture instance that can be used to load animation formats, such as Lottie(json). -* After setting up the picture, it can be pushed to the designated canvas, enabling control over animation frames -* with this Animation instance. -* -* \param[in] animation A Tvg_Animation pointer to the animation object. -* -* \return A picture instance that is tied to this animation. -* -* \warning The picture instance is owned by Animation. It should not be deleted manually. -* -* \since 0.13 -*/ -TVG_API Tvg_Paint* tvg_animation_get_picture(Tvg_Animation* animation); - - -/*! -* \brief Retrieves the current frame number of the animation. -* -* \param[in] animation A Tvg_Animation pointer to the animation object. -* \param[in] no The current frame number of the animation, between 0 and totalFrame() - 1. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Animation pointer or @p no -* -* \see tvg_animation_get_total_frame() -* \see tvg_animation_set_frame() -* -* \since 0.13 -*/ -TVG_API Tvg_Result tvg_animation_get_frame(Tvg_Animation* animation, float* no); - - -/*! -* \brief Retrieves the total number of frames in the animation. -* -* \param[in] animation A Tvg_Animation pointer to the animation object. -* \param[in] cnt The total number of frames in the animation. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Animation pointer or @p cnt. -* -* \note Frame numbering starts from 0. -* \note If the Picture is not properly configured, this function will return 0. -* -* \since 0.13 -*/ -TVG_API Tvg_Result tvg_animation_get_total_frame(Tvg_Animation* animation, float* cnt); - - -/*! -* \brief Retrieves the duration of the animation in seconds. -* -* \param[in] animation A Tvg_Animation pointer to the animation object. -* \param[in] duration The duration of the animation in seconds. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Animation pointer or @p duration. -* -* \note If the Picture is not properly configured, this function will return 0. -* -* \since 0.13 -*/ -TVG_API Tvg_Result tvg_animation_get_duration(Tvg_Animation* animation, float* duration); - - -/*! -* \brief Specifies the playback segment of the animation. (Experimental API) -* -* \param[in] animation The Tvg_Animation pointer to the animation object. -* \param[in] begin segment begin. -* \param[in] end segment end. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION In case the animation is not loaded. -* \retval TVG_RESULT_INVALID_ARGUMENT When the given parameters are out of range. -* -* \since 0.13 -*/ -TVG_API Tvg_Result tvg_animation_set_segment(Tvg_Animation* animation, float begin, float end); - - -/*! -* \brief Gets the current segment. (Experimental API) -* -* \param[in] animation The Tvg_Animation pointer to the animation object. -* \param[out] begin segment begin. -* \param[out] end segment end. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION In case the animation is not loaded. -* \retval TVG_RESULT_INVALID_ARGUMENT When the given parameters are @c nullptr. -*/ -TVG_API Tvg_Result tvg_animation_get_segment(Tvg_Animation* animation, float* begin, float* end); - - -/*! -* \brief Deletes the given Tvg_Animation object. -* -* \param[in] animation The Tvg_Animation object to be deleted. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Animation pointer. -* -* \since 0.13 -*/ -TVG_API Tvg_Result tvg_animation_del(Tvg_Animation* animation); - - -/** \} */ // end defgroup ThorVGCapi_Animation - - -/** -* \defgroup ThorVGCapi_LottieAnimation LottieAnimation -* \brief A module for manipulation of lottie extension features. -* -* The module enables control of advanced Lottie features. -* \{ -*/ - -/************************************************************************/ -/* LottieAnimation Extension API */ -/************************************************************************/ - -/*! -* \brief Creates a new LottieAnimation object. (Experimental API) -* -* \return Tvg_Animation A new Tvg_LottieAnimation object. -*/ -TVG_API Tvg_Animation* tvg_lottie_animation_new(void); - - -/*! -* \brief Override the lottie properties through the slot data. (Experimental API) -* -* \param[in] animation The Tvg_Animation object to override the property with the slot. -* \param[in] slot The Lottie slot data in json, or @c nullptr to reset. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION In case the animation is not loaded. -* \retval TVG_RESULT_INVALID_ARGUMENT When the given @p slot is invalid -* \retval TVG_RESULT_NOT_SUPPORTED The Lottie Animation is not supported. -*/ -TVG_API Tvg_Result tvg_lottie_animation_override(Tvg_Animation* animation, const char* slot); - - -/*! -* \brief Specifies a segment by marker. (Experimental API) -* -* \param[in] animation The Tvg_Animation pointer to the Lottie animation object. -* \param[in] marker The name of the segment marker. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INSUFFICIENT_CONDITION In case the animation is not loaded. -* \retval TVG_RESULT_INVALID_ARGUMENT When the given @p marker is invalid. -* \retval TVG_RESULT_NOT_SUPPORTED The Lottie Animation is not supported. -*/ -TVG_API Tvg_Result tvg_lottie_animation_set_marker(Tvg_Animation* animation, const char* marker); - - -/*! -* \brief Gets the marker count of the animation. (Experimental API) -* -* \param[in] animation The Tvg_Animation pointer to the Lottie animation object. -* \param[out] cnt The count value of the markers. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. -*/ -TVG_API Tvg_Result tvg_lottie_animation_get_markers_cnt(Tvg_Animation* animation, uint32_t* cnt); - - -/*! -* \brief Gets the marker name by a given index. (Experimental API) -* -* \param[in] animation The Tvg_Animation pointer to the Lottie animation object. -* \param[in] idx The index of the animation marker, starts from 0. -* \param[out] name The name of marker when succeed. -* -* \return Tvg_Result enumeration. -* \retval TVG_RESULT_SUCCESS Succeed. -* \retval TVG_RESULT_INVALID_ARGUMENT In case @c nullptr is passed as the argument or @c idx is out of range. -*/ -TVG_API Tvg_Result tvg_lottie_animation_get_marker(Tvg_Animation* animation, uint32_t idx, const char** name); - - -/** \} */ // end addtogroup ThorVGCapi_LottieAnimation - - -/** \} */ // end defgroup ThorVGCapi - - -#ifdef __cplusplus -} -#endif - -#endif //_THORVG_CAPI_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/thorvg_lottie.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/thorvg_lottie.h deleted file mode 100644 index b69410a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/thorvg_lottie.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef _THORVG_LOTTIE_H_ -#define _THORVG_LOTTIE_H_ - -#include "thorvg.h" - -namespace tvg -{ - -/** - * @class LottieAnimation - * - * @brief The LottieAnimation class enables control of advanced Lottie features. - * - * This class extends the Animation and has additional interfaces. - * - * @see Animation - * - * @note Experimental API - */ - -#include "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL -class TVG_API LottieAnimation final : public Animation -{ -public: - ~LottieAnimation(); - - /** - * @brief Override Lottie properties using slot data. - * - * @param[in] slot The Lottie slot data in JSON format to override, or @c nullptr to reset. - * - * @retval Result::Success When succeed. - * @retval Result::InsufficientCondition In case the animation is not loaded. - * @retval Result::InvalidArguments When the given parameter is invalid. - * - * @note Experimental API - */ - Result override(const char* slot) noexcept; - - /** - * @brief Specifies a segment by marker. - * - * Markers are used to control animation playback by specifying start and end points, - * eliminating the need to know the exact frame numbers. - * Generally, markers are designated at the design level, - * meaning the callers must know the marker name in advance to use it. - * - * @param[in] marker The name of the segment marker. - * - * @retval Result::Success When successful. - * @retval Result::InsufficientCondition If the animation is not loaded. - * @retval Result::InvalidArguments When the given parameter is invalid. - * @retval Result::NonSupport When it's not animatable. - * - * @note If a @c marker is specified, the previously set segment will be disregarded. - * @note Set @c nullptr to reset the specified segment. - * @see Animation::segment(float begin, float end) - * @note Experimental API - */ - Result segment(const char* marker) noexcept; - - /** - * @brief Gets the marker count of the animation. - * - * @retval The count of the markers, zero if there is no marker. - * - * @see LottieAnimation::marker() - * @note Experimental API - */ - uint32_t markersCnt() noexcept; - - /** - * @brief Gets the marker name by a given index. - * - * @param[in] idx The index of the animation marker, starts from 0. - * - * @retval The name of marker when succeed, @c nullptr otherwise. - * - * @see LottieAnimation::markersCnt() - * @note Experimental API - */ - const char* marker(uint32_t idx) noexcept; - - /** - * @brief Creates a new LottieAnimation object. - * - * @return A new LottieAnimation object. - * - * @note Experimental API - */ - static std::unique_ptr gen() noexcept; -}; - -} //namespace - -#endif //_THORVG_LOTTIE_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgAccessor.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgAccessor.cpp deleted file mode 100644 index e1f8608..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgAccessor.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2021 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgIteratorAccessor.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static bool accessChildren(Iterator* it, function func) -{ - while (auto child = it->next()) { - //Access the child - if (!func(child)) return false; - - //Access the children of the child - if (auto it2 = IteratorAccessor::iterator(child)) { - if (!accessChildren(it2, func)) { - delete(it2); - return false; - } - delete(it2); - } - } - return true; -} - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -unique_ptr Accessor::set(unique_ptr picture, function func) noexcept -{ - auto p = picture.get(); - if (!p || !func) return picture; - - //Use the Preorder Tree-Search - - //Root - if (!func(p)) return picture; - - //Children - if (auto it = IteratorAccessor::iterator(p)) { - accessChildren(it, func); - delete(it); - } - return picture; -} - - -Accessor::~Accessor() -{ - -} - - -Accessor::Accessor() : pImpl(nullptr) -{ - -} - - -unique_ptr Accessor::gen() noexcept -{ - return unique_ptr(new Accessor); -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgAnimation.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgAnimation.cpp deleted file mode 100644 index 399ee45..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgAnimation.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgFrameModule.h" -#include "tvgAnimation.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -Animation::~Animation() -{ - delete(pImpl); -} - - -Animation::Animation() : pImpl(new Impl) -{ -} - - -Result Animation::frame(float no) noexcept -{ - auto loader = pImpl->picture->pImpl->loader; - - if (!loader) return Result::InsufficientCondition; - if (!loader->animatable()) return Result::NonSupport; - - if (static_cast(loader)->frame(no)) return Result::Success; - return Result::InsufficientCondition; -} - - -Picture* Animation::picture() const noexcept -{ - return pImpl->picture; -} - - -float Animation::curFrame() const noexcept -{ - auto loader = pImpl->picture->pImpl->loader; - - if (!loader) return 0; - if (!loader->animatable()) return 0; - - return static_cast(loader)->curFrame(); -} - - -float Animation::totalFrame() const noexcept -{ - auto loader = pImpl->picture->pImpl->loader; - - if (!loader) return 0; - if (!loader->animatable()) return 0; - - return static_cast(loader)->totalFrame(); -} - - -float Animation::duration() const noexcept -{ - auto loader = pImpl->picture->pImpl->loader; - - if (!loader) return 0; - if (!loader->animatable()) return 0; - - return static_cast(loader)->duration(); -} - - -Result Animation::segment(float begin, float end) noexcept -{ - if (begin < 0.0 || end > 1.0 || begin >= end) return Result::InvalidArguments; - - auto loader = pImpl->picture->pImpl->loader; - if (!loader) return Result::InsufficientCondition; - if (!loader->animatable()) return Result::NonSupport; - - static_cast(loader)->segment(begin, end); - - return Result::Success; -} - - -Result Animation::segment(float *begin, float *end) noexcept -{ - auto loader = pImpl->picture->pImpl->loader; - if (!loader) return Result::InsufficientCondition; - if (!loader->animatable()) return Result::NonSupport; - if (!begin && !end) return Result::InvalidArguments; - - static_cast(loader)->segment(begin, end); - - return Result::Success; -} - - -unique_ptr Animation::gen() noexcept -{ - return unique_ptr(new Animation); -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgAnimation.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgAnimation.h deleted file mode 100644 index d0b4567..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgAnimation.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_ANIMATION_H_ -#define _TVG_ANIMATION_H_ - -#include "tvgCommon.h" -#include "tvgPaint.h" -#include "tvgPicture.h" - -struct Animation::Impl -{ - Picture* picture = nullptr; - - Impl() - { - picture = Picture::gen().release(); - PP(picture)->ref(); - } - - ~Impl() - { - if (PP(picture)->unref() == 0) { - delete(picture); - } - } -}; - -#endif //_TVG_ANIMATION_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgArray.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgArray.h deleted file mode 100644 index 33cd55b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgArray.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_ARRAY_H_ -#define _TVG_ARRAY_H_ - -#include -#include -#include - -namespace tvg -{ - -template -struct Array -{ - T* data = nullptr; - uint32_t count = 0; - uint32_t reserved = 0; - - Array(){} - - Array(int32_t size) - { - reserve(size); - } - - Array(const Array& rhs) - { - reset(); - *this = rhs; - } - - void push(T element) - { - if (count + 1 > reserved) { - reserved = count + (count + 2) / 2; - data = static_cast(realloc(data, sizeof(T) * reserved)); - } - data[count++] = element; - } - - void push(Array& rhs) - { - if (rhs.count == 0) return; - grow(rhs.count); - memcpy(data + count, rhs.data, rhs.count * sizeof(T)); - count += rhs.count; - } - - bool reserve(uint32_t size) - { - if (size > reserved) { - reserved = size; - data = static_cast(realloc(data, sizeof(T) * reserved)); - } - return true; - } - - bool grow(uint32_t size) - { - return reserve(count + size); - } - - const T& operator[](size_t idx) const - { - return data[idx]; - } - - T& operator[](size_t idx) - { - return data[idx]; - } - - const T* begin() const - { - return data; - } - - T* begin() - { - return data; - } - - T* end() - { - return data + count; - } - - const T* end() const - { - return data + count; - } - - const T& last() const - { - return data[count - 1]; - } - - const T& first() const - { - return data[0]; - } - - T& last() - { - return data[count - 1]; - } - - T& first() - { - return data[0]; - } - - void pop() - { - if (count > 0) --count; - } - - void reset() - { - free(data); - data = nullptr; - count = reserved = 0; - } - - void clear() - { - count = 0; - } - - bool empty() const - { - return count == 0; - } - - template - void sort() - { - qsort(data, 0, static_cast(count) - 1); - } - - void operator=(const Array& rhs) - { - reserve(rhs.count); - if (rhs.count > 0) memcpy(data, rhs.data, sizeof(T) * rhs.count); - count = rhs.count; - } - - ~Array() - { - free(data); - } - -private: - template - void qsort(T* arr, int32_t low, int32_t high) - { - if (low < high) { - int32_t i = low; - int32_t j = high; - T tmp = arr[low]; - while (i < j) { - while (i < j && !COMPARE{}(arr[j], tmp)) --j; - if (i < j) { - arr[i] = arr[j]; - ++i; - } - while (i < j && COMPARE{}(arr[i], tmp)) ++i; - if (i < j) { - arr[j] = arr[i]; - --j; - } - } - arr[i] = tmp; - qsort(arr, low, i - 1); - qsort(arr, i + 1, high); - } - } -}; - -} - -#endif //_TVG_ARRAY_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgBinaryDesc.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgBinaryDesc.h deleted file mode 100644 index add8b08..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgBinaryDesc.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2021 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_BINARY_DESC_H_ -#define _TVG_BINARY_DESC_H_ - -/* TODO: Need to consider whether uin8_t is enough size for extension... - Rather than optimal data, we can use enough size and data compress? */ - -using TvgBinByte = uint8_t; -using TvgBinCounter = uint32_t; -using TvgBinTag = TvgBinByte; -using TvgBinFlag = TvgBinByte; - - -//Header -#define TVG_HEADER_SIZE 33 //TVG_HEADER_SIGNATURE_LENGTH + TVG_HEADER_VERSION_LENGTH + 2*SIZE(float) + TVG_HEADER_RESERVED_LENGTH + TVG_HEADER_COMPRESS_SIZE -#define TVG_HEADER_SIGNATURE "ThorVG" -#define TVG_HEADER_SIGNATURE_LENGTH 6 -#define TVG_HEADER_VERSION "001200" //Major 00, Minor 12, Micro 00 -#define TVG_HEADER_VERSION_LENGTH 6 -#define TVG_HEADER_RESERVED_LENGTH 1 //Storing flags for extensions -#define TVG_HEADER_COMPRESS_SIZE 12 //TVG_HEADER_UNCOMPRESSED_SIZE + TVG_HEADER_COMPRESSED_SIZE + TVG_HEADER_COMPRESSED_SIZE_BITS -//Compress Size -#define TVG_HEADER_UNCOMPRESSED_SIZE 4 //SIZE (TvgBinCounter) -#define TVG_HEADER_COMPRESSED_SIZE 4 //SIZE (TvgBinCounter) -#define TVG_HEADER_COMPRESSED_SIZE_BITS 4 //SIZE (TvgBinCounter) -//Reserved Flag -#define TVG_HEAD_FLAG_COMPRESSED 0x01 - -//Paint Type -#define TVG_TAG_CLASS_PICTURE (TvgBinTag)0xfc -#define TVG_TAG_CLASS_SHAPE (TvgBinTag)0xfd -#define TVG_TAG_CLASS_SCENE (TvgBinTag)0xfe - - -//Paint -#define TVG_TAG_PAINT_OPACITY (TvgBinTag)0x10 -#define TVG_TAG_PAINT_TRANSFORM (TvgBinTag)0x11 -#define TVG_TAG_PAINT_CMP_TARGET (TvgBinTag)0x01 -#define TVG_TAG_PAINT_CMP_METHOD (TvgBinTag)0x20 - - -//TODO: Keep this for the compatibility, Remove in TVG 1.0 release -//Scene - #define TVG_TAG_SCENE_RESERVEDCNT (TvgBinTag)0x30 - - -//Shape -#define TVG_TAG_SHAPE_PATH (TvgBinTag)0x40 -#define TVG_TAG_SHAPE_STROKE (TvgBinTag)0x41 -#define TVG_TAG_SHAPE_FILL (TvgBinTag)0x42 -#define TVG_TAG_SHAPE_COLOR (TvgBinTag)0x43 -#define TVG_TAG_SHAPE_FILLRULE (TvgBinTag)0x44 - - -//Stroke -#define TVG_TAG_SHAPE_STROKE_CAP (TvgBinTag)0x50 -#define TVG_TAG_SHAPE_STROKE_JOIN (TvgBinTag)0x51 -#define TVG_TAG_SHAPE_STROKE_WIDTH (TvgBinTag)0x52 -#define TVG_TAG_SHAPE_STROKE_COLOR (TvgBinTag)0x53 -#define TVG_TAG_SHAPE_STROKE_FILL (TvgBinTag)0x54 -#define TVG_TAG_SHAPE_STROKE_DASHPTRN (TvgBinTag)0x55 -#define TVG_TAG_SHAPE_STROKE_MITERLIMIT (TvgBinTag)0x56 -#define TVG_TAG_SHAPE_STROKE_ORDER (TvgBinTag)0x57 -#define TVG_TAG_SHAPE_STROKE_DASH_OFFSET (TvgBinTag)0x58 - - -//Fill -#define TVG_TAG_FILL_LINEAR_GRADIENT (TvgBinTag)0x60 -#define TVG_TAG_FILL_RADIAL_GRADIENT (TvgBinTag)0x61 -#define TVG_TAG_FILL_COLORSTOPS (TvgBinTag)0x62 -#define TVG_TAG_FILL_FILLSPREAD (TvgBinTag)0x63 -#define TVG_TAG_FILL_TRANSFORM (TvgBinTag)0x64 -#define TVG_TAG_FILL_RADIAL_GRADIENT_FOCAL (TvgBinTag)0x65 - -//Picture -#define TVG_TAG_PICTURE_RAW_IMAGE (TvgBinTag)0x70 -#define TVG_TAG_PICTURE_MESH (TvgBinTag)0x71 - -#endif //_TVG_BINARY_DESC_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCanvas.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCanvas.cpp deleted file mode 100644 index 22a97c2..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCanvas.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgCanvas.h" - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -Canvas::Canvas(RenderMethod *pRenderer):pImpl(new Impl(pRenderer)) -{ -} - - -Canvas::~Canvas() -{ - delete(pImpl); -} - - -Result Canvas::reserve(TVG_UNUSED uint32_t n) noexcept -{ - return Result::NonSupport; -} - - -list& Canvas::paints() noexcept -{ - return pImpl->paints; -} - - -Result Canvas::push(unique_ptr paint) noexcept -{ - return pImpl->push(std::move(paint)); -} - - -Result Canvas::clear(bool free) noexcept -{ - return pImpl->clear(free); -} - - -Result Canvas::draw() noexcept -{ - TVGLOG("RENDERER", "Draw S. -------------------------------- Canvas(%p)", this); - auto ret = pImpl->draw(); - TVGLOG("RENDERER", "Draw E. -------------------------------- Canvas(%p)", this); - - return ret; -} - - -Result Canvas::update(Paint* paint) noexcept -{ - TVGLOG("RENDERER", "Update S. ------------------------------ Canvas(%p)", this); - auto ret = pImpl->update(paint, false); - TVGLOG("RENDERER", "Update E. ------------------------------ Canvas(%p)", this); - - return ret; -} - - -Result Canvas::viewport(int32_t x, int32_t y, int32_t w, int32_t h) noexcept -{ - return pImpl->viewport(x, y, w, h); -} - - -Result Canvas::sync() noexcept -{ - return pImpl->sync(); -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCanvas.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCanvas.h deleted file mode 100644 index 171f6aa..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCanvas.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_CANVAS_H_ -#define _TVG_CANVAS_H_ - -#include "tvgPaint.h" - - -struct Canvas::Impl -{ - enum Status : uint8_t {Synced = 0, Updating, Drawing}; - - list paints; - RenderMethod* renderer; - RenderRegion vport = {0, 0, INT32_MAX, INT32_MAX}; - Status status = Status::Synced; - - bool refresh = false; //if all paints should be updated by force. - - Impl(RenderMethod* pRenderer) : renderer(pRenderer) - { - renderer->ref(); - } - - ~Impl() - { - //make it sure any deferred jobs - renderer->sync(); - renderer->clear(); - - clearPaints(); - - if (renderer->unref() == 0) delete(renderer); - } - - void clearPaints() - { - for (auto paint : paints) { - if (P(paint)->unref() == 0) delete(paint); - } - paints.clear(); - } - - Result push(unique_ptr paint) - { - //You cannot push paints during rendering. - if (status == Status::Drawing) return Result::InsufficientCondition; - - auto p = paint.release(); - if (!p) return Result::MemoryCorruption; - PP(p)->ref(); - paints.push_back(p); - - return update(p, true); - } - - Result clear(bool free) - { - //Clear render target before drawing - if (!renderer->clear()) return Result::InsufficientCondition; - - //Free paints - if (free) clearPaints(); - - status = Status::Synced; - - return Result::Success; - } - - void needRefresh() - { - refresh = true; - } - - Result update(Paint* paint, bool force) - { - if (paints.empty() || status == Status::Drawing) return Result::InsufficientCondition; - - Array clips; - auto flag = RenderUpdateFlag::None; - if (refresh || force) flag = RenderUpdateFlag::All; - - if (paint) { - paint->pImpl->update(renderer, nullptr, clips, 255, flag); - } else { - for (auto paint : paints) { - paint->pImpl->update(renderer, nullptr, clips, 255, flag); - } - refresh = false; - } - status = Status::Updating; - return Result::Success; - } - - Result draw() - { - if (status == Status::Drawing || paints.empty() || !renderer->preRender()) return Result::InsufficientCondition; - - bool rendered = false; - for (auto paint : paints) { - if (paint->pImpl->render(renderer)) rendered = true; - } - - if (!rendered || !renderer->postRender()) return Result::InsufficientCondition; - - status = Status::Drawing; - return Result::Success; - } - - Result sync() - { - if (status == Status::Synced) return Result::InsufficientCondition; - - if (renderer->sync()) { - status = Status::Synced; - return Result::Success; - } - - return Result::InsufficientCondition; - } - - Result viewport(int32_t x, int32_t y, int32_t w, int32_t h) - { - if (status != Status::Synced) return Result::InsufficientCondition; - RenderRegion val = {x, y, w, h}; - //intersect if the target buffer is already set. - auto surface = renderer->mainSurface(); - if (surface && surface->w > 0 && surface->h > 0) { - val.intersect({0, 0, (int32_t)surface->w, (int32_t)surface->h}); - } - if (vport == val) return Result::Success; - renderer->viewport(val); - vport = val; - needRefresh(); - return Result::Success; - } -}; - -#endif /* _TVG_CANVAS_H_ */ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCapi.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCapi.cpp deleted file mode 100644 index 1720d50..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCapi.cpp +++ /dev/null @@ -1,871 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "config.h" -#include -#include "thorvg.h" -#include "thorvg_capi.h" -#ifdef THORVG_LOTTIE_LOADER_SUPPORT -#include "thorvg_lottie.h" -#endif - -using namespace std; -using namespace tvg; - -#ifdef __cplusplus -extern "C" { -#endif - - -/************************************************************************/ -/* Engine API */ -/************************************************************************/ - -TVG_API Tvg_Result tvg_engine_init(Tvg_Engine engine_method, unsigned threads) -{ - return (Tvg_Result) Initializer::init(CanvasEngine(engine_method), threads); -} - - -TVG_API Tvg_Result tvg_engine_term(Tvg_Engine engine_method) -{ - return (Tvg_Result) Initializer::term(CanvasEngine(engine_method)); -} - - -/************************************************************************/ -/* Canvas API */ -/************************************************************************/ - -TVG_API Tvg_Canvas* tvg_swcanvas_create() -{ - return (Tvg_Canvas*) SwCanvas::gen().release(); -} - - -TVG_API Tvg_Result tvg_canvas_destroy(Tvg_Canvas* canvas) -{ - if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; - delete(reinterpret_cast(canvas)); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_swcanvas_set_mempool(Tvg_Canvas* canvas, Tvg_Mempool_Policy policy) -{ - if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(canvas)->mempool(static_cast(policy)); -} - - -TVG_API Tvg_Result tvg_swcanvas_set_target(Tvg_Canvas* canvas, uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h, Tvg_Colorspace cs) -{ - if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(canvas)->target(buffer, stride, w, h, static_cast(cs)); -} - - -TVG_API Tvg_Result tvg_canvas_push(Tvg_Canvas* canvas, Tvg_Paint* paint) -{ - if (!canvas || !paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(canvas)->push(unique_ptr((Paint*)paint)); -} - - -TVG_API Tvg_Result tvg_canvas_reserve(Tvg_Canvas* canvas, uint32_t n) -{ - return TVG_RESULT_NOT_SUPPORTED; -} - - -TVG_API Tvg_Result tvg_canvas_clear(Tvg_Canvas* canvas, bool free) -{ - if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(canvas)->clear(free); -} - - -TVG_API Tvg_Result tvg_canvas_update(Tvg_Canvas* canvas) -{ - if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(canvas)->update(nullptr); -} - - -TVG_API Tvg_Result tvg_canvas_est_viewport(Tvg_Canvas* canvas, int32_t x, int32_t y, int32_t w, int32_t h) -{ - if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(canvas)->viewport(x, y, w, h); -} - - -TVG_API Tvg_Result tvg_canvas_update_paint(Tvg_Canvas* canvas, Tvg_Paint* paint) -{ - if (!canvas || !paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(canvas)->update((Paint*) paint); -} - - -TVG_API Tvg_Result tvg_canvas_draw(Tvg_Canvas* canvas) -{ - if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(canvas)->draw(); -} - - -TVG_API Tvg_Result tvg_canvas_sync(Tvg_Canvas* canvas) -{ - if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(canvas)->sync(); -} - -TVG_API Tvg_Result tvg_canvas_set_viewport(Tvg_Canvas* canvas, int32_t x, int32_t y, int32_t w, int32_t h) -{ - if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(canvas)->viewport(x, y, w, h); -} - - -/************************************************************************/ -/* Paint API */ -/************************************************************************/ - -TVG_API Tvg_Result tvg_paint_del(Tvg_Paint* paint) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - delete(reinterpret_cast(paint)); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_paint_scale(Tvg_Paint* paint, float factor) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->scale(factor); -} - - -TVG_API Tvg_Result tvg_paint_rotate(Tvg_Paint* paint, float degree) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->rotate(degree); -} - - -TVG_API Tvg_Result tvg_paint_translate(Tvg_Paint* paint, float x, float y) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->translate(x, y); -} - - -TVG_API Tvg_Result tvg_paint_set_transform(Tvg_Paint* paint, const Tvg_Matrix* m) -{ - if (!paint || !m) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->transform(*(reinterpret_cast(m))); -} - - -TVG_API Tvg_Result tvg_paint_get_transform(Tvg_Paint* paint, Tvg_Matrix* m) -{ - if (!paint || !m) return TVG_RESULT_INVALID_ARGUMENT; - *reinterpret_cast(m) = reinterpret_cast(paint)->transform(); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Paint* tvg_paint_duplicate(Tvg_Paint* paint) -{ - if (!paint) return nullptr; - return (Tvg_Paint*) reinterpret_cast(paint)->duplicate(); -} - - -TVG_API Tvg_Result tvg_paint_set_opacity(Tvg_Paint* paint, uint8_t opacity) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->opacity(opacity); -} - - -TVG_API Tvg_Result tvg_paint_get_opacity(const Tvg_Paint* paint, uint8_t* opacity) -{ - if (!paint || !opacity) return TVG_RESULT_INVALID_ARGUMENT; - *opacity = reinterpret_cast(paint)->opacity(); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_paint_get_bounds(const Tvg_Paint* paint, float* x, float* y, float* w, float* h, bool transformed) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->bounds(x, y, w, h, transformed); -} - - -TVG_API Tvg_Result tvg_paint_set_composite_method(Tvg_Paint* paint, Tvg_Paint* target, Tvg_Composite_Method method) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->composite(unique_ptr((Paint*)(target)), (CompositeMethod)method); -} - - -TVG_API Tvg_Result tvg_paint_get_composite_method(const Tvg_Paint* paint, const Tvg_Paint** target, Tvg_Composite_Method* method) -{ - if (!paint || !target || !method) return TVG_RESULT_INVALID_ARGUMENT; - *reinterpret_cast(method) = reinterpret_cast(paint)->composite(reinterpret_cast(target)); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_paint_set_blend_method(const Tvg_Paint* paint, Tvg_Blend_Method method) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->blend((BlendMethod)method); -} - - -TVG_API Tvg_Result tvg_paint_get_blend_method(const Tvg_Paint* paint, Tvg_Blend_Method* method) -{ - if (!paint || !method) return TVG_RESULT_INVALID_ARGUMENT; - *method = static_cast(reinterpret_cast(paint)->blend()); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_paint_get_identifier(const Tvg_Paint* paint, Tvg_Identifier* identifier) -{ - if (!paint || !identifier) return TVG_RESULT_INVALID_ARGUMENT; - *identifier = static_cast(reinterpret_cast(paint)->identifier()); - return TVG_RESULT_SUCCESS; -} - -/************************************************************************/ -/* Shape API */ -/************************************************************************/ - -TVG_API Tvg_Paint* tvg_shape_new() -{ - return (Tvg_Paint*) Shape::gen().release(); -} - - -TVG_API Tvg_Result tvg_shape_reset(Tvg_Paint* paint) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->reset(); -} - - -TVG_API Tvg_Result tvg_shape_move_to(Tvg_Paint* paint, float x, float y) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->moveTo(x, y); -} - - -TVG_API Tvg_Result tvg_shape_line_to(Tvg_Paint* paint, float x, float y) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->lineTo(x, y); -} - - -TVG_API Tvg_Result tvg_shape_cubic_to(Tvg_Paint* paint, float cx1, float cy1, float cx2, float cy2, float x, float y) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->cubicTo(cx1, cy1, cx2, cy2, x, y); -} - - -TVG_API Tvg_Result tvg_shape_close(Tvg_Paint* paint) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->close(); -} - - -TVG_API Tvg_Result tvg_shape_append_rect(Tvg_Paint* paint, float x, float y, float w, float h, float rx, float ry) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->appendRect(x, y, w, h, rx, ry); -} - - -TVG_API Tvg_Result tvg_shape_append_arc(Tvg_Paint* paint, float cx, float cy, float radius, float startAngle, float sweep, uint8_t pie) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->appendArc(cx, cy, radius, startAngle, sweep, pie); -} - - -TVG_API Tvg_Result tvg_shape_append_circle(Tvg_Paint* paint, float cx, float cy, float rx, float ry) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->appendCircle(cx, cy, rx, ry); -} - - -TVG_API Tvg_Result tvg_shape_append_path(Tvg_Paint* paint, const Tvg_Path_Command* cmds, uint32_t cmdCnt, const Tvg_Point* pts, uint32_t ptsCnt) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->appendPath((const PathCommand*)cmds, cmdCnt, (const Point*)pts, ptsCnt); -} - - -TVG_API Tvg_Result tvg_shape_get_path_coords(const Tvg_Paint* paint, const Tvg_Point** pts, uint32_t* cnt) -{ - if (!paint || !pts || !cnt) return TVG_RESULT_INVALID_ARGUMENT; - *cnt = reinterpret_cast(paint)->pathCoords((const Point**)pts); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_shape_get_path_commands(const Tvg_Paint* paint, const Tvg_Path_Command** cmds, uint32_t* cnt) -{ - if (!paint || !cmds || !cnt) return TVG_RESULT_INVALID_ARGUMENT; - *cnt = reinterpret_cast(paint)->pathCommands((const PathCommand**)cmds); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_shape_set_stroke_width(Tvg_Paint* paint, float width) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->stroke(width); -} - - -TVG_API Tvg_Result tvg_shape_get_stroke_width(const Tvg_Paint* paint, float* width) -{ - if (!paint || !width) return TVG_RESULT_INVALID_ARGUMENT; - *width = reinterpret_cast(paint)->strokeWidth(); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_shape_set_stroke_color(Tvg_Paint* paint, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->stroke(r, g, b, a); -} - - -TVG_API Tvg_Result tvg_shape_get_stroke_color(const Tvg_Paint* paint, uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->strokeColor(r, g, b, a); -} - - -TVG_API Tvg_Result tvg_shape_set_stroke_linear_gradient(Tvg_Paint* paint, Tvg_Gradient* gradient) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->stroke(unique_ptr((LinearGradient*)(gradient))); -} - - -TVG_API Tvg_Result tvg_shape_set_stroke_radial_gradient(Tvg_Paint* paint, Tvg_Gradient* gradient) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->stroke(unique_ptr((RadialGradient*)(gradient))); -} - - -TVG_API Tvg_Result tvg_shape_get_stroke_gradient(const Tvg_Paint* paint, Tvg_Gradient** gradient) -{ - if (!paint || !gradient) return TVG_RESULT_INVALID_ARGUMENT; - *gradient = (Tvg_Gradient*)(reinterpret_cast(paint)->strokeFill()); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_shape_set_stroke_dash(Tvg_Paint* paint, const float* dashPattern, uint32_t cnt) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->stroke(dashPattern, cnt); -} - - -TVG_API Tvg_Result tvg_shape_get_stroke_dash(const Tvg_Paint* paint, const float** dashPattern, uint32_t* cnt) -{ - if (!paint || !cnt || !dashPattern) return TVG_RESULT_INVALID_ARGUMENT; - *cnt = reinterpret_cast(paint)->strokeDash(dashPattern); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_shape_set_stroke_cap(Tvg_Paint* paint, Tvg_Stroke_Cap cap) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->stroke((StrokeCap)cap); -} - - -TVG_API Tvg_Result tvg_shape_get_stroke_cap(const Tvg_Paint* paint, Tvg_Stroke_Cap* cap) -{ - if (!paint || !cap) return TVG_RESULT_INVALID_ARGUMENT; - *cap = (Tvg_Stroke_Cap) reinterpret_cast(paint)->strokeCap(); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_shape_set_stroke_join(Tvg_Paint* paint, Tvg_Stroke_Join join) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->stroke((StrokeJoin)join); -} - - -TVG_API Tvg_Result tvg_shape_get_stroke_join(const Tvg_Paint* paint, Tvg_Stroke_Join* join) -{ - if (!paint || !join) return TVG_RESULT_INVALID_ARGUMENT; - *join = (Tvg_Stroke_Join) reinterpret_cast(paint)->strokeJoin(); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_shape_set_stroke_miterlimit(Tvg_Paint* paint, float ml) -{ - if (ml < 0.0f) return TVG_RESULT_NOT_SUPPORTED; - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->strokeMiterlimit(ml); -} - - -TVG_API Tvg_Result tvg_shape_get_stroke_miterlimit(const Tvg_Paint* paint, float* ml) -{ - if (!paint || !ml) return TVG_RESULT_INVALID_ARGUMENT; - *ml = reinterpret_cast(paint)->strokeMiterlimit(); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_shape_set_fill_color(Tvg_Paint* paint, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->fill(r, g, b, a); -} - - -TVG_API Tvg_Result tvg_shape_get_fill_color(const Tvg_Paint* paint, uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->fillColor(r, g, b, a); -} - - -TVG_API Tvg_Result tvg_shape_set_fill_rule(Tvg_Paint* paint, Tvg_Fill_Rule rule) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->fill((FillRule)rule); -} - - -TVG_API Tvg_Result tvg_shape_get_fill_rule(const Tvg_Paint* paint, Tvg_Fill_Rule* rule) -{ - if (!paint || !rule) return TVG_RESULT_INVALID_ARGUMENT; - *rule = (Tvg_Fill_Rule) reinterpret_cast(paint)->fillRule(); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_shape_set_paint_order(Tvg_Paint* paint, bool strokeFirst) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->order(strokeFirst); -} - - -TVG_API Tvg_Result tvg_shape_set_linear_gradient(Tvg_Paint* paint, Tvg_Gradient* gradient) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->fill(unique_ptr((LinearGradient*)(gradient))); -} - - -TVG_API Tvg_Result tvg_shape_set_radial_gradient(Tvg_Paint* paint, Tvg_Gradient* gradient) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->fill(unique_ptr((RadialGradient*)(gradient))); -} - - -TVG_API Tvg_Result tvg_shape_get_gradient(const Tvg_Paint* paint, Tvg_Gradient** gradient) -{ - if (!paint || !gradient) return TVG_RESULT_INVALID_ARGUMENT; - *gradient = (Tvg_Gradient*)(reinterpret_cast(paint)->fill()); - return TVG_RESULT_SUCCESS; -} - -/************************************************************************/ -/* Picture API */ -/************************************************************************/ - -TVG_API Tvg_Paint* tvg_picture_new() -{ - return (Tvg_Paint*) Picture::gen().release(); -} - - -TVG_API Tvg_Result tvg_picture_load(Tvg_Paint* paint, const char* path) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->load(path); -} - - -TVG_API Tvg_Result tvg_picture_load_raw(Tvg_Paint* paint, uint32_t *data, uint32_t w, uint32_t h, bool copy) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->load(data, w, h, copy); -} - - -TVG_API Tvg_Result tvg_picture_load_data(Tvg_Paint* paint, const char *data, uint32_t size, const char *mimetype, bool copy) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->load(data, size, mimetype ? mimetype : "", copy); -} - - -TVG_API Tvg_Result tvg_picture_set_size(Tvg_Paint* paint, float w, float h) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->size(w, h); -} - - -TVG_API Tvg_Result tvg_picture_get_size(const Tvg_Paint* paint, float* w, float* h) -{ - if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->size(w, h); -} - - -/************************************************************************/ -/* Gradient API */ -/************************************************************************/ - -TVG_API Tvg_Gradient* tvg_linear_gradient_new() -{ - return (Tvg_Gradient*)LinearGradient::gen().release(); -} - - -TVG_API Tvg_Gradient* tvg_radial_gradient_new() -{ - return (Tvg_Gradient*)RadialGradient::gen().release(); -} - - -TVG_API Tvg_Gradient* tvg_gradient_duplicate(Tvg_Gradient* grad) -{ - if (!grad) return nullptr; - return (Tvg_Gradient*) reinterpret_cast(grad)->duplicate(); -} - - -TVG_API Tvg_Result tvg_gradient_del(Tvg_Gradient* grad) -{ - if (!grad) return TVG_RESULT_INVALID_ARGUMENT; - delete(reinterpret_cast(grad)); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_linear_gradient_set(Tvg_Gradient* grad, float x1, float y1, float x2, float y2) -{ - if (!grad) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(grad)->linear(x1, y1, x2, y2); -} - - -TVG_API Tvg_Result tvg_linear_gradient_get(Tvg_Gradient* grad, float* x1, float* y1, float* x2, float* y2) -{ - if (!grad) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(grad)->linear(x1, y1, x2, y2); -} - - -TVG_API Tvg_Result tvg_radial_gradient_set(Tvg_Gradient* grad, float cx, float cy, float radius) -{ - if (!grad) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(grad)->radial(cx, cy, radius); -} - - -TVG_API Tvg_Result tvg_radial_gradient_get(Tvg_Gradient* grad, float* cx, float* cy, float* radius) -{ - if (!grad) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(grad)->radial(cx, cy, radius); -} - - -TVG_API Tvg_Result tvg_gradient_set_color_stops(Tvg_Gradient* grad, const Tvg_Color_Stop* color_stop, uint32_t cnt) -{ - if (!grad) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(grad)->colorStops(reinterpret_cast(color_stop), cnt); -} - - -TVG_API Tvg_Result tvg_gradient_get_color_stops(const Tvg_Gradient* grad, const Tvg_Color_Stop** color_stop, uint32_t* cnt) -{ - if (!grad || !color_stop || !cnt) return TVG_RESULT_INVALID_ARGUMENT; - *cnt = reinterpret_cast(grad)->colorStops(reinterpret_cast(color_stop)); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_gradient_set_spread(Tvg_Gradient* grad, const Tvg_Stroke_Fill spread) -{ - if (!grad) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(grad)->spread((FillSpread)spread); -} - - -TVG_API Tvg_Result tvg_gradient_get_spread(const Tvg_Gradient* grad, Tvg_Stroke_Fill* spread) -{ - if (!grad || !spread) return TVG_RESULT_INVALID_ARGUMENT; - *spread = (Tvg_Stroke_Fill) reinterpret_cast(grad)->spread(); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_gradient_set_transform(Tvg_Gradient* grad, const Tvg_Matrix* m) -{ - if (!grad || !m) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(grad)->transform(*(reinterpret_cast(m))); -} - - -TVG_API Tvg_Result tvg_gradient_get_transform(const Tvg_Gradient* grad, Tvg_Matrix* m) -{ - if (!grad || !m) return TVG_RESULT_INVALID_ARGUMENT; - *reinterpret_cast(m) = reinterpret_cast(const_cast(grad))->transform(); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_gradient_get_identifier(const Tvg_Gradient* grad, Tvg_Identifier* identifier) -{ - if (!grad || !identifier) return TVG_RESULT_INVALID_ARGUMENT; - *identifier = static_cast(reinterpret_cast(grad)->identifier()); - return TVG_RESULT_SUCCESS; -} - -/************************************************************************/ -/* Scene API */ -/************************************************************************/ - -TVG_API Tvg_Paint* tvg_scene_new() -{ - return (Tvg_Paint*) Scene::gen().release(); -} - - -TVG_API Tvg_Result tvg_scene_reserve(Tvg_Paint* scene, uint32_t size) -{ - return TVG_RESULT_NOT_SUPPORTED; -} - - -TVG_API Tvg_Result tvg_scene_push(Tvg_Paint* scene, Tvg_Paint* paint) -{ - if (!scene || !paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(scene)->push(unique_ptr((Paint*)paint)); -} - - -TVG_API Tvg_Result tvg_scene_clear(Tvg_Paint* scene, bool free) -{ - if (!scene) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(scene)->clear(free); -} - - -/************************************************************************/ -/* Saver API */ -/************************************************************************/ - -TVG_API Tvg_Saver* tvg_saver_new() -{ - return (Tvg_Saver*) Saver::gen().release(); -} - - -TVG_API Tvg_Result tvg_saver_save(Tvg_Saver* saver, Tvg_Paint* paint, const char* path, bool compress) -{ - if (!saver || !paint || !path) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(saver)->save(unique_ptr((Paint*)paint), path, compress); -} - - -TVG_API Tvg_Result tvg_saver_sync(Tvg_Saver* saver) -{ - if (!saver) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(saver)->sync(); -} - - -TVG_API Tvg_Result tvg_saver_del(Tvg_Saver* saver) -{ - if (!saver) return TVG_RESULT_INVALID_ARGUMENT; - delete(reinterpret_cast(saver)); - return TVG_RESULT_SUCCESS; -} - - -/************************************************************************/ -/* Animation API */ -/************************************************************************/ - -TVG_API Tvg_Animation* tvg_animation_new() -{ - return (Tvg_Animation*) Animation::gen().release(); -} - - -TVG_API Tvg_Result tvg_animation_set_frame(Tvg_Animation* animation, float no) -{ - if (!animation) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(animation)->frame(no); -} - - -TVG_API Tvg_Result tvg_animation_get_frame(Tvg_Animation* animation, float* no) -{ - if (!animation || !no) return TVG_RESULT_INVALID_ARGUMENT; - *no = reinterpret_cast(animation)->curFrame(); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_animation_get_total_frame(Tvg_Animation* animation, float* cnt) -{ - if (!animation || !cnt) return TVG_RESULT_INVALID_ARGUMENT; - *cnt = reinterpret_cast(animation)->totalFrame(); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Paint* tvg_animation_get_picture(Tvg_Animation* animation) -{ - if (!animation) return nullptr; - return (Tvg_Paint*) reinterpret_cast(animation)->picture(); -} - - -TVG_API Tvg_Result tvg_animation_get_duration(Tvg_Animation* animation, float* duration) -{ - if (!animation || !duration) return TVG_RESULT_INVALID_ARGUMENT; - *duration = reinterpret_cast(animation)->duration(); - return TVG_RESULT_SUCCESS; -} - - -TVG_API Tvg_Result tvg_animation_set_segment(Tvg_Animation* animation, float start, float end) -{ - if (!animation) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(animation)->segment(start, end); -} - - -TVG_API Tvg_Result tvg_animation_get_segment(Tvg_Animation* animation, float* start, float* end) -{ - if (!animation) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(animation)->segment(start, end); -} - - -TVG_API Tvg_Result tvg_animation_del(Tvg_Animation* animation) -{ - if (!animation) return TVG_RESULT_INVALID_ARGUMENT; - delete(reinterpret_cast(animation)); - return TVG_RESULT_SUCCESS; -} - - -/************************************************************************/ -/* Lottie Animation API */ -/************************************************************************/ - -TVG_API Tvg_Animation* tvg_lottie_animation_new() -{ -#ifdef THORVG_LOTTIE_LOADER_SUPPORT - return (Tvg_Animation*) LottieAnimation::gen().release(); -#endif - return nullptr; -} - - -TVG_API Tvg_Result tvg_lottie_animation_override(Tvg_Animation* animation, const char* slot) -{ -#ifdef THORVG_LOTTIE_LOADER_SUPPORT - if (!animation) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(animation)->override(slot); -#endif - return TVG_RESULT_NOT_SUPPORTED; -} - - -TVG_API Tvg_Result tvg_lottie_animation_set_marker(Tvg_Animation* animation, const char* marker) -{ -#ifdef THORVG_LOTTIE_LOADER_SUPPORT - if (!animation) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(animation)->segment(marker); -#endif - return TVG_RESULT_NOT_SUPPORTED; -} - - -TVG_API Tvg_Result tvg_lottie_animation_get_markers_cnt(Tvg_Animation* animation, uint32_t* cnt) -{ -#ifdef THORVG_LOTTIE_LOADER_SUPPORT - if (!animation || !cnt) return TVG_RESULT_INVALID_ARGUMENT; - *cnt = reinterpret_cast(animation)->markersCnt(); - return TVG_RESULT_SUCCESS; -#endif - return TVG_RESULT_NOT_SUPPORTED; -} - - -TVG_API Tvg_Result tvg_lottie_animation_get_marker(Tvg_Animation* animation, uint32_t idx, const char** name) -{ -#ifdef THORVG_LOTTIE_LOADER_SUPPORT - if (!animation || !name) return TVG_RESULT_INVALID_ARGUMENT; - *name = reinterpret_cast(animation)->marker(idx); - if (!(*name)) return TVG_RESULT_INVALID_ARGUMENT; - return TVG_RESULT_SUCCESS; -#endif - return TVG_RESULT_NOT_SUPPORTED; -} - -#ifdef __cplusplus -} -#endif - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCommon.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCommon.h deleted file mode 100644 index d22c893..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCommon.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_COMMON_H_ -#define _TVG_COMMON_H_ - -#include "config.h" -#include "thorvg.h" - -using namespace std; -using namespace tvg; - -//for MSVC Compat -#ifdef _MSC_VER - #define TVG_UNUSED - #define strncasecmp _strnicmp - #define strcasecmp _stricmp -#else - #define TVG_UNUSED __attribute__ ((__unused__)) -#endif - -// Portable 'fallthrough' attribute -#if __has_cpp_attribute(fallthrough) - #ifdef _MSC_VER - #define TVG_FALLTHROUGH [[fallthrough]]; - #else - #define TVG_FALLTHROUGH __attribute__ ((fallthrough)); - #endif -#else - #define TVG_FALLTHROUGH -#endif - -#if defined(_MSC_VER) && defined(__clang__) - #define strncpy strncpy_s - #define strdup _strdup -#endif - -//TVG class identifier values -#define TVG_CLASS_ID_UNDEFINED 0 -#define TVG_CLASS_ID_SHAPE 1 -#define TVG_CLASS_ID_SCENE 2 -#define TVG_CLASS_ID_PICTURE 3 -#define TVG_CLASS_ID_LINEAR 4 -#define TVG_CLASS_ID_RADIAL 5 -#define TVG_CLASS_ID_TEXT 6 - -enum class FileType { Png = 0, Jpg, Webp, Tvg, Svg, Lottie, Ttf, Raw, Gif, Unknown }; - -using Size = Point; - -#ifdef THORVG_LOG_ENABLED - constexpr auto ErrorColor = "\033[31m"; //red - constexpr auto ErrorBgColor = "\033[41m";//bg red - constexpr auto LogColor = "\033[32m"; //green - constexpr auto LogBgColor = "\033[42m"; //bg green - constexpr auto GreyColor = "\033[90m"; //grey - constexpr auto ResetColors = "\033[0m"; //default - #define TVGERR(tag, fmt, ...) fprintf(stderr, "%s[E]%s %s" tag "%s (%s %d): %s" fmt "\n", ErrorBgColor, ResetColors, ErrorColor, GreyColor, __FILE__, __LINE__, ResetColors, ##__VA_ARGS__) - #define TVGLOG(tag, fmt, ...) fprintf(stdout, "%s[L]%s %s" tag "%s (%s %d): %s" fmt "\n", LogBgColor, ResetColors, LogColor, GreyColor, __FILE__, __LINE__, ResetColors, ##__VA_ARGS__) -#else - #define TVGERR(...) do {} while(0) - #define TVGLOG(...) do {} while(0) -#endif - -uint16_t THORVG_VERSION_NUMBER(); - - -#define P(A) ((A)->pImpl) //Access to pimpl. -#define PP(A) (((Paint*)(A))->pImpl) //Access to pimpl. - -#endif //_TVG_COMMON_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCompressor.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCompressor.cpp deleted file mode 100644 index d0c7c4e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCompressor.cpp +++ /dev/null @@ -1,481 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -/* - * Lempel–Ziv–Welch (LZW) encoder/decoder by Guilherme R. Lampert(guilherme.ronaldo.lampert@gmail.com) - - * This is the compression scheme used by the GIF image format and the Unix 'compress' tool. - * Main differences from this implementation is that End Of Input (EOI) and Clear Codes (CC) - * are not stored in the output and the max code length in bits is 12, vs 16 in compress. - * - * EOI is simply detected by the end of the data stream, while CC happens if the - * dictionary gets filled. Data is written/read from bit streams, which handle - * byte-alignment for us in a transparent way. - - * The decoder relies on the hardcoded data layout produced by the encoder, since - * no additional reconstruction data is added to the output, so they must match. - * The nice thing about LZW is that we can reconstruct the dictionary directly from - * the stream of codes generated by the encoder, so this avoids storing additional - * headers in the bit stream. - - * The output code length is variable. It starts with the minimum number of bits - * required to store the base byte-sized dictionary and automatically increases - * as the dictionary gets larger (it starts at 9-bits and grows to 10-bits when - * code 512 is added, then 11-bits when 1024 is added, and so on). If the dictionary - * is filled (4096 items for a 12-bits dictionary), the whole thing is cleared and - * the process starts over. This is the main reason why the encoder and the decoder - * must match perfectly, since the lengths of the codes will not be specified with - * the data itself. - - * USEFUL LINKS: - * https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch - * http://rosettacode.org/wiki/LZW_compression - * http://www.cs.duke.edu/csed/curious/compression/lzw.html - * http://www.cs.cf.ac.uk/Dave/Multimedia/node214.html - * http://marknelson.us/1989/10/01/lzw-data-compression/ - */ -#include "config.h" - - - -#include -#include -#include "tvgCompressor.h" - -namespace tvg { - - -/************************************************************************/ -/* LZW Implementation */ -/************************************************************************/ - - -//LZW Dictionary helper: -constexpr int Nil = -1; -constexpr int MaxDictBits = 12; -constexpr int StartBits = 9; -constexpr int FirstCode = (1 << (StartBits - 1)); // 256 -constexpr int MaxDictEntries = (1 << MaxDictBits); // 4096 - - -//Round up to the next power-of-two number, e.g. 37 => 64 -static int nextPowerOfTwo(int num) -{ - --num; - for (size_t i = 1; i < sizeof(num) * 8; i <<= 1) { - num = num | num >> i; - } - return ++num; -} - - -struct BitStreamWriter -{ - uint8_t* stream; //Growable buffer to store our bits. Heap allocated & owned by the class instance. - int bytesAllocated; //Current size of heap-allocated stream buffer *in bytes*. - int granularity; //Amount bytesAllocated multiplies by when auto-resizing in appendBit(). - int currBytePos; //Current byte being written to, from 0 to bytesAllocated-1. - int nextBitPos; //Bit position within the current byte to access next. 0 to 7. - int numBitsWritten; //Number of bits in use from the stream buffer, not including byte-rounding padding. - - void internalInit() - { - stream = nullptr; - bytesAllocated = 0; - granularity = 2; - currBytePos = 0; - nextBitPos = 0; - numBitsWritten = 0; - } - - uint8_t* allocBytes(const int bytesWanted, uint8_t * oldPtr, const int oldSize) - { - auto newMemory = static_cast(malloc(bytesWanted)); - memset(newMemory, 0, bytesWanted); - - if (oldPtr) { - memcpy(newMemory, oldPtr, oldSize); - free(oldPtr); - } - return newMemory; - } - - BitStreamWriter() - { - /* 8192 bits for a start (1024 bytes). It will resize if needed. - Default granularity is 2. */ - internalInit(); - allocate(8192); - } - - BitStreamWriter(const int initialSizeInBits, const int growthGranularity = 2) - { - internalInit(); - setGranularity(growthGranularity); - allocate(initialSizeInBits); - } - - ~BitStreamWriter() - { - free(stream); - } - - void allocate(int bitsWanted) - { - //Require at least a byte. - if (bitsWanted <= 0) bitsWanted = 8; - - //Round upwards if needed: - if ((bitsWanted % 8) != 0) bitsWanted = nextPowerOfTwo(bitsWanted); - - //We might already have the required count. - const int sizeInBytes = bitsWanted / 8; - if (sizeInBytes <= bytesAllocated) return; - - stream = allocBytes(sizeInBytes, stream, bytesAllocated); - bytesAllocated = sizeInBytes; - } - - void appendBit(const int bit) - { - const uint32_t mask = uint32_t(1) << nextBitPos; - stream[currBytePos] = (stream[currBytePos] & ~mask) | (-bit & mask); - ++numBitsWritten; - - if (++nextBitPos == 8) { - nextBitPos = 0; - if (++currBytePos == bytesAllocated) allocate(bytesAllocated * granularity * 8); - } - } - - void appendBitsU64(const uint64_t num, const int bitCount) - { - for (int b = 0; b < bitCount; ++b) { - const uint64_t mask = uint64_t(1) << b; - const int bit = !!(num & mask); - appendBit(bit); - } - } - - uint8_t* release() - { - auto oldPtr = stream; - internalInit(); - return oldPtr; - } - - void setGranularity(const int growthGranularity) - { - granularity = (growthGranularity >= 2) ? growthGranularity : 2; - } - - int getByteCount() const - { - int usedBytes = numBitsWritten / 8; - int leftovers = numBitsWritten % 8; - if (leftovers != 0) ++usedBytes; - return usedBytes; - } -}; - - -struct BitStreamReader -{ - const uint8_t* stream; // Pointer to the external bit stream. Not owned by the reader. - const int sizeInBytes; // Size of the stream *in bytes*. Might include padding. - const int sizeInBits; // Size of the stream *in bits*, padding *not* include. - int currBytePos = 0; // Current byte being read in the stream. - int nextBitPos = 0; // Bit position within the current byte to access next. 0 to 7. - int numBitsRead = 0; // Total bits read from the stream so far. Never includes byte-rounding padding. - - BitStreamReader(const uint8_t* bitStream, const int byteCount, const int bitCount) : stream(bitStream), sizeInBytes(byteCount), sizeInBits(bitCount) - { - } - - bool readNextBit(int& bitOut) - { - if (numBitsRead >= sizeInBits) return false; //We are done. - - const uint32_t mask = uint32_t(1) << nextBitPos; - bitOut = !!(stream[currBytePos] & mask); - ++numBitsRead; - - if (++nextBitPos == 8) { - nextBitPos = 0; - ++currBytePos; - } - return true; - } - - uint64_t readBitsU64(const int bitCount) - { - uint64_t num = 0; - for (int b = 0; b < bitCount; ++b) { - int bit; - if (!readNextBit(bit)) break; - /* Based on a "Stanford bit-hack": - http://graphics.stanford.edu/~seander/bithacks.html#ConditionalSetOrClearBitsWithoutBranching */ - const uint64_t mask = uint64_t(1) << b; - num = (num & ~mask) | (-bit & mask); - } - return num; - } - - bool isEndOfStream() const - { - return numBitsRead >= sizeInBits; - } -}; - - -struct Dictionary -{ - struct Entry - { - int code; - int value; - }; - - //Dictionary entries 0-255 are always reserved to the byte/ASCII range. - int size; - Entry entries[MaxDictEntries]; - - Dictionary() - { - /* First 256 dictionary entries are reserved to the byte/ASCII range. - Additional entries follow for the character sequences found in the input. - Up to 4096 - 256 (MaxDictEntries - FirstCode). */ - size = FirstCode; - - for (int i = 0; i < size; ++i) { - entries[i].code = Nil; - entries[i].value = i; - } - } - - int findIndex(const int code, const int value) const - { - if (code == Nil) return value; - - //Linear search for now. - //TODO: Worth optimizing with a proper hash-table? - for (int i = 0; i < size; ++i) { - if (entries[i].code == code && entries[i].value == value) return i; - } - return Nil; - } - - bool add(const int code, const int value) - { - if (size == MaxDictEntries) return false; - entries[size].code = code; - entries[size].value = value; - ++size; - return true; - } - - bool flush(int & codeBitsWidth) - { - if (size == (1 << codeBitsWidth)) { - ++codeBitsWidth; - if (codeBitsWidth > MaxDictBits) { - //Clear the dictionary (except the first 256 byte entries). - codeBitsWidth = StartBits; - size = FirstCode; - return true; - } - } - return false; - } -}; - - -static bool outputByte(int code, uint8_t*& output, int outputSizeBytes, int& bytesDecodedSoFar) -{ - if (bytesDecodedSoFar >= outputSizeBytes) return false; - *output++ = static_cast(code); - ++bytesDecodedSoFar; - return true; -} - - -static bool outputSequence(const Dictionary& dict, int code, uint8_t*& output, int outputSizeBytes, int& bytesDecodedSoFar, int& firstByte) -{ - /* A sequence is stored backwards, so we have to write - it to a temp then output the buffer in reverse. */ - int i = 0; - uint8_t sequence[MaxDictEntries]; - - do { - sequence[i++] = dict.entries[code].value; - code = dict.entries[code].code; - } while (code >= 0); - - firstByte = sequence[--i]; - - for (; i >= 0; --i) { - if (!outputByte(sequence[i], output, outputSizeBytes, bytesDecodedSoFar)) return false; - } - return true; -} - - -uint8_t* lzwDecode(const uint8_t* compressed, uint32_t compressedSizeBytes, uint32_t compressedSizeBits, uint32_t uncompressedSizeBytes) -{ - int code = Nil; - int prevCode = Nil; - int firstByte = 0; - int bytesDecoded = 0; - int codeBitsWidth = StartBits; - auto uncompressed = (uint8_t*) malloc(sizeof(uint8_t) * uncompressedSizeBytes); - auto ptr = uncompressed; - - /* We'll reconstruct the dictionary based on the bit stream codes. - Unlike Huffman encoding, we don't store the dictionary as a prefix to the data. */ - Dictionary dictionary; - BitStreamReader bitStream(compressed, compressedSizeBytes, compressedSizeBits); - - /* We check to avoid an overflow of the user buffer. - If the buffer is smaller than the decompressed size, we break the loop and return the current decompression count. */ - while (!bitStream.isEndOfStream()) { - code = static_cast(bitStream.readBitsU64(codeBitsWidth)); - - if (prevCode == Nil) { - if (!outputByte(code, ptr, uncompressedSizeBytes, bytesDecoded)) break; - firstByte = code; - prevCode = code; - continue; - } - if (code >= dictionary.size) { - if (!outputSequence(dictionary, prevCode, ptr, uncompressedSizeBytes, bytesDecoded, firstByte)) break; - if (!outputByte(firstByte, ptr, uncompressedSizeBytes, bytesDecoded)) break; - } else if (!outputSequence(dictionary, code, ptr, uncompressedSizeBytes, bytesDecoded, firstByte)) break; - - dictionary.add(prevCode, firstByte); - if (dictionary.flush(codeBitsWidth)) prevCode = Nil; - else prevCode = code; - } - - return uncompressed; -} - - -uint8_t* lzwEncode(const uint8_t* uncompressed, uint32_t uncompressedSizeBytes, uint32_t* compressedSizeBytes, uint32_t* compressedSizeBits) -{ - //LZW encoding context: - int code = Nil; - int codeBitsWidth = StartBits; - Dictionary dictionary; - - //Output bit stream we write to. This will allocate memory as needed to accommodate the encoded data. - BitStreamWriter bitStream; - - for (; uncompressedSizeBytes > 0; --uncompressedSizeBytes, ++uncompressed) { - const int value = *uncompressed; - const int index = dictionary.findIndex(code, value); - - if (index != Nil) { - code = index; - continue; - } - - //Write the dictionary code using the minimum bit-with: - bitStream.appendBitsU64(code, codeBitsWidth); - - //Flush it when full so we can restart the sequences. - if (!dictionary.flush(codeBitsWidth)) { - //There's still space for this sequence. - dictionary.add(code, value); - } - code = value; - } - - //Residual code at the end: - if (code != Nil) bitStream.appendBitsU64(code, codeBitsWidth); - - //Pass ownership of the compressed data buffer to the user pointer: - *compressedSizeBytes = bitStream.getByteCount(); - *compressedSizeBits = bitStream.numBitsWritten; - - return bitStream.release(); -} - - -/************************************************************************/ -/* B64 Implementation */ -/************************************************************************/ - - -size_t b64Decode(const char* encoded, const size_t len, char** decoded) -{ - static constexpr const char B64_INDEX[256] = - { - 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, 62, 63, 62, 62, 63, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 0, 0, 0, 0, 63, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 - }; - - - if (!decoded || !encoded || len == 0) return 0; - - auto reserved = 3 * (1 + (len >> 2)) + 1; - auto output = static_cast(malloc(reserved * sizeof(char))); - if (!output) return 0; - output[reserved - 1] = '\0'; - - size_t idx = 0; - - while (*encoded && *(encoded + 1)) { - if (*encoded <= 0x20) { - ++encoded; - continue; - } - - auto value1 = B64_INDEX[(size_t)encoded[0]]; - auto value2 = B64_INDEX[(size_t)encoded[1]]; - output[idx++] = (value1 << 2) + ((value2 & 0x30) >> 4); - - if (!encoded[2] || encoded[3] < 0 || encoded[2] == '=' || encoded[2] == '.') break; - auto value3 = B64_INDEX[(size_t)encoded[2]]; - output[idx++] = ((value2 & 0x0f) << 4) + ((value3 & 0x3c) >> 2); - - if (!encoded[3] || encoded[3] < 0 || encoded[3] == '=' || encoded[3] == '.') break; - auto value4 = B64_INDEX[(size_t)encoded[3]]; - output[idx++] = ((value3 & 0x03) << 6) + value4; - encoded += 4; - } - *decoded = output; - return reserved; -} - - -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCompressor.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCompressor.h deleted file mode 100644 index 11e5fb3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgCompressor.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_COMPRESSOR_H_ -#define _TVG_COMPRESSOR_H_ - -#include - -namespace tvg -{ - uint8_t* lzwEncode(const uint8_t* uncompressed, uint32_t uncompressedSizeBytes, uint32_t* compressedSizeBytes, uint32_t* compressedSizeBits); - uint8_t* lzwDecode(const uint8_t* compressed, uint32_t compressedSizeBytes, uint32_t compressedSizeBits, uint32_t uncompressedSizeBytes); - size_t b64Decode(const char* encoded, const size_t len, char** decoded); -} - -#endif //_TVG_COMPRESSOR_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgFill.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgFill.cpp deleted file mode 100644 index 76d678f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgFill.cpp +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgFill.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -Fill* RadialGradient::Impl::duplicate() -{ - auto ret = RadialGradient::gen(); - if (!ret) return nullptr; - - ret->pImpl->cx = cx; - ret->pImpl->cy = cy; - ret->pImpl->r = r; - ret->pImpl->fx = fx; - ret->pImpl->fy = fy; - ret->pImpl->fr = fr; - - return ret.release(); -} - - -Result RadialGradient::Impl::radial(float cx, float cy, float r, float fx, float fy, float fr) -{ - if (r < 0 || fr < 0) return Result::InvalidArguments; - - this->cx = cx; - this->cy = cy; - this->r = r; - this->fx = fx; - this->fy = fy; - this->fr = fr; - - return Result::Success; -}; - - -Fill* LinearGradient::Impl::duplicate() -{ - auto ret = LinearGradient::gen(); - if (!ret) return nullptr; - - ret->pImpl->x1 = x1; - ret->pImpl->y1 = y1; - ret->pImpl->x2 = x2; - ret->pImpl->y2 = y2; - - return ret.release(); -}; - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -Fill::Fill():pImpl(new Impl()) -{ -} - - -Fill::~Fill() -{ - delete(pImpl); -} - - -Result Fill::colorStops(const ColorStop* colorStops, uint32_t cnt) noexcept -{ - if ((!colorStops && cnt > 0) || (colorStops && cnt == 0)) return Result::InvalidArguments; - - if (cnt == 0) { - if (pImpl->colorStops) { - free(pImpl->colorStops); - pImpl->colorStops = nullptr; - pImpl->cnt = 0; - } - return Result::Success; - } - - if (pImpl->cnt != cnt) { - pImpl->colorStops = static_cast(realloc(pImpl->colorStops, cnt * sizeof(ColorStop))); - } - - pImpl->cnt = cnt; - memcpy(pImpl->colorStops, colorStops, cnt * sizeof(ColorStop)); - - return Result::Success; -} - - -uint32_t Fill::colorStops(const ColorStop** colorStops) const noexcept -{ - if (colorStops) *colorStops = pImpl->colorStops; - - return pImpl->cnt; -} - - -Result Fill::spread(FillSpread s) noexcept -{ - pImpl->spread = s; - - return Result::Success; -} - - -FillSpread Fill::spread() const noexcept -{ - return pImpl->spread; -} - - -Result Fill::transform(const Matrix& m) noexcept -{ - if (!pImpl->transform) { - pImpl->transform = static_cast(malloc(sizeof(Matrix))); - } - *pImpl->transform = m; - return Result::Success; -} - - -Matrix Fill::transform() const noexcept -{ - if (pImpl->transform) return *pImpl->transform; - return {1, 0, 0, 0, 1, 0, 0, 0, 1}; -} - - -Fill* Fill::duplicate() const noexcept -{ - return pImpl->duplicate(); -} - - -uint32_t Fill::identifier() const noexcept -{ - return pImpl->id; -} - - -RadialGradient::RadialGradient():pImpl(new Impl()) -{ - Fill::pImpl->id = TVG_CLASS_ID_RADIAL; - Fill::pImpl->method(new FillDup(pImpl)); -} - - -RadialGradient::~RadialGradient() -{ - delete(pImpl); -} - - -Result RadialGradient::radial(float cx, float cy, float r) noexcept -{ - return pImpl->radial(cx, cy, r, cx, cy, 0.0f); -} - - -Result RadialGradient::radial(float* cx, float* cy, float* r) const noexcept -{ - if (cx) *cx = pImpl->cx; - if (cy) *cy = pImpl->cy; - if (r) *r = pImpl->r; - - return Result::Success; -} - - -unique_ptr RadialGradient::gen() noexcept -{ - return unique_ptr(new RadialGradient); -} - - -uint32_t RadialGradient::identifier() noexcept -{ - return TVG_CLASS_ID_RADIAL; -} - - -LinearGradient::LinearGradient():pImpl(new Impl()) -{ - Fill::pImpl->id = TVG_CLASS_ID_LINEAR; - Fill::pImpl->method(new FillDup(pImpl)); -} - - -LinearGradient::~LinearGradient() -{ - delete(pImpl); -} - - -Result LinearGradient::linear(float x1, float y1, float x2, float y2) noexcept -{ - pImpl->x1 = x1; - pImpl->y1 = y1; - pImpl->x2 = x2; - pImpl->y2 = y2; - - return Result::Success; -} - - -Result LinearGradient::linear(float* x1, float* y1, float* x2, float* y2) const noexcept -{ - if (x1) *x1 = pImpl->x1; - if (x2) *x2 = pImpl->x2; - if (y1) *y1 = pImpl->y1; - if (y2) *y2 = pImpl->y2; - - return Result::Success; -} - - -unique_ptr LinearGradient::gen() noexcept -{ - return unique_ptr(new LinearGradient); -} - - -uint32_t LinearGradient::identifier() noexcept -{ - return TVG_CLASS_ID_LINEAR; -} - - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgFill.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgFill.h deleted file mode 100644 index e6d776f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgFill.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_FILL_H_ -#define _TVG_FILL_H_ - -#include -#include -#include "tvgCommon.h" - -template -struct DuplicateMethod -{ - virtual ~DuplicateMethod() {} - virtual T* duplicate() = 0; -}; - -template -struct FillDup : DuplicateMethod -{ - T* inst = nullptr; - - FillDup(T* _inst) : inst(_inst) {} - ~FillDup() {} - - Fill* duplicate() override - { - return inst->duplicate(); - } -}; - -struct Fill::Impl -{ - ColorStop* colorStops = nullptr; - Matrix* transform = nullptr; - uint32_t cnt = 0; - FillSpread spread; - DuplicateMethod* dup = nullptr; - uint8_t id; - - ~Impl() - { - delete(dup); - free(colorStops); - free(transform); - } - - void method(DuplicateMethod* dup) - { - this->dup = dup; - } - - Fill* duplicate() - { - auto ret = dup->duplicate(); - if (!ret) return nullptr; - - ret->pImpl->cnt = cnt; - ret->pImpl->spread = spread; - ret->pImpl->colorStops = static_cast(malloc(sizeof(ColorStop) * cnt)); - memcpy(ret->pImpl->colorStops, colorStops, sizeof(ColorStop) * cnt); - if (transform) { - ret->pImpl->transform = static_cast(malloc(sizeof(Matrix))); - *ret->pImpl->transform = *transform; - } - return ret; - } -}; - - -struct RadialGradient::Impl -{ - float cx = 0.0f, cy = 0.0f; - float fx = 0.0f, fy = 0.0f; - float r = 0.0f, fr = 0.0f; - - Fill* duplicate(); - Result radial(float cx, float cy, float r, float fx, float fy, float fr); -}; - - -struct LinearGradient::Impl -{ - float x1 = 0.0f; - float y1 = 0.0f; - float x2 = 0.0f; - float y2 = 0.0f; - - Fill* duplicate(); -}; - - -#endif //_TVG_FILL_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgFrameModule.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgFrameModule.h deleted file mode 100644 index 02e69a8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgFrameModule.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_FRAME_MODULE_H_ -#define _TVG_FRAME_MODULE_H_ - -#include "tvgLoadModule.h" - -namespace tvg -{ - -class FrameModule: public ImageLoader -{ -public: - float segmentBegin = 0.0f; - float segmentEnd = 1.0f; - - FrameModule(FileType type) : ImageLoader(type) {} - virtual ~FrameModule() {} - - virtual bool frame(float no) = 0; //set the current frame number - virtual float totalFrame() = 0; //return the total frame count - virtual float curFrame() = 0; //return the current frame number - virtual float duration() = 0; //return the animation duration in seconds - - void segment(float* begin, float* end) - { - if (begin) *begin = segmentBegin; - if (end) *end = segmentEnd; - } - - void segment(float begin, float end) - { - segmentBegin = begin; - segmentEnd = end; - } - - virtual bool animatable() override { return true; } -}; - -} - -#endif //_TVG_FRAME_MODULE_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgGlCanvas.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgGlCanvas.cpp deleted file mode 100644 index d246ea5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgGlCanvas.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgCanvas.h" - -#ifdef THORVG_GL_RASTER_SUPPORT - #include "tvgGlRenderer.h" -#else - class GlRenderer : public RenderMethod - { - //Non Supported. Dummy Class */ - }; -#endif - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -struct GlCanvas::Impl -{ -}; - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -#ifdef THORVG_GL_RASTER_SUPPORT -GlCanvas::GlCanvas() : Canvas(GlRenderer::gen()), pImpl(new Impl) -#else -GlCanvas::GlCanvas() : Canvas(nullptr), pImpl(new Impl) -#endif -{ -} - - - -GlCanvas::~GlCanvas() -{ - delete(pImpl); -} - - -Result GlCanvas::target(int32_t id, uint32_t w, uint32_t h) noexcept -{ -#ifdef THORVG_GL_RASTER_SUPPORT - //We know renderer type, avoid dynamic_cast for performance. - auto renderer = static_cast(Canvas::pImpl->renderer); - if (!renderer) return Result::MemoryCorruption; - - if (!renderer->target(id, w, h)) return Result::Unknown; - Canvas::pImpl->vport = {0, 0, (int32_t)w, (int32_t)h}; - renderer->viewport(Canvas::pImpl->vport); - - //Paints must be updated again with this new target. - Canvas::pImpl->needRefresh(); - - return Result::Success; -#endif - return Result::NonSupport; -} - - -unique_ptr GlCanvas::gen() noexcept -{ -#ifdef THORVG_GL_RASTER_SUPPORT - if (GlRenderer::init() <= 0) return nullptr; - return unique_ptr(new GlCanvas); -#endif - return nullptr; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgInitializer.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgInitializer.cpp deleted file mode 100644 index 2506fd2..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgInitializer.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgCommon.h" -#include "tvgTaskScheduler.h" -#include "tvgLoader.h" - -#ifdef _WIN32 - #include -#endif - -#ifdef THORVG_SW_RASTER_SUPPORT - #include "tvgSwRenderer.h" -#endif - -#ifdef THORVG_GL_RASTER_SUPPORT - #include "tvgGlRenderer.h" -#endif - -#ifdef THORVG_WG_RASTER_SUPPORT - #include "tvgWgRenderer.h" -#endif - - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static int _initCnt = 0; -static uint16_t _version = 0; - -//enum class operation helper -static constexpr bool operator &(CanvasEngine a, CanvasEngine b) -{ - return int(a) & int(b); -} - -static bool _buildVersionInfo() -{ - auto SRC = THORVG_VERSION_STRING; //ex) 0.3.99 - auto p = SRC; - const char* x; - - char major[3]; - x = strchr(p, '.'); - if (!x) return false; - memcpy(major, p, x - p); - major[x - p] = '\0'; - p = x + 1; - - char minor[3]; - x = strchr(p, '.'); - if (!x) return false; - memcpy(minor, p, x - p); - minor[x - p] = '\0'; - p = x + 1; - - char micro[3]; - x = SRC + strlen(THORVG_VERSION_STRING); - memcpy(micro, p, x - p); - micro[x - p] = '\0'; - - char sum[7]; - snprintf(sum, sizeof(sum), "%s%s%s", major, minor, micro); - - _version = atoi(sum); - - return true; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -Result Initializer::init(CanvasEngine engine, uint32_t threads) noexcept -{ - auto nonSupport = true; - if (static_cast(engine) == 0) return Result::InvalidArguments; - - if (engine & CanvasEngine::Sw) { - #ifdef THORVG_SW_RASTER_SUPPORT - if (!SwRenderer::init(threads)) return Result::FailedAllocation; - nonSupport = false; - #endif - } - - if (engine & CanvasEngine::Gl) { - #ifdef THORVG_GL_RASTER_SUPPORT - if (!GlRenderer::init(threads)) return Result::FailedAllocation; - nonSupport = false; - #endif - } - - if (engine & CanvasEngine::Wg) { - #ifdef THORVG_WG_RASTER_SUPPORT - if (!WgRenderer::init(threads)) return Result::FailedAllocation; - nonSupport = false; - #endif - } - - if (nonSupport) return Result::NonSupport; - - if (_initCnt++ > 0) return Result::Success; - - if (!_buildVersionInfo()) return Result::Unknown; - - if (!LoaderMgr::init()) return Result::Unknown; - - TaskScheduler::init(threads); - - return Result::Success; -} - - -Result Initializer::term(CanvasEngine engine) noexcept -{ - if (_initCnt == 0) return Result::InsufficientCondition; - - auto nonSupport = true; - if (static_cast(engine) == 0) return Result::InvalidArguments; - - if (engine & CanvasEngine::Sw) { - #ifdef THORVG_SW_RASTER_SUPPORT - if (!SwRenderer::term()) return Result::InsufficientCondition; - nonSupport = false; - #endif - } - - if (engine & CanvasEngine::Gl) { - #ifdef THORVG_GL_RASTER_SUPPORT - if (!GlRenderer::term()) return Result::InsufficientCondition; - nonSupport = false; - #endif - } - - if (engine & CanvasEngine::Wg) { - #ifdef THORVG_WG_RASTER_SUPPORT - if (!WgRenderer::term()) return Result::InsufficientCondition; - nonSupport = false; - #endif - } - - if (nonSupport) return Result::NonSupport; - - if (--_initCnt > 0) return Result::Success; - - TaskScheduler::term(); - - if (!LoaderMgr::term()) return Result::Unknown; - - return Result::Success; -} - - -uint16_t THORVG_VERSION_NUMBER() -{ - return _version; -} - - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgInlist.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgInlist.h deleted file mode 100644 index eaedecc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgInlist.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_INLIST_H_ -#define _TVG_INLIST_H_ - -namespace tvg { - -//NOTE: declare this in your list item -#define INLIST_ITEM(T) \ - T* prev; \ - T* next - -template -struct Inlist -{ - T* head = nullptr; - T* tail = nullptr; - - void free() - { - while (head) { - auto t = head; - head = t->next; - delete(t); - } - head = tail = nullptr; - } - - void back(T* element) - { - if (tail) { - tail->next = element; - element->prev = tail; - element->next = nullptr; - tail = element; - } else { - head = tail = element; - element->prev = nullptr; - element->next = nullptr; - } - } - - void front(T* element) - { - if (head) { - head->prev = element; - element->prev = nullptr; - element->next = head; - head = element; - } else { - head = tail = element; - element->prev = nullptr; - element->next = nullptr; - } - } - - T* back() - { - if (!tail) return nullptr; - auto t = tail; - tail = t->prev; - if (!tail) head = nullptr; - return t; - } - - T* front() - { - if (!head) return nullptr; - auto t = head; - head = t->next; - if (!head) tail = nullptr; - return t; - } - - void remove(T* element) - { - if (element->prev) element->prev->next = element->next; - if (element->next) element->next->prev = element->prev; - if (element == head) head = element->next; - if (element == tail) tail = element->prev; - } - - bool empty() - { - return head ? false : true; - } -}; - -} - -#endif // _TVG_INLIST_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgIteratorAccessor.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgIteratorAccessor.h deleted file mode 100644 index adc5f6e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgIteratorAccessor.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2021 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_ITERATOR_ACCESSOR_H_ -#define _TVG_ITERATOR_ACCESSOR_H_ - -#include "tvgPaint.h" - -namespace tvg -{ - -class IteratorAccessor -{ -public: - //Utility Method: Iterator Accessor - static Iterator* iterator(const Paint* paint) - { - return paint->pImpl->iterator(); - } -}; - -} - -#endif //_TVG_ITERATOR_ACCESSOR_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLines.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLines.cpp deleted file mode 100644 index 3bdab76..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLines.cpp +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgMath.h" -#include "tvgLines.h" - -#define BEZIER_EPSILON 1e-2f - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static float _lineLengthApprox(const Point& pt1, const Point& pt2) -{ - /* approximate sqrt(x*x + y*y) using alpha max plus beta min algorithm. - With alpha = 1, beta = 3/8, giving results with the largest error less - than 7% compared to the exact value. */ - Point diff = {pt2.x - pt1.x, pt2.y - pt1.y}; - if (diff.x < 0) diff.x = -diff.x; - if (diff.y < 0) diff.y = -diff.y; - return (diff.x > diff.y) ? (diff.x + diff.y * 0.375f) : (diff.y + diff.x * 0.375f); -} - - -static float _lineLength(const Point& pt1, const Point& pt2) -{ - Point diff = {pt2.x - pt1.x, pt2.y - pt1.y}; - return sqrtf(diff.x * diff.x + diff.y * diff.y); -} - - -template -float _bezLength(const Bezier& cur, LengthFunc lineLengthFunc) -{ - Bezier left, right; - auto len = lineLengthFunc(cur.start, cur.ctrl1) + lineLengthFunc(cur.ctrl1, cur.ctrl2) + lineLengthFunc(cur.ctrl2, cur.end); - auto chord = lineLengthFunc(cur.start, cur.end); - - if (fabsf(len - chord) > BEZIER_EPSILON) { - tvg::bezSplit(cur, left, right); - return _bezLength(left, lineLengthFunc) + _bezLength(right, lineLengthFunc); - } - return len; -} - - -template -float _bezAt(const Bezier& bz, float at, float length, LengthFunc lineLengthFunc) -{ - auto biggest = 1.0f; - auto smallest = 0.0f; - auto t = 0.5f; - - //just in case to prevent an infinite loop - if (at <= 0) return 0.0f; - if (at >= length) return 1.0f; - - while (true) { - auto right = bz; - Bezier left; - bezSplitLeft(right, t, left); - length = _bezLength(left, lineLengthFunc); - if (fabsf(length - at) < BEZIER_EPSILON || fabsf(smallest - biggest) < BEZIER_EPSILON) { - break; - } - if (length < at) { - smallest = t; - t = (t + biggest) * 0.5f; - } else { - biggest = t; - t = (smallest + t) * 0.5f; - } - } - return t; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -namespace tvg -{ - -float lineLength(const Point& pt1, const Point& pt2) -{ - return _lineLength(pt1, pt2); -} - - -void lineSplitAt(const Line& cur, float at, Line& left, Line& right) -{ - auto len = lineLength(cur.pt1, cur.pt2); - auto dx = ((cur.pt2.x - cur.pt1.x) / len) * at; - auto dy = ((cur.pt2.y - cur.pt1.y) / len) * at; - left.pt1 = cur.pt1; - left.pt2.x = left.pt1.x + dx; - left.pt2.y = left.pt1.y + dy; - right.pt1 = left.pt2; - right.pt2 = cur.pt2; -} - - -void bezSplit(const Bezier& cur, Bezier& left, Bezier& right) -{ - auto c = (cur.ctrl1.x + cur.ctrl2.x) * 0.5f; - left.ctrl1.x = (cur.start.x + cur.ctrl1.x) * 0.5f; - right.ctrl2.x = (cur.ctrl2.x + cur.end.x) * 0.5f; - left.start.x = cur.start.x; - right.end.x = cur.end.x; - left.ctrl2.x = (left.ctrl1.x + c) * 0.5f; - right.ctrl1.x = (right.ctrl2.x + c) * 0.5f; - left.end.x = right.start.x = (left.ctrl2.x + right.ctrl1.x) * 0.5f; - - c = (cur.ctrl1.y + cur.ctrl2.y) * 0.5f; - left.ctrl1.y = (cur.start.y + cur.ctrl1.y) * 0.5f; - right.ctrl2.y = (cur.ctrl2.y + cur.end.y) * 0.5f; - left.start.y = cur.start.y; - right.end.y = cur.end.y; - left.ctrl2.y = (left.ctrl1.y + c) * 0.5f; - right.ctrl1.y = (right.ctrl2.y + c) * 0.5f; - left.end.y = right.start.y = (left.ctrl2.y + right.ctrl1.y) * 0.5f; -} - - -float bezLength(const Bezier& cur) -{ - return _bezLength(cur, _lineLength); -} - - -float bezLengthApprox(const Bezier& cur) -{ - return _bezLength(cur, _lineLengthApprox); -} - - -void bezSplitLeft(Bezier& cur, float at, Bezier& left) -{ - left.start = cur.start; - - left.ctrl1.x = cur.start.x + at * (cur.ctrl1.x - cur.start.x); - left.ctrl1.y = cur.start.y + at * (cur.ctrl1.y - cur.start.y); - - left.ctrl2.x = cur.ctrl1.x + at * (cur.ctrl2.x - cur.ctrl1.x); //temporary holding spot - left.ctrl2.y = cur.ctrl1.y + at * (cur.ctrl2.y - cur.ctrl1.y); //temporary holding spot - - cur.ctrl2.x = cur.ctrl2.x + at * (cur.end.x - cur.ctrl2.x); - cur.ctrl2.y = cur.ctrl2.y + at * (cur.end.y - cur.ctrl2.y); - - cur.ctrl1.x = left.ctrl2.x + at * (cur.ctrl2.x - left.ctrl2.x); - cur.ctrl1.y = left.ctrl2.y + at * (cur.ctrl2.y - left.ctrl2.y); - - left.ctrl2.x = left.ctrl1.x + at * (left.ctrl2.x - left.ctrl1.x); - left.ctrl2.y = left.ctrl1.y + at * (left.ctrl2.y - left.ctrl1.y); - - left.end.x = cur.start.x = left.ctrl2.x + at * (cur.ctrl1.x - left.ctrl2.x); - left.end.y = cur.start.y = left.ctrl2.y + at * (cur.ctrl1.y - left.ctrl2.y); -} - - -float bezAt(const Bezier& bz, float at, float length) -{ - return _bezAt(bz, at, length, _lineLength); -} - - -float bezAtApprox(const Bezier& bz, float at, float length) -{ - return _bezAt(bz, at, length, _lineLengthApprox); -} - - -void bezSplitAt(const Bezier& cur, float at, Bezier& left, Bezier& right) -{ - right = cur; - auto t = bezAt(right, at, bezLength(right)); - bezSplitLeft(right, t, left); -} - - -Point bezPointAt(const Bezier& bz, float t) -{ - Point cur; - auto it = 1.0f - t; - - auto ax = bz.start.x * it + bz.ctrl1.x * t; - auto bx = bz.ctrl1.x * it + bz.ctrl2.x * t; - auto cx = bz.ctrl2.x * it + bz.end.x * t; - ax = ax * it + bx * t; - bx = bx * it + cx * t; - cur.x = ax * it + bx * t; - - float ay = bz.start.y * it + bz.ctrl1.y * t; - float by = bz.ctrl1.y * it + bz.ctrl2.y * t; - float cy = bz.ctrl2.y * it + bz.end.y * t; - ay = ay * it + by * t; - by = by * it + cy * t; - cur.y = ay * it + by * t; - - return cur; -} - - -float bezAngleAt(const Bezier& bz, float t) -{ - if (t < 0 || t > 1) return 0; - - //derivate - // p'(t) = 3 * (-(1-2t+t^2) * p0 + (1 - 4 * t + 3 * t^2) * p1 + (2 * t - 3 * - // t^2) * p2 + t^2 * p3) - float mt = 1.0f - t; - float d = t * t; - float a = -mt * mt; - float b = 1 - 4 * t + 3 * d; - float c = 2 * t - 3 * d; - - Point pt ={a * bz.start.x + b * bz.ctrl1.x + c * bz.ctrl2.x + d * bz.end.x, a * bz.start.y + b * bz.ctrl1.y + c * bz.ctrl2.y + d * bz.end.y}; - pt.x *= 3; - pt.y *= 3; - - return mathRad2Deg(atan2(pt.x, pt.y)); -} - -} - -#endif /* LV_USE_THORVG_INTERNAL */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLines.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLines.h deleted file mode 100644 index 804ced1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLines.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_LINES_H_ -#define _TVG_LINES_H_ - -#include "tvgCommon.h" - -namespace tvg -{ - -struct Line -{ - Point pt1; - Point pt2; -}; - -float lineLength(const Point& pt1, const Point& pt2); -void lineSplitAt(const Line& cur, float at, Line& left, Line& right); - - -struct Bezier -{ - Point start; - Point ctrl1; - Point ctrl2; - Point end; -}; - -void bezSplit(const Bezier&cur, Bezier& left, Bezier& right); -float bezLength(const Bezier& cur); -void bezSplitLeft(Bezier& cur, float at, Bezier& left); -float bezAt(const Bezier& bz, float at, float length); -void bezSplitAt(const Bezier& cur, float at, Bezier& left, Bezier& right); -Point bezPointAt(const Bezier& bz, float t); -float bezAngleAt(const Bezier& bz, float t); - -float bezLengthApprox(const Bezier& cur); -float bezAtApprox(const Bezier& bz, float at, float length); -} - -#endif //_TVG_LINES_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLoadModule.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLoadModule.h deleted file mode 100644 index 210995f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLoadModule.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_LOAD_MODULE_H_ -#define _TVG_LOAD_MODULE_H_ - -#include "tvgRender.h" -#include "tvgInlist.h" - - -struct LoadModule -{ - INLIST_ITEM(LoadModule); - - //Use either hashkey(data) or hashpath(path) - union { - uintptr_t hashkey; - char* hashpath = nullptr; - }; - - FileType type; //current loader file type - uint16_t sharing = 0; //reference count - bool readied = false; //read done already. - bool pathcache = false; //cached by path - - LoadModule(FileType type) : type(type) {} - virtual ~LoadModule() - { - if (pathcache) free(hashpath); - } - - virtual bool open(const string& path) { return false; } - virtual bool open(const char* data, uint32_t size, bool copy) { return false; } - virtual bool resize(Paint* paint, float w, float h) { return false; } - virtual void sync() {}; //finish immediately if any async update jobs. - - virtual bool read() - { - if (readied) return false; - readied = true; - return true; - } - - bool cached() - { - if (hashkey) return true; - return false; - } - - virtual bool close() - { - if (sharing == 0) return true; - --sharing; - return false; - } -}; - - -struct ImageLoader : LoadModule -{ - static ColorSpace cs; //desired value - - float w = 0, h = 0; //default image size - Surface surface; - - ImageLoader(FileType type) : LoadModule(type) {} - - virtual bool animatable() { return false; } //true if this loader supports animation. - virtual Paint* paint() { return nullptr; } - - virtual Surface* bitmap() - { - if (surface.data) return &surface; - return nullptr; - } -}; - - -struct FontLoader : LoadModule -{ - float scale = 1.0f; - - FontLoader(FileType type) : LoadModule(type) {} - - virtual bool request(Shape* shape, char* text, bool italic = false) = 0; -}; - -#endif //_TVG_LOAD_MODULE_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLoader.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLoader.cpp deleted file mode 100644 index 8d1a3c5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLoader.cpp +++ /dev/null @@ -1,441 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include - -#include "tvgInlist.h" -#include "tvgLoader.h" -#include "tvgLock.h" - -#ifdef THORVG_SVG_LOADER_SUPPORT - #include "tvgSvgLoader.h" -#endif - -#ifdef THORVG_PNG_LOADER_SUPPORT - #include "tvgPngLoader.h" -#endif - -#ifdef THORVG_TVG_LOADER_SUPPORT - #include "tvgTvgLoader.h" -#endif - -#ifdef THORVG_JPG_LOADER_SUPPORT - #include "tvgJpgLoader.h" -#endif - -#ifdef THORVG_WEBP_LOADER_SUPPORT - #include "tvgWebpLoader.h" -#endif - -#ifdef THORVG_TTF_LOADER_SUPPORT - #include "tvgTtfLoader.h" -#endif - -#ifdef THORVG_LOTTIE_LOADER_SUPPORT - #include "tvgLottieLoader.h" -#endif - -#include "tvgRawLoader.h" - - -uintptr_t HASH_KEY(const char* data) -{ - return reinterpret_cast(data); -} - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -ColorSpace ImageLoader::cs = ColorSpace::ARGB8888; - -static Key key; -static Inlist _activeLoaders; - - -static LoadModule* _find(FileType type) -{ - switch(type) { - case FileType::Png: { -#ifdef THORVG_PNG_LOADER_SUPPORT - return new PngLoader; -#endif - break; - } - case FileType::Jpg: { -#ifdef THORVG_JPG_LOADER_SUPPORT - return new JpgLoader; -#endif - break; - } - case FileType::Webp: { -#ifdef THORVG_WEBP_LOADER_SUPPORT - return new WebpLoader; -#endif - break; - } - case FileType::Tvg: { -#ifdef THORVG_TVG_LOADER_SUPPORT - return new TvgLoader; -#endif - break; - } - case FileType::Svg: { -#ifdef THORVG_SVG_LOADER_SUPPORT - return new SvgLoader; -#endif - break; - } - case FileType::Ttf: { -#ifdef THORVG_TTF_LOADER_SUPPORT - return new TtfLoader; -#endif - break; - } - case FileType::Lottie: { -#ifdef THORVG_LOTTIE_LOADER_SUPPORT - return new LottieLoader; -#endif - break; - } - case FileType::Raw: { - return new RawLoader; - break; - } - default: { - break; - } - } - -#ifdef THORVG_LOG_ENABLED - const char *format; - switch(type) { - case FileType::Tvg: { - format = "TVG"; - break; - } - case FileType::Svg: { - format = "SVG"; - break; - } - case FileType::Ttf: { - format = "TTF"; - break; - } - case FileType::Lottie: { - format = "lottie(json)"; - break; - } - case FileType::Raw: { - format = "RAW"; - break; - } - case FileType::Png: { - format = "PNG"; - break; - } - case FileType::Jpg: { - format = "JPG"; - break; - } - case FileType::Webp: { - format = "WEBP"; - break; - } - default: { - format = "???"; - break; - } - } - TVGLOG("RENDERER", "%s format is not supported", format); -#endif - return nullptr; -} - - -static LoadModule* _findByPath(const string& path) -{ - auto ext = path.substr(path.find_last_of(".") + 1); - if (!ext.compare("tvg")) return _find(FileType::Tvg); - if (!ext.compare("svg")) return _find(FileType::Svg); - if (!ext.compare("json")) return _find(FileType::Lottie); - if (!ext.compare("png")) return _find(FileType::Png); - if (!ext.compare("jpg")) return _find(FileType::Jpg); - if (!ext.compare("webp")) return _find(FileType::Webp); - if (!ext.compare("ttf") || !ext.compare("ttc")) return _find(FileType::Ttf); - if (!ext.compare("otf") || !ext.compare("otc")) return _find(FileType::Ttf); - return nullptr; -} - - -static FileType _convert(const string& mimeType) -{ - auto type = FileType::Unknown; - - if (mimeType == "tvg") type = FileType::Tvg; - else if (mimeType == "svg" || mimeType == "svg+xml") type = FileType::Svg; - else if (mimeType == "ttf" || mimeType == "otf") type = FileType::Ttf; - else if (mimeType == "lottie") type = FileType::Lottie; - else if (mimeType == "raw") type = FileType::Raw; - else if (mimeType == "png") type = FileType::Png; - else if (mimeType == "jpg" || mimeType == "jpeg") type = FileType::Jpg; - else if (mimeType == "webp") type = FileType::Webp; - else TVGLOG("RENDERER", "Given mimetype is unknown = \"%s\".", mimeType.c_str()); - - return type; -} - - -static LoadModule* _findByType(const string& mimeType) -{ - return _find(_convert(mimeType)); -} - - -static LoadModule* _findFromCache(const string& path) -{ - ScopedLock lock(key); - - auto loader = _activeLoaders.head; - - while (loader) { - if (loader->pathcache && !strcmp(loader->hashpath, path.c_str())) { - ++loader->sharing; - return loader; - } - loader = loader->next; - } - return nullptr; -} - - -static LoadModule* _findFromCache(const char* data, uint32_t size, const string& mimeType) -{ - auto type = _convert(mimeType); - if (type == FileType::Unknown) return nullptr; - - ScopedLock lock(key); - auto loader = _activeLoaders.head; - - auto key = HASH_KEY(data); - - while (loader) { - if (loader->type == type && loader->hashkey == key) { - ++loader->sharing; - return loader; - } - loader = loader->next; - } - return nullptr; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - - -bool LoaderMgr::init() -{ - return true; -} - - -bool LoaderMgr::term() -{ - auto loader = _activeLoaders.head; - - //clean up the remained font loaders which is globally used. - while (loader && loader->type == FileType::Ttf) { - auto ret = loader->close(); - auto tmp = loader; - loader = loader->next; - _activeLoaders.remove(tmp); - if (ret) delete(tmp); - } - return true; -} - - -bool LoaderMgr::retrieve(LoadModule* loader) -{ - if (!loader) return false; - if (loader->close()) { - if (loader->cached()) { - ScopedLock lock(key); - _activeLoaders.remove(loader); - } - delete(loader); - } - return true; -} - - -LoadModule* LoaderMgr::loader(const string& path, bool* invalid) -{ - *invalid = false; - - //TODO: lottie is not sharable. - auto allowCache = true; - auto ext = path.substr(path.find_last_of(".") + 1); - if (!ext.compare("json")) allowCache = false; - - if (allowCache) { - if (auto loader = _findFromCache(path)) return loader; - } - - if (auto loader = _findByPath(path)) { - if (loader->open(path)) { - if (allowCache) { - loader->hashpath = strdup(path.c_str()); - loader->pathcache = true; - { - ScopedLock lock(key); - _activeLoaders.back(loader); - } - } - return loader; - } - delete(loader); - } - //Unknown MimeType. Try with the candidates in the order - for (int i = 0; i < static_cast(FileType::Raw); i++) { - if (auto loader = _find(static_cast(i))) { - if (loader->open(path)) { - if (allowCache) { - loader->hashpath = strdup(path.c_str()); - loader->pathcache = true; - { - ScopedLock lock(key); - _activeLoaders.back(loader); - } - } - return loader; - } - delete(loader); - } - } - *invalid = true; - return nullptr; -} - - -bool LoaderMgr::retrieve(const string& path) -{ - return retrieve(_findFromCache(path)); -} - - -LoadModule* LoaderMgr::loader(const char* key) -{ - auto loader = _activeLoaders.head; - - while (loader) { - if (loader->pathcache && strstr(loader->hashpath, key)) { - ++loader->sharing; - return loader; - } - loader = loader->next; - } - return nullptr; -} - - -LoadModule* LoaderMgr::loader(const char* data, uint32_t size, const string& mimeType, bool copy) -{ - //Note that users could use the same data pointer with the different content. - //Thus caching is only valid for shareable. - auto allowCache = !copy; - - //TODO: lottie is not sharable. - if (allowCache) { - auto type = _convert(mimeType); - if (type == FileType::Lottie) allowCache = false; - } - - if (allowCache) { - if (auto loader = _findFromCache(data, size, mimeType)) return loader; - } - - //Try with the given MimeType - if (!mimeType.empty()) { - if (auto loader = _findByType(mimeType)) { - if (loader->open(data, size, copy)) { - if (allowCache) { - loader->hashkey = HASH_KEY(data); - ScopedLock lock(key); - _activeLoaders.back(loader); - } - return loader; - } else { - TVGLOG("LOADER", "Given mimetype \"%s\" seems incorrect or not supported.", mimeType.c_str()); - delete(loader); - } - } - } - //Unknown MimeType. Try with the candidates in the order - for (int i = 0; i < static_cast(FileType::Raw); i++) { - auto loader = _find(static_cast(i)); - if (loader) { - if (loader->open(data, size, copy)) { - if (allowCache) { - loader->hashkey = HASH_KEY(data); - ScopedLock lock(key); - _activeLoaders.back(loader); - } - return loader; - } - delete(loader); - } - } - return nullptr; -} - - -LoadModule* LoaderMgr::loader(const uint32_t *data, uint32_t w, uint32_t h, bool copy) -{ - //Note that users could use the same data pointer with the different content. - //Thus caching is only valid for shareable. - if (!copy) { - //TODO: should we check premultiplied?? - if (auto loader = _findFromCache((const char*)(data), w * h, "raw")) return loader; - } - - //function is dedicated for raw images only - auto loader = new RawLoader; - if (loader->open(data, w, h, copy)) { - if (!copy) { - loader->hashkey = HASH_KEY((const char*)data); - ScopedLock lock(key); - _activeLoaders.back(loader); - } - return loader; - } - delete(loader); - return nullptr; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLoader.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLoader.h deleted file mode 100644 index 5067699..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLoader.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_LOADER_H_ -#define _TVG_LOADER_H_ - -#include "tvgLoadModule.h" - -struct LoaderMgr -{ - static bool init(); - static bool term(); - static LoadModule* loader(const string& path, bool* invalid); - static LoadModule* loader(const char* data, uint32_t size, const string& mimeType, bool copy); - static LoadModule* loader(const uint32_t* data, uint32_t w, uint32_t h, bool copy); - static LoadModule* loader(const char* key); - static bool retrieve(const string& path); - static bool retrieve(LoadModule* loader); -}; - -#endif //_TVG_LOADER_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLock.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLock.h deleted file mode 100644 index 709c120..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLock.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_LOCK_H_ -#define _TVG_LOCK_H_ - -#ifdef THORVG_THREAD_SUPPORT - -#include - -namespace tvg { - - struct Key - { - std::mutex mtx; - }; - - struct ScopedLock - { - Key* key = nullptr; - - ScopedLock(Key& k) - { - k.mtx.lock(); - key = &k; - } - - ~ScopedLock() - { - key->mtx.unlock(); - } - }; - -} - -#else //THORVG_THREAD_SUPPORT - -namespace tvg { - - struct Key {}; - - struct ScopedLock - { - ScopedLock(Key& key) {} - }; - -} - -#endif //THORVG_THREAD_SUPPORT - -#endif //_TVG_LOCK_H_ - - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieAnimation.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieAnimation.cpp deleted file mode 100644 index 69818b3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieAnimation.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgCommon.h" -#include "thorvg_lottie.h" -#include "tvgLottieLoader.h" -#include "tvgAnimation.h" - - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -LottieAnimation::~LottieAnimation() -{ -} - - -Result LottieAnimation::override(const char* slot) noexcept -{ - if (!pImpl->picture->pImpl->loader) return Result::InsufficientCondition; - - if (static_cast(pImpl->picture->pImpl->loader)->override(slot)) { - return Result::Success; - } - - return Result::InvalidArguments; -} - - -Result LottieAnimation::segment(const char* marker) noexcept -{ - auto loader = pImpl->picture->pImpl->loader; - if (!loader) return Result::InsufficientCondition; - if (!loader->animatable()) return Result::NonSupport; - - if (!marker) { - static_cast(loader)->segment(0.0f, 1.0f); - return Result::Success; - } - - float begin, end; - if (!static_cast(loader)->segment(marker, begin, end)) { - return Result::InvalidArguments; - } - return static_cast(this)->segment(begin, end); -} - - -uint32_t LottieAnimation::markersCnt() noexcept -{ - auto loader = pImpl->picture->pImpl->loader; - if (!loader || !loader->animatable()) return 0; - return static_cast(loader)->markersCnt(); -} - - -const char* LottieAnimation::marker(uint32_t idx) noexcept -{ - auto loader = pImpl->picture->pImpl->loader; - if (!loader || !loader->animatable()) return nullptr; - return static_cast(loader)->markers(idx); -} - - -unique_ptr LottieAnimation::gen() noexcept -{ - return unique_ptr(new LottieAnimation); -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieBuilder.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieBuilder.cpp deleted file mode 100644 index 82a43cf..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieBuilder.cpp +++ /dev/null @@ -1,1378 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include - -#include "tvgCommon.h" -#include "tvgMath.h" -#include "tvgPaint.h" -#include "tvgShape.h" -#include "tvgInlist.h" -#include "tvgTaskScheduler.h" -#include "tvgLottieModel.h" -#include "tvgLottieBuilder.h" -#include "tvgLottieExpressions.h" - - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -struct RenderRepeater -{ - int cnt; - float offset; - Point position; - Point anchor; - Point scale; - float rotation; - uint8_t startOpacity; - uint8_t endOpacity; - bool interpOpacity; - bool inorder; -}; - - -struct RenderContext -{ - INLIST_ITEM(RenderContext); - - Shape* propagator = nullptr; - Shape* merging = nullptr; //merging shapes if possible (if shapes have same properties) - LottieObject** begin = nullptr; //iteration entry point - RenderRepeater* repeater = nullptr; - Matrix* transform = nullptr; - float roundness = 0.0f; - bool fragmenting = false; //render context has been fragmented by filling - bool reqFragment = false; //requirement to fragment the render context - bool ownPropagator = true; //this rendering context shares the propagator - - RenderContext() - { - propagator = Shape::gen().release(); - } - - ~RenderContext() - { - if (ownPropagator) delete(propagator); - delete(repeater); - free(transform); - } - - RenderContext(const RenderContext& rhs, bool mergeable = false) - { - if (mergeable) { - this->ownPropagator = false; - propagator = rhs.propagator; - merging = rhs.merging; - } else { - propagator = static_cast(rhs.propagator->duplicate()); - } - - if (rhs.repeater) { - repeater = new RenderRepeater(); - *repeater = *rhs.repeater; - } - roundness = rhs.roundness; - } -}; - - -static void _updateChildren(LottieGroup* parent, float frameNo, Inlist& contexts, LottieExpressions* exps); -static void _updateLayer(LottieLayer* root, LottieLayer* layer, float frameNo, LottieExpressions* exps); -static bool _buildComposition(LottieComposition* comp, LottieGroup* parent); -static Shape* _draw(LottieGroup* parent, RenderContext* ctx); - -static void _rotateX(Matrix* m, float degree) -{ - if (degree == 0.0f) return; - auto radian = mathDeg2Rad(degree); - m->e22 *= cosf(radian); -} - - -static void _rotateY(Matrix* m, float degree) -{ - if (degree == 0.0f) return; - auto radian = mathDeg2Rad(degree); - m->e11 *= cosf(radian); -} - - -static void _rotationZ(Matrix* m, float degree) -{ - if (degree == 0.0f) return; - auto radian = mathDeg2Rad(degree); - m->e11 = cosf(radian); - m->e12 = -sinf(radian); - m->e21 = sinf(radian); - m->e22 = cosf(radian); -} - - -static void _skew(Matrix* m, float angleDeg, float axisDeg) -{ - auto angle = -mathDeg2Rad(angleDeg); - float tanVal = tanf(angle); - - axisDeg = fmod(axisDeg, 180.0f); - if (fabsf(axisDeg) < 0.01f || fabsf(axisDeg - 180.0f) < 0.01f || fabsf(axisDeg + 180.0f) < 0.01f) { - float cosVal = cosf(mathDeg2Rad(axisDeg)); - auto B = cosVal * cosVal * tanVal; - m->e12 += B * m->e11; - m->e22 += B * m->e21; - return; - } else if (fabsf(axisDeg - 90.0f) < 0.01f || fabsf(axisDeg + 90.0f) < 0.01f) { - float sinVal = -sinf(mathDeg2Rad(axisDeg)); - auto C = sinVal * sinVal * tanVal; - m->e11 -= C * m->e12; - m->e21 -= C * m->e22; - return; - } - - auto axis = -mathDeg2Rad(axisDeg); - float cosVal = cosf(axis); - float sinVal = sinf(axis); - auto A = sinVal * cosVal * tanVal; - auto B = cosVal * cosVal * tanVal; - auto C = sinVal * sinVal * tanVal; - - auto e11 = m->e11; - auto e21 = m->e21; - m->e11 = (1.0f - A) * e11 - C * m->e12; - m->e12 = B * e11 + (1.0f + A) * m->e12; - m->e21 = (1.0f - A) * e21 - C * m->e22; - m->e22 = B * e21 + (1.0f + A) * m->e22; -} - - -static bool _updateTransform(LottieTransform* transform, float frameNo, bool autoOrient, Matrix& matrix, uint8_t& opacity, LottieExpressions* exps) -{ - mathIdentity(&matrix); - - if (!transform) { - opacity = 255; - return false; - } - - if (transform->coords) { - mathTranslate(&matrix, transform->coords->x(frameNo), transform->coords->y(frameNo)); - } else { - auto position = transform->position(frameNo, exps); - mathTranslate(&matrix, position.x, position.y); - } - - auto angle = 0.0f; - if (autoOrient) angle = transform->position.angle(frameNo); - _rotationZ(&matrix, transform->rotation(frameNo, exps) + angle); - - if (transform->rotationEx) { - _rotateY(&matrix, transform->rotationEx->y(frameNo, exps)); - _rotateX(&matrix, transform->rotationEx->x(frameNo, exps)); - } - - auto skewAngle = transform->skewAngle(frameNo, exps); - if (skewAngle != 0.0f) { - // For angles where tangent explodes, the shape degenerates into an infinitely thin line. - // This is handled by zeroing out the matrix due to finite numerical precision. - skewAngle = fmod(skewAngle, 180.0f); - if (fabsf(skewAngle - 90.0f) < 0.01f || fabsf(skewAngle + 90.0f) < 0.01f) return false; - _skew(&matrix, skewAngle, transform->skewAxis(frameNo, exps)); - } - - auto scale = transform->scale(frameNo, exps); - mathScaleR(&matrix, scale.x * 0.01f, scale.y * 0.01f); - - //Lottie specific anchor transform. - auto anchor = transform->anchor(frameNo, exps); - mathTranslateR(&matrix, -anchor.x, -anchor.y); - - //invisible just in case. - if (scale.x == 0.0f || scale.y == 0.0f) opacity = 0; - else opacity = transform->opacity(frameNo, exps); - - return true; -} - - -static void _updateTransform(LottieLayer* layer, float frameNo, LottieExpressions* exps) -{ - if (!layer || mathEqual(layer->cache.frameNo, frameNo)) return; - - auto transform = layer->transform; - auto parent = layer->parent; - - if (parent) _updateTransform(parent, frameNo, exps); - - auto& matrix = layer->cache.matrix; - - _updateTransform(transform, frameNo, layer->autoOrient, matrix, layer->cache.opacity, exps); - - if (parent) { - if (!mathIdentity((const Matrix*) &parent->cache.matrix)) { - if (mathIdentity((const Matrix*) &matrix)) layer->cache.matrix = parent->cache.matrix; - else layer->cache.matrix = mathMultiply(&parent->cache.matrix, &matrix); - } - } - layer->cache.frameNo = frameNo; -} - - -static void _updateTransform(LottieGroup* parent, LottieObject** child, float frameNo, TVG_UNUSED Inlist& contexts, RenderContext* ctx, LottieExpressions* exps) -{ - auto transform = static_cast(*child); - if (!transform) return; - - uint8_t opacity; - - if (parent->mergeable()) { - if (!ctx->transform) ctx->transform = (Matrix*)malloc(sizeof(Matrix)); - _updateTransform(transform, frameNo, false, *ctx->transform, opacity, exps); - return; - } - - ctx->merging = nullptr; - - Matrix matrix; - if (!_updateTransform(transform, frameNo, false, matrix, opacity, exps)) return; - - auto pmatrix = PP(ctx->propagator)->transform(); - ctx->propagator->transform(pmatrix ? mathMultiply(pmatrix, &matrix) : matrix); - ctx->propagator->opacity(MULTIPLY(opacity, PP(ctx->propagator)->opacity)); - - //FIXME: preserve the stroke width. too workaround, need a better design. - if (P(ctx->propagator)->rs.strokeWidth() > 0.0f) { - auto denominator = sqrtf(matrix.e11 * matrix.e11 + matrix.e12 * matrix.e12); - if (denominator > 1.0f) ctx->propagator->stroke(ctx->propagator->strokeWidth() / denominator); - } -} - - -static void _updateGroup(LottieGroup* parent, LottieObject** child, float frameNo, TVG_UNUSED Inlist& pcontexts, RenderContext* ctx, LottieExpressions* exps) -{ - auto group = static_cast(*child); - - if (group->children.empty()) return; - - //Prepare render data - group->scene = parent->scene; - group->reqFragment |= ctx->reqFragment; - - //generate a merging shape to consolidate partial shapes into a single entity - if (group->mergeable()) _draw(parent, ctx); - - Inlist contexts; - contexts.back(new RenderContext(*ctx, group->mergeable())); - - _updateChildren(group, frameNo, contexts, exps); - - contexts.free(); -} - - -static void _updateStroke(LottieStroke* stroke, float frameNo, RenderContext* ctx, LottieExpressions* exps) -{ - ctx->propagator->stroke(stroke->width(frameNo, exps)); - ctx->propagator->stroke(stroke->cap); - ctx->propagator->stroke(stroke->join); - ctx->propagator->strokeMiterlimit(stroke->miterLimit); - - if (stroke->dashattr) { - float dashes[2]; - dashes[0] = stroke->dashSize(frameNo, exps); - dashes[1] = dashes[0] + stroke->dashGap(frameNo, exps); - P(ctx->propagator)->strokeDash(dashes, 2, stroke->dashOffset(frameNo, exps)); - } else { - ctx->propagator->stroke(nullptr, 0); - } -} - - -static bool _fragmented(LottieObject** child, Inlist& contexts, RenderContext* ctx) -{ - if (!ctx->reqFragment) return false; - if (ctx->fragmenting) return true; - - contexts.back(new RenderContext(*ctx)); - auto fragment = contexts.tail; - fragment->begin = child - 1; - ctx->fragmenting = true; - - return false; -} - - -static void _updateSolidStroke(TVG_UNUSED LottieGroup* parent, LottieObject** child, float frameNo, Inlist& contexts, RenderContext* ctx, LottieExpressions* exps) -{ - if (_fragmented(child, contexts, ctx)) return; - - auto stroke = static_cast(*child); - - ctx->merging = nullptr; - auto color = stroke->color(frameNo, exps); - ctx->propagator->stroke(color.rgb[0], color.rgb[1], color.rgb[2], stroke->opacity(frameNo, exps)); - _updateStroke(static_cast(stroke), frameNo, ctx, exps); -} - - -static void _updateGradientStroke(TVG_UNUSED LottieGroup* parent, LottieObject** child, float frameNo, Inlist& contexts, RenderContext* ctx, LottieExpressions* exps) -{ - if (_fragmented(child, contexts, ctx)) return; - - auto stroke = static_cast(*child); - - ctx->merging = nullptr; - ctx->propagator->stroke(unique_ptr(stroke->fill(frameNo, exps))); - _updateStroke(static_cast(stroke), frameNo, ctx, exps); -} - - -static void _updateSolidFill(TVG_UNUSED LottieGroup* parent, LottieObject** child, float frameNo, TVG_UNUSED Inlist& contexts, RenderContext* ctx, LottieExpressions* exps) -{ - if (_fragmented(child, contexts, ctx)) return; - - auto fill = static_cast(*child); - - ctx->merging = nullptr; - auto color = fill->color(frameNo); - ctx->propagator->fill(color.rgb[0], color.rgb[1], color.rgb[2], fill->opacity(frameNo, exps)); - ctx->propagator->fill(fill->rule); - - if (ctx->propagator->strokeWidth() > 0) ctx->propagator->order(true); -} - - -static void _updateGradientFill(TVG_UNUSED LottieGroup* parent, LottieObject** child, float frameNo, TVG_UNUSED Inlist& contexts, RenderContext* ctx, LottieExpressions* exps) -{ - if (_fragmented(child, contexts, ctx)) return; - - auto fill = static_cast(*child); - - ctx->merging = nullptr; - //TODO: reuse the fill instance? - ctx->propagator->fill(unique_ptr(fill->fill(frameNo, exps))); - ctx->propagator->fill(fill->rule); - ctx->propagator->opacity(MULTIPLY(fill->opacity(frameNo), PP(ctx->propagator)->opacity)); - - if (ctx->propagator->strokeWidth() > 0) ctx->propagator->order(true); -} - - -static Shape* _draw(LottieGroup* parent, RenderContext* ctx) -{ - if (ctx->merging) return ctx->merging; - - auto shape = cast(ctx->propagator->duplicate()); - ctx->merging = shape.get(); - parent->scene->push(std::move(shape)); - - return ctx->merging; -} - - -//OPTIMIZE: path? -static void _repeat(LottieGroup* parent, unique_ptr path, RenderContext* ctx) -{ - auto repeater = ctx->repeater; - - Array shapes(repeater->cnt); - - for (int i = 0; i < repeater->cnt; ++i) { - auto multiplier = repeater->offset + static_cast(i); - - auto shape = static_cast(ctx->propagator->duplicate()); - P(shape)->rs.path = P(path.get())->rs.path; - - auto opacity = repeater->interpOpacity ? mathLerp(repeater->startOpacity, repeater->endOpacity, static_cast(i + 1) / repeater->cnt) : repeater->startOpacity; - shape->opacity(opacity); - - Matrix m; - mathIdentity(&m); - mathTranslate(&m, repeater->position.x * multiplier + repeater->anchor.x, repeater->position.y * multiplier + repeater->anchor.y); - mathScale(&m, powf(repeater->scale.x * 0.01f, multiplier), powf(repeater->scale.y * 0.01f, multiplier)); - mathRotate(&m, repeater->rotation * multiplier); - mathTranslateR(&m, -repeater->anchor.x, -repeater->anchor.y); - - auto pm = PP(shape)->transform(); - shape->transform(pm ? mathMultiply(&m, pm) : m); - - if (ctx->roundness > 1.0f && P(shape)->rs.stroke) { - TVGERR("LOTTIE", "FIXME: Path roundness should be applied properly!"); - P(shape)->rs.stroke->join = StrokeJoin::Round; - } - - shapes.push(shape); - } - - //push repeat shapes in order. - if (repeater->inorder) { - for (auto shape = shapes.begin(); shape < shapes.end(); ++shape) { - parent->scene->push(cast(*shape)); - } - } else { - for (auto shape = shapes.end() - 1; shape >= shapes.begin(); --shape) { - parent->scene->push(cast(*shape)); - } - } -} - - -static void _appendRect(Shape* shape, float x, float y, float w, float h, float r, Matrix* transform) -{ - //sharp rect - if (mathZero(r)) { - PathCommand commands[] = { - PathCommand::MoveTo, PathCommand::LineTo, PathCommand::LineTo, - PathCommand::LineTo, PathCommand::Close - }; - - Point points[] = {{x + w, y}, {x + w, y + h}, {x, y + h}, {x, y}}; - if (transform) { - for (int i = 0; i < 4; i++) mathTransform(transform, &points[i]); - } - shape->appendPath(commands, 5, points, 4); - //round rect - } else { - PathCommand commands[] = { - PathCommand::MoveTo, PathCommand::LineTo, PathCommand::CubicTo, - PathCommand::LineTo, PathCommand::CubicTo, PathCommand::LineTo, - PathCommand::CubicTo, PathCommand::LineTo, PathCommand::CubicTo, - PathCommand::Close - }; - - auto halfW = w * 0.5f; - auto halfH = h * 0.5f; - auto rx = r > halfW ? halfW : r; - auto ry = r > halfH ? halfH : r; - auto hrx = rx * PATH_KAPPA; - auto hry = ry * PATH_KAPPA; - - constexpr int ptsCnt = 17; - Point points[ptsCnt] = { - {x + w, y + ry}, //moveTo - {x + w, y + h - ry}, //lineTo - {x + w, y + h - ry + hry}, {x + w - rx + hrx, y + h}, {x + w - rx, y + h}, //cubicTo - {x + rx, y + h}, //lineTo - {x + rx - hrx, y + h}, {x, y + h - ry + hry}, {x, y + h - ry}, //cubicTo - {x, y + ry}, //lineTo - {x, y + ry - hry}, {x + rx - hrx, y}, {x + rx, y}, //cubicTo - {x + w - rx, y}, //lineTo - {x + w - rx + hrx, y}, {x + w, y + ry - hry}, {x + w, y + ry} //cubicTo - }; - - if (transform) { - for (int i = 0; i < ptsCnt; i++) mathTransform(transform, &points[i]); - } - shape->appendPath(commands, 10, points, ptsCnt); - } -} - -static void _updateRect(LottieGroup* parent, LottieObject** child, float frameNo, TVG_UNUSED Inlist& contexts, RenderContext* ctx, LottieExpressions* exps) -{ - auto rect = static_cast(*child); - - auto position = rect->position(frameNo, exps); - auto size = rect->size(frameNo, exps); - auto roundness = rect->radius(frameNo, exps); - if (ctx->roundness > roundness) roundness = ctx->roundness; - - if (roundness > ROUNDNESS_EPSILON) { - if (roundness > size.x * 0.5f) roundness = size.x * 0.5f; - if (roundness > size.y * 0.5f) roundness = size.y * 0.5f; - } - - if (ctx->repeater) { - auto path = Shape::gen(); - _appendRect(path.get(), position.x - size.x * 0.5f, position.y - size.y * 0.5f, size.x, size.y, roundness, ctx->transform); - _repeat(parent, std::move(path), ctx); - } else { - auto merging = _draw(parent, ctx); - _appendRect(merging, position.x - size.x * 0.5f, position.y - size.y * 0.5f, size.x, size.y, roundness, ctx->transform); - } -} - - -static void _appendCircle(Shape* shape, float cx, float cy, float rx, float ry, Matrix* transform) -{ - auto rxKappa = rx * PATH_KAPPA; - auto ryKappa = ry * PATH_KAPPA; - - constexpr int cmdsCnt = 6; - PathCommand commands[cmdsCnt] = { - PathCommand::MoveTo, PathCommand::CubicTo, PathCommand::CubicTo, - PathCommand::CubicTo, PathCommand::CubicTo, PathCommand::Close - }; - - constexpr int ptsCnt = 13; - Point points[ptsCnt] = { - {cx, cy - ry}, //moveTo - {cx + rxKappa, cy - ry}, {cx + rx, cy - ryKappa}, {cx + rx, cy}, //cubicTo - {cx + rx, cy + ryKappa}, {cx + rxKappa, cy + ry}, {cx, cy + ry}, //cubicTo - {cx - rxKappa, cy + ry}, {cx - rx, cy + ryKappa}, {cx - rx, cy}, //cubicTo - {cx - rx, cy - ryKappa}, {cx - rxKappa, cy - ry}, {cx, cy - ry} //cubicTo - }; - - if (transform) { - for (int i = 0; i < ptsCnt; ++i) mathTransform(transform, &points[i]); - } - - shape->appendPath(commands, cmdsCnt, points, ptsCnt); -} - - -static void _updateEllipse(LottieGroup* parent, LottieObject** child, float frameNo, TVG_UNUSED Inlist& contexts, RenderContext* ctx, LottieExpressions* exps) -{ - auto ellipse = static_cast(*child); - - auto position = ellipse->position(frameNo, exps); - auto size = ellipse->size(frameNo, exps); - - if (ctx->repeater) { - auto path = Shape::gen(); - _appendCircle(path.get(), position.x, position.y, size.x * 0.5f, size.y * 0.5f, ctx->transform); - _repeat(parent, std::move(path), ctx); - } else { - auto merging = _draw(parent, ctx); - _appendCircle(merging, position.x, position.y, size.x * 0.5f, size.y * 0.5f, ctx->transform); - } -} - - -static void _updatePath(LottieGroup* parent, LottieObject** child, float frameNo, TVG_UNUSED Inlist& contexts, RenderContext* ctx, LottieExpressions* exps) -{ - auto path = static_cast(*child); - - if (ctx->repeater) { - auto p = Shape::gen(); - path->pathset(frameNo, P(p)->rs.path.cmds, P(p)->rs.path.pts, ctx->transform, ctx->roundness, exps); - _repeat(parent, std::move(p), ctx); - } else { - auto merging = _draw(parent, ctx); - if (path->pathset(frameNo, P(merging)->rs.path.cmds, P(merging)->rs.path.pts, ctx->transform, ctx->roundness, exps)) { - P(merging)->update(RenderUpdateFlag::Path); - } - } -} - - -static void _updateText(LottieGroup* parent, LottieObject** child, float frameNo, TVG_UNUSED Inlist& contexts, TVG_UNUSED RenderContext* ctx, LottieExpressions* exps) -{ - auto text = static_cast(*child); - auto& doc = text->doc(frameNo); - auto p = doc.text; - - if (!p || !text->font) return; - - auto scale = doc.size * 0.01f; - float spacing = text->spacing(frameNo) / scale; - Point cursor = {0.0f, 0.0f}; - auto scene = Scene::gen(); - int line = 0; - - //text string - while (true) { - //TODO: remove nested scenes. - //end of text, new line of the cursor position - if (*p == 13 || *p == 3 || *p == '\0') { - //text layout position - auto ascent = text->font->ascent * scale; - if (ascent > doc.bbox.size.y) ascent = doc.bbox.size.y; - Point layout = {doc.bbox.pos.x, doc.bbox.pos.y + ascent - doc.shift}; - - //adjust the layout - if (doc.justify == 1) layout.x += doc.bbox.size.x - (cursor.x * scale); //right aligned - else if (doc.justify == 2) layout.x += (doc.bbox.size.x * 0.5f) - (cursor.x * 0.5f * scale); //center aligned - - scene->translate(layout.x, layout.y); - scene->scale(scale); - - parent->scene->push(std::move(scene)); - - if (*p == '\0') break; - ++p; - - //new text group, single scene for each line - scene = Scene::gen(); - cursor.x = 0.0f; - cursor.y = ++line * (doc.height / scale); - } - - //find the glyph - for (auto g = text->font->chars.begin(); g < text->font->chars.end(); ++g) { - auto glyph = *g; - //draw matched glyphs - if (!strncmp(glyph->code, p, glyph->len)) { - //TODO: caching? - auto shape = Shape::gen(); - for (auto g = glyph->children.begin(); g < glyph->children.end(); ++g) { - auto group = static_cast(*g); - for (auto p = group->children.begin(); p < group->children.end(); ++p) { - if (static_cast(*p)->pathset(frameNo, P(shape)->rs.path.cmds, P(shape)->rs.path.pts, nullptr, 0.0f, exps)) { - P(shape)->update(RenderUpdateFlag::Path); - } - } - } - shape->fill(doc.color.rgb[0], doc.color.rgb[1], doc.color.rgb[2]); - shape->translate(cursor.x, cursor.y); - - if (doc.stroke.render) { - shape->stroke(StrokeJoin::Round); - shape->stroke(doc.stroke.width / scale); - shape->stroke(doc.stroke.color.rgb[0], doc.stroke.color.rgb[1], doc.stroke.color.rgb[2]); - } - - scene->push(std::move(shape)); - - p += glyph->len; - - //advance the cursor position horizontally - cursor.x += glyph->width + spacing + doc.tracking; - break; - } - } - } -} - - -static void _applyRoundedCorner(Shape* star, Shape* merging, float outerRoundness, float roundness, bool hasRoundness) -{ - static constexpr auto ROUNDED_POLYSTAR_MAGIC_NUMBER = 0.47829f; - - auto cmdCnt = star->pathCommands(nullptr); - const Point *pts = nullptr; - auto ptsCnt = star->pathCoords(&pts); - - auto len = mathLength(pts[1] - pts[2]); - auto r = len > 0.0f ? ROUNDED_POLYSTAR_MAGIC_NUMBER * mathMin(len * 0.5f, roundness) / len : 0.0f; - - if (hasRoundness) { - P(merging)->rs.path.cmds.grow((uint32_t)(1.5 * cmdCnt)); - P(merging)->rs.path.pts.grow((uint32_t)(4.5 * cmdCnt)); - - int start = 3 * mathZero(outerRoundness); - merging->moveTo(pts[start].x, pts[start].y); - - for (uint32_t i = 1 + start; i < ptsCnt; i += 6) { - auto& prev = pts[i]; - auto& curr = pts[i + 2]; - auto& next = (i < ptsCnt - start) ? pts[i + 4] : pts[2]; - auto& nextCtrl = (i < ptsCnt - start) ? pts[i + 5] : pts[3]; - auto dNext = r * (curr - next); - auto dPrev = r * (curr - prev); - - auto p0 = curr - 2.0f * dPrev; - auto p1 = curr - dPrev; - auto p2 = curr - dNext; - auto p3 = curr - 2.0f * dNext; - - merging->cubicTo(prev.x, prev.y, p0.x, p0.y, p0.x, p0.y); - merging->cubicTo(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y); - merging->cubicTo(p3.x, p3.y, next.x, next.y, nextCtrl.x, nextCtrl.y); - } - } else { - P(merging)->rs.path.cmds.grow(2 * cmdCnt); - P(merging)->rs.path.pts.grow(4 * cmdCnt); - - auto dPrev = r * (pts[1] - pts[0]); - auto p = pts[0] + 2.0f * dPrev; - merging->moveTo(p.x, p.y); - - for (uint32_t i = 1; i < ptsCnt; ++i) { - auto& curr = pts[i]; - auto& next = (i == ptsCnt - 1) ? pts[1] : pts[i + 1]; - auto dNext = r * (curr - next); - - auto p0 = curr - 2.0f * dPrev; - auto p1 = curr - dPrev; - auto p2 = curr - dNext; - auto p3 = curr - 2.0f * dNext; - - merging->lineTo(p0.x, p0.y); - merging->cubicTo(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y); - - dPrev = -1.0f * dNext; - } - } - merging->close(); -} - - -static void _updateStar(LottieGroup* parent, LottiePolyStar* star, Matrix* transform, float roundness, float frameNo, Shape* merging, LottieExpressions* exps) -{ - static constexpr auto POLYSTAR_MAGIC_NUMBER = 0.47829f / 0.28f; - - auto ptsCnt = star->ptsCnt(frameNo, exps); - auto innerRadius = star->innerRadius(frameNo, exps); - auto outerRadius = star->outerRadius(frameNo, exps); - auto innerRoundness = star->innerRoundness(frameNo, exps) * 0.01f; - auto outerRoundness = star->outerRoundness(frameNo, exps) * 0.01f; - - auto angle = mathDeg2Rad(-90.0f); - auto partialPointRadius = 0.0f; - auto anglePerPoint = (2.0f * MATH_PI / ptsCnt); - auto halfAnglePerPoint = anglePerPoint * 0.5f; - auto partialPointAmount = ptsCnt - floorf(ptsCnt); - auto longSegment = false; - auto numPoints = size_t(ceilf(ptsCnt) * 2); - auto direction = (star->direction == 0) ? 1.0f : -1.0f; - auto hasRoundness = false; - bool roundedCorner = (roundness > ROUNDNESS_EPSILON) && (mathZero(innerRoundness) || mathZero(outerRoundness)); - //TODO: we can use PathCommand / PathCoord directly. - auto shape = roundedCorner ? Shape::gen().release() : merging; - - float x, y; - - if (!mathZero(partialPointAmount)) { - angle += halfAnglePerPoint * (1.0f - partialPointAmount) * direction; - } - - if (!mathZero(partialPointAmount)) { - partialPointRadius = innerRadius + partialPointAmount * (outerRadius - innerRadius); - x = partialPointRadius * cosf(angle); - y = partialPointRadius * sinf(angle); - angle += anglePerPoint * partialPointAmount * 0.5f * direction; - } else { - x = outerRadius * cosf(angle); - y = outerRadius * sinf(angle); - angle += halfAnglePerPoint * direction; - } - - if (mathZero(innerRoundness) && mathZero(outerRoundness)) { - P(shape)->rs.path.pts.reserve(numPoints + 2); - P(shape)->rs.path.cmds.reserve(numPoints + 3); - } else { - P(shape)->rs.path.pts.reserve(numPoints * 3 + 2); - P(shape)->rs.path.cmds.reserve(numPoints + 3); - hasRoundness = true; - } - - Point in = {x, y}; - if (transform) mathTransform(transform, &in); - shape->moveTo(in.x, in.y); - - for (size_t i = 0; i < numPoints; i++) { - auto radius = longSegment ? outerRadius : innerRadius; - auto dTheta = halfAnglePerPoint; - if (!mathZero(partialPointRadius) && i == numPoints - 2) { - dTheta = anglePerPoint * partialPointAmount * 0.5f; - } - if (!mathZero(partialPointRadius) && i == numPoints - 1) { - radius = partialPointRadius; - } - auto previousX = x; - auto previousY = y; - x = radius * cosf(angle); - y = radius * sinf(angle); - - if (hasRoundness) { - auto cp1Theta = (atan2f(previousY, previousX) - MATH_PI2 * direction); - auto cp1Dx = cosf(cp1Theta); - auto cp1Dy = sinf(cp1Theta); - auto cp2Theta = (atan2f(y, x) - MATH_PI2 * direction); - auto cp2Dx = cosf(cp2Theta); - auto cp2Dy = sinf(cp2Theta); - - auto cp1Roundness = longSegment ? innerRoundness : outerRoundness; - auto cp2Roundness = longSegment ? outerRoundness : innerRoundness; - auto cp1Radius = longSegment ? innerRadius : outerRadius; - auto cp2Radius = longSegment ? outerRadius : innerRadius; - - auto cp1x = cp1Radius * cp1Roundness * POLYSTAR_MAGIC_NUMBER * cp1Dx / ptsCnt; - auto cp1y = cp1Radius * cp1Roundness * POLYSTAR_MAGIC_NUMBER * cp1Dy / ptsCnt; - auto cp2x = cp2Radius * cp2Roundness * POLYSTAR_MAGIC_NUMBER * cp2Dx / ptsCnt; - auto cp2y = cp2Radius * cp2Roundness * POLYSTAR_MAGIC_NUMBER * cp2Dy / ptsCnt; - - if (!mathZero(partialPointAmount) && ((i == 0) || (i == numPoints - 1))) { - cp1x *= partialPointAmount; - cp1y *= partialPointAmount; - cp2x *= partialPointAmount; - cp2y *= partialPointAmount; - } - Point in2 = {previousX - cp1x, previousY - cp1y}; - Point in3 = {x + cp2x, y + cp2y}; - Point in4 = {x, y}; - if (transform) { - mathTransform(transform, &in2); - mathTransform(transform, &in3); - mathTransform(transform, &in4); - } - shape->cubicTo(in2.x, in2.y, in3.x, in3.y, in4.x, in4.y); - } else { - Point in = {x, y}; - if (transform) mathTransform(transform, &in); - shape->lineTo(in.x, in.y); - } - angle += dTheta * direction; - longSegment = !longSegment; - } - shape->close(); - - if (roundedCorner) { - _applyRoundedCorner(shape, merging, outerRoundness, roundness, hasRoundness); - delete(shape); - } -} - - -static void _updatePolygon(LottieGroup* parent, LottiePolyStar* star, Matrix* transform, float frameNo, Shape* merging, LottieExpressions* exps) -{ - static constexpr auto POLYGON_MAGIC_NUMBER = 0.25f; - - auto ptsCnt = size_t(floor(star->ptsCnt(frameNo, exps))); - auto radius = star->outerRadius(frameNo, exps); - auto roundness = star->outerRoundness(frameNo, exps) * 0.01f; - - auto angle = mathDeg2Rad(-90.0f); - auto anglePerPoint = 2.0f * MATH_PI / float(ptsCnt); - auto direction = (star->direction == 0) ? 1.0f : -1.0f; - auto hasRoundness = false; - auto x = radius * cosf(angle); - auto y = radius * sinf(angle); - - angle += anglePerPoint * direction; - - if (mathZero(roundness)) { - P(merging)->rs.path.pts.reserve(ptsCnt + 2); - P(merging)->rs.path.cmds.reserve(ptsCnt + 3); - } else { - P(merging)->rs.path.pts.reserve(ptsCnt * 3 + 2); - P(merging)->rs.path.cmds.reserve(ptsCnt + 3); - hasRoundness = true; - } - - Point in = {x, y}; - if (transform) mathTransform(transform, &in); - merging->moveTo(in.x, in.y); - - for (size_t i = 0; i < ptsCnt; i++) { - auto previousX = x; - auto previousY = y; - x = (radius * cosf(angle)); - y = (radius * sinf(angle)); - - if (hasRoundness) { - auto cp1Theta = atan2f(previousY, previousX) - MATH_PI2 * direction; - auto cp1Dx = cosf(cp1Theta); - auto cp1Dy = sinf(cp1Theta); - auto cp2Theta = atan2f(y, x) - MATH_PI2 * direction; - auto cp2Dx = cosf(cp2Theta); - auto cp2Dy = sinf(cp2Theta); - - auto cp1x = radius * roundness * POLYGON_MAGIC_NUMBER * cp1Dx; - auto cp1y = radius * roundness * POLYGON_MAGIC_NUMBER * cp1Dy; - auto cp2x = radius * roundness * POLYGON_MAGIC_NUMBER * cp2Dx; - auto cp2y = radius * roundness * POLYGON_MAGIC_NUMBER * cp2Dy; - - Point in2 = {previousX - cp1x, previousY - cp1y}; - Point in3 = {x + cp2x, y + cp2y}; - Point in4 = {x, y}; - if (transform) { - mathTransform(transform, &in2); - mathTransform(transform, &in3); - mathTransform(transform, &in4); - } - merging->cubicTo(in2.x, in2.y, in3.x, in3.y, in4.x, in4.y); - } else { - Point in = {x, y}; - if (transform) mathTransform(transform, &in); - merging->lineTo(in.x, in.y); - } - angle += anglePerPoint * direction; - } - merging->close(); -} - - -static void _updatePolystar(LottieGroup* parent, LottieObject** child, float frameNo, TVG_UNUSED Inlist& contexts, RenderContext* ctx, LottieExpressions* exps) -{ - auto star= static_cast(*child); - - //Optimize: Can we skip the individual coords transform? - Matrix matrix; - mathIdentity(&matrix); - auto position = star->position(frameNo, exps); - mathTranslate(&matrix, position.x, position.y); - mathRotate(&matrix, star->rotation(frameNo, exps)); - - if (ctx->transform) matrix = mathMultiply(ctx->transform, &matrix); - - auto identity = mathIdentity((const Matrix*)&matrix); - - if (ctx->repeater) { - auto p = Shape::gen(); - if (star->type == LottiePolyStar::Star) _updateStar(parent, star, identity ? nullptr : &matrix, ctx->roundness, frameNo, p.get(), exps); - else _updatePolygon(parent, star, identity ? nullptr : &matrix, frameNo, p.get(), exps); - _repeat(parent, std::move(p), ctx); - } else { - auto merging = _draw(parent, ctx); - if (star->type == LottiePolyStar::Star) _updateStar(parent, star, identity ? nullptr : &matrix, ctx->roundness, frameNo, merging, exps); - else _updatePolygon(parent, star, identity ? nullptr : &matrix, frameNo, merging, exps); - P(merging)->update(RenderUpdateFlag::Path); - } -} - - -static void _updateImage(LottieGroup* parent, LottieObject** child, float frameNo, TVG_UNUSED Inlist& contexts, RenderContext* ctx) -{ - auto image = static_cast(*child); - auto picture = image->picture; - - if (!picture) { - picture = Picture::gen().release(); - - //force to load a picture on the same thread - TaskScheduler::async(false); - - if (image->size > 0) { - if (picture->load((const char*)image->b64Data, image->size, image->mimeType, false) != Result::Success) { - delete(picture); - return; - } - } else { - if (picture->load(image->path) != Result::Success) { - delete(picture); - return; - } - } - - TaskScheduler::async(true); - - image->picture = picture; - PP(picture)->ref(); - } - - if (ctx->propagator) { - if (auto matrix = PP(ctx->propagator)->transform()) { - picture->transform(*matrix); - } - picture->opacity(PP(ctx->propagator)->opacity); - } - parent->scene->push(cast(picture)); -} - - -static void _updateRoundedCorner(TVG_UNUSED LottieGroup* parent, LottieObject** child, float frameNo, TVG_UNUSED Inlist& contexts, RenderContext* ctx, LottieExpressions* exps) -{ - auto roundedCorner= static_cast(*child); - auto roundness = roundedCorner->radius(frameNo, exps); - if (ctx->roundness < roundness) ctx->roundness = roundness; -} - - -static void _updateRepeater(TVG_UNUSED LottieGroup* parent, LottieObject** child, float frameNo, TVG_UNUSED Inlist& contexts, RenderContext* ctx, LottieExpressions* exps) -{ - auto repeater= static_cast(*child); - - if (!ctx->repeater) ctx->repeater = new RenderRepeater(); - ctx->repeater->cnt = static_cast(repeater->copies(frameNo, exps)); - ctx->repeater->offset = repeater->offset(frameNo, exps); - ctx->repeater->position = repeater->position(frameNo, exps); - ctx->repeater->anchor = repeater->anchor(frameNo, exps); - ctx->repeater->scale = repeater->scale(frameNo, exps); - ctx->repeater->rotation = repeater->rotation(frameNo, exps); - ctx->repeater->startOpacity = repeater->startOpacity(frameNo, exps); - ctx->repeater->endOpacity = repeater->endOpacity(frameNo, exps); - ctx->repeater->inorder = repeater->inorder; - ctx->repeater->interpOpacity = (ctx->repeater->startOpacity == ctx->repeater->endOpacity) ? false : true; - - ctx->merging = nullptr; -} - - -static void _updateTrimpath(TVG_UNUSED LottieGroup* parent, LottieObject** child, float frameNo, TVG_UNUSED Inlist& contexts, RenderContext* ctx, LottieExpressions* exps) -{ - auto trimpath= static_cast(*child); - - float begin, end; - trimpath->segment(frameNo, begin, end, exps); - - if (P(ctx->propagator)->rs.stroke) { - auto pbegin = P(ctx->propagator)->rs.stroke->trim.begin; - auto pend = P(ctx->propagator)->rs.stroke->trim.end; - auto length = fabsf(pend - pbegin); - begin = (length * begin) + pbegin; - end = (length * end) + pbegin; - } - - P(ctx->propagator)->strokeTrim(begin, end, trimpath->type == LottieTrimpath::Type::Individual ? true : false); -} - - -static void _updateChildren(LottieGroup* parent, float frameNo, Inlist& contexts, LottieExpressions* exps) -{ - contexts.head->begin = parent->children.end() - 1; - - while (!contexts.empty()) { - auto ctx = contexts.front(); - ctx->reqFragment = parent->reqFragment; - for (auto child = ctx->begin; child >= parent->children.data; --child) { - //Here switch-case statements are more performant than virtual methods. - switch ((*child)->type) { - case LottieObject::Group: { - _updateGroup(parent, child, frameNo, contexts, ctx, exps); - break; - } - case LottieObject::Transform: { - _updateTransform(parent, child, frameNo, contexts, ctx, exps); - break; - } - case LottieObject::SolidFill: { - _updateSolidFill(parent, child, frameNo, contexts, ctx, exps); - break; - } - case LottieObject::SolidStroke: { - _updateSolidStroke(parent, child, frameNo, contexts, ctx, exps); - break; - } - case LottieObject::GradientFill: { - _updateGradientFill(parent, child, frameNo, contexts, ctx, exps); - break; - } - case LottieObject::GradientStroke: { - _updateGradientStroke(parent, child, frameNo, contexts, ctx, exps); - break; - } - case LottieObject::Rect: { - _updateRect(parent, child, frameNo, contexts, ctx, exps); - break; - } - case LottieObject::Ellipse: { - _updateEllipse(parent, child, frameNo, contexts, ctx, exps); - break; - } - case LottieObject::Path: { - _updatePath(parent, child, frameNo, contexts, ctx, exps); - break; - } - case LottieObject::Polystar: { - _updatePolystar(parent, child, frameNo, contexts, ctx, exps); - break; - } - case LottieObject::Image: { - _updateImage(parent, child, frameNo, contexts, ctx); - break; - } - case LottieObject::Trimpath: { - _updateTrimpath(parent, child, frameNo, contexts, ctx, exps); - break; - } - case LottieObject::Text: { - _updateText(parent, child, frameNo, contexts, ctx, exps); - break; - } - case LottieObject::Repeater: { - _updateRepeater(parent, child, frameNo, contexts, ctx, exps); - break; - } - case LottieObject::RoundedCorner: { - _updateRoundedCorner(parent, child, frameNo, contexts, ctx, exps); - break; - } - default: break; - } - } - delete(ctx); - } -} - - -static void _updatePrecomp(LottieLayer* precomp, float frameNo, LottieExpressions* exps) -{ - if (precomp->children.empty()) return; - - frameNo = precomp->remap(frameNo, exps); - - for (auto child = precomp->children.end() - 1; child >= precomp->children.begin(); --child) { - _updateLayer(precomp, static_cast(*child), frameNo, exps); - } - - //clip the layer viewport - if (precomp->w > 0 && precomp->h > 0) { - auto clipper = Shape::gen().release(); - clipper->appendRect(0, 0, static_cast(precomp->w), static_cast(precomp->h)); - clipper->transform(precomp->cache.matrix); - - //TODO: remove the intermediate scene.... - auto cscene = Scene::gen(); - cscene->composite(cast(clipper), CompositeMethod::ClipPath); - cscene->push(cast(precomp->scene)); - precomp->scene = cscene.release(); - } -} - - -static void _updateSolid(LottieLayer* layer) -{ - auto shape = Shape::gen(); - shape->appendRect(0, 0, static_cast(layer->w), static_cast(layer->h)); - shape->fill(layer->color.rgb[0], layer->color.rgb[1], layer->color.rgb[2], layer->cache.opacity); - layer->scene->push(std::move(shape)); -} - - -static void _updateMaskings(LottieLayer* layer, float frameNo, LottieExpressions* exps) -{ - if (layer->masks.count == 0) return; - - //maskings - Shape* pmask = nullptr; - auto pmethod = CompositeMethod::AlphaMask; - - for (auto m = layer->masks.begin(); m < layer->masks.end(); ++m) { - auto mask = static_cast(*m); - auto shape = Shape::gen().release(); - shape->fill(255, 255, 255, mask->opacity(frameNo)); - shape->transform(layer->cache.matrix); - if (mask->pathset(frameNo, P(shape)->rs.path.cmds, P(shape)->rs.path.pts, nullptr, 0.0f, exps)) { - P(shape)->update(RenderUpdateFlag::Path); - } - auto method = mask->method; - if (pmask) { - //false of false is true. invert. - if (method == CompositeMethod::SubtractMask && pmethod == method) { - method = CompositeMethod::AddMask; - } else if (pmethod == CompositeMethod::DifferenceMask && pmethod == method) { - method = CompositeMethod::IntersectMask; - } - pmask->composite(cast(shape), method); - } else { - if (method == CompositeMethod::SubtractMask) method = CompositeMethod::InvAlphaMask; - else if (method == CompositeMethod::AddMask) method = CompositeMethod::AlphaMask; - else if (method == CompositeMethod::IntersectMask) method = CompositeMethod::AlphaMask; - else if (method == CompositeMethod::DifferenceMask) method = CompositeMethod::AlphaMask; //does this correct? - layer->scene->composite(cast(shape), method); - } - pmethod = mask->method; - pmask = shape; - } -} - - -static bool _updateMatte(LottieLayer* root, LottieLayer* layer, float frameNo, LottieExpressions* exps) -{ - auto target = layer->matte.target; - if (!target) return true; - - _updateLayer(root, target, frameNo, exps); - - if (target->scene) { - layer->scene->composite(cast(target->scene), layer->matte.type); - } else if (layer->matte.type == CompositeMethod::AlphaMask || layer->matte.type == CompositeMethod::LumaMask) { - //matte target is not exist. alpha blending definitely bring an invisible result - delete(layer->scene); - layer->scene = nullptr; - return false; - } - return true; -} - - -static void _updateLayer(LottieLayer* root, LottieLayer* layer, float frameNo, LottieExpressions* exps) -{ - layer->scene = nullptr; - - //visibility - if (frameNo < layer->inFrame || frameNo >= layer->outFrame) return; - - _updateTransform(layer, frameNo, exps); - - //full transparent scene. no need to perform - if (layer->type != LottieLayer::Null && layer->cache.opacity == 0) return; - - //Prepare render data - layer->scene = Scene::gen().release(); - - //ignore opacity when Null layer? - if (layer->type != LottieLayer::Null) layer->scene->opacity(layer->cache.opacity); - - layer->scene->transform(layer->cache.matrix); - - if (layer->matte.target && layer->masks.count > 0) TVGERR("LOTTIE", "FIXME: Matte + Masking??"); - - if (!_updateMatte(root, layer, frameNo, exps)) return; - - _updateMaskings(layer, frameNo, exps); - - switch (layer->type) { - case LottieLayer::Precomp: { - _updatePrecomp(layer, frameNo, exps); - break; - } - case LottieLayer::Solid: { - _updateSolid(layer); - break; - } - default: { - if (!layer->children.empty()) { - Inlist contexts; - contexts.back(new RenderContext); - _updateChildren(layer, frameNo, contexts, exps); - contexts.free(); - } - break; - } - } - - layer->scene->blend(layer->blendMethod); - - //the given matte source was composited by the target earlier. - if (!layer->matteSrc) root->scene->push(cast(layer->scene)); -} - - -static void _buildReference(LottieComposition* comp, LottieLayer* layer) -{ - for (auto asset = comp->assets.begin(); asset < comp->assets.end(); ++asset) { - if (strcmp(layer->refId, (*asset)->name)) continue; - if (layer->type == LottieLayer::Precomp) { - auto assetLayer = static_cast(*asset); - if (_buildComposition(comp, assetLayer)) { - layer->children = assetLayer->children; - layer->reqFragment = assetLayer->reqFragment; - } - } else if (layer->type == LottieLayer::Image) { - layer->children.push(*asset); - } - break; - } -} - - -static void _buildHierarchy(LottieGroup* parent, LottieLayer* child) -{ - if (child->pid == -1) return; - - if (child->matte.target && child->pid == child->matte.target->id) { - child->parent = child->matte.target; - return; - } - - for (auto p = parent->children.begin(); p < parent->children.end(); ++p) { - auto parent = static_cast(*p); - if (child == parent) continue; - if (child->pid == parent->id) { - child->parent = parent; - break; - } - if (parent->matte.target && parent->matte.target->id == child->pid) { - child->parent = parent->matte.target; - break; - } - } -} - - -static void _attachFont(LottieComposition* comp, LottieLayer* parent) -{ - //TODO: Consider to migrate this attachment to the frame update time. - for (auto c = parent->children.begin(); c < parent->children.end(); ++c) { - auto text = static_cast(*c); - auto& doc = text->doc(0); - if (!doc.name) continue; - auto len = strlen(doc.name); - for (uint32_t i = 0; i < comp->fonts.count; ++i) { - auto font = comp->fonts[i]; - auto len2 = strlen(font->name); - if (!strncmp(font->name, doc.name, len < len2 ? len : len2)) { - text->font = font; - break; - } - } - } -} - - -static bool _buildComposition(LottieComposition* comp, LottieGroup* parent) -{ - if (parent->children.count == 0) return false; - if (parent->buildDone) return true; - parent->buildDone = true; - - for (auto c = parent->children.begin(); c < parent->children.end(); ++c) { - auto child = static_cast(*c); - - //attach the precomp layer. - if (child->refId) _buildReference(comp, child); - - if (child->matte.target) { - //parenting - _buildHierarchy(parent, child->matte.target); - //precomp referencing - if (child->matte.target->refId) _buildReference(comp, child->matte.target); - } - _buildHierarchy(parent, child); - - //attach the necessary font data - if (child->type == LottieLayer::Text) _attachFont(comp, child); - } - return true; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -bool LottieBuilder::update(LottieComposition* comp, float frameNo) -{ - if (comp->root->children.empty()) return false; - - frameNo += comp->startFrame; - if (frameNo < comp->startFrame) frameNo = comp->startFrame; - if (frameNo >= comp->endFrame) frameNo = (comp->endFrame - 1); - - //update children layers - auto root = comp->root; - root->scene->clear(); - - if (exps && comp->expressions) exps->update(comp->timeAtFrame(frameNo)); - - for (auto child = root->children.end() - 1; child >= root->children.begin(); --child) { - _updateLayer(root, static_cast(*child), frameNo, exps); - } - - return true; -} - - -void LottieBuilder::build(LottieComposition* comp) -{ - if (!comp) return; - - comp->root->scene = Scene::gen().release(); - if (!comp->root->scene) return; - - _buildComposition(comp, comp->root); - - if (!update(comp, 0)) return; - - //viewport clip - auto clip = Shape::gen(); - clip->appendRect(0, 0, static_cast(comp->w), static_cast(comp->h)); - comp->root->scene->composite(std::move(clip), CompositeMethod::ClipPath); -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieBuilder.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieBuilder.h deleted file mode 100644 index 690fa85..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieBuilder.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL -#ifndef _TVG_LOTTIE_BUILDER_H_ -#define _TVG_LOTTIE_BUILDER_H_ - -#include "tvgCommon.h" -#include "tvgLottieExpressions.h" - -struct LottieComposition; - -struct LottieBuilder -{ - LottieExpressions* exps = nullptr; - - LottieBuilder() - { - exps = LottieExpressions::instance(); - } - - ~LottieBuilder() - { - LottieExpressions::retrieve(exps); - } - - bool update(LottieComposition* comp, float progress); - void build(LottieComposition* comp); -}; - -#endif //_TVG_LOTTIE_BUILDER_H - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieExpressions.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieExpressions.cpp deleted file mode 100644 index aa6c9b1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieExpressions.cpp +++ /dev/null @@ -1,1298 +0,0 @@ -/* - * Copyright (c) 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgMath.h" -#include "tvgLottieModel.h" -#include "tvgLottieExpressions.h" - -#ifdef THORVG_LOTTIE_EXPRESSIONS_SUPPORT - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -struct ExpContent -{ - LottieObject* obj; - float frameNo; -}; - - -//reserved expressions specifiers -static const char* EXP_NAME = "name"; -static const char* EXP_CONTENT = "content"; -static const char* EXP_WIDTH = "width"; -static const char* EXP_HEIGHT = "height"; -static const char* EXP_CYCLE = "cycle"; -static const char* EXP_PINGPONG = "pingpong"; -static const char* EXP_OFFSET = "offset"; -static const char* EXP_CONTINUE = "continue"; -static const char* EXP_TIME = "time"; -static const char* EXP_VALUE = "value"; -static const char* EXP_INDEX = "index"; -static const char* EXP_EFFECT= "effect"; - -static LottieExpressions* exps = nullptr; //singleton instance engine - - -static void contentFree(void *native_p, struct jerry_object_native_info_t *info_p) -{ - free(native_p); -} - -static jerry_object_native_info_t freeCb {contentFree, 0, 0}; -static uint32_t engineRefCnt = 0; //Expressions Engine reference count - - -static char* _name(jerry_value_t args) -{ - auto arg0 = jerry_value_to_string(args); - auto len = jerry_string_length(arg0); - auto name = (jerry_char_t*)malloc(len * sizeof(jerry_char_t) + 1); - jerry_string_to_buffer(arg0, JERRY_ENCODING_UTF8, name, len); - name[len] = '\0'; - jerry_value_free(arg0); - return (char*) name; -} - - -static jerry_value_t _toComp(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - TVGERR("LOTTIE", "toComp is not supported in expressions!"); - - return jerry_undefined(); -} - - -static void _buildTransform(jerry_value_t context, LottieTransform* transform) -{ - if (!transform) return; - - auto obj = jerry_object(); - jerry_object_set_sz(context, "transform", obj); - - auto anchorPoint = jerry_object(); - jerry_object_set_native_ptr(anchorPoint, nullptr, &transform->anchor); - jerry_object_set_sz(obj, "anchorPoint", anchorPoint); - jerry_value_free(anchorPoint); - - auto position = jerry_object(); - jerry_object_set_native_ptr(position, nullptr, &transform->position); - jerry_object_set_sz(obj, "position", position); - jerry_value_free(position); - - auto scale = jerry_object(); - jerry_object_set_native_ptr(scale, nullptr, &transform->scale); - jerry_object_set_sz(obj, "scale", scale); - jerry_value_free(scale); - - auto rotation = jerry_object(); - jerry_object_set_native_ptr(rotation, nullptr, &transform->rotation); - jerry_object_set_sz(obj, "rotation", rotation); - jerry_value_free(rotation); - - auto opacity = jerry_object(); - jerry_object_set_native_ptr(opacity, nullptr, &transform->opacity); - jerry_object_set_sz(obj, "opacity", opacity); - jerry_value_free(opacity); - - jerry_value_free(obj); -} - - -static void _buildLayer(jerry_value_t context, LottieLayer* layer, LottieComposition* comp) -{ - auto width = jerry_number(layer->w); - jerry_object_set_sz(context, EXP_WIDTH, width); - jerry_value_free(width); - - auto height = jerry_number(layer->h); - jerry_object_set_sz(context, EXP_HEIGHT, height); - jerry_value_free(height); - - auto index = jerry_number(layer->id); - jerry_object_set_sz(context, EXP_INDEX, index); - jerry_value_free(index); - - auto parent = jerry_object(); - jerry_object_set_native_ptr(parent, nullptr, layer->parent); - jerry_object_set_sz(context, "parent", parent); - jerry_value_free(parent); - - auto hasParent = jerry_boolean(layer->parent ? true : false); - jerry_object_set_sz(context, "hasParent", hasParent); - jerry_value_free(hasParent); - - auto inPoint = jerry_number(layer->inFrame); - jerry_object_set_sz(context, "inPoint", inPoint); - jerry_value_free(inPoint); - - auto outPoint = jerry_number(layer->outFrame); - jerry_object_set_sz(context, "outPoint", outPoint); - jerry_value_free(outPoint); - - auto startTime = jerry_number(comp->timeAtFrame(layer->startFrame)); - jerry_object_set_sz(context, "startTime", startTime); - jerry_value_free(startTime); - - auto hasVideo = jerry_boolean(false); - jerry_object_set_sz(context, "hasVideo", hasVideo); - jerry_value_free(hasVideo); - - auto hasAudio = jerry_boolean(false); - jerry_object_set_sz(context, "hasAudio", hasAudio); - jerry_value_free(hasAudio); - - //active, #current in the animation range? - - auto enabled = jerry_boolean(!layer->hidden); - jerry_object_set_sz(context, "enabled", enabled); - jerry_value_free(enabled); - - auto audioActive = jerry_boolean(false); - jerry_object_set_sz(context, "audioActive", audioActive); - jerry_value_free(audioActive); - - //sampleImage(point, radius = [.5, .5], postEffect=true, t=time) - - _buildTransform(context, layer->transform); - - //audioLevels, #the value of the Audio Levels property of the layer in decibels - - auto timeRemap = jerry_object(); - jerry_object_set_native_ptr(timeRemap, nullptr, &layer->timeRemap); - jerry_object_set_sz(context, "timeRemap", timeRemap); - jerry_value_free(timeRemap); - - //marker.key(index) - //marker.key(name) - //marker.nearestKey(t) - //marker.numKeys - - auto name = jerry_string_sz(layer->name); - jerry_object_set_sz(context, EXP_NAME, name); - jerry_value_free(name); - - auto toComp = jerry_function_external(_toComp); - jerry_object_set_sz(context, "toComp", toComp); - jerry_object_set_native_ptr(toComp, nullptr, comp); - jerry_value_free(toComp); -} - - -static jerry_value_t _value(float frameNo, LottieExpression* exp) -{ - switch (exp->type) { - case LottieProperty::Type::Point: { - auto value = jerry_object(); - auto pos = (*static_cast(exp->property))(frameNo); - auto val1 = jerry_number(pos.x); - auto val2 = jerry_number(pos.y); - jerry_object_set_index(value, 0, val1); - jerry_object_set_index(value, 1, val2); - jerry_value_free(val1); - jerry_value_free(val2); - return value; - } - case LottieProperty::Type::Float: { - return jerry_number((*static_cast(exp->property))(frameNo)); - } - case LottieProperty::Type::Opacity: { - return jerry_number((*static_cast(exp->property))(frameNo)); - } - case LottieProperty::Type::PathSet: { - auto value = jerry_object(); - jerry_object_set_native_ptr(value, nullptr, exp->property); - return value; - } - case LottieProperty::Type::Position: { - auto value = jerry_object(); - auto pos = (*static_cast(exp->property))(frameNo); - auto val1 = jerry_number(pos.x); - auto val2 = jerry_number(pos.y); - jerry_object_set_index(value, 0, val1); - jerry_object_set_index(value, 1, val2); - jerry_value_free(val1); - jerry_value_free(val2); - return value; - } - default: { - TVGERR("LOTTIE", "Non supported type for value? = %d", (int) exp->type); - } - } - return jerry_undefined(); -} - - -static jerry_value_t _addsub(const jerry_value_t args[], float addsub) -{ - //1d - if (jerry_value_is_number(args[0])) return jerry_number(jerry_value_as_number(args[0]) + addsub * jerry_value_as_number(args[1])); - - //2d - auto val1 = jerry_object_get_index(args[0], 0); - auto val2 = jerry_object_get_index(args[0], 1); - auto val3 = jerry_object_get_index(args[1], 0); - auto val4 = jerry_object_get_index(args[1], 1); - auto x = jerry_value_as_number(val1) + addsub * jerry_value_as_number(val3); - auto y = jerry_value_as_number(val2) + addsub * jerry_value_as_number(val4); - - jerry_value_free(val1); - jerry_value_free(val2); - jerry_value_free(val3); - jerry_value_free(val4); - - auto obj = jerry_object(); - val1 = jerry_number(x); - val2 = jerry_number(y); - jerry_object_set_index(obj, 0, val1); - jerry_object_set_index(obj, 1, val2); - jerry_value_free(val1); - jerry_value_free(val2); - - return obj; -} - - -static jerry_value_t _muldiv(const jerry_value_t arg1, float arg2) -{ - //1d - if (jerry_value_is_number(arg1)) return jerry_number(jerry_value_as_number(arg1) * arg2); - - //2d - auto val1 = jerry_object_get_index(arg1, 0); - auto val2 = jerry_object_get_index(arg1, 1); - auto x = jerry_value_as_number(val1) * arg2; - auto y = jerry_value_as_number(val2) * arg2; - - jerry_value_free(val1); - jerry_value_free(val2); - - auto obj = jerry_object(); - val1 = jerry_number(x); - val2 = jerry_number(y); - jerry_object_set_index(obj, 0, val1); - jerry_object_set_index(obj, 1, val2); - jerry_value_free(val1); - jerry_value_free(val2); - - return obj; -} - - -static jerry_value_t _add(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - return _addsub(args, 1.0f); -} - - -static jerry_value_t _sub(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - return _addsub(args, -1.0f); -} - - -static jerry_value_t _mul(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - return _muldiv(args[0], jerry_value_as_number(args[1])); -} - - -static jerry_value_t _div(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - return _muldiv(args[0], 1.0f / jerry_value_as_number(args[1])); -} - - -static jerry_value_t _interp(float t, const jerry_value_t args[], int argsCnt) -{ - auto tMin = 0.0f; - auto tMax = 1.0f; - int idx = 0; - - if (argsCnt > 3) { - tMin = jerry_value_as_number(args[1]); - tMax = jerry_value_as_number(args[2]); - idx += 2; - } - - //2d - if (jerry_value_is_object(args[idx + 1]) && jerry_value_is_object(args[idx + 2])) { - auto val1 = jerry_object_get_index(args[0], 0); - auto val2 = jerry_object_get_index(args[0], 1); - auto val3 = jerry_object_get_index(args[1], 0); - auto val4 = jerry_object_get_index(args[1], 1); - - Point pt1 = {(float)jerry_value_as_number(val1), (float)jerry_value_as_number(val2)}; - Point pt2 = {(float)jerry_value_as_number(val3), (float)jerry_value_as_number(val4)}; - Point ret; - if (t <= tMin) ret = pt1; - else if (t >= tMax) ret = pt2; - else ret = mathLerp(pt1, pt2, t); - - jerry_value_free(val1); - jerry_value_free(val2); - jerry_value_free(val3); - jerry_value_free(val4); - - auto obj = jerry_object(); - val1 = jerry_number(ret.x); - val2 = jerry_number(ret.y); - jerry_object_set_index(obj, 0, val1); - jerry_object_set_index(obj, 1, val2); - jerry_value_free(val1); - jerry_value_free(val2); - - return obj; - } - - //1d - auto val1 = (float) jerry_value_as_number(args[idx + 1]); - if (t <= tMin) jerry_number(val1); - auto val2 = (float) jerry_value_as_number(args[idx + 2]); - if (t >= tMax) jerry_number(val2); - return jerry_number(mathLerp(val1, val2, t)); -} - - -static jerry_value_t _linear(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto t = (float) jerry_value_as_number(args[0]); - return _interp(t, args, jerry_value_as_uint32(argsCnt)); -} - - -static jerry_value_t _ease(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto t = (float) jerry_value_as_number(args[0]); - t = (t < 0.5) ? (4 * t * t * t) : (1.0f - pow(-2.0f * t + 2.0f, 3) * 0.5f); - return _interp(t, args, jerry_value_as_uint32(argsCnt)); -} - - - -static jerry_value_t _easeIn(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto t = (float) jerry_value_as_number(args[0]); - t = t * t * t; - return _interp(t, args, jerry_value_as_uint32(argsCnt)); -} - - -static jerry_value_t _easeOut(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto t = (float) jerry_value_as_number(args[0]); - t = 1.0f - pow(1.0f - t, 3); - return _interp(t, args, jerry_value_as_uint32(argsCnt)); -} - - -static jerry_value_t _clamp(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto num = jerry_value_as_number(args[0]); - auto limit1 = jerry_value_as_number(args[1]); - auto limit2 = jerry_value_as_number(args[2]); - - //clamping - if (num < limit1) num = limit1; - if (num > limit2) num = limit2; - - return jerry_number(num); -} - - -static jerry_value_t _dot(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto val1 = jerry_object_get_index(args[0], 0); - auto val2 = jerry_object_get_index(args[0], 1); - auto val3 = jerry_object_get_index(args[1], 0); - auto val4 = jerry_object_get_index(args[1], 1); - - auto x = jerry_value_as_number(val1) * jerry_value_as_number(val3); - auto y = jerry_value_as_number(val2) * jerry_value_as_number(val4); - - jerry_value_free(val1); - jerry_value_free(val2); - jerry_value_free(val3); - jerry_value_free(val4); - - return jerry_number(x + y); -} - - -static jerry_value_t _cross(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto val1 = jerry_object_get_index(args[0], 0); - auto val2 = jerry_object_get_index(args[0], 1); - auto val3 = jerry_object_get_index(args[1], 0); - auto val4 = jerry_object_get_index(args[1], 1); - - auto x = jerry_value_as_number(val1) * jerry_value_as_number(val4); - auto y = jerry_value_as_number(val2) * jerry_value_as_number(val3); - - jerry_value_free(val1); - jerry_value_free(val2); - jerry_value_free(val3); - jerry_value_free(val4); - - return jerry_number(x - y); -} - - -static jerry_value_t _normalize(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto val1 = jerry_object_get_index(args[0], 0); - auto val2 = jerry_object_get_index(args[0], 1); - auto x = jerry_value_as_number(val1); - auto y = jerry_value_as_number(val2); - - jerry_value_free(val1); - jerry_value_free(val2); - - auto length = sqrtf(x * x + y * y); - - x /= length; - y /= length; - - auto obj = jerry_object(); - val1 = jerry_number(x); - val2 = jerry_number(y); - jerry_object_set_index(obj, 0, val1); - jerry_object_set_index(obj, 0, val2); - jerry_value_free(val1); - jerry_value_free(val2); - - return obj; -} - - -static jerry_value_t _length(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto val1 = jerry_object_get_index(args[0], 0); - auto val2 = jerry_object_get_index(args[0], 1); - auto x = jerry_value_as_number(val1); - auto y = jerry_value_as_number(val2); - - jerry_value_free(val1); - jerry_value_free(val2); - - return jerry_number(sqrtf(x * x + y * y)); -} - - -static jerry_value_t _random(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto val = (float)(rand() % 10000001); - return jerry_number(val * 0.0000001f); -} - - -static jerry_value_t _deg2rad(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - return jerry_number(mathDeg2Rad((float)jerry_value_as_number(args[0]))); -} - - -static jerry_value_t _rad2deg(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - return jerry_number(mathRad2Deg((float)jerry_value_as_number(args[0]))); -} - - -static jerry_value_t _effect(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - TVGERR("LOTTIE", "effect is not supported in expressions!"); - - return jerry_undefined(); -} - - -static jerry_value_t _fromCompToSurface(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - TVGERR("LOTTIE", "fromCompToSurface is not supported in expressions!"); - - return jerry_undefined(); -} - - -static jerry_value_t _content(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto name = _name(args[0]); - auto data = static_cast(jerry_object_get_native_ptr(info->function, &freeCb)); - auto group = static_cast(data->obj); - auto target = group->content((char*)name); - free(name); - if (!target) return jerry_undefined(); - - //find the a path property(sh) in the group layer? - switch (target->type) { - case LottieObject::Group: { - auto group = static_cast(target); - auto obj = jerry_function_external(_content); - - //attach a transform - for (auto c = group->children.begin(); c < group->children.end(); ++c) { - if ((*c)->type == LottieObject::Type::Transform) { - _buildTransform(obj, static_cast(*c)); - break; - } - } - auto data2 = (ExpContent*)malloc(sizeof(ExpContent)); - data2->obj = group; - data2->frameNo = data->frameNo; - jerry_object_set_native_ptr(obj, &freeCb, data2); - jerry_object_set_sz(obj, EXP_CONTENT, obj); - return obj; - } - case LottieObject::Path: { - jerry_value_t obj = jerry_object(); - jerry_object_set_native_ptr(obj, nullptr, &static_cast(target)->pathset); - jerry_object_set_sz(obj, "path", obj); - return obj; - } - case LottieObject::Trimpath: { - auto trimpath = static_cast(target); - jerry_value_t obj = jerry_object(); - auto start = jerry_number(trimpath->start(data->frameNo)); - jerry_object_set_sz(obj, "start", start); - jerry_value_free(start); - auto end = jerry_number(trimpath->end(data->frameNo)); - jerry_object_set_sz(obj, "end", end); - jerry_value_free(end); - auto offset = jerry_number(trimpath->offset(data->frameNo)); - jerry_object_set_sz(obj, "offset", end); - jerry_value_free(offset); - return obj; - } - default: break; - } - return jerry_undefined(); -} - - -static jerry_value_t _layer(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto comp = static_cast(jerry_object_get_native_ptr(info->function, nullptr)); - LottieLayer* layer; - - //layer index - if (jerry_value_is_number(args[0])) { - auto idx = (uint16_t)jerry_value_as_int32(args[0]); - layer = comp->layer(idx); - jerry_value_free(idx); - //layer name - } else { - auto name = _name(args[0]); - layer = comp->layer((char*)name); - free(name); - } - - if (!layer) return jerry_undefined(); - - auto obj = jerry_object(); - jerry_object_set_native_ptr(obj, nullptr, layer); - _buildLayer(obj, layer, comp); - - return obj; -} - - -static jerry_value_t _nearestKey(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto exp = static_cast(jerry_object_get_native_ptr(info->function, nullptr)); - auto time = jerry_value_as_number(args[0]); - auto frameNo = exp->comp->frameAtTime(time); - auto index = jerry_number(exp->property->nearest(frameNo)); - - auto obj = jerry_object(); - jerry_object_set_sz(obj, EXP_INDEX, index); - jerry_value_free(index); - - return obj; -} - - -static jerry_value_t _valueAtTime(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto exp = static_cast(jerry_object_get_native_ptr(info->function, nullptr)); - auto time = jerry_value_as_number(args[0]); - auto frameNo = exp->comp->frameAtTime(time); - return _value(frameNo, exp); -} - - -static jerry_value_t _velocityAtTime(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto exp = static_cast(jerry_object_get_native_ptr(info->function, nullptr)); - auto time = jerry_value_as_number(args[0]); - auto frameNo = exp->comp->frameAtTime(time); - auto key = exp->property->nearest(frameNo); - auto pframe = exp->property->frameNo(key - 1); - auto cframe = exp->property->frameNo(key); - auto elapsed = (cframe - pframe) / (exp->comp->frameRate); - - Point cur, prv; - - //compute the velocity - switch (exp->type) { - case LottieProperty::Type::Point: { - prv = (*static_cast(exp->property))(pframe); - cur = (*static_cast(exp->property))(cframe); - break; - } - case LottieProperty::Type::Position: { - prv = (*static_cast(exp->property))(pframe); - cur = (*static_cast(exp->property))(cframe); - break; - } - default: { - TVGERR("LOTTIE", "Non supported type for velocityAtTime?"); - return jerry_undefined(); - } - } - - float velocity[] = {(cur.x - prv.x) / elapsed, (cur.y - prv.y) / elapsed}; - - auto obj = jerry_object(); - auto val1 = jerry_number(velocity[0]); - auto val2 = jerry_number(velocity[1]); - jerry_object_set_index(obj, 0, val1); - jerry_object_set_index(obj, 1, val2); - jerry_value_free(val1); - jerry_value_free(val2); - - return obj; -} - - -static jerry_value_t _speedAtTime(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto exp = static_cast(jerry_object_get_native_ptr(info->function, nullptr)); - auto time = jerry_value_as_number(args[0]); - auto frameNo = exp->comp->frameAtTime(time); - auto key = exp->property->nearest(frameNo); - auto pframe = exp->property->frameNo(key - 1); - auto cframe = exp->property->frameNo(key); - auto elapsed = (cframe - pframe) / (exp->comp->frameRate); - - Point cur, prv; - - //compute the velocity - switch (exp->type) { - case LottieProperty::Type::Point: { - prv = (*static_cast(exp->property))(pframe); - cur = (*static_cast(exp->property))(cframe); - break; - } - case LottieProperty::Type::Position: { - prv = (*static_cast(exp->property))(pframe); - cur = (*static_cast(exp->property))(cframe); - break; - } - default: { - TVGERR("LOTTIE", "Non supported type for speedAtTime?"); - return jerry_undefined(); - } - } - - auto speed = sqrtf(pow(cur.x - prv.x, 2) + pow(cur.y - prv.y, 2)) / elapsed; - auto obj = jerry_number(speed); - return obj; -} - - -static bool _loopOutCommon(LottieExpression* exp, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - exp->loop.mode = LottieExpression::LoopMode::OutCycle; - - if (argsCnt > 0) { - auto name = _name(args[0]); - if (!strcmp(name, EXP_CYCLE)) exp->loop.mode = LottieExpression::LoopMode::OutCycle; - else if (!strcmp(name, EXP_PINGPONG)) exp->loop.mode = LottieExpression::LoopMode::OutPingPong; - else if (!strcmp(name, EXP_OFFSET)) exp->loop.mode = LottieExpression::LoopMode::OutOffset; - else if (!strcmp(name, EXP_CONTINUE)) exp->loop.mode = LottieExpression::LoopMode::OutContinue; - free(name); - } - - if (exp->loop.mode != LottieExpression::LoopMode::OutCycle) { - TVGERR("hermet", "Not supported loopOut type = %d", exp->loop.mode); - return false; - } - - return true; -} - - -static jerry_value_t _loopOut(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto exp = static_cast(jerry_object_get_native_ptr(info->function, nullptr)); - - if (!_loopOutCommon(exp, args, argsCnt)) return jerry_undefined(); - - if (argsCnt > 1) exp->loop.key = jerry_value_as_int32(args[1]); - - auto obj = jerry_object(); - jerry_object_set_native_ptr(obj, nullptr, exp->property); - return obj; -} - - -static jerry_value_t _loopOutDuration(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto exp = static_cast(jerry_object_get_native_ptr(info->function, nullptr)); - - if (!_loopOutCommon(exp, args, argsCnt)) return jerry_undefined(); - - if (argsCnt > 1) { - exp->loop.in = exp->comp->frameAtTime((float)jerry_value_as_int32(args[1])); - } - - auto obj = jerry_object(); - jerry_object_set_native_ptr(obj, nullptr, exp->property); - return obj; -} - - -static bool _loopInCommon(LottieExpression* exp, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - exp->loop.mode = LottieExpression::LoopMode::InCycle; - - if (argsCnt > 0) { - auto name = _name(args[0]); - if (!strcmp(name, EXP_CYCLE)) exp->loop.mode = LottieExpression::LoopMode::InCycle; - else if (!strcmp(name, EXP_PINGPONG)) exp->loop.mode = LottieExpression::LoopMode::InPingPong; - else if (!strcmp(name, EXP_OFFSET)) exp->loop.mode = LottieExpression::LoopMode::InOffset; - else if (!strcmp(name, EXP_CONTINUE)) exp->loop.mode = LottieExpression::LoopMode::InContinue; - free(name); - } - - if (exp->loop.mode != LottieExpression::LoopMode::InCycle) { - TVGERR("hermet", "Not supported loopOut type = %d", exp->loop.mode); - return false; - } - - return true; -} - -static jerry_value_t _loopIn(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto exp = static_cast(jerry_object_get_native_ptr(info->function, nullptr)); - - if (!_loopInCommon(exp, args, argsCnt)) return jerry_undefined(); - - if (argsCnt > 1) { - exp->loop.in = exp->comp->frameAtTime((float)jerry_value_as_int32(args[1])); - } - - auto obj = jerry_object(); - jerry_object_set_native_ptr(obj, nullptr, exp->property); - return obj; -} - - -static jerry_value_t _loopInDuration(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto exp = static_cast(jerry_object_get_native_ptr(info->function, nullptr)); - - if (argsCnt > 1) { - exp->loop.in = exp->comp->frameAtTime((float)jerry_value_as_int32(args[1])); - } - - if (!_loopInCommon(exp, args, argsCnt)) return jerry_undefined(); - - auto obj = jerry_object(); - jerry_object_set_native_ptr(obj, nullptr, exp->property); - return obj; -} - - -static jerry_value_t _key(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto exp = static_cast(jerry_object_get_native_ptr(info->function, nullptr)); - auto key = jerry_value_as_int32(args[0]); - auto frameNo = exp->property->frameNo(key); - auto time = jerry_number(exp->comp->timeAtFrame(frameNo)); - auto value = _value(frameNo, exp); - - auto obj = jerry_object(); - jerry_object_set_sz(obj, EXP_TIME, time); - jerry_object_set_sz(obj, EXP_INDEX, args[0]); - jerry_object_set_sz(obj, EXP_VALUE, value); - - jerry_value_free(time); - jerry_value_free(value); - - return obj; -} - - - -static jerry_value_t _createPath(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - //TODO: arg1: points, arg2: inTangents, arg3: outTangents, arg4: isClosed - auto arg1 = jerry_value_to_object(args[0]); - auto pathset = jerry_object_get_native_ptr(arg1, nullptr); - if (!pathset) { - TVGERR("LOTTIE", "failed createPath()"); - return jerry_undefined(); - } - - jerry_value_free(arg1); - - auto obj = jerry_object(); - jerry_object_set_native_ptr(obj, nullptr, pathset); - return obj; -} - - -static jerry_value_t _uniformPath(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto pathset = static_cast(jerry_object_get_native_ptr(info->function, nullptr)); - - /* TODO: ThorVG prebuilds the path data for performance. - It actually need to constructs the Array for points, inTangents, outTangents and then return here... */ - auto obj = jerry_object(); - jerry_object_set_native_ptr(obj, nullptr, pathset); - return obj; -} - - -static jerry_value_t _isClosed(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - //TODO: Not used - return jerry_boolean(true); -} - - -static void _buildPath(jerry_value_t context, LottieExpression* exp) -{ - //Trick for fast building path. - auto points = jerry_function_external(_uniformPath); - jerry_object_set_native_ptr(points, nullptr, exp->property); - jerry_object_set_sz(context, "points", points); - jerry_value_free(points); - - auto inTangents = jerry_function_external(_uniformPath); - jerry_object_set_native_ptr(inTangents, nullptr, exp->property); - jerry_object_set_sz(context, "inTangents", inTangents); - jerry_value_free(inTangents); - - auto outTangents = jerry_function_external(_uniformPath); - jerry_object_set_native_ptr(outTangents, nullptr, exp->property); - jerry_object_set_sz(context, "outTangents", outTangents); - jerry_value_free(outTangents); - - auto isClosed = jerry_function_external(_isClosed); - jerry_object_set_native_ptr(isClosed, nullptr, exp->property); - jerry_object_set_sz(context, "isClosed", isClosed); - jerry_value_free(isClosed); - -} - - -static void _buildProperty(float frameNo, jerry_value_t context, LottieExpression* exp) -{ - auto value = _value(frameNo, exp); - jerry_object_set_sz(context, EXP_VALUE, value); - jerry_value_free(value); - - auto valueAtTime = jerry_function_external(_valueAtTime); - jerry_object_set_sz(context, "valueAtTime", valueAtTime); - jerry_object_set_native_ptr(valueAtTime, nullptr, exp); - jerry_value_free(valueAtTime); - - auto velocity = jerry_number(0.0f); - jerry_object_set_sz(context, "velocity", velocity); - jerry_value_free(velocity); - - auto velocityAtTime = jerry_function_external(_velocityAtTime); - jerry_object_set_sz(context, "velocityAtTime", velocityAtTime); - jerry_object_set_native_ptr(velocityAtTime, nullptr, exp); - jerry_value_free(velocityAtTime); - - auto speed = jerry_number(0.0f); - jerry_object_set_sz(context, "speed", speed); - jerry_value_free(speed); - - auto speedAtTime = jerry_function_external(_speedAtTime); - jerry_object_set_sz(context, "speedAtTime", speedAtTime); - jerry_object_set_native_ptr(speedAtTime, nullptr, exp); - jerry_value_free(speedAtTime); - - //wiggle(freq, amp, octaves=1, amp_mult=.5, t=time) - //temporalWiggle(freq, amp, octaves=1, amp_mult=.5, t=time) - //smooth(width=.2, samples=5, t=time) - - auto loopIn = jerry_function_external(_loopIn); - jerry_object_set_sz(context, "loopIn", loopIn); - jerry_object_set_native_ptr(loopIn, nullptr, exp); - jerry_value_free(loopIn); - - auto loopOut = jerry_function_external(_loopOut); - jerry_object_set_sz(context, "loopOut", loopOut); - jerry_object_set_native_ptr(loopOut, nullptr, exp); - jerry_value_free(loopOut); - - auto loopInDuration = jerry_function_external(_loopInDuration); - jerry_object_set_sz(context, "loopInDuration", loopInDuration); - jerry_object_set_native_ptr(loopInDuration, nullptr, exp); - jerry_value_free(loopInDuration); - - auto loopOutDuration = jerry_function_external(_loopOutDuration); - jerry_object_set_sz(context, "loopOutDuration", loopOutDuration); - jerry_object_set_native_ptr(loopOutDuration, nullptr, exp); - jerry_value_free(loopOutDuration); - - auto key = jerry_function_external(_key); - jerry_object_set_sz(context, "key", key); - jerry_object_set_native_ptr(key, nullptr, exp); - jerry_value_free(key); - - //key(markerName) - - auto nearestKey = jerry_function_external(_nearestKey); - jerry_object_set_native_ptr(nearestKey, nullptr, exp); - jerry_object_set_sz(context, "nearestKey", nearestKey); - jerry_value_free(nearestKey); - - auto numKeys = jerry_number(exp->property->frameCnt()); - jerry_object_set_sz(context, "numKeys", numKeys); - jerry_value_free(numKeys); - - //propertyGroup(countUp = 1) - //propertyIndex - //name - - //content("name"), #look for the named property from a layer - auto data = (ExpContent*)malloc(sizeof(ExpContent)); - data->obj = exp->layer; - data->frameNo = frameNo; - - auto content = jerry_function_external(_content); - jerry_object_set_sz(context, EXP_CONTENT, content); - jerry_object_set_native_ptr(content, &freeCb, data); - jerry_value_free(content); -} - - -static jerry_value_t _comp(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt) -{ - auto comp = static_cast(jerry_object_get_native_ptr(info->function, nullptr)); - LottieLayer* layer; - - auto arg0 = jerry_value_to_string(args[0]); - auto len = jerry_string_length(arg0); - auto name = (jerry_char_t*)alloca(len * sizeof(jerry_char_t) + 1); - jerry_string_to_buffer(arg0, JERRY_ENCODING_UTF8, name, len); - name[len] = '\0'; - - jerry_value_free(arg0); - - layer = comp->asset((char*)name); - - if (!layer) return jerry_undefined(); - - auto obj = jerry_object(); - jerry_object_set_native_ptr(obj, nullptr, layer); - _buildLayer(obj, layer, comp); - - return obj; -} - - -static void _buildMath(jerry_value_t context) -{ - auto bm_mul = jerry_function_external(_mul); - jerry_object_set_sz(context, "$bm_mul", bm_mul); - jerry_value_free(bm_mul); - - auto bm_sum = jerry_function_external(_add); - jerry_object_set_sz(context, "$bm_sum", bm_sum); - jerry_value_free(bm_sum); - - auto bm_add = jerry_function_external(_add); - jerry_object_set_sz(context, "$bm_add", bm_add); - jerry_value_free(bm_add); - - auto bm_sub = jerry_function_external(_sub); - jerry_object_set_sz(context, "$bm_sub", bm_sub); - jerry_value_free(bm_sub); - - auto bm_div = jerry_function_external(_div); - jerry_object_set_sz(context, "$bm_div", bm_div); - jerry_value_free(bm_div); - - auto mul = jerry_function_external(_mul); - jerry_object_set_sz(context, "mul", mul); - jerry_value_free(mul); - - auto sum = jerry_function_external(_add); - jerry_object_set_sz(context, "sum", sum); - jerry_value_free(sum); - - auto add = jerry_function_external(_add); - jerry_object_set_sz(context, "add", add); - jerry_value_free(add); - - auto sub = jerry_function_external(_sub); - jerry_object_set_sz(context, "sub", sub); - jerry_value_free(sub); - - auto div = jerry_function_external(_div); - jerry_object_set_sz(context, "div", div); - jerry_value_free(div); - - auto clamp = jerry_function_external(_clamp); - jerry_object_set_sz(context, "clamp", clamp); - jerry_value_free(clamp); - - auto dot = jerry_function_external(_dot); - jerry_object_set_sz(context, "dot", dot); - jerry_value_free(dot); - - auto cross = jerry_function_external(_cross); - jerry_object_set_sz(context, "cross", cross); - jerry_value_free(cross); - - auto normalize = jerry_function_external(_normalize); - jerry_object_set_sz(context, "normalize", normalize); - jerry_value_free(normalize); - - auto length = jerry_function_external(_length); - jerry_object_set_sz(context, "length", length); - jerry_value_free(length); - - auto random = jerry_function_external(_random); - jerry_object_set_sz(context, "random", random); - jerry_value_free(random); - - auto deg2rad = jerry_function_external(_deg2rad); - jerry_object_set_sz(context, "degreesToRadians", deg2rad); - jerry_value_free(deg2rad); - - auto rad2deg = jerry_function_external(_rad2deg); - jerry_object_set_sz(context, "radiansToDegrees", rad2deg); - jerry_value_free(rad2deg); - - auto linear = jerry_function_external(_linear); - jerry_object_set_sz(context, "linear", linear); - jerry_value_free(linear); - - auto ease = jerry_function_external(_ease); - jerry_object_set_sz(context, "ease", ease); - jerry_value_free(ease); - - auto easeIn = jerry_function_external(_easeIn); - jerry_object_set_sz(context, "easeIn", easeIn); - jerry_value_free(easeIn); - - auto easeOut = jerry_function_external(_easeOut); - jerry_object_set_sz(context, "easeOut", easeOut); - jerry_value_free(easeOut); - - //lookAt -} - - -void LottieExpressions::buildComp(LottieComposition* comp) -{ - jerry_object_set_native_ptr(this->comp, nullptr, comp); - jerry_object_set_native_ptr(thisComp, nullptr, comp); - jerry_object_set_native_ptr(layer, nullptr, comp); - - //marker - //marker.key(index) - //marker.key(name) - //marker.nearestKey(t) - //marker.numKeys - - auto numLayers = jerry_number(comp->root->children.count); - jerry_object_set_sz(thisComp, "numLayers", numLayers); - jerry_value_free(numLayers); - - //activeCamera - - auto width = jerry_number(comp->w); - jerry_object_set_sz(thisComp, EXP_WIDTH, width); - jerry_value_free(width); - - auto height = jerry_number(comp->h); - jerry_object_set_sz(thisComp, EXP_HEIGHT, height); - jerry_value_free(height); - - auto duration = jerry_number(comp->duration()); - jerry_object_set_sz(thisComp, "duration", duration); - jerry_value_free(duration); - - //ntscDropFrame - //displayStartTime - - auto frameDuration = jerry_number(1.0f / comp->frameRate); - jerry_object_set_sz(thisComp, "frameDuration", frameDuration); - jerry_value_free(frameDuration); - - //shutterAngle - //shutterPhase - //bgColor - //pixelAspect - - auto name = jerry_string((jerry_char_t*)comp->name, strlen(comp->name), JERRY_ENCODING_UTF8); - jerry_object_set_sz(thisComp, EXP_NAME, name); - jerry_value_free(name); -} - - -jerry_value_t LottieExpressions::buildGlobal() -{ - global = jerry_current_realm(); - - //comp(name) - comp = jerry_function_external(_comp); - jerry_object_set_sz(global, "comp", comp); - - //footage(name) - - thisComp = jerry_object(); - jerry_object_set_sz(global, "thisComp", thisComp); - - //layer(index) / layer(name) / layer(otherLayer, reIndex) - layer = jerry_function_external(_layer); - jerry_object_set_sz(thisComp, "layer", layer); - - thisLayer = jerry_object(); - jerry_object_set_sz(global, "thisLayer", thisLayer); - - thisProperty = jerry_object(); - jerry_object_set_sz(global, "thisProperty", thisProperty); - - auto effect = jerry_function_external(_effect); - jerry_object_set_sz(global, EXP_EFFECT, effect); - jerry_value_free(effect); - - auto fromCompToSurface = jerry_function_external(_fromCompToSurface); - jerry_object_set_sz(global, "fromCompToSurface", fromCompToSurface); - jerry_value_free(fromCompToSurface); - - auto createPath = jerry_function_external(_createPath); - jerry_object_set_sz(global, "createPath", createPath); - jerry_value_free(createPath); - - //posterizeTime(framesPerSecond) - //value - - return global; -} - - -jerry_value_t LottieExpressions::evaluate(float frameNo, LottieExpression* exp) -{ - buildComp(exp->comp); - - //update global context values - jerry_object_set_native_ptr(thisLayer, nullptr, exp->layer); - _buildLayer(thisLayer, exp->layer, exp->comp); - - jerry_object_set_native_ptr(thisProperty, nullptr, exp->property); - _buildProperty(frameNo, global, exp); - - if (exp->type == LottieProperty::Type::PathSet) _buildPath(thisProperty, exp); - if (exp->object->type == LottieObject::Transform) _buildTransform(global, static_cast(exp->object)); - - //evaluate the code - auto eval = jerry_eval((jerry_char_t *) exp->code, strlen(exp->code), JERRY_PARSE_NO_OPTS); - - if (jerry_value_is_exception(eval) || jerry_value_is_undefined(eval)) { - exp->enabled = false; // The feature is experimental, it will be forcefully turned off if it's incompatible. - return jerry_undefined(); - } - - jerry_value_free(eval); - - return jerry_object_get_sz(global, "$bm_rt"); -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -LottieExpressions::~LottieExpressions() -{ - jerry_value_free(thisProperty); - jerry_value_free(thisLayer); - jerry_value_free(layer); - jerry_value_free(thisComp); - jerry_value_free(comp); - jerry_value_free(global); - jerry_cleanup(); -} - - -LottieExpressions::LottieExpressions() -{ - jerry_init(JERRY_INIT_EMPTY); - _buildMath(buildGlobal()); -} - - -void LottieExpressions::update(float curTime) -{ - //time, #current time in seconds - auto time = jerry_number(curTime); - jerry_object_set_sz(global, EXP_TIME, time); - jerry_value_free(time); -} - - -//FIXME: Threads support -#include "tvgTaskScheduler.h" - -LottieExpressions* LottieExpressions::instance() -{ - //FIXME: Threads support - if (TaskScheduler::threads() > 1) { - TVGLOG("LOTTIE", "Lottie Expressions are not supported with tvg threads"); - return nullptr; - } - - if (!exps) exps = new LottieExpressions; - ++engineRefCnt; - return exps; -} - - -void LottieExpressions::retrieve(LottieExpressions* instance) -{ - if (--engineRefCnt == 0) { - delete(instance); - exps = nullptr; - } -} - - -#endif //THORVG_LOTTIE_EXPRESSIONS_SUPPORT - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieExpressions.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieExpressions.h deleted file mode 100644 index 14819a8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieExpressions.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (c) 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_LOTTIE_EXPRESSIONS_H_ -#define _TVG_LOTTIE_EXPRESSIONS_H_ - -#include "tvgCommon.h" - -struct LottieExpression; -struct LottieComposition; -struct RGB24; - -#ifdef THORVG_LOTTIE_EXPRESSIONS_SUPPORT - -#include "jerryscript.h" - - -struct LottieExpressions -{ -public: - template - bool result(float frameNo, NumType& out, LottieExpression* exp) - { - auto bm_rt = evaluate(frameNo, exp); - - if (auto prop = static_cast(jerry_object_get_native_ptr(bm_rt, nullptr))) { - out = (*prop)(frameNo); - } else if (jerry_value_is_number(bm_rt)) { - out = (NumType) jerry_value_as_number(bm_rt); - } else { - TVGERR("LOTTIE", "Failed dispatching a Value!"); - return false; - } - jerry_value_free(bm_rt); - return true; - } - - template - bool result(float frameNo, Point& out, LottieExpression* exp) - { - auto bm_rt = evaluate(frameNo, exp); - - if (jerry_value_is_object(bm_rt)) { - if (auto prop = static_cast(jerry_object_get_native_ptr(bm_rt, nullptr))) { - out = (*prop)(frameNo); - } else { - auto x = jerry_object_get_index(bm_rt, 0); - auto y = jerry_object_get_index(bm_rt, 1); - out.x = jerry_value_as_number(x); - out.y = jerry_value_as_number(y); - jerry_value_free(x); - jerry_value_free(y); - } - } else { - TVGERR("LOTTIE", "Failed dispatching Point!"); - return false; - } - jerry_value_free(bm_rt); - return true; - } - - template - bool result(float frameNo, RGB24& out, LottieExpression* exp) - { - auto bm_rt = evaluate(frameNo, exp); - - if (auto color = static_cast(jerry_object_get_native_ptr(bm_rt, nullptr))) { - out = (*color)(frameNo); - } else { - TVGERR("LOTTIE", "Failed dispatching Color!"); - return false; - } - jerry_value_free(bm_rt); - return true; - } - - template - bool result(float frameNo, Fill* fill, LottieExpression* exp) - { - auto bm_rt = evaluate(frameNo, exp); - - if (auto colorStop = static_cast(jerry_object_get_native_ptr(bm_rt, nullptr))) { - (*colorStop)(frameNo, fill, this); - } else { - TVGERR("LOTTIE", "Failed dispatching ColorStop!"); - return false; - } - jerry_value_free(bm_rt); - return true; - } - - template - bool result(float frameNo, Array& cmds, Array& pts, Matrix* transform, float roundness, LottieExpression* exp) - { - auto bm_rt = evaluate(frameNo, exp); - - if (auto pathset = static_cast(jerry_object_get_native_ptr(bm_rt, nullptr))) { - (*pathset)(frameNo, cmds, pts, transform, roundness); - } else { - TVGERR("LOTTIE", "Failed dispatching PathSet!"); - return false; - } - jerry_value_free(bm_rt); - return true; - } - - void update(float curTime); - - //singleton (no thread safety) - static LottieExpressions* instance(); - static void retrieve(LottieExpressions* instance); - -private: - LottieExpressions(); - ~LottieExpressions(); - - jerry_value_t evaluate(float frameNo, LottieExpression* exp); - jerry_value_t buildGlobal(); - void buildComp(LottieComposition* comp); - - //global object, attributes, methods - jerry_value_t global; - jerry_value_t comp; - jerry_value_t layer; - jerry_value_t thisComp; - jerry_value_t thisLayer; - jerry_value_t thisProperty; -}; - -#else - -struct LottieExpressions -{ - template bool result(TVG_UNUSED float, TVG_UNUSED NumType&, TVG_UNUSED LottieExpression*) { return false; } - template bool result(TVG_UNUSED float, TVG_UNUSED Point&, LottieExpression*) { return false; } - template bool result(TVG_UNUSED float, TVG_UNUSED RGB24&, TVG_UNUSED LottieExpression*) { return false; } - template bool result(TVG_UNUSED float, TVG_UNUSED Fill*, TVG_UNUSED LottieExpression*) { return false; } - template bool result(TVG_UNUSED float, TVG_UNUSED Array&, TVG_UNUSED Array&, TVG_UNUSED Matrix* transform, TVG_UNUSED float, TVG_UNUSED LottieExpression*) { return false; } - void update(TVG_UNUSED float) {} - static LottieExpressions* instance() { return nullptr; } - static void retrieve(TVG_UNUSED LottieExpressions* instance) {} -}; - -#endif //THORVG_LOTTIE_EXPRESSIONS_SUPPORT - -#endif //_TVG_LOTTIE_EXPRESSIONS_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieInterpolator.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieInterpolator.cpp deleted file mode 100644 index c92bfb6..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieInterpolator.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include -#include "tvgCommon.h" -#include "tvgMath.h" -#include "tvgLottieInterpolator.h" - - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -#define NEWTON_MIN_SLOPE 0.02f -#define NEWTON_ITERATIONS 4 -#define SUBDIVISION_PRECISION 0.0000001f -#define SUBDIVISION_MAX_ITERATIONS 10 - - -static inline float _constA(float aA1, float aA2) { return 1.0f - 3.0f * aA2 + 3.0f * aA1; } -static inline float _constB(float aA1, float aA2) { return 3.0f * aA2 - 6.0f * aA1; } -static inline float _constC(float aA1) { return 3.0f * aA1; } - - -static inline float _getSlope(float t, float aA1, float aA2) -{ - return 3.0f * _constA(aA1, aA2) * t * t + 2.0f * _constB(aA1, aA2) * t + _constC(aA1); -} - - -static inline float _calcBezier(float t, float aA1, float aA2) -{ - return ((_constA(aA1, aA2) * t + _constB(aA1, aA2)) * t + _constC(aA1)) * t; -} - - -float LottieInterpolator::getTForX(float aX) -{ - //Find interval where t lies - auto intervalStart = 0.0f; - auto currentSample = &samples[1]; - auto lastSample = &samples[SPLINE_TABLE_SIZE - 1]; - - for (; currentSample != lastSample && *currentSample <= aX; ++currentSample) { - intervalStart += SAMPLE_STEP_SIZE; - } - - --currentSample; // t now lies between *currentSample and *currentSample+1 - - // Interpolate to provide an initial guess for t - auto dist = (aX - *currentSample) / (*(currentSample + 1) - *currentSample); - auto guessForT = intervalStart + dist * SAMPLE_STEP_SIZE; - - // Check the slope to see what strategy to use. If the slope is too small - // Newton-Raphson iteration won't converge on a root so we use bisection - // instead. - auto initialSlope = _getSlope(guessForT, outTangent.x, inTangent.x); - if (initialSlope >= NEWTON_MIN_SLOPE) return NewtonRaphsonIterate(aX, guessForT); - else if (initialSlope == 0.0) return guessForT; - else return binarySubdivide(aX, intervalStart, intervalStart + SAMPLE_STEP_SIZE); -} - - -float LottieInterpolator::binarySubdivide(float aX, float aA, float aB) -{ - float x, t; - int i = 0; - - do { - t = aA + (aB - aA) / 2.0f; - x = _calcBezier(t, outTangent.x, inTangent.x) - aX; - if (x > 0.0f) aB = t; - else aA = t; - } while (fabsf(x) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS); - return t; -} - - -float LottieInterpolator::NewtonRaphsonIterate(float aX, float aGuessT) -{ - // Refine guess with Newton-Raphson iteration - for (int i = 0; i < NEWTON_ITERATIONS; ++i) { - // We're trying to find where f(t) = aX, - // so we're actually looking for a root for: CalcBezier(t) - aX - auto currentX = _calcBezier(aGuessT, outTangent.x, inTangent.x) - aX; - auto currentSlope = _getSlope(aGuessT, outTangent.x, inTangent.x); - if (currentSlope == 0.0f) return aGuessT; - aGuessT -= currentX / currentSlope; - } - return aGuessT; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -float LottieInterpolator::progress(float t) -{ - if (outTangent.x == outTangent.y && inTangent.x == inTangent.y) return t; - return _calcBezier(getTForX(t), outTangent.y, inTangent.y); -} - - -void LottieInterpolator::set(const char* key, Point& inTangent, Point& outTangent) -{ - this->key = strdup(key); - this->inTangent = inTangent; - this->outTangent = outTangent; - - if (outTangent.x == outTangent.y && inTangent.x == inTangent.y) return; - - //calculates sample values - for (int i = 0; i < SPLINE_TABLE_SIZE; ++i) { - samples[i] = _calcBezier(float(i) * SAMPLE_STEP_SIZE, outTangent.x, inTangent.x); - } -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieInterpolator.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieInterpolator.h deleted file mode 100644 index c7d07d4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieInterpolator.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_LOTTIE_INTERPOLATOR_H_ -#define _TVG_LOTTIE_INTERPOLATOR_H_ - -#define SPLINE_TABLE_SIZE 11 - -struct LottieInterpolator -{ - char* key; - Point outTangent, inTangent; - - float progress(float t); - void set(const char* key, Point& inTangent, Point& outTangent); - -private: - static constexpr float SAMPLE_STEP_SIZE = 1.0f / float(SPLINE_TABLE_SIZE - 1); - float samples[SPLINE_TABLE_SIZE]; - - float getTForX(float aX); - float binarySubdivide(float aX, float aA, float aB); - float NewtonRaphsonIterate(float aX, float aGuessT); -}; - -#endif //_TVG_LOTTIE_INTERPOLATOR_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieLoader.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieLoader.cpp deleted file mode 100644 index 8230211..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieLoader.cpp +++ /dev/null @@ -1,407 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgLottieLoader.h" -#include "tvgLottieModel.h" -#include "tvgLottieParser.h" -#include "tvgLottieBuilder.h" -#include "tvgStr.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -void LottieLoader::run(unsigned tid) -{ - //update frame - if (comp) { - builder->update(comp, frameNo); - //initial loading - } else { - LottieParser parser(content, dirName); - if (!parser.parse()) return; - comp = parser.comp; - builder->build(comp); - } - rebuild = false; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -LottieLoader::LottieLoader() : FrameModule(FileType::Lottie), builder(new LottieBuilder) -{ - -} - - -LottieLoader::~LottieLoader() -{ - this->done(); - - if (copy) free((char*)content); - free(dirName); - - //TODO: correct position? - delete(comp); - delete(builder); -} - - -bool LottieLoader::header() -{ - //A single thread doesn't need to perform intensive tasks. - if (TaskScheduler::threads() == 0) { - run(0); - if (comp) { - w = static_cast(comp->w); - h = static_cast(comp->h); - frameDuration = comp->duration(); - frameCnt = comp->frameCnt(); - return true; - } else { - return false; - } - } - - //Quickly validate the given Lottie file without parsing in order to get the animation info. - auto startFrame = 0.0f; - auto endFrame = 0.0f; - auto frameRate = 0.0f; - uint32_t depth = 0; - - auto p = content; - - while (*p != '\0') { - if (*p == '{') { - ++depth; - ++p; - continue; - } - if (*p == '}') { - --depth; - ++p; - continue; - } - if (depth != 1) { - ++p; - continue; - } - //version. - if (!strncmp(p, "\"v\":", 4)) { - p += 4; - continue; - } - - //framerate - if (!strncmp(p, "\"fr\":", 5)) { - p += 5; - auto e = strstr(p, ","); - if (!e) e = strstr(p, "}"); - frameRate = strToFloat(p, nullptr); - p = e; - continue; - } - - //start frame - if (!strncmp(p, "\"ip\":", 5)) { - p += 5; - auto e = strstr(p, ","); - if (!e) e = strstr(p, "}"); - startFrame = strToFloat(p, nullptr); - p = e; - continue; - } - - //end frame - if (!strncmp(p, "\"op\":", 5)) { - p += 5; - auto e = strstr(p, ","); - if (!e) e = strstr(p, "}"); - endFrame = strToFloat(p, nullptr); - p = e; - continue; - } - - //width - if (!strncmp(p, "\"w\":", 4)) { - p += 4; - auto e = strstr(p, ","); - if (!e) e = strstr(p, "}"); - w = strToFloat(p, nullptr); - p = e; - continue; - } - //height - if (!strncmp(p, "\"h\":", 4)) { - p += 4; - auto e = strstr(p, ","); - if (!e) e = strstr(p, "}"); - h = strToFloat(p, nullptr); - p = e; - continue; - } - ++p; - } - - if (frameRate < FLOAT_EPSILON) { - TVGLOG("LOTTIE", "Not a Lottie file? Frame rate is 0!"); - return false; - } - - frameCnt = (endFrame - startFrame); - frameDuration = frameCnt / frameRate; - - TVGLOG("LOTTIE", "info: frame rate = %f, duration = %f size = %f x %f", frameRate, frameDuration, w, h); - - return true; -} - - -bool LottieLoader::open(const char* data, uint32_t size, bool copy) -{ - if (copy) { - content = (char*)malloc(size); - if (!content) return false; - memcpy((char*)content, data, size); - } else content = data; - - this->size = size; - this->copy = copy; - - return header(); -} - - -bool LottieLoader::open(const string& path) -{ - auto f = fopen(path.c_str(), "r"); - if (!f) return false; - - fseek(f, 0, SEEK_END); - - size = ftell(f); - if (size == 0) { - fclose(f); - return false; - } - - auto content = (char*)(malloc(sizeof(char) * size + 1)); - fseek(f, 0, SEEK_SET); - auto ret = fread(content, sizeof(char), size, f); - if (ret < size) { - fclose(f); - return false; - } - content[size] = '\0'; - - fclose(f); - - this->dirName = strDirname(path.c_str()); - this->content = content; - this->copy = true; - - return header(); -} - - -bool LottieLoader::resize(Paint* paint, float w, float h) -{ - if (!paint) return false; - - auto sx = w / this->w; - auto sy = h / this->h; - Matrix m = {sx, 0, 0, 0, sy, 0, 0, 0, 1}; - paint->transform(m); - - //apply the scale to the base clipper - const Paint* clipper; - paint->composite(&clipper); - if (clipper) const_cast(clipper)->transform(m); - - return true; -} - - -bool LottieLoader::read() -{ - if (!content || size == 0) return false; - - //the loading has been already completed - if (comp || !LoadModule::read()) return true; - - TaskScheduler::request(this); - - return true; -} - - -Paint* LottieLoader::paint() -{ - done(); - - if (!comp) return nullptr; - comp->initiated = true; - return comp->root->scene; -} - - -bool LottieLoader::override(const char* slot) -{ - if (!comp) done(); - - if (!comp || comp->slots.count == 0) return false; - - auto success = true; - - //override slots - if (slot) { - //Copy the input data because the JSON parser will encode the data immediately. - auto temp = strdup(slot); - - //parsing slot json - LottieParser parser(temp, dirName); - - auto idx = 0; - while (auto sid = parser.sid(idx == 0)) { - for (auto s = comp->slots.begin(); s < comp->slots.end(); ++s) { - if (strcmp((*s)->sid, sid)) continue; - if (!parser.apply(*s)) success = false; - break; - } - ++idx; - } - - if (idx < 1) success = false; - free(temp); - rebuild = overridden = success; - //reset slots - } else if (overridden) { - for (auto s = comp->slots.begin(); s < comp->slots.end(); ++s) { - (*s)->reset(); - } - overridden = false; - rebuild = true; - } - return success; -} - - -bool LottieLoader::frame(float no) -{ - auto frameNo = no + startFrame(); - - //This ensures that the target frame number is reached. - frameNo *= 10000.0f; - frameNo = roundf(frameNo); - frameNo *= 0.0001f; - - //Skip update if frame diff is too small. - if (fabsf(this->frameNo - frameNo) <= 0.0009f) return false; - - this->done(); - - this->frameNo = frameNo; - - TaskScheduler::request(this); - - return true; -} - - -float LottieLoader::startFrame() -{ - return frameCnt * segmentBegin; -} - - -float LottieLoader::totalFrame() -{ - return (segmentEnd - segmentBegin) * frameCnt; -} - - -float LottieLoader::curFrame() -{ - return frameNo - startFrame(); -} - - -float LottieLoader::duration() -{ - if (segmentBegin == 0.0f && segmentEnd == 1.0f) return frameDuration; - - if (!comp) done(); - if (!comp) return 0.0f; - - return frameCnt * (segmentEnd - segmentBegin) / comp->frameRate; -} - - -void LottieLoader::sync() -{ - this->done(); - - if (rebuild) run(0); -} - - -uint32_t LottieLoader::markersCnt() -{ - if (!comp) done(); - if (!comp) return 0; - return comp->markers.count; -} - - -const char* LottieLoader::markers(uint32_t index) -{ - if (!comp) done(); - if (!comp || index >= comp->markers.count) return nullptr; - auto marker = comp->markers.begin() + index; - return (*marker)->name; -} - - -bool LottieLoader::segment(const char* marker, float& begin, float& end) -{ - if (!comp) done(); - if (!comp) return false; - - for (auto m = comp->markers.begin(); m < comp->markers.end(); ++m) { - if (!strcmp(marker, (*m)->name)) { - begin = (*m)->time / frameCnt; - end = ((*m)->time + (*m)->duration) / frameCnt; - return true; - } - } - return false; -} - - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieLoader.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieLoader.h deleted file mode 100644 index 57ad9b7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieLoader.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_LOTTIE_LOADER_H_ -#define _TVG_LOTTIE_LOADER_H_ - -#include "tvgCommon.h" -#include "tvgFrameModule.h" -#include "tvgTaskScheduler.h" - -struct LottieComposition; -struct LottieBuilder; - -class LottieLoader : public FrameModule, public Task -{ -public: - const char* content = nullptr; //lottie file data - uint32_t size = 0; //lottie data size - float frameNo = 0.0f; //current frame number - float frameCnt = 0.0f; - float frameDuration = 0.0f; - - LottieBuilder* builder; - LottieComposition* comp = nullptr; - - char* dirName = nullptr; //base resource directory - bool copy = false; //"content" is owned by this loader - bool overridden = false; //overridden properties with slots - bool rebuild = false; //require building the lottie scene - - LottieLoader(); - ~LottieLoader(); - - bool open(const string& path) override; - bool open(const char* data, uint32_t size, bool copy) override; - bool resize(Paint* paint, float w, float h) override; - bool read() override; - Paint* paint() override; - bool override(const char* slot); - - //Frame Controls - bool frame(float no) override; - float totalFrame() override; - float curFrame() override; - float duration() override; - void sync() override; - - //Marker Supports - uint32_t markersCnt(); - const char* markers(uint32_t index); - bool segment(const char* marker, float& begin, float& end); - -private: - bool header(); - void clear(); - float startFrame(); - void run(unsigned tid) override; -}; - - -#endif //_TVG_LOTTIELOADER_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieModel.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieModel.cpp deleted file mode 100644 index 5230adb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieModel.cpp +++ /dev/null @@ -1,424 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgPaint.h" -#include "tvgFill.h" -#include "tvgLottieModel.h" - - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -void LottieSlot::reset() -{ - if (!overridden) return; - - for (auto pair = pairs.begin(); pair < pairs.end(); ++pair) { - switch (type) { - case LottieProperty::Type::ColorStop: { - static_cast(pair->obj)->colorStops.release(); - static_cast(pair->obj)->colorStops = *static_cast(pair->prop); - static_cast(pair->prop)->frames = nullptr; - break; - } - case LottieProperty::Type::Color: { - static_cast(pair->obj)->color.release(); - static_cast(pair->obj)->color = *static_cast(pair->prop); - static_cast(pair->prop)->frames = nullptr; - break; - } - case LottieProperty::Type::TextDoc: { - static_cast(pair->obj)->doc.release(); - static_cast(pair->obj)->doc = *static_cast(pair->prop); - static_cast(pair->prop)->frames = nullptr; - break; - } - default: break; - } - delete(pair->prop); - pair->prop = nullptr; - } - overridden = false; -} - - -void LottieSlot::assign(LottieObject* target) -{ - //apply slot object to all targets - for (auto pair = pairs.begin(); pair < pairs.end(); ++pair) { - //backup the original properties before overwriting - switch (type) { - case LottieProperty::Type::ColorStop: { - if (!overridden) { - pair->prop = new LottieColorStop; - *static_cast(pair->prop) = static_cast(pair->obj)->colorStops; - } - - pair->obj->override(&static_cast(target)->colorStops); - break; - } - case LottieProperty::Type::Color: { - if (!overridden) { - pair->prop = new LottieColor; - *static_cast(pair->prop) = static_cast(pair->obj)->color; - } - - pair->obj->override(&static_cast(target)->color); - break; - } - case LottieProperty::Type::TextDoc: { - if (!overridden) { - pair->prop = new LottieTextDoc; - *static_cast(pair->prop) = static_cast(pair->obj)->doc; - } - - pair->obj->override(&static_cast(target)->doc); - break; - } - default: break; - } - } - overridden = true; -} - - -LottieImage::~LottieImage() -{ - free(b64Data); - free(mimeType); - - if (picture && PP(picture)->unref() == 0) { - delete(picture); - } -} - - -void LottieTrimpath::segment(float frameNo, float& start, float& end, LottieExpressions* exps) -{ - auto s = this->start(frameNo, exps) * 0.01f; - auto e = this->end(frameNo, exps) * 0.01f; - auto o = fmodf(this->offset(frameNo, exps), 360.0f) / 360.0f; //0 ~ 1 - - auto diff = fabs(s - e); - if (mathZero(diff)) { - start = 0.0f; - end = 0.0f; - return; - } - if (mathEqual(diff, 1.0f) || mathEqual(diff, 2.0f)) { - start = 0.0f; - end = 1.0f; - return; - } - - s += o; - e += o; - - auto loop = true; - - //no loop - if (s > 1.0f && e > 1.0f) loop = false; - if (s < 0.0f && e < 0.0f) loop = false; - if (s >= 0.0f && s <= 1.0f && e >= 0.0f && e <= 1.0f) loop = false; - - if (s > 1.0f) s -= 1.0f; - if (s < 0.0f) s += 1.0f; - if (e > 1.0f) e -= 1.0f; - if (e < 0.0f) e += 1.0f; - - if (loop) { - start = s > e ? s : e; - end = s < e ? s : e; - } else { - start = s < e ? s : e; - end = s > e ? s : e; - } -} - - -uint32_t LottieGradient::populate(ColorStop& color) -{ - colorStops.populated = true; - if (!color.input) return 0; - - uint32_t alphaCnt = (color.input->count - (colorStops.count * 4)) / 2; - Array output(colorStops.count + alphaCnt); - uint32_t cidx = 0; //color count - uint32_t clast = colorStops.count * 4; - if (clast > color.input->count) clast = color.input->count; - uint32_t aidx = clast; //alpha count - Fill::ColorStop cs; - - //merge color stops. - for (uint32_t i = 0; i < color.input->count; ++i) { - if (cidx == clast || aidx == color.input->count) break; - if ((*color.input)[cidx] == (*color.input)[aidx]) { - cs.offset = (*color.input)[cidx]; - cs.r = lroundf((*color.input)[cidx + 1] * 255.0f); - cs.g = lroundf((*color.input)[cidx + 2] * 255.0f); - cs.b = lroundf((*color.input)[cidx + 3] * 255.0f); - cs.a = lroundf((*color.input)[aidx + 1] * 255.0f); - cidx += 4; - aidx += 2; - } else if ((*color.input)[cidx] < (*color.input)[aidx]) { - cs.offset = (*color.input)[cidx]; - cs.r = lroundf((*color.input)[cidx + 1] * 255.0f); - cs.g = lroundf((*color.input)[cidx + 2] * 255.0f); - cs.b = lroundf((*color.input)[cidx + 3] * 255.0f); - //generate alpha value - if (output.count > 0) { - auto p = ((*color.input)[cidx] - output.last().offset) / ((*color.input)[aidx] - output.last().offset); - cs.a = mathLerp(output.last().a, lroundf((*color.input)[aidx + 1] * 255.0f), p); - } else cs.a = 255; - cidx += 4; - } else { - cs.offset = (*color.input)[aidx]; - cs.a = lroundf((*color.input)[aidx + 1] * 255.0f); - //generate color value - if (output.count > 0) { - auto p = ((*color.input)[aidx] - output.last().offset) / ((*color.input)[cidx] - output.last().offset); - cs.r = mathLerp(output.last().r, lroundf((*color.input)[cidx + 1] * 255.0f), p); - cs.g = mathLerp(output.last().g, lroundf((*color.input)[cidx + 2] * 255.0f), p); - cs.b = mathLerp(output.last().b, lroundf((*color.input)[cidx + 3] * 255.0f), p); - } else cs.r = cs.g = cs.b = 255; - aidx += 2; - } - output.push(cs); - } - - //color remains - while (cidx + 3 < clast) { - cs.offset = (*color.input)[cidx]; - cs.r = lroundf((*color.input)[cidx + 1] * 255.0f); - cs.g = lroundf((*color.input)[cidx + 2] * 255.0f); - cs.b = lroundf((*color.input)[cidx + 3] * 255.0f); - cs.a = (output.count > 0) ? output.last().a : 255; - output.push(cs); - cidx += 4; - } - - //alpha remains - while (aidx < color.input->count) { - cs.offset = (*color.input)[aidx]; - cs.a = lroundf((*color.input)[aidx + 1] * 255.0f); - if (output.count > 0) { - cs.r = output.last().r; - cs.g = output.last().g; - cs.b = output.last().b; - } else cs.r = cs.g = cs.b = 255; - output.push(cs); - aidx += 2; - } - - color.data = output.data; - output.data = nullptr; - - color.input->reset(); - delete(color.input); - - return output.count; -} - - -Fill* LottieGradient::fill(float frameNo, LottieExpressions* exps) -{ - Fill* fill = nullptr; - auto s = start(frameNo, exps); - auto e = end(frameNo, exps); - - //Linear Gradient - if (id == 1) { - fill = LinearGradient::gen().release(); - static_cast(fill)->linear(s.x, s.y, e.x, e.y); - } - //Radial Gradient - if (id == 2) { - fill = RadialGradient::gen().release(); - - auto w = fabsf(e.x - s.x); - auto h = fabsf(e.y - s.y); - auto r = (w > h) ? (w + 0.375f * h) : (h + 0.375f * w); - auto progress = this->height(frameNo, exps) * 0.01f; - - if (mathZero(progress)) { - P(static_cast(fill))->radial(s.x, s.y, r, s.x, s.y, 0.0f); - } else { - if (mathEqual(progress, 1.0f)) progress = 0.99f; - auto startAngle = mathRad2Deg(atan2(e.y - s.y, e.x - s.x)); - auto angle = mathDeg2Rad((startAngle + this->angle(frameNo, exps))); - auto fx = s.x + cos(angle) * progress * r; - auto fy = s.y + sin(angle) * progress * r; - // Lottie doesn't have any focal radius concept - P(static_cast(fill))->radial(s.x, s.y, r, fx, fy, 0.0f); - } - } - - if (!fill) return nullptr; - - colorStops(frameNo, fill, exps); - - return fill; -} - - -void LottieGroup::prepare(LottieObject::Type type) -{ - LottieObject::type = type; - - if (children.count == 0) return; - - size_t strokeCnt = 0; - size_t fillCnt = 0; - - for (auto c = children.end() - 1; c >= children.begin(); --c) { - auto child = static_cast(*c); - - if (child->type == LottieObject::Type::Trimpath) trimpath = true; - - /* Figure out if this group is a simple path drawing. - In that case, the rendering context can be sharable with the parent's. */ - if (allowMerge && (child->type == LottieObject::Group || !child->mergeable())) allowMerge = false; - - if (reqFragment) continue; - - /* Figure out if the rendering context should be fragmented. - Multiple stroking or grouping with a stroking would occur this. - This fragment resolves the overlapped stroke outlines. */ - if (child->type == LottieObject::Group && !child->mergeable()) { - if (strokeCnt > 0 || fillCnt > 0) reqFragment = true; - } else if (child->type == LottieObject::SolidStroke || child->type == LottieObject::GradientStroke) { - if (strokeCnt > 0) reqFragment = true; - else ++strokeCnt; - } else if (child->type == LottieObject::SolidFill || child->type == LottieObject::GradientFill) { - if (fillCnt > 0) reqFragment = true; - else ++fillCnt; - } - } - - //Reverse the drawing order if this group has a trimpath. - if (!trimpath) return; - - for (uint32_t i = 0; i < children.count - 1; ) { - auto child2 = children[i + 1]; - if (!child2->mergeable() || child2->type == LottieObject::Transform) { - i += 2; - continue; - } - auto child = children[i]; - if (!child->mergeable() || child->type == LottieObject::Transform) { - i++; - continue; - } - children[i] = child2; - children[i + 1] = child; - i++; - } -} - - -LottieLayer::~LottieLayer() -{ - if (refId) { - //No need to free assets children because the Composition owns them. - children.clear(); - free(refId); - } - - for (auto m = masks.begin(); m < masks.end(); ++m) { - delete(*m); - } - - delete(matte.target); - delete(transform); -} - -void LottieLayer::prepare() -{ - /* if layer is hidden, only useful data is its transform matrix. - so force it to be a Null Layer and release all resource. */ - if (hidden) { - type = LottieLayer::Null; - for (auto p = children.begin(); p < children.end(); ++p) delete(*p); - children.reset(); - return; - } - LottieGroup::prepare(LottieObject::Layer); -} - - -float LottieLayer::remap(float frameNo, LottieExpressions* exp) -{ - if (timeRemap.frames || timeRemap.value) { - frameNo = comp->frameAtTime(timeRemap(frameNo, exp)); - } else { - frameNo -= startFrame; - } - return (frameNo / timeStretch); -} - - -LottieComposition::~LottieComposition() -{ - if (!initiated && root) delete(root->scene); - - delete(root); - free(version); - free(name); - - //delete interpolators - for (auto i = interpolators.begin(); i < interpolators.end(); ++i) { - free((*i)->key); - free(*i); - } - - //delete assets - for (auto a = assets.begin(); a < assets.end(); ++a) { - delete(*a); - } - - //delete fonts - for (auto f = fonts.begin(); f < fonts.end(); ++f) { - delete(*f); - } - - //delete slots - for (auto s = slots.begin(); s < slots.end(); ++s) { - delete(*s); - } - - for (auto m = markers.begin(); m < markers.end(); ++m) { - delete(*m); - } -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieModel.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieModel.h deleted file mode 100644 index 6ba92de..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieModel.h +++ /dev/null @@ -1,685 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_LOTTIE_MODEL_H_ -#define _TVG_LOTTIE_MODEL_H_ - -#include - -#include "tvgCommon.h" -#include "tvgRender.h" -#include "tvgLottieProperty.h" - - -struct LottieComposition; - -struct LottieStroke -{ - struct DashAttr - { - //0: offset, 1: dash, 2: gap - LottieFloat value[3] = {0.0f, 0.0f, 0.0f}; - }; - - virtual ~LottieStroke() - { - delete(dashattr); - } - - LottieFloat& dash(int no) - { - if (!dashattr) dashattr = new DashAttr; - return dashattr->value[no]; - } - - float dashOffset(float frameNo, LottieExpressions* exps) - { - return dash(0)(frameNo, exps); - } - - float dashGap(float frameNo, LottieExpressions* exps) - { - return dash(2)(frameNo, exps); - } - - float dashSize(float frameNo, LottieExpressions* exps) - { - auto d = dash(1)(frameNo, exps); - if (d == 0.0f) return 0.1f; - else return d; - } - - LottieFloat width = 0.0f; - DashAttr* dashattr = nullptr; - float miterLimit = 0; - StrokeCap cap = StrokeCap::Round; - StrokeJoin join = StrokeJoin::Round; -}; - - -struct LottieMask -{ - LottiePathSet pathset; - LottieOpacity opacity = 255; - CompositeMethod method; - bool inverse = false; -}; - - -struct LottieObject -{ - enum Type : uint8_t - { - Composition = 0, - Layer, - Group, - Transform, - SolidFill, - SolidStroke, - GradientFill, - GradientStroke, - Rect, - Ellipse, - Path, - Polystar, - Image, - Trimpath, - Text, - Repeater, - RoundedCorner - }; - - virtual ~LottieObject() - { - free(name); - } - - virtual void override(LottieProperty* prop) - { - TVGERR("LOTTIE", "Unsupported slot type"); - } - - virtual bool mergeable() { return false; } - - char* name = nullptr; - Type type; - bool hidden = false; //remove? -}; - - -struct LottieGlyph -{ - Array children; //glyph shapes. - float width; - char* code; - char* family = nullptr; - char* style = nullptr; - uint16_t size; - uint8_t len; - - void prepare() - { - len = strlen(code); - } - - ~LottieGlyph() - { - for (auto p = children.begin(); p < children.end(); ++p) delete(*p); - free(code); - } -}; - - -struct LottieFont -{ - enum Origin : uint8_t { Local = 0, CssURL, ScriptURL, FontURL, Embedded }; - - ~LottieFont() - { - for (auto c = chars.begin(); c < chars.end(); ++c) delete(*c); - free(style); - free(family); - free(name); - } - - Array chars; - char* name = nullptr; - char* family = nullptr; - char* style = nullptr; - float ascent = 0.0f; - Origin origin = Embedded; -}; - -struct LottieMarker -{ - char* name = nullptr; - float time = 0.0f; - float duration = 0.0f; - - ~LottieMarker() - { - free(name); - } -}; - -struct LottieText : LottieObject -{ - void prepare() - { - LottieObject::type = LottieObject::Text; - } - - void override(LottieProperty* prop) override - { - this->doc = *static_cast(prop); - this->prepare(); - } - - LottieTextDoc doc; - LottieFont* font; - LottieFloat spacing = 0.0f; //letter spacing -}; - - -struct LottieTrimpath : LottieObject -{ - enum Type : uint8_t { Simultaneous = 1, Individual = 2 }; - - void prepare() - { - LottieObject::type = LottieObject::Trimpath; - } - - bool mergeable() override - { - if (!start.frames && start.value == 0.0f && !end.frames && end.value == 100.0f && !offset.frames && offset.value == 0.0f) return true; - return false; - } - - void segment(float frameNo, float& start, float& end, LottieExpressions* exps); - - LottieFloat start = 0.0f; - LottieFloat end = 100.0f; - LottieFloat offset = 0.0f; - Type type = Simultaneous; -}; - - -struct LottieShape : LottieObject -{ - virtual ~LottieShape() {} - uint8_t direction = 0; //0: clockwise, 2: counter-clockwise, 3: xor(?) - - bool mergeable() override - { - return true; - } -}; - - -struct LottieRoundedCorner : LottieObject -{ - void prepare() - { - LottieObject::type = LottieObject::RoundedCorner; - } - LottieFloat radius = 0.0f; -}; - - -struct LottiePath : LottieShape -{ - void prepare() - { - LottieObject::type = LottieObject::Path; - } - - LottiePathSet pathset; -}; - - -struct LottieRect : LottieShape -{ - void prepare() - { - LottieObject::type = LottieObject::Rect; - } - - LottiePosition position = Point{0.0f, 0.0f}; - LottiePoint size = Point{0.0f, 0.0f}; - LottieFloat radius = 0.0f; //rounded corner radius -}; - - -struct LottiePolyStar : LottieShape -{ - enum Type : uint8_t {Star = 1, Polygon}; - - void prepare() - { - LottieObject::type = LottieObject::Polystar; - } - - LottiePosition position = Point{0.0f, 0.0f}; - LottieFloat innerRadius = 0.0f; - LottieFloat outerRadius = 0.0f; - LottieFloat innerRoundness = 0.0f; - LottieFloat outerRoundness = 0.0f; - LottieFloat rotation = 0.0f; - LottieFloat ptsCnt = 0.0f; - Type type = Polygon; -}; - - -struct LottieEllipse : LottieShape -{ - void prepare() - { - LottieObject::type = LottieObject::Ellipse; - } - - LottiePosition position = Point{0.0f, 0.0f}; - LottiePoint size = Point{0.0f, 0.0f}; -}; - - -struct LottieTransform : LottieObject -{ - struct SeparateCoord - { - LottieFloat x = 0.0f; - LottieFloat y = 0.0f; - }; - - struct RotationEx - { - LottieFloat x = 0.0f; - LottieFloat y = 0.0f; - }; - - ~LottieTransform() - { - delete(coords); - delete(rotationEx); - } - - void prepare() - { - LottieObject::type = LottieObject::Transform; - } - - bool mergeable() override - { - if (!opacity.frames && opacity.value == 255) return true; - return false; - } - - LottiePosition position = Point{0.0f, 0.0f}; - LottieFloat rotation = 0.0f; //z rotation - LottiePoint scale = Point{100.0f, 100.0f}; - LottiePoint anchor = Point{0.0f, 0.0f}; - LottieOpacity opacity = 255; - LottieFloat skewAngle = 0.0f; - LottieFloat skewAxis = 0.0f; - - SeparateCoord* coords = nullptr; //either a position or separate coordinates - RotationEx* rotationEx = nullptr; //extension for 3d rotation -}; - - -struct LottieSolid : LottieObject -{ - LottieColor color = RGB24{255, 255, 255}; - LottieOpacity opacity = 255; -}; - - -struct LottieSolidStroke : LottieSolid, LottieStroke -{ - void prepare() - { - LottieObject::type = LottieObject::SolidStroke; - } - - void override(LottieProperty* prop) override - { - this->color = *static_cast(prop); - this->prepare(); - } -}; - - -struct LottieSolidFill : LottieSolid -{ - void prepare() - { - LottieObject::type = LottieObject::SolidFill; - } - - void override(LottieProperty* prop) override - { - this->color = *static_cast(prop); - this->prepare(); - } - - FillRule rule = FillRule::Winding; -}; - - -struct LottieGradient : LottieObject -{ - bool prepare() - { - if (!colorStops.populated) { - if (colorStops.frames) { - for (auto v = colorStops.frames->begin(); v < colorStops.frames->end(); ++v) { - colorStops.count = populate(v->value); - } - } else { - colorStops.count = populate(colorStops.value); - } - } - if (start.frames || end.frames || height.frames || angle.frames || opacity.frames || colorStops.frames) return true; - return false; - } - - uint32_t populate(ColorStop& color); - Fill* fill(float frameNo, LottieExpressions* exps); - - LottiePoint start = Point{0.0f, 0.0f}; - LottiePoint end = Point{0.0f, 0.0f}; - LottieFloat height = 0.0f; - LottieFloat angle = 0.0f; - LottieOpacity opacity = 255; - LottieColorStop colorStops; - uint8_t id = 0; //1: linear, 2: radial -}; - - -struct LottieGradientFill : LottieGradient -{ - void prepare() - { - LottieObject::type = LottieObject::GradientFill; - LottieGradient::prepare(); - } - - void override(LottieProperty* prop) override - { - this->colorStops = *static_cast(prop); - this->prepare(); - } - - FillRule rule = FillRule::Winding; -}; - - -struct LottieGradientStroke : LottieGradient, LottieStroke -{ - void prepare() - { - LottieObject::type = LottieObject::GradientStroke; - LottieGradient::prepare(); - } - - void override(LottieProperty* prop) override - { - this->colorStops = *static_cast(prop); - this->prepare(); - } -}; - - -struct LottieImage : LottieObject -{ - union { - char* b64Data = nullptr; - char* path; - }; - char* mimeType = nullptr; - uint32_t size = 0; - - Picture* picture = nullptr; //tvg render data - - ~LottieImage(); - - void prepare() - { - LottieObject::type = LottieObject::Image; - } -}; - - -struct LottieRepeater : LottieObject -{ - void prepare() - { - LottieObject::type = LottieObject::Repeater; - } - - LottieFloat copies = 0.0f; - LottieFloat offset = 0.0f; - - //Transform - LottiePosition position = Point{0.0f, 0.0f}; - LottieFloat rotation = 0.0f; - LottiePoint scale = Point{100.0f, 100.0f}; - LottiePoint anchor = Point{0.0f, 0.0f}; - LottieOpacity startOpacity = 255; - LottieOpacity endOpacity = 255; - bool inorder = true; //true: higher, false: lower -}; - - -struct LottieGroup : LottieObject -{ - virtual ~LottieGroup() - { - for (auto p = children.begin(); p < children.end(); ++p) delete(*p); - } - - void prepare(LottieObject::Type type = LottieObject::Group); - bool mergeable() override { return allowMerge; } - - LottieObject* content(const char* id) - { - if (name && !strcmp(name, id)) return this; - - //source has children, find recursively. - for (auto c = children.begin(); c < children.end(); ++c) { - auto child = *c; - if (child->type == LottieObject::Type::Group || child->type == LottieObject::Type::Layer) { - if (auto ret = static_cast(child)->content(id)) return ret; - } else if (child->name && !strcmp(child->name, id)) return child; - } - return nullptr; - } - - Scene* scene = nullptr; //tvg render data - Array children; - - bool reqFragment = false; //requirement to fragment the render context - bool buildDone = false; //completed in building the composition. - bool allowMerge = true; //if this group is consisted of simple (transformed) shapes. - bool trimpath = false; //this group has a trimpath. -}; - - -struct LottieLayer : LottieGroup -{ - enum Type : uint8_t {Precomp = 0, Solid, Image, Null, Shape, Text}; - - ~LottieLayer(); - - uint8_t opacity(float frameNo) - { - //return zero if the visibility is false. - if (type == Null) return 255; - return transform->opacity(frameNo); - } - - bool mergeable() override { return false; } - - void prepare(); - float remap(float frameNo, LottieExpressions* exp); - - struct { - CompositeMethod type = CompositeMethod::None; - LottieLayer* target = nullptr; - } matte; - - BlendMethod blendMethod = BlendMethod::Normal; - LottieLayer* parent = nullptr; - LottieFloat timeRemap = 0.0f; - LottieComposition* comp = nullptr; - LottieTransform* transform = nullptr; - Array masks; - RGB24 color; //used by Solid layer - - float timeStretch = 1.0f; - float w = 0.0f, h = 0.0f; - float inFrame = 0.0f; - float outFrame = 0.0f; - float startFrame = 0.0f; - char* refId = nullptr; //pre-composition reference. - int16_t pid = -1; //id of the parent layer. - int16_t id = -1; //id of the current layer. - - //cached data - struct { - float frameNo = -1.0f; - Matrix matrix; - uint8_t opacity; - } cache; - - Type type = Null; - bool autoOrient = false; - bool matteSrc = false; -}; - - -struct LottieSlot -{ - struct Pair { - LottieObject* obj; - LottieProperty* prop; - }; - - void assign(LottieObject* target); - void reset(); - - LottieSlot(char* sid, LottieObject* obj, LottieProperty::Type type) : sid(sid), type(type) - { - pairs.push({obj, 0}); - } - - ~LottieSlot() - { - free(sid); - if (!overridden) return; - for (auto pair = pairs.begin(); pair < pairs.end(); ++pair) { - delete(pair->prop); - } - } - - char* sid; - Array pairs; - LottieProperty::Type type; - bool overridden = false; -}; - - -struct LottieComposition -{ - ~LottieComposition(); - - float duration() const - { - return frameCnt() / frameRate; // in second - } - - float frameAtTime(float timeInSec) const - { - auto p = timeInSec / duration(); - if (p < 0.0f) p = 0.0f; - return p * frameCnt(); - } - - float timeAtFrame(float frameNo) - { - return (frameNo - startFrame) / frameRate; - } - - float frameCnt() const - { - return endFrame - startFrame; - } - - LottieLayer* layer(const char* name) - { - for (auto child = root->children.begin(); child < root->children.end(); ++child) { - auto layer = static_cast(*child); - if (layer->name && !strcmp(layer->name, name)) return layer; - } - return nullptr; - } - - LottieLayer* layer(int16_t id) - { - for (auto child = root->children.begin(); child < root->children.end(); ++child) { - auto layer = static_cast(*child); - if (layer->id == id) return layer; - } - return nullptr; - } - - LottieLayer* asset(const char* name) - { - for (auto asset = assets.begin(); asset < assets.end(); ++asset) { - auto layer = static_cast(*asset); - if (layer->name && !strcmp(layer->name, name)) return layer; - } - return nullptr; - } - - LottieLayer* root = nullptr; - char* version = nullptr; - char* name = nullptr; - float w, h; - float startFrame, endFrame; - float frameRate; - Array assets; - Array interpolators; - Array fonts; - Array slots; - Array markers; - bool expressions = false; - bool initiated = false; -}; - -#endif //_TVG_LOTTIE_MODEL_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieParser.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieParser.cpp deleted file mode 100644 index 17e43b0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieParser.cpp +++ /dev/null @@ -1,1405 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgStr.h" -#include "tvgCompressor.h" -#include "tvgLottieModel.h" -#include "tvgLottieParser.h" -#include "tvgLottieExpressions.h" - - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -#define KEY_AS(name) !strcmp(key, name) - - -static LottieExpression* _expression(char* code, LottieComposition* comp, LottieLayer* layer, LottieObject* object, LottieProperty* property, LottieProperty::Type type) -{ - if (!comp->expressions) comp->expressions = true; - - auto inst = new LottieExpression; - inst->code = code; - inst->comp = comp; - inst->layer = layer; - inst->object = object; - inst->property = property; - inst->type = type; - inst->enabled = true; - - return inst; -} - - -static char* _int2str(int num) -{ - char str[20]; - snprintf(str, 20, "%d", num); - return strdup(str); -} - - -CompositeMethod LottieParser::getMaskMethod(bool inversed) -{ - auto mode = getString(); - if (!mode) return CompositeMethod::None; - - switch (mode[0]) { - case 'a': { - if (inversed) return CompositeMethod::InvAlphaMask; - else return CompositeMethod::AddMask; - } - case 's': return CompositeMethod::SubtractMask; - case 'i': return CompositeMethod::IntersectMask; - case 'f': return CompositeMethod::DifferenceMask; - default: return CompositeMethod::None; - } -} - - -BlendMethod LottieParser::getBlendMethod() -{ - switch (getInt()) { - case 0: return BlendMethod::Normal; - case 1: return BlendMethod::Multiply; - case 2: return BlendMethod::Screen; - case 3: return BlendMethod::Overlay; - case 4: return BlendMethod::Darken; - case 5: return BlendMethod::Lighten; - case 6: return BlendMethod::ColorDodge; - case 7: return BlendMethod::ColorBurn; - case 8: return BlendMethod::HardLight; - case 9: return BlendMethod::SoftLight; - case 10: return BlendMethod::Difference; - case 11: return BlendMethod::Exclusion; - //case 12: return BlendMethod::Hue: - //case 13: return BlendMethod::Saturation: - //case 14: return BlendMethod::Color: - //case 15: return BlendMethod::Luminosity: - case 16: return BlendMethod::Add; - //case 17: return BlendMethod::HardMix: - default: { - TVGERR("LOTTIE", "Non-Supported Blend Mode"); - return BlendMethod::Normal; - } - } -} - - -RGB24 LottieParser::getColor(const char *str) -{ - RGB24 color = {0, 0, 0}; - - if (!str) return color; - - auto len = strlen(str); - - // some resource has empty color string, return a default color for those cases. - if (len != 7 || str[0] != '#') return color; - - char tmp[3] = {'\0', '\0', '\0'}; - tmp[0] = str[1]; - tmp[1] = str[2]; - color.rgb[0] = uint8_t(strtol(tmp, nullptr, 16)); - - tmp[0] = str[3]; - tmp[1] = str[4]; - color.rgb[1] = uint8_t(strtol(tmp, nullptr, 16)); - - tmp[0] = str[5]; - tmp[1] = str[6]; - color.rgb[2] = uint8_t(strtol(tmp, nullptr, 16)); - - return color; -} - - -FillRule LottieParser::getFillRule() -{ - switch (getInt()) { - case 1: return FillRule::Winding; - default: return FillRule::EvenOdd; - } -} - - -CompositeMethod LottieParser::getMatteType() -{ - switch (getInt()) { - case 1: return CompositeMethod::AlphaMask; - case 2: return CompositeMethod::InvAlphaMask; - case 3: return CompositeMethod::LumaMask; - case 4: return CompositeMethod::InvLumaMask; - default: return CompositeMethod::None; - } -} - - -StrokeCap LottieParser::getStrokeCap() -{ - switch (getInt()) { - case 1: return StrokeCap::Butt; - case 2: return StrokeCap::Round; - default: return StrokeCap::Square; - } -} - - -StrokeJoin LottieParser::getStrokeJoin() -{ - switch (getInt()) { - case 1: return StrokeJoin::Miter; - case 2: return StrokeJoin::Round; - default: return StrokeJoin::Bevel; - } -} - - -void LottieParser::getValue(TextDocument& doc) -{ - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("s")) doc.size = getFloat(); - else if (KEY_AS("f")) doc.name = getStringCopy(); - else if (KEY_AS("t")) doc.text = getStringCopy(); - else if (KEY_AS("j")) doc.justify = getInt(); - else if (KEY_AS("tr")) doc.tracking = getFloat() * 0.1f; - else if (KEY_AS("lh")) doc.height = getFloat(); - else if (KEY_AS("ls")) doc.shift = getFloat(); - else if (KEY_AS("fc")) getValue(doc.color); - else if (KEY_AS("ps")) getValue(doc.bbox.pos); - else if (KEY_AS("sz")) getValue(doc.bbox.size); - else if (KEY_AS("sc")) getValue(doc.stroke.color); - else if (KEY_AS("sw")) doc.stroke.width = getFloat(); - else if (KEY_AS("of")) doc.stroke.render = getBool(); - else skip(key); - } -} - - -void LottieParser::getValue(PathSet& path) -{ - Array outs, ins, pts; - bool closed = false; - - /* The shape object could be wrapped by a array - if its part of the keyframe object */ - auto arrayWrapper = (peekType() == kArrayType) ? true : false; - if (arrayWrapper) enterArray(); - - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("i")) getValue(ins); - else if (KEY_AS("o")) getValue(outs); - else if (KEY_AS("v")) getValue(pts); - else if (KEY_AS("c")) closed = getBool(); - else skip(key); - } - - //exit properly from the array - if (arrayWrapper) nextArrayValue(); - - //valid path data? - if (ins.empty() || outs.empty() || pts.empty()) return; - if (ins.count != outs.count || outs.count != pts.count) return; - - //convert path - auto out = outs.begin(); - auto in = ins.begin(); - auto pt = pts.begin(); - - //Store manipulated results - Array outPts; - Array outCmds; - - //Reuse the buffers - outPts.data = path.pts; - outPts.reserved = path.ptsCnt; - outCmds.data = path.cmds; - outCmds.reserved = path.cmdsCnt; - - size_t extra = closed ? 3 : 0; - outPts.reserve(pts.count * 3 + 1 + extra); - outCmds.reserve(pts.count + 2); - - outCmds.push(PathCommand::MoveTo); - outPts.push(*pt); - - for (++pt, ++out, ++in; pt < pts.end(); ++pt, ++out, ++in) { - outCmds.push(PathCommand::CubicTo); - outPts.push(*(pt - 1) + *(out - 1)); - outPts.push(*pt + *in); - outPts.push(*pt); - } - - if (closed) { - outPts.push(pts.last() + outs.last()); - outPts.push(pts.first() + ins.first()); - outPts.push(pts.first()); - outCmds.push(PathCommand::CubicTo); - outCmds.push(PathCommand::Close); - } - - path.pts = outPts.data; - path.cmds = outCmds.data; - path.ptsCnt = outPts.count; - path.cmdsCnt = outCmds.count; - - outPts.data = nullptr; - outCmds.data = nullptr; -} - - -void LottieParser::getValue(ColorStop& color) -{ - if (peekType() == kArrayType) enterArray(); - - color.input = new Array(static_cast(context.parent)->colorStops.count); - - while (nextArrayValue()) color.input->push(getFloat()); -} - - -void LottieParser::getValue(Array& pts) -{ - enterArray(); - while (nextArrayValue()) { - enterArray(); - Point pt; - getValue(pt); - pts.push(pt); - } -} - - -void LottieParser::getValue(uint8_t& val) -{ - if (peekType() == kArrayType) { - enterArray(); - if (nextArrayValue()) val = (uint8_t)(getFloat() * 2.55f); - //discard rest - while (nextArrayValue()) getFloat(); - } else { - val = (uint8_t)(getFloat() * 2.55f); - } -} - - -void LottieParser::getValue(float& val) -{ - if (peekType() == kArrayType) { - enterArray(); - if (nextArrayValue()) val = getFloat(); - //discard rest - while (nextArrayValue()) getFloat(); - } else { - val = getFloat(); - } -} - - -void LottieParser::getValue(Point& pt) -{ - int i = 0; - auto ptr = (float*)(&pt); - - if (peekType() == kArrayType) enterArray(); - - while (nextArrayValue()) { - auto val = getFloat(); - if (i < 2) ptr[i++] = val; - } -} - - -void LottieParser::getValue(RGB24& color) -{ - int i = 0; - - if (peekType() == kArrayType) enterArray(); - - while (nextArrayValue()) { - auto val = getFloat(); - if (i < 3) color.rgb[i++] = int32_t(lroundf(val * 255.0f)); - } - - //TODO: color filter? -} - - -void LottieParser::getInterpolatorPoint(Point& pt) -{ - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("x")) getValue(pt.x); - else if (KEY_AS("y")) getValue(pt.y); - } -} - - -template -void LottieParser::parseSlotProperty(T& prop) -{ - while (auto key = nextObjectKey()) { - if (KEY_AS("p")) parseProperty(prop); - else skip(key); - } -} - - -template -bool LottieParser::parseTangent(const char *key, LottieVectorFrame& value) -{ - if (KEY_AS("ti")) { - value.hasTangent = true; - getValue(value.inTangent); - } else if (KEY_AS("to")) { - value.hasTangent = true; - getValue(value.outTangent); - } else return false; - - return true; -} - - -template -bool LottieParser::parseTangent(const char *key, LottieScalarFrame& value) -{ - return false; -} - - -LottieInterpolator* LottieParser::getInterpolator(const char* key, Point& in, Point& out) -{ - char buf[20]; - - if (!key) { - snprintf(buf, sizeof(buf), "%.2f_%.2f_%.2f_%.2f", in.x, in.y, out.x, out.y); - key = buf; - } - - LottieInterpolator* interpolator = nullptr; - - //get a cached interpolator if it has any. - for (auto i = comp->interpolators.begin(); i < comp->interpolators.end(); ++i) { - if (!strncmp((*i)->key, key, sizeof(buf))) interpolator = *i; - } - - //new interpolator - if (!interpolator) { - interpolator = static_cast(malloc(sizeof(LottieInterpolator))); - interpolator->set(key, in, out); - comp->interpolators.push(interpolator); - } - - return interpolator; -} - - -template -void LottieParser::parseKeyFrame(T& prop) -{ - Point inTangent, outTangent; - const char* interpolatorKey = nullptr; - auto& frame = prop.newFrame(); - auto interpolator = false; - - enterObject(); - - while (auto key = nextObjectKey()) { - if (KEY_AS("i")) { - interpolator = true; - getInterpolatorPoint(inTangent); - } else if (KEY_AS("o")) { - getInterpolatorPoint(outTangent); - } else if (KEY_AS("n")) { - if (peekType() == kStringType) { - interpolatorKey = getString(); - } else { - enterArray(); - while (nextArrayValue()) { - if (!interpolatorKey) interpolatorKey = getString(); - else skip(nullptr); - } - } - } else if (KEY_AS("t")) { - frame.no = getFloat(); - } else if (KEY_AS("s")) { - getValue(frame.value); - } else if (KEY_AS("e")) { - //current end frame and the next start frame is duplicated, - //We propagate the end value to the next frame to avoid having duplicated values. - auto& frame2 = prop.nextFrame(); - getValue(frame2.value); - } else if (parseTangent(key, frame)) { - continue; - } else if (KEY_AS("h")) { - frame.hold = getInt(); - } else skip(key); - } - - if (interpolator) { - frame.interpolator = getInterpolator(interpolatorKey, inTangent, outTangent); - } -} - -template -void LottieParser::parsePropertyInternal(T& prop) -{ - //single value property - if (peekType() == kNumberType) { - getValue(prop.value); - //multi value property - } else { - //TODO: Here might be a single frame. - //Can we figure out the frame number in advance? - enterArray(); - while (nextArrayValue()) { - //keyframes value - if (peekType() == kObjectType) { - parseKeyFrame(prop); - //multi value property with no keyframes - } else { - getValue(prop.value); - break; - } - } - prop.prepare(); - } -} - - -template -void LottieParser::parseProperty(T& prop, LottieObject* obj) -{ - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("k")) parsePropertyInternal(prop); - else if (obj && KEY_AS("sid")) { - auto sid = getStringCopy(); - //append object if the slot already exists. - for (auto slot = comp->slots.begin(); slot < comp->slots.end(); ++slot) { - if (strcmp((*slot)->sid, sid)) continue; - (*slot)->pairs.push({obj, 0}); - return; - } - comp->slots.push(new LottieSlot(sid, obj, type)); - } else if (!strcmp(key, "x")) { - prop.exp = _expression(getStringCopy(), comp, context.layer, context.parent, &prop, type); - } - else skip(key); - } -} - - -LottieRect* LottieParser::parseRect() -{ - auto rect = new LottieRect; - if (!rect) return nullptr; - - context.parent = rect; - - while (auto key = nextObjectKey()) { - if (KEY_AS("s")) parseProperty(rect->size); - else if (KEY_AS("p"))parseProperty(rect->position); - else if (KEY_AS("r")) parseProperty(rect->radius); - else if (KEY_AS("nm")) rect->name = getStringCopy(); - else if (KEY_AS("hd")) rect->hidden = getBool(); - else skip(key); - } - rect->prepare(); - return rect; -} - - -LottieEllipse* LottieParser::parseEllipse() -{ - auto ellipse = new LottieEllipse; - if (!ellipse) return nullptr; - - context.parent = ellipse; - - while (auto key = nextObjectKey()) { - if (KEY_AS("nm")) ellipse->name = getStringCopy(); - else if (KEY_AS("p")) parseProperty(ellipse->position); - else if (KEY_AS("s")) parseProperty(ellipse->size); - else if (KEY_AS("hd")) ellipse->hidden = getBool(); - else skip(key); - } - ellipse->prepare(); - return ellipse; -} - - -LottieTransform* LottieParser::parseTransform(bool ddd) -{ - auto transform = new LottieTransform; - if (!transform) return nullptr; - - context.parent = transform; - - if (ddd) { - transform->rotationEx = new LottieTransform::RotationEx; - TVGLOG("LOTTIE", "3D transform(ddd) is not totally compatible."); - } - - while (auto key = nextObjectKey()) { - if (KEY_AS("p")) - { - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("k")) parsePropertyInternal(transform->position); - else if (KEY_AS("s") && getBool()) transform->coords = new LottieTransform::SeparateCoord; - //check separateCoord to figure out whether "x(expression)" / "x(coord)" - else if (transform->coords && KEY_AS("x")) parseProperty(transform->coords->x); - else if (transform->coords && KEY_AS("y")) parseProperty(transform->coords->y); - else if (KEY_AS("x")) transform->position.exp = _expression(getStringCopy(), comp, context.layer, context.parent, &transform->position, LottieProperty::Type::Position); - else skip(key); - } - } - else if (KEY_AS("a")) parseProperty(transform->anchor); - else if (KEY_AS("s")) parseProperty(transform->scale); - else if (KEY_AS("r")) parseProperty(transform->rotation); - else if (KEY_AS("o")) parseProperty(transform->opacity); - else if (transform->rotationEx && KEY_AS("rx")) parseProperty(transform->rotationEx->x); - else if (transform->rotationEx && KEY_AS("ry")) parseProperty(transform->rotationEx->y); - else if (transform->rotationEx && KEY_AS("rz")) parseProperty(transform->rotation); - else if (KEY_AS("nm")) transform->name = getStringCopy(); - else if (KEY_AS("sk")) parseProperty(transform->skewAngle); - else if (KEY_AS("sa")) parseProperty(transform->skewAxis); - else skip(key); - } - transform->prepare(); - return transform; -} - - -LottieSolidFill* LottieParser::parseSolidFill() -{ - auto fill = new LottieSolidFill; - if (!fill) return nullptr; - - context.parent = fill; - - while (auto key = nextObjectKey()) { - if (KEY_AS("nm")) fill->name = getStringCopy(); - else if (KEY_AS("c")) parseProperty(fill->color, fill); - else if (KEY_AS("o")) parseProperty(fill->opacity, fill); - else if (KEY_AS("fillEnabled")) fill->hidden |= !getBool(); - else if (KEY_AS("r")) fill->rule = getFillRule(); - else if (KEY_AS("hd")) fill->hidden = getBool(); - else skip(key); - } - fill->prepare(); - return fill; -} - - -void LottieParser::parseStrokeDash(LottieStroke* stroke) -{ - enterArray(); - while (nextArrayValue()) { - enterObject(); - int idx = 0; - while (auto key = nextObjectKey()) { - if (KEY_AS("n")) { - auto style = getString(); - if (!strcmp("o", style)) idx = 0; //offset - else if (!strcmp("d", style)) idx = 1; //dash - else if (!strcmp("g", style)) idx = 2; //gap - } else if (KEY_AS("v")) { - parseProperty(stroke->dash(idx)); - } else skip(key); - } - } -} - - -LottieSolidStroke* LottieParser::parseSolidStroke() -{ - auto stroke = new LottieSolidStroke; - if (!stroke) return nullptr; - - context.parent = stroke; - - while (auto key = nextObjectKey()) { - if (KEY_AS("c")) parseProperty(stroke->color, stroke); - else if (KEY_AS("o")) parseProperty(stroke->opacity, stroke); - else if (KEY_AS("w")) parseProperty(stroke->width, stroke); - else if (KEY_AS("lc")) stroke->cap = getStrokeCap(); - else if (KEY_AS("lj")) stroke->join = getStrokeJoin(); - else if (KEY_AS("ml")) stroke->miterLimit = getFloat(); - else if (KEY_AS("nm")) stroke->name = getStringCopy(); - else if (KEY_AS("hd")) stroke->hidden = getBool(); - else if (KEY_AS("fillEnabled")) stroke->hidden |= !getBool(); - else if (KEY_AS("d")) parseStrokeDash(stroke); - else skip(key); - } - stroke->prepare(); - return stroke; -} - - -void LottieParser::getPathSet(LottiePathSet& path) -{ - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("k")) { - if (peekType() == kArrayType) { - enterArray(); - while (nextArrayValue()) parseKeyFrame(path); - } else { - getValue(path.value); - } - } else if (!strcmp(key, "x")) { - path.exp = _expression(getStringCopy(), comp, context.layer, context.parent, &path, LottieProperty::Type::PathSet); - } else skip(key); - } -} - - -LottiePath* LottieParser::parsePath() -{ - auto path = new LottiePath; - if (!path) return nullptr; - - while (auto key = nextObjectKey()) { - if (KEY_AS("nm")) path->name = getStringCopy(); - else if (KEY_AS("ks")) getPathSet(path->pathset); - else if (KEY_AS("hd")) path->hidden = getBool(); - else skip(key); - } - path->prepare(); - return path; -} - - -LottiePolyStar* LottieParser::parsePolyStar() -{ - auto star = new LottiePolyStar; - if (!star) return nullptr; - - context.parent = star; - - while (auto key = nextObjectKey()) { - if (KEY_AS("nm")) star->name = getStringCopy(); - else if (KEY_AS("p")) parseProperty(star->position); - else if (KEY_AS("pt")) parseProperty(star->ptsCnt); - else if (KEY_AS("ir")) parseProperty(star->innerRadius); - else if (KEY_AS("is")) parseProperty(star->innerRoundness); - else if (KEY_AS("or")) parseProperty(star->outerRadius); - else if (KEY_AS("os")) parseProperty(star->outerRoundness); - else if (KEY_AS("r")) parseProperty(star->rotation); - else if (KEY_AS("sy")) star->type = (LottiePolyStar::Type) getInt(); - else if (KEY_AS("hd")) star->hidden = getBool(); - else skip(key); - } - star->prepare(); - return star; -} - - -LottieRoundedCorner* LottieParser::parseRoundedCorner() -{ - auto corner = new LottieRoundedCorner; - if (!corner) return nullptr; - - context.parent = corner; - - while (auto key = nextObjectKey()) { - if (KEY_AS("nm")) corner->name = getStringCopy(); - else if (KEY_AS("r")) parseProperty(corner->radius); - else if (KEY_AS("hd")) corner->hidden = getBool(); - else skip(key); - } - corner->prepare(); - return corner; -} - - -void LottieParser::parseGradient(LottieGradient* gradient, const char* key) -{ - if (KEY_AS("t")) gradient->id = getInt(); - else if (KEY_AS("o")) parseProperty(gradient->opacity, gradient); - else if (KEY_AS("g")) - { - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("p")) gradient->colorStops.count = getInt(); - else if (KEY_AS("k")) parseProperty(gradient->colorStops, gradient); - else skip(key); - } - } - else if (KEY_AS("s")) parseProperty(gradient->start, gradient); - else if (KEY_AS("e")) parseProperty(gradient->end, gradient); - else if (KEY_AS("h")) parseProperty(gradient->height, gradient); - else if (KEY_AS("a")) parseProperty(gradient->angle, gradient); - else skip(key); -} - - -LottieGradientFill* LottieParser::parseGradientFill() -{ - auto fill = new LottieGradientFill; - if (!fill) return nullptr; - - context.parent = fill; - - while (auto key = nextObjectKey()) { - if (KEY_AS("nm")) fill->name = getStringCopy(); - else if (KEY_AS("r")) fill->rule = getFillRule(); - else if (KEY_AS("hd")) fill->hidden = getBool(); - else parseGradient(fill, key); - } - - fill->prepare(); - - return fill; -} - - -LottieGradientStroke* LottieParser::parseGradientStroke() -{ - auto stroke = new LottieGradientStroke; - if (!stroke) return nullptr; - - context.parent = stroke; - - while (auto key = nextObjectKey()) { - if (KEY_AS("nm")) stroke->name = getStringCopy(); - else if (KEY_AS("lc")) stroke->cap = getStrokeCap(); - else if (KEY_AS("lj")) stroke->join = getStrokeJoin(); - else if (KEY_AS("ml")) stroke->miterLimit = getFloat(); - else if (KEY_AS("hd")) stroke->hidden = getBool(); - else if (KEY_AS("w")) parseProperty(stroke->width); - else if (KEY_AS("d")) parseStrokeDash(stroke); - else parseGradient(stroke, key); - } - stroke->prepare(); - - return stroke; -} - - -LottieTrimpath* LottieParser::parseTrimpath() -{ - auto trim = new LottieTrimpath; - if (!trim) return nullptr; - - context.parent = trim; - - while (auto key = nextObjectKey()) { - if (KEY_AS("nm")) trim->name = getStringCopy(); - else if (KEY_AS("s")) parseProperty(trim->start); - else if (KEY_AS("e")) parseProperty(trim->end); - else if (KEY_AS("o")) parseProperty(trim->offset); - else if (KEY_AS("m")) trim->type = static_cast(getInt()); - else if (KEY_AS("hd")) trim->hidden = getBool(); - else skip(key); - } - trim->prepare(); - - return trim; -} - - -LottieRepeater* LottieParser::parseRepeater() -{ - auto repeater = new LottieRepeater; - if (!repeater) return nullptr; - - context.parent = repeater; - - while (auto key = nextObjectKey()) { - if (KEY_AS("nm")) repeater->name = getStringCopy(); - else if (KEY_AS("c")) parseProperty(repeater->copies); - else if (KEY_AS("o")) parseProperty(repeater->offset); - else if (KEY_AS("m")) repeater->inorder = getInt(); - else if (KEY_AS("tr")) - { - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("a")) parseProperty(repeater->anchor); - else if (KEY_AS("p")) parseProperty(repeater->position); - else if (KEY_AS("r")) parseProperty(repeater->rotation); - else if (KEY_AS("s")) parseProperty(repeater->scale); - else if (KEY_AS("so")) parseProperty(repeater->startOpacity); - else if (KEY_AS("eo")) parseProperty(repeater->endOpacity); - else skip(key); - } - } - else if (KEY_AS("hd")) repeater->hidden = getBool(); - else skip(key); - } - repeater->prepare(); - - return repeater; -} - - -LottieObject* LottieParser::parseObject() -{ - auto type = getString(); - if (!type) return nullptr; - - if (!strcmp(type, "gr")) return parseGroup(); - else if (!strcmp(type, "rc")) return parseRect(); - else if (!strcmp(type, "el")) return parseEllipse(); - else if (!strcmp(type, "tr")) return parseTransform(); - else if (!strcmp(type, "fl")) return parseSolidFill(); - else if (!strcmp(type, "st")) return parseSolidStroke(); - else if (!strcmp(type, "sh")) return parsePath(); - else if (!strcmp(type, "sr")) return parsePolyStar(); - else if (!strcmp(type, "rd")) return parseRoundedCorner(); - else if (!strcmp(type, "gf")) return parseGradientFill(); - else if (!strcmp(type, "gs")) return parseGradientStroke(); - else if (!strcmp(type, "tm")) return parseTrimpath(); - else if (!strcmp(type, "rp")) return parseRepeater(); - else if (!strcmp(type, "mm")) TVGERR("LOTTIE", "MergePath(mm) is not supported yet"); - else if (!strcmp(type, "pb")) TVGERR("LOTTIE", "Puker/Bloat(pb) is not supported yet"); - else if (!strcmp(type, "tw")) TVGERR("LOTTIE", "Twist(tw) is not supported yet"); - else if (!strcmp(type, "op")) TVGERR("LOTTIE", "Offset Path(op) is not supported yet"); - else if (!strcmp(type, "zz")) TVGERR("LOTTIE", "Zig Zag(zz) is not supported yet"); - return nullptr; -} - - -void LottieParser::parseObject(Array& parent) -{ - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("ty")) { - if (auto child = parseObject()) { - if (child->hidden) delete(child); - else parent.push(child); - } - } else skip(key); - } -} - - -LottieImage* LottieParser::parseImage(const char* data, const char* subPath, bool embedded) -{ - //Used for Image Asset - auto image = new LottieImage; - - //embedded image resource. should start with "data:" - //header look like "data:image/png;base64," so need to skip till ','. - if (embedded && !strncmp(data, "data:", 5)) { - //figure out the mimetype - auto mimeType = data + 11; - auto needle = strstr(mimeType, ";"); - image->mimeType = strDuplicate(mimeType, needle - mimeType); - //b64 data - auto b64Data = strstr(data, ",") + 1; - size_t length = strlen(data) - (b64Data - data); - image->size = b64Decode(b64Data, length, &image->b64Data); - //external image resource - } else { - auto len = strlen(dirName) + strlen(subPath) + strlen(data) + 1; - image->path = static_cast(malloc(len)); - snprintf(image->path, len, "%s%s%s", dirName, subPath, data); - } - - image->prepare(); - - return image; -} - - -LottieObject* LottieParser::parseAsset() -{ - enterObject(); - - LottieObject* obj = nullptr; - char *id = nullptr; - - //Used for Image Asset - const char* data = nullptr; - const char* subPath = nullptr; - auto embedded = false; - - while (auto key = nextObjectKey()) { - if (KEY_AS("id")) - { - if (peekType() == kStringType) { - id = getStringCopy(); - } else { - id = _int2str(getInt()); - } - } - else if (KEY_AS("layers")) obj = parseLayers(); - else if (KEY_AS("u")) subPath = getString(); - else if (KEY_AS("p")) data = getString(); - else if (KEY_AS("e")) embedded = getInt(); - else skip(key); - } - if (data) obj = parseImage(data, subPath, embedded); - if (obj) obj->name = id; - else free(id); - return obj; -} - - -LottieFont* LottieParser::parseFont() -{ - enterObject(); - - auto font = new LottieFont; - - while (auto key = nextObjectKey()) { - if (KEY_AS("fName")) font->name = getStringCopy(); - else if (KEY_AS("fFamily")) font->family = getStringCopy(); - else if (KEY_AS("fStyle")) font->style = getStringCopy(); - else if (KEY_AS("ascent")) font->ascent = getFloat(); - else if (KEY_AS("origin")) font->origin = (LottieFont::Origin) getInt(); - else skip(key); - } - return font; -} - - -void LottieParser::parseAssets() -{ - enterArray(); - while (nextArrayValue()) { - auto asset = parseAsset(); - if (asset) comp->assets.push(asset); - else TVGERR("LOTTIE", "Invalid Asset!"); - } -} - -LottieMarker* LottieParser::parseMarker() -{ - enterObject(); - - auto marker = new LottieMarker; - - while (auto key = nextObjectKey()) { - if (KEY_AS("cm")) marker->name = getStringCopy(); - else if (KEY_AS("tm")) marker->time = getFloat(); - else if (KEY_AS("dr")) marker->duration = getFloat(); - else skip(key); - } - - return marker; -} - -void LottieParser::parseMarkers() -{ - enterArray(); - while (nextArrayValue()) { - comp->markers.push(parseMarker()); - } -} - -void LottieParser::parseChars(Array& glyphs) -{ - enterArray(); - while (nextArrayValue()) { - enterObject(); - //a new glyph - auto glyph = new LottieGlyph; - while (auto key = nextObjectKey()) { - if (KEY_AS("ch")) glyph->code = getStringCopy(); - else if (KEY_AS("size")) glyph->size = static_cast(getFloat()); - else if (KEY_AS("style")) glyph->style = getStringCopy(); - else if (KEY_AS("w")) glyph->width = getFloat(); - else if (KEY_AS("fFamily")) glyph->family = getStringCopy(); - else if (KEY_AS("data")) - { //glyph shapes - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("shapes")) parseShapes(glyph->children); - } - } else skip(key); - } - glyph->prepare(); - glyphs.push(glyph); - } -} - -void LottieParser::parseFonts() -{ - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("list")) { - enterArray(); - while (nextArrayValue()) { - comp->fonts.push(parseFont()); - } - } else skip(key); - } -} - - -LottieObject* LottieParser::parseGroup() -{ - auto group = new LottieGroup; - if (!group) return nullptr; - - while (auto key = nextObjectKey()) { - if (KEY_AS("nm")) { - group->name = getStringCopy(); - } else if (KEY_AS("it")) { - enterArray(); - while (nextArrayValue()) parseObject(group->children); - } else skip(key); - } - if (group->children.empty()) { - delete(group); - return nullptr; - } - group->prepare(); - - return group; -} - - -void LottieParser::parseTimeRemap(LottieLayer* layer) -{ - parseProperty(layer->timeRemap); -} - - -uint8_t LottieParser::getDirection() -{ - auto v = getInt(); - if (v == 1) return 0; - if (v == 2) return 3; - if (v == 3) return 2; - return 0; -} - -void LottieParser::parseShapes(Array& parent) -{ - uint8_t direction; - - enterArray(); - while (nextArrayValue()) { - direction = 0; - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("it")) { - enterArray(); - while (nextArrayValue()) parseObject(parent); - } else if (KEY_AS("d")) { - direction = getDirection(); - } else if (KEY_AS("ty")) { - if (auto child = parseObject()) { - if (child->hidden) delete(child); - else parent.push(child); - if (direction > 0) static_cast(child)->direction = direction; - } - } else skip(key); - } - } -} - - -void LottieParser::parseTextRange(LottieText* text) -{ - enterArray(); - while (nextArrayValue()) { - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("a")) { //text style - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("t")) parseProperty(text->spacing); - else skip(key); - } - } else skip(key); - } - } -} - - -void LottieParser::parseText(Array& parent) -{ - enterObject(); - - auto text = new LottieText; - - while (auto key = nextObjectKey()) { - if (KEY_AS("d")) parseProperty(text->doc, text); - else if (KEY_AS("a")) parseTextRange(text); - //else if (KEY_AS("p")) TVGLOG("LOTTIE", "Text Follow Path (p) is not supported"); - //else if (KEY_AS("m")) TVGLOG("LOTTIE", "Text Alignment Option (m) is not supported"); - else skip(key); - } - - text->prepare(); - parent.push(text); -} - - -void LottieParser::getLayerSize(float& val) -{ - if (val == 0.0f) { - val = getFloat(); - } else { - //layer might have both w(width) & sw(solid color width) - //override one if the a new size is smaller. - auto w = getFloat(); - if (w < val) val = w; - } -} - -LottieMask* LottieParser::parseMask() -{ - auto mask = new LottieMask; - if (!mask) return nullptr; - - enterObject(); - while (auto key = nextObjectKey()) { - if (KEY_AS("inv")) mask->inverse = getBool(); - else if (KEY_AS("mode")) mask->method = getMaskMethod(mask->inverse); - else if (KEY_AS("pt")) getPathSet(mask->pathset); - else if (KEY_AS("o")) parseProperty(mask->opacity); - else skip(key); - } - - return mask; -} - - -void LottieParser::parseMasks(LottieLayer* layer) -{ - enterArray(); - while (nextArrayValue()) { - auto mask = parseMask(); - layer->masks.push(mask); - } -} - - -LottieLayer* LottieParser::parseLayer() -{ - auto layer = new LottieLayer; - if (!layer) return nullptr; - - layer->comp = comp; - context.layer = layer; - - auto ddd = false; - - enterObject(); - - while (auto key = nextObjectKey()) { - if (KEY_AS("ddd")) ddd = getInt(); //3d layer - else if (KEY_AS("ind")) layer->id = getInt(); - else if (KEY_AS("ty")) layer->type = (LottieLayer::Type) getInt(); - else if (KEY_AS("nm")) layer->name = getStringCopy(); - else if (KEY_AS("sr")) layer->timeStretch = getFloat(); - else if (KEY_AS("ks")) - { - enterObject(); - layer->transform = parseTransform(ddd); - } - else if (KEY_AS("ao")) layer->autoOrient = getInt(); - else if (KEY_AS("shapes")) parseShapes(layer->children); - else if (KEY_AS("ip")) layer->inFrame = getFloat(); - else if (KEY_AS("op")) layer->outFrame = getFloat(); - else if (KEY_AS("st")) layer->startFrame = getFloat(); - else if (KEY_AS("bm")) layer->blendMethod = getBlendMethod(); - else if (KEY_AS("parent")) layer->pid = getInt(); - else if (KEY_AS("tm")) parseTimeRemap(layer); - else if (KEY_AS("w") || KEY_AS("sw")) getLayerSize(layer->w); - else if (KEY_AS("h") || KEY_AS("sh")) getLayerSize(layer->h); - else if (KEY_AS("sc")) layer->color = getColor(getString()); - else if (KEY_AS("tt")) layer->matte.type = getMatteType(); - else if (KEY_AS("masksProperties")) parseMasks(layer); - else if (KEY_AS("hd")) layer->hidden = getBool(); - else if (KEY_AS("refId")) layer->refId = getStringCopy(); - else if (KEY_AS("td")) layer->matteSrc = getInt(); //used for matte layer - else if (KEY_AS("t")) parseText(layer->children); - else if (KEY_AS("ef")) - { - TVGERR("LOTTIE", "layer effect(ef) is not supported!"); - skip(key); - } - else skip(key); - } - - //Not a valid layer - if (!layer->transform) { - delete(layer); - return nullptr; - } - - layer->prepare(); - - return layer; -} - - -LottieLayer* LottieParser::parseLayers() -{ - auto root = new LottieLayer; - if (!root) return nullptr; - - root->type = LottieLayer::Precomp; - root->comp = comp; - - enterArray(); - while (nextArrayValue()) { - if (auto layer = parseLayer()) { - if (layer->matte.type == CompositeMethod::None) { - root->children.push(layer); - } else { - //matte source must be located in the right previous. - auto matte = static_cast(root->children.last()); - if (matte->matteSrc) { - layer->matte.target = matte; - } else { - TVGLOG("LOTTIE", "Matte Source(%s) is not designated?", matte->name); - } - root->children.last() = layer; - } - } - } - root->prepare(); - return root; -} - - -void LottieParser::postProcess(Array& glyphs) -{ - //aggregate font characters - for (uint32_t g = 0; g < glyphs.count; ++g) { - auto glyph = glyphs[g]; - for (uint32_t i = 0; i < comp->fonts.count; ++i) { - auto& font = comp->fonts[i]; - if (!strcmp(font->family, glyph->family) && !strcmp(font->style, glyph->style)) { - font->chars.push(glyph); - free(glyph->family); - free(glyph->style); - break; - } - } - } -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -const char* LottieParser::sid(bool first) -{ - if (first) { - //verify json - if (!parseNext()) return nullptr; - enterObject(); - } - return nextObjectKey(); -} - - -bool LottieParser::apply(LottieSlot* slot) -{ - enterObject(); - - //OPTIMIZE: we can create the property directly, without object - LottieObject* obj = nullptr; //slot object - - switch (slot->type) { - case LottieProperty::Type::ColorStop: { - obj = new LottieGradient; - context.parent = obj; - parseSlotProperty(static_cast(obj)->colorStops); - break; - } - case LottieProperty::Type::Color: { - obj = new LottieSolid; - context.parent = obj; - parseSlotProperty(static_cast(obj)->color); - break; - } - case LottieProperty::Type::TextDoc: { - obj = new LottieText; - context.parent = obj; - parseSlotProperty(static_cast(obj)->doc); - break; - } - default: break; - } - - if (!obj || Invalid()) return false; - - slot->assign(obj); - - delete(obj); - - return true; -} - - -bool LottieParser::parse() -{ - //verify json. - if (!parseNext()) return false; - - enterObject(); - - if (comp) delete(comp); - comp = new LottieComposition; - if (!comp) return false; - - Array glyphs; - - while (auto key = nextObjectKey()) { - if (KEY_AS("v")) comp->version = getStringCopy(); - else if (KEY_AS("fr")) comp->frameRate = getFloat(); - else if (KEY_AS("ip")) comp->startFrame = getFloat(); - else if (KEY_AS("op")) comp->endFrame = getFloat(); - else if (KEY_AS("w")) comp->w = getFloat(); - else if (KEY_AS("h")) comp->h = getFloat(); - else if (KEY_AS("nm")) comp->name = getStringCopy(); - else if (KEY_AS("assets")) parseAssets(); - else if (KEY_AS("layers")) comp->root = parseLayers(); - else if (KEY_AS("fonts")) parseFonts(); - else if (KEY_AS("chars")) parseChars(glyphs); - else if (KEY_AS("markers")) parseMarkers(); - else skip(key); - } - - if (Invalid() || !comp->root) { - delete(comp); - return false; - } - - comp->root->inFrame = comp->startFrame; - comp->root->outFrame = comp->endFrame; - - postProcess(glyphs); - - return true; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieParser.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieParser.h deleted file mode 100644 index a8b6b0d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieParser.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_LOTTIE_PARSER_H_ -#define _TVG_LOTTIE_PARSER_H_ - -#include "tvgCommon.h" -#include "tvgLottieParserHandler.h" -#include "tvgLottieProperty.h" - -struct LottieParser : LookaheadParserHandler -{ -public: - LottieParser(const char *str, const char* dirName) : LookaheadParserHandler(str) - { - this->dirName = dirName; - } - - bool parse(); - bool apply(LottieSlot* slot); - const char* sid(bool first = false); - - LottieComposition* comp = nullptr; - const char* dirName = nullptr; //base resource directory - -private: - BlendMethod getBlendMethod(); - RGB24 getColor(const char *str); - CompositeMethod getMatteType(); - FillRule getFillRule(); - StrokeCap getStrokeCap(); - StrokeJoin getStrokeJoin(); - CompositeMethod getMaskMethod(bool inversed); - LottieInterpolator* getInterpolator(const char* key, Point& in, Point& out); - uint8_t getDirection(); - - void getInterpolatorPoint(Point& pt); - void getPathSet(LottiePathSet& path); - void getLayerSize(float& val); - void getValue(TextDocument& doc); - void getValue(PathSet& path); - void getValue(Array& pts); - void getValue(ColorStop& color); - void getValue(float& val); - void getValue(uint8_t& val); - void getValue(Point& pt); - void getValue(RGB24& color); - - template bool parseTangent(const char *key, LottieVectorFrame& value); - template bool parseTangent(const char *key, LottieScalarFrame& value); - template void parseKeyFrame(T& prop); - template void parsePropertyInternal(T& prop); - template void parseProperty(T& prop, LottieObject* obj = nullptr); - template void parseSlotProperty(T& prop); - - LottieObject* parseObject(); - LottieObject* parseAsset(); - LottieImage* parseImage(const char* data, const char* subPath, bool embedded); - LottieLayer* parseLayer(); - LottieObject* parseGroup(); - LottieRect* parseRect(); - LottieEllipse* parseEllipse(); - LottieSolidFill* parseSolidFill(); - LottieTransform* parseTransform(bool ddd = false); - LottieSolidStroke* parseSolidStroke(); - LottieGradientStroke* parseGradientStroke(); - LottiePath* parsePath(); - LottiePolyStar* parsePolyStar(); - LottieRoundedCorner* parseRoundedCorner(); - LottieGradientFill* parseGradientFill(); - LottieLayer* parseLayers(); - LottieMask* parseMask(); - LottieTrimpath* parseTrimpath(); - LottieRepeater* parseRepeater(); - LottieFont* parseFont(); - LottieMarker* parseMarker(); - - void parseObject(Array& parent); - void parseShapes(Array& parent); - void parseText(Array& parent); - void parseMasks(LottieLayer* layer); - void parseTimeRemap(LottieLayer* layer); - void parseStrokeDash(LottieStroke* stroke); - void parseGradient(LottieGradient* gradient, const char* key); - void parseTextRange(LottieText* text); - void parseAssets(); - void parseFonts(); - void parseChars(Array& glyphs); - void parseMarkers(); - void postProcess(Array& glyphs); - - //Current parsing context - struct Context { - LottieLayer* layer = nullptr; - LottieObject* parent = nullptr; - } context; -}; - -#endif //_TVG_LOTTIE_PARSER_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieParserHandler.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieParserHandler.cpp deleted file mode 100644 index 4d00441..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieParserHandler.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All rights reserved. - - * 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 "tvgLottieParserHandler.h" - - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static const int PARSE_FLAGS = kParseDefaultFlags | kParseInsituFlag; - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - - -bool LookaheadParserHandler::enterArray() -{ - if (state != kEnteringArray) { - Error(); - return false; - } - parseNext(); - return true; -} - - -bool LookaheadParserHandler::nextArrayValue() -{ - if (state == kExitingArray) { - parseNext(); - return false; - } - //SPECIAL CASE: same as nextObjectKey() - if (state == kExitingObject) return false; - if (state == kError || state == kHasKey) { - Error(); - return false; - } - return true; -} - - -int LookaheadParserHandler::getInt() -{ - if (state != kHasNumber || !val.IsInt()) { - Error(); - return 0; - } - auto result = val.GetInt(); - parseNext(); - return result; -} - - -float LookaheadParserHandler::getFloat() -{ - if (state != kHasNumber) { - Error(); - return 0; - } - auto result = val.GetFloat(); - parseNext(); - return result; -} - - -const char* LookaheadParserHandler::getString() -{ - if (state != kHasString) { - Error(); - return nullptr; - } - auto result = val.GetString(); - parseNext(); - return result; -} - - -char* LookaheadParserHandler::getStringCopy() -{ - auto str = getString(); - if (str) return strdup(str); - return nullptr; -} - - -bool LookaheadParserHandler::getBool() -{ - if (state != kHasBool) { - Error(); - return false; - } - auto result = val.GetBool(); - parseNext(); - return result; -} - - -void LookaheadParserHandler::getNull() -{ - if (state != kHasNull) { - Error(); - return; - } - parseNext(); -} - - -bool LookaheadParserHandler::parseNext() -{ - if (reader.HasParseError()) { - Error(); - return false; - } - if (!reader.IterativeParseNext(iss, *this)) { - Error(); - return false; - } - return true; -} - - -bool LookaheadParserHandler::enterObject() -{ - if (state != kEnteringObject) { - Error(); - return false; - } - parseNext(); - return true; -} - - -int LookaheadParserHandler::peekType() -{ - if (state >= kHasNull && state <= kHasKey) return val.GetType(); - if (state == kEnteringArray) return kArrayType; - if (state == kEnteringObject) return kObjectType; - return -1; -} - - -void LookaheadParserHandler::skipOut(int depth) -{ - do { - if (state == kEnteringArray || state == kEnteringObject) ++depth; - else if (state == kExitingArray || state == kExitingObject) --depth; - else if (state == kError) return; - parseNext(); - } while (depth > 0); -} - - -const char* LookaheadParserHandler::nextObjectKey() -{ - if (state == kHasKey) { - auto result = val.GetString(); - parseNext(); - return result; - } - - /* SPECIAL CASE: The parser works with a predefined rule that it will be only - while (nextObjectKey()) for each object but in case of our nested group - object we can call multiple time nextObjectKey() while exiting the object - so ignore those and don't put parser in the error state. */ - if (state == kExitingArray || state == kEnteringObject) return nullptr; - - if (state != kExitingObject) { - Error(); - return nullptr; - } - - parseNext(); - return nullptr; -} - - -void LookaheadParserHandler::skip(const char* key) -{ - //if (key) TVGLOG("LOTTIE", "Skipped parsing value = %s", key); - - if (peekType() == kArrayType) { - enterArray(); - skipOut(1); - } else if (peekType() == kObjectType) { - enterObject(); - skipOut(1); - } else { - skipOut(0); - } -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieParserHandler.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieParserHandler.h deleted file mode 100644 index 65b4545..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieParserHandler.h +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All rights reserved. - - * 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 _TVG_LOTTIE_PARSER_HANDLER_H_ -#define _TVG_LOTTIE_PARSER_HANDLER_H_ - -#include "rapidjson/document.h" -#include "tvgCommon.h" - - -using namespace rapidjson; - - -struct LookaheadParserHandler -{ - enum LookaheadParsingState { - kInit = 0, - kError, - kHasNull, - kHasBool, - kHasNumber, - kHasString, - kHasKey, - kEnteringObject, - kExitingObject, - kEnteringArray, - kExitingArray - }; - - Value val; - LookaheadParsingState state = kInit; - Reader reader; - InsituStringStream iss; - - LookaheadParserHandler(const char *str) : iss((char*)str) - { - reader.IterativeParseInit(); - } - - bool Null() - { - state = kHasNull; - val.SetNull(); - return true; - } - - bool Bool(bool b) - { - state = kHasBool; - val.SetBool(b); - return true; - } - - bool Int(int i) - { - state = kHasNumber; - val.SetInt(i); - return true; - } - - bool Uint(unsigned u) - { - state = kHasNumber; - val.SetUint(u); - return true; - } - - bool Int64(int64_t i) - { - state = kHasNumber; - val.SetInt64(i); - return true; - } - - bool Uint64(int64_t u) - { - state = kHasNumber; - val.SetUint64(u); - return true; - } - - bool Double(double d) - { - state = kHasNumber; - val.SetDouble(d); - return true; - } - - bool RawNumber(const char *, SizeType, TVG_UNUSED bool) - { - return false; - } - - bool String(const char *str, SizeType length, TVG_UNUSED bool) - { - state = kHasString; - val.SetString(str, length); - return true; - } - - bool StartObject() - { - state = kEnteringObject; - return true; - } - - bool Key(const char *str, SizeType length, TVG_UNUSED bool) - { - state = kHasKey; - val.SetString(str, length); - return true; - } - - bool EndObject(SizeType) - { - state = kExitingObject; - return true; - } - - bool StartArray() - { - state = kEnteringArray; - return true; - } - - bool EndArray(SizeType) - { - state = kExitingArray; - return true; - } - - void Error() - { - TVGERR("LOTTIE", "Parsing Error!"); - state = kError; - } - - bool Invalid() - { - return state == kError; - } - - bool enterObject(); - bool enterArray(); - bool nextArrayValue(); - int getInt(); - float getFloat(); - const char* getString(); - char* getStringCopy(); - bool getBool(); - void getNull(); - bool parseNext(); - const char* nextObjectKey(); - void skip(const char* key); - void skipOut(int depth); - int peekType(); -}; - -#endif //_TVG_LOTTIE_PARSER_HANDLER_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieProperty.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieProperty.h deleted file mode 100644 index 19df895..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgLottieProperty.h +++ /dev/null @@ -1,935 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_LOTTIE_PROPERTY_H_ -#define _TVG_LOTTIE_PROPERTY_H_ - -#include "tvgCommon.h" -#include "tvgArray.h" -#include "tvgMath.h" -#include "tvgLines.h" -#include "tvgLottieInterpolator.h" -#include "tvgLottieExpressions.h" - -#define ROUNDNESS_EPSILON 1.0f - -struct LottieFont; -struct LottieLayer; -struct LottieObject; - - -struct PathSet -{ - Point* pts = nullptr; - PathCommand* cmds = nullptr; - uint16_t ptsCnt = 0; - uint16_t cmdsCnt = 0; -}; - - -struct RGB24 -{ - int32_t rgb[3]; -}; - - -struct ColorStop -{ - Fill::ColorStop* data = nullptr; - Array* input = nullptr; -}; - - -struct TextDocument -{ - char* text = nullptr; - float height; - float shift; - RGB24 color; - struct { - Point pos; - Point size; - } bbox; - struct { - RGB24 color; - float width; - bool render = false; - } stroke; - char* name = nullptr; - float size; - float tracking = 0.0f; - uint8_t justify; -}; - - -static inline RGB24 operator-(const RGB24& lhs, const RGB24& rhs) -{ - return {lhs.rgb[0] - rhs.rgb[0], lhs.rgb[1] - rhs.rgb[1], lhs.rgb[2] - rhs.rgb[2]}; -} - - -static inline RGB24 operator+(const RGB24& lhs, const RGB24& rhs) -{ - return {lhs.rgb[0] + rhs.rgb[0], lhs.rgb[1] + rhs.rgb[1], lhs.rgb[2] + rhs.rgb[2]}; -} - - -static inline RGB24 operator*(const RGB24& lhs, float rhs) -{ - return {(int32_t)lroundf(lhs.rgb[0] * rhs), (int32_t)lroundf(lhs.rgb[1] * rhs), (int32_t)lroundf(lhs.rgb[2] * rhs)}; -} - - -template -struct LottieScalarFrame -{ - T value; //keyframe value - float no; //frame number - LottieInterpolator* interpolator; - bool hold = false; //do not interpolate. - - T interpolate(LottieScalarFrame* next, float frameNo) - { - auto t = (frameNo - no) / (next->no - no); - if (interpolator) t = interpolator->progress(t); - - if (hold) { - if (t < 1.0f) return value; - else return next->value; - } - return mathLerp(value, next->value, t); - } -}; - - -template -struct LottieVectorFrame -{ - T value; //keyframe value - float no; //frame number - LottieInterpolator* interpolator; - T outTangent, inTangent; - float length; - bool hasTangent = false; - bool hold = false; - - T interpolate(LottieVectorFrame* next, float frameNo) - { - auto t = (frameNo - no) / (next->no - no); - if (interpolator) t = interpolator->progress(t); - - if (hold) { - if (t < 1.0f) return value; - else return next->value; - } - - if (hasTangent) { - Bezier bz = {value, value + outTangent, next->value + inTangent, next->value}; - t = bezAtApprox(bz, t * length, length); - return bezPointAt(bz, t); - } else { - return mathLerp(value, next->value, t); - } - } - - float angle(LottieVectorFrame* next, float frameNo) - { - if (!hasTangent) return 0; - auto t = (frameNo - no) / (next->no - no); - if (interpolator) t = interpolator->progress(t); - Bezier bz = {value, value + outTangent, next->value + inTangent, next->value}; - t = bezAtApprox(bz, t * length, length); - return -bezAngleAt(bz, t); - } - - void prepare(LottieVectorFrame* next) - { - Bezier bz = {value, value + outTangent, next->value + inTangent, next->value}; - length = bezLengthApprox(bz); - } -}; - - -//Property would have an either keyframes or single value. -struct LottieProperty -{ - enum class Type : uint8_t { Point = 0, Float, Opacity, Color, PathSet, ColorStop, Position, TextDoc, Invalid }; - virtual ~LottieProperty() {} - - LottieExpression* exp = nullptr; - - //TODO: Apply common bodies? - virtual uint32_t frameCnt() = 0; - virtual uint32_t nearest(float time) = 0; - virtual float frameNo(int32_t key) = 0; -}; - - -struct LottieExpression -{ - enum LoopMode : uint8_t { None = 0, InCycle = 1, InPingPong, InOffset, InContinue, OutCycle, OutPingPong, OutOffset, OutContinue }; - - char* code; - LottieComposition* comp; - LottieLayer* layer; - LottieObject* object; - LottieProperty* property; - LottieProperty::Type type; - - bool enabled; - - struct { - uint32_t key = 0; //the keyframe number repeating to - float in = FLT_MAX; //looping duration in frame number - LoopMode mode = None; - } loop; -; - ~LottieExpression() - { - free(code); - } -}; - - -static void _copy(PathSet* pathset, Array& outPts, Matrix* transform) -{ - Array inPts; - - if (transform) { - for (int i = 0; i < pathset->ptsCnt; ++i) { - Point pt = pathset->pts[i]; - mathMultiply(&pt, transform); - outPts.push(pt); - } - } else { - inPts.data = pathset->pts; - inPts.count = pathset->ptsCnt; - outPts.push(inPts); - inPts.data = nullptr; - } -} - - -static void _copy(PathSet* pathset, Array& outCmds) -{ - Array inCmds; - inCmds.data = pathset->cmds; - inCmds.count = pathset->cmdsCnt; - outCmds.push(inCmds); - inCmds.data = nullptr; -} - - -static void _roundCorner(Array& cmds, Array& pts, const Point& prev, const Point& curr, const Point& next, float roundness) -{ - auto lenPrev = mathLength(prev - curr); - auto rPrev = lenPrev > 0.0f ? 0.5f * mathMin(lenPrev * 0.5f, roundness) / lenPrev : 0.0f; - auto lenNext = mathLength(next - curr); - auto rNext = lenNext > 0.0f ? 0.5f * mathMin(lenNext * 0.5f, roundness) / lenNext : 0.0f; - - auto dPrev = rPrev * (curr - prev); - auto dNext = rNext * (curr - next); - - pts.push(curr - 2.0f * dPrev); - pts.push(curr - dPrev); - pts.push(curr - dNext); - pts.push(curr - 2.0f * dNext); - cmds.push(PathCommand::LineTo); - cmds.push(PathCommand::CubicTo); -} - - -static bool _modifier(Point* inputPts, uint32_t inputPtsCnt, PathCommand* inputCmds, uint32_t inputCmdsCnt, Array& cmds, Array& pts, Matrix* transform, float roundness) -{ - cmds.reserve(inputCmdsCnt * 2); - pts.reserve((uint16_t)(inputPtsCnt * 1.5)); - auto ptsCnt = pts.count; - - auto startIndex = 0; - for (uint32_t iCmds = 0, iPts = 0; iCmds < inputCmdsCnt; ++iCmds) { - switch (inputCmds[iCmds]) { - case PathCommand::MoveTo: { - startIndex = pts.count; - cmds.push(PathCommand::MoveTo); - pts.push(inputPts[iPts++]); - break; - } - case PathCommand::CubicTo: { - auto& prev = inputPts[iPts - 1]; - auto& curr = inputPts[iPts + 2]; - if (iCmds < inputCmdsCnt - 1 && - mathZero(inputPts[iPts - 1] - inputPts[iPts]) && - mathZero(inputPts[iPts + 1] - inputPts[iPts + 2])) { - if (inputCmds[iCmds + 1] == PathCommand::CubicTo && - mathZero(inputPts[iPts + 2] - inputPts[iPts + 3]) && - mathZero(inputPts[iPts + 4] - inputPts[iPts + 5])) { - _roundCorner(cmds, pts, prev, curr, inputPts[iPts + 5], roundness); - iPts += 3; - break; - } else if (inputCmds[iCmds + 1] == PathCommand::Close) { - _roundCorner(cmds, pts, prev, curr, inputPts[2], roundness); - pts[startIndex] = pts.last(); - iPts += 3; - break; - } - } - cmds.push(PathCommand::CubicTo); - pts.push(inputPts[iPts++]); - pts.push(inputPts[iPts++]); - pts.push(inputPts[iPts++]); - break; - } - case PathCommand::Close: { - cmds.push(PathCommand::Close); - break; - } - default: break; - } - } - if (transform) { - for (auto i = ptsCnt; i < pts.count; ++i) - mathTransform(transform, &pts[i]); - } - return true; -} - - -template -uint32_t _bsearch(T* frames, float frameNo) -{ - int32_t low = 0; - int32_t high = int32_t(frames->count) - 1; - - while (low <= high) { - auto mid = low + (high - low) / 2; - auto frame = frames->data + mid; - if (frameNo < frame->no) high = mid - 1; - else low = mid + 1; - } - if (high < low) low = high; - if (low < 0) low = 0; - return low; -} - - -template -uint32_t _nearest(T* frames, float frameNo) -{ - if (frames) { - auto key = _bsearch(frames, frameNo); - if (key == frames->count - 1) return key; - return (fabsf(frames->data[key].no - frameNo) < fabsf(frames->data[key + 1].no - frameNo)) ? key : (key + 1); - } - return 0; -} - - -template -float _frameNo(T* frames, int32_t key) -{ - if (!frames) return 0.0f; - if (key < 0) key = 0; - if (key >= (int32_t) frames->count) key = (int32_t)(frames->count - 1); - return (*frames)[key].no; -} - - -template -float _loop(T* frames, float frameNo, LottieExpression* exp) -{ - if (frameNo >= exp->loop.in || frameNo < frames->first().no ||frameNo < frames->last().no) return frameNo; - - switch (exp->loop.mode) { - case LottieExpression::LoopMode::InCycle: { - frameNo -= frames->first().no; - return fmodf(frameNo, frames->last().no - frames->first().no) + (*frames)[exp->loop.key].no; - } - case LottieExpression::LoopMode::OutCycle: { - frameNo -= frames->first().no; - return fmodf(frameNo, (*frames)[frames->count - 1 - exp->loop.key].no - frames->first().no) + frames->first().no; - } - default: break; - } - return frameNo; -} - - -template -struct LottieGenericProperty : LottieProperty -{ - //Property has an either keyframes or single value. - Array>* frames = nullptr; - T value; - - LottieGenericProperty(T v) : value(v) {} - LottieGenericProperty() {} - - ~LottieGenericProperty() - { - release(); - } - - void release() - { - delete(frames); - frames = nullptr; - if (exp) { - delete(exp); - exp = nullptr; - } - } - - uint32_t nearest(float frameNo) override - { - return _nearest(frames, frameNo); - } - - uint32_t frameCnt() override - { - return frames ? frames->count : 1; - } - - float frameNo(int32_t key) override - { - return _frameNo(frames, key); - } - - LottieScalarFrame& newFrame() - { - if (!frames) frames = new Array>; - if (frames->count + 1 >= frames->reserved) { - auto old = frames->reserved; - frames->grow(frames->count + 2); - memset((void*)(frames->data + old), 0x00, sizeof(LottieScalarFrame) * (frames->reserved - old)); - } - ++frames->count; - return frames->last(); - } - - LottieScalarFrame& nextFrame() - { - return (*frames)[frames->count]; - } - - T operator()(float frameNo) - { - if (!frames) return value; - if (frames->count == 1 || frameNo <= frames->first().no) return frames->first().value; - if (frameNo >= frames->last().no) return frames->last().value; - - auto frame = frames->data + _bsearch(frames, frameNo); - if (mathEqual(frame->no, frameNo)) return frame->value; - return frame->interpolate(frame + 1, frameNo); - } - - T operator()(float frameNo, LottieExpressions* exps) - { - if (exps && (exp && exp->enabled)) { - T out{}; - if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp); - if (exps->result>(frameNo, out, exp)) return out; - } - return operator()(frameNo); - } - - T& operator=(const T& other) - { - //shallow copy, used for slot overriding - if (other.frames) { - frames = other.frames; - const_cast(other).frames = nullptr; - } else value = other.value; - return *this; - } - - float angle(float frameNo) { return 0; } - void prepare() {} -}; - - -struct LottiePathSet : LottieProperty -{ - Array>* frames = nullptr; - PathSet value; - - ~LottiePathSet() - { - release(); - } - - void release() - { - if (exp) { - delete(exp); - exp = nullptr; - } - - free(value.cmds); - free(value.pts); - - if (!frames) return; - - for (auto p = frames->begin(); p < frames->end(); ++p) { - free((*p).value.cmds); - free((*p).value.pts); - } - free(frames->data); - free(frames); - } - - uint32_t nearest(float frameNo) override - { - return _nearest(frames, frameNo); - } - - uint32_t frameCnt() override - { - return frames ? frames->count : 1; - } - - float frameNo(int32_t key) override - { - return _frameNo(frames, key); - } - - LottieScalarFrame& newFrame() - { - if (!frames) { - frames = static_cast>*>(calloc(1, sizeof(Array>))); - } - if (frames->count + 1 >= frames->reserved) { - auto old = frames->reserved; - frames->grow(frames->count + 2); - memset((void*)(frames->data + old), 0x00, sizeof(LottieScalarFrame) * (frames->reserved - old)); - } - ++frames->count; - return frames->last(); - } - - LottieScalarFrame& nextFrame() - { - return (*frames)[frames->count]; - } - - bool operator()(float frameNo, Array& cmds, Array& pts, Matrix* transform, float roundness) - { - PathSet* path = nullptr; - LottieScalarFrame* frame = nullptr; - float t; - bool interpolate = false; - - if (!frames) path = &value; - else if (frames->count == 1 || frameNo <= frames->first().no) path = &frames->first().value; - else if (frameNo >= frames->last().no) path = &frames->last().value; - else { - frame = frames->data + _bsearch(frames, frameNo); - if (mathEqual(frame->no, frameNo)) path = &frame->value; - else { - t = (frameNo - frame->no) / ((frame + 1)->no - frame->no); - if (frame->interpolator) t = frame->interpolator->progress(t); - if (frame->hold) path = &(frame + ((t < 1.0f) ? 0 : 1))->value; - else interpolate = true; - } - } - - if (!interpolate) { - if (roundness > ROUNDNESS_EPSILON) return _modifier(path->pts, path->ptsCnt, path->cmds, path->cmdsCnt, cmds, pts, transform, roundness); - _copy(path, cmds); - _copy(path, pts, transform); - return true; - } - - auto s = frame->value.pts; - auto e = (frame + 1)->value.pts; - - if (roundness > ROUNDNESS_EPSILON) { - auto interpPts = (Point*)malloc(frame->value.ptsCnt * sizeof(Point)); - auto p = interpPts; - for (auto i = 0; i < frame->value.ptsCnt; ++i, ++s, ++e, ++p) { - *p = mathLerp(*s, *e, t); - if (transform) mathMultiply(p, transform); - } - _modifier(interpPts, frame->value.ptsCnt, frame->value.cmds, frame->value.cmdsCnt, cmds, pts, nullptr, roundness); - free(interpPts); - return true; - } else { - for (auto i = 0; i < frame->value.ptsCnt; ++i, ++s, ++e) { - auto pt = mathLerp(*s, *e, t); - if (transform) mathMultiply(&pt, transform); - pts.push(pt); - } - _copy(&frame->value, cmds); - } - return true; - } - - - bool operator()(float frameNo, Array& cmds, Array& pts, Matrix* transform, float roundness, LottieExpressions* exps) - { - if (exps && (exp && exp->enabled)) { - if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp); - if (exps->result(frameNo, cmds, pts, transform, roundness, exp)) return true; - } - return operator()(frameNo, cmds, pts, transform, roundness); - } - - void prepare() {} -}; - - -struct LottieColorStop : LottieProperty -{ - Array>* frames = nullptr; - ColorStop value; - uint16_t count = 0; //colorstop count - bool populated = false; - - ~LottieColorStop() - { - release(); - } - - void release() - { - if (exp) { - delete(exp); - exp = nullptr; - } - - if (value.data) { - free(value.data); - value.data = nullptr; - } - - if (!frames) return; - - for (auto p = frames->begin(); p < frames->end(); ++p) { - free((*p).value.data); - } - free(frames->data); - free(frames); - frames = nullptr; - } - - uint32_t nearest(float frameNo) override - { - return _nearest(frames, frameNo); - } - - uint32_t frameCnt() override - { - return frames ? frames->count : 1; - } - - float frameNo(int32_t key) override - { - return _frameNo(frames, key); - } - - LottieScalarFrame& newFrame() - { - if (!frames) { - frames = static_cast>*>(calloc(1, sizeof(Array>))); - } - if (frames->count + 1 >= frames->reserved) { - auto old = frames->reserved; - frames->grow(frames->count + 2); - memset((void*)(frames->data + old), 0x00, sizeof(LottieScalarFrame) * (frames->reserved - old)); - } - ++frames->count; - return frames->last(); - } - - LottieScalarFrame& nextFrame() - { - return (*frames)[frames->count]; - } - - Result operator()(float frameNo, Fill* fill, LottieExpressions* exps) - { - if (exps && (exp && exp->enabled)) { - if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp); - if (exps->result(frameNo, fill, exp)) return Result::Success; - } - - if (!frames) return fill->colorStops(value.data, count); - - if (frames->count == 1 || frameNo <= frames->first().no) { - return fill->colorStops(frames->first().value.data, count); - } - - if (frameNo >= frames->last().no) return fill->colorStops(frames->last().value.data, count); - - auto frame = frames->data + _bsearch(frames, frameNo); - if (mathEqual(frame->no, frameNo)) return fill->colorStops(frame->value.data, count); - - //interpolate - auto t = (frameNo - frame->no) / ((frame + 1)->no - frame->no); - if (frame->interpolator) t = frame->interpolator->progress(t); - - if (frame->hold) { - if (t < 1.0f) fill->colorStops(frame->value.data, count); - else fill->colorStops((frame + 1)->value.data, count); - } - - auto s = frame->value.data; - auto e = (frame + 1)->value.data; - - Array result; - - for (auto i = 0; i < count; ++i, ++s, ++e) { - auto offset = mathLerp(s->offset, e->offset, t); - auto r = mathLerp(s->r, e->r, t); - auto g = mathLerp(s->g, e->g, t); - auto b = mathLerp(s->b, e->b, t); - auto a = mathLerp(s->a, e->a, t); - result.push({offset, r, g, b, a}); - } - return fill->colorStops(result.data, count); - } - - LottieColorStop& operator=(const LottieColorStop& other) - { - //shallow copy, used for slot overriding - if (other.frames) { - frames = other.frames; - const_cast(other).frames = nullptr; - } else { - value = other.value; - const_cast(other).value = {nullptr, nullptr}; - } - populated = other.populated; - count = other.count; - - return *this; - } - - void prepare() {} -}; - - -struct LottiePosition : LottieProperty -{ - Array>* frames = nullptr; - Point value; - - LottiePosition(Point v) : value(v) - { - } - - ~LottiePosition() - { - release(); - } - - void release() - { - delete(frames); - frames = nullptr; - - if (exp) { - delete(exp); - exp = nullptr; - } - } - - uint32_t nearest(float frameNo) override - { - return _nearest(frames, frameNo); - } - - uint32_t frameCnt() override - { - return frames ? frames->count : 1; - } - - float frameNo(int32_t key) override - { - return _frameNo(frames, key); - } - - LottieVectorFrame& newFrame() - { - if (!frames) frames = new Array>; - if (frames->count + 1 >= frames->reserved) { - auto old = frames->reserved; - frames->grow(frames->count + 2); - memset((void*)(frames->data + old), 0x00, sizeof(LottieVectorFrame) * (frames->reserved - old)); - } - ++frames->count; - return frames->last(); - } - - LottieVectorFrame& nextFrame() - { - return (*frames)[frames->count]; - } - - Point operator()(float frameNo) - { - if (!frames) return value; - if (frames->count == 1 || frameNo <= frames->first().no) return frames->first().value; - if (frameNo >= frames->last().no) return frames->last().value; - - auto frame = frames->data + _bsearch(frames, frameNo); - if (mathEqual(frame->no, frameNo)) return frame->value; - return frame->interpolate(frame + 1, frameNo); - } - - Point operator()(float frameNo, LottieExpressions* exps) - { - Point out{}; - if (exps && (exp && exp->enabled)) { - if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp); - if (exps->result(frameNo, out, exp)) return out; - } - return operator()(frameNo); - } - - float angle(float frameNo) - { - if (!frames) return 0; - if (frames->count == 1 || frameNo <= frames->first().no) return 0; - if (frameNo >= frames->last().no) return 0; - - auto frame = frames->data + _bsearch(frames, frameNo); - return frame->angle(frame + 1, frameNo); - } - - void prepare() - { - if (!frames || frames->count < 2) return; - for (auto frame = frames->begin() + 1; frame < frames->end(); ++frame) { - (frame - 1)->prepare(frame); - } - } -}; - - -struct LottieTextDoc : LottieProperty -{ - Array>* frames = nullptr; - TextDocument value; - - ~LottieTextDoc() - { - release(); - } - - void release() - { - if (exp) { - delete(exp); - exp = nullptr; - } - - if (value.text) { - free(value.text); - value.text = nullptr; - } - if (value.name) { - free(value.name); - value.name = nullptr; - } - - if (!frames) return; - - for (auto p = frames->begin(); p < frames->end(); ++p) { - free((*p).value.text); - free((*p).value.name); - } - delete(frames); - frames = nullptr; - } - - uint32_t nearest(float frameNo) override - { - return _nearest(frames, frameNo); - } - - uint32_t frameCnt() override - { - return frames ? frames->count : 1; - } - - float frameNo(int32_t key) override - { - return _frameNo(frames, key); - } - - LottieScalarFrame& newFrame() - { - if (!frames) frames = new Array>; - if (frames->count + 1 >= frames->reserved) { - auto old = frames->reserved; - frames->grow(frames->count + 2); - memset((void*)(frames->data + old), 0x00, sizeof(LottieScalarFrame) * (frames->reserved - old)); - } - ++frames->count; - return frames->last(); - } - - LottieScalarFrame& nextFrame() - { - return (*frames)[frames->count]; - } - - TextDocument& operator()(float frameNo) - { - if (!frames) return value; - if (frames->count == 1 || frameNo <= frames->first().no) return frames->first().value; - if (frameNo >= frames->last().no) return frames->last().value; - - auto frame = frames->data + _bsearch(frames, frameNo); - return frame->value; - } - - LottieTextDoc& operator=(const LottieTextDoc& other) - { - //shallow copy, used for slot overriding - if (other.frames) { - frames = other.frames; - const_cast(other).frames = nullptr; - } else { - value = other.value; - const_cast(other).value.text = nullptr; - const_cast(other).value.name = nullptr; - } - return *this; - } - - void prepare() {} -}; - - -using LottiePoint = LottieGenericProperty; -using LottieFloat = LottieGenericProperty; -using LottieOpacity = LottieGenericProperty; -using LottieColor = LottieGenericProperty; - -#endif //_TVG_LOTTIE_PROPERTY_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgMath.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgMath.cpp deleted file mode 100644 index 509a459..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgMath.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2021 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgMath.h" - - -bool mathInverse(const Matrix* m, Matrix* out) -{ - auto det = m->e11 * (m->e22 * m->e33 - m->e32 * m->e23) - - m->e12 * (m->e21 * m->e33 - m->e23 * m->e31) + - m->e13 * (m->e21 * m->e32 - m->e22 * m->e31); - - if (mathZero(det)) return false; - - auto invDet = 1 / det; - - out->e11 = (m->e22 * m->e33 - m->e32 * m->e23) * invDet; - out->e12 = (m->e13 * m->e32 - m->e12 * m->e33) * invDet; - out->e13 = (m->e12 * m->e23 - m->e13 * m->e22) * invDet; - out->e21 = (m->e23 * m->e31 - m->e21 * m->e33) * invDet; - out->e22 = (m->e11 * m->e33 - m->e13 * m->e31) * invDet; - out->e23 = (m->e21 * m->e13 - m->e11 * m->e23) * invDet; - out->e31 = (m->e21 * m->e32 - m->e31 * m->e22) * invDet; - out->e32 = (m->e31 * m->e12 - m->e11 * m->e32) * invDet; - out->e33 = (m->e11 * m->e22 - m->e21 * m->e12) * invDet; - - return true; -} - - -Matrix mathMultiply(const Matrix* lhs, const Matrix* rhs) -{ - Matrix m; - - m.e11 = lhs->e11 * rhs->e11 + lhs->e12 * rhs->e21 + lhs->e13 * rhs->e31; - m.e12 = lhs->e11 * rhs->e12 + lhs->e12 * rhs->e22 + lhs->e13 * rhs->e32; - m.e13 = lhs->e11 * rhs->e13 + lhs->e12 * rhs->e23 + lhs->e13 * rhs->e33; - - m.e21 = lhs->e21 * rhs->e11 + lhs->e22 * rhs->e21 + lhs->e23 * rhs->e31; - m.e22 = lhs->e21 * rhs->e12 + lhs->e22 * rhs->e22 + lhs->e23 * rhs->e32; - m.e23 = lhs->e21 * rhs->e13 + lhs->e22 * rhs->e23 + lhs->e23 * rhs->e33; - - m.e31 = lhs->e31 * rhs->e11 + lhs->e32 * rhs->e21 + lhs->e33 * rhs->e31; - m.e32 = lhs->e31 * rhs->e12 + lhs->e32 * rhs->e22 + lhs->e33 * rhs->e32; - m.e33 = lhs->e31 * rhs->e13 + lhs->e32 * rhs->e23 + lhs->e33 * rhs->e33; - - return m; -} - - -void mathRotate(Matrix* m, float degree) -{ - if (degree == 0.0f) return; - - auto radian = degree / 180.0f * MATH_PI; - auto cosVal = cosf(radian); - auto sinVal = sinf(radian); - - m->e12 = m->e11 * -sinVal; - m->e11 *= cosVal; - m->e21 = m->e22 * sinVal; - m->e22 *= cosVal; -} - - -bool mathIdentity(const Matrix* m) -{ - if (m->e11 != 1.0f || m->e12 != 0.0f || m->e13 != 0.0f || - m->e21 != 0.0f || m->e22 != 1.0f || m->e23 != 0.0f || - m->e31 != 0.0f || m->e32 != 0.0f || m->e33 != 1.0f) { - return false; - } - return true; -} - - -void mathMultiply(Point* pt, const Matrix* transform) -{ - auto tx = pt->x * transform->e11 + pt->y * transform->e12 + transform->e13; - auto ty = pt->x * transform->e21 + pt->y * transform->e22 + transform->e23; - pt->x = tx; - pt->y = ty; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgMath.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgMath.h deleted file mode 100644 index 49bbe18..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgMath.h +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (c) 2021 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_MATH_H_ -#define _TVG_MATH_H_ - - #define _USE_MATH_DEFINES - -#include -#include -#include "tvgCommon.h" - -#define MATH_PI 3.14159265358979323846f -#define MATH_PI2 1.57079632679489661923f -#define FLOAT_EPSILON 1.0e-06f //1.192092896e-07f -#define PATH_KAPPA 0.552284f - -#define mathMin(x, y) (((x) < (y)) ? (x) : (y)) -#define mathMax(x, y) (((x) > (y)) ? (x) : (y)) - - -bool mathInverse(const Matrix* m, Matrix* out); -Matrix mathMultiply(const Matrix* lhs, const Matrix* rhs); -void mathRotate(Matrix* m, float degree); -bool mathIdentity(const Matrix* m); -void mathMultiply(Point* pt, const Matrix* transform); - - -static inline float mathDeg2Rad(float degree) -{ - return degree * (MATH_PI / 180.0f); -} - - -static inline float mathRad2Deg(float radian) -{ - return radian * (180.0f / MATH_PI); -} - - -static inline bool mathZero(float a) -{ - return (fabsf(a) <= FLOAT_EPSILON) ? true : false; -} - - -static inline bool mathZero(const Point& p) -{ - return mathZero(p.x) && mathZero(p.y); -} - - -static inline bool mathEqual(float a, float b) -{ - return mathZero(a - b); -} - - -static inline bool mathEqual(const Matrix& a, const Matrix& b) -{ - if (!mathEqual(a.e11, b.e11) || !mathEqual(a.e12, b.e12) || !mathEqual(a.e13, b.e13) || - !mathEqual(a.e21, b.e21) || !mathEqual(a.e22, b.e22) || !mathEqual(a.e23, b.e23) || - !mathEqual(a.e31, b.e31) || !mathEqual(a.e32, b.e32) || !mathEqual(a.e33, b.e33)) { - return false; - } - return true; -} - - -static inline bool mathRightAngle(const Matrix* m) -{ - auto radian = fabsf(atan2f(m->e21, m->e11)); - if (radian < FLOAT_EPSILON || mathEqual(radian, MATH_PI2) || mathEqual(radian, MATH_PI)) return true; - return false; -} - - -static inline bool mathSkewed(const Matrix* m) -{ - return !mathZero(m->e21 + m->e12); -} - - -static inline void mathIdentity(Matrix* m) -{ - m->e11 = 1.0f; - m->e12 = 0.0f; - m->e13 = 0.0f; - m->e21 = 0.0f; - m->e22 = 1.0f; - m->e23 = 0.0f; - m->e31 = 0.0f; - m->e32 = 0.0f; - m->e33 = 1.0f; -} - - -static inline void mathTransform(Matrix* transform, Point* coord) -{ - auto x = coord->x; - auto y = coord->y; - coord->x = x * transform->e11 + y * transform->e12 + transform->e13; - coord->y = x * transform->e21 + y * transform->e22 + transform->e23; -} - - -static inline void mathScale(Matrix* m, float sx, float sy) -{ - m->e11 *= sx; - m->e22 *= sy; -} - - -static inline void mathScaleR(Matrix* m, float x, float y) -{ - if (x != 1.0f) { - m->e11 *= x; - m->e21 *= x; - } - if (y != 1.0f) { - m->e22 *= y; - m->e12 *= y; - } -} - - -static inline void mathTranslate(Matrix* m, float x, float y) -{ - m->e13 += x; - m->e23 += y; -} - - -static inline void mathTranslateR(Matrix* m, float x, float y) -{ - if (x == 0.0f && y == 0.0f) return; - m->e13 += (x * m->e11 + y * m->e12); - m->e23 += (x * m->e21 + y * m->e22); -} - - -static inline void mathLog(Matrix* m) -{ - TVGLOG("MATH", "Matrix: [%f %f %f] [%f %f %f] [%f %f %f]", m->e11, m->e12, m->e13, m->e21, m->e22, m->e23, m->e31, m->e32, m->e33); -} - - -static inline float mathLength(const Point* a, const Point* b) -{ - auto x = b->x - a->x; - auto y = b->y - a->y; - - if (x < 0) x = -x; - if (y < 0) y = -y; - - return (x > y) ? (x + 0.375f * y) : (y + 0.375f * x); -} - - -static inline float mathLength(const Point& a) -{ - return sqrtf(a.x * a.x + a.y * a.y); -} - - -static inline Point operator-(const Point& lhs, const Point& rhs) -{ - return {lhs.x - rhs.x, lhs.y - rhs.y}; -} - - -static inline Point operator+(const Point& lhs, const Point& rhs) -{ - return {lhs.x + rhs.x, lhs.y + rhs.y}; -} - - -static inline Point operator*(const Point& lhs, float rhs) -{ - return {lhs.x * rhs, lhs.y * rhs}; -} - - -static inline Point operator*(const float& lhs, const Point& rhs) -{ - return {lhs * rhs.x, lhs * rhs.y}; -} - - -static inline Point operator/(const Point& lhs, const float rhs) -{ - return {lhs.x / rhs, lhs.y / rhs}; -} - - -template -static inline T mathLerp(const T &start, const T &end, float t) -{ - return static_cast(start + (end - start) * t); -} - - -#endif //_TVG_MATH_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgPaint.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgPaint.cpp deleted file mode 100644 index 4db4831..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgPaint.cpp +++ /dev/null @@ -1,481 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgMath.h" -#include "tvgPaint.h" -#include "tvgShape.h" -#include "tvgPicture.h" -#include "tvgScene.h" -#include "tvgText.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -#define PAINT_METHOD(ret, METHOD) \ - switch (id) { \ - case TVG_CLASS_ID_SHAPE: ret = P((Shape*)paint)->METHOD; break; \ - case TVG_CLASS_ID_SCENE: ret = P((Scene*)paint)->METHOD; break; \ - case TVG_CLASS_ID_PICTURE: ret = P((Picture*)paint)->METHOD; break; \ - case TVG_CLASS_ID_TEXT: ret = P((Text*)paint)->METHOD; break; \ - default: ret = {}; \ - } - - - -static Result _compFastTrack(Paint* cmpTarget, const RenderTransform* pTransform, RenderTransform* rTransform, RenderRegion& viewport) -{ - /* Access Shape class by Paint is bad... but it's ok still it's an internal usage. */ - auto shape = static_cast(cmpTarget); - - //Rectangle Candidates? - const Point* pts; - auto ptsCnt = shape->pathCoords(&pts); - - //nothing to clip - if (ptsCnt == 0) return Result::InvalidArguments; - - if (ptsCnt != 4) return Result::InsufficientCondition; - - if (rTransform) rTransform->update(); - - //No rotation and no skewing - if (pTransform && (!mathRightAngle(&pTransform->m) || mathSkewed(&pTransform->m))) return Result::InsufficientCondition; - if (rTransform && (!mathRightAngle(&rTransform->m) || mathSkewed(&rTransform->m))) return Result::InsufficientCondition; - - //Perpendicular Rectangle? - auto pt1 = pts + 0; - auto pt2 = pts + 1; - auto pt3 = pts + 2; - auto pt4 = pts + 3; - - if ((mathEqual(pt1->x, pt2->x) && mathEqual(pt2->y, pt3->y) && mathEqual(pt3->x, pt4->x) && mathEqual(pt1->y, pt4->y)) || - (mathEqual(pt2->x, pt3->x) && mathEqual(pt1->y, pt2->y) && mathEqual(pt1->x, pt4->x) && mathEqual(pt3->y, pt4->y))) { - - auto v1 = *pt1; - auto v2 = *pt3; - - if (rTransform) { - mathMultiply(&v1, &rTransform->m); - mathMultiply(&v2, &rTransform->m); - } - - if (pTransform) { - mathMultiply(&v1, &pTransform->m); - mathMultiply(&v2, &pTransform->m); - } - - //sorting - if (v1.x > v2.x) { - auto tmp = v2.x; - v2.x = v1.x; - v1.x = tmp; - } - - if (v1.y > v2.y) { - auto tmp = v2.y; - v2.y = v1.y; - v1.y = tmp; - } - - viewport.x = static_cast(v1.x); - viewport.y = static_cast(v1.y); - viewport.w = static_cast(ceil(v2.x - viewport.x)); - viewport.h = static_cast(ceil(v2.y - viewport.y)); - - if (viewport.w < 0) viewport.w = 0; - if (viewport.h < 0) viewport.h = 0; - - return Result::Success; - } - return Result::InsufficientCondition; -} - - -RenderRegion Paint::Impl::bounds(RenderMethod* renderer) const -{ - RenderRegion ret; - PAINT_METHOD(ret, bounds(renderer)); - return ret; -} - - -Iterator* Paint::Impl::iterator() -{ - Iterator* ret; - PAINT_METHOD(ret, iterator()); - return ret; -} - - -Paint* Paint::Impl::duplicate() -{ - Paint* ret; - PAINT_METHOD(ret, duplicate()); - - //duplicate Transform - if (rTransform) { - ret->pImpl->rTransform = new RenderTransform(); - *ret->pImpl->rTransform = *rTransform; - ret->pImpl->renderFlag |= RenderUpdateFlag::Transform; - } - - ret->pImpl->opacity = opacity; - - if (compData) ret->pImpl->composite(ret, compData->target->duplicate(), compData->method); - - return ret; -} - - -bool Paint::Impl::rotate(float degree) -{ - if (rTransform) { - if (mathEqual(degree, rTransform->degree)) return true; - } else { - if (mathZero(degree)) return true; - rTransform = new RenderTransform(); - } - rTransform->degree = degree; - if (!rTransform->overriding) renderFlag |= RenderUpdateFlag::Transform; - - return true; -} - - -bool Paint::Impl::scale(float factor) -{ - if (rTransform) { - if (mathEqual(factor, rTransform->scale)) return true; - } else { - if (mathEqual(factor, 1.0f)) return true; - rTransform = new RenderTransform(); - } - rTransform->scale = factor; - if (!rTransform->overriding) renderFlag |= RenderUpdateFlag::Transform; - - return true; -} - - -bool Paint::Impl::translate(float x, float y) -{ - if (rTransform) { - if (mathEqual(x, rTransform->x) && mathEqual(y, rTransform->y)) return true; - } else { - if (mathZero(x) && mathZero(y)) return true; - rTransform = new RenderTransform(); - } - rTransform->x = x; - rTransform->y = y; - if (!rTransform->overriding) renderFlag |= RenderUpdateFlag::Transform; - - return true; -} - - -bool Paint::Impl::render(RenderMethod* renderer) -{ - Compositor* cmp = nullptr; - - /* Note: only ClipPath is processed in update() step. - Create a composition image. */ - if (compData && compData->method != CompositeMethod::ClipPath && !(compData->target->pImpl->ctxFlag & ContextFlag::FastTrack)) { - RenderRegion region; - PAINT_METHOD(region, bounds(renderer)); - - if (MASK_REGION_MERGING(compData->method)) region.add(P(compData->target)->bounds(renderer)); - if (region.w == 0 || region.h == 0) return true; - cmp = renderer->target(region, COMPOSITE_TO_COLORSPACE(renderer, compData->method)); - if (renderer->beginComposite(cmp, CompositeMethod::None, 255)) { - compData->target->pImpl->render(renderer); - } - } - - if (cmp) renderer->beginComposite(cmp, compData->method, compData->target->pImpl->opacity); - - renderer->blend(blendMethod); - - bool ret; - PAINT_METHOD(ret, render(renderer)); - - if (cmp) renderer->endComposite(cmp); - - return ret; -} - - -RenderData Paint::Impl::update(RenderMethod* renderer, const RenderTransform* pTransform, Array& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) -{ - if (this->renderer != renderer) { - if (this->renderer) TVGERR("RENDERER", "paint's renderer has been changed!"); - renderer->ref(); - this->renderer = renderer; - } - - if (renderFlag & RenderUpdateFlag::Transform) { - if (!rTransform) return nullptr; - rTransform->update(); - } - - /* 1. Composition Pre Processing */ - RenderData trd = nullptr; //composite target render data - RenderRegion viewport; - Result compFastTrack = Result::InsufficientCondition; - bool childClipper = false; - - if (compData) { - auto target = compData->target; - auto method = compData->method; - target->pImpl->ctxFlag &= ~ContextFlag::FastTrack; //reset - - /* If the transformation has no rotational factors and the ClipPath/Alpha(InvAlpha)Masking involves a simple rectangle, - we can optimize by using the viewport instead of the regular ClipPath/AlphaMasking sequence for improved performance. */ - auto tryFastTrack = false; - if (target->identifier() == TVG_CLASS_ID_SHAPE) { - if (method == CompositeMethod::ClipPath) tryFastTrack = true; - else { - auto shape = static_cast(target); - uint8_t a; - shape->fillColor(nullptr, nullptr, nullptr, &a); - //no gradient fill & no compositions of the composition target. - if (!shape->fill() && !(PP(shape)->compData)) { - if (method == CompositeMethod::AlphaMask && a == 255 && PP(shape)->opacity == 255) tryFastTrack = true; - else if (method == CompositeMethod::InvAlphaMask && (a == 0 || PP(shape)->opacity == 0)) tryFastTrack = true; - } - } - if (tryFastTrack) { - RenderRegion viewport2; - if ((compFastTrack = _compFastTrack(target, pTransform, target->pImpl->rTransform, viewport2)) == Result::Success) { - viewport = renderer->viewport(); - viewport2.intersect(viewport); - renderer->viewport(viewport2); - target->pImpl->ctxFlag |= ContextFlag::FastTrack; - } - } - } - if (compFastTrack == Result::InsufficientCondition) { - childClipper = compData->method == CompositeMethod::ClipPath ? true : false; - trd = target->pImpl->update(renderer, pTransform, clips, 255, pFlag, childClipper); - if (childClipper) clips.push(trd); - } - } - - /* 2. Main Update */ - auto newFlag = static_cast(pFlag | renderFlag); - renderFlag = RenderUpdateFlag::None; - opacity = MULTIPLY(opacity, this->opacity); - - RenderData rd = nullptr; - RenderTransform outTransform(pTransform, rTransform); - PAINT_METHOD(rd, update(renderer, &outTransform, clips, opacity, newFlag, clipper)); - - /* 3. Composition Post Processing */ - if (compFastTrack == Result::Success) renderer->viewport(viewport); - else if (childClipper) clips.pop(); - - return rd; -} - - -bool Paint::Impl::bounds(float* x, float* y, float* w, float* h, bool transformed, bool stroking) -{ - Matrix* m = nullptr; - bool ret; - - //Case: No transformed, quick return! - if (!transformed || !(m = this->transform())) { - PAINT_METHOD(ret, bounds(x, y, w, h, stroking)); - return ret; - } - - //Case: Transformed - auto tx = 0.0f; - auto ty = 0.0f; - auto tw = 0.0f; - auto th = 0.0f; - - PAINT_METHOD(ret, bounds(&tx, &ty, &tw, &th, stroking)); - - //Get vertices - Point pt[4] = {{tx, ty}, {tx + tw, ty}, {tx + tw, ty + th}, {tx, ty + th}}; - - //New bounding box - auto x1 = FLT_MAX; - auto y1 = FLT_MAX; - auto x2 = -FLT_MAX; - auto y2 = -FLT_MAX; - - //Compute the AABB after transformation - for (int i = 0; i < 4; i++) { - mathMultiply(&pt[i], m); - - if (pt[i].x < x1) x1 = pt[i].x; - if (pt[i].x > x2) x2 = pt[i].x; - if (pt[i].y < y1) y1 = pt[i].y; - if (pt[i].y > y2) y2 = pt[i].y; - } - - if (x) *x = x1; - if (y) *y = y1; - if (w) *w = x2 - x1; - if (h) *h = y2 - y1; - - return ret; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -Paint :: Paint() : pImpl(new Impl(this)) -{ -} - - -Paint :: ~Paint() -{ - delete(pImpl); -} - - -Result Paint::rotate(float degree) noexcept -{ - if (pImpl->rotate(degree)) return Result::Success; - return Result::FailedAllocation; -} - - -Result Paint::scale(float factor) noexcept -{ - if (pImpl->scale(factor)) return Result::Success; - return Result::FailedAllocation; -} - - -Result Paint::translate(float x, float y) noexcept -{ - if (pImpl->translate(x, y)) return Result::Success; - return Result::FailedAllocation; -} - - -Result Paint::transform(const Matrix& m) noexcept -{ - if (pImpl->transform(m)) return Result::Success; - return Result::FailedAllocation; -} - - -Matrix Paint::transform() noexcept -{ - auto pTransform = pImpl->transform(); - if (pTransform) return *pTransform; - return {1, 0, 0, 0, 1, 0, 0, 0, 1}; -} - - -TVG_DEPRECATED Result Paint::bounds(float* x, float* y, float* w, float* h) const noexcept -{ - return this->bounds(x, y, w, h, false); -} - - -Result Paint::bounds(float* x, float* y, float* w, float* h, bool transform) const noexcept -{ - if (pImpl->bounds(x, y, w, h, transform, true)) return Result::Success; - return Result::InsufficientCondition; -} - - -Paint* Paint::duplicate() const noexcept -{ - return pImpl->duplicate(); -} - - -Result Paint::composite(std::unique_ptr target, CompositeMethod method) noexcept -{ - auto p = target.release(); - if (pImpl->composite(this, p, method)) return Result::Success; - delete(p); - return Result::InvalidArguments; -} - - -CompositeMethod Paint::composite(const Paint** target) const noexcept -{ - if (pImpl->compData) { - if (target) *target = pImpl->compData->target; - return pImpl->compData->method; - } else { - if (target) *target = nullptr; - return CompositeMethod::None; - } -} - - -Result Paint::opacity(uint8_t o) noexcept -{ - if (pImpl->opacity == o) return Result::Success; - - pImpl->opacity = o; - pImpl->renderFlag |= RenderUpdateFlag::Color; - - return Result::Success; -} - - -uint8_t Paint::opacity() const noexcept -{ - return pImpl->opacity; -} - - -uint32_t Paint::identifier() const noexcept -{ - return pImpl->id; -} - - -Result Paint::blend(BlendMethod method) const noexcept -{ - if (pImpl->blendMethod != method) { - pImpl->blendMethod = method; - pImpl->renderFlag |= RenderUpdateFlag::Blend; - } - - return Result::Success; -} - - -BlendMethod Paint::blend() const noexcept -{ - return pImpl->blendMethod; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgPaint.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgPaint.h deleted file mode 100644 index a3fbc07..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgPaint.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_PAINT_H_ -#define _TVG_PAINT_H_ - -#include "tvgRender.h" -#include "tvgMath.h" - -namespace tvg -{ - enum ContextFlag : uint8_t {Invalid = 0, FastTrack = 1}; - - struct Iterator - { - virtual ~Iterator() {} - virtual const Paint* next() = 0; - virtual uint32_t count() = 0; - virtual void begin() = 0; - }; - - struct Composite - { - Paint* target; - Paint* source; - CompositeMethod method; - }; - - struct Paint::Impl - { - Paint* paint = nullptr; - RenderTransform* rTransform = nullptr; - Composite* compData = nullptr; - RenderMethod* renderer = nullptr; - BlendMethod blendMethod = BlendMethod::Normal; //uint8_t - uint8_t renderFlag = RenderUpdateFlag::None; - uint8_t ctxFlag = ContextFlag::Invalid; - uint8_t id; - uint8_t opacity = 255; - uint8_t refCnt = 0; //reference count - - Impl(Paint* pnt) : paint(pnt) {} - - ~Impl() - { - if (compData) { - if (P(compData->target)->unref() == 0) delete(compData->target); - free(compData); - } - delete(rTransform); - if (renderer && (renderer->unref() == 0)) delete(renderer); - } - - uint8_t ref() - { - if (refCnt == 255) TVGERR("RENDERER", "Corrupted reference count!"); - return ++refCnt; - } - - uint8_t unref() - { - if (refCnt == 0) TVGERR("RENDERER", "Corrupted reference count!"); - return --refCnt; - } - - bool transform(const Matrix& m) - { - if (!rTransform) { - if (mathIdentity(&m)) return true; - rTransform = new RenderTransform(); - if (!rTransform) return false; - } - rTransform->override(m); - renderFlag |= RenderUpdateFlag::Transform; - - return true; - } - - Matrix* transform() - { - if (rTransform) { - rTransform->update(); - return &rTransform->m; - } - return nullptr; - } - - bool composite(Paint* source, Paint* target, CompositeMethod method) - { - //Invalid case - if ((!target && method != CompositeMethod::None) || (target && method == CompositeMethod::None)) return false; - - if (compData) { - P(compData->target)->unref(); - if ((compData->target != target) && P(compData->target)->refCnt == 0) { - delete(compData->target); - } - //Reset scenario - if (!target && method == CompositeMethod::None) { - free(compData); - compData = nullptr; - return true; - } - } else { - if (!target && method == CompositeMethod::None) return true; - compData = static_cast(calloc(1, sizeof(Composite))); - } - P(target)->ref(); - compData->target = target; - compData->source = source; - compData->method = method; - return true; - } - - RenderRegion bounds(RenderMethod* renderer) const; - Iterator* iterator(); - bool rotate(float degree); - bool scale(float factor); - bool translate(float x, float y); - bool bounds(float* x, float* y, float* w, float* h, bool transformed, bool stroking); - RenderData update(RenderMethod* renderer, const RenderTransform* pTransform, Array& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper = false); - bool render(RenderMethod* renderer); - Paint* duplicate(); - }; -} - -#endif //_TVG_PAINT_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgPicture.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgPicture.cpp deleted file mode 100644 index 3d7859d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgPicture.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgPicture.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -RenderUpdateFlag Picture::Impl::load() -{ - if (loader) { - if (paint) { - loader->sync(); - } else { - paint = loader->paint(); - if (paint) { - if (w != loader->w || h != loader->h) { - if (!resizing) { - w = loader->w; - h = loader->h; - } - loader->resize(paint, w, h); - resizing = false; - } - return RenderUpdateFlag::None; - } - } - if (!surface) { - if ((surface = loader->bitmap())) { - return RenderUpdateFlag::Image; - } - } - } - return RenderUpdateFlag::None; -} - - -bool Picture::Impl::needComposition(uint8_t opacity) -{ - //In this case, paint(scene) would try composition itself. - if (opacity < 255) return false; - - //Composition test - const Paint* target; - auto method = picture->composite(&target); - if (!target || method == tvg::CompositeMethod::ClipPath) return false; - if (target->pImpl->opacity == 255 || target->pImpl->opacity == 0) return false; - - return true; -} - - -bool Picture::Impl::render(RenderMethod* renderer) -{ - bool ret = false; - if (surface) return renderer->renderImage(rd); - else if (paint) { - Compositor* cmp = nullptr; - if (needComp) { - cmp = renderer->target(bounds(renderer), renderer->colorSpace()); - renderer->beginComposite(cmp, CompositeMethod::None, 255); - } - ret = paint->pImpl->render(renderer); - if (cmp) renderer->endComposite(cmp); - } - return ret; -} - - -bool Picture::Impl::size(float w, float h) -{ - this->w = w; - this->h = h; - resizing = true; - return true; -} - - -RenderRegion Picture::Impl::bounds(RenderMethod* renderer) -{ - if (rd) return renderer->region(rd); - if (paint) return paint->pImpl->bounds(renderer); - return {0, 0, 0, 0}; -} - - -RenderTransform Picture::Impl::resizeTransform(const RenderTransform* pTransform) -{ - //Overriding Transformation by the desired image size - auto sx = w / loader->w; - auto sy = h / loader->h; - auto scale = sx < sy ? sx : sy; - - RenderTransform tmp; - tmp.m = {scale, 0, 0, 0, scale, 0, 0, 0, 1}; - - if (!pTransform) return tmp; - else return RenderTransform(pTransform, &tmp); -} - - -Result Picture::Impl::load(ImageLoader* loader) -{ - //Same resource has been loaded. - if (this->loader == loader) { - this->loader->sharing--; //make it sure the reference counting. - return Result::Success; - } else if (this->loader) { - LoaderMgr::retrieve(this->loader); - } - - this->loader = loader; - - if (!loader->read()) return Result::Unknown; - - this->w = loader->w; - this->h = loader->h; - - return Result::Success; -} - - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -Picture::Picture() : pImpl(new Impl(this)) -{ - Paint::pImpl->id = TVG_CLASS_ID_PICTURE; -} - - -Picture::~Picture() -{ - delete(pImpl); -} - - -unique_ptr Picture::gen() noexcept -{ - return unique_ptr(new Picture); -} - - -uint32_t Picture::identifier() noexcept -{ - return TVG_CLASS_ID_PICTURE; -} - - -Result Picture::load(const std::string& path) noexcept -{ - if (path.empty()) return Result::InvalidArguments; - - return pImpl->load(path); -} - - -Result Picture::load(const char* data, uint32_t size, const string& mimeType, bool copy) noexcept -{ - if (!data || size <= 0) return Result::InvalidArguments; - - return pImpl->load(data, size, mimeType, copy); -} - - -TVG_DEPRECATED Result Picture::load(const char* data, uint32_t size, bool copy) noexcept -{ - return load(data, size, "", copy); -} - - -Result Picture::load(uint32_t* data, uint32_t w, uint32_t h, bool copy) noexcept -{ - if (!data || w <= 0 || h <= 0) return Result::InvalidArguments; - - return pImpl->load(data, w, h, copy); -} - - -Result Picture::size(float w, float h) noexcept -{ - if (pImpl->size(w, h)) return Result::Success; - return Result::InsufficientCondition; -} - - -Result Picture::size(float* w, float* h) const noexcept -{ - if (!pImpl->loader) return Result::InsufficientCondition; - if (w) *w = pImpl->w; - if (h) *h = pImpl->h; - return Result::Success; -} - - -Result Picture::mesh(const Polygon* triangles, uint32_t triangleCnt) noexcept -{ - if (!triangles && triangleCnt > 0) return Result::InvalidArguments; - if (triangles && triangleCnt == 0) return Result::InvalidArguments; - - pImpl->mesh(triangles, triangleCnt); - return Result::Success; -} - - -uint32_t Picture::mesh(const Polygon** triangles) const noexcept -{ - if (triangles) *triangles = pImpl->rm.triangles; - return pImpl->rm.triangleCnt; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgPicture.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgPicture.h deleted file mode 100644 index 7c3ec54..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgPicture.h +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_PICTURE_H_ -#define _TVG_PICTURE_H_ - -#include -#include "tvgPaint.h" -#include "tvgLoader.h" - - -struct PictureIterator : Iterator -{ - Paint* paint = nullptr; - Paint* ptr = nullptr; - - PictureIterator(Paint* p) : paint(p) {} - - const Paint* next() override - { - if (!ptr) ptr = paint; - else ptr = nullptr; - return ptr; - } - - uint32_t count() override - { - if (paint) return 1; - else return 0; - } - - void begin() override - { - ptr = nullptr; - } -}; - - -struct Picture::Impl -{ - ImageLoader* loader = nullptr; - - Paint* paint = nullptr; //vector picture uses - Surface* surface = nullptr; //bitmap picture uses - RenderData rd = nullptr; //engine data - float w = 0, h = 0; - RenderMesh rm; //mesh data - Picture* picture = nullptr; - bool resizing = false; - bool needComp = false; //need composition - - RenderTransform resizeTransform(const RenderTransform* pTransform); - bool needComposition(uint8_t opacity); - bool render(RenderMethod* renderer); - bool size(float w, float h); - RenderRegion bounds(RenderMethod* renderer); - Result load(ImageLoader* ploader); - - Impl(Picture* p) : picture(p) - { - } - - ~Impl() - { - LoaderMgr::retrieve(loader); - if (surface) { - if (auto renderer = PP(picture)->renderer) { - renderer->dispose(rd); - } - } - delete(paint); - } - - RenderData update(RenderMethod* renderer, const RenderTransform* pTransform, Array& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) - { - auto flag = load(); - - if (surface) { - auto transform = resizeTransform(pTransform); - rd = renderer->prepare(surface, &rm, rd, &transform, clips, opacity, static_cast(pFlag | flag)); - } else if (paint) { - if (resizing) { - loader->resize(paint, w, h); - resizing = false; - } - needComp = needComposition(opacity) ? true : false; - rd = paint->pImpl->update(renderer, pTransform, clips, opacity, static_cast(pFlag | flag), clipper); - } - return rd; - } - - bool bounds(float* x, float* y, float* w, float* h, bool stroking) - { - if (rm.triangleCnt > 0) { - auto triangles = rm.triangles; - auto min = triangles[0].vertex[0].pt; - auto max = triangles[0].vertex[0].pt; - - for (uint32_t i = 0; i < rm.triangleCnt; ++i) { - if (triangles[i].vertex[0].pt.x < min.x) min.x = triangles[i].vertex[0].pt.x; - else if (triangles[i].vertex[0].pt.x > max.x) max.x = triangles[i].vertex[0].pt.x; - if (triangles[i].vertex[0].pt.y < min.y) min.y = triangles[i].vertex[0].pt.y; - else if (triangles[i].vertex[0].pt.y > max.y) max.y = triangles[i].vertex[0].pt.y; - - if (triangles[i].vertex[1].pt.x < min.x) min.x = triangles[i].vertex[1].pt.x; - else if (triangles[i].vertex[1].pt.x > max.x) max.x = triangles[i].vertex[1].pt.x; - if (triangles[i].vertex[1].pt.y < min.y) min.y = triangles[i].vertex[1].pt.y; - else if (triangles[i].vertex[1].pt.y > max.y) max.y = triangles[i].vertex[1].pt.y; - - if (triangles[i].vertex[2].pt.x < min.x) min.x = triangles[i].vertex[2].pt.x; - else if (triangles[i].vertex[2].pt.x > max.x) max.x = triangles[i].vertex[2].pt.x; - if (triangles[i].vertex[2].pt.y < min.y) min.y = triangles[i].vertex[2].pt.y; - else if (triangles[i].vertex[2].pt.y > max.y) max.y = triangles[i].vertex[2].pt.y; - } - if (x) *x = min.x; - if (y) *y = min.y; - if (w) *w = max.x - min.x; - if (h) *h = max.y - min.y; - } else { - if (x) *x = 0; - if (y) *y = 0; - if (w) *w = this->w; - if (h) *h = this->h; - } - return true; - } - - Result load(const string& path) - { - if (paint || surface) return Result::InsufficientCondition; - - bool invalid; //Invalid Path - auto loader = static_cast(LoaderMgr::loader(path, &invalid)); - if (!loader) { - if (invalid) return Result::InvalidArguments; - return Result::NonSupport; - } - return load(loader); - } - - Result load(const char* data, uint32_t size, const string& mimeType, bool copy) - { - if (paint || surface) return Result::InsufficientCondition; - auto loader = static_cast(LoaderMgr::loader(data, size, mimeType, copy)); - if (!loader) return Result::NonSupport; - return load(loader); - } - - Result load(uint32_t* data, uint32_t w, uint32_t h, bool copy) - { - if (paint || surface) return Result::InsufficientCondition; - - auto loader = static_cast(LoaderMgr::loader(data, w, h, copy)); - if (!loader) return Result::FailedAllocation; - - return load(loader); - } - - void mesh(const Polygon* triangles, const uint32_t triangleCnt) - { - if (triangles && triangleCnt > 0) { - this->rm.triangleCnt = triangleCnt; - this->rm.triangles = (Polygon*)malloc(sizeof(Polygon) * triangleCnt); - memcpy(this->rm.triangles, triangles, sizeof(Polygon) * triangleCnt); - } else { - free(this->rm.triangles); - this->rm.triangles = nullptr; - this->rm.triangleCnt = 0; - } - } - - Paint* duplicate() - { - load(); - - auto ret = Picture::gen().release(); - auto dup = ret->pImpl; - - if (paint) dup->paint = paint->duplicate(); - - if (loader) { - dup->loader = loader; - ++dup->loader->sharing; - } - - dup->surface = surface; - dup->w = w; - dup->h = h; - dup->resizing = resizing; - - if (rm.triangleCnt > 0) { - dup->rm.triangleCnt = rm.triangleCnt; - dup->rm.triangles = (Polygon*)malloc(sizeof(Polygon) * rm.triangleCnt); - memcpy(dup->rm.triangles, rm.triangles, sizeof(Polygon) * rm.triangleCnt); - } - - return ret; - } - - Iterator* iterator() - { - load(); - return new PictureIterator(paint); - } - - uint32_t* data(uint32_t* w, uint32_t* h) - { - //Try it, If not loaded yet. - load(); - - if (loader) { - if (w) *w = static_cast(loader->w); - if (h) *h = static_cast(loader->h); - } else { - if (w) *w = 0; - if (h) *h = 0; - } - if (surface) return surface->buf32; - else return nullptr; - } - - RenderUpdateFlag load(); -}; - -#endif //_TVG_PICTURE_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgRawLoader.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgRawLoader.cpp deleted file mode 100644 index 2274141..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgRawLoader.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include -#include -#include "tvgLoader.h" -#include "tvgRawLoader.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -RawLoader::RawLoader() : ImageLoader(FileType::Raw) -{ -} - - -RawLoader::~RawLoader() -{ - if (copy) free(surface.buf32); -} - - -bool RawLoader::open(const uint32_t* data, uint32_t w, uint32_t h, bool copy) -{ - if (!LoadModule::read()) return true; - - if (!data || w == 0 || h == 0) return false; - - this->w = (float)w; - this->h = (float)h; - this->copy = copy; - - if (copy) { - surface.buf32 = (uint32_t*)malloc(sizeof(uint32_t) * w * h); - if (!surface.buf32) return false; - memcpy((void*)surface.buf32, data, sizeof(uint32_t) * w * h); - } - else surface.buf32 = const_cast(data); - - //setup the surface - surface.stride = w; - surface.w = w; - surface.h = h; - surface.cs = ColorSpace::ARGB8888; - surface.channelSize = sizeof(uint32_t); - surface.premultiplied = true; - - return true; -} - - -bool RawLoader::read() -{ - LoadModule::read(); - - return true; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgRawLoader.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgRawLoader.h deleted file mode 100644 index 492fd53..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgRawLoader.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_RAW_LOADER_H_ -#define _TVG_RAW_LOADER_H_ - -class RawLoader : public ImageLoader -{ -public: - bool copy = false; - - RawLoader(); - ~RawLoader(); - - using LoadModule::open; - bool open(const uint32_t* data, uint32_t w, uint32_t h, bool copy); - bool read() override; -}; - - -#endif //_TVG_RAW_LOADER_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgRender.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgRender.cpp deleted file mode 100644 index dad20e8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgRender.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgMath.h" -#include "tvgRender.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -void RenderTransform::override(const Matrix& m) -{ - this->m = m; - overriding = true; -} - - -void RenderTransform::update() -{ - if (overriding) return; - - mathIdentity(&m); - - mathScale(&m, scale, scale); - - if (!mathZero(degree)) mathRotate(&m, degree); - - mathTranslate(&m, x, y); -} - - -RenderTransform::RenderTransform(const RenderTransform* lhs, const RenderTransform* rhs) -{ - if (lhs && rhs) m = mathMultiply(&lhs->m, &rhs->m); - else if (lhs) m = lhs->m; - else if (rhs) m = rhs->m; - else mathIdentity(&m); -} - - -void RenderRegion::intersect(const RenderRegion& rhs) -{ - auto x1 = x + w; - auto y1 = y + h; - auto x2 = rhs.x + rhs.w; - auto y2 = rhs.y + rhs.h; - - x = (x > rhs.x) ? x : rhs.x; - y = (y > rhs.y) ? y : rhs.y; - w = ((x1 < x2) ? x1 : x2) - x; - h = ((y1 < y2) ? y1 : y2) - y; - - if (w < 0) w = 0; - if (h < 0) h = 0; -} - - -void RenderRegion::add(const RenderRegion& rhs) -{ - if (rhs.x < x) { - w += (x - rhs.x); - x = rhs.x; - } - if (rhs.y < y) { - h += (y - rhs.y); - y = rhs.y; - } - if (rhs.x + rhs.w > x + w) w = (rhs.x + rhs.w) - x; - if (rhs.y + rhs.h > y + h) h = (rhs.y + rhs.h) - y; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgRender.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgRender.h deleted file mode 100644 index 8467a91..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgRender.h +++ /dev/null @@ -1,356 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_RENDER_H_ -#define _TVG_RENDER_H_ - -#include "tvgCommon.h" -#include "tvgArray.h" -#include "tvgLock.h" - -namespace tvg -{ - -using RenderData = void*; -using pixel_t = uint32_t; - -enum RenderUpdateFlag : uint8_t {None = 0, Path = 1, Color = 2, Gradient = 4, Stroke = 8, Transform = 16, Image = 32, GradientStroke = 64, Blend = 128, All = 255}; - -struct Surface; - -enum ColorSpace -{ - ABGR8888 = 0, //The channels are joined in the order: alpha, blue, green, red. Colors are alpha-premultiplied. - ARGB8888, //The channels are joined in the order: alpha, red, green, blue. Colors are alpha-premultiplied. - ABGR8888S, //The channels are joined in the order: alpha, blue, green, red. Colors are un-alpha-premultiplied. - ARGB8888S, //The channels are joined in the order: alpha, red, green, blue. Colors are un-alpha-premultiplied. - Grayscale8, //One single channel data. - Unsupported //TODO: Change to the default, At the moment, we put it in the last to align with SwCanvas::Colorspace. -}; - -struct Surface -{ - union { - pixel_t* data = nullptr; //system based data pointer - uint32_t* buf32; //for explicit 32bits channels - uint8_t* buf8; //for explicit 8bits grayscale - }; - Key key; //a reserved lock for the thread safety - uint32_t stride = 0; - uint32_t w = 0, h = 0; - ColorSpace cs = ColorSpace::Unsupported; - uint8_t channelSize = 0; - bool premultiplied = false; //Alpha-premultiplied - - Surface() - { - } - - Surface(const Surface* rhs) - { - data = rhs->data; - stride = rhs->stride; - w = rhs->w; - h = rhs->h; - cs = rhs->cs; - channelSize = rhs->channelSize; - premultiplied = rhs->premultiplied; - } - - -}; - -struct Compositor -{ - CompositeMethod method; - uint8_t opacity; -}; - -struct RenderMesh -{ - Polygon* triangles = nullptr; - uint32_t triangleCnt = 0; - - ~RenderMesh() - { - free(triangles); - } -}; - -struct RenderRegion -{ - int32_t x, y, w, h; - - void intersect(const RenderRegion& rhs); - void add(const RenderRegion& rhs); - - bool operator==(const RenderRegion& rhs) - { - if (x == rhs.x && y == rhs.y && w == rhs.w && h == rhs.h) return true; - return false; - } -}; - -struct RenderTransform -{ - Matrix m; //3x3 Matrix Elements - float x = 0.0f; - float y = 0.0f; - float degree = 0.0f; //rotation degree - float scale = 1.0f; //scale factor - bool overriding = false; //user transform? - - void update(); - void override(const Matrix& m); - - RenderTransform() {} - RenderTransform(const RenderTransform* lhs, const RenderTransform* rhs); -}; - -struct RenderStroke -{ - float width = 0.0f; - uint8_t color[4] = {0, 0, 0, 0}; - Fill *fill = nullptr; - float* dashPattern = nullptr; - uint32_t dashCnt = 0; - float dashOffset = 0.0f; - StrokeCap cap = StrokeCap::Square; - StrokeJoin join = StrokeJoin::Bevel; - float miterlimit = 4.0f; - bool strokeFirst = false; - - struct { - float begin = 0.0f; - float end = 1.0f; - bool individual = false; - } trim; - - ~RenderStroke() - { - free(dashPattern); - delete(fill); - } -}; - -struct RenderShape -{ - struct - { - Array cmds; - Array pts; - } path; - - Fill *fill = nullptr; - RenderStroke *stroke = nullptr; - uint8_t color[4] = {0, 0, 0, 0}; //r, g, b, a - FillRule rule = FillRule::Winding; - - ~RenderShape() - { - delete(fill); - delete(stroke); - } - - void fillColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) const - { - if (r) *r = color[0]; - if (g) *g = color[1]; - if (b) *b = color[2]; - if (a) *a = color[3]; - } - - float strokeWidth() const - { - if (!stroke) return 0; - return stroke->width; - } - - bool strokeTrim() const - { - if (!stroke) return false; - if (stroke->trim.begin == 0.0f && stroke->trim.end == 1.0f) return false; - if (stroke->trim.begin == 1.0f && stroke->trim.end == 0.0f) return false; - return true; - } - - bool strokeColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) const - { - if (!stroke) return false; - - if (r) *r = stroke->color[0]; - if (g) *g = stroke->color[1]; - if (b) *b = stroke->color[2]; - if (a) *a = stroke->color[3]; - - return true; - } - - const Fill* strokeFill() const - { - if (!stroke) return nullptr; - return stroke->fill; - } - - uint32_t strokeDash(const float** dashPattern, float* offset) const - { - if (!stroke) return 0; - if (dashPattern) *dashPattern = stroke->dashPattern; - if (offset) *offset = stroke->dashOffset; - return stroke->dashCnt; - } - - StrokeCap strokeCap() const - { - if (!stroke) return StrokeCap::Square; - return stroke->cap; - } - - StrokeJoin strokeJoin() const - { - if (!stroke) return StrokeJoin::Bevel; - return stroke->join; - } - - float strokeMiterlimit() const - { - if (!stroke) return 4.0f; - - return stroke->miterlimit;; - } -}; - -class RenderMethod -{ -private: - uint32_t refCnt = 0; //reference count - Key key; - -public: - uint32_t ref() - { - ScopedLock lock(key); - return (++refCnt); - } - - uint32_t unref() - { - ScopedLock lock(key); - return (--refCnt); - } - - virtual ~RenderMethod() {} - virtual RenderData prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) = 0; - virtual RenderData prepare(const Array& scene, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) = 0; - virtual RenderData prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) = 0; - virtual bool preRender() = 0; - virtual bool renderShape(RenderData data) = 0; - virtual bool renderImage(RenderData data) = 0; - virtual bool postRender() = 0; - virtual void dispose(RenderData data) = 0; - virtual RenderRegion region(RenderData data) = 0; - virtual RenderRegion viewport() = 0; - virtual bool viewport(const RenderRegion& vp) = 0; - virtual bool blend(BlendMethod method) = 0; - virtual ColorSpace colorSpace() = 0; - virtual const Surface* mainSurface() = 0; - - virtual bool clear() = 0; - virtual bool sync() = 0; - - virtual Compositor* target(const RenderRegion& region, ColorSpace cs) = 0; - virtual bool beginComposite(Compositor* cmp, CompositeMethod method, uint8_t opacity) = 0; - virtual bool endComposite(Compositor* cmp) = 0; -}; - -static inline bool MASK_REGION_MERGING(CompositeMethod method) -{ - switch(method) { - case CompositeMethod::AlphaMask: - case CompositeMethod::InvAlphaMask: - case CompositeMethod::LumaMask: - case CompositeMethod::InvLumaMask: - case CompositeMethod::SubtractMask: - case CompositeMethod::IntersectMask: - return false; - //these might expand the rendering region - case CompositeMethod::AddMask: - case CompositeMethod::DifferenceMask: - return true; - default: - TVGERR("RENDERER", "Unsupported Composite Method! = %d", (int)method); - return false; - } -} - -static inline uint8_t CHANNEL_SIZE(ColorSpace cs) -{ - switch(cs) { - case ColorSpace::ABGR8888: - case ColorSpace::ABGR8888S: - case ColorSpace::ARGB8888: - case ColorSpace::ARGB8888S: - return sizeof(uint32_t); - case ColorSpace::Grayscale8: - return sizeof(uint8_t); - case ColorSpace::Unsupported: - default: - TVGERR("RENDERER", "Unsupported Channel Size! = %d", (int)cs); - return 0; - } -} - -static inline ColorSpace COMPOSITE_TO_COLORSPACE(RenderMethod* renderer, CompositeMethod method) -{ - switch(method) { - case CompositeMethod::AlphaMask: - case CompositeMethod::InvAlphaMask: - case CompositeMethod::AddMask: - case CompositeMethod::DifferenceMask: - case CompositeMethod::SubtractMask: - case CompositeMethod::IntersectMask: - return ColorSpace::Grayscale8; - //TODO: Optimize Luma/InvLuma colorspace to Grayscale8 - case CompositeMethod::LumaMask: - case CompositeMethod::InvLumaMask: - return renderer->colorSpace(); - default: - TVGERR("RENDERER", "Unsupported Composite Size! = %d", (int)method); - return ColorSpace::Unsupported; - } -} - -static inline uint8_t MULTIPLY(uint8_t c, uint8_t a) -{ - return (((c) * (a) + 0xff) >> 8); -} - - -} - -#endif //_TVG_RENDER_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSaveModule.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSaveModule.h deleted file mode 100644 index abfd538..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSaveModule.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2021 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_SAVE_MODULE_H_ -#define _TVG_SAVE_MODULE_H_ - -#include "tvgIteratorAccessor.h" - -namespace tvg -{ - -class SaveModule -{ -public: - virtual ~SaveModule() {} - - virtual bool save(Paint* paint, const string& path, bool compress) = 0; - virtual bool save(Animation* animation, Paint* bg, const string& path, uint32_t quality, uint32_t fps) = 0; - virtual bool close() = 0; -}; - -} - -#endif //_TVG_SAVE_MODULE_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSaver.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSaver.cpp deleted file mode 100644 index f2a22ec..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSaver.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (c) 2021 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgCommon.h" -#include "tvgSaveModule.h" -#include "tvgPaint.h" - -#ifdef THORVG_TVG_SAVER_SUPPORT - #include "tvgTvgSaver.h" -#endif -#ifdef THORVG_GIF_SAVER_SUPPORT - #include "tvgGifSaver.h" -#endif - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -struct Saver::Impl -{ - SaveModule* saveModule = nullptr; - Paint* bg = nullptr; - - ~Impl() - { - delete(saveModule); - delete(bg); - } -}; - - -static SaveModule* _find(FileType type) -{ - switch(type) { - case FileType::Tvg: { -#ifdef THORVG_TVG_SAVER_SUPPORT - return new TvgSaver; -#endif - break; - } - case FileType::Gif: { -#ifdef THORVG_GIF_SAVER_SUPPORT - return new GifSaver; -#endif - break; - } - default: { - break; - } - } - -#ifdef THORVG_LOG_ENABLED - const char *format; - switch(type) { - case FileType::Tvg: { - format = "TVG"; - break; - } - case FileType::Gif: { - format = "GIF"; - break; - } - default: { - format = "???"; - break; - } - } - TVGLOG("RENDERER", "%s format is not supported", format); -#endif - return nullptr; -} - - -static SaveModule* _find(const string& path) -{ - auto ext = path.substr(path.find_last_of(".") + 1); - if (!ext.compare("tvg")) { - return _find(FileType::Tvg); - } else if (!ext.compare("gif")) { - return _find(FileType::Gif); - } - return nullptr; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -Saver::Saver() : pImpl(new Impl()) -{ -} - - -Saver::~Saver() -{ - delete(pImpl); -} - - -Result Saver::save(std::unique_ptr paint, const string& path, bool compress) noexcept -{ - auto p = paint.release(); - if (!p) return Result::MemoryCorruption; - - //Already on saving another resource. - if (pImpl->saveModule) { - if (P(p)->refCnt == 0) delete(p); - return Result::InsufficientCondition; - } - - if (auto saveModule = _find(path)) { - if (saveModule->save(p, path, compress)) { - pImpl->saveModule = saveModule; - return Result::Success; - } else { - if (P(p)->refCnt == 0) delete(p); - delete(saveModule); - return Result::Unknown; - } - } - if (P(p)->refCnt == 0) delete(p); - return Result::NonSupport; -} - - -Result Saver::background(unique_ptr paint) noexcept -{ - delete(pImpl->bg); - pImpl->bg = paint.release(); - - return Result::Success; -} - - -Result Saver::save(unique_ptr animation, const string& path, uint32_t quality, uint32_t fps) noexcept -{ - auto a = animation.release(); - if (!a) return Result::MemoryCorruption; - - //animation holds the picture, it must be 1 at the bottom. - auto remove = PP(a->picture())->refCnt <= 1 ? true : false; - - if (mathZero(a->totalFrame())) { - if (remove) delete(a); - return Result::InsufficientCondition; - } - - //Already on saving another resource. - if (pImpl->saveModule) { - if (remove) delete(a); - return Result::InsufficientCondition; - } - - if (auto saveModule = _find(path)) { - if (saveModule->save(a, pImpl->bg, path, quality, fps)) { - pImpl->saveModule = saveModule; - return Result::Success; - } else { - if (remove) delete(a); - delete(saveModule); - return Result::Unknown; - } - } - if (remove) delete(a); - return Result::NonSupport; -} - - -Result Saver::sync() noexcept -{ - if (!pImpl->saveModule) return Result::InsufficientCondition; - pImpl->saveModule->close(); - delete(pImpl->saveModule); - pImpl->saveModule = nullptr; - - return Result::Success; -} - - -unique_ptr Saver::gen() noexcept -{ - return unique_ptr(new Saver); -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgScene.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgScene.cpp deleted file mode 100644 index cd911f7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgScene.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgScene.h" - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -Scene::Scene() : pImpl(new Impl(this)) -{ - Paint::pImpl->id = TVG_CLASS_ID_SCENE; -} - - -Scene::~Scene() -{ - delete(pImpl); -} - - -unique_ptr Scene::gen() noexcept -{ - return unique_ptr(new Scene); -} - - -uint32_t Scene::identifier() noexcept -{ - return TVG_CLASS_ID_SCENE; -} - - -Result Scene::push(unique_ptr paint) noexcept -{ - auto p = paint.release(); - if (!p) return Result::MemoryCorruption; - PP(p)->ref(); - pImpl->paints.push_back(p); - - return Result::Success; -} - - -Result Scene::reserve(TVG_UNUSED uint32_t size) noexcept -{ - return Result::NonSupport; -} - - -Result Scene::clear(bool free) noexcept -{ - pImpl->clear(free); - - return Result::Success; -} - - -list& Scene::paints() noexcept -{ - return pImpl->paints; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgScene.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgScene.h deleted file mode 100644 index 8347d92..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgScene.h +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_SCENE_H_ -#define _TVG_SCENE_H_ - -#include -#include "tvgPaint.h" - - -struct SceneIterator : Iterator -{ - list* paints; - list::iterator itr; - - SceneIterator(list* p) : paints(p) - { - begin(); - } - - const Paint* next() override - { - if (itr == paints->end()) return nullptr; - auto paint = *itr; - ++itr; - return paint; - } - - uint32_t count() override - { - return paints->size(); - } - - void begin() override - { - itr = paints->begin(); - } -}; - -struct Scene::Impl -{ - list paints; - RenderData rd = nullptr; - Scene* scene = nullptr; - uint8_t opacity; //for composition - bool needComp = false; //composite or not - - Impl(Scene* s) : scene(s) - { - } - - ~Impl() - { - for (auto paint : paints) { - if (P(paint)->unref() == 0) delete(paint); - } - - if (auto renderer = PP(scene)->renderer) { - renderer->dispose(rd); - } - } - - bool needComposition(uint8_t opacity) - { - if (opacity == 0 || paints.empty()) return false; - - //Masking may require composition (even if opacity == 255) - auto compMethod = scene->composite(nullptr); - if (compMethod != CompositeMethod::None && compMethod != CompositeMethod::ClipPath) return true; - - //Blending may require composition (even if opacity == 255) - if (scene->blend() != BlendMethod::Normal) return true; - - //Half translucent requires intermediate composition. - if (opacity == 255) return false; - - //If scene has several children or only scene, it may require composition. - //OPTIMIZE: the bitmap type of the picture would not need the composition. - //OPTIMIZE: a single paint of a scene would not need the composition. - if (paints.size() == 1 && paints.front()->identifier() == TVG_CLASS_ID_SHAPE) return false; - - return true; - } - - RenderData update(RenderMethod* renderer, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flag, bool clipper) - { - if ((needComp = needComposition(opacity))) { - /* Overriding opacity value. If this scene is half-translucent, - It must do intermediate composition with that opacity value. */ - this->opacity = opacity; - opacity = 255; - } - - if (clipper) { - Array rds(paints.size()); - for (auto paint : paints) { - rds.push(paint->pImpl->update(renderer, transform, clips, opacity, flag, true)); - } - rd = renderer->prepare(rds, rd, transform, clips, opacity, flag); - return rd; - } else { - for (auto paint : paints) { - paint->pImpl->update(renderer, transform, clips, opacity, flag, false); - } - return nullptr; - } - } - - bool render(RenderMethod* renderer) - { - Compositor* cmp = nullptr; - auto ret = true; - - if (needComp) { - cmp = renderer->target(bounds(renderer), renderer->colorSpace()); - renderer->beginComposite(cmp, CompositeMethod::None, opacity); - } - - for (auto paint : paints) { - ret &= paint->pImpl->render(renderer); - } - - if (cmp) renderer->endComposite(cmp); - - return ret; - } - - RenderRegion bounds(RenderMethod* renderer) const - { - if (paints.empty()) return {0, 0, 0, 0}; - - int32_t x1 = INT32_MAX; - int32_t y1 = INT32_MAX; - int32_t x2 = 0; - int32_t y2 = 0; - - for (auto paint : paints) { - auto region = paint->pImpl->bounds(renderer); - - //Merge regions - if (region.x < x1) x1 = region.x; - if (x2 < region.x + region.w) x2 = (region.x + region.w); - if (region.y < y1) y1 = region.y; - if (y2 < region.y + region.h) y2 = (region.y + region.h); - } - - return {x1, y1, (x2 - x1), (y2 - y1)}; - } - - bool bounds(float* px, float* py, float* pw, float* ph, bool stroking) - { - if (paints.empty()) return false; - - auto x1 = FLT_MAX; - auto y1 = FLT_MAX; - auto x2 = -FLT_MAX; - auto y2 = -FLT_MAX; - - for (auto paint : paints) { - auto x = FLT_MAX; - auto y = FLT_MAX; - auto w = 0.0f; - auto h = 0.0f; - - if (!P(paint)->bounds(&x, &y, &w, &h, true, stroking)) continue; - - //Merge regions - if (x < x1) x1 = x; - if (x2 < x + w) x2 = (x + w); - if (y < y1) y1 = y; - if (y2 < y + h) y2 = (y + h); - } - - if (px) *px = x1; - if (py) *py = y1; - if (pw) *pw = (x2 - x1); - if (ph) *ph = (y2 - y1); - - return true; - } - - Paint* duplicate() - { - auto ret = Scene::gen().release(); - auto dup = ret->pImpl; - - for (auto paint : paints) { - auto cdup = paint->duplicate(); - P(cdup)->ref(); - dup->paints.push_back(cdup); - } - - return ret; - } - - void clear(bool free) - { - for (auto paint : paints) { - if (P(paint)->unref() == 0 && free) delete(paint); - } - paints.clear(); - } - - Iterator* iterator() - { - return new SceneIterator(&paints); - } -}; - -#endif //_TVG_SCENE_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgShape.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgShape.cpp deleted file mode 100644 index fcf77e2..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgShape.cpp +++ /dev/null @@ -1,411 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgMath.h" -#include "tvgShape.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -Shape :: Shape() : pImpl(new Impl(this)) -{ - Paint::pImpl->id = TVG_CLASS_ID_SHAPE; -} - - -Shape :: ~Shape() -{ - delete(pImpl); -} - - -unique_ptr Shape::gen() noexcept -{ - return unique_ptr(new Shape); -} - - -uint32_t Shape::identifier() noexcept -{ - return TVG_CLASS_ID_SHAPE; -} - - -Result Shape::reset() noexcept -{ - pImpl->rs.path.cmds.clear(); - pImpl->rs.path.pts.clear(); - - pImpl->flag |= RenderUpdateFlag::Path; - - return Result::Success; -} - - -uint32_t Shape::pathCommands(const PathCommand** cmds) const noexcept -{ - if (cmds) *cmds = pImpl->rs.path.cmds.data; - return pImpl->rs.path.cmds.count; -} - - -uint32_t Shape::pathCoords(const Point** pts) const noexcept -{ - if (pts) *pts = pImpl->rs.path.pts.data; - return pImpl->rs.path.pts.count; -} - - -Result Shape::appendPath(const PathCommand *cmds, uint32_t cmdCnt, const Point* pts, uint32_t ptsCnt) noexcept -{ - if (cmdCnt == 0 || ptsCnt == 0 || !cmds || !pts) return Result::InvalidArguments; - - pImpl->grow(cmdCnt, ptsCnt); - pImpl->append(cmds, cmdCnt, pts, ptsCnt); - - return Result::Success; -} - - -Result Shape::moveTo(float x, float y) noexcept -{ - pImpl->moveTo(x, y); - - return Result::Success; -} - - -Result Shape::lineTo(float x, float y) noexcept -{ - pImpl->lineTo(x, y); - - return Result::Success; -} - - -Result Shape::cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float y) noexcept -{ - pImpl->cubicTo(cx1, cy1, cx2, cy2, x, y); - - return Result::Success; -} - - -Result Shape::close() noexcept -{ - pImpl->close(); - - return Result::Success; -} - - -Result Shape::appendCircle(float cx, float cy, float rx, float ry) noexcept -{ - auto rxKappa = rx * PATH_KAPPA; - auto ryKappa = ry * PATH_KAPPA; - - pImpl->grow(6, 13); - pImpl->moveTo(cx + rx, cy); - pImpl->cubicTo(cx + rx, cy + ryKappa, cx + rxKappa, cy + ry, cx, cy + ry); - pImpl->cubicTo(cx - rxKappa, cy + ry, cx - rx, cy + ryKappa, cx - rx, cy); - pImpl->cubicTo(cx - rx, cy - ryKappa, cx - rxKappa, cy - ry, cx, cy - ry); - pImpl->cubicTo(cx + rxKappa, cy - ry, cx + rx, cy - ryKappa, cx + rx, cy); - pImpl->close(); - - return Result::Success; -} - -Result Shape::appendArc(float cx, float cy, float radius, float startAngle, float sweep, bool pie) noexcept -{ - //just circle - if (sweep >= 360.0f || sweep <= -360.0f) return appendCircle(cx, cy, radius, radius); - - const float arcPrecision = 1e-5f; - startAngle = mathDeg2Rad(startAngle); - sweep = mathDeg2Rad(sweep); - - auto nCurves = static_cast(fabsf(sweep / MATH_PI2)); - if (fabsf(sweep / MATH_PI2) - nCurves > arcPrecision) ++nCurves; - auto sweepSign = (sweep < 0 ? -1 : 1); - auto fract = fmodf(sweep, MATH_PI2); - fract = (fabsf(fract) < arcPrecision) ? MATH_PI2 * sweepSign : fract; - - //Start from here - Point start = {radius * cosf(startAngle), radius * sinf(startAngle)}; - - if (pie) { - pImpl->moveTo(cx, cy); - pImpl->lineTo(start.x + cx, start.y + cy); - } else { - pImpl->moveTo(start.x + cx, start.y + cy); - } - - for (int i = 0; i < nCurves; ++i) { - auto endAngle = startAngle + ((i != nCurves - 1) ? MATH_PI2 * sweepSign : fract); - Point end = {radius * cosf(endAngle), radius * sinf(endAngle)}; - - //variables needed to calculate bezier control points - - //get bezier control points using article: - //(http://itc.ktu.lt/index.php/ITC/article/view/11812/6479) - auto ax = start.x; - auto ay = start.y; - auto bx = end.x; - auto by = end.y; - auto q1 = ax * ax + ay * ay; - auto q2 = ax * bx + ay * by + q1; - auto k2 = (4.0f/3.0f) * ((sqrtf(2 * q1 * q2) - q2) / (ax * by - ay * bx)); - - start = end; //Next start point is the current end point - - end.x += cx; - end.y += cy; - - Point ctrl1 = {ax - k2 * ay + cx, ay + k2 * ax + cy}; - Point ctrl2 = {bx + k2 * by + cx, by - k2 * bx + cy}; - - pImpl->cubicTo(ctrl1.x, ctrl1.y, ctrl2.x, ctrl2.y, end.x, end.y); - - startAngle = endAngle; - } - - if (pie) pImpl->close(); - - return Result::Success; -} - - -Result Shape::appendRect(float x, float y, float w, float h, float rx, float ry) noexcept -{ - auto halfW = w * 0.5f; - auto halfH = h * 0.5f; - - //clamping cornerRadius by minimum size - if (rx > halfW) rx = halfW; - if (ry > halfH) ry = halfH; - - //rectangle - if (rx == 0 && ry == 0) { - pImpl->grow(5, 4); - pImpl->moveTo(x, y); - pImpl->lineTo(x + w, y); - pImpl->lineTo(x + w, y + h); - pImpl->lineTo(x, y + h); - pImpl->close(); - //rounded rectangle or circle - } else { - auto hrx = rx * PATH_KAPPA; - auto hry = ry * PATH_KAPPA; - pImpl->grow(10, 17); - pImpl->moveTo(x + rx, y); - pImpl->lineTo(x + w - rx, y); - pImpl->cubicTo(x + w - rx + hrx, y, x + w, y + ry - hry, x + w, y + ry); - pImpl->lineTo(x + w, y + h - ry); - pImpl->cubicTo(x + w, y + h - ry + hry, x + w - rx + hrx, y + h, x + w - rx, y + h); - pImpl->lineTo(x + rx, y + h); - pImpl->cubicTo(x + rx - hrx, y + h, x, y + h - ry + hry, x, y + h - ry); - pImpl->lineTo(x, y + ry); - pImpl->cubicTo(x, y + ry - hry, x + rx - hrx, y, x + rx, y); - pImpl->close(); - } - - return Result::Success; -} - - -Result Shape::fill(uint8_t r, uint8_t g, uint8_t b, uint8_t a) noexcept -{ - if (pImpl->rs.fill) { - delete(pImpl->rs.fill); - pImpl->rs.fill = nullptr; - pImpl->flag |= RenderUpdateFlag::Gradient; - } - - if (r == pImpl->rs.color[0] && g == pImpl->rs.color[1] && b == pImpl->rs.color[2] && a == pImpl->rs.color[3]) return Result::Success; - - pImpl->rs.color[0] = r; - pImpl->rs.color[1] = g; - pImpl->rs.color[2] = b; - pImpl->rs.color[3] = a; - pImpl->flag |= RenderUpdateFlag::Color; - - return Result::Success; -} - - -Result Shape::fill(unique_ptr f) noexcept -{ - auto p = f.release(); - if (!p) return Result::MemoryCorruption; - - if (pImpl->rs.fill && pImpl->rs.fill != p) delete(pImpl->rs.fill); - pImpl->rs.fill = p; - pImpl->flag |= RenderUpdateFlag::Gradient; - - return Result::Success; -} - - -Result Shape::fillColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) const noexcept -{ - pImpl->rs.fillColor(r, g, b, a); - - return Result::Success; -} - - -const Fill* Shape::fill() const noexcept -{ - return pImpl->rs.fill; -} - - -Result Shape::order(bool strokeFirst) noexcept -{ - if (!pImpl->strokeFirst(strokeFirst)) return Result::FailedAllocation; - - return Result::Success; -} - - -Result Shape::stroke(float width) noexcept -{ - if (!pImpl->strokeWidth(width)) return Result::FailedAllocation; - - return Result::Success; -} - - -float Shape::strokeWidth() const noexcept -{ - return pImpl->rs.strokeWidth(); -} - - -Result Shape::stroke(uint8_t r, uint8_t g, uint8_t b, uint8_t a) noexcept -{ - if (!pImpl->strokeColor(r, g, b, a)) return Result::FailedAllocation; - - return Result::Success; -} - - -Result Shape::strokeColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) const noexcept -{ - if (!pImpl->rs.strokeColor(r, g, b, a)) return Result::InsufficientCondition; - - return Result::Success; -} - - -Result Shape::stroke(unique_ptr f) noexcept -{ - return pImpl->strokeFill(std::move(f)); -} - - -const Fill* Shape::strokeFill() const noexcept -{ - return pImpl->rs.strokeFill(); -} - - -Result Shape::stroke(const float* dashPattern, uint32_t cnt) noexcept -{ - return pImpl->strokeDash(dashPattern, cnt, 0); -} - - -uint32_t Shape::strokeDash(const float** dashPattern) const noexcept -{ - return pImpl->rs.strokeDash(dashPattern, nullptr); -} - - -Result Shape::stroke(StrokeCap cap) noexcept -{ - if (!pImpl->strokeCap(cap)) return Result::FailedAllocation; - - return Result::Success; -} - - -Result Shape::stroke(StrokeJoin join) noexcept -{ - if (!pImpl->strokeJoin(join)) return Result::FailedAllocation; - - return Result::Success; -} - -Result Shape::strokeMiterlimit(float miterlimit) noexcept -{ - // https://www.w3.org/TR/SVG2/painting.html#LineJoin - // - A negative value for stroke-miterlimit must be treated as an illegal value. - if (miterlimit < 0.0f) return Result::NonSupport; - // TODO Find out a reasonable max value. - if (!pImpl->strokeMiterlimit(miterlimit)) return Result::FailedAllocation; - - return Result::Success; -} - - -StrokeCap Shape::strokeCap() const noexcept -{ - return pImpl->rs.strokeCap(); -} - - -StrokeJoin Shape::strokeJoin() const noexcept -{ - return pImpl->rs.strokeJoin(); -} - -float Shape::strokeMiterlimit() const noexcept -{ - return pImpl->rs.strokeMiterlimit(); -} - - -Result Shape::fill(FillRule r) noexcept -{ - pImpl->rs.rule = r; - - return Result::Success; -} - - -FillRule Shape::fillRule() const noexcept -{ - return pImpl->rs.rule; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgShape.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgShape.h deleted file mode 100644 index bb5e6f3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgShape.h +++ /dev/null @@ -1,407 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_SHAPE_H_ -#define _TVG_SHAPE_H_ - -#include -#include "tvgMath.h" -#include "tvgPaint.h" - - -struct Shape::Impl -{ - RenderShape rs; //shape data - RenderData rd = nullptr; //engine data - Shape* shape; - uint8_t flag = RenderUpdateFlag::None; - uint8_t opacity; //for composition - bool needComp = false; //composite or not - - Impl(Shape* s) : shape(s) - { - } - - ~Impl() - { - if (auto renderer = PP(shape)->renderer) { - renderer->dispose(rd); - } - } - - bool render(RenderMethod* renderer) - { - Compositor* cmp = nullptr; - bool ret; - - if (needComp) { - cmp = renderer->target(bounds(renderer), renderer->colorSpace()); - renderer->beginComposite(cmp, CompositeMethod::None, opacity); - } - ret = renderer->renderShape(rd); - if (cmp) renderer->endComposite(cmp); - return ret; - } - - bool needComposition(uint8_t opacity) - { - if (opacity == 0) return false; - - //Shape composition is only necessary when stroking & fill are valid. - if (!rs.stroke || rs.stroke->width < FLOAT_EPSILON || (!rs.stroke->fill && rs.stroke->color[3] == 0)) return false; - if (!rs.fill && rs.color[3] == 0) return false; - - //translucent fill & stroke - if (opacity < 255) return true; - - //Composition test - const Paint* target; - auto method = shape->composite(&target); - if (!target || method == CompositeMethod::ClipPath) return false; - if (target->pImpl->opacity == 255 || target->pImpl->opacity == 0) { - if (target->identifier() == TVG_CLASS_ID_SHAPE) { - auto shape = static_cast(target); - if (!shape->fill()) { - uint8_t r, g, b, a; - shape->fillColor(&r, &g, &b, &a); - if (a == 0 || a == 255) { - if (method == CompositeMethod::LumaMask || method == CompositeMethod::InvLumaMask) { - if ((r == 255 && g == 255 && b == 255) || (r == 0 && g == 0 && b == 0)) return false; - } else return false; - } - } - } - } - - return true; - } - - RenderData update(RenderMethod* renderer, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) - { - if ((needComp = needComposition(opacity))) { - /* Overriding opacity value. If this scene is half-translucent, - It must do intermediate composition with that opacity value. */ - this->opacity = opacity; - opacity = 255; - } - - rd = renderer->prepare(rs, rd, transform, clips, opacity, static_cast(pFlag | flag), clipper); - flag = RenderUpdateFlag::None; - return rd; - } - - RenderRegion bounds(RenderMethod* renderer) - { - return renderer->region(rd); - } - - bool bounds(float* x, float* y, float* w, float* h, bool stroking) - { - //Path bounding size - if (rs.path.pts.count > 0 ) { - auto pts = rs.path.pts.begin(); - Point min = { pts->x, pts->y }; - Point max = { pts->x, pts->y }; - - for (auto pts2 = pts + 1; pts2 < rs.path.pts.end(); ++pts2) { - if (pts2->x < min.x) min.x = pts2->x; - if (pts2->y < min.y) min.y = pts2->y; - if (pts2->x > max.x) max.x = pts2->x; - if (pts2->y > max.y) max.y = pts2->y; - } - - if (x) *x = min.x; - if (y) *y = min.y; - if (w) *w = max.x - min.x; - if (h) *h = max.y - min.y; - } - - //Stroke feathering - if (stroking && rs.stroke) { - if (x) *x -= rs.stroke->width * 0.5f; - if (y) *y -= rs.stroke->width * 0.5f; - if (w) *w += rs.stroke->width; - if (h) *h += rs.stroke->width; - } - return rs.path.pts.count > 0 ? true : false; - } - - void reserveCmd(uint32_t cmdCnt) - { - rs.path.cmds.reserve(cmdCnt); - } - - void reservePts(uint32_t ptsCnt) - { - rs.path.pts.reserve(ptsCnt); - } - - void grow(uint32_t cmdCnt, uint32_t ptsCnt) - { - rs.path.cmds.grow(cmdCnt); - rs.path.pts.grow(ptsCnt); - } - - void append(const PathCommand* cmds, uint32_t cmdCnt, const Point* pts, uint32_t ptsCnt) - { - memcpy(rs.path.cmds.end(), cmds, sizeof(PathCommand) * cmdCnt); - memcpy(rs.path.pts.end(), pts, sizeof(Point) * ptsCnt); - rs.path.cmds.count += cmdCnt; - rs.path.pts.count += ptsCnt; - - flag |= RenderUpdateFlag::Path; - } - - void moveTo(float x, float y) - { - rs.path.cmds.push(PathCommand::MoveTo); - rs.path.pts.push({x, y}); - - flag |= RenderUpdateFlag::Path; - } - - void lineTo(float x, float y) - { - rs.path.cmds.push(PathCommand::LineTo); - rs.path.pts.push({x, y}); - - flag |= RenderUpdateFlag::Path; - } - - void cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float y) - { - rs.path.cmds.push(PathCommand::CubicTo); - rs.path.pts.push({cx1, cy1}); - rs.path.pts.push({cx2, cy2}); - rs.path.pts.push({x, y}); - - flag |= RenderUpdateFlag::Path; - } - - void close() - { - //Don't close multiple times. - if (rs.path.cmds.count > 0 && rs.path.cmds.last() == PathCommand::Close) return; - - rs.path.cmds.push(PathCommand::Close); - - flag |= RenderUpdateFlag::Path; - } - - bool strokeWidth(float width) - { - if (!rs.stroke) rs.stroke = new RenderStroke(); - rs.stroke->width = width; - flag |= RenderUpdateFlag::Stroke; - - return true; - } - - bool strokeTrim(float begin, float end, bool individual) - { - if (!rs.stroke) { - if (begin == 0.0f && end == 1.0f) return true; - rs.stroke = new RenderStroke(); - } - - if (mathEqual(rs.stroke->trim.begin, begin) && mathEqual(rs.stroke->trim.end, end)) return true; - - rs.stroke->trim.begin = begin; - rs.stroke->trim.end = end; - rs.stroke->trim.individual = individual; - flag |= RenderUpdateFlag::Stroke; - - return true; - } - - bool strokeCap(StrokeCap cap) - { - if (!rs.stroke) rs.stroke = new RenderStroke(); - rs.stroke->cap = cap; - flag |= RenderUpdateFlag::Stroke; - - return true; - } - - bool strokeJoin(StrokeJoin join) - { - if (!rs.stroke) rs.stroke = new RenderStroke(); - rs.stroke->join = join; - flag |= RenderUpdateFlag::Stroke; - - return true; - } - - bool strokeMiterlimit(float miterlimit) - { - if (!rs.stroke) rs.stroke = new RenderStroke(); - rs.stroke->miterlimit = miterlimit; - flag |= RenderUpdateFlag::Stroke; - - return true; - } - - bool strokeColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a) - { - if (!rs.stroke) rs.stroke = new RenderStroke(); - if (rs.stroke->fill) { - delete(rs.stroke->fill); - rs.stroke->fill = nullptr; - flag |= RenderUpdateFlag::GradientStroke; - } - - rs.stroke->color[0] = r; - rs.stroke->color[1] = g; - rs.stroke->color[2] = b; - rs.stroke->color[3] = a; - - flag |= RenderUpdateFlag::Stroke; - - return true; - } - - Result strokeFill(unique_ptr f) - { - auto p = f.release(); - if (!p) return Result::MemoryCorruption; - - if (!rs.stroke) rs.stroke = new RenderStroke(); - if (rs.stroke->fill && rs.stroke->fill != p) delete(rs.stroke->fill); - rs.stroke->fill = p; - - flag |= RenderUpdateFlag::Stroke; - flag |= RenderUpdateFlag::GradientStroke; - - return Result::Success; - } - - Result strokeDash(const float* pattern, uint32_t cnt, float offset) - { - if ((cnt == 1) || (!pattern && cnt > 0) || (pattern && cnt == 0)) { - return Result::InvalidArguments; - } - - for (uint32_t i = 0; i < cnt; i++) { - if (pattern[i] < FLOAT_EPSILON) return Result::InvalidArguments; - } - - //Reset dash - if (!pattern && cnt == 0) { - free(rs.stroke->dashPattern); - rs.stroke->dashPattern = nullptr; - } else { - if (!rs.stroke) rs.stroke = new RenderStroke(); - if (rs.stroke->dashCnt != cnt) { - free(rs.stroke->dashPattern); - rs.stroke->dashPattern = nullptr; - } - if (!rs.stroke->dashPattern) { - rs.stroke->dashPattern = static_cast(malloc(sizeof(float) * cnt)); - if (!rs.stroke->dashPattern) return Result::FailedAllocation; - } - for (uint32_t i = 0; i < cnt; ++i) { - rs.stroke->dashPattern[i] = pattern[i]; - } - } - rs.stroke->dashCnt = cnt; - rs.stroke->dashOffset = offset; - flag |= RenderUpdateFlag::Stroke; - - return Result::Success; - } - - bool strokeFirst() - { - if (!rs.stroke) return true; - return rs.stroke->strokeFirst; - } - - bool strokeFirst(bool strokeFirst) - { - if (!rs.stroke) rs.stroke = new RenderStroke(); - rs.stroke->strokeFirst = strokeFirst; - flag |= RenderUpdateFlag::Stroke; - - return true; - } - - void update(RenderUpdateFlag flag) - { - this->flag |= flag; - } - - Paint* duplicate() - { - auto ret = Shape::gen().release(); - auto dup = ret->pImpl; - - dup->rs.rule = rs.rule; - - //Color - memcpy(dup->rs.color, rs.color, sizeof(rs.color)); - dup->flag = RenderUpdateFlag::Color; - - //Path - if (rs.path.cmds.count > 0 && rs.path.pts.count > 0) { - dup->rs.path.cmds = rs.path.cmds; - dup->rs.path.pts = rs.path.pts; - dup->flag |= RenderUpdateFlag::Path; - } - - //Stroke - if (rs.stroke) { - dup->rs.stroke = new RenderStroke(); - *dup->rs.stroke = *rs.stroke; - memcpy(dup->rs.stroke->color, rs.stroke->color, sizeof(rs.stroke->color)); - if (rs.stroke->dashCnt > 0) { - dup->rs.stroke->dashPattern = static_cast(malloc(sizeof(float) * rs.stroke->dashCnt)); - memcpy(dup->rs.stroke->dashPattern, rs.stroke->dashPattern, sizeof(float) * rs.stroke->dashCnt); - } - if (rs.stroke->fill) { - dup->rs.stroke->fill = rs.stroke->fill->duplicate(); - dup->flag |= RenderUpdateFlag::GradientStroke; - } - dup->flag |= RenderUpdateFlag::Stroke; - } - - //Fill - if (rs.fill) { - dup->rs.fill = rs.fill->duplicate(); - dup->flag |= RenderUpdateFlag::Gradient; - } - - return ret; - } - - Iterator* iterator() - { - return nullptr; - } -}; - -#endif //_TVG_SHAPE_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgStr.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgStr.cpp deleted file mode 100644 index 1838e75..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgStr.cpp +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "config.h" -#include -#include -#include -#include "tvgMath.h" -#include "tvgStr.h" - - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static inline bool _floatExact(float a, float b) -{ - return memcmp(&a, &b, sizeof(float)) == 0; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -namespace tvg { - -/* - * https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strtof-strtof-l-wcstof-wcstof-l?view=msvc-160 - * - * src should be one of the following form : - * - * [whitespace] [sign] {digits [radix digits] | radix digits} [{e | E} [sign] digits] - * [whitespace] [sign] {INF | INFINITY} - * [whitespace] [sign] NAN [sequence] - * - * No hexadecimal form supported - * no sequence supported after NAN - */ -float strToFloat(const char *nPtr, char **endPtr) -{ - if (endPtr) *endPtr = (char *) (nPtr); - if (!nPtr) return 0.0f; - - auto a = nPtr; - auto iter = nPtr; - auto val = 0.0f; - unsigned long long integerPart = 0; - int minus = 1; - - //ignore leading whitespaces - while (isspace(*iter)) iter++; - - //signed or not - if (*iter == '-') { - minus = -1; - iter++; - } else if (*iter == '+') { - iter++; - } - - if (tolower(*iter) == 'i') { - if ((tolower(*(iter + 1)) == 'n') && (tolower(*(iter + 2)) == 'f')) iter += 3; - else goto error; - - if (tolower(*(iter)) == 'i') { - if ((tolower(*(iter + 1)) == 'n') && (tolower(*(iter + 2)) == 'i') && (tolower(*(iter + 3)) == 't') && - (tolower(*(iter + 4)) == 'y')) - iter += 5; - else goto error; - } - if (endPtr) *endPtr = (char *) (iter); - return (minus == -1) ? -INFINITY : INFINITY; - } - - if (tolower(*iter) == 'n') { - if ((tolower(*(iter + 1)) == 'a') && (tolower(*(iter + 2)) == 'n')) iter += 3; - else goto error; - - if (endPtr) *endPtr = (char *) (iter); - return (minus == -1) ? -NAN : NAN; - } - - //Optional: integer part before dot - if (isdigit(*iter)) { - for (; isdigit(*iter); iter++) { - integerPart = integerPart * 10ULL + (unsigned long long) (*iter - '0'); - } - a = iter; - } else if (*iter != '.') { - goto success; - } - - val = static_cast(integerPart); - - //Optional: decimal part after dot - if (*iter == '.') { - unsigned long long decimalPart = 0; - unsigned long long pow10 = 1; - int count = 0; - - iter++; - - if (isdigit(*iter)) { - for (; isdigit(*iter); iter++, count++) { - if (count < 19) { - decimalPart = decimalPart * 10ULL + +static_cast(*iter - '0'); - pow10 *= 10ULL; - } - } - } else if (isspace(*iter)) { //skip if there is a space after the dot. - a = iter; - goto success; - } - - val += static_cast(decimalPart) / static_cast(pow10); - a = iter; - } - - //Optional: exponent - if (*iter == 'e' || *iter == 'E') { - ++iter; - - //Exception: svg may have 'em' unit for fonts. ex) 5em, 10.5em - if ((*iter == 'm') || (*iter == 'M')) { - //TODO: We don't support font em unit now, but has to multiply val * font size later... - a = iter + 1; - goto success; - } - - //signed or not - int minus_e = 1; - - if (*iter == '-') { - minus_e = -1; - ++iter; - } else if (*iter == '+') { - iter++; - } - - unsigned int exponentPart = 0; - - if (isdigit(*iter)) { - while (*iter == '0') iter++; - for (; isdigit(*iter); iter++) { - exponentPart = exponentPart * 10U + static_cast(*iter - '0'); - } - } else if (!isdigit(*(a - 1))) { - a = nPtr; - goto success; - } else if (*iter == 0) { - goto success; - } - - //if ((_floatExact(val, 2.2250738585072011f)) && ((minus_e * static_cast(exponentPart)) <= -308)) { - if ((_floatExact(val, 1.175494351f)) && ((minus_e * static_cast(exponentPart)) <= -38)) { - //val *= 1.0e-308f; - val *= 1.0e-38f; - a = iter; - goto success; - } - - a = iter; - auto scale = 1.0f; - - while (exponentPart >= 8U) { - scale *= 1E8f; - exponentPart -= 8U; - } - while (exponentPart > 0U) { - scale *= 10.0f; - exponentPart--; - } - val = (minus_e == -1) ? (val / scale) : (val * scale); - } else if ((iter > nPtr) && !isdigit(*(iter - 1))) { - a = nPtr; - goto success; - } - -success: - if (endPtr) *endPtr = (char *)(a); - if (!std::isfinite(val)) return 0.0f; - - return minus * val; - -error: - if (endPtr) *endPtr = (char *)(nPtr); - return 0.0f; -} - - -int str2int(const char* str, size_t n) -{ - int ret = 0; - for(size_t i = 0; i < n; ++i) { - ret = ret * 10 + (str[i] - '0'); - } - return ret; -} - -char* strDuplicate(const char *str, size_t n) -{ - auto len = strlen(str); - if (len < n) n = len; - - auto ret = (char *) malloc(n + 1); - if (!ret) return nullptr; - ret[n] = '\0'; - - return (char *) memcpy(ret, str, n); -} - -char* strDirname(const char* path) -{ - const char *ptr = strrchr(path, '/'); -#ifdef _WIN32 - if (ptr) ptr = strrchr(ptr + 1, '\\'); -#endif - int len = int(ptr + 1 - path); // +1 to include '/' - return strDuplicate(path, len); -} - -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgStr.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgStr.h deleted file mode 100644 index 154a199..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgStr.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_STR_H_ -#define _TVG_STR_H_ - -#include - -namespace tvg -{ - -float strToFloat(const char *nPtr, char **endPtr); //convert to float -int str2int(const char* str, size_t n); //convert to integer -char* strDuplicate(const char *str, size_t n); //copy the string -char* strDirname(const char* path); //return the full directory name - -} -#endif //_TVG_STR_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgCssStyle.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgCssStyle.cpp deleted file mode 100644 index 11274e3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgCssStyle.cpp +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (c) 2022 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgSvgCssStyle.h" - -#include - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static bool _isImportanceApplicable(SvgStyleFlags &toFlagsImportance, SvgStyleFlags fromFlagsImportance, SvgStyleFlags flag) -{ - if (!(toFlagsImportance & flag) && (fromFlagsImportance & flag)) { - return true; - } - return false; -} - -static void _copyStyle(SvgStyleProperty* to, const SvgStyleProperty* from) -{ - if (from == nullptr) return; - //Copy the properties of 'from' only if they were explicitly set (not the default ones). - if ((from->curColorSet && !(to->flags & SvgStyleFlags::Color)) || - _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::Color)) { - to->color = from->color; - to->curColorSet = true; - to->flags = (to->flags | SvgStyleFlags::Color); - if (from->flagsImportance & SvgStyleFlags::Color) { - to->flagsImportance = (to->flagsImportance | SvgStyleFlags::Color); - } - } - if (((from->flags & SvgStyleFlags::PaintOrder) && !(to->flags & SvgStyleFlags::PaintOrder)) || - _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::PaintOrder)) { - to->paintOrder = from->paintOrder; - to->flags = (to->flags | SvgStyleFlags::PaintOrder); - if (from->flagsImportance & SvgStyleFlags::PaintOrder) { - to->flagsImportance = (to->flagsImportance | SvgStyleFlags::PaintOrder); - } - } - if (((from->flags & SvgStyleFlags::Display) && !(to->flags & SvgStyleFlags::Display)) || - _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::Display)) { - to->display = from->display; - to->flags = (to->flags | SvgStyleFlags::Display); - if (from->flagsImportance & SvgStyleFlags::Display) { - to->flagsImportance = (to->flagsImportance | SvgStyleFlags::Display); - } - } - //Fill - if (((from->fill.flags & SvgFillFlags::Paint) && !(to->flags & SvgStyleFlags::Fill)) || - _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::Fill)) { - to->fill.paint.color = from->fill.paint.color; - to->fill.paint.none = from->fill.paint.none; - to->fill.paint.curColor = from->fill.paint.curColor; - if (from->fill.paint.url) { - if (to->fill.paint.url) free(to->fill.paint.url); - to->fill.paint.url = strdup(from->fill.paint.url); - } - to->fill.flags = (to->fill.flags | SvgFillFlags::Paint); - to->flags = (to->flags | SvgStyleFlags::Fill); - if (from->flagsImportance & SvgStyleFlags::Fill) { - to->flagsImportance = (to->flagsImportance | SvgStyleFlags::Fill); - } - } - if (((from->fill.flags & SvgFillFlags::Opacity) && !(to->flags & SvgStyleFlags::FillOpacity)) || - _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::FillOpacity)) { - to->fill.opacity = from->fill.opacity; - to->fill.flags = (to->fill.flags | SvgFillFlags::Opacity); - to->flags = (to->flags | SvgStyleFlags::FillOpacity); - if (from->flagsImportance & SvgStyleFlags::FillOpacity) { - to->flagsImportance = (to->flagsImportance | SvgStyleFlags::FillOpacity); - } - } - if (((from->fill.flags & SvgFillFlags::FillRule) && !(to->flags & SvgStyleFlags::FillRule)) || - _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::FillRule)) { - to->fill.fillRule = from->fill.fillRule; - to->fill.flags = (to->fill.flags | SvgFillFlags::FillRule); - to->flags = (to->flags | SvgStyleFlags::FillRule); - if (from->flagsImportance & SvgStyleFlags::FillRule) { - to->flagsImportance = (to->flagsImportance | SvgStyleFlags::FillRule); - } - } - //Stroke - if (((from->stroke.flags & SvgStrokeFlags::Paint) && !(to->flags & SvgStyleFlags::Stroke)) || - _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::Stroke)) { - to->stroke.paint.color = from->stroke.paint.color; - to->stroke.paint.none = from->stroke.paint.none; - to->stroke.paint.curColor = from->stroke.paint.curColor; - if (from->stroke.paint.url) { - if (to->stroke.paint.url) free(to->stroke.paint.url); - to->stroke.paint.url = strdup(from->stroke.paint.url); - } - to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Paint); - to->flags = (to->flags | SvgStyleFlags::Stroke); - if (from->flagsImportance & SvgStyleFlags::Stroke) { - to->flagsImportance = (to->flagsImportance | SvgStyleFlags::Stroke); - } - } - if (((from->stroke.flags & SvgStrokeFlags::Opacity) && !(to->flags & SvgStyleFlags::StrokeOpacity)) || - _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::StrokeOpacity)) { - to->stroke.opacity = from->stroke.opacity; - to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Opacity); - to->flags = (to->flags | SvgStyleFlags::StrokeOpacity); - if (from->flagsImportance & SvgStyleFlags::StrokeOpacity) { - to->flagsImportance = (to->flagsImportance | SvgStyleFlags::StrokeOpacity); - } - } - if (((from->stroke.flags & SvgStrokeFlags::Width) && !(to->flags & SvgStyleFlags::StrokeWidth)) || - _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::StrokeWidth)) { - to->stroke.width = from->stroke.width; - to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Width); - to->flags = (to->flags | SvgStyleFlags::StrokeWidth); - if (from->flagsImportance & SvgStyleFlags::StrokeWidth) { - to->flagsImportance = (to->flagsImportance | SvgStyleFlags::StrokeWidth); - } - } - if (((from->stroke.flags & SvgStrokeFlags::Dash) && !(to->flags & SvgStyleFlags::StrokeDashArray)) || - _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::StrokeDashArray)) { - if (from->stroke.dash.array.count > 0) { - to->stroke.dash.array.clear(); - to->stroke.dash.array.reserve(from->stroke.dash.array.count); - for (uint32_t i = 0; i < from->stroke.dash.array.count; ++i) { - to->stroke.dash.array.push(from->stroke.dash.array[i]); - } - to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Dash); - to->flags = (to->flags | SvgStyleFlags::StrokeDashArray); - if (from->flagsImportance & SvgStyleFlags::StrokeDashArray) { - to->flagsImportance = (to->flagsImportance | SvgStyleFlags::StrokeDashArray); - } - } - } - if (((from->stroke.flags & SvgStrokeFlags::Cap) && !(to->flags & SvgStyleFlags::StrokeLineCap)) || - _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::StrokeLineCap)) { - to->stroke.cap = from->stroke.cap; - to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Cap); - to->flags = (to->flags | SvgStyleFlags::StrokeLineCap); - if (from->flagsImportance & SvgStyleFlags::StrokeLineCap) { - to->flagsImportance = (to->flagsImportance | SvgStyleFlags::StrokeLineCap); - } - } - if (((from->stroke.flags & SvgStrokeFlags::Join) && !(to->flags & SvgStyleFlags::StrokeLineJoin)) || - _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::StrokeLineJoin)) { - to->stroke.join = from->stroke.join; - to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Join); - to->flags = (to->flags | SvgStyleFlags::StrokeLineJoin); - if (from->flagsImportance & SvgStyleFlags::StrokeLineJoin) { - to->flagsImportance = (to->flagsImportance | SvgStyleFlags::StrokeLineJoin); - } - } - //Opacity - //TODO: it can be set to be 255 and shouldn't be changed by attribute 'opacity' - if ((from->opacity < 255 && !(to->flags & SvgStyleFlags::Opacity)) || - _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::Opacity)) { - to->opacity = from->opacity; - to->flags = (to->flags | SvgStyleFlags::Opacity); - if (from->flagsImportance & SvgStyleFlags::Opacity) { - to->flagsImportance = (to->flagsImportance | SvgStyleFlags::Opacity); - } - } -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -void cssCopyStyleAttr(SvgNode* to, const SvgNode* from) -{ - //Copy matrix attribute - if (from->transform && !(to->style->flags & SvgStyleFlags::Transform)) { - to->transform = (Matrix*)malloc(sizeof(Matrix)); - if (to->transform) { - *to->transform = *from->transform; - to->style->flags = (to->style->flags | SvgStyleFlags::Transform); - } - } - //Copy style attribute - _copyStyle(to->style, from->style); - - if (from->style->clipPath.url) { - if (to->style->clipPath.url) free(to->style->clipPath.url); - to->style->clipPath.url = strdup(from->style->clipPath.url); - } - if (from->style->mask.url) { - if (to->style->mask.url) free(to->style->mask.url); - to->style->mask.url = strdup(from->style->mask.url); - } -} - - -SvgNode* cssFindStyleNode(const SvgNode* style, const char* title, SvgNodeType type) -{ - if (!style) return nullptr; - - auto child = style->child.data; - for (uint32_t i = 0; i < style->child.count; ++i, ++child) { - if ((*child)->type == type) { - if ((!title && !(*child)->id) || (title && (*child)->id && !strcmp((*child)->id, title))) return (*child); - } - } - return nullptr; -} - - -SvgNode* cssFindStyleNode(const SvgNode* style, const char* title) -{ - if (!style || !title) return nullptr; - - auto child = style->child.data; - for (uint32_t i = 0; i < style->child.count; ++i, ++child) { - if ((*child)->type == SvgNodeType::CssStyle) { - if ((*child)->id && !strcmp((*child)->id, title)) return (*child); - } - } - return nullptr; -} - - -void cssUpdateStyle(SvgNode* doc, SvgNode* style) -{ - if (doc->child.count > 0) { - auto child = doc->child.data; - for (uint32_t i = 0; i < doc->child.count; ++i, ++child) { - if (auto cssNode = cssFindStyleNode(style, nullptr, (*child)->type)) { - cssCopyStyleAttr(*child, cssNode); - } - cssUpdateStyle(*child, style); - } - } -} - - -void cssApplyStyleToPostponeds(Array& postponeds, SvgNode* style) -{ - for (uint32_t i = 0; i < postponeds.count; ++i) { - auto nodeIdPair = postponeds[i]; - - //css styling: tag.name has higher priority than .name - if (auto cssNode = cssFindStyleNode(style, nodeIdPair.id, nodeIdPair.node->type)) { - cssCopyStyleAttr(nodeIdPair.node, cssNode); - } - if (auto cssNode = cssFindStyleNode(style, nodeIdPair.id)) { - cssCopyStyleAttr(nodeIdPair.node, cssNode); - } - } -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgCssStyle.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgCssStyle.h deleted file mode 100644 index 24812b3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgCssStyle.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2022 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_SVG_CSS_STYLE_H_ -#define _TVG_SVG_CSS_STYLE_H_ - -#include "tvgSvgLoaderCommon.h" - -void cssCopyStyleAttr(SvgNode* to, const SvgNode* from); -SvgNode* cssFindStyleNode(const SvgNode* style, const char* title, SvgNodeType type); -SvgNode* cssFindStyleNode(const SvgNode* style, const char* title); -void cssUpdateStyle(SvgNode* doc, SvgNode* style); -void cssApplyStyleToPostponeds(Array& postponeds, SvgNode* style); - -#endif //_TVG_SVG_CSS_STYLE_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgLoader.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgLoader.cpp deleted file mode 100644 index 34ca2c5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgLoader.cpp +++ /dev/null @@ -1,3917 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -/* - * Copyright notice for the EFL: - - * Copyright (C) EFL developers (see AUTHORS) - - * 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. - - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (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 "tvgLoader.h" -#include "tvgXmlParser.h" -#include "tvgSvgLoader.h" -#include "tvgSvgSceneBuilder.h" -#include "tvgStr.h" -#include "tvgSvgCssStyle.h" -#include "tvgMath.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -/* - * According to: https://www.w3.org/TR/SVG2/coords.html#Units - * and: https://www.w3.org/TR/css-values-4/#absolute-lengths - */ -#define PX_PER_IN 96 //1 in = 96 px -#define PX_PER_PC 16 //1 pc = 1/6 in -> PX_PER_IN/6 -#define PX_PER_PT 1.333333f //1 pt = 1/72 in -> PX_PER_IN/72 -#define PX_PER_MM 3.779528f //1 in = 25.4 mm -> PX_PER_IN/25.4 -#define PX_PER_CM 37.79528f //1 in = 2.54 cm -> PX_PER_IN/2.54 - -typedef bool (*parseAttributes)(const char* buf, unsigned bufLength, simpleXMLAttributeCb func, const void* data); -typedef SvgNode* (*FactoryMethod)(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func); -typedef SvgStyleGradient* (*GradientFactoryMethod)(SvgLoaderData* loader, const char* buf, unsigned bufLength); - -static char* _skipSpace(const char* str, const char* end) -{ - while (((end && str < end) || (!end && *str != '\0')) && isspace(*str)) { - ++str; - } - return (char*) str; -} - - -static char* _copyId(const char* str) -{ - if (!str) return nullptr; - if (strlen(str) == 0) return nullptr; - - return strdup(str); -} - - -static const char* _skipComma(const char* content) -{ - content = _skipSpace(content, nullptr); - if (*content == ',') return content + 1; - return content; -} - - -static bool _parseNumber(const char** content, const char** end, float* number) -{ - const char* _end = end ? *end : nullptr; - - *number = strToFloat(*content, (char**)&_end); - //If the start of string is not number - if ((*content) == _end) { - if (end) *end = _end; - return false; - } - //Skip comma if any - *content = _skipComma(_end); - if (end) *end = _end; - - return true; -} - - -static constexpr struct -{ - AspectRatioAlign align; - const char* tag; -} alignTags[] = { - { AspectRatioAlign::XMinYMin, "xMinYMin" }, - { AspectRatioAlign::XMidYMin, "xMidYMin" }, - { AspectRatioAlign::XMaxYMin, "xMaxYMin" }, - { AspectRatioAlign::XMinYMid, "xMinYMid" }, - { AspectRatioAlign::XMidYMid, "xMidYMid" }, - { AspectRatioAlign::XMaxYMid, "xMaxYMid" }, - { AspectRatioAlign::XMinYMax, "xMinYMax" }, - { AspectRatioAlign::XMidYMax, "xMidYMax" }, - { AspectRatioAlign::XMaxYMax, "xMaxYMax" }, -}; - - -static void _parseAspectRatio(const char** content, AspectRatioAlign* align, AspectRatioMeetOrSlice* meetOrSlice) -{ - if (!strcmp(*content, "none")) { - *align = AspectRatioAlign::None; - return; - } - - for (unsigned int i = 0; i < sizeof(alignTags) / sizeof(alignTags[0]); i++) { - if (!strncmp(*content, alignTags[i].tag, 8)) { - *align = alignTags[i].align; - *content += 8; - *content = _skipSpace(*content, nullptr); - break; - } - } - - if (!strcmp(*content, "meet")) { - *meetOrSlice = AspectRatioMeetOrSlice::Meet; - } else if (!strcmp(*content, "slice")) { - *meetOrSlice = AspectRatioMeetOrSlice::Slice; - } -} - - -/** - * According to https://www.w3.org/TR/SVG/coords.html#Units - */ -static float _toFloat(const SvgParser* svgParse, const char* str, SvgParserLengthType type) -{ - float parsedValue = strToFloat(str, nullptr); - - if (strstr(str, "cm")) parsedValue *= PX_PER_CM; - else if (strstr(str, "mm")) parsedValue *= PX_PER_MM; - else if (strstr(str, "pt")) parsedValue *= PX_PER_PT; - else if (strstr(str, "pc")) parsedValue *= PX_PER_PC; - else if (strstr(str, "in")) parsedValue *= PX_PER_IN; - else if (strstr(str, "%")) { - if (type == SvgParserLengthType::Vertical) parsedValue = (parsedValue / 100.0f) * svgParse->global.h; - else if (type == SvgParserLengthType::Horizontal) parsedValue = (parsedValue / 100.0f) * svgParse->global.w; - else //if other then it's radius - { - float max = svgParse->global.w; - if (max < svgParse->global.h) - max = svgParse->global.h; - parsedValue = (parsedValue / 100.0f) * max; - } - } - //TODO: Implement 'em', 'ex' attributes - - return parsedValue; -} - - -static float _gradientToFloat(const SvgParser* svgParse, const char* str, bool& isPercentage) -{ - char* end = nullptr; - - float parsedValue = strToFloat(str, &end); - isPercentage = false; - - if (strstr(str, "%")) { - parsedValue = parsedValue / 100.0f; - isPercentage = true; - } - else if (strstr(str, "cm")) parsedValue *= PX_PER_CM; - else if (strstr(str, "mm")) parsedValue *= PX_PER_MM; - else if (strstr(str, "pt")) parsedValue *= PX_PER_PT; - else if (strstr(str, "pc")) parsedValue *= PX_PER_PC; - else if (strstr(str, "in")) parsedValue *= PX_PER_IN; - //TODO: Implement 'em', 'ex' attributes - - return parsedValue; -} - - -static float _toOffset(const char* str) -{ - char* end = nullptr; - auto strEnd = str + strlen(str); - - float parsedValue = strToFloat(str, &end); - - end = _skipSpace(end, nullptr); - auto ptr = strstr(str, "%"); - - if (ptr) { - parsedValue = parsedValue / 100.0f; - if (end != ptr || (end + 1) != strEnd) return 0; - } else if (end != strEnd) return 0; - - return parsedValue; -} - - -static int _toOpacity(const char* str) -{ - char* end = nullptr; - float opacity = strToFloat(str, &end); - - if (end) { - if (end[0] == '%' && end[1] == '\0') return lrint(opacity * 2.55f); - else if (*end == '\0') return lrint(opacity * 255); - } - return 255; -} - - -static SvgMaskType _toMaskType(const char* str) -{ - if (!strcmp(str, "Alpha")) return SvgMaskType::Alpha; - - return SvgMaskType::Luminance; -} - - -//The default rendering order: fill, stroke, markers -//If any is omitted, will be rendered in its default order after the specified ones. -static bool _toPaintOrder(const char* str) -{ - uint8_t position = 1; - uint8_t strokePosition = 0; - uint8_t fillPosition = 0; - - while (*str != '\0') { - str = _skipSpace(str, nullptr); - if (!strncmp(str, "fill", 4)) { - fillPosition = position++; - str += 4; - } else if (!strncmp(str, "stroke", 6)) { - strokePosition = position++; - str += 6; - } else if (!strncmp(str, "markers", 7)) { - str += 7; - } else { - return _toPaintOrder("fill stroke"); - } - } - - if (fillPosition == 0) fillPosition = position++; - if (strokePosition == 0) strokePosition = position++; - - return fillPosition < strokePosition; -} - - -#define _PARSE_TAG(Type, Name, Name1, Tags_Array, Default) \ - static Type _to##Name1(const char* str) \ - { \ - unsigned int i; \ - \ - for (i = 0; i < sizeof(Tags_Array) / sizeof(Tags_Array[0]); i++) { \ - if (!strcmp(str, Tags_Array[i].tag)) return Tags_Array[i].Name; \ - } \ - return Default; \ - } - - -/* parse the line cap used during stroking a path. - * Value: butt | round | square | inherit - * Initial: butt - * https://www.w3.org/TR/SVG/painting.html - */ -static constexpr struct -{ - StrokeCap lineCap; - const char* tag; -} lineCapTags[] = { - { StrokeCap::Butt, "butt" }, - { StrokeCap::Round, "round" }, - { StrokeCap::Square, "square" } -}; - - -_PARSE_TAG(StrokeCap, lineCap, LineCap, lineCapTags, StrokeCap::Butt) - - -/* parse the line join used during stroking a path. - * Value: miter | round | bevel | inherit - * Initial: miter - * https://www.w3.org/TR/SVG/painting.html - */ -static constexpr struct -{ - StrokeJoin lineJoin; - const char* tag; -} lineJoinTags[] = { - { StrokeJoin::Miter, "miter" }, - { StrokeJoin::Round, "round" }, - { StrokeJoin::Bevel, "bevel" } -}; - - -_PARSE_TAG(StrokeJoin, lineJoin, LineJoin, lineJoinTags, StrokeJoin::Miter) - - -/* parse the fill rule used during filling a path. - * Value: nonzero | evenodd | inherit - * Initial: nonzero - * https://www.w3.org/TR/SVG/painting.html - */ -static constexpr struct -{ - FillRule fillRule; - const char* tag; -} fillRuleTags[] = { - { FillRule::EvenOdd, "evenodd" } -}; - - -_PARSE_TAG(FillRule, fillRule, FillRule, fillRuleTags, FillRule::Winding) - - -/* parse the dash pattern used during stroking a path. - * Value: none | | inherit - * Initial: none - * https://www.w3.org/TR/SVG/painting.html - */ -static void _parseDashArray(SvgLoaderData* loader, const char *str, SvgDash* dash) -{ - if (!strncmp(str, "none", 4)) return; - - char *end = nullptr; - - while (*str) { - str = _skipComma(str); - float parsedValue = strToFloat(str, &end); - if (str == end) break; - if (parsedValue <= 0.0f) break; - if (*end == '%') { - ++end; - //Refers to the diagonal length of the viewport. - //https://www.w3.org/TR/SVG2/coords.html#Units - parsedValue = (sqrtf(powf(loader->svgParse->global.w, 2) + powf(loader->svgParse->global.h, 2)) / sqrtf(2.0f)) * (parsedValue / 100.0f); - } - (*dash).array.push(parsedValue); - str = end; - } - //If dash array size is 1, it means that dash and gap size are the same. - if ((*dash).array.count == 1) (*dash).array.push((*dash).array[0]); -} - - -static char* _idFromUrl(const char* url) -{ - auto open = strchr(url, '('); - auto close = strchr(url, ')'); - if (!open || !close || open >= close) return nullptr; - - open = strchr(url, '#'); - if (!open || open >= close) return nullptr; - - ++open; - --close; - - //trim the rest of the spaces if any - while (open < close && *close == ' ') --close; - - //quick verification - for (auto id = open; id < close; id++) { - if (*id == ' ' || *id == '\'') return nullptr; - } - - return strDuplicate(open, (close - open + 1)); -} - - -static unsigned char _parseColor(const char* value, char** end) -{ - float r; - - r = strToFloat(value, end); - *end = _skipSpace(*end, nullptr); - if (**end == '%') { - r = 255 * r / 100; - (*end)++; - } - *end = _skipSpace(*end, nullptr); - - if (r < 0 || r > 255) { - *end = nullptr; - return 0; - } - - return lrint(r); -} - - -static constexpr struct -{ - const char* name; - unsigned int value; -} colors[] = { - { "aliceblue", 0xfff0f8ff }, - { "antiquewhite", 0xfffaebd7 }, - { "aqua", 0xff00ffff }, - { "aquamarine", 0xff7fffd4 }, - { "azure", 0xfff0ffff }, - { "beige", 0xfff5f5dc }, - { "bisque", 0xffffe4c4 }, - { "black", 0xff000000 }, - { "blanchedalmond", 0xffffebcd }, - { "blue", 0xff0000ff }, - { "blueviolet", 0xff8a2be2 }, - { "brown", 0xffa52a2a }, - { "burlywood", 0xffdeb887 }, - { "cadetblue", 0xff5f9ea0 }, - { "chartreuse", 0xff7fff00 }, - { "chocolate", 0xffd2691e }, - { "coral", 0xffff7f50 }, - { "cornflowerblue", 0xff6495ed }, - { "cornsilk", 0xfffff8dc }, - { "crimson", 0xffdc143c }, - { "cyan", 0xff00ffff }, - { "darkblue", 0xff00008b }, - { "darkcyan", 0xff008b8b }, - { "darkgoldenrod", 0xffb8860b }, - { "darkgray", 0xffa9a9a9 }, - { "darkgrey", 0xffa9a9a9 }, - { "darkgreen", 0xff006400 }, - { "darkkhaki", 0xffbdb76b }, - { "darkmagenta", 0xff8b008b }, - { "darkolivegreen", 0xff556b2f }, - { "darkorange", 0xffff8c00 }, - { "darkorchid", 0xff9932cc }, - { "darkred", 0xff8b0000 }, - { "darksalmon", 0xffe9967a }, - { "darkseagreen", 0xff8fbc8f }, - { "darkslateblue", 0xff483d8b }, - { "darkslategray", 0xff2f4f4f }, - { "darkslategrey", 0xff2f4f4f }, - { "darkturquoise", 0xff00ced1 }, - { "darkviolet", 0xff9400d3 }, - { "deeppink", 0xffff1493 }, - { "deepskyblue", 0xff00bfff }, - { "dimgray", 0xff696969 }, - { "dimgrey", 0xff696969 }, - { "dodgerblue", 0xff1e90ff }, - { "firebrick", 0xffb22222 }, - { "floralwhite", 0xfffffaf0 }, - { "forestgreen", 0xff228b22 }, - { "fuchsia", 0xffff00ff }, - { "gainsboro", 0xffdcdcdc }, - { "ghostwhite", 0xfff8f8ff }, - { "gold", 0xffffd700 }, - { "goldenrod", 0xffdaa520 }, - { "gray", 0xff808080 }, - { "grey", 0xff808080 }, - { "green", 0xff008000 }, - { "greenyellow", 0xffadff2f }, - { "honeydew", 0xfff0fff0 }, - { "hotpink", 0xffff69b4 }, - { "indianred", 0xffcd5c5c }, - { "indigo", 0xff4b0082 }, - { "ivory", 0xfffffff0 }, - { "khaki", 0xfff0e68c }, - { "lavender", 0xffe6e6fa }, - { "lavenderblush", 0xfffff0f5 }, - { "lawngreen", 0xff7cfc00 }, - { "lemonchiffon", 0xfffffacd }, - { "lightblue", 0xffadd8e6 }, - { "lightcoral", 0xfff08080 }, - { "lightcyan", 0xffe0ffff }, - { "lightgoldenrodyellow", 0xfffafad2 }, - { "lightgray", 0xffd3d3d3 }, - { "lightgrey", 0xffd3d3d3 }, - { "lightgreen", 0xff90ee90 }, - { "lightpink", 0xffffb6c1 }, - { "lightsalmon", 0xffffa07a }, - { "lightseagreen", 0xff20b2aa }, - { "lightskyblue", 0xff87cefa }, - { "lightslategray", 0xff778899 }, - { "lightslategrey", 0xff778899 }, - { "lightsteelblue", 0xffb0c4de }, - { "lightyellow", 0xffffffe0 }, - { "lime", 0xff00ff00 }, - { "limegreen", 0xff32cd32 }, - { "linen", 0xfffaf0e6 }, - { "magenta", 0xffff00ff }, - { "maroon", 0xff800000 }, - { "mediumaquamarine", 0xff66cdaa }, - { "mediumblue", 0xff0000cd }, - { "mediumorchid", 0xffba55d3 }, - { "mediumpurple", 0xff9370d8 }, - { "mediumseagreen", 0xff3cb371 }, - { "mediumslateblue", 0xff7b68ee }, - { "mediumspringgreen", 0xff00fa9a }, - { "mediumturquoise", 0xff48d1cc }, - { "mediumvioletred", 0xffc71585 }, - { "midnightblue", 0xff191970 }, - { "mintcream", 0xfff5fffa }, - { "mistyrose", 0xffffe4e1 }, - { "moccasin", 0xffffe4b5 }, - { "navajowhite", 0xffffdead }, - { "navy", 0xff000080 }, - { "oldlace", 0xfffdf5e6 }, - { "olive", 0xff808000 }, - { "olivedrab", 0xff6b8e23 }, - { "orange", 0xffffa500 }, - { "orangered", 0xffff4500 }, - { "orchid", 0xffda70d6 }, - { "palegoldenrod", 0xffeee8aa }, - { "palegreen", 0xff98fb98 }, - { "paleturquoise", 0xffafeeee }, - { "palevioletred", 0xffd87093 }, - { "papayawhip", 0xffffefd5 }, - { "peachpuff", 0xffffdab9 }, - { "peru", 0xffcd853f }, - { "pink", 0xffffc0cb }, - { "plum", 0xffdda0dd }, - { "powderblue", 0xffb0e0e6 }, - { "purple", 0xff800080 }, - { "red", 0xffff0000 }, - { "rosybrown", 0xffbc8f8f }, - { "royalblue", 0xff4169e1 }, - { "saddlebrown", 0xff8b4513 }, - { "salmon", 0xfffa8072 }, - { "sandybrown", 0xfff4a460 }, - { "seagreen", 0xff2e8b57 }, - { "seashell", 0xfffff5ee }, - { "sienna", 0xffa0522d }, - { "silver", 0xffc0c0c0 }, - { "skyblue", 0xff87ceeb }, - { "slateblue", 0xff6a5acd }, - { "slategray", 0xff708090 }, - { "slategrey", 0xff708090 }, - { "snow", 0xfffffafa }, - { "springgreen", 0xff00ff7f }, - { "steelblue", 0xff4682b4 }, - { "tan", 0xffd2b48c }, - { "teal", 0xff008080 }, - { "thistle", 0xffd8bfd8 }, - { "tomato", 0xffff6347 }, - { "turquoise", 0xff40e0d0 }, - { "violet", 0xffee82ee }, - { "wheat", 0xfff5deb3 }, - { "white", 0xffffffff }, - { "whitesmoke", 0xfff5f5f5 }, - { "yellow", 0xffffff00 }, - { "yellowgreen", 0xff9acd32 } -}; - - -static bool _hslToRgb(float hue, float saturation, float brightness, uint8_t* red, uint8_t* green, uint8_t* blue) -{ - if (!red || !green || !blue) return false; - - float sv, vsf, f, p, q, t, v; - float _red = 0, _green = 0, _blue = 0; - uint32_t i = 0; - - if (mathZero(saturation)) _red = _green = _blue = brightness; - else { - if (mathEqual(hue, 360.0)) hue = 0.0f; - hue /= 60.0f; - - v = (brightness <= 0.5f) ? (brightness * (1.0f + saturation)) : (brightness + saturation - (brightness * saturation)); - p = brightness + brightness - v; - - if (!mathZero(v)) sv = (v - p) / v; - else sv = 0; - - i = static_cast(hue); - f = hue - i; - - vsf = v * sv * f; - - t = p + vsf; - q = v - vsf; - - switch (i) { - case 0: { - _red = v; - _green = t; - _blue = p; - break; - } - case 1: { - _red = q; - _green = v; - _blue = p; - break; - } - case 2: { - _red = p; - _green = v; - _blue = t; - break; - } - case 3: { - _red = p; - _green = q; - _blue = v; - break; - } - case 4: { - _red = t; - _green = p; - _blue = v; - break; - } - case 5: { - _red = v; - _green = p; - _blue = q; - break; - } - } - } - - *red = static_cast(roundf(_red * 255.0f)); - *green = static_cast(roundf(_green * 255.0f)); - *blue = static_cast(roundf(_blue * 255.0f)); - - return true; -} - - -static bool _toColor(const char* str, uint8_t* r, uint8_t* g, uint8_t* b, char** ref) -{ - unsigned int len = strlen(str); - char *red, *green, *blue; - unsigned char tr, tg, tb; - - if (len == 4 && str[0] == '#') { - //Case for "#456" should be interpreted as "#445566" - if (isxdigit(str[1]) && isxdigit(str[2]) && isxdigit(str[3])) { - char tmp[3] = { '\0', '\0', '\0' }; - tmp[0] = str[1]; - tmp[1] = str[1]; - *r = strtol(tmp, nullptr, 16); - tmp[0] = str[2]; - tmp[1] = str[2]; - *g = strtol(tmp, nullptr, 16); - tmp[0] = str[3]; - tmp[1] = str[3]; - *b = strtol(tmp, nullptr, 16); - } - return true; - } else if (len == 7 && str[0] == '#') { - if (isxdigit(str[1]) && isxdigit(str[2]) && isxdigit(str[3]) && isxdigit(str[4]) && isxdigit(str[5]) && isxdigit(str[6])) { - char tmp[3] = { '\0', '\0', '\0' }; - tmp[0] = str[1]; - tmp[1] = str[2]; - *r = strtol(tmp, nullptr, 16); - tmp[0] = str[3]; - tmp[1] = str[4]; - *g = strtol(tmp, nullptr, 16); - tmp[0] = str[5]; - tmp[1] = str[6]; - *b = strtol(tmp, nullptr, 16); - } - return true; - } else if (len >= 10 && (str[0] == 'r' || str[0] == 'R') && (str[1] == 'g' || str[1] == 'G') && (str[2] == 'b' || str[2] == 'B') && str[3] == '(' && str[len - 1] == ')') { - tr = _parseColor(str + 4, &red); - if (red && *red == ',') { - tg = _parseColor(red + 1, &green); - if (green && *green == ',') { - tb = _parseColor(green + 1, &blue); - if (blue && blue[0] == ')' && blue[1] == '\0') { - *r = tr; - *g = tg; - *b = tb; - } - } - } - return true; - } else if (ref && len >= 3 && !strncmp(str, "url", 3)) { - if (*ref) free(*ref); - *ref = _idFromUrl((const char*)(str + 3)); - return true; - } else if (len >= 10 && (str[0] == 'h' || str[0] == 'H') && (str[1] == 's' || str[1] == 'S') && (str[2] == 'l' || str[2] == 'L') && str[3] == '(' && str[len - 1] == ')') { - float th, ts, tb; - const char *content, *hue, *saturation, *brightness; - content = str + 4; - content = _skipSpace(content, nullptr); - if (_parseNumber(&content, &hue, &th) && hue) { - th = float(uint32_t(th) % 360); - hue = _skipSpace(hue, nullptr); - hue = (char*)_skipComma(hue); - hue = _skipSpace(hue, nullptr); - if (_parseNumber(&hue, &saturation, &ts) && saturation && *saturation == '%') { - ts /= 100.0f; - saturation = _skipSpace(saturation + 1, nullptr); - saturation = (char*)_skipComma(saturation); - saturation = _skipSpace(saturation, nullptr); - if (_parseNumber(&saturation, &brightness, &tb) && brightness && *brightness == '%') { - tb /= 100.0f; - brightness = _skipSpace(brightness + 1, nullptr); - if (brightness && brightness[0] == ')' && brightness[1] == '\0') { - return _hslToRgb(th, ts, tb, r, g, b); - } - } - } - } - } else { - //Handle named color - for (unsigned int i = 0; i < (sizeof(colors) / sizeof(colors[0])); i++) { - if (!strcasecmp(colors[i].name, str)) { - *r = (((uint8_t*)(&(colors[i].value)))[2]); - *g = (((uint8_t*)(&(colors[i].value)))[1]); - *b = (((uint8_t*)(&(colors[i].value)))[0]); - return true; - } - } - } - return false; -} - - -static char* _parseNumbersArray(char* str, float* points, int* ptCount, int len) -{ - int count = 0; - char* end = nullptr; - - str = _skipSpace(str, nullptr); - while ((count < len) && (isdigit(*str) || *str == '-' || *str == '+' || *str == '.')) { - points[count++] = strToFloat(str, &end); - str = end; - str = _skipSpace(str, nullptr); - if (*str == ',') ++str; - //Eat the rest of space - str = _skipSpace(str, nullptr); - } - *ptCount = count; - return str; -} - - -enum class MatrixState { - Unknown, - Matrix, - Translate, - Rotate, - Scale, - SkewX, - SkewY -}; - - -#define MATRIX_DEF(Name, Value) \ - { \ -#Name, sizeof(#Name), Value \ - } - - -static constexpr struct -{ - const char* tag; - int sz; - MatrixState state; -} matrixTags[] = { - MATRIX_DEF(matrix, MatrixState::Matrix), - MATRIX_DEF(translate, MatrixState::Translate), - MATRIX_DEF(rotate, MatrixState::Rotate), - MATRIX_DEF(scale, MatrixState::Scale), - MATRIX_DEF(skewX, MatrixState::SkewX), - MATRIX_DEF(skewY, MatrixState::SkewY) -}; - - -/* parse transform attribute - * https://www.w3.org/TR/SVG/coords.html#TransformAttribute - */ -static Matrix* _parseTransformationMatrix(const char* value) -{ - const int POINT_CNT = 8; - - auto matrix = (Matrix*)malloc(sizeof(Matrix)); - if (!matrix) return nullptr; - *matrix = {1, 0, 0, 0, 1, 0, 0, 0, 1}; - - float points[POINT_CNT]; - int ptCount = 0; - char* str = (char*)value; - char* end = str + strlen(str); - - while (str < end) { - auto state = MatrixState::Unknown; - - if (isspace(*str) || (*str == ',')) { - ++str; - continue; - } - for (unsigned int i = 0; i < sizeof(matrixTags) / sizeof(matrixTags[0]); i++) { - if (!strncmp(matrixTags[i].tag, str, matrixTags[i].sz - 1)) { - state = matrixTags[i].state; - str += (matrixTags[i].sz - 1); - break; - } - } - if (state == MatrixState::Unknown) goto error; - - str = _skipSpace(str, end); - if (*str != '(') goto error; - ++str; - str = _parseNumbersArray(str, points, &ptCount, POINT_CNT); - if (*str != ')') goto error; - ++str; - - if (state == MatrixState::Matrix) { - if (ptCount != 6) goto error; - Matrix tmp = {points[0], points[2], points[4], points[1], points[3], points[5], 0, 0, 1}; - *matrix = mathMultiply(matrix, &tmp); - } else if (state == MatrixState::Translate) { - if (ptCount == 1) { - Matrix tmp = {1, 0, points[0], 0, 1, 0, 0, 0, 1}; - *matrix = mathMultiply(matrix, &tmp); - } else if (ptCount == 2) { - Matrix tmp = {1, 0, points[0], 0, 1, points[1], 0, 0, 1}; - *matrix = mathMultiply(matrix, &tmp); - } else goto error; - } else if (state == MatrixState::Rotate) { - //Transform to signed. - points[0] = fmodf(points[0], 360.0f); - if (points[0] < 0) points[0] += 360.0f; - auto c = cosf(mathDeg2Rad(points[0])); - auto s = sinf(mathDeg2Rad(points[0])); - if (ptCount == 1) { - Matrix tmp = { c, -s, 0, s, c, 0, 0, 0, 1 }; - *matrix = mathMultiply(matrix, &tmp); - } else if (ptCount == 3) { - Matrix tmp = { 1, 0, points[1], 0, 1, points[2], 0, 0, 1 }; - *matrix = mathMultiply(matrix, &tmp); - tmp = { c, -s, 0, s, c, 0, 0, 0, 1 }; - *matrix = mathMultiply(matrix, &tmp); - tmp = { 1, 0, -points[1], 0, 1, -points[2], 0, 0, 1 }; - *matrix = mathMultiply(matrix, &tmp); - } else { - goto error; - } - } else if (state == MatrixState::Scale) { - if (ptCount < 1 || ptCount > 2) goto error; - auto sx = points[0]; - auto sy = sx; - if (ptCount == 2) sy = points[1]; - Matrix tmp = { sx, 0, 0, 0, sy, 0, 0, 0, 1 }; - *matrix = mathMultiply(matrix, &tmp); - } else if (state == MatrixState::SkewX) { - if (ptCount != 1) goto error; - auto deg = tanf(mathDeg2Rad(points[0])); - Matrix tmp = { 1, deg, 0, 0, 1, 0, 0, 0, 1 }; - *matrix = mathMultiply(matrix, &tmp); - } else if (state == MatrixState::SkewY) { - if (ptCount != 1) goto error; - auto deg = tanf(mathDeg2Rad(points[0])); - Matrix tmp = { 1, 0, 0, deg, 1, 0, 0, 0, 1 }; - *matrix = mathMultiply(matrix, &tmp); - } - } - return matrix; -error: - if (matrix) free(matrix); - return nullptr; -} - - -#define LENGTH_DEF(Name, Value) \ - { \ -#Name, sizeof(#Name), Value \ - } - - -static void _postpone(Array& nodes, SvgNode *node, char* id) -{ - nodes.push({node, id}); -} - - -/* -// TODO - remove? -static constexpr struct -{ - const char* tag; - int sz; - SvgLengthType type; -} lengthTags[] = { - LENGTH_DEF(%, SvgLengthType::Percent), - LENGTH_DEF(px, SvgLengthType::Px), - LENGTH_DEF(pc, SvgLengthType::Pc), - LENGTH_DEF(pt, SvgLengthType::Pt), - LENGTH_DEF(mm, SvgLengthType::Mm), - LENGTH_DEF(cm, SvgLengthType::Cm), - LENGTH_DEF(in, SvgLengthType::In) -}; - -static float _parseLength(const char* str, SvgLengthType* type) -{ - float value; - int sz = strlen(str); - - *type = SvgLengthType::Px; - for (unsigned int i = 0; i < sizeof(lengthTags) / sizeof(lengthTags[0]); i++) { - if (lengthTags[i].sz - 1 == sz && !strncmp(lengthTags[i].tag, str, sz)) *type = lengthTags[i].type; - } - value = svgUtilStrtof(str, nullptr); - return value; -} -*/ - -static bool _parseStyleAttr(void* data, const char* key, const char* value); -static bool _parseStyleAttr(void* data, const char* key, const char* value, bool style); - - -static bool _attrParseSvgNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - SvgDocNode* doc = &(node->node.doc); - - if (!strcmp(key, "width")) { - doc->w = _toFloat(loader->svgParse, value, SvgParserLengthType::Horizontal); - if (strstr(value, "%") && !(doc->viewFlag & SvgViewFlag::Viewbox)) { - doc->viewFlag = (doc->viewFlag | SvgViewFlag::WidthInPercent); - } else { - doc->viewFlag = (doc->viewFlag | SvgViewFlag::Width); - } - } else if (!strcmp(key, "height")) { - doc->h = _toFloat(loader->svgParse, value, SvgParserLengthType::Vertical); - if (strstr(value, "%") && !(doc->viewFlag & SvgViewFlag::Viewbox)) { - doc->viewFlag = (doc->viewFlag | SvgViewFlag::HeightInPercent); - } else { - doc->viewFlag = (doc->viewFlag | SvgViewFlag::Height); - } - } else if (!strcmp(key, "viewBox")) { - if (_parseNumber(&value, nullptr, &doc->vx)) { - if (_parseNumber(&value, nullptr, &doc->vy)) { - if (_parseNumber(&value, nullptr, &doc->vw)) { - if (_parseNumber(&value, nullptr, &doc->vh)) { - doc->viewFlag = (doc->viewFlag | SvgViewFlag::Viewbox); - loader->svgParse->global.h = doc->vh; - } - loader->svgParse->global.w = doc->vw; - } - loader->svgParse->global.y = doc->vy; - } - loader->svgParse->global.x = doc->vx; - } - if ((doc->viewFlag & SvgViewFlag::Viewbox) && (doc->vw < 0.0f || doc->vh < 0.0f)) { - doc->viewFlag = (SvgViewFlag)((uint32_t)doc->viewFlag & ~(uint32_t)SvgViewFlag::Viewbox); - TVGLOG("SVG", "Negative values of the width and/or height - the attribute invalidated."); - } - if (!(doc->viewFlag & SvgViewFlag::Viewbox)) { - loader->svgParse->global.x = loader->svgParse->global.y = 0.0f; - loader->svgParse->global.w = loader->svgParse->global.h = 1.0f; - } - } else if (!strcmp(key, "preserveAspectRatio")) { - _parseAspectRatio(&value, &doc->align, &doc->meetOrSlice); - } else if (!strcmp(key, "style")) { - return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); -#ifdef THORVG_LOG_ENABLED - } else if ((!strcmp(key, "x") || !strcmp(key, "y")) && fabsf(strToFloat(value, nullptr)) > FLOAT_EPSILON) { - TVGLOG("SVG", "Unsupported attributes used [Elements type: Svg][Attribute: %s][Value: %s]", key, value); -#endif - } else { - return _parseStyleAttr(loader, key, value, false); - } - return true; -} - - -//https://www.w3.org/TR/SVGTiny12/painting.html#SpecifyingPaint -static void _handlePaintAttr(SvgPaint* paint, const char* value) -{ - if (!strcmp(value, "none")) { - //No paint property - paint->none = true; - return; - } - if (!strcmp(value, "currentColor")) { - paint->curColor = true; - paint->none = false; - return; - } - if (_toColor(value, &paint->color.r, &paint->color.g, &paint->color.b, &paint->url)) paint->none = false; -} - - -static void _handleColorAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - SvgStyleProperty* style = node->style; - if (_toColor(value, &style->color.r, &style->color.g, &style->color.b, nullptr)) { - style->curColorSet = true; - } -} - - -static void _handleFillAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - SvgStyleProperty* style = node->style; - style->fill.flags = (style->fill.flags | SvgFillFlags::Paint); - _handlePaintAttr(&style->fill.paint, value); -} - - -static void _handleStrokeAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - SvgStyleProperty* style = node->style; - style->stroke.flags = (style->stroke.flags | SvgStrokeFlags::Paint); - _handlePaintAttr(&style->stroke.paint, value); -} - - -static void _handleStrokeOpacityAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Opacity); - node->style->stroke.opacity = _toOpacity(value); -} - -static void _handleStrokeDashArrayAttr(SvgLoaderData* loader, SvgNode* node, const char* value) -{ - node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Dash); - _parseDashArray(loader, value, &node->style->stroke.dash); -} - -static void _handleStrokeDashOffsetAttr(SvgLoaderData* loader, SvgNode* node, const char* value) -{ - node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::DashOffset); - node->style->stroke.dash.offset = _toFloat(loader->svgParse, value, SvgParserLengthType::Horizontal); -} - -static void _handleStrokeWidthAttr(SvgLoaderData* loader, SvgNode* node, const char* value) -{ - node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Width); - node->style->stroke.width = _toFloat(loader->svgParse, value, SvgParserLengthType::Horizontal); -} - - -static void _handleStrokeLineCapAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Cap); - node->style->stroke.cap = _toLineCap(value); -} - - -static void _handleStrokeLineJoinAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Join); - node->style->stroke.join = _toLineJoin(value); -} - -static void _handleStrokeMiterlimitAttr(SvgLoaderData* loader, SvgNode* node, const char* value) -{ - char* end = nullptr; - const float miterlimit = strToFloat(value, &end); - - // https://www.w3.org/TR/SVG2/painting.html#LineJoin - // - A negative value for stroke-miterlimit must be treated as an illegal value. - if (miterlimit < 0.0f) { - TVGERR("SVG", "A stroke-miterlimit change (%f <- %f) with a negative value is omitted.", - node->style->stroke.miterlimit, miterlimit); - return; - } - - node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Miterlimit); - node->style->stroke.miterlimit = miterlimit; -} - -static void _handleFillRuleAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - node->style->fill.flags = (node->style->fill.flags | SvgFillFlags::FillRule); - node->style->fill.fillRule = _toFillRule(value); -} - - -static void _handleOpacityAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - node->style->flags = (node->style->flags | SvgStyleFlags::Opacity); - node->style->opacity = _toOpacity(value); -} - - -static void _handleFillOpacityAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - node->style->fill.flags = (node->style->fill.flags | SvgFillFlags::Opacity); - node->style->fill.opacity = _toOpacity(value); -} - - -static void _handleTransformAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - node->transform = _parseTransformationMatrix(value); -} - - -static void _handleClipPathAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - SvgStyleProperty* style = node->style; - int len = strlen(value); - if (len >= 3 && !strncmp(value, "url", 3)) { - if (style->clipPath.url) free(style->clipPath.url); - style->clipPath.url = _idFromUrl((const char*)(value + 3)); - } -} - - -static void _handleMaskAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - SvgStyleProperty* style = node->style; - int len = strlen(value); - if (len >= 3 && !strncmp(value, "url", 3)) { - if (style->mask.url) free(style->mask.url); - style->mask.url = _idFromUrl((const char*)(value + 3)); - } -} - - -static void _handleMaskTypeAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - node->node.mask.type = _toMaskType(value); -} - - -static void _handleDisplayAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - //TODO : The display attribute can have various values as well as "none". - // The default is "inline" which means visible and "none" means invisible. - // Depending on the type of node, additional functionality may be required. - // refer to https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/display - node->style->flags = (node->style->flags | SvgStyleFlags::Display); - if (!strcmp(value, "none")) node->style->display = false; - else node->style->display = true; -} - - -static void _handlePaintOrderAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) -{ - node->style->flags = (node->style->flags | SvgStyleFlags::PaintOrder); - node->style->paintOrder = _toPaintOrder(value); -} - - -static void _handleCssClassAttr(SvgLoaderData* loader, SvgNode* node, const char* value) -{ - auto cssClass = &node->style->cssClass; - - if (*cssClass && value) free(*cssClass); - *cssClass = _copyId(value); - - bool cssClassFound = false; - - //css styling: tag.name has higher priority than .name - if (auto cssNode = cssFindStyleNode(loader->cssStyle, *cssClass, node->type)) { - cssClassFound = true; - cssCopyStyleAttr(node, cssNode); - } - if (auto cssNode = cssFindStyleNode(loader->cssStyle, *cssClass)) { - cssClassFound = true; - cssCopyStyleAttr(node, cssNode); - } - - if (!cssClassFound) _postpone(loader->nodesToStyle, node, *cssClass); -} - - -typedef void (*styleMethod)(SvgLoaderData* loader, SvgNode* node, const char* value); - -#define STYLE_DEF(Name, Name1, Flag) { #Name, sizeof(#Name), _handle##Name1##Attr, Flag } - - -static constexpr struct -{ - const char* tag; - int sz; - styleMethod tagHandler; - SvgStyleFlags flag; -} styleTags[] = { - STYLE_DEF(color, Color, SvgStyleFlags::Color), - STYLE_DEF(fill, Fill, SvgStyleFlags::Fill), - STYLE_DEF(fill-rule, FillRule, SvgStyleFlags::FillRule), - STYLE_DEF(fill-opacity, FillOpacity, SvgStyleFlags::FillOpacity), - STYLE_DEF(opacity, Opacity, SvgStyleFlags::Opacity), - STYLE_DEF(stroke, Stroke, SvgStyleFlags::Stroke), - STYLE_DEF(stroke-width, StrokeWidth, SvgStyleFlags::StrokeWidth), - STYLE_DEF(stroke-linejoin, StrokeLineJoin, SvgStyleFlags::StrokeLineJoin), - STYLE_DEF(stroke-miterlimit, StrokeMiterlimit, SvgStyleFlags::StrokeMiterlimit), - STYLE_DEF(stroke-linecap, StrokeLineCap, SvgStyleFlags::StrokeLineCap), - STYLE_DEF(stroke-opacity, StrokeOpacity, SvgStyleFlags::StrokeOpacity), - STYLE_DEF(stroke-dasharray, StrokeDashArray, SvgStyleFlags::StrokeDashArray), - STYLE_DEF(stroke-dashoffset, StrokeDashOffset, SvgStyleFlags::StrokeDashOffset), - STYLE_DEF(transform, Transform, SvgStyleFlags::Transform), - STYLE_DEF(clip-path, ClipPath, SvgStyleFlags::ClipPath), - STYLE_DEF(mask, Mask, SvgStyleFlags::Mask), - STYLE_DEF(mask-type, MaskType, SvgStyleFlags::MaskType), - STYLE_DEF(display, Display, SvgStyleFlags::Display), - STYLE_DEF(paint-order, PaintOrder, SvgStyleFlags::PaintOrder) -}; - - -static bool _parseStyleAttr(void* data, const char* key, const char* value, bool style) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - int sz; - if (!key || !value) return false; - - //Trim the white space - key = _skipSpace(key, nullptr); - value = _skipSpace(value, nullptr); - - sz = strlen(key); - for (unsigned int i = 0; i < sizeof(styleTags) / sizeof(styleTags[0]); i++) { - if (styleTags[i].sz - 1 == sz && !strncmp(styleTags[i].tag, key, sz)) { - bool importance = false; - if (auto ptr = strstr(value, "!important")) { - size_t size = ptr - value; - while (size > 0 && isspace(value[size - 1])) { - size--; - } - value = strDuplicate(value, size); - importance = true; - } - if (style) { - if (importance || !(node->style->flagsImportance & styleTags[i].flag)) { - styleTags[i].tagHandler(loader, node, value); - node->style->flags = (node->style->flags | styleTags[i].flag); - } - } else if (!(node->style->flags & styleTags[i].flag)) { - styleTags[i].tagHandler(loader, node, value); - } - if (importance) { - node->style->flagsImportance = (node->style->flags | styleTags[i].flag); - free(const_cast(value)); - } - return true; - } - } - - return false; -} - - -static bool _parseStyleAttr(void* data, const char* key, const char* value) -{ - return _parseStyleAttr(data, key, value, true); -} - - -/* parse g node - * https://www.w3.org/TR/SVG/struct.html#Groups - */ -static bool _attrParseGNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - - if (!strcmp(key, "style")) { - return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); - } else if (!strcmp(key, "transform")) { - node->transform = _parseTransformationMatrix(value); - } else if (!strcmp(key, "id")) { - if (node->id && value) free(node->id); - node->id = _copyId(value); - } else if (!strcmp(key, "class")) { - _handleCssClassAttr(loader, node, value); - } else if (!strcmp(key, "clip-path")) { - _handleClipPathAttr(loader, node, value); - } else if (!strcmp(key, "mask")) { - _handleMaskAttr(loader, node, value); - } else { - return _parseStyleAttr(loader, key, value, false); - } - return true; -} - - -/* parse clipPath node - * https://www.w3.org/TR/SVG/struct.html#Groups - */ -static bool _attrParseClipPathNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - SvgClipNode* clip = &(node->node.clip); - - if (!strcmp(key, "style")) { - return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); - } else if (!strcmp(key, "transform")) { - node->transform = _parseTransformationMatrix(value); - } else if (!strcmp(key, "id")) { - if (node->id && value) free(node->id); - node->id = _copyId(value); - } else if (!strcmp(key, "class")) { - _handleCssClassAttr(loader, node, value); - } else if (!strcmp(key, "clipPathUnits")) { - if (!strcmp(value, "objectBoundingBox")) clip->userSpace = false; - } else { - return _parseStyleAttr(loader, key, value, false); - } - return true; -} - - -static bool _attrParseMaskNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - SvgMaskNode* mask = &(node->node.mask); - - if (!strcmp(key, "style")) { - return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); - } else if (!strcmp(key, "transform")) { - node->transform = _parseTransformationMatrix(value); - } else if (!strcmp(key, "id")) { - if (node->id && value) free(node->id); - node->id = _copyId(value); - } else if (!strcmp(key, "class")) { - _handleCssClassAttr(loader, node, value); - } else if (!strcmp(key, "maskContentUnits")) { - if (!strcmp(value, "objectBoundingBox")) mask->userSpace = false; - } else if (!strcmp(key, "mask-type")) { - mask->type = _toMaskType(value); - } else { - return _parseStyleAttr(loader, key, value, false); - } - return true; -} - - -static bool _attrParseCssStyleNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - - if (!strcmp(key, "id")) { - if (node->id && value) free(node->id); - node->id = _copyId(value); - } else { - return _parseStyleAttr(loader, key, value, false); - } - return true; -} - - -static bool _attrParseSymbolNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - SvgSymbolNode* symbol = &(node->node.symbol); - - if (!strcmp(key, "viewBox")) { - if (!_parseNumber(&value, nullptr, &symbol->vx) || !_parseNumber(&value, nullptr, &symbol->vy)) return false; - if (!_parseNumber(&value, nullptr, &symbol->vw) || !_parseNumber(&value, nullptr, &symbol->vh)) return false; - symbol->hasViewBox = true; - } else if (!strcmp(key, "width")) { - symbol->w = _toFloat(loader->svgParse, value, SvgParserLengthType::Horizontal); - symbol->hasWidth = true; - } else if (!strcmp(key, "height")) { - symbol->h = _toFloat(loader->svgParse, value, SvgParserLengthType::Vertical); - symbol->hasHeight = true; - } else if (!strcmp(key, "preserveAspectRatio")) { - _parseAspectRatio(&value, &symbol->align, &symbol->meetOrSlice); - } else if (!strcmp(key, "overflow")) { - if (!strcmp(value, "visible")) symbol->overflowVisible = true; - } else { - return _attrParseGNode(data, key, value); - } - - return true; -} - - -static SvgNode* _createNode(SvgNode* parent, SvgNodeType type) -{ - SvgNode* node = (SvgNode*)calloc(1, sizeof(SvgNode)); - - if (!node) return nullptr; - - //Default fill property - node->style = (SvgStyleProperty*)calloc(1, sizeof(SvgStyleProperty)); - - if (!node->style) { - free(node); - return nullptr; - } - - //Update the default value of stroke and fill - //https://www.w3.org/TR/SVGTiny12/painting.html#SpecifyingPaint - node->style->fill.paint.none = false; - //Default fill opacity is 1 - node->style->fill.opacity = 255; - node->style->opacity = 255; - //Default current color is not set - node->style->fill.paint.curColor = false; - node->style->curColorSet = false; - //Default fill rule is nonzero - node->style->fill.fillRule = FillRule::Winding; - - //Default stroke is none - node->style->stroke.paint.none = true; - //Default stroke opacity is 1 - node->style->stroke.opacity = 255; - //Default stroke current color is not set - node->style->stroke.paint.curColor = false; - //Default stroke width is 1 - node->style->stroke.width = 1; - //Default line cap is butt - node->style->stroke.cap = StrokeCap::Butt; - //Default line join is miter - node->style->stroke.join = StrokeJoin::Miter; - node->style->stroke.miterlimit = 4.0f; - node->style->stroke.scale = 1.0; - - node->style->paintOrder = _toPaintOrder("fill stroke"); - - //Default display is true("inline"). - node->style->display = true; - - node->parent = parent; - node->type = type; - - if (parent) parent->child.push(node); - return node; -} - - -static SvgNode* _createDefsNode(TVG_UNUSED SvgLoaderData* loader, TVG_UNUSED SvgNode* parent, const char* buf, unsigned bufLength, TVG_UNUSED parseAttributes func) -{ - if (loader->def && loader->doc->node.doc.defs) return loader->def; - SvgNode* node = _createNode(nullptr, SvgNodeType::Defs); - - loader->def = node; - loader->doc->node.doc.defs = node; - return node; -} - - -static SvgNode* _createGNode(TVG_UNUSED SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::G); - if (!loader->svgParse->node) return nullptr; - - func(buf, bufLength, _attrParseGNode, loader); - return loader->svgParse->node; -} - - -static SvgNode* _createSvgNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::Doc); - if (!loader->svgParse->node) return nullptr; - SvgDocNode* doc = &(loader->svgParse->node->node.doc); - - loader->svgParse->global.w = 1.0f; - loader->svgParse->global.h = 1.0f; - - doc->align = AspectRatioAlign::XMidYMid; - doc->meetOrSlice = AspectRatioMeetOrSlice::Meet; - doc->viewFlag = SvgViewFlag::None; - func(buf, bufLength, _attrParseSvgNode, loader); - - if (!(doc->viewFlag & SvgViewFlag::Viewbox)) { - if (doc->viewFlag & SvgViewFlag::Width) { - loader->svgParse->global.w = doc->w; - } - if (doc->viewFlag & SvgViewFlag::Height) { - loader->svgParse->global.h = doc->h; - } - } - return loader->svgParse->node; -} - - -static SvgNode* _createMaskNode(SvgLoaderData* loader, SvgNode* parent, TVG_UNUSED const char* buf, TVG_UNUSED unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::Mask); - if (!loader->svgParse->node) return nullptr; - - loader->svgParse->node->node.mask.userSpace = true; - loader->svgParse->node->node.mask.type = SvgMaskType::Luminance; - - func(buf, bufLength, _attrParseMaskNode, loader); - - return loader->svgParse->node; -} - - -static SvgNode* _createClipPathNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::ClipPath); - if (!loader->svgParse->node) return nullptr; - - loader->svgParse->node->style->display = false; - loader->svgParse->node->node.clip.userSpace = true; - - func(buf, bufLength, _attrParseClipPathNode, loader); - - return loader->svgParse->node; -} - - -static SvgNode* _createCssStyleNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::CssStyle); - if (!loader->svgParse->node) return nullptr; - - func(buf, bufLength, _attrParseCssStyleNode, loader); - - return loader->svgParse->node; -} - - -static SvgNode* _createSymbolNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::Symbol); - if (!loader->svgParse->node) return nullptr; - - loader->svgParse->node->node.symbol.align = AspectRatioAlign::XMidYMid; - loader->svgParse->node->node.symbol.meetOrSlice = AspectRatioMeetOrSlice::Meet; - loader->svgParse->node->node.symbol.overflowVisible = false; - - loader->svgParse->node->node.symbol.hasViewBox = false; - loader->svgParse->node->node.symbol.hasWidth = false; - loader->svgParse->node->node.symbol.hasHeight = false; - loader->svgParse->node->node.symbol.vx = 0.0f; - loader->svgParse->node->node.symbol.vy = 0.0f; - - func(buf, bufLength, _attrParseSymbolNode, loader); - - return loader->svgParse->node; -} - - -static bool _attrParsePathNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - SvgPathNode* path = &(node->node.path); - - if (!strcmp(key, "d")) { - if (path->path) free(path->path); - //Temporary: need to copy - path->path = _copyId(value); - } else if (!strcmp(key, "style")) { - return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); - } else if (!strcmp(key, "clip-path")) { - _handleClipPathAttr(loader, node, value); - } else if (!strcmp(key, "mask")) { - _handleMaskAttr(loader, node, value); - } else if (!strcmp(key, "id")) { - if (node->id && value) free(node->id); - node->id = _copyId(value); - } else if (!strcmp(key, "class")) { - _handleCssClassAttr(loader, node, value); - } else { - return _parseStyleAttr(loader, key, value, false); - } - return true; -} - - -static SvgNode* _createPathNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::Path); - - if (!loader->svgParse->node) return nullptr; - - func(buf, bufLength, _attrParsePathNode, loader); - - return loader->svgParse->node; -} - - -static constexpr struct -{ - const char* tag; - SvgParserLengthType type; - int sz; - size_t offset; -} circleTags[] = { - {"cx", SvgParserLengthType::Horizontal, sizeof("cx"), offsetof(SvgCircleNode, cx)}, - {"cy", SvgParserLengthType::Vertical, sizeof("cy"), offsetof(SvgCircleNode, cy)}, - {"r", SvgParserLengthType::Other, sizeof("r"), offsetof(SvgCircleNode, r)} -}; - - -/* parse the attributes for a circle element. - * https://www.w3.org/TR/SVG/shapes.html#CircleElement - */ -static bool _attrParseCircleNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - SvgCircleNode* circle = &(node->node.circle); - unsigned char* array; - int sz = strlen(key); - - array = (unsigned char*)circle; - for (unsigned int i = 0; i < sizeof(circleTags) / sizeof(circleTags[0]); i++) { - if (circleTags[i].sz - 1 == sz && !strncmp(circleTags[i].tag, key, sz)) { - *((float*)(array + circleTags[i].offset)) = _toFloat(loader->svgParse, value, circleTags[i].type); - return true; - } - } - - if (!strcmp(key, "style")) { - return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); - } else if (!strcmp(key, "clip-path")) { - _handleClipPathAttr(loader, node, value); - } else if (!strcmp(key, "mask")) { - _handleMaskAttr(loader, node, value); - } else if (!strcmp(key, "id")) { - if (node->id && value) free(node->id); - node->id = _copyId(value); - } else if (!strcmp(key, "class")) { - _handleCssClassAttr(loader, node, value); - } else { - return _parseStyleAttr(loader, key, value, false); - } - return true; -} - - -static SvgNode* _createCircleNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::Circle); - - if (!loader->svgParse->node) return nullptr; - - func(buf, bufLength, _attrParseCircleNode, loader); - return loader->svgParse->node; -} - - -static constexpr struct -{ - const char* tag; - SvgParserLengthType type; - int sz; - size_t offset; -} ellipseTags[] = { - {"cx", SvgParserLengthType::Horizontal, sizeof("cx"), offsetof(SvgEllipseNode, cx)}, - {"cy", SvgParserLengthType::Vertical, sizeof("cy"), offsetof(SvgEllipseNode, cy)}, - {"rx", SvgParserLengthType::Horizontal, sizeof("rx"), offsetof(SvgEllipseNode, rx)}, - {"ry", SvgParserLengthType::Vertical, sizeof("ry"), offsetof(SvgEllipseNode, ry)} -}; - - -/* parse the attributes for an ellipse element. - * https://www.w3.org/TR/SVG/shapes.html#EllipseElement - */ -static bool _attrParseEllipseNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - SvgEllipseNode* ellipse = &(node->node.ellipse); - unsigned char* array; - int sz = strlen(key); - - array = (unsigned char*)ellipse; - for (unsigned int i = 0; i < sizeof(ellipseTags) / sizeof(ellipseTags[0]); i++) { - if (ellipseTags[i].sz - 1 == sz && !strncmp(ellipseTags[i].tag, key, sz)) { - *((float*)(array + ellipseTags[i].offset)) = _toFloat(loader->svgParse, value, ellipseTags[i].type); - return true; - } - } - - if (!strcmp(key, "id")) { - if (node->id && value) free(node->id); - node->id = _copyId(value); - } else if (!strcmp(key, "class")) { - _handleCssClassAttr(loader, node, value); - } else if (!strcmp(key, "style")) { - return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); - } else if (!strcmp(key, "clip-path")) { - _handleClipPathAttr(loader, node, value); - } else if (!strcmp(key, "mask")) { - _handleMaskAttr(loader, node, value); - } else { - return _parseStyleAttr(loader, key, value, false); - } - return true; -} - - -static SvgNode* _createEllipseNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::Ellipse); - - if (!loader->svgParse->node) return nullptr; - - func(buf, bufLength, _attrParseEllipseNode, loader); - return loader->svgParse->node; -} - - -static bool _attrParsePolygonPoints(const char* str, SvgPolygonNode* polygon) -{ - float num_x, num_y; - while (_parseNumber(&str, nullptr, &num_x) && _parseNumber(&str, nullptr, &num_y)) { - polygon->pts.push(num_x); - polygon->pts.push(num_y); - } - return true; -} - - -/* parse the attributes for a polygon element. - * https://www.w3.org/TR/SVG/shapes.html#PolylineElement - */ -static bool _attrParsePolygonNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - SvgPolygonNode* polygon = nullptr; - - if (node->type == SvgNodeType::Polygon) polygon = &(node->node.polygon); - else polygon = &(node->node.polyline); - - if (!strcmp(key, "points")) { - return _attrParsePolygonPoints(value, polygon); - } else if (!strcmp(key, "style")) { - return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); - } else if (!strcmp(key, "clip-path")) { - _handleClipPathAttr(loader, node, value); - } else if (!strcmp(key, "mask")) { - _handleMaskAttr(loader, node, value); - } else if (!strcmp(key, "id")) { - if (node->id && value) free(node->id); - node->id = _copyId(value); - } else if (!strcmp(key, "class")) { - _handleCssClassAttr(loader, node, value); - } else { - return _parseStyleAttr(loader, key, value, false); - } - return true; -} - - -static SvgNode* _createPolygonNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::Polygon); - - if (!loader->svgParse->node) return nullptr; - - func(buf, bufLength, _attrParsePolygonNode, loader); - return loader->svgParse->node; -} - - -static SvgNode* _createPolylineNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::Polyline); - - if (!loader->svgParse->node) return nullptr; - - func(buf, bufLength, _attrParsePolygonNode, loader); - return loader->svgParse->node; -} - -static constexpr struct -{ - const char* tag; - SvgParserLengthType type; - int sz; - size_t offset; -} rectTags[] = { - {"x", SvgParserLengthType::Horizontal, sizeof("x"), offsetof(SvgRectNode, x)}, - {"y", SvgParserLengthType::Vertical, sizeof("y"), offsetof(SvgRectNode, y)}, - {"width", SvgParserLengthType::Horizontal, sizeof("width"), offsetof(SvgRectNode, w)}, - {"height", SvgParserLengthType::Vertical, sizeof("height"), offsetof(SvgRectNode, h)}, - {"rx", SvgParserLengthType::Horizontal, sizeof("rx"), offsetof(SvgRectNode, rx)}, - {"ry", SvgParserLengthType::Vertical, sizeof("ry"), offsetof(SvgRectNode, ry)} -}; - - -/* parse the attributes for a rect element. - * https://www.w3.org/TR/SVG/shapes.html#RectElement - */ -static bool _attrParseRectNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - SvgRectNode* rect = &(node->node.rect); - unsigned char* array; - bool ret = true; - int sz = strlen(key); - - array = (unsigned char*)rect; - for (unsigned int i = 0; i < sizeof(rectTags) / sizeof(rectTags[0]); i++) { - if (rectTags[i].sz - 1 == sz && !strncmp(rectTags[i].tag, key, sz)) { - *((float*)(array + rectTags[i].offset)) = _toFloat(loader->svgParse, value, rectTags[i].type); - - //Case if only rx or ry is declared - if (!strncmp(rectTags[i].tag, "rx", sz)) rect->hasRx = true; - if (!strncmp(rectTags[i].tag, "ry", sz)) rect->hasRy = true; - - if ((rect->rx >= FLOAT_EPSILON) && (rect->ry < FLOAT_EPSILON) && rect->hasRx && !rect->hasRy) rect->ry = rect->rx; - if ((rect->ry >= FLOAT_EPSILON) && (rect->rx < FLOAT_EPSILON) && !rect->hasRx && rect->hasRy) rect->rx = rect->ry; - return ret; - } - } - - if (!strcmp(key, "id")) { - if (node->id && value) free(node->id); - node->id = _copyId(value); - } else if (!strcmp(key, "class")) { - _handleCssClassAttr(loader, node, value); - } else if (!strcmp(key, "style")) { - ret = simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); - } else if (!strcmp(key, "clip-path")) { - _handleClipPathAttr(loader, node, value); - } else if (!strcmp(key, "mask")) { - _handleMaskAttr(loader, node, value); - } else { - ret = _parseStyleAttr(loader, key, value, false); - } - - return ret; -} - - -static SvgNode* _createRectNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::Rect); - - if (!loader->svgParse->node) return nullptr; - - loader->svgParse->node->node.rect.hasRx = loader->svgParse->node->node.rect.hasRy = false; - - func(buf, bufLength, _attrParseRectNode, loader); - return loader->svgParse->node; -} - - -static constexpr struct -{ - const char* tag; - SvgParserLengthType type; - int sz; - size_t offset; -} lineTags[] = { - {"x1", SvgParserLengthType::Horizontal, sizeof("x1"), offsetof(SvgLineNode, x1)}, - {"y1", SvgParserLengthType::Vertical, sizeof("y1"), offsetof(SvgLineNode, y1)}, - {"x2", SvgParserLengthType::Horizontal, sizeof("x2"), offsetof(SvgLineNode, x2)}, - {"y2", SvgParserLengthType::Vertical, sizeof("y2"), offsetof(SvgLineNode, y2)} -}; - - -/* parse the attributes for a line element. - * https://www.w3.org/TR/SVG/shapes.html#LineElement - */ -static bool _attrParseLineNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - SvgLineNode* line = &(node->node.line); - unsigned char* array; - int sz = strlen(key); - - array = (unsigned char*)line; - for (unsigned int i = 0; i < sizeof(lineTags) / sizeof(lineTags[0]); i++) { - if (lineTags[i].sz - 1 == sz && !strncmp(lineTags[i].tag, key, sz)) { - *((float*)(array + lineTags[i].offset)) = _toFloat(loader->svgParse, value, lineTags[i].type); - return true; - } - } - - if (!strcmp(key, "id")) { - if (node->id && value) free(node->id); - node->id = _copyId(value); - } else if (!strcmp(key, "class")) { - _handleCssClassAttr(loader, node, value); - } else if (!strcmp(key, "style")) { - return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); - } else if (!strcmp(key, "clip-path")) { - _handleClipPathAttr(loader, node, value); - } else if (!strcmp(key, "mask")) { - _handleMaskAttr(loader, node, value); - } else { - return _parseStyleAttr(loader, key, value, false); - } - return true; -} - - -static SvgNode* _createLineNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::Line); - - if (!loader->svgParse->node) return nullptr; - - func(buf, bufLength, _attrParseLineNode, loader); - return loader->svgParse->node; -} - - -static char* _idFromHref(const char* href) -{ - href = _skipSpace(href, nullptr); - if ((*href) == '#') href++; - return strdup(href); -} - - -static constexpr struct -{ - const char* tag; - SvgParserLengthType type; - int sz; - size_t offset; -} imageTags[] = { - {"x", SvgParserLengthType::Horizontal, sizeof("x"), offsetof(SvgRectNode, x)}, - {"y", SvgParserLengthType::Vertical, sizeof("y"), offsetof(SvgRectNode, y)}, - {"width", SvgParserLengthType::Horizontal, sizeof("width"), offsetof(SvgRectNode, w)}, - {"height", SvgParserLengthType::Vertical, sizeof("height"), offsetof(SvgRectNode, h)}, -}; - - -/* parse the attributes for a image element. - * https://www.w3.org/TR/SVG/embedded.html#ImageElement - */ -static bool _attrParseImageNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode* node = loader->svgParse->node; - SvgImageNode* image = &(node->node.image); - unsigned char* array; - int sz = strlen(key); - - array = (unsigned char*)image; - for (unsigned int i = 0; i < sizeof(imageTags) / sizeof(imageTags[0]); i++) { - if (imageTags[i].sz - 1 == sz && !strncmp(imageTags[i].tag, key, sz)) { - *((float*)(array + imageTags[i].offset)) = _toFloat(loader->svgParse, value, imageTags[i].type); - return true; - } - } - - if (!strcmp(key, "href") || !strcmp(key, "xlink:href")) { - if (image->href && value) free(image->href); - image->href = _idFromHref(value); - } else if (!strcmp(key, "id")) { - if (node->id && value) free(node->id); - node->id = _copyId(value); - } else if (!strcmp(key, "class")) { - _handleCssClassAttr(loader, node, value); - } else if (!strcmp(key, "style")) { - return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); - } else if (!strcmp(key, "clip-path")) { - _handleClipPathAttr(loader, node, value); - } else if (!strcmp(key, "mask")) { - _handleMaskAttr(loader, node, value); - } else if (!strcmp(key, "transform")) { - node->transform = _parseTransformationMatrix(value); - } else { - return _parseStyleAttr(loader, key, value); - } - return true; -} - - -static SvgNode* _createImageNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::Image); - - if (!loader->svgParse->node) return nullptr; - - func(buf, bufLength, _attrParseImageNode, loader); - return loader->svgParse->node; -} - - -static SvgNode* _getDefsNode(SvgNode* node) -{ - if (!node) return nullptr; - - while (node->parent != nullptr) { - node = node->parent; - } - - if (node->type == SvgNodeType::Doc) return node->node.doc.defs; - if (node->type == SvgNodeType::Defs) return node; - - return nullptr; -} - - -static SvgNode* _findNodeById(SvgNode *node, const char* id) -{ - if (!node) return nullptr; - - SvgNode* result = nullptr; - if (node->id && !strcmp(node->id, id)) return node; - - if (node->child.count > 0) { - auto child = node->child.data; - for (uint32_t i = 0; i < node->child.count; ++i, ++child) { - result = _findNodeById(*child, id); - if (result) break; - } - } - return result; -} - - -static SvgNode* _findParentById(SvgNode* node, char* id, SvgNode* doc) -{ - SvgNode *parent = node->parent; - while (parent != nullptr && parent != doc) { - if (parent->id && !strcmp(parent->id, id)) { - return parent; - } - parent = parent->parent; - } - return nullptr; -} - - -static constexpr struct -{ - const char* tag; - SvgParserLengthType type; - int sz; - size_t offset; -} useTags[] = { - {"x", SvgParserLengthType::Horizontal, sizeof("x"), offsetof(SvgUseNode, x)}, - {"y", SvgParserLengthType::Vertical, sizeof("y"), offsetof(SvgUseNode, y)}, - {"width", SvgParserLengthType::Horizontal, sizeof("width"), offsetof(SvgUseNode, w)}, - {"height", SvgParserLengthType::Vertical, sizeof("height"), offsetof(SvgUseNode, h)} -}; - - -static void _cloneNode(SvgNode* from, SvgNode* parent, int depth); -static bool _attrParseUseNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgNode *defs, *nodeFrom, *node = loader->svgParse->node; - char* id; - - SvgUseNode* use = &(node->node.use); - int sz = strlen(key); - unsigned char* array = (unsigned char*)use; - for (unsigned int i = 0; i < sizeof(useTags) / sizeof(useTags[0]); i++) { - if (useTags[i].sz - 1 == sz && !strncmp(useTags[i].tag, key, sz)) { - *((float*)(array + useTags[i].offset)) = _toFloat(loader->svgParse, value, useTags[i].type); - - if (useTags[i].offset == offsetof(SvgUseNode, w)) use->isWidthSet = true; - else if (useTags[i].offset == offsetof(SvgUseNode, h)) use->isHeightSet = true; - - return true; - } - } - - if (!strcmp(key, "href") || !strcmp(key, "xlink:href")) { - id = _idFromHref(value); - defs = _getDefsNode(node); - nodeFrom = _findNodeById(defs, id); - if (nodeFrom) { - if (!_findParentById(node, id, loader->doc)) { - _cloneNode(nodeFrom, node, 0); - if (nodeFrom->type == SvgNodeType::Symbol) use->symbol = nodeFrom; - } else { - TVGLOG("SVG", "%s is ancestor element. This reference is invalid.", id); - } - free(id); - } else { - //some svg export software include element at the end of the file - //if so the 'from' element won't be found now and we have to repeat finding - //after the whole file is parsed - _postpone(loader->cloneNodes, node, id); - } - } else { - return _attrParseGNode(data, key, value); - } - return true; -} - - -static SvgNode* _createUseNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) -{ - loader->svgParse->node = _createNode(parent, SvgNodeType::Use); - - if (!loader->svgParse->node) return nullptr; - - loader->svgParse->node->node.use.isWidthSet = false; - loader->svgParse->node->node.use.isHeightSet = false; - - func(buf, bufLength, _attrParseUseNode, loader); - return loader->svgParse->node; -} - - -//TODO: Implement 'text' primitive -static constexpr struct -{ - const char* tag; - int sz; - FactoryMethod tagHandler; -} graphicsTags[] = { - {"use", sizeof("use"), _createUseNode}, - {"circle", sizeof("circle"), _createCircleNode}, - {"ellipse", sizeof("ellipse"), _createEllipseNode}, - {"path", sizeof("path"), _createPathNode}, - {"polygon", sizeof("polygon"), _createPolygonNode}, - {"rect", sizeof("rect"), _createRectNode}, - {"polyline", sizeof("polyline"), _createPolylineNode}, - {"line", sizeof("line"), _createLineNode}, - {"image", sizeof("image"), _createImageNode} -}; - - -static constexpr struct -{ - const char* tag; - int sz; - FactoryMethod tagHandler; -} groupTags[] = { - {"defs", sizeof("defs"), _createDefsNode}, - {"g", sizeof("g"), _createGNode}, - {"svg", sizeof("svg"), _createSvgNode}, - {"mask", sizeof("mask"), _createMaskNode}, - {"clipPath", sizeof("clipPath"), _createClipPathNode}, - {"style", sizeof("style"), _createCssStyleNode}, - {"symbol", sizeof("symbol"), _createSymbolNode} -}; - - -#define FIND_FACTORY(Short_Name, Tags_Array) \ - static FactoryMethod \ - _find##Short_Name##Factory(const char* name) \ - { \ - unsigned int i; \ - int sz = strlen(name); \ - \ - for (i = 0; i < sizeof(Tags_Array) / sizeof(Tags_Array[0]); i++) { \ - if (Tags_Array[i].sz - 1 == sz && !strncmp(Tags_Array[i].tag, name, sz)) { \ - return Tags_Array[i].tagHandler; \ - } \ - } \ - return nullptr; \ - } - -FIND_FACTORY(Group, groupTags) -FIND_FACTORY(Graphics, graphicsTags) - - -FillSpread _parseSpreadValue(const char* value) -{ - auto spread = FillSpread::Pad; - - if (!strcmp(value, "reflect")) { - spread = FillSpread::Reflect; - } else if (!strcmp(value, "repeat")) { - spread = FillSpread::Repeat; - } - - return spread; -} - - -static void _handleRadialCxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value) -{ - radial->cx = _gradientToFloat(loader->svgParse, value, radial->isCxPercentage); - if (!loader->svgParse->gradient.parsedFx) { - radial->fx = radial->cx; - radial->isFxPercentage = radial->isCxPercentage; - } -} - - -static void _handleRadialCyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value) -{ - radial->cy = _gradientToFloat(loader->svgParse, value, radial->isCyPercentage); - if (!loader->svgParse->gradient.parsedFy) { - radial->fy = radial->cy; - radial->isFyPercentage = radial->isCyPercentage; - } -} - - -static void _handleRadialFxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value) -{ - radial->fx = _gradientToFloat(loader->svgParse, value, radial->isFxPercentage); - loader->svgParse->gradient.parsedFx = true; -} - - -static void _handleRadialFyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value) -{ - radial->fy = _gradientToFloat(loader->svgParse, value, radial->isFyPercentage); - loader->svgParse->gradient.parsedFy = true; -} - - -static void _handleRadialFrAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value) -{ - radial->fr = _gradientToFloat(loader->svgParse, value, radial->isFrPercentage); -} - - -static void _handleRadialRAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value) -{ - radial->r = _gradientToFloat(loader->svgParse, value, radial->isRPercentage); -} - - -static void _recalcRadialCxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) -{ - if (userSpace && !radial->isCxPercentage) radial->cx = radial->cx / loader->svgParse->global.w; -} - - -static void _recalcRadialCyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) -{ - if (userSpace && !radial->isCyPercentage) radial->cy = radial->cy / loader->svgParse->global.h; -} - - -static void _recalcRadialFxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) -{ - if (userSpace && !radial->isFxPercentage) radial->fx = radial->fx / loader->svgParse->global.w; -} - - -static void _recalcRadialFyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) -{ - if (userSpace && !radial->isFyPercentage) radial->fy = radial->fy / loader->svgParse->global.h; -} - - -static void _recalcRadialFrAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) -{ - // scaling factor based on the Units paragraph from : https://www.w3.org/TR/2015/WD-SVG2-20150915/coords.html - if (userSpace && !radial->isFrPercentage) radial->fr = radial->fr / (sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0)); -} - - -static void _recalcRadialRAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) -{ - // scaling factor based on the Units paragraph from : https://www.w3.org/TR/2015/WD-SVG2-20150915/coords.html - if (userSpace && !radial->isRPercentage) radial->r = radial->r / (sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0)); -} - - -static void _recalcInheritedRadialCxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) -{ - if (!radial->isCxPercentage) { - if (userSpace) radial->cx /= loader->svgParse->global.w; - else radial->cx *= loader->svgParse->global.w; - } -} - - -static void _recalcInheritedRadialCyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) -{ - if (!radial->isCyPercentage) { - if (userSpace) radial->cy /= loader->svgParse->global.h; - else radial->cy *= loader->svgParse->global.h; - } -} - - -static void _recalcInheritedRadialFxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) -{ - if (!radial->isFxPercentage) { - if (userSpace) radial->fx /= loader->svgParse->global.w; - else radial->fx *= loader->svgParse->global.w; - } -} - - -static void _recalcInheritedRadialFyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) -{ - if (!radial->isFyPercentage) { - if (userSpace) radial->fy /= loader->svgParse->global.h; - else radial->fy *= loader->svgParse->global.h; - } -} - - -static void _recalcInheritedRadialFrAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) -{ - if (!radial->isFrPercentage) { - if (userSpace) radial->fr /= sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0); - else radial->fr *= sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0); - } -} - - -static void _recalcInheritedRadialRAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) -{ - if (!radial->isRPercentage) { - if (userSpace) radial->r /= sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0); - else radial->r *= sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0); - } -} - - -static void _inheritRadialCxAttr(SvgStyleGradient* to, SvgStyleGradient* from) -{ - to->radial->cx = from->radial->cx; - to->radial->isCxPercentage = from->radial->isCxPercentage; - to->flags = (to->flags | SvgGradientFlags::Cx); -} - - -static void _inheritRadialCyAttr(SvgStyleGradient* to, SvgStyleGradient* from) -{ - to->radial->cy = from->radial->cy; - to->radial->isCyPercentage = from->radial->isCyPercentage; - to->flags = (to->flags | SvgGradientFlags::Cy); -} - - -static void _inheritRadialFxAttr(SvgStyleGradient* to, SvgStyleGradient* from) -{ - to->radial->fx = from->radial->fx; - to->radial->isFxPercentage = from->radial->isFxPercentage; - to->flags = (to->flags | SvgGradientFlags::Fx); -} - - -static void _inheritRadialFyAttr(SvgStyleGradient* to, SvgStyleGradient* from) -{ - to->radial->fy = from->radial->fy; - to->radial->isFyPercentage = from->radial->isFyPercentage; - to->flags = (to->flags | SvgGradientFlags::Fy); -} - - -static void _inheritRadialFrAttr(SvgStyleGradient* to, SvgStyleGradient* from) -{ - to->radial->fr = from->radial->fr; - to->radial->isFrPercentage = from->radial->isFrPercentage; - to->flags = (to->flags | SvgGradientFlags::Fr); -} - - -static void _inheritRadialRAttr(SvgStyleGradient* to, SvgStyleGradient* from) -{ - to->radial->r = from->radial->r; - to->radial->isRPercentage = from->radial->isRPercentage; - to->flags = (to->flags | SvgGradientFlags::R); -} - - -typedef void (*radialMethod)(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value); -typedef void (*radialInheritMethod)(SvgStyleGradient* to, SvgStyleGradient* from); -typedef void (*radialMethodRecalc)(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace); - - -#define RADIAL_DEF(Name, Name1, Flag) \ - { \ -#Name, sizeof(#Name), _handleRadial##Name1##Attr, _inheritRadial##Name1##Attr, _recalcRadial##Name1##Attr, _recalcInheritedRadial##Name1##Attr, Flag \ - } - - -static constexpr struct -{ - const char* tag; - int sz; - radialMethod tagHandler; - radialInheritMethod tagInheritHandler; - radialMethodRecalc tagRecalc; - radialMethodRecalc tagInheritedRecalc; - SvgGradientFlags flag; -} radialTags[] = { - RADIAL_DEF(cx, Cx, SvgGradientFlags::Cx), - RADIAL_DEF(cy, Cy, SvgGradientFlags::Cy), - RADIAL_DEF(fx, Fx, SvgGradientFlags::Fx), - RADIAL_DEF(fy, Fy, SvgGradientFlags::Fy), - RADIAL_DEF(r, R, SvgGradientFlags::R), - RADIAL_DEF(fr, Fr, SvgGradientFlags::Fr) -}; - - -static bool _attrParseRadialGradientNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgStyleGradient* grad = loader->svgParse->styleGrad; - SvgRadialGradient* radial = grad->radial; - int sz = strlen(key); - - for (unsigned int i = 0; i < sizeof(radialTags) / sizeof(radialTags[0]); i++) { - if (radialTags[i].sz - 1 == sz && !strncmp(radialTags[i].tag, key, sz)) { - radialTags[i].tagHandler(loader, radial, value); - grad->flags = (grad->flags | radialTags[i].flag); - return true; - } - } - - if (!strcmp(key, "id")) { - if (grad->id && value) free(grad->id); - grad->id = _copyId(value); - } else if (!strcmp(key, "spreadMethod")) { - grad->spread = _parseSpreadValue(value); - grad->flags = (grad->flags | SvgGradientFlags::SpreadMethod); - } else if (!strcmp(key, "href") || !strcmp(key, "xlink:href")) { - if (grad->ref && value) free(grad->ref); - grad->ref = _idFromHref(value); - } else if (!strcmp(key, "gradientUnits")) { - if (!strcmp(value, "userSpaceOnUse")) grad->userSpace = true; - grad->flags = (grad->flags | SvgGradientFlags::GradientUnits); - } else if (!strcmp(key, "gradientTransform")) { - grad->transform = _parseTransformationMatrix(value); - } else { - return false; - } - - return true; -} - - -static SvgStyleGradient* _createRadialGradient(SvgLoaderData* loader, const char* buf, unsigned bufLength) -{ - auto grad = (SvgStyleGradient*)(calloc(1, sizeof(SvgStyleGradient))); - loader->svgParse->styleGrad = grad; - - grad->flags = SvgGradientFlags::None; - grad->type = SvgGradientType::Radial; - grad->userSpace = false; - grad->radial = (SvgRadialGradient*)calloc(1, sizeof(SvgRadialGradient)); - if (!grad->radial) { - grad->clear(); - free(grad); - return nullptr; - } - /** - * Default values of gradient transformed into global percentage - */ - grad->radial->cx = 0.5f; - grad->radial->cy = 0.5f; - grad->radial->fx = 0.5f; - grad->radial->fy = 0.5f; - grad->radial->r = 0.5f; - grad->radial->isCxPercentage = true; - grad->radial->isCyPercentage = true; - grad->radial->isFxPercentage = true; - grad->radial->isFyPercentage = true; - grad->radial->isRPercentage = true; - grad->radial->isFrPercentage = true; - - loader->svgParse->gradient.parsedFx = false; - loader->svgParse->gradient.parsedFy = false; - simpleXmlParseAttributes(buf, bufLength, - _attrParseRadialGradientNode, loader); - - for (unsigned int i = 0; i < sizeof(radialTags) / sizeof(radialTags[0]); i++) { - radialTags[i].tagRecalc(loader, grad->radial, grad->userSpace); - } - - return loader->svgParse->styleGrad; -} - - -static bool _attrParseStopsStyle(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - auto stop = &loader->svgParse->gradStop; - - if (!strcmp(key, "stop-opacity")) { - stop->a = _toOpacity(value); - loader->svgParse->flags = (loader->svgParse->flags | SvgStopStyleFlags::StopOpacity); - } else if (!strcmp(key, "stop-color")) { - if (_toColor(value, &stop->r, &stop->g, &stop->b, nullptr)) { - loader->svgParse->flags = (loader->svgParse->flags | SvgStopStyleFlags::StopColor); - } - } else { - return false; - } - - return true; -} - - -static bool _attrParseStops(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - auto stop = &loader->svgParse->gradStop; - - if (!strcmp(key, "offset")) { - stop->offset = _toOffset(value); - } else if (!strcmp(key, "stop-opacity")) { - if (!(loader->svgParse->flags & SvgStopStyleFlags::StopOpacity)) { - stop->a = _toOpacity(value); - } - } else if (!strcmp(key, "stop-color")) { - if (!(loader->svgParse->flags & SvgStopStyleFlags::StopColor)) { - _toColor(value, &stop->r, &stop->g, &stop->b, nullptr); - } - } else if (!strcmp(key, "style")) { - simpleXmlParseW3CAttribute(value, strlen(value), _attrParseStopsStyle, data); - } else { - return false; - } - - return true; -} - - -static void _handleLinearX1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value) -{ - linear->x1 = _gradientToFloat(loader->svgParse, value, linear->isX1Percentage); -} - - -static void _handleLinearY1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value) -{ - linear->y1 = _gradientToFloat(loader->svgParse, value, linear->isY1Percentage); -} - - -static void _handleLinearX2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value) -{ - linear->x2 = _gradientToFloat(loader->svgParse, value, linear->isX2Percentage); -} - - -static void _handleLinearY2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value) -{ - linear->y2 = _gradientToFloat(loader->svgParse, value, linear->isY2Percentage); -} - - -static void _recalcLinearX1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) -{ - if (userSpace && !linear->isX1Percentage) linear->x1 = linear->x1 / loader->svgParse->global.w; -} - - -static void _recalcLinearY1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) -{ - if (userSpace && !linear->isY1Percentage) linear->y1 = linear->y1 / loader->svgParse->global.h; -} - - -static void _recalcLinearX2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) -{ - if (userSpace && !linear->isX2Percentage) linear->x2 = linear->x2 / loader->svgParse->global.w; -} - - -static void _recalcLinearY2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) -{ - if (userSpace && !linear->isY2Percentage) linear->y2 = linear->y2 / loader->svgParse->global.h; -} - - -static void _recalcInheritedLinearX1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) -{ - if (!linear->isX1Percentage) { - if (userSpace) linear->x1 /= loader->svgParse->global.w; - else linear->x1 *= loader->svgParse->global.w; - } -} - - -static void _recalcInheritedLinearX2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) -{ - if (!linear->isX2Percentage) { - if (userSpace) linear->x2 /= loader->svgParse->global.w; - else linear->x2 *= loader->svgParse->global.w; - } -} - - -static void _recalcInheritedLinearY1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) -{ - if (!linear->isY1Percentage) { - if (userSpace) linear->y1 /= loader->svgParse->global.h; - else linear->y1 *= loader->svgParse->global.h; - } -} - - -static void _recalcInheritedLinearY2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) -{ - if (!linear->isY2Percentage) { - if (userSpace) linear->y2 /= loader->svgParse->global.h; - else linear->y2 *= loader->svgParse->global.h; - } -} - - -static void _inheritLinearX1Attr(SvgStyleGradient* to, SvgStyleGradient* from) -{ - to->linear->x1 = from->linear->x1; - to->linear->isX1Percentage = from->linear->isX1Percentage; - to->flags = (to->flags | SvgGradientFlags::X1); -} - - -static void _inheritLinearX2Attr(SvgStyleGradient* to, SvgStyleGradient* from) -{ - to->linear->x2 = from->linear->x2; - to->linear->isX2Percentage = from->linear->isX2Percentage; - to->flags = (to->flags | SvgGradientFlags::X2); -} - - -static void _inheritLinearY1Attr(SvgStyleGradient* to, SvgStyleGradient* from) -{ - to->linear->y1 = from->linear->y1; - to->linear->isY1Percentage = from->linear->isY1Percentage; - to->flags = (to->flags | SvgGradientFlags::Y1); -} - - -static void _inheritLinearY2Attr(SvgStyleGradient* to, SvgStyleGradient* from) -{ - to->linear->y2 = from->linear->y2; - to->linear->isY2Percentage = from->linear->isY2Percentage; - to->flags = (to->flags | SvgGradientFlags::Y2); -} - - -typedef void (*Linear_Method)(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value); -typedef void (*Linear_Inherit_Method)(SvgStyleGradient* to, SvgStyleGradient* from); -typedef void (*Linear_Method_Recalc)(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace); - - -#define LINEAR_DEF(Name, Name1, Flag) \ - { \ -#Name, sizeof(#Name), _handleLinear##Name1##Attr, _inheritLinear##Name1##Attr, _recalcLinear##Name1##Attr, _recalcInheritedLinear##Name1##Attr, Flag \ - } - - -static constexpr struct -{ - const char* tag; - int sz; - Linear_Method tagHandler; - Linear_Inherit_Method tagInheritHandler; - Linear_Method_Recalc tagRecalc; - Linear_Method_Recalc tagInheritedRecalc; - SvgGradientFlags flag; -} linear_tags[] = { - LINEAR_DEF(x1, X1, SvgGradientFlags::X1), - LINEAR_DEF(y1, Y1, SvgGradientFlags::Y1), - LINEAR_DEF(x2, X2, SvgGradientFlags::X2), - LINEAR_DEF(y2, Y2, SvgGradientFlags::Y2) -}; - - -static bool _attrParseLinearGradientNode(void* data, const char* key, const char* value) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - SvgStyleGradient* grad = loader->svgParse->styleGrad; - SvgLinearGradient* linear = grad->linear; - int sz = strlen(key); - - for (unsigned int i = 0; i < sizeof(linear_tags) / sizeof(linear_tags[0]); i++) { - if (linear_tags[i].sz - 1 == sz && !strncmp(linear_tags[i].tag, key, sz)) { - linear_tags[i].tagHandler(loader, linear, value); - grad->flags = (grad->flags | linear_tags[i].flag); - return true; - } - } - - if (!strcmp(key, "id")) { - if (grad->id && value) free(grad->id); - grad->id = _copyId(value); - } else if (!strcmp(key, "spreadMethod")) { - grad->spread = _parseSpreadValue(value); - grad->flags = (grad->flags | SvgGradientFlags::SpreadMethod); - } else if (!strcmp(key, "href") || !strcmp(key, "xlink:href")) { - if (grad->ref && value) free(grad->ref); - grad->ref = _idFromHref(value); - } else if (!strcmp(key, "gradientUnits")) { - if (!strcmp(value, "userSpaceOnUse")) grad->userSpace = true; - grad->flags = (grad->flags | SvgGradientFlags::GradientUnits); - } else if (!strcmp(key, "gradientTransform")) { - grad->transform = _parseTransformationMatrix(value); - } else { - return false; - } - - return true; -} - - -static SvgStyleGradient* _createLinearGradient(SvgLoaderData* loader, const char* buf, unsigned bufLength) -{ - auto grad = (SvgStyleGradient*)(calloc(1, sizeof(SvgStyleGradient))); - loader->svgParse->styleGrad = grad; - - grad->flags = SvgGradientFlags::None; - grad->type = SvgGradientType::Linear; - grad->userSpace = false; - grad->linear = (SvgLinearGradient*)calloc(1, sizeof(SvgLinearGradient)); - if (!grad->linear) { - grad->clear(); - free(grad); - return nullptr; - } - /** - * Default value of x2 is 100% - transformed to the global percentage - */ - grad->linear->x2 = 1.0f; - grad->linear->isX2Percentage = true; - - simpleXmlParseAttributes(buf, bufLength, _attrParseLinearGradientNode, loader); - - for (unsigned int i = 0; i < sizeof(linear_tags) / sizeof(linear_tags[0]); i++) { - linear_tags[i].tagRecalc(loader, grad->linear, grad->userSpace); - } - - return loader->svgParse->styleGrad; -} - - -#define GRADIENT_DEF(Name, Name1) \ - { \ -#Name, sizeof(#Name), _create##Name1 \ - } - - -/** - * In the case when the gradients lengths are given as numbers (not percentages) - * in the current user coordinate system, they are recalculated into percentages - * related to the canvas width and height. - */ -static constexpr struct -{ - const char* tag; - int sz; - GradientFactoryMethod tagHandler; -} gradientTags[] = { - GRADIENT_DEF(linearGradient, LinearGradient), - GRADIENT_DEF(radialGradient, RadialGradient) -}; - - -static GradientFactoryMethod _findGradientFactory(const char* name) -{ - int sz = strlen(name); - - for (unsigned int i = 0; i < sizeof(gradientTags) / sizeof(gradientTags[0]); i++) { - if (gradientTags[i].sz - 1 == sz && !strncmp(gradientTags[i].tag, name, sz)) { - return gradientTags[i].tagHandler; - } - } - return nullptr; -} - - -static void _cloneGradStops(Array& dst, const Array& src) -{ - for (uint32_t i = 0; i < src.count; ++i) { - dst.push(src[i]); - } -} - - -static void _inheritGradient(SvgLoaderData* loader, SvgStyleGradient* to, SvgStyleGradient* from) -{ - if (!to || !from) return; - - if (!(to->flags & SvgGradientFlags::SpreadMethod) && (from->flags & SvgGradientFlags::SpreadMethod)) { - to->spread = from->spread; - to->flags = (to->flags | SvgGradientFlags::SpreadMethod); - } - bool gradUnitSet = (to->flags & SvgGradientFlags::GradientUnits); - if (!(to->flags & SvgGradientFlags::GradientUnits) && (from->flags & SvgGradientFlags::GradientUnits)) { - to->userSpace = from->userSpace; - to->flags = (to->flags | SvgGradientFlags::GradientUnits); - } - - if (!to->transform && from->transform) { - to->transform = (Matrix*)malloc(sizeof(Matrix)); - if (to->transform) memcpy(to->transform, from->transform, sizeof(Matrix)); - } - - if (to->type == SvgGradientType::Linear) { - for (unsigned int i = 0; i < sizeof(linear_tags) / sizeof(linear_tags[0]); i++) { - bool coordSet = to->flags & linear_tags[i].flag; - if (!(to->flags & linear_tags[i].flag) && (from->flags & linear_tags[i].flag)) { - linear_tags[i].tagInheritHandler(to, from); - } - - //GradUnits not set directly, coord set - if (!gradUnitSet && coordSet) { - linear_tags[i].tagRecalc(loader, to->linear, to->userSpace); - } - //GradUnits set, coord not set directly - if (to->userSpace == from->userSpace) continue; - if (gradUnitSet && !coordSet) { - linear_tags[i].tagInheritedRecalc(loader, to->linear, to->userSpace); - } - } - } else if (to->type == SvgGradientType::Radial) { - for (unsigned int i = 0; i < sizeof(radialTags) / sizeof(radialTags[0]); i++) { - bool coordSet = (to->flags & radialTags[i].flag); - if (!(to->flags & radialTags[i].flag) && (from->flags & radialTags[i].flag)) { - radialTags[i].tagInheritHandler(to, from); - } - - //GradUnits not set directly, coord set - if (!gradUnitSet && coordSet) { - radialTags[i].tagRecalc(loader, to->radial, to->userSpace); - //If fx and fy are not set, set cx and cy. - if (!strcmp(radialTags[i].tag, "cx") && !(to->flags & SvgGradientFlags::Fx)) to->radial->fx = to->radial->cx; - if (!strcmp(radialTags[i].tag, "cy") && !(to->flags & SvgGradientFlags::Fy)) to->radial->fy = to->radial->cy; - } - //GradUnits set, coord not set directly - if (to->userSpace == from->userSpace) continue; - if (gradUnitSet && !coordSet) { - //If fx and fx are not set, do not call recalc. - if (!strcmp(radialTags[i].tag, "fx") && !(to->flags & SvgGradientFlags::Fx)) continue; - if (!strcmp(radialTags[i].tag, "fy") && !(to->flags & SvgGradientFlags::Fy)) continue; - radialTags[i].tagInheritedRecalc(loader, to->radial, to->userSpace); - } - } - } - - if (to->stops.empty()) _cloneGradStops(to->stops, from->stops); -} - - -static SvgStyleGradient* _cloneGradient(SvgStyleGradient* from) -{ - if (!from) return nullptr; - - auto grad = (SvgStyleGradient*)(calloc(1, sizeof(SvgStyleGradient))); - if (!grad) return nullptr; - - grad->type = from->type; - grad->id = from->id ? _copyId(from->id) : nullptr; - grad->ref = from->ref ? _copyId(from->ref) : nullptr; - grad->spread = from->spread; - grad->userSpace = from->userSpace; - grad->flags = from->flags; - - if (from->transform) { - grad->transform = (Matrix*)calloc(1, sizeof(Matrix)); - if (grad->transform) memcpy(grad->transform, from->transform, sizeof(Matrix)); - } - - if (grad->type == SvgGradientType::Linear) { - grad->linear = (SvgLinearGradient*)calloc(1, sizeof(SvgLinearGradient)); - if (!grad->linear) goto error_grad_alloc; - memcpy(grad->linear, from->linear, sizeof(SvgLinearGradient)); - } else if (grad->type == SvgGradientType::Radial) { - grad->radial = (SvgRadialGradient*)calloc(1, sizeof(SvgRadialGradient)); - if (!grad->radial) goto error_grad_alloc; - memcpy(grad->radial, from->radial, sizeof(SvgRadialGradient)); - } - - _cloneGradStops(grad->stops, from->stops); - - return grad; - - error_grad_alloc: - if (grad) { - grad->clear(); - free(grad); - } - return nullptr; -} - - -static void _styleInherit(SvgStyleProperty* child, const SvgStyleProperty* parent) -{ - if (parent == nullptr) return; - //Inherit the property of parent if not present in child. - if (!child->curColorSet) { - child->color = parent->color; - child->curColorSet = parent->curColorSet; - } - if (!(child->flags & SvgStyleFlags::PaintOrder)) { - child->paintOrder = parent->paintOrder; - } - //Fill - if (!(child->fill.flags & SvgFillFlags::Paint)) { - child->fill.paint.color = parent->fill.paint.color; - child->fill.paint.none = parent->fill.paint.none; - child->fill.paint.curColor = parent->fill.paint.curColor; - if (parent->fill.paint.url) { - if (child->fill.paint.url) free(child->fill.paint.url); - child->fill.paint.url = _copyId(parent->fill.paint.url); - } - } - if (!(child->fill.flags & SvgFillFlags::Opacity)) { - child->fill.opacity = parent->fill.opacity; - } - if (!(child->fill.flags & SvgFillFlags::FillRule)) { - child->fill.fillRule = parent->fill.fillRule; - } - //Stroke - if (!(child->stroke.flags & SvgStrokeFlags::Paint)) { - child->stroke.paint.color = parent->stroke.paint.color; - child->stroke.paint.none = parent->stroke.paint.none; - child->stroke.paint.curColor = parent->stroke.paint.curColor; - if (parent->stroke.paint.url) { - if (child->stroke.paint.url) free(child->stroke.paint.url); - child->stroke.paint.url = _copyId(parent->stroke.paint.url); - } - } - if (!(child->stroke.flags & SvgStrokeFlags::Opacity)) { - child->stroke.opacity = parent->stroke.opacity; - } - if (!(child->stroke.flags & SvgStrokeFlags::Width)) { - child->stroke.width = parent->stroke.width; - } - if (!(child->stroke.flags & SvgStrokeFlags::Dash)) { - if (parent->stroke.dash.array.count > 0) { - child->stroke.dash.array.clear(); - child->stroke.dash.array.reserve(parent->stroke.dash.array.count); - for (uint32_t i = 0; i < parent->stroke.dash.array.count; ++i) { - child->stroke.dash.array.push(parent->stroke.dash.array[i]); - } - } - } - if (!(child->stroke.flags & SvgStrokeFlags::DashOffset)) { - child->stroke.dash.offset = parent->stroke.dash.offset; - } - if (!(child->stroke.flags & SvgStrokeFlags::Cap)) { - child->stroke.cap = parent->stroke.cap; - } - if (!(child->stroke.flags & SvgStrokeFlags::Join)) { - child->stroke.join = parent->stroke.join; - } - if (!(child->stroke.flags & SvgStrokeFlags::Miterlimit)) { - child->stroke.miterlimit = parent->stroke.miterlimit; - } -} - - -static void _styleCopy(SvgStyleProperty* to, const SvgStyleProperty* from) -{ - if (from == nullptr) return; - //Copy the properties of 'from' only if they were explicitly set (not the default ones). - if (from->curColorSet) { - to->color = from->color; - to->curColorSet = true; - } - if (from->flags & SvgStyleFlags::Opacity) { - to->opacity = from->opacity; - } - if (from->flags & SvgStyleFlags::PaintOrder) { - to->paintOrder = from->paintOrder; - } - if (from->flags & SvgStyleFlags::Display) { - to->display = from->display; - } - //Fill - to->fill.flags = (to->fill.flags | from->fill.flags); - if (from->fill.flags & SvgFillFlags::Paint) { - to->fill.paint.color = from->fill.paint.color; - to->fill.paint.none = from->fill.paint.none; - to->fill.paint.curColor = from->fill.paint.curColor; - if (from->fill.paint.url) { - if (to->fill.paint.url) free(to->fill.paint.url); - to->fill.paint.url = _copyId(from->fill.paint.url); - } - } - if (from->fill.flags & SvgFillFlags::Opacity) { - to->fill.opacity = from->fill.opacity; - } - if (from->fill.flags & SvgFillFlags::FillRule) { - to->fill.fillRule = from->fill.fillRule; - } - //Stroke - to->stroke.flags = (to->stroke.flags | from->stroke.flags); - if (from->stroke.flags & SvgStrokeFlags::Paint) { - to->stroke.paint.color = from->stroke.paint.color; - to->stroke.paint.none = from->stroke.paint.none; - to->stroke.paint.curColor = from->stroke.paint.curColor; - if (from->stroke.paint.url) { - if (to->stroke.paint.url) free(to->stroke.paint.url); - to->stroke.paint.url = _copyId(from->stroke.paint.url); - } - } - if (from->stroke.flags & SvgStrokeFlags::Opacity) { - to->stroke.opacity = from->stroke.opacity; - } - if (from->stroke.flags & SvgStrokeFlags::Width) { - to->stroke.width = from->stroke.width; - } - if (from->stroke.flags & SvgStrokeFlags::Dash) { - if (from->stroke.dash.array.count > 0) { - to->stroke.dash.array.clear(); - to->stroke.dash.array.reserve(from->stroke.dash.array.count); - for (uint32_t i = 0; i < from->stroke.dash.array.count; ++i) { - to->stroke.dash.array.push(from->stroke.dash.array[i]); - } - } - } - if (from->stroke.flags & SvgStrokeFlags::DashOffset) { - to->stroke.dash.offset = from->stroke.dash.offset; - } - if (from->stroke.flags & SvgStrokeFlags::Cap) { - to->stroke.cap = from->stroke.cap; - } - if (from->stroke.flags & SvgStrokeFlags::Join) { - to->stroke.join = from->stroke.join; - } - if (from->stroke.flags & SvgStrokeFlags::Miterlimit) { - to->stroke.miterlimit = from->stroke.miterlimit; - } -} - - -static void _copyAttr(SvgNode* to, const SvgNode* from) -{ - //Copy matrix attribute - if (from->transform) { - to->transform = (Matrix*)malloc(sizeof(Matrix)); - if (to->transform) *to->transform = *from->transform; - } - //Copy style attribute - _styleCopy(to->style, from->style); - to->style->flags = (to->style->flags | from->style->flags); - if (from->style->clipPath.url) { - if (to->style->clipPath.url) free(to->style->clipPath.url); - to->style->clipPath.url = strdup(from->style->clipPath.url); - } - if (from->style->mask.url) { - if (to->style->mask.url) free(to->style->mask.url); - to->style->mask.url = strdup(from->style->mask.url); - } - - //Copy node attribute - switch (from->type) { - case SvgNodeType::Circle: { - to->node.circle.cx = from->node.circle.cx; - to->node.circle.cy = from->node.circle.cy; - to->node.circle.r = from->node.circle.r; - break; - } - case SvgNodeType::Ellipse: { - to->node.ellipse.cx = from->node.ellipse.cx; - to->node.ellipse.cy = from->node.ellipse.cy; - to->node.ellipse.rx = from->node.ellipse.rx; - to->node.ellipse.ry = from->node.ellipse.ry; - break; - } - case SvgNodeType::Rect: { - to->node.rect.x = from->node.rect.x; - to->node.rect.y = from->node.rect.y; - to->node.rect.w = from->node.rect.w; - to->node.rect.h = from->node.rect.h; - to->node.rect.rx = from->node.rect.rx; - to->node.rect.ry = from->node.rect.ry; - to->node.rect.hasRx = from->node.rect.hasRx; - to->node.rect.hasRy = from->node.rect.hasRy; - break; - } - case SvgNodeType::Line: { - to->node.line.x1 = from->node.line.x1; - to->node.line.y1 = from->node.line.y1; - to->node.line.x2 = from->node.line.x2; - to->node.line.y2 = from->node.line.y2; - break; - } - case SvgNodeType::Path: { - if (from->node.path.path) { - if (to->node.path.path) free(to->node.path.path); - to->node.path.path = strdup(from->node.path.path); - } - break; - } - case SvgNodeType::Polygon: { - if ((to->node.polygon.pts.count = from->node.polygon.pts.count)) { - to->node.polygon.pts = from->node.polygon.pts; - } - break; - } - case SvgNodeType::Polyline: { - if ((to->node.polyline.pts.count = from->node.polyline.pts.count)) { - to->node.polyline.pts = from->node.polyline.pts; - } - break; - } - case SvgNodeType::Image: { - to->node.image.x = from->node.image.x; - to->node.image.y = from->node.image.y; - to->node.image.w = from->node.image.w; - to->node.image.h = from->node.image.h; - if (from->node.image.href) { - if (to->node.image.href) free(to->node.image.href); - to->node.image.href = strdup(from->node.image.href); - } - break; - } - case SvgNodeType::Use: { - to->node.use.x = from->node.use.x; - to->node.use.y = from->node.use.y; - to->node.use.w = from->node.use.w; - to->node.use.h = from->node.use.h; - to->node.use.isWidthSet = from->node.use.isWidthSet; - to->node.use.isHeightSet = from->node.use.isHeightSet; - to->node.use.symbol = from->node.use.symbol; - break; - } - default: { - break; - } - } -} - - -static void _cloneNode(SvgNode* from, SvgNode* parent, int depth) -{ - /* Exception handling: Prevent invalid SVG data input. - The size is the arbitrary value, we need an experimental size. */ - if (depth == 8192) { - TVGERR("SVG", "Infinite recursive call - stopped after %d calls! Svg file may be incorrectly formatted.", depth); - return; - } - - SvgNode* newNode; - if (!from || !parent || from == parent) return; - - newNode = _createNode(parent, from->type); - if (!newNode) return; - - _styleInherit(newNode->style, parent->style); - _copyAttr(newNode, from); - - auto child = from->child.data; - for (uint32_t i = 0; i < from->child.count; ++i, ++child) { - _cloneNode(*child, newNode, depth + 1); - } -} - - -static void _clonePostponedNodes(Array* cloneNodes, SvgNode* doc) -{ - for (uint32_t i = 0; i < cloneNodes->count; ++i) { - auto nodeIdPair = (*cloneNodes)[i]; - auto defs = _getDefsNode(nodeIdPair.node); - auto nodeFrom = _findNodeById(defs, nodeIdPair.id); - if (!nodeFrom) nodeFrom = _findNodeById(doc, nodeIdPair.id); - if (!_findParentById(nodeIdPair.node, nodeIdPair.id, doc)) { - _cloneNode(nodeFrom, nodeIdPair.node, 0); - if (nodeFrom && nodeFrom->type == SvgNodeType::Symbol && nodeIdPair.node->type == SvgNodeType::Use) { - nodeIdPair.node->node.use.symbol = nodeFrom; - } - } else { - TVGLOG("SVG", "%s is ancestor element. This reference is invalid.", nodeIdPair.id); - } - free(nodeIdPair.id); - } -} - - -static constexpr struct -{ - const char* tag; - size_t sz; -} popArray[] = { - {"g", sizeof("g")}, - {"svg", sizeof("svg")}, - {"defs", sizeof("defs")}, - {"mask", sizeof("mask")}, - {"clipPath", sizeof("clipPath")}, - {"style", sizeof("style")}, - {"symbol", sizeof("symbol")} -}; - - -static void _svgLoaderParserXmlClose(SvgLoaderData* loader, const char* content) -{ - content = _skipSpace(content, nullptr); - - for (unsigned int i = 0; i < sizeof(popArray) / sizeof(popArray[0]); i++) { - if (!strncmp(content, popArray[i].tag, popArray[i].sz - 1)) { - loader->stack.pop(); - break; - } - } - - for (unsigned int i = 0; i < sizeof(graphicsTags) / sizeof(graphicsTags[0]); i++) { - if (!strncmp(content, graphicsTags[i].tag, graphicsTags[i].sz - 1)) { - loader->currentGraphicsNode = nullptr; - loader->stack.pop(); - break; - } - } - - loader->level--; -} - - -static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content, unsigned int length, bool empty) -{ - const char* attrs = nullptr; - int attrsLength = 0; - int sz = length; - char tagName[20] = ""; - FactoryMethod method; - GradientFactoryMethod gradientMethod; - SvgNode *node = nullptr, *parent = nullptr; - loader->level++; - attrs = simpleXmlFindAttributesTag(content, length); - - if (!attrs) { - //Parse the empty tag - attrs = content; - while ((attrs != nullptr) && *attrs != '>') attrs++; - if (empty) attrs--; - } - - if (attrs) { - //Find out the tag name starting from content till sz length - sz = attrs - content; - while ((sz > 0) && (isspace(content[sz - 1]))) sz--; - if ((unsigned)sz >= sizeof(tagName)) return; - strncpy(tagName, content, sz); - tagName[sz] = '\0'; - attrsLength = length - sz; - } - - if ((method = _findGroupFactory(tagName))) { - //Group - if (empty) return; - if (!loader->doc) { - if (strcmp(tagName, "svg")) return; //Not a valid svg document - node = method(loader, nullptr, attrs, attrsLength, simpleXmlParseAttributes); - loader->doc = node; - } else { - if (!strcmp(tagName, "svg")) return; //Already loaded (SvgNodeType::Doc) tag - if (loader->stack.count > 0) parent = loader->stack.last(); - else parent = loader->doc; - if (!strcmp(tagName, "style")) { - // TODO: For now only the first style node is saved. After the css id selector - // is introduced this if condition shouldn't be necessary any more - if (!loader->cssStyle) { - node = method(loader, nullptr, attrs, attrsLength, simpleXmlParseAttributes); - loader->cssStyle = node; - loader->doc->node.doc.style = node; - loader->style = true; - } - } else { - node = method(loader, parent, attrs, attrsLength, simpleXmlParseAttributes); - } - } - - if (!node) return; - if (node->type != SvgNodeType::Defs || !empty) { - loader->stack.push(node); - } - } else if ((method = _findGraphicsFactory(tagName))) { - if (loader->stack.count > 0) parent = loader->stack.last(); - else parent = loader->doc; - node = method(loader, parent, attrs, attrsLength, simpleXmlParseAttributes); - if (node && !empty) { - auto defs = _createDefsNode(loader, nullptr, nullptr, 0, nullptr); - loader->stack.push(defs); - loader->currentGraphicsNode = node; - } - } else if ((gradientMethod = _findGradientFactory(tagName))) { - SvgStyleGradient* gradient; - gradient = gradientMethod(loader, attrs, attrsLength); - //FIXME: The current parsing structure does not distinguish end tags. - // There is no way to know if the currently parsed gradient is in defs. - // If a gradient is declared outside of defs after defs is set, it is included in the gradients of defs. - // But finally, the loader has a gradient style list regardless of defs. - // This is only to support this when multiple gradients are declared, even if no defs are declared. - // refer to: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/defs - if (loader->def && loader->doc->node.doc.defs) { - loader->def->node.defs.gradients.push(gradient); - } else { - loader->gradients.push(gradient); - } - loader->latestGradient = gradient; - } else if (!strcmp(tagName, "stop")) { - if (!loader->latestGradient) { - TVGLOG("SVG", "Stop element is used outside of the Gradient element"); - return; - } - /* default value for opacity */ - loader->svgParse->gradStop = {0.0f, 0, 0, 0, 255}; - loader->svgParse->flags = SvgStopStyleFlags::StopDefault; - simpleXmlParseAttributes(attrs, attrsLength, _attrParseStops, loader); - loader->latestGradient->stops.push(loader->svgParse->gradStop); - } else if (!isIgnoreUnsupportedLogElements(tagName)) { - TVGLOG("SVG", "Unsupported elements used [Elements: %s]", tagName); - } -} - - -static void _svgLoaderParserXmlCssStyle(SvgLoaderData* loader, const char* content, unsigned int length) -{ - char* tag; - char* name; - const char* attrs = nullptr; - unsigned int attrsLength = 0; - - FactoryMethod method; - GradientFactoryMethod gradientMethod; - SvgNode *node = nullptr; - - while (auto next = simpleXmlParseCSSAttribute(content, length, &tag, &name, &attrs, &attrsLength)) { - if ((method = _findGroupFactory(tag))) { - if ((node = method(loader, loader->cssStyle, attrs, attrsLength, simpleXmlParseW3CAttribute))) node->id = _copyId(name); - } else if ((method = _findGraphicsFactory(tag))) { - if ((node = method(loader, loader->cssStyle, attrs, attrsLength, simpleXmlParseW3CAttribute))) node->id = _copyId(name); - } else if ((gradientMethod = _findGradientFactory(tag))) { - TVGLOG("SVG", "Unsupported elements used in the internal CSS style sheets [Elements: %s]", tag); - } else if (!strcmp(tag, "stop")) { - TVGLOG("SVG", "Unsupported elements used in the internal CSS style sheets [Elements: %s]", tag); - } else if (!strcmp(tag, "all")) { - if ((node = _createCssStyleNode(loader, loader->cssStyle, attrs, attrsLength, simpleXmlParseW3CAttribute))) node->id = _copyId(name); - } else if (!isIgnoreUnsupportedLogElements(tag)) { - TVGLOG("SVG", "Unsupported elements used in the internal CSS style sheets [Elements: %s]", tag); - } - - length -= next - content; - content = next; - - free(tag); - free(name); - } - loader->style = false; -} - - -static bool _svgLoaderParser(void* data, SimpleXMLType type, const char* content, unsigned int length) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - - switch (type) { - case SimpleXMLType::Open: { - _svgLoaderParserXmlOpen(loader, content, length, false); - break; - } - case SimpleXMLType::OpenEmpty: { - _svgLoaderParserXmlOpen(loader, content, length, true); - break; - } - case SimpleXMLType::Close: { - _svgLoaderParserXmlClose(loader, content); - break; - } - case SimpleXMLType::Data: - case SimpleXMLType::CData: { - if (loader->style) _svgLoaderParserXmlCssStyle(loader, content, length); - break; - } - case SimpleXMLType::DoctypeChild: { - break; - } - case SimpleXMLType::Ignored: - case SimpleXMLType::Comment: - case SimpleXMLType::Doctype: { - break; - } - default: { - break; - } - } - - return true; -} - - -static void _inefficientNodeCheck(TVG_UNUSED SvgNode* node) -{ -#ifdef THORVG_LOG_ENABLED - auto type = simpleXmlNodeTypeToString(node->type); - - if (!node->style->display && node->type != SvgNodeType::ClipPath) TVGLOG("SVG", "Inefficient elements used [Display is none][Node Type : %s]", type); - if (node->style->opacity == 0) TVGLOG("SVG", "Inefficient elements used [Opacity is zero][Node Type : %s]", type); - if (node->style->fill.opacity == 0 && node->style->stroke.opacity == 0) TVGLOG("SVG", "Inefficient elements used [Fill opacity and stroke opacity are zero][Node Type : %s]", type); - - switch (node->type) { - case SvgNodeType::Path: { - if (!node->node.path.path) TVGLOG("SVG", "Inefficient elements used [Empty path][Node Type : %s]", type); - break; - } - case SvgNodeType::Ellipse: { - if (node->node.ellipse.rx == 0 && node->node.ellipse.ry == 0) TVGLOG("SVG", "Inefficient elements used [Size is zero][Node Type : %s]", type); - break; - } - case SvgNodeType::Polygon: - case SvgNodeType::Polyline: { - if (node->node.polygon.pts.count < 2) TVGLOG("SVG", "Inefficient elements used [Invalid Polygon][Node Type : %s]", type); - break; - } - case SvgNodeType::Circle: { - if (node->node.circle.r == 0) TVGLOG("SVG", "Inefficient elements used [Size is zero][Node Type : %s]", type); - break; - } - case SvgNodeType::Rect: { - if (node->node.rect.w == 0 && node->node.rect.h) TVGLOG("SVG", "Inefficient elements used [Size is zero][Node Type : %s]", type); - break; - } - case SvgNodeType::Line: { - if (node->node.line.x1 == node->node.line.x2 && node->node.line.y1 == node->node.line.y2) TVGLOG("SVG", "Inefficient elements used [Size is zero][Node Type : %s]", type); - break; - } - default: break; - } -#endif -} - - -static void _updateStyle(SvgNode* node, SvgStyleProperty* parentStyle) -{ - _styleInherit(node->style, parentStyle); - _inefficientNodeCheck(node); - - auto child = node->child.data; - for (uint32_t i = 0; i < node->child.count; ++i, ++child) { - _updateStyle(*child, node->style); - } -} - - -static SvgStyleGradient* _gradientDup(SvgLoaderData* loader, Array* gradients, const char* id) -{ - SvgStyleGradient* result = nullptr; - - auto gradList = gradients->data; - - for (uint32_t i = 0; i < gradients->count; ++i) { - if ((*gradList)->id && !strcmp((*gradList)->id, id)) { - result = _cloneGradient(*gradList); - break; - } - ++gradList; - } - - if (result && result->ref) { - gradList = gradients->data; - for (uint32_t i = 0; i < gradients->count; ++i) { - if ((*gradList)->id && !strcmp((*gradList)->id, result->ref)) { - _inheritGradient(loader, result, *gradList); - break; - } - ++gradList; - } - } - - return result; -} - - -static void _updateGradient(SvgLoaderData* loader, SvgNode* node, Array* gradients) -{ - if (node->child.count > 0) { - auto child = node->child.data; - for (uint32_t i = 0; i < node->child.count; ++i, ++child) { - _updateGradient(loader, *child, gradients); - } - } else { - if (node->style->fill.paint.url) { - auto newGrad = _gradientDup(loader, gradients, node->style->fill.paint.url); - if (newGrad) { - if (node->style->fill.paint.gradient) { - node->style->fill.paint.gradient->clear(); - free(node->style->fill.paint.gradient); - } - node->style->fill.paint.gradient = newGrad; - } - } - if (node->style->stroke.paint.url) { - auto newGrad = _gradientDup(loader, gradients, node->style->stroke.paint.url); - if (newGrad) { - if (node->style->stroke.paint.gradient) { - node->style->stroke.paint.gradient->clear(); - free(node->style->stroke.paint.gradient); - } - node->style->stroke.paint.gradient = newGrad; - } - } - } -} - - -static void _updateComposite(SvgNode* node, SvgNode* root) -{ - if (node->style->clipPath.url && !node->style->clipPath.node) { - SvgNode* findResult = _findNodeById(root, node->style->clipPath.url); - if (findResult) node->style->clipPath.node = findResult; - } - if (node->style->mask.url && !node->style->mask.node) { - SvgNode* findResult = _findNodeById(root, node->style->mask.url); - if (findResult) node->style->mask.node = findResult; - } - if (node->child.count > 0) { - auto child = node->child.data; - for (uint32_t i = 0; i < node->child.count; ++i, ++child) { - _updateComposite(*child, root); - } - } -} - - -static void _freeNodeStyle(SvgStyleProperty* style) -{ - if (!style) return; - - //style->clipPath.node and style->mask.node has only the addresses of node. Therefore, node is released from _freeNode. - free(style->clipPath.url); - free(style->mask.url); - free(style->cssClass); - - if (style->fill.paint.gradient) { - style->fill.paint.gradient->clear(); - free(style->fill.paint.gradient); - } - if (style->stroke.paint.gradient) { - style->stroke.paint.gradient->clear(); - free(style->stroke.paint.gradient); - } - free(style->fill.paint.url); - free(style->stroke.paint.url); - style->stroke.dash.array.reset(); - free(style); -} - - -static void _freeNode(SvgNode* node) -{ - if (!node) return; - - auto child = node->child.data; - for (uint32_t i = 0; i < node->child.count; ++i, ++child) { - _freeNode(*child); - } - node->child.reset(); - - free(node->id); - free(node->transform); - _freeNodeStyle(node->style); - switch (node->type) { - case SvgNodeType::Path: { - free(node->node.path.path); - break; - } - case SvgNodeType::Polygon: { - free(node->node.polygon.pts.data); - break; - } - case SvgNodeType::Polyline: { - free(node->node.polyline.pts.data); - break; - } - case SvgNodeType::Doc: { - _freeNode(node->node.doc.defs); - _freeNode(node->node.doc.style); - break; - } - case SvgNodeType::Defs: { - auto gradients = node->node.defs.gradients.data; - for (size_t i = 0; i < node->node.defs.gradients.count; ++i) { - (*gradients)->clear(); - free(*gradients); - ++gradients; - } - node->node.defs.gradients.reset(); - break; - } - case SvgNodeType::Image: { - free(node->node.image.href); - break; - } - default: { - break; - } - } - free(node); -} - - -static bool _svgLoaderParserForValidCheckXmlOpen(SvgLoaderData* loader, const char* content, unsigned int length) -{ - const char* attrs = nullptr; - int sz = length; - char tagName[20] = ""; - FactoryMethod method; - SvgNode *node = nullptr; - int attrsLength = 0; - loader->level++; - attrs = simpleXmlFindAttributesTag(content, length); - - if (!attrs) { - //Parse the empty tag - attrs = content; - while ((attrs != nullptr) && *attrs != '>') attrs++; - } - - if (attrs) { - sz = attrs - content; - while ((sz > 0) && (isspace(content[sz - 1]))) sz--; - if ((unsigned)sz >= sizeof(tagName)) return false; - strncpy(tagName, content, sz); - tagName[sz] = '\0'; - attrsLength = length - sz; - } - - if ((method = _findGroupFactory(tagName))) { - if (!loader->doc) { - if (strcmp(tagName, "svg")) return true; //Not a valid svg document - node = method(loader, nullptr, attrs, attrsLength, simpleXmlParseAttributes); - loader->doc = node; - loader->stack.push(node); - return false; - } - } - return true; -} - - -static bool _svgLoaderParserForValidCheck(void* data, SimpleXMLType type, const char* content, unsigned int length) -{ - SvgLoaderData* loader = (SvgLoaderData*)data; - bool res = true;; - - switch (type) { - case SimpleXMLType::Open: - case SimpleXMLType::OpenEmpty: { - //If 'res' is false, it means tag is found. - res = _svgLoaderParserForValidCheckXmlOpen(loader, content, length); - break; - } - default: { - break; - } - } - - return res; -} - - -void SvgLoader::clear(bool all) -{ - //flush out the intermediate data - free(loaderData.svgParse); - loaderData.svgParse = nullptr; - - for (auto gradient = loaderData.gradients.begin(); gradient < loaderData.gradients.end(); ++gradient) { - (*gradient)->clear(); - free(*gradient); - } - loaderData.gradients.reset(); - - _freeNode(loaderData.doc); - loaderData.doc = nullptr; - loaderData.stack.reset(); - - if (!all) return; - - for (auto p = loaderData.images.begin(); p < loaderData.images.end(); ++p) { - free(*p); - } - loaderData.images.reset(); - - if (copy) free((char*)content); - - delete(root); - root = nullptr; - - size = 0; - content = nullptr; - copy = false; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -SvgLoader::SvgLoader() : ImageLoader(FileType::Svg) -{ -} - - -SvgLoader::~SvgLoader() -{ - this->done(); - clear(); -} - - -void SvgLoader::run(unsigned tid) -{ - //According to the SVG standard the value of the width/height of the viewbox set to 0 disables rendering - if ((viewFlag & SvgViewFlag::Viewbox) && (fabsf(vw) <= FLOAT_EPSILON || fabsf(vh) <= FLOAT_EPSILON)) { - TVGLOG("SVG", "The width and/or height set to 0 - rendering disabled."); - root = Scene::gen().release(); - return; - } - - if (!simpleXmlParse(content, size, true, _svgLoaderParser, &(loaderData))) return; - - if (loaderData.doc) { - auto defs = loaderData.doc->node.doc.defs; - - if (loaderData.nodesToStyle.count > 0) cssApplyStyleToPostponeds(loaderData.nodesToStyle, loaderData.cssStyle); - if (loaderData.cssStyle) cssUpdateStyle(loaderData.doc, loaderData.cssStyle); - - if (loaderData.cloneNodes.count > 0) _clonePostponedNodes(&loaderData.cloneNodes, loaderData.doc); - - _updateComposite(loaderData.doc, loaderData.doc); - if (defs) _updateComposite(loaderData.doc, defs); - - _updateStyle(loaderData.doc, nullptr); - if (defs) _updateStyle(defs, nullptr); - - if (loaderData.gradients.count > 0) _updateGradient(&loaderData, loaderData.doc, &loaderData.gradients); - if (defs) _updateGradient(&loaderData, loaderData.doc, &defs->node.defs.gradients); - } - root = svgSceneBuild(loaderData, {vx, vy, vw, vh}, w, h, align, meetOrSlice, svgPath, viewFlag); - - //In case no viewbox and width/height data is provided the completion of loading - //has to be forced, in order to establish this data based on the whole picture. - if (!(viewFlag & SvgViewFlag::Viewbox)) { - //Override viewbox & size again after svg loading. - vx = loaderData.doc->node.doc.vx; - vy = loaderData.doc->node.doc.vy; - vw = loaderData.doc->node.doc.vw; - vh = loaderData.doc->node.doc.vh; - w = loaderData.doc->node.doc.w; - h = loaderData.doc->node.doc.h; - } - - clear(false); -} - - -bool SvgLoader::header() -{ - //For valid check, only tag is parsed first. - //If the tag is found, the loaded file is valid and stores viewbox information. - //After that, the remaining content data is parsed in order with async. - loaderData.svgParse = (SvgParser*)malloc(sizeof(SvgParser)); - if (!loaderData.svgParse) return false; - - loaderData.svgParse->flags = SvgStopStyleFlags::StopDefault; - viewFlag = SvgViewFlag::None; - - simpleXmlParse(content, size, true, _svgLoaderParserForValidCheck, &(loaderData)); - - if (loaderData.doc && loaderData.doc->type == SvgNodeType::Doc) { - viewFlag = loaderData.doc->node.doc.viewFlag; - align = loaderData.doc->node.doc.align; - meetOrSlice = loaderData.doc->node.doc.meetOrSlice; - - if (viewFlag & SvgViewFlag::Viewbox) { - vx = loaderData.doc->node.doc.vx; - vy = loaderData.doc->node.doc.vy; - vw = loaderData.doc->node.doc.vw; - vh = loaderData.doc->node.doc.vh; - - if (viewFlag & SvgViewFlag::Width) w = loaderData.doc->node.doc.w; - else { - w = loaderData.doc->node.doc.vw; - if (viewFlag & SvgViewFlag::WidthInPercent) { - w *= loaderData.doc->node.doc.w; - viewFlag = (viewFlag ^ SvgViewFlag::WidthInPercent); - } - viewFlag = (viewFlag | SvgViewFlag::Width); - } - if (viewFlag & SvgViewFlag::Height) h = loaderData.doc->node.doc.h; - else { - h = loaderData.doc->node.doc.vh; - if (viewFlag & SvgViewFlag::HeightInPercent) { - h *= loaderData.doc->node.doc.h; - viewFlag = (viewFlag ^ SvgViewFlag::HeightInPercent); - } - viewFlag = (viewFlag | SvgViewFlag::Height); - } - //In case no viewbox and width/height data is provided the completion of loading - //has to be forced, in order to establish this data based on the whole picture. - } else { - //Before loading, set default viewbox & size if they are empty - vx = vy = 0.0f; - if (viewFlag & SvgViewFlag::Width) { - vw = w = loaderData.doc->node.doc.w; - } else { - vw = 1.0f; - if (viewFlag & SvgViewFlag::WidthInPercent) { - w = loaderData.doc->node.doc.w; - } else w = 1.0f; - } - - if (viewFlag & SvgViewFlag::Height) { - vh = h = loaderData.doc->node.doc.h; - } else { - vh = 1.0f; - if (viewFlag & SvgViewFlag::HeightInPercent) { - h = loaderData.doc->node.doc.h; - } else h = 1.0f; - } - - run(0); - } - - return true; - } - - TVGLOG("SVG", "No SVG File. There is no "); - return false; -} - - -bool SvgLoader::open(const char* data, uint32_t size, bool copy) -{ - clear(); - - if (copy) { - content = (char*)malloc(size + 1); - if (!content) return false; - memcpy((char*)content, data, size); - content[size] = '\0'; - } else content = (char*)data; - - this->size = size; - this->copy = copy; - - return header(); -} - - -bool SvgLoader::open(const string& path) -{ - clear(); - - ifstream f; - f.open(path); - - if (!f.is_open()) return false; - - svgPath = path; - getline(f, filePath, '\0'); - f.close(); - - if (filePath.empty()) return false; - - content = (char*)filePath.c_str(); - size = filePath.size(); - - return header(); -} - - -bool SvgLoader::resize(Paint* paint, float w, float h) -{ - if (!paint) return false; - - auto sx = w / this->w; - auto sy = h / this->h; - Matrix m = {sx, 0, 0, 0, sy, 0, 0, 0, 1}; - paint->transform(m); - - return true; -} - - -bool SvgLoader::read() -{ - if (!content || size == 0) return false; - - //the loading has been already completed in header() - if (root || !LoadModule::read()) return true; - - TaskScheduler::request(this); - - return true; -} - - -bool SvgLoader::close() -{ - if (!LoadModule::close()) return false; - this->done(); - clear(); - return true; -} - - -Paint* SvgLoader::paint() -{ - this->done(); - auto ret = root; - root = nullptr; - return ret; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgLoader.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgLoader.h deleted file mode 100644 index d5cd7bb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgLoader.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_SVG_LOADER_H_ -#define _TVG_SVG_LOADER_H_ - -#include "tvgTaskScheduler.h" -#include "tvgSvgLoaderCommon.h" - -class SvgLoader : public ImageLoader, public Task -{ -public: - string filePath; - string svgPath = ""; - char* content = nullptr; - uint32_t size = 0; - - SvgLoaderData loaderData; - Scene* root = nullptr; - - bool copy = false; - - SvgLoader(); - ~SvgLoader(); - - bool open(const string& path) override; - bool open(const char* data, uint32_t size, bool copy) override; - bool resize(Paint* paint, float w, float h) override; - bool read() override; - bool close() override; - - Paint* paint() override; - -private: - SvgViewFlag viewFlag = SvgViewFlag::None; - AspectRatioAlign align = AspectRatioAlign::XMidYMid; - AspectRatioMeetOrSlice meetOrSlice = AspectRatioMeetOrSlice::Meet; - float vx = 0; - float vy = 0; - float vw = 0; - float vh = 0; - - bool header(); - void clear(bool all = true); - void run(unsigned tid) override; -}; - - -#endif //_TVG_SVG_LOADER_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgLoaderCommon.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgLoaderCommon.h deleted file mode 100644 index b037390..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgLoaderCommon.h +++ /dev/null @@ -1,577 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_SVG_LOADER_COMMON_H_ -#define _TVG_SVG_LOADER_COMMON_H_ - -#include "tvgCommon.h" -#include "tvgArray.h" - -struct SvgNode; -struct SvgStyleGradient; - -//NOTE: Please update simpleXmlNodeTypeToString() as well. -enum class SvgNodeType -{ - Doc, - G, - Defs, - Animation, - Arc, - Circle, - Ellipse, - Image, - Line, - Path, - Polygon, - Polyline, - Rect, - Text, - TextArea, - Tspan, - Use, - Video, - ClipPath, - Mask, - CssStyle, - Symbol, - Unknown -}; - -/* -// TODO - remove? -enum class SvgLengthType -{ - Percent, - Px, - Pc, - Pt, - Mm, - Cm, - In, -}; -*/ - -enum class SvgFillFlags -{ - Paint = 0x01, - Opacity = 0x02, - Gradient = 0x04, - FillRule = 0x08, - ClipPath = 0x16 -}; - -constexpr bool operator &(SvgFillFlags a, SvgFillFlags b) -{ - return int(a) & int(b); -} - -constexpr SvgFillFlags operator |(SvgFillFlags a, SvgFillFlags b) -{ - return SvgFillFlags(int(a) | int(b)); -} - -enum class SvgStrokeFlags -{ - Paint = 0x1, - Opacity = 0x2, - Gradient = 0x4, - Scale = 0x8, - Width = 0x10, - Cap = 0x20, - Join = 0x40, - Dash = 0x80, - Miterlimit = 0x100, - DashOffset = 0x200 -}; - -constexpr bool operator &(SvgStrokeFlags a, SvgStrokeFlags b) -{ - return int(a) & int(b); -} - -constexpr SvgStrokeFlags operator |(SvgStrokeFlags a, SvgStrokeFlags b) -{ - return SvgStrokeFlags(int(a) | int(b)); -} - - -enum class SvgGradientType -{ - Linear, - Radial -}; - -enum class SvgStyleFlags -{ - Color = 0x01, - Fill = 0x02, - FillRule = 0x04, - FillOpacity = 0x08, - Opacity = 0x010, - Stroke = 0x20, - StrokeWidth = 0x40, - StrokeLineJoin = 0x80, - StrokeLineCap = 0x100, - StrokeOpacity = 0x200, - StrokeDashArray = 0x400, - Transform = 0x800, - ClipPath = 0x1000, - Mask = 0x2000, - MaskType = 0x4000, - Display = 0x8000, - PaintOrder = 0x10000, - StrokeMiterlimit = 0x20000, - StrokeDashOffset = 0x40000, -}; - -constexpr bool operator &(SvgStyleFlags a, SvgStyleFlags b) -{ - return int(a) & int(b); -} - -constexpr SvgStyleFlags operator |(SvgStyleFlags a, SvgStyleFlags b) -{ - return SvgStyleFlags(int(a) | int(b)); -} - -enum class SvgStopStyleFlags -{ - StopDefault = 0x0, - StopOpacity = 0x01, - StopColor = 0x02 -}; - -constexpr bool operator &(SvgStopStyleFlags a, SvgStopStyleFlags b) -{ - return int(a) & int(b); -} - -constexpr SvgStopStyleFlags operator |(SvgStopStyleFlags a, SvgStopStyleFlags b) -{ - return SvgStopStyleFlags(int(a) | int(b)); -} - -enum class SvgGradientFlags -{ - None = 0x0, - GradientUnits = 0x1, - SpreadMethod = 0x2, - X1 = 0x4, - X2 = 0x8, - Y1 = 0x10, - Y2 = 0x20, - Cx = 0x40, - Cy = 0x80, - R = 0x100, - Fx = 0x200, - Fy = 0x400, - Fr = 0x800 -}; - -constexpr bool operator &(SvgGradientFlags a, SvgGradientFlags b) -{ - return int(a) & int(b); -} - -constexpr SvgGradientFlags operator |(SvgGradientFlags a, SvgGradientFlags b) -{ - return SvgGradientFlags(int(a) | int(b)); -} - -enum class SvgFillRule -{ - Winding = 0, - OddEven = 1 -}; - -enum class SvgMaskType -{ - Luminance = 0, - Alpha -}; - -//Length type to recalculate %, pt, pc, mm, cm etc -enum class SvgParserLengthType -{ - Vertical, - Horizontal, - //In case of, for example, radius of radial gradient - Other -}; - -enum class SvgViewFlag -{ - None = 0x0, - Width = 0x01, //viewPort width - Height = 0x02, //viewPort height - Viewbox = 0x04, //viewBox x,y,w,h - used only if all 4 are correctly set - WidthInPercent = 0x08, - HeightInPercent = 0x10 -}; - -constexpr bool operator &(SvgViewFlag a, SvgViewFlag b) -{ - return static_cast(a) & static_cast(b); -} - -constexpr SvgViewFlag operator |(SvgViewFlag a, SvgViewFlag b) -{ - return SvgViewFlag(int(a) | int(b)); -} - -constexpr SvgViewFlag operator ^(SvgViewFlag a, SvgViewFlag b) -{ - return SvgViewFlag(int(a) ^ int(b)); -} - -enum class AspectRatioAlign -{ - None, - XMinYMin, - XMidYMin, - XMaxYMin, - XMinYMid, - XMidYMid, - XMaxYMid, - XMinYMax, - XMidYMax, - XMaxYMax -}; - -enum class AspectRatioMeetOrSlice -{ - Meet, - Slice -}; - -struct SvgDocNode -{ - float w; //unit: point or in percentage see: SvgViewFlag - float h; //unit: point or in percentage see: SvgViewFlag - float vx; - float vy; - float vw; - float vh; - SvgViewFlag viewFlag; - SvgNode* defs; - SvgNode* style; - AspectRatioAlign align; - AspectRatioMeetOrSlice meetOrSlice; -}; - -struct SvgGNode -{ -}; - -struct SvgDefsNode -{ - Array gradients; -}; - -struct SvgSymbolNode -{ - float w, h; - float vx, vy, vw, vh; - AspectRatioAlign align; - AspectRatioMeetOrSlice meetOrSlice; - bool overflowVisible; - bool hasViewBox; - bool hasWidth; - bool hasHeight; -}; - -struct SvgUseNode -{ - float x, y, w, h; - bool isWidthSet; - bool isHeightSet; - SvgNode* symbol; -}; - -struct SvgEllipseNode -{ - float cx; - float cy; - float rx; - float ry; -}; - -struct SvgCircleNode -{ - float cx; - float cy; - float r; -}; - -struct SvgRectNode -{ - float x; - float y; - float w; - float h; - float rx; - float ry; - bool hasRx; - bool hasRy; -}; - -struct SvgLineNode -{ - float x1; - float y1; - float x2; - float y2; -}; - -struct SvgImageNode -{ - float x, y, w, h; - char* href; -}; - -struct SvgPathNode -{ - char* path; -}; - -struct SvgPolygonNode -{ - Array pts; -}; - -struct SvgClipNode -{ - bool userSpace; -}; - -struct SvgMaskNode -{ - SvgMaskType type; - bool userSpace; -}; - -struct SvgCssStyleNode -{ -}; - -struct SvgLinearGradient -{ - float x1; - float y1; - float x2; - float y2; - bool isX1Percentage; - bool isY1Percentage; - bool isX2Percentage; - bool isY2Percentage; -}; - -struct SvgRadialGradient -{ - float cx; - float cy; - float fx; - float fy; - float r; - float fr; - bool isCxPercentage; - bool isCyPercentage; - bool isFxPercentage; - bool isFyPercentage; - bool isRPercentage; - bool isFrPercentage; -}; - -struct SvgComposite -{ - char *url; - SvgNode* node; - bool applying; //flag for checking circular dependency. -}; - -struct SvgColor -{ - uint8_t r; - uint8_t g; - uint8_t b; -}; - -struct SvgPaint -{ - SvgStyleGradient* gradient; - char *url; - SvgColor color; - bool none; - bool curColor; -}; - -struct SvgDash -{ - Array array; - float offset; -}; - -struct SvgStyleGradient -{ - SvgGradientType type; - char* id; - char* ref; - FillSpread spread; - SvgRadialGradient* radial; - SvgLinearGradient* linear; - Matrix* transform; - Array stops; - SvgGradientFlags flags; - bool userSpace; - - void clear() - { - stops.reset(); - free(transform); - free(radial); - free(linear); - free(ref); - free(id); - } -}; - -struct SvgStyleFill -{ - SvgFillFlags flags; - SvgPaint paint; - int opacity; - FillRule fillRule; -}; - -struct SvgStyleStroke -{ - SvgStrokeFlags flags; - SvgPaint paint; - int opacity; - float scale; - float width; - float centered; - StrokeCap cap; - StrokeJoin join; - float miterlimit; - SvgDash dash; -}; - -struct SvgStyleProperty -{ - SvgStyleFill fill; - SvgStyleStroke stroke; - SvgComposite clipPath; - SvgComposite mask; - int opacity; - SvgColor color; - char* cssClass; - SvgStyleFlags flags; - SvgStyleFlags flagsImportance; //indicates the importance of the flag - if set, higher priority is applied (https://drafts.csswg.org/css-cascade-4/#importance) - bool curColorSet; - bool paintOrder; //true if default (fill, stroke), false otherwise - bool display; -}; - -struct SvgNode -{ - SvgNodeType type; - SvgNode* parent; - Array child; - char *id; - SvgStyleProperty *style; - Matrix* transform; - union { - SvgGNode g; - SvgDocNode doc; - SvgDefsNode defs; - SvgUseNode use; - SvgCircleNode circle; - SvgEllipseNode ellipse; - SvgPolygonNode polygon; - SvgPolygonNode polyline; - SvgRectNode rect; - SvgPathNode path; - SvgLineNode line; - SvgImageNode image; - SvgMaskNode mask; - SvgClipNode clip; - SvgCssStyleNode cssStyle; - SvgSymbolNode symbol; - } node; - ~SvgNode(); -}; - -struct SvgParser -{ - SvgNode* node; - SvgStyleGradient* styleGrad; - Fill::ColorStop gradStop; - SvgStopStyleFlags flags; - struct - { - float x, y, w, h; - } global; - struct - { - bool parsedFx; - bool parsedFy; - } gradient; -}; - -struct SvgNodeIdPair -{ - SvgNode* node; - char *id; -}; - -struct SvgLoaderData -{ - Array stack; - SvgNode* doc = nullptr; - SvgNode* def = nullptr; - SvgNode* cssStyle = nullptr; - Array gradients; - SvgStyleGradient* latestGradient = nullptr; //For stops - SvgParser* svgParse = nullptr; - Array cloneNodes; - Array nodesToStyle; - Array images; //embedded images - int level = 0; - bool result = false; - bool style = false; - SvgNode* currentGraphicsNode = nullptr; -}; - -struct Box -{ - float x, y, w, h; -}; - -#endif - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgPath.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgPath.cpp deleted file mode 100644 index 42312c3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgPath.cpp +++ /dev/null @@ -1,577 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -/* - * Copyright notice for the EFL: - - * Copyright (C) EFL developers (see AUTHORS) - - * 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. - - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (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 _USE_MATH_DEFINES //Math Constants are not defined in Standard C/C++. - -#include -#include -#include "tvgMath.h" -#include "tvgShape.h" -#include "tvgSvgLoaderCommon.h" -#include "tvgSvgPath.h" -#include "tvgStr.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static char* _skipComma(const char* content) -{ - while (*content && isspace(*content)) { - content++; - } - if (*content == ',') return (char*)content + 1; - return (char*)content; -} - - -static bool _parseNumber(char** content, float* number) -{ - char* end = NULL; - *number = strToFloat(*content, &end); - //If the start of string is not number - if ((*content) == end) return false; - //Skip comma if any - *content = _skipComma(end); - return true; -} - - -static bool _parseFlag(char** content, int* number) -{ - char* end = NULL; - if (*(*content) != '0' && *(*content) != '1') return false; - *number = *(*content) - '0'; - *content += 1; - end = *content; - *content = _skipComma(end); - - return true; -} - - -void _pathAppendArcTo(Array* cmds, Array* pts, Point* cur, Point* curCtl, float x, float y, float rx, float ry, float angle, bool largeArc, bool sweep) -{ - float cxp, cyp, cx, cy; - float sx, sy; - float cosPhi, sinPhi; - float dx2, dy2; - float x1p, y1p; - float x1p2, y1p2; - float rx2, ry2; - float lambda; - float c; - float at; - float theta1, deltaTheta; - float nat; - float delta, bcp; - float cosPhiRx, cosPhiRy; - float sinPhiRx, sinPhiRy; - float cosTheta1, sinTheta1; - int segments; - - //Some helpful stuff is available here: - //http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes - sx = cur->x; - sy = cur->y; - - //Correction of out-of-range radii, see F6.6.1 (step 2) - rx = fabsf(rx); - ry = fabsf(ry); - - angle = mathDeg2Rad(angle); - cosPhi = cosf(angle); - sinPhi = sinf(angle); - dx2 = (sx - x) / 2.0f; - dy2 = (sy - y) / 2.0f; - x1p = cosPhi * dx2 + sinPhi * dy2; - y1p = cosPhi * dy2 - sinPhi * dx2; - x1p2 = x1p * x1p; - y1p2 = y1p * y1p; - rx2 = rx * rx; - ry2 = ry * ry; - lambda = (x1p2 / rx2) + (y1p2 / ry2); - - //Correction of out-of-range radii, see F6.6.2 (step 4) - if (lambda > 1.0f) { - //See F6.6.3 - float lambdaRoot = sqrtf(lambda); - - rx *= lambdaRoot; - ry *= lambdaRoot; - //Update rx2 and ry2 - rx2 = rx * rx; - ry2 = ry * ry; - } - - c = (rx2 * ry2) - (rx2 * y1p2) - (ry2 * x1p2); - - //Check if there is no possible solution - //(i.e. we can't do a square root of a negative value) - if (c < 0.0f) { - //Scale uniformly until we have a single solution - //(see F6.2) i.e. when c == 0.0 - float scale = sqrtf(1.0f - c / (rx2 * ry2)); - rx *= scale; - ry *= scale; - //Update rx2 and ry2 - rx2 = rx * rx; - ry2 = ry * ry; - - //Step 2 (F6.5.2) - simplified since c == 0.0 - cxp = 0.0f; - cyp = 0.0f; - //Step 3 (F6.5.3 first part) - simplified since cxp and cyp == 0.0 - cx = 0.0f; - cy = 0.0f; - } else { - //Complete c calculation - c = sqrtf(c / ((rx2 * y1p2) + (ry2 * x1p2))); - //Inverse sign if Fa == Fs - if (largeArc == sweep) c = -c; - - //Step 2 (F6.5.2) - cxp = c * (rx * y1p / ry); - cyp = c * (-ry * x1p / rx); - - //Step 3 (F6.5.3 first part) - cx = cosPhi * cxp - sinPhi * cyp; - cy = sinPhi * cxp + cosPhi * cyp; - } - - //Step 3 (F6.5.3 second part) we now have the center point of the ellipse - cx += (sx + x) / 2.0f; - cy += (sy + y) / 2.0f; - - //Step 4 (F6.5.4) - //We dont' use arccos (as per w3c doc), see - //http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/index.htm - //Note: atan2 (0.0, 1.0) == 0.0 - at = atan2(((y1p - cyp) / ry), ((x1p - cxp) / rx)); - theta1 = (at < 0.0f) ? 2.0f * MATH_PI + at : at; - - nat = atan2(((-y1p - cyp) / ry), ((-x1p - cxp) / rx)); - deltaTheta = (nat < at) ? 2.0f * MATH_PI - at + nat : nat - at; - - if (sweep) { - //Ensure delta theta < 0 or else add 360 degrees - if (deltaTheta < 0.0f) deltaTheta += 2.0f * MATH_PI; - } else { - //Ensure delta theta > 0 or else substract 360 degrees - if (deltaTheta > 0.0f) deltaTheta -= 2.0f * MATH_PI; - } - - //Add several cubic bezier to approximate the arc - //(smaller than 90 degrees) - //We add one extra segment because we want something - //Smaller than 90deg (i.e. not 90 itself) - segments = static_cast(fabsf(deltaTheta / MATH_PI2) + 1.0f); - delta = deltaTheta / segments; - - //http://www.stillhq.com/ctpfaq/2001/comp.text.pdf-faq-2001-04.txt (section 2.13) - bcp = 4.0f / 3.0f * (1.0f - cosf(delta / 2.0f)) / sinf(delta / 2.0f); - - cosPhiRx = cosPhi * rx; - cosPhiRy = cosPhi * ry; - sinPhiRx = sinPhi * rx; - sinPhiRy = sinPhi * ry; - - cosTheta1 = cosf(theta1); - sinTheta1 = sinf(theta1); - - for (int i = 0; i < segments; ++i) { - //End angle (for this segment) = current + delta - float c1x, c1y, ex, ey, c2x, c2y; - float theta2 = theta1 + delta; - float cosTheta2 = cosf(theta2); - float sinTheta2 = sinf(theta2); - Point p[3]; - - //First control point (based on start point sx,sy) - c1x = sx - bcp * (cosPhiRx * sinTheta1 + sinPhiRy * cosTheta1); - c1y = sy + bcp * (cosPhiRy * cosTheta1 - sinPhiRx * sinTheta1); - - //End point (for this segment) - ex = cx + (cosPhiRx * cosTheta2 - sinPhiRy * sinTheta2); - ey = cy + (sinPhiRx * cosTheta2 + cosPhiRy * sinTheta2); - - //Second control point (based on end point ex,ey) - c2x = ex + bcp * (cosPhiRx * sinTheta2 + sinPhiRy * cosTheta2); - c2y = ey + bcp * (sinPhiRx * sinTheta2 - cosPhiRy * cosTheta2); - cmds->push(PathCommand::CubicTo); - p[0] = {c1x, c1y}; - p[1] = {c2x, c2y}; - p[2] = {ex, ey}; - pts->push(p[0]); - pts->push(p[1]); - pts->push(p[2]); - *curCtl = p[1]; - *cur = p[2]; - - //Next start point is the current end point (same for angle) - sx = ex; - sy = ey; - theta1 = theta2; - //Avoid recomputations - cosTheta1 = cosTheta2; - sinTheta1 = sinTheta2; - } -} - -static int _numberCount(char cmd) -{ - int count = 0; - switch (cmd) { - case 'M': - case 'm': - case 'L': - case 'l': - case 'T': - case 't': { - count = 2; - break; - } - case 'C': - case 'c': - case 'E': - case 'e': { - count = 6; - break; - } - case 'H': - case 'h': - case 'V': - case 'v': { - count = 1; - break; - } - case 'S': - case 's': - case 'Q': - case 'q': { - count = 4; - break; - } - case 'A': - case 'a': { - count = 7; - break; - } - default: - break; - } - return count; -} - - -static bool _processCommand(Array* cmds, Array* pts, char cmd, float* arr, int count, Point* cur, Point* curCtl, Point* startPoint, bool *isQuadratic, bool* closed) -{ - switch (cmd) { - case 'm': - case 'l': - case 'c': - case 's': - case 'q': - case 't': { - for (int i = 0; i < count - 1; i += 2) { - arr[i] = arr[i] + cur->x; - arr[i + 1] = arr[i + 1] + cur->y; - } - break; - } - case 'h': { - arr[0] = arr[0] + cur->x; - break; - } - case 'v': { - arr[0] = arr[0] + cur->y; - break; - } - case 'a': { - arr[5] = arr[5] + cur->x; - arr[6] = arr[6] + cur->y; - break; - } - default: { - break; - } - } - - switch (cmd) { - case 'm': - case 'M': { - Point p = {arr[0], arr[1]}; - cmds->push(PathCommand::MoveTo); - pts->push(p); - *cur = {arr[0], arr[1]}; - *startPoint = {arr[0], arr[1]}; - break; - } - case 'l': - case 'L': { - Point p = {arr[0], arr[1]}; - cmds->push(PathCommand::LineTo); - pts->push(p); - *cur = {arr[0], arr[1]}; - break; - } - case 'c': - case 'C': { - Point p[3]; - cmds->push(PathCommand::CubicTo); - p[0] = {arr[0], arr[1]}; - p[1] = {arr[2], arr[3]}; - p[2] = {arr[4], arr[5]}; - pts->push(p[0]); - pts->push(p[1]); - pts->push(p[2]); - *curCtl = p[1]; - *cur = p[2]; - *isQuadratic = false; - break; - } - case 's': - case 'S': { - Point p[3], ctrl; - if ((cmds->count > 1) && (cmds->last() == PathCommand::CubicTo) && - !(*isQuadratic)) { - ctrl.x = 2 * cur->x - curCtl->x; - ctrl.y = 2 * cur->y - curCtl->y; - } else { - ctrl = *cur; - } - cmds->push(PathCommand::CubicTo); - p[0] = ctrl; - p[1] = {arr[0], arr[1]}; - p[2] = {arr[2], arr[3]}; - pts->push(p[0]); - pts->push(p[1]); - pts->push(p[2]); - *curCtl = p[1]; - *cur = p[2]; - *isQuadratic = false; - break; - } - case 'q': - case 'Q': { - Point p[3]; - float ctrl_x0 = (cur->x + 2 * arr[0]) * (1.0f / 3.0f); - float ctrl_y0 = (cur->y + 2 * arr[1]) * (1.0f / 3.0f); - float ctrl_x1 = (arr[2] + 2 * arr[0]) * (1.0f / 3.0f); - float ctrl_y1 = (arr[3] + 2 * arr[1]) * (1.0f / 3.0f); - cmds->push(PathCommand::CubicTo); - p[0] = {ctrl_x0, ctrl_y0}; - p[1] = {ctrl_x1, ctrl_y1}; - p[2] = {arr[2], arr[3]}; - pts->push(p[0]); - pts->push(p[1]); - pts->push(p[2]); - *curCtl = {arr[0], arr[1]}; - *cur = p[2]; - *isQuadratic = true; - break; - } - case 't': - case 'T': { - Point p[3], ctrl; - if ((cmds->count > 1) && (cmds->last() == PathCommand::CubicTo) && - *isQuadratic) { - ctrl.x = 2 * cur->x - curCtl->x; - ctrl.y = 2 * cur->y - curCtl->y; - } else { - ctrl = *cur; - } - float ctrl_x0 = (cur->x + 2 * ctrl.x) * (1.0f / 3.0f); - float ctrl_y0 = (cur->y + 2 * ctrl.y) * (1.0f / 3.0f); - float ctrl_x1 = (arr[0] + 2 * ctrl.x) * (1.0f / 3.0f); - float ctrl_y1 = (arr[1] + 2 * ctrl.y) * (1.0f / 3.0f); - cmds->push(PathCommand::CubicTo); - p[0] = {ctrl_x0, ctrl_y0}; - p[1] = {ctrl_x1, ctrl_y1}; - p[2] = {arr[0], arr[1]}; - pts->push(p[0]); - pts->push(p[1]); - pts->push(p[2]); - *curCtl = {ctrl.x, ctrl.y}; - *cur = p[2]; - *isQuadratic = true; - break; - } - case 'h': - case 'H': { - Point p = {arr[0], cur->y}; - cmds->push(PathCommand::LineTo); - pts->push(p); - cur->x = arr[0]; - break; - } - case 'v': - case 'V': { - Point p = {cur->x, arr[0]}; - cmds->push(PathCommand::LineTo); - pts->push(p); - cur->y = arr[0]; - break; - } - case 'z': - case 'Z': { - cmds->push(PathCommand::Close); - *cur = *startPoint; - *closed = true; - break; - } - case 'a': - case 'A': { - if (mathZero(arr[0]) || mathZero(arr[1])) { - Point p = {arr[5], arr[6]}; - cmds->push(PathCommand::LineTo); - pts->push(p); - *cur = {arr[5], arr[6]}; - } else if (!mathEqual(cur->x, arr[5]) || !mathEqual(cur->y, arr[6])) { - _pathAppendArcTo(cmds, pts, cur, curCtl, arr[5], arr[6], fabsf(arr[0]), fabsf(arr[1]), arr[2], arr[3], arr[4]); - *cur = *curCtl = {arr[5], arr[6]}; - *isQuadratic = false; - } - break; - } - default: { - return false; - } - } - return true; -} - - -static char* _nextCommand(char* path, char* cmd, float* arr, int* count, bool* closed) -{ - int large, sweep; - - path = _skipComma(path); - if (isalpha(*path)) { - *cmd = *path; - path++; - *count = _numberCount(*cmd); - } else { - if (*cmd == 'm') *cmd = 'l'; - else if (*cmd == 'M') *cmd = 'L'; - else { - if (*closed) return nullptr; - } - } - if (*count == 7) { - //Special case for arc command - if (_parseNumber(&path, &arr[0])) { - if (_parseNumber(&path, &arr[1])) { - if (_parseNumber(&path, &arr[2])) { - if (_parseFlag(&path, &large)) { - if (_parseFlag(&path, &sweep)) { - if (_parseNumber(&path, &arr[5])) { - if (_parseNumber(&path, &arr[6])) { - arr[3] = (float)large; - arr[4] = (float)sweep; - return path; - } - } - } - } - } - } - } - *count = 0; - return NULL; - } - for (int i = 0; i < *count; i++) { - if (!_parseNumber(&path, &arr[i])) { - *count = 0; - return NULL; - } - path = _skipComma(path); - } - return path; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - - -bool svgPathToShape(const char* svgPath, Shape* shape) -{ - float numberArray[7]; - int numberCount = 0; - Point cur = { 0, 0 }; - Point curCtl = { 0, 0 }; - Point startPoint = { 0, 0 }; - char cmd = 0; - bool isQuadratic = false; - bool closed = false; - char* path = (char*)svgPath; - - auto& pts = P(shape)->rs.path.pts; - auto& cmds = P(shape)->rs.path.cmds; - auto lastCmds = cmds.count; - - while ((path[0] != '\0')) { - path = _nextCommand(path, &cmd, numberArray, &numberCount, &closed); - if (!path) break; - closed = false; - if (!_processCommand(&cmds, &pts, cmd, numberArray, numberCount, &cur, &curCtl, &startPoint, &isQuadratic, &closed)) break; - } - - if (cmds.count > lastCmds && cmds[lastCmds] != PathCommand::MoveTo) return false; - return true; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgPath.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgPath.h deleted file mode 100644 index 673fa0d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgPath.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_SVG_PATH_H_ -#define _TVG_SVG_PATH_H_ - -#include "tvgCommon.h" - -bool svgPathToShape(const char* svgPath, Shape* shape); - -#endif //_TVG_SVG_PATH_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgSceneBuilder.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgSceneBuilder.cpp deleted file mode 100644 index 585e487..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgSceneBuilder.cpp +++ /dev/null @@ -1,888 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgMath.h" /* to include math.h before cstring */ -#include -#include -#include "tvgShape.h" -#include "tvgCompressor.h" -#include "tvgPaint.h" -#include "tvgFill.h" -#include "tvgStr.h" -#include "tvgSvgLoaderCommon.h" -#include "tvgSvgSceneBuilder.h" -#include "tvgSvgPath.h" -#include "tvgSvgUtil.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static bool _appendShape(SvgLoaderData& loaderData, SvgNode* node, Shape* shape, const Box& vBox, const string& svgPath); -static bool _appendClipShape(SvgLoaderData& loaderData, SvgNode* node, Shape* shape, const Box& vBox, const string& svgPath, const Matrix* transform); -static unique_ptr _sceneBuildHelper(SvgLoaderData& loaderData, const SvgNode* node, const Box& vBox, const string& svgPath, bool mask, int depth, bool* isMaskWhite = nullptr); - - -static inline bool _isGroupType(SvgNodeType type) -{ - if (type == SvgNodeType::Doc || type == SvgNodeType::G || type == SvgNodeType::Use || type == SvgNodeType::ClipPath || type == SvgNodeType::Symbol) return true; - return false; -} - - -//According to: https://www.w3.org/TR/SVG11/coords.html#ObjectBoundingBoxUnits (the last paragraph) -//a stroke width should be ignored for bounding box calculations -static Box _boundingBox(const Shape* shape) -{ - float x, y, w, h; - shape->bounds(&x, &y, &w, &h, false); - - if (auto strokeW = shape->strokeWidth()) { - x += 0.5f * strokeW; - y += 0.5f * strokeW; - w -= strokeW; - h -= strokeW; - } - - return {x, y, w, h}; -} - - -static void _transformMultiply(const Matrix* mBBox, Matrix* gradTransf) -{ - gradTransf->e13 = gradTransf->e13 * mBBox->e11 + mBBox->e13; - gradTransf->e12 *= mBBox->e11; - gradTransf->e11 *= mBBox->e11; - - gradTransf->e23 = gradTransf->e23 * mBBox->e22 + mBBox->e23; - gradTransf->e22 *= mBBox->e22; - gradTransf->e21 *= mBBox->e22; -} - - -static unique_ptr _applyLinearGradientProperty(SvgStyleGradient* g, const Shape* vg, const Box& vBox, int opacity) -{ - Fill::ColorStop* stops; - int stopCount = 0; - auto fillGrad = LinearGradient::gen(); - - bool isTransform = (g->transform ? true : false); - Matrix finalTransform = {1, 0, 0, 0, 1, 0, 0, 0, 1}; - if (isTransform) finalTransform = *g->transform; - - if (g->userSpace) { - g->linear->x1 = g->linear->x1 * vBox.w; - g->linear->y1 = g->linear->y1 * vBox.h; - g->linear->x2 = g->linear->x2 * vBox.w; - g->linear->y2 = g->linear->y2 * vBox.h; - } else { - Matrix m = {vBox.w, 0, vBox.x, 0, vBox.h, vBox.y, 0, 0, 1}; - if (isTransform) _transformMultiply(&m, &finalTransform); - else { - finalTransform = m; - isTransform = true; - } - } - - if (isTransform) fillGrad->transform(finalTransform); - - fillGrad->linear(g->linear->x1, g->linear->y1, g->linear->x2, g->linear->y2); - fillGrad->spread(g->spread); - - //Update the stops - stopCount = g->stops.count; - if (stopCount > 0) { - stops = (Fill::ColorStop*)calloc(stopCount, sizeof(Fill::ColorStop)); - if (!stops) return fillGrad; - auto prevOffset = 0.0f; - for (uint32_t i = 0; i < g->stops.count; ++i) { - auto colorStop = &g->stops[i]; - //Use premultiplied color - stops[i].r = colorStop->r; - stops[i].g = colorStop->g; - stops[i].b = colorStop->b; - stops[i].a = static_cast((colorStop->a * opacity) / 255); - stops[i].offset = colorStop->offset; - //check the offset corner cases - refer to: https://svgwg.org/svg2-draft/pservers.html#StopNotes - if (colorStop->offset < prevOffset) stops[i].offset = prevOffset; - else if (colorStop->offset > 1) stops[i].offset = 1; - prevOffset = stops[i].offset; - } - fillGrad->colorStops(stops, stopCount); - free(stops); - } - return fillGrad; -} - - -static unique_ptr _applyRadialGradientProperty(SvgStyleGradient* g, const Shape* vg, const Box& vBox, int opacity) -{ - Fill::ColorStop *stops; - int stopCount = 0; - auto fillGrad = RadialGradient::gen(); - - bool isTransform = (g->transform ? true : false); - Matrix finalTransform = {1, 0, 0, 0, 1, 0, 0, 0, 1}; - if (isTransform) finalTransform = *g->transform; - - if (g->userSpace) { - //The radius scaling is done according to the Units section: - //https://www.w3.org/TR/2015/WD-SVG2-20150915/coords.html - g->radial->cx = g->radial->cx * vBox.w; - g->radial->cy = g->radial->cy * vBox.h; - g->radial->r = g->radial->r * sqrtf(powf(vBox.w, 2.0f) + powf(vBox.h, 2.0f)) / sqrtf(2.0f); - g->radial->fx = g->radial->fx * vBox.w; - g->radial->fy = g->radial->fy * vBox.h; - g->radial->fr = g->radial->fr * sqrtf(powf(vBox.w, 2.0f) + powf(vBox.h, 2.0f)) / sqrtf(2.0f); - } else { - Matrix m = {vBox.w, 0, vBox.x, 0, vBox.h, vBox.y, 0, 0, 1}; - if (isTransform) _transformMultiply(&m, &finalTransform); - else { - finalTransform = m; - isTransform = true; - } - } - - if (isTransform) fillGrad->transform(finalTransform); - - P(fillGrad)->radial(g->radial->cx, g->radial->cy, g->radial->r, g->radial->fx, g->radial->fy, g->radial->fr); - fillGrad->spread(g->spread); - - //Update the stops - stopCount = g->stops.count; - if (stopCount > 0) { - stops = (Fill::ColorStop*)calloc(stopCount, sizeof(Fill::ColorStop)); - if (!stops) return fillGrad; - auto prevOffset = 0.0f; - for (uint32_t i = 0; i < g->stops.count; ++i) { - auto colorStop = &g->stops[i]; - //Use premultiplied color - stops[i].r = colorStop->r; - stops[i].g = colorStop->g; - stops[i].b = colorStop->b; - stops[i].a = static_cast((colorStop->a * opacity) / 255); - stops[i].offset = colorStop->offset; - //check the offset corner cases - refer to: https://svgwg.org/svg2-draft/pservers.html#StopNotes - if (colorStop->offset < prevOffset) stops[i].offset = prevOffset; - else if (colorStop->offset > 1) stops[i].offset = 1; - prevOffset = stops[i].offset; - } - fillGrad->colorStops(stops, stopCount); - free(stops); - } - return fillGrad; -} - - -//The SVG standard allows only for 'use' nodes that point directly to a basic shape. -static bool _appendClipUseNode(SvgLoaderData& loaderData, SvgNode* node, Shape* shape, const Box& vBox, const string& svgPath) -{ - if (node->child.count != 1) return false; - auto child = *(node->child.data); - - Matrix finalTransform = {1, 0, 0, 0, 1, 0, 0, 0, 1}; - if (node->transform) finalTransform = *node->transform; - if (node->node.use.x != 0.0f || node->node.use.y != 0.0f) { - Matrix m = {1, 0, node->node.use.x, 0, 1, node->node.use.y, 0, 0, 1}; - finalTransform = mathMultiply(&finalTransform, &m); - } - if (child->transform) finalTransform = mathMultiply(child->transform, &finalTransform); - - return _appendClipShape(loaderData, child, shape, vBox, svgPath, mathIdentity((const Matrix*)(&finalTransform)) ? nullptr : &finalTransform); -} - - -static bool _appendClipChild(SvgLoaderData& loaderData, SvgNode* node, Shape* shape, const Box& vBox, const string& svgPath, bool clip) -{ - if (node->type == SvgNodeType::Use) { - return _appendClipUseNode(loaderData, node, shape, vBox, svgPath); - } - return _appendClipShape(loaderData, node, shape, vBox, svgPath, nullptr); -} - - -static Matrix _compositionTransform(Paint* paint, const SvgNode* node, const SvgNode* compNode, SvgNodeType type) -{ - Matrix m = {1, 0, 0, 0, 1, 0, 0, 0, 1}; - //The initial mask transformation ignored according to the SVG standard. - if (node->transform && type != SvgNodeType::Mask) { - m = *node->transform; - } - if (compNode->transform) { - m = mathMultiply(&m, compNode->transform); - } - if (!compNode->node.clip.userSpace) { - float x, y, w, h; - P(paint)->bounds(&x, &y, &w, &h, false, false); - Matrix mBBox = {w, 0, x, 0, h, y, 0, 0, 1}; - m = mathMultiply(&m, &mBBox); - } - return m; -} - - -static void _applyComposition(SvgLoaderData& loaderData, Paint* paint, const SvgNode* node, const Box& vBox, const string& svgPath) -{ - /* ClipPath */ - /* Do not drop in Circular Dependency for ClipPath. - Composition can be applied recursively if its children nodes have composition target to this one. */ - if (node->style->clipPath.applying) { - TVGLOG("SVG", "Multiple Composition Tried! Check out Circular dependency?"); - } else { - auto compNode = node->style->clipPath.node; - if (compNode && compNode->child.count > 0) { - node->style->clipPath.applying = true; - - auto comp = Shape::gen(); - - auto child = compNode->child.data; - auto valid = false; //Composite only when valid shapes exist - - for (uint32_t i = 0; i < compNode->child.count; ++i, ++child) { - if (_appendClipChild(loaderData, *child, comp.get(), vBox, svgPath, compNode->child.count > 1)) valid = true; - } - - if (valid) { - Matrix finalTransform = _compositionTransform(paint, node, compNode, SvgNodeType::ClipPath); - comp->transform(finalTransform); - - paint->composite(std::move(comp), CompositeMethod::ClipPath); - } - - node->style->clipPath.applying = false; - } - } - - /* Mask */ - /* Do not drop in Circular Dependency for Mask. - Composition can be applied recursively if its children nodes have composition target to this one. */ - if (node->style->mask.applying) { - TVGLOG("SVG", "Multiple Composition Tried! Check out Circular dependency?"); - } else { - auto compNode = node->style->mask.node; - if (compNode && compNode->child.count > 0) { - node->style->mask.applying = true; - - bool isMaskWhite = true; - if (auto comp = _sceneBuildHelper(loaderData, compNode, vBox, svgPath, true, 0, &isMaskWhite)) { - if (!compNode->node.mask.userSpace) { - Matrix finalTransform = _compositionTransform(paint, node, compNode, SvgNodeType::Mask); - comp->transform(finalTransform); - } else { - if (node->transform) comp->transform(*node->transform); - } - - if (compNode->node.mask.type == SvgMaskType::Luminance && !isMaskWhite) { - paint->composite(std::move(comp), CompositeMethod::LumaMask); - } else { - paint->composite(std::move(comp), CompositeMethod::AlphaMask); - } - } - - node->style->mask.applying = false; - } - } -} - - -static void _applyProperty(SvgLoaderData& loaderData, SvgNode* node, Shape* vg, const Box& vBox, const string& svgPath, bool clip) -{ - SvgStyleProperty* style = node->style; - - //Clip transformation is applied directly to the path in the _appendClipShape function - if (node->transform && !clip) vg->transform(*node->transform); - if (node->type == SvgNodeType::Doc || !node->style->display) return; - - //If fill property is nullptr then do nothing - if (style->fill.paint.none) { - //Do nothing - } else if (style->fill.paint.gradient) { - Box bBox = vBox; - if (!style->fill.paint.gradient->userSpace) bBox = _boundingBox(vg); - - if (style->fill.paint.gradient->type == SvgGradientType::Linear) { - auto linear = _applyLinearGradientProperty(style->fill.paint.gradient, vg, bBox, style->fill.opacity); - vg->fill(std::move(linear)); - } else if (style->fill.paint.gradient->type == SvgGradientType::Radial) { - auto radial = _applyRadialGradientProperty(style->fill.paint.gradient, vg, bBox, style->fill.opacity); - vg->fill(std::move(radial)); - } - } else if (style->fill.paint.url) { - //TODO: Apply the color pointed by url - } else if (style->fill.paint.curColor) { - //Apply the current style color - vg->fill(style->color.r, style->color.g, style->color.b, style->fill.opacity); - } else { - //Apply the fill color - vg->fill(style->fill.paint.color.r, style->fill.paint.color.g, style->fill.paint.color.b, style->fill.opacity); - } - - //Apply the fill rule - vg->fill((tvg::FillRule)style->fill.fillRule); - //Rendering order - vg->order(!style->paintOrder); - - //Apply node opacity - if (style->opacity < 255) vg->opacity(style->opacity); - - if (node->type == SvgNodeType::G || node->type == SvgNodeType::Use) return; - - //Apply the stroke style property - vg->stroke(style->stroke.width); - vg->stroke(style->stroke.cap); - vg->stroke(style->stroke.join); - vg->strokeMiterlimit(style->stroke.miterlimit); - if (style->stroke.dash.array.count > 0) { - P(vg)->strokeDash(style->stroke.dash.array.data, style->stroke.dash.array.count, style->stroke.dash.offset); - } - - //If stroke property is nullptr then do nothing - if (style->stroke.paint.none) { - vg->stroke(0.0f); - } else if (style->stroke.paint.gradient) { - Box bBox = vBox; - if (!style->stroke.paint.gradient->userSpace) bBox = _boundingBox(vg); - - if (style->stroke.paint.gradient->type == SvgGradientType::Linear) { - auto linear = _applyLinearGradientProperty(style->stroke.paint.gradient, vg, bBox, style->stroke.opacity); - vg->stroke(std::move(linear)); - } else if (style->stroke.paint.gradient->type == SvgGradientType::Radial) { - auto radial = _applyRadialGradientProperty(style->stroke.paint.gradient, vg, bBox, style->stroke.opacity); - vg->stroke(std::move(radial)); - } - } else if (style->stroke.paint.url) { - //TODO: Apply the color pointed by url - } else if (style->stroke.paint.curColor) { - //Apply the current style color - vg->stroke(style->color.r, style->color.g, style->color.b, style->stroke.opacity); - } else { - //Apply the stroke color - vg->stroke(style->stroke.paint.color.r, style->stroke.paint.color.g, style->stroke.paint.color.b, style->stroke.opacity); - } - - _applyComposition(loaderData, vg, node, vBox, svgPath); -} - - -static unique_ptr _shapeBuildHelper(SvgLoaderData& loaderData, SvgNode* node, const Box& vBox, const string& svgPath) -{ - auto shape = Shape::gen(); - if (_appendShape(loaderData, node, shape.get(), vBox, svgPath)) return shape; - else return nullptr; -} - - -static bool _recognizeShape(SvgNode* node, Shape* shape) -{ - switch (node->type) { - case SvgNodeType::Path: { - if (node->node.path.path) { - if (!svgPathToShape(node->node.path.path, shape)) { - TVGERR("SVG", "Invalid path information."); - return false; - } - } - break; - } - case SvgNodeType::Ellipse: { - shape->appendCircle(node->node.ellipse.cx, node->node.ellipse.cy, node->node.ellipse.rx, node->node.ellipse.ry); - break; - } - case SvgNodeType::Polygon: { - if (node->node.polygon.pts.count < 2) break; - auto pts = node->node.polygon.pts.begin(); - shape->moveTo(pts[0], pts[1]); - for (pts += 2; pts < node->node.polygon.pts.end(); pts += 2) { - shape->lineTo(pts[0], pts[1]); - } - shape->close(); - break; - } - case SvgNodeType::Polyline: { - if (node->node.polyline.pts.count < 2) break; - auto pts = node->node.polyline.pts.begin(); - shape->moveTo(pts[0], pts[1]); - for (pts += 2; pts < node->node.polyline.pts.end(); pts += 2) { - shape->lineTo(pts[0], pts[1]); - } - break; - } - case SvgNodeType::Circle: { - shape->appendCircle(node->node.circle.cx, node->node.circle.cy, node->node.circle.r, node->node.circle.r); - break; - } - case SvgNodeType::Rect: { - shape->appendRect(node->node.rect.x, node->node.rect.y, node->node.rect.w, node->node.rect.h, node->node.rect.rx, node->node.rect.ry); - break; - } - case SvgNodeType::Line: { - shape->moveTo(node->node.line.x1, node->node.line.y1); - shape->lineTo(node->node.line.x2, node->node.line.y2); - break; - } - default: { - return false; - } - } - return true; -} - - -static bool _appendShape(SvgLoaderData& loaderData, SvgNode* node, Shape* shape, const Box& vBox, const string& svgPath) -{ - if (!_recognizeShape(node, shape)) return false; - - _applyProperty(loaderData, node, shape, vBox, svgPath, false); - return true; -} - - -static bool _appendClipShape(SvgLoaderData& loaderData, SvgNode* node, Shape* shape, const Box& vBox, const string& svgPath, const Matrix* transform) -{ - //The 'transform' matrix has higher priority than the node->transform, since it already contains it - auto m = transform ? transform : (node->transform ? node->transform : nullptr); - - uint32_t currentPtsCnt = 0; - if (m) { - const Point *tmp = nullptr; - currentPtsCnt = shape->pathCoords(&tmp); - } - - if (!_recognizeShape(node, shape)) return false; - - if (m) { - const Point *pts = nullptr; - auto ptsCnt = shape->pathCoords(&pts); - - auto p = const_cast(pts) + currentPtsCnt; - while (currentPtsCnt++ < ptsCnt) mathMultiply(p++, m); - } - - _applyProperty(loaderData, node, shape, vBox, svgPath, true); - return true; -} - - -enum class imageMimeTypeEncoding -{ - base64 = 0x1, - utf8 = 0x2 -}; - -constexpr imageMimeTypeEncoding operator|(imageMimeTypeEncoding a, imageMimeTypeEncoding b) { - return static_cast(static_cast(a) | static_cast(b)); -} - -constexpr bool operator&(imageMimeTypeEncoding a, imageMimeTypeEncoding b) { - return (static_cast(a) & static_cast(b)); -} - - -static constexpr struct -{ - const char* name; - int sz; - imageMimeTypeEncoding encoding; -} imageMimeTypes[] = { - {"jpeg", sizeof("jpeg"), imageMimeTypeEncoding::base64}, - {"png", sizeof("png"), imageMimeTypeEncoding::base64}, - {"svg+xml", sizeof("svg+xml"), imageMimeTypeEncoding::base64 | imageMimeTypeEncoding::utf8}, -}; - - -static bool _isValidImageMimeTypeAndEncoding(const char** href, const char** mimetype, imageMimeTypeEncoding* encoding) { - if (strncmp(*href, "image/", sizeof("image/") - 1)) return false; //not allowed mime type - *href += sizeof("image/") - 1; - - //RFC2397 data:[][;base64], - //mediatype := [ type "/" subtype ] *( ";" parameter ) - //parameter := attribute "=" value - for (unsigned int i = 0; i < sizeof(imageMimeTypes) / sizeof(imageMimeTypes[0]); i++) { - if (!strncmp(*href, imageMimeTypes[i].name, imageMimeTypes[i].sz - 1)) { - *href += imageMimeTypes[i].sz - 1; - *mimetype = imageMimeTypes[i].name; - - while (**href && **href != ',') { - while (**href && **href != ';') ++(*href); - if (!**href) return false; - ++(*href); - - if (imageMimeTypes[i].encoding & imageMimeTypeEncoding::base64) { - if (!strncmp(*href, "base64,", sizeof("base64,") - 1)) { - *href += sizeof("base64,") - 1; - *encoding = imageMimeTypeEncoding::base64; - return true; //valid base64 - } - } - if (imageMimeTypes[i].encoding & imageMimeTypeEncoding::utf8) { - if (!strncmp(*href, "utf8,", sizeof("utf8,") - 1)) { - *href += sizeof("utf8,") - 1; - *encoding = imageMimeTypeEncoding::utf8; - return true; //valid utf8 - } - } - } - //no encoding defined - if (**href == ',' && (imageMimeTypes[i].encoding & imageMimeTypeEncoding::utf8)) { - ++(*href); - *encoding = imageMimeTypeEncoding::utf8; - return true; //allow no encoding defined if utf8 expected - } - return false; - } - } - return false; -} - -#include "tvgTaskScheduler.h" - -static unique_ptr _imageBuildHelper(SvgLoaderData& loaderData, SvgNode* node, const Box& vBox, const string& svgPath) -{ - if (!node->node.image.href || !strlen(node->node.image.href)) return nullptr; - auto picture = Picture::gen(); - - TaskScheduler::async(false); //force to load a picture on the same thread - - const char* href = node->node.image.href; - if (!strncmp(href, "data:", sizeof("data:") - 1)) { - href += sizeof("data:") - 1; - const char* mimetype; - imageMimeTypeEncoding encoding; - if (!_isValidImageMimeTypeAndEncoding(&href, &mimetype, &encoding)) return nullptr; //not allowed mime type or encoding - char *decoded = nullptr; - if (encoding == imageMimeTypeEncoding::base64) { - auto size = b64Decode(href, strlen(href), &decoded); - if (picture->load(decoded, size, mimetype, false) != Result::Success) { - free(decoded); - TaskScheduler::async(true); - return nullptr; - } - } else { - auto size = svgUtilURLDecode(href, &decoded); - if (picture->load(decoded, size, mimetype, false) != Result::Success) { - free(decoded); - TaskScheduler::async(true); - return nullptr; - } - } - loaderData.images.push(decoded); - } else { - if (!strncmp(href, "file://", sizeof("file://") - 1)) href += sizeof("file://") - 1; - //TODO: protect against recursive svg image loading - //Temporarily disable embedded svg: - const char *dot = strrchr(href, '.'); - if (dot && !strcmp(dot, ".svg")) { - TVGLOG("SVG", "Embedded svg file is disabled."); - TaskScheduler::async(true); - return nullptr; - } - string imagePath = href; - if (strncmp(href, "/", 1)) { - auto last = svgPath.find_last_of("/"); - imagePath = svgPath.substr(0, (last == string::npos ? 0 : last + 1)) + imagePath; - } - if (picture->load(imagePath) != Result::Success) { - TaskScheduler::async(true); - return nullptr; - } - } - - TaskScheduler::async(true); - - float w, h; - Matrix m = {1, 0, 0, 0, 1, 0, 0, 0, 1}; - if (picture->size(&w, &h) == Result::Success && w > 0 && h > 0) { - auto sx = node->node.image.w / w; - auto sy = node->node.image.h / h; - m = {sx, 0, node->node.image.x, 0, sy, node->node.image.y, 0, 0, 1}; - } - if (node->transform) m = mathMultiply(node->transform, &m); - picture->transform(m); - - _applyComposition(loaderData, picture.get(), node, vBox, svgPath); - - return picture; -} - - -static Matrix _calculateAspectRatioMatrix(AspectRatioAlign align, AspectRatioMeetOrSlice meetOrSlice, float width, float height, const Box& box) -{ - auto sx = width / box.w; - auto sy = height / box.h; - auto tvx = box.x * sx; - auto tvy = box.y * sy; - - if (align == AspectRatioAlign::None) - return {sx, 0, -tvx, 0, sy, -tvy, 0, 0, 1}; - - //Scale - if (meetOrSlice == AspectRatioMeetOrSlice::Meet) { - if (sx < sy) sy = sx; - else sx = sy; - } else { - if (sx < sy) sx = sy; - else sy = sx; - } - - //Align - tvx = box.x * sx; - tvy = box.y * sy; - auto tvw = box.w * sx; - auto tvh = box.h * sy; - - switch (align) { - case AspectRatioAlign::XMinYMin: { - break; - } - case AspectRatioAlign::XMidYMin: { - tvx -= (width - tvw) * 0.5f; - break; - } - case AspectRatioAlign::XMaxYMin: { - tvx -= width - tvw; - break; - } - case AspectRatioAlign::XMinYMid: { - tvy -= (height - tvh) * 0.5f; - break; - } - case AspectRatioAlign::XMidYMid: { - tvx -= (width - tvw) * 0.5f; - tvy -= (height - tvh) * 0.5f; - break; - } - case AspectRatioAlign::XMaxYMid: { - tvx -= width - tvw; - tvy -= (height - tvh) * 0.5f; - break; - } - case AspectRatioAlign::XMinYMax: { - tvy -= height - tvh; - break; - } - case AspectRatioAlign::XMidYMax: { - tvx -= (width - tvw) * 0.5f; - tvy -= height - tvh; - break; - } - case AspectRatioAlign::XMaxYMax: { - tvx -= width - tvw; - tvy -= height - tvh; - break; - } - default: { - break; - } - } - - return {sx, 0, -tvx, 0, sy, -tvy, 0, 0, 1}; -} - - -static unique_ptr _useBuildHelper(SvgLoaderData& loaderData, const SvgNode* node, const Box& vBox, const string& svgPath, int depth, bool* isMaskWhite) -{ - unique_ptr finalScene; - auto scene = _sceneBuildHelper(loaderData, node, vBox, svgPath, false, depth + 1, isMaskWhite); - - // mUseTransform = mUseTransform * mTranslate - Matrix mUseTransform = {1, 0, 0, 0, 1, 0, 0, 0, 1}; - if (node->transform) mUseTransform = *node->transform; - if (node->node.use.x != 0.0f || node->node.use.y != 0.0f) { - Matrix mTranslate = {1, 0, node->node.use.x, 0, 1, node->node.use.y, 0, 0, 1}; - mUseTransform = mathMultiply(&mUseTransform, &mTranslate); - } - - if (node->node.use.symbol) { - auto symbol = node->node.use.symbol->node.symbol; - - auto width = (symbol.hasWidth ? symbol.w : vBox.w); - if (node->node.use.isWidthSet) width = node->node.use.w; - auto height = (symbol.hasHeight ? symbol.h : vBox.h);; - if (node->node.use.isHeightSet) height = node->node.use.h; - auto vw = (symbol.hasViewBox ? symbol.vw : width); - auto vh = (symbol.hasViewBox ? symbol.vh : height); - - Matrix mViewBox = {1, 0, 0, 0, 1, 0, 0, 0, 1}; - if ((!mathEqual(width, vw) || !mathEqual(height, vh)) && vw > 0 && vh > 0) { - Box box = {symbol.vx, symbol.vy, vw, vh}; - mViewBox = _calculateAspectRatioMatrix(symbol.align, symbol.meetOrSlice, width, height, box); - } else if (!mathZero(symbol.vx) || !mathZero(symbol.vy)) { - mViewBox = {1, 0, -symbol.vx, 0, 1, -symbol.vy, 0, 0, 1}; - } - - // mSceneTransform = mUseTransform * mSymbolTransform * mViewBox - Matrix mSceneTransform = mViewBox; - if (node->node.use.symbol->transform) { - mSceneTransform = mathMultiply(node->node.use.symbol->transform, &mViewBox); - } - mSceneTransform = mathMultiply(&mUseTransform, &mSceneTransform); - scene->transform(mSceneTransform); - - if (node->node.use.symbol->node.symbol.overflowVisible) { - finalScene = std::move(scene); - } else { - auto viewBoxClip = Shape::gen(); - viewBoxClip->appendRect(0, 0, width, height, 0, 0); - - // mClipTransform = mUseTransform * mSymbolTransform - Matrix mClipTransform = mUseTransform; - if (node->node.use.symbol->transform) { - mClipTransform = mathMultiply(&mUseTransform, node->node.use.symbol->transform); - } - viewBoxClip->transform(mClipTransform); - - auto compositeLayer = Scene::gen(); - compositeLayer->composite(std::move(viewBoxClip), CompositeMethod::ClipPath); - compositeLayer->push(std::move(scene)); - - auto root = Scene::gen(); - root->push(std::move(compositeLayer)); - - finalScene = std::move(root); - } - } else { - scene->transform(mUseTransform); - finalScene = std::move(scene); - } - - return finalScene; -} - - -static unique_ptr _sceneBuildHelper(SvgLoaderData& loaderData, const SvgNode* node, const Box& vBox, const string& svgPath, bool mask, int depth, bool* isMaskWhite) -{ - /* Exception handling: Prevent invalid SVG data input. - The size is the arbitrary value, we need an experimental size. */ - if (depth > 2192) { - TVGERR("SVG", "Infinite recursive call - stopped after %d calls! Svg file may be incorrectly formatted.", depth); - return nullptr; - } - - if (_isGroupType(node->type) || mask) { - auto scene = Scene::gen(); - // For a Symbol node, the viewBox transformation has to be applied first - see _useBuildHelper() - if (!mask && node->transform && node->type != SvgNodeType::Symbol) scene->transform(*node->transform); - - if (node->style->display && node->style->opacity != 0) { - auto child = node->child.data; - for (uint32_t i = 0; i < node->child.count; ++i, ++child) { - if (_isGroupType((*child)->type)) { - if ((*child)->type == SvgNodeType::Use) - scene->push(_useBuildHelper(loaderData, *child, vBox, svgPath, depth + 1, isMaskWhite)); - else if (!((*child)->type == SvgNodeType::Symbol && node->type != SvgNodeType::Use)) - scene->push(_sceneBuildHelper(loaderData, *child, vBox, svgPath, false, depth + 1, isMaskWhite)); - } else if ((*child)->type == SvgNodeType::Image) { - auto image = _imageBuildHelper(loaderData, *child, vBox, svgPath); - if (image) { - scene->push(std::move(image)); - if (isMaskWhite) *isMaskWhite = false; - } - } else if ((*child)->type != SvgNodeType::Mask) { - auto shape = _shapeBuildHelper(loaderData, *child, vBox, svgPath); - if (shape) { - if (isMaskWhite) { - uint8_t r, g, b; - shape->fillColor(&r, &g, &b); - if (shape->fill() || r < 255 || g < 255 || b < 255 || shape->strokeFill() || - (shape->strokeColor(&r, &g, &b) == Result::Success && (r < 255 || g < 255 || b < 255))) { - *isMaskWhite = false; - } - } - scene->push(std::move(shape)); - } - } - } - _applyComposition(loaderData, scene.get(), node, vBox, svgPath); - scene->opacity(node->style->opacity); - } - return scene; - } - return nullptr; -} - - -static void _updateInvalidViewSize(const Scene* scene, Box& vBox, float& w, float& h, SvgViewFlag viewFlag) -{ - bool validWidth = (viewFlag & SvgViewFlag::Width); - bool validHeight = (viewFlag & SvgViewFlag::Height); - - float x, y; - scene->bounds(&x, &y, &vBox.w, &vBox.h, false); - if (!validWidth && !validHeight) { - vBox.x = x; - vBox.y = y; - } else { - if (validWidth) vBox.w = w; - if (validHeight) vBox.h = h; - } - - //the size would have 1x1 or percentage values. - if (!validWidth) w *= vBox.w; - if (!validHeight) h *= vBox.h; -} - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -Scene* svgSceneBuild(SvgLoaderData& loaderData, Box vBox, float w, float h, AspectRatioAlign align, AspectRatioMeetOrSlice meetOrSlice, const string& svgPath, SvgViewFlag viewFlag) -{ - //TODO: aspect ratio is valid only if viewBox was set - - if (!loaderData.doc || (loaderData.doc->type != SvgNodeType::Doc)) return nullptr; - - auto docNode = _sceneBuildHelper(loaderData, loaderData.doc, vBox, svgPath, false, 0); - - if (!(viewFlag & SvgViewFlag::Viewbox)) _updateInvalidViewSize(docNode.get(), vBox, w, h, viewFlag); - - if (!mathEqual(w, vBox.w) || !mathEqual(h, vBox.h)) { - Matrix m = _calculateAspectRatioMatrix(align, meetOrSlice, w, h, vBox); - docNode->transform(m); - } else if (!mathZero(vBox.x) || !mathZero(vBox.y)) { - docNode->translate(-vBox.x, -vBox.y); - } - - auto viewBoxClip = Shape::gen(); - viewBoxClip->appendRect(0, 0, w, h); - - auto compositeLayer = Scene::gen(); - compositeLayer->composite(std::move(viewBoxClip), CompositeMethod::ClipPath); - compositeLayer->push(std::move(docNode)); - - auto root = Scene::gen(); - root->push(std::move(compositeLayer)); - - loaderData.doc->node.doc.vx = vBox.x; - loaderData.doc->node.doc.vy = vBox.y; - loaderData.doc->node.doc.vw = vBox.w; - loaderData.doc->node.doc.vh = vBox.h; - loaderData.doc->node.doc.w = w; - loaderData.doc->node.doc.h = h; - - return root.release(); -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgSceneBuilder.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgSceneBuilder.h deleted file mode 100644 index 8ab1b67..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgSceneBuilder.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_SVG_SCENE_BUILDER_H_ -#define _TVG_SVG_SCENE_BUILDER_H_ - -#include "tvgCommon.h" - -Scene* svgSceneBuild(SvgLoaderData& loaderData, Box vBox, float w, float h, AspectRatioAlign align, AspectRatioMeetOrSlice meetOrSlice, const string& svgPath, SvgViewFlag viewFlag); - -#endif //_TVG_SVG_SCENE_BUILDER_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgUtil.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgUtil.cpp deleted file mode 100644 index e77e2a0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgUtil.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include -#include "tvgSvgUtil.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static uint8_t _hexCharToDec(const char c) -{ - if (c >= 'a') return c - 'a' + 10; - else if (c >= 'A') return c - 'A' + 10; - else return c - '0'; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -size_t svgUtilURLDecode(const char *src, char** dst) -{ - if (!src) return 0; - - auto length = strlen(src); - if (length == 0) return 0; - - char* decoded = (char*)malloc(sizeof(char) * length + 1); - - char a, b; - int idx =0; - while (*src) { - if (*src == '%' && - ((a = src[1]) && (b = src[2])) && - (isxdigit(a) && isxdigit(b))) { - decoded[idx++] = (_hexCharToDec(a) << 4) + _hexCharToDec(b); - src+=3; - } else if (*src == '+') { - decoded[idx++] = ' '; - src++; - } else { - decoded[idx++] = *src++; - } - } - decoded[idx] = '\0'; - - *dst = decoded; - return idx + 1; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgUtil.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgUtil.h deleted file mode 100644 index cc4b54c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSvgUtil.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_SVG_UTIL_H_ -#define _TVG_SVG_UTIL_H_ - -#include "tvgCommon.h" - -size_t svgUtilURLDecode(const char *src, char** dst); - -#endif //_TVG_SVG_UTIL_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwCanvas.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwCanvas.cpp deleted file mode 100644 index 27bd7e3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwCanvas.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgCanvas.h" -#include "tvgLoadModule.h" - -#ifdef THORVG_SW_RASTER_SUPPORT - #include "tvgSwRenderer.h" -#else - class SwRenderer : public RenderMethod - { - //Non Supported. Dummy Class */ - }; -#endif - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -struct SwCanvas::Impl -{ -}; - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -#ifdef THORVG_SW_RASTER_SUPPORT -SwCanvas::SwCanvas() : Canvas(SwRenderer::gen()), pImpl(new Impl) -#else -SwCanvas::SwCanvas() : Canvas(nullptr), pImpl(new Impl) -#endif -{ -} - - -SwCanvas::~SwCanvas() -{ - delete(pImpl); -} - - -Result SwCanvas::mempool(MempoolPolicy policy) noexcept -{ -#ifdef THORVG_SW_RASTER_SUPPORT - //We know renderer type, avoid dynamic_cast for performance. - auto renderer = static_cast(Canvas::pImpl->renderer); - if (!renderer) return Result::MemoryCorruption; - - //It can't change the policy during the running. - if (!Canvas::pImpl->paints.empty()) return Result::InsufficientCondition; - - if (policy == MempoolPolicy::Individual) renderer->mempool(false); - else renderer->mempool(true); - - return Result::Success; -#endif - return Result::NonSupport; -} - - -Result SwCanvas::target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h, Colorspace cs) noexcept -{ -#ifdef THORVG_SW_RASTER_SUPPORT - //We know renderer type, avoid dynamic_cast for performance. - auto renderer = static_cast(Canvas::pImpl->renderer); - if (!renderer) return Result::MemoryCorruption; - - if (!renderer->target(buffer, stride, w, h, static_cast(cs))) return Result::InvalidArguments; - Canvas::pImpl->vport = {0, 0, (int32_t)w, (int32_t)h}; - renderer->viewport(Canvas::pImpl->vport); - - //Paints must be updated again with this new target. - Canvas::pImpl->needRefresh(); - - //FIXME: The value must be associated with an individual canvas instance. - ImageLoader::cs = static_cast(cs); - - return Result::Success; -#endif - return Result::NonSupport; -} - - -unique_ptr SwCanvas::gen() noexcept -{ -#ifdef THORVG_SW_RASTER_SUPPORT - if (SwRenderer::init() <= 0) return nullptr; - return unique_ptr(new SwCanvas); -#endif - return nullptr; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwCommon.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwCommon.h deleted file mode 100644 index 182cf8f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwCommon.h +++ /dev/null @@ -1,593 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_SW_COMMON_H_ -#define _TVG_SW_COMMON_H_ - -#include "tvgCommon.h" -#include "tvgRender.h" - -#include - -#if 0 -#include -static double timeStamp() -{ - struct timeval tv; - gettimeofday(&tv, NULL); - return (tv.tv_sec + tv.tv_usec / 1000000.0); -} -#endif - -#define SW_CURVE_TYPE_POINT 0 -#define SW_CURVE_TYPE_CUBIC 1 -#define SW_ANGLE_PI (180L << 16) -#define SW_ANGLE_2PI (SW_ANGLE_PI << 1) -#define SW_ANGLE_PI2 (SW_ANGLE_PI >> 1) - -using SwCoord = signed long; -using SwFixed = signed long long; - - -static inline float TO_FLOAT(SwCoord val) -{ - return static_cast(val) / 64.0f; -} - -struct SwPoint -{ - SwCoord x, y; - - SwPoint& operator+=(const SwPoint& rhs) - { - x += rhs.x; - y += rhs.y; - return *this; - } - - SwPoint operator+(const SwPoint& rhs) const - { - return {x + rhs.x, y + rhs.y}; - } - - SwPoint operator-(const SwPoint& rhs) const - { - return {x - rhs.x, y - rhs.y}; - } - - bool operator==(const SwPoint& rhs) const - { - return (x == rhs.x && y == rhs.y); - } - - bool operator!=(const SwPoint& rhs) const - { - return (x != rhs.x || y != rhs.y); - } - - bool zero() const - { - if (x == 0 && y == 0) return true; - else return false; - } - - bool small() const - { - //2 is epsilon... - if (abs(x) < 2 && abs(y) < 2) return true; - else return false; - } - - Point toPoint() const - { - return {TO_FLOAT(x), TO_FLOAT(y)}; - } -}; - -struct SwSize -{ - SwCoord w, h; -}; - -struct SwOutline -{ - Array pts; //the outline's points - Array cntrs; //the contour end points - Array types; //curve type - Array closed; //opened or closed path? - FillRule fillRule; -}; - -struct SwSpan -{ - uint16_t x, y; - uint16_t len; - uint8_t coverage; -}; - -struct SwRleData -{ - SwSpan *spans; - uint32_t alloc; - uint32_t size; -}; - -struct SwBBox -{ - SwPoint min, max; - - void reset() - { - min.x = min.y = max.x = max.y = 0; - } -}; - -struct SwFill -{ - struct SwLinear { - float dx, dy; - float len; - float offset; - }; - - struct SwRadial { - float a11, a12, a13; - float a21, a22, a23; - float fx, fy, fr; - float dx, dy, dr; - float invA, a; - }; - - union { - SwLinear linear; - SwRadial radial; - }; - - uint32_t* ctable; - FillSpread spread; - - bool translucent; -}; - -struct SwStrokeBorder -{ - uint32_t ptsCnt; - uint32_t maxPts; - SwPoint* pts; - uint8_t* tags; - int32_t start; //index of current sub-path start point - bool movable; //true: for ends of lineto borders -}; - -struct SwStroke -{ - SwFixed angleIn; - SwFixed angleOut; - SwPoint center; - SwFixed lineLength; - SwFixed subPathAngle; - SwPoint ptStartSubPath; - SwFixed subPathLineLength; - SwFixed width; - SwFixed miterlimit; - - StrokeCap cap; - StrokeJoin join; - StrokeJoin joinSaved; - SwFill* fill = nullptr; - - SwStrokeBorder borders[2]; - - float sx, sy; - - bool firstPt; - bool closedSubPath; - bool handleWideStrokes; -}; - -struct SwDashStroke -{ - SwOutline* outline = nullptr; - float curLen = 0; - int32_t curIdx = 0; - Point ptStart = {0, 0}; - Point ptCur = {0, 0}; - float* pattern = nullptr; - uint32_t cnt = 0; - bool curOpGap = false; - bool move = true; -}; - -struct SwShape -{ - SwOutline* outline = nullptr; - SwStroke* stroke = nullptr; - SwFill* fill = nullptr; - SwRleData* rle = nullptr; - SwRleData* strokeRle = nullptr; - SwBBox bbox; //Keep it boundary without stroke region. Using for optimal filling. - - bool fastTrack = false; //Fast Track: axis-aligned rectangle without any clips? -}; - -struct SwImage -{ - SwOutline* outline = nullptr; - SwRleData* rle = nullptr; - union { - pixel_t* data; //system based data pointer - uint32_t* buf32; //for explicit 32bits channels - uint8_t* buf8; //for explicit 8bits grayscale - }; - uint32_t w, h, stride; - int32_t ox = 0; //offset x - int32_t oy = 0; //offset y - float scale; - uint8_t channelSize; - - bool direct = false; //draw image directly (with offset) - bool scaled = false; //draw scaled image -}; - -typedef uint8_t(*SwMask)(uint8_t s, uint8_t d, uint8_t a); //src, dst, alpha -typedef uint32_t(*SwBlender)(uint32_t s, uint32_t d, uint8_t a); //src, dst, alpha -typedef uint32_t(*SwJoin)(uint8_t r, uint8_t g, uint8_t b, uint8_t a); //color channel join -typedef uint8_t(*SwAlpha)(uint8_t*); //blending alpha - -struct SwCompositor; - -struct SwSurface : Surface -{ - SwJoin join; - SwAlpha alphas[4]; //Alpha:2, InvAlpha:3, Luma:4, InvLuma:5 - SwBlender blender = nullptr; //blender (optional) - SwCompositor* compositor = nullptr; //compositor (optional) - BlendMethod blendMethod; //blending method (uint8_t) - - SwAlpha alpha(CompositeMethod method) - { - auto idx = (int)(method) - 2; //0: None, 1: ClipPath - return alphas[idx > 3 ? 0 : idx]; //CompositeMethod has only four Matting methods. - } - - SwSurface() - { - } - - SwSurface(const SwSurface* rhs) : Surface(rhs) - { - join = rhs->join; - memcpy(alphas, rhs->alphas, sizeof(alphas)); - blender = rhs->blender; - compositor = rhs->compositor; - blendMethod = rhs->blendMethod; - } -}; - -struct SwCompositor : Compositor -{ - SwSurface* recoverSfc; //Recover surface when composition is started - SwCompositor* recoverCmp; //Recover compositor when composition is done - SwImage image; - SwBBox bbox; - bool valid; -}; - -struct SwMpool -{ - SwOutline* outline; - SwOutline* strokeOutline; - SwOutline* dashOutline; - unsigned allocSize; -}; - -static inline SwCoord TO_SWCOORD(float val) -{ - return SwCoord(val * 64.0f); -} - -static inline uint32_t JOIN(uint8_t c0, uint8_t c1, uint8_t c2, uint8_t c3) -{ - return (c0 << 24 | c1 << 16 | c2 << 8 | c3); -} - -static inline uint32_t ALPHA_BLEND(uint32_t c, uint32_t a) -{ - return (((((c >> 8) & 0x00ff00ff) * a + 0x00ff00ff) & 0xff00ff00) + - ((((c & 0x00ff00ff) * a + 0x00ff00ff) >> 8) & 0x00ff00ff)); -} - -static inline uint32_t INTERPOLATE(uint32_t s, uint32_t d, uint8_t a) -{ - return (((((((s >> 8) & 0xff00ff) - ((d >> 8) & 0xff00ff)) * a) + (d & 0xff00ff00)) & 0xff00ff00) + ((((((s & 0xff00ff) - (d & 0xff00ff)) * a) >> 8) + (d & 0xff00ff)) & 0xff00ff)); -} - -static inline uint8_t INTERPOLATE8(uint8_t s, uint8_t d, uint8_t a) -{ - return (((s) * (a) + 0xff) >> 8) + (((d) * ~(a) + 0xff) >> 8); -} - -static inline SwCoord HALF_STROKE(float width) -{ - return TO_SWCOORD(width * 0.5f); -} - -static inline uint8_t A(uint32_t c) -{ - return ((c) >> 24); -} - -static inline uint8_t IA(uint32_t c) -{ - return (~(c) >> 24); -} - -static inline uint8_t C1(uint32_t c) -{ - return ((c) >> 16); -} - -static inline uint8_t C2(uint32_t c) -{ - return ((c) >> 8); -} - -static inline uint8_t C3(uint32_t c) -{ - return (c); -} - -static inline uint32_t opBlendInterp(uint32_t s, uint32_t d, uint8_t a) -{ - return INTERPOLATE(s, d, a); -} - -static inline uint32_t opBlendNormal(uint32_t s, uint32_t d, uint8_t a) -{ - auto t = ALPHA_BLEND(s, a); - return t + ALPHA_BLEND(d, IA(t)); -} - -static inline uint32_t opBlendPreNormal(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) -{ - return s + ALPHA_BLEND(d, IA(s)); -} - -static inline uint32_t opBlendSrcOver(uint32_t s, TVG_UNUSED uint32_t d, TVG_UNUSED uint8_t a) -{ - return s; -} - -//TODO: BlendMethod could remove the alpha parameter. -static inline uint32_t opBlendDifference(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) -{ - //if (s > d) => s - d - //else => d - s - auto c1 = (C1(s) > C1(d)) ? (C1(s) - C1(d)) : (C1(d) - C1(s)); - auto c2 = (C2(s) > C2(d)) ? (C2(s) - C2(d)) : (C2(d) - C2(s)); - auto c3 = (C3(s) > C3(d)) ? (C3(s) - C3(d)) : (C3(d) - C3(s)); - return JOIN(255, c1, c2, c3); -} - -static inline uint32_t opBlendExclusion(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) -{ - //A + B - 2AB - auto c1 = std::min(255, C1(s) + C1(d) - std::min(255, (C1(s) * C1(d)) << 1)); - auto c2 = std::min(255, C2(s) + C2(d) - std::min(255, (C2(s) * C2(d)) << 1)); - auto c3 = std::min(255, C3(s) + C3(d) - std::min(255, (C3(s) * C3(d)) << 1)); - return JOIN(255, c1, c2, c3); -} - -static inline uint32_t opBlendAdd(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) -{ - // s + d - auto c1 = std::min(C1(s) + C1(d), 255); - auto c2 = std::min(C2(s) + C2(d), 255); - auto c3 = std::min(C3(s) + C3(d), 255); - return JOIN(255, c1, c2, c3); -} - -static inline uint32_t opBlendScreen(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) -{ - // s + d - s * d - auto c1 = C1(s) + C1(d) - MULTIPLY(C1(s), C1(d)); - auto c2 = C2(s) + C2(d) - MULTIPLY(C2(s), C2(d)); - auto c3 = C3(s) + C3(d) - MULTIPLY(C3(s), C3(d)); - return JOIN(255, c1, c2, c3); -} - - -static inline uint32_t opBlendMultiply(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) -{ - // s * d - auto c1 = MULTIPLY(C1(s), C1(d)); - auto c2 = MULTIPLY(C2(s), C2(d)); - auto c3 = MULTIPLY(C3(s), C3(d)); - return JOIN(255, c1, c2, c3); -} - - -static inline uint32_t opBlendOverlay(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) -{ - // if (2 * d < da) => 2 * s * d, - // else => 1 - 2 * (1 - s) * (1 - d) - auto c1 = (C1(d) < 128) ? std::min(255, 2 * MULTIPLY(C1(s), C1(d))) : (255 - std::min(255, 2 * MULTIPLY(255 - C1(s), 255 - C1(d)))); - auto c2 = (C2(d) < 128) ? std::min(255, 2 * MULTIPLY(C2(s), C2(d))) : (255 - std::min(255, 2 * MULTIPLY(255 - C2(s), 255 - C2(d)))); - auto c3 = (C3(d) < 128) ? std::min(255, 2 * MULTIPLY(C3(s), C3(d))) : (255 - std::min(255, 2 * MULTIPLY(255 - C3(s), 255 - C3(d)))); - return JOIN(255, c1, c2, c3); -} - -static inline uint32_t opBlendDarken(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) -{ - // min(s, d) - auto c1 = std::min(C1(s), C1(d)); - auto c2 = std::min(C2(s), C2(d)); - auto c3 = std::min(C3(s), C3(d)); - return JOIN(255, c1, c2, c3); -} - -static inline uint32_t opBlendLighten(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) -{ - // max(s, d) - auto c1 = std::max(C1(s), C1(d)); - auto c2 = std::max(C2(s), C2(d)); - auto c3 = std::max(C3(s), C3(d)); - return JOIN(255, c1, c2, c3); -} - -static inline uint32_t opBlendColorDodge(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) -{ - // d / (1 - s) - auto is = 0xffffffff - s; - auto c1 = (C1(is) > 0) ? (C1(d) / C1(is)) : C1(d); - auto c2 = (C2(is) > 0) ? (C2(d) / C2(is)) : C2(d); - auto c3 = (C3(is) > 0) ? (C3(d) / C3(is)) : C3(d); - return JOIN(255, c1, c2, c3); -} - -static inline uint32_t opBlendColorBurn(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) -{ - // 1 - (1 - d) / s - auto id = 0xffffffff - d; - auto c1 = 255 - ((C1(s) > 0) ? (C1(id) / C1(s)) : C1(id)); - auto c2 = 255 - ((C2(s) > 0) ? (C2(id) / C2(s)) : C2(id)); - auto c3 = 255 - ((C3(s) > 0) ? (C3(id) / C3(s)) : C3(id)); - return JOIN(255, c1, c2, c3); -} - -static inline uint32_t opBlendHardLight(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) -{ - auto c1 = (C1(s) < 128) ? std::min(255, 2 * MULTIPLY(C1(s), C1(d))) : (255 - std::min(255, 2 * MULTIPLY(255 - C1(s), 255 - C1(d)))); - auto c2 = (C2(s) < 128) ? std::min(255, 2 * MULTIPLY(C2(s), C2(d))) : (255 - std::min(255, 2 * MULTIPLY(255 - C2(s), 255 - C2(d)))); - auto c3 = (C3(s) < 128) ? std::min(255, 2 * MULTIPLY(C3(s), C3(d))) : (255 - std::min(255, 2 * MULTIPLY(255 - C3(s), 255 - C3(d)))); - return JOIN(255, c1, c2, c3); -} - -static inline uint32_t opBlendSoftLight(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) -{ - //(255 - 2 * s) * (d * d) + (2 * s * b) - auto c1 = std::min(255, MULTIPLY(255 - std::min(255, 2 * C1(s)), MULTIPLY(C1(d), C1(d))) + 2 * MULTIPLY(C1(s), C1(d))); - auto c2 = std::min(255, MULTIPLY(255 - std::min(255, 2 * C2(s)), MULTIPLY(C2(d), C2(d))) + 2 * MULTIPLY(C2(s), C2(d))); - auto c3 = std::min(255, MULTIPLY(255 - std::min(255, 2 * C3(s)), MULTIPLY(C3(d), C3(d))) + 2 * MULTIPLY(C3(s), C3(d))); - return JOIN(255, c1, c2, c3); -} - - -int64_t mathMultiply(int64_t a, int64_t b); -int64_t mathDivide(int64_t a, int64_t b); -int64_t mathMulDiv(int64_t a, int64_t b, int64_t c); -void mathRotate(SwPoint& pt, SwFixed angle); -SwFixed mathTan(SwFixed angle); -SwFixed mathAtan(const SwPoint& pt); -SwFixed mathCos(SwFixed angle); -SwFixed mathSin(SwFixed angle); -void mathSplitCubic(SwPoint* base); -SwFixed mathDiff(SwFixed angle1, SwFixed angle2); -SwFixed mathLength(const SwPoint& pt); -bool mathSmallCubic(const SwPoint* base, SwFixed& angleIn, SwFixed& angleMid, SwFixed& angleOut); -SwFixed mathMean(SwFixed angle1, SwFixed angle2); -SwPoint mathTransform(const Point* to, const Matrix* transform); -bool mathUpdateOutlineBBox(const SwOutline* outline, const SwBBox& clipRegion, SwBBox& renderRegion, bool fastTrack); -bool mathClipBBox(const SwBBox& clipper, SwBBox& clipee); - -void shapeReset(SwShape* shape); -bool shapePrepare(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid, bool hasComposite); -bool shapePrepared(const SwShape* shape); -bool shapeGenRle(SwShape* shape, const RenderShape* rshape, bool antiAlias); -void shapeDelOutline(SwShape* shape, SwMpool* mpool, uint32_t tid); -void shapeResetStroke(SwShape* shape, const RenderShape* rshape, const Matrix* transform); -bool shapeGenStrokeRle(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid); -void shapeFree(SwShape* shape); -void shapeDelStroke(SwShape* shape); -bool shapeGenFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable); -bool shapeGenStrokeFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable); -void shapeResetFill(SwShape* shape); -void shapeResetStrokeFill(SwShape* shape); -void shapeDelFill(SwShape* shape); -void shapeDelStrokeFill(SwShape* shape); - -void strokeReset(SwStroke* stroke, const RenderShape* shape, const Matrix* transform); -bool strokeParseOutline(SwStroke* stroke, const SwOutline& outline); -SwOutline* strokeExportOutline(SwStroke* stroke, SwMpool* mpool, unsigned tid); -void strokeFree(SwStroke* stroke); - -bool imagePrepare(SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid); -bool imageGenRle(SwImage* image, const SwBBox& renderRegion, bool antiAlias); -void imageDelOutline(SwImage* image, SwMpool* mpool, uint32_t tid); -void imageReset(SwImage* image); -void imageFree(SwImage* image); - -bool fillGenColorTable(SwFill* fill, const Fill* fdata, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable); -void fillReset(SwFill* fill); -void fillFree(SwFill* fill); - -//OPTIMIZE_ME: Skip the function pointer access -void fillLinear(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, SwMask maskOp, uint8_t opacity); //composite masking ver. -void fillLinear(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwMask maskOp, uint8_t opacity); //direct masking ver. -void fillLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, uint8_t a); //blending ver. -void fillLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, SwBlender op2, uint8_t a); //blending + BlendingMethod(op2) ver. -void fillLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwAlpha alpha, uint8_t csize, uint8_t opacity); //matting ver. - -void fillRadial(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, SwMask op, uint8_t a); //composite masking ver. -void fillRadial(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwMask op, uint8_t a) ; //direct masking ver. -void fillRadial(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, uint8_t a); //blending ver. -void fillRadial(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, SwBlender op2, uint8_t a); //blending + BlendingMethod(op2) ver. -void fillRadial(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwAlpha alpha, uint8_t csize, uint8_t opacity); //matting ver. - -SwRleData* rleRender(SwRleData* rle, const SwOutline* outline, const SwBBox& renderRegion, bool antiAlias); -SwRleData* rleRender(const SwBBox* bbox); -void rleFree(SwRleData* rle); -void rleReset(SwRleData* rle); -void rleMerge(SwRleData* rle, SwRleData* clip1, SwRleData* clip2); -void rleClipPath(SwRleData* rle, const SwRleData* clip); -void rleClipRect(SwRleData* rle, const SwBBox* clip); - -SwMpool* mpoolInit(uint32_t threads); -bool mpoolTerm(SwMpool* mpool); -bool mpoolClear(SwMpool* mpool); -SwOutline* mpoolReqOutline(SwMpool* mpool, unsigned idx); -void mpoolRetOutline(SwMpool* mpool, unsigned idx); -SwOutline* mpoolReqStrokeOutline(SwMpool* mpool, unsigned idx); -void mpoolRetStrokeOutline(SwMpool* mpool, unsigned idx); -SwOutline* mpoolReqDashOutline(SwMpool* mpool, unsigned idx); -void mpoolRetDashOutline(SwMpool* mpool, unsigned idx); - -bool rasterCompositor(SwSurface* surface); -bool rasterGradientShape(SwSurface* surface, SwShape* shape, unsigned id); -bool rasterShape(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a); -bool rasterImage(SwSurface* surface, SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& bbox, uint8_t opacity); -bool rasterStroke(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a); -bool rasterGradientStroke(SwSurface* surface, SwShape* shape, unsigned id); -bool rasterClear(SwSurface* surface, uint32_t x, uint32_t y, uint32_t w, uint32_t h); -void rasterPixel32(uint32_t *dst, uint32_t val, uint32_t offset, int32_t len); -void rasterGrayscale8(uint8_t *dst, uint8_t val, uint32_t offset, int32_t len); -void rasterUnpremultiply(Surface* surface); -void rasterPremultiply(Surface* surface); -bool rasterConvertCS(Surface* surface, ColorSpace to); - -#endif /* _TVG_SW_COMMON_H_ */ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwFill.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwFill.cpp deleted file mode 100644 index f939fc8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwFill.cpp +++ /dev/null @@ -1,790 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgMath.h" -#include "tvgSwCommon.h" -#include "tvgFill.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -#define RADIAL_A_THRESHOLD 0.0005f -#define GRADIENT_STOP_SIZE 1024 -#define FIXPT_BITS 8 -#define FIXPT_SIZE (1<radial.a - * B = 2 * (dr * fr + rx * dx + ry * dy) - * C = fr^2 - rx^2 - ry^2 - * Derivatives are computed with respect to dx. - * This procedure aims to optimize and eliminate the need to calculate all values from the beginning - * for consecutive x values with a constant y. The Taylor series expansions are computed as long as - * its terms are non-zero. - */ -static void _calculateCoefficients(const SwFill* fill, uint32_t x, uint32_t y, float& b, float& deltaB, float& det, float& deltaDet, float& deltaDeltaDet) -{ - auto radial = &fill->radial; - - auto rx = (x + 0.5f) * radial->a11 + (y + 0.5f) * radial->a12 + radial->a13 - radial->fx; - auto ry = (x + 0.5f) * radial->a21 + (y + 0.5f) * radial->a22 + radial->a23 - radial->fy; - - b = (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy) * radial->invA; - deltaB = (radial->a11 * radial->dx + radial->a21 * radial->dy) * radial->invA; - - auto rr = rx * rx + ry * ry; - auto deltaRr = 2.0f * (rx * radial->a11 + ry * radial->a21) * radial->invA; - auto deltaDeltaRr = 2.0f * (radial->a11 * radial->a11 + radial->a21 * radial->a21) * radial->invA; - - det = b * b + (rr - radial->fr * radial->fr) * radial->invA; - deltaDet = 2.0f * b * deltaB + deltaB * deltaB + deltaRr + deltaDeltaRr; - deltaDeltaDet = 2.0f * deltaB * deltaB + deltaDeltaRr; -} - - -static bool _updateColorTable(SwFill* fill, const Fill* fdata, const SwSurface* surface, uint8_t opacity) -{ - if (!fill->ctable) { - fill->ctable = static_cast(malloc(GRADIENT_STOP_SIZE * sizeof(uint32_t))); - if (!fill->ctable) return false; - } - - const Fill::ColorStop* colors; - auto cnt = fdata->colorStops(&colors); - if (cnt == 0 || !colors) return false; - - auto pColors = colors; - - auto a = MULTIPLY(pColors->a, opacity); - if (a < 255) fill->translucent = true; - - auto r = pColors->r; - auto g = pColors->g; - auto b = pColors->b; - auto rgba = surface->join(r, g, b, a); - - auto inc = 1.0f / static_cast(GRADIENT_STOP_SIZE); - auto pos = 1.5f * inc; - uint32_t i = 0; - - fill->ctable[i++] = ALPHA_BLEND(rgba | 0xff000000, a); - - while (pos <= pColors->offset) { - fill->ctable[i] = fill->ctable[i - 1]; - ++i; - pos += inc; - } - - for (uint32_t j = 0; j < cnt - 1; ++j) { - auto curr = colors + j; - auto next = curr + 1; - auto delta = 1.0f / (next->offset - curr->offset); - auto a2 = MULTIPLY(next->a, opacity); - if (!fill->translucent && a2 < 255) fill->translucent = true; - - auto rgba2 = surface->join(next->r, next->g, next->b, a2); - - while (pos < next->offset && i < GRADIENT_STOP_SIZE) { - auto t = (pos - curr->offset) * delta; - auto dist = static_cast(255 * t); - auto dist2 = 255 - dist; - - auto color = INTERPOLATE(rgba, rgba2, dist2); - fill->ctable[i] = ALPHA_BLEND((color | 0xff000000), (color >> 24)); - - ++i; - pos += inc; - } - rgba = rgba2; - a = a2; - } - rgba = ALPHA_BLEND((rgba | 0xff000000), a); - - for (; i < GRADIENT_STOP_SIZE; ++i) - fill->ctable[i] = rgba; - - //Make sure the last color stop is represented at the end of the table - fill->ctable[GRADIENT_STOP_SIZE - 1] = rgba; - - return true; -} - - -bool _prepareLinear(SwFill* fill, const LinearGradient* linear, const Matrix* transform) -{ - float x1, x2, y1, y2; - if (linear->linear(&x1, &y1, &x2, &y2) != Result::Success) return false; - - fill->linear.dx = x2 - x1; - fill->linear.dy = y2 - y1; - fill->linear.len = fill->linear.dx * fill->linear.dx + fill->linear.dy * fill->linear.dy; - - if (fill->linear.len < FLOAT_EPSILON) return true; - - fill->linear.dx /= fill->linear.len; - fill->linear.dy /= fill->linear.len; - fill->linear.offset = -fill->linear.dx * x1 - fill->linear.dy * y1; - - auto gradTransform = linear->transform(); - bool isTransformation = !mathIdentity((const Matrix*)(&gradTransform)); - - if (isTransformation) { - if (transform) gradTransform = mathMultiply(transform, &gradTransform); - } else if (transform) { - gradTransform = *transform; - isTransformation = true; - } - - if (isTransformation) { - Matrix invTransform; - if (!mathInverse(&gradTransform, &invTransform)) return false; - - fill->linear.offset += fill->linear.dx * invTransform.e13 + fill->linear.dy * invTransform.e23; - - auto dx = fill->linear.dx; - fill->linear.dx = dx * invTransform.e11 + fill->linear.dy * invTransform.e21; - fill->linear.dy = dx * invTransform.e12 + fill->linear.dy * invTransform.e22; - - fill->linear.len = fill->linear.dx * fill->linear.dx + fill->linear.dy * fill->linear.dy; - } - - return true; -} - - -bool _prepareRadial(SwFill* fill, const RadialGradient* radial, const Matrix* transform) -{ - auto cx = P(radial)->cx; - auto cy = P(radial)->cy; - auto r = P(radial)->r; - auto fx = P(radial)->fx; - auto fy = P(radial)->fy; - auto fr = P(radial)->fr; - - if (r < FLOAT_EPSILON) return true; - - fill->radial.dr = r - fr; - fill->radial.dx = cx - fx; - fill->radial.dy = cy - fy; - fill->radial.fr = fr; - fill->radial.fx = fx; - fill->radial.fy = fy; - fill->radial.a = fill->radial.dr * fill->radial.dr - fill->radial.dx * fill->radial.dx - fill->radial.dy * fill->radial.dy; - - //This condition fulfills the SVG 1.1 std: - //the focal point, if outside the end circle, is moved to be on the end circle - //See: the SVG 2 std requirements: https://www.w3.org/TR/SVG2/pservers.html#RadialGradientNotes - if (fill->radial.a < 0) { - auto dist = sqrtf(fill->radial.dx * fill->radial.dx + fill->radial.dy * fill->radial.dy); - fill->radial.fx = cx + r * (fx - cx) / dist; - fill->radial.fy = cy + r * (fy - cy) / dist; - fill->radial.dx = cx - fill->radial.fx; - fill->radial.dy = cy - fill->radial.fy; - // Prevent loss of precision on Apple Silicon when dr=dy and dx=0 due to FMA - // https://github.com/thorvg/thorvg/issues/2014 - auto dr2 = fill->radial.dr * fill->radial.dr; - auto dx2 = fill->radial.dx * fill->radial.dx; - auto dy2 = fill->radial.dy * fill->radial.dy; - - fill->radial.a = dr2 - dx2 - dy2; - } - - if (fill->radial.a > 0) fill->radial.invA = 1.0f / fill->radial.a; - - auto gradTransform = radial->transform(); - bool isTransformation = !mathIdentity((const Matrix*)(&gradTransform)); - - if (transform) { - if (isTransformation) gradTransform = mathMultiply(transform, &gradTransform); - else { - gradTransform = *transform; - isTransformation = true; - } - } - - if (isTransformation) { - Matrix invTransform; - if (!mathInverse(&gradTransform, &invTransform)) return false; - fill->radial.a11 = invTransform.e11; - fill->radial.a12 = invTransform.e12; - fill->radial.a13 = invTransform.e13; - fill->radial.a21 = invTransform.e21; - fill->radial.a22 = invTransform.e22; - fill->radial.a23 = invTransform.e23; - } else { - fill->radial.a11 = fill->radial.a22 = 1.0f; - fill->radial.a12 = fill->radial.a13 = 0.0f; - fill->radial.a21 = fill->radial.a23 = 0.0f; - } - return true; -} - - -static inline uint32_t _clamp(const SwFill* fill, int32_t pos) -{ - switch (fill->spread) { - case FillSpread::Pad: { - if (pos >= GRADIENT_STOP_SIZE) pos = GRADIENT_STOP_SIZE - 1; - else if (pos < 0) pos = 0; - break; - } - case FillSpread::Repeat: { - pos = pos % GRADIENT_STOP_SIZE; - if (pos < 0) pos = GRADIENT_STOP_SIZE + pos; - break; - } - case FillSpread::Reflect: { - auto limit = GRADIENT_STOP_SIZE * 2; - pos = pos % limit; - if (pos < 0) pos = limit + pos; - if (pos >= GRADIENT_STOP_SIZE) pos = (limit - pos - 1); - break; - } - } - return pos; -} - - -static inline uint32_t _fixedPixel(const SwFill* fill, int32_t pos) -{ - int32_t i = (pos + (FIXPT_SIZE / 2)) >> FIXPT_BITS; - return fill->ctable[_clamp(fill, i)]; -} - - -static inline uint32_t _pixel(const SwFill* fill, float pos) -{ - auto i = static_cast(pos * (GRADIENT_STOP_SIZE - 1) + 0.5f); - return fill->ctable[_clamp(fill, i)]; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - - -void fillRadial(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwAlpha alpha, uint8_t csize, uint8_t opacity) -{ - //edge case - if (fill->radial.a < RADIAL_A_THRESHOLD) { - auto radial = &fill->radial; - auto rx = (x + 0.5f) * radial->a11 + (y + 0.5f) * radial->a12 + radial->a13 - radial->fx; - auto ry = (x + 0.5f) * radial->a21 + (y + 0.5f) * radial->a22 + radial->a23 - radial->fy; - - if (opacity == 255) { - for (uint32_t i = 0 ; i < len ; ++i, ++dst, cmp += csize) { - auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); - *dst = opBlendNormal(_pixel(fill, x0), *dst, alpha(cmp)); - rx += radial->a11; - ry += radial->a21; - } - } else { - for (uint32_t i = 0 ; i < len ; ++i, ++dst, cmp += csize) { - auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); - *dst = opBlendNormal(_pixel(fill, x0), *dst, MULTIPLY(opacity, alpha(cmp))); - rx += radial->a11; - ry += radial->a21; - } - } - } else { - float b, deltaB, det, deltaDet, deltaDeltaDet; - _calculateCoefficients(fill, x, y, b, deltaB, det, deltaDet, deltaDeltaDet); - - if (opacity == 255) { - for (uint32_t i = 0 ; i < len ; ++i, ++dst, cmp += csize) { - *dst = opBlendNormal(_pixel(fill, sqrtf(det) - b), *dst, alpha(cmp)); - det += deltaDet; - deltaDet += deltaDeltaDet; - b += deltaB; - } - } else { - for (uint32_t i = 0 ; i < len ; ++i, ++dst, cmp += csize) { - *dst = opBlendNormal(_pixel(fill, sqrtf(det) - b), *dst, MULTIPLY(opacity, alpha(cmp))); - det += deltaDet; - deltaDet += deltaDeltaDet; - b += deltaB; - } - } - } -} - - -void fillRadial(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, uint8_t a) -{ - if (fill->radial.a < RADIAL_A_THRESHOLD) { - auto radial = &fill->radial; - auto rx = (x + 0.5f) * radial->a11 + (y + 0.5f) * radial->a12 + radial->a13 - radial->fx; - auto ry = (x + 0.5f) * radial->a21 + (y + 0.5f) * radial->a22 + radial->a23 - radial->fy; - for (uint32_t i = 0; i < len; ++i, ++dst) { - auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); - *dst = op(_pixel(fill, x0), *dst, a); - rx += radial->a11; - ry += radial->a21; - } - } else { - float b, deltaB, det, deltaDet, deltaDeltaDet; - _calculateCoefficients(fill, x, y, b, deltaB, det, deltaDet, deltaDeltaDet); - - for (uint32_t i = 0; i < len; ++i, ++dst) { - *dst = op(_pixel(fill, sqrtf(det) - b), *dst, a); - det += deltaDet; - deltaDet += deltaDeltaDet; - b += deltaB; - } - } -} - - -void fillRadial(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, SwMask maskOp, uint8_t a) -{ - if (fill->radial.a < RADIAL_A_THRESHOLD) { - auto radial = &fill->radial; - auto rx = (x + 0.5f) * radial->a11 + (y + 0.5f) * radial->a12 + radial->a13 - radial->fx; - auto ry = (x + 0.5f) * radial->a21 + (y + 0.5f) * radial->a22 + radial->a23 - radial->fy; - for (uint32_t i = 0 ; i < len ; ++i, ++dst) { - auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); - auto src = MULTIPLY(a, A(_pixel(fill, x0))); - *dst = maskOp(src, *dst, ~src); - rx += radial->a11; - ry += radial->a21; - } - } else { - float b, deltaB, det, deltaDet, deltaDeltaDet; - _calculateCoefficients(fill, x, y, b, deltaB, det, deltaDet, deltaDeltaDet); - - for (uint32_t i = 0 ; i < len ; ++i, ++dst) { - auto src = MULTIPLY(a, A(_pixel(fill, sqrtf(det) - b))); - *dst = maskOp(src, *dst, ~src); - det += deltaDet; - deltaDet += deltaDeltaDet; - b += deltaB; - } - } -} - - -void fillRadial(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwMask maskOp, uint8_t a) -{ - if (fill->radial.a < RADIAL_A_THRESHOLD) { - auto radial = &fill->radial; - auto rx = (x + 0.5f) * radial->a11 + (y + 0.5f) * radial->a12 + radial->a13 - radial->fx; - auto ry = (x + 0.5f) * radial->a21 + (y + 0.5f) * radial->a22 + radial->a23 - radial->fy; - for (uint32_t i = 0 ; i < len ; ++i, ++dst, ++cmp) { - auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); - auto src = MULTIPLY(A(A(_pixel(fill, x0))), a); - auto tmp = maskOp(src, *cmp, 0); - *dst = tmp + MULTIPLY(*dst, ~tmp); - rx += radial->a11; - ry += radial->a21; - } - } else { - float b, deltaB, det, deltaDet, deltaDeltaDet; - _calculateCoefficients(fill, x, y, b, deltaB, det, deltaDet, deltaDeltaDet); - - for (uint32_t i = 0 ; i < len ; ++i, ++dst, ++cmp) { - auto src = MULTIPLY(A(_pixel(fill, sqrtf(det))), a); - auto tmp = maskOp(src, *cmp, 0); - *dst = tmp + MULTIPLY(*dst, ~tmp); - deltaDet += deltaDeltaDet; - b += deltaB; - } - } -} - - -void fillRadial(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, SwBlender op2, uint8_t a) -{ - if (fill->radial.a < RADIAL_A_THRESHOLD) { - auto radial = &fill->radial; - auto rx = (x + 0.5f) * radial->a11 + (y + 0.5f) * radial->a12 + radial->a13 - radial->fx; - auto ry = (x + 0.5f) * radial->a21 + (y + 0.5f) * radial->a22 + radial->a23 - radial->fy; - - if (a == 255) { - for (uint32_t i = 0; i < len; ++i, ++dst) { - auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); - auto tmp = op(_pixel(fill, x0), *dst, 255); - *dst = op2(tmp, *dst, 255); - rx += radial->a11; - ry += radial->a21; - } - } else { - for (uint32_t i = 0; i < len; ++i, ++dst) { - auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); - auto tmp = op(_pixel(fill, x0), *dst, 255); - auto tmp2 = op2(tmp, *dst, 255); - *dst = INTERPOLATE(tmp2, *dst, a); - rx += radial->a11; - ry += radial->a21; - } - } - } else { - float b, deltaB, det, deltaDet, deltaDeltaDet; - _calculateCoefficients(fill, x, y, b, deltaB, det, deltaDet, deltaDeltaDet); - if (a == 255) { - for (uint32_t i = 0 ; i < len ; ++i, ++dst) { - auto tmp = op(_pixel(fill, sqrtf(det) - b), *dst, 255); - *dst = op2(tmp, *dst, 255); - det += deltaDet; - deltaDet += deltaDeltaDet; - b += deltaB; - } - } else { - for (uint32_t i = 0 ; i < len ; ++i, ++dst) { - auto tmp = op(_pixel(fill, sqrtf(det) - b), *dst, 255); - auto tmp2 = op2(tmp, *dst, 255); - *dst = INTERPOLATE(tmp2, *dst, a); - det += deltaDet; - deltaDet += deltaDeltaDet; - b += deltaB; - } - } - } -} - - -void fillLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwAlpha alpha, uint8_t csize, uint8_t opacity) -{ - //Rotation - float rx = x + 0.5f; - float ry = y + 0.5f; - float t = (fill->linear.dx * rx + fill->linear.dy * ry + fill->linear.offset) * (GRADIENT_STOP_SIZE - 1); - float inc = (fill->linear.dx) * (GRADIENT_STOP_SIZE - 1); - - if (opacity == 255) { - if (mathZero(inc)) { - auto color = _fixedPixel(fill, static_cast(t * FIXPT_SIZE)); - for (uint32_t i = 0; i < len; ++i, ++dst, cmp += csize) { - *dst = opBlendNormal(color, *dst, alpha(cmp)); - } - return; - } - - auto vMax = static_cast(INT32_MAX >> (FIXPT_BITS + 1)); - auto vMin = -vMax; - auto v = t + (inc * len); - - //we can use fixed point math - if (v < vMax && v > vMin) { - auto t2 = static_cast(t * FIXPT_SIZE); - auto inc2 = static_cast(inc * FIXPT_SIZE); - for (uint32_t j = 0; j < len; ++j, ++dst, cmp += csize) { - *dst = opBlendNormal(_fixedPixel(fill, t2), *dst, alpha(cmp)); - t2 += inc2; - } - //we have to fallback to float math - } else { - uint32_t counter = 0; - while (counter++ < len) { - *dst = opBlendNormal(_pixel(fill, t / GRADIENT_STOP_SIZE), *dst, alpha(cmp)); - ++dst; - t += inc; - cmp += csize; - } - } - } else { - if (mathZero(inc)) { - auto color = _fixedPixel(fill, static_cast(t * FIXPT_SIZE)); - for (uint32_t i = 0; i < len; ++i, ++dst, cmp += csize) { - *dst = opBlendNormal(color, *dst, MULTIPLY(alpha(cmp), opacity)); - } - return; - } - - auto vMax = static_cast(INT32_MAX >> (FIXPT_BITS + 1)); - auto vMin = -vMax; - auto v = t + (inc * len); - - //we can use fixed point math - if (v < vMax && v > vMin) { - auto t2 = static_cast(t * FIXPT_SIZE); - auto inc2 = static_cast(inc * FIXPT_SIZE); - for (uint32_t j = 0; j < len; ++j, ++dst, cmp += csize) { - *dst = opBlendNormal(_fixedPixel(fill, t2), *dst, MULTIPLY(alpha(cmp), opacity)); - t2 += inc2; - } - //we have to fallback to float math - } else { - uint32_t counter = 0; - while (counter++ < len) { - *dst = opBlendNormal(_pixel(fill, t / GRADIENT_STOP_SIZE), *dst, MULTIPLY(opacity, alpha(cmp))); - ++dst; - t += inc; - cmp += csize; - } - } - } -} - - -void fillLinear(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, SwMask maskOp, uint8_t a) -{ - //Rotation - float rx = x + 0.5f; - float ry = y + 0.5f; - float t = (fill->linear.dx * rx + fill->linear.dy * ry + fill->linear.offset) * (GRADIENT_STOP_SIZE - 1); - float inc = (fill->linear.dx) * (GRADIENT_STOP_SIZE - 1); - - if (mathZero(inc)) { - auto src = MULTIPLY(a, A(_fixedPixel(fill, static_cast(t * FIXPT_SIZE)))); - for (uint32_t i = 0; i < len; ++i, ++dst) { - *dst = maskOp(src, *dst, ~src); - } - return; - } - - auto vMax = static_cast(INT32_MAX >> (FIXPT_BITS + 1)); - auto vMin = -vMax; - auto v = t + (inc * len); - - //we can use fixed point math - if (v < vMax && v > vMin) { - auto t2 = static_cast(t * FIXPT_SIZE); - auto inc2 = static_cast(inc * FIXPT_SIZE); - for (uint32_t j = 0; j < len; ++j, ++dst) { - auto src = MULTIPLY(_fixedPixel(fill, t2), a); - *dst = maskOp(src, *dst, ~src); - t2 += inc2; - } - //we have to fallback to float math - } else { - uint32_t counter = 0; - while (counter++ < len) { - auto src = MULTIPLY(_pixel(fill, t / GRADIENT_STOP_SIZE), a); - *dst = maskOp(src, *dst, ~src); - ++dst; - t += inc; - } - } -} - - -void fillLinear(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwMask maskOp, uint8_t a) -{ - //Rotation - float rx = x + 0.5f; - float ry = y + 0.5f; - float t = (fill->linear.dx * rx + fill->linear.dy * ry + fill->linear.offset) * (GRADIENT_STOP_SIZE - 1); - float inc = (fill->linear.dx) * (GRADIENT_STOP_SIZE - 1); - - if (mathZero(inc)) { - auto src = A(_fixedPixel(fill, static_cast(t * FIXPT_SIZE))); - src = MULTIPLY(src, a); - for (uint32_t i = 0; i < len; ++i, ++dst, ++cmp) { - auto tmp = maskOp(src, *cmp, 0); - *dst = tmp + MULTIPLY(*dst, ~tmp); - } - return; - } - - auto vMax = static_cast(INT32_MAX >> (FIXPT_BITS + 1)); - auto vMin = -vMax; - auto v = t + (inc * len); - - //we can use fixed point math - if (v < vMax && v > vMin) { - auto t2 = static_cast(t * FIXPT_SIZE); - auto inc2 = static_cast(inc * FIXPT_SIZE); - for (uint32_t j = 0; j < len; ++j, ++dst, ++cmp) { - auto src = MULTIPLY(a, A(_fixedPixel(fill, t2))); - auto tmp = maskOp(src, *cmp, 0); - *dst = tmp + MULTIPLY(*dst, ~tmp); - t2 += inc2; - } - //we have to fallback to float math - } else { - uint32_t counter = 0; - while (counter++ < len) { - auto src = MULTIPLY(A(_pixel(fill, t / GRADIENT_STOP_SIZE)), a); - auto tmp = maskOp(src, *cmp, 0); - *dst = tmp + MULTIPLY(*dst, ~tmp); - ++dst; - ++cmp; - t += inc; - } - } -} - - -void fillLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, uint8_t a) -{ - //Rotation - float rx = x + 0.5f; - float ry = y + 0.5f; - float t = (fill->linear.dx * rx + fill->linear.dy * ry + fill->linear.offset) * (GRADIENT_STOP_SIZE - 1); - float inc = (fill->linear.dx) * (GRADIENT_STOP_SIZE - 1); - - if (mathZero(inc)) { - auto color = _fixedPixel(fill, static_cast(t * FIXPT_SIZE)); - for (uint32_t i = 0; i < len; ++i, ++dst) { - *dst = op(color, *dst, a); - } - return; - } - - auto vMax = static_cast(INT32_MAX >> (FIXPT_BITS + 1)); - auto vMin = -vMax; - auto v = t + (inc * len); - - //we can use fixed point math - if (v < vMax && v > vMin) { - auto t2 = static_cast(t * FIXPT_SIZE); - auto inc2 = static_cast(inc * FIXPT_SIZE); - for (uint32_t j = 0; j < len; ++j, ++dst) { - *dst = op(_fixedPixel(fill, t2), *dst, a); - t2 += inc2; - } - //we have to fallback to float math - } else { - uint32_t counter = 0; - while (counter++ < len) { - *dst = op(_pixel(fill, t / GRADIENT_STOP_SIZE), *dst, a); - ++dst; - t += inc; - } - } -} - - -void fillLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, SwBlender op2, uint8_t a) -{ - //Rotation - float rx = x + 0.5f; - float ry = y + 0.5f; - float t = (fill->linear.dx * rx + fill->linear.dy * ry + fill->linear.offset) * (GRADIENT_STOP_SIZE - 1); - float inc = (fill->linear.dx) * (GRADIENT_STOP_SIZE - 1); - - if (mathZero(inc)) { - auto color = _fixedPixel(fill, static_cast(t * FIXPT_SIZE)); - if (a == 255) { - for (uint32_t i = 0; i < len; ++i, ++dst) { - auto tmp = op(color, *dst, a); - *dst = op2(tmp, *dst, 255); - } - } else { - for (uint32_t i = 0; i < len; ++i, ++dst) { - auto tmp = op(color, *dst, a); - auto tmp2 = op2(tmp, *dst, 255); - *dst = INTERPOLATE(tmp2, *dst, a); - } - } - return; - } - - auto vMax = static_cast(INT32_MAX >> (FIXPT_BITS + 1)); - auto vMin = -vMax; - auto v = t + (inc * len); - - if (a == 255) { - //we can use fixed point math - if (v < vMax && v > vMin) { - auto t2 = static_cast(t * FIXPT_SIZE); - auto inc2 = static_cast(inc * FIXPT_SIZE); - for (uint32_t j = 0; j < len; ++j, ++dst) { - auto tmp = op(_fixedPixel(fill, t2), *dst, 255); - *dst = op2(tmp, *dst, 255); - t2 += inc2; - } - //we have to fallback to float math - } else { - uint32_t counter = 0; - while (counter++ < len) { - auto tmp = op(_pixel(fill, t / GRADIENT_STOP_SIZE), *dst, 255); - *dst = op2(tmp, *dst, 255); - ++dst; - t += inc; - } - } - } else { - //we can use fixed point math - if (v < vMax && v > vMin) { - auto t2 = static_cast(t * FIXPT_SIZE); - auto inc2 = static_cast(inc * FIXPT_SIZE); - for (uint32_t j = 0; j < len; ++j, ++dst) { - auto tmp = op(_fixedPixel(fill, t2), *dst, 255); - auto tmp2 = op2(tmp, *dst, 255); - *dst = INTERPOLATE(tmp2, *dst, a); - t2 += inc2; - } - //we have to fallback to float math - } else { - uint32_t counter = 0; - while (counter++ < len) { - auto tmp = op(_pixel(fill, t / GRADIENT_STOP_SIZE), *dst, 255); - auto tmp2 = op2(tmp, *dst, 255); - *dst = INTERPOLATE(tmp2, *dst, a); - ++dst; - t += inc; - } - } - } -} - - -bool fillGenColorTable(SwFill* fill, const Fill* fdata, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable) -{ - if (!fill) return false; - - fill->spread = fdata->spread(); - - if (ctable) { - if (!_updateColorTable(fill, fdata, surface, opacity)) return false; - } - - if (fdata->identifier() == TVG_CLASS_ID_LINEAR) { - return _prepareLinear(fill, static_cast(fdata), transform); - } else if (fdata->identifier() == TVG_CLASS_ID_RADIAL) { - return _prepareRadial(fill, static_cast(fdata), transform); - } - - //LOG: What type of gradient?! - - return false; -} - - -void fillReset(SwFill* fill) -{ - if (fill->ctable) { - free(fill->ctable); - fill->ctable = nullptr; - } - fill->translucent = false; -} - - -void fillFree(SwFill* fill) -{ - if (!fill) return; - - if (fill->ctable) free(fill->ctable); - - free(fill); -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwImage.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwImage.cpp deleted file mode 100644 index 22d1cf7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwImage.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgMath.h" -#include "tvgSwCommon.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static inline bool _onlyShifted(const Matrix* m) -{ - if (mathEqual(m->e11, 1.0f) && mathEqual(m->e22, 1.0f) && mathZero(m->e12) && mathZero(m->e21)) return true; - return false; -} - - -static bool _genOutline(SwImage* image, const RenderMesh* mesh, const Matrix* transform, SwMpool* mpool, unsigned tid) -{ - image->outline = mpoolReqOutline(mpool, tid); - auto outline = image->outline; - - outline->pts.reserve(5); - outline->types.reserve(5); - outline->cntrs.reserve(1); - outline->closed.reserve(1); - - Point to[4]; - if (mesh->triangleCnt > 0) { - // TODO: Optimise me. We appear to calculate this exact min/max bounding area in multiple - // places. We should be able to re-use one we have already done? Also see: - // tvgPicture.h --> bounds - // tvgSwRasterTexmap.h --> _rasterTexmapPolygonMesh - // - // TODO: Should we calculate the exact path(s) of the triangle mesh instead? - // i.e. copy tvgSwShape.capp -> _genOutline? - // - // TODO: Cntrs? - auto triangles = mesh->triangles; - auto min = triangles[0].vertex[0].pt; - auto max = triangles[0].vertex[0].pt; - - for (uint32_t i = 0; i < mesh->triangleCnt; ++i) { - if (triangles[i].vertex[0].pt.x < min.x) min.x = triangles[i].vertex[0].pt.x; - else if (triangles[i].vertex[0].pt.x > max.x) max.x = triangles[i].vertex[0].pt.x; - if (triangles[i].vertex[0].pt.y < min.y) min.y = triangles[i].vertex[0].pt.y; - else if (triangles[i].vertex[0].pt.y > max.y) max.y = triangles[i].vertex[0].pt.y; - - if (triangles[i].vertex[1].pt.x < min.x) min.x = triangles[i].vertex[1].pt.x; - else if (triangles[i].vertex[1].pt.x > max.x) max.x = triangles[i].vertex[1].pt.x; - if (triangles[i].vertex[1].pt.y < min.y) min.y = triangles[i].vertex[1].pt.y; - else if (triangles[i].vertex[1].pt.y > max.y) max.y = triangles[i].vertex[1].pt.y; - - if (triangles[i].vertex[2].pt.x < min.x) min.x = triangles[i].vertex[2].pt.x; - else if (triangles[i].vertex[2].pt.x > max.x) max.x = triangles[i].vertex[2].pt.x; - if (triangles[i].vertex[2].pt.y < min.y) min.y = triangles[i].vertex[2].pt.y; - else if (triangles[i].vertex[2].pt.y > max.y) max.y = triangles[i].vertex[2].pt.y; - } - to[0] = {min.x, min.y}; - to[1] = {max.x, min.y}; - to[2] = {max.x, max.y}; - to[3] = {min.x, max.y}; - } else { - auto w = static_cast(image->w); - auto h = static_cast(image->h); - to[0] = {0, 0}; - to[1] = {w, 0}; - to[2] = {w, h}; - to[3] = {0, h}; - } - - for (int i = 0; i < 4; i++) { - outline->pts.push(mathTransform(&to[i], transform)); - outline->types.push(SW_CURVE_TYPE_POINT); - } - - outline->pts.push(outline->pts[0]); - outline->types.push(SW_CURVE_TYPE_POINT); - outline->cntrs.push(outline->pts.count - 1); - outline->closed.push(true); - - image->outline = outline; - - return true; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -bool imagePrepare(SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid) -{ - image->direct = _onlyShifted(transform); - - //Fast track: Non-transformed image but just shifted. - if (image->direct) { - image->ox = -static_cast(round(transform->e13)); - image->oy = -static_cast(round(transform->e23)); - //Figure out the scale factor by transform matrix - } else { - auto scaleX = sqrtf((transform->e11 * transform->e11) + (transform->e21 * transform->e21)); - auto scaleY = sqrtf((transform->e22 * transform->e22) + (transform->e12 * transform->e12)); - image->scale = (fabsf(scaleX - scaleY) > 0.01f) ? 1.0f : scaleX; - - if (mathZero(transform->e12) && mathZero(transform->e21)) image->scaled = true; - else image->scaled = false; - } - - if (!_genOutline(image, mesh, transform, mpool, tid)) return false; - return mathUpdateOutlineBBox(image->outline, clipRegion, renderRegion, image->direct); -} - - -bool imageGenRle(SwImage* image, const SwBBox& renderRegion, bool antiAlias) -{ - if ((image->rle = rleRender(image->rle, image->outline, renderRegion, antiAlias))) return true; - - return false; -} - - -void imageDelOutline(SwImage* image, SwMpool* mpool, uint32_t tid) -{ - mpoolRetOutline(mpool, tid); - image->outline = nullptr; -} - - -void imageReset(SwImage* image) -{ - rleReset(image->rle); -} - - -void imageFree(SwImage* image) -{ - rleFree(image->rle); -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwMath.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwMath.cpp deleted file mode 100644 index 8b8d8a4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwMath.cpp +++ /dev/null @@ -1,329 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgMath.h" -#include "tvgSwCommon.h" - - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static float TO_RADIAN(SwFixed angle) -{ - return (float(angle) / 65536.0f) * (MATH_PI / 180.0f); -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -SwFixed mathMean(SwFixed angle1, SwFixed angle2) -{ - return angle1 + mathDiff(angle1, angle2) / 2; -} - - -bool mathSmallCubic(const SwPoint* base, SwFixed& angleIn, SwFixed& angleMid, SwFixed& angleOut) -{ - auto d1 = base[2] - base[3]; - auto d2 = base[1] - base[2]; - auto d3 = base[0] - base[1]; - - if (d1.small()) { - if (d2.small()) { - if (d3.small()) { - angleIn = angleMid = angleOut = 0; - return true; - } else { - angleIn = angleMid = angleOut = mathAtan(d3); - } - } else { - if (d3.small()) { - angleIn = angleMid = angleOut = mathAtan(d2); - } else { - angleIn = angleMid = mathAtan(d2); - angleOut = mathAtan(d3); - } - } - } else { - if (d2.small()) { - if (d3.small()) { - angleIn = angleMid = angleOut = mathAtan(d1); - } else { - angleIn = mathAtan(d1); - angleOut = mathAtan(d3); - angleMid = mathMean(angleIn, angleOut); - } - } else { - if (d3.small()) { - angleIn = mathAtan(d1); - angleMid = angleOut = mathAtan(d2); - } else { - angleIn = mathAtan(d1); - angleMid = mathAtan(d2); - angleOut = mathAtan(d3); - } - } - } - - auto theta1 = abs(mathDiff(angleIn, angleMid)); - auto theta2 = abs(mathDiff(angleMid, angleOut)); - - if ((theta1 < (SW_ANGLE_PI / 8)) && (theta2 < (SW_ANGLE_PI / 8))) return true; - return false; -} - - -int64_t mathMultiply(int64_t a, int64_t b) -{ - int32_t s = 1; - - //move sign - if (a < 0) { - a = -a; - s = -s; - } - if (b < 0) { - b = -b; - s = -s; - } - int64_t c = (a * b + 0x8000L) >> 16; - return (s > 0) ? c : -c; -} - - -int64_t mathDivide(int64_t a, int64_t b) -{ - int32_t s = 1; - - //move sign - if (a < 0) { - a = -a; - s = -s; - } - if (b < 0) { - b = -b; - s = -s; - } - int64_t q = b > 0 ? ((a << 16) + (b >> 1)) / b : 0x7FFFFFFFL; - return (s < 0 ? -q : q); -} - - -int64_t mathMulDiv(int64_t a, int64_t b, int64_t c) -{ - int32_t s = 1; - - //move sign - if (a < 0) { - a = -a; - s = -s; - } - if (b < 0) { - b = -b; - s = -s; - } - if (c < 0) { - c = -c; - s = -s; - } - int64_t d = c > 0 ? (a * b + (c >> 1)) / c : 0x7FFFFFFFL; - - return (s > 0 ? d : -d); -} - - -void mathRotate(SwPoint& pt, SwFixed angle) -{ - if (angle == 0 || pt.zero()) return; - - Point v = pt.toPoint(); - - auto radian = TO_RADIAN(angle); - auto cosv = cosf(radian); - auto sinv = sinf(radian); - - pt.x = SwCoord(roundf((v.x * cosv - v.y * sinv) * 64.0f)); - pt.y = SwCoord(roundf((v.x * sinv + v.y * cosv) * 64.0f)); -} - - -SwFixed mathTan(SwFixed angle) -{ - if (angle == 0) return 0; - return SwFixed(tanf(TO_RADIAN(angle)) * 65536.0f); -} - - -SwFixed mathAtan(const SwPoint& pt) -{ - if (pt.zero()) return 0; - return SwFixed(atan2f(TO_FLOAT(pt.y), TO_FLOAT(pt.x)) * (180.0f / MATH_PI) * 65536.0f); -} - - -SwFixed mathSin(SwFixed angle) -{ - if (angle == 0) return 0; - return mathCos(SW_ANGLE_PI2 - angle); -} - - -SwFixed mathCos(SwFixed angle) -{ - return SwFixed(cosf(TO_RADIAN(angle)) * 65536.0f); -} - - -SwFixed mathLength(const SwPoint& pt) -{ - if (pt.zero()) return 0; - - //trivial case - if (pt.x == 0) return abs(pt.y); - if (pt.y == 0) return abs(pt.x); - - auto v = pt.toPoint(); - //return static_cast(sqrtf(v.x * v.x + v.y * v.y) * 65536.0f); - - /* approximate sqrt(x*x + y*y) using alpha max plus beta min algorithm. - With alpha = 1, beta = 3/8, giving results with the largest error less - than 7% compared to the exact value. */ - if (v.x < 0) v.x = -v.x; - if (v.y < 0) v.y = -v.y; - return static_cast((v.x > v.y) ? (v.x + v.y * 0.375f) : (v.y + v.x * 0.375f)); -} - - -void mathSplitCubic(SwPoint* base) -{ - SwCoord a, b, c, d; - - base[6].x = base[3].x; - c = base[1].x; - d = base[2].x; - base[1].x = a = (base[0].x + c) >> 1; - base[5].x = b = (base[3].x + d) >> 1; - c = (c + d) >> 1; - base[2].x = a = (a + c) >> 1; - base[4].x = b = (b + c) >> 1; - base[3].x = (a + b) >> 1; - - base[6].y = base[3].y; - c = base[1].y; - d = base[2].y; - base[1].y = a = (base[0].y + c) >> 1; - base[5].y = b = (base[3].y + d) >> 1; - c = (c + d) >> 1; - base[2].y = a = (a + c) >> 1; - base[4].y = b = (b + c) >> 1; - base[3].y = (a + b) >> 1; -} - - -SwFixed mathDiff(SwFixed angle1, SwFixed angle2) -{ - auto delta = angle2 - angle1; - - delta %= SW_ANGLE_2PI; - if (delta < 0) delta += SW_ANGLE_2PI; - if (delta > SW_ANGLE_PI) delta -= SW_ANGLE_2PI; - - return delta; -} - - -SwPoint mathTransform(const Point* to, const Matrix* transform) -{ - if (!transform) return {TO_SWCOORD(to->x), TO_SWCOORD(to->y)}; - - auto tx = to->x * transform->e11 + to->y * transform->e12 + transform->e13; - auto ty = to->x * transform->e21 + to->y * transform->e22 + transform->e23; - - return {TO_SWCOORD(tx), TO_SWCOORD(ty)}; -} - - -bool mathClipBBox(const SwBBox& clipper, SwBBox& clipee) -{ - clipee.max.x = (clipee.max.x < clipper.max.x) ? clipee.max.x : clipper.max.x; - clipee.max.y = (clipee.max.y < clipper.max.y) ? clipee.max.y : clipper.max.y; - clipee.min.x = (clipee.min.x > clipper.min.x) ? clipee.min.x : clipper.min.x; - clipee.min.y = (clipee.min.y > clipper.min.y) ? clipee.min.y : clipper.min.y; - - //Check valid region - if (clipee.max.x - clipee.min.x < 1 && clipee.max.y - clipee.min.y < 1) return false; - - //Check boundary - if (clipee.min.x >= clipper.max.x || clipee.min.y >= clipper.max.y || - clipee.max.x <= clipper.min.x || clipee.max.y <= clipper.min.y) return false; - - return true; -} - - -bool mathUpdateOutlineBBox(const SwOutline* outline, const SwBBox& clipRegion, SwBBox& renderRegion, bool fastTrack) -{ - if (!outline) return false; - - if (outline->pts.empty() || outline->cntrs.empty()) { - renderRegion.reset(); - return false; - } - - auto pt = outline->pts.begin(); - - auto xMin = pt->x; - auto xMax = pt->x; - auto yMin = pt->y; - auto yMax = pt->y; - - for (++pt; pt < outline->pts.end(); ++pt) { - if (xMin > pt->x) xMin = pt->x; - if (xMax < pt->x) xMax = pt->x; - if (yMin > pt->y) yMin = pt->y; - if (yMax < pt->y) yMax = pt->y; - } - //Since no antialiasing is applied in the Fast Track case, - //the rasterization region has to be rearranged. - //https://github.com/Samsung/thorvg/issues/916 - if (fastTrack) { - renderRegion.min.x = static_cast(round(xMin / 64.0f)); - renderRegion.max.x = static_cast(round(xMax / 64.0f)); - renderRegion.min.y = static_cast(round(yMin / 64.0f)); - renderRegion.max.y = static_cast(round(yMax / 64.0f)); - } else { - renderRegion.min.x = xMin >> 6; - renderRegion.max.x = (xMax + 63) >> 6; - renderRegion.min.y = yMin >> 6; - renderRegion.max.y = (yMax + 63) >> 6; - } - return mathClipBBox(clipRegion, renderRegion); -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwMemPool.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwMemPool.cpp deleted file mode 100644 index 4a9d7f5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwMemPool.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgSwCommon.h" - - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -SwOutline* mpoolReqOutline(SwMpool* mpool, unsigned idx) -{ - return &mpool->outline[idx]; -} - - -void mpoolRetOutline(SwMpool* mpool, unsigned idx) -{ - mpool->outline[idx].pts.clear(); - mpool->outline[idx].cntrs.clear(); - mpool->outline[idx].types.clear(); - mpool->outline[idx].closed.clear(); -} - - -SwOutline* mpoolReqStrokeOutline(SwMpool* mpool, unsigned idx) -{ - return &mpool->strokeOutline[idx]; -} - - -void mpoolRetStrokeOutline(SwMpool* mpool, unsigned idx) -{ - mpool->strokeOutline[idx].pts.clear(); - mpool->strokeOutline[idx].cntrs.clear(); - mpool->strokeOutline[idx].types.clear(); - mpool->strokeOutline[idx].closed.clear(); -} - - -SwOutline* mpoolReqDashOutline(SwMpool* mpool, unsigned idx) -{ - return &mpool->dashOutline[idx]; -} - - -void mpoolRetDashOutline(SwMpool* mpool, unsigned idx) -{ - mpool->dashOutline[idx].pts.clear(); - mpool->dashOutline[idx].cntrs.clear(); - mpool->dashOutline[idx].types.clear(); - mpool->dashOutline[idx].closed.clear(); -} - - -SwMpool* mpoolInit(uint32_t threads) -{ - auto allocSize = threads + 1; - - auto mpool = static_cast(calloc(sizeof(SwMpool), 1)); - mpool->outline = static_cast(calloc(1, sizeof(SwOutline) * allocSize)); - mpool->strokeOutline = static_cast(calloc(1, sizeof(SwOutline) * allocSize)); - mpool->dashOutline = static_cast(calloc(1, sizeof(SwOutline) * allocSize)); - mpool->allocSize = allocSize; - - return mpool; -} - - -bool mpoolClear(SwMpool* mpool) -{ - for (unsigned i = 0; i < mpool->allocSize; ++i) { - mpool->outline[i].pts.reset(); - mpool->outline[i].cntrs.reset(); - mpool->outline[i].types.reset(); - mpool->outline[i].closed.reset(); - - mpool->strokeOutline[i].pts.reset(); - mpool->strokeOutline[i].cntrs.reset(); - mpool->strokeOutline[i].types.reset(); - mpool->strokeOutline[i].closed.reset(); - - mpool->dashOutline[i].pts.reset(); - mpool->dashOutline[i].cntrs.reset(); - mpool->dashOutline[i].types.reset(); - mpool->dashOutline[i].closed.reset(); - } - - return true; -} - - -bool mpoolTerm(SwMpool* mpool) -{ - if (!mpool) return false; - - mpoolClear(mpool); - - free(mpool->outline); - free(mpool->strokeOutline); - free(mpool->dashOutline); - free(mpool); - - return true; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRaster.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRaster.cpp deleted file mode 100644 index 237e30d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRaster.cpp +++ /dev/null @@ -1,1967 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifdef _WIN32 - #include -#elif defined(__linux__) - #include -#else - #include -#endif - -#include "tvgMath.h" -#include "tvgRender.h" -#include "tvgSwCommon.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ -constexpr auto DOWN_SCALE_TOLERANCE = 0.5f; - -struct FillLinear -{ - void operator()(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, SwMask op, uint8_t a) - { - fillLinear(fill, dst, y, x, len, op, a); - } - - void operator()(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwMask op, uint8_t a) - { - fillLinear(fill, dst, y, x, len, cmp, op, a); - } - - void operator()(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, uint8_t a) - { - fillLinear(fill, dst, y, x, len, op, a); - } - - void operator()(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwAlpha alpha, uint8_t csize, uint8_t opacity) - { - fillLinear(fill, dst, y, x, len, cmp, alpha, csize, opacity); - } - - void operator()(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, SwBlender op2, uint8_t a) - { - fillLinear(fill, dst, y, x, len, op, op2, a); - } - -}; - -struct FillRadial -{ - void operator()(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, SwMask op, uint8_t a) - { - fillRadial(fill, dst, y, x, len, op, a); - } - - void operator()(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwMask op, uint8_t a) - { - fillRadial(fill, dst, y, x, len, cmp, op, a); - } - - void operator()(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, uint8_t a) - { - fillRadial(fill, dst, y, x, len, op, a); - } - - void operator()(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwAlpha alpha, uint8_t csize, uint8_t opacity) - { - fillRadial(fill, dst, y, x, len, cmp, alpha, csize, opacity); - } - - void operator()(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, SwBlender op2, uint8_t a) - { - fillRadial(fill, dst, y, x, len, op, op2, a); - } -}; - - -static inline uint8_t _alpha(uint8_t* a) -{ - return *a; -} - - -static inline uint8_t _ialpha(uint8_t* a) -{ - return ~(*a); -} - - -static inline uint8_t _abgrLuma(uint8_t* c) -{ - auto v = *(uint32_t*)c; - return ((((v&0xff)*54) + (((v>>8)&0xff)*183) + (((v>>16)&0xff)*19))) >> 8; //0.2125*R + 0.7154*G + 0.0721*B -} - - -static inline uint8_t _argbLuma(uint8_t* c) -{ - auto v = *(uint32_t*)c; - return ((((v&0xff)*19) + (((v>>8)&0xff)*183) + (((v>>16)&0xff)*54))) >> 8; //0.0721*B + 0.7154*G + 0.2125*R -} - - -static inline uint8_t _abgrInvLuma(uint8_t* c) -{ - return ~_abgrLuma(c); -} - - -static inline uint8_t _argbInvLuma(uint8_t* c) -{ - return ~_argbLuma(c); -} - - -static inline uint32_t _abgrJoin(uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - return (a << 24 | b << 16 | g << 8 | r); -} - - -static inline uint32_t _argbJoin(uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - return (a << 24 | r << 16 | g << 8 | b); -} - -static inline bool _blending(const SwSurface* surface) -{ - return (surface->blender) ? true : false; -} - - -/* OPTIMIZE_ME: Probably, we can separate masking(8bits) / composition(32bits) - This would help to enhance the performance by avoiding the unnecessary matting from the composition */ -static inline bool _compositing(const SwSurface* surface) -{ - if (!surface->compositor || (int)surface->compositor->method <= (int)CompositeMethod::ClipPath) return false; - return true; -} - - -static inline bool _matting(const SwSurface* surface) -{ - if ((int)surface->compositor->method < (int)CompositeMethod::AddMask) return true; - else return false; -} - -static inline uint8_t _opMaskNone(uint8_t s, TVG_UNUSED uint8_t d, TVG_UNUSED uint8_t a) -{ - return s; -} - -static inline uint8_t _opMaskAdd(uint8_t s, uint8_t d, uint8_t a) -{ - return s + MULTIPLY(d, a); -} - - -static inline uint8_t _opMaskSubtract(uint8_t s, uint8_t d, TVG_UNUSED uint8_t a) -{ - return MULTIPLY(s, 255 - d); -} - - -static inline uint8_t _opMaskIntersect(uint8_t s, uint8_t d, TVG_UNUSED uint8_t a) -{ - return MULTIPLY(s, d); -} - - -static inline uint8_t _opMaskDifference(uint8_t s, uint8_t d, uint8_t a) -{ - return MULTIPLY(s, 255 - d) + MULTIPLY(d, a); -} - - -static inline bool _direct(CompositeMethod method) -{ - //subtract & Intersect allows the direct composition - if (method == CompositeMethod::SubtractMask || method == CompositeMethod::IntersectMask) return true; - return false; -} - - -static inline SwMask _getMaskOp(CompositeMethod method) -{ - switch (method) { - case CompositeMethod::AddMask: return _opMaskAdd; - case CompositeMethod::SubtractMask: return _opMaskSubtract; - case CompositeMethod::DifferenceMask: return _opMaskDifference; - case CompositeMethod::IntersectMask: return _opMaskIntersect; - default: return nullptr; - } -} - - -static bool _compositeMaskImage(SwSurface* surface, const SwImage* image, const SwBBox& region) -{ - auto dbuffer = &surface->buf8[region.min.y * surface->stride + region.min.x]; - auto sbuffer = image->buf8 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); - - for (auto y = region.min.y; y < region.max.y; ++y) { - auto dst = dbuffer; - auto src = sbuffer; - for (auto x = region.min.x; x < region.max.x; x++, dst++, src++) { - *dst = *src + MULTIPLY(*dst, ~*src); - } - dbuffer += surface->stride; - sbuffer += image->stride; - } - return true; -} - - -#include "tvgSwRasterTexmap.h" -#include "tvgSwRasterC.h" -#include "tvgSwRasterAvx.h" -#include "tvgSwRasterNeon.h" - - -static inline uint32_t _sampleSize(float scale) -{ - auto sampleSize = static_cast(0.5f / scale); - if (sampleSize == 0) sampleSize = 1; - return sampleSize; -} - - -//Bilinear Interpolation -//OPTIMIZE_ME: Skip the function pointer access -static uint32_t _interpUpScaler(const uint32_t *img, TVG_UNUSED uint32_t stride, uint32_t w, uint32_t h, float sx, float sy, TVG_UNUSED int32_t miny, TVG_UNUSED int32_t maxy, TVG_UNUSED int32_t n) -{ - auto rx = (size_t)(sx); - auto ry = (size_t)(sy); - auto rx2 = rx + 1; - if (rx2 >= w) rx2 = w - 1; - auto ry2 = ry + 1; - if (ry2 >= h) ry2 = h - 1; - - auto dx = (sx > 0.0f) ? static_cast((sx - rx) * 255.0f) : 0; - auto dy = (sy > 0.0f) ? static_cast((sy - ry) * 255.0f) : 0; - - auto c1 = img[rx + ry * w]; - auto c2 = img[rx2 + ry * w]; - auto c3 = img[rx + ry2 * w]; - auto c4 = img[rx2 + ry2 * w]; - - return INTERPOLATE(INTERPOLATE(c4, c3, dx), INTERPOLATE(c2, c1, dx), dy); -} - - -//2n x 2n Mean Kernel -//OPTIMIZE_ME: Skip the function pointer access -static uint32_t _interpDownScaler(const uint32_t *img, uint32_t stride, uint32_t w, uint32_t h, float sx, TVG_UNUSED float sy, int32_t miny, int32_t maxy, int32_t n) -{ - size_t c[4] = {0, 0, 0, 0}; - - int32_t minx = (int32_t)sx - n; - if (minx < 0) minx = 0; - - int32_t maxx = (int32_t)sx + n; - if (maxx >= (int32_t)w) maxx = w; - - int32_t inc = (n / 2) + 1; - n = 0; - - auto src = img + minx + miny * stride; - - for (auto y = miny; y < maxy; y += inc) { - auto p = src; - for (auto x = minx; x < maxx; x += inc, p += inc) { - c[0] += A(*p); - c[1] += C1(*p); - c[2] += C2(*p); - c[3] += C3(*p); - ++n; - } - src += (stride * inc); - } - - c[0] /= n; - c[1] /= n; - c[2] /= n; - c[3] /= n; - - return (c[0] << 24) | (c[1] << 16) | (c[2] << 8) | c[3]; -} - - -/************************************************************************/ -/* Rect */ -/************************************************************************/ - -static bool _rasterCompositeMaskedRect(SwSurface* surface, const SwBBox& region, SwMask maskOp, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - auto w = static_cast(region.max.x - region.min.x); - auto h = static_cast(region.max.y - region.min.y); - auto cstride = surface->compositor->image.stride; - auto cbuffer = surface->compositor->image.buf8 + (region.min.y * cstride + region.min.x); //compositor buffer - auto ialpha = 255 - a; - - for (uint32_t y = 0; y < h; ++y) { - auto cmp = cbuffer; - for (uint32_t x = 0; x < w; ++x, ++cmp) { - *cmp = maskOp(a, *cmp, ialpha); - } - cbuffer += cstride; - } - return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); -} - - -static bool _rasterDirectMaskedRect(SwSurface* surface, const SwBBox& region, SwMask maskOp, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - auto w = static_cast(region.max.x - region.min.x); - auto h = static_cast(region.max.y - region.min.y); - auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x); //compositor buffer - auto dbuffer = surface->buf8 + (region.min.y * surface->stride + region.min.x); //destination buffer - - for (uint32_t y = 0; y < h; ++y) { - auto cmp = cbuffer; - auto dst = dbuffer; - for (uint32_t x = 0; x < w; ++x, ++cmp, ++dst) { - auto tmp = maskOp(a, *cmp, 0); //not use alpha. - *dst = tmp + MULTIPLY(*dst, ~tmp); - } - cbuffer += surface->compositor->image.stride; - dbuffer += surface->stride; - } - return true; -} - - -static bool _rasterMaskedRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - //8bit masking channels composition - if (surface->channelSize != sizeof(uint8_t)) return false; - - TVGLOG("SW_ENGINE", "Masked(%d) Rect [Region: %lu %lu %lu %lu]", (int)surface->compositor->method, region.min.x, region.min.y, region.max.x - region.min.x, region.max.y - region.min.y); - - auto maskOp = _getMaskOp(surface->compositor->method); - if (_direct(surface->compositor->method)) return _rasterDirectMaskedRect(surface, region, maskOp, r, g, b, a); - else return _rasterCompositeMaskedRect(surface, region, maskOp, r, g, b, a); - return false; -} - - -static bool _rasterMattedRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - auto w = static_cast(region.max.x - region.min.x); - auto h = static_cast(region.max.y - region.min.y); - auto csize = surface->compositor->image.channelSize; - auto cbuffer = surface->compositor->image.buf8 + ((region.min.y * surface->compositor->image.stride + region.min.x) * csize); //compositor buffer - auto alpha = surface->alpha(surface->compositor->method); - - TVGLOG("SW_ENGINE", "Matted(%d) Rect [Region: %lu %lu %u %u]", (int)surface->compositor->method, region.min.x, region.min.y, w, h); - - //32bits channels - if (surface->channelSize == sizeof(uint32_t)) { - auto color = surface->join(r, g, b, a); - auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; - for (uint32_t y = 0; y < h; ++y) { - auto dst = &buffer[y * surface->stride]; - auto cmp = &cbuffer[y * surface->compositor->image.stride * csize]; - for (uint32_t x = 0; x < w; ++x, ++dst, cmp += csize) { - *dst = INTERPOLATE(color, *dst, alpha(cmp)); - } - } - //8bits grayscale - } else if (surface->channelSize == sizeof(uint8_t)) { - auto buffer = surface->buf8 + (region.min.y * surface->stride) + region.min.x; - for (uint32_t y = 0; y < h; ++y) { - auto dst = &buffer[y * surface->stride]; - auto cmp = &cbuffer[y * surface->compositor->image.stride * csize]; - for (uint32_t x = 0; x < w; ++x, ++dst, cmp += csize) { - *dst = INTERPOLATE8(a, *dst, alpha(cmp)); - } - } - } - return true; -} - - -static bool _rasterBlendingRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - if (surface->channelSize != sizeof(uint32_t)) return false; - - auto w = static_cast(region.max.x - region.min.x); - auto h = static_cast(region.max.y - region.min.y); - auto color = surface->join(r, g, b, a); - auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; - auto ialpha = 255 - a; - - for (uint32_t y = 0; y < h; ++y) { - auto dst = &buffer[y * surface->stride]; - for (uint32_t x = 0; x < w; ++x, ++dst) { - *dst = surface->blender(color, *dst, ialpha); - } - } - return true; -} - - -static bool _rasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ -#if defined(THORVG_AVX_VECTOR_SUPPORT) - return avxRasterTranslucentRect(surface, region, r, g, b, a); -#elif defined(THORVG_NEON_VECTOR_SUPPORT) - return neonRasterTranslucentRect(surface, region, r, g, b, a); -#else - return cRasterTranslucentRect(surface, region, r, g, b, a); -#endif -} - - -static bool _rasterSolidRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b) -{ - auto w = static_cast(region.max.x - region.min.x); - auto h = static_cast(region.max.y - region.min.y); - - //32bits channels - if (surface->channelSize == sizeof(uint32_t)) { - auto color = surface->join(r, g, b, 255); - auto buffer = surface->buf32 + (region.min.y * surface->stride); - for (uint32_t y = 0; y < h; ++y) { - rasterPixel32(buffer + y * surface->stride, color, region.min.x, w); - } - return true; - } - //8bits grayscale - if (surface->channelSize == sizeof(uint8_t)) { - for (uint32_t y = 0; y < h; ++y) { - rasterGrayscale8(surface->buf8, 255, (y + region.min.y) * surface->stride + region.min.x, w); - } - return true; - } - return false; -} - - -static bool _rasterRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - if (_compositing(surface)) { - if (_matting(surface)) return _rasterMattedRect(surface, region, r, g, b, a); - else return _rasterMaskedRect(surface, region, r, g, b, a); - } else if (_blending(surface)) { - return _rasterBlendingRect(surface, region, r, g, b, a); - } else { - if (a == 255) return _rasterSolidRect(surface, region, r, g, b); - else return _rasterTranslucentRect(surface, region, r, g, b, a); - } - return false; -} - - -/************************************************************************/ -/* Rle */ -/************************************************************************/ - -static bool _rasterCompositeMaskedRle(SwSurface* surface, SwRleData* rle, SwMask maskOp, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - auto span = rle->spans; - auto cbuffer = surface->compositor->image.buf8; - auto cstride = surface->compositor->image.stride; - uint8_t src; - - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto cmp = &cbuffer[span->y * cstride + span->x]; - if (span->coverage == 255) src = a; - else src = MULTIPLY(a, span->coverage); - auto ialpha = 255 - src; - for (auto x = 0; x < span->len; ++x, ++cmp) { - *cmp = maskOp(src, *cmp, ialpha); - } - } - return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); -} - - -static bool _rasterDirectMaskedRle(SwSurface* surface, SwRleData* rle, SwMask maskOp, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - auto span = rle->spans; - auto cbuffer = surface->compositor->image.buf8; - auto cstride = surface->compositor->image.stride; - uint8_t src; - - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto cmp = &cbuffer[span->y * cstride + span->x]; - auto dst = &surface->buf8[span->y * surface->stride + span->x]; - if (span->coverage == 255) src = a; - else src = MULTIPLY(a, span->coverage); - for (auto x = 0; x < span->len; ++x, ++cmp, ++dst) { - auto tmp = maskOp(src, *cmp, 0); //not use alpha - *dst = tmp + MULTIPLY(*dst, ~tmp); - } - } - return true; -} - - -static bool _rasterMaskedRle(SwSurface* surface, SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - TVGLOG("SW_ENGINE", "Masked(%d) Rle", (int)surface->compositor->method); - - //8bit masking channels composition - if (surface->channelSize != sizeof(uint8_t)) return false; - - auto maskOp = _getMaskOp(surface->compositor->method); - if (_direct(surface->compositor->method)) return _rasterDirectMaskedRle(surface, rle, maskOp, r, g, b, a); - else return _rasterCompositeMaskedRle(surface, rle, maskOp, r, g, b, a); - return false; -} - - -static bool _rasterMattedRle(SwSurface* surface, SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - TVGLOG("SW_ENGINE", "Matted(%d) Rle", (int)surface->compositor->method); - - auto span = rle->spans; - auto cbuffer = surface->compositor->image.buf8; - auto csize = surface->compositor->image.channelSize; - auto alpha = surface->alpha(surface->compositor->method); - - //32bit channels - if (surface->channelSize == sizeof(uint32_t)) { - uint32_t src; - auto color = surface->join(r, g, b, a); - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; - if (span->coverage == 255) src = color; - else src = ALPHA_BLEND(color, span->coverage); - for (uint32_t x = 0; x < span->len; ++x, ++dst, cmp += csize) { - auto tmp = ALPHA_BLEND(src, alpha(cmp)); - *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); - } - } - return true; - } - //8bit grayscale - if (surface->channelSize == sizeof(uint8_t)) { - uint8_t src; - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buf8[span->y * surface->stride + span->x]; - auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; - if (span->coverage == 255) src = a; - else src = MULTIPLY(a, span->coverage); - for (uint32_t x = 0; x < span->len; ++x, ++dst, cmp += csize) { - *dst = INTERPOLATE8(src, *dst, alpha(cmp)); - } - } - return true; - } - return false; -} - - -static bool _rasterBlendingRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - if (surface->channelSize != sizeof(uint32_t)) return false; - - auto span = rle->spans; - auto color = surface->join(r, g, b, a); - auto ialpha = 255 - a; - - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - if (span->coverage == 255) { - for (uint32_t x = 0; x < span->len; ++x, ++dst) { - *dst = surface->blender(color, *dst, ialpha); - } - } else { - for (uint32_t x = 0; x < span->len; ++x, ++dst) { - auto tmp = surface->blender(color, *dst, ialpha); - *dst = INTERPOLATE(tmp, *dst, span->coverage); - } - } - } - return true; -} - - -static bool _rasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ -#if defined(THORVG_AVX_VECTOR_SUPPORT) - return avxRasterTranslucentRle(surface, rle, r, g, b, a); -#elif defined(THORVG_NEON_VECTOR_SUPPORT) - return neonRasterTranslucentRle(surface, rle, r, g, b, a); -#else - return cRasterTranslucentRle(surface, rle, r, g, b, a); -#endif -} - - -static bool _rasterSolidRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b) -{ - auto span = rle->spans; - - //32bit channels - if (surface->channelSize == sizeof(uint32_t)) { - auto color = surface->join(r, g, b, 255); - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - if (span->coverage == 255) { - rasterPixel32(surface->buf32 + span->y * surface->stride, color, span->x, span->len); - } else { - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - auto src = ALPHA_BLEND(color, span->coverage); - auto ialpha = 255 - span->coverage; - for (uint32_t x = 0; x < span->len; ++x, ++dst) { - *dst = src + ALPHA_BLEND(*dst, ialpha); - } - } - } - //8bit grayscale - } else if (surface->channelSize == sizeof(uint8_t)) { - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - if (span->coverage == 255) { - rasterGrayscale8(surface->buf8, span->coverage, span->y * surface->stride + span->x, span->len); - } else { - auto dst = &surface->buf8[span->y * surface->stride + span->x]; - auto ialpha = 255 - span->coverage; - for (uint32_t x = 0; x < span->len; ++x, ++dst) { - *dst = span->coverage + MULTIPLY(*dst, ialpha); - } - } - } - } - return true; -} - - -static bool _rasterRle(SwSurface* surface, SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - if (!rle) return false; - - if (_compositing(surface)) { - if (_matting(surface)) return _rasterMattedRle(surface, rle, r, g, b, a); - else return _rasterMaskedRle(surface, rle, r, g, b, a); - } else if (_blending(surface)) { - return _rasterBlendingRle(surface, rle, r, g, b, a); - } else { - if (a == 255) return _rasterSolidRle(surface, rle, r, g, b); - else return _rasterTranslucentRle(surface, rle, r, g, b, a); - } - return false; -} - - -/************************************************************************/ -/* RLE Scaled Image */ -/************************************************************************/ - -#define SCALED_IMAGE_RANGE_Y(y) \ - auto sy = (y) * itransform->e22 + itransform->e23 - 0.49f; \ - if (sy <= -0.5f || (uint32_t)(sy + 0.5f) >= image->h) continue; \ - if (scaleMethod == _interpDownScaler) { \ - auto my = (int32_t)round(sy); \ - miny = my - (int32_t)sampleSize; \ - if (miny < 0) miny = 0; \ - maxy = my + (int32_t)sampleSize; \ - if (maxy >= (int32_t)image->h) maxy = (int32_t)image->h; \ - } - -#define SCALED_IMAGE_RANGE_X \ - auto sx = (x) * itransform->e11 + itransform->e13 - 0.49f; \ - if (sx <= -0.5f || (uint32_t)(sx + 0.5f) >= image->w) continue; \ - - -#if 0 //Enable it when GRAYSCALE image is supported -static bool _rasterCompositeScaledMaskedRleImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, SwMask maskOp, uint8_t opacity) -{ - auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; - auto sampleSize = _sampleSize(image->scale); - auto span = image->rle->spans; - int32_t miny = 0, maxy = 0; - - for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - SCALED_IMAGE_RANGE_Y(span->y) - auto cmp = &surface->compositor->image.buf8[span->y * surface->compositor->image.stride + span->x]; - auto a = MULTIPLY(span->coverage, opacity); - for (uint32_t x = static_cast(span->x); x < static_cast(span->x) + span->len; ++x, ++cmp) { - SCALED_IMAGE_RANGE_X - auto src = scaleMethod(image->buf8, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); - if (a < 255) src = MULTIPLY(src, a); - *cmp = maskOp(src, *cmp, ~src); - } - } - return true; -} - - -static bool _rasterDirectScaledMaskedRleImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, SwMask maskOp, uint8_t opacity) -{ - auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; - auto sampleSize = _sampleSize(image->scale); - auto span = image->rle->spans; - int32_t miny = 0, maxy = 0; - - for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - SCALED_IMAGE_RANGE_Y(span->y) - auto cmp = &surface->compositor->image.buf8[span->y * surface->compositor->image.stride + span->x]; - auto dst = &surface->buf8[span->y * surface->stride + span->x]; - auto a = MULTIPLY(span->coverage, opacity); - for (uint32_t x = static_cast(span->x); x < static_cast(span->x) + span->len; ++x, ++cmp, ++dst) { - SCALED_IMAGE_RANGE_X - auto src = scaleMethod(image->buf8, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); - if (a < 255) src = MULTIPLY(src, a); - src = maskOp(src, *cmp, 0); //not use alpha - *dst = src + MULTIPLY(*dst, ~src); - } - } - return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); -} -#endif - -static bool _rasterScaledMaskedRleImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) -{ -#if 0 //Enable it when GRAYSCALE image is supported - TVGLOG("SW_ENGINE", "Scaled Masked(%d) Rle Image", (int)surface->compositor->method); - - //8bit masking channels composition - if (surface->channelSize != sizeof(uint8_t)) return false; - - auto maskOp = _getMaskOp(surface->compositor->method); - if (_direct(surface->compositor->method)) return _rasterDirectScaledMaskedRleImage(surface, image, itransform, region, maskOp, opacity); - else return _rasterCompositeScaledMaskedRleImage(surface, image, itransform, region, maskOp, opacity); -#endif - return false; -} - - -static bool _rasterScaledMattedRleImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) -{ - TVGLOG("SW_ENGINE", "Scaled Matted(%d) Rle Image", (int)surface->compositor->method); - - auto span = image->rle->spans; - auto csize = surface->compositor->image.channelSize; - auto alpha = surface->alpha(surface->compositor->method); - auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; - auto sampleSize = _sampleSize(image->scale); - int32_t miny = 0, maxy = 0; - - for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - SCALED_IMAGE_RANGE_Y(span->y) - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - auto cmp = &surface->compositor->image.buf8[(span->y * surface->compositor->image.stride + span->x) * csize]; - auto a = MULTIPLY(span->coverage, opacity); - for (uint32_t x = static_cast(span->x); x < static_cast(span->x) + span->len; ++x, ++dst, cmp += csize) { - SCALED_IMAGE_RANGE_X - auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); - src = ALPHA_BLEND(src, (a == 255) ? alpha(cmp) : MULTIPLY(alpha(cmp), a)); - *dst = src + ALPHA_BLEND(*dst, IA(src)); - } - } - - return true; -} - - -static bool _rasterScaledBlendingRleImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) -{ - auto span = image->rle->spans; - auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; - auto sampleSize = _sampleSize(image->scale); - int32_t miny = 0, maxy = 0; - - for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - SCALED_IMAGE_RANGE_Y(span->y) - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - auto alpha = MULTIPLY(span->coverage, opacity); - if (alpha == 255) { - for (uint32_t x = static_cast(span->x); x < static_cast(span->x) + span->len; ++x, ++dst) { - SCALED_IMAGE_RANGE_X - auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); - auto tmp = surface->blender(src, *dst, 255); - *dst = INTERPOLATE(tmp, *dst, A(src)); - } - } else { - for (uint32_t x = static_cast(span->x); x < static_cast(span->x) + span->len; ++x, ++dst) { - SCALED_IMAGE_RANGE_X - auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); - if (opacity < 255) src = ALPHA_BLEND(src, opacity); - auto tmp = surface->blender(src, *dst, 255); - *dst = INTERPOLATE(tmp, *dst, MULTIPLY(span->coverage, A(src))); - } - } - } - return true; -} - - -static bool _rasterScaledRleImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) -{ - auto span = image->rle->spans; - auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; - auto sampleSize = _sampleSize(image->scale); - int32_t miny = 0, maxy = 0; - - for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - SCALED_IMAGE_RANGE_Y(span->y) - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - auto alpha = MULTIPLY(span->coverage, opacity); - for (uint32_t x = static_cast(span->x); x < static_cast(span->x) + span->len; ++x, ++dst) { - SCALED_IMAGE_RANGE_X - auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); - if (alpha < 255) src = ALPHA_BLEND(src, alpha); - *dst = src + ALPHA_BLEND(*dst, IA(src)); - } - } - return true; -} - - -static bool _scaledRleImage(SwSurface* surface, const SwImage* image, const Matrix* transform, const SwBBox& region, uint8_t opacity) -{ - if (surface->channelSize == sizeof(uint8_t)) { - TVGERR("SW_ENGINE", "Not supported scaled rle image!"); - return false; - } - - Matrix itransform; - - if (transform) { - if (!mathInverse(transform, &itransform)) return false; - } else mathIdentity(&itransform); - - if (_compositing(surface)) { - if (_matting(surface)) return _rasterScaledMattedRleImage(surface, image, &itransform, region, opacity); - else return _rasterScaledMaskedRleImage(surface, image, &itransform, region, opacity); - } else if (_blending(surface)) { - return _rasterScaledBlendingRleImage(surface, image, &itransform, region, opacity); - } else { - return _rasterScaledRleImage(surface, image, &itransform, region, opacity); - } - return false; -} - - -/************************************************************************/ -/* RLE Direct Image */ -/************************************************************************/ - -#if 0 //Enable it when GRAYSCALE image is supported -static bool _rasterCompositeDirectMaskedRleImage(SwSurface* surface, const SwImage* image, SwMask maskOp, uint8_t opacity) -{ - auto span = image->rle->spans; - auto cbuffer = surface->compositor->image.buf8; - auto cstride = surface->compositor->image.stride; - - for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - auto src = image->buf8 + (span->y + image->oy) * image->stride + (span->x + image->ox); - auto cmp = &cbuffer[span->y * cstride + span->x]; - auto alpha = MULTIPLY(span->coverage, opacity); - if (alpha == 255) { - for (uint32_t x = 0; x < span->len; ++x, ++src, ++cmp) { - *cmp = maskOp(*src, *cmp, ~*src); - } - } else { - for (uint32_t x = 0; x < span->len; ++x, ++src, ++cmp) { - auto tmp = MULTIPLY(*src, alpha); - *cmp = maskOp(*src, *cmp, ~tmp); - } - } - } - return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); -} - - -static bool _rasterDirectDirectMaskedRleImage(SwSurface* surface, const SwImage* image, SwMask maskOp, uint8_t opacity) -{ - auto span = image->rle->spans; - auto cbuffer = surface->compositor->image.buf8; - auto cstride = surface->compositor->image.stride; - - for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - auto src = image->buf8 + (span->y + image->oy) * image->stride + (span->x + image->ox); - auto cmp = &cbuffer[span->y * cstride + span->x]; - auto dst = &surface->buf8[span->y * surface->stride + span->x]; - auto alpha = MULTIPLY(span->coverage, opacity); - if (alpha == 255) { - for (uint32_t x = 0; x < span->len; ++x, ++src, ++cmp, ++dst) { - auto tmp = maskOp(*src, *cmp, 0); //not use alpha - *dst = INTERPOLATE8(tmp, *dst, (255 - tmp)); - } - } else { - for (uint32_t x = 0; x < span->len; ++x, ++src, ++cmp, ++dst) { - auto tmp = maskOp(MULTIPLY(*src, alpha), *cmp, 0); //not use alpha - *dst = INTERPOLATE8(tmp, *dst, (255 - tmp)); - } - } - } - return true; -} -#endif - -static bool _rasterDirectMaskedRleImage(SwSurface* surface, const SwImage* image, uint8_t opacity) -{ -#if 0 //Enable it when GRAYSCALE image is supported - TVGLOG("SW_ENGINE", "Direct Masked(%d) Rle Image", (int)surface->compositor->method); - - //8bit masking channels composition - if (surface->channelSize != sizeof(uint8_t)) return false; - - auto maskOp = _getMaskOp(surface->compositor->method); - if (_direct(surface->compositor->method)) _rasterDirectDirectMaskedRleImage(surface, image, maskOp, opacity); - else return _rasterCompositeDirectMaskedRleImage(surface, image, maskOp, opacity); -#endif - return false; -} - - -static bool _rasterDirectMattedRleImage(SwSurface* surface, const SwImage* image, uint8_t opacity) -{ - TVGLOG("SW_ENGINE", "Direct Matted(%d) Rle Image", (int)surface->compositor->method); - - auto span = image->rle->spans; - auto csize = surface->compositor->image.channelSize; - auto cbuffer = surface->compositor->image.buf8; - auto alpha = surface->alpha(surface->compositor->method); - - for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; - auto img = image->buf32 + (span->y + image->oy) * image->stride + (span->x + image->ox); - auto a = MULTIPLY(span->coverage, opacity); - if (a == 255) { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img, cmp += csize) { - auto tmp = ALPHA_BLEND(*img, alpha(cmp)); - *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); - } - } else { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img, cmp += csize) { - auto tmp = ALPHA_BLEND(*img, MULTIPLY(a, alpha(cmp))); - *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); - } - } - } - return true; -} - - -static bool _rasterDirectBlendingRleImage(SwSurface* surface, const SwImage* image, uint8_t opacity) -{ - auto span = image->rle->spans; - - for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - auto img = image->buf32 + (span->y + image->oy) * image->stride + (span->x + image->ox); - auto alpha = MULTIPLY(span->coverage, opacity); - if (alpha == 255) { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) { - *dst = surface->blender(*img, *dst, IA(*img)); - } - } else if (opacity == 255) { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) { - auto tmp = surface->blender(*img, *dst, 255); - *dst = INTERPOLATE(tmp, *dst, MULTIPLY(span->coverage, A(*img))); - } - } else { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) { - auto src = ALPHA_BLEND(*img, opacity); - auto tmp = surface->blender(src, *dst, IA(src)); - *dst = INTERPOLATE(tmp, *dst, MULTIPLY(span->coverage, A(src))); - } - } - } - return true; -} - - -static bool _rasterDirectRleImage(SwSurface* surface, const SwImage* image, uint8_t opacity) -{ - auto span = image->rle->spans; - - for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - auto img = image->buf32 + (span->y + image->oy) * image->stride + (span->x + image->ox); - auto alpha = MULTIPLY(span->coverage, opacity); - if (alpha == 255) { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) { - *dst = *img + ALPHA_BLEND(*dst, IA(*img)); - } - } else { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) { - auto src = ALPHA_BLEND(*img, alpha); - *dst = src + ALPHA_BLEND(*dst, IA(src)); - } - } - } - return true; -} - - -static bool _directRleImage(SwSurface* surface, const SwImage* image, uint8_t opacity) -{ - if (surface->channelSize == sizeof(uint8_t)) { - TVGERR("SW_ENGINE", "Not supported grayscale rle image!"); - return false; - } - - if (_compositing(surface)) { - if (_matting(surface)) return _rasterDirectMattedRleImage(surface, image, opacity); - else return _rasterDirectMaskedRleImage(surface, image, opacity); - } else if (_blending(surface)) { - return _rasterDirectBlendingRleImage(surface, image, opacity); - } else { - return _rasterDirectRleImage(surface, image, opacity); - } - return false; -} - - -/************************************************************************/ -/*Scaled Image */ -/************************************************************************/ - -#if 0 //Enable it when GRAYSCALE image is supported -static bool _rasterCompositeScaledMaskedImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, SwMask maskOp, uint8_t opacity) -{ - auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; - auto sampleSize = _sampleSize(image->scale); - auto cstride = surface->compositor->image.stride; - auto cbuffer = surface->compositor->image.buf8 + (region.min.y * cstride + region.min.x); - int32_t miny = 0, maxy = 0; - - for (auto y = region.min.y; y < region.max.y; ++y) { - SCALED_IMAGE_RANGE_Y(y) - auto cmp = cbuffer; - for (auto x = region.min.x; x < region.max.x; ++x, ++cmp) { - SCALED_IMAGE_RANGE_X - auto src = scaleMethod(image->buf8, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); - if (opacity < 255) src = MULTIPLY(src, opacity); - *cmp = maskOp(src, *cmp, ~src); - } - cbuffer += cstride; - } - return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); -} - - -static bool _rasterDirectScaledMaskedImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, SwMask maskOp, uint8_t opacity) -{ - auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; - auto sampleSize = _sampleSize(image->scale); - auto cstride = surface->compositor->image.stride; - auto cbuffer = surface->compositor->image.buf8 + (region.min.y * cstride + region.min.x); - auto dbuffer = surface->buf8 + (region.min.y * surface->stride + region.min.x); - int32_t miny = 0, maxy = 0; - - for (auto y = region.min.y; y < region.max.y; ++y) { - SCALED_IMAGE_RANGE_Y(y) - auto cmp = cbuffer; - auto dst = dbuffer; - for (auto x = region.min.x; x < region.max.x; ++x, ++cmp, ++dst) { - SCALED_IMAGE_RANGE_X - auto src = scaleMethod(image->buf8, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); - if (opacity < 255) src = MULTIPLY(src, opacity); - src = maskOp(src, *cmp, 0); //not use alpha - *dst = src + MULTIPLY(*dst, ~src); - } - cbuffer += cstride; - dbuffer += surface->stride; - } - return true; -} -#endif - -static bool _rasterScaledMaskedImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) -{ -#if 0 //Enable it when GRAYSCALE image is supported - TVGLOG("SW_ENGINE", "Scaled Masked(%d) Image [Region: %lu %lu %lu %lu]", (int)surface->compositor->method, region.min.x, region.min.y, region.max.x - region.min.x, region.max.y - region.min.y); - - auto maskOp = _getMaskOp(surface->compositor->method); - if (_direct(surface->compositor->method)) return _rasterDirectScaledMaskedImage(surface, image, itransform, region, maskOp, opacity); - else return _rasterCompositeScaledMaskedImage(surface, image, itransform, region, maskOp, opacity); -#endif - return false; -} - - -static bool _rasterScaledMattedImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) -{ - auto dbuffer = surface->buf32 + (region.min.y * surface->stride + region.min.x); - auto csize = surface->compositor->image.channelSize; - auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x) * csize; - auto alpha = surface->alpha(surface->compositor->method); - - TVGLOG("SW_ENGINE", "Scaled Matted(%d) Image [Region: %lu %lu %lu %lu]", (int)surface->compositor->method, region.min.x, region.min.y, region.max.x - region.min.x, region.max.y - region.min.y); - - auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; - auto sampleSize = _sampleSize(image->scale); - int32_t miny = 0, maxy = 0; - - for (auto y = region.min.y; y < region.max.y; ++y) { - SCALED_IMAGE_RANGE_Y(y) - auto dst = dbuffer; - auto cmp = cbuffer; - for (auto x = region.min.x; x < region.max.x; ++x, ++dst, cmp += csize) { - SCALED_IMAGE_RANGE_X - auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); - auto tmp = ALPHA_BLEND(src, opacity == 255 ? alpha(cmp) : MULTIPLY(opacity, alpha(cmp))); - *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); - } - dbuffer += surface->stride; - cbuffer += surface->compositor->image.stride * csize; - } - return true; -} - - -static bool _rasterScaledBlendingImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) -{ - auto dbuffer = surface->buf32 + (region.min.y * surface->stride + region.min.x); - auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; - auto sampleSize = _sampleSize(image->scale); - int32_t miny = 0, maxy = 0; - - for (auto y = region.min.y; y < region.max.y; ++y, dbuffer += surface->stride) { - SCALED_IMAGE_RANGE_Y(y) - auto dst = dbuffer; - for (auto x = region.min.x; x < region.max.x; ++x, ++dst) { - SCALED_IMAGE_RANGE_X - auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); - if (opacity < 255) ALPHA_BLEND(src, opacity); - auto tmp = surface->blender(src, *dst, 255); - *dst = INTERPOLATE(tmp, *dst, A(src)); - } - } - return true; -} - - -static bool _rasterScaledImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) -{ - auto dbuffer = surface->buf32 + (region.min.y * surface->stride + region.min.x); - auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; - auto sampleSize = _sampleSize(image->scale); - int32_t miny = 0, maxy = 0; - - for (auto y = region.min.y; y < region.max.y; ++y, dbuffer += surface->stride) { - SCALED_IMAGE_RANGE_Y(y) - auto dst = dbuffer; - for (auto x = region.min.x; x < region.max.x; ++x, ++dst) { - SCALED_IMAGE_RANGE_X - auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); - if (opacity < 255) src = ALPHA_BLEND(src, opacity); - *dst = src + ALPHA_BLEND(*dst, IA(src)); - } - } - return true; -} - - -static bool _scaledImage(SwSurface* surface, const SwImage* image, const Matrix* transform, const SwBBox& region, uint8_t opacity) -{ - if (surface->channelSize == sizeof(uint8_t)) { - TVGERR("SW_ENGINE", "Not supported grayscale Textmap polygon mesh!"); - return false; - } - - Matrix itransform; - - if (transform) { - if (!mathInverse(transform, &itransform)) return false; - } else mathIdentity(&itransform); - - if (_compositing(surface)) { - if (_matting(surface)) return _rasterScaledMattedImage(surface, image, &itransform, region, opacity); - else return _rasterScaledMaskedImage(surface, image, &itransform, region, opacity); - } else if (_blending(surface)) { - return _rasterScaledBlendingImage(surface, image, &itransform, region, opacity); - } else { - return _rasterScaledImage(surface, image, &itransform, region, opacity); - } - return false; -} - - -/************************************************************************/ -/* Direct Image */ -/************************************************************************/ - -#if 0 //Enable it when GRAYSCALE image is supported -static bool _rasterCompositeDirectMaskedImage(SwSurface* surface, const SwImage* image, const SwBBox& region, SwMask maskOp, uint8_t opacity) -{ - auto h = static_cast(region.max.y - region.min.y); - auto w = static_cast(region.max.x - region.min.x); - auto cstride = surface->compositor->image.stride; - - auto cbuffer = surface->compositor->image.buf8 + (region.min.y * cstride + region.min.x); //compositor buffer - auto sbuffer = image->buf8 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); - - for (uint32_t y = 0; y < h; ++y) { - auto cmp = cbuffer; - auto src = sbuffer; - if (opacity == 255) { - for (uint32_t x = 0; x < w; ++x, ++src, ++cmp) { - *cmp = maskOp(*src, *cmp, ~*src); - } - } else { - for (uint32_t x = 0; x < w; ++x, ++src, ++cmp) { - auto tmp = MULTIPLY(*src, opacity); - *cmp = maskOp(tmp, *cmp, ~tmp); - } - } - cbuffer += cstride; - sbuffer += image->stride; - } - return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); -} - - -static bool _rasterDirectDirectMaskedImage(SwSurface* surface, const SwImage* image, const SwBBox& region, SwMask maskOp, uint8_t opacity) -{ - auto h = static_cast(region.max.y - region.min.y); - auto w = static_cast(region.max.x - region.min.x); - auto cstride = surface->compositor->image.stride; - - auto cbuffer = surface->compositor->image.buf32 + (region.min.y * cstride + region.min.x); //compositor buffer - auto dbuffer = surface->buf8 + (region.min.y * surface->stride + region.min.x); //destination buffer - auto sbuffer = image->buf8 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); - - for (uint32_t y = 0; y < h; ++y) { - auto cmp = cbuffer; - auto dst = dbuffer; - auto src = sbuffer; - if (opacity == 255) { - for (uint32_t x = 0; x < w; ++x, ++src, ++cmp, ++dst) { - auto tmp = maskOp(*src, *cmp, 0); //not use alpha - *dst = tmp + MULTIPLY(*dst, ~tmp); - } - } else { - for (uint32_t x = 0; x < w; ++x, ++src, ++cmp, ++dst) { - auto tmp = maskOp(MULTIPLY(*src, opacity), *cmp, 0); //not use alpha - *dst = tmp + MULTIPLY(*dst, ~tmp); - } - } - cbuffer += cstride; - dbuffer += surface->stride; - sbuffer += image->stride; - } - return true; -} -#endif - -static bool _rasterDirectMaskedImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint8_t opacity) -{ - TVGERR("SW_ENGINE", "Not Supported: Direct Masked(%d) Image [Region: %lu %lu %lu %lu]", (int)surface->compositor->method, region.min.x, region.min.y, region.max.x - region.min.x, region.max.y - region.min.y); - -#if 0 //Enable it when GRAYSCALE image is supported - auto maskOp = _getMaskOp(surface->compositor->method); - if (_direct(surface->compositor->method)) return _rasterDirectDirectMaskedImage(surface, image, region, maskOp, opacity); - else return _rasterCompositeDirectMaskedImage(surface, image, region, maskOp, opacity); -#endif - return false; -} - - -static bool _rasterDirectMattedImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint8_t opacity) -{ - auto h = static_cast(region.max.y - region.min.y); - auto w = static_cast(region.max.x - region.min.x); - auto csize = surface->compositor->image.channelSize; - auto alpha = surface->alpha(surface->compositor->method); - auto sbuffer = image->buf32 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); - auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x) * csize; //compositor buffer - - TVGLOG("SW_ENGINE", "Direct Matted(%d) Image [Region: %lu %lu %u %u]", (int)surface->compositor->method, region.min.x, region.min.y, w, h); - - //32 bits - if (surface->channelSize == sizeof(uint32_t)) { - auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; - for (uint32_t y = 0; y < h; ++y) { - auto dst = buffer; - auto cmp = cbuffer; - auto src = sbuffer; - if (opacity == 255) { - for (uint32_t x = 0; x < w; ++x, ++dst, ++src, cmp += csize) { - auto tmp = ALPHA_BLEND(*src, alpha(cmp)); - *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); - } - } else { - for (uint32_t x = 0; x < w; ++x, ++dst, ++src, cmp += csize) { - auto tmp = ALPHA_BLEND(*src, MULTIPLY(opacity, alpha(cmp))); - *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); - } - } - buffer += surface->stride; - cbuffer += surface->compositor->image.stride * csize; - sbuffer += image->stride; - } - //8 bits - } else if (surface->channelSize == sizeof(uint8_t)) { - auto buffer = surface->buf8 + (region.min.y * surface->stride) + region.min.x; - for (uint32_t y = 0; y < h; ++y) { - auto dst = buffer; - auto cmp = cbuffer; - auto src = sbuffer; - if (opacity == 255) { - for (uint32_t x = 0; x < w; ++x, ++dst, ++src, cmp += csize) { - *dst = MULTIPLY(A(*src), alpha(cmp)); - } - } else { - for (uint32_t x = 0; x < w; ++x, ++dst, ++src, cmp += csize) { - *dst = MULTIPLY(A(*src), MULTIPLY(opacity, alpha(cmp))); - } - } - buffer += surface->stride; - cbuffer += surface->compositor->image.stride * csize; - sbuffer += image->stride; - } - } - return true; -} - - -static bool _rasterDirectBlendingImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint8_t opacity) -{ - if (surface->channelSize == sizeof(uint8_t)) { - TVGERR("SW_ENGINE", "Not supported grayscale image!"); - return false; - } - - auto dbuffer = &surface->buf32[region.min.y * surface->stride + region.min.x]; - auto sbuffer = image->buf32 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); - - for (auto y = region.min.y; y < region.max.y; ++y) { - auto dst = dbuffer; - auto src = sbuffer; - if (opacity == 255) { - for (auto x = region.min.x; x < region.max.x; x++, dst++, src++) { - auto tmp = surface->blender(*src, *dst, 255); - *dst = INTERPOLATE(tmp, *dst, A(*src)); - } - } else { - for (auto x = region.min.x; x < region.max.x; ++x, ++dst, ++src) { - auto tmp = ALPHA_BLEND(*src, opacity); - auto tmp2 = surface->blender(tmp, *dst, 255); - *dst = INTERPOLATE(tmp2, *dst, A(tmp)); - } - } - dbuffer += surface->stride; - sbuffer += image->stride; - } - return true; -} - - -static bool _rasterDirectImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint8_t opacity) -{ - if (surface->channelSize == sizeof(uint8_t)) { - TVGERR("SW_ENGINE", "Not supported grayscale image!"); - return false; - } - - auto dbuffer = &surface->buf32[region.min.y * surface->stride + region.min.x]; - auto sbuffer = image->buf32 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); - - for (auto y = region.min.y; y < region.max.y; ++y) { - auto dst = dbuffer; - auto src = sbuffer; - if (opacity == 255) { - for (auto x = region.min.x; x < region.max.x; x++, dst++, src++) { - *dst = *src + ALPHA_BLEND(*dst, IA(*src)); - } - } else { - for (auto x = region.min.x; x < region.max.x; ++x, ++dst, ++src) { - auto tmp = ALPHA_BLEND(*src, opacity); - *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); - } - } - dbuffer += surface->stride; - sbuffer += image->stride; - } - return true; -} - - -//Blenders for the following scenarios: [Composition / Non-Composition] * [Opaque / Translucent] -static bool _directImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint8_t opacity) -{ - if (_compositing(surface)) { - if (_matting(surface)) return _rasterDirectMattedImage(surface, image, region, opacity); - else return _rasterDirectMaskedImage(surface, image, region, opacity); - } else if (_blending(surface)) { - return _rasterDirectBlendingImage(surface, image, region, opacity); - } else { - return _rasterDirectImage(surface, image, region, opacity); - } - return false; -} - - -//Blenders for the following scenarios: [RLE / Whole] * [Direct / Scaled / Transformed] -static bool _rasterImage(SwSurface* surface, SwImage* image, const Matrix* transform, const SwBBox& region, uint8_t opacity) -{ - //RLE Image - if (image->rle) { - if (image->direct) return _directRleImage(surface, image, opacity); - else if (image->scaled) return _scaledRleImage(surface, image, transform, region, opacity); - else return _rasterTexmapPolygon(surface, image, transform, nullptr, opacity); - //Whole Image - } else { - if (image->direct) return _directImage(surface, image, region, opacity); - else if (image->scaled) return _scaledImage(surface, image, transform, region, opacity); - else return _rasterTexmapPolygon(surface, image, transform, ®ion, opacity); - } -} - - -/************************************************************************/ -/* Rect Gradient */ -/************************************************************************/ - -template -static bool _rasterCompositeGradientMaskedRect(SwSurface* surface, const SwBBox& region, const SwFill* fill, SwMask maskOp) -{ - auto h = static_cast(region.max.y - region.min.y); - auto w = static_cast(region.max.x - region.min.x); - auto cstride = surface->compositor->image.stride; - auto cbuffer = surface->compositor->image.buf8 + (region.min.y * cstride + region.min.x); - - for (uint32_t y = 0; y < h; ++y) { - fillMethod()(fill, cbuffer, region.min.y + y, region.min.x, w, maskOp, 255); - cbuffer += surface->stride; - } - return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); -} - - -template -static bool _rasterDirectGradientMaskedRect(SwSurface* surface, const SwBBox& region, const SwFill* fill, SwMask maskOp) -{ - auto h = static_cast(region.max.y - region.min.y); - auto w = static_cast(region.max.x - region.min.x); - auto cstride = surface->compositor->image.stride; - auto cbuffer = surface->compositor->image.buf8 + (region.min.y * cstride + region.min.x); - auto dbuffer = surface->buf8 + (region.min.y * surface->stride + region.min.x); - - for (uint32_t y = 0; y < h; ++y) { - fillMethod()(fill, dbuffer, region.min.y + y, region.min.x, w, cbuffer, maskOp, 255); - cbuffer += cstride; - dbuffer += surface->stride; - } - return true; -} - - -template -static bool _rasterGradientMaskedRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) -{ - auto method = surface->compositor->method; - - TVGLOG("SW_ENGINE", "Masked(%d) Gradient [Region: %lu %lu %lu %lu]", (int)method, region.min.x, region.min.y, region.max.x - region.min.x, region.max.y - region.min.y); - - auto maskOp = _getMaskOp(method); - - if (_direct(method)) return _rasterDirectGradientMaskedRect(surface, region, fill, maskOp); - else return _rasterCompositeGradientMaskedRect(surface, region, fill, maskOp); - - return false; -} - - -template -static bool _rasterGradientMattedRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) -{ - auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; - auto h = static_cast(region.max.y - region.min.y); - auto w = static_cast(region.max.x - region.min.x); - auto csize = surface->compositor->image.channelSize; - auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x) * csize; - auto alpha = surface->alpha(surface->compositor->method); - - TVGLOG("SW_ENGINE", "Matted(%d) Gradient [Region: %lu %lu %u %u]", (int)surface->compositor->method, region.min.x, region.min.y, w, h); - - for (uint32_t y = 0; y < h; ++y) { - fillMethod()(fill, buffer, region.min.y + y, region.min.x, w, cbuffer, alpha, csize, 255); - buffer += surface->stride; - cbuffer += surface->stride * csize; - } - return true; -} - - -template -static bool _rasterBlendingGradientRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) -{ - auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; - auto w = static_cast(region.max.x - region.min.x); - auto h = static_cast(region.max.y - region.min.y); - - if (fill->translucent) { - for (uint32_t y = 0; y < h; ++y) { - fillMethod()(fill, buffer + y * surface->stride, region.min.y + y, region.min.x, w, opBlendPreNormal, surface->blender, 255); - } - } else { - for (uint32_t y = 0; y < h; ++y) { - fillMethod()(fill, buffer + y * surface->stride, region.min.y + y, region.min.x, w, opBlendSrcOver, surface->blender, 255); - } - } - return true; -} - -template -static bool _rasterTranslucentGradientRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) -{ - auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; - auto h = static_cast(region.max.y - region.min.y); - auto w = static_cast(region.max.x - region.min.x); - - for (uint32_t y = 0; y < h; ++y) { - fillMethod()(fill, buffer, region.min.y + y, region.min.x, w, opBlendPreNormal, 255); - buffer += surface->stride; - } - return true; -} - - -template -static bool _rasterSolidGradientRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) -{ - auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; - auto w = static_cast(region.max.x - region.min.x); - auto h = static_cast(region.max.y - region.min.y); - - for (uint32_t y = 0; y < h; ++y) { - fillMethod()(fill, buffer + y * surface->stride, region.min.y + y, region.min.x, w, opBlendSrcOver, 255); - } - return true; -} - - -static bool _rasterLinearGradientRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) -{ - if (fill->linear.len < FLOAT_EPSILON) return false; - - if (_compositing(surface)) { - if (_matting(surface)) return _rasterGradientMattedRect(surface, region, fill); - else return _rasterGradientMaskedRect(surface, region, fill); - } else if (_blending(surface)) { - return _rasterBlendingGradientRect(surface, region, fill); - } else { - if (fill->translucent) return _rasterTranslucentGradientRect(surface, region, fill); - else _rasterSolidGradientRect(surface, region, fill); - } - return false; -} - - -static bool _rasterRadialGradientRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) -{ - if (_compositing(surface)) { - if (_matting(surface)) return _rasterGradientMattedRect(surface, region, fill); - else return _rasterGradientMaskedRect(surface, region, fill); - } else if (_blending(surface)) { - return _rasterBlendingGradientRect(surface, region, fill); - } else { - if (fill->translucent) return _rasterTranslucentGradientRect(surface, region, fill); - else _rasterSolidGradientRect(surface, region, fill); - } - return false; -} - - -/************************************************************************/ -/* Rle Gradient */ -/************************************************************************/ - -template -static bool _rasterCompositeGradientMaskedRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill, SwMask maskOp) -{ - auto span = rle->spans; - auto cstride = surface->compositor->image.stride; - auto cbuffer = surface->compositor->image.buf8; - - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto cmp = &cbuffer[span->y * cstride + span->x]; - fillMethod()(fill, cmp, span->y, span->x, span->len, maskOp, span->coverage); - } - return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); -} - - -template -static bool _rasterDirectGradientMaskedRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill, SwMask maskOp) -{ - auto span = rle->spans; - auto cstride = surface->compositor->image.stride; - auto cbuffer = surface->compositor->image.buf8; - auto dbuffer = surface->buf8; - - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto cmp = &cbuffer[span->y * cstride + span->x]; - auto dst = &dbuffer[span->y * surface->stride + span->x]; - fillMethod()(fill, dst, span->y, span->x, span->len, cmp, maskOp, span->coverage); - } - return true; -} - - -template -static bool _rasterGradientMaskedRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) -{ - auto method = surface->compositor->method; - - TVGLOG("SW_ENGINE", "Masked(%d) Rle Linear Gradient", (int)method); - - auto maskOp = _getMaskOp(method); - - if (_direct(method)) return _rasterDirectGradientMaskedRle(surface, rle, fill, maskOp); - else return _rasterCompositeGradientMaskedRle(surface, rle, fill, maskOp); - return false; -} - - -template -static bool _rasterGradientMattedRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) -{ - TVGLOG("SW_ENGINE", "Matted(%d) Rle Linear Gradient", (int)surface->compositor->method); - - auto span = rle->spans; - auto csize = surface->compositor->image.channelSize; - auto cbuffer = surface->compositor->image.buf8; - auto alpha = surface->alpha(surface->compositor->method); - - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; - fillMethod()(fill, dst, span->y, span->x, span->len, cmp, alpha, csize, span->coverage); - } - return true; -} - - -template -static bool _rasterBlendingGradientRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) -{ - auto span = rle->spans; - - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - fillMethod()(fill, dst, span->y, span->x, span->len, opBlendPreNormal, surface->blender, span->coverage); - } - return true; -} - - -template -static bool _rasterTranslucentGradientRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) -{ - auto span = rle->spans; - - //32 bits - if (surface->channelSize == sizeof(uint32_t)) { - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - if (span->coverage == 255) fillMethod()(fill, dst, span->y, span->x, span->len, opBlendPreNormal, 255); - else fillMethod()(fill, dst, span->y, span->x, span->len, opBlendNormal, span->coverage); - } - //8 bits - } else if (surface->channelSize == sizeof(uint8_t)) { - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buf8[span->y * surface->stride + span->x]; - fillMethod()(fill, dst, span->y, span->x, span->len, _opMaskAdd, 255); - } - } - return true; -} - - -template -static bool _rasterSolidGradientRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) -{ - auto span = rle->spans; - - //32 bits - if (surface->channelSize == sizeof(uint32_t)) { - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - if (span->coverage == 255) fillMethod()(fill, dst, span->y, span->x, span->len, opBlendSrcOver, 255); - else fillMethod()(fill, dst, span->y, span->x, span->len, opBlendInterp, span->coverage); - } - //8 bits - } else if (surface->channelSize == sizeof(uint8_t)) { - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buf8[span->y * surface->stride + span->x]; - if (span->coverage == 255) fillMethod()(fill, dst, span->y, span->x, span->len, _opMaskNone, 255); - else fillMethod()(fill, dst, span->y, span->x, span->len, _opMaskAdd, span->coverage); - } - } - - return true; -} - - -static bool _rasterLinearGradientRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) -{ - if (!rle) return false; - - if (_compositing(surface)) { - if (_matting(surface)) return _rasterGradientMattedRle(surface, rle, fill); - else return _rasterGradientMaskedRle(surface, rle, fill); - } else if (_blending(surface)) { - return _rasterBlendingGradientRle(surface, rle, fill); - } else { - if (fill->translucent) return _rasterTranslucentGradientRle(surface, rle, fill); - else return _rasterSolidGradientRle(surface, rle, fill); - } - return false; -} - - -static bool _rasterRadialGradientRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) -{ - if (!rle) return false; - - if (_compositing(surface)) { - if (_matting(surface)) return _rasterGradientMattedRle(surface, rle, fill); - else return _rasterGradientMaskedRle(surface, rle, fill); - } else if (_blending(surface)) { - _rasterBlendingGradientRle(surface, rle, fill); - } else { - if (fill->translucent) _rasterTranslucentGradientRle(surface, rle, fill); - else return _rasterSolidGradientRle(surface, rle, fill); - } - return false; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - - -void rasterGrayscale8(uint8_t *dst, uint8_t val, uint32_t offset, int32_t len) -{ -#if defined(THORVG_AVX_VECTOR_SUPPORT) - avxRasterGrayscale8(dst, val, offset, len); -#elif defined(THORVG_NEON_VECTOR_SUPPORT) - neonRasterGrayscale8(dst, val, offset, len); -#else - cRasterPixels(dst, val, offset, len); -#endif -} - - -void rasterPixel32(uint32_t *dst, uint32_t val, uint32_t offset, int32_t len) -{ -#if defined(THORVG_AVX_VECTOR_SUPPORT) - avxRasterPixel32(dst, val, offset, len); -#elif defined(THORVG_NEON_VECTOR_SUPPORT) - neonRasterPixel32(dst, val, offset, len); -#else - cRasterPixels(dst, val, offset, len); -#endif -} - - -bool rasterCompositor(SwSurface* surface) -{ - //See CompositeMethod, Alpha:3, InvAlpha:4, Luma:5, InvLuma:6 - surface->alphas[0] = _alpha; - surface->alphas[1] = _ialpha; - - if (surface->cs == ColorSpace::ABGR8888 || surface->cs == ColorSpace::ABGR8888S) { - surface->join = _abgrJoin; - surface->alphas[2] = _abgrLuma; - surface->alphas[3] = _abgrInvLuma; - } else if (surface->cs == ColorSpace::ARGB8888 || surface->cs == ColorSpace::ARGB8888S) { - surface->join = _argbJoin; - surface->alphas[2] = _argbLuma; - surface->alphas[3] = _argbInvLuma; - } else { - TVGERR("SW_ENGINE", "Unsupported Colorspace(%d) is expected!", surface->cs); - return false; - } - return true; -} - - -bool rasterClear(SwSurface* surface, uint32_t x, uint32_t y, uint32_t w, uint32_t h) -{ - if (!surface || !surface->buf32 || surface->stride == 0 || surface->w == 0 || surface->h == 0) return false; - - //32 bits - if (surface->channelSize == sizeof(uint32_t)) { - //full clear - if (w == surface->stride) { - rasterPixel32(surface->buf32, 0x00000000, surface->stride * y, w * h); - //partial clear - } else { - for (uint32_t i = 0; i < h; i++) { - rasterPixel32(surface->buf32, 0x00000000, (surface->stride * y + x) + (surface->stride * i), w); - } - } - //8 bits - } else if (surface->channelSize == sizeof(uint8_t)) { - //full clear - if (w == surface->stride) { - rasterGrayscale8(surface->buf8, 0x00, surface->stride * y, w * h); - //partial clear - } else { - for (uint32_t i = 0; i < h; i++) { - rasterGrayscale8(surface->buf8, 0x00, (surface->stride * y + x) + (surface->stride * i), w); - } - } - } - return true; -} - - -void rasterUnpremultiply(Surface* surface) -{ - if (surface->channelSize != sizeof(uint32_t)) return; - - TVGLOG("SW_ENGINE", "Unpremultiply [Size: %d x %d]", surface->w, surface->h); - - //OPTIMIZE_ME: +SIMD - for (uint32_t y = 0; y < surface->h; y++) { - auto buffer = surface->buf32 + surface->stride * y; - for (uint32_t x = 0; x < surface->w; ++x) { - uint8_t a = buffer[x] >> 24; - if (a == 255) { - continue; - } else if (a == 0) { - buffer[x] = 0x00ffffff; - } else { - uint16_t r = ((buffer[x] >> 8) & 0xff00) / a; - uint16_t g = ((buffer[x]) & 0xff00) / a; - uint16_t b = ((buffer[x] << 8) & 0xff00) / a; - if (r > 0xff) r = 0xff; - if (g > 0xff) g = 0xff; - if (b > 0xff) b = 0xff; - buffer[x] = (a << 24) | (r << 16) | (g << 8) | (b); - } - } - } - surface->premultiplied = false; -} - - -void rasterPremultiply(Surface* surface) -{ - ScopedLock lock(surface->key); - if (surface->premultiplied || (surface->channelSize != sizeof(uint32_t))) return; - surface->premultiplied = true; - - TVGLOG("SW_ENGINE", "Premultiply [Size: %d x %d]", surface->w, surface->h); - - //OPTIMIZE_ME: +SIMD - auto buffer = surface->buf32; - for (uint32_t y = 0; y < surface->h; ++y, buffer += surface->stride) { - auto dst = buffer; - for (uint32_t x = 0; x < surface->w; ++x, ++dst) { - auto c = *dst; - auto a = (c >> 24); - *dst = (c & 0xff000000) + ((((c >> 8) & 0xff) * a) & 0xff00) + ((((c & 0x00ff00ff) * a) >> 8) & 0x00ff00ff); - } - } -} - - -bool rasterGradientShape(SwSurface* surface, SwShape* shape, unsigned id) -{ - if (!shape->fill) return false; - - if (shape->fastTrack) { - if (id == TVG_CLASS_ID_LINEAR) return _rasterLinearGradientRect(surface, shape->bbox, shape->fill); - else if (id == TVG_CLASS_ID_RADIAL)return _rasterRadialGradientRect(surface, shape->bbox, shape->fill); - } else { - if (id == TVG_CLASS_ID_LINEAR) return _rasterLinearGradientRle(surface, shape->rle, shape->fill); - else if (id == TVG_CLASS_ID_RADIAL) return _rasterRadialGradientRle(surface, shape->rle, shape->fill); - } - return false; -} - - -bool rasterGradientStroke(SwSurface* surface, SwShape* shape, unsigned id) -{ - if (!shape->stroke || !shape->stroke->fill || !shape->strokeRle) return false; - - if (id == TVG_CLASS_ID_LINEAR) return _rasterLinearGradientRle(surface, shape->strokeRle, shape->stroke->fill); - else if (id == TVG_CLASS_ID_RADIAL) return _rasterRadialGradientRle(surface, shape->strokeRle, shape->stroke->fill); - - return false; -} - - -bool rasterShape(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - if (a < 255) { - r = MULTIPLY(r, a); - g = MULTIPLY(g, a); - b = MULTIPLY(b, a); - } - if (shape->fastTrack) return _rasterRect(surface, shape->bbox, r, g, b, a); - else return _rasterRle(surface, shape->rle, r, g, b, a); -} - - -bool rasterStroke(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - if (a < 255) { - r = MULTIPLY(r, a); - g = MULTIPLY(g, a); - b = MULTIPLY(b, a); - } - - return _rasterRle(surface, shape->strokeRle, r, g, b, a); -} - - -bool rasterImage(SwSurface* surface, SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& bbox, uint8_t opacity) -{ - //Outside of the viewport, skip the rendering - if (bbox.max.x < 0 || bbox.max.y < 0 || bbox.min.x >= static_cast(surface->w) || bbox.min.y >= static_cast(surface->h)) return true; - - if (mesh && mesh->triangleCnt > 0) return _rasterTexmapPolygonMesh(surface, image, mesh, transform, &bbox, opacity); - else return _rasterImage(surface, image, transform, bbox, opacity); -} - - -bool rasterConvertCS(Surface* surface, ColorSpace to) -{ - ScopedLock lock(surface->key); - if (surface->cs == to) return true; - - //TODO: Support SIMD accelerations - auto from = surface->cs; - - if (((from == ColorSpace::ABGR8888) || (from == ColorSpace::ABGR8888S)) && ((to == ColorSpace::ARGB8888) || (to == ColorSpace::ARGB8888S))) { - surface->cs = to; - return cRasterABGRtoARGB(surface); - } - if (((from == ColorSpace::ARGB8888) || (from == ColorSpace::ARGB8888S)) && ((to == ColorSpace::ABGR8888) || (to == ColorSpace::ABGR8888S))) { - surface->cs = to; - return cRasterARGBtoABGR(surface); - } - return false; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRasterAvx.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRasterAvx.h deleted file mode 100644 index 82c177c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRasterAvx.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2021 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifdef THORVG_AVX_VECTOR_SUPPORT - -#include - -#define N_32BITS_IN_128REG 4 -#define N_32BITS_IN_256REG 8 - -static inline __m128i ALPHA_BLEND(__m128i c, __m128i a) -{ - //1. set the masks for the A/G and R/B channels - auto AG = _mm_set1_epi32(0xff00ff00); - auto RB = _mm_set1_epi32(0x00ff00ff); - - //2. mask the alpha vector - originally quartet [a, a, a, a] - auto aAG = _mm_and_si128(a, AG); - auto aRB = _mm_and_si128(a, RB); - - //3. calculate the alpha blending of the 2nd and 4th channel - //- mask the color vector - //- multiply it by the masked alpha vector - //- add the correction to compensate bit shifting used instead of dividing by 255 - //- shift bits - corresponding to division by 256 - auto even = _mm_and_si128(c, RB); - even = _mm_mullo_epi16(even, aRB); - even =_mm_add_epi16(even, RB); - even = _mm_srli_epi16(even, 8); - - //4. calculate the alpha blending of the 1st and 3rd channel: - //- mask the color vector - //- multiply it by the corresponding masked alpha vector and store the high bits of the result - //- add the correction to compensate division by 256 instead of by 255 (next step) - //- remove the low 8 bits to mimic the division by 256 - auto odd = _mm_and_si128(c, AG); - odd = _mm_mulhi_epu16(odd, aAG); - odd = _mm_add_epi16(odd, RB); - odd = _mm_and_si128(odd, AG); - - //5. the final result - return _mm_or_si128(odd, even); -} - - -static void avxRasterGrayscale8(uint8_t* dst, uint8_t val, uint32_t offset, int32_t len) -{ - dst += offset; - - __m256i vecVal = _mm256_set1_epi8(val); - - int32_t i = 0; - for (; i <= len - 32; i += 32) { - _mm256_storeu_si256((__m256i*)(dst + i), vecVal); - } - - for (; i < len; ++i) { - dst[i] = val; - } -} - - -static void avxRasterPixel32(uint32_t *dst, uint32_t val, uint32_t offset, int32_t len) -{ - //1. calculate how many iterations we need to cover the length - uint32_t iterations = len / N_32BITS_IN_256REG; - uint32_t avxFilled = iterations * N_32BITS_IN_256REG; - - //2. set the beginning of the array - dst += offset; - - //3. fill the octets - for (uint32_t i = 0; i < iterations; ++i, dst += N_32BITS_IN_256REG) { - _mm256_storeu_si256((__m256i*)dst, _mm256_set1_epi32(val)); - } - - //4. fill leftovers (in the first step we have to set the pointer to the place where the avx job is done) - int32_t leftovers = len - avxFilled; - while (leftovers--) *dst++ = val; -} - - -static bool avxRasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - if (surface->channelSize != sizeof(uint32_t)) { - TVGERR("SW_ENGINE", "Unsupported Channel Size = %d", surface->channelSize); - return false; - } - - auto color = surface->join(r, g, b, a); - auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; - auto h = static_cast(region.max.y - region.min.y); - auto w = static_cast(region.max.x - region.min.x); - - uint32_t ialpha = 255 - a; - - auto avxColor = _mm_set1_epi32(color); - auto avxIalpha = _mm_set1_epi8(ialpha); - - for (uint32_t y = 0; y < h; ++y) { - auto dst = &buffer[y * surface->stride]; - - //1. fill the not aligned memory (for 128-bit registers a 16-bytes alignment is required) - auto notAligned = ((uintptr_t)dst & 0xf) / 4; - if (notAligned) { - notAligned = (N_32BITS_IN_128REG - notAligned > w ? w : N_32BITS_IN_128REG - notAligned); - for (uint32_t x = 0; x < notAligned; ++x, ++dst) { - *dst = color + ALPHA_BLEND(*dst, ialpha); - } - } - - //2. fill the aligned memory - N_32BITS_IN_128REG pixels processed at once - uint32_t iterations = (w - notAligned) / N_32BITS_IN_128REG; - uint32_t avxFilled = iterations * N_32BITS_IN_128REG; - auto avxDst = (__m128i*)dst; - for (uint32_t x = 0; x < iterations; ++x, ++avxDst) { - *avxDst = _mm_add_epi32(avxColor, ALPHA_BLEND(*avxDst, avxIalpha)); - } - - //3. fill the remaining pixels - int32_t leftovers = w - notAligned - avxFilled; - dst += avxFilled; - while (leftovers--) { - *dst = color + ALPHA_BLEND(*dst, ialpha); - dst++; - } - } - return true; -} - - -static bool avxRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - if (surface->channelSize != sizeof(uint32_t)) { - TVGERR("SW_ENGINE", "Unsupported Channel Size = %d", surface->channelSize); - return false; - } - - auto color = surface->join(r, g, b, a); - auto span = rle->spans; - uint32_t src; - - for (uint32_t i = 0; i < rle->size; ++i) { - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - - if (span->coverage < 255) src = ALPHA_BLEND(color, span->coverage); - else src = color; - - auto ialpha = IA(src); - - //1. fill the not aligned memory (for 128-bit registers a 16-bytes alignment is required) - auto notAligned = ((uintptr_t)dst & 0xf) / 4; - if (notAligned) { - notAligned = (N_32BITS_IN_128REG - notAligned > span->len ? span->len : N_32BITS_IN_128REG - notAligned); - for (uint32_t x = 0; x < notAligned; ++x, ++dst) { - *dst = src + ALPHA_BLEND(*dst, ialpha); - } - } - - //2. fill the aligned memory using avx - N_32BITS_IN_128REG pixels processed at once - //In order to avoid unnecessary avx variables declarations a check is made whether there are any iterations at all - uint32_t iterations = (span->len - notAligned) / N_32BITS_IN_128REG; - uint32_t avxFilled = 0; - if (iterations > 0) { - auto avxSrc = _mm_set1_epi32(src); - auto avxIalpha = _mm_set1_epi8(ialpha); - - avxFilled = iterations * N_32BITS_IN_128REG; - auto avxDst = (__m128i*)dst; - for (uint32_t x = 0; x < iterations; ++x, ++avxDst) { - *avxDst = _mm_add_epi32(avxSrc, ALPHA_BLEND(*avxDst, avxIalpha)); - } - } - - //3. fill the remaining pixels - int32_t leftovers = span->len - notAligned - avxFilled; - dst += avxFilled; - while (leftovers--) { - *dst = src + ALPHA_BLEND(*dst, ialpha); - dst++; - } - - ++span; - } - return true; -} - - -#endif - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRasterC.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRasterC.h deleted file mode 100644 index bc5211e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRasterC.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (c) 2021 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -template -static void inline cRasterPixels(PIXEL_T* dst, PIXEL_T val, uint32_t offset, int32_t len) -{ - dst += offset; - - //fix the misaligned memory - auto alignOffset = (long long) dst % 8; - if (alignOffset > 0) { - if (sizeof(PIXEL_T) == 4) alignOffset /= 4; - else if (sizeof(PIXEL_T) == 1) alignOffset = 8 - alignOffset; - while (alignOffset > 0 && len > 0) { - *dst++ = val; - --len; - --alignOffset; - } - } - - //64bits faster clear - if ((sizeof(PIXEL_T) == 4)) { - auto val64 = (uint64_t(val) << 32) | uint64_t(val); - while (len > 1) { - *reinterpret_cast(dst) = val64; - len -= 2; - dst += 2; - } - } else if (sizeof(PIXEL_T) == 1) { - auto val32 = (uint32_t(val) << 24) | (uint32_t(val) << 16) | (uint32_t(val) << 8) | uint32_t(val); - auto val64 = (uint64_t(val32) << 32) | val32; - while (len > 7) { - *reinterpret_cast(dst) = val64; - len -= 8; - dst += 8; - } - } - - //leftovers - while (len--) *dst++ = val; -} - - -static bool inline cRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - auto span = rle->spans; - - //32bit channels - if (surface->channelSize == sizeof(uint32_t)) { - auto color = surface->join(r, g, b, a); - uint32_t src; - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - if (span->coverage < 255) src = ALPHA_BLEND(color, span->coverage); - else src = color; - auto ialpha = IA(src); - for (uint32_t x = 0; x < span->len; ++x, ++dst) { - *dst = src + ALPHA_BLEND(*dst, ialpha); - } - } - //8bit grayscale - } else if (surface->channelSize == sizeof(uint8_t)) { - uint8_t src; - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buf8[span->y * surface->stride + span->x]; - if (span->coverage < 255) src = MULTIPLY(span->coverage, a); - else src = a; - auto ialpha = ~a; - for (uint32_t x = 0; x < span->len; ++x, ++dst) { - *dst = src + MULTIPLY(*dst, ialpha); - } - } - } - return true; -} - - -static bool inline cRasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - auto h = static_cast(region.max.y - region.min.y); - auto w = static_cast(region.max.x - region.min.x); - - //32bits channels - if (surface->channelSize == sizeof(uint32_t)) { - auto color = surface->join(r, g, b, a); - auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; - auto ialpha = 255 - a; - for (uint32_t y = 0; y < h; ++y) { - auto dst = &buffer[y * surface->stride]; - for (uint32_t x = 0; x < w; ++x, ++dst) { - *dst = color + ALPHA_BLEND(*dst, ialpha); - } - } - //8bit grayscale - } else if (surface->channelSize == sizeof(uint8_t)) { - auto buffer = surface->buf8 + (region.min.y * surface->stride) + region.min.x; - auto ialpha = ~a; - for (uint32_t y = 0; y < h; ++y) { - auto dst = &buffer[y * surface->stride]; - for (uint32_t x = 0; x < w; ++x, ++dst) { - *dst = a + MULTIPLY(*dst, ialpha); - } - } - } - return true; -} - - -static bool inline cRasterABGRtoARGB(Surface* surface) -{ - TVGLOG("SW_ENGINE", "Convert ColorSpace ABGR - ARGB [Size: %d x %d]", surface->w, surface->h); - - //64bits faster converting - if (surface->w % 2 == 0) { - auto buffer = reinterpret_cast(surface->buf32); - for (uint32_t y = 0; y < surface->h; ++y, buffer += surface->stride / 2) { - auto dst = buffer; - for (uint32_t x = 0; x < surface->w / 2; ++x, ++dst) { - auto c = *dst; - //flip Blue, Red channels - *dst = (c & 0xff000000ff000000) + ((c & 0x00ff000000ff0000) >> 16) + (c & 0x0000ff000000ff00) + ((c & 0x000000ff000000ff) << 16); - } - } - //default converting - } else { - auto buffer = surface->buf32; - for (uint32_t y = 0; y < surface->h; ++y, buffer += surface->stride) { - auto dst = buffer; - for (uint32_t x = 0; x < surface->w; ++x, ++dst) { - auto c = *dst; - //flip Blue, Red channels - *dst = (c & 0xff000000) + ((c & 0x00ff0000) >> 16) + (c & 0x0000ff00) + ((c & 0x000000ff) << 16); - } - } - } - return true; -} - - -static bool inline cRasterARGBtoABGR(Surface* surface) -{ - //exactly same with ABGRtoARGB - return cRasterABGRtoARGB(surface); -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRasterNeon.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRasterNeon.h deleted file mode 100644 index a84bfe8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRasterNeon.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2021 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifdef THORVG_NEON_VECTOR_SUPPORT - -#include - -//TODO : need to support windows ARM - -#if defined(__ARM_64BIT_STATE) || defined(_M_ARM64) -#define TVG_AARCH64 1 -#else -#define TVG_AARCH64 0 -#endif - - -static inline uint8x8_t ALPHA_BLEND(uint8x8_t c, uint8x8_t a) -{ - uint16x8_t t = vmull_u8(c, a); - return vshrn_n_u16(t, 8); -} - - -static void neonRasterGrayscale8(uint8_t* dst, uint8_t val, uint32_t offset, int32_t len) -{ - dst += offset; - - int32_t i = 0; - const uint8x16_t valVec = vdupq_n_u8(val); -#if TVG_AARCH64 - uint8x16x4_t valQuad = {valVec, valVec, valVec, valVec}; - for (; i <= len - 16 * 4; i += 16 * 4) { - vst1q_u8_x4(dst + i, valQuad); - } -#else - for (; i <= len - 16; i += 16) { - vst1q_u8(dst + i, valVec); - } -#endif - for (; i < len; i++) { - dst[i] = val; - } -} - - -static void neonRasterPixel32(uint32_t *dst, uint32_t val, uint32_t offset, int32_t len) -{ - dst += offset; - - uint32x4_t vectorVal = vdupq_n_u32(val); - -#if TVG_AARCH64 - uint32_t iterations = len / 16; - uint32_t neonFilled = iterations * 16; - uint32x4x4_t valQuad = {vectorVal, vectorVal, vectorVal, vectorVal}; - for (uint32_t i = 0; i < iterations; ++i) { - vst4q_u32(dst, valQuad); - dst += 16; - } -#else - uint32_t iterations = len / 4; - uint32_t neonFilled = iterations * 4; - for (uint32_t i = 0; i < iterations; ++i) { - vst1q_u32(dst, vectorVal); - dst += 4; - } -#endif - int32_t leftovers = len - neonFilled; - while (leftovers--) *dst++ = val; -} - - -static bool neonRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - if (surface->channelSize != sizeof(uint32_t)) { - TVGERR("SW_ENGINE", "Unsupported Channel Size = %d", surface->channelSize); - return false; - } - - auto color = surface->join(r, g, b, a); - auto span = rle->spans; - uint32_t src; - uint8x8_t *vDst = nullptr; - uint16_t align; - - for (uint32_t i = 0; i < rle->size; ++i) { - if (span->coverage < 255) src = ALPHA_BLEND(color, span->coverage); - else src = color; - - auto dst = &surface->buf32[span->y * surface->stride + span->x]; - auto ialpha = IA(src); - - if ((((uintptr_t) dst) & 0x7) != 0) { - //fill not aligned byte - *dst = src + ALPHA_BLEND(*dst, ialpha); - vDst = (uint8x8_t*)(dst + 1); - align = 1; - } else { - vDst = (uint8x8_t*) dst; - align = 0; - } - - uint8x8_t vSrc = (uint8x8_t) vdup_n_u32(src); - uint8x8_t vIalpha = vdup_n_u8((uint8_t) ialpha); - - for (uint32_t x = 0; x < (span->len - align) / 2; ++x) - vDst[x] = vadd_u8(vSrc, ALPHA_BLEND(vDst[x], vIalpha)); - - auto leftovers = (span->len - align) % 2; - if (leftovers > 0) dst[span->len - 1] = src + ALPHA_BLEND(dst[span->len - 1], ialpha); - - ++span; - } - return true; -} - - -static bool neonRasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - if (surface->channelSize != sizeof(uint32_t)) { - TVGERR("SW_ENGINE", "Unsupported Channel Size = %d", surface->channelSize); - return false; - } - - auto color = surface->join(r, g, b, a); - auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; - auto h = static_cast(region.max.y - region.min.y); - auto w = static_cast(region.max.x - region.min.x); - auto ialpha = 255 - a; - - auto vColor = vdup_n_u32(color); - auto vIalpha = vdup_n_u8((uint8_t) ialpha); - - uint8x8_t* vDst = nullptr; - uint32_t align; - - for (uint32_t y = 0; y < h; ++y) { - auto dst = &buffer[y * surface->stride]; - - if ((((uintptr_t) dst) & 0x7) != 0) { - //fill not aligned byte - *dst = color + ALPHA_BLEND(*dst, ialpha); - vDst = (uint8x8_t*) (dst + 1); - align = 1; - } else { - vDst = (uint8x8_t*) dst; - align = 0; - } - - for (uint32_t x = 0; x < (w - align) / 2; ++x) - vDst[x] = vadd_u8((uint8x8_t)vColor, ALPHA_BLEND(vDst[x], vIalpha)); - - auto leftovers = (w - align) % 2; - if (leftovers > 0) dst[w - 1] = color + ALPHA_BLEND(dst[w - 1], ialpha); - } - return true; -} - -#endif - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRasterTexmap.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRasterTexmap.h deleted file mode 100644 index 6ef2e32..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRasterTexmap.h +++ /dev/null @@ -1,1214 +0,0 @@ -/* - * Copyright (c) 2021 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -struct AALine -{ - int32_t x[2]; - int32_t coverage[2]; - int32_t length[2]; -}; - -struct AASpans -{ - AALine *lines; - int32_t yStart; - int32_t yEnd; -}; - -static inline void _swap(float& a, float& b, float& tmp) -{ - tmp = a; - a = b; - b = tmp; -} - - -//Careful! Shared resource, No support threading -static float dudx, dvdx; -static float dxdya, dxdyb, dudya, dvdya; -static float xa, xb, ua, va; - - -//Y Range exception handling -static bool _arrange(const SwImage* image, const SwBBox* region, int& yStart, int& yEnd) -{ - int32_t regionTop, regionBottom; - - if (region) { - regionTop = region->min.y; - regionBottom = region->max.y; - } else { - regionTop = image->rle->spans->y; - regionBottom = image->rle->spans[image->rle->size - 1].y; - } - - if (yStart >= regionBottom) return false; - - if (yStart < regionTop) yStart = regionTop; - if (yEnd > regionBottom) yEnd = regionBottom; - - return true; -} - - -static bool _rasterMaskedPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, AASpans* aaSpans, uint8_t opacity, uint8_t dirFlag = 0) -{ - return false; - -#if 0 //Enable it when GRAYSCALE image is supported - auto maskOp = _getMaskOp(surface->compositor->method); - auto direct = _direct(surface->compositor->method); - float _dudx = dudx, _dvdx = dvdx; - float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya; - float _xa = xa, _xb = xb, _ua = ua, _va = va; - auto sbuf = image->buf8; - int32_t sw = static_cast(image->stride); - int32_t sh = image->h; - int32_t x1, x2, x, y, ar, ab, iru, irv, px, ay; - int32_t vv = 0, uu = 0; - int32_t minx = INT32_MAX, maxx = 0; - float dx, u, v, iptr; - SwSpan* span = nullptr; //used only when rle based. - - if (!_arrange(image, region, yStart, yEnd)) return false; - - //Loop through all lines in the segment - uint32_t spanIdx = 0; - - if (region) { - minx = region->min.x; - maxx = region->max.x; - } else { - span = image->rle->spans; - while (span->y < yStart) { - ++span; - ++spanIdx; - } - } - - y = yStart; - - while (y < yEnd) { - x1 = (int32_t)_xa; - x2 = (int32_t)_xb; - - if (!region) { - minx = INT32_MAX; - maxx = 0; - //one single row, could be consisted of multiple spans. - while (span->y == y && spanIdx < image->rle->size) { - if (minx > span->x) minx = span->x; - if (maxx < span->x + span->len) maxx = span->x + span->len; - ++span; - ++spanIdx; - } - } - if (x1 < minx) x1 = minx; - if (x2 > maxx) x2 = maxx; - - //Anti-Aliasing frames - ay = y - aaSpans->yStart; - if (aaSpans->lines[ay].x[0] > x1) aaSpans->lines[ay].x[0] = x1; - if (aaSpans->lines[ay].x[1] < x2) aaSpans->lines[ay].x[1] = x2; - - //Range allowed - if ((x2 - x1) >= 1 && (x1 < maxx) && (x2 > minx)) { - - //Perform subtexel pre-stepping on UV - dx = 1 - (_xa - x1); - u = _ua + dx * _dudx; - v = _va + dx * _dvdx; - - x = x1; - - auto cmp = &surface->compositor->image.buf8[y * surface->compositor->image.stride + x1]; - auto dst = &surface->buf8[y * surface->stride + x1]; - - if (opacity == 255) { - //Draw horizontal line - while (x++ < x2) { - uu = (int) u; - if (uu >= sw) continue; - vv = (int) v; - if (vv >= sh) continue; - - ar = (int)(255 * (1 - modff(u, &iptr))); - ab = (int)(255 * (1 - modff(v, &iptr))); - iru = uu + 1; - irv = vv + 1; - - px = *(sbuf + (vv * sw) + uu); - - /* horizontal interpolate */ - if (iru < sw) { - /* right pixel */ - int px2 = *(sbuf + (vv * sw) + iru); - px = INTERPOLATE(px, px2, ar); - } - /* vertical interpolate */ - if (irv < sh) { - /* bottom pixel */ - int px2 = *(sbuf + (irv * sw) + uu); - - /* horizontal interpolate */ - if (iru < sw) { - /* bottom right pixel */ - int px3 = *(sbuf + (irv * sw) + iru); - px2 = INTERPOLATE(px2, px3, ar); - } - px = INTERPOLATE(px, px2, ab); - } - if (direct) { - auto tmp = maskOp(px, *cmp, 0); //not use alpha - *dst = tmp + MULTIPLY(*dst, ~tmp); - ++dst; - } else { - *cmp = maskOp(px, *cmp, ~px); - } - ++cmp; - - //Step UV horizontally - u += _dudx; - v += _dvdx; - //range over? - if ((uint32_t)v >= image->h) break; - } - } else { - //Draw horizontal line - while (x++ < x2) { - uu = (int) u; - if (uu >= sw) continue; - vv = (int) v; - if (vv >= sh) continue; - - ar = (int)(255 * (1 - modff(u, &iptr))); - ab = (int)(255 * (1 - modff(v, &iptr))); - iru = uu + 1; - irv = vv + 1; - - px = *(sbuf + (vv * sw) + uu); - - /* horizontal interpolate */ - if (iru < sw) { - /* right pixel */ - int px2 = *(sbuf + (vv * sw) + iru); - px = INTERPOLATE(px, px2, ar); - } - /* vertical interpolate */ - if (irv < sh) { - /* bottom pixel */ - int px2 = *(sbuf + (irv * sw) + uu); - - /* horizontal interpolate */ - if (iru < sw) { - /* bottom right pixel */ - int px3 = *(sbuf + (irv * sw) + iru); - px2 = INTERPOLATE(px2, px3, ar); - } - px = INTERPOLATE(px, px2, ab); - } - - if (direct) { - auto tmp = maskOp(MULTIPLY(px, opacity), *cmp, 0); - *dst = tmp + MULTIPLY(*dst, ~tmp); - ++dst; - } else { - auto tmp = MULTIPLY(px, opacity); - *cmp = maskOp(tmp, *cmp, ~px); - } - ++cmp; - - //Step UV horizontally - u += _dudx; - v += _dvdx; - //range over? - if ((uint32_t)v >= image->h) break; - } - } - } - - //Step along both edges - _xa += _dxdya; - _xb += _dxdyb; - _ua += _dudya; - _va += _dvdya; - - if (!region && spanIdx >= image->rle->size) break; - - ++y; - } - xa = _xa; - xb = _xb; - ua = _ua; - va = _va; - - return true; -#endif -} - - -static void _rasterBlendingPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, AASpans* aaSpans, uint8_t opacity) -{ - float _dudx = dudx, _dvdx = dvdx; - float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya; - float _xa = xa, _xb = xb, _ua = ua, _va = va; - auto sbuf = image->buf32; - auto dbuf = surface->buf32; - int32_t sw = static_cast(image->stride); - int32_t sh = image->h; - int32_t dw = surface->stride; - int32_t x1, x2, x, y, ar, ab, iru, irv, px, ay; - int32_t vv = 0, uu = 0; - int32_t minx = INT32_MAX, maxx = 0; - float dx, u, v, iptr; - uint32_t* buf; - SwSpan* span = nullptr; //used only when rle based. - - if (!_arrange(image, region, yStart, yEnd)) return; - - //Loop through all lines in the segment - uint32_t spanIdx = 0; - - if (region) { - minx = region->min.x; - maxx = region->max.x; - } else { - span = image->rle->spans; - while (span->y < yStart) { - ++span; - ++spanIdx; - } - } - - y = yStart; - - while (y < yEnd) { - x1 = (int32_t)_xa; - x2 = (int32_t)_xb; - - if (!region) { - minx = INT32_MAX; - maxx = 0; - //one single row, could be consisted of multiple spans. - while (span->y == y && spanIdx < image->rle->size) { - if (minx > span->x) minx = span->x; - if (maxx < span->x + span->len) maxx = span->x + span->len; - ++span; - ++spanIdx; - } - } - if (x1 < minx) x1 = minx; - if (x2 > maxx) x2 = maxx; - - //Anti-Aliasing frames - ay = y - aaSpans->yStart; - if (aaSpans->lines[ay].x[0] > x1) aaSpans->lines[ay].x[0] = x1; - if (aaSpans->lines[ay].x[1] < x2) aaSpans->lines[ay].x[1] = x2; - - //Range allowed - if ((x2 - x1) >= 1 && (x1 < maxx) && (x2 > minx)) { - - //Perform subtexel pre-stepping on UV - dx = 1 - (_xa - x1); - u = _ua + dx * _dudx; - v = _va + dx * _dvdx; - - buf = dbuf + ((y * dw) + x1); - - x = x1; - - if (opacity == 255) { - //Draw horizontal line - while (x++ < x2) { - uu = (int) u; - if (uu >= sw) continue; - vv = (int) v; - if (vv >= sh) continue; - - ar = (int)(255 * (1 - modff(u, &iptr))); - ab = (int)(255 * (1 - modff(v, &iptr))); - iru = uu + 1; - irv = vv + 1; - - px = *(sbuf + (vv * sw) + uu); - - /* horizontal interpolate */ - if (iru < sw) { - /* right pixel */ - int px2 = *(sbuf + (vv * sw) + iru); - px = INTERPOLATE(px, px2, ar); - } - /* vertical interpolate */ - if (irv < sh) { - /* bottom pixel */ - int px2 = *(sbuf + (irv * sw) + uu); - - /* horizontal interpolate */ - if (iru < sw) { - /* bottom right pixel */ - int px3 = *(sbuf + (irv * sw) + iru); - px2 = INTERPOLATE(px2, px3, ar); - } - px = INTERPOLATE(px, px2, ab); - } - *buf = surface->blender(px, *buf, IA(px)); - ++buf; - - //Step UV horizontally - u += _dudx; - v += _dvdx; - //range over? - if ((uint32_t)v >= image->h) break; - } - } else { - //Draw horizontal line - while (x++ < x2) { - uu = (int) u; - if (uu >= sw) continue; - vv = (int) v; - if (vv >= sh) continue; - - ar = (int)(255 * (1 - modff(u, &iptr))); - ab = (int)(255 * (1 - modff(v, &iptr))); - iru = uu + 1; - irv = vv + 1; - - px = *(sbuf + (vv * sw) + uu); - - /* horizontal interpolate */ - if (iru < sw) { - /* right pixel */ - int px2 = *(sbuf + (vv * sw) + iru); - px = INTERPOLATE(px, px2, ar); - } - /* vertical interpolate */ - if (irv < sh) { - /* bottom pixel */ - int px2 = *(sbuf + (irv * sw) + uu); - - /* horizontal interpolate */ - if (iru < sw) { - /* bottom right pixel */ - int px3 = *(sbuf + (irv * sw) + iru); - px2 = INTERPOLATE(px2, px3, ar); - } - px = INTERPOLATE(px, px2, ab); - } - auto src = ALPHA_BLEND(px, opacity); - *buf = surface->blender(src, *buf, IA(src)); - ++buf; - - //Step UV horizontally - u += _dudx; - v += _dvdx; - //range over? - if ((uint32_t)v >= image->h) break; - } - } - } - - //Step along both edges - _xa += _dxdya; - _xb += _dxdyb; - _ua += _dudya; - _va += _dvdya; - - if (!region && spanIdx >= image->rle->size) break; - - ++y; - } - xa = _xa; - xb = _xb; - ua = _ua; - va = _va; -} - - -static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, AASpans* aaSpans, uint8_t opacity, bool matting) -{ - float _dudx = dudx, _dvdx = dvdx; - float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya; - float _xa = xa, _xb = xb, _ua = ua, _va = va; - auto sbuf = image->buf32; - auto dbuf = surface->buf32; - int32_t sw = static_cast(image->stride); - int32_t sh = image->h; - int32_t dw = surface->stride; - int32_t x1, x2, x, y, ar, ab, iru, irv, px, ay; - int32_t vv = 0, uu = 0; - int32_t minx = INT32_MAX, maxx = 0; - float dx, u, v, iptr; - uint32_t* buf; - SwSpan* span = nullptr; //used only when rle based. - - //for matting(composition) - auto csize = matting ? surface->compositor->image.channelSize: 0; - auto alpha = matting ? surface->alpha(surface->compositor->method) : nullptr; - uint8_t* cmp = nullptr; - - if (!_arrange(image, region, yStart, yEnd)) return; - - //Loop through all lines in the segment - uint32_t spanIdx = 0; - - if (region) { - minx = region->min.x; - maxx = region->max.x; - } else { - span = image->rle->spans; - while (span->y < yStart) { - ++span; - ++spanIdx; - } - } - - y = yStart; - - while (y < yEnd) { - x1 = (int32_t)_xa; - x2 = (int32_t)_xb; - - if (!region) { - minx = INT32_MAX; - maxx = 0; - //one single row, could be consisted of multiple spans. - while (span->y == y && spanIdx < image->rle->size) { - if (minx > span->x) minx = span->x; - if (maxx < span->x + span->len) maxx = span->x + span->len; - ++span; - ++spanIdx; - } - } - if (x1 < minx) x1 = minx; - if (x2 > maxx) x2 = maxx; - - //Anti-Aliasing frames - ay = y - aaSpans->yStart; - if (aaSpans->lines[ay].x[0] > x1) aaSpans->lines[ay].x[0] = x1; - if (aaSpans->lines[ay].x[1] < x2) aaSpans->lines[ay].x[1] = x2; - - //Range allowed - if ((x2 - x1) >= 1 && (x1 < maxx) && (x2 > minx)) { - - //Perform subtexel pre-stepping on UV - dx = 1 - (_xa - x1); - u = _ua + dx * _dudx; - v = _va + dx * _dvdx; - - buf = dbuf + ((y * dw) + x1); - - x = x1; - - if (matting) cmp = &surface->compositor->image.buf8[(y * surface->compositor->image.stride + x1) * csize]; - - if (opacity == 255) { - //Draw horizontal line - while (x++ < x2) { - uu = (int) u; - if (uu >= sw) continue; - vv = (int) v; - if (vv >= sh) continue; - - ar = (int)(255.0f * (1.0f - modff(u, &iptr))); - ab = (int)(255.0f * (1.0f - modff(v, &iptr))); - iru = uu + 1; - irv = vv + 1; - - px = *(sbuf + (vv * sw) + uu); - - /* horizontal interpolate */ - if (iru < sw) { - /* right pixel */ - int px2 = *(sbuf + (vv * sw) + iru); - px = INTERPOLATE(px, px2, ar); - } - /* vertical interpolate */ - if (irv < sh) { - /* bottom pixel */ - int px2 = *(sbuf + (irv * sw) + uu); - - /* horizontal interpolate */ - if (iru < sw) { - /* bottom right pixel */ - int px3 = *(sbuf + (irv * sw) + iru); - px2 = INTERPOLATE(px2, px3, ar); - } - px = INTERPOLATE(px, px2, ab); - } - uint32_t src; - if (matting) { - src = ALPHA_BLEND(px, alpha(cmp)); - cmp += csize; - } else { - src = px; - } - *buf = src + ALPHA_BLEND(*buf, IA(src)); - ++buf; - - //Step UV horizontally - u += _dudx; - v += _dvdx; - //range over? - if ((uint32_t)v >= image->h) break; - } - } else { - //Draw horizontal line - while (x++ < x2) { - uu = (int) u; - vv = (int) v; - - ar = (int)(255.0f * (1.0f - modff(u, &iptr))); - ab = (int)(255.0f * (1.0f - modff(v, &iptr))); - iru = uu + 1; - irv = vv + 1; - - if (vv >= sh) continue; - - px = *(sbuf + (vv * sw) + uu); - - /* horizontal interpolate */ - if (iru < sw) { - /* right pixel */ - int px2 = *(sbuf + (vv * sw) + iru); - px = INTERPOLATE(px, px2, ar); - } - /* vertical interpolate */ - if (irv < sh) { - /* bottom pixel */ - int px2 = *(sbuf + (irv * sw) + uu); - - /* horizontal interpolate */ - if (iru < sw) { - /* bottom right pixel */ - int px3 = *(sbuf + (irv * sw) + iru); - px2 = INTERPOLATE(px2, px3, ar); - } - px = INTERPOLATE(px, px2, ab); - } - uint32_t src; - if (matting) { - src = ALPHA_BLEND(px, MULTIPLY(opacity, alpha(cmp))); - cmp += csize; - } else { - src = ALPHA_BLEND(px, opacity); - } - *buf = src + ALPHA_BLEND(*buf, IA(src)); - ++buf; - - //Step UV horizontally - u += _dudx; - v += _dvdx; - //range over? - if ((uint32_t)v >= image->h) break; - } - } - } - - //Step along both edges - _xa += _dxdya; - _xb += _dxdyb; - _ua += _dudya; - _va += _dvdya; - - if (!region && spanIdx >= image->rle->size) break; - - ++y; - } - xa = _xa; - xb = _xb; - ua = _ua; - va = _va; -} - - -/* This mapping algorithm is based on Mikael Kalms's. */ -static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const SwBBox* region, Polygon& polygon, AASpans* aaSpans, uint8_t opacity) -{ - float x[3] = {polygon.vertex[0].pt.x, polygon.vertex[1].pt.x, polygon.vertex[2].pt.x}; - float y[3] = {polygon.vertex[0].pt.y, polygon.vertex[1].pt.y, polygon.vertex[2].pt.y}; - float u[3] = {polygon.vertex[0].uv.x, polygon.vertex[1].uv.x, polygon.vertex[2].uv.x}; - float v[3] = {polygon.vertex[0].uv.y, polygon.vertex[1].uv.y, polygon.vertex[2].uv.y}; - - float off_y; - float dxdy[3] = {0.0f, 0.0f, 0.0f}; - float tmp; - - auto upper = false; - - //Sort the vertices in ascending Y order - if (y[0] > y[1]) { - _swap(x[0], x[1], tmp); - _swap(y[0], y[1], tmp); - _swap(u[0], u[1], tmp); - _swap(v[0], v[1], tmp); - } - if (y[0] > y[2]) { - _swap(x[0], x[2], tmp); - _swap(y[0], y[2], tmp); - _swap(u[0], u[2], tmp); - _swap(v[0], v[2], tmp); - } - if (y[1] > y[2]) { - _swap(x[1], x[2], tmp); - _swap(y[1], y[2], tmp); - _swap(u[1], u[2], tmp); - _swap(v[1], v[2], tmp); - } - - //Y indexes - int yi[3] = {(int)y[0], (int)y[1], (int)y[2]}; - - //Skip drawing if it's too thin to cover any pixels at all. - if ((yi[0] == yi[1] && yi[0] == yi[2]) || ((int) x[0] == (int) x[1] && (int) x[0] == (int) x[2])) return; - - //Calculate horizontal and vertical increments for UV axes (these calcs are certainly not optimal, although they're stable (handles any dy being 0) - auto denom = ((x[2] - x[0]) * (y[1] - y[0]) - (x[1] - x[0]) * (y[2] - y[0])); - - //Skip poly if it's an infinitely thin line - if (mathZero(denom)) return; - - denom = 1 / denom; //Reciprocal for speeding up - dudx = ((u[2] - u[0]) * (y[1] - y[0]) - (u[1] - u[0]) * (y[2] - y[0])) * denom; - dvdx = ((v[2] - v[0]) * (y[1] - y[0]) - (v[1] - v[0]) * (y[2] - y[0])) * denom; - auto dudy = ((u[1] - u[0]) * (x[2] - x[0]) - (u[2] - u[0]) * (x[1] - x[0])) * denom; - auto dvdy = ((v[1] - v[0]) * (x[2] - x[0]) - (v[2] - v[0]) * (x[1] - x[0])) * denom; - - //Calculate X-slopes along the edges - if (y[1] > y[0]) dxdy[0] = (x[1] - x[0]) / (y[1] - y[0]); - if (y[2] > y[0]) dxdy[1] = (x[2] - x[0]) / (y[2] - y[0]); - if (y[2] > y[1]) dxdy[2] = (x[2] - x[1]) / (y[2] - y[1]); - - //Determine which side of the polygon the longer edge is on - auto side = (dxdy[1] > dxdy[0]) ? true : false; - - if (mathEqual(y[0], y[1])) side = x[0] > x[1]; - if (mathEqual(y[1], y[2])) side = x[2] > x[1]; - - auto regionTop = region ? region->min.y : image->rle->spans->y; //Normal Image or Rle Image? - auto compositing = _compositing(surface); //Composition required - auto blending = _blending(surface); //Blending required - - //Longer edge is on the left side - if (!side) { - //Calculate slopes along left edge - dxdya = dxdy[1]; - dudya = dxdya * dudx + dudy; - dvdya = dxdya * dvdx + dvdy; - - //Perform subpixel pre-stepping along left edge - auto dy = 1.0f - (y[0] - yi[0]); - xa = x[0] + dy * dxdya; - ua = u[0] + dy * dudya; - va = v[0] + dy * dvdya; - - //Draw upper segment if possibly visible - if (yi[0] < yi[1]) { - off_y = y[0] < regionTop ? (regionTop - y[0]) : 0; - xa += (off_y * dxdya); - ua += (off_y * dudya); - va += (off_y * dvdya); - - // Set right edge X-slope and perform subpixel pre-stepping - dxdyb = dxdy[0]; - xb = x[0] + dy * dxdyb + (off_y * dxdyb); - - if (compositing) { - if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, true); - else _rasterMaskedPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, 1); - } else if (blending) { - _rasterBlendingPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity); - } else { - _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, false); - } - upper = true; - } - //Draw lower segment if possibly visible - if (yi[1] < yi[2]) { - off_y = y[1] < regionTop ? (regionTop - y[1]) : 0; - if (!upper) { - xa += (off_y * dxdya); - ua += (off_y * dudya); - va += (off_y * dvdya); - } - // Set right edge X-slope and perform subpixel pre-stepping - dxdyb = dxdy[2]; - xb = x[1] + (1 - (y[1] - yi[1])) * dxdyb + (off_y * dxdyb); - if (compositing) { - if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, true); - else _rasterMaskedPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, 2); - } else if (blending) { - _rasterBlendingPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity); - } else { - _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, false); - } - } - //Longer edge is on the right side - } else { - //Set right edge X-slope and perform subpixel pre-stepping - dxdyb = dxdy[1]; - auto dy = 1.0f - (y[0] - yi[0]); - xb = x[0] + dy * dxdyb; - - //Draw upper segment if possibly visible - if (yi[0] < yi[1]) { - off_y = y[0] < regionTop ? (regionTop - y[0]) : 0; - xb += (off_y *dxdyb); - - // Set slopes along left edge and perform subpixel pre-stepping - dxdya = dxdy[0]; - dudya = dxdya * dudx + dudy; - dvdya = dxdya * dvdx + dvdy; - - xa = x[0] + dy * dxdya + (off_y * dxdya); - ua = u[0] + dy * dudya + (off_y * dudya); - va = v[0] + dy * dvdya + (off_y * dvdya); - - if (compositing) { - if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, true); - else _rasterMaskedPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, 3); - } else if (blending) { - _rasterBlendingPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity); - } else { - _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, false); - } - upper = true; - } - //Draw lower segment if possibly visible - if (yi[1] < yi[2]) { - off_y = y[1] < regionTop ? (regionTop - y[1]) : 0; - if (!upper) xb += (off_y *dxdyb); - - // Set slopes along left edge and perform subpixel pre-stepping - dxdya = dxdy[2]; - dudya = dxdya * dudx + dudy; - dvdya = dxdya * dvdx + dvdy; - dy = 1 - (y[1] - yi[1]); - xa = x[1] + dy * dxdya + (off_y * dxdya); - ua = u[1] + dy * dudya + (off_y * dudya); - va = v[1] + dy * dvdya + (off_y * dvdya); - - if (compositing) { - if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, true); - else _rasterMaskedPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, 4); - } else if (blending) { - _rasterBlendingPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity); - } else { - _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, false); - } - } - } -} - - -static AASpans* _AASpans(float ymin, float ymax, const SwImage* image, const SwBBox* region) -{ - auto yStart = static_cast(ymin); - auto yEnd = static_cast(ymax); - - if (!_arrange(image, region, yStart, yEnd)) return nullptr; - - auto aaSpans = static_cast(malloc(sizeof(AASpans))); - aaSpans->yStart = yStart; - aaSpans->yEnd = yEnd; - - //Initialize X range - auto height = yEnd - yStart; - - aaSpans->lines = static_cast(malloc(height * sizeof(AALine))); - - for (int32_t i = 0; i < height; i++) { - aaSpans->lines[i].x[0] = INT32_MAX; - aaSpans->lines[i].x[1] = 0; - aaSpans->lines[i].length[0] = 0; - aaSpans->lines[i].length[1] = 0; - } - return aaSpans; -} - - -static void _calcIrregularCoverage(AALine* lines, int32_t eidx, int32_t y, int32_t diagonal, int32_t edgeDist, bool reverse) -{ - if (eidx == 1) reverse = !reverse; - int32_t coverage = (255 / (diagonal + 2)); - int32_t tmp; - for (int32_t ry = 0; ry < (diagonal + 2); ry++) { - tmp = y - ry - edgeDist; - if (tmp < 0) return; - lines[tmp].length[eidx] = 1; - if (reverse) lines[tmp].coverage[eidx] = 255 - (coverage * ry); - else lines[tmp].coverage[eidx] = (coverage * ry); - } -} - - -static void _calcVertCoverage(AALine *lines, int32_t eidx, int32_t y, int32_t rewind, bool reverse) -{ - if (eidx == 1) reverse = !reverse; - int32_t coverage = (255 / (rewind + 1)); - int32_t tmp; - for (int ry = 1; ry < (rewind + 1); ry++) { - tmp = y - ry; - if (tmp < 0) return; - lines[tmp].length[eidx] = 1; - if (reverse) lines[tmp].coverage[eidx] = (255 - (coverage * ry)); - else lines[tmp].coverage[eidx] = (coverage * ry); - } -} - - -static void _calcHorizCoverage(AALine *lines, int32_t eidx, int32_t y, int32_t x, int32_t x2) -{ - if (lines[y].length[eidx] < abs(x - x2)) { - lines[y].length[eidx] = abs(x - x2); - lines[y].coverage[eidx] = (255 / (lines[y].length[eidx] + 1)); - } -} - - -/* - * This Anti-Aliasing mechanism is originated from Hermet Park's idea. - * To understand this AA logic, you can refer this page: - * www.hermet.pe.kr/122 (hermetpark@gmail.com) -*/ -static void _calcAAEdge(AASpans *aaSpans, int32_t eidx) -{ -//Previous edge direction: -#define DirOutHor 0x0011 -#define DirOutVer 0x0001 -#define DirInHor 0x0010 -#define DirInVer 0x0000 -#define DirNone 0x1000 - -#define PUSH_VERTEX() \ - do { \ - pEdge.x = lines[y].x[eidx]; \ - pEdge.y = y; \ - ptx[0] = tx[0]; \ - ptx[1] = tx[1]; \ - } while (0) - - int32_t y = 0; - SwPoint pEdge = {-1, -1}; //previous edge point - SwPoint edgeDiff = {0, 0}; //temporary used for point distance - - /* store bigger to tx[0] between prev and current edge's x positions. */ - int32_t tx[2] = {0, 0}; - /* back up prev tx values */ - int32_t ptx[2] = {0, 0}; - int32_t diagonal = 0; //straight diagonal pixels count - - auto yStart = aaSpans->yStart; - auto yEnd = aaSpans->yEnd; - auto lines = aaSpans->lines; - - int32_t prevDir = DirNone; - int32_t curDir = DirNone; - - yEnd -= yStart; - - //Start Edge - if (y < yEnd) { - pEdge.x = lines[y].x[eidx]; - pEdge.y = y; - } - - //Calculates AA Edges - for (y++; y < yEnd; y++) { - //Ready tx - if (eidx == 0) { - tx[0] = pEdge.x; - tx[1] = lines[y].x[0]; - } else { - tx[0] = lines[y].x[1]; - tx[1] = pEdge.x; - } - edgeDiff.x = (tx[0] - tx[1]); - edgeDiff.y = (y - pEdge.y); - - //Confirm current edge direction - if (edgeDiff.x > 0) { - if (edgeDiff.y == 1) curDir = DirOutHor; - else curDir = DirOutVer; - } else if (edgeDiff.x < 0) { - if (edgeDiff.y == 1) curDir = DirInHor; - else curDir = DirInVer; - } else curDir = DirNone; - - //straight diagonal increase - if ((curDir == prevDir) && (y < yEnd)) { - if ((abs(edgeDiff.x) == 1) && (edgeDiff.y == 1)) { - ++diagonal; - PUSH_VERTEX(); - continue; - } - } - - switch (curDir) { - case DirOutHor: { - _calcHorizCoverage(lines, eidx, y, tx[0], tx[1]); - if (diagonal > 0) { - _calcIrregularCoverage(lines, eidx, y, diagonal, 0, true); - diagonal = 0; - } - /* Increment direction is changed: Outside Vertical -> Outside Horizontal */ - if (prevDir == DirOutVer) _calcHorizCoverage(lines, eidx, pEdge.y, ptx[0], ptx[1]); - - //Trick, but fine-tunning! - if (y == 1) _calcHorizCoverage(lines, eidx, pEdge.y, tx[0], tx[1]); - PUSH_VERTEX(); - } - break; - case DirOutVer: { - _calcVertCoverage(lines, eidx, y, edgeDiff.y, true); - if (diagonal > 0) { - _calcIrregularCoverage(lines, eidx, y, diagonal, edgeDiff.y, false); - diagonal = 0; - } - /* Increment direction is changed: Outside Horizontal -> Outside Vertical */ - if (prevDir == DirOutHor) _calcHorizCoverage(lines, eidx, pEdge.y, ptx[0], ptx[1]); - PUSH_VERTEX(); - } - break; - case DirInHor: { - _calcHorizCoverage(lines, eidx, (y - 1), tx[0], tx[1]); - if (diagonal > 0) { - _calcIrregularCoverage(lines, eidx, y, diagonal, 0, false); - diagonal = 0; - } - /* Increment direction is changed: Outside Horizontal -> Inside Horizontal */ - if (prevDir == DirOutHor) _calcHorizCoverage(lines, eidx, pEdge.y, ptx[0], ptx[1]); - PUSH_VERTEX(); - } - break; - case DirInVer: { - _calcVertCoverage(lines, eidx, y, edgeDiff.y, false); - if (prevDir == DirOutHor) edgeDiff.y -= 1; //Weird, fine tuning????????????????????? - if (diagonal > 0) { - _calcIrregularCoverage(lines, eidx, y, diagonal, edgeDiff.y, true); - diagonal = 0; - } - /* Increment direction is changed: Outside Horizontal -> Inside Vertical */ - if (prevDir == DirOutHor) _calcHorizCoverage(lines, eidx, pEdge.y, ptx[0], ptx[1]); - PUSH_VERTEX(); - } - break; - } - if (curDir != DirNone) prevDir = curDir; - } - - //leftovers...? - if ((edgeDiff.y == 1) && (edgeDiff.x != 0)) { - if (y >= yEnd) y = (yEnd - 1); - _calcHorizCoverage(lines, eidx, y - 1, ptx[0], ptx[1]); - _calcHorizCoverage(lines, eidx, y, tx[0], tx[1]); - } else { - ++y; - if (y > yEnd) y = yEnd; - _calcVertCoverage(lines, eidx, y, (edgeDiff.y + 1), (prevDir & 0x00000001)); - } -} - - -static bool _apply(SwSurface* surface, AASpans* aaSpans) -{ - auto y = aaSpans->yStart; - uint32_t pixel; - uint32_t* dst; - int32_t pos; - - //left side - _calcAAEdge(aaSpans, 0); - //right side - _calcAAEdge(aaSpans, 1); - - while (y < aaSpans->yEnd) { - auto line = &aaSpans->lines[y - aaSpans->yStart]; - auto width = line->x[1] - line->x[0]; - if (width > 0) { - auto offset = y * surface->stride; - - //Left edge - dst = surface->buf32 + (offset + line->x[0]); - if (line->x[0] > 1) pixel = *(dst - 1); - else pixel = *dst; - - pos = 1; - while (pos <= line->length[0]) { - *dst = INTERPOLATE(*dst, pixel, line->coverage[0] * pos); - ++dst; - ++pos; - } - - //Right edge - dst = surface->buf32 + (offset + line->x[1] - 1); - if (line->x[1] < (int32_t)(surface->w - 1)) pixel = *(dst + 1); - else pixel = *dst; - - pos = width; - while ((int32_t)(width - line->length[1]) < pos) { - *dst = INTERPOLATE(*dst, pixel, 255 - (line->coverage[1] * (line->length[1] - (width - pos)))); - --dst; - --pos; - } - } - y++; - } - - free(aaSpans->lines); - free(aaSpans); - - return true; -} - - -/* - 2 triangles constructs 1 mesh. - below figure illustrates vert[4] index info. - If you need better quality, please divide a mesh by more number of triangles. - - 0 -- 1 - | / | - | / | - 3 -- 2 -*/ -static bool _rasterTexmapPolygon(SwSurface* surface, const SwImage* image, const Matrix* transform, const SwBBox* region, uint8_t opacity) -{ - if (surface->channelSize == sizeof(uint8_t)) { - TVGERR("SW_ENGINE", "Not supported grayscale Textmap polygon!"); - return false; - } - - //Exceptions: No dedicated drawing area? - if ((!image->rle && !region) || (image->rle && image->rle->size == 0)) return false; - - /* Prepare vertices. - shift XY coordinates to match the sub-pixeling technique. */ - Vertex vertices[4]; - vertices[0] = {{0.0f, 0.0f}, {0.0f, 0.0f}}; - vertices[1] = {{float(image->w), 0.0f}, {float(image->w), 0.0f}}; - vertices[2] = {{float(image->w), float(image->h)}, {float(image->w), float(image->h)}}; - vertices[3] = {{0.0f, float(image->h)}, {0.0f, float(image->h)}}; - - float ys = FLT_MAX, ye = -1.0f; - for (int i = 0; i < 4; i++) { - if (transform) mathMultiply(&vertices[i].pt, transform); - if (vertices[i].pt.y < ys) ys = vertices[i].pt.y; - if (vertices[i].pt.y > ye) ye = vertices[i].pt.y; - } - - auto aaSpans = _AASpans(ys, ye, image, region); - if (!aaSpans) return true; - - Polygon polygon; - - //Draw the first polygon - polygon.vertex[0] = vertices[0]; - polygon.vertex[1] = vertices[1]; - polygon.vertex[2] = vertices[3]; - - _rasterPolygonImage(surface, image, region, polygon, aaSpans, opacity); - - //Draw the second polygon - polygon.vertex[0] = vertices[1]; - polygon.vertex[1] = vertices[2]; - polygon.vertex[2] = vertices[3]; - - _rasterPolygonImage(surface, image, region, polygon, aaSpans, opacity); - -#if 0 - if (_compositing(surface) && _masking(surface) && !_direct(surface->compositor->method)) { - _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); - } -#endif - return _apply(surface, aaSpans); -} - - -/* - Provide any number of triangles to draw a mesh using the supplied image. - Indexes are not used, so each triangle (Polygon) vertex has to be defined, even if they copy the previous one. - Example: - - 0 -- 1 0 -- 1 0 - | / | --> | / / | - | / | | / / | - 2 -- 3 2 1 -- 2 - - Should provide two Polygons, one for each triangle. - // TODO: region? -*/ -static bool _rasterTexmapPolygonMesh(SwSurface* surface, const SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox* region, uint8_t opacity) -{ - if (surface->channelSize == sizeof(uint8_t)) { - TVGERR("SW_ENGINE", "Not supported grayscale Textmap polygon mesh!"); - return false; - } - - //Exceptions: No dedicated drawing area? - if ((!image->rle && !region) || (image->rle && image->rle->size == 0)) return false; - - // Step polygons once to transform - auto transformedTris = (Polygon*)malloc(sizeof(Polygon) * mesh->triangleCnt); - float ys = FLT_MAX, ye = -1.0f; - for (uint32_t i = 0; i < mesh->triangleCnt; i++) { - transformedTris[i] = mesh->triangles[i]; - mathMultiply(&transformedTris[i].vertex[0].pt, transform); - mathMultiply(&transformedTris[i].vertex[1].pt, transform); - mathMultiply(&transformedTris[i].vertex[2].pt, transform); - - if (transformedTris[i].vertex[0].pt.y < ys) ys = transformedTris[i].vertex[0].pt.y; - else if (transformedTris[i].vertex[0].pt.y > ye) ye = transformedTris[i].vertex[0].pt.y; - if (transformedTris[i].vertex[1].pt.y < ys) ys = transformedTris[i].vertex[1].pt.y; - else if (transformedTris[i].vertex[1].pt.y > ye) ye = transformedTris[i].vertex[1].pt.y; - if (transformedTris[i].vertex[2].pt.y < ys) ys = transformedTris[i].vertex[2].pt.y; - else if (transformedTris[i].vertex[2].pt.y > ye) ye = transformedTris[i].vertex[2].pt.y; - - // Convert normalized UV coordinates to image coordinates - transformedTris[i].vertex[0].uv.x *= (float)image->w; - transformedTris[i].vertex[0].uv.y *= (float)image->h; - transformedTris[i].vertex[1].uv.x *= (float)image->w; - transformedTris[i].vertex[1].uv.y *= (float)image->h; - transformedTris[i].vertex[2].uv.x *= (float)image->w; - transformedTris[i].vertex[2].uv.y *= (float)image->h; - } - - // Get AA spans and step polygons again to draw - if (auto aaSpans = _AASpans(ys, ye, image, region)) { - for (uint32_t i = 0; i < mesh->triangleCnt; i++) { - _rasterPolygonImage(surface, image, region, transformedTris[i], aaSpans, opacity); - } -#if 0 - if (_compositing(surface) && _masking(surface) && !_direct(surface->compositor->method)) { - _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); - } -#endif - _apply(surface, aaSpans); - } - free(transformedTris); - return true; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRenderer.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRenderer.cpp deleted file mode 100644 index 9a09654..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRenderer.cpp +++ /dev/null @@ -1,859 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgMath.h" -#include "tvgSwCommon.h" -#include "tvgTaskScheduler.h" -#include "tvgSwRenderer.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ -static int32_t initEngineCnt = false; -static int32_t rendererCnt = 0; -static SwMpool* globalMpool = nullptr; -static uint32_t threadsCnt = 0; - -struct SwTask : Task -{ - SwSurface* surface = nullptr; - SwMpool* mpool = nullptr; - SwBBox bbox = {{0, 0}, {0, 0}}; //Whole Rendering Region - Matrix* transform = nullptr; - Array clips; - RenderUpdateFlag flags = RenderUpdateFlag::None; - uint8_t opacity; - bool pushed = false; //Pushed into task list? - bool disposed = false; //Disposed task? - - RenderRegion bounds() - { - //Can we skip the synchronization? - done(); - - RenderRegion region; - - //Range over? - region.x = bbox.min.x > 0 ? bbox.min.x : 0; - region.y = bbox.min.y > 0 ? bbox.min.y : 0; - region.w = bbox.max.x - region.x; - region.h = bbox.max.y - region.y; - if (region.w < 0) region.w = 0; - if (region.h < 0) region.h = 0; - - return region; - } - - virtual void dispose() = 0; - virtual bool clip(SwRleData* target) = 0; - virtual SwRleData* rle() = 0; - - virtual ~SwTask() - { - free(transform); - } -}; - - -struct SwShapeTask : SwTask -{ - SwShape shape; - const RenderShape* rshape = nullptr; - bool cmpStroking = false; - bool clipper = false; - - /* We assume that if the stroke width is greater than 2, - the shape's outline beneath the stroke could be adequately covered by the stroke drawing. - Therefore, antialiasing is disabled under this condition. - Additionally, the stroke style should not be dashed. */ - bool antialiasing(float strokeWidth) - { - return strokeWidth < 2.0f || rshape->stroke->dashCnt > 0 || rshape->stroke->strokeFirst; - } - - float validStrokeWidth() - { - if (!rshape->stroke) return 0.0f; - - auto width = rshape->stroke->width; - if (mathZero(width)) return 0.0f; - - if (!rshape->stroke->fill && (MULTIPLY(rshape->stroke->color[3], opacity) == 0)) return 0.0f; - if (mathZero(rshape->stroke->trim.begin - rshape->stroke->trim.end)) return 0.0f; - - if (transform) return (width * sqrt(transform->e11 * transform->e11 + transform->e12 * transform->e12)); - else return width; - } - - - bool clip(SwRleData* target) override - { - if (shape.fastTrack) rleClipRect(target, &bbox); - else if (shape.rle) rleClipPath(target, shape.rle); - else return false; - - return true; - } - - SwRleData* rle() override - { - if (!shape.rle && shape.fastTrack) { - shape.rle = rleRender(&shape.bbox); - } - return shape.rle; - } - - void run(unsigned tid) override - { - if (opacity == 0 && !clipper) return; //Invisible - - auto strokeWidth = validStrokeWidth(); - bool visibleFill = false; - auto clipRegion = bbox; - - //This checks also for the case, if the invisible shape turned to visible by alpha. - auto prepareShape = false; - if (!shapePrepared(&shape) && (flags & RenderUpdateFlag::Color)) prepareShape = true; - - //Shape - if (flags & (RenderUpdateFlag::Path | RenderUpdateFlag::Transform) || prepareShape) { - uint8_t alpha = 0; - rshape->fillColor(nullptr, nullptr, nullptr, &alpha); - alpha = MULTIPLY(alpha, opacity); - visibleFill = (alpha > 0 || rshape->fill); - if (visibleFill || clipper) { - shapeReset(&shape); - if (!shapePrepare(&shape, rshape, transform, clipRegion, bbox, mpool, tid, clips.count > 0 ? true : false)) { - visibleFill = false; - } - } - } - //Fill - if (flags & (RenderUpdateFlag::Gradient | RenderUpdateFlag::Transform | RenderUpdateFlag::Color)) { - if (visibleFill || clipper) { - if (!shapeGenRle(&shape, rshape, antialiasing(strokeWidth))) goto err; - } - if (auto fill = rshape->fill) { - auto ctable = (flags & RenderUpdateFlag::Gradient) ? true : false; - if (ctable) shapeResetFill(&shape); - if (!shapeGenFillColors(&shape, fill, transform, surface, opacity, ctable)) goto err; - } else { - shapeDelFill(&shape); - } - } - //Stroke - if (flags & (RenderUpdateFlag::Stroke | RenderUpdateFlag::Transform)) { - if (strokeWidth > 0.0f) { - shapeResetStroke(&shape, rshape, transform); - if (!shapeGenStrokeRle(&shape, rshape, transform, clipRegion, bbox, mpool, tid)) goto err; - - if (auto fill = rshape->strokeFill()) { - auto ctable = (flags & RenderUpdateFlag::GradientStroke) ? true : false; - if (ctable) shapeResetStrokeFill(&shape); - if (!shapeGenStrokeFillColors(&shape, fill, transform, surface, opacity, ctable)) goto err; - } else { - shapeDelStrokeFill(&shape); - } - } else { - shapeDelStroke(&shape); - } - } - - //Clear current task memorypool here if the clippers would use the same memory pool - shapeDelOutline(&shape, mpool, tid); - - //Clip Path - for (auto clip = clips.begin(); clip < clips.end(); ++clip) { - auto clipper = static_cast(*clip); - //Clip shape rle - if (shape.rle && !clipper->clip(shape.rle)) goto err; - //Clip stroke rle - if (shape.strokeRle && !clipper->clip(shape.strokeRle)) goto err; - } - return; - - err: - shapeReset(&shape); - shapeDelOutline(&shape, mpool, tid); - } - - void dispose() override - { - shapeFree(&shape); - } -}; - - -struct SwSceneTask : SwTask -{ - Array scene; //list of paints render data (SwTask) - SwRleData* sceneRle = nullptr; - - bool clip(SwRleData* target) override - { - //Only one shape - if (scene.count == 1) { - return static_cast(*scene.data)->clip(target); - } - - //More than one shapes - if (sceneRle) rleClipPath(target, sceneRle); - else TVGLOG("SW_ENGINE", "No clippers in a scene?"); - - return true; - } - - SwRleData* rle() override - { - return sceneRle; - } - - void run(unsigned tid) override - { - //TODO: Skip the run if the scene hasn't changed. - if (!sceneRle) sceneRle = static_cast(calloc(1, sizeof(SwRleData))); - else rleReset(sceneRle); - - //Merge shapes if it has more than one shapes - if (scene.count > 1) { - //Merge first two clippers - auto clipper1 = static_cast(*scene.data); - auto clipper2 = static_cast(*(scene.data + 1)); - - rleMerge(sceneRle, clipper1->rle(), clipper2->rle()); - - //Unify the remained clippers - for (auto rd = scene.begin() + 2; rd < scene.end(); ++rd) { - auto clipper = static_cast(*rd); - rleMerge(sceneRle, sceneRle, clipper->rle()); - } - } - } - - void dispose() override - { - rleFree(sceneRle); - } -}; - - -struct SwImageTask : SwTask -{ - SwImage image; - Surface* source; //Image source - const RenderMesh* mesh = nullptr; //Should be valid ptr in action - - bool clip(SwRleData* target) override - { - TVGERR("SW_ENGINE", "Image is used as ClipPath?"); - return true; - } - - SwRleData* rle() override - { - TVGERR("SW_ENGINE", "Image is used as Scene ClipPath?"); - return nullptr; - } - - void run(unsigned tid) override - { - auto clipRegion = bbox; - - //Convert colorspace if it's not aligned. - rasterConvertCS(source, surface->cs); - rasterPremultiply(source); - - image.data = source->data; - image.w = source->w; - image.h = source->h; - image.stride = source->stride; - image.channelSize = source->channelSize; - - //Invisible shape turned to visible by alpha. - if ((flags & (RenderUpdateFlag::Image | RenderUpdateFlag::Transform | RenderUpdateFlag::Color)) && (opacity > 0)) { - imageReset(&image); - if (!image.data || image.w == 0 || image.h == 0) goto end; - - if (!imagePrepare(&image, mesh, transform, clipRegion, bbox, mpool, tid)) goto end; - - // TODO: How do we clip the triangle mesh? Only clip non-meshed images for now - if (mesh->triangleCnt == 0 && clips.count > 0) { - if (!imageGenRle(&image, bbox, false)) goto end; - if (image.rle) { - //Clear current task memorypool here if the clippers would use the same memory pool - imageDelOutline(&image, mpool, tid); - for (auto clip = clips.begin(); clip < clips.end(); ++clip) { - auto clipper = static_cast(*clip); - if (!clipper->clip(image.rle)) goto err; - } - return; - } - } - } - goto end; - err: - rleReset(image.rle); - end: - imageDelOutline(&image, mpool, tid); - } - - void dispose() override - { - imageFree(&image); - } -}; - - -static void _termEngine() -{ - if (rendererCnt > 0) return; - - mpoolTerm(globalMpool); - globalMpool = nullptr; -} - - -static void _renderFill(SwShapeTask* task, SwSurface* surface, uint8_t opacity) -{ - uint8_t r, g, b, a; - if (auto fill = task->rshape->fill) { - rasterGradientShape(surface, &task->shape, fill->identifier()); - } else { - task->rshape->fillColor(&r, &g, &b, &a); - a = MULTIPLY(opacity, a); - if (a > 0) rasterShape(surface, &task->shape, r, g, b, a); - } -} - -static void _renderStroke(SwShapeTask* task, SwSurface* surface, uint8_t opacity) -{ - uint8_t r, g, b, a; - if (auto strokeFill = task->rshape->strokeFill()) { - rasterGradientStroke(surface, &task->shape, strokeFill->identifier()); - } else { - if (task->rshape->strokeColor(&r, &g, &b, &a)) { - a = MULTIPLY(opacity, a); - if (a > 0) rasterStroke(surface, &task->shape, r, g, b, a); - } - } -} - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -SwRenderer::~SwRenderer() -{ - clearCompositors(); - - delete(surface); - - if (!sharedMpool) mpoolTerm(mpool); - - --rendererCnt; - - if (rendererCnt == 0 && initEngineCnt == 0) _termEngine(); -} - - -bool SwRenderer::clear() -{ - for (auto task = tasks.begin(); task < tasks.end(); ++task) { - if ((*task)->disposed) { - delete(*task); - } else { - (*task)->done(); - (*task)->pushed = false; - } - } - tasks.clear(); - - if (!sharedMpool) mpoolClear(mpool); - - if (surface) { - vport.x = vport.y = 0; - vport.w = surface->w; - vport.h = surface->h; - } - - return true; -} - - -bool SwRenderer::sync() -{ - return true; -} - - -RenderRegion SwRenderer::viewport() -{ - return vport; -} - - -bool SwRenderer::viewport(const RenderRegion& vp) -{ - vport = vp; - return true; -} - - -bool SwRenderer::target(pixel_t* data, uint32_t stride, uint32_t w, uint32_t h, ColorSpace cs) -{ - if (!data || stride == 0 || w == 0 || h == 0 || w > stride) return false; - - clearCompositors(); - - if (!surface) surface = new SwSurface; - - surface->data = data; - surface->stride = stride; - surface->w = w; - surface->h = h; - surface->cs = cs; - surface->channelSize = CHANNEL_SIZE(cs); - surface->premultiplied = true; - - return rasterCompositor(surface); -} - - -bool SwRenderer::preRender() -{ - return true; -} - - -void SwRenderer::clearCompositors() -{ - //Free Composite Caches - for (auto comp = compositors.begin(); comp < compositors.end(); ++comp) { - free((*comp)->compositor->image.data); - delete((*comp)->compositor); - delete(*comp); - } - compositors.reset(); -} - - -bool SwRenderer::postRender() -{ - //Unmultiply alpha if needed - if (surface->cs == ColorSpace::ABGR8888S || surface->cs == ColorSpace::ARGB8888S) { - rasterUnpremultiply(surface); - } - - for (auto task = tasks.begin(); task < tasks.end(); ++task) { - if ((*task)->disposed) delete(*task); - else (*task)->pushed = false; - } - tasks.clear(); - - return true; -} - - -bool SwRenderer::renderImage(RenderData data) -{ - auto task = static_cast(data); - task->done(); - - if (task->opacity == 0) return true; - - return rasterImage(surface, &task->image, task->mesh, task->transform, task->bbox, task->opacity); -} - - -bool SwRenderer::renderShape(RenderData data) -{ - auto task = static_cast(data); - if (!task) return false; - - task->done(); - - if (task->opacity == 0) return true; - - //Main raster stage - if (task->rshape->stroke && task->rshape->stroke->strokeFirst) { - _renderStroke(task, surface, task->opacity); - _renderFill(task, surface, task->opacity); - } else { - _renderFill(task, surface, task->opacity); - _renderStroke(task, surface, task->opacity); - } - - return true; -} - - -bool SwRenderer::blend(BlendMethod method) -{ - if (surface->blendMethod == method) return true; - surface->blendMethod = method; - - switch (method) { - case BlendMethod::Add: - surface->blender = opBlendAdd; - break; - case BlendMethod::Screen: - surface->blender = opBlendScreen; - break; - case BlendMethod::Multiply: - surface->blender = opBlendMultiply; - break; - case BlendMethod::Overlay: - surface->blender = opBlendOverlay; - break; - case BlendMethod::Difference: - surface->blender = opBlendDifference; - break; - case BlendMethod::Exclusion: - surface->blender = opBlendExclusion; - break; - case BlendMethod::SrcOver: - surface->blender = opBlendSrcOver; - break; - case BlendMethod::Darken: - surface->blender = opBlendDarken; - break; - case BlendMethod::Lighten: - surface->blender = opBlendLighten; - break; - case BlendMethod::ColorDodge: - surface->blender = opBlendColorDodge; - break; - case BlendMethod::ColorBurn: - surface->blender = opBlendColorBurn; - break; - case BlendMethod::HardLight: - surface->blender = opBlendHardLight; - break; - case BlendMethod::SoftLight: - surface->blender = opBlendSoftLight; - break; - default: - surface->blender = nullptr; - break; - } - return false; -} - - -RenderRegion SwRenderer::region(RenderData data) -{ - return static_cast(data)->bounds(); -} - - -bool SwRenderer::beginComposite(Compositor* cmp, CompositeMethod method, uint8_t opacity) -{ - if (!cmp) return false; - auto p = static_cast(cmp); - - p->method = method; - p->opacity = opacity; - - //Current Context? - if (p->method != CompositeMethod::None) { - surface = p->recoverSfc; - surface->compositor = p; - } - - return true; -} - - -bool SwRenderer::mempool(bool shared) -{ - if (shared == sharedMpool) return true; - - if (shared) { - if (!sharedMpool) { - if (!mpoolTerm(mpool)) return false; - mpool = globalMpool; - } - } else { - if (sharedMpool) mpool = mpoolInit(threadsCnt); - } - - sharedMpool = shared; - - if (mpool) return true; - return false; -} - - -const Surface* SwRenderer::mainSurface() -{ - return surface; -} - - -Compositor* SwRenderer::target(const RenderRegion& region, ColorSpace cs) -{ - auto x = region.x; - auto y = region.y; - auto w = region.w; - auto h = region.h; - auto sw = static_cast(surface->w); - auto sh = static_cast(surface->h); - - //Out of boundary - if (x >= sw || y >= sh || x + w < 0 || y + h < 0) return nullptr; - - SwSurface* cmp = nullptr; - - auto reqChannelSize = CHANNEL_SIZE(cs); - - //Use cached data - for (auto p = compositors.begin(); p < compositors.end(); ++p) { - if ((*p)->compositor->valid && (*p)->compositor->image.channelSize == reqChannelSize) { - cmp = *p; - break; - } - } - - //New Composition - if (!cmp) { - //Inherits attributes from main surface - cmp = new SwSurface(surface); - cmp->compositor = new SwCompositor; - - //TODO: We can optimize compositor surface size from (surface->stride x surface->h) to Parameter(w x h) - cmp->compositor->image.data = (pixel_t*)malloc(reqChannelSize * surface->stride * surface->h); - cmp->channelSize = cmp->compositor->image.channelSize = reqChannelSize; - - compositors.push(cmp); - } - - //Boundary Check - if (x + w > sw) w = (sw - x); - if (y + h > sh) h = (sh - y); - - cmp->compositor->recoverSfc = surface; - cmp->compositor->recoverCmp = surface->compositor; - cmp->compositor->valid = false; - cmp->compositor->bbox.min.x = x; - cmp->compositor->bbox.min.y = y; - cmp->compositor->bbox.max.x = x + w; - cmp->compositor->bbox.max.y = y + h; - cmp->compositor->image.stride = surface->stride; - cmp->compositor->image.w = surface->w; - cmp->compositor->image.h = surface->h; - cmp->compositor->image.direct = true; - - cmp->data = cmp->compositor->image.data; - cmp->w = cmp->compositor->image.w; - cmp->h = cmp->compositor->image.h; - - rasterClear(cmp, x, y, w, h); - - //Switch render target - surface = cmp; - - return cmp->compositor; -} - - -bool SwRenderer::endComposite(Compositor* cmp) -{ - if (!cmp) return false; - - auto p = static_cast(cmp); - p->valid = true; - - //Recover Context - surface = p->recoverSfc; - surface->compositor = p->recoverCmp; - - //Default is alpha blending - if (p->method == CompositeMethod::None) { - return rasterImage(surface, &p->image, nullptr, nullptr, p->bbox, p->opacity); - } - - return true; -} - - -ColorSpace SwRenderer::colorSpace() -{ - if (surface) return surface->cs; - else return ColorSpace::Unsupported; -} - - -void SwRenderer::dispose(RenderData data) -{ - auto task = static_cast(data); - if (!task) return; - task->done(); - task->dispose(); - - if (task->pushed) task->disposed = true; - else delete(task); -} - - -void* SwRenderer::prepareCommon(SwTask* task, const RenderTransform* transform, const Array& clips, uint8_t opacity, RenderUpdateFlag flags) -{ - if (!surface) return task; - if (flags == RenderUpdateFlag::None) return task; - - //Finish previous task if it has duplicated request. - task->done(); - - //TODO: Failed threading them. It would be better if it's possible. - //See: https://github.com/thorvg/thorvg/issues/1409 - //Guarantee composition targets get ready. - for (auto clip = clips.begin(); clip < clips.end(); ++clip) { - static_cast(*clip)->done(); - } - - task->clips = clips; - - if (transform) { - if (!task->transform) task->transform = static_cast(malloc(sizeof(Matrix))); - *task->transform = transform->m; - } else { - if (task->transform) free(task->transform); - task->transform = nullptr; - } - - //zero size? - if (task->transform) { - if (task->transform->e11 == 0.0f && task->transform->e12 == 0.0f) return task; //zero width - if (task->transform->e21 == 0.0f && task->transform->e22 == 0.0f) return task; //zero height - } - - task->opacity = opacity; - task->surface = surface; - task->mpool = mpool; - task->flags = flags; - task->bbox.min.x = mathMax(static_cast(0), static_cast(vport.x)); - task->bbox.min.y = mathMax(static_cast(0), static_cast(vport.y)); - task->bbox.max.x = mathMin(static_cast(surface->w), static_cast(vport.x + vport.w)); - task->bbox.max.y = mathMin(static_cast(surface->h), static_cast(vport.y + vport.h)); - - if (!task->pushed) { - task->pushed = true; - tasks.push(task); - } - - TaskScheduler::request(task); - - return task; -} - - -RenderData SwRenderer::prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) -{ - //prepare task - auto task = static_cast(data); - if (!task) task = new SwImageTask; - task->source = surface; - task->mesh = mesh; - return prepareCommon(task, transform, clips, opacity, flags); -} - - -RenderData SwRenderer::prepare(const Array& scene, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) -{ - //prepare task - auto task = static_cast(data); - if (!task) task = new SwSceneTask; - task->scene = scene; - - //TODO: Failed threading them. It would be better if it's possible. - //See: https://github.com/thorvg/thorvg/issues/1409 - //Guarantee composition targets get ready. - for (auto task = scene.begin(); task < scene.end(); ++task) { - static_cast(*task)->done(); - } - return prepareCommon(task, transform, clips, opacity, flags); -} - - -RenderData SwRenderer::prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) -{ - //prepare task - auto task = static_cast(data); - if (!task) { - task = new SwShapeTask; - task->rshape = &rshape; - } - task->clipper = clipper; - - return prepareCommon(task, transform, clips, opacity, flags); -} - - -SwRenderer::SwRenderer():mpool(globalMpool) -{ -} - - -bool SwRenderer::init(uint32_t threads) -{ - if ((initEngineCnt++) > 0) return true; - - threadsCnt = threads; - - //Share the memory pool among the renderer - globalMpool = mpoolInit(threads); - if (!globalMpool) { - --initEngineCnt; - return false; - } - - return true; -} - - -int32_t SwRenderer::init() -{ - return initEngineCnt; -} - - -bool SwRenderer::term() -{ - if ((--initEngineCnt) > 0) return true; - - initEngineCnt = 0; - - _termEngine(); - - return true; -} - -SwRenderer* SwRenderer::gen() -{ - ++rendererCnt; - return new SwRenderer(); -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRenderer.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRenderer.h deleted file mode 100644 index 593ba52..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRenderer.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_SW_RENDERER_H_ -#define _TVG_SW_RENDERER_H_ - -#include "tvgRender.h" - -struct SwSurface; -struct SwTask; -struct SwCompositor; -struct SwMpool; - -namespace tvg -{ - -class SwRenderer : public RenderMethod -{ -public: - RenderData prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) override; - RenderData prepare(const Array& scene, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) override; - RenderData prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) override; - bool preRender() override; - bool renderShape(RenderData data) override; - bool renderImage(RenderData data) override; - bool postRender() override; - void dispose(RenderData data) override; - RenderRegion region(RenderData data) override; - RenderRegion viewport() override; - bool viewport(const RenderRegion& vp) override; - bool blend(BlendMethod method) override; - ColorSpace colorSpace() override; - const Surface* mainSurface() override; - - bool clear() override; - bool sync() override; - bool target(pixel_t* data, uint32_t stride, uint32_t w, uint32_t h, ColorSpace cs); - bool mempool(bool shared); - - Compositor* target(const RenderRegion& region, ColorSpace cs) override; - bool beginComposite(Compositor* cmp, CompositeMethod method, uint8_t opacity) override; - bool endComposite(Compositor* cmp) override; - void clearCompositors(); - - static SwRenderer* gen(); - static bool init(uint32_t threads); - static int32_t init(); - static bool term(); - -private: - SwSurface* surface = nullptr; //active surface - Array tasks; //async task list - Array compositors; //render targets cache list - SwMpool* mpool; //private memory pool - RenderRegion vport; //viewport - bool sharedMpool = true; //memory-pool behavior policy - - SwRenderer(); - ~SwRenderer(); - - RenderData prepareCommon(SwTask* task, const RenderTransform* transform, const Array& clips, uint8_t opacity, RenderUpdateFlag flags); -}; - -} - -#endif /* _TVG_SW_RENDERER_H_ */ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRle.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRle.cpp deleted file mode 100644 index 689f2fe..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwRle.cpp +++ /dev/null @@ -1,1134 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -/* - * The FreeType Project LICENSE - * ---------------------------- - - * 2006-Jan-27 - - * Copyright 1996-2002, 2006 by - * David Turner, Robert Wilhelm, and Werner Lemberg - - - - * Introduction - * ============ - - * The FreeType Project is distributed in several archive packages; - * some of them may contain, in addition to the FreeType font engine, - * various tools and contributions which rely on, or relate to, the - * FreeType Project. - - * This license applies to all files found in such packages, and - * which do not fall under their own explicit license. The license - * affects thus the FreeType font engine, the test programs, - * documentation and makefiles, at the very least. - - * This license was inspired by the BSD, Artistic, and IJG - * (Independent JPEG Group) licenses, which all encourage inclusion - * and use of free software in commercial and freeware products - * alike. As a consequence, its main points are that: - - * o We don't promise that this software works. However, we will be - * interested in any kind of bug reports. (`as is' distribution) - - * o You can use this software for whatever you want, in parts or - * full form, without having to pay us. (`royalty-free' usage) - - * o You may not pretend that you wrote this software. If you use - * it, or only parts of it, in a program, you must acknowledge - * somewhere in your documentation that you have used the - * FreeType code. (`credits') - - * We specifically permit and encourage the inclusion of this - * software, with or without modifications, in commercial products. - * We disclaim all warranties covering The FreeType Project and - * assume no liability related to The FreeType Project. - - - * Finally, many people asked us for a preferred form for a - * credit/disclaimer to use in compliance with this license. We thus - * encourage you to use the following text: - - * """ - * Portions of this software are copyright � The FreeType - * Project (www.freetype.org). All rights reserved. - * """ - - * Please replace with the value from the FreeType version you - * actually use. - -* Legal Terms -* =========== - -* 0. Definitions -* -------------- - -* Throughout this license, the terms `package', `FreeType Project', -* and `FreeType archive' refer to the set of files originally -* distributed by the authors (David Turner, Robert Wilhelm, and -* Werner Lemberg) as the `FreeType Project', be they named as alpha, -* beta or final release. - -* `You' refers to the licensee, or person using the project, where -* `using' is a generic term including compiling the project's source -* code as well as linking it to form a `program' or `executable'. -* This program is referred to as `a program using the FreeType -* engine'. - -* This license applies to all files distributed in the original -* FreeType Project, including all source code, binaries and -* documentation, unless otherwise stated in the file in its -* original, unmodified form as distributed in the original archive. -* If you are unsure whether or not a particular file is covered by -* this license, you must contact us to verify this. - -* The FreeType Project is copyright (C) 1996-2000 by David Turner, -* Robert Wilhelm, and Werner Lemberg. All rights reserved except as -* specified below. - -* 1. No Warranty -* -------------- - -* THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY -* KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -* PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO -* USE, OF THE FREETYPE PROJECT. - -* 2. Redistribution -* ----------------- - -* This license grants a worldwide, royalty-free, perpetual and -* irrevocable right and license to use, execute, perform, compile, -* display, copy, create derivative works of, distribute and -* sublicense the FreeType Project (in both source and object code -* forms) and derivative works thereof for any purpose; and to -* authorize others to exercise some or all of the rights granted -* herein, subject to the following conditions: - -* o Redistribution of source code must retain this license file -* (`FTL.TXT') unaltered; any additions, deletions or changes to -* the original files must be clearly indicated in accompanying -* documentation. The copyright notices of the unaltered, -* original files must be preserved in all copies of source -* files. - -* o Redistribution in binary form must provide a disclaimer that -* states that the software is based in part of the work of the -* FreeType Team, in the distribution documentation. We also -* encourage you to put an URL to the FreeType web page in your -* documentation, though this isn't mandatory. - -* These conditions apply to any software derived from or based on -* the FreeType Project, not just the unmodified files. If you use -* our work, you must acknowledge us. However, no fee need be paid -* to us. - -* 3. Advertising -* -------------- - -* Neither the FreeType authors and contributors nor you shall use -* the name of the other for commercial, advertising, or promotional -* purposes without specific prior written permission. - -* We suggest, but do not require, that you use one or more of the -* following phrases to refer to this software in your documentation -* or advertising materials: `FreeType Project', `FreeType Engine', -* `FreeType library', or `FreeType Distribution'. - -* As you have not signed this license, you are not required to -* accept it. However, as the FreeType Project is copyrighted -* material, only this license, or another one contracted with the -* authors, grants you the right to use, distribute, and modify it. -* Therefore, by using, distributing, or modifying the FreeType -* Project, you indicate that you understand and accept all the terms -* of this license. - -* 4. Contacts -* ----------- - -* There are two mailing lists related to FreeType: - -* o freetype@nongnu.org - -* Discusses general use and applications of FreeType, as well as -* future and wanted additions to the library and distribution. -* If you are looking for support, start in this list if you -* haven't found anything to help you in the documentation. - -* o freetype-devel@nongnu.org - -* Discusses bugs, as well as engine internals, design issues, -* specific licenses, porting, etc. - -* Our home page can be found at - -* http://www.freetype.org -*/ - -#include -#include -#include -#include "tvgSwCommon.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -constexpr auto MAX_SPANS = 256; -constexpr auto PIXEL_BITS = 8; //must be at least 6 bits! -constexpr auto ONE_PIXEL = (1L << PIXEL_BITS); - -using Area = long; - -struct Band -{ - SwCoord min, max; -}; - -struct Cell -{ - SwCoord x; - SwCoord cover; - Area area; - Cell *next; -}; - -struct RleWorker -{ - SwRleData* rle; - - SwPoint cellPos; - SwPoint cellMin; - SwPoint cellMax; - SwCoord cellXCnt; - SwCoord cellYCnt; - - Area area; - SwCoord cover; - - Cell* cells; - ptrdiff_t maxCells; - ptrdiff_t cellsCnt; - - SwPoint pos; - - SwPoint bezStack[32 * 3 + 1]; - int levStack[32]; - - SwOutline* outline; - - SwSpan spans[MAX_SPANS]; - int spansCnt; - int ySpan; - - int bandSize; - int bandShoot; - - jmp_buf jmpBuf; - - void* buffer; - long bufferSize; - - Cell** yCells; - SwCoord yCnt; - - bool invalid; - bool antiAlias; -}; - - -static inline SwPoint UPSCALE(const SwPoint& pt) -{ - return {SwCoord(((unsigned long) pt.x) << (PIXEL_BITS - 6)), SwCoord(((unsigned long) pt.y) << (PIXEL_BITS - 6))}; -} - - -static inline SwPoint TRUNC(const SwPoint& pt) -{ - return {pt.x >> PIXEL_BITS, pt.y >> PIXEL_BITS}; -} - - -static inline SwCoord TRUNC(const SwCoord x) -{ - return x >> PIXEL_BITS; -} - - -static inline SwPoint SUBPIXELS(const SwPoint& pt) -{ - return {SwCoord(((unsigned long) pt.x) << PIXEL_BITS), SwCoord(((unsigned long) pt.y) << PIXEL_BITS)}; -} - - -static inline SwCoord SUBPIXELS(const SwCoord x) -{ - return SwCoord(((unsigned long) x) << PIXEL_BITS); -} - -/* - * Approximate sqrt(x*x+y*y) using the `alpha max plus beta min' - * algorithm. We use alpha = 1, beta = 3/8, giving us results with a - * largest error less than 7% compared to the exact value. - */ -static inline SwCoord HYPOT(SwPoint pt) -{ - if (pt.x < 0) pt.x = -pt.x; - if (pt.y < 0) pt.y = -pt.y; - return ((pt.x > pt.y) ? (pt.x + (3 * pt.y >> 3)) : (pt.y + (3 * pt.x >> 3))); -} - -static void _genSpan(SwRleData* rle, const SwSpan* spans, uint32_t count) -{ - auto newSize = rle->size + count; - - /* allocate enough memory for new spans */ - /* alloc is required to prevent free and reallocation */ - /* when the rle needs to be regenerated because of attribute change. */ - if (rle->alloc < newSize) { - rle->alloc = (newSize * 2); - //OPTIMIZE: use mempool! - rle->spans = static_cast(realloc(rle->spans, rle->alloc * sizeof(SwSpan))); - } - - //copy the new spans to the allocated memory - SwSpan* lastSpan = rle->spans + rle->size; - memcpy(lastSpan, spans, count * sizeof(SwSpan)); - - rle->size = newSize; -} - - -static void _horizLine(RleWorker& rw, SwCoord x, SwCoord y, SwCoord area, SwCoord aCount) -{ - x += rw.cellMin.x; - y += rw.cellMin.y; - - //Clip Y range - if (y < rw.cellMin.y || y >= rw.cellMax.y) return; - - /* compute the coverage line's coverage, depending on the outline fill rule */ - /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */ - auto coverage = static_cast(area >> (PIXEL_BITS * 2 + 1 - 8)); //range 0 - 255 - - if (coverage < 0) coverage = -coverage; - - if (rw.outline->fillRule == FillRule::EvenOdd) { - coverage &= 511; - if (coverage > 255) coverage = 511 - coverage; - } else { - //normal non-zero winding rule - if (coverage > 255) coverage = 255; - } - - //span has ushort coordinates. check limit overflow - if (x >= SHRT_MAX) { - TVGERR("SW_ENGINE", "X-coordinate overflow!"); - x = SHRT_MAX; - } - if (y >= SHRT_MAX) { - TVGERR("SW_ENGINE", "Y Coordinate overflow!"); - y = SHRT_MAX; - } - - if (coverage > 0) { - if (!rw.antiAlias) coverage = 255; - auto count = rw.spansCnt; - auto span = rw.spans + count - 1; - - //see whether we can add this span to the current list - if ((count > 0) && (rw.ySpan == y) && - (span->x + span->len == x) && (span->coverage == coverage)) { - - //Clip x range - SwCoord xOver = 0; - if (x + aCount >= rw.cellMax.x) xOver -= (x + aCount - rw.cellMax.x); - if (x < rw.cellMin.x) xOver -= (rw.cellMin.x - x); - - //span->len += (aCount + xOver) - 1; - span->len += (aCount + xOver); - return; - } - - if (count >= MAX_SPANS) { - _genSpan(rw.rle, rw.spans, count); - rw.spansCnt = 0; - rw.ySpan = 0; - span = rw.spans; - } else { - ++span; - } - - //Clip x range - SwCoord xOver = 0; - if (x + aCount >= rw.cellMax.x) xOver -= (x + aCount - rw.cellMax.x); - if (x < rw.cellMin.x) { - xOver -= (rw.cellMin.x - x); - x = rw.cellMin.x; - } - - //Nothing to draw - if (aCount + xOver <= 0) return; - - //add a span to the current list - span->x = x; - span->y = y; - span->len = (aCount + xOver); - span->coverage = coverage; - ++rw.spansCnt; - rw.ySpan = y; - } -} - - -static void _sweep(RleWorker& rw) -{ - if (rw.cellsCnt == 0) return; - - rw.spansCnt = 0; - rw.ySpan = 0; - - for (int y = 0; y < rw.yCnt; ++y) { - auto cover = 0; - auto x = 0; - auto cell = rw.yCells[y]; - - while (cell) { - if (cell->x > x && cover != 0) _horizLine(rw, x, y, cover * (ONE_PIXEL * 2), cell->x - x); - cover += cell->cover; - auto area = cover * (ONE_PIXEL * 2) - cell->area; - if (area != 0 && cell->x >= 0) _horizLine(rw, cell->x, y, area, 1); - x = cell->x + 1; - cell = cell->next; - } - - if (cover != 0) _horizLine(rw, x, y, cover * (ONE_PIXEL * 2), rw.cellXCnt - x); - } - - if (rw.spansCnt > 0) _genSpan(rw.rle, rw.spans, rw.spansCnt); -} - - -static Cell* _findCell(RleWorker& rw) -{ - auto x = rw.cellPos.x; - if (x > rw.cellXCnt) x = rw.cellXCnt; - - auto pcell = &rw.yCells[rw.cellPos.y]; - - while(true) { - Cell* cell = *pcell; - if (!cell || cell->x > x) break; - if (cell->x == x) return cell; - pcell = &cell->next; - } - - if (rw.cellsCnt >= rw.maxCells) longjmp(rw.jmpBuf, 1); - - auto cell = rw.cells + rw.cellsCnt++; - cell->x = x; - cell->area = 0; - cell->cover = 0; - cell->next = *pcell; - *pcell = cell; - - return cell; -} - - -static void _recordCell(RleWorker& rw) -{ - if (rw.area | rw.cover) { - auto cell = _findCell(rw); - cell->area += rw.area; - cell->cover += rw.cover; - } -} - - -static void _setCell(RleWorker& rw, SwPoint pos) -{ - /* Move the cell pointer to a new position. We set the `invalid' */ - /* flag to indicate that the cell isn't part of those we're interested */ - /* in during the render phase. This means that: */ - /* */ - /* . the new vertical position must be within min_ey..max_ey-1. */ - /* . the new horizontal position must be strictly less than max_ex */ - /* */ - /* Note that if a cell is to the left of the clipping region, it is */ - /* actually set to the (min_ex-1) horizontal position. */ - - /* All cells that are on the left of the clipping region go to the - min_ex - 1 horizontal position. */ - pos.x -= rw.cellMin.x; - pos.y -= rw.cellMin.y; - - if (pos.x > rw.cellMax.x) pos.x = rw.cellMax.x; - - //Are we moving to a different cell? - if (pos != rw.cellPos) { - //Record the current one if it is valid - if (!rw.invalid) _recordCell(rw); - } - - rw.area = 0; - rw.cover = 0; - rw.cellPos = pos; - rw.invalid = ((unsigned)pos.y >= (unsigned)rw.cellYCnt || pos.x >= rw.cellXCnt); -} - - -static void _startCell(RleWorker& rw, SwPoint pos) -{ - if (pos.x > rw.cellMax.x) pos.x = rw.cellMax.x; - if (pos.x < rw.cellMin.x) pos.x = rw.cellMin.x; - - rw.area = 0; - rw.cover = 0; - rw.cellPos = pos - rw.cellMin; - rw.invalid = false; - - _setCell(rw, pos); -} - - -static void _moveTo(RleWorker& rw, const SwPoint& to) -{ - //record current cell, if any */ - if (!rw.invalid) _recordCell(rw); - - //start to a new position - _startCell(rw, TRUNC(to)); - - rw.pos = to; -} - - -static void _lineTo(RleWorker& rw, const SwPoint& to) -{ -#define SW_UDIV(a, b) \ - static_cast(((unsigned long)(a) * (unsigned long)(b)) >> \ - (sizeof(long) * CHAR_BIT - PIXEL_BITS)) - - auto e1 = TRUNC(rw.pos); - auto e2 = TRUNC(to); - - //vertical clipping - if ((e1.y >= rw.cellMax.y && e2.y >= rw.cellMax.y) || (e1.y < rw.cellMin.y && e2.y < rw.cellMin.y)) { - rw.pos = to; - return; - } - - auto diff = to - rw.pos; - auto f1 = rw.pos - SUBPIXELS(e1); - SwPoint f2; - - //inside one cell - if (e1 == e2) { - ; - //any horizontal line - } else if (diff.y == 0) { - e1.x = e2.x; - _setCell(rw, e1); - } else if (diff.x == 0) { - //vertical line up - if (diff.y > 0) { - do { - f2.y = ONE_PIXEL; - rw.cover += (f2.y - f1.y); - rw.area += (f2.y - f1.y) * f1.x * 2; - f1.y = 0; - ++e1.y; - _setCell(rw, e1); - } while(e1.y != e2.y); - //vertical line down - } else { - do { - f2.y = 0; - rw.cover += (f2.y - f1.y); - rw.area += (f2.y - f1.y) * f1.x * 2; - f1.y = ONE_PIXEL; - --e1.y; - _setCell(rw, e1); - } while(e1.y != e2.y); - } - //any other line - } else { - Area prod = diff.x * f1.y - diff.y * f1.x; - - /* These macros speed up repetitive divisions by replacing them - with multiplications and right shifts. */ - auto dx_r = static_cast(ULONG_MAX >> PIXEL_BITS) / (diff.x); - auto dy_r = static_cast(ULONG_MAX >> PIXEL_BITS) / (diff.y); - - /* The fundamental value `prod' determines which side and the */ - /* exact coordinate where the line exits current cell. It is */ - /* also easily updated when moving from one cell to the next. */ - do { - auto px = diff.x * ONE_PIXEL; - auto py = diff.y * ONE_PIXEL; - - //left - if (prod <= 0 && prod - px > 0) { - f2 = {0, SW_UDIV(-prod, -dx_r)}; - prod -= py; - rw.cover += (f2.y - f1.y); - rw.area += (f2.y - f1.y) * (f1.x + f2.x); - f1 = {ONE_PIXEL, f2.y}; - --e1.x; - //up - } else if (prod - px <= 0 && prod - px + py > 0) { - prod -= px; - f2 = {SW_UDIV(-prod, dy_r), ONE_PIXEL}; - rw.cover += (f2.y - f1.y); - rw.area += (f2.y - f1.y) * (f1.x + f2.x); - f1 = {f2.x, 0}; - ++e1.y; - //right - } else if (prod - px + py <= 0 && prod + py >= 0) { - prod += py; - f2 = {ONE_PIXEL, SW_UDIV(prod, dx_r)}; - rw.cover += (f2.y - f1.y); - rw.area += (f2.y - f1.y) * (f1.x + f2.x); - f1 = {0, f2.y}; - ++e1.x; - //down - } else { - f2 = {SW_UDIV(prod, -dy_r), 0}; - prod += px; - rw.cover += (f2.y - f1.y); - rw.area += (f2.y - f1.y) * (f1.x + f2.x); - f1 = {f2.x, ONE_PIXEL}; - --e1.y; - } - - _setCell(rw, e1); - - } while(e1 != e2); - } - - f2 = {to.x - SUBPIXELS(e2.x), to.y - SUBPIXELS(e2.y)}; - rw.cover += (f2.y - f1.y); - rw.area += (f2.y - f1.y) * (f1.x + f2.x); - rw.pos = to; -} - - -static void _cubicTo(RleWorker& rw, const SwPoint& ctrl1, const SwPoint& ctrl2, const SwPoint& to) -{ - auto arc = rw.bezStack; - arc[0] = to; - arc[1] = ctrl2; - arc[2] = ctrl1; - arc[3] = rw.pos; - - //Short-cut the arc that crosses the current band - auto min = arc[0].y; - auto max = arc[0].y; - - SwCoord y; - for (auto i = 1; i < 4; ++i) { - y = arc[i].y; - if (y < min) min = y; - if (y > max) max = y; - } - - if (TRUNC(min) >= rw.cellMax.y || TRUNC(max) < rw.cellMin.y) goto draw; - - /* Decide whether to split or draw. See `Rapid Termination */ - /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */ - /* F. Hain, at */ - /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */ - while (true) { - { - //diff is the P0 - P3 chord vector - auto diff = arc[3] - arc[0]; - auto L = HYPOT(diff); - - //avoid possible arithmetic overflow below by splitting - if (L > SHRT_MAX) goto split; - - //max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1) - auto sLimit = L * (ONE_PIXEL / 6); - - auto diff1 = arc[1] - arc[0]; - auto s = diff.y * diff1.x - diff.x * diff1.y; - if (s < 0) s = -s; - if (s > sLimit) goto split; - - //s is L * the perpendicular distance from P2 to the line P0 - P3 - auto diff2 = arc[2] - arc[0]; - s = diff.y * diff2.x - diff.x * diff2.y; - if (s < 0) s = -s; - if (s > sLimit) goto split; - - /* Split super curvy segments where the off points are so far - from the chord that the angles P0-P1-P3 or P0-P2-P3 become - acute as detected by appropriate dot products */ - if (diff1.x * (diff1.x - diff.x) + diff1.y * (diff1.y - diff.y) > 0 || - diff2.x * (diff2.x - diff.x) + diff2.y * (diff2.y - diff.y) > 0) - goto split; - - //no reason to split - goto draw; - } - split: - mathSplitCubic(arc); - arc += 3; - continue; - - draw: - _lineTo(rw, arc[0]); - if (arc == rw.bezStack) return; - arc -= 3; - } -} - - -static void _decomposeOutline(RleWorker& rw) -{ - auto outline = rw.outline; - auto first = 0; //index of first point in contour - - for (auto cntr = outline->cntrs.begin(); cntr < outline->cntrs.end(); ++cntr) { - auto last = *cntr; - auto limit = outline->pts.data + last; - auto start = UPSCALE(outline->pts[first]); - auto pt = outline->pts.data + first; - auto types = outline->types.data + first; - - _moveTo(rw, UPSCALE(outline->pts[first])); - - while (pt < limit) { - ++pt; - ++types; - - //emit a single line_to - if (types[0] == SW_CURVE_TYPE_POINT) { - _lineTo(rw, UPSCALE(*pt)); - //types cubic - } else { - pt += 2; - types += 2; - - if (pt <= limit) { - _cubicTo(rw, UPSCALE(pt[-2]), UPSCALE(pt[-1]), UPSCALE(pt[0])); - continue; - } - _cubicTo(rw, UPSCALE(pt[-2]), UPSCALE(pt[-1]), start); - goto close; - } - } - _lineTo(rw, start); - close: - first = last + 1; - } -} - - -static int _genRle(RleWorker& rw) -{ - if (setjmp(rw.jmpBuf) == 0) { - _decomposeOutline(rw); - if (!rw.invalid) _recordCell(rw); - return 0; - } - return -1; //lack of cell memory -} - - -static SwSpan* _intersectSpansRegion(const SwRleData *clip, const SwRleData *target, SwSpan *outSpans, uint32_t outSpansCnt) -{ - auto out = outSpans; - auto spans = target->spans; - auto end = target->spans + target->size; - auto clipSpans = clip->spans; - auto clipEnd = clip->spans + clip->size; - - while (spans < end && clipSpans < clipEnd) { - //align y coordinates. - if (clipSpans->y > spans->y) { - ++spans; - continue; - } - if (spans->y > clipSpans->y) { - ++clipSpans; - continue; - } - - //Try clipping with all clip spans which have a same y coordinate. - auto temp = clipSpans; - while(temp < clipEnd && outSpansCnt > 0 && temp->y == clipSpans->y) { - auto sx1 = spans->x; - auto sx2 = sx1 + spans->len; - auto cx1 = temp->x; - auto cx2 = cx1 + temp->len; - - //The span must be left(x1) to right(x2) direction. Not intersected. - if (cx2 < sx1 || sx2 < cx1) { - ++temp; - continue; - } - - //clip span region. - auto x = sx1 > cx1 ? sx1 : cx1; - auto len = (sx2 < cx2 ? sx2 : cx2) - x; - if (len > 0) { - out->x = x; - out->y = temp->y; - out->len = len; - out->coverage = (uint8_t)(((spans->coverage * temp->coverage) + 0xff) >> 8); - ++out; - --outSpansCnt; - } - ++temp; - } - ++spans; - } - return out; -} - - -static SwSpan* _intersectSpansRect(const SwBBox *bbox, const SwRleData *targetRle, SwSpan *outSpans, uint32_t outSpansCnt) -{ - auto out = outSpans; - auto spans = targetRle->spans; - auto end = targetRle->spans + targetRle->size; - auto minx = static_cast(bbox->min.x); - auto miny = static_cast(bbox->min.y); - auto maxx = minx + static_cast(bbox->max.x - bbox->min.x) - 1; - auto maxy = miny + static_cast(bbox->max.y - bbox->min.y) - 1; - - while (outSpansCnt > 0 && spans < end) { - if (spans->y > maxy) { - spans = end; - break; - } - if (spans->y < miny || spans->x > maxx || spans->x + spans->len <= minx) { - ++spans; - continue; - } - if (spans->x < minx) { - out->len = (spans->len - (minx - spans->x)) < (maxx - minx + 1) ? (spans->len - (minx - spans->x)) : (maxx - minx + 1); - out->x = minx; - } - else { - out->x = spans->x; - out->len = spans->len < (maxx - spans->x + 1) ? spans->len : (maxx - spans->x + 1); - } - if (out->len > 0) { - out->y = spans->y; - out->coverage = spans->coverage; - ++out; - --outSpansCnt; - } - ++spans; - } - return out; -} - - -static SwSpan* _mergeSpansRegion(const SwRleData *clip1, const SwRleData *clip2, SwSpan *outSpans) -{ - auto out = outSpans; - auto spans1 = clip1->spans; - auto end1 = clip1->spans + clip1->size; - auto spans2 = clip2->spans; - auto end2 = clip2->spans + clip2->size; - - //list two spans up in y order - //TODO: Remove duplicated regions? - while (spans1 < end1 && spans2 < end2) { - while (spans1 < end1 && spans1->y <= spans2->y) { - *out = *spans1; - ++spans1; - ++out; - } - if (spans1 >= end1) break; - while (spans2 < end2 && spans2->y <= spans1->y) { - *out = *spans2; - ++spans2; - ++out; - } - } - - //Leftovers - while (spans1 < end1) { - *out = *spans1; - ++spans1; - ++out; - } - while (spans2 < end2) { - *out = *spans2; - ++spans2; - ++out; - } - - return out; -} - - -void _replaceClipSpan(SwRleData *rle, SwSpan* clippedSpans, uint32_t size) -{ - free(rle->spans); - rle->spans = clippedSpans; - rle->size = rle->alloc = size; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -SwRleData* rleRender(SwRleData* rle, const SwOutline* outline, const SwBBox& renderRegion, bool antiAlias) -{ - constexpr auto RENDER_POOL_SIZE = 16384L; - constexpr auto BAND_SIZE = 40; - - //TODO: We can preserve several static workers in advance - RleWorker rw; - Cell buffer[RENDER_POOL_SIZE / sizeof(Cell)]; - - //Init Cells - rw.buffer = buffer; - rw.bufferSize = sizeof(buffer); - rw.yCells = reinterpret_cast(buffer); - rw.cells = nullptr; - rw.maxCells = 0; - rw.cellsCnt = 0; - rw.area = 0; - rw.cover = 0; - rw.invalid = true; - rw.cellMin = renderRegion.min; - rw.cellMax = renderRegion.max; - rw.cellXCnt = rw.cellMax.x - rw.cellMin.x; - rw.cellYCnt = rw.cellMax.y - rw.cellMin.y; - rw.ySpan = 0; - rw.outline = const_cast(outline); - rw.bandSize = rw.bufferSize / (sizeof(Cell) * 8); //bandSize: 64 - rw.bandShoot = 0; - rw.antiAlias = antiAlias; - - if (!rle) rw.rle = reinterpret_cast(calloc(1, sizeof(SwRleData))); - else rw.rle = rle; - - //Generate RLE - Band bands[BAND_SIZE]; - Band* band; - - /* set up vertical bands */ - auto bandCnt = static_cast((rw.cellMax.y - rw.cellMin.y) / rw.bandSize); - if (bandCnt == 0) bandCnt = 1; - else if (bandCnt >= BAND_SIZE) bandCnt = (BAND_SIZE - 1); - - auto min = rw.cellMin.y; - auto yMax = rw.cellMax.y; - SwCoord max; - int ret; - - for (int n = 0; n < bandCnt; ++n, min = max) { - max = min + rw.bandSize; - if (n == bandCnt -1 || max > yMax) max = yMax; - - bands[0].min = min; - bands[0].max = max; - band = bands; - - while (band >= bands) { - rw.yCells = static_cast(rw.buffer); - rw.yCnt = band->max - band->min; - - int cellStart = sizeof(Cell*) * (int)rw.yCnt; - int cellMod = cellStart % sizeof(Cell); - - if (cellMod > 0) cellStart += sizeof(Cell) - cellMod; - - auto cellEnd = rw.bufferSize; - cellEnd -= cellEnd % sizeof(Cell); - - auto cellsMax = reinterpret_cast((char*)rw.buffer + cellEnd); - rw.cells = reinterpret_cast((char*)rw.buffer + cellStart); - - if (rw.cells >= cellsMax) goto reduce_bands; - - rw.maxCells = cellsMax - rw.cells; - if (rw.maxCells < 2) goto reduce_bands; - - for (int y = 0; y < rw.yCnt; ++y) - rw.yCells[y] = nullptr; - - rw.cellsCnt = 0; - rw.invalid = true; - rw.cellMin.y = band->min; - rw.cellMax.y = band->max; - rw.cellYCnt = band->max - band->min; - - ret = _genRle(rw); - if (ret == 0) { - _sweep(rw); - --band; - continue; - } else if (ret == 1) { - goto error; - } - - reduce_bands: - /* render pool overflow: we will reduce the render band by half */ - auto bottom = band->min; - auto top = band->max; - auto middle = bottom + ((top - bottom) >> 1); - - /* This is too complex for a single scanline; there must - be some problems */ - if (middle == bottom) goto error; - - if (bottom - top >= rw.bandSize) ++rw.bandShoot; - - band[1].min = bottom; - band[1].max = middle; - band[0].min = middle; - band[0].max = top; - ++band; - } - } - - if (rw.bandShoot > 8 && rw.bandSize > 16) - rw.bandSize = (rw.bandSize >> 1); - - return rw.rle; - -error: - free(rw.rle); - rw.rle = nullptr; - return nullptr; -} - - -SwRleData* rleRender(const SwBBox* bbox) -{ - auto width = static_cast(bbox->max.x - bbox->min.x); - auto height = static_cast(bbox->max.y - bbox->min.y); - - auto rle = static_cast(malloc(sizeof(SwRleData))); - rle->spans = static_cast(malloc(sizeof(SwSpan) * height)); - rle->size = height; - rle->alloc = height; - - auto span = rle->spans; - for (uint16_t i = 0; i < height; ++i, ++span) { - span->x = bbox->min.x; - span->y = bbox->min.y + i; - span->len = width; - span->coverage = 255; - } - - return rle; -} - - -void rleReset(SwRleData* rle) -{ - if (!rle) return; - rle->size = 0; -} - - -void rleFree(SwRleData* rle) -{ - if (!rle) return; - if (rle->spans) free(rle->spans); - free(rle); -} - - -void rleMerge(SwRleData* rle, SwRleData* clip1, SwRleData* clip2) -{ - if (!rle || (!clip1 && !clip2)) return; - if (clip1 && clip1->size == 0 && clip2 && clip2->size == 0) return; - - TVGLOG("SW_ENGINE", "Unifying Rle!"); - - //clip1 is empty, just copy clip2 - if (!clip1 || clip1->size == 0) { - if (clip2) { - auto spans = static_cast(malloc(sizeof(SwSpan) * (clip2->size))); - memcpy(spans, clip2->spans, clip2->size); - _replaceClipSpan(rle, spans, clip2->size); - } else { - _replaceClipSpan(rle, nullptr, 0); - } - return; - } - - //clip2 is empty, just copy clip1 - if (!clip2 || clip2->size == 0) { - if (clip1) { - auto spans = static_cast(malloc(sizeof(SwSpan) * (clip1->size))); - memcpy(spans, clip1->spans, clip1->size); - _replaceClipSpan(rle, spans, clip1->size); - } else { - _replaceClipSpan(rle, nullptr, 0); - } - return; - } - - auto spanCnt = clip1->size + clip2->size; - auto spans = static_cast(malloc(sizeof(SwSpan) * spanCnt)); - auto spansEnd = _mergeSpansRegion(clip1, clip2, spans); - - _replaceClipSpan(rle, spans, spansEnd - spans); -} - - -void rleClipPath(SwRleData *rle, const SwRleData *clip) -{ - if (rle->size == 0 || clip->size == 0) return; - auto spanCnt = rle->size > clip->size ? rle->size : clip->size; - auto spans = static_cast(malloc(sizeof(SwSpan) * (spanCnt))); - auto spansEnd = _intersectSpansRegion(clip, rle, spans, spanCnt); - - _replaceClipSpan(rle, spans, spansEnd - spans); - - TVGLOG("SW_ENGINE", "Using ClipPath!"); -} - - -void rleClipRect(SwRleData *rle, const SwBBox* clip) -{ - if (rle->size == 0) return; - auto spans = static_cast(malloc(sizeof(SwSpan) * (rle->size))); - auto spansEnd = _intersectSpansRect(clip, rle, spans, rle->size); - - _replaceClipSpan(rle, spans, spansEnd - spans); - - TVGLOG("SW_ENGINE", "Using ClipRect!"); -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwShape.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwShape.cpp deleted file mode 100644 index e2652c1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwShape.cpp +++ /dev/null @@ -1,675 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgSwCommon.h" -#include "tvgMath.h" -#include "tvgLines.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static bool _outlineBegin(SwOutline& outline) -{ - //Make a contour if lineTo/curveTo without calling close or moveTo beforehand. - if (outline.pts.empty()) return false; - outline.cntrs.push(outline.pts.count - 1); - outline.closed.push(false); - outline.pts.push(outline.pts[outline.cntrs.last()]); - outline.types.push(SW_CURVE_TYPE_POINT); - return false; -} - - -static bool _outlineEnd(SwOutline& outline) -{ - if (outline.pts.empty()) return false; - outline.cntrs.push(outline.pts.count - 1); - outline.closed.push(false); - return false; -} - - -static bool _outlineMoveTo(SwOutline& outline, const Point* to, const Matrix* transform, bool closed = false) -{ - //make it a contour, if the last contour is not closed yet. - if (!closed) _outlineEnd(outline); - - outline.pts.push(mathTransform(to, transform)); - outline.types.push(SW_CURVE_TYPE_POINT); - return false; -} - - -static void _outlineLineTo(SwOutline& outline, const Point* to, const Matrix* transform) -{ - outline.pts.push(mathTransform(to, transform)); - outline.types.push(SW_CURVE_TYPE_POINT); -} - - -static void _outlineCubicTo(SwOutline& outline, const Point* ctrl1, const Point* ctrl2, const Point* to, const Matrix* transform) -{ - outline.pts.push(mathTransform(ctrl1, transform)); - outline.types.push(SW_CURVE_TYPE_CUBIC); - - outline.pts.push(mathTransform(ctrl2, transform)); - outline.types.push(SW_CURVE_TYPE_CUBIC); - - outline.pts.push(mathTransform(to, transform)); - outline.types.push(SW_CURVE_TYPE_POINT); -} - - -static bool _outlineClose(SwOutline& outline) -{ - uint32_t i; - if (outline.cntrs.count > 0) i = outline.cntrs.last() + 1; - else i = 0; - - //Make sure there is at least one point in the current path - if (outline.pts.count == i) return false; - - //Close the path - outline.pts.push(outline.pts[i]); - outline.cntrs.push(outline.pts.count - 1); - outline.types.push(SW_CURVE_TYPE_POINT); - outline.closed.push(true); - - return true; -} - - -static void _dashLineTo(SwDashStroke& dash, const Point* to, const Matrix* transform) -{ - Line cur = {dash.ptCur, *to}; - auto len = lineLength(cur.pt1, cur.pt2); - - if (mathZero(len)) { - _outlineMoveTo(*dash.outline, &dash.ptCur, transform); - //draw the current line fully - } else if (len < dash.curLen) { - dash.curLen -= len; - if (!dash.curOpGap) { - if (dash.move) { - _outlineMoveTo(*dash.outline, &dash.ptCur, transform); - dash.move = false; - } - _outlineLineTo(*dash.outline, to, transform); - } - //draw the current line partially - } else { - while (len - dash.curLen > 0.0001f) { - Line left, right; - if (dash.curLen > 0) { - len -= dash.curLen; - lineSplitAt(cur, dash.curLen, left, right); - if (!dash.curOpGap) { - if (dash.move || dash.pattern[dash.curIdx] - dash.curLen < FLOAT_EPSILON) { - _outlineMoveTo(*dash.outline, &left.pt1, transform); - dash.move = false; - } - _outlineLineTo(*dash.outline, &left.pt2, transform); - } - } else { - right = cur; - } - dash.curIdx = (dash.curIdx + 1) % dash.cnt; - dash.curLen = dash.pattern[dash.curIdx]; - dash.curOpGap = !dash.curOpGap; - cur = right; - dash.ptCur = cur.pt1; - dash.move = true; - } - //leftovers - dash.curLen -= len; - if (!dash.curOpGap) { - if (dash.move) { - _outlineMoveTo(*dash.outline, &cur.pt1, transform); - dash.move = false; - } - _outlineLineTo(*dash.outline, &cur.pt2, transform); - } - if (dash.curLen < 1 && TO_SWCOORD(len) > 1) { - //move to next dash - dash.curIdx = (dash.curIdx + 1) % dash.cnt; - dash.curLen = dash.pattern[dash.curIdx]; - dash.curOpGap = !dash.curOpGap; - } - } - dash.ptCur = *to; -} - - -static void _dashCubicTo(SwDashStroke& dash, const Point* ctrl1, const Point* ctrl2, const Point* to, const Matrix* transform) -{ - Bezier cur = {dash.ptCur, *ctrl1, *ctrl2, *to}; - auto len = bezLength(cur); - - //draw the current line fully - if (mathZero(len)) { - _outlineMoveTo(*dash.outline, &dash.ptCur, transform); - } else if (len < dash.curLen) { - dash.curLen -= len; - if (!dash.curOpGap) { - if (dash.move) { - _outlineMoveTo(*dash.outline, &dash.ptCur, transform); - dash.move = false; - } - _outlineCubicTo(*dash.outline, ctrl1, ctrl2, to, transform); - } - //draw the current line partially - } else { - while ((len - dash.curLen) > 0.0001f) { - Bezier left, right; - if (dash.curLen > 0) { - len -= dash.curLen; - bezSplitAt(cur, dash.curLen, left, right); - if (!dash.curOpGap) { - if (dash.move || dash.pattern[dash.curIdx] - dash.curLen < FLOAT_EPSILON) { - _outlineMoveTo(*dash.outline, &left.start, transform); - dash.move = false; - } - _outlineCubicTo(*dash.outline, &left.ctrl1, &left.ctrl2, &left.end, transform); - } - } else { - right = cur; - } - dash.curIdx = (dash.curIdx + 1) % dash.cnt; - dash.curLen = dash.pattern[dash.curIdx]; - dash.curOpGap = !dash.curOpGap; - cur = right; - dash.ptCur = right.start; - dash.move = true; - } - //leftovers - dash.curLen -= len; - if (!dash.curOpGap) { - if (dash.move) { - _outlineMoveTo(*dash.outline, &cur.start, transform); - dash.move = false; - } - _outlineCubicTo(*dash.outline, &cur.ctrl1, &cur.ctrl2, &cur.end, transform); - } - if (dash.curLen < 1 && TO_SWCOORD(len) > 1) { - //move to next dash - dash.curIdx = (dash.curIdx + 1) % dash.cnt; - dash.curLen = dash.pattern[dash.curIdx]; - dash.curOpGap = !dash.curOpGap; - } - } - dash.ptCur = *to; -} - - -static void _dashClose(SwDashStroke& dash, const Matrix* transform) -{ - _dashLineTo(dash, &dash.ptStart, transform); -} - - -static void _dashMoveTo(SwDashStroke& dash, const Point* pts) -{ - dash.ptCur = *pts; - dash.ptStart = *pts; - dash.move = true; -} - - -static void _dashMoveTo(SwDashStroke& dash, uint32_t offIdx, float offset, const Point* pts) -{ - dash.curIdx = offIdx % dash.cnt; - dash.curLen = dash.pattern[dash.curIdx] - offset; - dash.curOpGap = offIdx % 2; - dash.ptStart = dash.ptCur = *pts; - dash.move = true; -} - - -static SwOutline* _genDashOutline(const RenderShape* rshape, const Matrix* transform, float length, SwMpool* mpool, unsigned tid) -{ - const PathCommand* cmds = rshape->path.cmds.data; - auto cmdCnt = rshape->path.cmds.count; - const Point* pts = rshape->path.pts.data; - auto ptsCnt = rshape->path.pts.count; - - //No actual shape data - if (cmdCnt == 0 || ptsCnt == 0) return nullptr; - - SwDashStroke dash; - auto offset = 0.0f; - auto trimmed = false; - - dash.cnt = rshape->strokeDash((const float**)&dash.pattern, &offset); - - //dash by trimming. - if (length > 0.0f && dash.cnt == 0) { - auto begin = length * rshape->stroke->trim.begin; - auto end = length * rshape->stroke->trim.end; - - //TODO: mix trimming + dash style - - //default - if (end > begin) { - if (begin > 0.0f) dash.cnt += 4; - else dash.cnt += 2; - //looping - } else dash.cnt += 3; - - dash.pattern = (float*)malloc(sizeof(float) * dash.cnt); - - if (dash.cnt == 2) { - dash.pattern[0] = end - begin; - dash.pattern[1] = length - (end - begin); - } else if (dash.cnt == 3) { - dash.pattern[0] = end; - dash.pattern[1] = (begin - end); - dash.pattern[2] = length - begin; - } else { - dash.pattern[0] = 0; //zero dash to start with a space. - dash.pattern[1] = begin; - dash.pattern[2] = end - begin; - dash.pattern[3] = length - end; - } - - trimmed = true; - //just a dash style. - } else { - if (dash.cnt == 0) return nullptr; - } - - //offset? - auto patternLength = 0.0f; - uint32_t offIdx = 0; - if (!mathZero(offset)) { - for (size_t i = 0; i < dash.cnt; ++i) patternLength += dash.pattern[i]; - bool isOdd = dash.cnt % 2; - if (isOdd) patternLength *= 2; - - offset = fmodf(offset, patternLength); - if (offset < 0) offset += patternLength; - - for (size_t i = 0; i < dash.cnt * (1 + (size_t)isOdd); ++i, ++offIdx) { - auto curPattern = dash.pattern[i % dash.cnt]; - if (offset < curPattern) break; - offset -= curPattern; - } - } - - dash.outline = mpoolReqDashOutline(mpool, tid); - - //must begin with moveTo - if (cmds[0] == PathCommand::MoveTo) { - _dashMoveTo(dash, offIdx, offset, pts); - cmds++; - pts++; - } - - while (--cmdCnt > 0) { - switch (*cmds) { - case PathCommand::Close: { - _dashClose(dash, transform); - break; - } - case PathCommand::MoveTo: { - if (rshape->stroke->trim.individual) _dashMoveTo(dash, pts); - else _dashMoveTo(dash, offIdx, offset, pts); - ++pts; - break; - } - case PathCommand::LineTo: { - _dashLineTo(dash, pts, transform); - ++pts; - break; - } - case PathCommand::CubicTo: { - _dashCubicTo(dash, pts, pts + 1, pts + 2, transform); - pts += 3; - break; - } - } - ++cmds; - } - - _outlineEnd(*dash.outline); - - if (trimmed) free(dash.pattern); - - return dash.outline; -} - - -static float _outlineLength(const RenderShape* rshape) -{ - const PathCommand* cmds = rshape->path.cmds.data; - auto cmdCnt = rshape->path.cmds.count; - const Point* pts = rshape->path.pts.data; - auto ptsCnt = rshape->path.pts.count; - - //No actual shape data - if (cmdCnt == 0 || ptsCnt == 0) return 0.0f; - - const Point* close = nullptr; - auto length = 0.0f; - auto slength = -1.0f; - auto simultaneous = !rshape->stroke->trim.individual; - - //Compute the whole length - while (cmdCnt-- > 0) { - switch (*cmds) { - case PathCommand::Close: { - length += mathLength(pts - 1, close); - //retrieve the max length of the shape if the simultaneous mode. - if (simultaneous) { - if (slength < length) slength = length; - length = 0.0f; - } - break; - } - case PathCommand::MoveTo: { - close = pts; - ++pts; - break; - } - case PathCommand::LineTo: { - length += mathLength(pts - 1, pts); - ++pts; - break; - } - case PathCommand::CubicTo: { - length += bezLength({*(pts - 1), *pts, *(pts + 1), *(pts + 2)}); - pts += 3; - break; - } - } - ++cmds; - } - if (simultaneous && slength > length) return slength; - else return length; -} - - -static bool _axisAlignedRect(const SwOutline* outline) -{ - //Fast Track: axis-aligned rectangle? - if (outline->pts.count != 5) return false; - - auto pt1 = outline->pts.data + 0; - auto pt2 = outline->pts.data + 1; - auto pt3 = outline->pts.data + 2; - auto pt4 = outline->pts.data + 3; - - auto a = SwPoint{pt1->x, pt3->y}; - auto b = SwPoint{pt3->x, pt1->y}; - - if ((*pt2 == a && *pt4 == b) || (*pt2 == b && *pt4 == a)) return true; - - return false; -} - - -static bool _genOutline(SwShape* shape, const RenderShape* rshape, const Matrix* transform, SwMpool* mpool, unsigned tid, bool hasComposite) -{ - const PathCommand* cmds = rshape->path.cmds.data; - auto cmdCnt = rshape->path.cmds.count; - const Point* pts = rshape->path.pts.data; - auto ptsCnt = rshape->path.pts.count; - - //No actual shape data - if (cmdCnt == 0 || ptsCnt == 0) return false; - - shape->outline = mpoolReqOutline(mpool, tid); - auto outline = shape->outline; - auto closed = false; - - //Generate Outlines - while (cmdCnt-- > 0) { - switch (*cmds) { - case PathCommand::Close: { - if (!closed) closed = _outlineClose(*outline); - break; - } - case PathCommand::MoveTo: { - closed = _outlineMoveTo(*outline, pts, transform, closed); - ++pts; - break; - } - case PathCommand::LineTo: { - if (closed) closed = _outlineBegin(*outline); - _outlineLineTo(*outline, pts, transform); - ++pts; - break; - } - case PathCommand::CubicTo: { - if (closed) closed = _outlineBegin(*outline); - _outlineCubicTo(*outline, pts, pts + 1, pts + 2, transform); - pts += 3; - break; - } - } - ++cmds; - } - - if (!closed) _outlineEnd(*outline); - - outline->fillRule = rshape->rule; - shape->outline = outline; - - shape->fastTrack = (!hasComposite && _axisAlignedRect(shape->outline)); - return true; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -bool shapePrepare(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid, bool hasComposite) -{ - if (!_genOutline(shape, rshape, transform, mpool, tid, hasComposite)) return false; - if (!mathUpdateOutlineBBox(shape->outline, clipRegion, renderRegion, shape->fastTrack)) return false; - - //Keep it for Rasterization Region - shape->bbox = renderRegion; - - //Check valid region - if (renderRegion.max.x - renderRegion.min.x < 1 && renderRegion.max.y - renderRegion.min.y < 1) return false; - - //Check boundary - if (renderRegion.min.x >= clipRegion.max.x || renderRegion.min.y >= clipRegion.max.y || - renderRegion.max.x <= clipRegion.min.x || renderRegion.max.y <= clipRegion.min.y) return false; - - return true; -} - - -bool shapePrepared(const SwShape* shape) -{ - return shape->rle ? true : false; -} - - -bool shapeGenRle(SwShape* shape, TVG_UNUSED const RenderShape* rshape, bool antiAlias) -{ - //FIXME: Should we draw it? - //Case: Stroke Line - //if (shape.outline->opened) return true; - - //Case A: Fast Track Rectangle Drawing - if (shape->fastTrack) return true; - - //Case B: Normal Shape RLE Drawing - if ((shape->rle = rleRender(shape->rle, shape->outline, shape->bbox, antiAlias))) return true; - - return false; -} - - -void shapeDelOutline(SwShape* shape, SwMpool* mpool, uint32_t tid) -{ - mpoolRetOutline(mpool, tid); - shape->outline = nullptr; -} - - -void shapeReset(SwShape* shape) -{ - rleReset(shape->rle); - rleReset(shape->strokeRle); - shape->fastTrack = false; - shape->bbox.reset(); -} - - -void shapeFree(SwShape* shape) -{ - rleFree(shape->rle); - shape->rle = nullptr; - - shapeDelFill(shape); - - if (shape->stroke) { - rleFree(shape->strokeRle); - shape->strokeRle = nullptr; - strokeFree(shape->stroke); - shape->stroke = nullptr; - } -} - - -void shapeDelStroke(SwShape* shape) -{ - if (!shape->stroke) return; - rleFree(shape->strokeRle); - shape->strokeRle = nullptr; - strokeFree(shape->stroke); - shape->stroke = nullptr; -} - - -void shapeResetStroke(SwShape* shape, const RenderShape* rshape, const Matrix* transform) -{ - if (!shape->stroke) shape->stroke = static_cast(calloc(1, sizeof(SwStroke))); - auto stroke = shape->stroke; - if (!stroke) return; - - strokeReset(stroke, rshape, transform); - rleReset(shape->strokeRle); -} - - -bool shapeGenStrokeRle(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid) -{ - SwOutline* shapeOutline = nullptr; - SwOutline* strokeOutline = nullptr; - auto dashStroking = false; - auto ret = true; - - auto length = rshape->strokeTrim() ? _outlineLength(rshape) : 0.0f; - - //Dash style (+trimming) - if (rshape->stroke->dashCnt > 0 || length > 0) { - shapeOutline = _genDashOutline(rshape, transform, length, mpool, tid); - if (!shapeOutline) return false; - dashStroking = true; - //Normal style - } else { - if (!shape->outline) { - if (!_genOutline(shape, rshape, transform, mpool, tid, false)) return false; - } - shapeOutline = shape->outline; - } - - if (!strokeParseOutline(shape->stroke, *shapeOutline)) { - ret = false; - goto clear; - } - - strokeOutline = strokeExportOutline(shape->stroke, mpool, tid); - - if (!mathUpdateOutlineBBox(strokeOutline, clipRegion, renderRegion, false)) { - ret = false; - goto clear; - } - - shape->strokeRle = rleRender(shape->strokeRle, strokeOutline, renderRegion, true); - -clear: - if (dashStroking) mpoolRetDashOutline(mpool, tid); - mpoolRetStrokeOutline(mpool, tid); - - return ret; -} - - -bool shapeGenFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable) -{ - return fillGenColorTable(shape->fill, fill, transform, surface, opacity, ctable); -} - - -bool shapeGenStrokeFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable) -{ - return fillGenColorTable(shape->stroke->fill, fill, transform, surface, opacity, ctable); -} - - -void shapeResetFill(SwShape* shape) -{ - if (!shape->fill) { - shape->fill = static_cast(calloc(1, sizeof(SwFill))); - if (!shape->fill) return; - } - fillReset(shape->fill); -} - - -void shapeResetStrokeFill(SwShape* shape) -{ - if (!shape->stroke->fill) { - shape->stroke->fill = static_cast(calloc(1, sizeof(SwFill))); - if (!shape->stroke->fill) return; - } - fillReset(shape->stroke->fill); -} - - -void shapeDelFill(SwShape* shape) -{ - if (!shape->fill) return; - fillFree(shape->fill); - shape->fill = nullptr; -} - - -void shapeDelStrokeFill(SwShape* shape) -{ - if (!shape->stroke->fill) return; - fillFree(shape->stroke->fill); - shape->stroke->fill = nullptr; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwStroke.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwStroke.cpp deleted file mode 100644 index 954250c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgSwStroke.cpp +++ /dev/null @@ -1,913 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include -#include -#include "tvgSwCommon.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static constexpr auto SW_STROKE_TAG_POINT = 1; -static constexpr auto SW_STROKE_TAG_CUBIC = 2; -static constexpr auto SW_STROKE_TAG_BEGIN = 4; -static constexpr auto SW_STROKE_TAG_END = 8; - -static inline SwFixed SIDE_TO_ROTATE(const int32_t s) -{ - return (SW_ANGLE_PI2 - static_cast(s) * SW_ANGLE_PI); -} - - -static inline void SCALE(const SwStroke& stroke, SwPoint& pt) -{ - pt.x = static_cast(pt.x * stroke.sx); - pt.y = static_cast(pt.y * stroke.sy); -} - - -static void _growBorder(SwStrokeBorder* border, uint32_t newPts) -{ - auto maxOld = border->maxPts; - auto maxNew = border->ptsCnt + newPts; - - if (maxNew <= maxOld) return; - - auto maxCur = maxOld; - - while (maxCur < maxNew) - maxCur += (maxCur >> 1) + 16; - //OPTIMIZE: use mempool! - border->pts = static_cast(realloc(border->pts, maxCur * sizeof(SwPoint))); - border->tags = static_cast(realloc(border->tags, maxCur * sizeof(uint8_t))); - border->maxPts = maxCur; -} - - -static void _borderClose(SwStrokeBorder* border, bool reverse) -{ - auto start = border->start; - auto count = border->ptsCnt; - - //Don't record empty paths! - if (count <= start + 1U) { - border->ptsCnt = start; - } else { - /* Copy the last point to the start of this sub-path, - since it contains the adjusted starting coordinates */ - border->ptsCnt = --count; - border->pts[start] = border->pts[count]; - - if (reverse) { - //reverse the points - auto pt1 = border->pts + start + 1; - auto pt2 = border->pts + count - 1; - - while (pt1 < pt2) { - auto tmp = *pt1; - *pt1 = *pt2; - *pt2 = tmp; - ++pt1; - --pt2; - } - - //reverse the tags - auto tag1 = border->tags + start + 1; - auto tag2 = border->tags + count - 1; - - while (tag1 < tag2) { - auto tmp = *tag1; - *tag1 = *tag2; - *tag2 = tmp; - ++tag1; - --tag2; - } - } - - border->tags[start] |= SW_STROKE_TAG_BEGIN; - border->tags[count - 1] |= SW_STROKE_TAG_END; - } - - border->start = -1; - border->movable = false; -} - - -static void _borderCubicTo(SwStrokeBorder* border, const SwPoint& ctrl1, const SwPoint& ctrl2, const SwPoint& to) -{ - _growBorder(border, 3); - - auto pt = border->pts + border->ptsCnt; - auto tag = border->tags + border->ptsCnt; - - pt[0] = ctrl1; - pt[1] = ctrl2; - pt[2] = to; - - tag[0] = SW_STROKE_TAG_CUBIC; - tag[1] = SW_STROKE_TAG_CUBIC; - tag[2] = SW_STROKE_TAG_POINT; - - border->ptsCnt += 3; - border->movable = false; -} - - -static void _borderArcTo(SwStrokeBorder* border, const SwPoint& center, SwFixed radius, SwFixed angleStart, SwFixed angleDiff, SwStroke& stroke) -{ - constexpr SwFixed ARC_CUBIC_ANGLE = SW_ANGLE_PI / 2; - SwPoint a = {static_cast(radius), 0}; - mathRotate(a, angleStart); - SCALE(stroke, a); - a += center; - - auto total = angleDiff; - auto angle = angleStart; - auto rotate = (angleDiff >= 0) ? SW_ANGLE_PI2 : -SW_ANGLE_PI2; - - while (total != 0) { - auto step = total; - if (step > ARC_CUBIC_ANGLE) step = ARC_CUBIC_ANGLE; - else if (step < -ARC_CUBIC_ANGLE) step = -ARC_CUBIC_ANGLE; - - auto next = angle + step; - auto theta = step; - if (theta < 0) theta = -theta; - - theta >>= 1; - - //compute end point - SwPoint b = {static_cast(radius), 0}; - mathRotate(b, next); - SCALE(stroke, b); - b += center; - - //compute first and second control points - auto length = mathMulDiv(radius, mathSin(theta) * 4, (0x10000L + mathCos(theta)) * 3); - - SwPoint a2 = {static_cast(length), 0}; - mathRotate(a2, angle + rotate); - SCALE(stroke, a2); - a2 += a; - - SwPoint b2 = {static_cast(length), 0}; - mathRotate(b2, next - rotate); - SCALE(stroke, b2); - b2 += b; - - //add cubic arc - _borderCubicTo(border, a2, b2, b); - - //process the rest of the arc? - a = b; - total -= step; - angle = next; - } -} - - -static void _borderLineTo(SwStrokeBorder* border, const SwPoint& to, bool movable) -{ - if (border->movable) { - //move last point - border->pts[border->ptsCnt - 1] = to; - } else { - //don't add zero-length line_to - if (border->ptsCnt > 0 && (border->pts[border->ptsCnt - 1] - to).small()) return; - - _growBorder(border, 1); - border->pts[border->ptsCnt] = to; - border->tags[border->ptsCnt] = SW_STROKE_TAG_POINT; - border->ptsCnt += 1; - } - - border->movable = movable; -} - - -static void _borderMoveTo(SwStrokeBorder* border, SwPoint& to) -{ - //close current open path if any? - if (border->start >= 0) _borderClose(border, false); - - border->start = border->ptsCnt; - border->movable = false; - - _borderLineTo(border, to, false); -} - - -static void _arcTo(SwStroke& stroke, int32_t side) -{ - auto border = stroke.borders + side; - auto rotate = SIDE_TO_ROTATE(side); - auto total = mathDiff(stroke.angleIn, stroke.angleOut); - if (total == SW_ANGLE_PI) total = -rotate * 2; - - _borderArcTo(border, stroke.center, stroke.width, stroke.angleIn + rotate, total, stroke); - border->movable = false; -} - - -static void _outside(SwStroke& stroke, int32_t side, SwFixed lineLength) -{ - auto border = stroke.borders + side; - - if (stroke.join == StrokeJoin::Round) { - _arcTo(stroke, side); - } else { - //this is a mitered (pointed) or beveled (truncated) corner - auto rotate = SIDE_TO_ROTATE(side); - auto bevel = (stroke.join == StrokeJoin::Bevel) ? true : false; - SwFixed phi = 0; - SwFixed thcos = 0; - - if (!bevel) { - auto theta = mathDiff(stroke.angleIn, stroke.angleOut); - if (theta == SW_ANGLE_PI) { - theta = rotate; - phi = stroke.angleIn; - } else { - theta /= 2; - phi = stroke.angleIn + theta + rotate; - } - - thcos = mathCos(theta); - auto sigma = mathMultiply(stroke.miterlimit, thcos); - - //is miter limit exceeded? - if (sigma < 0x10000L) bevel = true; - } - - //this is a bevel (broken angle) - if (bevel) { - SwPoint delta = {static_cast(stroke.width), 0}; - mathRotate(delta, stroke.angleOut + rotate); - SCALE(stroke, delta); - delta += stroke.center; - border->movable = false; - _borderLineTo(border, delta, false); - //this is a miter (intersection) - } else { - auto length = mathDivide(stroke.width, thcos); - SwPoint delta = {static_cast(length), 0}; - mathRotate(delta, phi); - SCALE(stroke, delta); - delta += stroke.center; - _borderLineTo(border, delta, false); - - /* Now add and end point - Only needed if not lineto (lineLength is zero for curves) */ - if (lineLength == 0) { - delta = {static_cast(stroke.width), 0}; - mathRotate(delta, stroke.angleOut + rotate); - SCALE(stroke, delta); - delta += stroke.center; - _borderLineTo(border, delta, false); - } - } - } -} - - -static void _inside(SwStroke& stroke, int32_t side, SwFixed lineLength) -{ - auto border = stroke.borders + side; - auto theta = mathDiff(stroke.angleIn, stroke.angleOut) / 2; - SwPoint delta; - bool intersect = false; - - /* Only intersect borders if between two line_to's and both - lines are long enough (line length is zero for curves). */ - if (border->movable && lineLength > 0) { - //compute minimum required length of lines - SwFixed minLength = abs(mathMultiply(stroke.width, mathTan(theta))); - if (stroke.lineLength >= minLength && lineLength >= minLength) intersect = true; - } - - auto rotate = SIDE_TO_ROTATE(side); - - if (!intersect) { - delta = {static_cast(stroke.width), 0}; - mathRotate(delta, stroke.angleOut + rotate); - SCALE(stroke, delta); - delta += stroke.center; - border->movable = false; - } else { - //compute median angle - auto phi = stroke.angleIn + theta; - auto thcos = mathCos(theta); - delta = {static_cast(mathDivide(stroke.width, thcos)), 0}; - mathRotate(delta, phi + rotate); - SCALE(stroke, delta); - delta += stroke.center; - } - - _borderLineTo(border, delta, false); -} - - -void _processCorner(SwStroke& stroke, SwFixed lineLength) -{ - auto turn = mathDiff(stroke.angleIn, stroke.angleOut); - - //no specific corner processing is required if the turn is 0 - if (turn == 0) return; - - //when we turn to the right, the inside side is 0 - int32_t inside = 0; - - //otherwise, the inside is 1 - if (turn < 0) inside = 1; - - //process the inside - _inside(stroke, inside, lineLength); - - //process the outside - _outside(stroke, 1 - inside, lineLength); -} - - -void _firstSubPath(SwStroke& stroke, SwFixed startAngle, SwFixed lineLength) -{ - SwPoint delta = {static_cast(stroke.width), 0}; - mathRotate(delta, startAngle + SW_ANGLE_PI2); - SCALE(stroke, delta); - - auto pt = stroke.center + delta; - auto border = stroke.borders; - _borderMoveTo(border, pt); - - pt = stroke.center - delta; - ++border; - _borderMoveTo(border, pt); - - /* Save angle, position and line length for last join - lineLength is zero for curves */ - stroke.subPathAngle = startAngle; - stroke.firstPt = false; - stroke.subPathLineLength = lineLength; -} - - -static void _lineTo(SwStroke& stroke, const SwPoint& to) -{ - auto delta = to - stroke.center; - - //a zero-length lineto is a no-op; avoid creating a spurious corner - if (delta.zero()) return; - - /* The lineLength is used to determine the intersection of strokes outlines. - The scale needs to be reverted since the stroke width has not been scaled. - An alternative option is to scale the width of the stroke properly by - calculating the mixture of the sx/sy rating on the stroke direction. */ - delta.x = static_cast(delta.x / stroke.sx); - delta.y = static_cast(delta.y / stroke.sy); - auto lineLength = mathLength(delta); - auto angle = mathAtan(delta); - - delta = {static_cast(stroke.width), 0}; - mathRotate(delta, angle + SW_ANGLE_PI2); - SCALE(stroke, delta); - - //process corner if necessary - if (stroke.firstPt) { - /* This is the first segment of a subpath. We need to add a point to each border - at their respective starting point locations. */ - _firstSubPath(stroke, angle, lineLength); - } else { - //process the current corner - stroke.angleOut = angle; - _processCorner(stroke, lineLength); - } - - //now add a line segment to both the inside and outside paths - auto border = stroke.borders; - auto side = 1; - - while (side >= 0) { - auto pt = to + delta; - - //the ends of lineto borders are movable - _borderLineTo(border, pt, true); - - delta.x = -delta.x; - delta.y = -delta.y; - - --side; - ++border; - } - - stroke.angleIn = angle; - stroke.center = to; - stroke.lineLength = lineLength; -} - - -static void _cubicTo(SwStroke& stroke, const SwPoint& ctrl1, const SwPoint& ctrl2, const SwPoint& to) -{ - SwPoint bezStack[37]; //TODO: static? - auto limit = bezStack + 32; - auto arc = bezStack; - auto firstArc = true; - arc[0] = to; - arc[1] = ctrl2; - arc[2] = ctrl1; - arc[3] = stroke.center; - - while (arc >= bezStack) { - SwFixed angleIn, angleOut, angleMid; - - //initialize with current direction - angleIn = angleOut = angleMid = stroke.angleIn; - - if (arc < limit && !mathSmallCubic(arc, angleIn, angleMid, angleOut)) { - if (stroke.firstPt) stroke.angleIn = angleIn; - mathSplitCubic(arc); - arc += 3; - continue; - } - - if (firstArc) { - firstArc = false; - //process corner if necessary - if (stroke.firstPt) { - _firstSubPath(stroke, angleIn, 0); - } else { - stroke.angleOut = angleIn; - _processCorner(stroke, 0); - } - } else if (abs(mathDiff(stroke.angleIn, angleIn)) > (SW_ANGLE_PI / 8) / 4) { - //if the deviation from one arc to the next is too great add a round corner - stroke.center = arc[3]; - stroke.angleOut = angleIn; - stroke.join = StrokeJoin::Round; - - _processCorner(stroke, 0); - - //reinstate line join style - stroke.join = stroke.joinSaved; - } - - //the arc's angle is small enough; we can add it directly to each border - auto theta1 = mathDiff(angleIn, angleMid) / 2; - auto theta2 = mathDiff(angleMid, angleOut) / 2; - auto phi1 = mathMean(angleIn, angleMid); - auto phi2 = mathMean(angleMid, angleOut); - auto length1 = mathDivide(stroke.width, mathCos(theta1)); - auto length2 = mathDivide(stroke.width, mathCos(theta2)); - SwFixed alpha0 = 0; - - //compute direction of original arc - if (stroke.handleWideStrokes) { - alpha0 = mathAtan(arc[0] - arc[3]); - } - - auto border = stroke.borders; - int32_t side = 0; - - while (side < 2) { - auto rotate = SIDE_TO_ROTATE(side); - - //compute control points - SwPoint _ctrl1 = {static_cast(length1), 0}; - mathRotate(_ctrl1, phi1 + rotate); - SCALE(stroke, _ctrl1); - _ctrl1 += arc[2]; - - SwPoint _ctrl2 = {static_cast(length2), 0}; - mathRotate(_ctrl2, phi2 + rotate); - SCALE(stroke, _ctrl2); - _ctrl2 += arc[1]; - - //compute end point - SwPoint _end = {static_cast(stroke.width), 0}; - mathRotate(_end, angleOut + rotate); - SCALE(stroke, _end); - _end += arc[0]; - - if (stroke.handleWideStrokes) { - /* determine whether the border radius is greater than the radius of - curvature of the original arc */ - auto _start = border->pts[border->ptsCnt - 1]; - auto alpha1 = mathAtan(_end - _start); - - //is the direction of the border arc opposite to that of the original arc? - if (abs(mathDiff(alpha0, alpha1)) > SW_ANGLE_PI / 2) { - - //use the sine rule to find the intersection point - auto beta = mathAtan(arc[3] - _start); - auto gamma = mathAtan(arc[0] - _end); - auto bvec = _end - _start; - auto blen = mathLength(bvec); - auto sinA = abs(mathSin(alpha1 - gamma)); - auto sinB = abs(mathSin(beta - gamma)); - auto alen = mathMulDiv(blen, sinA, sinB); - - SwPoint delta = {static_cast(alen), 0}; - mathRotate(delta, beta); - delta += _start; - - //circumnavigate the negative sector backwards - border->movable = false; - _borderLineTo(border, delta, false); - _borderLineTo(border, _end, false); - _borderCubicTo(border, _ctrl2, _ctrl1, _start); - - //and then move to the endpoint - _borderLineTo(border, _end, false); - - ++side; - ++border; - continue; - } - } - _borderCubicTo(border, _ctrl1, _ctrl2, _end); - ++side; - ++border; - } - arc -= 3; - stroke.angleIn = angleOut; - } - stroke.center = to; -} - - -static void _addCap(SwStroke& stroke, SwFixed angle, int32_t side) -{ - if (stroke.cap == StrokeCap::Square) { - auto rotate = SIDE_TO_ROTATE(side); - auto border = stroke.borders + side; - - SwPoint delta = {static_cast(stroke.width), 0}; - mathRotate(delta, angle); - SCALE(stroke, delta); - - SwPoint delta2 = {static_cast(stroke.width), 0}; - mathRotate(delta2, angle + rotate); - SCALE(stroke, delta2); - delta += stroke.center + delta2; - - _borderLineTo(border, delta, false); - - delta = {static_cast(stroke.width), 0}; - mathRotate(delta, angle); - SCALE(stroke, delta); - - delta2 = {static_cast(stroke.width), 0}; - mathRotate(delta2, angle - rotate); - SCALE(stroke, delta2); - delta += delta2 + stroke.center; - - _borderLineTo(border, delta, false); - - } else if (stroke.cap == StrokeCap::Round) { - - stroke.angleIn = angle; - stroke.angleOut = angle + SW_ANGLE_PI; - _arcTo(stroke, side); - return; - - } else { //Butt - auto rotate = SIDE_TO_ROTATE(side); - auto border = stroke.borders + side; - - SwPoint delta = {static_cast(stroke.width), 0}; - mathRotate(delta, angle + rotate); - SCALE(stroke, delta); - delta += stroke.center; - - _borderLineTo(border, delta, false); - - delta = {static_cast(stroke.width), 0}; - mathRotate(delta, angle - rotate); - SCALE(stroke, delta); - delta += stroke.center; - - _borderLineTo(border, delta, false); - } -} - - -static void _addReverseLeft(SwStroke& stroke, bool opened) -{ - auto right = stroke.borders + 0; - auto left = stroke.borders + 1; - auto newPts = left->ptsCnt - left->start; - - if (newPts <= 0) return; - - _growBorder(right, newPts); - - auto dstPt = right->pts + right->ptsCnt; - auto dstTag = right->tags + right->ptsCnt; - auto srcPt = left->pts + left->ptsCnt - 1; - auto srcTag = left->tags + left->ptsCnt - 1; - - while (srcPt >= left->pts + left->start) { - *dstPt = *srcPt; - *dstTag = *srcTag; - - if (opened) { - dstTag[0] &= ~(SW_STROKE_TAG_BEGIN | SW_STROKE_TAG_END); - } else { - //switch begin/end tags if necessary - auto ttag = dstTag[0] & (SW_STROKE_TAG_BEGIN | SW_STROKE_TAG_END); - if (ttag == SW_STROKE_TAG_BEGIN || ttag == SW_STROKE_TAG_END) - dstTag[0] ^= (SW_STROKE_TAG_BEGIN | SW_STROKE_TAG_END); - } - --srcPt; - --srcTag; - ++dstPt; - ++dstTag; - } - - left->ptsCnt = left->start; - right->ptsCnt += newPts; - right->movable = false; - left->movable = false; -} - - -static void _beginSubPath(SwStroke& stroke, const SwPoint& to, bool closed) -{ - /* We cannot process the first point because there is not enough - information regarding its corner/cap. Later, it will be processed - in the _endSubPath() */ - - stroke.firstPt = true; - stroke.center = to; - stroke.closedSubPath = closed; - - /* Determine if we need to check whether the border radius is greater - than the radius of curvature of a curve, to handle this case specially. - This is only required if bevel joins or butt caps may be created because - round & miter joins and round & square caps cover the negative sector - created with wide strokes. */ - if ((stroke.join != StrokeJoin::Round) || (!stroke.closedSubPath && stroke.cap == StrokeCap::Butt)) - stroke.handleWideStrokes = true; - else - stroke.handleWideStrokes = false; - - stroke.ptStartSubPath = to; - stroke.angleIn = 0; -} - - -static void _endSubPath(SwStroke& stroke) -{ - if (stroke.closedSubPath) { - //close the path if needed - if (stroke.center != stroke.ptStartSubPath) - _lineTo(stroke, stroke.ptStartSubPath); - - //process the corner - stroke.angleOut = stroke.subPathAngle; - auto turn = mathDiff(stroke.angleIn, stroke.angleOut); - - //No specific corner processing is required if the turn is 0 - if (turn != 0) { - //when we turn to the right, the inside is 0 - int32_t inside = 0; - - //otherwise, the inside is 1 - if (turn < 0) inside = 1; - - _inside(stroke, inside, stroke.subPathLineLength); //inside - _outside(stroke, 1 - inside, stroke.subPathLineLength); //outside - } - - _borderClose(stroke.borders + 0, false); - _borderClose(stroke.borders + 1, true); - } else { - auto right = stroke.borders; - - /* all right, this is an opened path, we need to add a cap between - right & left, add the reverse of left, then add a final cap - between left & right */ - _addCap(stroke, stroke.angleIn, 0); - - //add reversed points from 'left' to 'right' - _addReverseLeft(stroke, true); - - //now add the final cap - stroke.center = stroke.ptStartSubPath; - _addCap(stroke, stroke.subPathAngle + SW_ANGLE_PI, 0); - - /* now end the right subpath accordingly. The left one is rewind - and doesn't need further processing */ - _borderClose(right, false); - } -} - - -static void _getCounts(SwStrokeBorder* border, uint32_t& ptsCnt, uint32_t& cntrsCnt) -{ - auto count = border->ptsCnt; - auto tags = border->tags; - uint32_t _ptsCnt = 0; - uint32_t _cntrsCnt = 0; - bool inCntr = false; - - while (count > 0) { - if (tags[0] & SW_STROKE_TAG_BEGIN) { - if (inCntr) goto fail; - inCntr = true; - } else if (!inCntr) goto fail; - - if (tags[0] & SW_STROKE_TAG_END) { - inCntr = false; - ++_cntrsCnt; - } - --count; - ++_ptsCnt; - ++tags; - } - - if (inCntr) goto fail; - - ptsCnt = _ptsCnt; - cntrsCnt = _cntrsCnt; - - return; - -fail: - ptsCnt = 0; - cntrsCnt = 0; -} - - -static void _exportBorderOutline(const SwStroke& stroke, SwOutline* outline, uint32_t side) -{ - auto border = stroke.borders + side; - if (border->ptsCnt == 0) return; - - memcpy(outline->pts.data + outline->pts.count, border->pts, border->ptsCnt * sizeof(SwPoint)); - - auto cnt = border->ptsCnt; - auto src = border->tags; - auto tags = outline->types.data + outline->types.count; - auto idx = outline->pts.count; - - while (cnt > 0) { - if (*src & SW_STROKE_TAG_POINT) *tags = SW_CURVE_TYPE_POINT; - else if (*src & SW_STROKE_TAG_CUBIC) *tags = SW_CURVE_TYPE_CUBIC; - else TVGERR("SW_ENGINE", "Invalid stroke tag was given! = %d", *src); - if (*src & SW_STROKE_TAG_END) outline->cntrs.push(idx); - ++src; - ++tags; - ++idx; - --cnt; - } - outline->pts.count += border->ptsCnt; - outline->types.count += border->ptsCnt; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -void strokeFree(SwStroke* stroke) -{ - if (!stroke) return; - - //free borders - if (stroke->borders[0].pts) free(stroke->borders[0].pts); - if (stroke->borders[0].tags) free(stroke->borders[0].tags); - if (stroke->borders[1].pts) free(stroke->borders[1].pts); - if (stroke->borders[1].tags) free(stroke->borders[1].tags); - - fillFree(stroke->fill); - stroke->fill = nullptr; - - free(stroke); -} - - -void strokeReset(SwStroke* stroke, const RenderShape* rshape, const Matrix* transform) -{ - if (transform) { - stroke->sx = sqrtf(powf(transform->e11, 2.0f) + powf(transform->e21, 2.0f)); - stroke->sy = sqrtf(powf(transform->e12, 2.0f) + powf(transform->e22, 2.0f)); - } else { - stroke->sx = stroke->sy = 1.0f; - } - - stroke->width = HALF_STROKE(rshape->strokeWidth()); - stroke->cap = rshape->strokeCap(); - stroke->miterlimit = static_cast(rshape->strokeMiterlimit()) << 16; - - //Save line join: it can be temporarily changed when stroking curves... - stroke->joinSaved = stroke->join = rshape->strokeJoin(); - - stroke->borders[0].ptsCnt = 0; - stroke->borders[0].start = -1; - stroke->borders[1].ptsCnt = 0; - stroke->borders[1].start = -1; -} - - -bool strokeParseOutline(SwStroke* stroke, const SwOutline& outline) -{ - uint32_t first = 0; - uint32_t i = 0; - - for (auto cntr = outline.cntrs.begin(); cntr < outline.cntrs.end(); ++cntr, ++i) { - auto last = *cntr; //index of last point in contour - auto limit = outline.pts.data + last; - - //Skip empty points - if (last <= first) { - first = last + 1; - continue; - } - - auto start = outline.pts[first]; - auto pt = outline.pts.data + first; - auto types = outline.types.data + first; - auto type = types[0]; - - //A contour cannot start with a cubic control point - if (type == SW_CURVE_TYPE_CUBIC) return false; - - auto closed = outline.closed.data ? outline.closed.data[i]: false; - - _beginSubPath(*stroke, start, closed); - - while (pt < limit) { - ++pt; - ++types; - - //emit a single line_to - if (types[0] == SW_CURVE_TYPE_POINT) { - _lineTo(*stroke, *pt); - //types cubic - } else { - if (pt + 1 > limit || types[1] != SW_CURVE_TYPE_CUBIC) return false; - - pt += 2; - types += 2; - - if (pt <= limit) { - _cubicTo(*stroke, pt[-2], pt[-1], pt[0]); - continue; - } - _cubicTo(*stroke, pt[-2], pt[-1], start); - goto close; - } - } - close: - if (!stroke->firstPt) _endSubPath(*stroke); - first = last + 1; - } - return true; -} - - -SwOutline* strokeExportOutline(SwStroke* stroke, SwMpool* mpool, unsigned tid) -{ - uint32_t count1, count2, count3, count4; - - _getCounts(stroke->borders + 0, count1, count2); - _getCounts(stroke->borders + 1, count3, count4); - - auto ptsCnt = count1 + count3; - auto cntrsCnt = count2 + count4; - - auto outline = mpoolReqStrokeOutline(mpool, tid); - outline->pts.reserve(ptsCnt); - outline->types.reserve(ptsCnt); - outline->cntrs.reserve(cntrsCnt); - - _exportBorderOutline(*stroke, outline, 0); //left - _exportBorderOutline(*stroke, outline, 1); //right - - return outline; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgTaskScheduler.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgTaskScheduler.cpp deleted file mode 100644 index b5c7c2e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgTaskScheduler.cpp +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgArray.h" -#include "tvgInlist.h" -#include "tvgTaskScheduler.h" - -#ifdef THORVG_THREAD_SUPPORT - #include - #include -#endif - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -namespace tvg { - -struct TaskSchedulerImpl; -static TaskSchedulerImpl* inst = nullptr; - -#ifdef THORVG_THREAD_SUPPORT - -static thread_local bool _async = true; - -struct TaskQueue { - Inlist taskDeque; - mutex mtx; - condition_variable ready; - bool done = false; - - bool tryPop(Task** task) - { - unique_lock lock{mtx, try_to_lock}; - if (!lock || taskDeque.empty()) return false; - *task = taskDeque.front(); - return true; - } - - bool tryPush(Task* task) - { - { - unique_lock lock{mtx, try_to_lock}; - if (!lock) return false; - taskDeque.back(task); - } - ready.notify_one(); - return true; - } - - void complete() - { - { - lock_guard lock{mtx}; - done = true; - } - ready.notify_all(); - } - - bool pop(Task** task) - { - unique_lock lock{mtx}; - - while (taskDeque.empty() && !done) { - ready.wait(lock); - } - - if (taskDeque.empty()) return false; - - *task = taskDeque.front(); - return true; - } - - void push(Task* task) - { - { - lock_guard lock{mtx}; - taskDeque.back(task); - } - ready.notify_one(); - } -}; - - -struct TaskSchedulerImpl -{ - Array threads; - Array taskQueues; - atomic idx{0}; - - TaskSchedulerImpl(uint32_t threadCnt) - { - threads.reserve(threadCnt); - taskQueues.reserve(threadCnt); - - for (uint32_t i = 0; i < threadCnt; ++i) { - taskQueues.push(new TaskQueue); - threads.push(new thread); - } - for (uint32_t i = 0; i < threadCnt; ++i) { - *threads.data[i] = thread([&, i] { run(i); }); - } - } - - ~TaskSchedulerImpl() - { - for (auto tq = taskQueues.begin(); tq < taskQueues.end(); ++tq) { - (*tq)->complete(); - } - for (auto thread = threads.begin(); thread < threads.end(); ++thread) { - (*thread)->join(); - delete(*thread); - } - for (auto tq = taskQueues.begin(); tq < taskQueues.end(); ++tq) { - delete(*tq); - } - } - - void run(unsigned i) - { - Task* task; - - //Thread Loop - while (true) { - auto success = false; - for (uint32_t x = 0; x < threads.count * 2; ++x) { - if (taskQueues[(i + x) % threads.count]->tryPop(&task)) { - success = true; - break; - } - } - - if (!success && !taskQueues[i]->pop(&task)) break; - (*task)(i + 1); - } - } - - void request(Task* task) - { - //Async - if (threads.count > 0 && _async) { - task->prepare(); - auto i = idx++; - for (uint32_t n = 0; n < threads.count; ++n) { - if (taskQueues[(i + n) % threads.count]->tryPush(task)) return; - } - taskQueues[i % threads.count]->push(task); - //Sync - } else { - task->run(0); - } - } - - uint32_t threadCnt() - { - return threads.count; - } -}; - -#else //THORVG_THREAD_SUPPORT - -static bool _async = true; - -struct TaskSchedulerImpl -{ - TaskSchedulerImpl(TVG_UNUSED uint32_t threadCnt) {} - void request(Task* task) { task->run(0); } - uint32_t threadCnt() { return 0; } -}; - -#endif //THORVG_THREAD_SUPPORT - -} //namespace - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -void TaskScheduler::init(uint32_t threads) -{ - if (inst) return; - inst = new TaskSchedulerImpl(threads); -} - - -void TaskScheduler::term() -{ - delete(inst); - inst = nullptr; -} - - -void TaskScheduler::request(Task* task) -{ - if (inst) inst->request(task); -} - - -uint32_t TaskScheduler::threads() -{ - if (inst) return inst->threadCnt(); - return 0; -} - - -void TaskScheduler::async(bool on) -{ - //toggle async tasking for each thread on/off - _async = on; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgTaskScheduler.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgTaskScheduler.h deleted file mode 100644 index af1334b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgTaskScheduler.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_TASK_SCHEDULER_H_ -#define _TVG_TASK_SCHEDULER_H_ - -#include -#include - -#include "tvgCommon.h" -#include "tvgInlist.h" - -namespace tvg { - -#ifdef THORVG_THREAD_SUPPORT - -struct Task -{ -private: - mutex mtx; - condition_variable cv; - bool ready = true; - bool pending = false; - -public: - INLIST_ITEM(Task); - - virtual ~Task() = default; - - void done() - { - if (!pending) return; - - unique_lock lock(mtx); - while (!ready) cv.wait(lock); - pending = false; - } - -protected: - virtual void run(unsigned tid) = 0; - -private: - void operator()(unsigned tid) - { - run(tid); - - lock_guard lock(mtx); - ready = true; - cv.notify_one(); - } - - void prepare() - { - ready = false; - pending = true; - } - - friend struct TaskSchedulerImpl; -}; - -#else //THORVG_THREAD_SUPPORT - -struct Task -{ -public: - INLIST_ITEM(Task); - - virtual ~Task() = default; - void done() {} - -protected: - virtual void run(unsigned tid) = 0; - -private: - friend struct TaskSchedulerImpl; -}; - -#endif //THORVG_THREAD_SUPPORT - - -struct TaskScheduler -{ - static uint32_t threads(); - static void init(uint32_t threads); - static void term(); - static void request(Task* task); - static void async(bool on); -}; - -} //namespace - -#endif //_TVG_TASK_SCHEDULER_H_ - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgText.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgText.cpp deleted file mode 100644 index 6cb2b4f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgText.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - - -#include "tvgText.h" - - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - - -Text::Text() : pImpl(new Impl) -{ - Paint::pImpl->id = TVG_CLASS_ID_TEXT; -} - - -Text::~Text() -{ - delete(pImpl); -} - - -Result Text::text(const char* text) noexcept -{ - return pImpl->text(text); -} - - -Result Text::font(const char* name, float size, const char* style) noexcept -{ - return pImpl->font(name, size, style); -} - - -Result Text::load(const std::string& path) noexcept -{ - bool invalid; //invalid path - if (!LoaderMgr::loader(path, &invalid)) { - if (invalid) return Result::InvalidArguments; - else return Result::NonSupport; - } - - return Result::Success; -} - - -Result Text::unload(const std::string& path) noexcept -{ - if (LoaderMgr::retrieve(path)) return Result::Success; - return Result::InsufficientCondition; -} - - -Result Text::fill(uint8_t r, uint8_t g, uint8_t b) noexcept -{ - if (!pImpl->paint) return Result::InsufficientCondition; - - return pImpl->fill(r, g, b); -} - - -Result Text::fill(unique_ptr f) noexcept -{ - if (!pImpl->paint) return Result::InsufficientCondition; - - auto p = f.release(); - if (!p) return Result::MemoryCorruption; - - return pImpl->fill(p); -} - - -unique_ptr Text::gen() noexcept -{ - return unique_ptr(new Text); -} - - -uint32_t Text::identifier() noexcept -{ - return TVG_CLASS_ID_TEXT; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgText.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgText.h deleted file mode 100644 index 89cef18..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgText.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_TEXT_H -#define _TVG_TEXT_H - -#include -#include "tvgShape.h" -#include "tvgFill.h" - -#ifdef THORVG_TTF_LOADER_SUPPORT - #include "tvgTtfLoader.h" -#else - #include "tvgLoader.h" -#endif - -struct Text::Impl -{ - FontLoader* loader = nullptr; - Shape* paint = nullptr; - char* utf8 = nullptr; - float fontSize; - bool italic = false; - bool changed = false; - - ~Impl() - { - free(utf8); - LoaderMgr::retrieve(loader); - delete(paint); - } - - Result fill(uint8_t r, uint8_t g, uint8_t b) - { - return paint->fill(r, g, b); - } - - Result fill(Fill* f) - { - return paint->fill(cast(f)); - } - - Result text(const char* utf8) - { - free(this->utf8); - if (utf8) this->utf8 = strdup(utf8); - else this->utf8 = nullptr; - changed = true; - - return Result::Success; - } - - Result font(const char* name, float size, const char* style) - { - auto loader = LoaderMgr::loader(name); - if (!loader) return Result::InsufficientCondition; - - //Same resource has been loaded. - if (this->loader == loader) { - this->loader->sharing--; //make it sure the reference counting. - return Result::Success; - } else if (this->loader) { - LoaderMgr::retrieve(this->loader); - } - this->loader = static_cast(loader); - - if (!paint) paint = Shape::gen().release(); - - fontSize = size; - if (style && strstr(style, "italic")) italic = true; - changed = true; - return Result::Success; - } - - RenderRegion bounds(RenderMethod* renderer) - { - if (paint) return P(paint)->bounds(renderer); - else return {0, 0, 0, 0}; - } - - bool render(RenderMethod* renderer) - { - if (paint) return PP(paint)->render(renderer); - return false; - } - - bool load() - { - if (!loader) return false; - - //reload - if (changed) { - loader->request(paint, utf8, italic); - loader->read(); - changed = false; - } - if (paint) { - loader->resize(paint, fontSize, fontSize); - return true; - } - return false; - } - - RenderData update(RenderMethod* renderer, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) - { - if (!load()) return nullptr; - - //transform the gradient coordinates based on the final scaled font. - if (P(paint)->flag & RenderUpdateFlag::Gradient) { - auto fill = P(paint)->rs.fill; - auto scale = 1.0f / loader->scale; - if (fill->identifier() == TVG_CLASS_ID_LINEAR) { - P(static_cast(fill))->x1 *= scale; - P(static_cast(fill))->y1 *= scale; - P(static_cast(fill))->x2 *= scale; - P(static_cast(fill))->y2 *= scale; - } else { - P(static_cast(fill))->cx *= scale; - P(static_cast(fill))->cy *= scale; - P(static_cast(fill))->r *= scale; - P(static_cast(fill))->fx *= scale; - P(static_cast(fill))->fy *= scale; - P(static_cast(fill))->fr *= scale; - } - } - return PP(paint)->update(renderer, transform, clips, opacity, pFlag, clipper); - } - - bool bounds(float* x, float* y, float* w, float* h, TVG_UNUSED bool stroking) - { - if (!load() || !paint) return false; - paint->bounds(x, y, w, h, true); - return true; - } - - Paint* duplicate() - { - load(); - - auto ret = Text::gen().release(); - auto dup = ret->pImpl; - if (paint) dup->paint = static_cast(paint->duplicate()); - - if (loader) { - dup->loader = loader; - ++dup->loader->sharing; - } - - dup->utf8 = strdup(utf8); - dup->italic = italic; - dup->fontSize = fontSize; - - return ret; - } - - Iterator* iterator() - { - return nullptr; - } -}; - - - -#endif //_TVG_TEXT_H - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgWgCanvas.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgWgCanvas.cpp deleted file mode 100644 index 3bdaec9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgWgCanvas.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2023 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include "tvgCanvas.h" - -#ifdef THORVG_WG_RASTER_SUPPORT - #include "tvgWgRenderer.h" -#endif - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -struct WgCanvas::Impl -{ -}; - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -#ifdef THORVG_WG_RASTER_SUPPORT -WgCanvas::WgCanvas() : Canvas(WgRenderer::gen()), pImpl(new Impl) -#else -WgCanvas::WgCanvas() : Canvas(nullptr), pImpl(nullptr) -#endif -{ -} - -WgCanvas::~WgCanvas() -{ - delete pImpl; -} - -Result WgCanvas::target(void* window, uint32_t w, uint32_t h) noexcept -{ -#ifdef THORVG_WG_RASTER_SUPPORT - if (!window) return Result::InvalidArguments; - if ((w == 0) || (h == 0)) return Result::InvalidArguments; - - //We know renderer type, avoid dynamic_cast for performance. - auto renderer = static_cast(Canvas::pImpl->renderer); - if (!renderer) return Result::MemoryCorruption; - - if (!renderer->target(window, w, h)) return Result::Unknown; - Canvas::pImpl->vport = {0, 0, (int32_t)w, (int32_t)h}; - renderer->viewport(Canvas::pImpl->vport); - - //Paints must be updated again with this new target. - Canvas::pImpl->needRefresh(); - - return Result::Success; -#endif - return Result::NonSupport; -} - -unique_ptr WgCanvas::gen() noexcept -{ -#ifdef THORVG_WG_RASTER_SUPPORT - return unique_ptr(new WgCanvas); -#endif - return nullptr; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgXmlParser.cpp b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgXmlParser.cpp deleted file mode 100644 index ffb9b5d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgXmlParser.cpp +++ /dev/null @@ -1,595 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#include -#include -#include - -#ifdef _WIN32 - #include -#elif defined(__linux__) - #include -#else - #include -#endif - -#include "tvgXmlParser.h" -#include "tvgStr.h" - -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -bool _isIgnoreUnsupportedLogAttributes(TVG_UNUSED const char* tagAttribute, TVG_UNUSED const char* tagValue) -{ -#ifdef THORVG_LOG_ENABLED - const auto attributesNum = 6; - const struct - { - const char* tag; - bool tagWildcard; //If true, it is assumed that a wildcard is used after the tag. (ex: tagName*) - const char* value; - } attributes[] = { - {"id", false, nullptr}, - {"data-name", false, nullptr}, - {"overflow", false, "visible"}, - {"version", false, nullptr}, - {"xmlns", true, nullptr}, - {"xml:space", false, nullptr}, - }; - - for (unsigned int i = 0; i < attributesNum; ++i) { - if (!strncmp(tagAttribute, attributes[i].tag, attributes[i].tagWildcard ? strlen(attributes[i].tag) : strlen(tagAttribute))) { - if (attributes[i].value && tagValue) { - if (!strncmp(tagValue, attributes[i].value, strlen(tagValue))) { - return true; - } else continue; - } - return true; - } - } - return false; -#endif - return true; -} - - -static const char* _simpleXmlFindWhiteSpace(const char* itr, const char* itrEnd) -{ - for (; itr < itrEnd; itr++) { - if (isspace((unsigned char)*itr)) break; - } - return itr; -} - - -static const char* _simpleXmlSkipWhiteSpace(const char* itr, const char* itrEnd) -{ - for (; itr < itrEnd; itr++) { - if (!isspace((unsigned char)*itr)) break; - } - return itr; -} - - -static const char* _simpleXmlUnskipWhiteSpace(const char* itr, const char* itrStart) -{ - for (itr--; itr > itrStart; itr--) { - if (!isspace((unsigned char)*itr)) break; - } - return itr + 1; -} - - -static const char* _simpleXmlSkipXmlEntities(const char* itr, const char* itrEnd) -{ - auto p = itr; - while (itr < itrEnd && *itr == '&') { - for (int i = 0; i < NUMBER_OF_XML_ENTITIES; ++i) { - if (strncmp(itr, xmlEntity[i], xmlEntityLength[i]) == 0) { - itr += xmlEntityLength[i]; - break; - } - } - if (itr == p) break; - p = itr; - } - return itr; -} - - -static const char* _simpleXmlUnskipXmlEntities(const char* itr, const char* itrStart) -{ - auto p = itr; - while (itr > itrStart && *(itr - 1) == ';') { - for (int i = 0; i < NUMBER_OF_XML_ENTITIES; ++i) { - if (itr - xmlEntityLength[i] > itrStart && - strncmp(itr - xmlEntityLength[i], xmlEntity[i], xmlEntityLength[i]) == 0) { - itr -= xmlEntityLength[i]; - break; - } - } - if (itr == p) break; - p = itr; - } - return itr; -} - - -static const char* _skipWhiteSpacesAndXmlEntities(const char* itr, const char* itrEnd) -{ - itr = _simpleXmlSkipWhiteSpace(itr, itrEnd); - auto p = itr; - while (true) { - if (p != (itr = _simpleXmlSkipXmlEntities(itr, itrEnd))) p = itr; - else break; - if (p != (itr = _simpleXmlSkipWhiteSpace(itr, itrEnd))) p = itr; - else break; - } - return itr; -} - - -static const char* _unskipWhiteSpacesAndXmlEntities(const char* itr, const char* itrStart) -{ - itr = _simpleXmlUnskipWhiteSpace(itr, itrStart); - auto p = itr; - while (true) { - if (p != (itr = _simpleXmlUnskipXmlEntities(itr, itrStart))) p = itr; - else break; - if (p != (itr = _simpleXmlUnskipWhiteSpace(itr, itrStart))) p = itr; - else break; - } - return itr; -} - - -static const char* _simpleXmlFindStartTag(const char* itr, const char* itrEnd) -{ - return (const char*)memchr(itr, '<', itrEnd - itr); -} - - -static const char* _simpleXmlFindEndTag(const char* itr, const char* itrEnd) -{ - bool insideQuote[2] = {false, false}; // 0: ", 1: ' - for (; itr < itrEnd; itr++) { - if (*itr == '"' && !insideQuote[1]) insideQuote[0] = !insideQuote[0]; - if (*itr == '\'' && !insideQuote[0]) insideQuote[1] = !insideQuote[1]; - if (!insideQuote[0] && !insideQuote[1]) { - if ((*itr == '>') || (*itr == '<')) - return itr; - } - } - return nullptr; -} - - -static const char* _simpleXmlFindEndCommentTag(const char* itr, const char* itrEnd) -{ - for (; itr < itrEnd; itr++) { - if ((*itr == '-') && ((itr + 1 < itrEnd) && (*(itr + 1) == '-')) && ((itr + 2 < itrEnd) && (*(itr + 2) == '>'))) return itr + 2; - } - return nullptr; -} - - -static const char* _simpleXmlFindEndCdataTag(const char* itr, const char* itrEnd) -{ - for (; itr < itrEnd; itr++) { - if ((*itr == ']') && ((itr + 1 < itrEnd) && (*(itr + 1) == ']')) && ((itr + 2 < itrEnd) && (*(itr + 2) == '>'))) return itr + 2; - } - return nullptr; -} - - -static const char* _simpleXmlFindDoctypeChildEndTag(const char* itr, const char* itrEnd) -{ - for (; itr < itrEnd; itr++) { - if (*itr == '>') return itr; - } - return nullptr; -} - - -static SimpleXMLType _getXMLType(const char* itr, const char* itrEnd, size_t &toff) -{ - toff = 0; - if (itr[1] == '/') { - toff = 1; - return SimpleXMLType::Close; - } else if (itr[1] == '?') { - toff = 1; - return SimpleXMLType::Processing; - } else if (itr[1] == '!') { - if ((itr + sizeof("") - 1 < itrEnd) && (!memcmp(itr + 2, "DOCTYPE", sizeof("DOCTYPE") - 1)) && ((itr[2 + sizeof("DOCTYPE") - 1] == '>') || (isspace((unsigned char)itr[2 + sizeof("DOCTYPE") - 1])))) { - toff = sizeof("!DOCTYPE") - 1; - return SimpleXMLType::Doctype; - } else if ((itr + sizeof("") - 1 < itrEnd) && (!memcmp(itr + 2, "[CDATA[", sizeof("[CDATA[") - 1))) { - toff = sizeof("![CDATA[") - 1; - return SimpleXMLType::CData; - } else if ((itr + sizeof("") - 1 < itrEnd) && (!memcmp(itr + 2, "--", sizeof("--") - 1))) { - toff = sizeof("!--") - 1; - return SimpleXMLType::Comment; - } else if (itr + sizeof("") - 1 < itrEnd) { - toff = sizeof("!") - 1; - return SimpleXMLType::DoctypeChild; - } - return SimpleXMLType::Open; - } - return SimpleXMLType::Open; -} - - -/************************************************************************/ -/* External Class Implementation */ -/************************************************************************/ - -const char* simpleXmlNodeTypeToString(TVG_UNUSED SvgNodeType type) -{ -#ifdef THORVG_LOG_ENABLED - static const char* TYPE_NAMES[] = { - "Svg", - "G", - "Defs", - "Animation", - "Arc", - "Circle", - "Ellipse", - "Image", - "Line", - "Path", - "Polygon", - "Polyline", - "Rect", - "Text", - "TextArea", - "Tspan", - "Use", - "Video", - "ClipPath", - "Mask", - "Symbol", - "Unknown", - }; - return TYPE_NAMES[(int) type]; -#endif - return nullptr; -} - - -bool isIgnoreUnsupportedLogElements(TVG_UNUSED const char* tagName) -{ -#ifdef THORVG_LOG_ENABLED - const auto elementsNum = 1; - const char* const elements[] = { "title" }; - - for (unsigned int i = 0; i < elementsNum; ++i) { - if (!strncmp(tagName, elements[i], strlen(tagName))) { - return true; - } - } - return false; -#else - return true; -#endif -} - - -bool simpleXmlParseAttributes(const char* buf, unsigned bufLength, simpleXMLAttributeCb func, const void* data) -{ - const char *itr = buf, *itrEnd = buf + bufLength; - char* tmpBuf = (char*)malloc(bufLength + 1); - - if (!buf || !func || !tmpBuf) goto error; - - while (itr < itrEnd) { - const char* p = _skipWhiteSpacesAndXmlEntities(itr, itrEnd); - const char *key, *keyEnd, *value, *valueEnd; - char* tval; - - if (p == itrEnd) goto success; - - key = p; - for (keyEnd = key; keyEnd < itrEnd; keyEnd++) { - if ((*keyEnd == '=') || (isspace((unsigned char)*keyEnd))) break; - } - if (keyEnd == itrEnd) goto error; - if (keyEnd == key) { // There is no key. This case is invalid, but explores the following syntax. - itr = keyEnd + 1; - continue; - } - - if (*keyEnd == '=') value = keyEnd + 1; - else { - value = (const char*)memchr(keyEnd, '=', itrEnd - keyEnd); - if (!value) goto error; - value++; - } - keyEnd = _simpleXmlUnskipXmlEntities(keyEnd, key); - - value = _skipWhiteSpacesAndXmlEntities(value, itrEnd); - if (value == itrEnd) goto error; - - if ((*value == '"') || (*value == '\'')) { - valueEnd = (const char*)memchr(value + 1, *value, itrEnd - value); - if (!valueEnd) goto error; - value++; - } else { - valueEnd = _simpleXmlFindWhiteSpace(value, itrEnd); - } - - itr = valueEnd + 1; - - value = _skipWhiteSpacesAndXmlEntities(value, itrEnd); - valueEnd = _unskipWhiteSpacesAndXmlEntities(valueEnd, value); - - memcpy(tmpBuf, key, keyEnd - key); - tmpBuf[keyEnd - key] = '\0'; - - tval = tmpBuf + (keyEnd - key) + 1; - int i = 0; - while (value < valueEnd) { - value = _simpleXmlSkipXmlEntities(value, valueEnd); - tval[i++] = *value; - value++; - } - tval[i] = '\0'; - - if (!func((void*)data, tmpBuf, tval)) { - if (!_isIgnoreUnsupportedLogAttributes(tmpBuf, tval)) { - TVGLOG("SVG", "Unsupported attributes used [Elements type: %s][Id : %s][Attribute: %s][Value: %s]", simpleXmlNodeTypeToString(((SvgLoaderData*)data)->svgParse->node->type), ((SvgLoaderData*)data)->svgParse->node->id ? ((SvgLoaderData*)data)->svgParse->node->id : "NO_ID", tmpBuf, tval ? tval : "NONE"); - } - } - } - -success: - free(tmpBuf); - return true; - -error: - free(tmpBuf); - return false; -} - - -bool simpleXmlParse(const char* buf, unsigned bufLength, bool strip, simpleXMLCb func, const void* data) -{ - const char *itr = buf, *itrEnd = buf + bufLength; - - if (!buf || !func) return false; - - while (itr < itrEnd) { - if (itr[0] == '<') { - //Invalid case - if (itr + 1 >= itrEnd) return false; - - size_t toff = 0; - SimpleXMLType type = _getXMLType(itr, itrEnd, toff); - - const char* p; - if (type == SimpleXMLType::CData) p = _simpleXmlFindEndCdataTag(itr + 1 + toff, itrEnd); - else if (type == SimpleXMLType::DoctypeChild) p = _simpleXmlFindDoctypeChildEndTag(itr + 1 + toff, itrEnd); - else if (type == SimpleXMLType::Comment) p = _simpleXmlFindEndCommentTag(itr + 1 + toff, itrEnd); - else p = _simpleXmlFindEndTag(itr + 1 + toff, itrEnd); - - if (p) { - //Invalid case: '<' nested - if (*p == '<' && type != SimpleXMLType::Doctype) return false; - const char *start, *end; - - start = itr + 1 + toff; - end = p; - - switch (type) { - case SimpleXMLType::Open: { - if (p[-1] == '/') { - type = SimpleXMLType::OpenEmpty; - end--; - } - break; - } - case SimpleXMLType::CData: { - if (!memcmp(p - 2, "]]", 2)) end -= 2; - break; - } - case SimpleXMLType::Processing: { - if (p[-1] == '?') end--; - break; - } - case SimpleXMLType::Comment: { - if (!memcmp(p - 2, "--", 2)) end -= 2; - break; - } - default: { - break; - } - } - - if (strip && (type != SimpleXMLType::CData)) { - start = _skipWhiteSpacesAndXmlEntities(start, end); - end = _unskipWhiteSpacesAndXmlEntities(end, start); - } - - if (!func((void*)data, type, start, (unsigned int)(end - start))) return false; - - itr = p + 1; - } else { - return false; - } - } else { - const char *p, *end; - - if (strip) { - p = itr; - p = _skipWhiteSpacesAndXmlEntities(p, itrEnd); - if (p) { - if (!func((void*)data, SimpleXMLType::Ignored, itr, (unsigned int)(p - itr))) return false; - itr = p; - } - } - - p = _simpleXmlFindStartTag(itr, itrEnd); - if (!p) p = itrEnd; - - end = p; - if (strip) end = _unskipWhiteSpacesAndXmlEntities(end, itr); - - if (itr != end && !func((void*)data, SimpleXMLType::Data, itr, (unsigned int)(end - itr))) return false; - - if (strip && (end < p) && !func((void*)data, SimpleXMLType::Ignored, end, (unsigned int)(p - end))) return false; - - itr = p; - } - } - return true; -} - - -bool simpleXmlParseW3CAttribute(const char* buf, unsigned bufLength, simpleXMLAttributeCb func, const void* data) -{ - const char* end; - char* key; - char* val; - char* next; - - if (!buf) return false; - - end = buf + bufLength; - key = (char*)alloca(end - buf + 1); - val = (char*)alloca(end - buf + 1); - - if (buf == end) return true; - - do { - char* sep = (char*)strchr(buf, ':'); - next = (char*)strchr(buf, ';'); - if (sep >= end) { - next = nullptr; - sep = nullptr; - } - if (next >= end) next = nullptr; - - key[0] = '\0'; - val[0] = '\0'; - - if (next == nullptr && sep != nullptr) { - memcpy(key, buf, sep - buf); - key[sep - buf] = '\0'; - - memcpy(val, sep + 1, end - sep - 1); - val[end - sep - 1] = '\0'; - } else if (sep < next && sep != nullptr) { - memcpy(key, buf, sep - buf); - key[sep - buf] = '\0'; - - memcpy(val, sep + 1, next - sep - 1); - val[next - sep - 1] = '\0'; - } else if (next) { - memcpy(key, buf, next - buf); - key[next - buf] = '\0'; - } - - if (key[0]) { - key = const_cast(_simpleXmlSkipWhiteSpace(key, key + strlen(key))); - key[_simpleXmlUnskipWhiteSpace(key + strlen(key) , key) - key] = '\0'; - val = const_cast(_simpleXmlSkipWhiteSpace(val, val + strlen(val))); - val[_simpleXmlUnskipWhiteSpace(val + strlen(val) , val) - val] = '\0'; - - if (!func((void*)data, key, val)) { - if (!_isIgnoreUnsupportedLogAttributes(key, val)) { - TVGLOG("SVG", "Unsupported attributes used [Elements type: %s][Id : %s][Attribute: %s][Value: %s]", simpleXmlNodeTypeToString(((SvgLoaderData*)data)->svgParse->node->type), ((SvgLoaderData*)data)->svgParse->node->id ? ((SvgLoaderData*)data)->svgParse->node->id : "NO_ID", key, val ? val : "NONE"); - } - } - } - - buf = next + 1; - } while (next != nullptr); - - return true; -} - - -/* - * Supported formats: - * tag {}, .name {}, tag.name{} - */ -const char* simpleXmlParseCSSAttribute(const char* buf, unsigned bufLength, char** tag, char** name, const char** attrs, unsigned* attrsLength) -{ - if (!buf) return nullptr; - - *tag = *name = nullptr; - *attrsLength = 0; - - auto itr = _simpleXmlSkipWhiteSpace(buf, buf + bufLength); - auto itrEnd = (const char*)memchr(buf, '{', bufLength); - - if (!itrEnd || itr == itrEnd) return nullptr; - - auto nextElement = (const char*)memchr(itrEnd, '}', bufLength - (itrEnd - buf)); - if (!nextElement) return nullptr; - - *attrs = itrEnd + 1; - *attrsLength = nextElement - *attrs; - - const char *p; - - itrEnd = _simpleXmlUnskipWhiteSpace(itrEnd, itr); - if (*(itrEnd - 1) == '.') return nullptr; - - for (p = itr; p < itrEnd; p++) { - if (*p == '.') break; - } - - if (p == itr) *tag = strdup("all"); - else *tag = strDuplicate(itr, p - itr); - - if (p == itrEnd) *name = nullptr; - else *name = strDuplicate(p + 1, itrEnd - p - 1); - - return (nextElement ? nextElement + 1 : nullptr); -} - - -const char* simpleXmlFindAttributesTag(const char* buf, unsigned bufLength) -{ - const char *itr = buf, *itrEnd = buf + bufLength; - - for (; itr < itrEnd; itr++) { - if (!isspace((unsigned char)*itr)) { - //User skip tagname and already gave it the attributes. - if (*itr == '=') return buf; - } else { - itr = _simpleXmlUnskipXmlEntities(itr, buf); - if (itr == itrEnd) return nullptr; - return itr; - } - } - - return nullptr; -} - -#endif /* LV_USE_THORVG_INTERNAL */ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgXmlParser.h b/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgXmlParser.h deleted file mode 100644 index be08068..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/thorvg/tvgXmlParser.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. - - * 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 "../../lv_conf_internal.h" -#if LV_USE_THORVG_INTERNAL - -#ifndef _TVG_SIMPLE_XML_PARSER_H_ -#define _TVG_SIMPLE_XML_PARSER_H_ - -#include "tvgSvgLoaderCommon.h" - -#define NUMBER_OF_XML_ENTITIES 9 -const char* const xmlEntity[] = {" ", """, " ", "'", "&", "<", ">", "#", "'"}; -const int xmlEntityLength[] = {5, 6, 6, 6, 5, 4, 4, 6, 6}; - -enum class SimpleXMLType -{ - Open = 0, //!< \ - OpenEmpty, //!< \ - Close, //!< \ - Data, //!< tag text data - CData, //!< \ - Error, //!< error contents - Processing, //!< \ \ - Doctype, //!< \ - Ignored, //!< whatever is ignored by parser, like whitespace - DoctypeChild //!< \font_draw_buf_handlers) - -/********************* - * DEFINES - *********************/ - -#define STB_RECT_PACK_IMPLEMENTATION -#define STBRP_STATIC -#define STBTT_STATIC -#define STB_TRUETYPE_IMPLEMENTATION -#define STBTT_HEAP_FACTOR_SIZE_32 50 -#define STBTT_HEAP_FACTOR_SIZE_128 20 -#define STBTT_HEAP_FACTOR_SIZE_DEFAULT 10 -#define STBTT_malloc(x, u) ((void)(u), lv_malloc(x)) -#define STBTT_free(x, u) ((void)(u), lv_free(x)) - -#if LV_TINY_TTF_FILE_SUPPORT != 0 -/* for stream support */ -#define STBTT_STREAM_TYPE ttf_cb_stream_t * -#define STBTT_STREAM_SEEK(s, x) ttf_cb_stream_seek(s, x); -#define STBTT_STREAM_READ(s, x, y) ttf_cb_stream_read(s, x, y); - -/* a hydra stream that can be in memory or from a file*/ -typedef struct ttf_cb_stream { - lv_fs_file_t * file; - const void * data; - size_t size; - size_t position; -} ttf_cb_stream_t; - -static void ttf_cb_stream_read(ttf_cb_stream_t * stream, void * data, size_t to_read); -static void ttf_cb_stream_seek(ttf_cb_stream_t * stream, size_t position); -#endif - -#include "stb_rect_pack.h" -#include "stb_truetype_htcw.h" - -/********************** - * TYPEDEFS - **********************/ - -typedef struct ttf_font_desc { - lv_fs_file_t file; -#if LV_TINY_TTF_FILE_SUPPORT != 0 - ttf_cb_stream_t stream; -#else - const uint8_t * stream; -#endif - stbtt_fontinfo info; - float scale; - int ascent; - int descent; - - lv_font_kerning_t kerning; - - int cache_size; - lv_cache_t * glyph_cache; - lv_cache_t * draw_data_cache; -} ttf_font_desc_t; - -typedef struct _tiny_ttf_glyph_cache_data_t { - uint32_t unicode; - int adv_w; - lv_font_glyph_dsc_t glyph_dsc; -} tiny_ttf_glyph_cache_data_t; - -typedef struct lv_tiny_ttf_cache_data_t { - uint32_t glyph_index; - uint32_t size; - lv_draw_buf_t * draw_buf; -} tiny_ttf_cache_data_t; -/********************** - * STATIC PROTOTYPES - **********************/ -static bool ttf_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, - uint32_t unicode_letter_next); -static const void * ttf_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf); -static void ttf_release_glyph_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc); -static lv_font_t * lv_tiny_ttf_create(const char * path, const void * data, size_t data_size, - int32_t font_size, lv_font_kerning_t kerning, - size_t cache_size); - -static bool tiny_ttf_glyph_cache_create_cb(tiny_ttf_glyph_cache_data_t * node, void * user_data); -static void tiny_ttf_glyph_cache_free_cb(tiny_ttf_glyph_cache_data_t * node, void * user_data); -static lv_cache_compare_res_t tiny_ttf_glyph_cache_compare_cb(const tiny_ttf_glyph_cache_data_t * lhs, - const tiny_ttf_glyph_cache_data_t * rhs); - -static bool tiny_ttf_draw_data_cache_create_cb(tiny_ttf_cache_data_t * node, void * user_data); -static void tiny_ttf_draw_data_cache_free_cb(tiny_ttf_cache_data_t * node, void * user_data); -static lv_cache_compare_res_t tiny_ttf_draw_data_cache_compare_cb(const tiny_ttf_cache_data_t * lhs, - const tiny_ttf_cache_data_t * rhs); - -static void lv_tiny_ttf_cache_create(ttf_font_desc_t * dsc); -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_tiny_ttf_set_size(lv_font_t * font, int32_t font_size) -{ - if(font_size <= 0) { - LV_LOG_ERROR("invalid font size: %"LV_PRIx32, font_size); - return; - } - ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; - dsc->scale = stbtt_ScaleForMappingEmToPixels(&dsc->info, font_size); - int line_gap = 0; - stbtt_GetFontVMetrics(&dsc->info, &dsc->ascent, &dsc->descent, &line_gap); - font->line_height = (int32_t)(dsc->scale * (dsc->ascent - dsc->descent + line_gap)); - font->base_line = (int32_t)(dsc->scale * (line_gap - dsc->descent)); - - /* size change means cache needs to be invalidated. */ - - if(dsc->glyph_cache) { - lv_cache_destroy(dsc->glyph_cache, NULL); - dsc->glyph_cache = NULL; - } - - if(dsc->draw_data_cache) { - lv_cache_destroy(dsc->draw_data_cache, NULL); - dsc->draw_data_cache = NULL; - } - - lv_tiny_ttf_cache_create(dsc); -} - -void lv_tiny_ttf_destroy(lv_font_t * font) -{ - LV_ASSERT_NULL(font); - - if(font->dsc != NULL) { - ttf_font_desc_t * ttf = (ttf_font_desc_t *)font->dsc; -#if LV_TINY_TTF_FILE_SUPPORT != 0 - if(ttf->stream.file != NULL) { - lv_fs_close(&ttf->file); - } -#endif - lv_cache_destroy(ttf->glyph_cache, NULL); - lv_cache_destroy(ttf->draw_data_cache, NULL); - lv_free(ttf); - font->dsc = NULL; - } - - lv_free(font); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#if LV_TINY_TTF_FILE_SUPPORT != 0 -static void ttf_cb_stream_read(ttf_cb_stream_t * stream, void * data, size_t to_read) -{ - if(stream->file != NULL) { - uint32_t br; - lv_fs_read(stream->file, data, to_read, &br); - } - else { - if(to_read + stream->position >= stream->size) { - to_read = stream->size - stream->position; - } - memcpy(data, ((const unsigned char *)stream->data + stream->position), to_read); - stream->position += to_read; - } -} -static void ttf_cb_stream_seek(ttf_cb_stream_t * stream, size_t position) -{ - if(stream->file != NULL) { - lv_fs_seek(stream->file, position, LV_FS_SEEK_SET); - } - else { - if(position > stream->size) { - stream->position = stream->size; - } - else { - stream->position = position; - } - } -} -#endif - -static bool ttf_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, - uint32_t unicode_letter_next) -{ - if(unicode_letter < 0x20 || - unicode_letter == 0xf8ff || /*LV_SYMBOL_DUMMY*/ - unicode_letter == 0x200c) { /*ZERO WIDTH NON-JOINER*/ - dsc_out->box_w = 0; - dsc_out->adv_w = 0; - dsc_out->box_h = 0; /*height of the bitmap in [px]*/ - dsc_out->ofs_x = 0; /*X offset of the bitmap in [pf]*/ - dsc_out->ofs_y = 0; /*Y offset of the bitmap in [pf]*/ - dsc_out->format = LV_FONT_GLYPH_FORMAT_NONE; - dsc_out->is_placeholder = false; - return true; - } - - ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; - - tiny_ttf_glyph_cache_data_t search_key = { - .unicode = unicode_letter, - }; - - int adv_w; - lv_cache_entry_t * entry = lv_cache_acquire_or_create(dsc->glyph_cache, &search_key, (void *)dsc); - - if(entry == NULL) { - if(!dsc->cache_size) { /* no cache, do everything directly */ - uint32_t g1 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter); - tiny_ttf_glyph_cache_create_cb(&search_key, dsc); - *dsc_out = search_key.glyph_dsc; - adv_w = search_key.adv_w; - - /*Kerning correction*/ - if(font->kerning == LV_FONT_KERNING_NORMAL && - unicode_letter_next != 0) { - int g2 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter_next); /* not using cache, only do glyph id lookup */ - if(g2) { - int k = stbtt_GetGlyphKernAdvance(&dsc->info, g1, g2); - dsc_out->adv_w = (uint16_t)floor((((float)adv_w + (float)k) * dsc->scale) + - 0.5f); /*Horizontal space required by the glyph in [px]*/ - } - } - - dsc_out->entry = NULL; - return true; - } - LV_LOG_ERROR("cache not allocated"); - return false; - } - - tiny_ttf_glyph_cache_data_t * data = lv_cache_entry_get_data(entry); - *dsc_out = data->glyph_dsc; - adv_w = data->adv_w; - lv_cache_release(dsc->glyph_cache, entry, NULL); - - /*Kerning correction*/ - if(font->kerning == LV_FONT_KERNING_NORMAL && - unicode_letter_next != 0) { /* check if we need to do any kerning calculations */ - uint32_t g1 = dsc_out->gid.index; - - int g2 = 0; - search_key.unicode = unicode_letter_next; /* reuse search key */ - lv_cache_entry_t * entry_next = lv_cache_acquire_or_create(dsc->glyph_cache, &search_key, (void *)dsc); - - if(entry_next == NULL) - g2 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter_next); - else { - tiny_ttf_glyph_cache_data_t * data_next = lv_cache_entry_get_data(entry_next); - g2 = data_next->glyph_dsc.gid.index; - lv_cache_release(dsc->glyph_cache, entry_next, NULL); - } - - if(g2) { - int k = stbtt_GetGlyphKernAdvance(&dsc->info, g1, g2); - dsc_out->adv_w = (uint16_t)floor((((float)adv_w + (float)k) * dsc->scale) + - 0.5f); /*Horizontal space required by the glyph in [px]*/ - } - } - - dsc_out->entry = NULL; - return true; /*true: glyph found; false: glyph was not found*/ -} - -static const void * ttf_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf) -{ - LV_UNUSED(draw_buf); - uint32_t glyph_index = g_dsc->gid.index; - const lv_font_t * font = g_dsc->resolved_font; - ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; - tiny_ttf_cache_data_t search_key = { - .glyph_index = glyph_index, - .size = font->line_height, - }; - - lv_cache_entry_t * entry = lv_cache_acquire_or_create(dsc->draw_data_cache, &search_key, (void *)font->dsc); - if(entry == NULL) { - if(!dsc->cache_size) { /* no cache, do everything directly */ - if(tiny_ttf_draw_data_cache_create_cb(&search_key, (void *)font->dsc)) { - /* use the cache entry to store the buffer if no cache specified */ - g_dsc->entry = (lv_cache_entry_t *)search_key.draw_buf; - return g_dsc->entry; - } - else { - return NULL; - } - } - LV_LOG_ERROR("cache not allocated"); - return NULL; - } - - g_dsc->entry = entry; - tiny_ttf_cache_data_t * cached_data = lv_cache_entry_get_data(entry); - return cached_data->draw_buf; -} - -static void ttf_release_glyph_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc) -{ - LV_ASSERT_NULL(font); - - ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; - if(!dsc->cache_size) { /* no cache, do everything directly */ - lv_draw_buf_destroy_user(font_draw_buf_handlers, (lv_draw_buf_t *)g_dsc->entry); - } - else { - if(g_dsc->entry == NULL) { - return; - } - lv_cache_release(dsc->draw_data_cache, g_dsc->entry, NULL); - } - g_dsc->entry = NULL; -} - -static void lv_tiny_ttf_cache_create(ttf_font_desc_t * dsc) -{ - /*Init cache*/ - dsc->glyph_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(tiny_ttf_glyph_cache_data_t), dsc->cache_size, - (lv_cache_ops_t) { - .compare_cb = (lv_cache_compare_cb_t)tiny_ttf_glyph_cache_compare_cb, - .create_cb = (lv_cache_create_cb_t)tiny_ttf_glyph_cache_create_cb, - .free_cb = (lv_cache_free_cb_t)tiny_ttf_glyph_cache_free_cb - }); - lv_cache_set_name(dsc->glyph_cache, "TINY_TTF_GLYPH"); - - dsc->draw_data_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(tiny_ttf_cache_data_t), dsc->cache_size, - (lv_cache_ops_t) { - .compare_cb = (lv_cache_compare_cb_t)tiny_ttf_draw_data_cache_compare_cb, - .create_cb = (lv_cache_create_cb_t)tiny_ttf_draw_data_cache_create_cb, - .free_cb = (lv_cache_free_cb_t)tiny_ttf_draw_data_cache_free_cb, - }); - lv_cache_set_name(dsc->draw_data_cache, "TINY_TTF_DRAW_DATA"); -} - -static lv_font_t * lv_tiny_ttf_create(const char * path, const void * data, size_t data_size, int32_t font_size, - lv_font_kerning_t kerning, size_t cache_size) -{ - LV_UNUSED(data_size); - if((path == NULL && data == NULL) || 0 >= font_size) { - LV_LOG_ERROR("tiny_ttf: invalid argument"); - return NULL; - } - ttf_font_desc_t * dsc = lv_malloc_zeroed(sizeof(ttf_font_desc_t)); - if(dsc == NULL) { - LV_LOG_ERROR("tiny_ttf: out of memory"); - return NULL; - } -#if LV_TINY_TTF_FILE_SUPPORT != 0 - if(path != NULL) { - if(LV_FS_RES_OK != lv_fs_open(&dsc->file, path, LV_FS_MODE_RD)) { - lv_free(dsc); - LV_LOG_ERROR("tiny_ttf: unable to open %s\n", path); - return NULL; - } - dsc->stream.file = &dsc->file; - } - else { - dsc->stream.data = (const uint8_t *)data; - dsc->stream.size = data_size; - } - if(0 == stbtt_InitFont(&dsc->info, &dsc->stream, stbtt_GetFontOffsetForIndex(&dsc->stream, 0))) { - lv_free(dsc); - LV_LOG_ERROR("tiny_ttf: init failed"); - return NULL; - } - -#else - dsc->stream = (const uint8_t *)data; - if(0 == stbtt_InitFont(&dsc->info, dsc->stream, stbtt_GetFontOffsetForIndex(dsc->stream, 0))) { - lv_free(dsc); - LV_LOG_ERROR("tiny_ttf: init failed"); - return NULL; - } -#endif - - dsc->cache_size = cache_size; - - lv_font_t * out_font = lv_malloc_zeroed(sizeof(lv_font_t)); - if(out_font == NULL) { - lv_free(dsc); - LV_LOG_ERROR("tiny_ttf: out of memory"); - return NULL; - } - - /* check if font has kerning tables to use, else disable kerning automatically. */ - if(stbtt_KernTableCheck(&dsc->info) == 0) { - kerning = LV_FONT_KERNING_NONE; /* disable kerning if font has no tables. */ - } - - dsc->kerning = kerning; - out_font->kerning = kerning; - - out_font->get_glyph_dsc = ttf_get_glyph_dsc_cb; - out_font->get_glyph_bitmap = ttf_get_glyph_bitmap_cb; - out_font->release_glyph = ttf_release_glyph_cb; - out_font->dsc = dsc; - lv_tiny_ttf_set_size(out_font, font_size); - return out_font; -} -#if LV_TINY_TTF_FILE_SUPPORT != 0 -lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, int32_t font_size, lv_font_kerning_t kerning, - size_t cache_size) -{ - return lv_tiny_ttf_create(path, NULL, 0, font_size, kerning, cache_size); -} -lv_font_t * lv_tiny_ttf_create_file(const char * path, int32_t font_size) -{ - return lv_tiny_ttf_create(path, NULL, 0, font_size, LV_FONT_KERNING_NORMAL, LV_TINY_TTF_CACHE_GLYPH_CNT); -} -#endif - -lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, int32_t font_size, - lv_font_kerning_t kerning, size_t cache_size) -{ - return lv_tiny_ttf_create(NULL, data, data_size, font_size, kerning, cache_size); -} -lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, int32_t font_size) -{ - return lv_tiny_ttf_create(NULL, data, data_size, font_size, LV_FONT_KERNING_NORMAL, LV_TINY_TTF_CACHE_GLYPH_CNT); -} - -/*----------------- - * Cache Callbacks - *----------------*/ - -static bool tiny_ttf_glyph_cache_create_cb(tiny_ttf_glyph_cache_data_t * node, void * user_data) -{ - ttf_font_desc_t * dsc = (ttf_font_desc_t *)user_data; - lv_font_glyph_dsc_t * dsc_out = &node->glyph_dsc; - - uint32_t unicode_letter = node->unicode; - - int g1 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter); - if(g1 == 0) { - /* Glyph not found */ - return false; - } - int x1, y1, x2, y2; - - stbtt_GetGlyphBitmapBox(&dsc->info, g1, dsc->scale, dsc->scale, &x1, &y1, &x2, &y2); - - int advw, lsb; - stbtt_GetGlyphHMetrics(&dsc->info, g1, &advw, &lsb); - if(dsc->kerning != LV_FONT_KERNING_NORMAL) { /* calculate default advance */ - int k = stbtt_GetGlyphKernAdvance(&dsc->info, g1, 0); - dsc_out->adv_w = (uint16_t)floor((((float)advw + (float)k) * dsc->scale) + - 0.5f); /*Horizontal space required by the glyph in [px]*/ - } - else { - dsc_out->adv_w = (uint16_t)floor(((float)advw * dsc->scale) + - 0.5f); /*Horizontal space required by the glyph in [px]*/; - } - /* precalculate no kerning value */ - node->adv_w = advw; - dsc_out->box_w = (x2 - x1 + 1); /*width of the bitmap in [px]*/ - dsc_out->box_h = (y2 - y1 + 1); /*height of the bitmap in [px]*/ - dsc_out->ofs_x = x1; /*X offset of the bitmap in [pf]*/ - dsc_out->ofs_y = -y2; /*Y offset of the bitmap measured from the as line*/ - dsc_out->format = LV_FONT_GLYPH_FORMAT_A8; - dsc_out->is_placeholder = false; - dsc_out->gid.index = (uint32_t)g1; - - return true; -} - -static void tiny_ttf_glyph_cache_free_cb(tiny_ttf_glyph_cache_data_t * node, void * user_data) -{ - LV_UNUSED(node); - LV_UNUSED(user_data); -} - -static lv_cache_compare_res_t tiny_ttf_glyph_cache_compare_cb(const tiny_ttf_glyph_cache_data_t * lhs, - const tiny_ttf_glyph_cache_data_t * rhs) -{ - if(lhs->unicode != rhs->unicode) { - return lhs->unicode > rhs->unicode ? 1 : -1; - } - - return 0; -} - -static bool tiny_ttf_draw_data_cache_create_cb(tiny_ttf_cache_data_t * node, void * user_data) -{ - int g1 = (int)node->glyph_index; - if(g1 == 0) { - /* Glyph not found */ - return false; - } - - ttf_font_desc_t * dsc = (ttf_font_desc_t *)user_data; - - const stbtt_fontinfo * info = (const stbtt_fontinfo *)&dsc->info; - int x1, y1, x2, y2; - stbtt_GetGlyphBitmapBox(info, g1, dsc->scale, dsc->scale, &x1, &y1, &x2, &y2); - int w, h; - w = x2 - x1 + 1; - h = y2 - y1 + 1; - - lv_draw_buf_t * draw_buf = lv_draw_buf_create_ex(font_draw_buf_handlers, w, h, LV_COLOR_FORMAT_A8, LV_STRIDE_AUTO); - if(NULL == draw_buf) { - LV_LOG_ERROR("tiny_ttf: out of memory"); - return false; - } - - lv_draw_buf_clear(draw_buf, NULL); - - uint32_t stride = draw_buf->header.stride; - stbtt_MakeGlyphBitmap(info, draw_buf->data, w, h, stride, dsc->scale, dsc->scale, g1); - - node->draw_buf = draw_buf; - return true; -} - -static void tiny_ttf_draw_data_cache_free_cb(tiny_ttf_cache_data_t * node, void * user_data) -{ - LV_UNUSED(user_data); - - lv_draw_buf_destroy(node->draw_buf); -} - -static lv_cache_compare_res_t tiny_ttf_draw_data_cache_compare_cb(const tiny_ttf_cache_data_t * lhs, - const tiny_ttf_cache_data_t * rhs) -{ - if(lhs->glyph_index != rhs->glyph_index) { - return lhs->glyph_index > rhs->glyph_index ? 1 : -1; - } - - if(lhs->size != rhs->size) { - return lhs->size > rhs->size ? 1 : -1; - } - - return 0; -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/tiny_ttf/lv_tiny_ttf.h b/software/Power_Pico/Middlewares/LVGL/src/libs/tiny_ttf/lv_tiny_ttf.h deleted file mode 100644 index b6e7dc0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/tiny_ttf/lv_tiny_ttf.h +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @file lv_tiny_ttf.h - * - */ - -#ifndef LV_TINY_TTF_H -#define LV_TINY_TTF_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -#if LV_USE_TINY_TTF - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -#if LV_TINY_TTF_FILE_SUPPORT != 0 -/** - * Create a font from the specified file or path with the specified line height. - * @param path the path or file name of the font - * @param font_size the font size in pixel - * @return a font object - */ -lv_font_t * lv_tiny_ttf_create_file(const char * path, int32_t font_size); - -/** - * Create a font from the specified file or path with the specified line height with the specified cache size. - * @param path the path or file name of the font - * @param font_size the font size in pixel - * @param kerning kerning value in pixel - * @param cache_size the cache size in count - * @return a font object - */ -lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, int32_t font_size, lv_font_kerning_t kerning, - size_t cache_size); -#endif - -/** - * Create a font from the specified data pointer with the specified line height. - * @param data the data pointer - * @param data_size the data size - * @param font_size the font size in pixel - * @return a font object - */ -lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, int32_t font_size); - -/** - * Create a font from the specified data pointer with the specified line height and the specified cache size. - * @param data the data pointer - * @param data_size the data size - * @param font_size the font size in pixel - * @param kerning kerning value in pixel - * @param cache_size the cache size in count - * @return - */ -lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, int32_t font_size, - lv_font_kerning_t kerning, size_t cache_size); - -/** - * Set the size of the font to a new font_size - * @note the font bitmap cache and glyph cache will be flushed. - * @param font the font object - * @param font_size the font size in pixel - */ -void lv_tiny_ttf_set_size(lv_font_t * font, int32_t font_size); - -/** - * Destroy a font previously created with lv_tiny_ttf_create_xxxx() - * @param font the font object - */ -void lv_tiny_ttf_destroy(lv_font_t * font); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_TINY_TTF*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TINY_TTF_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/tiny_ttf/stb_rect_pack.h b/software/Power_Pico/Middlewares/LVGL/src/libs/tiny_ttf/stb_rect_pack.h deleted file mode 100644 index b4c8b4d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/tiny_ttf/stb_rect_pack.h +++ /dev/null @@ -1,633 +0,0 @@ -// stb_rect_pack.h - v1.01 - public domain - rectangle packing -// Sean Barrett 2014 -// -// Useful for e.g. packing rectangular textures into an atlas. -// Does not do rotation. -// -// Before #including, -// -// #define STB_RECT_PACK_IMPLEMENTATION -// -// in the file that you want to have the implementation. -// -// Not necessarily the awesomest packing method, but better than -// the totally naive one in stb_truetype (which is primarily what -// this is meant to replace). -// -// Has only had a few tests run, may have issues. -// -// More docs to come. -// -// No memory allocations; uses qsort() and assert() from stdlib. -// Can override those by defining STBRP_SORT and STBRP_ASSERT. -// -// This library currently uses the Skyline Bottom-Left algorithm. -// -// Please note: better rectangle packers are welcome! Please -// implement them to the same API, but with a different init -// function. -// -// Credits -// -// Library -// Sean Barrett -// Minor features -// Martins Mozeiko -// github:IntellectualKitty -// -// Bugfixes / warning fixes -// Jeremy Jaussaud -// Fabian Giesen -// -// Version history: -// -// 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section -// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles -// 0.99 (2019-02-07) warning fixes -// 0.11 (2017-03-03) return packing success/fail result -// 0.10 (2016-10-25) remove cast-away-const to avoid warnings -// 0.09 (2016-08-27) fix compiler warnings -// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0) -// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0) -// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort -// 0.05: added STBRP_ASSERT to allow replacing assert -// 0.04: fixed minor bug in STBRP_LARGE_RECTS support -// 0.01: initial release -// -// LICENSE -// -// See end of file for license information. - -////////////////////////////////////////////////////////////////////////////// -// -// INCLUDE SECTION -// - -#ifndef STB_INCLUDE_STB_RECT_PACK_H -#define STB_INCLUDE_STB_RECT_PACK_H - -#define STB_RECT_PACK_VERSION 1 - -#ifdef STBRP_STATIC - #define STBRP_DEF static -#else - #define STBRP_DEF extern -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/// @cond -/** - * Tells Doxygen to ignore a duplicate declaration - */ -typedef struct stbrp_context stbrp_context; -typedef struct stbrp_node stbrp_node; -typedef struct stbrp_rect stbrp_rect; -/// @endcond - -typedef int stbrp_coord; - -#define STBRP__MAXVAL 0x7fffffff -// Mostly for internal use, but this is the maximum supported coordinate value. - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -#endif - -STBRP_DEF int stbrp_pack_rects(stbrp_context * context, stbrp_rect * rects, int num_rects); -// Assign packed locations to rectangles. The rectangles are of type -// 'stbrp_rect' defined below, stored in the array 'rects', and there -// are 'num_rects' many of them. -// -// Rectangles which are successfully packed have the 'was_packed' flag -// set to a non-zero value and 'x' and 'y' store the minimum location -// on each axis (i.e. bottom-left in cartesian coordinates, top-left -// if you imagine y increasing downwards). Rectangles which do not fit -// have the 'was_packed' flag set to 0. -// -// You should not try to access the 'rects' array from another thread -// while this function is running, as the function temporarily reorders -// the array while it executes. -// -// To pack into another rectangle, you need to call stbrp_init_target -// again. To continue packing into the same rectangle, you can call -// this function again. Calling this multiple times with multiple rect -// arrays will probably produce worse packing results than calling it -// a single time with the full rectangle array, but the option is -// available. -// -// The function returns 1 if all of the rectangles were successfully -// packed and 0 otherwise. - -struct stbrp_rect { - // reserved for your use: - int id; - - // input: - stbrp_coord w, h; - - // output: - stbrp_coord x, y; - int was_packed; // non-zero if valid packing - -}; // 16 bytes, nominally - -STBRP_DEF void stbrp_init_target(stbrp_context * context, int width, int height, stbrp_node * nodes, int num_nodes); -// Initialize a rectangle packer to: -// pack a rectangle that is 'width' by 'height' in dimensions -// using temporary storage provided by the array 'nodes', which is 'num_nodes' long -// -// You must call this function every time you start packing into a new target. -// -// There is no "shutdown" function. The 'nodes' memory must stay valid for -// the following stbrp_pack_rects() call (or calls), but can be freed after -// the call (or calls) finish. -// -// Note: to guarantee best results, either: -// 1. make sure 'num_nodes' >= 'width' -// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1' -// -// If you don't do either of the above things, widths will be quantized to multiples -// of small integers to guarantee the algorithm doesn't run out of temporary storage. -// -// If you do #2, then the non-quantized algorithm will be used, but the algorithm -// may run out of temporary storage and be unable to pack some rectangles. - -STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context * context, int allow_out_of_mem); -// Optionally call this function after init but before doing any packing to -// change the handling of the out-of-temp-memory scenario, described above. -// If you call init again, this will be reset to the default (false). - -STBRP_DEF void stbrp_setup_heuristic(stbrp_context * context, int heuristic); -// Optionally select which packing heuristic the library should use. Different -// heuristics will produce better/worse results for different data sets. -// If you call init again, this will be reset to the default. - -enum { - STBRP_HEURISTIC_Skyline_default = 0, - STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default, - STBRP_HEURISTIC_Skyline_BF_sortHeight -}; - -////////////////////////////////////////////////////////////////////////////// -// -// the details of the following structures don't matter to you, but they must -// be visible so you can handle the memory allocations for them - -struct stbrp_node { - stbrp_coord x, y; - stbrp_node * next; -}; - -struct stbrp_context { - int width; - int height; - int align; - int init_mode; - int heuristic; - int num_nodes; - stbrp_node * active_head; - stbrp_node * free_head; - stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' -}; - -#ifdef __cplusplus -} -#endif - -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// IMPLEMENTATION SECTION -// - -#ifdef STB_RECT_PACK_IMPLEMENTATION -#ifndef STBRP_SORT - #include - #define STBRP_SORT qsort -#endif - -#ifndef STBRP_ASSERT - #include - #define STBRP_ASSERT assert -#endif - -#ifdef _MSC_VER - #define STBRP__NOTUSED(v) (void)(v) - #define STBRP__CDECL __cdecl -#else - #define STBRP__NOTUSED(v) (void)sizeof(v) - #define STBRP__CDECL -#endif - -enum { - STBRP__INIT_skyline = 1 -}; - -STBRP_DEF void stbrp_setup_heuristic(stbrp_context * context, int heuristic) -{ - switch(context->init_mode) { - case STBRP__INIT_skyline: - STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight); - context->heuristic = heuristic; - break; - default: - STBRP_ASSERT(0); - } -} - -STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context * context, int allow_out_of_mem) -{ - if(allow_out_of_mem) - // if it's ok to run out of memory, then don't bother aligning them; - // this gives better packing, but may fail due to OOM (even though - // the rectangles easily fit). @TODO a smarter approach would be to only - // quantize once we've hit OOM, then we could get rid of this parameter. - context->align = 1; - else { - // if it's not ok to run out of memory, then quantize the widths - // so that num_nodes is always enough nodes. - // - // I.e. num_nodes * align >= width - // align >= width / num_nodes - // align = ceil(width/num_nodes) - - context->align = (context->width + context->num_nodes - 1) / context->num_nodes; - } -} - -STBRP_DEF void stbrp_init_target(stbrp_context * context, int width, int height, stbrp_node * nodes, int num_nodes) -{ - int i; - - for(i = 0; i < num_nodes - 1; ++i) - nodes[i].next = &nodes[i + 1]; - nodes[i].next = NULL; - context->init_mode = STBRP__INIT_skyline; - context->heuristic = STBRP_HEURISTIC_Skyline_default; - context->free_head = &nodes[0]; - context->active_head = &context->extra[0]; - context->width = width; - context->height = height; - context->num_nodes = num_nodes; - stbrp_setup_allow_out_of_mem(context, 0); - - // node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) - context->extra[0].x = 0; - context->extra[0].y = 0; - context->extra[0].next = &context->extra[1]; - context->extra[1].x = (stbrp_coord) width; - context->extra[1].y = (1 << 30); - context->extra[1].next = NULL; -} - -// find minimum y position if it starts at x1 -static int stbrp__skyline_find_min_y(stbrp_context * c, stbrp_node * first, int x0, int width, int * pwaste) -{ - stbrp_node * node = first; - int x1 = x0 + width; - int min_y, visited_width, waste_area; - - STBRP__NOTUSED(c); - - STBRP_ASSERT(first->x <= x0); - -#if 0 - // skip in case we're past the node - while(node->next->x <= x0) - ++node; -#else - STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency -#endif - - STBRP_ASSERT(node->x <= x0); - - min_y = 0; - waste_area = 0; - visited_width = 0; - while(node->x < x1) { - if(node->y > min_y) { - // raise min_y higher. - // we've accounted for all waste up to min_y, - // but we'll now add more waste for everything we've visited - waste_area += visited_width * (node->y - min_y); - min_y = node->y; - // the first time through, visited_width might be reduced - if(node->x < x0) - visited_width += node->next->x - x0; - else - visited_width += node->next->x - node->x; - } - else { - // add waste area - int under_width = node->next->x - node->x; - if(under_width + visited_width > width) - under_width = width - visited_width; - waste_area += under_width * (min_y - node->y); - visited_width += under_width; - } - node = node->next; - } - - *pwaste = waste_area; - return min_y; -} - -typedef struct { - int x, y; - stbrp_node ** prev_link; -} stbrp__findresult; - -static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context * c, int width, int height) -{ - int best_waste = (1 << 30), best_x, best_y = (1 << 30); - stbrp__findresult fr; - stbrp_node ** prev, * node, * tail, ** best = NULL; - - // align to multiple of c->align - width = (width + c->align - 1); - width -= width % c->align; - STBRP_ASSERT(width % c->align == 0); - - // if it can't possibly fit, bail immediately - if(width > c->width || height > c->height) { - fr.prev_link = NULL; - fr.x = fr.y = 0; - return fr; - } - - node = c->active_head; - prev = &c->active_head; - while(node->x + width <= c->width) { - int y, waste; - y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste); - if(c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL - // bottom left - if(y < best_y) { - best_y = y; - best = prev; - } - } - else { - // best-fit - if(y + height <= c->height) { - // can only use it if it first vertically - if(y < best_y || (y == best_y && waste < best_waste)) { - best_y = y; - best_waste = waste; - best = prev; - } - } - } - prev = &node->next; - node = node->next; - } - - best_x = (best == NULL) ? 0 : (*best)->x; - - // if doing best-fit (BF), we also have to try aligning right edge to each node position - // - // e.g, if fitting - // - // ____________________ - // |____________________| - // - // into - // - // | | - // | ____________| - // |____________| - // - // then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned - // - // This makes BF take about 2x the time - - if(c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) { - tail = c->active_head; - node = c->active_head; - prev = &c->active_head; - // find first node that's admissible - while(tail->x < width) - tail = tail->next; - while(tail) { - int xpos = tail->x - width; - int y, waste; - STBRP_ASSERT(xpos >= 0); - // find the left position that matches this - while(node->next->x <= xpos) { - prev = &node->next; - node = node->next; - } - STBRP_ASSERT(node->next->x > xpos && node->x <= xpos); - y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste); - if(y + height <= c->height) { - if(y <= best_y) { - if(y < best_y || waste < best_waste || (waste == best_waste && xpos < best_x)) { - best_x = xpos; - STBRP_ASSERT(y <= best_y); - best_y = y; - best_waste = waste; - best = prev; - } - } - } - tail = tail->next; - } - } - - fr.prev_link = best; - fr.x = best_x; - fr.y = best_y; - return fr; -} - -static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context * context, int width, int height) -{ - // find best position according to heuristic - stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height); - stbrp_node * node, * cur; - - // bail if: - // 1. it failed - // 2. the best node doesn't fit (we don't always check this) - // 3. we're out of memory - if(res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) { - res.prev_link = NULL; - return res; - } - - // on success, create new node - node = context->free_head; - node->x = (stbrp_coord) res.x; - node->y = (stbrp_coord)(res.y + height); - - context->free_head = node->next; - - // insert the new node into the right starting point, and - // let 'cur' point to the remaining nodes needing to be - // stitched back in - - cur = *res.prev_link; - if(cur->x < res.x) { - // preserve the existing one, so start testing with the next one - stbrp_node * next = cur->next; - cur->next = node; - cur = next; - } - else { - *res.prev_link = node; - } - - // from here, traverse cur and free the nodes, until we get to one - // that shouldn't be freed - while(cur->next && cur->next->x <= res.x + width) { - stbrp_node * next = cur->next; - // move the current node to the free list - cur->next = context->free_head; - context->free_head = cur; - cur = next; - } - - // stitch the list back in - node->next = cur; - - if(cur->x < res.x + width) - cur->x = (stbrp_coord)(res.x + width); - -#ifdef _DEBUG - cur = context->active_head; - while(cur->x < context->width) { - STBRP_ASSERT(cur->x < cur->next->x); - cur = cur->next; - } - STBRP_ASSERT(cur->next == NULL); - - { - int count = 0; - cur = context->active_head; - while(cur) { - cur = cur->next; - ++count; - } - cur = context->free_head; - while(cur) { - cur = cur->next; - ++count; - } - STBRP_ASSERT(count == context->num_nodes + 2); - } -#endif - - return res; -} - -static int STBRP__CDECL rect_height_compare(const void * a, const void * b) -{ - const stbrp_rect * p = (const stbrp_rect *) a; - const stbrp_rect * q = (const stbrp_rect *) b; - if(p->h > q->h) - return -1; - if(p->h < q->h) - return 1; - return (p->w > q->w) ? -1 : (p->w < q->w); -} - -static int STBRP__CDECL rect_original_order(const void * a, const void * b) -{ - const stbrp_rect * p = (const stbrp_rect *) a; - const stbrp_rect * q = (const stbrp_rect *) b; - return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); -} - -STBRP_DEF int stbrp_pack_rects(stbrp_context * context, stbrp_rect * rects, int num_rects) -{ - int i, all_rects_packed = 1; - - // we use the 'was_packed' field internally to allow sorting/unsorting - for(i = 0; i < num_rects; ++i) { - rects[i].was_packed = i; - } - - // sort according to heuristic - STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare); - - for(i = 0; i < num_rects; ++i) { - if(rects[i].w == 0 || rects[i].h == 0) { - rects[i].x = rects[i].y = 0; // empty rect needs no space - } - else { - stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); - if(fr.prev_link) { - rects[i].x = (stbrp_coord) fr.x; - rects[i].y = (stbrp_coord) fr.y; - } - else { - rects[i].x = rects[i].y = STBRP__MAXVAL; - } - } - } - - // unsort - STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); - - // set was_packed flags and all_rects_packed status - for(i = 0; i < num_rects; ++i) { - rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); - if(!rects[i].was_packed) - all_rects_packed = 0; - } - - // return the all_rects_packed status - return all_rects_packed; -} -#endif - -#if defined(__GNUC__) || defined(__clang__) - #pragma GCC diagnostic pop -#endif - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -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. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -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 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. ------------------------------------------------------------------------------- -*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/tiny_ttf/stb_truetype_htcw.h b/software/Power_Pico/Middlewares/LVGL/src/libs/tiny_ttf/stb_truetype_htcw.h deleted file mode 100644 index 1cd3e2a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/tiny_ttf/stb_truetype_htcw.h +++ /dev/null @@ -1,5598 +0,0 @@ -// stb_truetype.h - v1.26htcw (fork to enable streaming and low memory environments) -// stb_truetype.h - v1.26 - public domain -// authored from 2009-2021 by Sean Barrett / RAD Game Tools -// -// ======================================================================= -// -// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES -// -// This library does no range checking of the offsets found in the file, -// meaning an attacker can use it to read arbitrary memory. -// -// ======================================================================= -// -// This library processes TrueType files: -// parse files -// extract glyph metrics -// extract glyph shapes -// render glyphs to one-channel bitmaps with antialiasing (box filter) -// render glyphs to one-channel SDF bitmaps (signed-distance field/function) -// -// Todo: -// non-MS cmaps -// crashproof on bad data -// hinting? (no longer patented) -// cleartype-style AA? -// optimize: use simple memory allocator for intermediates -// optimize: build edge-list directly from curves -// optimize: rasterize directly from curves? -// -// ADDITIONAL CONTRIBUTORS -// -// Mikko Mononen: compound shape support, more cmap formats -// Tor Andersson: kerning, subpixel rendering -// Dougall Johnson: OpenType / Type 2 font handling -// Daniel Ribeiro Maciel: basic GPOS-based kerning -// -// Misc other: -// Ryan Gordon -// Simon Glass -// github:IntellectualKitty -// Imanol Celaya -// Daniel Ribeiro Maciel -// -// Bug/warning reports/fixes: -// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe -// Cass Everitt Martins Mozeiko github:aloucks -// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam -// Brian Hook Omar Cornut github:vassvik -// Walter van Niftrik Ryan Griege -// David Gow Peter LaValle -// David Given Sergey Popov -// Ivan-Assen Ivanov Giumo X. Clanjor -// Anthony Pesch Higor Euripedes -// Johan Duparc Thomas Fields -// Hou Qiming Derek Vinyard -// Rob Loach Cort Stratton -// Kenney Phillis Jr. Brian Costabile -// Ken Voskuil (kaesve) -// -// VERSION HISTORY -// -// 1.26 (2021-08-28) fix broken rasterizer -// 1.25 (2021-07-11) many fixes -// 1.24 (2020-02-05) fix warning -// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) -// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined -// 1.21 (2019-02-25) fix warning -// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() -// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod -// 1.18 (2018-01-29) add missing function -// 1.17 (2017-07-23) make more arguments const; doc fix -// 1.16 (2017-07-12) SDF support -// 1.15 (2017-03-03) make more arguments const -// 1.14 (2017-01-16) num-fonts-in-TTC function -// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts -// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual -// 1.11 (2016-04-02) fix unused-variable warning -// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef -// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly -// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges -// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; -// variant PackFontRanges to pack and render in separate phases; -// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); -// fixed an assert() bug in the new rasterizer -// replace assert() with STBTT_assert() in new rasterizer -// -// Full history can be found at the end of this file. -// -// LICENSE -// -// See end of file for license information. -// -// USAGE -// -// Include this file in whatever places need to refer to it. In ONE C/C++ -// file, write: -// #define STB_TRUETYPE_IMPLEMENTATION -// before the #include of this file. This expands out the actual -// implementation into that C/C++ file. -// -// To make the implementation private to the file that generates the implementation, -// #define STBTT_STATIC -// -// Simple 3D API (don't ship this, but it's fine for tools and quick start) -// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture -// stbtt_GetBakedQuad() -- compute quad to draw for a given char -// -// Improved 3D API (more shippable): -// #include "stb_rect_pack.h" -- optional, but you really want it -// stbtt_PackBegin() -// stbtt_PackSetOversampling() -- for improved quality on small fonts -// stbtt_PackFontRanges() -- pack and renders -// stbtt_PackEnd() -// stbtt_GetPackedQuad() -// -// "Load" a font file from a memory buffer (you have to keep the buffer loaded) -// stbtt_InitFont() -// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections -// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections -// -// Render a unicode codepoint to a bitmap -// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap -// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide -// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be -// -// Character advance/positioning -// stbtt_GetCodepointHMetrics() -// stbtt_GetFontVMetrics() -// stbtt_GetFontVMetricsOS2() -// stbtt_GetCodepointKernAdvance() -// -// Starting with version 1.06, the rasterizer was replaced with a new, -// faster and generally-more-precise rasterizer. The new rasterizer more -// accurately measures pixel coverage for anti-aliasing, except in the case -// where multiple shapes overlap, in which case it overestimates the AA pixel -// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If -// this turns out to be a problem, you can re-enable the old rasterizer with -// #define STBTT_RASTERIZER_VERSION 1 -// which will incur about a 15% speed hit. -// -// ADDITIONAL DOCUMENTATION -// -// Immediately after this block comment are a series of sample programs. -// -// After the sample programs is the "header file" section. This section -// includes documentation for each API function. -// -// Some important concepts to understand to use this library: -// -// Codepoint -// Characters are defined by unicode codepoints, e.g. 65 is -// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is -// the hiragana for "ma". -// -// Glyph -// A visual character shape (every codepoint is rendered as -// some glyph) -// -// Glyph index -// A font-specific integer ID representing a glyph -// -// Baseline -// Glyph shapes are defined relative to a baseline, which is the -// bottom of uppercase characters. Characters extend both above -// and below the baseline. -// -// Current Point -// As you draw text to the screen, you keep track of a "current point" -// which is the origin of each character. The current point's vertical -// position is the baseline. Even "baked fonts" use this model. -// -// Vertical Font Metrics -// The vertical qualities of the font, used to vertically position -// and space the characters. See docs for stbtt_GetFontVMetrics. -// -// Font Size in Pixels or Points -// The preferred interface for specifying font sizes in stb_truetype -// is to specify how tall the font's vertical extent should be in pixels. -// If that sounds good enough, skip the next paragraph. -// -// Most font APIs instead use "points", which are a common typographic -// measurement for describing font size, defined as 72 points per inch. -// stb_truetype provides a point API for compatibility. However, true -// "per inch" conventions don't make much sense on computer displays -// since different monitors have different number of pixels per -// inch. For example, Windows traditionally uses a convention that -// there are 96 pixels per inch, thus making 'inch' measurements have -// nothing to do with inches, and thus effectively defining a point to -// be 1.333 pixels. Additionally, the TrueType font data provides -// an explicit scale factor to scale a given font's glyphs to points, -// but the author has observed that this scale factor is often wrong -// for non-commercial fonts, thus making fonts scaled in points -// according to the TrueType spec incoherently sized in practice. -// -// DETAILED USAGE: -// -// Scale: -// Select how high you want the font to be, in points or pixels. -// Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute -// a scale factor SF that will be used by all other functions. -// -// Baseline: -// You need to select a y-coordinate that is the baseline of where -// your text will appear. Call GetFontBoundingBox to get the baseline-relative -// bounding box for all characters. SF*-y0 will be the distance in pixels -// that the worst-case character could extend above the baseline, so if -// you want the top edge of characters to appear at the top of the -// screen where y=0, then you would set the baseline to SF*-y0. -// -// Current point: -// Set the current point where the first character will appear. The -// first character could extend left of the current point; this is font -// dependent. You can either choose a current point that is the leftmost -// point and hope, or add some padding, or check the bounding box or -// left-side-bearing of the first character to be displayed and set -// the current point based on that. -// -// Displaying a character: -// Compute the bounding box of the character. It will contain signed values -// relative to . I.e. if it returns x0,y0,x1,y1, -// then the character should be displayed in the rectangle from -// to = 32 && *text < 128) { - stbtt_aligned_quad q; - stbtt_GetBakedQuad(cdata, 512, 512, *text - 32, &x, &y, &q, 1);//1=opengl & d3d10+,0=d3d9 - glTexCoord2f(q.s0, q.t0); - glVertex2f(q.x0, q.y0); - glTexCoord2f(q.s1, q.t0); - glVertex2f(q.x1, q.y0); - glTexCoord2f(q.s1, q.t1); - glVertex2f(q.x1, q.y1); - glTexCoord2f(q.s0, q.t1); - glVertex2f(q.x0, q.y1); - } - ++text; - } - glEnd(); -} -#endif -// -// -////////////////////////////////////////////////////////////////////////////// -// -// Complete program (this compiles): get a single bitmap, print as ASCII art -// -#if 0 -#include -#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation -#include "stb_truetype.h" - -char ttf_buffer[1 << 25]; - -int main(int argc, char ** argv) -{ - stbtt_fontinfo font; - unsigned char * bitmap; - int w, h, i, j, c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); - - fread(ttf_buffer, 1, 1 << 25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); - - stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer, 0)); - bitmap = stbtt_GetCodepointBitmap(&font, 0, stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0, 0); - - for(j = 0; j < h; ++j) { - for(i = 0; i < w; ++i) - putchar(" .:ioVM@"[bitmap[j * w + i] >> 5]); - putchar('\n'); - } - return 0; -} -#endif -// -// Output: -// -// .ii. -// @@@@@@. -// V@Mio@@o -// :i. V@V -// :oM@@M -// :@@@MM@M -// @@o o@M -// :@@. M@M -// @@@o@@@@ -// :M@@V:@@. -// -////////////////////////////////////////////////////////////////////////////// -// -// Complete program: print "Hello World!" banner, with bugs -// -#if 0 -char buffer[24 << 20]; -unsigned char screen[20][79]; - -int main(int arg, char ** argv) -{ - stbtt_fontinfo font; - int i, j, ascent, baseline, ch = 0; - float scale, xpos = 2; // leave a little padding in case the character extends left - char * text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness - - fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); - stbtt_InitFont(&font, buffer, 0); - - scale = stbtt_ScaleForPixelHeight(&font, 15); - stbtt_GetFontVMetrics(&font, &ascent, 0, 0); - baseline = (int)(ascent * scale); - - while(text[ch]) { - int advance, lsb, x0, y0, x1, y1; - float x_shift = xpos - (float)floor(xpos); - stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); - stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale, scale, x_shift, 0, &x0, &y0, &x1, &y1); - stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int)xpos + x0], x1 - x0, y1 - y0, 79, scale, scale, - x_shift, 0, text[ch]); - // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong - // because this API is really for baking character bitmaps into textures. if you want to render - // a sequence of characters, you really need to render each bitmap to a temp buffer, then - // "alpha blend" that into the working buffer - xpos += (advance * scale); - if(text[ch + 1]) - xpos += scale * stbtt_GetCodepointKernAdvance(&font, text[ch], text[ch + 1]); - ++ch; - } - - for(j = 0; j < 20; ++j) { - for(i = 0; i < 78; ++i) - putchar(" .:ioVM@"[screen[j][i] >> 5]); - putchar('\n'); - } - - return 0; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -//// -//// INTEGRATION WITH YOUR CODEBASE -//// -//// The following sections allow you to supply alternate definitions -//// of C library functions used by stb_truetype, e.g. if you don't -//// link with the C runtime library. - -#ifdef STB_TRUETYPE_IMPLEMENTATION -// #define your own (u)stbtt_int8/16/32 before including to override this -#ifndef stbtt_uint8 - typedef unsigned char stbtt_uint8; - typedef signed char stbtt_int8; - typedef unsigned short stbtt_uint16; - typedef signed short stbtt_int16; - typedef unsigned int stbtt_uint32; - typedef signed int stbtt_int32; -#endif - -typedef char stbtt__check_size32[sizeof(stbtt_int32) == 4 ? 1 : -1]; -typedef char stbtt__check_size16[sizeof(stbtt_int16) == 2 ? 1 : -1]; - -// define STBTT_STDIO_STREAM to stream from a FILE object -// instead of from memory. Or define STBTT_STREAM_TYPE, -// STBTT_STREAM_READ and STBTT_STREAM_SEEK to implement -// another streaming source -#ifdef STBTT_STDIO_STREAM - #include - #define STBTT_STREAM_TYPE FILE* - #define STBTT_STREAM_READ(s,x,y) fread(x,1,y,s); - #define STBTT_STREAM_SEEK(s,x) fseek(s,x,SEEK_SET); -#endif - -// heap factor sizes for various counts of objects -// adjust for your platform. Below is suitable for -// modern PC class machines. -#ifndef STBTT_HEAP_FACTOR_SIZE_32 - #define STBTT_HEAP_FACTOR_SIZE_32 2000 -#endif - -#ifndef STBTT_HEAP_FACTOR_SIZE_128 - #define STBTT_HEAP_FACTOR_SIZE_128 800 -#endif - -#ifndef STBTT_HEAP_FACTOR_SIZE_DEFAULT - #define STBTT_HEAP_FACTOR_SIZE_DEFAULT 100 -#endif - -// e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h -#ifndef STBTT_ifloor - #include - #define STBTT_ifloor(x) ((int) floor(x)) - #define STBTT_iceil(x) ((int) ceil(x)) -#endif - -#ifndef STBTT_sqrt - #include - #define STBTT_sqrt(x) (float)sqrt(x) - #define STBTT_pow(x,y) pow(x,y) -#endif - -#ifndef STBTT_fmod - #include - #define STBTT_fmod(x,y) fmod(x,y) -#endif - -#ifndef STBTT_cos - #include - #define STBTT_cos(x) cos(x) - #define STBTT_acos(x) acos(x) -#endif - -#ifndef STBTT_fabs - #include - #define STBTT_fabs(x) (float)fabs(x) -#endif - -// #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h -#ifndef STBTT_malloc - #include - #define STBTT_malloc(x,u) ((void)(u),malloc(x)) - #define STBTT_free(x,u) ((void)(u),free(x)) -#endif - -#ifndef STBTT_assert - #include - #define STBTT_assert(x) assert(x) -#endif - -#ifndef STBTT_strlen - #include - #define STBTT_strlen(x) strlen(x) -#endif - -#ifndef STBTT_memcpy - #include - #define STBTT_memcpy memcpy - #define STBTT_memset memset -#endif -#endif - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -//// -//// INTERFACE -//// -//// - -#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ -#define __STB_INCLUDE_STB_TRUETYPE_H__ - -#ifdef STBTT_STATIC - #define STBTT_DEF static -#else - #define STBTT_DEF extern -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -// private structure -typedef struct { -#ifdef STBTT_STREAM_TYPE - STBTT_STREAM_TYPE data; - stbtt_uint32 offset; -#else - unsigned char * data; -#endif - int cursor; - int size; -} stbtt__buf; - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// TEXTURE BAKING API -// -// If you use this API, you only have to call two functions ever. -// - -typedef struct { - unsigned short x0, y0, x1, y1; // coordinates of bbox in bitmap - float xoff, yoff, xadvance; -} stbtt_bakedchar; - -typedef struct { - float x0, y0, s0, t0; // top-left - float x1, y1, s1, t1; // bottom-right -} stbtt_aligned_quad; - -STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar * chardata, int pw, int ph, // same data as above - int char_index, // character to display - float * xpos, float * ypos, // pointers to current position in screen pixel space - stbtt_aligned_quad * q, // output: quad to draw - int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier -// Call GetBakedQuad with char_index = 'character - first_char', and it -// creates the quad you need to draw and advances the current position. -// -// The coordinate system used assumes y increases downwards. -// -// Characters will extend both above and below the current position; -// see discussion of "BASELINE" above. -// -// It's inefficient; you might want to c&p it and optimize it. - -////////////////////////////////////////////////////////////////////////////// -// -// NEW TEXTURE BAKING API -// -// This provides options for packing multiple fonts into one atlas, not -// perfectly but better than nothing. - -typedef struct { - unsigned short x0, y0, x1, y1; // coordinates of bbox in bitmap - float xoff, yoff, xadvance; - float xoff2, yoff2; -} stbtt_packedchar; - -/// @cond -/** - * Tells Doxygen to ignore a duplicate declaration - */ -typedef struct stbtt_pack_context stbtt_pack_context; -typedef struct stbtt_fontinfo stbtt_fontinfo; -/// @endcond - -#ifndef STB_RECT_PACK_VERSION -/// @cond -/** - * Tells Doxygen to ignore a duplicate declaration - */ -typedef struct stbrp_rect stbrp_rect; -/// @endcond - -#endif -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context * spc, unsigned char * pixels, int width, int height, - int stride_in_bytes, int padding, void * alloc_context); - -// Initializes a packing context stored in the passed-in stbtt_pack_context. -// Future calls using this context will pack characters into the bitmap passed -// in here: a 1-channel bitmap that is width * height. stride_in_bytes is -// the distance from one row to the next (or 0 to mean they are packed tightly -// together). "padding" is the amount of padding to leave between each -// character (normally you want '1' for bitmaps you'll use as textures with -// bilinear filtering). -// -// Returns 0 on failure, 1 on success. - -STBTT_DEF void stbtt_PackEnd(stbtt_pack_context * spc); -// Cleans up the packing context and frees all memory. - -#define STBTT_POINT_SIZE(x) (-(x)) - -typedef struct { - float font_size; - int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint - int * array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints - int num_chars; - stbtt_packedchar * chardata_for_range; // output - unsigned char h_oversample, v_oversample; // don't set these, they're used internally -} stbtt_pack_range; - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context * spc, unsigned int h_oversample, - unsigned int v_oversample); -// Oversampling a font increases the quality by allowing higher-quality subpixel -// positioning, and is especially valuable at smaller text sizes. -// -// This function sets the amount of oversampling for all following calls to -// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given -// pack context. The default (no oversampling) is achieved by h_oversample=1 -// and v_oversample=1. The total number of pixels required is -// h_oversample*v_oversample larger than the default; for example, 2x2 -// oversampling requires 4x the storage of 1x1. For best results, render -// oversampled textures with bilinear filtering. Look at the readme in -// stb/tests/oversample for information about oversampled fonts -// -// To use with PackFontRangesGather etc., you must set it before calls -// call to PackFontRangesGatherRects. - -STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context * spc, int skip); -// If skip != 0, this tells stb_truetype to skip any codepoints for which -// there is no corresponding glyph. If skip=0, which is the default, then -// codepoints without a glyph received the font's "missing character" glyph, -// typically an empty box by convention. - -STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar * chardata, int pw, int ph, // same data as above - int char_index, // character to display - float * xpos, float * ypos, // pointers to current position in screen pixel space - stbtt_aligned_quad * q, // output: quad to draw - int align_to_integer); - -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, - stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects); -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context * spc, stbrp_rect * rects, int num_rects); -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, - stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects); -// Calling these functions in sequence is roughly equivalent to calling -// stbtt_PackFontRanges(). If you more control over the packing of multiple -// fonts, or if you want to pack custom data into a font texture, take a look -// at the source to of stbtt_PackFontRanges() and create a custom version -// using these functions, e.g. call GatherRects multiple times, -// building up a single array of rects, then call PackRects once, -// then call RenderIntoRects repeatedly. This may result in a -// better packing than calling PackFontRanges multiple times -// (or it may not). - -// this is an opaque structure that you shouldn't mess with which holds -// all the context needed from PackBegin to PackEnd. -struct stbtt_pack_context { - void * user_allocator_context; - void * pack_info; - int width; - int height; - int stride_in_bytes; - int padding; - int skip_missing; - unsigned int h_oversample, v_oversample; - unsigned char * pixels; - void * nodes; -}; - -////////////////////////////////////////////////////////////////////////////// -// -// FONT LOADING -// -// -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_GetNumberOfFonts(STBTT_STREAM_TYPE data); -#else -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char * data); -#endif -// This function will determine the number of fonts in a font file. TrueType -// collection (.ttc) files may contain multiple fonts, while TrueType font -// (.ttf) files only contain one font. The number of fonts can be used for -// indexing with the previous function where the index is between zero and one -// less than the total fonts. If an error occurs, -1 is returned. -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_GetFontOffsetForIndex(STBTT_STREAM_TYPE, int index); -#else -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char * data, int index); -#endif - -// Each .ttf/.ttc file may have more than one font. Each font has a sequential -// index number starting from 0. Call this function to get the font offset for -// a given index; it returns -1 if the index is out of range. A regular .ttf -// file will only define one font and it always be at offset 0, so it will -// return '0' for index 0, and -1 for all other indices. - -// The following structure is defined publicly so you can declare one on -// the stack or as a global or etc, but you should treat it as opaque. -struct stbtt_fontinfo { - void * userdata; -#ifdef STBTT_STREAM_TYPE - STBTT_STREAM_TYPE data; -#else - unsigned char * data; // pointer to .ttf file -#endif - int fontstart; // offset of start of font - - int numGlyphs; // number of glyphs, needed for range checking - - int loca, head, glyf, hhea, hmtx, kern, gpos, svg; // table locations as offset from start of .ttf - int index_map; // a cmap mapping for our chosen character encoding - int indexToLocFormat; // format needed to map from glyph index to glyph - - stbtt__buf cff; // cff font data - stbtt__buf charstrings; // the charstring index - stbtt__buf gsubrs; // global charstring subroutines index - stbtt__buf subrs; // private charstring subroutines index - stbtt__buf fontdicts; // array of font dicts - stbtt__buf fdselect; // map from glyph to fontdict -}; -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int offset); -#else -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, const unsigned char * data, int offset); -#endif -// Given an offset into the file that defines a font, this function builds -// the necessary cached info for the rest of the system. You must allocate -// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't -// need to do anything special to free it, because the contents are pure -// value data with no additional data structures. Returns 0 on failure. - -////////////////////////////////////////////////////////////////////////////// -// -// CHARACTER TO GLYPH-INDEX CONVERSIOn - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo * info, int unicode_codepoint); -// If you're going to perform multiple operations on the same character -// and you want a speed-up, call this function with the character you're -// going to process, then use glyph-based functions instead of the -// codepoint-based functions. -// Returns 0 if the character codepoint is not defined in the font. - -////////////////////////////////////////////////////////////////////////////// -// -// CHARACTER PROPERTIES -// - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo * info, float pixels); -// computes a scale factor to produce a font whose "height" is 'pixels' tall. -// Height is measured as the distance from the highest ascender to the lowest -// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics -// and computing: -// scale = pixels / (ascent - descent) -// so if you prefer to measure height by the ascent only, use a similar calculation. - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo * info, float pixels); -// computes a scale factor to produce a font whose EM size is mapped to -// 'pixels' tall. This is probably what traditional APIs compute, but -// I'm not positive. - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo * info, int * ascent, int * descent, int * lineGap); -// ascent is the coordinate above the baseline the font extends; descent -// is the coordinate below the baseline the font extends (i.e. it is typically negative) -// lineGap is the spacing between one row's descent and the next row's ascent... -// so you should advance the vertical position by "*ascent - *descent + *lineGap" -// these are expressed in unscaled coordinates, so you must multiply by -// the scale factor for a given size - -STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo * info, int * typoAscent, int * typoDescent, - int * typoLineGap); -// analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 -// table (specific to MS/Windows TTF files). -// -// Returns 1 on success (table present), 0 on failure. - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo * info, int * x0, int * y0, int * x1, int * y1); -// the bounding box around all possible characters - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo * info, int codepoint, int * advanceWidth, - int * leftSideBearing); -// leftSideBearing is the offset from the current horizontal position to the left edge of the character -// advanceWidth is the offset from the current horizontal position to the next horizontal position -// these are expressed in unscaled coordinates - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo * info, int ch1, int ch2); -// an additional amount to add to the 'advance' value between ch1 and ch2 - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo * info, int codepoint, int * x0, int * y0, int * x1, int * y1); -// Gets the bounding box of the visible part of the glyph, in unscaled coordinates - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo * info, int glyph_index, int * advanceWidth, - int * leftSideBearing); -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2); -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1); -// as above, but takes one or more glyph indices for greater efficiency - -typedef struct _stbtt_kerningentry { - int glyph1; // use stbtt_FindGlyphIndex - int glyph2; - int advance; -} stbtt_kerningentry; - -STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo * info); -STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo * info, stbtt_kerningentry * table, int table_length); -// Retrieves a complete list of all of the kerning pairs provided by the font -// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. -// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) - -////////////////////////////////////////////////////////////////////////////// -// -// GLYPH SHAPES (you probably don't need these, but they have to go before -// the bitmaps for C declaration-order reasons) -// - -#ifndef STBTT_vmove // you can predefine these to use different values (but why?) -enum { - STBTT_vmove = 1, - STBTT_vline, - STBTT_vcurve, - STBTT_vcubic -}; -#endif - -#ifndef stbtt_vertex // you can predefine this to use different values -// (we share this with other code at RAD) -#define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file -typedef struct { - stbtt_vertex_type x, y, cx, cy, cx1, cy1; - unsigned char type, padding; -} stbtt_vertex; -#endif - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo * info, int glyph_index); -// returns non-zero if nothing is drawn for this glyph - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_vertex ** vertices); -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex ** vertices); -// returns # of vertices and fills *vertices with the pointer to them -// these are expressed in "unscaled" coordinates -// -// The shape is a series of contours. Each one starts with -// a STBTT_moveto, then consists of a series of mixed -// STBTT_lineto and STBTT_curveto segments. A lineto -// draws a line from previous endpoint to its x,y; a curveto -// draws a quadratic bezier from previous endpoint to -// its x,y, using cx,cy as the bezier control point. - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo * info, stbtt_vertex * vertices); -// frees the data allocated above - -STBTT_DEF stbtt_uint32 stbtt_FindSVGDoc(const stbtt_fontinfo * info, int gl); -STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_uint32 * svgOfs); -STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo * info, int gl, stbtt_uint32 * svgOfs); -// fills svg with the character's SVG data. -// returns data size or 0 if SVG not found. - -////////////////////////////////////////////////////////////////////////////// -// -// BITMAP RENDERING -// - -STBTT_DEF void stbtt_FreeBitmap(unsigned char * bitmap, void * userdata); -// frees the bitmap allocated below - -STBTT_DEF unsigned char * stbtt_GetCodepointBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, - int codepoint, int * width, int * height, int * xoff, int * yoff); -// allocates a large-enough single-channel 8bpp bitmap and renders the -// specified character/glyph at the specified scale into it, with -// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). -// *width & *height are filled out with the width & height of the bitmap, -// which is stored left-to-right, top-to-bottom. -// -// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap - -STBTT_DEF unsigned char * stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, - float shift_x, float shift_y, int codepoint, int * width, int * height, int * xoff, int * yoff); -// the same as stbtt_GetCodepointBitmap, but you can specify a subpixel -// shift for the character - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, - int out_stride, float scale_x, float scale_y, int codepoint); -// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap -// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap -// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the -// width and height and positioning info for it first. - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, - int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); -// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel -// shift for the character - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, - int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, - int oversample_y, float * sub_x, float * sub_y, int codepoint); -// same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering -// is performed (see stbtt_PackSetOversampling) - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo * font, int codepoint, float scale_x, float scale_y, - int * ix0, int * iy0, int * ix1, int * iy1); -// get the bbox of the bitmap centered around the glyph origin; so the -// bitmap width is ix1-ix0, height is iy1-iy0, and location to place -// the bitmap top left is (leftSideBearing*scale,iy0). -// (Note that the bitmap uses y-increases-down, but the shape uses -// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo * font, int codepoint, float scale_x, - float scale_y, float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1); -// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel -// shift for the character - -// the following functions are equivalent to the above functions, but operate -// on glyph indices instead of Unicode codepoints (for efficiency) -STBTT_DEF unsigned char * stbtt_GetGlyphBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, int glyph, - int * width, int * height, int * xoff, int * yoff); -STBTT_DEF unsigned char * stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, - float shift_x, float shift_y, int glyph, int * width, int * height, int * xoff, int * yoff); -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, - int out_stride, float scale_x, float scale_y, int glyph); -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, - int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, int out_w, - int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, - int oversample_y, float * sub_x, float * sub_y, int glyph); -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, int * ix0, - int * iy0, int * ix1, int * iy1); -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, - float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1); - -// @TODO: don't expose this structure -typedef struct { - int w, h, stride; - unsigned char * pixels; -} stbtt__bitmap; - -// rasterize a shape with quadratic beziers into a bitmap -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap * result, // 1-channel bitmap to draw into - float flatness_in_pixels, // allowable error of curve in pixels - stbtt_vertex * vertices, // array of vertices defining shape - int num_verts, // number of vertices in above array - float scale_x, float scale_y, // scale applied to input vertices - float shift_x, float shift_y, // translation applied to input vertices - int x_off, int y_off, // another translation applied to input - int invert, // if non-zero, vertically flip shape - void * userdata); // context for to STBTT_MALLOC - -////////////////////////////////////////////////////////////////////////////// -// -// Signed Distance Function (or Field) rendering - -STBTT_DEF void stbtt_FreeSDF(unsigned char * bitmap, void * userdata); -// frees the SDF bitmap allocated below - -STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo * info, float scale, int glyph, int padding, - unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff); -STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo * info, float scale, int codepoint, int padding, - unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff); -// These functions compute a discretized SDF field for a single character, suitable for storing -// in a single-channel texture, sampling with bilinear filtering, and testing against -// larger than some threshold to produce scalable fonts. -// info -- the font -// scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap -// glyph/codepoint -- the character to generate the SDF for -// padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), -// which allows effects like bit outlines -// onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) -// pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) -// if positive, > onedge_value is inside; if negative, < onedge_value is inside -// width,height -- output height & width of the SDF bitmap (including padding) -// xoff,yoff -- output origin of the character -// return value -- a 2D array of bytes 0..255, width*height in size -// -// pixel_dist_scale & onedge_value are a scale & bias that allows you to make -// optimal use of the limited 0..255 for your application, trading off precision -// and special effects. SDF values outside the range 0..255 are clamped to 0..255. -// -// Example: -// scale = stbtt_ScaleForPixelHeight(22) -// padding = 5 -// onedge_value = 180 -// pixel_dist_scale = 180/5.0 = 36.0 -// -// This will create an SDF bitmap in which the character is about 22 pixels -// high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled -// shape, sample the SDF at each pixel and fill the pixel if the SDF value -// is greater than or equal to 180/255. (You'll actually want to antialias, -// which is beyond the scope of this example.) Additionally, you can compute -// offset outlines (e.g. to stroke the character border inside & outside, -// or only outside). For example, to fill outside the character up to 3 SDF -// pixels, you would compare against (180-36.0*3)/255 = 72/255. The above -// choice of variables maps a range from 5 pixels outside the shape to -// 2 pixels inside the shape to 0..255; this is intended primarily for apply -// outside effects only (the interior range is needed to allow proper -// antialiasing of the font at *smaller* sizes) -// -// The function computes the SDF analytically at each SDF pixel, not by e.g. -// building a higher-res bitmap and approximating it. In theory the quality -// should be as high as possible for an SDF of this size & representation, but -// unclear if this is true in practice (perhaps building a higher-res bitmap -// and computing from that can allow drop-out prevention). -// -// The algorithm has not been optimized at all, so expect it to be slow -// if computing lots of characters or very large sizes. - -////////////////////////////////////////////////////////////////////////////// -// -// Finding the right font... -// -// You should really just solve this offline, keep your own tables -// of what font is what, and don't try to get it out of the .ttf file. -// That's because getting it out of the .ttf file is really hard, because -// the names in the file can appear in many possible encodings, in many -// possible languages, and e.g. if you need a case-insensitive comparison, -// the details of that depend on the encoding & language in a complex way -// (actually underspecified in truetype, but also gigantic). -// -// But you can use the provided functions in two possible ways: -// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on -// unicode-encoded names to try to find the font you want; -// you can run this before calling stbtt_InitFont() -// -// stbtt_GetFontNameString() lets you get any of the various strings -// from the file yourself and do your own comparisons on them. -// You have to have called stbtt_InitFont() first. - -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_FindMatchingFont(STBTT_STREAM_TYPE fontdata, const char * name, int flags); -#else -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char * fontdata, const char * name, int flags); -#endif -// returns the offset (not index) of the font that matches, or -1 if none -// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". -// if you use any other flag, use a font name like "Arial"; this checks -// the 'macStyle' header field; i don't know if fonts set this consistently -#define STBTT_MACSTYLE_DONTCARE 0 -#define STBTT_MACSTYLE_BOLD 1 -#define STBTT_MACSTYLE_ITALIC 2 -#define STBTT_MACSTYLE_UNDERSCORE 4 -#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 - -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, - int len2); -#else -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, const char * s2, stbtt_uint32 s2offs, - int len2); -#endif -// returns 1/0 whether the first string interpreted as utf8 is identical to -// the second string interpreted as big-endian utf16... useful for strings from next func - -STBTT_DEF stbtt_uint32 stbtt_GetFontNameString(const stbtt_fontinfo * font, int * length, int platformID, - int encodingID, int languageID, int nameID); - -// returns the string (which may be big-endian double byte, e.g. for unicode) -// and puts the length in bytes in *length. -// -// some of the values for the IDs are below; for more see the truetype spec: -// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html -// http://www.microsoft.com/typography/otspec/name.htm - -enum { // platformID - STBTT_PLATFORM_ID_UNICODE = 0, - STBTT_PLATFORM_ID_MAC = 1, - STBTT_PLATFORM_ID_ISO = 2, - STBTT_PLATFORM_ID_MICROSOFT = 3 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_UNICODE - STBTT_UNICODE_EID_UNICODE_1_0 = 0, - STBTT_UNICODE_EID_UNICODE_1_1 = 1, - STBTT_UNICODE_EID_ISO_10646 = 2, - STBTT_UNICODE_EID_UNICODE_2_0_BMP = 3, - STBTT_UNICODE_EID_UNICODE_2_0_FULL = 4 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT - STBTT_MS_EID_SYMBOL = 0, - STBTT_MS_EID_UNICODE_BMP = 1, - STBTT_MS_EID_SHIFTJIS = 2, - STBTT_MS_EID_UNICODE_FULL = 10 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes - STBTT_MAC_EID_ROMAN = 0, STBTT_MAC_EID_ARABIC = 4, - STBTT_MAC_EID_JAPANESE = 1, STBTT_MAC_EID_HEBREW = 5, - STBTT_MAC_EID_CHINESE_TRAD = 2, STBTT_MAC_EID_GREEK = 6, - STBTT_MAC_EID_KOREAN = 3, STBTT_MAC_EID_RUSSIAN = 7 -}; - -enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... - // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs - STBTT_MS_LANG_ENGLISH = 0x0409, STBTT_MS_LANG_ITALIAN = 0x0410, - STBTT_MS_LANG_CHINESE = 0x0804, STBTT_MS_LANG_JAPANESE = 0x0411, - STBTT_MS_LANG_DUTCH = 0x0413, STBTT_MS_LANG_KOREAN = 0x0412, - STBTT_MS_LANG_FRENCH = 0x040c, STBTT_MS_LANG_RUSSIAN = 0x0419, - STBTT_MS_LANG_GERMAN = 0x0407, STBTT_MS_LANG_SPANISH = 0x0409, - STBTT_MS_LANG_HEBREW = 0x040d, STBTT_MS_LANG_SWEDISH = 0x041D -}; - -enum { // languageID for STBTT_PLATFORM_ID_MAC - STBTT_MAC_LANG_ENGLISH = 0, STBTT_MAC_LANG_JAPANESE = 11, - STBTT_MAC_LANG_ARABIC = 12, STBTT_MAC_LANG_KOREAN = 23, - STBTT_MAC_LANG_DUTCH = 4, STBTT_MAC_LANG_RUSSIAN = 32, - STBTT_MAC_LANG_FRENCH = 1, STBTT_MAC_LANG_SPANISH = 6, - STBTT_MAC_LANG_GERMAN = 2, STBTT_MAC_LANG_SWEDISH = 5, - STBTT_MAC_LANG_HEBREW = 10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED = 33, - STBTT_MAC_LANG_ITALIAN = 3, STBTT_MAC_LANG_CHINESE_TRAD = 19 -}; - -#ifdef __cplusplus -} -#endif - -#endif // __STB_INCLUDE_STB_TRUETYPE_H__ - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -//// -//// IMPLEMENTATION -//// -//// - -#ifdef STB_TRUETYPE_IMPLEMENTATION - -#ifndef STBTT_MAX_OVERSAMPLE - #define STBTT_MAX_OVERSAMPLE 8 -#endif - -#if STBTT_MAX_OVERSAMPLE > 255 - #error "STBTT_MAX_OVERSAMPLE cannot be > 255" -#endif - -typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE - 1)) == 0 ? 1 : -1]; - -#ifndef STBTT_RASTERIZER_VERSION - #define STBTT_RASTERIZER_VERSION 2 -#endif - -#ifdef _MSC_VER - #define STBTT__NOTUSED(v) (void)(v) -#else - #define STBTT__NOTUSED(v) (void)sizeof(v) -#endif - -////////////////////////////////////////////////////////////////////////// -// -// stbtt__buf helpers to parse data from file -// - -static stbtt_uint8 stbtt__buf_get8(stbtt__buf * b) -{ - if(b->cursor >= b->size) - return 0; -#ifdef STBTT_STREAM_TYPE - long pos = (long)(b->cursor + b->offset); - STBTT_STREAM_SEEK(b->data, pos); - stbtt_uint8 result; - STBTT_STREAM_READ(b->data, &result, 1); - ++b->cursor; - return result; -#else - return b->data[b->cursor++]; -#endif - -} - -static stbtt_uint8 stbtt__buf_peek8(stbtt__buf * b) -{ - if(b->cursor >= b->size) - return 0; -#ifdef STBTT_STREAM_TYPE - long pos = (long)(b->cursor + b->offset); - STBTT_STREAM_SEEK(b->data, pos); - stbtt_uint8 result; - STBTT_STREAM_READ(b->data, &result, 1); - return result; -#else - return b->data[b->cursor]; -#endif - -} - -static void stbtt__buf_seek(stbtt__buf * b, int o) -{ - STBTT_assert(!(o > b->size || o < 0)); - b->cursor = (o > b->size || o < 0) ? b->size : o; -} - -static void stbtt__buf_skip(stbtt__buf * b, int o) -{ - stbtt__buf_seek(b, b->cursor + o); -} - -static stbtt_uint32 stbtt__buf_get(stbtt__buf * b, int n) -{ - stbtt_uint32 v = 0; - int i; - STBTT_assert(n >= 1 && n <= 4); - for(i = 0; i < n; i++) - v = (v << 8) | stbtt__buf_get8(b); - return v; -} -#ifdef STBTT_STREAM_TYPE - static stbtt__buf stbtt__new_buf(STBTT_STREAM_TYPE s, size_t size) -#else - static stbtt__buf stbtt__new_buf(const void * p, size_t size) -#endif -{ - stbtt__buf r; - STBTT_assert(size < 0x40000000); -#ifdef STBTT_STREAM_TYPE - r.data = s; - r.offset = 0; -#else - r.data = (stbtt_uint8 *)p; -#endif - r.size = (int)size; - r.cursor = 0; - return r; -} - -#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) -#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) - -static stbtt__buf stbtt__buf_range(const stbtt__buf * b, int o, int s) -{ - stbtt__buf r = stbtt__new_buf(NULL, 0); - if(o < 0 || s < 0 || o > b->size || s > b->size - o) return r; -#ifdef STBTT_STREAM_TYPE - r.data = b->data; - r.offset = b->offset + o; -#else - r.data = b->data + o; -#endif - r.size = s; - return r; -} - -static stbtt__buf stbtt__cff_get_index(stbtt__buf * b) -{ - int count, start, offsize; - start = b->cursor; - count = stbtt__buf_get16(b); - if(count) { - offsize = stbtt__buf_get8(b); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(b, offsize * count); - stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); - } - return stbtt__buf_range(b, start, b->cursor - start); -} - -static stbtt_uint32 stbtt__cff_int(stbtt__buf * b) -{ - int b0 = stbtt__buf_get8(b); - if(b0 >= 32 && b0 <= 246) return b0 - 139; - else if(b0 >= 247 && b0 <= 250) return (b0 - 247) * 256 + stbtt__buf_get8(b) + 108; - else if(b0 >= 251 && b0 <= 254) return -(b0 - 251) * 256 - stbtt__buf_get8(b) - 108; - else if(b0 == 28) return stbtt__buf_get16(b); - else if(b0 == 29) return stbtt__buf_get32(b); - STBTT_assert(0); - return 0; -} - -static void stbtt__cff_skip_operand(stbtt__buf * b) -{ - int v, b0 = stbtt__buf_peek8(b); - STBTT_assert(b0 >= 28); - if(b0 == 30) { - stbtt__buf_skip(b, 1); - while(b->cursor < b->size) { - v = stbtt__buf_get8(b); - if((v & 0xF) == 0xF || (v >> 4) == 0xF) - break; - } - } - else { - stbtt__cff_int(b); - } -} - -static stbtt__buf stbtt__dict_get(stbtt__buf * b, int key) -{ - stbtt__buf_seek(b, 0); - while(b->cursor < b->size) { - int start = b->cursor, end, op; - while(stbtt__buf_peek8(b) >= 28) - stbtt__cff_skip_operand(b); - end = b->cursor; - op = stbtt__buf_get8(b); - if(op == 12) op = stbtt__buf_get8(b) | 0x100; - if(op == key) return stbtt__buf_range(b, start, end - start); - } - return stbtt__buf_range(b, 0, 0); -} - -static void stbtt__dict_get_ints(stbtt__buf * b, int key, int outcount, stbtt_uint32 * out) -{ - int i; - stbtt__buf operands = stbtt__dict_get(b, key); - for(i = 0; i < outcount && operands.cursor < operands.size; i++) - out[i] = stbtt__cff_int(&operands); -} - -static int stbtt__cff_index_count(stbtt__buf * b) -{ - stbtt__buf_seek(b, 0); - return stbtt__buf_get16(b); -} - -static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) -{ - int count, offsize, start, end; - stbtt__buf_seek(&b, 0); - count = stbtt__buf_get16(&b); - offsize = stbtt__buf_get8(&b); - STBTT_assert(i >= 0 && i < count); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(&b, i * offsize); - start = stbtt__buf_get(&b, offsize); - end = stbtt__buf_get(&b, offsize); - return stbtt__buf_range(&b, 2 + (count + 1) * offsize + start, end - start); -} - -////////////////////////////////////////////////////////////////////////// -// -// accessors to parse data from file -// - -// on platforms that don't allow misaligned reads, if we want to allow -// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE - -#ifdef STBTT_STREAM_TYPE -static stbtt_uint8 ttBYTE(STBTT_STREAM_TYPE s, stbtt_uint32 offset) -{ - STBTT_STREAM_SEEK(s, offset); - stbtt_uint8 r; - STBTT_STREAM_READ(s, &r, 1); - return r; -} -#define ttCHAR(s, offset) ((stbtt_int8)ttBYTE(s,offset)) -static stbtt_uint16 ttUSHORT(STBTT_STREAM_TYPE s, stbtt_uint32 offset) -{ - STBTT_STREAM_SEEK(s, offset); - stbtt_uint8 r[2]; - STBTT_STREAM_READ(s, &r, 2); - return r[0] * 256 + r[1]; -} -static stbtt_int16 ttSHORT(STBTT_STREAM_TYPE s, stbtt_uint32 offset) -{ - STBTT_STREAM_SEEK(s, offset); - stbtt_uint8 r[2]; - STBTT_STREAM_READ(s, &r, 2); - return r[0] * 256 + r[1]; -} -static stbtt_uint32 ttULONG(STBTT_STREAM_TYPE s, stbtt_uint32 offset) -{ - STBTT_STREAM_SEEK(s, offset); - stbtt_uint8 r[4]; - STBTT_STREAM_READ(s, &r, 4); - return (r[0] << 24) + (r[1] << 16) + (r[2] << 8) + r[3]; -} -static stbtt_int32 ttLONG(STBTT_STREAM_TYPE s, stbtt_uint32 offset) -{ - STBTT_STREAM_SEEK(s, offset); - stbtt_uint8 r[4]; - STBTT_STREAM_READ(s, &r, 4); - return (r[0] << 24) + (r[1] << 16) + (r[2] << 8) + r[3]; -} -#else -#define ttBYTE(p, offset) (* (stbtt_uint8 *) (p+offset)) -#define ttCHAR(p, offset) (* (stbtt_int8 *) (p+offset)) -static stbtt_uint16 ttUSHORT(const stbtt_uint8 * p, stbtt_uint32 offset) -{ - return p[offset + 0] * 256 + p[offset + 1]; -} -static stbtt_int16 ttSHORT(const stbtt_uint8 * p, stbtt_uint32 offset) -{ - return p[offset + 0] * 256 + p[offset + 1]; -} -static stbtt_uint32 ttULONG(const stbtt_uint8 * p, stbtt_uint32 offset) -{ - return (p[offset + 0] << 24) + (p[offset + 1] << 16) + (p[offset + 2] << 8) + p[offset + 3]; -} -static stbtt_int32 ttLONG(const stbtt_uint8 * p, stbtt_uint32 offset) -{ - return (p[offset + 0] << 24) + (p[offset + 1] << 16) + (p[offset + 2] << 8) + p[offset + 3]; -} -#endif -#define ttFixed(p, offset) ttLONG(p, offset) - -#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) -#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) -#ifdef STBTT_STREAM_TYPE - static int stbtt__isfont(STBTT_STREAM_TYPE stream, stbtt_uint32 offs) -#else - static int stbtt__isfont(stbtt_uint8 * font, stbtt_uint32 offs) -#endif -{ -#ifdef STBTT_STREAM_TYPE - stbtt_uint8 font[4]; - STBTT_STREAM_SEEK(stream, offs); - STBTT_STREAM_READ(stream, font, 4); -#else - font += offs; -#endif - // check the version number - if(stbtt_tag4(font, '1', 0, 0, 0)) return 1; // TrueType 1 - if(stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! - if(stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF - if(stbtt_tag4(font, 0, 1, 0, 0)) return 1; // OpenType 1.0 - if(stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts - return 0; -} - -// @OPTIMIZE: binary search -#ifdef STBTT_STREAM_TYPE - static stbtt_uint32 stbtt__find_table(STBTT_STREAM_TYPE data, stbtt_uint32 fontstart, const char * tag) -#else - static stbtt_uint32 stbtt__find_table(stbtt_uint8 * data, stbtt_uint32 fontstart, const char * tag) -#endif -{ - stbtt_int32 num_tables = ttUSHORT(data, fontstart + 4); - stbtt_uint32 tabledir = fontstart + 12; - stbtt_int32 i; - for(i = 0; i < num_tables; ++i) { - stbtt_uint32 loc = tabledir + 16 * i; -#ifdef STBTT_STREAM_TYPE - stbtt_uint8 buf[4]; - STBTT_STREAM_SEEK(data, loc + 0); - STBTT_STREAM_READ(data, buf, 4); - if(stbtt_tag(buf, tag)) - return ttULONG(data, loc + 8); -#else - if(stbtt_tag(data + loc + 0, tag)) - return ttULONG(data, loc + 8); -#endif - } - return 0; -} -#ifdef STBTT_STREAM_TYPE - static int stbtt_GetFontOffsetForIndex_internal(STBTT_STREAM_TYPE font_collection, int index) -#else - static int stbtt_GetFontOffsetForIndex_internal(unsigned char * font_collection, int index) -#endif -{ - // if it's just a font, there's only one valid index - if(stbtt__isfont(font_collection, 0)) - return index == 0 ? 0 : -1; - - // check if it's a TTC -#ifdef STBTT_STREAM_TYPE - stbtt_uint8 buf[4]; - STBTT_STREAM_SEEK(font_collection, 0); - STBTT_STREAM_READ(font_collection, buf, 4); - if(stbtt_tag(buf, "ttcf")) { -#else - if(stbtt_tag(font_collection, "ttcf")) { -#endif - // version 1? - if(ttULONG(font_collection, 4) == 0x00010000 || ttULONG(font_collection, 4) == 0x00020000) { - stbtt_int32 n = ttLONG(font_collection, 8); - if(index >= n) - return -1; - return ttULONG(font_collection, 12 + index * 4); - } - } - return -1; -} -#ifdef STBTT_STREAM_TYPE - static int stbtt_GetNumberOfFonts_internal(STBTT_STREAM_TYPE font_collection) -#else - static int stbtt_GetNumberOfFonts_internal(unsigned char * font_collection) -#endif -{ - // if it's just a font, there's only one valid font - if(stbtt__isfont(font_collection, 0)) - return 1; - - // check if it's a TTC -#ifdef STBTT_STREAM_TYPE - stbtt_uint8 buf[4]; - STBTT_STREAM_SEEK(font_collection, 0); - STBTT_STREAM_READ(font_collection, buf, 4); - if(stbtt_tag(buf, "ttcf")) { -#else - if(stbtt_tag(font_collection, "ttcf")) { -#endif - // version 1? - if(ttULONG(font_collection, 4) == 0x00010000 || ttULONG(font_collection, 4) == 0x00020000) { - return ttLONG(font_collection, 8); - } - } - return 0; -} - -static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) -{ - stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; - stbtt__buf pdict; - stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); - if(!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); - pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); - stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); - if(!subrsoff) return stbtt__new_buf(NULL, 0); - stbtt__buf_seek(&cff, private_loc[1] + subrsoff); - return stbtt__cff_get_index(&cff); -} - -// since most people won't use this, find this table the first time it's needed -static int stbtt__get_svg(stbtt_fontinfo * info) -{ - stbtt_uint32 t; - if(info->svg < 0) { - t = stbtt__find_table(info->data, info->fontstart, "SVG "); - if(t) { - stbtt_uint32 offset = ttULONG(info->data, t + 2); - info->svg = t + offset; - } - else { - info->svg = 0; - } - } - return info->svg; -} -#ifdef STBTT_STREAM_TYPE - static int stbtt_InitFont_internal(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int fontstart) -#else - static int stbtt_InitFont_internal(stbtt_fontinfo * info, unsigned char * data, int fontstart) -#endif -{ - stbtt_uint32 cmap, t; - stbtt_int32 i, numTables; - - info->data = data; - info->fontstart = fontstart; - info->cff = stbtt__new_buf(NULL, 0); - - cmap = stbtt__find_table(data, fontstart, "cmap"); // required - info->loca = stbtt__find_table(data, fontstart, "loca"); // required - info->head = stbtt__find_table(data, fontstart, "head"); // required - info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required - info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required - info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required - info->kern = stbtt__find_table(data, fontstart, "kern"); // not required - info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required - - if(!cmap || !info->head || !info->hhea || !info->hmtx) - return 0; - if(info->glyf) { - // required for truetype - if(!info->loca) return 0; - } - else { - // initialization for CFF / Type2 fonts (OTF) - stbtt__buf b, topdict, topdictidx; - stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; - stbtt_uint32 cff; - - cff = stbtt__find_table(data, fontstart, "CFF "); - if(!cff) return 0; - - info->fontdicts = stbtt__new_buf(NULL, 0); - info->fdselect = stbtt__new_buf(NULL, 0); - - // @TODO this should use size from table (not 512MB) - -#ifdef STBTT_STREAM_TYPE - info->cff = stbtt__new_buf(info->data, 512 * 1024 * 1024); - info->cff.offset = cff; -#else - info->cff = stbtt__new_buf(info->data + cff, 512 * 1024 * 1024); -#endif - b = info->cff; - - // read the header - stbtt__buf_skip(&b, 2); - stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize - - // @TODO the name INDEX could list multiple fonts, - // but we just use the first one. - stbtt__cff_get_index(&b); // name INDEX - topdictidx = stbtt__cff_get_index(&b); - topdict = stbtt__cff_index_get(topdictidx, 0); - stbtt__cff_get_index(&b); // string INDEX - info->gsubrs = stbtt__cff_get_index(&b); - - stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); - stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); - stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); - stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); - info->subrs = stbtt__get_subrs(b, topdict); - - // we only support Type 2 charstrings - if(cstype != 2) return 0; - if(charstrings == 0) return 0; - - if(fdarrayoff) { - // looks like a CID font - if(!fdselectoff) return 0; - stbtt__buf_seek(&b, fdarrayoff); - info->fontdicts = stbtt__cff_get_index(&b); - info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size - fdselectoff); - } - - stbtt__buf_seek(&b, charstrings); - info->charstrings = stbtt__cff_get_index(&b); - } - - t = stbtt__find_table(data, fontstart, "maxp"); - if(t) - info->numGlyphs = ttUSHORT(data, t + 4); - else - info->numGlyphs = 0xffff; - - info->svg = -1; - - // find a cmap encoding table we understand *now* to avoid searching - // later. (todo: could make this installable) - // the same regardless of glyph. - numTables = ttUSHORT(data, cmap + 2); - info->index_map = 0; - for(i = 0; i < numTables; ++i) { - stbtt_uint32 encoding_record = cmap + 4 + 8 * i; - // find an encoding we understand: - switch(ttUSHORT(data, encoding_record)) { - case STBTT_PLATFORM_ID_MICROSOFT: - switch(ttUSHORT(data, encoding_record + 2)) { - case STBTT_MS_EID_UNICODE_BMP: - case STBTT_MS_EID_UNICODE_FULL: - // MS/Unicode - info->index_map = cmap + ttULONG(data, encoding_record + 4); - break; - } - break; - case STBTT_PLATFORM_ID_UNICODE: - // Mac/iOS has these - // all the encodingIDs are unicode, so we don't bother to check it - info->index_map = cmap + ttULONG(data, encoding_record + 4); - break; - } - } - if(info->index_map == 0) - return 0; - - info->indexToLocFormat = ttUSHORT(data, info->head + 50); - return 1; -} - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo * info, int unicode_codepoint) -{ -#ifdef STBTT_STREAM_TYPE - STBTT_STREAM_TYPE data = info->data; -#else - stbtt_uint8 * data = info->data; -#endif - stbtt_uint32 index_map = info->index_map; - - stbtt_uint16 format = ttUSHORT(data, index_map + 0); - if(format == 0) { // apple byte encoding - stbtt_int32 bytes = ttUSHORT(data, index_map + 2); - if(unicode_codepoint < bytes - 6) - return ttBYTE(data, index_map + 6 + unicode_codepoint); - return 0; - } - else if(format == 6) { - stbtt_uint32 first = ttUSHORT(data, index_map + 6); - stbtt_uint32 count = ttUSHORT(data, index_map + 8); - if((stbtt_uint32)unicode_codepoint >= first && (stbtt_uint32)unicode_codepoint < first + count) - return ttUSHORT(data, index_map + 10 + (unicode_codepoint - first) * 2); - return 0; - } - else if(format == 2) { - STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean - return 0; - } - else if(format == 4) { // standard mapping for windows fonts: binary search collection of ranges - stbtt_uint16 segcount = ttUSHORT(data, index_map + 6) >> 1; - stbtt_uint16 searchRange = ttUSHORT(data, index_map + 8) >> 1; - stbtt_uint16 entrySelector = ttUSHORT(data, index_map + 10); - stbtt_uint16 rangeShift = ttUSHORT(data, index_map + 12) >> 1; - - // do a binary search of the segments - stbtt_uint32 endCount = index_map + 14; - stbtt_uint32 search = endCount; - - if(unicode_codepoint > 0xffff) - return 0; - - // they lie from endCount .. endCount + segCount - // but searchRange is the nearest power of two, so... - if(unicode_codepoint >= ttUSHORT(data, search + rangeShift * 2)) - search += rangeShift * 2; - - // now decrement to bias correctly to find smallest - search -= 2; - while(entrySelector) { - stbtt_uint16 end; - searchRange >>= 1; - end = ttUSHORT(data, search + searchRange * 2); - if(unicode_codepoint > end) - search += searchRange * 2; - --entrySelector; - } - search += 2; - - { - stbtt_uint16 offset, start, last; - stbtt_uint16 item = (stbtt_uint16)((search - endCount) >> 1); - - start = ttUSHORT(data, index_map + 14 + segcount * 2 + 2 + 2 * item); - last = ttUSHORT(data, endCount + 2 * item); - if(unicode_codepoint < start || unicode_codepoint > last) - return 0; - - offset = ttUSHORT(data, index_map + 14 + segcount * 6 + 2 + 2 * item); - if(offset == 0) - return (stbtt_uint16)(unicode_codepoint + ttSHORT(data, index_map + 14 + segcount * 4 + 2 + 2 * item)); - - return ttUSHORT(data, offset + (unicode_codepoint - start) * 2 + index_map + 14 + segcount * 6 + 2 + 2 * item); - } - } - else if(format == 12 || format == 13) { - stbtt_uint32 ngroups = ttULONG(data, index_map + 12); - stbtt_int32 low, high; - low = 0; - high = (stbtt_int32)ngroups; - // Binary search the right group. - while(low < high) { - stbtt_int32 mid = low + ((high - low) >> 1); // rounds down, so low <= mid < high - stbtt_uint32 start_char = ttULONG(data, index_map + 16 + mid * 12); - stbtt_uint32 end_char = ttULONG(data, index_map + 16 + mid * 12 + 4); - if((stbtt_uint32)unicode_codepoint < start_char) - high = mid; - else if((stbtt_uint32)unicode_codepoint > end_char) - low = mid + 1; - else { - stbtt_uint32 start_glyph = ttULONG(data, index_map + 16 + mid * 12 + 8); - if(format == 12) - return start_glyph + unicode_codepoint - start_char; - else // format == 13 - return start_glyph; - } - } - return 0; // not found - } - // @TODO - STBTT_assert(0); - return 0; -} - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_vertex * *vertices) -{ - return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); -} - -static void stbtt_setvertex(stbtt_vertex * v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, - stbtt_int32 cy) -{ - v->type = type; - v->x = (stbtt_int16)x; - v->y = (stbtt_int16)y; - v->cx = (stbtt_int16)cx; - v->cy = (stbtt_int16)cy; -} - -static int stbtt__GetGlyfOffset(const stbtt_fontinfo * info, int glyph_index) -{ - int g1, g2; - - STBTT_assert(!info->cff.size); - - if(glyph_index >= info->numGlyphs) return -1; // glyph index out of range - if(info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format - - if(info->indexToLocFormat == 0) { - g1 = info->glyf + ttUSHORT(info->data, info->loca + glyph_index * 2) * 2; - g2 = info->glyf + ttUSHORT(info->data, info->loca + glyph_index * 2 + 2) * 2; - } - else { - g1 = info->glyf + ttULONG(info->data, info->loca + glyph_index * 4); - g2 = info->glyf + ttULONG(info->data, info->loca + glyph_index * 4 + 4); - } - - return g1 == g2 ? -1 : g1; // if length is 0, return -1 -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1); - -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1) -{ - if(info->cff.size) { - stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); - } - else { - int g = stbtt__GetGlyfOffset(info, glyph_index); - if(g < 0) return 0; - - if(x0) *x0 = ttSHORT(info->data, g + 2); - if(y0) *y0 = ttSHORT(info->data, g + 4); - if(x1) *x1 = ttSHORT(info->data, g + 6); - if(y1) *y1 = ttSHORT(info->data, g + 8); - } - return 1; -} - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo * info, int codepoint, int * x0, int * y0, int * x1, int * y1) -{ - return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info, codepoint), x0, y0, x1, y1); -} - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo * info, int glyph_index) -{ - stbtt_int16 numberOfContours; - int g; - if(info->cff.size) - return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; - g = stbtt__GetGlyfOffset(info, glyph_index); - if(g < 0) return 1; - numberOfContours = ttSHORT(info->data, g); - return numberOfContours == 0; -} - -static int stbtt__close_shape(stbtt_vertex * vertices, int num_vertices, int was_off, int start_off, - stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) -{ - if(start_off) { - if(was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx + scx) >> 1, (cy + scy) >> 1, cx, cy); - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx, sy, scx, scy); - } - else { - if(was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx, sy, cx, cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, sx, sy, 0, 0); - } - return num_vertices; -} - -static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) -{ - stbtt_int16 numberOfContours; - stbtt_uint32 endPtsOfContours; -#ifdef STBTT_STREAM_TYPE - STBTT_STREAM_TYPE data = info->data; -#else - stbtt_uint8 * data = info->data; -#endif - stbtt_vertex * vertices = 0; - int num_vertices = 0; - int g = stbtt__GetGlyfOffset(info, glyph_index); - - *pvertices = NULL; - - if(g < 0) return 0; - - numberOfContours = ttSHORT(data, g); - - if(numberOfContours > 0) { - stbtt_uint8 flags = 0, flagcount; - stbtt_int32 ins, i, j = 0, m, n, next_move, was_off = 0, off, start_off = 0; - stbtt_int32 x, y, cx, cy, sx, sy, scx, scy; - stbtt_uint32 points; - endPtsOfContours = (g + 10); - ins = ttUSHORT(data, g + 10 + numberOfContours * 2); - points = g + 10 + numberOfContours * 2 + 2 + ins; - - n = 1 + ttUSHORT(data, endPtsOfContours + numberOfContours * 2 - 2); - - m = n + 2 * numberOfContours; // a loose bound on how many vertices we might need - vertices = (stbtt_vertex *)STBTT_malloc(m * sizeof(vertices[0]), info->userdata); - if(vertices == 0) - return 0; - - next_move = 0; - flagcount = 0; - - // in first pass, we load uninterpreted data into the allocated array - // above, shifted to the end of the array so we won't overwrite it when - // we create our final data starting from the front - - off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated - - // first load flags - - for(i = 0; i < n; ++i) { - if(flagcount == 0) { - flags = ttBYTE(data, points++); - if(flags & 8) - flagcount = ttBYTE(data, points++); - } - else - --flagcount; - vertices[off + i].type = flags; - } - - // now load x coordinates - x = 0; - for(i = 0; i < n; ++i) { - flags = vertices[off + i].type; - if(flags & 2) { - stbtt_int16 dx = ttBYTE(data, points++); - x += (flags & 16) ? dx : -dx; // ??? - } - else { - if(!(flags & 16)) { - x = x + (stbtt_int16)(ttBYTE(data, points) * 256 + ttBYTE(data, points + 1)); - points += 2; - } - } - vertices[off + i].x = (stbtt_int16)x; - } - - // now load y coordinates - y = 0; - for(i = 0; i < n; ++i) { - flags = vertices[off + i].type; - if(flags & 4) { - stbtt_int16 dy = ttBYTE(data, points++); - y += (flags & 32) ? dy : -dy; // ??? - } - else { - if(!(flags & 32)) { - y = y + (stbtt_int16)(ttBYTE(data, points) * 256 + ttBYTE(data, points + 1)); - points += 2; - } - } - vertices[off + i].y = (stbtt_int16)y; - } - - // now convert them to our format - num_vertices = 0; - sx = sy = cx = cy = scx = scy = 0; - for(i = 0; i < n; ++i) { - flags = vertices[off + i].type; - x = (stbtt_int16)vertices[off + i].x; - y = (stbtt_int16)vertices[off + i].y; - - if(next_move == i) { - if(i != 0) - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx, sy, scx, scy, cx, cy); - - // now start the new one - start_off = !(flags & 1); - if(start_off) { - // if we start off with an off-curve point, then when we need to find a point on the curve - // where we can start, and we need to save some state for when we wraparound. - scx = x; - scy = y; - if(!(vertices[off + i + 1].type & 1)) { - // next point is also a curve point, so interpolate an on-point curve - sx = (x + (stbtt_int32)vertices[off + i + 1].x) >> 1; - sy = (y + (stbtt_int32)vertices[off + i + 1].y) >> 1; - } - else { - // otherwise just use the next point as our start point - sx = (stbtt_int32)vertices[off + i + 1].x; - sy = (stbtt_int32)vertices[off + i + 1].y; - ++i; // we're using point i+1 as the starting point, so skip it - } - } - else { - sx = x; - sy = y; - } - stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove, sx, sy, 0, 0); - was_off = 0; - next_move = 1 + ttUSHORT(data, endPtsOfContours + j * 2); - ++j; - } - else { - if(!(flags & 1)) { // if it's a curve - if(was_off) // two off-curve control points in a row means interpolate an on-curve midpoint - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx + x) >> 1, (cy + y) >> 1, cx, cy); - cx = x; - cy = y; - was_off = 1; - } - else { - if(was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x, y, cx, cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x, y, 0, 0); - was_off = 0; - } - } - } - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx, sy, scx, scy, cx, cy); - } - else if(numberOfContours < 0) { - // Compound shapes. - int more = 1; - stbtt_uint32 comp = g + 10; - num_vertices = 0; - vertices = 0; - while(more) { - stbtt_uint16 flags, gidx; - int comp_num_verts = 0, i; - stbtt_vertex * comp_verts = 0, * tmp = 0; - float mtx[6] = { 1, 0, 0, 1, 0, 0 }, m, n; - - flags = ttSHORT(data, comp); - comp += 2; - gidx = ttSHORT(data, comp); - comp += 2; - - if(flags & 2) { // XY values - if(flags & 1) { // shorts - mtx[4] = ttSHORT(data, comp); - comp += 2; - mtx[5] = ttSHORT(data, comp); - comp += 2; - } - else { - mtx[4] = ttCHAR(data, comp); - comp += 1; - mtx[5] = ttCHAR(data, comp); - comp += 1; - } - } - else { - // @TODO handle matching point - STBTT_assert(0); - } - if(flags & (1 << 3)) { // WE_HAVE_A_SCALE - mtx[0] = mtx[3] = ttSHORT(data, comp) / 16384.0f; - comp += 2; - mtx[1] = mtx[2] = 0; - } - else if(flags & (1 << 6)) { // WE_HAVE_AN_X_AND_YSCALE - mtx[0] = ttSHORT(data, comp) / 16384.0f; - comp += 2; - mtx[1] = mtx[2] = 0; - mtx[3] = ttSHORT(data, comp) / 16384.0f; - comp += 2; - } - else if(flags & (1 << 7)) { // WE_HAVE_A_TWO_BY_TWO - mtx[0] = ttSHORT(data, comp) / 16384.0f; - comp += 2; - mtx[1] = ttSHORT(data, comp) / 16384.0f; - comp += 2; - mtx[2] = ttSHORT(data, comp) / 16384.0f; - comp += 2; - mtx[3] = ttSHORT(data, comp) / 16384.0f; - comp += 2; - } - - // Find transformation scales. - m = (float)STBTT_sqrt(mtx[0] * mtx[0] + mtx[1] * mtx[1]); - n = (float)STBTT_sqrt(mtx[2] * mtx[2] + mtx[3] * mtx[3]); - - // Get indexed glyph. - comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); - if(comp_num_verts > 0) { - // Transform vertices. - for(i = 0; i < comp_num_verts; ++i) { - stbtt_vertex * v = &comp_verts[i]; - stbtt_vertex_type x, y; - x = v->x; - y = v->y; - v->x = (stbtt_vertex_type)(m * (mtx[0] * x + mtx[2] * y + mtx[4])); - v->y = (stbtt_vertex_type)(n * (mtx[1] * x + mtx[3] * y + mtx[5])); - x = v->cx; - y = v->cy; - v->cx = (stbtt_vertex_type)(m * (mtx[0] * x + mtx[2] * y + mtx[4])); - v->cy = (stbtt_vertex_type)(n * (mtx[1] * x + mtx[3] * y + mtx[5])); - } - // Append vertices. - tmp = (stbtt_vertex *)STBTT_malloc((num_vertices + comp_num_verts) * sizeof(stbtt_vertex), info->userdata); - if(!tmp) { - if(vertices) STBTT_free(vertices, info->userdata); - if(comp_verts) STBTT_free(comp_verts, info->userdata); - return 0; - } - if(num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices * sizeof(stbtt_vertex)); - STBTT_memcpy(tmp + num_vertices, comp_verts, comp_num_verts * sizeof(stbtt_vertex)); - if(vertices) STBTT_free(vertices, info->userdata); - vertices = tmp; - STBTT_free(comp_verts, info->userdata); - num_vertices += comp_num_verts; - } - // More components ? - more = flags & (1 << 5); - } - } - else { - // numberOfCounters == 0, do nothing - } - - *pvertices = vertices; - return num_vertices; -} - -typedef struct { - int bounds; - int started; - float first_x, first_y; - float x, y; - stbtt_int32 min_x, max_x, min_y, max_y; - - stbtt_vertex * pvertices; - int num_vertices; -} stbtt__csctx; - -#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} - -static void stbtt__track_vertex(stbtt__csctx * c, stbtt_int32 x, stbtt_int32 y) -{ - if(x > c->max_x || !c->started) c->max_x = x; - if(y > c->max_y || !c->started) c->max_y = y; - if(x < c->min_x || !c->started) c->min_x = x; - if(y < c->min_y || !c->started) c->min_y = y; - c->started = 1; -} - -static void stbtt__csctx_v(stbtt__csctx * c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, - stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) -{ - if(c->bounds) { - stbtt__track_vertex(c, x, y); - if(type == STBTT_vcubic) { - stbtt__track_vertex(c, cx, cy); - stbtt__track_vertex(c, cx1, cy1); - } - } - else { - stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); - c->pvertices[c->num_vertices].cx1 = (stbtt_int16)cx1; - c->pvertices[c->num_vertices].cy1 = (stbtt_int16)cy1; - } - c->num_vertices++; -} - -static void stbtt__csctx_close_shape(stbtt__csctx * ctx) -{ - if(ctx->first_x != ctx->x || ctx->first_y != ctx->y) - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rmove_to(stbtt__csctx * ctx, float dx, float dy) -{ - stbtt__csctx_close_shape(ctx); - ctx->first_x = ctx->x = ctx->x + dx; - ctx->first_y = ctx->y = ctx->y + dy; - stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rline_to(stbtt__csctx * ctx, float dx, float dy) -{ - ctx->x += dx; - ctx->y += dy; - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rccurve_to(stbtt__csctx * ctx, float dx1, float dy1, float dx2, float dy2, float dx3, - float dy3) -{ - float cx1 = ctx->x + dx1; - float cy1 = ctx->y + dy1; - float cx2 = cx1 + dx2; - float cy2 = cy1 + dy2; - ctx->x = cx2 + dx3; - ctx->y = cy2 + dy3; - stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); -} - -static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) -{ - int count = stbtt__cff_index_count(&idx); - int bias = 107; - if(count >= 33900) - bias = 32768; - else if(count >= 1240) - bias = 1131; - n += bias; - if(n < 0 || n >= count) - return stbtt__new_buf(NULL, 0); - return stbtt__cff_index_get(idx, n); -} - -static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo * info, int glyph_index) -{ - stbtt__buf fdselect = info->fdselect; - int nranges, start, end, v, fmt, fdselector = -1, i; - - stbtt__buf_seek(&fdselect, 0); - fmt = stbtt__buf_get8(&fdselect); - if(fmt == 0) { - // untested - stbtt__buf_skip(&fdselect, glyph_index); - fdselector = stbtt__buf_get8(&fdselect); - } - else if(fmt == 3) { - nranges = stbtt__buf_get16(&fdselect); - start = stbtt__buf_get16(&fdselect); - for(i = 0; i < nranges; i++) { - v = stbtt__buf_get8(&fdselect); - end = stbtt__buf_get16(&fdselect); - if(glyph_index >= start && glyph_index < end) { - fdselector = v; - break; - } - start = end; - } - } - if(fdselector == -1) stbtt__new_buf(NULL, 0); - return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); -} - -static int stbtt__run_charstring(const stbtt_fontinfo * info, int glyph_index, stbtt__csctx * c) -{ - int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; - int has_subrs = 0, clear_stack; - float s[48]; - stbtt__buf subr_stack[10], subrs = info->subrs, b; - float f; - -#define STBTT__CSERR(s) (0) - - // this currently ignores the initial width value, which isn't needed if we have hmtx - b = stbtt__cff_index_get(info->charstrings, glyph_index); - while(b.cursor < b.size) { - i = 0; - clear_stack = 1; - b0 = stbtt__buf_get8(&b); - switch(b0) { - // @TODO implement hinting - case 0x13: // hintmask - case 0x14: // cntrmask - if(in_header) - maskbits += (sp / 2); // implicit "vstem" - in_header = 0; - stbtt__buf_skip(&b, (maskbits + 7) / 8); - break; - - case 0x01: // hstem - case 0x03: // vstem - case 0x12: // hstemhm - case 0x17: // vstemhm - maskbits += (sp / 2); - break; - - case 0x15: // rmoveto - in_header = 0; - if(sp < 2) return STBTT__CSERR("rmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp - 2], s[sp - 1]); - break; - case 0x04: // vmoveto - in_header = 0; - if(sp < 1) return STBTT__CSERR("vmoveto stack"); - stbtt__csctx_rmove_to(c, 0, s[sp - 1]); - break; - case 0x16: // hmoveto - in_header = 0; - if(sp < 1) return STBTT__CSERR("hmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp - 1], 0); - break; - - case 0x05: // rlineto - if(sp < 2) return STBTT__CSERR("rlineto stack"); - for(; i + 1 < sp; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i + 1]); - break; - - // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical - // starting from a different place. - - case 0x07: // vlineto - if(sp < 1) return STBTT__CSERR("vlineto stack"); - goto vlineto; - case 0x06: // hlineto - if(sp < 1) return STBTT__CSERR("hlineto stack"); - for(;;) { - if(i >= sp) break; - stbtt__csctx_rline_to(c, s[i], 0); - i++; -vlineto: - if(i >= sp) break; - stbtt__csctx_rline_to(c, 0, s[i]); - i++; - } - break; - - case 0x1F: // hvcurveto - if(sp < 4) return STBTT__CSERR("hvcurveto stack"); - goto hvcurveto; - case 0x1E: // vhcurveto - if(sp < 4) return STBTT__CSERR("vhcurveto stack"); - for(;;) { - if(i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, 0, s[i], s[i + 1], s[i + 2], s[i + 3], (sp - i == 5) ? s[i + 4] : 0.0f); - i += 4; -hvcurveto: - if(i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, s[i], 0, s[i + 1], s[i + 2], (sp - i == 5) ? s[i + 4] : 0.0f, s[i + 3]); - i += 4; - } - break; - - case 0x08: // rrcurveto - if(sp < 6) return STBTT__CSERR("rcurveline stack"); - for(; i + 5 < sp; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); - break; - - case 0x18: // rcurveline - if(sp < 8) return STBTT__CSERR("rcurveline stack"); - for(; i + 5 < sp - 2; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); - if(i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); - stbtt__csctx_rline_to(c, s[i], s[i + 1]); - break; - - case 0x19: // rlinecurve - if(sp < 8) return STBTT__CSERR("rlinecurve stack"); - for(; i + 1 < sp - 6; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i + 1]); - if(i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); - stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); - break; - - case 0x1A: // vvcurveto - case 0x1B: // hhcurveto - if(sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); - f = 0.0; - if(sp & 1) { - f = s[i]; - i++; - } - for(; i + 3 < sp; i += 4) { - if(b0 == 0x1B) - stbtt__csctx_rccurve_to(c, s[i], f, s[i + 1], s[i + 2], s[i + 3], 0.0); - else - stbtt__csctx_rccurve_to(c, f, s[i], s[i + 1], s[i + 2], 0.0, s[i + 3]); - f = 0.0; - } - break; - - case 0x0A: // callsubr - if(!has_subrs) { - if(info->fdselect.size) - subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); - has_subrs = 1; - } - // FALLTHROUGH - case 0x1D: // callgsubr - if(sp < 1) return STBTT__CSERR("call(g|)subr stack"); - v = (int)s[--sp]; - if(subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); - subr_stack[subr_stack_height++] = b; - b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); - if(b.size == 0) return STBTT__CSERR("subr not found"); - b.cursor = 0; - clear_stack = 0; - break; - - case 0x0B: // return - if(subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); - b = subr_stack[--subr_stack_height]; - clear_stack = 0; - break; - - case 0x0E: // endchar - stbtt__csctx_close_shape(c); - return 1; - - case 0x0C: { // two-byte escape - float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; - float dx, dy; - int b1 = stbtt__buf_get8(&b); - switch(b1) { - // @TODO These "flex" implementations ignore the flex-depth and resolution, - // and always draw beziers. - case 0x22: // hflex - if(sp < 7) return STBTT__CSERR("hflex stack"); - dx1 = s[0]; - dx2 = s[1]; - dy2 = s[2]; - dx3 = s[3]; - dx4 = s[4]; - dx5 = s[5]; - dx6 = s[6]; - stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); - break; - - case 0x23: // flex - if(sp < 13) return STBTT__CSERR("flex stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = s[10]; - dy6 = s[11]; - //fd is s[12] - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - case 0x24: // hflex1 - if(sp < 9) return STBTT__CSERR("hflex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dx4 = s[5]; - dx5 = s[6]; - dy5 = s[7]; - dx6 = s[8]; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1 + dy2 + dy5)); - break; - - case 0x25: // flex1 - if(sp < 11) return STBTT__CSERR("flex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = dy6 = s[10]; - dx = dx1 + dx2 + dx3 + dx4 + dx5; - dy = dy1 + dy2 + dy3 + dy4 + dy5; - if(STBTT_fabs(dx) > STBTT_fabs(dy)) - dy6 = -dy; - else - dx6 = -dx; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - default: - return STBTT__CSERR("unimplemented"); - } - } - break; - - default: - if(b0 != 255 && b0 != 28 && b0 < 32) - return STBTT__CSERR("reserved operator"); - - // push immediate - if(b0 == 255) { - f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; - } - else { - stbtt__buf_skip(&b, -1); - f = (float)(stbtt_int16)stbtt__cff_int(&b); - } - if(sp >= 48) return STBTT__CSERR("push stack overflow"); - s[sp++] = f; - clear_stack = 0; - break; - } - if(clear_stack) sp = 0; - } - return STBTT__CSERR("no endchar"); - -#undef STBTT__CSERR -} - -static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) -{ - // runs the charstring twice, once to count and once to output (to avoid realloc) - stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); - stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); - if(stbtt__run_charstring(info, glyph_index, &count_ctx)) { - *pvertices = (stbtt_vertex *)STBTT_malloc(count_ctx.num_vertices * sizeof(stbtt_vertex), info->userdata); - output_ctx.pvertices = *pvertices; - if(stbtt__run_charstring(info, glyph_index, &output_ctx)) { - STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); - return output_ctx.num_vertices; - } - } - *pvertices = NULL; - return 0; -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1) -{ - stbtt__csctx c = STBTT__CSCTX_INIT(1); - int r = stbtt__run_charstring(info, glyph_index, &c); - if(x0) *x0 = r ? c.min_x : 0; - if(y0) *y0 = r ? c.min_y : 0; - if(x1) *x1 = r ? c.max_x : 0; - if(y1) *y1 = r ? c.max_y : 0; - return r ? c.num_vertices : 0; -} - -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) -{ - if(!info->cff.size) - return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); - else - return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); -} - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo * info, int glyph_index, int * advanceWidth, - int * leftSideBearing) -{ - stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data, info->hhea + 34); - if(glyph_index < numOfLongHorMetrics) { - if(advanceWidth) *advanceWidth = ttSHORT(info->data, info->hmtx + 4 * glyph_index); - if(leftSideBearing) *leftSideBearing = ttSHORT(info->data, info->hmtx + 4 * glyph_index + 2); - } - else { - if(advanceWidth) *advanceWidth = ttSHORT(info->data, info->hmtx + 4 * (numOfLongHorMetrics - 1)); - if(leftSideBearing) *leftSideBearing = ttSHORT(info->data, - info->hmtx + 4 * numOfLongHorMetrics + 2 * (glyph_index - numOfLongHorMetrics)); - } -} - -STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo * info) -{ - // we only look at the first table. it must be 'horizontal' and format 0. - if(!info->kern) - return 0; - if(ttUSHORT(info->data, 2 + info->kern) < 1) // number of tables, need at least 1 - return 0; - if(ttUSHORT(info->data, 8 + info->kern) != 1) // horizontal flag must be set in format - return 0; - - return ttUSHORT(info->data, 10 + info->kern); -} - -STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo * info, stbtt_kerningentry * table, int table_length) -{ - int k, length; - - // we only look at the first table. it must be 'horizontal' and format 0. - if(!info->kern) - return 0; - if(ttUSHORT(info->data, 2 + info->kern) < 1) // number of tables, need at least 1 - return 0; - if(ttUSHORT(info->data, 8 + info->kern) != 1) // horizontal flag must be set in format - return 0; - - length = ttUSHORT(info->data, 10 + info->kern); - if(table_length < length) - length = table_length; - - for(k = 0; k < length; k++) { - table[k].glyph1 = ttUSHORT(info->data, 18 + (k * 6) + info->kern); - table[k].glyph2 = ttUSHORT(info->data, 20 + (k * 6) + info->kern); - table[k].advance = ttSHORT(info->data, 22 + (k * 6) + info->kern); - } - - return length; -} - -static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2) -{ - stbtt_uint32 needle, straw; - int l, r, m; - - // we only look at the first table. it must be 'horizontal' and format 0. - if(!info->kern) - return 0; - if(ttUSHORT(info->data, info->kern + 2) < 1) // number of tables, need at least 1 - return 0; - if(ttUSHORT(info->data, info->kern + 8) != 1) // horizontal flag must be set in format - return 0; - - l = 0; - r = ttUSHORT(info->data, info->kern + 10) - 1; - needle = glyph1 << 16 | glyph2; - while(l <= r) { - m = (l + r) >> 1; - straw = ttULONG(info->data, info->kern + 18 + (m * 6)); // note: unaligned read - if(needle < straw) - r = m - 1; - else if(needle > straw) - l = m + 1; - else - return ttSHORT(info->data, info->kern + 22 + (m * 6)); - } - return 0; -} -#ifdef STBTT_STREAM_TYPE - static stbtt_int32 stbtt__GetCoverageIndex(STBTT_STREAM_TYPE data, stbtt_uint32 coverageTable, int glyph) -#else - static stbtt_int32 stbtt__GetCoverageIndex(const stbtt_uint8 * data, stbtt_uint32 coverageTable, int glyph) -#endif -{ - stbtt_uint16 coverageFormat = ttUSHORT(data, coverageTable); - switch(coverageFormat) { - case 1: { - stbtt_uint16 glyphCount = ttUSHORT(data, coverageTable + 2); - - // Binary search. - stbtt_int32 l = 0, r = glyphCount - 1, m; - int straw, needle = glyph; - while(l <= r) { - stbtt_uint32 glyphArray = coverageTable + 4; - stbtt_uint16 glyphID; - m = (l + r) >> 1; - glyphID = ttUSHORT(data, glyphArray + 2 * m); - straw = glyphID; - if(needle < straw) - r = m - 1; - else if(needle > straw) - l = m + 1; - else { - return m; - } - } - break; - } - - case 2: { - stbtt_uint16 rangeCount = ttUSHORT(data, coverageTable + 2); - stbtt_uint32 rangeArray = coverageTable + 4; - - // Binary search. - stbtt_int32 l = 0, r = rangeCount - 1, m; - int strawStart, strawEnd, needle = glyph; - while(l <= r) { - stbtt_uint32 rangeRecord; - m = (l + r) >> 1; - rangeRecord = rangeArray + 6 * m; - strawStart = ttUSHORT(data, rangeRecord); - strawEnd = ttUSHORT(data, rangeRecord + 2); - if(needle < strawStart) - r = m - 1; - else if(needle > strawEnd) - l = m + 1; - else { - stbtt_uint16 startCoverageIndex = ttUSHORT(data, rangeRecord + 4); - return startCoverageIndex + glyph - strawStart; - } - } - break; - } - - default: - return -1; // unsupported - } - - return -1; -} -#ifdef STBTT_STREAM_TYPE - static stbtt_int32 stbtt__GetGlyphClass(STBTT_STREAM_TYPE data, stbtt_uint32 classDefTable, int glyph) -#else - static stbtt_int32 stbtt__GetGlyphClass(const stbtt_uint8 * data, stbtt_uint32 classDefTable, int glyph) -#endif -{ - stbtt_uint16 classDefFormat = ttUSHORT(data, classDefTable); - switch(classDefFormat) { - case 1: { - stbtt_uint16 startGlyphID = ttUSHORT(data, classDefTable + 2); - stbtt_uint16 glyphCount = ttUSHORT(data, classDefTable + 4); - stbtt_uint32 classDef1ValueArray = classDefTable + 6; - - if(glyph >= startGlyphID && glyph < startGlyphID + glyphCount) - return (stbtt_int32)ttUSHORT(data, classDef1ValueArray + 2 * (glyph - startGlyphID)); - break; - } - - case 2: { - stbtt_uint16 classRangeCount = ttUSHORT(data, classDefTable + 2); - stbtt_uint32 classRangeRecords = classDefTable + 4; - - // Binary search. - stbtt_int32 l = 0, r = classRangeCount - 1, m; - int strawStart, strawEnd, needle = glyph; - while(l <= r) { - stbtt_uint32 classRangeRecord; - m = (l + r) >> 1; - classRangeRecord = classRangeRecords + 6 * m; - strawStart = ttUSHORT(data, classRangeRecord); - strawEnd = ttUSHORT(data, classRangeRecord + 2); - if(needle < strawStart) - r = m - 1; - else if(needle > strawEnd) - l = m + 1; - else - return (stbtt_int32)ttUSHORT(data, classRangeRecord + 4); - } - break; - } - - default: - return -1; // Unsupported definition type, return an error. - } - - // "All glyphs not assigned to a class fall into class 0". (OpenType spec) - return 0; -} - -// Define to STBTT_assert(x) if you want to break on unimplemented formats. -#define STBTT_GPOS_TODO_assert(x) - -static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2) -{ - stbtt_uint16 lookupListOffset; - stbtt_uint32 lookupList; - stbtt_uint16 lookupCount; -#ifdef STBTT_STREAM_TYPE - STBTT_STREAM_TYPE data = info->data; -#else - const stbtt_uint8 * data = info->data; -#endif - stbtt_int32 i, sti; - - if(!info->gpos) return 0; - - if(ttUSHORT(data, 0 + info->gpos) != 1) return 0; // Major version 1 - if(ttUSHORT(data, 2 + info->gpos) != 0) return 0; // Minor version 0 - - lookupListOffset = ttUSHORT(data, 8 + info->gpos); - lookupList = lookupListOffset; - lookupCount = ttUSHORT(data, lookupList); - - for(i = 0; i < lookupCount; ++i) { - stbtt_uint16 lookupOffset = ttUSHORT(data, lookupList + 2 + 2 * i); - stbtt_uint32 lookupTable = lookupList + lookupOffset; - - stbtt_uint16 lookupType = ttUSHORT(data, lookupTable); - stbtt_uint16 subTableCount = ttUSHORT(data, lookupTable + 4); - stbtt_uint32 subTableOffsets = lookupTable + 6; - if(lookupType != 2) // Pair Adjustment Positioning Subtable - continue; - - for(sti = 0; sti < subTableCount; sti++) { - stbtt_uint16 subtableOffset = ttUSHORT(data, subTableOffsets + 2 * sti); - stbtt_uint32 table = lookupTable + subtableOffset; - stbtt_uint16 posFormat = ttUSHORT(data, table); - stbtt_uint16 coverageOffset = ttUSHORT(data, table + 2); - stbtt_int32 coverageIndex = stbtt__GetCoverageIndex(data, table + coverageOffset, glyph1); - if(coverageIndex == -1) continue; - - switch(posFormat) { - case 1: { - stbtt_int32 l, r, m; - int straw, needle; - stbtt_uint16 valueFormat1 = ttUSHORT(data, table + 4); - stbtt_uint16 valueFormat2 = ttUSHORT(data, table + 6); - if(valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? - stbtt_int32 valueRecordPairSizeInBytes = 2; - stbtt_uint16 pairSetCount = ttUSHORT(data, table + 8); - stbtt_uint16 pairPosOffset = ttUSHORT(data, table + 10 + 2 * coverageIndex); - stbtt_uint32 pairValueTable = table + pairPosOffset; - stbtt_uint16 pairValueCount = ttUSHORT(data, pairValueTable); - stbtt_uint32 pairValueArray = pairValueTable + 2; - - if(coverageIndex >= pairSetCount) return 0; - - needle = glyph2; - r = pairValueCount - 1; - l = 0; - - // Binary search. - while(l <= r) { - stbtt_uint16 secondGlyph; - stbtt_uint32 pairValue; - m = (l + r) >> 1; - pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; - secondGlyph = ttUSHORT(data, pairValue); - straw = secondGlyph; - if(needle < straw) - r = m - 1; - else if(needle > straw) - l = m + 1; - else { - stbtt_int16 xAdvance = ttSHORT(data, pairValue + 2); - return xAdvance; - } - } - } - else - return 0; - break; - } - - case 2: { - stbtt_uint16 valueFormat1 = ttUSHORT(data, table + 4); - stbtt_uint16 valueFormat2 = ttUSHORT(data, table + 6); - if(valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? - stbtt_uint16 classDef1Offset = ttUSHORT(data, table + 8); - stbtt_uint16 classDef2Offset = ttUSHORT(data, table + 10); - int glyph1class = stbtt__GetGlyphClass(data, table + classDef1Offset, glyph1); - int glyph2class = stbtt__GetGlyphClass(data, table + classDef2Offset, glyph2); - - stbtt_uint16 class1Count = ttUSHORT(data, table + 12); - stbtt_uint16 class2Count = ttUSHORT(data, table + 14); - stbtt_uint32 class1Records, class2Records; - stbtt_int16 xAdvance; - - if(glyph1class < 0 || glyph1class >= class1Count) return 0; // malformed - if(glyph2class < 0 || glyph2class >= class2Count) return 0; // malformed - - class1Records = table + 16; - class2Records = class1Records + 2 * (glyph1class * class2Count); - xAdvance = ttSHORT(data, class2Records + 2 * glyph2class); - return xAdvance; - } - else - return 0; - break; - } - - default: - return 0; // Unsupported position format - } - } - } - return 0; -} - -STBTT_DEF int stbtt_KernTableCheck(const stbtt_fontinfo * info) -{ - if(info->gpos) { - stbtt_uint16 lookupListOffset; - stbtt_uint32 lookupList; - stbtt_uint16 lookupCount; -#ifdef STBTT_STREAM_TYPE - STBTT_STREAM_TYPE data = info->data; -#else - const stbtt_uint8 * data = info->data; -#endif - stbtt_int32 i; - - if(!info->gpos) return 0; - - if(ttUSHORT(data, 0 + info->gpos) != 1) return 0; // Major version 1 - if(ttUSHORT(data, 2 + info->gpos) != 0) return 0; // Minor version 0 - - lookupListOffset = ttUSHORT(data, 8 + info->gpos); - lookupList = lookupListOffset; - lookupCount = ttUSHORT(data, lookupList); - - for(i = 0; i < lookupCount; ++i) { - stbtt_uint16 lookupOffset = ttUSHORT(data, lookupList + 2 + 2 * i); - stbtt_uint32 lookupTable = lookupList + lookupOffset; - - stbtt_uint16 lookupType = ttUSHORT(data, lookupTable); - - if(lookupType != 2) // Pair Adjustment Positioning Subtable - continue; - - return 1; // we have a usable lookup table. - } - return 0; - } - else if(info->kern) { - return 1; - } - return 0; -} - -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo * info, int g1, int g2) -{ - int xAdvance = 0; - - if(info->gpos) - xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); - else if(info->kern) - xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); - - return xAdvance; -} - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo * info, int ch1, int ch2) -{ - if(!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs - return 0; - return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info, ch1), stbtt_FindGlyphIndex(info, ch2)); -} - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo * info, int codepoint, int * advanceWidth, - int * leftSideBearing) -{ - stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info, codepoint), advanceWidth, leftSideBearing); -} - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo * info, int * ascent, int * descent, int * lineGap) -{ - if(ascent) *ascent = ttSHORT(info->data, info->hhea + 4); - if(descent) *descent = ttSHORT(info->data, info->hhea + 6); - if(lineGap) *lineGap = ttSHORT(info->data, info->hhea + 8); -} - -STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo * info, int * typoAscent, int * typoDescent, - int * typoLineGap) -{ - int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); - if(!tab) - return 0; - if(typoAscent) *typoAscent = ttSHORT(info->data, tab + 68); - if(typoDescent) *typoDescent = ttSHORT(info->data, tab + 70); - if(typoLineGap) *typoLineGap = ttSHORT(info->data, tab + 72); - return 1; -} - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo * info, int * x0, int * y0, int * x1, int * y1) -{ - *x0 = ttSHORT(info->data, info->head + 36); - *y0 = ttSHORT(info->data, info->head + 38); - *x1 = ttSHORT(info->data, info->head + 40); - *y1 = ttSHORT(info->data, info->head + 42); -} - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo * info, float height) -{ - int fheight = ttSHORT(info->data, info->hhea + 4) - ttSHORT(info->data, info->hhea + 6); - return (float)height / fheight; -} - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo * info, float pixels) -{ - int unitsPerEm = ttUSHORT(info->data, info->head + 18); - return pixels / unitsPerEm; -} - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo * info, stbtt_vertex * v) -{ - STBTT_free(v, info->userdata); -} - -STBTT_DEF stbtt_uint32 stbtt_FindSVGDoc(const stbtt_fontinfo * info, int gl) -{ - int i; - stbtt_uint32 svg_doc_list = stbtt__get_svg((stbtt_fontinfo *)info); - - int numEntries = ttUSHORT(info->data, svg_doc_list); - stbtt_uint32 svg_docs = svg_doc_list + 2; - - for(i = 0; i < numEntries; i++) { - stbtt_uint32 svg_doc = svg_docs + (12 * i); - if((gl >= ttUSHORT(info->data, svg_doc)) && (gl <= ttUSHORT(info->data, svg_doc + 2))) - return svg_doc; - } - return 0; -} - -STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo * info, int gl, stbtt_uint32 * svgOfs) -{ - stbtt_uint32 svg_doc; - - if(info->svg == 0) - return 0; - - svg_doc = stbtt_FindSVGDoc(info, gl); - if(svg_doc != 0) { - *svgOfs = info->svg + ttULONG(info->data, svg_doc + 4); - return ttULONG(info->data, svg_doc + 8); - } - else { - return 0; - } -} - -STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_uint32 * svgOfs) -{ - return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svgOfs); -} - -////////////////////////////////////////////////////////////////////////////// -// -// antialiasing software rasterizer -// - -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, - float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1) -{ - int x0 = 0, y0 = 0, x1, y1; // =0 suppresses compiler warning - if(!stbtt_GetGlyphBox(font, glyph, &x0, &y0, &x1, &y1)) { - // e.g. space character - if(ix0) *ix0 = 0; - if(iy0) *iy0 = 0; - if(ix1) *ix1 = 0; - if(iy1) *iy1 = 0; - } - else { - // move to integral bboxes (treating pixels as little squares, what pixels get touched)? - if(ix0) *ix0 = STBTT_ifloor(x0 * scale_x + shift_x); - if(iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); - if(ix1) *ix1 = STBTT_iceil(x1 * scale_x + shift_x); - if(iy1) *iy1 = STBTT_iceil(-y0 * scale_y + shift_y); - } -} - -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, int * ix0, - int * iy0, int * ix1, int * iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y, 0.0f, 0.0f, ix0, iy0, ix1, iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo * font, int codepoint, float scale_x, - float scale_y, float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font, codepoint), scale_x, scale_y, shift_x, shift_y, ix0, - iy0, ix1, iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo * font, int codepoint, float scale_x, float scale_y, - int * ix0, int * iy0, int * ix1, int * iy1) -{ - stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y, 0.0f, 0.0f, ix0, iy0, ix1, iy1); -} - -////////////////////////////////////////////////////////////////////////////// -// -// Rasterizer - -typedef struct stbtt__hheap_chunk { - struct stbtt__hheap_chunk * next; -} stbtt__hheap_chunk; - -typedef struct stbtt__hheap { - struct stbtt__hheap_chunk * head; - void * first_free; - int num_remaining_in_head_chunk; -} stbtt__hheap; - -static void * stbtt__hheap_alloc(stbtt__hheap * hh, size_t size, void * userdata) -{ - if(hh->first_free) { - void * p = hh->first_free; - hh->first_free = *(void **)p; - return p; - } - else { - if(hh->num_remaining_in_head_chunk == 0) { - int count = (size < 32 ? STBTT_HEAP_FACTOR_SIZE_32 : size < 128 ? STBTT_HEAP_FACTOR_SIZE_128 : - STBTT_HEAP_FACTOR_SIZE_DEFAULT); - stbtt__hheap_chunk * c = (stbtt__hheap_chunk *)STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); - if(c == NULL) - return NULL; - c->next = hh->head; - hh->head = c; - hh->num_remaining_in_head_chunk = count; - } - --hh->num_remaining_in_head_chunk; - return (char *)(hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; - } -} - -static void stbtt__hheap_free(stbtt__hheap * hh, void * p) -{ - *(void **)p = hh->first_free; - hh->first_free = p; -} - -static void stbtt__hheap_cleanup(stbtt__hheap * hh, void * userdata) -{ - stbtt__hheap_chunk * c = hh->head; - while(c) { - stbtt__hheap_chunk * n = c->next; - STBTT_free(c, userdata); - c = n; - } -} - -typedef struct stbtt__edge { - float x0, y0, x1, y1; - int invert; -} stbtt__edge; - -typedef struct stbtt__active_edge { - struct stbtt__active_edge * next; -#if STBTT_RASTERIZER_VERSION==1 - int x, dx; - float ey; - int direction; -#elif STBTT_RASTERIZER_VERSION==2 - float fx, fdx, fdy; - float direction; - float sy; - float ey; -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif -} stbtt__active_edge; - -#if STBTT_RASTERIZER_VERSION == 1 -#define STBTT_FIXSHIFT 10 -#define STBTT_FIX (1 << STBTT_FIXSHIFT) -#define STBTT_FIXMASK (STBTT_FIX-1) - -static stbtt__active_edge * stbtt__new_active(stbtt__hheap * hh, stbtt__edge * e, int off_x, float start_point, - void * userdata) -{ - stbtt__active_edge * z = (stbtt__active_edge *)stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - if(!z) return z; - - // round dx down to avoid overshooting - if(dxdy < 0) - z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); - else - z->dx = STBTT_ifloor(STBTT_FIX * dxdy); - - z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - - e->y0)); // use z->dx so when we offset later it's by the same amount - z->x -= off_x * STBTT_FIX; - - z->ey = e->y1; - z->next = 0; - z->direction = e->invert ? 1 : -1; - return z; -} -#elif STBTT_RASTERIZER_VERSION == 2 -static stbtt__active_edge * stbtt__new_active(stbtt__hheap * hh, stbtt__edge * e, int off_x, float start_point, - void * userdata) -{ - stbtt__active_edge * z = (stbtt__active_edge *)stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - //STBTT_assert(e->y0 <= start_point); - if(!z) return z; - z->fdx = dxdy; - z->fdy = dxdy != 0.0f ? (1.0f / dxdy) : 0.0f; - z->fx = e->x0 + dxdy * (start_point - e->y0); - z->fx -= off_x; - z->direction = e->invert ? 1.0f : -1.0f; - z->sy = e->y0; - z->ey = e->y1; - z->next = 0; - return z; -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#if STBTT_RASTERIZER_VERSION == 1 -// note: this routine clips fills that extend off the edges... ideally this -// wouldn't happen, but it could happen if the truetype glyph bounding boxes -// are wrong, or if the user supplies a too-small bitmap -static void stbtt__fill_active_edges(unsigned char * scanline, int len, stbtt__active_edge * e, int max_weight) -{ - // non-zero winding fill - int x0 = 0, w = 0; - - while(e) { - if(w == 0) { - // if we're currently at zero, we need to record the edge start point - x0 = e->x; - w += e->direction; - } - else { - int x1 = e->x; - w += e->direction; - // if we went to zero, we need to draw - if(w == 0) { - int i = x0 >> STBTT_FIXSHIFT; - int j = x1 >> STBTT_FIXSHIFT; - - if(i < len && j >= 0) { - if(i == j) { - // x0,x1 are the same pixel, so compute combined coverage - scanline[i] = scanline[i] + (stbtt_uint8)((x1 - x0) * max_weight >> STBTT_FIXSHIFT); - } - else { - if(i >= 0) // add antialiasing for x0 - scanline[i] = scanline[i] + (stbtt_uint8)(((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); - else - i = -1; // clip - - if(j < len) // add antialiasing for x1 - scanline[j] = scanline[j] + (stbtt_uint8)(((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); - else - j = len; // clip - - for(++i; i < j; ++i) // fill pixels between x0 and x1 - scanline[i] = scanline[i] + (stbtt_uint8)max_weight; - } - } - } - } - - e = e->next; - } -} - -static void stbtt__rasterize_sorted_edges(stbtt__bitmap * result, stbtt__edge * e, int n, int vsubsample, int off_x, - int off_y, void * userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge * active = NULL; - int y, j = 0; - int max_weight = (255 / vsubsample); // weight per vertical scanline - int s; // vertical subsample index - unsigned char scanline_data[512], * scanline; - - if(result->w > 512) - scanline = (unsigned char *)STBTT_malloc(result->w, userdata); - else - scanline = scanline_data; - - y = off_y * vsubsample; - e[n].y0 = (off_y + result->h) * (float)vsubsample + 1; - - while(j < result->h) { - STBTT_memset(scanline, 0, result->w); - for(s = 0; s < vsubsample; ++s) { - // find center of pixel for this scanline - float scan_y = y + 0.5f; - stbtt__active_edge ** step = &active; - - // update all active edges; - // remove all active edges that terminate before the center of this scanline - while(*step) { - stbtt__active_edge * z = *step; - if(z->ey <= scan_y) { - *step = z->next; // delete from list - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } - else { - z->x += z->dx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - } - - // resort the list if needed - for(;;) { - int changed = 0; - step = &active; - while(*step && (*step)->next) { - if((*step)->x > (*step)->next->x) { - stbtt__active_edge * t = *step; - stbtt__active_edge * q = t->next; - - t->next = q->next; - q->next = t; - *step = q; - changed = 1; - } - step = &(*step)->next; - } - if(!changed) break; - } - - // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline - while(e->y0 <= scan_y) { - if(e->y1 > scan_y) { - stbtt__active_edge * z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); - if(z != NULL) { - // find insertion point - if(active == NULL) - active = z; - else if(z->x < active->x) { - // insert at front - z->next = active; - active = z; - } - else { - // find thing to insert AFTER - stbtt__active_edge * p = active; - while(p->next && p->next->x < z->x) - p = p->next; - // at this point, p->next->x is NOT < z->x - z->next = p->next; - p->next = z; - } - } - } - ++e; - } - - // now process all active edges in XOR fashion - if(active) - stbtt__fill_active_edges(scanline, result->w, active, max_weight); - - ++y; - } - STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if(scanline != scanline_data) - STBTT_free(scanline, userdata); -} - -#elif STBTT_RASTERIZER_VERSION == 2 - -// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 -// (i.e. it has already been clipped to those) -static void stbtt__handle_clipped_edge(float * scanline, int x, stbtt__active_edge * e, float x0, float y0, float x1, - float y1) -{ - if(y0 == y1) return; - STBTT_assert(y0 < y1); - STBTT_assert(e->sy <= e->ey); - if(y0 > e->ey) return; - if(y1 < e->sy) return; - if(y0 < e->sy) { - x0 += (x1 - x0) * (e->sy - y0) / (y1 - y0); - y0 = e->sy; - } - if(y1 > e->ey) { - x1 += (x1 - x0) * (e->ey - y1) / (y1 - y0); - y1 = e->ey; - } - - if(x0 == x) - STBTT_assert(x1 <= x + 1); - else if(x0 == x + 1) - STBTT_assert(x1 >= x); - else if(x0 <= x) - STBTT_assert(x1 <= x); - else if(x0 >= x + 1) - STBTT_assert(x1 >= x + 1); - else - STBTT_assert(x1 >= x && x1 <= x + 1); - - if(x0 <= x && x1 <= x) - scanline[x] += e->direction * (y1 - y0); - else if(x0 >= x + 1 && x1 >= x + 1) { - /*Nothing to do*/; - } - else { - STBTT_assert(x0 >= x && x0 <= x + 1 && x1 >= x && x1 <= x + 1); - scanline[x] += e->direction * (y1 - y0) * (1 - ((x0 - x) + (x1 - x)) / 2); // coverage = 1 - average x position - } -} - -static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width) -{ - STBTT_assert(top_width >= 0); - STBTT_assert(bottom_width >= 0); - return (top_width + bottom_width) / 2.0f * height; -} - -static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1) -{ - return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0); -} - -static float stbtt__sized_triangle_area(float height, float width) -{ - return height * width / 2; -} - -static void stbtt__fill_active_edges_new(float * scanline, float * scanline_fill, int len, stbtt__active_edge * e, - float y_top) -{ - float y_bottom = y_top + 1; - - while(e) { - // brute force every pixel - - // compute intersection points with top & bottom - STBTT_assert(e->ey >= y_top); - - if(e->fdx == 0) { - float x0 = e->fx; - if(x0 < len) { - if(x0 >= 0) { - stbtt__handle_clipped_edge(scanline, (int)x0, e, x0, y_top, x0, y_bottom); - stbtt__handle_clipped_edge(scanline_fill - 1, (int)x0 + 1, e, x0, y_top, x0, y_bottom); - } - else { - stbtt__handle_clipped_edge(scanline_fill - 1, 0, e, x0, y_top, x0, y_bottom); - } - } - } - else { - float x0 = e->fx; - float dx = e->fdx; - float xb = x0 + dx; - float x_top, x_bottom; - float sy0, sy1; - float dy = e->fdy; - STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); - - // compute endpoints of line segment clipped to this scanline (if the - // line segment starts on this scanline. x0 is the intersection of the - // line with y_top, but that may be off the line segment. - if(e->sy > y_top) { - x_top = x0 + dx * (e->sy - y_top); - sy0 = e->sy; - } - else { - x_top = x0; - sy0 = y_top; - } - if(e->ey < y_bottom) { - x_bottom = x0 + dx * (e->ey - y_top); - sy1 = e->ey; - } - else { - x_bottom = xb; - sy1 = y_bottom; - } - - if(x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { - // from here on, we don't have to range check x values - - if((int)x_top == (int)x_bottom) { - float height; - // simple case, only spans one pixel - int x = (int)x_top; - height = (sy1 - sy0) * e->direction; - STBTT_assert(x >= 0 && x < len); - scanline[x] += stbtt__position_trapezoid_area(height, x_top, x + 1.0f, x_bottom, x + 1.0f); - scanline_fill[x] += height; // everything right of this pixel is filled - } - else { - int x, x1, x2; - float y_crossing, y_final, step, sign, area; - // covers 2+ pixels - if(x_top > x_bottom) { - // flip scanline vertically; signed area is the same - float t; - sy0 = y_bottom - (sy0 - y_top); - sy1 = y_bottom - (sy1 - y_top); - t = sy0, sy0 = sy1, sy1 = t; - t = x_bottom, x_bottom = x_top, x_top = t; - dx = -dx; - dy = -dy; - t = x0, x0 = xb, xb = t; - } - STBTT_assert(dy >= 0); - STBTT_assert(dx >= 0); - - x1 = (int)x_top; - x2 = (int)x_bottom; - // compute intersection with y axis at x1+1 - y_crossing = y_top + dy * (x1 + 1 - x0); - - // compute intersection with y axis at x2 - y_final = y_top + dy * (x2 - x0); - - // x1 x_top x2 x_bottom - // y_top +------|-----+------------+------------+--------|---+------------+ - // | | | | | | - // | | | | | | - // sy0 | Txxxxx|............|............|............|............| - // y_crossing | *xxxxx.......|............|............|............| - // | | xxxxx..|............|............|............| - // | | /- xx*xxxx........|............|............| - // | | dy < | xxxxxx..|............|............| - // y_final | | \- | xx*xxx.........|............| - // sy1 | | | | xxxxxB...|............| - // | | | | | | - // | | | | | | - // y_bottom +------------+------------+------------+------------+------------+ - // - // goal is to measure the area covered by '.' in each pixel - - // if x2 is right at the right edge of x1, y_crossing can blow up, github #1057 - // @TODO: maybe test against sy1 rather than y_bottom? - if(y_crossing > y_bottom) - y_crossing = y_bottom; - - sign = e->direction; - - // area of the rectangle covered from sy0..y_crossing - area = sign * (y_crossing - sy0); - - // area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing) - scanline[x1] += stbtt__sized_triangle_area(area, x1 + 1 - x_top); - - // check if final y_crossing is blown up; no test case for this - if(y_final > y_bottom) { - y_final = y_bottom; - dy = (y_final - y_crossing) / (x2 - (x1 + 1)); // if denom=0, y_final = y_crossing, so y_final <= y_bottom - } - - // in second pixel, area covered by line segment found in first pixel - // is always a rectangle 1 wide * the height of that line segment; this - // is exactly what the variable 'area' stores. it also gets a contribution - // from the line segment within it. the THIRD pixel will get the first - // pixel's rectangle contribution, the second pixel's rectangle contribution, - // and its own contribution. the 'own contribution' is the same in every pixel except - // the leftmost and rightmost, a trapezoid that slides down in each pixel. - // the second pixel's contribution to the third pixel will be the - // rectangle 1 wide times the height change in the second pixel, which is dy. - - step = sign * dy * 1; // dy is dy/dx, change in y for every 1 change in x, - // which multiplied by 1-pixel-width is how much pixel area changes for each step in x - // so the area advances by 'step' every time - - for(x = x1 + 1; x < x2; ++x) { - scanline[x] += area + step / 2; // area of trapezoid is 1*step/2 - area += step; - } - STBTT_assert(STBTT_fabs(area) <= 1.01f); // accumulated error from area += step unless we round step down - STBTT_assert(sy1 > y_final - 0.01f); - - // area covered in the last pixel is the rectangle from all the pixels to the left, - // plus the trapezoid filled by the line segment in this pixel all the way to the right edge - scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1 - y_final, (float)x2, x2 + 1.0f, x_bottom, x2 + 1.0f); - - // the rest of the line is filled based on the total height of the line segment in this pixel - scanline_fill[x2] += sign * (sy1 - sy0); - } - } - else { - // if edge goes outside of box we're drawing, we require - // clipping logic. since this does not match the intended use - // of this library, we use a different, very slow brute - // force implementation - // note though that this does happen some of the time because - // x_top and x_bottom can be extrapolated at the top & bottom of - // the shape and actually lie outside the bounding box - int x; - for(x = 0; x < len; ++x) { - // cases: - // - // there can be up to two intersections with the pixel. any intersection - // with left or right edges can be handled by splitting into two (or three) - // regions. intersections with top & bottom do not necessitate case-wise logic. - // - // the old way of doing this found the intersections with the left & right edges, - // then used some simple logic to produce up to three segments in sorted order - // from top-to-bottom. however, this had a problem: if an x edge was epsilon - // across the x border, then the corresponding y position might not be distinct - // from the other y segment, and it might ignored as an empty segment. to avoid - // that, we need to explicitly produce segments based on x positions. - - // rename variables to clearly-defined pairs - float y0 = y_top; - float x1 = (float)(x); - float x2 = (float)(x + 1); - float x3 = xb; - float y3 = y_bottom; - - // x = e->x + e->dx * (y-y_top) - // (y-y_top) = (x - e->x) / e->dx - // y = (x - e->x) / e->dx + y_top - float y1 = (x - x0) / dx + y_top; - float y2 = (x + 1 - x0) / dx + y_top; - - if(x0 < x1 && x3 > x2) { // three segments descending down-right - stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); - stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x2, y2); - stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); - } - else if(x3 < x1 && x0 > x2) { // three segments descending down-left - stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); - stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x1, y1); - stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); - } - else if(x0 < x1 && x3 > x1) { // two segments across x, down-right - stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); - stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); - } - else if(x3 < x1 && x0 > x1) { // two segments across x, down-left - stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); - stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); - } - else if(x0 < x2 && x3 > x2) { // two segments across x+1, down-right - stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); - stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); - } - else if(x3 < x2 && x0 > x2) { // two segments across x+1, down-left - stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); - stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); - } - else { // one segment - stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x3, y3); - } - } - } - } - e = e->next; - } -} - -// directly AA rasterize edges w/o supersampling -static void stbtt__rasterize_sorted_edges(stbtt__bitmap * result, stbtt__edge * e, int n, int vsubsample, int off_x, - int off_y, void * userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge * active = NULL; - int y, j = 0, i; - float scanline_data[129], * scanline, * scanline2; - - STBTT__NOTUSED(vsubsample); - - if(result->w > 64) - scanline = (float *)STBTT_malloc((result->w * 2 + 1) * sizeof(float), userdata); - else - scanline = scanline_data; - - scanline2 = scanline + result->w; - - y = off_y; - e[n].y0 = (float)(off_y + result->h) + 1; - - while(j < result->h) { - // find center of pixel for this scanline - float scan_y_top = y + 0.0f; - float scan_y_bottom = y + 1.0f; - stbtt__active_edge ** step = &active; - - STBTT_memset(scanline, 0, result->w * sizeof(scanline[0])); - STBTT_memset(scanline2, 0, (result->w + 1) * sizeof(scanline[0])); - - // update all active edges; - // remove all active edges that terminate before the top of this scanline - while(*step) { - stbtt__active_edge * z = *step; - if(z->ey <= scan_y_top) { - *step = z->next; // delete from list - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } - else { - step = &((*step)->next); // advance through list - } - } - - // insert all edges that start before the bottom of this scanline - while(e->y0 <= scan_y_bottom) { - if(e->y0 != e->y1) { - stbtt__active_edge * z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); - if(z != NULL) { - if(j == 0 && off_y != 0) { - if(z->ey < scan_y_top) { - // this can happen due to subpixel positioning and some kind of fp rounding error i think - z->ey = scan_y_top; - } - } - STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds - // insert at front - z->next = active; - active = z; - } - } - ++e; - } - - // now process all active edges - if(active) - stbtt__fill_active_edges_new(scanline, scanline2 + 1, result->w, active, scan_y_top); - - { - float sum = 0; - for(i = 0; i < result->w; ++i) { - float k; - int m; - sum += scanline2[i]; - k = scanline[i] + sum; - k = (float)STBTT_fabs(k) * 255 + 0.5f; - m = (int)k; - if(m > 255) m = 255; - result->pixels[j * result->stride + i] = (unsigned char)m; - } - } - // advance all the edges - step = &active; - while(*step) { - stbtt__active_edge * z = *step; - z->fx += z->fdx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - - ++y; - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if(scanline != scanline_data) - STBTT_free(scanline, userdata); -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) - -static void stbtt__sort_edges_ins_sort(stbtt__edge * p, int n) -{ - int i, j; - for(i = 1; i < n; ++i) { - stbtt__edge t = p[i], * a = &t; - j = i; - while(j > 0) { - stbtt__edge * b = &p[j - 1]; - int c = STBTT__COMPARE(a, b); - if(!c) break; - p[j] = p[j - 1]; - --j; - } - if(i != j) - p[j] = t; - } -} - -static void stbtt__sort_edges_quicksort(stbtt__edge * p, int n) -{ - /* threshold for transitioning to insertion sort */ - while(n > 12) { - stbtt__edge t; - int c01, c12, c, m, i, j; - - /* compute median of three */ - m = n >> 1; - c01 = STBTT__COMPARE(&p[0], &p[m]); - c12 = STBTT__COMPARE(&p[m], &p[n - 1]); - /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ - if(c01 != c12) { - /* otherwise, we'll need to swap something else to middle */ - int z; - c = STBTT__COMPARE(&p[0], &p[n - 1]); - /* 0>mid && midn => n; 0 0 */ - /* 0n: 0>n => 0; 0 n */ - z = (c == c12) ? 0 : n - 1; - t = p[z]; - p[z] = p[m]; - p[m] = t; - } - /* now p[m] is the median-of-three */ - /* swap it to the beginning so it won't move around */ - t = p[0]; - p[0] = p[m]; - p[m] = t; - - /* partition loop */ - i = 1; - j = n - 1; - for(;;) { - /* handling of equality is crucial here */ - /* for sentinels & efficiency with duplicates */ - for(;; ++i) { - if(!STBTT__COMPARE(&p[i], &p[0])) break; - } - for(;; --j) { - if(!STBTT__COMPARE(&p[0], &p[j])) break; - } - /* make sure we haven't crossed */ - if(i >= j) break; - t = p[i]; - p[i] = p[j]; - p[j] = t; - - ++i; - --j; - } - /* recurse on smaller side, iterate on larger */ - if(j < (n - i)) { - stbtt__sort_edges_quicksort(p, j); - p = p + i; - n = n - i; - } - else { - stbtt__sort_edges_quicksort(p + i, n - i); - n = j; - } - } -} - -static void stbtt__sort_edges(stbtt__edge * p, int n) -{ - stbtt__sort_edges_quicksort(p, n); - stbtt__sort_edges_ins_sort(p, n); -} - -typedef struct { - float x, y; -} stbtt__point; - -static void stbtt__rasterize(stbtt__bitmap * result, stbtt__point * pts, int * wcount, int windings, float scale_x, - float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void * userdata) -{ - float y_scale_inv = invert ? -scale_y : scale_y; - stbtt__edge * e; - int n, i, j, k, m; -#if STBTT_RASTERIZER_VERSION == 1 - int vsubsample = result->h < 8 ? 15 : 5; -#elif STBTT_RASTERIZER_VERSION == 2 - int vsubsample = 1; -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - // vsubsample should divide 255 evenly; otherwise we won't reach full opacity - - // now we have to blow out the windings into explicit edge lists - n = 0; - for(i = 0; i < windings; ++i) - n += wcount[i]; - - e = (stbtt__edge *)STBTT_malloc(sizeof(*e) * (n + 1), userdata); // add an extra one as a sentinel - if(e == 0) return; - n = 0; - - m = 0; - for(i = 0; i < windings; ++i) { - stbtt__point * p = pts + m; - m += wcount[i]; - j = wcount[i] - 1; - for(k = 0; k < wcount[i]; j = k++) { - int a = k, b = j; - // skip the edge if horizontal - if(p[j].y == p[k].y) - continue; - // add edge from j to k to the list - e[n].invert = 0; - if(invert ? p[j].y > p[k].y : p[j].y < p[k].y) { - e[n].invert = 1; - a = j, b = k; - } - e[n].x0 = p[a].x * scale_x + shift_x; - e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; - e[n].x1 = p[b].x * scale_x + shift_x; - e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; - ++n; - } - } - - // now sort the edges by their highest point (should snap to integer, and then by x) - //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); - stbtt__sort_edges(e, n); - - // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule - stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); - - STBTT_free(e, userdata); -} - -static void stbtt__add_point(stbtt__point * points, int n, float x, float y) -{ - if(!points) return; // during first pass, it's unallocated - points[n].x = x; - points[n].y = y; -} - -// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching -static int stbtt__tesselate_curve(stbtt__point * points, int * num_points, float x0, float y0, float x1, float y1, - float x2, float y2, float objspace_flatness_squared, int n) -{ - // midpoint - float mx = (x0 + 2 * x1 + x2) / 4; - float my = (y0 + 2 * y1 + y2) / 4; - // versus directly drawn line - float dx = (x0 + x2) / 2 - mx; - float dy = (y0 + y2) / 2 - my; - if(n > 16) // 65536 segments on one curve better be enough! - return 1; - if(dx * dx + dy * dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA - stbtt__tesselate_curve(points, num_points, x0, y0, (x0 + x1) / 2.0f, (y0 + y1) / 2.0f, mx, my, - objspace_flatness_squared, n + 1); - stbtt__tesselate_curve(points, num_points, mx, my, (x1 + x2) / 2.0f, (y1 + y2) / 2.0f, x2, y2, - objspace_flatness_squared, n + 1); - } - else { - stbtt__add_point(points, *num_points, x2, y2); - *num_points = *num_points + 1; - } - return 1; -} - -static void stbtt__tesselate_cubic(stbtt__point * points, int * num_points, float x0, float y0, float x1, float y1, - float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) -{ - // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough - float dx0 = x1 - x0; - float dy0 = y1 - y0; - float dx1 = x2 - x1; - float dy1 = y2 - y1; - float dx2 = x3 - x2; - float dy2 = y3 - y2; - float dx = x3 - x0; - float dy = y3 - y0; - float longlen = (float)(STBTT_sqrt(dx0 * dx0 + dy0 * dy0) + STBTT_sqrt(dx1 * dx1 + dy1 * dy1) + STBTT_sqrt( - dx2 * dx2 + dy2 * dy2)); - float shortlen = (float)STBTT_sqrt(dx * dx + dy * dy); - float flatness_squared = longlen * longlen - shortlen * shortlen; - - if(n > 16) // 65536 segments on one curve better be enough! - return; - - if(flatness_squared > objspace_flatness_squared) { - float x01 = (x0 + x1) / 2; - float y01 = (y0 + y1) / 2; - float x12 = (x1 + x2) / 2; - float y12 = (y1 + y2) / 2; - float x23 = (x2 + x3) / 2; - float y23 = (y2 + y3) / 2; - - float xa = (x01 + x12) / 2; - float ya = (y01 + y12) / 2; - float xb = (x12 + x23) / 2; - float yb = (y12 + y23) / 2; - - float mx = (xa + xb) / 2; - float my = (ya + yb) / 2; - - stbtt__tesselate_cubic(points, num_points, x0, y0, x01, y01, xa, ya, mx, my, objspace_flatness_squared, n + 1); - stbtt__tesselate_cubic(points, num_points, mx, my, xb, yb, x23, y23, x3, y3, objspace_flatness_squared, n + 1); - } - else { - stbtt__add_point(points, *num_points, x3, y3); - *num_points = *num_points + 1; - } -} - -// returns number of contours -static stbtt__point * stbtt_FlattenCurves(stbtt_vertex * vertices, int num_verts, float objspace_flatness, - int ** contour_lengths, int * num_contours, void * userdata) -{ - stbtt__point * points = 0; - int num_points = 0; - - float objspace_flatness_squared = objspace_flatness * objspace_flatness; - int i, n = 0, start = 0, pass; - - // count how many "moves" there are to get the contour count - for(i = 0; i < num_verts; ++i) - if(vertices[i].type == STBTT_vmove) - ++n; - - *num_contours = n; - if(n == 0) return 0; - - *contour_lengths = (int *)STBTT_malloc(sizeof(**contour_lengths) * n, userdata); - - if(*contour_lengths == 0) { - *num_contours = 0; - return 0; - } - - // make two passes through the points so we don't need to realloc - for(pass = 0; pass < 2; ++pass) { - float x = 0, y = 0; - if(pass == 1) { - points = (stbtt__point *)STBTT_malloc(num_points * sizeof(points[0]), userdata); - if(points == NULL) goto error; - } - num_points = 0; - n = -1; - for(i = 0; i < num_verts; ++i) { - switch(vertices[i].type) { - case STBTT_vmove: - // start the next contour - if(n >= 0) - (*contour_lengths)[n] = num_points - start; - ++n; - start = num_points; - - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x, y); - break; - case STBTT_vline: - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x, y); - break; - case STBTT_vcurve: - stbtt__tesselate_curve(points, &num_points, x, y, - vertices[i].cx, vertices[i].cy, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - case STBTT_vcubic: - stbtt__tesselate_cubic(points, &num_points, x, y, - vertices[i].cx, vertices[i].cy, - vertices[i].cx1, vertices[i].cy1, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - } - } - (*contour_lengths)[n] = num_points - start; - } - - return points; -error: - STBTT_free(points, userdata); - STBTT_free(*contour_lengths, userdata); - *contour_lengths = 0; - *num_contours = 0; - return NULL; -} - -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap * result, float flatness_in_pixels, stbtt_vertex * vertices, int num_verts, - float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void * userdata) -{ - float scale = scale_x > scale_y ? scale_y : scale_x; - int winding_count = 0; - int * winding_lengths = NULL; - stbtt__point * windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, - &winding_count, userdata); - if(windings) { - stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, - invert, userdata); - STBTT_free(winding_lengths, userdata); - STBTT_free(windings, userdata); - } -} - -STBTT_DEF void stbtt_FreeBitmap(unsigned char * bitmap, void * userdata) -{ - STBTT_free(bitmap, userdata); -} - -STBTT_DEF unsigned char * stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, - float shift_x, float shift_y, int glyph, int * width, int * height, int * xoff, int * yoff) -{ - int ix0, iy0, ix1, iy1; - stbtt__bitmap gbm; - stbtt_vertex * vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - - if(scale_x == 0) scale_x = scale_y; - if(scale_y == 0) { - if(scale_x == 0) { - STBTT_free(vertices, info->userdata); - return NULL; - } - scale_y = scale_x; - } - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0, &iy0, &ix1, &iy1); - - // now we get the size - gbm.w = (ix1 - ix0); - gbm.h = (iy1 - iy0); - gbm.pixels = NULL; // in case we error - - if(width) *width = gbm.w; - if(height) *height = gbm.h; - if(xoff) *xoff = ix0; - if(yoff) *yoff = iy0; - - if(gbm.w && gbm.h) { - gbm.pixels = (unsigned char *)STBTT_malloc(gbm.w * gbm.h, info->userdata); - if(gbm.pixels) { - gbm.stride = gbm.w; - - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); - } - } - STBTT_free(vertices, info->userdata); - return gbm.pixels; -} - -STBTT_DEF unsigned char * stbtt_GetGlyphBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, int glyph, - int * width, int * height, int * xoff, int * yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, - int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) -{ - int ix0, iy0; - stbtt_vertex * vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - stbtt__bitmap gbm; - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0, &iy0, 0, 0); - gbm.pixels = output; - gbm.w = out_w; - gbm.h = out_h; - gbm.stride = out_stride; - - if(gbm.w && gbm.h) - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); - - STBTT_free(vertices, info->userdata); -} - -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, - int out_stride, float scale_x, float scale_y, int glyph) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f, 0.0f, glyph); -} - -STBTT_DEF unsigned char * stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, - float shift_x, float shift_y, int codepoint, int * width, int * height, int * xoff, int * yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info, codepoint), - width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, - int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, - int oversample_y, float * sub_x, float * sub_y, int codepoint) -{ - stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, - oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info, codepoint)); -} - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, - int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, - stbtt_FindGlyphIndex(info, codepoint)); -} - -STBTT_DEF unsigned char * stbtt_GetCodepointBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, - int codepoint, int * width, int * height, int * xoff, int * yoff) -{ - return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, codepoint, width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, - int out_stride, float scale_x, float scale_y, int codepoint) -{ - stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f, 0.0f, codepoint); -} - -////////////////////////////////////////////////////////////////////////////// -// -// bitmap baking -// -// This is SUPER-CRAPPY packing to keep source code small -#ifdef STBTT_STREAM_TYPE -static int stbtt_BakeFontBitmap_internal(STBTT_STREAM_TYPE data, - int offset, // font location (use offset=0 for plain .ttf) - float pixel_height, // height of font in pixels - unsigned char * pixels, int pw, int ph, // bitmap to be filled in - int first_char, int num_chars, // characters to bake - stbtt_bakedchar * chardata) -#else -static int stbtt_BakeFontBitmap_internal(unsigned char * data, - int offset, // font location (use offset=0 for plain .ttf) - float pixel_height, // height of font in pixels - unsigned char * pixels, int pw, int ph, // bitmap to be filled in - int first_char, int num_chars, // characters to bake - stbtt_bakedchar * chardata) -#endif -{ - float scale; - int x, y, bottom_y, i; - stbtt_fontinfo f; - f.userdata = NULL; - if(!stbtt_InitFont(&f, data, offset)) - return -1; - STBTT_memset(pixels, 0, pw * ph); // background of 0 around pixels - x = y = 1; - bottom_y = 1; - - scale = stbtt_ScaleForPixelHeight(&f, pixel_height); - - for(i = 0; i < num_chars; ++i) { - int advance, lsb, x0, y0, x1, y1, gw, gh; - int g = stbtt_FindGlyphIndex(&f, first_char + i); - stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); - stbtt_GetGlyphBitmapBox(&f, g, scale, scale, &x0, &y0, &x1, &y1); - gw = x1 - x0; - gh = y1 - y0; - if(x + gw + 1 >= pw) - y = bottom_y, x = 1; // advance to next row - if(y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row - return -i; - STBTT_assert(x + gw < pw); - STBTT_assert(y + gh < ph); - stbtt_MakeGlyphBitmap(&f, pixels + x + y * pw, gw, gh, pw, scale, scale, g); - chardata[i].x0 = (stbtt_int16)x; - chardata[i].y0 = (stbtt_int16)y; - chardata[i].x1 = (stbtt_int16)(x + gw); - chardata[i].y1 = (stbtt_int16)(y + gh); - chardata[i].xadvance = scale * advance; - chardata[i].xoff = (float)x0; - chardata[i].yoff = (float)y0; - x = x + gw + 1; - if(y + gh + 1 > bottom_y) - bottom_y = y + gh + 1; - } - return bottom_y; -} - -STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar * chardata, int pw, int ph, int char_index, float * xpos, - float * ypos, stbtt_aligned_quad * q, int opengl_fillrule) -{ - float d3d_bias = opengl_fillrule ? 0 : -0.5f; - float ipw = 1.0f / pw, iph = 1.0f / ph; - const stbtt_bakedchar * b = chardata + char_index; - int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); - int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); - - q->x0 = round_x + d3d_bias; - q->y0 = round_y + d3d_bias; - q->x1 = round_x + b->x1 - b->x0 + d3d_bias; - q->y1 = round_y + b->y1 - b->y0 + d3d_bias; - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - -////////////////////////////////////////////////////////////////////////////// -// -// rectangle packing replacement routines if you don't have stb_rect_pack.h -// - -#ifndef STB_RECT_PACK_VERSION - -typedef int stbrp_coord; - -//////////////////////////////////////////////////////////////////////////////////// -// // -// // -// COMPILER WARNING ?!?!? // -// // -// // -// if you get a compile warning due to these symbols being defined more than // -// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // -// // -//////////////////////////////////////////////////////////////////////////////////// - -typedef struct { - int width, height; - int x, y, bottom_y; -} stbrp_context; - -typedef struct { - unsigned char x; -} stbrp_node; - -struct stbrp_rect { - stbrp_coord x, y; - int id, w, h, was_packed; -}; - -static void stbrp_init_target(stbrp_context * con, int pw, int ph, stbrp_node * nodes, int num_nodes) -{ - con->width = pw; - con->height = ph; - con->x = 0; - con->y = 0; - con->bottom_y = 0; - STBTT__NOTUSED(nodes); - STBTT__NOTUSED(num_nodes); -} - -static void stbrp_pack_rects(stbrp_context * con, stbrp_rect * rects, int num_rects) -{ - int i; - for(i = 0; i < num_rects; ++i) { - if(con->x + rects[i].w > con->width) { - con->x = 0; - con->y = con->bottom_y; - } - if(con->y + rects[i].h > con->height) - break; - rects[i].x = con->x; - rects[i].y = con->y; - rects[i].was_packed = 1; - con->x += rects[i].w; - if(con->y + rects[i].h > con->bottom_y) - con->bottom_y = con->y + rects[i].h; - } - for(; i < num_rects; ++i) - rects[i].was_packed = 0; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// bitmap baking -// -// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If -// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. - -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context * spc, unsigned char * pixels, int pw, int ph, int stride_in_bytes, - int padding, void * alloc_context) -{ - stbrp_context * context = (stbrp_context *)STBTT_malloc(sizeof(*context), alloc_context); - int num_nodes = pw - padding; - stbrp_node * nodes = (stbrp_node *)STBTT_malloc(sizeof(*nodes) * num_nodes, alloc_context); - - if(context == NULL || nodes == NULL) { - if(context != NULL) STBTT_free(context, alloc_context); - if(nodes != NULL) STBTT_free(nodes, alloc_context); - return 0; - } - - spc->user_allocator_context = alloc_context; - spc->width = pw; - spc->height = ph; - spc->pixels = pixels; - spc->pack_info = context; - spc->nodes = nodes; - spc->padding = padding; - spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; - spc->h_oversample = 1; - spc->v_oversample = 1; - spc->skip_missing = 0; - - stbrp_init_target(context, pw - padding, ph - padding, nodes, num_nodes); - - if(pixels) - STBTT_memset(pixels, 0, pw * ph); // background of 0 around pixels - - return 1; -} - -STBTT_DEF void stbtt_PackEnd(stbtt_pack_context * spc) -{ - STBTT_free(spc->nodes, spc->user_allocator_context); - STBTT_free(spc->pack_info, spc->user_allocator_context); -} - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context * spc, unsigned int h_oversample, unsigned int v_oversample) -{ - STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); - STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); - if(h_oversample <= STBTT_MAX_OVERSAMPLE) - spc->h_oversample = h_oversample; - if(v_oversample <= STBTT_MAX_OVERSAMPLE) - spc->v_oversample = v_oversample; -} - -STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context * spc, int skip) -{ - spc->skip_missing = skip; -} - -#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) - -static void stbtt__h_prefilter(unsigned char * pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_w = w - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze - for(j = 0; j < h; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - // make kernel_width a constant in common cases so compiler can optimize out the divide - switch(kernel_width) { - case 2: - for(i = 0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char)(total / 2); - } - break; - case 3: - for(i = 0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char)(total / 3); - } - break; - case 4: - for(i = 0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char)(total / 4); - } - break; - case 5: - for(i = 0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char)(total / 5); - } - break; - default: - for(i = 0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char)(total / kernel_width); - } - break; - } - - for(; i < w; ++i) { - STBTT_assert(pixels[i] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i] = (unsigned char)(total / kernel_width); - } - - pixels += stride_in_bytes; - } -} - -static void stbtt__v_prefilter(unsigned char * pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_h = h - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze - for(j = 0; j < w; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - // make kernel_width a constant in common cases so compiler can optimize out the divide - switch(kernel_width) { - case 2: - for(i = 0; i <= safe_h; ++i) { - total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; - pixels[i * stride_in_bytes] = (unsigned char)(total / 2); - } - break; - case 3: - for(i = 0; i <= safe_h; ++i) { - total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; - pixels[i * stride_in_bytes] = (unsigned char)(total / 3); - } - break; - case 4: - for(i = 0; i <= safe_h; ++i) { - total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; - pixels[i * stride_in_bytes] = (unsigned char)(total / 4); - } - break; - case 5: - for(i = 0; i <= safe_h; ++i) { - total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; - pixels[i * stride_in_bytes] = (unsigned char)(total / 5); - } - break; - default: - for(i = 0; i <= safe_h; ++i) { - total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; - pixels[i * stride_in_bytes] = (unsigned char)(total / kernel_width); - } - break; - } - - for(; i < h; ++i) { - STBTT_assert(pixels[i * stride_in_bytes] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i * stride_in_bytes] = (unsigned char)(total / kernel_width); - } - - pixels += 1; - } -} - -static float stbtt__oversample_shift(int oversample) -{ - if(!oversample) - return 0.0f; - - // The prefilter is a box filter of width "oversample", - // which shifts phase by (oversample - 1)/2 pixels in - // oversampled space. We want to shift in the opposite - // direction to counter this. - return (float) - (oversample - 1) / (2.0f * (float)oversample); -} - -// rects array must be big enough to accommodate all characters in the given ranges -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, - stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects) -{ - int i, j, k; - int missing_glyph_added = 0; - - k = 0; - for(i = 0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - ranges[i].h_oversample = (unsigned char)spc->h_oversample; - ranges[i].v_oversample = (unsigned char)spc->v_oversample; - for(j = 0; j < ranges[i].num_chars; ++j) { - int x0, y0, x1, y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : - ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - if(glyph == 0 && (spc->skip_missing || missing_glyph_added)) { - rects[k].w = rects[k].h = 0; - } - else { - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0, 0, - &x0, &y0, &x1, &y1); - rects[k].w = (stbrp_coord)(x1 - x0 + spc->padding + spc->h_oversample - 1); - rects[k].h = (stbrp_coord)(y1 - y0 + spc->padding + spc->v_oversample - 1); - if(glyph == 0) - missing_glyph_added = 1; - } - ++k; - } - } - - return k; -} - -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, int out_w, - int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, - float * sub_x, float * sub_y, int glyph) -{ - stbtt_MakeGlyphBitmapSubpixel(info, - output, - out_w - (prefilter_x - 1), - out_h - (prefilter_y - 1), - out_stride, - scale_x, - scale_y, - shift_x, - shift_y, - glyph); - - if(prefilter_x > 1) - stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); - - if(prefilter_y > 1) - stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); - - *sub_x = stbtt__oversample_shift(prefilter_x); - *sub_y = stbtt__oversample_shift(prefilter_y); -} - -// rects array must be big enough to accommodate all characters in the given ranges -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, - stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects) -{ - int i, j, k, missing_glyph = -1, return_value = 1; - - // save current values - int old_h_over = spc->h_oversample; - int old_v_over = spc->v_oversample; - - k = 0; - for(i = 0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - float recip_h, recip_v, sub_x, sub_y; - spc->h_oversample = ranges[i].h_oversample; - spc->v_oversample = ranges[i].v_oversample; - recip_h = 1.0f / spc->h_oversample; - recip_v = 1.0f / spc->v_oversample; - sub_x = stbtt__oversample_shift(spc->h_oversample); - sub_y = stbtt__oversample_shift(spc->v_oversample); - for(j = 0; j < ranges[i].num_chars; ++j) { - stbrp_rect * r = &rects[k]; - if(r->was_packed && r->w != 0 && r->h != 0) { - stbtt_packedchar * bc = &ranges[i].chardata_for_range[j]; - int advance, lsb, x0, y0, x1, y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : - ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - stbrp_coord pad = (stbrp_coord)spc->padding; - - // pad on left and top - r->x += pad; - r->y += pad; - r->w -= pad; - r->h -= pad; - stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); - stbtt_GetGlyphBitmapBox(info, glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - &x0, &y0, &x1, &y1); - stbtt_MakeGlyphBitmapSubpixel(info, - spc->pixels + r->x + r->y * spc->stride_in_bytes, - r->w - spc->h_oversample + 1, - r->h - spc->v_oversample + 1, - spc->stride_in_bytes, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0, 0, - glyph); - - if(spc->h_oversample > 1) - stbtt__h_prefilter(spc->pixels + r->x + r->y * spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->h_oversample); - - if(spc->v_oversample > 1) - stbtt__v_prefilter(spc->pixels + r->x + r->y * spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->v_oversample); - - bc->x0 = (stbtt_int16)r->x; - bc->y0 = (stbtt_int16)r->y; - bc->x1 = (stbtt_int16)(r->x + r->w); - bc->y1 = (stbtt_int16)(r->y + r->h); - bc->xadvance = scale * advance; - bc->xoff = (float)x0 * recip_h + sub_x; - bc->yoff = (float)y0 * recip_v + sub_y; - bc->xoff2 = (x0 + r->w) * recip_h + sub_x; - bc->yoff2 = (y0 + r->h) * recip_v + sub_y; - - if(glyph == 0) - missing_glyph = j; - } - else if(spc->skip_missing) { - return_value = 0; - } - else if(r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { - ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; - } - else { - return_value = 0; // if any fail, report failure - } - - ++k; - } - } - - // restore original values - spc->h_oversample = old_h_over; - spc->v_oversample = old_v_over; - - return return_value; -} - -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, - stbtt_pack_range * ranges, int num_ranges); -#else -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, - stbtt_pack_range * ranges, int num_ranges); -#endif - -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context * spc, stbrp_rect * rects, int num_rects) -{ - stbrp_pack_rects((stbrp_context *)spc->pack_info, rects, num_rects); -} -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, - stbtt_pack_range * ranges, int num_ranges) -#else -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, - stbtt_pack_range * ranges, int num_ranges) -#endif -{ - stbtt_fontinfo info; - int i, j, n, return_value = 1; - //stbrp_context *context = (stbrp_context *) spc->pack_info; - stbrp_rect * rects; - - // flag all characters as NOT packed - for(i = 0; i < num_ranges; ++i) - for(j = 0; j < ranges[i].num_chars; ++j) - ranges[i].chardata_for_range[j].x0 = - ranges[i].chardata_for_range[j].y0 = - ranges[i].chardata_for_range[j].x1 = - ranges[i].chardata_for_range[j].y1 = 0; - - n = 0; - for(i = 0; i < num_ranges; ++i) - n += ranges[i].num_chars; - - rects = (stbrp_rect *)STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); - if(rects == NULL) - return 0; - - info.userdata = spc->user_allocator_context; - stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, font_index)); - - n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); - - stbtt_PackFontRangesPackRects(spc, rects, n); - - return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); - - STBTT_free(rects, spc->user_allocator_context); - return return_value; -} - -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, float font_size, - int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range); -#else -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, - float font_size, - int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range); -#endif - -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, float font_size, - int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range) -#else -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, - float font_size, - int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range) -#endif -{ - stbtt_pack_range range; - range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; - range.array_of_unicode_codepoints = NULL; - range.num_chars = num_chars_in_range; - range.chardata_for_range = chardata_for_range; - range.font_size = font_size; - return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); -} - -#ifdef STBTT_STREAM_TYPE -STBTT_DEF void stbtt_GetScaledFontVMetrics(STBTT_STREAM_TYPE fontdata, int index, float size, float * ascent, - float * descent, float * lineGap); -#else -STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char * fontdata, int index, float size, float * ascent, - float * descent, float * lineGap); -#endif - -#ifdef STBTT_STREAM_TYPE -STBTT_DEF void stbtt_GetScaledFontVMetrics(STBTT_STREAM_TYPE fontdata, int index, float size, float * ascent, - float * descent, float * lineGap) -#else -STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char * fontdata, int index, float size, float * ascent, - float * descent, float * lineGap) -#endif -{ - int i_ascent, i_descent, i_lineGap; - float scale; - stbtt_fontinfo info; - stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); - scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); - stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); - *ascent = (float)i_ascent * scale; - *descent = (float)i_descent * scale; - *lineGap = (float)i_lineGap * scale; -} - -STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar * chardata, int pw, int ph, int char_index, float * xpos, - float * ypos, stbtt_aligned_quad * q, int align_to_integer) -{ - float ipw = 1.0f / pw, iph = 1.0f / ph; - const stbtt_packedchar * b = chardata + char_index; - - if(align_to_integer) { - float x = (float)STBTT_ifloor((*xpos + b->xoff) + 0.5f); - float y = (float)STBTT_ifloor((*ypos + b->yoff) + 0.5f); - q->x0 = x; - q->y0 = y; - q->x1 = x + b->xoff2 - b->xoff; - q->y1 = y + b->yoff2 - b->yoff; - } - else { - q->x0 = *xpos + b->xoff; - q->y0 = *ypos + b->yoff; - q->x1 = *xpos + b->xoff2; - q->y1 = *ypos + b->yoff2; - } - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - -////////////////////////////////////////////////////////////////////////////// -// -// sdf computation -// - -#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) -#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) - -static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], - float hits[2][2]) -{ - float q0perp = q0[1] * ray[0] - q0[0] * ray[1]; - float q1perp = q1[1] * ray[0] - q1[0] * ray[1]; - float q2perp = q2[1] * ray[0] - q2[0] * ray[1]; - float roperp = orig[1] * ray[0] - orig[0] * ray[1]; - - float a = q0perp - 2 * q1perp + q2perp; - float b = q1perp - q0perp; - float c = q0perp - roperp; - - float s0 = 0., s1 = 0.; - int num_s = 0; - - if(a != 0.0f) { - float discr = b * b - a * c; - if(discr > 0.0f) { - float rcpna = -1 / a; - float d = (float)STBTT_sqrt(discr); - s0 = (b + d) * rcpna; - s1 = (b - d) * rcpna; - if(s0 >= 0.0f && s0 <= 1.0f) - num_s = 1; - if(d > 0.0f && s1 >= 0.0f && s1 <= 1.0f) { - if(num_s == 0) s0 = s1; - ++num_s; - } - } - } - else { - // 2*b*s + c = 0 - // s = -c / (2*b) - s0 = c / (-2 * b); - if(s0 >= 0.0f && s0 <= 1.0f) - num_s = 1; - } - - if(num_s == 0) - return 0; - else { - float rcp_len2 = 1 / (ray[0] * ray[0] + ray[1] * ray[1]); - float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; - - float q0d = q0[0] * rayn_x + q0[1] * rayn_y; - float q1d = q1[0] * rayn_x + q1[1] * rayn_y; - float q2d = q2[0] * rayn_x + q2[1] * rayn_y; - float rod = orig[0] * rayn_x + orig[1] * rayn_y; - - float q10d = q1d - q0d; - float q20d = q2d - q0d; - float q0rd = q0d - rod; - - hits[0][0] = q0rd + s0 * (2.0f - 2.0f * s0) * q10d + s0 * s0 * q20d; - hits[0][1] = a * s0 + b; - - if(num_s > 1) { - hits[1][0] = q0rd + s1 * (2.0f - 2.0f * s1) * q10d + s1 * s1 * q20d; - hits[1][1] = a * s1 + b; - return 2; - } - else { - return 1; - } - } -} - -static int equal(float * a, float * b) -{ - return (a[0] == b[0] && a[1] == b[1]); -} - -static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex * verts) -{ - int i; - float orig[2], ray[2] = { 1, 0 }; - float y_frac; - int winding = 0; - - // make sure y never passes through a vertex of the shape - y_frac = (float)STBTT_fmod(y, 1.0f); - if(y_frac < 0.01f) - y += 0.01f; - else if(y_frac > 0.99f) - y -= 0.01f; - - orig[0] = x; - orig[1] = y; - - // test a ray from (-infinity,y) to (x,y) - for(i = 0; i < nverts; ++i) { - if(verts[i].type == STBTT_vline) { - int x0 = (int)verts[i - 1].x, y0 = (int)verts[i - 1].y; - int x1 = (int)verts[i].x, y1 = (int)verts[i].y; - if(y > STBTT_min(y0, y1) && y < STBTT_max(y0, y1) && x > STBTT_min(x0, x1)) { - float x_inter = (y - y0) / (y1 - y0) * (x1 - x0) + x0; - if(x_inter < x) - winding += (y0 < y1) ? 1 : -1; - } - } - if(verts[i].type == STBTT_vcurve) { - int x0 = (int)verts[i - 1].x, y0 = (int)verts[i - 1].y; - int x1 = (int)verts[i].cx, y1 = (int)verts[i].cy; - int x2 = (int)verts[i].x, y2 = (int)verts[i].y; - int ax = STBTT_min(x0, STBTT_min(x1, x2)), ay = STBTT_min(y0, STBTT_min(y1, y2)); - int by = STBTT_max(y0, STBTT_max(y1, y2)); - if(y > ay && y < by && x > ax) { - float q0[2], q1[2], q2[2]; - float hits[2][2]; - q0[0] = (float)x0; - q0[1] = (float)y0; - q1[0] = (float)x1; - q1[1] = (float)y1; - q2[0] = (float)x2; - q2[1] = (float)y2; - if(equal(q0, q1) || equal(q1, q2)) { - x0 = (int)verts[i - 1].x; - y0 = (int)verts[i - 1].y; - x1 = (int)verts[i].x; - y1 = (int)verts[i].y; - if(y > STBTT_min(y0, y1) && y < STBTT_max(y0, y1) && x > STBTT_min(x0, x1)) { - float x_inter = (y - y0) / (y1 - y0) * (x1 - x0) + x0; - if(x_inter < x) - winding += (y0 < y1) ? 1 : -1; - } - } - else { - int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); - if(num_hits >= 1) - if(hits[0][0] < 0) - winding += (hits[0][1] < 0 ? -1 : 1); - if(num_hits >= 2) - if(hits[1][0] < 0) - winding += (hits[1][1] < 0 ? -1 : 1); - } - } - } - } - return winding; -} - -static float stbtt__cuberoot(float x) -{ - if(x < 0) - return -(float)STBTT_pow(-x, 1.0f / 3.0f); - else - return (float)STBTT_pow(x, 1.0f / 3.0f); -} - -// x^3 + a*x^2 + b*x + c = 0 -static int stbtt__solve_cubic(float a, float b, float c, float * r) -{ - float s = -a / 3; - float p = b - a * a / 3; - float q = a * (2 * a * a - 9 * b) / 27 + c; - float p3 = p * p * p; - float d = q * q + 4 * p3 / 27; - if(d >= 0) { - float z = (float)STBTT_sqrt(d); - float u = (-q + z) / 2; - float v = (-q - z) / 2; - u = stbtt__cuberoot(u); - v = stbtt__cuberoot(v); - r[0] = s + u + v; - return 1; - } - else { - float u = (float)STBTT_sqrt(-p / 3); - float v = (float)STBTT_acos(-STBTT_sqrt(-27 / p3) * q / 2) / 3; // p3 must be negative, since d is negative - float m = (float)STBTT_cos(v); - float n = (float)STBTT_cos(v - 3.141592f / 2) * 1.732050808f; - r[0] = s + u * 2 * m; - r[1] = s - u * (m + n); - r[2] = s - u * (m - n); - - //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? - //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); - //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); - return 3; - } -} - -STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo * info, float scale, int glyph, int padding, - unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff) -{ - float scale_x = scale, scale_y = scale; - int ix0, iy0, ix1, iy1; - int w, h; - unsigned char * data; - - if(scale == 0) return NULL; - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f, 0.0f, &ix0, &iy0, &ix1, &iy1); - - // if empty, return NULL - if(ix0 == ix1 || iy0 == iy1) - return NULL; - - ix0 -= padding; - iy0 -= padding; - ix1 += padding; - iy1 += padding; - - w = (ix1 - ix0); - h = (iy1 - iy0); - - if(width) *width = w; - if(height) *height = h; - if(xoff) *xoff = ix0; - if(yoff) *yoff = iy0; - - // invert for y-downwards bitmaps - scale_y = -scale_y; - - { - int x, y, i, j; - float * precompute; - stbtt_vertex * verts; - int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); - data = (unsigned char *)STBTT_malloc(w * h, info->userdata); - precompute = (float *)STBTT_malloc(num_verts * sizeof(float), info->userdata); - - for(i = 0, j = num_verts - 1; i < num_verts; j = i++) { - if(verts[i].type == STBTT_vline) { - float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; - float x1 = verts[j].x * scale_x, y1 = verts[j].y * scale_y; - float dist = (float)STBTT_sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); - precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist; - } - else if(verts[i].type == STBTT_vcurve) { - float x2 = verts[j].x * scale_x, y2 = verts[j].y * scale_y; - float x1 = verts[i].cx * scale_x, y1 = verts[i].cy * scale_y; - float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; - float bx = x0 - 2 * x1 + x2, by = y0 - 2 * y1 + y2; - float len2 = bx * bx + by * by; - if(len2 != 0.0f) - precompute[i] = 1.0f / (bx * bx + by * by); - else - precompute[i] = 0.0f; - } - else - precompute[i] = 0.0f; - } - - for(y = iy0; y < iy1; ++y) { - for(x = ix0; x < ix1; ++x) { - float val; - float min_dist = 999999.0f; - float sx = (float)x + 0.5f; - float sy = (float)y + 0.5f; - float x_gspace = (sx / scale_x); - float y_gspace = (sy / scale_y); - - int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, - verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path - - for(i = 0; i < num_verts; ++i) { - float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; - - if(verts[i].type == STBTT_vline && precompute[i] != 0.0f) { - float x1 = verts[i - 1].x * scale_x, y1 = verts[i - 1].y * scale_y; - - float dist, dist2 = (x0 - sx) * (x0 - sx) + (y0 - sy) * (y0 - sy); - if(dist2 < min_dist * min_dist) - min_dist = (float)STBTT_sqrt(dist2); - - // coarse culling against bbox - //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && - // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) - dist = (float)STBTT_fabs((x1 - x0) * (y0 - sy) - (y1 - y0) * (x0 - sx)) * precompute[i]; - STBTT_assert(i != 0); - if(dist < min_dist) { - // check position along line - // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) - // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) - float dx = x1 - x0, dy = y1 - y0; - float px = x0 - sx, py = y0 - sy; - // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy - // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve - float t = -(px * dx + py * dy) / (dx * dx + dy * dy); - if(t >= 0.0f && t <= 1.0f) - min_dist = dist; - } - } - else if(verts[i].type == STBTT_vcurve) { - float x2 = verts[i - 1].x * scale_x, y2 = verts[i - 1].y * scale_y; - float x1 = verts[i].cx * scale_x, y1 = verts[i].cy * scale_y; - float box_x0 = STBTT_min(STBTT_min(x0, x1), x2); - float box_y0 = STBTT_min(STBTT_min(y0, y1), y2); - float box_x1 = STBTT_max(STBTT_max(x0, x1), x2); - float box_y1 = STBTT_max(STBTT_max(y0, y1), y2); - // coarse culling against bbox to avoid computing cubic unnecessarily - if(sx > box_x0 - min_dist && sx < box_x1 + min_dist && sy > box_y0 - min_dist && sy < box_y1 + min_dist) { - int num = 0; - float ax = x1 - x0, ay = y1 - y0; - float bx = x0 - 2 * x1 + x2, by = y0 - 2 * y1 + y2; - float mx = x0 - sx, my = y0 - sy; - float res[3] = { 0.f, 0.f, 0.f }; - float px, py, t, it, dist2; - float a_inv = precompute[i]; - if(a_inv == 0.0f) { // if a_inv is 0, it's 2nd degree so use quadratic formula - float a = 3 * (ax * bx + ay * by); - float b = 2 * (ax * ax + ay * ay) + (mx * bx + my * by); - float c = mx * ax + my * ay; - if(a == 0.0f) { // if a is 0, it's linear - if(b != 0.0f) { - res[num++] = -c / b; - } - } - else { - float discriminant = b * b - 4 * a * c; - if(discriminant < 0) - num = 0; - else { - float root = (float)STBTT_sqrt(discriminant); - res[0] = (-b - root) / (2 * a); - res[1] = (-b + root) / (2 * a); - num = 2; // don't bother distinguishing 1-solution case, as code below will still work - } - } - } - else { - float b = 3 * (ax * bx + ay * by) * a_inv; // could precompute this as it doesn't depend on sample point - float c = (2 * (ax * ax + ay * ay) + (mx * bx + my * by)) * a_inv; - float d = (mx * ax + my * ay) * a_inv; - num = stbtt__solve_cubic(b, c, d, res); - } - dist2 = (x0 - sx) * (x0 - sx) + (y0 - sy) * (y0 - sy); - if(dist2 < min_dist * min_dist) - min_dist = (float)STBTT_sqrt(dist2); - - if(num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { - t = res[0], it = 1.0f - t; - px = it * it * x0 + 2 * t * it * x1 + t * t * x2; - py = it * it * y0 + 2 * t * it * y1 + t * t * y2; - dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); - if(dist2 < min_dist * min_dist) - min_dist = (float)STBTT_sqrt(dist2); - } - if(num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { - t = res[1], it = 1.0f - t; - px = it * it * x0 + 2 * t * it * x1 + t * t * x2; - py = it * it * y0 + 2 * t * it * y1 + t * t * y2; - dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); - if(dist2 < min_dist * min_dist) - min_dist = (float)STBTT_sqrt(dist2); - } - if(num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { - t = res[2], it = 1.0f - t; - px = it * it * x0 + 2 * t * it * x1 + t * t * x2; - py = it * it * y0 + 2 * t * it * y1 + t * t * y2; - dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); - if(dist2 < min_dist * min_dist) - min_dist = (float)STBTT_sqrt(dist2); - } - } - } - } - if(winding == 0) - min_dist = -min_dist; // if outside the shape, value is negative - val = onedge_value + pixel_dist_scale * min_dist; - if(val < 0) - val = 0; - else if(val > 255) - val = 255; - data[(y - iy0) * w + (x - ix0)] = (unsigned char)val; - } - } - STBTT_free(precompute, info->userdata); - STBTT_free(verts, info->userdata); - } - return data; -} - -STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo * info, float scale, int codepoint, int padding, - unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff) -{ - return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, - width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_FreeSDF(unsigned char * bitmap, void * userdata) -{ - STBTT_free(bitmap, userdata); -} - -////////////////////////////////////////////////////////////////////////////// -// -// font name matching -- recommended not to use this -// - -// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string -#ifdef STBTT_STREAM_TYPE -static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 * s1, stbtt_int32 len1, STBTT_STREAM_TYPE s2, - stbtt_uint32 s2offs, stbtt_int32 len2) -#else -static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 * s1, stbtt_int32 len1, stbtt_uint8 * s2, - stbtt_uint32 s2offs, stbtt_int32 len2) -#endif -{ - stbtt_int32 i = 0; - - // convert utf16 to utf8 and compare the results while converting - while(len2) { - stbtt_uint16 ch = ttUSHORT(s2, s2offs); - if(ch < 0x80) { - if(i >= len1) return -1; - if(s1[i++] != ch) return -1; - } - else if(ch < 0x800) { - if(i + 1 >= len1) return -1; - if(s1[i++] != 0xc0 + (ch >> 6)) return -1; - if(s1[i++] != 0x80 + (ch & 0x3f)) return -1; - } - else if(ch >= 0xd800 && ch < 0xdc00) { - stbtt_uint32 c; - stbtt_uint16 ch2 = ttUSHORT(s2, s2offs + 2); - if(i + 3 >= len1) return -1; - c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; - if(s1[i++] != 0xf0 + (c >> 18)) return -1; - if(s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; - if(s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; - if(s1[i++] != 0x80 + ((c) & 0x3f)) return -1; - s2offs += 2; // plus another 2 below - len2 -= 2; - } - else if(ch >= 0xdc00 && ch < 0xe000) { - return -1; - } - else { - if(i + 2 >= len1) return -1; - if(s1[i++] != 0xe0 + (ch >> 12)) return -1; - if(s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; - if(s1[i++] != 0x80 + ((ch) & 0x3f)) return -1; - } - s2offs += 2; - len2 -= 2; - } - return i; -} -#ifdef STBTT_STREAM_TYPE -static int stbtt_CompareUTF8toUTF16_bigendian_internal(char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, - int len2) -{ - return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8 *)s1, len1, s2, s2offs, len2); -} -#else -static int stbtt_CompareUTF8toUTF16_bigendian_internal(char * s1, int len1, char * s2, stbtt_uint32 s2offs, int len2) -{ - return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8 *)s1, len1, (stbtt_uint8 *)s2, s2offs, len2); -} -#endif -// returns results in whatever encoding you request... but note that 2-byte encodings -// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare -STBTT_DEF stbtt_uint32 stbtt_GetFontNameString(const stbtt_fontinfo * font, int * length, int platformID, - int encodingID, int languageID, int nameID) -{ - stbtt_int32 i, count, stringOffset; - stbtt_uint32 offset = font->fontstart; - stbtt_uint32 nm = stbtt__find_table(font->data, offset, "name"); - if(!nm) return 0; - - count = ttUSHORT(font->data, nm + 2); - stringOffset = nm + ttUSHORT(font->data, nm + 4); - for(i = 0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - if(platformID == ttUSHORT(font->data, loc + 0) && encodingID == ttUSHORT(font->data, loc + 2) - && languageID == ttUSHORT(font->data, loc + 4) && nameID == ttUSHORT(font->data, loc + 6)) { - *length = ttUSHORT(font->data, loc + 8); - return stringOffset + ttUSHORT(font->data, loc + 10); - } - } - return 0; -} -#ifdef STBTT_STREAM_TYPE -static int stbtt__matchpair(STBTT_STREAM_TYPE fc, stbtt_uint32 nm, stbtt_uint8 * name, stbtt_int32 nlen, - stbtt_int32 target_id, stbtt_int32 next_id) -#else -static int stbtt__matchpair(stbtt_uint8 * fc, stbtt_uint32 nm, stbtt_uint8 * name, stbtt_int32 nlen, - stbtt_int32 target_id, stbtt_int32 next_id) -#endif -{ - stbtt_int32 i; - stbtt_int32 count = ttUSHORT(fc, nm + 2); - stbtt_int32 stringOffset = nm + ttUSHORT(fc, nm + 4); - - for(i = 0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - stbtt_int32 id = ttUSHORT(fc, loc + 6); - if(id == target_id) { - // find the encoding - stbtt_int32 platform = ttUSHORT(fc, loc + 0), encoding = ttUSHORT(fc, loc + 2), language = ttUSHORT(fc, loc + 4); - - // is this a Unicode encoding? - if(platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { - stbtt_int32 slen = ttUSHORT(fc, loc + 8); - stbtt_int32 off = ttUSHORT(fc, loc + 10); - - // check if there's a prefix match - stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc, stringOffset + off, slen); - if(matchlen >= 0) { - // check for target_id+1 immediately following, with same encoding & language - if(i + 1 < count && ttUSHORT(fc, loc + 12 + 6) == next_id && ttUSHORT(fc, loc + 12) == platform && - ttUSHORT(fc, loc + 12 + 2) == encoding && ttUSHORT(fc, loc + 12 + 4) == language) { - slen = ttUSHORT(fc, loc + 12 + 8); - off = ttUSHORT(fc, loc + 12 + 10); - if(slen == 0) { - if(matchlen == nlen) - return 1; - } - else if(matchlen < nlen && name[matchlen] == ' ') { - ++matchlen; -#ifdef STBTT_STREAM_TYPE - if(stbtt_CompareUTF8toUTF16_bigendian_internal((char *)(name + matchlen), nlen - matchlen, fc, stringOffset + off, - slen)) -#else - if(stbtt_CompareUTF8toUTF16_bigendian_internal((char *)(name + matchlen), nlen - matchlen, (char *)fc, - stringOffset + off, slen)) -#endif - return 1; - } - } - else { - // if nothing immediately following - if(matchlen == nlen) - return 1; - } - } - } - - // @TODO handle other encodings - } - } - return 0; -} -#ifdef STBTT_STREAM_TYPE - static int stbtt__matches(STBTT_STREAM_TYPE fc, stbtt_uint32 offset, stbtt_uint8 * name, stbtt_int32 flags) -#else - static int stbtt__matches(stbtt_uint8 * fc, stbtt_uint32 offset, stbtt_uint8 * name, stbtt_int32 flags) -#endif - -{ - stbtt_int32 nlen = (stbtt_int32)STBTT_strlen((char *)name); - stbtt_uint32 nm, hd; - if(!stbtt__isfont(fc, offset)) return 0; - - // check italics/bold/underline flags in macStyle... - if(flags) { - hd = stbtt__find_table(fc, offset, "head"); - if((ttUSHORT(fc, hd + 44) & 7) != (flags & 7)) return 0; - } - - nm = stbtt__find_table(fc, offset, "name"); - if(!nm) return 0; - - if(flags) { - if(name == NULL) return 1; - // if we checked the macStyle flags, then just check the family and ignore the subfamily - if(stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; - if(stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; - if(stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } - else { - if(name == NULL) return 1; - if(stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; - if(stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; - if(stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } - - return 0; -} -#ifdef STBTT_STREAM_TYPE - static int stbtt_FindMatchingFont_internal(STBTT_STREAM_TYPE font_collection, char * name_utf8, stbtt_int32 flags) -#else - static int stbtt_FindMatchingFont_internal(unsigned char * font_collection, char * name_utf8, stbtt_int32 flags) -#endif -{ - stbtt_int32 i; - for(i = 0;; ++i) { - stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); - if(off < 0) return off; -#ifdef STBTT_STREAM_TYPE - if(stbtt__matches(font_collection, off, (stbtt_uint8 *)name_utf8, flags)) -#else - if(stbtt__matches((stbtt_uint8 *)font_collection, off, (stbtt_uint8 *)name_utf8, flags)) -#endif - return off; - } -} - -#if defined(__GNUC__) || defined(__clang__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wcast-qual" -#endif - -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_BakeFontBitmap(STBTT_STREAM_TYPE data, int offset, - float pixel_height, unsigned char * pixels, int pw, int ph, - int first_char, int num_chars, stbtt_bakedchar * chardata); -#else -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char * data, int offset, - float pixel_height, unsigned char * pixels, int pw, int ph, - int first_char, int num_chars, stbtt_bakedchar * chardata); -#endif - -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_BakeFontBitmap(STBTT_STREAM_TYPE data, int offset, - float pixel_height, unsigned char * pixels, int pw, int ph, - int first_char, int num_chars, stbtt_bakedchar * chardata) -#else -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char * data, int offset, - float pixel_height, unsigned char * pixels, int pw, int ph, - int first_char, int num_chars, stbtt_bakedchar * chardata) -#endif -{ -#ifdef STBTT_STREAM_TYPE - return stbtt_BakeFontBitmap_internal(data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); -#else - return stbtt_BakeFontBitmap_internal((unsigned char *)data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, - chardata); -#endif -} -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_GetFontOffsetForIndex(STBTT_STREAM_TYPE data, int index) -{ - return stbtt_GetFontOffsetForIndex_internal(data, index); -} -#else -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char * data, int index) -{ - return stbtt_GetFontOffsetForIndex_internal((unsigned char *)data, index); -} -#endif -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_GetNumberOfFonts(STBTT_STREAM_TYPE data) -{ - return stbtt_GetNumberOfFonts_internal(data); -} -#else -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char * data) -{ - return stbtt_GetNumberOfFonts_internal((unsigned char *)data); -} -#endif -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int offset) -{ - return stbtt_InitFont_internal(info, data, offset); -} -#else -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, const unsigned char * data, int offset) -{ - return stbtt_InitFont_internal(info, (unsigned char *)data, offset); -} -#endif -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_FindMatchingFont(STBTT_STREAM_TYPE fontdata, const char * name, int flags) -{ - return stbtt_FindMatchingFont_internal(fontdata, (char *)name, flags); -} -#else -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char * fontdata, const char * name, int flags) -{ - return stbtt_FindMatchingFont_internal((unsigned char *)fontdata, (char *)name, flags); -} -#endif -#ifdef STBTT_STREAM_TYPE -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, - int len2) -{ - return stbtt_CompareUTF8toUTF16_bigendian_internal((char *)s1, len1, s2, s2offs, len2); -} -#else -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, const char * s2, stbtt_uint32 s2offs, - int len2) -{ - return stbtt_CompareUTF8toUTF16_bigendian_internal((char *)s1, len1, (char *)s2, s2offs, len2); -} -#endif - -#if defined(__GNUC__) || defined(__clang__) - #pragma GCC diagnostic pop - #pragma GCC diagnostic pop -#endif - -#endif // STB_TRUETYPE_IMPLEMENTATION - -// FULL VERSION HISTORY -// -// 1.25 (2021-07-11) many fixes -// 1.24 (2020-02-05) fix warning -// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) -// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined -// 1.21 (2019-02-25) fix warning -// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() -// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod -// 1.18 (2018-01-29) add missing function -// 1.17 (2017-07-23) make more arguments const; doc fix -// 1.16 (2017-07-12) SDF support -// 1.15 (2017-03-03) make more arguments const -// 1.14 (2017-01-16) num-fonts-in-TTC function -// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts -// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual -// 1.11 (2016-04-02) fix unused-variable warning -// 1.10 (2016-04-02) allow user-defined fabs() replacement -// fix memory leak if fontsize=0.0 -// fix warning from duplicate typedef -// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges -// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges -// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; -// allow PackFontRanges to pack and render in separate phases; -// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); -// fixed an assert() bug in the new rasterizer -// replace assert() with STBTT_assert() in new rasterizer -// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) -// also more precise AA rasterizer, except if shapes overlap -// remove need for STBTT_sort -// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC -// 1.04 (2015-04-15) typo in example -// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes -// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ -// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match -// non-oversampled; STBTT_POINT_SIZE for packed case only -// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling -// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) -// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID -// 0.8b (2014-07-07) fix a warning -// 0.8 (2014-05-25) fix a few more warnings -// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back -// 0.6c (2012-07-24) improve documentation -// 0.6b (2012-07-20) fix a few more warnings -// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, -// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty -// 0.5 (2011-12-09) bugfixes: -// subpixel glyph renderer computed wrong bounding box -// first vertex of shape can be off-curve (FreeSans) -// 0.4b (2011-12-03) fixed an error in the font baking example -// 0.4 (2011-12-01) kerning, subpixel rendering (tor) -// bugfixes for: -// codepoint-to-glyph conversion using table fmt=12 -// codepoint-to-glyph conversion using table fmt=4 -// stbtt_GetBakedQuad with non-square texture (Zer) -// updated Hello World! sample to use kerning and subpixel -// fixed some warnings -// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) -// userdata, malloc-from-userdata, non-zero fill (stb) -// 0.2 (2009-03-11) Fix unsigned/signed char warnings -// 0.1 (2009-03-09) First public release -// - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -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. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -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 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. ------------------------------------------------------------------------------- -*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/lv_tjpgd.c b/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/lv_tjpgd.c deleted file mode 100644 index 650b36a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/lv_tjpgd.c +++ /dev/null @@ -1,301 +0,0 @@ -/** - * @file lv_tjpgd.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../draw/lv_image_decoder_private.h" -#include "../../../lvgl.h" -#if LV_USE_TJPGD - -#include "tjpgd.h" -#include "lv_tjpgd.h" -#include "../../misc/lv_fs_private.h" -#include - -/********************* - * DEFINES - *********************/ - -#define DECODER_NAME "TJPGD" - -#define TJPGD_WORKBUFF_SIZE 4096 //Recommended by TJPGD library - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header); -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); - -static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, - const lv_area_t * full_area, lv_area_t * decoded_area); -static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -static size_t input_func(JDEC * jd, uint8_t * buff, size_t ndata); -static int is_jpg(const uint8_t * raw_data, size_t len); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_tjpgd_init(void) -{ - lv_image_decoder_t * dec = lv_image_decoder_create(); - lv_image_decoder_set_info_cb(dec, decoder_info); - lv_image_decoder_set_open_cb(dec, decoder_open); - lv_image_decoder_set_get_area_cb(dec, decoder_get_area); - lv_image_decoder_set_close_cb(dec, decoder_close); - - dec->name = DECODER_NAME; -} - -void lv_tjpgd_deinit(void) -{ - lv_image_decoder_t * dec = NULL; - while((dec = lv_image_decoder_get_next(dec)) != NULL) { - if(dec->info_cb == decoder_info) { - lv_image_decoder_delete(dec); - break; - } - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) -{ - LV_UNUSED(decoder); - - const void * src = dsc->src; - lv_image_src_t src_type = dsc->src_type; - - if(src_type == LV_IMAGE_SRC_VARIABLE) { - const lv_image_dsc_t * img_dsc = src; - uint8_t * raw_data = (uint8_t *)img_dsc->data; - const uint32_t raw_data_size = img_dsc->data_size; - - if(is_jpg(raw_data, raw_data_size) == true) { -#if LV_USE_FS_MEMFS - header->cf = LV_COLOR_FORMAT_RAW; - header->w = img_dsc->header.w; - header->h = img_dsc->header.h; - header->stride = img_dsc->header.w * 3; - return LV_RESULT_OK; -#else - LV_LOG_WARN("LV_USE_FS_MEMFS needs to enabled to decode from data"); - return LV_RESULT_INVALID; -#endif - } - } - else if(src_type == LV_IMAGE_SRC_FILE) { - const char * fn = src; - const char * ext = lv_fs_get_ext(fn); - if((lv_strcmp(ext, "jpg") == 0) || (lv_strcmp(ext, "jpeg") == 0)) { - uint8_t workb[TJPGD_WORKBUFF_SIZE]; - JDEC jd; - JRESULT rc = jd_prepare(&jd, input_func, workb, TJPGD_WORKBUFF_SIZE, &dsc->file); - if(rc) { - LV_LOG_WARN("jd_prepare error: %d", rc); - return LV_RESULT_INVALID; - } - header->cf = LV_COLOR_FORMAT_RAW; - header->w = jd.width; - header->h = jd.height; - header->stride = jd.width * 3; - - return LV_RESULT_OK; - } - } - return LV_RESULT_INVALID; -} - -static size_t input_func(JDEC * jd, uint8_t * buff, size_t ndata) -{ - lv_fs_file_t * f = jd->device; - if(!f) return 0; - - if(buff) { - uint32_t rn = 0; - lv_fs_read(f, buff, (uint32_t)ndata, &rn); - return rn; - } - else { - uint32_t pos; - lv_fs_tell(f, &pos); - lv_fs_seek(f, (uint32_t)(ndata + pos), LV_FS_SEEK_SET); - return ndata; - } - return 0; -} - -/** - * Decode a JPG image and return the decoded data. - * @param decoder pointer to the decoder - * @param dsc pointer to the decoder descriptor - * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image - */ -static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); - lv_fs_file_t * f = lv_malloc(sizeof(lv_fs_file_t)); - if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { -#if LV_USE_FS_MEMFS - const lv_image_dsc_t * img_dsc = dsc->src; - if(is_jpg(img_dsc->data, img_dsc->data_size) == true) { - lv_fs_path_ex_t path; - lv_fs_make_path_from_buffer(&path, LV_FS_MEMFS_LETTER, img_dsc->data, img_dsc->data_size); - lv_fs_res_t res; - res = lv_fs_open(f, (const char *)&path, LV_FS_MODE_RD); - if(res != LV_FS_RES_OK) { - lv_free(f); - return LV_RESULT_INVALID; - } - } -#else - LV_LOG_WARN("LV_USE_FS_MEMFS needs to enabled to decode from data"); - return LV_RESULT_INVALID; -#endif - } - else if(dsc->src_type == LV_IMAGE_SRC_FILE) { - const char * fn = dsc->src; - if((lv_strcmp(lv_fs_get_ext(fn), "jpg") == 0) || (lv_strcmp(lv_fs_get_ext(fn), "jpeg") == 0)) { - lv_fs_res_t res; - res = lv_fs_open(f, fn, LV_FS_MODE_RD); - if(res != LV_FS_RES_OK) { - lv_free(f); - return LV_RESULT_INVALID; - } - } - } - - uint8_t * workb_temp = lv_malloc(TJPGD_WORKBUFF_SIZE); - JDEC * jd = lv_malloc(sizeof(JDEC)); - dsc->user_data = jd; - JRESULT rc = jd_prepare(jd, input_func, workb_temp, (size_t)TJPGD_WORKBUFF_SIZE, f); - if(rc) return LV_RESULT_INVALID; - - dsc->header.cf = LV_COLOR_FORMAT_RGB888; - dsc->header.w = jd->width; - dsc->header.h = jd->height; - dsc->header.stride = jd->width * 3; - - if(rc != JDR_OK) { - lv_free(workb_temp); - lv_free(jd); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; -} - -static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, - const lv_area_t * full_area, lv_area_t * decoded_area) -{ - LV_UNUSED(decoder); - LV_UNUSED(full_area); - - JDEC * jd = dsc->user_data; - lv_draw_buf_t * decoded = (void *)dsc->decoded; - - uint32_t mx, my; - mx = jd->msx * 8; - my = jd->msy * 8; /* Size of the MCU (pixel) */ - if(decoded_area->y1 == LV_COORD_MIN) { - decoded_area->y1 = 0; - decoded_area->y2 = my - 1; - decoded_area->x1 = -((int32_t)mx); - decoded_area->x2 = -1; - jd->scale = 0; - jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0; /* Initialize DC values */ - jd->rst = 0; - jd->rsc = 0; - if(decoded == NULL) { - decoded = lv_malloc_zeroed(sizeof(lv_draw_buf_t)); - dsc->decoded = decoded; - } - else { - lv_fs_seek(jd->device, 0, LV_FS_SEEK_SET); - JRESULT rc = jd_prepare(jd, input_func, jd->pool_original, (size_t)TJPGD_WORKBUFF_SIZE, jd->device); - if(rc) return LV_RESULT_INVALID; - } - decoded->data = jd->workbuf; - decoded->header = dsc->header; - } - - decoded_area->x1 += mx; - decoded_area->x2 += mx; - - if(decoded_area->x1 >= jd->width) { - decoded_area->x1 = 0; - decoded_area->x2 = mx - 1; - decoded_area->y1 += my; - decoded_area->y2 += my; - } - - if(decoded_area->x2 >= jd->width) decoded_area->x2 = jd->width - 1; - if(decoded_area->y2 >= jd->height) decoded_area->y2 = jd->height - 1; - - decoded->header.w = lv_area_get_width(decoded_area); - decoded->header.h = lv_area_get_height(decoded_area); - decoded->header.stride = decoded->header.w * 3; - decoded->data_size = decoded->header.stride * decoded->header.h; - - /* Process restart interval if enabled */ - JRESULT rc; - if(jd->nrst && jd->rst++ == jd->nrst) { - rc = jd_restart(jd, jd->rsc++); - if(rc != JDR_OK) return LV_RESULT_INVALID; - jd->rst = 1; - } - - /* Load an MCU (decompress huffman coded stream, dequantize and apply IDCT) */ - rc = jd_mcu_load(jd); - if(rc != JDR_OK) return LV_RESULT_INVALID; - - /* Output the MCU (YCbCr to RGB, scaling and output) */ - rc = jd_mcu_output(jd, NULL, decoded_area->x1, decoded_area->y1); - if(rc != JDR_OK) return LV_RESULT_INVALID; - - return LV_RESULT_OK; -} - -/** - * Free the allocated resources - * @param decoder pointer to the decoder where this function belongs - * @param dsc pointer to a descriptor which describes this decoding session - */ -static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) -{ - LV_UNUSED(decoder); - JDEC * jd = dsc->user_data; - lv_fs_close(jd->device); - lv_free(jd->device); - lv_free(jd->pool_original); - lv_free(jd); - lv_free((void *)dsc->decoded); -} - -static int is_jpg(const uint8_t * raw_data, size_t len) -{ - const uint8_t jpg_signature[] = {0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46}; - if(len < sizeof(jpg_signature)) return false; - return memcmp(jpg_signature, raw_data, sizeof(jpg_signature)) == 0; -} - -#endif /*LV_USE_TJPGD*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/lv_tjpgd.h b/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/lv_tjpgd.h deleted file mode 100644 index ec35800..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/lv_tjpgd.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file lv_tjpgd.h - * - */ - -#ifndef LV_TJPGD_H -#define LV_TJPGD_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#if LV_USE_TJPGD - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_tjpgd_init(void); - -void lv_tjpgd_deinit(void); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_TJPGD*/ - -#ifdef __cplusplus -} -#endif - -#endif /* LV_TJPGD_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/tjpgd.c b/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/tjpgd.c deleted file mode 100644 index 7152adf..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/tjpgd.c +++ /dev/null @@ -1,1139 +0,0 @@ -/*----------------------------------------------------------------------------/ -/ TJpgDec - Tiny JPEG Decompressor R0.03 (C)ChaN, 2021 -/-----------------------------------------------------------------------------/ -/ The TJpgDec is a generic JPEG decompressor module for tiny embedded systems. -/ This is a free software that opened for education, research and commercial -/ developments under license policy of following terms. -/ -/ Copyright (C) 2021, ChaN, all right reserved. -/ -/ * The TJpgDec 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. -/ -/-----------------------------------------------------------------------------/ -/ Oct 04, 2011 R0.01 First release. -/ Feb 19, 2012 R0.01a Fixed decompression fails when scan starts with an escape seq. -/ Sep 03, 2012 R0.01b Added JD_TBLCLIP option. -/ Mar 16, 2019 R0.01c Supported stdint.h. -/ Jul 01, 2020 R0.01d Fixed wrong integer type usage. -/ May 08, 2021 R0.02 Supported grayscale image. Separated configuration options. -/ Jun 11, 2021 R0.02a Some performance improvement. -/ Jul 01, 2021 R0.03 Added JD_FASTDECODE option. -/ Some performance improvement. -/----------------------------------------------------------------------------*/ - -#include "tjpgd.h" - -#if LV_USE_TJPGD - -#if JD_FASTDECODE == 2 - #define HUFF_BIT 10 /* Bit length to apply fast huffman decode */ - #define HUFF_LEN (1 << HUFF_BIT) - #define HUFF_MASK (HUFF_LEN - 1) -#endif - - -/*-----------------------------------------------*/ -/* Zigzag-order to raster-order conversion table */ -/*-----------------------------------------------*/ - -static const uint8_t Zig[64] = { /* Zigzag-order to raster-order conversion table */ - 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 -}; - - - -/*-------------------------------------------------*/ -/* Input scale factor of Arai algorithm */ -/* (scaled up 16 bits for fixed point operations) */ -/*-------------------------------------------------*/ - -static const uint16_t Ipsf[64] = { /* See also aa_idct.png */ - (uint16_t)(1.00000 * 8192), (uint16_t)(1.38704 * 8192), (uint16_t)(1.30656 * 8192), (uint16_t)(1.17588 * 8192), (uint16_t)(1.00000 * 8192), (uint16_t)(0.78570 * 8192), (uint16_t)(0.54120 * 8192), (uint16_t)(0.27590 * 8192), - (uint16_t)(1.38704 * 8192), (uint16_t)(1.92388 * 8192), (uint16_t)(1.81226 * 8192), (uint16_t)(1.63099 * 8192), (uint16_t)(1.38704 * 8192), (uint16_t)(1.08979 * 8192), (uint16_t)(0.75066 * 8192), (uint16_t)(0.38268 * 8192), - (uint16_t)(1.30656 * 8192), (uint16_t)(1.81226 * 8192), (uint16_t)(1.70711 * 8192), (uint16_t)(1.53636 * 8192), (uint16_t)(1.30656 * 8192), (uint16_t)(1.02656 * 8192), (uint16_t)(0.70711 * 8192), (uint16_t)(0.36048 * 8192), - (uint16_t)(1.17588 * 8192), (uint16_t)(1.63099 * 8192), (uint16_t)(1.53636 * 8192), (uint16_t)(1.38268 * 8192), (uint16_t)(1.17588 * 8192), (uint16_t)(0.92388 * 8192), (uint16_t)(0.63638 * 8192), (uint16_t)(0.32442 * 8192), - (uint16_t)(1.00000 * 8192), (uint16_t)(1.38704 * 8192), (uint16_t)(1.30656 * 8192), (uint16_t)(1.17588 * 8192), (uint16_t)(1.00000 * 8192), (uint16_t)(0.78570 * 8192), (uint16_t)(0.54120 * 8192), (uint16_t)(0.27590 * 8192), - (uint16_t)(0.78570 * 8192), (uint16_t)(1.08979 * 8192), (uint16_t)(1.02656 * 8192), (uint16_t)(0.92388 * 8192), (uint16_t)(0.78570 * 8192), (uint16_t)(0.61732 * 8192), (uint16_t)(0.42522 * 8192), (uint16_t)(0.21677 * 8192), - (uint16_t)(0.54120 * 8192), (uint16_t)(0.75066 * 8192), (uint16_t)(0.70711 * 8192), (uint16_t)(0.63638 * 8192), (uint16_t)(0.54120 * 8192), (uint16_t)(0.42522 * 8192), (uint16_t)(0.29290 * 8192), (uint16_t)(0.14932 * 8192), - (uint16_t)(0.27590 * 8192), (uint16_t)(0.38268 * 8192), (uint16_t)(0.36048 * 8192), (uint16_t)(0.32442 * 8192), (uint16_t)(0.27590 * 8192), (uint16_t)(0.21678 * 8192), (uint16_t)(0.14932 * 8192), (uint16_t)(0.07612 * 8192) -}; - - - -/*---------------------------------------------*/ -/* Conversion table for fast clipping process */ -/*---------------------------------------------*/ - -#if JD_TBLCLIP - -#define BYTECLIP(v) Clip8[(unsigned int)(v) & 0x3FF] - -static const uint8_t Clip8[1024] = { - /* 0..255 */ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - /* 256..511 */ - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - /* -512..-257 */ - 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, 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, 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, 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, - /* -256..-1 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 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, 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, 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 /* JD_TBLCLIP */ - -static uint8_t BYTECLIP(int val) -{ - if(val < 0) return 0; - if(val > 255) return 255; - return (uint8_t)val; -} - -#endif - - - -/*-----------------------------------------------------------------------*/ -/* Allocate a memory block from memory pool */ -/*-----------------------------------------------------------------------*/ - -static void * alloc_pool( /* Pointer to allocated memory block (NULL:no memory available) */ - JDEC * jd, /* Pointer to the decompressor object */ - size_t ndata /* Number of bytes to allocate */ -) -{ - char * rp = 0; - - - ndata = (ndata + 3) & ~3; /* Align block size to the word boundary */ - - if(jd->sz_pool >= ndata) { - jd->sz_pool -= ndata; - rp = (char *)jd->pool; /* Get start of available memory pool */ - jd->pool = (void *)(rp + ndata); /* Allocate required bytes */ - } - - return (void *)rp; /* Return allocated memory block (NULL:no memory to allocate) */ -} - - - - -/*-----------------------------------------------------------------------*/ -/* Create de-quantization and prescaling tables with a DQT segment */ -/*-----------------------------------------------------------------------*/ - -static JRESULT create_qt_tbl( /* 0:OK, !0:Failed */ - JDEC * jd, /* Pointer to the decompressor object */ - const uint8_t * data, /* Pointer to the quantizer tables */ - size_t ndata /* Size of input data */ -) -{ - unsigned int i, zi; - uint8_t d; - int32_t * pb; - - - while(ndata) { /* Process all tables in the segment */ - if(ndata < 65) return JDR_FMT1; /* Err: table size is unaligned */ - ndata -= 65; - d = *data++; /* Get table property */ - if(d & 0xF0) return JDR_FMT1; /* Err: not 8-bit resolution */ - i = d & 3; /* Get table ID */ - pb = alloc_pool(jd, 64 * sizeof(int32_t)); /* Allocate a memory block for the table */ - if(!pb) return JDR_MEM1; /* Err: not enough memory */ - jd->qttbl[i] = pb; /* Register the table */ - for(i = 0; i < 64; i++) { /* Load the table */ - zi = Zig[i]; /* Zigzag-order to raster-order conversion */ - pb[zi] = (int32_t)((uint32_t) * data++ * Ipsf[zi]); /* Apply scale factor of Arai algorithm to the de-quantizers */ - } - } - - return JDR_OK; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Create huffman code tables with a DHT segment */ -/*-----------------------------------------------------------------------*/ - -static JRESULT create_huffman_tbl( /* 0:OK, !0:Failed */ - JDEC * jd, /* Pointer to the decompressor object */ - const uint8_t * data, /* Pointer to the packed huffman tables */ - size_t ndata /* Size of input data */ -) -{ - unsigned int i, j, b, cls, num; - size_t np; - uint8_t d, * pb, * pd; - uint16_t hc, * ph; - - - while(ndata) { /* Process all tables in the segment */ - if(ndata < 17) return JDR_FMT1; /* Err: wrong data size */ - ndata -= 17; - d = *data++; /* Get table number and class */ - if(d & 0xEE) return JDR_FMT1; /* Err: invalid class/number */ - cls = d >> 4; - num = d & 0x0F; /* class = dc(0)/ac(1), table number = 0/1 */ - pb = alloc_pool(jd, 16); /* Allocate a memory block for the bit distribution table */ - if(!pb) return JDR_MEM1; /* Err: not enough memory */ - jd->huffbits[num][cls] = pb; - for(np = i = 0; i < 16; i++) { /* Load number of patterns for 1 to 16-bit code */ - np += (pb[i] = *data++); /* Get sum of code words for each code */ - } - ph = alloc_pool(jd, np * sizeof(uint16_t)); /* Allocate a memory block for the code word table */ - if(!ph) return JDR_MEM1; /* Err: not enough memory */ - jd->huffcode[num][cls] = ph; - hc = 0; - for(j = i = 0; i < 16; i++) { /* Re-build huffman code word table */ - b = pb[i]; - while(b--) ph[j++] = hc++; - hc <<= 1; - } - - if(ndata < np) return JDR_FMT1; /* Err: wrong data size */ - ndata -= np; - pd = alloc_pool(jd, np); /* Allocate a memory block for the decoded data */ - if(!pd) return JDR_MEM1; /* Err: not enough memory */ - jd->huffdata[num][cls] = pd; - for(i = 0; i < np; i++) { /* Load decoded data corresponds to each code word */ - d = *data++; - if(!cls && d > 11) return JDR_FMT1; - pd[i] = d; - } -#if JD_FASTDECODE == 2 - { /* Create fast huffman decode table */ - unsigned int span, td, ti; - uint16_t * tbl_ac = 0; - uint8_t * tbl_dc = 0; - - if(cls) { - tbl_ac = alloc_pool(jd, HUFF_LEN * sizeof(uint16_t)); /* LUT for AC elements */ - if(!tbl_ac) return JDR_MEM1; /* Err: not enough memory */ - jd->hufflut_ac[num] = tbl_ac; - memset(tbl_ac, 0xFF, HUFF_LEN * sizeof(uint16_t)); /* Default value (0xFFFF: may be long code) */ - } - else { - tbl_dc = alloc_pool(jd, HUFF_LEN * sizeof(uint8_t)); /* LUT for AC elements */ - if(!tbl_dc) return JDR_MEM1; /* Err: not enough memory */ - jd->hufflut_dc[num] = tbl_dc; - memset(tbl_dc, 0xFF, HUFF_LEN * sizeof(uint8_t)); /* Default value (0xFF: may be long code) */ - } - for(i = b = 0; b < HUFF_BIT; b++) { /* Create LUT */ - for(j = pb[b]; j; j--) { - ti = ph[i] << (HUFF_BIT - 1 - b) & HUFF_MASK; /* Index of input pattern for the code */ - if(cls) { - td = pd[i++] | ((b + 1) << 8); /* b15..b8: code length, b7..b0: zero run and data length */ - for(span = 1 << (HUFF_BIT - 1 - b); span; span--, tbl_ac[ti++] = (uint16_t)td) ; - } - else { - td = pd[i++] | ((b + 1) << 4); /* b7..b4: code length, b3..b0: data length */ - for(span = 1 << (HUFF_BIT - 1 - b); span; span--, tbl_dc[ti++] = (uint8_t)td) ; - } - } - } - jd->longofs[num][cls] = i; /* Code table offset for long code */ - } -#endif - } - - return JDR_OK; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Extract a huffman decoded data from input stream */ -/*-----------------------------------------------------------------------*/ - -static int huffext( /* >=0: decoded data, <0: error code */ - JDEC * jd, /* Pointer to the decompressor object */ - unsigned int id, /* Table ID (0:Y, 1:C) */ - unsigned int cls /* Table class (0:DC, 1:AC) */ -) -{ - size_t dc = jd->dctr; - uint8_t * dp = jd->dptr; - unsigned int d, flg = 0; - -#if JD_FASTDECODE == 0 - uint8_t bm, nd, bl; - const uint8_t * hb = jd->huffbits[id][cls]; /* Bit distribution table */ - const uint16_t * hc = jd->huffcode[id][cls]; /* Code word table */ - const uint8_t * hd = jd->huffdata[id][cls]; /* Data table */ - - - bm = jd->dbit; /* Bit mask to extract */ - d = 0; - bl = 16; /* Max code length */ - do { - if(!bm) { /* Next byte? */ - if(!dc) { /* No input data is available, re-fill input buffer */ - dp = jd->inbuf; /* Top of input buffer */ - dc = jd->infunc(jd, dp, JD_SZBUF); - if(!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ - } - else { - dp++; /* Next data ptr */ - } - dc--; /* Decrement number of available bytes */ - if(flg) { /* In flag sequence? */ - flg = 0; /* Exit flag sequence */ - if(*dp != 0) return 0 - (int)JDR_FMT1; /* Err: unexpected flag is detected (may be corrupted data) */ - *dp = 0xFF; /* The flag is a data 0xFF */ - } - else { - if(*dp == 0xFF) { /* Is start of flag sequence? */ - flg = 1; - continue; /* Enter flag sequence, get trailing byte */ - } - } - bm = 0x80; /* Read from MSB */ - } - d <<= 1; /* Get a bit */ - if(*dp & bm) d++; - bm >>= 1; - - for(nd = *hb++; nd; nd--) { /* Search the code word in this bit length */ - if(d == *hc++) { /* Matched? */ - jd->dbit = bm; - jd->dctr = dc; - jd->dptr = dp; - return *hd; /* Return the decoded data */ - } - hd++; - } - bl--; - } while(bl); - -#else - const uint8_t * hb, * hd; - const uint16_t * hc; - unsigned int nc, bl, wbit = jd->dbit % 32; - uint32_t w = jd->wreg & ((1UL << wbit) - 1); - - - while(wbit < 16) { /* Prepare 16 bits into the working register */ - if(jd->marker) { - d = 0xFF; /* Input stream has stalled for a marker. Generate stuff bits */ - } - else { - if(!dc) { /* Buffer empty, re-fill input buffer */ - dp = jd->inbuf; /* Top of input buffer */ - dc = jd->infunc(jd, dp, JD_SZBUF); - if(!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ - } - d = *dp++; - dc--; - if(flg) { /* In flag sequence? */ - flg = 0; /* Exit flag sequence */ - if(d != 0) jd->marker = d; /* Not an escape of 0xFF but a marker */ - d = 0xFF; - } - else { - if(d == 0xFF) { /* Is start of flag sequence? */ - flg = 1; - continue; /* Enter flag sequence, get trailing byte */ - } - } - } - w = w << 8 | d; /* Shift 8 bits in the working register */ - wbit += 8; - } - jd->dctr = dc; - jd->dptr = dp; - jd->wreg = w; - -#if JD_FASTDECODE == 2 - /* Table search for the short codes */ - d = (unsigned int)(w >> (wbit - HUFF_BIT)); /* Short code as table index */ - if(cls) { /* AC element */ - d = jd->hufflut_ac[id][d]; /* Table decode */ - if(d != 0xFFFF) { /* It is done if hit in short code */ - jd->dbit = wbit - (d >> 8); /* Snip the code length */ - return d & 0xFF; /* b7..0: zero run and following data bits */ - } - } - else { /* DC element */ - d = jd->hufflut_dc[id][d]; /* Table decode */ - if(d != 0xFF) { /* It is done if hit in short code */ - jd->dbit = wbit - (d >> 4); /* Snip the code length */ - return d & 0xF; /* b3..0: following data bits */ - } - } - - /* Incremental search for the codes longer than HUFF_BIT */ - hb = jd->huffbits[id][cls] + HUFF_BIT; /* Bit distribution table */ - hc = jd->huffcode[id][cls] + jd->longofs[id][cls]; /* Code word table */ - hd = jd->huffdata[id][cls] + jd->longofs[id][cls]; /* Data table */ - bl = HUFF_BIT + 1; -#else - /* Incremental search for all codes */ - hb = jd->huffbits[id][cls]; /* Bit distribution table */ - hc = jd->huffcode[id][cls]; /* Code word table */ - hd = jd->huffdata[id][cls]; /* Data table */ - bl = 1; -#endif - for(; bl <= 16; bl++) { /* Incremental search */ - nc = *hb++; - if(nc) { - d = w >> (wbit - bl); - do { /* Search the code word in this bit length */ - if(d == *hc++) { /* Matched? */ - jd->dbit = wbit - bl; /* Snip the huffman code */ - return *hd; /* Return the decoded data */ - } - hd++; - } while(--nc); - } - } -#endif - - return 0 - (int)JDR_FMT1; /* Err: code not found (may be corrupted data) */ -} - - - - -/*-----------------------------------------------------------------------*/ -/* Extract N bits from input stream */ -/*-----------------------------------------------------------------------*/ - -static int bitext( /* >=0: extracted data, <0: error code */ - JDEC * jd, /* Pointer to the decompressor object */ - unsigned int nbit /* Number of bits to extract (1 to 16) */ -) -{ - size_t dc = jd->dctr; - uint8_t * dp = jd->dptr; - unsigned int d, flg = 0; - -#if JD_FASTDECODE == 0 - uint8_t mbit = jd->dbit; - - d = 0; - do { - if(!mbit) { /* Next byte? */ - if(!dc) { /* No input data is available, re-fill input buffer */ - dp = jd->inbuf; /* Top of input buffer */ - dc = jd->infunc(jd, dp, JD_SZBUF); - if(!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ - } - else { - dp++; /* Next data ptr */ - } - dc--; /* Decrement number of available bytes */ - if(flg) { /* In flag sequence? */ - flg = 0; /* Exit flag sequence */ - if(*dp != 0) return 0 - (int)JDR_FMT1; /* Err: unexpected flag is detected (may be corrupted data) */ - *dp = 0xFF; /* The flag is a data 0xFF */ - } - else { - if(*dp == 0xFF) { /* Is start of flag sequence? */ - flg = 1; - continue; /* Enter flag sequence */ - } - } - mbit = 0x80; /* Read from MSB */ - } - d <<= 1; /* Get a bit */ - if(*dp & mbit) d |= 1; - mbit >>= 1; - nbit--; - } while(nbit); - - jd->dbit = mbit; - jd->dctr = dc; - jd->dptr = dp; - return (int)d; - -#else - unsigned int wbit = jd->dbit % 32; - uint32_t w = jd->wreg & ((1UL << wbit) - 1); - - - while(wbit < nbit) { /* Prepare nbit bits into the working register */ - if(jd->marker) { - d = 0xFF; /* Input stream stalled, generate stuff bits */ - } - else { - if(!dc) { /* Buffer empty, re-fill input buffer */ - dp = jd->inbuf; /* Top of input buffer */ - dc = jd->infunc(jd, dp, JD_SZBUF); - if(!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ - } - d = *dp++; - dc--; - if(flg) { /* In flag sequence? */ - flg = 0; /* Exit flag sequence */ - if(d != 0) jd->marker = d; /* Not an escape of 0xFF but a marker */ - d = 0xFF; - } - else { - if(d == 0xFF) { /* Is start of flag sequence? */ - flg = 1; - continue; /* Enter flag sequence, get trailing byte */ - } - } - } - w = w << 8 | d; /* Get 8 bits into the working register */ - wbit += 8; - } - jd->wreg = w; - jd->dbit = wbit - nbit; - jd->dctr = dc; - jd->dptr = dp; - - return (int)(w >> ((wbit - nbit) % 32)); -#endif -} - - - - -/*-----------------------------------------------------------------------*/ -/* Process restart interval */ -/*-----------------------------------------------------------------------*/ - -JRESULT jd_restart( - JDEC * jd, /* Pointer to the decompressor object */ - uint16_t rstn /* Expected restart sequence number */ -) -{ - unsigned int i; - uint8_t * dp = jd->dptr; - size_t dc = jd->dctr; - -#if JD_FASTDECODE == 0 - uint16_t d = 0; - - /* Get two bytes from the input stream */ - for(i = 0; i < 2; i++) { - if(!dc) { /* No input data is available, re-fill input buffer */ - dp = jd->inbuf; - dc = jd->infunc(jd, dp, JD_SZBUF); - if(!dc) return JDR_INP; - } - else { - dp++; - } - dc--; - d = d << 8 | *dp; /* Get a byte */ - } - jd->dptr = dp; - jd->dctr = dc; - jd->dbit = 0; - - /* Check the marker */ - if((d & 0xFFD8) != 0xFFD0 || (d & 7) != (rstn & 7)) { - return JDR_FMT1; /* Err: expected RSTn marker is not detected (may be corrupted data) */ - } - -#else - uint16_t marker; - - - if(jd->marker) { /* Generate a maker if it has been detected */ - marker = 0xFF00 | jd->marker; - jd->marker = 0; - } - else { - marker = 0; - for(i = 0; i < 2; i++) { /* Get a restart marker */ - if(!dc) { /* No input data is available, re-fill input buffer */ - dp = jd->inbuf; - dc = jd->infunc(jd, dp, JD_SZBUF); - if(!dc) return JDR_INP; - } - marker = (marker << 8) | *dp++; /* Get a byte */ - dc--; - } - jd->dptr = dp; - jd->dctr = dc; - } - - /* Check the marker */ - if((marker & 0xFFD8) != 0xFFD0 || (marker & 7) != (rstn & 7)) { - return JDR_FMT1; /* Err: expected RSTn marker was not detected (may be corrupted data) */ - } - - jd->dbit = 0; /* Discard stuff bits */ -#endif - - jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0; /* Reset DC offset */ - return JDR_OK; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Apply Inverse-DCT in Arai Algorithm (see also aa_idct.png) */ -/*-----------------------------------------------------------------------*/ - -static void block_idct( - int32_t * src, /* Input block data (de-quantized and pre-scaled for Arai Algorithm) */ - jd_yuv_t * dst /* Pointer to the destination to store the block as byte array */ -) -{ - const int32_t M13 = (int32_t)(1.41421 * 4096), M2 = (int32_t)(1.08239 * 4096), M4 = (int32_t)(2.61313 * 4096), - M5 = (int32_t)(1.84776 * 4096); - int32_t v0, v1, v2, v3, v4, v5, v6, v7; - int32_t t10, t11, t12, t13; - int i; - - /* Process columns */ - for(i = 0; i < 8; i++) { - v0 = src[8 * 0]; /* Get even elements */ - v1 = src[8 * 2]; - v2 = src[8 * 4]; - v3 = src[8 * 6]; - - t10 = v0 + v2; /* Process the even elements */ - t12 = v0 - v2; - t11 = (v1 - v3) * M13 >> 12; - v3 += v1; - t11 -= v3; - v0 = t10 + v3; - v3 = t10 - v3; - v1 = t11 + t12; - v2 = t12 - t11; - - v4 = src[8 * 7]; /* Get odd elements */ - v5 = src[8 * 1]; - v6 = src[8 * 5]; - v7 = src[8 * 3]; - - t10 = v5 - v4; /* Process the odd elements */ - t11 = v5 + v4; - t12 = v6 - v7; - v7 += v6; - v5 = (t11 - v7) * M13 >> 12; - v7 += t11; - t13 = (t10 + t12) * M5 >> 12; - v4 = t13 - (t10 * M2 >> 12); - v6 = t13 - (t12 * M4 >> 12) - v7; - v5 -= v6; - v4 -= v5; - - src[8 * 0] = v0 + v7; /* Write-back transformed values */ - src[8 * 7] = v0 - v7; - src[8 * 1] = v1 + v6; - src[8 * 6] = v1 - v6; - src[8 * 2] = v2 + v5; - src[8 * 5] = v2 - v5; - src[8 * 3] = v3 + v4; - src[8 * 4] = v3 - v4; - - src++; /* Next column */ - } - - /* Process rows */ - src -= 8; - for(i = 0; i < 8; i++) { - v0 = src[0] + (128L << 8); /* Get even elements (remove DC offset (-128) here) */ - v1 = src[2]; - v2 = src[4]; - v3 = src[6]; - - t10 = v0 + v2; /* Process the even elements */ - t12 = v0 - v2; - t11 = (v1 - v3) * M13 >> 12; - v3 += v1; - t11 -= v3; - v0 = t10 + v3; - v3 = t10 - v3; - v1 = t11 + t12; - v2 = t12 - t11; - - v4 = src[7]; /* Get odd elements */ - v5 = src[1]; - v6 = src[5]; - v7 = src[3]; - - t10 = v5 - v4; /* Process the odd elements */ - t11 = v5 + v4; - t12 = v6 - v7; - v7 += v6; - v5 = (t11 - v7) * M13 >> 12; - v7 += t11; - t13 = (t10 + t12) * M5 >> 12; - v4 = t13 - (t10 * M2 >> 12); - v6 = t13 - (t12 * M4 >> 12) - v7; - v5 -= v6; - v4 -= v5; - - /* Descale the transformed values 8 bits and output a row */ -#if JD_FASTDECODE >= 1 - dst[0] = (int16_t)((v0 + v7) >> 8); - dst[7] = (int16_t)((v0 - v7) >> 8); - dst[1] = (int16_t)((v1 + v6) >> 8); - dst[6] = (int16_t)((v1 - v6) >> 8); - dst[2] = (int16_t)((v2 + v5) >> 8); - dst[5] = (int16_t)((v2 - v5) >> 8); - dst[3] = (int16_t)((v3 + v4) >> 8); - dst[4] = (int16_t)((v3 - v4) >> 8); -#else - dst[0] = BYTECLIP((v0 + v7) >> 8); - dst[7] = BYTECLIP((v0 - v7) >> 8); - dst[1] = BYTECLIP((v1 + v6) >> 8); - dst[6] = BYTECLIP((v1 - v6) >> 8); - dst[2] = BYTECLIP((v2 + v5) >> 8); - dst[5] = BYTECLIP((v2 - v5) >> 8); - dst[3] = BYTECLIP((v3 + v4) >> 8); - dst[4] = BYTECLIP((v3 - v4) >> 8); -#endif - - dst += 8; - src += 8; /* Next row */ - } -} - - - - -/*-----------------------------------------------------------------------*/ -/* Load all blocks in an MCU into working buffer */ -/*-----------------------------------------------------------------------*/ - -JRESULT jd_mcu_load( - JDEC * jd /* Pointer to the decompressor object */ -) -{ - int32_t * tmp = (int32_t *)jd->workbuf; /* Block working buffer for de-quantize and IDCT */ - int d, e; - unsigned int blk, nby, i, bc, z, id, cmp; - jd_yuv_t * bp; - const int32_t * dqf; - - - nby = jd->msx * jd->msy; /* Number of Y blocks (1, 2 or 4) */ - bp = jd->mcubuf; /* Pointer to the first block of MCU */ - - for(blk = 0; blk < nby + 2; blk++) { /* Get nby Y blocks and two C blocks */ - cmp = (blk < nby) ? 0 : blk - nby + 1; /* Component number 0:Y, 1:Cb, 2:Cr */ - - if(cmp && jd->ncomp != 3) { /* Clear C blocks if not exist (monochrome image) */ - for(i = 0; i < 64; bp[i++] = 128) ; - - } - else { /* Load Y/C blocks from input stream */ - id = cmp ? 1 : 0; /* Huffman table ID of this component */ - - /* Extract a DC element from input stream */ - d = huffext(jd, id, 0); /* Extract a huffman coded data (bit length) */ - if(d < 0) return (JRESULT)(0 - d); /* Err: invalid code or input */ - bc = (unsigned int)d; - d = jd->dcv[cmp]; /* DC value of previous block */ - if(bc) { /* If there is any difference from previous block */ - e = bitext(jd, bc); /* Extract data bits */ - if(e < 0) return (JRESULT)(0 - e); /* Err: input */ - bc = 1 << (bc - 1); /* MSB position */ - if(!(e & bc)) e -= (bc << 1) - 1; /* Restore negative value if needed */ - d += e; /* Get current value */ - jd->dcv[cmp] = (int16_t)d; /* Save current DC value for next block */ - } - dqf = jd->qttbl[jd->qtid[cmp]]; /* De-quantizer table ID for this component */ - tmp[0] = d * dqf[0] >> 8; /* De-quantize, apply scale factor of Arai algorithm and descale 8 bits */ - - /* Extract following 63 AC elements from input stream */ - memset(&tmp[1], 0, 63 * sizeof(int32_t)); /* Initialize all AC elements */ - z = 1; /* Top of the AC elements (in zigzag-order) */ - do { - d = huffext(jd, id, 1); /* Extract a huffman coded value (zero runs and bit length) */ - if(d == 0) break; /* EOB? */ - if(d < 0) return (JRESULT)(0 - d); /* Err: invalid code or input error */ - bc = (unsigned int)d; - z += bc >> 4; /* Skip leading zero run */ - if(z >= 64) return JDR_FMT1; /* Too long zero run */ - if(bc &= 0x0F) { /* Bit length? */ - d = bitext(jd, bc); /* Extract data bits */ - if(d < 0) return (JRESULT)(0 - d); /* Err: input device */ - bc = 1 << (bc - 1); /* MSB position */ - if(!(d & bc)) d -= (bc << 1) - 1; /* Restore negative value if needed */ - i = Zig[z]; /* Get raster-order index */ - tmp[i] = d * dqf[i] >> 8; /* De-quantize, apply scale factor of Arai algorithm and descale 8 bits */ - } - } while(++z < 64); /* Next AC element */ - - if(JD_FORMAT != 2 || !cmp) { /* C components may not be processed if in grayscale output */ - if(z == 1 || (JD_USE_SCALE && - jd->scale == - 3)) { /* If no AC element or scale ratio is 1/8, IDCT can be omitted and the block is filled with DC value */ - d = (jd_yuv_t)((*tmp / 256) + 128); - if(JD_FASTDECODE >= 1) { - for(i = 0; i < 64; bp[i++] = d) ; - } - else { - memset(bp, d, 64); - } - } - else { - block_idct(tmp, bp); /* Apply IDCT and store the block to the MCU buffer */ - } - } - } - - bp += 64; /* Next block */ - } - - return JDR_OK; /* All blocks have been loaded successfully */ -} - - - - -/*-----------------------------------------------------------------------*/ -/* Output an MCU: Convert YCrCb to RGB and output it in RGB form */ -/*-----------------------------------------------------------------------*/ - -JRESULT jd_mcu_output( - JDEC * jd, /* Pointer to the decompressor object */ - int (*outfunc)(JDEC *, void *, JRECT *), /* RGB output function */ - unsigned int x, /* MCU location in the image */ - unsigned int y /* MCU location in the image */ -) -{ - const int CVACC = (sizeof(int) > 2) ? 1024 : 128; /* Adaptive accuracy for both 16-/32-bit systems */ - unsigned int ix, iy, mx, my, rx, ry; - int yy, cb, cr; - jd_yuv_t * py, * pc; - uint8_t * pix; - JRECT rect; - - - mx = jd->msx * 8; - my = jd->msy * 8; /* MCU size (pixel) */ - rx = (x + mx <= jd->width) ? mx : jd->width - - x; /* Output rectangular size (it may be clipped at right/bottom end of image) */ - ry = (y + my <= jd->height) ? my : jd->height - y; - if(JD_USE_SCALE) { - rx >>= jd->scale; - ry >>= jd->scale; - if(!rx || !ry) return JDR_OK; /* Skip this MCU if all pixel is to be rounded off */ - x >>= jd->scale; - y >>= jd->scale; - } - rect.left = x; - rect.right = x + rx - 1; /* Rectangular area in the frame buffer */ - rect.top = y; - rect.bottom = y + ry - 1; - - - if(!JD_USE_SCALE || jd->scale != 3) { /* Not for 1/8 scaling */ - pix = (uint8_t *)jd->workbuf; - - if(JD_FORMAT != 2) { /* RGB output (build an RGB MCU from Y/C component) */ - for(iy = 0; iy < my; iy++) { - pc = py = jd->mcubuf; - if(my == 16) { /* Double block height? */ - pc += 64 * 4 + (iy >> 1) * 8; - if(iy >= 8) py += 64; - } - else { /* Single block height */ - pc += mx * 8 + iy * 8; - } - py += iy * 8; - for(ix = 0; ix < mx; ix++) { - cb = pc[0] - 128; /* Get Cb/Cr component and remove offset */ - cr = pc[64] - 128; - if(mx == 16) { /* Double block width? */ - if(ix == 8) py += 64 - 8; /* Jump to next block if double block height */ - pc += ix & 1; /* Step forward chroma pointer every two pixels */ - } - else { /* Single block width */ - pc++; /* Step forward chroma pointer every pixel */ - } - yy = *py++; /* Get Y component */ - *pix++ = /*B*/ BYTECLIP(yy + ((int)(1.772 * CVACC) * cb) / CVACC); - *pix++ = /*G*/ BYTECLIP(yy - ((int)(0.344 * CVACC) * cb + (int)(0.714 * CVACC) * cr) / CVACC); - *pix++ = /*R*/ BYTECLIP(yy + ((int)(1.402 * CVACC) * cr) / CVACC); - } - } - } - } - - /* Squeeze up pixel table if a part of MCU is to be truncated */ - mx >>= jd->scale; - if(rx < mx) { /* Is the MCU spans right edge? */ - uint8_t * s, * d; - unsigned int xi, yi; - - s = d = (uint8_t *)jd->workbuf; - for(yi = 0; yi < ry; yi++) { - for(xi = 0; xi < rx; xi++) { /* Copy effective pixels */ - *d++ = *s++; - if(JD_FORMAT != 2) { - *d++ = *s++; - *d++ = *s++; - } - } - s += (mx - rx) * (JD_FORMAT != 2 ? 3 : 1); /* Skip truncated pixels */ - } - } - - /* Convert RGB888 to RGB565 if needed */ - if(JD_FORMAT == 1) { - uint8_t * s = (uint8_t *)jd->workbuf; - uint16_t w, * d = (uint16_t *)s; - unsigned int n = rx * ry; - - do { - w = (*s++ & 0xF8) << 8; /* RRRRR----------- */ - w |= (*s++ & 0xFC) << 3; /* -----GGGGGG----- */ - w |= *s++ >> 3; /* -----------BBBBB */ - *d++ = w; - } while(--n); - } - - /* Output the rectangular */ - if(outfunc) return outfunc(jd, jd->workbuf, &rect) ? JDR_OK : JDR_INTR; - return 0; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Analyze the JPEG image and Initialize decompressor object */ -/*-----------------------------------------------------------------------*/ - -#define LDB_WORD(ptr) (uint16_t)(((uint16_t)*((uint8_t*)(ptr))<<8)|(uint16_t)*(uint8_t*)((ptr)+1)) - - -JRESULT jd_prepare( - JDEC * jd, /* Blank decompressor object */ - size_t (*infunc)(JDEC *, uint8_t *, size_t), /* JPEG stream input function */ - void * pool, /* Working buffer for the decompression session */ - size_t sz_pool, /* Size of working buffer */ - void * dev /* I/O device identifier for the session */ -) -{ - uint8_t * seg, b; - uint16_t marker; - unsigned int n, i, ofs; - size_t len; - JRESULT rc; - - - memset(jd, 0, sizeof( - JDEC)); /* Clear decompression object (this might be a problem if machine's null pointer is not all bits zero) */ - jd->pool = pool; /* Work memory */ - jd->pool_original = pool; - jd->sz_pool = sz_pool; /* Size of given work memory */ - jd->infunc = infunc; /* Stream input function */ - jd->device = dev; /* I/O device identifier */ - - jd->inbuf = seg = alloc_pool(jd, JD_SZBUF); /* Allocate stream input buffer */ - if(!seg) return JDR_MEM1; - - ofs = marker = 0; /* Find SOI marker */ - do { - if(jd->infunc(jd, seg, 1) != 1) return JDR_INP; /* Err: SOI was not detected */ - ofs++; - marker = marker << 8 | seg[0]; - } while(marker != 0xFFD8); - - for(;;) { /* Parse JPEG segments */ - /* Get a JPEG marker */ - if(jd->infunc(jd, seg, 4) != 4) return JDR_INP; - marker = LDB_WORD(seg); /* Marker */ - len = LDB_WORD(seg + 2); /* Length field */ - if(len <= 2 || (marker >> 8) != 0xFF) return JDR_FMT1; - len -= 2; /* Segment content size */ - ofs += 4 + len; /* Number of bytes loaded */ - - switch(marker & 0xFF) { - case 0xC0: /* SOF0 (baseline JPEG) */ - if(len > JD_SZBUF) return JDR_MEM2; - if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ - - jd->width = LDB_WORD(&seg[3]); /* Image width in unit of pixel */ - jd->height = LDB_WORD(&seg[1]); /* Image height in unit of pixel */ - jd->ncomp = seg[5]; /* Number of color components */ - if(jd->ncomp != 3 && jd->ncomp != 1) return JDR_FMT3; /* Err: Supports only Grayscale and Y/Cb/Cr */ - - /* Check each image component */ - for(i = 0; i < jd->ncomp; i++) { - b = seg[7 + 3 * i]; /* Get sampling factor */ - if(i == 0) { /* Y component */ - if(b != 0x11 && b != 0x22 && b != 0x21) { /* Check sampling factor */ - return JDR_FMT3; /* Err: Supports only 4:4:4, 4:2:0 or 4:2:2 */ - } - jd->msx = b >> 4; - jd->msy = b & 15; /* Size of MCU [blocks] */ - } - else { /* Cb/Cr component */ - if(b != 0x11) return JDR_FMT3; /* Err: Sampling factor of Cb/Cr must be 1 */ - } - jd->qtid[i] = seg[8 + 3 * i]; /* Get dequantizer table ID for this component */ - if(jd->qtid[i] > 3) return JDR_FMT3; /* Err: Invalid ID */ - } - break; - - case 0xDD: /* DRI - Define Restart Interval */ - if(len > JD_SZBUF) return JDR_MEM2; - if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ - - jd->nrst = LDB_WORD(seg); /* Get restart interval (MCUs) */ - break; - - case 0xC4: /* DHT - Define Huffman Tables */ - if(len > JD_SZBUF) return JDR_MEM2; - if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ - - rc = create_huffman_tbl(jd, seg, len); /* Create huffman tables */ - if(rc) return rc; - break; - - case 0xDB: /* DQT - Define Quantizer Tables */ - if(len > JD_SZBUF) return JDR_MEM2; - if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ - - rc = create_qt_tbl(jd, seg, len); /* Create de-quantizer tables */ - if(rc) return rc; - break; - - case 0xDA: /* SOS - Start of Scan */ - if(len > JD_SZBUF) return JDR_MEM2; - if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ - - if(!jd->width || !jd->height) return JDR_FMT1; /* Err: Invalid image size */ - if(seg[0] != jd->ncomp) return JDR_FMT3; /* Err: Wrong color components */ - - /* Check if all tables corresponding to each components have been loaded */ - for(i = 0; i < jd->ncomp; i++) { - b = seg[2 + 2 * i]; /* Get huffman table ID */ - if(b != 0x00 && b != 0x11) return JDR_FMT3; /* Err: Different table number for DC/AC element */ - n = i ? 1 : 0; /* Component class */ - if(!jd->huffbits[n][0] || !jd->huffbits[n][1]) { /* Check huffman table for this component */ - return JDR_FMT1; /* Err: Not loaded */ - } - if(!jd->qttbl[jd->qtid[i]]) { /* Check dequantizer table for this component */ - return JDR_FMT1; /* Err: Not loaded */ - } - } - - /* Allocate working buffer for MCU and pixel output */ - n = jd->msy * jd->msx; /* Number of Y blocks in the MCU */ - if(!n) return JDR_FMT1; /* Err: SOF0 has not been loaded */ - len = n * 64 * 2 + 64; /* Allocate buffer for IDCT and RGB output */ - if(len < 256) len = 256; /* but at least 256 byte is required for IDCT */ - jd->workbuf = alloc_pool(jd, - len); /* and it may occupy a part of following MCU working buffer for RGB output */ - if(!jd->workbuf) return JDR_MEM1; /* Err: not enough memory */ - jd->mcubuf = alloc_pool(jd, (n + 2) * 64 * sizeof(jd_yuv_t)); /* Allocate MCU working buffer */ - if(!jd->mcubuf) return JDR_MEM1; /* Err: not enough memory */ - - /* Align stream read offset to JD_SZBUF */ - if(ofs %= JD_SZBUF) { - jd->dctr = jd->infunc(jd, seg + ofs, (size_t)(JD_SZBUF - ofs)); - } - jd->dptr = seg + ofs - (JD_FASTDECODE ? 0 : 1); - - return JDR_OK; /* Initialization succeeded. Ready to decompress the JPEG image. */ - - case 0xC1: /* SOF1 */ - case 0xC2: /* SOF2 */ - case 0xC3: /* SOF3 */ - case 0xC5: /* SOF5 */ - case 0xC6: /* SOF6 */ - case 0xC7: /* SOF7 */ - case 0xC9: /* SOF9 */ - case 0xCA: /* SOF10 */ - case 0xCB: /* SOF11 */ - case 0xCD: /* SOF13 */ - case 0xCE: /* SOF14 */ - case 0xCF: /* SOF15 */ - case 0xD9: /* EOI */ - return JDR_FMT3; /* Unsupported JPEG standard (may be progressive JPEG) */ - - default: /* Unknown segment (comment, exif or etc..) */ - /* Skip segment data (null pointer specifies to remove data from the stream) */ - if(jd->infunc(jd, 0, len) != len) return JDR_INP; - } - } -} - - - - -/*-----------------------------------------------------------------------*/ -/* Start to decompress the JPEG picture */ -/*-----------------------------------------------------------------------*/ - -JRESULT jd_decomp( - JDEC * jd, /* Initialized decompression object */ - int (*outfunc)(JDEC *, void *, JRECT *), /* RGB output function */ - uint8_t scale /* Output de-scaling factor (0 to 3) */ -) -{ - unsigned int x, y, mx, my; - uint16_t rst, rsc; - JRESULT rc; - - - if(scale > (JD_USE_SCALE ? 3 : 0)) return JDR_PAR; - jd->scale = scale; - - mx = jd->msx * 8; - my = jd->msy * 8; /* Size of the MCU (pixel) */ - - jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0; /* Initialize DC values */ - rst = rsc = 0; - - rc = JDR_OK; - for(y = 0; y < jd->height; y += my) { /* Vertical loop of MCUs */ - for(x = 0; x < jd->width; x += mx) { /* Horizontal loop of MCUs */ - if(jd->nrst && rst++ == jd->nrst) { /* Process restart interval if enabled */ - rc = jd_restart(jd, rsc++); - if(rc != JDR_OK) return rc; - rst = 1; - } - rc = jd_mcu_load(jd); /* Load an MCU (decompress huffman coded stream, dequantize and apply IDCT) */ - if(rc != JDR_OK) return rc; - rc = jd_mcu_output(jd, outfunc, x, y); /* Output the MCU (YCbCr to RGB, scaling and output) */ - if(rc != JDR_OK) return rc; - } - } - - return rc; -} -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/tjpgd.h b/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/tjpgd.h deleted file mode 100644 index 887038a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/tjpgd.h +++ /dev/null @@ -1,108 +0,0 @@ -/*----------------------------------------------------------------------------/ -/ TJpgDec - Tiny JPEG Decompressor R0.03 include file (C)ChaN, 2021 -/----------------------------------------------------------------------------*/ -#ifndef DEF_TJPGDEC -#define DEF_TJPGDEC - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../../lv_conf_internal.h" -#include "tjpgdcnf.h" - -#if LV_USE_TJPGD - -#include -#include - -#if JD_FASTDECODE >= 1 -typedef int16_t jd_yuv_t; -#else -typedef uint8_t jd_yuv_t; -#endif - - -/* Error code */ -typedef enum { - JDR_OK = 0, /* 0: Succeeded */ - JDR_INTR, /* 1: Interrupted by output function */ - JDR_INP, /* 2: Device error or wrong termination of input stream */ - JDR_MEM1, /* 3: Insufficient memory pool for the image */ - JDR_MEM2, /* 4: Insufficient stream input buffer */ - JDR_PAR, /* 5: Parameter error */ - JDR_FMT1, /* 6: Data format error (may be broken data) */ - JDR_FMT2, /* 7: Right format but not supported */ - JDR_FMT3 /* 8: Not supported JPEG standard */ -} JRESULT; - - - -/* Rectangular region in the output image */ -typedef struct { - uint16_t left; /* Left end */ - uint16_t right; /* Right end */ - uint16_t top; /* Top end */ - uint16_t bottom; /* Bottom end */ -} JRECT; - - - -/* Decompressor object structure */ -typedef struct JDEC JDEC; -struct JDEC { - size_t dctr; /* Number of bytes available in the input buffer */ - uint8_t * dptr; /* Current data read ptr */ - uint8_t * inbuf; /* Bit stream input buffer */ - uint8_t dbit; /* Number of bits available in wreg or reading bit mask */ - uint8_t scale; /* Output scaling ratio */ - uint8_t msx, msy; /* MCU size in unit of block (width, height) */ - uint8_t qtid[3]; /* Quantization table ID of each component, Y, Cb, Cr */ - uint8_t ncomp; /* Number of color components 1:grayscale, 3:color */ - int16_t dcv[3]; /* Previous DC element of each component */ - uint16_t nrst; /* Restart interval */ - uint16_t rst; /* Restart count*/ - uint16_t rsc; /* Expected restart sequence ID*/ - uint16_t width, height; /* Size of the input image (pixel) */ - uint8_t * huffbits[2][2]; /* Huffman bit distribution tables [id][dcac] */ - uint16_t * huffcode[2][2]; /* Huffman code word tables [id][dcac] */ - uint8_t * huffdata[2][2]; /* Huffman decoded data tables [id][dcac] */ - int32_t * qttbl[4]; /* Dequantizer tables [id] */ -#if JD_FASTDECODE >= 1 - uint32_t wreg; /* Working shift register */ - uint8_t marker; /* Detected marker (0:None) */ -#if JD_FASTDECODE == 2 - uint8_t longofs[2][2]; /* Table offset of long code [id][dcac] */ - uint16_t * hufflut_ac[2]; /* Fast huffman decode tables for AC short code [id] */ - uint8_t * hufflut_dc[2]; /* Fast huffman decode tables for DC short code [id] */ -#endif -#endif - void * workbuf; /* Working buffer for IDCT and RGB output */ - jd_yuv_t * mcubuf; /* Working buffer for the MCU */ - void * pool; /* Pointer to available memory pool */ - void * pool_original; /* Pointer to original pool */ - size_t sz_pool; /* Size of memory pool (bytes available) */ - size_t (*infunc)(JDEC *, uint8_t *, size_t); /* Pointer to jpeg stream input function */ - void * device; /* Pointer to I/O device identifier for the session */ -}; - - - -/* TJpgDec API functions */ -JRESULT jd_prepare(JDEC * jd, size_t (*infunc)(JDEC *, uint8_t *, size_t), void * pool, size_t sz_pool, void * dev); - -JRESULT jd_decomp(JDEC * jd, int (*outfunc)(JDEC *, void *, JRECT *), uint8_t scale); - -JRESULT jd_mcu_load(JDEC * jd); - -JRESULT jd_mcu_output(JDEC * jd, int (*outfunc)(JDEC *, void *, JRECT *), unsigned int x, unsigned int y); - -JRESULT jd_restart(JDEC * jd, uint16_t rstn); - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* _TJPGDEC */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/tjpgdcnf.h b/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/tjpgdcnf.h deleted file mode 100644 index dc27d6a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/libs/tjpgd/tjpgdcnf.h +++ /dev/null @@ -1,33 +0,0 @@ -/*----------------------------------------------*/ -/* TJpgDec System Configurations R0.03 */ -/*----------------------------------------------*/ - -#define JD_SZBUF 512 -/* Specifies size of stream input buffer */ - -#define JD_FORMAT 0 -/* Specifies output pixel format. -/ 0: RGB888 (24-bit/pix) -/ 1: RGB565 (16-bit/pix) -/ 2: Grayscale (8-bit/pix) -*/ - -#define JD_USE_SCALE 0 -/* Switches output descaling feature. -/ 0: Disable -/ 1: Enable -*/ - -#define JD_TBLCLIP 1 -/* Use table conversion for saturation arithmetic. A bit faster, but increases 1 KB of code size. -/ 0: Disable -/ 1: Enable -*/ - -#define JD_FASTDECODE 1 -/* Optimization level -/ 0: Basic optimization. Suitable for 8/16-bit MCUs. -/ 1: + 32-bit barrel shifter. Suitable for 32-bit MCUs. -/ 2: + Table conversion for huffman decoding (wants 6 << HUFF_BIT bytes of RAM) -*/ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/lv_api_map_v8.h b/software/Power_Pico/Middlewares/LVGL/src/lv_api_map_v8.h deleted file mode 100644 index 822450f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/lv_api_map_v8.h +++ /dev/null @@ -1,328 +0,0 @@ -/** - * @file lv_api_map_v8.h - * - */ - -#ifndef LV_API_MAP_V8_H -#define LV_API_MAP_V8_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "misc/lv_types.h" - -/********************* - * DEFINES - *********************/ - -#define LV_DISP_ROTATION_0 LV_DISPLAY_ROTATION_0 -#define LV_DISP_ROTATION_90 LV_DISPLAY_ROTATION_90 -#define LV_DISP_ROTATION_180 LV_DISPLAY_ROTATION_180 -#define LV_DISP_ROTATION_270 LV_DISPLAY_ROTATION_270 - -#define LV_DISP_RENDER_MODE_PARTIAL LV_DISPLAY_RENDER_MODE_PARTIAL -#define LV_DISP_RENDER_MODE_DIRECT LV_DISPLAY_RENDER_MODE_DIRECT -#define LV_DISP_RENDER_MODE_FULL LV_DISPLAY_RENDER_MODE_FULL - -#if LV_USE_BUTTONMATRIX -#define LV_BTNMATRIX_BTN_NONE LV_BUTTONMATRIX_BUTTON_NONE - -#define LV_BTNMATRIX_CTRL_HIDDEN LV_BUTTONMATRIX_CTRL_HIDDEN -#define LV_BTNMATRIX_CTRL_NO_REPEAT LV_BUTTONMATRIX_CTRL_NO_REPEAT -#define LV_BTNMATRIX_CTRL_DISABLED LV_BUTTONMATRIX_CTRL_DISABLED -#define LV_BTNMATRIX_CTRL_CHECKABLE LV_BUTTONMATRIX_CTRL_CHECKABLE -#define LV_BTNMATRIX_CTRL_CHECKED LV_BUTTONMATRIX_CTRL_CHECKED -#define LV_BTNMATRIX_CTRL_CLICK_TRIG LV_BUTTONMATRIX_CTRL_CLICK_TRIG -#define LV_BTNMATRIX_CTRL_POPOVER LV_BUTTONMATRIX_CTRL_POPOVER -#define LV_BTNMATRIX_CTRL_CUSTOM_1 LV_BUTTONMATRIX_CTRL_CUSTOM_1 -#define LV_BTNMATRIX_CTRL_CUSTOM_2 LV_BUTTONMATRIX_CTRL_CUSTOM_2 -#endif /* LV_USE_BUTTONMATRIX */ - -/********************** - * TYPEDEFS - **********************/ -typedef int32_t lv_coord_t; -typedef lv_result_t lv_res_t; -typedef lv_image_dsc_t lv_img_dsc_t; -typedef lv_display_t lv_disp_t; -typedef lv_display_rotation_t lv_disp_rotation_t; -typedef lv_display_render_mode_t lv_disp_render_t; -typedef lv_anim_completed_cb_t lv_anim_ready_cb_t; -typedef lv_screen_load_anim_t lv_scr_load_anim_t; - -#if LV_USE_BUTTONMATRIX -typedef lv_buttonmatrix_ctrl_t lv_btnmatrix_ctrl_t; -#endif /* LV_USE_BUTTONMATRIX */ - -#if LV_USE_IMAGEBUTTON -#define LV_IMGBTN_STATE_RELEASED LV_IMAGEBUTTON_STATE_RELEASED -#define LV_IMGBTN_STATE_PRESSED LV_IMAGEBUTTON_STATE_PRESSED -#define LV_IMGBTN_STATE_DISABLED LV_IMAGEBUTTON_STATE_DISABLED -#define LV_IMGBTN_STATE_CHECKED_RELEASED LV_IMAGEBUTTON_STATE_CHECKED_RELEASED -#define LV_IMGBTN_STATE_CHECKED_PRESSED LV_IMAGEBUTTON_STATE_CHECKED_PRESSED -#define LV_IMGBTN_STATE_CHECKED_DISABLED LV_IMAGEBUTTON_STATE_CHECKED_DISABLED -#endif /* LV_USE_IMAGEBUTTON */ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -static inline LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_task_handler(void) -{ - return lv_timer_handler(); -} - -/** - * Move the object to the foreground. - * It will look like if it was created as the last child of its parent. - * It also means it can cover any of the siblings. - * @param obj pointer to an object - */ -static inline void lv_obj_move_foreground(lv_obj_t * obj) -{ - lv_obj_t * parent = lv_obj_get_parent(obj); - if(!parent) { - LV_LOG_WARN("parent is NULL"); - return; - } - - lv_obj_move_to_index(obj, lv_obj_get_child_count(parent) - 1); -} - -/** - * Move the object to the background. - * It will look like if it was created as the first child of its parent. - * It also means any of the siblings can cover the object. - * @param obj pointer to an object - */ -static inline void lv_obj_move_background(lv_obj_t * obj) -{ - lv_obj_move_to_index(obj, 0); -} - -/********************** - * MACROS - **********************/ -#define LV_RES_OK LV_RESULT_OK -#define LV_RES_INV LV_RESULT_INVALID - -#define LV_INDEV_STATE_PR LV_INDEV_STATE_PRESSED -#define LV_INDEV_STATE_REL LV_INDEV_STATE_RELEASED - -#define lv_obj_del lv_obj_delete -#define lv_obj_del_async lv_obj_delete_async -#define lv_obj_clear_flag lv_obj_remove_flag -#define lv_obj_clear_state lv_obj_remove_state - -#define lv_indev_set_disp lv_indev_set_display -#define lv_indev_get_act lv_indev_active -#define lv_scr_act lv_screen_active -#define lv_disp_remove lv_display_delete -#define lv_disp_set_default lv_display_set_default -#define lv_disp_get_default lv_display_get_default -#define lv_disp_get_next lv_display_get_next -#define lv_disp_set_rotation lv_display_set_rotation -#define lv_disp_get_hor_res lv_display_get_horizontal_resolution -#define lv_disp_get_ver_res lv_display_get_vertical_resolution -#define lv_disp_get_physical_hor_res lv_display_get_physical_horizontal_resolution -#define lv_disp_get_physical_ver_res lv_display_get_physical_vertical_resolution -#define lv_disp_get_offset_x lv_display_get_offset_x -#define lv_disp_get_offset_y lv_display_get_offset_y -#define lv_disp_get_rotation lv_display_get_rotation -#define lv_disp_get_dpi lv_display_get_dpi -#define lv_disp_get_antialiasing lv_display_get_antialiasing -#define lv_disp_flush_ready lv_display_flush_ready -#define lv_disp_flush_is_last lv_display_flush_is_last -#define lv_disp_get_scr_act lv_display_get_screen_active -#define lv_disp_get_scr_prev lv_display_get_screen_prev -#define lv_disp_load_scr lv_screen_load -#define lv_scr_load lv_screen_load -#define lv_scr_load_anim lv_screen_load_anim -#define lv_disp_get_layer_top lv_display_get_layer_top -#define lv_disp_get_layer_sys lv_display_get_layer_sys -#define lv_disp_send_event lv_display_send_event -#define lv_disp_set_theme lv_display_set_theme -#define lv_disp_get_theme lv_display_get_theme -#define lv_disp_get_inactive_time lv_display_get_inactive_time -#define lv_disp_trig_activity lv_display_trigger_activity -#define lv_disp_enable_invalidation lv_display_enable_invalidation -#define lv_disp_is_invalidation_enabled lv_display_is_invalidation_enabled -#define lv_disp_refr_timer lv_display_refr_timer -#define lv_disp_get_refr_timer lv_display_get_refr_timer - -#define lv_timer_del lv_timer_delete - -#define lv_anim_del lv_anim_delete -#define lv_anim_del_all lv_anim_delete_all -#define lv_anim_set_ready_cb lv_anim_set_completed_cb - -#define lv_group_del lv_group_delete - -#if LV_USE_TEXTAREA -#define lv_txt_get_size lv_text_get_size -#define lv_txt_get_width lv_text_get_width -#endif /* LV_USE_TEXTAREA */ - -#if LV_USE_IMAGE -#define lv_img_create lv_image_create -#define lv_img_set_src lv_image_set_src -#define lv_img_set_offset_x lv_image_set_offset_x -#define lv_img_set_offset_y lv_image_set_offset_y -#define lv_img_set_angle lv_image_set_rotation -#define lv_img_set_pivot lv_image_set_pivot -#define lv_img_set_zoom lv_image_set_scale -#define lv_img_set_antialias lv_image_set_antialias -#define lv_img_get_src lv_image_get_src -#define lv_img_get_offset_x lv_image_get_offset_x -#define lv_img_get_offset_y lv_image_get_offset_y -#define lv_img_get_angle lv_image_get_rotation -#define lv_img_get_pivot lv_image_get_pivot -#define lv_img_get_zoom lv_image_get_scale -#define lv_img_get_antialias lv_image_get_antialias -#endif /* LV_USE_IMAGE */ - -#if LV_USE_IMAGEBUTTON -#define lv_imgbtn_create lv_imagebutton_create -#define lv_imgbtn_set_src lv_imagebutton_set_src -#define lv_imgbtn_set_state lv_imagebutton_set_state -#define lv_imgbtn_get_src_left lv_imagebutton_get_src_left -#define lv_imgbtn_get_src_middle lv_imagebutton_get_src_middle -#define lv_imgbtn_get_src_right lv_imagebutton_get_src_right -#endif /* LV_USE_IMAGEBUTTON */ - -#if LV_USE_LIST -#define lv_list_set_btn_text lv_list_set_button_text -#define lv_list_get_btn_text lv_list_get_button_text -#define lv_list_add_btn lv_list_add_button -#endif /* LV_USE_LIST */ - -#if LV_USE_BUTTON -#define lv_btn_create lv_button_create -#endif /* LV_USE_BUTTON */ - -#if LV_USE_BUTTONMATRIX -#define lv_btnmatrix_create lv_buttonmatrix_create -#define lv_btnmatrix_set_map lv_buttonmatrix_set_map -#define lv_btnmatrix_set_ctrl_map lv_buttonmatrix_set_ctrl_map -#define lv_btnmatrix_set_selected_btn lv_buttonmatrix_set_selected_button -#define lv_btnmatrix_set_btn_ctrl lv_buttonmatrix_set_button_ctrl -#define lv_btnmatrix_clear_btn_ctrl lv_buttonmatrix_clear_button_ctrl -#define lv_btnmatrix_set_btn_ctrl_all lv_buttonmatrix_set_button_ctrl_all -#define lv_btnmatrix_clear_btn_ctrl_all lv_buttonmatrix_clear_button_ctrl_all -#define lv_btnmatrix_set_btn_width lv_buttonmatrix_set_button_width -#define lv_btnmatrix_set_one_checked lv_buttonmatrix_set_one_checked -#define lv_btnmatrix_get_map lv_buttonmatrix_get_map -#define lv_btnmatrix_get_selected_btn lv_buttonmatrix_get_selected_button -#define lv_btnmatrix_get_btn_text lv_buttonmatrix_get_button_text -#define lv_btnmatrix_has_button_ctrl lv_buttonmatrix_has_button_ctrl -#define lv_btnmatrix_get_one_checked lv_buttonmatrix_get_one_checked -#endif /* LV_USE_BUTTONMATRIX */ - -#if LV_USE_TABVIEW -#define lv_tabview_get_tab_btns lv_tabview_get_tab_bar -#define lv_tabview_get_tab_act lv_tabview_get_tab_active -#define lv_tabview_set_act lv_tabview_set_active -#endif /* LV_USE_TABVIEW */ - -#if LV_USE_TILEVIEW -#define lv_tileview_get_tile_act lv_tileview_get_tile_active -#define lv_obj_set_tile_id lv_tileview_set_tile_by_index -#define lv_obj_set_tile lv_tileview_set_tile -#endif /* LV_USE_TILEVIEW */ - -#if LV_USE_ROLLER -#define lv_roller_set_visible_row_cnt lv_roller_set_visible_row_count -#define lv_roller_get_option_cnt lv_roller_get_option_count -#endif /* LV_USE_ROLLER */ - -#if LV_USE_TABLE -#define lv_table_set_col_cnt lv_table_set_column_count -#define lv_table_set_row_cnt lv_table_set_row_count -#define lv_table_get_col_cnt lv_table_get_column_count -#define lv_table_get_row_cnt lv_table_get_row_count -#define lv_table_set_col_width lv_table_set_column_width -#define lv_table_get_col_width lv_table_get_column_width -#endif /* LV_USE_TABLE */ - -#if LV_USE_DROPDOWN -#define lv_dropdown_get_option_cnt lv_dropdown_get_option_count -#endif /* LV_USE_DROPDOWN */ - -#define lv_obj_get_child_cnt lv_obj_get_child_count -#define lv_obj_get_disp lv_obj_get_display -#define lv_obj_delete_anim_ready_cb lv_obj_delete_anim_completed_cb - -#define LV_STYLE_ANIM_TIME LV_STYLE_ANIM_DURATION -#define LV_STYLE_IMG_OPA LV_STYLE_IMAGE_OPA -#define LV_STYLE_IMG_RECOLOR LV_STYLE_IMAGE_RECOLOR -#define LV_STYLE_IMG_RECOLOR_OPA LV_STYLE_IMAGE_RECOLOR_OPA -#define LV_STYLE_SHADOW_OFS_X LV_STYLE_SHADOW_OFFSET_X -#define LV_STYLE_SHADOW_OFS_Y LV_STYLE_SHADOW_OFFSET_Y -#define LV_STYLE_TRANSFORM_ANGLE LV_STYLE_TRANSFORM_ROTATION - -#define lv_obj_get_style_anim_time lv_obj_get_style_anim_duration -#define lv_obj_get_style_img_opa lv_obj_get_style_image_opa -#define lv_obj_get_style_img_recolor lv_obj_get_style_image_recolor -#define lv_obj_get_style_img_recolor_filtered lv_obj_get_style_image_recolor_filtered -#define lv_obj_get_style_img_recolor_opa lv_obj_get_style_image_recolor_opa -#define lv_obj_get_style_shadow_ofs_x lv_obj_get_style_shadow_offset_x -#define lv_obj_get_style_shadow_ofs_y lv_obj_get_style_shadow_offset_y -#define lv_obj_get_style_transform_angle lv_obj_get_style_transform_rotation -#define lv_obj_get_style_bg_img_src lv_obj_get_style_bg_image_src -#define lv_obj_get_style_bg_img_recolor lv_obj_get_style_bg_image_recolor -#define lv_obj_get_style_bg_img_recolor_opa lv_obj_get_style_bg_image_recolor_opa - -#define lv_obj_set_style_anim_time lv_obj_set_style_anim_duration -#define lv_obj_set_style_img_opa lv_obj_set_style_image_opa -#define lv_obj_set_style_img_recolor lv_obj_set_style_image_recolor -#define lv_obj_set_style_img_recolor_opa lv_obj_set_style_image_recolor_opa -#define lv_obj_set_style_shadow_ofs_x lv_obj_set_style_shadow_offset_x -#define lv_obj_set_style_shadow_ofs_y lv_obj_set_style_shadow_offset_y -#define lv_obj_set_style_transform_zoom lv_obj_set_style_transform_scale -#define lv_obj_set_style_transform_angle lv_obj_set_style_transform_rotation -#define lv_obj_set_style_bg_img_src lv_obj_set_style_bg_image_src -#define lv_obj_set_style_bg_img_recolor lv_obj_set_style_bg_image_recolor -#define lv_obj_set_style_bg_img_recolor_opa lv_obj_set_style_bg_image_recolor_opa - -#define lv_style_set_anim_time lv_style_set_anim_duration -#define lv_style_set_img_opa lv_style_set_image_opa -#define lv_style_set_img_recolor lv_style_set_image_recolor -#define lv_style_set_img_recolor_opa lv_style_set_image_recolor_opa -#define lv_style_set_shadow_ofs_x lv_style_set_shadow_offset_x -#define lv_style_set_shadow_ofs_y lv_style_set_shadow_offset_y -#define lv_style_set_transform_angle lv_style_set_transform_rotation -#define lv_style_set_transform_zoom lv_style_set_transform_scale -#define lv_style_set_bg_img_src lv_style_set_bg_image_src -#define lv_style_set_bg_img_recolor lv_style_set_bg_image_recolor -#define lv_style_set_bg_img_recolor_opa lv_style_set_bg_image_recolor_opa - -#if LV_USE_KEYBOARD -#define lv_keyboard_get_selected_btn lv_keyboard_get_selected_button -#define lv_keyboard_get_btn_text lv_keyboard_get_button_text -#endif /* LV_USE_KEYBOARD */ - -#define LV_ZOOM_NONE LV_SCALE_NONE - -#define lv_image_decoder_built_in_open lv_bin_decoder_open -#define lv_image_decoder_built_in_close lv_bin_decoder_close - -/********************** - * MACROS - **********************/ -/** Use this macro to declare an image in a C file*/ -#define LV_IMG_DECLARE(var_name) extern const lv_image_dsc_t var_name; - -/********************** - * DEPRECATED FUNCTIONS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_API_MAP_V8_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/lv_api_map_v9_0.h b/software/Power_Pico/Middlewares/LVGL/src/lv_api_map_v9_0.h deleted file mode 100644 index b0d22cd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/lv_api_map_v9_0.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @file lv_api_map_v9_0.h - * - */ - -#ifndef LV_API_MAP_V9_0_H -#define LV_API_MAP_V9_0_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "misc/lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ -#define lv_image_set_align lv_image_set_inner_align -#define lv_image_get_align lv_image_get_inner_align - -#ifndef LV_DRAW_LAYER_SIMPLE_BUF_SIZE -#define LV_DRAW_LAYER_SIMPLE_BUF_SIZE LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE -#endif - -#define lv_button_bind_checked lv_obj_bind_checked - -#define LV_DRAW_BUF_DEFINE LV_DRAW_BUF_DEFINE_STATIC - -#define _lv_utils_bsearch lv_utils_bsearch -#define lv_draw_buf_align_user lv_draw_buf_align_ex -#define lv_draw_buf_create_user lv_draw_buf_create_ex -#define lv_draw_buf_width_to_stride_user lv_draw_buf_width_to_stride_ex -#define lv_draw_buf_dup_user lv_draw_buf_dup_ex - -#define lv_draw_buf_invalidate_cache_user(handlers, drawbuf, area) lv_draw_buf_invalidate_cache(drawbuf, area) -#define lv_draw_buf_flush_cache_user(handlers, drawbuf, area) lv_draw_buf_flush_cache(drawbuf, area) -#define lv_draw_buf_destroy_user(handlers, drawbuf) lv_draw_buf_destroy(drawbuf) - -/********************** - * MACROS - **********************/ - -/********************** - * DEPRECATED FUNCTIONS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_API_MAP_V9_0_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/lv_api_map_v9_1.h b/software/Power_Pico/Middlewares/LVGL/src/lv_api_map_v9_1.h deleted file mode 100644 index 3264b9a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/lv_api_map_v9_1.h +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @file lv_api_map_v9_1.h - * - */ - -#ifndef LV_API_MAP_V9_1_H -#define LV_API_MAP_V9_1_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "misc/lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * MACROS - **********************/ - -#define _LV_EVENT_LAST LV_EVENT_LAST -#define _lv_obj_t lv_obj_t -#define _lv_obj_class_t lv_obj_class_t -#define _lv_event_t lv_event_t -#define _lv_event_code_t lv_event_code_t -#define _lv_event_mark_deleted lv_event_mark_deleted -#define lv_obj_add_event lv_obj_add_event_cb - -#define _lv_anim_t lv_anim_t - -#define _LV_STYLE_LAST_BUILT_IN_PROP LV_STYLE_LAST_BUILT_IN_PROP -#define _LV_FLEX_REVERSE LV_FLEX_REVERSE -#define _LV_FLEX_WRAP LV_FLEX_WRAP -#define _LV_FLEX_COLUMN LV_FLEX_COLUMN - -#define _lv_area_is_equal lv_area_is_equal -#define _lv_area_is_in lv_area_is_in -#define _lv_area_intersect lv_area_intersect -#define _lv_area_is_point_on lv_area_is_point_on -#define _lv_area_join lv_area_join -#define _lv_image_buf_get_transformed_area lv_image_buf_get_transformed_area - -#define _lv_ll_init lv_ll_init -#define _lv_ll_ins_head lv_ll_ins_head -#define _lv_ll_ins_prev lv_ll_ins_prev -#define _lv_ll_ins_tail lv_ll_ins_tail -#define _lv_ll_get_head lv_ll_get_head -#define _lv_ll_get_tail lv_ll_get_tail -#define _lv_ll_get_next lv_ll_get_next -#define _lv_ll_get_prev lv_ll_get_prev -#define _lv_ll_get_len lv_ll_get_len -#define _lv_ll_move_before lv_ll_move_before -#define _lv_ll_is_empty lv_ll_is_empty -#define _lv_ll_clear lv_ll_clear -#define _lv_ll_remove lv_ll_remove -#define _lv_ll_chg_list lv_ll_chg_list -#define _LV_LL_READ LV_LL_READ -#define _LV_LL_READ_BACK LV_LL_READ_BACK - -#define _lv_obj_scroll_by_raw lv_obj_scroll_by_raw -#define _lv_obj_get_ext_draw_size lv_obj_get_ext_draw_size -#define _lv_indev_scroll_handler lv_indev_scroll_handler - -#define _lv_display_t lv_display_t -#define _lv_display_refr_timer lv_disp_refr_timer -#define _lv_disp_refr_timer lv_disp_refr_timer -#define _lv_disp_get_refr_timer lv_disp_get_refr_timer - -#define _lv_timer_t lv_timer_t - -#define _lv_inv_area lv_inv_area - -/********************** - * DEPRECATED FUNCTIONS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_API_MAP_V9_0_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/lv_conf_internal.h b/software/Power_Pico/Middlewares/LVGL/src/lv_conf_internal.h deleted file mode 100644 index f52ba72..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/lv_conf_internal.h +++ /dev/null @@ -1,3740 +0,0 @@ -/** - * GENERATED FILE, DO NOT EDIT IT! - * @file lv_conf_internal.h - * Make sure all the defines of lv_conf.h have a default value -**/ - -#ifndef LV_CONF_INTERNAL_H -#define LV_CONF_INTERNAL_H -/* clang-format off */ - -/*Config options*/ -#define LV_OS_NONE 0 -#define LV_OS_PTHREAD 1 -#define LV_OS_FREERTOS 2 -#define LV_OS_CMSIS_RTOS2 3 -#define LV_OS_RTTHREAD 4 -#define LV_OS_WINDOWS 5 -#define LV_OS_MQX 6 -#define LV_OS_CUSTOM 255 - -#define LV_STDLIB_BUILTIN 0 -#define LV_STDLIB_CLIB 1 -#define LV_STDLIB_MICROPYTHON 2 -#define LV_STDLIB_RTTHREAD 3 -#define LV_STDLIB_CUSTOM 255 - -#define LV_DRAW_SW_ASM_NONE 0 -#define LV_DRAW_SW_ASM_NEON 1 -#define LV_DRAW_SW_ASM_HELIUM 2 -#define LV_DRAW_SW_ASM_CUSTOM 255 - -/* Handle special Kconfig options */ -#ifndef LV_KCONFIG_IGNORE - #include "lv_conf_kconfig.h" - #ifdef CONFIG_LV_CONF_SKIP - #define LV_CONF_SKIP - #endif -#endif - -/*If "lv_conf.h" is available from here try to use it later.*/ -#ifdef __has_include - #if __has_include("lv_conf.h") - #ifndef LV_CONF_INCLUDE_SIMPLE - #define LV_CONF_INCLUDE_SIMPLE - #endif - #endif -#endif - -/*If lv_conf.h is not skipped include it*/ -#if !defined(LV_CONF_SKIP) || defined(LV_CONF_PATH) - #ifdef LV_CONF_PATH /*If there is a path defined for lv_conf.h use it*/ - #define __LV_TO_STR_AUX(x) #x - #define __LV_TO_STR(x) __LV_TO_STR_AUX(x) - #include __LV_TO_STR(LV_CONF_PATH) - #undef __LV_TO_STR_AUX - #undef __LV_TO_STR - #elif defined(LV_CONF_INCLUDE_SIMPLE) /*Or simply include lv_conf.h is enabled*/ - #include "lv_conf.h" - #else - #include "../lv_conf.h" /*Else assume lv_conf.h is next to the lvgl folder*/ - #endif - #if !defined(LV_CONF_H) && !defined(LV_CONF_SUPPRESS_DEFINE_CHECK) - /* #include will sometimes silently fail when __has_include is used */ - /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80753 */ - #pragma message("Possible failure to include lv_conf.h, please read the comment in this file if you get errors") - #endif -#endif - -#ifdef CONFIG_LV_COLOR_DEPTH - #define LV_KCONFIG_PRESENT -#endif - -/*---------------------------------- - * Start parsing lv_conf_template.h - -----------------------------------*/ - -/*If you need to include anything here, do it inside the `__ASSEMBLY__` guard */ -#if 0 && defined(__ASSEMBLY__) -#include "my_include.h" -#endif - -/*==================== - COLOR SETTINGS - *====================*/ - -/*Color depth: 1 (I1), 8 (L8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ -#ifndef LV_COLOR_DEPTH - #ifdef CONFIG_LV_COLOR_DEPTH - #define LV_COLOR_DEPTH CONFIG_LV_COLOR_DEPTH - #else - #define LV_COLOR_DEPTH 16 - #endif -#endif - -/*========================= - STDLIB WRAPPER SETTINGS - *=========================*/ - -/* Possible values - * - LV_STDLIB_BUILTIN: LVGL's built in implementation - * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc - * - LV_STDLIB_MICROPYTHON: MicroPython implementation - * - LV_STDLIB_RTTHREAD: RT-Thread implementation - * - LV_STDLIB_CUSTOM: Implement the functions externally - */ -#ifndef LV_USE_STDLIB_MALLOC - #ifdef CONFIG_LV_USE_STDLIB_MALLOC - #define LV_USE_STDLIB_MALLOC CONFIG_LV_USE_STDLIB_MALLOC - #else - #define LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN - #endif -#endif -#ifndef LV_USE_STDLIB_STRING - #ifdef CONFIG_LV_USE_STDLIB_STRING - #define LV_USE_STDLIB_STRING CONFIG_LV_USE_STDLIB_STRING - #else - #define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN - #endif -#endif -#ifndef LV_USE_STDLIB_SPRINTF - #ifdef CONFIG_LV_USE_STDLIB_SPRINTF - #define LV_USE_STDLIB_SPRINTF CONFIG_LV_USE_STDLIB_SPRINTF - #else - #define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN - #endif -#endif - -#ifndef LV_STDINT_INCLUDE - #ifdef CONFIG_LV_STDINT_INCLUDE - #define LV_STDINT_INCLUDE CONFIG_LV_STDINT_INCLUDE - #else - #define LV_STDINT_INCLUDE - #endif -#endif -#ifndef LV_STDDEF_INCLUDE - #ifdef CONFIG_LV_STDDEF_INCLUDE - #define LV_STDDEF_INCLUDE CONFIG_LV_STDDEF_INCLUDE - #else - #define LV_STDDEF_INCLUDE - #endif -#endif -#ifndef LV_STDBOOL_INCLUDE - #ifdef CONFIG_LV_STDBOOL_INCLUDE - #define LV_STDBOOL_INCLUDE CONFIG_LV_STDBOOL_INCLUDE - #else - #define LV_STDBOOL_INCLUDE - #endif -#endif -#ifndef LV_INTTYPES_INCLUDE - #ifdef CONFIG_LV_INTTYPES_INCLUDE - #define LV_INTTYPES_INCLUDE CONFIG_LV_INTTYPES_INCLUDE - #else - #define LV_INTTYPES_INCLUDE - #endif -#endif -#ifndef LV_LIMITS_INCLUDE - #ifdef CONFIG_LV_LIMITS_INCLUDE - #define LV_LIMITS_INCLUDE CONFIG_LV_LIMITS_INCLUDE - #else - #define LV_LIMITS_INCLUDE - #endif -#endif -#ifndef LV_STDARG_INCLUDE - #ifdef CONFIG_LV_STDARG_INCLUDE - #define LV_STDARG_INCLUDE CONFIG_LV_STDARG_INCLUDE - #else - #define LV_STDARG_INCLUDE - #endif -#endif - -#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN - /*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/ - #ifndef LV_MEM_SIZE - #ifdef CONFIG_LV_MEM_SIZE - #define LV_MEM_SIZE CONFIG_LV_MEM_SIZE - #else - #define LV_MEM_SIZE (64 * 1024U) /*[bytes]*/ - #endif - #endif - - /*Size of the memory expand for `lv_malloc()` in bytes*/ - #ifndef LV_MEM_POOL_EXPAND_SIZE - #ifdef CONFIG_LV_MEM_POOL_EXPAND_SIZE - #define LV_MEM_POOL_EXPAND_SIZE CONFIG_LV_MEM_POOL_EXPAND_SIZE - #else - #define LV_MEM_POOL_EXPAND_SIZE 0 - #endif - #endif - - /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ - #ifndef LV_MEM_ADR - #ifdef CONFIG_LV_MEM_ADR - #define LV_MEM_ADR CONFIG_LV_MEM_ADR - #else - #define LV_MEM_ADR 0 /*0: unused*/ - #endif - #endif - /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ - #if LV_MEM_ADR == 0 - #ifndef LV_MEM_POOL_INCLUDE - #ifdef CONFIG_LV_MEM_POOL_INCLUDE - #define LV_MEM_POOL_INCLUDE CONFIG_LV_MEM_POOL_INCLUDE - #else - #undef LV_MEM_POOL_INCLUDE - #endif - #endif - #ifndef LV_MEM_POOL_ALLOC - #ifdef CONFIG_LV_MEM_POOL_ALLOC - #define LV_MEM_POOL_ALLOC CONFIG_LV_MEM_POOL_ALLOC - #else - #undef LV_MEM_POOL_ALLOC - #endif - #endif - #endif -#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/ - -/*==================== - HAL SETTINGS - *====================*/ - -/*Default display refresh, input device read and animation step period.*/ -#ifndef LV_DEF_REFR_PERIOD - #ifdef CONFIG_LV_DEF_REFR_PERIOD - #define LV_DEF_REFR_PERIOD CONFIG_LV_DEF_REFR_PERIOD - #else - #define LV_DEF_REFR_PERIOD 33 /*[ms]*/ - #endif -#endif - -/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. - *(Not so important, you can adjust it to modify default sizes and spaces)*/ -#ifndef LV_DPI_DEF - #ifdef CONFIG_LV_DPI_DEF - #define LV_DPI_DEF CONFIG_LV_DPI_DEF - #else - #define LV_DPI_DEF 130 /*[px/inch]*/ - #endif -#endif - -/*================= - * OPERATING SYSTEM - *=================*/ -/*Select an operating system to use. Possible options: - * - LV_OS_NONE - * - LV_OS_PTHREAD - * - LV_OS_FREERTOS - * - LV_OS_CMSIS_RTOS2 - * - LV_OS_RTTHREAD - * - LV_OS_WINDOWS - * - LV_OS_MQX - * - LV_OS_CUSTOM */ -#ifndef LV_USE_OS - #ifdef CONFIG_LV_USE_OS - #define LV_USE_OS CONFIG_LV_USE_OS - #else - #define LV_USE_OS LV_OS_NONE - #endif -#endif - -#if LV_USE_OS == LV_OS_CUSTOM - #ifndef LV_OS_CUSTOM_INCLUDE - #ifdef CONFIG_LV_OS_CUSTOM_INCLUDE - #define LV_OS_CUSTOM_INCLUDE CONFIG_LV_OS_CUSTOM_INCLUDE - #else - #define LV_OS_CUSTOM_INCLUDE - #endif - #endif -#endif -#if LV_USE_OS == LV_OS_FREERTOS - /* - * Unblocking an RTOS task with a direct notification is 45% faster and uses less RAM - * than unblocking a task using an intermediary object such as a binary semaphore. - * RTOS task notifications can only be used when there is only one task that can be the recipient of the event. - */ - #ifndef LV_USE_FREERTOS_TASK_NOTIFY - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_FREERTOS_TASK_NOTIFY - #define LV_USE_FREERTOS_TASK_NOTIFY CONFIG_LV_USE_FREERTOS_TASK_NOTIFY - #else - #define LV_USE_FREERTOS_TASK_NOTIFY 0 - #endif - #else - #define LV_USE_FREERTOS_TASK_NOTIFY 1 - #endif - #endif -#endif - -/*======================== - * RENDERING CONFIGURATION - *========================*/ - -/*Align the stride of all layers and images to this bytes*/ -#ifndef LV_DRAW_BUF_STRIDE_ALIGN - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_DRAW_BUF_STRIDE_ALIGN - #define LV_DRAW_BUF_STRIDE_ALIGN CONFIG_LV_DRAW_BUF_STRIDE_ALIGN - #else - #define LV_DRAW_BUF_STRIDE_ALIGN 0 - #endif - #else - #define LV_DRAW_BUF_STRIDE_ALIGN 1 - #endif -#endif - -/*Align the start address of draw_buf addresses to this bytes*/ -#ifndef LV_DRAW_BUF_ALIGN - #ifdef CONFIG_LV_DRAW_BUF_ALIGN - #define LV_DRAW_BUF_ALIGN CONFIG_LV_DRAW_BUF_ALIGN - #else - #define LV_DRAW_BUF_ALIGN 4 - #endif -#endif - -/*Using matrix for transformations. - *Requirements: - `LV_USE_MATRIX = 1`. - The rendering engine needs to support 3x3 matrix transformations.*/ -#ifndef LV_DRAW_TRANSFORM_USE_MATRIX - #ifdef CONFIG_LV_DRAW_TRANSFORM_USE_MATRIX - #define LV_DRAW_TRANSFORM_USE_MATRIX CONFIG_LV_DRAW_TRANSFORM_USE_MATRIX - #else - #define LV_DRAW_TRANSFORM_USE_MATRIX 0 - #endif -#endif - -/* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode - * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. - * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers - * and can't be drawn in chunks. */ - -/*The target buffer size for simple layer chunks.*/ -#ifndef LV_DRAW_LAYER_SIMPLE_BUF_SIZE - #ifdef CONFIG_LV_DRAW_LAYER_SIMPLE_BUF_SIZE - #define LV_DRAW_LAYER_SIMPLE_BUF_SIZE CONFIG_LV_DRAW_LAYER_SIMPLE_BUF_SIZE - #else - #define LV_DRAW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/ - #endif -#endif - -/* The stack size of the drawing thread. - * NOTE: If FreeType or ThorVG is enabled, it is recommended to set it to 32KB or more. - */ -#ifndef LV_DRAW_THREAD_STACK_SIZE - #ifdef CONFIG_LV_DRAW_THREAD_STACK_SIZE - #define LV_DRAW_THREAD_STACK_SIZE CONFIG_LV_DRAW_THREAD_STACK_SIZE - #else - #define LV_DRAW_THREAD_STACK_SIZE (8 * 1024) /*[bytes]*/ - #endif -#endif - -#ifndef LV_USE_DRAW_SW - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_DRAW_SW - #define LV_USE_DRAW_SW CONFIG_LV_USE_DRAW_SW - #else - #define LV_USE_DRAW_SW 0 - #endif - #else - #define LV_USE_DRAW_SW 1 - #endif -#endif -#if LV_USE_DRAW_SW == 1 - - /* - * Selectively disable color format support in order to reduce code size. - * NOTE: some features use certain color formats internally, e.g. - * - gradients use RGB888 - * - bitmaps with transparency may use ARGB8888 - */ - - #ifndef LV_DRAW_SW_SUPPORT_RGB565 - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_DRAW_SW_SUPPORT_RGB565 - #define LV_DRAW_SW_SUPPORT_RGB565 CONFIG_LV_DRAW_SW_SUPPORT_RGB565 - #else - #define LV_DRAW_SW_SUPPORT_RGB565 0 - #endif - #else - #define LV_DRAW_SW_SUPPORT_RGB565 1 - #endif - #endif - #ifndef LV_DRAW_SW_SUPPORT_RGB565A8 - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_DRAW_SW_SUPPORT_RGB565A8 - #define LV_DRAW_SW_SUPPORT_RGB565A8 CONFIG_LV_DRAW_SW_SUPPORT_RGB565A8 - #else - #define LV_DRAW_SW_SUPPORT_RGB565A8 0 - #endif - #else - #define LV_DRAW_SW_SUPPORT_RGB565A8 1 - #endif - #endif - #ifndef LV_DRAW_SW_SUPPORT_RGB888 - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_DRAW_SW_SUPPORT_RGB888 - #define LV_DRAW_SW_SUPPORT_RGB888 CONFIG_LV_DRAW_SW_SUPPORT_RGB888 - #else - #define LV_DRAW_SW_SUPPORT_RGB888 0 - #endif - #else - #define LV_DRAW_SW_SUPPORT_RGB888 1 - #endif - #endif - #ifndef LV_DRAW_SW_SUPPORT_XRGB8888 - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_DRAW_SW_SUPPORT_XRGB8888 - #define LV_DRAW_SW_SUPPORT_XRGB8888 CONFIG_LV_DRAW_SW_SUPPORT_XRGB8888 - #else - #define LV_DRAW_SW_SUPPORT_XRGB8888 0 - #endif - #else - #define LV_DRAW_SW_SUPPORT_XRGB8888 1 - #endif - #endif - #ifndef LV_DRAW_SW_SUPPORT_ARGB8888 - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_DRAW_SW_SUPPORT_ARGB8888 - #define LV_DRAW_SW_SUPPORT_ARGB8888 CONFIG_LV_DRAW_SW_SUPPORT_ARGB8888 - #else - #define LV_DRAW_SW_SUPPORT_ARGB8888 0 - #endif - #else - #define LV_DRAW_SW_SUPPORT_ARGB8888 1 - #endif - #endif - #ifndef LV_DRAW_SW_SUPPORT_L8 - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_DRAW_SW_SUPPORT_L8 - #define LV_DRAW_SW_SUPPORT_L8 CONFIG_LV_DRAW_SW_SUPPORT_L8 - #else - #define LV_DRAW_SW_SUPPORT_L8 0 - #endif - #else - #define LV_DRAW_SW_SUPPORT_L8 1 - #endif - #endif - #ifndef LV_DRAW_SW_SUPPORT_AL88 - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_DRAW_SW_SUPPORT_AL88 - #define LV_DRAW_SW_SUPPORT_AL88 CONFIG_LV_DRAW_SW_SUPPORT_AL88 - #else - #define LV_DRAW_SW_SUPPORT_AL88 0 - #endif - #else - #define LV_DRAW_SW_SUPPORT_AL88 1 - #endif - #endif - #ifndef LV_DRAW_SW_SUPPORT_A8 - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_DRAW_SW_SUPPORT_A8 - #define LV_DRAW_SW_SUPPORT_A8 CONFIG_LV_DRAW_SW_SUPPORT_A8 - #else - #define LV_DRAW_SW_SUPPORT_A8 0 - #endif - #else - #define LV_DRAW_SW_SUPPORT_A8 1 - #endif - #endif - #ifndef LV_DRAW_SW_SUPPORT_I1 - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_DRAW_SW_SUPPORT_I1 - #define LV_DRAW_SW_SUPPORT_I1 CONFIG_LV_DRAW_SW_SUPPORT_I1 - #else - #define LV_DRAW_SW_SUPPORT_I1 0 - #endif - #else - #define LV_DRAW_SW_SUPPORT_I1 1 - #endif - #endif - - /* Set the number of draw unit. - * > 1 requires an operating system enabled in `LV_USE_OS` - * > 1 means multiple threads will render the screen in parallel */ - #ifndef LV_DRAW_SW_DRAW_UNIT_CNT - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_DRAW_SW_DRAW_UNIT_CNT - #define LV_DRAW_SW_DRAW_UNIT_CNT CONFIG_LV_DRAW_SW_DRAW_UNIT_CNT - #else - #define LV_DRAW_SW_DRAW_UNIT_CNT 0 - #endif - #else - #define LV_DRAW_SW_DRAW_UNIT_CNT 1 - #endif - #endif - - /* Use Arm-2D to accelerate the sw render */ - #ifndef LV_USE_DRAW_ARM2D_SYNC - #ifdef CONFIG_LV_USE_DRAW_ARM2D_SYNC - #define LV_USE_DRAW_ARM2D_SYNC CONFIG_LV_USE_DRAW_ARM2D_SYNC - #else - #define LV_USE_DRAW_ARM2D_SYNC 0 - #endif - #endif - - /* Enable native helium assembly to be compiled */ - #ifndef LV_USE_NATIVE_HELIUM_ASM - #ifdef CONFIG_LV_USE_NATIVE_HELIUM_ASM - #define LV_USE_NATIVE_HELIUM_ASM CONFIG_LV_USE_NATIVE_HELIUM_ASM - #else - #define LV_USE_NATIVE_HELIUM_ASM 0 - #endif - #endif - - /* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only - * 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */ - #ifndef LV_DRAW_SW_COMPLEX - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_DRAW_SW_COMPLEX - #define LV_DRAW_SW_COMPLEX CONFIG_LV_DRAW_SW_COMPLEX - #else - #define LV_DRAW_SW_COMPLEX 0 - #endif - #else - #define LV_DRAW_SW_COMPLEX 1 - #endif - #endif - - #if LV_DRAW_SW_COMPLEX == 1 - /*Allow buffering some shadow calculation. - *LV_DRAW_SW_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` - *Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost*/ - #ifndef LV_DRAW_SW_SHADOW_CACHE_SIZE - #ifdef CONFIG_LV_DRAW_SW_SHADOW_CACHE_SIZE - #define LV_DRAW_SW_SHADOW_CACHE_SIZE CONFIG_LV_DRAW_SW_SHADOW_CACHE_SIZE - #else - #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 - #endif - #endif - - /* Set number of maximally cached circle data. - * The circumference of 1/4 circle are saved for anti-aliasing - * radius * 4 bytes are used per circle (the most often used radiuses are saved) - * 0: to disable caching */ - #ifndef LV_DRAW_SW_CIRCLE_CACHE_SIZE - #ifdef CONFIG_LV_DRAW_SW_CIRCLE_CACHE_SIZE - #define LV_DRAW_SW_CIRCLE_CACHE_SIZE CONFIG_LV_DRAW_SW_CIRCLE_CACHE_SIZE - #else - #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 - #endif - #endif - #endif - - #ifndef LV_USE_DRAW_SW_ASM - #ifdef CONFIG_LV_USE_DRAW_SW_ASM - #define LV_USE_DRAW_SW_ASM CONFIG_LV_USE_DRAW_SW_ASM - #else - #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE - #endif - #endif - - #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM - #ifndef LV_DRAW_SW_ASM_CUSTOM_INCLUDE - #ifdef CONFIG_LV_DRAW_SW_ASM_CUSTOM_INCLUDE - #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE CONFIG_LV_DRAW_SW_ASM_CUSTOM_INCLUDE - #else - #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" - #endif - #endif - #endif - - /* Enable drawing complex gradients in software: linear at an angle, radial or conical */ - #ifndef LV_USE_DRAW_SW_COMPLEX_GRADIENTS - #ifdef CONFIG_LV_USE_DRAW_SW_COMPLEX_GRADIENTS - #define LV_USE_DRAW_SW_COMPLEX_GRADIENTS CONFIG_LV_USE_DRAW_SW_COMPLEX_GRADIENTS - #else - #define LV_USE_DRAW_SW_COMPLEX_GRADIENTS 0 - #endif - #endif -#endif - -/* Use NXP's VG-Lite GPU on iMX RTxxx platforms. */ -#ifndef LV_USE_DRAW_VGLITE - #ifdef CONFIG_LV_USE_DRAW_VGLITE - #define LV_USE_DRAW_VGLITE CONFIG_LV_USE_DRAW_VGLITE - #else - #define LV_USE_DRAW_VGLITE 0 - #endif -#endif - -#if LV_USE_DRAW_VGLITE - /* Enable blit quality degradation workaround recommended for screen's dimension > 352 pixels. */ - #ifndef LV_USE_VGLITE_BLIT_SPLIT - #ifdef CONFIG_LV_USE_VGLITE_BLIT_SPLIT - #define LV_USE_VGLITE_BLIT_SPLIT CONFIG_LV_USE_VGLITE_BLIT_SPLIT - #else - #define LV_USE_VGLITE_BLIT_SPLIT 0 - #endif - #endif - - #if LV_USE_OS - /* Use additional draw thread for VG-Lite processing.*/ - #ifndef LV_USE_VGLITE_DRAW_THREAD - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_VGLITE_DRAW_THREAD - #define LV_USE_VGLITE_DRAW_THREAD CONFIG_LV_USE_VGLITE_DRAW_THREAD - #else - #define LV_USE_VGLITE_DRAW_THREAD 0 - #endif - #else - #define LV_USE_VGLITE_DRAW_THREAD 1 - #endif - #endif - - #if LV_USE_VGLITE_DRAW_THREAD - /* Enable VGLite draw async. Queue multiple tasks and flash them once to the GPU. */ - #ifndef LV_USE_VGLITE_DRAW_ASYNC - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_VGLITE_DRAW_ASYNC - #define LV_USE_VGLITE_DRAW_ASYNC CONFIG_LV_USE_VGLITE_DRAW_ASYNC - #else - #define LV_USE_VGLITE_DRAW_ASYNC 0 - #endif - #else - #define LV_USE_VGLITE_DRAW_ASYNC 1 - #endif - #endif - #endif - #endif - - /* Enable VGLite asserts. */ - #ifndef LV_USE_VGLITE_ASSERT - #ifdef CONFIG_LV_USE_VGLITE_ASSERT - #define LV_USE_VGLITE_ASSERT CONFIG_LV_USE_VGLITE_ASSERT - #else - #define LV_USE_VGLITE_ASSERT 0 - #endif - #endif -#endif - -/* Use NXP's PXP on iMX RTxxx platforms. */ -#ifndef LV_USE_PXP - #ifdef CONFIG_LV_USE_PXP - #define LV_USE_PXP CONFIG_LV_USE_PXP - #else - #define LV_USE_PXP 0 - #endif -#endif - -#if LV_USE_PXP - /* Use PXP for drawing.*/ - #ifndef LV_USE_DRAW_PXP - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_DRAW_PXP - #define LV_USE_DRAW_PXP CONFIG_LV_USE_DRAW_PXP - #else - #define LV_USE_DRAW_PXP 0 - #endif - #else - #define LV_USE_DRAW_PXP 1 - #endif - #endif - - /* Use PXP to rotate display.*/ - #ifndef LV_USE_ROTATE_PXP - #ifdef CONFIG_LV_USE_ROTATE_PXP - #define LV_USE_ROTATE_PXP CONFIG_LV_USE_ROTATE_PXP - #else - #define LV_USE_ROTATE_PXP 0 - #endif - #endif - - #if LV_USE_DRAW_PXP && LV_USE_OS - /* Use additional draw thread for PXP processing.*/ - #ifndef LV_USE_PXP_DRAW_THREAD - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_PXP_DRAW_THREAD - #define LV_USE_PXP_DRAW_THREAD CONFIG_LV_USE_PXP_DRAW_THREAD - #else - #define LV_USE_PXP_DRAW_THREAD 0 - #endif - #else - #define LV_USE_PXP_DRAW_THREAD 1 - #endif - #endif - #endif - - /* Enable PXP asserts. */ - #ifndef LV_USE_PXP_ASSERT - #ifdef CONFIG_LV_USE_PXP_ASSERT - #define LV_USE_PXP_ASSERT CONFIG_LV_USE_PXP_ASSERT - #else - #define LV_USE_PXP_ASSERT 0 - #endif - #endif -#endif - -/* Use Renesas Dave2D on RA platforms. */ -#ifndef LV_USE_DRAW_DAVE2D - #ifdef CONFIG_LV_USE_DRAW_DAVE2D - #define LV_USE_DRAW_DAVE2D CONFIG_LV_USE_DRAW_DAVE2D - #else - #define LV_USE_DRAW_DAVE2D 0 - #endif -#endif - -/* Draw using cached SDL textures*/ -#ifndef LV_USE_DRAW_SDL - #ifdef CONFIG_LV_USE_DRAW_SDL - #define LV_USE_DRAW_SDL CONFIG_LV_USE_DRAW_SDL - #else - #define LV_USE_DRAW_SDL 0 - #endif -#endif - -/* Use VG-Lite GPU. */ -#ifndef LV_USE_DRAW_VG_LITE - #ifdef CONFIG_LV_USE_DRAW_VG_LITE - #define LV_USE_DRAW_VG_LITE CONFIG_LV_USE_DRAW_VG_LITE - #else - #define LV_USE_DRAW_VG_LITE 0 - #endif -#endif - -#if LV_USE_DRAW_VG_LITE - /* Enable VG-Lite custom external 'gpu_init()' function */ - #ifndef LV_VG_LITE_USE_GPU_INIT - #ifdef CONFIG_LV_VG_LITE_USE_GPU_INIT - #define LV_VG_LITE_USE_GPU_INIT CONFIG_LV_VG_LITE_USE_GPU_INIT - #else - #define LV_VG_LITE_USE_GPU_INIT 0 - #endif - #endif - - /* Enable VG-Lite assert. */ - #ifndef LV_VG_LITE_USE_ASSERT - #ifdef CONFIG_LV_VG_LITE_USE_ASSERT - #define LV_VG_LITE_USE_ASSERT CONFIG_LV_VG_LITE_USE_ASSERT - #else - #define LV_VG_LITE_USE_ASSERT 0 - #endif - #endif - - /* VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */ - #ifndef LV_VG_LITE_FLUSH_MAX_COUNT - #ifdef CONFIG_LV_VG_LITE_FLUSH_MAX_COUNT - #define LV_VG_LITE_FLUSH_MAX_COUNT CONFIG_LV_VG_LITE_FLUSH_MAX_COUNT - #else - #define LV_VG_LITE_FLUSH_MAX_COUNT 8 - #endif - #endif - - /* Enable border to simulate shadow - * NOTE: which usually improves performance, - * but does not guarantee the same rendering quality as the software. */ - #ifndef LV_VG_LITE_USE_BOX_SHADOW - #ifdef CONFIG_LV_VG_LITE_USE_BOX_SHADOW - #define LV_VG_LITE_USE_BOX_SHADOW CONFIG_LV_VG_LITE_USE_BOX_SHADOW - #else - #define LV_VG_LITE_USE_BOX_SHADOW 0 - #endif - #endif - - /* VG-Lite gradient maximum cache number. - * NOTE: The memory usage of a single gradient image is 4K bytes. - */ - #ifndef LV_VG_LITE_GRAD_CACHE_CNT - #ifdef CONFIG_LV_VG_LITE_GRAD_CACHE_CNT - #define LV_VG_LITE_GRAD_CACHE_CNT CONFIG_LV_VG_LITE_GRAD_CACHE_CNT - #else - #define LV_VG_LITE_GRAD_CACHE_CNT 32 - #endif - #endif - - /* VG-Lite stroke maximum cache number. - */ - #ifndef LV_VG_LITE_STROKE_CACHE_CNT - #ifdef CONFIG_LV_VG_LITE_STROKE_CACHE_CNT - #define LV_VG_LITE_STROKE_CACHE_CNT CONFIG_LV_VG_LITE_STROKE_CACHE_CNT - #else - #define LV_VG_LITE_STROKE_CACHE_CNT 32 - #endif - #endif - -#endif - -/*======================= - * FEATURE CONFIGURATION - *=======================*/ - -/*------------- - * Logging - *-----------*/ - -/*Enable the log module*/ -#ifndef LV_USE_LOG - #ifdef CONFIG_LV_USE_LOG - #define LV_USE_LOG CONFIG_LV_USE_LOG - #else - #define LV_USE_LOG 0 - #endif -#endif -#if LV_USE_LOG - - /*How important log should be added: - *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information - *LV_LOG_LEVEL_INFO Log important events - *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem - *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail - *LV_LOG_LEVEL_USER Only logs added by the user - *LV_LOG_LEVEL_NONE Do not log anything*/ - #ifndef LV_LOG_LEVEL - #ifdef CONFIG_LV_LOG_LEVEL - #define LV_LOG_LEVEL CONFIG_LV_LOG_LEVEL - #else - #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN - #endif - #endif - - /*1: Print the log with 'printf'; - *0: User need to register a callback with `lv_log_register_print_cb()`*/ - #ifndef LV_LOG_PRINTF - #ifdef CONFIG_LV_LOG_PRINTF - #define LV_LOG_PRINTF CONFIG_LV_LOG_PRINTF - #else - #define LV_LOG_PRINTF 0 - #endif - #endif - - /*Set callback to print the logs. - *E.g `my_print`. The prototype should be `void my_print(lv_log_level_t level, const char * buf)` - *Can be overwritten by `lv_log_register_print_cb`*/ - //#define LV_LOG_PRINT_CB - - /*1: Enable print timestamp; - *0: Disable print timestamp*/ - #ifndef LV_LOG_USE_TIMESTAMP - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_LOG_USE_TIMESTAMP - #define LV_LOG_USE_TIMESTAMP CONFIG_LV_LOG_USE_TIMESTAMP - #else - #define LV_LOG_USE_TIMESTAMP 0 - #endif - #else - #define LV_LOG_USE_TIMESTAMP 1 - #endif - #endif - - /*1: Print file and line number of the log; - *0: Do not print file and line number of the log*/ - #ifndef LV_LOG_USE_FILE_LINE - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_LOG_USE_FILE_LINE - #define LV_LOG_USE_FILE_LINE CONFIG_LV_LOG_USE_FILE_LINE - #else - #define LV_LOG_USE_FILE_LINE 0 - #endif - #else - #define LV_LOG_USE_FILE_LINE 1 - #endif - #endif - - - /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ - #ifndef LV_LOG_TRACE_MEM - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_LOG_TRACE_MEM - #define LV_LOG_TRACE_MEM CONFIG_LV_LOG_TRACE_MEM - #else - #define LV_LOG_TRACE_MEM 0 - #endif - #else - #define LV_LOG_TRACE_MEM 1 - #endif - #endif - #ifndef LV_LOG_TRACE_TIMER - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_LOG_TRACE_TIMER - #define LV_LOG_TRACE_TIMER CONFIG_LV_LOG_TRACE_TIMER - #else - #define LV_LOG_TRACE_TIMER 0 - #endif - #else - #define LV_LOG_TRACE_TIMER 1 - #endif - #endif - #ifndef LV_LOG_TRACE_INDEV - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_LOG_TRACE_INDEV - #define LV_LOG_TRACE_INDEV CONFIG_LV_LOG_TRACE_INDEV - #else - #define LV_LOG_TRACE_INDEV 0 - #endif - #else - #define LV_LOG_TRACE_INDEV 1 - #endif - #endif - #ifndef LV_LOG_TRACE_DISP_REFR - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_LOG_TRACE_DISP_REFR - #define LV_LOG_TRACE_DISP_REFR CONFIG_LV_LOG_TRACE_DISP_REFR - #else - #define LV_LOG_TRACE_DISP_REFR 0 - #endif - #else - #define LV_LOG_TRACE_DISP_REFR 1 - #endif - #endif - #ifndef LV_LOG_TRACE_EVENT - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_LOG_TRACE_EVENT - #define LV_LOG_TRACE_EVENT CONFIG_LV_LOG_TRACE_EVENT - #else - #define LV_LOG_TRACE_EVENT 0 - #endif - #else - #define LV_LOG_TRACE_EVENT 1 - #endif - #endif - #ifndef LV_LOG_TRACE_OBJ_CREATE - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_LOG_TRACE_OBJ_CREATE - #define LV_LOG_TRACE_OBJ_CREATE CONFIG_LV_LOG_TRACE_OBJ_CREATE - #else - #define LV_LOG_TRACE_OBJ_CREATE 0 - #endif - #else - #define LV_LOG_TRACE_OBJ_CREATE 1 - #endif - #endif - #ifndef LV_LOG_TRACE_LAYOUT - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_LOG_TRACE_LAYOUT - #define LV_LOG_TRACE_LAYOUT CONFIG_LV_LOG_TRACE_LAYOUT - #else - #define LV_LOG_TRACE_LAYOUT 0 - #endif - #else - #define LV_LOG_TRACE_LAYOUT 1 - #endif - #endif - #ifndef LV_LOG_TRACE_ANIM - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_LOG_TRACE_ANIM - #define LV_LOG_TRACE_ANIM CONFIG_LV_LOG_TRACE_ANIM - #else - #define LV_LOG_TRACE_ANIM 0 - #endif - #else - #define LV_LOG_TRACE_ANIM 1 - #endif - #endif - #ifndef LV_LOG_TRACE_CACHE - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_LOG_TRACE_CACHE - #define LV_LOG_TRACE_CACHE CONFIG_LV_LOG_TRACE_CACHE - #else - #define LV_LOG_TRACE_CACHE 0 - #endif - #else - #define LV_LOG_TRACE_CACHE 1 - #endif - #endif - -#endif /*LV_USE_LOG*/ - -/*------------- - * Asserts - *-----------*/ - -/*Enable asserts if an operation is failed or an invalid data is found. - *If LV_USE_LOG is enabled an error message will be printed on failure*/ -#ifndef LV_USE_ASSERT_NULL - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_ASSERT_NULL - #define LV_USE_ASSERT_NULL CONFIG_LV_USE_ASSERT_NULL - #else - #define LV_USE_ASSERT_NULL 0 - #endif - #else - #define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ - #endif -#endif -#ifndef LV_USE_ASSERT_MALLOC - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_ASSERT_MALLOC - #define LV_USE_ASSERT_MALLOC CONFIG_LV_USE_ASSERT_MALLOC - #else - #define LV_USE_ASSERT_MALLOC 0 - #endif - #else - #define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ - #endif -#endif -#ifndef LV_USE_ASSERT_STYLE - #ifdef CONFIG_LV_USE_ASSERT_STYLE - #define LV_USE_ASSERT_STYLE CONFIG_LV_USE_ASSERT_STYLE - #else - #define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ - #endif -#endif -#ifndef LV_USE_ASSERT_MEM_INTEGRITY - #ifdef CONFIG_LV_USE_ASSERT_MEM_INTEGRITY - #define LV_USE_ASSERT_MEM_INTEGRITY CONFIG_LV_USE_ASSERT_MEM_INTEGRITY - #else - #define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ - #endif -#endif -#ifndef LV_USE_ASSERT_OBJ - #ifdef CONFIG_LV_USE_ASSERT_OBJ - #define LV_USE_ASSERT_OBJ CONFIG_LV_USE_ASSERT_OBJ - #else - #define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ - #endif -#endif - -/*Add a custom handler when assert happens e.g. to restart the MCU*/ -#ifndef LV_ASSERT_HANDLER_INCLUDE - #ifdef CONFIG_LV_ASSERT_HANDLER_INCLUDE - #define LV_ASSERT_HANDLER_INCLUDE CONFIG_LV_ASSERT_HANDLER_INCLUDE - #else - #define LV_ASSERT_HANDLER_INCLUDE - #endif -#endif -#ifndef LV_ASSERT_HANDLER - #ifdef CONFIG_LV_ASSERT_HANDLER - #define LV_ASSERT_HANDLER CONFIG_LV_ASSERT_HANDLER - #else - #define LV_ASSERT_HANDLER while(1); /*Halt by default*/ - #endif -#endif - -/*------------- - * Debug - *-----------*/ - -/*1: Draw random colored rectangles over the redrawn areas*/ -#ifndef LV_USE_REFR_DEBUG - #ifdef CONFIG_LV_USE_REFR_DEBUG - #define LV_USE_REFR_DEBUG CONFIG_LV_USE_REFR_DEBUG - #else - #define LV_USE_REFR_DEBUG 0 - #endif -#endif - -/*1: Draw a red overlay for ARGB layers and a green overlay for RGB layers*/ -#ifndef LV_USE_LAYER_DEBUG - #ifdef CONFIG_LV_USE_LAYER_DEBUG - #define LV_USE_LAYER_DEBUG CONFIG_LV_USE_LAYER_DEBUG - #else - #define LV_USE_LAYER_DEBUG 0 - #endif -#endif - -/*1: Draw overlays with different colors for each draw_unit's tasks. - *Also add the index number of the draw unit on white background. - *For layers add the index number of the draw unit on black background.*/ -#ifndef LV_USE_PARALLEL_DRAW_DEBUG - #ifdef CONFIG_LV_USE_PARALLEL_DRAW_DEBUG - #define LV_USE_PARALLEL_DRAW_DEBUG CONFIG_LV_USE_PARALLEL_DRAW_DEBUG - #else - #define LV_USE_PARALLEL_DRAW_DEBUG 0 - #endif -#endif - -/*------------- - * Others - *-----------*/ - -#ifndef LV_ENABLE_GLOBAL_CUSTOM - #ifdef CONFIG_LV_ENABLE_GLOBAL_CUSTOM - #define LV_ENABLE_GLOBAL_CUSTOM CONFIG_LV_ENABLE_GLOBAL_CUSTOM - #else - #define LV_ENABLE_GLOBAL_CUSTOM 0 - #endif -#endif -#if LV_ENABLE_GLOBAL_CUSTOM - /*Header to include for the custom 'lv_global' function"*/ - #ifndef LV_GLOBAL_CUSTOM_INCLUDE - #ifdef CONFIG_LV_GLOBAL_CUSTOM_INCLUDE - #define LV_GLOBAL_CUSTOM_INCLUDE CONFIG_LV_GLOBAL_CUSTOM_INCLUDE - #else - #define LV_GLOBAL_CUSTOM_INCLUDE - #endif - #endif -#endif - -/*Default cache size in bytes. - *Used by image decoders such as `lv_lodepng` to keep the decoded image in the memory. - *If size is not set to 0, the decoder will fail to decode when the cache is full. - *If size is 0, the cache function is not enabled and the decoded mem will be released immediately after use.*/ -#ifndef LV_CACHE_DEF_SIZE - #ifdef CONFIG_LV_CACHE_DEF_SIZE - #define LV_CACHE_DEF_SIZE CONFIG_LV_CACHE_DEF_SIZE - #else - #define LV_CACHE_DEF_SIZE 0 - #endif -#endif - -/*Default number of image header cache entries. The cache is used to store the headers of images - *The main logic is like `LV_CACHE_DEF_SIZE` but for image headers.*/ -#ifndef LV_IMAGE_HEADER_CACHE_DEF_CNT - #ifdef CONFIG_LV_IMAGE_HEADER_CACHE_DEF_CNT - #define LV_IMAGE_HEADER_CACHE_DEF_CNT CONFIG_LV_IMAGE_HEADER_CACHE_DEF_CNT - #else - #define LV_IMAGE_HEADER_CACHE_DEF_CNT 0 - #endif -#endif - -/*Number of stops allowed per gradient. Increase this to allow more stops. - *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ -#ifndef LV_GRADIENT_MAX_STOPS - #ifdef CONFIG_LV_GRADIENT_MAX_STOPS - #define LV_GRADIENT_MAX_STOPS CONFIG_LV_GRADIENT_MAX_STOPS - #else - #define LV_GRADIENT_MAX_STOPS 2 - #endif -#endif - -/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. - * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ -#ifndef LV_COLOR_MIX_ROUND_OFS - #ifdef CONFIG_LV_COLOR_MIX_ROUND_OFS - #define LV_COLOR_MIX_ROUND_OFS CONFIG_LV_COLOR_MIX_ROUND_OFS - #else - #define LV_COLOR_MIX_ROUND_OFS 0 - #endif -#endif - -/* Add 2 x 32 bit variables to each lv_obj_t to speed up getting style properties */ -#ifndef LV_OBJ_STYLE_CACHE - #ifdef CONFIG_LV_OBJ_STYLE_CACHE - #define LV_OBJ_STYLE_CACHE CONFIG_LV_OBJ_STYLE_CACHE - #else - #define LV_OBJ_STYLE_CACHE 0 - #endif -#endif - -/* Add `id` field to `lv_obj_t` */ -#ifndef LV_USE_OBJ_ID - #ifdef CONFIG_LV_USE_OBJ_ID - #define LV_USE_OBJ_ID CONFIG_LV_USE_OBJ_ID - #else - #define LV_USE_OBJ_ID 0 - #endif -#endif - -/* Automatically assign an ID when obj is created */ -#ifndef LV_OBJ_ID_AUTO_ASSIGN - #ifdef CONFIG_LV_OBJ_ID_AUTO_ASSIGN - #define LV_OBJ_ID_AUTO_ASSIGN CONFIG_LV_OBJ_ID_AUTO_ASSIGN - #else - #define LV_OBJ_ID_AUTO_ASSIGN LV_USE_OBJ_ID - #endif -#endif - -/*Use the builtin obj ID handler functions: -* - lv_obj_assign_id: Called when a widget is created. Use a separate counter for each widget class as an ID. -* - lv_obj_id_compare: Compare the ID to decide if it matches with a requested value. -* - lv_obj_stringify_id: Return e.g. "button3" -* - lv_obj_free_id: Does nothing, as there is no memory allocation for the ID. -* When disabled these functions needs to be implemented by the user.*/ -#ifndef LV_USE_OBJ_ID_BUILTIN - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_OBJ_ID_BUILTIN - #define LV_USE_OBJ_ID_BUILTIN CONFIG_LV_USE_OBJ_ID_BUILTIN - #else - #define LV_USE_OBJ_ID_BUILTIN 0 - #endif - #else - #define LV_USE_OBJ_ID_BUILTIN 1 - #endif -#endif - -/*Use obj property set/get API*/ -#ifndef LV_USE_OBJ_PROPERTY - #ifdef CONFIG_LV_USE_OBJ_PROPERTY - #define LV_USE_OBJ_PROPERTY CONFIG_LV_USE_OBJ_PROPERTY - #else - #define LV_USE_OBJ_PROPERTY 0 - #endif -#endif - -/*Enable property name support*/ -#ifndef LV_USE_OBJ_PROPERTY_NAME - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_OBJ_PROPERTY_NAME - #define LV_USE_OBJ_PROPERTY_NAME CONFIG_LV_USE_OBJ_PROPERTY_NAME - #else - #define LV_USE_OBJ_PROPERTY_NAME 0 - #endif - #else - #define LV_USE_OBJ_PROPERTY_NAME 1 - #endif -#endif - -/* VG-Lite Simulator */ -/*Requires: LV_USE_THORVG_INTERNAL or LV_USE_THORVG_EXTERNAL */ -#ifndef LV_USE_VG_LITE_THORVG - #ifdef CONFIG_LV_USE_VG_LITE_THORVG - #define LV_USE_VG_LITE_THORVG CONFIG_LV_USE_VG_LITE_THORVG - #else - #define LV_USE_VG_LITE_THORVG 0 - #endif -#endif - -#if LV_USE_VG_LITE_THORVG - - /*Enable LVGL's blend mode support*/ - #ifndef LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT - #ifdef CONFIG_LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT - #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT CONFIG_LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT - #else - #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT 0 - #endif - #endif - - /*Enable YUV color format support*/ - #ifndef LV_VG_LITE_THORVG_YUV_SUPPORT - #ifdef CONFIG_LV_VG_LITE_THORVG_YUV_SUPPORT - #define LV_VG_LITE_THORVG_YUV_SUPPORT CONFIG_LV_VG_LITE_THORVG_YUV_SUPPORT - #else - #define LV_VG_LITE_THORVG_YUV_SUPPORT 0 - #endif - #endif - - /*Enable Linear gradient extension support*/ - #ifndef LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT - #ifdef CONFIG_LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT - #define LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT CONFIG_LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT - #else - #define LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT 0 - #endif - #endif - - /*Enable 16 pixels alignment*/ - #ifndef LV_VG_LITE_THORVG_16PIXELS_ALIGN - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_VG_LITE_THORVG_16PIXELS_ALIGN - #define LV_VG_LITE_THORVG_16PIXELS_ALIGN CONFIG_LV_VG_LITE_THORVG_16PIXELS_ALIGN - #else - #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 0 - #endif - #else - #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 - #endif - #endif - - /*Buffer address alignment*/ - #ifndef LV_VG_LITE_THORVG_BUF_ADDR_ALIGN - #ifdef CONFIG_LV_VG_LITE_THORVG_BUF_ADDR_ALIGN - #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN CONFIG_LV_VG_LITE_THORVG_BUF_ADDR_ALIGN - #else - #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64 - #endif - #endif - - /*Enable multi-thread render*/ - #ifndef LV_VG_LITE_THORVG_THREAD_RENDER - #ifdef CONFIG_LV_VG_LITE_THORVG_THREAD_RENDER - #define LV_VG_LITE_THORVG_THREAD_RENDER CONFIG_LV_VG_LITE_THORVG_THREAD_RENDER - #else - #define LV_VG_LITE_THORVG_THREAD_RENDER 0 - #endif - #endif - -#endif - -/*===================== - * COMPILER SETTINGS - *====================*/ - -/*For big endian systems set to 1*/ -#ifndef LV_BIG_ENDIAN_SYSTEM - #ifdef CONFIG_LV_BIG_ENDIAN_SYSTEM - #define LV_BIG_ENDIAN_SYSTEM CONFIG_LV_BIG_ENDIAN_SYSTEM - #else - #define LV_BIG_ENDIAN_SYSTEM 0 - #endif -#endif - -/*Define a custom attribute to `lv_tick_inc` function*/ -#ifndef LV_ATTRIBUTE_TICK_INC - #ifdef CONFIG_LV_ATTRIBUTE_TICK_INC - #define LV_ATTRIBUTE_TICK_INC CONFIG_LV_ATTRIBUTE_TICK_INC - #else - #define LV_ATTRIBUTE_TICK_INC - #endif -#endif - -/*Define a custom attribute to `lv_timer_handler` function*/ -#ifndef LV_ATTRIBUTE_TIMER_HANDLER - #ifdef CONFIG_LV_ATTRIBUTE_TIMER_HANDLER - #define LV_ATTRIBUTE_TIMER_HANDLER CONFIG_LV_ATTRIBUTE_TIMER_HANDLER - #else - #define LV_ATTRIBUTE_TIMER_HANDLER - #endif -#endif - -/*Define a custom attribute to `lv_display_flush_ready` function*/ -#ifndef LV_ATTRIBUTE_FLUSH_READY - #ifdef CONFIG_LV_ATTRIBUTE_FLUSH_READY - #define LV_ATTRIBUTE_FLUSH_READY CONFIG_LV_ATTRIBUTE_FLUSH_READY - #else - #define LV_ATTRIBUTE_FLUSH_READY - #endif -#endif - -/*Required alignment size for buffers*/ -#ifndef LV_ATTRIBUTE_MEM_ALIGN_SIZE - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE - #define LV_ATTRIBUTE_MEM_ALIGN_SIZE CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE - #else - #define LV_ATTRIBUTE_MEM_ALIGN_SIZE 0 - #endif - #else - #define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 - #endif -#endif - -/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). - * E.g. __attribute__((aligned(4)))*/ -#ifndef LV_ATTRIBUTE_MEM_ALIGN - #ifdef CONFIG_LV_ATTRIBUTE_MEM_ALIGN - #define LV_ATTRIBUTE_MEM_ALIGN CONFIG_LV_ATTRIBUTE_MEM_ALIGN - #else - #define LV_ATTRIBUTE_MEM_ALIGN - #endif -#endif - -/*Attribute to mark large constant arrays for example font's bitmaps*/ -#ifndef LV_ATTRIBUTE_LARGE_CONST - #ifdef CONFIG_LV_ATTRIBUTE_LARGE_CONST - #define LV_ATTRIBUTE_LARGE_CONST CONFIG_LV_ATTRIBUTE_LARGE_CONST - #else - #define LV_ATTRIBUTE_LARGE_CONST - #endif -#endif - -/*Compiler prefix for a big array declaration in RAM*/ -#ifndef LV_ATTRIBUTE_LARGE_RAM_ARRAY - #ifdef CONFIG_LV_ATTRIBUTE_LARGE_RAM_ARRAY - #define LV_ATTRIBUTE_LARGE_RAM_ARRAY CONFIG_LV_ATTRIBUTE_LARGE_RAM_ARRAY - #else - #define LV_ATTRIBUTE_LARGE_RAM_ARRAY - #endif -#endif - -/*Place performance critical functions into a faster memory (e.g RAM)*/ -#ifndef LV_ATTRIBUTE_FAST_MEM - #ifdef CONFIG_LV_ATTRIBUTE_FAST_MEM - #define LV_ATTRIBUTE_FAST_MEM CONFIG_LV_ATTRIBUTE_FAST_MEM - #else - #define LV_ATTRIBUTE_FAST_MEM - #endif -#endif - -/*Export integer constant to binding. This macro is used with constants in the form of LV_ that - *should also appear on LVGL binding API such as MicroPython.*/ -#ifndef LV_EXPORT_CONST_INT - #ifdef CONFIG_LV_EXPORT_CONST_INT - #define LV_EXPORT_CONST_INT CONFIG_LV_EXPORT_CONST_INT - #else - #define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ - #endif -#endif - -/*Prefix all global extern data with this*/ -#ifndef LV_ATTRIBUTE_EXTERN_DATA - #ifdef CONFIG_LV_ATTRIBUTE_EXTERN_DATA - #define LV_ATTRIBUTE_EXTERN_DATA CONFIG_LV_ATTRIBUTE_EXTERN_DATA - #else - #define LV_ATTRIBUTE_EXTERN_DATA - #endif -#endif - -/* Use `float` as `lv_value_precise_t` */ -#ifndef LV_USE_FLOAT - #ifdef CONFIG_LV_USE_FLOAT - #define LV_USE_FLOAT CONFIG_LV_USE_FLOAT - #else - #define LV_USE_FLOAT 0 - #endif -#endif - -/*Enable matrix support - *Requires `LV_USE_FLOAT = 1`*/ -#ifndef LV_USE_MATRIX - #ifdef CONFIG_LV_USE_MATRIX - #define LV_USE_MATRIX CONFIG_LV_USE_MATRIX - #else - #define LV_USE_MATRIX 0 - #endif -#endif - -/*Include `lvgl_private.h` in `lvgl.h` to access internal data and functions by default*/ -#ifndef LV_USE_PRIVATE_API - #ifdef CONFIG_LV_USE_PRIVATE_API - #define LV_USE_PRIVATE_API CONFIG_LV_USE_PRIVATE_API - #else - #define LV_USE_PRIVATE_API 0 - #endif -#endif - -/*================== - * FONT USAGE - *===================*/ - -/*Montserrat fonts with ASCII range and some symbols using bpp = 4 - *https://fonts.google.com/specimen/Montserrat*/ -#ifndef LV_FONT_MONTSERRAT_8 - #ifdef CONFIG_LV_FONT_MONTSERRAT_8 - #define LV_FONT_MONTSERRAT_8 CONFIG_LV_FONT_MONTSERRAT_8 - #else - #define LV_FONT_MONTSERRAT_8 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_10 - #ifdef CONFIG_LV_FONT_MONTSERRAT_10 - #define LV_FONT_MONTSERRAT_10 CONFIG_LV_FONT_MONTSERRAT_10 - #else - #define LV_FONT_MONTSERRAT_10 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_12 - #ifdef CONFIG_LV_FONT_MONTSERRAT_12 - #define LV_FONT_MONTSERRAT_12 CONFIG_LV_FONT_MONTSERRAT_12 - #else - #define LV_FONT_MONTSERRAT_12 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_14 - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_FONT_MONTSERRAT_14 - #define LV_FONT_MONTSERRAT_14 CONFIG_LV_FONT_MONTSERRAT_14 - #else - #define LV_FONT_MONTSERRAT_14 0 - #endif - #else - #define LV_FONT_MONTSERRAT_14 1 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_16 - #ifdef CONFIG_LV_FONT_MONTSERRAT_16 - #define LV_FONT_MONTSERRAT_16 CONFIG_LV_FONT_MONTSERRAT_16 - #else - #define LV_FONT_MONTSERRAT_16 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_18 - #ifdef CONFIG_LV_FONT_MONTSERRAT_18 - #define LV_FONT_MONTSERRAT_18 CONFIG_LV_FONT_MONTSERRAT_18 - #else - #define LV_FONT_MONTSERRAT_18 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_20 - #ifdef CONFIG_LV_FONT_MONTSERRAT_20 - #define LV_FONT_MONTSERRAT_20 CONFIG_LV_FONT_MONTSERRAT_20 - #else - #define LV_FONT_MONTSERRAT_20 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_22 - #ifdef CONFIG_LV_FONT_MONTSERRAT_22 - #define LV_FONT_MONTSERRAT_22 CONFIG_LV_FONT_MONTSERRAT_22 - #else - #define LV_FONT_MONTSERRAT_22 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_24 - #ifdef CONFIG_LV_FONT_MONTSERRAT_24 - #define LV_FONT_MONTSERRAT_24 CONFIG_LV_FONT_MONTSERRAT_24 - #else - #define LV_FONT_MONTSERRAT_24 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_26 - #ifdef CONFIG_LV_FONT_MONTSERRAT_26 - #define LV_FONT_MONTSERRAT_26 CONFIG_LV_FONT_MONTSERRAT_26 - #else - #define LV_FONT_MONTSERRAT_26 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_28 - #ifdef CONFIG_LV_FONT_MONTSERRAT_28 - #define LV_FONT_MONTSERRAT_28 CONFIG_LV_FONT_MONTSERRAT_28 - #else - #define LV_FONT_MONTSERRAT_28 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_30 - #ifdef CONFIG_LV_FONT_MONTSERRAT_30 - #define LV_FONT_MONTSERRAT_30 CONFIG_LV_FONT_MONTSERRAT_30 - #else - #define LV_FONT_MONTSERRAT_30 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_32 - #ifdef CONFIG_LV_FONT_MONTSERRAT_32 - #define LV_FONT_MONTSERRAT_32 CONFIG_LV_FONT_MONTSERRAT_32 - #else - #define LV_FONT_MONTSERRAT_32 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_34 - #ifdef CONFIG_LV_FONT_MONTSERRAT_34 - #define LV_FONT_MONTSERRAT_34 CONFIG_LV_FONT_MONTSERRAT_34 - #else - #define LV_FONT_MONTSERRAT_34 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_36 - #ifdef CONFIG_LV_FONT_MONTSERRAT_36 - #define LV_FONT_MONTSERRAT_36 CONFIG_LV_FONT_MONTSERRAT_36 - #else - #define LV_FONT_MONTSERRAT_36 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_38 - #ifdef CONFIG_LV_FONT_MONTSERRAT_38 - #define LV_FONT_MONTSERRAT_38 CONFIG_LV_FONT_MONTSERRAT_38 - #else - #define LV_FONT_MONTSERRAT_38 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_40 - #ifdef CONFIG_LV_FONT_MONTSERRAT_40 - #define LV_FONT_MONTSERRAT_40 CONFIG_LV_FONT_MONTSERRAT_40 - #else - #define LV_FONT_MONTSERRAT_40 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_42 - #ifdef CONFIG_LV_FONT_MONTSERRAT_42 - #define LV_FONT_MONTSERRAT_42 CONFIG_LV_FONT_MONTSERRAT_42 - #else - #define LV_FONT_MONTSERRAT_42 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_44 - #ifdef CONFIG_LV_FONT_MONTSERRAT_44 - #define LV_FONT_MONTSERRAT_44 CONFIG_LV_FONT_MONTSERRAT_44 - #else - #define LV_FONT_MONTSERRAT_44 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_46 - #ifdef CONFIG_LV_FONT_MONTSERRAT_46 - #define LV_FONT_MONTSERRAT_46 CONFIG_LV_FONT_MONTSERRAT_46 - #else - #define LV_FONT_MONTSERRAT_46 0 - #endif -#endif -#ifndef LV_FONT_MONTSERRAT_48 - #ifdef CONFIG_LV_FONT_MONTSERRAT_48 - #define LV_FONT_MONTSERRAT_48 CONFIG_LV_FONT_MONTSERRAT_48 - #else - #define LV_FONT_MONTSERRAT_48 0 - #endif -#endif - -/*Demonstrate special features*/ -#ifndef LV_FONT_MONTSERRAT_28_COMPRESSED - #ifdef CONFIG_LV_FONT_MONTSERRAT_28_COMPRESSED - #define LV_FONT_MONTSERRAT_28_COMPRESSED CONFIG_LV_FONT_MONTSERRAT_28_COMPRESSED - #else - #define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ - #endif -#endif -#ifndef LV_FONT_DEJAVU_16_PERSIAN_HEBREW - #ifdef CONFIG_LV_FONT_DEJAVU_16_PERSIAN_HEBREW - #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW CONFIG_LV_FONT_DEJAVU_16_PERSIAN_HEBREW - #else - #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ - #endif -#endif -#ifndef LV_FONT_SIMSUN_14_CJK - #ifdef CONFIG_LV_FONT_SIMSUN_14_CJK - #define LV_FONT_SIMSUN_14_CJK CONFIG_LV_FONT_SIMSUN_14_CJK - #else - #define LV_FONT_SIMSUN_14_CJK 0 /*1000 most common CJK radicals*/ - #endif -#endif -#ifndef LV_FONT_SIMSUN_16_CJK - #ifdef CONFIG_LV_FONT_SIMSUN_16_CJK - #define LV_FONT_SIMSUN_16_CJK CONFIG_LV_FONT_SIMSUN_16_CJK - #else - #define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ - #endif -#endif - -/*Pixel perfect monospace fonts*/ -#ifndef LV_FONT_UNSCII_8 - #ifdef CONFIG_LV_FONT_UNSCII_8 - #define LV_FONT_UNSCII_8 CONFIG_LV_FONT_UNSCII_8 - #else - #define LV_FONT_UNSCII_8 0 - #endif -#endif -#ifndef LV_FONT_UNSCII_16 - #ifdef CONFIG_LV_FONT_UNSCII_16 - #define LV_FONT_UNSCII_16 CONFIG_LV_FONT_UNSCII_16 - #else - #define LV_FONT_UNSCII_16 0 - #endif -#endif - -/*Optionally declare custom fonts here. - *You can use these fonts as default font too and they will be available globally. - *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ -#ifndef LV_FONT_CUSTOM_DECLARE - #ifdef CONFIG_LV_FONT_CUSTOM_DECLARE - #define LV_FONT_CUSTOM_DECLARE CONFIG_LV_FONT_CUSTOM_DECLARE - #else - #define LV_FONT_CUSTOM_DECLARE - #endif -#endif - -/*Always set a default font*/ -#ifndef LV_FONT_DEFAULT - #ifdef CONFIG_LV_FONT_DEFAULT - #define LV_FONT_DEFAULT CONFIG_LV_FONT_DEFAULT - #else - #define LV_FONT_DEFAULT &lv_font_montserrat_14 - #endif -#endif - -/*Enable handling large font and/or fonts with a lot of characters. - *The limit depends on the font size, font face and bpp. - *Compiler error will be triggered if a font needs it.*/ -#ifndef LV_FONT_FMT_TXT_LARGE - #ifdef CONFIG_LV_FONT_FMT_TXT_LARGE - #define LV_FONT_FMT_TXT_LARGE CONFIG_LV_FONT_FMT_TXT_LARGE - #else - #define LV_FONT_FMT_TXT_LARGE 0 - #endif -#endif - -/*Enables/disables support for compressed fonts.*/ -#ifndef LV_USE_FONT_COMPRESSED - #ifdef CONFIG_LV_USE_FONT_COMPRESSED - #define LV_USE_FONT_COMPRESSED CONFIG_LV_USE_FONT_COMPRESSED - #else - #define LV_USE_FONT_COMPRESSED 0 - #endif -#endif - -/*Enable drawing placeholders when glyph dsc is not found*/ -#ifndef LV_USE_FONT_PLACEHOLDER - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_FONT_PLACEHOLDER - #define LV_USE_FONT_PLACEHOLDER CONFIG_LV_USE_FONT_PLACEHOLDER - #else - #define LV_USE_FONT_PLACEHOLDER 0 - #endif - #else - #define LV_USE_FONT_PLACEHOLDER 1 - #endif -#endif - -/*================= - * TEXT SETTINGS - *=================*/ - -/** - * Select a character encoding for strings. - * Your IDE or editor should have the same character encoding - * - LV_TXT_ENC_UTF8 - * - LV_TXT_ENC_ASCII - */ -#ifndef LV_TXT_ENC - #ifdef CONFIG_LV_TXT_ENC - #define LV_TXT_ENC CONFIG_LV_TXT_ENC - #else - #define LV_TXT_ENC LV_TXT_ENC_UTF8 - #endif -#endif - -/*Can break (wrap) texts on these chars*/ -#ifndef LV_TXT_BREAK_CHARS - #ifdef CONFIG_LV_TXT_BREAK_CHARS - #define LV_TXT_BREAK_CHARS CONFIG_LV_TXT_BREAK_CHARS - #else - #define LV_TXT_BREAK_CHARS " ,.;:-_)]}" - #endif -#endif - -/*If a word is at least this long, will break wherever "prettiest" - *To disable, set to a value <= 0*/ -#ifndef LV_TXT_LINE_BREAK_LONG_LEN - #ifdef CONFIG_LV_TXT_LINE_BREAK_LONG_LEN - #define LV_TXT_LINE_BREAK_LONG_LEN CONFIG_LV_TXT_LINE_BREAK_LONG_LEN - #else - #define LV_TXT_LINE_BREAK_LONG_LEN 0 - #endif -#endif - -/*Minimum number of characters in a long word to put on a line before a break. - *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ -#ifndef LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN - #ifdef CONFIG_LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN - #define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN CONFIG_LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN - #else - #define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 - #endif -#endif - -/*Minimum number of characters in a long word to put on a line after a break. - *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ -#ifndef LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN - #ifdef CONFIG_LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN - #define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN CONFIG_LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN - #else - #define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 - #endif -#endif - -/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. - *The direction will be processed according to the Unicode Bidirectional Algorithm: - *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ -#ifndef LV_USE_BIDI - #ifdef CONFIG_LV_USE_BIDI - #define LV_USE_BIDI CONFIG_LV_USE_BIDI - #else - #define LV_USE_BIDI 0 - #endif -#endif -#if LV_USE_BIDI - /*Set the default direction. Supported values: - *`LV_BASE_DIR_LTR` Left-to-Right - *`LV_BASE_DIR_RTL` Right-to-Left - *`LV_BASE_DIR_AUTO` detect texts base direction*/ - #ifndef LV_BIDI_BASE_DIR_DEF - #ifdef CONFIG_LV_BIDI_BASE_DIR_DEF - #define LV_BIDI_BASE_DIR_DEF CONFIG_LV_BIDI_BASE_DIR_DEF - #else - #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO - #endif - #endif -#endif - -/*Enable Arabic/Persian processing - *In these languages characters should be replaced with another form based on their position in the text*/ -#ifndef LV_USE_ARABIC_PERSIAN_CHARS - #ifdef CONFIG_LV_USE_ARABIC_PERSIAN_CHARS - #define LV_USE_ARABIC_PERSIAN_CHARS CONFIG_LV_USE_ARABIC_PERSIAN_CHARS - #else - #define LV_USE_ARABIC_PERSIAN_CHARS 0 - #endif -#endif - -/*================== - * WIDGETS - *================*/ - -/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ - -#ifndef LV_WIDGETS_HAS_DEFAULT_VALUE - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_WIDGETS_HAS_DEFAULT_VALUE - #define LV_WIDGETS_HAS_DEFAULT_VALUE CONFIG_LV_WIDGETS_HAS_DEFAULT_VALUE - #else - #define LV_WIDGETS_HAS_DEFAULT_VALUE 0 - #endif - #else - #define LV_WIDGETS_HAS_DEFAULT_VALUE 1 - #endif -#endif - -#ifndef LV_USE_ANIMIMG - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_ANIMIMG - #define LV_USE_ANIMIMG CONFIG_LV_USE_ANIMIMG - #else - #define LV_USE_ANIMIMG 0 - #endif - #else - #define LV_USE_ANIMIMG 1 - #endif -#endif - -#ifndef LV_USE_ARC - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_ARC - #define LV_USE_ARC CONFIG_LV_USE_ARC - #else - #define LV_USE_ARC 0 - #endif - #else - #define LV_USE_ARC 1 - #endif -#endif - -#ifndef LV_USE_BAR - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_BAR - #define LV_USE_BAR CONFIG_LV_USE_BAR - #else - #define LV_USE_BAR 0 - #endif - #else - #define LV_USE_BAR 1 - #endif -#endif - -#ifndef LV_USE_BUTTON - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_BUTTON - #define LV_USE_BUTTON CONFIG_LV_USE_BUTTON - #else - #define LV_USE_BUTTON 0 - #endif - #else - #define LV_USE_BUTTON 1 - #endif -#endif - -#ifndef LV_USE_BUTTONMATRIX - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_BUTTONMATRIX - #define LV_USE_BUTTONMATRIX CONFIG_LV_USE_BUTTONMATRIX - #else - #define LV_USE_BUTTONMATRIX 0 - #endif - #else - #define LV_USE_BUTTONMATRIX 1 - #endif -#endif - -#ifndef LV_USE_CALENDAR - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_CALENDAR - #define LV_USE_CALENDAR CONFIG_LV_USE_CALENDAR - #else - #define LV_USE_CALENDAR 0 - #endif - #else - #define LV_USE_CALENDAR 1 - #endif -#endif -#if LV_USE_CALENDAR - #ifndef LV_CALENDAR_WEEK_STARTS_MONDAY - #ifdef CONFIG_LV_CALENDAR_WEEK_STARTS_MONDAY - #define LV_CALENDAR_WEEK_STARTS_MONDAY CONFIG_LV_CALENDAR_WEEK_STARTS_MONDAY - #else - #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 - #endif - #endif - #if LV_CALENDAR_WEEK_STARTS_MONDAY - #ifndef LV_CALENDAR_DEFAULT_DAY_NAMES - #ifdef CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES - #define LV_CALENDAR_DEFAULT_DAY_NAMES CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES - #else - #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} - #endif - #endif - #else - #ifndef LV_CALENDAR_DEFAULT_DAY_NAMES - #ifdef CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES - #define LV_CALENDAR_DEFAULT_DAY_NAMES CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES - #else - #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} - #endif - #endif - #endif - - #ifndef LV_CALENDAR_DEFAULT_MONTH_NAMES - #ifdef CONFIG_LV_CALENDAR_DEFAULT_MONTH_NAMES - #define LV_CALENDAR_DEFAULT_MONTH_NAMES CONFIG_LV_CALENDAR_DEFAULT_MONTH_NAMES - #else - #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} - #endif - #endif - #ifndef LV_USE_CALENDAR_HEADER_ARROW - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_CALENDAR_HEADER_ARROW - #define LV_USE_CALENDAR_HEADER_ARROW CONFIG_LV_USE_CALENDAR_HEADER_ARROW - #else - #define LV_USE_CALENDAR_HEADER_ARROW 0 - #endif - #else - #define LV_USE_CALENDAR_HEADER_ARROW 1 - #endif - #endif - #ifndef LV_USE_CALENDAR_HEADER_DROPDOWN - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_CALENDAR_HEADER_DROPDOWN - #define LV_USE_CALENDAR_HEADER_DROPDOWN CONFIG_LV_USE_CALENDAR_HEADER_DROPDOWN - #else - #define LV_USE_CALENDAR_HEADER_DROPDOWN 0 - #endif - #else - #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 - #endif - #endif - #ifndef LV_USE_CALENDAR_CHINESE - #ifdef CONFIG_LV_USE_CALENDAR_CHINESE - #define LV_USE_CALENDAR_CHINESE CONFIG_LV_USE_CALENDAR_CHINESE - #else - #define LV_USE_CALENDAR_CHINESE 0 - #endif - #endif -#endif /*LV_USE_CALENDAR*/ - -#ifndef LV_USE_CANVAS - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_CANVAS - #define LV_USE_CANVAS CONFIG_LV_USE_CANVAS - #else - #define LV_USE_CANVAS 0 - #endif - #else - #define LV_USE_CANVAS 1 - #endif -#endif - -#ifndef LV_USE_CHART - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_CHART - #define LV_USE_CHART CONFIG_LV_USE_CHART - #else - #define LV_USE_CHART 0 - #endif - #else - #define LV_USE_CHART 1 - #endif -#endif - -#ifndef LV_USE_CHECKBOX - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_CHECKBOX - #define LV_USE_CHECKBOX CONFIG_LV_USE_CHECKBOX - #else - #define LV_USE_CHECKBOX 0 - #endif - #else - #define LV_USE_CHECKBOX 1 - #endif -#endif - -#ifndef LV_USE_DROPDOWN - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_DROPDOWN - #define LV_USE_DROPDOWN CONFIG_LV_USE_DROPDOWN - #else - #define LV_USE_DROPDOWN 0 - #endif - #else - #define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ - #endif -#endif - -#ifndef LV_USE_IMAGE - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_IMAGE - #define LV_USE_IMAGE CONFIG_LV_USE_IMAGE - #else - #define LV_USE_IMAGE 0 - #endif - #else - #define LV_USE_IMAGE 1 /*Requires: lv_label*/ - #endif -#endif - -#ifndef LV_USE_IMAGEBUTTON - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_IMAGEBUTTON - #define LV_USE_IMAGEBUTTON CONFIG_LV_USE_IMAGEBUTTON - #else - #define LV_USE_IMAGEBUTTON 0 - #endif - #else - #define LV_USE_IMAGEBUTTON 1 - #endif -#endif - -#ifndef LV_USE_KEYBOARD - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_KEYBOARD - #define LV_USE_KEYBOARD CONFIG_LV_USE_KEYBOARD - #else - #define LV_USE_KEYBOARD 0 - #endif - #else - #define LV_USE_KEYBOARD 1 - #endif -#endif - -#ifndef LV_USE_LABEL - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_LABEL - #define LV_USE_LABEL CONFIG_LV_USE_LABEL - #else - #define LV_USE_LABEL 0 - #endif - #else - #define LV_USE_LABEL 1 - #endif -#endif -#if LV_USE_LABEL - #ifndef LV_LABEL_TEXT_SELECTION - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_LABEL_TEXT_SELECTION - #define LV_LABEL_TEXT_SELECTION CONFIG_LV_LABEL_TEXT_SELECTION - #else - #define LV_LABEL_TEXT_SELECTION 0 - #endif - #else - #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ - #endif - #endif - #ifndef LV_LABEL_LONG_TXT_HINT - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_LABEL_LONG_TXT_HINT - #define LV_LABEL_LONG_TXT_HINT CONFIG_LV_LABEL_LONG_TXT_HINT - #else - #define LV_LABEL_LONG_TXT_HINT 0 - #endif - #else - #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ - #endif - #endif - #ifndef LV_LABEL_WAIT_CHAR_COUNT - #ifdef CONFIG_LV_LABEL_WAIT_CHAR_COUNT - #define LV_LABEL_WAIT_CHAR_COUNT CONFIG_LV_LABEL_WAIT_CHAR_COUNT - #else - #define LV_LABEL_WAIT_CHAR_COUNT 3 /*The count of wait chart*/ - #endif - #endif -#endif - -#ifndef LV_USE_LED - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_LED - #define LV_USE_LED CONFIG_LV_USE_LED - #else - #define LV_USE_LED 0 - #endif - #else - #define LV_USE_LED 1 - #endif -#endif - -#ifndef LV_USE_LINE - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_LINE - #define LV_USE_LINE CONFIG_LV_USE_LINE - #else - #define LV_USE_LINE 0 - #endif - #else - #define LV_USE_LINE 1 - #endif -#endif - -#ifndef LV_USE_LIST - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_LIST - #define LV_USE_LIST CONFIG_LV_USE_LIST - #else - #define LV_USE_LIST 0 - #endif - #else - #define LV_USE_LIST 1 - #endif -#endif - -#ifndef LV_USE_LOTTIE - #ifdef CONFIG_LV_USE_LOTTIE - #define LV_USE_LOTTIE CONFIG_LV_USE_LOTTIE - #else - #define LV_USE_LOTTIE 0 /*Requires: lv_canvas, thorvg */ - #endif -#endif - -#ifndef LV_USE_MENU - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_MENU - #define LV_USE_MENU CONFIG_LV_USE_MENU - #else - #define LV_USE_MENU 0 - #endif - #else - #define LV_USE_MENU 1 - #endif -#endif - -#ifndef LV_USE_MSGBOX - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_MSGBOX - #define LV_USE_MSGBOX CONFIG_LV_USE_MSGBOX - #else - #define LV_USE_MSGBOX 0 - #endif - #else - #define LV_USE_MSGBOX 1 - #endif -#endif - -#ifndef LV_USE_ROLLER - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_ROLLER - #define LV_USE_ROLLER CONFIG_LV_USE_ROLLER - #else - #define LV_USE_ROLLER 0 - #endif - #else - #define LV_USE_ROLLER 1 /*Requires: lv_label*/ - #endif -#endif - -#ifndef LV_USE_SCALE - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_SCALE - #define LV_USE_SCALE CONFIG_LV_USE_SCALE - #else - #define LV_USE_SCALE 0 - #endif - #else - #define LV_USE_SCALE 1 - #endif -#endif - -#ifndef LV_USE_SLIDER - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_SLIDER - #define LV_USE_SLIDER CONFIG_LV_USE_SLIDER - #else - #define LV_USE_SLIDER 0 - #endif - #else - #define LV_USE_SLIDER 1 /*Requires: lv_bar*/ - #endif -#endif - -#ifndef LV_USE_SPAN - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_SPAN - #define LV_USE_SPAN CONFIG_LV_USE_SPAN - #else - #define LV_USE_SPAN 0 - #endif - #else - #define LV_USE_SPAN 1 - #endif -#endif -#if LV_USE_SPAN - /*A line text can contain maximum num of span descriptor */ - #ifndef LV_SPAN_SNIPPET_STACK_SIZE - #ifdef CONFIG_LV_SPAN_SNIPPET_STACK_SIZE - #define LV_SPAN_SNIPPET_STACK_SIZE CONFIG_LV_SPAN_SNIPPET_STACK_SIZE - #else - #define LV_SPAN_SNIPPET_STACK_SIZE 64 - #endif - #endif -#endif - -#ifndef LV_USE_SPINBOX - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_SPINBOX - #define LV_USE_SPINBOX CONFIG_LV_USE_SPINBOX - #else - #define LV_USE_SPINBOX 0 - #endif - #else - #define LV_USE_SPINBOX 1 - #endif -#endif - -#ifndef LV_USE_SPINNER - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_SPINNER - #define LV_USE_SPINNER CONFIG_LV_USE_SPINNER - #else - #define LV_USE_SPINNER 0 - #endif - #else - #define LV_USE_SPINNER 1 - #endif -#endif - -#ifndef LV_USE_SWITCH - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_SWITCH - #define LV_USE_SWITCH CONFIG_LV_USE_SWITCH - #else - #define LV_USE_SWITCH 0 - #endif - #else - #define LV_USE_SWITCH 1 - #endif -#endif - -#ifndef LV_USE_TEXTAREA - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_TEXTAREA - #define LV_USE_TEXTAREA CONFIG_LV_USE_TEXTAREA - #else - #define LV_USE_TEXTAREA 0 - #endif - #else - #define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ - #endif -#endif -#if LV_USE_TEXTAREA != 0 - #ifndef LV_TEXTAREA_DEF_PWD_SHOW_TIME - #ifdef CONFIG_LV_TEXTAREA_DEF_PWD_SHOW_TIME - #define LV_TEXTAREA_DEF_PWD_SHOW_TIME CONFIG_LV_TEXTAREA_DEF_PWD_SHOW_TIME - #else - #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ - #endif - #endif -#endif - -#ifndef LV_USE_TABLE - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_TABLE - #define LV_USE_TABLE CONFIG_LV_USE_TABLE - #else - #define LV_USE_TABLE 0 - #endif - #else - #define LV_USE_TABLE 1 - #endif -#endif - -#ifndef LV_USE_TABVIEW - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_TABVIEW - #define LV_USE_TABVIEW CONFIG_LV_USE_TABVIEW - #else - #define LV_USE_TABVIEW 0 - #endif - #else - #define LV_USE_TABVIEW 1 - #endif -#endif - -#ifndef LV_USE_TILEVIEW - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_TILEVIEW - #define LV_USE_TILEVIEW CONFIG_LV_USE_TILEVIEW - #else - #define LV_USE_TILEVIEW 0 - #endif - #else - #define LV_USE_TILEVIEW 1 - #endif -#endif - -#ifndef LV_USE_WIN - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_WIN - #define LV_USE_WIN CONFIG_LV_USE_WIN - #else - #define LV_USE_WIN 0 - #endif - #else - #define LV_USE_WIN 1 - #endif -#endif - -/*================== - * THEMES - *==================*/ - -/*A simple, impressive and very complete theme*/ -#ifndef LV_USE_THEME_DEFAULT - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_THEME_DEFAULT - #define LV_USE_THEME_DEFAULT CONFIG_LV_USE_THEME_DEFAULT - #else - #define LV_USE_THEME_DEFAULT 0 - #endif - #else - #define LV_USE_THEME_DEFAULT 1 - #endif -#endif -#if LV_USE_THEME_DEFAULT - - /*0: Light mode; 1: Dark mode*/ - #ifndef LV_THEME_DEFAULT_DARK - #ifdef CONFIG_LV_THEME_DEFAULT_DARK - #define LV_THEME_DEFAULT_DARK CONFIG_LV_THEME_DEFAULT_DARK - #else - #define LV_THEME_DEFAULT_DARK 0 - #endif - #endif - - /*1: Enable grow on press*/ - #ifndef LV_THEME_DEFAULT_GROW - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_THEME_DEFAULT_GROW - #define LV_THEME_DEFAULT_GROW CONFIG_LV_THEME_DEFAULT_GROW - #else - #define LV_THEME_DEFAULT_GROW 0 - #endif - #else - #define LV_THEME_DEFAULT_GROW 1 - #endif - #endif - - /*Default transition time in [ms]*/ - #ifndef LV_THEME_DEFAULT_TRANSITION_TIME - #ifdef CONFIG_LV_THEME_DEFAULT_TRANSITION_TIME - #define LV_THEME_DEFAULT_TRANSITION_TIME CONFIG_LV_THEME_DEFAULT_TRANSITION_TIME - #else - #define LV_THEME_DEFAULT_TRANSITION_TIME 80 - #endif - #endif -#endif /*LV_USE_THEME_DEFAULT*/ - -/*A very simple theme that is a good starting point for a custom theme*/ -#ifndef LV_USE_THEME_SIMPLE - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_THEME_SIMPLE - #define LV_USE_THEME_SIMPLE CONFIG_LV_USE_THEME_SIMPLE - #else - #define LV_USE_THEME_SIMPLE 0 - #endif - #else - #define LV_USE_THEME_SIMPLE 1 - #endif -#endif - -/*A theme designed for monochrome displays*/ -#ifndef LV_USE_THEME_MONO - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_THEME_MONO - #define LV_USE_THEME_MONO CONFIG_LV_USE_THEME_MONO - #else - #define LV_USE_THEME_MONO 0 - #endif - #else - #define LV_USE_THEME_MONO 1 - #endif -#endif - -/*================== - * LAYOUTS - *==================*/ - -/*A layout similar to Flexbox in CSS.*/ -#ifndef LV_USE_FLEX - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_FLEX - #define LV_USE_FLEX CONFIG_LV_USE_FLEX - #else - #define LV_USE_FLEX 0 - #endif - #else - #define LV_USE_FLEX 1 - #endif -#endif - -/*A layout similar to Grid in CSS.*/ -#ifndef LV_USE_GRID - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_GRID - #define LV_USE_GRID CONFIG_LV_USE_GRID - #else - #define LV_USE_GRID 0 - #endif - #else - #define LV_USE_GRID 1 - #endif -#endif - -/*==================== - * 3RD PARTS LIBRARIES - *====================*/ - -/*File system interfaces for common APIs */ - -/*Setting a default driver letter allows skipping the driver prefix in filepaths*/ -#ifndef LV_FS_DEFAULT_DRIVE_LETTER - #ifdef CONFIG_LV_FS_DEFAULT_DRIVE_LETTER - #define LV_FS_DEFAULT_DRIVE_LETTER CONFIG_LV_FS_DEFAULT_DRIVE_LETTER - #else - #define LV_FS_DEFAULT_DRIVE_LETTER '\0' - #endif -#endif - -/*API for fopen, fread, etc*/ -#ifndef LV_USE_FS_STDIO - #ifdef CONFIG_LV_USE_FS_STDIO - #define LV_USE_FS_STDIO CONFIG_LV_USE_FS_STDIO - #else - #define LV_USE_FS_STDIO 0 - #endif -#endif -#if LV_USE_FS_STDIO - #ifndef LV_FS_STDIO_LETTER - #ifdef CONFIG_LV_FS_STDIO_LETTER - #define LV_FS_STDIO_LETTER CONFIG_LV_FS_STDIO_LETTER - #else - #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #endif - #endif - #ifndef LV_FS_STDIO_PATH - #ifdef CONFIG_LV_FS_STDIO_PATH - #define LV_FS_STDIO_PATH CONFIG_LV_FS_STDIO_PATH - #else - #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ - #endif - #endif - #ifndef LV_FS_STDIO_CACHE_SIZE - #ifdef CONFIG_LV_FS_STDIO_CACHE_SIZE - #define LV_FS_STDIO_CACHE_SIZE CONFIG_LV_FS_STDIO_CACHE_SIZE - #else - #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ - #endif - #endif -#endif - -/*API for open, read, etc*/ -#ifndef LV_USE_FS_POSIX - #ifdef CONFIG_LV_USE_FS_POSIX - #define LV_USE_FS_POSIX CONFIG_LV_USE_FS_POSIX - #else - #define LV_USE_FS_POSIX 0 - #endif -#endif -#if LV_USE_FS_POSIX - #ifndef LV_FS_POSIX_LETTER - #ifdef CONFIG_LV_FS_POSIX_LETTER - #define LV_FS_POSIX_LETTER CONFIG_LV_FS_POSIX_LETTER - #else - #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #endif - #endif - #ifndef LV_FS_POSIX_PATH - #ifdef CONFIG_LV_FS_POSIX_PATH - #define LV_FS_POSIX_PATH CONFIG_LV_FS_POSIX_PATH - #else - #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ - #endif - #endif - #ifndef LV_FS_POSIX_CACHE_SIZE - #ifdef CONFIG_LV_FS_POSIX_CACHE_SIZE - #define LV_FS_POSIX_CACHE_SIZE CONFIG_LV_FS_POSIX_CACHE_SIZE - #else - #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ - #endif - #endif -#endif - -/*API for CreateFile, ReadFile, etc*/ -#ifndef LV_USE_FS_WIN32 - #ifdef CONFIG_LV_USE_FS_WIN32 - #define LV_USE_FS_WIN32 CONFIG_LV_USE_FS_WIN32 - #else - #define LV_USE_FS_WIN32 0 - #endif -#endif -#if LV_USE_FS_WIN32 - #ifndef LV_FS_WIN32_LETTER - #ifdef CONFIG_LV_FS_WIN32_LETTER - #define LV_FS_WIN32_LETTER CONFIG_LV_FS_WIN32_LETTER - #else - #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #endif - #endif - #ifndef LV_FS_WIN32_PATH - #ifdef CONFIG_LV_FS_WIN32_PATH - #define LV_FS_WIN32_PATH CONFIG_LV_FS_WIN32_PATH - #else - #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ - #endif - #endif - #ifndef LV_FS_WIN32_CACHE_SIZE - #ifdef CONFIG_LV_FS_WIN32_CACHE_SIZE - #define LV_FS_WIN32_CACHE_SIZE CONFIG_LV_FS_WIN32_CACHE_SIZE - #else - #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ - #endif - #endif -#endif - -/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ -#ifndef LV_USE_FS_FATFS - #ifdef CONFIG_LV_USE_FS_FATFS - #define LV_USE_FS_FATFS CONFIG_LV_USE_FS_FATFS - #else - #define LV_USE_FS_FATFS 0 - #endif -#endif -#if LV_USE_FS_FATFS - #ifndef LV_FS_FATFS_LETTER - #ifdef CONFIG_LV_FS_FATFS_LETTER - #define LV_FS_FATFS_LETTER CONFIG_LV_FS_FATFS_LETTER - #else - #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #endif - #endif - #ifndef LV_FS_FATFS_CACHE_SIZE - #ifdef CONFIG_LV_FS_FATFS_CACHE_SIZE - #define LV_FS_FATFS_CACHE_SIZE CONFIG_LV_FS_FATFS_CACHE_SIZE - #else - #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ - #endif - #endif -#endif - -/*API for memory-mapped file access. */ -#ifndef LV_USE_FS_MEMFS - #ifdef CONFIG_LV_USE_FS_MEMFS - #define LV_USE_FS_MEMFS CONFIG_LV_USE_FS_MEMFS - #else - #define LV_USE_FS_MEMFS 0 - #endif -#endif -#if LV_USE_FS_MEMFS - #ifndef LV_FS_MEMFS_LETTER - #ifdef CONFIG_LV_FS_MEMFS_LETTER - #define LV_FS_MEMFS_LETTER CONFIG_LV_FS_MEMFS_LETTER - #else - #define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #endif - #endif -#endif - -/*API for LittleFs. */ -#ifndef LV_USE_FS_LITTLEFS - #ifdef CONFIG_LV_USE_FS_LITTLEFS - #define LV_USE_FS_LITTLEFS CONFIG_LV_USE_FS_LITTLEFS - #else - #define LV_USE_FS_LITTLEFS 0 - #endif -#endif -#if LV_USE_FS_LITTLEFS - #ifndef LV_FS_LITTLEFS_LETTER - #ifdef CONFIG_LV_FS_LITTLEFS_LETTER - #define LV_FS_LITTLEFS_LETTER CONFIG_LV_FS_LITTLEFS_LETTER - #else - #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #endif - #endif -#endif - -/*API for Arduino LittleFs. */ -#ifndef LV_USE_FS_ARDUINO_ESP_LITTLEFS - #ifdef CONFIG_LV_USE_FS_ARDUINO_ESP_LITTLEFS - #define LV_USE_FS_ARDUINO_ESP_LITTLEFS CONFIG_LV_USE_FS_ARDUINO_ESP_LITTLEFS - #else - #define LV_USE_FS_ARDUINO_ESP_LITTLEFS 0 - #endif -#endif -#if LV_USE_FS_ARDUINO_ESP_LITTLEFS - #ifndef LV_FS_ARDUINO_ESP_LITTLEFS_LETTER - #ifdef CONFIG_LV_FS_ARDUINO_ESP_LITTLEFS_LETTER - #define LV_FS_ARDUINO_ESP_LITTLEFS_LETTER CONFIG_LV_FS_ARDUINO_ESP_LITTLEFS_LETTER - #else - #define LV_FS_ARDUINO_ESP_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #endif - #endif -#endif - -/*API for Arduino Sd. */ -#ifndef LV_USE_FS_ARDUINO_SD - #ifdef CONFIG_LV_USE_FS_ARDUINO_SD - #define LV_USE_FS_ARDUINO_SD CONFIG_LV_USE_FS_ARDUINO_SD - #else - #define LV_USE_FS_ARDUINO_SD 0 - #endif -#endif -#if LV_USE_FS_ARDUINO_SD - #ifndef LV_FS_ARDUINO_SD_LETTER - #ifdef CONFIG_LV_FS_ARDUINO_SD_LETTER - #define LV_FS_ARDUINO_SD_LETTER CONFIG_LV_FS_ARDUINO_SD_LETTER - #else - #define LV_FS_ARDUINO_SD_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #endif - #endif -#endif - -/*LODEPNG decoder library*/ -#ifndef LV_USE_LODEPNG - #ifdef CONFIG_LV_USE_LODEPNG - #define LV_USE_LODEPNG CONFIG_LV_USE_LODEPNG - #else - #define LV_USE_LODEPNG 0 - #endif -#endif - -/*PNG decoder(libpng) library*/ -#ifndef LV_USE_LIBPNG - #ifdef CONFIG_LV_USE_LIBPNG - #define LV_USE_LIBPNG CONFIG_LV_USE_LIBPNG - #else - #define LV_USE_LIBPNG 0 - #endif -#endif - -/*BMP decoder library*/ -#ifndef LV_USE_BMP - #ifdef CONFIG_LV_USE_BMP - #define LV_USE_BMP CONFIG_LV_USE_BMP - #else - #define LV_USE_BMP 0 - #endif -#endif - -/* JPG + split JPG decoder library. - * Split JPG is a custom format optimized for embedded systems. */ -#ifndef LV_USE_TJPGD - #ifdef CONFIG_LV_USE_TJPGD - #define LV_USE_TJPGD CONFIG_LV_USE_TJPGD - #else - #define LV_USE_TJPGD 0 - #endif -#endif - -/* libjpeg-turbo decoder library. - * Supports complete JPEG specifications and high-performance JPEG decoding. */ -#ifndef LV_USE_LIBJPEG_TURBO - #ifdef CONFIG_LV_USE_LIBJPEG_TURBO - #define LV_USE_LIBJPEG_TURBO CONFIG_LV_USE_LIBJPEG_TURBO - #else - #define LV_USE_LIBJPEG_TURBO 0 - #endif -#endif - -/*GIF decoder library*/ -#ifndef LV_USE_GIF - #ifdef CONFIG_LV_USE_GIF - #define LV_USE_GIF CONFIG_LV_USE_GIF - #else - #define LV_USE_GIF 0 - #endif -#endif -#if LV_USE_GIF - /*GIF decoder accelerate*/ - #ifndef LV_GIF_CACHE_DECODE_DATA - #ifdef CONFIG_LV_GIF_CACHE_DECODE_DATA - #define LV_GIF_CACHE_DECODE_DATA CONFIG_LV_GIF_CACHE_DECODE_DATA - #else - #define LV_GIF_CACHE_DECODE_DATA 0 - #endif - #endif -#endif - - -/*Decode bin images to RAM*/ -#ifndef LV_BIN_DECODER_RAM_LOAD - #ifdef CONFIG_LV_BIN_DECODER_RAM_LOAD - #define LV_BIN_DECODER_RAM_LOAD CONFIG_LV_BIN_DECODER_RAM_LOAD - #else - #define LV_BIN_DECODER_RAM_LOAD 0 - #endif -#endif - -/*RLE decompress library*/ -#ifndef LV_USE_RLE - #ifdef CONFIG_LV_USE_RLE - #define LV_USE_RLE CONFIG_LV_USE_RLE - #else - #define LV_USE_RLE 0 - #endif -#endif - -/*QR code library*/ -#ifndef LV_USE_QRCODE - #ifdef CONFIG_LV_USE_QRCODE - #define LV_USE_QRCODE CONFIG_LV_USE_QRCODE - #else - #define LV_USE_QRCODE 0 - #endif -#endif - -/*Barcode code library*/ -#ifndef LV_USE_BARCODE - #ifdef CONFIG_LV_USE_BARCODE - #define LV_USE_BARCODE CONFIG_LV_USE_BARCODE - #else - #define LV_USE_BARCODE 0 - #endif -#endif - -/*FreeType library*/ -#ifndef LV_USE_FREETYPE - #ifdef CONFIG_LV_USE_FREETYPE - #define LV_USE_FREETYPE CONFIG_LV_USE_FREETYPE - #else - #define LV_USE_FREETYPE 0 - #endif -#endif -#if LV_USE_FREETYPE - /*Let FreeType to use LVGL memory and file porting*/ - #ifndef LV_FREETYPE_USE_LVGL_PORT - #ifdef CONFIG_LV_FREETYPE_USE_LVGL_PORT - #define LV_FREETYPE_USE_LVGL_PORT CONFIG_LV_FREETYPE_USE_LVGL_PORT - #else - #define LV_FREETYPE_USE_LVGL_PORT 0 - #endif - #endif - - /*Cache count of the glyphs in FreeType. It means the number of glyphs that can be cached. - *The higher the value, the more memory will be used.*/ - #ifndef LV_FREETYPE_CACHE_FT_GLYPH_CNT - #ifdef CONFIG_LV_FREETYPE_CACHE_FT_GLYPH_CNT - #define LV_FREETYPE_CACHE_FT_GLYPH_CNT CONFIG_LV_FREETYPE_CACHE_FT_GLYPH_CNT - #else - #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 - #endif - #endif -#endif - -/* Built-in TTF decoder */ -#ifndef LV_USE_TINY_TTF - #ifdef CONFIG_LV_USE_TINY_TTF - #define LV_USE_TINY_TTF CONFIG_LV_USE_TINY_TTF - #else - #define LV_USE_TINY_TTF 0 - #endif -#endif -#if LV_USE_TINY_TTF - /* Enable loading TTF data from files */ - #ifndef LV_TINY_TTF_FILE_SUPPORT - #ifdef CONFIG_LV_TINY_TTF_FILE_SUPPORT - #define LV_TINY_TTF_FILE_SUPPORT CONFIG_LV_TINY_TTF_FILE_SUPPORT - #else - #define LV_TINY_TTF_FILE_SUPPORT 0 - #endif - #endif - #ifndef LV_TINY_TTF_CACHE_GLYPH_CNT - #ifdef CONFIG_LV_TINY_TTF_CACHE_GLYPH_CNT - #define LV_TINY_TTF_CACHE_GLYPH_CNT CONFIG_LV_TINY_TTF_CACHE_GLYPH_CNT - #else - #define LV_TINY_TTF_CACHE_GLYPH_CNT 256 - #endif - #endif -#endif - -/*Rlottie library*/ -#ifndef LV_USE_RLOTTIE - #ifdef CONFIG_LV_USE_RLOTTIE - #define LV_USE_RLOTTIE CONFIG_LV_USE_RLOTTIE - #else - #define LV_USE_RLOTTIE 0 - #endif -#endif - -/*Enable Vector Graphic APIs - *Requires `LV_USE_MATRIX = 1`*/ -#ifndef LV_USE_VECTOR_GRAPHIC - #ifdef CONFIG_LV_USE_VECTOR_GRAPHIC - #define LV_USE_VECTOR_GRAPHIC CONFIG_LV_USE_VECTOR_GRAPHIC - #else - #define LV_USE_VECTOR_GRAPHIC 0 - #endif -#endif - -/* Enable ThorVG (vector graphics library) from the src/libs folder */ -#ifndef LV_USE_THORVG_INTERNAL - #ifdef CONFIG_LV_USE_THORVG_INTERNAL - #define LV_USE_THORVG_INTERNAL CONFIG_LV_USE_THORVG_INTERNAL - #else - #define LV_USE_THORVG_INTERNAL 0 - #endif -#endif - -/* Enable ThorVG by assuming that its installed and linked to the project */ -#ifndef LV_USE_THORVG_EXTERNAL - #ifdef CONFIG_LV_USE_THORVG_EXTERNAL - #define LV_USE_THORVG_EXTERNAL CONFIG_LV_USE_THORVG_EXTERNAL - #else - #define LV_USE_THORVG_EXTERNAL 0 - #endif -#endif - -/*Use lvgl built-in LZ4 lib*/ -#ifndef LV_USE_LZ4_INTERNAL - #ifdef CONFIG_LV_USE_LZ4_INTERNAL - #define LV_USE_LZ4_INTERNAL CONFIG_LV_USE_LZ4_INTERNAL - #else - #define LV_USE_LZ4_INTERNAL 0 - #endif -#endif - -/*Use external LZ4 library*/ -#ifndef LV_USE_LZ4_EXTERNAL - #ifdef CONFIG_LV_USE_LZ4_EXTERNAL - #define LV_USE_LZ4_EXTERNAL CONFIG_LV_USE_LZ4_EXTERNAL - #else - #define LV_USE_LZ4_EXTERNAL 0 - #endif -#endif - -/*FFmpeg library for image decoding and playing videos - *Supports all major image formats so do not enable other image decoder with it*/ -#ifndef LV_USE_FFMPEG - #ifdef CONFIG_LV_USE_FFMPEG - #define LV_USE_FFMPEG CONFIG_LV_USE_FFMPEG - #else - #define LV_USE_FFMPEG 0 - #endif -#endif -#if LV_USE_FFMPEG - /*Dump input information to stderr*/ - #ifndef LV_FFMPEG_DUMP_FORMAT - #ifdef CONFIG_LV_FFMPEG_DUMP_FORMAT - #define LV_FFMPEG_DUMP_FORMAT CONFIG_LV_FFMPEG_DUMP_FORMAT - #else - #define LV_FFMPEG_DUMP_FORMAT 0 - #endif - #endif -#endif - -/*================== - * OTHERS - *==================*/ - -/*1: Enable API to take snapshot for object*/ -#ifndef LV_USE_SNAPSHOT - #ifdef CONFIG_LV_USE_SNAPSHOT - #define LV_USE_SNAPSHOT CONFIG_LV_USE_SNAPSHOT - #else - #define LV_USE_SNAPSHOT 0 - #endif -#endif - -/*1: Enable system monitor component*/ -#ifndef LV_USE_SYSMON - #ifdef CONFIG_LV_USE_SYSMON - #define LV_USE_SYSMON CONFIG_LV_USE_SYSMON - #else - #define LV_USE_SYSMON 0 - #endif -#endif -#if LV_USE_SYSMON - /*Get the idle percentage. E.g. uint32_t my_get_idle(void);*/ - #ifndef LV_SYSMON_GET_IDLE - #ifdef CONFIG_LV_SYSMON_GET_IDLE - #define LV_SYSMON_GET_IDLE CONFIG_LV_SYSMON_GET_IDLE - #else - #define LV_SYSMON_GET_IDLE lv_timer_get_idle - #endif - #endif - - /*1: Show CPU usage and FPS count - * Requires `LV_USE_SYSMON = 1`*/ - #ifndef LV_USE_PERF_MONITOR - #ifdef CONFIG_LV_USE_PERF_MONITOR - #define LV_USE_PERF_MONITOR CONFIG_LV_USE_PERF_MONITOR - #else - #define LV_USE_PERF_MONITOR 0 - #endif - #endif - #if LV_USE_PERF_MONITOR - #ifndef LV_USE_PERF_MONITOR_POS - #ifdef CONFIG_LV_USE_PERF_MONITOR_POS - #define LV_USE_PERF_MONITOR_POS CONFIG_LV_USE_PERF_MONITOR_POS - #else - #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT - #endif - #endif - - /*0: Displays performance data on the screen, 1: Prints performance data using log.*/ - #ifndef LV_USE_PERF_MONITOR_LOG_MODE - #ifdef CONFIG_LV_USE_PERF_MONITOR_LOG_MODE - #define LV_USE_PERF_MONITOR_LOG_MODE CONFIG_LV_USE_PERF_MONITOR_LOG_MODE - #else - #define LV_USE_PERF_MONITOR_LOG_MODE 0 - #endif - #endif - #endif - - /*1: Show the used memory and the memory fragmentation - * Requires `LV_USE_STDLIB_MALLOC = LV_STDLIB_BUILTIN` - * Requires `LV_USE_SYSMON = 1`*/ - #ifndef LV_USE_MEM_MONITOR - #ifdef CONFIG_LV_USE_MEM_MONITOR - #define LV_USE_MEM_MONITOR CONFIG_LV_USE_MEM_MONITOR - #else - #define LV_USE_MEM_MONITOR 0 - #endif - #endif - #if LV_USE_MEM_MONITOR - #ifndef LV_USE_MEM_MONITOR_POS - #ifdef CONFIG_LV_USE_MEM_MONITOR_POS - #define LV_USE_MEM_MONITOR_POS CONFIG_LV_USE_MEM_MONITOR_POS - #else - #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT - #endif - #endif - #endif - -#endif /*LV_USE_SYSMON*/ - -/*1: Enable the runtime performance profiler*/ -#ifndef LV_USE_PROFILER - #ifdef CONFIG_LV_USE_PROFILER - #define LV_USE_PROFILER CONFIG_LV_USE_PROFILER - #else - #define LV_USE_PROFILER 0 - #endif -#endif -#if LV_USE_PROFILER - /*1: Enable the built-in profiler*/ - #ifndef LV_USE_PROFILER_BUILTIN - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_PROFILER_BUILTIN - #define LV_USE_PROFILER_BUILTIN CONFIG_LV_USE_PROFILER_BUILTIN - #else - #define LV_USE_PROFILER_BUILTIN 0 - #endif - #else - #define LV_USE_PROFILER_BUILTIN 1 - #endif - #endif - #if LV_USE_PROFILER_BUILTIN - /*Default profiler trace buffer size*/ - #ifndef LV_PROFILER_BUILTIN_BUF_SIZE - #ifdef CONFIG_LV_PROFILER_BUILTIN_BUF_SIZE - #define LV_PROFILER_BUILTIN_BUF_SIZE CONFIG_LV_PROFILER_BUILTIN_BUF_SIZE - #else - #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /*[bytes]*/ - #endif - #endif - #endif - - /*Header to include for the profiler*/ - #ifndef LV_PROFILER_INCLUDE - #ifdef CONFIG_LV_PROFILER_INCLUDE - #define LV_PROFILER_INCLUDE CONFIG_LV_PROFILER_INCLUDE - #else - #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" - #endif - #endif - - /*Profiler start point function*/ - #ifndef LV_PROFILER_BEGIN - #ifdef CONFIG_LV_PROFILER_BEGIN - #define LV_PROFILER_BEGIN CONFIG_LV_PROFILER_BEGIN - #else - #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN - #endif - #endif - - /*Profiler end point function*/ - #ifndef LV_PROFILER_END - #ifdef CONFIG_LV_PROFILER_END - #define LV_PROFILER_END CONFIG_LV_PROFILER_END - #else - #define LV_PROFILER_END LV_PROFILER_BUILTIN_END - #endif - #endif - - /*Profiler start point function with custom tag*/ - #ifndef LV_PROFILER_BEGIN_TAG - #ifdef CONFIG_LV_PROFILER_BEGIN_TAG - #define LV_PROFILER_BEGIN_TAG CONFIG_LV_PROFILER_BEGIN_TAG - #else - #define LV_PROFILER_BEGIN_TAG LV_PROFILER_BUILTIN_BEGIN_TAG - #endif - #endif - - /*Profiler end point function with custom tag*/ - #ifndef LV_PROFILER_END_TAG - #ifdef CONFIG_LV_PROFILER_END_TAG - #define LV_PROFILER_END_TAG CONFIG_LV_PROFILER_END_TAG - #else - #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG - #endif - #endif -#endif - -/*1: Enable Monkey test*/ -#ifndef LV_USE_MONKEY - #ifdef CONFIG_LV_USE_MONKEY - #define LV_USE_MONKEY CONFIG_LV_USE_MONKEY - #else - #define LV_USE_MONKEY 0 - #endif -#endif - -/*1: Enable grid navigation*/ -#ifndef LV_USE_GRIDNAV - #ifdef CONFIG_LV_USE_GRIDNAV - #define LV_USE_GRIDNAV CONFIG_LV_USE_GRIDNAV - #else - #define LV_USE_GRIDNAV 0 - #endif -#endif - -/*1: Enable lv_obj fragment*/ -#ifndef LV_USE_FRAGMENT - #ifdef CONFIG_LV_USE_FRAGMENT - #define LV_USE_FRAGMENT CONFIG_LV_USE_FRAGMENT - #else - #define LV_USE_FRAGMENT 0 - #endif -#endif - -/*1: Support using images as font in label or span widgets */ -#ifndef LV_USE_IMGFONT - #ifdef CONFIG_LV_USE_IMGFONT - #define LV_USE_IMGFONT CONFIG_LV_USE_IMGFONT - #else - #define LV_USE_IMGFONT 0 - #endif -#endif - -/*1: Enable an observer pattern implementation*/ -#ifndef LV_USE_OBSERVER - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_OBSERVER - #define LV_USE_OBSERVER CONFIG_LV_USE_OBSERVER - #else - #define LV_USE_OBSERVER 0 - #endif - #else - #define LV_USE_OBSERVER 1 - #endif -#endif - -/*1: Enable Pinyin input method*/ -/*Requires: lv_keyboard*/ -#ifndef LV_USE_IME_PINYIN - #ifdef CONFIG_LV_USE_IME_PINYIN - #define LV_USE_IME_PINYIN CONFIG_LV_USE_IME_PINYIN - #else - #define LV_USE_IME_PINYIN 0 - #endif -#endif -#if LV_USE_IME_PINYIN - /*1: Use default thesaurus*/ - /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesaurus*/ - #ifndef LV_IME_PINYIN_USE_DEFAULT_DICT - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_IME_PINYIN_USE_DEFAULT_DICT - #define LV_IME_PINYIN_USE_DEFAULT_DICT CONFIG_LV_IME_PINYIN_USE_DEFAULT_DICT - #else - #define LV_IME_PINYIN_USE_DEFAULT_DICT 0 - #endif - #else - #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 - #endif - #endif - /*Set the maximum number of candidate panels that can be displayed*/ - /*This needs to be adjusted according to the size of the screen*/ - #ifndef LV_IME_PINYIN_CAND_TEXT_NUM - #ifdef CONFIG_LV_IME_PINYIN_CAND_TEXT_NUM - #define LV_IME_PINYIN_CAND_TEXT_NUM CONFIG_LV_IME_PINYIN_CAND_TEXT_NUM - #else - #define LV_IME_PINYIN_CAND_TEXT_NUM 6 - #endif - #endif - - /*Use 9 key input(k9)*/ - #ifndef LV_IME_PINYIN_USE_K9_MODE - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_IME_PINYIN_USE_K9_MODE - #define LV_IME_PINYIN_USE_K9_MODE CONFIG_LV_IME_PINYIN_USE_K9_MODE - #else - #define LV_IME_PINYIN_USE_K9_MODE 0 - #endif - #else - #define LV_IME_PINYIN_USE_K9_MODE 1 - #endif - #endif - #if LV_IME_PINYIN_USE_K9_MODE == 1 - #ifndef LV_IME_PINYIN_K9_CAND_TEXT_NUM - #ifdef CONFIG_LV_IME_PINYIN_K9_CAND_TEXT_NUM - #define LV_IME_PINYIN_K9_CAND_TEXT_NUM CONFIG_LV_IME_PINYIN_K9_CAND_TEXT_NUM - #else - #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 - #endif - #endif - #endif /*LV_IME_PINYIN_USE_K9_MODE*/ -#endif - -/*1: Enable file explorer*/ -/*Requires: lv_table*/ -#ifndef LV_USE_FILE_EXPLORER - #ifdef CONFIG_LV_USE_FILE_EXPLORER - #define LV_USE_FILE_EXPLORER CONFIG_LV_USE_FILE_EXPLORER - #else - #define LV_USE_FILE_EXPLORER 0 - #endif -#endif -#if LV_USE_FILE_EXPLORER - /*Maximum length of path*/ - #ifndef LV_FILE_EXPLORER_PATH_MAX_LEN - #ifdef CONFIG_LV_FILE_EXPLORER_PATH_MAX_LEN - #define LV_FILE_EXPLORER_PATH_MAX_LEN CONFIG_LV_FILE_EXPLORER_PATH_MAX_LEN - #else - #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) - #endif - #endif - /*Quick access bar, 1:use, 0:not use*/ - /*Requires: lv_list*/ - #ifndef LV_FILE_EXPLORER_QUICK_ACCESS - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_FILE_EXPLORER_QUICK_ACCESS - #define LV_FILE_EXPLORER_QUICK_ACCESS CONFIG_LV_FILE_EXPLORER_QUICK_ACCESS - #else - #define LV_FILE_EXPLORER_QUICK_ACCESS 0 - #endif - #else - #define LV_FILE_EXPLORER_QUICK_ACCESS 1 - #endif - #endif -#endif - -/*================== - * DEVICES - *==================*/ - -/*Use SDL to open window on PC and handle mouse and keyboard*/ -#ifndef LV_USE_SDL - #ifdef CONFIG_LV_USE_SDL - #define LV_USE_SDL CONFIG_LV_USE_SDL - #else - #define LV_USE_SDL 0 - #endif -#endif -#if LV_USE_SDL - #ifndef LV_SDL_INCLUDE_PATH - #ifdef CONFIG_LV_SDL_INCLUDE_PATH - #define LV_SDL_INCLUDE_PATH CONFIG_LV_SDL_INCLUDE_PATH - #else - #define LV_SDL_INCLUDE_PATH - #endif - #endif - #ifndef LV_SDL_RENDER_MODE - #ifdef CONFIG_LV_SDL_RENDER_MODE - #define LV_SDL_RENDER_MODE CONFIG_LV_SDL_RENDER_MODE - #else - #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/ - #endif - #endif - #ifndef LV_SDL_BUF_COUNT - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_SDL_BUF_COUNT - #define LV_SDL_BUF_COUNT CONFIG_LV_SDL_BUF_COUNT - #else - #define LV_SDL_BUF_COUNT 0 - #endif - #else - #define LV_SDL_BUF_COUNT 1 /*1 or 2*/ - #endif - #endif - #ifndef LV_SDL_ACCELERATED - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_SDL_ACCELERATED - #define LV_SDL_ACCELERATED CONFIG_LV_SDL_ACCELERATED - #else - #define LV_SDL_ACCELERATED 0 - #endif - #else - #define LV_SDL_ACCELERATED 1 /*1: Use hardware acceleration*/ - #endif - #endif - #ifndef LV_SDL_FULLSCREEN - #ifdef CONFIG_LV_SDL_FULLSCREEN - #define LV_SDL_FULLSCREEN CONFIG_LV_SDL_FULLSCREEN - #else - #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/ - #endif - #endif - #ifndef LV_SDL_DIRECT_EXIT - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_SDL_DIRECT_EXIT - #define LV_SDL_DIRECT_EXIT CONFIG_LV_SDL_DIRECT_EXIT - #else - #define LV_SDL_DIRECT_EXIT 0 - #endif - #else - #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/ - #endif - #endif - #ifndef LV_SDL_MOUSEWHEEL_MODE - #ifdef CONFIG_LV_SDL_MOUSEWHEEL_MODE - #define LV_SDL_MOUSEWHEEL_MODE CONFIG_LV_SDL_MOUSEWHEEL_MODE - #else - #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/ - #endif - #endif -#endif - -/*Use X11 to open window on Linux desktop and handle mouse and keyboard*/ -#ifndef LV_USE_X11 - #ifdef CONFIG_LV_USE_X11 - #define LV_USE_X11 CONFIG_LV_USE_X11 - #else - #define LV_USE_X11 0 - #endif -#endif -#if LV_USE_X11 - #ifndef LV_X11_DIRECT_EXIT - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_X11_DIRECT_EXIT - #define LV_X11_DIRECT_EXIT CONFIG_LV_X11_DIRECT_EXIT - #else - #define LV_X11_DIRECT_EXIT 0 - #endif - #else - #define LV_X11_DIRECT_EXIT 1 /*Exit the application when all X11 windows have been closed*/ - #endif - #endif - #ifndef LV_X11_DOUBLE_BUFFER - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_X11_DOUBLE_BUFFER - #define LV_X11_DOUBLE_BUFFER CONFIG_LV_X11_DOUBLE_BUFFER - #else - #define LV_X11_DOUBLE_BUFFER 0 - #endif - #else - #define LV_X11_DOUBLE_BUFFER 1 /*Use double buffers for rendering*/ - #endif - #endif - /*select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!)*/ - #ifndef LV_X11_RENDER_MODE_PARTIAL - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_X11_RENDER_MODE_PARTIAL - #define LV_X11_RENDER_MODE_PARTIAL CONFIG_LV_X11_RENDER_MODE_PARTIAL - #else - #define LV_X11_RENDER_MODE_PARTIAL 0 - #endif - #else - #define LV_X11_RENDER_MODE_PARTIAL 1 /*Partial render mode (preferred)*/ - #endif - #endif - #ifndef LV_X11_RENDER_MODE_DIRECT - #ifdef CONFIG_LV_X11_RENDER_MODE_DIRECT - #define LV_X11_RENDER_MODE_DIRECT CONFIG_LV_X11_RENDER_MODE_DIRECT - #else - #define LV_X11_RENDER_MODE_DIRECT 0 /*direct render mode*/ - #endif - #endif - #ifndef LV_X11_RENDER_MODE_FULL - #ifdef CONFIG_LV_X11_RENDER_MODE_FULL - #define LV_X11_RENDER_MODE_FULL CONFIG_LV_X11_RENDER_MODE_FULL - #else - #define LV_X11_RENDER_MODE_FULL 0 /*Full render mode*/ - #endif - #endif -#endif - -/*Use Wayland to open a window and handle input on Linux or BSD desktops */ -#ifndef LV_USE_WAYLAND - #ifdef CONFIG_LV_USE_WAYLAND - #define LV_USE_WAYLAND CONFIG_LV_USE_WAYLAND - #else - #define LV_USE_WAYLAND 0 - #endif -#endif -#if LV_USE_WAYLAND - #ifndef LV_WAYLAND_WINDOW_DECORATIONS - #ifdef CONFIG_LV_WAYLAND_WINDOW_DECORATIONS - #define LV_WAYLAND_WINDOW_DECORATIONS CONFIG_LV_WAYLAND_WINDOW_DECORATIONS - #else - #define LV_WAYLAND_WINDOW_DECORATIONS 0 /*Draw client side window decorations only necessary on Mutter/GNOME*/ - #endif - #endif - #ifndef LV_WAYLAND_WL_SHELL - #ifdef CONFIG_LV_WAYLAND_WL_SHELL - #define LV_WAYLAND_WL_SHELL CONFIG_LV_WAYLAND_WL_SHELL - #else - #define LV_WAYLAND_WL_SHELL 0 /*Use the legacy wl_shell protocol instead of the default XDG shell*/ - #endif - #endif -#endif - -/*Driver for /dev/fb*/ -#ifndef LV_USE_LINUX_FBDEV - #ifdef CONFIG_LV_USE_LINUX_FBDEV - #define LV_USE_LINUX_FBDEV CONFIG_LV_USE_LINUX_FBDEV - #else - #define LV_USE_LINUX_FBDEV 0 - #endif -#endif -#if LV_USE_LINUX_FBDEV - #ifndef LV_LINUX_FBDEV_BSD - #ifdef CONFIG_LV_LINUX_FBDEV_BSD - #define LV_LINUX_FBDEV_BSD CONFIG_LV_LINUX_FBDEV_BSD - #else - #define LV_LINUX_FBDEV_BSD 0 - #endif - #endif - #ifndef LV_LINUX_FBDEV_RENDER_MODE - #ifdef CONFIG_LV_LINUX_FBDEV_RENDER_MODE - #define LV_LINUX_FBDEV_RENDER_MODE CONFIG_LV_LINUX_FBDEV_RENDER_MODE - #else - #define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL - #endif - #endif - #ifndef LV_LINUX_FBDEV_BUFFER_COUNT - #ifdef CONFIG_LV_LINUX_FBDEV_BUFFER_COUNT - #define LV_LINUX_FBDEV_BUFFER_COUNT CONFIG_LV_LINUX_FBDEV_BUFFER_COUNT - #else - #define LV_LINUX_FBDEV_BUFFER_COUNT 0 - #endif - #endif - #ifndef LV_LINUX_FBDEV_BUFFER_SIZE - #ifdef CONFIG_LV_LINUX_FBDEV_BUFFER_SIZE - #define LV_LINUX_FBDEV_BUFFER_SIZE CONFIG_LV_LINUX_FBDEV_BUFFER_SIZE - #else - #define LV_LINUX_FBDEV_BUFFER_SIZE 60 - #endif - #endif -#endif - -/*Use Nuttx to open window and handle touchscreen*/ -#ifndef LV_USE_NUTTX - #ifdef CONFIG_LV_USE_NUTTX - #define LV_USE_NUTTX CONFIG_LV_USE_NUTTX - #else - #define LV_USE_NUTTX 0 - #endif -#endif - -#if LV_USE_NUTTX - #ifndef LV_USE_NUTTX_LIBUV - #ifdef CONFIG_LV_USE_NUTTX_LIBUV - #define LV_USE_NUTTX_LIBUV CONFIG_LV_USE_NUTTX_LIBUV - #else - #define LV_USE_NUTTX_LIBUV 0 - #endif - #endif - - /*Use Nuttx custom init API to open window and handle touchscreen*/ - #ifndef LV_USE_NUTTX_CUSTOM_INIT - #ifdef CONFIG_LV_USE_NUTTX_CUSTOM_INIT - #define LV_USE_NUTTX_CUSTOM_INIT CONFIG_LV_USE_NUTTX_CUSTOM_INIT - #else - #define LV_USE_NUTTX_CUSTOM_INIT 0 - #endif - #endif - - /*Driver for /dev/lcd*/ - #ifndef LV_USE_NUTTX_LCD - #ifdef CONFIG_LV_USE_NUTTX_LCD - #define LV_USE_NUTTX_LCD CONFIG_LV_USE_NUTTX_LCD - #else - #define LV_USE_NUTTX_LCD 0 - #endif - #endif - #if LV_USE_NUTTX_LCD - #ifndef LV_NUTTX_LCD_BUFFER_COUNT - #ifdef CONFIG_LV_NUTTX_LCD_BUFFER_COUNT - #define LV_NUTTX_LCD_BUFFER_COUNT CONFIG_LV_NUTTX_LCD_BUFFER_COUNT - #else - #define LV_NUTTX_LCD_BUFFER_COUNT 0 - #endif - #endif - #ifndef LV_NUTTX_LCD_BUFFER_SIZE - #ifdef CONFIG_LV_NUTTX_LCD_BUFFER_SIZE - #define LV_NUTTX_LCD_BUFFER_SIZE CONFIG_LV_NUTTX_LCD_BUFFER_SIZE - #else - #define LV_NUTTX_LCD_BUFFER_SIZE 60 - #endif - #endif - #endif - - /*Driver for /dev/input*/ - #ifndef LV_USE_NUTTX_TOUCHSCREEN - #ifdef CONFIG_LV_USE_NUTTX_TOUCHSCREEN - #define LV_USE_NUTTX_TOUCHSCREEN CONFIG_LV_USE_NUTTX_TOUCHSCREEN - #else - #define LV_USE_NUTTX_TOUCHSCREEN 0 - #endif - #endif - -#endif - -/*Driver for /dev/dri/card*/ -#ifndef LV_USE_LINUX_DRM - #ifdef CONFIG_LV_USE_LINUX_DRM - #define LV_USE_LINUX_DRM CONFIG_LV_USE_LINUX_DRM - #else - #define LV_USE_LINUX_DRM 0 - #endif -#endif - -/*Interface for TFT_eSPI*/ -#ifndef LV_USE_TFT_ESPI - #ifdef CONFIG_LV_USE_TFT_ESPI - #define LV_USE_TFT_ESPI CONFIG_LV_USE_TFT_ESPI - #else - #define LV_USE_TFT_ESPI 0 - #endif -#endif - -/*Driver for evdev input devices*/ -#ifndef LV_USE_EVDEV - #ifdef CONFIG_LV_USE_EVDEV - #define LV_USE_EVDEV CONFIG_LV_USE_EVDEV - #else - #define LV_USE_EVDEV 0 - #endif -#endif - -/*Driver for libinput input devices*/ -#ifndef LV_USE_LIBINPUT - #ifdef CONFIG_LV_USE_LIBINPUT - #define LV_USE_LIBINPUT CONFIG_LV_USE_LIBINPUT - #else - #define LV_USE_LIBINPUT 0 - #endif -#endif - -#if LV_USE_LIBINPUT - #ifndef LV_LIBINPUT_BSD - #ifdef CONFIG_LV_LIBINPUT_BSD - #define LV_LIBINPUT_BSD CONFIG_LV_LIBINPUT_BSD - #else - #define LV_LIBINPUT_BSD 0 - #endif - #endif - - /*Full keyboard support*/ - #ifndef LV_LIBINPUT_XKB - #ifdef CONFIG_LV_LIBINPUT_XKB - #define LV_LIBINPUT_XKB CONFIG_LV_LIBINPUT_XKB - #else - #define LV_LIBINPUT_XKB 0 - #endif - #endif - #if LV_LIBINPUT_XKB - /*"setxkbmap -query" can help find the right values for your keyboard*/ - #ifndef LV_LIBINPUT_XKB_KEY_MAP - #ifdef CONFIG_LV_LIBINPUT_XKB_KEY_MAP - #define LV_LIBINPUT_XKB_KEY_MAP CONFIG_LV_LIBINPUT_XKB_KEY_MAP - #else - #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL } - #endif - #endif - #endif -#endif - -/*Drivers for LCD devices connected via SPI/parallel port*/ -#ifndef LV_USE_ST7735 - #ifdef CONFIG_LV_USE_ST7735 - #define LV_USE_ST7735 CONFIG_LV_USE_ST7735 - #else - #define LV_USE_ST7735 0 - #endif -#endif -#ifndef LV_USE_ST7789 - #ifdef CONFIG_LV_USE_ST7789 - #define LV_USE_ST7789 CONFIG_LV_USE_ST7789 - #else - #define LV_USE_ST7789 0 - #endif -#endif -#ifndef LV_USE_ST7796 - #ifdef CONFIG_LV_USE_ST7796 - #define LV_USE_ST7796 CONFIG_LV_USE_ST7796 - #else - #define LV_USE_ST7796 0 - #endif -#endif -#ifndef LV_USE_ILI9341 - #ifdef CONFIG_LV_USE_ILI9341 - #define LV_USE_ILI9341 CONFIG_LV_USE_ILI9341 - #else - #define LV_USE_ILI9341 0 - #endif -#endif - -#ifndef LV_USE_GENERIC_MIPI - #ifdef CONFIG_LV_USE_GENERIC_MIPI - #define LV_USE_GENERIC_MIPI CONFIG_LV_USE_GENERIC_MIPI - #else - #define LV_USE_GENERIC_MIPI (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341) - #endif -#endif - -/*Driver for Renesas GLCD*/ -#ifndef LV_USE_RENESAS_GLCDC - #ifdef CONFIG_LV_USE_RENESAS_GLCDC - #define LV_USE_RENESAS_GLCDC CONFIG_LV_USE_RENESAS_GLCDC - #else - #define LV_USE_RENESAS_GLCDC 0 - #endif -#endif - -/* LVGL Windows backend */ -#ifndef LV_USE_WINDOWS - #ifdef CONFIG_LV_USE_WINDOWS - #define LV_USE_WINDOWS CONFIG_LV_USE_WINDOWS - #else - #define LV_USE_WINDOWS 0 - #endif -#endif - -/* Use OpenGL to open window on PC and handle mouse and keyboard */ -#ifndef LV_USE_OPENGLES - #ifdef CONFIG_LV_USE_OPENGLES - #define LV_USE_OPENGLES CONFIG_LV_USE_OPENGLES - #else - #define LV_USE_OPENGLES 0 - #endif -#endif -#if LV_USE_OPENGLES - #ifndef LV_USE_OPENGLES_DEBUG - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_USE_OPENGLES_DEBUG - #define LV_USE_OPENGLES_DEBUG CONFIG_LV_USE_OPENGLES_DEBUG - #else - #define LV_USE_OPENGLES_DEBUG 0 - #endif - #else - #define LV_USE_OPENGLES_DEBUG 1 /* Enable or disable debug for opengles */ - #endif - #endif -#endif - -/* QNX Screen display and input drivers */ -#ifndef LV_USE_QNX - #ifdef CONFIG_LV_USE_QNX - #define LV_USE_QNX CONFIG_LV_USE_QNX - #else - #define LV_USE_QNX 0 - #endif -#endif -#if LV_USE_QNX - #ifndef LV_QNX_BUF_COUNT - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_QNX_BUF_COUNT - #define LV_QNX_BUF_COUNT CONFIG_LV_QNX_BUF_COUNT - #else - #define LV_QNX_BUF_COUNT 0 - #endif - #else - #define LV_QNX_BUF_COUNT 1 /*1 or 2*/ - #endif - #endif -#endif - -/*================== -* EXAMPLES -*==================*/ - -/*Enable the examples to be built with the library*/ -#ifndef LV_BUILD_EXAMPLES - #ifdef LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_BUILD_EXAMPLES - #define LV_BUILD_EXAMPLES CONFIG_LV_BUILD_EXAMPLES - #else - #define LV_BUILD_EXAMPLES 0 - #endif - #else - #define LV_BUILD_EXAMPLES 1 - #endif -#endif - -/*=================== - * DEMO USAGE - ====================*/ - -/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ -#ifndef LV_USE_DEMO_WIDGETS - #ifdef CONFIG_LV_USE_DEMO_WIDGETS - #define LV_USE_DEMO_WIDGETS CONFIG_LV_USE_DEMO_WIDGETS - #else - #define LV_USE_DEMO_WIDGETS 0 - #endif -#endif - -/*Demonstrate the usage of encoder and keyboard*/ -#ifndef LV_USE_DEMO_KEYPAD_AND_ENCODER - #ifdef CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER - #define LV_USE_DEMO_KEYPAD_AND_ENCODER CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER - #else - #define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 - #endif -#endif - -/*Benchmark your system*/ -#ifndef LV_USE_DEMO_BENCHMARK - #ifdef CONFIG_LV_USE_DEMO_BENCHMARK - #define LV_USE_DEMO_BENCHMARK CONFIG_LV_USE_DEMO_BENCHMARK - #else - #define LV_USE_DEMO_BENCHMARK 0 - #endif -#endif - -/*Render test for each primitives. Requires at least 480x272 display*/ -#ifndef LV_USE_DEMO_RENDER - #ifdef CONFIG_LV_USE_DEMO_RENDER - #define LV_USE_DEMO_RENDER CONFIG_LV_USE_DEMO_RENDER - #else - #define LV_USE_DEMO_RENDER 0 - #endif -#endif - -/*Stress test for LVGL*/ -#ifndef LV_USE_DEMO_STRESS - #ifdef CONFIG_LV_USE_DEMO_STRESS - #define LV_USE_DEMO_STRESS CONFIG_LV_USE_DEMO_STRESS - #else - #define LV_USE_DEMO_STRESS 0 - #endif -#endif - -/*Music player demo*/ -#ifndef LV_USE_DEMO_MUSIC - #ifdef CONFIG_LV_USE_DEMO_MUSIC - #define LV_USE_DEMO_MUSIC CONFIG_LV_USE_DEMO_MUSIC - #else - #define LV_USE_DEMO_MUSIC 0 - #endif -#endif -#if LV_USE_DEMO_MUSIC - #ifndef LV_DEMO_MUSIC_SQUARE - #ifdef CONFIG_LV_DEMO_MUSIC_SQUARE - #define LV_DEMO_MUSIC_SQUARE CONFIG_LV_DEMO_MUSIC_SQUARE - #else - #define LV_DEMO_MUSIC_SQUARE 0 - #endif - #endif - #ifndef LV_DEMO_MUSIC_LANDSCAPE - #ifdef CONFIG_LV_DEMO_MUSIC_LANDSCAPE - #define LV_DEMO_MUSIC_LANDSCAPE CONFIG_LV_DEMO_MUSIC_LANDSCAPE - #else - #define LV_DEMO_MUSIC_LANDSCAPE 0 - #endif - #endif - #ifndef LV_DEMO_MUSIC_ROUND - #ifdef CONFIG_LV_DEMO_MUSIC_ROUND - #define LV_DEMO_MUSIC_ROUND CONFIG_LV_DEMO_MUSIC_ROUND - #else - #define LV_DEMO_MUSIC_ROUND 0 - #endif - #endif - #ifndef LV_DEMO_MUSIC_LARGE - #ifdef CONFIG_LV_DEMO_MUSIC_LARGE - #define LV_DEMO_MUSIC_LARGE CONFIG_LV_DEMO_MUSIC_LARGE - #else - #define LV_DEMO_MUSIC_LARGE 0 - #endif - #endif - #ifndef LV_DEMO_MUSIC_AUTO_PLAY - #ifdef CONFIG_LV_DEMO_MUSIC_AUTO_PLAY - #define LV_DEMO_MUSIC_AUTO_PLAY CONFIG_LV_DEMO_MUSIC_AUTO_PLAY - #else - #define LV_DEMO_MUSIC_AUTO_PLAY 0 - #endif - #endif -#endif - -/*Flex layout demo*/ -#ifndef LV_USE_DEMO_FLEX_LAYOUT - #ifdef CONFIG_LV_USE_DEMO_FLEX_LAYOUT - #define LV_USE_DEMO_FLEX_LAYOUT CONFIG_LV_USE_DEMO_FLEX_LAYOUT - #else - #define LV_USE_DEMO_FLEX_LAYOUT 0 - #endif -#endif - -/*Smart-phone like multi-language demo*/ -#ifndef LV_USE_DEMO_MULTILANG - #ifdef CONFIG_LV_USE_DEMO_MULTILANG - #define LV_USE_DEMO_MULTILANG CONFIG_LV_USE_DEMO_MULTILANG - #else - #define LV_USE_DEMO_MULTILANG 0 - #endif -#endif - -/*Widget transformation demo*/ -#ifndef LV_USE_DEMO_TRANSFORM - #ifdef CONFIG_LV_USE_DEMO_TRANSFORM - #define LV_USE_DEMO_TRANSFORM CONFIG_LV_USE_DEMO_TRANSFORM - #else - #define LV_USE_DEMO_TRANSFORM 0 - #endif -#endif - -/*Demonstrate scroll settings*/ -#ifndef LV_USE_DEMO_SCROLL - #ifdef CONFIG_LV_USE_DEMO_SCROLL - #define LV_USE_DEMO_SCROLL CONFIG_LV_USE_DEMO_SCROLL - #else - #define LV_USE_DEMO_SCROLL 0 - #endif -#endif - -/*Vector graphic demo*/ -#ifndef LV_USE_DEMO_VECTOR_GRAPHIC - #ifdef CONFIG_LV_USE_DEMO_VECTOR_GRAPHIC - #define LV_USE_DEMO_VECTOR_GRAPHIC CONFIG_LV_USE_DEMO_VECTOR_GRAPHIC - #else - #define LV_USE_DEMO_VECTOR_GRAPHIC 0 - #endif -#endif - - - -/*---------------------------------- - * End of parsing lv_conf_template.h - -----------------------------------*/ - -#ifndef __ASSEMBLY__ -LV_EXPORT_CONST_INT(LV_DPI_DEF); -LV_EXPORT_CONST_INT(LV_DRAW_BUF_STRIDE_ALIGN); -LV_EXPORT_CONST_INT(LV_DRAW_BUF_ALIGN); -#endif - -#undef LV_KCONFIG_PRESENT - -/*Set some defines if a dependency is disabled*/ -#if LV_USE_LOG == 0 - #define LV_LOG_LEVEL LV_LOG_LEVEL_NONE - #define LV_LOG_TRACE_MEM 0 - #define LV_LOG_TRACE_TIMER 0 - #define LV_LOG_TRACE_INDEV 0 - #define LV_LOG_TRACE_DISP_REFR 0 - #define LV_LOG_TRACE_EVENT 0 - #define LV_LOG_TRACE_OBJ_CREATE 0 - #define LV_LOG_TRACE_LAYOUT 0 - #define LV_LOG_TRACE_ANIM 0 -#endif /*LV_USE_LOG*/ - -#if LV_USE_SYSMON == 0 - #define LV_USE_PERF_MONITOR 0 - #define LV_USE_MEM_MONITOR 0 -#endif /*LV_USE_SYSMON*/ - -#ifndef LV_USE_LZ4 - #define LV_USE_LZ4 (LV_USE_LZ4_INTERNAL || LV_USE_LZ4_EXTERNAL) -#endif - -#ifndef LV_USE_THORVG - #define LV_USE_THORVG (LV_USE_THORVG_INTERNAL || LV_USE_THORVG_EXTERNAL) -#endif - -#if LV_USE_OS - #if (LV_USE_FREETYPE || LV_USE_THORVG) && LV_DRAW_THREAD_STACK_SIZE < (32 * 1024) - #warning "Increase LV_DRAW_THREAD_STACK_SIZE to at least 32KB for FreeType or ThorVG." - #endif - - #if defined(LV_DRAW_THREAD_STACKSIZE) && !defined(LV_DRAW_THREAD_STACK_SIZE) - #warning "LV_DRAW_THREAD_STACKSIZE was renamed to LV_DRAW_THREAD_STACK_SIZE. Please update lv_conf.h or run menuconfig again." - #define LV_DRAW_THREAD_STACK_SIZE LV_DRAW_THREAD_STACKSIZE - #endif -#endif - -/*If running without lv_conf.h add typedefs with default value*/ -#ifdef LV_CONF_SKIP - #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) /*Disable warnings for Visual Studio*/ - #define _CRT_SECURE_NO_WARNINGS - #endif -#endif /*defined(LV_CONF_SKIP)*/ - -#endif /*LV_CONF_INTERNAL_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/lv_conf_kconfig.h b/software/Power_Pico/Middlewares/LVGL/src/lv_conf_kconfig.h deleted file mode 100644 index 7796e0f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/lv_conf_kconfig.h +++ /dev/null @@ -1,266 +0,0 @@ -/** * @file lv_conf_kconfig.h * Configs that need special handling when LVGL is used with Kconfig */ - -#ifndef LV_CONF_KCONFIG_H -#define LV_CONF_KCONFIG_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef LV_CONF_KCONFIG_EXTERNAL_INCLUDE -# include LV_CONF_KCONFIG_EXTERNAL_INCLUDE -#else - -# ifdef ESP_PLATFORM -# include "sdkconfig.h" -# include "esp_attr.h" -# endif - -# ifdef __NuttX__ -# include -/* - * Make sure version number in Kconfig file is correctly set. - * Mismatch can happen when user manually copy lvgl/Kconfig file to their project, like what NuttX does. - */ -# include "../lv_version.h" - -# if CONFIG_LVGL_VERSION_MAJOR != LVGL_VERSION_MAJOR || CONFIG_LVGL_VERSION_MINOR != LVGL_VERSION_MINOR \ - || CONFIG_LVGL_VERSION_PATCH != LVGL_VERSION_PATCH -# warning "Version mismatch between Kconfig and lvgl/lv_version.h" -# endif -# elif defined(__RTTHREAD__) -# define LV_CONF_INCLUDE_SIMPLE -# include -# endif - -#endif /*LV_CONF_KCONFIG_EXTERNAL_INCLUDE*/ - -/******************* - * LV_USE_STDLIB_MALLOC - *******************/ - -#ifdef CONFIG_LV_USE_BUILTIN_MALLOC -# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN -#elif defined(CONFIG_LV_USE_CLIB_MALLOC) -# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_CLIB -#elif defined(CONFIG_LV_USE_MICROPYTHON_MALLOC) -# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_MICROPYTHON -#elif defined(CONFIG_LV_USE_RTTHREAD_MALLOC) -# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_RTTHREAD -#elif defined (CONFIG_LV_USE_CUSTOM_MALLOC) -# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_CUSTOM -#endif - -/******************* - * LV_USE_STDLIB_STRING - *******************/ - -#ifdef CONFIG_LV_USE_BUILTIN_STRING -# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN -#elif defined(CONFIG_LV_USE_CLIB_STRING) -# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_CLIB -#elif defined(CONFIG_LV_USE_MICROPYTHON_STRING) -# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_MICROPYTHON -#elif defined(CONFIG_LV_USE_RTTHREAD_STRING) -# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_RTTHREAD -#elif defined (CONFIG_LV_USE_CUSTOM_STRING) -# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_CUSTOM -#endif - -/******************* - * LV_USE_STDLIB_SPRINTF - *******************/ - -#ifdef CONFIG_LV_USE_BUILTIN_SPRINTF -# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN -#elif defined(CONFIG_LV_USE_CLIB_SPRINTF) -# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_CLIB -#elif defined(CONFIG_LV_USE_MICROPYTHON_SPRINTF) -# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_MICROPYTHON -#elif defined(CONFIG_LV_USE_RTTHREAD_SPRINTF) -# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_RTTHREAD -#elif defined (CONFIG_LV_USE_CUSTOM_SPRINTF) -# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_CUSTOM -#endif - -/******************* - * LV_MEM_SIZE - *******************/ - -#ifdef CONFIG_LV_MEM_SIZE_KILOBYTES -# if(CONFIG_LV_MEM_SIZE_KILOBYTES < 2) -# error "LV_MEM_SIZE >= 2kB is required" -# endif - -# define CONFIG_LV_MEM_SIZE (CONFIG_LV_MEM_SIZE_KILOBYTES * 1024U) -#endif - -#ifdef CONFIG_LV_MEM_POOL_EXPAND_SIZE_KILOBYTES -# define CONFIG_LV_MEM_POOL_EXPAND_SIZE (CONFIG_LV_MEM_POOL_EXPAND_SIZE_KILOBYTES * 1024U) -#endif - -/*------------------ - * MONITOR POSITION - *-----------------*/ - -#ifdef CONFIG_LV_PERF_MONITOR_ALIGN_TOP_LEFT -# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_LEFT -#elif defined(CONFIG_LV_USE_PERF_MONITOR_ALIGN_TOP_MID) -# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_MID -#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_TOP_RIGHT) -# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_RIGHT -#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_LEFT) -# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_LEFT -#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_MID) -# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_MID -#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_RIGHT) -# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT -#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_LEFT_MID) -# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_LEFT_MID -#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_RIGHT_MID) -# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_RIGHT_MID -#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_CENTER) -# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_CENTER -#endif - -#ifdef CONFIG_LV_MEM_MONITOR_ALIGN_TOP_LEFT -# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_LEFT -#elif defined(CONFIG_LV_USE_MEM_MONITOR_ALIGN_TOP_MID) -# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_MID -#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_TOP_RIGHT) -# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_RIGHT -#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_LEFT) -# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT -#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_MID) -# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_MID -#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_RIGHT) -# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT -#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_LEFT_MID) -# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_LEFT_MID -#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_RIGHT_MID) -# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_RIGHT_MID -#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_CENTER) -# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_CENTER -#endif - -/******************** - * FONT SELECTION - *******************/ - -/** - * NOTE: In Kconfig instead of `LV_DEFAULT_FONT` - * `CONFIG_LV_FONT_DEFAULT_` is defined - * hence the large selection with if-s - */ - -/*------------------ - * DEFAULT FONT - *-----------------*/ -#ifdef CONFIG_LV_FONT_DEFAULT_MONTSERRAT_8 -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_8 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_10) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_10 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_12 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_14) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_14 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_16) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_16 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_18) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_18 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_20) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_20 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_22) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_22 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_24) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_24 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_26 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_28 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_30) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_30 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_32) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_32 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_34) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_34 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_36) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_36 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_38) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_38 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_40) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_40 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_42) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_42 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_44) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_44 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_46) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_46 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_48) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_48 -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12_SUBPX) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_12_subpx -#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28_COMPRESSED) -# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_28_compressed -#elif defined(CONFIG_LV_FONT_DEFAULT_DEJAVU_16_PERSIAN_HEBREW) -# define CONFIG_LV_FONT_DEFAULT &lv_font_dejavu_16_persian_hebrew -#elif defined(CONFIG_LV_FONT_DEFAULT_SIMSUN_14_CJK) -# define CONFIG_LV_FONT_DEFAULT &lv_font_simsun_14_cjk -#elif defined(CONFIG_LV_FONT_DEFAULT_SIMSUN_16_CJK) -# define CONFIG_LV_FONT_DEFAULT &lv_font_simsun_16_cjk -#elif defined(CONFIG_LV_FONT_DEFAULT_UNSCII_8) -# define CONFIG_LV_FONT_DEFAULT &lv_font_unscii_8 -#elif defined(CONFIG_LV_FONT_DEFAULT_UNSCII_16) -# define CONFIG_LV_FONT_DEFAULT &lv_font_unscii_16 -#endif - -/*------------------ - * TEXT ENCODING - *-----------------*/ -#ifdef CONFIG_LV_TXT_ENC_UTF8 -# define CONFIG_LV_TXT_ENC LV_TXT_ENC_UTF8 -#elif defined(CONFIG_LV_TXT_ENC_ASCII) -# define CONFIG_LV_TXT_ENC LV_TXT_ENC_ASCII -#endif - -/*------------------ - * BIDI DIRECTION - *-----------------*/ - -#ifdef CONFIG_LV_BASE_DIR_LTR -# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_LTR -#elif defined(CONFIG_LV_BASE_DIR_RTL) -# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_RTL -#elif defined(CONFIG_LV_BASE_DIR_AUTO) -# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO -#endif - -/*------------------ - * SDL - *-----------------*/ - -#ifdef CONFIG_LV_SDL_RENDER_MODE_PARTIAL -# define CONFIG_LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL -#elif defined(CONFIG_LV_SDL_RENDER_MODE_DIRECT) -# define CONFIG_LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT -#elif defined(CONFIG_LV_SDL_RENDER_MODE_FULL) -# define CONFIG_LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_FULL -#endif - -/*------------------ - * LINUX FBDEV - *-----------------*/ - -#ifdef CONFIG_LV_LINUX_FBDEV_RENDER_MODE_PARTIAL -# define CONFIG_LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL -#elif defined(CONFIG_LV_LINUX_FBDEV_RENDER_MODE_DIRECT) -# define CONFIG_LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT -#elif defined(CONFIG_LV_LINUX_FBDEV_RENDER_MODE_FULL) -# define CONFIG_LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_FULL -#endif - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CONF_KCONFIG_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/lv_init.c b/software/Power_Pico/Middlewares/LVGL/src/lv_init.c deleted file mode 100644 index a019d6e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/lv_init.c +++ /dev/null @@ -1,444 +0,0 @@ -/** - * @file lv_init.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "others/sysmon/lv_sysmon_private.h" -#include "misc/lv_timer_private.h" -#include "misc/lv_profiler_builtin_private.h" -#include "misc/lv_anim_private.h" -#include "draw/lv_image_decoder_private.h" -#include "draw/lv_draw_buf_private.h" -#include "core/lv_refr_private.h" -#include "core/lv_obj_style_private.h" -#include "core/lv_group_private.h" -#include "lv_init.h" -#include "core/lv_global.h" -#include "core/lv_obj.h" -#include "display/lv_display_private.h" -#include "indev/lv_indev_private.h" -#include "layouts/lv_layout_private.h" -#include "libs/bin_decoder/lv_bin_decoder.h" -#include "libs/bmp/lv_bmp.h" -#include "libs/ffmpeg/lv_ffmpeg.h" -#include "libs/freetype/lv_freetype.h" -#include "libs/fsdrv/lv_fsdrv.h" -#include "libs/gif/lv_gif.h" -#include "libs/tjpgd/lv_tjpgd.h" -#include "libs/libjpeg_turbo/lv_libjpeg_turbo.h" -#include "libs/lodepng/lv_lodepng.h" -#include "libs/libpng/lv_libpng.h" -#include "libs/tiny_ttf/lv_tiny_ttf.h" -#include "draw/lv_draw.h" -#include "misc/lv_async.h" -#include "misc/lv_fs_private.h" -#include "widgets/span/lv_span.h" -#include "themes/simple/lv_theme_simple.h" -#include "misc/lv_fs.h" -#include "osal/lv_os_private.h" - -#if LV_USE_DRAW_VGLITE - #include "draw/nxp/vglite/lv_draw_vglite.h" -#endif -#if LV_USE_PXP - #if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP - #include "draw/nxp/pxp/lv_draw_pxp.h" - #endif -#endif -#if LV_USE_DRAW_DAVE2D - #include "draw/renesas/dave2d/lv_draw_dave2d.h" -#endif -#if LV_USE_DRAW_SDL - #include "draw/sdl/lv_draw_sdl.h" -#endif -#if LV_USE_DRAW_VG_LITE - #include "draw/vg_lite/lv_draw_vg_lite.h" -#endif -#if LV_USE_WINDOWS - #include "drivers/windows/lv_windows_context.h" -#endif - -/********************* - * DEFINES - *********************/ -#define lv_initialized LV_GLOBAL_DEFAULT()->inited -#define lv_deinit_in_progress LV_GLOBAL_DEFAULT()->deinit_in_progress - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -#if LV_ENABLE_GLOBAL_CUSTOM == 0 - lv_global_t lv_global; -#endif - -/********************** - * MACROS - **********************/ - -#ifndef LV_GLOBAL_INIT - #define LV_GLOBAL_INIT(__GLOBAL_PTR) lv_global_init((lv_global_t *)(__GLOBAL_PTR)) -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ -static inline void lv_global_init(lv_global_t * global) -{ - LV_ASSERT_NULL(global); - - if(global == NULL) { - LV_LOG_ERROR("lv_global cannot be null"); - return; - } - - lv_memzero(global, sizeof(lv_global_t)); - - lv_ll_init(&(global->disp_ll), sizeof(lv_display_t)); - lv_ll_init(&(global->indev_ll), sizeof(lv_indev_t)); - - global->memory_zero = ZERO_MEM_SENTINEL; - global->style_refresh = true; - global->layout_count = LV_LAYOUT_LAST; - global->style_last_custom_prop_id = (uint32_t)LV_STYLE_LAST_BUILT_IN_PROP; - global->event_last_register_id = LV_EVENT_LAST; - lv_rand_set_seed(0x1234ABCD); - -#ifdef LV_LOG_PRINT_CB - void LV_LOG_PRINT_CB(lv_log_level_t, const char * txt); - global->custom_log_print_cb = LV_LOG_PRINT_CB; -#endif - -#if defined(LV_DRAW_SW_SHADOW_CACHE_SIZE) && LV_DRAW_SW_SHADOW_CACHE_SIZE > 0 - global->sw_shadow_cache.cache_size = -1; - global->sw_shadow_cache.cache_r = -1; -#endif -} - -static inline void lv_cleanup_devices(lv_global_t * global) -{ - LV_ASSERT_NULL(global); - - if(global) { - /* cleanup indev and display */ - lv_ll_clear_custom(&(global->indev_ll), (void (*)(void *)) lv_indev_delete); - lv_ll_clear_custom(&(global->disp_ll), (void (*)(void *)) lv_display_delete); - } -} - -bool lv_is_initialized(void) -{ -#if LV_ENABLE_GLOBAL_CUSTOM - if(LV_GLOBAL_DEFAULT()) return lv_initialized; - else return false; -#else - return lv_initialized; -#endif -} - -void lv_init(void) -{ - /*First initialize Garbage Collection if needed*/ -#ifdef LV_GC_INIT - LV_GC_INIT(); -#endif - - /*Do nothing if already initialized*/ - if(lv_initialized) { - LV_LOG_WARN("lv_init: already initialized"); - return; - } - - LV_LOG_INFO("begin"); - - /*Initialize members of static variable lv_global */ - LV_GLOBAL_INIT(LV_GLOBAL_DEFAULT()); - - lv_mem_init(); - - lv_draw_buf_init_handlers(); - -#if LV_USE_SPAN != 0 - lv_span_stack_init(); -#endif - -#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN - lv_profiler_builtin_config_t profiler_config; - lv_profiler_builtin_config_init(&profiler_config); - lv_profiler_builtin_init(&profiler_config); -#endif - - lv_os_init(); - - lv_timer_core_init(); - - lv_fs_init(); - - lv_layout_init(); - - lv_anim_core_init(); - - lv_group_init(); - - lv_draw_init(); - -#if LV_USE_DRAW_SW - lv_draw_sw_init(); -#endif - -#if LV_USE_DRAW_VGLITE - lv_draw_vglite_init(); -#endif - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP - lv_draw_pxp_init(); -#endif -#endif - -#if LV_USE_DRAW_DAVE2D - lv_draw_dave2d_init(); -#endif - -#if LV_USE_DRAW_SDL - lv_draw_sdl_init(); -#endif - -#if LV_USE_WINDOWS - lv_windows_platform_init(); -#endif - - lv_obj_style_init(); - - /*Initialize the screen refresh system*/ - lv_refr_init(); - -#if LV_USE_SYSMON - lv_sysmon_builtin_init(); -#endif - - lv_image_decoder_init(LV_CACHE_DEF_SIZE, LV_IMAGE_HEADER_CACHE_DEF_CNT); - lv_bin_decoder_init(); /*LVGL built-in binary image decoder*/ - -#if LV_USE_DRAW_VG_LITE - lv_draw_vg_lite_init(); -#endif - - /*Test if the IDE has UTF-8 encoding*/ - const char * txt = "Á"; - - uint8_t * txt_u8 = (uint8_t *)txt; - if(txt_u8[0] != 0xc3 || txt_u8[1] != 0x81 || txt_u8[2] != 0x00) { - LV_LOG_WARN("The strings have no UTF-8 encoding. Non-ASCII characters won't be displayed."); - } - - uint32_t endianness_test = 0x11223344; - uint8_t * endianness_test_p = (uint8_t *) &endianness_test; - bool big_endian = endianness_test_p[0] == 0x11; - - if(big_endian) { - LV_ASSERT_MSG(LV_BIG_ENDIAN_SYSTEM == 1, - "It's a big endian system but LV_BIG_ENDIAN_SYSTEM is not enabled in lv_conf.h"); - } - else { - LV_ASSERT_MSG(LV_BIG_ENDIAN_SYSTEM == 0, - "It's a little endian system but LV_BIG_ENDIAN_SYSTEM is enabled in lv_conf.h"); - } - -#if LV_USE_ASSERT_MEM_INTEGRITY - LV_LOG_WARN("Memory integrity checks are enabled via LV_USE_ASSERT_MEM_INTEGRITY which makes LVGL much slower"); -#endif - -#if LV_USE_ASSERT_OBJ - LV_LOG_WARN("Object sanity checks are enabled via LV_USE_ASSERT_OBJ which makes LVGL much slower"); -#endif - -#if LV_USE_ASSERT_STYLE - LV_LOG_WARN("Style sanity checks are enabled that uses more RAM"); -#endif - -#if LV_LOG_LEVEL == LV_LOG_LEVEL_TRACE - LV_LOG_WARN("Log level is set to 'Trace' which makes LVGL much slower"); -#endif - -#if LV_USE_FS_FATFS != '\0' - lv_fs_fatfs_init(); -#endif - -#if LV_USE_FS_STDIO != '\0' - lv_fs_stdio_init(); -#endif - -#if LV_USE_FS_POSIX != '\0' - lv_fs_posix_init(); -#endif - -#if LV_USE_FS_WIN32 != '\0' - lv_fs_win32_init(); -#endif - -#if LV_USE_FS_MEMFS - lv_fs_memfs_init(); -#endif - -#if LV_USE_FS_LITTLEFS - lv_fs_littlefs_init(); -#endif - -#if LV_USE_FS_ARDUINO_ESP_LITTLEFS - lv_fs_arduino_esp_littlefs_init(); -#endif - -#if LV_USE_FS_ARDUINO_SD - lv_fs_arduino_sd_init(); -#endif - -#if LV_USE_LODEPNG - lv_lodepng_init(); -#endif - -#if LV_USE_LIBPNG - lv_libpng_init(); -#endif - -#if LV_USE_TJPGD - lv_tjpgd_init(); -#endif - -#if LV_USE_LIBJPEG_TURBO - lv_libjpeg_turbo_init(); -#endif - -#if LV_USE_BMP - lv_bmp_init(); -#endif - - /*Make FFMPEG last because the last converter will be checked first and - *it's superior to any other */ -#if LV_USE_FFMPEG - lv_ffmpeg_init(); -#endif - -#if LV_USE_FREETYPE - /*Init freetype library*/ - lv_freetype_init(LV_FREETYPE_CACHE_FT_GLYPH_CNT); -#endif - - lv_initialized = true; - - LV_LOG_TRACE("finished"); -} - -void lv_deinit(void) -{ - /*Do nothing if already deinit*/ - if(!lv_initialized) { - LV_LOG_WARN("lv_deinit: already deinit!"); - return; - } - - if(lv_deinit_in_progress) return; - - lv_deinit_in_progress = true; - -#if LV_USE_SYSMON - lv_sysmon_builtin_deinit(); -#endif - - lv_display_set_default(NULL); - - lv_cleanup_devices(LV_GLOBAL_DEFAULT()); - -#if LV_USE_SPAN != 0 - lv_span_stack_deinit(); -#endif - -#if LV_USE_DRAW_SW - lv_draw_sw_deinit(); -#endif - -#if LV_USE_FREETYPE - lv_freetype_uninit(); -#endif - -#if LV_USE_THEME_DEFAULT - lv_theme_default_deinit(); -#endif - -#if LV_USE_THEME_SIMPLE - lv_theme_simple_deinit(); -#endif - -#if LV_USE_THEME_MONO - lv_theme_mono_deinit(); -#endif - - lv_image_decoder_deinit(); - - lv_refr_deinit(); - - lv_obj_style_deinit(); - -#if LV_USE_PXP -#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP - lv_draw_pxp_deinit(); -#endif -#endif - -#if LV_USE_DRAW_VGLITE - lv_draw_vglite_deinit(); -#endif - -#if LV_USE_DRAW_VG_LITE - lv_draw_vg_lite_deinit(); -#endif - -#if LV_USE_DRAW_SW - lv_draw_sw_deinit(); -#endif - - lv_draw_deinit(); - - lv_group_deinit(); - - lv_anim_core_deinit(); - - lv_layout_deinit(); - - lv_fs_deinit(); - - lv_timer_core_deinit(); - -#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN - lv_profiler_builtin_uninit(); -#endif - -#if LV_USE_OBJ_ID && LV_USE_OBJ_ID_BUILTIN - lv_objid_builtin_destroy(); -#endif - - lv_mem_deinit(); - - lv_initialized = false; - - LV_LOG_INFO("lv_deinit done"); - -#if LV_USE_LOG - lv_log_register_print_cb(NULL); -#endif - -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/lv_init.h b/software/Power_Pico/Middlewares/LVGL/src/lv_init.h deleted file mode 100644 index 0815142..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/lv_init.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @file lv_init.h - * - */ - -#ifndef LV_INIT_H -#define LV_INIT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_conf_internal.h" -#include "misc/lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize LVGL library. - * Should be called before any other LVGL related function. - */ -void lv_init(void); - -/** - * Deinit the 'lv' library - */ -void lv_deinit(void); - -/** - * Returns whether the 'lv' library is currently initialized - */ -bool lv_is_initialized(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_INIT_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/lvgl.h b/software/Power_Pico/Middlewares/LVGL/src/lvgl.h deleted file mode 100644 index f49fcc7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/lvgl.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file lvgl.h - * This file exists only to be compatible with Arduino's library structure - */ - -#ifndef LVGL_SRC_H -#define LVGL_SRC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lvgl.h" -#include "lv_conf_internal.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /* LVGL_SRC_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/lvgl_private.h b/software/Power_Pico/Middlewares/LVGL/src/lvgl_private.h deleted file mode 100644 index 8ab64e9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/lvgl_private.h +++ /dev/null @@ -1,125 +0,0 @@ -/** - * @file lvgl_private.h - * - */ - -#ifndef LVGL_PRIVATE_H -#define LVGL_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "core/lv_global.h" - -#include "display/lv_display_private.h" -#include "indev/lv_indev_private.h" -#include "misc/lv_text_private.h" -#include "misc/cache/lv_cache_entry_private.h" -#include "misc/cache/lv_cache_private.h" -#include "layouts/lv_layout_private.h" -#include "stdlib/lv_mem_private.h" -#include "others/file_explorer/lv_file_explorer_private.h" -#include "others/sysmon/lv_sysmon_private.h" -#include "others/monkey/lv_monkey_private.h" -#include "others/ime/lv_ime_pinyin_private.h" -#include "others/fragment/lv_fragment_private.h" -#include "others/observer/lv_observer_private.h" -#include "libs/qrcode/lv_qrcode_private.h" -#include "libs/barcode/lv_barcode_private.h" -#include "libs/gif/lv_gif_private.h" -#include "draw/lv_draw_triangle_private.h" -#include "draw/lv_draw_private.h" -#include "draw/lv_draw_rect_private.h" -#include "draw/lv_draw_image_private.h" -#include "draw/lv_image_decoder_private.h" -#include "draw/lv_draw_label_private.h" -#include "draw/lv_draw_vector_private.h" -#include "draw/lv_draw_buf_private.h" -#include "draw/lv_draw_mask_private.h" -#include "draw/sw/lv_draw_sw_gradient_private.h" -#include "draw/sw/lv_draw_sw_private.h" -#include "draw/sw/lv_draw_sw_mask_private.h" -#include "draw/sw/blend/lv_draw_sw_blend_private.h" -#include "drivers/libinput/lv_xkb_private.h" -#include "drivers/libinput/lv_libinput_private.h" -#include "font/lv_font_fmt_txt_private.h" -#include "themes/lv_theme_private.h" -#include "core/lv_refr_private.h" -#include "core/lv_obj_style_private.h" -#include "core/lv_obj_private.h" -#include "core/lv_obj_scroll_private.h" -#include "core/lv_obj_draw_private.h" -#include "core/lv_obj_class_private.h" -#include "core/lv_group_private.h" -#include "core/lv_obj_event_private.h" -#include "misc/lv_timer_private.h" -#include "misc/lv_area_private.h" -#include "misc/lv_fs_private.h" -#include "misc/lv_profiler_builtin_private.h" -#include "misc/lv_event_private.h" -#include "misc/lv_bidi_private.h" -#include "misc/lv_rb_private.h" -#include "misc/lv_style_private.h" -#include "misc/lv_color_op_private.h" -#include "misc/lv_anim_private.h" -#include "widgets/msgbox/lv_msgbox_private.h" -#include "widgets/buttonmatrix/lv_buttonmatrix_private.h" -#include "widgets/slider/lv_slider_private.h" -#include "widgets/switch/lv_switch_private.h" -#include "widgets/calendar/lv_calendar_private.h" -#include "widgets/imagebutton/lv_imagebutton_private.h" -#include "widgets/bar/lv_bar_private.h" -#include "widgets/image/lv_image_private.h" -#include "widgets/textarea/lv_textarea_private.h" -#include "widgets/table/lv_table_private.h" -#include "widgets/checkbox/lv_checkbox_private.h" -#include "widgets/roller/lv_roller_private.h" -#include "widgets/win/lv_win_private.h" -#include "widgets/keyboard/lv_keyboard_private.h" -#include "widgets/line/lv_line_private.h" -#include "widgets/animimage/lv_animimage_private.h" -#include "widgets/dropdown/lv_dropdown_private.h" -#include "widgets/menu/lv_menu_private.h" -#include "widgets/chart/lv_chart_private.h" -#include "widgets/button/lv_button_private.h" -#include "widgets/scale/lv_scale_private.h" -#include "widgets/led/lv_led_private.h" -#include "widgets/arc/lv_arc_private.h" -#include "widgets/tileview/lv_tileview_private.h" -#include "widgets/spinbox/lv_spinbox_private.h" -#include "widgets/span/lv_span_private.h" -#include "widgets/label/lv_label_private.h" -#include "widgets/canvas/lv_canvas_private.h" -#include "widgets/tabview/lv_tabview_private.h" -#include "tick/lv_tick_private.h" -#include "stdlib/builtin/lv_tlsf_private.h" -#include "libs/rlottie/lv_rlottie_private.h" -#include "libs/ffmpeg/lv_ffmpeg_private.h" -#include "widgets/lottie/lv_lottie_private.h" -#include "osal/lv_os_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LVGL_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache.c b/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache.c deleted file mode 100644 index 0518ab5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache.c +++ /dev/null @@ -1,348 +0,0 @@ -/** -* @file lv_cache.c -* -*/ - -/********************* - * INCLUDES - *********************/ -#include "lv_cache.h" -#include "../../stdlib/lv_sprintf.h" -#include "../lv_assert.h" -#include "lv_cache_entry_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void cache_drop_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data); -static bool cache_evict_one_internal_no_lock(lv_cache_t * cache, void * user_data); -static lv_cache_entry_t * cache_add_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data); -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_cache_t * lv_cache_create(const lv_cache_class_t * cache_class, - size_t node_size, size_t max_size, - lv_cache_ops_t ops) -{ - lv_cache_t * cache = cache_class->alloc_cb(); - LV_ASSERT_MALLOC(cache); - - cache->clz = cache_class; - cache->node_size = node_size; - cache->max_size = max_size; - cache->size = 0; - cache->ops = ops; - - if(cache->clz->init_cb(cache) == false) { - LV_LOG_ERROR("Cache init failed"); - lv_free(cache); - return NULL; - } - - lv_mutex_init(&cache->lock); - - return cache; -} - -void lv_cache_destroy(lv_cache_t * cache, void * user_data) -{ - LV_ASSERT_NULL(cache); - - lv_mutex_lock(&cache->lock); - cache->clz->destroy_cb(cache, user_data); - lv_mutex_unlock(&cache->lock); - lv_mutex_delete(&cache->lock); - lv_free(cache); -} - -lv_cache_entry_t * lv_cache_acquire(lv_cache_t * cache, const void * key, void * user_data) -{ - LV_ASSERT_NULL(cache); - LV_ASSERT_NULL(key); - - LV_PROFILER_BEGIN; - - lv_mutex_lock(&cache->lock); - - if(cache->size == 0) { - lv_mutex_unlock(&cache->lock); - - LV_PROFILER_END; - return NULL; - } - - lv_cache_entry_t * entry = cache->clz->get_cb(cache, key, user_data); - if(entry != NULL) { - lv_cache_entry_acquire_data(entry); - } - lv_mutex_unlock(&cache->lock); - - LV_PROFILER_END; - return entry; -} -void lv_cache_release(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data) -{ - LV_ASSERT_NULL(entry); - - LV_PROFILER_BEGIN; - - lv_mutex_lock(&cache->lock); - lv_cache_entry_release_data(entry, user_data); - - if(lv_cache_entry_get_ref(entry) == 0 && lv_cache_entry_is_invalid(entry)) { - cache->ops.free_cb(lv_cache_entry_get_data(entry), user_data); - lv_cache_entry_delete(entry); - } - lv_mutex_unlock(&cache->lock); - - LV_PROFILER_END; -} -lv_cache_entry_t * lv_cache_add(lv_cache_t * cache, const void * key, void * user_data) -{ - LV_ASSERT_NULL(cache); - LV_ASSERT_NULL(key); - - LV_PROFILER_BEGIN; - - lv_mutex_lock(&cache->lock); - if(cache->max_size == 0) { - lv_mutex_unlock(&cache->lock); - - LV_PROFILER_END; - return NULL; - } - - lv_cache_entry_t * entry = cache_add_internal_no_lock(cache, key, user_data); - if(entry != NULL) { - lv_cache_entry_acquire_data(entry); - } - lv_mutex_unlock(&cache->lock); - - LV_PROFILER_END; - return entry; -} -lv_cache_entry_t * lv_cache_acquire_or_create(lv_cache_t * cache, const void * key, void * user_data) -{ - LV_ASSERT_NULL(cache); - LV_ASSERT_NULL(key); - - LV_PROFILER_BEGIN; - - lv_mutex_lock(&cache->lock); - lv_cache_entry_t * entry = NULL; - - if(cache->size != 0) { - entry = cache->clz->get_cb(cache, key, user_data); - if(entry != NULL) { - lv_cache_entry_acquire_data(entry); - lv_mutex_unlock(&cache->lock); - - LV_PROFILER_END; - return entry; - } - } - - if(cache->max_size == 0) { - lv_mutex_unlock(&cache->lock); - - LV_PROFILER_END; - return NULL; - } - - entry = cache_add_internal_no_lock(cache, key, user_data); - if(entry == NULL) { - lv_mutex_unlock(&cache->lock); - - LV_PROFILER_END; - return NULL; - } - bool create_res = cache->ops.create_cb(lv_cache_entry_get_data(entry), user_data); - if(create_res == false) { - cache->clz->remove_cb(cache, entry, user_data); - lv_cache_entry_delete(entry); - entry = NULL; - } - else { - lv_cache_entry_acquire_data(entry); - } - lv_mutex_unlock(&cache->lock); - - LV_PROFILER_END; - return entry; -} -void lv_cache_reserve(lv_cache_t * cache, uint32_t reserved_size, void * user_data) -{ - LV_ASSERT_NULL(cache); - - LV_PROFILER_BEGIN; - - for(lv_cache_reserve_cond_res_t reserve_cond_res = cache->clz->reserve_cond_cb(cache, NULL, reserved_size, user_data); - reserve_cond_res == LV_CACHE_RESERVE_COND_NEED_VICTIM; - reserve_cond_res = cache->clz->reserve_cond_cb(cache, NULL, reserved_size, user_data)) - cache_evict_one_internal_no_lock(cache, user_data); - - LV_PROFILER_END; -} -void lv_cache_drop(lv_cache_t * cache, const void * key, void * user_data) -{ - LV_ASSERT_NULL(cache); - LV_ASSERT_NULL(key); - - LV_PROFILER_BEGIN; - - lv_mutex_lock(&cache->lock); - cache_drop_internal_no_lock(cache, key, user_data); - lv_mutex_unlock(&cache->lock); - - LV_PROFILER_END; -} -bool lv_cache_evict_one(lv_cache_t * cache, void * user_data) -{ - LV_ASSERT_NULL(cache); - - LV_PROFILER_BEGIN; - - lv_mutex_lock(&cache->lock); - bool res = cache_evict_one_internal_no_lock(cache, user_data); - lv_mutex_unlock(&cache->lock); - - LV_PROFILER_END; - return res; -} -void lv_cache_drop_all(lv_cache_t * cache, void * user_data) -{ - LV_ASSERT_NULL(cache); - - LV_PROFILER_BEGIN; - - lv_mutex_lock(&cache->lock); - cache->clz->drop_all_cb(cache, user_data); - lv_mutex_unlock(&cache->lock); - - LV_PROFILER_END; -} - -void lv_cache_set_max_size(lv_cache_t * cache, size_t max_size, void * user_data) -{ - LV_UNUSED(user_data); - cache->max_size = max_size; -} -size_t lv_cache_get_max_size(lv_cache_t * cache, void * user_data) -{ - LV_UNUSED(user_data); - return cache->max_size; -} -size_t lv_cache_get_size(lv_cache_t * cache, void * user_data) -{ - LV_UNUSED(user_data); - return cache->size; -} -size_t lv_cache_get_free_size(lv_cache_t * cache, void * user_data) -{ - LV_UNUSED(user_data); - return cache->max_size - cache->size; -} -bool lv_cache_is_enabled(lv_cache_t * cache) -{ - return cache->max_size > 0; -} -void lv_cache_set_compare_cb(lv_cache_t * cache, lv_cache_compare_cb_t compare_cb, void * user_data) -{ - LV_UNUSED(user_data); - cache->ops.compare_cb = compare_cb; -} -void lv_cache_set_create_cb(lv_cache_t * cache, lv_cache_create_cb_t alloc_cb, void * user_data) -{ - LV_UNUSED(user_data); - cache->ops.create_cb = alloc_cb; -} -void lv_cache_set_free_cb(lv_cache_t * cache, lv_cache_free_cb_t free_cb, void * user_data) -{ - LV_UNUSED(user_data); - cache->ops.free_cb = free_cb; -} -void lv_cache_set_name(lv_cache_t * cache, const char * name) -{ - if(cache == NULL) return; - cache->name = name; -} -const char * lv_cache_get_name(lv_cache_t * cache) -{ - return cache->name; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void cache_drop_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data) -{ - lv_cache_entry_t * entry = cache->clz->get_cb(cache, key, user_data); - if(entry == NULL) { - return; - } - - if(lv_cache_entry_get_ref(entry) == 0) { - cache->clz->remove_cb(cache, entry, user_data); - cache->ops.free_cb(lv_cache_entry_get_data(entry), user_data); - lv_cache_entry_delete(entry); - } - else { - lv_cache_entry_set_invalid(entry, true); - cache->clz->remove_cb(cache, entry, user_data); - } -} - -static bool cache_evict_one_internal_no_lock(lv_cache_t * cache, void * user_data) -{ - lv_cache_entry_t * victim = cache->clz->get_victim_cb(cache, user_data); - - if(victim == NULL) { - LV_LOG_ERROR("No victim found"); - return false; - } - - cache->clz->remove_cb(cache, victim, user_data); - cache->ops.free_cb(lv_cache_entry_get_data(victim), user_data); - lv_cache_entry_delete(victim); - return true; -} - -static lv_cache_entry_t * cache_add_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data) -{ - lv_cache_reserve_cond_res_t reserve_cond_res = cache->clz->reserve_cond_cb(cache, key, 0, user_data); - if(reserve_cond_res == LV_CACHE_RESERVE_COND_TOO_LARGE) { - LV_LOG_ERROR("data %p is too large that exceeds max size (%" LV_PRIu32 ")", key, cache->max_size); - return NULL; - } - - for(; reserve_cond_res == LV_CACHE_RESERVE_COND_NEED_VICTIM; - reserve_cond_res = cache->clz->reserve_cond_cb(cache, key, 0, user_data)) - if(cache_evict_one_internal_no_lock(cache, user_data) == false) - return NULL; - - lv_cache_entry_t * entry = cache->clz->add_cb(cache, key, user_data); - - return entry; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache.h b/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache.h deleted file mode 100644 index ab488be..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache.h +++ /dev/null @@ -1,230 +0,0 @@ -/** - * @file lv_cache.h - * - */ - -#ifndef LV_CACHE_H -#define LV_CACHE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_cache_entry.h" -#include "lv_cache_private.h" -#include "../lv_types.h" - -#include "lv_cache_lru_rb.h" - -#include "lv_image_cache.h" -#include "lv_image_header_cache.h" -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a cache object with the given parameters. - * @param cache_class The class of the cache. Currently only support one two builtin classes: - * - lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy. - * - lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy. - * @param node_size The node size is the size of the data stored in the cache.. - * @param max_size The max size is the maximum amount of memory or count that the cache can hold. - * - lv_cache_class_lru_rb_count: max_size is the maximum count of nodes in the cache. - * - lv_cache_class_lru_rb_size: max_size is the maximum size of the cache in bytes. - * @param ops A set of operations that can be performed on the cache. See lv_cache_ops_t for details. - * @return Returns a pointer to the created cache object on success, `NULL` on error. - */ -lv_cache_t * lv_cache_create(const lv_cache_class_t * cache_class, - size_t node_size, size_t max_size, - lv_cache_ops_t ops); - -/** - * Destroy a cache object. - * @param cache The cache object pointer to destroy. - * @param user_data A user data pointer that will be passed to the free callback. - */ -void lv_cache_destroy(lv_cache_t * cache, void * user_data); - -/** - * Acquire a cache entry with the given key. If entry not in cache, it will return `NULL` (not found). - * If the entry is found, it's priority will be changed by the cache's policy. And the `lv_cache_entry_t::ref_cnt` will be incremented. - * @param cache The cache object pointer to acquire the entry. - * @param key The key of the entry to acquire. - * @param user_data A user data pointer that will be passed to the create callback. - * @return Returns a pointer to the acquired cache entry on success with `lv_cache_entry_t::ref_cnt` incremented, `NULL` on error. - */ -lv_cache_entry_t * lv_cache_acquire(lv_cache_t * cache, const void * key, void * user_data); - -/** - * Acquire a cache entry with the given key. If the entry is not in the cache, it will create a new entry with the given key. - * If the entry is found, it's priority will be changed by the cache's policy. And the `lv_cache_entry_t::ref_cnt` will be incremented. - * If you want to use this API to simplify the code, you should provide a `lv_cache_ops_t::create_cb` that creates a new entry with the given key. - * This API is a combination of lv_cache_acquire() and lv_cache_add(). The effect is the same as calling lv_cache_acquire() and lv_cache_add() separately. - * And the internal impact on cache is also consistent with these two APIs. - * @param cache The cache object pointer to acquire the entry. - * @param key The key of the entry to acquire or create. - * @param user_data A user data pointer that will be passed to the create callback. - * @return Returns a pointer to the acquired or created cache entry on success with `lv_cache_entry_t::ref_cnt` incremented, `NULL` on error. - */ -lv_cache_entry_t * lv_cache_acquire_or_create(lv_cache_t * cache, const void * key, void * user_data); - -/** - * Add a new cache entry with the given key and data. If the cache is full, the cache's policy will be used to evict an entry. - * @param cache The cache object pointer to add the entry. - * @param key The key of the entry to add. - * @param user_data A user data pointer that will be passed to the create callback. - * @return Returns a pointer to the added cache entry on success with `lv_cache_entry_t::ref_cnt` incremented, `NULL` on error. - */ -lv_cache_entry_t * lv_cache_add(lv_cache_t * cache, const void * key, void * user_data); - -/** - * Release a cache entry. The `lv_cache_entry_t::ref_cnt` will be decremented. If the `lv_cache_entry_t::ref_cnt` is zero, it will issue an error. - * If the entry passed to this function is the last reference to the data and the entry is marked as invalid, the cache's policy will be used to evict the entry. - * @param cache The cache object pointer to release the entry. - * @param entry The cache entry pointer to release. - * @param user_data A user data pointer that will be passed to the free callback. - */ -void lv_cache_release(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data); - -/** - * Reserve a certain amount of memory/count in the cache. This function is useful when you want to reserve a certain amount of memory/count in advance, - * for example, when you know that you will need it later. - * When the current cache size is max than the reserved size, the function will evict entries until the reserved size is reached. - * @param cache The cache object pointer to reserve. - * @param reserved_size The amount of memory/count to reserve. - * @param user_data A user data pointer that will be passed to the free callback. - */ -void lv_cache_reserve(lv_cache_t * cache, uint32_t reserved_size, void * user_data); - -/** - * Drop a cache entry with the given key. If the entry is not in the cache, nothing will happen to it. - * If the entry is found, it will be removed from the cache and its data will be freed when the last reference to it is released. - * @note The data will not be freed immediately but when the last reference to it is released. But this entry will not be found by lv_cache_acquire(). - * If you want cache a same key again, you should use lv_cache_add() or lv_cache_acquire_or_create(). - * @param cache The cache object pointer to drop the entry. - * @param key The key of the entry to drop. - * @param user_data A user data pointer that will be passed to the free callback. - */ -void lv_cache_drop(lv_cache_t * cache, const void * key, void * user_data); - -/** - * Drop all cache entries. All entries will be removed from the cache and their data will be freed when the last reference to them is released. - * @note If some entries are still referenced by other objects, it will issue an error. And this case shouldn't happen in normal cases.. - * @param cache The cache object pointer to drop all entries. - * @param user_data A user data pointer that will be passed to the free callback. - */ -void lv_cache_drop_all(lv_cache_t * cache, void * user_data); - -/** - * Evict one entry from the cache. The eviction policy will be used to select the entry to evict. - * @param cache The cache object pointer to evict an entry. - * @param user_data A user data pointer that will be passed to the free callback. - * @return Returns true if an entry is evicted, false if no entry is evicted. - */ -bool lv_cache_evict_one(lv_cache_t * cache, void * user_data); - -/** - * Set the maximum size of the cache. - * If the current cache size is greater than the new maximum size, the cache's policy will be used to evict entries until the new maximum size is reached. - * If set to 0, the cache will be disabled. - * @note But this behavior will happen only new entries are added to the cache. - * @param cache The cache object pointer to set the maximum size. - * @param max_size The new maximum size of the cache. - * @param user_data A user data pointer that will be passed to the free callback. - */ -void lv_cache_set_max_size(lv_cache_t * cache, size_t max_size, void * user_data); - -/** - * Get the maximum size of the cache. - * @param cache The cache object pointer to get the maximum size. - * @param user_data A user data pointer that will be passed to the free callback. - * @return Returns the maximum size of the cache. - */ -size_t lv_cache_get_max_size(lv_cache_t * cache, void * user_data); - -/** - * Get the current size of the cache. - * @param cache The cache object pointer to get the current size. - * @param user_data A user data pointer that will be passed to the free callback. - * @return Returns the current size of the cache. - */ -size_t lv_cache_get_size(lv_cache_t * cache, void * user_data); - -/** - * Get the free size of the cache. - * @param cache The cache object pointer to get the free size. - * @param user_data A user data pointer that will be passed to the free callback. - * @return Returns the free size of the cache. - */ -size_t lv_cache_get_free_size(lv_cache_t * cache, void * user_data); - -/** - * Return true if the cache is enabled. - * Disabled cache means that when the max_size of the cache is 0. In this case, all cache operations will be no-op. - * @param cache The cache object pointer to check if it's disabled. - * @return Returns true if the cache is enabled, false otherwise. - */ -bool lv_cache_is_enabled(lv_cache_t * cache); - -/** - * Set the compare callback of the cache. - * @param cache The cache object pointer to set the compare callback. - * @param compare_cb The compare callback to set. - * @param user_data A user data pointer. - */ -void lv_cache_set_compare_cb(lv_cache_t * cache, lv_cache_compare_cb_t compare_cb, void * user_data); - -/** - * Set the create callback of the cache. - * @param cache The cache object pointer to set the create callback. - * @param alloc_cb The create callback to set. - * @param user_data A user data pointer. - */ -void lv_cache_set_create_cb(lv_cache_t * cache, lv_cache_create_cb_t alloc_cb, void * user_data); - -/** - * Set the free callback of the cache. - * @param cache The cache object pointer to set the free callback. - * @param free_cb The free callback to set. - * @param user_data A user data pointer. - */ -void lv_cache_set_free_cb(lv_cache_t * cache, lv_cache_free_cb_t free_cb, void * user_data); - -/** - * Give a name for a cache object. Only the pointer of the string is saved. - * @param cache The cache object pointer to set the name. - * @param name The name of the cache. - */ -void lv_cache_set_name(lv_cache_t * cache, const char * name); - -/** - * Get the name of a cache object. - * @param cache The cache object pointer to get the name. - * @return Returns the name of the cache. - */ -const char * lv_cache_get_name(lv_cache_t * cache); - -/************************* - * GLOBAL VARIABLES - *************************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /* LV_CACHE_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_entry.c b/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_entry.c deleted file mode 100644 index e0cc664..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_entry.c +++ /dev/null @@ -1,167 +0,0 @@ -/** -* @file lv_cache_entry.c -* - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_cache_entry.h" -#include "../../stdlib/lv_sprintf.h" -#include "../lv_assert.h" -#include "lv_cache.h" -#include "lv_cache_entry_private.h" -#include "lv_cache_private.h" -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -struct lv_cache_entry_t { - const lv_cache_t * cache; - int32_t ref_cnt; - uint32_t node_size; - - bool is_invalid; -}; -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_cache_entry_reset_ref(lv_cache_entry_t * entry) -{ - LV_ASSERT_NULL(entry); - entry->ref_cnt = 0; -} -void lv_cache_entry_inc_ref(lv_cache_entry_t * entry) -{ - LV_ASSERT_NULL(entry); - entry->ref_cnt++; -} -void lv_cache_entry_dec_ref(lv_cache_entry_t * entry) -{ - LV_ASSERT_NULL(entry); - entry->ref_cnt--; - if(entry->ref_cnt < 0) { - LV_LOG_WARN("ref_cnt(%" LV_PRIu32 ") < 0", entry->ref_cnt); - entry->ref_cnt = 0; - } -} -int32_t lv_cache_entry_get_ref(lv_cache_entry_t * entry) -{ - LV_ASSERT_NULL(entry); - return entry->ref_cnt; -} -uint32_t lv_cache_entry_get_node_size(lv_cache_entry_t * entry) -{ - return entry->node_size; -} -void lv_cache_entry_set_node_size(lv_cache_entry_t * entry, uint32_t node_size) -{ - LV_ASSERT_NULL(entry); - entry->node_size = node_size; -} -void lv_cache_entry_set_invalid(lv_cache_entry_t * entry, bool is_invalid) -{ - LV_ASSERT_NULL(entry); - entry->is_invalid = is_invalid; -} -bool lv_cache_entry_is_invalid(lv_cache_entry_t * entry) -{ - LV_ASSERT_NULL(entry); - return entry->is_invalid; -} -void * lv_cache_entry_get_data(lv_cache_entry_t * entry) -{ - LV_ASSERT_NULL(entry); - return (uint8_t *)entry - entry->node_size; -} -void * lv_cache_entry_acquire_data(lv_cache_entry_t * entry) -{ - LV_ASSERT_NULL(entry); - - lv_cache_entry_inc_ref(entry); - return lv_cache_entry_get_data(entry); -} -void lv_cache_entry_release_data(lv_cache_entry_t * entry, void * user_data) -{ - LV_UNUSED(user_data); - - LV_ASSERT_NULL(entry); - if(lv_cache_entry_get_ref(entry) == 0) { - LV_LOG_ERROR("ref_cnt(%" LV_PRIu32 ") == 0", entry->ref_cnt); - return; - } - - lv_cache_entry_dec_ref(entry); -} -lv_cache_entry_t * lv_cache_entry_get_entry(void * data, const uint32_t node_size) -{ - LV_ASSERT_NULL(data); - return (lv_cache_entry_t *)((uint8_t *)data + node_size); -} -void lv_cache_entry_set_cache(lv_cache_entry_t * entry, const lv_cache_t * cache) -{ - LV_ASSERT_NULL(entry); - entry->cache = cache; -} -const lv_cache_t * lv_cache_entry_get_cache(const lv_cache_entry_t * entry) -{ - LV_ASSERT_NULL(entry); - return entry->cache; -} - -uint32_t lv_cache_entry_get_size(const uint32_t node_size) -{ - return node_size + sizeof(lv_cache_entry_t); -} -lv_cache_entry_t * lv_cache_entry_alloc(const uint32_t node_size, const lv_cache_t * cache) -{ - void * res = lv_malloc_zeroed(lv_cache_entry_get_size(node_size)); - LV_ASSERT_MALLOC(res) - if(res == NULL) { - LV_LOG_ERROR("malloc failed"); - return NULL; - } - lv_cache_entry_t * entry = (lv_cache_entry_t *)res; - lv_cache_entry_init(entry, cache, node_size); - return (lv_cache_entry_t *)((uint8_t *)entry + node_size); -} -void lv_cache_entry_init(lv_cache_entry_t * entry, const lv_cache_t * cache, const uint32_t node_size) -{ - LV_ASSERT_NULL(entry); - LV_ASSERT_NULL(cache); - - entry->cache = cache; - entry->node_size = node_size; - entry->ref_cnt = 0; - entry->is_invalid = false; -} -void lv_cache_entry_delete(lv_cache_entry_t * entry) -{ - LV_ASSERT_NULL(entry); - - void * data = lv_cache_entry_get_data(entry); - lv_free(data); -} -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_entry.h b/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_entry.h deleted file mode 100644 index 947f71d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_entry.h +++ /dev/null @@ -1,114 +0,0 @@ -/** -* @file lv_cache_entry.h -* - */ - -#ifndef LV_CACHE_ENTRY_H -#define LV_CACHE_ENTRY_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../osal/lv_os.h" -#include "../lv_types.h" -#include "lv_cache_private.h" -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Get the size of a cache entry. - * @param node_size The size of the node in the cache. - * @return The size of the cache entry. - */ -uint32_t lv_cache_entry_get_size(const uint32_t node_size); - -/** - * Get the reference count of a cache entry. - * @param entry The cache entry to get the reference count of. - * @return The reference count of the cache entry. - */ -int32_t lv_cache_entry_get_ref(lv_cache_entry_t * entry); - -/** - * Get the node size of a cache entry. Which is the same size with lv_cache_entry_get_size()'s node_size parameter. - * @param entry The cache entry to get the node size of. - * @return The node size of the cache entry. - */ -uint32_t lv_cache_entry_get_node_size(lv_cache_entry_t * entry); - -/** - * Check if a cache entry is invalid. - * @param entry The cache entry to check. - * @return True: the cache entry is invalid. False: the cache entry is valid. - */ -bool lv_cache_entry_is_invalid(lv_cache_entry_t * entry); - -/** - * Get the data of a cache entry. - * @param entry The cache entry to get the data of. - * @return The pointer to the data of the cache entry. - */ -void * lv_cache_entry_get_data(lv_cache_entry_t * entry); - -/** - * Get the cache instance of a cache entry. - * @param entry The cache entry to get the cache instance of. - * @return The pointer to the cache instance of the cache entry. - */ -const lv_cache_t * lv_cache_entry_get_cache(const lv_cache_entry_t * entry); - -/** - * Get the cache entry of a data. The data should be allocated by the cache instance. - * @param data The data to get the cache entry of. - * @param node_size The size of the node in the cache. - * @return The pointer to the cache entry of the data. - */ -lv_cache_entry_t * lv_cache_entry_get_entry(void * data, const uint32_t node_size); - -/** - * Allocate a cache entry. - * @param node_size The size of the node in the cache. - * @param cache The cache instance to allocate the cache entry from. - * @return The pointer to the allocated cache entry. - */ -lv_cache_entry_t * lv_cache_entry_alloc(const uint32_t node_size, const lv_cache_t * cache); - -/** - * Initialize a cache entry. - * @param entry The cache entry to initialize. - * @param cache The cache instance to allocate the cache entry from. - * @param node_size The size of the node in the cache. - */ -void lv_cache_entry_init(lv_cache_entry_t * entry, const lv_cache_t * cache, const uint32_t node_size); - -/** - * Deallocate a cache entry. And the data of the cache entry will be freed. - * @param entry The cache entry to deallocate. - */ -void lv_cache_entry_delete(lv_cache_entry_t * entry); -/************************* - * GLOBAL VARIABLES - *************************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CACHE_ENTRY_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_entry_private.h b/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_entry_private.h deleted file mode 100644 index f8d41bb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_entry_private.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @file lv_cache_entry_private.h - * - */ - -#ifndef LV_CACHE_ENTRY_PRIVATE_H -#define LV_CACHE_ENTRY_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_types.h" -#include "../../osal/lv_os.h" -#include "../lv_profiler.h" -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ -void lv_cache_entry_reset_ref(lv_cache_entry_t * entry); -void lv_cache_entry_inc_ref(lv_cache_entry_t * entry); -void lv_cache_entry_dec_ref(lv_cache_entry_t * entry); -void lv_cache_entry_set_node_size(lv_cache_entry_t * entry, uint32_t node_size); -void lv_cache_entry_set_invalid(lv_cache_entry_t * entry, bool is_invalid); -void lv_cache_entry_set_cache(lv_cache_entry_t * entry, const lv_cache_t * cache); -void * lv_cache_entry_acquire_data(lv_cache_entry_t * entry); -void lv_cache_entry_release_data(lv_cache_entry_t * entry, void * user_data); -/************************* - * GLOBAL VARIABLES - *************************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /* LV_CACHE_ENTRY_PRIVATE_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_lru_rb.c b/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_lru_rb.c deleted file mode 100644 index 0a73102..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_lru_rb.c +++ /dev/null @@ -1,462 +0,0 @@ -/** -* @file lv_cache_lru_rb.c -* -*/ - -/***************************************************************************\ -* * -* ┏ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ┓ * -* ┏ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ┌ ─ ─ ─ ┐ * -* ┌ ─ ─ ─ ─ ─ ─ ─ ┃ ┃ Cache insert ┃ * -* ┃ RB Tree │ │Hitting│ head * -* └ ─ ─ ─ ─ ─ ─ ─ ┃ ┃ ─ ─ ─ ─ ┃ * -* ┃ ┌─┬─┬─┬─┐ ┌─────┐ * -* ┌──│◄│B│►│ │─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┃─ ─ ╋ ─ ─▶│ B │ ┃ * -* ┃ │ └─┴─┴─┴─┘ └──▲──┘ * -* │ │ ┃ ┃ │ ┃ * -* ┃ │ │ ┌──┴──┐ * -* │ └──────┐ ┌ ─┃─ ─ ╋ ─ ─▶│ E │ ┃ * -* ┃ ▼ ┌ ─ ─│─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ └──▲──┘ * -* ┌─┬─┬─┬─┐ ▼ │ ┃ ┃ │ ┃ * -* ┃│◄│A│►│ │─ ─ ┘ ┌─┬─┬─┬─┐ │ ┌──┴──┐ * -* └─┴─┴─┴─┘ ┌───│◄│D│►│ │─ ─ ─ ─ ─ ─│─ ╋ ┐ ┃ ─ ▶│ A │ ┌ ─ ─ ─ ─ ─ ┐ ┃ * -* ┃ │ └─┴─┴─┴─┘ └──▲──┘ LRU * -* │ │ │ ┃ │ ┃ │ │ Cache │ ┃ * -* ┃ ▼ └──────┐ ┌──┴──┐ ─ ─ ─ ─ ─ ─ * -* ┌─┬─┬─┬─┐ ▼ │ ┃ └ ─┃─ ─ ▶│ D │ ┃ * -* ┃ │◄│C│►│ │─ ─ ┌─┬─┬─┬─┐ └──▲──┘ * -* └─┴─┴─┴─┘ │ │◄│E│►│ │─ ┘ ┃ ┃ │ ┃ * -* ┃ └─┴─┴─┴─┘ ┌──┴──┐ * -* │ │ ─ ╋ ─ ─┃─ ─ ▶│ C │ ┃ * -* ┃ ─ ─ ─ ─ ┼ ─ ─ ┘ └──▲──┘ * -* ▼ ┃ ┃ ┌ ─ ─│─ ─ ┐ ┃ * -* ┃ ┌─┬─┬─┬─┐ ┌──┴──┐ * -* │◄│F│►│ │─ ─┃─ ─ ╋ ─ ┼▶│ F │ │ ┃ * -* ┃ └─┴─┴─┴─┘ └─────┘ * -* ┃ ┃ └ ─ ─ ─ ─ ┘ ┃ * -* ┃ remove * -* ┃ ┃ tail ┃ * -* ┗ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ * -* * -\***************************************************************************/ - -/********************* - * INCLUDES - *********************/ -#include "lv_cache_lru_rb.h" -#include "../../stdlib/lv_sprintf.h" -#include "../../stdlib/lv_string.h" -#include "../lv_ll.h" -#include "../lv_rb_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef uint32_t (get_data_size_cb_t)(const void * data); - -struct lv_lru_rb_t { - lv_cache_t cache; - - lv_rb_t rb; - lv_ll_t ll; - - get_data_size_cb_t * get_data_size_cb; -}; -typedef struct lv_lru_rb_t lv_lru_rb_t_; -/********************** - * STATIC PROTOTYPES - **********************/ - -static void * alloc_cb(void); -static bool init_cnt_cb(lv_cache_t * cache); -static bool init_size_cb(lv_cache_t * cache); -static void destroy_cb(lv_cache_t * cache, void * user_data); - -static lv_cache_entry_t * get_cb(lv_cache_t * cache, const void * key, void * user_data); -static lv_cache_entry_t * add_cb(lv_cache_t * cache, const void * key, void * user_data); -static void remove_cb(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data); -static void drop_cb(lv_cache_t * cache, const void * key, void * user_data); -static void drop_all_cb(lv_cache_t * cache, void * user_data); -static lv_cache_entry_t * get_victim_cb(lv_cache_t * cache, void * user_data); -static lv_cache_reserve_cond_res_t reserve_cond_cb(lv_cache_t * cache, const void * key, size_t reserved_size, - void * user_data); - -static void * alloc_new_node(lv_lru_rb_t_ * lru, void * key, void * user_data); -inline static void ** get_lru_node(lv_lru_rb_t_ * lru, lv_rb_node_t * node); - -static uint32_t cnt_get_data_size_cb(const void * data); -static uint32_t size_get_data_size_cb(const void * data); - -/********************** - * GLOBAL VARIABLES - **********************/ -const lv_cache_class_t lv_cache_class_lru_rb_count = { - .alloc_cb = alloc_cb, - .init_cb = init_cnt_cb, - .destroy_cb = destroy_cb, - - .get_cb = get_cb, - .add_cb = add_cb, - .remove_cb = remove_cb, - .drop_cb = drop_cb, - .drop_all_cb = drop_all_cb, - .get_victim_cb = get_victim_cb, - .reserve_cond_cb = reserve_cond_cb -}; - -const lv_cache_class_t lv_cache_class_lru_rb_size = { - .alloc_cb = alloc_cb, - .init_cb = init_size_cb, - .destroy_cb = destroy_cb, - - .get_cb = get_cb, - .add_cb = add_cb, - .remove_cb = remove_cb, - .drop_cb = drop_cb, - .drop_all_cb = drop_all_cb, - .get_victim_cb = get_victim_cb, - .reserve_cond_cb = reserve_cond_cb -}; -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ -static void * alloc_new_node(lv_lru_rb_t_ * lru, void * key, void * user_data) -{ - LV_UNUSED(user_data); - - LV_ASSERT_NULL(lru); - LV_ASSERT_NULL(key); - - if(lru == NULL || key == NULL) { - return NULL; - } - - lv_rb_node_t * node = lv_rb_insert(&lru->rb, key); - if(node == NULL) - goto FAILED_HANDLER2; - - void * data = node->data; - lv_cache_entry_t * entry = lv_cache_entry_get_entry(data, lru->cache.node_size); - lv_memcpy(data, key, lru->cache.node_size); - - void * lru_node = lv_ll_ins_head(&lru->ll); - if(lru_node == NULL) - goto FAILED_HANDLER1; - - lv_memcpy(lru_node, &node, sizeof(void *)); - lv_memcpy(get_lru_node(lru, node), &lru_node, sizeof(void *)); - - lv_cache_entry_init(entry, &lru->cache, lru->cache.node_size); - goto FAILED_HANDLER2; - -FAILED_HANDLER1: - lv_rb_drop_node(&lru->rb, node); - node = NULL; -FAILED_HANDLER2: - return node; -} - -inline static void ** get_lru_node(lv_lru_rb_t_ * lru, lv_rb_node_t * node) -{ - return (void **)((char *)node->data + lru->rb.size - sizeof(void *)); -} - -static void * alloc_cb(void) -{ - void * res = lv_malloc(sizeof(lv_lru_rb_t_)); - LV_ASSERT_MALLOC(res); - if(res == NULL) { - LV_LOG_ERROR("malloc failed"); - return NULL; - } - - lv_memzero(res, sizeof(lv_lru_rb_t_)); - return res; -} - -static bool init_cnt_cb(lv_cache_t * cache) -{ - lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; - - LV_ASSERT_NULL(lru->cache.ops.compare_cb); - LV_ASSERT_NULL(lru->cache.ops.free_cb); - LV_ASSERT(lru->cache.node_size > 0); - - if(lru->cache.node_size <= 0 || lru->cache.ops.compare_cb == NULL || lru->cache.ops.free_cb == NULL) { - return false; - } - - /*add void* to store the ll node pointer*/ - if(!lv_rb_init(&lru->rb, lru->cache.ops.compare_cb, lv_cache_entry_get_size(lru->cache.node_size) + sizeof(void *))) { - return false; - } - lv_ll_init(&lru->ll, sizeof(void *)); - - lru->get_data_size_cb = cnt_get_data_size_cb; - - return true; -} - -static bool init_size_cb(lv_cache_t * cache) -{ - lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; - - LV_ASSERT_NULL(lru->cache.ops.compare_cb); - LV_ASSERT_NULL(lru->cache.ops.free_cb); - LV_ASSERT(lru->cache.node_size > 0); - - if(lru->cache.node_size <= 0 || lru->cache.ops.compare_cb == NULL || lru->cache.ops.free_cb == NULL) { - return false; - } - - /*add void* to store the ll node pointer*/ - if(!lv_rb_init(&lru->rb, lru->cache.ops.compare_cb, lv_cache_entry_get_size(lru->cache.node_size) + sizeof(void *))) { - return false; - } - lv_ll_init(&lru->ll, sizeof(void *)); - - lru->get_data_size_cb = size_get_data_size_cb; - - return true; -} - -static void destroy_cb(lv_cache_t * cache, void * user_data) -{ - LV_UNUSED(user_data); - - lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; - - LV_ASSERT_NULL(lru); - - if(lru == NULL) { - return; - } - - cache->clz->drop_all_cb(cache, user_data); -} - -static lv_cache_entry_t * get_cb(lv_cache_t * cache, const void * key, void * user_data) -{ - LV_UNUSED(user_data); - - lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; - - LV_ASSERT_NULL(lru); - LV_ASSERT_NULL(key); - - if(lru == NULL || key == NULL) { - return NULL; - } - - /*try the first ll node first*/ - void * head = lv_ll_get_head(&lru->ll); - if(head) { - lv_rb_node_t * node = *(lv_rb_node_t **)head; - void * data = node->data; - lv_cache_entry_t * entry = lv_cache_entry_get_entry(data, cache->node_size); - if(lru->cache.ops.compare_cb(data, key) == 0) { - return entry; - } - } - - lv_rb_node_t * node = lv_rb_find(&lru->rb, key); - /*cache hit*/ - if(node) { - void * lru_node = *get_lru_node(lru, node); - head = lv_ll_get_head(&lru->ll); - lv_ll_move_before(&lru->ll, lru_node, head); - - lv_cache_entry_t * entry = lv_cache_entry_get_entry(node->data, cache->node_size); - return entry; - } - return NULL; -} - -static lv_cache_entry_t * add_cb(lv_cache_t * cache, const void * key, void * user_data) -{ - LV_UNUSED(user_data); - - lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; - - LV_ASSERT_NULL(lru); - LV_ASSERT_NULL(key); - - if(lru == NULL || key == NULL) { - return NULL; - } - - lv_rb_node_t * new_node = alloc_new_node(lru, (void *)key, user_data); - if(new_node == NULL) { - return NULL; - } - - lv_cache_entry_t * entry = lv_cache_entry_get_entry(new_node->data, cache->node_size); - - cache->size += lru->get_data_size_cb(key); - - return entry; -} - -static void remove_cb(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data) -{ - LV_UNUSED(user_data); - - lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; - - LV_ASSERT_NULL(lru); - LV_ASSERT_NULL(entry); - - if(lru == NULL || entry == NULL) { - return; - } - - void * data = lv_cache_entry_get_data(entry); - lv_rb_node_t * node = lv_rb_find(&lru->rb, data); - if(node == NULL) { - return; - } - - void * lru_node = *get_lru_node(lru, node); - lv_rb_remove_node(&lru->rb, node); - lv_ll_remove(&lru->ll, lru_node); - lv_free(lru_node); - - cache->size -= lru->get_data_size_cb(data); -} - -static void drop_cb(lv_cache_t * cache, const void * key, void * user_data) -{ - lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; - - LV_ASSERT_NULL(lru); - LV_ASSERT_NULL(key); - - if(lru == NULL || key == NULL) { - return; - } - - lv_rb_node_t * node = lv_rb_find(&lru->rb, key); - if(node == NULL) { - return; - } - - void * data = node->data; - - lru->cache.ops.free_cb(data, user_data); - cache->size -= lru->get_data_size_cb(data); - - lv_cache_entry_t * entry = lv_cache_entry_get_entry(data, cache->node_size); - void * lru_node = *get_lru_node(lru, node); - - lv_rb_remove_node(&lru->rb, node); - lv_cache_entry_delete(entry); - - lv_ll_remove(&lru->ll, lru_node); - lv_free(lru_node); -} - -static void drop_all_cb(lv_cache_t * cache, void * user_data) -{ - lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; - - LV_ASSERT_NULL(lru); - - if(lru == NULL) { - return; - } - - uint32_t used_cnt = 0; - lv_rb_node_t ** node; - LV_LL_READ(&lru->ll, node) { - /*free user handled data and do other clean up*/ - void * search_key = (*node)->data; - lv_cache_entry_t * entry = lv_cache_entry_get_entry(search_key, cache->node_size); - if(lv_cache_entry_get_ref(entry) == 0) { - lru->cache.ops.free_cb(search_key, user_data); - } - else { - LV_LOG_WARN("entry (%p) is still referenced (%" LV_PRId32 ")", (void *)entry, lv_cache_entry_get_ref(entry)); - used_cnt++; - } - } - if(used_cnt > 0) { - LV_LOG_WARN("%" LV_PRId32 " entries are still referenced", used_cnt); - } - - lv_rb_destroy(&lru->rb); - lv_ll_clear(&lru->ll); - - cache->size = 0; -} - -static lv_cache_entry_t * get_victim_cb(lv_cache_t * cache, void * user_data) -{ - LV_UNUSED(user_data); - - lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; - - LV_ASSERT_NULL(lru); - - lv_rb_node_t ** tail; - LV_LL_READ_BACK(&lru->ll, tail) { - lv_rb_node_t * tail_node = *tail; - lv_cache_entry_t * entry = lv_cache_entry_get_entry(tail_node->data, cache->node_size); - if(lv_cache_entry_get_ref(entry) == 0) { - return entry; - } - } - - return NULL; -} - -static lv_cache_reserve_cond_res_t reserve_cond_cb(lv_cache_t * cache, const void * key, size_t reserved_size, - void * user_data) -{ - LV_UNUSED(user_data); - - lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; - - LV_ASSERT_NULL(lru); - - if(lru == NULL) { - return LV_CACHE_RESERVE_COND_ERROR; - } - - uint32_t data_size = key ? lru->get_data_size_cb(key) : 0; - if(data_size > lru->cache.max_size) { - LV_LOG_ERROR("data size (%" LV_PRIu32 ") is larger than max size (%" LV_PRIu32 ")", data_size, lru->cache.max_size); - return LV_CACHE_RESERVE_COND_TOO_LARGE; - } - - return cache->size + reserved_size + data_size > lru->cache.max_size - ? LV_CACHE_RESERVE_COND_NEED_VICTIM - : LV_CACHE_RESERVE_COND_OK; -} - -static uint32_t cnt_get_data_size_cb(const void * data) -{ - LV_UNUSED(data); - return 1; -} - -static uint32_t size_get_data_size_cb(const void * data) -{ - lv_cache_slot_size_t * slot = (lv_cache_slot_size_t *)data; - return slot->size; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_lru_rb.h b/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_lru_rb.h deleted file mode 100644 index c0f44f3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_lru_rb.h +++ /dev/null @@ -1,44 +0,0 @@ -/** -* @file lv_cache_lru_rb.h -* -*/ - -#ifndef LV_CACHE_LRU_RB_H -#define LV_CACHE_LRU_RB_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_cache_entry.h" -#include "lv_cache_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/************************* - * GLOBAL VARIABLES - *************************/ -LV_ATTRIBUTE_EXTERN_DATA extern const lv_cache_class_t lv_cache_class_lru_rb_count; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_cache_class_t lv_cache_class_lru_rb_size; -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CACHE_LRU_RB_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_private.h b/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_private.h deleted file mode 100644 index c8ac249..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_cache_private.h +++ /dev/null @@ -1,193 +0,0 @@ -/** -* @file lv_cache_private.h -* -*/ - -#ifndef LV_CACHE_PRIVATE_H -#define LV_CACHE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_types.h" -#include "../../osal/lv_os.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * The result of the cache reserve condition callback - */ -typedef enum { - LV_CACHE_RESERVE_COND_OK, /**< The condition is met and no entries need to be evicted */ - LV_CACHE_RESERVE_COND_TOO_LARGE, /**< The condition is not met and the reserve size is too large */ - LV_CACHE_RESERVE_COND_NEED_VICTIM, /**< The condition is not met and a victim is needed to be evicted */ - LV_CACHE_RESERVE_COND_ERROR /**< An error occurred while checking the condition */ -} lv_cache_reserve_cond_res_t; - -struct lv_cache_ops_t; -struct lv_cache_t; -struct lv_cache_class_t; -struct lv_cache_entry_t; - -typedef struct lv_cache_ops_t lv_cache_ops_t; -typedef struct lv_cache_t lv_cache_t; -typedef struct lv_cache_class_t lv_cache_class_t; -typedef struct lv_cache_entry_t lv_cache_entry_t; - -typedef int8_t lv_cache_compare_res_t; -typedef bool (*lv_cache_create_cb_t)(void * node, void * user_data); -typedef void (*lv_cache_free_cb_t)(void * node, void * user_data); -typedef lv_cache_compare_res_t (*lv_cache_compare_cb_t)(const void * a, const void * b); - -/** - * The cache instance allocation function, used by the cache class to allocate memory for cache instances. - * @return It should return a pointer to the allocated instance. - */ -typedef void * (*lv_cache_alloc_cb_t)(void); - -/** - * The cache instance initialization function, used by the cache class to initialize the cache instance. - * @return It should return true if the initialization is successful, false otherwise. - */ -typedef bool (*lv_cache_init_cb_t)(lv_cache_t * cache); - -/** - * The cache instance destruction function, used by the cache class to destroy the cache instance. - */ -typedef void (*lv_cache_destroy_cb_t)(lv_cache_t * cache, void * user_data); - -/** - * The cache get function, used by the cache class to get a cache entry by its key. - * @return `NULL` if the key is not found. - */ -typedef lv_cache_entry_t * (*lv_cache_get_cb_t)(lv_cache_t * cache, const void * key, void * user_data); - -/** - * The cache add function, used by the cache class to add a cache entry with a given key. - * This function only cares about how to add the entry, it doesn't check if the entry already exists and doesn't care about is it a victim or not. - * @return the added cache entry, or NULL if the entry is not added. - */ -typedef lv_cache_entry_t * (*lv_cache_add_cb_t)(lv_cache_t * cache, const void * key, void * user_data); - -/** - * The cache remove function, used by the cache class to remove a cache entry from the cache but doesn't free the memory.. - * This function only cares about how to remove the entry, it doesn't care about is it a victim or not. - */ -typedef void (*lv_cache_remove_cb_t)(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data); - -/** - * The cache drop function, used by the cache class to remove a cache entry from the cache and free the memory. - */ -typedef void (*lv_cache_drop_cb_t)(lv_cache_t * cache, const void * key, void * user_data); - -/** - * The cache drop all function, used by the cache class to remove all cache entries from the cache and free the memory. - */ -typedef void (*lv_cache_drop_all_cb_t)(lv_cache_t * cache, void * user_data); - -/** - * The cache get victim function, used by the cache class to get a victim entry to be evicted. - */ -typedef lv_cache_entry_t * (*lv_cache_get_victim_cb)(lv_cache_t * cache, void * user_data); - -/** - * The cache reserve condition function, used by the cache class to check if a new entry can be added to the cache without exceeding its maximum size. - * See lv_cache_reserve_cond_res_t for the possible results. - */ -typedef lv_cache_reserve_cond_res_t (*lv_cache_reserve_cond_cb)(lv_cache_t * cache, const void * key, size_t size, - void * user_data); - -/** - * The cache operations struct - */ -struct lv_cache_ops_t { - lv_cache_compare_cb_t compare_cb; /**< Compare function for keys */ - lv_cache_create_cb_t create_cb; /**< Create function for nodes */ - lv_cache_free_cb_t free_cb; /**< Free function for nodes */ -}; - -/** - * The cache entry struct - */ -struct lv_cache_t { - const lv_cache_class_t * clz; /**< Cache class. There are two built-in classes: - * - lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy. - * - lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy. */ - - uint32_t node_size; /**< Size of a node */ - - uint32_t max_size; /**< Maximum size of the cache */ - uint32_t size; /**< Current size of the cache */ - - lv_cache_ops_t ops; /**< Cache operations struct lv_cache_ops_t */ - - lv_mutex_t lock; /**< Cache lock used to protect the cache in multithreading environments */ - - const char * name; /**< Name of the cache */ -}; - -/** - * Cache class struct for building custom cache classes - * - * Examples: - * - lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy. - * - lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy. - */ -struct lv_cache_class_t { - lv_cache_alloc_cb_t alloc_cb; /**< The allocation function for cache entries */ - lv_cache_init_cb_t init_cb; /**< The initialization function for cache entries */ - lv_cache_destroy_cb_t destroy_cb; /**< The destruction function for cache entries */ - - lv_cache_get_cb_t get_cb; /**< The get function for cache entries */ - lv_cache_add_cb_t add_cb; /**< The add function for cache entries */ - lv_cache_remove_cb_t remove_cb; /**< The remove function for cache entries */ - lv_cache_drop_cb_t drop_cb; /**< The drop function for cache entries */ - lv_cache_drop_all_cb_t drop_all_cb; /**< The drop all function for cache entries */ - lv_cache_get_victim_cb get_victim_cb; /**< The get victim function for cache entries */ - lv_cache_reserve_cond_cb reserve_cond_cb; /**< The reserve condition function for cache entries */ -}; - -/*----------------- - * Cache entry slot - *----------------*/ - -struct lv_cache_slot_size_t; - -typedef struct lv_cache_slot_size_t lv_cache_slot_size_t; - -/** - * Cache entry slot struct - * - * To add new fields to the cache entry, add them to a new struct and add it to the first - * field of the cache data struct. And this one is a size slot for the cache entry. - */ -struct lv_cache_slot_size_t { - size_t size; -}; -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/************************* - * GLOBAL VARIABLES - *************************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CACHE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_image_cache.c b/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_image_cache.c deleted file mode 100644 index c2ca435..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_image_cache.c +++ /dev/null @@ -1,145 +0,0 @@ -/** -* @file lv_image_cache.c -* - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../draw/lv_image_decoder_private.h" -#include "../lv_assert.h" -#include "../../core/lv_global.h" - -#include "lv_image_cache.h" -#include "lv_image_header_cache.h" - -/********************* - * DEFINES - *********************/ - -#define CACHE_NAME "IMAGE" - -#define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache) -#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static lv_cache_compare_res_t image_cache_compare_cb(const lv_image_cache_data_t * lhs, - const lv_image_cache_data_t * rhs); -static void image_cache_free_cb(lv_image_cache_data_t * entry, void * user_data); - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_result_t lv_image_cache_init(uint32_t size) -{ - if(img_cache_p != NULL) { - return LV_RESULT_OK; - } - - img_cache_p = lv_cache_create(&lv_cache_class_lru_rb_size, - sizeof(lv_image_cache_data_t), size, (lv_cache_ops_t) { - .compare_cb = (lv_cache_compare_cb_t) image_cache_compare_cb, - .create_cb = NULL, - .free_cb = (lv_cache_free_cb_t) image_cache_free_cb, - }); - - lv_cache_set_name(img_cache_p, CACHE_NAME); - return img_cache_p != NULL ? LV_RESULT_OK : LV_RESULT_INVALID; -} - -void lv_image_cache_resize(uint32_t new_size, bool evict_now) -{ - lv_cache_set_max_size(img_cache_p, new_size, NULL); - if(evict_now) { - lv_cache_reserve(img_cache_p, new_size, NULL); - } -} - -void lv_image_cache_drop(const void * src) -{ - /*If user invalidate image, the header cache should be invalidated too.*/ - lv_image_header_cache_drop(src); - - if(src == NULL) { - lv_cache_drop_all(img_cache_p, NULL); - return; - } - - lv_image_cache_data_t search_key = { - .src = src, - .src_type = lv_image_src_get_type(src), - }; - - lv_cache_drop(img_cache_p, &search_key, NULL); -} - -bool lv_image_cache_is_enabled(void) -{ - return lv_cache_is_enabled(img_cache_p); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -inline static lv_cache_compare_res_t image_cache_common_compare(const void * lhs_src, lv_image_src_t lhs_src_type, - const void * rhs_src, lv_image_src_t rhs_src_type) -{ - if(lhs_src_type == rhs_src_type) { - if(lhs_src_type == LV_IMAGE_SRC_FILE) { - int32_t cmp_res = lv_strcmp(lhs_src, rhs_src); - if(cmp_res != 0) { - return cmp_res > 0 ? 1 : -1; - } - } - else if(lhs_src_type == LV_IMAGE_SRC_VARIABLE) { - if(lhs_src != rhs_src) { - return lhs_src > rhs_src ? 1 : -1; - } - } - return 0; - } - return lhs_src_type > rhs_src_type ? 1 : -1; -} - -static lv_cache_compare_res_t image_cache_compare_cb( - const lv_image_cache_data_t * lhs, - const lv_image_cache_data_t * rhs) -{ - return image_cache_common_compare(lhs->src, lhs->src_type, rhs->src, rhs->src_type); -} - -static void image_cache_free_cb(lv_image_cache_data_t * entry, void * user_data) -{ - LV_UNUSED(user_data); - - /* Destroy the decoded draw buffer if necessary. */ - lv_draw_buf_t * decoded = (lv_draw_buf_t *)entry->decoded; - if(lv_draw_buf_has_flag(decoded, LV_IMAGE_FLAGS_ALLOCATED)) { - lv_draw_buf_destroy(decoded); - } - - /*Free the duplicated file name*/ - if(entry->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)entry->src); -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_image_cache.h b/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_image_cache.h deleted file mode 100644 index 1900b98..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_image_cache.h +++ /dev/null @@ -1,71 +0,0 @@ -/** -* @file lv_image_cache.h -* - */ - -#ifndef LV_IMAGE_CACHE_H -#define LV_IMAGE_CACHE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" -#include "../lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize image cache. - * @param size size of the cache in bytes. - * @return LV_RESULT_OK: initialization succeeded, LV_RESULT_INVALID: failed. - */ -lv_result_t lv_image_cache_init(uint32_t size); - -/** - * Resize image cache. - * If set to 0, the cache will be disabled. - * @param new_size new size of the cache in bytes. - * @param evict_now true: evict the images should be removed by the eviction policy, false: wait for the next cache cleanup. - */ -void lv_image_cache_resize(uint32_t new_size, bool evict_now); - -/** - * Invalidate image cache. Use NULL to invalidate all images. - * @param src pointer to an image source. - */ -void lv_image_cache_drop(const void * src); - -/** - * Return true if the image cache is enabled. - * @return true: enabled, false: disabled. - */ -bool lv_image_cache_is_enabled(void); - -/************************* - * GLOBAL VARIABLES - *************************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_IMAGE_CACHE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_image_header_cache.c b/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_image_header_cache.c deleted file mode 100644 index ef124fb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_image_header_cache.c +++ /dev/null @@ -1,133 +0,0 @@ -/** -* @file lv_image_header_cache.c -* - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../draw/lv_image_decoder_private.h" -#include "../lv_assert.h" -#include "../../core/lv_global.h" - -#include "lv_image_header_cache.h" - -/********************* - * DEFINES - *********************/ - -#define CACHE_NAME "IMAGE_HEADER" - -#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static lv_cache_compare_res_t image_header_cache_compare_cb(const lv_image_header_cache_data_t * lhs, - const lv_image_header_cache_data_t * rhs); -static void image_header_cache_free_cb(lv_image_header_cache_data_t * entry, void * user_data); - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_result_t lv_image_header_cache_init(uint32_t count) -{ - if(img_header_cache_p != NULL) { - return LV_RESULT_OK; - } - - img_header_cache_p = lv_cache_create(&lv_cache_class_lru_rb_count, - sizeof(lv_image_header_cache_data_t), count, (lv_cache_ops_t) { - .compare_cb = (lv_cache_compare_cb_t) image_header_cache_compare_cb, - .create_cb = NULL, - .free_cb = (lv_cache_free_cb_t) image_header_cache_free_cb - }); - - lv_cache_set_name(img_header_cache_p, CACHE_NAME); - return img_header_cache_p != NULL ? LV_RESULT_OK : LV_RESULT_INVALID; -} - -void lv_image_header_cache_resize(uint32_t count, bool evict_now) -{ - lv_cache_set_max_size(img_header_cache_p, count, NULL); - if(evict_now) { - lv_cache_reserve(img_header_cache_p, count, NULL); - } -} - -void lv_image_header_cache_drop(const void * src) -{ - if(src == NULL) { - lv_cache_drop_all(img_header_cache_p, NULL); - return; - } - - lv_image_header_cache_data_t search_key = { - .src = src, - .src_type = lv_image_src_get_type(src), - }; - - lv_cache_drop(img_header_cache_p, &search_key, NULL); -} - -bool lv_image_header_cache_is_enabled(void) -{ - return lv_cache_is_enabled(img_header_cache_p); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -inline static lv_cache_compare_res_t image_cache_common_compare(const void * lhs_src, lv_image_src_t lhs_src_type, - const void * rhs_src, lv_image_src_t rhs_src_type) -{ - if(lhs_src_type == rhs_src_type) { - if(lhs_src_type == LV_IMAGE_SRC_FILE) { - int32_t cmp_res = lv_strcmp(lhs_src, rhs_src); - if(cmp_res != 0) { - return cmp_res > 0 ? 1 : -1; - } - } - else if(lhs_src_type == LV_IMAGE_SRC_VARIABLE) { - if(lhs_src != rhs_src) { - return lhs_src > rhs_src ? 1 : -1; - } - } - return 0; - } - return lhs_src_type > rhs_src_type ? 1 : -1; -} - -static lv_cache_compare_res_t image_header_cache_compare_cb( - const lv_image_header_cache_data_t * lhs, - const lv_image_header_cache_data_t * rhs) -{ - return image_cache_common_compare(lhs->src, lhs->src_type, rhs->src, rhs->src_type); -} - -static void image_header_cache_free_cb(lv_image_header_cache_data_t * entry, void * user_data) -{ - LV_UNUSED(user_data); /*Unused*/ - - if(entry->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)entry->src); -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_image_header_cache.h b/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_image_header_cache.h deleted file mode 100644 index bcecfaf..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/cache/lv_image_header_cache.h +++ /dev/null @@ -1,72 +0,0 @@ -/** -* @file lv_image_header_cache.h -* - */ - -#ifndef LV_IMAGE_HEADER_CACHE_H -#define LV_IMAGE_HEADER_CACHE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" -#include "../lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize image header cache. - * @param count initial size of the cache in count of image headers. - * @return LV_RESULT_OK: initialization succeeded, LV_RESULT_INVALID: failed. - */ -lv_result_t lv_image_header_cache_init(uint32_t count); - -/** - * Resize image header cache. - * If set to 0, the cache is disabled. - * @param count new max count of cached image headers. - * @param evict_now true: evict the image headers should be removed by the eviction policy, false: wait for the next cache cleanup. - */ -void lv_image_header_cache_resize(uint32_t count, bool evict_now); - -/** - * Invalidate image header cache. Use NULL to invalidate all image headers. - * It's also automatically called when an image is invalidated. - * @param src pointer to an image source. - */ -void lv_image_header_cache_drop(const void * src); - -/** - * Return true if the image header cache is enabled. - * @return true: enabled, false: disabled. - */ -bool lv_image_header_cache_is_enabled(void); - -/************************* - * GLOBAL VARIABLES - *************************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_IMAGE_HEADER_CACHE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim.c deleted file mode 100644 index 8fc9867..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim.c +++ /dev/null @@ -1,707 +0,0 @@ -/** - * @file lv_anim.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_anim_private.h" - -#include "../core/lv_global.h" -#include "../tick/lv_tick.h" -#include "lv_assert.h" -#include "lv_timer.h" -#include "lv_math.h" -#include "../stdlib/lv_mem.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define LV_ANIM_RESOLUTION 1024 -#define LV_ANIM_RES_SHIFT 10 -#define state LV_GLOBAL_DEFAULT()->anim_state -#define anim_ll_p &(state.anim_ll) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void anim_timer(lv_timer_t * param); -static void anim_mark_list_change(void); -static void anim_completed_handler(lv_anim_t * a); -static int32_t lv_anim_path_cubic_bezier(const lv_anim_t * a, int32_t x1, - int32_t y1, int32_t x2, int32_t y2); -static uint32_t convert_speed_to_time(uint32_t speed, int32_t start, int32_t end); -static void resolve_time(lv_anim_t * a); -static bool remove_concurrent_anims(lv_anim_t * a_current); -static void remove_anim(void * a); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ -#if LV_USE_LOG && LV_LOG_TRACE_ANIM - #define LV_TRACE_ANIM(...) LV_LOG_TRACE(__VA_ARGS__) -#else - #define LV_TRACE_ANIM(...) -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_anim_core_init(void) -{ - lv_ll_init(anim_ll_p, sizeof(lv_anim_t)); - state.timer = lv_timer_create(anim_timer, LV_DEF_REFR_PERIOD, NULL); - anim_mark_list_change(); /*Turn off the animation timer*/ - state.anim_list_changed = false; - state.anim_run_round = false; -} - -void lv_anim_core_deinit(void) -{ - lv_anim_delete_all(); -} - -void lv_anim_init(lv_anim_t * a) -{ - lv_memzero(a, sizeof(lv_anim_t)); - a->duration = 500; - a->start_value = 0; - a->end_value = 100; - a->repeat_cnt = 1; - a->path_cb = lv_anim_path_linear; - a->early_apply = 1; -} - -lv_anim_t * lv_anim_start(const lv_anim_t * a) -{ - LV_TRACE_ANIM("begin"); - - /*Add the new animation to the animation linked list*/ - lv_anim_t * new_anim = lv_ll_ins_head(anim_ll_p); - LV_ASSERT_MALLOC(new_anim); - if(new_anim == NULL) return NULL; - - /*Initialize the animation descriptor*/ - lv_memcpy(new_anim, a, sizeof(lv_anim_t)); - if(a->var == a) new_anim->var = new_anim; - new_anim->run_round = state.anim_run_round; - new_anim->last_timer_run = lv_tick_get(); - - /*Set the start value*/ - if(new_anim->early_apply) { - if(new_anim->get_value_cb) { - int32_t v_ofs = new_anim->get_value_cb(new_anim); - new_anim->start_value += v_ofs; - new_anim->end_value += v_ofs; - - } - - resolve_time(new_anim); - - /*Do not let two animations for the same 'var' with the same 'exec_cb'*/ - if(a->exec_cb || a->custom_exec_cb) remove_concurrent_anims(new_anim); - - if(new_anim->exec_cb) { - new_anim->exec_cb(new_anim->var, new_anim->start_value); - } - if(new_anim->custom_exec_cb) { - new_anim->custom_exec_cb(new_anim, new_anim->start_value); - } - } - - /*Creating an animation changed the linked list. - *It's important if it happens in a ready callback. (see `anim_timer`)*/ - anim_mark_list_change(); - - LV_TRACE_ANIM("finished"); - return new_anim; -} - -uint32_t lv_anim_get_playtime(const lv_anim_t * a) -{ - if(a->repeat_cnt == LV_ANIM_REPEAT_INFINITE) { - return LV_ANIM_PLAYTIME_INFINITE; - } - - uint32_t repeat_cnt = a->repeat_cnt; - if(repeat_cnt < 1) repeat_cnt = 1; - - uint32_t playtime = a->repeat_delay + a->duration + a->playback_delay + a->playback_duration; - playtime = playtime * repeat_cnt; - return playtime; -} - -bool lv_anim_delete(void * var, lv_anim_exec_xcb_t exec_cb) -{ - lv_anim_t * a; - bool del_any = false; - a = lv_ll_get_head(anim_ll_p); - while(a != NULL) { - bool del = false; - if((a->var == var || var == NULL) && (a->exec_cb == exec_cb || exec_cb == NULL)) { - remove_anim(a); - anim_mark_list_change(); /*Read by `anim_timer`. It need to know if a delete occurred in - the linked list*/ - del_any = true; - del = true; - } - - /*Always start from the head on delete, because we don't know - *how `anim_ll_p` was changes in `a->deleted_cb` */ - a = del ? lv_ll_get_head(anim_ll_p) : lv_ll_get_next(anim_ll_p, a); - } - - return del_any; -} - -void lv_anim_delete_all(void) -{ - lv_ll_clear_custom(anim_ll_p, remove_anim); - anim_mark_list_change(); -} - -lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb) -{ - lv_anim_t * a; - LV_LL_READ(anim_ll_p, a) { - if(a->var == var && (a->exec_cb == exec_cb || exec_cb == NULL)) { - return a; - } - } - - return NULL; -} - -lv_timer_t * lv_anim_get_timer(void) -{ - return state.timer; -} - -uint16_t lv_anim_count_running(void) -{ - uint16_t cnt = 0; - lv_anim_t * a; - LV_LL_READ(anim_ll_p, a) cnt++; - - return cnt; -} - -uint32_t lv_anim_speed_clamped(uint32_t speed, uint32_t min_time, uint32_t max_time) -{ - - if(speed > 10000) { - LV_LOG_WARN("speed is truncated to 10000 (was %"LV_PRIu32")", speed); - speed = 10230; - } - if(min_time > 10000) { - LV_LOG_WARN("min_time is truncated to 10000 (was %"LV_PRIu32")", min_time); - min_time = 10230; - } - if(max_time > 10000) { - LV_LOG_WARN("max_time is truncated to 10000 (was %"LV_PRIu32")", max_time); - max_time = 10230; - } - - /*Lower the resolution to fit the 0.1023 range*/ - speed = (speed + 5) / 10; - min_time = (min_time + 5) / 10; - max_time = (max_time + 5) / 10; - - return 0x80000000 + (max_time << 20) + (min_time << 10) + speed; - -} - -uint32_t lv_anim_speed(uint32_t speed) -{ - return lv_anim_speed_clamped(speed, 0, 10000); -} - -uint32_t lv_anim_speed_to_time(uint32_t speed, int32_t start, int32_t end) -{ - uint32_t d = LV_ABS(start - end); - uint32_t time = (d * 1000) / speed; - - time = time == 0 ? 1 : time; - - return time; -} - -void lv_anim_refr_now(void) -{ - anim_timer(NULL); -} - -int32_t lv_anim_path_linear(const lv_anim_t * a) -{ - /*Calculate the current step*/ - int32_t step = lv_map(a->act_time, 0, a->duration, 0, LV_ANIM_RESOLUTION); - - /*Get the new value which will be proportional to `step` - *and the `start` and `end` values*/ - int32_t new_value; - new_value = step * (a->end_value - a->start_value); - new_value = new_value >> LV_ANIM_RES_SHIFT; - new_value += a->start_value; - - return new_value; -} - -int32_t lv_anim_path_ease_in(const lv_anim_t * a) -{ - return lv_anim_path_cubic_bezier(a, LV_BEZIER_VAL_FLOAT(0.42), LV_BEZIER_VAL_FLOAT(0), - LV_BEZIER_VAL_FLOAT(1), LV_BEZIER_VAL_FLOAT(1)); -} - -int32_t lv_anim_path_ease_out(const lv_anim_t * a) -{ - return lv_anim_path_cubic_bezier(a, LV_BEZIER_VAL_FLOAT(0), LV_BEZIER_VAL_FLOAT(0), - LV_BEZIER_VAL_FLOAT(0.58), LV_BEZIER_VAL_FLOAT(1)); -} - -int32_t lv_anim_path_ease_in_out(const lv_anim_t * a) -{ - return lv_anim_path_cubic_bezier(a, LV_BEZIER_VAL_FLOAT(0.42), LV_BEZIER_VAL_FLOAT(0), - LV_BEZIER_VAL_FLOAT(0.58), LV_BEZIER_VAL_FLOAT(1)); -} - -int32_t lv_anim_path_overshoot(const lv_anim_t * a) -{ - return lv_anim_path_cubic_bezier(a, 341, 0, 683, 1300); -} - -int32_t lv_anim_path_bounce(const lv_anim_t * a) -{ - /*Calculate the current step*/ - int32_t t = lv_map(a->act_time, 0, a->duration, 0, LV_BEZIER_VAL_MAX); - int32_t diff = (a->end_value - a->start_value); - - /*3 bounces has 5 parts: 3 down and 2 up. One part is t / 5 long*/ - - if(t < 408) { - /*Go down*/ - t = (t * 2500) >> LV_BEZIER_VAL_SHIFT; /*[0..1024] range*/ - t = LV_BEZIER_VAL_MAX - t; - } - else if(t >= 408 && t < 614) { - /*First bounce back*/ - t -= 408; - t = t * 5; /*to [0..1024] range*/ - diff = diff / 20; - } - else if(t >= 614 && t < 819) { - /*Fall back*/ - t -= 614; - t = t * 5; /*to [0..1024] range*/ - t = LV_BEZIER_VAL_MAX - t; - diff = diff / 20; - } - else if(t >= 819 && t < 921) { - /*Second bounce back*/ - t -= 819; - t = t * 10; /*to [0..1024] range*/ - diff = diff / 40; - } - else if(t >= 921 && t <= LV_BEZIER_VAL_MAX) { - /*Fall back*/ - t -= 921; - t = t * 10; /*to [0..1024] range*/ - t = LV_BEZIER_VAL_MAX - t; - diff = diff / 40; - } - - if(t > LV_BEZIER_VAL_MAX) t = LV_BEZIER_VAL_MAX; - if(t < 0) t = 0; - int32_t step = lv_bezier3(t, 0, 500, 800, LV_BEZIER_VAL_MAX); - - int32_t new_value; - new_value = step * diff; - new_value = new_value >> LV_BEZIER_VAL_SHIFT; - new_value = a->end_value - new_value; - - return new_value; -} - -int32_t lv_anim_path_step(const lv_anim_t * a) -{ - if(a->act_time >= a->duration) - return a->end_value; - else - return a->start_value; -} - -int32_t lv_anim_path_custom_bezier3(const lv_anim_t * a) -{ - const lv_anim_bezier3_para_t * para = &a->parameter.bezier3; - return lv_anim_path_cubic_bezier(a, para->x1, para->y1, para->x2, para->y2); -} - -void lv_anim_set_var(lv_anim_t * a, void * var) -{ - a->var = var; -} - -void lv_anim_set_exec_cb(lv_anim_t * a, lv_anim_exec_xcb_t exec_cb) -{ - a->exec_cb = exec_cb; -} - -void lv_anim_set_duration(lv_anim_t * a, uint32_t duration) -{ - a->duration = duration; -} - -void lv_anim_set_time(lv_anim_t * a, uint32_t duration) -{ - lv_anim_set_duration(a, duration); -} - -void lv_anim_set_delay(lv_anim_t * a, uint32_t delay) -{ - a->act_time = -(int32_t)(delay); -} - -void lv_anim_set_values(lv_anim_t * a, int32_t start, int32_t end) -{ - a->start_value = start; - a->current_value = INT32_MIN; - a->end_value = end; -} - -void lv_anim_set_custom_exec_cb(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) -{ - a->custom_exec_cb = exec_cb; -} - -void lv_anim_set_path_cb(lv_anim_t * a, lv_anim_path_cb_t path_cb) -{ - a->path_cb = path_cb; -} - -void lv_anim_set_start_cb(lv_anim_t * a, lv_anim_start_cb_t start_cb) -{ - a->start_cb = start_cb; -} - -void lv_anim_set_get_value_cb(lv_anim_t * a, lv_anim_get_value_cb_t get_value_cb) -{ - a->get_value_cb = get_value_cb; -} - -void lv_anim_set_completed_cb(lv_anim_t * a, lv_anim_completed_cb_t completed_cb) -{ - a->completed_cb = completed_cb; -} - -void lv_anim_set_deleted_cb(lv_anim_t * a, lv_anim_deleted_cb_t deleted_cb) -{ - a->deleted_cb = deleted_cb; -} - -void lv_anim_set_playback_duration(lv_anim_t * a, uint32_t duration) -{ - a->playback_duration = duration; -} - -void lv_anim_set_playback_time(lv_anim_t * a, uint32_t duration) -{ - lv_anim_set_playback_duration(a, duration); -} - -void lv_anim_set_playback_delay(lv_anim_t * a, uint32_t delay) -{ - a->playback_delay = delay; -} - -void lv_anim_set_repeat_count(lv_anim_t * a, uint32_t cnt) -{ - a->repeat_cnt = cnt; -} - -void lv_anim_set_repeat_delay(lv_anim_t * a, uint32_t delay) -{ - a->repeat_delay = delay; -} - -void lv_anim_set_early_apply(lv_anim_t * a, bool en) -{ - a->early_apply = en; -} - -void lv_anim_set_user_data(lv_anim_t * a, void * user_data) -{ - a->user_data = user_data; -} - -void lv_anim_set_bezier3_param(lv_anim_t * a, int16_t x1, int16_t y1, int16_t x2, int16_t y2) -{ - lv_anim_bezier3_para_t * para = &a->parameter.bezier3; - - para->x1 = x1; - para->x2 = x2; - para->y1 = y1; - para->y2 = y2; -} - -uint32_t lv_anim_get_delay(const lv_anim_t * a) -{ - return -a->act_time; -} - -uint32_t lv_anim_get_time(const lv_anim_t * a) -{ - return a->duration; -} - -uint32_t lv_anim_get_repeat_count(const lv_anim_t * a) -{ - return a->repeat_cnt; -} - -void * lv_anim_get_user_data(const lv_anim_t * a) -{ - return a->user_data; -} - -bool lv_anim_custom_delete(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) -{ - return lv_anim_delete(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb); -} - -lv_anim_t * lv_anim_custom_get(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) -{ - return lv_anim_get(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb); -} - -/********************** - * STATIC FUNCTIONS - **********************/ -/** - * Periodically handle the animations. - * @param param unused - */ -static void anim_timer(lv_timer_t * param) -{ - LV_UNUSED(param); - - /*Flip the run round*/ - state.anim_run_round = state.anim_run_round ? false : true; - - lv_anim_t * a = lv_ll_get_head(anim_ll_p); - - while(a != NULL) { - uint32_t elaps = lv_tick_elaps(a->last_timer_run); - a->act_time += elaps; - - a->last_timer_run = lv_tick_get(); - - /*It can be set by `lv_anim_delete()` typically in `end_cb`. If set then an animation delete - * happened in `anim_completed_handler` which could make this linked list reading corrupt - * because the list is changed meanwhile - */ - state.anim_list_changed = false; - - if(a->run_round != state.anim_run_round) { - a->run_round = state.anim_run_round; /*The list readying might be reset so need to know which anim has run already*/ - - /*The animation will run now for the first time. Call `start_cb`*/ - if(!a->start_cb_called && a->act_time >= 0) { - - if(a->early_apply == 0 && a->get_value_cb) { - int32_t v_ofs = a->get_value_cb(a); - a->start_value += v_ofs; - a->end_value += v_ofs; - } - - resolve_time(a); - - if(a->start_cb) a->start_cb(a); - a->start_cb_called = 1; - - /*Do not let two animations for the same 'var' with the same 'exec_cb'*/ - remove_concurrent_anims(a); - } - - if(a->act_time >= 0) { - if(a->act_time > a->duration) a->act_time = a->duration; - - int32_t new_value; - new_value = a->path_cb(a); - - if(new_value != a->current_value) { - a->current_value = new_value; - /*Apply the calculated value*/ - if(a->exec_cb) a->exec_cb(a->var, new_value); - if(!state.anim_list_changed && a->custom_exec_cb) a->custom_exec_cb(a, new_value); - } - - /*If the time is elapsed the animation is ready*/ - if(!state.anim_list_changed && a->act_time >= a->duration) { - anim_completed_handler(a); - } - } - } - - /*If the linked list changed due to anim. delete then it's not safe to continue - *the reading of the list from here -> start from the head*/ - if(state.anim_list_changed) - a = lv_ll_get_head(anim_ll_p); - else - a = lv_ll_get_next(anim_ll_p, a); - } - -} - -/** - * Called when an animation is completed to do the necessary things - * e.g. repeat, play back, delete etc. - * @param a pointer to an animation descriptor - */ -static void anim_completed_handler(lv_anim_t * a) -{ - /*In the end of a forward anim decrement repeat cnt.*/ - if(a->playback_now == 0 && a->repeat_cnt > 0 && a->repeat_cnt != LV_ANIM_REPEAT_INFINITE) { - a->repeat_cnt--; - } - - /*Delete the animation if - * - no repeat left and no play back (simple one shot animation) - * - no repeat, play back is enabled and play back is ready*/ - if(a->repeat_cnt == 0 && (a->playback_duration == 0 || a->playback_now == 1)) { - - /*Delete the animation from the list. - * This way the `completed_cb` will see the animations like it's animation is already deleted*/ - lv_ll_remove(anim_ll_p, a); - /*Flag that the list has changed*/ - anim_mark_list_change(); - - /*Call the callback function at the end*/ - if(a->completed_cb != NULL) a->completed_cb(a); - if(a->deleted_cb != NULL) a->deleted_cb(a); - lv_free(a); - } - /*If the animation is not deleted then restart it*/ - else { - a->act_time = -(int32_t)(a->repeat_delay); /*Restart the animation*/ - /*Swap the start and end values in play back mode*/ - if(a->playback_duration != 0) { - /*If now turning back use the 'playback_pause*/ - if(a->playback_now == 0) a->act_time = -(int32_t)(a->playback_delay); - - /*Toggle the play back state*/ - a->playback_now = a->playback_now == 0 ? 1 : 0; - /*Swap the start and end values*/ - int32_t tmp = a->start_value; - a->start_value = a->end_value; - a->end_value = tmp; - /*Swap the time and playback_duration*/ - tmp = a->duration; - a->duration = a->playback_duration; - a->playback_duration = tmp; - } - } -} - -static void anim_mark_list_change(void) -{ - state.anim_list_changed = true; - if(lv_ll_get_head(anim_ll_p) == NULL) - lv_timer_pause(state.timer); - else - lv_timer_resume(state.timer); -} - -static int32_t lv_anim_path_cubic_bezier(const lv_anim_t * a, int32_t x1, int32_t y1, int32_t x2, int32_t y2) -{ - /*Calculate the current step*/ - uint32_t t = lv_map(a->act_time, 0, a->duration, 0, LV_BEZIER_VAL_MAX); - int32_t step = lv_cubic_bezier(t, x1, y1, x2, y2); - - int32_t new_value; - new_value = step * (a->end_value - a->start_value); - new_value = new_value >> LV_BEZIER_VAL_SHIFT; - new_value += a->start_value; - - return new_value; -} - -static uint32_t convert_speed_to_time(uint32_t speed_or_time, int32_t start, int32_t end) -{ - /*It was a simple time*/ - if((speed_or_time & 0x80000000) == 0) return speed_or_time; - - uint32_t d = LV_ABS(start - end); - uint32_t speed = speed_or_time & 0x3FF; - uint32_t time = (d * 100) / speed; /*Speed is in 10 units per sec*/ - uint32_t max_time = (speed_or_time >> 20) & 0x3FF; - uint32_t min_time = (speed_or_time >> 10) & 0x3FF; - - return LV_CLAMP(min_time * 10, time, max_time * 10); -} - -static void resolve_time(lv_anim_t * a) -{ - a->duration = convert_speed_to_time(a->duration, a->start_value, a->end_value); - a->playback_duration = convert_speed_to_time(a->playback_duration, a->start_value, a->end_value); - a->playback_delay = convert_speed_to_time(a->playback_delay, a->start_value, a->end_value); - a->repeat_delay = convert_speed_to_time(a->repeat_delay, a->start_value, a->end_value); -} - -/** - * Remove animations which are animating the same var with the same exec_cb - * and they are already running or they have early_apply - * @param a_current the current animation, use its var and exec_cb as reference to know what to remove - * @return true: at least one animation was delete - */ -static bool remove_concurrent_anims(lv_anim_t * a_current) -{ - if(a_current->exec_cb == NULL && a_current->custom_exec_cb == NULL) return false; - - lv_anim_t * a; - bool del_any = false; - a = lv_ll_get_head(anim_ll_p); - while(a != NULL) { - bool del = false; - /*We can't test for custom_exec_cb equality because in the MicroPython binding - *a wrapper callback is used here an the real callback data is stored in the `user_data`. - *Therefore equality check would remove all animations.*/ - if(a != a_current && - (a->act_time >= 0 || a->early_apply) && - (a->var == a_current->var) && - ((a->exec_cb && a->exec_cb == a_current->exec_cb) - /*|| (a->custom_exec_cb && a->custom_exec_cb == a_current->custom_exec_cb)*/)) { - lv_ll_remove(anim_ll_p, a); - if(a->deleted_cb != NULL) a->deleted_cb(a); - lv_free(a); - /*Read by `anim_timer`. It need to know if a delete occurred in the linked list*/ - anim_mark_list_change(); - - del_any = true; - del = true; - } - - /*Always start from the head on delete, because we don't know - *how `anim_ll_p` was changes in `a->deleted_cb` */ - a = del ? lv_ll_get_head(anim_ll_p) : lv_ll_get_next(anim_ll_p, a); - } - - return del_any; -} - -static void remove_anim(void * a) -{ - lv_anim_t * anim = a; - lv_ll_remove(anim_ll_p, a); - if(anim->deleted_cb != NULL) anim->deleted_cb(anim); - lv_free(a); -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim.h deleted file mode 100644 index 0d626c8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim.h +++ /dev/null @@ -1,525 +0,0 @@ -/** - * @file lv_anim.h - * - */ - -#ifndef LV_ANIM_H -#define LV_ANIM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "lv_types.h" -#include "lv_math.h" -#include "lv_timer.h" -#include "lv_ll.h" - -/********************* - * DEFINES - *********************/ - -#define LV_ANIM_REPEAT_INFINITE 0xFFFFFFFF -#define LV_ANIM_PLAYTIME_INFINITE 0xFFFFFFFF - -/* - * Macros used to set cubic-bezier anim parameter. - * Parameters come from https://easings.net/ - * - * Usage: - * - * lv_anim_t a; - * lv_anim_init(&a); - * ... - * lv_anim_set_path_cb(&a, lv_anim_path_custom_bezier3); - * LV_ANIM_SET_EASE_IN_SINE(&a); //Set cubic-bezier anim parameter to easeInSine - * ... - * lv_anim_start(&a); - */ - -#define _PARA(a, x1, y1, x2, y2) ((a)->parameter.bezier3 = \ -(lv_anim_bezier3_para_t) { \ - LV_BEZIER_VAL_FLOAT(x1), LV_BEZIER_VAL_FLOAT(y1), \ - LV_BEZIER_VAL_FLOAT(x2), LV_BEZIER_VAL_FLOAT(y2) } \ - ) - -#define LV_ANIM_SET_EASE_IN_SINE(a) _PARA(a, 0.12, 0, 0.39, 0) -#define LV_ANIM_SET_EASE_OUT_SINE(a) _PARA(a, 0.61, 1, 0.88, 1) -#define LV_ANIM_SET_EASE_IN_OUT_SINE(a) _PARA(a, 0.37, 0, 0.63, 1) -#define LV_ANIM_SET_EASE_IN_QUAD(a) _PARA(a, 0.11, 0, 0.5, 0) -#define LV_ANIM_SET_EASE_OUT_QUAD(a) _PARA(a, 0.5, 1, 0.89, 1) -#define LV_ANIM_SET_EASE_IN_OUT_QUAD(a) _PARA(a, 0.45, 0, 0.55, 1) -#define LV_ANIM_SET_EASE_IN_CUBIC(a) _PARA(a, 0.32, 0, 0.67, 0) -#define LV_ANIM_SET_EASE_OUT_CUBIC(a) _PARA(a, 0.33, 1, 0.68, 1) -#define LV_ANIM_SET_EASE_IN_OUT_CUBIC(a) _PARA(a, 0.65, 0, 0.35, 1) -#define LV_ANIM_SET_EASE_IN_QUART(a) _PARA(a, 0.5, 0, 0.75, 0) -#define LV_ANIM_SET_EASE_OUT_QUART(a) _PARA(a, 0.25, 1, 0.5, 1) -#define LV_ANIM_SET_EASE_IN_OUT_QUART(a) _PARA(a, 0.76, 0, 0.24, 1) -#define LV_ANIM_SET_EASE_IN_QUINT(a) _PARA(a, 0.64, 0, 0.78, 0) -#define LV_ANIM_SET_EASE_OUT_QUINT(a) _PARA(a, 0.22, 1, 0.36, 1) -#define LV_ANIM_SET_EASE_IN_OUT_QUINT(a) _PARA(a, 0.83, 0, 0.17, 1) -#define LV_ANIM_SET_EASE_IN_EXPO(a) _PARA(a, 0.7, 0, 0.84, 0) -#define LV_ANIM_SET_EASE_OUT_EXPO(a) _PARA(a, 0.16, 1, 0.3, 1) -#define LV_ANIM_SET_EASE_IN_OUT_EXPO(a) _PARA(a, 0.87, 0, 0.13, 1) -#define LV_ANIM_SET_EASE_IN_CIRC(a) _PARA(a, 0.55, 0, 1, 0.45) -#define LV_ANIM_SET_EASE_OUT_CIRC(a) _PARA(a, 0, 0.55, 0.45, 1) -#define LV_ANIM_SET_EASE_IN_OUT_CIRC(a) _PARA(a, 0.85, 0, 0.15, 1) -#define LV_ANIM_SET_EASE_IN_BACK(a) _PARA(a, 0.36, 0, 0.66, -0.56) -#define LV_ANIM_SET_EASE_OUT_BACK(a) _PARA(a, 0.34, 1.56, 0.64, 1) -#define LV_ANIM_SET_EASE_IN_OUT_BACK(a) _PARA(a, 0.68, -0.6, 0.32, 1.6) - -LV_EXPORT_CONST_INT(LV_ANIM_REPEAT_INFINITE); -LV_EXPORT_CONST_INT(LV_ANIM_PLAYTIME_INFINITE); - -/********************** - * TYPEDEFS - **********************/ - -/** Can be used to indicate if animations are enabled or disabled in a case*/ -typedef enum { - LV_ANIM_OFF, - LV_ANIM_ON, -} lv_anim_enable_t; - -/** Get the current value during an animation*/ -typedef int32_t (*lv_anim_path_cb_t)(const lv_anim_t *); - -/** Generic prototype of "animator" functions. - * First parameter is the variable to animate. - * Second parameter is the value to set. - * Compatible with `lv_xxx_set_yyy(obj, value)` functions - * The `x` in `_xcb_t` means it's not a fully generic prototype because - * it doesn't receive `lv_anim_t *` as its first argument*/ -typedef void (*lv_anim_exec_xcb_t)(void *, int32_t); - -/** Same as `lv_anim_exec_xcb_t` but receives `lv_anim_t *` as the first parameter. - * It's more consistent but less convenient. Might be used by binding generator functions.*/ -typedef void (*lv_anim_custom_exec_cb_t)(lv_anim_t *, int32_t); - -/** Callback to call when the animation is ready*/ -typedef void (*lv_anim_completed_cb_t)(lv_anim_t *); - -/** Callback to call when the animation really stars (considering `delay`)*/ -typedef void (*lv_anim_start_cb_t)(lv_anim_t *); - -/** Callback used when the animation values are relative to get the current value*/ -typedef int32_t (*lv_anim_get_value_cb_t)(lv_anim_t *); - -/** Callback used when the animation is deleted*/ -typedef void (*lv_anim_deleted_cb_t)(lv_anim_t *); - -/** Parameter used when path is custom_bezier */ -typedef struct { - int16_t x1; - int16_t y1; - int16_t x2; - int16_t y2; -} lv_anim_bezier3_para_t; - -/** Describes an animation*/ -struct lv_anim_t { - void * var; /**< Variable to animate*/ - lv_anim_exec_xcb_t exec_cb; /**< Function to execute to animate*/ - lv_anim_custom_exec_cb_t custom_exec_cb; /**< Function to execute to animate, - * same purpose as exec_cb but different parameters*/ - lv_anim_start_cb_t start_cb; /**< Call it when the animation is starts (considering `delay`)*/ - lv_anim_completed_cb_t completed_cb; /**< Call it when the animation is fully completed*/ - lv_anim_deleted_cb_t deleted_cb; /**< Call it when the animation is deleted*/ - lv_anim_get_value_cb_t get_value_cb; /**< Get the current value in relative mode*/ - void * user_data; /**< Custom user data*/ - lv_anim_path_cb_t path_cb; /**< Describe the path (curve) of animations*/ - int32_t start_value; /**< Start value*/ - int32_t current_value; /**< Current value*/ - int32_t end_value; /**< End value*/ - int32_t duration; /**< Animation time in ms*/ - int32_t act_time; /**< Current time in animation. Set to negative to make delay.*/ - uint32_t playback_delay; /**< Wait before play back*/ - uint32_t playback_duration; /**< Duration of playback animation*/ - uint32_t repeat_delay; /**< Wait before repeat*/ - uint32_t repeat_cnt; /**< Repeat count for the animation*/ - union lv_anim_path_para_t { - lv_anim_bezier3_para_t bezier3; /**< Parameter used when path is custom_bezier*/ - } parameter; - - /* Animation system use these - user shouldn't set */ - uint32_t last_timer_run; - uint8_t playback_now : 1; /**< Play back is in progress*/ - uint8_t run_round : 1; /**< Indicates the animation has run in this round*/ - uint8_t start_cb_called : 1; /**< Indicates that the `start_cb` was already called*/ - uint8_t early_apply : 1; /**< 1: Apply start value immediately even is there is `delay`*/ -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize an animation variable. - * E.g.: - * lv_anim_t a; - * lv_anim_init(&a); - * lv_anim_set_...(&a); - * lv_anim_start(&a); - * @param a pointer to an `lv_anim_t` variable to initialize - */ -void lv_anim_init(lv_anim_t * a); - -/** - * Set a variable to animate - * @param a pointer to an initialized `lv_anim_t` variable - * @param var pointer to a variable to animate - */ -void lv_anim_set_var(lv_anim_t * a, void * var); - -/** - * Set a function to animate `var` - * @param a pointer to an initialized `lv_anim_t` variable - * @param exec_cb a function to execute during animation - * LVGL's built-in functions can be used. - * E.g. lv_obj_set_x - */ -void lv_anim_set_exec_cb(lv_anim_t * a, lv_anim_exec_xcb_t exec_cb); - -/** - * Set the duration of an animation - * @param a pointer to an initialized `lv_anim_t` variable - * @param duration duration of the animation in milliseconds - */ -void lv_anim_set_duration(lv_anim_t * a, uint32_t duration); - -/** - * Legacy `lv_anim_set_time` API will be removed soon, use `lv_anim_set_duration` instead. - */ -void lv_anim_set_time(lv_anim_t * a, uint32_t duration); - -/** - * Set a delay before starting the animation - * @param a pointer to an initialized `lv_anim_t` variable - * @param delay delay before the animation in milliseconds - */ -void lv_anim_set_delay(lv_anim_t * a, uint32_t delay); - -/** - * Set the start and end values of an animation - * @param a pointer to an initialized `lv_anim_t` variable - * @param start the start value - * @param end the end value - */ -void lv_anim_set_values(lv_anim_t * a, int32_t start, int32_t end); - -/** - * Similar to `lv_anim_set_exec_cb` but `lv_anim_custom_exec_cb_t` receives - * `lv_anim_t * ` as its first parameter instead of `void *`. - * This function might be used when LVGL is bound to other languages because - * it's more consistent to have `lv_anim_t *` as first parameter. - * @param a pointer to an initialized `lv_anim_t` variable - * @param exec_cb a function to execute. - */ -void lv_anim_set_custom_exec_cb(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb); - -/** - * Set the path (curve) of the animation. - * @param a pointer to an initialized `lv_anim_t` variable - * @param path_cb a function to set the current value of the animation. - */ -void lv_anim_set_path_cb(lv_anim_t * a, lv_anim_path_cb_t path_cb); - -/** - * Set a function call when the animation really starts (considering `delay`) - * @param a pointer to an initialized `lv_anim_t` variable - * @param start_cb a function call when the animation starts - */ -void lv_anim_set_start_cb(lv_anim_t * a, lv_anim_start_cb_t start_cb); - -/** - * Set a function to use the current value of the variable and make start and end value - * relative to the returned current value. - * @param a pointer to an initialized `lv_anim_t` variable - * @param get_value_cb a function call when the animation starts - */ -void lv_anim_set_get_value_cb(lv_anim_t * a, lv_anim_get_value_cb_t get_value_cb); - -/** - * Set a function call when the animation is completed - * @param a pointer to an initialized `lv_anim_t` variable - * @param completed_cb a function call when the animation is fully completed - */ -void lv_anim_set_completed_cb(lv_anim_t * a, lv_anim_completed_cb_t completed_cb); - -/** - * Set a function call when the animation is deleted. - * @param a pointer to an initialized `lv_anim_t` variable - * @param deleted_cb a function call when the animation is deleted - */ -void lv_anim_set_deleted_cb(lv_anim_t * a, lv_anim_deleted_cb_t deleted_cb); - -/** - * Make the animation to play back to when the forward direction is ready - * @param a pointer to an initialized `lv_anim_t` variable - * @param duration duration of playback animation in milliseconds. 0: disable playback - */ -void lv_anim_set_playback_duration(lv_anim_t * a, uint32_t duration); - -/** - * Legacy `lv_anim_set_playback_time` API will be removed soon, use `lv_anim_set_playback_duration` instead. - */ -void lv_anim_set_playback_time(lv_anim_t * a, uint32_t duration); - -/** - * Make the animation to play back to when the forward direction is ready - * @param a pointer to an initialized `lv_anim_t` variable - * @param delay delay in milliseconds before starting the playback animation. - */ -void lv_anim_set_playback_delay(lv_anim_t * a, uint32_t delay); - -/** - * Make the animation repeat itself. - * @param a pointer to an initialized `lv_anim_t` variable - * @param cnt repeat count or `LV_ANIM_REPEAT_INFINITE` for infinite repetition. 0: to disable repetition. - */ -void lv_anim_set_repeat_count(lv_anim_t * a, uint32_t cnt); - -/** - * Set a delay before repeating the animation. - * @param a pointer to an initialized `lv_anim_t` variable - * @param delay delay in milliseconds before repeating the animation. - */ -void lv_anim_set_repeat_delay(lv_anim_t * a, uint32_t delay); - -/** - * Set a whether the animation's should be applied immediately or only when the delay expired. - * @param a pointer to an initialized `lv_anim_t` variable - * @param en true: apply the start value immediately in `lv_anim_start`; - * false: apply the start value only when `delay` ms is elapsed and the animations really starts - */ -void lv_anim_set_early_apply(lv_anim_t * a, bool en); - -/** - * Set the custom user data field of the animation. - * @param a pointer to an initialized `lv_anim_t` variable - * @param user_data pointer to the new user_data. - */ -void lv_anim_set_user_data(lv_anim_t * a, void * user_data); - -/** - * Set parameter for cubic bezier path - * @param a pointer to an initialized `lv_anim_t` variable - * @param x1 first control point X - * @param y1 first control point Y - * @param x2 second control point X - * @param y2 second control point Y - */ -void lv_anim_set_bezier3_param(lv_anim_t * a, int16_t x1, int16_t y1, int16_t x2, int16_t y2); - -/** - * Create an animation - * @param a an initialized 'anim_t' variable. Not required after call. - * @return pointer to the created animation (different from the `a` parameter) - */ -lv_anim_t * lv_anim_start(const lv_anim_t * a); - -/** - * Get a delay before starting the animation - * @param a pointer to an initialized `lv_anim_t` variable - * @return delay before the animation in milliseconds - */ -uint32_t lv_anim_get_delay(const lv_anim_t * a); - -/** - * Get the time used to play the animation. - * @param a pointer to an animation. - * @return the play time in milliseconds. - */ -uint32_t lv_anim_get_playtime(const lv_anim_t * a); - -/** - * Get the duration of an animation - * @param a pointer to an initialized `lv_anim_t` variable - * @return the duration of the animation in milliseconds - */ -uint32_t lv_anim_get_time(const lv_anim_t * a); - -/** - * Get the repeat count of the animation. - * @param a pointer to an initialized `lv_anim_t` variable - * @return the repeat count or `LV_ANIM_REPEAT_INFINITE` for infinite repetition. 0: disabled repetition. - */ -uint32_t lv_anim_get_repeat_count(const lv_anim_t * a); - -/** - * Get the user_data field of the animation - * @param a pointer to an initialized `lv_anim_t` variable - * @return the pointer to the custom user_data of the animation - */ -void * lv_anim_get_user_data(const lv_anim_t * a); - -/** - * Delete animation(s) of a variable with a given animator function - * @param var pointer to variable - * @param exec_cb a function pointer which is animating 'var', - * or NULL to ignore it and delete all the animations of 'var - * @return true: at least 1 animation is deleted, false: no animation is deleted - */ -bool lv_anim_delete(void * var, lv_anim_exec_xcb_t exec_cb); - -/** - * Delete all the animations - */ -void lv_anim_delete_all(void); - -/** - * Get the animation of a variable and its `exec_cb`. - * @param var pointer to variable - * @param exec_cb a function pointer which is animating 'var', or NULL to return first matching 'var' - * @return pointer to the animation. - */ -lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb); - -/** - * Get global animation refresher timer. - * @return pointer to the animation refresher timer. - */ -lv_timer_t * lv_anim_get_timer(void); - -/** - * Delete an animation by getting the animated variable from `a`. - * Only animations with `exec_cb` will be deleted. - * This function exists because it's logical that all anim. functions receives an - * `lv_anim_t` as their first parameter. It's not practical in C but might make - * the API more consequent and makes easier to generate bindings. - * @param a pointer to an animation. - * @param exec_cb a function pointer which is animating 'var', - * or NULL to ignore it and delete all the animations of 'var - * @return true: at least 1 animation is deleted, false: no animation is deleted - */ -bool lv_anim_custom_delete(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb); - -/** - * Get the animation of a variable and its `exec_cb`. - * This function exists because it's logical that all anim. functions receives an - * `lv_anim_t` as their first parameter. It's not practical in C but might make - * the API more consequent and makes easier to generate bindings. - * @param a pointer to an animation. - * @param exec_cb a function pointer which is animating 'var', or NULL to return first matching 'var' - * @return pointer to the animation. - */ -lv_anim_t * lv_anim_custom_get(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb); - -/** - * Get the number of currently running animations - * @return the number of running animations - */ -uint16_t lv_anim_count_running(void); - -/** - * Store the speed as a special value which can be used as time in animations. - * It will be converted to time internally based on the start and end values - * @param speed the speed of the animation in with unit / sec resolution in 0..10k range - * @return a special value which can be used as an animation time - */ -uint32_t lv_anim_speed(uint32_t speed); - -/** - * Store the speed as a special value which can be used as time in animations. - * It will be converted to time internally based on the start and end values - * @param speed the speed of the animation in as unit / sec resolution in 0..10k range - * @param min_time the minimum time in 0..10k range - * @param max_time the maximum time in 0..10k range - * @return a special value in where all three values are stored and can be used as an animation time - * @note internally speed is stored as 10 unit/sec - * @note internally min/max_time are stored with 10 ms unit - * - */ -uint32_t lv_anim_speed_clamped(uint32_t speed, uint32_t min_time, uint32_t max_time); - -/** - * Calculate the time of an animation based on its speed, start and end values. - * @param speed the speed of the animation - * @param start the start value - * @param end the end value - * @return the time of the animation in milliseconds - */ -uint32_t lv_anim_speed_to_time(uint32_t speed, int32_t start, int32_t end); - -/** - * Manually refresh the state of the animations. - * Useful to make the animations running in a blocking process where - * `lv_timer_handler` can't run for a while. - * Shouldn't be used directly because it is called in `lv_refr_now()`. - */ -void lv_anim_refr_now(void); - -/** - * Calculate the current value of an animation applying linear characteristic - * @param a pointer to an animation - * @return the current value to set - */ -int32_t lv_anim_path_linear(const lv_anim_t * a); - -/** - * Calculate the current value of an animation slowing down the start phase - * @param a pointer to an animation - * @return the current value to set - */ -int32_t lv_anim_path_ease_in(const lv_anim_t * a); - -/** - * Calculate the current value of an animation slowing down the end phase - * @param a pointer to an animation - * @return the current value to set - */ -int32_t lv_anim_path_ease_out(const lv_anim_t * a); - -/** - * Calculate the current value of an animation applying an "S" characteristic (cosine) - * @param a pointer to an animation - * @return the current value to set - */ -int32_t lv_anim_path_ease_in_out(const lv_anim_t * a); - -/** - * Calculate the current value of an animation with overshoot at the end - * @param a pointer to an animation - * @return the current value to set - */ -int32_t lv_anim_path_overshoot(const lv_anim_t * a); - -/** - * Calculate the current value of an animation with 3 bounces - * @param a pointer to an animation - * @return the current value to set - */ -int32_t lv_anim_path_bounce(const lv_anim_t * a); - -/** - * Calculate the current value of an animation applying step characteristic. - * (Set end value on the end of the animation) - * @param a pointer to an animation - * @return the current value to set - */ -int32_t lv_anim_path_step(const lv_anim_t * a); - -/** - * A custom cubic bezier animation path, need to specify cubic-parameters in a->parameter.bezier3 - * @param a pointer to an animation - * @return the current value to set - */ -int32_t lv_anim_path_custom_bezier3(const lv_anim_t * a); - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_ANIM_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim_private.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim_private.h deleted file mode 100644 index 5c25850..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim_private.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @file lv_anim_private.h - * - */ - -#ifndef LV_ANIM_PRIVATE_H -#define LV_ANIM_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_anim.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - bool anim_list_changed; - bool anim_run_round; - lv_timer_t * timer; - lv_ll_t anim_ll; -} lv_anim_state_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Init the animation module - */ -void lv_anim_core_init(void); - -/** - * Deinit the animation module - */ -void lv_anim_core_deinit(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_ANIM_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim_timeline.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim_timeline.c deleted file mode 100644 index f9cd530..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim_timeline.c +++ /dev/null @@ -1,311 +0,0 @@ -/** - * @file lv_anim_timeline.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_anim_private.h" -#include "lv_assert.h" -#include "lv_anim_timeline.h" -#include "../stdlib/lv_mem.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -/*Data of anim_timeline_dsc*/ -typedef struct { - lv_anim_t anim; - uint32_t start_time; - uint8_t is_started : 1; - uint8_t is_completed : 1; -} lv_anim_timeline_dsc_t; - -/*Data of anim_timeline*/ -struct lv_anim_timeline_t { - lv_anim_timeline_dsc_t * anim_dsc; /**< Dynamically allocated anim dsc array*/ - uint32_t anim_dsc_cnt; /**< The length of anim dsc array*/ - uint32_t act_time; /**< Current time of the animation*/ - bool reverse; /**< Reverse playback*/ - uint32_t repeat_count; /**< Repeat count*/ - uint32_t repeat_delay; /**< Wait before repeat*/ -}; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void anim_timeline_exec_cb(void * var, int32_t v); -static void anim_timeline_set_act_time(lv_anim_timeline_t * at, uint32_t act_time); -static int32_t anim_timeline_path_cb(const lv_anim_t * a); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_anim_timeline_t * lv_anim_timeline_create(void) -{ - lv_anim_timeline_t * at = lv_malloc_zeroed(sizeof(lv_anim_timeline_t)); - LV_ASSERT_MALLOC(at); - return at; -} - -void lv_anim_timeline_delete(lv_anim_timeline_t * at) -{ - LV_ASSERT_NULL(at); - - lv_anim_timeline_pause(at); - - lv_free(at->anim_dsc); - lv_free(at); -} - -void lv_anim_timeline_add(lv_anim_timeline_t * at, uint32_t start_time, const lv_anim_t * a) -{ - LV_ASSERT_NULL(at); - - at->anim_dsc_cnt++; - at->anim_dsc = lv_realloc(at->anim_dsc, at->anim_dsc_cnt * sizeof(lv_anim_timeline_dsc_t)); - - LV_ASSERT_MALLOC(at->anim_dsc); - - at->anim_dsc[at->anim_dsc_cnt - 1].anim = *a; - at->anim_dsc[at->anim_dsc_cnt - 1].start_time = start_time; -} - -uint32_t lv_anim_timeline_start(lv_anim_timeline_t * at) -{ - LV_ASSERT_NULL(at); - - uint32_t playtime = lv_anim_timeline_get_playtime(at); - uint32_t repeat = at->repeat_count; - uint32_t delay = at->repeat_delay; - uint32_t start = at->act_time; - uint32_t end = at->reverse ? 0 : playtime; - uint32_t duration = end > start ? end - start : start - end; - - if((!at->reverse && at->act_time == 0) || (at->reverse && at->act_time == playtime)) { - for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { - at->anim_dsc[i].is_started = 0; - at->anim_dsc[i].is_completed = 0; - } - } - - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, at); - lv_anim_set_exec_cb(&a, anim_timeline_exec_cb); - lv_anim_set_values(&a, start, end); - lv_anim_set_time(&a, duration); - lv_anim_set_path_cb(&a, anim_timeline_path_cb); - lv_anim_set_repeat_count(&a, repeat); - lv_anim_set_repeat_delay(&a, delay); - lv_anim_start(&a); - return playtime; -} - -void lv_anim_timeline_pause(lv_anim_timeline_t * at) -{ - LV_ASSERT_NULL(at); - - lv_anim_delete(at, anim_timeline_exec_cb); -} - -void lv_anim_timeline_set_reverse(lv_anim_timeline_t * at, bool reverse) -{ - LV_ASSERT_NULL(at); - at->reverse = reverse; -} - -void lv_anim_timeline_set_repeat_count(lv_anim_timeline_t * at, uint32_t cnt) -{ - LV_ASSERT_NULL(at); - at->repeat_count = cnt; -} - -void lv_anim_timeline_set_repeat_delay(lv_anim_timeline_t * at, uint32_t delay) -{ - LV_ASSERT_NULL(at); - at->repeat_delay = delay; -} - -void lv_anim_timeline_set_progress(lv_anim_timeline_t * at, uint16_t progress) -{ - LV_ASSERT_NULL(at); - - uint32_t playtime = lv_anim_timeline_get_playtime(at); - uint32_t act_time = lv_map(progress, 0, LV_ANIM_TIMELINE_PROGRESS_MAX, 0, playtime); - anim_timeline_set_act_time(at, act_time); -} - -uint32_t lv_anim_timeline_get_playtime(lv_anim_timeline_t * at) -{ - LV_ASSERT_NULL(at); - - uint32_t playtime = 0; - for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { - uint32_t end = lv_anim_get_playtime(&at->anim_dsc[i].anim); - if(end == LV_ANIM_PLAYTIME_INFINITE) - return end; - end += at->anim_dsc[i].start_time; - if(end > playtime) { - playtime = end; - } - } - - return playtime; -} - -bool lv_anim_timeline_get_reverse(lv_anim_timeline_t * at) -{ - LV_ASSERT_NULL(at); - return at->reverse; -} - -uint16_t lv_anim_timeline_get_progress(lv_anim_timeline_t * at) -{ - LV_ASSERT_NULL(at); - uint32_t playtime = lv_anim_timeline_get_playtime(at); - return lv_map(at->act_time, 0, playtime, 0, LV_ANIM_TIMELINE_PROGRESS_MAX); -} - -uint32_t lv_anim_timeline_get_repeat_count(lv_anim_timeline_t * at) -{ - LV_ASSERT_NULL(at); - return at->repeat_count; -} - -uint32_t lv_anim_timeline_get_repeat_delay(lv_anim_timeline_t * at) -{ - LV_ASSERT_NULL(at); - return at->repeat_delay; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void anim_timeline_set_act_time(lv_anim_timeline_t * at, uint32_t act_time) -{ - at->act_time = act_time; - bool anim_timeline_is_started = (lv_anim_get(at, anim_timeline_exec_cb) != NULL); - for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { - lv_anim_timeline_dsc_t * anim_dsc = &(at->anim_dsc[i]); - lv_anim_t * a = &(anim_dsc->anim); - - if(a->exec_cb == NULL && a->custom_exec_cb == NULL) { - continue; - } - - uint32_t start_time = anim_dsc->start_time; - int32_t value = 0; - - if(act_time < start_time && a->early_apply) { - if(anim_timeline_is_started) { - if(at->reverse) { - if(!anim_dsc->is_started && a->start_cb) a->start_cb(a); - anim_dsc->is_started = 1; - } - else { - anim_dsc->is_started = 0; - } - } - - value = a->start_value; - if(a->exec_cb) a->exec_cb(a->var, value); - if(a->custom_exec_cb) a->custom_exec_cb(a, value); - - if(anim_timeline_is_started) { - if(at->reverse) { - if(!anim_dsc->is_completed && a->completed_cb) a->completed_cb(a); - anim_dsc->is_completed = 1; - } - else { - anim_dsc->is_completed = 0; - } - } - } - else if(act_time >= start_time && act_time <= (start_time + a->duration)) { - if(anim_timeline_is_started) { - if(!anim_dsc->is_started && a->start_cb) a->start_cb(a); - anim_dsc->is_started = 1; - } - - a->act_time = act_time - start_time; - value = a->path_cb(a); - if(a->exec_cb) a->exec_cb(a->var, value); - if(a->custom_exec_cb) a->custom_exec_cb(a, value); - - if(anim_timeline_is_started) { - if(at->reverse) { - if(act_time == start_time) { - if(!anim_dsc->is_completed && a->completed_cb) a->completed_cb(a); - anim_dsc->is_completed = 1; - } - else { - anim_dsc->is_completed = 0; - } - } - else { - if(act_time == (start_time + a->duration)) { - if(!anim_dsc->is_completed && a->completed_cb) a->completed_cb(a); - anim_dsc->is_completed = 1; - } - else { - anim_dsc->is_completed = 0; - } - } - } - } - else if(act_time > start_time + a->duration) { - if(anim_timeline_is_started) { - if(at->reverse) { - anim_dsc->is_started = 0; - } - else { - if(!anim_dsc->is_started && a->start_cb) a->start_cb(a); - anim_dsc->is_started = 1; - } - } - - value = a->end_value; - if(a->exec_cb) a->exec_cb(a->var, value); - if(a->custom_exec_cb) a->custom_exec_cb(a, value); - - if(anim_timeline_is_started) { - if(at->reverse) { - anim_dsc->is_completed = 0; - } - else { - if(!anim_dsc->is_completed && a->completed_cb) a->completed_cb(a); - anim_dsc->is_completed = 1; - } - } - } - } -} - -static int32_t anim_timeline_path_cb(const lv_anim_t * a) -{ - /* Directly map original timestamps to avoid loss of accuracy */ - return lv_map(a->act_time, 0, a->duration, a->start_value, a->end_value); -} - -static void anim_timeline_exec_cb(void * var, int32_t v) -{ - lv_anim_timeline_t * at = var; - anim_timeline_set_act_time(at, v); -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim_timeline.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim_timeline.h deleted file mode 100644 index e8fd8be..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_anim_timeline.h +++ /dev/null @@ -1,136 +0,0 @@ -/** - * @file lv_anim_timeline.h - * - */ - -#ifndef LV_ANIM_TIMELINE_H -#define LV_ANIM_TIMELINE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_anim.h" - -/********************* - * DEFINES - *********************/ - -#define LV_ANIM_TIMELINE_PROGRESS_MAX 0xFFFF - -/********************** - * TYPEDEFS - **********************/ - -typedef struct lv_anim_timeline_t lv_anim_timeline_t; - -/********************** -* GLOBAL PROTOTYPES -**********************/ - -/** - * Create an animation timeline. - * @return pointer to the animation timeline. - */ -lv_anim_timeline_t * lv_anim_timeline_create(void); - -/** - * Delete animation timeline. - * @param at pointer to the animation timeline. - */ -void lv_anim_timeline_delete(lv_anim_timeline_t * at); - -/** - * Add animation to the animation timeline. - * @param at pointer to the animation timeline. - * @param start_time the time the animation started on the timeline, note that start_time will override the value of delay. - * @param a pointer to an animation. - */ -void lv_anim_timeline_add(lv_anim_timeline_t * at, uint32_t start_time, const lv_anim_t * a); - -/** - * Start the animation timeline. - * @param at pointer to the animation timeline. - * @return total time spent in animation timeline. - */ -uint32_t lv_anim_timeline_start(lv_anim_timeline_t * at); - -/** - * Pause the animation timeline. - * @param at pointer to the animation timeline. - */ -void lv_anim_timeline_pause(lv_anim_timeline_t * at); - -/** - * Set the playback direction of the animation timeline. - * @param at pointer to the animation timeline. - * @param reverse whether to play in reverse. - */ -void lv_anim_timeline_set_reverse(lv_anim_timeline_t * at, bool reverse); - -/** - * Make the animation timeline repeat itself. - * @param at pointer to the animation timeline. - * @param cnt repeat count or `LV_ANIM_REPEAT_INFINITE` for infinite repetition. 0: to disable repetition. - */ -void lv_anim_timeline_set_repeat_count(lv_anim_timeline_t * at, uint32_t cnt); - -/** - * Set a delay before repeating the animation timeline. - * @param at pointer to the animation timeline. - * @param delay delay in milliseconds before repeating the animation timeline. - */ -void lv_anim_timeline_set_repeat_delay(lv_anim_timeline_t * at, uint32_t delay); - -/** - * Set the progress of the animation timeline. - * @param at pointer to the animation timeline. - * @param progress set value 0~65535 to map 0~100% animation progress. - */ -void lv_anim_timeline_set_progress(lv_anim_timeline_t * at, uint16_t progress); - -/** - * Get the time used to play the animation timeline. - * @param at pointer to the animation timeline. - * @return total time spent in animation timeline. - */ -uint32_t lv_anim_timeline_get_playtime(lv_anim_timeline_t * at); - -/** - * Get whether the animation timeline is played in reverse. - * @param at pointer to the animation timeline. - * @return return true if it is reverse playback. - */ -bool lv_anim_timeline_get_reverse(lv_anim_timeline_t * at); - -/** - * Get the progress of the animation timeline. - * @param at pointer to the animation timeline. - * @return return value 0~65535 to map 0~100% animation progress. - */ -uint16_t lv_anim_timeline_get_progress(lv_anim_timeline_t * at); - -/** - * Get repeat count of the animation timeline. - * @param at pointer to the animation timeline. - */ -uint32_t lv_anim_timeline_get_repeat_count(lv_anim_timeline_t * at); - -/** - * Get repeat delay of the animation timeline. - * @param at pointer to the animation timeline. - */ -uint32_t lv_anim_timeline_get_repeat_delay(lv_anim_timeline_t * at); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_ANIM_TIMELINE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_area.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_area.c deleted file mode 100644 index 4410076..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_area.c +++ /dev/null @@ -1,603 +0,0 @@ -/** - * @file lv_area.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "../core/lv_global.h" - -#include "lv_area_private.h" -#include "lv_math.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static bool lv_point_within_circle(const lv_area_t * area, const lv_point_t * p); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_area_set(lv_area_t * area_p, int32_t x1, int32_t y1, int32_t x2, int32_t y2) -{ - area_p->x1 = x1; - area_p->y1 = y1; - area_p->x2 = x2; - area_p->y2 = y2; -} - -void lv_area_set_width(lv_area_t * area_p, int32_t w) -{ - area_p->x2 = area_p->x1 + w - 1; -} - -void lv_area_set_height(lv_area_t * area_p, int32_t h) -{ - area_p->y2 = area_p->y1 + h - 1; -} - -void lv_area_set_pos(lv_area_t * area_p, int32_t x, int32_t y) -{ - int32_t w = lv_area_get_width(area_p); - int32_t h = lv_area_get_height(area_p); - area_p->x1 = x; - area_p->y1 = y; - lv_area_set_width(area_p, w); - lv_area_set_height(area_p, h); -} - -uint32_t lv_area_get_size(const lv_area_t * area_p) -{ - uint32_t size; - - size = (uint32_t)(area_p->x2 - area_p->x1 + 1) * (area_p->y2 - area_p->y1 + 1); - - return size; -} - -void lv_area_increase(lv_area_t * area, int32_t w_extra, int32_t h_extra) -{ - area->x1 -= w_extra; - area->x2 += w_extra; - area->y1 -= h_extra; - area->y2 += h_extra; -} - -void lv_area_move(lv_area_t * area, int32_t x_ofs, int32_t y_ofs) -{ - area->x1 += x_ofs; - area->x2 += x_ofs; - area->y1 += y_ofs; - area->y2 += y_ofs; -} - -bool lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) -{ - /*Get the smaller area from 'a1_p' and 'a2_p'*/ - res_p->x1 = LV_MAX(a1_p->x1, a2_p->x1); - res_p->y1 = LV_MAX(a1_p->y1, a2_p->y1); - res_p->x2 = LV_MIN(a1_p->x2, a2_p->x2); - res_p->y2 = LV_MIN(a1_p->y2, a2_p->y2); - - /*If x1 or y1 greater than x2 or y2 then the areas union is empty*/ - bool union_ok = true; - if((res_p->x1 > res_p->x2) || (res_p->y1 > res_p->y2)) { - union_ok = false; - } - - return union_ok; -} - -int8_t lv_area_diff(lv_area_t res_p[], const lv_area_t * a1_p, const lv_area_t * a2_p) -{ - /*Areas have no common parts*/ - if(!lv_area_is_on(a1_p, a2_p)) return -1; - - /*No remaining areas after removing common parts*/ - if(lv_area_is_in(a1_p, a2_p, 0)) return 0; - - /*Result counter*/ - int8_t res_c = 0; - - /*Get required information*/ - lv_area_t n; - int32_t a1_w = lv_area_get_width(a1_p) - 1; - int32_t a1_h = lv_area_get_height(a1_p) - 1; - - /*Compute top rectangle*/ - int32_t th = a2_p->y1 - a1_p->y1; - if(th > 0) { - n.x1 = a1_p->x1; - n.y1 = a1_p->y1; - n.x2 = a1_p->x2; - n.y2 = a1_p->y1 + th; - res_p[res_c++] = n; - } - - /*Compute the bottom rectangle*/ - int32_t bh = a1_h - (a2_p->y2 - a1_p->y1); - if(bh > 0 && a2_p->y2 < a1_p->y2) { - n.x1 = a1_p->x1; - n.y1 = a2_p->y2; - n.x2 = a1_p->x2; - n.y2 = a2_p->y2 + bh; - res_p[res_c++] = n; - } - - /*Compute side height*/ - int32_t y1 = a2_p->y1 > a1_p->y1 ? a2_p->y1 : a1_p->y1; - int32_t y2 = a2_p->y2 < a1_p->y2 ? a2_p->y2 : a1_p->y2; - int32_t sh = y2 - y1; - - /*Compute the left rectangle*/ - int32_t lw = a2_p->x1 - a1_p->x1; - if(lw > 0 && sh > 0) { - n.x1 = a1_p->x1; - n.y1 = y1; - n.x2 = a1_p->x1 + lw; - n.y2 = y1 + sh; - res_p[res_c++] = n; - } - - /*Compute the right rectangle*/ - int32_t rw = a1_w - (a2_p->x2 - a1_p->x1); - if(rw > 0) { - n.x1 = a2_p->x2; - n.y1 = y1; - n.x2 = a2_p->x2 + rw; - n.y2 = y1 + sh; - res_p[res_c++] = n; - } - - //Return number of results - return res_c; -} - -void lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) -{ - a_res_p->x1 = LV_MIN(a1_p->x1, a2_p->x1); - a_res_p->y1 = LV_MIN(a1_p->y1, a2_p->y1); - a_res_p->x2 = LV_MAX(a1_p->x2, a2_p->x2); - a_res_p->y2 = LV_MAX(a1_p->y2, a2_p->y2); -} - -bool lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t radius) -{ - /*First check the basic area*/ - bool is_on_rect = false; - if((p_p->x >= a_p->x1 && p_p->x <= a_p->x2) && ((p_p->y >= a_p->y1 && p_p->y <= a_p->y2))) { - is_on_rect = true; - } - if(!is_on_rect) - return false; - /*Now handle potential rounded rectangles*/ - if(radius <= 0) { - /*No radius, it is within the rectangle*/ - return true; - } - int32_t w = lv_area_get_width(a_p) / 2; - int32_t h = lv_area_get_height(a_p) / 2; - int32_t max_radius = LV_MIN(w, h); - if(radius > max_radius) - radius = max_radius; - - /*Check if it's in one of the corners*/ - lv_area_t corner_area; - /*Top left*/ - corner_area.x1 = a_p->x1; - corner_area.x2 = a_p->x1 + radius; - corner_area.y1 = a_p->y1; - corner_area.y2 = a_p->y1 + radius; - if(lv_area_is_point_on(&corner_area, p_p, 0)) { - corner_area.x2 += radius; - corner_area.y2 += radius; - return lv_point_within_circle(&corner_area, p_p); - } - /*Bottom left*/ - corner_area.y1 = a_p->y2 - radius; - corner_area.y2 = a_p->y2; - if(lv_area_is_point_on(&corner_area, p_p, 0)) { - corner_area.x2 += radius; - corner_area.y1 -= radius; - return lv_point_within_circle(&corner_area, p_p); - } - /*Bottom right*/ - corner_area.x1 = a_p->x2 - radius; - corner_area.x2 = a_p->x2; - if(lv_area_is_point_on(&corner_area, p_p, 0)) { - corner_area.x1 -= radius; - corner_area.y1 -= radius; - return lv_point_within_circle(&corner_area, p_p); - } - /*Top right*/ - corner_area.y1 = a_p->y1; - corner_area.y2 = a_p->y1 + radius; - if(lv_area_is_point_on(&corner_area, p_p, 0)) { - corner_area.x1 -= radius; - corner_area.y2 += radius; - return lv_point_within_circle(&corner_area, p_p); - } - /*Not within corners*/ - return true; -} - -bool lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p) -{ - if((a1_p->x1 <= a2_p->x2) && (a1_p->x2 >= a2_p->x1) && (a1_p->y1 <= a2_p->y2) && (a1_p->y2 >= a2_p->y1)) { - return true; - } - else { - return false; - } -} - -bool lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, int32_t radius) -{ - bool is_in = false; - - if(ain_p->x1 >= aholder_p->x1 && ain_p->y1 >= aholder_p->y1 && ain_p->x2 <= aholder_p->x2 && - ain_p->y2 <= aholder_p->y2) { - is_in = true; - } - - if(!is_in) return false; - if(radius == 0) return true; - - /*Check if the corner points are inside the radius or not*/ - lv_point_t p; - - lv_point_set(&p, ain_p->x1, ain_p->y1); - if(lv_area_is_point_on(aholder_p, &p, radius) == false) return false; - - lv_point_set(&p, ain_p->x2, ain_p->y1); - if(lv_area_is_point_on(aholder_p, &p, radius) == false) return false; - - lv_point_set(&p, ain_p->x1, ain_p->y2); - if(lv_area_is_point_on(aholder_p, &p, radius) == false) return false; - - lv_point_set(&p, ain_p->x2, ain_p->y2); - if(lv_area_is_point_on(aholder_p, &p, radius) == false) return false; - - return true; -} - -bool lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, int32_t radius) -{ - if(aout_p->x2 < aholder_p->x1 || aout_p->y2 < aholder_p->y1 || aout_p->x1 > aholder_p->x2 || - aout_p->y1 > aholder_p->y2) { - return true; - } - - if(radius == 0) return false; - - /*Check if the corner points are outside the radius or not*/ - lv_point_t p; - - lv_point_set(&p, aout_p->x1, aout_p->y1); - if(lv_area_is_point_on(aholder_p, &p, radius)) return false; - - lv_point_set(&p, aout_p->x2, aout_p->y1); - if(lv_area_is_point_on(aholder_p, &p, radius)) return false; - - lv_point_set(&p, aout_p->x1, aout_p->y2); - if(lv_area_is_point_on(aholder_p, &p, radius)) return false; - - lv_point_set(&p, aout_p->x2, aout_p->y2); - if(lv_area_is_point_on(aholder_p, &p, radius)) return false; - - return true; -} - -bool lv_area_is_equal(const lv_area_t * a, const lv_area_t * b) -{ - return a->x1 == b->x1 && a->x2 == b->x2 && a->y1 == b->y1 && a->y2 == b->y2; -} - -void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t align, int32_t ofs_x, int32_t ofs_y) -{ - - int32_t x; - int32_t y; - switch(align) { - case LV_ALIGN_CENTER: - x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; - y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; - break; - - case LV_ALIGN_TOP_LEFT: - x = 0; - y = 0; - break; - case LV_ALIGN_TOP_MID: - x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; - y = 0; - break; - - case LV_ALIGN_TOP_RIGHT: - x = lv_area_get_width(base) - lv_area_get_width(to_align); - y = 0; - break; - - case LV_ALIGN_BOTTOM_LEFT: - x = 0; - y = lv_area_get_height(base) - lv_area_get_height(to_align); - break; - case LV_ALIGN_BOTTOM_MID: - x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; - y = lv_area_get_height(base) - lv_area_get_height(to_align); - break; - - case LV_ALIGN_BOTTOM_RIGHT: - x = lv_area_get_width(base) - lv_area_get_width(to_align); - y = lv_area_get_height(base) - lv_area_get_height(to_align); - break; - - case LV_ALIGN_LEFT_MID: - x = 0; - y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; - break; - - case LV_ALIGN_RIGHT_MID: - x = lv_area_get_width(base) - lv_area_get_width(to_align); - y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; - break; - - case LV_ALIGN_OUT_TOP_LEFT: - x = 0; - y = -lv_area_get_height(to_align); - break; - - case LV_ALIGN_OUT_TOP_MID: - x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; - y = -lv_area_get_height(to_align); - break; - - case LV_ALIGN_OUT_TOP_RIGHT: - x = lv_area_get_width(base) - lv_area_get_width(to_align); - y = -lv_area_get_height(to_align); - break; - - case LV_ALIGN_OUT_BOTTOM_LEFT: - x = 0; - y = lv_area_get_height(base); - break; - - case LV_ALIGN_OUT_BOTTOM_MID: - x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; - y = lv_area_get_height(base); - break; - - case LV_ALIGN_OUT_BOTTOM_RIGHT: - x = lv_area_get_width(base) - lv_area_get_width(to_align); - y = lv_area_get_height(base); - break; - - case LV_ALIGN_OUT_LEFT_TOP: - x = -lv_area_get_width(to_align); - y = 0; - break; - - case LV_ALIGN_OUT_LEFT_MID: - x = -lv_area_get_width(to_align); - y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; - break; - - case LV_ALIGN_OUT_LEFT_BOTTOM: - x = -lv_area_get_width(to_align); - y = lv_area_get_height(base) - lv_area_get_height(to_align); - break; - - case LV_ALIGN_OUT_RIGHT_TOP: - x = lv_area_get_width(base); - y = 0; - break; - - case LV_ALIGN_OUT_RIGHT_MID: - x = lv_area_get_width(base); - y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; - break; - - case LV_ALIGN_OUT_RIGHT_BOTTOM: - x = lv_area_get_width(base); - y = lv_area_get_height(base) - lv_area_get_height(to_align); - break; - default: - x = 0; - y = 0; - break; - } - - x += base->x1; - y += base->y1; - - int32_t w = lv_area_get_width(to_align); - int32_t h = lv_area_get_height(to_align); - to_align->x1 = x + ofs_x; - to_align->y1 = y + ofs_y; - to_align->x2 = to_align->x1 + w - 1; - to_align->y2 = to_align->y1 + h - 1; -} - -#define LV_TRANSFORM_TRIGO_SHIFT 10 - -void lv_point_transform(lv_point_t * point, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot, - bool zoom_first) -{ - lv_point_array_transform(point, 1, angle, scale_x, scale_y, pivot, zoom_first); -} - -void lv_point_array_transform(lv_point_t * points, size_t count, int32_t angle, int32_t scale_x, int32_t scale_y, - const lv_point_t * pivot, - bool zoom_first) -{ - if(angle == 0 && scale_x == 256 && scale_y == 256) { - return; - } - uint32_t i; - for(i = 0; i < count; i++) { - points[i].x -= pivot->x; - points[i].y -= pivot->y; - - } - - if(angle == 0) { - for(i = 0; i < count; i++) { - points[i].x = (((int32_t)(points[i].x) * scale_x) >> 8) + pivot->x; - points[i].y = (((int32_t)(points[i].y) * scale_y) >> 8) + pivot->y; - } - return; - } - - int32_t angle_limited = angle; - if(angle_limited > 3600) angle_limited -= 3600; - if(angle_limited < 0) angle_limited += 3600; - - int32_t angle_low = angle_limited / 10; - int32_t angle_high = angle_low + 1; - int32_t angle_rem = angle_limited - (angle_low * 10); - - int32_t s1 = lv_trigo_sin(angle_low); - int32_t s2 = lv_trigo_sin(angle_high); - - int32_t c1 = lv_trigo_sin(angle_low + 90); - int32_t c2 = lv_trigo_sin(angle_high + 90); - - int32_t sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10; - sinma = sinma >> (LV_TRIGO_SHIFT - LV_TRANSFORM_TRIGO_SHIFT); - int32_t cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10; - cosma = cosma >> (LV_TRIGO_SHIFT - LV_TRANSFORM_TRIGO_SHIFT); - - for(i = 0; i < count; i++) { - int32_t x = points[i].x; - int32_t y = points[i].y; - if(scale_x == 256 && scale_y == 256) { - points[i].x = ((cosma * x - sinma * y) >> LV_TRANSFORM_TRIGO_SHIFT) + pivot->x; - points[i].y = ((sinma * x + cosma * y) >> LV_TRANSFORM_TRIGO_SHIFT) + pivot->y; - } - else { - if(zoom_first) { - x *= scale_x; - y *= scale_y; - points[i].x = (((cosma * x - sinma * y)) >> (LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x; - points[i].y = (((sinma * x + cosma * y)) >> (LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y; - } - else { - points[i].x = (((cosma * x - sinma * y) * scale_x) >> (LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x; - points[i].y = (((sinma * x + cosma * y) * scale_y) >> (LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y; - } - } - } -} - -int32_t lv_area_get_width(const lv_area_t * area_p) -{ - return (int32_t)(area_p->x2 - area_p->x1 + 1); -} - -int32_t lv_area_get_height(const lv_area_t * area_p) -{ - return (int32_t)(area_p->y2 - area_p->y1 + 1); -} - -lv_point_t lv_point_from_precise(const lv_point_precise_t * p) -{ - lv_point_t point = { - (int32_t)p->x, (int32_t)p->y - }; - - return point; -} - -lv_point_precise_t lv_point_to_precise(const lv_point_t * p) -{ - lv_point_precise_t point = { - (lv_value_precise_t)p->x, (lv_value_precise_t)p->y - }; - - return point; -} - -void lv_point_set(lv_point_t * p, int32_t x, int32_t y) -{ - p->x = x; - p->y = y; -} - -void lv_point_precise_set(lv_point_precise_t * p, lv_value_precise_t x, lv_value_precise_t y) -{ - p->x = x; - p->y = y; -} - -void lv_point_swap(lv_point_t * p1, lv_point_t * p2) -{ - lv_point_t tmp = *p1; - *p1 = *p2; - *p2 = tmp; -} - -void lv_point_precise_swap(lv_point_precise_t * p1, lv_point_precise_t * p2) -{ - lv_point_precise_t tmp = *p1; - *p1 = *p2; - *p2 = tmp; -} - -int32_t lv_pct(int32_t x) -{ - return LV_PCT(x); -} - -int32_t lv_pct_to_px(int32_t v, int32_t base) -{ - if(LV_COORD_IS_PCT(v)) { - return (LV_COORD_GET_PCT(v) * base) / 100; - } - - return v; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static bool lv_point_within_circle(const lv_area_t * area, const lv_point_t * p) -{ - int32_t r = (area->x2 - area->x1) / 2; - - /*Circle center*/ - int32_t cx = area->x1 + r; - int32_t cy = area->y1 + r; - - /*Simplify the code by moving everything to (0, 0)*/ - int32_t px = p->x - cx; - int32_t py = p->y - cy; - - uint32_t r_sqrd = r * r; - uint32_t dist = (px * px) + (py * py); - - if(dist <= r_sqrd) - return true; - else - return false; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_area.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_area.h deleted file mode 100644 index 0798c74..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_area.h +++ /dev/null @@ -1,254 +0,0 @@ -/** - * @file lv_area.h - * - */ - -#ifndef LV_AREA_H -#define LV_AREA_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "lv_types.h" -#include "lv_math.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Represents a point on the screen. - */ -typedef struct { - int32_t x; - int32_t y; -} lv_point_t; - -typedef struct { - lv_value_precise_t x; - lv_value_precise_t y; -} lv_point_precise_t; - -/** Represents an area of the screen.*/ -typedef struct { - int32_t x1; - int32_t y1; - int32_t x2; - int32_t y2; -} lv_area_t; - -/** Alignments*/ - -typedef enum { - LV_ALIGN_DEFAULT = 0, - LV_ALIGN_TOP_LEFT, - LV_ALIGN_TOP_MID, - LV_ALIGN_TOP_RIGHT, - LV_ALIGN_BOTTOM_LEFT, - LV_ALIGN_BOTTOM_MID, - LV_ALIGN_BOTTOM_RIGHT, - LV_ALIGN_LEFT_MID, - LV_ALIGN_RIGHT_MID, - LV_ALIGN_CENTER, - - LV_ALIGN_OUT_TOP_LEFT, - LV_ALIGN_OUT_TOP_MID, - LV_ALIGN_OUT_TOP_RIGHT, - LV_ALIGN_OUT_BOTTOM_LEFT, - LV_ALIGN_OUT_BOTTOM_MID, - LV_ALIGN_OUT_BOTTOM_RIGHT, - LV_ALIGN_OUT_LEFT_TOP, - LV_ALIGN_OUT_LEFT_MID, - LV_ALIGN_OUT_LEFT_BOTTOM, - LV_ALIGN_OUT_RIGHT_TOP, - LV_ALIGN_OUT_RIGHT_MID, - LV_ALIGN_OUT_RIGHT_BOTTOM, -} lv_align_t; - -typedef enum { - LV_DIR_NONE = 0x00, - LV_DIR_LEFT = (1 << 0), - LV_DIR_RIGHT = (1 << 1), - LV_DIR_TOP = (1 << 2), - LV_DIR_BOTTOM = (1 << 3), - LV_DIR_HOR = LV_DIR_LEFT | LV_DIR_RIGHT, - LV_DIR_VER = LV_DIR_TOP | LV_DIR_BOTTOM, - LV_DIR_ALL = LV_DIR_HOR | LV_DIR_VER, -} lv_dir_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize an area - * @param area_p pointer to an area - * @param x1 left coordinate of the area - * @param y1 top coordinate of the area - * @param x2 right coordinate of the area - * @param y2 bottom coordinate of the area - */ -void lv_area_set(lv_area_t * area_p, int32_t x1, int32_t y1, int32_t x2, int32_t y2); - -/** - * Copy an area - * @param dest pointer to the destination area - * @param src pointer to the source area - */ -inline static void lv_area_copy(lv_area_t * dest, const lv_area_t * src) -{ - dest->x1 = src->x1; - dest->y1 = src->y1; - dest->x2 = src->x2; - dest->y2 = src->y2; -} - -/** - * Get the width of an area - * @param area_p pointer to an area - * @return the width of the area (if x1 == x2 -> width = 1) - */ -int32_t lv_area_get_width(const lv_area_t * area_p); - -/** - * Get the height of an area - * @param area_p pointer to an area - * @return the height of the area (if y1 == y2 -> height = 1) - */ -int32_t lv_area_get_height(const lv_area_t * area_p); - -/** - * Set the width of an area - * @param area_p pointer to an area - * @param w the new width of the area (w == 1 makes x1 == x2) - */ -void lv_area_set_width(lv_area_t * area_p, int32_t w); - -/** - * Set the height of an area - * @param area_p pointer to an area - * @param h the new height of the area (h == 1 makes y1 == y2) - */ -void lv_area_set_height(lv_area_t * area_p, int32_t h); - -/** - * Return with area of an area (x * y) - * @param area_p pointer to an area - * @return size of area - */ -uint32_t lv_area_get_size(const lv_area_t * area_p); - -void lv_area_increase(lv_area_t * area, int32_t w_extra, int32_t h_extra); - -void lv_area_move(lv_area_t * area, int32_t x_ofs, int32_t y_ofs); - -/** - * Align an area to another - * @param base an area where the other will be aligned - * @param to_align the area to align - * @param align `LV_ALIGN_...` - * @param ofs_x X offset - * @param ofs_y Y offset - */ -void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t align, int32_t ofs_x, int32_t ofs_y); - -/** - * Transform a point - * @param point pointer to a point - * @param angle angle with 0.1 resolutions (123 means 12.3°) - * @param scale_x horizontal zoom, 256 means 100% - * @param scale_y vertical zoom, 256 means 100% - * @param pivot pointer to the pivot point of the transformation - * @param zoom_first true: zoom first and rotate after that; else: opposite order - */ -void lv_point_transform(lv_point_t * point, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot, - bool zoom_first); - -/** - * Transform an array of points - * @param points pointer to an array of points - * @param count number of points in the array - * @param angle angle with 0.1 resolutions (123 means 12.3°) - * @param scale_x horizontal zoom, 256 means 100% - * @param scale_y vertical zoom, 256 means 100% - * @param pivot pointer to the pivot point of the transformation - * @param zoom_first true: zoom first and rotate after that; else: opposite order - */ -void lv_point_array_transform(lv_point_t * points, size_t count, int32_t angle, int32_t scale_x, int32_t scale_y, - const lv_point_t * pivot, - bool zoom_first); - -lv_point_t lv_point_from_precise(const lv_point_precise_t * p); - -lv_point_precise_t lv_point_to_precise(const lv_point_t * p); - -void lv_point_set(lv_point_t * p, int32_t x, int32_t y); - -void lv_point_precise_set(lv_point_precise_t * p, lv_value_precise_t x, lv_value_precise_t y); - -void lv_point_swap(lv_point_t * p1, lv_point_t * p2); - -void lv_point_precise_swap(lv_point_precise_t * p1, lv_point_precise_t * p2); - -/********************** - * MACROS - **********************/ - -#define LV_COORD_TYPE_SHIFT (29U) - -#define LV_COORD_TYPE_MASK (3 << LV_COORD_TYPE_SHIFT) -#define LV_COORD_TYPE(x) ((x) & LV_COORD_TYPE_MASK) /*Extract type specifiers*/ -#define LV_COORD_PLAIN(x) ((x) & ~LV_COORD_TYPE_MASK) /*Remove type specifiers*/ - -#define LV_COORD_TYPE_PX (0 << LV_COORD_TYPE_SHIFT) -#define LV_COORD_TYPE_SPEC (1 << LV_COORD_TYPE_SHIFT) -#define LV_COORD_TYPE_PX_NEG (3 << LV_COORD_TYPE_SHIFT) - -#define LV_COORD_IS_PX(x) (LV_COORD_TYPE(x) == LV_COORD_TYPE_PX || LV_COORD_TYPE(x) == LV_COORD_TYPE_PX_NEG) -#define LV_COORD_IS_SPEC(x) (LV_COORD_TYPE(x) == LV_COORD_TYPE_SPEC) - -#define LV_COORD_SET_SPEC(x) ((x) | LV_COORD_TYPE_SPEC) - -/** Max coordinate value */ -#define LV_COORD_MAX ((1 << LV_COORD_TYPE_SHIFT) - 1) -#define LV_COORD_MIN (-LV_COORD_MAX) - -/*Special coordinates*/ -#define LV_SIZE_CONTENT LV_COORD_SET_SPEC(LV_COORD_MAX) -#define LV_PCT_STORED_MAX (LV_COORD_MAX - 1) -#if LV_PCT_STORED_MAX % 2 != 0 -#error LV_PCT_STORED_MAX should be an even number -#endif -#define LV_PCT_POS_MAX (LV_PCT_STORED_MAX / 2) -#define LV_PCT(x) (LV_COORD_SET_SPEC(((x) < 0 ? (LV_PCT_POS_MAX - LV_MAX((x), -LV_PCT_POS_MAX)) : LV_MIN((x), LV_PCT_POS_MAX)))) -#define LV_COORD_IS_PCT(x) ((LV_COORD_IS_SPEC(x) && LV_COORD_PLAIN(x) <= LV_PCT_STORED_MAX)) -#define LV_COORD_GET_PCT(x) (LV_COORD_PLAIN(x) > LV_PCT_POS_MAX ? LV_PCT_POS_MAX - LV_COORD_PLAIN(x) : LV_COORD_PLAIN(x)) - -LV_EXPORT_CONST_INT(LV_COORD_MAX); -LV_EXPORT_CONST_INT(LV_COORD_MIN); -LV_EXPORT_CONST_INT(LV_SIZE_CONTENT); - -/** - * Convert a percentage value to `int32_t`. - * Percentage values are stored in special range - * @param x the percentage (0..1000) - * @return a coordinate that stores the percentage - */ -int32_t lv_pct(int32_t x); - -int32_t lv_pct_to_px(int32_t v, int32_t base); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_area_private.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_area_private.h deleted file mode 100644 index bebca59..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_area_private.h +++ /dev/null @@ -1,115 +0,0 @@ -/** - * @file lv_area_private.h - * - */ - -#ifndef LV_AREA_PRIVATE_H -#define LV_AREA_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_area.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Set the position of an area (width and height will be kept) - * @param area_p pointer to an area - * @param x the new x coordinate of the area - * @param y the new y coordinate of the area - */ -void lv_area_set_pos(lv_area_t * area_p, int32_t x, int32_t y); - -/** - * Get the common parts of two areas - * @param res_p pointer to an area, the result will be stored her - * @param a1_p pointer to the first area - * @param a2_p pointer to the second area - * @return false: the two area has NO common parts, res_p is invalid - */ -bool lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); - -/** - * Get resulting sub areas after removing the common parts of two areas from the first area - * @param res_p pointer to an array of areas with a count of 4, the resulting areas will be stored here - * @param a1_p pointer to the first area - * @param a2_p pointer to the second area - * @return number of results (max 4) or -1 if no intersect - */ -int8_t lv_area_diff(lv_area_t res_p[], const lv_area_t * a1_p, const lv_area_t * a2_p); - -/** - * Join two areas into a third which involves the other two - * @param a_res_p pointer to an area, the result will be stored here - * @param a1_p pointer to the first area - * @param a2_p pointer to the second area - */ -void lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); - -/** - * Check if a point is on an area - * @param a_p pointer to an area - * @param p_p pointer to a point - * @param radius radius of area (e.g. for rounded rectangle) - * @return false:the point is out of the area - */ -bool lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t radius); - -/** - * Check if two area has common parts - * @param a1_p pointer to an area. - * @param a2_p pointer to another area - * @return false: a1_p and a2_p has no common parts - */ -bool lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p); - -/** - * Check if an area is fully on another - * @param ain_p pointer to an area which could be in 'aholder_p' - * @param aholder_p pointer to an area which could involve 'ain_p' - * @param radius radius of `aholder_p` (e.g. for rounded rectangle) - * @return true: `ain_p` is fully inside `aholder_p` - */ -bool lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, int32_t radius); - -/** - * Check if an area is fully out of another - * @param aout_p pointer to an area which could be in 'aholder_p' - * @param aholder_p pointer to an area which could involve 'ain_p' - * @param radius radius of `aholder_p` (e.g. for rounded rectangle) - * @return true: `aout_p` is fully outside `aholder_p` - */ -bool lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, int32_t radius); - -/** - * Check if 2 area is the same - * @param a pointer to an area - * @param b pointer to another area - */ -bool lv_area_is_equal(const lv_area_t * a, const lv_area_t * b); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_AREA_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_array.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_array.c deleted file mode 100644 index 39382bc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_array.c +++ /dev/null @@ -1,222 +0,0 @@ -/** - * @file lv_array.c - * Array. - * The nodes are dynamically allocated by the 'lv_mem' module, - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_array.h" -#include "../stdlib/lv_mem.h" -#include "../stdlib/lv_string.h" - -#include "lv_assert.h" -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ -void lv_array_init(lv_array_t * array, uint32_t capacity, uint32_t element_size) -{ - array->size = 0; - array->capacity = capacity; - array->element_size = element_size; - - array->data = lv_malloc(capacity * element_size); - LV_ASSERT_MALLOC(array->data); -} - -void lv_array_deinit(lv_array_t * array) -{ - if(array->data) { - lv_free(array->data); - array->data = NULL; - } - - array->size = 0; - array->capacity = 0; -} - -void lv_array_copy(lv_array_t * target, const lv_array_t * source) -{ - if(lv_array_is_empty(source)) { - return; - } - lv_array_deinit(target); - lv_array_init(target, source->capacity, source->element_size); - lv_memcpy(target->data, source->data, source->size * source->element_size); - target->size = source->size; -} - -void lv_array_shrink(lv_array_t * array) -{ - if(array->size <= array->capacity / LV_ARRAY_DEFAULT_SHRINK_RATIO) { - lv_array_resize(array, array->size); - } -} - -lv_result_t lv_array_remove(lv_array_t * array, uint32_t index) -{ - if(index >= array->size) { - return LV_RESULT_INVALID; - } - - /*Shortcut*/ - if(index == array->size - 1) { - array->size--; - lv_array_shrink(array); - return LV_RESULT_OK; - } - - uint8_t * start = lv_array_at(array, index); - uint8_t * remaining = start + array->element_size; - uint32_t remaining_size = (array->size - index - 1) * array->element_size; - lv_memmove(start, remaining, remaining_size); - array->size--; - lv_array_shrink(array); - return LV_RESULT_OK; -} - -lv_result_t lv_array_erase(lv_array_t * array, uint32_t start, uint32_t end) -{ - if(end > array->size) { - end = array->size; - } - - if(start >= end) { - return LV_RESULT_INVALID; - } - - /*Shortcut*/ - if(end == array->size) { - array->size = start; - lv_array_shrink(array); - return LV_RESULT_OK; - } - - uint8_t * start_p = lv_array_at(array, start); - uint8_t * remaining = start_p + (end - start) * array->element_size; - uint32_t remaining_size = (array->size - end) * array->element_size; - lv_memcpy(start_p, remaining, remaining_size); - array->size -= (end - start); - lv_array_shrink(array); - return LV_RESULT_OK; -} - -void lv_array_resize(lv_array_t * array, uint32_t new_capacity) -{ - uint8_t * data = lv_realloc(array->data, new_capacity * array->element_size); - LV_ASSERT_NULL(data); - array->data = data; - array->capacity = new_capacity; - if(array->size > new_capacity) { - array->size = new_capacity; - } -} - -lv_result_t lv_array_concat(lv_array_t * array, const lv_array_t * other) -{ - LV_ASSERT_NULL(array->data); - uint32_t size = other->size; - if(array->size + size > array->capacity) { - /*array is full*/ - lv_array_resize(array, array->size + size); - } - - uint8_t * data = array->data + array->size * array->element_size; - lv_memcpy(data, other->data, array->element_size * size); - array->size += size; - return LV_RESULT_OK; -} - -lv_result_t lv_array_push_back(lv_array_t * array, const void * element) -{ - LV_ASSERT_NULL(array->data); - - if(array->size == array->capacity) { - /*array is full*/ - lv_array_resize(array, array->capacity + LV_ARRAY_DEFAULT_CAPACITY); - } - - uint8_t * data = array->data + array->size * array->element_size; - lv_memcpy(data, element, array->element_size); - array->size++; - return LV_RESULT_OK; -} - -void * lv_array_at(const lv_array_t * array, uint32_t index) -{ - if(index >= array->size) { - return NULL; - } - - LV_ASSERT_NULL(array->data); - return array->data + index * array->element_size; -} - -lv_result_t lv_array_assign(lv_array_t * array, uint32_t index, const void * value) -{ - uint8_t * data = lv_array_at(array, index); - if(data == NULL) return LV_RESULT_INVALID; - - lv_memcpy(data, value, array->element_size); - return LV_RESULT_OK; -} - -uint32_t lv_array_size(const lv_array_t * array) -{ - return array->size; -} - -uint32_t lv_array_capacity(const lv_array_t * array) -{ - return array->capacity; -} - -bool lv_array_is_empty(const lv_array_t * array) -{ - return array->size == 0; -} - -bool lv_array_is_full(const lv_array_t * array) -{ - return array->size == array->capacity; -} - -void lv_array_clear(lv_array_t * array) -{ - array->size = 0; -} - -void * lv_array_front(const lv_array_t * array) -{ - return lv_array_at(array, 0); -} - -void * lv_array_back(const lv_array_t * array) -{ - return lv_array_at(array, lv_array_size(array) - 1); -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_array.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_array.h deleted file mode 100644 index e63f563..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_array.h +++ /dev/null @@ -1,191 +0,0 @@ -/** - * @file lv_array.h - * Array. The elements are dynamically allocated by the 'lv_mem' module. - */ - -#ifndef LV_ARRAY_H -#define LV_ARRAY_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ - -#ifndef LV_ARRAY_DEFAULT_CAPACITY -#define LV_ARRAY_DEFAULT_CAPACITY 4 -#endif - -#ifndef LV_ARRAY_DEFAULT_SHRINK_RATIO -#define LV_ARRAY_DEFAULT_SHRINK_RATIO 2 -#endif - -/********************** - * TYPEDEFS - **********************/ - -/** Description of a array*/ -typedef struct { - uint8_t * data; - uint32_t size; - uint32_t capacity; - uint32_t element_size; -} lv_array_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Init an array. - * @param array pointer to an `lv_array_t` variable to initialize - * @param capacity the initial capacity of the array - * @param element_size the size of an element in bytes - */ -void lv_array_init(lv_array_t * array, uint32_t capacity, uint32_t element_size); - -/** - * Resize the array to the given capacity. - * @note if the new capacity is smaller than the current size, the array will be truncated. - * @param array pointer to an `lv_array_t` variable - * @param new_capacity the new capacity of the array - */ -void lv_array_resize(lv_array_t * array, uint32_t new_capacity); - -/** - * Deinit the array, and free the allocated memory - * @param array pointer to an `lv_array_t` variable to deinitialize - */ -void lv_array_deinit(lv_array_t * array); - -/** - * Return how many elements are stored in the array. - * @param array pointer to an `lv_array_t` variable - * @return the number of elements stored in the array - */ -uint32_t lv_array_size(const lv_array_t * array); - -/** - * Return the capacity of the array, i.e. how many elements can be stored. - * @param array pointer to an `lv_array_t` variable - * @return the capacity of the array - */ -uint32_t lv_array_capacity(const lv_array_t * array); - -/** - * Return if the array is empty - * @param array pointer to an `lv_array_t` variable - * @return true: array is empty; false: array is not empty - */ -bool lv_array_is_empty(const lv_array_t * array); - -/** - * Return if the array is full - * @param array pointer to an `lv_array_t` variable - * @return true: array is full; false: array is not full - */ -bool lv_array_is_full(const lv_array_t * array); - -/** - * Copy an array to another. - * @note this will create a new array with the same capacity and size as the source array. - * @param target pointer to an `lv_array_t` variable to copy to - * @param source pointer to an `lv_array_t` variable to copy from - */ -void lv_array_copy(lv_array_t * target, const lv_array_t * source); - -/** - * Remove all elements in array. - * @param array pointer to an `lv_array_t` variable - */ -void lv_array_clear(lv_array_t * array); - -/** - * Shrink the memory capacity of array if necessary. - * @param array pointer to an `lv_array_t` variable - */ -void lv_array_shrink(lv_array_t * array); - -/** - * Remove the element at the specified position in the array. - * @param array pointer to an `lv_array_t` variable - * @param index the index of the element to remove - * @return LV_RESULT_OK: success, otherwise: error - */ -lv_result_t lv_array_remove(lv_array_t * array, uint32_t index); - -/** - * Remove from the array either a single element or a range of elements ([start, end)). - * @note This effectively reduces the container size by the number of elements removed. - * @note When start equals to end, the function has no effect. - * @param array pointer to an `lv_array_t` variable - * @param start the index of the first element to be removed - * @param end the index of the first element that is not to be removed - * @return LV_RESULT_OK: success, otherwise: error - */ -lv_result_t lv_array_erase(lv_array_t * array, uint32_t start, uint32_t end); - -/** - * Concatenate two arrays. Adds new elements to the end of the array. - * @note The destination array is automatically expanded as necessary. - * @param array pointer to an `lv_array_t` variable - * @param other pointer to the array to concatenate - * @return LV_RESULT_OK: success, otherwise: error - */ -lv_result_t lv_array_concat(lv_array_t * array, const lv_array_t * other); - -/** - * Push back element. Adds a new element to the end of the array. - * If the array capacity is not enough for the new element, the array will be resized automatically. - * @param array pointer to an `lv_array_t` variable - * @param element pointer to the element to add - * @return LV_RESULT_OK: success, otherwise: error - */ -lv_result_t lv_array_push_back(lv_array_t * array, const void * element); - -/** - * Assigns one content to the array, replacing its current content. - * @param array pointer to an `lv_array_t` variable - * @param index the index of the element to replace - * @param value pointer to the elements to add - * @return true: success; false: error - */ -lv_result_t lv_array_assign(lv_array_t * array, uint32_t index, const void * value); - -/** - * Returns a pointer to the element at position n in the array. - * @param array pointer to an `lv_array_t` variable - * @param index the index of the element to return - * @return a pointer to the requested element, NULL if `index` is out of range - */ -void * lv_array_at(const lv_array_t * array, uint32_t index); - -/** - * Returns a pointer to the first element in the array. - * @param array pointer to an `lv_array_t` variable - * @return a pointer to the first element in the array - */ -void * lv_array_front(const lv_array_t * array); - -/** - * Returns a pointer to the last element in the array. - * @param array pointer to an `lv_array_t` variable - */ -void * lv_array_back(const lv_array_t * array); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_assert.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_assert.h deleted file mode 100644 index c9dc849..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_assert.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @file lv_assert.h - * - */ - -#ifndef LV_ASSERT_H -#define LV_ASSERT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "lv_log.h" -#include "../stdlib/lv_mem.h" -#include LV_ASSERT_HANDLER_INCLUDE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#define LV_ASSERT(expr) \ - do { \ - if(!(expr)) { \ - LV_LOG_ERROR("Asserted at expression: %s", #expr); \ - LV_ASSERT_HANDLER \ - } \ - } while(0) - -#define LV_ASSERT_MSG(expr, msg) \ - do { \ - if(!(expr)) { \ - LV_LOG_ERROR("Asserted at expression: %s (%s)", #expr, msg); \ - LV_ASSERT_HANDLER \ - } \ - } while(0) - -#define LV_ASSERT_FORMAT_MSG(expr, format, ...) \ - do { \ - if(!(expr)) { \ - LV_LOG_ERROR("Asserted at expression: %s " format , #expr, __VA_ARGS__); \ - LV_ASSERT_HANDLER \ - } \ - } while(0) - -/*----------------- - * ASSERTS - *-----------------*/ - -#if LV_USE_ASSERT_NULL -# define LV_ASSERT_NULL(p) LV_ASSERT_MSG(p != NULL, "NULL pointer"); -#else -# define LV_ASSERT_NULL(p) -#endif - -#if LV_USE_ASSERT_MALLOC -# define LV_ASSERT_MALLOC(p) LV_ASSERT_MSG(p != NULL, "Out of memory"); -#else -# define LV_ASSERT_MALLOC(p) -#endif - -#if LV_USE_ASSERT_MEM_INTEGRITY -# define LV_ASSERT_MEM_INTEGRITY() LV_ASSERT_MSG(lv_mem_test() == LV_RESULT_OK, "Memory integrity error"); -#else -# define LV_ASSERT_MEM_INTEGRITY() -#endif - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_ASSERT_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_async.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_async.c deleted file mode 100644 index e1657ae..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_async.c +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @file lv_async.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_async.h" -#include "lv_timer_private.h" -#include "../stdlib/lv_mem.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct lv_async_info_t { - lv_async_cb_t cb; - void * user_data; -} lv_async_info_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void lv_async_timer_cb(lv_timer_t * timer); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_result_t lv_async_call(lv_async_cb_t async_xcb, void * user_data) -{ - /*Allocate an info structure*/ - lv_async_info_t * info = lv_malloc(sizeof(lv_async_info_t)); - - if(info == NULL) - return LV_RESULT_INVALID; - - /*Create a new timer*/ - lv_timer_t * timer = lv_timer_create(lv_async_timer_cb, 0, info); - - if(timer == NULL) { - lv_free(info); - return LV_RESULT_INVALID; - } - - info->cb = async_xcb; - info->user_data = user_data; - - lv_timer_set_repeat_count(timer, 1); - return LV_RESULT_OK; -} - -lv_result_t lv_async_call_cancel(lv_async_cb_t async_xcb, void * user_data) -{ - lv_timer_t * timer = lv_timer_get_next(NULL); - lv_result_t res = LV_RESULT_INVALID; - - while(timer != NULL) { - /*Find the next timer node*/ - lv_timer_t * timer_next = lv_timer_get_next(timer); - - /*Find async timer callback*/ - if(timer->timer_cb == lv_async_timer_cb) { - lv_async_info_t * info = (lv_async_info_t *)timer->user_data; - - /*Match user function callback and user data*/ - if(info->cb == async_xcb && info->user_data == user_data) { - lv_timer_delete(timer); - lv_free(info); - res = LV_RESULT_OK; - } - } - - timer = timer_next; - } - - return res; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_async_timer_cb(lv_timer_t * timer) -{ - /*Save the info because an lv_async_call_cancel might delete it in the callback*/ - lv_async_info_t * info = (lv_async_info_t *)timer->user_data; - lv_async_info_t info_save = *info; - lv_timer_delete(timer); - lv_free(info); - - info_save.cb(info_save.user_data); -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_async.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_async.h deleted file mode 100644 index 362a0ff..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_async.h +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @file lv_async.h - * - */ - -#ifndef LV_ASYNC_H -#define LV_ASYNC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Type for async callback. - */ -typedef void (*lv_async_cb_t)(void *); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Call an asynchronous function the next time lv_timer_handler() is run. This function is likely to return - * **before** the call actually happens! - * @param async_xcb a callback which is the task itself. - * (the 'x' in the argument name indicates that it's not a fully generic function because it not follows - * the `func_name(object, callback, ...)` convention) - * @param user_data custom parameter - */ -lv_result_t lv_async_call(lv_async_cb_t async_xcb, void * user_data); - -/** - * Cancel an asynchronous function call - * @param async_xcb a callback which is the task itself. - * @param user_data custom parameter - */ -lv_result_t lv_async_call_cancel(lv_async_cb_t async_xcb, void * user_data); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_ASYNC_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_bidi.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_bidi.c deleted file mode 100644 index 44f014e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_bidi.c +++ /dev/null @@ -1,663 +0,0 @@ -/** - * @file lv_bidi.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_bidi_private.h" -#include "lv_text_private.h" -#include "lv_types.h" -#include "../stdlib/lv_mem.h" -#include "../stdlib/lv_string.h" - -#if LV_USE_BIDI - -/********************* - * DEFINES - *********************/ -#define LV_BIDI_BRACKET_DEPTH 4 - -// Highest bit of the 16-bit pos_conv value specifies whether this pos is RTL or not -#define GET_POS(x) ((x) & 0x7FFF) -#define IS_RTL_POS(x) (((x) & 0x8000) != 0) -#define SET_RTL_POS(x, is_rtl) (GET_POS(x) | ((is_rtl)? 0x8000: 0)) - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - uint32_t bracket_pos; - lv_base_dir_t dir; -} bracket_stack_t; - -typedef struct { - bracket_stack_t br_stack[LV_BIDI_BRACKET_DEPTH]; - uint8_t br_stack_p; -} lv_bidi_ctx_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static uint32_t lv_bidi_get_next_paragraph(const char * txt); -static lv_base_dir_t lv_bidi_get_letter_dir(uint32_t letter); -static bool lv_bidi_letter_is_weak(uint32_t letter); -static bool lv_bidi_letter_is_rtl(uint32_t letter); -static bool lv_bidi_letter_is_neutral(uint32_t letter); - -static lv_base_dir_t get_next_run(lv_bidi_ctx_t * ctx, const char * txt, lv_base_dir_t base_dir, uint32_t max_len, - uint32_t * len, - uint16_t * pos_conv_len); -static void rtl_reverse(char * dest, const char * src, uint32_t len, uint16_t * pos_conv_out, uint16_t pos_conv_rd_base, - uint16_t pos_conv_len); -static uint32_t char_change_to_pair(uint32_t letter); -static lv_base_dir_t bracket_process(lv_bidi_ctx_t * ctx, const char * txt, uint32_t next_pos, uint32_t len, - uint32_t letter, - lv_base_dir_t base_dir); -static void fill_pos_conv(uint16_t * out, uint16_t len, uint16_t index); -static uint32_t get_txt_len(const char * txt, uint32_t max_len); - -/********************** - * STATIC VARIABLES - **********************/ -static const uint8_t bracket_left[] = {"<({["}; -static const uint8_t bracket_right[] = {">)}]"}; -static const char * custom_neutrals = NULL; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_dir) -{ - if(base_dir == LV_BASE_DIR_AUTO) base_dir = lv_bidi_detect_base_dir(str_in); - - uint32_t par_start = 0; - uint32_t par_len; - - while(str_in[par_start] == '\n' || str_in[par_start] == '\r') { - str_out[par_start] = str_in[par_start]; - par_start ++; - } - - while(str_in[par_start] != '\0') { - par_len = lv_bidi_get_next_paragraph(&str_in[par_start]); - lv_bidi_process_paragraph(&str_in[par_start], &str_out[par_start], par_len, base_dir, NULL, 0); - par_start += par_len; - - while(str_in[par_start] == '\n' || str_in[par_start] == '\r') { - str_out[par_start] = str_in[par_start]; - par_start ++; - } - } - - str_out[par_start] = '\0'; -} - -/** - * Auto-detect the direction of a text based on the first strong character - * @param txt the text to process - * @return `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` - */ -lv_base_dir_t lv_bidi_detect_base_dir(const char * txt) -{ - uint32_t i = 0; - uint32_t letter; - while(txt[i] != '\0') { - letter = lv_text_encoded_next(txt, &i); - - lv_base_dir_t dir; - dir = lv_bidi_get_letter_dir(letter); - if(dir == LV_BASE_DIR_RTL || dir == LV_BASE_DIR_LTR) return dir; - } - - /*If there were no strong char earlier return with the default base dir*/ - if(LV_BIDI_BASE_DIR_DEF == LV_BASE_DIR_AUTO) return LV_BASE_DIR_LTR; - else return LV_BIDI_BASE_DIR_DEF; -} - -uint16_t lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_base_dir_t base_dir, - uint32_t visual_pos, bool * is_rtl) -{ - uint32_t pos_conv_len = get_txt_len(str_in, len); - char * buf = lv_malloc(len + 1); - if(buf == NULL) return (uint16_t) -1; - - uint16_t * pos_conv_buf = lv_malloc(pos_conv_len * sizeof(uint16_t)); - if(pos_conv_buf == NULL) { - lv_free(buf); - return (uint16_t) -1; - } - - if(bidi_txt) *bidi_txt = buf; - - lv_bidi_process_paragraph(str_in, bidi_txt ? *bidi_txt : NULL, len, base_dir, pos_conv_buf, pos_conv_len); - - if(is_rtl) *is_rtl = IS_RTL_POS(pos_conv_buf[visual_pos]); - - if(bidi_txt == NULL) lv_free(buf); - uint16_t res = GET_POS(pos_conv_buf[visual_pos]); - lv_free(pos_conv_buf); - return res; -} - -uint16_t lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t len, lv_base_dir_t base_dir, - uint32_t logical_pos, bool * is_rtl) -{ - uint32_t pos_conv_len = get_txt_len(str_in, len); - char * buf = lv_malloc(len + 1); - if(buf == NULL) return (uint16_t) -1; - - uint16_t * pos_conv_buf = lv_malloc(pos_conv_len * sizeof(uint16_t)); - if(pos_conv_buf == NULL) { - lv_free(buf); - return (uint16_t) -1; - } - - if(bidi_txt) *bidi_txt = buf; - - lv_bidi_process_paragraph(str_in, bidi_txt ? *bidi_txt : NULL, len, base_dir, pos_conv_buf, pos_conv_len); - - for(uint16_t i = 0; i < pos_conv_len; i++) { - if(GET_POS(pos_conv_buf[i]) == logical_pos) { - - if(is_rtl) *is_rtl = IS_RTL_POS(pos_conv_buf[i]); - lv_free(pos_conv_buf); - - if(bidi_txt == NULL) lv_free(buf); - return i; - } - } - lv_free(pos_conv_buf); - if(bidi_txt == NULL) lv_free(buf); - return (uint16_t) -1; -} - -void lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_base_dir_t base_dir, - uint16_t * pos_conv_out, uint16_t pos_conv_len) -{ - uint32_t run_len = 0; - lv_base_dir_t run_dir; - uint32_t rd = 0; - uint32_t wr; - uint16_t pos_conv_run_len = 0; - uint16_t pos_conv_rd = 0; - uint16_t pos_conv_wr; - - if(base_dir == LV_BASE_DIR_AUTO) base_dir = lv_bidi_detect_base_dir(str_in); - if(base_dir == LV_BASE_DIR_RTL) { - wr = len; - pos_conv_wr = pos_conv_len; - } - else { - wr = 0; - pos_conv_wr = 0; - } - - if(str_out) str_out[len] = '\0'; - - lv_base_dir_t dir = base_dir; - - /*Empty the bracket stack*/ - lv_bidi_ctx_t ctx; - lv_memzero(&ctx, sizeof(ctx)); - - /*Process neutral chars in the beginning*/ - while(rd < len) { - uint32_t letter = lv_text_encoded_next(str_in, &rd); - pos_conv_rd++; - dir = lv_bidi_get_letter_dir(letter); - if(dir == LV_BASE_DIR_NEUTRAL) dir = bracket_process(&ctx, str_in, rd, len, letter, base_dir); - else if(dir != LV_BASE_DIR_WEAK) break; - } - - if(rd && str_in[rd] != '\0' && rd < len) { - lv_text_encoded_prev(str_in, &rd); - pos_conv_rd--; - } - - if(rd) { - if(base_dir == LV_BASE_DIR_LTR) { - if(str_out) { - lv_memcpy(&str_out[wr], str_in, rd); - wr += rd; - } - if(pos_conv_out) { - fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_rd, 0); - pos_conv_wr += pos_conv_rd; - } - } - else { - wr -= rd; - pos_conv_wr -= pos_conv_rd; - rtl_reverse(str_out ? &str_out[wr] : NULL, str_in, rd, pos_conv_out ? &pos_conv_out[pos_conv_wr] : NULL, 0, - pos_conv_rd); - } - } - - /*Get and process the runs*/ - - while(rd < len && str_in[rd]) { - run_dir = get_next_run(&ctx, &str_in[rd], base_dir, len - rd, &run_len, &pos_conv_run_len); - - if(base_dir == LV_BASE_DIR_LTR) { - if(run_dir == LV_BASE_DIR_LTR) { - if(str_out) lv_memcpy(&str_out[wr], &str_in[rd], run_len); - if(pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_run_len, pos_conv_rd); - } - else rtl_reverse(str_out ? &str_out[wr] : NULL, &str_in[rd], run_len, pos_conv_out ? &pos_conv_out[pos_conv_wr] : NULL, - pos_conv_rd, pos_conv_run_len); - wr += run_len; - pos_conv_wr += pos_conv_run_len; - } - else { - wr -= run_len; - pos_conv_wr -= pos_conv_run_len; - if(run_dir == LV_BASE_DIR_LTR) { - if(str_out) lv_memcpy(&str_out[wr], &str_in[rd], run_len); - if(pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_run_len, pos_conv_rd); - } - else rtl_reverse(str_out ? &str_out[wr] : NULL, &str_in[rd], run_len, pos_conv_out ? &pos_conv_out[pos_conv_wr] : NULL, - pos_conv_rd, pos_conv_run_len); - } - - rd += run_len; - pos_conv_rd += pos_conv_run_len; - } -} - -void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt) -{ - if(*base_dir == LV_BASE_DIR_AUTO) *base_dir = lv_bidi_detect_base_dir(txt); - - if(*align == LV_TEXT_ALIGN_AUTO) { - if(*base_dir == LV_BASE_DIR_RTL) *align = LV_TEXT_ALIGN_RIGHT; - else *align = LV_TEXT_ALIGN_LEFT; - } -} - -void lv_bidi_set_custom_neutrals_static(const char * neutrals) -{ - custom_neutrals = neutrals; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Get the next paragraph from a text - * @param txt the text to process - * @return the length of the current paragraph in byte count - */ -static uint32_t lv_bidi_get_next_paragraph(const char * txt) -{ - uint32_t i = 0; - - lv_text_encoded_next(txt, &i); - - while(txt[i] != '\0' && txt[i] != '\n' && txt[i] != '\r') { - lv_text_encoded_next(txt, &i); - } - - return i; -} - -/** - * Get the direction of a character - * @param letter a Unicode character - * @return `LV_BASE_DIR_RTL/LTR/WEAK/NEUTRAL` - */ -static lv_base_dir_t lv_bidi_get_letter_dir(uint32_t letter) -{ - if(lv_bidi_letter_is_rtl(letter)) return LV_BASE_DIR_RTL; - if(lv_bidi_letter_is_neutral(letter)) return LV_BASE_DIR_NEUTRAL; - if(lv_bidi_letter_is_weak(letter)) return LV_BASE_DIR_WEAK; - - return LV_BASE_DIR_LTR; -} -/** - * Tell whether a character is weak or not - * @param letter a Unicode character - * @return true/false - */ -static bool lv_bidi_letter_is_weak(uint32_t letter) -{ - uint32_t i = 0; - static const char weaks[] = "0123456789"; - - do { - uint32_t x = lv_text_encoded_next(weaks, &i); - if(letter == x) { - return true; - } - } while(weaks[i] != '\0'); - - return false; -} -/** - * Tell whether a character is RTL or not - * @param letter a Unicode character - * @return true/false - */ -static bool lv_bidi_letter_is_rtl(uint32_t letter) -{ - if(letter == 0x202E) return true; /*Unicode of LV_BIDI_RLO*/ - - /*Check for Persian and Arabic characters [https://en.wikipedia.org/wiki/Arabic_script_in_Unicode]*/ - if(letter >= 0x600 && letter <= 0x6FF) return true; - if(letter >= 0xFB50 && letter <= 0xFDFF) return true; - if(letter >= 0xFE70 && letter <= 0xFEFF) return true; - - /*Check for Hebrew characters [https://en.wikipedia.org/wiki/Unicode_and_HTML_for_the_Hebrew_alphabet]*/ - if(letter >= 0x590 && letter <= 0x5FF) return true; - if(letter >= 0xFB1D && letter <= 0xFB4F) return true; - - return false; -} - -/** - * Tell whether a character is neutral or not - * @param letter a Unicode character - * @return true/false - */ -static bool lv_bidi_letter_is_neutral(uint32_t letter) -{ - uint16_t i; - const char * neutrals = " \t\n\r.,:;'\"`!?%/\\-=()[]{}<>@#&$|"; - if(custom_neutrals) { - neutrals = custom_neutrals; - } - - for(i = 0; neutrals[i] != '\0'; i++) { - if(letter == (uint32_t)neutrals[i]) return true; - } - - return false; -} - -static uint32_t get_txt_len(const char * txt, uint32_t max_len) -{ - uint32_t len = 0; - uint32_t i = 0; - - while(i < max_len && txt[i] != '\0') { - lv_text_encoded_next(txt, &i); - len++; - } - - return len; -} - -static void fill_pos_conv(uint16_t * out, uint16_t len, uint16_t index) -{ - uint16_t i; - for(i = 0; i < len; i++) { - out[i] = SET_RTL_POS(index, false); - index++; - } -} - -static lv_base_dir_t get_next_run(lv_bidi_ctx_t * ctx, const char * txt, lv_base_dir_t base_dir, uint32_t max_len, - uint32_t * len, - uint16_t * pos_conv_len) -{ - uint32_t i = 0; - uint32_t letter; - - uint16_t pos_conv_i = 0; - - letter = lv_text_encoded_next(txt, NULL); - lv_base_dir_t dir = lv_bidi_get_letter_dir(letter); - if(dir == LV_BASE_DIR_NEUTRAL) dir = bracket_process(ctx, txt, 0, max_len, letter, base_dir); - - /*Find the first strong char. Skip the neutrals*/ - while(dir == LV_BASE_DIR_NEUTRAL || dir == LV_BASE_DIR_WEAK) { - letter = lv_text_encoded_next(txt, &i); - - pos_conv_i++; - dir = lv_bidi_get_letter_dir(letter); - if(dir == LV_BASE_DIR_NEUTRAL) dir = bracket_process(ctx, txt, i, max_len, letter, base_dir); - - if(dir == LV_BASE_DIR_LTR || dir == LV_BASE_DIR_RTL) break; - - if(i >= max_len || txt[i] == '\0' || txt[i] == '\n' || txt[i] == '\r') { - *len = i; - *pos_conv_len = pos_conv_i; - return base_dir; - } - } - - lv_base_dir_t run_dir = dir; - - uint32_t i_prev = i; - uint32_t i_last_strong = i; - uint16_t pos_conv_i_prev = pos_conv_i; - uint16_t pos_conv_i_last_strong = pos_conv_i; - - /*Find the next char which has different direction*/ - lv_base_dir_t next_dir = base_dir; - while(i_prev < max_len && txt[i] != '\0' && txt[i] != '\n' && txt[i] != '\r') { - letter = lv_text_encoded_next(txt, &i); - pos_conv_i++; - next_dir = lv_bidi_get_letter_dir(letter); - if(next_dir == LV_BASE_DIR_NEUTRAL) next_dir = bracket_process(ctx, txt, i, max_len, letter, base_dir); - - if(next_dir == LV_BASE_DIR_WEAK) { - if(run_dir == LV_BASE_DIR_RTL) { - if(base_dir == LV_BASE_DIR_RTL) { - next_dir = LV_BASE_DIR_LTR; - } - } - } - - /*New dir found?*/ - if((next_dir == LV_BASE_DIR_RTL || next_dir == LV_BASE_DIR_LTR) && next_dir != run_dir) { - /*Include neutrals if `run_dir == base_dir`*/ - if(run_dir == base_dir) { - *len = i_prev; - *pos_conv_len = pos_conv_i_prev; - } - /*Exclude neutrals if `run_dir != base_dir`*/ - else { - *len = i_last_strong; - *pos_conv_len = pos_conv_i_last_strong; - } - - return run_dir; - } - - if(next_dir != LV_BASE_DIR_NEUTRAL) { - i_last_strong = i; - pos_conv_i_last_strong = pos_conv_i; - } - - i_prev = i; - pos_conv_i_prev = pos_conv_i; - } - - /*Handle end of of string. Apply `base_dir` on trailing neutrals*/ - - /*Include neutrals if `run_dir == base_dir`*/ - if(run_dir == base_dir) { - *len = i_prev; - *pos_conv_len = pos_conv_i_prev; - } - /*Exclude neutrals if `run_dir != base_dir`*/ - else { - *len = i_last_strong; - *pos_conv_len = pos_conv_i_last_strong; - } - - return run_dir; -} - -static void rtl_reverse(char * dest, const char * src, uint32_t len, uint16_t * pos_conv_out, uint16_t pos_conv_rd_base, - uint16_t pos_conv_len) -{ - uint32_t i = len; - uint32_t wr = 0; - uint16_t pos_conv_i = pos_conv_len; - uint16_t pos_conv_wr = 0; - - while(i) { - uint32_t letter = lv_text_encoded_prev(src, &i); - uint16_t pos_conv_letter = --pos_conv_i; - - /*Keep weak letters (numbers) as LTR*/ - if(lv_bidi_letter_is_weak(letter)) { - uint32_t last_weak = i; - uint32_t first_weak = i; - uint16_t pos_conv_last_weak = pos_conv_i; - uint16_t pos_conv_first_weak = pos_conv_i; - while(i) { - letter = lv_text_encoded_prev(src, &i); - pos_conv_letter = --pos_conv_i; - - /*No need to call `char_change_to_pair` because there not such chars here*/ - - /*Finish on non-weak char*/ - /*but treat number and currency related chars as weak*/ - if(lv_bidi_letter_is_weak(letter) == false && letter != '.' && letter != ',' && letter != '$' && letter != '%') { - lv_text_encoded_next(src, &i); /*Rewind one letter*/ - pos_conv_i++; - first_weak = i; - pos_conv_first_weak = pos_conv_i; - break; - } - } - if(i == 0) { - first_weak = 0; - pos_conv_first_weak = 0; - } - - if(dest) lv_memcpy(&dest[wr], &src[first_weak], last_weak - first_weak + 1); - if(pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_last_weak - pos_conv_first_weak + 1, - pos_conv_rd_base + pos_conv_first_weak); - wr += last_weak - first_weak + 1; - pos_conv_wr += pos_conv_last_weak - pos_conv_first_weak + 1; - } - - /*Simply store in reversed order*/ - else { - uint32_t letter_size = lv_text_encoded_size((const char *)&src[i]); - /*Swap arithmetical symbols*/ - if(letter_size == 1) { - uint32_t new_letter = letter = char_change_to_pair(letter); - if(dest) dest[wr] = (uint8_t)new_letter; - if(pos_conv_out) pos_conv_out[pos_conv_wr] = SET_RTL_POS(pos_conv_rd_base + pos_conv_letter, true); - wr++; - pos_conv_wr++; - } - /*Just store the letter*/ - else { - if(dest) lv_memcpy(&dest[wr], &src[i], letter_size); - if(pos_conv_out) pos_conv_out[pos_conv_wr] = SET_RTL_POS(pos_conv_rd_base + pos_conv_i, true); - wr += letter_size; - pos_conv_wr++; - } - } - } -} - -static uint32_t char_change_to_pair(uint32_t letter) -{ - - uint8_t i; - for(i = 0; bracket_left[i] != '\0'; i++) { - if(letter == bracket_left[i]) return bracket_right[i]; - } - - for(i = 0; bracket_right[i] != '\0'; i++) { - if(letter == bracket_right[i]) return bracket_left[i]; - } - - return letter; -} - -static lv_base_dir_t bracket_process(lv_bidi_ctx_t * ctx, const char * txt, uint32_t next_pos, uint32_t len, - uint32_t letter, - lv_base_dir_t base_dir) -{ - lv_base_dir_t bracket_dir = LV_BASE_DIR_NEUTRAL; - - uint8_t i; - /*Is the letter an opening bracket?*/ - for(i = 0; bracket_left[i] != '\0'; i++) { - if(bracket_left[i] == letter) { - /*If so find its matching closing bracket. - *If a char with base dir. direction is found then the brackets will have `base_dir` direction*/ - uint32_t txt_i = next_pos; - while(txt_i < len) { - uint32_t letter_next = lv_text_encoded_next(txt, &txt_i); - if(letter_next == bracket_right[i]) { - /*Closing bracket found*/ - break; - } - else { - /*Save the dir*/ - lv_base_dir_t letter_dir = lv_bidi_get_letter_dir(letter_next); - if(letter_dir == base_dir) { - bracket_dir = base_dir; - } - } - } - - /*There were no matching closing bracket*/ - if(txt_i > len) return LV_BASE_DIR_NEUTRAL; - - /*There where a strong char with base dir in the bracket so the dir is found.*/ - if(bracket_dir != LV_BASE_DIR_NEUTRAL && bracket_dir != LV_BASE_DIR_WEAK) break; - - /*If there were no matching strong chars in the brackets then check the previous chars*/ - txt_i = next_pos; - if(txt_i) lv_text_encoded_prev(txt, &txt_i); - while(txt_i > 0) { - uint32_t letter_next = lv_text_encoded_prev(txt, &txt_i); - lv_base_dir_t letter_dir = lv_bidi_get_letter_dir(letter_next); - if(letter_dir == LV_BASE_DIR_LTR || letter_dir == LV_BASE_DIR_RTL) { - bracket_dir = letter_dir; - break; - } - } - - /*There where a previous strong char which can be used*/ - if(bracket_dir != LV_BASE_DIR_NEUTRAL) break; - - /*There were no strong chars before the bracket, so use the base dir.*/ - if(txt_i == 0) bracket_dir = base_dir; - - break; - } - } - - /*The letter was an opening bracket*/ - if(bracket_left[i] != '\0') { - - if(bracket_dir == LV_BASE_DIR_NEUTRAL || ctx->br_stack_p == LV_BIDI_BRACKET_DEPTH) return LV_BASE_DIR_NEUTRAL; - - ctx->br_stack[ctx->br_stack_p].bracket_pos = i; - ctx->br_stack[ctx->br_stack_p].dir = bracket_dir; - - ctx->br_stack_p++; - return bracket_dir; - } - else if(ctx->br_stack_p > 0) { - /*Is the letter a closing bracket of the last opening?*/ - if(letter == bracket_right[ctx->br_stack[ctx->br_stack_p - 1].bracket_pos]) { - bracket_dir = ctx->br_stack[ctx->br_stack_p - 1].dir; - ctx->br_stack_p--; - return bracket_dir; - } - } - - return LV_BASE_DIR_NEUTRAL; -} - -#endif /*LV_USE_BIDI*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_bidi.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_bidi.h deleted file mode 100644 index 77575ef..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_bidi.h +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @file lv_bidi.h - * - */ - -#ifndef LV_BIDI_H -#define LV_BIDI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "lv_types.h" -#include "lv_text.h" - -/********************* - * DEFINES - *********************/ -/** Special non printable strong characters. - * They can be inserted to texts to affect the run's direction */ -#define LV_BIDI_LRO "\xE2\x80\xAD" /*U+202D*/ -#define LV_BIDI_RLO "\xE2\x80\xAE" /*U+202E*/ - -/********************** - * TYPEDEFS - **********************/ -typedef enum { - LV_BASE_DIR_LTR = 0x00, - LV_BASE_DIR_RTL = 0x01, - LV_BASE_DIR_AUTO = 0x02, - - LV_BASE_DIR_NEUTRAL = 0x20, - LV_BASE_DIR_WEAK = 0x21, -} lv_base_dir_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ -#if LV_USE_BIDI - -/** - * Get the real text alignment from the a text alignment, base direction and a text. - * @param align LV_TEXT_ALIGN_..., write back the calculated align here (LV_TEXT_ALIGN_LEFT/RIGHT/CENTER) - * @param base_dir LV_BASE_DIR_..., write the calculated base dir here (LV_BASE_DIR_LTR/RTL) - * @param txt a text, used with LV_BASE_DIR_AUTO to determine the base direction - */ -void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt); - -/** - * Set custom neutrals string - * @param neutrals default " \t\n\r.,:;'\"`!?%/\\-=()[]{}<>@#&$|" - */ -void lv_bidi_set_custom_neutrals_static(const char * neutrals); - -/********************** - * MACROS - **********************/ - -#else /*LV_USE_BIDI*/ -/** - * For compatibility if LV_USE_BIDI = 0 - * Get the real text alignment from the a text alignment, base direction and a text. - * @param align For LV_TEXT_ALIGN_AUTO give LV_TEXT_ALIGN_LEFT else leave unchanged, write back the calculated align here - * @param base_dir Unused - * @param txt Unused - */ -static inline void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt) -{ - LV_UNUSED(txt); - LV_UNUSED(base_dir); - if(*align == LV_TEXT_ALIGN_AUTO) * align = LV_TEXT_ALIGN_LEFT; -} -#endif /*LV_USE_BIDI*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_BIDI_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_bidi_private.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_bidi_private.h deleted file mode 100644 index 0b684da..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_bidi_private.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * @file lv_bidi_private.h - * - */ - -#ifndef LV_BIDI_PRIVATE_H -#define LV_BIDI_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_bidi.h" -#if LV_USE_BIDI - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Convert a text to get the characters in the correct visual order according to - * Unicode Bidirectional Algorithm - * @param str_in the text to process - * @param str_out store the result here. Has the be `strlen(str_in)` length - * @param base_dir `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` - */ -void lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_dir); - -/** - * Auto-detect the direction of a text based on the first strong character - * @param txt the text to process - * @return `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` - */ -lv_base_dir_t lv_bidi_detect_base_dir(const char * txt); - -/** - * Get the logical position of a character in a line - * @param str_in the input string. Can be only one line. - * @param bidi_txt internally the text is bidi processed which buffer can be get here. - * If not required anymore has to freed with `lv_free()` - * Can be `NULL` is unused - * @param len length of the line in character count - * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` - * @param visual_pos the visual character position which logical position should be get - * @param is_rtl tell the char at `visual_pos` is RTL or LTR context - * @return the logical character position - */ -uint16_t lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_base_dir_t base_dir, - uint32_t visual_pos, bool * is_rtl); - -/** - * Get the visual position of a character in a line - * @param str_in the input string. Can be only one line. - * @param bidi_txt internally the text is bidi processed which buffer can be get here. - * If not required anymore has to freed with `lv_free()` - * Can be `NULL` is unused - * @param len length of the line in character count - * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` - * @param logical_pos the logical character position which visual position should be get - * @param is_rtl tell the char at `logical_pos` is RTL or LTR context - * @return the visual character position - */ -uint16_t lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t len, lv_base_dir_t base_dir, - uint32_t logical_pos, bool * is_rtl); - -/** - * Bidi process a paragraph of text - * @param str_in the string to process - * @param str_out store the result here - * @param len length of the text - * @param base_dir base dir of the text - * @param pos_conv_out an `uint16_t` array to store the related logical position of the character. - * Can be `NULL` is unused - * @param pos_conv_len length of `pos_conv_out` in element count - */ -void lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_base_dir_t base_dir, - uint16_t * pos_conv_out, uint16_t pos_conv_len); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_BIDI*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_BIDI_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color.c deleted file mode 100644 index d62f280..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color.c +++ /dev/null @@ -1,403 +0,0 @@ -/** - * @file lv_color.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_color.h" -#include "lv_log.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_color_t lv_color_filter_shade_cb(const lv_color_filter_dsc_t * dsc, lv_color_t c, lv_opa_t opa); - -/********************** - * GLOBAL VARIABLES - **********************/ - -const lv_color_filter_dsc_t lv_color_filter_shade = {.filter_cb = lv_color_filter_shade_cb}; - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -uint8_t lv_color_format_get_bpp(lv_color_format_t cf) -{ - switch(cf) { - case LV_COLOR_FORMAT_I1: - case LV_COLOR_FORMAT_A1: - return 1; - case LV_COLOR_FORMAT_I2: - case LV_COLOR_FORMAT_A2: - return 2; - case LV_COLOR_FORMAT_I4: - case LV_COLOR_FORMAT_A4: - return 4; - case LV_COLOR_FORMAT_L8: - case LV_COLOR_FORMAT_A8: - case LV_COLOR_FORMAT_I8: - return 8; - - case LV_COLOR_FORMAT_RGB565A8: - case LV_COLOR_FORMAT_RGB565: - case LV_COLOR_FORMAT_AL88: - return 16; - - case LV_COLOR_FORMAT_ARGB8565: - case LV_COLOR_FORMAT_RGB888: - return 24; - case LV_COLOR_FORMAT_ARGB8888: - case LV_COLOR_FORMAT_XRGB8888: - return 32; - - case LV_COLOR_FORMAT_UNKNOWN: - default: - return 0; - } -} - -bool lv_color_format_has_alpha(lv_color_format_t cf) -{ - switch(cf) { - case LV_COLOR_FORMAT_A1: - case LV_COLOR_FORMAT_A2: - case LV_COLOR_FORMAT_A4: - case LV_COLOR_FORMAT_A8: - case LV_COLOR_FORMAT_I1: - case LV_COLOR_FORMAT_I2: - case LV_COLOR_FORMAT_I4: - case LV_COLOR_FORMAT_I8: - case LV_COLOR_FORMAT_RGB565A8: - case LV_COLOR_FORMAT_ARGB8565: - case LV_COLOR_FORMAT_ARGB8888: - case LV_COLOR_FORMAT_AL88: - return true; - default: - return false; - } -} - -lv_color32_t lv_color_to_32(lv_color_t color, lv_opa_t opa) -{ - lv_color32_t c32; - c32.red = color.red; - c32.green = color.green; - c32.blue = color.blue; - c32.alpha = opa; - return c32; -} - -uint16_t lv_color_to_u16(lv_color_t color) -{ - return ((color.red & 0xF8) << 8) + ((color.green & 0xFC) << 3) + ((color.blue & 0xF8) >> 3); -} - -uint32_t lv_color_to_u32(lv_color_t color) -{ - return (uint32_t)((uint32_t)0xff << 24) + (color.red << 16) + (color.green << 8) + (color.blue); -} - -lv_color_t lv_color_lighten(lv_color_t c, lv_opa_t lvl) -{ - - return lv_color_mix(lv_color_white(), c, lvl); -} - -lv_color_t lv_color_darken(lv_color_t c, lv_opa_t lvl) -{ - return lv_color_mix(lv_color_black(), c, lvl); -} - -lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v) -{ - h = (uint32_t)((uint32_t)h * 255) / 360; - s = (uint16_t)((uint16_t)s * 255) / 100; - v = (uint16_t)((uint16_t)v * 255) / 100; - - uint8_t r, g, b; - - uint8_t region, remainder, p, q, t; - - if(s == 0) { - return lv_color_make(v, v, v); - } - - region = h / 43; - remainder = (h - (region * 43)) * 6; - - p = (v * (255 - s)) >> 8; - q = (v * (255 - ((s * remainder) >> 8))) >> 8; - t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8; - - switch(region) { - case 0: - r = v; - g = t; - b = p; - break; - case 1: - r = q; - g = v; - b = p; - break; - case 2: - r = p; - g = v; - b = t; - break; - case 3: - r = p; - g = q; - b = v; - break; - case 4: - r = t; - g = p; - b = v; - break; - default: - r = v; - g = p; - b = q; - break; - } - - lv_color_t result = lv_color_make(r, g, b); - return result; -} - -lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r8, uint8_t g8, uint8_t b8) -{ - uint16_t r = ((uint32_t)r8 << 10) / 255; - uint16_t g = ((uint32_t)g8 << 10) / 255; - uint16_t b = ((uint32_t)b8 << 10) / 255; - - uint16_t rgbMin = r < g ? (r < b ? r : b) : (g < b ? g : b); - uint16_t rgbMax = r > g ? (r > b ? r : b) : (g > b ? g : b); - - lv_color_hsv_t hsv; - - // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness - hsv.v = (100 * rgbMax) >> 10; - - int32_t delta = rgbMax - rgbMin; - if(delta < 3) { - hsv.h = 0; - hsv.s = 0; - return hsv; - } - - // https://en.wikipedia.org/wiki/HSL_and_HSV#Saturation - hsv.s = 100 * delta / rgbMax; - if(hsv.s < 3) { - hsv.h = 0; - return hsv; - } - - // https://en.wikipedia.org/wiki/HSL_and_HSV#Hue_and_chroma - int32_t h; - if(rgbMax == r) - h = (((g - b) << 10) / delta) + (g < b ? (6 << 10) : 0); // between yellow & magenta - else if(rgbMax == g) - h = (((b - r) << 10) / delta) + (2 << 10); // between cyan & yellow - else if(rgbMax == b) - h = (((r - g) << 10) / delta) + (4 << 10); // between magenta & cyan - else - h = 0; - h *= 60; - h >>= 10; - if(h < 0) h += 360; - - hsv.h = h; - return hsv; -} - -/** - * Convert a color to HSV - * @param color color - * @return the given color in HSV - */ -lv_color_hsv_t lv_color_to_hsv(lv_color_t c) -{ - return lv_color_rgb_to_hsv(c.red, c.green, c.blue); -} - -uint8_t lv_color_format_get_size(lv_color_format_t cf) -{ - return (lv_color_format_get_bpp(cf) + 7) >> 3; -} - -uint32_t lv_color_to_int(lv_color_t c) -{ - uint8_t * tmp = (uint8_t *) &c; - return tmp[0] + (tmp[1] << 8) + (tmp[2] << 16); -} - -bool lv_color_eq(lv_color_t c1, lv_color_t c2) -{ - return lv_color_to_int(c1) == lv_color_to_int(c2); -} - -bool lv_color32_eq(lv_color32_t c1, lv_color32_t c2) -{ - return *((uint32_t *)&c1) == *((uint32_t *)&c2); -} - -lv_color_t lv_color_hex(uint32_t c) -{ - lv_color_t ret; - ret.red = (c >> 16) & 0xff; - ret.green = (c >> 8) & 0xff; - ret.blue = (c >> 0) & 0xff; - return ret; -} - -lv_color_t lv_color_make(uint8_t r, uint8_t g, uint8_t b) -{ - lv_color_t ret; - ret.red = r; - ret.green = g; - ret.blue = b; - return ret; -} - -lv_color32_t lv_color32_make(uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - lv_color32_t ret; - ret.red = r; - ret.green = g; - ret.blue = b; - ret.alpha = a; - return ret; -} - -lv_color_t lv_color_hex3(uint32_t c) -{ - return lv_color_make((uint8_t)(((c >> 4) & 0xF0) | ((c >> 8) & 0xF)), (uint8_t)((c & 0xF0) | ((c & 0xF0) >> 4)), - (uint8_t)((c & 0xF) | ((c & 0xF) << 4))); -} - -uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_16_16_mix(uint16_t c1, uint16_t c2, uint8_t mix) -{ - if(mix == 255) return c1; - if(mix == 0) return c2; - if(c1 == c2) return c1; - - uint16_t ret; - - /* Source: https://stackoverflow.com/a/50012418/1999969*/ - mix = (uint32_t)((uint32_t)mix + 4) >> 3; - - /*0x7E0F81F = 0b00000111111000001111100000011111*/ - uint32_t bg = (uint32_t)(c2 | ((uint32_t)c2 << 16)) & 0x7E0F81F; - uint32_t fg = (uint32_t)(c1 | ((uint32_t)c1 << 16)) & 0x7E0F81F; - uint32_t result = ((((fg - bg) * mix) >> 5) + bg) & 0x7E0F81F; - ret = (uint16_t)(result >> 16) | result; - - return ret; -} - -lv_color_t lv_color_white(void) -{ - return lv_color_make(0xff, 0xff, 0xff); -} - -lv_color_t lv_color_black(void) -{ - return lv_color_make(0x00, 0x00, 0x00); -} - -void lv_color_premultiply(lv_color32_t * c) -{ - if(c->alpha == LV_OPA_COVER) { - return; - } - - if(c->alpha == LV_OPA_TRANSP) { - lv_memzero(c, sizeof(lv_color32_t)); - return; - } - - c->red = LV_OPA_MIX2(c->red, c->alpha); - c->green = LV_OPA_MIX2(c->green, c->alpha); - c->blue = LV_OPA_MIX2(c->blue, c->alpha); -} - -void lv_color16_premultiply(lv_color16_t * c, lv_opa_t a) -{ - if(a == LV_OPA_COVER) { - return; - } - - if(a == LV_OPA_TRANSP) { - lv_memzero(c, sizeof(lv_color16_t)); - return; - } - - c->red = LV_OPA_MIX2(c->red, a); - c->green = LV_OPA_MIX2(c->green, a); - c->blue = LV_OPA_MIX2(c->blue, a); -} - -uint8_t lv_color_luminance(lv_color_t c) -{ - return (uint8_t)((uint16_t)(77u * c.red + 151u * c.green + 28u * c.blue) >> 8); -} - -uint8_t lv_color16_luminance(const lv_color16_t c) -{ - return (uint8_t)((uint16_t)(635u * c.red + 613u * c.green + 231u * c.blue) >> 8); -} - -uint8_t lv_color24_luminance(const uint8_t * c) -{ - return (uint8_t)((uint16_t)(77u * c[2] + 151u * c[1] + 28u * c[0]) >> 8); -} - -uint8_t lv_color32_luminance(lv_color32_t c) -{ - return (uint8_t)((uint16_t)(77u * c.red + 151u * c.green + 28u * c.blue) >> 8); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Helper function to easily create color filters - * @param dsc pointer to a color filter descriptor - * @param c the color to modify - * @param opa the intensity of the modification - * - LV_OPA_50: do nothing - * - < LV_OPA_50: darken - * - LV_OPA_0: fully black - * - > LV_OPA_50: lighten - * - LV_OPA_100: fully white - * @return the modified color - */ -static lv_color_t lv_color_filter_shade_cb(const lv_color_filter_dsc_t * dsc, lv_color_t c, lv_opa_t opa) -{ - LV_UNUSED(dsc); - if(opa == LV_OPA_50) return c; - if(opa < LV_OPA_50) return lv_color_lighten(c, (LV_OPA_50 - opa) * 2); - else return lv_color_darken(c, (opa - LV_OPA_50 * LV_OPA_50) * 2); -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color.h deleted file mode 100644 index 6328c0d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color.h +++ /dev/null @@ -1,428 +0,0 @@ -/** - * @file lv_color.h - * - */ - -#ifndef LV_COLOR_H -#define LV_COLOR_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "lv_assert.h" -#include "lv_math.h" -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ -LV_EXPORT_CONST_INT(LV_COLOR_DEPTH); - -#if LV_COLOR_DEPTH == 8 -#define LV_COLOR_NATIVE_WITH_ALPHA_SIZE 2 -#elif LV_COLOR_DEPTH == 16 -#define LV_COLOR_NATIVE_WITH_ALPHA_SIZE 3 -#elif LV_COLOR_DEPTH == 24 -#define LV_COLOR_NATIVE_WITH_ALPHA_SIZE 4 -#elif LV_COLOR_DEPTH == 32 -#define LV_COLOR_NATIVE_WITH_ALPHA_SIZE 4 -#endif - -/** - * Opacity percentages. - */ - -enum { - LV_OPA_TRANSP = 0, - LV_OPA_0 = 0, - LV_OPA_10 = 25, - LV_OPA_20 = 51, - LV_OPA_30 = 76, - LV_OPA_40 = 102, - LV_OPA_50 = 127, - LV_OPA_60 = 153, - LV_OPA_70 = 178, - LV_OPA_80 = 204, - LV_OPA_90 = 229, - LV_OPA_100 = 255, - LV_OPA_COVER = 255, -}; - -#define LV_OPA_MIN 2 /**< Opacities below this will be transparent */ -#define LV_OPA_MAX 253 /**< Opacities above this will fully cover */ - -/** - * Get the pixel size of a color format in bits, bpp - * @param cf a color format (`LV_COLOR_FORMAT_...`) - * @return the pixel size in bits - * @sa lv_color_format_get_bpp - */ -#define LV_COLOR_FORMAT_GET_BPP(cf) ( \ - (cf) == LV_COLOR_FORMAT_I1 ? 1 : \ - (cf) == LV_COLOR_FORMAT_A1 ? 1 : \ - (cf) == LV_COLOR_FORMAT_I2 ? 2 : \ - (cf) == LV_COLOR_FORMAT_A2 ? 2 : \ - (cf) == LV_COLOR_FORMAT_I4 ? 4 : \ - (cf) == LV_COLOR_FORMAT_A4 ? 4 : \ - (cf) == LV_COLOR_FORMAT_L8 ? 8 : \ - (cf) == LV_COLOR_FORMAT_A8 ? 8 : \ - (cf) == LV_COLOR_FORMAT_I8 ? 8 : \ - (cf) == LV_COLOR_FORMAT_AL88 ? 16 : \ - (cf) == LV_COLOR_FORMAT_RGB565 ? 16 : \ - (cf) == LV_COLOR_FORMAT_RGB565A8 ? 16 : \ - (cf) == LV_COLOR_FORMAT_ARGB8565 ? 24 : \ - (cf) == LV_COLOR_FORMAT_RGB888 ? 24 : \ - (cf) == LV_COLOR_FORMAT_ARGB8888 ? 32 : \ - (cf) == LV_COLOR_FORMAT_XRGB8888 ? 32 : \ - 0 \ - ) - -/** - * Get the pixel size of a color format in bytes - * @param cf a color format (`LV_COLOR_FORMAT_...`) - * @return the pixel size in bytes - * @sa lv_color_format_get_size - */ -#define LV_COLOR_FORMAT_GET_SIZE(cf) ((LV_COLOR_FORMAT_GET_BPP(cf) + 7) >> 3) - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - uint8_t blue; - uint8_t green; - uint8_t red; -} lv_color_t; - -typedef struct { - uint16_t blue : 5; - uint16_t green : 6; - uint16_t red : 5; -} lv_color16_t; - -typedef struct { - uint8_t blue; - uint8_t green; - uint8_t red; - uint8_t alpha; -} lv_color32_t; - -typedef struct { - uint16_t h; - uint8_t s; - uint8_t v; -} lv_color_hsv_t; - -typedef struct { - uint8_t lumi; - uint8_t alpha; -} lv_color16a_t; - -typedef enum { - LV_COLOR_FORMAT_UNKNOWN = 0, - - LV_COLOR_FORMAT_RAW = 0x01, - LV_COLOR_FORMAT_RAW_ALPHA = 0x02, - - /*<=1 byte (+alpha) formats*/ - LV_COLOR_FORMAT_L8 = 0x06, - LV_COLOR_FORMAT_I1 = 0x07, - LV_COLOR_FORMAT_I2 = 0x08, - LV_COLOR_FORMAT_I4 = 0x09, - LV_COLOR_FORMAT_I8 = 0x0A, - LV_COLOR_FORMAT_A8 = 0x0E, - - /*2 byte (+alpha) formats*/ - LV_COLOR_FORMAT_RGB565 = 0x12, - LV_COLOR_FORMAT_ARGB8565 = 0x13, /**< Not supported by sw renderer yet. */ - LV_COLOR_FORMAT_RGB565A8 = 0x14, /**< Color array followed by Alpha array*/ - LV_COLOR_FORMAT_AL88 = 0x15, /**< L8 with alpha >*/ - - /*3 byte (+alpha) formats*/ - LV_COLOR_FORMAT_RGB888 = 0x0F, - LV_COLOR_FORMAT_ARGB8888 = 0x10, - LV_COLOR_FORMAT_XRGB8888 = 0x11, - - /*Formats not supported by software renderer but kept here so GPU can use it*/ - LV_COLOR_FORMAT_A1 = 0x0B, - LV_COLOR_FORMAT_A2 = 0x0C, - LV_COLOR_FORMAT_A4 = 0x0D, - - /* reference to https://wiki.videolan.org/YUV/ */ - /*YUV planar formats*/ - LV_COLOR_FORMAT_YUV_START = 0x20, - LV_COLOR_FORMAT_I420 = LV_COLOR_FORMAT_YUV_START, /*YUV420 planar(3 plane)*/ - LV_COLOR_FORMAT_I422 = 0x21, /*YUV422 planar(3 plane)*/ - LV_COLOR_FORMAT_I444 = 0x22, /*YUV444 planar(3 plane)*/ - LV_COLOR_FORMAT_I400 = 0x23, /*YUV400 no chroma channel*/ - LV_COLOR_FORMAT_NV21 = 0x24, /*YUV420 planar(2 plane), UV plane in 'V, U, V, U'*/ - LV_COLOR_FORMAT_NV12 = 0x25, /*YUV420 planar(2 plane), UV plane in 'U, V, U, V'*/ - - /*YUV packed formats*/ - LV_COLOR_FORMAT_YUY2 = 0x26, /*YUV422 packed like 'Y U Y V'*/ - LV_COLOR_FORMAT_UYVY = 0x27, /*YUV422 packed like 'U Y V Y'*/ - - LV_COLOR_FORMAT_YUV_END = LV_COLOR_FORMAT_UYVY, - - /*Color formats in which LVGL can render*/ -#if LV_COLOR_DEPTH == 1 - LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_I1, - LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_I1, -#elif LV_COLOR_DEPTH == 8 - LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_L8, - LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_AL88, -#elif LV_COLOR_DEPTH == 16 - LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_RGB565, - LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_RGB565A8, -#elif LV_COLOR_DEPTH == 24 - LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_RGB888, - LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_ARGB8888, -#elif LV_COLOR_DEPTH == 32 - LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_XRGB8888, - LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_ARGB8888, -#else -#error "LV_COLOR_DEPTH should be 1, 8, 16, 24 or 32" -#endif - -} lv_color_format_t; - -#define LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf) ((cf) >= LV_COLOR_FORMAT_A1 && (cf) <= LV_COLOR_FORMAT_A8) -#define LV_COLOR_FORMAT_IS_INDEXED(cf) ((cf) >= LV_COLOR_FORMAT_I1 && (cf) <= LV_COLOR_FORMAT_I8) -#define LV_COLOR_FORMAT_IS_YUV(cf) ((cf) >= LV_COLOR_FORMAT_YUV_START && (cf) <= LV_COLOR_FORMAT_YUV_END) -#define LV_COLOR_INDEXED_PALETTE_SIZE(cf) ((cf) == LV_COLOR_FORMAT_I1 ? 2 :\ - (cf) == LV_COLOR_FORMAT_I2 ? 4 :\ - (cf) == LV_COLOR_FORMAT_I4 ? 16 :\ - (cf) == LV_COLOR_FORMAT_I8 ? 256 : 0) - -/********************** - * MACROS - **********************/ - -#define LV_COLOR_MAKE(r8, g8, b8) {b8, g8, r8} - -#define LV_OPA_MIX2(a1, a2) (((int32_t)(a1) * (a2)) >> 8) -#define LV_OPA_MIX3(a1, a2, a3) (((int32_t)(a1) * (a2) * (a3)) >> 16) - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Get the pixel size of a color format in bits, bpp - * @param cf a color format (`LV_COLOR_FORMAT_...`) - * @return the pixel size in bits - * @sa LV_COLOR_FORMAT_GET_BPP - */ -uint8_t lv_color_format_get_bpp(lv_color_format_t cf); - -/** - * Get the pixel size of a color format in bytes - * @param cf a color format (`LV_COLOR_FORMAT_...`) - * @return the pixel size in bytes - * @sa LV_COLOR_FORMAT_GET_SIZE - */ -uint8_t lv_color_format_get_size(lv_color_format_t cf); - -/** - * Check if a color format has alpha channel or not - * @param src_cf a color format (`LV_COLOR_FORMAT_...`) - * @return true: has alpha channel; false: doesn't have alpha channel - */ -bool lv_color_format_has_alpha(lv_color_format_t src_cf); - -/** - * Create an ARGB8888 color from RGB888 + alpha - * @param color an RGB888 color - * @param opa the alpha value - * @return the ARGB8888 color - */ -lv_color32_t lv_color_to_32(lv_color_t color, lv_opa_t opa); - -/** - * Convert an RGB888 color to an integer - * @param c an RGB888 color - * @return `c` as an integer - */ -uint32_t lv_color_to_int(lv_color_t c); - -/** - * Check if two RGB888 color are equal - * @param c1 the first color - * @param c2 the second color - * @return true: equal - */ -bool lv_color_eq(lv_color_t c1, lv_color_t c2); - -/** - * Check if two ARGB8888 color are equal - * @param c1 the first color - * @param c2 the second color - * @return true: equal - */ -bool lv_color32_eq(lv_color32_t c1, lv_color32_t c2); - -/** - * Create a color from 0x000000..0xffffff input - * @param c the hex input - * @return the color - */ -lv_color_t lv_color_hex(uint32_t c); - -/** - * Create an RGB888 color - * @param r the red channel (0..255) - * @param g the green channel (0..255) - * @param b the blue channel (0..255) - * @return the color - */ -lv_color_t lv_color_make(uint8_t r, uint8_t g, uint8_t b); - -/** - * Create an ARGB8888 color - * @param r the red channel (0..255) - * @param g the green channel (0..255) - * @param b the blue channel (0..255) - * @param a the alpha channel (0..255) - * @return the color - */ -lv_color32_t lv_color32_make(uint8_t r, uint8_t g, uint8_t b, uint8_t a); - -/** - * Create a color from 0x000..0xfff input - * @param c the hex input (e.g. 0x123 will be 0x112233) - * @return the color - */ -lv_color_t lv_color_hex3(uint32_t c); - -/** - * Convert am RGB888 color to RGB565 stored in `uint16_t` - * @param color and RGB888 color - * @return `color` as RGB565 on `uin16_t` - */ -uint16_t lv_color_to_u16(lv_color_t color); - -/** - * Convert am RGB888 color to XRGB8888 stored in `uint32_t` - * @param color and RGB888 color - * @return `color` as XRGB8888 on `uin32_t` (the alpha channel is always set to 0xFF) - */ -uint32_t lv_color_to_u32(lv_color_t color); - -/** - * Mix two RGB565 colors - * @param c1 the first color (typically the foreground color) - * @param c2 the second color (typically the background color) - * @param mix 0..255, or LV_OPA_0/10/20... - * @return mix == 0: c2 - * mix == 255: c1 - * mix == 128: 0.5 x c1 + 0.5 x c2 - */ -uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_16_16_mix(uint16_t c1, uint16_t c2, uint8_t mix); - -/** - * Mix white to a color - * @param c the base color - * @param lvl the intensity of white (0: no change, 255: fully white) - * @return the mixed color - */ -lv_color_t lv_color_lighten(lv_color_t c, lv_opa_t lvl); - -/** - * Mix black to a color - * @param c the base color - * @param lvl the intensity of black (0: no change, 255: fully black) - * @return the mixed color - */ -lv_color_t lv_color_darken(lv_color_t c, lv_opa_t lvl); - -/** - * Convert a HSV color to RGB - * @param h hue [0..359] - * @param s saturation [0..100] - * @param v value [0..100] - * @return the given RGB color in RGB (with LV_COLOR_DEPTH depth) - */ -lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v); - -/** - * Convert a 32-bit RGB color to HSV - * @param r8 8-bit red - * @param g8 8-bit green - * @param b8 8-bit blue - * @return the given RGB color in HSV - */ -lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r8, uint8_t g8, uint8_t b8); - -/** - * Convert a color to HSV - * @param color color - * @return the given color in HSV - */ -lv_color_hsv_t lv_color_to_hsv(lv_color_t color); - -/*Source: https://vuetifyjs.com/en/styles/colors/#material-colors*/ - -/** - * A helper for white color - * @return a white color - */ -lv_color_t lv_color_white(void); - -/** - * A helper for black color - * @return a black color - */ -lv_color_t lv_color_black(void); - -void lv_color_premultiply(lv_color32_t * c); - -void lv_color16_premultiply(lv_color16_t * c, lv_opa_t a); - -/** - * Get the luminance of a color: luminance = 0.3 R + 0.59 G + 0.11 B - * @param c a color - * @return the brightness [0..255] - */ -uint8_t lv_color_luminance(lv_color_t c); - -/** - * Get the luminance of a color16: luminance = 0.3 R + 0.59 G + 0.11 B - * @param c a color - * @return the brightness [0..255] - */ -uint8_t lv_color16_luminance(const lv_color16_t c); - -/** - * Get the luminance of a color24: luminance = 0.3 R + 0.59 G + 0.11 B - * @param c a color - * @return the brightness [0..255] - */ -uint8_t lv_color24_luminance(const uint8_t * c); - -/** - * Get the luminance of a color32: luminance = 0.3 R + 0.59 G + 0.11 B - * @param c a color - * @return the brightness [0..255] - */ -uint8_t lv_color32_luminance(lv_color32_t c); - -/********************** - * MACROS - **********************/ - -#include "lv_palette.h" -#include "lv_color_op.h" - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_color_filter_dsc_t lv_color_filter_shade; - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_COLOR_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color_op.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color_op.c deleted file mode 100644 index a26f2b4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color_op.c +++ /dev/null @@ -1,74 +0,0 @@ -/** - * @file lv_color.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_color_op_private.h" -#include "lv_log.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix) -{ - lv_color_t ret; - - ret.red = LV_UDIV255((uint16_t)c1.red * mix + c2.red * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); - ret.green = LV_UDIV255((uint16_t)c1.green * mix + c2.green * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); - ret.blue = LV_UDIV255((uint16_t)c1.blue * mix + c2.blue * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); - return ret; -} - -lv_color32_t lv_color_mix32(lv_color32_t fg, lv_color32_t bg) -{ - if(fg.alpha >= LV_OPA_MAX) { - fg.alpha = bg.alpha; - return fg; - } - if(fg.alpha <= LV_OPA_MIN) { - return bg; - } - bg.red = (uint32_t)((uint32_t)fg.red * fg.alpha + (uint32_t)bg.red * (255 - fg.alpha)) >> 8; - bg.green = (uint32_t)((uint32_t)fg.green * fg.alpha + (uint32_t)bg.green * (255 - fg.alpha)) >> 8; - bg.blue = (uint32_t)((uint32_t)fg.blue * fg.alpha + (uint32_t)bg.blue * (255 - fg.alpha)) >> 8; - return bg; -} - -uint8_t lv_color_brightness(lv_color_t c) -{ - uint16_t bright = (uint16_t)(3u * c.red + c.green + 4u * c.blue); - return (uint8_t)(bright >> 3); -} - -void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_color_filter_cb_t cb) -{ - dsc->filter_cb = cb; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color_op.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color_op.h deleted file mode 100644 index 0a59de3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color_op.h +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @file lv_color_op.h - * - */ - -#ifndef LV_COLOR_OP_H -#define LV_COLOR_OP_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_assert.h" -#include "lv_math.h" -#include "lv_color.h" -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_color_filter_dsc_t; - -typedef lv_color_t (*lv_color_filter_cb_t)(const struct lv_color_filter_dsc_t *, lv_color_t, lv_opa_t); - -struct lv_color_filter_dsc_t { - lv_color_filter_cb_t filter_cb; - void * user_data; -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Mix two colors with a given ratio. - * @param c1 the first color to mix (usually the foreground) - * @param c2 the second color to mix (usually the background) - * @param mix The ratio of the colors. 0: full `c2`, 255: full `c1`, 127: half `c1` and half`c2` - * @return the mixed color - */ -lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix); - -/** - * - * @param fg - * @param bg - * @return - * @note Use bg.alpha in the return value - * @note Use fg.alpha as mix ratio - */ -lv_color32_t lv_color_mix32(lv_color32_t fg, lv_color32_t bg); - -/** - * Get the brightness of a color - * @param c a color - * @return brightness in range [0..255] - */ -uint8_t lv_color_brightness(lv_color_t c); - -void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_color_filter_cb_t cb); - -/********************** - * PREDEFINED COLORS - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_COLOR_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color_op_private.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color_op_private.h deleted file mode 100644 index d6516eb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_color_op_private.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file lv_color_op_private.h - * - */ - -#ifndef LV_COLOR_OP_PRIVATE_H -#define LV_COLOR_OP_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_color_op.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_COLOR_OP_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_event.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_event.c deleted file mode 100644 index ec985ed..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_event.c +++ /dev/null @@ -1,224 +0,0 @@ -/** - * @file lv_event.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_event_private.h" -#include "../core/lv_global.h" -#include "../stdlib/lv_mem.h" -#include "lv_assert.h" -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ - -#define event_head LV_GLOBAL_DEFAULT()->event_header -#define event_last_id LV_GLOBAL_DEFAULT()->event_last_register_id - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -#if LV_USE_LOG && LV_LOG_TRACE_EVENT - #define LV_TRACE_EVENT(...) LV_LOG_TRACE(__VA_ARGS__) -#else - #define LV_TRACE_EVENT(...) -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_event_push(lv_event_t * e) -{ - /*Build a simple linked list from the objects used in the events - *It's important to know if this object was deleted by a nested event - *called from this `event_cb`.*/ - e->prev = event_head; - event_head = e; - -} - -void lv_event_pop(lv_event_t * e) -{ - event_head = e->prev; -} - -lv_result_t lv_event_send(lv_event_list_t * list, lv_event_t * e, bool preprocess) -{ - if(list == NULL) return LV_RESULT_OK; - - uint32_t i = 0; - lv_event_dsc_t ** dsc = lv_array_front(list); - uint32_t size = lv_array_size(list); - for(i = 0; i < size; i++) { - if(dsc[i]->cb == NULL) continue; - bool is_preprocessed = (dsc[i]->filter & LV_EVENT_PREPROCESS) != 0; - if(is_preprocessed != preprocess) continue; - lv_event_code_t filter = dsc[i]->filter & ~LV_EVENT_PREPROCESS; - if(filter == LV_EVENT_ALL || filter == e->code) { - e->user_data = dsc[i]->user_data; - dsc[i]->cb(e); - if(e->stop_processing) return LV_RESULT_OK; - - /*Stop if the object is deleted*/ - if(e->deleted) return LV_RESULT_INVALID; - - } - } - return LV_RESULT_OK; -} - -lv_event_dsc_t * lv_event_add(lv_event_list_t * list, lv_event_cb_t cb, lv_event_code_t filter, - void * user_data) -{ - lv_event_dsc_t * dsc = lv_malloc(sizeof(lv_event_dsc_t)); - LV_ASSERT_NULL(dsc); - - dsc->cb = cb; - dsc->filter = filter; - dsc->user_data = user_data; - - if(lv_array_size(list) == 0) { - /*event list hasn't been initialized.*/ - lv_array_init(list, 1, sizeof(lv_event_dsc_t *)); - } - - lv_array_push_back(list, &dsc); - return dsc; -} - -bool lv_event_remove_dsc(lv_event_list_t * list, lv_event_dsc_t * dsc) -{ - LV_ASSERT_NULL(list); - LV_ASSERT_NULL(dsc); - - int size = lv_array_size(list); - lv_event_dsc_t ** events = lv_array_front(list); - for(int i = 0; i < size; i++) { - if(events[i] == dsc) { - lv_free(dsc); - lv_array_remove(list, i); - return true; - } - } - - return false; -} - -uint32_t lv_event_get_count(lv_event_list_t * list) -{ - LV_ASSERT_NULL(list); - return lv_array_size(list); -} - -lv_event_dsc_t * lv_event_get_dsc(lv_event_list_t * list, uint32_t index) -{ - LV_ASSERT_NULL(list); - lv_event_dsc_t ** dsc; - dsc = lv_array_at(list, index); - return dsc ? *dsc : NULL; -} - -lv_event_cb_t lv_event_dsc_get_cb(lv_event_dsc_t * dsc) -{ - LV_ASSERT_NULL(dsc); - return dsc->cb; -} - -void * lv_event_dsc_get_user_data(lv_event_dsc_t * dsc) -{ - LV_ASSERT_NULL(dsc); - return dsc->user_data; - -} - -bool lv_event_remove(lv_event_list_t * list, uint32_t index) -{ - LV_ASSERT_NULL(list); - lv_event_dsc_t * dsc = lv_event_get_dsc(list, index); - lv_free(dsc); - return lv_array_remove(list, index); -} - -void lv_event_remove_all(lv_event_list_t * list) -{ - LV_ASSERT_NULL(list); - int size = lv_array_size(list); - lv_event_dsc_t ** dsc = lv_array_front(list); - for(int i = 0; i < size; i++) { - lv_free(dsc[i]); - } - lv_array_deinit(list); -} - -void * lv_event_get_current_target(lv_event_t * e) -{ - return e->current_target; -} - -void * lv_event_get_target(lv_event_t * e) -{ - return e->original_target; -} - -lv_event_code_t lv_event_get_code(lv_event_t * e) -{ - return e->code & ~LV_EVENT_PREPROCESS; -} - -void * lv_event_get_param(lv_event_t * e) -{ - return e->param; -} - -void * lv_event_get_user_data(lv_event_t * e) -{ - return e->user_data; -} - -void lv_event_stop_bubbling(lv_event_t * e) -{ - e->stop_bubbling = 1; -} - -void lv_event_stop_processing(lv_event_t * e) -{ - e->stop_processing = 1; -} - -uint32_t lv_event_register_id(void) -{ - event_last_id ++; - return event_last_id; -} - -void lv_event_mark_deleted(void * target) -{ - lv_event_t * e = event_head; - - while(e) { - if(e->original_target == target || e->current_target == target) e->deleted = 1; - e = e->prev; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_event.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_event.h deleted file mode 100644 index 61518e9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_event.h +++ /dev/null @@ -1,215 +0,0 @@ -/** - * @file lv_event.h - * - */ - -#ifndef LV_EVENT_H -#define LV_EVENT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_types.h" -#include "../lv_conf_internal.h" - -#include "lv_array.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef void (*lv_event_cb_t)(lv_event_t * e); - -/** - * Type of event being sent to the object. - */ -typedef enum { - LV_EVENT_ALL = 0, - - /** Input device events*/ - LV_EVENT_PRESSED, /**< The object has been pressed*/ - LV_EVENT_PRESSING, /**< The object is being pressed (called continuously while pressing)*/ - LV_EVENT_PRESS_LOST, /**< The object is still being pressed but slid cursor/finger off of the object */ - LV_EVENT_SHORT_CLICKED, /**< The object was pressed for a short period of time, then released it. Not called if scrolled.*/ - LV_EVENT_LONG_PRESSED, /**< Object has been pressed for at least `long_press_time`. Not called if scrolled.*/ - LV_EVENT_LONG_PRESSED_REPEAT, /**< Called after `long_press_time` in every `long_press_repeat_time` ms. Not called if scrolled.*/ - LV_EVENT_CLICKED, /**< Called on release if not scrolled (regardless to long press)*/ - LV_EVENT_RELEASED, /**< Called in every cases when the object has been released*/ - LV_EVENT_SCROLL_BEGIN, /**< Scrolling begins. The event parameter is a pointer to the animation of the scroll. Can be modified*/ - LV_EVENT_SCROLL_THROW_BEGIN, - LV_EVENT_SCROLL_END, /**< Scrolling ends*/ - LV_EVENT_SCROLL, /**< Scrolling*/ - LV_EVENT_GESTURE, /**< A gesture is detected. Get the gesture with `lv_indev_get_gesture_dir(lv_indev_active());` */ - LV_EVENT_KEY, /**< A key is sent to the object. Get the key with `lv_indev_get_key(lv_indev_active());`*/ - LV_EVENT_ROTARY, /**< An encoder or wheel was rotated. Get the rotation count with `lv_event_get_rotary_diff(e);`*/ - LV_EVENT_FOCUSED, /**< The object is focused*/ - LV_EVENT_DEFOCUSED, /**< The object is defocused*/ - LV_EVENT_LEAVE, /**< The object is defocused but still selected*/ - LV_EVENT_HIT_TEST, /**< Perform advanced hit-testing*/ - LV_EVENT_INDEV_RESET, /**< Indev has been reset*/ - LV_EVENT_HOVER_OVER, /**< Indev hover over object*/ - LV_EVENT_HOVER_LEAVE, /**< Indev hover leave object*/ - - /** Drawing events*/ - LV_EVENT_COVER_CHECK, /**< Check if the object fully covers an area. The event parameter is `lv_cover_check_info_t *`.*/ - LV_EVENT_REFR_EXT_DRAW_SIZE, /**< Get the required extra draw area around the object (e.g. for shadow). The event parameter is `int32_t *` to store the size.*/ - LV_EVENT_DRAW_MAIN_BEGIN, /**< Starting the main drawing phase*/ - LV_EVENT_DRAW_MAIN, /**< Perform the main drawing*/ - LV_EVENT_DRAW_MAIN_END, /**< Finishing the main drawing phase*/ - LV_EVENT_DRAW_POST_BEGIN, /**< Starting the post draw phase (when all children are drawn)*/ - LV_EVENT_DRAW_POST, /**< Perform the post draw phase (when all children are drawn)*/ - LV_EVENT_DRAW_POST_END, /**< Finishing the post draw phase (when all children are drawn)*/ - LV_EVENT_DRAW_TASK_ADDED, /**< Adding a draw task */ - - /** Special events*/ - LV_EVENT_VALUE_CHANGED, /**< The object's value has changed (i.e. slider moved)*/ - LV_EVENT_INSERT, /**< A text is inserted to the object. The event data is `char *` being inserted.*/ - LV_EVENT_REFRESH, /**< Notify the object to refresh something on it (for the user)*/ - LV_EVENT_READY, /**< A process has finished*/ - LV_EVENT_CANCEL, /**< A process has been cancelled */ - - /** Other events*/ - LV_EVENT_CREATE, /**< Object is being created*/ - LV_EVENT_DELETE, /**< Object is being deleted*/ - LV_EVENT_CHILD_CHANGED, /**< Child was removed, added, or its size, position were changed */ - LV_EVENT_CHILD_CREATED, /**< Child was created, always bubbles up to all parents*/ - LV_EVENT_CHILD_DELETED, /**< Child was deleted, always bubbles up to all parents*/ - LV_EVENT_SCREEN_UNLOAD_START, /**< A screen unload started, fired immediately when scr_load is called*/ - LV_EVENT_SCREEN_LOAD_START, /**< A screen load started, fired when the screen change delay is expired*/ - LV_EVENT_SCREEN_LOADED, /**< A screen was loaded*/ - LV_EVENT_SCREEN_UNLOADED, /**< A screen was unloaded*/ - LV_EVENT_SIZE_CHANGED, /**< Object coordinates/size have changed*/ - LV_EVENT_STYLE_CHANGED, /**< Object's style has changed*/ - LV_EVENT_LAYOUT_CHANGED, /**< The children position has changed due to a layout recalculation*/ - LV_EVENT_GET_SELF_SIZE, /**< Get the internal size of a widget*/ - - /** Events of optional LVGL components*/ - LV_EVENT_INVALIDATE_AREA, - LV_EVENT_RESOLUTION_CHANGED, - LV_EVENT_COLOR_FORMAT_CHANGED, - LV_EVENT_REFR_REQUEST, - LV_EVENT_REFR_START, - LV_EVENT_REFR_READY, - LV_EVENT_RENDER_START, - LV_EVENT_RENDER_READY, - LV_EVENT_FLUSH_START, - LV_EVENT_FLUSH_FINISH, - LV_EVENT_FLUSH_WAIT_START, - LV_EVENT_FLUSH_WAIT_FINISH, - - LV_EVENT_VSYNC, - - LV_EVENT_LAST, /** Number of default events*/ - - LV_EVENT_PREPROCESS = 0x8000, /** This is a flag that can be set with an event so it's processed - before the class default event processing */ -} lv_event_code_t; - -typedef lv_array_t lv_event_list_t; - -/** - * @brief Event callback. - * Events are used to notify the user of some action being taken on the object. - * For details, see ::lv_event_t. - */ - -lv_result_t lv_event_send(lv_event_list_t * list, lv_event_t * e, bool preprocess); - -lv_event_dsc_t * lv_event_add(lv_event_list_t * list, lv_event_cb_t cb, lv_event_code_t filter, void * user_data); -bool lv_event_remove_dsc(lv_event_list_t * list, lv_event_dsc_t * dsc); - -uint32_t lv_event_get_count(lv_event_list_t * list); - -lv_event_dsc_t * lv_event_get_dsc(lv_event_list_t * list, uint32_t index); - -lv_event_cb_t lv_event_dsc_get_cb(lv_event_dsc_t * dsc); - -void * lv_event_dsc_get_user_data(lv_event_dsc_t * dsc); - -bool lv_event_remove(lv_event_list_t * list, uint32_t index); - -void lv_event_remove_all(lv_event_list_t * list); - -/** - * Get the object originally targeted by the event. It's the same even if the event is bubbled. - * @param e pointer to the event descriptor - * @return the target of the event_code - */ -void * lv_event_get_target(lv_event_t * e); - -/** - * Get the current target of the event. It's the object which event handler being called. - * If the event is not bubbled it's the same as "normal" target. - * @param e pointer to the event descriptor - * @return pointer to the current target of the event_code - */ -void * lv_event_get_current_target(lv_event_t * e); - -/** - * Get the event code of an event - * @param e pointer to the event descriptor - * @return the event code. (E.g. `LV_EVENT_CLICKED`, `LV_EVENT_FOCUSED`, etc) - */ -lv_event_code_t lv_event_get_code(lv_event_t * e); - -/** - * Get the parameter passed when the event was sent - * @param e pointer to the event descriptor - * @return pointer to the parameter - */ -void * lv_event_get_param(lv_event_t * e); - -/** - * Get the user_data passed when the event was registered on the object - * @param e pointer to the event descriptor - * @return pointer to the user_data - */ -void * lv_event_get_user_data(lv_event_t * e); - -/** - * Stop the event from bubbling. - * This is only valid when called in the middle of an event processing chain. - * @param e pointer to the event descriptor - */ -void lv_event_stop_bubbling(lv_event_t * e); - -/** - * Stop processing this event. - * This is only valid when called in the middle of an event processing chain. - * @param e pointer to the event descriptor - */ -void lv_event_stop_processing(lv_event_t * e); - -/** - * Register a new, custom event ID. - * It can be used the same way as e.g. `LV_EVENT_CLICKED` to send custom events - * @return the new event id - * - * Example: - * @code - * uint32_t LV_EVENT_MINE = 0; - * ... - * e = lv_event_register_id(); - * ... - * lv_obj_send_event(obj, LV_EVENT_MINE, &some_data); - * @endcode - */ -uint32_t lv_event_register_id(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_EVENT_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_event_private.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_event_private.h deleted file mode 100644 index b31ca81..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_event_private.h +++ /dev/null @@ -1,73 +0,0 @@ -/** - * @file lv_event_private.h - * - */ - -#ifndef LV_EVENT_PRIVATE_H -#define LV_EVENT_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_event.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_event_dsc_t { - lv_event_cb_t cb; - void * user_data; - uint32_t filter; -}; - -struct lv_event_t { - void * current_target; - void * original_target; - lv_event_code_t code; - void * user_data; - void * param; - lv_event_t * prev; - uint8_t deleted : 1; - uint8_t stop_processing : 1; - uint8_t stop_bubbling : 1; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_event_push(lv_event_t * e); - -void lv_event_pop(lv_event_t * e); - -/** - * Nested events can be called and one of them might belong to an object that is being deleted. - * Mark this object's `event_temp_data` deleted to know that its `lv_obj_send_event` should return `LV_RESULT_INVALID` - * @param target pointer to an event target which was deleted - */ -void lv_event_mark_deleted(void * target); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_EVENT_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_fs.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_fs.c deleted file mode 100644 index f713698..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_fs.c +++ /dev/null @@ -1,695 +0,0 @@ -/** - * @file lv_fs.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_fs_private.h" - -#include "../misc/lv_assert.h" -#include "../misc/lv_profiler.h" -#include "../stdlib/lv_string.h" -#include "lv_ll.h" -#include "../core/lv_global.h" - -/********************* - * DEFINES - *********************/ - -#if LV_FS_DEFAULT_DRIVE_LETTER != '\0' && (LV_FS_DEFAULT_DRIVE_LETTER < 'A' || 'Z' < LV_FS_DEFAULT_DRIVE_LETTER) - #error "When enabled, LV_FS_DEFAULT_DRIVE_LETTER needs to be a capital ASCII letter (A-Z)" -#endif - -#define fsdrv_ll_p &(LV_GLOBAL_DEFAULT()->fsdrv_ll) - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - char drive_letter; - const char * real_path; -} resolved_path_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static resolved_path_t lv_fs_resolve_path(const char * path); -static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br); -static lv_fs_res_t lv_fs_write_cached(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw); -static lv_fs_res_t lv_fs_seek_cached(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whence); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_fs_init(void) -{ - lv_ll_init(fsdrv_ll_p, sizeof(lv_fs_drv_t *)); -} - -void lv_fs_deinit(void) -{ - lv_ll_clear(fsdrv_ll_p); -} - -bool lv_fs_is_ready(char letter) -{ - lv_fs_drv_t * drv = lv_fs_get_drv(letter); - - if(drv == NULL) return false; /*An unknown driver in not ready*/ - - if(drv->ready_cb == NULL) return true; /*Assume the driver is always ready if no handler provided*/ - - return drv->ready_cb(drv); -} - -lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode) -{ - if(path == NULL) { - LV_LOG_WARN("Can't open file: path is NULL"); - return LV_FS_RES_INV_PARAM; - } - - resolved_path_t resolved_path = lv_fs_resolve_path(path); - - lv_fs_drv_t * drv = lv_fs_get_drv(resolved_path.drive_letter); - - if(drv == NULL) { - LV_LOG_WARN("Can't open file (%s): unknown driver letter", path); - return LV_FS_RES_NOT_EX; - } - - if(drv->ready_cb) { - if(drv->ready_cb(drv) == false) { - LV_LOG_WARN("Can't open file (%s): driver not ready", path); - return LV_FS_RES_HW_ERR; - } - } - - if(drv->open_cb == NULL) { - LV_LOG_WARN("Can't open file (%s): open function not exists", path); - return LV_FS_RES_NOT_IMP; - } - - LV_PROFILER_BEGIN; - - file_p->drv = drv; - - /* For memory-mapped files we set the file handle to our file descriptor so that we can access the cache from the file operations */ - if(drv->cache_size == LV_FS_CACHE_FROM_BUFFER) { - file_p->file_d = file_p; - } - else { - void * file_d = drv->open_cb(drv, resolved_path.real_path, mode); - if(file_d == NULL || file_d == (void *)(-1)) { - LV_PROFILER_END; - return LV_FS_RES_UNKNOWN; - } - file_p->file_d = file_d; - } - - if(drv->cache_size) { - file_p->cache = lv_malloc_zeroed(sizeof(lv_fs_file_cache_t)); - LV_ASSERT_MALLOC(file_p->cache); - - /* If this is a memory-mapped file, then set "cache" to the memory buffer */ - if(drv->cache_size == LV_FS_CACHE_FROM_BUFFER) { - lv_fs_path_ex_t * path_ex = (lv_fs_path_ex_t *)path; - file_p->cache->buffer = (void *)path_ex->buffer; - file_p->cache->start = 0; - file_p->cache->file_position = 0; - file_p->cache->end = path_ex->size; - } - /*Set an invalid range by default*/ - else { - file_p->cache->start = UINT32_MAX; - file_p->cache->end = UINT32_MAX - 1; - } - } - - LV_PROFILER_END; - - return LV_FS_RES_OK; -} - -void lv_fs_make_path_from_buffer(lv_fs_path_ex_t * path, char letter, const void * buf, uint32_t size) -{ - path->path[0] = letter; - path->path[1] = ':'; - path->path[2] = 0; - path->buffer = buf; - path->size = size; -} - -lv_fs_res_t lv_fs_close(lv_fs_file_t * file_p) -{ - if(file_p->drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->close_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - LV_PROFILER_BEGIN; - - lv_fs_res_t res = file_p->drv->close_cb(file_p->drv, file_p->file_d); - - if(file_p->drv->cache_size && file_p->cache) { - /* Only free cache if it was pre-allocated (for memory-mapped files it is never allocated) */ - if(file_p->drv->cache_size != LV_FS_CACHE_FROM_BUFFER && file_p->cache->buffer) { - lv_free(file_p->cache->buffer); - } - - lv_free(file_p->cache); - } - - file_p->file_d = NULL; - file_p->drv = NULL; - file_p->cache = NULL; - - LV_PROFILER_END; - - return res; -} - -lv_fs_res_t lv_fs_read(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br) -{ - if(br != NULL) *br = 0; - if(file_p->drv == NULL) return LV_FS_RES_INV_PARAM; - - if(file_p->drv->cache_size) { - if(file_p->drv->read_cb == NULL || file_p->drv->seek_cb == NULL) return LV_FS_RES_NOT_IMP; - } - else { - if(file_p->drv->read_cb == NULL) return LV_FS_RES_NOT_IMP; - } - - LV_PROFILER_BEGIN; - - uint32_t br_tmp = 0; - lv_fs_res_t res; - - if(file_p->drv->cache_size) { - res = lv_fs_read_cached(file_p, buf, btr, &br_tmp); - } - else { - res = file_p->drv->read_cb(file_p->drv, file_p->file_d, buf, btr, &br_tmp); - } - - if(br != NULL) *br = br_tmp; - - LV_PROFILER_END; - - return res; -} - -lv_fs_res_t lv_fs_write(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw) -{ - if(bw != NULL) *bw = 0; - - if(file_p->drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->cache_size) { - if(file_p->drv->write_cb == NULL || file_p->drv->seek_cb == NULL) return LV_FS_RES_NOT_IMP; - } - else { - if(file_p->drv->write_cb == NULL) return LV_FS_RES_NOT_IMP; - } - - LV_PROFILER_BEGIN; - - lv_fs_res_t res; - uint32_t bw_tmp = 0; - if(file_p->drv->cache_size) { - res = lv_fs_write_cached(file_p, buf, btw, &bw_tmp); - } - else { - res = file_p->drv->write_cb(file_p->drv, file_p->file_d, buf, btw, &bw_tmp); - } - if(bw != NULL) *bw = bw_tmp; - - LV_PROFILER_END; - - return res; -} - -lv_fs_res_t lv_fs_seek(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whence) -{ - if(file_p->drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->cache_size) { - if(file_p->drv->seek_cb == NULL || file_p->drv->tell_cb == NULL) return LV_FS_RES_NOT_IMP; - } - else { - if(file_p->drv->seek_cb == NULL) return LV_FS_RES_NOT_IMP; - } - - LV_PROFILER_BEGIN; - - lv_fs_res_t res; - if(file_p->drv->cache_size) { - res = lv_fs_seek_cached(file_p, pos, whence); - } - else { - res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, pos, whence); - } - - LV_PROFILER_END; - - return res; -} - -lv_fs_res_t lv_fs_tell(lv_fs_file_t * file_p, uint32_t * pos) -{ - if(file_p->drv == NULL) { - *pos = 0; - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->cache_size == 0 && file_p->drv->tell_cb == NULL) { - *pos = 0; - return LV_FS_RES_NOT_IMP; - } - - LV_PROFILER_BEGIN; - - lv_fs_res_t res; - if(file_p->drv->cache_size) { - *pos = file_p->cache->file_position; - res = LV_FS_RES_OK; - } - else { - res = file_p->drv->tell_cb(file_p->drv, file_p->file_d, pos); - } - - LV_PROFILER_END; - - return res; -} - -lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path) -{ - if(path == NULL) return LV_FS_RES_INV_PARAM; - - resolved_path_t resolved_path = lv_fs_resolve_path(path); - - lv_fs_drv_t * drv = lv_fs_get_drv(resolved_path.drive_letter); - - if(drv == NULL) { - return LV_FS_RES_NOT_EX; - } - - if(drv->ready_cb) { - if(drv->ready_cb(drv) == false) { - return LV_FS_RES_HW_ERR; - } - } - - if(drv->dir_open_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - LV_PROFILER_BEGIN; - - void * dir_d = drv->dir_open_cb(drv, resolved_path.real_path); - - if(dir_d == NULL || dir_d == (void *)(-1)) { - LV_PROFILER_END; - return LV_FS_RES_UNKNOWN; - } - - rddir_p->drv = drv; - rddir_p->dir_d = dir_d; - - LV_PROFILER_END; - - return LV_FS_RES_OK; -} - -lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn, uint32_t fn_len) -{ - if(fn_len == 0) { - return LV_FS_RES_INV_PARAM; - } - - if(rddir_p->drv == NULL || rddir_p->dir_d == NULL) { - fn[0] = '\0'; - return LV_FS_RES_INV_PARAM; - } - - if(rddir_p->drv->dir_read_cb == NULL) { - fn[0] = '\0'; - return LV_FS_RES_NOT_IMP; - } - - LV_PROFILER_BEGIN; - - lv_fs_res_t res = rddir_p->drv->dir_read_cb(rddir_p->drv, rddir_p->dir_d, fn, fn_len); - - LV_PROFILER_END; - - return res; -} - -lv_fs_res_t lv_fs_dir_close(lv_fs_dir_t * rddir_p) -{ - if(rddir_p->drv == NULL || rddir_p->dir_d == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(rddir_p->drv->dir_close_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - LV_PROFILER_BEGIN; - - lv_fs_res_t res = rddir_p->drv->dir_close_cb(rddir_p->drv, rddir_p->dir_d); - - rddir_p->dir_d = NULL; - rddir_p->drv = NULL; - - LV_PROFILER_END; - - return res; -} - -void lv_fs_drv_init(lv_fs_drv_t * drv) -{ - lv_memzero(drv, sizeof(lv_fs_drv_t)); -} - -void lv_fs_drv_register(lv_fs_drv_t * drv_p) -{ - /*Save the new driver*/ - lv_fs_drv_t ** new_drv; - new_drv = lv_ll_ins_head(fsdrv_ll_p); - LV_ASSERT_MALLOC(new_drv); - if(new_drv == NULL) return; - - *new_drv = drv_p; -} - -lv_fs_drv_t * lv_fs_get_drv(char letter) -{ - lv_fs_drv_t ** drv; - - LV_LL_READ(fsdrv_ll_p, drv) { - if((*drv)->letter == letter) { - return *drv; - } - } - - return NULL; -} - -char * lv_fs_get_letters(char * buf) -{ - lv_fs_drv_t ** drv; - uint8_t i = 0; - - LV_LL_READ(fsdrv_ll_p, drv) { - buf[i] = (*drv)->letter; - i++; - } - - buf[i] = '\0'; - - return buf; -} - -const char * lv_fs_get_ext(const char * fn) -{ - size_t i; - for(i = lv_strlen(fn); i > 0; i--) { - if(fn[i] == '.') { - return &fn[i + 1]; - } - else if(fn[i] == '/' || fn[i] == '\\') { - return ""; /*No extension if a '\' or '/' found*/ - } - } - - return ""; /*Empty string if no '.' in the file name.*/ -} - -char * lv_fs_up(char * path) -{ - size_t len = lv_strlen(path); - if(len == 0) return path; - - len--; /*Go before the trailing '\0'*/ - - /*Ignore trailing '/' or '\'*/ - while(path[len] == '/' || path[len] == '\\') { - path[len] = '\0'; - if(len > 0) - len--; - else - return path; - } - - size_t i; - for(i = len; i > 0; i--) { - if(path[i] == '/' || path[i] == '\\') break; - } - - if(i > 0) path[i] = '\0'; - - return path; -} - -const char * lv_fs_get_last(const char * path) -{ - size_t len = lv_strlen(path); - if(len == 0) return path; - - len--; /*Go before the trailing '\0'*/ - - /*Ignore trailing '/' or '\'*/ - while(path[len] == '/' || path[len] == '\\') { - if(len > 0) - len--; - else - return path; - } - - size_t i; - for(i = len; i > 0; i--) { - if(path[i] == '/' || path[i] == '\\') break; - } - - /*No '/' or '\' in the path so return with path itself*/ - if(i == 0) return path; - - return &path[i + 1]; -} -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Extract the drive letter and the real path from LVGL's "abstracted file system" path string - * @param path path string (E.g. S:/folder/file.txt) - */ -static resolved_path_t lv_fs_resolve_path(const char * path) -{ - resolved_path_t resolved; - -#if LV_FS_DEFAULT_DRIVE_LETTER != '\0' /*When using default drive letter, strict format (X:) is mandatory*/ - bool has_drive_prefix = ('A' <= path[0]) && (path[0] <= 'Z') && (path[1] == ':'); - - if(has_drive_prefix) { - resolved.drive_letter = path[0]; - resolved.real_path = path + 2; - } - else { - resolved.drive_letter = LV_FS_DEFAULT_DRIVE_LETTER; - resolved.real_path = path; - } -# else /*Lean rules for backward compatibility*/ - resolved.drive_letter = path[0]; - - if(*path != '\0') { - path++; /*Ignore the driver letter*/ - if(*path == ':') path++; - } - - resolved.real_path = path; -#endif - - return resolved; -} - -static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br) -{ - lv_fs_res_t res = LV_FS_RES_OK; - uint32_t file_position = file_p->cache->file_position; - uint32_t start = file_p->cache->start; - uint32_t end = file_p->cache->end; - char * buffer = file_p->cache->buffer; - uint32_t buffer_size = file_p->drv->cache_size; - - if(start <= file_position && file_position <= end) { - /* Data can be read from cache buffer */ - uint32_t buffer_remaining_length = (uint32_t)end - file_position + 1; - uint32_t buffer_offset = (end - start) - buffer_remaining_length + 1; - - /* Do not allow reading beyond the actual memory block for memory-mapped files */ - if(file_p->drv->cache_size == LV_FS_CACHE_FROM_BUFFER) { - if(btr > buffer_remaining_length) - btr = buffer_remaining_length - 1; - } - - if(btr <= buffer_remaining_length) { - /*Data is in cache buffer, and buffer end not reached, no need to read from FS*/ - lv_memcpy(buf, buffer + buffer_offset, btr); - *br = btr; - } - else { - /*First part of data is in cache buffer, but we need to read rest of data from FS*/ - lv_memcpy(buf, buffer + buffer_offset, buffer_remaining_length); - - file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->end + 1, - LV_FS_SEEK_SET); - - uint32_t bytes_read_to_buffer = 0; - if(btr - buffer_remaining_length > buffer_size) { - /*If remaining data chuck is bigger than buffer size, then do not use cache, instead read it directly from FS*/ - res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (char *)buf + buffer_remaining_length, - btr - buffer_remaining_length, &bytes_read_to_buffer); - } - else { - /*If remaining data chunk is smaller than buffer size, then read into cache buffer*/ - res = file_p->drv->read_cb(file_p->drv, file_p->file_d, buffer, buffer_size, &bytes_read_to_buffer); - file_p->cache->start = file_p->cache->end + 1; - file_p->cache->end = file_p->cache->start + bytes_read_to_buffer - 1; - - uint16_t data_chunk_remaining = LV_MIN(btr - buffer_remaining_length, bytes_read_to_buffer); - lv_memcpy((char *)buf + buffer_remaining_length, buffer, data_chunk_remaining); - } - *br = LV_MIN(buffer_remaining_length + bytes_read_to_buffer, btr); - } - } - else { - file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position, - LV_FS_SEEK_SET); - - /*Data is not in cache buffer*/ - if(btr > buffer_size) { - /*If bigger data is requested, then do not use cache, instead read it directly*/ - res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buf, btr, br); - } - else { - /*If small data is requested, then read from FS into cache buffer*/ - if(buffer == NULL) { - file_p->cache->buffer = lv_malloc(buffer_size); - LV_ASSERT_MALLOC(file_p->cache->buffer); - buffer = file_p->cache->buffer; - } - - uint32_t bytes_read_to_buffer = 0; - res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buffer, buffer_size, &bytes_read_to_buffer); - file_p->cache->start = file_position; - file_p->cache->end = file_p->cache->start + bytes_read_to_buffer - 1; - - *br = LV_MIN(btr, bytes_read_to_buffer); - lv_memcpy(buf, buffer, *br); - - } - } - - if(res == LV_FS_RES_OK) { - file_p->cache->file_position += *br; - } - - return res; -} - -static lv_fs_res_t lv_fs_write_cached(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw) -{ - lv_fs_res_t res = LV_FS_RES_OK; - - /*Need to do FS seek before writing data to FS*/ - res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position, LV_FS_SEEK_SET); - if(res != LV_FS_RES_OK) return res; - - res = file_p->drv->write_cb(file_p->drv, file_p->file_d, buf, btw, bw); - if(res != LV_FS_RES_OK) return res; - - if(file_p->cache->end >= file_p->cache->start) { - uint32_t start_position = file_p->cache->file_position; - uint32_t end_position = file_p->cache->file_position + *bw - 1; - char * cache_buffer = file_p->cache->buffer; - const char * write_buffer = buf; - - if(start_position <= file_p->cache->start && end_position >= file_p->cache->end) { - lv_memcpy(cache_buffer, - write_buffer + (file_p->cache->start - start_position), - file_p->cache->end + 1 - file_p->cache->start); - } - else if(start_position >= file_p->cache->start && end_position <= file_p->cache->end) { - lv_memcpy(cache_buffer + (start_position - file_p->cache->start), - write_buffer, - end_position + 1 - start_position); - } - else if(end_position >= file_p->cache->start && end_position <= file_p->cache->end) { - lv_memcpy(cache_buffer, - write_buffer + (file_p->cache->start - start_position), - end_position + 1 - file_p->cache->start); - } - else if(start_position >= file_p->cache->start && start_position <= file_p->cache->end) { - lv_memcpy(cache_buffer + (start_position - file_p->cache->start), - write_buffer, - file_p->cache->end + 1 - start_position); - } - } - - file_p->cache->file_position += *bw; - - return res; -} - -static lv_fs_res_t lv_fs_seek_cached(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whence) -{ - lv_fs_res_t res = LV_FS_RES_OK; - switch(whence) { - case LV_FS_SEEK_SET: { - file_p->cache->file_position = pos; - break; - } - case LV_FS_SEEK_CUR: { - file_p->cache->file_position += pos; - break; - } - case LV_FS_SEEK_END: { - /*Because we don't know the file size, we do a little trick: do a FS seek, then get the new file position from FS*/ - res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, pos, whence); - if(res == LV_FS_RES_OK) { - uint32_t tmp_position; - res = file_p->drv->tell_cb(file_p->drv, file_p->file_d, &tmp_position); - - if(res == LV_FS_RES_OK) { - file_p->cache->file_position = tmp_position; - } - } - break; - } - } - - return res; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_fs.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_fs.h deleted file mode 100644 index c6f938b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_fs.h +++ /dev/null @@ -1,258 +0,0 @@ -/** - * @file lv_fs.h - * - */ - -#ifndef LV_FS_H -#define LV_FS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ -#define LV_FS_MAX_FN_LENGTH 64 -#define LV_FS_MAX_PATH_LENGTH 256 - -#define LV_FS_CACHE_FROM_BUFFER UINT32_MAX - -/********************** - * TYPEDEFS - **********************/ - -/** - * Errors in the file system module. - */ -typedef enum { - LV_FS_RES_OK = 0, - LV_FS_RES_HW_ERR, /*Low level hardware error*/ - LV_FS_RES_FS_ERR, /*Error in the file system structure*/ - LV_FS_RES_NOT_EX, /*Driver, file or directory is not exists*/ - LV_FS_RES_FULL, /*Disk full*/ - LV_FS_RES_LOCKED, /*The file is already opened*/ - LV_FS_RES_DENIED, /*Access denied. Check 'fs_open' modes and write protect*/ - LV_FS_RES_BUSY, /*The file system now can't handle it, try later*/ - LV_FS_RES_TOUT, /*Process time outed*/ - LV_FS_RES_NOT_IMP, /*Requested function is not implemented*/ - LV_FS_RES_OUT_OF_MEM, /*Not enough memory for an internal operation*/ - LV_FS_RES_INV_PARAM, /*Invalid parameter among arguments*/ - LV_FS_RES_UNKNOWN, /*Other unknown error*/ -} lv_fs_res_t; - -/** - * File open mode. - */ -typedef enum { - LV_FS_MODE_WR = 0x01, - LV_FS_MODE_RD = 0x02, -} lv_fs_mode_t; - -/** - * Seek modes. - */ -typedef enum { - LV_FS_SEEK_SET = 0x00, /**< Set the position from absolutely (from the start of file)*/ - LV_FS_SEEK_CUR = 0x01, /**< Set the position from the current position*/ - LV_FS_SEEK_END = 0x02, /**< Set the position from the end of the file*/ -} lv_fs_whence_t; - -struct lv_fs_drv_t; -typedef struct lv_fs_drv_t lv_fs_drv_t; -struct lv_fs_drv_t { - char letter; - uint32_t cache_size; - bool (*ready_cb)(lv_fs_drv_t * drv); - - void * (*open_cb)(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); - lv_fs_res_t (*close_cb)(lv_fs_drv_t * drv, void * file_p); - lv_fs_res_t (*read_cb)(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); - lv_fs_res_t (*write_cb)(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); - lv_fs_res_t (*seek_cb)(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); - lv_fs_res_t (*tell_cb)(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); - - void * (*dir_open_cb)(lv_fs_drv_t * drv, const char * path); - lv_fs_res_t (*dir_read_cb)(lv_fs_drv_t * drv, void * rddir_p, char * fn, uint32_t fn_len); - lv_fs_res_t (*dir_close_cb)(lv_fs_drv_t * drv, void * rddir_p); - - void * user_data; /**< Custom file user data*/ -}; - -typedef struct { - void * file_d; - lv_fs_drv_t * drv; - lv_fs_file_cache_t * cache; -} lv_fs_file_t; - - -typedef struct { - void * dir_d; - lv_fs_drv_t * drv; -} lv_fs_dir_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize a file system driver with default values. - * It is used to ensure all fields have known values and not memory junk. - * After it you can set the fields. - * @param drv pointer to driver variable to initialize - */ -void lv_fs_drv_init(lv_fs_drv_t * drv); - -/** - * Add a new drive - * @param drv pointer to an lv_fs_drv_t structure which is inited with the - * corresponding function pointers. Only pointer is saved, so the - * driver should be static or dynamically allocated. - */ -void lv_fs_drv_register(lv_fs_drv_t * drv); - -/** - * Give a pointer to a driver from its letter - * @param letter the driver letter - * @return pointer to a driver or NULL if not found - */ -lv_fs_drv_t * lv_fs_get_drv(char letter); - -/** - * Test if a drive is ready or not. If the `ready` function was not initialized `true` will be - * returned. - * @param letter letter of the drive - * @return true: drive is ready; false: drive is not ready - */ -bool lv_fs_is_ready(char letter); - -/** - * Open a file - * @param file_p pointer to a lv_fs_file_t variable - * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) - * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode); - -/** - * Make a path object for the memory-mapped file compatible with the file system interface - * @param path path to a lv_fs_path_ex object - * @param letter the letter of the driver. E.g. `LV_FS_MEMFS_LETTER` - * @param buf address of the memory buffer - * @param size size of the memory buffer in bytes - */ -void lv_fs_make_path_from_buffer(lv_fs_path_ex_t * path, char letter, const void * buf, uint32_t size); - -/** - * Close an already opened file - * @param file_p pointer to a lv_fs_file_t variable - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_close(lv_fs_file_t * file_p); - -/** - * Read from a file - * @param file_p pointer to a lv_fs_file_t variable - * @param buf pointer to a buffer where the read bytes are stored - * @param btr Bytes To Read - * @param br the number of real read bytes (Bytes Read). NULL if unused. - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_read(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br); - -/** - * Write into a file - * @param file_p pointer to a lv_fs_file_t variable - * @param buf pointer to a buffer with the bytes to write - * @param btw Bytes To Write - * @param bw the number of real written bytes (Bytes Written). NULL if unused. - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_write(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw); - -/** - * Set the position of the 'cursor' (read write pointer) in a file - * @param file_p pointer to a lv_fs_file_t variable - * @param pos the new position expressed in bytes index (0: start of file) - * @param whence tells from where to set position. See lv_fs_whence_t - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_seek(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whence); - -/** - * Give the position of the read write pointer - * @param file_p pointer to a lv_fs_file_t variable - * @param pos pointer to store the position of the read write pointer - * @return LV_FS_RES_OK or any error from 'fs_res_t' - */ -lv_fs_res_t lv_fs_tell(lv_fs_file_t * file_p, uint32_t * pos); - -/** - * Initialize a 'fs_dir_t' variable for directory reading - * @param rddir_p pointer to a 'lv_fs_dir_t' variable - * @param path path to a directory - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path); - -/** - * Read the next filename form a directory. - * The name of the directories will begin with '/' - * @param rddir_p pointer to an initialized 'fs_dir_t' variable - * @param fn pointer to a buffer to store the filename - * @param fn_len length of the buffer to store the filename - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn, uint32_t fn_len); - -/** - * Close the directory reading - * @param rddir_p pointer to an initialized 'fs_dir_t' variable - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_dir_close(lv_fs_dir_t * rddir_p); - -/** - * Fill a buffer with the letters of existing drivers - * @param buf buffer to store the letters ('\0' added after the last letter) - * @return the buffer - */ -char * lv_fs_get_letters(char * buf); - -/** - * Return with the extension of the filename - * @param fn string with a filename - * @return pointer to the beginning extension or empty string if no extension - */ -const char * lv_fs_get_ext(const char * fn); - -/** - * Step up one level - * @param path pointer to a file name - * @return the truncated file name - */ -char * lv_fs_up(char * path); - -/** - * Get the last element of a path (e.g. U:/folder/file -> file) - * @param path pointer to a file name - * @return pointer to the beginning of the last element in the path - */ -const char * lv_fs_get_last(const char * path); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_FS_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_fs_private.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_fs_private.h deleted file mode 100644 index f8bb4bb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_fs_private.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @file lv_fs_private.h - * - */ - -#ifndef LV_FS_PRIVATE_H -#define LV_FS_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_fs.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_fs_file_cache_t { - uint32_t start; - uint32_t end; - uint32_t file_position; - void * buffer; -}; - -/** Extended path object to specify buffer for memory-mapped files */ -struct lv_fs_path_ex_t { - char path[4]; /**< This is needed to make it compatible with a normal path */ - const void * buffer; - uint32_t size; -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the File system interface - */ -void lv_fs_init(void); - -/** - * Deinitialize the File system interface - */ -void lv_fs_deinit(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_FS_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_ll.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_ll.c deleted file mode 100644 index ca1339e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_ll.c +++ /dev/null @@ -1,339 +0,0 @@ -/** - * @file lv_ll.c - * Handle linked lists. - * The nodes are dynamically allocated by the 'lv_mem' module, - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_ll.h" -#include "../stdlib/lv_mem.h" - -/********************* - * DEFINES - *********************/ -#define LL_NODE_META_SIZE (sizeof(lv_ll_node_t *) + sizeof(lv_ll_node_t *)) -#define LL_PREV_P_OFFSET(ll_p) (ll_p->n_size) -#define LL_NEXT_P_OFFSET(ll_p) (ll_p->n_size + sizeof(lv_ll_node_t *)) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void node_set_prev(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * prev); -static void node_set_next(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * next); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_ll_init(lv_ll_t * ll_p, uint32_t node_size) -{ - ll_p->head = NULL; - ll_p->tail = NULL; -#ifdef LV_ARCH_64 - /*Round the size up to 8*/ - node_size = (node_size + 7) & (~0x7); -#else - /*Round the size up to 4*/ - node_size = (node_size + 3) & (~0x3); -#endif - - ll_p->n_size = node_size; -} - -void * lv_ll_ins_head(lv_ll_t * ll_p) -{ - lv_ll_node_t * n_new; - - n_new = lv_malloc(ll_p->n_size + LL_NODE_META_SIZE); - - if(n_new != NULL) { - node_set_prev(ll_p, n_new, NULL); /*No prev. before the new head*/ - node_set_next(ll_p, n_new, ll_p->head); /*After new comes the old head*/ - - if(ll_p->head != NULL) { /*If there is old head then before it goes the new*/ - node_set_prev(ll_p, ll_p->head, n_new); - } - - ll_p->head = n_new; /*Set the new head in the dsc.*/ - if(ll_p->tail == NULL) { /*If there is no tail (1. node) set the tail too*/ - ll_p->tail = n_new; - } - } - - return n_new; -} - -void * lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act) -{ - lv_ll_node_t * n_new; - - if(NULL == ll_p || NULL == n_act) return NULL; - - if(lv_ll_get_head(ll_p) == n_act) { - n_new = lv_ll_ins_head(ll_p); - if(n_new == NULL) return NULL; - } - else { - n_new = lv_malloc(ll_p->n_size + LL_NODE_META_SIZE); - if(n_new == NULL) return NULL; - - lv_ll_node_t * n_prev; - n_prev = lv_ll_get_prev(ll_p, n_act); - node_set_next(ll_p, n_prev, n_new); - node_set_prev(ll_p, n_new, n_prev); - node_set_prev(ll_p, n_act, n_new); - node_set_next(ll_p, n_new, n_act); - } - - return n_new; -} - -void * lv_ll_ins_tail(lv_ll_t * ll_p) -{ - lv_ll_node_t * n_new; - - n_new = lv_malloc(ll_p->n_size + LL_NODE_META_SIZE); - - if(n_new != NULL) { - node_set_next(ll_p, n_new, NULL); /*No next after the new tail*/ - node_set_prev(ll_p, n_new, ll_p->tail); /*The prev. before new is the old tail*/ - if(ll_p->tail != NULL) { /*If there is old tail then the new comes after it*/ - node_set_next(ll_p, ll_p->tail, n_new); - } - - ll_p->tail = n_new; /*Set the new tail in the dsc.*/ - if(ll_p->head == NULL) { /*If there is no head (1. node) set the head too*/ - ll_p->head = n_new; - } - } - - return n_new; -} - -void lv_ll_remove(lv_ll_t * ll_p, void * node_p) -{ - if(ll_p == NULL) return; - - if(lv_ll_get_head(ll_p) == node_p) { - /*The new head will be the node after 'n_act'*/ - ll_p->head = lv_ll_get_next(ll_p, node_p); - if(ll_p->head == NULL) { - ll_p->tail = NULL; - } - else { - node_set_prev(ll_p, ll_p->head, NULL); - } - } - else if(lv_ll_get_tail(ll_p) == node_p) { - /*The new tail will be the node before 'n_act'*/ - ll_p->tail = lv_ll_get_prev(ll_p, node_p); - if(ll_p->tail == NULL) { - ll_p->head = NULL; - } - else { - node_set_next(ll_p, ll_p->tail, NULL); - } - } - else { - lv_ll_node_t * n_prev = lv_ll_get_prev(ll_p, node_p); - lv_ll_node_t * n_next = lv_ll_get_next(ll_p, node_p); - - node_set_next(ll_p, n_prev, n_next); - node_set_prev(ll_p, n_next, n_prev); - } -} - -void lv_ll_clear_custom(lv_ll_t * ll_p, void(*cleanup)(void *)) -{ - void * i; - void * i_next; - - i = lv_ll_get_head(ll_p); - i_next = NULL; - - while(i != NULL) { - i_next = lv_ll_get_next(ll_p, i); - if(cleanup == NULL) { - lv_ll_remove(ll_p, i); - lv_free(i); - } - else { - cleanup(i); - } - i = i_next; - } -} - -void lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head) -{ - lv_ll_remove(ll_ori_p, node); - - if(head) { - /*Set node as head*/ - node_set_prev(ll_new_p, node, NULL); - node_set_next(ll_new_p, node, ll_new_p->head); - - if(ll_new_p->head != NULL) { /*If there is old head then before it goes the new*/ - node_set_prev(ll_new_p, ll_new_p->head, node); - } - - ll_new_p->head = node; /*Set the new head in the dsc.*/ - if(ll_new_p->tail == NULL) { /*If there is no tail (first node) set the tail too*/ - ll_new_p->tail = node; - } - } - else { - /*Set node as tail*/ - node_set_prev(ll_new_p, node, ll_new_p->tail); - node_set_next(ll_new_p, node, NULL); - - if(ll_new_p->tail != NULL) { /*If there is old tail then after it goes the new*/ - node_set_next(ll_new_p, ll_new_p->tail, node); - } - - ll_new_p->tail = node; /*Set the new tail in the dsc.*/ - if(ll_new_p->head == NULL) { /*If there is no head (first node) set the head too*/ - ll_new_p->head = node; - } - } -} - -void * lv_ll_get_head(const lv_ll_t * ll_p) -{ - if(ll_p == NULL) return NULL; - return ll_p->head; -} - -void * lv_ll_get_tail(const lv_ll_t * ll_p) -{ - if(ll_p == NULL) return NULL; - return ll_p->tail; -} - -void * lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act) -{ - /*Pointer to the next node is stored in the end of this node. - *Go there and return the address found there*/ - const lv_ll_node_t * n_act_d = n_act; - n_act_d += LL_NEXT_P_OFFSET(ll_p); - return *((lv_ll_node_t **)n_act_d); -} - -void * lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act) -{ - /*Pointer to the prev. node is stored in the end of this node. - *Go there and return the address found there*/ - const lv_ll_node_t * n_act_d = n_act; - n_act_d += LL_PREV_P_OFFSET(ll_p); - return *((lv_ll_node_t **)n_act_d); -} - -uint32_t lv_ll_get_len(const lv_ll_t * ll_p) -{ - uint32_t len = 0; - void * node; - - for(node = lv_ll_get_head(ll_p); node != NULL; node = lv_ll_get_next(ll_p, node)) { - len++; - } - - return len; -} - -void lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after) -{ - if(n_act == n_after) return; /*Can't move before itself*/ - - void * n_before; - if(n_after != NULL) - n_before = lv_ll_get_prev(ll_p, n_after); - else - n_before = lv_ll_get_tail(ll_p); /*if `n_after` is NULL `n_act` should be the new tail*/ - - if(n_act == n_before) return; /*Already before `n_after`*/ - - /*It's much easier to remove from the list and add again*/ - lv_ll_remove(ll_p, n_act); - - /*Add again by setting the prev. and next nodes*/ - node_set_next(ll_p, n_before, n_act); - node_set_prev(ll_p, n_act, n_before); - node_set_prev(ll_p, n_after, n_act); - node_set_next(ll_p, n_act, n_after); - - /*If `n_act` was moved before NULL then it become the new tail*/ - if(n_after == NULL) ll_p->tail = n_act; - - /*If `n_act` was moved before `NULL` then it's the new head*/ - if(n_before == NULL) ll_p->head = n_act; -} - -bool lv_ll_is_empty(lv_ll_t * ll_p) -{ - if(ll_p == NULL) return true; - - if(ll_p->head == NULL && ll_p->tail == NULL) return true; - - return false; -} - -void lv_ll_clear(lv_ll_t * ll_p) -{ - lv_ll_clear_custom(ll_p, NULL); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Set the previous node pointer of a node - * @param ll_p pointer to linked list - * @param act pointer to a node which prev. node pointer should be set - * @param prev pointer to a node which should be the previous node before 'act' - */ -static void node_set_prev(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * prev) -{ - if(act == NULL) return; /*Can't set the prev node of `NULL`*/ - - uint8_t * act8 = (uint8_t *)act; - - act8 += LL_PREV_P_OFFSET(ll_p); - - lv_ll_node_t ** act_node_p = (lv_ll_node_t **) act8; - lv_ll_node_t ** prev_node_p = (lv_ll_node_t **) &prev; - - *act_node_p = *prev_node_p; -} - -/** - * Set the 'next node pointer' of a node - * @param ll_p pointer to linked list - * @param act pointer to a node which next node pointer should be set - * @param next pointer to a node which should be the next node before 'act' - */ -static void node_set_next(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * next) -{ - if(act == NULL) return; /*Can't set the next node of `NULL`*/ - uint8_t * act8 = (uint8_t *)act; - - act8 += LL_NEXT_P_OFFSET(ll_p); - lv_ll_node_t ** act_node_p = (lv_ll_node_t **) act8; - lv_ll_node_t ** next_node_p = (lv_ll_node_t **) &next; - - *act_node_p = *next_node_p; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_ll.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_ll.h deleted file mode 100644 index ee0836e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_ll.h +++ /dev/null @@ -1,169 +0,0 @@ -/** - * @file lv_ll.h - * Handle linked lists. The nodes are dynamically allocated by the 'lv_mem' module. - */ - -#ifndef LV_LL_H -#define LV_LL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Dummy type to make handling easier*/ -typedef uint8_t lv_ll_node_t; - -/** Description of a linked list*/ -typedef struct { - uint32_t n_size; - lv_ll_node_t * head; - lv_ll_node_t * tail; -} lv_ll_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize linked list - * @param ll_p pointer to lv_ll_t variable - * @param node_size the size of 1 node in bytes - */ -void lv_ll_init(lv_ll_t * ll_p, uint32_t node_size); - -/** - * Add a new head to a linked list - * @param ll_p pointer to linked list - * @return pointer to the new head - */ -void * lv_ll_ins_head(lv_ll_t * ll_p); - -/** - * Insert a new node in front of the n_act node - * @param ll_p pointer to linked list - * @param n_act pointer a node - * @return pointer to the new node - */ -void * lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act); - -/** - * Add a new tail to a linked list - * @param ll_p pointer to linked list - * @return pointer to the new tail - */ -void * lv_ll_ins_tail(lv_ll_t * ll_p); - -/** - * Remove the node 'node_p' from 'll_p' linked list. - * It does not free the memory of node. - * @param ll_p pointer to the linked list of 'node_p' - * @param node_p pointer to node in 'll_p' linked list - */ -void lv_ll_remove(lv_ll_t * ll_p, void * node_p); - -void lv_ll_clear_custom(lv_ll_t * ll_p, void(*cleanup)(void *)); - -/** - * Remove and free all elements from a linked list. The list remain valid but become empty. - * @param ll_p pointer to linked list - */ -void lv_ll_clear(lv_ll_t * ll_p); - -/** - * Move a node to a new linked list - * @param ll_ori_p pointer to the original (old) linked list - * @param ll_new_p pointer to the new linked list - * @param node pointer to a node - * @param head true: be the head in the new list - * false be the tail in the new list - */ -void lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head); - -/** - * Return with head node of the linked list - * @param ll_p pointer to linked list - * @return pointer to the head of 'll_p' - */ -void * lv_ll_get_head(const lv_ll_t * ll_p); - -/** - * Return with tail node of the linked list - * @param ll_p pointer to linked list - * @return pointer to the tail of 'll_p' - */ -void * lv_ll_get_tail(const lv_ll_t * ll_p); - -/** - * Return with the pointer of the next node after 'n_act' - * @param ll_p pointer to linked list - * @param n_act pointer a node - * @return pointer to the next node - */ -void * lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act); - -/** - * Return with the pointer of the previous node after 'n_act' - * @param ll_p pointer to linked list - * @param n_act pointer a node - * @return pointer to the previous node - */ -void * lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act); - -/** - * Return the length of the linked list. - * @param ll_p pointer to linked list - * @return length of the linked list - */ -uint32_t lv_ll_get_len(const lv_ll_t * ll_p); - -/* - * TODO - * @param ll_p - * @param n1_p - * @param n2_p -void lv_ll_swap(lv_ll_t * ll_p, void * n1_p, void * n2_p); - */ - -/** - * Move a node before another node in the same linked list - * - * @param ll_p pointer to a linked list - * @param n_act pointer to node to move - * @param n_after pointer to a node which should be after `n_act` - */ -void lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after); - -/** - * Check if a linked list is empty - * @param ll_p pointer to a linked list - * @return true: the linked list is empty; false: not empty - */ -bool lv_ll_is_empty(lv_ll_t * ll_p); - -/********************** - * MACROS - **********************/ - -#define LV_LL_READ(list, i) for(i = lv_ll_get_head(list); i != NULL; i = lv_ll_get_next(list, i)) - -#define LV_LL_READ_BACK(list, i) for(i = lv_ll_get_tail(list); i != NULL; i = lv_ll_get_prev(list, i)) - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_log.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_log.c deleted file mode 100644 index 3f3caec..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_log.c +++ /dev/null @@ -1,146 +0,0 @@ -/** - * @file lv_log.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_log.h" -#if LV_USE_LOG - -#include "../misc/lv_types.h" -#include "../stdlib/lv_sprintf.h" -#include "../stdlib/lv_mem.h" -#include "../stdlib/lv_string.h" -#include "../tick/lv_tick.h" -#include "../core/lv_global.h" - -#if LV_LOG_PRINTF - #include -#endif - -/********************* - * DEFINES - *********************/ -#if LV_LOG_USE_TIMESTAMP - #define last_log_time LV_GLOBAL_DEFAULT()->log_last_log_time -#endif -#define custom_print_cb LV_GLOBAL_DEFAULT()->custom_log_print_cb - -#if LV_LOG_USE_TIMESTAMP - #define LOG_TIMESTAMP_FMT "\t(%" LV_PRIu32 ".%03" LV_PRIu32 ", +%" LV_PRIu32 ")\t" - #define LOG_TIMESTAMP_EXPR t / 1000, t % 1000, t - last_log_time, -#else - #define LOG_TIMESTAMP_FMT - #define LOG_TIMESTAMP_EXPR -#endif - -#if LV_LOG_USE_FILE_LINE - #define LOG_FILE_LINE_FMT " %s:%d" - #define LOG_FILE_LINE_EXPR , &file[p], line -#else - #define LOG_FILE_LINE_FMT - #define LOG_FILE_LINE_EXPR -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb) -{ - custom_print_cb = print_cb; -} - -void lv_log_add(lv_log_level_t level, const char * file, int line, const char * func, const char * format, ...) -{ - if(level >= LV_LOG_LEVEL_NUM) return; /*Invalid level*/ - - if(level >= LV_LOG_LEVEL) { - va_list args; - va_start(args, format); - -#if LV_LOG_USE_FILE_LINE - /*Use only the file name not the path*/ - size_t p; - for(p = lv_strlen(file); p > 0; p--) { - if(file[p] == '/' || file[p] == '\\') { - p++; /*Skip the slash*/ - break; - } - } -#else - LV_UNUSED(file); - LV_UNUSED(line); -#endif - -#if LV_LOG_USE_TIMESTAMP - uint32_t t = lv_tick_get(); -#endif - static const char * lvl_prefix[] = {"Trace", "Info", "Warn", "Error", "User"}; - -#if LV_LOG_PRINTF - printf("[%s]" LOG_TIMESTAMP_FMT " %s: ", - lvl_prefix[level], LOG_TIMESTAMP_EXPR func); - vprintf(format, args); - printf(LOG_FILE_LINE_FMT "\n" LOG_FILE_LINE_EXPR); - fflush(stdout); -#endif - if(custom_print_cb) { - char buf[512]; - char msg[256]; - lv_vsnprintf(msg, sizeof(msg), format, args); - lv_snprintf(buf, sizeof(buf), "[%s]" LOG_TIMESTAMP_FMT " %s: %s" LOG_FILE_LINE_FMT "\n", - lvl_prefix[level], LOG_TIMESTAMP_EXPR func, msg LOG_FILE_LINE_EXPR); - custom_print_cb(level, buf); - } - -#if LV_LOG_USE_TIMESTAMP - last_log_time = t; -#endif - va_end(args); - } -} - -void lv_log(const char * format, ...) -{ - if(LV_LOG_LEVEL >= LV_LOG_LEVEL_NONE) return; /* disable log */ - - va_list args; - va_start(args, format); - -#if LV_LOG_PRINTF - vprintf(format, args); -#else - if(custom_print_cb) { - char buf[512]; - lv_vsnprintf(buf, sizeof(buf), format, args); - custom_print_cb(LV_LOG_LEVEL_USER, buf); - } -#endif - - va_end(args); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_LOG*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_log.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_log.h deleted file mode 100644 index 7774ba6..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_log.h +++ /dev/null @@ -1,162 +0,0 @@ -/** - * @file lv_log.h - * - */ - -#ifndef LV_LOG_H -#define LV_LOG_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" - -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ - -/*Possible log level. For compatibility declare it independently from `LV_USE_LOG`*/ - -#define LV_LOG_LEVEL_TRACE 0 /**< Log detailed information. */ -#define LV_LOG_LEVEL_INFO 1 /**< Log important events. */ -#define LV_LOG_LEVEL_WARN 2 /**< Log if something unwanted happened but didn't caused problem. */ -#define LV_LOG_LEVEL_ERROR 3 /**< Log only critical issues, when system may fail. */ -#define LV_LOG_LEVEL_USER 4 /**< Log only custom log messages added by the user. */ -#define LV_LOG_LEVEL_NONE 5 /**< Do not log anything. */ -#define LV_LOG_LEVEL_NUM 6 /**< Number of log levels */ - -LV_EXPORT_CONST_INT(LV_LOG_LEVEL_TRACE); -LV_EXPORT_CONST_INT(LV_LOG_LEVEL_INFO); -LV_EXPORT_CONST_INT(LV_LOG_LEVEL_WARN); -LV_EXPORT_CONST_INT(LV_LOG_LEVEL_ERROR); -LV_EXPORT_CONST_INT(LV_LOG_LEVEL_USER); -LV_EXPORT_CONST_INT(LV_LOG_LEVEL_NONE); - -typedef int8_t lv_log_level_t; - -#if LV_USE_LOG - -#if LV_LOG_USE_FILE_LINE -#define LV_LOG_FILE __FILE__ -#define LV_LOG_LINE __LINE__ -#else -#define LV_LOG_FILE NULL -#define LV_LOG_LINE 0 -#endif - -/********************** - * TYPEDEFS - **********************/ - -/** - * Log print function. Receives a string buffer to print". - */ -typedef void (*lv_log_print_g_cb_t)(lv_log_level_t level, const char * buf); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Register custom print/write function to call when a log is added. - * It can format its "File path", "Line number" and "Description" as required - * and send the formatted log message to a console or serial port. - * @param print_cb a function pointer to print a log - */ -void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb); - -/** - * Print a log message via `printf` if enabled with `LV_LOG_PRINTF` in `lv_conf.h` - * and/or a print callback if registered with `lv_log_register_print_cb` - * @param format printf-like format string - * @param ... parameters for `format` - */ -void lv_log(const char * format, ...) LV_FORMAT_ATTRIBUTE(1, 2); - -/** - * Add a log - * @param level the level of log. (From `lv_log_level_t` enum) - * @param file name of the file when the log added - * @param line line number in the source code where the log added - * @param func name of the function when the log added - * @param format printf-like format string - * @param ... parameters for `format` - */ -void lv_log_add(lv_log_level_t level, const char * file, int line, - const char * func, const char * format, ...) LV_FORMAT_ATTRIBUTE(5, 6); - -/********************** - * MACROS - **********************/ -#ifndef LV_LOG_TRACE -# if LV_LOG_LEVEL <= LV_LOG_LEVEL_TRACE -# define LV_LOG_TRACE(...) lv_log_add(LV_LOG_LEVEL_TRACE, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) -# else -# define LV_LOG_TRACE(...) do {}while(0) -# endif -#endif - -#ifndef LV_LOG_INFO -# if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO -# define LV_LOG_INFO(...) lv_log_add(LV_LOG_LEVEL_INFO, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) -# else -# define LV_LOG_INFO(...) do {}while(0) -# endif -#endif - -#ifndef LV_LOG_WARN -# if LV_LOG_LEVEL <= LV_LOG_LEVEL_WARN -# define LV_LOG_WARN(...) lv_log_add(LV_LOG_LEVEL_WARN, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) -# else -# define LV_LOG_WARN(...) do {}while(0) -# endif -#endif - -#ifndef LV_LOG_ERROR -# if LV_LOG_LEVEL <= LV_LOG_LEVEL_ERROR -# define LV_LOG_ERROR(...) lv_log_add(LV_LOG_LEVEL_ERROR, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) -# else -# define LV_LOG_ERROR(...) do {}while(0) -# endif -#endif - -#ifndef LV_LOG_USER -# if LV_LOG_LEVEL <= LV_LOG_LEVEL_USER -# define LV_LOG_USER(...) lv_log_add(LV_LOG_LEVEL_USER, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) -# else -# define LV_LOG_USER(...) do {}while(0) -# endif -#endif - -#ifndef LV_LOG -# if LV_LOG_LEVEL < LV_LOG_LEVEL_NONE -# define LV_LOG(...) lv_log(__VA_ARGS__) -# else -# define LV_LOG(...) do {} while(0) -# endif -#endif - -#else /*LV_USE_LOG*/ - -/*Do nothing if `LV_USE_LOG 0`*/ -#define lv_log_add(level, file, line, ...) -#define LV_LOG_TRACE(...) do {}while(0) -#define LV_LOG_INFO(...) do {}while(0) -#define LV_LOG_WARN(...) do {}while(0) -#define LV_LOG_ERROR(...) do {}while(0) -#define LV_LOG_USER(...) do {}while(0) -#define LV_LOG(...) do {}while(0) - -#endif /*LV_USE_LOG*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LOG_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_lru.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_lru.c deleted file mode 100644 index f8d4c06..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_lru.c +++ /dev/null @@ -1,344 +0,0 @@ -/** - * @file lv_lru.c - * - * @see https://github.com/willcannings/C-LRU-Cache - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_lru.h" -#include "lv_math.h" -#include "../stdlib/lv_mem.h" -#include "../stdlib/lv_string.h" -#include "lv_assert.h" -#include "lv_log.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_lru_item_t { - void * value; - void * key; - size_t value_length; - size_t key_length; - uint64_t access_count; - struct lv_lru_item_t * next; -}; - -/********************** - * STATIC PROTOTYPES - **********************/ - -/** - * MurmurHash2 - * @author Austin Appleby - * @see http://sites.google.com/site/murmurhash/ - */ -static uint32_t lv_lru_hash(lv_lru_t * cache, const void * key, uint32_t key_length); - -/** compare a key against an existing item's key */ -static int lv_lru_cmp_keys(lv_lru_item_t * item, const void * key, uint32_t key_length); - -/** remove an item and push it to the free items queue */ -static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_item_t * item, uint32_t hash_index); - -/** pop an existing item off the free queue, or create a new one */ -static lv_lru_item_t * lv_lru_pop_or_create_item(lv_lru_t * cache); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/* error helpers */ -#define error_for(conditions, error) if(conditions) {return error;} -#define test_for_missing_cache() error_for(!cache, LV_LRU_MISSING_CACHE) -#define test_for_missing_key() error_for(!key, LV_LRU_MISSING_KEY) -#define test_for_missing_value() error_for(!value || value_length == 0, LV_LRU_MISSING_VALUE) -#define test_for_value_too_large() error_for(value_length > cache->total_memory, LV_LRU_VALUE_TOO_LARGE) - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_lru_t * lv_lru_create(size_t cache_size, size_t average_length, lv_lru_free_cb_t value_free, - lv_lru_free_cb_t key_free) -{ - // create the cache - lv_lru_t * cache = lv_malloc_zeroed(sizeof(lv_lru_t)); - if(!cache) { - LV_LOG_WARN("LRU Cache unable to create cache object"); - return NULL; - } - cache->hash_table_size = cache_size / average_length; - cache->average_item_length = average_length; - cache->free_memory = cache_size; - cache->total_memory = cache_size; - cache->seed = lv_rand(1, UINT32_MAX); - cache->value_free = value_free ? value_free : lv_free; - cache->key_free = key_free ? key_free : lv_free; - - // size the hash table to a guestimate of the number of slots required (assuming a perfect hash) - cache->items = lv_malloc_zeroed(sizeof(lv_lru_item_t *) * cache->hash_table_size); - if(!cache->items) { - LV_LOG_WARN("LRU Cache unable to create cache hash table"); - lv_free(cache); - return NULL; - } - return cache; -} - -void lv_lru_delete(lv_lru_t * cache) -{ - LV_ASSERT_NULL(cache); - - // free each of the cached items, and the hash table - lv_lru_item_t * item = NULL, * next = NULL; - uint32_t i = 0; - if(cache->items) { - for(; i < cache->hash_table_size; i++) { - item = cache->items[i]; - while(item) { - next = (lv_lru_item_t *) item->next; - cache->value_free(item->value); - cache->key_free(item->key); - cache->free_memory += item->value_length; - lv_free(item); - item = next; - } - } - lv_free(cache->items); - } - - if(cache->free_items) { - item = cache->free_items; - while(item) { - next = (lv_lru_item_t *) item->next; - lv_free(item); - item = next; - } - } - - // free the cache - lv_free(cache); -} - -lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, void * value, size_t value_length) -{ - test_for_missing_cache(); - test_for_missing_key(); - test_for_missing_value(); - test_for_value_too_large(); - - // see if the key already exists - uint32_t hash_index = lv_lru_hash(cache, key, key_length); - int required = 0; - lv_lru_item_t * item = NULL, * prev = NULL; - item = cache->items[hash_index]; - - while(item && lv_lru_cmp_keys(item, key, key_length)) { - prev = item; - item = (lv_lru_item_t *) item->next; - } - - if(item) { - // update the value and value_lengths - required = (int)(value_length - item->value_length); - cache->value_free(item->value); - item->value = value; - item->value_length = value_length; - - } - else { - // insert a new item - item = lv_lru_pop_or_create_item(cache); - item->value = value; - item->key = lv_malloc(key_length); - lv_memcpy(item->key, key, key_length); - item->value_length = value_length; - item->key_length = key_length; - required = (int) value_length; - - if(prev) - prev->next = item; - else - cache->items[hash_index] = item; - } - item->access_count = ++cache->access_count; - - // remove as many items as necessary to free enough space - if(required > 0 && (size_t) required > cache->free_memory) { - while(cache->free_memory < (size_t) required) - lv_lru_remove_lru_item(cache); - } - cache->free_memory -= required; - return LV_LRU_OK; -} - -lv_lru_res_t lv_lru_get(lv_lru_t * cache, const void * key, size_t key_size, void ** value) -{ - test_for_missing_cache(); - test_for_missing_key(); - - // loop until we find the item, or hit the end of a chain - uint32_t hash_index = lv_lru_hash(cache, key, key_size); - lv_lru_item_t * item = cache->items[hash_index]; - - while(item && lv_lru_cmp_keys(item, key, key_size)) - item = (lv_lru_item_t *) item->next; - - if(item) { - *value = item->value; - item->access_count = ++cache->access_count; - } - else { - *value = NULL; - } - - return LV_LRU_OK; -} - -lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size) -{ - test_for_missing_cache(); - test_for_missing_key(); - - // loop until we find the item, or hit the end of a chain - lv_lru_item_t * item = NULL, * prev = NULL; - uint32_t hash_index = lv_lru_hash(cache, key, key_size); - item = cache->items[hash_index]; - - while(item && lv_lru_cmp_keys(item, key, key_size)) { - prev = item; - item = (lv_lru_item_t *) item->next; - } - - if(item) { - lv_lru_remove_item(cache, prev, item, hash_index); - } - - return LV_LRU_OK; -} - -void lv_lru_remove_lru_item(lv_lru_t * cache) -{ - lv_lru_item_t * min_item = NULL, * min_prev = NULL; - lv_lru_item_t * item = NULL, * prev = NULL; - uint32_t i = 0, min_index = -1; - uint64_t min_access_count = -1; - - for(; i < cache->hash_table_size; i++) { - item = cache->items[i]; - prev = NULL; - - while(item) { - if(item->access_count < min_access_count || (int64_t) min_access_count == -1) { - min_access_count = item->access_count; - min_item = item; - min_prev = prev; - min_index = i; - } - prev = item; - item = item->next; - } - } - - if(min_item) { - lv_lru_remove_item(cache, min_prev, min_item, min_index); - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static uint32_t lv_lru_hash(lv_lru_t * cache, const void * key, uint32_t key_length) -{ - uint32_t m = 0x5bd1e995; - uint32_t r = 24; - uint32_t h = cache->seed ^ key_length; - char * data = (char *) key; - - while(key_length >= 4) { - uint32_t k = *(uint32_t *) data; - k *= m; - k ^= k >> r; - k *= m; - h *= m; - h ^= k; - data += 4; - key_length -= 4; - } - - if(key_length >= 3) { - h ^= data[2] << 16; - } - if(key_length >= 2) { - h ^= data[1] << 8; - } - if(key_length >= 1) { - h ^= data[0]; - h *= m; - } - - h ^= h >> 13; - h *= m; - h ^= h >> 15; - return h % cache->hash_table_size; -} - -static int lv_lru_cmp_keys(lv_lru_item_t * item, const void * key, uint32_t key_length) -{ - if(key_length != item->key_length) { - return 1; - } - else { - return lv_memcmp(key, item->key, key_length); - } -} - -static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_item_t * item, uint32_t hash_index) -{ - if(prev) { - prev->next = item->next; - } - else { - cache->items[hash_index] = (lv_lru_item_t *) item->next; - } - - // free memory and update the free memory counter - cache->free_memory += item->value_length; - cache->value_free(item->value); - cache->key_free(item->key); - - // push the item to the free items queue - lv_memzero(item, sizeof(lv_lru_item_t)); - item->next = cache->free_items; - cache->free_items = item; -} - -static lv_lru_item_t * lv_lru_pop_or_create_item(lv_lru_t * cache) -{ - lv_lru_item_t * item = NULL; - - if(cache->free_items) { - item = cache->free_items; - cache->free_items = item->next; - lv_memzero(item, sizeof(lv_lru_item_t)); - } - else { - item = lv_malloc_zeroed(sizeof(lv_lru_item_t)); - } - - return item; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_lru.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_lru.h deleted file mode 100644 index 1bb2586..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_lru.h +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @file lv_lru.h - * - */ - -#ifndef LV_LRU_H -#define LV_LRU_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../lv_conf_internal.h" - -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - LV_LRU_OK = 0, - LV_LRU_MISSING_CACHE, - LV_LRU_MISSING_KEY, - LV_LRU_MISSING_VALUE, - LV_LRU_LOCK_ERROR, - LV_LRU_VALUE_TOO_LARGE -} lv_lru_res_t; - -typedef void (*lv_lru_free_cb_t)(void * v); - -typedef struct lv_lru_item_t lv_lru_item_t; - -typedef struct lv_lru_t { - lv_lru_item_t ** items; - uint64_t access_count; - size_t free_memory; - size_t total_memory; - size_t average_item_length; - size_t hash_table_size; - uint32_t seed; - lv_lru_free_cb_t value_free; - lv_lru_free_cb_t key_free; - lv_lru_item_t * free_items; -} lv_lru_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -lv_lru_t * lv_lru_create(size_t cache_size, size_t average_length, lv_lru_free_cb_t value_free, - lv_lru_free_cb_t key_free); - -void lv_lru_delete(lv_lru_t * cache); - -lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, void * value, size_t value_length); - -lv_lru_res_t lv_lru_get(lv_lru_t * cache, const void * key, size_t key_size, void ** value); - -lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size); - -/** - * remove the least recently used item - * - * @todo we can optimise this by finding the n lru items, where n = required_space / average_length - */ -void lv_lru_remove_lru_item(lv_lru_t * cache); -/********************** - * MACROS - **********************/ -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LRU_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_math.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_math.c deleted file mode 100644 index bd728fb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_math.c +++ /dev/null @@ -1,456 +0,0 @@ -/** - * @file lv_math.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_math.h" -#include "../core/lv_global.h" - -/********************* - * DEFINES - *********************/ -#define rand_seed LV_GLOBAL_DEFAULT()->math_rand_seed - -/********************** - * TYPEDEFS - **********************/ - -#define CUBIC_NEWTON_ITERATIONS 8 -#define CUBIC_PRECISION_BITS 10 /* 10 or 14 bits recommended, int64_t calculation is used for >14bit precision */ - -#if CUBIC_PRECISION_BITS < 10 || CUBIC_PRECISION_BITS > 20 - #error "cubic precision bits should be in range of [10, 20] for 32bit/64bit calculations." -#endif - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static const uint16_t sin0_90_table[] = { - 0, 572, 1144, 1715, 2286, 2856, 3425, 3993, 4560, 5126, 5690, 6252, 6813, 7371, 7927, 8481, - 9032, 9580, 10126, 10668, 11207, 11743, 12275, 12803, 13328, 13848, 14365, 14876, 15384, 15886, 16384, 16877, - 17364, 17847, 18324, 18795, 19261, 19720, 20174, 20622, 21063, 21498, 21926, 22348, 22763, 23170, 23571, 23965, - 24351, 24730, 25102, 25466, 25822, 26170, 26510, 26842, 27166, 27482, 27789, 28088, 28378, 28660, 28932, 29197, - 29452, 29698, 29935, 30163, 30382, 30592, 30792, 30983, 31164, 31336, 31499, 31651, 31795, 31928, 32052, 32166, - 32270, 32365, 32449, 32524, 32588, 32643, 32688, 32723, 32748, 32763, 32768 -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -int32_t LV_ATTRIBUTE_FAST_MEM lv_trigo_sin(int16_t angle) -{ - int32_t ret = 0; - while(angle < 0) angle += 360; - while(angle >= 360) angle -= 360; - - if(angle < 90) { - ret = sin0_90_table[angle]; - } - else if(angle >= 90 && angle < 180) { - angle = 180 - angle; - ret = sin0_90_table[angle]; - } - else if(angle >= 180 && angle < 270) { - angle = angle - 180; - ret = -sin0_90_table[angle]; - } - else { /*angle >=270*/ - angle = 360 - angle; - ret = -sin0_90_table[angle]; - } - - if(ret == 32767) return 32768; - else if(ret == -32767) return -32768; - else return ret; -} - -/** - * cubic-bezier Reference: - * - * https://github.com/gre/bezier-easing - * https://opensource.apple.com/source/WebCore/WebCore-955.66/platform/graphics/UnitBezier.h - * - * Copyright (c) 2014 Gaëtan Renaudeau - * - * 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. - * - */ - -static int32_t do_cubic_bezier(int32_t t, int32_t a, int32_t b, int32_t c) -{ - /*a * t^3 + b * t^2 + c * t*/ -#if CUBIC_PRECISION_BITS > 14 - int64_t ret; -#else - int32_t ret; -#endif - - ret = a; - ret = (ret * t) >> CUBIC_PRECISION_BITS; - ret = ((ret + b) * t) >> CUBIC_PRECISION_BITS; - ret = ((ret + c) * t) >> CUBIC_PRECISION_BITS; - return ret; -} - -int32_t lv_cubic_bezier(int32_t x, int32_t x1, int32_t y1, int32_t x2, int32_t y2) -{ - int32_t ax, bx, cx, ay, by, cy; - int32_t tl, tr, t; /*t in cubic-bezier function, used for bisection */ - int32_t xs; /*x sampled on curve */ -#if CUBIC_PRECISION_BITS > 14 - int64_t d; /*slope value at specified t*/ -#else - int32_t d; -#endif - - if(x == 0 || x == LV_BEZIER_VAL_MAX) return x; - - /* input is always LV_BEZIER_VAL_SHIFT bit precision */ - -#if CUBIC_PRECISION_BITS != LV_BEZIER_VAL_SHIFT - x <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; - x1 <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; - x2 <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; - y1 <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; - y2 <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; -#endif - - cx = 3 * x1; - bx = 3 * (x2 - x1) - cx; - ax = (1L << CUBIC_PRECISION_BITS) - cx - bx; - - cy = 3 * y1; - by = 3 * (y2 - y1) - cy; - ay = (1L << CUBIC_PRECISION_BITS) - cy - by; - - /*Try Newton's method firstly */ - t = x; /*Make a guess*/ - for(int i = 0; i < CUBIC_NEWTON_ITERATIONS; i++) { - /*Check if x on curve at t matches input x*/ - xs = do_cubic_bezier(t, ax, bx, cx) - x; - if(LV_ABS(xs) <= 1) goto found; - - /* get slop at t, d = 3 * ax * t^2 + 2 * bx + t + cx */ - d = ax; /* use 64bit operation if needed. */ - d = (3 * d * t) >> CUBIC_PRECISION_BITS; - d = ((d + 2 * bx) * t) >> CUBIC_PRECISION_BITS; - d += cx; - - if(LV_ABS(d) <= 1) break; - - d = ((int64_t)xs * (1L << CUBIC_PRECISION_BITS)) / d; - if(d == 0) break; /*Reached precision limits*/ - t -= d; - } - - /*Fallback to bisection method for reliability*/ - tl = 0, tr = 1L << CUBIC_PRECISION_BITS, t = x; - - if(t < tl) { - t = tl; - goto found; - } - - if(t > tr) { - t = tr; - goto found; - } - - while(tl < tr) { - xs = do_cubic_bezier(t, ax, bx, cx); - if(LV_ABS(xs - x) <= 1) goto found; - x > xs ? (tl = t) : (tr = t); - t = (tr - tl) / 2 + tl; - if(t == tl) break; - } - - /*Failed to find suitable t for given x, return a value anyway.*/ -found: - /*Return y at t*/ -#if CUBIC_PRECISION_BITS != LV_BEZIER_VAL_SHIFT - return do_cubic_bezier(t, ay, by, cy) >> (CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT); -#else - return do_cubic_bezier(t, ay, by, cy); -#endif -} - -void LV_ATTRIBUTE_FAST_MEM lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask) -{ - x = x << 8; /*To get 4 bit precision. (sqrt(256) = 16 = 4 bit)*/ - - uint32_t root = 0; - uint32_t trial; - /*http://ww1.microchip.com/...en/AppNotes/91040a.pdf*/ - do { - trial = root + mask; - if(trial * trial <= x) root = trial; - mask = mask >> 1; - } while(mask); - - q->i = root >> 4; - q->f = (root & 0xf) << 4; -} - -/* -// Alternative Integer Square Root function -// Contributors include Arne Steinarson for the basic approximation idea, -// Dann Corbit and Mathew Hendry for the first cut at the algorithm, -// Lawrence Kirby for the rearrangement, improvements and range optimization -// and Paul Hsieh for the round-then-adjust idea. -*/ -int32_t LV_ATTRIBUTE_FAST_MEM lv_sqrt32(uint32_t x) -{ - static const unsigned char sqq_table[] = { - 0, 16, 22, 27, 32, 35, 39, 42, 45, 48, 50, 53, 55, 57, - 59, 61, 64, 65, 67, 69, 71, 73, 75, 76, 78, 80, 81, 83, - 84, 86, 87, 89, 90, 91, 93, 94, 96, 97, 98, 99, 101, 102, - 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 128, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145, - 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 155, 156, 157, - 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, - 169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178, - 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, - 189, 189, 190, 191, 192, 192, 193, 193, 194, 195, 195, 196, 197, 197, - 198, 199, 199, 200, 201, 201, 202, 203, 203, 204, 204, 205, 206, 206, - 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 214, 214, 215, - 215, 216, 217, 217, 218, 218, 219, 219, 220, 221, 221, 222, 222, 223, - 224, 224, 225, 225, 226, 226, 227, 227, 228, 229, 229, 230, 230, 231, - 231, 232, 232, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, - 239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, - 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253, - 253, 254, 254, 255 - }; - - int32_t xn; - - if(x >= 0x10000) - if(x >= 0x1000000) - if(x >= 0x10000000) - if(x >= 0x40000000) { - if(x >= 65535UL * 65535UL) - return 65535; - xn = sqq_table[x >> 24] << 8; - } - else - xn = sqq_table[x >> 22] << 7; - else if(x >= 0x4000000) - xn = sqq_table[x >> 20] << 6; - else - xn = sqq_table[x >> 18] << 5; - else { - if(x >= 0x100000) - if(x >= 0x400000) - xn = sqq_table[x >> 16] << 4; - else - xn = sqq_table[x >> 14] << 3; - else if(x >= 0x40000) - xn = sqq_table[x >> 12] << 2; - else - xn = sqq_table[x >> 10] << 1; - - goto nr1; - } - else if(x >= 0x100) { - if(x >= 0x1000) - if(x >= 0x4000) - xn = (sqq_table[x >> 8] >> 0) + 1; - else - xn = (sqq_table[x >> 6] >> 1) + 1; - else if(x >= 0x400) - xn = (sqq_table[x >> 4] >> 2) + 1; - else - xn = (sqq_table[x >> 2] >> 3) + 1; - - goto adj; - } - else - return sqq_table[x] >> 4; - - /* Run two iterations of the standard convergence formula */ - - xn = (xn + 1 + x / xn) / 2; -nr1: - xn = (xn + 1 + x / xn) / 2; -adj: - - if(xn * xn > (int32_t)x) /* Correct rounding if necessary */ - xn--; - - return xn; -} - -uint16_t lv_atan2(int x, int y) -{ - /** - * Fast XY vector to integer degree algorithm - Jan 2011 www.RomanBlack.com - * Converts any XY values including 0 to a degree value that should be - * within +/- 1 degree of the accurate value without needing - * large slow trig functions like ArcTan() or ArcCos(). - * NOTE! at least one of the X or Y values must be non-zero! - * This is the full version, for all 4 quadrants and will generate - * the angle in integer degrees from 0-360. - * Any values of X and Y are usable including negative values provided - * they are between -1456 and 1456 so the 16bit multiply does not overflow. - */ - unsigned char negflag; - unsigned char tempdegree; - unsigned char comp; - unsigned int degree; /*this will hold the result*/ - unsigned int ux; - unsigned int uy; - - /*Save the sign flags then remove signs and get XY as unsigned ints*/ - negflag = 0; - if(x < 0) { - negflag += 0x01; /*x flag bit*/ - x = (0 - x); /*is now +*/ - } - ux = x; /*copy to unsigned var before multiply*/ - if(y < 0) { - negflag += 0x02; /*y flag bit*/ - y = (0 - y); /*is now +*/ - } - uy = y; /*copy to unsigned var before multiply*/ - - /*1. Calc the scaled "degrees"*/ - if(ux > uy) { - degree = (uy * 45) / ux; /*degree result will be 0-45 range*/ - negflag += 0x10; /*octant flag bit*/ - } - else { - degree = (ux * 45) / uy; /*degree result will be 0-45 range*/ - } - - /*2. Compensate for the 4 degree error curve*/ - comp = 0; - tempdegree = degree; /*use an unsigned char for speed!*/ - if(tempdegree > 22) { /*if top half of range*/ - if(tempdegree <= 44) comp++; - if(tempdegree <= 41) comp++; - if(tempdegree <= 37) comp++; - if(tempdegree <= 32) comp++; /*max is 4 degrees compensated*/ - } - else { /*else is lower half of range*/ - if(tempdegree >= 2) comp++; - if(tempdegree >= 6) comp++; - if(tempdegree >= 10) comp++; - if(tempdegree >= 15) comp++; /*max is 4 degrees compensated*/ - } - degree += comp; /*degree is now accurate to +/- 1 degree!*/ - - /*Invert degree if it was X>Y octant, makes 0-45 into 90-45*/ - if(negflag & 0x10) degree = (90 - degree); - - /*3. Degree is now 0-90 range for this quadrant,*/ - /*need to invert it for whichever quadrant it was in*/ - if(negflag & 0x02) { /*if -Y*/ - if(negflag & 0x01) /*if -Y -X*/ - degree = (180 + degree); - else /*else is -Y +X*/ - degree = (180 - degree); - } - else { /*else is +Y*/ - if(negflag & 0x01) /*if +Y -X*/ - degree = (360 - degree); - } - return degree; -} - -int64_t lv_pow(int64_t base, int8_t exp) -{ - int64_t result = 1; - while(exp) { - if(exp & 1) - result *= base; - exp >>= 1; - base *= base; - } - - return result; -} - -int32_t lv_map(int32_t x, int32_t min_in, int32_t max_in, int32_t min_out, int32_t max_out) -{ - if(max_in >= min_in && x >= max_in) return max_out; - if(max_in >= min_in && x <= min_in) return min_out; - - if(max_in <= min_in && x <= max_in) return max_out; - if(max_in <= min_in && x >= min_in) return min_out; - - /** - * The equation should be: - * ((x - min_in) * delta_out) / delta in) + min_out - * To avoid rounding error reorder the operations: - * (x - min_in) * (delta_out / delta_min) + min_out - */ - - int32_t delta_in = max_in - min_in; - int32_t delta_out = max_out - min_out; - - return ((x - min_in) * delta_out) / delta_in + min_out; -} - -void lv_rand_set_seed(uint32_t seed) -{ - rand_seed = seed; -} - -uint32_t lv_rand(uint32_t min, uint32_t max) -{ - /*Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs"*/ - uint32_t x = rand_seed; - x ^= x << 13; - x ^= x >> 17; - x ^= x << 5; - rand_seed = x; - - return (rand_seed % (max - min + 1)) + min; -} - -int32_t LV_ATTRIBUTE_FAST_MEM lv_trigo_cos(int16_t angle) -{ - return lv_trigo_sin(angle + 90); -} - -int32_t lv_bezier3(int32_t t, int32_t u0, uint32_t u1, int32_t u2, int32_t u3) -{ - LV_UNUSED(u0); - LV_UNUSED(u3); - return lv_cubic_bezier(t, 341, u1, 683, u2); -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_math.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_math.h deleted file mode 100644 index 05e159f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_math.h +++ /dev/null @@ -1,181 +0,0 @@ -/** - * @file lv_math.h - * - */ - -#ifndef LV_MATH_H -#define LV_MATH_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ -#define LV_TRIGO_SIN_MAX 32768 -#define LV_TRIGO_SHIFT 15 /**< >> LV_TRIGO_SHIFT to normalize*/ - -#define LV_BEZIER_VAL_SHIFT 10 /**< log2(LV_BEZIER_VAL_MAX): used to normalize up scaled values*/ -#define LV_BEZIER_VAL_MAX (1L << LV_BEZIER_VAL_SHIFT) /**< Max time in Bezier functions (not [0..1] to use integers)*/ -#define LV_BEZIER_VAL_FLOAT(f) ((int32_t)((f) * LV_BEZIER_VAL_MAX)) /**< Convert const float number cubic-bezier values to fix-point value*/ - -/** Align up value x to align, align must be a power of two */ -#define LV_ALIGN_UP(x, align) (((x) + ((align) - 1)) & ~((align) - 1)) - -/** Round up value x to round, round can be any integer number */ -#define LV_ROUND_UP(x, round) ((((x) + ((round) - 1)) / (round)) * (round)) - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - uint16_t i; - uint16_t f; -} lv_sqrt_res_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -//! @cond Doxygen_Suppress -/** - * Return with sinus of an angle - * @param angle - * @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767 - */ -int32_t /* LV_ATTRIBUTE_FAST_MEM */ lv_trigo_sin(int16_t angle); - -int32_t LV_ATTRIBUTE_FAST_MEM lv_trigo_cos(int16_t angle); - -//! @endcond - -/** - * Calculate the y value of cubic-bezier(x1, y1, x2, y2) function as specified x. - * @param x time in range of [0..LV_BEZIER_VAL_MAX] - * @param x1 x of control point 1 in range of [0..LV_BEZIER_VAL_MAX] - * @param y1 y of control point 1 in range of [0..LV_BEZIER_VAL_MAX] - * @param x2 x of control point 2 in range of [0..LV_BEZIER_VAL_MAX] - * @param y2 y of control point 2 in range of [0..LV_BEZIER_VAL_MAX] - * @return the value calculated - */ -int32_t lv_cubic_bezier(int32_t x, int32_t x1, int32_t y1, int32_t x2, int32_t y2); - -/** - * Calculate a value of a Cubic Bezier function. - * @param t time in range of [0..LV_BEZIER_VAL_MAX] - * @param u0 must be 0 - * @param u1 control value 1 values in range of [0..LV_BEZIER_VAL_MAX] - * @param u2 control value 2 in range of [0..LV_BEZIER_VAL_MAX] - * @param u3 must be LV_BEZIER_VAL_MAX - * @return the value calculated from the given parameters in range of [0..LV_BEZIER_VAL_MAX] - */ -int32_t lv_bezier3(int32_t t, int32_t u0, uint32_t u1, int32_t u2, int32_t u3); - - -/** - * Calculate the atan2 of a vector. - * @param x - * @param y - * @return the angle in degree calculated from the given parameters in range of [0..360] - */ -uint16_t lv_atan2(int x, int y); - -//! @cond Doxygen_Suppress - -/** - * Get the square root of a number - * @param x integer which square root should be calculated - * @param q store the result here. q->i: integer part, q->f: fractional part in 1/256 unit - * @param mask optional to skip some iterations if the magnitude of the root is known. - * Set to 0x8000 by default. - * If root < 16: mask = 0x80 - * If root < 256: mask = 0x800 - * Else: mask = 0x8000 - */ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask); - -//! @endcond - -/** - * Alternative (fast, approximate) implementation for getting the square root of an integer. - * @param x integer which square root should be calculated - */ -int32_t /* LV_ATTRIBUTE_FAST_MEM */ lv_sqrt32(uint32_t x); - -/** - * Calculate the square of an integer (input range is 0..32767). - * @param x input - * @return square - */ -static inline int32_t lv_sqr(int32_t x) -{ - return x * x; -} - -/** - * Calculate the integer exponents. - * @param base - * @param exp - * @return base raised to the power exponent - */ -int64_t lv_pow(int64_t base, int8_t exp); - -/** - * Get the mapped of a number given an input and output range - * @param x integer which mapped value should be calculated - * @param min_in min input range - * @param max_in max input range - * @param min_out max output range - * @param max_out max output range - * @return the mapped number - */ -int32_t lv_map(int32_t x, int32_t min_in, int32_t max_in, int32_t min_out, int32_t max_out); - -/** - * Set the seed of the pseudo random number generator - * @param seed a number to initialize the random generator - */ -void lv_rand_set_seed(uint32_t seed); - -/** - * Get a pseudo random number in the given range - * @param min the minimum value - * @param max the maximum value - * @return return the random number. min <= return_value <= max - */ -uint32_t lv_rand(uint32_t min, uint32_t max); - -/********************** - * MACROS - **********************/ -#define LV_MIN(a, b) ((a) < (b) ? (a) : (b)) -#define LV_MIN3(a, b, c) (LV_MIN(LV_MIN(a,b), c)) -#define LV_MIN4(a, b, c, d) (LV_MIN(LV_MIN(a,b), LV_MIN(c,d))) - -#define LV_MAX(a, b) ((a) > (b) ? (a) : (b)) -#define LV_MAX3(a, b, c) (LV_MAX(LV_MAX(a,b), c)) -#define LV_MAX4(a, b, c, d) (LV_MAX(LV_MAX(a,b), LV_MAX(c,d))) - -#define LV_CLAMP(min, val, max) (LV_MAX(min, (LV_MIN(val, max)))) - -#define LV_ABS(x) ((x) > 0 ? (x) : (-(x))) -#define LV_UDIV255(x) (((x) * 0x8081U) >> 0x17) - -#define LV_IS_SIGNED(t) (((t)(-1)) < ((t)0)) -#define LV_UMAX_OF(t) (((0x1ULL << ((sizeof(t) * 8ULL) - 1ULL)) - 1ULL) | (0xFULL << ((sizeof(t) * 8ULL) - 4ULL))) -#define LV_SMAX_OF(t) (((0x1ULL << ((sizeof(t) * 8ULL) - 1ULL)) - 1ULL) | (0x7ULL << ((sizeof(t) * 8ULL) - 4ULL))) -#define LV_MAX_OF(t) ((unsigned long)(LV_IS_SIGNED(t) ? LV_SMAX_OF(t) : LV_UMAX_OF(t))) - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_matrix.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_matrix.c deleted file mode 100644 index 4a6bb63..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_matrix.c +++ /dev/null @@ -1,225 +0,0 @@ -/** - * @file lv_matrix.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_matrix.h" - -#if LV_USE_MATRIX - -#include "../stdlib/lv_string.h" -#include "lv_math.h" -#include -/********************* - * DEFINES - *********************/ -#ifndef M_PI - #define M_PI 3.1415926f -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_matrix_identity(lv_matrix_t * matrix) -{ - matrix->m[0][0] = 1.0f; - matrix->m[0][1] = 0.0f; - matrix->m[0][2] = 0.0f; - matrix->m[1][0] = 0.0f; - matrix->m[1][1] = 1.0f; - matrix->m[1][2] = 0.0f; - matrix->m[2][0] = 0.0f; - matrix->m[2][1] = 0.0f; - matrix->m[2][2] = 1.0f; -} - -void lv_matrix_translate(lv_matrix_t * matrix, float dx, float dy) -{ - if(lv_matrix_is_identity_or_translation(matrix)) { - /*optimization for matrix translation.*/ - matrix->m[0][2] += dx; - matrix->m[1][2] += dy; - return; - } - - lv_matrix_t tlm = {{ - {1.0f, 0.0f, dx}, - {0.0f, 1.0f, dy}, - {0.0f, 0.0f, 1.0f}, - } - }; - - lv_matrix_multiply(matrix, &tlm); -} - -void lv_matrix_scale(lv_matrix_t * matrix, float scale_x, float scale_y) -{ - lv_matrix_t scm = {{ - {scale_x, 0.0f, 0.0f}, - {0.0f, scale_y, 0.0f}, - {0.0f, 0.0f, 1.0f}, - } - }; - - lv_matrix_multiply(matrix, &scm); -} - -void lv_matrix_rotate(lv_matrix_t * matrix, float degree) -{ - float radian = degree / 180.0f * (float)M_PI; - float cos_r = cosf(radian); - float sin_r = sinf(radian); - - lv_matrix_t rtm = {{ - {cos_r, -sin_r, 0.0f}, - {sin_r, cos_r, 0.0f}, - {0.0f, 0.0f, 1.0f}, - } - }; - - lv_matrix_multiply(matrix, &rtm); -} - -void lv_matrix_skew(lv_matrix_t * matrix, float skew_x, float skew_y) -{ - float rskew_x = skew_x / 180.0f * (float)M_PI; - float rskew_y = skew_y / 180.0f * (float)M_PI; - float tan_x = tanf(rskew_x); - float tan_y = tanf(rskew_y); - - lv_matrix_t skm = {{ - {1.0f, tan_x, 0.0f}, - {tan_y, 1.0f, 0.0f}, - {0.0f, 0.0f, 1.0f}, - } - }; - - lv_matrix_multiply(matrix, &skm); -} - -void lv_matrix_multiply(lv_matrix_t * matrix, const lv_matrix_t * mul) -{ - /*TODO: use NEON to optimize this function on ARM architecture.*/ - lv_matrix_t tmp; - - for(int y = 0; y < 3; y++) { - for(int x = 0; x < 3; x++) { - tmp.m[y][x] = (matrix->m[y][0] * mul->m[0][x]) - + (matrix->m[y][1] * mul->m[1][x]) - + (matrix->m[y][2] * mul->m[2][x]); - } - } - - lv_memcpy(matrix, &tmp, sizeof(lv_matrix_t)); -} - -bool lv_matrix_inverse(lv_matrix_t * matrix, const lv_matrix_t * m) -{ - float det00, det01, det02; - float d; - bool is_affine; - - /* Test for identity matrix. */ - if(m == NULL) { - lv_matrix_identity(matrix); - return true; - } - - det00 = (m->m[1][1] * m->m[2][2]) - (m->m[2][1] * m->m[1][2]); - det01 = (m->m[2][0] * m->m[1][2]) - (m->m[1][0] * m->m[2][2]); - det02 = (m->m[1][0] * m->m[2][1]) - (m->m[2][0] * m->m[1][1]); - - /* Compute determinant. */ - d = (m->m[0][0] * det00) + (m->m[0][1] * det01) + (m->m[0][2] * det02); - - /* Return 0 if there is no inverse matrix. */ - if(d == 0.0f) - return false; - - /* Compute reciprocal. */ - d = 1.0f / d; - - /* Determine if the matrix is affine. */ - is_affine = (m->m[2][0] == 0.0f) && (m->m[2][1] == 0.0f) && (m->m[2][2] == 1.0f); - - matrix->m[0][0] = d * det00; - matrix->m[0][1] = d * ((m->m[2][1] * m->m[0][2]) - (m->m[0][1] * m->m[2][2])); - matrix->m[0][2] = d * ((m->m[0][1] * m->m[1][2]) - (m->m[1][1] * m->m[0][2])); - matrix->m[1][0] = d * det01; - matrix->m[1][1] = d * ((m->m[0][0] * m->m[2][2]) - (m->m[2][0] * m->m[0][2])); - matrix->m[1][2] = d * ((m->m[1][0] * m->m[0][2]) - (m->m[0][0] * m->m[1][2])); - matrix->m[2][0] = is_affine ? 0.0f : d * det02; - matrix->m[2][1] = is_affine ? 0.0f : d * ((m->m[2][0] * m->m[0][1]) - (m->m[0][0] * m->m[2][1])); - matrix->m[2][2] = is_affine ? 1.0f : d * ((m->m[0][0] * m->m[1][1]) - (m->m[1][0] * m->m[0][1])); - - /* Success. */ - return true; -} - -lv_point_precise_t lv_matrix_transform_precise_point(const lv_matrix_t * matrix, const lv_point_precise_t * point) -{ - lv_point_precise_t p; - p.x = (lv_value_precise_t)roundf(point->x * matrix->m[0][0] + point->y * matrix->m[0][1] + matrix->m[0][2]); - p.y = (lv_value_precise_t)roundf(point->x * matrix->m[1][0] + point->y * matrix->m[1][1] + matrix->m[1][2]); - return p; -} - -lv_area_t lv_matrix_transform_area(const lv_matrix_t * matrix, const lv_area_t * area) -{ - lv_area_t res; - lv_point_precise_t p[4] = { - {area->x1, area->y1}, - {area->x1, area->y2}, - {area->x2, area->y1}, - {area->x2, area->y2}, - }; - p[0] = lv_matrix_transform_precise_point(matrix, &p[0]); - p[1] = lv_matrix_transform_precise_point(matrix, &p[1]); - p[2] = lv_matrix_transform_precise_point(matrix, &p[2]); - p[3] = lv_matrix_transform_precise_point(matrix, &p[3]); - - res.x1 = (int32_t)(LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x)); - res.x2 = (int32_t)(LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x)); - res.y1 = (int32_t)(LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y)); - res.y2 = (int32_t)(LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y)); - - return res; -} - -bool lv_matrix_is_identity_or_translation(const lv_matrix_t * matrix) -{ - return (matrix->m[0][0] == 1.0f && - matrix->m[0][1] == 0.0f && - matrix->m[1][0] == 0.0f && - matrix->m[1][1] == 1.0f && - matrix->m[2][0] == 0.0f && - matrix->m[2][1] == 0.0f && - matrix->m[2][2] == 1.0f); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_MATRIX*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_matrix.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_matrix.h deleted file mode 100644 index 9583fa9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_matrix.h +++ /dev/null @@ -1,129 +0,0 @@ -/** - * @file lv_matrix.h - * - */ - -#ifndef LV_MATRIX_H -#define LV_MATRIX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../lv_conf_internal.h" - -#if LV_USE_MATRIX - -#include "lv_types.h" -#include "lv_area.h" - -/********************* - * DEFINES - *********************/ - -#if !LV_USE_FLOAT -#error "LV_USE_FLOAT is required for lv_matrix" -#endif - -/********************** - * TYPEDEFS - **********************/ - -struct lv_matrix_t { - float m[3][3]; -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Set matrix to identity matrix - * @param matrix pointer to a matrix - */ -void lv_matrix_identity(lv_matrix_t * matrix); - -/** - * Translate the matrix to new position - * @param matrix pointer to a matrix - * @param tx the amount of translate in x direction - * @param tx the amount of translate in y direction - */ -void lv_matrix_translate(lv_matrix_t * matrix, float tx, float ty); - -/** - * Change the scale factor of the matrix - * @param matrix pointer to a matrix - * @param scale_x the scale factor for the X direction - * @param scale_y the scale factor for the Y direction - */ -void lv_matrix_scale(lv_matrix_t * matrix, float scale_x, float scale_y); - -/** - * Rotate the matrix with origin - * @param matrix pointer to a matrix - * @param degree angle to rotate - */ -void lv_matrix_rotate(lv_matrix_t * matrix, float degree); - -/** - * Change the skew factor of the matrix - * @param matrix pointer to a matrix - * @param skew_x the skew factor for x direction - * @param skew_y the skew factor for y direction - */ -void lv_matrix_skew(lv_matrix_t * matrix, float skew_x, float skew_y); - -/** - * Multiply two matrix and store the result to the first one - * @param matrix pointer to a matrix - * @param matrix2 pointer to another matrix - */ -void lv_matrix_multiply(lv_matrix_t * matrix, const lv_matrix_t * mul); - -/** - * Invert the matrix - * @param matrix pointer to a matrix - * @param m pointer to another matrix (optional) - * @return true: the matrix is invertible, false: the matrix is singular and cannot be inverted - */ -bool lv_matrix_inverse(lv_matrix_t * matrix, const lv_matrix_t * m); - -/** - * Transform a point by a matrix - * @param matrix pointer to a matrix - * @param point pointer to a point - * @return the transformed point - */ -lv_point_precise_t lv_matrix_transform_precise_point(const lv_matrix_t * matrix, const lv_point_precise_t * point); - -/** - * Transform an area by a matrix - * @param matrix pointer to a matrix - * @param area pointer to an area - * @return the transformed area - */ -lv_area_t lv_matrix_transform_area(const lv_matrix_t * matrix, const lv_area_t * area); - -/** - * Check if the matrix is identity or translation matrix - * @param matrix pointer to a matrix - * @return true: the matrix is identity or translation matrix, false: the matrix is not identity or translation matrix - */ -bool lv_matrix_is_identity_or_translation(const lv_matrix_t * matrix); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_MATRIX*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_MATRIX_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_palette.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_palette.c deleted file mode 100644 index cbcdf4e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_palette.c +++ /dev/null @@ -1,130 +0,0 @@ -/** - * @file lv_palette.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_palette.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_color_t lv_palette_main(lv_palette_t p) -{ - static const lv_color_t colors[] = { - LV_COLOR_MAKE(0xF4, 0x43, 0x36), LV_COLOR_MAKE(0xE9, 0x1E, 0x63), LV_COLOR_MAKE(0x9C, 0x27, 0xB0), LV_COLOR_MAKE(0x67, 0x3A, 0xB7), - LV_COLOR_MAKE(0x3F, 0x51, 0xB5), LV_COLOR_MAKE(0x21, 0x96, 0xF3), LV_COLOR_MAKE(0x03, 0xA9, 0xF4), LV_COLOR_MAKE(0x00, 0xBC, 0xD4), - LV_COLOR_MAKE(0x00, 0x96, 0x88), LV_COLOR_MAKE(0x4C, 0xAF, 0x50), LV_COLOR_MAKE(0x8B, 0xC3, 0x4A), LV_COLOR_MAKE(0xCD, 0xDC, 0x39), - LV_COLOR_MAKE(0xFF, 0xEB, 0x3B), LV_COLOR_MAKE(0xFF, 0xC1, 0x07), LV_COLOR_MAKE(0xFF, 0x98, 0x00), LV_COLOR_MAKE(0xFF, 0x57, 0x22), - LV_COLOR_MAKE(0x79, 0x55, 0x48), LV_COLOR_MAKE(0x60, 0x7D, 0x8B), LV_COLOR_MAKE(0x9E, 0x9E, 0x9E) - }; - - if(p >= LV_PALETTE_LAST) { - LV_LOG_WARN("Invalid palette: %d", p); - return lv_color_black(); - } - - return colors[p]; - -} - -lv_color_t lv_palette_lighten(lv_palette_t p, uint8_t lvl) -{ - static const lv_color_t colors[][5] = { - {LV_COLOR_MAKE(0xEF, 0x53, 0x50), LV_COLOR_MAKE(0xE5, 0x73, 0x73), LV_COLOR_MAKE(0xEF, 0x9A, 0x9A), LV_COLOR_MAKE(0xFF, 0xCD, 0xD2), LV_COLOR_MAKE(0xFF, 0xEB, 0xEE)}, - {LV_COLOR_MAKE(0xEC, 0x40, 0x7A), LV_COLOR_MAKE(0xF0, 0x62, 0x92), LV_COLOR_MAKE(0xF4, 0x8F, 0xB1), LV_COLOR_MAKE(0xF8, 0xBB, 0xD0), LV_COLOR_MAKE(0xFC, 0xE4, 0xEC)}, - {LV_COLOR_MAKE(0xAB, 0x47, 0xBC), LV_COLOR_MAKE(0xBA, 0x68, 0xC8), LV_COLOR_MAKE(0xCE, 0x93, 0xD8), LV_COLOR_MAKE(0xE1, 0xBE, 0xE7), LV_COLOR_MAKE(0xF3, 0xE5, 0xF5)}, - {LV_COLOR_MAKE(0x7E, 0x57, 0xC2), LV_COLOR_MAKE(0x95, 0x75, 0xCD), LV_COLOR_MAKE(0xB3, 0x9D, 0xDB), LV_COLOR_MAKE(0xD1, 0xC4, 0xE9), LV_COLOR_MAKE(0xED, 0xE7, 0xF6)}, - {LV_COLOR_MAKE(0x5C, 0x6B, 0xC0), LV_COLOR_MAKE(0x79, 0x86, 0xCB), LV_COLOR_MAKE(0x9F, 0xA8, 0xDA), LV_COLOR_MAKE(0xC5, 0xCA, 0xE9), LV_COLOR_MAKE(0xE8, 0xEA, 0xF6)}, - {LV_COLOR_MAKE(0x42, 0xA5, 0xF5), LV_COLOR_MAKE(0x64, 0xB5, 0xF6), LV_COLOR_MAKE(0x90, 0xCA, 0xF9), LV_COLOR_MAKE(0xBB, 0xDE, 0xFB), LV_COLOR_MAKE(0xE3, 0xF2, 0xFD)}, - {LV_COLOR_MAKE(0x29, 0xB6, 0xF6), LV_COLOR_MAKE(0x4F, 0xC3, 0xF7), LV_COLOR_MAKE(0x81, 0xD4, 0xFA), LV_COLOR_MAKE(0xB3, 0xE5, 0xFC), LV_COLOR_MAKE(0xE1, 0xF5, 0xFE)}, - {LV_COLOR_MAKE(0x26, 0xC6, 0xDA), LV_COLOR_MAKE(0x4D, 0xD0, 0xE1), LV_COLOR_MAKE(0x80, 0xDE, 0xEA), LV_COLOR_MAKE(0xB2, 0xEB, 0xF2), LV_COLOR_MAKE(0xE0, 0xF7, 0xFA)}, - {LV_COLOR_MAKE(0x26, 0xA6, 0x9A), LV_COLOR_MAKE(0x4D, 0xB6, 0xAC), LV_COLOR_MAKE(0x80, 0xCB, 0xC4), LV_COLOR_MAKE(0xB2, 0xDF, 0xDB), LV_COLOR_MAKE(0xE0, 0xF2, 0xF1)}, - {LV_COLOR_MAKE(0x66, 0xBB, 0x6A), LV_COLOR_MAKE(0x81, 0xC7, 0x84), LV_COLOR_MAKE(0xA5, 0xD6, 0xA7), LV_COLOR_MAKE(0xC8, 0xE6, 0xC9), LV_COLOR_MAKE(0xE8, 0xF5, 0xE9)}, - {LV_COLOR_MAKE(0x9C, 0xCC, 0x65), LV_COLOR_MAKE(0xAE, 0xD5, 0x81), LV_COLOR_MAKE(0xC5, 0xE1, 0xA5), LV_COLOR_MAKE(0xDC, 0xED, 0xC8), LV_COLOR_MAKE(0xF1, 0xF8, 0xE9)}, - {LV_COLOR_MAKE(0xD4, 0xE1, 0x57), LV_COLOR_MAKE(0xDC, 0xE7, 0x75), LV_COLOR_MAKE(0xE6, 0xEE, 0x9C), LV_COLOR_MAKE(0xF0, 0xF4, 0xC3), LV_COLOR_MAKE(0xF9, 0xFB, 0xE7)}, - {LV_COLOR_MAKE(0xFF, 0xEE, 0x58), LV_COLOR_MAKE(0xFF, 0xF1, 0x76), LV_COLOR_MAKE(0xFF, 0xF5, 0x9D), LV_COLOR_MAKE(0xFF, 0xF9, 0xC4), LV_COLOR_MAKE(0xFF, 0xFD, 0xE7)}, - {LV_COLOR_MAKE(0xFF, 0xCA, 0x28), LV_COLOR_MAKE(0xFF, 0xD5, 0x4F), LV_COLOR_MAKE(0xFF, 0xE0, 0x82), LV_COLOR_MAKE(0xFF, 0xEC, 0xB3), LV_COLOR_MAKE(0xFF, 0xF8, 0xE1)}, - {LV_COLOR_MAKE(0xFF, 0xA7, 0x26), LV_COLOR_MAKE(0xFF, 0xB7, 0x4D), LV_COLOR_MAKE(0xFF, 0xCC, 0x80), LV_COLOR_MAKE(0xFF, 0xE0, 0xB2), LV_COLOR_MAKE(0xFF, 0xF3, 0xE0)}, - {LV_COLOR_MAKE(0xFF, 0x70, 0x43), LV_COLOR_MAKE(0xFF, 0x8A, 0x65), LV_COLOR_MAKE(0xFF, 0xAB, 0x91), LV_COLOR_MAKE(0xFF, 0xCC, 0xBC), LV_COLOR_MAKE(0xFB, 0xE9, 0xE7)}, - {LV_COLOR_MAKE(0x8D, 0x6E, 0x63), LV_COLOR_MAKE(0xA1, 0x88, 0x7F), LV_COLOR_MAKE(0xBC, 0xAA, 0xA4), LV_COLOR_MAKE(0xD7, 0xCC, 0xC8), LV_COLOR_MAKE(0xEF, 0xEB, 0xE9)}, - {LV_COLOR_MAKE(0x78, 0x90, 0x9C), LV_COLOR_MAKE(0x90, 0xA4, 0xAE), LV_COLOR_MAKE(0xB0, 0xBE, 0xC5), LV_COLOR_MAKE(0xCF, 0xD8, 0xDC), LV_COLOR_MAKE(0xEC, 0xEF, 0xF1)}, - {LV_COLOR_MAKE(0xBD, 0xBD, 0xBD), LV_COLOR_MAKE(0xE0, 0xE0, 0xE0), LV_COLOR_MAKE(0xEE, 0xEE, 0xEE), LV_COLOR_MAKE(0xF5, 0xF5, 0xF5), LV_COLOR_MAKE(0xFA, 0xFA, 0xFA)}, - }; - - if(p >= LV_PALETTE_LAST) { - LV_LOG_WARN("Invalid palette: %d", p); - return lv_color_black(); - } - - if(lvl == 0 || lvl > 5) { - LV_LOG_WARN("Invalid level: %d. Must be 1..5", lvl); - return lv_color_black(); - } - - lvl--; - - return colors[p][lvl]; -} - -lv_color_t lv_palette_darken(lv_palette_t p, uint8_t lvl) -{ - static const lv_color_t colors[][4] = { - {LV_COLOR_MAKE(0xE5, 0x39, 0x35), LV_COLOR_MAKE(0xD3, 0x2F, 0x2F), LV_COLOR_MAKE(0xC6, 0x28, 0x28), LV_COLOR_MAKE(0xB7, 0x1C, 0x1C)}, - {LV_COLOR_MAKE(0xD8, 0x1B, 0x60), LV_COLOR_MAKE(0xC2, 0x18, 0x5B), LV_COLOR_MAKE(0xAD, 0x14, 0x57), LV_COLOR_MAKE(0x88, 0x0E, 0x4F)}, - {LV_COLOR_MAKE(0x8E, 0x24, 0xAA), LV_COLOR_MAKE(0x7B, 0x1F, 0xA2), LV_COLOR_MAKE(0x6A, 0x1B, 0x9A), LV_COLOR_MAKE(0x4A, 0x14, 0x8C)}, - {LV_COLOR_MAKE(0x5E, 0x35, 0xB1), LV_COLOR_MAKE(0x51, 0x2D, 0xA8), LV_COLOR_MAKE(0x45, 0x27, 0xA0), LV_COLOR_MAKE(0x31, 0x1B, 0x92)}, - {LV_COLOR_MAKE(0x39, 0x49, 0xAB), LV_COLOR_MAKE(0x30, 0x3F, 0x9F), LV_COLOR_MAKE(0x28, 0x35, 0x93), LV_COLOR_MAKE(0x1A, 0x23, 0x7E)}, - {LV_COLOR_MAKE(0x1E, 0x88, 0xE5), LV_COLOR_MAKE(0x19, 0x76, 0xD2), LV_COLOR_MAKE(0x15, 0x65, 0xC0), LV_COLOR_MAKE(0x0D, 0x47, 0xA1)}, - {LV_COLOR_MAKE(0x03, 0x9B, 0xE5), LV_COLOR_MAKE(0x02, 0x88, 0xD1), LV_COLOR_MAKE(0x02, 0x77, 0xBD), LV_COLOR_MAKE(0x01, 0x57, 0x9B)}, - {LV_COLOR_MAKE(0x00, 0xAC, 0xC1), LV_COLOR_MAKE(0x00, 0x97, 0xA7), LV_COLOR_MAKE(0x00, 0x83, 0x8F), LV_COLOR_MAKE(0x00, 0x60, 0x64)}, - {LV_COLOR_MAKE(0x00, 0x89, 0x7B), LV_COLOR_MAKE(0x00, 0x79, 0x6B), LV_COLOR_MAKE(0x00, 0x69, 0x5C), LV_COLOR_MAKE(0x00, 0x4D, 0x40)}, - {LV_COLOR_MAKE(0x43, 0xA0, 0x47), LV_COLOR_MAKE(0x38, 0x8E, 0x3C), LV_COLOR_MAKE(0x2E, 0x7D, 0x32), LV_COLOR_MAKE(0x1B, 0x5E, 0x20)}, - {LV_COLOR_MAKE(0x7C, 0xB3, 0x42), LV_COLOR_MAKE(0x68, 0x9F, 0x38), LV_COLOR_MAKE(0x55, 0x8B, 0x2F), LV_COLOR_MAKE(0x33, 0x69, 0x1E)}, - {LV_COLOR_MAKE(0xC0, 0xCA, 0x33), LV_COLOR_MAKE(0xAF, 0xB4, 0x2B), LV_COLOR_MAKE(0x9E, 0x9D, 0x24), LV_COLOR_MAKE(0x82, 0x77, 0x17)}, - {LV_COLOR_MAKE(0xFD, 0xD8, 0x35), LV_COLOR_MAKE(0xFB, 0xC0, 0x2D), LV_COLOR_MAKE(0xF9, 0xA8, 0x25), LV_COLOR_MAKE(0xF5, 0x7F, 0x17)}, - {LV_COLOR_MAKE(0xFF, 0xB3, 0x00), LV_COLOR_MAKE(0xFF, 0xA0, 0x00), LV_COLOR_MAKE(0xFF, 0x8F, 0x00), LV_COLOR_MAKE(0xFF, 0x6F, 0x00)}, - {LV_COLOR_MAKE(0xFB, 0x8C, 0x00), LV_COLOR_MAKE(0xF5, 0x7C, 0x00), LV_COLOR_MAKE(0xEF, 0x6C, 0x00), LV_COLOR_MAKE(0xE6, 0x51, 0x00)}, - {LV_COLOR_MAKE(0xF4, 0x51, 0x1E), LV_COLOR_MAKE(0xE6, 0x4A, 0x19), LV_COLOR_MAKE(0xD8, 0x43, 0x15), LV_COLOR_MAKE(0xBF, 0x36, 0x0C)}, - {LV_COLOR_MAKE(0x6D, 0x4C, 0x41), LV_COLOR_MAKE(0x5D, 0x40, 0x37), LV_COLOR_MAKE(0x4E, 0x34, 0x2E), LV_COLOR_MAKE(0x3E, 0x27, 0x23)}, - {LV_COLOR_MAKE(0x54, 0x6E, 0x7A), LV_COLOR_MAKE(0x45, 0x5A, 0x64), LV_COLOR_MAKE(0x37, 0x47, 0x4F), LV_COLOR_MAKE(0x26, 0x32, 0x38)}, - {LV_COLOR_MAKE(0x75, 0x75, 0x75), LV_COLOR_MAKE(0x61, 0x61, 0x61), LV_COLOR_MAKE(0x42, 0x42, 0x42), LV_COLOR_MAKE(0x21, 0x21, 0x21)}, - }; - - if(p >= LV_PALETTE_LAST) { - LV_LOG_WARN("Invalid palette: %d", p); - return lv_color_black(); - } - - if(lvl == 0 || lvl > 4) { - LV_LOG_WARN("Invalid level: %d. Must be 1..4", lvl); - return lv_color_black(); - } - - lvl--; - - return colors[p][lvl]; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_palette.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_palette.h deleted file mode 100644 index d2f408c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_palette.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @file lv_palette.h - * - */ - -#ifndef LV_PALETTE_H -#define LV_PALETTE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_color.h" -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef enum { - LV_PALETTE_RED, - LV_PALETTE_PINK, - LV_PALETTE_PURPLE, - LV_PALETTE_DEEP_PURPLE, - LV_PALETTE_INDIGO, - LV_PALETTE_BLUE, - LV_PALETTE_LIGHT_BLUE, - LV_PALETTE_CYAN, - LV_PALETTE_TEAL, - LV_PALETTE_GREEN, - LV_PALETTE_LIGHT_GREEN, - LV_PALETTE_LIME, - LV_PALETTE_YELLOW, - LV_PALETTE_AMBER, - LV_PALETTE_ORANGE, - LV_PALETTE_DEEP_ORANGE, - LV_PALETTE_BROWN, - LV_PALETTE_BLUE_GREY, - LV_PALETTE_GREY, - LV_PALETTE_LAST, - LV_PALETTE_NONE = 0xff, -} lv_palette_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/*Source: https://vuetifyjs.com/en/styles/colors/#material-colors*/ - -lv_color_t lv_palette_main(lv_palette_t p); -lv_color_t lv_palette_lighten(lv_palette_t p, uint8_t lvl); -lv_color_t lv_palette_darken(lv_palette_t p, uint8_t lvl); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_PALETTE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_profiler.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_profiler.h deleted file mode 100644 index 47d5bd2..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_profiler.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file lv_profiler.h - * - */ - -#ifndef LV_PROFILER_H -#define LV_PROFILER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../lv_conf_internal.h" - -#if LV_USE_PROFILER - -#include LV_PROFILER_INCLUDE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#else - -#define LV_PROFILER_BEGIN -#define LV_PROFILER_END -#define LV_PROFILER_BEGIN_TAG(tag) LV_UNUSED(tag) -#define LV_PROFILER_END_TAG(tag) LV_UNUSED(tag) - -#endif /*LV_USE_PROFILER*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_PROFILER_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_profiler_builtin.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_profiler_builtin.c deleted file mode 100644 index b6b6fd4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_profiler_builtin.c +++ /dev/null @@ -1,262 +0,0 @@ -/** - * @file lv_profiler_builtin.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_profiler_builtin_private.h" -#include "../lvgl.h" -#include "../core/lv_global.h" - -/********************* - * DEFINES - *********************/ - -#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN - -#define profiler_ctx LV_GLOBAL_DEFAULT()->profiler_context - -#define LV_PROFILER_STR_MAX_LEN 128 -#define LV_PROFILER_TICK_PER_SEC_MAX 1000000 - -#if LV_USE_OS - #define LV_PROFILER_MULTEX_INIT lv_mutex_init(&profiler_ctx->mutex) - #define LV_PROFILER_MULTEX_DEINIT lv_mutex_delete(&profiler_ctx->mutex) - #define LV_PROFILER_MULTEX_LOCK lv_mutex_lock(&profiler_ctx->mutex) - #define LV_PROFILER_MULTEX_UNLOCK lv_mutex_unlock(&profiler_ctx->mutex) -#else - #define LV_PROFILER_MULTEX_INIT - #define LV_PROFILER_MULTEX_DEINIT - #define LV_PROFILER_MULTEX_LOCK - #define LV_PROFILER_MULTEX_UNLOCK -#endif - -/********************** - * TYPEDEFS - **********************/ - -/** - * @brief Structure representing a built-in profiler item in LVGL - */ -typedef struct { - char tag; /**< The tag of the profiler item */ - uint32_t tick; /**< The tick value of the profiler item */ - const char * func; /**< A pointer to the function associated with the profiler item */ -#if LV_USE_OS - int tid; /**< The thread ID of the profiler item */ - int cpu; /**< The CPU ID of the profiler item */ -#endif -} lv_profiler_builtin_item_t; - -/** - * @brief Structure representing a context for the LVGL built-in profiler - */ -typedef struct lv_profiler_builtin_ctx_t { - lv_profiler_builtin_item_t * item_arr; /**< Pointer to an array of profiler items */ - uint32_t item_num; /**< Number of profiler items in the array */ - uint32_t cur_index; /**< Index of the current profiler item */ - lv_profiler_builtin_config_t config; /**< Configuration for the built-in profiler */ - bool enable; /**< Whether the built-in profiler is enabled */ -#if LV_USE_OS - lv_mutex_t mutex; /**< Mutex to protect the built-in profiler */ -#endif -} lv_profiler_builtin_ctx_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void default_flush_cb(const char * buf); -static int default_tid_get_cb(void); -static int default_cpu_get_cb(void); -static void flush_no_lock(void); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_profiler_builtin_config_init(lv_profiler_builtin_config_t * config) -{ - LV_ASSERT_NULL(config); - lv_memzero(config, sizeof(lv_profiler_builtin_config_t)); - config->buf_size = LV_PROFILER_BUILTIN_BUF_SIZE; - config->tick_per_sec = 1000; - config->tick_get_cb = lv_tick_get; - config->flush_cb = default_flush_cb; - config->tid_get_cb = default_tid_get_cb; - config->cpu_get_cb = default_cpu_get_cb; -} - -void lv_profiler_builtin_init(const lv_profiler_builtin_config_t * config) -{ - LV_ASSERT_NULL(config); - LV_ASSERT_NULL(config->tick_get_cb); - - uint32_t num = config->buf_size / sizeof(lv_profiler_builtin_item_t); - if(num == 0) { - LV_LOG_WARN("buf_size must > %d", (int)sizeof(lv_profiler_builtin_item_t)); - return; - } - - if(config->tick_per_sec == 0 || config->tick_per_sec > LV_PROFILER_TICK_PER_SEC_MAX) { - LV_LOG_WARN("tick_per_sec range must be between 1~%d", LV_PROFILER_TICK_PER_SEC_MAX); - return; - } - - /*Free the old item_arr memory*/ - if(profiler_ctx) { - lv_profiler_builtin_uninit(); - } - - profiler_ctx = lv_malloc_zeroed(sizeof(lv_profiler_builtin_ctx_t)); - LV_ASSERT_MALLOC(profiler_ctx); - - profiler_ctx->item_arr = lv_malloc(num * sizeof(lv_profiler_builtin_item_t)); - LV_ASSERT_MALLOC(profiler_ctx->item_arr); - if(profiler_ctx->item_arr == NULL) { - lv_free(profiler_ctx); - profiler_ctx = NULL; - LV_LOG_ERROR("malloc failed for item_arr"); - return; - } - - LV_PROFILER_MULTEX_INIT; - profiler_ctx->item_num = num; - profiler_ctx->config = *config; - - if(profiler_ctx->config.flush_cb) { - /* add profiler header for perfetto */ - profiler_ctx->config.flush_cb("# tracer: nop\n"); - profiler_ctx->config.flush_cb("#\n"); - } - - lv_profiler_builtin_set_enable(true); - - LV_LOG_INFO("init OK, item_num = %d", (int)num); -} - -void lv_profiler_builtin_uninit(void) -{ - LV_ASSERT_NULL(profiler_ctx); - LV_PROFILER_MULTEX_DEINIT; - lv_free(profiler_ctx->item_arr); - lv_free(profiler_ctx); - profiler_ctx = NULL; -} - -void lv_profiler_builtin_set_enable(bool enable) -{ - if(!profiler_ctx) { - return; - } - - profiler_ctx->enable = enable; -} - -void lv_profiler_builtin_flush(void) -{ - LV_ASSERT_NULL(profiler_ctx); - - LV_PROFILER_MULTEX_LOCK; - flush_no_lock(); - LV_PROFILER_MULTEX_UNLOCK; -} - -void lv_profiler_builtin_write(const char * func, char tag) -{ - LV_ASSERT_NULL(profiler_ctx); - LV_ASSERT_NULL(func); - - if(!profiler_ctx->enable) { - return; - } - - LV_PROFILER_MULTEX_LOCK; - - if(profiler_ctx->cur_index >= profiler_ctx->item_num) { - flush_no_lock(); - profiler_ctx->cur_index = 0; - } - - lv_profiler_builtin_item_t * item = &profiler_ctx->item_arr[profiler_ctx->cur_index]; - item->func = func; - item->tag = tag; - item->tick = profiler_ctx->config.tick_get_cb(); - -#if LV_USE_OS - item->tid = profiler_ctx->config.tid_get_cb(); - item->cpu = profiler_ctx->config.cpu_get_cb(); -#endif - - profiler_ctx->cur_index++; - - LV_PROFILER_MULTEX_UNLOCK; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void default_flush_cb(const char * buf) -{ - LV_LOG("%s", buf); -} - -static int default_tid_get_cb(void) -{ - return 1; -} - -static int default_cpu_get_cb(void) -{ - return 0; -} - -static void flush_no_lock(void) -{ - if(!profiler_ctx->config.flush_cb) { - LV_LOG_WARN("flush_cb is not registered"); - return; - } - - uint32_t cur = 0; - char buf[LV_PROFILER_STR_MAX_LEN]; - uint32_t tick_per_sec = profiler_ctx->config.tick_per_sec; - while(cur < profiler_ctx->cur_index) { - lv_profiler_builtin_item_t * item = &profiler_ctx->item_arr[cur++]; - uint32_t sec = item->tick / tick_per_sec; - uint32_t usec = (item->tick % tick_per_sec) * (LV_PROFILER_TICK_PER_SEC_MAX / tick_per_sec); - -#if LV_USE_OS - lv_snprintf(buf, sizeof(buf), - " LVGL-%d [%d] %" LV_PRIu32 ".%06" LV_PRIu32 ": tracing_mark_write: %c|1|%s\n", - item->tid, - item->cpu, - sec, - usec, - item->tag, - item->func); -#else - lv_snprintf(buf, sizeof(buf), - " LVGL-1 [0] %" LV_PRIu32 ".%06" LV_PRIu32 ": tracing_mark_write: %c|1|%s\n", - sec, - usec, - item->tag, - item->func); -#endif - profiler_ctx->config.flush_cb(buf); - } -} - -#endif /*LV_USE_PROFILER_BUILTIN*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_profiler_builtin.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_profiler_builtin.h deleted file mode 100644 index aa0220b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_profiler_builtin.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * @file lv_profiler_builtin.h - * - */ - -#ifndef LV_PROFILER_BUILTIN_H -#define LV_PROFILER_BUILTIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../lv_conf_internal.h" - -#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN - -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ - -#define LV_PROFILER_BUILTIN_BEGIN_TAG(tag) lv_profiler_builtin_write((tag), 'B') -#define LV_PROFILER_BUILTIN_END_TAG(tag) lv_profiler_builtin_write((tag), 'E') -#define LV_PROFILER_BUILTIN_BEGIN LV_PROFILER_BUILTIN_BEGIN_TAG(__func__) -#define LV_PROFILER_BUILTIN_END LV_PROFILER_BUILTIN_END_TAG(__func__) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * @brief Initialize the configuration of the built-in profiler - * @param config Pointer to the configuration structure of the built-in profiler - */ -void lv_profiler_builtin_config_init(lv_profiler_builtin_config_t * config); - -/** - * @brief Initialize the built-in profiler with the given configuration - * @param config Pointer to the configuration structure of the built-in profiler - */ -void lv_profiler_builtin_init(const lv_profiler_builtin_config_t * config); - -/** - * @brief Uninitialize the built-in profiler - */ -void lv_profiler_builtin_uninit(void); - -/** - * @brief Enable or disable the built-in profiler - * @param enable true to enable the built-in profiler, false to disable - */ -void lv_profiler_builtin_set_enable(bool enable); - -/** - * @brief Flush the profiling data to the console - */ -void lv_profiler_builtin_flush(void); - -/** - * @brief Write the profiling data for a function with the given tag - * @param func Name of the function being profiled - * @param tag Tag to associate with the profiling data for the function - */ -void lv_profiler_builtin_write(const char * func, char tag); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_PROFILER_BUILTIN*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_PROFILER_BUILTIN_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_profiler_builtin_private.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_profiler_builtin_private.h deleted file mode 100644 index 3fb9938..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_profiler_builtin_private.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @file lv_profiler_builtin_private.h - * - */ - -#ifndef LV_PROFILER_BUILTIN_PRIVATE_H -#define LV_PROFILER_BUILTIN_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_profiler_builtin.h" - -#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * @brief LVGL profiler built-in configuration structure - */ -struct lv_profiler_builtin_config_t { - size_t buf_size; /**< The size of the buffer used for profiling data */ - uint32_t tick_per_sec; /**< The number of ticks per second */ - uint32_t (*tick_get_cb)(void); /**< Callback function to get the current tick count */ - void (*flush_cb)(const char * buf); /**< Callback function to flush the profiling data */ - int (*tid_get_cb)(void); /**< Callback function to get the current thread ID */ - int (*cpu_get_cb)(void); /**< Callback function to get the current CPU */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_PROFILER_BUILTIN_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_rb.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_rb.c deleted file mode 100644 index 8a7328c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_rb.c +++ /dev/null @@ -1,556 +0,0 @@ -/** - * @file lv_rb.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_rb_private.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static lv_rb_node_t * rb_create_node(lv_rb_t * tree); -static lv_rb_node_t * rb_find_leaf_parent(lv_rb_t * tree, lv_rb_node_t * node); -static void rb_right_rotate(lv_rb_t * tree, lv_rb_node_t * node); -static void rb_left_rotate(lv_rb_t * tree, lv_rb_node_t * node); -static void rb_insert_color(lv_rb_t * tree, lv_rb_node_t * node); -static void rb_delete_color(lv_rb_t * tree, lv_rb_node_t * node1, lv_rb_node_t * node2); - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -bool lv_rb_init(lv_rb_t * tree, lv_rb_compare_t compare, size_t node_size) -{ - LV_ASSERT_NULL(tree); - LV_ASSERT_NULL(compare); - LV_ASSERT(node_size > 0); - - if(tree == NULL || compare == NULL || node_size == 0) { - return false; - } - - lv_memzero(tree, sizeof(lv_rb_t)); - - tree->root = NULL; - tree->compare = compare; - tree->size = node_size; - - return true; -} - -lv_rb_node_t * lv_rb_insert(lv_rb_t * tree, void * key) -{ - LV_ASSERT_NULL(tree); - if(tree == NULL) { - return NULL; - } - - lv_rb_node_t * node = lv_rb_find(tree, key); - if(node) return node; - else { - node = rb_create_node(tree); - if(node == NULL) return NULL; - - if(tree->root == NULL) { - tree->root = node; - node->parent = NULL; - node->color = LV_RB_COLOR_BLACK; - return node; - } - } - - void * new_data = node->data; - node->data = key; - lv_rb_node_t * parent = rb_find_leaf_parent(tree, node); - - node->parent = parent; - node->color = LV_RB_COLOR_RED; - - if(tree->compare(key, parent->data) < 0) parent->left = node; - else parent->right = node; - - rb_insert_color(tree, node); - - node->data = new_data; - return node; -} - -lv_rb_node_t * lv_rb_find(lv_rb_t * tree, const void * key) -{ - LV_ASSERT_NULL(tree); - if(tree == NULL) { - return NULL; - } - - lv_rb_node_t * current = tree->root; - - while(current != NULL) { - lv_rb_compare_res_t cmp = tree->compare(key, current->data); - - if(cmp == 0) { - return current; - } - else if(cmp < 0) { - current = current->left; - } - else { - current = current->right; - } - } - - return NULL; -} - -void * lv_rb_remove_node(lv_rb_t * tree, lv_rb_node_t * node) -{ - lv_rb_node_t * child = NULL; - lv_rb_node_t * parent = NULL; - lv_rb_color_t color = LV_RB_COLOR_BLACK; - - if(node->left != NULL && node->right != NULL) { - lv_rb_node_t * replace = node; - replace = lv_rb_minimum_from(replace->right); - - if(node->parent != NULL) { - if(node->parent->left == node) { - node->parent->left = replace; - } - else { - node->parent->right = replace; - } - } - else { - tree->root = replace; - } - - child = replace->right; - parent = replace->parent; - color = replace->color; - - if(parent == node) { - parent = replace; - } - else { - if(child != NULL) { - child->parent = parent; - } - parent->left = child; - replace->right = node->right; - node->right->parent = replace; - } - - replace->parent = node->parent; - replace->color = node->color; - replace->left = node->left; - node->left->parent = replace; - - if(color == LV_RB_COLOR_BLACK) { - rb_delete_color(tree, child, parent); - } - - void * data = node->data; - lv_free(node); - return data; - } - - child = node->right != NULL ? node->right : node->left; - parent = node->parent; - color = node->color; - - if(child != NULL) { - child->parent = parent; - } - - if(parent != NULL) { - if(parent->left == node) { - parent->left = child; - } - else { - parent->right = child; - } - } - else { - tree->root = child; - } - - if(color == LV_RB_COLOR_BLACK) { - rb_delete_color(tree, child, parent); - } - - void * data = node->data; - lv_free(node); - return data; -} - -void * lv_rb_remove(lv_rb_t * tree, const void * key) -{ - LV_ASSERT_NULL(tree); - if(tree == NULL) { - return NULL; - } - - lv_rb_node_t * node = lv_rb_find(tree, key); - LV_ASSERT_NULL(node); - if(node == NULL) { - LV_LOG_WARN("rb delete %d not found", (int)(uintptr_t)key); - return NULL; - } - - return lv_rb_remove_node(tree, node); -} - -bool lv_rb_drop_node(lv_rb_t * tree, lv_rb_node_t * node) -{ - LV_ASSERT_NULL(tree); - if(tree == NULL) { - return false; - } - - void * data = lv_rb_remove_node(tree, node); - if(data) { - lv_free(data); - return true; - } - return false; -} - -bool lv_rb_drop(lv_rb_t * tree, const void * key) -{ - LV_ASSERT_NULL(tree); - if(tree == NULL) { - return false; - } - - void * data = lv_rb_remove(tree, key); - if(data) { - lv_free(data); - return true; - } - return false; -} - -void lv_rb_destroy(lv_rb_t * tree) -{ - LV_ASSERT_NULL(tree); - - if(tree == NULL) { - return; - } - - lv_rb_node_t * node = tree->root; - lv_rb_node_t * parent = NULL; - - while(node != NULL) { - if(node->left != NULL) { - node = node->left; - } - else if(node->right != NULL) { - node = node->right; - } - else { - parent = node->parent; - if(parent != NULL) { - if(parent->left == node) { - parent->left = NULL; - } - else { - parent->right = NULL; - } - } - lv_free(node->data); - lv_free(node); - node = parent; - } - } - tree->root = NULL; -} - -lv_rb_node_t * lv_rb_minimum(lv_rb_t * tree) -{ - LV_ASSERT_NULL(tree); - if(tree == NULL) { - return NULL; - } - return lv_rb_minimum_from(tree->root); -} - -lv_rb_node_t * lv_rb_maximum(lv_rb_t * tree) -{ - LV_ASSERT_NULL(tree); - if(tree == NULL) { - return NULL; - } - return lv_rb_maximum_from(tree->root); -} - -lv_rb_node_t * lv_rb_minimum_from(lv_rb_node_t * node) -{ - while(node->left != NULL) { - node = node->left; - } - - return node; -} - -lv_rb_node_t * lv_rb_maximum_from(lv_rb_node_t * node) -{ - while(node->right != NULL) { - node = node->right; - } - - return node; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static lv_rb_node_t * rb_create_node(lv_rb_t * tree) -{ - lv_rb_node_t * node = lv_malloc_zeroed(sizeof(lv_rb_node_t)); - LV_ASSERT_MALLOC(node); - if(node == NULL) { - return NULL; - } - - node->data = lv_malloc_zeroed(tree->size); - LV_ASSERT_MALLOC(node->data); - if(node->data == NULL) { - lv_free(node); - return NULL; - } - - node->color = LV_RB_COLOR_RED; - node->left = NULL; - node->right = NULL; - - return node; -} - -static lv_rb_node_t * rb_find_leaf_parent(lv_rb_t * tree, lv_rb_node_t * node) -{ - lv_rb_node_t * current = tree->root; - lv_rb_node_t * parent = current; - - while(current != NULL) { - parent = current; - - if(tree->compare(node->data, current->data) < 0) { - current = current->left; - } - else { - current = current->right; - } - } - - return parent; -} - -static void rb_right_rotate(lv_rb_t * tree, lv_rb_node_t * node) -{ - lv_rb_node_t * left = node->left; - node->left = left->right; - - if(left->right != NULL) { - left->right->parent = node; - } - - left->parent = node->parent; - - if(node->parent == NULL) { - tree->root = left; - } - else if(node == node->parent->right) { - node->parent->right = left; - } - else { - node->parent->left = left; - } - - left->right = node; - node->parent = left; -} - -static void rb_left_rotate(lv_rb_t * tree, lv_rb_node_t * node) -{ - lv_rb_node_t * right = node->right; - node->right = right->left; - - if(right->left != NULL) { - right->left->parent = node; - } - - right->parent = node->parent; - - if(node->parent == NULL) { - tree->root = right; - } - else if(node == node->parent->left) { - node->parent->left = right; - } - else { - node->parent->right = right; - } - - right->left = node; - node->parent = right; -} - -static void rb_insert_color(lv_rb_t * tree, lv_rb_node_t * node) -{ - lv_rb_node_t * parent = NULL; - lv_rb_node_t * gparent = NULL; - - while((parent = node->parent) && parent->color == LV_RB_COLOR_RED) { - gparent = parent->parent; - - if(parent == gparent->left) { - { - lv_rb_node_t * uncle = gparent->right; - if(uncle && uncle->color == LV_RB_COLOR_RED) { - uncle->color = LV_RB_COLOR_BLACK; - parent->color = LV_RB_COLOR_BLACK; - gparent->color = LV_RB_COLOR_RED; - node = gparent; - continue; - } - } - - if(parent->right == node) { - lv_rb_node_t * tmp; - rb_left_rotate(tree, parent); - tmp = parent; - parent = node; - node = tmp; - } - - parent->color = LV_RB_COLOR_BLACK; - gparent->color = LV_RB_COLOR_RED; - rb_right_rotate(tree, gparent); - } - else { - { - lv_rb_node_t * uncle = gparent->left; - if(uncle && uncle->color == LV_RB_COLOR_RED) { - uncle->color = LV_RB_COLOR_BLACK; - parent->color = LV_RB_COLOR_BLACK; - gparent->color = LV_RB_COLOR_RED; - node = gparent; - continue; - } - } - - if(parent->left == node) { - lv_rb_node_t * tmp; - rb_right_rotate(tree, parent); - tmp = parent; - parent = node; - node = tmp; - } - - parent->color = LV_RB_COLOR_BLACK; - gparent->color = LV_RB_COLOR_RED; - rb_left_rotate(tree, gparent); - } - } - - tree->root->color = LV_RB_COLOR_BLACK; -} - -static void rb_delete_color(lv_rb_t * tree, lv_rb_node_t * node1, lv_rb_node_t * node2) -{ - LV_ASSERT_NULL(tree); - if(tree == NULL) { - return; - } - - while((node1 == NULL || node1->color == LV_RB_COLOR_BLACK) && node1 != tree->root) { - if(node2->left == node1) { - lv_rb_node_t * pNode2 = node2->right; - if(pNode2->color == LV_RB_COLOR_RED) { - pNode2->color = LV_RB_COLOR_BLACK; - node2->color = LV_RB_COLOR_RED; - rb_left_rotate(tree, node2); - pNode2 = node2->right; - } - - if((pNode2->left == NULL || pNode2->left->color == LV_RB_COLOR_BLACK) - && (pNode2->right == NULL || pNode2->right->color == LV_RB_COLOR_BLACK)) { - pNode2->color = LV_RB_COLOR_RED; - node1 = node2; - node2 = node2->parent; - } - else { - if(pNode2->right == NULL || pNode2->right->color == LV_RB_COLOR_BLACK) { - pNode2->left->color = LV_RB_COLOR_BLACK; - pNode2->color = LV_RB_COLOR_RED; - rb_right_rotate(tree, pNode2); - pNode2 = node2->right; - } - pNode2->color = node2->color; - node2->color = LV_RB_COLOR_BLACK; - pNode2->right->color = LV_RB_COLOR_BLACK; - rb_left_rotate(tree, node2); - node1 = tree->root; - break; - } - } - else { - lv_rb_node_t * pNode2 = node2->left; - if(pNode2->color == LV_RB_COLOR_RED) { - pNode2->color = LV_RB_COLOR_BLACK; - node2->color = LV_RB_COLOR_RED; - rb_right_rotate(tree, node2); - pNode2 = node2->left; - } - - if((pNode2->left == NULL || pNode2->left->color == LV_RB_COLOR_BLACK) - && (pNode2->right == NULL || pNode2->right->color == LV_RB_COLOR_BLACK)) { - pNode2->color = LV_RB_COLOR_RED; - node1 = node2; - node2 = node2->parent; - } - else { - if(pNode2->left == NULL || pNode2->left->color == LV_RB_COLOR_BLACK) { - pNode2->right->color = LV_RB_COLOR_BLACK; - pNode2->color = LV_RB_COLOR_RED; - rb_left_rotate(tree, pNode2); - pNode2 = node2->left; - } - pNode2->color = node2->color; - node2->color = LV_RB_COLOR_BLACK; - pNode2->left->color = LV_RB_COLOR_BLACK; - rb_right_rotate(tree, node2); - node1 = tree->root; - break; - } - } - } - if(node1 != NULL) - node1->color = LV_RB_COLOR_BLACK; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_rb.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_rb.h deleted file mode 100644 index bec0a78..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_rb.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @file lv_rb.h - * - */ - -#ifndef LV_RB_H -#define LV_RB_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_types.h" -#include "lv_assert.h" -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - LV_RB_COLOR_RED, - LV_RB_COLOR_BLACK -} lv_rb_color_t; - -typedef int8_t lv_rb_compare_res_t; - -typedef lv_rb_compare_res_t (*lv_rb_compare_t)(const void * a, const void * b); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -bool lv_rb_init(lv_rb_t * tree, lv_rb_compare_t compare, size_t node_size); -lv_rb_node_t * lv_rb_insert(lv_rb_t * tree, void * key); -lv_rb_node_t * lv_rb_find(lv_rb_t * tree, const void * key); -void * lv_rb_remove_node(lv_rb_t * tree, lv_rb_node_t * node); -void * lv_rb_remove(lv_rb_t * tree, const void * key); -bool lv_rb_drop_node(lv_rb_t * tree, lv_rb_node_t * node); -bool lv_rb_drop(lv_rb_t * tree, const void * key); -lv_rb_node_t * lv_rb_minimum(lv_rb_t * node); -lv_rb_node_t * lv_rb_maximum(lv_rb_t * node); -lv_rb_node_t * lv_rb_minimum_from(lv_rb_node_t * node); -lv_rb_node_t * lv_rb_maximum_from(lv_rb_node_t * node); -void lv_rb_destroy(lv_rb_t * tree); - -/************************* - * GLOBAL VARIABLES - *************************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_RB_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_rb_private.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_rb_private.h deleted file mode 100644 index 327b7b0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_rb_private.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @file lv_rb_private.h - * - */ - -#ifndef LV_RB_PRIVATE_H -#define LV_RB_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_rb.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_rb_node_t { - struct lv_rb_node_t * parent; - struct lv_rb_node_t * left; - struct lv_rb_node_t * right; - lv_rb_color_t color; - void * data; -}; - -struct lv_rb_t { - lv_rb_node_t * root; - lv_rb_compare_t compare; - size_t size; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_RB_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style.c deleted file mode 100644 index d137d67..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style.c +++ /dev/null @@ -1,442 +0,0 @@ -/** - * @file lv_style.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_style_private.h" -#include "../core/lv_global.h" -#include "../stdlib/lv_mem.h" -#include "../stdlib/lv_string.h" -#include "lv_assert.h" -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ -#define lv_style_custom_prop_flag_lookup_table_size LV_GLOBAL_DEFAULT()->style_custom_table_size -#define lv_style_custom_prop_flag_lookup_table LV_GLOBAL_DEFAULT()->style_custom_prop_flag_lookup_table -#define last_custom_prop_id LV_GLOBAL_DEFAULT()->style_last_custom_prop_id - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * GLOBAL VARIABLES - **********************/ - -const lv_style_prop_t lv_style_const_prop_id_inv = LV_STYLE_PROP_INV; - -const uint8_t lv_style_builtin_prop_flag_lookup_table[LV_STYLE_NUM_BUILT_IN_PROPS] = { - [LV_STYLE_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_MIN_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_MAX_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_HEIGHT] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_MIN_HEIGHT] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_MAX_HEIGHT] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_LENGTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, - [LV_STYLE_X] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_Y] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_TRANSFORM_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, - [LV_STYLE_TRANSFORM_HEIGHT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, - [LV_STYLE_TRANSLATE_X] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE | LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE, - [LV_STYLE_TRANSLATE_Y] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE | LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE, - [LV_STYLE_TRANSFORM_SCALE_X] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, - [LV_STYLE_TRANSFORM_SCALE_Y] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, - [LV_STYLE_TRANSFORM_SKEW_X] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, - [LV_STYLE_TRANSFORM_SKEW_Y] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, - [LV_STYLE_TRANSFORM_ROTATION] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, - - [LV_STYLE_PAD_TOP] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_PAD_BOTTOM] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_PAD_LEFT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_PAD_RIGHT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_PAD_ROW] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_PAD_COLUMN] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_MARGIN_TOP] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_MARGIN_BOTTOM] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_MARGIN_LEFT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_MARGIN_RIGHT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - - [LV_STYLE_BG_COLOR] = 0, - [LV_STYLE_BG_OPA] = 0, - [LV_STYLE_BG_GRAD_COLOR] = 0, - [LV_STYLE_BG_GRAD_DIR] = 0, - [LV_STYLE_BG_MAIN_STOP] = 0, - [LV_STYLE_BG_GRAD_STOP] = 0, - [LV_STYLE_BG_MAIN_OPA] = 0, - [LV_STYLE_BG_GRAD_OPA] = 0, - [LV_STYLE_BG_GRAD] = 0, - - [LV_STYLE_BG_IMAGE_SRC] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, - [LV_STYLE_BG_IMAGE_OPA] = 0, - [LV_STYLE_BG_IMAGE_RECOLOR] = 0, - [LV_STYLE_BG_IMAGE_RECOLOR_OPA] = 0, - [LV_STYLE_BG_IMAGE_TILED] = 0, - - [LV_STYLE_BORDER_COLOR] = 0, - [LV_STYLE_BORDER_OPA] = 0, - [LV_STYLE_BORDER_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_BORDER_SIDE] = 0, - [LV_STYLE_BORDER_POST] = 0, - - [LV_STYLE_OUTLINE_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, - [LV_STYLE_OUTLINE_COLOR] = 0, - [LV_STYLE_OUTLINE_OPA] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, - [LV_STYLE_OUTLINE_PAD] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, - - [LV_STYLE_SHADOW_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, - [LV_STYLE_SHADOW_OFFSET_X] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, - [LV_STYLE_SHADOW_OFFSET_Y] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, - [LV_STYLE_SHADOW_SPREAD] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, - [LV_STYLE_SHADOW_COLOR] = 0, - [LV_STYLE_SHADOW_OPA] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, - - [LV_STYLE_IMAGE_OPA] = 0, - [LV_STYLE_IMAGE_RECOLOR] = 0, - [LV_STYLE_IMAGE_RECOLOR_OPA] = 0, - - [LV_STYLE_LINE_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, - [LV_STYLE_LINE_DASH_WIDTH] = 0, - [LV_STYLE_LINE_DASH_GAP] = 0, - [LV_STYLE_LINE_ROUNDED] = 0, - [LV_STYLE_LINE_COLOR] = 0, - [LV_STYLE_LINE_OPA] = 0, - - [LV_STYLE_ARC_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, - [LV_STYLE_ARC_ROUNDED] = 0, - [LV_STYLE_ARC_COLOR] = 0, - [LV_STYLE_ARC_OPA] = 0, - [LV_STYLE_ARC_IMAGE_SRC] = 0, - - [LV_STYLE_TEXT_COLOR] = LV_STYLE_PROP_FLAG_INHERITABLE, - [LV_STYLE_TEXT_OPA] = LV_STYLE_PROP_FLAG_INHERITABLE, - [LV_STYLE_TEXT_FONT] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_TEXT_LETTER_SPACE] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_TEXT_LINE_SPACE] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_TEXT_DECOR] = LV_STYLE_PROP_FLAG_INHERITABLE, - [LV_STYLE_TEXT_ALIGN] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - - [LV_STYLE_RADIUS] = 0, - [LV_STYLE_CLIP_CORNER] = 0, - [LV_STYLE_OPA] = 0, - [LV_STYLE_OPA_LAYERED] = LV_STYLE_PROP_FLAG_LAYER_UPDATE, - [LV_STYLE_COLOR_FILTER_DSC] = LV_STYLE_PROP_FLAG_INHERITABLE, - [LV_STYLE_COLOR_FILTER_OPA] = LV_STYLE_PROP_FLAG_INHERITABLE, - [LV_STYLE_ANIM_DURATION] = 0, - [LV_STYLE_TRANSITION] = 0, - [LV_STYLE_BLEND_MODE] = LV_STYLE_PROP_FLAG_LAYER_UPDATE, - [LV_STYLE_LAYOUT] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_BASE_DIR] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_BITMAP_MASK_SRC] = LV_STYLE_PROP_FLAG_LAYER_UPDATE, - -#if LV_USE_FLEX - [LV_STYLE_FLEX_FLOW] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_FLEX_MAIN_PLACE] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_FLEX_CROSS_PLACE] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_FLEX_TRACK_PLACE] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_FLEX_GROW] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, -#endif - -#if LV_USE_GRID - [LV_STYLE_GRID_COLUMN_DSC_ARRAY] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_GRID_ROW_DSC_ARRAY] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_GRID_COLUMN_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_GRID_ROW_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_GRID_CELL_ROW_SPAN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_GRID_CELL_ROW_POS] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_GRID_CELL_COLUMN_SPAN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_GRID_CELL_COLUMN_POS] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_GRID_CELL_X_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, - [LV_STYLE_GRID_CELL_Y_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, -#endif - -}; - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_style_init(lv_style_t * style) -{ -#if LV_USE_ASSERT_STYLE - if(style->sentinel == LV_STYLE_SENTINEL_VALUE && style->prop_cnt > 1) { - LV_LOG_WARN("Style might be already inited. (Potential memory leak)"); - } -#endif - - lv_memzero(style, sizeof(lv_style_t)); -#if LV_USE_ASSERT_STYLE - style->sentinel = LV_STYLE_SENTINEL_VALUE; -#endif -} - -void lv_style_reset(lv_style_t * style) -{ - LV_ASSERT_STYLE(style); - - if(style->prop_cnt != 255) lv_free(style->values_and_props); - lv_memzero(style, sizeof(lv_style_t)); -#if LV_USE_ASSERT_STYLE - style->sentinel = LV_STYLE_SENTINEL_VALUE; -#endif -} - -lv_style_prop_t lv_style_register_prop(uint8_t flag) -{ - if(lv_style_custom_prop_flag_lookup_table == NULL) { - lv_style_custom_prop_flag_lookup_table_size = 0; - last_custom_prop_id = (uint16_t)LV_STYLE_LAST_BUILT_IN_PROP; - } - - // if((last_custom_prop_id + 1) != 0) { - // LV_LOG_ERROR("No more custom property IDs available"); - // return LV_STYLE_PROP_INV; - // } - - /* - * Allocate the lookup table if it's not yet available. - */ - size_t required_size = (last_custom_prop_id + 1 - LV_STYLE_LAST_BUILT_IN_PROP); - if(lv_style_custom_prop_flag_lookup_table_size < required_size) { - /* Round required_size up to the nearest 32-byte value */ - required_size = (required_size + 31) & ~31; - LV_ASSERT_MSG(required_size > 0, "required size has become 0?"); - uint8_t * old_p = lv_style_custom_prop_flag_lookup_table; - uint8_t * new_p = lv_realloc(old_p, required_size * sizeof(uint8_t)); - if(new_p == NULL) { - LV_LOG_ERROR("Unable to allocate space for custom property lookup table"); - return LV_STYLE_PROP_INV; - } - lv_style_custom_prop_flag_lookup_table = new_p; - lv_style_custom_prop_flag_lookup_table_size = required_size; - } - last_custom_prop_id++; - /* This should never happen - we should bail out above */ - LV_ASSERT_NULL(lv_style_custom_prop_flag_lookup_table); - lv_style_custom_prop_flag_lookup_table[last_custom_prop_id - LV_STYLE_NUM_BUILT_IN_PROPS] = flag; - return last_custom_prop_id; -} - -lv_style_prop_t lv_style_get_num_custom_props(void) -{ - return last_custom_prop_id - LV_STYLE_LAST_BUILT_IN_PROP; -} - -bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop) -{ - LV_ASSERT_STYLE(style); - - if(lv_style_is_const(style)) { - LV_LOG_ERROR("Cannot remove prop from const style"); - return false; - } - - if(style->prop_cnt == 0) return false; - - uint8_t * tmp = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); - uint8_t * old_props = (uint8_t *)tmp; - uint32_t i; - for(i = 0; i < style->prop_cnt; i++) { - if(old_props[i] == prop) { - lv_style_value_t * old_values = (lv_style_value_t *)style->values_and_props; - - size_t size = (style->prop_cnt - 1) * (sizeof(lv_style_value_t) + sizeof(lv_style_prop_t)); - uint8_t * new_values_and_props = lv_malloc(size); - if(new_values_and_props == NULL) return false; - style->values_and_props = new_values_and_props; - style->prop_cnt--; - - tmp = new_values_and_props + style->prop_cnt * sizeof(lv_style_value_t); - uint8_t * new_props = (uint8_t *)tmp; - lv_style_value_t * new_values = (lv_style_value_t *)new_values_and_props; - - uint32_t j; - for(i = j = 0; j <= style->prop_cnt; - j++) { /*<=: because prop_cnt already reduced but all the old props. needs to be checked.*/ - if(old_props[j] != prop) { - new_values[i] = old_values[j]; - new_props[i++] = old_props[j]; - } - } - - lv_free(old_values); - return true; - } - } - - return false; -} - -void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_t value) -{ - LV_ASSERT_STYLE(style); - - if(lv_style_is_const(style)) { - LV_LOG_ERROR("Cannot set property of constant style"); - return; - } - - LV_ASSERT(prop != LV_STYLE_PROP_INV); - - lv_style_prop_t * props; - int32_t i; - - if(style->values_and_props) { - props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); - for(i = style->prop_cnt - 1; i >= 0; i--) { - if(props[i] == prop) { - lv_style_value_t * values = (lv_style_value_t *)style->values_and_props; - values[i] = value; - return; - } - } - } - - size_t size = (style->prop_cnt + 1) * (sizeof(lv_style_value_t) + sizeof(lv_style_prop_t)); - uint8_t * values_and_props = lv_realloc(style->values_and_props, size); - if(values_and_props == NULL) return; - style->values_and_props = values_and_props; - - props = values_and_props + style->prop_cnt * sizeof(lv_style_value_t); - /*Shift all props to make place for the value before them*/ - for(i = style->prop_cnt - 1; i >= 0; i--) { - props[i + sizeof(lv_style_value_t) / sizeof(lv_style_prop_t)] = props[i]; - } - style->prop_cnt++; - - /*Go to the new position with the props*/ - props = values_and_props + style->prop_cnt * sizeof(lv_style_value_t); - lv_style_value_t * values = (lv_style_value_t *)values_and_props; - - /*Set the new property and value*/ - props[style->prop_cnt - 1] = prop; - values[style->prop_cnt - 1] = value; - - uint32_t group = lv_style_get_prop_group(prop); - style->has_group |= (uint32_t)1 << group; -} - -lv_style_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_style_value_t * value) -{ - return lv_style_get_prop_inlined(style, prop, value); -} - -void lv_style_transition_dsc_init(lv_style_transition_dsc_t * tr, const lv_style_prop_t props[], - lv_anim_path_cb_t path_cb, uint32_t time, uint32_t delay, void * user_data) -{ - lv_memzero(tr, sizeof(lv_style_transition_dsc_t)); - tr->props = props; - tr->path_xcb = path_cb == NULL ? lv_anim_path_linear : path_cb; - tr->time = time; - tr->delay = delay; - tr->user_data = user_data; -} - -lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop) -{ - const lv_color_t black = LV_COLOR_MAKE(0x00, 0x00, 0x00); - const lv_color_t white = LV_COLOR_MAKE(0xff, 0xff, 0xff); - switch(prop) { - case LV_STYLE_TRANSFORM_SCALE_X: - case LV_STYLE_TRANSFORM_SCALE_Y: - return (lv_style_value_t) { - .num = LV_SCALE_NONE - }; - case LV_STYLE_BG_COLOR: - return (lv_style_value_t) { - .color = white - }; - case LV_STYLE_BG_GRAD_COLOR: - case LV_STYLE_BORDER_COLOR: - case LV_STYLE_SHADOW_COLOR: - case LV_STYLE_OUTLINE_COLOR: - case LV_STYLE_ARC_COLOR: - case LV_STYLE_LINE_COLOR: - case LV_STYLE_TEXT_COLOR: - case LV_STYLE_IMAGE_RECOLOR: - return (lv_style_value_t) { - .color = black - }; - case LV_STYLE_OPA: - case LV_STYLE_OPA_LAYERED: - case LV_STYLE_BORDER_OPA: - case LV_STYLE_TEXT_OPA: - case LV_STYLE_IMAGE_OPA: - case LV_STYLE_BG_GRAD_OPA: - case LV_STYLE_BG_MAIN_OPA: - case LV_STYLE_BG_IMAGE_OPA: - case LV_STYLE_OUTLINE_OPA: - case LV_STYLE_SHADOW_OPA: - case LV_STYLE_LINE_OPA: - case LV_STYLE_ARC_OPA: - return (lv_style_value_t) { - .num = LV_OPA_COVER - }; - case LV_STYLE_BG_GRAD_STOP: - return (lv_style_value_t) { - .num = 255 - }; - case LV_STYLE_BORDER_SIDE: - return (lv_style_value_t) { - .num = LV_BORDER_SIDE_FULL - }; - case LV_STYLE_TEXT_FONT: - return (lv_style_value_t) { - .ptr = LV_FONT_DEFAULT - }; - case LV_STYLE_MAX_WIDTH: - case LV_STYLE_MAX_HEIGHT: - return (lv_style_value_t) { - .num = LV_COORD_MAX - }; - case LV_STYLE_ROTARY_SENSITIVITY: - return (lv_style_value_t) { - .num = 256 - }; - default: - return (lv_style_value_t) { - .ptr = NULL - }; - } -} - -bool lv_style_is_empty(const lv_style_t * style) -{ - LV_ASSERT_STYLE(style); - - return style->prop_cnt == 0; -} - -uint8_t lv_style_prop_lookup_flags(lv_style_prop_t prop) -{ - if(prop == LV_STYLE_PROP_ANY) return LV_STYLE_PROP_FLAG_ALL; /*Any prop can have any flags*/ - if(prop == LV_STYLE_PROP_INV) return 0; - - if(prop < LV_STYLE_NUM_BUILT_IN_PROPS) - return lv_style_builtin_prop_flag_lookup_table[prop]; - prop -= LV_STYLE_NUM_BUILT_IN_PROPS; - if(lv_style_custom_prop_flag_lookup_table != NULL && prop < lv_style_custom_prop_flag_lookup_table_size) - return lv_style_custom_prop_flag_lookup_table[prop]; - return 0; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style.h deleted file mode 100644 index dcce7dc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style.h +++ /dev/null @@ -1,632 +0,0 @@ -/** - * @file lv_style.h - * - */ - -#ifndef LV_STYLE_H -#define LV_STYLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../font/lv_font.h" -#include "lv_color.h" -#include "lv_area.h" -#include "lv_anim.h" -#include "lv_text.h" -#include "lv_types.h" -#include "lv_assert.h" -#include "lv_bidi.h" -#include "../layouts/lv_layout.h" - -/********************* - * DEFINES - *********************/ - -#define LV_STYLE_SENTINEL_VALUE 0xAABBCCDD - -/* - * Flags for style behavior - */ -#define LV_STYLE_PROP_FLAG_NONE (0) /**< No special behavior */ -#define LV_STYLE_PROP_FLAG_INHERITABLE (1 << 0) /**< Inherited */ -#define LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE (1 << 1) /**< Requires ext. draw size update when changed */ -#define LV_STYLE_PROP_FLAG_LAYOUT_UPDATE (1 << 2) /**< Requires layout update when changed */ -#define LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE (1 << 3) /**< Requires layout update on parent when changed */ -#define LV_STYLE_PROP_FLAG_LAYER_UPDATE (1 << 4) /**< Affects layer handling */ -#define LV_STYLE_PROP_FLAG_TRANSFORM (1 << 5) /**< Affects the object's transformation */ -#define LV_STYLE_PROP_FLAG_ALL (0x3F) /**< Indicating all flags */ - -/* - * Other constants - */ -#define LV_SCALE_NONE 256 /**< Value for not zooming the image */ -LV_EXPORT_CONST_INT(LV_SCALE_NONE); - -// *INDENT-OFF* -#if LV_USE_ASSERT_STYLE -#define LV_STYLE_CONST_INIT(var_name, prop_array) \ - const lv_style_t var_name = { \ - .sentinel = LV_STYLE_SENTINEL_VALUE, \ - .values_and_props = (void*)prop_array, \ - .has_group = 0xFFFFFFFF, \ - .prop_cnt = 255 \ - } -#else -#define LV_STYLE_CONST_INIT(var_name, prop_array) \ - const lv_style_t var_name = { \ - .values_and_props = prop_array, \ - .has_group = 0xFFFFFFFF, \ - .prop_cnt = 255, \ - } -#endif -// *INDENT-ON* - -#define LV_STYLE_CONST_PROPS_END { .prop = LV_STYLE_PROP_INV, .value = { .num = 0 } } - -/********************** - * TYPEDEFS - **********************/ - -/** - * Possible options for blending opaque drawings - */ -typedef enum { - LV_BLEND_MODE_NORMAL, /**< Simply mix according to the opacity value*/ - LV_BLEND_MODE_ADDITIVE, /**< Add the respective color channels*/ - LV_BLEND_MODE_SUBTRACTIVE,/**< Subtract the foreground from the background*/ - LV_BLEND_MODE_MULTIPLY, /**< Multiply the foreground and background*/ -} lv_blend_mode_t; - -/** - * Some options to apply decorations on texts. - * 'OR'ed values can be used. - */ -typedef enum { - LV_TEXT_DECOR_NONE = 0x00, - LV_TEXT_DECOR_UNDERLINE = 0x01, - LV_TEXT_DECOR_STRIKETHROUGH = 0x02, -} lv_text_decor_t; - -/** - * Selects on which sides border should be drawn - * 'OR'ed values can be used. - */ -typedef enum { - LV_BORDER_SIDE_NONE = 0x00, - LV_BORDER_SIDE_BOTTOM = 0x01, - LV_BORDER_SIDE_TOP = 0x02, - LV_BORDER_SIDE_LEFT = 0x04, - LV_BORDER_SIDE_RIGHT = 0x08, - LV_BORDER_SIDE_FULL = 0x0F, - LV_BORDER_SIDE_INTERNAL = 0x10, /**< FOR matrix-like objects (e.g. Button matrix)*/ -} lv_border_side_t; - -/** - * The direction of the gradient. - */ -typedef enum { - LV_GRAD_DIR_NONE, /**< No gradient (the `grad_color` property is ignored)*/ - LV_GRAD_DIR_VER, /**< Simple vertical (top to bottom) gradient*/ - LV_GRAD_DIR_HOR, /**< Simple horizontal (left to right) gradient*/ - LV_GRAD_DIR_LINEAR, /**< Linear gradient defined by start and end points. Can be at any angle.*/ - LV_GRAD_DIR_RADIAL, /**< Radial gradient defined by start and end circles*/ - LV_GRAD_DIR_CONICAL, /**< Conical gradient defined by center point, start and end angles*/ -} lv_grad_dir_t; - -/** - * Gradient behavior outside the defined range. -*/ -typedef enum { - LV_GRAD_EXTEND_PAD, /**< Repeat the same color*/ - LV_GRAD_EXTEND_REPEAT, /**< Repeat the pattern*/ - LV_GRAD_EXTEND_REFLECT, /**< Repeat the pattern mirrored*/ -} lv_grad_extend_t; - -/** A gradient stop definition. - * This matches a color and a position in a virtual 0-255 scale. - */ -typedef struct { - lv_color_t color; /**< The stop color */ - lv_opa_t opa; /**< The opacity of the color*/ - uint8_t frac; /**< The stop position in 1/255 unit */ -} lv_gradient_stop_t; - -/** A descriptor of a gradient. */ -typedef struct { - lv_gradient_stop_t stops[LV_GRADIENT_MAX_STOPS]; /**< A gradient stop array */ - uint8_t stops_count; /**< The number of used stops in the array */ - lv_grad_dir_t dir : 3; /**< The gradient direction. - * Any of LV_GRAD_DIR_NONE, LV_GRAD_DIR_VER, LV_GRAD_DIR_HOR, - * LV_GRAD_TYPE_LINEAR, LV_GRAD_TYPE_RADIAL, LV_GRAD_TYPE_CONICAL */ - lv_grad_extend_t extend : 2; /**< Behaviour outside the defined range. - * LV_GRAD_EXTEND_NONE, LV_GRAD_EXTEND_PAD, LV_GRAD_EXTEND_REPEAT, LV_GRAD_EXTEND_REFLECT */ -#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS - union { - /*Linear gradient parameters*/ - struct { - lv_point_t start; /**< Linear gradient vector start point */ - lv_point_t end; /**< Linear gradient vector end point */ - } linear; - /*Radial gradient parameters*/ - struct { - lv_point_t focal; /**< Center of the focal (starting) circle in local coordinates */ - /* (can be the same as the ending circle to create concentric circles) */ - lv_point_t focal_extent; /**< Point on the circle (can be the same as the center) */ - lv_point_t end; /**< Center of the ending circle in local coordinates */ - lv_point_t end_extent; /**< Point on the circle determining the radius of the gradient */ - } radial; - /*Conical gradient parameters*/ - struct { - lv_point_t center; /**< Conical gradient center point */ - int16_t start_angle; /**< Start angle 0..3600 */ - int16_t end_angle; /**< End angle 0..3600 */ - } conical; - } params; - void * state; -#endif -} lv_grad_dsc_t; - -/** - * A common type to handle all the property types in the same way. - */ -typedef union { - int32_t num; /**< Number integer number (opacity, enums, booleans or "normal" numbers)*/ - const void * ptr; /**< Constant pointers (font, cone text, etc)*/ - lv_color_t color; /**< Colors*/ -} lv_style_value_t; - -/** - * Enumeration of all built in style properties - * - * Props are split into groups of 16. When adding a new prop to a group, ensure it does not overflow into the next one. - */ -enum { - LV_STYLE_PROP_INV = 0, - - /*Group 0*/ - LV_STYLE_WIDTH = 1, - LV_STYLE_HEIGHT = 2, - LV_STYLE_LENGTH = 3, - - LV_STYLE_MIN_WIDTH = 4, - LV_STYLE_MAX_WIDTH = 5, - LV_STYLE_MIN_HEIGHT = 6, - LV_STYLE_MAX_HEIGHT = 7, - - LV_STYLE_X = 8, - LV_STYLE_Y = 9, - LV_STYLE_ALIGN = 10, - - LV_STYLE_RADIUS = 12, - - /*Group 1*/ - LV_STYLE_PAD_TOP = 16, - LV_STYLE_PAD_BOTTOM = 17, - LV_STYLE_PAD_LEFT = 18, - LV_STYLE_PAD_RIGHT = 19, - - LV_STYLE_PAD_ROW = 20, - LV_STYLE_PAD_COLUMN = 21, - LV_STYLE_LAYOUT = 22, - - LV_STYLE_MARGIN_TOP = 24, - LV_STYLE_MARGIN_BOTTOM = 25, - LV_STYLE_MARGIN_LEFT = 26, - LV_STYLE_MARGIN_RIGHT = 27, - - /*Group 2*/ - LV_STYLE_BG_COLOR = 28, - LV_STYLE_BG_OPA = 29, - - LV_STYLE_BG_GRAD_DIR = 32, - LV_STYLE_BG_MAIN_STOP = 33, - LV_STYLE_BG_GRAD_STOP = 34, - LV_STYLE_BG_GRAD_COLOR = 35, - - LV_STYLE_BG_MAIN_OPA = 36, - LV_STYLE_BG_GRAD_OPA = 37, - LV_STYLE_BG_GRAD = 38, - LV_STYLE_BASE_DIR = 39, - - LV_STYLE_BG_IMAGE_SRC = 40, - LV_STYLE_BG_IMAGE_OPA = 41, - LV_STYLE_BG_IMAGE_RECOLOR = 42, - LV_STYLE_BG_IMAGE_RECOLOR_OPA = 43, - - LV_STYLE_BG_IMAGE_TILED = 44, - LV_STYLE_CLIP_CORNER = 45, - - /*Group 3*/ - LV_STYLE_BORDER_WIDTH = 48, - LV_STYLE_BORDER_COLOR = 49, - LV_STYLE_BORDER_OPA = 50, - - LV_STYLE_BORDER_SIDE = 52, - LV_STYLE_BORDER_POST = 53, - - LV_STYLE_OUTLINE_WIDTH = 56, - LV_STYLE_OUTLINE_COLOR = 57, - LV_STYLE_OUTLINE_OPA = 58, - LV_STYLE_OUTLINE_PAD = 59, - - /*Group 4*/ - LV_STYLE_SHADOW_WIDTH = 60, - LV_STYLE_SHADOW_COLOR = 61, - LV_STYLE_SHADOW_OPA = 62, - - LV_STYLE_SHADOW_OFFSET_X = 64, - LV_STYLE_SHADOW_OFFSET_Y = 65, - LV_STYLE_SHADOW_SPREAD = 66, - - LV_STYLE_IMAGE_OPA = 68, - LV_STYLE_IMAGE_RECOLOR = 69, - LV_STYLE_IMAGE_RECOLOR_OPA = 70, - - LV_STYLE_LINE_WIDTH = 72, - LV_STYLE_LINE_DASH_WIDTH = 73, - LV_STYLE_LINE_DASH_GAP = 74, - LV_STYLE_LINE_ROUNDED = 75, - LV_STYLE_LINE_COLOR = 76, - LV_STYLE_LINE_OPA = 77, - - /*Group 5*/ - LV_STYLE_ARC_WIDTH = 80, - LV_STYLE_ARC_ROUNDED = 81, - LV_STYLE_ARC_COLOR = 82, - LV_STYLE_ARC_OPA = 83, - LV_STYLE_ARC_IMAGE_SRC = 84, - - LV_STYLE_TEXT_COLOR = 88, - LV_STYLE_TEXT_OPA = 89, - LV_STYLE_TEXT_FONT = 90, - - LV_STYLE_TEXT_LETTER_SPACE = 91, - LV_STYLE_TEXT_LINE_SPACE = 92, - LV_STYLE_TEXT_DECOR = 93, - LV_STYLE_TEXT_ALIGN = 94, - - LV_STYLE_OPA = 95, - LV_STYLE_OPA_LAYERED = 96, - LV_STYLE_COLOR_FILTER_DSC = 97, - LV_STYLE_COLOR_FILTER_OPA = 98, - LV_STYLE_ANIM = 99, - LV_STYLE_ANIM_DURATION = 100, - LV_STYLE_TRANSITION = 102, - LV_STYLE_BLEND_MODE = 103, - LV_STYLE_TRANSFORM_WIDTH = 104, - LV_STYLE_TRANSFORM_HEIGHT = 105, - LV_STYLE_TRANSLATE_X = 106, - LV_STYLE_TRANSLATE_Y = 107, - LV_STYLE_TRANSFORM_SCALE_X = 108, - LV_STYLE_TRANSFORM_SCALE_Y = 109, - LV_STYLE_TRANSFORM_ROTATION = 110, - LV_STYLE_TRANSFORM_PIVOT_X = 111, - LV_STYLE_TRANSFORM_PIVOT_Y = 112, - LV_STYLE_TRANSFORM_SKEW_X = 113, - LV_STYLE_TRANSFORM_SKEW_Y = 114, - LV_STYLE_BITMAP_MASK_SRC = 115, - LV_STYLE_ROTARY_SENSITIVITY = 116, - - LV_STYLE_FLEX_FLOW = 125, - LV_STYLE_FLEX_MAIN_PLACE = 126, - LV_STYLE_FLEX_CROSS_PLACE = 127, - LV_STYLE_FLEX_TRACK_PLACE = 128, - LV_STYLE_FLEX_GROW = 129, - - LV_STYLE_GRID_COLUMN_ALIGN = 130, - LV_STYLE_GRID_ROW_ALIGN = 131, - LV_STYLE_GRID_ROW_DSC_ARRAY = 132, - LV_STYLE_GRID_COLUMN_DSC_ARRAY = 133, - LV_STYLE_GRID_CELL_COLUMN_POS = 134, - LV_STYLE_GRID_CELL_COLUMN_SPAN = 135, - LV_STYLE_GRID_CELL_X_ALIGN = 136, - LV_STYLE_GRID_CELL_ROW_POS = 137, - LV_STYLE_GRID_CELL_ROW_SPAN = 138, - LV_STYLE_GRID_CELL_Y_ALIGN = 139, - - LV_STYLE_LAST_BUILT_IN_PROP = 140, - - LV_STYLE_NUM_BUILT_IN_PROPS = LV_STYLE_LAST_BUILT_IN_PROP + 1, - - LV_STYLE_PROP_ANY = 0xFF, - LV_STYLE_PROP_CONST = 0xFF /* magic value for const styles */ -}; - -typedef enum { - LV_STYLE_RES_NOT_FOUND, - LV_STYLE_RES_FOUND, -} lv_style_res_t; - -/** - * Descriptor for style transitions - */ -typedef struct { - const lv_style_prop_t * props; /**< An array with the properties to animate.*/ - void * user_data; /**< A custom user data that will be passed to the animation's user_data */ - lv_anim_path_cb_t path_xcb; /**< A path for the animation.*/ - uint32_t time; /**< Duration of the transition in [ms]*/ - uint32_t delay; /**< Delay before the transition in [ms]*/ -} lv_style_transition_dsc_t; - -/** - * Descriptor of a constant style property. - */ -typedef struct { - lv_style_prop_t prop; - lv_style_value_t value; -} lv_style_const_prop_t; - -/** - * Descriptor of a style (a collection of properties and values). - */ -typedef struct { - -#if LV_USE_ASSERT_STYLE - uint32_t sentinel; -#endif - - void * values_and_props; - - uint32_t has_group; - uint8_t prop_cnt; /**< 255 means it's a constant style*/ -} lv_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize a style - * @param style pointer to a style to initialize - * @note Do not call `lv_style_init` on styles that already have some properties - * because this function won't free the used memory, just sets a default state for the style. - * In other words be sure to initialize styles only once! - */ -void lv_style_init(lv_style_t * style); - -/** - * Clear all properties from a style and free all allocated memories. - * @param style pointer to a style - */ -void lv_style_reset(lv_style_t * style); - -/** - * Check if a style is constant - * @param style pointer to a style - * @return true: the style is constant - */ -static inline bool lv_style_is_const(const lv_style_t * style) -{ - if(style->prop_cnt == 255) return true; - return false; -} - -/** - * Register a new style property for custom usage - * @return a new property ID, or LV_STYLE_PROP_INV if there are no more available. - * - * Example: - * @code - * lv_style_prop_t MY_PROP; - * static inline void lv_style_set_my_prop(lv_style_t * style, lv_color_t value) { - * lv_style_value_t v = {.color = value}; lv_style_set_prop(style, MY_PROP, v); } - * - * ... - * MY_PROP = lv_style_register_prop(); - * ... - * lv_style_set_my_prop(&style1, lv_palette_main(LV_PALETTE_RED)); - * @endcode - */ -lv_style_prop_t lv_style_register_prop(uint8_t flag); - -/** - * Get the number of custom properties that have been registered thus far. - */ -lv_style_prop_t lv_style_get_num_custom_props(void); - -/** - * Remove a property from a style - * @param style pointer to a style - * @param prop a style property ORed with a state. - * @return true: the property was found and removed; false: the property wasn't found - */ -bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop); - -/** - * Set the value of property in a style. - * This function shouldn't be used directly by the user. - * Instead use `lv_style_set_()`. E.g. `lv_style_set_bg_color()` - * @param style pointer to style - * @param prop the ID of a property (e.g. `LV_STYLE_BG_COLOR`) - * @param value `lv_style_value_t` variable in which a field is set according to the type of `prop` - */ -void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_t value); - -/** - * Get the value of a property - * @param style pointer to a style - * @param prop the ID of a property - * @param value pointer to a `lv_style_value_t` variable to store the value - * @return LV_RESULT_INVALID: the property wasn't found in the style (`value` is unchanged) - * LV_RESULT_OK: the property was fond, and `value` is set accordingly - * @note For performance reasons there are no sanity check on `style` - */ -lv_style_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_style_value_t * value); - -/** - * Initialize a transition descriptor. - * @param tr pointer to a transition descriptor to initialize - * @param props an array with the properties to transition. The last element must be zero. - * @param path_cb an animation path (ease) callback. If `NULL` liner path will be used. - * @param time duration of the transition in [ms] - * @param delay delay before the transition in [ms] - * @param user_data any custom data that will be saved in the transition animation and will be available when `path_cb` is called - * - * Example: - * @code - * const static lv_style_prop_t trans_props[] = { LV_STYLE_BG_OPA, LV_STYLE_BG_COLOR, 0 }; - * static lv_style_transition_dsc_t trans1; - * lv_style_transition_dsc_init(&trans1, trans_props, NULL, 300, 0, NULL); - * @endcode - */ -void lv_style_transition_dsc_init(lv_style_transition_dsc_t * tr, const lv_style_prop_t props[], - lv_anim_path_cb_t path_cb, uint32_t time, uint32_t delay, void * user_data); - -/** - * Get the default value of a property - * @param prop the ID of a property - * @return the default value - */ -lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop); - -/** - * Get the value of a property - * @param style pointer to a style - * @param prop the ID of a property - * @param value pointer to a `lv_style_value_t` variable to store the value - * @return LV_RESULT_INVALID: the property wasn't found in the style (`value` is unchanged) - * LV_RESULT_OK: the property was fond, and `value` is set accordingly - * @note For performance reasons there are no sanity check on `style` - * @note This function is the same as ::lv_style_get_prop but inlined. Use it only on performance critical places - */ -static inline lv_style_res_t lv_style_get_prop_inlined(const lv_style_t * style, lv_style_prop_t prop, - lv_style_value_t * value) -{ - if(lv_style_is_const(style)) { - lv_style_const_prop_t * props = (lv_style_const_prop_t *)style->values_and_props; - uint32_t i; - for(i = 0; props[i].prop != LV_STYLE_PROP_INV; i++) { - if(props[i].prop == prop) { - *value = props[i].value; - return LV_STYLE_RES_FOUND; - } - } - } - else { - lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); - uint32_t i; - for(i = 0; i < style->prop_cnt; i++) { - if(props[i] == prop) { - lv_style_value_t * values = (lv_style_value_t *)style->values_and_props; - *value = values[i]; - return LV_STYLE_RES_FOUND; - } - } - } - return LV_STYLE_RES_NOT_FOUND; -} - -/** - * Checks if a style is empty (has no properties) - * @param style pointer to a style - * @return true if the style is empty - */ -bool lv_style_is_empty(const lv_style_t * style); - -/** - * Tell the group of a property. If the a property from a group is set in a style the (1 << group) bit of style->has_group is set. - * It allows early skipping the style if the property is not exists in the style at all. - * @param prop a style property - * @return the group [0..30] 30 means all the custom properties with index > 120 - */ -static inline uint32_t lv_style_get_prop_group(lv_style_prop_t prop) -{ - uint32_t group = prop >> 2; - if(group > 30) group = 31; /*The MSB marks all the custom properties*/ - return group; - -} - -/** - * Get the flags of a built-in or custom property. - * - * @param prop a style property - * @return the flags of the property - */ -uint8_t lv_style_prop_lookup_flags(lv_style_prop_t prop); - -#include "lv_style_gen.h" - -static inline void lv_style_set_size(lv_style_t * style, int32_t width, int32_t height) -{ - lv_style_set_width(style, width); - lv_style_set_height(style, height); -} - -static inline void lv_style_set_pad_all(lv_style_t * style, int32_t value) -{ - lv_style_set_pad_left(style, value); - lv_style_set_pad_right(style, value); - lv_style_set_pad_top(style, value); - lv_style_set_pad_bottom(style, value); -} - -static inline void lv_style_set_pad_hor(lv_style_t * style, int32_t value) -{ - lv_style_set_pad_left(style, value); - lv_style_set_pad_right(style, value); -} - -static inline void lv_style_set_pad_ver(lv_style_t * style, int32_t value) -{ - lv_style_set_pad_top(style, value); - lv_style_set_pad_bottom(style, value); -} - -static inline void lv_style_set_pad_gap(lv_style_t * style, int32_t value) -{ - lv_style_set_pad_row(style, value); - lv_style_set_pad_column(style, value); -} - -static inline void lv_style_set_transform_scale(lv_style_t * style, int32_t value) -{ - lv_style_set_transform_scale_x(style, value); - lv_style_set_transform_scale_y(style, value); -} - -/** - * @brief Check if the style property has a specified behavioral flag. - * - * Do not pass multiple flags to this function as backwards-compatibility is not guaranteed - * for that. - * - * @param prop Property ID - * @param flag Flag - * @return true if the flag is set for this property - */ -static inline bool lv_style_prop_has_flag(lv_style_prop_t prop, uint8_t flag) -{ - return lv_style_prop_lookup_flags(prop) & flag; -} - -/************************* - * GLOBAL VARIABLES - *************************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t lv_style_const_prop_id_inv; - -/********************** - * MACROS - **********************/ - -#if LV_USE_ASSERT_STYLE -# define LV_ASSERT_STYLE(style_p) \ - do { \ - LV_ASSERT_MSG(style_p != NULL, "The style is NULL"); \ - LV_ASSERT_MSG(style_p->sentinel == LV_STYLE_SENTINEL_VALUE, "Style is not initialized or corrupted"); \ - } while(0) -#else -# define LV_ASSERT_STYLE(p) do{}while(0) -#endif - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_STYLE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style_gen.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style_gen.c deleted file mode 100644 index 233cf7b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style_gen.c +++ /dev/null @@ -1,897 +0,0 @@ - -/* - ********************************************************************** - * DO NOT EDIT - * This file is automatically generated by "style_api_gen.py" - ********************************************************************** - */ - - -#include "lv_style.h" - - -void lv_style_set_width(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_WIDTH, v); -} - -void lv_style_set_min_width(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_MIN_WIDTH, v); -} - -void lv_style_set_max_width(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_MAX_WIDTH, v); -} - -void lv_style_set_height(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_HEIGHT, v); -} - -void lv_style_set_min_height(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_MIN_HEIGHT, v); -} - -void lv_style_set_max_height(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_MAX_HEIGHT, v); -} - -void lv_style_set_length(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_LENGTH, v); -} - -void lv_style_set_x(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_X, v); -} - -void lv_style_set_y(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_Y, v); -} - -void lv_style_set_align(lv_style_t * style, lv_align_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_ALIGN, v); -} - -void lv_style_set_transform_width(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TRANSFORM_WIDTH, v); -} - -void lv_style_set_transform_height(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TRANSFORM_HEIGHT, v); -} - -void lv_style_set_translate_x(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TRANSLATE_X, v); -} - -void lv_style_set_translate_y(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TRANSLATE_Y, v); -} - -void lv_style_set_transform_scale_x(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TRANSFORM_SCALE_X, v); -} - -void lv_style_set_transform_scale_y(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TRANSFORM_SCALE_Y, v); -} - -void lv_style_set_transform_rotation(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TRANSFORM_ROTATION, v); -} - -void lv_style_set_transform_pivot_x(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TRANSFORM_PIVOT_X, v); -} - -void lv_style_set_transform_pivot_y(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TRANSFORM_PIVOT_Y, v); -} - -void lv_style_set_transform_skew_x(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TRANSFORM_SKEW_X, v); -} - -void lv_style_set_transform_skew_y(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TRANSFORM_SKEW_Y, v); -} - -void lv_style_set_pad_top(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_PAD_TOP, v); -} - -void lv_style_set_pad_bottom(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_PAD_BOTTOM, v); -} - -void lv_style_set_pad_left(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_PAD_LEFT, v); -} - -void lv_style_set_pad_right(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_PAD_RIGHT, v); -} - -void lv_style_set_pad_row(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_PAD_ROW, v); -} - -void lv_style_set_pad_column(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_PAD_COLUMN, v); -} - -void lv_style_set_margin_top(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_MARGIN_TOP, v); -} - -void lv_style_set_margin_bottom(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_MARGIN_BOTTOM, v); -} - -void lv_style_set_margin_left(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_MARGIN_LEFT, v); -} - -void lv_style_set_margin_right(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_MARGIN_RIGHT, v); -} - -void lv_style_set_bg_color(lv_style_t * style, lv_color_t value) -{ - lv_style_value_t v = { - .color = value - }; - lv_style_set_prop(style, LV_STYLE_BG_COLOR, v); -} - -void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BG_OPA, v); -} - -void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value) -{ - lv_style_value_t v = { - .color = value - }; - lv_style_set_prop(style, LV_STYLE_BG_GRAD_COLOR, v); -} - -void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BG_GRAD_DIR, v); -} - -void lv_style_set_bg_main_stop(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BG_MAIN_STOP, v); -} - -void lv_style_set_bg_grad_stop(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BG_GRAD_STOP, v); -} - -void lv_style_set_bg_main_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BG_MAIN_OPA, v); -} - -void lv_style_set_bg_grad_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BG_GRAD_OPA, v); -} - -void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_style_set_prop(style, LV_STYLE_BG_GRAD, v); -} - -void lv_style_set_bg_image_src(lv_style_t * style, const void * value) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_style_set_prop(style, LV_STYLE_BG_IMAGE_SRC, v); -} - -void lv_style_set_bg_image_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BG_IMAGE_OPA, v); -} - -void lv_style_set_bg_image_recolor(lv_style_t * style, lv_color_t value) -{ - lv_style_value_t v = { - .color = value - }; - lv_style_set_prop(style, LV_STYLE_BG_IMAGE_RECOLOR, v); -} - -void lv_style_set_bg_image_recolor_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BG_IMAGE_RECOLOR_OPA, v); -} - -void lv_style_set_bg_image_tiled(lv_style_t * style, bool value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BG_IMAGE_TILED, v); -} - -void lv_style_set_border_color(lv_style_t * style, lv_color_t value) -{ - lv_style_value_t v = { - .color = value - }; - lv_style_set_prop(style, LV_STYLE_BORDER_COLOR, v); -} - -void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BORDER_OPA, v); -} - -void lv_style_set_border_width(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BORDER_WIDTH, v); -} - -void lv_style_set_border_side(lv_style_t * style, lv_border_side_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BORDER_SIDE, v); -} - -void lv_style_set_border_post(lv_style_t * style, bool value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BORDER_POST, v); -} - -void lv_style_set_outline_width(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_OUTLINE_WIDTH, v); -} - -void lv_style_set_outline_color(lv_style_t * style, lv_color_t value) -{ - lv_style_value_t v = { - .color = value - }; - lv_style_set_prop(style, LV_STYLE_OUTLINE_COLOR, v); -} - -void lv_style_set_outline_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_OUTLINE_OPA, v); -} - -void lv_style_set_outline_pad(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_OUTLINE_PAD, v); -} - -void lv_style_set_shadow_width(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_SHADOW_WIDTH, v); -} - -void lv_style_set_shadow_offset_x(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_SHADOW_OFFSET_X, v); -} - -void lv_style_set_shadow_offset_y(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_SHADOW_OFFSET_Y, v); -} - -void lv_style_set_shadow_spread(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_SHADOW_SPREAD, v); -} - -void lv_style_set_shadow_color(lv_style_t * style, lv_color_t value) -{ - lv_style_value_t v = { - .color = value - }; - lv_style_set_prop(style, LV_STYLE_SHADOW_COLOR, v); -} - -void lv_style_set_shadow_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_SHADOW_OPA, v); -} - -void lv_style_set_image_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_IMAGE_OPA, v); -} - -void lv_style_set_image_recolor(lv_style_t * style, lv_color_t value) -{ - lv_style_value_t v = { - .color = value - }; - lv_style_set_prop(style, LV_STYLE_IMAGE_RECOLOR, v); -} - -void lv_style_set_image_recolor_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_IMAGE_RECOLOR_OPA, v); -} - -void lv_style_set_line_width(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_LINE_WIDTH, v); -} - -void lv_style_set_line_dash_width(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_LINE_DASH_WIDTH, v); -} - -void lv_style_set_line_dash_gap(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_LINE_DASH_GAP, v); -} - -void lv_style_set_line_rounded(lv_style_t * style, bool value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_LINE_ROUNDED, v); -} - -void lv_style_set_line_color(lv_style_t * style, lv_color_t value) -{ - lv_style_value_t v = { - .color = value - }; - lv_style_set_prop(style, LV_STYLE_LINE_COLOR, v); -} - -void lv_style_set_line_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_LINE_OPA, v); -} - -void lv_style_set_arc_width(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_ARC_WIDTH, v); -} - -void lv_style_set_arc_rounded(lv_style_t * style, bool value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_ARC_ROUNDED, v); -} - -void lv_style_set_arc_color(lv_style_t * style, lv_color_t value) -{ - lv_style_value_t v = { - .color = value - }; - lv_style_set_prop(style, LV_STYLE_ARC_COLOR, v); -} - -void lv_style_set_arc_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_ARC_OPA, v); -} - -void lv_style_set_arc_image_src(lv_style_t * style, const void * value) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_style_set_prop(style, LV_STYLE_ARC_IMAGE_SRC, v); -} - -void lv_style_set_text_color(lv_style_t * style, lv_color_t value) -{ - lv_style_value_t v = { - .color = value - }; - lv_style_set_prop(style, LV_STYLE_TEXT_COLOR, v); -} - -void lv_style_set_text_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TEXT_OPA, v); -} - -void lv_style_set_text_font(lv_style_t * style, const lv_font_t * value) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_style_set_prop(style, LV_STYLE_TEXT_FONT, v); -} - -void lv_style_set_text_letter_space(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TEXT_LETTER_SPACE, v); -} - -void lv_style_set_text_line_space(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TEXT_LINE_SPACE, v); -} - -void lv_style_set_text_decor(lv_style_t * style, lv_text_decor_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TEXT_DECOR, v); -} - -void lv_style_set_text_align(lv_style_t * style, lv_text_align_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_TEXT_ALIGN, v); -} - -void lv_style_set_radius(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_RADIUS, v); -} - -void lv_style_set_clip_corner(lv_style_t * style, bool value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_CLIP_CORNER, v); -} - -void lv_style_set_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_OPA, v); -} - -void lv_style_set_opa_layered(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_OPA_LAYERED, v); -} - -void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_style_set_prop(style, LV_STYLE_COLOR_FILTER_DSC, v); -} - -void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_COLOR_FILTER_OPA, v); -} - -void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_style_set_prop(style, LV_STYLE_ANIM, v); -} - -void lv_style_set_anim_duration(lv_style_t * style, uint32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_ANIM_DURATION, v); -} - -void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t * value) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_style_set_prop(style, LV_STYLE_TRANSITION, v); -} - -void lv_style_set_blend_mode(lv_style_t * style, lv_blend_mode_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BLEND_MODE, v); -} - -void lv_style_set_layout(lv_style_t * style, uint16_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_LAYOUT, v); -} - -void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_BASE_DIR, v); -} - -void lv_style_set_bitmap_mask_src(lv_style_t * style, const void * value) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_style_set_prop(style, LV_STYLE_BITMAP_MASK_SRC, v); -} - -void lv_style_set_rotary_sensitivity(lv_style_t * style, uint32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_ROTARY_SENSITIVITY, v); -} -#if LV_USE_FLEX - -void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_FLEX_FLOW, v); -} - -void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_FLEX_MAIN_PLACE, v); -} - -void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_FLEX_CROSS_PLACE, v); -} - -void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_FLEX_TRACK_PLACE, v); -} - -void lv_style_set_flex_grow(lv_style_t * style, uint8_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_FLEX_GROW, v); -} -#endif /*LV_USE_FLEX*/ - -#if LV_USE_GRID - -void lv_style_set_grid_column_dsc_array(lv_style_t * style, const int32_t * value) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_style_set_prop(style, LV_STYLE_GRID_COLUMN_DSC_ARRAY, v); -} - -void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_GRID_COLUMN_ALIGN, v); -} - -void lv_style_set_grid_row_dsc_array(lv_style_t * style, const int32_t * value) -{ - lv_style_value_t v = { - .ptr = value - }; - lv_style_set_prop(style, LV_STYLE_GRID_ROW_DSC_ARRAY, v); -} - -void lv_style_set_grid_row_align(lv_style_t * style, lv_grid_align_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_GRID_ROW_ALIGN, v); -} - -void lv_style_set_grid_cell_column_pos(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_GRID_CELL_COLUMN_POS, v); -} - -void lv_style_set_grid_cell_x_align(lv_style_t * style, lv_grid_align_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_GRID_CELL_X_ALIGN, v); -} - -void lv_style_set_grid_cell_column_span(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_GRID_CELL_COLUMN_SPAN, v); -} - -void lv_style_set_grid_cell_row_pos(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_GRID_CELL_ROW_POS, v); -} - -void lv_style_set_grid_cell_y_align(lv_style_t * style, lv_grid_align_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_GRID_CELL_Y_ALIGN, v); -} - -void lv_style_set_grid_cell_row_span(lv_style_t * style, int32_t value) -{ - lv_style_value_t v = { - .num = (int32_t)value - }; - lv_style_set_prop(style, LV_STYLE_GRID_CELL_ROW_SPAN, v); -} -#endif /*LV_USE_GRID*/ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style_gen.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style_gen.h deleted file mode 100644 index 5714e74..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style_gen.h +++ /dev/null @@ -1,694 +0,0 @@ - -/* - ********************************************************************** - * DO NOT EDIT - * This file is automatically generated by "style_api_gen.py" - ********************************************************************** - */ - - -#ifndef LV_STYLE_GEN_H -#define LV_STYLE_GEN_H - -#ifdef __cplusplus -extern "C" { -#endif - -void lv_style_set_width(lv_style_t * style, int32_t value); -void lv_style_set_min_width(lv_style_t * style, int32_t value); -void lv_style_set_max_width(lv_style_t * style, int32_t value); -void lv_style_set_height(lv_style_t * style, int32_t value); -void lv_style_set_min_height(lv_style_t * style, int32_t value); -void lv_style_set_max_height(lv_style_t * style, int32_t value); -void lv_style_set_length(lv_style_t * style, int32_t value); -void lv_style_set_x(lv_style_t * style, int32_t value); -void lv_style_set_y(lv_style_t * style, int32_t value); -void lv_style_set_align(lv_style_t * style, lv_align_t value); -void lv_style_set_transform_width(lv_style_t * style, int32_t value); -void lv_style_set_transform_height(lv_style_t * style, int32_t value); -void lv_style_set_translate_x(lv_style_t * style, int32_t value); -void lv_style_set_translate_y(lv_style_t * style, int32_t value); -void lv_style_set_transform_scale_x(lv_style_t * style, int32_t value); -void lv_style_set_transform_scale_y(lv_style_t * style, int32_t value); -void lv_style_set_transform_rotation(lv_style_t * style, int32_t value); -void lv_style_set_transform_pivot_x(lv_style_t * style, int32_t value); -void lv_style_set_transform_pivot_y(lv_style_t * style, int32_t value); -void lv_style_set_transform_skew_x(lv_style_t * style, int32_t value); -void lv_style_set_transform_skew_y(lv_style_t * style, int32_t value); -void lv_style_set_pad_top(lv_style_t * style, int32_t value); -void lv_style_set_pad_bottom(lv_style_t * style, int32_t value); -void lv_style_set_pad_left(lv_style_t * style, int32_t value); -void lv_style_set_pad_right(lv_style_t * style, int32_t value); -void lv_style_set_pad_row(lv_style_t * style, int32_t value); -void lv_style_set_pad_column(lv_style_t * style, int32_t value); -void lv_style_set_margin_top(lv_style_t * style, int32_t value); -void lv_style_set_margin_bottom(lv_style_t * style, int32_t value); -void lv_style_set_margin_left(lv_style_t * style, int32_t value); -void lv_style_set_margin_right(lv_style_t * style, int32_t value); -void lv_style_set_bg_color(lv_style_t * style, lv_color_t value); -void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value); -void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value); -void lv_style_set_bg_main_stop(lv_style_t * style, int32_t value); -void lv_style_set_bg_grad_stop(lv_style_t * style, int32_t value); -void lv_style_set_bg_main_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_bg_grad_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value); -void lv_style_set_bg_image_src(lv_style_t * style, const void * value); -void lv_style_set_bg_image_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_bg_image_recolor(lv_style_t * style, lv_color_t value); -void lv_style_set_bg_image_recolor_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_bg_image_tiled(lv_style_t * style, bool value); -void lv_style_set_border_color(lv_style_t * style, lv_color_t value); -void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_border_width(lv_style_t * style, int32_t value); -void lv_style_set_border_side(lv_style_t * style, lv_border_side_t value); -void lv_style_set_border_post(lv_style_t * style, bool value); -void lv_style_set_outline_width(lv_style_t * style, int32_t value); -void lv_style_set_outline_color(lv_style_t * style, lv_color_t value); -void lv_style_set_outline_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_outline_pad(lv_style_t * style, int32_t value); -void lv_style_set_shadow_width(lv_style_t * style, int32_t value); -void lv_style_set_shadow_offset_x(lv_style_t * style, int32_t value); -void lv_style_set_shadow_offset_y(lv_style_t * style, int32_t value); -void lv_style_set_shadow_spread(lv_style_t * style, int32_t value); -void lv_style_set_shadow_color(lv_style_t * style, lv_color_t value); -void lv_style_set_shadow_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_image_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_image_recolor(lv_style_t * style, lv_color_t value); -void lv_style_set_image_recolor_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_line_width(lv_style_t * style, int32_t value); -void lv_style_set_line_dash_width(lv_style_t * style, int32_t value); -void lv_style_set_line_dash_gap(lv_style_t * style, int32_t value); -void lv_style_set_line_rounded(lv_style_t * style, bool value); -void lv_style_set_line_color(lv_style_t * style, lv_color_t value); -void lv_style_set_line_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_arc_width(lv_style_t * style, int32_t value); -void lv_style_set_arc_rounded(lv_style_t * style, bool value); -void lv_style_set_arc_color(lv_style_t * style, lv_color_t value); -void lv_style_set_arc_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_arc_image_src(lv_style_t * style, const void * value); -void lv_style_set_text_color(lv_style_t * style, lv_color_t value); -void lv_style_set_text_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_text_font(lv_style_t * style, const lv_font_t * value); -void lv_style_set_text_letter_space(lv_style_t * style, int32_t value); -void lv_style_set_text_line_space(lv_style_t * style, int32_t value); -void lv_style_set_text_decor(lv_style_t * style, lv_text_decor_t value); -void lv_style_set_text_align(lv_style_t * style, lv_text_align_t value); -void lv_style_set_radius(lv_style_t * style, int32_t value); -void lv_style_set_clip_corner(lv_style_t * style, bool value); -void lv_style_set_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_opa_layered(lv_style_t * style, lv_opa_t value); -void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value); -void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value); -void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value); -void lv_style_set_anim_duration(lv_style_t * style, uint32_t value); -void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t * value); -void lv_style_set_blend_mode(lv_style_t * style, lv_blend_mode_t value); -void lv_style_set_layout(lv_style_t * style, uint16_t value); -void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value); -void lv_style_set_bitmap_mask_src(lv_style_t * style, const void * value); -void lv_style_set_rotary_sensitivity(lv_style_t * style, uint32_t value); -#if LV_USE_FLEX -void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value); -void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value); -void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value); -void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value); -void lv_style_set_flex_grow(lv_style_t * style, uint8_t value); -#endif /*LV_USE_FLEX*/ - -#if LV_USE_GRID -void lv_style_set_grid_column_dsc_array(lv_style_t * style, const int32_t * value); -void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value); -void lv_style_set_grid_row_dsc_array(lv_style_t * style, const int32_t * value); -void lv_style_set_grid_row_align(lv_style_t * style, lv_grid_align_t value); -void lv_style_set_grid_cell_column_pos(lv_style_t * style, int32_t value); -void lv_style_set_grid_cell_x_align(lv_style_t * style, lv_grid_align_t value); -void lv_style_set_grid_cell_column_span(lv_style_t * style, int32_t value); -void lv_style_set_grid_cell_row_pos(lv_style_t * style, int32_t value); -void lv_style_set_grid_cell_y_align(lv_style_t * style, lv_grid_align_t value); -void lv_style_set_grid_cell_row_span(lv_style_t * style, int32_t value); -#endif /*LV_USE_GRID*/ - - -#define LV_STYLE_CONST_WIDTH(val) \ - { \ - .prop = LV_STYLE_WIDTH, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_MIN_WIDTH(val) \ - { \ - .prop = LV_STYLE_MIN_WIDTH, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_MAX_WIDTH(val) \ - { \ - .prop = LV_STYLE_MAX_WIDTH, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_HEIGHT(val) \ - { \ - .prop = LV_STYLE_HEIGHT, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_MIN_HEIGHT(val) \ - { \ - .prop = LV_STYLE_MIN_HEIGHT, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_MAX_HEIGHT(val) \ - { \ - .prop = LV_STYLE_MAX_HEIGHT, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_LENGTH(val) \ - { \ - .prop = LV_STYLE_LENGTH, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_X(val) \ - { \ - .prop = LV_STYLE_X, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_Y(val) \ - { \ - .prop = LV_STYLE_Y, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_ALIGN(val) \ - { \ - .prop = LV_STYLE_ALIGN, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TRANSFORM_WIDTH(val) \ - { \ - .prop = LV_STYLE_TRANSFORM_WIDTH, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TRANSFORM_HEIGHT(val) \ - { \ - .prop = LV_STYLE_TRANSFORM_HEIGHT, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TRANSLATE_X(val) \ - { \ - .prop = LV_STYLE_TRANSLATE_X, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TRANSLATE_Y(val) \ - { \ - .prop = LV_STYLE_TRANSLATE_Y, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TRANSFORM_SCALE_X(val) \ - { \ - .prop = LV_STYLE_TRANSFORM_SCALE_X, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TRANSFORM_SCALE_Y(val) \ - { \ - .prop = LV_STYLE_TRANSFORM_SCALE_Y, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TRANSFORM_ROTATION(val) \ - { \ - .prop = LV_STYLE_TRANSFORM_ROTATION, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TRANSFORM_PIVOT_X(val) \ - { \ - .prop = LV_STYLE_TRANSFORM_PIVOT_X, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TRANSFORM_PIVOT_Y(val) \ - { \ - .prop = LV_STYLE_TRANSFORM_PIVOT_Y, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TRANSFORM_SKEW_X(val) \ - { \ - .prop = LV_STYLE_TRANSFORM_SKEW_X, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TRANSFORM_SKEW_Y(val) \ - { \ - .prop = LV_STYLE_TRANSFORM_SKEW_Y, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_PAD_TOP(val) \ - { \ - .prop = LV_STYLE_PAD_TOP, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_PAD_BOTTOM(val) \ - { \ - .prop = LV_STYLE_PAD_BOTTOM, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_PAD_LEFT(val) \ - { \ - .prop = LV_STYLE_PAD_LEFT, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_PAD_RIGHT(val) \ - { \ - .prop = LV_STYLE_PAD_RIGHT, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_PAD_ROW(val) \ - { \ - .prop = LV_STYLE_PAD_ROW, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_PAD_COLUMN(val) \ - { \ - .prop = LV_STYLE_PAD_COLUMN, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_MARGIN_TOP(val) \ - { \ - .prop = LV_STYLE_MARGIN_TOP, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_MARGIN_BOTTOM(val) \ - { \ - .prop = LV_STYLE_MARGIN_BOTTOM, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_MARGIN_LEFT(val) \ - { \ - .prop = LV_STYLE_MARGIN_LEFT, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_MARGIN_RIGHT(val) \ - { \ - .prop = LV_STYLE_MARGIN_RIGHT, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BG_COLOR(val) \ - { \ - .prop = LV_STYLE_BG_COLOR, .value = { .color = val } \ - } - -#define LV_STYLE_CONST_BG_OPA(val) \ - { \ - .prop = LV_STYLE_BG_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BG_GRAD_COLOR(val) \ - { \ - .prop = LV_STYLE_BG_GRAD_COLOR, .value = { .color = val } \ - } - -#define LV_STYLE_CONST_BG_GRAD_DIR(val) \ - { \ - .prop = LV_STYLE_BG_GRAD_DIR, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BG_MAIN_STOP(val) \ - { \ - .prop = LV_STYLE_BG_MAIN_STOP, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BG_GRAD_STOP(val) \ - { \ - .prop = LV_STYLE_BG_GRAD_STOP, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BG_MAIN_OPA(val) \ - { \ - .prop = LV_STYLE_BG_MAIN_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BG_GRAD_OPA(val) \ - { \ - .prop = LV_STYLE_BG_GRAD_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BG_GRAD(val) \ - { \ - .prop = LV_STYLE_BG_GRAD, .value = { .ptr = val } \ - } - -#define LV_STYLE_CONST_BG_IMAGE_SRC(val) \ - { \ - .prop = LV_STYLE_BG_IMAGE_SRC, .value = { .ptr = val } \ - } - -#define LV_STYLE_CONST_BG_IMAGE_OPA(val) \ - { \ - .prop = LV_STYLE_BG_IMAGE_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BG_IMAGE_RECOLOR(val) \ - { \ - .prop = LV_STYLE_BG_IMAGE_RECOLOR, .value = { .color = val } \ - } - -#define LV_STYLE_CONST_BG_IMAGE_RECOLOR_OPA(val) \ - { \ - .prop = LV_STYLE_BG_IMAGE_RECOLOR_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BG_IMAGE_TILED(val) \ - { \ - .prop = LV_STYLE_BG_IMAGE_TILED, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BORDER_COLOR(val) \ - { \ - .prop = LV_STYLE_BORDER_COLOR, .value = { .color = val } \ - } - -#define LV_STYLE_CONST_BORDER_OPA(val) \ - { \ - .prop = LV_STYLE_BORDER_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BORDER_WIDTH(val) \ - { \ - .prop = LV_STYLE_BORDER_WIDTH, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BORDER_SIDE(val) \ - { \ - .prop = LV_STYLE_BORDER_SIDE, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BORDER_POST(val) \ - { \ - .prop = LV_STYLE_BORDER_POST, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_OUTLINE_WIDTH(val) \ - { \ - .prop = LV_STYLE_OUTLINE_WIDTH, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_OUTLINE_COLOR(val) \ - { \ - .prop = LV_STYLE_OUTLINE_COLOR, .value = { .color = val } \ - } - -#define LV_STYLE_CONST_OUTLINE_OPA(val) \ - { \ - .prop = LV_STYLE_OUTLINE_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_OUTLINE_PAD(val) \ - { \ - .prop = LV_STYLE_OUTLINE_PAD, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_SHADOW_WIDTH(val) \ - { \ - .prop = LV_STYLE_SHADOW_WIDTH, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_SHADOW_OFFSET_X(val) \ - { \ - .prop = LV_STYLE_SHADOW_OFFSET_X, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_SHADOW_OFFSET_Y(val) \ - { \ - .prop = LV_STYLE_SHADOW_OFFSET_Y, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_SHADOW_SPREAD(val) \ - { \ - .prop = LV_STYLE_SHADOW_SPREAD, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_SHADOW_COLOR(val) \ - { \ - .prop = LV_STYLE_SHADOW_COLOR, .value = { .color = val } \ - } - -#define LV_STYLE_CONST_SHADOW_OPA(val) \ - { \ - .prop = LV_STYLE_SHADOW_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_IMAGE_OPA(val) \ - { \ - .prop = LV_STYLE_IMAGE_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_IMAGE_RECOLOR(val) \ - { \ - .prop = LV_STYLE_IMAGE_RECOLOR, .value = { .color = val } \ - } - -#define LV_STYLE_CONST_IMAGE_RECOLOR_OPA(val) \ - { \ - .prop = LV_STYLE_IMAGE_RECOLOR_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_LINE_WIDTH(val) \ - { \ - .prop = LV_STYLE_LINE_WIDTH, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_LINE_DASH_WIDTH(val) \ - { \ - .prop = LV_STYLE_LINE_DASH_WIDTH, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_LINE_DASH_GAP(val) \ - { \ - .prop = LV_STYLE_LINE_DASH_GAP, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_LINE_ROUNDED(val) \ - { \ - .prop = LV_STYLE_LINE_ROUNDED, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_LINE_COLOR(val) \ - { \ - .prop = LV_STYLE_LINE_COLOR, .value = { .color = val } \ - } - -#define LV_STYLE_CONST_LINE_OPA(val) \ - { \ - .prop = LV_STYLE_LINE_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_ARC_WIDTH(val) \ - { \ - .prop = LV_STYLE_ARC_WIDTH, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_ARC_ROUNDED(val) \ - { \ - .prop = LV_STYLE_ARC_ROUNDED, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_ARC_COLOR(val) \ - { \ - .prop = LV_STYLE_ARC_COLOR, .value = { .color = val } \ - } - -#define LV_STYLE_CONST_ARC_OPA(val) \ - { \ - .prop = LV_STYLE_ARC_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_ARC_IMAGE_SRC(val) \ - { \ - .prop = LV_STYLE_ARC_IMAGE_SRC, .value = { .ptr = val } \ - } - -#define LV_STYLE_CONST_TEXT_COLOR(val) \ - { \ - .prop = LV_STYLE_TEXT_COLOR, .value = { .color = val } \ - } - -#define LV_STYLE_CONST_TEXT_OPA(val) \ - { \ - .prop = LV_STYLE_TEXT_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TEXT_FONT(val) \ - { \ - .prop = LV_STYLE_TEXT_FONT, .value = { .ptr = val } \ - } - -#define LV_STYLE_CONST_TEXT_LETTER_SPACE(val) \ - { \ - .prop = LV_STYLE_TEXT_LETTER_SPACE, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TEXT_LINE_SPACE(val) \ - { \ - .prop = LV_STYLE_TEXT_LINE_SPACE, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TEXT_DECOR(val) \ - { \ - .prop = LV_STYLE_TEXT_DECOR, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TEXT_ALIGN(val) \ - { \ - .prop = LV_STYLE_TEXT_ALIGN, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_RADIUS(val) \ - { \ - .prop = LV_STYLE_RADIUS, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_CLIP_CORNER(val) \ - { \ - .prop = LV_STYLE_CLIP_CORNER, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_OPA(val) \ - { \ - .prop = LV_STYLE_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_OPA_LAYERED(val) \ - { \ - .prop = LV_STYLE_OPA_LAYERED, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_COLOR_FILTER_DSC(val) \ - { \ - .prop = LV_STYLE_COLOR_FILTER_DSC, .value = { .ptr = val } \ - } - -#define LV_STYLE_CONST_COLOR_FILTER_OPA(val) \ - { \ - .prop = LV_STYLE_COLOR_FILTER_OPA, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_ANIM(val) \ - { \ - .prop = LV_STYLE_ANIM, .value = { .ptr = val } \ - } - -#define LV_STYLE_CONST_ANIM_DURATION(val) \ - { \ - .prop = LV_STYLE_ANIM_DURATION, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_TRANSITION(val) \ - { \ - .prop = LV_STYLE_TRANSITION, .value = { .ptr = val } \ - } - -#define LV_STYLE_CONST_BLEND_MODE(val) \ - { \ - .prop = LV_STYLE_BLEND_MODE, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_LAYOUT(val) \ - { \ - .prop = LV_STYLE_LAYOUT, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BASE_DIR(val) \ - { \ - .prop = LV_STYLE_BASE_DIR, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_BITMAP_MASK_SRC(val) \ - { \ - .prop = LV_STYLE_BITMAP_MASK_SRC, .value = { .ptr = val } \ - } - -#define LV_STYLE_CONST_ROTARY_SENSITIVITY(val) \ - { \ - .prop = LV_STYLE_ROTARY_SENSITIVITY, .value = { .num = (int32_t)val } \ - } -#if LV_USE_FLEX - -#define LV_STYLE_CONST_FLEX_FLOW(val) \ - { \ - .prop = LV_STYLE_FLEX_FLOW, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_FLEX_MAIN_PLACE(val) \ - { \ - .prop = LV_STYLE_FLEX_MAIN_PLACE, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_FLEX_CROSS_PLACE(val) \ - { \ - .prop = LV_STYLE_FLEX_CROSS_PLACE, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_FLEX_TRACK_PLACE(val) \ - { \ - .prop = LV_STYLE_FLEX_TRACK_PLACE, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_FLEX_GROW(val) \ - { \ - .prop = LV_STYLE_FLEX_GROW, .value = { .num = (int32_t)val } \ - } -#endif /*LV_USE_FLEX*/ - -#if LV_USE_GRID - -#define LV_STYLE_CONST_GRID_COLUMN_DSC_ARRAY(val) \ - { \ - .prop = LV_STYLE_GRID_COLUMN_DSC_ARRAY, .value = { .ptr = val } \ - } - -#define LV_STYLE_CONST_GRID_COLUMN_ALIGN(val) \ - { \ - .prop = LV_STYLE_GRID_COLUMN_ALIGN, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_GRID_ROW_DSC_ARRAY(val) \ - { \ - .prop = LV_STYLE_GRID_ROW_DSC_ARRAY, .value = { .ptr = val } \ - } - -#define LV_STYLE_CONST_GRID_ROW_ALIGN(val) \ - { \ - .prop = LV_STYLE_GRID_ROW_ALIGN, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_GRID_CELL_COLUMN_POS(val) \ - { \ - .prop = LV_STYLE_GRID_CELL_COLUMN_POS, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_GRID_CELL_X_ALIGN(val) \ - { \ - .prop = LV_STYLE_GRID_CELL_X_ALIGN, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_GRID_CELL_COLUMN_SPAN(val) \ - { \ - .prop = LV_STYLE_GRID_CELL_COLUMN_SPAN, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_GRID_CELL_ROW_POS(val) \ - { \ - .prop = LV_STYLE_GRID_CELL_ROW_POS, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_GRID_CELL_Y_ALIGN(val) \ - { \ - .prop = LV_STYLE_GRID_CELL_Y_ALIGN, .value = { .num = (int32_t)val } \ - } - -#define LV_STYLE_CONST_GRID_CELL_ROW_SPAN(val) \ - { \ - .prop = LV_STYLE_GRID_CELL_ROW_SPAN, .value = { .num = (int32_t)val } \ - } -#endif /*LV_USE_GRID*/ - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV_STYLE_GEN_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style_private.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style_private.h deleted file mode 100644 index 8a88185..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_style_private.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file lv_style_private.h - * - */ - -#ifndef LV_STYLE_PRIVATE_H -#define LV_STYLE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_style.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_STYLE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_templ.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_templ.c deleted file mode 100644 index 939930c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_templ.c +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @file lv_templ.c - * - */ - -/********************* - * INCLUDES - *********************/ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*This typedef exists purely to keep -Wpedantic happy when the file is empty.*/ -/*It can be removed.*/ -typedef int _keep_pedantic_happy; - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_templ.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_templ.h deleted file mode 100644 index f7e3c26..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_templ.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @file lv_templ.h - * - */ - -#ifndef LV_TEMPL_H -#define LV_TEMPL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TEMPL_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text.c deleted file mode 100644 index 11081f9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text.c +++ /dev/null @@ -1,822 +0,0 @@ -/** - * @file lv_text.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_text_private.h" -#include "lv_text_ap.h" -#include "lv_math.h" -#include "lv_log.h" -#include "lv_assert.h" -#include "../stdlib/lv_mem.h" -#include "../stdlib/lv_string.h" -#include "../misc/lv_types.h" - -/********************* - * DEFINES - *********************/ -#define NO_BREAK_FOUND UINT32_MAX - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -#if LV_TXT_ENC == LV_TXT_ENC_UTF8 - static uint8_t lv_text_utf8_size(const char * str); - static uint32_t lv_text_unicode_to_utf8(uint32_t letter_uni); - static uint32_t lv_text_utf8_conv_wc(uint32_t c); - static uint32_t lv_text_utf8_next(const char * txt, uint32_t * i); - static uint32_t lv_text_utf8_prev(const char * txt, uint32_t * i_start); - static uint32_t lv_text_utf8_get_byte_id(const char * txt, uint32_t utf8_id); - static uint32_t lv_text_utf8_get_char_id(const char * txt, uint32_t byte_id); - static uint32_t lv_text_utf8_get_length(const char * txt); -#elif LV_TXT_ENC == LV_TXT_ENC_ASCII - static uint8_t lv_text_iso8859_1_size(const char * str); - static uint32_t lv_text_unicode_to_iso8859_1(uint32_t letter_uni); - static uint32_t lv_text_iso8859_1_conv_wc(uint32_t c); - static uint32_t lv_text_iso8859_1_next(const char * txt, uint32_t * i); - static uint32_t lv_text_iso8859_1_prev(const char * txt, uint32_t * i_start); - static uint32_t lv_text_iso8859_1_get_byte_id(const char * txt, uint32_t utf8_id); - static uint32_t lv_text_iso8859_1_get_char_id(const char * txt, uint32_t byte_id); - static uint32_t lv_text_iso8859_1_get_length(const char * txt); -#endif -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * GLOBAL VARIABLES - **********************/ -#if LV_TXT_ENC == LV_TXT_ENC_UTF8 - uint8_t (*const lv_text_encoded_size)(const char *) = lv_text_utf8_size; - uint32_t (*const lv_text_unicode_to_encoded)(uint32_t) = lv_text_unicode_to_utf8; - uint32_t (*const lv_text_encoded_conv_wc)(uint32_t) = lv_text_utf8_conv_wc; - uint32_t (*const lv_text_encoded_next)(const char *, uint32_t *) = lv_text_utf8_next; - uint32_t (*const lv_text_encoded_prev)(const char *, uint32_t *) = lv_text_utf8_prev; - uint32_t (*const lv_text_encoded_get_byte_id)(const char *, uint32_t) = lv_text_utf8_get_byte_id; - uint32_t (*const lv_text_encoded_get_char_id)(const char *, uint32_t) = lv_text_utf8_get_char_id; - uint32_t (*const lv_text_get_encoded_length)(const char *) = lv_text_utf8_get_length; -#elif LV_TXT_ENC == LV_TXT_ENC_ASCII - uint8_t (*const lv_text_encoded_size)(const char *) = lv_text_iso8859_1_size; - uint32_t (*const lv_text_unicode_to_encoded)(uint32_t) = lv_text_unicode_to_iso8859_1; - uint32_t (*const lv_text_encoded_conv_wc)(uint32_t) = lv_text_iso8859_1_conv_wc; - uint32_t (*const lv_text_encoded_next)(const char *, uint32_t *) = lv_text_iso8859_1_next; - uint32_t (*const lv_text_encoded_prev)(const char *, uint32_t *) = lv_text_iso8859_1_prev; - uint32_t (*const lv_text_encoded_get_byte_id)(const char *, uint32_t) = lv_text_iso8859_1_get_byte_id; - uint32_t (*const lv_text_encoded_get_char_id)(const char *, uint32_t) = lv_text_iso8859_1_get_char_id; - uint32_t (*const lv_text_get_encoded_length)(const char *) = lv_text_iso8859_1_get_length; - -#endif - -/********************** - * MACROS - **********************/ - -#define LV_IS_ASCII(value) ((value & 0x80U) == 0x00U) -#define LV_IS_2BYTES_UTF8_CODE(value) ((value & 0xE0U) == 0xC0U) -#define LV_IS_3BYTES_UTF8_CODE(value) ((value & 0xF0U) == 0xE0U) -#define LV_IS_4BYTES_UTF8_CODE(value) ((value & 0xF8U) == 0xF0U) -#define LV_IS_INVALID_UTF8_CODE(value) ((value & 0xC0U) != 0x80U) - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_text_get_size(lv_point_t * size_res, const char * text, const lv_font_t * font, int32_t letter_space, - int32_t line_space, int32_t max_width, lv_text_flag_t flag) -{ - size_res->x = 0; - size_res->y = 0; - - if(text == NULL) return; - if(font == NULL) return; - - if(flag & LV_TEXT_FLAG_EXPAND) max_width = LV_COORD_MAX; - - uint32_t line_start = 0; - uint32_t new_line_start = 0; - uint16_t letter_height = lv_font_get_line_height(font); - - /*Calc. the height and longest line*/ - while(text[line_start] != '\0') { - new_line_start += lv_text_get_next_line(&text[line_start], font, letter_space, max_width, NULL, flag); - - if((unsigned long)size_res->y + (unsigned long)letter_height + (unsigned long)line_space > LV_MAX_OF(int32_t)) { - LV_LOG_WARN("integer overflow while calculating text height"); - return; - } - else { - size_res->y += letter_height; - size_res->y += line_space; - } - - /*Calculate the longest line*/ - int32_t act_line_length = lv_text_get_width(&text[line_start], new_line_start - line_start, font, letter_space); - - size_res->x = LV_MAX(act_line_length, size_res->x); - line_start = new_line_start; - } - - /*Make the text one line taller if the last character is '\n' or '\r'*/ - if((line_start != 0) && (text[line_start - 1] == '\n' || text[line_start - 1] == '\r')) { - size_res->y += letter_height + line_space; - } - - /*Correction with the last line space or set the height manually if the text is empty*/ - if(size_res->y == 0) - size_res->y = letter_height; - else - size_res->y -= line_space; -} - -/** - * Get the next word of text. A word is delimited by break characters. - * - * If the word cannot fit in the max_width space, obey LV_TXT_LINE_BREAK_LONG_* rules. - * - * If the next word cannot fit anything, return 0. - * - * If the first character is a break character, returns the next index. - * - * Example calls from lv_text_get_next_line() assuming sufficient max_width and - * txt = "Test text\n" - * 0123456789 - * - * Calls would be as follows: - * 1. Return i=4, pointing at breakchar ' ', for the string "Test" - * 2. Return i=5, since i=4 was a breakchar. - * 3. Return i=9, pointing at breakchar '\n' - * 4. Parenting lv_text_get_next_line() would detect subsequent '\0' - * - * TODO: Returned word_w_ptr may overestimate the returned word's width when - * max_width is reached. In current usage, this has no impact. - * - * @param txt a '\0' terminated string - * @param font pointer to a font - * @param letter_space letter space - * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid line breaks - * @param flags settings for the text from 'txt_flag_type' enum - * @param[out] word_w_ptr width (in pixels) of the parsed word. May be NULL. - * @return the index of the first char of the next word (in byte index not letter index. With UTF-8 they are different) - */ -static uint32_t lv_text_get_next_word(const char * txt, const lv_font_t * font, - int32_t letter_space, int32_t max_width, - lv_text_flag_t flag, uint32_t * word_w_ptr) -{ - if(txt == NULL || txt[0] == '\0') return 0; - if(font == NULL) return 0; - - if(flag & LV_TEXT_FLAG_EXPAND) max_width = LV_COORD_MAX; - - uint32_t i = 0, i_next = 0, i_next_next = 0; /*Iterating index into txt*/ - uint32_t letter = 0; /*Letter at i*/ - uint32_t letter_next = 0; /*Letter at i_next*/ - int32_t letter_w; - int32_t cur_w = 0; /*Pixel Width of traversed string*/ - uint32_t word_len = 0; /*Number of characters in the traversed word*/ - uint32_t break_index = NO_BREAK_FOUND; /*only used for "long" words*/ - uint32_t break_letter_count = 0; /*Number of characters up to the long word break point*/ - - letter = lv_text_encoded_next(txt, &i_next); - i_next_next = i_next; - - /*Obtain the full word, regardless if it fits or not in max_width*/ - while(txt[i] != '\0') { - letter_next = lv_text_encoded_next(txt, &i_next_next); - word_len++; - - letter_w = lv_font_get_glyph_width(font, letter, letter_next); - cur_w += letter_w; - - if(letter_w > 0) { - cur_w += letter_space; - } - - /*Test if this character fits within max_width*/ - if(break_index == NO_BREAK_FOUND && (cur_w - letter_space) > max_width) { - break_index = i; - break_letter_count = word_len - 1; - /*break_index is now pointing at the character that doesn't fit*/ - } - - /*Check for new line chars and breakchars*/ - if(letter == '\n' || letter == '\r' || lv_text_is_break_char(letter)) { - /*Update the output width on the first character if it fits. - *Must do this here in case first letter is a break character.*/ - if(i == 0 && break_index == NO_BREAK_FOUND && word_w_ptr != NULL) *word_w_ptr = cur_w; - word_len--; - break; - } - else if(lv_text_is_a_word(letter_next) || lv_text_is_a_word(letter)) { - /*Found a word for single letter, usually true for CJK*/ - *word_w_ptr = cur_w; - i = i_next; - break; - } - - /*Update the output width*/ - if(word_w_ptr != NULL && break_index == NO_BREAK_FOUND) *word_w_ptr = cur_w; - - i = i_next; - i_next = i_next_next; - letter = letter_next; - } - - /*Entire Word fits in the provided space*/ - if(break_index == NO_BREAK_FOUND) { - if(word_len == 0 || (letter == '\r' && letter_next == '\n')) i = i_next; - return i; - } - -#if LV_TXT_LINE_BREAK_LONG_LEN > 0 - /*Word doesn't fit in provided space, but isn't "long"*/ - if(word_len < LV_TXT_LINE_BREAK_LONG_LEN) { - if(flag & LV_TEXT_FLAG_BREAK_ALL) return break_index; - if(word_w_ptr != NULL) *word_w_ptr = 0; /*Return no word*/ - return 0; - } - - /*Word is "long," but insufficient amounts can fit in provided space*/ - if(break_letter_count < LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN) { - if(flag & LV_TEXT_FLAG_BREAK_ALL) return break_index; - if(word_w_ptr != NULL) *word_w_ptr = 0; - return 0; - } - - /*Word is a "long", but letters may need to be better distributed*/ - { - i = break_index; - int32_t n_move = LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN - (word_len - break_letter_count); - /*Move pointer "i" backwards*/ - for(; n_move > 0; n_move--) { - lv_text_encoded_prev(txt, &i); - /** - * TODO: it would be appropriate to update the returned - * word width hereHowever, in current usage, this doesn't impact anything. - */ - } - } - return i; -#else - if(flag & LV_TEXT_FLAG_BREAK_ALL) return break_index; - if(word_w_ptr != NULL) *word_w_ptr = 0; /*Return no word*/ - (void) break_letter_count; - return 0; -#endif -} - -uint32_t lv_text_get_next_line(const char * txt, const lv_font_t * font, - int32_t letter_space, int32_t max_width, - int32_t * used_width, lv_text_flag_t flag) -{ - if(used_width) *used_width = 0; - - if(txt == NULL) return 0; - if(txt[0] == '\0') return 0; - if(font == NULL) return 0; - - int32_t line_w = 0; - - /*If max_width doesn't matter simply find the new line character - *without thinking about word wrapping*/ - if((flag & LV_TEXT_FLAG_EXPAND) || (flag & LV_TEXT_FLAG_FIT)) { - uint32_t i; - for(i = 0; txt[i] != '\n' && txt[i] != '\r' && txt[i] != '\0'; i++) { - /*Just find the new line chars or string ends by incrementing `i`*/ - } - if(txt[i] != '\0') i++; /*To go beyond `\n`*/ - if(used_width) *used_width = -1; - return i; - } - - if(flag & LV_TEXT_FLAG_EXPAND) max_width = LV_COORD_MAX; - uint32_t i = 0; /*Iterating index into txt*/ - - while(txt[i] != '\0' && max_width > 0) { - lv_text_flag_t word_flag = flag; - if(i == 0) word_flag |= LV_TEXT_FLAG_BREAK_ALL; - - uint32_t word_w = 0; - uint32_t advance = lv_text_get_next_word(&txt[i], font, letter_space, max_width, word_flag, &word_w); - max_width -= word_w; - line_w += word_w; - - if(advance == 0) { - break; - } - - i += advance; - - if(txt[0] == '\n' || txt[0] == '\r') break; - - if(txt[i] == '\n' || txt[i] == '\r') { - i++; /*Include the following newline in the current line*/ - break; - } - - } - - /*Always step at least one to avoid infinite loops*/ - if(i == 0) { - uint32_t letter = lv_text_encoded_next(txt, &i); - if(used_width != NULL) { - line_w = lv_font_get_glyph_width(font, letter, '\0'); - } - } - - if(used_width != NULL) { - *used_width = line_w; - } - - return i; -} - -int32_t lv_text_get_width(const char * txt, uint32_t length, const lv_font_t * font, int32_t letter_space) -{ - if(txt == NULL) return 0; - if(font == NULL) return 0; - if(txt[0] == '\0') return 0; - - uint32_t i = 0; - int32_t width = 0; - - if(length != 0) { - while(i < length) { - uint32_t letter; - uint32_t letter_next; - lv_text_encoded_letter_next_2(txt, &letter, &letter_next, &i); - - int32_t char_width = lv_font_get_glyph_width(font, letter, letter_next); - if(char_width > 0) { - width += char_width; - width += letter_space; - } - } - - if(width > 0) { - width -= letter_space; /*Trim the last letter space. Important if the text is center - aligned*/ - } - } - - return width; -} - -void lv_text_ins(char * txt_buf, uint32_t pos, const char * ins_txt) -{ - if(txt_buf == NULL || ins_txt == NULL) return; - - size_t old_len = lv_strlen(txt_buf); - size_t ins_len = lv_strlen(ins_txt); - if(ins_len == 0) return; - - size_t new_len = ins_len + old_len; - pos = lv_text_encoded_get_byte_id(txt_buf, pos); /*Convert to byte index instead of letter index*/ - - /*Copy the second part into the end to make place to text to insert*/ - size_t i; - for(i = new_len; i >= pos + ins_len; i--) { - txt_buf[i] = txt_buf[i - ins_len]; - } - - /*Copy the text into the new space*/ - lv_memcpy(txt_buf + pos, ins_txt, ins_len); -} - -void lv_text_cut(char * txt, uint32_t pos, uint32_t len) -{ - if(txt == NULL) return; - - size_t old_len = lv_strlen(txt); - - pos = lv_text_encoded_get_byte_id(txt, pos); /*Convert to byte index instead of letter index*/ - len = lv_text_encoded_get_byte_id(&txt[pos], len); - - /*Copy the second part into the end to make place to text to insert*/ - uint32_t i; - for(i = pos; i <= old_len - len; i++) { - txt[i] = txt[i + len]; - } -} - -char * lv_text_set_text_vfmt(const char * fmt, va_list ap) -{ - /*Allocate space for the new text by using trick from C99 standard section 7.19.6.12*/ - va_list ap_copy; - va_copy(ap_copy, ap); - uint32_t len = lv_vsnprintf(NULL, 0, fmt, ap_copy); - va_end(ap_copy); - - char * text = 0; -#if LV_USE_ARABIC_PERSIAN_CHARS - /*Put together the text according to the format string*/ - char * raw_txt = lv_malloc(len + 1); - LV_ASSERT_MALLOC(raw_txt); - if(raw_txt == NULL) { - return NULL; - } - - lv_vsnprintf(raw_txt, len + 1, fmt, ap); - - /*Get the size of the Arabic text and process it*/ - size_t len_ap = lv_text_ap_calc_bytes_count(raw_txt); - text = lv_malloc(len_ap + 1); - LV_ASSERT_MALLOC(text); - if(text == NULL) { - return NULL; - } - lv_text_ap_proc(raw_txt, text); - - lv_free(raw_txt); -#else - text = lv_malloc(len + 1); - LV_ASSERT_MALLOC(text); - if(text == NULL) { - return NULL; - } - - lv_vsnprintf(text, len + 1, fmt, ap); -#endif - - return text; -} - -void lv_text_encoded_letter_next_2(const char * txt, uint32_t * letter, uint32_t * letter_next, uint32_t * ofs) -{ - *letter = lv_text_encoded_next(txt, ofs); - *letter_next = *letter != '\0' ? lv_text_encoded_next(&txt[*ofs], NULL) : 0; -} - -#if LV_TXT_ENC == LV_TXT_ENC_UTF8 -/******************************* - * UTF-8 ENCODER/DECODER - ******************************/ - -/** - * Give the size of an UTF-8 coded character - * @param str pointer to a character in a string - * @return length of the UTF-8 character (1,2,3 or 4), 0 on invalid code. - */ -static uint8_t lv_text_utf8_size(const char * str) -{ - if(LV_IS_ASCII(str[0])) - return 1; - else if(LV_IS_2BYTES_UTF8_CODE(str[0])) - return 2; - else if(LV_IS_3BYTES_UTF8_CODE(str[0])) - return 3; - else if(LV_IS_4BYTES_UTF8_CODE(str[0])) - return 4; - return 0; -} - -/** - * Convert a Unicode letter to UTF-8. - * @param letter_uni a Unicode letter - * @return UTF-8 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű') - */ -static uint32_t lv_text_unicode_to_utf8(uint32_t letter_uni) -{ - if(letter_uni < 128) return letter_uni; - uint8_t bytes[4]; - - if(letter_uni < 0x0800) { - bytes[0] = ((letter_uni >> 6) & 0x1F) | 0xC0; - bytes[1] = ((letter_uni >> 0) & 0x3F) | 0x80; - bytes[2] = 0; - bytes[3] = 0; - } - else if(letter_uni < 0x010000) { - bytes[0] = ((letter_uni >> 12) & 0x0F) | 0xE0; - bytes[1] = ((letter_uni >> 6) & 0x3F) | 0x80; - bytes[2] = ((letter_uni >> 0) & 0x3F) | 0x80; - bytes[3] = 0; - } - else if(letter_uni < 0x110000) { - bytes[0] = ((letter_uni >> 18) & 0x07) | 0xF0; - bytes[1] = ((letter_uni >> 12) & 0x3F) | 0x80; - bytes[2] = ((letter_uni >> 6) & 0x3F) | 0x80; - bytes[3] = ((letter_uni >> 0) & 0x3F) | 0x80; - } - else { - return 0; - } - - uint32_t * res_p = (uint32_t *)bytes; - return *res_p; -} - -/** - * Convert a wide character, e.g. 'Á' little endian to be UTF-8 compatible - * @param c a wide character or a Little endian number - * @return `c` in big endian - */ -static uint32_t lv_text_utf8_conv_wc(uint32_t c) -{ -#if LV_BIG_ENDIAN_SYSTEM == 0 - /*Swap the bytes (UTF-8 is big endian, but the MCUs are little endian)*/ - if((c & 0x80) != 0) { - uint32_t swapped; - uint8_t c8[4]; - lv_memcpy(c8, &c, 4); - swapped = (c8[0] << 24) + (c8[1] << 16) + (c8[2] << 8) + (c8[3]); - uint8_t i; - for(i = 0; i < 4; i++) { - if((swapped & 0xFF) == 0) - swapped = (swapped >> 8); /*Ignore leading zeros (they were in the end originally)*/ - } - c = swapped; - } -#endif - return c; -} - -/** - * Decode an UTF-8 character from a string. - * @param txt pointer to '\0' terminated string - * @param i start byte index in 'txt' where to start. - * After call it will point to the next UTF-8 char in 'txt'. - * NULL to use txt[0] as index - * @return the decoded Unicode character or 0 on invalid UTF-8 code - */ -static uint32_t lv_text_utf8_next(const char * txt, uint32_t * i) -{ - /** - * Unicode to UTF-8 - * 00000000 00000000 00000000 0xxxxxxx -> 0xxxxxxx - * 00000000 00000000 00000yyy yyxxxxxx -> 110yyyyy 10xxxxxx - * 00000000 00000000 zzzzyyyy yyxxxxxx -> 1110zzzz 10yyyyyy 10xxxxxx - * 00000000 000wwwzz zzzzyyyy yyxxxxxx -> 11110www 10zzzzzz 10yyyyyy 10xxxxxx - */ - - uint32_t result = 0; - - /*Dummy 'i' pointer is required*/ - uint32_t i_tmp = 0; - if(i == NULL) i = &i_tmp; - - /*Normal ASCII*/ - if(LV_IS_ASCII(txt[*i])) { - result = txt[*i]; - (*i)++; - } - /*Real UTF-8 decode*/ - else { - /*2 bytes UTF-8 code*/ - if(LV_IS_2BYTES_UTF8_CODE(txt[*i])) { - result = (uint32_t)(txt[*i] & 0x1F) << 6; - (*i)++; - if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; - result += (txt[*i] & 0x3F); - (*i)++; - } - /*3 bytes UTF-8 code*/ - else if(LV_IS_3BYTES_UTF8_CODE(txt[*i])) { - result = (uint32_t)(txt[*i] & 0x0F) << 12; - (*i)++; - - if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; - result += (uint32_t)(txt[*i] & 0x3F) << 6; - (*i)++; - - if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; - result += (txt[*i] & 0x3F); - (*i)++; - } - /*4 bytes UTF-8 code*/ - else if(LV_IS_4BYTES_UTF8_CODE(txt[*i])) { - result = (uint32_t)(txt[*i] & 0x07) << 18; - (*i)++; - - if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; - result += (uint32_t)(txt[*i] & 0x3F) << 12; - (*i)++; - - if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; - result += (uint32_t)(txt[*i] & 0x3F) << 6; - (*i)++; - - if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; - result += txt[*i] & 0x3F; - (*i)++; - } - else { - (*i)++; /*Not UTF-8 char. Go the next.*/ - } - } - return result; -} - -/** - * Get previous UTF-8 character form a string. - * @param txt pointer to '\0' terminated string - * @param i start byte index in 'txt' where to start. After the call it will point to the previous - * UTF-8 char in 'txt'. - * @return the decoded Unicode character or 0 on invalid UTF-8 code - */ -static uint32_t lv_text_utf8_prev(const char * txt, uint32_t * i) -{ - uint8_t c_size; - uint8_t cnt = 0; - - /*Try to find a !0 long UTF-8 char by stepping one character back*/ - (*i)--; - do { - if(cnt >= 4) return 0; /*No UTF-8 char found before the initial*/ - - c_size = lv_text_encoded_size(&txt[*i]); - if(c_size == 0) { - if(*i != 0) - (*i)--; - else - return 0; - } - cnt++; - } while(c_size == 0); - - uint32_t i_tmp = *i; - uint32_t letter = lv_text_encoded_next(txt, &i_tmp); /*Character found, get it*/ - - return letter; -} - -/** - * Convert a character index (in an UTF-8 text) to byte index. - * E.g. in "AÁRT" index of 'R' is 2th char but start at byte 3 because 'Á' is 2 bytes long - * @param txt a '\0' terminated UTF-8 string - * @param utf8_id character index - * @return byte index of the 'utf8_id'th letter - */ -static uint32_t lv_text_utf8_get_byte_id(const char * txt, uint32_t utf8_id) -{ - uint32_t i; - uint32_t byte_cnt = 0; - for(i = 0; i < utf8_id && txt[byte_cnt] != '\0'; i++) { - uint8_t c_size = lv_text_encoded_size(&txt[byte_cnt]); - /* If the char was invalid tell it's 1 byte long*/ - byte_cnt += c_size ? c_size : 1; - } - - return byte_cnt; -} - -/** - * Convert a byte index (in an UTF-8 text) to character index. - * E.g. in "AÁRT" index of 'R' is 2th char but start at byte 3 because 'Á' is 2 bytes long - * @param txt a '\0' terminated UTF-8 string - * @param byte_id byte index - * @return character index of the letter at 'byte_id'th position - */ -static uint32_t lv_text_utf8_get_char_id(const char * txt, uint32_t byte_id) -{ - uint32_t i = 0; - uint32_t char_cnt = 0; - - while(i < byte_id) { - lv_text_encoded_next(txt, &i); /*'i' points to the next letter so use the prev. value*/ - char_cnt++; - } - - return char_cnt; -} - -/** - * Get the number of characters (and NOT bytes) in a string. Decode it with UTF-8 if enabled. - * E.g.: "ÁBC" is 3 characters (but 4 bytes) - * @param txt a '\0' terminated char string - * @return number of characters - */ -static uint32_t lv_text_utf8_get_length(const char * txt) -{ - uint32_t len = 0; - uint32_t i = 0; - - while(txt[i] != '\0') { - lv_text_encoded_next(txt, &i); - len++; - } - - return len; -} - -#elif LV_TXT_ENC == LV_TXT_ENC_ASCII -/******************************* - * ASCII ENCODER/DECODER - ******************************/ - -/** - * Give the size of an ISO8859-1 coded character - * @param str pointer to a character in a string - * @return length of the ISO8859-1 coded character, will be always 1. - */ -static uint8_t lv_text_iso8859_1_size(const char * str) -{ - LV_UNUSED(str); /*Unused*/ - return 1; -} - -/** - * Convert a Unicode letter to ISO8859-1. - * @param letter_uni a Unicode letter - * @return ISO8859-1 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű') - */ -static uint32_t lv_text_unicode_to_iso8859_1(uint32_t letter_uni) -{ - if(letter_uni < 256) - return letter_uni; - else - return ' '; -} - -/** - * Convert wide characters to ASCII, however wide characters in ASCII range (e.g. 'A') are ASCII compatible by default. - * So this function does nothing just returns with `c`. - * @param c a character, e.g. 'A' - * @return same as `c` - */ -static uint32_t lv_text_iso8859_1_conv_wc(uint32_t c) -{ - return c; -} - -/** - * Decode an ISO8859-1 character from a string. - * @param txt pointer to '\0' terminated string - * @param i start byte index in 'txt' where to start. - * After call it will point to the next ISO8859-1 coded char in 'txt'. - * NULL to use txt[0] as index - * @return the decoded ISO8859-1 character. - */ -static uint32_t lv_text_iso8859_1_next(const char * txt, uint32_t * i) -{ - if(i == NULL) return txt[0]; /*Get the next char*/ - - uint8_t letter = txt[*i]; - (*i)++; - return letter; -} - -/** - * Get previous ISO8859-1 character form a string. - * @param txt pointer to '\0' terminated string - * @param i start byte index in 'txt' where to start. After the call it will point to the previous ISO8859-1 coded char in 'txt'. - * @return the decoded ISO8859-1 character. - */ -static uint32_t lv_text_iso8859_1_prev(const char * txt, uint32_t * i) -{ - if(i == NULL) return *(txt - 1); /*Get the prev. char*/ - - (*i)--; - uint8_t letter = txt[*i]; - - return letter; -} - -/** - * Convert a character index (in an ISO8859-1 text) to byte index. - * The ISO8859-1 encoding is compatible with ASCII so the indices of characters is the same as the indices of bytes. - * @param txt a '\0' terminated char string - * @param utf8_id character index - * @return byte index of the 'utf8_id'th letter - */ -static uint32_t lv_text_iso8859_1_get_byte_id(const char * txt, uint32_t utf8_id) -{ - LV_UNUSED(txt); /*Unused*/ - return utf8_id; /*In Non encoded no difference*/ -} - -/** - * Convert a byte index (in an ISO8859-1 text) to character index. - * The ISO8859-1 encoding is compatible with ASCII so the indices of characters is the same as the indices of bytes. - * @param txt a '\0' terminated char string - * @param byte_id byte index - * @return character index of the letter at 'byte_id'th position - */ -static uint32_t lv_text_iso8859_1_get_char_id(const char * txt, uint32_t byte_id) -{ - LV_UNUSED(txt); /*Unused*/ - return byte_id; /*In Non encoded no difference*/ -} - -/** - * Get the number of characters (and NOT bytes) in a string. - * The ISO8859-1 encoding is compatible with ASCII so the number of characters is the same as the number of bytes. - * @param txt a '\0' terminated char string - * @return number of characters - */ -static uint32_t lv_text_iso8859_1_get_length(const char * txt) -{ - return lv_strlen(txt); -} -#else - -#error "Invalid character encoding. See `LV_TXT_ENC` in `lv_conf.h`" - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text.h deleted file mode 100644 index f2407dd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text.h +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @file lv_text.h - * - */ - -#ifndef LV_TEXT_H -#define LV_TEXT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" - -#include "lv_types.h" -#include "lv_area.h" -#include "../font/lv_font.h" -#include "../stdlib/lv_sprintf.h" - -/********************* - * DEFINES - *********************/ - -#define LV_TXT_ENC_UTF8 1 -#define LV_TXT_ENC_ASCII 2 - -/********************** - * TYPEDEFS - **********************/ - -/** - * Options for text rendering. - */ - -typedef enum { - LV_TEXT_FLAG_NONE = 0x00, - LV_TEXT_FLAG_EXPAND = 0x01, /**< Ignore max-width to avoid automatic word wrapping*/ - LV_TEXT_FLAG_FIT = 0x02, /**< Max-width is already equal to the longest line. (Used to skip some calculation)*/ - LV_TEXT_FLAG_BREAK_ALL = 0x04, /**< To prevent overflow, insert breaks between any two characters. - Otherwise breaks are inserted at word boundaries, as configured via LV_TXT_BREAK_CHARS - or according to LV_TXT_LINE_BREAK_LONG_LEN, LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN, - and LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN.*/ -} lv_text_flag_t; - -/** Label align policy*/ -typedef enum { - LV_TEXT_ALIGN_AUTO, /**< Align text auto*/ - LV_TEXT_ALIGN_LEFT, /**< Align text to left*/ - LV_TEXT_ALIGN_CENTER, /**< Align text to center*/ - LV_TEXT_ALIGN_RIGHT, /**< Align text to right*/ -} lv_text_align_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Get size of a text - * @param size_res pointer to a 'point_t' variable to store the result - * @param text pointer to a text - * @param font pointer to font of the text - * @param letter_space letter space of the text - * @param line_space line space of the text - * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid - * @param flag settings for the text from ::lv_text_flag_t - - * line breaks - */ -void lv_text_get_size(lv_point_t * size_res, const char * text, const lv_font_t * font, int32_t letter_space, - int32_t line_space, int32_t max_width, lv_text_flag_t flag); - -/** - * Give the length of a text with a given font - * @param txt a '\0' terminate string - * @param length length of 'txt' in byte count and not characters (Á is 1 character but 2 bytes in - * UTF-8) - * @param font pointer to a font - * @param letter_space letter space - * @return length of a char_num long text - */ -int32_t lv_text_get_width(const char * txt, uint32_t length, const lv_font_t * font, int32_t letter_space); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TEXT_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text_ap.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text_ap.c deleted file mode 100644 index 320debd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text_ap.c +++ /dev/null @@ -1,301 +0,0 @@ -/** - * @file lv_text_ap.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_bidi.h" -#include "lv_text_private.h" -#include "lv_text_ap.h" -#include "lv_types.h" -#include "../stdlib/lv_mem.h" -#include "../draw/lv_draw.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - uint8_t char_offset; - uint16_t char_end_form; - int8_t char_beginning_form_offset; - int8_t char_middle_form_offset; - int8_t char_isolated_form_offset; - struct { - uint8_t conj_to_previous; - uint8_t conj_to_next; - } ap_chars_conjunction; -} ap_chars_map_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -#if LV_USE_ARABIC_PERSIAN_CHARS == 1 -static uint32_t lv_ap_get_char_index(uint16_t c); -static uint32_t lv_text_lam_alef(uint32_t ch_curr, uint32_t ch_next); -static bool lv_text_is_arabic_vowel(uint16_t c); - -/********************** - * STATIC VARIABLES - **********************/ - -const ap_chars_map_t ap_chars_map[] = { - /*{Key Offset, End, Beginning, Middle, Isolated, {conjunction}}*/ - {1, 0xFE84, -1, 0, -1, {1, 0}}, // أ - {2, 0xFE86, -1, 0, -1, {1, 0}}, // ؤ - {3, 0xFE88, -1, 0, -1, {1, 0}}, // ﺇ - {4, 0xFE8A, 1, 2, -1, {1, 1}}, // ئ - {5, 0xFE8E, -1, 0, -1, {1, 0}}, // آ - {6, 0xFE90, 1, 2, -1, {1, 1}}, // ب - {92, 0xFB57, 1, 2, -1, {1, 1}}, // پ - {8, 0xFE96, 1, 2, -1, {1, 1}}, // ت - {9, 0xFE9A, 1, 2, -1, {1, 1}}, // ث - {10, 0xFE9E, 1, 2, -1, {1, 1}}, // ج - {100, 0xFB7B, 1, 2, -1, {1, 1}}, // چ - {11, 0xFEA2, 1, 2, -1, {1, 1}}, // ح - {12, 0xFEA6, 1, 2, -1, {1, 1}}, // خ - {13, 0xFEAA, -1, 0, -1, {1, 0}}, // د - {14, 0xFEAC, -1, 0, -1, {1, 0}}, // ذ - {15, 0xFEAE, -1, 0, -1, {1, 0}}, // ر - {16, 0xFEB0, -1, 0, -1, {1, 0}}, // ز - {118, 0xFB8B, -1, 0, -1, {1, 0}}, // ژ - {17, 0xFEB2, 1, 2, -1, {1, 1}}, // س - {18, 0xFEB6, 1, 2, -1, {1, 1}}, // ش - {19, 0xFEBA, 1, 2, -1, {1, 1}}, // ص - {20, 0xFEBE, 1, 2, -1, {1, 1}}, // ض - {21, 0xFEC2, 1, 2, -1, {1, 1}}, // ط - {22, 0xFEC6, 1, 2, -1, {1, 1}}, // ظ - {23, 0xFECA, 1, 2, -1, {1, 1}}, // ع - {24, 0xFECE, 1, 2, -1, {1, 1}}, // غ - {30, 0x0640, 0, 0, 0, {1, 1}}, // - (mad, hyphen) - {31, 0xFED2, 1, 2, -1, {1, 1}}, // ف - {32, 0xFED6, 1, 2, -1, {1, 1}}, // ق - {135, 0xFB8F, 1, 2, -1, {1, 1}}, // ک - {33, 0xFEDA, 1, 2, -1, {1, 1}}, // ﻙ - {141, 0xFB93, 1, 2, -1, {1, 1}}, // گ - {34, 0xFEDE, 1, 2, -1, {1, 1}}, // ل - {35, 0xFEE2, 1, 2, -1, {1, 1}}, // م - {36, 0xFEE6, 1, 2, -1, {1, 1}}, // ن - {38, 0xFEEE, -1, 0, -1, {1, 0}}, // و - {37, 0xFEEA, 1, 2, -1, {1, 1}}, // ه - {39, 0xFEF0, 0, 0, -1, {1, 0}}, // ى - {40, 0xFEF2, 1, 2, -1, {1, 1}}, // ي - {170, 0xFBFD, 1, 2, -1, {1, 1}}, // ی - {7, 0xFE94, -1, 2, -1, {1, 0}}, // ة - {206, 0x06F0, -1, 2, 0, {0, 0}}, // ۰ - {207, 0x06F1, 0, 0, 0, {0, 0}}, // ۱ - {208, 0x06F2, 0, 0, 0, {0, 0}}, // ۲ - {209, 0x06F3, 0, 0, 0, {0, 0}}, // ۳ - {210, 0x06F4, 0, 0, 0, {0, 0}}, // ۴ - {211, 0x06F5, 0, 0, 0, {0, 0}}, // ۵ - {212, 0x06F6, 0, 0, 0, {0, 0}}, // ۶ - {213, 0x06F7, 0, 0, 0, {0, 0}}, // ۷ - {214, 0x06F8, 0, 0, 0, {0, 0}}, // ۸ - {215, 0x06F9, 0, 0, 0, {0, 0}}, // ۹ - LV_AP_END_CHARS_LIST -}; -/********************** -* MACROS -**********************/ - -/********************** -* GLOBAL FUNCTIONS -**********************/ -uint32_t lv_text_ap_calc_bytes_count(const char * txt) -{ - uint32_t txt_length = 0; - uint32_t chars_cnt = 0; - uint32_t current_ap_idx = 0; - uint32_t i, j; - uint32_t ch_enc; - - txt_length = lv_text_get_encoded_length(txt); - - i = 0; - j = 0; - while(i < txt_length) { - ch_enc = lv_text_encoded_next(txt, &j); - current_ap_idx = lv_ap_get_char_index(ch_enc); - - if(current_ap_idx != LV_UNDEF_ARABIC_PERSIAN_CHARS) - ch_enc = ap_chars_map[current_ap_idx].char_end_form; - - if(ch_enc < 0x80) - chars_cnt++; - else if(ch_enc < 0x0800) - chars_cnt += 2; - else if(ch_enc < 0x010000) - chars_cnt += 3; - else - chars_cnt += 4; - - i++; - } - - return chars_cnt + 1; -} - -void lv_text_ap_proc(const char * txt, char * txt_out) -{ - uint32_t txt_length = 0; - uint32_t index_current, idx_next, idx_previous, i, j; - uint32_t * ch_enc; - uint32_t * ch_fin; - char * txt_out_temp; - - txt_length = lv_text_get_encoded_length(txt); - - ch_enc = (uint32_t *)lv_malloc(sizeof(uint32_t) * (txt_length + 1)); - ch_fin = (uint32_t *)lv_malloc(sizeof(uint32_t) * (txt_length + 1)); - - i = 0; - j = 0; - while(j < txt_length) - ch_enc[j++] = lv_text_encoded_next(txt, &i); - - ch_enc[j] = 0; - - i = 0; - j = 0; - idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS; - while(i < txt_length) { - index_current = lv_ap_get_char_index(ch_enc[i]); - idx_next = lv_ap_get_char_index(ch_enc[i + 1]); - - if(lv_text_is_arabic_vowel(ch_enc[i])) { // Current character is a vowel - ch_fin[j] = ch_enc[i]; - i++; - j++; - continue; // Skip this character - } - else if(lv_text_is_arabic_vowel(ch_enc[i + 1])) { // Next character is a vowel - idx_next = lv_ap_get_char_index(ch_enc[i + 2]); // Skip the vowel character to join with the character after it - } - - if(index_current == LV_UNDEF_ARABIC_PERSIAN_CHARS) { - ch_fin[j] = ch_enc[i]; - j++; - i++; - idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS; - continue; - } - - uint8_t conjunction_to_previous = (i == 0 || - idx_previous == LV_UNDEF_ARABIC_PERSIAN_CHARS) ? 0 : ap_chars_map[idx_previous].ap_chars_conjunction.conj_to_next; - uint8_t conjunction_to_next = ((i == txt_length - 1) || - idx_next == LV_UNDEF_ARABIC_PERSIAN_CHARS) ? 0 : ap_chars_map[idx_next].ap_chars_conjunction.conj_to_previous; - - uint32_t lam_alef = lv_text_lam_alef(index_current, idx_next); - if(lam_alef) { - if(conjunction_to_previous) { - lam_alef ++; - } - ch_fin[j] = lam_alef; - idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS; - i += 2; - j++; - continue; - } - - if(conjunction_to_previous && conjunction_to_next) - ch_fin[j] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_middle_form_offset; - else if(!conjunction_to_previous && conjunction_to_next) - ch_fin[j] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_beginning_form_offset; - else if(conjunction_to_previous && !conjunction_to_next) - ch_fin[j] = ap_chars_map[index_current].char_end_form; - else - ch_fin[j] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_isolated_form_offset; - idx_previous = index_current; - i++; - j++; - } - ch_fin[j] = 0; - for(i = 0; i < txt_length; i++) - ch_enc[i] = 0; - for(i = 0; i < j; i++) - ch_enc[i] = ch_fin[i]; - lv_free(ch_fin); - - txt_out_temp = txt_out; - i = 0; - - while(i < txt_length) { - if(ch_enc[i] < 0x80) { - *(txt_out_temp++) = ch_enc[i] & 0xFF; - } - else if(ch_enc[i] < 0x0800) { - *(txt_out_temp++) = ((ch_enc[i] >> 6) & 0x1F) | 0xC0; - *(txt_out_temp++) = ((ch_enc[i] >> 0) & 0x3F) | 0x80; - } - else if(ch_enc[i] < 0x010000) { - *(txt_out_temp++) = ((ch_enc[i] >> 12) & 0x0F) | 0xE0; - *(txt_out_temp++) = ((ch_enc[i] >> 6) & 0x3F) | 0x80; - *(txt_out_temp++) = ((ch_enc[i] >> 0) & 0x3F) | 0x80; - } - else if(ch_enc[i] < 0x110000) { - *(txt_out_temp++) = ((ch_enc[i] >> 18) & 0x07) | 0xF0; - *(txt_out_temp++) = ((ch_enc[i] >> 12) & 0x3F) | 0x80; - *(txt_out_temp++) = ((ch_enc[i] >> 6) & 0x3F) | 0x80; - *(txt_out_temp++) = ((ch_enc[i] >> 0) & 0x3F) | 0x80; - } - - i++; - } - *(txt_out_temp) = '\0'; - lv_free(ch_enc); -} -/********************** -* STATIC FUNCTIONS -**********************/ - -static uint32_t lv_ap_get_char_index(uint16_t c) -{ - for(uint8_t i = 0; ap_chars_map[i].char_end_form; i++) { - if(c == (ap_chars_map[i].char_offset + LV_AP_ALPHABET_BASE_CODE)) - return i; - else if(c == ap_chars_map[i].char_end_form //is it an End form - || c == (ap_chars_map[i].char_end_form + ap_chars_map[i].char_beginning_form_offset) //is it a Beginning form - || c == (ap_chars_map[i].char_end_form + ap_chars_map[i].char_middle_form_offset) //is it a middle form - || c == (ap_chars_map[i].char_end_form + ap_chars_map[i].char_isolated_form_offset)) { //is it an isolated form - return i; - } - } - return LV_UNDEF_ARABIC_PERSIAN_CHARS; -} - -static uint32_t lv_text_lam_alef(uint32_t ch_curr, uint32_t ch_next) -{ - uint32_t ch_code = 0; - if(ap_chars_map[ch_curr].char_offset != 34) { - return 0; - } - if(ch_next == LV_UNDEF_ARABIC_PERSIAN_CHARS) { - return 0; - } - ch_code = ap_chars_map[ch_next].char_offset + LV_AP_ALPHABET_BASE_CODE; - if(ch_code == 0x0622) { - return 0xFEF5; // (lam-alef) mad - } - if(ch_code == 0x0623) { - return 0xFEF7; // (lam-alef) top hamza - } - if(ch_code == 0x0625) { - return 0xFEF9; // (lam-alef) bot hamza - } - if(ch_code == 0x0627) { - return 0xFEFB; // (lam-alef) alef - } - return 0; -} - -static bool lv_text_is_arabic_vowel(uint16_t c) -{ - return (c >= 0x064B) && (c <= 0x0652); -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text_ap.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text_ap.h deleted file mode 100644 index cac7c71..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text_ap.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @file lv_text_ap.h - * - */ - -#ifndef LV_TEXT_AP_H -#define LV_TEXT_AP_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_text.h" -#include "lv_types.h" -#include "../draw/lv_draw.h" - -#if LV_USE_ARABIC_PERSIAN_CHARS == 1 - -/********************* - * DEFINES - *********************/ - -#define LV_UNDEF_ARABIC_PERSIAN_CHARS (UINT32_MAX) -#define LV_AP_ALPHABET_BASE_CODE 0x0622 -#define LV_AP_END_CHARS_LIST {0,0,0,0,0,{0,0}} -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ -uint32_t lv_text_ap_calc_bytes_count(const char * txt); -void lv_text_ap_proc(const char * txt, char * txt_out); - -/********************** - * MACROS - **********************/ - -#endif // LV_USE_ARABIC_PERSIAN_CHARS - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TEXT_AP_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text_private.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text_private.h deleted file mode 100644 index 858f593..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_text_private.h +++ /dev/null @@ -1,273 +0,0 @@ -/** - * @file lv_text_private.h - * - */ - -#ifndef LV_TEXT_PRIVATE_H -#define LV_TEXT_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_text.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Get the next line of text. Check line length and break chars too. - * @param txt a '\0' terminated string - * @param font pointer to a font - * @param letter_space letter space - * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid - * line breaks - * @param used_width When used_width != NULL, save the width of this line if - * flag == LV_TEXT_FLAG_NONE, otherwise save -1. - * @param flag settings for the text from 'txt_flag_type' enum - * @return the index of the first char of the new line (in byte index not letter index. With UTF-8 - * they are different) - */ -uint32_t lv_text_get_next_line(const char * txt, const lv_font_t * font, int32_t letter_space, - int32_t max_width, int32_t * used_width, lv_text_flag_t flag); - -/** - * Insert a string into another - * @param txt_buf the original text (must be big enough for the result text and NULL terminated) - * @param pos position to insert (0: before the original text, 1: after the first char etc.) - * @param ins_txt text to insert, must be '\0' terminated - */ -void lv_text_ins(char * txt_buf, uint32_t pos, const char * ins_txt); - -/** - * Delete a part of a string - * @param txt string to modify, must be '\0' terminated and should point to a heap or stack frame, not read-only memory. - * @param pos position where to start the deleting (0: before the first char, 1: after the first - * char etc.) - * @param len number of characters to delete - */ -void lv_text_cut(char * txt, uint32_t pos, uint32_t len); - -/** - * return a new formatted text. Memory will be allocated to store the text. - * @param fmt `printf`-like format - * @param ap items to print - - * @return pointer to the allocated text string. - */ -char * lv_text_set_text_vfmt(const char * fmt, va_list ap) LV_FORMAT_ATTRIBUTE(1, 0); - -/** - * Decode two encoded character from a string. - * @param txt pointer to '\0' terminated string - * @param letter the first decoded Unicode character or 0 on invalid data code - * @param letter_next the second decoded Unicode character or 0 on invalid data code - * @param ofs start index in 'txt' where to start. - * After the call it will point to the next encoded char in 'txt'. - * NULL to use txt[0] as index - */ -void lv_text_encoded_letter_next_2(const char * txt, uint32_t * letter, uint32_t * letter_next, uint32_t * ofs); - -/** - * Test if char is break char or not (a text can broken here or not) - * @param letter a letter - * @return false: 'letter' is not break char - */ -static inline bool lv_text_is_break_char(uint32_t letter) -{ - uint8_t i; - bool ret = false; - - /*Compare the letter to TXT_BREAK_CHARS*/ - for(i = 0; LV_TXT_BREAK_CHARS[i] != '\0'; i++) { - if(letter == (uint32_t)LV_TXT_BREAK_CHARS[i]) { - ret = true; /*If match then it is break char*/ - break; - } - } - - return ret; -} - -/** - * Test if char is break char or not (a text can broken here or not) - * @param letter a letter - * @return false: 'letter' is not break char - */ -static inline bool lv_text_is_a_word(uint32_t letter) -{ - /*Cheap check on invalid letter*/ - if(letter == 0) return false; - - /*CJK Unified Ideographs*/ - if(letter >= 0x4E00 && letter <= 0x9FFF) { - return true; - } - - /*Fullwidth ASCII variants*/ - if(letter >= 0xFF01 && letter <= 0xFF5E) { - return true; - } - - /*CJK symbols and punctuation*/ - if(letter >= 0x3000 && letter <= 0x303F) { - return true; - } - - /*CJK Radicals Supplement*/ - if(letter >= 0x2E80 && letter <= 0x2EFF) { - return true; - } - - /*CJK Strokes*/ - if(letter >= 0x31C0 && letter <= 0x31EF) { - return true; - } - - /*Hiragana and Katakana*/ - if(letter >= 0x3040 && letter <= 0x30FF) { - return true; - } - - /*Chinese Vertical Forms*/ - if(letter >= 0xFE10 && letter <= 0xFE1F) { - return true; - } - - /*CJK Compatibility Forms*/ - if(letter >= 0xFE30 && letter <= 0xFE4F) { - return true; - } - - return false; -} - -/** - * Test if character can be treated as marker, and don't need to be rendered. - * Note, this is not a full list. Add your findings to the list. - * - * @param letter a letter - * @return true if so - */ -static inline bool lv_text_is_marker(uint32_t letter) -{ - if(letter < 0x20) return true; - - /*U+061C ARABIC LETTER MARK, see https://www.compart.com/en/unicode/block/U+0600*/ - if(letter == 0x061C) return true; - - /*U+115F HANGUL CHOSEONG FILLER, See https://www.compart.com/en/unicode/block/U+1100*/ - if(letter == 0x115F) return true; - /*U+1160 HANGUL JUNGSEONG FILLER*/ - if(letter == 0x1160) return true; - - /*See https://www.compart.com/en/unicode/block/U+1800*/ - if(letter >= 0x180B && letter <= 0x180E) return true; - - /*See https://www.compart.com/en/unicode/block/U+2000*/ - if(letter >= 0x200B && letter <= 0x200F) return true; - if(letter >= 0x2028 && letter <= 0x202F) return true; - if(letter >= 0x205F && letter <= 0x206F) return true; - - /*U+FEFF ZERO WIDTH NO-BREAK SPACE, see https://www.compart.com/en/unicode/block/U+FE70*/ - if(letter == 0xFEFF) return true; - - if(letter == 0xF8FF) return true; /*LV_SYMBOL_DUMMY*/ - - return false; -} - -/*************************************************************** - * GLOBAL FUNCTION POINTERS FOR CHARACTER ENCODING INTERFACE - ***************************************************************/ - -/** - * Give the size of an encoded character - * @param txt pointer to a character in a string - * @return length of the encoded character (1,2,3 ...). O in invalid - */ -extern uint8_t (*const lv_text_encoded_size)(const char * txt); - -/** - * Convert a Unicode letter to encoded - * @param letter_uni a Unicode letter - * @return Encoded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ü') - */ -extern uint32_t (*const lv_text_unicode_to_encoded)(uint32_t letter_uni); - -/** - * Convert a wide character, e.g. 'Á' little endian to be compatible with the encoded format. - * @param c a wide character - * @return `c` in the encoded format - */ -extern uint32_t (*const lv_text_encoded_conv_wc)(uint32_t c); - -/** - * Decode the next encoded character from a string. - * @param txt pointer to '\0' terminated string - * @param i_start start index in 'txt' where to start. - * After the call it will point to the next encoded char in 'txt'. - * NULL to use txt[0] as index - * @return the decoded Unicode character or 0 on invalid data code - */ -extern uint32_t (*const lv_text_encoded_next)(const char * txt, uint32_t * i_start); - -/** - * Get the previous encoded character form a string. - * - * @param txt pointer to '\0' terminated string - * @param i_start index in 'txt' where to start. After the call it will point to the previous - * encoded char in 'txt'. - * - * @return the decoded Unicode character or 0 on invalid data - */ -extern uint32_t (*const lv_text_encoded_prev)(const char * txt, uint32_t * i_start); - -/** - * Convert a letter index (in the encoded text) to byte index. - * E.g. in UTF-8 "AÁRT" index of 'R' is 2 but start at byte 3 because 'Á' is 2 bytes long - * @param txt a '\0' terminated UTF-8 string - * @param utf8_id character index - * @return byte index of the 'enc_id'th letter - */ -extern uint32_t (*const lv_text_encoded_get_byte_id)(const char * txt, uint32_t utf8_id); - -/** - * Convert a byte index (in an encoded text) to character index. - * E.g. in UTF-8 "AÁRT" index of 'R' is 2 but start at byte 3 because 'Á' is 2 bytes long - * @param txt a '\0' terminated UTF-8 string - * @param byte_id byte index - * @return character index of the letter at 'byte_id'th position - */ -extern uint32_t (*const lv_text_encoded_get_char_id)(const char * txt, uint32_t byte_id); - -/** - * Get the number of characters (and NOT bytes) in a string. - * E.g. in UTF-8 "ÁBC" is 3 characters (but 4 bytes) - * @param txt a '\0' terminated char string - * @return number of characters - */ -extern uint32_t (*const lv_text_get_encoded_length)(const char * txt); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TEXT_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_timer.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_timer.c deleted file mode 100644 index 959ce53..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_timer.c +++ /dev/null @@ -1,385 +0,0 @@ -/** - * @file lv_timer.c - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_timer_private.h" -#include "../core/lv_global.h" -#include "../tick/lv_tick.h" -#include "../stdlib/lv_mem.h" -#include "../stdlib/lv_sprintf.h" -#include "lv_assert.h" -#include "lv_ll.h" -#include "lv_profiler.h" - -/********************* - * DEFINES - *********************/ - -#define IDLE_MEAS_PERIOD 500 /*[ms]*/ -#define DEF_PERIOD 500 - -#define state LV_GLOBAL_DEFAULT()->timer_state -#define timer_ll_p &(state.timer_ll) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_timer_exec(lv_timer_t * timer); -static uint32_t lv_timer_time_remaining(lv_timer_t * timer); -static void lv_timer_handler_resume(void); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ -#if LV_USE_LOG && LV_LOG_TRACE_TIMER - #define LV_TRACE_TIMER(...) LV_LOG_TRACE(__VA_ARGS__) -#else - #define LV_TRACE_TIMER(...) -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_timer_core_init(void) -{ - lv_ll_init(timer_ll_p, sizeof(lv_timer_t)); - - /*Initially enable the lv_timer handling*/ - lv_timer_enable(true); -} - -LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void) -{ - LV_TRACE_TIMER("begin"); - - lv_timer_state_t * state_p = &state; - /*Avoid concurrent running of the timer handler*/ - if(state_p->already_running) { - LV_TRACE_TIMER("already running, concurrent calls are not allow, returning"); - return 1; - } - state_p->already_running = true; - - if(state_p->lv_timer_run == false) { - state_p->already_running = false; /*Release mutex*/ - return 1; - } - - LV_PROFILER_BEGIN; - lv_lock(); - - uint32_t handler_start = lv_tick_get(); - - if(handler_start == 0) { - state.run_cnt++; - if(state.run_cnt > 100) { - state.run_cnt = 0; - LV_LOG_WARN("It seems lv_tick_inc() is not called."); - } - } - - /*Run all timer from the list*/ - lv_timer_t * next; - lv_timer_t * timer_active; - lv_ll_t * timer_head = timer_ll_p; - do { - state_p->timer_deleted = false; - state_p->timer_created = false; - - timer_active = lv_ll_get_head(timer_head); - while(timer_active) { - /*The timer might be deleted if it runs only once ('repeat_count = 1') - *So get next element until the current is surely valid*/ - next = lv_ll_get_next(timer_head, timer_active); - - if(lv_timer_exec(timer_active)) { - /*If a timer was created or deleted then this or the next item might be corrupted*/ - if(state_p->timer_created || state_p->timer_deleted) { - LV_TRACE_TIMER("Start from the first timer again because a timer was created or deleted"); - break; - } - } - - timer_active = next; /*Load the next timer*/ - } - } while(timer_active); - - uint32_t time_until_next = LV_NO_TIMER_READY; - next = lv_ll_get_head(timer_head); - while(next) { - if(!next->paused) { - uint32_t delay = lv_timer_time_remaining(next); - if(delay < time_until_next) - time_until_next = delay; - } - - next = lv_ll_get_next(timer_head, next); /*Find the next timer*/ - } - - state_p->busy_time += lv_tick_elaps(handler_start); - uint32_t idle_period_time = lv_tick_elaps(state_p->idle_period_start); - if(idle_period_time >= IDLE_MEAS_PERIOD) { - state_p->idle_last = (state_p->busy_time * 100) / idle_period_time; /*Calculate the busy percentage*/ - state_p->idle_last = state_p->idle_last > 100 ? 0 : 100 - state_p->idle_last; /*But we need idle time*/ - state_p->busy_time = 0; - state_p->idle_period_start = lv_tick_get(); - } - - state_p->timer_time_until_next = time_until_next; - state_p->already_running = false; /*Release the mutex*/ - - LV_TRACE_TIMER("finished (%" LV_PRIu32 " ms until the next timer call)", time_until_next); - lv_unlock(); - - LV_PROFILER_END; - - return time_until_next; -} - -LV_ATTRIBUTE_TIMER_HANDLER void lv_timer_periodic_handler(void) -{ - lv_timer_state_t * state_p = &state; - if(lv_tick_elaps(state_p->periodic_last_tick) >= state_p->timer_time_until_next) { - LV_TRACE_TIMER("calling lv_timer_handler()"); - lv_timer_handler(); - state_p->periodic_last_tick = lv_tick_get(); - } -} - -lv_timer_t * lv_timer_create_basic(void) -{ - return lv_timer_create(NULL, DEF_PERIOD, NULL); -} - -lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data) -{ - lv_timer_t * new_timer = NULL; - - new_timer = lv_ll_ins_head(timer_ll_p); - LV_ASSERT_MALLOC(new_timer); - if(new_timer == NULL) return NULL; - - new_timer->period = period; - new_timer->timer_cb = timer_xcb; - new_timer->repeat_count = -1; - new_timer->paused = 0; - new_timer->last_run = lv_tick_get(); - new_timer->user_data = user_data; - new_timer->auto_delete = true; - - state.timer_created = true; - - lv_timer_handler_resume(); - - return new_timer; -} - -void lv_timer_set_cb(lv_timer_t * timer, lv_timer_cb_t timer_cb) -{ - LV_ASSERT_NULL(timer); - timer->timer_cb = timer_cb; -} - -void lv_timer_delete(lv_timer_t * timer) -{ - lv_ll_remove(timer_ll_p, timer); - state.timer_deleted = true; - - lv_free(timer); -} - -void lv_timer_pause(lv_timer_t * timer) -{ - LV_ASSERT_NULL(timer); - timer->paused = true; -} - -void lv_timer_resume(lv_timer_t * timer) -{ - LV_ASSERT_NULL(timer); - timer->paused = false; - lv_timer_handler_resume(); -} - -void lv_timer_set_period(lv_timer_t * timer, uint32_t period) -{ - LV_ASSERT_NULL(timer); - timer->period = period; -} - -void lv_timer_ready(lv_timer_t * timer) -{ - LV_ASSERT_NULL(timer); - timer->last_run = lv_tick_get() - timer->period - 1; -} - -void lv_timer_set_repeat_count(lv_timer_t * timer, int32_t repeat_count) -{ - LV_ASSERT_NULL(timer); - timer->repeat_count = repeat_count; -} - -void lv_timer_set_auto_delete(lv_timer_t * timer, bool auto_delete) -{ - LV_ASSERT_NULL(timer); - timer->auto_delete = auto_delete; -} - -void lv_timer_set_user_data(lv_timer_t * timer, void * user_data) -{ - LV_ASSERT_NULL(timer); - timer->user_data = user_data; -} - -void lv_timer_reset(lv_timer_t * timer) -{ - LV_ASSERT_NULL(timer); - timer->last_run = lv_tick_get(); - lv_timer_handler_resume(); -} - -void lv_timer_enable(bool en) -{ - state.lv_timer_run = en; - if(en) lv_timer_handler_resume(); -} - -void lv_timer_core_deinit(void) -{ - lv_timer_enable(false); - - lv_ll_clear(timer_ll_p); -} - -uint32_t lv_timer_get_idle(void) -{ - return state.idle_last; -} - -uint32_t lv_timer_get_time_until_next(void) -{ - return state.timer_time_until_next; -} - -lv_timer_t * lv_timer_get_next(lv_timer_t * timer) -{ - if(timer == NULL) return lv_ll_get_head(timer_ll_p); - else return lv_ll_get_next(timer_ll_p, timer); -} - -LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler_run_in_period(uint32_t period) -{ - static uint32_t last_tick = 0; - - if(lv_tick_elaps(last_tick) >= period) { - last_tick = lv_tick_get(); - return lv_timer_handler(); - } - return 1; -} - -void * lv_timer_get_user_data(lv_timer_t * timer) -{ - return timer->user_data; -} - -bool lv_timer_get_paused(lv_timer_t * timer) -{ - return timer->paused; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Execute timer if its remaining time is zero - * @param timer pointer to lv_timer - * @return true: execute, false: not executed - */ -static bool lv_timer_exec(lv_timer_t * timer) -{ - if(timer->paused) return false; - - bool exec = false; - if(lv_timer_time_remaining(timer) == 0) { - /* Decrement the repeat count before executing the timer_cb. - * If any timer is deleted `if(timer->repeat_count == 0)` is not executed below - * but at least the repeat count is zero and the timer can be deleted in the next round*/ - int32_t original_repeat_count = timer->repeat_count; - if(timer->repeat_count > 0) timer->repeat_count--; - timer->last_run = lv_tick_get(); - LV_TRACE_TIMER("calling timer callback: %p", *((void **)&timer->timer_cb)); - - if(timer->timer_cb && original_repeat_count != 0) timer->timer_cb(timer); - - if(!state.timer_deleted) { - LV_TRACE_TIMER("timer callback %p finished", *((void **)&timer->timer_cb)); - } - else { - LV_TRACE_TIMER("timer callback finished"); - } - - LV_ASSERT_MEM_INTEGRITY(); - exec = true; - } - - if(state.timer_deleted == false) { /*The timer might be deleted by itself as well*/ - if(timer->repeat_count == 0) { /*The repeat count is over, delete the timer*/ - if(timer->auto_delete) { - LV_TRACE_TIMER("deleting timer with %p callback because the repeat count is over", *((void **)&timer->timer_cb)); - lv_timer_delete(timer); - } - else { - LV_TRACE_TIMER("pausing timer with %p callback because the repeat count is over", *((void **)&timer->timer_cb)); - lv_timer_pause(timer); - } - } - } - - return exec; -} - -/** - * Find out how much time remains before a timer must be run. - * @param timer pointer to lv_timer - * @return the time remaining, or 0 if it needs to be run again - */ -static uint32_t lv_timer_time_remaining(lv_timer_t * timer) -{ - /*Check if at least 'period' time elapsed*/ - uint32_t elp = lv_tick_elaps(timer->last_run); - if(elp >= timer->period) - return 0; - return timer->period - elp; -} - -/** - * Call the ready lv_timer - */ -static void lv_timer_handler_resume(void) -{ - /*If there is a timer which is ready to run then resume the timer loop*/ - state.timer_time_until_next = 0; - if(state.resume_cb) { - state.resume_cb(state.resume_data); - } -} - -void lv_timer_handler_set_resume_cb(lv_timer_handler_resume_cb_t cb, void * data) -{ - state.resume_cb = cb; - state.resume_data = data; -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_timer.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_timer.h deleted file mode 100644 index be25003..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_timer.h +++ /dev/null @@ -1,210 +0,0 @@ -/** - * @file lv_timer.h - */ - -#ifndef LV_TIMER_H -#define LV_TIMER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "../tick/lv_tick.h" -#include "lv_types.h" -#include "lv_ll.h" - -/********************* - * DEFINES - *********************/ -#ifndef LV_ATTRIBUTE_TIMER_HANDLER -#define LV_ATTRIBUTE_TIMER_HANDLER -#endif - -#define LV_NO_TIMER_READY 0xFFFFFFFF - -/********************** - * TYPEDEFS - **********************/ - -/** - * Timers execute this type of functions. - */ -typedef void (*lv_timer_cb_t)(lv_timer_t *); - -/** - * Timer handler resume this type of function. - */ -typedef void (*lv_timer_handler_resume_cb_t)(void * data); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -//! @cond Doxygen_Suppress - -/** - * Call it periodically to handle lv_timers. - * @return time till it needs to be run next (in ms) - */ -LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void); - -//! @endcond - -/** - * Call it in the super-loop of main() or threads. It will run lv_timer_handler() - * with a given period in ms. You can use it with sleep or delay in OS environment. - * This function is used to simplify the porting. - * @param period the period for running lv_timer_handler() - * @return the time after which it must be called again - */ -LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler_run_in_period(uint32_t period); - -/** - * Call it in the super-loop of main() or threads. It will automatically call lv_timer_handler() at the right time. - * This function is used to simplify the porting. - */ -LV_ATTRIBUTE_TIMER_HANDLER void lv_timer_periodic_handler(void); - -/** - * Set the resume callback to the timer handler - * @param cb the function to call when timer handler is resumed - * @param data pointer to a resume data - */ -void lv_timer_handler_set_resume_cb(lv_timer_handler_resume_cb_t cb, void * data); - -/** - * Create an "empty" timer. It needs to be initialized with at least - * `lv_timer_set_cb` and `lv_timer_set_period` - * @return pointer to the created timer - */ -lv_timer_t * lv_timer_create_basic(void); - -/** - * Create a new lv_timer - * @param timer_xcb a callback to call periodically. - * (the 'x' in the argument name indicates that it's not a fully generic function because it not follows - * the `func_name(object, callback, ...)` convention) - * @param period call period in ms unit - * @param user_data custom parameter - * @return pointer to the new timer - */ -lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data); - -/** - * Delete a lv_timer - * @param timer pointer to an lv_timer - */ -void lv_timer_delete(lv_timer_t * timer); - -/** - * Pause a timer. - * @param timer pointer to an lv_timer - */ -void lv_timer_pause(lv_timer_t * timer); - -/** - * Resume a timer. - * @param timer pointer to an lv_timer - */ -void lv_timer_resume(lv_timer_t * timer); - -/** - * Set the callback to the timer (the function to call periodically) - * @param timer pointer to a timer - * @param timer_cb the function to call periodically - */ -void lv_timer_set_cb(lv_timer_t * timer, lv_timer_cb_t timer_cb); - -/** - * Set new period for a lv_timer - * @param timer pointer to a lv_timer - * @param period the new period - */ -void lv_timer_set_period(lv_timer_t * timer, uint32_t period); - -/** - * Make a lv_timer ready. It will not wait its period. - * @param timer pointer to a lv_timer. - */ -void lv_timer_ready(lv_timer_t * timer); - -/** - * Set the number of times a timer will repeat. - * @param timer pointer to a lv_timer. - * @param repeat_count -1 : infinity; 0 : stop ; n>0: residual times - */ -void lv_timer_set_repeat_count(lv_timer_t * timer, int32_t repeat_count); - -/** - * Set whether a lv_timer will be deleted automatically when it is called `repeat_count` times. - * @param timer pointer to a lv_timer. - * @param auto_delete true: auto delete; false: timer will be paused when it is called `repeat_count` times. - */ -void lv_timer_set_auto_delete(lv_timer_t * timer, bool auto_delete); - -/** - * Set custom parameter to the lv_timer. - * @param timer pointer to a lv_timer. - * @param user_data custom parameter - */ -void lv_timer_set_user_data(lv_timer_t * timer, void * user_data); - -/** - * Reset a lv_timer. - * It will be called the previously set period milliseconds later. - * @param timer pointer to a lv_timer. - */ -void lv_timer_reset(lv_timer_t * timer); - -/** - * Enable or disable the whole lv_timer handling - * @param en true: lv_timer handling is running, false: lv_timer handling is suspended - */ -void lv_timer_enable(bool en); - -/** - * Get idle percentage - * @return the lv_timer idle in percentage - */ -uint32_t lv_timer_get_idle(void); - -/** - * Get the time remaining until the next timer will run - * @return the time remaining in ms - */ -uint32_t lv_timer_get_time_until_next(void); - -/** - * Iterate through the timers - * @param timer NULL to start iteration or the previous return value to get the next timer - * @return the next timer or NULL if there is no more timer - */ -lv_timer_t * lv_timer_get_next(lv_timer_t * timer); - -/** - * Get the user_data passed when the timer was created - * @param timer pointer to the lv_timer - * @return pointer to the user_data - */ -void * lv_timer_get_user_data(lv_timer_t * timer); - -/** - * Get the pause state of a timer - * @param timer pointer to a lv_timer - * @return true: timer is paused; false: timer is running - */ -bool lv_timer_get_paused(lv_timer_t * timer); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_timer_private.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_timer_private.h deleted file mode 100644 index b7f42b0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_timer_private.h +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @file lv_timer_private.h - * - */ - -#ifndef LV_TIMER_PRIVATE_H -#define LV_TIMER_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_timer.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Descriptor of a lv_timer - */ -struct lv_timer_t { - uint32_t period; /**< How often the timer should run */ - uint32_t last_run; /**< Last time the timer ran */ - lv_timer_cb_t timer_cb; /**< Timer function */ - void * user_data; /**< Custom user data */ - int32_t repeat_count; /**< 1: One time; -1 : infinity; n>0: residual times */ - uint32_t paused : 1; - uint32_t auto_delete : 1; -}; - -typedef struct { - lv_ll_t timer_ll; /**< Linked list to store the lv_timers */ - - bool lv_timer_run; - uint8_t idle_last; - bool timer_deleted; - bool timer_created; - uint32_t timer_time_until_next; - - bool already_running; - uint32_t periodic_last_tick; - uint32_t busy_time; - uint32_t idle_period_start; - uint32_t run_cnt; - - lv_timer_handler_resume_cb_t resume_cb; - void * resume_data; -} lv_timer_state_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Init the lv_timer module - */ -void lv_timer_core_init(void); - -/** - * Deinit the lv_timer module - */ -void lv_timer_core_deinit(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TIMER_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_types.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_types.h deleted file mode 100644 index b362e7a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_types.h +++ /dev/null @@ -1,375 +0,0 @@ -/** - * @file lv_types.h - * - */ - -#ifndef LV_TYPES_H -#define LV_TYPES_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" - -#ifndef __ASSEMBLY__ -#include LV_STDINT_INCLUDE -#include LV_STDDEF_INCLUDE -#include LV_STDBOOL_INCLUDE -#include LV_INTTYPES_INCLUDE -#include LV_LIMITS_INCLUDE -#include LV_STDARG_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ - -/*If __UINTPTR_MAX__ or UINTPTR_MAX are available, use them to determine arch size*/ -#if defined(__UINTPTR_MAX__) && __UINTPTR_MAX__ > 0xFFFFFFFF -#define LV_ARCH_64 - -#elif defined(UINTPTR_MAX) && UINTPTR_MAX > 0xFFFFFFFF -#define LV_ARCH_64 - -/*Otherwise use compiler-dependent means to determine arch size*/ -#elif defined(_WIN64) || defined(__x86_64__) || defined(__ppc64__) || defined (__aarch64__) -#define LV_ARCH_64 - -#endif - -/********************** - * TYPEDEFS - **********************/ - -/* Exclude C enum and struct definitions when included by assembly code */ -#ifndef __ASSEMBLY__ - -/** - * LVGL error codes. - */ -typedef enum { - LV_RESULT_INVALID = 0, /*Typically indicates that the object is deleted (become invalid) in the action - function or an operation was failed*/ - LV_RESULT_OK, /*The object is valid (no deleted) after the action*/ -} lv_result_t; - -#if defined(__cplusplus) || __STDC_VERSION__ >= 199901L -/*If c99 or newer, use the definition of uintptr_t directly from */ -typedef uintptr_t lv_uintptr_t; -typedef intptr_t lv_intptr_t; - -#else - -/*Otherwise, use the arch size determination*/ -#ifdef LV_ARCH_64 -typedef uint64_t lv_uintptr_t; -typedef int64_t lv_intptr_t; -#else -typedef uint32_t lv_uintptr_t; -typedef int32_t lv_intptr_t; -#endif - -#endif - -#if LV_USE_FLOAT -typedef float lv_value_precise_t; -#else -typedef int32_t lv_value_precise_t; -#endif - -/** - * Typedefs from various lvgl modules. - * They are defined here to avoid circular dependencies. - */ - -typedef struct lv_obj_t lv_obj_t; - -typedef uint16_t lv_state_t; -typedef uint32_t lv_part_t; - -typedef uint8_t lv_opa_t; - -typedef uint8_t lv_style_prop_t; - -typedef struct lv_obj_class_t lv_obj_class_t; - -typedef struct lv_group_t lv_group_t; - -typedef struct lv_display_t lv_display_t; - -typedef struct lv_layer_t lv_layer_t; -typedef struct lv_draw_unit_t lv_draw_unit_t; -typedef struct lv_draw_task_t lv_draw_task_t; - -typedef struct lv_indev_t lv_indev_t; - -typedef struct lv_event_t lv_event_t; - -typedef struct lv_timer_t lv_timer_t; - -typedef struct lv_theme_t lv_theme_t; - -typedef struct lv_anim_t lv_anim_t; - -typedef struct lv_font_t lv_font_t; - -typedef struct lv_image_decoder_t lv_image_decoder_t; - -typedef struct lv_image_decoder_dsc_t lv_image_decoder_dsc_t; - -typedef struct lv_fragment_t lv_fragment_t; -typedef struct lv_fragment_class_t lv_fragment_class_t; -typedef struct lv_fragment_managed_states_t lv_fragment_managed_states_t; - -typedef struct lv_profiler_builtin_config_t lv_profiler_builtin_config_t; - -typedef struct lv_rb_node_t lv_rb_node_t; - -typedef struct lv_rb_t lv_rb_t; - -typedef struct lv_color_filter_dsc_t lv_color_filter_dsc_t; - -typedef struct lv_event_dsc_t lv_event_dsc_t; - -typedef struct lv_fs_file_cache_t lv_fs_file_cache_t; - -typedef struct lv_fs_path_ex_t lv_fs_path_ex_t; - -typedef struct lv_image_decoder_args_t lv_image_decoder_args_t; - -typedef struct lv_image_cache_data_t lv_image_cache_data_t; - -typedef struct lv_image_header_cache_data_t lv_image_header_cache_data_t; - -typedef struct lv_draw_mask_t lv_draw_mask_t; - -typedef struct lv_grad_t lv_grad_t; - -typedef struct lv_draw_label_hint_t lv_draw_label_hint_t; - -typedef struct lv_draw_glyph_dsc_t lv_draw_glyph_dsc_t; - -typedef struct lv_draw_image_sup_t lv_draw_image_sup_t; - -typedef struct lv_draw_mask_rect_dsc_t lv_draw_mask_rect_dsc_t; - -typedef struct lv_obj_style_t lv_obj_style_t; - -typedef struct lv_obj_style_transition_dsc_t lv_obj_style_transition_dsc_t; - -typedef struct lv_hit_test_info_t lv_hit_test_info_t; - -typedef struct lv_cover_check_info_t lv_cover_check_info_t; - -typedef struct lv_obj_spec_attr_t lv_obj_spec_attr_t; - -typedef struct lv_image_t lv_image_t; - -typedef struct lv_animimg_t lv_animimg_t; - -typedef struct lv_arc_t lv_arc_t; - -typedef struct lv_label_t lv_label_t; - -typedef struct lv_bar_anim_t lv_bar_anim_t; - -typedef struct lv_bar_t lv_bar_t; - -typedef struct lv_button_t lv_button_t; - -typedef struct lv_buttonmatrix_t lv_buttonmatrix_t; - -typedef struct lv_calendar_t lv_calendar_t; - -typedef struct lv_canvas_t lv_canvas_t; - -typedef struct lv_chart_series_t lv_chart_series_t; - -typedef struct lv_chart_cursor_t lv_chart_cursor_t; - -typedef struct lv_chart_t lv_chart_t; - -typedef struct lv_checkbox_t lv_checkbox_t; - -typedef struct lv_dropdown_t lv_dropdown_t; - -typedef struct lv_dropdown_list_t lv_dropdown_list_t; - -typedef struct lv_imagebutton_src_info_t lv_imagebutton_src_info_t; - -typedef struct lv_imagebutton_t lv_imagebutton_t; - -typedef struct lv_keyboard_t lv_keyboard_t; - -typedef struct lv_led_t lv_led_t; - -typedef struct lv_line_t lv_line_t; - -typedef struct lv_menu_load_page_event_data_t lv_menu_load_page_event_data_t; - -typedef struct lv_menu_history_t lv_menu_history_t; - -typedef struct lv_menu_t lv_menu_t; - -typedef struct lv_menu_page_t lv_menu_page_t; - -typedef struct lv_msgbox_t lv_msgbox_t; - -typedef struct lv_roller_t lv_roller_t; - -typedef struct lv_scale_section_t lv_scale_section_t; - -typedef struct lv_scale_t lv_scale_t; - -typedef struct lv_slider_t lv_slider_t; - -typedef struct lv_span_t lv_span_t; - -typedef struct lv_spangroup_t lv_spangroup_t; - -typedef struct lv_textarea_t lv_textarea_t; - -typedef struct lv_spinbox_t lv_spinbox_t; - -typedef struct lv_switch_t lv_switch_t; - -typedef struct lv_table_cell_t lv_table_cell_t; - -typedef struct lv_table_t lv_table_t; - -typedef struct lv_tabview_t lv_tabview_t; - -typedef struct lv_tileview_t lv_tileview_t; - -typedef struct lv_tileview_tile_t lv_tileview_tile_t; - -typedef struct lv_win_t lv_win_t; - -typedef struct lv_observer_t lv_observer_t; - -typedef struct lv_monkey_config_t lv_monkey_config_t; - -typedef struct lv_ime_pinyin_t lv_ime_pinyin_t; - -typedef struct lv_file_explorer_t lv_file_explorer_t; - -typedef struct lv_barcode_t lv_barcode_t; - -typedef struct lv_gif_t lv_gif_t; - -typedef struct lv_qrcode_t lv_qrcode_t; - -typedef struct lv_freetype_outline_vector_t lv_freetype_outline_vector_t; - -typedef struct lv_freetype_outline_event_param_t lv_freetype_outline_event_param_t; - -typedef struct lv_fpoint_t lv_fpoint_t; - -typedef struct lv_matrix_t lv_matrix_t; - -typedef struct lv_vector_path_t lv_vector_path_t; - -typedef struct lv_vector_gradient_t lv_vector_gradient_t; - -typedef struct lv_vector_fill_dsc_t lv_vector_fill_dsc_t; - -typedef struct lv_vector_stroke_dsc_t lv_vector_stroke_dsc_t; - -typedef struct lv_vector_draw_dsc_t lv_vector_draw_dsc_t; - -typedef struct lv_draw_vector_task_dsc_t lv_draw_vector_task_dsc_t; - -typedef struct lv_vector_dsc_t lv_vector_dsc_t; - -typedef struct lv_xkb_t lv_xkb_t; - -typedef struct lv_libinput_event_t lv_libinput_event_t; - -typedef struct lv_libinput_t lv_libinput_t; - -typedef struct lv_draw_sw_unit_t lv_draw_sw_unit_t; - -typedef struct lv_draw_sw_mask_common_dsc_t lv_draw_sw_mask_common_dsc_t; - -typedef struct lv_draw_sw_mask_line_param_t lv_draw_sw_mask_line_param_t; - -typedef struct lv_draw_sw_mask_angle_param_t lv_draw_sw_mask_angle_param_t; - -typedef struct lv_draw_sw_mask_radius_param_t lv_draw_sw_mask_radius_param_t; - -typedef struct lv_draw_sw_mask_fade_param_t lv_draw_sw_mask_fade_param_t; - -typedef struct lv_draw_sw_mask_map_param_t lv_draw_sw_mask_map_param_t; - -typedef struct lv_draw_sw_blend_dsc_t lv_draw_sw_blend_dsc_t; - -typedef struct lv_draw_sw_blend_fill_dsc_t lv_draw_sw_blend_fill_dsc_t; - -typedef struct lv_draw_sw_blend_image_dsc_t lv_draw_sw_blend_image_dsc_t; - -typedef struct lv_draw_buf_handlers_t lv_draw_buf_handlers_t; - -typedef struct lv_rlottie_t lv_rlottie_t; - -typedef struct lv_ffmpeg_player_t lv_ffmpeg_player_t; - -typedef struct lv_glfw_window_t lv_glfw_window_t; -typedef struct lv_glfw_texture_t lv_glfw_texture_t; - -typedef uint32_t lv_prop_id_t; - -typedef struct lv_draw_buf_t lv_draw_buf_t; - -#if LV_USE_OBJ_PROPERTY -typedef struct lv_property_name_t lv_property_name_t; -#endif - -#if LV_USE_SYSMON - -typedef struct lv_sysmon_backend_data_t lv_sysmon_backend_data_t; - -#if LV_USE_PERF_MONITOR -typedef struct lv_sysmon_perf_info_t lv_sysmon_perf_info_t; -#endif /*LV_USE_PERF_MONITOR*/ - -#endif /*LV_USE_SYSMON*/ - -#endif /*__ASSEMBLY__*/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#define LV_UNUSED(x) ((void)x) - -#define _LV_CONCAT(x, y) x ## y -#define LV_CONCAT(x, y) _LV_CONCAT(x, y) -#undef _LV_CONCAT - -#define _LV_CONCAT3(x, y, z) x ## y ## z -#define LV_CONCAT3(x, y, z) _LV_CONCAT3(x, y, z) -#undef _LV_CONCAT3 - -#if defined(PYCPARSER) || defined(__CC_ARM) -#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) -#elif defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 4) || __GNUC__ > 4) -#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) __attribute__((format(gnu_printf, fmtstr, vararg))) -#elif (defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) || defined(__IAR_SYSTEMS_ICC__)) -#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) __attribute__((format(printf, fmtstr, vararg))) -#else -#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) -#endif - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TYPES_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_utils.c b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_utils.c deleted file mode 100644 index 8686921..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_utils.c +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @file lv_utils.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_utils.h" -#include "lv_fs.h" -#include "lv_types.h" -#include "cache/lv_image_cache.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void * lv_utils_bsearch(const void * key, const void * base, size_t n, size_t size, - int (*cmp)(const void * pRef, const void * pElement)) -{ - const char * middle; - int32_t c; - - for(middle = base; n != 0;) { - middle += (n / 2) * size; - if((c = (*cmp)(key, middle)) > 0) { - n = (n / 2) - ((n & 1) == 0); - base = (middle += size); - } - else if(c < 0) { - n /= 2; - middle = base; - } - else { - return (char *)middle; - } - } - return NULL; -} - -lv_result_t lv_draw_buf_save_to_file(const lv_draw_buf_t * draw_buf, const char * path) -{ - lv_fs_file_t file; - lv_fs_res_t res = lv_fs_open(&file, path, LV_FS_MODE_WR); - if(res != LV_FS_RES_OK) { - LV_LOG_ERROR("create file %s failed", path); - return LV_RESULT_INVALID; - } - - /*Image content modified, invalidate image cache.*/ - lv_image_cache_drop(path); - - uint32_t bw; - res = lv_fs_write(&file, &draw_buf->header, sizeof(draw_buf->header), &bw); - if(res != LV_FS_RES_OK || bw != sizeof(draw_buf->header)) { - LV_LOG_ERROR("write draw_buf->header failed"); - lv_fs_close(&file); - return LV_RESULT_INVALID; - } - - res = lv_fs_write(&file, draw_buf->data, draw_buf->data_size, &bw); - if(res != LV_FS_RES_OK || bw != draw_buf->data_size) { - LV_LOG_ERROR("write draw_buf->data failed"); - lv_fs_close(&file); - return LV_RESULT_INVALID; - } - - lv_fs_close(&file); - LV_LOG_TRACE("saved draw_buf to %s", path); - return LV_RESULT_OK; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_utils.h b/software/Power_Pico/Middlewares/LVGL/src/misc/lv_utils.h deleted file mode 100644 index 7a8d610..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/misc/lv_utils.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @file lv_utils.h - * - */ - -#ifndef LV_UTILS_H -#define LV_UTILS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_types.h" -#include "../draw/lv_draw_buf.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** Searches base[0] to base[n - 1] for an item that matches *key. - * - * @note The function cmp must return negative if it's first - * argument (the search key) is less that it's second (a table entry), - * zero if equal, and positive if greater. - * - * @note Items in the array must be in ascending order. - * - * @param key Pointer to item being searched for - * @param base Pointer to first element to search - * @param n Number of elements - * @param size Size of each element - * @param cmp Pointer to comparison function (see unicode_list_compare() - * as a comparison function example) - * - * @return a pointer to a matching item, or NULL if none exists. - */ -void * lv_utils_bsearch(const void * key, const void * base, size_t n, size_t size, - int (*cmp)(const void * pRef, const void * pElement)); - -/** - * Save a draw buf to a file - * @param draw_buf pointer to a draw buffer - * @param path path to the file to save - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: error - */ -lv_result_t lv_draw_buf_save_to_file(const lv_draw_buf_t * draw_buf, const char * path); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_cmsis_rtos2.c b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_cmsis_rtos2.c deleted file mode 100644 index ed414c8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_cmsis_rtos2.c +++ /dev/null @@ -1,195 +0,0 @@ -/** - * @file lv_cmsis_rtos2.c - * - */ - -/* - * Copyright (C) 2023 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_os.h" - -#if LV_USE_OS == LV_OS_CMSIS_RTOS2 - -#include "../misc/lv_log.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_result_t lv_thread_init(lv_thread_t * thread, lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, - void * user_data) -{ - static const osPriority_t prio_map[] = { - [LV_THREAD_PRIO_LOWEST] = osPriorityLow, - [LV_THREAD_PRIO_LOW] = osPriorityBelowNormal, - [LV_THREAD_PRIO_MID] = osPriorityNormal, - [LV_THREAD_PRIO_HIGH] = osPriorityHigh, - [LV_THREAD_PRIO_HIGHEST] = osPriorityRealtime7, - }; - - osThreadAttr_t c_tThreadAttribute = { - .stack_size = stack_size, - .priority = prio_map[prio], - }; - - *thread = osThreadNew(callback, user_data, &c_tThreadAttribute); - - if(NULL == *thread) { - LV_LOG_WARN("Error: Failed to create a cmsis-rtos2 thread."); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; - -} - -lv_result_t lv_thread_delete(lv_thread_t * thread) -{ - osThreadDetach(*thread); - osStatus_t status = osThreadTerminate(*thread); - if(status == osOK) { - return LV_RESULT_OK; - } - return LV_RESULT_INVALID; -} - -lv_result_t lv_mutex_init(lv_mutex_t * mutex) -{ - const osMutexAttr_t Thread_Mutex_attr = { - "LVGLMutex", - osMutexRecursive | osMutexPrioInherit | osMutexRobust, - }; - - *mutex = osMutexNew(&Thread_Mutex_attr); - if(*mutex == NULL) { - LV_LOG_WARN("Error: failed to create cmsis-rtos mutex"); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; - -} - -lv_result_t lv_mutex_lock(lv_mutex_t * mutex) -{ - osStatus_t status = osMutexAcquire(*mutex, 0U); - if(status != osOK) { - LV_LOG_WARN("Error: failed to lock cmsis-rtos2 mutex %d", (int)status); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) -{ - osStatus_t status = osMutexAcquire(*mutex, 0U); - if(status != osOK) { - LV_LOG_WARN("Error: failed to lock cmsis-rtos2 mutex in an ISR %d", (int)status); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) -{ - osStatus_t status = osMutexRelease(*mutex); - if(status != osOK) { - LV_LOG_WARN("Error: failed to release cmsis-rtos2 mutex %d", (int)status); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_delete(lv_mutex_t * mutex) -{ - osStatus_t status = osMutexDelete(*mutex); - if(status != osOK) { - LV_LOG_WARN("Error: failed to delete cmsis-rtos2 mutex %d", (int)status); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) -{ - *sync = osEventFlagsNew(NULL); - if(NULL == *sync) { - LV_LOG_WARN("Error: failed to create a cmsis-rtos2 EventFlag"); - return LV_RESULT_INVALID; - } - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) -{ - uint32_t ret = osEventFlagsWait(*sync, 0x01, osFlagsWaitAny, osWaitForever); - if(ret & (1 << 31)) { - LV_LOG_WARN("Error: failed to wait a cmsis-rtos2 EventFlag %d", ret); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) -{ - uint32_t ret = osEventFlagsSet(*sync, 0x01); - if(ret & (1 << 31)) { - LV_LOG_WARN("Error: failed to set a cmsis-rtos2 EventFlag %d", ret); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync) -{ - return lv_thread_sync_signal(sync); -} - -lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) -{ - osStatus_t status = osEventFlagsDelete(*sync); - if(status != osOK) { - LV_LOG_WARN("Error: failed to delete a cmsis-rtos2 EventFlag %d", (int)status); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_OS == LV_OS_CMSIS_RTOS2*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_cmsis_rtos2.h b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_cmsis_rtos2.h deleted file mode 100644 index 62481e7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_cmsis_rtos2.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @file lv_cmsis_rtos2.h - * - */ - -/* - * Copyright (C) 2023 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef LV_CMSIS_RTOS2_H -#define LV_CMSIS_RTOS2_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#if LV_USE_OS == LV_OS_CMSIS_RTOS2 - -#include "cmsis_os2.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef osThreadId_t lv_thread_t; - -typedef osMutexId_t lv_mutex_t; - -typedef osEventFlagsId_t lv_thread_sync_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_OS == LV_OS_CMSIS_RTOS2*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OS_CMSIS_RTOS2*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_freertos.c b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_freertos.c deleted file mode 100644 index f65a299..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_freertos.c +++ /dev/null @@ -1,563 +0,0 @@ -/** - * @file lv_freertos.c - * - */ - -/** - * Copyright 2023 NXP - * - * SPDX-License-Identifier: MIT - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_os.h" -#if LV_USE_OS == LV_OS_FREERTOS - -#include "atomic.h" - -#include "../tick/lv_tick.h" -#include "../misc/lv_log.h" -#include "../core/lv_global.h" - -/********************* - * DEFINES - *********************/ - -#define ulMAX_COUNT 10U -#ifndef pcTASK_NAME - #define pcTASK_NAME "lvglDraw" -#endif - -#define globals LV_GLOBAL_DEFAULT() - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void prvRunThread(void * pxArg); - -static void prvMutexInit(lv_mutex_t * pxMutex); - -static void prvCheckMutexInit(lv_mutex_t * pxMutex); - -static void prvCondInit(lv_thread_sync_t * pxCond); - -static void prvCheckCondInit(lv_thread_sync_t * pxCond); - -static void prvCheckCondInitIsr(lv_thread_sync_t * pxCond); - -#if !LV_USE_FREERTOS_TASK_NOTIFY -static void prvTestAndDecrement(lv_thread_sync_t * pxCond, - uint32_t ulLocalWaitingThreads); -#endif - -/********************** - * STATIC VARIABLES - **********************/ - -#if (ESP_PLATFORM) - static portMUX_TYPE critSectionMux = portMUX_INITIALIZER_UNLOCKED; -#endif - -/********************** - * MACROS - **********************/ - -#if (ESP_PLATFORM) - #define _enter_critical() taskENTER_CRITICAL(&critSectionMux); - #define _exit_critical() taskEXIT_CRITICAL(&critSectionMux); - #define _enter_critical_isr() taskENTER_CRITICAL_FROM_ISR(); - #define _exit_critical_isr(x) taskEXIT_CRITICAL_FROM_ISR(x); -#else - #define _enter_critical() taskENTER_CRITICAL(); - #define _exit_critical() taskEXIT_CRITICAL(); - #define _enter_critical_isr() taskENTER_CRITICAL_FROM_ISR(); - #define _exit_critical_isr(x) taskEXIT_CRITICAL_FROM_ISR(x); -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_result_t lv_thread_init(lv_thread_t * pxThread, lv_thread_prio_t xSchedPriority, - void (*pvStartRoutine)(void *), size_t usStackSize, - void * xAttr) -{ - pxThread->pTaskArg = xAttr; - pxThread->pvStartRoutine = pvStartRoutine; - - BaseType_t xTaskCreateStatus = xTaskCreate( - prvRunThread, - pcTASK_NAME, - (configSTACK_DEPTH_TYPE)(usStackSize / sizeof(StackType_t)), - (void *)pxThread, - tskIDLE_PRIORITY + xSchedPriority, - &pxThread->xTaskHandle); - - /* Ensure that the FreeRTOS task was successfully created. */ - if(xTaskCreateStatus != pdPASS) { - LV_LOG_ERROR("xTaskCreate failed!"); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_delete(lv_thread_t * pxThread) -{ - vTaskDelete(pxThread->xTaskHandle); - - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_init(lv_mutex_t * pxMutex) -{ - /* If mutex in uninitialized, perform initialization. */ - prvCheckMutexInit(pxMutex); - - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_lock(lv_mutex_t * pxMutex) -{ - /* If mutex in uninitialized, perform initialization. */ - prvCheckMutexInit(pxMutex); - - BaseType_t xMutexTakeStatus = xSemaphoreTake(pxMutex->xMutex, portMAX_DELAY); - if(xMutexTakeStatus != pdTRUE) { - LV_LOG_ERROR("xSemaphoreTake failed!"); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_lock_isr(lv_mutex_t * pxMutex) -{ - /* If mutex in uninitialized, perform initialization. */ - prvCheckMutexInit(pxMutex); - - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - - BaseType_t xMutexTakeStatus = xSemaphoreTakeFromISR(pxMutex->xMutex, &xHigherPriorityTaskWoken); - if(xMutexTakeStatus != pdTRUE) { - LV_LOG_ERROR("xSemaphoreTake failed!"); - return LV_RESULT_INVALID; - } - - /* If xHigherPriorityTaskWoken is now set to pdTRUE then a context switch - should be performed to ensure the interrupt returns directly to the highest - priority task. The macro used for this purpose is dependent on the port in - use and may be called portEND_SWITCHING_ISR(). */ - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_unlock(lv_mutex_t * pxMutex) -{ - /* If mutex in uninitialized, perform initialization. */ - prvCheckMutexInit(pxMutex); - - BaseType_t xMutexGiveStatus = xSemaphoreGive(pxMutex->xMutex); - if(xMutexGiveStatus != pdTRUE) { - LV_LOG_ERROR("xSemaphoreGive failed!"); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_delete(lv_mutex_t * pxMutex) -{ - vSemaphoreDelete(pxMutex->xMutex); - pxMutex->xIsInitialized = pdFALSE; - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_init(lv_thread_sync_t * pxCond) -{ - /* If the cond is uninitialized, perform initialization. */ - prvCheckCondInit(pxCond); - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_wait(lv_thread_sync_t * pxCond) -{ - lv_result_t lvRes = LV_RESULT_OK; - - /* If the cond is uninitialized, perform initialization. */ - prvCheckCondInit(pxCond); - -#if LV_USE_FREERTOS_TASK_NOTIFY - TaskHandle_t xCurrentTaskHandle = xTaskGetCurrentTaskHandle(); - - _enter_critical(); - BaseType_t xSyncSygnal = pxCond->xSyncSignal; - pxCond->xSyncSignal = pdFALSE; - if(xSyncSygnal == pdFALSE) { - /* The signal hasn't been sent yet. Tell the sender to notify this task */ - pxCond->xTaskToNotify = xCurrentTaskHandle; - } - /* If we have a signal from the other task, we should not ask to be notified */ - _exit_critical(); - - if(xSyncSygnal == pdFALSE) { - /* Wait for other task to notify this task. */ - ulTaskNotifyTake(pdTRUE, portMAX_DELAY); - } - /* If the signal was received, no wait needs to be done */ -#else - uint32_t ulLocalWaitingThreads; - - /* Acquire the mutex. */ - xSemaphoreTake(pxCond->xSyncMutex, portMAX_DELAY); - - while(!pxCond->xSyncSignal) { - /* Increase the counter of threads blocking on condition variable, then - * release the mutex. */ - - /* Atomically increments thread waiting by 1, and - * stores number of threads waiting before increment. */ - ulLocalWaitingThreads = Atomic_Increment_u32(&pxCond->ulWaitingThreads); - - BaseType_t xMutexStatus = xSemaphoreGive(pxCond->xSyncMutex); - - /* Wait on the condition variable. */ - if(xMutexStatus == pdTRUE) { - BaseType_t xCondWaitStatus = xSemaphoreTake( - pxCond->xCondWaitSemaphore, - portMAX_DELAY); - - /* Relock the mutex. */ - xSemaphoreTake(pxCond->xSyncMutex, portMAX_DELAY); - - if(xCondWaitStatus != pdTRUE) { - LV_LOG_ERROR("xSemaphoreTake(xCondWaitSemaphore) failed!"); - lvRes = LV_RESULT_INVALID; - - /* Atomically decrements thread waiting by 1. - * If iLocalWaitingThreads is updated by other thread(s) in between, - * this implementation guarantees to decrement by 1 based on the - * value currently in pxCond->ulWaitingThreads. */ - prvTestAndDecrement(pxCond, ulLocalWaitingThreads + 1); - } - } - else { - LV_LOG_ERROR("xSemaphoreGive(xSyncMutex) failed!"); - lvRes = LV_RESULT_INVALID; - - /* Atomically decrements thread waiting by 1. - * If iLocalWaitingThreads is updated by other thread(s) in between, - * this implementation guarantees to decrement by 1 based on the - * value currently in pxCond->ulWaitingThreads. */ - prvTestAndDecrement(pxCond, ulLocalWaitingThreads + 1); - } - } - - pxCond->xSyncSignal = pdFALSE; - - /* Release the mutex. */ - xSemaphoreGive(pxCond->xSyncMutex); -#endif - - return lvRes; -} - -lv_result_t lv_thread_sync_signal(lv_thread_sync_t * pxCond) -{ - /* If the cond is uninitialized, perform initialization. */ - prvCheckCondInit(pxCond); - -#if LV_USE_FREERTOS_TASK_NOTIFY - _enter_critical(); - TaskHandle_t xTaskToNotify = pxCond->xTaskToNotify; - pxCond->xTaskToNotify = NULL; - if(xTaskToNotify == NULL) { - /* No task waiting to be notified. Send this signal for later */ - pxCond->xSyncSignal = pdTRUE; - } - /* If a task is already waiting, there is no need to set the sync signal */ - _exit_critical(); - - if(xTaskToNotify != NULL) { - /* There is a task waiting. Send a notification to it */ - xTaskNotifyGive(xTaskToNotify); - } - /* If there was no task waiting to be notified, we sent a signal for it to see later. */ -#else - /* Acquire the mutex. */ - xSemaphoreTake(pxCond->xSyncMutex, portMAX_DELAY); - - pxCond->xSyncSignal = pdTRUE; - - /* Local copy of number of threads waiting. */ - uint32_t ulLocalWaitingThreads = pxCond->ulWaitingThreads; - - /* Test local copy of threads waiting is larger than zero. */ - while(ulLocalWaitingThreads > 0) { - /* Atomically check whether the copy in memory has changed. - * If not, set the copy of threads waiting in memory to zero. */ - if(ATOMIC_COMPARE_AND_SWAP_SUCCESS == Atomic_CompareAndSwap_u32( - &pxCond->ulWaitingThreads, - 0, - ulLocalWaitingThreads)) { - /* Unblock all. */ - for(uint32_t i = 0; i < ulLocalWaitingThreads; i++) { - xSemaphoreGive(pxCond->xCondWaitSemaphore); - } - - break; - } - - /* Local copy is out dated. Reload from memory and retry. */ - ulLocalWaitingThreads = pxCond->ulWaitingThreads; - } - - /* Release the mutex. */ - xSemaphoreGive(pxCond->xSyncMutex); -#endif - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_delete(lv_thread_sync_t * pxCond) -{ -#if !LV_USE_FREERTOS_TASK_NOTIFY - /* Cleanup all resources used by the cond. */ - vSemaphoreDelete(pxCond->xCondWaitSemaphore); - vSemaphoreDelete(pxCond->xSyncMutex); - pxCond->ulWaitingThreads = 0; -#endif - pxCond->xSyncSignal = pdFALSE; - pxCond->xIsInitialized = pdFALSE; - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * pxCond) -{ - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - - /* If the cond is uninitialized, perform initialization. */ - prvCheckCondInitIsr(pxCond); - -#if LV_USE_FREERTOS_TASK_NOTIFY - uint32_t mask = _enter_critical_isr(); - TaskHandle_t xTaskToNotify = pxCond->xTaskToNotify; - pxCond->xTaskToNotify = NULL; - if(xTaskToNotify == NULL) { - /* No task waiting to be notified. Send this signal for later */ - pxCond->xSyncSignal = pdTRUE; - } - /* If a task is already waiting, there is no need to set the sync signal */ - _exit_critical_isr(mask); - - if(xTaskToNotify != NULL) { - /* There is a task waiting. Send a notification to it */ - vTaskNotifyGiveFromISR(xTaskToNotify, &xHigherPriorityTaskWoken); - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } - /* If there was no task waiting to be notified, we sent a signal for it to see later. */ -#else - /* Enter critical section to prevent preemption. */ - uint32_t mask = _enter_critical_isr(); - - pxCond->xSyncSignal = pdTRUE; - BaseType_t xAnyHigherPriorityTaskWoken = pdFALSE; - - /* Unblock all. */ - for(uint32_t i = 0; i < pxCond->ulWaitingThreads; i++) { - xSemaphoreGiveFromISR(pxCond->xCondWaitSemaphore, &xAnyHigherPriorityTaskWoken); - xHigherPriorityTaskWoken |= xAnyHigherPriorityTaskWoken; - } - - _exit_critical_isr(mask); - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); -#endif - - return LV_RESULT_OK; -} - - -void lv_freertos_task_switch_in(const char * name) -{ - if(lv_strcmp(name, "IDLE")) globals->freertos_idle_task_running = false; - else globals->freertos_idle_task_running = true; - - globals->freertos_task_switch_timestamp = lv_tick_get(); -} - -void lv_freertos_task_switch_out(void) -{ - uint32_t elaps = lv_tick_elaps(globals->freertos_task_switch_timestamp); - if(globals->freertos_idle_task_running) globals->freertos_idle_time_sum += elaps; - else globals->freertos_non_idle_time_sum += elaps; -} - -uint32_t lv_os_get_idle_percent(void) -{ - if(globals->freertos_non_idle_time_sum + globals->freertos_idle_time_sum == 0) { - LV_LOG_WARN("Not enough time elapsed to provide idle percentage"); - return 0; - } - - uint32_t pct = (globals->freertos_idle_time_sum * 100) / (globals->freertos_idle_time_sum + - globals->freertos_non_idle_time_sum); - - globals->freertos_non_idle_time_sum = 0; - globals->freertos_idle_time_sum = 0; - - return pct; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void prvRunThread(void * pxArg) -{ - lv_thread_t * pxThread = (lv_thread_t *)pxArg; - - /* Run the thread routine. */ - pxThread->pvStartRoutine((void *)pxThread->pTaskArg); - - vTaskDelete(NULL); -} - -static void prvMutexInit(lv_mutex_t * pxMutex) -{ - pxMutex->xMutex = xSemaphoreCreateRecursiveMutex(); - - /* Ensure that the FreeRTOS mutex was successfully created. */ - if(pxMutex->xMutex == NULL) { - LV_LOG_ERROR("xSemaphoreCreateMutex failed!"); - return; - } - - /* Mutex successfully created. */ - pxMutex->xIsInitialized = pdTRUE; -} - -static void prvCheckMutexInit(lv_mutex_t * pxMutex) -{ - /* Check if the mutex needs to be initialized. */ - if(pxMutex->xIsInitialized == pdFALSE) { - /* Mutex initialization must be in a critical section to prevent two threads - * from initializing it at the same time. */ - _enter_critical(); - - /* Check again that the mutex is still uninitialized, i.e. it wasn't - * initialized while this function was waiting to enter the critical - * section. */ - if(pxMutex->xIsInitialized == pdFALSE) { - prvMutexInit(pxMutex); - } - - /* Exit the critical section. */ - _exit_critical(); - } -} - -static void prvCondInit(lv_thread_sync_t * pxCond) -{ - pxCond->xIsInitialized = pdTRUE; - pxCond->xSyncSignal = pdFALSE; - -#if LV_USE_FREERTOS_TASK_NOTIFY - pxCond->xTaskToNotify = NULL; -#else - pxCond->xCondWaitSemaphore = xSemaphoreCreateCounting(ulMAX_COUNT, 0U); - - /* Ensure that the FreeRTOS semaphore was successfully created. */ - if(pxCond->xCondWaitSemaphore == NULL) { - LV_LOG_ERROR("xSemaphoreCreateCounting failed!"); - return; - } - - pxCond->xSyncMutex = xSemaphoreCreateMutex(); - - /* Ensure that the FreeRTOS mutex was successfully created. */ - if(pxCond->xSyncMutex == NULL) { - LV_LOG_ERROR("xSemaphoreCreateMutex failed!"); - /* Cleanup. */ - vSemaphoreDelete(pxCond->xCondWaitSemaphore); - return; - } - - /* Condition variable successfully created. */ - pxCond->ulWaitingThreads = 0; -#endif -} - -static void prvCheckCondInit(lv_thread_sync_t * pxCond) -{ - /* Check if the condition variable needs to be initialized. */ - if(pxCond->xIsInitialized == pdFALSE) { - /* Cond initialization must be in a critical section to prevent two - * threads from initializing it at the same time. */ - _enter_critical(); - - /* Check again that the condition is still uninitialized, i.e. it wasn't - * initialized while this function was waiting to enter the critical - * section. */ - if(pxCond->xIsInitialized == pdFALSE) { - prvCondInit(pxCond); - } - - /* Exit the critical section. */ - _exit_critical(); - } -} - -static void prvCheckCondInitIsr(lv_thread_sync_t * pxCond) -{ - /* Check if the condition variable needs to be initialized. */ - if(pxCond->xIsInitialized == pdFALSE) { - /* Cond initialization must be in a critical section to prevent two - * threads from initializing it at the same time. */ - uint32_t mask = _enter_critical_isr(); - - /* Check again that the condition is still uninitialized, i.e. it wasn't - * initialized while this function was waiting to enter the critical - * section. */ - if(pxCond->xIsInitialized == pdFALSE) { - prvCondInit(pxCond); - } - - /* Exit the critical section. */ - _exit_critical_isr(mask); - } -} - -#if !LV_USE_FREERTOS_TASK_NOTIFY -static void prvTestAndDecrement(lv_thread_sync_t * pxCond, - uint32_t ulLocalWaitingThreads) -{ - /* Test local copy of threads waiting is larger than zero. */ - while(ulLocalWaitingThreads > 0) { - /* Atomically check whether the copy in memory has changed. - * If not, decrease the copy of threads waiting in memory. */ - if(ATOMIC_COMPARE_AND_SWAP_SUCCESS == Atomic_CompareAndSwap_u32( - &pxCond->ulWaitingThreads, - ulLocalWaitingThreads - 1, - ulLocalWaitingThreads)) { - /* Signal one succeeded. Break. */ - break; - } - - /* Local copy may be out dated. Reload from memory and retry. */ - ulLocalWaitingThreads = pxCond->ulWaitingThreads; - } -} -#endif - -#endif /*LV_USE_OS == LV_OS_FREERTOS*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_freertos.h b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_freertos.h deleted file mode 100644 index 67a5a1e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_freertos.h +++ /dev/null @@ -1,105 +0,0 @@ -/** - * @file lv_freertos.h - * - */ - -/** - * Copyright 2023 NXP - * - * SPDX-License-Identifier: MIT - */ - -#ifndef LV_FREERTOS_H -#define LV_FREERTOS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_os.h" - -#if LV_USE_OS == LV_OS_FREERTOS - -#if (ESP_PLATFORM) -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/semphr.h" -#else -#include "FreeRTOS.h" -#include "task.h" -#include "semphr.h" -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - void (*pvStartRoutine)(void *); /**< Application thread function. */ - void * pTaskArg; /**< Arguments for application thread function. */ - TaskHandle_t xTaskHandle; /**< FreeRTOS task handle. */ -} lv_thread_t; - -typedef struct { - BaseType_t xIsInitialized; /**< Set to pdTRUE if this mutex is initialized, pdFALSE otherwise. */ - SemaphoreHandle_t xMutex; /**< FreeRTOS mutex. */ -} lv_mutex_t; - -typedef struct { - BaseType_t - xIsInitialized; /**< Set to pdTRUE if this condition variable is initialized, pdFALSE otherwise. */ - BaseType_t xSyncSignal; /**< Set to pdTRUE if the thread is signaled, pdFALSE otherwise. */ -#if LV_USE_FREERTOS_TASK_NOTIFY - TaskHandle_t xTaskToNotify; /**< The task waiting to be signalled. NULL if nothing is waiting. */ -#else - SemaphoreHandle_t xCondWaitSemaphore; /**< Threads block on this semaphore in lv_thread_sync_wait. */ - uint32_t ulWaitingThreads; /**< The number of threads currently waiting on this condition variable. */ - SemaphoreHandle_t xSyncMutex; /**< Threads take this mutex before accessing the condition variable. */ -#endif -} lv_thread_sync_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Set it for `traceTASK_SWITCHED_IN()` as - * `lv_freertos_task_switch_in(pxCurrentTCB->pcTaskName)` - * to save the start time stamp of a task - * @param name the name of the which is switched in - */ -void lv_freertos_task_switch_in(const char * name); - -/** - * Set it for `traceTASK_SWITCHED_OUT()` as - * `lv_freertos_task_switch_out()` - * to save finish time stamp of a task - */ -void lv_freertos_task_switch_out(void); - -/** - * Set it for `LV_SYSMON_GET_IDLE` to show the CPU usage - * as reported based the usage of FreeRTOS's idle task - * If it's important when a GPU is used. - * @return the idle percentage since the last call - */ -uint32_t lv_os_get_idle_percent(void); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_OS == LV_OS_FREERTOS*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_FREERTOS_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_mqx.c b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_mqx.c deleted file mode 100644 index fed82f4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_mqx.c +++ /dev/null @@ -1,169 +0,0 @@ -/** - * @file lv_mqx.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_os.h" - -#if LV_USE_OS == LV_OS_MQX - -#include "../misc/lv_log.h" -#include "../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_result_t lv_thread_init(lv_thread_t * thread, lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, - void * user_data) -{ - TASK_TEMPLATE_STRUCT task_template; - - lv_memzero(&task_template, sizeof(task_template)); - - task_template.TASK_ADDRESS = (TASK_FPTR)callback; - task_template.TASK_STACKSIZE = stack_size; - task_template.TASK_PRIORITY = _sched_get_min_priority(0) - prio; - task_template.TASK_NAME = "lvglDraw"; - task_template.CREATION_PARAMETER = (uint32_t)user_data; - - *thread = _task_create(0, 0, (uint32_t)&task_template); - if(*thread == MQX_NULL_TASK_ID) { - LV_LOG_WARN("_task_create failed!"); - return LV_RESULT_INVALID; - } - return LV_RESULT_OK; -} - -lv_result_t lv_thread_delete(lv_thread_t * thread) -{ - _mqx_uint ret = _task_destroy(*thread); - if(ret != MQX_OK) { - LV_LOG_WARN("_task_destroy failed!"); - return LV_RESULT_INVALID; - } - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_init(lv_mutex_t * mutex) -{ - if(MQX_OK != _mutex_init(mutex, NULL)) { - LV_LOG_WARN("create mutex failed"); - return LV_RESULT_INVALID; - } - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_lock(lv_mutex_t * mutex) -{ - _mqx_uint ret = _mutex_lock(mutex); - if(ret != MQX_OK) { - LV_LOG_WARN("Error: %x", ret); - return LV_RESULT_INVALID; - } - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) -{ - _mqx_uint ret = _mutex_lock(mutex); - if(ret != MQX_OK) { - LV_LOG_WARN("Error: %x", ret); - return LV_RESULT_INVALID; - } - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) -{ - _mqx_uint ret = _mutex_unlock(mutex); - if(ret != MQX_OK) { - LV_LOG_WARN("Error: %x", ret); - return LV_RESULT_INVALID; - } - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_delete(lv_mutex_t * mutex) -{ - _mqx_uint ret = _mutex_destroy(mutex); - if(ret != MQX_OK) { - LV_LOG_WARN("Error: %x", ret); - return LV_RESULT_INVALID; - } - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) -{ - if(MQX_OK != _lwsem_create(sync, 0)) { - LV_LOG_WARN("create semaphore failed"); - return LV_RESULT_INVALID; - } - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) -{ - _mqx_uint ret = _lwsem_wait(sync); - if(ret != MQX_OK) { - LV_LOG_WARN("Error: %x", ret); - return LV_RESULT_INVALID; - } - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) -{ - _mqx_uint ret = _lwsem_post(sync); - if(ret != MQX_OK) { - LV_LOG_WARN("Error: %x", ret); - return LV_RESULT_INVALID; - } - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) -{ - _mqx_uint ret = _lwsem_destroy(sync); - if(ret != MQX_OK) { - LV_LOG_WARN("Error: %x", ret); - return LV_RESULT_INVALID; - } - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync) -{ - LV_UNUSED(sync); - return LV_RESULT_INVALID; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_OS == LV_OS_MQX*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_mqx.h b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_mqx.h deleted file mode 100644 index 601f596..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_mqx.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @file lv_mqx.h - * - */ - -#ifndef LV_MQX_H -#define LV_MQX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_os.h" - -#if LV_USE_OS == LV_OS_MQX - -#include "mqx.h" -#include "mutex.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef _task_id lv_thread_t; - -typedef MUTEX_STRUCT lv_mutex_t; - -typedef LWSEM_STRUCT lv_thread_sync_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_OS == LV_OS_MQX*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_MQX_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os.c b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os.c deleted file mode 100644 index 7b775f0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os.c +++ /dev/null @@ -1,71 +0,0 @@ -/** - * @file lv_os.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_os.h" -#include "lv_os_private.h" -#include "../core/lv_global.h" - -/********************* - * DEFINES - *********************/ -#define lv_general_mutex LV_GLOBAL_DEFAULT()->lv_general_mutex - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_os_init(void) -{ -#if LV_USE_OS != LV_OS_NONE - lv_mutex_init(&lv_general_mutex); -#endif /*LV_USE_OS != LV_OS_NONE*/ -} - -void lv_lock(void) -{ -#if LV_USE_OS != LV_OS_NONE - lv_mutex_lock(&lv_general_mutex); -#endif /*LV_USE_OS != LV_OS_NONE*/ -} - -lv_result_t lv_lock_isr(void) -{ -#if LV_USE_OS != LV_OS_NONE - return lv_mutex_lock_isr(&lv_general_mutex); -#else /*LV_USE_OS != LV_OS_NONE*/ - return LV_RESULT_OK; -#endif /*LV_USE_OS != LV_OS_NONE*/ -} - -void lv_unlock(void) -{ -#if LV_USE_OS != LV_OS_NONE - lv_mutex_unlock(&lv_general_mutex); -#endif /*LV_USE_OS != LV_OS_NONE*/ -} - -/********************** - * STATIC FUNCTIONS - **********************/ - diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os.h b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os.h deleted file mode 100644 index d0a4e02..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os.h +++ /dev/null @@ -1,186 +0,0 @@ -/** - * @file lv_os.h - * - */ - -#ifndef LV_OS_H -#define LV_OS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * OS OPTIONS - *********************/ - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" - -#include "../misc/lv_types.h" - -#if LV_USE_OS == LV_OS_NONE -#include "lv_os_none.h" -#elif LV_USE_OS == LV_OS_PTHREAD -#include "lv_pthread.h" -#elif LV_USE_OS == LV_OS_FREERTOS -#include "lv_freertos.h" -#elif LV_USE_OS == LV_OS_CMSIS_RTOS2 -#include "lv_cmsis_rtos2.h" -#elif LV_USE_OS == LV_OS_RTTHREAD -#include "lv_rtthread.h" -#elif LV_USE_OS == LV_OS_WINDOWS -#include "lv_windows.h" -#elif LV_USE_OS == LV_OS_MQX -#include "lv_mqx.h" -#elif LV_USE_OS == LV_OS_CUSTOM -#include LV_OS_CUSTOM_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef enum { - LV_THREAD_PRIO_LOWEST, - LV_THREAD_PRIO_LOW, - LV_THREAD_PRIO_MID, - LV_THREAD_PRIO_HIGH, - LV_THREAD_PRIO_HIGHEST, -} lv_thread_prio_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/*---------------------------------------- - * These functions needs to be implemented - * for specific operating systems - *---------------------------------------*/ - -/** - * Create a new thread - * @param thread a variable in which the thread will be stored - * @param prio priority of the thread - * @param callback function of the thread - * @param stack_size stack size in bytes - * @param user_data arbitrary data, will be available in the callback - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure - */ -lv_result_t lv_thread_init(lv_thread_t * thread, lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, - void * user_data); - -/** - * Delete a thread - * @param thread the thread to delete - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure - */ -lv_result_t lv_thread_delete(lv_thread_t * thread); - -/** - * Create a mutex - * @param mutex a variable in which the thread will be stored - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure - */ -lv_result_t lv_mutex_init(lv_mutex_t * mutex); - -/** - * Lock a mutex - * @param mutex the mutex to lock - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure - */ -lv_result_t lv_mutex_lock(lv_mutex_t * mutex); - -/** - * Lock a mutex from interrupt - * @param mutex the mutex to lock - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure - */ -lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex); - -/** - * Unlock a mutex - * @param mutex the mutex to unlock - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure - */ -lv_result_t lv_mutex_unlock(lv_mutex_t * mutex); - -/** - * Delete a mutex - * @param mutex the mutex to delete - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure - */ -lv_result_t lv_mutex_delete(lv_mutex_t * mutex); - -/** - * Create a thread synchronization object - * @param sync a variable in which the sync will be stored - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure - */ -lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync); - -/** - * Wait for a "signal" on a sync object - * @param sync a sync object - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure - */ -lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync); - -/** - * Send a wake-up signal to a sync object - * @param sync a sync object - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure - */ -lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync); - -/** - * Send a wake-up signal to a sync object from interrupt - * @param sync a sync object - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure - */ -lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync); - -/** - * Delete a sync object - * @param sync a sync object to delete - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure - */ -lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync); - -/** - * Lock LVGL's general mutex. - * LVGL is not thread safe, so a mutex is used to avoid executing multiple LVGL functions at the same time - * from different threads. It shall be called when calling LVGL functions from threads - * different than lv_timer_handler's thread. It doesn't need to be called in LVGL events because - * they are called from lv_timer_handler(). - * It is called internally in lv_timer_handler(). - */ -void lv_lock(void); - -/** - * Same as `lv_lock()` but can be called from an interrupt. - * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure - */ -lv_result_t lv_lock_isr(void); - -/** - * The pair of `lv_lock()` and `lv_lock_isr()`. - * It unlocks LVGL general mutex. - * It is called internally in lv_timer_handler(). - */ -void lv_unlock(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OS_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os_none.c b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os_none.c deleted file mode 100644 index 547810d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os_none.c +++ /dev/null @@ -1,127 +0,0 @@ -/** - * @file lv_os_none.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_os.h" - -#if LV_USE_OS == LV_OS_NONE -#include "../misc/lv_types.h" -#include "../misc/lv_assert.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_result_t lv_thread_init(lv_thread_t * thread, lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, - void * user_data) -{ - LV_UNUSED(thread); - LV_UNUSED(callback); - LV_UNUSED(prio); - LV_UNUSED(stack_size); - LV_UNUSED(user_data); - LV_ASSERT(0); - return LV_RESULT_INVALID; -} - -lv_result_t lv_thread_delete(lv_thread_t * thread) -{ - LV_UNUSED(thread); - LV_ASSERT(0); - return LV_RESULT_INVALID; -} - -lv_result_t lv_mutex_init(lv_mutex_t * mutex) -{ - LV_UNUSED(mutex); - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_lock(lv_mutex_t * mutex) -{ - LV_UNUSED(mutex); - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) -{ - LV_UNUSED(mutex); - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) -{ - LV_UNUSED(mutex); - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_delete(lv_mutex_t * mutex) -{ - LV_UNUSED(mutex); - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) -{ - LV_UNUSED(sync); - LV_ASSERT(0); - return LV_RESULT_INVALID; -} - -lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) -{ - LV_UNUSED(sync); - LV_ASSERT(0); - return LV_RESULT_INVALID; -} - -lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) -{ - LV_UNUSED(sync); - LV_ASSERT(0); - return LV_RESULT_INVALID; -} - -lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync) -{ - LV_UNUSED(sync); - LV_ASSERT(0); - return LV_RESULT_INVALID; -} - -lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) -{ - LV_UNUSED(sync); - LV_ASSERT(0); - return LV_RESULT_INVALID; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_OS == LV_OS_NONE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os_none.h b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os_none.h deleted file mode 100644 index e08a0dc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os_none.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @file lv_os_none.h - * - */ - -#ifndef LV_OS_NONE_H -#define LV_OS_NONE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#if LV_USE_OS == LV_OS_NONE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef int lv_mutex_t; -typedef int lv_thread_t; -typedef int lv_thread_sync_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_OS == LV_OS_NONE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OS_NONE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os_private.h b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os_private.h deleted file mode 100644 index 4fe08cd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_os_private.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @file lv_os_private.h - * - */ - -#ifndef LV_OS_PRIVATE_H -#define LV_OS_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * OS OPTIONS - *********************/ - -/********************* - * INCLUDES - *********************/ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the OS layer - */ -void lv_os_init(void); - - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OS_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_pthread.c b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_pthread.c deleted file mode 100644 index 268f055..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_pthread.c +++ /dev/null @@ -1,178 +0,0 @@ -/** - * @file lv_pthread.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_os.h" - -#if LV_USE_OS == LV_OS_PTHREAD - -#include -#include "../misc/lv_log.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void * generic_callback(void * user_data); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_result_t lv_thread_init(lv_thread_t * thread, lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, - void * user_data) -{ - LV_UNUSED(prio); - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setstacksize(&attr, stack_size); - thread->callback = callback; - thread->user_data = user_data; - pthread_create(&thread->thread, &attr, generic_callback, thread); - return LV_RESULT_OK; -} - -lv_result_t lv_thread_delete(lv_thread_t * thread) -{ - int ret = pthread_join(thread->thread, NULL); - if(ret != 0) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_init(lv_mutex_t * mutex) -{ - pthread_mutexattr_t attr; - - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - int ret = pthread_mutex_init(mutex, &attr); - pthread_mutexattr_destroy(&attr); - - if(ret) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_mutex_lock(lv_mutex_t * mutex) -{ - int ret = pthread_mutex_lock(mutex); - if(ret) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) -{ - int ret = pthread_mutex_lock(mutex); - if(ret) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) -{ - int ret = pthread_mutex_unlock(mutex); - if(ret) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_mutex_delete(lv_mutex_t * mutex) -{ - pthread_mutex_destroy(mutex); - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) -{ - pthread_mutex_init(&sync->mutex, 0); - pthread_cond_init(&sync->cond, 0); - sync->v = false; - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) -{ - pthread_mutex_lock(&sync->mutex); - while(!sync->v) { - pthread_cond_wait(&sync->cond, &sync->mutex); - } - sync->v = false; - pthread_mutex_unlock(&sync->mutex); - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) -{ - pthread_mutex_lock(&sync->mutex); - sync->v = true; - pthread_cond_signal(&sync->cond); - pthread_mutex_unlock(&sync->mutex); - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) -{ - pthread_mutex_destroy(&sync->mutex); - pthread_cond_destroy(&sync->cond); - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync) -{ - LV_UNUSED(sync); - return LV_RESULT_INVALID; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void * generic_callback(void * user_data) -{ - lv_thread_t * thread = user_data; - thread->callback(thread->user_data); - return NULL; -} - -#endif /*LV_USE_OS == LV_OS_PTHREAD*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_pthread.h b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_pthread.h deleted file mode 100644 index e7abc90..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_pthread.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @file lv_pthread.h - * - */ - -#ifndef LV_PTHREAD_H -#define LV_PTHREAD_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#if LV_USE_OS == LV_OS_PTHREAD - -#include -#include -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - pthread_t thread; - void (*callback)(void *); - void * user_data; -} lv_thread_t; - -typedef pthread_mutex_t lv_mutex_t; - -typedef struct { - pthread_mutex_t mutex; - pthread_cond_t cond; - bool v; -} lv_thread_sync_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_OS == LV_OS_PTHREAD*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_PTHREAD_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_rtthread.c b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_rtthread.c deleted file mode 100644 index e781634..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_rtthread.c +++ /dev/null @@ -1,190 +0,0 @@ -/** - * @file lv_rtthread.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_os.h" - -#if LV_USE_OS == LV_OS_RTTHREAD - -#include "../misc/lv_log.h" - -/********************* - * DEFINES - *********************/ - -#define THREAD_TIMESLICE 20U - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_result_t lv_thread_init(lv_thread_t * thread, lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, - void * user_data) -{ - thread->thread = rt_thread_create("thread", - callback, - user_data, - stack_size, - prio, - THREAD_TIMESLICE); - rt_err_t ret = rt_thread_startup(thread->thread); - if(ret) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_thread_delete(lv_thread_t * thread) -{ - rt_err_t ret = rt_thread_delete(thread->thread); - if(ret) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_mutex_init(lv_mutex_t * mutex) -{ - mutex->mutex = rt_mutex_create("mutex", RT_IPC_FLAG_PRIO); - if(mutex->mutex == RT_NULL) { - LV_LOG_WARN("create mutex failed"); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_mutex_lock(lv_mutex_t * mutex) -{ - rt_err_t ret = rt_mutex_take(mutex->mutex, RT_WAITING_FOREVER); - if(ret) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) -{ - rt_err_t ret = rt_mutex_take(mutex->mutex, RT_WAITING_FOREVER); - if(ret) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) -{ - rt_err_t ret = rt_mutex_release(mutex->mutex); - if(ret) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_mutex_delete(lv_mutex_t * mutex) -{ - rt_err_t ret = rt_mutex_delete(mutex->mutex); - if(ret) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) -{ - sync->sem = rt_sem_create("sem", 0, RT_IPC_FLAG_PRIO); - if(sync->sem == RT_NULL) { - LV_LOG_WARN("create semaphore failed"); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) -{ - rt_err_t ret = rt_sem_take(sync->sem, RT_WAITING_FOREVER); - if(ret) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) -{ - rt_err_t ret = rt_sem_release(sync->sem); - if(ret) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) -{ - rt_err_t ret = rt_sem_delete(sync->sem); - if(ret) { - LV_LOG_WARN("Error: %d", ret); - return LV_RESULT_INVALID; - } - else { - return LV_RESULT_OK; - } -} - -lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync) -{ - LV_UNUSED(sync); - return LV_RESULT_INVALID; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_OS == LV_OS_RTTHREAD*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_rtthread.h b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_rtthread.h deleted file mode 100644 index 255a47a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_rtthread.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @file lv_rtthread.h - * - */ - -#ifndef LV_RTTHREAD_H -#define LV_RTTHREAD_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#if LV_USE_OS == LV_OS_RTTHREAD - -#include -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - rt_thread_t thread; -} lv_thread_t; - -typedef struct { - rt_mutex_t mutex; -} lv_mutex_t; - -typedef struct { - rt_sem_t sem; -} lv_thread_sync_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_OS == LV_OS_RTTHREAD*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_RTTHREAD_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_windows.c b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_windows.c deleted file mode 100644 index 78ac293..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_windows.c +++ /dev/null @@ -1,222 +0,0 @@ -/** - * @file lv_windows.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_os.h" - -#if LV_USE_OS == LV_OS_WINDOWS - -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - void (*callback)(void *); - void * user_data; -} lv_thread_init_data_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static unsigned __stdcall thread_start_routine(void * parameter); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_result_t lv_thread_init( - lv_thread_t * thread, - lv_thread_prio_t prio, - void (*callback)(void *), - size_t stack_size, - void * user_data) -{ - if(!thread) { - return LV_RESULT_INVALID; - } - - static const int prio_map[] = { - [LV_THREAD_PRIO_LOWEST] = THREAD_PRIORITY_LOWEST, - [LV_THREAD_PRIO_LOW] = THREAD_PRIORITY_BELOW_NORMAL, - [LV_THREAD_PRIO_MID] = THREAD_PRIORITY_NORMAL, - [LV_THREAD_PRIO_HIGH] = THREAD_PRIORITY_ABOVE_NORMAL, - [LV_THREAD_PRIO_HIGHEST] = THREAD_PRIORITY_HIGHEST, - }; - - lv_thread_init_data_t * init_data = - (lv_thread_init_data_t *)(malloc( - sizeof(lv_thread_init_data_t))); - if(!init_data) { - return LV_RESULT_INVALID; - } - init_data->callback = callback; - init_data->user_data = user_data; - - /* - Reference: https://learn.microsoft.com/en-us/windows/win32/api - /processthreadsapi/nf-processthreadsapi-createthread - - A thread in an executable that calls the C run-time library (CRT) should - use the _beginthreadex and _endthreadex functions for thread management - rather than CreateThread and ExitThread; this requires the use of the - multithreaded version of the CRT. If a thread created using CreateThread - calls the CRT, the CRT may terminate the process in low-memory conditions. - */ - *thread = (HANDLE)(_beginthreadex( - NULL, - (unsigned)(stack_size), - thread_start_routine, - init_data, - 0, - NULL)); - if(!*thread) { - return LV_RESULT_INVALID; - } - - /* - Try to set the thread priority. (Not mandatory for creating a new thread.) - */ - SetThreadPriority(*thread, prio_map[prio]); - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_delete(lv_thread_t * thread) -{ - lv_result_t result = LV_RESULT_OK; - - if(!TerminateThread(thread, 0)) { - result = LV_RESULT_INVALID; - } - - CloseHandle(thread); - - return result; -} - -lv_result_t lv_mutex_init(lv_mutex_t * mutex) -{ - InitializeCriticalSection(mutex); - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_lock(lv_mutex_t * mutex) -{ - EnterCriticalSection(mutex); - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) -{ - EnterCriticalSection(mutex); - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) -{ - LeaveCriticalSection(mutex); - return LV_RESULT_OK; -} - -lv_result_t lv_mutex_delete(lv_mutex_t * mutex) -{ - DeleteCriticalSection(mutex); - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) -{ - if(!sync) { - return LV_RESULT_INVALID; - } - - InitializeCriticalSection(&sync->cs); - InitializeConditionVariable(&sync->cv); - sync->v = false; - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) -{ - if(!sync) { - return LV_RESULT_INVALID; - } - - EnterCriticalSection(&sync->cs); - while(!sync->v) { - SleepConditionVariableCS(&sync->cv, &sync->cs, INFINITE); - } - sync->v = false; - LeaveCriticalSection(&sync->cs); - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) -{ - if(!sync) { - return LV_RESULT_INVALID; - } - - EnterCriticalSection(&sync->cs); - sync->v = true; - WakeConditionVariable(&sync->cv); - LeaveCriticalSection(&sync->cs); - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) -{ - if(!sync) { - return LV_RESULT_INVALID; - } - - DeleteCriticalSection(&sync->cs); - - return LV_RESULT_OK; -} - -lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync) -{ - LV_UNUSED(sync); - return LV_RESULT_INVALID; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static unsigned __stdcall thread_start_routine(void * parameter) -{ - lv_thread_init_data_t * init_data = (lv_thread_init_data_t *)(parameter); - if(init_data) { - init_data->callback(init_data->user_data); - free(init_data); - } - - return 0; -} - -#endif /*LV_USE_OS == LV_OS_WINDOWS*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_windows.h b/software/Power_Pico/Middlewares/LVGL/src/osal/lv_windows.h deleted file mode 100644 index fd930e8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/osal/lv_windows.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @file lv_windows.h - * - */ - -#ifndef LV_WINDOWS_H -#define LV_WINDOWS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#if LV_USE_OS == LV_OS_WINDOWS - -#include -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef HANDLE lv_thread_t; - -typedef CRITICAL_SECTION lv_mutex_t; - -typedef struct { - CRITICAL_SECTION cs; - CONDITION_VARIABLE cv; - bool v; -} lv_thread_sync_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_OS == LV_OS_WINDOWS*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_WINDOWS_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/file_explorer/lv_file_explorer.c b/software/Power_Pico/Middlewares/LVGL/src/others/file_explorer/lv_file_explorer.c deleted file mode 100644 index bb0220c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/file_explorer/lv_file_explorer.c +++ /dev/null @@ -1,707 +0,0 @@ -/** - * @file lv_file_explorer.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_file_explorer_private.h" -#include "../../misc/lv_fs_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_FILE_EXPLORER != 0 - -#include "../../lvgl.h" -#include "../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_file_explorer_class) - -#define FILE_EXPLORER_QUICK_ACCESS_AREA_WIDTH (22) -#define FILE_EXPLORER_BROWSER_AREA_WIDTH (100 - FILE_EXPLORER_QUICK_ACCESS_AREA_WIDTH) - -#define quick_access_list_button_style (LV_GLOBAL_DEFAULT()->fe_list_button_style) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_file_explorer_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); - -static void browser_file_event_handler(lv_event_t * e); -#if LV_FILE_EXPLORER_QUICK_ACCESS - static void quick_access_event_handler(lv_event_t * e); - static void quick_access_area_event_handler(lv_event_t * e); -#endif - -static void init_style(lv_obj_t * obj); -static void show_dir(lv_obj_t * obj, const char * path); -static void strip_ext(char * dir); -static void file_explorer_sort(lv_obj_t * obj); -static void sort_by_file_kind(lv_obj_t * tb, int16_t lo, int16_t hi); -static void exch_table_item(lv_obj_t * tb, int16_t i, int16_t j); -static bool is_end_with(const char * str1, const char * str2); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_file_explorer_class = { - .constructor_cb = lv_file_explorer_constructor, - .width_def = LV_SIZE_CONTENT, - .height_def = LV_SIZE_CONTENT, - .instance_size = sizeof(lv_file_explorer_t), - .base_class = &lv_obj_class, - .name = "file-explorer", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_file_explorer_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ -#if LV_FILE_EXPLORER_QUICK_ACCESS -void lv_file_explorer_set_quick_access_path(lv_obj_t * obj, lv_file_explorer_dir_t dir, const char * path) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - /*If path is unavailable */ - if((path == NULL) || (lv_strlen(path) <= 0)) return; - - char ** dir_str = NULL; - switch(dir) { - case LV_EXPLORER_HOME_DIR: - dir_str = &(explorer->home_dir); - break; - case LV_EXPLORER_MUSIC_DIR: - dir_str = &(explorer->music_dir); - break; - case LV_EXPLORER_PICTURES_DIR: - dir_str = &(explorer->pictures_dir); - break; - case LV_EXPLORER_VIDEO_DIR: - dir_str = &(explorer->video_dir); - break; - case LV_EXPLORER_DOCS_DIR: - dir_str = &(explorer->docs_dir); - break; - case LV_EXPLORER_FS_DIR: - dir_str = &(explorer->fs_dir); - break; - - default: - return; - break; - } - - /*Free the old text*/ - if(*dir_str != NULL) { - lv_free(*dir_str); - *dir_str = NULL; - } - - /*Allocate space for the new text*/ - *dir_str = lv_strdup(path); -} - -#endif - -void lv_file_explorer_set_sort(lv_obj_t * obj, lv_file_explorer_sort_t sort) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - explorer->sort = sort; - - file_explorer_sort(obj); -} - -/*===================== - * Getter functions - *====================*/ -const char * lv_file_explorer_get_selected_file_name(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - return explorer->sel_fn; -} - -const char * lv_file_explorer_get_current_path(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - return explorer->current_path; -} - -lv_obj_t * lv_file_explorer_get_file_table(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - return explorer->file_table; -} - -lv_obj_t * lv_file_explorer_get_header(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - return explorer->head_area; -} - -lv_obj_t * lv_file_explorer_get_path_label(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - return explorer->path_label; -} - -#if LV_FILE_EXPLORER_QUICK_ACCESS -lv_obj_t * lv_file_explorer_get_quick_access_area(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - return explorer->quick_access_area; -} - -lv_obj_t * lv_file_explorer_get_places_list(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - return explorer->list_places; -} - -lv_obj_t * lv_file_explorer_get_device_list(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - return explorer->list_device; -} - -#endif - -lv_file_explorer_sort_t lv_file_explorer_get_sort(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - return explorer->sort; -} - -/*===================== - * Other functions - *====================*/ -void lv_file_explorer_open_dir(lv_obj_t * obj, const char * dir) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - show_dir(obj, dir); -} - -/********************** - * STATIC FUNCTIONS - **********************/ -static void lv_file_explorer_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - -#if LV_FILE_EXPLORER_QUICK_ACCESS - explorer->home_dir = NULL; - explorer->video_dir = NULL; - explorer->pictures_dir = NULL; - explorer->music_dir = NULL; - explorer->docs_dir = NULL; - explorer->fs_dir = NULL; -#endif - - explorer->sort = LV_EXPLORER_SORT_NONE; - - lv_memzero(explorer->current_path, sizeof(explorer->current_path)); - - lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); - - explorer->cont = lv_obj_create(obj); - lv_obj_set_width(explorer->cont, LV_PCT(100)); - lv_obj_set_flex_grow(explorer->cont, 1); - -#if LV_FILE_EXPLORER_QUICK_ACCESS - /*Quick access bar area on the left*/ - explorer->quick_access_area = lv_obj_create(explorer->cont); - lv_obj_set_size(explorer->quick_access_area, LV_PCT(FILE_EXPLORER_QUICK_ACCESS_AREA_WIDTH), LV_PCT(100)); - lv_obj_set_flex_flow(explorer->quick_access_area, LV_FLEX_FLOW_COLUMN); - lv_obj_add_event_cb(explorer->quick_access_area, quick_access_area_event_handler, LV_EVENT_ALL, - explorer); -#endif - - /*File table area on the right*/ - explorer->browser_area = lv_obj_create(explorer->cont); -#if LV_FILE_EXPLORER_QUICK_ACCESS - lv_obj_set_size(explorer->browser_area, LV_PCT(FILE_EXPLORER_BROWSER_AREA_WIDTH), LV_PCT(100)); -#else - lv_obj_set_size(explorer->browser_area, LV_PCT(100), LV_PCT(100)); -#endif - lv_obj_set_flex_flow(explorer->browser_area, LV_FLEX_FLOW_COLUMN); - - /*The area displayed above the file browse list(head)*/ - explorer->head_area = lv_obj_create(explorer->browser_area); - lv_obj_set_size(explorer->head_area, LV_PCT(100), LV_PCT(14)); - lv_obj_remove_flag(explorer->head_area, LV_OBJ_FLAG_SCROLLABLE); - -#if LV_FILE_EXPLORER_QUICK_ACCESS - /*Two lists of quick access bar*/ - lv_obj_t * btn; - /*list 1*/ - explorer->list_device = lv_list_create(explorer->quick_access_area); - lv_obj_set_size(explorer->list_device, LV_PCT(100), LV_SIZE_CONTENT); - lv_obj_set_style_bg_color(lv_list_add_text(explorer->list_device, "DEVICE"), lv_palette_main(LV_PALETTE_ORANGE), 0); - - btn = lv_list_add_button(explorer->list_device, NULL, LV_SYMBOL_DRIVE " File System"); - lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); - - /*list 2*/ - explorer->list_places = lv_list_create(explorer->quick_access_area); - lv_obj_set_size(explorer->list_places, LV_PCT(100), LV_SIZE_CONTENT); - lv_obj_set_style_bg_color(lv_list_add_text(explorer->list_places, "PLACES"), lv_palette_main(LV_PALETTE_LIME), 0); - - btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_HOME " HOME"); - lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); - btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_VIDEO " Video"); - lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); - btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_IMAGE " Pictures"); - lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); - btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_AUDIO " Music"); - lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); - btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_FILE " Documents"); - lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); -#endif - - /*Show current path*/ - explorer->path_label = lv_label_create(explorer->head_area); - lv_label_set_text(explorer->path_label, LV_SYMBOL_EYE_OPEN"https://lvgl.io"); - lv_obj_center(explorer->path_label); - - /*Table showing the contents of the table of contents*/ - explorer->file_table = lv_table_create(explorer->browser_area); - lv_obj_set_size(explorer->file_table, LV_PCT(100), LV_PCT(86)); - lv_table_set_column_width(explorer->file_table, 0, LV_PCT(100)); - lv_table_set_column_count(explorer->file_table, 1); - lv_obj_add_event_cb(explorer->file_table, browser_file_event_handler, LV_EVENT_ALL, obj); - - /*only scroll up and down*/ - lv_obj_set_scroll_dir(explorer->file_table, LV_DIR_TOP | LV_DIR_BOTTOM); - - /*Initialize style*/ - init_style(obj); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void init_style(lv_obj_t * obj) -{ - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - /*lv_file_explorer obj style*/ - lv_obj_set_style_radius(obj, 0, 0); - lv_obj_set_style_bg_color(obj, lv_color_hex(0xf2f1f6), 0); - - /*main container style*/ - lv_obj_set_style_radius(explorer->cont, 0, 0); - lv_obj_set_style_bg_opa(explorer->cont, LV_OPA_0, 0); - lv_obj_set_style_border_width(explorer->cont, 0, 0); - lv_obj_set_style_outline_width(explorer->cont, 0, 0); - lv_obj_set_style_pad_column(explorer->cont, 0, 0); - lv_obj_set_style_pad_row(explorer->cont, 0, 0); - lv_obj_set_style_flex_flow(explorer->cont, LV_FLEX_FLOW_ROW, 0); - lv_obj_set_style_pad_all(explorer->cont, 0, 0); - lv_obj_set_style_layout(explorer->cont, LV_LAYOUT_FLEX, 0); - - /*head cont style*/ - lv_obj_set_style_radius(explorer->head_area, 0, 0); - lv_obj_set_style_border_width(explorer->head_area, 0, 0); - lv_obj_set_style_pad_top(explorer->head_area, 0, 0); - -#if LV_FILE_EXPLORER_QUICK_ACCESS - /*Quick access bar container style*/ - lv_obj_set_style_pad_all(explorer->quick_access_area, 0, 0); - lv_obj_set_style_pad_row(explorer->quick_access_area, 20, 0); - lv_obj_set_style_radius(explorer->quick_access_area, 0, 0); - lv_obj_set_style_border_width(explorer->quick_access_area, 1, 0); - lv_obj_set_style_outline_width(explorer->quick_access_area, 0, 0); - lv_obj_set_style_bg_color(explorer->quick_access_area, lv_color_hex(0xf2f1f6), 0); -#endif - - /*File browser container style*/ - lv_obj_set_style_pad_all(explorer->browser_area, 0, 0); - lv_obj_set_style_pad_row(explorer->browser_area, 0, 0); - lv_obj_set_style_radius(explorer->browser_area, 0, 0); - lv_obj_set_style_border_width(explorer->browser_area, 0, 0); - lv_obj_set_style_outline_width(explorer->browser_area, 0, 0); - lv_obj_set_style_bg_color(explorer->browser_area, lv_color_hex(0xffffff), 0); - - /*Style of the table in the browser container*/ - lv_obj_set_style_bg_color(explorer->file_table, lv_color_hex(0xffffff), 0); - lv_obj_set_style_pad_all(explorer->file_table, 0, 0); - lv_obj_set_style_radius(explorer->file_table, 0, 0); - lv_obj_set_style_border_width(explorer->file_table, 0, 0); - lv_obj_set_style_outline_width(explorer->file_table, 0, 0); - -#if LV_FILE_EXPLORER_QUICK_ACCESS - /*Style of the list in the quick access bar*/ - lv_obj_set_style_border_width(explorer->list_device, 0, 0); - lv_obj_set_style_outline_width(explorer->list_device, 0, 0); - lv_obj_set_style_radius(explorer->list_device, 0, 0); - lv_obj_set_style_pad_all(explorer->list_device, 0, 0); - - lv_obj_set_style_border_width(explorer->list_places, 0, 0); - lv_obj_set_style_outline_width(explorer->list_places, 0, 0); - lv_obj_set_style_radius(explorer->list_places, 0, 0); - lv_obj_set_style_pad_all(explorer->list_places, 0, 0); - - /*Style of the quick access list btn in the quick access bar*/ - lv_style_init(&quick_access_list_button_style); - lv_style_set_border_width(&quick_access_list_button_style, 0); - lv_style_set_bg_color(&quick_access_list_button_style, lv_color_hex(0xf2f1f6)); - - uint32_t i, j; - for(i = 0; i < lv_obj_get_child_count(explorer->quick_access_area); i++) { - lv_obj_t * child = lv_obj_get_child(explorer->quick_access_area, i); - if(lv_obj_check_type(child, &lv_list_class)) { - for(j = 0; j < lv_obj_get_child_count(child); j++) { - lv_obj_t * list_child = lv_obj_get_child(child, j); - if(lv_obj_check_type(list_child, &lv_list_button_class)) { - lv_obj_add_style(list_child, &quick_access_list_button_style, 0); - } - } - } - } -#endif - -} - -#if LV_FILE_EXPLORER_QUICK_ACCESS -static void quick_access_event_handler(lv_event_t * e) -{ - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * btn = lv_event_get_current_target(e); - lv_obj_t * obj = lv_event_get_user_data(e); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - if(code == LV_EVENT_CLICKED) { - char ** path = NULL; - lv_obj_t * label = lv_obj_get_child(btn, -1); - char * label_text = lv_label_get_text(label); - - if((lv_strcmp(label_text, LV_SYMBOL_HOME " HOME") == 0)) { - path = &(explorer->home_dir); - } - else if((lv_strcmp(label_text, LV_SYMBOL_VIDEO " Video") == 0)) { - path = &(explorer->video_dir); - } - else if((lv_strcmp(label_text, LV_SYMBOL_IMAGE " Pictures") == 0)) { - path = &(explorer->pictures_dir); - } - else if((lv_strcmp(label_text, LV_SYMBOL_AUDIO " Music") == 0)) { - path = &(explorer->music_dir); - } - else if((lv_strcmp(label_text, LV_SYMBOL_FILE " Documents") == 0)) { - path = &(explorer->docs_dir); - } - else if((lv_strcmp(label_text, LV_SYMBOL_DRIVE " File System") == 0)) { - path = &(explorer->fs_dir); - } - - if(path != NULL) - show_dir(obj, *path); - } -} - -static void quick_access_area_event_handler(lv_event_t * e) -{ - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * area = lv_event_get_current_target(e); - lv_obj_t * obj = lv_event_get_user_data(e); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - if(code == LV_EVENT_LAYOUT_CHANGED) { - if(lv_obj_has_flag(area, LV_OBJ_FLAG_HIDDEN)) - lv_obj_set_size(explorer->browser_area, LV_PCT(100), LV_PCT(100)); - else - lv_obj_set_size(explorer->browser_area, LV_PCT(FILE_EXPLORER_BROWSER_AREA_WIDTH), LV_PCT(100)); - } -} -#endif - -static void browser_file_event_handler(lv_event_t * e) -{ - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_user_data(e); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - if(code == LV_EVENT_VALUE_CHANGED) { - char file_name[LV_FILE_EXPLORER_PATH_MAX_LEN]; - const char * str_fn = NULL; - uint32_t row; - uint32_t col; - - lv_memzero(file_name, sizeof(file_name)); - lv_table_get_selected_cell(explorer->file_table, &row, &col); - str_fn = lv_table_get_cell_value(explorer->file_table, row, col); - - str_fn = str_fn + 5; - if((lv_strcmp(str_fn, ".") == 0)) return; - - if((lv_strcmp(str_fn, "..") == 0) && (lv_strlen(explorer->current_path) > 3)) { - strip_ext(explorer->current_path); - /*Remove the last '/' character*/ - strip_ext(explorer->current_path); - lv_snprintf((char *)file_name, sizeof(file_name), "%s", explorer->current_path); - } - else { - if(lv_strcmp(str_fn, "..") != 0) { - lv_snprintf((char *)file_name, sizeof(file_name), "%s%s", explorer->current_path, str_fn); - } - } - - lv_fs_dir_t dir; - if(lv_fs_dir_open(&dir, file_name) == LV_FS_RES_OK) { - lv_fs_dir_close(&dir); - show_dir(obj, (char *)file_name); - } - else { - if(lv_strcmp(str_fn, "..") != 0) { - explorer->sel_fn = str_fn; - lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - } - } - } - else if(code == LV_EVENT_SIZE_CHANGED) { - lv_table_set_column_width(explorer->file_table, 0, lv_obj_get_width(explorer->file_table)); - } - else if((code == LV_EVENT_CLICKED) || (code == LV_EVENT_RELEASED)) { - lv_obj_send_event(obj, LV_EVENT_CLICKED, NULL); - } -} - -static void show_dir(lv_obj_t * obj, const char * path) -{ - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - char fn[LV_FILE_EXPLORER_PATH_MAX_LEN]; - uint16_t index = 0; - lv_fs_dir_t dir; - lv_fs_res_t res; - - res = lv_fs_dir_open(&dir, path); - if(res != LV_FS_RES_OK) { - LV_LOG_USER("Open dir error %d!", res); - return; - } - - lv_table_set_cell_value_fmt(explorer->file_table, index++, 0, LV_SYMBOL_DIRECTORY " %s", "."); - lv_table_set_cell_value_fmt(explorer->file_table, index++, 0, LV_SYMBOL_DIRECTORY " %s", ".."); - lv_table_set_cell_value(explorer->file_table, 0, 1, "0"); - lv_table_set_cell_value(explorer->file_table, 1, 1, "0"); - - while(1) { - res = lv_fs_dir_read(&dir, fn, sizeof(fn)); - if(res != LV_FS_RES_OK) { - LV_LOG_USER("Driver, file or directory is not exists %d!", res); - break; - } - - /*fn is empty, if not more files to read*/ - if(lv_strlen(fn) == 0) { - LV_LOG_USER("Not more files to read!"); - break; - } - - if((is_end_with(fn, ".png") == true) || (is_end_with(fn, ".PNG") == true) || \ - (is_end_with(fn, ".jpg") == true) || (is_end_with(fn, ".JPG") == true) || \ - (is_end_with(fn, ".bmp") == true) || (is_end_with(fn, ".BMP") == true) || \ - (is_end_with(fn, ".gif") == true) || (is_end_with(fn, ".GIF") == true)) { - lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_IMAGE " %s", fn); - lv_table_set_cell_value(explorer->file_table, index, 1, "1"); - } - else if((is_end_with(fn, ".mp3") == true) || (is_end_with(fn, ".MP3") == true) || \ - (is_end_with(fn, ".wav") == true) || (is_end_with(fn, ".WAV") == true)) { - lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_AUDIO " %s", fn); - lv_table_set_cell_value(explorer->file_table, index, 1, "2"); - } - else if((is_end_with(fn, ".mp4") == true) || (is_end_with(fn, ".MP4") == true)) { - lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_VIDEO " %s", fn); - lv_table_set_cell_value(explorer->file_table, index, 1, "3"); - } - else if((is_end_with(fn, ".") == true) || (is_end_with(fn, "..") == true)) { - /*is dir*/ - continue; - } - else if(fn[0] == '/') {/*is dir*/ - lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_DIRECTORY " %s", fn + 1); - lv_table_set_cell_value(explorer->file_table, index, 1, "0"); - } - else { - lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_FILE " %s", fn); - lv_table_set_cell_value(explorer->file_table, index, 1, "4"); - } - - index++; - } - - lv_fs_dir_close(&dir); - - lv_table_set_row_count(explorer->file_table, index); - file_explorer_sort(obj); - lv_obj_send_event(obj, LV_EVENT_READY, NULL); - - /*Move the table to the top*/ - lv_obj_scroll_to_y(explorer->file_table, 0, LV_ANIM_OFF); - - lv_strlcpy(explorer->current_path, path, sizeof(explorer->current_path)); - lv_label_set_text_fmt(explorer->path_label, LV_SYMBOL_EYE_OPEN" %s", path); - - size_t current_path_len = lv_strlen(explorer->current_path); - if((*((explorer->current_path) + current_path_len) != '/') && (current_path_len < LV_FILE_EXPLORER_PATH_MAX_LEN)) { - *((explorer->current_path) + current_path_len) = '/'; - } -} - -/*Remove the specified suffix*/ -static void strip_ext(char * dir) -{ - char * end = dir + lv_strlen(dir); - - while(end >= dir && *end != '/') { - --end; - } - - if(end > dir) { - *end = '\0'; - } - else if(end == dir) { - *(end + 1) = '\0'; - } -} - -static void exch_table_item(lv_obj_t * tb, int16_t i, int16_t j) -{ - const char * tmp; - tmp = lv_table_get_cell_value(tb, i, 0); - lv_table_set_cell_value(tb, 0, 2, tmp); - lv_table_set_cell_value(tb, i, 0, lv_table_get_cell_value(tb, j, 0)); - lv_table_set_cell_value(tb, j, 0, lv_table_get_cell_value(tb, 0, 2)); - - tmp = lv_table_get_cell_value(tb, i, 1); - lv_table_set_cell_value(tb, 0, 2, tmp); - lv_table_set_cell_value(tb, i, 1, lv_table_get_cell_value(tb, j, 1)); - lv_table_set_cell_value(tb, j, 1, lv_table_get_cell_value(tb, 0, 2)); -} - -static void file_explorer_sort(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; - - uint16_t sum = lv_table_get_row_count(explorer->file_table); - - if(sum > 1) { - switch(explorer->sort) { - case LV_EXPLORER_SORT_NONE: - break; - case LV_EXPLORER_SORT_KIND: - sort_by_file_kind(explorer->file_table, 0, (sum - 1)); - break; - default: - break; - } - } -} - -/*Quick sort 3 way*/ -static void sort_by_file_kind(lv_obj_t * tb, int16_t lo, int16_t hi) -{ - if(lo >= hi) return; - - int16_t lt = lo; - int16_t i = lo + 1; - int16_t gt = hi; - const char * v = lv_table_get_cell_value(tb, lo, 1); - while(i <= gt) { - if(lv_strcmp(lv_table_get_cell_value(tb, i, 1), v) < 0) - exch_table_item(tb, lt++, i++); - else if(lv_strcmp(lv_table_get_cell_value(tb, i, 1), v) > 0) - exch_table_item(tb, i, gt--); - else - i++; - } - - sort_by_file_kind(tb, lo, lt - 1); - sort_by_file_kind(tb, gt + 1, hi); -} - -static bool is_end_with(const char * str1, const char * str2) -{ - if(str1 == NULL || str2 == NULL) - return false; - - uint16_t len1 = lv_strlen(str1); - uint16_t len2 = lv_strlen(str2); - if((len1 < len2) || (len1 == 0 || len2 == 0)) - return false; - - while(len2 >= 1) { - if(str2[len2 - 1] != str1[len1 - 1]) - return false; - - len2--; - len1--; - } - - return true; -} - -#endif /*LV_USE_FILE_EXPLORER*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/file_explorer/lv_file_explorer.h b/software/Power_Pico/Middlewares/LVGL/src/others/file_explorer/lv_file_explorer.h deleted file mode 100644 index 8dd7762..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/file_explorer/lv_file_explorer.h +++ /dev/null @@ -1,168 +0,0 @@ -/** - * @file lv_file_explorer.h - * - */ - -#ifndef LV_FILE_EXPLORER_H -#define LV_FILE_EXPLORER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../core/lv_obj.h" - -#if LV_USE_FILE_EXPLORER != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - LV_EXPLORER_SORT_NONE, - LV_EXPLORER_SORT_KIND, -} lv_file_explorer_sort_t; - -#if LV_FILE_EXPLORER_QUICK_ACCESS -typedef enum { - LV_EXPLORER_HOME_DIR, - LV_EXPLORER_MUSIC_DIR, - LV_EXPLORER_PICTURES_DIR, - LV_EXPLORER_VIDEO_DIR, - LV_EXPLORER_DOCS_DIR, - LV_EXPLORER_FS_DIR, -} lv_file_explorer_dir_t; -#endif - -extern const lv_obj_class_t lv_file_explorer_class; - -/*********************** - * GLOBAL VARIABLES - ***********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ -lv_obj_t * lv_file_explorer_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -#if LV_FILE_EXPLORER_QUICK_ACCESS -/** - * Set file_explorer - * @param obj pointer to a label object - * @param dir the dir from 'lv_file_explorer_dir_t' enum. - * @param path path - - */ -void lv_file_explorer_set_quick_access_path(lv_obj_t * obj, lv_file_explorer_dir_t dir, const char * path); -#endif - -/** - * Set file_explorer sort - * @param obj pointer to a file explorer object - * @param sort the sort from 'lv_file_explorer_sort_t' enum. - */ -void lv_file_explorer_set_sort(lv_obj_t * obj, lv_file_explorer_sort_t sort); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get file explorer Selected file - * @param obj pointer to a file explorer object - * @return pointer to the file explorer selected file name - */ -const char * lv_file_explorer_get_selected_file_name(const lv_obj_t * obj); - -/** - * Get file explorer cur path - * @param obj pointer to a file explorer object - * @return pointer to the file explorer cur path - */ -const char * lv_file_explorer_get_current_path(const lv_obj_t * obj); - -/** - * Get file explorer head area obj - * @param obj pointer to a file explorer object - * @return pointer to the file explorer head area obj(lv_obj) - */ -lv_obj_t * lv_file_explorer_get_header(lv_obj_t * obj); - -/** - * Get file explorer head area obj - * @param obj pointer to a file explorer object - * @return pointer to the file explorer quick access area obj(lv_obj) - */ -lv_obj_t * lv_file_explorer_get_quick_access_area(lv_obj_t * obj); - -/** - * Get file explorer path obj(label) - * @param obj pointer to a file explorer object - * @return pointer to the file explorer path obj(lv_label) - */ -lv_obj_t * lv_file_explorer_get_path_label(lv_obj_t * obj); - -#if LV_FILE_EXPLORER_QUICK_ACCESS -/** - * Get file explorer places list obj(lv_list) - * @param obj pointer to a file explorer object - * @return pointer to the file explorer places list obj(lv_list) - */ -lv_obj_t * lv_file_explorer_get_places_list(lv_obj_t * obj); - -/** - * Get file explorer device list obj(lv_list) - * @param obj pointer to a file explorer object - * @return pointer to the file explorer device list obj(lv_list) - */ -lv_obj_t * lv_file_explorer_get_device_list(lv_obj_t * obj); -#endif - -/** - * Get file explorer file list obj(lv_table) - * @param obj pointer to a file explorer object - * @return pointer to the file explorer file table obj(lv_table) - */ -lv_obj_t * lv_file_explorer_get_file_table(lv_obj_t * obj); - -/** - * Set file_explorer sort - * @param obj pointer to a file explorer object - * @return the current mode from 'lv_file_explorer_sort_t' - */ -lv_file_explorer_sort_t lv_file_explorer_get_sort(const lv_obj_t * obj); - -/*===================== - * Other functions - *====================*/ - -/** - * Open a specified path - * @param obj pointer to a file explorer object - * @param dir pointer to the path - */ -void lv_file_explorer_open_dir(lv_obj_t * obj, const char * dir); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_FILE_EXPLORER*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_FILE_EXPLORER_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/file_explorer/lv_file_explorer_private.h b/software/Power_Pico/Middlewares/LVGL/src/others/file_explorer/lv_file_explorer_private.h deleted file mode 100644 index 1b7eca1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/file_explorer/lv_file_explorer_private.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - * @file lv_file_explorer_private.h - * - */ - -#ifndef LV_FILE_EXPLORER_PRIVATE_H -#define LV_FILE_EXPLORER_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_file_explorer.h" - -#if LV_USE_FILE_EXPLORER != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*Data of canvas*/ -struct lv_file_explorer_t { - lv_obj_t obj; - lv_obj_t * cont; - lv_obj_t * head_area; - lv_obj_t * browser_area; - lv_obj_t * file_table; - lv_obj_t * path_label; -#if LV_FILE_EXPLORER_QUICK_ACCESS - lv_obj_t * quick_access_area; - lv_obj_t * list_device; - lv_obj_t * list_places; - char * home_dir; - char * music_dir; - char * pictures_dir; - char * video_dir; - char * docs_dir; - char * fs_dir; -#endif - const char * sel_fn; - char current_path[LV_FILE_EXPLORER_PATH_MAX_LEN]; - lv_file_explorer_sort_t sort; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_FILE_EXPLORER != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_FILE_EXPLORER_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/fragment/README.md b/software/Power_Pico/Middlewares/LVGL/src/others/fragment/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/fragment/lv_fragment.c b/software/Power_Pico/Middlewares/LVGL/src/others/fragment/lv_fragment.c deleted file mode 100644 index 6deb4e7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/fragment/lv_fragment.c +++ /dev/null @@ -1,155 +0,0 @@ -/** - * @file lv_fragment.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_fragment_private.h" - -#if LV_USE_FRAGMENT -#include "../../stdlib/lv_string.h" - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void cb_delete_assertion(lv_event_t * event); - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args) -{ - LV_ASSERT_NULL(cls); - LV_ASSERT_NULL(cls->create_obj_cb); - LV_ASSERT(cls->instance_size >= sizeof(lv_fragment_t)); - lv_fragment_t * instance = lv_malloc_zeroed(cls->instance_size); - instance->cls = cls; - instance->child_manager = lv_fragment_manager_create(instance); - if(cls->constructor_cb) { - cls->constructor_cb(instance, args); - } - return instance; -} - -void lv_fragment_delete(lv_fragment_t * fragment) -{ - LV_ASSERT_NULL(fragment); - if(fragment->managed) { - lv_fragment_manager_remove(fragment->managed->manager, fragment); - return; - } - if(fragment->obj) { - lv_fragment_delete_obj(fragment); - } - /* Objects will leak if this function called before objects deleted */ - const lv_fragment_class_t * cls = fragment->cls; - if(cls->destructor_cb) { - cls->destructor_cb(fragment); - } - lv_fragment_manager_delete(fragment->child_manager); - lv_free(fragment); -} - -lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment) -{ - LV_ASSERT_NULL(fragment); - LV_ASSERT_NULL(fragment->managed); - return fragment->managed->manager; -} - -lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment) -{ - LV_ASSERT_NULL(fragment); - LV_ASSERT_NULL(fragment->managed); - return fragment->managed->container; -} - -lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment) -{ - LV_ASSERT_NULL(fragment); - LV_ASSERT_NULL(fragment->managed); - return lv_fragment_manager_get_parent_fragment(fragment->managed->manager); -} - -lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container) -{ - lv_fragment_managed_states_t * states = fragment->managed; - if(states) { - states->destroying_obj = false; - } - const lv_fragment_class_t * cls = fragment->cls; - lv_obj_t * obj = cls->create_obj_cb(fragment, container); - LV_ASSERT_NULL(obj); - fragment->obj = obj; - lv_fragment_manager_create_obj(fragment->child_manager); - if(states) { - states->obj_created = true; - lv_obj_add_event_cb(obj, cb_delete_assertion, LV_EVENT_DELETE, NULL); - } - if(cls->obj_created_cb) { - cls->obj_created_cb(fragment, obj); - } - return obj; -} - -void lv_fragment_delete_obj(lv_fragment_t * fragment) -{ - LV_ASSERT_NULL(fragment); - lv_fragment_manager_delete_obj(fragment->child_manager); - lv_fragment_managed_states_t * states = fragment->managed; - if(states) { - if(!states->obj_created) return; - states->destroying_obj = true; - - uint32_t i; - uint32_t event_cnt = lv_obj_get_event_count(fragment->obj); - bool cb_removed = false; - for(i = 0; i < event_cnt; i++) { - lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(fragment->obj, i); - if(lv_event_dsc_get_cb(event_dsc) == cb_delete_assertion) { - cb_removed = lv_obj_remove_event(fragment->obj, i); - break; - } - } - - LV_ASSERT(cb_removed); - } - LV_ASSERT_NULL(fragment->obj); - const lv_fragment_class_t * cls = fragment->cls; - if(cls->obj_will_delete_cb) { - cls->obj_will_delete_cb(fragment, fragment->obj); - } - lv_obj_delete(fragment->obj); - if(cls->obj_deleted_cb) { - cls->obj_deleted_cb(fragment, fragment->obj); - } - if(states) { - states->obj_created = false; - } - fragment->obj = NULL; -} - -void lv_fragment_recreate_obj(lv_fragment_t * fragment) -{ - LV_ASSERT_NULL(fragment); - LV_ASSERT_NULL(fragment->managed); - lv_fragment_delete_obj(fragment); - lv_fragment_create_obj(fragment, *fragment->managed->container); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void cb_delete_assertion(lv_event_t * event) -{ - LV_UNUSED(event); - LV_ASSERT_MSG(0, "Please delete objects with lv_fragment_destroy_obj"); -} - -#endif /*LV_USE_FRAGMENT*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/fragment/lv_fragment.h b/software/Power_Pico/Middlewares/LVGL/src/others/fragment/lv_fragment.h deleted file mode 100644 index f934737..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/fragment/lv_fragment.h +++ /dev/null @@ -1,297 +0,0 @@ -/** - * Public header for Fragment - * @file lv_fragment.h - */ - -#ifndef LV_FRAGMENT_H -#define LV_FRAGMENT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" - -#if LV_USE_FRAGMENT - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct lv_fragment_manager_t lv_fragment_manager_t; - -struct lv_fragment_t { - /** - * Class of this fragment - */ - const lv_fragment_class_t * cls; - /** - * Managed fragment states. If not null, then this fragment is managed. - * - * @warning Don't modify values inside this struct! - */ - lv_fragment_managed_states_t * managed; - /** - * Child fragment manager - */ - lv_fragment_manager_t * child_manager; - /** - * lv_obj returned by create_obj_cb - */ - lv_obj_t * obj; - -}; - -struct lv_fragment_class_t { - /** - * Constructor function for fragment class - * @param self Fragment instance - * @param args Arguments assigned by fragment manager - */ - void (*constructor_cb)(lv_fragment_t * self, void * args); - - /** - * Destructor function for fragment class - * @param self Fragment instance, will be freed after this call - */ - void (*destructor_cb)(lv_fragment_t * self); - - /** - * Fragment attached to manager - * @param self Fragment instance - */ - void (*attached_cb)(lv_fragment_t * self); - - /** - * Fragment detached from manager - * @param self Fragment instance - */ - void (*detached_cb)(lv_fragment_t * self); - - /** - * Create objects - * @param self Fragment instance - * @param container Container of the objects should be created upon - * @return Created object, NULL if multiple objects has been created - */ - lv_obj_t * (*create_obj_cb)(lv_fragment_t * self, lv_obj_t * container); - - /** - * - * @param self Fragment instance - * @param obj lv_obj returned by create_obj_cb - */ - void (*obj_created_cb)(lv_fragment_t * self, lv_obj_t * obj); - - /** - * Called before objects in the fragment will be deleted. - * - * @param self Fragment instance - * @param obj object with this fragment - */ - void (*obj_will_delete_cb)(lv_fragment_t * self, lv_obj_t * obj); - - /** - * Called when the object created by fragment received `LV_EVENT_DELETE` event - * @param self Fragment instance - * @param obj object with this fragment - */ - void (*obj_deleted_cb)(lv_fragment_t * self, lv_obj_t * obj); - - /** - * Handle event - * @param self Fragment instance - * @param which User-defined ID of event - * @param data1 User-defined data - * @param data2 User-defined data - */ - bool (*event_cb)(lv_fragment_t * self, int code, void * userdata); - - /** - * *REQUIRED*: Allocation size of fragment - */ - size_t instance_size; -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create fragment manager instance - * @param parent Parent fragment if this manager is placed inside another fragment, can be null. - * @return Fragment manager instance - */ -lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent); - -/** - * Destroy fragment manager instance - * @param manager Fragment manager instance - */ -void lv_fragment_manager_delete(lv_fragment_manager_t * manager); - -/** - * Create object of all fragments managed by this manager. - * @param manager Fragment manager instance - */ -void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager); - -/** - * Delete object created by all fragments managed by this manager. Instance of fragments will not be deleted. - * @param manager Fragment manager instance - */ -void lv_fragment_manager_delete_obj(lv_fragment_manager_t * manager); - -/** - * Attach fragment to manager, and add to container. - * @param manager Fragment manager instance - * @param fragment Fragment instance - * @param container Pointer to container object for manager to add objects to - */ -void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container); - -/** - * Detach and destroy fragment. If fragment is in navigation stack, remove from it. - * @param manager Fragment manager instance - * @param fragment Fragment instance - */ -void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment); - -/** - * Attach fragment to manager and add to navigation stack. - * @param manager Fragment manager instance - * @param fragment Fragment instance - * @param container Pointer to container object for manager to add objects to - */ -void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container); - -/** - * Remove the top-most fragment for stack - * @param manager Fragment manager instance - * @return true if there is fragment to pop - */ -bool lv_fragment_manager_pop(lv_fragment_manager_t * manager); - -/** - * Replace fragment. Old item in the stack will be removed. - * @param manager Fragment manager instance - * @param fragment Fragment instance - * @param container Pointer to container object for manager to add objects to - */ -void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment, - lv_obj_t * const * container); - -/** - * Send event to top-most fragment - * @param manager Fragment manager instance - * @param code User-defined ID of event - * @param userdata User-defined data - * @return true if fragment returned true - */ -bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata); - -/** - * Get stack size of this fragment manager - * @param manager Fragment manager instance - * @return Stack size of this fragment manager - */ -size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager); - -/** - * Get top most fragment instance - * @param manager Fragment manager instance - * @return Top most fragment instance - */ -lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager); - -/** - * Find first fragment instance in the container - * @param manager Fragment manager instance - * @param container Container which target fragment added to - * @return First fragment instance in the container - */ -lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container); - -/** - * Get parent fragment - * @param manager Fragment manager instance - * @return Parent fragment instance - */ -lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager); - -/** - * Create a fragment instance. - * - * @param cls Fragment class. This fragment must return non null object. - * @param args Arguments assigned by fragment manager - * @return Fragment instance - */ -lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args); - -/** - * Destroy a fragment. - * @param fragment Fragment instance. - */ -void lv_fragment_delete(lv_fragment_t * fragment); - -/** - * Get associated manager of this fragment - * @param fragment Fragment instance - * @return Fragment manager instance - */ -lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment); - -/** - * Get container object of this fragment - * @param fragment Fragment instance - * @return Reference to container object - */ -lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment); - -/** - * Get parent fragment of this fragment - * @param fragment Fragment instance - * @return Parent fragment - */ -lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment); - -/** - * Create object by fragment. - * - * @param fragment Fragment instance. - * @param container Container of the objects should be created upon. - * @return Created object - */ -lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container); - -/** - * Delete created object of a fragment - * - * @param fragment Fragment instance. - */ -void lv_fragment_delete_obj(lv_fragment_t * fragment); - -/** - * Destroy obj in fragment, and recreate them. - * @param fragment Fragment instance - */ -void lv_fragment_recreate_obj(lv_fragment_t * fragment); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_FRAGMENT*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_FRAGMENT_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/fragment/lv_fragment_manager.c b/software/Power_Pico/Middlewares/LVGL/src/others/fragment/lv_fragment_manager.c deleted file mode 100644 index a856518..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/fragment/lv_fragment_manager.c +++ /dev/null @@ -1,279 +0,0 @@ -/** - * @file lv_fragment_manager.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_fragment_private.h" - -#if LV_USE_FRAGMENT - -#include "../../misc/lv_ll.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct lv_fragment_stack_item_t { - lv_fragment_managed_states_t * states; -} lv_fragment_stack_item_t; - -struct lv_fragment_manager_t { - lv_fragment_t * parent; - /** - * Linked list to store attached fragments - */ - lv_ll_t attached; - /** - * Linked list to store fragments in stack - */ - lv_ll_t stack; -}; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void item_create_obj(lv_fragment_managed_states_t * item); - -static void item_delete_obj(lv_fragment_managed_states_t * item); - -static void item_delete_fragment(lv_fragment_managed_states_t * item); - -static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * manager, lv_fragment_t * fragment, - lv_obj_t * const * container); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent) -{ - lv_fragment_manager_t * instance = lv_malloc_zeroed(sizeof(lv_fragment_manager_t)); - instance->parent = parent; - lv_ll_init(&instance->attached, sizeof(lv_fragment_managed_states_t)); - lv_ll_init(&instance->stack, sizeof(lv_fragment_stack_item_t)); - return instance; -} - -void lv_fragment_manager_delete(lv_fragment_manager_t * manager) -{ - LV_ASSERT_NULL(manager); - lv_fragment_managed_states_t * states; - LV_LL_READ_BACK(&manager->attached, states) { - item_delete_obj(states); - item_delete_fragment(states); - } - lv_ll_clear(&manager->attached); - lv_ll_clear(&manager->stack); - lv_free(manager); -} - -void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager) -{ - LV_ASSERT_NULL(manager); - lv_fragment_stack_item_t * top = lv_ll_get_tail(&manager->stack); - lv_fragment_managed_states_t * states = NULL; - LV_LL_READ(&manager->attached, states) { - if(states->in_stack && top->states != states) { - /*Only create obj for top item in stack*/ - continue; - } - item_create_obj(states); - } -} - -void lv_fragment_manager_delete_obj(lv_fragment_manager_t * manager) -{ - LV_ASSERT_NULL(manager); - lv_fragment_managed_states_t * states = NULL; - LV_LL_READ_BACK(&manager->attached, states) { - item_delete_obj(states); - } -} - -void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container) -{ - lv_fragment_managed_states_t * states = fragment_attach(manager, fragment, container); - if(!manager->parent || manager->parent->managed->obj_created) { - item_create_obj(states); - } -} - -void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment) -{ - LV_ASSERT_NULL(manager); - LV_ASSERT_NULL(fragment); - LV_ASSERT_NULL(fragment->managed); - LV_ASSERT(fragment->managed->manager == manager); - lv_fragment_managed_states_t * states = fragment->managed; - lv_fragment_managed_states_t * prev = NULL; - bool was_top = false; - if(states->in_stack) { - void * stack_top = lv_ll_get_tail(&manager->stack); - lv_fragment_stack_item_t * item = NULL; - LV_LL_READ_BACK(&manager->stack, item) { - if(item->states == states) { - was_top = stack_top == item; - void * stack_prev = lv_ll_get_prev(&manager->stack, item); - if(!stack_prev) break; - prev = ((lv_fragment_stack_item_t *) stack_prev)->states; - break; - } - } - if(item) { - lv_ll_remove(&manager->stack, item); - lv_free(item); - } - } - item_delete_obj(states); - item_delete_fragment(states); - lv_ll_remove(&manager->attached, states); - lv_free(states); - if(prev && was_top) { - item_create_obj(prev); - } -} - -void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container) -{ - lv_fragment_stack_item_t * top = lv_ll_get_tail(&manager->stack); - if(top != NULL) { - item_delete_obj(top->states); - } - lv_fragment_managed_states_t * states = fragment_attach(manager, fragment, container); - states->in_stack = true; - /*Add fragment to the top of the stack*/ - lv_fragment_stack_item_t * item = lv_ll_ins_tail(&manager->stack); - lv_memzero(item, sizeof(lv_fragment_stack_item_t)); - item->states = states; - item_create_obj(states); -} - -bool lv_fragment_manager_pop(lv_fragment_manager_t * manager) -{ - lv_fragment_t * top = lv_fragment_manager_get_top(manager); - if(top == NULL) return false; - lv_fragment_manager_remove(manager, top); - return true; -} - -void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment, - lv_obj_t * const * container) -{ - lv_fragment_t * top = lv_fragment_manager_find_by_container(manager, *container); - if(top != NULL) { - lv_fragment_manager_remove(manager, top); - } - lv_fragment_manager_add(manager, fragment, container); -} - -bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata) -{ - LV_ASSERT_NULL(manager); - lv_fragment_managed_states_t * p = NULL; - LV_LL_READ_BACK(&manager->attached, p) { - if(!p->obj_created || p->destroying_obj) continue; - lv_fragment_t * instance = p->instance; - if(!instance) continue; - if(lv_fragment_manager_send_event(instance->child_manager, code, userdata)) return true; - if(p->cls->event_cb && p->cls->event_cb(instance, code, userdata)) return true; - } - return false; -} - -size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager) -{ - LV_ASSERT_NULL(manager); - return lv_ll_get_len(&manager->stack); -} - -lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager) -{ - LV_ASSERT(manager); - lv_fragment_stack_item_t * top = lv_ll_get_tail(&manager->stack); - if(!top)return NULL; - return top->states->instance; -} - -lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container) -{ - LV_ASSERT(manager); - lv_fragment_managed_states_t * states; - LV_LL_READ(&manager->attached, states) { - if(*states->container == container) return states->instance; - } - return NULL; -} - -lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager) -{ - LV_ASSERT_NULL(manager); - return manager->parent; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void item_create_obj(lv_fragment_managed_states_t * item) -{ - LV_ASSERT(item->instance); - lv_fragment_create_obj(item->instance, item->container ? *item->container : NULL); -} - -static void item_delete_obj(lv_fragment_managed_states_t * item) -{ - lv_fragment_delete_obj(item->instance); -} - -/** - * Detach, then destroy fragment - * @param item fragment states - */ -static void item_delete_fragment(lv_fragment_managed_states_t * item) -{ - lv_fragment_t * instance = item->instance; - if(instance->cls->detached_cb) { - instance->cls->detached_cb(instance); - } - instance->managed = NULL; - lv_fragment_delete(instance); - item->instance = NULL; -} - -static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * manager, lv_fragment_t * fragment, - lv_obj_t * const * container) -{ - LV_ASSERT(manager); - LV_ASSERT(fragment); - LV_ASSERT(fragment->managed == NULL); - lv_fragment_managed_states_t * states = lv_ll_ins_tail(&manager->attached); - lv_memzero(states, sizeof(lv_fragment_managed_states_t)); - states->cls = fragment->cls; - states->manager = manager; - states->container = container; - states->instance = fragment; - fragment->managed = states; - if(fragment->cls->attached_cb) { - fragment->cls->attached_cb(fragment); - } - return states; -} - -#endif /*LV_USE_FRAGMENT*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/fragment/lv_fragment_private.h b/software/Power_Pico/Middlewares/LVGL/src/others/fragment/lv_fragment_private.h deleted file mode 100644 index 3af36dd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/fragment/lv_fragment_private.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @file lv_fragment_private.h - * - */ - -#ifndef LV_FRAGMENT_PRIVATE_H -#define LV_FRAGMENT_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_fragment.h" - -#if LV_USE_FRAGMENT - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Fragment states - */ -struct lv_fragment_managed_states_t { - /** - * Class of the fragment - */ - const lv_fragment_class_t * cls; - /** - * Manager the fragment attached to - */ - lv_fragment_manager_t * manager; - /** - * Container object the fragment adding view to - */ - lv_obj_t * const * container; - /** - * Fragment instance - */ - lv_fragment_t * instance; - /** - * true between `create_obj_cb` and `obj_deleted_cb` - */ - bool obj_created; - /** - * true before `lv_fragment_delete_obj` is called. Don't touch any object if this is true - */ - bool destroying_obj; - /** - * true if this fragment is in navigation stack that can be popped - */ - bool in_stack; -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_FRAGMENT */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_FRAGMENT_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/gridnav/lv_gridnav.c b/software/Power_Pico/Middlewares/LVGL/src/others/gridnav/lv_gridnav.c deleted file mode 100644 index 5f348af..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/gridnav/lv_gridnav.c +++ /dev/null @@ -1,400 +0,0 @@ -/** - * @file lv_gridnav.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_gridnav.h" -#if LV_USE_GRIDNAV - -#include "../../misc/lv_assert.h" -#include "../../misc/lv_math.h" -#include "../../indev/lv_indev.h" -#include "../../core/lv_obj_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_gridnav_ctrl_t ctrl; - lv_obj_t * focused_obj; -} lv_gridnav_dsc_t; - -typedef enum { - FIND_LEFT, - FIND_RIGHT, - FIND_TOP, - FIND_BOTTOM, - FIND_NEXT_ROW_FIRST_ITEM, - FIND_PREV_ROW_LAST_ITEM, - FIND_FIRST_ROW, - FIND_LAST_ROW, -} find_mode_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void gridnav_event_cb(lv_event_t * e); -static lv_obj_t * find_chid(lv_obj_t * obj, lv_obj_t * start_child, find_mode_t mode); -static lv_obj_t * find_first_focusable(lv_obj_t * obj); -static lv_obj_t * find_last_focusable(lv_obj_t * obj); -static bool obj_is_focusable(lv_obj_t * obj); -static int32_t get_x_center(lv_obj_t * obj); -static int32_t get_y_center(lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_gridnav_add(lv_obj_t * obj, lv_gridnav_ctrl_t ctrl) -{ - lv_gridnav_remove(obj); /*Be sure to not add gridnav twice*/ - - lv_gridnav_dsc_t * dsc = lv_malloc(sizeof(lv_gridnav_dsc_t)); - LV_ASSERT_MALLOC(dsc); - dsc->ctrl = ctrl; - dsc->focused_obj = NULL; - lv_obj_add_event_cb(obj, gridnav_event_cb, LV_EVENT_ALL, dsc); - - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_WITH_ARROW); -} - -void lv_gridnav_remove(lv_obj_t * obj) -{ - lv_event_dsc_t * event_dsc = NULL; - uint32_t event_cnt = lv_obj_get_event_count(obj); - uint32_t i; - for(i = 0; i < event_cnt; i++) { - event_dsc = lv_obj_get_event_dsc(obj, i); - if(lv_event_dsc_get_cb(event_dsc) == gridnav_event_cb) { - lv_free(lv_event_dsc_get_user_data(event_dsc)); - lv_obj_remove_event(obj, i); - break; - } - } - -} - -void lv_gridnav_set_focused(lv_obj_t * cont, lv_obj_t * to_focus, lv_anim_enable_t anim_en) -{ - LV_ASSERT_NULL(to_focus); - - uint32_t i; - uint32_t event_cnt = lv_obj_get_event_count(cont); - lv_gridnav_dsc_t * dsc = NULL; - for(i = 0; i < event_cnt; i++) { - lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(cont, i); - if(lv_event_dsc_get_cb(event_dsc) == gridnav_event_cb) { - dsc = lv_event_dsc_get_user_data(event_dsc); - break; - } - } - - if(dsc == NULL) { - LV_LOG_WARN("`cont` is not a gridnav container"); - return; - } - - if(obj_is_focusable(to_focus) == false) { - LV_LOG_WARN("The object to focus is not focusable"); - return; - } - - if(dsc->focused_obj) { - lv_obj_remove_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); - } - - lv_obj_add_state(to_focus, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); - lv_obj_scroll_to_view(to_focus, anim_en); - dsc->focused_obj = to_focus; - -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void gridnav_event_cb(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_gridnav_dsc_t * dsc = lv_event_get_user_data(e); - lv_event_code_t code = lv_event_get_code(e); - - if(code == LV_EVENT_KEY) { - uint32_t child_cnt = lv_obj_get_child_count(obj); - if(child_cnt == 0) return; - - if(dsc->focused_obj == NULL) dsc->focused_obj = find_first_focusable(obj); - if(dsc->focused_obj == NULL) return; - - uint32_t key = lv_event_get_key(e); - lv_obj_t * guess = NULL; - - if(key == LV_KEY_RIGHT && !(dsc->ctrl & LV_GRIDNAV_CTRL_VERTICAL_MOVE_ONLY)) { - if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && - lv_obj_get_scroll_right(dsc->focused_obj) > 0) { - int32_t d = lv_obj_get_width(dsc->focused_obj) / 4; - if(d <= 0) d = 1; - lv_obj_scroll_by_bounded(dsc->focused_obj, -d, 0, LV_ANIM_ON); - } - else { - guess = find_chid(obj, dsc->focused_obj, FIND_RIGHT); - if(guess == NULL) { - if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { - guess = find_chid(obj, dsc->focused_obj, FIND_NEXT_ROW_FIRST_ITEM); - if(guess == NULL) guess = find_first_focusable(obj); - } - else { - lv_group_focus_next(lv_obj_get_group(obj)); - } - } - } - } - else if(key == LV_KEY_LEFT && !(dsc->ctrl & LV_GRIDNAV_CTRL_VERTICAL_MOVE_ONLY)) { - if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && - lv_obj_get_scroll_left(dsc->focused_obj) > 0) { - int32_t d = lv_obj_get_width(dsc->focused_obj) / 4; - if(d <= 0) d = 1; - lv_obj_scroll_by_bounded(dsc->focused_obj, d, 0, LV_ANIM_ON); - } - else { - guess = find_chid(obj, dsc->focused_obj, FIND_LEFT); - if(guess == NULL) { - if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { - guess = find_chid(obj, dsc->focused_obj, FIND_PREV_ROW_LAST_ITEM); - if(guess == NULL) guess = find_last_focusable(obj); - } - else { - lv_group_focus_prev(lv_obj_get_group(obj)); - } - } - } - } - else if(key == LV_KEY_DOWN && !(dsc->ctrl & LV_GRIDNAV_CTRL_HORIZONTAL_MOVE_ONLY)) { - if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && - lv_obj_get_scroll_bottom(dsc->focused_obj) > 0) { - int32_t d = lv_obj_get_height(dsc->focused_obj) / 4; - if(d <= 0) d = 1; - lv_obj_scroll_by_bounded(dsc->focused_obj, 0, -d, LV_ANIM_ON); - } - else { - guess = find_chid(obj, dsc->focused_obj, FIND_BOTTOM); - if(guess == NULL) { - if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { - guess = find_chid(obj, dsc->focused_obj, FIND_FIRST_ROW); - } - else { - lv_group_focus_next(lv_obj_get_group(obj)); - } - } - } - } - else if(key == LV_KEY_UP && !(dsc->ctrl & LV_GRIDNAV_CTRL_HORIZONTAL_MOVE_ONLY)) { - if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && - lv_obj_get_scroll_top(dsc->focused_obj) > 0) { - int32_t d = lv_obj_get_height(dsc->focused_obj) / 4; - if(d <= 0) d = 1; - lv_obj_scroll_by_bounded(dsc->focused_obj, 0, d, LV_ANIM_ON); - } - else { - guess = find_chid(obj, dsc->focused_obj, FIND_TOP); - if(guess == NULL) { - if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { - guess = find_chid(obj, dsc->focused_obj, FIND_LAST_ROW); - } - else { - lv_group_focus_prev(lv_obj_get_group(obj)); - } - } - } - } - else { - if(lv_group_get_focused(lv_obj_get_group(obj)) == obj) { - lv_obj_send_event(dsc->focused_obj, LV_EVENT_KEY, &key); - } - } - - if(guess && guess != dsc->focused_obj) { - lv_obj_remove_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); - lv_obj_send_event(dsc->focused_obj, LV_EVENT_DEFOCUSED, lv_indev_active()); - lv_obj_add_state(guess, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); - lv_obj_send_event(guess, LV_EVENT_FOCUSED, lv_indev_active()); - lv_obj_scroll_to_view(guess, LV_ANIM_ON); - dsc->focused_obj = guess; - } - } - else if(code == LV_EVENT_FOCUSED) { - if(dsc->focused_obj == NULL) dsc->focused_obj = find_first_focusable(obj); - if(dsc->focused_obj) { - lv_obj_add_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); - lv_obj_remove_state(dsc->focused_obj, LV_STATE_PRESSED); /*Be sure the focuses obj is not stuck in pressed state*/ - lv_obj_scroll_to_view(dsc->focused_obj, LV_ANIM_OFF); - } - } - else if(code == LV_EVENT_DEFOCUSED) { - if(dsc->focused_obj) { - lv_obj_remove_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); - } - } - else if(code == LV_EVENT_CHILD_CREATED) { - lv_obj_t * child = lv_event_get_target(e); - if(lv_obj_get_parent(child) == obj) { - if(dsc->focused_obj == NULL) { - dsc->focused_obj = child; - if(lv_obj_has_state(obj, LV_STATE_FOCUSED)) { - lv_obj_add_state(child, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); - lv_obj_scroll_to_view(child, LV_ANIM_OFF); - } - } - } - } - else if(code == LV_EVENT_CHILD_DELETED) { - /*This event bubble, so be sure this object's child was deleted. - *As we don't know which object was deleted we can't make the next focused. - *So make the first object focused*/ - lv_obj_t * target = lv_event_get_target(e); - if(target == obj) { - dsc->focused_obj = find_first_focusable(obj); - } - } - else if(code == LV_EVENT_DELETE) { - lv_gridnav_remove(obj); - } - else if(code == LV_EVENT_PRESSED || code == LV_EVENT_PRESSING || code == LV_EVENT_PRESS_LOST || - code == LV_EVENT_SHORT_CLICKED || code == LV_EVENT_LONG_PRESSED || code == LV_EVENT_LONG_PRESSED_REPEAT || - code == LV_EVENT_CLICKED || code == LV_EVENT_RELEASED) { - if(lv_group_get_focused(lv_obj_get_group(obj)) == obj) { - /*Forward press/release related event too*/ - lv_indev_type_t t = lv_indev_get_type(lv_indev_active()); - if(t == LV_INDEV_TYPE_ENCODER || t == LV_INDEV_TYPE_KEYPAD) { - lv_obj_send_event(dsc->focused_obj, code, lv_indev_active()); - } - } - } -} - -static lv_obj_t * find_chid(lv_obj_t * obj, lv_obj_t * start_child, find_mode_t mode) -{ - int32_t x_start = get_x_center(start_child); - int32_t y_start = get_y_center(start_child); - uint32_t child_cnt = lv_obj_get_child_count(obj); - lv_obj_t * guess = NULL; - int32_t x_err_guess = LV_COORD_MAX; - int32_t y_err_guess = LV_COORD_MAX; - int32_t h_half = lv_obj_get_height(start_child) / 2; - int32_t h_max = lv_obj_get_height(obj) + lv_obj_get_scroll_top(obj) + lv_obj_get_scroll_bottom(obj); - uint32_t i; - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = lv_obj_get_child(obj, i); - if(child == start_child) continue; - if(obj_is_focusable(child) == false) continue; - - int32_t x_err = 0; - int32_t y_err = 0; - switch(mode) { - case FIND_LEFT: - x_err = get_x_center(child) - x_start; - y_err = get_y_center(child) - y_start; - if(x_err >= 0) continue; /*It's on the right*/ - if(LV_ABS(y_err) > h_half) continue; /*Too far*/ - break; - case FIND_RIGHT: - x_err = get_x_center(child) - x_start; - y_err = get_y_center(child) - y_start; - if(x_err <= 0) continue; /*It's on the left*/ - if(LV_ABS(y_err) > h_half) continue; /*Too far*/ - break; - case FIND_TOP: - x_err = get_x_center(child) - x_start; - y_err = get_y_center(child) - y_start; - if(y_err >= 0) continue; /*It's on the bottom*/ - break; - case FIND_BOTTOM: - x_err = get_x_center(child) - x_start; - y_err = get_y_center(child) - y_start; - if(y_err <= 0) continue; /*It's on the top*/ - break; - case FIND_NEXT_ROW_FIRST_ITEM: - y_err = get_y_center(child) - y_start; - if(y_err <= 0) continue; /*It's on the top*/ - x_err = lv_obj_get_x(child); - break; - case FIND_PREV_ROW_LAST_ITEM: - y_err = get_y_center(child) - y_start; - if(y_err >= 0) continue; /*It's on the bottom*/ - x_err = obj->coords.x2 - child->coords.x2; - break; - case FIND_FIRST_ROW: - x_err = get_x_center(child) - x_start; - y_err = lv_obj_get_y(child); - break; - case FIND_LAST_ROW: - x_err = get_x_center(child) - x_start; - y_err = h_max - lv_obj_get_y(child); - } - - if(guess == NULL || - (y_err * y_err + x_err * x_err < y_err_guess * y_err_guess + x_err_guess * x_err_guess)) { - guess = child; - x_err_guess = x_err; - y_err_guess = y_err; - } - } - return guess; -} - -static lv_obj_t * find_first_focusable(lv_obj_t * obj) -{ - uint32_t child_cnt = lv_obj_get_child_count(obj); - uint32_t i; - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = lv_obj_get_child(obj, i); - if(obj_is_focusable(child)) return child; - - } - return NULL; -} - -static lv_obj_t * find_last_focusable(lv_obj_t * obj) -{ - uint32_t child_cnt = lv_obj_get_child_count(obj); - int32_t i; - for(i = child_cnt - 1; i >= 0; i--) { - lv_obj_t * child = lv_obj_get_child(obj, i); - if(obj_is_focusable(child)) return child; - } - return NULL; -} - -static bool obj_is_focusable(lv_obj_t * obj) -{ - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return false; - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_CLICK_FOCUSABLE)) return true; - else return false; -} - -static int32_t get_x_center(lv_obj_t * obj) -{ - return obj->coords.x1 + lv_area_get_width(&obj->coords) / 2; -} - -static int32_t get_y_center(lv_obj_t * obj) -{ - return obj->coords.y1 + lv_area_get_height(&obj->coords) / 2; -} - -#endif /*LV_USE_GRIDNAV*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/gridnav/lv_gridnav.h b/software/Power_Pico/Middlewares/LVGL/src/others/gridnav/lv_gridnav.h deleted file mode 100644 index 65bd1e0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/gridnav/lv_gridnav.h +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @file lv_gridnav.h - * - */ - -#ifndef LV_GRIDNAV_H -#define LV_GRIDNAV_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" - -#if LV_USE_GRIDNAV - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef enum { - LV_GRIDNAV_CTRL_NONE = 0x0, - - /** - * If there is no next/previous object in a direction, - * the focus goes to the object in the next/previous row (on left/right keys) - * or first/last row (on up/down keys) - */ - LV_GRIDNAV_CTRL_ROLLOVER = 0x1, - - /** - * If an arrow is pressed and the focused object can be scrolled in that direction - * then it will be scrolled instead of going to the next/previous object. - * If there is no more room for scrolling the next/previous object will be focused normally */ - LV_GRIDNAV_CTRL_SCROLL_FIRST = 0x2, - - /** - * Only use left/right keys for grid navigation. Up/down key events will be sent to the - * focused object. - */ - LV_GRIDNAV_CTRL_HORIZONTAL_MOVE_ONLY = 0x4, - - /** - * Only use up/down keys for grid navigation. Left/right key events will be sent to the - * focused object. - */ - LV_GRIDNAV_CTRL_VERTICAL_MOVE_ONLY = 0x8 - -} lv_gridnav_ctrl_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Add grid navigation feature to an object. It expects the children to be arranged - * into a grid-like layout. Although it's not required to have pixel perfect alignment. - * This feature makes possible to use keys to navigate among the children and focus them. - * The keys other than arrows and press/release related events - * are forwarded to the focused child. - * @param obj pointer to an object on which navigation should be applied. - * @param ctrl control flags from `lv_gridnav_ctrl_t`. - */ -void lv_gridnav_add(lv_obj_t * obj, lv_gridnav_ctrl_t ctrl); - -/** - * Remove the grid navigation support from an object - * @param obj pointer to an object - */ -void lv_gridnav_remove(lv_obj_t * obj); - -/** - * Manually focus an object on gridnav container - * @param cont pointer to a gridnav container - * @param to_focus pointer to an object to focus - * @param anim_en LV_ANIM_ON/OFF - */ -void lv_gridnav_set_focused(lv_obj_t * cont, lv_obj_t * to_focus, lv_anim_enable_t anim_en); - -/********************** - * MACROS - **********************/ -#endif /*LV_USE_GRIDNAV*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /* LV_GRIDNAV_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/ime/lv_ime_pinyin.c b/software/Power_Pico/Middlewares/LVGL/src/others/ime/lv_ime_pinyin.c deleted file mode 100644 index 8382269..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/ime/lv_ime_pinyin.c +++ /dev/null @@ -1,1197 +0,0 @@ -/** - * @file lv_ime_pinyin.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_ime_pinyin_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_IME_PINYIN != 0 - -#include "../../lvgl.h" -#include "../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_ime_pinyin_class) -#define cand_len LV_GLOBAL_DEFAULT()->ime_cand_len - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_ime_pinyin_style_change_event(lv_event_t * e); -static void lv_ime_pinyin_kb_event(lv_event_t * e); -static void lv_ime_pinyin_cand_panel_event(lv_event_t * e); - -static void init_pinyin_dict(lv_obj_t * obj, const lv_pinyin_dict_t * dict); -static void pinyin_input_proc(lv_obj_t * obj); -static void pinyin_page_proc(lv_obj_t * obj, uint16_t btn); -static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num); -static void pinyin_ime_clear_data(lv_obj_t * obj); - -#if LV_IME_PINYIN_USE_K9_MODE - static void pinyin_k9_init_data(lv_obj_t * obj); - static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * py9_map[]); - static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str); - static void pinyin_k9_fill_cand(lv_obj_t * obj); - static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir); -#endif - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_ime_pinyin_class = { - .constructor_cb = lv_ime_pinyin_constructor, - .destructor_cb = lv_ime_pinyin_destructor, - .width_def = LV_SIZE_CONTENT, - .height_def = LV_SIZE_CONTENT, - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .instance_size = sizeof(lv_ime_pinyin_t), - .base_class = &lv_obj_class, - .name = "ime-pinyin", -}; - -#if LV_IME_PINYIN_USE_K9_MODE -static const char * lv_btnm_def_pinyin_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 21] = {\ - ",\0", "123\0", "abc \0", "def\0", LV_SYMBOL_BACKSPACE"\0", "\n\0", - ".\0", "ghi\0", "jkl\0", "mno\0", LV_SYMBOL_KEYBOARD"\0", "\n\0", - "?\0", "pqrs\0", "tuv\0", "wxyz\0", LV_SYMBOL_NEW_LINE"\0", "\n\0", - LV_SYMBOL_LEFT"\0", "\0" - }; - -static lv_buttonmatrix_ctrl_t default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 17] = { 1 }; -static char lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 2][LV_IME_PINYIN_K9_MAX_INPUT] = {0}; -#endif - -static char lv_pinyin_cand_str[LV_IME_PINYIN_CAND_TEXT_NUM][4]; -static char * lv_btnm_def_pinyin_sel_map[LV_IME_PINYIN_CAND_TEXT_NUM + 3]; - -#if LV_IME_PINYIN_USE_DEFAULT_DICT -static const lv_pinyin_dict_t lv_ime_pinyin_def_dict[] = { - { "a", "啊" }, - { "ai", "愛" }, - { "an", "安暗案" }, - { "ba", "吧把爸八" }, - { "bai", "百白敗" }, - { "ban", "半般辦" }, - { "bang", "旁" }, - { "bao", "保薄包報" }, - { "bei", "被背悲北杯備" }, - { "ben", "本" }, - { "bi", "必比避鼻彼筆秘閉" }, - { "bian", "便邊變変辺" }, - { "biao", "表標" }, - { "bie", "別" }, - { "bing", "病並氷" }, - { "bo", "波薄泊" }, - { "bu", "不布步部捕補歩" }, - { "ca", "察" }, - { "cai", "才材菜財採" }, - { "can", "参残參" }, - { "ce", "策側" }, - { "ceng", "曾" }, - { "cha", "差查茶" }, - { "chai", "差" }, - { "chan", "產産單" }, - { "chang", "場廠" }, - { "chao", "超朝" }, - { "che", "車" }, - { "cheng", "成程乗" }, - { "chi", "尺吃持赤池遅歯" }, - { "chong", "充种重種" }, - { "chu", "出初楚触處処" }, - { "chuan", "川船傳" }, - { "chuang", "創窓" }, - { "chun", "春" }, - { "ci", "此次辞差" }, - { "cong", "從従" }, - { "cu", "卒" }, - { "cun", "存村" }, - { "cuo", "錯" }, - { "da", "大打答達" }, - { "dai", "代待帯帶貸" }, - { "dan", "但担擔誕單単" }, - { "dang", "当党當黨" }, - { "dao", "到道盗導島辺" }, - { "de", "的得" }, - { "dei", "" }, - { "deng", "等" }, - { "di", "地得低底弟第締" }, - { "dian", "点电店點電" }, - { "diao", "調" }, - { "ding", "定町" }, - { "dong", "冬東動働凍" }, - { "du", "独度都渡読" }, - { "duan", "段断短斷" }, - { "dui", "對対" }, - { "duo", "多駄" }, - { "e", "嗯悪" }, - { "en", "嗯" }, - { "er", "而耳二兒" }, - { "fa", "乏法發発髪" }, - { "fan", "反返犯番仮販飯範払" }, - { "fang", "方放房坊訪" }, - { "fei", "非飛費" }, - { "fen", "分份" }, - { "feng", "風豐" }, - { "fou", "否不" }, - { "fu", "父夫富服符付附府幅婦復複負払" }, - { "gai", "改概該" }, - { "gan", "甘感敢" }, - { "gang", "港剛" }, - { "gao", "告高" }, - { "ge", "各格歌革割個" }, - { "gei", "給" }, - { "gen", "跟根" }, - { "geng", "更" }, - { "gong", "工共供功公" }, - { "gou", "夠構溝" }, - { "gu", "古故鼓" }, - { "guai", "掛" }, - { "guan", "官管慣館觀関關" }, - { "guang", "光広" }, - { "gui", "規帰" }, - { "guo", "果国裏菓國過" }, - { "hai", "孩海害還" }, - { "han", "寒漢" }, - { "hang", "航行" }, - { "hao", "好号" }, - { "he", "合和喝何荷" }, - { "hei", "黒" }, - { "hen", "很" }, - { "heng", "行横" }, - { "hou", "厚喉候後" }, - { "hu", "乎呼湖護" }, - { "hua", "化画花話畫劃" }, - { "huai", "壊劃" }, - { "huan", "緩環歡還換" }, - { "huang", "黄" }, - { "hui", "回会慧絵揮會" }, - { "hun", "混婚" }, - { "huo", "活或火獲" }, - { "i", "" }, - { "ji", "己计及机既急季寄技即集基祭系奇紀積計記済幾際極繼績機濟" }, - { "jia", "家加價" }, - { "jian", "件建健肩見減間検簡漸" }, - { "jiang", "降強講將港" }, - { "jiao", "叫教交角覚覺較學" }, - { "jie", "介借接姐皆届界解結階節價" }, - { "jin", "今近禁金僅進" }, - { "jing", "京境景静精經経" }, - { "jiu", "就久九酒究" }, - { "ju", "句具局居決挙據舉" }, - { "jue", "角覚覺" }, - { "jun", "均" }, - { "kai", "開" }, - { "kan", "看刊" }, - { "kang", "康" }, - { "kao", "考" }, - { "ke", "可刻科克客渇課" }, - { "ken", "肯" }, - { "kong", "空控" }, - { "kou", "口" }, - { "ku", "苦庫" }, - { "kuai", "快塊会會" }, - { "kuang", "況" }, - { "kun", "困" }, - { "kuo", "括拡適" }, - { "la", "拉啦落" }, - { "lai", "来來頼" }, - { "lao", "老絡落" }, - { "le", "了楽樂" }, - { "lei", "類" }, - { "leng", "冷" }, - { "li", "力立利理例礼離麗裡勵歷" }, - { "lian", "連練臉聯" }, - { "liang", "良量涼兩両" }, - { "liao", "料" }, - { "lie", "列" }, - { "lin", "林隣賃" }, - { "ling", "另令領" }, - { "liu", "六留流" }, - { "lu", "律路録緑陸履慮" }, - { "lv", "旅" }, - { "lun", "輪論" }, - { "luo", "落絡" }, - { "ma", "媽嗎嘛" }, - { "mai", "買売" }, - { "man", "滿" }, - { "mang", "忙" }, - { "mao", "毛猫貿" }, - { "me", "麼" }, - { "mei", "美妹每沒毎媒" }, - { "men", "們" }, - { "mi", "米密秘" }, - { "mian", "免面勉眠" }, - { "miao", "描" }, - { "min", "民皿" }, - { "ming", "命明名" }, - { "mo", "末模麼" }, - { "mou", "某" }, - { "mu", "母木目模" }, - { "na", "那哪拿內南" }, - { "nan", "男南難" }, - { "nao", "腦" }, - { "ne", "那哪呢" }, - { "nei", "内那哪內" }, - { "neng", "能" }, - { "ni", "你妳呢" }, - { "nian", "年念" }, - { "niang", "娘" }, - { "nin", "您" }, - { "ning", "凝" }, - { "niu", "牛" }, - { "nong", "農濃" }, - { "nu", "女努" }, - { "nuan", "暖" }, - { "o", "" }, - { "ou", "歐" }, - { "pa", "怕" }, - { "pai", "迫派排" }, - { "pan", "判番" }, - { "pang", "旁" }, - { "pei", "配" }, - { "peng", "朋" }, - { "pi", "疲否" }, - { "pian", "片便" }, - { "pin", "品貧" }, - { "ping", "平評" }, - { "po", "迫破泊頗" }, - { "pu", "普僕" }, - { "qi", "起其奇七气期泣企妻契気" }, - { "qian", "嵌浅千前鉛錢針" }, - { "qiang", "強將" }, - { "qiao", "橋繰" }, - { "qie", "且切契" }, - { "qin", "寝勤親" }, - { "qing", "青清情晴輕頃請軽" }, - { "qiu", "求秋球" }, - { "qu", "去取趣曲區" }, - { "quan", "全犬券" }, - { "que", "缺確卻" }, - { "ran", "然" }, - { "rang", "讓" }, - { "re", "熱" }, - { "ren", "人任認" }, - { "reng", "仍" }, - { "ri", "日" }, - { "rong", "容" }, - { "rou", "弱若肉" }, - { "ru", "如入" }, - { "ruan", "軟" }, - { "sai", "賽" }, - { "san", "三" }, - { "sao", "騒繰" }, - { "se", "色" }, - { "sen", "森" }, - { "sha", "砂" }, - { "shan", "善山單" }, - { "shang", "上尚商" }, - { "shao", "少紹" }, - { "shaung", "雙" }, - { "she", "社射設捨渉" }, - { "shei", "誰" }, - { "shen", "什申深甚身伸沈神" }, - { "sheng", "生声昇勝乗聲" }, - { "shi", "是失示食时事式十石施使世实史室市始柿氏士仕拭時視師試適実實識" }, - { "shou", "手首守受授" }, - { "shu", "束数暑殊樹書屬輸術" }, - { "shui", "水説說誰" }, - { "shuo", "数説說" }, - { "si", "思寺司四私似死価" }, - { "song", "送" }, - { "su", "速宿素蘇訴" }, - { "suan", "算酸" }, - { "sui", "隨雖歲歳" }, - { "sun", "孫" }, - { "suo", "所" }, - { "ta", "她他它牠" }, - { "tai", "太台態臺" }, - { "tan", "探談曇" }, - { "tang", "糖" }, - { "tao", "桃逃套討" }, - { "te", "特" }, - { "ti", "体提替題體戻" }, - { "tian", "天田" }, - { "tiao", "条條調" }, - { "tie", "鉄" }, - { "ting", "停庭聽町" }, - { "tong", "同童通痛统統" }, - { "tou", "投透頭" }, - { "tu", "土徒茶図" }, - { "tuan", "團" }, - { "tui", "推退" }, - { "tuo", "脱駄" }, - { "u", "" }, - { "v", "" }, - { "wai", "外" }, - { "wan", "完万玩晩腕灣" }, - { "wang", "忘望亡往網" }, - { "wei", "危位未味委為謂維違圍" }, - { "wen", "文温問聞" }, - { "wo", "我" }, - { "wu", "午物五無屋亡鳥務汚" }, - { "xi", "夕息西洗喜系昔席希析嬉膝細習係" }, - { "xia", "下夏狭暇" }, - { "xian", "先限嫌洗現見線顯" }, - { "xiang", "向相香像想象降項詳響" }, - { "xiao", "小笑消效校削咲" }, - { "xie", "写携些解邪械協謝寫契" }, - { "xin", "心信新辛" }, - { "xing", "行形性幸型星興" }, - { "xiong", "兄胸" }, - { "xiu", "休秀修" }, - { "xu", "須需許續緒続" }, - { "xuan", "選懸" }, - { "xue", "学雪削靴學" }, - { "xun", "訓訊" }, - { "ya", "呀押壓" }, - { "yan", "言顔研煙嚴厳験驗塩" }, - { "yang", "央洋陽樣様" }, - { "yao", "要揺腰薬曜" }, - { "ye", "也野夜邪業葉" }, - { "yi", "一已亦依以移意医易伊役異億義議藝醫訳" }, - { "yin", "因引音飲銀" }, - { "ying", "英迎影映應營営" }, - { "yong", "永用泳擁" }, - { "you", "又有右友由尤油遊郵誘優" }, - { "yu", "予育余雨浴欲愈御宇域語於魚與込" }, - { "yuan", "元原源院員円園遠猿願" }, - { "yue", "月越約楽" }, - { "yun", "雲伝運" }, - { "za", "雑" }, - { "zai", "在再載災" }, - { "zang", "蔵" }, - { "zao", "早造" }, - { "ze", "則擇責" }, - { "zen", "怎" }, - { "zeng", "曾增増" }, - { "zha", "札" }, - { "zhai", "宅擇" }, - { "zhan", "站展戰戦" }, - { "zhang", "丈長障帳張" }, - { "zhao", "找着朝招" }, - { "zhe", "者這" }, - { "zhen", "真震針" }, - { "zheng", "正整争政爭" }, - { "zhi", "之只知支止制至治直指值置智値紙製質誌織隻識職執" }, - { "zhong", "中种終重種眾" }, - { "zhou", "周州昼宙洲週" }, - { "zhu", "助主住柱株祝逐注著諸屬術" }, - { "zhuan", "专專転" }, - { "zhuang", "状狀" }, - { "zhui", "追" }, - { "zhun", "準" }, - { "zhuo", "着" }, - { "zi", "子自字姉資" }, - { "zong", "總" }, - { "zuo", "左做昨坐座作" }, - { "zu", "足祖族卒組" }, - { "zui", "最酔" }, - { "zou", "走" }, - {NULL, NULL} -}; -#endif - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ -lv_obj_t * lv_ime_pinyin_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_ime_pinyin_set_keyboard(lv_obj_t * obj, lv_obj_t * kb) -{ - if(kb) { - LV_ASSERT_OBJ(kb, &lv_keyboard_class); - } - - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - pinyin_ime->kb = kb; - lv_obj_set_parent(obj, lv_obj_get_parent(kb)); - lv_obj_set_parent(pinyin_ime->cand_panel, lv_obj_get_parent(kb)); - lv_obj_add_event_cb(pinyin_ime->kb, lv_ime_pinyin_kb_event, LV_EVENT_VALUE_CHANGED, obj); - lv_obj_align_to(pinyin_ime->cand_panel, pinyin_ime->kb, LV_ALIGN_OUT_TOP_MID, 0, 0); -} - -void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - init_pinyin_dict(obj, dict); -} - -void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - LV_ASSERT_OBJ(pinyin_ime->kb, &lv_keyboard_class); - - pinyin_ime->mode = mode; - -#if LV_IME_PINYIN_USE_K9_MODE - if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { - pinyin_k9_init_data(obj); - lv_keyboard_set_map(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1, (const char **)lv_btnm_def_pinyin_k9_map, - default_kb_ctrl_k9_map); - lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1); - } -#endif -} - -/*===================== - * Getter functions - *====================*/ - -lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - return pinyin_ime->kb; -} - -lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - return pinyin_ime->cand_panel; -} - -const lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - return pinyin_ime->dict; -} - -/*===================== - * Other functions - *====================*/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - uint16_t py_str_i = 0; - uint16_t btnm_i = 0; - for(btnm_i = 0; btnm_i < (LV_IME_PINYIN_CAND_TEXT_NUM + 3); btnm_i++) { - if(btnm_i == 0) { - lv_btnm_def_pinyin_sel_map[btnm_i] = "<"; - } - else if(btnm_i == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) { - lv_btnm_def_pinyin_sel_map[btnm_i] = ">"; - } - else if(btnm_i == (LV_IME_PINYIN_CAND_TEXT_NUM + 2)) { - lv_btnm_def_pinyin_sel_map[btnm_i] = ""; - } - else { - lv_pinyin_cand_str[py_str_i][0] = ' '; - lv_btnm_def_pinyin_sel_map[btnm_i] = lv_pinyin_cand_str[py_str_i]; - py_str_i++; - } - } - - pinyin_ime->mode = LV_IME_PINYIN_MODE_K26; - pinyin_ime->py_page = 0; - pinyin_ime->ta_count = 0; - pinyin_ime->cand_num = 0; - lv_memzero(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); - lv_memzero(pinyin_ime->py_num, sizeof(pinyin_ime->py_num)); - lv_memzero(pinyin_ime->py_pos, sizeof(pinyin_ime->py_pos)); - - lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); - -#if LV_IME_PINYIN_USE_DEFAULT_DICT - init_pinyin_dict(obj, lv_ime_pinyin_def_dict); -#endif - - /* Init pinyin_ime->cand_panel */ - pinyin_ime->cand_panel = lv_buttonmatrix_create(lv_obj_get_parent(obj)); - lv_buttonmatrix_set_map(pinyin_ime->cand_panel, (const char **)lv_btnm_def_pinyin_sel_map); - lv_obj_set_size(pinyin_ime->cand_panel, LV_PCT(100), LV_PCT(5)); - lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); - - lv_buttonmatrix_set_one_checked(pinyin_ime->cand_panel, true); - lv_obj_remove_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_CLICK_FOCUSABLE); - - /* Set cand_panel style*/ - // Default style - lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_0, 0); - lv_obj_set_style_border_width(pinyin_ime->cand_panel, 0, 0); - lv_obj_set_style_pad_all(pinyin_ime->cand_panel, 8, 0); - lv_obj_set_style_pad_gap(pinyin_ime->cand_panel, 0, 0); - lv_obj_set_style_radius(pinyin_ime->cand_panel, 0, 0); - lv_obj_set_style_pad_gap(pinyin_ime->cand_panel, 0, 0); - lv_obj_set_style_base_dir(pinyin_ime->cand_panel, LV_BASE_DIR_LTR, 0); - - // LV_PART_ITEMS style - lv_obj_set_style_radius(pinyin_ime->cand_panel, 12, LV_PART_ITEMS); - lv_obj_set_style_bg_color(pinyin_ime->cand_panel, lv_color_white(), LV_PART_ITEMS); - lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_0, LV_PART_ITEMS); - lv_obj_set_style_shadow_opa(pinyin_ime->cand_panel, LV_OPA_0, LV_PART_ITEMS); - - // LV_PART_ITEMS | LV_STATE_PRESSED style - lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_COVER, LV_PART_ITEMS | LV_STATE_PRESSED); - lv_obj_set_style_bg_color(pinyin_ime->cand_panel, lv_color_white(), LV_PART_ITEMS | LV_STATE_PRESSED); - - /* event handler */ - lv_obj_add_event_cb(pinyin_ime->cand_panel, lv_ime_pinyin_cand_panel_event, LV_EVENT_VALUE_CHANGED, obj); - lv_obj_add_event_cb(obj, lv_ime_pinyin_style_change_event, LV_EVENT_STYLE_CHANGED, NULL); - -#if LV_IME_PINYIN_USE_K9_MODE - pinyin_ime->k9_input_str_len = 0; - pinyin_ime->k9_py_ll_pos = 0; - pinyin_ime->k9_legal_py_count = 0; - lv_memzero(pinyin_ime->k9_input_str, LV_IME_PINYIN_K9_MAX_INPUT); - - pinyin_k9_init_data(obj); - - lv_ll_init(&(pinyin_ime->k9_legal_py_ll), sizeof(ime_pinyin_k9_py_str_t)); -#endif -} - -static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - if(lv_obj_is_valid(pinyin_ime->kb)) - lv_obj_delete(pinyin_ime->kb); - - if(lv_obj_is_valid(pinyin_ime->cand_panel)) - lv_obj_delete(pinyin_ime->cand_panel); -} - -static void lv_ime_pinyin_kb_event(lv_event_t * e) -{ - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * kb = lv_event_get_current_target(e); - lv_obj_t * obj = lv_event_get_user_data(e); - - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - -#if LV_IME_PINYIN_USE_K9_MODE - static const char * k9_py_map[8] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; -#endif - - if(code == LV_EVENT_VALUE_CHANGED) { - uint16_t btn_id = lv_buttonmatrix_get_selected_button(kb); - if(btn_id == LV_BUTTONMATRIX_BUTTON_NONE) return; - - const char * txt = lv_buttonmatrix_get_button_text(kb, lv_buttonmatrix_get_selected_button(kb)); - if(txt == NULL) return; - - lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); - -#if LV_IME_PINYIN_USE_K9_MODE - if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { - - uint16_t tmp_button_str_len = lv_strlen(pinyin_ime->input_char); - if((btn_id >= 16) && (tmp_button_str_len > 0) && (btn_id < (16 + LV_IME_PINYIN_K9_CAND_TEXT_NUM))) { - lv_memzero(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); - lv_strcat(pinyin_ime->input_char, txt); - pinyin_input_proc(obj); - - for(int index = 0; index < (pinyin_ime->ta_count + tmp_button_str_len); index++) { - lv_textarea_delete_char(ta); - } - - pinyin_ime->ta_count = tmp_button_str_len; - pinyin_ime->k9_input_str_len = tmp_button_str_len; - lv_textarea_add_text(ta, pinyin_ime->input_char); - - return; - } - } -#endif - - if(lv_strcmp(txt, "Enter") == 0 || lv_strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) { - pinyin_ime_clear_data(obj); - lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); - } - else if(lv_strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) { - // del input char - if(pinyin_ime->ta_count > 0) { - if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) - pinyin_ime->input_char[pinyin_ime->ta_count - 1] = '\0'; -#if LV_IME_PINYIN_USE_K9_MODE - else - pinyin_ime->k9_input_str[pinyin_ime->ta_count - 1] = '\0'; -#endif - - pinyin_ime->ta_count--; - if(pinyin_ime->ta_count <= 0) { - pinyin_ime_clear_data(obj); - lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); - } - else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) { - pinyin_input_proc(obj); - } -#if LV_IME_PINYIN_USE_K9_MODE - else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { - pinyin_ime->k9_input_str_len = lv_strlen(pinyin_ime->input_char) - 1; - pinyin_k9_get_legal_py(obj, pinyin_ime->k9_input_str, k9_py_map); - pinyin_k9_fill_cand(obj); - pinyin_input_proc(obj); - pinyin_ime->ta_count--; - } -#endif - } - } - else if((lv_strcmp(txt, "ABC") == 0) || (lv_strcmp(txt, "abc") == 0) || (lv_strcmp(txt, "1#") == 0) || - (lv_strcmp(txt, LV_SYMBOL_OK) == 0)) { - pinyin_ime_clear_data(obj); - return; - } - else if(lv_strcmp(txt, "123") == 0) { - for(uint16_t i = 0; i < lv_strlen(txt); i++) - lv_textarea_delete_char(ta); - - pinyin_ime_clear_data(obj); - lv_textarea_set_cursor_pos(ta, LV_TEXTAREA_CURSOR_LAST); - lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K9_NUMBER); - lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUMBER); - lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); - } - else if(lv_strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) { - if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) { - lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K9); - } - else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { - lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K26); - lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_TEXT_LOWER); - } - else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9_NUMBER) { - lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K9); - } - pinyin_ime_clear_data(obj); - } - else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) && ((txt[0] >= 'a' && txt[0] <= 'z') || (txt[0] >= 'A' && - txt[0] <= 'Z'))) { - uint16_t len = lv_strlen(pinyin_ime->input_char); - lv_snprintf(pinyin_ime->input_char + len, sizeof(pinyin_ime->input_char) - len, "%s", txt); - pinyin_input_proc(obj); - pinyin_ime->ta_count++; - } -#if LV_IME_PINYIN_USE_K9_MODE - else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) && (txt[0] >= 'a' && txt[0] <= 'z')) { - for(uint16_t i = 0; i < 8; i++) { - if((lv_strcmp(txt, k9_py_map[i]) == 0) || (lv_strcmp(txt, "abc ") == 0)) { - if(lv_strcmp(txt, "abc ") == 0) pinyin_ime->k9_input_str_len += lv_strlen(k9_py_map[i]) + 1; - else pinyin_ime->k9_input_str_len += lv_strlen(k9_py_map[i]); - pinyin_ime->k9_input_str[pinyin_ime->ta_count] = 50 + i; - pinyin_ime->k9_input_str[pinyin_ime->ta_count + 1] = '\0'; - - break; - } - } - pinyin_k9_get_legal_py(obj, pinyin_ime->k9_input_str, k9_py_map); - pinyin_k9_fill_cand(obj); - pinyin_input_proc(obj); - } - else if(lv_strcmp(txt, LV_SYMBOL_LEFT) == 0) { - pinyin_k9_cand_page_proc(obj, 0); - } - else if(lv_strcmp(txt, LV_SYMBOL_RIGHT) == 0) { - pinyin_k9_cand_page_proc(obj, 1); - } -#endif - } -} - -static void lv_ime_pinyin_cand_panel_event(lv_event_t * e) -{ - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * cand_panel = lv_event_get_current_target(e); - lv_obj_t * obj = (lv_obj_t *)lv_event_get_user_data(e); - - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - if(code == LV_EVENT_VALUE_CHANGED) { - lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); - if(ta == NULL) return; - - uint32_t id = lv_buttonmatrix_get_selected_button(cand_panel); - if(id == LV_BUTTONMATRIX_BUTTON_NONE) { - return; - } - else if(id == 0) { - pinyin_page_proc(obj, 0); - return; - } - else if(id == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) { - pinyin_page_proc(obj, 1); - return; - } - - const char * txt = lv_buttonmatrix_get_button_text(cand_panel, id); - uint16_t index = 0; - for(index = 0; index < pinyin_ime->ta_count; index++) - lv_textarea_delete_char(ta); - - lv_textarea_add_text(ta, txt); - - pinyin_ime_clear_data(obj); - } -} - -static void pinyin_input_proc(lv_obj_t * obj) -{ - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - pinyin_ime->cand_str = pinyin_search_matching(obj, pinyin_ime->input_char, &pinyin_ime->cand_num); - if(pinyin_ime->cand_str == NULL) { - return; - } - - pinyin_ime->py_page = 0; - - for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) { - lv_memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i])); - lv_pinyin_cand_str[i][0] = ' '; - } - - // fill buf - for(uint8_t i = 0; (i < pinyin_ime->cand_num && i < LV_IME_PINYIN_CAND_TEXT_NUM); i++) { - for(uint8_t j = 0; j < 3; j++) { - lv_pinyin_cand_str[i][j] = pinyin_ime->cand_str[i * 3 + j]; - } - } - - lv_obj_remove_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); -} - -static void pinyin_page_proc(lv_obj_t * obj, uint16_t dir) -{ - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - uint16_t page_num = pinyin_ime->cand_num / LV_IME_PINYIN_CAND_TEXT_NUM; - uint16_t remainder = pinyin_ime->cand_num % LV_IME_PINYIN_CAND_TEXT_NUM; - - if(!pinyin_ime->cand_str) return; - - if(dir == 0) { - if(pinyin_ime->py_page) { - pinyin_ime->py_page--; - } - } - else { - if(remainder == 0) { - page_num -= 1; - } - if(pinyin_ime->py_page < page_num) { - pinyin_ime->py_page++; - } - else return; - } - - for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) { - lv_memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i])); - lv_pinyin_cand_str[i][0] = ' '; - } - - // fill buf - uint16_t offset = pinyin_ime->py_page * (3 * LV_IME_PINYIN_CAND_TEXT_NUM); - for(uint8_t i = 0; (i < pinyin_ime->cand_num && i < LV_IME_PINYIN_CAND_TEXT_NUM); i++) { - if((remainder > 0) && (pinyin_ime->py_page == page_num)) { - if(i >= remainder) - break; - } - for(uint8_t j = 0; j < 3; j++) { - lv_pinyin_cand_str[i][j] = pinyin_ime->cand_str[offset + (i * 3) + j]; - } - } -} - -static void lv_ime_pinyin_style_change_event(lv_event_t * e) -{ - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - if(code == LV_EVENT_STYLE_CHANGED) { - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - lv_obj_set_style_text_font(pinyin_ime->cand_panel, font, 0); - } -} - -static void init_pinyin_dict(lv_obj_t * obj, const lv_pinyin_dict_t * dict) -{ - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - char headletter = 'a'; - uint16_t offset_sum = 0; - uint16_t offset_count = 0; - uint16_t letter_calc = 0; - - pinyin_ime->dict = dict; - - for(uint16_t i = 0; ; i++) { - if((NULL == (dict[i].py)) || (NULL == (dict[i].py_mb))) { - headletter = dict[i - 1].py[0]; - letter_calc = headletter - 'a'; - pinyin_ime->py_num[letter_calc] = offset_count; - break; - } - - if(headletter == (dict[i].py[0])) { - offset_count++; - } - else { - headletter = dict[i].py[0]; - pinyin_ime->py_num[letter_calc] = offset_count; - letter_calc = headletter - 'a'; - offset_sum += offset_count; - pinyin_ime->py_pos[letter_calc] = offset_sum; - - offset_count = 1; - } - } -} - -static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num) -{ - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - const lv_pinyin_dict_t * cpHZ; - uint8_t index, len = 0, offset; - volatile uint8_t count = 0; - - if(*py_str == '\0') return NULL; - if(*py_str == 'i') return NULL; - if(*py_str == 'u') return NULL; - if(*py_str == 'v') return NULL; - if(*py_str == ' ') return NULL; - - offset = py_str[0] - 'a'; - len = lv_strlen(py_str); - - cpHZ = &pinyin_ime->dict[pinyin_ime->py_pos[offset]]; - count = pinyin_ime->py_num[offset]; - - while(count--) { - for(index = 0; index < len; index++) { - if(*(py_str + index) != *((cpHZ->py) + index)) { - break; - } - } - - // perfect match - if(len == 1 || index == len) { - // The Chinese character in UTF-8 encoding format is 3 bytes - * cand_num = lv_strlen((const char *)(cpHZ->py_mb)) / 3; - return (char *)(cpHZ->py_mb); - } - cpHZ++; - } - return NULL; -} - -static void pinyin_ime_clear_data(lv_obj_t * obj) -{ - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - -#if LV_IME_PINYIN_USE_K9_MODE - if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { - pinyin_ime->k9_input_str_len = 0; - pinyin_ime->k9_py_ll_pos = 0; - pinyin_ime->k9_legal_py_count = 0; - lv_memzero(pinyin_ime->k9_input_str, LV_IME_PINYIN_K9_MAX_INPUT); - lv_memzero(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str)); - for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) { - lv_strcpy(lv_pinyin_k9_cand_str[i], " "); - } - lv_strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0"); - lv_strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0"); - lv_buttonmatrix_set_map(pinyin_ime->kb, (const char **)lv_btnm_def_pinyin_k9_map); - } -#endif - - pinyin_ime->ta_count = 0; - for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) { - lv_memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i])); - lv_pinyin_cand_str[i][0] = ' '; - } - lv_memzero(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); - - lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); -} - -#if LV_IME_PINYIN_USE_K9_MODE -static void pinyin_k9_init_data(lv_obj_t * obj) -{ - LV_UNUSED(obj); - - uint16_t py_str_i = 0; - uint16_t btnm_i = 0; - for(btnm_i = 19; btnm_i < (LV_IME_PINYIN_K9_CAND_TEXT_NUM + 21); btnm_i++) { - if(py_str_i == LV_IME_PINYIN_K9_CAND_TEXT_NUM) { - lv_strcpy(lv_pinyin_k9_cand_str[py_str_i], LV_SYMBOL_RIGHT"\0"); - } - else if(py_str_i == LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1) { - lv_strcpy(lv_pinyin_k9_cand_str[py_str_i], "\0"); - } - else { - lv_strcpy(lv_pinyin_k9_cand_str[py_str_i], " \0"); - } - - lv_btnm_def_pinyin_k9_map[btnm_i] = lv_pinyin_k9_cand_str[py_str_i]; - py_str_i++; - } - - default_kb_ctrl_k9_map[0] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; - default_kb_ctrl_k9_map[1] = LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_CLICK_TRIG | 1; - default_kb_ctrl_k9_map[4] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; - default_kb_ctrl_k9_map[5] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; - default_kb_ctrl_k9_map[9] = LV_KEYBOARD_CTRL_BUTTON_FLAGS | 1; - default_kb_ctrl_k9_map[10] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; - default_kb_ctrl_k9_map[14] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; - default_kb_ctrl_k9_map[15] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; - default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 16] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; -} - -static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * py9_map[]) -{ - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - uint16_t len = lv_strlen(k9_input); - - if((len == 0) || (len >= LV_IME_PINYIN_K9_MAX_INPUT)) { - return; - } - - char py_comp[LV_IME_PINYIN_K9_MAX_INPUT] = {0}; - int mark[LV_IME_PINYIN_K9_MAX_INPUT] = {0}; - int index = 0; - int flag = 0; - uint16_t count = 0; - - uint32_t ll_len = 0; - ime_pinyin_k9_py_str_t * ll_index = NULL; - - ll_len = lv_ll_get_len(&pinyin_ime->k9_legal_py_ll); - ll_index = lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); - - while(index != -1) { - if(index == len) { - if(pinyin_k9_is_valid_py(obj, py_comp)) { - if((count >= ll_len) || (ll_len == 0)) { - ll_index = lv_ll_ins_tail(&pinyin_ime->k9_legal_py_ll); - lv_strcpy(ll_index->py_str, py_comp); - } - else if((count < ll_len)) { - lv_strcpy(ll_index->py_str, py_comp); - ll_index = lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); - } - count++; - } - index--; - } - else { - flag = mark[index]; - if((size_t)flag < lv_strlen(py9_map[k9_input[index] - '2'])) { - py_comp[index] = py9_map[k9_input[index] - '2'][flag]; - mark[index] = mark[index] + 1; - index++; - } - else { - mark[index] = 0; - index--; - } - } - } - - if(count > 0) { - pinyin_ime->ta_count++; - pinyin_ime->k9_legal_py_count = count; - } -} - -/*true: visible; false: not visible*/ -static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str) -{ - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - const lv_pinyin_dict_t * cpHZ = NULL; - uint8_t index = 0, len = 0, offset = 0; - volatile uint8_t count = 0; - - if(*py_str == '\0') return false; - if(*py_str == 'i') return false; - if(*py_str == 'u') return false; - if(*py_str == 'v') return false; - - offset = py_str[0] - 'a'; - len = lv_strlen(py_str); - - cpHZ = &pinyin_ime->dict[pinyin_ime->py_pos[offset]]; - count = pinyin_ime->py_num[offset]; - - while(count--) { - for(index = 0; index < len; index++) { - if(*(py_str + index) != *((cpHZ->py) + index)) { - break; - } - } - - // perfect match - if(len == 1 || index == len) { - return true; - } - cpHZ++; - } - return false; -} - -static void pinyin_k9_fill_cand(lv_obj_t * obj) -{ - uint16_t index = 0, tmp_len = 0; - ime_pinyin_k9_py_str_t * ll_index = NULL; - - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - tmp_len = pinyin_ime->k9_legal_py_count; - - if(tmp_len != cand_len) { - lv_memzero(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str)); - lv_strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0"); - lv_strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0"); - cand_len = tmp_len; - } - - ll_index = lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); - lv_strcpy(pinyin_ime->input_char, ll_index->py_str); - - for(uint8_t i = 0; i < LV_IME_PINYIN_K9_CAND_TEXT_NUM; i++) { - lv_strcpy(lv_pinyin_k9_cand_str[i], " "); - } - - while(ll_index) { - if(index >= LV_IME_PINYIN_K9_CAND_TEXT_NUM) - break; - - if(index < pinyin_ime->k9_legal_py_count) { - lv_strcpy(lv_pinyin_k9_cand_str[index], ll_index->py_str); - } - - ll_index = lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ - index++; - } - pinyin_ime->k9_py_ll_pos = index; - - lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); - for(index = 0; index < pinyin_ime->k9_input_str_len; index++) { - lv_textarea_delete_char(ta); - } - pinyin_ime->k9_input_str_len = lv_strlen(pinyin_ime->input_char); - lv_textarea_add_text(ta, pinyin_ime->input_char); -} - -static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir) -{ - lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - - lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); - uint16_t ll_len = lv_ll_get_len(&pinyin_ime->k9_legal_py_ll); - - if((ll_len > LV_IME_PINYIN_K9_CAND_TEXT_NUM) && (pinyin_ime->k9_legal_py_count > LV_IME_PINYIN_K9_CAND_TEXT_NUM)) { - ime_pinyin_k9_py_str_t * ll_index = NULL; - int count = 0; - - ll_index = lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); - while(ll_index) { - if(count >= pinyin_ime->k9_py_ll_pos) break; - - ll_index = lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ - count++; - } - - if((NULL == ll_index) && (dir == 1)) return; - - lv_memzero(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str)); - lv_strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0"); - lv_strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0"); - - // next page - if(dir == 1) { - for(uint8_t i = 0; i < LV_IME_PINYIN_K9_CAND_TEXT_NUM; i++) { - lv_strcpy(lv_pinyin_k9_cand_str[i], " "); - } - - count = 0; - while(ll_index) { - if(count >= (LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1)) - break; - - lv_strcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str); - ll_index = lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ - count++; - } - pinyin_ime->k9_py_ll_pos += count - 1; - - } - // previous page - else { - for(uint8_t i = 0; i < LV_IME_PINYIN_K9_CAND_TEXT_NUM; i++) { - lv_strcpy(lv_pinyin_k9_cand_str[i], " "); - } - count = LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1; - ll_index = lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); - while(ll_index) { - if(count < 0) break; - - lv_strcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str); - ll_index = lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the previous list*/ - count--; - } - - if(pinyin_ime->k9_py_ll_pos > LV_IME_PINYIN_K9_CAND_TEXT_NUM) - pinyin_ime->k9_py_ll_pos -= 1; - } - - lv_textarea_set_cursor_pos(ta, LV_TEXTAREA_CURSOR_LAST); - } -} - -#endif /*LV_IME_PINYIN_USE_K9_MODE*/ - -#endif /*LV_USE_IME_PINYIN*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/ime/lv_ime_pinyin.h b/software/Power_Pico/Middlewares/LVGL/src/others/ime/lv_ime_pinyin.h deleted file mode 100644 index ff85eee..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/ime/lv_ime_pinyin.h +++ /dev/null @@ -1,121 +0,0 @@ -/** - * @file lv_ime_pinyin.h - * - */ -#ifndef LV_IME_PINYIN_H -#define LV_IME_PINYIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../core/lv_obj.h" - -#if LV_USE_IME_PINYIN != 0 - -/********************* - * DEFINES - *********************/ -#define LV_IME_PINYIN_K9_MAX_INPUT 7 - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - LV_IME_PINYIN_MODE_K26, - LV_IME_PINYIN_MODE_K9, - LV_IME_PINYIN_MODE_K9_NUMBER, -} lv_ime_pinyin_mode_t; - -/*Data of pinyin_dict*/ -typedef struct { - const char * const py; - const char * const py_mb; -} lv_pinyin_dict_t; - -/*Data of 9-key input(k9) mode*/ -typedef struct { - char py_str[7]; -} ime_pinyin_k9_py_str_t; - -/*********************** - * GLOBAL VARIABLES - ***********************/ - -extern const lv_obj_class_t lv_ime_pinyin_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ -lv_obj_t * lv_ime_pinyin_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the keyboard of Pinyin input method. - * @param obj pointer to a Pinyin input method object - * @param kb pointer to a Pinyin input method keyboard - */ -void lv_ime_pinyin_set_keyboard(lv_obj_t * obj, lv_obj_t * kb); - -/** - * Set the dictionary of Pinyin input method. - * @param obj pointer to a Pinyin input method object - * @param dict pointer to a Pinyin input method dictionary - */ -void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict); - -/** - * Set mode, 26-key input(k26) or 9-key input(k9). - * @param obj pointer to a Pinyin input method object - * @param mode the mode from 'lv_ime_pinyin_mode_t' - */ -void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode); - -/*===================== - * Getter functions - *====================*/ - -/** - * Set the dictionary of Pinyin input method. - * @param obj pointer to a Pinyin IME object - * @return pointer to the Pinyin IME keyboard - */ -lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj); - -/** - * Set the dictionary of Pinyin input method. - * @param obj pointer to a Pinyin input method object - * @return pointer to the Pinyin input method candidate panel - */ -lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj); - -/** - * Set the dictionary of Pinyin input method. - * @param obj pointer to a Pinyin input method object - * @return pointer to the Pinyin input method dictionary - */ -const lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj); - -/*===================== - * Other functions - *====================*/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_IME_PINYIN*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_USE_IME_PINYIN*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/ime/lv_ime_pinyin_private.h b/software/Power_Pico/Middlewares/LVGL/src/others/ime/lv_ime_pinyin_private.h deleted file mode 100644 index 6ec42fc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/ime/lv_ime_pinyin_private.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @file lv_ime_pinyin_private.h - * - */ - -#ifndef LV_IME_PINYIN_PRIVATE_H -#define LV_IME_PINYIN_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_ime_pinyin.h" - -#if LV_USE_IME_PINYIN != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*Data of lv_ime_pinyin*/ -struct lv_ime_pinyin_t { - lv_obj_t obj; - lv_obj_t * kb; - lv_obj_t * cand_panel; - const lv_pinyin_dict_t * dict; - lv_ll_t k9_legal_py_ll; - char * cand_str; /* Candidate string */ - char input_char[16]; /* Input box character */ -#if LV_IME_PINYIN_USE_K9_MODE - char k9_input_str[LV_IME_PINYIN_K9_MAX_INPUT + 1]; /* 9-key input(k9) mode input string */ - uint16_t k9_py_ll_pos; /* Current pinyin map pages(k9) */ - uint16_t k9_legal_py_count; /* Count of legal Pinyin numbers(k9) */ - uint16_t k9_input_str_len; /* 9-key input(k9) mode input string max len */ -#endif - uint16_t ta_count; /* The number of characters entered in the text box this time */ - uint16_t cand_num; /* Number of candidates */ - uint16_t py_page; /* Current pinyin map pages(k26) */ - uint16_t py_num[26]; /* Number and length of Pinyin */ - uint16_t py_pos[26]; /* Pinyin position */ - lv_ime_pinyin_mode_t mode; /* Set mode, 1: 26-key input(k26), 0: 9-key input(k9). Default: 1. */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_IME_PINYIN != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_IME_PINYIN_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/imgfont/lv_imgfont.c b/software/Power_Pico/Middlewares/LVGL/src/others/imgfont/lv_imgfont.c deleted file mode 100644 index edc6990..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/imgfont/lv_imgfont.c +++ /dev/null @@ -1,121 +0,0 @@ -/** - * @file lv_imgfont.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../lvgl.h" - -#if LV_USE_IMGFONT - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_font_t font; - lv_imgfont_get_path_cb_t path_cb; - void * user_data; -} imgfont_dsc_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static const void * imgfont_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf); -static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, - uint32_t unicode, uint32_t unicode_next); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ -lv_font_t * lv_imgfont_create(uint16_t height, lv_imgfont_get_path_cb_t path_cb, void * user_data) -{ - imgfont_dsc_t * dsc = lv_malloc_zeroed(sizeof(imgfont_dsc_t)); - LV_ASSERT_MALLOC(dsc); - if(dsc == NULL) return NULL; - - dsc->path_cb = path_cb; - dsc->user_data = user_data; - - lv_font_t * font = &dsc->font; - font->dsc = dsc; - font->get_glyph_dsc = imgfont_get_glyph_dsc; - font->get_glyph_bitmap = imgfont_get_glyph_bitmap; - font->subpx = LV_FONT_SUBPX_NONE; - font->line_height = height; - font->base_line = 0; - font->underline_position = 0; - font->underline_thickness = 0; - - return font; -} - -void lv_imgfont_destroy(lv_font_t * font) -{ - LV_ASSERT_NULL(font); - - imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc; - lv_free(dsc); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static const void * imgfont_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf) -{ - LV_UNUSED(draw_buf); - - const void * img_src = g_dsc->gid.src; - return img_src; -} - -static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, - uint32_t unicode, uint32_t unicode_next) -{ - LV_ASSERT_NULL(font); - - imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc; - LV_ASSERT_NULL(dsc); - if(dsc->path_cb == NULL) return false; - - int32_t offset_y = 0; - - const void * img_src = dsc->path_cb(font, unicode, unicode_next, &offset_y, dsc->user_data); - if(img_src == NULL) return false; - - lv_image_header_t header; - if(lv_image_decoder_get_info(img_src, &header) != LV_RESULT_OK) { - return false; - } - - dsc_out->is_placeholder = 0; - dsc_out->adv_w = header.w; - dsc_out->box_w = header.w; - dsc_out->box_h = header.h; - dsc_out->ofs_x = 0; - dsc_out->ofs_y = offset_y; - dsc_out->format = LV_FONT_GLYPH_FORMAT_IMAGE; /* is image identifier */ - dsc_out->gid.src = img_src; - - return true; -} - -#endif /*LV_USE_IMGFONT*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/imgfont/lv_imgfont.h b/software/Power_Pico/Middlewares/LVGL/src/others/imgfont/lv_imgfont.h deleted file mode 100644 index 68c317a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/imgfont/lv_imgfont.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @file lv_imgfont.h - * - */ - -#ifndef LV_IMGFONT_H -#define LV_IMGFONT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../font/lv_font.h" - -#if LV_USE_IMGFONT - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/* gets the image path name of this character */ -typedef const void * (*lv_imgfont_get_path_cb_t)(const lv_font_t * font, - uint32_t unicode, uint32_t unicode_next, - int32_t * offset_y, void * user_data); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Creates a image font with info parameter specified. - * @param height font size - * @param path_cb a function to get the image path name of character. - * @param user_data pointer to user data - * @return pointer to the new imgfont or NULL if create error. - */ -lv_font_t * lv_imgfont_create(uint16_t height, lv_imgfont_get_path_cb_t path_cb, void * user_data); - -/** - * Destroy a image font that has been created. - * @param font pointer to image font handle. - */ -void lv_imgfont_destroy(lv_font_t * font); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_IMGFONT*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /* LV_IMGFONT_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/monkey/lv_monkey.c b/software/Power_Pico/Middlewares/LVGL/src/others/monkey/lv_monkey.c deleted file mode 100644 index 97ba10a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/monkey/lv_monkey.c +++ /dev/null @@ -1,178 +0,0 @@ -/** - * @file lv_monkey.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_monkey_private.h" - -#if LV_USE_MONKEY != 0 - -#include "../../misc/lv_math.h" -#include "../../misc/lv_assert.h" -#include "../../stdlib/lv_mem.h" -#include "../../display/lv_display.h" - -/********************* - * DEFINES - *********************/ -#define MONKEY_PERIOD_RANGE_MIN_DEF 100 -#define MONKEY_PERIOD_RANGE_MAX_DEF 1000 - -/********************** - * TYPEDEFS - **********************/ -struct lv_monkey_t { - lv_monkey_config_t config; - lv_indev_data_t indev_data; - lv_indev_t * indev; - lv_timer_t * timer; - void * user_data; -}; - -static const lv_key_t lv_key_map[] = { - LV_KEY_UP, - LV_KEY_DOWN, - LV_KEY_RIGHT, - LV_KEY_LEFT, - LV_KEY_ESC, - LV_KEY_DEL, - LV_KEY_BACKSPACE, - LV_KEY_ENTER, - LV_KEY_NEXT, - LV_KEY_PREV, - LV_KEY_HOME, - LV_KEY_END, -}; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void lv_monkey_read_cb(lv_indev_t * indev, lv_indev_data_t * data); -static int32_t lv_monkey_random(int32_t howsmall, int32_t howbig); -static void lv_monkey_timer_cb(lv_timer_t * timer); - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_monkey_config_init(lv_monkey_config_t * config) -{ - lv_memzero(config, sizeof(lv_monkey_config_t)); - config->type = LV_INDEV_TYPE_POINTER; - config->period_range.min = MONKEY_PERIOD_RANGE_MIN_DEF; - config->period_range.max = MONKEY_PERIOD_RANGE_MAX_DEF; -} - -lv_monkey_t * lv_monkey_create(const lv_monkey_config_t * config) -{ - lv_monkey_t * monkey = lv_malloc_zeroed(sizeof(lv_monkey_t)); - LV_ASSERT_MALLOC(monkey); - - monkey->config = *config; - monkey->timer = lv_timer_create(lv_monkey_timer_cb, monkey->config.period_range.min, monkey); - lv_timer_pause(monkey->timer); - - monkey->indev = lv_indev_create(); - lv_indev_set_type(monkey->indev, config->type); - lv_indev_set_read_cb(monkey->indev, lv_monkey_read_cb); - lv_indev_set_user_data(monkey->indev, monkey); - return monkey; -} - -lv_indev_t * lv_monkey_get_indev(lv_monkey_t * monkey) -{ - LV_ASSERT_NULL(monkey); - return monkey->indev; -} - -void lv_monkey_set_enable(lv_monkey_t * monkey, bool en) -{ - LV_ASSERT_NULL(monkey); - en ? lv_timer_resume(monkey->timer) : lv_timer_pause(monkey->timer); -} - -bool lv_monkey_get_enable(lv_monkey_t * monkey) -{ - LV_ASSERT_NULL(monkey); - return !lv_timer_get_paused(monkey->timer); -} - -void lv_monkey_set_user_data(lv_monkey_t * monkey, void * user_data) -{ - LV_ASSERT_NULL(monkey); - monkey->user_data = user_data; -} - -void * lv_monkey_get_user_data(lv_monkey_t * monkey) -{ - LV_ASSERT_NULL(monkey); - return monkey->user_data; -} - -void lv_monkey_delete(lv_monkey_t * monkey) -{ - LV_ASSERT_NULL(monkey); - - lv_timer_delete(monkey->timer); - lv_indev_delete(monkey->indev); - lv_free(monkey); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_monkey_read_cb(lv_indev_t * indev, lv_indev_data_t * data) -{ - lv_monkey_t * monkey = lv_indev_get_user_data(indev); - - data->btn_id = monkey->indev_data.btn_id; - data->point = monkey->indev_data.point; - data->enc_diff = monkey->indev_data.enc_diff; - data->state = monkey->indev_data.state; -} - -static int32_t lv_monkey_random(int32_t howsmall, int32_t howbig) -{ - if(howsmall >= howbig) { - return howsmall; - } - int32_t diff = howbig - howsmall; - return (int32_t)lv_rand(0, diff) + howsmall; -} - -static void lv_monkey_timer_cb(lv_timer_t * timer) -{ - lv_monkey_t * monkey = lv_timer_get_user_data(timer); - lv_indev_data_t * data = &monkey->indev_data; - - switch(lv_indev_get_type(monkey->indev)) { - case LV_INDEV_TYPE_POINTER: - data->point.x = (int32_t)lv_monkey_random(0, LV_HOR_RES - 1); - data->point.y = (int32_t)lv_monkey_random(0, LV_VER_RES - 1); - break; - case LV_INDEV_TYPE_ENCODER: - data->enc_diff = (int16_t)lv_monkey_random(monkey->config.input_range.min, monkey->config.input_range.max); - break; - case LV_INDEV_TYPE_BUTTON: - data->btn_id = (uint32_t)lv_monkey_random(monkey->config.input_range.min, monkey->config.input_range.max); - break; - case LV_INDEV_TYPE_KEYPAD: { - int32_t index = lv_monkey_random(0, sizeof(lv_key_map) / sizeof(lv_key_map[0]) - 1); - data->key = lv_key_map[index]; - break; - } - default: - break; - } - - data->state = lv_monkey_random(0, 100) < 50 ? LV_INDEV_STATE_RELEASED : LV_INDEV_STATE_PRESSED; - - lv_timer_set_period(monkey->timer, lv_monkey_random(monkey->config.period_range.min, monkey->config.period_range.max)); -} - -#endif /*LV_USE_MONKEY*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/monkey/lv_monkey.h b/software/Power_Pico/Middlewares/LVGL/src/others/monkey/lv_monkey.h deleted file mode 100644 index 6cbe0ec..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/monkey/lv_monkey.h +++ /dev/null @@ -1,117 +0,0 @@ -/** - * @file lv_monkey.h - * - */ -#ifndef LV_MONKEY_H -#define LV_MONKEY_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../indev/lv_indev.h" - -#if LV_USE_MONKEY != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct lv_monkey_t lv_monkey_t; - -struct lv_monkey_config_t { - /**< Input device type*/ - lv_indev_type_t type; - - /**< Monkey execution period*/ - struct { - //! @cond Doxygen_Suppress - uint32_t min; - uint32_t max; - //! @endcond - } period_range; - - /**< The range of input value*/ - struct { - int32_t min; - int32_t max; - } input_range; -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize a monkey config with default values - * @param config pointer to 'lv_monkey_config_t' variable to initialize - */ -void lv_monkey_config_init(lv_monkey_config_t * config); - -/** - * Create monkey for test - * @param config pointer to 'lv_monkey_config_t' variable - * @return pointer to the created monkey - */ -lv_monkey_t * lv_monkey_create(const lv_monkey_config_t * config); - -/** - * Get monkey input device - * @param monkey pointer to a monkey - * @return pointer to the input device - */ -lv_indev_t * lv_monkey_get_indev(lv_monkey_t * monkey); - -/** - * Enable monkey - * @param monkey pointer to a monkey - * @param en set to true to enable - */ -void lv_monkey_set_enable(lv_monkey_t * monkey, bool en); - -/** - * Get whether monkey is enabled - * @param monkey pointer to a monkey - * @return return true if monkey enabled - */ -bool lv_monkey_get_enable(lv_monkey_t * monkey); - -/** - * Set the user_data field of the monkey - * @param monkey pointer to a monkey - * @param user_data pointer to the new user_data. - */ -void lv_monkey_set_user_data(lv_monkey_t * monkey, void * user_data); - -/** - * Get the user_data field of the monkey - * @param monkey pointer to a monkey - * @return the pointer to the user_data of the monkey - */ -void * lv_monkey_get_user_data(lv_monkey_t * monkey); - -/** - * Delete monkey - * @param monkey pointer to monkey - */ -void lv_monkey_delete(lv_monkey_t * monkey); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_MONKEY*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_MONKEY_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/monkey/lv_monkey_private.h b/software/Power_Pico/Middlewares/LVGL/src/others/monkey/lv_monkey_private.h deleted file mode 100644 index a08ea07..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/monkey/lv_monkey_private.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @file lv_monkey_private.h - * - */ - -#ifndef LV_MONKEY_PRIVATE_H -#define LV_MONKEY_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_monkey.h" - -#if LV_USE_MONKEY != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_MONKEY != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_MONKEY_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/observer/lv_observer.c b/software/Power_Pico/Middlewares/LVGL/src/others/observer/lv_observer.c deleted file mode 100644 index 8d43f52..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/observer/lv_observer.c +++ /dev/null @@ -1,725 +0,0 @@ -/** - * @file lv_observer.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_observer_private.h" -#if LV_USE_OBSERVER - -#include "../../lvgl.h" -#include "../../core/lv_obj_private.h" -#include "../../misc/lv_event_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - uint32_t flag; - lv_subject_value_t value; - uint32_t inv : 1; -} flag_and_cond_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void unsubscribe_on_delete_cb(lv_event_t * e); -static void group_notify_cb(lv_observer_t * observer, lv_subject_t * subject); -static lv_observer_t * bind_to_bitfield(lv_subject_t * subject, lv_obj_t * obj, lv_observer_cb_t cb, uint32_t flag, - int32_t ref_value, bool inv); -static void obj_flag_observer_cb(lv_observer_t * observer, lv_subject_t * subject); -static void obj_state_observer_cb(lv_observer_t * observer, lv_subject_t * subject); -static void obj_value_changed_event_cb(lv_event_t * e); - -#if LV_USE_LABEL - static void label_text_observer_cb(lv_observer_t * observer, lv_subject_t * subject); -#endif - -#if LV_USE_ARC - static void arc_value_changed_event_cb(lv_event_t * e); - static void arc_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); -#endif - -#if LV_USE_SLIDER - static void slider_value_changed_event_cb(lv_event_t * e); - static void slider_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); -#endif - -#if LV_USE_ROLLER - static void roller_value_changed_event_cb(lv_event_t * e); - static void roller_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); -#endif - -#if LV_USE_DROPDOWN - static void dropdown_value_changed_event_cb(lv_event_t * e); - static void dropdown_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); -#endif - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_subject_init_int(lv_subject_t * subject, int32_t value) -{ - lv_memzero(subject, sizeof(lv_subject_t)); - subject->type = LV_SUBJECT_TYPE_INT; - subject->value.num = value; - subject->prev_value.num = value; - lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); -} - -void lv_subject_set_int(lv_subject_t * subject, int32_t value) -{ - if(subject->type != LV_SUBJECT_TYPE_INT) { - LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_INT"); - return; - } - - subject->prev_value.num = subject->value.num; - subject->value.num = value; - lv_subject_notify(subject); -} - -int32_t lv_subject_get_int(lv_subject_t * subject) -{ - if(subject->type != LV_SUBJECT_TYPE_INT) { - LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_INT"); - return 0; - } - - return subject->value.num; -} - -int32_t lv_subject_get_previous_int(lv_subject_t * subject) -{ - if(subject->type != LV_SUBJECT_TYPE_INT) { - LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_INT"); - return 0; - } - - return subject->prev_value.num; -} - -void lv_subject_init_string(lv_subject_t * subject, char * buf, char * prev_buf, size_t size, const char * value) -{ - lv_memzero(subject, sizeof(lv_subject_t)); - lv_strlcpy(buf, value, size); - if(prev_buf) lv_strlcpy(prev_buf, value, size); - - subject->type = LV_SUBJECT_TYPE_STRING; - subject->size = size; - subject->value.pointer = buf; - subject->prev_value.pointer = prev_buf; - - lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); -} - -void lv_subject_copy_string(lv_subject_t * subject, const char * buf) -{ - if(subject->type != LV_SUBJECT_TYPE_STRING) { - LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_INT"); - return; - } - - if(subject->size < 1) return; - if(subject->prev_value.pointer) { - lv_strlcpy((char *)subject->prev_value.pointer, subject->value.pointer, subject->size); - } - - lv_strlcpy((char *)subject->value.pointer, buf, subject->size); - - lv_subject_notify(subject); - -} - -const char * lv_subject_get_string(lv_subject_t * subject) -{ - if(subject->type != LV_SUBJECT_TYPE_STRING) { - LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_STRING"); - return ""; - } - - return subject->value.pointer; -} - -const char * lv_subject_get_previous_string(lv_subject_t * subject) -{ - if(subject->type != LV_SUBJECT_TYPE_STRING) { - LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_STRING"); - return NULL; - } - - return subject->prev_value.pointer; -} - -void lv_subject_init_pointer(lv_subject_t * subject, void * value) -{ - lv_memzero(subject, sizeof(lv_subject_t)); - subject->type = LV_SUBJECT_TYPE_POINTER; - subject->value.pointer = value; - subject->prev_value.pointer = value; - lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); -} - -void lv_subject_set_pointer(lv_subject_t * subject, void * ptr) -{ - if(subject->type != LV_SUBJECT_TYPE_POINTER) { - LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_POINTER"); - return; - } - - subject->prev_value.pointer = subject->value.pointer; - subject->value.pointer = ptr; - lv_subject_notify(subject); -} - -const void * lv_subject_get_pointer(lv_subject_t * subject) -{ - if(subject->type != LV_SUBJECT_TYPE_POINTER) { - LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_POINTER"); - return NULL; - } - - return subject->value.pointer; -} - -const void * lv_subject_get_previous_pointer(lv_subject_t * subject) -{ - if(subject->type != LV_SUBJECT_TYPE_POINTER) { - LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_POINTER"); - return NULL; - } - - return subject->prev_value.pointer; -} - -void lv_subject_init_color(lv_subject_t * subject, lv_color_t color) -{ - lv_memzero(subject, sizeof(lv_subject_t)); - subject->type = LV_SUBJECT_TYPE_COLOR; - subject->value.color = color; - subject->prev_value.color = color; - lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); -} - -void lv_subject_set_color(lv_subject_t * subject, lv_color_t color) -{ - if(subject->type != LV_SUBJECT_TYPE_COLOR) { - LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_COLOR"); - return; - } - - subject->prev_value.color = subject->value.color; - subject->value.color = color; - lv_subject_notify(subject); -} - -lv_color_t lv_subject_get_color(lv_subject_t * subject) -{ - if(subject->type != LV_SUBJECT_TYPE_COLOR) { - LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_COLOR"); - return lv_color_black(); - } - - return subject->value.color; -} - -lv_color_t lv_subject_get_previous_color(lv_subject_t * subject) -{ - if(subject->type != LV_SUBJECT_TYPE_COLOR) { - LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_COLOR"); - return lv_color_black(); - } - - return subject->prev_value.color; -} - -void lv_subject_init_group(lv_subject_t * subject, lv_subject_t * list[], uint32_t list_len) -{ - subject->type = LV_SUBJECT_TYPE_GROUP; - subject->size = list_len; - lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); - subject->value.pointer = list; - - /* bind all subjects to this subject */ - uint32_t i; - for(i = 0; i < list_len; i++) { - /*If a subject in the group changes notify the group itself*/ - lv_subject_add_observer(list[i], group_notify_cb, subject); - } -} - -void lv_subject_deinit(lv_subject_t * subject) -{ - lv_observer_t * observer = lv_ll_get_head(&subject->subs_ll); - while(observer) { - lv_observer_t * observer_next = lv_ll_get_next(&subject->subs_ll, observer); - - if(observer->for_obj) { - lv_obj_remove_event_cb(observer->target, unsubscribe_on_delete_cb); - lv_obj_remove_event_cb_with_user_data(observer->target, NULL, subject); - } - - lv_observer_remove(observer); - observer = observer_next; - } - - lv_ll_clear(&subject->subs_ll); -} - -lv_subject_t * lv_subject_get_group_element(lv_subject_t * subject, int32_t index) -{ - if(subject->type != LV_SUBJECT_TYPE_GROUP) { - LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_GROUP"); - return NULL; - } - - if(index >= subject->size) return NULL; - - return ((lv_subject_t **)(subject->value.pointer))[index]; -} - -lv_observer_t * lv_subject_add_observer(lv_subject_t * subject, lv_observer_cb_t cb, void * user_data) -{ - lv_observer_t * observer = lv_subject_add_observer_obj(subject, cb, NULL, user_data); - if(observer == NULL) return NULL; - - observer->for_obj = 0; - return observer; -} - -lv_observer_t * lv_subject_add_observer_obj(lv_subject_t * subject, lv_observer_cb_t cb, lv_obj_t * obj, - void * user_data) -{ - LV_ASSERT_NULL(subject); - if(subject->type == LV_SUBJECT_TYPE_INVALID) { - LV_LOG_WARN("Subject not initialized yet"); - return NULL; - } - lv_observer_t * observer = lv_ll_ins_tail(&(subject->subs_ll)); - LV_ASSERT_MALLOC(observer); - if(observer == NULL) return NULL; - - lv_memzero(observer, sizeof(*observer)); - - observer->subject = subject; - observer->cb = cb; - observer->user_data = user_data; - observer->target = obj; - observer->for_obj = 1; - /* subscribe to delete event of the object */ - if(obj != NULL) { - lv_obj_add_event_cb(obj, unsubscribe_on_delete_cb, LV_EVENT_DELETE, observer); - } - - /* update object immediately */ - if(observer->cb) observer->cb(observer, subject); - - return observer; -} - -lv_observer_t * lv_subject_add_observer_with_target(lv_subject_t * subject, lv_observer_cb_t cb, void * target, - void * user_data) -{ - LV_ASSERT_NULL(subject); - if(subject->type == LV_SUBJECT_TYPE_INVALID) { - LV_LOG_WARN("Subject not initialized yet"); - return NULL; - } - lv_observer_t * observer = lv_ll_ins_tail(&(subject->subs_ll)); - LV_ASSERT_MALLOC(observer); - if(observer == NULL) return NULL; - - lv_memzero(observer, sizeof(*observer)); - - observer->subject = subject; - observer->cb = cb; - observer->user_data = user_data; - observer->target = target; - - /* update object immediately */ - if(observer->cb) observer->cb(observer, subject); - - return observer; -} - - -void lv_observer_remove(lv_observer_t * observer) -{ - LV_ASSERT_NULL(observer); - - observer->subject->notify_restart_query = 1; - - lv_ll_remove(&(observer->subject->subs_ll), observer); - - if(observer->auto_free_user_data) { - lv_free(observer->user_data); - } - lv_free(observer); -} - -void lv_obj_remove_from_subject(lv_obj_t * obj, lv_subject_t * subject) -{ - int32_t i; - int32_t event_cnt = (int32_t)(obj->spec_attr ? lv_array_size(&obj->spec_attr->event_list) : 0); - for(i = event_cnt - 1; i >= 0; i--) { - lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(obj, i); - if(event_dsc->cb == unsubscribe_on_delete_cb) { - lv_observer_t * observer = event_dsc->user_data; - if(subject == NULL || subject == observer->subject) { - lv_observer_remove(observer); - lv_obj_remove_event(obj, i); - } - } - } -} - -void * lv_observer_get_target(lv_observer_t * observer) -{ - LV_ASSERT_NULL(observer); - - return observer->target; -} - -void lv_subject_notify(lv_subject_t * subject) -{ - LV_ASSERT_NULL(subject); - - lv_observer_t * observer; - LV_LL_READ(&(subject->subs_ll), observer) { - observer->notified = 0; - } - - do { - subject->notify_restart_query = 0; - LV_LL_READ(&(subject->subs_ll), observer) { - if(observer->cb && observer->notified == 0) { - observer->cb(observer, subject); - if(subject->notify_restart_query) break; - observer->notified = 1; - } - } - } while(subject->notify_restart_query); -} - -lv_observer_t * lv_obj_bind_flag_if_eq(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value) -{ - lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_flag_observer_cb, flag, ref_value, false); - return observable; -} - -lv_observer_t * lv_obj_bind_flag_if_not_eq(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, - int32_t ref_value) -{ - lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_flag_observer_cb, flag, ref_value, true); - return observable; -} - -lv_observer_t * lv_obj_bind_state_if_eq(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value) -{ - lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_state_observer_cb, state, ref_value, false); - return observable; -} - -lv_observer_t * lv_obj_bind_state_if_not_eq(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value) -{ - lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_state_observer_cb, state, ref_value, true); - return observable; -} - -lv_observer_t * lv_obj_bind_checked(lv_obj_t * obj, lv_subject_t * subject) -{ - lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_state_observer_cb, LV_STATE_CHECKED, 1, false); - lv_obj_add_event_cb(obj, obj_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); - return observable; -} - -#if LV_USE_LABEL -lv_observer_t * lv_label_bind_text(lv_obj_t * obj, lv_subject_t * subject, const char * fmt) -{ - if(fmt == NULL) { - if(subject->type != LV_SUBJECT_TYPE_STRING && subject->type != LV_SUBJECT_TYPE_POINTER) { - LV_LOG_WARN("Incompatible subject type: %d", subject->type); - return NULL; - } - } - else { - if(subject->type != LV_SUBJECT_TYPE_STRING && subject->type != LV_SUBJECT_TYPE_POINTER && - subject->type != LV_SUBJECT_TYPE_INT) { - LV_LOG_WARN("Incompatible subject type: %d", subject->type); - return NULL; - } - } - - lv_observer_t * observer = lv_subject_add_observer_obj(subject, label_text_observer_cb, obj, (void *)fmt); - return observer; -} -#endif /*LV_USE_LABEL*/ - -#if LV_USE_ARC -lv_observer_t * lv_arc_bind_value(lv_obj_t * obj, lv_subject_t * subject) -{ - if(subject->type != LV_SUBJECT_TYPE_INT) { - LV_LOG_WARN("Incompatible subject type: %d", subject->type); - return NULL; - } - - lv_obj_add_event_cb(obj, arc_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); - - lv_observer_t * observer = lv_subject_add_observer_obj(subject, arc_value_observer_cb, obj, NULL); - return observer; -} -#endif /*LV_USE_ARC*/ - -#if LV_USE_SLIDER -lv_observer_t * lv_slider_bind_value(lv_obj_t * obj, lv_subject_t * subject) -{ - if(subject->type != LV_SUBJECT_TYPE_INT) { - LV_LOG_WARN("Incompatible subject type: %d", subject->type); - return NULL; - } - - lv_obj_add_event_cb(obj, slider_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); - - lv_observer_t * observer = lv_subject_add_observer_obj(subject, slider_value_observer_cb, obj, NULL); - return observer; -} -#endif /*LV_USE_SLIDER*/ - -#if LV_USE_ROLLER - -lv_observer_t * lv_roller_bind_value(lv_obj_t * obj, lv_subject_t * subject) -{ - if(subject->type != LV_SUBJECT_TYPE_INT) { - LV_LOG_WARN("Incompatible subject type: %d", subject->type); - return NULL; - } - - lv_obj_add_event_cb(obj, roller_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); - - lv_observer_t * observer = lv_subject_add_observer_obj(subject, roller_value_observer_cb, obj, NULL); - return observer; - -} -#endif /*LV_USE_ROLLER*/ - -#if LV_USE_DROPDOWN - -lv_observer_t * lv_dropdown_bind_value(lv_obj_t * obj, lv_subject_t * subject) -{ - if(subject->type != LV_SUBJECT_TYPE_INT) { - LV_LOG_WARN("Incompatible subject type: %d", subject->type); - return NULL; - } - - lv_obj_add_event_cb(obj, dropdown_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); - - lv_observer_t * observer = lv_subject_add_observer_obj(subject, dropdown_value_observer_cb, obj, NULL); - return observer; - -} - -#endif /*LV_USE_DROPDOWN*/ - -lv_obj_t * lv_observer_get_target_obj(lv_observer_t * observer) -{ - return (lv_obj_t *)lv_observer_get_target(observer); -} - -void * lv_observer_get_user_data(const lv_observer_t * observer) -{ - LV_ASSERT_NULL(observer); - - return observer->user_data; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void group_notify_cb(lv_observer_t * observer, lv_subject_t * subject) -{ - LV_UNUSED(subject); - lv_subject_t * subject_group = observer->user_data; - lv_subject_notify(subject_group); -} - -static void unsubscribe_on_delete_cb(lv_event_t * e) -{ - lv_observer_t * observer = lv_event_get_user_data(e); - lv_observer_remove(observer); -} - -static lv_observer_t * bind_to_bitfield(lv_subject_t * subject, lv_obj_t * obj, lv_observer_cb_t cb, uint32_t flag, - int32_t ref_value, bool inv) -{ - if(subject->type != LV_SUBJECT_TYPE_INT) { - LV_LOG_WARN("Incompatible subject type: %d", subject->type); - return NULL; - } - - flag_and_cond_t * p = lv_malloc(sizeof(flag_and_cond_t)); - if(p == NULL) { - LV_LOG_WARN("Out of memory"); - return NULL; - } - - p->flag = flag; - p->value.num = ref_value; - p->inv = inv; - - lv_observer_t * observable = lv_subject_add_observer_obj(subject, cb, obj, p); - observable->auto_free_user_data = 1; - return observable; -} - -static void obj_flag_observer_cb(lv_observer_t * observer, lv_subject_t * subject) -{ - flag_and_cond_t * p = observer->user_data; - - bool res = subject->value.num == p->value.num; - if(p->inv) res = !res; - - if(res) { - lv_obj_add_flag(observer->target, p->flag); - } - else { - lv_obj_remove_flag(observer->target, p->flag); - } -} - -static void obj_state_observer_cb(lv_observer_t * observer, lv_subject_t * subject) -{ - flag_and_cond_t * p = observer->user_data; - - bool res = subject->value.num == p->value.num; - if(p->inv) res = !res; - - if(res) { - lv_obj_add_state(observer->target, p->flag); - } - else { - lv_obj_remove_state(observer->target, p->flag); - } -} - -static void obj_value_changed_event_cb(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_subject_t * subject = lv_event_get_user_data(e); - - lv_subject_set_int(subject, lv_obj_has_state(obj, LV_STATE_CHECKED)); -} - -#if LV_USE_LABEL - -static void label_text_observer_cb(lv_observer_t * observer, lv_subject_t * subject) -{ - const char * fmt = observer->user_data; - - if(fmt == NULL) { - lv_label_set_text(observer->target, subject->value.pointer); - } - else { - switch(subject->type) { - case LV_SUBJECT_TYPE_INT: - lv_label_set_text_fmt(observer->target, fmt, subject->value.num); - break; - case LV_SUBJECT_TYPE_STRING: - case LV_SUBJECT_TYPE_POINTER: - lv_label_set_text_fmt(observer->target, fmt, subject->value.pointer); - break; - default: - break; - } - } -} - -#endif /*LV_USE_LABEL*/ - -#if LV_USE_ARC - -static void arc_value_changed_event_cb(lv_event_t * e) -{ - lv_obj_t * arc = lv_event_get_current_target(e); - lv_subject_t * subject = lv_event_get_user_data(e); - - lv_subject_set_int(subject, lv_arc_get_value(arc)); -} - -static void arc_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) -{ - lv_arc_set_value(observer->target, subject->value.num); -} - -#endif /*LV_USE_ARC*/ - -#if LV_USE_SLIDER - -static void slider_value_changed_event_cb(lv_event_t * e) -{ - lv_obj_t * slider = lv_event_get_current_target(e); - lv_subject_t * subject = lv_event_get_user_data(e); - - lv_subject_set_int(subject, lv_slider_get_value(slider)); -} - -static void slider_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) -{ - lv_slider_set_value(observer->target, subject->value.num, LV_ANIM_OFF); -} - -#endif /*LV_USE_SLIDER*/ - -#if LV_USE_ROLLER - -static void roller_value_changed_event_cb(lv_event_t * e) -{ - lv_obj_t * roller = lv_event_get_current_target(e); - lv_subject_t * subject = lv_event_get_user_data(e); - - lv_subject_set_int(subject, lv_roller_get_selected(roller)); -} - -static void roller_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) -{ - if((int32_t)lv_roller_get_selected(observer->target) != subject->value.num) { - lv_roller_set_selected(observer->target, subject->value.num, LV_ANIM_OFF); - } -} - -#endif /*LV_USE_ROLLER*/ - -#if LV_USE_DROPDOWN - -static void dropdown_value_changed_event_cb(lv_event_t * e) -{ - lv_obj_t * dropdown = lv_event_get_current_target(e); - lv_subject_t * subject = lv_event_get_user_data(e); - - lv_subject_set_int(subject, lv_dropdown_get_selected(dropdown)); -} - -static void dropdown_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) -{ - lv_dropdown_set_selected(observer->target, subject->value.num); -} - -#endif /*LV_USE_DROPDOWN*/ - -#endif /*LV_USE_OBSERVER*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/observer/lv_observer.h b/software/Power_Pico/Middlewares/LVGL/src/others/observer/lv_observer.h deleted file mode 100644 index cec77fe..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/observer/lv_observer.h +++ /dev/null @@ -1,406 +0,0 @@ -/** - * @file lv_observer.h - * - */ - -#ifndef LV_OBSERVER_H -#define LV_OBSERVER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj.h" -#if LV_USE_OBSERVER - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Values for lv_submect_t's `type` field. - */ -typedef enum { - LV_SUBJECT_TYPE_INVALID = 0, /**< indicates subject not initialized yet*/ - LV_SUBJECT_TYPE_NONE = 1, /**< a null value like None or NILt*/ - LV_SUBJECT_TYPE_INT = 2, /**< an int32_t*/ - LV_SUBJECT_TYPE_POINTER = 3, /**< a void pointer*/ - LV_SUBJECT_TYPE_COLOR = 4, /**< an lv_color_t*/ - LV_SUBJECT_TYPE_GROUP = 5, /**< an array of subjects*/ - LV_SUBJECT_TYPE_STRING = 6, /**< a char pointer*/ -} lv_subject_type_t; - -/** - * A common type to handle all the various observable types in the same way - */ -typedef union { - int32_t num; /**< Integer number (opacity, enums, booleans or "normal" numbers)*/ - const void * pointer; /**< Constant pointer (string buffer, format string, font, cone text, etc)*/ - lv_color_t color; /**< Color */ -} lv_subject_value_t; - -/** - * The subject (an observable value) - */ -typedef struct { - lv_ll_t subs_ll; /**< Subscribers*/ - uint32_t type : 4; - uint32_t size : 28; /**< Might be used to store a size related to `type`*/ - lv_subject_value_t value; /**< Actual value*/ - lv_subject_value_t prev_value; /**< Previous value*/ - uint32_t notify_restart_query : 1; /**< If an observer deleted start notifying from the beginning. */ - void * user_data; /**< Additional parameter, can be used freely by the user*/ -} lv_subject_t; - -/** - * Callback called when the observed value changes - * @param observer pointer to the observer of the callback - * @param subject pointer to the subject of the observer - */ -typedef void (*lv_observer_cb_t)(lv_observer_t * observer, lv_subject_t * subject); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize an integer type subject - * @param subject pointer to the subject - * @param value initial value - */ -void lv_subject_init_int(lv_subject_t * subject, int32_t value); - -/** - * Set the value of an integer subject. It will notify all the observers as well. - * @param subject pointer to the subject - * @param value the new value - */ -void lv_subject_set_int(lv_subject_t * subject, int32_t value); - -/** - * Get the current value of an integer subject - * @param subject pointer to the subject - * @return the current value - */ -int32_t lv_subject_get_int(lv_subject_t * subject); - -/** - * Get the previous value of an integer subject - * @param subject pointer to the subject - * @return the current value - */ -int32_t lv_subject_get_previous_int(lv_subject_t * subject); - -/** - * Initialize a string type subject - * @param subject pointer to the subject - * @param buf pointer to a buffer to store the string - * @param prev_buf pointer to a buffer to store the previous string, can be NULL if not used - * @param size size of the buffer - * @param value initial value as a string, e.g. "hello" - * @note the string subject stores the whole string, not only a pointer - */ -void lv_subject_init_string(lv_subject_t * subject, char * buf, char * prev_buf, size_t size, const char * value); - -/** - * Copy a string to a subject. It will notify all the observers as well. - * @param subject pointer to the subject - * @param buf the new string - */ -void lv_subject_copy_string(lv_subject_t * subject, const char * buf); - -/** - * Get the current value of an string subject - * @param subject pointer to the subject - * @return pointer to the buffer containing the current value - */ -const char * lv_subject_get_string(lv_subject_t * subject); - -/** - * Get the previous value of an string subject - * @param subject pointer to the subject - * @return pointer to the buffer containing the current value - * @note NULL will be returned if NULL was passed in `lv_subject_init_string()` - * as `prev_buf` - */ -const char * lv_subject_get_previous_string(lv_subject_t * subject); - -/** - * Initialize an pointer type subject - * @param subject pointer to the subject - * @param value initial value - */ -void lv_subject_init_pointer(lv_subject_t * subject, void * value); - -/** - * Set the value of a pointer subject. It will notify all the observers as well. - * @param subject pointer to the subject - * @param ptr new value - */ -void lv_subject_set_pointer(lv_subject_t * subject, void * ptr); - -/** - * Get the current value of a pointer subject - * @param subject pointer to the subject - * @return current value - */ -const void * lv_subject_get_pointer(lv_subject_t * subject); - -/** - * Get the previous value of a pointer subject - * @param subject pointer to the subject - * @return current value - */ -const void * lv_subject_get_previous_pointer(lv_subject_t * subject); - -/** - * Initialize an color type subject - * @param subject pointer to the subject - * @param color initial value - */ -void lv_subject_init_color(lv_subject_t * subject, lv_color_t color); - -/** - * Set the value of a color subject. It will notify all the observers as well. - * @param subject pointer to the subject - * @param color new value - */ -void lv_subject_set_color(lv_subject_t * subject, lv_color_t color); - -/** - * Get the current value of a color subject - * @param subject pointer to the subject - * @return current value - */ -lv_color_t lv_subject_get_color(lv_subject_t * subject); - -/** - * Get the previous value of a color subject - * @param subject pointer to the subject - * @return current value - */ -lv_color_t lv_subject_get_previous_color(lv_subject_t * subject); - -/** - * Initialize a subject group - * @param subject pointer to the subject - * @param list list of other subject addresses, any of these changes `subject` will be notified - * @param list_len number of elements in `list` - */ -void lv_subject_init_group(lv_subject_t * subject, lv_subject_t * list[], uint32_t list_len); - -/** - * Remove all the observers from a subject and free all allocated memories in it - * @param subject pointer to the subject - * @note objects added with `lv_subject_add_observer_obj` should be already deleted or - * removed manually. - */ -void lv_subject_deinit(lv_subject_t * subject); - -/** - * Get an element from the subject group's list - * @param subject pointer to the subject - * @param index index of the element to get - * @return pointer a subject from the list, or NULL if the index is out of bounds - */ -lv_subject_t * lv_subject_get_group_element(lv_subject_t * subject, int32_t index); - -/** - * Add an observer to a subject. When the subject changes `observer_cb` will be called. - * @param subject pointer to the subject - * @param observer_cb callback to call - * @param user_data optional user data - * @return pointer to the created observer - */ -lv_observer_t * lv_subject_add_observer(lv_subject_t * subject, lv_observer_cb_t observer_cb, void * user_data); - -/** - * Add an observer to a subject for an object. - * When the object is deleted, it will be removed from the subject automatically. - * @param subject pointer to the subject - * @param observer_cb callback to call - * @param obj pointer to an object - * @param user_data optional user data - * @return pointer to the created observer - */ -lv_observer_t * lv_subject_add_observer_obj(lv_subject_t * subject, lv_observer_cb_t observer_cb, lv_obj_t * obj, - void * user_data); - -/** - * Add an observer to a subject and also save a target. - * @param subject pointer to the subject - * @param observer_cb callback to call - * @param target pointer to any data - * @param user_data optional user data - * @return pointer to the created observer - */ -lv_observer_t * lv_subject_add_observer_with_target(lv_subject_t * subject, lv_observer_cb_t observer_cb, - void * target, void * user_data); - -/** - * Remove an observer from its subject - * @param observer pointer to an observer - */ -void lv_observer_remove(lv_observer_t * observer); - -/** - * Remove the observers of an object from a subject or all subjects - * @param obj the object whose observers should be removed - * @param subject the subject to remove the object from, or `NULL` to remove from all subjects - * @note This function can be used e.g. when an object's subject(s) needs to be replaced by other subject(s) - */ -void lv_obj_remove_from_subject(lv_obj_t * obj, lv_subject_t * subject); - -/** - * Get the target of an observer - * @param observer pointer to an observer - * @return pointer to the saved target - */ -void * lv_observer_get_target(lv_observer_t * observer); - -/** - * Get the target object of the observer. - * It's the same as `lv_observer_get_target` and added only - * for semantic reasons - * @param observer pointer to an observer - * @return pointer to the saved object target - */ -lv_obj_t * lv_observer_get_target_obj(lv_observer_t * observer); - -/** - * Get the user data of the observer. - * @param observer pointer to an observer - * @return void pointer to the saved user data -*/ -void * lv_observer_get_user_data(const lv_observer_t * observer); - -/** - * Notify all observers of subject - * @param subject pointer to a subject - */ -void lv_subject_notify(lv_subject_t * subject); - -/** - * Set an object flag if an integer subject's value is equal to a reference value, clear the flag otherwise - * @param obj pointer to an object - * @param subject pointer to a subject - * @param flag flag to set or clear (e.g. `LV_OBJ_FLAG_HIDDEN`) - * @param ref_value reference value to compare the subject's value with - * @return pointer to the created observer - */ -lv_observer_t * lv_obj_bind_flag_if_eq(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value); - -/** - * Set an object flag if an integer subject's value is not equal to a reference value, clear the flag otherwise - * @param obj pointer to an object - * @param subject pointer to a subject - * @param flag flag to set or clear (e.g. `LV_OBJ_FLAG_HIDDEN`) - * @param ref_value reference value to compare the subject's value with - * @return pointer to the created observer - */ -lv_observer_t * lv_obj_bind_flag_if_not_eq(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, - int32_t ref_value); - -/** - * Set an object state if an integer subject's value is equal to a reference value, clear the flag otherwise - * @param obj pointer to an object - * @param subject pointer to a subject - * @param state state to set or clear (e.g. `LV_STATE_CHECKED`) - * @param ref_value reference value to compare the subject's value with - * @return pointer to the created observer - */ -lv_observer_t * lv_obj_bind_state_if_eq(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value); - -/** - * Set an object state if an integer subject's value is not equal to a reference value, clear the flag otherwise - * @param obj pointer to an object - * @param subject pointer to a subject - * @param state state to set or clear (e.g. `LV_STATE_CHECKED`) - * @param ref_value reference value to compare the subject's value with - * @return pointer to the created observer - */ -lv_observer_t * lv_obj_bind_state_if_not_eq(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, - int32_t ref_value); - -/** - * Set an integer subject to 1 when an object is checked and set it 0 when unchecked. - * @param obj pointer to an object - * @param subject pointer to a subject - * @return pointer to the created observer - * @note Ensure the object's `LV_OBJ_FLAG_CHECKABLE` flag is set - */ -lv_observer_t * lv_obj_bind_checked(lv_obj_t * obj, lv_subject_t * subject); - -#if LV_USE_LABEL -/** - * Bind an integer, string, or pointer subject to a label. - * @param obj pointer to a label - * @param subject pointer to a subject - * @param fmt optional format string with 1 format specifier (e.g. "%d °C") - * or NULL to bind the value directly. - * @return pointer to the created observer - * @note fmt == NULL can be used only with string and pointer subjects. - * @note if the subject is a pointer must point to a `\0` terminated string. - */ -lv_observer_t * lv_label_bind_text(lv_obj_t * obj, lv_subject_t * subject, const char * fmt); -#endif - -#if LV_USE_ARC -/** - * Bind an integer subject to an arc's value - * @param obj pointer to an arc - * @param subject pointer to a subject - * @return pointer to the created observer - */ -lv_observer_t * lv_arc_bind_value(lv_obj_t * obj, lv_subject_t * subject); -#endif - -#if LV_USE_SLIDER -/** - * Bind an integer subject to a slider's value - * @param obj pointer to a slider - * @param subject pointer to a subject - * @return pointer to the created observer - */ -lv_observer_t * lv_slider_bind_value(lv_obj_t * obj, lv_subject_t * subject); -#endif - -#if LV_USE_ROLLER -/** - * Bind an integer subject to a roller's value - * @param obj pointer to a roller - * @param subject pointer to a subject - * @return pointer to the created observer - */ -lv_observer_t * lv_roller_bind_value(lv_obj_t * obj, lv_subject_t * subject); -#endif - -#if LV_USE_DROPDOWN -/** - * Bind an integer subject to a dropdown's value - * @param obj pointer to a drop down - * @param subject pointer to a subject - * @return pointer to the created observer - */ -lv_observer_t * lv_dropdown_bind_value(lv_obj_t * obj, lv_subject_t * subject); -#endif - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_OBSERVER*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBSERVER_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/observer/lv_observer_private.h b/software/Power_Pico/Middlewares/LVGL/src/others/observer/lv_observer_private.h deleted file mode 100644 index 04a7992..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/observer/lv_observer_private.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @file lv_observer_private.h - * - */ - -#ifndef LV_OBSERVER_PRIVATE_H -#define LV_OBSERVER_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_observer.h" - -#if LV_USE_OBSERVER - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * The observer object: a descriptor returned when subscribing LVGL widgets to subjects - */ -struct lv_observer_t { - lv_subject_t * subject; /**< The observed value */ - lv_observer_cb_t cb; /**< Callback that should be called when the value changes*/ - void * target; /**< A target for the observer, e.g. a widget or style*/ - void * user_data; /**< Additional parameter supplied when subscribing*/ - uint32_t auto_free_user_data : 1; /**< Automatically free user data when the observer is removed */ - uint32_t notified : 1; /**< Mark if this observer was already notified*/ - uint32_t for_obj : 1; /**< `target` is an `lv_obj_t *`*/ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_OBSERVER */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_OBSERVER_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/snapshot/lv_snapshot.c b/software/Power_Pico/Middlewares/LVGL/src/others/snapshot/lv_snapshot.c deleted file mode 100644 index f3f182b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/snapshot/lv_snapshot.c +++ /dev/null @@ -1,178 +0,0 @@ -/** - * @file lv_snapshot.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../draw/lv_draw_private.h" -#include "../../core/lv_obj_draw_private.h" -#include "lv_snapshot.h" -#if LV_USE_SNAPSHOT - -#include -#include "../../display/lv_display.h" -#include "../../core/lv_refr_private.h" -#include "../../display/lv_display_private.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a draw buffer for object to store the snapshot image. - */ -lv_draw_buf_t * lv_snapshot_create_draw_buf(lv_obj_t * obj, lv_color_format_t cf) -{ - lv_obj_update_layout(obj); - int32_t w = lv_obj_get_width(obj); - int32_t h = lv_obj_get_height(obj); - int32_t ext_size = lv_obj_get_ext_draw_size(obj); - w += ext_size * 2; - h += ext_size * 2; - if(w == 0 || h == 0) return NULL; - - return lv_draw_buf_create(w, h, cf, LV_STRIDE_AUTO); -} - -lv_result_t lv_snapshot_reshape_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf) -{ - lv_obj_update_layout(obj); - int32_t w = lv_obj_get_width(obj); - int32_t h = lv_obj_get_height(obj); - int32_t ext_size = lv_obj_get_ext_draw_size(obj); - w += ext_size * 2; - h += ext_size * 2; - if(w == 0 || h == 0) return LV_RESULT_INVALID; - - draw_buf = lv_draw_buf_reshape(draw_buf, LV_COLOR_FORMAT_UNKNOWN, w, h, LV_STRIDE_AUTO); - return draw_buf == NULL ? LV_RESULT_INVALID : LV_RESULT_OK; -} - -lv_result_t lv_snapshot_take_to_draw_buf(lv_obj_t * obj, lv_color_format_t cf, lv_draw_buf_t * draw_buf) -{ - LV_ASSERT_NULL(obj); - LV_ASSERT_NULL(draw_buf); - lv_result_t res; - - switch(cf) { - case LV_COLOR_FORMAT_RGB565: - case LV_COLOR_FORMAT_RGB888: - case LV_COLOR_FORMAT_XRGB8888: - case LV_COLOR_FORMAT_ARGB8888: - case LV_COLOR_FORMAT_L8: - case LV_COLOR_FORMAT_I1: - break; - default: - LV_LOG_WARN("Not supported color format"); - return LV_RESULT_INVALID; - } - - res = lv_snapshot_reshape_draw_buf(obj, draw_buf); - if(res != LV_RESULT_OK) return res; - - /* clear draw buffer*/ - lv_draw_buf_clear(draw_buf, NULL); - - lv_area_t snapshot_area; - int32_t w = draw_buf->header.w; - int32_t h = draw_buf->header.h; - int32_t ext_size = lv_obj_get_ext_draw_size(obj); - lv_obj_get_coords(obj, &snapshot_area); - lv_area_increase(&snapshot_area, ext_size, ext_size); - - lv_layer_t layer; - lv_memzero(&layer, sizeof(layer)); - - layer.draw_buf = draw_buf; - layer.buf_area.x1 = snapshot_area.x1; - layer.buf_area.y1 = snapshot_area.y1; - layer.buf_area.x2 = snapshot_area.x1 + w - 1; - layer.buf_area.y2 = snapshot_area.y1 + h - 1; - layer.color_format = cf; - layer._clip_area = snapshot_area; - layer.phy_clip_area = snapshot_area; -#if LV_DRAW_TRANSFORM_USE_MATRIX - lv_matrix_identity(&layer.matrix); -#endif - - lv_display_t * disp_old = lv_refr_get_disp_refreshing(); - lv_display_t * disp_new = lv_obj_get_display(obj); - lv_layer_t * layer_old = disp_new->layer_head; - disp_new->layer_head = &layer; - - lv_refr_set_disp_refreshing(disp_new); - lv_obj_redraw(&layer, obj); - - while(layer.draw_task_head) { - lv_draw_dispatch_wait_for_request(); - lv_draw_dispatch(); - } - - disp_new->layer_head = layer_old; - lv_refr_set_disp_refreshing(disp_old); - - return LV_RESULT_OK; -} - -lv_draw_buf_t * lv_snapshot_take(lv_obj_t * obj, lv_color_format_t cf) -{ - LV_ASSERT_NULL(obj); - lv_draw_buf_t * draw_buf = lv_snapshot_create_draw_buf(obj, cf); - if(draw_buf == NULL) return NULL; - - if(lv_snapshot_take_to_draw_buf(obj, cf, draw_buf) != LV_RESULT_OK) { - lv_draw_buf_destroy(draw_buf); - return NULL; - } - - return draw_buf; -} - -void lv_snapshot_free(lv_image_dsc_t * dsc) -{ - LV_LOG_WARN("Deprecated API, use lv_draw_buf_destroy directly."); - lv_draw_buf_destroy((lv_draw_buf_t *)dsc); -} - -lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, - void * buf, - uint32_t buf_size) -{ - lv_draw_buf_t draw_buf; - LV_LOG_WARN("Deprecated API, use lv_snapshot_take_to_draw_buf instead."); - lv_draw_buf_init(&draw_buf, 1, 1, cf, buf_size, buf, buf_size); - lv_result_t res = lv_snapshot_take_to_draw_buf(obj, cf, &draw_buf); - if(res == LV_RESULT_OK) { - lv_memcpy((void *)dsc, &draw_buf, sizeof(lv_image_dsc_t)); - } - return res; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_SNAPSHOT*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/snapshot/lv_snapshot.h b/software/Power_Pico/Middlewares/LVGL/src/others/snapshot/lv_snapshot.h deleted file mode 100644 index 90de106..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/snapshot/lv_snapshot.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * @file lv_snapshot.h - * - */ - -#ifndef LV_SNAPSHOT_H -#define LV_SNAPSHOT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" - -#if LV_USE_SNAPSHOT - -#include -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Take snapshot for object with its children, create the draw buffer as needed. - * @param obj the object to generate snapshot. - * @param cf color format for generated image. - * @return a pointer to an draw buffer containing snapshot image, or NULL if failed. - */ -lv_draw_buf_t * lv_snapshot_take(lv_obj_t * obj, lv_color_format_t cf); - -/** - * Create a draw buffer to store the snapshot image for object. - * @param obj the object to generate snapshot. - * @param cf color format for generated image. - * @return a pointer to an draw buffer ready for taking snapshot, or NULL if failed. - */ -lv_draw_buf_t * lv_snapshot_create_draw_buf(lv_obj_t * obj, lv_color_format_t cf); - -/** - * Reshape the draw buffer to prepare for taking snapshot for obj. - * This is usually used to check if the existing draw buffer is enough for - * obj snapshot. If return LV_RESULT_INVALID, you should create a new one. - * @param draw_buf the draw buffer to reshape. - * @param obj the object to generate snapshot. - */ -lv_result_t lv_snapshot_reshape_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf); - -/** - * Take snapshot for object with its children, save image info to provided buffer. - * @param obj the object to generate snapshot. - * @param cf color format for new snapshot image. - * It could differ with cf of `draw_buf` as long as the new cf will fit in. - * @param draw_buf the draw buffer to store the image result. It's reshaped automatically. - * @return LV_RESULT_OK on success, LV_RESULT_INVALID on error. - */ -lv_result_t lv_snapshot_take_to_draw_buf(lv_obj_t * obj, lv_color_format_t cf, lv_draw_buf_t * draw_buf); - -/** - * @deprecated Use `lv_draw_buf_destroy` instead. - * - * Free the snapshot image returned by @ref lv_snapshot_take - * @param dsc the image descriptor generated by lv_snapshot_take. - */ -void lv_snapshot_free(lv_image_dsc_t * dsc); - -/** - * Take snapshot for object with its children, save image info to provided buffer. - * @param obj the object to generate snapshot. - * @param cf color format for generated image. - * @param dsc image descriptor to store the image result. - * @param buf the buffer to store image data. It must meet align requirement. - * @param buf_size provided buffer size in bytes. - * @return LV_RESULT_OK on success, LV_RESULT_INVALID on error. - * @deprecated Use lv_snapshot_take_to_draw_buf instead. - */ -lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, - void * buf, - uint32_t buf_size); - -/********************** - * MACROS - **********************/ -#endif /*LV_USE_SNAPSHOT*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/sysmon/lv_sysmon.c b/software/Power_Pico/Middlewares/LVGL/src/others/sysmon/lv_sysmon.c deleted file mode 100644 index 803ce8c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/sysmon/lv_sysmon.c +++ /dev/null @@ -1,335 +0,0 @@ -/** - * @file lv_sysmon.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_sysmon_private.h" -#include "../../misc/lv_timer_private.h" - -#if LV_USE_SYSMON - -#include "../../core/lv_global.h" -#include "../../misc/lv_async.h" -#include "../../stdlib/lv_string.h" -#include "../../widgets/label/lv_label.h" -#include "../../display/lv_display_private.h" - -/********************* - * DEFINES - *********************/ -#ifndef LV_SYSMON_REFR_PERIOD_DEF - #define LV_SYSMON_REFR_PERIOD_DEF 300 /* ms */ -#endif - -#if LV_USE_MEM_MONITOR - #define sysmon_mem LV_GLOBAL_DEFAULT()->sysmon_mem -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -#if LV_USE_PERF_MONITOR - static void perf_update_timer_cb(lv_timer_t * t); - static void perf_observer_cb(lv_observer_t * observer, lv_subject_t * subject); - static void perf_monitor_disp_event_cb(lv_event_t * e); -#endif - -#if LV_USE_MEM_MONITOR - static void mem_update_timer_cb(lv_timer_t * t); - static void mem_observer_cb(lv_observer_t * observer, lv_subject_t * subject); -#endif - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_sysmon_builtin_init(void) -{ - -#if LV_USE_MEM_MONITOR - static lv_mem_monitor_t mem_info; - lv_subject_init_pointer(&sysmon_mem.subject, &mem_info); - sysmon_mem.timer = lv_timer_create(mem_update_timer_cb, LV_SYSMON_REFR_PERIOD_DEF, &mem_info); -#endif -} - -void lv_sysmon_builtin_deinit(void) -{ -#if LV_USE_MEM_MONITOR - lv_timer_delete(sysmon_mem.timer); -#endif -} - -lv_obj_t * lv_sysmon_create(lv_display_t * disp) -{ - LV_LOG_INFO("begin"); - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) { - LV_LOG_WARN("There is no default display"); - return NULL; - } - - lv_obj_t * label = lv_label_create(lv_display_get_layer_sys(disp)); - lv_obj_set_style_bg_opa(label, LV_OPA_50, 0); - lv_obj_set_style_bg_color(label, lv_color_black(), 0); - lv_obj_set_style_text_color(label, lv_color_white(), 0); - lv_obj_set_style_pad_all(label, 3, 0); - lv_label_set_text(label, "?"); - return label; -} - -#if LV_USE_PERF_MONITOR - -void lv_sysmon_show_performance(lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) { - LV_LOG_WARN("There is no default display"); - return; - } - - disp->perf_label = lv_sysmon_create(disp); - if(disp->perf_label == NULL) { - LV_LOG_WARN("Couldn't create sysmon"); - return; - } - - lv_subject_init_pointer(&disp->perf_sysmon_backend.subject, &disp->perf_sysmon_info); - lv_obj_align(disp->perf_label, LV_USE_PERF_MONITOR_POS, 0, 0); - lv_subject_add_observer_obj(&disp->perf_sysmon_backend.subject, perf_observer_cb, disp->perf_label, NULL); - disp->perf_sysmon_backend.timer = lv_timer_create(perf_update_timer_cb, LV_SYSMON_REFR_PERIOD_DEF, disp); - lv_display_add_event_cb(disp, perf_monitor_disp_event_cb, LV_EVENT_ALL, NULL); - -#if LV_USE_PERF_MONITOR_LOG_MODE - lv_obj_add_flag(disp->perf_label, LV_OBJ_FLAG_HIDDEN); -#else - lv_obj_remove_flag(disp->perf_label, LV_OBJ_FLAG_HIDDEN); -#endif -} - -void lv_sysmon_hide_performance(lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) { - LV_LOG_WARN("There is no default display"); - return; - } - - lv_obj_add_flag(disp->perf_label, LV_OBJ_FLAG_HIDDEN); -} - -#endif - -#if LV_USE_MEM_MONITOR - -void lv_sysmon_show_memory(lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) { - LV_LOG_WARN("There is no default display"); - return; - } - - disp->mem_label = lv_sysmon_create(disp); - if(disp->mem_label == NULL) { - LV_LOG_WARN("Couldn't create sysmon"); - return; - } - - lv_obj_align(disp->mem_label, LV_USE_MEM_MONITOR_POS, 0, 0); - lv_subject_add_observer_obj(&sysmon_mem.subject, mem_observer_cb, disp->mem_label, NULL); - - lv_obj_remove_flag(disp->mem_label, LV_OBJ_FLAG_HIDDEN); -} - -void lv_sysmon_hide_memory(lv_display_t * disp) -{ - if(disp == NULL) disp = lv_display_get_default(); - if(disp == NULL) { - LV_LOG_WARN("There is no default display"); - return; - } - - lv_obj_add_flag(disp->mem_label, LV_OBJ_FLAG_HIDDEN); -} - -#endif - -/********************** - * STATIC FUNCTIONS - **********************/ - -#if LV_USE_PERF_MONITOR - -static void perf_monitor_disp_event_cb(lv_event_t * e) -{ - lv_display_t * disp = lv_event_get_target(e); - lv_event_code_t code = lv_event_get_code(e); - lv_sysmon_perf_info_t * info = &disp->perf_sysmon_info; - - switch(code) { - case LV_EVENT_REFR_START: - info->measured.refr_interval_sum += lv_tick_elaps(info->measured.refr_start); - info->measured.refr_start = lv_tick_get(); - break; - case LV_EVENT_REFR_READY: - info->measured.refr_elaps_sum += lv_tick_elaps(info->measured.refr_start); - info->measured.refr_cnt++; - break; - case LV_EVENT_RENDER_START: - info->measured.render_in_progress = 1; - info->measured.render_start = lv_tick_get(); - break; - case LV_EVENT_RENDER_READY: - info->measured.render_in_progress = 0; - info->measured.render_elaps_sum += lv_tick_elaps(info->measured.render_start); - info->measured.render_cnt++; - break; - case LV_EVENT_FLUSH_START: - case LV_EVENT_FLUSH_WAIT_START: - if(info->measured.render_in_progress) { - info->measured.flush_in_render_start = lv_tick_get(); - } - else { - info->measured.flush_not_in_render_start = lv_tick_get(); - } - break; - case LV_EVENT_FLUSH_FINISH: - case LV_EVENT_FLUSH_WAIT_FINISH: - if(info->measured.render_in_progress) { - info->measured.flush_in_render_elaps_sum += lv_tick_elaps(info->measured.flush_in_render_start); - } - else { - info->measured.flush_not_in_render_elaps_sum += lv_tick_elaps(info->measured.flush_not_in_render_start); - } - break; - case LV_EVENT_DELETE: - lv_timer_delete(disp->perf_sysmon_backend.timer); - lv_subject_deinit(&disp->perf_sysmon_backend.subject); - break; - default: - break; - } -} - -static void perf_update_timer_cb(lv_timer_t * t) -{ - lv_display_t * disp = lv_timer_get_user_data(t); - - uint32_t LV_SYSMON_GET_IDLE(void); - - lv_sysmon_perf_info_t * info = &disp->perf_sysmon_info; - info->calculated.run_cnt++; - - uint32_t time_since_last_report = lv_tick_elaps(info->measured.last_report_timestamp); - lv_timer_t * disp_refr_timer = lv_display_get_refr_timer(NULL); - uint32_t disp_refr_period = disp_refr_timer->period; - - info->calculated.fps = info->measured.refr_interval_sum ? (1000 * info->measured.refr_cnt / time_since_last_report) : 0; - info->calculated.fps = LV_MIN(info->calculated.fps, - 1000 / disp_refr_period); /*Limit due to possible off-by-one error*/ - - info->calculated.cpu = 100 - LV_SYSMON_GET_IDLE(); - info->calculated.refr_avg_time = info->measured.refr_cnt ? (info->measured.refr_elaps_sum / info->measured.refr_cnt) : - 0; - - info->calculated.flush_avg_time = info->measured.render_cnt ? - ((info->measured.flush_in_render_elaps_sum + info->measured.flush_not_in_render_elaps_sum) - / info->measured.render_cnt) : 0; - /*Flush time was measured in rendering time so subtract it*/ - info->calculated.render_avg_time = info->measured.render_cnt ? ((info->measured.render_elaps_sum - - info->measured.flush_in_render_elaps_sum) / - info->measured.render_cnt) : 0; - - info->calculated.cpu_avg_total = ((info->calculated.cpu_avg_total * (info->calculated.run_cnt - 1)) + - info->calculated.cpu) / info->calculated.run_cnt; - info->calculated.fps_avg_total = ((info->calculated.fps_avg_total * (info->calculated.run_cnt - 1)) + - info->calculated.fps) / info->calculated.run_cnt; - - lv_subject_set_pointer(&disp->perf_sysmon_backend.subject, info); - - lv_sysmon_perf_info_t prev_info = *info; - lv_memzero(info, sizeof(lv_sysmon_perf_info_t)); - info->measured.refr_start = prev_info.measured.refr_start; - info->calculated.cpu_avg_total = prev_info.calculated.cpu_avg_total; - info->calculated.fps_avg_total = prev_info.calculated.fps_avg_total; - info->calculated.run_cnt = prev_info.calculated.run_cnt; - - info->measured.last_report_timestamp = lv_tick_get(); -} - -static void perf_observer_cb(lv_observer_t * observer, lv_subject_t * subject) -{ - const lv_sysmon_perf_info_t * perf = lv_subject_get_pointer(subject); - -#if LV_USE_PERF_MONITOR_LOG_MODE - LV_UNUSED(observer); - LV_LOG("sysmon: " - "%" LV_PRIu32 " FPS (refr_cnt: %" LV_PRIu32 " | redraw_cnt: %" LV_PRIu32"), " - "refr %" LV_PRIu32 "ms (render %" LV_PRIu32 "ms | flush %" LV_PRIu32 "ms), " - "CPU %" LV_PRIu32 "%%\n", - perf->calculated.fps, perf->measured.refr_cnt, perf->measured.render_cnt, - perf->calculated.refr_avg_time, perf->calculated.render_avg_time, perf->calculated.flush_avg_time, - perf->calculated.cpu); -#else - lv_obj_t * label = lv_observer_get_target(observer); - lv_label_set_text_fmt( - label, - "%" LV_PRIu32" FPS, %" LV_PRIu32 "%% CPU\n" - "%" LV_PRIu32" ms (%" LV_PRIu32" | %" LV_PRIu32")", - perf->calculated.fps, perf->calculated.cpu, - perf->calculated.render_avg_time + perf->calculated.flush_avg_time, - perf->calculated.render_avg_time, perf->calculated.flush_avg_time - ); -#endif /*LV_USE_PERF_MONITOR_LOG_MODE*/ -} - -#endif - -#if LV_USE_MEM_MONITOR - -static void mem_update_timer_cb(lv_timer_t * t) -{ - lv_mem_monitor_t * mem_mon = lv_timer_get_user_data(t); - lv_mem_monitor(mem_mon); - lv_subject_set_pointer(&sysmon_mem.subject, mem_mon); -} - -static void mem_observer_cb(lv_observer_t * observer, lv_subject_t * subject) -{ - lv_obj_t * label = lv_observer_get_target(observer); - const lv_mem_monitor_t * mon = lv_subject_get_pointer(subject); - - size_t used_size = mon->total_size - mon->free_size;; - size_t used_kb = used_size / 1024; - size_t used_kb_tenth = (used_size - (used_kb * 1024)) / 102; - size_t max_used_kb = mon->max_used / 1024; - size_t max_used_kb_tenth = (mon->max_used - (max_used_kb * 1024)) / 102; - lv_label_set_text_fmt(label, - "%zu.%zu kB (%d%%)\n" - "%zu.%zu kB max, %d%% frag.", - used_kb, used_kb_tenth, mon->used_pct, - max_used_kb, max_used_kb_tenth, - mon->frag_pct); -} - -#endif - -#endif /*LV_USE_SYSMON*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/sysmon/lv_sysmon.h b/software/Power_Pico/Middlewares/LVGL/src/others/sysmon/lv_sysmon.h deleted file mode 100644 index 0859c06..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/sysmon/lv_sysmon.h +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @file lv_sysmon.h - * - */ - -#ifndef LV_SYSMON_H -#define LV_SYSMON_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../misc/lv_timer.h" -#include "../../others/observer/lv_observer.h" - -#if LV_USE_SYSMON - -#if LV_USE_LABEL == 0 -#error "lv_sysmon: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " -#endif - -#if LV_USE_OBSERVER == 0 -#error "lv_observer: lv_observer is required. Enable it in lv_conf.h (LV_USE_OBSERVER 1) " -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a new system monitor label - * @param disp create the sys. mon. on this display's system layer - * @return the create label - */ -lv_obj_t * lv_sysmon_create(lv_display_t * disp); - -#if LV_USE_PERF_MONITOR - -/** - * Show system performance monitor: CPU usage and FPS count - * @param disp target display, NULL: use the default displays - */ -void lv_sysmon_show_performance(lv_display_t * disp); - -/** - * Hide system performance monitor - * @param disp target display, NULL: use the default - */ -void lv_sysmon_hide_performance(lv_display_t * disp); - -#endif /*LV_USE_PERF_MONITOR*/ - -#if LV_USE_MEM_MONITOR - -/** - * Show system memory monitor: used memory and the memory fragmentation - * @param disp target display, NULL: use the default displays - */ -void lv_sysmon_show_memory(lv_display_t * disp); - -/** - * Hide system memory monitor - * @param disp target display, NULL: use the default displays - */ -void lv_sysmon_hide_memory(lv_display_t * disp); - -#endif /*LV_USE_MEM_MONITOR*/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_SYSMON*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_SYSMON_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/sysmon/lv_sysmon_private.h b/software/Power_Pico/Middlewares/LVGL/src/others/sysmon/lv_sysmon_private.h deleted file mode 100644 index 08d6156..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/sysmon/lv_sysmon_private.h +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @file lv_sysmon_private.h - * - */ - -#ifndef LV_SYSMON_PRIVATE_H -#define LV_SYSMON_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_sysmon.h" - -#if LV_USE_SYSMON - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_sysmon_backend_data_t { - lv_subject_t subject; - lv_timer_t * timer; -}; - -#if LV_USE_PERF_MONITOR -struct lv_sysmon_perf_info_t { - struct { - bool inited; - uint32_t refr_start; - uint32_t refr_interval_sum; - uint32_t refr_elaps_sum; - uint32_t refr_cnt; - uint32_t render_start; - uint32_t render_elaps_sum; /*Contains the flush time too*/ - uint32_t render_cnt; - uint32_t flush_in_render_start; - uint32_t flush_in_render_elaps_sum; - uint32_t flush_not_in_render_start; - uint32_t flush_not_in_render_elaps_sum; - uint32_t last_report_timestamp; - uint32_t render_in_progress : 1; - } measured; - - struct { - uint32_t fps; - uint32_t cpu; - uint32_t refr_avg_time; - uint32_t render_avg_time; /**< Pure rendering time without flush time*/ - uint32_t flush_avg_time; /**< Pure flushing time without rendering time*/ - uint32_t cpu_avg_total; - uint32_t fps_avg_total; - uint32_t run_cnt; - } calculated; - -}; -#endif - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize built-in system monitor, such as performance and memory monitor. - */ -void lv_sysmon_builtin_init(void); - -/** - * DeInitialize built-in system monitor, such as performance and memory monitor. - */ -void lv_sysmon_builtin_deinit(void); - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_SYSMON */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_SYSMON_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/vg_lite_tvg/vg_lite.h b/software/Power_Pico/Middlewares/LVGL/src/others/vg_lite_tvg/vg_lite.h deleted file mode 100644 index abbd6e8..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/vg_lite_tvg/vg_lite.h +++ /dev/null @@ -1,1387 +0,0 @@ -/**************************************************************************** -* -* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. -* All Rights Reserved. -* -* 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, sub license, 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 (including the -* next paragraph) 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 NON-INFRINGEMENT. -* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS 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 _vg_lite_h_ -#define _vg_lite_h_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * causes MSVC error C1189. - * Not needed because "The __inline keyword is equivalent to inline." - * See: https://learn.microsoft.com/en-us/cpp/cpp/inline-functions-cpp?view=msvc-170 -*/ -/* -#if defined(_MSC_VER) -#define inline __inline -#endif -*/ - -#include -#include - - -/* VGLite API Constants *******************************************************************************************************************/ - -#define VGLITE_HEADER_VERSION 7 - -#ifndef VGLITE_VERSION_3_0 -#define VGLITE_VERSION_3_0 1 - -#define VGLITE_MAKE_VERSION(major, minor, patch) (((major) << 16) | ((minor) << 8) | (patch)) -#define VGLITE_VERSION_MAJOR(version) (((uint32_t)(version) >> 16) & 0xff) -#define VGLITE_VERSION_MINOR(version) (((uint32_t)(version) >> 8) & 0xff) -#define VGLITE_VERSION_PATCH(version) ((uint32_t)(version) & 0xff) - -#define VGLITE_API_VERSION_3_0 VGLITE_MAKE_VERSION(3, 0, 0) - -#define VGLITE_RELEASE_VERSION VGLITE_MAKE_VERSION(4,0,47) - -#define VGL_FALSE 0 -#define VGL_TRUE 1 - -/* Path command (op code). */ -#define VLC_OP_END 0x00 -#define VLC_OP_CLOSE 0x01 -#define VLC_OP_MOVE 0x02 -#define VLC_OP_MOVE_REL 0x03 -#define VLC_OP_LINE 0x04 -#define VLC_OP_LINE_REL 0x05 -#define VLC_OP_QUAD 0x06 -#define VLC_OP_QUAD_REL 0x07 -#define VLC_OP_CUBIC 0x08 -#define VLC_OP_CUBIC_REL 0x09 -#define VLC_OP_BREAK 0x0A -#define VLC_OP_HLINE 0x0B -#define VLC_OP_HLINE_REL 0x0C -#define VLC_OP_VLINE 0x0D -#define VLC_OP_VLINE_REL 0x0E -#define VLC_OP_SQUAD 0x0F -#define VLC_OP_SQUAD_REL 0x10 -#define VLC_OP_SCUBIC 0x11 -#define VLC_OP_SCUBIC_REL 0x12 -#define VLC_OP_SCCWARC 0x13 -#define VLC_OP_SCCWARC_REL 0x14 -#define VLC_OP_SCWARC 0x15 -#define VLC_OP_SCWARC_REL 0x16 -#define VLC_OP_LCCWARC 0x17 -#define VLC_OP_LCCWARC_REL 0x18 -#define VLC_OP_LCWARC 0x19 -#define VLC_OP_LCWARC_REL 0x1A - -/* Macros for path manipulating: See path definitions. */ -#define VLM_PATH_ENABLE_UPLOAD(path) (path).uploaded.property |= 1 -#define VLM_PATH_DISABLE_UPLOAD(path) (path).uploaded.property &= (~1) -#define VLM_PATH_GET_UPLOAD_BIT(path) ((path).uploaded.property & 1) - -/* Gradient constants. */ -#define VLC_MAX_COLOR_RAMP_STOPS 256 /*! The max number of radial gradient stops. */ -#define VLC_MAX_GRADIENT_STOPS 16 /*! The max number of gradient stops. */ -#define VLC_GRADIENT_BUFFER_WIDTH 1024 /*! The internal gradient buffer width.*/ - - -/* API name defines for backward compatibility to VGLite 2.0 APIs */ -#define vg_lite_buffer_upload vg_lite_upload_buffer -#define vg_lite_path_append vg_lite_append_path -#define vg_lite_path_calc_length vg_lite_get_path_length -#define vg_lite_set_ts_buffer vg_lite_set_tess_buffer -#define vg_lite_set_draw_path_type vg_lite_set_path_type -#define vg_lite_create_mask_layer vg_lite_create_masklayer -#define vg_lite_fill_mask_layer vg_lite_fill_masklayer -#define vg_lite_blend_mask_layer vg_lite_blend_masklayer -#define vg_lite_generate_mask_layer_by_path vg_lite_render_masklayer -#define vg_lite_set_mask_layer vg_lite_set_masklayer -#define vg_lite_destroy_mask_layer vg_lite_destroy_masklayer -#define vg_lite_enable_mask vg_lite_enable_masklayer -#define vg_lite_enable_color_transformation vg_lite_enable_color_transform -#define vg_lite_set_color_transformation vg_lite_set_color_transform -#define vg_lite_set_image_global_alpha vg_lite_source_global_alpha -#define vg_lite_set_dest_global_alpha vg_lite_dest_global_alpha -#define vg_lite_clear_rad_grad vg_lite_clear_radial_grad -#define vg_lite_update_rad_grad vg_lite_update_radial_grad -#define vg_lite_get_rad_grad_matrix vg_lite_get_radial_grad_matrix -#define vg_lite_set_rad_grad vg_lite_set_radial_grad -#define vg_lite_draw_linear_gradient vg_lite_draw_linear_grad -#define vg_lite_draw_radial_gradient vg_lite_draw_radial_grad -#define vg_lite_draw_gradient vg_lite_draw_grad -#define vg_lite_mem_avail vg_lite_get_mem_size -#define vg_lite_set_update_stroke vg_lite_update_stroke - -#define vg_lite_buffer_image_mode_t vg_lite_image_mode_t -#define vg_lite_draw_path_type_t vg_lite_path_type_t -#define vg_lite_linear_gradient_ext_t vg_lite_ext_linear_gradient_t -#define vg_lite_buffer_transparency_mode_t vg_lite_transparency_t - - -/* VGLite API Types ***********************************************************************************************************************/ - -typedef unsigned char vg_lite_uint8_t; -typedef char vg_lite_int8_t; -typedef short vg_lite_int16_t; -typedef unsigned short vg_lite_uint16_t; -typedef int vg_lite_int32_t; -typedef unsigned int vg_lite_uint32_t; -typedef unsigned long long vg_lite_uint64_t; -typedef float vg_lite_float_t; -typedef double vg_lite_double_t; -typedef char vg_lite_char; -typedef char* vg_lite_string; -typedef void* vg_lite_pointer; -typedef void vg_lite_void; -typedef unsigned int vg_lite_color_t; - - -/* VGLite API Enumerations ****************************************************************************************************************/ - -#ifndef VG_LITE_ERROR -#define VG_LITE_ERROR 1 - - /* Error codes that the vg_lite functions can return. */ - typedef enum vg_lite_error - { - VG_LITE_SUCCESS = 0, /*! Success. */ - VG_LITE_INVALID_ARGUMENT, /*! An invalid argument was specified. */ - VG_LITE_OUT_OF_MEMORY, /*! Out of memory. */ - VG_LITE_NO_CONTEXT, /*! No context or an unintialized context specified. */ - VG_LITE_TIMEOUT, /*! A timeout has occurred during a wait. */ - VG_LITE_OUT_OF_RESOURCES, /*! Out of system resources. */ - VG_LITE_GENERIC_IO, /*! Cannot communicate with the kernel driver. */ - VG_LITE_NOT_SUPPORT, /*! Function call not supported. */ - VG_LITE_ALREADY_EXISTS, /*! Object already exists */ - VG_LITE_NOT_ALIGNED, /*! Data alignment error */ - VG_LITE_FLEXA_TIME_OUT, /*! VG timeout requesting for segment buffer */ - VG_LITE_FLEXA_HANDSHAKE_FAIL, /*! VG and SBI synchronizer handshake failed */ - } vg_lite_error_t; -#endif - - /* Chip features bit */ - typedef enum vg_lite_feature - { - gcFEATURE_BIT_VG_IM_INDEX_FORMAT, - gcFEATURE_BIT_VG_SCISSOR, - gcFEATURE_BIT_VG_BORDER_CULLING, - gcFEATURE_BIT_VG_RGBA2_FORMAT, - gcFEATURE_BIT_VG_QUALITY_8X, - gcFEATURE_BIT_VG_IM_FASTCLAER, - gcFEATURE_BIT_VG_RADIAL_GRADIENT, - gcFEATURE_BIT_VG_GLOBAL_ALPHA, - gcFEATURE_BIT_VG_RGBA8_ETC2_EAC, - gcFEATURE_BIT_VG_COLOR_KEY, - gcFEATURE_BIT_VG_DOUBLE_IMAGE, - gcFEATURE_BIT_VG_YUV_OUTPUT, - gcFEATURE_BIT_VG_FLEXA, - gcFEATURE_BIT_VG_24BIT, - gcFEATURE_BIT_VG_DITHER, - gcFEATURE_BIT_VG_USE_DST, - gcFEATURE_BIT_VG_PE_CLEAR, - gcFEATURE_BIT_VG_IM_INPUT, - gcFEATURE_BIT_VG_DEC_COMPRESS, - gcFEATURE_BIT_VG_LINEAR_GRADIENT_EXT, - gcFEATURE_BIT_VG_MASK, - gcFEATURE_BIT_VG_MIRROR, - gcFEATURE_BIT_VG_GAMMA, - gcFEATURE_BIT_VG_NEW_BLEND_MODE, - gcFEATURE_BIT_VG_STENCIL, - gcFEATURE_BIT_VG_SRC_PREMULTIPLIED, /*! Valid only if gcFEATURE_BIT_VG_HW_PREMULTIPLY is 0 */ - gcFEATURE_BIT_VG_HW_PREMULTIPLY, /*! HW multiplier can accept either premultiplied or not */ - gcFEATURE_BIT_VG_COLOR_TRANSFORMATION, - gcFEATURE_BIT_VG_LVGL_SUPPORT, - gcFEATURE_BIT_VG_INDEX_ENDIAN, - gcFEATURE_BIT_VG_24BIT_PLANAR, - gcFEATURE_BIT_VG_PIXEL_MATRIX, - gcFEATURE_BIT_VG_NEW_IMAGE_INDEX, - gcFEATURE_BIT_VG_PARALLEL_PATHS, - gcFEATURE_BIT_VG_STRIPE_MODE, - gcFEATURE_BIT_VG_IM_DEC_INPUT, - gcFEATURE_BIT_VG_GAUSSIAN_BLUR, - gcFEATURE_BIT_VG_RECTANGLE_TILED_OUT, - gcFEATURE_BIT_VG_TESSELLATION_TILED_OUT, - gcFEATURE_BIT_VG_IM_REPEAT_REFLECT, - gcFEATURE_BIT_VG_YUY2_INPUT, - gcFEATURE_BIT_VG_YUV_INPUT, - gcFEATURE_BIT_VG_YUV_TILED_INPUT, - gcFEATURE_BIT_VG_AYUV_INPUT, - gcFEATURE_BIT_VG_16PIXELS_ALIGN, - gcFEATURE_BIT_VG_DEC_COMPRESS_2_0, - gcFEATURE_COUNT - } vg_lite_feature_t; - - /* Rendering quality enums. */ - typedef enum vg_lite_quality - { - VG_LITE_HIGH, /*! High quality 16x anti-aliasing path. */ - VG_LITE_UPPER, /*! Upper quality 8x anti-aliasing path. */ - VG_LITE_MEDIUM, /*! Medium quality 4x anti-aliasing path. */ - VG_LITE_LOW, /*! Low quality path without any anti-aliasing. */ - } vg_lite_quality_t; - - /* Format of path coordinates. */ - typedef enum vg_lite_format - { - VG_LITE_S8, /*! Signed 8-bit coordinates. */ - VG_LITE_S16, /*! Signed 16-bit coordinates. */ - VG_LITE_S32, /*! Signed 32-bit coordinates. */ - VG_LITE_FP32, /*! 32-bit floating point coordinates. */ - } vg_lite_format_t; - - /* Format of pixel buffer. */ - typedef enum vg_lite_buffer_format - { - /* OpenVG VGImageFormat enums: - * Note: The bits for each color channel are stored within a machine word - * from MSB to LSB in the order indicated by the pixel format name. - * This is opposite of VG_LITE_* formats (from LSB to MSB). - */ - - /* RGB{A,X} channel ordering */ - VG_sRGBX_8888 = 0, - VG_sRGBA_8888 = 1, - VG_sRGBA_8888_PRE = 2, - VG_sRGB_565 = 3, - VG_sRGBA_5551 = 4, - VG_sRGBA_4444 = 5, - VG_sL_8 = 6, - VG_lRGBX_8888 = 7, - VG_lRGBA_8888 = 8, - VG_lRGBA_8888_PRE = 9, - VG_lL_8 = 10, - VG_A_8 = 11, - VG_BW_1 = 12, - VG_A_1 = 13, - VG_A_4 = 14, - - VG_sRGBX_8888_PRE = 15, - VG_sRGB_565_PRE = 16, - VG_sRGBA_5551_PRE = 17, - VG_sRGBA_4444_PRE = 18, - VG_lRGBX_8888_PRE = 19, - VG_lRGB_565 = 20, - VG_lRGB_565_PRE = 21, - VG_lRGBA_5551 = 22, - VG_lRGBA_5551_PRE = 23, - VG_lRGBA_4444 = 24, - VG_lRGBA_4444_PRE = 25, - - /* {A,X}RGB channel ordering */ - VG_sXRGB_8888 = 0 | (1 << 6), - VG_sARGB_8888 = 1 | (1 << 6), - VG_sARGB_8888_PRE = 2 | (1 << 6), - VG_sARGB_1555 = 4 | (1 << 6), - VG_sARGB_4444 = 5 | (1 << 6), - VG_lXRGB_8888 = 7 | (1 << 6), - VG_lARGB_8888 = 8 | (1 << 6), - VG_lARGB_8888_PRE = 9 | (1 << 6), - - /* BGR{A,X} channel ordering */ - VG_sBGRX_8888 = 0 | (1 << 7), - VG_sBGRA_8888 = 1 | (1 << 7), - VG_sBGRA_8888_PRE = 2 | (1 << 7), - VG_sBGR_565 = 3 | (1 << 7), - VG_sBGRA_5551 = 4 | (1 << 7), - VG_sBGRA_4444 = 5 | (1 << 7), - VG_lBGRX_8888 = 7 | (1 << 7), - VG_lBGRA_8888 = 8 | (1 << 7), - VG_lBGRA_8888_PRE = 9 | (1 << 7), - - /* {A,X}BGR channel ordering */ - VG_sXBGR_8888 = 0 | (1 << 6) | (1 << 7), - VG_sABGR_8888 = 1 | (1 << 6) | (1 << 7), - VG_sABGR_8888_PRE = 2 | (1 << 6) | (1 << 7), - VG_sABGR_1555 = 4 | (1 << 6) | (1 << 7), - VG_sABGR_4444 = 5 | (1 << 6) | (1 << 7), - VG_lXBGR_8888 = 7 | (1 << 6) | (1 << 7), - VG_lABGR_8888 = 8 | (1 << 6) | (1 << 7), - VG_lABGR_8888_PRE = 9 | (1 << 6) | (1 << 7), - - /* Original VGLite API image format enums: - * Note: The bits for each color channel are stored within a machine word - * from LSB to MSB in the order indicated by the pixel format name. - * This is opposite of OPENVG VG_* formats (from MSB to LSB). - */ - VG_LITE_RGBA8888 = 0 | (1 << 10), - VG_LITE_BGRA8888 = 1 | (1 << 10), - VG_LITE_RGBX8888 = 2 | (1 << 10), - VG_LITE_BGRX8888 = 3 | (1 << 10), - VG_LITE_RGB565 = 4 | (1 << 10), - VG_LITE_BGR565 = 5 | (1 << 10), - VG_LITE_RGBA4444 = 6 | (1 << 10), - VG_LITE_BGRA4444 = 7 | (1 << 10), - VG_LITE_BGRA5551 = 8 | (1 << 10), - VG_LITE_A4 = 9 | (1 << 10), - VG_LITE_A8 = 10 | (1 << 10), - VG_LITE_L8 = 11 | (1 << 10), - VG_LITE_YUYV = 12 | (1 << 10), - VG_LITE_YUY2 = 13 | (1 << 10), - VG_LITE_ANV12 = 14 | (1 << 10), - VG_LITE_AYUY2 = 15 | (1 << 10), - VG_LITE_NV12 = 16 | (1 << 10), - VG_LITE_YV12 = 17 | (1 << 10), - VG_LITE_YV24 = 18 | (1 << 10), - VG_LITE_YV16 = 19 | (1 << 10), - VG_LITE_NV16 = 20 | (1 << 10), - VG_LITE_YUY2_TILED = 21 | (1 << 10), - VG_LITE_NV12_TILED = 22 | (1 << 10), - VG_LITE_ANV12_TILED = 23 | (1 << 10), - VG_LITE_AYUY2_TILED = 24 | (1 << 10), - VG_LITE_RGBA2222 = 25 | (1 << 10), - VG_LITE_BGRA2222 = 26 | (1 << 10), - VG_LITE_ABGR2222 = 27 | (1 << 10), - VG_LITE_ARGB2222 = 28 | (1 << 10), - VG_LITE_ABGR4444 = 29 | (1 << 10), - VG_LITE_ARGB4444 = 30 | (1 << 10), - VG_LITE_ABGR8888 = 31 | (1 << 10), - VG_LITE_ARGB8888 = 32 | (1 << 10), - VG_LITE_ABGR1555 = 33 | (1 << 10), - VG_LITE_RGBA5551 = 34 | (1 << 10), - VG_LITE_ARGB1555 = 35 | (1 << 10), - VG_LITE_XBGR8888 = 36 | (1 << 10), - VG_LITE_XRGB8888 = 37 | (1 << 10), - VG_LITE_RGBA8888_ETC2_EAC = 38 | (1 << 10), - VG_LITE_RGB888 = 39 | (1 << 10), - VG_LITE_BGR888 = 40 | (1 << 10), - VG_LITE_ABGR8565 = 41 | (1 << 10), - VG_LITE_BGRA5658 = 42 | (1 << 10), - VG_LITE_ARGB8565 = 43 | (1 << 10), - VG_LITE_RGBA5658 = 44 | (1 << 10), - VG_LITE_ABGR8565_PLANAR = 45 | (1 << 10), - VG_LITE_BGRA5658_PLANAR = 46 | (1 << 10), - VG_LITE_ARGB8565_PLANAR = 47 | (1 << 10), - VG_LITE_RGBA5658_PLANAR = 48 | (1 << 10), - - VG_LITE_INDEX_1 = 0 | (1 << 11), /*! Indexed format. */ - VG_LITE_INDEX_2 = 1 | (1 << 11), - VG_LITE_INDEX_4 = 2 | (1 << 11), - VG_LITE_INDEX_8 = 3 | (1 << 11), - - } vg_lite_buffer_format_t; - - /* Swizzle of packed YUV format UV channels. */ - typedef enum vg_lite_swizzle - { - VG_LITE_SWIZZLE_UV, - VG_LITE_SWIZZLE_VU, - } vg_lite_swizzle_t; - - /* The YUV<->RGB conversion rule. */ - typedef enum vg_lite_yuv2rgb - { - VG_LITE_YUV601, - VG_LITE_YUV709, - } vg_lite_yuv2rgb_t; - - /* The pixel layout in a buffer. */ - typedef enum vg_lite_buffer_layout - { - VG_LITE_LINEAR, - VG_LITE_TILED, - } vg_lite_buffer_layout_t; - - /* The image (buffer) rendering mode. Match OpenVG enum VGImageMode */ - typedef enum vg_lite_image_mode - { - /* For enum value backward compatibility */ - VG_LITE_ZERO = 0, - VG_LITE_NORMAL_IMAGE_MODE = 0x1F00, - VG_LITE_MULTIPLY_IMAGE_MODE = 0x1F01, - VG_LITE_STENCIL_MODE = 0x1F02, - VG_LITE_NONE_IMAGE_MODE = 0x1F03, - VG_LITE_RECOLOR_MODE = 0x1F04, - } vg_lite_image_mode_t; - - /* The image (buffer) transparency mode. */ - typedef enum vg_lite_transparency - { - VG_LITE_IMAGE_OPAQUE, - VG_LITE_IMAGE_TRANSPARENT - } vg_lite_transparency_t; - - /* Blending modes. VG_BLEND_* match OpenVG enum VGBlendMode. - * S and D represent source and destination color channels. - * Sa and Da represent the source and destination alpha channels. - */ - typedef enum vg_lite_blend - { - VG_LITE_BLEND_NONE = 0, /*! S, No blend, Non-premultiplied */ - VG_LITE_BLEND_SRC_OVER = 1, /*! S + (1 - Sa) * D , Non-premultiplied */ - VG_LITE_BLEND_DST_OVER = 2, /*! (1 - Da) * S + D , Non-premultiplied */ - VG_LITE_BLEND_SRC_IN = 3, /*! Da * S , Non-premultiplied */ - VG_LITE_BLEND_DST_IN = 4, /*! Sa * D , Non-premultiplied */ - VG_LITE_BLEND_MULTIPLY = 5, /*! S * (1 - Da) + D * (1 - Sa) + S * D , Non-premultiplied */ - VG_LITE_BLEND_SCREEN = 6, /*! S + D - S * D , Non-premultiplied */ - VG_LITE_BLEND_DARKEN = 7, /*! min(SrcOver, DstOver) , Non-premultiplied */ - VG_LITE_BLEND_LIGHTEN = 8, /*! max(SrcOver, DstOver) , Non-premultiplied */ - VG_LITE_BLEND_ADDITIVE = 9, /*! S + D , Non-premultiplied */ - VG_LITE_BLEND_SUBTRACT = 10, /*! D * (1 - Sa) , Non-premultiplied */ - VG_LITE_BLEND_SUBTRACT_LVGL = 11, /*! D - S , Non-premultiplied */ - VG_LITE_BLEND_NORMAL_LVGL = 12, /*! S * Sa + (1 - Sa) * D , Non-premultiplied */ - VG_LITE_BLEND_ADDITIVE_LVGL = 13, /*! (S + D) * Sa + D * (1 - Sa) , Non-premultiplied */ - VG_LITE_BLEND_MULTIPLY_LVGL = 14, /*! (S * D) * Sa + D * (1 - Sa) , Non-premultiplied */ - VG_LITE_BLEND_PREMULTIPLY_SRC_OVER = 15, /*! S * Sa + (1 - Sa) * D , Non-premultiplied */ - - OPENVG_BLEND_SRC = 0x2000, /*! Copy SRC, no blend, Premultiplied */ - OPENVG_BLEND_SRC_OVER = 0x2001, /*! Porter-Duff SRC_OVER blend, Premultiplied */ - OPENVG_BLEND_DST_OVER = 0x2002, /*! Porter-Duff DST_OVER blend, Premultiplied */ - OPENVG_BLEND_SRC_IN = 0x2003, /*! Porter-Duff SRC_IN blend, Premultiplied */ - OPENVG_BLEND_DST_IN = 0x2004, /*! Porter-Duff DST_IN blend, Premultiplied */ - OPENVG_BLEND_MULTIPLY = 0x2005, /*! Porter-Duff MULTIPLY blend, Premultiplied */ - OPENVG_BLEND_SCREEN = 0x2006, /*! Porter-Duff SCREEN blend, Premultiplied */ - OPENVG_BLEND_DARKEN = 0x2007, /*! Porter-Duff DARKEN blend, Premultiplied */ - OPENVG_BLEND_LIGHTEN = 0x2008, /*! Porter-Duff LIGHTEN blend, Premultiplied */ - OPENVG_BLEND_ADDITIVE = 0x2009, /*! Porter-Duff ADDITIVE blend, Premultiplied */ - } vg_lite_blend_t; - - /* Fill rules. Match OpenVG enum VGFillRule */ - typedef enum vg_lite_fill - { - VG_LITE_FILL_EVEN_ODD = 0x1900, /*! A pixel is drawn it it crosses an odd number of path pixels. */ - VG_LITE_FILL_NON_ZERO = 0x1901, /*! A pixel is drawn if it crosses at least one path pixel. */ - } vg_lite_fill_t; - - /* Global alpha modes. */ - typedef enum vg_lite_global_alpha - { - VG_LITE_NORMAL = 0, /*! Use original src/dst alpha value. */ - VG_LITE_GLOBAL, /*! Use global src/dst alpha value to replace original src/dst alpha value. */ - VG_LITE_SCALED, /*! Multiply global src/dst alpha value and original src/dst alpha value. */ - } vg_lite_global_alpha_t; - - /* Filter modes. */ - typedef enum vg_lite_filter - { - VG_LITE_FILTER_POINT = 0, /*! Fetch the nearest image pixel. */ - VG_LITE_FILTER_LINEAR = 0x1000, /*! Used for linear paint. */ - VG_LITE_FILTER_BI_LINEAR = 0x2000, /*! Use a 2x2 box around the image pixel and perform an interpolation. */ - VG_LITE_FILTER_GAUSSIAN = 0x3000, /*! Perform 3x3 gaussian blur with the convolution for image pixel. */ - } vg_lite_filter_t; - - /* Pattern padding mode. Match OpenVG enum VGTilingMode. */ - typedef enum vg_lite_pattern_mode - { - VG_LITE_PATTERN_COLOR = 0x1D00, /*! Pixel outside the bounds of sourceimage should be taken as the color */ - VG_LITE_PATTERN_PAD = 0x1D01, /*! Pixel outside the bounds of sourceimage should be taken as having the same color as the closest edge pixel */ - VG_LITE_PATTERN_REPEAT = 0x1D02, /*! Pixel outside the bounds of sourceimage should be repeated indefinitely in all directions */ - VG_LITE_PATTERN_REFLECT = 0x1D03, /*! Pixel outside the bounds of sourceimage should be reflected indefinitely in all directions */ - } vg_lite_pattern_mode_t; - - /* Paint type. Match OpenVG enum VGPaintType. */ - typedef enum vg_lite_paint_type - { - /* For enum value backward compatibility */ - VG_LITE_PAINT_ZERO = 0, - VG_LITE_PAINT_COLOR = 0x1B00, - VG_LITE_PAINT_LINEAR_GRADIENT = 0x1B01, - VG_LITE_PAINT_RADIAL_GRADIENT = 0x1B02, - VG_LITE_PAINT_PATTERN = 0x1B03, - } vg_lite_paint_type_t; - - /* Radial gradient padding mode. Match OpenVG enum VGColorRampSpreadMode */ - typedef enum - { - VG_LITE_GRADIENT_SPREAD_FILL = 0, - VG_LITE_GRADIENT_SPREAD_PAD = 0x1C00, - VG_LITE_GRADIENT_SPREAD_REPEAT = 0x1C01, - VG_LITE_GRADIENT_SPREAD_REFLECT = 0x1C02, - } vg_lite_gradient_spreadmode_t; - - /* Decnano Compress mode. */ - typedef enum vg_lite_compress_mode - { - VG_LITE_DEC_DISABLE = 0, /*! disable compress */ - VG_LITE_DEC_NON_SAMPLE, /*! compress ratio is 1.6 if use ARGB8888, compress ratio is 2 if use XRGB8888 */ - VG_LITE_DEC_HSAMPLE, /*! compress ratio is 2 if use ARGB8888, compress ratio is 2.6 if use XRGB8888 */ - VG_LITE_DEC_HV_SAMPLE, /*! compress ratio is 2.6 if use ARGB8888, compress ratio is 4 if use XRGB8888 */ - } vg_lite_compress_mode_t; - - /* Draw path type. Match OpenVG enum VGPaintMode */ - typedef enum vg_lite_path_type - { - /* For enum value backward compatibility */ - VG_LITE_DRAW_ZERO = 0, - VG_LITE_DRAW_STROKE_PATH = (1<<0), - VG_LITE_DRAW_FILL_PATH = (1<<1), - VG_LITE_DRAW_FILL_STROKE_PATH = (1<<1 | 1<<0), - } vg_lite_path_type_t; - - /* End cap style. Match OpenVG enum VGCapStyle */ - typedef enum vg_lite_cap_style - { - VG_LITE_CAP_BUTT = 0x1700, - VG_LITE_CAP_ROUND = 0x1701, - VG_LITE_CAP_SQUARE = 0x1702, - } vg_lite_cap_style_t; - - /* Line join styles. Match OpenVG enum VGJoinStyle */ - typedef enum vg_lite_join_style - { - VG_LITE_JOIN_MITER = 0x1800, - VG_LITE_JOIN_ROUND = 0x1801, - VG_LITE_JOIN_BEVEL = 0x1802, - } vg_lite_join_style_t; - - /* Mask operation mode. Match OpenVG enum VGMaskOperation */ - typedef enum vg_lite_mask_operation - { - VG_LITE_CLEAR_MASK = 0x1500, /*! Set all dest mask values to 0 */ - VG_LITE_FILL_MASK = 0x1501, /*! Set all dest mask values to 1 */ - VG_LITE_SET_MASK = 0x1502, /*! Copy from src masklayer to dest masklayer. */ - VG_LITE_UNION_MASK = 0x1503, /*! Replace dest masklayer by its union with src masklayer. */ - VG_LITE_INTERSECT_MASK = 0x1504, /*! Replace dest masklayer by its intersection with src masklayer. */ - VG_LITE_SUBTRACT_MASK = 0x1505, /*! Subtract src mask in dest masklayer */ - } vg_lite_mask_operation_t; - - /* Mirror orientation mode. */ - typedef enum vg_lite_orientation - { - VG_LITE_ORIENTATION_TOP_BOTTOM, - VG_LITE_ORIENTATION_BOTTOM_TOP, - } vg_lite_orientation_t; - - /* Gamma conversion mode. */ - typedef enum vg_lite_gamma_conversion - { - VG_LITE_GAMMA_NO_CONVERSION, /*! Leave color as is. */ - VG_LITE_GAMMA_LINEAR, /*! Convert from sRGB to linear space. */ - VG_LITE_GAMMA_NON_LINEAR /*! Convert from linear to sRGB space. */ - } vg_lite_gamma_conversion_t; - - /* Index endian */ - typedef enum vg_lite_index_endian - { - VG_LITE_INDEX_LITTLE_ENDIAN, /*! Parse the index pixel from low to high, - *! when using index1, the parsing order is bit0~bit7. - *! when using index2, the parsing order is bit0:1,bit2:3,bit4:5.bit6:7. - *! when using index4, the parsing order is bit0:3,bit4:7. - */ - VG_LITE_INDEX_BIG_ENDIAN, /*! Parse the index pixel from low to high, - *! when using index1, the parsing order is bit7~bit0. - *! when using index2, the parsing order is bit7:6,bit5:4,bit3:2.bit1:0. - *! when using index4, the parsing order is bit4:7,bit0:3. - */ - } vg_lite_index_endian_t; - - /* Map flag*/ - typedef enum vg_lite_map_flag - { - VG_LITE_MAP_USER_MEMORY = 0, - VG_LITE_MAP_DMABUF = 0x01, - } vg_lite_map_flag_t; - - /*VGLite parameters variable*/ - typedef enum vg_lite_param_type - { - VG_LITE_SCISSOR_RECT, /*! count must be 4n for x, y, right, bottom */ - VG_LITE_GPU_IDLE_STATE, /*! 0: busy, 1: idle */ - } vg_lite_param_type_t; - -/* VGLite API Structures ******************************************************************************************************************/ - - /* VGLite driver information */ - typedef struct vg_lite_info { - vg_lite_uint32_t api_version; - vg_lite_uint32_t header_version; - vg_lite_uint32_t release_version; - vg_lite_uint32_t reserved; - } vg_lite_info_t; - - /* A 2D Point definition. */ - typedef struct vg_lite_point { - vg_lite_int32_t x; - vg_lite_int32_t y; - } vg_lite_point_t; - - /* Four 2D Point that form a polygon */ - typedef vg_lite_point_t vg_lite_point4_t[4]; - - /* A rectangle.*/ - typedef struct vg_lite_rectangle { - vg_lite_int32_t x; /*! Left coordinate of rectangle. */ - vg_lite_int32_t y; /*! Top coordinate of rectangle. */ - vg_lite_int32_t width; /*! Width of rectangle. */ - vg_lite_int32_t height; /*! Height of rectangle. */ - } vg_lite_rectangle_t; - - typedef struct vg_lite_matrix { - vg_lite_float_t m[3][3]; /*! The 3x3 matrix is in [row][column] order. */ - vg_lite_float_t scaleX; - vg_lite_float_t scaleY; - vg_lite_float_t angle; - } vg_lite_matrix_t; - - typedef struct vg_lite_yuvinfo - { - vg_lite_swizzle_t swizzle; /*! UV swizzle. */ - vg_lite_yuv2rgb_t yuv2rgb; /*! 601 or 709 conversion standard. */ - vg_lite_uint32_t uv_planar; /*! UV(U) planar address. */ - vg_lite_uint32_t v_planar; /*! V planar address. */ - vg_lite_uint32_t alpha_planar; /*! Alpha planar address. */ - vg_lite_uint32_t uv_stride; /*! UV(U) stride. */ - vg_lite_uint32_t v_stride; /*! V stride. */ - vg_lite_uint32_t alpha_stride; /*! Alpha stride. */ - vg_lite_uint32_t uv_height; /*! UV(U) height. */ - vg_lite_uint32_t v_height; /*! V height. */ - vg_lite_pointer uv_memory; /*! The logical pointer to the UV(U) planar memory. */ - vg_lite_pointer v_memory; /*! The logical pointer to the V planar memory. */ - vg_lite_pointer uv_handle; /*! The memory handle of the UV(U) planar. */ - vg_lite_pointer v_handle; /*! The memory handle of the V planar. */ - } vg_lite_yuvinfo_t; - - typedef struct vg_lite_path_point* vg_lite_path_point_ptr; - typedef struct vg_lite_path_point - { - /* X coordinate. */ - vg_lite_float_t x; - - /* Y coordinate. */ - vg_lite_float_t y; - - /* Flatten flag for flattened path. */ - vg_lite_uint8_t flatten_flag; - - /* Curve type for stroke path. */ - vg_lite_uint8_t curve_type; - - /* X tangent. */ - vg_lite_float_t tangentX; - - /* Y tangent. */ - vg_lite_float_t tangentY; - - /* Length of the line. */ - vg_lite_float_t length; - - /* Pointer to next point node. */ - vg_lite_path_point_ptr next; - - /* Pointer to previous point node. */ - vg_lite_path_point_ptr prev; - - } vg_lite_path_point_t; - - typedef struct vg_lite_sub_path* vg_lite_sub_path_ptr; - typedef struct vg_lite_sub_path - { - /* Pointer to next sub path. */ - vg_lite_sub_path_ptr next; - - /* Number of points. */ - vg_lite_uint32_t point_count; - - /* Point list. */ - vg_lite_path_point_ptr point_list; - - /* Last point. */ - vg_lite_path_point_ptr end_point; - - /* Whether is path is closed. */ - vg_lite_uint8_t closed; - - /* Sub path length. */ - vg_lite_float_t length; - - } vg_lite_sub_path_t; - - /* Save divided path data according to MOVE/MOVE_REL. */ - typedef struct vg_lite_path_list* vg_lite_path_list_ptr; - typedef struct vg_lite_path_list - { - vg_lite_path_point_ptr path_points; - vg_lite_path_point_ptr path_end; - vg_lite_uint32_t point_count; - vg_lite_path_list_ptr next; - vg_lite_uint8_t closed; - - } vg_lite_path_list_t; - - typedef struct vg_lite_stroke - { - /* Stroke parameters */ - vg_lite_cap_style_t cap_style; - vg_lite_join_style_t join_style; - vg_lite_float_t line_width; - vg_lite_float_t miter_limit; - vg_lite_float_t *dash_pattern; - vg_lite_uint32_t pattern_count; - vg_lite_float_t dash_phase; - vg_lite_float_t dash_length; - vg_lite_uint32_t dash_index; - vg_lite_float_t half_width; - - /* Total length of stroke dash patterns. */ - vg_lite_float_t pattern_length; - - /* For fast checking. */ - vg_lite_float_t miter_square; - - /* Temp storage of stroke subPath. */ - vg_lite_path_point_ptr path_points; - vg_lite_path_point_ptr path_end; - vg_lite_uint32_t point_count; - vg_lite_path_point_ptr left_point; - vg_lite_path_point_ptr right_point; - vg_lite_path_point_ptr stroke_points; - vg_lite_path_point_ptr stroke_end; - vg_lite_uint32_t stroke_count; - - /* Divide stroke path according to move or move_rel for avoiding implicit closure. */ - vg_lite_path_list_ptr path_list_divide; - - /* pointer to current divided path data. */ - vg_lite_path_list_ptr cur_list; - - /* Flag that add end_path in driver. */ - vg_lite_uint8_t add_end; - vg_lite_uint8_t dash_reset; - - /* Sub path list. */ - vg_lite_sub_path_ptr stroke_paths; - - /* Last sub path. */ - vg_lite_sub_path_ptr last_stroke; - - /* Swing area handling. */ - vg_lite_uint32_t swing_handling; - vg_lite_float_t swing_deltax; - vg_lite_float_t swing_deltay; - vg_lite_path_point_ptr swing_start; - vg_lite_path_point_ptr swing_stroke; - vg_lite_float_t swing_length; - vg_lite_float_t swing_centlen; - vg_lite_uint32_t swing_count; - vg_lite_uint8_t need_swing; - vg_lite_uint8_t swing_ccw; - - vg_lite_float_t stroke_length; - vg_lite_uint32_t stroke_size; - - /* The stroke line is fat line. */ - vg_lite_uint8_t fattened; - vg_lite_uint8_t closed; - - } vg_lite_stroke_t; - - /* Fast clear buffer. */ - typedef struct vg_lite_fc_buffer - { - vg_lite_int32_t width; /*! Width of the buffer in pixels. */ - vg_lite_int32_t height; /*! height of the buffer in pixels. */ - vg_lite_int32_t stride; /*! The number of bytes to move from one line in the buffer to the next line. */ - vg_lite_pointer handle; /*! The memory handle of the buffer's memory as allocated by the VGLite kernel. */ - vg_lite_pointer memory; /*! The logical pointer to the buffer's memory for the CPU. */ - vg_lite_uint32_t address; /*! The address to the buffer's memory for the hardware. */ - vg_lite_uint32_t color; /*! The fastclear color value. */ - } vg_lite_fc_buffer_t; - - /* Structure for any image or render target. */ - typedef struct vg_lite_buffer - { - vg_lite_int32_t width; /*! Width of the buffer in pixels. */ - vg_lite_int32_t height; /*! Height of the buffer in pixels. */ - vg_lite_int32_t stride; /*! The number of bytes to move from one line in the buffer to the next line. */ - vg_lite_buffer_layout_t tiled; /*! Indicating the buffer memory layout is linear or tiled. */ - vg_lite_buffer_format_t format; /*! The pixel format of the buffer. */ - vg_lite_pointer handle; /*! The memory handle of the buffer's memory as allocated by the VGLite kernel. */ - vg_lite_pointer memory; /*! The logical pointer to the buffer's memory for the CPU. */ - vg_lite_uint32_t address; /*! The address to the buffer's memory for the hardware. */ - vg_lite_yuvinfo_t yuv; /*! The yuv format details. */ - vg_lite_image_mode_t image_mode; /*! The blit image mode. */ - vg_lite_transparency_t transparency_mode; /*! image transparency mode. */ - vg_lite_fc_buffer_t fc_buffer[3]; /*! 3 fastclear buffers,reserved YUV format. */ - vg_lite_compress_mode_t compress_mode; /*! Refer to the definition by vg_lite_compress_mode_t. */ - vg_lite_index_endian_t index_endian; /*! Refer to the definition by vg_lite_index_endian_t. */ - vg_lite_paint_type_t paintType; /*! Get paintcolor from different paint types. */ - vg_lite_uint8_t fc_enable; /*! enable im fastclear. */ - vg_lite_uint8_t scissor_layer; /*! The buffer is scissor buffer. */ - vg_lite_uint8_t premultiplied; /*! The RGB pixel values are alpha-premultiplied */ - } vg_lite_buffer_t; - - /* Memory allocation info by kernel. */ - typedef struct vg_lite_hw_memory - { - vg_lite_pointer handle; /*! gpu memory object handle. */ - vg_lite_pointer memory; /*! logical memory address. */ - vg_lite_uint32_t address; /*! GPU memory address. */ - vg_lite_uint32_t bytes; /*! Size of memory. */ - vg_lite_uint32_t property; /*! Currently bit0 is used for path upload state: - *! 1 : enable auto path data uploading. - *! 0 : disable path data uploading. path data is embedded in command buffer. */ - } vg_lite_hw_memory_t; - - /* Path info for drawing command. */ - typedef struct vg_lite_path - { - vg_lite_float_t bounding_box[4]; /*! Bounding box specified as left, top, right, and bottom. */ - vg_lite_quality_t quality; /*! Quality hint for the path. */ - vg_lite_format_t format; /*! Coordinate format. */ - vg_lite_hw_memory_t uploaded; /*! Path data that has been upload into GPU addressable memory. */ - vg_lite_uint32_t path_length; /*! Number of bytes in the path data. */ - vg_lite_pointer path; /*! Pointer to the physical description of the path. */ - vg_lite_int8_t path_changed; /*! Indicate whether path data is synced with command buffer (uploaded) or not. */ - vg_lite_int8_t pdata_internal; /*! Indicate whether path data memory is allocated by driver. */ - vg_lite_path_type_t path_type; /*! Refer to the definition by vg_lite_path_type_t. */ - vg_lite_stroke_t *stroke; /*! Pointer to a vg_lite_stroke_t structure.*/ - vg_lite_pointer stroke_path; /*! Pointer to the physical description of the stroke path. */ - vg_lite_uint32_t stroke_size; /*! Number of bytes in the stroke path data. */ - vg_lite_color_t stroke_color; /*! The stroke path fill color. */ - vg_lite_int8_t add_end; /*! Flag that add end_path in driver. */ - } vg_lite_path_t; - - /* Color ramp definition. */ - typedef struct vg_lite_color_ramp - { - vg_lite_float_t stop; /*! Value for the color stop. */ - vg_lite_float_t red; /*! Red color channel value for the color stop. */ - vg_lite_float_t green; /*! Green color channel value for the color stop. */ - vg_lite_float_t blue; /*! Blue color channel value for the color stop. */ - vg_lite_float_t alpha; /*! Alpha color channel value for the color stop. */ - } vg_lite_color_ramp_t; - - /* Linear gradient parameter */ - typedef struct vg_lite_linear_gradient_parameter - { - vg_lite_float_t X0; - vg_lite_float_t Y0; - vg_lite_float_t X1; - vg_lite_float_t Y1; - } vg_lite_linear_gradient_parameter_t; - - typedef struct vg_lite_radial_gradient_parameter - { - vg_lite_float_t cx; /*! x coordinate of the center point. */ - vg_lite_float_t cy; /*! y coordinate of the center point. */ - vg_lite_float_t r; /*! radius. */ - vg_lite_float_t fx; /*! x coordinate of the focal point. */ - vg_lite_float_t fy; /*! y coordinate of the focal point. */ - } vg_lite_radial_gradient_parameter_t; - - /* Linear gradient definition. */ - typedef struct vg_lite_linear_gradient { - vg_lite_uint32_t colors[VLC_MAX_GRADIENT_STOPS]; /*! Colors for stops. */ - vg_lite_uint32_t count; /*! Count of colors, up to 16. */ - vg_lite_uint32_t stops[VLC_MAX_GRADIENT_STOPS]; /*! Color stops, value from 0 to 255. */ - vg_lite_matrix_t matrix; /*! The matrix to transform the gradient. */ - vg_lite_buffer_t image; /*! The image for rendering as gradient pattern. */ - } vg_lite_linear_gradient_t; - - /* Extended linear gradient definition. */ - typedef struct vg_lite_ext_linear_gradient { - vg_lite_uint32_t count; /*! Count of colors, up to 256. */ - vg_lite_matrix_t matrix; /*! The matrix to transform the gradient. */ - vg_lite_buffer_t image; /*! The image for rendering as gradient pattern. */ - vg_lite_linear_gradient_parameter_t linear_grad; /*! Include center point,focal point and radius.*/ - - vg_lite_uint32_t ramp_length; /*! Color ramp for gradient paints provided to driver. */ - vg_lite_color_ramp_t color_ramp[VLC_MAX_COLOR_RAMP_STOPS]; - - vg_lite_uint32_t converted_length; /*! Converted internal color ramp. */ - vg_lite_color_ramp_t converted_ramp[VLC_MAX_COLOR_RAMP_STOPS + 2]; - - vg_lite_uint8_t pre_multiplied; /*! If color values of color_ramp[] are multiply by alpha value of color_ramp[]. */ - vg_lite_gradient_spreadmode_t spread_mode; /*! The spread mode that applied to the pixels out of the image after transformed. */ - } vg_lite_ext_linear_gradient_t; - - /* Radial gradient definition. */ - typedef struct vg_lite_radial_gradient - { - vg_lite_uint32_t count; /*! Count of colors, up to 256. */ - vg_lite_matrix_t matrix; /*! The matrix to transform the gradient. */ - vg_lite_buffer_t image; /*! The image for rendering as gradient pattern. */ - vg_lite_radial_gradient_parameter_t radial_grad; /*! Include center point,focal point and radius.*/ - - vg_lite_uint32_t ramp_length; /*! Color ramp for gradient paints provided to the driver. */ - vg_lite_color_ramp_t color_ramp[VLC_MAX_COLOR_RAMP_STOPS]; - - vg_lite_uint32_t converted_length; /*! Converted internal color ramp. */ - vg_lite_color_ramp_t converted_ramp[VLC_MAX_COLOR_RAMP_STOPS + 2]; - - vg_lite_uint8_t pre_multiplied; /*! If color values of color_ramp[] are multiply by alpha value of color_ramp[]. */ - vg_lite_gradient_spreadmode_t spread_mode; /*! The spread mode that applied to the pixels out of the image after transformed. */ - } vg_lite_radial_gradient_t; - - /* Colorkey definition */ - typedef struct vg_lite_color_key - { - vg_lite_uint8_t enable; /*! The color key is effective only when "enable" is true, */ - vg_lite_uint8_t low_r; /*! The R channel of low_rgb. */ - vg_lite_uint8_t low_g; /*! The G channel of low_rgb. */ - vg_lite_uint8_t low_b; /*! The B channel of low_rgb. */ - vg_lite_uint8_t alpha; /*! The alpha channel to replace destination pixel alpha channel.*/ - vg_lite_uint8_t hign_r; /*! The R channel of hign_rgb. */ - vg_lite_uint8_t hign_g; /*! The G channel of hign_rgb. */ - vg_lite_uint8_t hign_b; /*! The B channel of hign_rgb. */ - } vg_lite_color_key_t; - - /* Four colorkey definition. - * rgb_hi_0, rgb_lo_0, alpha_0, enable_0; - * rgb_hi_1, rgb_lo_1, alpha_1, enable_1; - * rgb_hi_2, rgb_lo_2, alpha_2, enable_2; - * rgb_hi_3, rgb_lo_3, alpha_3, enable_3; - * Priority order: color_key_0 > color_key_1 > color_key_2 > color_key_3. - */ - typedef vg_lite_color_key_t vg_lite_color_key4_t[4]; - - /* Pixel matrix values */ - typedef vg_lite_float_t vg_lite_pixel_matrix_t[20]; - - /* HW pixel channel enable flags */ - typedef struct vg_lite_pixel_channel_enable - { - vg_lite_uint8_t enable_a; /*! Enable A channel.*/ - vg_lite_uint8_t enable_b; /*! Enable B channel. */ - vg_lite_uint8_t enable_g; /*! Enable G channel. */ - vg_lite_uint8_t enable_r; /*! Enable R channel. */ - } vg_lite_pixel_channel_enable_t; - - /* Pixel color transform */ - typedef struct vg_lite_color_transform - { - vg_lite_float_t a_scale; - vg_lite_float_t a_bias; - vg_lite_float_t r_scale; - vg_lite_float_t r_bias; - vg_lite_float_t g_scale; - vg_lite_float_t g_bias; - vg_lite_float_t b_scale; - vg_lite_float_t b_bias; - } vg_lite_color_transform_t; - -/* VGLite API Functions *******************************************************************************************************************/ - - /* Initialize a vglite context. */ - vg_lite_error_t vg_lite_init(vg_lite_int32_t tess_width, vg_lite_int32_t tess_height); - - /* Destroy a vglite context. */ - vg_lite_error_t vg_lite_close(void); - - /* Get the VGLite driver information. */ - vg_lite_error_t vg_lite_get_info(vg_lite_info_t* info); - - /* Get the GPU chip information. */ - vg_lite_uint32_t vg_lite_get_product_info(vg_lite_char *name, vg_lite_uint32_t *chip_id, vg_lite_uint32_t *chip_rev); - - /* Query if a specific feature is supported. */ - vg_lite_uint32_t vg_lite_query_feature(vg_lite_feature_t feature); - - /* Flush command buffer and wait for GPU to complete. */ - vg_lite_error_t vg_lite_finish(void); - - /* Flush the command buffer without waiting for GPU to complete. */ - vg_lite_error_t vg_lite_flush(void); - - /* Get the value of register from register's address. */ - vg_lite_error_t vg_lite_get_register(vg_lite_uint32_t address, vg_lite_uint32_t* result); - - /* Generate a 3x3 homogenous matrix to transform 4 source coordinates to 4 target coordinates. */ - vg_lite_error_t vg_lite_get_transform_matrix(vg_lite_point4_t src, vg_lite_point4_t dst, vg_lite_matrix_t *mat); - - /* Allocate a buffer from GPU hardware accessible memory. */ - vg_lite_error_t vg_lite_allocate(vg_lite_buffer_t *buffer); - - /* Free a buffer allocated by vg_lite_allocate() */ - vg_lite_error_t vg_lite_free(vg_lite_buffer_t *buffer); - - /* Upload RGB or YUV pixel data to an allocated buffer. */ - vg_lite_error_t vg_lite_upload_buffer(vg_lite_buffer_t *buffer, vg_lite_uint8_t *data[3], vg_lite_uint32_t stride[3]); - - /* Map a buffer into hardware accessible address space. */ - vg_lite_error_t vg_lite_map(vg_lite_buffer_t *buffer, vg_lite_map_flag_t flag, int32_t fd); - - /* Unmap a buffer that is mapped */ - vg_lite_error_t vg_lite_unmap(vg_lite_buffer_t *buffer); - - /* flush cache */ - vg_lite_error_t vg_lite_flush_mapped_buffer(vg_lite_buffer_t * buffer); - - /* Fill a buffer rectangle area with a specified color. */ - vg_lite_error_t vg_lite_clear(vg_lite_buffer_t *target, vg_lite_rectangle_t *rect, vg_lite_color_t color); - - /* Copy a source image to target buffer with transformation, blending, color mixing, and filtering. */ - vg_lite_error_t vg_lite_blit(vg_lite_buffer_t *target, - vg_lite_buffer_t *source, - vg_lite_matrix_t *matrix, - vg_lite_blend_t blend, - vg_lite_color_t color, - vg_lite_filter_t filter); - - /* Copy a rectangle area of source image to target buffer with transformation, blending, color mixing, and filtering. */ - vg_lite_error_t vg_lite_blit_rect(vg_lite_buffer_t *target, - vg_lite_buffer_t *source, - vg_lite_rectangle_t *rect, - vg_lite_matrix_t *matrix, - vg_lite_blend_t blend, - vg_lite_color_t color, - vg_lite_filter_t filter); - - /* Copy two source images to the target buffer with transformation, blending, and filtering. */ - vg_lite_error_t vg_lite_blit2(vg_lite_buffer_t *target, - vg_lite_buffer_t *source0, - vg_lite_buffer_t *source1, - vg_lite_matrix_t *matrix0, - vg_lite_matrix_t *matrix1, - vg_lite_blend_t blend, - vg_lite_filter_t filter); - - /* Copy a rectangle area of source image to target buffer without transformation, blending, color mixing, and filtering. */ - vg_lite_error_t vg_lite_copy_image(vg_lite_buffer_t *target, - vg_lite_buffer_t *source, - vg_lite_int32_t sx, - vg_lite_int32_t sy, - vg_lite_int32_t dx, - vg_lite_int32_t dy, - vg_lite_int32_t width, - vg_lite_int32_t height); - - /* Draw a path to a target buffer with transformation, color, and blending */ - vg_lite_error_t vg_lite_draw(vg_lite_buffer_t *target, - vg_lite_path_t *path, - vg_lite_fill_t fill_rule, - vg_lite_matrix_t *matrix, - vg_lite_blend_t blend, - vg_lite_color_t color); - - /* Set stroke path attributes. */ - vg_lite_error_t vg_lite_set_stroke(vg_lite_path_t *path, - vg_lite_cap_style_t cap_style, - vg_lite_join_style_t join_style, - vg_lite_float_t line_width, - vg_lite_float_t miter_limit, - vg_lite_float_t *dash_pattern, - vg_lite_uint32_t pattern_count, - vg_lite_float_t dash_phase, - vg_lite_color_t color); - - /* Update stroke path. */ - vg_lite_error_t vg_lite_update_stroke(vg_lite_path_t *path); - - /* Set path type. */ - vg_lite_error_t vg_lite_set_path_type(vg_lite_path_t *path, vg_lite_path_type_t path_type); - - /* Clears all attributes of a path. */ - vg_lite_error_t vg_lite_clear_path(vg_lite_path_t *path); - - /* Upload a path to GPU memory so GPU can access it directly. */ - vg_lite_error_t vg_lite_upload_path(vg_lite_path_t *path); - - /* Initialize a path object with attributes. */ - vg_lite_error_t vg_lite_init_path(vg_lite_path_t *path, - vg_lite_format_t format, - vg_lite_quality_t quality, - vg_lite_uint32_t length, - vg_lite_pointer data, - vg_lite_float_t min_x, - vg_lite_float_t min_y, - vg_lite_float_t max_x, - vg_lite_float_t max_y); - - /* Initializes a arc path with attributes. */ - vg_lite_error_t vg_lite_init_arc_path(vg_lite_path_t *path, - vg_lite_format_t format, - vg_lite_quality_t quality, - vg_lite_uint32_t length, - vg_lite_pointer data, - vg_lite_float_t min_x, - vg_lite_float_t min_y, - vg_lite_float_t max_x, - vg_lite_float_t max_y); - - /* Return the size (in bytes) of command buffer for a path opcode array. */ - vg_lite_uint32_t vg_lite_get_path_length(vg_lite_uint8_t *opcode, - vg_lite_uint32_t count, - vg_lite_format_t format); - - /* Generate command buffer for the (path) based on input opcodes (opcode) and coordinates (data). */ - vg_lite_error_t vg_lite_append_path(vg_lite_path_t *path, - vg_lite_uint8_t *opcode, - vg_lite_pointer data, - vg_lite_uint32_t seg_count); - - /* Set CLUT (Color Look Up Table) for index image. The (colors) is in ARGB format. */ - vg_lite_error_t vg_lite_set_CLUT(vg_lite_uint32_t count, vg_lite_uint32_t *colors); - - /* Draw a path that is filled by a transformed image pattern. */ - vg_lite_error_t vg_lite_draw_pattern(vg_lite_buffer_t *target, - vg_lite_path_t *path, - vg_lite_fill_t fill_rule, - vg_lite_matrix_t *path_matrix, - vg_lite_buffer_t *pattern_image, - vg_lite_matrix_t *pattern_matrix, - vg_lite_blend_t blend, - vg_lite_pattern_mode_t pattern_mode, - vg_lite_color_t pattern_color, - vg_lite_color_t color, - vg_lite_filter_t filter); - - /* Initialize a linear gradient object with default attributes. */ - vg_lite_error_t vg_lite_init_grad(vg_lite_linear_gradient_t *grad); - - /* Reset a linear gradient object attributes. */ - vg_lite_error_t vg_lite_clear_grad(vg_lite_linear_gradient_t *grad); - - /* Update a linear gradient object. */ - vg_lite_error_t vg_lite_update_grad(vg_lite_linear_gradient_t *grad); - - /* Return pointer to a linear gradient object's matrix. */ - vg_lite_matrix_t* vg_lite_get_grad_matrix(vg_lite_linear_gradient_t *grad); - - /* Set attributes for a linear gradient object. */ - vg_lite_error_t vg_lite_set_grad(vg_lite_linear_gradient_t *grad, - vg_lite_uint32_t count, - vg_lite_uint32_t *colors, - vg_lite_uint32_t *stops); - - /* Draw a path with a linear gradient object pattern. */ - vg_lite_error_t vg_lite_draw_grad(vg_lite_buffer_t *target, - vg_lite_path_t *path, - vg_lite_fill_t fill_rule, - vg_lite_matrix_t *matrix, - vg_lite_linear_gradient_t *grad, - vg_lite_blend_t blend); - - /* Reset an extended linear gradient object attributes and free image buffer. */ - vg_lite_error_t vg_lite_clear_linear_grad(vg_lite_ext_linear_gradient_t *grad); - - /* Update an extended linear gradient object. */ - vg_lite_error_t vg_lite_update_linear_grad(vg_lite_ext_linear_gradient_t *grad); - - /* Return pointer to an extended linear gradient object's matrix. */ - vg_lite_matrix_t* vg_lite_get_linear_grad_matrix(vg_lite_ext_linear_gradient_t *grad); - - /* Set attributes for an extended linear gradient object. */ - vg_lite_error_t vg_lite_set_linear_grad(vg_lite_ext_linear_gradient_t *grad, - vg_lite_uint32_t count, - vg_lite_color_ramp_t *color_ramp, - vg_lite_linear_gradient_parameter_t grad_param, - vg_lite_gradient_spreadmode_t spread_mode, - vg_lite_uint8_t pre_mult); - - /* Draw a path with an extended linear gradient object. */ - vg_lite_error_t vg_lite_draw_linear_grad(vg_lite_buffer_t *target, - vg_lite_path_t *path, - vg_lite_fill_t fill_rule, - vg_lite_matrix_t *path_matrix, - vg_lite_ext_linear_gradient_t *grad, - vg_lite_color_t paint_color, - vg_lite_blend_t blend, - vg_lite_filter_t filter); - - /* Reset a radial gradient object attributes and free image buffer. */ - vg_lite_error_t vg_lite_clear_radial_grad(vg_lite_radial_gradient_t *grad); - - /* Update a radial gradient object. */ - vg_lite_error_t vg_lite_update_radial_grad(vg_lite_radial_gradient_t *grad); - - /* Return pointer to a radial gradient object's matrix. */ - vg_lite_matrix_t* vg_lite_get_radial_grad_matrix(vg_lite_radial_gradient_t *grad); - - /* Set attributes for a radial gradient object. */ - vg_lite_error_t vg_lite_set_radial_grad(vg_lite_radial_gradient_t *grad, - vg_lite_uint32_t count, - vg_lite_color_ramp_t *color_ramp, - vg_lite_radial_gradient_parameter_t grad_param, - vg_lite_gradient_spreadmode_t spread_mode, - vg_lite_uint8_t pre_mult); - - /* Draw a path with a radial gradient object pattern. */ - vg_lite_error_t vg_lite_draw_radial_grad(vg_lite_buffer_t *target, - vg_lite_path_t *path, - vg_lite_fill_t fill_rule, - vg_lite_matrix_t *path_matrix, - vg_lite_radial_gradient_t *grad, - vg_lite_color_t paint_color, - vg_lite_blend_t blend, - vg_lite_filter_t filter); - - /* Load an identity matrix. */ - vg_lite_error_t vg_lite_identity(vg_lite_matrix_t *matrix); - - /* Translate a matrix. */ - vg_lite_error_t vg_lite_translate(vg_lite_float_t x, vg_lite_float_t y, vg_lite_matrix_t *matrix); - - /* Scale a matrix. */ - vg_lite_error_t vg_lite_scale(vg_lite_float_t scale_x, vg_lite_float_t scale_y, vg_lite_matrix_t *matrix); - - /* Rotate a matrix. */ - vg_lite_error_t vg_lite_rotate(vg_lite_float_t degrees, vg_lite_matrix_t *matrix); - - /* Set and enable a scissor rectangle for render target. */ - vg_lite_error_t vg_lite_set_scissor(vg_lite_int32_t x, vg_lite_int32_t y, vg_lite_int32_t right, vg_lite_int32_t bottom); - - /* Set scissor rectangles on mask layer. Scissor rects are enabled/disabled by following APIs. */ - vg_lite_error_t vg_lite_scissor_rects(vg_lite_uint32_t nums, vg_lite_rectangle_t rect[]); - - /* Enable scissor rects defined on mask layer. */ - vg_lite_error_t vg_lite_enable_scissor(void); - - /* Disable scissor rects defined on mask layer. */ - vg_lite_error_t vg_lite_disable_scissor(void); - - /* Query size of available contiguous video memory. */ - vg_lite_error_t vg_lite_get_mem_size(vg_lite_uint32_t *size); - - /* Set global alpha value for source image */ - vg_lite_error_t vg_lite_source_global_alpha(vg_lite_global_alpha_t alpha_mode, vg_lite_uint8_t alpha_value); - - /* Set global alpha value for destination image. */ - vg_lite_error_t vg_lite_dest_global_alpha(vg_lite_global_alpha_t alpha_mode, vg_lite_uint8_t alpha_value); - - /* Set colorkey. */ - vg_lite_error_t vg_lite_set_color_key(vg_lite_color_key4_t colorkey); - - /* Enable dither function. Dither is OFF by default. */ - vg_lite_error_t vg_lite_enable_dither(void); - - /* Disable dither function. Dither is OFF by default. */ - vg_lite_error_t vg_lite_disable_dither(void); - - /* Set a 64-byte aligned memory buffer (physical) as VGLite tessellation buffer. */ - vg_lite_error_t vg_lite_set_tess_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size); - - /* Can be called before vg_lite_init() to overwrite the default VG_LITE_COMMAND_BUFFER_SIZE */ - vg_lite_error_t vg_lite_set_command_buffer_size(vg_lite_uint32_t size); - - /* Set a user-defined external memory buffer (physical, 64-byte aligned) as VGLite command buffer. */ - vg_lite_error_t vg_lite_set_command_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size); - - /* Setup a pixel transform matrix m[20] which transforms each pixel as following: - * - * |a'| |m0 m1 m2 m3 m4 | |a| - * |r'| |m5 m6 m7 m8 m9 | |r| - * |g'| = |m10 m11 m12 m13 m14|.|g| - * |b'| |m15 m16 m17 m18 m19| |b| - * |1 | |0 0 0 0 1 | |1| - * - * The pixel transform for A, R, G, B channel can be enabled/disabled individually with (channel) parameter. - */ - vg_lite_error_t vg_lite_set_pixel_matrix(vg_lite_pixel_matrix_t matrix, vg_lite_pixel_channel_enable_t *channel); - - /* Setup 3x3 gaussian blur weight values to filter image pixels. - * - * Parameters w0, w1, w2 define a 3x3 gaussian blur weight matrix as below - * - * | w2 w1 w2 | - * | w1 w0 w1 | - * | w2 w1 w2 | - * - * The sum of 9 kernel weights must be 1.0 to avoid convolution overflow ( w0 + 4*w1 + 4*w2 = 1.0 ). - * The 3x3 weight matrix applies to a 3x3 pixel block - * - * | pixel[i-1][j-1] pixel[i][j-1] pixel[i+1][j-1]| - * | pixel[i-1][j] pixel[i][j] pixel[i+1][j] | - * | pixel[i-1][j+1] pixel[i][j+1] pixel[i+1][j+1]| - * - * With the following dot product equation: - * - * color[i][j] = w2*pixel[i-1][j-1] + w1*pixel[i][j-1] + w2*pixel[i+1][j-1] - * + w1*pixel[i-1][j] + w0*pixel[i][j] + w1*pixel[i+1][j] - * + w2*pixel[i-1][j+1] + w1*pixel[i][j+1] + w2*pixel[i+1][j+1]; - */ - vg_lite_error_t vg_lite_gaussian_filter(vg_lite_float_t w0, vg_lite_float_t w1, vg_lite_float_t w2); - - /* Enable masklayer function. Masklayer is OFF by default. */ - vg_lite_error_t vg_lite_enable_masklayer(void); - - /* Disable masklayer function. Masklayer is OFF by default. */ - vg_lite_error_t vg_lite_disable_masklayer(void); - - /* Setup a masklayer. */ - vg_lite_error_t vg_lite_set_masklayer(vg_lite_buffer_t *masklayer); - - /* Free a masklayer and disable mask operation. */ - vg_lite_error_t vg_lite_destroy_masklayer(vg_lite_buffer_t *masklayer); - - /* Create a masklayer with default format A8 and default pixel value 255. */ - vg_lite_error_t vg_lite_create_masklayer(vg_lite_buffer_t *masklayer, - vg_lite_uint32_t width, - vg_lite_uint32_t height); - - /* Set pixel values for a rectangle area in a masklayer */ - vg_lite_error_t vg_lite_fill_masklayer(vg_lite_buffer_t *masklayer, - vg_lite_rectangle_t *rect, - vg_lite_uint8_t value); - - /* Blend a rectangle area of src masklayer with dst masklayer according to (operation). */ - vg_lite_error_t vg_lite_blend_masklayer(vg_lite_buffer_t *dst, - vg_lite_buffer_t *src, - vg_lite_mask_operation_t operation, - vg_lite_rectangle_t *rect); - - /* Render a (path) with (fill_rule), (color), (matrix) to the masklayer. */ - vg_lite_error_t vg_lite_render_masklayer(vg_lite_buffer_t *masklayer, - vg_lite_mask_operation_t operation, - vg_lite_path_t *path, - vg_lite_fill_t fill_rule, - vg_lite_color_t color, - vg_lite_matrix_t *matrix); - - /* Set mirror orientation. */ - vg_lite_error_t vg_lite_set_mirror(vg_lite_orientation_t orientation); - - /* Set gamma value. */ - vg_lite_error_t vg_lite_set_gamma(vg_lite_gamma_conversion_t gamma_value); - - /* Enable color transformation, which is OFF by default. */ - vg_lite_error_t vg_lite_enable_color_transform(void); - - /* Disable color transformation, which is OFF by default. */ - vg_lite_error_t vg_lite_disable_color_transform(void); - - /* Set pixel color transformation scale and bias values for each pixel channel. */ - vg_lite_error_t vg_lite_set_color_transform(vg_lite_color_transform_t *values); - - /* Set flexa stream id. */ - vg_lite_error_t vg_lite_flexa_set_stream(vg_lite_uint8_t stream_id); - - /* set flexa background buffer.*/ - vg_lite_error_t vg_lite_flexa_bg_buffer(vg_lite_uint8_t stream_id, - vg_lite_buffer_t *buffer, - vg_lite_uint32_t seg_count, - vg_lite_uint32_t seg_size); - - /* Enable flexa. */ - vg_lite_error_t vg_lite_flexa_enable(void); - - /* Disable flexa.*/ - vg_lite_error_t vg_lite_flexa_disable(void); - - /* Set flexa stop flag after the last frame. */ - vg_lite_error_t vg_lite_flexa_stop_frame(void); - - /* Dump command buffer */ - vg_lite_error_t vg_lite_dump_command_buffer(void); - - /* Return VGLite parameters in params[] array */ - vg_lite_error_t vg_lite_get_parameter(vg_lite_param_type_t type, - vg_lite_int32_t count, - vg_lite_float_t* params); - -#endif /* VGLITE_VERSION_3_0 */ - -#ifdef __cplusplus -} -#endif -#endif /* _vg_lite_h_ */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/vg_lite_tvg/vg_lite_matrix.c b/software/Power_Pico/Middlewares/LVGL/src/others/vg_lite_tvg/vg_lite_matrix.c deleted file mode 100644 index 42f8ce3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/vg_lite_tvg/vg_lite_matrix.c +++ /dev/null @@ -1,162 +0,0 @@ -/** - * @file vg_lite_matrix.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" - -#if LV_USE_DRAW_VG_LITE && LV_USE_VG_LITE_THORVG - -#include -#include -#include "vg_lite.h" - -/********************* - * DEFINES - *********************/ - -#define VG_SW_BLIT_PRECISION_OPT 1 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -vg_lite_error_t vg_lite_identity(vg_lite_matrix_t * matrix) -{ - /* Set identify matrix. */ - matrix->m[0][0] = 1.0f; - matrix->m[0][1] = 0.0f; - matrix->m[0][2] = 0.0f; - matrix->m[1][0] = 0.0f; - matrix->m[1][1] = 1.0f; - matrix->m[1][2] = 0.0f; - matrix->m[2][0] = 0.0f; - matrix->m[2][1] = 0.0f; - matrix->m[2][2] = 1.0f; - -#if VG_SW_BLIT_PRECISION_OPT - matrix->scaleX = 1.0f; - matrix->scaleY = 1.0f; - matrix->angle = 0.0f; -#endif /* VG_SW_BLIT_PRECISION_OPT */ - - return VG_LITE_SUCCESS; -} - -static void multiply(vg_lite_matrix_t * matrix, vg_lite_matrix_t * mult) -{ - vg_lite_matrix_t temp; - int row, column; - - /* Process all rows. */ - for(row = 0; row < 3; row++) { - /* Process all columns. */ - for(column = 0; column < 3; column++) { - /* Compute matrix entry. */ - temp.m[row][column] = (matrix->m[row][0] * mult->m[0][column]) - + (matrix->m[row][1] * mult->m[1][column]) - + (matrix->m[row][2] * mult->m[2][column]); - } - } - - /* Copy temporary matrix into result. */ -#if VG_SW_BLIT_PRECISION_OPT - memcpy(matrix, &temp, sizeof(vg_lite_float_t) * 9); -#else - memcpy(matrix, &temp, sizeof(temp)); -#endif /* VG_SW_BLIT_PRECISION_OPT */ -} - -vg_lite_error_t vg_lite_translate(vg_lite_float_t x, vg_lite_float_t y, vg_lite_matrix_t * matrix) -{ - /* Set translation matrix. */ - vg_lite_matrix_t t = { { {1.0f, 0.0f, x}, - {0.0f, 1.0f, y}, - {0.0f, 0.0f, 1.0f}, - }, - 0.0f, 0.0f, 0.0f - }; - - /* Multiply with current matrix. */ - multiply(matrix, &t); - - return VG_LITE_SUCCESS; -} - -vg_lite_error_t vg_lite_scale(vg_lite_float_t scale_x, vg_lite_float_t scale_y, vg_lite_matrix_t * matrix) -{ - /* Set scale matrix. */ - vg_lite_matrix_t s = { { {scale_x, 0.0f, 0.0f}, - {0.0f, scale_y, 0.0f}, - {0.0f, 0.0f, 1.0f}, - }, - 0.0f, 0.0f, 0.0f - }; - - /* Multiply with current matrix. */ - multiply(matrix, &s); - -#if VG_SW_BLIT_PRECISION_OPT - matrix->scaleX = matrix->scaleX * scale_x; - matrix->scaleY = matrix->scaleY * scale_y; -#endif /* VG_SW_BLIT_PRECISION_OPT */ - - return VG_LITE_SUCCESS; -} - -vg_lite_error_t vg_lite_rotate(vg_lite_float_t degrees, vg_lite_matrix_t * matrix) -{ - /* Convert degrees into radians. */ - vg_lite_float_t angle = (degrees / 180.0f) * 3.141592654f; - - /* Compute cosine and sine values. */ - vg_lite_float_t cos_angle = cosf(angle); - vg_lite_float_t sin_angle = sinf(angle); - - /* Set rotation matrix. */ - vg_lite_matrix_t r = { { {cos_angle, -sin_angle, 0.0f}, - {sin_angle, cos_angle, 0.0f}, - {0.0f, 0.0f, 1.0f}, - }, - 0.0f, 0.0f, 0.0f - }; - - /* Multiply with current matrix. */ - multiply(matrix, &r); - -#if VG_SW_BLIT_PRECISION_OPT - matrix->angle = matrix->angle + degrees; - if(matrix->angle >= 360) { - vg_lite_uint32_t count = (vg_lite_uint32_t)matrix->angle / 360; - matrix->angle = matrix->angle - count * 360; - } -#endif /* VG_SW_BLIT_PRECISION_OPT */ - - return VG_LITE_SUCCESS; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_VG_LITE_THORVG*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/others/vg_lite_tvg/vg_lite_tvg.cpp b/software/Power_Pico/Middlewares/LVGL/src/others/vg_lite_tvg/vg_lite_tvg.cpp deleted file mode 100644 index 28338be..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/others/vg_lite_tvg/vg_lite_tvg.cpp +++ /dev/null @@ -1,2767 +0,0 @@ -/** - * @file vg_lite_tvg.cpp - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_DRAW_VG_LITE && LV_USE_VG_LITE_THORVG - -#include "vg_lite.h" -#include "../../lvgl.h" -#include "../../libs/thorvg/thorvg.h" -#include -#include -#include -#include -#include -#include - -#if LV_VG_LITE_THORVG_YUV_SUPPORT - #include -#endif - -/********************* - * DEFINES - *********************/ - -#define TVG_CANVAS_ENGINE CanvasEngine::Sw -#define TVG_COLOR(COLOR) B(COLOR), G(COLOR), R(COLOR), A(COLOR) -#define TVG_IS_VG_FMT_SUPPORT(fmt) ((fmt) == VG_LITE_BGRA8888 || (fmt) == VG_LITE_BGRX8888) - -#define TVG_CHECK_RETURN_VG_ERROR(FUNC) \ - do { \ - Result res = FUNC; \ - if (res != Result::Success) { \ - LV_LOG_ERROR("Executed '" #FUNC "' error: %d", (int)res); \ - return vg_lite_error_conv(res); \ - } \ - } while (0) -#define TVG_CHECK_RETURN_RESULT(FUNC) \ - do { \ - Result res = FUNC; \ - if (res != Result::Success) { \ - LV_LOG_ERROR("Executed '" #FUNC "' error: %d", (int)res);\ - return res; \ - } \ - } while (0) - -/* clang-format off */ - -#define IS_INDEX_FMT(fmt) \ - ((fmt) == VG_LITE_INDEX_1 \ - || (fmt) == VG_LITE_INDEX_2 \ - || (fmt) == VG_LITE_INDEX_4 \ - || (fmt) == VG_LITE_INDEX_8) - -#define VLC_GET_ARG(CUR, INDEX) vlc_get_arg((cur + (INDEX) * fmt_len), path->format); -#define VLC_GET_OP_CODE(ptr) (*((uint8_t*)ptr)) -#define VLC_OP_ARG_LEN(OP, LEN) \ - case VLC_OP_##OP: \ - return (LEN) - -#define A(color) ((color) >> 24) -#define R(color) (((color) & 0x00ff0000) >> 16) -#define G(color) (((color) & 0x0000ff00) >> 8) -#define B(color) ((color) & 0xff) -#define ARGB(a, r, g, b) ((a) << 24) | ((r) << 16) | ((g) << 8) | (b) -#define MIN(a, b) (a) > (b) ? (b) : (a) -#define MAX(a, b) (a) > (b) ? (a) : (b) -#define UDIV255(x) (((x) * 0x8081U) >> 0x17) -#define LERP(v1, v2, w) ((v1) * (w) + (v2) * (1.0f - (w))) -#define CLAMP(x, min, max) (((x) < (min)) ? (min) : ((x) > (max)) ? (max) : (x)) -#define COLOR_FROM_RAMP(ColorRamp) (((vg_lite_float_t*)ColorRamp) + 1) - -#define VG_LITE_RETURN_ERROR(func) \ - if ((error = func) != VG_LITE_SUCCESS) \ - return error - -#define VG_LITE_ALIGN(number, align_bytes) \ - (((number) + ((align_bytes)-1)) & ~((align_bytes)-1)) - -#define VG_LITE_IS_ALIGNED(num, align) (((uintptr_t)(num) & ((align)-1)) == 0) - -#define VG_LITE_IS_ALPHA_FORMAT(format) \ - ((format) == VG_LITE_A8 || (format) == VG_LITE_A4) - -/* clang-format on */ - -/********************** - * TYPEDEFS - **********************/ - -using namespace tvg; - -#pragma pack(1) -typedef struct { - uint8_t blue; - uint8_t green; - uint8_t red; -} vg_color24_t; - -typedef struct { - uint16_t blue : 5; - uint16_t green : 6; - uint16_t red : 5; -} vg_color16_t; - -typedef struct { - vg_color16_t c; - uint8_t alpha; -} vg_color16_alpha_t; - -typedef struct { - uint8_t blue; - uint8_t green; - uint8_t red; - uint8_t alpha; -} vg_color32_t; - -typedef struct { - vg_lite_float_t x; - vg_lite_float_t y; -} vg_lite_fpoint_t; - -#pragma pack() - -class vg_lite_ctx -{ - public: - std::unique_ptr canvas; - void * target_buffer; - vg_lite_uint32_t target_px_size; - vg_lite_buffer_format_t target_format; - - public: - vg_lite_ctx() - : target_buffer { nullptr } - , target_px_size { 0 } - , target_format { VG_LITE_BGRA8888 } - , clut_2colors { 0 } - , clut_4colors { 0 } - , clut_16colors { 0 } - , clut_256colors { 0 } - { - canvas = SwCanvas::gen(); - } - - vg_lite_uint32_t * get_image_buffer(vg_lite_uint32_t w, vg_lite_uint32_t h) - { - src_buffer.resize(w * h); - return src_buffer.data(); - } - - vg_lite_uint32_t * get_temp_target_buffer(vg_lite_uint32_t w, vg_lite_uint32_t h) - { - vg_lite_uint32_t px_size = w * h; - if(px_size > dest_buffer.size()) { - dest_buffer.resize(w * h); - } - return dest_buffer.data(); - } - - vg_lite_uint32_t * get_temp_target_buffer() - { - return dest_buffer.data(); - } - - void set_CLUT(vg_lite_uint32_t count, const vg_lite_uint32_t * colors) - { - switch(count) { - case 2: - memcpy(clut_2colors, colors, sizeof(clut_2colors)); - break; - case 4: - memcpy(clut_4colors, colors, sizeof(clut_4colors)); - break; - case 16: - memcpy(clut_16colors, colors, sizeof(clut_16colors)); - break; - case 256: - memcpy(clut_256colors, colors, sizeof(clut_256colors)); - break; - default: - LV_ASSERT(false); - break; - } - } - - const vg_lite_uint32_t * get_CLUT(vg_lite_buffer_format_t format) - { - switch(format) { - case VG_LITE_INDEX_1: - return clut_2colors; - - case VG_LITE_INDEX_2: - return clut_2colors; - - case VG_LITE_INDEX_4: - return clut_4colors; - - case VG_LITE_INDEX_8: - return clut_256colors; - - default: - break; - } - - LV_ASSERT(false); - return nullptr; - } - - static vg_lite_ctx * get_instance() - { - static vg_lite_ctx instance; - return &instance; - } - - private: - /* */ - std::vector src_buffer; - std::vector dest_buffer; - - vg_lite_uint32_t clut_2colors[2]; - vg_lite_uint32_t clut_4colors[4]; - vg_lite_uint32_t clut_16colors[16]; - vg_lite_uint32_t clut_256colors[256]; -}; - -template -class vg_lite_converter -{ - public: - typedef void (*converter_cb_t)(DEST_TYPE * dest, const SRC_TYPE * src, vg_lite_uint32_t px_size, - vg_lite_uint32_t color); - - public: - vg_lite_converter(converter_cb_t converter) - : _converter_cb(converter) - { - } - - void convert(vg_lite_buffer_t * dest_buf, const vg_lite_buffer_t * src_buf, vg_lite_uint32_t color = 0) - { - LV_ASSERT(_converter_cb); - uint8_t * dest = (uint8_t *)dest_buf->memory; - const uint8_t * src = (const uint8_t *)src_buf->memory; - vg_lite_uint32_t h = src_buf->height; - - while(h--) { - _converter_cb((DEST_TYPE *)dest, (const SRC_TYPE *)src, src_buf->width, color); - dest += dest_buf->stride; - src += src_buf->stride; - } - } - - private: - converter_cb_t _converter_cb; -}; - -typedef vg_lite_float_t FLOATVECTOR4[4]; - -/********************** - * STATIC PROTOTYPES - **********************/ - -static vg_lite_error_t vg_lite_error_conv(Result result); -static Matrix matrix_conv(const vg_lite_matrix_t * matrix); -static FillRule fill_rule_conv(vg_lite_fill_t fill); -static BlendMethod blend_method_conv(vg_lite_blend_t blend); -static StrokeCap stroke_cap_conv(vg_lite_cap_style_t cap); -static StrokeJoin stroke_join_conv(vg_lite_join_style_t join); -static FillSpread fill_spread_conv(vg_lite_gradient_spreadmode_t spread); -static Result shape_append_path(std::unique_ptr & shape, vg_lite_path_t * path, vg_lite_matrix_t * matrix); -static Result shape_append_rect(std::unique_ptr & shape, const vg_lite_buffer_t * target, - const vg_lite_rectangle_t * rect); -static Result canvas_set_target(vg_lite_ctx * ctx, vg_lite_buffer_t * target); -static Result picture_load(vg_lite_ctx * ctx, std::unique_ptr & picture, const vg_lite_buffer_t * source, - vg_lite_color_t color = 0); - -static inline bool math_zero(float a) -{ - return (fabs(a) < FLT_EPSILON); -} - -static inline bool math_equal(float a, float b) -{ - return math_zero(a - b); -} - -static void ClampColor(FLOATVECTOR4 Source, FLOATVECTOR4 Target, uint8_t Premultiplied); -static uint8_t PackColorComponent(vg_lite_float_t value); -static void get_format_bytes(vg_lite_buffer_format_t format, - vg_lite_uint32_t * mul, - vg_lite_uint32_t * div, - vg_lite_uint32_t * bytes_align); - -static vg_lite_fpoint_t matrix_transform_point(const vg_lite_matrix_t * matrix, const vg_lite_fpoint_t * point); -static bool vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix); -static void vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult); - -/********************** - * STATIC VARIABLES - **********************/ - -/* color converters */ - -static vg_lite_converter conv_bgra8888_to_bgr565( - [](vg_color16_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) -{ - while(px_size--) { - dest->red = src->red * 0x1F / 0xFF; - dest->green = src->green * 0x3F / 0xFF; - dest->blue = src->blue * 0x1F / 0xFF; - src++; - dest++; - } -}); - -static vg_lite_converter conv_bgra8888_to_bgra5658( - [](vg_color16_alpha_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) -{ - while(px_size--) { - dest->c.red = src->red * 0x1F / 0xFF; - dest->c.green = src->green * 0x3F / 0xFF; - dest->c.blue = src->blue * 0x1F / 0xFF; - dest->alpha = src->alpha; - src++; - dest++; - } -}); - -static vg_lite_converter conv_bgr565_to_bgra8888( - [](vg_color32_t * dest, const vg_color16_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) -{ - while(px_size--) { - dest->red = src->red * 0xFF / 0x1F; - dest->green = src->green * 0xFF / 0x3F; - dest->blue = src->blue * 0xFF / 0x1F; - dest->alpha = 0xFF; - src++; - dest++; - } -}); - -static vg_lite_converter conv_bgra5658_to_bgra8888( - [](vg_color32_t * dest, const vg_color16_alpha_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) -{ - while(px_size--) { - dest->red = src->c.red * 0xFF / 0x1F; - dest->green = src->c.green * 0xFF / 0x3F; - dest->blue = src->c.blue * 0xFF / 0x1F; - dest->alpha = src->alpha; - src++; - dest++; - } -}); - -static vg_lite_converter conv_bgrx8888_to_bgra8888( - [](vg_color32_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) -{ - while(px_size--) { - *dest = *src; - dest->alpha = 0xFF; - dest++; - src++; - } -}); - -static vg_lite_converter conv_bgr888_to_bgra8888( - [](vg_color32_t * dest, const vg_color24_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) -{ - while(px_size--) { - dest->red = src->red; - dest->green = src->green; - dest->blue = src->blue; - dest->alpha = 0xFF; - src++; - dest++; - } -}); - -static vg_lite_converter conv_alpha8_to_bgra8888( - [](vg_color32_t * dest, const uint8_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t color) -{ - while(px_size--) { - uint8_t alpha = *src; - dest->alpha = alpha; - dest->red = UDIV255(B(color) * alpha); - dest->green = UDIV255(G(color) * alpha); - dest->blue = UDIV255(R(color) * alpha); - dest++; - src++; - } -}); - -static vg_lite_converter conv_alpha4_to_bgra8888( - [](vg_color32_t * dest, const uint8_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t color) -{ - /* 1 byte -> 2 px */ - px_size /= 2; - - while(px_size--) { - /* high 4bit */ - uint8_t alpha = (*src & 0xF0); - dest->alpha = alpha; - dest->red = UDIV255(B(color) * alpha); - dest->green = UDIV255(G(color) * alpha); - dest->blue = UDIV255(R(color) * alpha); - dest++; - - /* low 4bit */ - alpha = (*src & 0x0F) << 4; - dest->alpha = alpha; - dest->red = UDIV255(B(color) * alpha); - dest->green = UDIV255(G(color) * alpha); - dest->blue = UDIV255(R(color) * alpha); - - dest++; - src++; - } -}); - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -extern "C" { - - void gpu_init(void) - { - vg_lite_init(0, 0); - } - - vg_lite_error_t vg_lite_allocate(vg_lite_buffer_t * buffer) - { - if(buffer->format == VG_LITE_RGBA8888_ETC2_EAC && (buffer->width % 16 || buffer->height % 4)) { - return VG_LITE_INVALID_ARGUMENT; - } - - /* Reset planar. */ - buffer->yuv.uv_planar = buffer->yuv.v_planar = buffer->yuv.alpha_planar = 0; - - /* Align height in case format is tiled. */ - if(buffer->format >= VG_LITE_YUY2 && buffer->format <= VG_LITE_NV16) { - buffer->height = VG_LITE_ALIGN(buffer->height, 4); - buffer->yuv.swizzle = VG_LITE_SWIZZLE_UV; - } - - if(buffer->format >= VG_LITE_YUY2_TILED && buffer->format <= VG_LITE_AYUY2_TILED) { - buffer->height = VG_LITE_ALIGN(buffer->height, 4); - buffer->tiled = VG_LITE_TILED; - buffer->yuv.swizzle = VG_LITE_SWIZZLE_UV; - } - - vg_lite_uint32_t mul, div, align; - get_format_bytes(buffer->format, &mul, &div, &align); - vg_lite_uint32_t stride = VG_LITE_ALIGN((buffer->width * mul / div), align); - - buffer->stride = stride; - - /* Size must be multiple of align, See: https://en.cppreference.com/w/c/memory/aligned_alloc */ - size_t size = VG_LITE_ALIGN(buffer->height * stride, LV_VG_LITE_THORVG_BUF_ADDR_ALIGN); -#ifndef _WIN32 - buffer->memory = aligned_alloc(LV_VG_LITE_THORVG_BUF_ADDR_ALIGN, size); -#else - buffer->memory = _aligned_malloc(size, LV_VG_LITE_THORVG_BUF_ADDR_ALIGN); -#endif - LV_ASSERT(buffer->memory); - buffer->address = (vg_lite_uint32_t)(uintptr_t)buffer->memory; - buffer->handle = buffer->memory; - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_free(vg_lite_buffer_t * buffer) - { - LV_ASSERT(buffer->memory); -#ifndef _WIN32 - free(buffer->memory); -#else - _aligned_free(buffer->memory); -#endif - memset(buffer, 0, sizeof(vg_lite_buffer_t)); - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_upload_buffer(vg_lite_buffer_t * buffer, vg_lite_uint8_t * data[3], vg_lite_uint32_t stride[3]) - { - LV_UNUSED(buffer); - LV_UNUSED(data); - LV_UNUSED(stride); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_map(vg_lite_buffer_t * buffer, vg_lite_map_flag_t flag, int32_t fd) - { - LV_UNUSED(buffer); - LV_UNUSED(flag); - LV_UNUSED(fd); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_unmap(vg_lite_buffer_t * buffer) - { - LV_UNUSED(buffer); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_clear(vg_lite_buffer_t * target, vg_lite_rectangle_t * rectangle, vg_lite_color_t color) - { - auto ctx = vg_lite_ctx::get_instance(); - TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); - - auto shape = Shape::gen(); - TVG_CHECK_RETURN_VG_ERROR(shape_append_rect(shape, target, rectangle)); - TVG_CHECK_RETURN_VG_ERROR(shape->blend(BlendMethod::SrcOver)); - TVG_CHECK_RETURN_VG_ERROR(shape->fill(TVG_COLOR(color))); - TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(shape))); - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_blit(vg_lite_buffer_t * target, - vg_lite_buffer_t * source, - vg_lite_matrix_t * matrix, - vg_lite_blend_t blend, - vg_lite_color_t color, - vg_lite_filter_t filter) - { - LV_UNUSED(filter); - auto ctx = vg_lite_ctx::get_instance(); - canvas_set_target(ctx, target); - - auto picture = Picture::gen(); - - TVG_CHECK_RETURN_VG_ERROR(picture_load(ctx, picture, source, color)); - TVG_CHECK_RETURN_VG_ERROR(picture->transform(matrix_conv(matrix))); - TVG_CHECK_RETURN_VG_ERROR(picture->blend(blend_method_conv(blend))); - TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(picture))); - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_blit2(vg_lite_buffer_t * target, - vg_lite_buffer_t * source0, - vg_lite_buffer_t * source1, - vg_lite_matrix_t * matrix0, - vg_lite_matrix_t * matrix1, - vg_lite_blend_t blend, - vg_lite_filter_t filter) - { - if(!vg_lite_query_feature(gcFEATURE_BIT_VG_DOUBLE_IMAGE)) { - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t error; - - VG_LITE_RETURN_ERROR(vg_lite_blit(target, source0, matrix0, blend, 0, filter)); - VG_LITE_RETURN_ERROR(vg_lite_blit(target, source1, matrix1, blend, 0, filter)); - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_blit_rect(vg_lite_buffer_t * target, - vg_lite_buffer_t * source, - vg_lite_rectangle_t * rect, - vg_lite_matrix_t * matrix, - vg_lite_blend_t blend, - vg_lite_color_t color, - vg_lite_filter_t filter) - { - LV_UNUSED(filter); - auto ctx = vg_lite_ctx::get_instance(); - TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); - - auto shape = Shape::gen(); - TVG_CHECK_RETURN_VG_ERROR(shape_append_rect(shape, target, rect)); - TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(matrix))); - - auto picture = tvg::Picture::gen(); - TVG_CHECK_RETURN_VG_ERROR(picture_load(ctx, picture, source, color)); - TVG_CHECK_RETURN_VG_ERROR(picture->transform(matrix_conv(matrix))); - TVG_CHECK_RETURN_VG_ERROR(picture->blend(blend_method_conv(blend))); - TVG_CHECK_RETURN_VG_ERROR(picture->composite(std::move(shape), CompositeMethod::ClipPath)); - TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(picture))); - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_init(int32_t tessellation_width, int32_t tessellation_height) - { - LV_UNUSED(tessellation_width); - LV_UNUSED(tessellation_height); -#if LV_VG_LITE_THORVG_THREAD_RENDER - /* Threads Count */ - auto threads = std::thread::hardware_concurrency(); - if(threads > 0) { - --threads; /* Allow the designated main thread capacity */ - } -#endif - - /* Initialize ThorVG Engine */ - TVG_CHECK_RETURN_VG_ERROR(Initializer::init(TVG_CANVAS_ENGINE, 0)); - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_close(void) - { - TVG_CHECK_RETURN_VG_ERROR(Initializer::term(TVG_CANVAS_ENGINE)); - return VG_LITE_SUCCESS; - } - - static void picture_bgra8888_to_bgr565(vg_color16_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) - { - while(px_size--) { - dest->red = src->red * 0x1F / 0xFF; - dest->green = src->green * 0x3F / 0xFF; - dest->blue = src->blue * 0x1F / 0xFF; - src++; - dest++; - } - } - - static void picture_bgra8888_to_bgra5658(vg_color16_alpha_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) - { - while(px_size--) { - dest->c.red = src->red * 0x1F / 0xFF; - dest->c.green = src->green * 0x3F / 0xFF; - dest->c.blue = src->blue * 0x1F / 0xFF; - dest->alpha = src->alpha; - src++; - dest++; - } - } - - static void picture_bgra8888_to_bgr888(vg_color24_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) - { - while(px_size--) { - dest->red = src->red; - dest->green = src->green; - dest->blue = src->blue; - src++; - dest++; - } - } - - vg_lite_error_t vg_lite_finish(void) - { - vg_lite_ctx * ctx = vg_lite_ctx::get_instance(); - - if(ctx->canvas->draw() == Result::InsufficientCondition) { - return VG_LITE_SUCCESS; - } - - TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->sync()); - TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->clear(true)); - - /* make sure target buffer is valid */ - LV_ASSERT_NULL(ctx->target_buffer); - - /* If target_buffer is not in a format supported by thorvg, software conversion is required. */ - switch(ctx->target_format) { - case VG_LITE_BGR565: - picture_bgra8888_to_bgr565( - (vg_color16_t *)ctx->target_buffer, - (const vg_color32_t *)ctx->get_temp_target_buffer(), - ctx->target_px_size); - break; - case VG_LITE_BGRA5658: - picture_bgra8888_to_bgra5658( - (vg_color16_alpha_t *)ctx->target_buffer, - (const vg_color32_t *)ctx->get_temp_target_buffer(), - ctx->target_px_size); - break; - case VG_LITE_BGR888: - picture_bgra8888_to_bgr888( - (vg_color24_t *)ctx->target_buffer, - (const vg_color32_t *)ctx->get_temp_target_buffer(), - ctx->target_px_size); - break; - case VG_LITE_BGRA8888: - case VG_LITE_BGRX8888: - /* No conversion required. */ - break; - default: - LV_LOG_ERROR("unsupported format: %d", ctx->target_format); - LV_ASSERT(false); - break; - } - - /* finish convert, clean target buffer info */ - ctx->target_buffer = nullptr; - ctx->target_px_size = 0; - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_flush(void) - { - return vg_lite_finish(); - } - - vg_lite_error_t vg_lite_draw(vg_lite_buffer_t * target, - vg_lite_path_t * path, - vg_lite_fill_t fill_rule, - vg_lite_matrix_t * matrix, - vg_lite_blend_t blend, - vg_lite_color_t color) - { - auto ctx = vg_lite_ctx::get_instance(); - TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); - - auto shape = Shape::gen(); - TVG_CHECK_RETURN_VG_ERROR(shape_append_path(shape, path, matrix)); - TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(matrix))); - TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule));); - TVG_CHECK_RETURN_VG_ERROR(shape->blend(blend_method_conv(blend))); - TVG_CHECK_RETURN_VG_ERROR(shape->fill(TVG_COLOR(color))); - TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(shape))); - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_set_stroke(vg_lite_path_t * path, - vg_lite_cap_style_t cap_style, - vg_lite_join_style_t join_style, - vg_lite_float_t line_width, - vg_lite_float_t miter_limit, - vg_lite_float_t * dash_pattern, - vg_lite_uint32_t pattern_count, - vg_lite_float_t dash_phase, - vg_lite_color_t color) - { - if(!path || line_width <= 0) { - return VG_LITE_INVALID_ARGUMENT; - } - - if(miter_limit < 1.0f) { - miter_limit = 1.0f; - } - - if(!path->stroke) { - path->stroke = (vg_lite_stroke_t *)lv_malloc_zeroed(sizeof(vg_lite_stroke_t)); - - if(!path->stroke) { - return VG_LITE_OUT_OF_RESOURCES; - } - } - - path->stroke->cap_style = cap_style; - path->stroke->join_style = join_style; - path->stroke->line_width = line_width; - path->stroke->miter_limit = miter_limit; - path->stroke->half_width = line_width / 2.0f; - path->stroke->miter_square = path->stroke->miter_limit * path->stroke->miter_limit; - path->stroke->dash_pattern = dash_pattern; - path->stroke->pattern_count = pattern_count; - path->stroke->dash_phase = dash_phase; - path->stroke_color = color; - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_update_stroke(vg_lite_path_t * path) - { - LV_UNUSED(path); - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_set_path_type(vg_lite_path_t * path, vg_lite_path_type_t path_type) - { - if(!path || - (path_type != VG_LITE_DRAW_FILL_PATH && - path_type != VG_LITE_DRAW_STROKE_PATH && - path_type != VG_LITE_DRAW_FILL_STROKE_PATH) - ) - return VG_LITE_INVALID_ARGUMENT; - - path->path_type = path_type; - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_get_register(vg_lite_uint32_t address, vg_lite_uint32_t * result) - { - LV_UNUSED(address); - LV_UNUSED(result); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_get_info(vg_lite_info_t * info) - { - info->api_version = VGLITE_API_VERSION_3_0; - info->header_version = VGLITE_HEADER_VERSION; - info->release_version = VGLITE_RELEASE_VERSION; - info->reserved = 0; - return VG_LITE_SUCCESS; - } - - vg_lite_uint32_t vg_lite_get_product_info(char * name, vg_lite_uint32_t * chip_id, vg_lite_uint32_t * chip_rev) - { - strcpy(name, "GCNanoLiteV"); - *chip_id = 0x265; - *chip_rev = 0x2000; - return 1; - } - - vg_lite_uint32_t vg_lite_query_feature(vg_lite_feature_t feature) - { - switch(feature) { - case gcFEATURE_BIT_VG_IM_INDEX_FORMAT: - case gcFEATURE_BIT_VG_BORDER_CULLING: - case gcFEATURE_BIT_VG_RGBA2_FORMAT: - case gcFEATURE_BIT_VG_IM_FASTCLAER: - case gcFEATURE_BIT_VG_GLOBAL_ALPHA: - case gcFEATURE_BIT_VG_COLOR_KEY: - case gcFEATURE_BIT_VG_24BIT: - case gcFEATURE_BIT_VG_DITHER: - case gcFEATURE_BIT_VG_USE_DST: - case gcFEATURE_BIT_VG_RADIAL_GRADIENT: - case gcFEATURE_BIT_VG_IM_REPEAT_REFLECT: - -#if LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT - case gcFEATURE_BIT_VG_LVGL_SUPPORT: -#endif - -#if LV_VG_LITE_THORVG_YUV_SUPPORT - case gcFEATURE_BIT_VG_YUV_INPUT: -#endif - -#if LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT - case gcFEATURE_BIT_VG_LINEAR_GRADIENT_EXT: -#endif - -#if LV_VG_LITE_THORVG_16PIXELS_ALIGN - case gcFEATURE_BIT_VG_16PIXELS_ALIGN: -#endif - return 1; - default: - break; - } - return 0; - } - - vg_lite_error_t vg_lite_init_path(vg_lite_path_t * path, - vg_lite_format_t data_format, - vg_lite_quality_t quality, - vg_lite_uint32_t path_length, - void * path_data, - vg_lite_float_t min_x, vg_lite_float_t min_y, - vg_lite_float_t max_x, vg_lite_float_t max_y) - { - if(!path) { - return VG_LITE_INVALID_ARGUMENT; - } - - lv_memzero(path, sizeof(vg_lite_path_t)); - - path->format = data_format; - path->quality = quality; - path->bounding_box[0] = min_x; - path->bounding_box[1] = min_y; - path->bounding_box[2] = max_x; - path->bounding_box[3] = max_y; - - path->path_length = path_length; - path->path = path_data; - - path->path_changed = 1; - path->uploaded.address = 0; - path->uploaded.bytes = 0; - path->uploaded.handle = NULL; - path->uploaded.memory = NULL; - path->pdata_internal = 0; - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_init_arc_path(vg_lite_path_t * path, - vg_lite_format_t data_format, - vg_lite_quality_t quality, - vg_lite_uint32_t path_length, - void * path_data, - vg_lite_float_t min_x, vg_lite_float_t min_y, - vg_lite_float_t max_x, vg_lite_float_t max_y) - { - LV_UNUSED(path); - LV_UNUSED(data_format); - LV_UNUSED(quality); - LV_UNUSED(path_length); - LV_UNUSED(path_data); - LV_UNUSED(min_x); - LV_UNUSED(min_y); - LV_UNUSED(max_x); - LV_UNUSED(max_y); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_clear_path(vg_lite_path_t * path) - { - LV_ASSERT_NULL(path); - - if(path->stroke) { - lv_free(path->stroke); - path->stroke = NULL; - } - - return VG_LITE_SUCCESS; - } - - vg_lite_uint32_t vg_lite_get_path_length(vg_lite_uint8_t * opcode, - vg_lite_uint32_t count, - vg_lite_format_t format) - { - LV_UNUSED(opcode); - LV_UNUSED(count); - LV_UNUSED(format); - return 0; - } - - vg_lite_error_t vg_lite_append_path(vg_lite_path_t * path, - uint8_t * cmd, - void * data, - vg_lite_uint32_t seg_count) - { - LV_UNUSED(path); - LV_UNUSED(cmd); - LV_UNUSED(data); - LV_UNUSED(seg_count); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_upload_path(vg_lite_path_t * path) - { - LV_UNUSED(path); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_set_CLUT(vg_lite_uint32_t count, - vg_lite_uint32_t * colors) - { - if(!vg_lite_query_feature(gcFEATURE_BIT_VG_IM_INDEX_FORMAT)) { - return VG_LITE_NOT_SUPPORT; - } - LV_ASSERT(colors); - - auto ctx = vg_lite_ctx::get_instance(); - ctx->set_CLUT(count, colors); - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_draw_pattern(vg_lite_buffer_t * target, - vg_lite_path_t * path, - vg_lite_fill_t fill_rule, - vg_lite_matrix_t * path_matrix, - vg_lite_buffer_t * pattern_image, - vg_lite_matrix_t * pattern_matrix, - vg_lite_blend_t blend, - vg_lite_pattern_mode_t pattern_mode, - vg_lite_color_t pattern_color, - vg_lite_color_t color, - vg_lite_filter_t filter) - { - LV_UNUSED(pattern_mode); - LV_UNUSED(pattern_color); - LV_UNUSED(filter); - - auto ctx = vg_lite_ctx::get_instance(); - TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); - - auto shape = Shape::gen(); - TVG_CHECK_RETURN_VG_ERROR(shape_append_path(shape, path, path_matrix)); - TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule))); - TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(path_matrix))); - - auto picture = tvg::Picture::gen(); - TVG_CHECK_RETURN_VG_ERROR(picture_load(ctx, picture, pattern_image, color)); - TVG_CHECK_RETURN_VG_ERROR(picture->transform(matrix_conv(pattern_matrix))); - TVG_CHECK_RETURN_VG_ERROR(picture->blend(blend_method_conv(blend))); - TVG_CHECK_RETURN_VG_ERROR(picture->composite(std::move(shape), CompositeMethod::ClipPath)); - TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(picture))); - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_init_grad(vg_lite_linear_gradient_t * grad) - { - vg_lite_error_t error = VG_LITE_SUCCESS; - - /* Set the member values according to driver defaults. */ - grad->image.width = VLC_GRADIENT_BUFFER_WIDTH; - grad->image.height = 1; - grad->image.stride = 0; - grad->image.format = VG_LITE_BGRA8888; - - /* Allocate the image for gradient. */ - error = vg_lite_allocate(&grad->image); - - grad->count = 0; - - return error; - } - - vg_lite_error_t vg_lite_set_linear_grad(vg_lite_ext_linear_gradient_t * grad, - vg_lite_uint32_t count, - vg_lite_color_ramp_t * color_ramp, - vg_lite_linear_gradient_parameter_t linear_gradient, - vg_lite_gradient_spreadmode_t spread_mode, - vg_lite_uint8_t pre_multiplied) - { - static vg_lite_color_ramp_t default_ramp[] = { - { - 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f - }, - { - 1.0f, - 1.0f, 1.0f, 1.0f, 1.0f - } - }; - - vg_lite_uint32_t i, trg_count; - vg_lite_float_t prev_stop; - vg_lite_color_ramp_t * src_ramp; - vg_lite_color_ramp_t * src_ramp_last; - vg_lite_color_ramp_t * trg_ramp; - - /* Reset the count. */ - trg_count = 0; - - if((linear_gradient.X0 == linear_gradient.X1) && (linear_gradient.Y0 == linear_gradient.Y1)) - return VG_LITE_INVALID_ARGUMENT; - - grad->linear_grad = linear_gradient; - grad->pre_multiplied = pre_multiplied; - grad->spread_mode = spread_mode; - - if(!count || count > VLC_MAX_COLOR_RAMP_STOPS || color_ramp == NULL) - goto Empty_sequence_handler; - - for(i = 0; i < count; i++) - grad->color_ramp[i] = color_ramp[i]; - grad->ramp_length = count; - - /* Determine the last source ramp. */ - src_ramp_last - = grad->color_ramp - + grad->ramp_length; - - /* Set the initial previous stop. */ - prev_stop = -1; - - /* Reset the count. */ - trg_count = 0; - - /* Walk through the source ramp. */ - for( - src_ramp = grad->color_ramp, trg_ramp = grad->converted_ramp; - (src_ramp < src_ramp_last) && (trg_count < VLC_MAX_COLOR_RAMP_STOPS + 2); - src_ramp += 1) { - /* Must be in increasing order. */ - if(src_ramp->stop < prev_stop) { - /* Ignore the entire sequence. */ - trg_count = 0; - break; - } - - /* Update the previous stop value. */ - prev_stop = src_ramp->stop; - - /* Must be within [0..1] range. */ - if((src_ramp->stop < 0.0f) || (src_ramp->stop > 1.0f)) { - /* Ignore. */ - continue; - } - - /* Clamp color. */ - ClampColor(COLOR_FROM_RAMP(src_ramp), COLOR_FROM_RAMP(trg_ramp), 0); - - /* First stop greater than zero? */ - if((trg_count == 0) && (src_ramp->stop > 0.0f)) { - /* Force the first stop to 0.0f. */ - trg_ramp->stop = 0.0f; - - /* Replicate the entry. */ - trg_ramp[1] = *trg_ramp; - trg_ramp[1].stop = src_ramp->stop; - - /* Advance. */ - trg_ramp += 2; - trg_count += 2; - } - else { - /* Set the stop value. */ - trg_ramp->stop = src_ramp->stop; - - /* Advance. */ - trg_ramp += 1; - trg_count += 1; - } - } - - /* Empty sequence? */ - if(trg_count == 0) { - memcpy(grad->converted_ramp, default_ramp, sizeof(default_ramp)); - grad->converted_length = sizeof(default_ramp) / 5; - } - else { - /* The last stop must be at 1.0. */ - if(trg_ramp[-1].stop != 1.0f) { - /* Replicate the last entry. */ - *trg_ramp = trg_ramp[-1]; - - /* Force the last stop to 1.0f. */ - trg_ramp->stop = 1.0f; - - /* Update the final entry count. */ - trg_count += 1; - } - - /* Set new length. */ - grad->converted_length = trg_count; - } - return VG_LITE_SUCCESS; - -Empty_sequence_handler: - memcpy(grad->converted_ramp, default_ramp, sizeof(default_ramp)); - grad->converted_length = sizeof(default_ramp) / 5; - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_update_linear_grad(vg_lite_ext_linear_gradient_t * grad) - { - vg_lite_uint32_t ramp_length; - vg_lite_color_ramp_t * color_ramp; - vg_lite_uint32_t common, stop; - vg_lite_uint32_t i, width; - uint8_t * bits; - vg_lite_float_t x0, y0, x1, y1, length; - vg_lite_error_t error = VG_LITE_SUCCESS; - - /* Get shortcuts to the color ramp. */ - ramp_length = grad->converted_length; - color_ramp = grad->converted_ramp; - - x0 = grad->linear_grad.X0; - y0 = grad->linear_grad.Y0; - x1 = grad->linear_grad.X1; - y1 = grad->linear_grad.Y1; - length = (vg_lite_float_t)sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); - - if(length <= 0) - return VG_LITE_INVALID_ARGUMENT; - /* Find the common denominator of the color ramp stops. */ - if(length < 1) { - common = 1; - } - else { - common = (vg_lite_uint32_t)length; - } - - for(i = 0; i < ramp_length; ++i) { - if(color_ramp[i].stop != 0.0f) { - vg_lite_float_t mul = common * color_ramp[i].stop; - vg_lite_float_t frac = mul - (vg_lite_float_t)floor(mul); - if(frac > 0.00013f) { /* Suppose error for zero is 0.00013 */ - common = MAX(common, (vg_lite_uint32_t)(1.0f / frac + 0.5f)); - } - } - } - - /* Compute the width of the required color array. */ - width = common + 1; - - /* Allocate the color ramp surface. */ - memset(&grad->image, 0, sizeof(grad->image)); - grad->image.width = width; - grad->image.height = 1; - grad->image.stride = 0; - grad->image.image_mode = VG_LITE_NONE_IMAGE_MODE; - grad->image.format = VG_LITE_ABGR8888; - - /* Allocate the image for gradient. */ - VG_LITE_RETURN_ERROR(vg_lite_allocate(&grad->image)); - memset(grad->image.memory, 0, grad->image.stride * grad->image.height); - width = common + 1; - /* Set pointer to color array. */ - bits = (uint8_t *)grad->image.memory; - - /* Start filling the color array. */ - stop = 0; - for(i = 0; i < width; ++i) { - vg_lite_float_t gradient; - vg_lite_float_t color[4]; - vg_lite_float_t color1[4]; - vg_lite_float_t color2[4]; - vg_lite_float_t weight; - - if(i == 241) - i = 241; - /* Compute gradient for current color array entry. */ - gradient = (vg_lite_float_t)i / (vg_lite_float_t)(width - 1); - - /* Find the entry in the color ramp that matches or exceeds this - ** gradient. */ - while(gradient > color_ramp[stop].stop) { - ++stop; - } - - if(gradient == color_ramp[stop].stop) { - /* Perfect match weight 1.0. */ - weight = 1.0f; - - /* Use color ramp color. */ - color1[3] = color_ramp[stop].alpha; - color1[2] = color_ramp[stop].blue; - color1[1] = color_ramp[stop].green; - color1[0] = color_ramp[stop].red; - - color2[3] = color2[2] = color2[1] = color2[0] = 0.0f; - } - else { - if(stop == 0) { - return VG_LITE_INVALID_ARGUMENT; - } - /* Compute weight. */ - weight = (color_ramp[stop].stop - gradient) - / (color_ramp[stop].stop - color_ramp[stop - 1].stop); - - /* Grab color ramp color of previous stop. */ - color1[3] = color_ramp[stop - 1].alpha; - color1[2] = color_ramp[stop - 1].blue; - color1[1] = color_ramp[stop - 1].green; - color1[0] = color_ramp[stop - 1].red; - - /* Grab color ramp color of current stop. */ - color2[3] = color_ramp[stop].alpha; - color2[2] = color_ramp[stop].blue; - color2[1] = color_ramp[stop].green; - color2[0] = color_ramp[stop].red; - } - - if(grad->pre_multiplied) { - /* Pre-multiply the first color. */ - color1[2] *= color1[3]; - color1[1] *= color1[3]; - color1[0] *= color1[3]; - - /* Pre-multiply the second color. */ - color2[2] *= color2[3]; - color2[1] *= color2[3]; - color2[0] *= color2[3]; - } - - /* Filter the colors per channel. */ - color[3] = LERP(color1[3], color2[3], weight); - color[2] = LERP(color1[2], color2[2], weight); - color[1] = LERP(color1[1], color2[1], weight); - color[0] = LERP(color1[0], color2[0], weight); - - /* Pack the final color. */ - *bits++ = PackColorComponent(color[3]); - *bits++ = PackColorComponent(color[2]); - *bits++ = PackColorComponent(color[1]); - *bits++ = PackColorComponent(color[0]); - } - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_draw_linear_grad(vg_lite_buffer_t * target, - vg_lite_path_t * path, - vg_lite_fill_t fill_rule, - vg_lite_matrix_t * path_matrix, - vg_lite_ext_linear_gradient_t * grad, - vg_lite_color_t paint_color, - vg_lite_blend_t blend, - vg_lite_filter_t filter) - { - LV_UNUSED(paint_color); - LV_UNUSED(filter); - - auto ctx = vg_lite_ctx::get_instance(); - TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); - - auto shape = Shape::gen(); - TVG_CHECK_RETURN_VG_ERROR(shape_append_path(shape, path, path_matrix)); - TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(path_matrix))); - TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule));); - TVG_CHECK_RETURN_VG_ERROR(shape->blend(blend_method_conv(blend))); - - auto linearGrad = LinearGradient::gen(); - TVG_CHECK_RETURN_VG_ERROR(linearGrad->linear(grad->linear_grad.X0, grad->linear_grad.Y0, grad->linear_grad.X1, - grad->linear_grad.Y1)); - TVG_CHECK_RETURN_VG_ERROR(linearGrad->transform(matrix_conv(&grad->matrix))); - TVG_CHECK_RETURN_VG_ERROR(linearGrad->spread(fill_spread_conv(grad->spread_mode))); - - tvg::Fill::ColorStop colorStops[VLC_MAX_COLOR_RAMP_STOPS]; - for(vg_lite_uint32_t i = 0; i < grad->ramp_length; i++) { - colorStops[i].offset = grad->color_ramp[i].stop; - colorStops[i].r = grad->color_ramp[i].red * 255.0f; - colorStops[i].g = grad->color_ramp[i].green * 255.0f; - colorStops[i].b = grad->color_ramp[i].blue * 255.0f; - colorStops[i].a = grad->color_ramp[i].alpha * 255.0f; - } - TVG_CHECK_RETURN_VG_ERROR(linearGrad->colorStops(colorStops, grad->ramp_length)); - - TVG_CHECK_RETURN_VG_ERROR(shape->fill(std::move(linearGrad))); - TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(shape))); - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_set_radial_grad(vg_lite_radial_gradient_t * grad, - vg_lite_uint32_t count, - vg_lite_color_ramp_t * color_ramp, - vg_lite_radial_gradient_parameter_t radial_grad, - vg_lite_gradient_spreadmode_t spread_mode, - vg_lite_uint8_t pre_multiplied) - { - static vg_lite_color_ramp_t defaultRamp[] = { - { - 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f - }, - { - 1.0f, - 1.0f, 1.0f, 1.0f, 1.0f - } - }; - - vg_lite_uint32_t i, trgCount; - vg_lite_float_t prevStop; - vg_lite_color_ramp_t * srcRamp; - vg_lite_color_ramp_t * srcRampLast; - vg_lite_color_ramp_t * trgRamp; - - /* Reset the count. */ - trgCount = 0; - - if(radial_grad.r <= 0) - return VG_LITE_INVALID_ARGUMENT; - - grad->radial_grad = radial_grad; - grad->pre_multiplied = pre_multiplied; - grad->spread_mode = spread_mode; - - if(!count || count > VLC_MAX_COLOR_RAMP_STOPS || color_ramp == NULL) - goto Empty_sequence_handler; - - for(i = 0; i < count; i++) - grad->color_ramp[i] = color_ramp[i]; - grad->ramp_length = count; - - /* Determine the last source ramp. */ - srcRampLast - = grad->color_ramp - + grad->ramp_length; - - /* Set the initial previous stop. */ - prevStop = -1; - - /* Reset the count. */ - trgCount = 0; - - /* Walk through the source ramp. */ - for( - srcRamp = grad->color_ramp, trgRamp = grad->converted_ramp; - (srcRamp < srcRampLast) && (trgCount < VLC_MAX_COLOR_RAMP_STOPS + 2); - srcRamp += 1) { - /* Must be in increasing order. */ - if(srcRamp->stop < prevStop) { - /* Ignore the entire sequence. */ - trgCount = 0; - break; - } - - /* Update the previous stop value. */ - prevStop = srcRamp->stop; - - /* Must be within [0..1] range. */ - if((srcRamp->stop < 0.0f) || (srcRamp->stop > 1.0f)) { - /* Ignore. */ - continue; - } - - /* Clamp color. */ - ClampColor(COLOR_FROM_RAMP(srcRamp), COLOR_FROM_RAMP(trgRamp), 0); - - /* First stop greater than zero? */ - if((trgCount == 0) && (srcRamp->stop > 0.0f)) { - /* Force the first stop to 0.0f. */ - trgRamp->stop = 0.0f; - - /* Replicate the entry. */ - trgRamp[1] = *trgRamp; - trgRamp[1].stop = srcRamp->stop; - - /* Advance. */ - trgRamp += 2; - trgCount += 2; - } - else { - /* Set the stop value. */ - trgRamp->stop = srcRamp->stop; - - /* Advance. */ - trgRamp += 1; - trgCount += 1; - } - } - - /* Empty sequence? */ - if(trgCount == 0) { - memcpy(grad->converted_ramp, defaultRamp, sizeof(defaultRamp)); - grad->converted_length = sizeof(defaultRamp) / 5; - } - else { - /* The last stop must be at 1.0. */ - if(trgRamp[-1].stop != 1.0f) { - /* Replicate the last entry. */ - *trgRamp = trgRamp[-1]; - - /* Force the last stop to 1.0f. */ - trgRamp->stop = 1.0f; - - /* Update the final entry count. */ - trgCount += 1; - } - - /* Set new length. */ - grad->converted_length = trgCount; - } - return VG_LITE_SUCCESS; - -Empty_sequence_handler: - memcpy(grad->converted_ramp, defaultRamp, sizeof(defaultRamp)); - grad->converted_length = sizeof(defaultRamp) / 5; - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_update_radial_grad(vg_lite_radial_gradient_t * grad) - { - vg_lite_uint32_t ramp_length; - vg_lite_color_ramp_t * colorRamp; - vg_lite_uint32_t common, stop; - vg_lite_uint32_t i, width; - uint8_t * bits; - vg_lite_error_t error = VG_LITE_SUCCESS; - vg_lite_uint32_t align, mul, div; - - /* Get shortcuts to the color ramp. */ - ramp_length = grad->converted_length; - colorRamp = grad->converted_ramp; - - if(grad->radial_grad.r <= 0) - return VG_LITE_INVALID_ARGUMENT; - - /* Find the common denominator of the color ramp stops. */ - if(grad->radial_grad.r < 1) { - common = 1; - } - else { - common = (vg_lite_uint32_t)grad->radial_grad.r; - } - - for(i = 0; i < ramp_length; ++i) { - if(colorRamp[i].stop != 0.0f) { - vg_lite_float_t m = common * colorRamp[i].stop; - vg_lite_float_t frac = m - (vg_lite_float_t)floor(m); - if(frac > 0.00013f) { /* Suppose error for zero is 0.00013 */ - common = MAX(common, (vg_lite_uint32_t)(1.0f / frac + 0.5f)); - } - } - } - - /* Compute the width of the required color array. */ - width = common + 1; - width = (width + 15) & (~0xf); - - /* Allocate the color ramp surface. */ - memset(&grad->image, 0, sizeof(grad->image)); - grad->image.width = width; - grad->image.height = 1; - grad->image.stride = 0; - grad->image.image_mode = VG_LITE_NONE_IMAGE_MODE; - grad->image.format = VG_LITE_ABGR8888; - - /* Allocate the image for gradient. */ - VG_LITE_RETURN_ERROR(vg_lite_allocate(&grad->image)); - - get_format_bytes(VG_LITE_ABGR8888, &mul, &div, &align); - width = grad->image.stride * div / mul; - - /* Set pointer to color array. */ - bits = (uint8_t *)grad->image.memory; - - /* Start filling the color array. */ - stop = 0; - for(i = 0; i < width; ++i) { - vg_lite_float_t gradient; - vg_lite_float_t color[4]; - vg_lite_float_t color1[4]; - vg_lite_float_t color2[4]; - vg_lite_float_t weight; - - /* Compute gradient for current color array entry. */ - gradient = (vg_lite_float_t)i / (vg_lite_float_t)(width - 1); - - /* Find the entry in the color ramp that matches or exceeds this - ** gradient. */ - while(gradient > colorRamp[stop].stop) { - ++stop; - } - - if(gradient == colorRamp[stop].stop) { - /* Perfect match weight 1.0. */ - weight = 1.0f; - - /* Use color ramp color. */ - color1[3] = colorRamp[stop].alpha; - color1[2] = colorRamp[stop].blue; - color1[1] = colorRamp[stop].green; - color1[0] = colorRamp[stop].red; - - color2[3] = color2[2] = color2[1] = color2[0] = 0.0f; - } - else { - /* Compute weight. */ - weight = (colorRamp[stop].stop - gradient) - / (colorRamp[stop].stop - colorRamp[stop - 1].stop); - - /* Grab color ramp color of previous stop. */ - color1[3] = colorRamp[stop - 1].alpha; - color1[2] = colorRamp[stop - 1].blue; - color1[1] = colorRamp[stop - 1].green; - color1[0] = colorRamp[stop - 1].red; - - /* Grab color ramp color of current stop. */ - color2[3] = colorRamp[stop].alpha; - color2[2] = colorRamp[stop].blue; - color2[1] = colorRamp[stop].green; - color2[0] = colorRamp[stop].red; - } - - if(grad->pre_multiplied) { - /* Pre-multiply the first color. */ - color1[2] *= color1[3]; - color1[1] *= color1[3]; - color1[0] *= color1[3]; - - /* Pre-multiply the second color. */ - color2[2] *= color2[3]; - color2[1] *= color2[3]; - color2[0] *= color2[3]; - } - - /* Filter the colors per channel. */ - color[3] = LERP(color1[3], color2[3], weight); - color[2] = LERP(color1[2], color2[2], weight); - color[1] = LERP(color1[1], color2[1], weight); - color[0] = LERP(color1[0], color2[0], weight); - - /* Pack the final color. */ - *bits++ = PackColorComponent(color[3]); - *bits++ = PackColorComponent(color[2]); - *bits++ = PackColorComponent(color[1]); - *bits++ = PackColorComponent(color[0]); - } - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_set_grad(vg_lite_linear_gradient_t * grad, - vg_lite_uint32_t count, - vg_lite_uint32_t * colors, - vg_lite_uint32_t * stops) - { - vg_lite_uint32_t i; - - grad->count = 0; /* Opaque B&W gradient */ - if(!count || count > VLC_MAX_GRADIENT_STOPS || colors == NULL || stops == NULL) - return VG_LITE_SUCCESS; - - /* Check stops validity */ - for(i = 0; i < count; i++) - if(stops[i] < VLC_GRADIENT_BUFFER_WIDTH) { - if(!grad->count || stops[i] > grad->stops[grad->count - 1]) { - grad->stops[grad->count] = stops[i]; - grad->colors[grad->count] = colors[i]; - grad->count++; - } - else if(stops[i] == grad->stops[grad->count - 1]) { - /* Equal stops : use the color corresponding to the last stop - in the sequence */ - grad->colors[grad->count - 1] = colors[i]; - } - } - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_update_grad(vg_lite_linear_gradient_t * grad) - { - vg_lite_error_t error = VG_LITE_SUCCESS; - int32_t r0, g0, b0, a0; - int32_t r1, g1, b1, a1; - int32_t lr, lg, lb, la; - vg_lite_uint32_t i; - int32_t j; - int32_t ds, dr, dg, db, da; - vg_lite_uint32_t * buffer = (vg_lite_uint32_t *)grad->image.memory; - - if(grad->count == 0) { - /* If no valid stops have been specified (e.g., due to an empty input - * array, out-of-range, or out-of-order stops), a stop at 0 with color - * 0xFF000000 (opaque black) and a stop at 255 with color 0xFFFFFFFF - * (opaque white) are implicitly defined. */ - grad->stops[0] = 0; - grad->colors[0] = 0xFF000000; /* Opaque black */ - grad->stops[1] = 255; - grad->colors[1] = 0xFFFFFFFF; /* Opaque white */ - grad->count = 2; - } - else if(grad->count && grad->stops[0] != 0) { - /* If at least one valid stop has been specified, but none has been - * defined with an offset of 0, an implicit stop is added with an - * offset of 0 and the same color as the first user-defined stop. */ - for(i = 0; i < grad->stops[0]; i++) - buffer[i] = grad->colors[0]; - } - a0 = A(grad->colors[0]); - r0 = R(grad->colors[0]); - g0 = G(grad->colors[0]); - b0 = B(grad->colors[0]); - - /* Calculate the colors for each pixel of the image. */ - for(i = 0; i < grad->count - 1; i++) { - buffer[grad->stops[i]] = grad->colors[i]; - ds = grad->stops[i + 1] - grad->stops[i]; - a1 = A(grad->colors[i + 1]); - r1 = R(grad->colors[i + 1]); - g1 = G(grad->colors[i + 1]); - b1 = B(grad->colors[i + 1]); - - da = a1 - a0; - dr = r1 - r0; - dg = g1 - g0; - db = b1 - b0; - - for(j = 1; j < ds; j++) { - la = a0 + da * j / ds; - lr = r0 + dr * j / ds; - lg = g0 + dg * j / ds; - lb = b0 + db * j / ds; - - buffer[grad->stops[i] + j] = ARGB(la, lr, lg, lb); - } - - a0 = a1; - r0 = r1; - g0 = g1; - b0 = b1; - } - - /* If at least one valid stop has been specified, but none has been defined - * with an offset of 255, an implicit stop is added with an offset of 255 - * and the same color as the last user-defined stop. */ - for(i = grad->stops[grad->count - 1]; i < VLC_GRADIENT_BUFFER_WIDTH; i++) - buffer[i] = grad->colors[grad->count - 1]; - - return error; - } - - vg_lite_error_t vg_lite_clear_linear_grad(vg_lite_ext_linear_gradient_t * grad) - { - vg_lite_error_t error = VG_LITE_SUCCESS; - - grad->count = 0; - /* Release the image resource. */ - if(grad->image.handle != NULL) { - error = vg_lite_free(&grad->image); - } - - return error; - } - - vg_lite_error_t vg_lite_clear_grad(vg_lite_linear_gradient_t * grad) - { - vg_lite_error_t error = VG_LITE_SUCCESS; - - grad->count = 0; - /* Release the image resource. */ - if(grad->image.handle != NULL) { - error = vg_lite_free(&grad->image); - } - - return error; - } - - vg_lite_error_t vg_lite_clear_radial_grad(vg_lite_radial_gradient_t * grad) - { - vg_lite_error_t error = VG_LITE_SUCCESS; - - grad->count = 0; - /* Release the image resource. */ - if(grad->image.handle != NULL) { - error = vg_lite_free(&grad->image); - } - - return error; - } - - vg_lite_matrix_t * vg_lite_get_linear_grad_matrix(vg_lite_ext_linear_gradient_t * grad) - { - return &grad->matrix; - } - - vg_lite_matrix_t * vg_lite_get_grad_matrix(vg_lite_linear_gradient_t * grad) - { - return &grad->matrix; - } - - vg_lite_matrix_t * vg_lite_get_radial_grad_matrix(vg_lite_radial_gradient_t * grad) - { - return &grad->matrix; - } - - vg_lite_error_t vg_lite_draw_grad(vg_lite_buffer_t * target, - vg_lite_path_t * path, - vg_lite_fill_t fill_rule, - vg_lite_matrix_t * matrix, - vg_lite_linear_gradient_t * grad, - vg_lite_blend_t blend) - { - auto ctx = vg_lite_ctx::get_instance(); - TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); - - auto shape = Shape::gen(); - TVG_CHECK_RETURN_VG_ERROR(shape_append_path(shape, path, matrix)); - TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(matrix))); - TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule));); - TVG_CHECK_RETURN_VG_ERROR(shape->blend(blend_method_conv(blend))); - - vg_lite_matrix_t grad_matrix; - vg_lite_identity(&grad_matrix); - vg_lite_matrix_inverse(&grad_matrix, matrix); - vg_lite_matrix_multiply(&grad_matrix, &grad->matrix); - - vg_lite_fpoint_t p1 = {0.0f, 0.0f}; - vg_lite_fpoint_t p2 = {1.0f, 0}; - - vg_lite_fpoint_t p1_trans = p1; - vg_lite_fpoint_t p2_trans = p2; - - p1_trans = matrix_transform_point(&grad_matrix, &p1); - p2_trans = matrix_transform_point(&grad_matrix, &p2); - float dx = (p2_trans.x - p1_trans.x); - float dy = (p2_trans.y - p1_trans.y); - float scale = sqrtf(dx * dx + dy * dy); - float angle = (float)(atan2f(dy, dx)); - float dlen = 256 * scale; - float x_min = grad_matrix.m[0][2]; - float y_min = grad_matrix.m[1][2]; - float x_max = x_min + dlen * cosf(angle); - float y_max = y_min + dlen * sinf(angle); - LV_LOG_TRACE("linear gradient {%.2f, %.2f} ~ {%.2f, %.2f}", x_min, y_min, x_max, y_max); - auto linearGrad = LinearGradient::gen(); - TVG_CHECK_RETURN_VG_ERROR(linearGrad->linear(x_min, y_min, x_max, y_max)); - TVG_CHECK_RETURN_VG_ERROR(linearGrad->spread(FillSpread::Pad)); - - tvg::Fill::ColorStop colorStops[VLC_MAX_GRADIENT_STOPS]; - for(vg_lite_uint32_t i = 0; i < grad->count; i++) { - colorStops[i].offset = grad->stops[i] / 255.0f; - colorStops[i].r = R(grad->colors[i]); - colorStops[i].g = G(grad->colors[i]); - colorStops[i].b = B(grad->colors[i]); - colorStops[i].a = A(grad->colors[i]); - } - TVG_CHECK_RETURN_VG_ERROR(linearGrad->colorStops(colorStops, grad->count)); - - TVG_CHECK_RETURN_VG_ERROR(shape->fill(std::move(linearGrad))); - TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(shape))); - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_draw_radial_grad(vg_lite_buffer_t * target, - vg_lite_path_t * path, - vg_lite_fill_t fill_rule, - vg_lite_matrix_t * path_matrix, - vg_lite_radial_gradient_t * grad, - vg_lite_color_t paint_color, - vg_lite_blend_t blend, - vg_lite_filter_t filter) - { - LV_UNUSED(paint_color); - LV_UNUSED(filter); - - auto ctx = vg_lite_ctx::get_instance(); - TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); - - auto shape = Shape::gen(); - TVG_CHECK_RETURN_VG_ERROR(shape_append_path(shape, path, path_matrix)); - TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(path_matrix))); - TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule));); - TVG_CHECK_RETURN_VG_ERROR(shape->blend(blend_method_conv(blend))); - - auto radialGrad = RadialGradient::gen(); - TVG_CHECK_RETURN_VG_ERROR(radialGrad->transform(matrix_conv(&grad->matrix))); - TVG_CHECK_RETURN_VG_ERROR(radialGrad->radial(grad->radial_grad.cx, grad->radial_grad.cy, grad->radial_grad.r)); - TVG_CHECK_RETURN_VG_ERROR(radialGrad->spread(fill_spread_conv(grad->spread_mode))); - - tvg::Fill::ColorStop colorStops[VLC_MAX_COLOR_RAMP_STOPS]; - for(vg_lite_uint32_t i = 0; i < grad->ramp_length; i++) { - colorStops[i].offset = grad->color_ramp[i].stop; - colorStops[i].r = grad->color_ramp[i].red * 255.0f; - colorStops[i].g = grad->color_ramp[i].green * 255.0f; - colorStops[i].b = grad->color_ramp[i].blue * 255.0f; - colorStops[i].a = grad->color_ramp[i].alpha * 255.0f; - } - TVG_CHECK_RETURN_VG_ERROR(radialGrad->colorStops(colorStops, grad->ramp_length)); - - TVG_CHECK_RETURN_VG_ERROR(shape->fill(std::move(radialGrad))); - TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(shape))); - - return VG_LITE_SUCCESS; - } - - vg_lite_error_t vg_lite_set_command_buffer_size(vg_lite_uint32_t size) - { - LV_UNUSED(size); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_set_scissor(int32_t x, int32_t y, int32_t right, int32_t bottom) - { - LV_UNUSED(x); - LV_UNUSED(y); - LV_UNUSED(right); - LV_UNUSED(bottom); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_enable_scissor(void) - { - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_disable_scissor(void) - { - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_get_mem_size(vg_lite_uint32_t * size) - { - *size = 0; - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_source_global_alpha(vg_lite_global_alpha_t alpha_mode, uint8_t alpha_value) - { - LV_UNUSED(alpha_mode); - LV_UNUSED(alpha_value); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_dest_global_alpha(vg_lite_global_alpha_t alpha_mode, uint8_t alpha_value) - { - LV_UNUSED(alpha_mode); - LV_UNUSED(alpha_value); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_set_color_key(vg_lite_color_key4_t colorkey) - { - LV_UNUSED(colorkey); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_set_flexa_stream_id(uint8_t stream_id) - { - LV_UNUSED(stream_id); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_set_flexa_current_background_buffer(uint8_t stream_id, - vg_lite_buffer_t * buffer, - vg_lite_uint32_t background_segment_count, - vg_lite_uint32_t background_segment_size) - { - LV_UNUSED(stream_id); - LV_UNUSED(buffer); - LV_UNUSED(background_segment_count); - LV_UNUSED(background_segment_size); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_enable_flexa(void) - { - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_disable_flexa(void) - { - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_set_flexa_stop_frame(void) - { - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_enable_dither(void) - { - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_disable_dither(void) - { - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_set_tess_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size) - { - LV_UNUSED(physical); - LV_UNUSED(size); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_set_command_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size) - { - LV_UNUSED(physical); - LV_UNUSED(size); - return VG_LITE_NOT_SUPPORT; - } - - vg_lite_error_t vg_lite_get_parameter(vg_lite_param_type_t type, - vg_lite_int32_t count, - vg_lite_float_t * params) - { - switch(type) { - case VG_LITE_GPU_IDLE_STATE: - if(count != 1 || params == NULL) { - return VG_LITE_INVALID_ARGUMENT; - } - - *(vg_lite_uint32_t *)params = 1; - return VG_LITE_SUCCESS; - - default: - break; - } - - return VG_LITE_NOT_SUPPORT; - } -} /* extern "C" */ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static vg_lite_error_t vg_lite_error_conv(Result result) -{ - switch(result) { - case Result::Success: - return VG_LITE_SUCCESS; - - case Result::InvalidArguments: - return VG_LITE_INVALID_ARGUMENT; - - case Result::InsufficientCondition: - return VG_LITE_OUT_OF_RESOURCES; - - case Result::FailedAllocation: - return VG_LITE_OUT_OF_MEMORY; - - case Result::NonSupport: - return VG_LITE_NOT_SUPPORT; - - default: - break; - } - - return VG_LITE_TIMEOUT; -} - -static Matrix matrix_conv(const vg_lite_matrix_t * matrix) -{ - return *(Matrix *)matrix; -} - -static FillRule fill_rule_conv(vg_lite_fill_t fill) -{ - if(fill == VG_LITE_FILL_EVEN_ODD) { - return FillRule::EvenOdd; - } - - return FillRule::Winding; -} - -static BlendMethod blend_method_conv(vg_lite_blend_t blend) -{ - switch(blend) { - case VG_LITE_BLEND_NONE: - return BlendMethod::SrcOver; - - case VG_LITE_BLEND_NORMAL_LVGL: - return BlendMethod::Normal; - - case VG_LITE_BLEND_SRC_OVER: - return BlendMethod::Normal; - - case VG_LITE_BLEND_SCREEN: - return BlendMethod::Screen; - - case VG_LITE_BLEND_ADDITIVE: - return BlendMethod::Add; - - case VG_LITE_BLEND_MULTIPLY: - return BlendMethod::Multiply; - - default: - break; - } - - return BlendMethod::Normal; -} - -static StrokeCap stroke_cap_conv(vg_lite_cap_style_t cap) -{ - switch(cap) { - case VG_LITE_CAP_SQUARE: - return StrokeCap::Square; - case VG_LITE_CAP_ROUND: - return StrokeCap::Round; - case VG_LITE_CAP_BUTT: - return StrokeCap::Butt; - default: - break; - } - - return StrokeCap::Square; -} - -static StrokeJoin stroke_join_conv(vg_lite_join_style_t join) -{ - switch(join) { - case VG_LITE_JOIN_BEVEL: - return StrokeJoin::Bevel; - case VG_LITE_JOIN_ROUND: - return StrokeJoin::Round; - case VG_LITE_JOIN_MITER: - return StrokeJoin::Miter; - default: - break; - } - - return StrokeJoin::Bevel; -} - -static FillSpread fill_spread_conv(vg_lite_gradient_spreadmode_t spread) -{ - switch(spread) { - case VG_LITE_GRADIENT_SPREAD_PAD: - return FillSpread::Pad; - case VG_LITE_GRADIENT_SPREAD_REPEAT: - return FillSpread::Repeat; - case VG_LITE_GRADIENT_SPREAD_REFLECT: - return FillSpread::Reflect; - default: - return FillSpread::Pad; - } -} - -static float vlc_get_arg(const void * data, vg_lite_format_t format) -{ - switch(format) { - case VG_LITE_S8: - return *((int8_t *)data); - - case VG_LITE_S16: - return *((int16_t *)data); - - case VG_LITE_S32: - return *((int32_t *)data); - - case VG_LITE_FP32: - return *((float *)data); - - default: - LV_LOG_ERROR("UNKNOW_FORMAT: %d", format); - break; - } - - return 0; -} - -static uint8_t vlc_format_len(vg_lite_format_t format) -{ - switch(format) { - case VG_LITE_S8: - return 1; - case VG_LITE_S16: - return 2; - case VG_LITE_S32: - return 4; - case VG_LITE_FP32: - return 4; - default: - LV_LOG_ERROR("UNKNOW_FORMAT: %d", format); - LV_ASSERT(false); - break; - } - - return 0; -} - -static uint8_t vlc_op_arg_len(uint8_t vlc_op) -{ - switch(vlc_op) { - VLC_OP_ARG_LEN(END, 0); - VLC_OP_ARG_LEN(CLOSE, 0); - VLC_OP_ARG_LEN(MOVE, 2); - VLC_OP_ARG_LEN(MOVE_REL, 2); - VLC_OP_ARG_LEN(LINE, 2); - VLC_OP_ARG_LEN(LINE_REL, 2); - VLC_OP_ARG_LEN(QUAD, 4); - VLC_OP_ARG_LEN(QUAD_REL, 4); - VLC_OP_ARG_LEN(CUBIC, 6); - VLC_OP_ARG_LEN(CUBIC_REL, 6); - VLC_OP_ARG_LEN(SCCWARC, 5); - VLC_OP_ARG_LEN(SCCWARC_REL, 5); - VLC_OP_ARG_LEN(SCWARC, 5); - VLC_OP_ARG_LEN(SCWARC_REL, 5); - VLC_OP_ARG_LEN(LCCWARC, 5); - VLC_OP_ARG_LEN(LCCWARC_REL, 5); - VLC_OP_ARG_LEN(LCWARC, 5); - VLC_OP_ARG_LEN(LCWARC_REL, 5); - default: - LV_LOG_ERROR("UNKNOW_VLC_OP: 0x%x", vlc_op); - LV_ASSERT(false); - break; - } - - return 0; -} - -static Result shape_set_stroke(std::unique_ptr & shape, const vg_lite_path_t * path) -{ - switch(path->path_type) { - case VG_LITE_DRAW_ZERO: - case VG_LITE_DRAW_FILL_PATH: - /* if path is not a stroke, return */ - return Result::Success; - - case VG_LITE_DRAW_STROKE_PATH: - case VG_LITE_DRAW_FILL_STROKE_PATH: - break; - - default: - LV_LOG_ERROR("unknown path type: %d", path->path_type); - return Result::InvalidArguments; - } - - LV_ASSERT_NULL(path->stroke); - TVG_CHECK_RETURN_RESULT(shape->stroke(path->stroke->line_width)); - TVG_CHECK_RETURN_RESULT(shape->strokeMiterlimit(path->stroke->miter_limit)); - TVG_CHECK_RETURN_RESULT(shape->stroke(stroke_cap_conv(path->stroke->cap_style))); - TVG_CHECK_RETURN_RESULT(shape->stroke(stroke_join_conv(path->stroke->join_style))); - TVG_CHECK_RETURN_RESULT(shape->stroke(TVG_COLOR(path->stroke_color))); - - if(path->stroke->pattern_count) { - LV_ASSERT_NULL(path->stroke->dash_pattern); - TVG_CHECK_RETURN_RESULT(shape->stroke(path->stroke->dash_pattern, path->stroke->pattern_count)); - } - - return Result::Success; -} - -static Result shape_append_path(std::unique_ptr & shape, vg_lite_path_t * path, vg_lite_matrix_t * matrix) -{ - uint8_t fmt_len = vlc_format_len(path->format); - uint8_t * cur = (uint8_t *)path->path; - uint8_t * end = cur + path->path_length; - - while(cur < end) { - /* get op code */ - uint8_t op_code = VLC_GET_OP_CODE(cur); - - /* get arguments length */ - uint8_t arg_len = vlc_op_arg_len(op_code); - - /* skip op code */ - cur += fmt_len; - - switch(op_code) { - case VLC_OP_MOVE: { - float x = VLC_GET_ARG(cur, 0); - float y = VLC_GET_ARG(cur, 1); - TVG_CHECK_RETURN_RESULT(shape->moveTo(x, y)); - } - break; - - case VLC_OP_LINE: { - float x = VLC_GET_ARG(cur, 0); - float y = VLC_GET_ARG(cur, 1); - TVG_CHECK_RETURN_RESULT(shape->lineTo(x, y)); - } - break; - - case VLC_OP_QUAD: { - /* hack pre point */ - float qcx0 = VLC_GET_ARG(cur, -3); - float qcy0 = VLC_GET_ARG(cur, -2); - float qcx1 = VLC_GET_ARG(cur, 0); - float qcy1 = VLC_GET_ARG(cur, 1); - float x = VLC_GET_ARG(cur, 2); - float y = VLC_GET_ARG(cur, 3); - - qcx0 += (qcx1 - qcx0) * 2 / 3; - qcy0 += (qcy1 - qcy0) * 2 / 3; - qcx1 = x + (qcx1 - x) * 2 / 3; - qcy1 = y + (qcy1 - y) * 2 / 3; - - TVG_CHECK_RETURN_RESULT(shape->cubicTo(qcx0, qcy0, qcx1, qcy1, x, y)); - } - break; - - case VLC_OP_CUBIC: { - float cx1 = VLC_GET_ARG(cur, 0); - float cy1 = VLC_GET_ARG(cur, 1); - float cx2 = VLC_GET_ARG(cur, 2); - float cy2 = VLC_GET_ARG(cur, 3); - float x = VLC_GET_ARG(cur, 4); - float y = VLC_GET_ARG(cur, 5); - TVG_CHECK_RETURN_RESULT(shape->cubicTo(cx1, cy1, cx2, cy2, x, y)); - } - break; - - case VLC_OP_CLOSE: - TVG_CHECK_RETURN_RESULT(shape->close()); - break; - - default: - break; - } - - cur += arg_len * fmt_len; - } - - float x_min = path->bounding_box[0]; - float y_min = path->bounding_box[1]; - float x_max = path->bounding_box[2]; - float y_max = path->bounding_box[3]; - - if(math_equal(x_min, FLT_MIN) && math_equal(y_min, FLT_MIN) - && math_equal(x_max, FLT_MAX) && math_equal(y_max, FLT_MAX)) { - return Result::Success; - } - - TVG_CHECK_RETURN_RESULT(shape_set_stroke(shape, path)); - - auto cilp = Shape::gen(); - TVG_CHECK_RETURN_RESULT(cilp->appendRect(x_min, y_min, x_max - x_min, y_max - y_min, 0, 0)); - TVG_CHECK_RETURN_RESULT(cilp->transform(matrix_conv(matrix))); - TVG_CHECK_RETURN_RESULT(shape->composite(std::move(cilp), CompositeMethod::ClipPath)); - - return Result::Success; -} - -static Result shape_append_rect(std::unique_ptr & shape, const vg_lite_buffer_t * target, - const vg_lite_rectangle_t * rect) -{ - if(rect) { - TVG_CHECK_RETURN_RESULT(shape->appendRect(rect->x, rect->y, rect->width, rect->height, 0, 0)); - } - else if(target) { - TVG_CHECK_RETURN_RESULT(shape->appendRect(0, 0, target->width, target->height, 0, 0)); - } - else { - return Result::InvalidArguments; - } - - return Result::Success; -} - -static Result canvas_set_target(vg_lite_ctx * ctx, vg_lite_buffer_t * target) -{ - void * tvg_target_buffer = nullptr; - - /* if target_buffer needs to be changed, finish current drawing */ - if(ctx->target_buffer && ctx->target_buffer != target->memory) { - vg_lite_finish(); - } - - ctx->target_buffer = target->memory; - ctx->target_format = target->format; - ctx->target_px_size = target->width * target->height; - - if(TVG_IS_VG_FMT_SUPPORT(target->format)) { - /* if target format is supported by VG, use target buffer directly */ - tvg_target_buffer = target->memory; - } - else { - /* if target format is not supported by VG, use internal buffer */ - tvg_target_buffer = ctx->get_temp_target_buffer(target->width, target->height); - } - - Result res = ctx->canvas->target( - (uint32_t *)tvg_target_buffer, - target->width, - target->width, - target->height, - SwCanvas::ARGB8888); - - return res; -} - -static vg_lite_uint32_t width_to_stride(vg_lite_uint32_t w, vg_lite_buffer_format_t color_format) -{ - if(vg_lite_query_feature(gcFEATURE_BIT_VG_16PIXELS_ALIGN)) { - w = VG_LITE_ALIGN(w, 16); - } - - vg_lite_uint32_t mul, div, align; - get_format_bytes(color_format, &mul, &div, &align); - return VG_LITE_ALIGN((w * mul / div), align); -} - -static bool decode_indexed_line( - vg_lite_buffer_format_t color_format, - const vg_lite_uint32_t * palette, - int32_t x, int32_t y, - int32_t w_px, const uint8_t * in, vg_lite_uint32_t * out) -{ - uint8_t px_size; - uint16_t mask; - - vg_lite_uint32_t w_byte = width_to_stride(w_px, color_format); - - in += w_byte * y; /*First pixel*/ - out += w_px * y; - - int8_t shift = 0; - switch(color_format) { - case VG_LITE_INDEX_1: - px_size = 1; - in += x / 8; /*8pixel per byte*/ - shift = 7 - (x & 0x7); - break; - case VG_LITE_INDEX_2: - px_size = 2; - in += x / 4; /*4pixel per byte*/ - shift = 6 - 2 * (x & 0x3); - break; - case VG_LITE_INDEX_4: - px_size = 4; - in += x / 2; /*2pixel per byte*/ - shift = 4 - 4 * (x & 0x1); - break; - case VG_LITE_INDEX_8: - px_size = 8; - in += x; - shift = 0; - break; - default: - LV_ASSERT(false); - return false; - } - - mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/ - - int32_t i; - for(i = 0; i < w_px; i++) { - uint8_t val_act = (*in >> shift) & mask; - out[i] = palette[val_act]; - - shift -= px_size; - if(shift < 0) { - shift = 8 - px_size; - in++; - } - } - return true; -} - -static Result picture_load(vg_lite_ctx * ctx, std::unique_ptr & picture, const vg_lite_buffer_t * source, - vg_lite_color_t color) -{ - vg_lite_uint32_t * image_buffer; - LV_ASSERT(VG_LITE_IS_ALIGNED(source->memory, LV_VG_LITE_THORVG_BUF_ADDR_ALIGN)); - -#if LV_VG_LITE_THORVG_16PIXELS_ALIGN - LV_ASSERT(VG_LITE_IS_ALIGNED(source->width, 16)); -#endif - - if(source->format == VG_LITE_BGRA8888 && source->image_mode == VG_LITE_NORMAL_IMAGE_MODE) { - image_buffer = (vg_lite_uint32_t *)source->memory; - } - else { - vg_lite_uint32_t width = source->width; - vg_lite_uint32_t height = source->height; - vg_lite_uint32_t px_size = width * height; - image_buffer = ctx->get_image_buffer(width, height); - - vg_lite_buffer_t target; - memset(&target, 0, sizeof(target)); - target.memory = image_buffer; - target.format = VG_LITE_BGRA8888; - target.width = width; - target.height = height; - target.stride = width_to_stride(width, target.format); - - switch(source->format) { - case VG_LITE_INDEX_1: - case VG_LITE_INDEX_2: - case VG_LITE_INDEX_4: - case VG_LITE_INDEX_8: { - const vg_lite_uint32_t * clut_colors = ctx->get_CLUT(source->format); - for(vg_lite_uint32_t y = 0; y < height; y++) { - decode_indexed_line(source->format, clut_colors, 0, y, width, (uint8_t *)source->memory, image_buffer); - } - } - break; - - case VG_LITE_A4: { - conv_alpha4_to_bgra8888.convert(&target, source, color); - } - break; - - case VG_LITE_A8: { - conv_alpha8_to_bgra8888.convert(&target, source, color); - } - break; - - case VG_LITE_BGRX8888: { - conv_bgrx8888_to_bgra8888.convert(&target, source); - } - break; - - case VG_LITE_BGR888: { - conv_bgr888_to_bgra8888.convert(&target, source); - } - break; - - case VG_LITE_BGRA5658: { - conv_bgra5658_to_bgra8888.convert(&target, source); - } - break; - - case VG_LITE_BGR565: { - conv_bgr565_to_bgra8888.convert(&target, source); - } - break; - -#if LV_VG_LITE_THORVG_YUV_SUPPORT - case VG_LITE_NV12: { - libyuv::NV12ToARGB((const uint8_t *)source->memory, source->stride, (const uint8_t *)source->yuv.uv_memory, - source->yuv.uv_stride, - (uint8_t *)image_buffer, source->width * sizeof(vg_lite_uint32_t), width, height); - } - break; -#endif - - case VG_LITE_BGRA8888: { - memcpy(image_buffer, source->memory, px_size * sizeof(vg_color32_t)); - } - break; - - default: - LV_LOG_ERROR("unsupported format: %d", source->format); - LV_ASSERT(false); - break; - } - - /* multiply color */ - if(source->image_mode == VG_LITE_MULTIPLY_IMAGE_MODE && !VG_LITE_IS_ALPHA_FORMAT(source->format)) { - vg_color32_t * dest = (vg_color32_t *)image_buffer; - while(px_size--) { - dest->alpha = UDIV255(dest->alpha * A(color)); - dest->red = UDIV255(dest->red * B(color)); - dest->green = UDIV255(dest->green * G(color)); - dest->blue = UDIV255(dest->blue * R(color)); - dest++; - } - } - } - - TVG_CHECK_RETURN_RESULT(picture->load((uint32_t *)image_buffer, source->width, source->height, true)); - - return Result::Success; -} - -static void ClampColor(FLOATVECTOR4 Source, FLOATVECTOR4 Target, uint8_t Premultiplied) -{ - vg_lite_float_t colorMax; - /* Clamp the alpha channel. */ - Target[3] = CLAMP(Source[3], 0.0f, 1.0f); - - /* Determine the maximum value for the color channels. */ - colorMax = Premultiplied ? Target[3] : 1.0f; - - /* Clamp the color channels. */ - Target[0] = CLAMP(Source[0], 0.0f, colorMax); - Target[1] = CLAMP(Source[1], 0.0f, colorMax); - Target[2] = CLAMP(Source[2], 0.0f, colorMax); -} - -static uint8_t PackColorComponent(vg_lite_float_t value) -{ - /* Compute the rounded normalized value. */ - vg_lite_float_t rounded = value * 255.0f + 0.5f; - - /* Get the integer part. */ - int32_t roundedInt = (int32_t)rounded; - - /* Clamp to 0..1 range. */ - uint8_t clamped = (uint8_t)CLAMP(roundedInt, 0, 255); - - /* Return result. */ - return clamped; -} - -/* Get the bpp information of a color format. */ -static void get_format_bytes(vg_lite_buffer_format_t format, - vg_lite_uint32_t * mul, - vg_lite_uint32_t * div, - vg_lite_uint32_t * bytes_align) -{ - *mul = *div = 1; - *bytes_align = 4; - switch(format) { - case VG_LITE_L8: - case VG_LITE_A8: - case VG_LITE_RGBA8888_ETC2_EAC: - break; - - case VG_LITE_A4: - *div = 2; - break; - - case VG_LITE_ABGR1555: - case VG_LITE_ARGB1555: - case VG_LITE_BGRA5551: - case VG_LITE_RGBA5551: - case VG_LITE_RGBA4444: - case VG_LITE_BGRA4444: - case VG_LITE_ABGR4444: - case VG_LITE_ARGB4444: - case VG_LITE_RGB565: - case VG_LITE_BGR565: - case VG_LITE_YUYV: - case VG_LITE_YUY2: - case VG_LITE_YUY2_TILED: - /* AYUY2 buffer memory = YUY2 + alpha. */ - case VG_LITE_AYUY2: - case VG_LITE_AYUY2_TILED: - /* ABGR8565_PLANAR buffer memory = RGB565 + alpha. */ - case VG_LITE_ABGR8565_PLANAR: - case VG_LITE_ARGB8565_PLANAR: - case VG_LITE_RGBA5658_PLANAR: - case VG_LITE_BGRA5658_PLANAR: - *mul = 2; - break; - - case VG_LITE_RGBA8888: - case VG_LITE_BGRA8888: - case VG_LITE_ABGR8888: - case VG_LITE_ARGB8888: - case VG_LITE_RGBX8888: - case VG_LITE_BGRX8888: - case VG_LITE_XBGR8888: - case VG_LITE_XRGB8888: - *mul = 4; - break; - - case VG_LITE_NV12: - case VG_LITE_NV12_TILED: - *mul = 3; - break; - - case VG_LITE_ANV12: - case VG_LITE_ANV12_TILED: - *mul = 4; - break; - - case VG_LITE_INDEX_1: - *div = 8; - *bytes_align = 8; - break; - - case VG_LITE_INDEX_2: - *div = 4; - *bytes_align = 8; - break; - - case VG_LITE_INDEX_4: - *div = 2; - *bytes_align = 8; - break; - - case VG_LITE_INDEX_8: - *bytes_align = 1; - break; - - case VG_LITE_RGBA2222: - case VG_LITE_BGRA2222: - case VG_LITE_ABGR2222: - case VG_LITE_ARGB2222: - *mul = 1; - break; - - case VG_LITE_RGB888: - case VG_LITE_BGR888: - case VG_LITE_ABGR8565: - case VG_LITE_BGRA5658: - case VG_LITE_ARGB8565: - case VG_LITE_RGBA5658: - *mul = 3; - break; - - /* OpenVG format*/ - case VG_sRGBX_8888: - case VG_sRGBA_8888: - case VG_sRGBA_8888_PRE: - case VG_lRGBX_8888: - case VG_lRGBA_8888: - case VG_lRGBA_8888_PRE: - case VG_sXRGB_8888: - case VG_sARGB_8888: - case VG_sARGB_8888_PRE: - case VG_lXRGB_8888: - case VG_lARGB_8888: - case VG_lARGB_8888_PRE: - case VG_sBGRX_8888: - case VG_sBGRA_8888: - case VG_sBGRA_8888_PRE: - case VG_lBGRX_8888: - case VG_lBGRA_8888: - case VG_sXBGR_8888: - case VG_sABGR_8888: - case VG_lBGRA_8888_PRE: - case VG_sABGR_8888_PRE: - case VG_lXBGR_8888: - case VG_lABGR_8888: - case VG_lABGR_8888_PRE: - *mul = 4; - break; - - case VG_sRGBA_5551: - case VG_sRGBA_4444: - case VG_sARGB_1555: - case VG_sARGB_4444: - case VG_sBGRA_5551: - case VG_sBGRA_4444: - case VG_sABGR_1555: - case VG_sABGR_4444: - case VG_sRGB_565: - case VG_sBGR_565: - *mul = 2; - break; - - case VG_sL_8: - case VG_lL_8: - case VG_A_8: - break; - - case VG_BW_1: - case VG_A_4: - case VG_A_1: - *div = 2; - break; - - default: - break; - } -} - -static vg_lite_fpoint_t matrix_transform_point(const vg_lite_matrix_t * matrix, const vg_lite_fpoint_t * point) -{ - vg_lite_fpoint_t p; - p.x = (vg_lite_float_t)(point->x * matrix->m[0][0] + point->y * matrix->m[0][1] + matrix->m[0][2]); - p.y = (vg_lite_float_t)(point->x * matrix->m[1][0] + point->y * matrix->m[1][1] + matrix->m[1][2]); - return p; -} - -static bool vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix) -{ - vg_lite_float_t det00, det01, det02; - vg_lite_float_t d; - bool is_affine; - - /* Test for identity matrix. */ - if(matrix == NULL) { - result->m[0][0] = 1.0f; - result->m[0][1] = 0.0f; - result->m[0][2] = 0.0f; - result->m[1][0] = 0.0f; - result->m[1][1] = 1.0f; - result->m[1][2] = 0.0f; - result->m[2][0] = 0.0f; - result->m[2][1] = 0.0f; - result->m[2][2] = 1.0f; - - /* Success. */ - return true; - } - - det00 = (matrix->m[1][1] * matrix->m[2][2]) - (matrix->m[2][1] * matrix->m[1][2]); - det01 = (matrix->m[2][0] * matrix->m[1][2]) - (matrix->m[1][0] * matrix->m[2][2]); - det02 = (matrix->m[1][0] * matrix->m[2][1]) - (matrix->m[2][0] * matrix->m[1][1]); - - /* Compute determinant. */ - d = (matrix->m[0][0] * det00) + (matrix->m[0][1] * det01) + (matrix->m[0][2] * det02); - - /* Return 0 if there is no inverse matrix. */ - if(d == 0.0f) - return false; - - /* Compute reciprocal. */ - d = 1.0f / d; - - /* Determine if the matrix is affine. */ - is_affine = (matrix->m[2][0] == 0.0f) && (matrix->m[2][1] == 0.0f) && (matrix->m[2][2] == 1.0f); - - result->m[0][0] = d * det00; - result->m[0][1] = d * ((matrix->m[2][1] * matrix->m[0][2]) - (matrix->m[0][1] * matrix->m[2][2])); - result->m[0][2] = d * ((matrix->m[0][1] * matrix->m[1][2]) - (matrix->m[1][1] * matrix->m[0][2])); - result->m[1][0] = d * det01; - result->m[1][1] = d * ((matrix->m[0][0] * matrix->m[2][2]) - (matrix->m[2][0] * matrix->m[0][2])); - result->m[1][2] = d * ((matrix->m[1][0] * matrix->m[0][2]) - (matrix->m[0][0] * matrix->m[1][2])); - result->m[2][0] = is_affine ? 0.0f : d * det02; - result->m[2][1] = is_affine ? 0.0f : d * ((matrix->m[2][0] * matrix->m[0][1]) - (matrix->m[0][0] * matrix->m[2][1])); - result->m[2][2] = is_affine ? 1.0f : d * ((matrix->m[0][0] * matrix->m[1][1]) - (matrix->m[1][0] * matrix->m[0][1])); - - /* Success. */ - return true; -} - -static void vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult) -{ - vg_lite_matrix_t temp; - int row, column; - - /* Process all rows. */ - for(row = 0; row < 3; row++) { - /* Process all columns. */ - for(column = 0; column < 3; column++) { - /* Compute matrix entry. */ - temp.m[row][column] = (matrix->m[row][0] * mult->m[0][column]) - + (matrix->m[row][1] * mult->m[1][column]) - + (matrix->m[row][2] * mult->m[2][column]); - } - } - - /* Copy temporary matrix into result. */ - lv_memcpy(matrix->m, &temp.m, sizeof(temp.m)); -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_mem_core_builtin.c b/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_mem_core_builtin.c deleted file mode 100644 index 23a2181..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_mem_core_builtin.c +++ /dev/null @@ -1,273 +0,0 @@ -/** - * @file lv_malloc_core.c - */ - -/********************* - * INCLUDES - *********************/ -#include "../lv_mem.h" -#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN - -#include "lv_tlsf.h" -#include "../lv_string.h" -#include "../../misc/lv_assert.h" -#include "../../misc/lv_log.h" -#include "../../misc/lv_ll.h" -#include "../../misc/lv_math.h" -#include "../../osal/lv_os.h" -#include "../../core/lv_global.h" - -#ifdef LV_MEM_POOL_INCLUDE - #include LV_MEM_POOL_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ -/*memset the allocated memories to 0xaa and freed memories to 0xbb (just for testing purposes)*/ -#ifndef LV_MEM_ADD_JUNK - #define LV_MEM_ADD_JUNK 0 -#endif - -#ifdef LV_ARCH_64 - #define MEM_UNIT uint64_t - #define ALIGN_MASK 0x7 -#else - #define MEM_UNIT uint32_t - #define ALIGN_MASK 0x3 -#endif -#define state LV_GLOBAL_DEFAULT()->tlsf_state - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_mem_walker(void * ptr, size_t size, int used, void * user); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ -#if LV_USE_LOG && LV_LOG_TRACE_MEM - #define LV_TRACE_MEM(...) LV_LOG_TRACE(__VA_ARGS__) -#else - #define LV_TRACE_MEM(...) -#endif - -#define _COPY(d, s) *d = *s; d++; s++; -#define _SET(d, v) *d = v; d++; -#define _REPEAT8(expr) expr expr expr expr expr expr expr expr - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_mem_init(void) -{ -#if LV_USE_OS - lv_mutex_init(&state.mutex); -#endif - -#if LV_MEM_ADR == 0 -#ifdef LV_MEM_POOL_ALLOC - state.tlsf = lv_tlsf_create_with_pool((void *)LV_MEM_POOL_ALLOC(LV_MEM_SIZE), LV_MEM_SIZE); -#else - /*Allocate a large array to store the dynamically allocated data*/ - static LV_ATTRIBUTE_LARGE_RAM_ARRAY MEM_UNIT work_mem_int[LV_MEM_SIZE / sizeof(MEM_UNIT)]; - state.tlsf = lv_tlsf_create_with_pool((void *)work_mem_int, LV_MEM_SIZE); -#endif -#else - state.tlsf = lv_tlsf_create_with_pool((void *)LV_MEM_ADR, LV_MEM_SIZE); -#endif - - lv_ll_init(&state.pool_ll, sizeof(lv_pool_t)); - - /*Record the first pool*/ - lv_pool_t * pool_p = lv_ll_ins_tail(&state.pool_ll); - LV_ASSERT_MALLOC(pool_p); - *pool_p = lv_tlsf_get_pool(state.tlsf); - -#if LV_MEM_ADD_JUNK - LV_LOG_WARN("LV_MEM_ADD_JUNK is enabled which makes LVGL much slower"); -#endif -} - -void lv_mem_deinit(void) -{ - lv_ll_clear(&state.pool_ll); - lv_tlsf_destroy(state.tlsf); -#if LV_USE_OS - lv_mutex_delete(&state.mutex); -#endif -} - -lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) -{ - lv_mem_pool_t new_pool = lv_tlsf_add_pool(state.tlsf, mem, bytes); - if(!new_pool) { - LV_LOG_WARN("failed to add memory pool, address: %p, size: %zu", mem, bytes); - return NULL; - } - - lv_pool_t * pool_p = lv_ll_ins_tail(&state.pool_ll); - LV_ASSERT_MALLOC(pool_p); - *pool_p = new_pool; - - return new_pool; -} - -void lv_mem_remove_pool(lv_mem_pool_t pool) -{ - lv_pool_t * pool_p; - LV_LL_READ(&state.pool_ll, pool_p) { - if(*pool_p == pool) { - lv_ll_remove(&state.pool_ll, pool_p); - lv_free(pool_p); - lv_tlsf_remove_pool(state.tlsf, pool); - return; - } - } - LV_LOG_WARN("invalid pool: %p", pool); -} - -void * lv_malloc_core(size_t size) -{ -#if LV_USE_OS - lv_mutex_lock(&state.mutex); -#endif - void * p = lv_tlsf_malloc(state.tlsf, size); - - if(p) { - state.cur_used += lv_tlsf_block_size(p); - state.max_used = LV_MAX(state.cur_used, state.max_used); - } - -#if LV_USE_OS - lv_mutex_unlock(&state.mutex); -#endif - return p; -} - -void * lv_realloc_core(void * p, size_t new_size) -{ -#if LV_USE_OS - lv_mutex_lock(&state.mutex); -#endif - - size_t old_size = lv_tlsf_block_size(p); - void * p_new = lv_tlsf_realloc(state.tlsf, p, new_size); - - if(p_new) { - state.cur_used -= old_size; - state.cur_used += lv_tlsf_block_size(p_new); - state.max_used = LV_MAX(state.cur_used, state.max_used); - } -#if LV_USE_OS - lv_mutex_unlock(&state.mutex); -#endif - - return p_new; -} - -void lv_free_core(void * p) -{ -#if LV_USE_OS - lv_mutex_lock(&state.mutex); -#endif - -#if LV_MEM_ADD_JUNK - lv_memset(p, 0xbb, lv_tlsf_block_size(data)); -#endif - size_t size = lv_tlsf_block_size(p); - lv_tlsf_free(state.tlsf, p); - if(state.cur_used > size) state.cur_used -= size; - else state.cur_used = 0; - -#if LV_USE_OS - lv_mutex_unlock(&state.mutex); -#endif -} - -void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) -{ - /*Init the data*/ - lv_memzero(mon_p, sizeof(lv_mem_monitor_t)); - LV_TRACE_MEM("begin"); - - lv_pool_t * pool_p; - LV_LL_READ(&state.pool_ll, pool_p) { - lv_tlsf_walk_pool(*pool_p, lv_mem_walker, mon_p); - } - - mon_p->used_pct = 100 - (uint64_t)100U * mon_p->free_size / mon_p->total_size; - if(mon_p->free_size > 0) { - mon_p->frag_pct = (uint64_t)mon_p->free_biggest_size * 100U / mon_p->free_size; - mon_p->frag_pct = 100 - mon_p->frag_pct; - } - else { - mon_p->frag_pct = 0; /*no fragmentation if all the RAM is used*/ - } - - mon_p->max_used = state.max_used; - - LV_TRACE_MEM("finished"); -} - -lv_result_t lv_mem_test_core(void) -{ -#if LV_USE_OS - lv_mutex_lock(&state.mutex); -#endif - if(lv_tlsf_check(state.tlsf)) { - LV_LOG_WARN("failed"); -#if LV_USE_OS - lv_mutex_unlock(&state.mutex); -#endif - return LV_RESULT_INVALID; - } - - lv_pool_t * pool_p; - LV_LL_READ(&state.pool_ll, pool_p) { - if(lv_tlsf_check_pool(*pool_p)) { - LV_LOG_WARN("pool failed"); -#if LV_USE_OS - lv_mutex_unlock(&state.mutex); -#endif - return LV_RESULT_INVALID; - } - } - - LV_TRACE_MEM("passed"); -#if LV_USE_OS - lv_mutex_unlock(&state.mutex); -#endif - return LV_RESULT_OK; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_mem_walker(void * ptr, size_t size, int used, void * user) -{ - LV_UNUSED(ptr); - - lv_mem_monitor_t * mon_p = user; - mon_p->total_size += size; - if(used) { - mon_p->used_cnt++; - } - else { - mon_p->free_cnt++; - mon_p->free_size += size; - if(size > mon_p->free_biggest_size) - mon_p->free_biggest_size = size; - } -} -#endif /*LV_STDLIB_BUILTIN*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_sprintf_builtin.c b/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_sprintf_builtin.c deleted file mode 100644 index fc34db4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_sprintf_builtin.c +++ /dev/null @@ -1,886 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// \author (c) Marco Paland (info@paland.com) -// 2014-2019, PALANDesign Hannover, Germany -// -// \license The MIT License (MIT) -// -// 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. -// -// \brief Tiny printf, sprintf and (v)snprintf implementation, optimized for speed on -// embedded systems with a very limited resources. These routines are thread -// safe and reentrant! -// Use this instead of the bloated standard/newlib printf cause these use -// malloc for printf (and may not be thread safe). -// -/////////////////////////////////////////////////////////////////////////////// - -/*Original repository: https://github.com/mpaland/printf*/ - -#include "../../lv_conf_internal.h" -#if LV_USE_STDLIB_SPRINTF == LV_STDLIB_BUILTIN - -#include "../lv_sprintf.h" -#include "../../misc/lv_types.h" - -#define PRINTF_DISABLE_SUPPORT_FLOAT (!LV_USE_FLOAT) - -// 'ntoa' conversion buffer size, this must be big enough to hold one converted -// numeric number including padded zeros (dynamically created on stack) -// default: 32 byte -#ifndef PRINTF_NTOA_BUFFER_SIZE - #define PRINTF_NTOA_BUFFER_SIZE 32U -#endif - -// 'ftoa' conversion buffer size, this must be big enough to hold one converted -// float number including padded zeros (dynamically created on stack) -// default: 32 byte -#ifndef PRINTF_FTOA_BUFFER_SIZE - #define PRINTF_FTOA_BUFFER_SIZE 32U -#endif - -// support for the floating point type (%f) -// default: activated -#if !PRINTF_DISABLE_SUPPORT_FLOAT - #define PRINTF_SUPPORT_FLOAT -#endif - -// support for exponential floating point notation (%e/%g) -// default: activated -#ifndef PRINTF_DISABLE_SUPPORT_EXPONENTIAL - #define PRINTF_SUPPORT_EXPONENTIAL -#endif - -// define the default floating point precision -// default: 6 digits -#ifndef PRINTF_DEFAULT_FLOAT_PRECISION - #define PRINTF_DEFAULT_FLOAT_PRECISION 6U -#endif - -// define the largest float suitable to print with %f -// default: 1e9 -#ifndef PRINTF_MAX_FLOAT - #define PRINTF_MAX_FLOAT 1e9 -#endif - -// support for the long long types (%llu or %p) -// default: activated -#ifndef PRINTF_DISABLE_SUPPORT_LONG_LONG - #define PRINTF_SUPPORT_LONG_LONG -#endif - -// support for the ptrdiff_t type (%t) -// ptrdiff_t is normally defined in as long or long long type -// default: activated -#ifndef PRINTF_DISABLE_SUPPORT_PTRDIFF_T - #define PRINTF_SUPPORT_PTRDIFF_T -#endif - -/////////////////////////////////////////////////////////////////////////////// - -// internal flag definitions -#define FLAGS_ZEROPAD (1U << 0U) -#define FLAGS_LEFT (1U << 1U) -#define FLAGS_PLUS (1U << 2U) -#define FLAGS_SPACE (1U << 3U) -#define FLAGS_HASH (1U << 4U) -#define FLAGS_UPPERCASE (1U << 5U) -#define FLAGS_CHAR (1U << 6U) -#define FLAGS_SHORT (1U << 7U) -#define FLAGS_LONG (1U << 8U) -#define FLAGS_LONG_LONG (1U << 9U) -#define FLAGS_PRECISION (1U << 10U) -#define FLAGS_ADAPT_EXP (1U << 11U) - -typedef struct { - const char * fmt; - va_list * va; -} lv_vaformat_t; - -// import float.h for DBL_MAX -#if defined(PRINTF_SUPPORT_FLOAT) - #include -#endif - -// output function type -typedef void (*out_fct_type)(char character, void * buffer, size_t idx, size_t maxlen); - -// wrapper (used as buffer) for output function type -typedef struct { - void (*fct)(char character, void * arg); - void * arg; -} out_fct_wrap_type; - -// internal buffer output -static inline void _out_buffer(char character, void * buffer, size_t idx, size_t maxlen) -{ - if(idx < maxlen) { - ((char *)buffer)[idx] = character; - } -} - -// internal null output -static inline void _out_null(char character, void * buffer, size_t idx, size_t maxlen) -{ - LV_UNUSED(character); - LV_UNUSED(buffer); - LV_UNUSED(idx); - LV_UNUSED(maxlen); -} - -// internal secure strlen -// \return The length of the string (excluding the terminating 0) limited by 'maxsize' -static inline unsigned int _strnlen_s(const char * str, size_t maxsize) -{ - const char * s; - for(s = str; *s && maxsize--; ++s); - return (unsigned int)(s - str); -} - -// internal test if char is a digit (0-9) -// \return true if char is a digit -static inline bool _is_digit(char ch) -{ - return (ch >= '0') && (ch <= '9'); -} - -// internal ASCII string to unsigned int conversion -static unsigned int _atoi(const char ** str) -{ - unsigned int i = 0U; - while(_is_digit(**str)) { - i = i * 10U + (unsigned int)(*((*str)++) - '0'); - } - return i; -} - -// output the specified string in reverse, taking care of any zero-padding -static size_t _out_rev(out_fct_type out, char * buffer, size_t idx, size_t maxlen, const char * buf, size_t len, - unsigned int width, unsigned int flags) -{ - const size_t start_idx = idx; - - // pad spaces up to given width - if(!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { - size_t i; - for(i = len; i < width; i++) { - out(' ', buffer, idx++, maxlen); - } - } - - // reverse string - while(len) { - out(buf[--len], buffer, idx++, maxlen); - } - - // append pad spaces up to given width - if(flags & FLAGS_LEFT) { - while(idx - start_idx < width) { - out(' ', buffer, idx++, maxlen); - } - } - - return idx; -} - -// internal itoa format -static size_t _ntoa_format(out_fct_type out, char * buffer, size_t idx, size_t maxlen, char * buf, size_t len, - bool negative, unsigned int base, unsigned int prec, unsigned int width, unsigned int flags) -{ - // pad leading zeros - if(!(flags & FLAGS_LEFT)) { - if(width && (flags & FLAGS_ZEROPAD) && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { - width--; - } - while((len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { - buf[len++] = '0'; - } - while((flags & FLAGS_ZEROPAD) && (len < width) && (len < PRINTF_NTOA_BUFFER_SIZE)) { - buf[len++] = '0'; - } - } - - // handle hash - if(flags & FLAGS_HASH) { - if(!(flags & FLAGS_PRECISION) && len && ((len == prec) || (len == width))) { - len--; - if(len && (base == 16U)) { - len--; - } - } - if((base == 16U) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { - buf[len++] = 'x'; - } - else if((base == 16U) && (flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { - buf[len++] = 'X'; - } - else if((base == 2U) && (len < PRINTF_NTOA_BUFFER_SIZE)) { - buf[len++] = 'b'; - } - if(len < PRINTF_NTOA_BUFFER_SIZE) { - buf[len++] = '0'; - } - } - - if(len < PRINTF_NTOA_BUFFER_SIZE) { - if(negative) { - buf[len++] = '-'; - } - else if(flags & FLAGS_PLUS) { - buf[len++] = '+'; // ignore the space if the '+' exists - } - else if(flags & FLAGS_SPACE) { - buf[len++] = ' '; - } - } - - return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); -} - -// internal itoa for 'long' type -static size_t _ntoa_long(out_fct_type out, char * buffer, size_t idx, size_t maxlen, unsigned long value, bool negative, - unsigned long base, unsigned int prec, unsigned int width, unsigned int flags) -{ - char buf[PRINTF_NTOA_BUFFER_SIZE]; - size_t len = 0U; - - // no hash for 0 values - if(!value) { - flags &= ~FLAGS_HASH; - } - - // write if precision != 0 and value is != 0 - if(!(flags & FLAGS_PRECISION) || value) { - do { - const char digit = (char)(value % base); - buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; - value /= base; - } while(value && (len < PRINTF_NTOA_BUFFER_SIZE)); - } - - return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); -} - -// internal itoa for 'long long' type -#if defined(PRINTF_SUPPORT_LONG_LONG) -static size_t _ntoa_long_long(out_fct_type out, char * buffer, size_t idx, size_t maxlen, unsigned long long value, - bool negative, unsigned long long base, unsigned int prec, unsigned int width, unsigned int flags) -{ - char buf[PRINTF_NTOA_BUFFER_SIZE]; - size_t len = 0U; - - // no hash for 0 values - if(!value) { - flags &= ~FLAGS_HASH; - } - - // write if precision != 0 and value is != 0 - if(!(flags & FLAGS_PRECISION) || value) { - do { - const char digit = (char)(value % base); - buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; - value /= base; - } while(value && (len < PRINTF_NTOA_BUFFER_SIZE)); - } - - return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); -} -#endif // PRINTF_SUPPORT_LONG_LONG - -#if defined(PRINTF_SUPPORT_FLOAT) - -#if defined(PRINTF_SUPPORT_EXPONENTIAL) -// forward declaration so that _ftoa can switch to exp notation for values > PRINTF_MAX_FLOAT -static size_t _etoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen, double value, unsigned int prec, - unsigned int width, unsigned int flags); -#endif - -// internal ftoa for fixed decimal floating point -static size_t _ftoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen, double value, unsigned int prec, - unsigned int width, unsigned int flags) -{ - char buf[PRINTF_FTOA_BUFFER_SIZE]; - size_t len = 0U; - double diff = 0.0; - - // powers of 10 - static const double pow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; - - // test for special values - if(value != value) - return _out_rev(out, buffer, idx, maxlen, "nan", 3, width, flags); - if(value < -DBL_MAX) - return _out_rev(out, buffer, idx, maxlen, "fni-", 4, width, flags); - if(value > DBL_MAX) - return _out_rev(out, buffer, idx, maxlen, (flags & FLAGS_PLUS) ? "fni+" : "fni", (flags & FLAGS_PLUS) ? 4U : 3U, width, - flags); - - // test for very large values - // standard printf behavior is to print EVERY whole number digit -- which could be 100s of characters overflowing your buffers == bad - if((value > PRINTF_MAX_FLOAT) || (value < -PRINTF_MAX_FLOAT)) { -#if defined(PRINTF_SUPPORT_EXPONENTIAL) - return _etoa(out, buffer, idx, maxlen, value, prec, width, flags); -#else - return 0U; -#endif - } - - // test for negative - bool negative = false; - if(value < 0) { - negative = true; - value = 0 - value; - } - - // set default precision, if not set explicitly - if(!(flags & FLAGS_PRECISION)) { - prec = PRINTF_DEFAULT_FLOAT_PRECISION; - } - // limit precision to 9, cause a prec >= 10 can lead to overflow errors - while((len < PRINTF_FTOA_BUFFER_SIZE) && (prec > 9U)) { - buf[len++] = '0'; - prec--; - } - - int whole = (int)value; - double tmp = (value - whole) * pow10[prec]; - unsigned long frac = (unsigned long)tmp; - diff = tmp - frac; - - if(diff > 0.5) { - ++frac; - // handle rollover, e.g. case 0.99 with prec 1 is 1.0 - if(frac >= pow10[prec]) { - frac = 0; - ++whole; - } - } - else if(diff < 0.5) { - } - else if((frac == 0U) || (frac & 1U)) { - // if halfway, round up if odd OR if last digit is 0 - ++frac; - } - - if(prec == 0U) { - diff = value - (double)whole; - if((!(diff < 0.5) || (diff > 0.5)) && (whole & 1)) { - // exactly 0.5 and ODD, then round up - // 1.5 -> 2, but 2.5 -> 2 - ++whole; - } - } - else { - unsigned int count = prec; - // now do fractional part, as an unsigned number - while(len < PRINTF_FTOA_BUFFER_SIZE) { - --count; - buf[len++] = (char)(48U + (frac % 10U)); - if(!(frac /= 10U)) { - break; - } - } - // add extra 0s - while((len < PRINTF_FTOA_BUFFER_SIZE) && (count-- > 0U)) { - buf[len++] = '0'; - } - if(len < PRINTF_FTOA_BUFFER_SIZE) { - // add decimal - buf[len++] = '.'; - } - } - - // do whole part, number is reversed - while(len < PRINTF_FTOA_BUFFER_SIZE) { - buf[len++] = (char)(48 + (whole % 10)); - if(!(whole /= 10)) { - break; - } - } - - // pad leading zeros - if(!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD)) { - if(width && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { - width--; - } - while((len < width) && (len < PRINTF_FTOA_BUFFER_SIZE)) { - buf[len++] = '0'; - } - } - - if(len < PRINTF_FTOA_BUFFER_SIZE) { - if(negative) { - buf[len++] = '-'; - } - else if(flags & FLAGS_PLUS) { - buf[len++] = '+'; // ignore the space if the '+' exists - } - else if(flags & FLAGS_SPACE) { - buf[len++] = ' '; - } - } - - return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); -} - -#if defined(PRINTF_SUPPORT_EXPONENTIAL) -// internal ftoa variant for exponential floating-point type, contributed by Martijn Jasperse -static size_t _etoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen, double value, unsigned int prec, - unsigned int width, unsigned int flags) -{ - // check for NaN and special values - if((value != value) || (value > DBL_MAX) || (value < -DBL_MAX)) { - return _ftoa(out, buffer, idx, maxlen, value, prec, width, flags); - } - - // determine the sign - const bool negative = value < 0; - if(negative) { - value = -value; - } - - // default precision - if(!(flags & FLAGS_PRECISION)) { - prec = PRINTF_DEFAULT_FLOAT_PRECISION; - } - - // determine the decimal exponent - // based on the algorithm by David Gay (https://www.ampl.com/netlib/fp/dtoa.c) - union { - uint64_t U; - double F; - } conv; - - conv.F = value; - int exp2 = (int)((conv.U >> 52U) & 0x07FFU) - 1023; // effectively log2 - conv.U = (conv.U & ((1ULL << 52U) - 1U)) | (1023ULL << 52U); // drop the exponent so conv.F is now in [1,2) - // now approximate log10 from the log2 integer part and an expansion of ln around 1.5 - int expval = (int)(0.1760912590558 + exp2 * 0.301029995663981 + (conv.F - 1.5) * 0.289529654602168); - // now we want to compute 10^expval but we want to be sure it won't overflow - exp2 = (int)(expval * 3.321928094887362 + 0.5); - const double z = expval * 2.302585092994046 - exp2 * 0.6931471805599453; - const double z2 = z * z; - conv.U = (uint64_t)(exp2 + 1023) << 52U; - // compute exp(z) using continued fractions, see https://en.wikipedia.org/wiki/Exponential_function#Continued_fractions_for_ex - conv.F *= 1 + 2 * z / (2 - z + (z2 / (6 + (z2 / (10 + z2 / 14))))); - // correct for rounding errors - if(value < conv.F) { - expval--; - conv.F /= 10; - } - - // the exponent format is "%+03d" and largest value is "307", so set aside 4-5 characters - unsigned int minwidth = ((expval < 100) && (expval > -100)) ? 4U : 5U; - - // in "%g" mode, "prec" is the number of *significant figures* not decimals - if(flags & FLAGS_ADAPT_EXP) { - // do we want to fall-back to "%f" mode? - if((value >= 1e-4) && (value < 1e6)) { - if((int)prec > expval) { - prec = (unsigned)((int)prec - expval - 1); - } - else { - prec = 0; - } - flags |= FLAGS_PRECISION; // make sure _ftoa respects precision - // no characters in exponent - minwidth = 0U; - expval = 0; - } - else { - // we use one sigfig for the whole part - if((prec > 0) && (flags & FLAGS_PRECISION)) { - --prec; - } - } - } - - // will everything fit? - unsigned int fwidth = width; - if(width > minwidth) { - // we didn't fall-back so subtract the characters required for the exponent - fwidth -= minwidth; - } - else { - // not enough characters, so go back to default sizing - fwidth = 0U; - } - if((flags & FLAGS_LEFT) && minwidth) { - // if we're padding on the right, DON'T pad the floating part - fwidth = 0U; - } - - // rescale the float value - if(expval) { - value /= conv.F; - } - - // output the floating part - const size_t start_idx = idx; - idx = _ftoa(out, buffer, idx, maxlen, negative ? -value : value, prec, fwidth, flags & ~FLAGS_ADAPT_EXP); - - // output the exponent part - if(minwidth) { - // output the exponential symbol - out((flags & FLAGS_UPPERCASE) ? 'E' : 'e', buffer, idx++, maxlen); - // output the exponent value - idx = _ntoa_long(out, buffer, idx, maxlen, (expval < 0) ? -expval : expval, expval < 0, 10, 0, minwidth - 1, - FLAGS_ZEROPAD | FLAGS_PLUS); - // might need to right-pad spaces - if(flags & FLAGS_LEFT) { - while(idx - start_idx < width) out(' ', buffer, idx++, maxlen); - } - } - return idx; -} -#endif // PRINTF_SUPPORT_EXPONENTIAL -#endif // PRINTF_SUPPORT_FLOAT - -// internal vsnprintf -static int lv_vsnprintf_inner(out_fct_type out, char * buffer, const size_t maxlen, const char * format, va_list va) -{ - unsigned int flags, width, precision, n; - size_t idx = 0U; - - if(!buffer) { - // use null output function - out = _out_null; - } - - while(*format) { - // format specifier? %[flags][width][.precision][length] - if(*format != '%') { - // no - out(*format, buffer, idx++, maxlen); - format++; - continue; - } - else { - // yes, evaluate it - format++; - } - - // evaluate flags - flags = 0U; - do { - switch(*format) { - case '0': - flags |= FLAGS_ZEROPAD; - format++; - n = 1U; - break; - case '-': - flags |= FLAGS_LEFT; - format++; - n = 1U; - break; - case '+': - flags |= FLAGS_PLUS; - format++; - n = 1U; - break; - case ' ': - flags |= FLAGS_SPACE; - format++; - n = 1U; - break; - case '#': - flags |= FLAGS_HASH; - format++; - n = 1U; - break; - default : - n = 0U; - break; - } - } while(n); - - // evaluate width field - width = 0U; - if(_is_digit(*format)) { - width = _atoi(&format); - } - else if(*format == '*') { - const int w = va_arg(va, int); - if(w < 0) { - flags |= FLAGS_LEFT; // reverse padding - width = (unsigned int) - w; - } - else { - width = (unsigned int)w; - } - format++; - } - - // evaluate precision field - precision = 0U; - if(*format == '.') { - flags |= FLAGS_PRECISION; - format++; - if(_is_digit(*format)) { - precision = _atoi(&format); - } - else if(*format == '*') { - const int prec = (int)va_arg(va, int); - precision = prec > 0 ? (unsigned int)prec : 0U; - format++; - } - } - - // evaluate length field - switch(*format) { - case 'l' : - flags |= FLAGS_LONG; - format++; - if(*format == 'l') { - flags |= FLAGS_LONG_LONG; - format++; - } - break; - case 'h' : - flags |= FLAGS_SHORT; - format++; - if(*format == 'h') { - flags |= FLAGS_CHAR; - format++; - } - break; -#if defined(PRINTF_SUPPORT_PTRDIFF_T) - case 't' : - flags |= (sizeof(ptrdiff_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); - format++; - break; -#endif - case 'j' : - flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); - format++; - break; - case 'z' : - flags |= (sizeof(size_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); - format++; - break; - default : - break; - } - - // evaluate specifier - switch(*format) { - case 'd' : - case 'i' : - case 'u' : - case 'x' : - case 'X' : - case 'p' : - case 'P' : - case 'o' : - case 'b' : { - // set the base - unsigned int base; - if(*format == 'x' || *format == 'X') { - base = 16U; - } - else if(*format == 'p' || *format == 'P') { - base = 16U; - flags |= FLAGS_HASH; // always hash for pointer format -#if defined(PRINTF_SUPPORT_LONG_LONG) - if(sizeof(uintptr_t) == sizeof(long long)) - flags |= FLAGS_LONG_LONG; - else -#endif - flags |= FLAGS_LONG; - - if(*(format + 1) == 'V') - format++; - } - else if(*format == 'o') { - base = 8U; - } - else if(*format == 'b') { - base = 2U; - } - else { - base = 10U; - flags &= ~FLAGS_HASH; // no hash for dec format - } - // uppercase - if(*format == 'X' || *format == 'P') { - flags |= FLAGS_UPPERCASE; - } - - // no plus or space flag for u, x, X, o, b - if((*format != 'i') && (*format != 'd')) { - flags &= ~(FLAGS_PLUS | FLAGS_SPACE); - } - - // ignore '0' flag when precision is given - if(flags & FLAGS_PRECISION) { - flags &= ~FLAGS_ZEROPAD; - } - - // convert the integer - if((*format == 'i') || (*format == 'd')) { - // signed - if(flags & FLAGS_LONG_LONG) { -#if defined(PRINTF_SUPPORT_LONG_LONG) - const long long value = va_arg(va, long long); - idx = _ntoa_long_long(out, buffer, idx, maxlen, (unsigned long long)(value > 0 ? value : 0 - value), value < 0, base, - precision, width, flags); -#endif - } - else if(flags & FLAGS_LONG) { - const long value = va_arg(va, long); - idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned long)(value > 0 ? value : 0 - value), value < 0, base, precision, - width, flags); - } - else { - const int value = (flags & FLAGS_CHAR) ? (char)va_arg(va, int) : (flags & FLAGS_SHORT) ? (short int)va_arg(va, - int) : va_arg(va, int); - idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned int)(value > 0 ? value : 0 - value), value < 0, base, precision, - width, flags); - } - } - else if(*format == 'V') { - lv_vaformat_t * vaf = va_arg(va, lv_vaformat_t *); - va_list copy; - - va_copy(copy, *vaf->va); - idx += lv_vsnprintf_inner(out, buffer + idx, maxlen - idx, vaf->fmt, copy); - va_end(copy); - } - else { - // unsigned - if(flags & FLAGS_LONG_LONG) { -#if defined(PRINTF_SUPPORT_LONG_LONG) - idx = _ntoa_long_long(out, buffer, idx, maxlen, va_arg(va, unsigned long long), false, base, precision, width, flags); -#endif - } - else if(flags & FLAGS_LONG) { - idx = _ntoa_long(out, buffer, idx, maxlen, va_arg(va, unsigned long), false, base, precision, width, flags); - } - else { - const unsigned int value = (flags & FLAGS_CHAR) ? (unsigned char)va_arg(va, - unsigned int) : (flags & FLAGS_SHORT) ? (unsigned short int)va_arg(va, unsigned int) : va_arg(va, unsigned int); - idx = _ntoa_long(out, buffer, idx, maxlen, value, false, base, precision, width, flags); - } - } - format++; - break; - } -#if defined(PRINTF_SUPPORT_FLOAT) - case 'f' : - case 'F' : - if(*format == 'F') flags |= FLAGS_UPPERCASE; - idx = _ftoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); - format++; - break; -#if defined(PRINTF_SUPPORT_EXPONENTIAL) - case 'e': - case 'E': - case 'g': - case 'G': - if((*format == 'g') || (*format == 'G')) flags |= FLAGS_ADAPT_EXP; - if((*format == 'E') || (*format == 'G')) flags |= FLAGS_UPPERCASE; - idx = _etoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); - format++; - break; -#endif // PRINTF_SUPPORT_EXPONENTIAL -#endif // PRINTF_SUPPORT_FLOAT - case 'c' : { - unsigned int l = 1U; - // pre padding - if(!(flags & FLAGS_LEFT)) { - while(l++ < width) { - out(' ', buffer, idx++, maxlen); - } - } - // char output - out((char)va_arg(va, int), buffer, idx++, maxlen); - // post padding - if(flags & FLAGS_LEFT) { - while(l++ < width) { - out(' ', buffer, idx++, maxlen); - } - } - format++; - break; - } - - case 's' : { - const char * p = va_arg(va, char *); - unsigned int l = _strnlen_s(p, precision ? precision : (size_t) -1); - // pre padding - if(flags & FLAGS_PRECISION) { - l = (l < precision ? l : precision); - } - if(!(flags & FLAGS_LEFT)) { - while(l++ < width) { - out(' ', buffer, idx++, maxlen); - } - } - // string output - while((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { - out(*(p++), buffer, idx++, maxlen); - } - // post padding - if(flags & FLAGS_LEFT) { - while(l++ < width) { - out(' ', buffer, idx++, maxlen); - } - } - format++; - break; - } - - case '%' : - out('%', buffer, idx++, maxlen); - format++; - break; - - default : - out(*format, buffer, idx++, maxlen); - format++; - break; - } - } - - // termination - out((char)0, buffer, idx < maxlen ? idx : maxlen - 1U, maxlen); - - // return written chars without terminating \0 - return (int)idx; -} - -/////////////////////////////////////////////////////////////////////////////// -/// GLOBAL FUNCTIONS FOR LVGL -/////////////////////////////////////////////////////////////////////////////// - -int lv_snprintf(char * buffer, size_t count, const char * format, ...) -{ - va_list va; - va_start(va, format); - const int ret = lv_vsnprintf_inner(_out_buffer, buffer, count, format, va); - va_end(va); - return ret; -} - -int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) -{ - return lv_vsnprintf_inner(_out_buffer, buffer, count, format, va); -} - -#endif /*LV_STDLIB_BUILTIN*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_string_builtin.c b/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_string_builtin.c deleted file mode 100644 index f225adc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_string_builtin.c +++ /dev/null @@ -1,269 +0,0 @@ -/** - * @file lv_string.c - */ - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_STDLIB_STRING == LV_STDLIB_BUILTIN -#include "../../misc/lv_assert.h" -#include "../../misc/lv_log.h" -#include "../../misc/lv_math.h" -#include "../../stdlib/lv_string.h" -#include "../../stdlib/lv_mem.h" - -/********************* - * DEFINES - *********************/ -#ifdef LV_ARCH_64 - #define MEM_UNIT uint64_t - #define ALIGN_MASK 0x7 -#else - #define MEM_UNIT uint32_t - #define ALIGN_MASK 0x3 -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ -#if LV_USE_LOG && LV_LOG_TRACE_MEM - #define LV_TRACE_MEM(...) LV_LOG_TRACE(__VA_ARGS__) -#else - #define LV_TRACE_MEM(...) -#endif - -#define _COPY(d, s) *d = *s; d++; s++; -#define _SET(d, v) *d = v; d++; -#define _REPEAT8(expr) expr expr expr expr expr expr expr expr - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len) -{ - uint8_t * d8 = dst; - const uint8_t * s8 = src; - - /*Simplify for small memories*/ - if(len < 16) { - while(len) { - *d8 = *s8; - d8++; - s8++; - len--; - } - return dst; - } - - lv_uintptr_t d_align = (lv_uintptr_t)d8 & ALIGN_MASK; - lv_uintptr_t s_align = (lv_uintptr_t)s8 & ALIGN_MASK; - - /*Byte copy for unaligned memories*/ - if(s_align != d_align) { - while(len > 32) { - _REPEAT8(_COPY(d8, s8)); - _REPEAT8(_COPY(d8, s8)); - _REPEAT8(_COPY(d8, s8)); - _REPEAT8(_COPY(d8, s8)); - len -= 32; - } - while(len) { - _COPY(d8, s8) - len--; - } - return dst; - } - - /*Make the memories aligned*/ - if(d_align) { - d_align = ALIGN_MASK + 1 - d_align; - while(d_align && len) { - _COPY(d8, s8); - d_align--; - len--; - } - } - - uint32_t * d32 = (uint32_t *)d8; - const uint32_t * s32 = (uint32_t *)s8; - while(len > 32) { - _REPEAT8(_COPY(d32, s32)) - len -= 32; - } - - d8 = (uint8_t *)d32; - s8 = (const uint8_t *)s32; - while(len) { - _COPY(d8, s8) - len--; - } - - return dst; -} - -void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len) -{ - uint8_t * d8 = (uint8_t *)dst; - uintptr_t d_align = (lv_uintptr_t) d8 & ALIGN_MASK; - - /*Make the address aligned*/ - if(d_align) { - d_align = ALIGN_MASK + 1 - d_align; - while(d_align && len) { - _SET(d8, v); - len--; - d_align--; - } - } - - uint32_t v32 = (uint32_t)v + ((uint32_t)v << 8) + ((uint32_t)v << 16) + ((uint32_t)v << 24); - uint32_t * d32 = (uint32_t *)d8; - - while(len > 32) { - _REPEAT8(_SET(d32, v32)); - len -= 32; - } - - d8 = (uint8_t *)d32; - while(len) { - _SET(d8, v); - len--; - } -} - -void * LV_ATTRIBUTE_FAST_MEM lv_memmove(void * dst, const void * src, size_t len) -{ - if(dst < src || (char *)dst > ((char *)src + len)) { - return lv_memcpy(dst, src, len); - } - - if(dst > src) { - char * tmp = (char *)dst + len - 1; - char * s = (char *)src + len - 1; - - while(len--) { - *tmp-- = *s--; - } - } - else { - char * tmp = (char *)dst; - char * s = (char *)src; - - while(len--) { - *tmp++ = *s++; - } - } - - return dst; -} - -int lv_memcmp(const void * p1, const void * p2, size_t len) -{ - const char * s1 = (const char *) p1; - const char * s2 = (const char *) p2; - while(--len > 0 && (*s1 == *s2)) { - s1++; - s2++; - } - return *s1 - *s2; -} - -/* See https://en.cppreference.com/w/c/string/byte/strlen for reference */ -size_t lv_strlen(const char * str) -{ - size_t i = 0; - while(str[i]) i++; - - return i; -} - -size_t lv_strlcpy(char * dst, const char * src, size_t dst_size) -{ - size_t i = 0; - if(dst_size > 0) { - for(; i < dst_size - 1 && src[i]; i++) { - dst[i] = src[i]; - } - dst[i] = '\0'; - } - while(src[i]) i++; - return i; -} - -char * lv_strncpy(char * dst, const char * src, size_t dst_size) -{ - size_t i; - for(i = 0; i < dst_size && src[i]; i++) { - dst[i] = src[i]; - } - for(; i < dst_size; i++) { - dst[i] = '\0'; - } - return dst; -} - -char * lv_strcpy(char * dst, const char * src) -{ - char * tmp = dst; - while((*dst++ = *src++) != '\0'); - return tmp; -} - -int lv_strcmp(const char * s1, const char * s2) -{ - while(*s1 && (*s1 == *s2)) { - s1++; - s2++; - } - return *(const unsigned char *)s1 - *(const unsigned char *)s2; -} - -char * lv_strdup(const char * src) -{ - size_t len = lv_strlen(src) + 1; - char * dst = lv_malloc(len); - if(dst == NULL) return NULL; - - lv_memcpy(dst, src, len); /*memcpy is faster than strncpy when length is known*/ - return dst; -} - -char * lv_strcat(char * dst, const char * src) -{ - lv_strcpy(dst + lv_strlen(dst), src); - return dst; -} - -char * lv_strncat(char * dst, const char * src, size_t src_len) -{ - char * tmp = dst; - while(*dst != '\0') { - dst++; - } - while(src_len != 0 && *src != '\0') { - src_len--; - *dst++ = *src++; - } - *dst = '\0'; - return tmp; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_STDLIB_BUILTIN*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_tlsf.c b/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_tlsf.c deleted file mode 100644 index 4232ae3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_tlsf.c +++ /dev/null @@ -1,1245 +0,0 @@ -#include "../../lv_conf_internal.h" -#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN - -#include "lv_tlsf_private.h" -#include "../../stdlib/lv_string.h" -#include "../../misc/lv_log.h" -#include "../../misc/lv_assert.h" -#include "../../misc/lv_types.h" - -#undef printf -#define printf LV_LOG_ERROR - -#define TLSF_MAX_POOL_SIZE (LV_MEM_SIZE + LV_MEM_POOL_EXPAND_SIZE) - -#if !defined(_DEBUG) - #define _DEBUG 0 -#endif - -#if defined(__cplusplus) - #define tlsf_decl inline -#else - #define tlsf_decl static -#endif - -/* -** Architecture-specific bit manipulation routines. -** -** TLSF achieves O(1) cost for malloc and free operations by limiting -** the search for a free block to a free list of guaranteed size -** adequate to fulfill the request, combined with efficient free list -** queries using bitmasks and architecture-specific bit-manipulation -** routines. -** -** Most modern processors provide instructions to count leading zeroes -** in a word, find the lowest and highest set bit, etc. These -** specific implementations will be used when available, falling back -** to a reasonably efficient generic implementation. -** -** NOTE: TLSF spec relies on ffs/fls returning value 0..31. -** ffs/fls return 1-32 by default, returning 0 for error. -*/ - -/* -** Detect whether or not we are building for a 32- or 64-bit (LP/LLP) -** architecture. There is no reliable portable method at compile-time. -*/ -#if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) \ - || defined (_WIN64) || defined (__LP64__) || defined (__LLP64__) - #define TLSF_64BIT -#endif - -/* -** Returns one plus the index of the most significant 1-bit of n, -** or if n is zero, returns zero. -*/ -#ifdef TLSF_64BIT - #define TLSF_FLS(n) ((n) & 0xffffffff00000000ull ? 32 + TLSF_FLS32((size_t)(n) >> 32) : TLSF_FLS32(n)) -#else - #define TLSF_FLS(n) TLSF_FLS32(n) -#endif - -#define TLSF_FLS32(n) ((n) & 0xffff0000 ? 16 + TLSF_FLS16((n) >> 16) : TLSF_FLS16(n)) -#define TLSF_FLS16(n) ((n) & 0xff00 ? 8 + TLSF_FLS8 ((n) >> 8) : TLSF_FLS8 (n)) -#define TLSF_FLS8(n) ((n) & 0xf0 ? 4 + TLSF_FLS4 ((n) >> 4) : TLSF_FLS4 (n)) -#define TLSF_FLS4(n) ((n) & 0xc ? 2 + TLSF_FLS2 ((n) >> 2) : TLSF_FLS2 (n)) -#define TLSF_FLS2(n) ((n) & 0x2 ? 1 + TLSF_FLS1 ((n) >> 1) : TLSF_FLS1 (n)) -#define TLSF_FLS1(n) ((n) & 0x1 ? 1 : 0) - -/* -** Returns round up value of log2(n). -** Note: it is used at compile time. -*/ -#define TLSF_LOG2_CEIL(n) ((n) & (n - 1) ? TLSF_FLS(n) : TLSF_FLS(n) - 1) - -/* -** gcc 3.4 and above have builtin support, specialized for architecture. -** Some compilers masquerade as gcc; patchlevel test filters them out. -*/ -#if defined (__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) \ - && defined (__GNUC_PATCHLEVEL__) - -#if defined (__SNC__) -/* SNC for PlayStation 3. */ - -tlsf_decl int tlsf_ffs(unsigned int word) -{ - const unsigned int reverse = word & (~word + 1); - const int bit = 32 - __builtin_clz(reverse); - return bit - 1; -} - -#else - -tlsf_decl int tlsf_ffs(unsigned int word) -{ - return __builtin_ffs(word) - 1; -} - -#endif - -tlsf_decl int tlsf_fls(unsigned int word) -{ - const int bit = word ? 32 - __builtin_clz(word) : 0; - return bit - 1; -} - -#elif defined (_MSC_VER) && (_MSC_VER >= 1400) && (defined (_M_IX86) || defined (_M_X64)) -/* Microsoft Visual C++ support on x86/X64 architectures. */ - -#include - -#pragma intrinsic(_BitScanReverse) -#pragma intrinsic(_BitScanForward) - -tlsf_decl int tlsf_fls(unsigned int word) -{ - unsigned long index; - return _BitScanReverse(&index, word) ? index : -1; -} - -tlsf_decl int tlsf_ffs(unsigned int word) -{ - unsigned long index; - return _BitScanForward(&index, word) ? index : -1; -} - -#elif defined (_MSC_VER) && defined (_M_PPC) -/* Microsoft Visual C++ support on PowerPC architectures. */ - -#include - -tlsf_decl int tlsf_fls(unsigned int word) -{ - const int bit = 32 - _CountLeadingZeros(word); - return bit - 1; -} - -tlsf_decl int tlsf_ffs(unsigned int word) -{ - const unsigned int reverse = word & (~word + 1); - const int bit = 32 - _CountLeadingZeros(reverse); - return bit - 1; -} - -#elif defined (__ARMCC_VERSION) -/* RealView Compilation Tools for ARM */ - -tlsf_decl int tlsf_ffs(unsigned int word) -{ - const unsigned int reverse = word & (~word + 1); - const int bit = 32 - __clz(reverse); - return bit - 1; -} - -tlsf_decl int tlsf_fls(unsigned int word) -{ - const int bit = word ? 32 - __clz(word) : 0; - return bit - 1; -} - -#elif defined (__ghs__) -/* Green Hills support for PowerPC */ - -#include - -tlsf_decl int tlsf_ffs(unsigned int word) -{ - const unsigned int reverse = word & (~word + 1); - const int bit = 32 - __CLZ32(reverse); - return bit - 1; -} - -tlsf_decl int tlsf_fls(unsigned int word) -{ - const int bit = word ? 32 - __CLZ32(word) : 0; - return bit - 1; -} - -#else -/* Fall back to generic implementation. */ - -/* Implement ffs in terms of fls. */ -tlsf_decl int tlsf_ffs(unsigned int word) -{ - const unsigned int reverse = word & (~word + 1); - return TLSF_FLS32(reverse) - 1; -} - -tlsf_decl int tlsf_fls(unsigned int word) -{ - return TLSF_FLS32(word) - 1; -} - -#endif - -/* Possibly 64-bit version of tlsf_fls. */ -#if defined (TLSF_64BIT) -tlsf_decl int tlsf_fls_sizet(size_t size) -{ - int high = (int)(size >> 32); - int bits = 0; - if(high) { - bits = 32 + tlsf_fls(high); - } - else { - bits = tlsf_fls((int)size & 0xffffffff); - - } - return bits; -} -#else -#define tlsf_fls_sizet tlsf_fls -#endif - -#undef tlsf_decl - -/* -** Constants. -*/ - -/* Public constants: may be modified. */ -typedef enum { - /* log2 of number of linear subdivisions of block sizes. Larger - ** values require more memory in the control structure. Values of - ** 4 or 5 are typical. - */ - SL_INDEX_COUNT_LOG2 = 5, -} tlsf_public; - -/* Private constants: do not modify. */ -typedef enum { -#if defined (TLSF_64BIT) - /* All allocation sizes and addresses are aligned to 8 bytes. */ - ALIGN_SIZE_LOG2 = 3, -#else - /* All allocation sizes and addresses are aligned to 4 bytes. */ - ALIGN_SIZE_LOG2 = 2, -#endif - ALIGN_SIZE = (1 << ALIGN_SIZE_LOG2), - - /* - ** We support allocations of sizes up to (1 << FL_INDEX_MAX) bits. - ** However, because we linearly subdivide the second-level lists, and - ** our minimum size granularity is 4 bytes, it doesn't make sense to - ** create first-level lists for sizes smaller than SL_INDEX_COUNT * 4, - ** or (1 << (SL_INDEX_COUNT_LOG2 + 2)) bytes, as there we will be - ** trying to split size ranges into more slots than we have available. - ** Instead, we calculate the minimum threshold size, and place all - ** blocks below that size into the 0th first-level list. - */ - -#if defined (TLSF_MAX_POOL_SIZE) - FL_INDEX_MAX = TLSF_LOG2_CEIL(TLSF_MAX_POOL_SIZE), -#elif defined (TLSF_64BIT) - /* - ** TODO: We can increase this to support larger sizes, at the expense - ** of more overhead in the TLSF structure. - */ - FL_INDEX_MAX = 32, -#else - FL_INDEX_MAX = 30, -#endif - SL_INDEX_COUNT = (1 << SL_INDEX_COUNT_LOG2), - FL_INDEX_SHIFT = (SL_INDEX_COUNT_LOG2 + ALIGN_SIZE_LOG2), - FL_INDEX_COUNT = (FL_INDEX_MAX - FL_INDEX_SHIFT + 1), - - SMALL_BLOCK_SIZE = (1 << FL_INDEX_SHIFT), -} tlsf_private; - -/* -** Cast and min/max macros. -*/ - -#define tlsf_cast(t, exp) ((t) (exp)) -#define tlsf_min(a, b) ((a) < (b) ? (a) : (b)) -#define tlsf_max(a, b) ((a) > (b) ? (a) : (b)) - -/* -** Set assert macro, if it has not been provided by the user. -*/ -#define tlsf_assert LV_ASSERT - -#if !defined (tlsf_assert) - #define tlsf_assert assert -#endif - -/* -** Static assertion mechanism. -*/ - -#define _tlsf_glue2(x, y) x ## y -#define _tlsf_glue(x, y) _tlsf_glue2(x, y) -#define tlsf_static_assert(exp) \ - typedef char _tlsf_glue(static_assert, __LINE__) [(exp) ? 1 : -1] - -/* This code has been tested on 32- and 64-bit (LP/LLP) architectures. */ -tlsf_static_assert(sizeof(int) * CHAR_BIT == 32); -tlsf_static_assert(sizeof(size_t) * CHAR_BIT >= 32); -tlsf_static_assert(sizeof(size_t) * CHAR_BIT <= 64); - -/* SL_INDEX_COUNT must be <= number of bits in sl_bitmap's storage type. */ -tlsf_static_assert(sizeof(unsigned int) * CHAR_BIT >= SL_INDEX_COUNT); - -/* Ensure we've properly tuned our sizes. */ -tlsf_static_assert(ALIGN_SIZE == SMALL_BLOCK_SIZE / SL_INDEX_COUNT); - -/* -** Data structures and associated constants. -*/ - -/* -** Block header structure. -** -** There are several implementation subtleties involved: -** - The prev_phys_block field is only valid if the previous block is free. -** - The prev_phys_block field is actually stored at the end of the -** previous block. It appears at the beginning of this structure only to -** simplify the implementation. -** - The next_free / prev_free fields are only valid if the block is free. -*/ -typedef struct block_header_t { - /* Points to the previous physical block. */ - struct block_header_t * prev_phys_block; - - /* The size of this block, excluding the block header. */ - size_t size; - - /* Next and previous free blocks. */ - struct block_header_t * next_free; - struct block_header_t * prev_free; -} block_header_t; - -/* -** Since block sizes are always at least a multiple of 4, the two least -** significant bits of the size field are used to store the block status: -** - bit 0: whether block is busy or free -** - bit 1: whether previous block is busy or free -*/ -static const size_t block_header_free_bit = 1 << 0; -static const size_t block_header_prev_free_bit = 1 << 1; - -/* -** The size of the block header exposed to used blocks is the size field. -** The prev_phys_block field is stored *inside* the previous free block. -*/ -static const size_t block_header_overhead = sizeof(size_t); - -/* User data starts directly after the size field in a used block. */ -static const size_t block_start_offset = - offsetof(block_header_t, size) + sizeof(size_t); - -/* -** A free block must be large enough to store its header minus the size of -** the prev_phys_block field, and no larger than the number of addressable -** bits for FL_INDEX. -*/ -static const size_t block_size_min = - sizeof(block_header_t) - sizeof(block_header_t *); -static const size_t block_size_max = tlsf_cast(size_t, 1) << FL_INDEX_MAX; - -/* The TLSF control structure. */ -typedef struct control_t { - /* Empty lists point at this block to indicate they are free. */ - block_header_t block_null; - - /* Bitmaps for free lists. */ - unsigned int fl_bitmap; - unsigned int sl_bitmap[FL_INDEX_COUNT]; - - /* Head of free lists. */ - block_header_t * blocks[FL_INDEX_COUNT][SL_INDEX_COUNT]; -} control_t; - -/* A type used for casting when doing pointer arithmetic. */ -typedef ptrdiff_t tlsfptr_t; - -/* -** block_header_t member functions. -*/ - -static size_t block_size(const block_header_t * block) -{ - return block->size & ~(block_header_free_bit | block_header_prev_free_bit); -} - -static void block_set_size(block_header_t * block, size_t size) -{ - const size_t oldsize = block->size; - block->size = size | (oldsize & (block_header_free_bit | block_header_prev_free_bit)); -} - -static int block_is_last(const block_header_t * block) -{ - return block_size(block) == 0; -} - -static int block_is_free(const block_header_t * block) -{ - return tlsf_cast(int, block->size & block_header_free_bit); -} - -static void block_set_free(block_header_t * block) -{ - block->size |= block_header_free_bit; -} - -static void block_set_used(block_header_t * block) -{ - block->size &= ~block_header_free_bit; -} - -static int block_is_prev_free(const block_header_t * block) -{ - return tlsf_cast(int, block->size & block_header_prev_free_bit); -} - -static void block_set_prev_free(block_header_t * block) -{ - block->size |= block_header_prev_free_bit; -} - -static void block_set_prev_used(block_header_t * block) -{ - block->size &= ~block_header_prev_free_bit; -} - -static block_header_t * block_from_ptr(const void * ptr) -{ - return tlsf_cast(block_header_t *, - tlsf_cast(unsigned char *, ptr) - block_start_offset); -} - -static void * block_to_ptr(const block_header_t * block) -{ - return tlsf_cast(void *, - tlsf_cast(unsigned char *, block) + block_start_offset); -} - -/* Return location of next block after block of given size. */ -static block_header_t * offset_to_block(const void * ptr, size_t size) -{ - return tlsf_cast(block_header_t *, tlsf_cast(tlsfptr_t, ptr) + size); -} - -/* Return location of previous block. */ -static block_header_t * block_prev(const block_header_t * block) -{ - tlsf_assert(block_is_prev_free(block) && "previous block must be free"); - return block->prev_phys_block; -} - -/* Return location of next existing block. */ -static block_header_t * block_next(const block_header_t * block) -{ - block_header_t * next = offset_to_block(block_to_ptr(block), - block_size(block) - block_header_overhead); - tlsf_assert(!block_is_last(block)); - return next; -} - -/* Link a new block with its physical neighbor, return the neighbor. */ -static block_header_t * block_link_next(block_header_t * block) -{ - block_header_t * next = block_next(block); - next->prev_phys_block = block; - return next; -} - -static void block_mark_as_free(block_header_t * block) -{ - /* Link the block to the next block, first. */ - block_header_t * next = block_link_next(block); - block_set_prev_free(next); - block_set_free(block); -} - -static void block_mark_as_used(block_header_t * block) -{ - block_header_t * next = block_next(block); - block_set_prev_used(next); - block_set_used(block); -} - -static size_t align_up(size_t x, size_t align) -{ - tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); - return (x + (align - 1)) & ~(align - 1); -} - -static size_t align_down(size_t x, size_t align) -{ - tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); - return x - (x & (align - 1)); -} - -static void * align_ptr(const void * ptr, size_t align) -{ - const tlsfptr_t aligned = - (tlsf_cast(tlsfptr_t, ptr) + (align - 1)) & ~(align - 1); - tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); - return tlsf_cast(void *, aligned); -} - -/* -** Adjust an allocation size to be aligned to word size, and no smaller -** than internal minimum. -*/ -static size_t adjust_request_size(size_t size, size_t align) -{ - size_t adjust = 0; - if(size) { - const size_t aligned = align_up(size, align); - - /* aligned sized must not exceed block_size_max or we'll go out of bounds on sl_bitmap */ - if(aligned < block_size_max) { - adjust = tlsf_max(aligned, block_size_min); - } - } - return adjust; -} - -/* -** TLSF utility functions. In most cases, these are direct translations of -** the documentation found in the white paper. -*/ - -static void mapping_insert(size_t size, int * fli, int * sli) -{ - int fl, sl; - if(size < SMALL_BLOCK_SIZE) { - /* Store small blocks in first list. */ - fl = 0; - sl = tlsf_cast(int, size) / (SMALL_BLOCK_SIZE / SL_INDEX_COUNT); - } - else { - fl = tlsf_fls_sizet(size); - sl = tlsf_cast(int, size >> (fl - SL_INDEX_COUNT_LOG2)) ^ (1 << SL_INDEX_COUNT_LOG2); - fl -= (FL_INDEX_SHIFT - 1); - } - *fli = fl; - *sli = sl; -} - -/* This version rounds up to the next block size (for allocations) */ -static void mapping_search(size_t size, int * fli, int * sli) -{ - if(size >= SMALL_BLOCK_SIZE) { - const size_t round = (1 << (tlsf_fls_sizet(size) - SL_INDEX_COUNT_LOG2)) - 1; - size += round; - } - mapping_insert(size, fli, sli); -} - -static block_header_t * search_suitable_block(control_t * control, int * fli, int * sli) -{ - int fl = *fli; - int sl = *sli; - - /* - ** First, search for a block in the list associated with the given - ** fl/sl index. - */ - unsigned int sl_map = control->sl_bitmap[fl] & (~0U << sl); - if(!sl_map) { - /* No block exists. Search in the next largest first-level list. */ - const unsigned int fl_map = control->fl_bitmap & (~0U << (fl + 1)); - if(!fl_map) { - /* No free blocks available, memory has been exhausted. */ - return 0; - } - - fl = tlsf_ffs(fl_map); - *fli = fl; - sl_map = control->sl_bitmap[fl]; - } - tlsf_assert(sl_map && "internal error - second level bitmap is null"); - sl = tlsf_ffs(sl_map); - *sli = sl; - - /* Return the first block in the free list. */ - return control->blocks[fl][sl]; -} - -/* Remove a free block from the free list.*/ -static void remove_free_block(control_t * control, block_header_t * block, int fl, int sl) -{ - block_header_t * prev = block->prev_free; - block_header_t * next = block->next_free; - tlsf_assert(prev && "prev_free field cannot be null"); - tlsf_assert(next && "next_free field cannot be null"); - next->prev_free = prev; - prev->next_free = next; - - /* If this block is the head of the free list, set new head. */ - if(control->blocks[fl][sl] == block) { - control->blocks[fl][sl] = next; - - /* If the new head is null, clear the bitmap. */ - if(next == &control->block_null) { - control->sl_bitmap[fl] &= ~(1U << sl); - - /* If the second bitmap is now empty, clear the fl bitmap. */ - if(!control->sl_bitmap[fl]) { - control->fl_bitmap &= ~(1U << fl); - } - } - } -} - -/* Insert a free block into the free block list. */ -static void insert_free_block(control_t * control, block_header_t * block, int fl, int sl) -{ - block_header_t * current = control->blocks[fl][sl]; - tlsf_assert(current && "free list cannot have a null entry"); - tlsf_assert(block && "cannot insert a null entry into the free list"); - block->next_free = current; - block->prev_free = &control->block_null; - current->prev_free = block; - - tlsf_assert(block_to_ptr(block) == align_ptr(block_to_ptr(block), ALIGN_SIZE) - && "block not aligned properly"); - /* - ** Insert the new block at the head of the list, and mark the first- - ** and second-level bitmaps appropriately. - */ - control->blocks[fl][sl] = block; - control->fl_bitmap |= (1U << fl); - control->sl_bitmap[fl] |= (1U << sl); -} - -/* Remove a given block from the free list. */ -static void block_remove(control_t * control, block_header_t * block) -{ - int fl, sl; - mapping_insert(block_size(block), &fl, &sl); - remove_free_block(control, block, fl, sl); -} - -/* Insert a given block into the free list. */ -static void block_insert(control_t * control, block_header_t * block) -{ - int fl, sl; - mapping_insert(block_size(block), &fl, &sl); - insert_free_block(control, block, fl, sl); -} - -static int block_can_split(block_header_t * block, size_t size) -{ - return block_size(block) >= sizeof(block_header_t) + size; -} - -/* Split a block into two, the second of which is free. */ -static block_header_t * block_split(block_header_t * block, size_t size) -{ - /* Calculate the amount of space left in the remaining block. */ - block_header_t * remaining = - offset_to_block(block_to_ptr(block), size - block_header_overhead); - - const size_t remain_size = block_size(block) - (size + block_header_overhead); - - tlsf_assert(block_to_ptr(remaining) == align_ptr(block_to_ptr(remaining), ALIGN_SIZE) - && "remaining block not aligned properly"); - - tlsf_assert(block_size(block) == remain_size + size + block_header_overhead); - block_set_size(remaining, remain_size); - tlsf_assert(block_size(remaining) >= block_size_min && "block split with invalid size"); - - block_set_size(block, size); - block_mark_as_free(remaining); - - return remaining; -} - -/* Absorb a free block's storage into an adjacent previous free block. */ -static block_header_t * block_absorb(block_header_t * prev, block_header_t * block) -{ - tlsf_assert(!block_is_last(prev) && "previous block can't be last"); - /* Note: Leaves flags untouched. */ - prev->size += block_size(block) + block_header_overhead; - block_link_next(prev); - return prev; -} - -/* Merge a just-freed block with an adjacent previous free block. */ -static block_header_t * block_merge_prev(control_t * control, block_header_t * block) -{ - if(block_is_prev_free(block)) { - block_header_t * prev = block_prev(block); - tlsf_assert(prev && "prev physical block can't be null"); - tlsf_assert(block_is_free(prev) && "prev block is not free though marked as such"); - block_remove(control, prev); - block = block_absorb(prev, block); - } - - return block; -} - -/* Merge a just-freed block with an adjacent free block. */ -static block_header_t * block_merge_next(control_t * control, block_header_t * block) -{ - block_header_t * next = block_next(block); - tlsf_assert(next && "next physical block can't be null"); - - if(block_is_free(next)) { - tlsf_assert(!block_is_last(block) && "previous block can't be last"); - block_remove(control, next); - block = block_absorb(block, next); - } - - return block; -} - -/* Trim any trailing block space off the end of a block, return to pool. */ -static void block_trim_free(control_t * control, block_header_t * block, size_t size) -{ - tlsf_assert(block_is_free(block) && "block must be free"); - if(block_can_split(block, size)) { - block_header_t * remaining_block = block_split(block, size); - block_link_next(block); - block_set_prev_free(remaining_block); - block_insert(control, remaining_block); - } -} - -/* Trim any trailing block space off the end of a used block, return to pool. */ -static void block_trim_used(control_t * control, block_header_t * block, size_t size) -{ - tlsf_assert(!block_is_free(block) && "block must be used"); - if(block_can_split(block, size)) { - /* If the next block is free, we must coalesce. */ - block_header_t * remaining_block = block_split(block, size); - block_set_prev_used(remaining_block); - - remaining_block = block_merge_next(control, remaining_block); - block_insert(control, remaining_block); - } -} - -static block_header_t * block_trim_free_leading(control_t * control, block_header_t * block, size_t size) -{ - block_header_t * remaining_block = block; - if(block_can_split(block, size)) { - /* We want the 2nd block. */ - remaining_block = block_split(block, size - block_header_overhead); - block_set_prev_free(remaining_block); - - block_link_next(block); - block_insert(control, block); - } - - return remaining_block; -} - -static block_header_t * block_locate_free(control_t * control, size_t size) -{ - int fl = 0, sl = 0; - block_header_t * block = 0; - - if(size) { - mapping_search(size, &fl, &sl); - - /* - ** mapping_search can futz with the size, so for excessively large sizes it can sometimes wind up - ** with indices that are off the end of the block array. - ** So, we protect against that here, since this is the only callsite of mapping_search. - ** Note that we don't need to check sl, since it comes from a modulo operation that guarantees it's always in range. - */ - if(fl < FL_INDEX_COUNT) { - block = search_suitable_block(control, &fl, &sl); - } - } - - if(block) { - tlsf_assert(block_size(block) >= size); - remove_free_block(control, block, fl, sl); - } - - return block; -} - -static void * block_prepare_used(control_t * control, block_header_t * block, size_t size) -{ - void * p = 0; - if(block) { - tlsf_assert(size && "size must be non-zero"); - block_trim_free(control, block, size); - block_mark_as_used(block); - p = block_to_ptr(block); - } - return p; -} - -/* Clear structure and point all empty lists at the null block. */ -static void control_constructor(control_t * control) -{ - int i, j; - - control->block_null.next_free = &control->block_null; - control->block_null.prev_free = &control->block_null; - - control->fl_bitmap = 0; - for(i = 0; i < FL_INDEX_COUNT; ++i) { - control->sl_bitmap[i] = 0; - for(j = 0; j < SL_INDEX_COUNT; ++j) { - control->blocks[i][j] = &control->block_null; - } - } -} - -/* -** Debugging utilities. -*/ - -typedef struct integrity_t { - int prev_status; - int status; -} integrity_t; - -#define tlsf_insist(x) { tlsf_assert(x); if (!(x)) { status--; } } - -static void integrity_walker(void * ptr, size_t size, int used, void * user) -{ - block_header_t * block = block_from_ptr(ptr); - integrity_t * integ = tlsf_cast(integrity_t *, user); - const int this_prev_status = block_is_prev_free(block) ? 1 : 0; - const int this_status = block_is_free(block) ? 1 : 0; - const size_t this_block_size = block_size(block); - - int status = 0; - LV_UNUSED(used); - tlsf_insist(integ->prev_status == this_prev_status && "prev status incorrect"); - tlsf_insist(size == this_block_size && "block size incorrect"); - - integ->prev_status = this_status; - integ->status += status; -} - -int lv_tlsf_check(lv_tlsf_t tlsf) -{ - int i, j; - - control_t * control = tlsf_cast(control_t *, tlsf); - int status = 0; - - /* Check that the free lists and bitmaps are accurate. */ - for(i = 0; i < FL_INDEX_COUNT; ++i) { - for(j = 0; j < SL_INDEX_COUNT; ++j) { - const int fl_map = control->fl_bitmap & (1U << i); - const int sl_list = control->sl_bitmap[i]; - const int sl_map = sl_list & (1U << j); - const block_header_t * block = control->blocks[i][j]; - - /* Check that first- and second-level lists agree. */ - if(!fl_map) { - tlsf_insist(!sl_map && "second-level map must be null"); - } - - if(!sl_map) { - tlsf_insist(block == &control->block_null && "block list must be null"); - continue; - } - - /* Check that there is at least one free block. */ - tlsf_insist(sl_list && "no free blocks in second-level map"); - tlsf_insist(block != &control->block_null && "block should not be null"); - - while(block != &control->block_null) { - int fli, sli; - tlsf_insist(block_is_free(block) && "block should be free"); - tlsf_insist(!block_is_prev_free(block) && "blocks should have coalesced"); - tlsf_insist(!block_is_free(block_next(block)) && "blocks should have coalesced"); - tlsf_insist(block_is_prev_free(block_next(block)) && "block should be free"); - tlsf_insist(block_size(block) >= block_size_min && "block not minimum size"); - - mapping_insert(block_size(block), &fli, &sli); - tlsf_insist(fli == i && sli == j && "block size indexed in wrong list"); - block = block->next_free; - } - } - } - - return status; -} - -#undef tlsf_insist - -static void default_walker(void * ptr, size_t size, int used, void * user) -{ - LV_UNUSED(user); - printf("\t%p %s size: %x (%p)\n", ptr, used ? "used" : "free", (unsigned int)size, (void *)block_from_ptr(ptr)); -} - -void lv_tlsf_walk_pool(lv_pool_t pool, lv_tlsf_walker walker, void * user) -{ - lv_tlsf_walker pool_walker = walker ? walker : default_walker; - block_header_t * block = - offset_to_block(pool, -(int)block_header_overhead); - - while(block && !block_is_last(block)) { - pool_walker( - block_to_ptr(block), - block_size(block), - !block_is_free(block), - user); - block = block_next(block); - } -} - -size_t lv_tlsf_block_size(void * ptr) -{ - size_t size = 0; - if(ptr) { - const block_header_t * block = block_from_ptr(ptr); - size = block_size(block); - } - return size; -} - -int lv_tlsf_check_pool(lv_pool_t pool) -{ - /* Check that the blocks are physically correct. */ - integrity_t integ = { 0, 0 }; - lv_tlsf_walk_pool(pool, integrity_walker, &integ); - - return integ.status; -} - -/* -** Size of the TLSF structures in a given memory block passed to -** lv_tlsf_create, equal to the size of a control_t -*/ -size_t lv_tlsf_size(void) -{ - return sizeof(control_t); -} - -size_t lv_tlsf_align_size(void) -{ - return ALIGN_SIZE; -} - -size_t lv_tlsf_block_size_min(void) -{ - return block_size_min; -} - -size_t lv_tlsf_block_size_max(void) -{ - return block_size_max; -} - -/* -** Overhead of the TLSF structures in a given memory block passed to -** lv_tlsf_add_pool, equal to the overhead of a free block and the -** sentinel block. -*/ -size_t lv_tlsf_pool_overhead(void) -{ - return 2 * block_header_overhead; -} - -size_t lv_tlsf_alloc_overhead(void) -{ - return block_header_overhead; -} - -lv_pool_t lv_tlsf_add_pool(lv_tlsf_t tlsf, void * mem, size_t bytes) -{ - block_header_t * block; - block_header_t * next; - - const size_t pool_overhead = lv_tlsf_pool_overhead(); - const size_t pool_bytes = align_down(bytes - pool_overhead, ALIGN_SIZE); - - if(((ptrdiff_t)mem % ALIGN_SIZE) != 0) { - printf("lv_tlsf_add_pool: Memory must be aligned by %u bytes.\n", - (unsigned int)ALIGN_SIZE); - return 0; - } - - if(pool_bytes < block_size_min || pool_bytes > block_size_max) { -#if defined (TLSF_64BIT) - printf("lv_tlsf_add_pool: Memory size must be between 0x%x and 0x%x00 bytes.\n", - (unsigned int)(pool_overhead + block_size_min), - (unsigned int)((pool_overhead + block_size_max) / 256)); -#else - printf("lv_tlsf_add_pool: Memory size must be between %u and %u bytes.\n", - (unsigned int)(pool_overhead + block_size_min), - (unsigned int)(pool_overhead + block_size_max)); -#endif - return 0; - } - - /* - ** Create the main free block. Offset the start of the block slightly - ** so that the prev_phys_block field falls outside of the pool - - ** it will never be used. - */ - block = offset_to_block(mem, -(tlsfptr_t)block_header_overhead); - block_set_size(block, pool_bytes); - block_set_free(block); - block_set_prev_used(block); - block_insert(tlsf_cast(control_t *, tlsf), block); - - /* Split the block to create a zero-size sentinel block. */ - next = block_link_next(block); - block_set_size(next, 0); - block_set_used(next); - block_set_prev_free(next); - - return mem; -} - -void lv_tlsf_remove_pool(lv_tlsf_t tlsf, lv_pool_t pool) -{ - control_t * control = tlsf_cast(control_t *, tlsf); - block_header_t * block = offset_to_block(pool, -(int)block_header_overhead); - - int fl = 0, sl = 0; - - tlsf_assert(block_is_free(block) && "block should be free"); - tlsf_assert(!block_is_free(block_next(block)) && "next block should not be free"); - tlsf_assert(block_size(block_next(block)) == 0 && "next block size should be zero"); - - mapping_insert(block_size(block), &fl, &sl); - remove_free_block(control, block, fl, sl); -} - -/* -** TLSF main interface. -*/ - -#if _DEBUG -int test_ffs_fls() -{ - /* Verify ffs/fls work properly. */ - int rv = 0; - rv += (tlsf_ffs(0) == -1) ? 0 : 0x1; - rv += (tlsf_fls(0) == -1) ? 0 : 0x2; - rv += (tlsf_ffs(1) == 0) ? 0 : 0x4; - rv += (tlsf_fls(1) == 0) ? 0 : 0x8; - rv += (tlsf_ffs(0x80000000) == 31) ? 0 : 0x10; - rv += (tlsf_ffs(0x80008000) == 15) ? 0 : 0x20; - rv += (tlsf_fls(0x80000008) == 31) ? 0 : 0x40; - rv += (tlsf_fls(0x7FFFFFFF) == 30) ? 0 : 0x80; - -#if defined (TLSF_64BIT) - rv += (tlsf_fls_sizet(0x80000000) == 31) ? 0 : 0x100; - rv += (tlsf_fls_sizet(0x100000000) == 32) ? 0 : 0x200; - rv += (tlsf_fls_sizet(0xffffffffffffffff) == 63) ? 0 : 0x400; -#endif - - if(rv) { - printf("test_ffs_fls: %x ffs/fls tests failed.\n", rv); - } - return rv; -} -#endif - -lv_tlsf_t lv_tlsf_create(void * mem) -{ -#if _DEBUG - if(test_ffs_fls()) { - return 0; - } -#endif - - if(((tlsfptr_t)mem % ALIGN_SIZE) != 0) { - printf("lv_tlsf_create: Memory must be aligned to %u bytes.\n", - (unsigned int)ALIGN_SIZE); - return 0; - } - - control_constructor(tlsf_cast(control_t *, mem)); - - return tlsf_cast(lv_tlsf_t, mem); -} - -lv_tlsf_t lv_tlsf_create_with_pool(void * mem, size_t bytes) -{ - lv_tlsf_t tlsf = lv_tlsf_create(mem); - lv_tlsf_add_pool(tlsf, (char *)mem + lv_tlsf_size(), bytes - lv_tlsf_size()); - return tlsf; -} - -void lv_tlsf_destroy(lv_tlsf_t tlsf) -{ - /* Nothing to do. */ - LV_UNUSED(tlsf); -} - -lv_pool_t lv_tlsf_get_pool(lv_tlsf_t tlsf) -{ - return tlsf_cast(lv_pool_t, (char *)tlsf + lv_tlsf_size()); -} - -void * lv_tlsf_malloc(lv_tlsf_t tlsf, size_t size) -{ - control_t * control = tlsf_cast(control_t *, tlsf); - const size_t adjust = adjust_request_size(size, ALIGN_SIZE); - block_header_t * block = block_locate_free(control, adjust); - return block_prepare_used(control, block, adjust); -} - -void * lv_tlsf_memalign(lv_tlsf_t tlsf, size_t align, size_t size) -{ - control_t * control = tlsf_cast(control_t *, tlsf); - const size_t adjust = adjust_request_size(size, ALIGN_SIZE); - - /* - ** We must allocate an additional minimum block size bytes so that if - ** our free block will leave an alignment gap which is smaller, we can - ** trim a leading free block and release it back to the pool. We must - ** do this because the previous physical block is in use, therefore - ** the prev_phys_block field is not valid, and we can't simply adjust - ** the size of that block. - */ - const size_t gap_minimum = sizeof(block_header_t); - const size_t size_with_gap = adjust_request_size(adjust + align + gap_minimum, align); - - /* - ** If alignment is less than or equals base alignment, we're done. - ** If we requested 0 bytes, return null, as lv_tlsf_malloc(0) does. - */ - const size_t aligned_size = (adjust && align > ALIGN_SIZE) ? size_with_gap : adjust; - - block_header_t * block = block_locate_free(control, aligned_size); - - /* This can't be a static assert. */ - tlsf_assert(sizeof(block_header_t) == block_size_min + block_header_overhead); - - if(block) { - void * ptr = block_to_ptr(block); - void * aligned = align_ptr(ptr, align); - size_t gap = tlsf_cast(size_t, - tlsf_cast(tlsfptr_t, aligned) - tlsf_cast(tlsfptr_t, ptr)); - - /* If gap size is too small, offset to next aligned boundary. */ - if(gap && gap < gap_minimum) { - const size_t gap_remain = gap_minimum - gap; - const size_t offset = tlsf_max(gap_remain, align); - const void * next_aligned = tlsf_cast(void *, - tlsf_cast(tlsfptr_t, aligned) + offset); - - aligned = align_ptr(next_aligned, align); - gap = tlsf_cast(size_t, - tlsf_cast(tlsfptr_t, aligned) - tlsf_cast(tlsfptr_t, ptr)); - } - - if(gap) { - tlsf_assert(gap >= gap_minimum && "gap size too small"); - block = block_trim_free_leading(control, block, gap); - } - } - - return block_prepare_used(control, block, adjust); -} - -size_t lv_tlsf_free(lv_tlsf_t tlsf, const void * ptr) -{ - size_t size = 0; - /* Don't attempt to free a NULL pointer. */ - if(ptr) { - control_t * control = tlsf_cast(control_t *, tlsf); - block_header_t * block = block_from_ptr(ptr); - tlsf_assert(!block_is_free(block) && "block already marked as free"); - size = block->size; - block_mark_as_free(block); - block = block_merge_prev(control, block); - block = block_merge_next(control, block); - block_insert(control, block); - } - - return size; -} - -/* -** The TLSF block information provides us with enough information to -** provide a reasonably intelligent implementation of realloc, growing or -** shrinking the currently allocated block as required. -** -** This routine handles the somewhat esoteric edge cases of realloc: -** - a non-zero size with a null pointer will behave like malloc -** - a zero size with a non-null pointer will behave like free -** - a request that cannot be satisfied will leave the original buffer -** untouched -** - an extended buffer size will leave the newly-allocated area with -** contents undefined -*/ -void * lv_tlsf_realloc(lv_tlsf_t tlsf, void * ptr, size_t size) -{ - control_t * control = tlsf_cast(control_t *, tlsf); - void * p = 0; - - /* Zero-size requests are treated as free. */ - if(ptr && size == 0) { - lv_tlsf_free(tlsf, ptr); - } - /* Requests with NULL pointers are treated as malloc. */ - else if(!ptr) { - p = lv_tlsf_malloc(tlsf, size); - } - else { - block_header_t * block = block_from_ptr(ptr); - block_header_t * next = block_next(block); - - const size_t cursize = block_size(block); - const size_t combined = cursize + block_size(next) + block_header_overhead; - const size_t adjust = adjust_request_size(size, ALIGN_SIZE); - if(size > cursize && adjust == 0) { - /* The request is probably too large, fail */ - return NULL; - } - - tlsf_assert(!block_is_free(block) && "block already marked as free"); - - /* - ** If the next block is used, or when combined with the current - ** block, does not offer enough space, we must reallocate and copy. - */ - if(adjust > cursize && (!block_is_free(next) || adjust > combined)) { - p = lv_tlsf_malloc(tlsf, size); - if(p) { - const size_t minsize = tlsf_min(cursize, size); - lv_memcpy(p, ptr, minsize); - lv_tlsf_free(tlsf, ptr); - } - } - else { - /* Do we need to expand to the next block? */ - if(adjust > cursize) { - block_merge_next(control, block); - block_mark_as_used(block); - } - - /* Trim the resulting block and return the original pointer. */ - block_trim_used(control, block, adjust); - p = ptr; - } - } - - return p; -} - -#endif /*LV_STDLIB_BUILTIN*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_tlsf.h b/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_tlsf.h deleted file mode 100644 index 4127271..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_tlsf.h +++ /dev/null @@ -1,97 +0,0 @@ -#include "../../lv_conf_internal.h" -#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN - -#ifndef LV_TLSF_H -#define LV_TLSF_H - -/* -** Two Level Segregated Fit memory allocator, version 3.1. -** Written by Matthew Conte -** http://tlsf.baisoku.org -** -** Based on the original documentation by Miguel Masmano: -** http://www.gii.upv.es/tlsf/main/docs -** -** This implementation was written to the specification -** of the document, therefore no GPL restrictions apply. -** -** Copyright (c) 2006-2016, Matthew Conte -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** * Neither the name of the copyright holder nor the -** names of its contributors may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL MATTHEW CONTE BE LIABLE FOR ANY -** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (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 "../../osal/lv_os.h" -#include "../../misc/lv_ll.h" -#include "../../misc/lv_types.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -/* lv_tlsf_t: a TLSF structure. Can contain 1 to N pools. */ -/* lv_pool_t: a block of memory that TLSF can manage. */ -typedef void * lv_tlsf_t; -typedef void * lv_pool_t; - -/* Create/destroy a memory pool. */ -lv_tlsf_t lv_tlsf_create(void * mem); -lv_tlsf_t lv_tlsf_create_with_pool(void * mem, size_t bytes); -void lv_tlsf_destroy(lv_tlsf_t tlsf); -lv_pool_t lv_tlsf_get_pool(lv_tlsf_t tlsf); - -/* Add/remove memory pools. */ -lv_pool_t lv_tlsf_add_pool(lv_tlsf_t tlsf, void * mem, size_t bytes); -void lv_tlsf_remove_pool(lv_tlsf_t tlsf, lv_pool_t pool); - -/* malloc/memalign/realloc/free replacements. */ -void * lv_tlsf_malloc(lv_tlsf_t tlsf, size_t bytes); -void * lv_tlsf_memalign(lv_tlsf_t tlsf, size_t align, size_t bytes); -void * lv_tlsf_realloc(lv_tlsf_t tlsf, void * ptr, size_t size); -size_t lv_tlsf_free(lv_tlsf_t tlsf, const void * ptr); - -/* Returns internal block size, not original request size */ -size_t lv_tlsf_block_size(void * ptr); - -/* Overheads/limits of internal structures. */ -size_t lv_tlsf_size(void); -size_t lv_tlsf_align_size(void); -size_t lv_tlsf_block_size_min(void); -size_t lv_tlsf_block_size_max(void); -size_t lv_tlsf_pool_overhead(void); -size_t lv_tlsf_alloc_overhead(void); - -/* Debugging. */ -typedef void (*lv_tlsf_walker)(void * ptr, size_t size, int used, void * user); -void lv_tlsf_walk_pool(lv_pool_t pool, lv_tlsf_walker walker, void * user); -/* Returns nonzero if any internal consistency check fails. */ -int lv_tlsf_check(lv_tlsf_t tlsf); -int lv_tlsf_check_pool(lv_pool_t pool); - -#if defined(__cplusplus) -}; -#endif - -#endif /*LV_TLSF_H*/ - -#endif /*LV_STDLIB_BUILTIN*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_tlsf_private.h b/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_tlsf_private.h deleted file mode 100644 index 036e9d7..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/builtin/lv_tlsf_private.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @file lv_tlsf_private.h - * - */ - -#ifndef LV_TLSF_PRIVATE_H -#define LV_TLSF_PRIVATE_H - -#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_tlsf.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { -#if LV_USE_OS - lv_mutex_t mutex; -#endif - lv_tlsf_t tlsf; - size_t cur_used; - size_t max_used; - lv_ll_t pool_ll; -} lv_tlsf_state_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/ - -#endif /*LV_TLSF_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/clib/lv_mem_core_clib.c b/software/Power_Pico/Middlewares/LVGL/src/stdlib/clib/lv_mem_core_clib.c deleted file mode 100644 index 9cdddf4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/clib/lv_mem_core_clib.c +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @file lv_malloc_core.c - */ - -/********************* - * INCLUDES - *********************/ -#include "../lv_mem.h" -#if LV_USE_STDLIB_MALLOC == LV_STDLIB_CLIB -#include "../../stdlib/lv_mem.h" -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_mem_init(void) -{ - return; /*Nothing to init*/ -} - -void lv_mem_deinit(void) -{ - return; /*Nothing to deinit*/ - -} - -lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) -{ - /*Not supported*/ - LV_UNUSED(mem); - LV_UNUSED(bytes); - return NULL; -} - -void lv_mem_remove_pool(lv_mem_pool_t pool) -{ - /*Not supported*/ - LV_UNUSED(pool); - return; -} - -void * lv_malloc_core(size_t size) -{ - return malloc(size); -} - -void * lv_realloc_core(void * p, size_t new_size) -{ - return realloc(p, new_size); -} - -void lv_free_core(void * p) -{ - free(p); -} - -void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) -{ - /*Not supported*/ - LV_UNUSED(mon_p); - return; -} - -lv_result_t lv_mem_test_core(void) -{ - /*Not supported*/ - return LV_RESULT_OK; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_STDLIB_CLIB*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/clib/lv_sprintf_clib.c b/software/Power_Pico/Middlewares/LVGL/src/stdlib/clib/lv_sprintf_clib.c deleted file mode 100644 index 4f4fb9c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/clib/lv_sprintf_clib.c +++ /dev/null @@ -1,58 +0,0 @@ - -/** - * @file lv_templ.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_STDLIB_SPRINTF == LV_STDLIB_CLIB -#include -#include -#include "../lv_sprintf.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -int lv_snprintf(char * buffer, size_t count, const char * format, ...) -{ - va_list va; - va_start(va, format); - const int ret = vsnprintf(buffer, count, format, va); - va_end(va); - return ret; -} - -int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) -{ - return vsnprintf(buffer, count, format, va); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/clib/lv_string_clib.c b/software/Power_Pico/Middlewares/LVGL/src/stdlib/clib/lv_string_clib.c deleted file mode 100644 index fd01b93..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/clib/lv_string_clib.c +++ /dev/null @@ -1,114 +0,0 @@ -/** - * @file lv_string.c - */ - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_STDLIB_STRING == LV_STDLIB_CLIB -#include "../lv_string.h" -#include "../lv_mem.h" /*Need lv_malloc*/ -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len) -{ - return memcpy(dst, src, len); -} - -void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len) -{ - memset(dst, v, len); -} - -void * LV_ATTRIBUTE_FAST_MEM lv_memmove(void * dst, const void * src, size_t len) -{ - return memmove(dst, src, len); -} - -int lv_memcmp(const void * p1, const void * p2, size_t len) -{ - return memcmp(p1, p2, len); -} - -size_t lv_strlen(const char * str) -{ - return strlen(str); -} - -size_t lv_strlcpy(char * dst, const char * src, size_t dst_size) -{ - size_t src_len = strlen(src); - if(dst_size > 0) { - size_t copy_size = src_len < dst_size ? src_len : dst_size - 1; - memcpy(dst, src, copy_size); - dst[copy_size] = '\0'; - } - return src_len; -} - -char * lv_strncpy(char * dst, const char * src, size_t dest_size) -{ - return strncpy(dst, src, dest_size); -} - -char * lv_strcpy(char * dst, const char * src) -{ - return strcpy(dst, src); -} - -int lv_strcmp(const char * s1, const char * s2) -{ - return strcmp(s1, s2); -} - -char * lv_strdup(const char * src) -{ - /*strdup uses malloc, so use the lv_malloc when LV_USE_STDLIB_MALLOC is not LV_STDLIB_CLIB */ - size_t len = lv_strlen(src) + 1; - char * dst = lv_malloc(len); - if(dst == NULL) return NULL; - - lv_memcpy(dst, src, len); /*do memcpy is faster than strncpy when length is known*/ - return dst; -} - -char * lv_strcat(char * dst, const char * src) -{ - return strcat(dst, src); -} - -char * lv_strncat(char * dst, const char * src, size_t src_len) -{ - return strncat(dst, src, src_len); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_STDLIB_CLIB*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_mem.c b/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_mem.c deleted file mode 100644 index bfc887f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_mem.c +++ /dev/null @@ -1,168 +0,0 @@ -/** - * @file lv_mem.c - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_mem_private.h" -#include "lv_string.h" -#include "../misc/lv_assert.h" -#include "../misc/lv_log.h" -#include "../core/lv_global.h" - -#if LV_USE_OS == LV_OS_PTHREAD - #include -#endif - -/********************* - * DEFINES - *********************/ -/*memset the allocated memories to 0xaa and freed memories to 0xbb (just for testing purposes)*/ -#ifndef LV_MEM_ADD_JUNK - #define LV_MEM_ADD_JUNK 0 -#endif - -#define zero_mem LV_GLOBAL_DEFAULT()->memory_zero - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ -void * lv_malloc_core(size_t size); -void * lv_realloc_core(void * p, size_t new_size); -void lv_free_core(void * p); -void lv_mem_monitor_core(lv_mem_monitor_t * mon_p); -lv_result_t lv_mem_test_core(void); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ -#if LV_USE_LOG && LV_LOG_TRACE_MEM - #define LV_TRACE_MEM(...) LV_LOG_TRACE(__VA_ARGS__) -#else - #define LV_TRACE_MEM(...) -#endif - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void * lv_malloc(size_t size) -{ - LV_TRACE_MEM("allocating %lu bytes", (unsigned long)size); - if(size == 0) { - LV_TRACE_MEM("using zero_mem"); - return &zero_mem; - } - - void * alloc = lv_malloc_core(size); - - if(alloc == NULL) { - LV_LOG_INFO("couldn't allocate memory (%lu bytes)", (unsigned long)size); -#if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO - lv_mem_monitor_t mon; - lv_mem_monitor(&mon); - LV_LOG_INFO("used: %zu (%3d %%), frag: %3d %%, biggest free: %zu", - mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct, - mon.free_biggest_size); -#endif - return NULL; - } - -#if LV_MEM_ADD_JUNK - lv_memset(alloc, 0xaa, size); -#endif - - LV_TRACE_MEM("allocated at %p", alloc); - return alloc; -} - -void * lv_malloc_zeroed(size_t size) -{ - LV_TRACE_MEM("allocating %lu bytes", (unsigned long)size); - if(size == 0) { - LV_TRACE_MEM("using zero_mem"); - return &zero_mem; - } - - void * alloc = lv_malloc_core(size); - if(alloc == NULL) { - LV_LOG_INFO("couldn't allocate memory (%lu bytes)", (unsigned long)size); -#if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO - lv_mem_monitor_t mon; - lv_mem_monitor(&mon); - LV_LOG_INFO("used: %zu (%3d %%), frag: %3d %%, biggest free: %zu", - mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct, - mon.free_biggest_size); -#endif - return NULL; - } - - lv_memzero(alloc, size); - - LV_TRACE_MEM("allocated at %p", alloc); - return alloc; -} - -void lv_free(void * data) -{ - LV_TRACE_MEM("freeing %p", data); - if(data == &zero_mem) return; - if(data == NULL) return; - - lv_free_core(data); -} - -void * lv_realloc(void * data_p, size_t new_size) -{ - LV_TRACE_MEM("reallocating %p with %lu size", data_p, (unsigned long)new_size); - if(new_size == 0) { - LV_TRACE_MEM("using zero_mem"); - lv_free(data_p); - return &zero_mem; - } - - if(data_p == &zero_mem) return lv_malloc(new_size); - - void * new_p = lv_realloc_core(data_p, new_size); - - if(new_p == NULL) { - LV_LOG_ERROR("couldn't reallocate memory"); - return NULL; - } - - LV_TRACE_MEM("reallocated at %p", new_p); - return new_p; -} - -lv_result_t lv_mem_test(void) -{ - if(zero_mem != ZERO_MEM_SENTINEL) { - LV_LOG_WARN("zero_mem is written"); - return LV_RESULT_INVALID; - } - - return lv_mem_test_core(); -} - -void lv_mem_monitor(lv_mem_monitor_t * mon_p) -{ - lv_memzero(mon_p, sizeof(lv_mem_monitor_t)); - lv_mem_monitor_core(mon_p); -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_mem.h b/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_mem.h deleted file mode 100644 index 210c189..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_mem.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * @file lv_mem.h - * - */ - -#ifndef LV_MEM_H -#define LV_MEM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" - -#include "lv_string.h" - -#include "../misc/lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef void * lv_mem_pool_t; - -/** - * Heap information structure. - */ -typedef struct { - size_t total_size; /**< Total heap size */ - size_t free_cnt; - size_t free_size; /**< Size of available memory */ - size_t free_biggest_size; - size_t used_cnt; - size_t max_used; /**< Max size of Heap memory used */ - uint8_t used_pct; /**< Percentage used */ - uint8_t frag_pct; /**< Amount of fragmentation */ -} lv_mem_monitor_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize to use malloc/free/realloc etc - */ -void lv_mem_init(void); - -/** - * Drop all dynamically allocated memory and reset the memory pools' state - */ -void lv_mem_deinit(void); - -lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes); - -void lv_mem_remove_pool(lv_mem_pool_t pool); - -/** - * Allocate memory dynamically - * @param size requested size in bytes - * @return pointer to allocated uninitialized memory, or NULL on failure - */ -void * lv_malloc(size_t size); - -/** - * Allocate zeroed memory dynamically - * @param size requested size in bytes - * @return pointer to allocated zeroed memory, or NULL on failure - */ -void * lv_malloc_zeroed(size_t size); - -/** - * Free an allocated data - * @param data pointer to an allocated memory - */ -void lv_free(void * data); - -/** - * Reallocate a memory with a new size. The old content will be kept. - * @param data_p pointer to an allocated memory. - * Its content will be copied to the new memory block and freed - * @param new_size the desired new size in byte - * @return pointer to the new memory, NULL on failure - */ -void * lv_realloc(void * data_p, size_t new_size); - -/** - * Used internally to execute a plain `malloc` operation - * @param size size in bytes to `malloc` - */ -void * lv_malloc_core(size_t size); - -/** - * Used internally to execute a plain `free` operation - * @param p memory address to free - */ -void lv_free_core(void * p); - -/** - * Used internally to execute a plain realloc operation - * @param p memory address to realloc - * @param new_size size in bytes to realloc - */ -void * lv_realloc_core(void * p, size_t new_size); - -/** - * Used internally by lv_mem_monitor() to gather LVGL heap state information. - * @param mon_p pointer to lv_mem_monitor_t object to be populated. - */ -void lv_mem_monitor_core(lv_mem_monitor_t * mon_p); - -lv_result_t lv_mem_test_core(void); - -/** - * @brief Tests the memory allocation system by allocating and freeing a block of memory. - * @return LV_RESULT_OK if the memory allocation system is working properly, or LV_RESULT_INVALID if there is an error. - */ -lv_result_t lv_mem_test(void); - -/** - * Give information about the work memory of dynamic allocation - * @param mon_p pointer to a lv_mem_monitor_t variable, - * the result of the analysis will be stored here - */ -void lv_mem_monitor(lv_mem_monitor_t * mon_p); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_MEM_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_mem_private.h b/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_mem_private.h deleted file mode 100644 index 9e70ae1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_mem_private.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file lv_mem_private.h - * - */ - -#ifndef LV_MEM_PRIVATE_H -#define LV_MEM_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_mem.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_MEM_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_sprintf.h b/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_sprintf.h deleted file mode 100644 index a7f2188..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_sprintf.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file lv_sprintf.h - * - */ - -#ifndef LV_SPRINTF_H -#define LV_SPRINTF_H - -#if defined(__has_include) - #if __has_include(LV_INTTYPES_INCLUDE) - #include LV_INTTYPES_INCLUDE - /* platform-specific printf format for int32_t, usually "d" or "ld" */ - #define LV_PRId32 PRId32 - #define LV_PRIu32 PRIu32 - #define LV_PRIx32 PRIx32 - #define LV_PRIX32 PRIX32 - #else - #define LV_PRId32 "d" - #define LV_PRIu32 "u" - #define LV_PRIx32 "x" - #define LV_PRIX32 "X" - #endif -#else - /* hope this is correct for ports without __has_include or without inttypes.h */ - #define LV_PRId32 "d" - #define LV_PRIu32 "u" - #define LV_PRIx32 "x" - #define LV_PRIX32 "X" -#endif - -#include "../misc/lv_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -int lv_snprintf(char * buffer, size_t count, const char * format, ...); - -int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /* LV_SPRINTF_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_string.h b/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_string.h deleted file mode 100644 index 10aee50..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/lv_string.h +++ /dev/null @@ -1,158 +0,0 @@ -/** - * @file lv_string.h - * - */ - -#ifndef LV_STRING_H -#define LV_STRING_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" -#include "../misc/lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * @brief Copies a block of memory from a source address to a destination address. - * @param dst Pointer to the destination array where the content is to be copied. - * @param src Pointer to the source of data to be copied. - * @param len Number of bytes to copy. - * @return Pointer to the destination array. - * @note The function does not check for any overlapping of the source and destination memory blocks. - */ -void * lv_memcpy(void * dst, const void * src, size_t len); - -/** - * @brief Fills a block of memory with a specified value. - * @param dst Pointer to the destination array to fill with the specified value. - * @param v Value to be set. The value is passed as an int, but the function fills - * the block of memory using the unsigned char conversion of this value. - * @param len Number of bytes to be set to the value. - */ -void lv_memset(void * dst, uint8_t v, size_t len); - -/** - * @brief Move a block of memory from source to destination - * @param dst Pointer to the destination array where the content is to be copied. - * @param src Pointer to the source of data to be copied. - * @param len Number of bytes to copy - * @return Pointer to the destination array. - */ -void * lv_memmove(void * dst, const void * src, size_t len); - -/** - * @brief This function will compare two memory blocks - * @param p1 Pointer to the first memory block - * @param p2 Pointer to the second memory block - * @param len Number of bytes to compare - * @return The difference between the value of the first unmatching byte. - */ -int lv_memcmp(const void * p1, const void * p2, size_t len); - -/** - * Same as `memset(dst, 0x00, len)`. - * @param dst pointer to the destination buffer - * @param len number of byte to set - */ -static inline void lv_memzero(void * dst, size_t len) -{ - lv_memset(dst, 0x00, len); -} - -/** - * @brief Computes the length of the string str up to, but not including the terminating null character. - * @param str Pointer to the null-terminated byte string to be examined. - * @return The length of the string in bytes. - */ -size_t lv_strlen(const char * str); - -/** - * @brief Copies up to dst_size-1 (non-null) characters from src to dst. A null terminator is always added. - * @param dst Pointer to the destination array where the content is to be copied. - * @param src Pointer to the source of data to be copied. - * @param dst_size Maximum number of characters to be copied to dst, including the null character. - * @return The length of src. The return value is equivalent to the value returned by lv_strlen(src) - */ -size_t lv_strlcpy(char * dst, const char * src, size_t dst_size); - -/** - * @brief Copies up to dest_size characters from the string pointed to by src to the character array pointed to by dst - * and fills the remaining length with null bytes. - * @param dst Pointer to the destination array where the content is to be copied. - * @param src Pointer to the source of data to be copied. - * @param dest_size Maximum number of characters to be copied to dst. - * @return A pointer to the destination array, which is dst. - * @note dst will not be null terminated if dest_size bytes were copied from src before the end of src was reached. - */ -char * lv_strncpy(char * dst, const char * src, size_t dest_size); - -/** - * @brief Copies the string pointed to by src, including the terminating null character, - * to the character array pointed to by dst. - * @param dst Pointer to the destination array where the content is to be copied. - * @param src Pointer to the source of data to be copied. - * @return A pointer to the destination array, which is dst. - */ -char * lv_strcpy(char * dst, const char * src); - -/** - * @brief This function will compare two strings without specified length. - * @param s1 pointer to the first string - * @param s2 pointer to the second string - * @return the difference between the value of the first unmatching character. - */ -int lv_strcmp(const char * s1, const char * s2); - -/** - * @brief Duplicate a string by allocating a new one and copying the content. - * @param src Pointer to the source of data to be copied. - * @return A pointer to the new allocated string. NULL if failed. - */ -char * lv_strdup(const char * src); - -/** - * @brief Copies the string pointed to by src, including the terminating null character, - * to the end of the string pointed to by dst. - * @param dst Pointer to the destination string where the content is to be appended. - * @param src Pointer to the source of data to be copied. - * @return A pointer to the destination string, which is dst. - */ -char * lv_strcat(char * dst, const char * src); - -/** - * @brief Copies up to src_len characters from the string pointed to by src - * to the end of the string pointed to by dst. - * A terminating null character is appended to dst even if no null character - * was encountered in src after src_len characters were copied. - * @param dst Pointer to the destination string where the content is to be appended. - * @param src Pointer to the source of data to be copied. - * @param src_len Maximum number of characters from src to be copied to the end of dst. - * @return A pointer to the destination string, which is dst. - */ -char * lv_strncat(char * dst, const char * src, size_t src_len); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_STRING_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/micropython/lv_mem_core_micropython.c b/software/Power_Pico/Middlewares/LVGL/src/stdlib/micropython/lv_mem_core_micropython.c deleted file mode 100644 index a671b5e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/micropython/lv_mem_core_micropython.c +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @file lv_malloc_core.c - */ - -/********************* - * INCLUDES - *********************/ -#include "../lv_mem.h" -#if LV_USE_STDLIB_MALLOC == LV_STDLIB_MICROPYTHON -#include "../../stdlib/lv_mem.h" -#include "include/lv_mp_mem_custom_include.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_mem_init(void) -{ - return; /*Nothing to init*/ -} - -void lv_mem_deinit(void) -{ - return; /*Nothing to deinit*/ - -} - -lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) -{ - /*Not supported*/ - LV_UNUSED(mem); - LV_UNUSED(bytes); - return NULL; -} - -void lv_mem_remove_pool(lv_mem_pool_t pool) -{ - /*Not supported*/ - LV_UNUSED(pool); - return; -} - -void * lv_malloc_core(size_t size) -{ -#if MICROPY_MALLOC_USES_ALLOCATED_SIZE - return gc_alloc(size, true); -#else - return m_malloc(size); -#endif -} - -void * lv_realloc_core(void * p, size_t new_size) -{ - -#if MICROPY_MALLOC_USES_ALLOCATED_SIZE - return gc_realloc(p, new_size, true); -#else - return m_realloc(p, new_size); -#endif -} - -void lv_free_core(void * p) -{ - -#if MICROPY_MALLOC_USES_ALLOCATED_SIZE - gc_free(p); - -#else - m_free(p); -#endif -} - -void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) -{ - /*Not supported*/ - LV_UNUSED(mon_p); - return; -} - -lv_result_t lv_mem_test_core(void) -{ - /*Not supported*/ - return LV_RESULT_OK; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_STDLIB_MICROPYTHON*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/rtthread/lv_mem_core_rtthread.c b/software/Power_Pico/Middlewares/LVGL/src/stdlib/rtthread/lv_mem_core_rtthread.c deleted file mode 100644 index 29a600a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/rtthread/lv_mem_core_rtthread.c +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @file lv_malloc_core_rtthread.c - */ - -/********************* - * INCLUDES - *********************/ -#include "../lv_mem.h" -#if LV_USE_STDLIB_MALLOC == LV_STDLIB_RTTHREAD -#include "../../stdlib/lv_mem.h" -#include - -#ifndef RT_USING_HEAP - #error "lv_mem_core_rtthread: RT_USING_HEAP is required. Define it in rtconfig.h" -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_mem_init(void) -{ - return; /*Nothing to init*/ -} - -void lv_mem_deinit(void) -{ - return; /*Nothing to deinit*/ -} - -lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) -{ - /*Not supported*/ - LV_UNUSED(mem); - LV_UNUSED(bytes); - return NULL; -} - -void lv_mem_remove_pool(lv_mem_pool_t pool) -{ - /*Not supported*/ - LV_UNUSED(pool); - return; -} - -void * lv_malloc_core(size_t size) -{ - return rt_malloc(size); -} - -void * lv_realloc_core(void * p, size_t new_size) -{ - return rt_realloc(p, new_size); -} - -void lv_free_core(void * p) -{ - rt_free(p); -} - -void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) -{ - /*Not supported*/ - LV_UNUSED(mon_p); - return; -} - -lv_result_t lv_mem_test_core(void) -{ - /*Not supported*/ - return LV_RESULT_OK; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_STDLIB_RTTHREAD*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/rtthread/lv_sprintf_rtthread.c b/software/Power_Pico/Middlewares/LVGL/src/stdlib/rtthread/lv_sprintf_rtthread.c deleted file mode 100644 index 721f4fd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/rtthread/lv_sprintf_rtthread.c +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @file lv_sprintf_rtthread.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_STDLIB_SPRINTF == LV_STDLIB_RTTHREAD -#include -#include -#include "../lv_sprintf.h" - -#if LV_USE_FLOAT == 1 - #warning "lv_sprintf_rtthread: rtthread not support float in sprintf" -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -int lv_snprintf(char * buffer, size_t count, const char * format, ...) -{ - va_list va; - va_start(va, format); - const int ret = rt_vsnprintf(buffer, count, format, va); - va_end(va); - return ret; -} - -int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) -{ - return rt_vsnprintf(buffer, count, format, va); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_STDLIB_RTTHREAD*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/stdlib/rtthread/lv_string_rtthread.c b/software/Power_Pico/Middlewares/LVGL/src/stdlib/rtthread/lv_string_rtthread.c deleted file mode 100644 index 2ab0a47..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/stdlib/rtthread/lv_string_rtthread.c +++ /dev/null @@ -1,123 +0,0 @@ -/** - * @file lv_string_rtthread.c - */ - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_STDLIB_STRING == LV_STDLIB_RTTHREAD -#include "../lv_string.h" -#include "../lv_mem.h" /*Need lv_malloc*/ -#include - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len) -{ - return rt_memcpy(dst, src, len); -} - -void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len) -{ - rt_memset(dst, v, len); -} - -void * LV_ATTRIBUTE_FAST_MEM lv_memmove(void * dst, const void * src, size_t len) -{ - return rt_memmove(dst, src, len); -} - -size_t lv_strlen(const char * str) -{ - return rt_strlen(str); -} - -int lv_memcmp(const void * p1, const void * p2, size_t len) -{ - return rt_memcmp(p1, p2, len); -} - -size_t lv_strlcpy(char * dst, const char * src, size_t dst_size) -{ - size_t src_len = lv_strlen(src); - if(dst_size > 0) { - size_t copy_size = src_len < dst_size ? src_len : dst_size - 1; - lv_memcpy(dst, src, copy_size); - dst[copy_size] = '\0'; - } - return src_len; -} - -char * lv_strncpy(char * dst, const char * src, size_t dest_size) -{ - return rt_strncpy(dst, src, dest_size); -} - -char * lv_strcpy(char * dst, const char * src) -{ - return rt_strcpy(dst, src); -} - -int lv_strcmp(const char * s1, const char * s2) -{ - return rt_strcmp(s1, s2); -} - -char * lv_strdup(const char * src) -{ - size_t len = lv_strlen(src) + 1; - char * dst = lv_malloc(len); - if(dst == NULL) return NULL; - - lv_memcpy(dst, src, len); /*memcpy is faster than strncpy when length is known*/ - return dst; -} - -char * lv_strcat(char * dst, const char * src) -{ - /*Since RT-thread does not have rt_strcat, - the following code is used instead.*/ - lv_strcpy(dst + lv_strlen(dst), src); - return dst; -} - -char * lv_strncat(char * dst, const char * src, size_t src_len) -{ - char * tmp = dst; - dst += lv_strlen(dst); - while(src_len != 0 && *src != '\0') { - src_len--; - *dst++ = *src++; - } - *dst = '\0'; - return tmp; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_STDLIB_RTTHREAD*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/themes/default/lv_theme_default.c b/software/Power_Pico/Middlewares/LVGL/src/themes/default/lv_theme_default.c deleted file mode 100644 index fa12662..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/themes/default/lv_theme_default.c +++ /dev/null @@ -1,1228 +0,0 @@ -/** - * @file lv_theme_default.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../../lvgl.h" /*To see all the widgets*/ - -#if LV_USE_THEME_DEFAULT - -#include "../lv_theme_private.h" -#include "../../misc/lv_color.h" -#include "../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ - -struct _my_theme_t; -typedef struct _my_theme_t my_theme_t; - -#define theme_def (*(my_theme_t **)(&LV_GLOBAL_DEFAULT()->theme_default)) - -#define MODE_DARK 1 -#define RADIUS_DEFAULT LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 12 : 8) - -/*SCREEN*/ -#define LIGHT_COLOR_SCR lv_palette_lighten(LV_PALETTE_GREY, 4) -#define LIGHT_COLOR_CARD lv_color_white() -#define LIGHT_COLOR_TEXT lv_palette_darken(LV_PALETTE_GREY, 4) -#define LIGHT_COLOR_GREY lv_palette_lighten(LV_PALETTE_GREY, 2) -#define DARK_COLOR_SCR lv_color_hex(0x15171A) -#define DARK_COLOR_CARD lv_color_hex(0x282b30) -#define DARK_COLOR_TEXT lv_palette_lighten(LV_PALETTE_GREY, 5) -#define DARK_COLOR_GREY lv_color_hex(0x2f3237) - -#define TRANSITION_TIME LV_THEME_DEFAULT_TRANSITION_TIME -#define BORDER_WIDTH LV_DPX_CALC(theme->disp_dpi, 2) -#define OUTLINE_WIDTH LV_DPX_CALC(theme->disp_dpi, 3) - -#define PAD_DEF LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 24 : theme->disp_size == DISP_MEDIUM ? 20 : 16) -#define PAD_SMALL LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 14 : theme->disp_size == DISP_MEDIUM ? 12 : 10) -#define PAD_TINY LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 8 : theme->disp_size == DISP_MEDIUM ? 6 : 2) - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_style_t scr; - lv_style_t scrollbar; - lv_style_t scrollbar_scrolled; - lv_style_t card; - lv_style_t btn; - - /*Utility*/ - lv_style_t bg_color_primary; - lv_style_t bg_color_primary_muted; - lv_style_t bg_color_secondary; - lv_style_t bg_color_secondary_muted; - lv_style_t bg_color_grey; - lv_style_t bg_color_white; - lv_style_t pressed; - lv_style_t disabled; - lv_style_t pad_zero; - lv_style_t pad_tiny; - lv_style_t pad_small; - lv_style_t pad_normal; - lv_style_t pad_gap; - lv_style_t line_space_large; - lv_style_t text_align_center; - lv_style_t outline_primary; - lv_style_t outline_secondary; - lv_style_t circle; - lv_style_t no_radius; - lv_style_t clip_corner; - lv_style_t rotary_scroll; -#if LV_THEME_DEFAULT_GROW - lv_style_t grow; -#endif - lv_style_t transition_delayed; - lv_style_t transition_normal; - lv_style_t anim; - lv_style_t anim_fast; - - /*Parts*/ - lv_style_t knob; - -#if LV_USE_ARC - lv_style_t arc_indic; - lv_style_t arc_indic_primary; -#endif - -#if LV_USE_CHART - lv_style_t chart_series, chart_indic, chart_bg; -#endif - -#if LV_USE_DROPDOWN - lv_style_t dropdown_list; -#endif - -#if LV_USE_CHECKBOX - lv_style_t cb_marker, cb_marker_checked; -#endif - -#if LV_USE_SWITCH - lv_style_t switch_knob; -#endif - -#if LV_USE_LINE - lv_style_t line; -#endif - -#if LV_USE_TABLE - lv_style_t table_cell; -#endif - -#if LV_USE_TEXTAREA - lv_style_t ta_cursor, ta_placeholder; -#endif - -#if LV_USE_CALENDAR - lv_style_t calendar_btnm_bg, calendar_btnm_day, calendar_header; -#endif - -#if LV_USE_MENU - lv_style_t menu_bg, menu_cont, menu_sidebar_cont, menu_main_cont, menu_page, menu_header_cont, menu_header_btn, - menu_section, menu_pressed, menu_separator; -#endif - -#if LV_USE_MSGBOX - lv_style_t msgbox_backdrop_bg; -#endif - -#if LV_USE_KEYBOARD - lv_style_t keyboard_button_bg; -#endif - -#if LV_USE_LIST - lv_style_t list_bg, list_btn, list_item_grow; -#endif - -#if LV_USE_TABVIEW - lv_style_t tab_bg_focus, tab_btn; -#endif -#if LV_USE_LED - lv_style_t led; -#endif - -#if LV_USE_SCALE - lv_style_t scale; -#endif -} my_theme_styles_t; - -typedef enum { - DISP_SMALL = 3, - DISP_MEDIUM = 2, - DISP_LARGE = 1, -} disp_size_t; - -struct _my_theme_t { - lv_theme_t base; - disp_size_t disp_size; - int32_t disp_dpi; - lv_color_t color_scr; - lv_color_t color_text; - lv_color_t color_card; - lv_color_t color_grey; - bool inited; - my_theme_styles_t styles; - - lv_color_filter_dsc_t dark_filter; - lv_color_filter_dsc_t grey_filter; - -#if LV_THEME_DEFAULT_TRANSITION_TIME - lv_style_transition_dsc_t trans_delayed; - lv_style_transition_dsc_t trans_normal; -#endif -}; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void theme_apply(lv_theme_t * th, lv_obj_t * obj); -static void style_init_reset(lv_style_t * style); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static lv_color_t dark_color_filter_cb(const lv_color_filter_dsc_t * f, lv_color_t c, lv_opa_t opa) -{ - LV_UNUSED(f); - return lv_color_darken(c, opa); -} - -static lv_color_t grey_filter_cb(const lv_color_filter_dsc_t * f, lv_color_t color, lv_opa_t opa) -{ - LV_UNUSED(f); - if(theme_def->base.flags & MODE_DARK) return lv_color_mix(lv_palette_darken(LV_PALETTE_GREY, 2), color, opa); - else return lv_color_mix(lv_palette_lighten(LV_PALETTE_GREY, 2), color, opa); -} - -static void style_init(my_theme_t * theme) -{ -#if TRANSITION_TIME - static const lv_style_prop_t trans_props[] = { - LV_STYLE_BG_OPA, LV_STYLE_BG_COLOR, - LV_STYLE_TRANSFORM_WIDTH, LV_STYLE_TRANSFORM_HEIGHT, - LV_STYLE_TRANSLATE_Y, LV_STYLE_TRANSLATE_X, - LV_STYLE_TRANSFORM_ROTATION, - LV_STYLE_TRANSFORM_SCALE_X, LV_STYLE_TRANSFORM_SCALE_Y, - LV_STYLE_COLOR_FILTER_OPA, LV_STYLE_COLOR_FILTER_DSC, - 0 - }; -#endif - - theme->color_scr = theme->base.flags & MODE_DARK ? DARK_COLOR_SCR : LIGHT_COLOR_SCR; - theme->color_text = theme->base.flags & MODE_DARK ? DARK_COLOR_TEXT : LIGHT_COLOR_TEXT; - theme->color_card = theme->base.flags & MODE_DARK ? DARK_COLOR_CARD : LIGHT_COLOR_CARD; - theme->color_grey = theme->base.flags & MODE_DARK ? DARK_COLOR_GREY : LIGHT_COLOR_GREY; - - style_init_reset(&theme->styles.transition_delayed); - style_init_reset(&theme->styles.transition_normal); -#if TRANSITION_TIME - lv_style_transition_dsc_init(&theme->trans_delayed, trans_props, lv_anim_path_linear, TRANSITION_TIME, 70, NULL); - lv_style_transition_dsc_init(&theme->trans_normal, trans_props, lv_anim_path_linear, TRANSITION_TIME, 0, NULL); - - lv_style_set_transition(&theme->styles.transition_delayed, - &theme->trans_delayed); /*Go back to default state with delay*/ - - lv_style_set_transition(&theme->styles.transition_normal, &theme->trans_normal); /*Go back to default state with delay*/ -#endif - - style_init_reset(&theme->styles.scrollbar); - lv_color_t sb_color = (theme->base.flags & MODE_DARK) ? lv_palette_darken(LV_PALETTE_GREY, - 2) : lv_palette_main(LV_PALETTE_GREY); - lv_style_set_bg_color(&theme->styles.scrollbar, sb_color); - - lv_style_set_radius(&theme->styles.scrollbar, LV_RADIUS_CIRCLE); - lv_style_set_pad_all(&theme->styles.scrollbar, LV_DPX_CALC(theme->disp_dpi, 7)); - lv_style_set_width(&theme->styles.scrollbar, LV_DPX_CALC(theme->disp_dpi, 5)); - lv_style_set_bg_opa(&theme->styles.scrollbar, LV_OPA_40); -#if TRANSITION_TIME - lv_style_set_transition(&theme->styles.scrollbar, &theme->trans_normal); -#endif - - style_init_reset(&theme->styles.scrollbar_scrolled); - lv_style_set_bg_opa(&theme->styles.scrollbar_scrolled, LV_OPA_COVER); - - style_init_reset(&theme->styles.scr); - lv_style_set_bg_opa(&theme->styles.scr, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.scr, theme->color_scr); - lv_style_set_text_color(&theme->styles.scr, theme->color_text); - lv_style_set_text_font(&theme->styles.scr, theme->base.font_normal); - lv_style_set_pad_row(&theme->styles.scr, PAD_SMALL); - lv_style_set_pad_column(&theme->styles.scr, PAD_SMALL); - lv_style_set_rotary_sensitivity(&theme->styles.scr, theme->disp_dpi / 4 * 256); - - style_init_reset(&theme->styles.card); - lv_style_set_radius(&theme->styles.card, RADIUS_DEFAULT); - lv_style_set_bg_opa(&theme->styles.card, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.card, theme->color_card); - lv_style_set_border_color(&theme->styles.card, theme->color_grey); - lv_style_set_border_width(&theme->styles.card, BORDER_WIDTH); - lv_style_set_border_post(&theme->styles.card, true); - lv_style_set_text_color(&theme->styles.card, theme->color_text); - lv_style_set_pad_all(&theme->styles.card, PAD_DEF); - lv_style_set_pad_row(&theme->styles.card, PAD_SMALL); - lv_style_set_pad_column(&theme->styles.card, PAD_SMALL); - lv_style_set_line_color(&theme->styles.card, lv_palette_main(LV_PALETTE_GREY)); - lv_style_set_line_width(&theme->styles.card, LV_DPX_CALC(theme->disp_dpi, 1)); - - style_init_reset(&theme->styles.outline_primary); - lv_style_set_outline_color(&theme->styles.outline_primary, theme->base.color_primary); - lv_style_set_outline_width(&theme->styles.outline_primary, OUTLINE_WIDTH); - lv_style_set_outline_pad(&theme->styles.outline_primary, OUTLINE_WIDTH); - lv_style_set_outline_opa(&theme->styles.outline_primary, LV_OPA_50); - - style_init_reset(&theme->styles.outline_secondary); - lv_style_set_outline_color(&theme->styles.outline_secondary, theme->base.color_secondary); - lv_style_set_outline_width(&theme->styles.outline_secondary, OUTLINE_WIDTH); - lv_style_set_outline_opa(&theme->styles.outline_secondary, LV_OPA_50); - - style_init_reset(&theme->styles.btn); - lv_style_set_radius(&theme->styles.btn, - LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 16 : theme->disp_size == DISP_MEDIUM ? 12 : 8)); - lv_style_set_bg_opa(&theme->styles.btn, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.btn, theme->color_grey); - if(!(theme->base.flags & MODE_DARK)) { - lv_style_set_shadow_color(&theme->styles.btn, lv_palette_main(LV_PALETTE_GREY)); - lv_style_set_shadow_width(&theme->styles.btn, LV_DPX(3)); - lv_style_set_shadow_opa(&theme->styles.btn, LV_OPA_50); - lv_style_set_shadow_offset_y(&theme->styles.btn, LV_DPX_CALC(theme->disp_dpi, LV_DPX(4))); - } - lv_style_set_text_color(&theme->styles.btn, theme->color_text); - lv_style_set_pad_hor(&theme->styles.btn, PAD_DEF); - lv_style_set_pad_ver(&theme->styles.btn, PAD_SMALL); - lv_style_set_pad_column(&theme->styles.btn, LV_DPX_CALC(theme->disp_dpi, 5)); - lv_style_set_pad_row(&theme->styles.btn, LV_DPX_CALC(theme->disp_dpi, 5)); - - lv_color_filter_dsc_init(&theme->dark_filter, dark_color_filter_cb); - lv_color_filter_dsc_init(&theme->grey_filter, grey_filter_cb); - - style_init_reset(&theme->styles.pressed); - lv_style_set_color_filter_dsc(&theme->styles.pressed, &theme->dark_filter); - lv_style_set_color_filter_opa(&theme->styles.pressed, 35); - - style_init_reset(&theme->styles.disabled); - lv_style_set_color_filter_dsc(&theme->styles.disabled, &theme->grey_filter); - lv_style_set_color_filter_opa(&theme->styles.disabled, LV_OPA_50); - - style_init_reset(&theme->styles.clip_corner); - lv_style_set_clip_corner(&theme->styles.clip_corner, true); - lv_style_set_border_post(&theme->styles.clip_corner, true); - - style_init_reset(&theme->styles.pad_normal); - lv_style_set_pad_all(&theme->styles.pad_normal, PAD_DEF); - lv_style_set_pad_row(&theme->styles.pad_normal, PAD_DEF); - lv_style_set_pad_column(&theme->styles.pad_normal, PAD_DEF); - - style_init_reset(&theme->styles.pad_small); - lv_style_set_pad_all(&theme->styles.pad_small, PAD_SMALL); - lv_style_set_pad_gap(&theme->styles.pad_small, PAD_SMALL); - - style_init_reset(&theme->styles.pad_gap); - lv_style_set_pad_row(&theme->styles.pad_gap, LV_DPX_CALC(theme->disp_dpi, 10)); - lv_style_set_pad_column(&theme->styles.pad_gap, LV_DPX_CALC(theme->disp_dpi, 10)); - - style_init_reset(&theme->styles.line_space_large); - lv_style_set_text_line_space(&theme->styles.line_space_large, LV_DPX_CALC(theme->disp_dpi, 20)); - - style_init_reset(&theme->styles.text_align_center); - lv_style_set_text_align(&theme->styles.text_align_center, LV_TEXT_ALIGN_CENTER); - - style_init_reset(&theme->styles.pad_zero); - lv_style_set_pad_all(&theme->styles.pad_zero, 0); - lv_style_set_pad_row(&theme->styles.pad_zero, 0); - lv_style_set_pad_column(&theme->styles.pad_zero, 0); - - style_init_reset(&theme->styles.pad_tiny); - lv_style_set_pad_all(&theme->styles.pad_tiny, PAD_TINY); - lv_style_set_pad_row(&theme->styles.pad_tiny, PAD_TINY); - lv_style_set_pad_column(&theme->styles.pad_tiny, PAD_TINY); - - style_init_reset(&theme->styles.bg_color_primary); - lv_style_set_bg_color(&theme->styles.bg_color_primary, theme->base.color_primary); - lv_style_set_text_color(&theme->styles.bg_color_primary, lv_color_white()); - lv_style_set_bg_opa(&theme->styles.bg_color_primary, LV_OPA_COVER); - - style_init_reset(&theme->styles.bg_color_primary_muted); - lv_style_set_bg_color(&theme->styles.bg_color_primary_muted, theme->base.color_primary); - lv_style_set_text_color(&theme->styles.bg_color_primary_muted, theme->base.color_primary); - lv_style_set_bg_opa(&theme->styles.bg_color_primary_muted, LV_OPA_20); - - style_init_reset(&theme->styles.bg_color_secondary); - lv_style_set_bg_color(&theme->styles.bg_color_secondary, theme->base.color_secondary); - lv_style_set_text_color(&theme->styles.bg_color_secondary, lv_color_white()); - lv_style_set_bg_opa(&theme->styles.bg_color_secondary, LV_OPA_COVER); - - style_init_reset(&theme->styles.bg_color_secondary_muted); - lv_style_set_bg_color(&theme->styles.bg_color_secondary_muted, theme->base.color_secondary); - lv_style_set_text_color(&theme->styles.bg_color_secondary_muted, theme->base.color_secondary); - lv_style_set_bg_opa(&theme->styles.bg_color_secondary_muted, LV_OPA_20); - - style_init_reset(&theme->styles.bg_color_grey); - lv_style_set_bg_color(&theme->styles.bg_color_grey, theme->color_grey); - lv_style_set_bg_opa(&theme->styles.bg_color_grey, LV_OPA_COVER); - lv_style_set_text_color(&theme->styles.bg_color_grey, theme->color_text); - - style_init_reset(&theme->styles.bg_color_white); - lv_style_set_bg_color(&theme->styles.bg_color_white, theme->color_card); - lv_style_set_bg_opa(&theme->styles.bg_color_white, LV_OPA_COVER); - lv_style_set_text_color(&theme->styles.bg_color_white, theme->color_text); - - style_init_reset(&theme->styles.circle); - lv_style_set_radius(&theme->styles.circle, LV_RADIUS_CIRCLE); - - style_init_reset(&theme->styles.no_radius); - lv_style_set_radius(&theme->styles.no_radius, 0); - - style_init_reset(&theme->styles.rotary_scroll); - lv_style_set_rotary_sensitivity(&theme->styles.rotary_scroll, theme->disp_dpi / 4 * 256); - -#if LV_THEME_DEFAULT_GROW - style_init_reset(&theme->styles.grow); - lv_style_set_transform_width(&theme->styles.grow, LV_DPX_CALC(theme->disp_dpi, 3)); - lv_style_set_transform_height(&theme->styles.grow, LV_DPX_CALC(theme->disp_dpi, 3)); -#endif - - style_init_reset(&theme->styles.knob); - lv_style_set_bg_color(&theme->styles.knob, theme->base.color_primary); - lv_style_set_bg_opa(&theme->styles.knob, LV_OPA_COVER); - lv_style_set_pad_all(&theme->styles.knob, LV_DPX_CALC(theme->disp_dpi, 6)); - lv_style_set_radius(&theme->styles.knob, LV_RADIUS_CIRCLE); - - style_init_reset(&theme->styles.anim); - lv_style_set_anim_duration(&theme->styles.anim, 200); - - style_init_reset(&theme->styles.anim_fast); - lv_style_set_anim_duration(&theme->styles.anim_fast, 120); - -#if LV_USE_ARC - style_init_reset(&theme->styles.arc_indic); - lv_style_set_arc_color(&theme->styles.arc_indic, theme->color_grey); - lv_style_set_arc_width(&theme->styles.arc_indic, LV_DPX_CALC(theme->disp_dpi, 15)); - lv_style_set_arc_rounded(&theme->styles.arc_indic, true); - - style_init_reset(&theme->styles.arc_indic_primary); - lv_style_set_arc_color(&theme->styles.arc_indic_primary, theme->base.color_primary); -#endif - -#if LV_USE_DROPDOWN - style_init_reset(&theme->styles.dropdown_list); - lv_style_set_max_height(&theme->styles.dropdown_list, LV_DPI_DEF * 2); -#endif -#if LV_USE_CHECKBOX - style_init_reset(&theme->styles.cb_marker); - lv_style_set_pad_all(&theme->styles.cb_marker, LV_DPX_CALC(theme->disp_dpi, 3)); - lv_style_set_border_width(&theme->styles.cb_marker, BORDER_WIDTH); - lv_style_set_border_color(&theme->styles.cb_marker, theme->base.color_primary); - lv_style_set_bg_color(&theme->styles.cb_marker, theme->color_card); - lv_style_set_bg_opa(&theme->styles.cb_marker, LV_OPA_COVER); - lv_style_set_radius(&theme->styles.cb_marker, RADIUS_DEFAULT / 2); - lv_style_set_text_font(&theme->styles.cb_marker, theme->base.font_small); - lv_style_set_text_color(&theme->styles.cb_marker, lv_color_white()); - - style_init_reset(&theme->styles.cb_marker_checked); - lv_style_set_bg_image_src(&theme->styles.cb_marker_checked, LV_SYMBOL_OK); -#endif - -#if LV_USE_SWITCH - style_init_reset(&theme->styles.switch_knob); - lv_style_set_pad_all(&theme->styles.switch_knob, - LV_DPX_CALC(theme->disp_dpi, 4)); - lv_style_set_bg_color(&theme->styles.switch_knob, lv_color_white()); -#endif - -#if LV_USE_LINE - style_init_reset(&theme->styles.line); - lv_style_set_line_width(&theme->styles.line, 1); - lv_style_set_line_color(&theme->styles.line, theme->color_text); -#endif - -#if LV_USE_CHART - style_init_reset(&theme->styles.chart_bg); - lv_style_set_border_post(&theme->styles.chart_bg, false); - lv_style_set_pad_column(&theme->styles.chart_bg, LV_DPX_CALC(theme->disp_dpi, 10)); - lv_style_set_line_color(&theme->styles.chart_bg, theme->color_grey); - - style_init_reset(&theme->styles.chart_series); - lv_style_set_line_width(&theme->styles.chart_series, LV_DPX_CALC(theme->disp_dpi, 3)); - lv_style_set_radius(&theme->styles.chart_series, LV_DPX_CALC(theme->disp_dpi, 3)); - - int32_t chart_size = LV_DPX_CALC(theme->disp_dpi, 8); - lv_style_set_size(&theme->styles.chart_series, chart_size, chart_size); - lv_style_set_pad_column(&theme->styles.chart_series, LV_DPX_CALC(theme->disp_dpi, 2)); - - style_init_reset(&theme->styles.chart_indic); - lv_style_set_radius(&theme->styles.chart_indic, LV_RADIUS_CIRCLE); - lv_style_set_size(&theme->styles.chart_indic, chart_size, chart_size); - lv_style_set_bg_color(&theme->styles.chart_indic, theme->base.color_primary); - lv_style_set_bg_opa(&theme->styles.chart_indic, LV_OPA_COVER); -#endif - -#if LV_USE_MENU - style_init_reset(&theme->styles.menu_bg); - lv_style_set_pad_all(&theme->styles.menu_bg, 0); - lv_style_set_pad_gap(&theme->styles.menu_bg, 0); - lv_style_set_radius(&theme->styles.menu_bg, 0); - lv_style_set_clip_corner(&theme->styles.menu_bg, true); - lv_style_set_border_side(&theme->styles.menu_bg, LV_BORDER_SIDE_NONE); - - style_init_reset(&theme->styles.menu_section); - lv_style_set_radius(&theme->styles.menu_section, RADIUS_DEFAULT); - lv_style_set_clip_corner(&theme->styles.menu_section, true); - lv_style_set_bg_opa(&theme->styles.menu_section, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.menu_section, theme->color_card); - lv_style_set_text_color(&theme->styles.menu_section, theme->color_text); - - style_init_reset(&theme->styles.menu_cont); - lv_style_set_pad_hor(&theme->styles.menu_cont, PAD_SMALL); - lv_style_set_pad_ver(&theme->styles.menu_cont, PAD_SMALL); - lv_style_set_pad_gap(&theme->styles.menu_cont, PAD_SMALL); - lv_style_set_border_width(&theme->styles.menu_cont, LV_DPX_CALC(theme->disp_dpi, 1)); - lv_style_set_border_opa(&theme->styles.menu_cont, LV_OPA_10); - lv_style_set_border_color(&theme->styles.menu_cont, theme->color_text); - lv_style_set_border_side(&theme->styles.menu_cont, LV_BORDER_SIDE_NONE); - - style_init_reset(&theme->styles.menu_sidebar_cont); - lv_style_set_pad_all(&theme->styles.menu_sidebar_cont, 0); - lv_style_set_pad_gap(&theme->styles.menu_sidebar_cont, 0); - lv_style_set_border_width(&theme->styles.menu_sidebar_cont, LV_DPX_CALC(theme->disp_dpi, 1)); - lv_style_set_border_opa(&theme->styles.menu_sidebar_cont, LV_OPA_10); - lv_style_set_border_color(&theme->styles.menu_sidebar_cont, theme->color_text); - lv_style_set_border_side(&theme->styles.menu_sidebar_cont, LV_BORDER_SIDE_RIGHT); - - style_init_reset(&theme->styles.menu_main_cont); - lv_style_set_pad_all(&theme->styles.menu_main_cont, 0); - lv_style_set_pad_gap(&theme->styles.menu_main_cont, 0); - - style_init_reset(&theme->styles.menu_header_cont); - lv_style_set_pad_hor(&theme->styles.menu_header_cont, PAD_SMALL); - lv_style_set_pad_ver(&theme->styles.menu_header_cont, PAD_TINY); - lv_style_set_pad_gap(&theme->styles.menu_header_cont, PAD_SMALL); - - style_init_reset(&theme->styles.menu_header_btn); - lv_style_set_pad_hor(&theme->styles.menu_header_btn, PAD_TINY); - lv_style_set_pad_ver(&theme->styles.menu_header_btn, PAD_TINY); - lv_style_set_shadow_opa(&theme->styles.menu_header_btn, LV_OPA_TRANSP); - lv_style_set_bg_opa(&theme->styles.menu_header_btn, LV_OPA_TRANSP); - lv_style_set_text_color(&theme->styles.menu_header_btn, theme->color_text); - - style_init_reset(&theme->styles.menu_page); - lv_style_set_pad_hor(&theme->styles.menu_page, 0); - lv_style_set_pad_gap(&theme->styles.menu_page, 0); - - style_init_reset(&theme->styles.menu_pressed); - lv_style_set_bg_opa(&theme->styles.menu_pressed, LV_OPA_20); - lv_style_set_bg_color(&theme->styles.menu_pressed, lv_palette_main(LV_PALETTE_GREY)); - - style_init_reset(&theme->styles.menu_separator); - lv_style_set_bg_opa(&theme->styles.menu_separator, LV_OPA_TRANSP); - lv_style_set_pad_ver(&theme->styles.menu_separator, PAD_TINY); -#endif - -#if LV_USE_TABLE - style_init_reset(&theme->styles.table_cell); - lv_style_set_border_width(&theme->styles.table_cell, LV_DPX_CALC(theme->disp_dpi, 1)); - lv_style_set_border_color(&theme->styles.table_cell, theme->color_grey); - lv_style_set_border_side(&theme->styles.table_cell, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_BOTTOM); -#endif - -#if LV_USE_TEXTAREA - style_init_reset(&theme->styles.ta_cursor); - lv_style_set_border_color(&theme->styles.ta_cursor, theme->color_text); - lv_style_set_border_width(&theme->styles.ta_cursor, LV_DPX_CALC(theme->disp_dpi, 2)); - lv_style_set_pad_left(&theme->styles.ta_cursor, - LV_DPX_CALC(theme->disp_dpi, 1)); - lv_style_set_border_side(&theme->styles.ta_cursor, LV_BORDER_SIDE_LEFT); - lv_style_set_anim_duration(&theme->styles.ta_cursor, 400); - - style_init_reset(&theme->styles.ta_placeholder); - lv_style_set_text_color(&theme->styles.ta_placeholder, - (theme->base.flags & MODE_DARK) ? lv_palette_darken(LV_PALETTE_GREY, - 2) : lv_palette_lighten(LV_PALETTE_GREY, 1)); -#endif - -#if LV_USE_CALENDAR - style_init_reset(&theme->styles.calendar_btnm_bg); - lv_style_set_pad_all(&theme->styles.calendar_btnm_bg, PAD_SMALL); - lv_style_set_pad_gap(&theme->styles.calendar_btnm_bg, PAD_SMALL / 2); - - style_init_reset(&theme->styles.calendar_btnm_day); - lv_style_set_border_width(&theme->styles.calendar_btnm_day, LV_DPX_CALC(theme->disp_dpi, 1)); - lv_style_set_border_color(&theme->styles.calendar_btnm_day, theme->color_grey); - lv_style_set_bg_color(&theme->styles.calendar_btnm_day, theme->color_card); - lv_style_set_bg_opa(&theme->styles.calendar_btnm_day, LV_OPA_20); - - style_init_reset(&theme->styles.calendar_header); - lv_style_set_pad_hor(&theme->styles.calendar_header, PAD_SMALL); - lv_style_set_pad_top(&theme->styles.calendar_header, PAD_SMALL); - lv_style_set_pad_bottom(&theme->styles.calendar_header, PAD_TINY); - lv_style_set_pad_gap(&theme->styles.calendar_header, PAD_SMALL); -#endif - -#if LV_USE_MSGBOX - style_init_reset(&theme->styles.msgbox_backdrop_bg); - lv_style_set_bg_color(&theme->styles.msgbox_backdrop_bg, lv_palette_main(LV_PALETTE_GREY)); - lv_style_set_bg_opa(&theme->styles.msgbox_backdrop_bg, LV_OPA_50); -#endif -#if LV_USE_KEYBOARD - style_init_reset(&theme->styles.keyboard_button_bg); - lv_style_set_shadow_width(&theme->styles.keyboard_button_bg, 0); - lv_style_set_radius(&theme->styles.keyboard_button_bg, - theme->disp_size == DISP_SMALL ? RADIUS_DEFAULT / 2 : RADIUS_DEFAULT); -#endif - -#if LV_USE_TABVIEW - style_init_reset(&theme->styles.tab_btn); - lv_style_set_border_color(&theme->styles.tab_btn, theme->base.color_primary); - lv_style_set_border_width(&theme->styles.tab_btn, BORDER_WIDTH * 2); - lv_style_set_border_side(&theme->styles.tab_btn, LV_BORDER_SIDE_BOTTOM); - lv_style_set_pad_top(&theme->styles.tab_btn, BORDER_WIDTH * 2); - - style_init_reset(&theme->styles.tab_bg_focus); - lv_style_set_outline_pad(&theme->styles.tab_bg_focus, -BORDER_WIDTH); -#endif - -#if LV_USE_LIST - style_init_reset(&theme->styles.list_bg); - lv_style_set_pad_hor(&theme->styles.list_bg, PAD_DEF); - lv_style_set_pad_ver(&theme->styles.list_bg, 0); - lv_style_set_pad_gap(&theme->styles.list_bg, 0); - lv_style_set_clip_corner(&theme->styles.list_bg, true); - - style_init_reset(&theme->styles.list_btn); - lv_style_set_border_width(&theme->styles.list_btn, LV_DPX_CALC(theme->disp_dpi, 1)); - lv_style_set_border_color(&theme->styles.list_btn, theme->color_grey); - lv_style_set_border_side(&theme->styles.list_btn, LV_BORDER_SIDE_BOTTOM); - lv_style_set_pad_all(&theme->styles.list_btn, PAD_SMALL); - lv_style_set_pad_column(&theme->styles.list_btn, PAD_SMALL); - - style_init_reset(&theme->styles.list_item_grow); - lv_style_set_transform_width(&theme->styles.list_item_grow, PAD_DEF); -#endif - -#if LV_USE_LED - style_init_reset(&theme->styles.led); - lv_style_set_bg_opa(&theme->styles.led, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.led, lv_color_white()); - lv_style_set_bg_grad_color(&theme->styles.led, lv_palette_main(LV_PALETTE_GREY)); - lv_style_set_radius(&theme->styles.led, LV_RADIUS_CIRCLE); - lv_style_set_shadow_width(&theme->styles.led, LV_DPX_CALC(theme->disp_dpi, 15)); - lv_style_set_shadow_color(&theme->styles.led, lv_color_white()); - lv_style_set_shadow_spread(&theme->styles.led, LV_DPX_CALC(theme->disp_dpi, 5)); -#endif - -#if LV_USE_SCALE - style_init_reset(&theme->styles.scale); - lv_style_set_line_color(&theme->styles.scale, theme->color_text); - lv_style_set_line_width(&theme->styles.scale, LV_DPX(2)); - lv_style_set_arc_color(&theme->styles.scale, theme->color_text); - lv_style_set_arc_width(&theme->styles.scale, LV_DPX(2)); - lv_style_set_length(&theme->styles.scale, LV_DPX(6)); -#endif -} - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_theme_t * lv_theme_default_init(lv_display_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, - const lv_font_t * font) -{ - /*This trick is required only to avoid the garbage collection of - *styles' data if LVGL is used in a binding (e.g. MicroPython) - *In a general case styles could be in a simple `static lv_style_t my_style...` variables*/ - - if(!lv_theme_default_is_inited()) { - theme_def = lv_malloc_zeroed(sizeof(my_theme_t)); - } - - my_theme_t * theme = theme_def; - - lv_display_t * new_disp = disp == NULL ? lv_display_get_default() : disp; - int32_t new_dpi = lv_display_get_dpi(new_disp); - int32_t hor_res = lv_display_get_horizontal_resolution(new_disp); - disp_size_t new_size; - - if(hor_res <= 320) new_size = DISP_SMALL; - else if(hor_res < 720) new_size = DISP_MEDIUM; - else new_size = DISP_LARGE; - - /* check theme information whether will change or not*/ - if(theme->inited && theme->disp_dpi == new_dpi && - theme->disp_size == new_size && - lv_color_eq(theme->base.color_primary, color_primary) && - lv_color_eq(theme->base.color_secondary, color_secondary) && - (theme->base.flags == dark ? MODE_DARK : 0) && - theme->base.font_small == font) { - return (lv_theme_t *) theme; - - } - - theme->disp_size = new_size; - theme->disp_dpi = new_dpi; - theme->base.disp = new_disp; - theme->base.color_primary = color_primary; - theme->base.color_secondary = color_secondary; - theme->base.font_small = font; - theme->base.font_normal = font; - theme->base.font_large = font; - theme->base.apply_cb = theme_apply; - theme->base.flags = dark ? MODE_DARK : 0; - - style_init(theme); - - if(disp == NULL || lv_display_get_theme(disp) == (lv_theme_t *)theme) lv_obj_report_style_change(NULL); - - theme->inited = true; - - return (lv_theme_t *) theme; -} - -void lv_theme_default_deinit(void) -{ - my_theme_t * theme = theme_def; - if(theme) { - if(theme->inited) { - lv_style_t * theme_styles = (lv_style_t *)(&(theme->styles)); - uint32_t i; - for(i = 0; i < sizeof(my_theme_styles_t) / sizeof(lv_style_t); i++) { - lv_style_reset(theme_styles + i); - } - - } - lv_free(theme_def); - theme_def = NULL; - } -} - -lv_theme_t * lv_theme_default_get(void) -{ - if(!lv_theme_default_is_inited()) { - return NULL; - } - - return (lv_theme_t *)theme_def; -} - -bool lv_theme_default_is_inited(void) -{ - my_theme_t * theme = theme_def; - if(theme == NULL) return false; - return theme->inited; -} - -static void theme_apply(lv_theme_t * th, lv_obj_t * obj) -{ - LV_UNUSED(th); - - my_theme_t * theme = theme_def; - lv_obj_t * parent = lv_obj_get_parent(obj); - - if(parent == NULL) { - lv_obj_add_style(obj, &theme->styles.scr, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - return; - } - - if(lv_obj_check_type(obj, &lv_obj_class)) { -#if LV_USE_TABVIEW - /*Tabview content area*/ - if(lv_obj_check_type(parent, &lv_tabview_class) && lv_obj_get_child(parent, 1) == obj) { - return; - } - /*Tabview button container*/ - else if(lv_obj_check_type(parent, &lv_tabview_class) && lv_obj_get_child(parent, 0) == obj) { - lv_obj_add_style(obj, &theme->styles.bg_color_white, 0); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.tab_bg_focus, LV_STATE_FOCUS_KEY); - return; - } - /*Tabview pages*/ - else if(lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) { - lv_obj_add_style(obj, &theme->styles.pad_normal, 0); - lv_obj_add_style(obj, &theme->styles.rotary_scroll, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - return; - } -#endif - -#if LV_USE_WIN - /*Header*/ - if(lv_obj_check_type(parent, &lv_win_class) && lv_obj_get_child(parent, 0) == obj) { - lv_obj_add_style(obj, &theme->styles.bg_color_grey, 0); - lv_obj_add_style(obj, &theme->styles.pad_tiny, 0); - return; - } - /*Content*/ - else if(lv_obj_check_type(parent, &lv_win_class) && lv_obj_get_child(parent, 1) == obj) { - lv_obj_add_style(obj, &theme->styles.scr, 0); - lv_obj_add_style(obj, &theme->styles.pad_normal, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - return; - } -#endif - -#if LV_USE_CALENDAR - if(lv_obj_check_type(parent, &lv_calendar_class)) { - /*No style*/ - return; - } -#endif - - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - } -#if LV_USE_BUTTON - else if(lv_obj_check_type(obj, &lv_button_class)) { - -#if LV_USE_TABVIEW - lv_obj_t * tv = lv_obj_get_parent(parent); /*parent is the tabview header*/ - if(tv && lv_obj_get_child(tv, 0) == parent) { /*The button is on the tab view header*/ - if(lv_obj_check_type(tv, &lv_tabview_class)) { - lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.tab_btn, LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); - lv_obj_add_style(obj, &theme->styles.tab_bg_focus, LV_STATE_FOCUS_KEY); - return; - } - } - -#endif - lv_obj_add_style(obj, &theme->styles.btn, 0); - lv_obj_add_style(obj, &theme->styles.bg_color_primary, 0); - lv_obj_add_style(obj, &theme->styles.transition_delayed, 0); - lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.transition_normal, LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); -#if LV_THEME_DEFAULT_GROW - lv_obj_add_style(obj, &theme->styles.grow, LV_STATE_PRESSED); -#endif - lv_obj_add_style(obj, &theme->styles.bg_color_secondary, LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); - -#if LV_USE_MENU - if(lv_obj_check_type(parent, &lv_menu_sidebar_header_cont_class) || - lv_obj_check_type(parent, &lv_menu_main_header_cont_class)) { - lv_obj_add_style(obj, &theme->styles.menu_header_btn, 0); - lv_obj_add_style(obj, &theme->styles.menu_pressed, LV_STATE_PRESSED); - } -#endif - } -#endif - -#if LV_USE_LINE - else if(lv_obj_check_type(obj, &lv_line_class)) { - lv_obj_add_style(obj, &theme->styles.line, 0); - } -#endif - -#if LV_USE_BUTTONMATRIX - else if(lv_obj_check_type(obj, &lv_buttonmatrix_class)) { - -#if LV_USE_CALENDAR - if(lv_obj_check_type(parent, &lv_calendar_class)) { - lv_obj_add_style(obj, &theme->styles.calendar_btnm_bg, 0); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); - lv_obj_add_style(obj, &theme->styles.calendar_btnm_day, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_ITEMS | LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_PART_ITEMS | LV_STATE_EDITED); - return; - } -#endif - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); - lv_obj_add_style(obj, &theme->styles.btn, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); - lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_ITEMS | LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_ITEMS | LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_PART_ITEMS | LV_STATE_EDITED); - } -#endif - -#if LV_USE_BAR - else if(lv_obj_check_type(obj, &lv_bar_class)) { - lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, 0); - lv_obj_add_style(obj, &theme->styles.circle, 0); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); - lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.circle, LV_PART_INDICATOR); - } -#endif - -#if LV_USE_SLIDER - else if(lv_obj_check_type(obj, &lv_slider_class)) { - lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, 0); - lv_obj_add_style(obj, &theme->styles.circle, 0); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); - lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.circle, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.knob, LV_PART_KNOB); -#if LV_THEME_DEFAULT_GROW - lv_obj_add_style(obj, &theme->styles.grow, LV_PART_KNOB | LV_STATE_PRESSED); -#endif - lv_obj_add_style(obj, &theme->styles.transition_delayed, LV_PART_KNOB); - lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_KNOB | LV_STATE_PRESSED); - } -#endif - -#if LV_USE_TABLE - else if(lv_obj_check_type(obj, &lv_table_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.pad_zero, 0); - lv_obj_add_style(obj, &theme->styles.no_radius, 0); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - lv_obj_add_style(obj, &theme->styles.bg_color_white, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.table_cell, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.pad_normal, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_ITEMS | LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.bg_color_secondary, LV_PART_ITEMS | LV_STATE_EDITED); - } -#endif - -#if LV_USE_CHECKBOX - else if(lv_obj_check_type(obj, &lv_checkbox_class)) { - lv_obj_add_style(obj, &theme->styles.pad_gap, 0); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_INDICATOR | LV_STATE_DISABLED); - lv_obj_add_style(obj, &theme->styles.cb_marker, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_INDICATOR | LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.cb_marker_checked, LV_PART_INDICATOR | LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_INDICATOR | LV_STATE_PRESSED); -#if LV_THEME_DEFAULT_GROW - lv_obj_add_style(obj, &theme->styles.grow, LV_PART_INDICATOR | LV_STATE_PRESSED); -#endif - lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_INDICATOR | LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.transition_delayed, LV_PART_INDICATOR); - } -#endif - -#if LV_USE_SWITCH - else if(lv_obj_check_type(obj, &lv_switch_class)) { - lv_obj_add_style(obj, &theme->styles.bg_color_grey, 0); - lv_obj_add_style(obj, &theme->styles.circle, 0); - lv_obj_add_style(obj, &theme->styles.anim_fast, 0); - lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_INDICATOR | LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.circle, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_INDICATOR | LV_STATE_DISABLED); - lv_obj_add_style(obj, &theme->styles.knob, LV_PART_KNOB); - lv_obj_add_style(obj, &theme->styles.bg_color_white, LV_PART_KNOB); - lv_obj_add_style(obj, &theme->styles.switch_knob, LV_PART_KNOB); - lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_KNOB | LV_STATE_DISABLED); - - lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_INDICATOR | LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_INDICATOR); - } -#endif - -#if LV_USE_CHART - else if(lv_obj_check_type(obj, &lv_chart_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.pad_small, 0); - lv_obj_add_style(obj, &theme->styles.chart_bg, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - lv_obj_add_style(obj, &theme->styles.chart_series, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.chart_indic, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.chart_series, LV_PART_CURSOR); - } -#endif - -#if LV_USE_ROLLER - else if(lv_obj_check_type(obj, &lv_roller_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.anim, 0); - lv_obj_add_style(obj, &theme->styles.line_space_large, 0); - lv_obj_add_style(obj, &theme->styles.text_align_center, 0); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); - lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_SELECTED); - } -#endif - -#if LV_USE_DROPDOWN - else if(lv_obj_check_type(obj, &lv_dropdown_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.pad_small, 0); - lv_obj_add_style(obj, &theme->styles.transition_delayed, 0); - lv_obj_add_style(obj, &theme->styles.transition_normal, LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); - lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); - } - else if(lv_obj_check_type(obj, &lv_dropdownlist_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.clip_corner, 0); - lv_obj_add_style(obj, &theme->styles.line_space_large, 0); - lv_obj_add_style(obj, &theme->styles.dropdown_list, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - lv_obj_add_style(obj, &theme->styles.bg_color_white, LV_PART_SELECTED); - lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_SELECTED | LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_SELECTED | LV_STATE_PRESSED); - } -#endif - -#if LV_USE_ARC - else if(lv_obj_check_type(obj, &lv_arc_class)) { - lv_obj_add_style(obj, &theme->styles.arc_indic, 0); - lv_obj_add_style(obj, &theme->styles.arc_indic, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.arc_indic_primary, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.knob, LV_PART_KNOB); - } -#endif - -#if LV_USE_SPINNER - else if(lv_obj_check_type(obj, &lv_spinner_class)) { - lv_obj_add_style(obj, &theme->styles.arc_indic, 0); - lv_obj_add_style(obj, &theme->styles.arc_indic, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.arc_indic_primary, LV_PART_INDICATOR); - } -#endif - -#if LV_USE_TEXTAREA - else if(lv_obj_check_type(obj, &lv_textarea_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.pad_small, 0); - lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - lv_obj_add_style(obj, &theme->styles.ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED); - lv_obj_add_style(obj, &theme->styles.ta_placeholder, LV_PART_TEXTAREA_PLACEHOLDER); - } -#endif - -#if LV_USE_CALENDAR - else if(lv_obj_check_type(obj, &lv_calendar_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.pad_zero, 0); - } - -#if LV_USE_CALENDAR_HEADER_ARROW - else if(lv_obj_check_type(obj, &lv_calendar_header_arrow_class)) { - lv_obj_add_style(obj, &theme->styles.calendar_header, 0); - } -#endif - -#if LV_USE_CALENDAR_HEADER_DROPDOWN - else if(lv_obj_check_type(obj, &lv_calendar_header_dropdown_class)) { - lv_obj_add_style(obj, &theme->styles.calendar_header, 0); - } -#endif -#endif - -#if LV_USE_KEYBOARD - else if(lv_obj_check_type(obj, &lv_keyboard_class)) { - lv_obj_add_style(obj, &theme->styles.scr, 0); - lv_obj_add_style(obj, theme->disp_size == DISP_LARGE ? &theme->styles.pad_small : &theme->styles.pad_tiny, 0); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); - lv_obj_add_style(obj, &theme->styles.btn, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); - lv_obj_add_style(obj, &theme->styles.bg_color_white, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.keyboard_button_bg, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_ITEMS | LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.bg_color_grey, LV_PART_ITEMS | LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.bg_color_secondary_muted, LV_PART_ITEMS | LV_STATE_EDITED); - } -#endif -#if LV_USE_LIST - else if(lv_obj_check_type(obj, &lv_list_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.list_bg, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - return; - } - else if(lv_obj_check_type(obj, &lv_list_text_class)) { - lv_obj_add_style(obj, &theme->styles.bg_color_grey, 0); - lv_obj_add_style(obj, &theme->styles.list_item_grow, 0); - } - else if(lv_obj_check_type(obj, &lv_list_button_class)) { - lv_obj_add_style(obj, &theme->styles.bg_color_white, 0); - lv_obj_add_style(obj, &theme->styles.list_btn, 0); - lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.list_item_grow, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.list_item_grow, LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); - - } -#endif -#if LV_USE_MENU - else if(lv_obj_check_type(obj, &lv_menu_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.menu_bg, 0); - } - else if(lv_obj_check_type(obj, &lv_menu_sidebar_cont_class)) { - lv_obj_add_style(obj, &theme->styles.menu_sidebar_cont, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - } - else if(lv_obj_check_type(obj, &lv_menu_main_cont_class)) { - lv_obj_add_style(obj, &theme->styles.menu_main_cont, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - } - else if(lv_obj_check_type(obj, &lv_menu_cont_class)) { - lv_obj_add_style(obj, &theme->styles.menu_cont, 0); - lv_obj_add_style(obj, &theme->styles.menu_pressed, LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, LV_STATE_PRESSED | LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_STATE_FOCUS_KEY); - } - else if(lv_obj_check_type(obj, &lv_menu_sidebar_header_cont_class) || - lv_obj_check_type(obj, &lv_menu_main_header_cont_class)) { - lv_obj_add_style(obj, &theme->styles.menu_header_cont, 0); - } - else if(lv_obj_check_type(obj, &lv_menu_page_class)) { - lv_obj_add_style(obj, &theme->styles.menu_page, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - } - else if(lv_obj_check_type(obj, &lv_menu_section_class)) { - lv_obj_add_style(obj, &theme->styles.menu_section, 0); - } - else if(lv_obj_check_type(obj, &lv_menu_separator_class)) { - lv_obj_add_style(obj, &theme->styles.menu_separator, 0); - } -#endif -#if LV_USE_MSGBOX - else if(lv_obj_check_type(obj, &lv_msgbox_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.pad_zero, 0); - lv_obj_add_style(obj, &theme->styles.clip_corner, 0); - return; - } - else if(lv_obj_check_type(obj, &lv_msgbox_backdrop_class)) { - lv_obj_add_style(obj, &theme->styles.msgbox_backdrop_bg, 0); - return; - } - else if(lv_obj_check_type(obj, &lv_msgbox_header_class)) { - lv_obj_add_style(obj, &theme->styles.pad_tiny, 0); - lv_obj_add_style(obj, &theme->styles.bg_color_grey, 0); - return; - } - else if(lv_obj_check_type(obj, &lv_msgbox_footer_class)) { - lv_obj_add_style(obj, &theme->styles.pad_tiny, 0); - return; - } - else if(lv_obj_check_type(obj, &lv_msgbox_content_class)) { - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - lv_obj_add_style(obj, &theme->styles.pad_tiny, 0); - return; - } - else if(lv_obj_check_type(obj, &lv_msgbox_header_button_class) || - lv_obj_check_type(obj, &lv_msgbox_footer_button_class)) { - lv_obj_add_style(obj, &theme->styles.btn, 0); - lv_obj_add_style(obj, &theme->styles.bg_color_primary, 0); - lv_obj_add_style(obj, &theme->styles.transition_delayed, 0); - lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.transition_normal, LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.bg_color_secondary, LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); - return; - } - -#endif - -#if LV_USE_SPINBOX - else if(lv_obj_check_type(obj, &lv_spinbox_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.pad_small, 0); - lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); - lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_CURSOR); - } -#endif -#if LV_USE_TILEVIEW - else if(lv_obj_check_type(obj, &lv_tileview_class)) { - lv_obj_add_style(obj, &theme->styles.scr, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - } - else if(lv_obj_check_type(obj, &lv_tileview_tile_class)) { - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); - } -#endif - -#if LV_USE_TABVIEW - else if(lv_obj_check_type(obj, &lv_tabview_class)) { - lv_obj_add_style(obj, &theme->styles.scr, 0); - lv_obj_add_style(obj, &theme->styles.pad_zero, 0); - } -#endif - -#if LV_USE_WIN - else if(lv_obj_check_type(obj, &lv_win_class)) { - lv_obj_add_style(obj, &theme->styles.clip_corner, 0); - } -#endif - -#if LV_USE_LED - else if(lv_obj_check_type(obj, &lv_led_class)) { - lv_obj_add_style(obj, &theme->styles.led, 0); - } -#endif - -#if LV_USE_SCALE - else if(lv_obj_check_type(obj, &lv_scale_class)) { - lv_obj_add_style(obj, &theme->styles.scale, LV_PART_MAIN); - lv_obj_add_style(obj, &theme->styles.scale, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.scale, LV_PART_ITEMS); - } -#endif -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void style_init_reset(lv_style_t * style) -{ - if(theme_def->inited) { - lv_style_reset(style); - } - else { - lv_style_init(style); - } -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/themes/default/lv_theme_default.h b/software/Power_Pico/Middlewares/LVGL/src/themes/default/lv_theme_default.h deleted file mode 100644 index 72d9acb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/themes/default/lv_theme_default.h +++ /dev/null @@ -1,71 +0,0 @@ -/** - * @file lv_theme_default.h - * - */ - -#ifndef LV_THEME_DEFAULT_H -#define LV_THEME_DEFAULT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_theme.h" - -#if LV_USE_THEME_DEFAULT - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the theme - * @param disp pointer to display - * @param color_primary the primary color of the theme - * @param color_secondary the secondary color for the theme - * @param dark - * @param font pointer to a font to use. - * @return a pointer to reference this theme later - */ -lv_theme_t * lv_theme_default_init(lv_display_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, - const lv_font_t * font); - -/** - * Get default theme - * @return a pointer to default theme, or NULL if this is not initialized - */ -lv_theme_t * lv_theme_default_get(void); - -/** - * Check if default theme is initialized - * @return true if default theme is initialized, false otherwise - */ -bool lv_theme_default_is_inited(void); - -/** - * Deinitialize the default theme - */ -void lv_theme_default_deinit(void); - -/********************** - * MACROS - **********************/ - -#endif - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_THEME_DEFAULT_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/themes/lv_theme.c b/software/Power_Pico/Middlewares/LVGL/src/themes/lv_theme.c deleted file mode 100644 index 5dcd6c6..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/themes/lv_theme.c +++ /dev/null @@ -1,122 +0,0 @@ -/** - * @file lv_theme.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_theme_private.h" -#include "../core/lv_obj_private.h" -#include "../core/lv_obj_class_private.h" -#include "../../lvgl.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void apply_theme(lv_theme_t * th, lv_obj_t * obj); -static void apply_theme_recursion(lv_theme_t * th, lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_theme_t * lv_theme_get_from_obj(lv_obj_t * obj) -{ - lv_display_t * disp = obj ? lv_obj_get_display(obj) : lv_display_get_default(); - return lv_display_get_theme(disp); -} - -void lv_theme_apply(lv_obj_t * obj) -{ - lv_theme_t * th = lv_theme_get_from_obj(obj); - if(th == NULL) return; - - lv_obj_remove_style_all(obj); - - apply_theme_recursion(th, obj); /*Apply the theme including the base theme(s)*/ -} - -void lv_theme_set_parent(lv_theme_t * new_theme, lv_theme_t * base) -{ - new_theme->parent = base; -} - -void lv_theme_set_apply_cb(lv_theme_t * theme, lv_theme_apply_cb_t apply_cb) -{ - theme->apply_cb = apply_cb; -} - -const lv_font_t * lv_theme_get_font_small(lv_obj_t * obj) -{ - lv_theme_t * th = lv_theme_get_from_obj(obj); - return th ? th->font_small : LV_FONT_DEFAULT; -} - -const lv_font_t * lv_theme_get_font_normal(lv_obj_t * obj) -{ - lv_theme_t * th = lv_theme_get_from_obj(obj); - return th ? th->font_normal : LV_FONT_DEFAULT; -} - -const lv_font_t * lv_theme_get_font_large(lv_obj_t * obj) -{ - lv_theme_t * th = lv_theme_get_from_obj(obj); - return th ? th->font_large : LV_FONT_DEFAULT; -} - -lv_color_t lv_theme_get_color_primary(lv_obj_t * obj) -{ - lv_theme_t * th = lv_theme_get_from_obj(obj); - return th ? th->color_primary : lv_palette_main(LV_PALETTE_BLUE_GREY); -} - -lv_color_t lv_theme_get_color_secondary(lv_obj_t * obj) -{ - lv_theme_t * th = lv_theme_get_from_obj(obj); - return th ? th->color_secondary : lv_palette_main(LV_PALETTE_BLUE); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void apply_theme(lv_theme_t * th, lv_obj_t * obj) -{ - if(th->parent) apply_theme(th->parent, obj); - if(th->apply_cb) th->apply_cb(th, obj); -} - -static void apply_theme_recursion(lv_theme_t * th, lv_obj_t * obj) -{ - const lv_obj_class_t * original_class_p = obj->class_p; - - if(obj->class_p->base_class && obj->class_p->theme_inheritable == LV_OBJ_CLASS_THEME_INHERITABLE_TRUE) { - /*Apply the base class theme in obj*/ - obj->class_p = obj->class_p->base_class; - - /*apply the base first*/ - apply_theme_recursion(th, obj); - } - - /*Restore the original class*/ - obj->class_p = original_class_p; - - apply_theme(th, obj); -} diff --git a/software/Power_Pico/Middlewares/LVGL/src/themes/lv_theme.h b/software/Power_Pico/Middlewares/LVGL/src/themes/lv_theme.h deleted file mode 100644 index 21cb09b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/themes/lv_theme.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - *@file lv_theme.h - * - */ - -#ifndef LV_THEME_H -#define LV_THEME_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef void (*lv_theme_apply_cb_t)(lv_theme_t *, lv_obj_t *); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Get the theme assigned to the display of the object - * @param obj pointer to a theme object - * @return the theme of the object's display (can be NULL) - */ -lv_theme_t * lv_theme_get_from_obj(lv_obj_t * obj); - -/** - * Apply the active theme on an object - * @param obj pointer to an object - */ -void lv_theme_apply(lv_obj_t * obj); - -/** - * Set a base theme for a theme. - * The styles from the base them will be added before the styles of the current theme. - * Arbitrary long chain of themes can be created by setting base themes. - * @param new_theme pointer to theme which base should be set - * @param parent pointer to the base theme - */ -void lv_theme_set_parent(lv_theme_t * new_theme, lv_theme_t * parent); - -/** - * Set an apply callback for a theme. - * The apply callback is used to add styles to different objects - * @param theme pointer to theme which callback should be set - * @param apply_cb pointer to the callback - */ -void lv_theme_set_apply_cb(lv_theme_t * theme, lv_theme_apply_cb_t apply_cb); - -/** - * Get the small font of the theme - * @param obj pointer to an object - * @return pointer to the font - */ -const lv_font_t * lv_theme_get_font_small(lv_obj_t * obj); -/** - * Get the normal font of the theme - * @param obj pointer to an object - * @return pointer to the font - */ -const lv_font_t * lv_theme_get_font_normal(lv_obj_t * obj); - -/** - * Get the subtitle font of the theme - * @param obj pointer to an object - * @return pointer to the font - */ -const lv_font_t * lv_theme_get_font_large(lv_obj_t * obj); - -/** - * Get the primary color of the theme - * @param obj pointer to an object - * @return the color - */ -lv_color_t lv_theme_get_color_primary(lv_obj_t * obj); - -/** - * Get the secondary color of the theme - * @param obj pointer to an object - * @return the color - */ -lv_color_t lv_theme_get_color_secondary(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#include "default/lv_theme_default.h" -#include "mono/lv_theme_mono.h" -#include "simple/lv_theme_simple.h" - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_THEME_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/themes/lv_theme_private.h b/software/Power_Pico/Middlewares/LVGL/src/themes/lv_theme_private.h deleted file mode 100644 index 6fd10a5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/themes/lv_theme_private.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @file lv_theme_private.h - * - */ - -#ifndef LV_THEME_PRIVATE_H -#define LV_THEME_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_theme.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_theme_t { - lv_theme_apply_cb_t apply_cb; - lv_theme_t * parent; /**< Apply the current theme's style on top of this theme. */ - void * user_data; - lv_display_t * disp; - lv_color_t color_primary; - lv_color_t color_secondary; - const lv_font_t * font_small; - const lv_font_t * font_normal; - const lv_font_t * font_large; - uint32_t flags; /**< Any custom flag used by the theme */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_THEME_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/themes/mono/lv_theme_mono.c b/software/Power_Pico/Middlewares/LVGL/src/themes/mono/lv_theme_mono.c deleted file mode 100644 index cd71ecb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/themes/mono/lv_theme_mono.c +++ /dev/null @@ -1,532 +0,0 @@ -/** - * @file lv_theme_mono.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../lv_theme_private.h" -#include "../../../lvgl.h" - -#if LV_USE_THEME_MONO - -#include "lv_theme_mono.h" -#include "../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ -struct _my_theme_t; -typedef struct _my_theme_t my_theme_t; - -#define theme_def (*(my_theme_t **)(&LV_GLOBAL_DEFAULT()->theme_mono)) - -#define COLOR_FG dark_bg ? lv_color_white() : lv_color_black() -#define COLOR_BG dark_bg ? lv_color_black() : lv_color_white() - -#define BORDER_W_NORMAL 1 -#define BORDER_W_PR 3 -#define BORDER_W_DIS 0 -#define BORDER_W_FOCUS 1 -#define BORDER_W_EDIT 2 -#define PAD_DEF 4 - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_style_t scr; - lv_style_t card; - lv_style_t scrollbar; - lv_style_t pr; - lv_style_t inv; - lv_style_t disabled; - lv_style_t focus; - lv_style_t edit; - lv_style_t pad_gap; - lv_style_t pad_zero; - lv_style_t no_radius; - lv_style_t radius_circle; - lv_style_t large_border; - lv_style_t large_line_space; - lv_style_t underline; -#if LV_USE_TEXTAREA - lv_style_t ta_cursor; -#endif -#if LV_USE_CHART - lv_style_t chart_indic; -#endif -} my_theme_styles_t; - -struct _my_theme_t { - lv_theme_t base; - my_theme_styles_t styles; - bool inited; -}; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void style_init_reset(lv_style_t * style); -static void theme_apply(lv_theme_t * th, lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void style_init(my_theme_t * theme, bool dark_bg, const lv_font_t * font) -{ - style_init_reset(&theme->styles.scrollbar); - lv_style_set_bg_opa(&theme->styles.scrollbar, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.scrollbar, COLOR_FG); - lv_style_set_width(&theme->styles.scrollbar, PAD_DEF); - - style_init_reset(&theme->styles.scr); - lv_style_set_bg_opa(&theme->styles.scr, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.scr, COLOR_BG); - lv_style_set_text_color(&theme->styles.scr, COLOR_FG); - lv_style_set_pad_row(&theme->styles.scr, PAD_DEF); - lv_style_set_pad_column(&theme->styles.scr, PAD_DEF); - lv_style_set_text_font(&theme->styles.scr, font); - - style_init_reset(&theme->styles.card); - lv_style_set_bg_opa(&theme->styles.card, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.card, COLOR_BG); - lv_style_set_border_color(&theme->styles.card, COLOR_FG); - lv_style_set_radius(&theme->styles.card, 2); - lv_style_set_border_width(&theme->styles.card, BORDER_W_NORMAL); - lv_style_set_pad_all(&theme->styles.card, PAD_DEF); - lv_style_set_pad_gap(&theme->styles.card, PAD_DEF); - lv_style_set_text_color(&theme->styles.card, COLOR_FG); - lv_style_set_line_width(&theme->styles.card, 2); - lv_style_set_line_color(&theme->styles.card, COLOR_FG); - lv_style_set_arc_width(&theme->styles.card, 2); - lv_style_set_arc_color(&theme->styles.card, COLOR_FG); - lv_style_set_outline_color(&theme->styles.card, COLOR_FG); - lv_style_set_anim_duration(&theme->styles.card, 300); - - style_init_reset(&theme->styles.pr); - lv_style_set_border_width(&theme->styles.pr, BORDER_W_PR); - - style_init_reset(&theme->styles.inv); - lv_style_set_bg_opa(&theme->styles.inv, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.inv, COLOR_FG); - lv_style_set_border_color(&theme->styles.inv, COLOR_BG); - lv_style_set_line_color(&theme->styles.inv, COLOR_BG); - lv_style_set_arc_color(&theme->styles.inv, COLOR_BG); - lv_style_set_text_color(&theme->styles.inv, COLOR_BG); - lv_style_set_outline_color(&theme->styles.inv, COLOR_BG); - - style_init_reset(&theme->styles.disabled); - lv_style_set_border_width(&theme->styles.disabled, BORDER_W_DIS); - - style_init_reset(&theme->styles.focus); - lv_style_set_outline_width(&theme->styles.focus, 1); - lv_style_set_outline_pad(&theme->styles.focus, BORDER_W_FOCUS); - - style_init_reset(&theme->styles.edit); - lv_style_set_outline_width(&theme->styles.edit, BORDER_W_EDIT); - - style_init_reset(&theme->styles.large_border); - lv_style_set_border_width(&theme->styles.large_border, BORDER_W_EDIT); - - style_init_reset(&theme->styles.pad_gap); - lv_style_set_pad_gap(&theme->styles.pad_gap, PAD_DEF); - - style_init_reset(&theme->styles.pad_zero); - lv_style_set_pad_all(&theme->styles.pad_zero, 0); - lv_style_set_pad_gap(&theme->styles.pad_zero, 0); - - style_init_reset(&theme->styles.no_radius); - lv_style_set_radius(&theme->styles.no_radius, 0); - - style_init_reset(&theme->styles.radius_circle); - lv_style_set_radius(&theme->styles.radius_circle, LV_RADIUS_CIRCLE); - - style_init_reset(&theme->styles.large_line_space); - lv_style_set_text_line_space(&theme->styles.large_line_space, 6); - - style_init_reset(&theme->styles.underline); - lv_style_set_text_decor(&theme->styles.underline, LV_TEXT_DECOR_UNDERLINE); - -#if LV_USE_TEXTAREA - style_init_reset(&theme->styles.ta_cursor); - lv_style_set_border_side(&theme->styles.ta_cursor, LV_BORDER_SIDE_LEFT); - lv_style_set_border_color(&theme->styles.ta_cursor, COLOR_FG); - lv_style_set_border_width(&theme->styles.ta_cursor, 2); - lv_style_set_bg_opa(&theme->styles.ta_cursor, LV_OPA_TRANSP); - lv_style_set_anim_duration(&theme->styles.ta_cursor, 500); -#endif - -#if LV_USE_CHART - style_init_reset(&theme->styles.chart_indic); - lv_style_set_radius(&theme->styles.chart_indic, LV_RADIUS_CIRCLE); - lv_style_set_size(&theme->styles.chart_indic, lv_display_dpx(theme->base.disp, 8), lv_display_dpx(theme->base.disp, 8)); - lv_style_set_bg_color(&theme->styles.chart_indic, COLOR_FG); - lv_style_set_bg_opa(&theme->styles.chart_indic, LV_OPA_COVER); -#endif -} - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -bool lv_theme_mono_is_inited(void) -{ - my_theme_t * theme = theme_def; - if(theme == NULL) return false; - return theme->inited; -} - -void lv_theme_mono_deinit(void) -{ - my_theme_t * theme = theme_def; - if(theme) { - if(theme->inited) { - lv_style_t * theme_styles = (lv_style_t *)(&(theme->styles)); - uint32_t i; - for(i = 0; i < sizeof(my_theme_styles_t) / sizeof(lv_style_t); i++) { - lv_style_reset(theme_styles + i); - } - } - lv_free(theme_def); - theme_def = NULL; - } -} - -lv_theme_t * lv_theme_mono_init(lv_display_t * disp, bool dark_bg, const lv_font_t * font) -{ - /*This trick is required only to avoid the garbage collection of - *styles' data if LVGL is used in a binding (e.g. MicroPython) - *In a general case styles could be in simple `static lv_style_t my_style...` variables*/ - if(!lv_theme_mono_is_inited()) { - theme_def = lv_malloc_zeroed(sizeof(my_theme_t)); - } - - my_theme_t * theme = theme_def; - - theme->base.disp = disp; - theme->base.font_small = LV_FONT_DEFAULT; - theme->base.font_normal = LV_FONT_DEFAULT; - theme->base.font_large = LV_FONT_DEFAULT; - theme->base.apply_cb = theme_apply; - - style_init(theme, dark_bg, font); - - if(disp == NULL || lv_display_get_theme(disp) == (lv_theme_t *) theme) lv_obj_report_style_change(NULL); - - theme->inited = true; - - return (lv_theme_t *)theme_def; -} - -static void theme_apply(lv_theme_t * th, lv_obj_t * obj) -{ - LV_UNUSED(th); - - my_theme_t * theme = theme_def; - lv_obj_t * parent = lv_obj_get_parent(obj); - - if(parent == NULL) { - lv_obj_add_style(obj, &theme->styles.scr, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - return; - } - - if(lv_obj_check_type(obj, &lv_obj_class)) { -#if LV_USE_TABVIEW - /*Tabview content area*/ - if(lv_obj_check_type(parent, &lv_tabview_class)) { - return; - } - /*Tabview pages*/ - else if(lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.no_radius, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - return; - } -#endif - -#if LV_USE_WIN - /*Header*/ - if(lv_obj_check_type(parent, &lv_win_class) && lv_obj_get_child(parent, 0) == 0) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.no_radius, 0); - return; - } - /*Content*/ - else if(lv_obj_check_type(parent, &lv_win_class) && lv_obj_get_child(parent, 1) == obj) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.no_radius, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - return; - } -#endif - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - } -#if LV_USE_BUTTON - else if(lv_obj_check_type(obj, &lv_button_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.pr, LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.inv, LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); - } -#endif - -#if LV_USE_BUTTONMATRIX - else if(lv_obj_check_type(obj, &lv_buttonmatrix_class)) { -#if LV_USE_MSGBOX - if(lv_obj_check_type(parent, &lv_msgbox_class)) { - lv_obj_add_style(obj, &theme->styles.pad_gap, 0); - lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); - lv_obj_add_style(obj, &theme->styles.underline, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); - return; - } -#endif -#if LV_USE_TABVIEW - if(lv_obj_check_type(parent, &lv_tabview_class)) { - lv_obj_add_style(obj, &theme->styles.pad_gap, 0); - lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.inv, LV_PART_ITEMS | LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.underline, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); - return; - } -#endif - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.inv, LV_PART_ITEMS | LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); - lv_obj_add_style(obj, &theme->styles.underline, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); - } -#endif - -#if LV_USE_BAR - else if(lv_obj_check_type(obj, &lv_bar_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.pad_zero, 0); - lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - } -#endif - -#if LV_USE_SLIDER - else if(lv_obj_check_type(obj, &lv_slider_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.pad_zero, 0); - lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.card, LV_PART_KNOB); - lv_obj_add_style(obj, &theme->styles.radius_circle, LV_PART_KNOB); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); - } -#endif - -#if LV_USE_TABLE - else if(lv_obj_check_type(obj, &lv_table_class)) { - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.no_radius, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.inv, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); - } -#endif - -#if LV_USE_CHECKBOX - else if(lv_obj_check_type(obj, &lv_checkbox_class)) { - lv_obj_add_style(obj, &theme->styles.pad_gap, LV_PART_MAIN); - lv_obj_add_style(obj, &theme->styles.card, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_INDICATOR | LV_STATE_DISABLED); - lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR | LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.pr, LV_PART_INDICATOR | LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); - } -#endif - -#if LV_USE_SWITCH - else if(lv_obj_check_type(obj, &lv_switch_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.radius_circle, 0); - lv_obj_add_style(obj, &theme->styles.pad_zero, 0); - lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.radius_circle, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.card, LV_PART_KNOB); - lv_obj_add_style(obj, &theme->styles.radius_circle, LV_PART_KNOB); - lv_obj_add_style(obj, &theme->styles.pad_zero, LV_PART_KNOB); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); - } -#endif - -#if LV_USE_CHART - else if(lv_obj_check_type(obj, &lv_chart_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.chart_indic, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.card, LV_PART_CURSOR); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - } -#endif - -#if LV_USE_ROLLER - else if(lv_obj_check_type(obj, &lv_roller_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.large_line_space, 0); - lv_obj_add_style(obj, &theme->styles.inv, LV_PART_SELECTED); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); - } -#endif - -#if LV_USE_DROPDOWN - else if(lv_obj_check_type(obj, &lv_dropdown_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.pr, LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); - } - else if(lv_obj_check_type(obj, &lv_dropdownlist_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.large_line_space, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.inv, LV_PART_SELECTED | LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.pr, LV_PART_SELECTED | LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); - } -#endif - -#if LV_USE_ARC - else if(lv_obj_check_type(obj, &lv_arc_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.pad_zero, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.card, LV_PART_KNOB); - lv_obj_add_style(obj, &theme->styles.radius_circle, LV_PART_KNOB); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); - } -#endif - -#if LV_USE_TEXTAREA - else if(lv_obj_check_type(obj, &lv_textarea_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUSED); - lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); - } -#endif - -#if LV_USE_CALENDAR - else if(lv_obj_check_type(obj, &lv_calendar_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.no_radius, 0); - lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); - lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); - } -#endif - -#if LV_USE_KEYBOARD - else if(lv_obj_check_type(obj, &lv_keyboard_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.inv, LV_PART_ITEMS | LV_STATE_CHECKED); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); - lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_EDITED); - } -#endif -#if LV_USE_LIST - else if(lv_obj_check_type(obj, &lv_list_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - return; - } - else if(lv_obj_check_type(obj, &lv_list_text_class)) { - - } - else if(lv_obj_check_type(obj, &lv_list_button_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.pr, LV_STATE_PRESSED); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.large_border, LV_STATE_EDITED); - - } -#endif -#if LV_USE_MSGBOX - else if(lv_obj_check_type(obj, &lv_msgbox_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - return; - } -#endif -#if LV_USE_SPINBOX - else if(lv_obj_check_type(obj, &lv_spinbox_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - lv_obj_add_style(obj, &theme->styles.inv, LV_PART_CURSOR); - lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); - } -#endif -#if LV_USE_TILEVIEW - else if(lv_obj_check_type(obj, &lv_tileview_class)) { - lv_obj_add_style(obj, &theme->styles.scr, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - } - else if(lv_obj_check_type(obj, &lv_tileview_tile_class)) { - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - } -#endif - -#if LV_USE_LED - else if(lv_obj_check_type(obj, &lv_led_class)) { - lv_obj_add_style(obj, &theme->styles.card, 0); - } -#endif -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void style_init_reset(lv_style_t * style) -{ - if(lv_theme_mono_is_inited()) { - lv_style_reset(style); - } - else { - lv_style_init(style); - } -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/themes/mono/lv_theme_mono.h b/software/Power_Pico/Middlewares/LVGL/src/themes/mono/lv_theme_mono.h deleted file mode 100644 index 30ac4c4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/themes/mono/lv_theme_mono.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @file lv_theme_mono.h - * - */ - -#ifndef LV_THEME_MONO_H -#define LV_THEME_MONO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_theme.h" - -#if LV_USE_THEME_MONO - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the theme - * @param disp pointer to display - * @param dark_bg - * @param font pointer to a font to use. - * @return a pointer to reference this theme later - */ -lv_theme_t * lv_theme_mono_init(lv_display_t * disp, bool dark_bg, const lv_font_t * font); - -/** -* Check if the theme is initialized -* @return true if default theme is initialized, false otherwise -*/ -bool lv_theme_mono_is_inited(void); - -/** - * Deinitialize the mono theme - */ -void lv_theme_mono_deinit(void); - -/********************** - * MACROS - **********************/ - -#endif - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /* LV_THEME_MONO_H */ diff --git a/software/Power_Pico/Middlewares/LVGL/src/themes/simple/lv_theme_simple.c b/software/Power_Pico/Middlewares/LVGL/src/themes/simple/lv_theme_simple.c deleted file mode 100644 index 8a32555..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/themes/simple/lv_theme_simple.c +++ /dev/null @@ -1,438 +0,0 @@ -/** - * @file lv_theme_simple.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../lv_theme_private.h" -#include "../../../lvgl.h" /*To see all the widgets*/ - -#if LV_USE_THEME_SIMPLE - -#include "lv_theme_simple.h" -#include "../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ - -struct _my_theme_t; -typedef struct _my_theme_t my_theme_t; - -#define theme_def (*(my_theme_t **)(&LV_GLOBAL_DEFAULT()->theme_simple)) - -#define COLOR_SCR lv_palette_lighten(LV_PALETTE_GREY, 4) -#define COLOR_WHITE lv_color_white() -#define COLOR_LIGHT lv_palette_lighten(LV_PALETTE_GREY, 2) -#define COLOR_DARK lv_palette_main(LV_PALETTE_GREY) -#define COLOR_DIM lv_palette_darken(LV_PALETTE_GREY, 2) -#define SCROLLBAR_WIDTH 2 - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_style_t scr; - lv_style_t transp; - lv_style_t white; - lv_style_t light; - lv_style_t dark; - lv_style_t dim; - lv_style_t scrollbar; -#if LV_USE_ARC - lv_style_t arc_line; - lv_style_t arc_knob; -#endif -#if LV_USE_TEXTAREA - lv_style_t ta_cursor; -#endif -} my_theme_styles_t; - -struct _my_theme_t { - lv_theme_t base; - my_theme_styles_t styles; - bool inited; -}; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void style_init_reset(lv_style_t * style); -static void theme_apply(lv_theme_t * th, lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void style_init(my_theme_t * theme) -{ - style_init_reset(&theme->styles.scrollbar); - lv_style_set_bg_opa(&theme->styles.scrollbar, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.scrollbar, COLOR_DARK); - lv_style_set_width(&theme->styles.scrollbar, SCROLLBAR_WIDTH); - - style_init_reset(&theme->styles.scr); - lv_style_set_bg_opa(&theme->styles.scr, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.scr, COLOR_SCR); - lv_style_set_text_color(&theme->styles.scr, COLOR_DIM); - - style_init_reset(&theme->styles.transp); - lv_style_set_bg_opa(&theme->styles.transp, LV_OPA_TRANSP); - - style_init_reset(&theme->styles.white); - lv_style_set_bg_opa(&theme->styles.white, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.white, COLOR_WHITE); - lv_style_set_line_width(&theme->styles.white, 1); - lv_style_set_line_color(&theme->styles.white, COLOR_WHITE); - lv_style_set_arc_width(&theme->styles.white, 2); - lv_style_set_arc_color(&theme->styles.white, COLOR_WHITE); - - style_init_reset(&theme->styles.light); - lv_style_set_bg_opa(&theme->styles.light, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.light, COLOR_LIGHT); - lv_style_set_line_width(&theme->styles.light, 1); - lv_style_set_line_color(&theme->styles.light, COLOR_LIGHT); - lv_style_set_arc_width(&theme->styles.light, 2); - lv_style_set_arc_color(&theme->styles.light, COLOR_LIGHT); - - style_init_reset(&theme->styles.dark); - lv_style_set_bg_opa(&theme->styles.dark, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.dark, COLOR_DARK); - lv_style_set_line_width(&theme->styles.dark, 1); - lv_style_set_line_color(&theme->styles.dark, COLOR_DARK); - lv_style_set_arc_width(&theme->styles.dark, 2); - lv_style_set_arc_color(&theme->styles.dark, COLOR_DARK); - - style_init_reset(&theme->styles.dim); - lv_style_set_bg_opa(&theme->styles.dim, LV_OPA_COVER); - lv_style_set_bg_color(&theme->styles.dim, COLOR_DIM); - lv_style_set_line_width(&theme->styles.dim, 1); - lv_style_set_line_color(&theme->styles.dim, COLOR_DIM); - lv_style_set_arc_width(&theme->styles.dim, 2); - lv_style_set_arc_color(&theme->styles.dim, COLOR_DIM); - -#if LV_USE_ARC - style_init_reset(&theme->styles.arc_line); - lv_style_set_arc_width(&theme->styles.arc_line, 6); - style_init_reset(&theme->styles.arc_knob); - lv_style_set_pad_all(&theme->styles.arc_knob, 5); -#endif - -#if LV_USE_TEXTAREA - style_init_reset(&theme->styles.ta_cursor); - lv_style_set_border_side(&theme->styles.ta_cursor, LV_BORDER_SIDE_LEFT); - lv_style_set_border_color(&theme->styles.ta_cursor, COLOR_DIM); - lv_style_set_border_width(&theme->styles.ta_cursor, 2); - lv_style_set_bg_opa(&theme->styles.ta_cursor, LV_OPA_TRANSP); - lv_style_set_anim_duration(&theme->styles.ta_cursor, 500); -#endif -} - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -bool lv_theme_simple_is_inited(void) -{ - my_theme_t * theme = theme_def; - if(theme == NULL) return false; - return theme->inited; -} - -lv_theme_t * lv_theme_simple_get(void) -{ - if(!lv_theme_simple_is_inited()) { - return NULL; - } - - return (lv_theme_t *)theme_def; -} - -void lv_theme_simple_deinit(void) -{ - my_theme_t * theme = theme_def; - if(theme) { - if(theme->inited) { - lv_style_t * theme_styles = (lv_style_t *)(&(theme->styles)); - uint32_t i; - for(i = 0; i < sizeof(my_theme_styles_t) / sizeof(lv_style_t); i++) { - lv_style_reset(theme_styles + i); - } - } - lv_free(theme_def); - theme_def = NULL; - } -} - -lv_theme_t * lv_theme_simple_init(lv_display_t * disp) -{ - /*This trick is required only to avoid the garbage collection of - *styles' data if LVGL is used in a binding (e.g. MicroPython) - *In a general case styles could be in simple `static lv_style_t my_style...` variables*/ - if(!lv_theme_simple_is_inited()) { - theme_def = lv_malloc_zeroed(sizeof(my_theme_t)); - } - - my_theme_t * theme = theme_def; - - theme->base.disp = disp; - theme->base.font_small = LV_FONT_DEFAULT; - theme->base.font_normal = LV_FONT_DEFAULT; - theme->base.font_large = LV_FONT_DEFAULT; - theme->base.apply_cb = theme_apply; - - style_init(theme); - - if(disp == NULL || lv_display_get_theme(disp) == (lv_theme_t *)theme) { - lv_obj_report_style_change(NULL); - } - - theme->inited = true; - - return (lv_theme_t *)theme_def; -} - -static void theme_apply(lv_theme_t * th, lv_obj_t * obj) -{ - LV_UNUSED(th); - - my_theme_t * theme = theme_def; - lv_obj_t * parent = lv_obj_get_parent(obj); - - if(parent == NULL) { - lv_obj_add_style(obj, &theme->styles.scr, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - return; - } - - if(lv_obj_check_type(obj, &lv_obj_class)) { -#if LV_USE_TABVIEW - /*Tabview content area*/ - if(lv_obj_check_type(parent, &lv_tabview_class)) { - lv_obj_add_style(obj, &theme->styles.scr, 0); - return; - } - /*Tabview pages*/ - else if(lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) { - lv_obj_add_style(obj, &theme->styles.scr, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - return; - } -#endif - -#if LV_USE_WIN - /*Header*/ - if(lv_obj_check_type(parent, &lv_win_class) && lv_obj_get_child(parent, 0) == obj) { - lv_obj_add_style(obj, &theme->styles.light, 0); - return; - } - /*Content*/ - else if(lv_obj_check_type(parent, &lv_win_class) && lv_obj_get_child(parent, 1) == obj) { - lv_obj_add_style(obj, &theme->styles.light, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - return; - } -#endif - lv_obj_add_style(obj, &theme->styles.white, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - } -#if LV_USE_BUTTON - else if(lv_obj_check_type(obj, &lv_button_class)) { - lv_obj_add_style(obj, &theme->styles.dark, 0); - } -#endif - -#if LV_USE_BUTTONMATRIX - else if(lv_obj_check_type(obj, &lv_buttonmatrix_class)) { -#if LV_USE_MSGBOX - if(lv_obj_check_type(parent, &lv_msgbox_class)) { - lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); - return; - } -#endif -#if LV_USE_TABVIEW - if(lv_obj_check_type(parent, &lv_tabview_class)) { - lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); - return; - } -#endif - lv_obj_add_style(obj, &theme->styles.white, 0); - lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); - } -#endif - -#if LV_USE_BAR - else if(lv_obj_check_type(obj, &lv_bar_class)) { - lv_obj_add_style(obj, &theme->styles.light, 0); - lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR); - } -#endif - -#if LV_USE_SLIDER - else if(lv_obj_check_type(obj, &lv_slider_class)) { - lv_obj_add_style(obj, &theme->styles.light, 0); - lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.dim, LV_PART_KNOB); - } -#endif - -#if LV_USE_TABLE - else if(lv_obj_check_type(obj, &lv_table_class)) { - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); - } -#endif - -#if LV_USE_CHECKBOX - else if(lv_obj_check_type(obj, &lv_checkbox_class)) { - lv_obj_add_style(obj, &theme->styles.light, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR | LV_STATE_CHECKED); - } -#endif - -#if LV_USE_SWITCH - else if(lv_obj_check_type(obj, &lv_switch_class)) { - lv_obj_add_style(obj, &theme->styles.light, 0); - lv_obj_add_style(obj, &theme->styles.dim, LV_PART_KNOB); - } -#endif - -#if LV_USE_CHART - else if(lv_obj_check_type(obj, &lv_chart_class)) { - lv_obj_add_style(obj, &theme->styles.white, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.dark, LV_PART_CURSOR); - } -#endif - -#if LV_USE_ROLLER - else if(lv_obj_check_type(obj, &lv_roller_class)) { - lv_obj_add_style(obj, &theme->styles.light, 0); - lv_obj_add_style(obj, &theme->styles.dark, LV_PART_SELECTED); - } -#endif - -#if LV_USE_DROPDOWN - else if(lv_obj_check_type(obj, &lv_dropdown_class)) { - lv_obj_add_style(obj, &theme->styles.white, 0); - } - else if(lv_obj_check_type(obj, &lv_dropdownlist_class)) { - lv_obj_add_style(obj, &theme->styles.white, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.light, LV_PART_SELECTED); - lv_obj_add_style(obj, &theme->styles.dark, LV_PART_SELECTED | LV_STATE_CHECKED); - } -#endif - -#if LV_USE_ARC - else if(lv_obj_check_type(obj, &lv_arc_class)) { - lv_obj_add_style(obj, &theme->styles.light, 0); - lv_obj_add_style(obj, &theme->styles.transp, 0); - lv_obj_add_style(obj, &theme->styles.arc_line, 0); - lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.arc_line, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.dim, LV_PART_KNOB); - lv_obj_add_style(obj, &theme->styles.arc_knob, LV_PART_KNOB); - } -#endif - -#if LV_USE_SPINNER - else if(lv_obj_check_type(obj, &lv_spinner_class)) { - lv_obj_add_style(obj, &theme->styles.light, 0); - lv_obj_add_style(obj, &theme->styles.transp, 0); - lv_obj_add_style(obj, &theme->styles.arc_line, 0); - lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR); - lv_obj_add_style(obj, &theme->styles.arc_line, LV_PART_INDICATOR); - } -#endif - -#if LV_USE_TEXTAREA - else if(lv_obj_check_type(obj, &lv_textarea_class)) { - lv_obj_add_style(obj, &theme->styles.white, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - lv_obj_add_style(obj, &theme->styles.ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED); - } -#endif - -#if LV_USE_CALENDAR - else if(lv_obj_check_type(obj, &lv_calendar_class)) { - lv_obj_add_style(obj, &theme->styles.light, 0); - } -#endif - -#if LV_USE_KEYBOARD - else if(lv_obj_check_type(obj, &lv_keyboard_class)) { - lv_obj_add_style(obj, &theme->styles.scr, 0); - lv_obj_add_style(obj, &theme->styles.white, LV_PART_ITEMS); - lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS | LV_STATE_CHECKED); - } -#endif -#if LV_USE_LIST - else if(lv_obj_check_type(obj, &lv_list_class)) { - lv_obj_add_style(obj, &theme->styles.light, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - return; - } - else if(lv_obj_check_type(obj, &lv_list_text_class)) { - - } - else if(lv_obj_check_type(obj, &lv_list_button_class)) { - lv_obj_add_style(obj, &theme->styles.dark, 0); - - } -#endif -#if LV_USE_MSGBOX - else if(lv_obj_check_type(obj, &lv_msgbox_class)) { - lv_obj_add_style(obj, &theme->styles.light, 0); - return; - } -#endif -#if LV_USE_SPINBOX - else if(lv_obj_check_type(obj, &lv_spinbox_class)) { - lv_obj_add_style(obj, &theme->styles.light, 0); - lv_obj_add_style(obj, &theme->styles.dark, LV_PART_CURSOR); - } -#endif -#if LV_USE_TILEVIEW - else if(lv_obj_check_type(obj, &lv_tileview_class)) { - lv_obj_add_style(obj, &theme->styles.scr, 0); - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - } - else if(lv_obj_check_type(obj, &lv_tileview_tile_class)) { - lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); - } -#endif - -#if LV_USE_LED - else if(lv_obj_check_type(obj, &lv_led_class)) { - lv_obj_add_style(obj, &theme->styles.light, 0); - } -#endif -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void style_init_reset(lv_style_t * style) -{ - if(lv_theme_simple_is_inited()) { - lv_style_reset(style); - } - else { - lv_style_init(style); - } -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/themes/simple/lv_theme_simple.h b/software/Power_Pico/Middlewares/LVGL/src/themes/simple/lv_theme_simple.h deleted file mode 100644 index 6717366..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/themes/simple/lv_theme_simple.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @file lv_theme_simple.h - * - */ - -#ifndef LV_THEME_SIMPLE_H -#define LV_THEME_SIMPLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_theme.h" -#include "../../display/lv_display.h" - -#if LV_USE_THEME_SIMPLE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the theme - * @param disp pointer to display to attach the theme - * @return a pointer to reference this theme later - */ -lv_theme_t * lv_theme_simple_init(lv_display_t * disp); - -/** -* Check if the theme is initialized -* @return true if default theme is initialized, false otherwise -*/ -bool lv_theme_simple_is_inited(void); - -/** - * Get simple theme - * @return a pointer to simple theme, or NULL if this is not initialized - */ -lv_theme_t * lv_theme_simple_get(void); - -/** - * Deinitialize the simple theme - */ -void lv_theme_simple_deinit(void); - -/********************** - * MACROS - **********************/ - -#endif - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_THEME_SIMPLE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/tick/lv_tick.c b/software/Power_Pico/Middlewares/LVGL/src/tick/lv_tick.c deleted file mode 100644 index 21e2295..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/tick/lv_tick.c +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @file lv_tick.c - * Provide access to the system tick with 1 millisecond resolution - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_tick_private.h" -#include "../misc/lv_types.h" -#include "../core/lv_global.h" - -/********************* - * DEFINES - *********************/ -#define state LV_GLOBAL_DEFAULT()->tick_state - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period) -{ - lv_tick_state_t * state_p = &state; - - state_p->sys_irq_flag = 0; - state_p->sys_time += tick_period; -} - -uint32_t lv_tick_get(void) -{ - lv_tick_state_t * state_p = &state; - - if(state_p->tick_get_cb) - return state_p->tick_get_cb(); - - /*If `lv_tick_inc` is called from an interrupt while `sys_time` is read - *the result might be corrupted. - *This loop detects if `lv_tick_inc` was called while reading `sys_time`. - *If `tick_irq_flag` was cleared in `lv_tick_inc` try to read again - *until `tick_irq_flag` remains `1`.*/ - uint32_t result; - do { - state_p->sys_irq_flag = 1; - result = state_p->sys_time; - } while(!state_p->sys_irq_flag); /*Continue until see a non interrupted cycle*/ - - return result; -} - -uint32_t lv_tick_elaps(uint32_t prev_tick) -{ - uint32_t act_time = lv_tick_get(); - - /*If there is no overflow in sys_time simple subtract*/ - if(act_time >= prev_tick) { - prev_tick = act_time - prev_tick; - } - else { - prev_tick = UINT32_MAX - prev_tick + 1; - prev_tick += act_time; - } - - return prev_tick; -} - -void lv_delay_ms(uint32_t ms) -{ - if(state.delay_cb) { - state.delay_cb(ms); - } - else { - uint32_t t = lv_tick_get(); - while(lv_tick_elaps(t) < ms) { - /*Do something to no call `lv_tick_elaps` too often as it might interfere with interrupts*/ - volatile uint32_t i; - volatile uint32_t x = ms; - for(i = 0; i < 100; i++) { - x = x * 3; - } - } - } -} - -void lv_tick_set_cb(lv_tick_get_cb_t cb) -{ - state.tick_get_cb = cb; -} - -void lv_delay_set_cb(lv_delay_cb_t cb) -{ - state.delay_cb = cb; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/tick/lv_tick.h b/software/Power_Pico/Middlewares/LVGL/src/tick/lv_tick.h deleted file mode 100644 index 048b93a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/tick/lv_tick.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * @file lv_tick.h - * Provide access to the system tick with 1 millisecond resolution - */ - -#ifndef LV_TICK_H -#define LV_TICK_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" - -#include "../misc/lv_types.h" - -/********************* - * DEFINES - *********************/ -#ifndef LV_ATTRIBUTE_TICK_INC -#define LV_ATTRIBUTE_TICK_INC -#endif - -/********************** - * TYPEDEFS - **********************/ -typedef uint32_t (*lv_tick_get_cb_t)(void); - -typedef void (*lv_delay_cb_t)(uint32_t ms); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * You have to call this function periodically - * @param tick_period the call period of this function in milliseconds - */ -LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period); - -/** - * Get the elapsed milliseconds since start up - * @return the elapsed milliseconds - */ -uint32_t lv_tick_get(void); - -/** - * Get the elapsed milliseconds since a previous time stamp - * @param prev_tick a previous time stamp (return value of lv_tick_get() ) - * @return the elapsed milliseconds since 'prev_tick' - */ -uint32_t lv_tick_elaps(uint32_t prev_tick); - -/** - * Delay for the given milliseconds. - * By default it's a blocking delay, but with `lv_delay_set_cb()` - * a custom delay function can be set too - * @param ms the number of milliseconds to delay - */ -void lv_delay_ms(uint32_t ms); - -/** - * Set the custom callback for 'lv_tick_get' - * @param cb call this callback on 'lv_tick_get' - */ -void lv_tick_set_cb(lv_tick_get_cb_t cb); - -/** - * Set a custom callback for 'lv_delay_ms' - * @param cb call this callback in 'lv_delay_ms' - */ -void lv_delay_set_cb(lv_delay_cb_t cb); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TICK_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/tick/lv_tick_private.h b/software/Power_Pico/Middlewares/LVGL/src/tick/lv_tick_private.h deleted file mode 100644 index cf8ae9b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/tick/lv_tick_private.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @file lv_tick_private.h - * - */ - -#ifndef LV_TICK_PRIVATE_H -#define LV_TICK_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_tick.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - uint32_t sys_time; - volatile uint8_t sys_irq_flag; - lv_tick_get_cb_t tick_get_cb; - lv_delay_cb_t delay_cb; -} lv_tick_state_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TICK_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/animimage/lv_animimage.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/animimage/lv_animimage.c deleted file mode 100644 index 548c48c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/animimage/lv_animimage.c +++ /dev/null @@ -1,181 +0,0 @@ -/** - * @file lv_animimg.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_animimage_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_ANIMIMG != 0 - -/*Testing of dependencies*/ -#if LV_USE_IMAGE == 0 - #error "lv_animimg: lv_img is required. Enable it in lv_conf.h (LV_USE_IMAGE 1) " -#endif - -#include "../../draw/lv_image_decoder.h" -#include "../../misc/lv_assert.h" -#include "../../misc/lv_fs.h" -#include "../../misc/lv_text.h" -#include "../../misc/lv_math.h" -#include "../../misc/lv_log.h" -#include "../../misc/lv_anim.h" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_animimg" - -#define MY_CLASS (&lv_animimg_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void index_change(lv_obj_t * obj, int32_t idx); -static void lv_animimg_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_animimg_class = { - .constructor_cb = lv_animimg_constructor, - .instance_size = sizeof(lv_animimg_t), - .base_class = &lv_image_class, - .name = "animimg", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_animimg_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(&lv_animimg_class, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -void lv_animimg_set_src(lv_obj_t * obj, const void * dsc[], size_t num) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_animimg_t * animimg = (lv_animimg_t *)obj; - animimg->dsc = dsc; - animimg->pic_count = num; - lv_anim_set_values(&animimg->anim, 0, (int32_t)num); -} - -void lv_animimg_start(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_animimg_t * animimg = (lv_animimg_t *)obj; - lv_anim_start(&animimg->anim); -} - -/*===================== - * Setter functions - *====================*/ - -void lv_animimg_set_duration(lv_obj_t * obj, uint32_t duration) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_animimg_t * animimg = (lv_animimg_t *)obj; - lv_anim_set_duration(&animimg->anim, duration); - lv_anim_set_playback_delay(&animimg->anim, duration); -} - -void lv_animimg_set_repeat_count(lv_obj_t * obj, uint32_t count) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_animimg_t * animimg = (lv_animimg_t *)obj; - lv_anim_set_repeat_count(&animimg->anim, count); -} - -/*===================== - * Getter functions - *====================*/ - -const void ** lv_animimg_get_src(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_animimg_t * animimg = (lv_animimg_t *)obj; - return animimg->dsc; -} - -uint8_t lv_animimg_get_src_count(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_animimg_t * animimg = (lv_animimg_t *)obj; - return animimg->pic_count; -} - -uint32_t lv_animimg_get_duration(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_animimg_t * animimg = (lv_animimg_t *)obj; - return lv_anim_get_time(&animimg->anim); -} - -uint32_t lv_animimg_get_repeat_count(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_animimg_t * animimg = (lv_animimg_t *)obj; - return lv_anim_get_repeat_count(&animimg->anim); -} - -lv_anim_t * lv_animimg_get_anim(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_animimg_t * animimg = (lv_animimg_t *)obj; - return &animimg->anim; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_animimg_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_TRACE_OBJ_CREATE("begin"); - - LV_UNUSED(class_p); - lv_animimg_t * animimg = (lv_animimg_t *)obj; - - animimg->dsc = NULL; - animimg->pic_count = -1; - - /*initial animation*/ - lv_anim_init(&animimg->anim); - lv_anim_set_var(&animimg->anim, obj); - lv_anim_set_duration(&animimg->anim, 30); - lv_anim_set_exec_cb(&animimg->anim, (lv_anim_exec_xcb_t)index_change); - lv_anim_set_values(&animimg->anim, 0, 1); - lv_anim_set_repeat_count(&animimg->anim, LV_ANIM_REPEAT_INFINITE); -} - -static void index_change(lv_obj_t * obj, int32_t idx) -{ - lv_animimg_t * animimg = (lv_animimg_t *)obj; - - if(animimg->dsc == NULL) { - LV_LOG_WARN("dsc is null"); - return; - } - - if(idx >= animimg->pic_count) idx = animimg->pic_count - 1; - - lv_image_set_src(obj, animimg->dsc[idx]); -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/animimage/lv_animimage.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/animimage/lv_animimage.h deleted file mode 100644 index a2f1926..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/animimage/lv_animimage.h +++ /dev/null @@ -1,129 +0,0 @@ -/** - * @file lv_animimage.h - * - */ - -#ifndef LV_ANIMIMAGE_H -#define LV_ANIMIMAGE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../image/lv_image.h" -#include "../../misc/lv_types.h" - -#if LV_USE_ANIMIMG != 0 - -/*Testing of dependencies*/ -#if LV_USE_IMAGE == 0 -#error "lv_animimg: lv_img is required. Enable it in lv_conf.h (LV_USE_IMAGE 1)" -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_animimg_class; - -/** Image parts */ -typedef enum { - LV_ANIM_IMAGE_PART_MAIN, -} lv_animimg_part_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an animation image objects - * @param parent pointer to an object, it will be the parent of the new button - * @return pointer to the created animation image object - */ -lv_obj_t * lv_animimg_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the image animation images source. - * @param img pointer to an animation image object - * @param dsc pointer to a series images - * @param num images' number - */ -void lv_animimg_set_src(lv_obj_t * img, const void * dsc[], size_t num); - -/** - * Startup the image animation. - * @param obj pointer to an animation image object - */ -void lv_animimg_start(lv_obj_t * obj); - -/** - * Set the image animation duration time. unit:ms - * @param img pointer to an animation image object - * @param duration the duration in milliseconds - */ -void lv_animimg_set_duration(lv_obj_t * img, uint32_t duration); - -/** - * Set the image animation repeatedly play times. - * @param img pointer to an animation image object - * @param count the number of times to repeat the animation - */ -void lv_animimg_set_repeat_count(lv_obj_t * img, uint32_t count); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the image animation images source. - * @param img pointer to an animation image object - * @return a pointer that will point to a series images - */ -const void ** lv_animimg_get_src(lv_obj_t * img); - -/** - * Get the image animation images source. - * @param img pointer to an animation image object - * @return the number of source images - */ -uint8_t lv_animimg_get_src_count(lv_obj_t * img); - -/** - * Get the image animation duration time. unit:ms - * @param img pointer to an animation image object - * @return the animation duration time - */ -uint32_t lv_animimg_get_duration(lv_obj_t * img); - -/** - * Get the image animation repeat play times. - * @param img pointer to an animation image object - * @return the repeat count - */ -uint32_t lv_animimg_get_repeat_count(lv_obj_t * img); - -/** - * Get the image animation underlying animation. - * @param img pointer to an animation image object - * @return the animation reference - */ -lv_anim_t * lv_animimg_get_anim(lv_obj_t * img); - -#endif /*LV_USE_ANIMIMG*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_ANIMIMAGE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/animimage/lv_animimage_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/animimage/lv_animimage_private.h deleted file mode 100644 index c4cf663..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/animimage/lv_animimage_private.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @file lv_animimage_private.h - * - */ - -#ifndef LV_ANIMIMAGE_PRIVATE_H -#define LV_ANIMIMAGE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../image/lv_image_private.h" -#include "../../misc/lv_anim_private.h" -#include "lv_animimage.h" - -#if LV_USE_ANIMIMG != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Data of the animimage */ -struct lv_animimg_t { - lv_image_t img; - lv_anim_t anim; - /* picture sequence */ - const void ** dsc; - int8_t pic_count; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_ANIMIMG != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_ANIMIMAGE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/arc/lv_arc.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/arc/lv_arc.c deleted file mode 100644 index 6aa1484..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/arc/lv_arc.c +++ /dev/null @@ -1,1009 +0,0 @@ -/** - * @file lv_arc.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_arc_private.h" -#include "../../misc/lv_area_private.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_obj_event_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_ARC != 0 - -#include "../../core/lv_group.h" -#include "../../indev/lv_indev.h" -#include "../../misc/lv_assert.h" -#include "../../misc/lv_math.h" -#include "../../draw/lv_draw_arc.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_arc_class) - -#define VALUE_UNSET INT16_MIN -#define CLICK_OUTSIDE_BG_ANGLES ((uint32_t) 0x00U) -#define CLICK_INSIDE_BG_ANGLES ((uint32_t) 0x01U) -#define CLICK_CLOSER_TO_MAX_END ((uint32_t) 0x00U) -#define CLICK_CLOSER_TO_MIN_END ((uint32_t) 0x01U) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void lv_arc_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_arc_draw(lv_event_t * e); -static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void inv_arc_area(lv_obj_t * arc, lv_value_precise_t start_angle, lv_value_precise_t end_angle, lv_part_t part); -static void inv_knob_area(lv_obj_t * obj); -static void get_center(const lv_obj_t * obj, lv_point_t * center, int32_t * arc_r); -static lv_value_precise_t get_angle(const lv_obj_t * obj); -static void get_knob_area(lv_obj_t * arc, const lv_point_t * center, int32_t r, lv_area_t * knob_area); -static void value_update(lv_obj_t * arc); -static int32_t knob_get_extra_size(lv_obj_t * obj); -static bool lv_arc_angle_within_bg_bounds(lv_obj_t * obj, const lv_value_precise_t angle, - const lv_value_precise_t tolerance_deg); - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_arc_class = { - .constructor_cb = lv_arc_constructor, - .event_cb = lv_arc_event, - .instance_size = sizeof(lv_arc_t), - .editable = LV_OBJ_CLASS_EDITABLE_TRUE, - .base_class = &lv_obj_class, - .name = "arc", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_arc_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*====================== - * Add/remove functions - *=====================*/ - -/* - * New object specific "add" or "remove" functions come here - */ - -/*===================== - * Setter functions - *====================*/ - -void lv_arc_set_start_angle(lv_obj_t * obj, lv_value_precise_t start) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_arc_t * arc = (lv_arc_t *)obj; - - if(start > 360) start -= 360; - - lv_value_precise_t old_delta = arc->indic_angle_end - arc->indic_angle_start; - lv_value_precise_t new_delta = arc->indic_angle_end - start; - - if(old_delta < 0) old_delta = 360 + old_delta; - if(new_delta < 0) new_delta = 360 + new_delta; - - if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); - else if(new_delta < old_delta) inv_arc_area(obj, arc->indic_angle_start, start, LV_PART_INDICATOR); - else if(old_delta < new_delta) inv_arc_area(obj, start, arc->indic_angle_start, LV_PART_INDICATOR); - - inv_knob_area(obj); - - arc->indic_angle_start = start; - - inv_knob_area(obj); -} - -void lv_arc_set_end_angle(lv_obj_t * obj, lv_value_precise_t end) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_arc_t * arc = (lv_arc_t *)obj; - if(end > 360) end -= 360; - - lv_value_precise_t old_delta = arc->indic_angle_end - arc->indic_angle_start; - lv_value_precise_t new_delta = end - arc->indic_angle_start; - - if(old_delta < 0) old_delta = 360 + old_delta; - if(new_delta < 0) new_delta = 360 + new_delta; - - if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); - else if(new_delta < old_delta) inv_arc_area(obj, end, arc->indic_angle_end, LV_PART_INDICATOR); - else if(old_delta < new_delta) inv_arc_area(obj, arc->indic_angle_end, end, LV_PART_INDICATOR); - - inv_knob_area(obj); - - arc->indic_angle_end = end; - - inv_knob_area(obj); -} - -void lv_arc_set_angles(lv_obj_t * obj, lv_value_precise_t start, lv_value_precise_t end) -{ - lv_arc_set_end_angle(obj, end); - lv_arc_set_start_angle(obj, start); -} - -void lv_arc_set_bg_start_angle(lv_obj_t * obj, lv_value_precise_t start) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_arc_t * arc = (lv_arc_t *)obj; - - if(start > 360) start -= 360; - - lv_value_precise_t old_delta = arc->bg_angle_end - arc->bg_angle_start; - lv_value_precise_t new_delta = arc->bg_angle_end - start; - - if(old_delta < 0) old_delta = 360 + old_delta; - if(new_delta < 0) new_delta = 360 + new_delta; - - if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); - else if(new_delta < old_delta) inv_arc_area(obj, arc->bg_angle_start, start, LV_PART_MAIN); - else if(old_delta < new_delta) inv_arc_area(obj, start, arc->bg_angle_start, LV_PART_MAIN); - - arc->bg_angle_start = start; - - value_update(obj); -} - -void lv_arc_set_bg_end_angle(lv_obj_t * obj, lv_value_precise_t end) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_arc_t * arc = (lv_arc_t *)obj; - - if(end > 360) end -= 360; - - lv_value_precise_t old_delta = arc->bg_angle_end - arc->bg_angle_start; - lv_value_precise_t new_delta = end - arc->bg_angle_start; - - if(old_delta < 0) old_delta = 360 + old_delta; - if(new_delta < 0) new_delta = 360 + new_delta; - - if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); - else if(new_delta < old_delta) inv_arc_area(obj, end, arc->bg_angle_end, LV_PART_MAIN); - else if(old_delta < new_delta) inv_arc_area(obj, arc->bg_angle_end, end, LV_PART_MAIN); - - arc->bg_angle_end = end; - - value_update(obj); -} - -void lv_arc_set_bg_angles(lv_obj_t * obj, lv_value_precise_t start, lv_value_precise_t end) -{ - lv_arc_set_bg_end_angle(obj, end); - lv_arc_set_bg_start_angle(obj, start); -} - -void lv_arc_set_rotation(lv_obj_t * obj, int32_t rotation) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_arc_t * arc = (lv_arc_t *)obj; - - /* ensure the angle is in the range [0, 360) */ - while(rotation < 0) rotation += 360; - while(rotation >= 360) rotation -= 360; - arc->rotation = rotation; - - lv_obj_invalidate(obj); -} - -void lv_arc_set_mode(lv_obj_t * obj, lv_arc_mode_t type) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_arc_t * arc = (lv_arc_t *)obj; - - int32_t val = arc->value; - - arc->type = type; - arc->value = -1; /** Force set_value handling*/ - - lv_value_precise_t bg_midpoint, bg_end = arc->bg_angle_end; - if(arc->bg_angle_end < arc->bg_angle_start) bg_end = arc->bg_angle_end + 360; - - switch(arc->type) { - case LV_ARC_MODE_SYMMETRICAL: - bg_midpoint = (arc->bg_angle_start + bg_end) / 2; - lv_arc_set_start_angle(obj, bg_midpoint); - lv_arc_set_end_angle(obj, bg_midpoint); - break; - case LV_ARC_MODE_REVERSE: - lv_arc_set_end_angle(obj, arc->bg_angle_end); - break; - default: /** LV_ARC_TYPE_NORMAL*/ - lv_arc_set_start_angle(obj, arc->bg_angle_start); - } - - lv_arc_set_value(obj, val); -} - -void lv_arc_set_value(lv_obj_t * obj, int32_t value) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_arc_t * arc = (lv_arc_t *)obj; - - if(arc->value == value) return; - - int32_t new_value; - new_value = value > arc->max_value ? arc->max_value : value; - new_value = new_value < arc->min_value ? arc->min_value : new_value; - - if(arc->value == new_value) return; - arc->value = new_value; - - value_update(obj); -} - -void lv_arc_set_range(lv_obj_t * obj, int32_t min, int32_t max) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_arc_t * arc = (lv_arc_t *)obj; - - if(arc->min_value == min && arc->max_value == max) return; - - arc->min_value = min; - arc->max_value = max; - - if(arc->value < min) { - arc->value = min; - } - if(arc->value > max) { - arc->value = max; - } - - value_update(obj); /*value has changed relative to the new range*/ -} - -void lv_arc_set_change_rate(lv_obj_t * obj, uint32_t rate) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_arc_t * arc = (lv_arc_t *)obj; - - arc->chg_rate = rate; -} - -void lv_arc_set_knob_offset(lv_obj_t * obj, int32_t offset) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_arc_t * arc = (lv_arc_t *)obj; - - arc->knob_offset = offset; -} - -/*===================== - * Getter functions - *====================*/ - -lv_value_precise_t lv_arc_get_angle_start(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - return ((lv_arc_t *) obj)->indic_angle_start; -} - -lv_value_precise_t lv_arc_get_angle_end(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - return ((lv_arc_t *) obj)->indic_angle_end; -} - -lv_value_precise_t lv_arc_get_bg_angle_start(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - return ((lv_arc_t *) obj)->bg_angle_start; -} - -lv_value_precise_t lv_arc_get_bg_angle_end(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - return ((lv_arc_t *) obj)->bg_angle_end; -} - -int32_t lv_arc_get_value(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - return ((lv_arc_t *) obj)->value; -} - -int32_t lv_arc_get_min_value(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - return ((lv_arc_t *) obj)->min_value; -} - -int32_t lv_arc_get_max_value(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - return ((lv_arc_t *) obj)->max_value; -} - -lv_arc_mode_t lv_arc_get_mode(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - return ((lv_arc_t *) obj)->type; -} - -int32_t lv_arc_get_rotation(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - return ((lv_arc_t *)obj)->rotation; -} - -int32_t lv_arc_get_knob_offset(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - return ((lv_arc_t *)obj)->knob_offset; -} - -/*===================== - * Other functions - *====================*/ - -void lv_arc_align_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_align, int32_t r_offset) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(obj_to_align); - - lv_obj_update_layout(obj); - - lv_point_t center; - int32_t arc_r; - get_center(obj, ¢er, &arc_r); - int32_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); - int32_t indic_width_half = indic_width / 2; - arc_r -= indic_width_half; - arc_r += r_offset; - - int32_t angle = (int32_t)get_angle(obj); - int32_t knob_x = (arc_r * lv_trigo_sin(angle + 90)) >> LV_TRIGO_SHIFT; - int32_t knob_y = (arc_r * lv_trigo_sin(angle)) >> LV_TRIGO_SHIFT; - lv_obj_align_to(obj_to_align, obj, LV_ALIGN_CENTER, knob_x, knob_y); -} - -void lv_arc_rotate_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_rotate, int32_t r_offset) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(obj_to_rotate); - - lv_obj_update_layout(obj); - - lv_point_t center; - int32_t arc_r; - get_center(obj, ¢er, &arc_r); - int32_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); - int32_t indic_width_half = indic_width / 2; - arc_r -= indic_width_half; - - arc_r += r_offset; - lv_obj_align_to(obj_to_rotate, obj, LV_ALIGN_CENTER, 0, -arc_r); - - lv_obj_update_layout(obj); - - int32_t angle = (int32_t)get_angle(obj); - int32_t pivot_x = obj_to_rotate->coords.x1 - center.x; - int32_t pivot_y = obj_to_rotate->coords.y1 - center.y; - lv_obj_set_style_transform_pivot_x(obj_to_rotate, -pivot_x, 0); - lv_obj_set_style_transform_pivot_y(obj_to_rotate, -pivot_y, 0); - lv_obj_set_style_transform_rotation(obj_to_rotate, angle * 10 + 900, 0); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_arc_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_arc_t * arc = (lv_arc_t *)obj; - - /*Initialize the allocated 'ext'*/ - arc->rotation = 0; - arc->bg_angle_start = 135; - arc->bg_angle_end = 45; - arc->indic_angle_start = 135; - arc->indic_angle_end = 270; - arc->type = LV_ARC_MODE_NORMAL; - arc->value = VALUE_UNSET; - arc->min_close = CLICK_CLOSER_TO_MIN_END; - arc->min_value = 0; - arc->max_value = 100; - arc->dragging = false; - arc->chg_rate = 720; - arc->last_tick = lv_tick_get(); - arc->last_angle = arc->indic_angle_end; - arc->in_out = CLICK_OUTSIDE_BG_ANGLES; - - lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN | LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_ext_click_area(obj, LV_DPI_DEF / 10); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - - /*Call the ancestor's event handler*/ - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - lv_arc_t * arc = (lv_arc_t *)obj; - if(code == LV_EVENT_PRESSING) { - lv_indev_t * indev = lv_indev_active(); - if(indev == NULL) return; - - /*Handle only pointers here*/ - lv_indev_type_t indev_type = lv_indev_get_type(indev); - if(indev_type != LV_INDEV_TYPE_POINTER) return; - - lv_point_t p; - lv_indev_get_point(indev, &p); - - /*Make point relative to the arc's center*/ - lv_point_t center; - int32_t r; - get_center(obj, ¢er, &r); - - p.x -= center.x; - p.y -= center.y; - - /*Enter dragging mode if pressed out of the knob*/ - if(arc->dragging == false) { - int32_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); - r -= indic_width; - /*Add some more sensitive area if there is no advanced hit testing. - * (Advanced hit testing is more precise)*/ - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_ADV_HITTEST)) { - r -= indic_width; - } - else { - r -= LV_MAX(r / 4, indic_width); - } - if(r < 1) r = 1; - - if(p.x * p.x + p.y * p.y > r * r) { - arc->dragging = true; - arc->last_tick = lv_tick_get(); /*Capture timestamp at dragging start*/ - } - } - - /*It must be in "dragging" mode to turn the arc*/ - if(arc->dragging == false) return; - - /*No angle can be determined if exactly the middle of the arc is being pressed*/ - if(p.x == 0 && p.y == 0) return; - - /*Calculate the angle of the pressed point*/ - lv_value_precise_t angle; - lv_value_precise_t bg_end = arc->bg_angle_end; - if(arc->bg_angle_end < arc->bg_angle_start) { - bg_end = arc->bg_angle_end + 360; - } - - angle = lv_atan2(p.y, p.x); - angle -= arc->rotation; - angle -= arc->bg_angle_start; /*Make the angle relative to the start angle*/ - - /* ensure the angle is in the range [0, 360) */ - while(angle < 0) angle += 360; - while(angle >= 360) angle -= 360; - - const uint32_t circumference = (uint32_t)((2U * r * 314U) / 100U); /* Equivalent to: 2r * 3.14, avoiding floats */ - const lv_value_precise_t tolerance_deg = (360 * lv_dpx(50U)) / circumference; - const uint32_t min_close_prev = (uint32_t) arc->min_close; - - const bool is_angle_within_bg_bounds = lv_arc_angle_within_bg_bounds(obj, angle, tolerance_deg); - if(!is_angle_within_bg_bounds) { - return; - } - - lv_value_precise_t deg_range = bg_end - arc->bg_angle_start; - lv_value_precise_t last_angle_rel = arc->last_angle - arc->bg_angle_start; - lv_value_precise_t delta_angle = angle - last_angle_rel; - - /*Do not allow big jumps (jumps bigger than 280°). - *It's mainly to avoid jumping to the opposite end if the "dead" range between min. and max. is crossed. - *Check which end was closer on the last valid press (arc->min_close) and prefer that end*/ - if(LV_ABS(delta_angle) > 280) { - if(arc->min_close == CLICK_CLOSER_TO_MIN_END) angle = 0; - else angle = deg_range; - } - /* Check if click was outside the background arc start and end angles */ - else if(CLICK_OUTSIDE_BG_ANGLES == arc->in_out) { - if(arc->min_close == CLICK_CLOSER_TO_MIN_END) angle = -deg_range; - else angle = deg_range; - } - else { /* Keep the angle value */ } - - /* Prevent big jumps when the click goes from start to end angle in the invisible - * part of the background arc without being released */ - if(((min_close_prev == CLICK_CLOSER_TO_MIN_END) && (arc->min_close == CLICK_CLOSER_TO_MAX_END)) - && ((CLICK_OUTSIDE_BG_ANGLES == arc->in_out) && (LV_ABS(delta_angle) > 280))) { - angle = 0; - arc->min_close = min_close_prev; - } - else if(((min_close_prev == CLICK_CLOSER_TO_MAX_END) && (arc->min_close == CLICK_CLOSER_TO_MIN_END)) - && (CLICK_OUTSIDE_BG_ANGLES == arc->in_out) && (360 - LV_ABS(delta_angle) > 280)) { - angle = deg_range; - arc->min_close = min_close_prev; - } - else { /* Keep the angle value */ } - - /*Calculate the slew rate limited angle based on change rate (degrees/sec)*/ - delta_angle = angle - last_angle_rel; - - uint32_t delta_tick = lv_tick_elaps(arc->last_tick); - /* delta_angle_max can never be signed. delta_tick is always signed, same for ch_rate */ - const lv_value_precise_t delta_angle_max = (arc->chg_rate * delta_tick) / 1000; - - if(delta_angle > delta_angle_max) { - delta_angle = delta_angle_max; - } - else if(delta_angle < -delta_angle_max) { - delta_angle = -delta_angle_max; - } - else { /* Nothing to do */ } - - angle = last_angle_rel + delta_angle; /*Apply the limited angle change*/ - - /*Rounding for symmetry*/ - lv_value_precise_t round = ((bg_end - arc->bg_angle_start) * 8) / (arc->max_value - arc->min_value); - round = (round + 4) / 16; - angle += round; - - angle += arc->bg_angle_start; /*Make the angle absolute again*/ - - /*Set the new value*/ - int32_t old_value = arc->value; - int32_t new_value = lv_map((int32_t)angle, (int32_t)arc->bg_angle_start, (int32_t)bg_end, arc->min_value, - arc->max_value); - if(arc->type == LV_ARC_MODE_REVERSE) { - new_value = arc->max_value - new_value + arc->min_value; - } - - if(new_value != lv_arc_get_value(obj)) { - arc->last_tick = lv_tick_get(); /*Cache timestamp for the next iteration*/ - lv_arc_set_value(obj, new_value); /*set_value caches the last_angle for the next iteration*/ - if(new_value != old_value) { - res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - if(res != LV_RESULT_OK) return; - } - } - - /*Don't let the elapsed time become too big while sitting on an end point*/ - if(new_value == arc->min_value || new_value == arc->max_value) { - arc->last_tick = lv_tick_get(); /*Cache timestamp for the next iteration*/ - } - } - else if(code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { - arc->dragging = false; - - /*Leave edit mode if released. (No need to wait for LONG_PRESS)*/ - lv_group_t * g = lv_obj_get_group(obj); - bool editing = lv_group_get_editing(g); - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); - if(indev_type == LV_INDEV_TYPE_ENCODER) { - if(editing) lv_group_set_editing(g, false); - } - - } - else if(code == LV_EVENT_KEY) { - uint32_t c = lv_event_get_key(e); - - int32_t old_value = arc->value; - if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { - lv_arc_set_value(obj, lv_arc_get_value(obj) + 1); - } - else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { - lv_arc_set_value(obj, lv_arc_get_value(obj) - 1); - } - - if(old_value != arc->value) { - res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - if(res != LV_RESULT_OK) return; - } - } - else if(code == LV_EVENT_ROTARY) { - int32_t r = lv_event_get_rotary_diff(e); - - int32_t old_value = arc->value; - lv_arc_set_value(obj, lv_arc_get_value(obj) + r); - if(old_value != arc->value) { - res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - if(res != LV_RESULT_OK) return; - } - } - else if(code == LV_EVENT_HIT_TEST) { - lv_hit_test_info_t * info = lv_event_get_param(e); - - lv_point_t p; - int32_t r; - get_center(obj, &p, &r); - - int32_t ext_click_area = 0; - if(obj->spec_attr) ext_click_area = obj->spec_attr->ext_click_pad; - - int32_t w = lv_obj_get_style_arc_width(obj, LV_PART_MAIN); - r -= w + ext_click_area; - - lv_area_t a; - /*Invalid if clicked inside*/ - lv_area_set(&a, p.x - r, p.y - r, p.x + r, p.y + r); - if(lv_area_is_point_on(&a, info->point, LV_RADIUS_CIRCLE)) { - info->res = false; - return; - } - - /*Calculate the angle of the pressed point*/ - lv_value_precise_t angle = lv_atan2(info->point->y - p.y, info->point->x - p.x); - angle -= arc->rotation; - angle -= arc->bg_angle_start; /*Make the angle relative to the start angle*/ - - /* ensure the angle is in the range [0, 360) */ - while(angle < 0) angle += 360; - while(angle >= 360) angle -= 360; - - const uint32_t circumference = (uint32_t)((2U * r * 314U) / 100U); /* Equivalent to: 2r * 3.14, avoiding floats */ - const lv_value_precise_t tolerance_deg = (360 * lv_dpx(50U)) / circumference; - - /* Check if the angle is outside the drawn background arc */ - const bool is_angle_within_bg_bounds = lv_arc_angle_within_bg_bounds(obj, angle, tolerance_deg); - if(!is_angle_within_bg_bounds) { - info->res = false; - return; - } - - /*Valid if no clicked outside*/ - lv_area_increase(&a, w + ext_click_area * 2, w + ext_click_area * 2); - info->res = lv_area_is_point_on(&a, info->point, LV_RADIUS_CIRCLE); - } - else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - int32_t bg_pad = LV_MAX4(bg_left, bg_right, bg_top, bg_bottom); - - int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); - int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); - int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); - int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); - int32_t knob_pad = LV_MAX4(knob_left, knob_right, knob_top, knob_bottom) + 2; - - int32_t knob_extra_size = knob_pad - bg_pad; - knob_extra_size += knob_get_extra_size(obj); - - int32_t * s = lv_event_get_param(e); - *s = LV_MAX(*s, knob_extra_size); - } - else if(code == LV_EVENT_DRAW_MAIN) { - lv_arc_draw(e); - } -} - -static void lv_arc_draw(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_arc_t * arc = (lv_arc_t *)obj; - - lv_layer_t * layer = lv_event_get_layer(e); - - lv_point_t center; - int32_t arc_r; - get_center(obj, ¢er, &arc_r); - - /*Draw the background arc*/ - lv_draw_arc_dsc_t arc_dsc; - if(arc_r > 0) { - lv_draw_arc_dsc_init(&arc_dsc); - lv_obj_init_draw_arc_dsc(obj, LV_PART_MAIN, &arc_dsc); - arc_dsc.center = center; - arc_dsc.start_angle = arc->bg_angle_start + arc->rotation; - arc_dsc.end_angle = arc->bg_angle_end + arc->rotation; - arc_dsc.radius = arc_r; - lv_draw_arc(layer, &arc_dsc); - } - - /*Make the indicator arc smaller or larger according to its greatest padding value*/ - int32_t left_indic = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); - int32_t right_indic = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); - int32_t top_indic = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); - int32_t bottom_indic = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); - int32_t indic_r = arc_r - LV_MAX4(left_indic, right_indic, top_indic, bottom_indic); - - if(indic_r > 0) { - lv_draw_arc_dsc_init(&arc_dsc); - lv_obj_init_draw_arc_dsc(obj, LV_PART_INDICATOR, &arc_dsc); - arc_dsc.center = center; - arc_dsc.start_angle = arc->indic_angle_start + arc->rotation; - arc_dsc.end_angle = arc->indic_angle_end + arc->rotation; - - arc_dsc.radius = indic_r; - - lv_draw_arc(layer, &arc_dsc); - } - - lv_area_t knob_area; - get_knob_area(obj, ¢er, arc_r, &knob_area); - - lv_draw_rect_dsc_t knob_rect_dsc; - lv_draw_rect_dsc_init(&knob_rect_dsc); - lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &knob_rect_dsc); - lv_draw_rect(layer, &knob_rect_dsc, &knob_area); -} - -static void inv_arc_area(lv_obj_t * obj, lv_value_precise_t start_angle, lv_value_precise_t end_angle, lv_part_t part) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - /*Skip this complicated invalidation if the arc is not visible*/ - if(lv_obj_is_visible(obj) == false) return; - - lv_arc_t * arc = (lv_arc_t *)obj; - - if(start_angle == end_angle) return; - - if(start_angle > 360) start_angle -= 360; - if(end_angle > 360) end_angle -= 360; - - start_angle += arc->rotation; - end_angle += arc->rotation; - - if(start_angle > 360) start_angle -= 360; - if(end_angle > 360) end_angle -= 360; - - int32_t r; - lv_point_t c; - get_center(obj, &c, &r); - - int32_t w = lv_obj_get_style_arc_width(obj, part); - int32_t rounded = lv_obj_get_style_arc_rounded(obj, part); - - lv_area_t inv_area; - lv_draw_arc_get_area(c.x, c.y, r, start_angle, end_angle, w, rounded, &inv_area); - - lv_obj_invalidate_area(obj, &inv_area); -} - -static void inv_knob_area(lv_obj_t * obj) -{ - lv_point_t c; - int32_t r; - get_center(obj, &c, &r); - - lv_area_t a; - get_knob_area(obj, &c, r, &a); - - int32_t knob_extra_size = knob_get_extra_size(obj); - - if(knob_extra_size > 0) { - lv_area_increase(&a, knob_extra_size, knob_extra_size); - } - - lv_obj_invalidate_area(obj, &a); -} - -static void get_center(const lv_obj_t * obj, lv_point_t * center, int32_t * arc_r) -{ - int32_t left_bg = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t right_bg = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - int32_t top_bg = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - int32_t bottom_bg = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - - int32_t r = (LV_MIN(lv_obj_get_width(obj) - left_bg - right_bg, - lv_obj_get_height(obj) - top_bg - bottom_bg)) / 2; - - center->x = obj->coords.x1 + r + left_bg; - center->y = obj->coords.y1 + r + top_bg; - - if(arc_r) *arc_r = r; -} - -static lv_value_precise_t get_angle(const lv_obj_t * obj) -{ - lv_arc_t * arc = (lv_arc_t *)obj; - lv_value_precise_t angle = arc->rotation; - if(arc->type == LV_ARC_MODE_NORMAL) { - angle += arc->indic_angle_end; - } - else if(arc->type == LV_ARC_MODE_REVERSE) { - angle += arc->indic_angle_start; - } - else if(arc->type == LV_ARC_MODE_SYMMETRICAL) { - lv_value_precise_t bg_end = arc->bg_angle_end; - if(arc->bg_angle_end < arc->bg_angle_start) bg_end = arc->bg_angle_end + 360; - lv_value_precise_t indic_end = arc->indic_angle_end; - if(arc->indic_angle_end < arc->indic_angle_start) indic_end = arc->indic_angle_end + 360; - - lv_value_precise_t angle_midpoint = (int32_t)(arc->bg_angle_start + bg_end) / 2; - if(arc->indic_angle_start < angle_midpoint) angle += arc->indic_angle_start; - else if(indic_end > angle_midpoint) angle += arc->indic_angle_end; - else angle += angle_midpoint; - } - - return angle; -} - -static void get_knob_area(lv_obj_t * obj, const lv_point_t * center, int32_t r, lv_area_t * knob_area) -{ - int32_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); - int32_t indic_width_half = indic_width / 2; - r -= indic_width_half; - - int32_t angle = (int32_t)get_angle(obj); - int32_t knob_offset = lv_arc_get_knob_offset(obj); - int32_t knob_x = (r * lv_trigo_sin(knob_offset + angle + 90)) >> LV_TRIGO_SHIFT; - int32_t knob_y = (r * lv_trigo_sin(knob_offset + angle)) >> LV_TRIGO_SHIFT; - - int32_t left_knob = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); - int32_t right_knob = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); - int32_t top_knob = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); - int32_t bottom_knob = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); - - knob_area->x1 = center->x + knob_x - left_knob - indic_width_half; - knob_area->x2 = center->x + knob_x + right_knob + indic_width_half; - knob_area->y1 = center->y + knob_y - top_knob - indic_width_half; - knob_area->y2 = center->y + knob_y + bottom_knob + indic_width_half; -} - -/** - * Used internally to update arc angles after a value change - * @param arc pointer to an arc object - */ -static void value_update(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_arc_t * arc = (lv_arc_t *)obj; - - /*If the value is still not set to any value do not update*/ - if(arc->value == VALUE_UNSET) return; - - lv_value_precise_t bg_midpoint, bg_end = arc->bg_angle_end; - int32_t range_midpoint; - if(arc->bg_angle_end < arc->bg_angle_start) bg_end = arc->bg_angle_end + 360; - - int32_t angle; - switch(arc->type) { - case LV_ARC_MODE_SYMMETRICAL: - bg_midpoint = (arc->bg_angle_start + bg_end) / 2; - range_midpoint = (int32_t)(arc->min_value + arc->max_value) / 2; - - if(arc->value < range_midpoint) { - angle = lv_map(arc->value, arc->min_value, range_midpoint, (int32_t)arc->bg_angle_start, (int32_t)bg_midpoint); - lv_arc_set_start_angle(obj, angle); - lv_arc_set_end_angle(obj, bg_midpoint); - } - else { - angle = lv_map(arc->value, range_midpoint, arc->max_value, (int32_t)bg_midpoint, (int32_t)bg_end); - lv_arc_set_start_angle(obj, bg_midpoint); - lv_arc_set_end_angle(obj, angle); - } - break; - case LV_ARC_MODE_REVERSE: - angle = lv_map(arc->value, arc->min_value, arc->max_value, (int32_t)bg_end, (int32_t)arc->bg_angle_start); - lv_arc_set_angles(obj, angle, arc->bg_angle_end); - break; - case LV_ARC_MODE_NORMAL: - angle = lv_map(arc->value, arc->min_value, arc->max_value, (int32_t)arc->bg_angle_start, (int32_t)bg_end); - lv_arc_set_angles(obj, arc->bg_angle_start, angle); - - break; - default: - LV_LOG_WARN("Invalid mode: %d", arc->type); - return; - } - arc->last_angle = angle; /*Cache angle for slew rate limiting*/ -} - -static int32_t knob_get_extra_size(lv_obj_t * obj) -{ - int32_t knob_shadow_size = 0; - knob_shadow_size += lv_obj_get_style_shadow_width(obj, LV_PART_KNOB); - knob_shadow_size += lv_obj_get_style_shadow_spread(obj, LV_PART_KNOB); - knob_shadow_size += LV_ABS(lv_obj_get_style_shadow_offset_x(obj, LV_PART_KNOB)); - knob_shadow_size += LV_ABS(lv_obj_get_style_shadow_offset_y(obj, LV_PART_KNOB)); - - int32_t knob_outline_size = 0; - knob_outline_size += lv_obj_get_style_outline_width(obj, LV_PART_KNOB); - knob_outline_size += lv_obj_get_style_outline_pad(obj, LV_PART_KNOB); - - return LV_MAX(knob_shadow_size, knob_outline_size); -} - -/** - * Check if angle is within arc background bounds - * - * In order to avoid unexpected value update of the arc value when the user clicks - * outside of the arc background we need to check if the angle (of the clicked point) - * is within the bounds of the background. - * - * A tolerance (extra room) also should be taken into consideration. - * - * E.g. Arc with start angle of 0° and end angle of 90°, the background is only visible in - * that range, from 90° to 360° the background is invisible. Click in 150° should not update - * the arc value, click within the arc angle range should. - * - * IMPORTANT NOTE: angle is always relative to bg_angle_start, e.g. if bg_angle_start is 30 - * and we click a bit to the left, angle is 10, not the expected 40. - * - * @param obj Pointer to lv_arc - * @param angle Angle to be checked. Is 0<=angle<=360 and relative to bg_angle_start - * @param tolerance_deg Tolerance - * - * @return true if angle is within arc background bounds, false otherwise - */ -static bool lv_arc_angle_within_bg_bounds(lv_obj_t * obj, const lv_value_precise_t angle, - const lv_value_precise_t tolerance_deg) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_arc_t * arc = (lv_arc_t *)obj; - - lv_value_precise_t bounds_angle = arc->bg_angle_end - arc->bg_angle_start; - - /* ensure the angle is in the range [0, 360) */ - while(bounds_angle < 0) bounds_angle += 360; - while(bounds_angle >= 360) bounds_angle -= 360; - - /* Angle is in the bounds */ - if(angle <= bounds_angle) { - if(angle < (bounds_angle / 2)) { - arc->min_close = CLICK_CLOSER_TO_MIN_END; - } - else { - arc->min_close = CLICK_CLOSER_TO_MAX_END; - } - arc->in_out = CLICK_INSIDE_BG_ANGLES; - return true; - } - - /* Distance between background start and end angles is less than tolerance, - * consider the click inside the arc */ - if(360 - bounds_angle <= tolerance_deg) { - arc->min_close = CLICK_CLOSER_TO_MIN_END; - arc->in_out = CLICK_INSIDE_BG_ANGLES; - return true; - } - - /* angle is within the tolerance of the min end */ - if(360 - angle <= tolerance_deg) { - arc->min_close = CLICK_CLOSER_TO_MIN_END; - arc->in_out = CLICK_OUTSIDE_BG_ANGLES; - return true; - } - - /* angle is within the tolerance of the max end */ - if(angle <= bounds_angle + tolerance_deg) { - arc->min_close = CLICK_CLOSER_TO_MAX_END; - arc->in_out = CLICK_OUTSIDE_BG_ANGLES; - return true; - } - - return false; -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/arc/lv_arc.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/arc/lv_arc.h deleted file mode 100644 index f241745..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/arc/lv_arc.h +++ /dev/null @@ -1,247 +0,0 @@ -/** - * @file lv_arc.h - * - */ - -#ifndef LV_ARC_H -#define LV_ARC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -#if LV_USE_ARC != 0 - -#include "../../core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef enum { - LV_ARC_MODE_NORMAL, - LV_ARC_MODE_SYMMETRICAL, - LV_ARC_MODE_REVERSE -} lv_arc_mode_t; - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_arc_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an arc object - * @param parent pointer to an object, it will be the parent of the new arc - * @return pointer to the created arc - */ -lv_obj_t * lv_arc_create(lv_obj_t * parent); - -/*====================== - * Add/remove functions - *=====================*/ - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the start angle of an arc. 0 deg: right, 90 bottom, etc. - * @param obj pointer to an arc object - * @param start the start angle. (if `LV_USE_FLOAT` is enabled it can be fractional too.) - */ -void lv_arc_set_start_angle(lv_obj_t * obj, lv_value_precise_t start); - -/** - * Set the end angle of an arc. 0 deg: right, 90 bottom, etc. - * @param obj pointer to an arc object - * @param end the end angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) - */ -void lv_arc_set_end_angle(lv_obj_t * obj, lv_value_precise_t end); - -/** - * Set the start and end angles - * @param obj pointer to an arc object - * @param start the start angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) - * @param end the end angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) - */ -void lv_arc_set_angles(lv_obj_t * obj, lv_value_precise_t start, lv_value_precise_t end); - -/** - * Set the start angle of an arc background. 0 deg: right, 90 bottom, etc. - * @param obj pointer to an arc object - * @param start the start angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) - */ -void lv_arc_set_bg_start_angle(lv_obj_t * obj, lv_value_precise_t start); - -/** - * Set the start angle of an arc background. 0 deg: right, 90 bottom etc. - * @param obj pointer to an arc object - * @param end the end angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) - */ -void lv_arc_set_bg_end_angle(lv_obj_t * obj, lv_value_precise_t end); - -/** - * Set the start and end angles of the arc background - * @param obj pointer to an arc object - * @param start the start angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) - * @param end the end angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) - */ -void lv_arc_set_bg_angles(lv_obj_t * obj, lv_value_precise_t start, lv_value_precise_t end); - -/** - * Set the rotation for the whole arc - * @param obj pointer to an arc object - * @param rotation rotation angle - */ -void lv_arc_set_rotation(lv_obj_t * obj, int32_t rotation); - -/** - * Set the type of arc. - * @param obj pointer to arc object - * @param type arc's mode - */ -void lv_arc_set_mode(lv_obj_t * obj, lv_arc_mode_t type); - -/** - * Set a new value on the arc - * @param obj pointer to an arc object - * @param value new value - */ -void lv_arc_set_value(lv_obj_t * obj, int32_t value); - -/** - * Set minimum and the maximum values of an arc - * @param obj pointer to the arc object - * @param min minimum value - * @param max maximum value - */ -void lv_arc_set_range(lv_obj_t * obj, int32_t min, int32_t max); - -/** - * Set a change rate to limit the speed how fast the arc should reach the pressed point. - * @param obj pointer to an arc object - * @param rate the change rate - */ -void lv_arc_set_change_rate(lv_obj_t * obj, uint32_t rate); - -/** - * Set an offset angle for the knob - * @param obj pointer to an arc object - * @param offset knob offset from main arc in degrees - */ -void lv_arc_set_knob_offset(lv_obj_t * obj, int32_t offset); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the start angle of an arc. - * @param obj pointer to an arc object - * @return the start angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) - */ -lv_value_precise_t lv_arc_get_angle_start(lv_obj_t * obj); - -/** - * Get the end angle of an arc. - * @param obj pointer to an arc object - * @return the end angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) - */ -lv_value_precise_t lv_arc_get_angle_end(lv_obj_t * obj); - -/** - * Get the start angle of an arc background. - * @param obj pointer to an arc object - * @return the start angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) - */ -lv_value_precise_t lv_arc_get_bg_angle_start(lv_obj_t * obj); - -/** - * Get the end angle of an arc background. - * @param obj pointer to an arc object - * @return the end angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) - */ -lv_value_precise_t lv_arc_get_bg_angle_end(lv_obj_t * obj); - -/** - * Get the value of an arc - * @param obj pointer to an arc object - * @return the value of the arc - */ -int32_t lv_arc_get_value(const lv_obj_t * obj); - -/** - * Get the minimum value of an arc - * @param obj pointer to an arc object - * @return the minimum value of the arc - */ -int32_t lv_arc_get_min_value(const lv_obj_t * obj); - -/** - * Get the maximum value of an arc - * @param obj pointer to an arc object - * @return the maximum value of the arc - */ -int32_t lv_arc_get_max_value(const lv_obj_t * obj); - -/** - * Get whether the arc is type or not. - * @param obj pointer to an arc object - * @return arc's mode - */ -lv_arc_mode_t lv_arc_get_mode(const lv_obj_t * obj); - -/** - * Get the rotation for the whole arc - * @param obj pointer to an arc object - * @return arc's current rotation - */ -int32_t lv_arc_get_rotation(const lv_obj_t * obj); - -/** - * Get the current knob angle offset - * @param obj pointer to an arc object - * @return arc's current knob offset - */ -int32_t lv_arc_get_knob_offset(const lv_obj_t * obj); - -/*===================== - * Other functions - *====================*/ - -/** - * Align an object to the current position of the arc (knob) - * @param obj pointer to an arc object - * @param obj_to_align pointer to an object to align - * @param r_offset consider the radius larger with this value (< 0: for smaller radius) - */ -void lv_arc_align_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_align, int32_t r_offset); - -/** - * Rotate an object to the current position of the arc (knob) - * @param obj pointer to an arc object - * @param obj_to_rotate pointer to an object to rotate - * @param r_offset consider the radius larger with this value (< 0: for smaller radius) - */ -void lv_arc_rotate_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_rotate, int32_t r_offset); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_ARC*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_ARC_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/arc/lv_arc_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/arc/lv_arc_private.h deleted file mode 100644 index 03513ea..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/arc/lv_arc_private.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @file lv_arc_private.h - * - */ - -#ifndef LV_ARC_PRIVATE_H -#define LV_ARC_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj_private.h" -#include "lv_arc.h" - -#if LV_USE_ARC != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_arc_t { - lv_obj_t obj; - int32_t rotation; - lv_value_precise_t indic_angle_start; - lv_value_precise_t indic_angle_end; - lv_value_precise_t bg_angle_start; - lv_value_precise_t bg_angle_end; - int32_t value; /**< Current value of the arc */ - int32_t min_value; /**< Minimum value of the arc */ - int32_t max_value; /**< Maximum value of the arc */ - uint32_t dragging : 1; - uint32_t type : 2; - uint32_t min_close : 1; /**< 1: the last pressed angle was closer to minimum end */ - uint32_t in_out : 1; /**< 1: The click was within the background arc angles. 0: Click outside */ - uint32_t chg_rate; /**< Drag angle rate of change of the arc (degrees/sec) */ - uint32_t last_tick; /**< Last dragging event timestamp of the arc */ - lv_value_precise_t last_angle; /**< Last dragging angle of the arc */ - int16_t knob_offset; /**< knob offset from the main arc */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_ARC != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_ARC_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/bar/lv_bar.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/bar/lv_bar.c deleted file mode 100644 index 6fc7b23..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/bar/lv_bar.c +++ /dev/null @@ -1,698 +0,0 @@ -/** - * @file lv_bar.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_bar_private.h" -#include "../../misc/lv_area_private.h" -#include "../../draw/lv_draw_mask_private.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_BAR != 0 - -#include "../../draw/lv_draw.h" -#include "../../misc/lv_assert.h" -#include "../../misc/lv_anim_private.h" -#include "../../misc/lv_math.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_bar_class) - -/** hor. pad and ver. pad cannot make the indicator smaller than this [px]*/ -#define LV_BAR_SIZE_MIN 4 - -#define LV_BAR_IS_ANIMATING(anim_struct) (((anim_struct).anim_state) != LV_BAR_ANIM_STATE_INV) -#define LV_BAR_GET_ANIM_VALUE(orig_value, anim_struct) (LV_BAR_IS_ANIMATING(anim_struct) ? ((anim_struct).anim_end) : (orig_value)) - -/** Bar animation start value. (Not the real value of the Bar just indicates process animation)*/ -#define LV_BAR_ANIM_STATE_START 0 - -/** Bar animation end value. (Not the real value of the Bar just indicates process animation)*/ -#define LV_BAR_ANIM_STATE_END 256 - -/** Mark no animation is in progress*/ -#define LV_BAR_ANIM_STATE_INV -1 - -/** log2(LV_BAR_ANIM_STATE_END) used to normalize data*/ -#define LV_BAR_ANIM_STATE_NORM 8 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_bar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_bar_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_bar_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void draw_indic(lv_event_t * e); -static void lv_bar_set_value_with_anim(lv_obj_t * obj, int32_t new_value, int32_t * value_ptr, - lv_bar_anim_t * anim_info, lv_anim_enable_t en); -static void lv_bar_init_anim(lv_obj_t * bar, lv_bar_anim_t * bar_anim); -static void lv_bar_anim(void * bar, int32_t value); -static void lv_bar_anim_completed(lv_anim_t * a); - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_bar_class = { - .constructor_cb = lv_bar_constructor, - .destructor_cb = lv_bar_destructor, - .event_cb = lv_bar_event, - .width_def = LV_DPI_DEF * 2, - .height_def = LV_DPI_DEF / 10, - .instance_size = sizeof(lv_bar_t), - .base_class = &lv_obj_class, - .name = "bar", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_bar_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_bar_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_bar_t * bar = (lv_bar_t *)obj; - - if(bar->cur_value == value) return; - - value = LV_CLAMP(bar->min_value, value, bar->max_value); - value = value < bar->start_value ? bar->start_value : value; /*Can't be smaller than the left value*/ - - if(bar->cur_value == value) return; - - lv_bar_set_value_with_anim(obj, value, &bar->cur_value, &bar->cur_value_anim, anim); -} - -void lv_bar_set_start_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_bar_t * bar = (lv_bar_t *)obj; - - if(bar->mode != LV_BAR_MODE_RANGE) { - return; - } - - value = LV_CLAMP(bar->min_value, value, bar->max_value); - value = value > bar->cur_value ? bar->cur_value : value; /*Can't be greater than the right value*/ - - if(bar->start_value == value) return; - - lv_bar_set_value_with_anim(obj, value, &bar->start_value, &bar->start_value_anim, anim); -} - -void lv_bar_set_range(lv_obj_t * obj, int32_t min, int32_t max) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_bar_t * bar = (lv_bar_t *)obj; - - bar->val_reversed = min > max; - - int32_t real_min = bar->val_reversed ? max : min; - int32_t real_max = bar->val_reversed ? min : max; - if(bar->min_value == real_min && bar->max_value == real_max) return; - - bar->max_value = real_max; - bar->min_value = real_min; - - if(lv_bar_get_mode(obj) != LV_BAR_MODE_RANGE) - bar->start_value = real_min; - - if(bar->cur_value > real_max) { - bar->cur_value = real_max; - lv_bar_set_value(obj, bar->cur_value, LV_ANIM_OFF); - } - if(bar->cur_value < real_min) { - bar->cur_value = real_min; - lv_bar_set_value(obj, bar->cur_value, LV_ANIM_OFF); - } - - lv_obj_invalidate(obj); -} - -void lv_bar_set_mode(lv_obj_t * obj, lv_bar_mode_t mode) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_bar_t * bar = (lv_bar_t *)obj; - - bar->mode = mode; - if(bar->mode != LV_BAR_MODE_RANGE) { - bar->start_value = bar->min_value; - } - - lv_obj_invalidate(obj); -} - -void lv_bar_set_orientation(lv_obj_t * obj, lv_bar_orientation_t orientation) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_bar_t * bar = (lv_bar_t *)obj; - - bar->orientation = orientation; - lv_obj_invalidate(obj); -} - -/*===================== - * Getter functions - *====================*/ - -int32_t lv_bar_get_value(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_bar_t * bar = (lv_bar_t *)obj; - - return LV_BAR_GET_ANIM_VALUE(bar->cur_value, bar->cur_value_anim); -} - -int32_t lv_bar_get_start_value(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_bar_t * bar = (lv_bar_t *)obj; - - if(bar->mode != LV_BAR_MODE_RANGE) return bar->min_value; - - return LV_BAR_GET_ANIM_VALUE(bar->start_value, bar->start_value_anim); -} - -int32_t lv_bar_get_min_value(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_bar_t * bar = (lv_bar_t *)obj; - return bar->val_reversed ? bar->max_value : bar->min_value; -} - -int32_t lv_bar_get_max_value(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_bar_t * bar = (lv_bar_t *)obj; - - return bar->val_reversed ? bar->min_value : bar->max_value; -} - -lv_bar_mode_t lv_bar_get_mode(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_bar_t * bar = (lv_bar_t *)obj; - - return bar->mode; -} - -lv_bar_orientation_t lv_bar_get_orientation(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_bar_t * bar = (lv_bar_t *)obj; - - return bar->orientation; -} - -bool lv_bar_is_symmetrical(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_bar_t * bar = (lv_bar_t *)obj; - - return bar->mode == LV_BAR_MODE_SYMMETRICAL && bar->min_value < 0 && bar->max_value > 0 && - bar->start_value == bar->min_value; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_bar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_bar_t * bar = (lv_bar_t *)obj; - bar->min_value = 0; - bar->max_value = 100; - bar->start_value = 0; - bar->cur_value = 0; - bar->indic_area.x1 = 0; - bar->indic_area.x2 = 0; - bar->indic_area.y1 = 0; - bar->indic_area.y2 = 0; - bar->mode = LV_BAR_MODE_NORMAL; - bar->orientation = LV_BAR_ORIENTATION_AUTO; - bar->val_reversed = false; - - lv_bar_init_anim(obj, &bar->cur_value_anim); - lv_bar_init_anim(obj, &bar->start_value_anim); - - lv_obj_remove_flag(obj, LV_OBJ_FLAG_CHECKABLE); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); - lv_bar_set_value(obj, 0, LV_ANIM_OFF); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_bar_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_bar_t * bar = (lv_bar_t *)obj; - - lv_anim_delete(&bar->cur_value_anim, NULL); - lv_anim_delete(&bar->start_value_anim, NULL); -} - -static void draw_indic(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_bar_t * bar = (lv_bar_t *)obj; - - lv_layer_t * layer = lv_event_get_layer(e); - - lv_area_t bar_coords; - lv_obj_get_coords(obj, &bar_coords); - - int32_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); - int32_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); - lv_area_increase(&bar_coords, transf_w, transf_h); - int32_t barw = lv_area_get_width(&bar_coords); - int32_t barh = lv_area_get_height(&bar_coords); - int32_t range = bar->max_value - bar->min_value; - - /*Prevent division by 0*/ - if(range == 0) { - range = 1; - } - - bool hor = false; - switch(bar->orientation) { - case LV_BAR_ORIENTATION_HORIZONTAL: - hor = true; - break; - case LV_BAR_ORIENTATION_VERTICAL: - hor = false; - break; - case LV_BAR_ORIENTATION_AUTO: - default: - hor = (barw >= barh); - break; - } - - bool sym = lv_bar_is_symmetrical(obj); - - /*Calculate the indicator area*/ - int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - - /*Respect padding and minimum width/height too*/ - lv_area_copy(&bar->indic_area, &bar_coords); - bar->indic_area.x1 += bg_left; - bar->indic_area.x2 -= bg_right; - bar->indic_area.y1 += bg_top; - bar->indic_area.y2 -= bg_bottom; - - if(hor && lv_area_get_height(&bar->indic_area) < LV_BAR_SIZE_MIN) { - bar->indic_area.y1 = obj->coords.y1 + (barh / 2) - (LV_BAR_SIZE_MIN / 2); - bar->indic_area.y2 = bar->indic_area.y1 + LV_BAR_SIZE_MIN; - } - else if(!hor && lv_area_get_width(&bar->indic_area) < LV_BAR_SIZE_MIN) { - bar->indic_area.x1 = obj->coords.x1 + (barw / 2) - (LV_BAR_SIZE_MIN / 2); - bar->indic_area.x2 = bar->indic_area.x1 + LV_BAR_SIZE_MIN; - } - int32_t indic_max_w = lv_area_get_width(&bar->indic_area); - int32_t indic_max_h = lv_area_get_height(&bar->indic_area); - - /*Calculate the indicator length*/ - int32_t anim_length = hor ? indic_max_w : indic_max_h; - - int32_t anim_cur_value_x, anim_start_value_x; - - int32_t * axis1, * axis2; - int32_t (*indic_length_calc)(const lv_area_t * area); - - if(hor) { - axis1 = &bar->indic_area.x1; - axis2 = &bar->indic_area.x2; - indic_length_calc = lv_area_get_width; - } - else { - axis1 = &bar->indic_area.y1; - axis2 = &bar->indic_area.y2; - indic_length_calc = lv_area_get_height; - } - - if(LV_BAR_IS_ANIMATING(bar->start_value_anim)) { - int32_t anim_start_value_start_x = - (int32_t)((int32_t)anim_length * (bar->start_value_anim.anim_start - bar->min_value)) / range; - int32_t anim_start_value_end_x = - (int32_t)((int32_t)anim_length * (bar->start_value_anim.anim_end - bar->min_value)) / range; - - anim_start_value_x = (((anim_start_value_end_x - anim_start_value_start_x) * bar->start_value_anim.anim_state) / - LV_BAR_ANIM_STATE_END); - - anim_start_value_x += anim_start_value_start_x; - } - else { - anim_start_value_x = (int32_t)((int32_t)anim_length * (bar->start_value - bar->min_value)) / range; - } - - if(LV_BAR_IS_ANIMATING(bar->cur_value_anim)) { - int32_t anim_cur_value_start_x = - (int32_t)((int32_t)anim_length * (bar->cur_value_anim.anim_start - bar->min_value)) / range; - int32_t anim_cur_value_end_x = - (int32_t)((int32_t)anim_length * (bar->cur_value_anim.anim_end - bar->min_value)) / range; - - anim_cur_value_x = anim_cur_value_start_x + (((anim_cur_value_end_x - anim_cur_value_start_x) * - bar->cur_value_anim.anim_state) / - LV_BAR_ANIM_STATE_END); - } - else { - anim_cur_value_x = (int32_t)((int32_t)anim_length * (bar->cur_value - bar->min_value)) / range; - } - - /** - * The drawing direction of the bar can be reversed only when one of the two conditions(value inversion - * or horizontal direction base dir is LV_BASE_DIR_RTL) is met. - */ - lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); - bool hor_need_reversed = hor && base_dir == LV_BASE_DIR_RTL; - bool reversed = bar->val_reversed ^ hor_need_reversed; - - if(reversed) { - /*Swap axes*/ - int32_t * tmp; - tmp = axis1; - axis1 = axis2; - axis2 = tmp; - anim_cur_value_x = -anim_cur_value_x; - anim_start_value_x = -anim_start_value_x; - } - - /*Set the indicator length*/ - if(hor) { - *axis2 = *axis1 + anim_cur_value_x; - *axis1 += anim_start_value_x; - } - else { - *axis1 = *axis2 - anim_cur_value_x + 1; - *axis2 -= anim_start_value_x; - } - - if(sym) { - int32_t zero, shift; - shift = (-bar->min_value * anim_length) / range; - - if(hor) { - int32_t * left = reversed ? axis2 : axis1; - int32_t * right = reversed ? axis1 : axis2; - if(reversed) - zero = *axis1 - shift + 1; - else - zero = *axis1 + shift; - - if(*axis2 > zero) { - *right = *axis2; - *left = zero; - } - else { - *left = *axis2; - *right = zero; - } - } - else { - int32_t * top = reversed ? axis2 : axis1; - int32_t * bottom = reversed ? axis1 : axis2; - if(reversed) - zero = *axis2 + shift; - else - zero = *axis2 - shift + 1; - - if(*axis1 > zero) { - *bottom = *axis1; - *top = zero; - } - else { - *top = *axis1; - *bottom = zero; - } - } - } - - /*Do not draw a zero length indicator but at least call the draw task event*/ - if(!sym && indic_length_calc(&bar->indic_area) <= 1) { - lv_obj_send_event(obj, LV_EVENT_DRAW_TASK_ADDED, NULL); - return; - } - - lv_area_t indic_area; - lv_area_copy(&indic_area, &bar->indic_area); - - lv_draw_rect_dsc_t draw_rect_dsc; - lv_draw_rect_dsc_init(&draw_rect_dsc); - lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &draw_rect_dsc); - - int32_t bg_radius = lv_obj_get_style_radius(obj, LV_PART_MAIN); - int32_t short_side = LV_MIN(barw, barh); - if(bg_radius > short_side >> 1) bg_radius = short_side >> 1; - - int32_t indic_radius = draw_rect_dsc.radius; - short_side = LV_MIN(lv_area_get_width(&bar->indic_area), lv_area_get_height(&bar->indic_area)); - if(indic_radius > short_side >> 1) indic_radius = short_side >> 1; - - /*Cases: - * Simple: - * - indicator area is the same or smaller then the bg - * - indicator has the same or larger radius than the bg - * - what to do? just draw the indicator - * Radius issue: - * - indicator area is the same or smaller then bg - * - indicator has smaller radius than the bg and the indicator overflows on the corners - * - what to do? draw the indicator on a layer and clip to bg radius - * Larger indicator: - * - indicator area is the larger then the bg - * - radius doesn't matter - * - shadow doesn't matter - * - what to do? just draw the indicator - * Shadow: - * - indicator area is the same or smaller then the bg - * - indicator has the same or larger radius than the bg (shadow needs to be drawn on strange clipped shape) - * - what to do? don't draw the shadow if the indicator is too small has strange shape - * Gradient: - * - the indicator has a gradient - * - what to do? draw it on a bg sized layer clip the indicator are from the gradient - * - */ - - bool mask_needed = false; - if(hor && draw_rect_dsc.bg_grad.dir == LV_GRAD_DIR_HOR) mask_needed = true; - else if(!hor && draw_rect_dsc.bg_grad.dir == LV_GRAD_DIR_VER) mask_needed = true; - - if(draw_rect_dsc.bg_image_src) mask_needed = true; - - bool radius_issue = true; - /*The indicator is fully drawn if it's larger than the bg*/ - if((bg_left < 0 || bg_right < 0 || bg_top < 0 || bg_bottom < 0)) radius_issue = false; - else if(indic_radius >= bg_radius) radius_issue = false; - else if(lv_area_is_in(&indic_area, &bar_coords, bg_radius)) radius_issue = false; - - if(radius_issue || mask_needed) { - if(!radius_issue) { - /*Draw only the shadow*/ - lv_draw_rect_dsc_t draw_tmp_dsc = draw_rect_dsc; - draw_tmp_dsc.border_opa = 0; - draw_tmp_dsc.outline_opa = 0; - draw_tmp_dsc.bg_opa = 0; - draw_tmp_dsc.bg_image_opa = 0; - lv_draw_rect(layer, &draw_tmp_dsc, &indic_area); - } - else { - draw_rect_dsc.border_opa = 0; - draw_rect_dsc.outline_opa = 0; - } - draw_rect_dsc.shadow_opa = 0; - - /*If clipped for any reason cannot the border, outline, and shadow - *as they would be clipped and looked ugly*/ - lv_draw_rect_dsc_t draw_tmp_dsc = draw_rect_dsc; - draw_tmp_dsc.border_opa = 0; - draw_tmp_dsc.outline_opa = 0; - draw_tmp_dsc.shadow_opa = 0; - lv_area_t indic_draw_area = indic_area; - if(mask_needed) { - if(hor) { - indic_draw_area.x1 = bar_coords.x1 + bg_left; - indic_draw_area.x2 = bar_coords.x2 - bg_right; - } - else { - indic_draw_area.y1 = bar_coords.y1 + bg_top; - indic_draw_area.y2 = bar_coords.y2 - bg_bottom; - } - draw_tmp_dsc.radius = 0; - } - - lv_layer_t * layer_indic = lv_draw_layer_create(layer, LV_COLOR_FORMAT_ARGB8888, &indic_draw_area); - - lv_draw_rect(layer_indic, &draw_tmp_dsc, &indic_draw_area); - - lv_draw_mask_rect_dsc_t mask_dsc; - lv_draw_mask_rect_dsc_init(&mask_dsc); - if(radius_issue) { - mask_dsc.area = bar_coords; - mask_dsc.radius = bg_radius; - lv_draw_mask_rect(layer_indic, &mask_dsc); - } - - if(mask_needed) { - mask_dsc.area = indic_area; - mask_dsc.radius = indic_radius; - lv_draw_mask_rect(layer_indic, &mask_dsc); - } - - lv_draw_image_dsc_t layer_draw_dsc; - lv_draw_image_dsc_init(&layer_draw_dsc); - layer_draw_dsc.src = layer_indic; - lv_draw_layer(layer, &layer_draw_dsc, &indic_draw_area); - - /*Add the border, outline, and shadow only to the indicator area. - *They might have disabled if there is a radius_issue*/ - draw_tmp_dsc = draw_rect_dsc; - draw_tmp_dsc.bg_opa = 0; - draw_tmp_dsc.bg_image_opa = 0; - lv_draw_rect(layer, &draw_tmp_dsc, &indic_area); - } - else { - lv_draw_rect(layer, &draw_rect_dsc, &indic_area); - } -} - -static void lv_bar_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - - /*Call the ancestor's event handler*/ - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - - if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - int32_t indic_size; - indic_size = lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR); - - /*Bg size is handled by lv_obj*/ - int32_t * s = lv_event_get_param(e); - *s = LV_MAX(*s, indic_size); - - /*Calculate the indicator area*/ - int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - - int32_t pad = LV_MIN4(bg_left, bg_right, bg_top, bg_bottom); - if(pad < 0) { - *s = *s - pad; - } - } - else if(code == LV_EVENT_PRESSED || code == LV_EVENT_RELEASED) { - lv_bar_t * bar = (lv_bar_t *)obj; - lv_obj_invalidate_area(obj, &bar->indic_area); - } - else if(code == LV_EVENT_DRAW_MAIN) { - draw_indic(e); - } -} - -static void lv_bar_anim(void * var, int32_t value) -{ - lv_bar_anim_t * bar_anim = var; - bar_anim->anim_state = value; - lv_obj_invalidate(bar_anim->bar); -} - -static void lv_bar_anim_completed(lv_anim_t * a) -{ - lv_bar_anim_t * var = a->var; - lv_obj_t * obj = (lv_obj_t *)var->bar; - lv_bar_t * bar = (lv_bar_t *)obj; - - var->anim_state = LV_BAR_ANIM_STATE_INV; - if(var == &bar->cur_value_anim) - bar->cur_value = var->anim_end; - else if(var == &bar->start_value_anim) - bar->start_value = var->anim_end; - lv_obj_invalidate(var->bar); -} - -static void lv_bar_set_value_with_anim(lv_obj_t * obj, int32_t new_value, int32_t * value_ptr, - lv_bar_anim_t * anim_info, lv_anim_enable_t en) -{ - if(en == LV_ANIM_OFF) { - lv_anim_delete(anim_info, NULL); - anim_info->anim_state = LV_BAR_ANIM_STATE_INV; - *value_ptr = new_value; - lv_obj_invalidate((lv_obj_t *)obj); - - /*Stop the previous animation if it exists*/ - lv_anim_delete(anim_info, NULL); - /*Reset animation state*/ - lv_bar_init_anim(obj, anim_info); - } - else { - /*No animation in progress -> simply set the values*/ - if(anim_info->anim_state == LV_BAR_ANIM_STATE_INV) { - anim_info->anim_start = *value_ptr; - anim_info->anim_end = new_value; - } - /*Animation in progress. Start from the animation end value*/ - else { - anim_info->anim_start = anim_info->anim_end; - anim_info->anim_end = new_value; - } - *value_ptr = new_value; - /*Stop the previous animation if it exists*/ - lv_anim_delete(anim_info, NULL); - - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, anim_info); - lv_anim_set_exec_cb(&a, lv_bar_anim); - lv_anim_set_values(&a, LV_BAR_ANIM_STATE_START, LV_BAR_ANIM_STATE_END); - lv_anim_set_completed_cb(&a, lv_bar_anim_completed); - lv_anim_set_duration(&a, lv_obj_get_style_anim_duration(obj, LV_PART_MAIN)); - lv_anim_start(&a); - } -} - -static void lv_bar_init_anim(lv_obj_t * obj, lv_bar_anim_t * bar_anim) -{ - bar_anim->bar = obj; - bar_anim->anim_start = 0; - bar_anim->anim_end = 0; - bar_anim->anim_state = LV_BAR_ANIM_STATE_INV; -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/bar/lv_bar.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/bar/lv_bar.h deleted file mode 100644 index 93c8878..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/bar/lv_bar.h +++ /dev/null @@ -1,162 +0,0 @@ -/** - * @file lv_bar.h - * - */ - -#ifndef LV_BAR_H -#define LV_BAR_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -#if LV_USE_BAR != 0 - -#include "../../core/lv_obj.h" -#include "../../misc/lv_anim.h" -#include "../label/lv_label.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef enum { - LV_BAR_MODE_NORMAL, - LV_BAR_MODE_SYMMETRICAL, - LV_BAR_MODE_RANGE -} lv_bar_mode_t; - -typedef enum { - LV_BAR_ORIENTATION_AUTO, - LV_BAR_ORIENTATION_HORIZONTAL, - LV_BAR_ORIENTATION_VERTICAL -} lv_bar_orientation_t; - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_bar_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a bar object - * @param parent pointer to an object, it will be the parent of the new bar - * @return pointer to the created bar - */ -lv_obj_t * lv_bar_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new value on the bar - * @param obj pointer to a bar object - * @param value new value - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -void lv_bar_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim); - -/** - * Set a new start value on the bar - * @param obj pointer to a bar object - * @param start_value new start value - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -void lv_bar_set_start_value(lv_obj_t * obj, int32_t start_value, lv_anim_enable_t anim); - -/** - * Set minimum and the maximum values of a bar - * @param obj pointer to the bar object - * @param min minimum value - * @param max maximum value - * @note If min is greater than max, the drawing direction becomes to the opposite direction. - */ -void lv_bar_set_range(lv_obj_t * obj, int32_t min, int32_t max); - -/** - * Set the type of bar. - * @param obj pointer to bar object - * @param mode bar type from ::lv_bar_mode_t - */ -void lv_bar_set_mode(lv_obj_t * obj, lv_bar_mode_t mode); - -/** - * Set the orientation of bar. - * @param obj pointer to bar object - * @param orientation bar orientation from `lv_bar_orientation_t` - */ -void lv_bar_set_orientation(lv_obj_t * obj, lv_bar_orientation_t orientation); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the value of a bar - * @param obj pointer to a bar object - * @return the value of the bar - */ -int32_t lv_bar_get_value(const lv_obj_t * obj); - -/** - * Get the start value of a bar - * @param obj pointer to a bar object - * @return the start value of the bar - */ -int32_t lv_bar_get_start_value(const lv_obj_t * obj); - -/** - * Get the minimum value of a bar - * @param obj pointer to a bar object - * @return the minimum value of the bar - */ -int32_t lv_bar_get_min_value(const lv_obj_t * obj); - -/** - * Get the maximum value of a bar - * @param obj pointer to a bar object - * @return the maximum value of the bar - */ -int32_t lv_bar_get_max_value(const lv_obj_t * obj); - -/** - * Get the type of bar. - * @param obj pointer to bar object - * @return bar type from ::lv_bar_mode_t - */ -lv_bar_mode_t lv_bar_get_mode(lv_obj_t * obj); - -/** - * Get the orientation of bar. - * @param obj pointer to bar object - * @return bar orientation from ::lv_bar_orientation_t - */ -lv_bar_orientation_t lv_bar_get_orientation(lv_obj_t * obj); - -/** - * Give the bar is in symmetrical mode or not - * @param obj pointer to bar object - * @return true: in symmetrical mode false : not in -*/ -bool lv_bar_is_symmetrical(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_BAR*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_BAR_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/bar/lv_bar_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/bar/lv_bar_private.h deleted file mode 100644 index 1a8dd4b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/bar/lv_bar_private.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @file lv_bar_private.h - * - */ - -#ifndef LV_BAR_PRIVATE_H -#define LV_BAR_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_bar.h" - -#if LV_USE_BAR != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_bar_anim_t { - lv_obj_t * bar; - int32_t anim_start; - int32_t anim_end; - int32_t anim_state; -}; - -struct lv_bar_t { - lv_obj_t obj; - int32_t cur_value; /**< Current value of the bar*/ - int32_t min_value; /**< Minimum value of the bar*/ - int32_t max_value; /**< Maximum value of the bar*/ - int32_t start_value; /**< Start value of the bar*/ - lv_area_t indic_area; /**< Save the indicator area. Might be used by derived types*/ - bool val_reversed; /**< Whether value been reversed */ - lv_bar_anim_t cur_value_anim; - lv_bar_anim_t start_value_anim; - lv_bar_mode_t mode : 3; /**< Type of bar*/ - lv_bar_orientation_t orientation : 3; /**< Orientation of bar*/ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_BAR != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_BAR_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/button/lv_button.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/button/lv_button.c deleted file mode 100644 index 096dc29..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/button/lv_button.c +++ /dev/null @@ -1,72 +0,0 @@ -/** - * @file lv_btn.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_button_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_BUTTON != 0 - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_button_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_button_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_button_class = { - .constructor_cb = lv_button_constructor, - .width_def = LV_SIZE_CONTENT, - .height_def = LV_SIZE_CONTENT, - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .instance_size = sizeof(lv_button_t), - .base_class = &lv_obj_class, - .name = "btn", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_button_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_button_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); - - LV_TRACE_OBJ_CREATE("finished"); -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/button/lv_button.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/button/lv_button.h deleted file mode 100644 index eb7a0a5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/button/lv_button.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @file lv_button.h - * - */ - -#ifndef LV_BUTTON_H -#define LV_BUTTON_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -#if LV_USE_BUTTON != 0 -#include "../../core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_button_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a button object - * @param parent pointer to an object, it will be the parent of the new button - * @return pointer to the created button - */ -lv_obj_t * lv_button_create(lv_obj_t * parent); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_BUTTON*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_BUTTON_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/button/lv_button_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/button/lv_button_private.h deleted file mode 100644 index ce310f3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/button/lv_button_private.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @file lv_button_private.h - * - */ - -#ifndef LV_BUTTON_PRIVATE_H -#define LV_BUTTON_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_button.h" - -#if LV_USE_BUTTON != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_button_t { - lv_obj_t obj; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_BUTTON != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_BUTTON_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/buttonmatrix/lv_buttonmatrix.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/buttonmatrix/lv_buttonmatrix.c deleted file mode 100644 index e20ac2e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/buttonmatrix/lv_buttonmatrix.c +++ /dev/null @@ -1,1045 +0,0 @@ -/** - * @file lv_btnmatrix.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_buttonmatrix_private.h" -#include "../../misc/lv_area_private.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_BUTTONMATRIX != 0 - -#include "../../misc/lv_assert.h" -#include "../../indev/lv_indev.h" -#include "../../core/lv_group.h" -#include "../../draw/lv_draw.h" -#include "../../core/lv_refr.h" -#include "../../misc/lv_text.h" -#include "../../misc/lv_text_ap.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_buttonmatrix_class) - -#define BTN_EXTRA_CLICK_AREA_MAX (LV_DPI_DEF / 10) -#define LV_BUTTONMATRIX_WIDTH_MASK 0x000F - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_buttonmatrix_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_buttonmatrix_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_buttonmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void draw_main(lv_event_t * e); - -static uint32_t get_button_width(lv_buttonmatrix_ctrl_t ctrl_bits); -static bool button_is_hidden(lv_buttonmatrix_ctrl_t ctrl_bits); -static bool button_is_checked(lv_buttonmatrix_ctrl_t ctrl_bits); -static bool button_is_repeat_disabled(lv_buttonmatrix_ctrl_t ctrl_bits); -static bool button_is_inactive(lv_buttonmatrix_ctrl_t ctrl_bits); -static bool button_is_click_trig(lv_buttonmatrix_ctrl_t ctrl_bits); -static bool button_is_popover(lv_buttonmatrix_ctrl_t ctrl_bits); -static bool button_is_checkable(lv_buttonmatrix_ctrl_t ctrl_bits); -static bool button_get_checked(lv_buttonmatrix_ctrl_t ctrl_bits); -static uint32_t get_button_from_point(lv_obj_t * obj, lv_point_t * p); -static void allocate_button_areas_and_controls(const lv_obj_t * obj, const char * const * map); -static void invalidate_button_area(const lv_obj_t * obj, uint32_t btn_idx); -static void make_one_button_checked(lv_obj_t * obj, uint32_t btn_idx); -static bool has_popovers_in_top_row(lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ -#if LV_WIDGETS_HAS_DEFAULT_VALUE -static const char * const lv_buttonmatrix_def_map[] = {"Btn1", "Btn2", "Btn3", "\n", "Btn4", "Btn5", ""}; -#endif - -const lv_obj_class_t lv_buttonmatrix_class = { - .constructor_cb = lv_buttonmatrix_constructor, - .destructor_cb = lv_buttonmatrix_destructor, - .event_cb = lv_buttonmatrix_event, - .width_def = LV_DPI_DEF * 2, - .height_def = LV_DPI_DEF, - .instance_size = sizeof(lv_buttonmatrix_t), - .editable = LV_OBJ_CLASS_EDITABLE_TRUE, - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .base_class = &lv_obj_class, - .name = "btnmatrix", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_buttonmatrix_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_buttonmatrix_set_map(lv_obj_t * obj, const char * const map[]) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - if(map == NULL) return; - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - - /*Analyze the map and create the required number of buttons*/ - allocate_button_areas_and_controls(obj, map); - btnm->map_p = map; - - lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); - - /*Set size and positions of the buttons*/ - int32_t sleft = lv_obj_get_style_space_left(obj, LV_PART_MAIN); - int32_t stop = lv_obj_get_style_space_top(obj, LV_PART_MAIN); - int32_t prow = lv_obj_get_style_pad_row(obj, LV_PART_MAIN); - int32_t pcol = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); - - int32_t max_w = lv_obj_get_content_width(obj); - int32_t max_h = lv_obj_get_content_height(obj); - - /*Calculate the position of each row*/ - int32_t max_h_no_gap = max_h - (prow * (btnm->row_cnt - 1)); - - /*Count the units and the buttons in a line - *(A button can be 1,2,3... unit wide)*/ - uint32_t txt_tot_i = 0; /*Act. index in the str map*/ - uint32_t btn_tot_i = 0; /*Act. index of button areas*/ - const char * const * map_row = map; - - /*Count the units and the buttons in a line*/ - uint32_t row; - for(row = 0; row < btnm->row_cnt; row++) { - uint32_t unit_cnt = 0; /*Number of units in a row*/ - uint32_t btn_cnt = 0; /*Number of buttons in a row*/ - /*Count the buttons and units in this row*/ - while(map_row[btn_cnt] && lv_strcmp(map_row[btn_cnt], "\n") != 0 && map_row[btn_cnt][0] != '\0') { - unit_cnt += get_button_width(btnm->ctrl_bits[btn_tot_i + btn_cnt]); - btn_cnt++; - } - - /*Only deal with the non empty lines*/ - if(btn_cnt == 0) { - map_row = &map_row[btn_cnt + 1]; /*Set the map to the next row*/ - continue; - } - - int32_t row_y1 = stop + (max_h_no_gap * row) / btnm->row_cnt + row * prow; - int32_t row_y2 = stop + (max_h_no_gap * (row + 1)) / btnm->row_cnt + row * prow - 1; - - /*Set the button size and positions*/ - int32_t max_w_no_gap = max_w - (pcol * (btn_cnt - 1)); - if(max_w_no_gap < 0) max_w_no_gap = 0; - - uint32_t row_unit_cnt = 0; /*The current unit position in the row*/ - uint32_t btn; - for(btn = 0; btn < btn_cnt; btn++, btn_tot_i++, txt_tot_i++) { - uint32_t btn_u = get_button_width(btnm->ctrl_bits[btn_tot_i]); - - int32_t btn_x1 = (max_w_no_gap * row_unit_cnt) / unit_cnt + btn * pcol; - int32_t btn_x2 = (max_w_no_gap * (row_unit_cnt + btn_u)) / unit_cnt + btn * pcol - 1; - - /*If RTL start from the right*/ - if(base_dir == LV_BASE_DIR_RTL) { - int32_t tmp = btn_x1; - btn_x1 = btn_x2; - btn_x2 = tmp; - - btn_x1 = max_w - btn_x1; - btn_x2 = max_w - btn_x2; - } - - btn_x1 += sleft; - btn_x2 += sleft; - - lv_area_set(&btnm->button_areas[btn_tot_i], btn_x1, row_y1, btn_x2, row_y2); - - row_unit_cnt += btn_u; - } - - map_row = &map_row[btn_cnt + 1]; /*Set the map to the next line*/ - } - - /*Popovers in the top row will draw outside the widget and the extended draw size depends on - *the row height which may have changed when setting the new map*/ - lv_obj_refresh_ext_draw_size(obj); - - lv_obj_invalidate(obj); -} - -void lv_buttonmatrix_set_ctrl_map(lv_obj_t * obj, const lv_buttonmatrix_ctrl_t ctrl_map[]) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - lv_memcpy(btnm->ctrl_bits, ctrl_map, sizeof(lv_buttonmatrix_ctrl_t) * btnm->btn_cnt); - - lv_buttonmatrix_set_map(obj, btnm->map_p); -} - -void lv_buttonmatrix_set_selected_button(lv_obj_t * obj, uint32_t btn_id) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - - if(btn_id >= btnm->btn_cnt && btn_id != LV_BUTTONMATRIX_BUTTON_NONE) return; - - invalidate_button_area(obj, btnm->btn_id_sel); - btnm->btn_id_sel = btn_id; - invalidate_button_area(obj, btn_id); -} - -void lv_buttonmatrix_set_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - - if(btn_id >= btnm->btn_cnt) return; - - if(btnm->one_check && (ctrl & LV_BUTTONMATRIX_CTRL_CHECKED)) { - lv_buttonmatrix_clear_button_ctrl_all(obj, LV_BUTTONMATRIX_CTRL_CHECKED); - } - - btnm->ctrl_bits[btn_id] |= ctrl; - invalidate_button_area(obj, btn_id); - - if(ctrl & LV_BUTTONMATRIX_CTRL_POPOVER) { - lv_obj_refresh_ext_draw_size(obj); - } -} - -void lv_buttonmatrix_clear_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - - if(btn_id >= btnm->btn_cnt) return; - - btnm->ctrl_bits[btn_id] &= (~ctrl); - invalidate_button_area(obj, btn_id); - - if(ctrl & LV_BUTTONMATRIX_CTRL_POPOVER) { - lv_obj_refresh_ext_draw_size(obj); - } -} - -void lv_buttonmatrix_set_button_ctrl_all(lv_obj_t * obj, lv_buttonmatrix_ctrl_t ctrl) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - uint32_t i; - for(i = 0; i < btnm->btn_cnt; i++) { - lv_buttonmatrix_set_button_ctrl(obj, i, ctrl); - } -} - -void lv_buttonmatrix_clear_button_ctrl_all(lv_obj_t * obj, lv_buttonmatrix_ctrl_t ctrl) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - uint32_t i; - for(i = 0; i < btnm->btn_cnt; i++) { - lv_buttonmatrix_clear_button_ctrl(obj, i, ctrl); - } -} - -void lv_buttonmatrix_set_button_width(lv_obj_t * obj, uint32_t btn_id, uint32_t width) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - if(btn_id >= btnm->btn_cnt) return; - btnm->ctrl_bits[btn_id] &= (~LV_BUTTONMATRIX_WIDTH_MASK); - btnm->ctrl_bits[btn_id] |= (LV_BUTTONMATRIX_WIDTH_MASK & width); - - lv_buttonmatrix_set_map(obj, btnm->map_p); -} - -void lv_buttonmatrix_set_one_checked(lv_obj_t * obj, bool en) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - btnm->one_check = en; - - /*If more than one button is toggled only the first one should be*/ - make_one_button_checked(obj, 0); -} - -/*===================== - * Getter functions - *====================*/ - -const char * const * lv_buttonmatrix_get_map(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - return btnm->map_p; -} - -uint32_t lv_buttonmatrix_get_selected_button(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - return btnm->btn_id_sel; -} - -const char * lv_buttonmatrix_get_button_text(const lv_obj_t * obj, uint32_t btn_id) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - if(btn_id == LV_BUTTONMATRIX_BUTTON_NONE) return NULL; - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - if(btn_id > btnm->btn_cnt) return NULL; - - uint32_t txt_i = 0; - uint32_t btn_i = 0; - - /*Search the text of btnm->btn_pr the buttons text in the map - *Skip "\n"-s*/ - while(btn_i != btn_id) { - btn_i++; - txt_i++; - if(lv_strcmp(btnm->map_p[txt_i], "\n") == 0) txt_i++; - } - - if(btn_i == btnm->btn_cnt) return NULL; - - return btnm->map_p[txt_i]; -} - -bool lv_buttonmatrix_has_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - if(btn_id >= btnm->btn_cnt) return false; - - return (btnm->ctrl_bits[btn_id] & ctrl) == ctrl; -} - -bool lv_buttonmatrix_get_one_checked(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - - return btnm->one_check; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_buttonmatrix_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - btnm->btn_cnt = 0; - btnm->row_cnt = 0; - btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; - btnm->button_areas = NULL; - btnm->ctrl_bits = NULL; - btnm->map_p = NULL; - btnm->one_check = 0; - -#if LV_WIDGETS_HAS_DEFAULT_VALUE - lv_buttonmatrix_set_map(obj, lv_buttonmatrix_def_map); -#endif - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_buttonmatrix_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_TRACE_OBJ_CREATE("begin"); - LV_UNUSED(class_p); - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - lv_free(btnm->button_areas); - lv_free(btnm->ctrl_bits); - btnm->button_areas = NULL; - btnm->ctrl_bits = NULL; - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_buttonmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - - /*Call the ancestor's event handler*/ - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - lv_point_t p; - - if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - if(has_popovers_in_top_row(obj)) { - /*reserve one row worth of extra space to account for popovers in the top row*/ - int32_t s = btnm->row_cnt > 0 ? lv_obj_get_content_height(obj) / btnm->row_cnt : 0; - lv_event_set_ext_draw_size(e, s); - } - } - if(code == LV_EVENT_STYLE_CHANGED) { - lv_buttonmatrix_set_map(obj, btnm->map_p); - } - else if(code == LV_EVENT_SIZE_CHANGED) { - lv_buttonmatrix_set_map(obj, btnm->map_p); - } - else if(code == LV_EVENT_PRESSED) { - lv_indev_t * indev = lv_event_get_indev(e); - invalidate_button_area(obj, btnm->btn_id_sel); - - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); - if(indev_type == LV_INDEV_TYPE_POINTER || indev_type == LV_INDEV_TYPE_BUTTON) { - uint32_t btn_pr; - /*Search the pressed area*/ - lv_indev_get_point(indev, &p); - btn_pr = get_button_from_point(obj, &p); - /*Handle the case where there is no button there*/ - btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; - if(btn_pr != LV_BUTTONMATRIX_BUTTON_NONE) { - if(button_is_inactive(btnm->ctrl_bits[btn_pr]) == false && - button_is_hidden(btnm->ctrl_bits[btn_pr]) == false) { - btnm->btn_id_sel = btn_pr; - invalidate_button_area(obj, btnm->btn_id_sel); /*Invalidate the new area*/ - } - } - else { - btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; - } - } - - if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) { - if(button_is_click_trig(btnm->ctrl_bits[btnm->btn_id_sel]) == false && - button_is_popover(btnm->ctrl_bits[btnm->btn_id_sel]) == false && - button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel]) == false && - button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) == false) { - uint32_t b = btnm->btn_id_sel; - res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &b); - if(res != LV_RESULT_OK) return; - } - } - } - else if(code == LV_EVENT_PRESSING) { - /*If a slid to a new button, discard the current button and don't press any buttons*/ - if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) { - lv_indev_t * indev = lv_event_get_indev(e); - lv_indev_get_point(indev, &p); - uint32_t btn_pr = get_button_from_point(obj, &p); - if(btn_pr != btnm->btn_id_sel) { - invalidate_button_area(obj, btnm->btn_id_sel); /*Invalidate the old area*/ - btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; - } - } - } - else if(code == LV_EVENT_RELEASED) { - if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) { - /*Toggle the button if enabled*/ - if(button_is_checkable(btnm->ctrl_bits[btnm->btn_id_sel]) && - !button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { - if(button_get_checked(btnm->ctrl_bits[btnm->btn_id_sel]) && !btnm->one_check) { - btnm->ctrl_bits[btnm->btn_id_sel] &= (~LV_BUTTONMATRIX_CTRL_CHECKED); - } - else { - btnm->ctrl_bits[btnm->btn_id_sel] |= LV_BUTTONMATRIX_CTRL_CHECKED; - } - if(btnm->one_check) make_one_button_checked(obj, btnm->btn_id_sel); - } - - if((button_is_click_trig(btnm->ctrl_bits[btnm->btn_id_sel]) == true || - button_is_popover(btnm->ctrl_bits[btnm->btn_id_sel]) == true) && - button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel]) == false && - button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) == false) { - uint32_t b = btnm->btn_id_sel; - res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &b); - if(res != LV_RESULT_OK) return; - } - } - - /*Invalidate to old pressed area*/; - invalidate_button_area(obj, btnm->btn_id_sel); - - } - else if(code == LV_EVENT_LONG_PRESSED_REPEAT) { - if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) { - if(button_is_repeat_disabled(btnm->ctrl_bits[btnm->btn_id_sel]) == false && - button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel]) == false && - button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) == false) { - uint32_t b = btnm->btn_id_sel; - res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &b); - if(res != LV_RESULT_OK) return; - } - } - } - else if(code == LV_EVENT_PRESS_LOST) { - invalidate_button_area(obj, btnm->btn_id_sel); - btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; - } - else if(code == LV_EVENT_FOCUSED) { - if(btnm->btn_cnt == 0) return; - - lv_indev_t * indev = lv_event_get_indev(e); - lv_indev_type_t indev_type = lv_indev_get_type(indev); - - /*If not focused by an input device assume the last input device*/ - if(indev == NULL) { - indev = lv_indev_get_next(NULL); - indev_type = lv_indev_get_type(indev); - } - - bool editing = lv_group_get_editing(lv_obj_get_group(obj)); - /*Focus the first button if there is not selected button*/ - if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) { - if(indev_type == LV_INDEV_TYPE_KEYPAD || (indev_type == LV_INDEV_TYPE_ENCODER && editing)) { - uint32_t b = 0; - if(btnm->one_check) { - while(b < btnm->btn_cnt && - (button_is_hidden(btnm->ctrl_bits[b]) || - button_is_inactive(btnm->ctrl_bits[b]) || - button_is_checked(btnm->ctrl_bits[b]) == false)) { - b++; - } - } - else { - while(b < btnm->btn_cnt && - (button_is_hidden(btnm->ctrl_bits[b]) || - button_is_inactive(btnm->ctrl_bits[b]))) { - b++; - } - } - - btnm->btn_id_sel = b; - } - else { - btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; - } - } - } - else if(code == LV_EVENT_DEFOCUSED || code == LV_EVENT_LEAVE) { - // TODO - // if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) invalidate_button_area(obj, btnm->btn_id_sel); - // btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; - } - else if(code == LV_EVENT_KEY) { - - invalidate_button_area(obj, btnm->btn_id_sel); - - uint32_t c = lv_event_get_key(e); - if(c == LV_KEY_RIGHT) { - if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) btnm->btn_id_sel = 0; - else btnm->btn_id_sel++; - if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; - - uint32_t btn_id_start = btnm->btn_id_sel; - while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { - btnm->btn_id_sel++; - if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; - - if(btnm->btn_id_sel == btn_id_start) { - btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; - break; - } - } - } - else if(c == LV_KEY_LEFT) { - if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) btnm->btn_id_sel = 0; - - if(btnm->btn_id_sel == 0) btnm->btn_id_sel = btnm->btn_cnt - 1; - else if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; - - uint32_t btn_id_start = btnm->btn_id_sel; - while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { - if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; - else btnm->btn_id_sel = btnm->btn_cnt - 1; - - if(btnm->btn_id_sel == btn_id_start) { - btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; - break; - } - } - } - else if(c == LV_KEY_DOWN) { - int32_t col_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); - /*Find the area below the current*/ - if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) { - btnm->btn_id_sel = 0; - while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { - btnm->btn_id_sel++; - if(btnm->btn_id_sel >= btnm->btn_cnt) { - btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; - break; - } - } - } - else { - uint32_t area_below; - int32_t pr_center = - btnm->button_areas[btnm->btn_id_sel].x1 + (lv_area_get_width(&btnm->button_areas[btnm->btn_id_sel]) >> 1); - - for(area_below = btnm->btn_id_sel; area_below < btnm->btn_cnt; area_below++) { - if(btnm->button_areas[area_below].y1 > btnm->button_areas[btnm->btn_id_sel].y1 && - pr_center >= btnm->button_areas[area_below].x1 && - pr_center <= btnm->button_areas[area_below].x2 + col_gap && - button_is_inactive(btnm->ctrl_bits[area_below]) == false && - button_is_hidden(btnm->ctrl_bits[area_below]) == false) { - break; - } - } - - if(area_below < btnm->btn_cnt) btnm->btn_id_sel = area_below; - } - } - else if(c == LV_KEY_UP) { - int32_t col_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); - /*Find the area below the current*/ - if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) { - btnm->btn_id_sel = 0; - while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { - btnm->btn_id_sel++; - if(btnm->btn_id_sel >= btnm->btn_cnt) { - btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; - break; - } - } - } - else { - int16_t area_above; - int32_t pr_center = - btnm->button_areas[btnm->btn_id_sel].x1 + (lv_area_get_width(&btnm->button_areas[btnm->btn_id_sel]) >> 1); - - for(area_above = btnm->btn_id_sel; area_above >= 0; area_above--) { - if(btnm->button_areas[area_above].y1 < btnm->button_areas[btnm->btn_id_sel].y1 && - pr_center >= btnm->button_areas[area_above].x1 - col_gap && - pr_center <= btnm->button_areas[area_above].x2 && - button_is_inactive(btnm->ctrl_bits[area_above]) == false && - button_is_hidden(btnm->ctrl_bits[area_above]) == false) { - break; - } - } - if(area_above >= 0) btnm->btn_id_sel = area_above; - } - } - - invalidate_button_area(obj, btnm->btn_id_sel); - } - else if(code == LV_EVENT_DRAW_MAIN) { - draw_main(e); - } - -} - -static void draw_main(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - if(btnm->btn_cnt == 0) return; - - lv_layer_t * layer = lv_event_get_layer(e); - obj->skip_trans = 1; - - lv_area_t area_obj; - lv_obj_get_coords(obj, &area_obj); - - lv_area_t btn_area; - - uint32_t btn_i = 0; - uint32_t txt_i = 0; - - lv_draw_rect_dsc_t draw_rect_dsc_act; - lv_draw_label_dsc_t draw_label_dsc_act; - - lv_draw_rect_dsc_t draw_rect_dsc_def; - lv_draw_label_dsc_t draw_label_dsc_def; - - lv_state_t state_ori = obj->state; - obj->state = LV_STATE_DEFAULT; - obj->skip_trans = 1; - lv_draw_rect_dsc_init(&draw_rect_dsc_def); - lv_draw_label_dsc_init(&draw_label_dsc_def); - lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &draw_rect_dsc_def); - lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &draw_label_dsc_def); - obj->skip_trans = 0; - obj->state = state_ori; - - int32_t ptop = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - int32_t pbottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - int32_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - -#if LV_USE_ARABIC_PERSIAN_CHARS - char txt_ap[256]; -#endif - - for(btn_i = 0; btn_i < btnm->btn_cnt; btn_i++, txt_i++) { - /*Search the next valid text in the map*/ - while(lv_strcmp(btnm->map_p[txt_i], "\n") == 0) { - txt_i++; - } - - /*Skip hidden buttons*/ - if(button_is_hidden(btnm->ctrl_bits[btn_i])) continue; - - /*Get the state of the button*/ - lv_state_t btn_state = LV_STATE_DEFAULT; - if(button_get_checked(btnm->ctrl_bits[btn_i])) btn_state |= LV_STATE_CHECKED; - - if(button_is_inactive(btnm->ctrl_bits[btn_i])) btn_state |= LV_STATE_DISABLED; - else if(btn_i == btnm->btn_id_sel) { - if(state_ori & LV_STATE_PRESSED) btn_state |= LV_STATE_PRESSED; - if(state_ori & LV_STATE_FOCUSED) btn_state |= LV_STATE_FOCUSED; - if(state_ori & LV_STATE_FOCUS_KEY) btn_state |= LV_STATE_FOCUS_KEY; - if(state_ori & LV_STATE_EDITED) btn_state |= LV_STATE_EDITED; - } - - /*Get the button's area*/ - lv_area_copy(&btn_area, &btnm->button_areas[btn_i]); - btn_area.x1 += area_obj.x1; - btn_area.y1 += area_obj.y1; - btn_area.x2 += area_obj.x1; - btn_area.y2 += area_obj.y1; - - /*Set up the draw descriptors*/ - if(btn_state == LV_STATE_DEFAULT) { - lv_memcpy(&draw_rect_dsc_act, &draw_rect_dsc_def, sizeof(lv_draw_rect_dsc_t)); - lv_memcpy(&draw_label_dsc_act, &draw_label_dsc_def, sizeof(lv_draw_label_dsc_t)); - } - /*In other cases get the styles directly without caching them*/ - else { - obj->state = btn_state; - obj->skip_trans = 1; - lv_draw_rect_dsc_init(&draw_rect_dsc_act); - lv_draw_label_dsc_init(&draw_label_dsc_act); - lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &draw_rect_dsc_act); - lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &draw_label_dsc_act); - obj->state = state_ori; - obj->skip_trans = 0; - } - - draw_rect_dsc_act.base.id1 = btn_i; - - /*Remove borders on the edges if `LV_BORDER_SIDE_INTERNAL`*/ - if(draw_rect_dsc_act.border_side & LV_BORDER_SIDE_INTERNAL) { - draw_rect_dsc_act.border_side = LV_BORDER_SIDE_FULL; - if(btn_area.x1 == obj->coords.x1 + pleft) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_LEFT; - if(btn_area.x2 == obj->coords.x2 - pright) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_RIGHT; - if(btn_area.y1 == obj->coords.y1 + ptop) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_TOP; - if(btn_area.y2 == obj->coords.y2 - pbottom) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_BOTTOM; - } - - int32_t btn_height = lv_area_get_height(&btn_area); - - if((btn_state & LV_STATE_PRESSED) && (btnm->ctrl_bits[btn_i] & LV_BUTTONMATRIX_CTRL_POPOVER)) { - /*Push up the upper boundary of the btn area to create the popover*/ - btn_area.y1 -= btn_height; - } - - /*Draw the background*/ - lv_draw_rect(layer, &draw_rect_dsc_act, &btn_area); - - /*Calculate the size of the text*/ - const lv_font_t * font = draw_label_dsc_act.font; - int32_t letter_space = draw_label_dsc_act.letter_space; - int32_t line_space = draw_label_dsc_act.line_space; - const char * txt = btnm->map_p[txt_i]; - -#if LV_USE_ARABIC_PERSIAN_CHARS - /*Get the size of the Arabic text and process it*/ - size_t len_ap = lv_text_ap_calc_bytes_count(txt); - if(len_ap < sizeof(txt_ap)) { - lv_text_ap_proc(txt, txt_ap); - txt = txt_ap; - } -#endif - lv_point_t txt_size; - lv_text_get_size(&txt_size, txt, font, letter_space, - line_space, lv_area_get_width(&area_obj), draw_label_dsc_act.flag); - - btn_area.x1 += (lv_area_get_width(&btn_area) - txt_size.x) / 2; - btn_area.y1 += (lv_area_get_height(&btn_area) - txt_size.y) / 2; - btn_area.x2 = btn_area.x1 + txt_size.x; - btn_area.y2 = btn_area.y1 + txt_size.y; - - if((btn_state & LV_STATE_PRESSED) && (btnm->ctrl_bits[btn_i] & LV_BUTTONMATRIX_CTRL_POPOVER)) { - /*Push up the button text into the popover*/ - btn_area.y1 -= btn_height / 2; - btn_area.y2 -= btn_height / 2; - } - - /*Draw the text*/ - draw_label_dsc_act.text = txt; - draw_label_dsc_act.text_local = true; - draw_label_dsc_act.base.id1 = btn_i; - lv_draw_label(layer, &draw_label_dsc_act, &btn_area); - } - - obj->skip_trans = 0; -} -/** - * Create the required number of buttons and control bytes according to a map - * @param obj pointer to button matrix object - * @param map_p pointer to a string array - */ -static void allocate_button_areas_and_controls(const lv_obj_t * obj, const char * const * map) -{ - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - btnm->row_cnt = 1; - /*Count the buttons in the map*/ - uint32_t btn_cnt = 0; - uint32_t i = 0; - while(map[i] && map[i][0] != '\0') { - if(lv_strcmp(map[i], "\n") != 0) { /*Do not count line breaks*/ - btn_cnt++; - } - else { - btnm->row_cnt++; - } - i++; - } - - /*Do not allocate memory for the same amount of buttons*/ - if(btn_cnt == btnm->btn_cnt) return; - - if(btnm->button_areas != NULL) { - lv_free(btnm->button_areas); - btnm->button_areas = NULL; - } - if(btnm->ctrl_bits != NULL) { - lv_free(btnm->ctrl_bits); - btnm->ctrl_bits = NULL; - } - - btnm->button_areas = lv_malloc(sizeof(lv_area_t) * btn_cnt); - LV_ASSERT_MALLOC(btnm->button_areas); - btnm->ctrl_bits = lv_malloc(sizeof(lv_buttonmatrix_ctrl_t) * btn_cnt); - LV_ASSERT_MALLOC(btnm->ctrl_bits); - if(btnm->button_areas == NULL || btnm->ctrl_bits == NULL) btn_cnt = 0; - - lv_memzero(btnm->ctrl_bits, sizeof(lv_buttonmatrix_ctrl_t) * btn_cnt); - - btnm->btn_cnt = btn_cnt; -} - -/** - * Get the width of a button in units (default is 1). - * @param ctrl_bits least significant 3 bits used (1..7 valid values) - * @return the width of the button in units - */ -static uint32_t get_button_width(lv_buttonmatrix_ctrl_t ctrl_bits) -{ - uint32_t w = ctrl_bits & LV_BUTTONMATRIX_WIDTH_MASK; - return w != 0 ? w : 1; -} - -static bool button_is_hidden(lv_buttonmatrix_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BUTTONMATRIX_CTRL_HIDDEN; -} - -static bool button_is_checked(lv_buttonmatrix_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BUTTONMATRIX_CTRL_CHECKED; -} - -static bool button_is_repeat_disabled(lv_buttonmatrix_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BUTTONMATRIX_CTRL_NO_REPEAT; -} - -static bool button_is_inactive(lv_buttonmatrix_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BUTTONMATRIX_CTRL_DISABLED; -} - -static bool button_is_click_trig(lv_buttonmatrix_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BUTTONMATRIX_CTRL_CLICK_TRIG; -} - -static bool button_is_popover(lv_buttonmatrix_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BUTTONMATRIX_CTRL_POPOVER; -} - -static bool button_is_checkable(lv_buttonmatrix_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BUTTONMATRIX_CTRL_CHECKABLE; -} - -static bool button_get_checked(lv_buttonmatrix_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BUTTONMATRIX_CTRL_CHECKED; -} - -/** - * Gives the button id of a button under a given point - * @param obj pointer to a button matrix object - * @param p a point with absolute coordinates - * @return the id of the button or LV_BUTTONMATRIX_BUTTON_NONE. - */ -static uint32_t get_button_from_point(lv_obj_t * obj, lv_point_t * p) -{ - lv_area_t obj_cords; - lv_area_t btn_area; - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - uint32_t i; - lv_obj_get_coords(obj, &obj_cords); - - int32_t w = lv_obj_get_width(obj); - int32_t h = lv_obj_get_height(obj); - int32_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - int32_t ptop = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - int32_t pbottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - int32_t prow = lv_obj_get_style_pad_row(obj, LV_PART_MAIN); - int32_t pcol = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); - - /*Get the half gap. Button look larger with this value. (+1 for rounding error)*/ - prow = (prow / 2) + 1 + (prow & 1); - pcol = (pcol / 2) + 1 + (pcol & 1); - - prow = LV_MIN(prow, BTN_EXTRA_CLICK_AREA_MAX); - pcol = LV_MIN(pcol, BTN_EXTRA_CLICK_AREA_MAX); - pright = LV_MIN(pright, BTN_EXTRA_CLICK_AREA_MAX); - ptop = LV_MIN(ptop, BTN_EXTRA_CLICK_AREA_MAX); - pbottom = LV_MIN(pbottom, BTN_EXTRA_CLICK_AREA_MAX); - - for(i = 0; i < btnm->btn_cnt; i++) { - lv_area_copy(&btn_area, &btnm->button_areas[i]); - if(btn_area.x1 <= pleft) btn_area.x1 += obj_cords.x1 - LV_MIN(pleft, BTN_EXTRA_CLICK_AREA_MAX); - else btn_area.x1 += obj_cords.x1 - pcol; - - if(btn_area.y1 <= ptop) btn_area.y1 += obj_cords.y1 - LV_MIN(ptop, BTN_EXTRA_CLICK_AREA_MAX); - else btn_area.y1 += obj_cords.y1 - prow; - - if(btn_area.x2 >= w - pright - 2) btn_area.x2 += obj_cords.x1 + LV_MIN(pright, - BTN_EXTRA_CLICK_AREA_MAX); /*-2 for rounding error*/ - else btn_area.x2 += obj_cords.x1 + pcol; - - if(btn_area.y2 >= h - pbottom - 2) btn_area.y2 += obj_cords.y1 + LV_MIN(pbottom, - BTN_EXTRA_CLICK_AREA_MAX); /*-2 for rounding error*/ - else btn_area.y2 += obj_cords.y1 + prow; - - if(lv_area_is_point_on(&btn_area, p, 0) != false) { - break; - } - } - - if(i == btnm->btn_cnt) i = LV_BUTTONMATRIX_BUTTON_NONE; - - return i; -} - -static void invalidate_button_area(const lv_obj_t * obj, uint32_t btn_idx) -{ - if(btn_idx == LV_BUTTONMATRIX_BUTTON_NONE) return; - - lv_area_t btn_area; - lv_area_t obj_area; - - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - if(btn_idx >= btnm->btn_cnt) return; - - lv_area_copy(&btn_area, &btnm->button_areas[btn_idx]); - lv_obj_get_coords(obj, &obj_area); - - /*The buttons might have outline and shadow so make the invalidation larger with the gaps between the buttons. - *It assumes that the outline or shadow is smaller than the gaps*/ - int32_t row_gap = lv_obj_get_style_pad_row(obj, LV_PART_MAIN); - int32_t col_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); - - /*Be sure to have a minimal extra space if row/col_gap is small*/ - int32_t dpi = lv_display_get_dpi(lv_obj_get_display(obj)); - row_gap = LV_MAX(row_gap, dpi / 10); - col_gap = LV_MAX(col_gap, dpi / 10); - - /*Convert relative coordinates to absolute*/ - btn_area.x1 += obj_area.x1 - row_gap; - btn_area.y1 += obj_area.y1 - col_gap; - btn_area.x2 += obj_area.x1 + row_gap; - btn_area.y2 += obj_area.y1 + col_gap; - - if((btn_idx == btnm->btn_id_sel) && (btnm->ctrl_bits[btn_idx] & LV_BUTTONMATRIX_CTRL_POPOVER)) { - /*Push up the upper boundary of the btn area to also invalidate the popover*/ - btn_area.y1 -= lv_area_get_height(&btn_area); - } - - lv_obj_invalidate_area(obj, &btn_area); -} - -/** - * Enforces a single button being toggled on the button matrix. - * It simply clears the toggle flag on other buttons. - * @param obj Button matrix object - * @param btn_idx Button that should remain toggled - */ -static void make_one_button_checked(lv_obj_t * obj, uint32_t btn_idx) -{ - /*Save whether the button was toggled*/ - bool was_toggled = lv_buttonmatrix_has_button_ctrl(obj, btn_idx, LV_BUTTONMATRIX_CTRL_CHECKED); - - lv_buttonmatrix_clear_button_ctrl_all(obj, LV_BUTTONMATRIX_CTRL_CHECKED); - - if(was_toggled) lv_buttonmatrix_set_button_ctrl(obj, btn_idx, LV_BUTTONMATRIX_CTRL_CHECKED); -} - -/** - * Check if any of the buttons in the first row has the LV_BUTTONMATRIX_CTRL_POPOVER control flag set. - * @param obj Button matrix object - * @return true if at least one button has the flag, false otherwise - */ -static bool has_popovers_in_top_row(lv_obj_t * obj) -{ - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - - if(btnm->row_cnt <= 0) { - return false; - } - - const char * const * map_row = btnm->map_p; - uint32_t btn_cnt = 0; - - while(map_row[btn_cnt] && lv_strcmp(map_row[btn_cnt], "\n") != 0 && map_row[btn_cnt][0] != '\0') { - if(button_is_popover(btnm->ctrl_bits[btn_cnt])) { - return true; - } - btn_cnt++; - } - - return false; -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/buttonmatrix/lv_buttonmatrix.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/buttonmatrix/lv_buttonmatrix.h deleted file mode 100644 index c272662..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/buttonmatrix/lv_buttonmatrix.h +++ /dev/null @@ -1,202 +0,0 @@ -/** - * @file lv_buttonmatrix.h - * - */ - -#ifndef LV_BUTTONMATRIX_H -#define LV_BUTTONMATRIX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -#if LV_USE_BUTTONMATRIX != 0 - -#include "../../core/lv_obj.h" - -/********************* - * DEFINES - *********************/ -#define LV_BUTTONMATRIX_BUTTON_NONE 0xFFFF -LV_EXPORT_CONST_INT(LV_BUTTONMATRIX_BUTTON_NONE); - -/********************** - * TYPEDEFS - **********************/ - -/** Type to store button control bits (disabled, hidden etc.) - * The first 3 bits are used to store the width*/ -typedef enum { - LV_BUTTONMATRIX_CTRL_HIDDEN = 0x0010, /**< Button hidden*/ - LV_BUTTONMATRIX_CTRL_NO_REPEAT = 0x0020, /**< Do not repeat press this button.*/ - LV_BUTTONMATRIX_CTRL_DISABLED = 0x0040, /**< Disable this button.*/ - LV_BUTTONMATRIX_CTRL_CHECKABLE = 0x0080, /**< The button can be toggled.*/ - LV_BUTTONMATRIX_CTRL_CHECKED = 0x0100, /**< Button is currently toggled (e.g. checked).*/ - LV_BUTTONMATRIX_CTRL_CLICK_TRIG = 0x0200, /**< 1: Send LV_EVENT_VALUE_CHANGE on CLICK, 0: Send LV_EVENT_VALUE_CHANGE on PRESS*/ - LV_BUTTONMATRIX_CTRL_POPOVER = 0x0400, /**< Show a popover when pressing this key*/ - LV_BUTTONMATRIX_CTRL_RESERVED_1 = 0x0800, /**< Reserved for later use*/ - LV_BUTTONMATRIX_CTRL_RESERVED_2 = 0x1000, /**< Reserved for later use*/ - LV_BUTTONMATRIX_CTRL_RESERVED_3 = 0x2000, /**< Reserved for later use*/ - LV_BUTTONMATRIX_CTRL_CUSTOM_1 = 0x4000, /**< Custom free to use flag*/ - LV_BUTTONMATRIX_CTRL_CUSTOM_2 = 0x8000, /**< Custom free to use flag*/ -} lv_buttonmatrix_ctrl_t; - -typedef bool (*lv_buttonmatrix_button_draw_cb_t)(lv_obj_t * btnm, uint32_t btn_id, const lv_area_t * draw_area, - const lv_area_t * clip_area); - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_buttonmatrix_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a button matrix object - * @param parent pointer to an object, it will be the parent of the new button matrix - * @return pointer to the created button matrix - */ -lv_obj_t * lv_buttonmatrix_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new map. Buttons will be created/deleted according to the map. The - * button matrix keeps a reference to the map and so the string array must not - * be deallocated during the life of the matrix. - * @param obj pointer to a button matrix object - * @param map pointer a string array. The last string has to be: "". Use "\n" to make a line break. - */ -void lv_buttonmatrix_set_map(lv_obj_t * obj, const char * const map[]); - -/** - * Set the button control map (hidden, disabled etc.) for a button matrix. - * The control map array will be copied and so may be deallocated after this - * function returns. - * @param obj pointer to a button matrix object - * @param ctrl_map pointer to an array of `lv_button_ctrl_t` control bytes. The - * length of the array and position of the elements must match - * the number and order of the individual buttons (i.e. excludes - * newline entries). - * An element of the map should look like e.g.: - * `ctrl_map[0] = width | LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_TGL_ENABLE` - */ -void lv_buttonmatrix_set_ctrl_map(lv_obj_t * obj, const lv_buttonmatrix_ctrl_t ctrl_map[]); - -/** - * Set the selected buttons - * @param obj pointer to button matrix object - * @param btn_id 0 based index of the button to modify. (Not counting new lines) - */ -void lv_buttonmatrix_set_selected_button(lv_obj_t * obj, uint32_t btn_id); - -/** - * Set the attributes of a button of the button matrix - * @param obj pointer to button matrix object - * @param btn_id 0 based index of the button to modify. (Not counting new lines) - * @param ctrl OR-ed attributes. E.g. `LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_CHECKABLE` - */ -void lv_buttonmatrix_set_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl); - -/** - * Clear the attributes of a button of the button matrix - * @param obj pointer to button matrix object - * @param btn_id 0 based index of the button to modify. (Not counting new lines) - * @param ctrl OR-ed attributes. E.g. `LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_CHECKABLE` - */ -void lv_buttonmatrix_clear_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl); - -/** - * Set attributes of all buttons of a button matrix - * @param obj pointer to a button matrix object - * @param ctrl attribute(s) to set from `lv_buttonmatrix_ctrl_t`. Values can be ORed. - */ -void lv_buttonmatrix_set_button_ctrl_all(lv_obj_t * obj, lv_buttonmatrix_ctrl_t ctrl); - -/** - * Clear the attributes of all buttons of a button matrix - * @param obj pointer to a button matrix object - * @param ctrl attribute(s) to set from `lv_buttonmatrix_ctrl_t`. Values can be ORed. - */ -void lv_buttonmatrix_clear_button_ctrl_all(lv_obj_t * obj, lv_buttonmatrix_ctrl_t ctrl); - -/** - * Set a single button's relative width. - * This method will cause the matrix be regenerated and is a relatively - * expensive operation. It is recommended that initial width be specified using - * `lv_buttonmatrix_set_ctrl_map` and this method only be used for dynamic changes. - * @param obj pointer to button matrix object - * @param btn_id 0 based index of the button to modify. - * @param width relative width compared to the buttons in the same row. [1..15] - */ -void lv_buttonmatrix_set_button_width(lv_obj_t * obj, uint32_t btn_id, uint32_t width); - -/** - * Make the button matrix like a selector widget (only one button may be checked at a time). - * `LV_BUTTONMATRIX_CTRL_CHECKABLE` must be enabled on the buttons to be selected using - * `lv_buttonmatrix_set_ctrl()` or `lv_buttonmatrix_set_button_ctrl_all()`. - * @param obj pointer to a button matrix object - * @param en whether "one check" mode is enabled - */ -void lv_buttonmatrix_set_one_checked(lv_obj_t * obj, bool en); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the current map of a button matrix - * @param obj pointer to a button matrix object - * @return the current map - */ -const char * const * lv_buttonmatrix_get_map(const lv_obj_t * obj); - -/** - * Get the index of the lastly "activated" button by the user (pressed, released, focused etc) - * Useful in the `event_cb` to get the text of the button, check if hidden etc. - * @param obj pointer to button matrix object - * @return index of the last released button (LV_BUTTONMATRIX_BUTTON_NONE: if unset) - */ -uint32_t lv_buttonmatrix_get_selected_button(const lv_obj_t * obj); - -/** - * Get the button's text - * @param obj pointer to button matrix object - * @param btn_id the index a button not counting new line characters. - * @return text of btn_index` button - */ -const char * lv_buttonmatrix_get_button_text(const lv_obj_t * obj, uint32_t btn_id); - -/** - * Get the whether a control value is enabled or disabled for button of a button matrix - * @param obj pointer to a button matrix object - * @param btn_id the index of a button not counting new line characters. - * @param ctrl control values to check (ORed value can be used) - * @return true: the control attribute is enabled false: disabled - */ -bool lv_buttonmatrix_has_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl); - -/** - * Tell whether "one check" mode is enabled or not. - * @param obj Button matrix object - * @return true: "one check" mode is enabled; false: disabled - */ -bool lv_buttonmatrix_get_one_checked(const lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_BUTTONMATRIX*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_BUTTONMATRIX_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/buttonmatrix/lv_buttonmatrix_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/buttonmatrix/lv_buttonmatrix_private.h deleted file mode 100644 index cab042d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/buttonmatrix/lv_buttonmatrix_private.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @file lv_buttonmatrix_private.h - * - */ - -#ifndef LV_BUTTONMATRIX_PRIVATE_H -#define LV_BUTTONMATRIX_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_buttonmatrix.h" - -#if LV_USE_BUTTONMATRIX != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Data of button matrix */ -struct lv_buttonmatrix_t { - lv_obj_t obj; - const char * const * map_p; /**< Pointer to the current map */ - lv_area_t * button_areas; /**< Array of areas of buttons */ - lv_buttonmatrix_ctrl_t * ctrl_bits; /**< Array of control bytes */ - uint32_t btn_cnt; /**< Number of button in 'map_p'(Handled by the library) */ - uint32_t row_cnt; /**< Number of rows in 'map_p'(Handled by the library) */ - uint32_t btn_id_sel; /**< Index of the active button (being pressed/released etc) or LV_BUTTONMATRIX_BUTTON_NONE */ - uint32_t one_check : 1; /**< Single button toggled at once */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_BUTTONMATRIX != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_BUTTONMATRIX_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar.c deleted file mode 100644 index 560e24a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar.c +++ /dev/null @@ -1,503 +0,0 @@ -/** - * @file lv_calendar.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_calendar_private.h" -#include "../../draw/lv_draw_private.h" -#include "../../core/lv_obj_class_private.h" -#include "../../../lvgl.h" -#if LV_USE_CALENDAR - -#include "../../misc/lv_assert.h" - -/********************* - * DEFINES - *********************/ -#define LV_CALENDAR_CTRL_TODAY LV_BUTTONMATRIX_CTRL_CUSTOM_1 -#define LV_CALENDAR_CTRL_HIGHLIGHT LV_BUTTONMATRIX_CTRL_CUSTOM_2 - -#define MY_CLASS (&lv_calendar_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_calendar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void draw_task_added_event_cb(lv_event_t * e); - -static uint8_t get_day_of_week(uint32_t year, uint32_t month, uint32_t day); -static uint8_t get_month_length(int32_t year, int32_t month); -static uint8_t is_leap_year(uint32_t year); -static void highlight_update(lv_obj_t * calendar); - -#if LV_USE_CALENDAR_CHINESE -static lv_calendar_date_t gregorian_get_last_month_time(lv_calendar_date_t * time); -static lv_calendar_date_t gregorian_get_next_month_time(lv_calendar_date_t * time); -static void chinese_calendar_set_day_name(lv_obj_t * calendar, uint8_t index, uint8_t day, - lv_calendar_date_t * gregorian_time); -#endif - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_calendar_class = { - .constructor_cb = lv_calendar_constructor, - .width_def = (LV_DPI_DEF * 3) / 2, - .height_def = (LV_DPI_DEF * 3) / 2, - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .instance_size = sizeof(lv_calendar_t), - .base_class = &lv_obj_class, - .name = "calendar", -}; - -static const char * day_names_def[7] = LV_CALENDAR_DEFAULT_DAY_NAMES; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_calendar_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_class, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_calendar_set_day_names(lv_obj_t * obj, const char * day_names[]) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_calendar_t * calendar = (lv_calendar_t *)obj; - - uint32_t i; - for(i = 0; i < 7; i++) { - calendar->map[i] = day_names[i]; - } - lv_obj_invalidate(obj); -} - -void lv_calendar_set_today_date(lv_obj_t * obj, uint32_t year, uint32_t month, uint32_t day) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_calendar_t * calendar = (lv_calendar_t *)obj; - - calendar->today.year = year; - calendar->today.month = month; - calendar->today.day = day; - - highlight_update(obj); -} - -void lv_calendar_set_highlighted_dates(lv_obj_t * obj, lv_calendar_date_t highlighted[], size_t date_num) -{ - LV_ASSERT_NULL(highlighted); - - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_calendar_t * calendar = (lv_calendar_t *)obj; - - calendar->highlighted_dates = highlighted; - calendar->highlighted_dates_num = date_num; - - highlight_update(obj); -} - -void lv_calendar_set_showed_date(lv_obj_t * obj, uint32_t year, uint32_t month) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_calendar_t * calendar = (lv_calendar_t *)obj; - - calendar->showed_date.year = year; - calendar->showed_date.month = month; - calendar->showed_date.day = 1; - - lv_calendar_date_t d; - d.year = calendar->showed_date.year; - d.month = calendar->showed_date.month; - d.day = calendar->showed_date.day; - - uint32_t i; - - /*Remove the disabled state but revert it for day names*/ - lv_buttonmatrix_clear_button_ctrl_all(calendar->btnm, LV_BUTTONMATRIX_CTRL_DISABLED); - for(i = 0; i < 7; i++) { - lv_buttonmatrix_set_button_ctrl(calendar->btnm, i, LV_BUTTONMATRIX_CTRL_DISABLED); - } - - uint8_t act_mo_len = get_month_length(d.year, d.month); - uint8_t day_first = get_day_of_week(d.year, d.month, 1); - uint8_t c; - -#if LV_USE_CALENDAR_CHINESE - lv_calendar_date_t gregorian_time; - gregorian_time = d; -#endif - - for(i = day_first, c = 1; i < act_mo_len + day_first; i++, c++) { -#if LV_USE_CALENDAR_CHINESE - if(calendar->use_chinese_calendar) { - gregorian_time.day = c; - chinese_calendar_set_day_name(obj, i, c, &gregorian_time); - } - else -#endif - lv_snprintf(calendar->nums[i], sizeof(calendar->nums[0]), "%d", c); - } - - uint8_t prev_mo_len = get_month_length(d.year, d.month - 1); - -#if LV_USE_CALENDAR_CHINESE - gregorian_time = gregorian_get_last_month_time(&d); -#endif - - for(i = 0, c = prev_mo_len - day_first + 1; i < day_first; i++, c++) { -#if LV_USE_CALENDAR_CHINESE - if(calendar->use_chinese_calendar) { - gregorian_time.day = c; - chinese_calendar_set_day_name(obj, i, c, &gregorian_time); - } - else -#endif - lv_snprintf(calendar->nums[i], sizeof(calendar->nums[0]), "%d", c); - lv_buttonmatrix_set_button_ctrl(calendar->btnm, i + 7, LV_BUTTONMATRIX_CTRL_DISABLED); - } - -#if LV_USE_CALENDAR_CHINESE - gregorian_time = gregorian_get_next_month_time(&d); -#endif - - for(i = day_first + act_mo_len, c = 1; i < 6 * 7; i++, c++) { -#if LV_USE_CALENDAR_CHINESE - if(calendar->use_chinese_calendar) { - gregorian_time.day = c; - chinese_calendar_set_day_name(obj, i, c, &gregorian_time); - } - else -#endif - lv_snprintf(calendar->nums[i], sizeof(calendar->nums[0]), "%d", c); - lv_buttonmatrix_set_button_ctrl(calendar->btnm, i + 7, LV_BUTTONMATRIX_CTRL_DISABLED); - } - - highlight_update(obj); - - /*Reset the focused button if the days changes*/ - if(lv_buttonmatrix_get_selected_button(calendar->btnm) != LV_BUTTONMATRIX_BUTTON_NONE) { - lv_buttonmatrix_set_selected_button(calendar->btnm, day_first + 7); - } - - lv_obj_invalidate(obj); - - /* The children of the calendar are probably headers. - * Notify them to let the headers updated to the new date*/ - uint32_t child_cnt = lv_obj_get_child_count(obj); - for(i = 0; i < child_cnt; i++) { - lv_obj_t * child = lv_obj_get_child(obj, i); - if(child == calendar->btnm) continue; - lv_obj_send_event(child, LV_EVENT_VALUE_CHANGED, obj); - } -} - -/*===================== - * Getter functions - *====================*/ - -lv_obj_t * lv_calendar_get_btnmatrix(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - const lv_calendar_t * calendar = (lv_calendar_t *)obj; - return calendar->btnm; -} - -const lv_calendar_date_t * lv_calendar_get_today_date(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - const lv_calendar_t * calendar = (lv_calendar_t *)obj; - - return &calendar->today; -} - -const lv_calendar_date_t * lv_calendar_get_showed_date(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - const lv_calendar_t * calendar = (lv_calendar_t *)obj; - - return &calendar->showed_date; -} - -lv_calendar_date_t * lv_calendar_get_highlighted_dates(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_calendar_t * calendar = (lv_calendar_t *)obj; - - return calendar->highlighted_dates; -} - -size_t lv_calendar_get_highlighted_dates_num(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_calendar_t * calendar = (lv_calendar_t *)obj; - - return calendar->highlighted_dates_num; -} - -lv_result_t lv_calendar_get_pressed_date(const lv_obj_t * obj, lv_calendar_date_t * date) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_calendar_t * calendar = (lv_calendar_t *)obj; - - uint32_t d = lv_buttonmatrix_get_selected_button(calendar->btnm); - if(d == LV_BUTTONMATRIX_BUTTON_NONE) { - date->year = 0; - date->month = 0; - date->day = 0; - return LV_RESULT_INVALID; - } - - const char * txt = lv_buttonmatrix_get_button_text(calendar->btnm, lv_buttonmatrix_get_selected_button(calendar->btnm)); - - if(txt[1] == 0) date->day = txt[0] - '0'; - else date->day = (txt[0] - '0') * 10 + (txt[1] - '0'); - - date->year = calendar->showed_date.year; - date->month = calendar->showed_date.month; - - return LV_RESULT_OK; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_calendar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_calendar_t * calendar = (lv_calendar_t *)obj; - - /*Initialize the allocated 'ext'*/ - - calendar->today.year = 2024; - calendar->today.month = 1; - calendar->today.day = 1; - - calendar->showed_date.year = 2024; - calendar->showed_date.month = 1; - calendar->showed_date.day = 1; - - calendar->highlighted_dates = NULL; - calendar->highlighted_dates_num = 0; - - lv_memzero(calendar->nums, sizeof(calendar->nums)); - uint8_t i; - uint8_t j = 0; - for(i = 0; i < 8 * 7; i++) { - /*Every 8th string is "\n"*/ - if(i != 0 && (i + 1) % 8 == 0) { - calendar->map[i] = "\n"; - } - else if(i < 7) { - calendar->map[i] = day_names_def[i]; - } - else { - calendar->nums[j][0] = 'x'; - calendar->map[i] = calendar->nums[j]; - j++; - } - } - calendar->map[8 * 7 - 1] = ""; - - calendar->btnm = lv_buttonmatrix_create(obj); - lv_buttonmatrix_set_map(calendar->btnm, calendar->map); - lv_buttonmatrix_set_button_ctrl_all(calendar->btnm, LV_BUTTONMATRIX_CTRL_CLICK_TRIG | LV_BUTTONMATRIX_CTRL_NO_REPEAT); - lv_obj_add_event_cb(calendar->btnm, draw_task_added_event_cb, LV_EVENT_DRAW_TASK_ADDED, NULL); - lv_obj_set_width(calendar->btnm, lv_pct(100)); - lv_obj_add_flag(calendar->btnm, LV_OBJ_FLAG_EVENT_BUBBLE | LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); - - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); - lv_obj_set_flex_grow(calendar->btnm, 1); - - lv_obj_set_style_text_align(obj, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN); - - lv_calendar_set_showed_date(obj, calendar->showed_date.year, calendar->showed_date.month); - lv_calendar_set_today_date(obj, calendar->today.year, calendar->today.month, calendar->today.day); -} - -static void draw_task_added_event_cb(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_draw_task_t * draw_task = lv_event_get_param(e); - if(((lv_draw_dsc_base_t *)draw_task->draw_dsc)->part != LV_PART_ITEMS) return; - - lv_draw_fill_dsc_t * fill_draw_dsc = lv_draw_task_get_fill_dsc(draw_task); - lv_draw_border_dsc_t * border_draw_dsc = lv_draw_task_get_border_dsc(draw_task); - - if(!fill_draw_dsc && !border_draw_dsc) { - return; - } - - int32_t id = ((lv_draw_dsc_base_t *)draw_task->draw_dsc)->id1; - - /*Day name styles*/ - if(id < 7) { - if(fill_draw_dsc) fill_draw_dsc->opa = LV_OPA_TRANSP; - if(border_draw_dsc) border_draw_dsc->opa = LV_OPA_TRANSP; - } - else if(lv_buttonmatrix_has_button_ctrl(obj, id, LV_BUTTONMATRIX_CTRL_DISABLED)) { - if(fill_draw_dsc) fill_draw_dsc->opa = LV_OPA_TRANSP; - if(border_draw_dsc) border_draw_dsc->opa = LV_OPA_TRANSP; - } - - if(lv_buttonmatrix_has_button_ctrl(obj, id, LV_CALENDAR_CTRL_HIGHLIGHT)) { - if(border_draw_dsc) border_draw_dsc->color = lv_theme_get_color_primary(obj); - if(fill_draw_dsc) fill_draw_dsc->opa = LV_OPA_40; - if(fill_draw_dsc) fill_draw_dsc->color = lv_theme_get_color_primary(obj); - if(lv_buttonmatrix_get_selected_button(obj) == (uint32_t)id) { - if(fill_draw_dsc) fill_draw_dsc->opa = LV_OPA_70; - } - } - - if(lv_buttonmatrix_has_button_ctrl(obj, id, LV_CALENDAR_CTRL_TODAY)) { - if(border_draw_dsc) border_draw_dsc->opa = LV_OPA_COVER; - if(border_draw_dsc) border_draw_dsc->color = lv_theme_get_color_primary(obj); - if(border_draw_dsc) border_draw_dsc->width += 1; - } -} - -/** - * Get the number of days in a month - * @param year a year - * @param month a month. The range is basically [1..12] but [-11..0] or [13..24] is also - * supported to handle next/prev. year - * @return [28..31] - */ -static uint8_t get_month_length(int32_t year, int32_t month) -{ - month--; - if(month < 0) { - year--; /*Already in the previous year (won't be less than -12 to skip a whole year)*/ - month = 12 + month; /*`month` is negative, the result will be < 12*/ - } - if(month >= 12) { - year++; - month -= 12; - } - - /*month == 1 is february*/ - return (month == 1) ? (28 + is_leap_year(year)) : 31 - month % 7 % 2; -} - -/** - * Tells whether a year is leap year or not - * @param year a year - * @return 0: not leap year; 1: leap year - */ -static uint8_t is_leap_year(uint32_t year) -{ - return (year % 4) || ((year % 100 == 0) && (year % 400)) ? 0 : 1; -} - -/** - * Get the day of the week - * @param year a year - * @param month a month [1..12] - * @param day a day [1..32] - * @return [0..6] which means [Sun..Sat] or [Mon..Sun] depending on LV_CALENDAR_WEEK_STARTS_MONDAY - */ -static uint8_t get_day_of_week(uint32_t year, uint32_t month, uint32_t day) -{ - uint32_t a = month < 3 ? 1 : 0; - uint32_t b = year - a; - -#if LV_CALENDAR_WEEK_STARTS_MONDAY - uint32_t day_of_week = (day + (31 * (month - 2 + 12 * a) / 12) + b + (b / 4) - (b / 100) + (b / 400) - 1) % 7; -#else - uint32_t day_of_week = (day + (31 * (month - 2 + 12 * a) / 12) + b + (b / 4) - (b / 100) + (b / 400)) % 7; -#endif - - return day_of_week ; -} - -static void highlight_update(lv_obj_t * obj) -{ - lv_calendar_t * calendar = (lv_calendar_t *)obj; - uint32_t i; - - /*Clear all kind of selection*/ - lv_buttonmatrix_clear_button_ctrl_all(calendar->btnm, LV_CALENDAR_CTRL_TODAY | LV_CALENDAR_CTRL_HIGHLIGHT); - - uint8_t day_first = get_day_of_week(calendar->showed_date.year, calendar->showed_date.month, 1); - if(calendar->highlighted_dates) { - for(i = 0; i < calendar->highlighted_dates_num; i++) { - if(calendar->highlighted_dates[i].year == calendar->showed_date.year && - calendar->highlighted_dates[i].month == calendar->showed_date.month) { - lv_buttonmatrix_set_button_ctrl(calendar->btnm, calendar->highlighted_dates[i].day - 1 + day_first + 7, - LV_CALENDAR_CTRL_HIGHLIGHT); - } - } - } - - if(calendar->showed_date.year == calendar->today.year && calendar->showed_date.month == calendar->today.month) { - lv_buttonmatrix_set_button_ctrl(calendar->btnm, calendar->today.day - 1 + day_first + 7, LV_CALENDAR_CTRL_TODAY); - } -} - -#if LV_USE_CALENDAR_CHINESE - -static lv_calendar_date_t gregorian_get_last_month_time(lv_calendar_date_t * time) -{ - lv_calendar_date_t last_month_time; - if(time->month == 1) { - last_month_time.month = 12; - last_month_time.year = time->year - 1; - } - else { - last_month_time.month = time->month - 1; - last_month_time.year = time->year; - } - return last_month_time; -} - -static lv_calendar_date_t gregorian_get_next_month_time(lv_calendar_date_t * time) -{ - lv_calendar_date_t next_month_time; - if(time->month == 12) { - next_month_time.month = 1; - next_month_time.year = time->year + 1; - } - else { - next_month_time.month = time->month + 1; - next_month_time.year = time->year; - } - return next_month_time; -} - -static void chinese_calendar_set_day_name(lv_obj_t * obj, uint8_t index, uint8_t day, - lv_calendar_date_t * gregorian_time) -{ - lv_calendar_t * calendar = (lv_calendar_t *)obj; - const char * day_name = lv_calendar_get_day_name(gregorian_time); - if(day_name != NULL) - lv_snprintf(calendar->nums[index], sizeof(calendar->nums[0]), - "%d\n%s", - day, - day_name); - else - lv_snprintf(calendar->nums[index], sizeof(calendar->nums[0]), "%d", day); -} -#endif - -#endif /*LV_USE_CALENDAR*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar.h deleted file mode 100644 index 38c5d64..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar.h +++ /dev/null @@ -1,160 +0,0 @@ -/** - * @file lv_calendar.h - * - */ - -#ifndef LV_CALENDAR_H -#define LV_CALENDAR_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../buttonmatrix/lv_buttonmatrix.h" - -#if LV_USE_CALENDAR - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Represents a date on the calendar object (platform-agnostic). - */ -typedef struct { - uint16_t year; - int8_t month; /**< 1..12 */ - int8_t day; /**< 1..31 */ -} lv_calendar_date_t; - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_calendar_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a calendar widget - * @param parent pointer to an object, it will be the parent of the new calendar - * @return pointer the created calendar - */ -lv_obj_t * lv_calendar_create(lv_obj_t * parent); - -/*====================== - * Add/remove functions - *=====================*/ - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the today's date - * @param obj pointer to a calendar object - * @param year today's year - * @param month today's month [1..12] - * @param day today's day [1..31] - */ -void lv_calendar_set_today_date(lv_obj_t * obj, uint32_t year, uint32_t month, uint32_t day); - -/** - * Set the currently showed - * @param obj pointer to a calendar object - * @param year today's year - * @param month today's month [1..12] - */ -void lv_calendar_set_showed_date(lv_obj_t * obj, uint32_t year, uint32_t month); - -/** - * Set the highlighted dates - * @param obj pointer to a calendar object - * @param highlighted pointer to an `lv_calendar_date_t` array containing the dates. - * Only the pointer will be saved so this variable can't be local which will be destroyed later. - * @param date_num number of dates in the array - */ -void lv_calendar_set_highlighted_dates(lv_obj_t * obj, lv_calendar_date_t highlighted[], size_t date_num); - -/** - * Set the name of the days - * @param obj pointer to a calendar object - * @param day_names pointer to an array with the names. - * E.g. `const char * days[7] = {"Sun", "Mon", ...}` - * Only the pointer will be saved so this variable can't be local which will be destroyed later. - */ -void lv_calendar_set_day_names(lv_obj_t * obj, const char ** day_names); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the button matrix object of the calendar. - * It shows the dates and day names. - * @param obj pointer to a calendar object - * @return pointer to a the button matrix - */ -lv_obj_t * lv_calendar_get_btnmatrix(const lv_obj_t * obj); - -/** - * Get the today's date - * @param calendar pointer to a calendar object - * @return return pointer to an `lv_calendar_date_t` variable containing the date of today. - */ -const lv_calendar_date_t * lv_calendar_get_today_date(const lv_obj_t * calendar); - -/** - * Get the currently showed - * @param calendar pointer to a calendar object - * @return pointer to an `lv_calendar_date_t` variable containing the date is being shown. - */ -const lv_calendar_date_t * lv_calendar_get_showed_date(const lv_obj_t * calendar); - -/** - * Get the highlighted dates - * @param calendar pointer to a calendar object - * @return pointer to an `lv_calendar_date_t` array containing the dates. - */ -lv_calendar_date_t * lv_calendar_get_highlighted_dates(const lv_obj_t * calendar); - -/** - * Get the number of the highlighted dates - * @param calendar pointer to a calendar object - * @return number of highlighted days - */ -size_t lv_calendar_get_highlighted_dates_num(const lv_obj_t * calendar); - -/** - * Get the currently pressed day - * @param calendar pointer to a calendar object - * @param date store the pressed date here - * @return LV_RESULT_OK: there is a valid pressed date - * LV_RESULT_INVALID: there is no pressed data - */ -lv_result_t lv_calendar_get_pressed_date(const lv_obj_t * calendar, lv_calendar_date_t * date); - -/*===================== - * Other functions - *====================*/ - -/********************** - * MACROS - **********************/ - -#include "lv_calendar_header_arrow.h" -#include "lv_calendar_header_dropdown.h" -#include "lv_calendar_chinese.h" - -#endif /*LV_USE_CALENDAR*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CALENDAR_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_chinese.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_chinese.c deleted file mode 100644 index ee24133..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_chinese.c +++ /dev/null @@ -1,285 +0,0 @@ -/** - * @file lv_calendar_chinese.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_calendar_private.h" -#if LV_USE_CALENDAR && LV_USE_CALENDAR_CHINESE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - const char festival_name[20]; - uint8_t month; - uint8_t day; -} lv_calendar_festival_t; - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -static const uint32_t calendar_chinese_table[199] = {/*1901-2099*/ - 0x04AE53, 0x0A5748, 0x5526BD, 0x0D2650, 0x0D9544, 0x46AAB9, 0x056A4D, 0x09AD42, 0x24AEB6, 0x04AE4A, /*1901-1910*/ - 0x6A4DBE, 0x0A4D52, 0x0D2546, 0x5D52BA, 0x0B544E, 0x0D6A43, 0x296D37, 0x095B4B, 0x749BC1, 0x049754, /*1911-1920*/ - 0x0A4B48, 0x5B25BC, 0x06A550, 0x06D445, 0x4ADAB8, 0x02B64D, 0x095742, 0x2497B7, 0x04974A, 0x664B3E, /*1921-1930*/ - 0x0D4A51, 0x0EA546, 0x56D4BA, 0x05AD4E, 0x02B644, 0x393738, 0x092E4B, 0x7C96BF, 0x0C9553, 0x0D4A48, /*1931-1940*/ - 0x6DA53B, 0x0B554F, 0x056A45, 0x4AADB9, 0x025D4D, 0x092D42, 0x2C95B6, 0x0A954A, 0x7B4ABD, 0x06CA51, /*1941-1950*/ - 0x0B5546, 0x555ABB, 0x04DA4E, 0x0A5B43, 0x352BB8, 0x052B4C, 0x8A953F, 0x0E9552, 0x06AA48, 0x6AD53C, /*1951-1960*/ - 0x0AB54F, 0x04B645, 0x4A5739, 0x0A574D, 0x052642, 0x3E9335, 0x0D9549, 0x75AABE, 0x056A51, 0x096D46, /*1961-1970*/ - 0x54AEBB, 0x04AD4F, 0x0A4D43, 0x4D26B7, 0x0D254B, 0x8D52BF, 0x0B5452, 0x0B6A47, 0x696D3C, 0x095B50, /*1971-1980*/ - 0x049B45, 0x4A4BB9, 0x0A4B4D, 0xAB25C2, 0x06A554, 0x06D449, 0x6ADA3D, 0x0AB651, 0x093746, 0x5497BB, /*1981-1990*/ - 0x04974F, 0x064B44, 0x36A537, 0x0EA54A, 0x86B2BF, 0x05AC53, 0x0AB647, 0x5936BC, 0x092E50, 0x0C9645, /*1991-2000*/ - 0x4D4AB8, 0x0D4A4C, 0x0DA541, 0x25AAB6, 0x056A49, 0x7AADBD, 0x025D52, 0x092D47, 0x5C95BA, 0x0A954E, /*2001-2010*/ - 0x0B4A43, 0x4B5537, 0x0AD54A, 0x955ABF, 0x04BA53, 0x0A5B48, 0x652BBC, 0x052B50, 0x0A9345, 0x474AB9, /*2011-2020*/ - 0x06AA4C, 0x0AD541, 0x24DAB6, 0x04B64A, 0x69573D, 0x0A4E51, 0x0D2646, 0x5E933A, 0x0D534D, 0x05AA43, /*2021-2030*/ - 0x36B537, 0x096D4B, 0xB4AEBF, 0x04AD53, 0x0A4D48, 0x6D25BC, 0x0D254F, 0x0D5244, 0x5DAA38, 0x0B5A4C, /*2031-2040*/ - 0x056D41, 0x24ADB6, 0x049B4A, 0x7A4BBE, 0x0A4B51, 0x0AA546, 0x5B52BA, 0x06D24E, 0x0ADA42, 0x355B37, /*2041-2050*/ - 0x09374B, 0x8497C1, 0x049753, 0x064B48, 0x66A53C, 0x0EA54F, 0x06B244, 0x4AB638, 0x0AAE4C, 0x092E42, /*2051-2060*/ - 0x3C9735, 0x0C9649, 0x7D4ABD, 0x0D4A51, 0x0DA545, 0x55AABA, 0x056A4E, 0x0A6D43, 0x452EB7, 0x052D4B, /*2061-2070*/ - 0x8A95BF, 0x0A9553, 0x0B4A47, 0x6B553B, 0x0AD54F, 0x055A45, 0x4A5D38, 0x0A5B4C, 0x052B42, 0x3A93B6, /*2071-2080*/ - 0x069349, 0x7729BD, 0x06AA51, 0x0AD546, 0x54DABA, 0x04B64E, 0x0A5743, 0x452738, 0x0D264A, 0x8E933E, /*2081-2090*/ - 0x0D5252, 0x0DAA47, 0x66B53B, 0x056D4F, 0x04AE45, 0x4A4EB9, 0x0A4D4C, 0x0D1541, 0x2D92B5 /*2091-2099*/ -}; - -static const uint16_t month_total_day[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; - -static const char * chinese_calendar_month_name[] = {"正月", "二月", "三月", "四月", "五月", "六月", - "七月", "八月", "九月", "十月", "十一月", "腊月" - }; - -static const char * chinese_calendar_leep_month_name[] = {"闰正月", "闰二月", "闰三月", "闰四月", "闰五月", "闰六月", - "闰七月", "闰八月", "闰九月", "闰十月", "闰十一月", "闰腊月" - }; - -static const char * chinese_calendar_day_name[] = {"初一", "初二", "初三", "初四", "初五", - "初六", "初七", "初八", "初九", "初十", - "十一", "十二", "十三", "十四", "十五", - "十六", "十七", "十八", "十九", "二十", - "廿一", "廿二", "廿三", "廿四", "廿五", - "廿六", "廿七", "廿八", "廿九", "三十" - }; - -static const lv_calendar_festival_t festivals_base_chinese[] = { - {"春节", 1, 1}, - {"元宵节", 1, 15}, - {"端午节", 5, 5}, - {"七夕节", 7, 7}, - {"中元节", 7, 15}, - {"中秋节", 8, 15}, - {"重阳节", 9, 9}, - {"腊八节", 12, 8}, - {"除夕", 12, 29},/* To determine whether it is 12.29 or 12.30. */ - {"除夕", 12, 30},/* To determine whether it is 12.29 or 12.30. */ -}; - -static const lv_calendar_festival_t festivals_base_gregorian[] = { - {"元旦", 1, 1}, - {"情人节", 2, 14}, - {"妇女节", 3, 8}, - {"植树节", 3, 12}, - {"消费节", 3, 15}, - {"愚人节", 4, 1}, - {"劳动节", 5, 1}, - {"青年节", 5, 4}, - {"儿童节", 6, 1}, - {"建党节", 7, 1}, - {"建军节", 8, 1}, - {"教师节", 9, 10}, - {"国庆节", 10, 1}, - {"万圣节", 10, 31}, - {"平安夜", 12, 24}, - {"圣诞节", 12, 25}, -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_calendar_set_chinese_mode(lv_obj_t * obj, bool en) -{ - lv_calendar_t * calendar = (lv_calendar_t *)obj; - calendar->use_chinese_calendar = en; - lv_calendar_set_showed_date(obj, calendar->today.year, calendar->today.month); -} - -const char * lv_calendar_get_day_name(lv_calendar_date_t * gregorian) -{ - uint16_t i, len; - lv_calendar_chinese_t chinese_calendar; - lv_calendar_gregorian_to_chinese(gregorian, &chinese_calendar); - - if(gregorian->year > 2099 || gregorian->year < 1901) - return NULL; - - len = sizeof(festivals_base_chinese) / sizeof(lv_calendar_festival_t); - for(i = 0; i < len; i++) { - if((chinese_calendar.today.month == festivals_base_chinese[i].month) && - (chinese_calendar.today.day == festivals_base_chinese[i].day) && - chinese_calendar.leep_month == false) { - if(chinese_calendar.today.month == 12 && chinese_calendar.today.day == 29) { - if((calendar_chinese_table[chinese_calendar.today.year - 1901] & 0xf00000) != 0) { - if((calendar_chinese_table[chinese_calendar.today.year - 1901] & 0x000080) == 0) { - return festivals_base_chinese[i].festival_name; - } - } - else { - if((calendar_chinese_table[chinese_calendar.today.year - 1901] & 0x000100) == 0) { - return festivals_base_chinese[i].festival_name; - } - } - } - else { - return festivals_base_chinese[i].festival_name; - } - } - } - - len = sizeof(festivals_base_gregorian) / sizeof(lv_calendar_festival_t); - for(i = 0; i < len; i++) { - if((gregorian->month == festivals_base_gregorian[i].month) && - (gregorian->day == festivals_base_gregorian[i].day)) - return festivals_base_gregorian[i].festival_name; - } - - if(chinese_calendar.today.day == 1) { - if(chinese_calendar.leep_month == false) - return chinese_calendar_month_name[chinese_calendar.today.month - 1]; - else { - return chinese_calendar_leep_month_name[chinese_calendar.today.month - 1]; - } - } - - return (char *)chinese_calendar_day_name[chinese_calendar.today.day - 1]; -} - -void lv_calendar_gregorian_to_chinese(lv_calendar_date_t * gregorian_time, lv_calendar_chinese_t * chinese_time) -{ - uint16_t year = gregorian_time->year; - uint8_t month = gregorian_time->month; - uint8_t day = gregorian_time->day; - - /*Record the number of days between the Spring Festival - and the New Year's Day of that year.*/ - uint16_t by_spring; - - /*Record the number of days from the gregorian calendar - to the New Year's Day of that year.*/ - uint16_t by_gregorian; - - /*Record the number of days in that month*/ - uint8_t days_per_month; - - /*Record from which month the calculation starts.*/ - uint8_t index; - - bool leep_month; - - if(year < 1901 || year > 2099) { - chinese_time->leep_month = 0; - chinese_time->today.year = 2000; - chinese_time->today.month = 1; - chinese_time->today.day = 1; - return; - } - - if(((calendar_chinese_table[year - 1901] & 0x0060) >> 5) == 1) - by_spring = (calendar_chinese_table[year - 1901] & 0x001F) - 1; - else - by_spring = (calendar_chinese_table[year - 1901] & 0x001F) - 1 + 31; - - by_gregorian = month_total_day[month - 1] + day - 1; - - if((!(year % 4)) && (month > 2)) - by_gregorian++; - - if(by_gregorian >= by_spring) {/*Gregorian calendar days after the Spring Festival*/ - by_gregorian -= by_spring; - month = 1; - index = 1; - leep_month = false; - - if((calendar_chinese_table[year - 1901] & (0x80000 >> (index - 1))) == 0) - days_per_month = 29; - else - days_per_month = 30; - - while(by_gregorian >= days_per_month) { - by_gregorian -= days_per_month; - index++; - - if(month == ((calendar_chinese_table[year - 1901] & 0xF00000) >> 20)) { - leep_month = !leep_month; - if(leep_month == false) - month++; - } - else - month++; - - if((calendar_chinese_table[year - 1901] & (0x80000 >> (index - 1))) == 0) - days_per_month = 29; - else - days_per_month = 30; - } - day = by_gregorian + 1; - } - else {/*Solar day before the Spring Festival*/ - by_spring -= by_gregorian; - year--; - month = 12; - if(((calendar_chinese_table[year - 1901] & 0xF00000) >> 20) == 0) - index = 12; - else - index = 13; - leep_month = false; - - if((calendar_chinese_table[year - 1901] & (0x80000 >> (index - 1))) == 0) - days_per_month = 29; - else - days_per_month = 30; - - while(by_spring > days_per_month) { - by_spring -= days_per_month; - index--; - - if(leep_month == false) - month--; - - if(month == ((calendar_chinese_table[year - 1901] & 0xF00000) >> 20)) - leep_month = !leep_month; - - if((calendar_chinese_table[year - 1901] & (0x80000 >> (index - 1))) == 0) - days_per_month = 29; - else - days_per_month = 30; - } - - day = days_per_month - by_spring + 1; - } - chinese_time->today.day = day; - chinese_time->today.month = month; - chinese_time->today.year = year; - chinese_time->leep_month = leep_month; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_CALENDAR_CHINESE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_chinese.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_chinese.h deleted file mode 100644 index fb7a1bc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_chinese.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @file lv_calendar_chinese.h - * - */ - -#ifndef LV_CALENDAR_CHINESE_H -#define LV_CALENDAR_CHINESE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" -#include "lv_calendar.h" -#if LV_USE_CALENDAR && LV_USE_CALENDAR_CHINESE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_calendar_date_t today; - bool leep_month; -} lv_calendar_chinese_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Enable the chinese calendar. - * @param obj pointer to a calendar object. - * @param en true: enable chinese calendar; false: disable - */ -void lv_calendar_set_chinese_mode(lv_obj_t * obj, bool en); - -/** - * Get the name of the day - * @param gregorian to obtain the gregorian time for the name - * @return return the name of the day - */ -const char * lv_calendar_get_day_name(lv_calendar_date_t * gregorian); - -/** - * Get the chinese time of the gregorian time (reference: https://www.cnblogs.com/liyang31tg/p/4123171.html) - * @param gregorian_time need to convert to chinese time in gregorian time - * @param chinese_time the chinese time convert from gregorian time - */ -void lv_calendar_gregorian_to_chinese(lv_calendar_date_t * gregorian_time, lv_calendar_chinese_t * chinese_time); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_CALENDAR_CHINESE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CALENDAR_CHINESE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_chinese_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_chinese_private.h deleted file mode 100644 index 5572259..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_chinese_private.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @file lv_calendar_chinese_private.h - * - */ - -#ifndef LV_CALENDAR_CHINESE_PRIVATE_H -#define LV_CALENDAR_CHINESE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_calendar_chinese.h" - -#if LV_USE_CALENDAR && LV_USE_CALENDAR_CHINESE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_calendar_chinese_t { - lv_calendar_date_t today; - bool leep_month; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_CALENDAR && LV_USE_CALENDAR_CHINESE */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CALENDAR_CHINESE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_header_arrow.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_header_arrow.c deleted file mode 100644 index 09b201d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_header_arrow.c +++ /dev/null @@ -1,158 +0,0 @@ -/** - * @file lv_calendar_header_arrow.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj_class_private.h" -#include "lv_calendar_header_arrow.h" -#if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_ARROW - -#include "lv_calendar.h" -#include "../button/lv_button.h" -#include "../label/lv_label.h" -#include "../../layouts/flex/lv_flex.h" -#include "../../misc/lv_assert.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void month_event_cb(lv_event_t * e); -static void value_changed_event_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_calendar_header_arrow_class = { - .base_class = &lv_obj_class, - .constructor_cb = my_constructor, - .width_def = LV_PCT(100), - .height_def = LV_DPI_DEF / 3, - .name = "calendar-header-arrow", -}; - -static const char * month_names_def[12] = LV_CALENDAR_DEFAULT_MONTH_NAMES; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_calendar_header_arrow_create(lv_obj_t * parent) -{ - lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_header_arrow_class, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_TRACE_OBJ_CREATE("begin"); - - LV_UNUSED(class_p); - - lv_obj_move_to_index(obj, 0); - - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); - lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START); - - lv_obj_t * mo_prev = lv_button_create(obj); - lv_obj_set_style_bg_image_src(mo_prev, LV_SYMBOL_LEFT, 0); - lv_obj_set_height(mo_prev, lv_pct(100)); - lv_obj_update_layout(mo_prev); - int32_t btn_size = lv_obj_get_height(mo_prev); - lv_obj_set_width(mo_prev, btn_size); - - lv_obj_add_event_cb(mo_prev, month_event_cb, LV_EVENT_CLICKED, NULL); - lv_obj_remove_flag(mo_prev, LV_OBJ_FLAG_CLICK_FOCUSABLE); - - lv_obj_t * label = lv_label_create(obj); - lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); - lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0); - lv_obj_set_flex_grow(label, 1); - - lv_obj_t * mo_next = lv_button_create(obj); - lv_obj_set_style_bg_image_src(mo_next, LV_SYMBOL_RIGHT, 0); - lv_obj_set_size(mo_next, btn_size, btn_size); - - lv_obj_add_event_cb(mo_next, month_event_cb, LV_EVENT_CLICKED, NULL); - lv_obj_remove_flag(mo_next, LV_OBJ_FLAG_CLICK_FOCUSABLE); - - lv_obj_add_event_cb(obj, value_changed_event_cb, LV_EVENT_VALUE_CHANGED, NULL); - /*Refresh the drop downs*/ - lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); -} - -static void month_event_cb(lv_event_t * e) -{ - lv_obj_t * btn = lv_event_get_current_target(e); - - lv_obj_t * header = lv_obj_get_parent(btn); - lv_obj_t * calendar = lv_obj_get_parent(header); - - const lv_calendar_date_t * d; - d = lv_calendar_get_showed_date(calendar); - lv_calendar_date_t newd = *d; - - LV_ASSERT_FORMAT_MSG(newd.year >= 0 && newd.month >= 1 && newd.month <= 12, - "Invalid date: %d-%d", newd.year, newd.month); - - /*The last child is the right button*/ - if(lv_obj_get_child(header, 0) == btn) { - if(newd.month == 1) { - newd.month = 12; - newd.year --; - } - else { - newd.month --; - } - } - else { - if(newd.month == 12) { - newd.month = 1; - newd.year ++; - } - else { - newd.month ++; - } - } - - lv_calendar_set_showed_date(calendar, newd.year, newd.month); - - lv_obj_t * label = lv_obj_get_child(header, 1); - lv_label_set_text_fmt(label, "%d %s", newd.year, month_names_def[newd.month - 1]); -} - -static void value_changed_event_cb(lv_event_t * e) -{ - lv_obj_t * header = lv_event_get_current_target(e); - lv_obj_t * calendar = lv_obj_get_parent(header); - - const lv_calendar_date_t * date = lv_calendar_get_showed_date(calendar); - LV_ASSERT_FORMAT_MSG(date->year >= 0 && date->month >= 1 && date->month <= 12, - "Invalid date: %d-%d", date->year, date->month); - - lv_obj_t * label = lv_obj_get_child(header, 1); - lv_label_set_text_fmt(label, "%d %s", date->year, month_names_def[date->month - 1]); -} - -#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_header_arrow.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_header_arrow.h deleted file mode 100644 index a04b355..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_header_arrow.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @file lv_calendar_header_arrow.h - * - */ - -#ifndef LV_CALENDAR_HEADER_ARROW_H -#define LV_CALENDAR_HEADER_ARROW_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" -#if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_ARROW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_calendar_header_arrow_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a calendar header with drop-drowns to select the year and month - * @param parent pointer to a calendar object. - * @return the created header - */ -lv_obj_t * lv_calendar_header_arrow_create(lv_obj_t * parent); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CALENDAR_HEADER_ARROW_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_header_dropdown.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_header_dropdown.c deleted file mode 100644 index 41fe53a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_header_dropdown.c +++ /dev/null @@ -1,183 +0,0 @@ -/** - * @file lv_calendar_obj_dropdown.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj_class_private.h" -#include "lv_calendar_header_dropdown.h" -#if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_DROPDOWN - -#include "lv_calendar.h" -#include "../dropdown/lv_dropdown.h" -#include "../../layouts/flex/lv_flex.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void year_event_cb(lv_event_t * e); -static void month_event_cb(lv_event_t * e); -static void value_changed_event_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_calendar_header_dropdown_class = { - .base_class = &lv_obj_class, - .width_def = LV_PCT(100), - .height_def = LV_SIZE_CONTENT, - .constructor_cb = my_constructor, - .name = "calendar-header-dropdown", -}; - -static const char * month_list = "01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12"; -static const char * year_list = { - "2025\n2024\n2023\n2022\n2021\n" - "2020\n2019\n2018\n2017\n2016\n2015\n2014\n2013\n2012\n2011\n2010\n2009\n2008\n2007\n2006\n2005\n2004\n2003\n2002\n2001\n" - "2000\n1999\n1998\n1997\n1996\n1995\n1994\n1993\n1992\n1991\n1990\n1989\n1988\n1987\n1986\n1985\n1984\n1983\n1982\n1981\n" - "1980\n1979\n1978\n1977\n1976\n1975\n1974\n1973\n1972\n1971\n1970\n1969\n1968\n1967\n1966\n1965\n1964\n1963\n1962\n1961\n" - "1960\n1959\n1958\n1957\n1956\n1955\n1954\n1953\n1952\n1951\n1950\n1949\n1948\n1947\n1946\n1945\n1944\n1943\n1942\n1941\n" - "1940\n1939\n1938\n1937\n1936\n1935\n1934\n1933\n1932\n1931\n1930\n1929\n1928\n1927\n1926\n1925\n1924\n1923\n1922\n1921\n" - "1920\n1919\n1918\n1917\n1916\n1915\n1914\n1913\n1912\n1911\n1910\n1909\n1908\n1907\n1906\n1905\n1904\n1903\n1902\n1901" -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent) -{ - lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_header_dropdown_class, parent); - lv_obj_class_init_obj(obj); - - return obj; -} - -void lv_calendar_header_dropdown_set_year_list(lv_obj_t * parent, const char * years_list) -{ - /* Search for the header dropdown */ - lv_obj_t * header = lv_obj_get_child_by_type(parent, 0, &lv_calendar_header_dropdown_class); - if(NULL == header) { - /* Header not found */ - return; - } - - /* Search for the year dropdown - * Index is 0 because in the header dropdown constructor the year dropdown (year_dd) - * is the first created child of the header */ - const int32_t year_dropdown_index = 0; - lv_obj_t * year_dropdown = lv_obj_get_child_by_type(header, year_dropdown_index, &lv_dropdown_class); - if(NULL == year_dropdown) { - /* year dropdown not found */ - return; - } - - lv_dropdown_clear_options(year_dropdown); - lv_dropdown_set_options(year_dropdown, years_list); - - lv_obj_invalidate(parent); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_TRACE_OBJ_CREATE("begin"); - - LV_UNUSED(class_p); - - lv_obj_t * calendar = lv_obj_get_parent(obj); - lv_obj_move_to_index(obj, 0); - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); - - lv_obj_t * year_dd = lv_dropdown_create(obj); - lv_dropdown_set_options(year_dd, year_list); - lv_obj_add_event_cb(year_dd, year_event_cb, LV_EVENT_VALUE_CHANGED, calendar); - lv_obj_set_flex_grow(year_dd, 1); - - lv_obj_t * month_dd = lv_dropdown_create(obj); - lv_dropdown_set_options(month_dd, month_list); - lv_obj_add_event_cb(month_dd, month_event_cb, LV_EVENT_VALUE_CHANGED, calendar); - lv_obj_set_flex_grow(month_dd, 1); - - lv_obj_add_event_cb(obj, value_changed_event_cb, LV_EVENT_VALUE_CHANGED, NULL); - /*Refresh the drop downs*/ - lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); -} - -static void month_event_cb(lv_event_t * e) -{ - lv_obj_t * dropdown = lv_event_get_current_target(e); - lv_obj_t * calendar = lv_event_get_user_data(e); - - uint32_t sel = lv_dropdown_get_selected(dropdown); - - const lv_calendar_date_t * d; - d = lv_calendar_get_showed_date(calendar); - lv_calendar_date_t newd = *d; - newd.month = sel + 1; - - lv_calendar_set_showed_date(calendar, newd.year, newd.month); -} - -static void year_event_cb(lv_event_t * e) -{ - lv_obj_t * dropdown = lv_event_get_current_target(e); - lv_obj_t * calendar = lv_event_get_user_data(e); - - uint32_t sel = lv_dropdown_get_selected(dropdown); - - const lv_calendar_date_t * d; - d = lv_calendar_get_showed_date(calendar); - - /* Get the first year on the options list - * NOTE: Assumes the first 4 digits in the option list are numbers */ - const char * year_p = lv_dropdown_get_options(dropdown); - const uint32_t year = (year_p[0] - '0') * 1000 + (year_p[1] - '0') * 100 + (year_p[2] - '0') * 10 + - (year_p[3] - '0'); - - lv_calendar_date_t newd = *d; - newd.year = year - sel; - - lv_calendar_set_showed_date(calendar, newd.year, newd.month); -} - -static void value_changed_event_cb(lv_event_t * e) -{ - lv_obj_t * header = lv_event_get_current_target(e); - lv_obj_t * calendar = lv_obj_get_parent(header); - const lv_calendar_date_t * cur_date = lv_calendar_get_showed_date(calendar); - - lv_obj_t * year_dd = lv_obj_get_child(header, 0); - - /* Get the first year on the options list - * NOTE: Assumes the first 4 digits in the option list are numbers */ - const char * year_p = lv_dropdown_get_options(year_dd); - const uint32_t year = (year_p[0] - '0') * 1000 + (year_p[1] - '0') * 100 + (year_p[2] - '0') * 10 + - (year_p[3] - '0'); - - lv_dropdown_set_selected(year_dd, year - cur_date->year); - - lv_obj_t * month_dd = lv_obj_get_child(header, 1); - lv_dropdown_set_selected(month_dd, cur_date->month - 1); -} - -#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_header_dropdown.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_header_dropdown.h deleted file mode 100644 index 1ca8776..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_header_dropdown.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @file lv_calendar_header_dropdown.h - * - */ - -#ifndef LV_CALENDAR_HEADER_DROPDOWN_H -#define LV_CALENDAR_HEADER_DROPDOWN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" -#if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_DROPDOWN - -#if LV_USE_DROPDOWN == 0 -#error "LV_USE_DROPDOWN needs to be enabled" -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_calendar_header_dropdown_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a calendar header with drop-drowns to select the year and month - * @param parent pointer to a calendar object. - * @return the created header - */ -lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent); - -/** - * Sets a custom calendar year list - * @param parent pointer to a calendar object - * @param years_list pointer to an const char array with the years list, see lv_dropdown set_options for more information. - * E.g. `const char * years = "2023\n2022\n2021\n2020\n2019" - * Only the pointer will be saved so this variable can't be local which will be destroyed later. - */ -void lv_calendar_header_dropdown_set_year_list(lv_obj_t * parent, const char * years_list); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CALENDAR_HEADER_DROPDOWN_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_private.h deleted file mode 100644 index d4a9b53..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/calendar/lv_calendar_private.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @file lv_calendar_private.h - * - */ - -#ifndef LV_CALENDAR_PRIVATE_H -#define LV_CALENDAR_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_calendar.h" - -#if LV_USE_CALENDAR - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Data of calendar */ -struct lv_calendar_t { - lv_obj_t obj; - /* New data for this type */ - lv_obj_t * btnm; - lv_calendar_date_t today; /**< Date of today */ - lv_calendar_date_t showed_date; /**< Currently visible month (day is ignored) */ - lv_calendar_date_t * highlighted_dates; /**< Apply different style on these days (pointer to user-defined array) */ - size_t highlighted_dates_num; /**< Number of elements in `highlighted_days` */ - const char * map[8 * 7]; -#ifdef LV_USE_CALENDAR_CHINESE - bool use_chinese_calendar; - - /** 7 * 6: A week has 7 days, and the calendar displays 6 weeks in total. - * 20: Including the number of dates, line breaks, names for each day, - * and reserving several spaces for addresses. */ - char nums [7 * 6][20]; -#else - /** 7 * 6: A week has 7 days, and the calendar displays 6 weeks in total. - * 6: Including the number of dates, and reserving several spaces for - * addresses.*/ - char nums [7 * 6][4]; -#endif -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_CALENDAR */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CALENDAR_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/canvas/lv_canvas.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/canvas/lv_canvas.c deleted file mode 100644 index 4aa46f3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/canvas/lv_canvas.c +++ /dev/null @@ -1,435 +0,0 @@ -/** - * @file lv_canvas.c - * - */ - -/** - * Modified by NXP in 2024 - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_canvas_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_CANVAS != 0 -#include "../../misc/lv_assert.h" -#include "../../misc/lv_math.h" -#include "../../draw/lv_draw_private.h" -#include "../../core/lv_refr.h" -#include "../../display/lv_display.h" -#include "../../draw/sw/lv_draw_sw.h" -#include "../../stdlib/lv_string.h" -#include "../../misc/cache/lv_cache.h" -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_canvas_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_canvas_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_canvas_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_canvas_class = { - .constructor_cb = lv_canvas_constructor, - .destructor_cb = lv_canvas_destructor, - .instance_size = sizeof(lv_canvas_t), - .base_class = &lv_image_class, - .name = "canvas", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_canvas_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_canvas_set_buffer(lv_obj_t * obj, void * buf, int32_t w, int32_t h, lv_color_format_t cf) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(buf); - - lv_canvas_t * canvas = (lv_canvas_t *)obj; - uint32_t stride = lv_draw_buf_width_to_stride(w, cf); - lv_draw_buf_init(&canvas->static_buf, w, h, cf, stride, buf, stride * h); - canvas->draw_buf = &canvas->static_buf; - - const void * src = lv_image_get_src(obj); - if(src) { - lv_image_cache_drop(src); - } - - lv_image_set_src(obj, canvas->draw_buf); - lv_image_cache_drop(canvas->draw_buf); -} - -void lv_canvas_set_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(draw_buf); - - lv_canvas_t * canvas = (lv_canvas_t *)obj; - canvas->draw_buf = draw_buf; - - const void * src = lv_image_get_src(obj); - if(src) { - lv_image_cache_drop(src); - } - - lv_image_set_src(obj, draw_buf); - lv_image_cache_drop(draw_buf); -} - -void lv_canvas_set_px(lv_obj_t * obj, int32_t x, int32_t y, lv_color_t color, lv_opa_t opa) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_canvas_t * canvas = (lv_canvas_t *)obj; - lv_draw_buf_t * draw_buf = canvas->draw_buf; - - lv_color_format_t cf = draw_buf->header.cf; - uint8_t * data = lv_draw_buf_goto_xy(draw_buf, x, y); - - if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { - uint8_t shift; - uint8_t c_int = color.blue; - switch(cf) { - case LV_COLOR_FORMAT_I1: - shift = 7 - (x & 0x7); - break; - case LV_COLOR_FORMAT_I2: - shift = 6 - 2 * (x & 0x3); - break; - case LV_COLOR_FORMAT_I4: - shift = 4 - 4 * (x & 0x1); - break; - case LV_COLOR_FORMAT_I8: - /*Indexed8 format is a easy case, process and return.*/ - *data = c_int; - default: - return; - } - - uint8_t bpp = lv_color_format_get_bpp(cf); - uint8_t mask = (1 << bpp) - 1; - c_int &= mask; - *data = (*data & ~(mask << shift)) | (c_int << shift); - } - else if(cf == LV_COLOR_FORMAT_L8) { - *data = lv_color_luminance(color); - } - else if(cf == LV_COLOR_FORMAT_A8) { - *data = opa; - } - else if(cf == LV_COLOR_FORMAT_RGB565) { - lv_color16_t * buf = (lv_color16_t *)data; - buf->red = color.red >> 3; - buf->green = color.green >> 2; - buf->blue = color.blue >> 3; - } - else if(cf == LV_COLOR_FORMAT_RGB888) { - data[2] = color.red; - data[1] = color.green; - data[0] = color.blue; - } - else if(cf == LV_COLOR_FORMAT_XRGB8888) { - data[2] = color.red; - data[1] = color.green; - data[0] = color.blue; - data[3] = 0xFF; - } - else if(cf == LV_COLOR_FORMAT_ARGB8888) { - lv_color32_t * buf = (lv_color32_t *)data; - buf->red = color.red; - buf->green = color.green; - buf->blue = color.blue; - buf->alpha = opa; - } - else if(cf == LV_COLOR_FORMAT_AL88) { - lv_color16a_t * buf = (lv_color16a_t *)data; - buf->lumi = lv_color_luminance(color); - buf->alpha = 255; - } - lv_obj_invalidate(obj); -} - -void lv_canvas_set_palette(lv_obj_t * obj, uint8_t index, lv_color32_t color) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_canvas_t * canvas = (lv_canvas_t *)obj; - - lv_draw_buf_set_palette(canvas->draw_buf, index, color); - lv_obj_invalidate(obj); -} - -/*===================== - * Getter functions - *====================*/ - -lv_draw_buf_t * lv_canvas_get_draw_buf(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_canvas_t * canvas = (lv_canvas_t *)obj; - return canvas->draw_buf; -} - -lv_color32_t lv_canvas_get_px(lv_obj_t * obj, int32_t x, int32_t y) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_color32_t ret = { 0 }; - lv_canvas_t * canvas = (lv_canvas_t *)obj; - if(canvas->draw_buf == NULL) return ret; - - lv_image_header_t * header = &canvas->draw_buf->header; - const uint8_t * px = lv_draw_buf_goto_xy(canvas->draw_buf, x, y); - - switch(header->cf) { - case LV_COLOR_FORMAT_ARGB8888: - ret = *(lv_color32_t *)px; - break; - case LV_COLOR_FORMAT_RGB888: - case LV_COLOR_FORMAT_XRGB8888: - ret.red = px[2]; - ret.green = px[1]; - ret.blue = px[0]; - ret.alpha = 0xFF; - break; - case LV_COLOR_FORMAT_RGB565: { - lv_color16_t * c16 = (lv_color16_t *) px; - ret.red = (c16[x].red * 2106) >> 8; /*To make it rounded*/ - ret.green = (c16[x].green * 1037) >> 8; - ret.blue = (c16[x].blue * 2106) >> 8; - ret.alpha = 0xFF; - break; - } - case LV_COLOR_FORMAT_A8: { - lv_color_t alpha_color = lv_obj_get_style_image_recolor(obj, LV_PART_MAIN); - ret.red = alpha_color.red; - ret.green = alpha_color.green; - ret.blue = alpha_color.blue; - ret.alpha = px[0]; - break; - } - case LV_COLOR_FORMAT_L8: { - ret.red = *px; - ret.green = *px; - ret.blue = *px; - ret.alpha = 0xFF; - break; - } - default: - lv_memzero(&ret, sizeof(lv_color32_t)); - break; - } - - return ret; -} - -lv_image_dsc_t * lv_canvas_get_image(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_canvas_t * canvas = (lv_canvas_t *)obj; - return (lv_image_dsc_t *)canvas->draw_buf; -} - -const void * lv_canvas_get_buf(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_canvas_t * canvas = (lv_canvas_t *)obj; - if(canvas->draw_buf) - return canvas->draw_buf->unaligned_data; - - return NULL; -} - -/*===================== - * Other functions - *====================*/ - -void lv_canvas_copy_buf(lv_obj_t * obj, const lv_area_t * canvas_area, lv_draw_buf_t * dest_buf, - const lv_area_t * dest_area) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(canvas_area && dest_buf); - - lv_canvas_t * canvas = (lv_canvas_t *)obj; - if(canvas->draw_buf == NULL) return; - - LV_ASSERT_MSG(canvas->draw_buf->header.cf == dest_buf->header.cf, "Color formats must be the same"); - - lv_draw_buf_copy(canvas->draw_buf, canvas_area, dest_buf, dest_area); -} - -void lv_canvas_fill_bg(lv_obj_t * obj, lv_color_t color, lv_opa_t opa) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_canvas_t * canvas = (lv_canvas_t *)obj; - lv_draw_buf_t * draw_buf = canvas->draw_buf; - if(draw_buf == NULL) return; - - lv_image_header_t * header = &draw_buf->header; - uint32_t x; - uint32_t y; - - uint32_t stride = header->stride; - uint8_t * data = draw_buf->data; - if(header->cf == LV_COLOR_FORMAT_RGB565) { - uint16_t c16 = lv_color_to_u16(color); - for(y = 0; y < header->h; y++) { - uint16_t * buf16 = (uint16_t *)(data + y * stride); - for(x = 0; x < header->w; x++) { - buf16[x] = c16; - } - } - } - else if(header->cf == LV_COLOR_FORMAT_XRGB8888 || header->cf == LV_COLOR_FORMAT_ARGB8888) { - uint32_t c32 = lv_color_to_u32(color); - if(header->cf == LV_COLOR_FORMAT_ARGB8888) { - c32 &= 0x00ffffff; - c32 |= (uint32_t)opa << 24; - } - for(y = 0; y < header->h; y++) { - uint32_t * buf32 = (uint32_t *)(data + y * stride); - for(x = 0; x < header->w; x++) { - buf32[x] = c32; - } - } - } - else if(header->cf == LV_COLOR_FORMAT_RGB888) { - for(y = 0; y < header->h; y++) { - uint8_t * buf8 = (uint8_t *)(data + y * stride); - for(x = 0; x < header->w * 3; x += 3) { - buf8[x + 0] = color.blue; - buf8[x + 1] = color.green; - buf8[x + 2] = color.red; - } - } - } - else if(header->cf == LV_COLOR_FORMAT_L8) { - uint8_t c8 = lv_color_luminance(color); - for(y = 0; y < header->h; y++) { - uint8_t * buf = (uint8_t *)(data + y * stride); - for(x = 0; x < header->w; x++) { - buf[x] = c8; - } - } - } - else if(header->cf == LV_COLOR_FORMAT_AL88) { - lv_color16a_t c; - c.lumi = lv_color_luminance(color); - c.alpha = 255; - for(y = 0; y < header->h; y++) { - lv_color16a_t * buf = (lv_color16a_t *)(data + y * stride); - for(x = 0; x < header->w; x++) { - buf[x] = c; - } - } - } - - else { - for(y = 0; y < header->h; y++) { - for(x = 0; x < header->w; x++) { - lv_canvas_set_px(obj, x, y, color, opa); - } - } - } - - lv_obj_invalidate(obj); -} - -void lv_canvas_init_layer(lv_obj_t * obj, lv_layer_t * layer) -{ - LV_ASSERT_NULL(obj); - LV_ASSERT_NULL(layer); - lv_canvas_t * canvas = (lv_canvas_t *)obj; - if(canvas->draw_buf == NULL) return; - - lv_image_header_t * header = &canvas->draw_buf->header; - lv_area_t canvas_area = {0, 0, header->w - 1, header->h - 1}; - lv_memzero(layer, sizeof(*layer)); - - layer->draw_buf = canvas->draw_buf; - layer->color_format = header->cf; - layer->buf_area = canvas_area; - layer->_clip_area = canvas_area; - layer->phy_clip_area = canvas_area; -#if LV_DRAW_TRANSFORM_USE_MATRIX - lv_matrix_identity(&layer->matrix); -#endif -} - -void lv_canvas_finish_layer(lv_obj_t * canvas, lv_layer_t * layer) -{ - if(layer->draw_task_head == NULL) return; - - bool task_dispatched; - - while(layer->draw_task_head) { - lv_draw_dispatch_wait_for_request(); - task_dispatched = lv_draw_dispatch_layer(lv_obj_get_display(canvas), layer); - - if(!task_dispatched) { - lv_draw_wait_for_finish(); - lv_draw_dispatch_request(); - } - } - lv_obj_invalidate(canvas); -} - -uint32_t lv_canvas_buf_size(int32_t w, int32_t h, uint8_t bpp, uint8_t stride) -{ - return (uint32_t)LV_CANVAS_BUF_SIZE(w, h, bpp, stride); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_canvas_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_UNUSED(obj); -} - -static void lv_canvas_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_canvas_t * canvas = (lv_canvas_t *)obj; - if(canvas->draw_buf == NULL) return; - - lv_image_cache_drop(&canvas->draw_buf); -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/canvas/lv_canvas.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/canvas/lv_canvas.h deleted file mode 100644 index d669b17..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/canvas/lv_canvas.h +++ /dev/null @@ -1,185 +0,0 @@ -/** - * @file lv_canvas.h - * - */ - -#ifndef LV_CANVAS_H -#define LV_CANVAS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -#if LV_USE_CANVAS != 0 - -#include "../image/lv_image.h" -#include "../../draw/lv_draw_image.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_canvas_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a canvas object - * @param parent pointer to an object, it will be the parent of the new canvas - * @return pointer to the created canvas - */ -lv_obj_t * lv_canvas_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a buffer for the canvas. - * - * Use lv_canvas_set_draw_buf() instead if you need to set a buffer with alignment requirement. - * - * @param obj pointer to a canvas object - * @param buf buffer where content of canvas will be. - * The required size is (lv_image_color_format_get_px_size(cf) * w) / 8 * h) - * It can be allocated with `lv_malloc()` or - * it can be statically allocated array (e.g. static lv_color_t buf[100*50]) or - * it can be an address in RAM or external SRAM - * @param w width of canvas - * @param h height of canvas - * @param cf color format. `LV_COLOR_FORMAT...` - */ -void lv_canvas_set_buffer(lv_obj_t * obj, void * buf, int32_t w, int32_t h, lv_color_format_t cf); - -/** - * Set a draw buffer for the canvas. A draw buffer either can be allocated by `lv_draw_buf_create()` - * or defined statically by `LV_DRAW_BUF_DEFINE_STATIC`. When buffer start address and stride has alignment - * requirement, it's recommended to use `lv_draw_buf_create`. - * @param obj pointer to a canvas object - * @param draw_buf pointer to a draw buffer - */ -void lv_canvas_set_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf); - -/** - * Set a pixel's color and opacity - * @param obj pointer to a canvas - * @param x X coordinate of the pixel - * @param y Y coordinate of the pixel - * @param color the color - * @param opa the opacity - * @note The following color formats are supported - * LV_COLOR_FORMAT_I1/2/4/8, LV_COLOR_FORMAT_A8, - * LV_COLOR_FORMAT_RGB565, LV_COLOR_FORMAT_RGB888, - * LV_COLOR_FORMAT_XRGB8888, LV_COLOR_FORMAT_ARGB8888 - */ -void lv_canvas_set_px(lv_obj_t * obj, int32_t x, int32_t y, lv_color_t color, lv_opa_t opa); - -/** - * Set the palette color of a canvas for index format. Valid only for `LV_COLOR_FORMAT_I1/2/4/8` - * @param obj pointer to canvas object - * @param index the palette color to set: - * - for `LV_COLOR_FORMAT_I1`: 0..1 - * - for `LV_COLOR_FORMAT_I2`: 0..3 - * - for `LV_COLOR_FORMAT_I4`: 0..15 - * - for `LV_COLOR_FORMAT_I8`: 0..255 - * @param color the color to set - */ -void lv_canvas_set_palette(lv_obj_t * obj, uint8_t index, lv_color32_t color); - -/*===================== - * Getter functions - *====================*/ - -lv_draw_buf_t * lv_canvas_get_draw_buf(lv_obj_t * obj); - -/** - * Get a pixel's color and opacity - * @param obj pointer to a canvas - * @param x X coordinate of the pixel - * @param y Y coordinate of the pixel - * @return ARGB8888 color of the pixel - */ -lv_color32_t lv_canvas_get_px(lv_obj_t * obj, int32_t x, int32_t y); - -/** - * Get the image of the canvas as a pointer to an `lv_image_dsc_t` variable. - * @param canvas pointer to a canvas object - * @return pointer to the image descriptor. - */ -lv_image_dsc_t * lv_canvas_get_image(lv_obj_t * canvas); - -/** - * Return the pointer for the buffer. - * It's recommended to use this function instead of the buffer form the - * return value of lv_canvas_get_image() as is can be aligned - * @param canvas pointer to a canvas object - * @return pointer to the buffer - */ -const void * lv_canvas_get_buf(lv_obj_t * canvas); - -/*===================== - * Other functions - *====================*/ - -/** - * Copy a buffer to the canvas - * @param obj pointer to a canvas object - * @param canvas_area the area of the canvas to copy - * @param dest_buf pointer to a buffer to store the copied data - * @param dest_area the area of the destination buffer to copy to. If omitted NULL, copy to the whole `dest_buf` - */ -void lv_canvas_copy_buf(lv_obj_t * obj, const lv_area_t * canvas_area, lv_draw_buf_t * dest_buf, - const lv_area_t * dest_area); - -/** - * Fill the canvas with color - * @param obj pointer to a canvas - * @param color the background color - * @param opa the desired opacity - */ -void lv_canvas_fill_bg(lv_obj_t * obj, lv_color_t color, lv_opa_t opa); - -/** - * Initialize a layer to use LVGL's generic draw functions (lv_draw_rect/label/...) on the canvas. - * Needs to be usd in pair with `lv_canvas_finish_layer`. - * @param canvas pointer to a canvas - * @param layer pointer to a layer variable to initialize - */ -void lv_canvas_init_layer(lv_obj_t * canvas, lv_layer_t * layer); - -/** - * Wait until all the drawings are finished on layer. - * Needs to be usd in pair with `lv_canvas_init_layer`. - * @param canvas pointer to a canvas - * @param layer pointer to a layer to finalize - */ -void lv_canvas_finish_layer(lv_obj_t * canvas, lv_layer_t * layer); - -/********************** - * MACROS - **********************/ - -#define LV_CANVAS_BUF_SIZE(w, h, bpp, stride) (((((w * bpp + 7) >> 3) + stride - 1) & ~(stride - 1)) * h + LV_DRAW_BUF_ALIGN) - -/** - * Just a wrapper to `LV_CANVAS_BUF_SIZE` for bindings. - */ -uint32_t lv_canvas_buf_size(int32_t w, int32_t h, uint8_t bpp, uint8_t stride); - -#endif /*LV_USE_CANVAS*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CANVAS_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/canvas/lv_canvas_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/canvas/lv_canvas_private.h deleted file mode 100644 index e43b8f3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/canvas/lv_canvas_private.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file lv_canvas_private.h - * - */ - -#ifndef LV_CANVAS_PRIVATE_H -#define LV_CANVAS_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../image/lv_image_private.h" -#include "lv_canvas.h" - -#if LV_USE_CANVAS != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Canvas data */ -struct lv_canvas_t { - lv_image_t img; - lv_draw_buf_t * draw_buf; - lv_draw_buf_t static_buf; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_CANVAS != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CANVAS_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/chart/lv_chart.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/chart/lv_chart.c deleted file mode 100644 index 4639cd5..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/chart/lv_chart.c +++ /dev/null @@ -1,1360 +0,0 @@ -/** - * @file lv_chart.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_chart_private.h" -#include "../../misc/lv_area_private.h" -#include "../../draw/lv_draw_private.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_CHART != 0 - -#include "../../misc/lv_assert.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_chart_class) - -#define LV_CHART_HDIV_DEF 3 -#define LV_CHART_VDIV_DEF 5 -#define LV_CHART_POINT_CNT_DEF 10 -#define LV_CHART_LABEL_MAX_TEXT_LENGTH 16 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_chart_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_chart_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_chart_event(const lv_obj_class_t * class_p, lv_event_t * e); - -static void draw_div_lines(lv_obj_t * obj, lv_layer_t * layer); -static void draw_series_line(lv_obj_t * obj, lv_layer_t * layer); -static void draw_series_bar(lv_obj_t * obj, lv_layer_t * layer); -static void draw_series_scatter(lv_obj_t * obj, lv_layer_t * layer); -static void draw_cursors(lv_obj_t * obj, lv_layer_t * layer); -static uint32_t get_index_from_x(lv_obj_t * obj, int32_t x); -static void invalidate_point(lv_obj_t * obj, uint32_t i); -static void new_points_alloc(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t cnt, int32_t ** a); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_chart_class = { - .constructor_cb = lv_chart_constructor, - .destructor_cb = lv_chart_destructor, - .event_cb = lv_chart_event, - .width_def = LV_PCT(100), - .height_def = LV_DPI_DEF * 2, - .instance_size = sizeof(lv_chart_t), - .base_class = &lv_obj_class, - .name = "chart", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_chart_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -void lv_chart_set_type(lv_obj_t * obj, lv_chart_type_t type) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_chart_t * chart = (lv_chart_t *)obj; - if(chart->type == type) return; - - if(chart->type == LV_CHART_TYPE_SCATTER) { - lv_chart_series_t * ser; - LV_LL_READ_BACK(&chart->series_ll, ser) { - lv_free(ser->x_points); - ser->x_points = NULL; - } - } - - if(type == LV_CHART_TYPE_SCATTER) { - lv_chart_series_t * ser; - LV_LL_READ_BACK(&chart->series_ll, ser) { - ser->x_points = lv_malloc(sizeof(lv_point_t) * chart->point_cnt); - LV_ASSERT_MALLOC(ser->x_points); - if(ser->x_points == NULL) return; - } - } - - chart->type = type; - - lv_chart_refresh(obj); -} - -void lv_chart_set_point_count(lv_obj_t * obj, uint32_t cnt) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_chart_t * chart = (lv_chart_t *)obj; - if(chart->point_cnt == cnt) return; - - lv_chart_series_t * ser; - - if(cnt < 1) cnt = 1; - - LV_LL_READ_BACK(&chart->series_ll, ser) { - if(chart->type == LV_CHART_TYPE_SCATTER) { - if(!ser->x_ext_buf_assigned) new_points_alloc(obj, ser, cnt, &ser->x_points); - } - if(!ser->y_ext_buf_assigned) new_points_alloc(obj, ser, cnt, &ser->y_points); - ser->start_point = 0; - } - - chart->point_cnt = cnt; - - lv_chart_refresh(obj); -} - -void lv_chart_set_range(lv_obj_t * obj, lv_chart_axis_t axis, int32_t min, int32_t max) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - max = max == min ? max + 1 : max; - - lv_chart_t * chart = (lv_chart_t *)obj; - switch(axis) { - case LV_CHART_AXIS_PRIMARY_Y: - chart->ymin[0] = min; - chart->ymax[0] = max; - break; - case LV_CHART_AXIS_SECONDARY_Y: - chart->ymin[1] = min; - chart->ymax[1] = max; - break; - case LV_CHART_AXIS_PRIMARY_X: - chart->xmin[0] = min; - chart->xmax[0] = max; - break; - case LV_CHART_AXIS_SECONDARY_X: - chart->xmin[1] = min; - chart->xmax[1] = max; - break; - default: - LV_LOG_WARN("Invalid axis: %d", axis); - return; - } - - lv_chart_refresh(obj); -} - -void lv_chart_set_update_mode(lv_obj_t * obj, lv_chart_update_mode_t update_mode) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_chart_t * chart = (lv_chart_t *)obj; - if(chart->update_mode == update_mode) return; - - chart->update_mode = update_mode; - lv_obj_invalidate(obj); -} - -void lv_chart_set_div_line_count(lv_obj_t * obj, uint8_t hdiv, uint8_t vdiv) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_chart_t * chart = (lv_chart_t *)obj; - if(chart->hdiv_cnt == hdiv && chart->vdiv_cnt == vdiv) return; - - chart->hdiv_cnt = hdiv; - chart->vdiv_cnt = vdiv; - - lv_obj_invalidate(obj); -} - -lv_chart_type_t lv_chart_get_type(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_chart_t * chart = (lv_chart_t *)obj; - return chart->type; -} - -uint32_t lv_chart_get_point_count(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_chart_t * chart = (lv_chart_t *)obj; - return chart->point_cnt; -} - -uint32_t lv_chart_get_x_start_point(const lv_obj_t * obj, lv_chart_series_t * ser) -{ - LV_ASSERT_NULL(ser); - LV_UNUSED(obj); - - return ser->start_point; -} - -void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, lv_point_t * p_out) -{ - LV_ASSERT_NULL(obj); - LV_ASSERT_NULL(ser); - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_chart_t * chart = (lv_chart_t *)obj; - if(id >= chart->point_cnt) { - LV_LOG_WARN("Invalid index: %"LV_PRIu32, id); - p_out->x = 0; - p_out->y = 0; - return; - } - - int32_t w = lv_obj_get_content_width(obj); - int32_t h = lv_obj_get_content_height(obj); - - if(chart->type == LV_CHART_TYPE_LINE) { - p_out->x = (w * id) / (chart->point_cnt - 1); - } - else if(chart->type == LV_CHART_TYPE_SCATTER) { - p_out->x = lv_map(ser->x_points[id], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w); - } - else if(chart->type == LV_CHART_TYPE_BAR) { - uint32_t ser_cnt = lv_ll_get_len(&chart->series_ll); - int32_t ser_gap = lv_obj_get_style_pad_column(obj, LV_PART_ITEMS); - - /*Gap between the columns on adjacent X ticks*/ - int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); - - int32_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; - - p_out->x = (int32_t)((int32_t)(w - block_w) * id) / (chart->point_cnt - 1); - lv_chart_series_t * ser_i = NULL; - uint32_t ser_idx = 0; - LV_LL_READ_BACK(&chart->series_ll, ser_i) { - if(ser_i == ser) break; - ser_idx++; - } - - p_out->x = (int32_t)((int32_t)(w + block_gap) * id) / chart->point_cnt; - p_out->x += block_w * ser_idx / ser_cnt; - - int32_t col_w = (block_w - (ser_gap * (ser_cnt - 1))) / ser_cnt; - p_out->x += col_w / 2; - } - - int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - p_out->x += lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; - p_out->x -= lv_obj_get_scroll_left(obj); - - uint32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; - id = ((int32_t)start_point + id) % chart->point_cnt; - int32_t temp_y = 0; - temp_y = (int32_t)((int32_t)ser->y_points[id] - chart->ymin[ser->y_axis_sec]) * h; - temp_y = temp_y / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); - p_out->y = h - temp_y; - p_out->y += lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; - p_out->y -= lv_obj_get_scroll_top(obj); -} - -void lv_chart_refresh(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_invalidate(obj); -} - -/*====================== - * Series - *=====================*/ - -lv_chart_series_t * lv_chart_add_series(lv_obj_t * obj, lv_color_t color, lv_chart_axis_t axis) -{ - LV_LOG_INFO("begin"); - - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_chart_t * chart = (lv_chart_t *)obj; - - /* Allocate space for a new series and add it to the chart series linked list */ - lv_chart_series_t * ser = lv_ll_ins_tail(&chart->series_ll); - LV_ASSERT_MALLOC(ser); - if(ser == NULL) return NULL; - lv_memzero(ser, sizeof(lv_chart_series_t)); - - /* Allocate memory for point_cnt points, handle failure below */ - ser->y_points = lv_malloc(sizeof(int32_t) * chart->point_cnt); - LV_ASSERT_MALLOC(ser->y_points); - - if(chart->type == LV_CHART_TYPE_SCATTER) { - ser->x_points = lv_malloc(sizeof(int32_t) * chart->point_cnt); - LV_ASSERT_MALLOC(ser->x_points); - if(NULL == ser->x_points) { - lv_free(ser->y_points); - lv_ll_remove(&chart->series_ll, ser); - lv_free(ser); - return NULL; - } - } - else { - ser->x_points = NULL; - } - - if(ser->y_points == NULL) { - if(ser->x_points) { - lv_free(ser->x_points); - ser->x_points = NULL; - } - - lv_ll_remove(&chart->series_ll, ser); - lv_free(ser); - return NULL; - } - - /* Set series properties on successful allocation */ - ser->color = color; - ser->start_point = 0; - ser->y_ext_buf_assigned = false; - ser->hidden = 0; - ser->x_axis_sec = axis & LV_CHART_AXIS_SECONDARY_X ? 1 : 0; - ser->y_axis_sec = axis & LV_CHART_AXIS_SECONDARY_Y ? 1 : 0; - - uint32_t i; - const int32_t def = LV_CHART_POINT_NONE; - int32_t * p_tmp = ser->y_points; - for(i = 0; i < chart->point_cnt; i++) { - *p_tmp = def; - p_tmp++; - } - - return ser; -} - -void lv_chart_remove_series(lv_obj_t * obj, lv_chart_series_t * series) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(series); - - lv_chart_t * chart = (lv_chart_t *)obj; - if(!series->y_ext_buf_assigned && series->y_points) lv_free(series->y_points); - if(!series->x_ext_buf_assigned && series->x_points) lv_free(series->x_points); - - lv_ll_remove(&chart->series_ll, series); - lv_free(series); - - return; -} - -void lv_chart_hide_series(lv_obj_t * chart, lv_chart_series_t * series, bool hide) -{ - LV_ASSERT_OBJ(chart, MY_CLASS); - LV_ASSERT_NULL(series); - - series->hidden = hide ? 1 : 0; - lv_chart_refresh(chart); -} - -void lv_chart_set_series_color(lv_obj_t * chart, lv_chart_series_t * series, lv_color_t color) -{ - LV_ASSERT_OBJ(chart, MY_CLASS); - LV_ASSERT_NULL(series); - - series->color = color; - lv_chart_refresh(chart); -} - -lv_color_t lv_chart_get_series_color(lv_obj_t * chart, const lv_chart_series_t * series) -{ - LV_ASSERT_OBJ(chart, MY_CLASS); - LV_ASSERT_NULL(series); - LV_UNUSED(chart); - - return series->color; -} - -void lv_chart_set_x_start_point(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(ser); - - lv_chart_t * chart = (lv_chart_t *)obj; - if(id >= chart->point_cnt) return; - ser->start_point = id; -} - -lv_chart_series_t * lv_chart_get_series_next(const lv_obj_t * obj, const lv_chart_series_t * ser) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_chart_t * chart = (lv_chart_t *)obj; - if(ser == NULL) return lv_ll_get_head(&chart->series_ll); - else return lv_ll_get_next(&chart->series_ll, ser); -} - -/*===================== - * Cursor - *====================*/ - -lv_chart_cursor_t * lv_chart_add_cursor(lv_obj_t * obj, lv_color_t color, lv_dir_t dir) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_chart_t * chart = (lv_chart_t *)obj; - lv_chart_cursor_t * cursor = lv_ll_ins_head(&chart->cursor_ll); - LV_ASSERT_MALLOC(cursor); - if(cursor == NULL) return NULL; - - lv_point_set(&cursor->pos, LV_CHART_POINT_NONE, LV_CHART_POINT_NONE); - cursor->point_id = LV_CHART_POINT_NONE; - cursor->pos_set = 0; - cursor->color = color; - cursor->dir = dir; - - return cursor; -} - -void lv_chart_set_cursor_pos(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_point_t * pos) -{ - LV_ASSERT_NULL(cursor); - LV_UNUSED(chart); - - cursor->pos = *pos; - cursor->pos_set = 1; - lv_chart_refresh(chart); -} - -void lv_chart_set_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_chart_series_t * ser, uint32_t point_id) -{ - LV_ASSERT_NULL(cursor); - LV_UNUSED(chart); - - cursor->point_id = point_id; - cursor->pos_set = 0; - if(ser == NULL) ser = lv_chart_get_series_next(chart, NULL); - cursor->ser = ser; - lv_chart_refresh(chart); -} - -lv_point_t lv_chart_get_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor) -{ - LV_ASSERT_NULL(cursor); - LV_UNUSED(chart); - - return cursor->pos; -} - -/*===================== - * Set/Get value(s) - *====================*/ - -void lv_chart_set_all_value(lv_obj_t * obj, lv_chart_series_t * ser, int32_t value) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(ser); - - lv_chart_t * chart = (lv_chart_t *)obj; - uint32_t i; - for(i = 0; i < chart->point_cnt; i++) { - ser->y_points[i] = value; - } - ser->start_point = 0; - lv_chart_refresh(obj); -} - -void lv_chart_set_next_value(lv_obj_t * obj, lv_chart_series_t * ser, int32_t value) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(ser); - - lv_chart_t * chart = (lv_chart_t *)obj; - ser->y_points[ser->start_point] = value; - invalidate_point(obj, ser->start_point); - ser->start_point = (ser->start_point + 1) % chart->point_cnt; - invalidate_point(obj, ser->start_point); -} - -void lv_chart_set_next_value2(lv_obj_t * obj, lv_chart_series_t * ser, int32_t x_value, int32_t y_value) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(ser); - - lv_chart_t * chart = (lv_chart_t *)obj; - - if(chart->type != LV_CHART_TYPE_SCATTER) { - LV_LOG_WARN("Type must be LV_CHART_TYPE_SCATTER"); - return; - } - - ser->x_points[ser->start_point] = x_value; - ser->y_points[ser->start_point] = y_value; - ser->start_point = (ser->start_point + 1) % chart->point_cnt; - invalidate_point(obj, ser->start_point); -} - -void lv_chart_set_value_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, int32_t value) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(ser); - lv_chart_t * chart = (lv_chart_t *)obj; - - if(id >= chart->point_cnt) return; - ser->y_points[id] = value; - invalidate_point(obj, id); -} - -void lv_chart_set_value_by_id2(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, int32_t x_value, - int32_t y_value) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(ser); - lv_chart_t * chart = (lv_chart_t *)obj; - - if(chart->type != LV_CHART_TYPE_SCATTER) { - LV_LOG_WARN("Type must be LV_CHART_TYPE_SCATTER"); - return; - } - - if(id >= chart->point_cnt) return; - ser->x_points[id] = x_value; - ser->y_points[id] = y_value; - invalidate_point(obj, id); -} - -void lv_chart_set_ext_y_array(lv_obj_t * obj, lv_chart_series_t * ser, int32_t array[]) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(ser); - - if(!ser->y_ext_buf_assigned && ser->y_points) lv_free(ser->y_points); - ser->y_ext_buf_assigned = true; - ser->y_points = array; - lv_obj_invalidate(obj); -} - -void lv_chart_set_ext_x_array(lv_obj_t * obj, lv_chart_series_t * ser, int32_t array[]) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(ser); - - if(!ser->x_ext_buf_assigned && ser->x_points) lv_free(ser->x_points); - ser->x_ext_buf_assigned = true; - ser->x_points = array; - lv_obj_invalidate(obj); -} - -int32_t * lv_chart_get_y_array(const lv_obj_t * obj, lv_chart_series_t * ser) -{ - LV_UNUSED(obj); - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(ser); - return ser->y_points; -} - -int32_t * lv_chart_get_x_array(const lv_obj_t * obj, lv_chart_series_t * ser) -{ - LV_UNUSED(obj); - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(ser); - return ser->x_points; -} - -uint32_t lv_chart_get_pressed_point(const lv_obj_t * obj) -{ - lv_chart_t * chart = (lv_chart_t *)obj; - return chart->pressed_point_id; -} - -int32_t lv_chart_get_first_point_center_offset(lv_obj_t * obj) -{ - lv_chart_t * chart = (lv_chart_t *)obj; - - int32_t x_ofs = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - if(chart->type == LV_CHART_TYPE_BAR) { - lv_obj_update_layout(obj); - /*Gap between the columns on ~adjacent X*/ - int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); - int32_t w = lv_obj_get_content_width(obj); - int32_t block_w = (w + block_gap) / (chart->point_cnt); - - x_ofs += (block_w - block_gap) / 2; - } - - return x_ofs; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_chart_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_chart_t * chart = (lv_chart_t *)obj; - - lv_ll_init(&chart->series_ll, sizeof(lv_chart_series_t)); - lv_ll_init(&chart->cursor_ll, sizeof(lv_chart_cursor_t)); - - chart->ymin[0] = 0; - chart->xmin[0] = 0; - chart->ymin[1] = 0; - chart->xmin[1] = 0; - chart->ymax[0] = 100; - chart->xmax[0] = 100; - chart->ymax[1] = 100; - chart->xmax[1] = 100; - - chart->hdiv_cnt = LV_CHART_HDIV_DEF; - chart->vdiv_cnt = LV_CHART_VDIV_DEF; - chart->point_cnt = LV_CHART_POINT_CNT_DEF; - chart->pressed_point_id = LV_CHART_POINT_NONE; - chart->type = LV_CHART_TYPE_LINE; - chart->update_mode = LV_CHART_UPDATE_MODE_SHIFT; - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_chart_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_chart_t * chart = (lv_chart_t *)obj; - lv_chart_series_t * ser; - while(chart->series_ll.head) { - ser = lv_ll_get_head(&chart->series_ll); - if(!ser) continue; - - if(!ser->y_ext_buf_assigned) lv_free(ser->y_points); - if(!ser->x_ext_buf_assigned) lv_free(ser->x_points); - - lv_ll_remove(&chart->series_ll, ser); - lv_free(ser); - } - lv_ll_clear(&chart->series_ll); - - lv_chart_cursor_t * cur; - while(chart->cursor_ll.head) { - cur = lv_ll_get_head(&chart->cursor_ll); - lv_ll_remove(&chart->cursor_ll, cur); - lv_free(cur); - } - lv_ll_clear(&chart->cursor_ll); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_chart_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - /*Call the ancestor's event handler*/ - lv_result_t res; - - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - - lv_chart_t * chart = (lv_chart_t *)obj; - if(code == LV_EVENT_PRESSED) { - lv_indev_t * indev = lv_indev_active(); - lv_point_t p; - lv_indev_get_point(indev, &p); - - p.x -= obj->coords.x1; - uint32_t id = get_index_from_x(obj, p.x + lv_obj_get_scroll_left(obj)); - if(id != (uint32_t)chart->pressed_point_id) { - invalidate_point(obj, id); - invalidate_point(obj, chart->pressed_point_id); - chart->pressed_point_id = id; - lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - } - } - else if(code == LV_EVENT_RELEASED) { - invalidate_point(obj, chart->pressed_point_id); - chart->pressed_point_id = LV_CHART_POINT_NONE; - } - else if(code == LV_EVENT_DRAW_MAIN) { - lv_layer_t * layer = lv_event_get_layer(e); - draw_div_lines(obj, layer); - - if(lv_ll_is_empty(&chart->series_ll) == false) { - if(chart->type == LV_CHART_TYPE_LINE) draw_series_line(obj, layer); - else if(chart->type == LV_CHART_TYPE_BAR) draw_series_bar(obj, layer); - else if(chart->type == LV_CHART_TYPE_SCATTER) draw_series_scatter(obj, layer); - } - - draw_cursors(obj, layer); - } -} - -static void draw_div_lines(lv_obj_t * obj, lv_layer_t * layer) -{ - lv_chart_t * chart = (lv_chart_t *)obj; - - lv_area_t series_clip_area; - bool mask_ret = lv_area_intersect(&series_clip_area, &obj->coords, &layer->_clip_area); - if(mask_ret == false) return; - - const lv_area_t clip_area_ori = layer->_clip_area; - layer->_clip_area = series_clip_area; - - int16_t i; - int16_t i_start; - int16_t i_end; - int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; - int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; - int32_t w = lv_obj_get_content_width(obj); - int32_t h = lv_obj_get_content_height(obj); - - lv_draw_line_dsc_t line_dsc; - lv_draw_line_dsc_init(&line_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &line_dsc); - - lv_opa_t border_opa = lv_obj_get_style_border_opa(obj, LV_PART_MAIN); - int32_t border_w = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - lv_border_side_t border_side = lv_obj_get_style_border_side(obj, LV_PART_MAIN); - - int32_t scroll_left = lv_obj_get_scroll_left(obj); - int32_t scroll_top = lv_obj_get_scroll_top(obj); - if(chart->hdiv_cnt != 0) { - int32_t y_ofs = obj->coords.y1 + pad_top - scroll_top; - line_dsc.p1.x = obj->coords.x1; - line_dsc.p2.x = obj->coords.x2; - - i_start = 0; - i_end = chart->hdiv_cnt; - if(border_opa > LV_OPA_MIN && border_w > 0) { - if((border_side & LV_BORDER_SIDE_TOP) && (lv_obj_get_style_pad_top(obj, LV_PART_MAIN) == 0)) i_start++; - if((border_side & LV_BORDER_SIDE_BOTTOM) && (lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN) == 0)) i_end--; - } - - for(i = i_start; i < i_end; i++) { - line_dsc.p1.y = (int32_t)((int32_t)h * i) / (chart->hdiv_cnt - 1); - line_dsc.p1.y += y_ofs; - line_dsc.p2.y = line_dsc.p1.y; - line_dsc.base.id1 = i; - - lv_draw_line(layer, &line_dsc); - } - } - - if(chart->vdiv_cnt != 0) { - int32_t x_ofs = obj->coords.x1 + pad_left - scroll_left; - line_dsc.p1.y = obj->coords.y1; - line_dsc.p2.y = obj->coords.y2; - i_start = 0; - i_end = chart->vdiv_cnt; - if(border_opa > LV_OPA_MIN && border_w > 0) { - if((border_side & LV_BORDER_SIDE_LEFT) && (lv_obj_get_style_pad_left(obj, LV_PART_MAIN) == 0)) i_start++; - if((border_side & LV_BORDER_SIDE_RIGHT) && (lv_obj_get_style_pad_right(obj, LV_PART_MAIN) == 0)) i_end--; - } - - for(i = i_start; i < i_end; i++) { - line_dsc.p1.x = (int32_t)((int32_t)w * i) / (chart->vdiv_cnt - 1); - line_dsc.p1.x += x_ofs; - line_dsc.p2.x = line_dsc.p1.x; - line_dsc.base.id1 = i; - - lv_draw_line(layer, &line_dsc); - } - } - - layer->_clip_area = clip_area_ori; -} - -static void draw_series_line(lv_obj_t * obj, lv_layer_t * layer) -{ - lv_area_t clip_area; - if(lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area) == false) return; - - const lv_area_t clip_area_ori = layer->_clip_area; - layer->_clip_area = clip_area; - - lv_chart_t * chart = (lv_chart_t *)obj; - if(chart->point_cnt < 2) return; - - uint32_t i; - int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; - int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; - int32_t w = lv_obj_get_content_width(obj); - int32_t h = lv_obj_get_content_height(obj); - int32_t x_ofs = obj->coords.x1 + pad_left - lv_obj_get_scroll_left(obj); - int32_t y_ofs = obj->coords.y1 + pad_top - lv_obj_get_scroll_top(obj); - lv_chart_series_t * ser; - - lv_area_t series_clip_area; - bool mask_ret = lv_area_intersect(&series_clip_area, &obj->coords, &layer->_clip_area); - if(mask_ret == false) return; - - lv_draw_line_dsc_t line_dsc; - lv_draw_line_dsc_init(&line_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &line_dsc); - - lv_draw_rect_dsc_t point_dsc_default; - lv_draw_rect_dsc_init(&point_dsc_default); - lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &point_dsc_default); - - int32_t point_w = lv_obj_get_style_width(obj, LV_PART_INDICATOR) / 2; - int32_t point_h = lv_obj_get_style_height(obj, LV_PART_INDICATOR) / 2; - - /*Do not bother with line ending is the point will over it*/ - if(LV_MIN(point_w, point_h) > line_dsc.width / 2) line_dsc.raw_end = 1; - if(line_dsc.width == 1) line_dsc.raw_end = 1; - - /*If there are at least as many points as pixels then draw only vertical lines*/ - bool crowded_mode = (int32_t)chart->point_cnt >= w; - - line_dsc.base.id1 = lv_ll_get_len(&chart->series_ll) - 1; - point_dsc_default.base.id1 = line_dsc.base.id1; - /*Go through all data lines*/ - LV_LL_READ_BACK(&chart->series_ll, ser) { - if(ser->hidden) { - line_dsc.base.id1--; - point_dsc_default.base.id1--; - continue; - } - line_dsc.color = ser->color; - point_dsc_default.bg_color = ser->color; - line_dsc.base.id2 = 0; - point_dsc_default.base.id2 = 0; - - int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; - - line_dsc.p1.x = x_ofs; - line_dsc.p2.x = x_ofs; - - int32_t p_act = start_point; - int32_t p_prev = start_point; - int32_t y_tmp = (int32_t)((int32_t)ser->y_points[p_prev] - chart->ymin[ser->y_axis_sec]) * h; - y_tmp = y_tmp / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); - line_dsc.p2.y = h - y_tmp + y_ofs; - - lv_value_precise_t y_min = line_dsc.p2.y; - lv_value_precise_t y_max = line_dsc.p2.y; - - for(i = 0; i < chart->point_cnt; i++) { - line_dsc.p1.x = line_dsc.p2.x; - line_dsc.p1.y = line_dsc.p2.y; - - if(line_dsc.p1.x > clip_area_ori.x2 + point_w + 1) break; - line_dsc.p2.x = (lv_value_precise_t)((w * i) / (chart->point_cnt - 1)) + x_ofs; - - p_act = (start_point + i) % chart->point_cnt; - - y_tmp = (int32_t)((int32_t)ser->y_points[p_act] - chart->ymin[ser->y_axis_sec]) * h; - y_tmp = y_tmp / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); - line_dsc.p2.y = h - y_tmp + y_ofs; - - if(line_dsc.p2.x < clip_area_ori.x1 - point_w - 1) { - p_prev = p_act; - continue; - } - - /*Don't draw the first point. A second point is also required to draw the line*/ - if(i != 0) { - if(crowded_mode) { - if(ser->y_points[p_prev] != LV_CHART_POINT_NONE && ser->y_points[p_act] != LV_CHART_POINT_NONE) { - /*Draw only one vertical line between the min and max y-values on the same x-value*/ - y_max = LV_MAX(y_max, line_dsc.p2.y); - y_min = LV_MIN(y_min, line_dsc.p2.y); - if(line_dsc.p1.x != line_dsc.p2.x) { - lv_value_precise_t y_cur = line_dsc.p2.y; - line_dsc.p2.x--; /*It's already on the next x value*/ - line_dsc.p1.x = line_dsc.p2.x; - line_dsc.p1.y = y_min; - line_dsc.p2.y = y_max; - if(line_dsc.p1.y == line_dsc.p2.y) line_dsc.p2.y++; /*If they are the same no line will be drawn*/ - lv_draw_line(layer, &line_dsc); - line_dsc.p2.x++; /*Compensate the previous x--*/ - y_min = y_cur; /*Start the line of the next x from the current last y*/ - y_max = y_cur; - } - } - } - else { - lv_area_t point_area; - point_area.x1 = (int32_t)line_dsc.p1.x - point_w; - point_area.x2 = (int32_t)line_dsc.p1.x + point_w; - point_area.y1 = (int32_t)line_dsc.p1.y - point_h; - point_area.y2 = (int32_t)line_dsc.p1.y + point_h; - - if(ser->y_points[p_prev] != LV_CHART_POINT_NONE && ser->y_points[p_act] != LV_CHART_POINT_NONE) { - line_dsc.base.id2 = i; - lv_draw_line(layer, &line_dsc); - } - - if(point_w && point_h && ser->y_points[p_prev] != LV_CHART_POINT_NONE) { - point_dsc_default.base.id2 = i - 1; - lv_draw_rect(layer, &point_dsc_default, &point_area); - } - } - - } - p_prev = p_act; - } - - /*Draw the last point*/ - if(!crowded_mode && i == chart->point_cnt) { - - if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { - lv_area_t point_area; - point_area.x1 = (int32_t)line_dsc.p2.x - point_w; - point_area.x2 = (int32_t)line_dsc.p2.x + point_w; - point_area.y1 = (int32_t)line_dsc.p2.y - point_h; - point_area.y2 = (int32_t)line_dsc.p2.y + point_h; - point_dsc_default.base.id2 = i - 1; - lv_draw_rect(layer, &point_dsc_default, &point_area); - } - } - - point_dsc_default.base.id1--; - line_dsc.base.id1--; - } - - layer->_clip_area = clip_area_ori; -} - -static void draw_series_scatter(lv_obj_t * obj, lv_layer_t * layer) -{ - - lv_area_t clip_area; - if(lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area) == false) return; - - const lv_area_t clip_area_ori = layer->_clip_area; - layer->_clip_area = clip_area; - - lv_chart_t * chart = (lv_chart_t *)obj; - - uint32_t i; - int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - int32_t w = lv_obj_get_content_width(obj); - int32_t h = lv_obj_get_content_height(obj); - int32_t x_ofs = obj->coords.x1 + pad_left + border_width - lv_obj_get_scroll_left(obj); - int32_t y_ofs = obj->coords.y1 + pad_top + border_width - lv_obj_get_scroll_top(obj); - lv_chart_series_t * ser; - - lv_draw_line_dsc_t line_dsc; - lv_draw_line_dsc_init(&line_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &line_dsc); - - lv_draw_rect_dsc_t point_dsc_default; - lv_draw_rect_dsc_init(&point_dsc_default); - lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &point_dsc_default); - - int32_t point_w = lv_obj_get_style_width(obj, LV_PART_INDICATOR) / 2; - int32_t point_h = lv_obj_get_style_height(obj, LV_PART_INDICATOR) / 2; - - /*Do not bother with line ending is the point will over it*/ - if(LV_MIN(point_w, point_h) > line_dsc.width / 2) line_dsc.raw_end = 1; - if(line_dsc.width == 1) line_dsc.raw_end = 1; - - /*Go through all data lines*/ - LV_LL_READ_BACK(&chart->series_ll, ser) { - if(ser->hidden) continue; - line_dsc.color = ser->color; - point_dsc_default.bg_color = ser->color; - - int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; - - line_dsc.p1.x = x_ofs; - line_dsc.p2.x = x_ofs; - - int32_t p_act = start_point; - int32_t p_prev = start_point; - if(ser->y_points[p_act] != LV_CHART_POINT_CNT_DEF) { - line_dsc.p2.x = lv_map(ser->x_points[p_act], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w); - line_dsc.p2.x += x_ofs; - - line_dsc.p2.y = lv_map(ser->y_points[p_act], chart->ymin[ser->y_axis_sec], chart->ymax[ser->y_axis_sec], 0, h); - line_dsc.p2.y = h - line_dsc.p2.y; - line_dsc.p2.y += y_ofs; - } - else { - line_dsc.p2.x = (lv_value_precise_t)LV_COORD_MIN; - line_dsc.p2.y = (lv_value_precise_t)LV_COORD_MIN; - } - - for(i = 0; i < chart->point_cnt; i++) { - line_dsc.p1.x = line_dsc.p2.x; - line_dsc.p1.y = line_dsc.p2.y; - - p_act = (start_point + i) % chart->point_cnt; - if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { - line_dsc.p2.y = lv_map(ser->y_points[p_act], chart->ymin[ser->y_axis_sec], chart->ymax[ser->y_axis_sec], 0, h); - line_dsc.p2.y = h - line_dsc.p2.y; - line_dsc.p2.y += y_ofs; - - line_dsc.p2.x = lv_map(ser->x_points[p_act], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w); - line_dsc.p2.x += x_ofs; - } - else { - p_prev = p_act; - continue; - } - - /*Don't draw the first point. A second point is also required to draw the line*/ - if(i != 0) { - lv_area_t point_area; - point_area.x1 = (int32_t)line_dsc.p1.x - point_w; - point_area.x2 = (int32_t)line_dsc.p1.x + point_w; - point_area.y1 = (int32_t)line_dsc.p1.y - point_h; - point_area.y2 = (int32_t)line_dsc.p1.y + point_h; - - if(ser->y_points[p_prev] != LV_CHART_POINT_NONE && ser->y_points[p_act] != LV_CHART_POINT_NONE) { - line_dsc.base.id2 = i; - lv_draw_line(layer, &line_dsc); - if(point_w && point_h) { - point_dsc_default.base.id2 = i; - lv_draw_rect(layer, &point_dsc_default, &point_area); - } - } - - p_prev = p_act; - } - - /*Draw the last point*/ - if(i == chart->point_cnt) { - - if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { - lv_area_t point_area; - point_area.x1 = (int32_t)line_dsc.p2.x - point_w; - point_area.x2 = (int32_t)line_dsc.p2.x + point_w; - point_area.y1 = (int32_t)line_dsc.p2.y - point_h; - point_area.y2 = (int32_t)line_dsc.p2.y + point_h; - - point_dsc_default.base.id2 = i; - lv_draw_rect(layer, &point_dsc_default, &point_area); - } - } - } - line_dsc.base.id1++; - point_dsc_default.base.id1++; - layer->_clip_area = clip_area_ori; - } -} - -static void draw_series_bar(lv_obj_t * obj, lv_layer_t * layer) -{ - lv_area_t clip_area; - if(lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area) == false) return; - - const lv_area_t clip_area_ori = layer->_clip_area; - layer->_clip_area = clip_area; - - lv_chart_t * chart = (lv_chart_t *)obj; - - uint32_t i; - lv_area_t col_a; - int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - int32_t w = lv_obj_get_content_width(obj); - int32_t h = lv_obj_get_content_height(obj); - int32_t y_tmp; - lv_chart_series_t * ser; - uint32_t ser_cnt = lv_ll_get_len(&chart->series_ll); - int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); /*Gap between the column on ~adjacent X*/ - int32_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; - int32_t ser_gap = lv_obj_get_style_pad_column(obj, LV_PART_ITEMS); /*Gap between the columns on the ~same X*/ - int32_t col_w = (block_w - (ser_cnt - 1) * ser_gap) / ser_cnt; - if(col_w < 1) col_w = 1; - - int32_t border_w = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - int32_t x_ofs = pad_left - lv_obj_get_scroll_left(obj) + border_w; - int32_t y_ofs = pad_top - lv_obj_get_scroll_top(obj) + border_w; - - lv_draw_rect_dsc_t col_dsc; - lv_draw_rect_dsc_init(&col_dsc); - lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &col_dsc); - col_dsc.bg_grad.dir = LV_GRAD_DIR_NONE; - col_dsc.bg_opa = LV_OPA_COVER; - - /*Make the cols longer with `radius` to clip the rounding from the bottom*/ - col_a.y2 = obj->coords.y2 + col_dsc.radius; - - /*Go through all points*/ - for(i = 0; i < chart->point_cnt; i++) { - int32_t x_act = (int32_t)((int32_t)(w - block_w) * i) / (chart->point_cnt - 1) + obj->coords.x1 + x_ofs; - col_dsc.base.id2 = i; - col_dsc.base.id1 = 0; - - /*Draw the current point of all data line*/ - LV_LL_READ(&chart->series_ll, ser) { - if(ser->hidden) continue; - - int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; - - col_a.x1 = x_act; - col_a.x2 = col_a.x1 + col_w - 1; - x_act += col_w + ser_gap; - - if(col_a.x2 < clip_area.x1) { - col_dsc.base.id1++; - continue; - } - if(col_a.x1 > clip_area.x2) break; - - col_dsc.bg_color = ser->color; - - int32_t p_act = (start_point + i) % chart->point_cnt; - y_tmp = (int32_t)((int32_t)ser->y_points[p_act] - chart->ymin[ser->y_axis_sec]) * h; - y_tmp = y_tmp / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); - col_a.y1 = h - y_tmp + obj->coords.y1 + y_ofs; - - if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { - lv_draw_rect(layer, &col_dsc, &col_a); - } - col_dsc.base.id1++; - } - } - layer->_clip_area = clip_area_ori; -} - -static void draw_cursors(lv_obj_t * obj, lv_layer_t * layer) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_chart_t * chart = (lv_chart_t *)obj; - if(lv_ll_is_empty(&chart->cursor_ll)) return; - - lv_area_t clip_area; - if(!lv_area_intersect(&clip_area, &layer->_clip_area, &obj->coords)) return; - - const lv_area_t clip_area_ori = layer->_clip_area; - layer->_clip_area = clip_area; - - lv_chart_cursor_t * cursor; - - lv_draw_line_dsc_t line_dsc_ori; - lv_draw_line_dsc_init(&line_dsc_ori); - lv_obj_init_draw_line_dsc(obj, LV_PART_CURSOR, &line_dsc_ori); - - lv_draw_rect_dsc_t point_dsc_ori; - lv_draw_rect_dsc_init(&point_dsc_ori); - lv_obj_init_draw_rect_dsc(obj, LV_PART_CURSOR, &point_dsc_ori); - - lv_draw_line_dsc_t line_dsc; - lv_draw_rect_dsc_t point_dsc_tmp; - - int32_t point_w = lv_obj_get_style_width(obj, LV_PART_CURSOR) / 2; - int32_t point_h = lv_obj_get_style_width(obj, LV_PART_CURSOR) / 2; - - /*Go through all cursor lines*/ - LV_LL_READ_BACK(&chart->cursor_ll, cursor) { - lv_memcpy(&line_dsc, &line_dsc_ori, sizeof(lv_draw_line_dsc_t)); - lv_memcpy(&point_dsc_tmp, &point_dsc_ori, sizeof(lv_draw_rect_dsc_t)); - line_dsc.color = cursor->color; - point_dsc_tmp.bg_color = cursor->color; - - int32_t cx; - int32_t cy; - if(cursor->pos_set) { - cx = cursor->pos.x; - cy = cursor->pos.y; - } - else { - if(cursor->point_id == LV_CHART_POINT_NONE) continue; - lv_point_t p; - lv_chart_get_point_pos_by_id(obj, cursor->ser, cursor->point_id, &p); - cx = p.x; - cy = p.y; - } - - cx += obj->coords.x1; - cy += obj->coords.y1; - - lv_area_t point_area; - bool draw_point = point_w && point_h; - point_area.x1 = cx - point_w; - point_area.x2 = cx + point_w; - point_area.y1 = cy - point_h; - point_area.y2 = cy + point_h; - - if(cursor->dir & LV_DIR_HOR) { - line_dsc.p1.x = cursor->dir & LV_DIR_LEFT ? obj->coords.x1 : cx; - line_dsc.p1.y = cy; - line_dsc.p2.x = cursor->dir & LV_DIR_RIGHT ? obj->coords.x2 : cx; - line_dsc.p2.y = line_dsc.p1.y; - - line_dsc.base.id2 = 0; - point_dsc_tmp.base.id2 = 0; - - lv_draw_line(layer, &line_dsc); - - if(draw_point) { - lv_draw_rect(layer, &point_dsc_tmp, &point_area); - } - } - - if(cursor->dir & LV_DIR_VER) { - line_dsc.p1.x = cx; - line_dsc.p1.y = cursor->dir & LV_DIR_TOP ? obj->coords.y1 : cy; - line_dsc.p2.x = line_dsc.p1.x; - line_dsc.p2.y = cursor->dir & LV_DIR_BOTTOM ? obj->coords.y2 : cy; - - line_dsc.base.id2 = 1; - point_dsc_tmp.base.id2 = 1; - - lv_draw_line(layer, &line_dsc); - - if(draw_point) { - lv_draw_rect(layer, &point_dsc_tmp, &point_area); - } - } - line_dsc_ori.base.id1++; - point_dsc_ori.base.id1++; - } - - layer->_clip_area = clip_area_ori; -} - -/** - * Get the nearest index to an X coordinate - * @param chart pointer to a chart object - * @param coord the coordination of the point relative to the series area. - * @return the found index - */ -static uint32_t get_index_from_x(lv_obj_t * obj, int32_t x) -{ - lv_chart_t * chart = (lv_chart_t *)obj; - int32_t w = lv_obj_get_content_width(obj); - int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - x -= pad_left; - - if(x < 0) return 0; - if(x > w) return chart->point_cnt - 1; - if(chart->type == LV_CHART_TYPE_LINE) return (x * (chart->point_cnt - 1) + w / 2) / w; - if(chart->type == LV_CHART_TYPE_BAR) return (x * chart->point_cnt) / w; - - return 0; -} - -static void invalidate_point(lv_obj_t * obj, uint32_t i) -{ - lv_chart_t * chart = (lv_chart_t *)obj; - if(i >= chart->point_cnt) return; - - int32_t w = lv_obj_get_content_width(obj); - int32_t scroll_left = lv_obj_get_scroll_left(obj); - - /*In shift mode the whole chart changes so the whole object*/ - if(chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT) { - lv_obj_invalidate(obj); - return; - } - - if(chart->type == LV_CHART_TYPE_LINE) { - int32_t bwidth = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - int32_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t x_ofs = obj->coords.x1 + pleft + bwidth - scroll_left; - int32_t line_width = lv_obj_get_style_line_width(obj, LV_PART_ITEMS); - int32_t point_w = lv_obj_get_style_width(obj, LV_PART_INDICATOR); - - lv_area_t coords; - lv_area_copy(&coords, &obj->coords); - coords.y1 -= line_width + point_w; - coords.y2 += line_width + point_w; - - if(i < chart->point_cnt - 1) { - coords.x1 = ((w * i) / (chart->point_cnt - 1)) + x_ofs - line_width - point_w; - coords.x2 = ((w * (i + 1)) / (chart->point_cnt - 1)) + x_ofs + line_width + point_w; - lv_obj_invalidate_area(obj, &coords); - } - - if(i > 0) { - coords.x1 = ((w * (i - 1)) / (chart->point_cnt - 1)) + x_ofs - line_width - point_w; - coords.x2 = ((w * i) / (chart->point_cnt - 1)) + x_ofs + line_width + point_w; - lv_obj_invalidate_area(obj, &coords); - } - } - else if(chart->type == LV_CHART_TYPE_BAR) { - lv_area_t col_a; - /*Gap between the column on ~adjacent X*/ - int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); - - int32_t block_w = (w + block_gap) / chart->point_cnt; - - int32_t bwidth = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - int32_t x_act; - x_act = (int32_t)((int32_t)(block_w) * i) ; - x_act += obj->coords.x1 + bwidth + lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - - lv_obj_get_coords(obj, &col_a); - col_a.x1 = x_act - scroll_left; - col_a.x2 = col_a.x1 + block_w; - col_a.x1 -= block_gap; - - lv_obj_invalidate_area(obj, &col_a); - } - else { - lv_obj_invalidate(obj); - } -} - -static void new_points_alloc(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t cnt, int32_t ** a) -{ - if((*a) == NULL) return; - - lv_chart_t * chart = (lv_chart_t *) obj; - uint32_t point_cnt_old = chart->point_cnt; - uint32_t i; - - if(ser->start_point != 0) { - int32_t * new_points = lv_malloc(sizeof(int32_t) * cnt); - LV_ASSERT_MALLOC(new_points); - if(new_points == NULL) return; - - if(cnt >= point_cnt_old) { - for(i = 0; i < point_cnt_old; i++) { - new_points[i] = - (*a)[(i + ser->start_point) % point_cnt_old]; /*Copy old contents to new array*/ - } - for(i = point_cnt_old; i < cnt; i++) { - new_points[i] = LV_CHART_POINT_NONE; /*Fill up the rest with default value*/ - } - } - else { - for(i = 0; i < cnt; i++) { - new_points[i] = - (*a)[(i + ser->start_point) % point_cnt_old]; /*Copy old contents to new array*/ - } - } - - /*Switch over pointer from old to new*/ - lv_free((*a)); - (*a) = new_points; - } - else { - (*a) = lv_realloc((*a), sizeof(int32_t) * cnt); - LV_ASSERT_MALLOC((*a)); - if((*a) == NULL) return; - /*Initialize the new points*/ - if(cnt > point_cnt_old) { - for(i = point_cnt_old - 1; i < cnt; i++) { - (*a)[i] = LV_CHART_POINT_NONE; - } - } - } -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/chart/lv_chart.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/chart/lv_chart.h deleted file mode 100644 index de25831..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/chart/lv_chart.h +++ /dev/null @@ -1,358 +0,0 @@ -/** - * @file lv_chart.h - * - */ - -#ifndef LV_CHART_H -#define LV_CHART_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../core/lv_obj.h" - -#if LV_USE_CHART != 0 - -/********************* - * DEFINES - *********************/ - -/**Default value of points. Can be used to not draw a point*/ -#define LV_CHART_POINT_NONE (INT32_MAX) -LV_EXPORT_CONST_INT(LV_CHART_POINT_NONE); - -/********************** - * TYPEDEFS - **********************/ - -/** - * Chart types - */ -typedef enum { - LV_CHART_TYPE_NONE, /**< Don't draw the series*/ - LV_CHART_TYPE_LINE, /**< Connect the points with lines*/ - LV_CHART_TYPE_BAR, /**< Draw columns*/ - LV_CHART_TYPE_SCATTER, /**< Draw points and lines in 2D (x,y coordinates)*/ -} lv_chart_type_t; - -/** - * Chart update mode for `lv_chart_set_next` - */ -typedef enum { - LV_CHART_UPDATE_MODE_SHIFT, /**< Shift old data to the left and add the new one the right*/ - LV_CHART_UPDATE_MODE_CIRCULAR, /**< Add the new data in a circular way*/ -} lv_chart_update_mode_t; - -/** - * Enumeration of the axis' - */ -typedef enum { - LV_CHART_AXIS_PRIMARY_Y = 0x00, - LV_CHART_AXIS_SECONDARY_Y = 0x01, - LV_CHART_AXIS_PRIMARY_X = 0x02, - LV_CHART_AXIS_SECONDARY_X = 0x04, - LV_CHART_AXIS_LAST -} lv_chart_axis_t; - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_chart_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a chart object - * @param parent pointer to an object, it will be the parent of the new chart - * @return pointer to the created chart - */ -lv_obj_t * lv_chart_create(lv_obj_t * parent); - -/** - * Set a new type for a chart - * @param obj pointer to a chart object - * @param type new type of the chart (from 'lv_chart_type_t' enum) - */ -void lv_chart_set_type(lv_obj_t * obj, lv_chart_type_t type); -/** - * Set the number of points on a data line on a chart - * @param obj pointer to a chart object - * @param cnt new number of points on the data lines - */ -void lv_chart_set_point_count(lv_obj_t * obj, uint32_t cnt); - -/** - * Set the minimal and maximal y values on an axis - * @param obj pointer to a chart object - * @param axis `LV_CHART_AXIS_PRIMARY_Y` or `LV_CHART_AXIS_SECONDARY_Y` - * @param min minimum value of the y axis - * @param max maximum value of the y axis - */ -void lv_chart_set_range(lv_obj_t * obj, lv_chart_axis_t axis, int32_t min, int32_t max); - -/** - * Set update mode of the chart object. Affects - * @param obj pointer to a chart object - * @param update_mode the update mode - */ -void lv_chart_set_update_mode(lv_obj_t * obj, lv_chart_update_mode_t update_mode); - -/** - * Set the number of horizontal and vertical division lines - * @param obj pointer to a chart object - * @param hdiv number of horizontal division lines - * @param vdiv number of vertical division lines - */ -void lv_chart_set_div_line_count(lv_obj_t * obj, uint8_t hdiv, uint8_t vdiv); - -/** - * Get the type of a chart - * @param obj pointer to chart object - * @return type of the chart (from 'lv_chart_t' enum) - */ -lv_chart_type_t lv_chart_get_type(const lv_obj_t * obj); - -/** - * Get the data point number per data line on chart - * @param obj pointer to chart object - * @return point number on each data line - */ -uint32_t lv_chart_get_point_count(const lv_obj_t * obj); - -/** - * Get the current index of the x-axis start point in the data array - * @param obj pointer to a chart object - * @param ser pointer to a data series on 'chart' - * @return the index of the current x start point in the data array - */ -uint32_t lv_chart_get_x_start_point(const lv_obj_t * obj, lv_chart_series_t * ser); - -/** - * Get the position of a point to the chart. - * @param obj pointer to a chart object - * @param ser pointer to series - * @param id the index. - * @param p_out store the result position here - */ -void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, lv_point_t * p_out); - -/** - * Refresh a chart if its data line has changed - * @param obj pointer to chart object - */ -void lv_chart_refresh(lv_obj_t * obj); - -/*====================== - * Series - *=====================*/ - -/** - * Allocate and add a data series to the chart - * @param obj pointer to a chart object - * @param color color of the data series - * @param axis the y axis to which the series should be attached (::LV_CHART_AXIS_PRIMARY_Y or ::LV_CHART_AXIS_SECONDARY_Y) - * @return pointer to the allocated data series or NULL on failure - */ -lv_chart_series_t * lv_chart_add_series(lv_obj_t * obj, lv_color_t color, lv_chart_axis_t axis); - -/** - * Deallocate and remove a data series from a chart - * @param obj pointer to a chart object - * @param series pointer to a data series on 'chart' - */ -void lv_chart_remove_series(lv_obj_t * obj, lv_chart_series_t * series); - -/** - * Hide/Unhide a single series of a chart. - * @param chart pointer to a chart object. - * @param series pointer to a series object - * @param hide true: hide the series - */ -void lv_chart_hide_series(lv_obj_t * chart, lv_chart_series_t * series, bool hide); - -/** - * Change the color of a series - * @param chart pointer to a chart object. - * @param series pointer to a series object - * @param color the new color of the series - */ -void lv_chart_set_series_color(lv_obj_t * chart, lv_chart_series_t * series, lv_color_t color); - -/** - * Get the color of a series - * @param chart pointer to a chart object. - * @param series pointer to a series object - * @return the color of the series - */ -lv_color_t lv_chart_get_series_color(lv_obj_t * chart, const lv_chart_series_t * series); - -/** - * Set the index of the x-axis start point in the data array. - * This point will be considers the first (left) point and the other points will be drawn after it. - * @param obj pointer to a chart object - * @param ser pointer to a data series on 'chart' - * @param id the index of the x point in the data array - */ -void lv_chart_set_x_start_point(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id); - -/** - * Get the next series. - * @param chart pointer to a chart - * @param ser the previous series or NULL to get the first - * @return the next series or NULL if there is no more. - */ -lv_chart_series_t * lv_chart_get_series_next(const lv_obj_t * chart, const lv_chart_series_t * ser); - -/*===================== - * Cursor - *====================*/ - -/** - * Add a cursor with a given color - * @param obj pointer to chart object - * @param color color of the cursor - * @param dir direction of the cursor. `LV_DIR_RIGHT/LEFT/TOP/DOWN/HOR/VER/ALL`. OR-ed values are possible - * @return pointer to the created cursor - */ -lv_chart_cursor_t * lv_chart_add_cursor(lv_obj_t * obj, lv_color_t color, lv_dir_t dir); - -/** - * Set the coordinate of the cursor with respect to the paddings - * @param chart pointer to a chart object - * @param cursor pointer to the cursor - * @param pos the new coordinate of cursor relative to the chart - */ -void lv_chart_set_cursor_pos(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_point_t * pos); - -/** - * Stick the cursor to a point - * @param chart pointer to a chart object - * @param cursor pointer to the cursor - * @param ser pointer to a series - * @param point_id the point's index or `LV_CHART_POINT_NONE` to not assign to any points. - */ -void lv_chart_set_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_chart_series_t * ser, - uint32_t point_id); - -/** - * Get the coordinate of the cursor with respect to the paddings - * @param chart pointer to a chart object - * @param cursor pointer to cursor - * @return coordinate of the cursor as lv_point_t - */ -lv_point_t lv_chart_get_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor); - -/*===================== - * Set/Get value(s) - *====================*/ - -/** - * Initialize all data points of a series with a value - * @param obj pointer to chart object - * @param ser pointer to a data series on 'chart' - * @param value the new value for all points. `LV_CHART_POINT_NONE` can be used to hide the points. - */ -void lv_chart_set_all_value(lv_obj_t * obj, lv_chart_series_t * ser, int32_t value); - -/** - * Set the next point's Y value according to the update mode policy. - * @param obj pointer to chart object - * @param ser pointer to a data series on 'chart' - * @param value the new value of the next data - */ -void lv_chart_set_next_value(lv_obj_t * obj, lv_chart_series_t * ser, int32_t value); - -/** - * Set the next point's X and Y value according to the update mode policy. - * @param obj pointer to chart object - * @param ser pointer to a data series on 'chart' - * @param x_value the new X value of the next data - * @param y_value the new Y value of the next data - */ -void lv_chart_set_next_value2(lv_obj_t * obj, lv_chart_series_t * ser, int32_t x_value, int32_t y_value); - -/** - * Set an individual point's y value of a chart's series directly based on its index - * @param obj pointer to a chart object - * @param ser pointer to a data series on 'chart' - * @param id the index of the x point in the array - * @param value value to assign to array point - */ -void lv_chart_set_value_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, int32_t value); - -/** - * Set an individual point's x and y value of a chart's series directly based on its index - * Can be used only with `LV_CHART_TYPE_SCATTER`. - * @param obj pointer to chart object - * @param ser pointer to a data series on 'chart' - * @param id the index of the x point in the array - * @param x_value the new X value of the next data - * @param y_value the new Y value of the next data - */ -void lv_chart_set_value_by_id2(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, int32_t x_value, - int32_t y_value); - -/** - * Set an external array for the y data points to use for the chart - * NOTE: It is the users responsibility to make sure the `point_cnt` matches the external array size. - * @param obj pointer to a chart object - * @param ser pointer to a data series on 'chart' - * @param array external array of points for chart - */ -void lv_chart_set_ext_y_array(lv_obj_t * obj, lv_chart_series_t * ser, int32_t array[]); - -/** - * Set an external array for the x data points to use for the chart - * NOTE: It is the users responsibility to make sure the `point_cnt` matches the external array size. - * @param obj pointer to a chart object - * @param ser pointer to a data series on 'chart' - * @param array external array of points for chart - */ -void lv_chart_set_ext_x_array(lv_obj_t * obj, lv_chart_series_t * ser, int32_t array[]); - -/** - * Get the array of y values of a series - * @param obj pointer to a chart object - * @param ser pointer to a data series on 'chart' - * @return the array of values with 'point_count' elements - */ -int32_t * lv_chart_get_y_array(const lv_obj_t * obj, lv_chart_series_t * ser); - -/** - * Get the array of x values of a series - * @param obj pointer to a chart object - * @param ser pointer to a data series on 'chart' - * @return the array of values with 'point_count' elements - */ -int32_t * lv_chart_get_x_array(const lv_obj_t * obj, lv_chart_series_t * ser); - -/** - * Get the index of the currently pressed point. It's the same for every series. - * @param obj pointer to a chart object - * @return the index of the point [0 .. point count] or LV_CHART_POINT_ID_NONE if no point is being pressed - */ -uint32_t lv_chart_get_pressed_point(const lv_obj_t * obj); - -/** - * Get the overall offset from the chart's side to the center of the first point. - * In case of a bar chart it will be the center of the first column group - * @param obj pointer to a chart object - * @return the offset of the center - */ -int32_t lv_chart_get_first_point_center_offset(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_CHART*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CHART_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/chart/lv_chart_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/chart/lv_chart_private.h deleted file mode 100644 index 7cf9052..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/chart/lv_chart_private.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * @file lv_chart_private.h - * - */ - -#ifndef LV_CHART_PRIVATE_H -#define LV_CHART_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_chart.h" - -#if LV_USE_CHART != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Descriptor a chart series - */ -struct lv_chart_series_t { - int32_t * x_points; - int32_t * y_points; - lv_color_t color; - uint32_t start_point; - uint32_t hidden : 1; - uint32_t x_ext_buf_assigned : 1; - uint32_t y_ext_buf_assigned : 1; - uint32_t x_axis_sec : 1; - uint32_t y_axis_sec : 1; -}; - -struct lv_chart_cursor_t { - lv_point_t pos; - int32_t point_id; - lv_color_t color; - lv_chart_series_t * ser; - lv_dir_t dir; - uint32_t pos_set: 1; /**< 1: pos is set; 0: point_id is set*/ -}; - -struct lv_chart_t { - lv_obj_t obj; - lv_ll_t series_ll; /**< Linked list for the series (stores lv_chart_series_t)*/ - lv_ll_t cursor_ll; /**< Linked list for the cursors (stores lv_chart_cursor_t)*/ - int32_t ymin[2]; - int32_t ymax[2]; - int32_t xmin[2]; - int32_t xmax[2]; - int32_t pressed_point_id; - uint32_t hdiv_cnt; /**< Number of horizontal division lines*/ - uint32_t vdiv_cnt; /**< Number of vertical division lines*/ - uint32_t point_cnt; /**< Point number in a data line*/ - lv_chart_type_t type : 3; /**< Line or column chart*/ - lv_chart_update_mode_t update_mode : 1; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_CHART != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CHART_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/checkbox/lv_checkbox.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/checkbox/lv_checkbox.c deleted file mode 100644 index 7a987ef..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/checkbox/lv_checkbox.c +++ /dev/null @@ -1,285 +0,0 @@ -/** - * @file lv_cb.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_checkbox_private.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_CHECKBOX != 0 - -#include "../../misc/lv_assert.h" -#include "../../misc/lv_text_ap.h" -#include "../../core/lv_group.h" -#include "../../draw/lv_draw.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_checkbox_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_checkbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_checkbox_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_checkbox_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void lv_checkbox_draw(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_checkbox_class = { - .constructor_cb = lv_checkbox_constructor, - .destructor_cb = lv_checkbox_destructor, - .event_cb = lv_checkbox_event, - .width_def = LV_SIZE_CONTENT, - .height_def = LV_SIZE_CONTENT, - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .instance_size = sizeof(lv_checkbox_t), - .base_class = &lv_obj_class, - .name = "checkbox", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_checkbox_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_checkbox_set_text(lv_obj_t * obj, const char * txt) -{ - lv_checkbox_t * cb = (lv_checkbox_t *)obj; - - if(NULL != txt) { - size_t len; - -#if LV_USE_ARABIC_PERSIAN_CHARS - len = lv_text_ap_calc_bytes_count(txt) + 1; -#else - len = lv_strlen(txt) + 1; -#endif - - if(!cb->static_txt) cb->txt = lv_realloc(cb->txt, len); - else cb->txt = lv_malloc(len); - - LV_ASSERT_MALLOC(cb->txt); - if(NULL == cb->txt) return; - -#if LV_USE_ARABIC_PERSIAN_CHARS - lv_text_ap_proc(txt, cb->txt); -#else - lv_strcpy(cb->txt, txt); -#endif - - cb->static_txt = 0; - } - - lv_obj_refresh_self_size(obj); - lv_obj_invalidate(obj); -} - -void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt) -{ - lv_checkbox_t * cb = (lv_checkbox_t *)obj; - - if(!cb->static_txt) lv_free(cb->txt); - - cb->txt = (char *)txt; - cb->static_txt = 1; - - lv_obj_refresh_self_size(obj); - lv_obj_invalidate(obj); -} - -/*===================== - * Getter functions - *====================*/ - -const char * lv_checkbox_get_text(const lv_obj_t * obj) -{ - lv_checkbox_t * cb = (lv_checkbox_t *)obj; - return cb->txt; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_checkbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_checkbox_t * cb = (lv_checkbox_t *)obj; - -#if LV_WIDGETS_HAS_DEFAULT_VALUE - cb->txt = (char *)"Check box"; - cb->static_txt = 1; -#else - cb->txt = (char *)""; - cb->static_txt = 1; -#endif - - lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); - lv_obj_add_flag(obj, LV_OBJ_FLAG_CHECKABLE); - lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_checkbox_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_checkbox_t * cb = (lv_checkbox_t *)obj; - if(!cb->static_txt) { - lv_free(cb->txt); - cb->txt = NULL; - } - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_checkbox_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - /*Call the ancestor's event handler*/ - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - - if(code == LV_EVENT_GET_SELF_SIZE) { - lv_point_t * p = lv_event_get_param(e); - lv_checkbox_t * cb = (lv_checkbox_t *)obj; - - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - int32_t font_h = lv_font_get_line_height(font); - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); - - lv_point_t txt_size; - lv_text_get_size(&txt_size, cb->txt, font, letter_space, line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); - - int32_t bg_colp = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); - int32_t marker_leftp = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); - int32_t marker_rightp = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); - int32_t marker_topp = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); - int32_t marker_bottomp = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); - lv_point_t marker_size; - marker_size.x = font_h + marker_leftp + marker_rightp; - marker_size.y = font_h + marker_topp + marker_bottomp; - - p->x = marker_size.x + txt_size.x + bg_colp; - p->y = LV_MAX(marker_size.y, txt_size.y); - } - else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - int32_t * s = lv_event_get_param(e); - int32_t m = lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR); - *s = LV_MAX(*s, m); - } - else if(code == LV_EVENT_DRAW_MAIN) { - lv_checkbox_draw(e); - } -} - -static void lv_checkbox_draw(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_checkbox_t * cb = (lv_checkbox_t *)obj; - - lv_layer_t * layer = lv_event_get_layer(e); - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - int32_t font_h = lv_font_get_line_height(font); - - const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN); - - int32_t bg_border = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - int32_t bg_topp = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + bg_border; - int32_t bg_p = is_rtl ? lv_obj_get_style_pad_right(obj, LV_PART_MAIN) : lv_obj_get_style_pad_left(obj, - LV_PART_MAIN) + bg_border; - int32_t bg_colp = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); - - int32_t marker_leftp = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); - int32_t marker_rightp = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); - int32_t marker_topp = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); - int32_t marker_bottomp = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); - - int32_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_INDICATOR); - int32_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_INDICATOR); - - lv_draw_rect_dsc_t indic_dsc; - lv_draw_rect_dsc_init(&indic_dsc); - lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &indic_dsc); - lv_area_t marker_area; - if(is_rtl) { - marker_area.x2 = obj->coords.x2 - bg_p; - marker_area.x1 = marker_area.x2 - font_h - marker_leftp - marker_rightp + 1; - } - else { - marker_area.x1 = obj->coords.x1 + bg_p; - marker_area.x2 = marker_area.x1 + font_h + marker_leftp + marker_rightp - 1; - } - marker_area.y1 = obj->coords.y1 + bg_topp; - marker_area.y2 = marker_area.y1 + font_h + marker_topp + marker_bottomp - 1; - - lv_area_t marker_area_transf; - lv_area_copy(&marker_area_transf, &marker_area); - lv_area_increase(&marker_area_transf, transf_w, transf_h); - - lv_draw_rect(layer, &indic_dsc, &marker_area_transf); - - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); - - lv_point_t txt_size; - lv_text_get_size(&txt_size, cb->txt, font, letter_space, line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); - - lv_draw_label_dsc_t txt_dsc; - lv_draw_label_dsc_init(&txt_dsc); - lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &txt_dsc); - txt_dsc.text = cb->txt; - - int32_t y_ofs = (lv_area_get_height(&marker_area) - font_h) / 2; - lv_area_t txt_area; - if(is_rtl) { - txt_area.x2 = marker_area.x1 - bg_colp; - txt_area.x1 = txt_area.x2 - txt_size.x; - } - else { - txt_area.x1 = marker_area.x2 + bg_colp; - txt_area.x2 = txt_area.x1 + txt_size.x; - } - txt_area.y1 = obj->coords.y1 + bg_topp + y_ofs; - txt_area.y2 = txt_area.y1 + txt_size.y; - - lv_draw_label(layer, &txt_dsc, &txt_area); -} -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/checkbox/lv_checkbox.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/checkbox/lv_checkbox.h deleted file mode 100644 index 804ff60..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/checkbox/lv_checkbox.h +++ /dev/null @@ -1,79 +0,0 @@ -/** - * @file lv_checkbox.h - * - */ - -#ifndef LV_CHECKBOX_H -#define LV_CHECKBOX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../core/lv_obj.h" - -#if LV_USE_CHECKBOX != 0 - -/********************* - * DEFINES - *********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_checkbox_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a check box object - * @param parent pointer to an object, it will be the parent of the new button - * @return pointer to the created check box - */ -lv_obj_t * lv_checkbox_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the text of a check box. `txt` will be copied and may be deallocated - * after this function returns. - * @param obj pointer to a check box - * @param txt the text of the check box. NULL to refresh with the current text. - */ -void lv_checkbox_set_text(lv_obj_t * obj, const char * txt); - -/** - * Set the text of a check box. `txt` must not be deallocated during the life - * of this checkbox. - * @param obj pointer to a check box - * @param txt the text of the check box. - */ -void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the text of a check box - * @param obj pointer to check box object - * @return pointer to the text of the check box - */ -const char * lv_checkbox_get_text(const lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_CHECKBOX*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CHECKBOX_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/checkbox/lv_checkbox_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/checkbox/lv_checkbox_private.h deleted file mode 100644 index c927b65..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/checkbox/lv_checkbox_private.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @file lv_checkbox_private.h - * - */ - -#ifndef LV_CHECKBOX_PRIVATE_H -#define LV_CHECKBOX_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_checkbox.h" - -#if LV_USE_CHECKBOX != 0 -#include "../../core/lv_obj_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_checkbox_t { - lv_obj_t obj; - char * txt; - uint32_t static_txt : 1; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_CHECKBOX != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_CHECKBOX_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/dropdown/lv_dropdown.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/dropdown/lv_dropdown.c deleted file mode 100644 index 517479c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/dropdown/lv_dropdown.c +++ /dev/null @@ -1,1229 +0,0 @@ -/** - * @file lv_dropdown.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_dropdown_private.h" -#include "../../misc/lv_area_private.h" -#include "../../core/lv_obj_class_private.h" -#include "../../core/lv_obj.h" -#if LV_USE_DROPDOWN != 0 - -#include "../../misc/lv_assert.h" -#include "../../draw/lv_draw_private.h" -#include "../../core/lv_group.h" -#include "../../indev/lv_indev.h" -#include "../../display/lv_display.h" -#include "../../font/lv_symbol_def.h" -#include "../../misc/lv_anim.h" -#include "../../misc/lv_math.h" -#include "../../misc/lv_text_ap.h" -#include "../../misc/lv_text_private.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_dropdown_class) -#define MY_CLASS_LIST &lv_dropdownlist_class - -#define LV_DROPDOWN_PR_NONE 0xFFFF - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_obj_t * lv_dropdown_list_create(lv_obj_t * parent); -static void lv_dropdown_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_dropdown_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_dropdown_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void draw_main(lv_event_t * e); - -static void lv_dropdownlist_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_dropdownlist_destructor(const lv_obj_class_t * class_p, lv_obj_t * list_obj); -static void lv_dropdown_list_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void draw_list(lv_event_t * e); - -static void draw_box(lv_obj_t * dropdown_obj, lv_layer_t * layer, uint32_t id, lv_state_t state); -static void draw_box_label(lv_obj_t * dropdown_obj, lv_layer_t * layer, uint32_t id, lv_state_t state); -static lv_result_t btn_release_handler(lv_obj_t * obj); -static lv_result_t list_release_handler(lv_obj_t * list_obj); -static void list_press_handler(lv_obj_t * page); -static uint32_t get_id_on_point(lv_obj_t * dropdown_obj, int32_t y); -static void position_to_selected(lv_obj_t * obj); -static lv_obj_t * get_label(const lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ -#if LV_USE_OBJ_PROPERTY -static const lv_property_ops_t properties[] = { - { - .id = LV_PROPERTY_DROPDOWN_TEXT, - .setter = lv_dropdown_set_text, - .getter = lv_dropdown_get_text, - }, - { - .id = LV_PROPERTY_DROPDOWN_OPTIONS, - .setter = lv_dropdown_set_options, - .getter = lv_dropdown_get_options, - }, - { - .id = LV_PROPERTY_DROPDOWN_OPTION_COUNT, - .setter = NULL, - .getter = lv_dropdown_get_option_count, - }, - { - .id = LV_PROPERTY_DROPDOWN_SELECTED, - .setter = lv_dropdown_set_selected, - .getter = lv_dropdown_get_selected, - }, - { - .id = LV_PROPERTY_DROPDOWN_DIR, - .setter = lv_dropdown_set_dir, - .getter = lv_dropdown_get_dir, - }, - { - .id = LV_PROPERTY_DROPDOWN_SYMBOL, - .setter = lv_dropdown_set_symbol, - .getter = lv_dropdown_get_symbol, - }, - { - .id = LV_PROPERTY_DROPDOWN_SELECTED_HIGHLIGHT, - .setter = lv_dropdown_set_selected_highlight, - .getter = lv_dropdown_get_selected_highlight, - }, - { - .id = LV_PROPERTY_DROPDOWN_LIST, - .setter = NULL, - .getter = lv_dropdown_get_list, - }, - { - .id = LV_PROPERTY_DROPDOWN_IS_OPEN, - .setter = NULL, - .getter = lv_dropdown_is_open, - }, -}; -#endif - -const lv_obj_class_t lv_dropdown_class = { - .constructor_cb = lv_dropdown_constructor, - .destructor_cb = lv_dropdown_destructor, - .event_cb = lv_dropdown_event, - .width_def = LV_DPI_DEF, - .height_def = LV_SIZE_CONTENT, - .instance_size = sizeof(lv_dropdown_t), - .editable = LV_OBJ_CLASS_EDITABLE_TRUE, - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .base_class = &lv_obj_class, - .name = "dropdown", -#if LV_USE_OBJ_PROPERTY - .prop_index_start = LV_PROPERTY_DROPDOWN_START, - .prop_index_end = LV_PROPERTY_DROPDOWN_END, - .properties = properties, - .properties_count = sizeof(properties) / sizeof(properties[0]), - -#if LV_USE_OBJ_PROPERTY_NAME - .property_names = lv_dropdown_property_names, - .names_count = sizeof(lv_dropdown_property_names) / sizeof(lv_property_name_t), -#endif -#endif -}; - -const lv_obj_class_t lv_dropdownlist_class = { - .constructor_cb = lv_dropdownlist_constructor, - .destructor_cb = lv_dropdownlist_destructor, - .event_cb = lv_dropdown_list_event, - .instance_size = sizeof(lv_dropdown_list_t), - .base_class = &lv_obj_class, - .name = "dropdown-list", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_dropdown_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(&lv_dropdown_class, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_dropdown_set_text(lv_obj_t * obj, const char * txt) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - if(dropdown->text == txt) return; - - dropdown->text = txt; - - lv_obj_invalidate(obj); -} - -void lv_dropdown_set_options(lv_obj_t * obj, const char * options) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(options); - - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - - /*Count the '\n'-s to determine the number of options*/ - dropdown->option_cnt = 0; - uint32_t i; - for(i = 0; options[i] != '\0'; i++) { - if(options[i] == '\n') dropdown->option_cnt++; - } - dropdown->option_cnt++; /*Last option has no `\n`*/ - dropdown->sel_opt_id = 0; - dropdown->sel_opt_id_orig = 0; - - /*Allocate space for the new text*/ -#if LV_USE_ARABIC_PERSIAN_CHARS == 0 - size_t len = lv_strlen(options) + 1; -#else - size_t len = lv_text_ap_calc_bytes_count(options) + 1; -#endif - - if(dropdown->options != NULL && dropdown->static_txt == 0) { - lv_free(dropdown->options); - dropdown->options = NULL; - } - - dropdown->options = lv_malloc(len); - - LV_ASSERT_MALLOC(dropdown->options); - if(dropdown->options == NULL) return; - -#if LV_USE_ARABIC_PERSIAN_CHARS == 0 - lv_strcpy(dropdown->options, options); -#else - lv_text_ap_proc(options, dropdown->options); -#endif - - /*Now the text is dynamically allocated*/ - dropdown->static_txt = 0; - - lv_obj_invalidate(obj); - if(dropdown->list) lv_obj_invalidate(dropdown->list); -} - -void lv_dropdown_set_options_static(lv_obj_t * obj, const char * options) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(options); - - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - - /*Count the '\n'-s to determine the number of options*/ - dropdown->option_cnt = 0; - uint32_t i; - for(i = 0; options[i] != '\0'; i++) { - if(options[i] == '\n') dropdown->option_cnt++; - } - dropdown->option_cnt++; /*Last option has no `\n`*/ - dropdown->sel_opt_id = 0; - dropdown->sel_opt_id_orig = 0; - - if(dropdown->static_txt == 0 && dropdown->options != NULL) { - lv_free(dropdown->options); - dropdown->options = NULL; - } - - dropdown->static_txt = 1; - dropdown->options = (char *)options; - - lv_obj_invalidate(obj); - if(dropdown->list) lv_obj_invalidate(dropdown->list); -} - -void lv_dropdown_add_option(lv_obj_t * obj, const char * option, uint32_t pos) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(option); - - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - - /*Convert static options to dynamic*/ - if(dropdown->static_txt != 0) { - char * static_options = dropdown->options; - dropdown->options = lv_strdup(static_options); - LV_ASSERT_MALLOC(dropdown->options); - if(dropdown->options == NULL) return; - dropdown->static_txt = 0; - } - - /*Allocate space for the new option*/ - size_t old_len = (dropdown->options == NULL) ? 0 : lv_strlen(dropdown->options); -#if LV_USE_ARABIC_PERSIAN_CHARS == 0 - size_t ins_len = lv_strlen(option) + 1; -#else - size_t ins_len = lv_text_ap_calc_bytes_count(option) + 1; -#endif - - size_t new_len = ins_len + old_len + 2; /*+2 for terminating NULL and possible \n*/ - dropdown->options = lv_realloc(dropdown->options, new_len + 1); - LV_ASSERT_MALLOC(dropdown->options); - if(dropdown->options == NULL) return; - - dropdown->options[old_len] = '\0'; - - /*Find the insert character position*/ - uint32_t insert_pos = old_len; - if(pos != LV_DROPDOWN_POS_LAST) { - uint32_t opcnt = 0; - for(insert_pos = 0; dropdown->options[insert_pos] != 0; insert_pos++) { - if(opcnt == pos) - break; - if(dropdown->options[insert_pos] == '\n') - opcnt++; - } - } - - /*Add delimiter to existing options*/ - if((insert_pos > 0) && (pos >= dropdown->option_cnt)) - lv_text_ins(dropdown->options, lv_text_encoded_get_char_id(dropdown->options, insert_pos++), "\n"); - - /*Insert the new option, adding \n if necessary*/ - char * ins_buf = lv_malloc(ins_len + 2); /*+ 2 for terminating NULL and possible \n*/ - LV_ASSERT_MALLOC(ins_buf); - if(ins_buf == NULL) return; -#if LV_USE_ARABIC_PERSIAN_CHARS == 0 - lv_strcpy(ins_buf, option); -#else - lv_text_ap_proc(option, ins_buf); -#endif - if(pos < dropdown->option_cnt) lv_strcat(ins_buf, "\n"); - - lv_text_ins(dropdown->options, lv_text_encoded_get_char_id(dropdown->options, insert_pos), ins_buf); - lv_free(ins_buf); - - dropdown->option_cnt++; - - lv_obj_invalidate(obj); - if(dropdown->list) lv_obj_invalidate(dropdown->list); -} - -void lv_dropdown_clear_options(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - if(dropdown->options == NULL) return; - - if(dropdown->static_txt == 0) - lv_free(dropdown->options); - - dropdown->options = NULL; - dropdown->static_txt = 0; - dropdown->option_cnt = 0; - - lv_obj_invalidate(obj); - if(dropdown->list) lv_obj_invalidate(dropdown->list); -} - -void lv_dropdown_set_selected(lv_obj_t * obj, uint32_t sel_opt) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - if(dropdown->sel_opt_id == sel_opt) return; - - dropdown->sel_opt_id = sel_opt < dropdown->option_cnt ? sel_opt : dropdown->option_cnt - 1; - dropdown->sel_opt_id_orig = dropdown->sel_opt_id; - - if(dropdown->list) { - position_to_selected(obj); - } - - lv_obj_invalidate(obj); -} - -void lv_dropdown_set_dir(lv_obj_t * obj, lv_dir_t dir) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - if(dropdown->dir == dir) return; - - dropdown->dir = dir; - - lv_obj_invalidate(obj); -} - -void lv_dropdown_set_symbol(lv_obj_t * obj, const void * symbol) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - dropdown->symbol = symbol; - lv_obj_invalidate(obj); -} - -void lv_dropdown_set_selected_highlight(lv_obj_t * obj, bool en) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - dropdown->selected_highlight = en; - if(dropdown->list) lv_obj_invalidate(dropdown->list); -} - -/*===================== - * Getter functions - *====================*/ - -lv_obj_t * lv_dropdown_get_list(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - - return dropdown->list; -} - -const char * lv_dropdown_get_text(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - - return dropdown->text; -} - -const char * lv_dropdown_get_options(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - return dropdown->options == NULL ? "" : dropdown->options; -} - -uint32_t lv_dropdown_get_selected(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - - return dropdown->sel_opt_id; -} - -uint32_t lv_dropdown_get_option_count(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - - return dropdown->option_cnt; -} - -void lv_dropdown_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - - uint32_t i; - uint32_t line = 0; - size_t txt_len; - - if(dropdown->options) { - txt_len = lv_strlen(dropdown->options); - } - else { - buf[0] = '\0'; - return; - } - - for(i = 0; i < txt_len && line != dropdown->sel_opt_id_orig; i++) { - if(dropdown->options[i] == '\n') line++; - } - - uint32_t c; - for(c = 0; i < txt_len && dropdown->options[i] != '\n'; c++, i++) { - if(buf_size && c >= buf_size - 1) { - LV_LOG_WARN("the buffer was too small"); - break; - } - buf[c] = dropdown->options[i]; - } - - buf[c] = '\0'; -} - -int32_t lv_dropdown_get_option_index(lv_obj_t * obj, const char * option) -{ - const char * opts = lv_dropdown_get_options(obj); - uint32_t char_i = 0; - uint32_t opt_i = 0; - const char * start = opts; - const size_t option_len = lv_strlen(option); /*avoid recomputing this multiple times in the loop*/ - - while(start[0] != '\0') { - for(char_i = 0; (start[char_i] != '\n') && (start[char_i] != '\0'); char_i++); - - if(option_len == char_i && lv_memcmp(start, option, LV_MIN(option_len, char_i)) == 0) { - return opt_i; - } - - start = &start[char_i]; - if(start[0] == '\n') start++; - char_i = 0; - opt_i++; - } - - return -1; -} - -const char * lv_dropdown_get_symbol(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - return dropdown->symbol; -} - -bool lv_dropdown_get_selected_highlight(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - return dropdown->selected_highlight; -} - -lv_dir_t lv_dropdown_get_dir(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - return dropdown->dir; -} - -/*===================== - * Other functions - *====================*/ - -void lv_dropdown_open(lv_obj_t * dropdown_obj) -{ - LV_ASSERT_OBJ(dropdown_obj, MY_CLASS); - - lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; - - lv_obj_add_state(dropdown_obj, LV_STATE_CHECKED); - lv_obj_set_parent(dropdown->list, lv_obj_get_screen(dropdown_obj)); - lv_obj_move_to_index(dropdown->list, -1); - lv_obj_remove_flag(dropdown->list, LV_OBJ_FLAG_HIDDEN); - - /*To allow styling the list*/ - lv_obj_send_event(dropdown_obj, LV_EVENT_READY, NULL); - - lv_obj_t * label = get_label(dropdown_obj); - lv_label_set_text_static(label, dropdown->options); - lv_obj_set_width(dropdown->list, LV_SIZE_CONTENT); - - lv_obj_update_layout(label); - /*Set smaller width to the width of the button*/ - if(lv_obj_get_width(dropdown->list) <= lv_obj_get_width(dropdown_obj) && - (dropdown->dir == LV_DIR_TOP || dropdown->dir == LV_DIR_BOTTOM)) { - lv_obj_set_width(dropdown->list, lv_obj_get_width(dropdown_obj)); - } - - int32_t label_h = lv_obj_get_height(label); - int32_t border_width = lv_obj_get_style_border_width(dropdown->list, LV_PART_MAIN); - int32_t top = lv_obj_get_style_pad_top(dropdown->list, LV_PART_MAIN) + border_width; - int32_t bottom = lv_obj_get_style_pad_bottom(dropdown->list, LV_PART_MAIN) + border_width; - - int32_t list_fit_h = label_h + top + bottom; - int32_t list_h = list_fit_h; - - lv_dir_t dir = dropdown->dir; - /*No space on the bottom? See if top is better.*/ - if(dropdown->dir == LV_DIR_BOTTOM) { - if(dropdown_obj->coords.y2 + list_h > LV_VER_RES) { - if(dropdown_obj->coords.y1 > LV_VER_RES - dropdown_obj->coords.y2) { - /*There is more space on the top, so make it drop up*/ - dir = LV_DIR_TOP; - list_h = dropdown_obj->coords.y1 - 1; - } - else { - list_h = LV_VER_RES - dropdown_obj->coords.y2 - 1 ; - } - } - } - /*No space on the top? See if bottom is better.*/ - else if(dropdown->dir == LV_DIR_TOP) { - if(dropdown_obj->coords.y1 - list_h < 0) { - if(dropdown_obj->coords.y1 < LV_VER_RES - dropdown_obj->coords.y2) { - /*There is more space on the top, so make it drop up*/ - dir = LV_DIR_BOTTOM; - list_h = LV_VER_RES - dropdown_obj->coords.y2; - } - else { - list_h = dropdown_obj->coords.y1; - } - } - } - - if(list_h > list_fit_h) list_h = list_fit_h; - lv_obj_set_height(dropdown->list, list_h); - - position_to_selected(dropdown_obj); - - if(dir == LV_DIR_BOTTOM) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); - else if(dir == LV_DIR_TOP) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_TOP_LEFT, 0, 0); - else if(dir == LV_DIR_LEFT) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_LEFT_TOP, 0, 0); - else if(dir == LV_DIR_RIGHT) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_RIGHT_TOP, 0, 0); - - lv_obj_update_layout(dropdown->list); - - if(dropdown->dir == LV_DIR_LEFT || dropdown->dir == LV_DIR_RIGHT) { - int32_t y1 = lv_obj_get_y(dropdown->list); - int32_t y2 = lv_obj_get_y2(dropdown->list); - if(y2 >= LV_VER_RES) { - lv_obj_set_y(dropdown->list, y1 - (y2 - LV_VER_RES) - 1); - } - } - - lv_text_align_t align = lv_obj_calculate_style_text_align(label, LV_PART_MAIN, dropdown->options); - - switch(align) { - default: - case LV_TEXT_ALIGN_LEFT: - lv_obj_align(label, LV_ALIGN_TOP_LEFT, 0, 0); - break; - case LV_TEXT_ALIGN_RIGHT: - lv_obj_align(label, LV_ALIGN_TOP_RIGHT, 0, 0); - break; - case LV_TEXT_ALIGN_CENTER: - lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 0); - break; - - } -} - -void lv_dropdown_close(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_remove_state(obj, LV_STATE_CHECKED); - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - - dropdown->pr_opt_id = LV_DROPDOWN_PR_NONE; - lv_obj_add_flag(dropdown->list, LV_OBJ_FLAG_HIDDEN); - - lv_obj_send_event(obj, LV_EVENT_CANCEL, NULL); -} - -bool lv_dropdown_is_open(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - - return lv_obj_has_flag(dropdown->list, LV_OBJ_FLAG_HIDDEN) ? false : true; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static lv_obj_t * lv_dropdown_list_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(&lv_dropdownlist_class, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -static void lv_dropdown_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - - /*Initialize the allocated 'ext'*/ - dropdown->list = NULL; - dropdown->options = NULL; - dropdown->symbol = LV_SYMBOL_DOWN; - dropdown->text = NULL; - dropdown->static_txt = 1; - dropdown->selected_highlight = 1; - dropdown->sel_opt_id = 0; - dropdown->sel_opt_id_orig = 0; - dropdown->pr_opt_id = LV_DROPDOWN_PR_NONE; - dropdown->option_cnt = 0; - dropdown->dir = LV_DIR_BOTTOM; - - lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); -#if LV_WIDGETS_HAS_DEFAULT_VALUE - lv_dropdown_set_options_static(obj, "Option 1\nOption 2\nOption 3"); -#endif - - dropdown->list = lv_dropdown_list_create(lv_obj_get_screen(obj)); - lv_dropdown_list_t * list = (lv_dropdown_list_t *)dropdown->list; - list->dropdown = obj; - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_dropdown_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - - if(dropdown->list) { - lv_obj_delete(dropdown->list); - dropdown->list = NULL; - } - - if(!dropdown->static_txt) { - lv_free(dropdown->options); - dropdown->options = NULL; - } -} - -static void lv_dropdownlist_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICK_FOCUSABLE); - lv_obj_add_flag(obj, LV_OBJ_FLAG_IGNORE_LAYOUT); - lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); - - lv_label_create(obj); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_dropdownlist_destructor(const lv_obj_class_t * class_p, lv_obj_t * list_obj) -{ - LV_UNUSED(class_p); - lv_dropdown_list_t * list = (lv_dropdown_list_t *)list_obj; - lv_obj_t * dropdown_obj = list->dropdown; - lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; - dropdown->list = NULL; -} - -static void lv_dropdown_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - - /*Call the ancestor's event handler*/ - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - - if(code == LV_EVENT_FOCUSED) { - lv_group_t * g = lv_obj_get_group(obj); - bool editing = lv_group_get_editing(g); - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); - - /*Encoders need special handling*/ - if(indev_type == LV_INDEV_TYPE_ENCODER) { - /*Open the list if editing*/ - if(editing) { - lv_dropdown_open(obj); - } - /*Close the list if navigating*/ - else { - dropdown->sel_opt_id = dropdown->sel_opt_id_orig; - lv_dropdown_close(obj); - } - } - } - else if(code == LV_EVENT_DEFOCUSED || code == LV_EVENT_LEAVE) { - lv_dropdown_close(obj); - } - else if(code == LV_EVENT_RELEASED) { - res = btn_release_handler(obj); - if(res != LV_RESULT_OK) return; - } - else if(code == LV_EVENT_STYLE_CHANGED) { - lv_obj_refresh_self_size(obj); - } - else if(code == LV_EVENT_SIZE_CHANGED) { - lv_obj_refresh_self_size(obj); - } - else if(code == LV_EVENT_GET_SELF_SIZE) { - lv_point_t * p = lv_event_get_param(e); - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - p->y = lv_font_get_line_height(font); - } - else if(code == LV_EVENT_KEY) { - uint32_t c = lv_event_get_key(e); - if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN) { - if(!lv_dropdown_is_open(obj)) { - lv_dropdown_open(obj); - } - else if(dropdown->sel_opt_id + 1 < dropdown->option_cnt) { - dropdown->sel_opt_id++; - position_to_selected(obj); - } - } - else if(c == LV_KEY_LEFT || c == LV_KEY_UP) { - - if(!lv_dropdown_is_open(obj)) { - lv_dropdown_open(obj); - } - else if(dropdown->sel_opt_id > 0) { - dropdown->sel_opt_id--; - position_to_selected(obj); - } - } - else if(c == LV_KEY_ESC) { - dropdown->sel_opt_id = dropdown->sel_opt_id_orig; - lv_dropdown_close(obj); - } - else if(c == LV_KEY_ENTER) { - /* Handle the ENTER key only if it was send by another object. - * Do no process it if ENTER is sent by the dropdown because it's handled in LV_EVENT_RELEASED */ - lv_obj_t * indev_obj = lv_indev_get_active_obj(); - if(indev_obj != obj) { - res = btn_release_handler(obj); - if(res != LV_RESULT_OK) return; - } - } - } - else if(code == LV_EVENT_ROTARY) { - if(!lv_dropdown_is_open(obj)) { - lv_dropdown_open(obj); - } - else { - int32_t r = lv_event_get_rotary_diff(e); - int32_t new_id = dropdown->sel_opt_id + r; - new_id = LV_CLAMP(0, new_id, (int32_t)dropdown->option_cnt - 1); - - dropdown->sel_opt_id = new_id; - position_to_selected(obj); - } - } - else if(code == LV_EVENT_DRAW_MAIN) { - draw_main(e); - } -} - -static void lv_dropdown_list_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - - /*Call the ancestor's event handler*/ - lv_event_code_t code = lv_event_get_code(e); - if(code != LV_EVENT_DRAW_POST) { - res = lv_obj_event_base(MY_CLASS_LIST, e); - if(res != LV_RESULT_OK) return; - } - lv_obj_t * list = lv_event_get_current_target(e); - lv_obj_t * dropdown_obj = ((lv_dropdown_list_t *)list)->dropdown; - lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; - - if(code == LV_EVENT_RELEASED) { - if(lv_indev_get_scroll_obj(lv_indev_active()) == NULL) { - list_release_handler(list); - } - } - else if(code == LV_EVENT_PRESSED) { - list_press_handler(list); - } - else if(code == LV_EVENT_SCROLL_BEGIN) { - dropdown->pr_opt_id = LV_DROPDOWN_PR_NONE; - lv_obj_invalidate(list); - } - else if(code == LV_EVENT_DRAW_POST) { - draw_list(e); - res = lv_obj_event_base(MY_CLASS_LIST, e); - if(res != LV_RESULT_OK) return; - } -} - -static void draw_main(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - lv_layer_t * layer = lv_event_get_layer(e); - - int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - int32_t left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; - int32_t right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN) + border_width; - - lv_draw_label_dsc_t symbol_dsc; - lv_draw_label_dsc_init(&symbol_dsc); - lv_obj_init_draw_label_dsc(obj, LV_PART_INDICATOR, &symbol_dsc); - - /*If no text specified use the selected option*/ - const char * opt_txt; - char buf[128]; - if(dropdown->text) opt_txt = dropdown->text; - else { - lv_dropdown_get_selected_str(obj, buf, 128); - opt_txt = buf; - } - - bool symbol_to_left = false; - if(dropdown->dir == LV_DIR_LEFT) symbol_to_left = true; - if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) symbol_to_left = true; - - if(dropdown->symbol) { - lv_image_src_t symbol_type = lv_image_src_get_type(dropdown->symbol); - int32_t symbol_w; - int32_t symbol_h; - if(symbol_type == LV_IMAGE_SRC_SYMBOL) { - lv_point_t size; - lv_text_get_size(&size, dropdown->symbol, symbol_dsc.font, symbol_dsc.letter_space, symbol_dsc.line_space, LV_COORD_MAX, - symbol_dsc.flag); - symbol_w = size.x; - symbol_h = size.y; - } - else { - lv_image_header_t header; - lv_result_t res = lv_image_decoder_get_info(dropdown->symbol, &header); - if(res == LV_RESULT_OK) { - symbol_w = header.w; - symbol_h = header.h; - } - else { - symbol_w = -1; - symbol_h = -1; - } - } - - lv_area_t symbol_area; - symbol_area.y1 = obj->coords.y1; - symbol_area.y2 = symbol_area.y1 + symbol_h - 1; - symbol_area.x1 = obj->coords.x1; - symbol_area.x2 = symbol_area.x1 + symbol_w - 1; - if(symbol_to_left) { - lv_area_align(&obj->coords, &symbol_area, LV_ALIGN_LEFT_MID, left, 0); - } - else { - lv_area_align(&obj->coords, &symbol_area, LV_ALIGN_RIGHT_MID, -right, 0); - } - - if(symbol_type == LV_IMAGE_SRC_SYMBOL) { - symbol_dsc.text = dropdown->symbol; - lv_draw_label(layer, &symbol_dsc, &symbol_area); - } - else { - lv_draw_image_dsc_t img_dsc; - lv_draw_image_dsc_init(&img_dsc); - lv_obj_init_draw_image_dsc(obj, LV_PART_INDICATOR, &img_dsc); - lv_point_set(&img_dsc.pivot, symbol_w / 2, symbol_h / 2); - img_dsc.rotation = lv_obj_get_style_transform_rotation(obj, LV_PART_INDICATOR); - img_dsc.src = dropdown->symbol; - lv_draw_image(layer, &img_dsc, &symbol_area); - } - } - - lv_draw_label_dsc_t label_dsc; - lv_draw_label_dsc_init(&label_dsc); - lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_dsc); - - lv_point_t size; - lv_text_get_size(&size, opt_txt, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, LV_COORD_MAX, - label_dsc.flag); - - lv_area_t txt_area; - txt_area.x1 = obj->coords.x1; - txt_area.x2 = txt_area.x1 + size.x - 1; - txt_area.y1 = obj->coords.y1; - txt_area.y2 = txt_area.y1 + size.y - 1; - /*Center align the text if no symbol*/ - if(dropdown->symbol == NULL) { - lv_area_align(&obj->coords, &txt_area, LV_ALIGN_CENTER, 0, 0); - } - else { - /*Text to the right*/ - if(symbol_to_left) { - lv_area_align(&obj->coords, &txt_area, LV_ALIGN_RIGHT_MID, -right, 0); - } - else { - lv_area_align(&obj->coords, &txt_area, LV_ALIGN_LEFT_MID, left, 0); - } - } - - label_dsc.text = opt_txt; - if(dropdown->text == NULL) { - label_dsc.text_local = true; - } - - lv_draw_label(layer, &label_dsc, &txt_area); -} - -static void draw_list(lv_event_t * e) -{ - lv_obj_t * list_obj = lv_event_get_current_target(e); - lv_dropdown_list_t * list = (lv_dropdown_list_t *)list_obj; - lv_obj_t * dropdown_obj = list->dropdown; - lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; - lv_layer_t * layer = lv_event_get_layer(e); - - /* Clip area might be too large too to shadow but - * the selected option can be drawn on only the background*/ - lv_area_t clip_area_core; - bool has_common; - has_common = lv_area_intersect(&clip_area_core, &layer->_clip_area, &dropdown->list->coords); - if(has_common) { - const lv_area_t clip_area_ori = layer->_clip_area; - layer->_clip_area = clip_area_core; - if(dropdown->selected_highlight) { - if(dropdown->pr_opt_id == dropdown->sel_opt_id) { - draw_box(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_CHECKED | LV_STATE_PRESSED); - draw_box_label(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_CHECKED | LV_STATE_PRESSED); - } - else { - draw_box(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_PRESSED); - draw_box_label(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_PRESSED); - draw_box(dropdown_obj, layer, dropdown->sel_opt_id, LV_STATE_CHECKED); - draw_box_label(dropdown_obj, layer, dropdown->sel_opt_id, LV_STATE_CHECKED); - } - } - else { - draw_box(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_PRESSED); - draw_box_label(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_PRESSED); - } - layer->_clip_area = clip_area_ori; - } -} - -static void draw_box(lv_obj_t * dropdown_obj, lv_layer_t * layer, uint32_t id, lv_state_t state) -{ - if(id == LV_DROPDOWN_PR_NONE) return; - - lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; - lv_obj_t * list_obj = dropdown->list; - lv_state_t state_ori = list_obj->state; - - if(state != list_obj->state) { - list_obj->state = state; - list_obj->skip_trans = 1; - } - - /*Draw a rectangle under the selected item*/ - const lv_font_t * font = lv_obj_get_style_text_font(list_obj, LV_PART_SELECTED); - int32_t line_space = lv_obj_get_style_text_line_space(list_obj, LV_PART_SELECTED); - int32_t font_h = lv_font_get_line_height(font); - - /*Draw the selected*/ - lv_obj_t * label = get_label(dropdown_obj); - lv_area_t rect_area; - rect_area.y1 = label->coords.y1; - rect_area.y1 += id * (font_h + line_space); - rect_area.y1 -= line_space / 2; - - rect_area.y2 = rect_area.y1 + font_h + line_space - 1; - rect_area.x1 = dropdown->list->coords.x1; - rect_area.x2 = dropdown->list->coords.x2; - - lv_draw_rect_dsc_t sel_rect; - lv_draw_rect_dsc_init(&sel_rect); - lv_obj_init_draw_rect_dsc(list_obj, LV_PART_SELECTED, &sel_rect); - lv_draw_rect(layer, &sel_rect, &rect_area); - - list_obj->state = state_ori; - list_obj->skip_trans = 0; -} - -static void draw_box_label(lv_obj_t * dropdown_obj, lv_layer_t * layer, uint32_t id, lv_state_t state) -{ - if(id == LV_DROPDOWN_PR_NONE) return; - - lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; - lv_obj_t * list_obj = dropdown->list; - lv_state_t state_orig = list_obj->state; - - if(state != list_obj->state) { - list_obj->state = state; - list_obj->skip_trans = 1; - } - - lv_draw_label_dsc_t label_dsc; - lv_draw_label_dsc_init(&label_dsc); - lv_obj_init_draw_label_dsc(list_obj, LV_PART_SELECTED, &label_dsc); - - label_dsc.line_space = lv_obj_get_style_text_line_space(list_obj, - LV_PART_SELECTED); /*Line space should come from the list*/ - - lv_obj_t * label = get_label(dropdown_obj); - if(label == NULL) return; - - int32_t font_h = lv_font_get_line_height(label_dsc.font); - - lv_area_t area_sel; - area_sel.y1 = label->coords.y1; - area_sel.y1 += id * (font_h + label_dsc.line_space); - area_sel.y1 -= label_dsc.line_space / 2; - - area_sel.y2 = area_sel.y1 + font_h + label_dsc.line_space - 1; - area_sel.x1 = list_obj->coords.x1; - area_sel.x2 = list_obj->coords.x2; - lv_area_t mask_sel; - bool area_ok; - area_ok = lv_area_intersect(&mask_sel, &layer->_clip_area, &area_sel); - if(area_ok) { - const lv_area_t clip_area_ori = layer->_clip_area; - layer->_clip_area = mask_sel; - label_dsc.text = lv_label_get_text(label); - lv_draw_label(layer, &label_dsc, &label->coords); - layer->_clip_area = clip_area_ori; - } - list_obj->state = state_orig; - list_obj->skip_trans = 0; -} - -static lv_result_t btn_release_handler(lv_obj_t * obj) -{ - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - lv_indev_t * indev = lv_indev_active(); - if(lv_indev_get_scroll_obj(indev) == NULL) { - if(lv_dropdown_is_open(obj)) { - lv_dropdown_close(obj); - if(dropdown->sel_opt_id_orig != dropdown->sel_opt_id) { - dropdown->sel_opt_id_orig = dropdown->sel_opt_id; - lv_result_t res; - uint32_t id = dropdown->sel_opt_id; /*Just to use uint32_t in event data*/ - res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &id); - if(res != LV_RESULT_OK) return res; - lv_obj_invalidate(obj); - } - lv_indev_type_t indev_type = lv_indev_get_type(indev); - if(indev_type == LV_INDEV_TYPE_ENCODER) { - lv_group_set_editing(lv_obj_get_group(obj), false); - } - } - else { - lv_dropdown_open(obj); - } - } - else { - dropdown->sel_opt_id = dropdown->sel_opt_id_orig; - lv_obj_invalidate(obj); - } - return LV_RESULT_OK; -} - -/** - * Called when a drop down list is released to open it or set new option - * @param list pointer to the drop down list's list - * @return LV_RESULT_INVALID if the list is not being deleted in the user callback. Else LV_RESULT_OK - */ -static lv_result_t list_release_handler(lv_obj_t * list_obj) -{ - lv_dropdown_list_t * list = (lv_dropdown_list_t *) list_obj; - lv_obj_t * dropdown_obj = list->dropdown; - lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; - - lv_indev_t * indev = lv_indev_active(); - /*Leave edit mode once a new item is selected*/ - if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER) { - dropdown->sel_opt_id_orig = dropdown->sel_opt_id; - lv_group_t * g = lv_obj_get_group(dropdown_obj); - if(lv_group_get_editing(g)) { - lv_group_set_editing(g, false); - } - } - - /*Search the clicked option (For KEYPAD and ENCODER the new value should be already set)*/ - if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON) { - lv_point_t p; - lv_indev_get_point(indev, &p); - dropdown->sel_opt_id = get_id_on_point(dropdown_obj, p.y); - dropdown->sel_opt_id_orig = dropdown->sel_opt_id; - } - - lv_dropdown_close(dropdown_obj); - - /*Invalidate to refresh the text*/ - if(dropdown->text == NULL) lv_obj_invalidate(dropdown_obj); - - uint32_t id = dropdown->sel_opt_id; /*Just to use uint32_t in event data*/ - lv_result_t res = lv_obj_send_event(dropdown_obj, LV_EVENT_VALUE_CHANGED, &id); - if(res != LV_RESULT_OK) return res; - - return LV_RESULT_OK; -} - -static void list_press_handler(lv_obj_t * list_obj) -{ - lv_dropdown_list_t * list = (lv_dropdown_list_t *) list_obj; - lv_obj_t * dropdown_obj = list->dropdown; - lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; - - lv_indev_t * indev = lv_indev_active(); - if(indev && (lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON)) { - lv_point_t p; - lv_indev_get_point(indev, &p); - dropdown->pr_opt_id = get_id_on_point(dropdown_obj, p.y); - lv_obj_invalidate(list_obj); - } -} - -static uint32_t get_id_on_point(lv_obj_t * dropdown_obj, int32_t y) -{ - lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; - lv_obj_t * label = get_label(dropdown_obj); - if(label == NULL) return 0; - y -= label->coords.y1; - - const lv_font_t * font = lv_obj_get_style_text_font(label, LV_PART_MAIN); - int32_t font_h = lv_font_get_line_height(font); - int32_t line_space = lv_obj_get_style_text_line_space(label, LV_PART_MAIN); - - y += line_space / 2; - int32_t h = font_h + line_space; - - uint32_t opt = y / h; - - if(opt >= dropdown->option_cnt) opt = dropdown->option_cnt - 1; - return opt; -} - -/** - * Set the position of list when it is closed to show the selected item - * @param ddlist pointer to a drop down list - */ -static void position_to_selected(lv_obj_t * dropdown_obj) -{ - lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; - - lv_obj_t * label = get_label(dropdown_obj); - if(label == NULL) return; - - if(lv_obj_get_height(label) <= lv_obj_get_content_height(dropdown_obj)) return; - - const lv_font_t * font = lv_obj_get_style_text_font(label, LV_PART_MAIN); - int32_t font_h = lv_font_get_line_height(font); - int32_t line_space = lv_obj_get_style_text_line_space(label, LV_PART_MAIN); - int32_t unit_h = font_h + line_space; - int32_t line_y1 = dropdown->sel_opt_id * unit_h; - - /*Scroll to the selected option*/ - lv_obj_scroll_to_y(dropdown->list, line_y1, LV_ANIM_OFF); - lv_obj_invalidate(dropdown->list); -} - -static lv_obj_t * get_label(const lv_obj_t * obj) -{ - lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - if(dropdown->list == NULL) return NULL; - - return lv_obj_get_child(dropdown->list, 0); -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/dropdown/lv_dropdown.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/dropdown/lv_dropdown.h deleted file mode 100644 index c9f55be..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/dropdown/lv_dropdown.h +++ /dev/null @@ -1,246 +0,0 @@ -/** - * @file lv_dropdown.h - * - */ - -#ifndef LV_DROPDOWN_H -#define LV_DROPDOWN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -#if LV_USE_DROPDOWN != 0 - -/*Testing of dependencies*/ - -#if LV_USE_LABEL == 0 -#error "lv_dropdown: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" -#endif - -#include "../label/lv_label.h" - -/********************* - * DEFINES - *********************/ -#define LV_DROPDOWN_POS_LAST 0xFFFF -LV_EXPORT_CONST_INT(LV_DROPDOWN_POS_LAST); - -#if LV_USE_OBJ_PROPERTY -enum { - LV_PROPERTY_ID(DROPDOWN, TEXT, LV_PROPERTY_TYPE_TEXT, 0), - LV_PROPERTY_ID(DROPDOWN, OPTIONS, LV_PROPERTY_TYPE_TEXT, 1), - LV_PROPERTY_ID(DROPDOWN, OPTION_COUNT, LV_PROPERTY_TYPE_INT, 2), - LV_PROPERTY_ID(DROPDOWN, SELECTED, LV_PROPERTY_TYPE_INT, 3), - // LV_PROPERTY_ID(DROPDOWN, SELECTED_STR, LV_PROPERTY_TYPE_TEXT, 4), - LV_PROPERTY_ID(DROPDOWN, DIR, LV_PROPERTY_TYPE_INT, 5), - LV_PROPERTY_ID(DROPDOWN, SYMBOL, LV_PROPERTY_TYPE_TEXT, 6), - LV_PROPERTY_ID(DROPDOWN, SELECTED_HIGHLIGHT, LV_PROPERTY_TYPE_INT, 7), - LV_PROPERTY_ID(DROPDOWN, LIST, LV_PROPERTY_TYPE_OBJ, 8), - LV_PROPERTY_ID(DROPDOWN, IS_OPEN, LV_PROPERTY_TYPE_BOOL, 9), - LV_PROPERTY_DROPDOWN_END, -}; -#endif - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_dropdown_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_dropdownlist_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a drop-down list object - * @param parent pointer to an object, it will be the parent of the new drop-down list - * @return pointer to the created drop-down list - */ -lv_obj_t * lv_dropdown_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set text of the drop-down list's button. - * If set to `NULL` the selected option's text will be displayed on the button. - * If set to a specific text then that text will be shown regardless of the selected option. - * @param obj pointer to a drop-down list object - * @param txt the text as a string (Only its pointer is saved) - */ -void lv_dropdown_set_text(lv_obj_t * obj, const char * txt); - -/** - * Set the options in a drop-down list from a string. - * The options will be copied and saved in the object so the `options` can be destroyed after calling this function - * @param obj pointer to drop-down list object - * @param options a string with '\n' separated options. E.g. "One\nTwo\nThree" - */ -void lv_dropdown_set_options(lv_obj_t * obj, const char * options); - -/** - * Set the options in a drop-down list from a static string (global, static or dynamically allocated). - * Only the pointer of the option string will be saved. - * @param obj pointer to drop-down list object - * @param options a static string with '\n' separated options. E.g. "One\nTwo\nThree" - */ -void lv_dropdown_set_options_static(lv_obj_t * obj, const char * options); - -/** - * Add an options to a drop-down list from a string. Only works for non-static options. - * @param obj pointer to drop-down list object - * @param option a string without '\n'. E.g. "Four" - * @param pos the insert position, indexed from 0, LV_DROPDOWN_POS_LAST = end of string - */ -void lv_dropdown_add_option(lv_obj_t * obj, const char * option, uint32_t pos); - -/** - * Clear all options in a drop-down list. Works with both static and dynamic options. - * @param obj pointer to drop-down list object - */ -void lv_dropdown_clear_options(lv_obj_t * obj); - -/** - * Set the selected option - * @param obj pointer to drop-down list object - * @param sel_opt id of the selected option (0 ... number of option - 1); - */ -void lv_dropdown_set_selected(lv_obj_t * obj, uint32_t sel_opt); - -/** - * Set the direction of the a drop-down list - * @param obj pointer to a drop-down list object - * @param dir LV_DIR_LEFT/RIGHT/TOP/BOTTOM - */ -void lv_dropdown_set_dir(lv_obj_t * obj, lv_dir_t dir); - -/** - * Set an arrow or other symbol to display when on drop-down list's button. Typically a down caret or arrow. - * @param obj pointer to drop-down list object - * @param symbol a text like `LV_SYMBOL_DOWN`, an image (pointer or path) or NULL to not draw symbol icon - * @note angle and zoom transformation can be applied if the symbol is an image. - * E.g. when drop down is checked (opened) rotate the symbol by 180 degree - */ -void lv_dropdown_set_symbol(lv_obj_t * obj, const void * symbol); - -/** - * Set whether the selected option in the list should be highlighted or not - * @param obj pointer to drop-down list object - * @param en true: highlight enabled; false: disabled - */ -void lv_dropdown_set_selected_highlight(lv_obj_t * obj, bool en); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the list of a drop-down to allow styling or other modifications - * @param obj pointer to a drop-down list object - * @return pointer to the list of the drop-down - */ -lv_obj_t * lv_dropdown_get_list(lv_obj_t * obj); - -/** - * Get text of the drop-down list's button. - * @param obj pointer to a drop-down list object - * @return the text as string, `NULL` if no text - */ -const char * lv_dropdown_get_text(lv_obj_t * obj); - -/** - * Get the options of a drop-down list - * @param obj pointer to drop-down list object - * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") - */ -const char * lv_dropdown_get_options(const lv_obj_t * obj); - -/** - * Get the index of the selected option - * @param obj pointer to drop-down list object - * @return index of the selected option (0 ... number of option - 1); - */ -uint32_t lv_dropdown_get_selected(const lv_obj_t * obj); - -/** - * Get the total number of options - * @param obj pointer to drop-down list object - * @return the total number of options in the list - */ -uint32_t lv_dropdown_get_option_count(const lv_obj_t * obj); - -/** - * Get the current selected option as a string - * @param obj pointer to drop-down object - * @param buf pointer to an array to store the string - * @param buf_size size of `buf` in bytes. 0: to ignore it. - */ -void lv_dropdown_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size); - -/** - * Get the index of an option. - * @param obj pointer to drop-down object - * @param option an option as string - * @return index of `option` in the list of all options. -1 if not found. - */ -int32_t lv_dropdown_get_option_index(lv_obj_t * obj, const char * option); - -/** - * Get the symbol on the drop-down list. Typically a down caret or arrow. - * @param obj pointer to drop-down list object - * @return the symbol or NULL if not enabled - */ -const char * lv_dropdown_get_symbol(lv_obj_t * obj); - -/** - * Get whether the selected option in the list should be highlighted or not - * @param obj pointer to drop-down list object - * @return true: highlight enabled; false: disabled - */ -bool lv_dropdown_get_selected_highlight(lv_obj_t * obj); - -/** - * Get the direction of the drop-down list - * @param obj pointer to a drop-down list object - * @return LV_DIR_LEF/RIGHT/TOP/BOTTOM - */ -lv_dir_t lv_dropdown_get_dir(const lv_obj_t * obj); - -/*===================== - * Other functions - *====================*/ - -/** - * Open the drop.down list - * @param dropdown_obj pointer to drop-down list object - */ -void lv_dropdown_open(lv_obj_t * dropdown_obj); - -/** - * Close (Collapse) the drop-down list - * @param obj pointer to drop-down list object - */ -void lv_dropdown_close(lv_obj_t * obj); - -/** - * Tells whether the list is opened or not - * @param obj pointer to a drop-down list object - * @return true if the list os opened - */ -bool lv_dropdown_is_open(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DROPDOWN*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DROPDOWN_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/dropdown/lv_dropdown_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/dropdown/lv_dropdown_private.h deleted file mode 100644 index 67d879a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/dropdown/lv_dropdown_private.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - * @file lv_dropdown_private.h - * - */ - -#ifndef LV_DROPDOWN_PRIVATE_H -#define LV_DROPDOWN_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_dropdown.h" - -#if LV_USE_DROPDOWN != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_dropdown_t { - lv_obj_t obj; - lv_obj_t * list; /**< The dropped down list*/ - const char * text; /**< Text to display on the dropdown's button*/ - const void * symbol; /**< Arrow or other icon when the drop-down list is closed*/ - char * options; /**< Options in a '\n' separated list*/ - uint32_t option_cnt; /**< Number of options*/ - uint32_t sel_opt_id; /**< Index of the currently selected option*/ - uint32_t sel_opt_id_orig; /**< Store the original index on focus*/ - uint32_t pr_opt_id; /**< Index of the currently pressed option*/ - uint8_t dir : 4; /**< Direction in which the list should open*/ - uint8_t static_txt : 1; /**< 1: Only a pointer is saved in `options`*/ - uint8_t selected_highlight: 1; /**< 1: Make the selected option highlighted in the list*/ -}; - -struct lv_dropdown_list_t { - lv_obj_t obj; - lv_obj_t * dropdown; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_DROPDOWN != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DROPDOWN_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/image/lv_image.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/image/lv_image.c deleted file mode 100644 index 5fdcc12..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/image/lv_image.c +++ /dev/null @@ -1,885 +0,0 @@ -/** - * @file lv_img.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_image_private.h" -#include "../../misc/lv_area_private.h" -#include "../../draw/lv_draw_image_private.h" -#include "../../draw/lv_draw_private.h" -#include "../../core/lv_obj_event_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_IMAGE != 0 - -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_image_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_image_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_image_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_image_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void draw_image(lv_event_t * e); -static void scale_update(lv_obj_t * obj, int32_t scale_x, int32_t scale_y); -static void update_align(lv_obj_t * obj); -#if LV_USE_OBJ_PROPERTY - static void lv_image_set_pivot_helper(lv_obj_t * obj, lv_point_t * pivot); - static lv_point_t lv_image_get_pivot_helper(lv_obj_t * obj); -#endif - -#if LV_USE_OBJ_PROPERTY -static const lv_property_ops_t properties[] = { - { - .id = LV_PROPERTY_IMAGE_SRC, - .setter = lv_image_set_src, - .getter = lv_image_get_src, - }, - { - .id = LV_PROPERTY_IMAGE_OFFSET_X, - .setter = lv_image_set_offset_x, - .getter = lv_image_get_offset_x, - }, - { - .id = LV_PROPERTY_IMAGE_OFFSET_Y, - .setter = lv_image_set_offset_y, - .getter = lv_image_get_offset_y, - }, - { - .id = LV_PROPERTY_IMAGE_ROTATION, - .setter = lv_image_set_rotation, - .getter = lv_image_get_rotation, - }, - { - .id = LV_PROPERTY_IMAGE_PIVOT, - .setter = lv_image_set_pivot_helper, - .getter = lv_image_get_pivot_helper, - }, - { - .id = LV_PROPERTY_IMAGE_SCALE, - .setter = lv_image_set_scale, - .getter = lv_image_get_scale, - }, - { - .id = LV_PROPERTY_IMAGE_SCALE_X, - .setter = lv_image_set_scale_x, - .getter = lv_image_get_scale_x, - }, - { - .id = LV_PROPERTY_IMAGE_SCALE_Y, - .setter = lv_image_set_scale_y, - .getter = lv_image_get_scale_y, - }, - { - .id = LV_PROPERTY_IMAGE_BLEND_MODE, - .setter = lv_image_set_blend_mode, - .getter = lv_image_get_blend_mode, - }, - { - .id = LV_PROPERTY_IMAGE_ANTIALIAS, - .setter = lv_image_set_antialias, - .getter = lv_image_get_antialias, - }, - { - .id = LV_PROPERTY_IMAGE_INNER_ALIGN, - .setter = lv_image_set_inner_align, - .getter = lv_image_get_inner_align, - }, -}; -#endif - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_image_class = { - .constructor_cb = lv_image_constructor, - .destructor_cb = lv_image_destructor, - .event_cb = lv_image_event, - .width_def = LV_SIZE_CONTENT, - .height_def = LV_SIZE_CONTENT, - .instance_size = sizeof(lv_image_t), - .base_class = &lv_obj_class, - .name = "image", -#if LV_USE_OBJ_PROPERTY - .prop_index_start = LV_PROPERTY_IMAGE_START, - .prop_index_end = LV_PROPERTY_IMAGE_END, - .properties = properties, - .properties_count = sizeof(properties) / sizeof(properties[0]), - -#if LV_USE_OBJ_PROPERTY_NAME - .property_names = lv_image_property_names, - .names_count = sizeof(lv_image_property_names) / sizeof(lv_property_name_t), -#endif - -#endif -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_image_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_image_set_src(lv_obj_t * obj, const void * src) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_invalidate(obj); - - lv_image_src_t src_type = lv_image_src_get_type(src); - lv_image_t * img = (lv_image_t *)obj; - -#if LV_USE_LOG && LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO - switch(src_type) { - case LV_IMAGE_SRC_FILE: - LV_LOG_TRACE("`LV_IMAGE_SRC_FILE` type found"); - break; - case LV_IMAGE_SRC_VARIABLE: - LV_LOG_TRACE("`LV_IMAGE_SRC_VARIABLE` type found"); - break; - case LV_IMAGE_SRC_SYMBOL: - LV_LOG_TRACE("`LV_IMAGE_SRC_SYMBOL` type found"); - break; - default: - LV_LOG_WARN("unknown type"); - } -#endif - - /*If the new source type is unknown free the memories of the old source*/ - if(src_type == LV_IMAGE_SRC_UNKNOWN) { - LV_LOG_WARN("unknown image type"); - if(img->src_type == LV_IMAGE_SRC_SYMBOL || img->src_type == LV_IMAGE_SRC_FILE) { - lv_free((void *)img->src); - } - img->src = NULL; - img->src_type = LV_IMAGE_SRC_UNKNOWN; - return; - } - - lv_image_header_t header; - lv_result_t res = lv_image_decoder_get_info(src, &header); - if(res != LV_RESULT_OK) { -#if LV_USE_LOG - char buf[24]; - LV_LOG_WARN("failed to get image info: %s", - src_type == LV_IMAGE_SRC_FILE ? (const char *)src : (lv_snprintf(buf, sizeof(buf), "%p", src), buf)); -#endif /*LV_USE_LOG*/ - return; - } - - /*Save the source*/ - if(src_type == LV_IMAGE_SRC_VARIABLE) { - /*If memory was allocated because of the previous `src_type` then free it*/ - if(img->src_type == LV_IMAGE_SRC_FILE || img->src_type == LV_IMAGE_SRC_SYMBOL) { - lv_free((void *)img->src); - } - img->src = src; - } - else if(src_type == LV_IMAGE_SRC_FILE || src_type == LV_IMAGE_SRC_SYMBOL) { - /*If the new and the old src are the same then it was only a refresh.*/ - if(img->src != src) { - const void * old_src = NULL; - /*If memory was allocated because of the previous `src_type` then save its pointer and free after allocation. - *It's important to allocate first to be sure the new data will be on a new address. - *Else `img_cache` wouldn't see the change in source.*/ - if(img->src_type == LV_IMAGE_SRC_FILE || img->src_type == LV_IMAGE_SRC_SYMBOL) { - old_src = img->src; - } - char * new_str = lv_strdup(src); - LV_ASSERT_MALLOC(new_str); - if(new_str == NULL) return; - img->src = new_str; - - if(old_src) lv_free((void *)old_src); - } - } - - if(src_type == LV_IMAGE_SRC_SYMBOL) { - /*`lv_image_dsc_get_info` couldn't set the width and height of a font so set it here*/ - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - lv_point_t size; - lv_text_get_size(&size, src, font, letter_space, line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); - header.w = size.x; - header.h = size.y; - } - - img->src_type = src_type; - img->w = header.w; - img->h = header.h; - img->cf = header.cf; - - lv_obj_refresh_self_size(obj); - - update_align(obj); - - /*Provide enough room for the rotated corners*/ - if(img->rotation || img->scale_x != LV_SCALE_NONE || img->scale_y != LV_SCALE_NONE) { - lv_obj_refresh_ext_draw_size(obj); - } - - lv_obj_invalidate(obj); -} - -void lv_image_set_offset_x(lv_obj_t * obj, int32_t x) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - img->offset.x = x; - lv_obj_invalidate(obj); -} - -void lv_image_set_offset_y(lv_obj_t * obj, int32_t y) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - img->offset.y = y; - lv_obj_invalidate(obj); -} - -void lv_image_set_rotation(lv_obj_t * obj, int32_t angle) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - if(img->align > LV_IMAGE_ALIGN_AUTO_TRANSFORM) { - angle = 0; - } - else { - while(angle >= 3600) angle -= 3600; - while(angle < 0) angle += 3600; - } - - if((uint32_t)angle == img->rotation) return; - - lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/ - int32_t w = lv_obj_get_width(obj); - int32_t h = lv_obj_get_height(obj); - lv_area_t a; - lv_point_t pivot_px; - lv_image_get_pivot(obj, &pivot_px); - lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); - a.x1 += obj->coords.x1; - a.y1 += obj->coords.y1; - a.x2 += obj->coords.x1; - a.y2 += obj->coords.y1; - lv_obj_invalidate_area(obj, &a); - - img->rotation = angle; - - /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate - * the whole ext draw area */ - lv_display_t * disp = lv_obj_get_display(obj); - lv_display_enable_invalidation(disp, false); - lv_obj_refresh_ext_draw_size(obj); - lv_display_enable_invalidation(disp, true); - - lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); - a.x1 += obj->coords.x1; - a.y1 += obj->coords.y1; - a.x2 += obj->coords.x1; - a.y2 += obj->coords.y1; - lv_obj_invalidate_area(obj, &a); -} - -void lv_image_set_pivot(lv_obj_t * obj, int32_t x, int32_t y) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - if(img->align > LV_IMAGE_ALIGN_AUTO_TRANSFORM) { - x = 0; - y = 0; - } - - if(img->pivot.x == x && img->pivot.y == y) return; - - lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/ - int32_t w = lv_obj_get_width(obj); - int32_t h = lv_obj_get_height(obj); - lv_area_t a; - lv_point_t pivot_px; - lv_image_get_pivot(obj, &pivot_px); - lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); - a.x1 += obj->coords.x1; - a.y1 += obj->coords.y1; - a.x2 += obj->coords.x1; - a.y2 += obj->coords.y1; - lv_obj_invalidate_area(obj, &a); - - lv_point_set(&img->pivot, x, y); - - /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate - * the whole ext draw area */ - lv_display_t * disp = lv_obj_get_display(obj); - lv_display_enable_invalidation(disp, false); - lv_obj_refresh_ext_draw_size(obj); - lv_display_enable_invalidation(disp, true); - - lv_image_get_pivot(obj, &pivot_px); - lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); - a.x1 += obj->coords.x1; - a.y1 += obj->coords.y1; - a.x2 += obj->coords.x1; - a.y2 += obj->coords.y1; - lv_obj_invalidate_area(obj, &a); -} - -void lv_image_set_scale(lv_obj_t * obj, uint32_t zoom) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - /*If scale is set internally, do no overwrite it*/ - if(img->align > LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; - - if(zoom == img->scale_x && zoom == img->scale_y) return; - - if(zoom == 0) zoom = 1; - - scale_update(obj, zoom, zoom); -} - -void lv_image_set_scale_x(lv_obj_t * obj, uint32_t zoom) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - /*If scale is set internally, do no overwrite it*/ - if(img->align > LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; - - if(zoom == img->scale_x) return; - - if(zoom == 0) zoom = 1; - - scale_update(obj, zoom, img->scale_y); -} - -void lv_image_set_scale_y(lv_obj_t * obj, uint32_t zoom) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - /*If scale is set internally, do no overwrite it*/ - if(img->align > LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; - - if(zoom == img->scale_y) return; - - if(zoom == 0) zoom = 1; - - scale_update(obj, img->scale_x, zoom); -} - -void lv_image_set_blend_mode(lv_obj_t * obj, lv_blend_mode_t blend_mode) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - /*If scale is set internally, do no overwrite it*/ - if(img->blend_mode == blend_mode) return; - - img->blend_mode = blend_mode; - - lv_obj_invalidate(obj); -} - -void lv_image_set_antialias(lv_obj_t * obj, bool antialias) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - if(antialias == img->antialias) return; - - img->antialias = antialias; - lv_obj_invalidate(obj); -} - -void lv_image_set_inner_align(lv_obj_t * obj, lv_image_align_t align) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - if(align == img->align) return; - - /*If we're removing STRETCH, reset the scale*/ - if(img->align == LV_IMAGE_ALIGN_STRETCH) { - lv_image_set_scale(obj, LV_SCALE_NONE); - } - - img->align = align; - update_align(obj); - - lv_obj_invalidate(obj); -} - -void lv_image_set_bitmap_map_src(lv_obj_t * obj, const lv_image_dsc_t * src) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_image_t * img = (lv_image_t *)obj; - img->bitmap_mask_src = src; - lv_obj_invalidate(obj); -} - -/*===================== - * Getter functions - *====================*/ - -const void * lv_image_get_src(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - return img->src; -} - -int32_t lv_image_get_offset_x(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - return img->offset.x; -} - -int32_t lv_image_get_offset_y(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - return img->offset.y; -} - -int32_t lv_image_get_rotation(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - return img->rotation; -} - -void lv_image_get_pivot(lv_obj_t * obj, lv_point_t * pivot) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - pivot->x = lv_pct_to_px(img->pivot.x, img->w); - pivot->y = lv_pct_to_px(img->pivot.y, img->h); -} - -int32_t lv_image_get_scale(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - return img->scale_x; -} - -int32_t lv_image_get_scale_x(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - return img->scale_x; -} - -int32_t lv_image_get_scale_y(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - return img->scale_y; -} - -lv_blend_mode_t lv_image_get_blend_mode(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - return img->blend_mode; -} - -bool lv_image_get_antialias(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - return img->antialias ? true : false; -} - -lv_image_align_t lv_image_get_inner_align(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - return img->align; -} - -const lv_image_dsc_t * lv_image_get_bitmap_map_src(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_image_t * img = (lv_image_t *)obj; - - return img->bitmap_mask_src; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_image_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_image_t * img = (lv_image_t *)obj; - - img->src = NULL; - img->src_type = LV_IMAGE_SRC_UNKNOWN; - img->cf = LV_COLOR_FORMAT_UNKNOWN; - img->w = lv_obj_get_width(obj); - img->h = lv_obj_get_height(obj); - img->rotation = 0; - img->scale_x = LV_SCALE_NONE; - img->scale_y = LV_SCALE_NONE; - img->antialias = LV_COLOR_DEPTH > 8 ? 1 : 0; - lv_point_set(&img->offset, 0, 0); - lv_point_set(&img->pivot, LV_PCT(50), LV_PCT(50)); /*Default pivot to image center*/ - img->align = LV_IMAGE_ALIGN_CENTER; - - lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); - lv_obj_add_flag(obj, LV_OBJ_FLAG_ADV_HITTEST); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_image_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_image_t * img = (lv_image_t *)obj; - if(img->src_type == LV_IMAGE_SRC_FILE || img->src_type == LV_IMAGE_SRC_SYMBOL) { - lv_free((void *)img->src); - img->src = NULL; - img->src_type = LV_IMAGE_SRC_UNKNOWN; - } -} - -static void lv_image_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_event_code_t code = lv_event_get_code(e); - - /*Call the ancestor's event handler*/ - lv_result_t res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - lv_obj_t * obj = lv_event_get_current_target(e); - lv_image_t * img = (lv_image_t *)obj; - lv_point_t pivot_px; - lv_image_get_pivot(obj, &pivot_px); - - if(code == LV_EVENT_STYLE_CHANGED) { - /*Refresh the file name to refresh the symbol text size*/ - if(img->src_type == LV_IMAGE_SRC_SYMBOL) { - lv_image_set_src(obj, img->src); - } - else { - /*With transformation it might change*/ - lv_obj_refresh_ext_draw_size(obj); - } - } - else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - - int32_t * s = lv_event_get_param(e); - - /*If the image has angle provide enough room for the rotated corners*/ - if(img->rotation || img->scale_x != LV_SCALE_NONE || img->scale_y != LV_SCALE_NONE) { - lv_area_t a; - int32_t w = lv_obj_get_width(obj); - int32_t h = lv_obj_get_height(obj); - lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); - *s = LV_MAX(*s, -a.x1); - *s = LV_MAX(*s, -a.y1); - *s = LV_MAX(*s, a.x2 - w); - *s = LV_MAX(*s, a.y2 - h); - } - } - else if(code == LV_EVENT_HIT_TEST) { - lv_hit_test_info_t * info = lv_event_get_param(e); - - /*If the object is exactly image sized (not cropped, not mosaic) and transformed - *perform hit test on its transformed area*/ - if(img->w == lv_obj_get_width(obj) && img->h == lv_obj_get_height(obj) && - (img->scale_x != LV_SCALE_NONE || img->scale_y != LV_SCALE_NONE || - img->rotation != 0 || img->pivot.x != img->w / 2 || img->pivot.y != img->h / 2)) { - - int32_t w = lv_obj_get_width(obj); - int32_t h = lv_obj_get_height(obj); - lv_area_t coords; - lv_image_buf_get_transformed_area(&coords, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); - coords.x1 += obj->coords.x1; - coords.y1 += obj->coords.y1; - coords.x2 += obj->coords.x1; - coords.y2 += obj->coords.y1; - - info->res = lv_area_is_point_on(&coords, info->point, 0); - } - else { - lv_area_t a; - lv_obj_get_click_area(obj, &a); - info->res = lv_area_is_point_on(&a, info->point, 0); - } - } - else if(code == LV_EVENT_GET_SELF_SIZE) { - lv_point_t * p = lv_event_get_param(e); - p->x = img->w; - p->y = img->h; - } - else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST || code == LV_EVENT_COVER_CHECK) { - draw_image(e); - } -} - -static void draw_image(lv_event_t * e) -{ - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - lv_image_t * img = (lv_image_t *)obj; - if(code == LV_EVENT_COVER_CHECK) { - lv_cover_check_info_t * info = lv_event_get_param(e); - if(info->res == LV_COVER_RES_MASKED) return; - if(img->src_type == LV_IMAGE_SRC_UNKNOWN || img->src_type == LV_IMAGE_SRC_SYMBOL) { - info->res = LV_COVER_RES_NOT_COVER; - return; - } - - /*Non true color format might have "holes"*/ - if(lv_color_format_has_alpha(img->cf)) { - info->res = LV_COVER_RES_NOT_COVER; - return; - } - - /*With not LV_OPA_COVER images can't cover an area */ - if(lv_obj_get_style_image_opa(obj, LV_PART_MAIN) != LV_OPA_COVER) { - info->res = LV_COVER_RES_NOT_COVER; - return; - } - - if(img->rotation != 0) { - info->res = LV_COVER_RES_NOT_COVER; - return; - } - - if(img->scale_x == LV_SCALE_NONE && img->scale_y == LV_SCALE_NONE) { - if(lv_area_is_in(info->area, &obj->coords, 0) == false) { - info->res = LV_COVER_RES_NOT_COVER; - return; - } - } - else { - lv_area_t a; - lv_point_t pivot_px; - lv_image_get_pivot(obj, &pivot_px); - lv_image_buf_get_transformed_area(&a, lv_obj_get_width(obj), lv_obj_get_height(obj), 0, img->scale_x, img->scale_y, - &pivot_px); - a.x1 += obj->coords.x1; - a.y1 += obj->coords.y1; - a.x2 += obj->coords.x1; - a.y2 += obj->coords.y1; - - if(lv_area_is_in(info->area, &a, 0) == false) { - info->res = LV_COVER_RES_NOT_COVER; - return; - } - } - if(img->bitmap_mask_src) { - info->res = LV_COVER_RES_NOT_COVER; - return; - } - } - else if(code == LV_EVENT_DRAW_MAIN) { - - if(img->h == 0 || img->w == 0) return; - if(img->scale_x == 0 || img->scale_y == 0) return; - - lv_layer_t * layer = lv_event_get_layer(e); - - if(img->src_type == LV_IMAGE_SRC_FILE || img->src_type == LV_IMAGE_SRC_VARIABLE) { - lv_draw_image_dsc_t draw_dsc; - lv_draw_image_dsc_init(&draw_dsc); - lv_obj_init_draw_image_dsc(obj, LV_PART_MAIN, &draw_dsc); - - lv_area_t clip_area_ori = layer->_clip_area; - - lv_image_get_pivot(obj, &draw_dsc.pivot); - draw_dsc.scale_x = img->scale_x; - draw_dsc.scale_y = img->scale_y; - draw_dsc.rotation = img->rotation; - draw_dsc.antialias = img->antialias; - draw_dsc.blend_mode = img->blend_mode; - draw_dsc.bitmap_mask_src = img->bitmap_mask_src; - draw_dsc.src = img->src; - - lv_area_set(&draw_dsc.image_area, obj->coords.x1, - obj->coords.y1, - obj->coords.x1 + img->w - 1, - obj->coords.y1 + img->h - 1); - - draw_dsc.clip_radius = lv_obj_get_style_radius(obj, LV_PART_MAIN); - - lv_area_t coords; - if(img->align < LV_IMAGE_ALIGN_AUTO_TRANSFORM) { - lv_area_align(&obj->coords, &draw_dsc.image_area, img->align, img->offset.x, img->offset.y); - coords = draw_dsc.image_area; - } - else if(img->align == LV_IMAGE_ALIGN_TILE) { - lv_area_intersect(&layer->_clip_area, &layer->_clip_area, &obj->coords); - lv_area_move(&draw_dsc.image_area, img->offset.x, img->offset.y); - - lv_area_move(&draw_dsc.image_area, - ((layer->_clip_area.x1 - draw_dsc.image_area.x1 - (img->w - 1)) / img->w) * img->w, - ((layer->_clip_area.y1 - draw_dsc.image_area.y1 - (img->h - 1)) / img->h) * img->h); - coords = layer->_clip_area; - draw_dsc.tile = 1; - } - else { - coords = draw_dsc.image_area; - } - - lv_draw_image(layer, &draw_dsc, &coords); - layer->_clip_area = clip_area_ori; - - } - else if(img->src_type == LV_IMAGE_SRC_SYMBOL) { - lv_draw_label_dsc_t label_dsc; - lv_draw_label_dsc_init(&label_dsc); - lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_dsc); - label_dsc.text = img->src; - lv_draw_label(layer, &label_dsc, &obj->coords); - } - else if(img->src == NULL) { - /*Do not need to draw image when src is NULL*/ - LV_LOG_WARN("image source is NULL"); - } - else { - /*Trigger the error handler of image draw*/ - LV_LOG_WARN("image source type is unknown"); - } - } -} - -static void scale_update(lv_obj_t * obj, int32_t scale_x, int32_t scale_y) -{ - lv_image_t * img = (lv_image_t *)obj; - - lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/ - int32_t w = lv_obj_get_width(obj); - int32_t h = lv_obj_get_height(obj); - lv_area_t a; - lv_point_t pivot_px; - lv_image_get_pivot(obj, &pivot_px); - lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); - a.x1 += obj->coords.x1 - 1; - a.y1 += obj->coords.y1 - 1; - a.x2 += obj->coords.x1 + 1; - a.y2 += obj->coords.y1 + 1; - lv_obj_invalidate_area(obj, &a); - - img->scale_x = scale_x; - img->scale_y = scale_y; - - /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate - * the whole ext draw area */ - lv_display_t * disp = lv_obj_get_display(obj); - lv_display_enable_invalidation(disp, false); - lv_obj_refresh_ext_draw_size(obj); - lv_display_enable_invalidation(disp, true); - - lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); - a.x1 += obj->coords.x1 - 1; - a.y1 += obj->coords.y1 - 1; - a.x2 += obj->coords.x1 + 1; - a.y2 += obj->coords.y1 + 1; - lv_obj_invalidate_area(obj, &a); -} - -static void update_align(lv_obj_t * obj) -{ - lv_image_t * img = (lv_image_t *)obj; - if(img->align == LV_IMAGE_ALIGN_STRETCH) { - lv_image_set_rotation(obj, 0); - lv_image_set_pivot(obj, 0, 0); - if(img->w != 0 && img->h != 0) { - int32_t scale_x = lv_obj_get_width(obj) * LV_SCALE_NONE / img->w; - int32_t scale_y = lv_obj_get_height(obj) * LV_SCALE_NONE / img->h; - scale_update(obj, scale_x, scale_y); - } - } - else if(img->align == LV_IMAGE_ALIGN_TILE) { - lv_image_set_rotation(obj, 0); - lv_image_set_pivot(obj, 0, 0); - scale_update(obj, LV_SCALE_NONE, LV_SCALE_NONE); - - } -} - -#if LV_USE_OBJ_PROPERTY -static void lv_image_set_pivot_helper(lv_obj_t * obj, lv_point_t * pivot) -{ - lv_image_set_pivot(obj, pivot->x, pivot->y); -} - -static lv_point_t lv_image_get_pivot_helper(lv_obj_t * obj) -{ - lv_point_t pivot; - lv_image_get_pivot(obj, &pivot); - return pivot; -} -#endif - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/image/lv_image.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/image/lv_image.h deleted file mode 100644 index abc5217..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/image/lv_image.h +++ /dev/null @@ -1,310 +0,0 @@ -/** - * @file lv_image.h - * - */ - -#ifndef LV_IMAGE_H -#define LV_IMAGE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -#if LV_USE_IMAGE != 0 - -/*Testing of dependencies*/ -#if LV_USE_LABEL == 0 -#error "lv_img: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" -#endif - -#include "../../core/lv_obj.h" -#include "../../misc/lv_fs.h" -#include "../../draw/lv_draw.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_image_class; - -/** - * Image size mode, when image size and object size is different - */ -typedef enum { - LV_IMAGE_ALIGN_DEFAULT = 0, - LV_IMAGE_ALIGN_TOP_LEFT, - LV_IMAGE_ALIGN_TOP_MID, - LV_IMAGE_ALIGN_TOP_RIGHT, - LV_IMAGE_ALIGN_BOTTOM_LEFT, - LV_IMAGE_ALIGN_BOTTOM_MID, - LV_IMAGE_ALIGN_BOTTOM_RIGHT, - LV_IMAGE_ALIGN_LEFT_MID, - LV_IMAGE_ALIGN_RIGHT_MID, - LV_IMAGE_ALIGN_CENTER, - LV_IMAGE_ALIGN_AUTO_TRANSFORM, - LV_IMAGE_ALIGN_STRETCH, - LV_IMAGE_ALIGN_TILE, -} lv_image_align_t; - -#if LV_USE_OBJ_PROPERTY -enum { - LV_PROPERTY_ID(IMAGE, SRC, LV_PROPERTY_TYPE_IMGSRC, 0), - LV_PROPERTY_ID(IMAGE, OFFSET_X, LV_PROPERTY_TYPE_INT, 1), - LV_PROPERTY_ID(IMAGE, OFFSET_Y, LV_PROPERTY_TYPE_INT, 2), - LV_PROPERTY_ID(IMAGE, ROTATION, LV_PROPERTY_TYPE_INT, 3), - LV_PROPERTY_ID(IMAGE, PIVOT, LV_PROPERTY_TYPE_POINT, 4), - LV_PROPERTY_ID(IMAGE, SCALE, LV_PROPERTY_TYPE_INT, 5), - LV_PROPERTY_ID(IMAGE, SCALE_X, LV_PROPERTY_TYPE_INT, 6), - LV_PROPERTY_ID(IMAGE, SCALE_Y, LV_PROPERTY_TYPE_INT, 7), - LV_PROPERTY_ID(IMAGE, BLEND_MODE, LV_PROPERTY_TYPE_INT, 8), - LV_PROPERTY_ID(IMAGE, ANTIALIAS, LV_PROPERTY_TYPE_INT, 9), - LV_PROPERTY_ID(IMAGE, INNER_ALIGN, LV_PROPERTY_TYPE_INT, 10), - LV_PROPERTY_IMAGE_END, -}; -#endif - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an image object - * @param parent pointer to an object, it will be the parent of the new image - * @return pointer to the created image - */ -lv_obj_t * lv_image_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the image data to display on the object - * @param obj pointer to an image object - * @param src 1) pointer to an ::lv_image_dsc_t descriptor (converted by LVGL's image converter) (e.g. &my_img) or - * 2) path to an image file (e.g. "S:/dir/img.bin")or - * 3) a SYMBOL (e.g. LV_SYMBOL_OK) - */ -void lv_image_set_src(lv_obj_t * obj, const void * src); - -/** - * Set an offset for the source of an image so the image will be displayed from the new origin. - * @param obj pointer to an image - * @param x the new offset along x axis. - */ -void lv_image_set_offset_x(lv_obj_t * obj, int32_t x); - -/** - * Set an offset for the source of an image. - * so the image will be displayed from the new origin. - * @param obj pointer to an image - * @param y the new offset along y axis. - */ -void lv_image_set_offset_y(lv_obj_t * obj, int32_t y); - -/** - * Set the rotation angle of the image. - * The image will be rotated around the set pivot set by `lv_image_set_pivot()` - * Note that indexed and alpha only images can't be transformed. - * @param obj pointer to an image object - * @param angle rotation in degree with 0.1 degree resolution (0..3600: clock wise) - * @note if image_align is `LV_IMAGE_ALIGN_STRETCH` or `LV_IMAGE_ALIGN_FIT` - * rotation will be set to 0 automatically. - * - */ -void lv_image_set_rotation(lv_obj_t * obj, int32_t angle); - -/** - * Set the rotation center of the image. - * The image will be rotated around this point. - * x, y can be set with value of LV_PCT, lv_image_get_pivot will return the true pixel coordinate of pivot in this case. - * @param obj pointer to an image object - * @param x rotation center x of the image - * @param y rotation center y of the image - */ -void lv_image_set_pivot(lv_obj_t * obj, int32_t x, int32_t y); - -/** - * Set the zoom factor of the image. - * Note that indexed and alpha only images can't be transformed. - * @param obj pointer to an image object - * @param zoom the zoom factor. Example values: - * - 256 or LV_ZOOM_IMAGE_NONE: no zoom - * - <256: scale down - * - >256: scale up - * - 128: half size - * - 512: double size - */ -void lv_image_set_scale(lv_obj_t * obj, uint32_t zoom); - -/** - * Set the horizontal zoom factor of the image. - * Note that indexed and alpha only images can't be transformed. - * @param obj pointer to an image object - * @param zoom the zoom factor. Example values: - * - 256 or LV_ZOOM_IMAGE_NONE: no zoom - * - <256: scale down - * - >256: scale up - * - 128: half size - * - 512: double size - */ -void lv_image_set_scale_x(lv_obj_t * obj, uint32_t zoom); - -/** - * Set the vertical zoom factor of the image. - * Note that indexed and alpha only images can't be transformed. - * @param obj pointer to an image object - * @param zoom the zoom factor. Example values: - * - 256 or LV_ZOOM_IMAGE_NONE: no zoom - * - <256: scale down - * - >256: scale up - * - 128: half size - * - 512: double size - */ -void lv_image_set_scale_y(lv_obj_t * obj, uint32_t zoom); - -/** - * Set the blend mode of an image. - * @param obj pointer to an image object - * @param blend_mode the new blend mode - */ -void lv_image_set_blend_mode(lv_obj_t * obj, lv_blend_mode_t blend_mode); - -/** - * Enable/disable anti-aliasing for the transformations (rotate, zoom) or not. - * The quality is better with anti-aliasing looks better but slower. - * @param obj pointer to an image object - * @param antialias true: anti-aliased; false: not anti-aliased - */ -void lv_image_set_antialias(lv_obj_t * obj, bool antialias); - -/** - * Set the image object size mode. - * @param obj pointer to an image object - * @param align the new align mode. - * @note if image_align is `LV_IMAGE_ALIGN_STRETCH` or `LV_IMAGE_ALIGN_FIT` - * rotation, scale and pivot will be overwritten and controlled internally. - */ -void lv_image_set_inner_align(lv_obj_t * obj, lv_image_align_t align); - -/** - * Set an A8 bitmap mask for the image. - * @param obj pointer to an image object - * @param src an lv_image_dsc_t bitmap mask source. - */ -void lv_image_set_bitmap_map_src(lv_obj_t * obj, const lv_image_dsc_t * src); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the source of the image - * @param obj pointer to an image object - * @return the image source (symbol, file name or ::lv-img_dsc_t for C arrays) - */ -const void * lv_image_get_src(lv_obj_t * obj); - -/** - * Get the offset's x attribute of the image object. - * @param obj pointer to an image - * @return offset X value. - */ -int32_t lv_image_get_offset_x(lv_obj_t * obj); - -/** - * Get the offset's y attribute of the image object. - * @param obj pointer to an image - * @return offset Y value. - */ -int32_t lv_image_get_offset_y(lv_obj_t * obj); - -/** - * Get the rotation of the image. - * @param obj pointer to an image object - * @return rotation in 0.1 degrees (0..3600) - * @note if image_align is `LV_IMAGE_ALIGN_STRETCH` or `LV_IMAGE_ALIGN_FIT` - * rotation will be set to 0 automatically. - */ -int32_t lv_image_get_rotation(lv_obj_t * obj); - -/** - * Get the pivot (rotation center) of the image. - * If pivot is set with LV_PCT, convert it to px before return. - * @param obj pointer to an image object - * @param pivot store the rotation center here - */ -void lv_image_get_pivot(lv_obj_t * obj, lv_point_t * pivot); - -/** - * Get the zoom factor of the image. - * @param obj pointer to an image object - * @return zoom factor (256: no zoom) - */ -int32_t lv_image_get_scale(lv_obj_t * obj); - -/** - * Get the horizontal zoom factor of the image. - * @param obj pointer to an image object - * @return zoom factor (256: no zoom) - */ -int32_t lv_image_get_scale_x(lv_obj_t * obj); - -/** - * Get the vertical zoom factor of the image. - * @param obj pointer to an image object - * @return zoom factor (256: no zoom) - */ -int32_t lv_image_get_scale_y(lv_obj_t * obj); - -/** - * Get the current blend mode of the image - * @param obj pointer to an image object - * @return the current blend mode - */ -lv_blend_mode_t lv_image_get_blend_mode(lv_obj_t * obj); - -/** - * Get whether the transformations (rotate, zoom) are anti-aliased or not - * @param obj pointer to an image object - * @return true: anti-aliased; false: not anti-aliased - */ -bool lv_image_get_antialias(lv_obj_t * obj); - -/** - * Get the size mode of the image - * @param obj pointer to an image object - * @return element of `lv_image_align_t` - */ -lv_image_align_t lv_image_get_inner_align(lv_obj_t * obj); - -/** - * Get the bitmap mask source. - * @param obj pointer to an image object - * @return an lv_image_dsc_t bitmap mask source. - */ -const lv_image_dsc_t * lv_image_get_bitmap_map_src(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -/** Use this macro to declare an image in a C file*/ -#define LV_IMAGE_DECLARE(var_name) extern const lv_image_dsc_t var_name - -#endif /*LV_USE_IMAGE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_IMAGE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/image/lv_image_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/image/lv_image_private.h deleted file mode 100644 index e880f5d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/image/lv_image_private.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @file lv_image_private.h - * - */ - -#ifndef LV_IMAGE_PRIVATE_H -#define LV_IMAGE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_image.h" - -#if LV_USE_IMAGE != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Data of image - */ -struct lv_image_t { - lv_obj_t obj; - const void * src; /**< Image source: Pointer to an array or a file or a symbol*/ - const lv_image_dsc_t * bitmap_mask_src; /**< Pointer to an A8 bitmap mask */ - lv_point_t offset; - int32_t w; /**< Width of the image (Handled by the library)*/ - int32_t h; /**< Height of the image (Handled by the library)*/ - uint32_t rotation; /**< Rotation angle of the image*/ - uint32_t scale_x; /**< 256 means no zoom, 512 double size, 128 half size*/ - uint32_t scale_y; /**< 256 means no zoom, 512 double size, 128 half size*/ - lv_point_t pivot; /**< Rotation center of the image*/ - uint32_t src_type : 2; /**< See: lv_image_src_t*/ - uint32_t cf : 5; /**< Color format from `lv_color_format_t`*/ - uint32_t antialias : 1; /**< Apply anti-aliasing in transformations (rotate, zoom)*/ - uint32_t align: 4; /**< Image size mode when image size and object size is different. See lv_image_align_t*/ - uint32_t blend_mode: 4; /**< Element of `lv_blend_mode_t`*/ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_IMAGE != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_IMAGE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/imagebutton/lv_imagebutton.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/imagebutton/lv_imagebutton.c deleted file mode 100644 index 3aef3a4..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/imagebutton/lv_imagebutton.c +++ /dev/null @@ -1,340 +0,0 @@ -/** - * @file lv_imagebutton.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_imagebutton_private.h" -#include "../../misc/lv_area_private.h" -#include "../../draw/lv_draw_private.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_obj_event_private.h" -#include "../../core/lv_obj_class_private.h" - - -#if LV_USE_IMAGEBUTTON != 0 - -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_imagebutton_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_imagebutton_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void draw_main(lv_event_t * e); -static void lv_imagebutton_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void refr_image(lv_obj_t * imagebutton); -static lv_imagebutton_state_t suggest_state(lv_obj_t * imagebutton, lv_imagebutton_state_t state); -static lv_imagebutton_state_t get_state(const lv_obj_t * imagebutton); -static void update_src_info(lv_imagebutton_src_info_t * info, const void * src); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_imagebutton_class = { - .base_class = &lv_obj_class, - .width_def = LV_SIZE_CONTENT, - .height_def = LV_SIZE_CONTENT, - .instance_size = sizeof(lv_imagebutton_t), - .constructor_cb = lv_imagebutton_constructor, - .event_cb = lv_imagebutton_event, - .name = "imagebutton", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_imagebutton_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_imagebutton_set_src(lv_obj_t * obj, lv_imagebutton_state_t state, const void * src_left, const void * src_mid, - const void * src_right) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; - - update_src_info(&imagebutton->src_left[state], src_left); - update_src_info(&imagebutton->src_mid[state], src_mid); - update_src_info(&imagebutton->src_right[state], src_right); - - refr_image(obj); -} - -void lv_imagebutton_set_state(lv_obj_t * obj, lv_imagebutton_state_t state) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_state_t obj_state = LV_STATE_DEFAULT; - if(state == LV_IMAGEBUTTON_STATE_PRESSED || - state == LV_IMAGEBUTTON_STATE_CHECKED_PRESSED) obj_state |= LV_STATE_PRESSED; - if(state == LV_IMAGEBUTTON_STATE_DISABLED || - state == LV_IMAGEBUTTON_STATE_CHECKED_DISABLED) obj_state |= LV_STATE_DISABLED; - if(state == LV_IMAGEBUTTON_STATE_CHECKED_DISABLED || state == LV_IMAGEBUTTON_STATE_CHECKED_PRESSED || - state == LV_IMAGEBUTTON_STATE_CHECKED_RELEASED) { - obj_state |= LV_STATE_CHECKED; - } - - lv_obj_remove_state(obj, LV_STATE_CHECKED | LV_STATE_PRESSED | LV_STATE_DISABLED); - lv_obj_add_state(obj, obj_state); - - refr_image(obj); -} - -/*===================== - * Getter functions - *====================*/ - -const void * lv_imagebutton_get_src_left(lv_obj_t * obj, lv_imagebutton_state_t state) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; - - return imagebutton->src_left[state].img_src; -} - -const void * lv_imagebutton_get_src_middle(lv_obj_t * obj, lv_imagebutton_state_t state) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; - - return imagebutton->src_mid[state].img_src; -} - -const void * lv_imagebutton_get_src_right(lv_obj_t * obj, lv_imagebutton_state_t state) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; - - return imagebutton->src_right[state].img_src; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_imagebutton_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; - /*Initialize the allocated 'ext'*/ - - lv_memzero(&imagebutton->src_mid, sizeof(imagebutton->src_mid)); - lv_memzero(&imagebutton->src_left, sizeof(imagebutton->src_left)); - lv_memzero(&imagebutton->src_right, sizeof(imagebutton->src_right)); -} - -static void lv_imagebutton_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res = lv_obj_event_base(&lv_imagebutton_class, e); - if(res != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - if(code == LV_EVENT_PRESSED || code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { - refr_image(obj); - } - else if(code == LV_EVENT_DRAW_MAIN) { - draw_main(e); - } - else if(code == LV_EVENT_COVER_CHECK) { - lv_cover_check_info_t * info = lv_event_get_param(e); - if(info->res != LV_COVER_RES_MASKED) info->res = LV_COVER_RES_NOT_COVER; - } - else if(code == LV_EVENT_GET_SELF_SIZE) { - lv_point_t * p = lv_event_get_self_size_info(e); - lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; - lv_imagebutton_state_t state = suggest_state(obj, get_state(obj)); - if(imagebutton->src_left[state].img_src == NULL && - imagebutton->src_mid[state].img_src != NULL && - imagebutton->src_right[state].img_src == NULL) { - p->x = LV_MAX(p->x, imagebutton->src_mid[state].header.w); - } - } -} - -static void draw_main(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; - lv_layer_t * layer = lv_event_get_layer(e); - - /*Just draw_main an image*/ - lv_imagebutton_state_t state = suggest_state(obj, get_state(obj)); - - /*Simply draw the middle src if no tiled*/ - lv_imagebutton_src_info_t * src_info = &imagebutton->src_left[state]; - - int32_t tw = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); - int32_t th = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); - lv_area_t coords; - lv_area_copy(&coords, &obj->coords); - lv_area_increase(&coords, tw, th); - - lv_draw_image_dsc_t img_dsc; - lv_draw_image_dsc_init(&img_dsc); - lv_obj_init_draw_image_dsc(obj, LV_PART_MAIN, &img_dsc); - - lv_area_t coords_part; - int32_t left_w = 0; - int32_t right_w = 0; - - if(src_info->img_src) { - left_w = src_info->header.w; - coords_part.x1 = coords.x1; - coords_part.y1 = coords.y1; - coords_part.x2 = coords.x1 + src_info->header.w - 1; - coords_part.y2 = coords.y1 + src_info->header.h - 1; - img_dsc.src = src_info->img_src; - lv_draw_image(layer, &img_dsc, &coords_part); - } - - src_info = &imagebutton->src_right[state]; - if(src_info->img_src) { - right_w = src_info->header.w; - coords_part.x1 = coords.x2 - src_info->header.w + 1; - coords_part.y1 = coords.y1; - coords_part.x2 = coords.x2; - coords_part.y2 = coords.y1 + src_info->header.h - 1; - img_dsc.src = src_info->img_src; - lv_draw_image(layer, &img_dsc, &coords_part); - } - - src_info = &imagebutton->src_mid[state]; - if(src_info->img_src) { - coords_part.x1 = coords.x1 + left_w; - coords_part.x2 = coords.x2 - right_w; - coords_part.y1 = coords.y1; - coords_part.y2 = coords.y2; - - lv_area_t clip_area_center; - if(lv_area_intersect(&clip_area_center, &coords_part, &layer->_clip_area)) { - lv_area_t clip_area_ori = layer->_clip_area; - layer->_clip_area = clip_area_center; - img_dsc.src = src_info->img_src; - img_dsc.tile = 1; - lv_draw_image(layer, &img_dsc, &coords_part); - layer->_clip_area = clip_area_ori; - } - - } -} - -static void refr_image(lv_obj_t * obj) -{ - lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; - lv_imagebutton_state_t state = suggest_state(obj, get_state(obj)); - - const void * src = imagebutton->src_mid[state].img_src; - if(src == NULL) return; - - lv_obj_refresh_self_size(obj); - lv_obj_set_height(obj, imagebutton->src_mid[state].header.h); /*Keep the user defined width*/ - - lv_obj_invalidate(obj); -} - -/** - * If `src` is not defined for the current state try to get a state which is related to the current but has `src`. - * E.g. if the PRESSED src is not set but the RELEASED does, use the RELEASED. - * @param imagebutton pointer to an image button - * @param state the state to convert - * @return the suggested state - */ -static lv_imagebutton_state_t suggest_state(lv_obj_t * obj, lv_imagebutton_state_t state) -{ - lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; - if(imagebutton->src_mid[state].img_src == NULL) { - switch(state) { - case LV_IMAGEBUTTON_STATE_PRESSED: - if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; - break; - case LV_IMAGEBUTTON_STATE_CHECKED_RELEASED: - if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; - break; - case LV_IMAGEBUTTON_STATE_CHECKED_PRESSED: - if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_CHECKED_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_CHECKED_RELEASED; - if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_PRESSED].img_src) return LV_IMAGEBUTTON_STATE_PRESSED; - if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; - break; - case LV_IMAGEBUTTON_STATE_DISABLED: - if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; - break; - case LV_IMAGEBUTTON_STATE_CHECKED_DISABLED: - if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_CHECKED_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_CHECKED_RELEASED; - if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; - break; - default: - break; - } - } - - return state; -} - -static lv_imagebutton_state_t get_state(const lv_obj_t * imagebutton) -{ - LV_ASSERT_OBJ(imagebutton, MY_CLASS); - - lv_state_t obj_state = lv_obj_get_state(imagebutton); - - if(obj_state & LV_STATE_DISABLED) { - if(obj_state & LV_STATE_CHECKED) return LV_IMAGEBUTTON_STATE_CHECKED_DISABLED; - else return LV_IMAGEBUTTON_STATE_DISABLED; - } - - if(obj_state & LV_STATE_CHECKED) { - if(obj_state & LV_STATE_PRESSED) return LV_IMAGEBUTTON_STATE_CHECKED_PRESSED; - else return LV_IMAGEBUTTON_STATE_CHECKED_RELEASED; - } - else { - if(obj_state & LV_STATE_PRESSED) return LV_IMAGEBUTTON_STATE_PRESSED; - else return LV_IMAGEBUTTON_STATE_RELEASED; - } -} - -static void update_src_info(lv_imagebutton_src_info_t * info, const void * src) -{ - if(!src) { - lv_memzero(info, sizeof(lv_imagebutton_src_info_t)); - return; - } - - lv_result_t res = lv_image_decoder_get_info(src, &info->header); - if(res != LV_RESULT_OK) { - LV_LOG_WARN("can't get info"); - return; - } - - info->img_src = src; -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/imagebutton/lv_imagebutton.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/imagebutton/lv_imagebutton.h deleted file mode 100644 index ed6dc3a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/imagebutton/lv_imagebutton.h +++ /dev/null @@ -1,121 +0,0 @@ -/** - * @file lv_imagebutton.h - * - */ - -#ifndef LV_IMAGEBUTTON_H -#define LV_IMAGEBUTTON_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" - -#if LV_USE_IMAGEBUTTON != 0 - -/********************* - * DEFINES - *********************/ -typedef enum { - LV_IMAGEBUTTON_STATE_RELEASED, - LV_IMAGEBUTTON_STATE_PRESSED, - LV_IMAGEBUTTON_STATE_DISABLED, - LV_IMAGEBUTTON_STATE_CHECKED_RELEASED, - LV_IMAGEBUTTON_STATE_CHECKED_PRESSED, - LV_IMAGEBUTTON_STATE_CHECKED_DISABLED, - LV_IMAGEBUTTON_STATE_NUM, -} lv_imagebutton_state_t; - -/********************** - * TYPEDEFS - **********************/ -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_imagebutton_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an image button object - * @param parent pointer to an object, it will be the parent of the new image button - * @return pointer to the created image button - */ -lv_obj_t * lv_imagebutton_create(lv_obj_t * parent); - -/*====================== - * Add/remove functions - *=====================*/ - -/*===================== - * Setter functions - *====================*/ - -/** - * Set images for a state of the image button - * @param imagebutton pointer to an image button object - * @param state for which state set the new image - * @param src_left pointer to an image source for the left side of the button (a C array or path to - * a file) - * @param src_mid pointer to an image source for the middle of the button (ideally 1px wide) (a C - * array or path to a file) - * @param src_right pointer to an image source for the right side of the button (a C array or path - * to a file) - */ -void lv_imagebutton_set_src(lv_obj_t * imagebutton, lv_imagebutton_state_t state, const void * src_left, - const void * src_mid, - const void * src_right); - -/** - * Use this function instead of `lv_obj_add/remove_state` to set a state manually - * @param imagebutton pointer to an image button object - * @param state the new state - */ -void lv_imagebutton_set_state(lv_obj_t * imagebutton, lv_imagebutton_state_t state); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the left image in a given state - * @param imagebutton pointer to an image button object - * @param state the state where to get the image (from `lv_button_state_t`) ` - * @return pointer to the left image source (a C array or path to a file) - */ -const void * lv_imagebutton_get_src_left(lv_obj_t * imagebutton, lv_imagebutton_state_t state); - -/** - * Get the middle image in a given state - * @param imagebutton pointer to an image button object - * @param state the state where to get the image (from `lv_button_state_t`) ` - * @return pointer to the middle image source (a C array or path to a file) - */ -const void * lv_imagebutton_get_src_middle(lv_obj_t * imagebutton, lv_imagebutton_state_t state); - -/** - * Get the right image in a given state - * @param imagebutton pointer to an image button object - * @param state the state where to get the image (from `lv_button_state_t`) ` - * @return pointer to the left image source (a C array or path to a file) - */ -const void * lv_imagebutton_get_src_right(lv_obj_t * imagebutton, lv_imagebutton_state_t state); - -/*===================== - * Other functions - *====================*/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_IMAGEBUTTON*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_IMAGEBUTTON_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/imagebutton/lv_imagebutton_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/imagebutton/lv_imagebutton_private.h deleted file mode 100644 index bf9c4ef..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/imagebutton/lv_imagebutton_private.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file lv_imagebutton_private.h - * - */ - -#ifndef LV_IMAGEBUTTON_PRIVATE_H -#define LV_IMAGEBUTTON_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_imagebutton.h" - -#if LV_USE_IMAGEBUTTON != 0 -#include "../../core/lv_obj_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_imagebutton_src_info_t { - const void * img_src; - lv_image_header_t header; -}; - -/** Data of image button */ -struct lv_imagebutton_t { - lv_obj_t obj; - lv_imagebutton_src_info_t src_mid[LV_IMAGEBUTTON_STATE_NUM]; /**< Store center images to each state */ - lv_imagebutton_src_info_t src_left[LV_IMAGEBUTTON_STATE_NUM]; /**< Store left side images to each state */ - lv_imagebutton_src_info_t src_right[LV_IMAGEBUTTON_STATE_NUM]; /**< Store right side images to each state */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_IMAGEBUTTON != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_IMAGEBUTTON_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/keyboard/lv_keyboard.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/keyboard/lv_keyboard.c deleted file mode 100644 index e781eb3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/keyboard/lv_keyboard.c +++ /dev/null @@ -1,490 +0,0 @@ - -/** - * @file lv_keyboard.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_keyboard_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_KEYBOARD - -#include "../textarea/lv_textarea.h" -#include "../../misc/lv_assert.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_keyboard_class) -#define LV_KB_BTN(width) LV_BUTTONMATRIX_CTRL_POPOVER | width - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_keyboard_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); - -static void lv_keyboard_update_map(lv_obj_t * obj); - -static void lv_keyboard_update_ctrl_map(lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ -#if LV_USE_OBJ_PROPERTY -static const lv_property_ops_t properties[] = { - { - .id = LV_PROPERTY_KEYBOARD_TEXTAREA, - .setter = lv_keyboard_set_textarea, - .getter = lv_keyboard_get_textarea, - }, - { - .id = LV_PROPERTY_KEYBOARD_MODE, - .setter = lv_keyboard_set_mode, - .getter = lv_keyboard_get_mode, - }, - { - .id = LV_PROPERTY_KEYBOARD_POPOVERS, - .setter = lv_keyboard_set_popovers, - .getter = lv_keyboard_get_popovers, - }, - { - .id = LV_PROPERTY_KEYBOARD_SELECTED_BUTTON, - .setter = lv_buttonmatrix_set_selected_button, - .getter = lv_keyboard_get_selected_button, - }, -}; -#endif - -const lv_obj_class_t lv_keyboard_class = { - .constructor_cb = lv_keyboard_constructor, - .width_def = LV_PCT(100), - .height_def = LV_PCT(50), - .instance_size = sizeof(lv_keyboard_t), - .editable = 1, - .base_class = &lv_buttonmatrix_class, - .name = "keyboard", -#if LV_USE_OBJ_PROPERTY - .prop_index_start = LV_PROPERTY_KEYBOARD_START, - .prop_index_end = LV_PROPERTY_KEYBOARD_END, - .properties = properties, - .properties_count = sizeof(properties) / sizeof(properties[0]), - -#if LV_USE_OBJ_PROPERTY_NAME - .property_names = lv_keyboard_property_names, - .names_count = sizeof(lv_keyboard_property_names) / sizeof(lv_property_name_t), -#endif - -#endif -}; - -static const char * const default_kb_map_lc[] = {"1#", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", LV_SYMBOL_BACKSPACE, "\n", - "ABC", "a", "s", "d", "f", "g", "h", "j", "k", "l", LV_SYMBOL_NEW_LINE, "\n", - "_", "-", "z", "x", "c", "v", "b", "n", "m", ".", ",", ":", "\n", - LV_SYMBOL_KEYBOARD, -#if LV_USE_ARABIC_PERSIAN_CHARS == 1 - "أب", -#endif - LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" - }; - -static const lv_buttonmatrix_ctrl_t default_kb_ctrl_lc_map[] = { - LV_KEYBOARD_CTRL_BUTTON_FLAGS | 5, LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_BUTTONMATRIX_CTRL_CHECKED | 7, - LV_KEYBOARD_CTRL_BUTTON_FLAGS | 6, LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_BUTTONMATRIX_CTRL_CHECKED | 7, - LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), - LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, -#if LV_USE_ARABIC_PERSIAN_CHARS == 1 - LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, -#endif - LV_BUTTONMATRIX_CTRL_CHECKED | 2, 6, LV_BUTTONMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2 -}; - -static const char * const default_kb_map_uc[] = {"1#", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", LV_SYMBOL_BACKSPACE, "\n", - "abc", "A", "S", "D", "F", "G", "H", "J", "K", "L", LV_SYMBOL_NEW_LINE, "\n", - "_", "-", "Z", "X", "C", "V", "B", "N", "M", ".", ",", ":", "\n", - LV_SYMBOL_CLOSE, -#if LV_USE_ARABIC_PERSIAN_CHARS == 1 - "أب", -#endif - LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" - }; - -static const lv_buttonmatrix_ctrl_t default_kb_ctrl_uc_map[] = { - LV_KEYBOARD_CTRL_BUTTON_FLAGS | 5, LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_BUTTONMATRIX_CTRL_CHECKED | 7, - LV_KEYBOARD_CTRL_BUTTON_FLAGS | 6, LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_BUTTONMATRIX_CTRL_CHECKED | 7, - LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), - LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, -#if LV_USE_ARABIC_PERSIAN_CHARS == 1 - LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, -#endif - LV_BUTTONMATRIX_CTRL_CHECKED | 2, 6, LV_BUTTONMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2 -}; - -#if LV_USE_ARABIC_PERSIAN_CHARS == 1 -static const char * const default_kb_map_ar[] = { - "1#", "ض", "ص", "ث", "ق", "ف", "غ", "ع", "ه", "خ", "ح", "ج", "\n", - "ش", "س", "ي", "ب", "ل", "ا", "ت", "ن", "م", "ك", "ط", LV_SYMBOL_BACKSPACE, "\n", - "ذ", "ء", "ؤ", "ر", "ى", "ة", "و", "ز", "ظ", "د", "ز", "ظ", "د", "\n", - LV_SYMBOL_CLOSE, "abc", LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_NEW_LINE, LV_SYMBOL_OK, "" -}; - -static const lv_buttonmatrix_ctrl_t default_kb_ctrl_ar_map[] = { - LV_KEYBOARD_CTRL_BUTTON_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, 2, 6, 2, 3, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2 -}; -#endif - -static const char * const default_kb_map_spec[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", LV_SYMBOL_BACKSPACE, "\n", - "abc", "+", "&", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", - "\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n", - LV_SYMBOL_KEYBOARD, -#if LV_USE_ARABIC_PERSIAN_CHARS == 1 - "أب", -#endif - LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" - }; - -static const lv_buttonmatrix_ctrl_t default_kb_ctrl_spec_map[] = { - LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | 2, - LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), - LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), - LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, -#if LV_USE_ARABIC_PERSIAN_CHARS == 1 - LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, -#endif - LV_BUTTONMATRIX_CTRL_CHECKED | 2, 6, LV_BUTTONMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2 -}; - -static const char * const default_kb_map_num[] = {"1", "2", "3", LV_SYMBOL_KEYBOARD, "\n", - "4", "5", "6", LV_SYMBOL_OK, "\n", - "7", "8", "9", LV_SYMBOL_BACKSPACE, "\n", - "+/-", "0", ".", LV_SYMBOL_LEFT, LV_SYMBOL_RIGHT, "" - }; - -static const lv_buttonmatrix_ctrl_t default_kb_ctrl_num_map[] = { - 1, 1, 1, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, - 1, 1, 1, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, - 1, 1, 1, 2, - 1, 1, 1, 1, 1 -}; - -static const char * const * kb_map[10] = { - default_kb_map_lc, - default_kb_map_uc, - default_kb_map_spec, - default_kb_map_num, - default_kb_map_lc, - default_kb_map_lc, - default_kb_map_lc, - default_kb_map_lc, -#if LV_USE_ARABIC_PERSIAN_CHARS == 1 - default_kb_map_ar, -#endif - NULL -}; -static const lv_buttonmatrix_ctrl_t * kb_ctrl[10] = { - default_kb_ctrl_lc_map, - default_kb_ctrl_uc_map, - default_kb_ctrl_spec_map, - default_kb_ctrl_num_map, - default_kb_ctrl_lc_map, - default_kb_ctrl_lc_map, - default_kb_ctrl_lc_map, - default_kb_ctrl_lc_map, -#if LV_USE_ARABIC_PERSIAN_CHARS == 1 - default_kb_ctrl_ar_map, -#endif - NULL -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_keyboard_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(&lv_keyboard_class, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_keyboard_set_textarea(lv_obj_t * obj, lv_obj_t * ta) -{ - if(ta) { - LV_ASSERT_OBJ(ta, &lv_textarea_class); - } - - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; - - /*Hide the cursor of the old Text area if cursor management is enabled*/ - if(keyboard->ta) { - lv_obj_remove_state(obj, LV_STATE_FOCUSED); - } - - keyboard->ta = ta; - - /*Show the cursor of the new Text area if cursor management is enabled*/ - if(keyboard->ta) { - lv_obj_add_state(obj, LV_STATE_FOCUSED); - } -} - -void lv_keyboard_set_mode(lv_obj_t * obj, lv_keyboard_mode_t mode) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; - if(keyboard->mode == mode) return; - - keyboard->mode = mode; - lv_keyboard_update_map(obj); -} - -void lv_keyboard_set_popovers(lv_obj_t * obj, bool en) -{ - lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; - - if(keyboard->popovers == en) { - return; - } - - keyboard->popovers = en; - lv_keyboard_update_ctrl_map(obj); -} - -void lv_keyboard_set_map(lv_obj_t * obj, lv_keyboard_mode_t mode, const char * const map[], - const lv_buttonmatrix_ctrl_t ctrl_map[]) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - kb_map[mode] = map; - kb_ctrl[mode] = ctrl_map; - lv_keyboard_update_map(obj); -} - -/*===================== - * Getter functions - *====================*/ - -lv_obj_t * lv_keyboard_get_textarea(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; - return keyboard->ta; -} - -lv_keyboard_mode_t lv_keyboard_get_mode(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; - return keyboard->mode; -} - -bool lv_keyboard_get_popovers(const lv_obj_t * obj) -{ - lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; - return keyboard->popovers; -} - -/*===================== - * Other functions - *====================*/ - -void lv_keyboard_def_event_cb(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; - uint32_t btn_id = lv_buttonmatrix_get_selected_button(obj); - if(btn_id == LV_BUTTONMATRIX_BUTTON_NONE) return; - - const char * txt = lv_buttonmatrix_get_button_text(obj, btn_id); - if(txt == NULL) return; - - if(lv_strcmp(txt, "abc") == 0) { - keyboard->mode = LV_KEYBOARD_MODE_TEXT_LOWER; - lv_buttonmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_LOWER]); - lv_keyboard_update_ctrl_map(obj); - return; - } -#if LV_USE_ARABIC_PERSIAN_CHARS == 1 - else if(lv_strcmp(txt, "أب") == 0) { - keyboard->mode = LV_KEYBOARD_MODE_TEXT_ARABIC; - lv_buttonmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_ARABIC]); - lv_keyboard_update_ctrl_map(obj); - return; - } -#endif - else if(lv_strcmp(txt, "ABC") == 0) { - keyboard->mode = LV_KEYBOARD_MODE_TEXT_UPPER; - lv_buttonmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_UPPER]); - lv_keyboard_update_ctrl_map(obj); - return; - } - else if(lv_strcmp(txt, "1#") == 0) { - keyboard->mode = LV_KEYBOARD_MODE_SPECIAL; - lv_buttonmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_SPECIAL]); - lv_keyboard_update_ctrl_map(obj); - return; - } - else if(lv_strcmp(txt, LV_SYMBOL_CLOSE) == 0 || lv_strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) { - lv_result_t res = lv_obj_send_event(obj, LV_EVENT_CANCEL, NULL); - if(res != LV_RESULT_OK) return; - - if(keyboard->ta) { - res = lv_obj_send_event(keyboard->ta, LV_EVENT_CANCEL, NULL); - if(res != LV_RESULT_OK) return; - } - return; - } - else if(lv_strcmp(txt, LV_SYMBOL_OK) == 0) { - lv_result_t res = lv_obj_send_event(obj, LV_EVENT_READY, NULL); - if(res != LV_RESULT_OK) return; - - if(keyboard->ta) { - res = lv_obj_send_event(keyboard->ta, LV_EVENT_READY, NULL); - if(res != LV_RESULT_OK) return; - } - return; - } - - /*Add the characters to the text area if set*/ - if(keyboard->ta == NULL) return; - - if(lv_strcmp(txt, "Enter") == 0 || lv_strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) { - lv_textarea_add_char(keyboard->ta, '\n'); - if(lv_textarea_get_one_line(keyboard->ta)) { - lv_result_t res = lv_obj_send_event(keyboard->ta, LV_EVENT_READY, NULL); - if(res != LV_RESULT_OK) return; - } - } - else if(lv_strcmp(txt, LV_SYMBOL_LEFT) == 0) { - lv_textarea_cursor_left(keyboard->ta); - } - else if(lv_strcmp(txt, LV_SYMBOL_RIGHT) == 0) { - lv_textarea_cursor_right(keyboard->ta); - } - else if(lv_strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) { - lv_textarea_delete_char(keyboard->ta); - } - else if(lv_strcmp(txt, "+/-") == 0) { - uint32_t cur = lv_textarea_get_cursor_pos(keyboard->ta); - const char * ta_txt = lv_textarea_get_text(keyboard->ta); - if(ta_txt[0] == '-') { - lv_textarea_set_cursor_pos(keyboard->ta, 1); - lv_textarea_delete_char(keyboard->ta); - lv_textarea_add_char(keyboard->ta, '+'); - lv_textarea_set_cursor_pos(keyboard->ta, cur); - } - else if(ta_txt[0] == '+') { - lv_textarea_set_cursor_pos(keyboard->ta, 1); - lv_textarea_delete_char(keyboard->ta); - lv_textarea_add_char(keyboard->ta, '-'); - lv_textarea_set_cursor_pos(keyboard->ta, cur); - } - else { - lv_textarea_set_cursor_pos(keyboard->ta, 0); - lv_textarea_add_char(keyboard->ta, '-'); - lv_textarea_set_cursor_pos(keyboard->ta, cur + 1); - } - } - else { - lv_textarea_add_text(keyboard->ta, txt); - } -} - -const char * const * lv_keyboard_get_map_array(const lv_obj_t * kb) -{ - return lv_buttonmatrix_get_map(kb); -} - -uint32_t lv_keyboard_get_selected_button(const lv_obj_t * obj) -{ - return lv_buttonmatrix_get_selected_button(obj); -} - -const char * lv_keyboard_get_button_text(const lv_obj_t * obj, uint32_t btn_id) -{ - return lv_buttonmatrix_get_button_text(obj, btn_id); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_keyboard_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICK_FOCUSABLE); - - lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; - keyboard->ta = NULL; - keyboard->mode = LV_KEYBOARD_MODE_TEXT_LOWER; - keyboard->popovers = 0; - - lv_obj_align(obj, LV_ALIGN_BOTTOM_MID, 0, 0); - lv_obj_add_event_cb(obj, lv_keyboard_def_event_cb, LV_EVENT_VALUE_CHANGED, NULL); - lv_obj_set_style_base_dir(obj, LV_BASE_DIR_LTR, 0); - - lv_keyboard_update_map(obj); -} - -/** - * Update the key and control map for the current mode - * @param obj pointer to a keyboard object - */ -static void lv_keyboard_update_map(lv_obj_t * obj) -{ - lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; - lv_buttonmatrix_set_map(obj, kb_map[keyboard->mode]); - lv_keyboard_update_ctrl_map(obj); -} - -/** - * Update the control map for the current mode - * @param obj pointer to a keyboard object - */ -static void lv_keyboard_update_ctrl_map(lv_obj_t * obj) -{ - lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; - - if(keyboard->popovers) { - /*Apply the current control map (already includes LV_BUTTONMATRIX_CTRL_POPOVER flags)*/ - lv_buttonmatrix_set_ctrl_map(obj, kb_ctrl[keyboard->mode]); - } - else { - /*Make a copy of the current control map*/ - lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; - lv_buttonmatrix_ctrl_t * ctrl_map = lv_malloc(btnm->btn_cnt * sizeof(lv_buttonmatrix_ctrl_t)); - lv_memcpy(ctrl_map, kb_ctrl[keyboard->mode], sizeof(lv_buttonmatrix_ctrl_t) * btnm->btn_cnt); - - /*Remove all LV_BUTTONMATRIX_CTRL_POPOVER flags*/ - uint32_t i; - for(i = 0; i < btnm->btn_cnt; i++) { - ctrl_map[i] &= (~LV_BUTTONMATRIX_CTRL_POPOVER); - } - - /*Apply new control map and clean up*/ - lv_buttonmatrix_set_ctrl_map(obj, ctrl_map); - lv_free(ctrl_map); - } -} - -#endif /*LV_USE_KEYBOARD*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/keyboard/lv_keyboard.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/keyboard/lv_keyboard.h deleted file mode 100644 index f177c18..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/keyboard/lv_keyboard.h +++ /dev/null @@ -1,183 +0,0 @@ -/** - * @file lv_keyboard.h - * - */ - -#ifndef LV_KEYBOARD_H -#define LV_KEYBOARD_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../buttonmatrix/lv_buttonmatrix.h" - -#if LV_USE_KEYBOARD - -/*Testing of dependencies*/ -#if LV_USE_BUTTONMATRIX == 0 -#error "lv_buttonmatrix is required. Enable it in lv_conf.h (LV_USE_BUTTONMATRIX 1) " -#endif - -#if LV_USE_TEXTAREA == 0 -#error "lv_textarea is required. Enable it in lv_conf.h (LV_USE_TEXTAREA 1) " -#endif - -/********************* - * DEFINES - *********************/ -#define LV_KEYBOARD_CTRL_BUTTON_FLAGS (LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_CLICK_TRIG | LV_BUTTONMATRIX_CTRL_CHECKED) - -/********************** - * TYPEDEFS - **********************/ - -/** Current keyboard mode.*/ -typedef enum { - LV_KEYBOARD_MODE_TEXT_LOWER, - LV_KEYBOARD_MODE_TEXT_UPPER, - LV_KEYBOARD_MODE_SPECIAL, - LV_KEYBOARD_MODE_NUMBER, - LV_KEYBOARD_MODE_USER_1, - LV_KEYBOARD_MODE_USER_2, - LV_KEYBOARD_MODE_USER_3, - LV_KEYBOARD_MODE_USER_4, -#if LV_USE_ARABIC_PERSIAN_CHARS == 1 - LV_KEYBOARD_MODE_TEXT_ARABIC -#endif -} lv_keyboard_mode_t; - -#if LV_USE_OBJ_PROPERTY -enum { - LV_PROPERTY_ID(KEYBOARD, TEXTAREA, LV_PROPERTY_TYPE_OBJ, 0), - LV_PROPERTY_ID(KEYBOARD, MODE, LV_PROPERTY_TYPE_INT, 1), - LV_PROPERTY_ID(KEYBOARD, POPOVERS, LV_PROPERTY_TYPE_INT, 2), - LV_PROPERTY_ID(KEYBOARD, SELECTED_BUTTON, LV_PROPERTY_TYPE_INT, 3), - LV_PROPERTY_KEYBOARD_END, -}; -#endif - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_keyboard_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a Keyboard object - * @param parent pointer to an object, it will be the parent of the new keyboard - * @return pointer to the created keyboard - */ -lv_obj_t * lv_keyboard_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Assign a Text Area to the Keyboard. The pressed characters will be put there. - * @param kb pointer to a Keyboard object - * @param ta pointer to a Text Area object to write there - */ -void lv_keyboard_set_textarea(lv_obj_t * kb, lv_obj_t * ta); - -/** - * Set a new a mode (text or number map) - * @param kb pointer to a Keyboard object - * @param mode the mode from 'lv_keyboard_mode_t' - */ -void lv_keyboard_set_mode(lv_obj_t * kb, lv_keyboard_mode_t mode); - -/** - * Show the button title in a popover when pressed. - * @param kb pointer to a Keyboard object - * @param en whether "popovers" mode is enabled - */ -void lv_keyboard_set_popovers(lv_obj_t * kb, bool en); - -/** - * Set a new map for the keyboard - * @param kb pointer to a Keyboard object - * @param mode keyboard map to alter 'lv_keyboard_mode_t' - * @param map pointer to a string array to describe the map. - * See 'lv_buttonmatrix_set_map()' for more info. - * @param ctrl_map See 'lv_buttonmatrix_set_ctrl_map()' for more info. - - */ -void lv_keyboard_set_map(lv_obj_t * kb, lv_keyboard_mode_t mode, const char * const map[], - const lv_buttonmatrix_ctrl_t ctrl_map[]); - -/*===================== - * Getter functions - *====================*/ - -/** - * Assign a Text Area to the Keyboard. The pressed characters will be put there. - * @param kb pointer to a Keyboard object - * @return pointer to the assigned Text Area object - */ -lv_obj_t * lv_keyboard_get_textarea(const lv_obj_t * kb); - -/** - * Set a new a mode (text or number map) - * @param kb pointer to a Keyboard object - * @return the current mode from 'lv_keyboard_mode_t' - */ -lv_keyboard_mode_t lv_keyboard_get_mode(const lv_obj_t * kb); - -/** - * Tell whether "popovers" mode is enabled or not. - * @param obj pointer to a Keyboard object - * @return true: "popovers" mode is enabled; false: disabled - */ -bool lv_keyboard_get_popovers(const lv_obj_t * obj); - -/** - * Get the current map of a keyboard - * @param kb pointer to a keyboard object - * @return the current map - */ -const char * const * lv_keyboard_get_map_array(const lv_obj_t * kb); - -/** - * Get the index of the lastly "activated" button by the user (pressed, released, focused etc) - * Useful in the `event_cb` to get the text of the button, check if hidden etc. - * @param obj pointer to button matrix object - * @return index of the last released button (LV_BUTTONMATRIX_BUTTON_NONE: if unset) - */ -uint32_t lv_keyboard_get_selected_button(const lv_obj_t * obj); - -/** - * Get the button's text - * @param obj pointer to button matrix object - * @param btn_id the index a button not counting new line characters. - * @return text of btn_index` button - */ -const char * lv_keyboard_get_button_text(const lv_obj_t * obj, uint32_t btn_id); - -/*===================== - * Other functions - *====================*/ - -/** - * Default keyboard event to add characters to the Text area and change the map. - * If a custom `event_cb` is added to the keyboard this function can be called from it to handle the - * button clicks - * @param e the triggering event - */ -void lv_keyboard_def_event_cb(lv_event_t * e); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_KEYBOARD*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_KEYBOARD_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/keyboard/lv_keyboard_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/keyboard/lv_keyboard_private.h deleted file mode 100644 index 757b23e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/keyboard/lv_keyboard_private.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @file lv_keyboard_private.h - * - */ - -#ifndef LV_KEYBOARD_PRIVATE_H -#define LV_KEYBOARD_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../buttonmatrix/lv_buttonmatrix_private.h" -#include "lv_keyboard.h" - -#if LV_USE_KEYBOARD - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Data of keyboard */ -struct lv_keyboard_t { - lv_buttonmatrix_t btnm; - lv_obj_t * ta; /**< Pointer to the assigned text area */ - lv_keyboard_mode_t mode; /**< Key map type */ - uint8_t popovers : 1; /**< Show button titles in popovers on press */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_KEYBOARD */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_KEYBOARD_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/label/lv_label.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/label/lv_label.c deleted file mode 100644 index ae07112..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/label/lv_label.c +++ /dev/null @@ -1,1333 +0,0 @@ -/** - * @file lv_label.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_label_private.h" -#include "../../misc/lv_area_private.h" -#include "../../misc/lv_anim_private.h" -#include "../../draw/lv_draw_label_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_LABEL != 0 -#include "../../core/lv_obj_private.h" -#include "../../misc/lv_assert.h" -#include "../../core/lv_group.h" -#include "../../display/lv_display.h" -#include "../../draw/lv_draw_private.h" -#include "../../misc/lv_color.h" -#include "../../misc/lv_math.h" -#include "../../misc/lv_bidi_private.h" -#include "../../misc/lv_text_ap.h" -#include "../../misc/lv_text_private.h" -#include "../../stdlib/lv_sprintf.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_label_class) - -#define LV_LABEL_DEF_SCROLL_SPEED lv_anim_speed_clamped(40, 300, 10000) -#define LV_LABEL_SCROLL_DELAY 300 -#define LV_LABEL_DOT_END_INV 0xFFFFFFFF -#define LV_LABEL_HINT_HEIGHT_LIMIT 1024 /*Enable "hint" to buffer info about labels larger than this. (Speed up drawing)*/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_label_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_label_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_label_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void draw_main(lv_event_t * e); - -static void lv_label_refr_text(lv_obj_t * obj); -static void lv_label_revert_dots(lv_obj_t * label); - -static bool lv_label_set_dot_tmp(lv_obj_t * label, char * data, uint32_t len); -static char * lv_label_get_dot_tmp(lv_obj_t * label); -static void lv_label_dot_tmp_free(lv_obj_t * label); -static void set_ofs_x_anim(void * obj, int32_t v); -static void set_ofs_y_anim(void * obj, int32_t v); -static size_t get_text_length(const char * text); -static void copy_text_to_label(lv_label_t * label, const char * text); -static lv_text_flag_t get_label_flags(lv_label_t * label); -static void calculate_x_coordinate(int32_t * x, const lv_text_align_t align, const char * txt, - uint32_t length, const lv_font_t * font, int32_t letter_space, lv_area_t * txt_coords); - -/********************** - * STATIC VARIABLES - **********************/ -#if LV_USE_OBJ_PROPERTY -static const lv_property_ops_t properties[] = { - { - .id = LV_PROPERTY_LABEL_TEXT, - .setter = lv_label_set_text, - .getter = lv_label_get_text, - }, - { - .id = LV_PROPERTY_LABEL_LONG_MODE, - .setter = lv_label_set_long_mode, - .getter = lv_label_get_long_mode, - }, - { - .id = LV_PROPERTY_LABEL_TEXT_SELECTION_START, - .setter = lv_label_set_text_selection_start, - .getter = lv_label_get_text_selection_start, - }, - { - .id = LV_PROPERTY_LABEL_TEXT_SELECTION_END, - .setter = lv_label_set_text_selection_end, - .getter = lv_label_get_text_selection_end, - }, -}; -#endif - -const lv_obj_class_t lv_label_class = { - .constructor_cb = lv_label_constructor, - .destructor_cb = lv_label_destructor, - .event_cb = lv_label_event, - .width_def = LV_SIZE_CONTENT, - .height_def = LV_SIZE_CONTENT, - .instance_size = sizeof(lv_label_t), - .base_class = &lv_obj_class, - .name = "label", -#if LV_USE_OBJ_PROPERTY - .prop_index_start = LV_PROPERTY_LABEL_START, - .prop_index_end = LV_PROPERTY_LABEL_END, - .properties = properties, - .properties_count = sizeof(properties) / sizeof(properties[0]), - -#if LV_USE_OBJ_PROPERTY_NAME - .property_names = lv_label_property_names, - .names_count = sizeof(lv_label_property_names) / sizeof(lv_property_name_t), -#endif - -#endif -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_label_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_label_set_text(lv_obj_t * obj, const char * text) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_label_t * label = (lv_label_t *)obj; - - lv_obj_invalidate(obj); - - /*If text is NULL then just refresh with the current text*/ - if(text == NULL) text = label->text; - - const size_t text_len = get_text_length(text); - - /*If set its own text then reallocate it (maybe its size changed)*/ - if(label->text == text && label->static_txt == 0) { - label->text = lv_realloc(label->text, text_len); - LV_ASSERT_MALLOC(label->text); - if(label->text == NULL) return; - -#if LV_USE_ARABIC_PERSIAN_CHARS - lv_text_ap_proc(label->text, label->text); -#endif - - } - else { - /*Free the old text*/ - if(label->text != NULL && label->static_txt == 0) { - lv_free(label->text); - label->text = NULL; - } - - label->text = lv_malloc(text_len); - LV_ASSERT_MALLOC(label->text); - if(label->text == NULL) return; - - copy_text_to_label(label, text); - - /*Now the text is dynamically allocated*/ - label->static_txt = 0; - } - - lv_label_refr_text(obj); -} - -void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(fmt); - - lv_obj_invalidate(obj); - lv_label_t * label = (lv_label_t *)obj; - - /*If text is NULL then refresh*/ - if(fmt == NULL) { - lv_label_refr_text(obj); - return; - } - - if(label->text != NULL && label->static_txt == 0) { - lv_free(label->text); - label->text = NULL; - } - - va_list args; - va_start(args, fmt); - label->text = lv_text_set_text_vfmt(fmt, args); - va_end(args); - label->static_txt = 0; /*Now the text is dynamically allocated*/ - - lv_label_refr_text(obj); -} - -void lv_label_set_text_static(lv_obj_t * obj, const char * text) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_label_t * label = (lv_label_t *)obj; - - if(label->static_txt == 0 && label->text != NULL) { - lv_free(label->text); - label->text = NULL; - } - - if(text != NULL) { - label->static_txt = 1; - label->text = (char *)text; - } - - lv_label_refr_text(obj); -} - -void lv_label_set_long_mode(lv_obj_t * obj, lv_label_long_mode_t long_mode) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_label_t * label = (lv_label_t *)obj; - - /*Delete the old animation (if exists)*/ - lv_anim_delete(obj, set_ofs_x_anim); - lv_anim_delete(obj, set_ofs_y_anim); - lv_point_set(&label->offset, 0, 0); - - if(long_mode == LV_LABEL_LONG_SCROLL || long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR || long_mode == LV_LABEL_LONG_CLIP) - label->expand = 1; - else - label->expand = 0; - - /*Restore the character under the dots*/ - if(label->long_mode == LV_LABEL_LONG_DOT && label->dot_end != LV_LABEL_DOT_END_INV) { - lv_label_revert_dots(obj); - } - - label->long_mode = long_mode; - lv_label_refr_text(obj); -} - -void lv_label_set_text_selection_start(lv_obj_t * obj, uint32_t index) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - -#if LV_LABEL_TEXT_SELECTION - lv_label_t * label = (lv_label_t *)obj; - label->sel_start = index; - lv_obj_invalidate(obj); -#else - LV_UNUSED(obj); /*Unused*/ - LV_UNUSED(index); /*Unused*/ -#endif -} - -void lv_label_set_text_selection_end(lv_obj_t * obj, uint32_t index) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - -#if LV_LABEL_TEXT_SELECTION - lv_label_t * label = (lv_label_t *)obj; - label->sel_end = index; - lv_obj_invalidate(obj); -#else - LV_UNUSED(obj); /*Unused*/ - LV_UNUSED(index); /*Unused*/ -#endif -} - -/*===================== - * Getter functions - *====================*/ - -char * lv_label_get_text(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_label_t * label = (lv_label_t *)obj; - return label->text; -} - -lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_label_t * label = (lv_label_t *)obj; - return label->long_mode; -} - -void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t * pos) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(pos); - - lv_label_t * label = (lv_label_t *)obj; - const char * txt = lv_label_get_text(obj); - const lv_text_align_t align = lv_obj_calculate_style_text_align(obj, LV_PART_MAIN, txt); - - if(txt[0] == '\0') { - pos->y = 0; - switch(align) { - case LV_TEXT_ALIGN_LEFT: - pos->x = 0; - break; - case LV_TEXT_ALIGN_RIGHT: - pos->x = lv_obj_get_content_width(obj); - break; - case LV_TEXT_ALIGN_CENTER: - pos->x = lv_obj_get_content_width(obj) / 2; - break; - default: - break; - } - return; - } - - lv_text_flag_t flag = get_label_flags(label); - - const uint32_t byte_id = lv_text_encoded_get_byte_id(txt, char_id); - /*Search the line of the index letter*/ - const int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - const int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); - - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - const int32_t letter_height = lv_font_get_line_height(font); - - lv_area_t txt_coords; - lv_obj_get_content_coords(obj, &txt_coords); - const int32_t max_w = lv_area_get_width(&txt_coords); - const int32_t max_h = lv_area_get_height(&txt_coords); - - int32_t y = 0; - uint32_t line_start = 0; - uint32_t new_line_start = 0; - while(txt[new_line_start] != '\0') { - bool last_line = y + letter_height + line_space + letter_height > max_h; - if(last_line && label->long_mode == LV_LABEL_LONG_DOT) flag |= LV_TEXT_FLAG_BREAK_ALL; - - new_line_start += lv_text_get_next_line(&txt[line_start], font, letter_space, max_w, NULL, flag); - if(byte_id < new_line_start || txt[new_line_start] == '\0') - break; /*The line of 'index' letter begins at 'line_start'*/ - - y += letter_height + line_space; - line_start = new_line_start; - } - - /*If the last character is line break then go to the next line*/ - if(byte_id > 0) { - if((txt[byte_id - 1] == '\n' || txt[byte_id - 1] == '\r') && txt[byte_id] == '\0') { - y += letter_height + line_space; - line_start = byte_id; - } - } - - const char * bidi_txt; - uint32_t visual_byte_pos; -#if LV_USE_BIDI - lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); - if(base_dir == LV_BASE_DIR_AUTO) base_dir = lv_bidi_detect_base_dir(txt); - - char * mutable_bidi_txt = NULL; - /*Handle Bidi*/ - if(new_line_start == byte_id) { - visual_byte_pos = base_dir == LV_BASE_DIR_RTL ? 0 : byte_id - line_start; - bidi_txt = &txt[line_start]; - } - else { - uint32_t line_char_id = lv_text_encoded_get_char_id(&txt[line_start], byte_id - line_start); - - bool is_rtl; - uint32_t visual_char_pos = lv_bidi_get_visual_pos(&txt[line_start], &mutable_bidi_txt, new_line_start - line_start, - base_dir, line_char_id, &is_rtl); - bidi_txt = mutable_bidi_txt; - if(is_rtl) visual_char_pos++; - - visual_byte_pos = lv_text_encoded_get_byte_id(bidi_txt, visual_char_pos); - } -#else - bidi_txt = &txt[line_start]; - visual_byte_pos = byte_id - line_start; -#endif - - /*Calculate the x coordinate*/ - int32_t x = lv_text_get_width(bidi_txt, visual_byte_pos, font, letter_space); - if(char_id != line_start) x += letter_space; - - uint32_t length = new_line_start - line_start; - calculate_x_coordinate(&x, align, bidi_txt, length, font, letter_space, &txt_coords); - pos->x = x; - pos->y = y; - -#if LV_USE_BIDI - if(mutable_bidi_txt) lv_free(mutable_bidi_txt); -#endif -} - -uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in, bool bidi) -{ - LV_UNUSED(bidi); - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(pos_in); - lv_label_t * label = (lv_label_t *)obj; - - lv_point_t pos; - pos.x = pos_in->x - lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - pos.y = pos_in->y - lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - - lv_area_t txt_coords; - lv_obj_get_content_coords(obj, &txt_coords); - const char * txt = lv_label_get_text(obj); - uint32_t line_start = 0; - uint32_t new_line_start = 0; - int32_t max_w = lv_area_get_width(&txt_coords); - int32_t max_h = lv_area_get_height(&txt_coords); - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - const int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - const int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); - const int32_t letter_height = lv_font_get_line_height(font); - int32_t y = 0; - - lv_text_flag_t flag = get_label_flags(label); - - /*Search the line of the index letter*/; - while(txt[line_start] != '\0') { - /*If dots will be shown, break the last visible line anywhere, - *not only at word boundaries.*/ - bool last_line = y + letter_height + line_space + letter_height > max_h; - if(last_line && label->long_mode == LV_LABEL_LONG_DOT) flag |= LV_TEXT_FLAG_BREAK_ALL; - - new_line_start += lv_text_get_next_line(&txt[line_start], font, letter_space, max_w, NULL, flag); - - if(pos.y <= y + letter_height) { - /*The line is found (stored in 'line_start')*/ - /*Include the NULL terminator in the last line*/ - uint32_t tmp = new_line_start; - uint32_t letter; - letter = lv_text_encoded_prev(txt, &tmp); - if(letter != '\n' && txt[new_line_start] == '\0') new_line_start++; - break; - } - y += letter_height + line_space; - - line_start = new_line_start; - } - - char * bidi_txt; - -#if LV_USE_BIDI - uint32_t txt_len = 0; - if(bidi) { - bidi_txt = lv_malloc(new_line_start - line_start + 1); - txt_len = new_line_start - line_start; - if(new_line_start > 0 && txt[new_line_start - 1] == '\0' && txt_len > 0) txt_len--; - lv_bidi_process_paragraph(txt + line_start, bidi_txt, txt_len, lv_obj_get_style_base_dir(obj, LV_PART_MAIN), NULL, 0); - } - else -#endif - { - bidi_txt = (char *)txt + line_start; - } - - /*Calculate the x coordinate*/ - int32_t x = 0; - const lv_text_align_t align = lv_obj_calculate_style_text_align(obj, LV_PART_MAIN, label->text); - uint32_t length = new_line_start - line_start; - calculate_x_coordinate(&x, align, bidi_txt, length, font, letter_space, &txt_coords); - - uint32_t i = 0; - uint32_t i_act = i; - - if(new_line_start > 0) { - while(i + line_start < new_line_start) { - /*Get the current letter and the next letter for kerning*/ - /*Be careful 'i' already points to the next character*/ - uint32_t letter; - uint32_t letter_next; - lv_text_encoded_letter_next_2(bidi_txt, &letter, &letter_next, &i); - - int32_t gw = lv_font_get_glyph_width(font, letter, letter_next); - - /*Finish if the x position or the last char of the next line is reached*/ - if(pos.x < x + gw || i + line_start == new_line_start || txt[i_act + line_start] == '\0') { - i = i_act; - break; - } - x += gw; - x += letter_space; - i_act = i; - } - } - - uint32_t logical_pos; -#if LV_USE_BIDI - if(bidi) { - /*Handle Bidi*/ - uint32_t cid = lv_text_encoded_get_char_id(bidi_txt, i); - if(txt[line_start + i] == '\0') { - logical_pos = i; - } - else { - bool is_rtl; - logical_pos = lv_bidi_get_logical_pos(&txt[line_start], NULL, - txt_len, lv_obj_get_style_base_dir(obj, LV_PART_MAIN), cid, &is_rtl); - if(is_rtl) logical_pos++; - } - lv_free(bidi_txt); - } - else -#endif - { - logical_pos = lv_text_encoded_get_char_id(bidi_txt, i); - } - - return logical_pos + lv_text_encoded_get_char_id(txt, line_start); -} - -bool lv_label_is_char_under_pos(const lv_obj_t * obj, lv_point_t * pos) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(pos); - - lv_area_t txt_coords; - lv_obj_get_content_coords(obj, &txt_coords); - const char * txt = lv_label_get_text(obj); - lv_label_t * label = (lv_label_t *)obj; - uint32_t line_start = 0; - uint32_t new_line_start = 0; - const int32_t max_w = lv_area_get_width(&txt_coords); - const int32_t max_h = lv_area_get_height(&txt_coords); - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - const int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - const int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); - const int32_t letter_height = lv_font_get_line_height(font); - - lv_text_flag_t flag = get_label_flags(label); - - /*Search the line of the index letter*/ - int32_t y = 0; - while(txt[line_start] != '\0') { - bool last_line = y + letter_height + line_space + letter_height > max_h; - if(last_line && label->long_mode == LV_LABEL_LONG_DOT) flag |= LV_TEXT_FLAG_BREAK_ALL; - - new_line_start += lv_text_get_next_line(&txt[line_start], font, letter_space, max_w, NULL, flag); - - if(pos->y <= y + letter_height) break; /*The line is found (stored in 'line_start')*/ - y += letter_height + line_space; - - line_start = new_line_start; - } - - /*Calculate the x coordinate*/ - const lv_text_align_t align = lv_obj_calculate_style_text_align(obj, LV_PART_MAIN, label->text); - - int32_t x = 0; - if(align == LV_TEXT_ALIGN_CENTER) { - const int32_t line_w = lv_text_get_width(&txt[line_start], new_line_start - line_start, font, letter_space); - x += lv_area_get_width(&txt_coords) / 2 - line_w / 2; - } - else if(align == LV_TEXT_ALIGN_RIGHT) { - const int32_t line_w = lv_text_get_width(&txt[line_start], new_line_start - line_start, font, letter_space); - x += lv_area_get_width(&txt_coords) - line_w; - } - - int32_t last_x = 0; - uint32_t i = line_start; - uint32_t i_current = i; - uint32_t letter = '\0'; - uint32_t letter_next = '\0'; - - if(new_line_start > 0) { - while(i <= new_line_start - 1) { - /*Get the current letter and the next letter for kerning*/ - /*Be careful 'i' already points to the next character*/ - lv_text_encoded_letter_next_2(txt, &letter, &letter_next, &i); - - last_x = x; - x += lv_font_get_glyph_width(font, letter, letter_next); - if(pos->x < x) { - i = i_current; - break; - } - x += letter_space; - i_current = i; - } - } - - const int32_t max_diff = lv_font_get_glyph_width(font, letter, letter_next) + letter_space + 1; - return (pos->x >= (last_x - letter_space) && pos->x <= (last_x + max_diff)); -} - -uint32_t lv_label_get_text_selection_start(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - -#if LV_LABEL_TEXT_SELECTION - lv_label_t * label = (lv_label_t *)obj; - return label->sel_start; -#else - LV_UNUSED(obj); /*Unused*/ - return LV_LABEL_TEXT_SELECTION_OFF; -#endif -} - -uint32_t lv_label_get_text_selection_end(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - -#if LV_LABEL_TEXT_SELECTION - lv_label_t * label = (lv_label_t *)obj; - return label->sel_end; -#else - LV_UNUSED(obj); /*Unused*/ - return LV_LABEL_TEXT_SELECTION_OFF; -#endif -} - -/*===================== - * Other functions - *====================*/ - -void lv_label_ins_text(lv_obj_t * obj, uint32_t pos, const char * txt) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(txt); - - lv_label_t * label = (lv_label_t *)obj; - - /*Cannot append to static text*/ - if(label->static_txt != 0) return; - - lv_obj_invalidate(obj); - - /*Allocate space for the new text*/ - size_t old_len = lv_strlen(label->text); - size_t ins_len = lv_strlen(txt); - size_t new_len = ins_len + old_len; - label->text = lv_realloc(label->text, new_len + 1); - LV_ASSERT_MALLOC(label->text); - if(label->text == NULL) return; - - if(pos == LV_LABEL_POS_LAST) { - pos = lv_text_get_encoded_length(label->text); - } - - lv_text_ins(label->text, pos, txt); - lv_label_set_text(obj, NULL); -} - -void lv_label_cut_text(lv_obj_t * obj, uint32_t pos, uint32_t cnt) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_label_t * label = (lv_label_t *)obj; - - /*Cannot append to static text*/ - if(label->static_txt) return; - - lv_obj_invalidate(obj); - - char * label_txt = lv_label_get_text(obj); - /*Delete the characters*/ - lv_text_cut(label_txt, pos, cnt); - - /*Refresh the label*/ - lv_label_refr_text(obj); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_label_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_label_t * label = (lv_label_t *)obj; - - label->text = NULL; - label->static_txt = 0; - label->dot_end = LV_LABEL_DOT_END_INV; - label->long_mode = LV_LABEL_LONG_WRAP; - lv_point_set(&label->offset, 0, 0); - -#if LV_LABEL_LONG_TXT_HINT - label->hint.line_start = -1; - label->hint.coord_y = 0; - label->hint.y = 0; -#endif - -#if LV_LABEL_TEXT_SELECTION - label->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; - label->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; -#endif - label->dot.tmp_ptr = NULL; - label->dot_tmp_alloc = 0; - - lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); - lv_label_set_long_mode(obj, LV_LABEL_LONG_WRAP); - lv_label_set_text(obj, LV_LABEL_DEFAULT_TEXT); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_label_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_label_t * label = (lv_label_t *)obj; - - lv_label_dot_tmp_free(obj); - if(!label->static_txt) lv_free(label->text); - label->text = NULL; -} - -static void lv_label_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - /*Call the ancestor's event handler*/ - const lv_result_t res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - const lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - - if((code == LV_EVENT_STYLE_CHANGED) || (code == LV_EVENT_SIZE_CHANGED)) { - /*Revert dots for proper refresh*/ - lv_label_revert_dots(obj); - lv_label_refr_text(obj); - } - else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - /* Italic or other non-typical letters can be drawn of out of the object. - * It happens if box_w + ofs_x > adw_w in the glyph. - * To avoid this add some extra draw area. - * font_h / 4 is an empirical value. */ - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - const int32_t font_h = lv_font_get_line_height(font); - lv_event_set_ext_draw_size(e, font_h / 4); - } - else if(code == LV_EVENT_GET_SELF_SIZE) { - lv_label_t * label = (lv_label_t *)obj; - if(label->invalid_size_cache) { - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - lv_text_flag_t flag = LV_TEXT_FLAG_NONE; - if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; - - int32_t w = lv_obj_get_content_width(obj); - if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) w = LV_COORD_MAX; - else w = lv_obj_get_content_width(obj); - - w = LV_MIN(w, lv_obj_get_style_max_width(obj, 0)); - - lv_text_get_size(&label->size_cache, label->text, font, letter_space, line_space, w, flag); - label->invalid_size_cache = false; - } - - lv_point_t * self_size = lv_event_get_param(e); - self_size->x = LV_MAX(self_size->x, label->size_cache.x); - self_size->y = LV_MAX(self_size->y, label->size_cache.y); - } - else if(code == LV_EVENT_DRAW_MAIN) { - draw_main(e); - } -} - -static void draw_main(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_label_t * label = (lv_label_t *)obj; - lv_layer_t * layer = lv_event_get_layer(e); - - lv_area_t txt_coords; - lv_obj_get_content_coords(obj, &txt_coords); - - lv_text_flag_t flag = get_label_flags(label); - - lv_draw_label_dsc_t label_draw_dsc; - lv_draw_label_dsc_init(&label_draw_dsc); - label_draw_dsc.text = label->text; - label_draw_dsc.ofs_x = label->offset.x; - label_draw_dsc.ofs_y = label->offset.y; -#if LV_LABEL_LONG_TXT_HINT - if(label->long_mode != LV_LABEL_LONG_SCROLL_CIRCULAR && lv_area_get_height(&txt_coords) >= LV_LABEL_HINT_HEIGHT_LIMIT) { - label_draw_dsc.hint = &label->hint; - } -#endif - - label_draw_dsc.flag = flag; - lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_draw_dsc); - lv_bidi_calculate_align(&label_draw_dsc.align, &label_draw_dsc.bidi_dir, label->text); - - label_draw_dsc.sel_start = lv_label_get_text_selection_start(obj); - label_draw_dsc.sel_end = lv_label_get_text_selection_end(obj); - if(label_draw_dsc.sel_start != LV_DRAW_LABEL_NO_TXT_SEL && label_draw_dsc.sel_end != LV_DRAW_LABEL_NO_TXT_SEL) { - label_draw_dsc.sel_color = lv_obj_get_style_text_color_filtered(obj, LV_PART_SELECTED); - label_draw_dsc.sel_bg_color = lv_obj_get_style_bg_color(obj, LV_PART_SELECTED); - } - - /* In SCROLL and SCROLL_CIRCULAR mode the CENTER and RIGHT are pointless, so remove them. - * (In addition, they will create misalignment in this situation)*/ - if((label->long_mode == LV_LABEL_LONG_SCROLL || label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) && - (label_draw_dsc.align == LV_TEXT_ALIGN_CENTER || label_draw_dsc.align == LV_TEXT_ALIGN_RIGHT)) { - lv_point_t size; - lv_text_get_size(&size, label->text, label_draw_dsc.font, label_draw_dsc.letter_space, label_draw_dsc.line_space, - LV_COORD_MAX, flag); - if(size.x > lv_area_get_width(&txt_coords)) { - label_draw_dsc.align = LV_TEXT_ALIGN_LEFT; - } - } - - lv_area_t txt_clip; - bool is_common = lv_area_intersect(&txt_clip, &txt_coords, &layer->_clip_area); - if(!is_common) { - return; - } - - if(label->long_mode == LV_LABEL_LONG_WRAP) { - int32_t s = lv_obj_get_scroll_top(obj); - lv_area_move(&txt_coords, 0, -s); - txt_coords.y2 = obj->coords.y2; - } - if(label->long_mode == LV_LABEL_LONG_SCROLL || label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) { - const lv_area_t clip_area_ori = layer->_clip_area; - layer->_clip_area = txt_clip; - lv_draw_label(layer, &label_draw_dsc, &txt_coords); - layer->_clip_area = clip_area_ori; - } - else { - lv_draw_label(layer, &label_draw_dsc, &txt_coords); - } - - lv_area_t clip_area_ori = layer->_clip_area; - layer->_clip_area = txt_clip; - - if(label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) { - lv_point_t size; - lv_text_get_size(&size, label->text, label_draw_dsc.font, label_draw_dsc.letter_space, label_draw_dsc.line_space, - LV_COORD_MAX, flag); - - /*Draw the text again on label to the original to make a circular effect */ - if(size.x > lv_area_get_width(&txt_coords)) { - label_draw_dsc.ofs_x = label->offset.x + size.x + - lv_font_get_glyph_width(label_draw_dsc.font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; - label_draw_dsc.ofs_y = label->offset.y; - - lv_draw_label(layer, &label_draw_dsc, &txt_coords); - } - - /*Draw the text again below the original to make a circular effect */ - if(size.y > lv_area_get_height(&txt_coords)) { - label_draw_dsc.ofs_x = label->offset.x; - label_draw_dsc.ofs_y = label->offset.y + size.y + lv_font_get_line_height(label_draw_dsc.font); - - lv_draw_label(layer, &label_draw_dsc, &txt_coords); - } - } - - layer->_clip_area = clip_area_ori; -} - -static void overwrite_anim_property(lv_anim_t * dest, const lv_anim_t * src, lv_label_long_mode_t mode) -{ - switch(mode) { - case LV_LABEL_LONG_SCROLL: - /** If the dest animation is already running, overwrite is not allowed */ - if(dest->act_time <= 0) - dest->act_time = src->act_time; - dest->repeat_cnt = src->repeat_cnt; - dest->repeat_delay = src->repeat_delay; - dest->completed_cb = src->completed_cb; - dest->playback_delay = src->playback_delay; - break; - case LV_LABEL_LONG_SCROLL_CIRCULAR: - /** If the dest animation is already running, overwrite is not allowed */ - if(dest->act_time <= 0) - dest->act_time = src->act_time; - dest->repeat_cnt = src->repeat_cnt; - dest->repeat_delay = src->repeat_delay; - dest->completed_cb = src->completed_cb; - break; - default: - break; - } -} - -/** - * Refresh the label with its text stored in its extended data - * @param label pointer to a label object - */ -static void lv_label_refr_text(lv_obj_t * obj) -{ - lv_label_t * label = (lv_label_t *)obj; - if(label->text == NULL) return; -#if LV_LABEL_LONG_TXT_HINT - label->hint.line_start = -1; /*The hint is invalid if the text changes*/ -#endif - label->invalid_size_cache = true; - - lv_area_t txt_coords; - lv_obj_get_content_coords(obj, &txt_coords); - int32_t max_w = lv_area_get_width(&txt_coords); - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); - - /*Calc. the height and longest line*/ - lv_point_t size; - lv_text_flag_t flag = get_label_flags(label); - - lv_text_get_size(&size, label->text, font, letter_space, line_space, max_w, flag); - - lv_obj_refresh_self_size(obj); - - /*In scroll mode start an offset animation*/ - if(label->long_mode == LV_LABEL_LONG_SCROLL) { - const lv_anim_t * anim_template = lv_obj_get_style_anim(obj, LV_PART_MAIN); - uint32_t anim_time = lv_obj_get_style_anim_duration(obj, LV_PART_MAIN); - if(anim_time == 0) anim_time = LV_LABEL_DEF_SCROLL_SPEED; - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, obj); - lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); - lv_anim_set_playback_delay(&a, LV_LABEL_SCROLL_DELAY); - lv_anim_set_repeat_delay(&a, a.playback_delay); - - bool hor_anim = false; - if(size.x > lv_area_get_width(&txt_coords)) { - int32_t start = 0; - int32_t end = 0; - -#if LV_USE_BIDI - lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); - - if(base_dir == LV_BASE_DIR_AUTO) - base_dir = lv_bidi_detect_base_dir(label->text); - - if(base_dir == LV_BASE_DIR_RTL) { - start = lv_area_get_width(&txt_coords) - size.x; - end = 0; - } - else { - start = 0; - end = lv_area_get_width(&txt_coords) - size.x; - } -#else - end = lv_area_get_width(&txt_coords) - size.x; -#endif - - lv_anim_set_values(&a, start, end); - lv_anim_set_exec_cb(&a, set_ofs_x_anim); - - lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_x_anim); - int32_t act_time = 0; - bool playback_now = false; - if(anim_cur) { - act_time = anim_cur->act_time; - playback_now = anim_cur->playback_now; - } - if(act_time < a.duration) { - a.act_time = act_time; /*To keep the old position*/ - a.early_apply = 0; - if(playback_now) { - a.playback_now = 1; - /*Swap the start and end values*/ - int32_t tmp; - tmp = a.start_value; - a.start_value = a.end_value; - a.end_value = tmp; - } - } - - lv_anim_set_duration(&a, anim_time); - lv_anim_set_playback_duration(&a, a.duration); - - /*If a template animation exists, overwrite some property*/ - if(anim_template) - overwrite_anim_property(&a, anim_template, label->long_mode); - lv_anim_start(&a); - hor_anim = true; - } - else { - /*Delete the offset animation if not required*/ - lv_anim_delete(obj, set_ofs_x_anim); - label->offset.x = 0; - } - - if(size.y > lv_area_get_height(&txt_coords) && hor_anim == false) { - lv_anim_set_values(&a, 0, lv_area_get_height(&txt_coords) - size.y - (lv_font_get_line_height(font))); - lv_anim_set_exec_cb(&a, set_ofs_y_anim); - - lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_y_anim); - int32_t act_time = 0; - bool playback_now = false; - if(anim_cur) { - act_time = anim_cur->act_time; - playback_now = anim_cur->playback_now; - } - if(act_time < a.duration) { - a.act_time = act_time; /*To keep the old position*/ - a.early_apply = 0; - if(playback_now) { - a.playback_now = 1; - /*Swap the start and end values*/ - int32_t tmp; - tmp = a.start_value; - a.start_value = a.end_value; - a.end_value = tmp; - } - } - - lv_anim_set_duration(&a, anim_time); - lv_anim_set_playback_duration(&a, a.duration); - - /*If a template animation exists, overwrite some property*/ - if(anim_template) - overwrite_anim_property(&a, anim_template, label->long_mode); - lv_anim_start(&a); - } - else { - /*Delete the offset animation if not required*/ - lv_anim_delete(obj, set_ofs_y_anim); - label->offset.y = 0; - } - } - /*In roll inf. mode keep the size but start offset animations*/ - else if(label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) { - const lv_anim_t * anim_template = lv_obj_get_style_anim(obj, LV_PART_MAIN); - uint32_t anim_time = lv_obj_get_style_anim_duration(obj, LV_PART_MAIN); - if(anim_time == 0) anim_time = LV_LABEL_DEF_SCROLL_SPEED; - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, obj); - lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); - - bool hor_anim = false; - if(size.x > lv_area_get_width(&txt_coords)) { -#if LV_USE_BIDI - int32_t start, end; - lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); - - if(base_dir == LV_BASE_DIR_AUTO) - base_dir = lv_bidi_detect_base_dir(label->text); - - if(base_dir == LV_BASE_DIR_RTL) { - start = -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; - end = 0; - } - else { - start = 0; - end = -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; - } - - lv_anim_set_values(&a, start, end); -#else - lv_anim_set_values(&a, 0, -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT); -#endif - lv_anim_set_exec_cb(&a, set_ofs_x_anim); - lv_anim_set_duration(&a, anim_time); - - lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_x_anim); - int32_t act_time = anim_cur ? anim_cur->act_time : 0; - - /*If a template animation exists, overwrite some property*/ - if(anim_template) { - overwrite_anim_property(&a, anim_template, label->long_mode); - } - else if(act_time < a.duration) { - a.act_time = act_time; /*To keep the old position when the label text is updated mid-scrolling*/ - a.early_apply = 0; - } - - lv_anim_start(&a); - hor_anim = true; - } - else { - /*Delete the offset animation if not required*/ - lv_anim_delete(obj, set_ofs_x_anim); - label->offset.x = 0; - } - - if(size.y > lv_area_get_height(&txt_coords) && hor_anim == false) { - lv_anim_set_values(&a, 0, -size.y - (lv_font_get_line_height(font))); - lv_anim_set_exec_cb(&a, set_ofs_y_anim); - lv_anim_set_duration(&a, anim_time); - - lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_y_anim); - int32_t act_time = anim_cur ? anim_cur->act_time : 0; - - /*If a template animation exists, overwrite some property*/ - if(anim_template) { - overwrite_anim_property(&a, anim_template, label->long_mode); - } - else if(act_time < a.duration) { - a.act_time = act_time; /*To keep the old position when the label text is updated mid-scrolling*/ - a.early_apply = 0; - } - - lv_anim_start(&a); - } - else { - /*Delete the offset animation if not required*/ - lv_anim_delete(obj, set_ofs_y_anim); - label->offset.y = 0; - } - } - else if(label->long_mode == LV_LABEL_LONG_DOT) { - if(size.y <= lv_area_get_height(&txt_coords)) { /*No dots are required, the text is short enough*/ - label->dot_end = LV_LABEL_DOT_END_INV; - } - else if(size.y <= lv_font_get_line_height(font)) { /*No dots are required for one-line texts*/ - label->dot_end = LV_LABEL_DOT_END_INV; - } - else if(lv_text_get_encoded_length(label->text) <= LV_LABEL_DOT_NUM) { /*Don't turn to dots all the characters*/ - label->dot_end = LV_LABEL_DOT_END_INV; - } - else { - lv_point_t p; - int32_t y_overed; - p.x = lv_area_get_width(&txt_coords) - - (lv_font_get_glyph_width(font, '.', '.') + letter_space) * - LV_LABEL_DOT_NUM; /*Shrink with dots*/ - p.y = lv_area_get_height(&txt_coords); - y_overed = p.y % - (lv_font_get_line_height(font) + line_space); /*Round down to the last line*/ - if(y_overed >= lv_font_get_line_height(font)) { - p.y -= y_overed; - p.y += lv_font_get_line_height(font); - } - else { - p.y -= y_overed; - p.y -= line_space; - } - - uint32_t letter_id = lv_label_get_letter_on(obj, &p, false); - - /*Be sure there is space for the dots*/ - size_t txt_len = lv_strlen(label->text); - uint32_t byte_id = lv_text_encoded_get_byte_id(label->text, letter_id); - while(byte_id + LV_LABEL_DOT_NUM > txt_len) { - lv_text_encoded_prev(label->text, &byte_id); - letter_id--; - } - - /*Save letters under the dots and replace them with dots*/ - uint32_t byte_id_ori = byte_id; - uint32_t i; - uint8_t len = 0; - for(i = 0; i <= LV_LABEL_DOT_NUM; i++) { - len += lv_text_encoded_size(&label->text[byte_id]); - lv_text_encoded_next(label->text, &byte_id); - if(len > LV_LABEL_DOT_NUM || byte_id > txt_len) { - break; - } - } - - if(lv_label_set_dot_tmp(obj, &label->text[byte_id_ori], len)) { - for(i = 0; i < LV_LABEL_DOT_NUM; i++) { - label->text[byte_id_ori + i] = '.'; - } - label->text[byte_id_ori + LV_LABEL_DOT_NUM] = '\0'; - label->dot_end = letter_id + LV_LABEL_DOT_NUM; - } - } - } - else if(label->long_mode == LV_LABEL_LONG_CLIP) { - /*Do nothing*/ - } - - lv_obj_invalidate(obj); -} - -static void lv_label_revert_dots(lv_obj_t * obj) -{ - lv_label_t * label = (lv_label_t *)obj; - - if(label->long_mode != LV_LABEL_LONG_DOT) return; - if(label->dot_end == LV_LABEL_DOT_END_INV) return; - - const uint32_t letter_i = label->dot_end - LV_LABEL_DOT_NUM; - const uint32_t byte_i = lv_text_encoded_get_byte_id(label->text, letter_i); - - /*Restore the characters*/ - uint8_t i = 0; - char * dot_tmp = lv_label_get_dot_tmp(obj); - while(label->text[byte_i + i] != '\0') { - label->text[byte_i + i] = dot_tmp[i]; - i++; - } - label->text[byte_i + i] = dot_tmp[i]; - - lv_label_dot_tmp_free(obj); - - label->dot_end = LV_LABEL_DOT_END_INV; -} - -/** - * Store `len` characters from `data`. Allocates space if necessary. - * - * @param label pointer to label object - * @param len Number of characters to store. - * @return true on success. - */ -static bool lv_label_set_dot_tmp(lv_obj_t * obj, char * data, uint32_t len) -{ - - lv_label_t * label = (lv_label_t *)obj; - lv_label_dot_tmp_free(obj); /*Deallocate any existing space*/ - if(len > sizeof(char *)) { - /*Memory needs to be allocated. Allocates an additional byte - *for a NULL-terminator so it can be copied.*/ - label->dot.tmp_ptr = lv_malloc(len + 1); - if(label->dot.tmp_ptr == NULL) { - LV_LOG_ERROR("Failed to allocate memory for dot_tmp_ptr"); - return false; - } - lv_memcpy(label->dot.tmp_ptr, data, len); - label->dot.tmp_ptr[len] = '\0'; - label->dot_tmp_alloc = true; - } - else { - /*Characters can be directly stored in object*/ - label->dot_tmp_alloc = false; - lv_memcpy(label->dot.tmp, data, len); - } - return true; -} - -/** - * Get the stored dot_tmp characters - * @param label pointer to label object - * @return char pointer to a stored characters. Is *not* necessarily NULL-terminated. - */ -static char * lv_label_get_dot_tmp(lv_obj_t * obj) -{ - lv_label_t * label = (lv_label_t *)obj; - if(label->dot_tmp_alloc) { - return label->dot.tmp_ptr; - } - else { - return label->dot.tmp; - } -} - -/** - * Free the dot_tmp_ptr field if it was previously allocated. - * Always clears the field - * @param label pointer to label object. - */ -static void lv_label_dot_tmp_free(lv_obj_t * obj) -{ - lv_label_t * label = (lv_label_t *)obj; - if(label->dot_tmp_alloc && label->dot.tmp_ptr) { - lv_free(label->dot.tmp_ptr); - } - label->dot_tmp_alloc = false; - label->dot.tmp_ptr = NULL; -} - -static void set_ofs_x_anim(void * obj, int32_t v) -{ - lv_label_t * label = (lv_label_t *)obj; - label->offset.x = v; - lv_obj_invalidate(obj); -} - -static void set_ofs_y_anim(void * obj, int32_t v) -{ - lv_label_t * label = (lv_label_t *)obj; - label->offset.y = v; - lv_obj_invalidate(obj); -} - -static size_t get_text_length(const char * text) -{ - size_t len = 0; -#if LV_USE_ARABIC_PERSIAN_CHARS - len = lv_text_ap_calc_bytes_count(text); -#else - len = lv_strlen(text) + 1; -#endif - - return len; -} - -static void copy_text_to_label(lv_label_t * label, const char * text) -{ -#if LV_USE_ARABIC_PERSIAN_CHARS - lv_text_ap_proc(text, label->text); -#else - lv_strcpy(label->text, text); -#endif -} - -static lv_text_flag_t get_label_flags(lv_label_t * label) -{ - lv_text_flag_t flag = LV_TEXT_FLAG_NONE; - - if(label->expand) flag |= LV_TEXT_FLAG_EXPAND; - - lv_obj_t * obj = (lv_obj_t *) label; - if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && - lv_obj_get_style_max_width(obj, LV_PART_MAIN) == LV_COORD_MAX && - !obj->w_layout) { - flag |= LV_TEXT_FLAG_FIT; - } - - return flag; -} - -/* Function created because of this pattern be used in multiple functions */ -static void calculate_x_coordinate(int32_t * x, const lv_text_align_t align, const char * txt, uint32_t length, - const lv_font_t * font, int32_t letter_space, lv_area_t * txt_coords) -{ - if(align == LV_TEXT_ALIGN_CENTER) { - const int32_t line_w = lv_text_get_width(txt, length, font, letter_space); - *x += lv_area_get_width(txt_coords) / 2 - line_w / 2; - } - else if(align == LV_TEXT_ALIGN_RIGHT) { - const int32_t line_w = lv_text_get_width(txt, length, font, letter_space); - *x += lv_area_get_width(txt_coords) - line_w; - } - else { - /* Nothing to do */ - } -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/label/lv_label.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/label/lv_label.h deleted file mode 100644 index 86964f3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/label/lv_label.h +++ /dev/null @@ -1,223 +0,0 @@ -/** - * @file lv_label.h - * - */ - -#ifndef LV_LABEL_H -#define LV_LABEL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -#if LV_USE_LABEL != 0 - -#include "../../misc/lv_types.h" -#include "../../core/lv_obj.h" -#include "../../font/lv_font.h" -#include "../../font/lv_symbol_def.h" -#include "../../misc/lv_text.h" -#include "../../draw/lv_draw.h" - -/********************* - * DEFINES - *********************/ -#define LV_LABEL_DOT_NUM 3 -#define LV_LABEL_POS_LAST 0xFFFF -#define LV_LABEL_TEXT_SELECTION_OFF LV_DRAW_LABEL_NO_TXT_SEL -#if LV_WIDGETS_HAS_DEFAULT_VALUE -#define LV_LABEL_DEFAULT_TEXT "Text" -#else -#define LV_LABEL_DEFAULT_TEXT "" -#endif - -LV_EXPORT_CONST_INT(LV_LABEL_DOT_NUM); -LV_EXPORT_CONST_INT(LV_LABEL_POS_LAST); -LV_EXPORT_CONST_INT(LV_LABEL_TEXT_SELECTION_OFF); - -/********************** - * TYPEDEFS - **********************/ - -/** Long mode behaviors. Used in 'lv_label_ext_t'*/ -typedef enum { - LV_LABEL_LONG_WRAP, /**< Keep the object width, wrap lines longer than object width and expand the object height*/ - LV_LABEL_LONG_DOT, /**< Keep the size and write dots at the end if the text is too long*/ - LV_LABEL_LONG_SCROLL, /**< Keep the size and roll the text back and forth*/ - LV_LABEL_LONG_SCROLL_CIRCULAR, /**< Keep the size and roll the text circularly*/ - LV_LABEL_LONG_CLIP, /**< Keep the size and clip the text out of it*/ -} lv_label_long_mode_t; - -#if LV_USE_OBJ_PROPERTY -enum { - LV_PROPERTY_ID(LABEL, TEXT, LV_PROPERTY_TYPE_TEXT, 0), - LV_PROPERTY_ID(LABEL, LONG_MODE, LV_PROPERTY_TYPE_INT, 1), - LV_PROPERTY_ID(LABEL, TEXT_SELECTION_START, LV_PROPERTY_TYPE_INT, 2), - LV_PROPERTY_ID(LABEL, TEXT_SELECTION_END, LV_PROPERTY_TYPE_INT, 3), - LV_PROPERTY_LABEL_END, -}; -#endif - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_label_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a label object - * @param parent pointer to an object, it will be the parent of the new label. - * @return pointer to the created button - */ -lv_obj_t * lv_label_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new text for a label. Memory will be allocated to store the text by the label. - * @param obj pointer to a label object - * @param text '\0' terminated character string. NULL to refresh with the current text. - */ -void lv_label_set_text(lv_obj_t * obj, const char * text); - -/** - * Set a new formatted text for a label. Memory will be allocated to store the text by the label. - * @param obj pointer to a label object - * @param fmt `printf`-like format - * - * Example: - * @code - * lv_label_set_text_fmt(label1, "%d user", user_num); - * @endcode - */ -void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...) LV_FORMAT_ATTRIBUTE(2, 3); - -/** - * Set a static text. It will not be saved by the label so the 'text' variable - * has to be 'alive' while the label exists. - * @param obj pointer to a label object - * @param text pointer to a text. NULL to refresh with the current text. - */ -void lv_label_set_text_static(lv_obj_t * obj, const char * text); - -/** - * Set the behavior of the label with text longer than the object size - * @param obj pointer to a label object - * @param long_mode the new mode from 'lv_label_long_mode' enum. - * In LV_LONG_WRAP/DOT/SCROLL/SCROLL_CIRC the size of the label should be set AFTER this function - */ -void lv_label_set_long_mode(lv_obj_t * obj, lv_label_long_mode_t long_mode); - -/** - * Set where text selection should start - * @param obj pointer to a label object - * @param index character index from where selection should start. `LV_LABEL_TEXT_SELECTION_OFF` for no selection - */ -void lv_label_set_text_selection_start(lv_obj_t * obj, uint32_t index); - -/** - * Set where text selection should end - * @param obj pointer to a label object - * @param index character index where selection should end. `LV_LABEL_TEXT_SELECTION_OFF` for no selection - */ -void lv_label_set_text_selection_end(lv_obj_t * obj, uint32_t index); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the text of a label - * @param obj pointer to a label object - * @return the text of the label - */ -char * lv_label_get_text(const lv_obj_t * obj); - -/** - * Get the long mode of a label - * @param obj pointer to a label object - * @return the current long mode - */ -lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * obj); - -/** - * Get the relative x and y coordinates of a letter - * @param obj pointer to a label object - * @param char_id index of the character [0 ... text length - 1]. - * Expressed in character index, not byte index (different in UTF-8) - * @param pos store the result here (E.g. index = 0 gives 0;0 coordinates if the text if aligned to the left) - */ -void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t * pos); - -/** - * Get the index of letter on a relative point of a label. - * @param obj pointer to label object - * @param pos_in pointer to point with coordinates on a the label - * @param bidi whether to use bidi processed - * @return The index of the letter on the 'pos_p' point (E.g. on 0;0 is the 0. letter if aligned to the left) - * Expressed in character index and not byte index (different in UTF-8) - */ -uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in, bool bidi); - -/** - * Check if a character is drawn under a point. - * @param obj pointer to a label object - * @param pos Point to check for character under - * @return whether a character is drawn under the point - */ -bool lv_label_is_char_under_pos(const lv_obj_t * obj, lv_point_t * pos); - -/** - * @brief Get the selection start index. - * @param obj pointer to a label object. - * @return selection start index. `LV_LABEL_TEXT_SELECTION_OFF` if nothing is selected. - */ -uint32_t lv_label_get_text_selection_start(const lv_obj_t * obj); - -/** - * @brief Get the selection end index. - * @param obj pointer to a label object. - * @return selection end index. `LV_LABEL_TXT_SEL_OFF` if nothing is selected. - */ -uint32_t lv_label_get_text_selection_end(const lv_obj_t * obj); - -/*===================== - * Other functions - *====================*/ - -/** - * Insert a text to a label. The label text cannot be static. - * @param obj pointer to a label object - * @param pos character index to insert. Expressed in character index and not byte index. - * 0: before first char. LV_LABEL_POS_LAST: after last char. - * @param txt pointer to the text to insert - */ -void lv_label_ins_text(lv_obj_t * obj, uint32_t pos, const char * txt); - -/** - * Delete characters from a label. The label text cannot be static. - * @param obj pointer to a label object - * @param pos character index from where to cut. Expressed in character index and not byte index. - * 0: start in front of the first character - * @param cnt number of characters to cut - */ -void lv_label_cut_text(lv_obj_t * obj, uint32_t pos, uint32_t cnt); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_LABEL*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LABEL_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/label/lv_label_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/label/lv_label_private.h deleted file mode 100644 index 81a2e68..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/label/lv_label_private.h +++ /dev/null @@ -1,73 +0,0 @@ -/** - * @file lv_label_private.h - * - */ - -#ifndef LV_LABEL_PRIVATE_H -#define LV_LABEL_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../draw/lv_draw_label_private.h" -#include "../../core/lv_obj_private.h" -#include "lv_label.h" - -#if LV_USE_LABEL != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_label_t { - lv_obj_t obj; - char * text; - union { - char * tmp_ptr; /**< Pointer to the allocated memory containing the character replaced by dots */ - char tmp[LV_LABEL_DOT_NUM + 1]; /**< Directly store the characters if <=4 characters */ - } dot; - uint32_t dot_end; /**< The real text length, used in dot mode */ - -#if LV_LABEL_LONG_TXT_HINT - lv_draw_label_hint_t hint; -#endif - -#if LV_LABEL_TEXT_SELECTION - uint32_t sel_start; - uint32_t sel_end; -#endif - - lv_point_t size_cache; /**< Text size cache */ - lv_point_t offset; /**< Text draw position offset */ - lv_label_long_mode_t long_mode : 3; /**< Determine what to do with the long texts */ - uint8_t static_txt : 1; /**< Flag to indicate the text is static */ - uint8_t expand : 1; /**< Ignore real width (used by the library with LV_LABEL_LONG_SCROLL) */ - uint8_t dot_tmp_alloc : 1; /**< 1: dot is allocated, 0: dot directly holds up to 4 chars */ - uint8_t invalid_size_cache : 1; /**< 1: Recalculate size and update cache */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_LABEL != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LABEL_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/led/lv_led.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/led/lv_led.c deleted file mode 100644 index 6a8c29b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/led/lv_led.c +++ /dev/null @@ -1,186 +0,0 @@ -/** - * @file lv_led.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_led_private.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_obj_class_private.h" - -#if LV_USE_LED - -#include "../../misc/lv_assert.h" -#include "../../themes/lv_theme.h" -#include "../../misc/lv_color.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_led_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_led_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_led_event(const lv_obj_class_t * class_p, lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_led_class = { - .base_class = &lv_obj_class, - .constructor_cb = lv_led_constructor, - .width_def = LV_DPI_DEF / 5, - .height_def = LV_DPI_DEF / 5, - .event_cb = lv_led_event, - .instance_size = sizeof(lv_led_t), - .name = "led", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_led_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_led_set_color(lv_obj_t * obj, lv_color_t color) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_led_t * led = (lv_led_t *)obj; - led->color = color; - lv_obj_invalidate(obj); -} - -void lv_led_set_brightness(lv_obj_t * obj, uint8_t bright) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_led_t * led = (lv_led_t *)obj; - if(led->bright == bright) return; - - led->bright = LV_CLAMP(LV_LED_BRIGHT_MIN, bright, LV_LED_BRIGHT_MAX); - - /*Invalidate the object there fore it will be redrawn*/ - lv_obj_invalidate(obj); -} - -void lv_led_on(lv_obj_t * led) -{ - lv_led_set_brightness(led, LV_LED_BRIGHT_MAX); -} - -void lv_led_off(lv_obj_t * led) -{ - lv_led_set_brightness(led, LV_LED_BRIGHT_MIN); -} - -void lv_led_toggle(lv_obj_t * obj) -{ - uint8_t bright = lv_led_get_brightness(obj); - if(bright > (LV_LED_BRIGHT_MIN + LV_LED_BRIGHT_MAX) >> 1) - lv_led_off(obj); - else - lv_led_on(obj); -} - -/*===================== - * Getter functions - *====================*/ - -uint8_t lv_led_get_brightness(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_led_t * led = (lv_led_t *)obj; - return led->bright; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_led_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_led_t * led = (lv_led_t *)obj; - led->color = lv_theme_get_color_primary(obj); - led->bright = LV_LED_BRIGHT_MAX; -} - -static void lv_led_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - - /* Call the ancestor's event handler */ - lv_event_code_t code = lv_event_get_code(e); - if(code != LV_EVENT_DRAW_MAIN && code != LV_EVENT_DRAW_MAIN_END) { - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - } - - lv_obj_t * obj = lv_event_get_current_target(e); - if(code == LV_EVENT_DRAW_MAIN) { - /*Make darker colors in a temporary style according to the brightness*/ - lv_led_t * led = (lv_led_t *)obj; - - lv_draw_rect_dsc_t rect_dsc; - lv_draw_rect_dsc_init(&rect_dsc); - lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &rect_dsc); - - /*Use the original colors brightness to modify color->led*/ - rect_dsc.bg_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.bg_color)); - rect_dsc.bg_grad.stops[0].color = lv_color_mix(led->color, lv_color_black(), - lv_color_brightness(rect_dsc.bg_grad.stops[0].color)); - rect_dsc.bg_grad.stops[1].color = lv_color_mix(led->color, lv_color_black(), - lv_color_brightness(rect_dsc.bg_grad.stops[1].color)); - rect_dsc.shadow_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.shadow_color)); - rect_dsc.border_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.border_color)); - rect_dsc.outline_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.outline_color)); - - /*Mix. the color with black proportionally with brightness*/ - rect_dsc.bg_color = lv_color_mix(rect_dsc.bg_color, lv_color_black(), led->bright); - rect_dsc.bg_grad.stops[0].color = lv_color_mix(rect_dsc.bg_grad.stops[0].color, lv_color_black(), led->bright); - rect_dsc.bg_grad.stops[1].color = lv_color_mix(rect_dsc.bg_grad.stops[1].color, lv_color_black(), led->bright); - rect_dsc.border_color = lv_color_mix(rect_dsc.border_color, lv_color_black(), led->bright); - rect_dsc.shadow_color = lv_color_mix(rect_dsc.shadow_color, lv_color_black(), led->bright); - rect_dsc.outline_color = lv_color_mix(rect_dsc.outline_color, lv_color_black(), led->bright); - - /*Set the current shadow width according to brightness proportionally between LV_LED_BRIGHT_OFF - * and LV_LED_BRIGHT_ON*/ - rect_dsc.shadow_width = ((led->bright - LV_LED_BRIGHT_MIN) * rect_dsc.shadow_width) / - (LV_LED_BRIGHT_MAX - LV_LED_BRIGHT_MIN); - rect_dsc.shadow_spread = ((led->bright - LV_LED_BRIGHT_MIN) * rect_dsc.shadow_spread) / - (LV_LED_BRIGHT_MAX - LV_LED_BRIGHT_MIN); - - lv_layer_t * layer = lv_event_get_layer(e); - - lv_draw_rect(layer, &rect_dsc, &obj->coords); - } -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/led/lv_led.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/led/lv_led.h deleted file mode 100644 index c085a97..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/led/lv_led.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - * @file lv_led.h - * - */ - -#ifndef LV_LED_H -#define LV_LED_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" - -#if LV_USE_LED - -/********************* - * DEFINES - *********************/ -/** Brightness when the LED if OFF */ -#ifndef LV_LED_BRIGHT_MIN -# define LV_LED_BRIGHT_MIN 80 -#endif - -/** Brightness when the LED if ON */ -#ifndef LV_LED_BRIGHT_MAX -# define LV_LED_BRIGHT_MAX 255 -#endif - -/********************** - * TYPEDEFS - **********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_led_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a led object - * @param parent pointer to an object, it will be the parent of the new led - * @return pointer to the created led - */ -lv_obj_t * lv_led_create(lv_obj_t * parent); - -/** - * Set the color of the LED - * @param led pointer to a LED object - * @param color the color of the LED - */ -void lv_led_set_color(lv_obj_t * led, lv_color_t color); - -/** - * Set the brightness of a LED object - * @param led pointer to a LED object - * @param bright LV_LED_BRIGHT_MIN (max. dark) ... LV_LED_BRIGHT_MAX (max. light) - */ -void lv_led_set_brightness(lv_obj_t * led, uint8_t bright); - -/** - * Light on a LED - * @param led pointer to a LED object - */ -void lv_led_on(lv_obj_t * led); - -/** - * Light off a LED - * @param led pointer to a LED object - */ -void lv_led_off(lv_obj_t * led); - -/** - * Toggle the state of a LED - * @param led pointer to a LED object - */ -void lv_led_toggle(lv_obj_t * led); - -/** - * Get the brightness of a LED object - * @param obj pointer to LED object - * @return bright 0 (max. dark) ... 255 (max. light) - */ -uint8_t lv_led_get_brightness(const lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_LED*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LED_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/led/lv_led_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/led/lv_led_private.h deleted file mode 100644 index af76b4f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/led/lv_led_private.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file lv_led_private.h - * - */ - -#ifndef LV_LED_PRIVATE_H -#define LV_LED_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_led.h" - -#if LV_USE_LED -#include "../../core/lv_obj_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Data of led */ -struct lv_led_t { - lv_obj_t obj; - lv_color_t color; - uint8_t bright; /**< Current brightness of the LED (0..255)*/ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_LED */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LED_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/line/lv_line.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/line/lv_line.c deleted file mode 100644 index a251aae..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/line/lv_line.c +++ /dev/null @@ -1,267 +0,0 @@ -/** - * @file lv_line.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_line_private.h" -#include "../../core/lv_obj_class_private.h" - - -#if LV_USE_LINE != 0 -#include "../../misc/lv_assert.h" -#include "../../misc/lv_math.h" -#include "../../misc/lv_types.h" -#include "../../draw/lv_draw.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_line_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_line_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void line_set_points(lv_obj_t * obj, const lv_point_precise_t points[], uint32_t point_num, bool mut); -static void lv_line_event(const lv_obj_class_t * class_p, lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_line_class = { - .constructor_cb = lv_line_constructor, - .event_cb = lv_line_event, - .width_def = LV_SIZE_CONTENT, - .height_def = LV_SIZE_CONTENT, - .instance_size = sizeof(lv_line_t), - .base_class = &lv_obj_class, - .name = "line", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_line_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_line_set_points(lv_obj_t * obj, const lv_point_precise_t points[], uint32_t point_num) -{ - line_set_points(obj, points, point_num, false); -} - -void lv_line_set_points_mutable(lv_obj_t * obj, lv_point_precise_t points[], uint32_t point_num) -{ - line_set_points(obj, points, point_num, true); -} - -void lv_line_set_y_invert(lv_obj_t * obj, bool en) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_line_t * line = (lv_line_t *)obj; - if(line->y_inv == en) return; - - line->y_inv = en ? 1U : 0U; - - lv_obj_invalidate(obj); -} - -/*===================== - * Getter functions - *====================*/ - -const lv_point_precise_t * lv_line_get_points(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_line_t * line = (lv_line_t *)obj; - return line->point_array.constant; -} - -uint32_t lv_line_get_point_count(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_line_t * line = (lv_line_t *)obj; - return line->point_num; -} - -bool lv_line_is_point_array_mutable(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_line_t * line = (lv_line_t *)obj; - return line->point_array_is_mutable; -} - -lv_point_precise_t * lv_line_get_points_mutable(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_line_t * line = (lv_line_t *)obj; - if(!line->point_array_is_mutable) { - LV_LOG_WARN("the line point array is not mutable"); - return NULL; - } - return line->point_array.mut; -} - -bool lv_line_get_y_invert(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_line_t * line = (lv_line_t *)obj; - - return line->y_inv == 1U; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_line_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_line_t * line = (lv_line_t *)obj; - - line->point_num = 0; - line->point_array.constant = NULL; - line->y_inv = 0; - line->point_array_is_mutable = 0; - - lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void line_set_points(lv_obj_t * obj, const lv_point_precise_t points[], uint32_t point_num, bool mut) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_line_t * line = (lv_line_t *)obj; - line->point_array.constant = points; - line->point_num = point_num; - line->point_array_is_mutable = mut; - - lv_obj_refresh_self_size(obj); - - lv_obj_invalidate(obj); -} - -static inline lv_value_precise_t resolve_point_coord(lv_value_precise_t coord, int32_t max) -{ - if(LV_COORD_IS_PCT((int32_t)coord)) { - return LV_CLAMP(0, max * LV_COORD_GET_PCT((int32_t)coord) / 100, max); - } - else { - return coord; - } -} - -static void lv_line_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - - /*Call the ancestor's event handler*/ - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - - if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - /*The corner of the skew lines is out of the intended area*/ - int32_t line_width = lv_obj_get_style_line_width(obj, LV_PART_MAIN); - int32_t * s = lv_event_get_param(e); - if(*s < line_width) *s = line_width; - } - else if(code == LV_EVENT_GET_SELF_SIZE) { - lv_line_t * line = (lv_line_t *)obj; - - if(line->point_num == 0 || line->point_array.constant == NULL) return; - - lv_point_t * p = lv_event_get_param(e); - int32_t w = 0; - int32_t h = 0; - - uint32_t i; - for(i = 0; i < line->point_num; i++) { - if(!LV_COORD_IS_PCT((int32_t)line->point_array.constant[i].x)) { - w = (int32_t)LV_MAX(line->point_array.constant[i].x, w); - } - - if(!LV_COORD_IS_PCT((int32_t)line->point_array.constant[i].y)) { - h = (int32_t)LV_MAX(line->point_array.constant[i].y, h); - } - } - - p->x = w; - p->y = h; - } - else if(code == LV_EVENT_DRAW_MAIN) { - lv_line_t * line = (lv_line_t *)obj; - lv_layer_t * layer = lv_event_get_layer(e); - - if(line->point_num == 0 || line->point_array.constant == NULL) return; - - lv_area_t area; - lv_obj_get_coords(obj, &area); - int32_t x_ofs = area.x1 - lv_obj_get_scroll_x(obj); - int32_t y_ofs = area.y1 - lv_obj_get_scroll_y(obj); - - lv_draw_line_dsc_t line_dsc; - lv_draw_line_dsc_init(&line_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &line_dsc); - - /*Read all points and draw the lines*/ - uint32_t i; - for(i = 0; i < line->point_num - 1; i++) { - int32_t w = lv_obj_get_width(obj); - int32_t h = lv_obj_get_height(obj); - - line_dsc.p1.x = resolve_point_coord(line->point_array.constant[i].x, w) + x_ofs; - line_dsc.p1.y = resolve_point_coord(line->point_array.constant[i].y, h); - - line_dsc.p2.x = resolve_point_coord(line->point_array.constant[i + 1].x, w) + x_ofs; - line_dsc.p2.y = resolve_point_coord(line->point_array.constant[i + 1].y, h); - - if(line->y_inv == 0) { - line_dsc.p1.y = line_dsc.p1.y + y_ofs; - line_dsc.p2.y = line_dsc.p2.y + y_ofs; - } - else { - line_dsc.p1.y = h - line_dsc.p1.y + y_ofs; - line_dsc.p2.y = h - line_dsc.p2.y + y_ofs; - } - - lv_draw_line(layer, &line_dsc); - line_dsc.round_start = 0; /*Draw the rounding only on the end points after the first line*/ - } - } -} -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/line/lv_line.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/line/lv_line.h deleted file mode 100644 index d6a1d60..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/line/lv_line.h +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @file lv_line.h - * - */ - -#ifndef LV_LINE_H -#define LV_LINE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" -#if LV_USE_LINE != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_line_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a line object - * @param parent pointer to an object, it will be the parent of the new line - * @return pointer to the created line - */ -lv_obj_t * lv_line_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set an array of points. The line object will connect these points. - * @param obj pointer to a line object - * @param points an array of points. Only the address is saved, so the array needs to be alive while the line exists - * @param point_num number of points in 'point_a' - */ -void lv_line_set_points(lv_obj_t * obj, const lv_point_precise_t points[], uint32_t point_num); - -/** - * Set a non-const array of points. Identical to `lv_line_set_points` except the array may be retrieved by `lv_line_get_points_mutable`. - * @param obj pointer to a line object - * @param points a non-const array of points. Only the address is saved, so the array needs to be alive while the line exists. - * @param point_num number of points in 'point_a' - */ -void lv_line_set_points_mutable(lv_obj_t * obj, lv_point_precise_t points[], uint32_t point_num); - -/** - * Enable (or disable) the y coordinate inversion. - * If enabled then y will be subtracted from the height of the object, - * therefore the y = 0 coordinate will be on the bottom. - * @param obj pointer to a line object - * @param en true: enable the y inversion, false:disable the y inversion - */ -void lv_line_set_y_invert(lv_obj_t * obj, bool en); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the pointer to the array of points. - * @param obj pointer to a line object - * @return const pointer to the array of points - */ -const lv_point_precise_t * lv_line_get_points(lv_obj_t * obj); - -/** - * Get the number of points in the array of points. - * @param obj pointer to a line object - * @return number of points in array of points - */ -uint32_t lv_line_get_point_count(lv_obj_t * obj); - -/** - * Check the mutability of the stored point array pointer. - * @param obj pointer to a line object - * @return true: the point array pointer is mutable, false: constant - */ -bool lv_line_is_point_array_mutable(lv_obj_t * obj); - -/** - * Get a pointer to the mutable array of points or NULL if it is not mutable - * @param obj pointer to a line object - * @return pointer to the array of points. NULL if not mutable. - */ -lv_point_precise_t * lv_line_get_points_mutable(lv_obj_t * obj); - -/** - * Get the y inversion attribute - * @param obj pointer to a line object - * @return true: y inversion is enabled, false: disabled - */ -bool lv_line_get_y_invert(const lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_LINE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LINE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/line/lv_line_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/line/lv_line_private.h deleted file mode 100644 index 4cbce9c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/line/lv_line_private.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @file lv_line_private.h - * - */ - -#ifndef LV_LINE_PRIVATE_H -#define LV_LINE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_line.h" - -#if LV_USE_LINE != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Data of line */ -struct lv_line_t { - lv_obj_t obj; - union { - const lv_point_precise_t * constant; - lv_point_precise_t * mut; - } point_array; /**< Pointer to an array with the points of the line*/ - uint32_t point_num; /**< Number of points in 'point_array'*/ - uint32_t y_inv : 1; /**< 1: y == 0 will be on the bottom*/ - uint32_t point_array_is_mutable : 1; /**< whether the point array is const or mutable*/ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_LINE != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LINE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/list/lv_list.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/list/lv_list.c deleted file mode 100644 index 3556ef1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/list/lv_list.c +++ /dev/null @@ -1,141 +0,0 @@ -/** - * @file lv_list.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj_class_private.h" -#include "lv_list.h" -#include "../../layouts/flex/lv_flex.h" -#include "../../display/lv_display.h" -#include "../label/lv_label.h" -#include "../image/lv_image.h" -#include "../button/lv_button.h" - -#if LV_USE_LIST - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_list_class) -#define MY_CLASS_BUTTON (&lv_list_button_class) -#define MY_CLASS_TEXT (&lv_list_text_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -const lv_obj_class_t lv_list_class = { - .base_class = &lv_obj_class, - .width_def = (LV_DPI_DEF * 3) / 2, - .height_def = LV_DPI_DEF * 2, - .name = "list", -}; - -const lv_obj_class_t lv_list_button_class = { - .base_class = &lv_button_class, - .width_def = LV_PCT(100), - .height_def = LV_SIZE_CONTENT, - .name = "list-btn", -}; - -const lv_obj_class_t lv_list_text_class = { - .base_class = &lv_label_class, - .width_def = LV_PCT(100), - .height_def = LV_SIZE_CONTENT, - .name = "list-text", -}; - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_list_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); - return obj; -} - -lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt) -{ - LV_LOG_INFO("begin"); - - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS_TEXT, list); - lv_obj_class_init_obj(obj); - lv_label_set_text(obj, txt); - return obj; -} - -lv_obj_t * lv_list_add_button(lv_obj_t * list, const void * icon, const char * txt) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS_BUTTON, list); - lv_obj_class_init_obj(obj); - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); - -#if LV_USE_IMAGE == 1 - if(icon) { - lv_obj_t * img = lv_image_create(obj); - lv_image_set_src(img, icon); - } -#endif - - if(txt) { - lv_obj_t * label = lv_label_create(obj); - lv_label_set_text(label, txt); - lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); - lv_obj_set_flex_grow(label, 1); - } - - return obj; -} - -const char * lv_list_get_button_text(lv_obj_t * list, lv_obj_t * btn) -{ - LV_UNUSED(list); - uint32_t i; - for(i = 0; i < lv_obj_get_child_count(btn); i++) { - lv_obj_t * child = lv_obj_get_child(btn, i); - if(lv_obj_check_type(child, &lv_label_class)) { - return lv_label_get_text(child); - } - - } - - return ""; -} - -void lv_list_set_button_text(lv_obj_t * list, lv_obj_t * btn, const char * txt) -{ - LV_UNUSED(list); - uint32_t i; - for(i = 0; i < lv_obj_get_child_count(btn); i++) { - lv_obj_t * child = lv_obj_get_child(btn, i); - if(lv_obj_check_type(child, &lv_label_class)) { - lv_label_set_text(child, txt); - return; - } - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_LIST*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/list/lv_list.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/list/lv_list.h deleted file mode 100644 index 0c3894d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/list/lv_list.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * @file lv_list.h - * - */ - -#ifndef LV_LIST_H -#define LV_LIST_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" - -#if LV_USE_LIST - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_list_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_list_text_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_list_button_class; -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a list object - * @param parent pointer to an object, it will be the parent of the new list - * @return pointer to the created list - */ -lv_obj_t * lv_list_create(lv_obj_t * parent); - -/** - * Add text to a list - * @param list pointer to a list, it will be the parent of the new label - * @param txt text of the new label - * @return pointer to the created label - */ -lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt); - -/** - * Add button to a list - * @param list pointer to a list, it will be the parent of the new button - * @param icon icon for the button, when NULL it will have no icon - * @param txt text of the new button, when NULL no text will be added - * @return pointer to the created button - */ -lv_obj_t * lv_list_add_button(lv_obj_t * list, const void * icon, const char * txt); - -/** - * Get text of a given list button - * @param list pointer to a list - * @param btn pointer to the button - * @return text of btn, if btn doesn't have text "" will be returned - */ -const char * lv_list_get_button_text(lv_obj_t * list, lv_obj_t * btn); - -/** - * Set text of a given list button - * @param list pointer to a list - * @param btn pointer to the button - * @param txt pointer to the text - */ -void lv_list_set_button_text(lv_obj_t * list, lv_obj_t * btn, const char * txt); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_LIST*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LIST_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/lottie/lv_lottie.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/lottie/lv_lottie.c deleted file mode 100644 index 48ae258..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/lottie/lv_lottie.c +++ /dev/null @@ -1,237 +0,0 @@ -/** - * @file lv_lottie.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_lottie_private.h" -#include "../../lv_conf_internal.h" -#if LV_USE_LOTTIE - -#if LV_USE_THORVG_EXTERNAL - #include -#else - #include "../../libs/thorvg/thorvg_capi.h" -#endif - -#include "../../misc/lv_timer.h" -#include "../../core/lv_obj_class_private.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_lottie_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_lottie_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_lottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void anim_exec_cb(void * var, int32_t v); -static void lottie_update(lv_lottie_t * lottie, int32_t v); - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_lottie_class = { - .constructor_cb = lv_lottie_constructor, - .destructor_cb = lv_lottie_destructor, - .width_def = LV_DPI_DEF, - .height_def = LV_DPI_DEF, - .instance_size = sizeof(lv_lottie_t), - .base_class = &lv_canvas_class, - .name = "lottie", -}; - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_lottie_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -void lv_lottie_set_buffer(lv_obj_t * obj, int32_t w, int32_t h, void * buf) -{ - lv_lottie_t * lottie = (lv_lottie_t *)obj; - int32_t stride = lv_draw_buf_width_to_stride(w, LV_COLOR_FORMAT_ARGB8888); - buf = lv_draw_buf_align(buf, LV_COLOR_FORMAT_ARGB8888); - - tvg_swcanvas_set_target(lottie->tvg_canvas, buf, stride / 4, w, h, TVG_COLORSPACE_ARGB8888); - tvg_canvas_push(lottie->tvg_canvas, lottie->tvg_paint); - lv_canvas_set_buffer(obj, buf, w, h, LV_COLOR_FORMAT_ARGB8888); - tvg_picture_set_size(lottie->tvg_paint, w, h); - - /* Rendered output images are premultiplied */ - lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); - lv_draw_buf_set_flag(draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED); - - /*Force updating when the buffer changes*/ - float f_current; - tvg_animation_get_frame(lottie->tvg_anim, &f_current); - anim_exec_cb(obj, (int32_t) f_current); -} - -void lv_lottie_set_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf) -{ - if(draw_buf->header.cf != LV_COLOR_FORMAT_ARGB8888) { - LV_LOG_WARN("The draw buf needs to have ARGB8888 color format"); - return; - } - - lv_lottie_t * lottie = (lv_lottie_t *)obj; - tvg_swcanvas_set_target(lottie->tvg_canvas, (void *)draw_buf->data, draw_buf->header.stride / 4, - draw_buf->header.w, draw_buf->header.h, TVG_COLORSPACE_ARGB8888); - tvg_canvas_push(lottie->tvg_canvas, lottie->tvg_paint); - lv_canvas_set_draw_buf(obj, draw_buf); - tvg_picture_set_size(lottie->tvg_paint, draw_buf->header.w, draw_buf->header.h); - - /* Rendered output images are premultiplied */ - lv_draw_buf_set_flag(draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED); - - /*Force updating when the buffer changes*/ - float f_current; - tvg_animation_get_frame(lottie->tvg_anim, &f_current); - anim_exec_cb(obj, (int32_t) f_current); -} - -void lv_lottie_set_src_data(lv_obj_t * obj, const void * src, size_t src_size) -{ - lv_lottie_t * lottie = (lv_lottie_t *)obj; - tvg_picture_load_data(lottie->tvg_paint, src, src_size, "lottie", true); - lv_draw_buf_t * canvas_draw_buf = lv_canvas_get_draw_buf(obj); - if(canvas_draw_buf) { - tvg_picture_set_size(lottie->tvg_paint, canvas_draw_buf->header.w, canvas_draw_buf->header.h); - } - - float f_total; - tvg_animation_get_total_frame(lottie->tvg_anim, &f_total); - lv_anim_set_time(lottie->anim, (int32_t)f_total * 1000 / 60); /*60 FPS*/ - lottie->anim->act_time = 0; - lottie->anim->end_value = (int32_t)f_total; - lottie->anim->playback_now = false; - lottie_update(lottie, 0); /*Render immediately*/ -} - -void lv_lottie_set_src_file(lv_obj_t * obj, const char * src) -{ - lv_lottie_t * lottie = (lv_lottie_t *)obj; - tvg_picture_load(lottie->tvg_paint, src); - lv_draw_buf_t * canvas_draw_buf = lv_canvas_get_draw_buf(obj); - if(canvas_draw_buf) { - tvg_picture_set_size(lottie->tvg_paint, canvas_draw_buf->header.w, canvas_draw_buf->header.h); - } - - float f_total; - tvg_animation_get_total_frame(lottie->tvg_anim, &f_total); - lv_anim_set_time(lottie->anim, (int32_t)f_total * 1000 / 60); /*60 FPS*/ - lottie->anim->act_time = 0; - lottie->anim->end_value = (int32_t)f_total; - lottie->anim->playback_now = false; - lottie_update(lottie, 0); /*Render immediately*/ -} - - -lv_anim_t * lv_lottie_get_anim(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_lottie_t * lottie = (lv_lottie_t *)obj; - return lottie->anim; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_lottie_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT); - - lv_lottie_t * lottie = (lv_lottie_t *)obj; - lottie->tvg_anim = tvg_animation_new(); - - lottie->tvg_paint = tvg_animation_get_picture(lottie->tvg_anim); - - lottie->tvg_canvas = tvg_swcanvas_create(); - - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_exec_cb(&a, anim_exec_cb); - lv_anim_set_var(&a, obj); - lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); - lottie->anim = lv_anim_start(&a); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_lottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_lottie_t * lottie = (lv_lottie_t *)obj; - - tvg_animation_del(lottie->tvg_anim); - tvg_canvas_destroy(lottie->tvg_canvas); -} - -static void anim_exec_cb(void * var, int32_t v) -{ - lv_lottie_t * lottie = var; - - /*Do not render not visible animations.*/ - if(lv_obj_is_visible(var)) { - lottie_update(lottie, v); - if(lottie->anim) { - lottie->last_rendered_time = lottie->anim->act_time; - } - } - else { - /*Artificially keep the animation on the last rendered frame's time - *To avoid a jump when the widget becomes visible*/ - if(lottie->anim) { - lottie->anim->act_time = lottie->last_rendered_time; - } - } -} - -static void lottie_update(lv_lottie_t * lottie, int32_t v) -{ - lv_obj_t * obj = (lv_obj_t *) lottie; - - lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); - if(draw_buf) { - lv_draw_buf_clear(draw_buf, NULL); - - /*Drop old cached image*/ - lv_image_cache_drop(lv_image_get_src(obj)); - } - - tvg_animation_set_frame(lottie->tvg_anim, v); - tvg_canvas_update(lottie->tvg_canvas); - tvg_canvas_draw(lottie->tvg_canvas); - tvg_canvas_sync(lottie->tvg_canvas); - - lv_obj_invalidate(obj); -} - -#endif /*LV_USE_LOTTIE*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/lottie/lv_lottie.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/lottie/lv_lottie.h deleted file mode 100644 index 1ccfe16..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/lottie/lv_lottie.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - * @file lv_lottie.h - * - */ - -#ifndef LV_LOTTIE_H -#define LV_LOTTIE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_types.h" -#if LV_USE_LOTTIE - -/*Testing of dependencies*/ -#if LV_USE_CANVAS == 0 -#error "lv_lottie: lv_canvas is required. Enable it in lv_conf.h (LV_USE_CANVAS 1)" -#endif - -#if LV_USE_THORVG == 0 -#error "lv_lottie: ThorVG is required. Enable it in lv_conf.h (LV_USE_THORVG_INTERNAL/EXTERNAL 1)" -#endif - -#include "../../draw/lv_draw_buf.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a lottie animation - * @param parent pointer to the parent widget - * @return pointer to the created Lottie animation widget - */ -lv_obj_t * lv_lottie_create(lv_obj_t * parent); - -/** - * Set a buffer for the animation. It also defines the size of the animation - * @param obj pointer to a lottie widget - * @param w width of the animation and buffer - * @param h height of the animation and buffer - * @param buf a static buffer with `width x height x 4` byte size - */ -void lv_lottie_set_buffer(lv_obj_t * obj, int32_t w, int32_t h, void * buf); - -/** - * Set a draw buffer for the animation. It also defines the size of the animation - * @param obj pointer to a lottie widget - * @param draw_buf an initialized draw buffer with ARGB8888 color format - */ -void lv_lottie_set_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf); - -/** - * Set the source for the animation as an array - * @param obj pointer to a lottie widget - * @param src the lottie animation converted to an nul terminated array - * @param src_size size of the source array in bytes - */ -void lv_lottie_set_src_data(lv_obj_t * obj, const void * src, size_t src_size); - -/** - * Set the source for the animation as a path. - * Lottie doesn't use LVGL's File System API. - * @param obj pointer to a lottie widget - * @param src path to a json file, e.g. "path/to/file.json" - */ -void lv_lottie_set_src_file(lv_obj_t * obj, const char * src); - -/** - * Get the LVGL animation which controls the lottie animation - * @param obj pointer to a lottie widget - * @return the LVGL animation - */ -lv_anim_t * lv_lottie_get_anim(lv_obj_t * obj); - -/********************** - * GLOBAL VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_LOTTIE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LOTTIE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/lottie/lv_lottie_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/lottie/lv_lottie_private.h deleted file mode 100644 index 6362afb..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/lottie/lv_lottie_private.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file lv_lottie_private.h - * - */ - -#ifndef LV_LOTTIE_PRIVATE_H -#define LV_LOTTIE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../lv_conf_internal.h" -#if LV_USE_LOTTIE - -#include "lv_lottie.h" -#include "../canvas/lv_canvas_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -#if LV_USE_THORVG_EXTERNAL -#include -#else -#include "../../libs/thorvg/thorvg_capi.h" -#endif - -typedef struct { - lv_canvas_t canvas; - Tvg_Paint * tvg_paint; - Tvg_Canvas * tvg_canvas; - Tvg_Animation * tvg_anim; - lv_anim_t * anim; - int32_t last_rendered_time; -} lv_lottie_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_LOTTIE_H*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_LOTTIE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/menu/lv_menu.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/menu/lv_menu.c deleted file mode 100644 index f9b49fc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/menu/lv_menu.c +++ /dev/null @@ -1,823 +0,0 @@ -/** - * @file lv_menu.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_menu_private.h" -#include "../../core/lv_obj_class_private.h" - -#if LV_USE_MENU - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_menu_class) - -#include "../../core/lv_obj_private.h" -#include "../../layouts/lv_layout.h" -#include "../../stdlib/lv_string.h" -#include "../label/lv_label.h" -#include "../button/lv_button.h" -#include "../image/lv_image.h" - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_menu_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_menu_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_menu_page_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_menu_page_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_menu_cont_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_menu_section_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); - -const lv_obj_class_t lv_menu_class = { - .constructor_cb = lv_menu_constructor, - .destructor_cb = lv_menu_destructor, - .base_class = &lv_obj_class, - .width_def = (LV_DPI_DEF * 3) / 2, - .height_def = LV_DPI_DEF * 2, - .instance_size = sizeof(lv_menu_t), - .name = "menu", -}; -const lv_obj_class_t lv_menu_page_class = { - .constructor_cb = lv_menu_page_constructor, - .destructor_cb = lv_menu_page_destructor, - .base_class = &lv_obj_class, - .width_def = LV_PCT(100), - .height_def = LV_SIZE_CONTENT, - .instance_size = sizeof(lv_menu_page_t), - .name = "menu-page", -}; - -const lv_obj_class_t lv_menu_cont_class = { - .constructor_cb = lv_menu_cont_constructor, - .base_class = &lv_obj_class, - .width_def = LV_PCT(100), - .height_def = LV_SIZE_CONTENT, - .name = "menu-cont", -}; - -const lv_obj_class_t lv_menu_section_class = { - .constructor_cb = lv_menu_section_constructor, - .base_class = &lv_obj_class, - .width_def = LV_PCT(100), - .height_def = LV_SIZE_CONTENT, - .name = "menu-section", -}; - -const lv_obj_class_t lv_menu_separator_class = { - .base_class = &lv_obj_class, - .width_def = LV_SIZE_CONTENT, - .height_def = LV_SIZE_CONTENT, - .name = "menu-separator", -}; - -const lv_obj_class_t lv_menu_sidebar_cont_class = { - .base_class = &lv_obj_class, -}; - -const lv_obj_class_t lv_menu_main_cont_class = { - .base_class = &lv_obj_class, -}; - -const lv_obj_class_t lv_menu_main_header_cont_class = { - .base_class = &lv_obj_class, -}; - -const lv_obj_class_t lv_menu_sidebar_header_cont_class = { - .base_class = &lv_obj_class, -}; - -static void lv_menu_refr(lv_obj_t * obj); -static void lv_menu_refr_sidebar_header_mode(lv_obj_t * obj); -static void lv_menu_refr_main_header_mode(lv_obj_t * obj); -static void lv_menu_load_page_event_cb(lv_event_t * e); -static void lv_menu_obj_delete_event_cb(lv_event_t * e); -static void lv_menu_back_event_cb(lv_event_t * e); -static void lv_menu_value_changed_event_cb(lv_event_t * e); -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ -bool lv_menu_item_back_button_is_root(lv_obj_t * menu, lv_obj_t * obj); -void lv_menu_clear_history(lv_obj_t * obj); - -lv_obj_t * lv_menu_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -lv_obj_t * lv_menu_page_create(lv_obj_t * parent, char const * const title) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_page_class, parent); - lv_obj_class_init_obj(obj); - - lv_menu_page_t * page = (lv_menu_page_t *)obj; - /* Initialise the object */ - page->title = NULL; - page->static_title = false; - lv_menu_set_page_title(obj, title); - - return obj; -} - -lv_obj_t * lv_menu_cont_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_cont_class, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -lv_obj_t * lv_menu_section_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_section_class, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -lv_obj_t * lv_menu_separator_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_separator_class, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -void lv_menu_refr(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - lv_ll_t * history_ll = &(menu->history_ll); - - /* The current menu */ - lv_menu_history_t * act_hist = lv_ll_get_head(history_ll); - - lv_obj_t * page = NULL; - - if(act_hist != NULL) { - page = act_hist->page; - /* Delete the current item from the history */ - lv_ll_remove(history_ll, act_hist); - lv_free(act_hist); - menu->cur_depth--; - } - - /* Set it */ - lv_menu_set_page(obj, page); -} - -/*===================== - * Setter functions - *====================*/ - -void lv_menu_set_page(lv_obj_t * obj, lv_obj_t * page) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - - /* Hide previous page */ - if(menu->main_page != NULL) { - lv_obj_set_parent(menu->main_page, menu->storage); - } - - if(page != NULL) { - /* Add a new node */ - lv_ll_t * history_ll = &(menu->history_ll); - lv_menu_history_t * new_node = lv_ll_ins_head(history_ll); - LV_ASSERT_MALLOC(new_node); - new_node->page = page; - menu->cur_depth++; - - /* Place page in main */ - lv_obj_set_parent(page, menu->main); - } - else { - /* Empty page, clear history */ - lv_menu_clear_history(obj); - } - - menu->main_page = page; - - /* If there is a selected tab, update checked state */ - if(menu->selected_tab != NULL) { - if(menu->sidebar_page != NULL) { - lv_obj_add_state(menu->selected_tab, LV_STATE_CHECKED); - } - else { - lv_obj_remove_state(menu->selected_tab, LV_STATE_CHECKED); - } - } - - /* Back btn management */ - if(menu->sidebar_page != NULL) { - /* With sidebar enabled */ - if(menu->sidebar_generated) { - if(menu->mode_root_back_btn == LV_MENU_ROOT_BACK_BUTTON_ENABLED) { - /* Root back btn is always shown if enabled*/ - lv_obj_remove_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_HIDDEN); - lv_obj_add_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_CLICKABLE); - } - else { - lv_obj_add_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_HIDDEN); - lv_obj_remove_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_CLICKABLE); - } - } - - if(menu->cur_depth >= 2) { - lv_obj_remove_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); - lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); - } - else { - lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); - lv_obj_remove_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); - } - } - else { - /* With sidebar disabled */ - if(menu->cur_depth >= 2 || menu->mode_root_back_btn == LV_MENU_ROOT_BACK_BUTTON_ENABLED) { - lv_obj_remove_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); - lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); - } - else { - lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); - lv_obj_remove_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); - } - } - - lv_obj_send_event((lv_obj_t *)menu, LV_EVENT_VALUE_CHANGED, NULL); - - lv_menu_refr_main_header_mode(obj); -} - -void lv_menu_set_sidebar_page(lv_obj_t * obj, lv_obj_t * page) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - - /* Sidebar management*/ - if(page != NULL) { - /* Sidebar should be enabled */ - if(!menu->sidebar_generated) { - /* Create sidebar */ - lv_obj_t * sidebar_cont = lv_obj_class_create_obj(&lv_menu_sidebar_cont_class, obj); - lv_obj_class_init_obj(sidebar_cont); - lv_obj_move_to_index(sidebar_cont, 1); - lv_obj_set_size(sidebar_cont, LV_PCT(30), LV_PCT(100)); - lv_obj_set_flex_flow(sidebar_cont, LV_FLEX_FLOW_COLUMN); - lv_obj_add_flag(sidebar_cont, LV_OBJ_FLAG_EVENT_BUBBLE); - lv_obj_remove_flag(sidebar_cont, LV_OBJ_FLAG_CLICKABLE); - menu->sidebar = sidebar_cont; - - lv_obj_t * sidebar_header = lv_obj_class_create_obj(&lv_menu_sidebar_header_cont_class, sidebar_cont); - lv_obj_class_init_obj(sidebar_header); - lv_obj_set_size(sidebar_header, LV_PCT(100), LV_SIZE_CONTENT); - lv_obj_set_flex_flow(sidebar_header, LV_FLEX_FLOW_ROW); - lv_obj_set_flex_align(sidebar_header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - lv_obj_remove_flag(sidebar_header, LV_OBJ_FLAG_CLICKABLE); - lv_obj_add_flag(sidebar_header, LV_OBJ_FLAG_EVENT_BUBBLE); - menu->sidebar_header = sidebar_header; - - lv_obj_t * sidebar_header_back_btn = lv_button_create(menu->sidebar_header); - lv_obj_add_event_cb(sidebar_header_back_btn, lv_menu_back_event_cb, LV_EVENT_CLICKED, menu); - lv_obj_add_flag(sidebar_header_back_btn, LV_OBJ_FLAG_EVENT_BUBBLE); - lv_obj_set_flex_flow(sidebar_header_back_btn, LV_FLEX_FLOW_ROW); - menu->sidebar_header_back_btn = sidebar_header_back_btn; - - lv_obj_t * sidebar_header_back_icon = lv_image_create(menu->sidebar_header_back_btn); - lv_image_set_src(sidebar_header_back_icon, LV_SYMBOL_LEFT); - - lv_obj_t * sidebar_header_title = lv_label_create(menu->sidebar_header); - lv_obj_add_flag(sidebar_header_title, LV_OBJ_FLAG_HIDDEN); - menu->sidebar_header_title = sidebar_header_title; - - menu->sidebar_generated = true; - } - - lv_obj_set_parent(page, menu->sidebar); - - lv_menu_refr_sidebar_header_mode(obj); - } - else { - /* Sidebar should be disabled */ - if(menu->sidebar_generated) { - lv_obj_set_parent(menu->sidebar_page, menu->storage); - lv_obj_delete(menu->sidebar); - - menu->sidebar_generated = false; - } - } - - menu->sidebar_page = page; - lv_menu_refr(obj); -} - -void lv_menu_set_mode_header(lv_obj_t * obj, lv_menu_mode_header_t mode) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - - if(menu->mode_header != mode) { - menu->mode_header = mode; - lv_menu_refr_main_header_mode(obj); - if(menu->sidebar_generated) lv_menu_refr_sidebar_header_mode(obj); - } -} - -void lv_menu_set_mode_root_back_button(lv_obj_t * obj, lv_menu_mode_root_back_button_t mode) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - - if(menu->mode_root_back_btn != mode) { - menu->mode_root_back_btn = mode; - lv_menu_refr(obj); - } -} - -void lv_menu_set_load_page_event(lv_obj_t * menu, lv_obj_t * obj, lv_obj_t * page) -{ - LV_ASSERT_OBJ(menu, MY_CLASS); - - lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); - - /* Remove old event */ - uint32_t i; - uint32_t event_cnt = lv_obj_get_event_count(obj); - for(i = 0; i < event_cnt; i++) { - lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(obj, i); - if(lv_event_dsc_get_cb(event_dsc) == lv_menu_load_page_event_cb) { - lv_obj_send_event(obj, LV_EVENT_DELETE, NULL); - lv_obj_remove_event(obj, i); - break; - } - } - - lv_menu_load_page_event_data_t * event_data = lv_malloc(sizeof(lv_menu_load_page_event_data_t)); - event_data->menu = menu; - event_data->page = page; - - lv_obj_add_event_cb(obj, lv_menu_load_page_event_cb, LV_EVENT_CLICKED, event_data); - lv_obj_add_event_cb(obj, lv_menu_obj_delete_event_cb, LV_EVENT_DELETE, event_data); -} - -void lv_menu_set_page_title(lv_obj_t * page_obj, char const * const title) -{ - LV_LOG_INFO("begin"); - lv_menu_page_t * page = (lv_menu_page_t *)page_obj; - - /* Cleanup any previous set titles */ - if((!page->static_title) && page->title) { - lv_free(page->title); - page->title = NULL; - } - - if(title) { - page->static_title = false; - page->title = lv_strdup(title); - LV_ASSERT_MALLOC(page->title); - if(page->title == NULL) { - return; - } - } - else { - page->title = NULL; - page->static_title = false; - } -} - -void lv_menu_set_page_title_static(lv_obj_t * page_obj, char const * const title) -{ - LV_LOG_INFO("begin"); - lv_menu_page_t * page = (lv_menu_page_t *)page_obj; - - /* Cleanup any previous set titles */ - if((!page->static_title) && page->title) { - lv_free(page->title); - page->title = NULL; - } - - /* Set or clear the static title text */ - if(title) { - page->title = (char *) title; - page->static_title = true; - } - else { - page->title = NULL; - page->static_title = false; - } -} - -/*===================== - * Getter functions - *====================*/ -lv_obj_t * lv_menu_get_cur_main_page(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - return menu->main_page; -} - -lv_obj_t * lv_menu_get_cur_sidebar_page(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - return menu->sidebar_page; -} - -lv_obj_t * lv_menu_get_main_header(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - return menu->main_header; -} - -lv_obj_t * lv_menu_get_main_header_back_button(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - return menu->main_header_back_btn; -} - -lv_obj_t * lv_menu_get_sidebar_header(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - return menu->sidebar_header; -} - -lv_obj_t * lv_menu_get_sidebar_header_back_button(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - return menu->sidebar_header_back_btn; -} - -bool lv_menu_back_button_is_root(lv_obj_t * menu, lv_obj_t * obj) -{ - LV_ASSERT_OBJ(menu, MY_CLASS); - - if(obj == ((lv_menu_t *)menu)->sidebar_header_back_btn) { - return true; - } - - if(obj == ((lv_menu_t *)menu)->main_header_back_btn && ((lv_menu_t *)menu)->prev_depth <= 1) { - return true; - } - - return false; -} - -void lv_menu_clear_history(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - lv_ll_t * history_ll = &(menu->history_ll); - - lv_ll_clear(history_ll); - - menu->cur_depth = 0; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_menu_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_obj_set_layout(obj, LV_LAYOUT_FLEX); - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); - - lv_menu_t * menu = (lv_menu_t *)obj; - - menu->mode_header = LV_MENU_HEADER_TOP_FIXED; - menu->mode_root_back_btn = LV_MENU_ROOT_BACK_BUTTON_DISABLED; - menu->cur_depth = 0; - menu->prev_depth = 0; - menu->sidebar_generated = false; - - lv_ll_init(&(menu->history_ll), sizeof(lv_menu_history_t)); - - menu->storage = lv_obj_create(obj); - lv_obj_add_flag(menu->storage, LV_OBJ_FLAG_HIDDEN); - - menu->sidebar = NULL; - menu->sidebar_header = NULL; - menu->sidebar_header_back_btn = NULL; - menu->sidebar_header_title = NULL; - menu->sidebar_page = NULL; - - lv_obj_t * main_cont = lv_obj_class_create_obj(&lv_menu_main_cont_class, obj); - lv_obj_class_init_obj(main_cont); - lv_obj_set_height(main_cont, LV_PCT(100)); - lv_obj_set_flex_grow(main_cont, 1); - lv_obj_set_flex_flow(main_cont, LV_FLEX_FLOW_COLUMN); - lv_obj_add_flag(main_cont, LV_OBJ_FLAG_EVENT_BUBBLE); - lv_obj_remove_flag(main_cont, LV_OBJ_FLAG_CLICKABLE); - menu->main = main_cont; - - lv_obj_t * main_header = lv_obj_class_create_obj(&lv_menu_main_header_cont_class, main_cont); - lv_obj_class_init_obj(main_header); - lv_obj_set_size(main_header, LV_PCT(100), LV_SIZE_CONTENT); - lv_obj_set_flex_flow(main_header, LV_FLEX_FLOW_ROW); - lv_obj_set_flex_align(main_header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - lv_obj_remove_flag(main_header, LV_OBJ_FLAG_CLICKABLE); - lv_obj_add_flag(main_header, LV_OBJ_FLAG_EVENT_BUBBLE); - menu->main_header = main_header; - - /* Create the default simple back btn and title */ - lv_obj_t * main_header_back_btn = lv_button_create(menu->main_header); - lv_obj_add_event_cb(main_header_back_btn, lv_menu_back_event_cb, LV_EVENT_CLICKED, menu); - lv_obj_add_flag(main_header_back_btn, LV_OBJ_FLAG_EVENT_BUBBLE); - lv_obj_set_flex_flow(main_header_back_btn, LV_FLEX_FLOW_ROW); - menu->main_header_back_btn = main_header_back_btn; - - lv_obj_t * main_header_back_icon = lv_image_create(menu->main_header_back_btn); - lv_image_set_src(main_header_back_icon, LV_SYMBOL_LEFT); - - lv_obj_t * main_header_title = lv_label_create(menu->main_header); - lv_obj_add_flag(main_header_title, LV_OBJ_FLAG_HIDDEN); - menu->main_header_title = main_header_title; - - menu->main_page = NULL; - menu->selected_tab = NULL; - - lv_obj_add_event_cb(obj, lv_menu_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, menu); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_menu_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_menu_t * menu = (lv_menu_t *)obj; - lv_ll_t * history_ll = &(menu->history_ll); - - lv_ll_clear(history_ll); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_menu_page_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - - lv_menu_t * menu = (lv_menu_t *)lv_obj_get_parent(obj); - - lv_obj_set_parent(obj, ((lv_menu_t *)menu)->storage); - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); - lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE); -} - -static void lv_menu_page_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - - lv_menu_page_t * page = (lv_menu_page_t *)obj; - - if((!page->static_title) && page->title != NULL) { - lv_free(page->title); - } - page->title = NULL; - page->static_title = false; -} - -static void lv_menu_cont_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); - lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); -} - -static void lv_menu_section_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); -} - -static void lv_menu_refr_sidebar_header_mode(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - - if(menu->sidebar_header == NULL || menu->sidebar_page == NULL) return; - - switch(menu->mode_header) { - case LV_MENU_HEADER_TOP_FIXED: - /* Content should fill the remaining space */ - lv_obj_move_to_index(menu->sidebar_header, 0); - lv_obj_set_flex_grow(menu->sidebar_page, 1); - break; - case LV_MENU_HEADER_TOP_UNFIXED: - lv_obj_move_to_index(menu->sidebar_header, 0); - lv_obj_set_flex_grow(menu->sidebar_page, 0); - break; - case LV_MENU_HEADER_BOTTOM_FIXED: - lv_obj_move_to_index(menu->sidebar_header, 1); - lv_obj_set_flex_grow(menu->sidebar_page, 1); - break; - } - - lv_obj_refr_size(menu->sidebar_header); - lv_obj_refr_size(menu->sidebar_page); - - if(lv_obj_get_content_height(menu->sidebar_header) == 0) { - lv_obj_add_flag(menu->sidebar_header, LV_OBJ_FLAG_HIDDEN); - } - else { - lv_obj_remove_flag(menu->sidebar_header, LV_OBJ_FLAG_HIDDEN); - } -} - -static void lv_menu_refr_main_header_mode(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_menu_t * menu = (lv_menu_t *)obj; - - if(menu->main_header == NULL || menu->main_page == NULL) return; - - switch(menu->mode_header) { - case LV_MENU_HEADER_TOP_FIXED: - /* Content should fill the remaining space */ - lv_obj_move_to_index(menu->main_header, 0); - lv_obj_set_flex_grow(menu->main_page, 1); - break; - case LV_MENU_HEADER_TOP_UNFIXED: - lv_obj_move_to_index(menu->main_header, 0); - lv_obj_set_flex_grow(menu->main_page, 0); - break; - case LV_MENU_HEADER_BOTTOM_FIXED: - lv_obj_move_to_index(menu->main_header, 1); - lv_obj_set_flex_grow(menu->main_page, 1); - break; - } - - lv_obj_refr_size(menu->main_header); - lv_obj_refr_size(menu->main_page); - lv_obj_update_layout(menu->main_header); - - if(lv_obj_get_content_height(menu->main_header) == 0) { - lv_obj_add_flag(menu->main_header, LV_OBJ_FLAG_HIDDEN); - } - else { - lv_obj_remove_flag(menu->main_header, LV_OBJ_FLAG_HIDDEN); - } -} - -static void lv_menu_load_page_event_cb(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_menu_load_page_event_data_t * event_data = lv_event_get_user_data(e); - lv_menu_t * menu = (lv_menu_t *)(event_data->menu); - lv_obj_t * page = event_data->page; - - if(menu->sidebar_page != NULL) { - /* Check if clicked obj is in the sidebar */ - bool sidebar = false; - lv_obj_t * parent = obj; - - while(parent) { - if(parent == (lv_obj_t *)menu) break; - if(parent == menu->sidebar) { - sidebar = true; - break; - } - parent = lv_obj_get_parent(parent); - } - - if(sidebar) { - /* Clear checked state of previous obj */ - if(menu->selected_tab != obj && menu->selected_tab != NULL) { - lv_obj_remove_state(menu->selected_tab, LV_STATE_CHECKED); - } - - lv_menu_clear_history((lv_obj_t *)menu); - - menu->selected_tab = obj; - } - } - - lv_menu_set_page((lv_obj_t *)menu, page); - - if(lv_group_get_default() != NULL && menu->sidebar_page == NULL) { - /* Sidebar is not supported for now*/ - lv_group_focus_next(lv_group_get_default()); - } -} - -static void lv_menu_obj_delete_event_cb(lv_event_t * e) -{ - lv_menu_load_page_event_data_t * event_data = lv_event_get_user_data(e); - lv_free(event_data); -} - -static void lv_menu_back_event_cb(lv_event_t * e) -{ - lv_event_code_t code = lv_event_get_code(e); - /* LV_EVENT_CLICKED */ - if(code == LV_EVENT_CLICKED) { - lv_obj_t * obj = lv_event_get_current_target(e); - lv_menu_t * menu = (lv_menu_t *)lv_event_get_user_data(e); - - if(!(obj == menu->main_header_back_btn || obj == menu->sidebar_header_back_btn)) return; - - menu->prev_depth = menu->cur_depth; /* Save the previous value for user event handler */ - - if(lv_menu_back_button_is_root((lv_obj_t *)menu, obj)) return; - - lv_ll_t * history_ll = &(menu->history_ll); - - /* The current menu */ - lv_menu_history_t * act_hist = lv_ll_get_head(history_ll); - - /* The previous menu */ - lv_menu_history_t * prev_hist = lv_ll_get_next(history_ll, act_hist); - - if(prev_hist != NULL) { - /* Previous menu exists */ - /* Delete the current item from the history */ - lv_ll_remove(history_ll, act_hist); - lv_free(act_hist); - menu->cur_depth--; - /* Create the previous menu. - * Remove it from the history because `lv_menu_set_page` will add it again */ - lv_ll_remove(history_ll, prev_hist); - menu->cur_depth--; - lv_menu_set_page(&(menu->obj), prev_hist->page); - - lv_free(prev_hist); - } - } -} - -static void lv_menu_value_changed_event_cb(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_user_data(e); - lv_menu_t * menu = (lv_menu_t *)obj; - - lv_menu_page_t * main_page = (lv_menu_page_t *)lv_menu_get_cur_main_page(obj); - if(main_page != NULL && menu->main_header_title != NULL) { - if(main_page->title != NULL) { - lv_label_set_text(menu->main_header_title, main_page->title); - lv_obj_remove_flag(menu->main_header_title, LV_OBJ_FLAG_HIDDEN); - } - else { - lv_obj_add_flag(menu->main_header_title, LV_OBJ_FLAG_HIDDEN); - } - } - - lv_menu_page_t * sidebar_page = (lv_menu_page_t *)lv_menu_get_cur_sidebar_page(obj); - if(sidebar_page != NULL && menu->sidebar_header_title != NULL) { - if(sidebar_page->title != NULL) { - lv_label_set_text(menu->sidebar_header_title, sidebar_page->title); - lv_obj_remove_flag(menu->sidebar_header_title, LV_OBJ_FLAG_HIDDEN); - } - else { - lv_obj_add_flag(menu->sidebar_header_title, LV_OBJ_FLAG_HIDDEN); - } - } -} -#endif /*LV_USE_MENU*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/menu/lv_menu.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/menu/lv_menu.h deleted file mode 100644 index 3d75f8d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/menu/lv_menu.h +++ /dev/null @@ -1,213 +0,0 @@ -/** - * @file lv_menu.h - * - */ - -#ifndef LV_MENU_H -#define LV_MENU_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" - -#if LV_USE_MENU - -#if LV_USE_FLEX == 0 -#error "LV_USE_FLEX needs to be enabled" -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef enum { - LV_MENU_HEADER_TOP_FIXED, /**< Header is positioned at the top */ - LV_MENU_HEADER_TOP_UNFIXED, /**< Header is positioned at the top and can be scrolled out of view*/ - LV_MENU_HEADER_BOTTOM_FIXED /**< Header is positioned at the bottom */ -} lv_menu_mode_header_t; - -typedef enum { - LV_MENU_ROOT_BACK_BUTTON_DISABLED, - LV_MENU_ROOT_BACK_BUTTON_ENABLED -} lv_menu_mode_root_back_button_t; - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_page_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_cont_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_section_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_separator_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_sidebar_cont_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_main_cont_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_sidebar_header_cont_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_main_header_cont_class; -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a menu object - * @param parent pointer to an object, it will be the parent of the new menu - * @return pointer to the created menu - */ -lv_obj_t * lv_menu_create(lv_obj_t * parent); - -/** - * Create a menu page object - * @param parent pointer to menu object - * @param title pointer to text for title in header (NULL to not display title) - * @return pointer to the created menu page - */ -lv_obj_t * lv_menu_page_create(lv_obj_t * parent, char const * const title); - -/** - * Create a menu cont object - * @param parent pointer to an object, it will be the parent of the new menu cont object - * @return pointer to the created menu cont - */ -lv_obj_t * lv_menu_cont_create(lv_obj_t * parent); - -/** - * Create a menu section object - * @param parent pointer to an object, it will be the parent of the new menu section object - * @return pointer to the created menu section - */ -lv_obj_t * lv_menu_section_create(lv_obj_t * parent); - -/** - * Create a menu separator object - * @param parent pointer to an object, it will be the parent of the new menu separator object - * @return pointer to the created menu separator - */ -lv_obj_t * lv_menu_separator_create(lv_obj_t * parent); -/*===================== - * Setter functions - *====================*/ -/** - * Set menu page to display in main - * @param obj pointer to the menu - * @param page pointer to the menu page to set (NULL to clear main and clear menu history) - */ -void lv_menu_set_page(lv_obj_t * obj, lv_obj_t * page); - -/** - * Set menu page title - * @param page pointer to the menu page - * @param title pointer to text for title in header (NULL to not display title) - */ -void lv_menu_set_page_title(lv_obj_t * page, char const * const title); - -/** - * Set menu page title with a static text. It will not be saved by the label so the 'text' variable - * has to be 'alive' while the page exists. - * @param page pointer to the menu page - * @param title pointer to text for title in header (NULL to not display title) - */ -void lv_menu_set_page_title_static(lv_obj_t * page, char const * const title); - -/** - * Set menu page to display in sidebar - * @param obj pointer to the menu - * @param page pointer to the menu page to set (NULL to clear sidebar) - */ -void lv_menu_set_sidebar_page(lv_obj_t * obj, lv_obj_t * page); - -/** - * Set the how the header should behave and its position - * @param obj pointer to a menu - * @param mode LV_MENU_HEADER_TOP_FIXED/TOP_UNFIXED/BOTTOM_FIXED - */ -void lv_menu_set_mode_header(lv_obj_t * obj, lv_menu_mode_header_t mode); - -/** - * Set whether back button should appear at root - * @param obj pointer to a menu - * @param mode LV_MENU_ROOT_BACK_BUTTON_DISABLED/ENABLED - */ -void lv_menu_set_mode_root_back_button(lv_obj_t * obj, lv_menu_mode_root_back_button_t mode); - -/** - * Add menu to the menu item - * @param menu pointer to the menu - * @param obj pointer to the obj - * @param page pointer to the page to load when obj is clicked - */ -void lv_menu_set_load_page_event(lv_obj_t * menu, lv_obj_t * obj, lv_obj_t * page); - -/*===================== - * Getter functions - *====================*/ -/** -* Get a pointer to menu page that is currently displayed in main -* @param obj pointer to the menu -* @return pointer to current page -*/ -lv_obj_t * lv_menu_get_cur_main_page(lv_obj_t * obj); - -/** -* Get a pointer to menu page that is currently displayed in sidebar -* @param obj pointer to the menu -* @return pointer to current page -*/ -lv_obj_t * lv_menu_get_cur_sidebar_page(lv_obj_t * obj); - -/** -* Get a pointer to main header obj -* @param obj pointer to the menu -* @return pointer to main header obj -*/ -lv_obj_t * lv_menu_get_main_header(lv_obj_t * obj); - -/** -* Get a pointer to main header back btn obj -* @param obj pointer to the menu -* @return pointer to main header back btn obj -*/ -lv_obj_t * lv_menu_get_main_header_back_button(lv_obj_t * obj); - -/** -* Get a pointer to sidebar header obj -* @param obj pointer to the menu -* @return pointer to sidebar header obj -*/ -lv_obj_t * lv_menu_get_sidebar_header(lv_obj_t * obj); - -/** -* Get a pointer to sidebar header obj -* @param obj pointer to the menu -* @return pointer to sidebar header back btn obj -*/ -lv_obj_t * lv_menu_get_sidebar_header_back_button(lv_obj_t * obj); - -/** - * Check if an obj is a root back btn - * @param menu pointer to the menu - * @param obj pointer to the back button - * @return true if it is a root back btn - */ -bool lv_menu_back_button_is_root(lv_obj_t * menu, lv_obj_t * obj); - -/** - * Clear menu history - * @param obj pointer to the menu - */ -void lv_menu_clear_history(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_MENU*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_MENU_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/menu/lv_menu_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/menu/lv_menu_private.h deleted file mode 100644 index fca898d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/menu/lv_menu_private.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @file lv_menu_private.h - * - */ - -#ifndef LV_MENU_PRIVATE_H -#define LV_MENU_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_menu.h" - -#if LV_USE_MENU - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_menu_load_page_event_data_t { - lv_obj_t * menu; - lv_obj_t * page; -}; - -struct lv_menu_history_t { - lv_obj_t * page; -}; - -struct lv_menu_t { - lv_obj_t obj; - lv_obj_t * storage; /**< a pointer to obj that is the parent of all pages not displayed */ - lv_obj_t * main; - lv_obj_t * main_page; - lv_obj_t * main_header; - lv_obj_t * - main_header_back_btn; /**< a pointer to obj that on click triggers back btn event handler, can be same as 'main_header' */ - lv_obj_t * main_header_title; - lv_obj_t * sidebar; - lv_obj_t * sidebar_page; - lv_obj_t * sidebar_header; - lv_obj_t * - sidebar_header_back_btn; /**< a pointer to obj that on click triggers back btn event handler, can be same as 'sidebar_header' */ - lv_obj_t * sidebar_header_title; - lv_obj_t * selected_tab; - lv_ll_t history_ll; - uint8_t cur_depth; - uint8_t prev_depth; - uint8_t sidebar_generated : 1; - lv_menu_mode_header_t mode_header : 2; - lv_menu_mode_root_back_button_t mode_root_back_btn : 1; -}; - -struct lv_menu_page_t { - lv_obj_t obj; - char * title; - bool static_title; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_MENU */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_MENU_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/msgbox/lv_msgbox.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/msgbox/lv_msgbox.c deleted file mode 100644 index 98ad81e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/msgbox/lv_msgbox.c +++ /dev/null @@ -1,294 +0,0 @@ -/** - * @file lv_msgbox.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_msgbox_private.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_MSGBOX - -#include "../label/lv_label.h" -#include "../button/lv_button.h" -#include "../image/lv_image.h" -#include "../../misc/lv_assert.h" -#include "../../display/lv_display.h" -#include "../../layouts/flex/lv_flex.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define LV_MSGBOX_FLAG_AUTO_PARENT LV_OBJ_FLAG_WIDGET_1 /*Mark that the parent was automatically created*/ -#define MY_CLASS (&lv_msgbox_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void msgbox_close_click_event_cb(lv_event_t * e); -static void msgbox_size_changed_event_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_msgbox_class = { - .base_class = &lv_obj_class, - .width_def = LV_DPI_DEF * 2, - .height_def = LV_SIZE_CONTENT, - .instance_size = sizeof(lv_msgbox_t), - .name = "msgbox", -}; - -const lv_obj_class_t lv_msgbox_header_class = { - .base_class = &lv_obj_class, - .width_def = LV_PCT(100), - .height_def = LV_DPI_DEF / 3, - .instance_size = sizeof(lv_obj_t), - .name = "msgbox-header", -}; - -const lv_obj_class_t lv_msgbox_content_class = { - .base_class = &lv_obj_class, - .width_def = LV_PCT(100), - .height_def = LV_SIZE_CONTENT, - .instance_size = sizeof(lv_obj_t), - .name = "msgbox-content", -}; - -const lv_obj_class_t lv_msgbox_footer_class = { - .base_class = &lv_obj_class, - .width_def = LV_PCT(100), - .height_def = LV_DPI_DEF / 3, - .instance_size = sizeof(lv_obj_t), - .name = "msgbox-footer", -}; - -const lv_obj_class_t lv_msgbox_footer_button_class = { - .base_class = &lv_obj_class, - .width_def = LV_SIZE_CONTENT, - .height_def = LV_PCT(100), - .instance_size = sizeof(lv_obj_t), - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .name = "msgbox-footer-button", -}; - -const lv_obj_class_t lv_msgbox_header_button_class = { - .base_class = &lv_obj_class, - .width_def = LV_DPI_DEF / 3, - .height_def = LV_PCT(100), - .instance_size = sizeof(lv_obj_t), - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .name = "msgbox-header-button", -}; - -const lv_obj_class_t lv_msgbox_backdrop_class = { - .base_class = &lv_obj_class, - .width_def = LV_PCT(100), - .height_def = LV_PCT(100), - .instance_size = sizeof(lv_obj_t), - .name = "msgbox-backdrop", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_msgbox_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - bool auto_parent = false; - if(parent == NULL) { - auto_parent = true; - parent = lv_obj_class_create_obj(&lv_msgbox_backdrop_class, lv_layer_top()); - LV_ASSERT_MALLOC(parent); - lv_obj_class_init_obj(parent); - lv_obj_remove_flag(parent, LV_OBJ_FLAG_IGNORE_LAYOUT); - lv_obj_set_size(parent, LV_PCT(100), LV_PCT(100)); - } - - lv_obj_t * obj = lv_obj_class_create_obj(&lv_msgbox_class, parent); - LV_ASSERT_MALLOC(obj); - if(obj == NULL) return NULL; - lv_obj_class_init_obj(obj); - lv_msgbox_t * mbox = (lv_msgbox_t *)obj; - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); - - if(auto_parent) lv_obj_add_flag(obj, LV_MSGBOX_FLAG_AUTO_PARENT); - - mbox->content = lv_obj_class_create_obj(&lv_msgbox_content_class, obj); - LV_ASSERT_MALLOC(obj); - if(mbox->content == NULL) return NULL; - lv_obj_class_init_obj(mbox->content); - lv_obj_set_flex_flow(mbox->content, LV_FLEX_FLOW_COLUMN); - lv_obj_add_event_cb(obj, msgbox_size_changed_event_cb, LV_EVENT_SIZE_CHANGED, 0); - - lv_obj_center(obj); - return obj; -} - -lv_obj_t * lv_msgbox_add_title(lv_obj_t * obj, const char * title) -{ - lv_msgbox_t * mbox = (lv_msgbox_t *)obj; - if(mbox->header == NULL) { - mbox->header = lv_obj_class_create_obj(&lv_msgbox_header_class, obj); - LV_ASSERT_MALLOC(obj); - if(mbox->header == NULL) return NULL; - lv_obj_class_init_obj(mbox->header); - - lv_obj_set_size(mbox->header, lv_pct(100), lv_display_get_dpi(lv_obj_get_display(obj)) / 3); - lv_obj_set_flex_flow(mbox->header, LV_FLEX_FLOW_ROW); - lv_obj_set_flex_align(mbox->header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - lv_obj_remove_flag(mbox->header, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_move_to_index(mbox->header, 0); - } - - if(mbox->title == NULL) { - mbox->title = lv_label_create(mbox->header); - lv_obj_set_flex_grow(mbox->title, 1); - } - - lv_label_set_text(mbox->title, title); - - return mbox->title; -} - -lv_obj_t * lv_msgbox_add_header_button(lv_obj_t * obj, const void * icon) -{ - lv_msgbox_t * mbox = (lv_msgbox_t *)obj; - if(mbox->header == NULL) { - lv_msgbox_add_title(obj, ""); /*Just to push the buttons to the right*/ - } - - lv_obj_t * btn = lv_obj_class_create_obj(&lv_msgbox_header_button_class, mbox->header); - LV_ASSERT_MALLOC(obj); - if(btn == NULL) return NULL; - lv_obj_class_init_obj(btn); - lv_obj_remove_flag(btn, LV_OBJ_FLAG_SCROLLABLE); - - if(icon) { - lv_obj_t * img = lv_image_create(btn); - lv_image_set_src(img, icon); - lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); - } - - return btn; -} - -lv_obj_t * lv_msgbox_add_text(lv_obj_t * obj, const char * text) -{ - lv_msgbox_t * mbox = (lv_msgbox_t *)obj; - - lv_obj_t * label = lv_label_create(mbox->content); - lv_label_set_text(label, text); - lv_obj_set_width(label, lv_pct(100)); - - return label; -} - -lv_obj_t * lv_msgbox_add_footer_button(lv_obj_t * obj, const char * text) -{ - lv_msgbox_t * mbox = (lv_msgbox_t *)obj; - if(mbox->footer == NULL) { - mbox->footer = lv_obj_class_create_obj(&lv_msgbox_footer_class, obj); - LV_ASSERT_MALLOC(obj); - if(mbox->footer == NULL) return NULL; - lv_obj_class_init_obj(mbox->footer); - - lv_obj_set_flex_flow(mbox->footer, LV_FLEX_FLOW_ROW); - lv_obj_set_flex_align(mbox->footer, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - lv_obj_remove_flag(mbox->footer, LV_OBJ_FLAG_SCROLLABLE); - } - - lv_obj_t * btn = lv_obj_class_create_obj(&lv_msgbox_footer_button_class, mbox->footer); - LV_ASSERT_MALLOC(obj); - if(btn == NULL) return NULL; - lv_obj_class_init_obj(btn); - lv_obj_remove_flag(btn, LV_OBJ_FLAG_SCROLLABLE); - - if(text) { - lv_obj_t * label = lv_label_create(btn); - lv_label_set_text(label, text); - lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); - } - - return btn; -} - -lv_obj_t * lv_msgbox_add_close_button(lv_obj_t * obj) -{ - lv_obj_t * btn = lv_msgbox_add_header_button(obj, LV_SYMBOL_CLOSE); - lv_obj_add_event_cb(btn, msgbox_close_click_event_cb, LV_EVENT_CLICKED, NULL); - return btn; -} - -lv_obj_t * lv_msgbox_get_header(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_msgbox_t * mbox = (lv_msgbox_t *)obj; - return mbox->header; -} - -lv_obj_t * lv_msgbox_get_footer(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_msgbox_t * mbox = (lv_msgbox_t *)obj; - return mbox->footer; -} - -lv_obj_t * lv_msgbox_get_content(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_msgbox_t * mbox = (lv_msgbox_t *)obj; - return mbox->content; -} - -lv_obj_t * lv_msgbox_get_title(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_msgbox_t * mbox = (lv_msgbox_t *)obj; - return mbox->title; -} - -void lv_msgbox_close(lv_obj_t * obj) -{ - if(lv_obj_has_flag(obj, LV_MSGBOX_FLAG_AUTO_PARENT)) lv_obj_delete(lv_obj_get_parent(obj)); - else lv_obj_delete(obj); -} - -void lv_msgbox_close_async(lv_obj_t * obj) -{ - if(lv_obj_has_flag(obj, LV_MSGBOX_FLAG_AUTO_PARENT)) lv_obj_delete_async(lv_obj_get_parent(obj)); - else lv_obj_delete_async(obj); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void msgbox_close_click_event_cb(lv_event_t * e) -{ - lv_obj_t * btn = lv_event_get_current_target(e); - lv_obj_t * mbox = lv_obj_get_parent(lv_obj_get_parent(btn)); - lv_msgbox_close(mbox); -} - -static void msgbox_size_changed_event_cb(lv_event_t * e) -{ - lv_obj_t * mbox = lv_event_get_target(e); - lv_obj_t * content = lv_msgbox_get_content(mbox); - bool is_msgbox_height_size_content = (lv_obj_get_style_height(mbox, 0) == LV_SIZE_CONTENT); - lv_obj_set_flex_grow(content, !is_msgbox_height_size_content); -} - -#endif /*LV_USE_MSGBOX*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/msgbox/lv_msgbox.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/msgbox/lv_msgbox.h deleted file mode 100644 index 5605b80..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/msgbox/lv_msgbox.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * @file lv_msgbox.h - * - */ - -#ifndef LV_MSGBOX_H -#define LV_MSGBOX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" - -#if LV_USE_MSGBOX - -/*Testing of dependencies*/ -#if LV_USE_BUTTONMATRIX == 0 -#error "lv_mbox: lv_buttonmatrix is required. Enable it in lv_conf.h (LV_USE_BUTTONMATRIX 1) " -#endif - -#if LV_USE_LABEL == 0 -#error "lv_mbox: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " -#endif - -/********************* - * DEFINES - *********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_header_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_content_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_footer_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_header_button_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_footer_button_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_backdrop_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an empty message box - * @param parent the parent or NULL to create a modal msgbox - * @return the created message box - */ -lv_obj_t * lv_msgbox_create(lv_obj_t * parent); - -/** - * Add title to the message box. It also creates a header for the title. - * @param obj pointer to a message box - * @param title the text of the tile - * @return the created title label - */ -lv_obj_t * lv_msgbox_add_title(lv_obj_t * obj, const char * title); - -/** - * Add a button to the header of to the message box. It also creates a header. - * @param obj pointer to a message box - * @param icon the icon of the button - * @return the created button - */ -lv_obj_t * lv_msgbox_add_header_button(lv_obj_t * obj, const void * icon); - -/** - * Add a text to the content area of message box. Multiple texts will be created below each other. - * @param obj pointer to a message box - * @param text text to add - * @return the created button - */ -lv_obj_t * lv_msgbox_add_text(lv_obj_t * obj, const char * text); - -/** - * Add a button to the footer of to the message box. It also creates a footer. - * @param obj pointer to a message box - * @param text the text of the button - * @return the created button - */ -lv_obj_t * lv_msgbox_add_footer_button(lv_obj_t * obj, const char * text); - -/** - * Add a close button to the message box. It also creates a header. - * @param obj pointer to a message box - * @return the created close button - */ -lv_obj_t * lv_msgbox_add_close_button(lv_obj_t * obj); - -/** - * Get the header widget - * @param obj pointer to a message box - * @return the header, or NULL if not exists - */ -lv_obj_t * lv_msgbox_get_header(lv_obj_t * obj); - -/** - * Get the footer widget - * @param obj pointer to a message box - * @return the footer, or NULL if not exists - */ -lv_obj_t * lv_msgbox_get_footer(lv_obj_t * obj); - -/** - * Get the content widget - * @param obj pointer to a message box - * @return the content - */ -lv_obj_t * lv_msgbox_get_content(lv_obj_t * obj); - -/** - * Get the title label - * @param obj pointer to a message box - * @return the title, or NULL if it does not exist - */ -lv_obj_t * lv_msgbox_get_title(lv_obj_t * obj); - -/** - * Close a message box - * @param mbox pointer to a message box - */ -void lv_msgbox_close(lv_obj_t * mbox); - -/** - * Close a message box in the next call of the message box - * @param mbox pointer to a message box - */ -void lv_msgbox_close_async(lv_obj_t * mbox); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_MSGBOX*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_MSGBOX_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/msgbox/lv_msgbox_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/msgbox/lv_msgbox_private.h deleted file mode 100644 index 640a39c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/msgbox/lv_msgbox_private.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @file lv_msgbox_private.h - * - */ - -#ifndef LV_MSGBOX_PRIVATE_H -#define LV_MSGBOX_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_msgbox.h" - -#if LV_USE_MSGBOX -#include "../../core/lv_obj_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_msgbox_t { - lv_obj_t obj; - lv_obj_t * header; - lv_obj_t * content; - lv_obj_t * footer; - lv_obj_t * title; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_MSGBOX */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_MSGBOX_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/objx_templ/lv_objx_templ.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/objx_templ/lv_objx_templ.c deleted file mode 100644 index eaf5c12..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/objx_templ/lv_objx_templ.c +++ /dev/null @@ -1,141 +0,0 @@ -/** - * @file lv_templ.c - * - */ - -/** - * TODO Remove these instructions - * Search and replace: templ -> object short name with lower case(e.g. btn, label etc) - * TEMPL -> object short name with upper case (e.g. BTN, LABEL etc.) - * - * You can remove the defined() clause from the #if statement below. This exists because - * LV_USE_TEMPL is not in lv_conf.h or lv_conf_template.h by default. - */ - -/********************* - * INCLUDES - *********************/ -//#include "lv_templ.h" /*TODO uncomment this*/ - -#if defined(LV_USE_TEMPL) && LV_USE_TEMPL != 0 - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_templ_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_templ_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_templ_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_templ_event(const lv_obj_class_t * class_p, lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_templ_class = { - .constructor_cb = lv_templ_constructor, - .destructor_cb = lv_templ_destructor, - .event_cb = lv_templ_event, - .width_def = LV_DPI_DEF, - .height_def = LV_DPI_DEF, - .instance_size = sizeof(lv_templ_t), - .group_def = LV_OBJ_CLASS_GROUP_DEF_INHERIT, - .editable = LV_OBJ_CLASS_EDITABLE_INHERIT, - .base_class = &lv_templ_class, - .name = "templ", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_templ_create(lv_obj_t * parent) -{ - - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*====================== - * Add/remove functions - *=====================*/ - -/* - * New object specific "add" or "remove" functions come here - */ - -/*===================== - * Setter functions - *====================*/ - -/* - * New object specific "set" functions come here - */ - -/*===================== - * Getter functions - *====================*/ - -/* - * New object specific "get" functions come here - */ - -/*===================== - * Other functions - *====================*/ - -/* - * New object specific "other" functions come here - */ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_templ_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_templ_t * templ = (lv_templ_t *)obj; - /*Initialize the widget's data*/ - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_templ_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - lv_templ_t * templ = (lv_templ_t *)obj; - /*Free the widget specific data*/ -} - -static void lv_templ_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - - /*Call the ancestor's event handler*/ - res = LV_EVENT_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - /*Add the widget specific event handling here*/ -} - -#else /*Enable this file at the top*/ - -/*This dummy typedef exists purely to silence -Wpedantic.*/ -typedef int keep_pedantic_happy; -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/objx_templ/lv_objx_templ.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/objx_templ/lv_objx_templ.h deleted file mode 100644 index ccf1e1c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/objx_templ/lv_objx_templ.h +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @file lv_templ.h - * - */ - -/** - * TODO Remove these instructions - * Search and replace: templ -> object short name with lower case(e.g. btn, label etc) - * TEMPL -> object short name with upper case (e.g. BTN, LABEL etc.) - * - */ - -#ifndef LV_TEMPL_H -#define LV_TEMPL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_conf_internal.h" - -#if LV_USE_TEMPL != 0 - -#include "../core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -/*Data of template*/ -typedef struct { - lv_ANCESTOR_t ancestor; /*The ancestor widget, e.g. lv_slider_t slider*/ - /*New data for this type*/ -} lv_templ_t; - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_templ_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a templ object - * @param parent pointer to an object, it will be the parent of the new templ - * @return pointer to the created bar - */ -lv_obj_t * lv_templ_create(lv_obj_t * parent); - -/*====================== - * Add/remove functions - *=====================*/ - -/*===================== - * Setter functions - *====================*/ - -/*===================== - * Getter functions - *====================*/ - -/*===================== - * Other functions - *====================*/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_TEMPL*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TEMPL_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_dropdown_properties.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_dropdown_properties.c deleted file mode 100644 index 9477ca3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_dropdown_properties.c +++ /dev/null @@ -1,31 +0,0 @@ - -/** - * GENERATED FILE, DO NOT EDIT IT! - * @file lv_dropdown_properties.c - */ - -#include "../dropdown/lv_dropdown.h" - -#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME - -#if LV_USE_DROPDOWN -/** - * Dropdown widget property names, name must be in order. - * Generated code from properties.py - */ -/* *INDENT-OFF* */ -const lv_property_name_t lv_dropdown_property_names[9] = { - {"dir", LV_PROPERTY_DROPDOWN_DIR,}, - {"is_open", LV_PROPERTY_DROPDOWN_IS_OPEN,}, - {"list", LV_PROPERTY_DROPDOWN_LIST,}, - {"option_count", LV_PROPERTY_DROPDOWN_OPTION_COUNT,}, - {"options", LV_PROPERTY_DROPDOWN_OPTIONS,}, - {"selected", LV_PROPERTY_DROPDOWN_SELECTED,}, - {"selected_highlight", LV_PROPERTY_DROPDOWN_SELECTED_HIGHLIGHT,}, - {"symbol", LV_PROPERTY_DROPDOWN_SYMBOL,}, - {"text", LV_PROPERTY_DROPDOWN_TEXT,}, -}; -#endif /*LV_USE_DROPDOWN*/ - -/* *INDENT-ON* */ -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_image_properties.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_image_properties.c deleted file mode 100644 index fd7fd7d..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_image_properties.c +++ /dev/null @@ -1,33 +0,0 @@ - -/** - * GENERATED FILE, DO NOT EDIT IT! - * @file lv_image_properties.c - */ - -#include "../image/lv_image.h" - -#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME - -#if LV_USE_IMAGE -/** - * Image widget property names, name must be in order. - * Generated code from properties.py - */ -/* *INDENT-OFF* */ -const lv_property_name_t lv_image_property_names[11] = { - {"antialias", LV_PROPERTY_IMAGE_ANTIALIAS,}, - {"blend_mode", LV_PROPERTY_IMAGE_BLEND_MODE,}, - {"inner_align", LV_PROPERTY_IMAGE_INNER_ALIGN,}, - {"offset_x", LV_PROPERTY_IMAGE_OFFSET_X,}, - {"offset_y", LV_PROPERTY_IMAGE_OFFSET_Y,}, - {"pivot", LV_PROPERTY_IMAGE_PIVOT,}, - {"rotation", LV_PROPERTY_IMAGE_ROTATION,}, - {"scale", LV_PROPERTY_IMAGE_SCALE,}, - {"scale_x", LV_PROPERTY_IMAGE_SCALE_X,}, - {"scale_y", LV_PROPERTY_IMAGE_SCALE_Y,}, - {"src", LV_PROPERTY_IMAGE_SRC,}, -}; -#endif /*LV_USE_IMAGE*/ - -/* *INDENT-ON* */ -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_keyboard_properties.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_keyboard_properties.c deleted file mode 100644 index 90cfc3e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_keyboard_properties.c +++ /dev/null @@ -1,26 +0,0 @@ - -/** - * GENERATED FILE, DO NOT EDIT IT! - * @file lv_keyboard_properties.c - */ - -#include "../keyboard/lv_keyboard.h" - -#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME - -#if LV_USE_KEYBOARD -/** - * Keyboard widget property names, name must be in order. - * Generated code from properties.py - */ -/* *INDENT-OFF* */ -const lv_property_name_t lv_keyboard_property_names[4] = { - {"mode", LV_PROPERTY_KEYBOARD_MODE,}, - {"popovers", LV_PROPERTY_KEYBOARD_POPOVERS,}, - {"selected_button", LV_PROPERTY_KEYBOARD_SELECTED_BUTTON,}, - {"textarea", LV_PROPERTY_KEYBOARD_TEXTAREA,}, -}; -#endif /*LV_USE_KEYBOARD*/ - -/* *INDENT-ON* */ -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_label_properties.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_label_properties.c deleted file mode 100644 index 5fc6708..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_label_properties.c +++ /dev/null @@ -1,26 +0,0 @@ - -/** - * GENERATED FILE, DO NOT EDIT IT! - * @file lv_label_properties.c - */ - -#include "../label/lv_label.h" - -#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME - -#if LV_USE_LABEL -/** - * Label widget property names, name must be in order. - * Generated code from properties.py - */ -/* *INDENT-OFF* */ -const lv_property_name_t lv_label_property_names[4] = { - {"long_mode", LV_PROPERTY_LABEL_LONG_MODE,}, - {"text", LV_PROPERTY_LABEL_TEXT,}, - {"text_selection_end", LV_PROPERTY_LABEL_TEXT_SELECTION_END,}, - {"text_selection_start", LV_PROPERTY_LABEL_TEXT_SELECTION_START,}, -}; -#endif /*LV_USE_LABEL*/ - -/* *INDENT-ON* */ -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_obj_properties.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_obj_properties.c deleted file mode 100644 index 1008b36..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_obj_properties.c +++ /dev/null @@ -1,93 +0,0 @@ - -/** - * GENERATED FILE, DO NOT EDIT IT! - * @file lv_obj_properties.c - */ - -#include "../../core/lv_obj.h" - -#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME - - -/** - * Obj widget property names, name must be in order. - * Generated code from properties.py - */ -/* *INDENT-OFF* */ -const lv_property_name_t lv_obj_property_names[73] = { - {"align", LV_PROPERTY_OBJ_ALIGN,}, - {"child_count", LV_PROPERTY_OBJ_CHILD_COUNT,}, - {"content_height", LV_PROPERTY_OBJ_CONTENT_HEIGHT,}, - {"content_width", LV_PROPERTY_OBJ_CONTENT_WIDTH,}, - {"display", LV_PROPERTY_OBJ_DISPLAY,}, - {"event_count", LV_PROPERTY_OBJ_EVENT_COUNT,}, - {"ext_draw_size", LV_PROPERTY_OBJ_EXT_DRAW_SIZE,}, - {"flag_adv_hittest", LV_PROPERTY_OBJ_FLAG_ADV_HITTEST,}, - {"flag_checkable", LV_PROPERTY_OBJ_FLAG_CHECKABLE,}, - {"flag_click_focusable", LV_PROPERTY_OBJ_FLAG_CLICK_FOCUSABLE,}, - {"flag_clickable", LV_PROPERTY_OBJ_FLAG_CLICKABLE,}, - {"flag_end", LV_PROPERTY_OBJ_FLAG_END,}, - {"flag_event_bubble", LV_PROPERTY_OBJ_FLAG_EVENT_BUBBLE,}, - {"flag_flex_in_new_track", LV_PROPERTY_OBJ_FLAG_FLEX_IN_NEW_TRACK,}, - {"flag_floating", LV_PROPERTY_OBJ_FLAG_FLOATING,}, - {"flag_gesture_bubble", LV_PROPERTY_OBJ_FLAG_GESTURE_BUBBLE,}, - {"flag_hidden", LV_PROPERTY_OBJ_FLAG_HIDDEN,}, - {"flag_ignore_layout", LV_PROPERTY_OBJ_FLAG_IGNORE_LAYOUT,}, - {"flag_layout_1", LV_PROPERTY_OBJ_FLAG_LAYOUT_1,}, - {"flag_layout_2", LV_PROPERTY_OBJ_FLAG_LAYOUT_2,}, - {"flag_overflow_visible", LV_PROPERTY_OBJ_FLAG_OVERFLOW_VISIBLE,}, - {"flag_press_lock", LV_PROPERTY_OBJ_FLAG_PRESS_LOCK,}, - {"flag_scroll_chain_hor", LV_PROPERTY_OBJ_FLAG_SCROLL_CHAIN_HOR,}, - {"flag_scroll_chain_ver", LV_PROPERTY_OBJ_FLAG_SCROLL_CHAIN_VER,}, - {"flag_scroll_elastic", LV_PROPERTY_OBJ_FLAG_SCROLL_ELASTIC,}, - {"flag_scroll_momentum", LV_PROPERTY_OBJ_FLAG_SCROLL_MOMENTUM,}, - {"flag_scroll_on_focus", LV_PROPERTY_OBJ_FLAG_SCROLL_ON_FOCUS,}, - {"flag_scroll_one", LV_PROPERTY_OBJ_FLAG_SCROLL_ONE,}, - {"flag_scroll_with_arrow", LV_PROPERTY_OBJ_FLAG_SCROLL_WITH_ARROW,}, - {"flag_scrollable", LV_PROPERTY_OBJ_FLAG_SCROLLABLE,}, - {"flag_send_draw_task_events", LV_PROPERTY_OBJ_FLAG_SEND_DRAW_TASK_EVENTS,}, - {"flag_snappable", LV_PROPERTY_OBJ_FLAG_SNAPPABLE,}, - {"flag_start", LV_PROPERTY_OBJ_FLAG_START,}, - {"flag_user_1", LV_PROPERTY_OBJ_FLAG_USER_1,}, - {"flag_user_2", LV_PROPERTY_OBJ_FLAG_USER_2,}, - {"flag_user_3", LV_PROPERTY_OBJ_FLAG_USER_3,}, - {"flag_user_4", LV_PROPERTY_OBJ_FLAG_USER_4,}, - {"flag_widget_1", LV_PROPERTY_OBJ_FLAG_WIDGET_1,}, - {"flag_widget_2", LV_PROPERTY_OBJ_FLAG_WIDGET_2,}, - {"h", LV_PROPERTY_OBJ_H,}, - {"index", LV_PROPERTY_OBJ_INDEX,}, - {"layout", LV_PROPERTY_OBJ_LAYOUT,}, - {"parent", LV_PROPERTY_OBJ_PARENT,}, - {"screen", LV_PROPERTY_OBJ_SCREEN,}, - {"scroll_bottom", LV_PROPERTY_OBJ_SCROLL_BOTTOM,}, - {"scroll_dir", LV_PROPERTY_OBJ_SCROLL_DIR,}, - {"scroll_end", LV_PROPERTY_OBJ_SCROLL_END,}, - {"scroll_left", LV_PROPERTY_OBJ_SCROLL_LEFT,}, - {"scroll_right", LV_PROPERTY_OBJ_SCROLL_RIGHT,}, - {"scroll_snap_x", LV_PROPERTY_OBJ_SCROLL_SNAP_X,}, - {"scroll_snap_y", LV_PROPERTY_OBJ_SCROLL_SNAP_Y,}, - {"scroll_top", LV_PROPERTY_OBJ_SCROLL_TOP,}, - {"scroll_x", LV_PROPERTY_OBJ_SCROLL_X,}, - {"scroll_y", LV_PROPERTY_OBJ_SCROLL_Y,}, - {"scrollbar_mode", LV_PROPERTY_OBJ_SCROLLBAR_MODE,}, - {"state_any", LV_PROPERTY_OBJ_STATE_ANY,}, - {"state_checked", LV_PROPERTY_OBJ_STATE_CHECKED,}, - {"state_disabled", LV_PROPERTY_OBJ_STATE_DISABLED,}, - {"state_edited", LV_PROPERTY_OBJ_STATE_EDITED,}, - {"state_end", LV_PROPERTY_OBJ_STATE_END,}, - {"state_focus_key", LV_PROPERTY_OBJ_STATE_FOCUS_KEY,}, - {"state_focused", LV_PROPERTY_OBJ_STATE_FOCUSED,}, - {"state_hovered", LV_PROPERTY_OBJ_STATE_HOVERED,}, - {"state_pressed", LV_PROPERTY_OBJ_STATE_PRESSED,}, - {"state_scrolled", LV_PROPERTY_OBJ_STATE_SCROLLED,}, - {"state_start", LV_PROPERTY_OBJ_STATE_START,}, - {"state_user_1", LV_PROPERTY_OBJ_STATE_USER_1,}, - {"state_user_2", LV_PROPERTY_OBJ_STATE_USER_2,}, - {"state_user_3", LV_PROPERTY_OBJ_STATE_USER_3,}, - {"state_user_4", LV_PROPERTY_OBJ_STATE_USER_4,}, - {"w", LV_PROPERTY_OBJ_W,}, - {"x", LV_PROPERTY_OBJ_X,}, - {"y", LV_PROPERTY_OBJ_Y,}, -}; -/* *INDENT-ON* */ -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_obj_property_names.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_obj_property_names.h deleted file mode 100644 index 4b4ff67..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_obj_property_names.h +++ /dev/null @@ -1,22 +0,0 @@ - -/** - * @file lv_obj_property_names.h - * GENERATED FILE, DO NOT EDIT IT! - */ -#ifndef LV_OBJ_PROPERTY_NAMES_H -#define LV_OBJ_PROPERTY_NAMES_H - -#include "../../misc/lv_types.h" - -#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME - - extern const lv_property_name_t lv_dropdown_property_names[9]; - extern const lv_property_name_t lv_image_property_names[11]; - extern const lv_property_name_t lv_keyboard_property_names[4]; - extern const lv_property_name_t lv_label_property_names[4]; - extern const lv_property_name_t lv_obj_property_names[73]; - extern const lv_property_name_t lv_roller_property_names[3]; - extern const lv_property_name_t lv_style_property_names[112]; - extern const lv_property_name_t lv_textarea_property_names[15]; -#endif -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_roller_properties.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_roller_properties.c deleted file mode 100644 index 72aa017..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_roller_properties.c +++ /dev/null @@ -1,25 +0,0 @@ - -/** - * GENERATED FILE, DO NOT EDIT IT! - * @file lv_roller_properties.c - */ - -#include "../roller/lv_roller.h" - -#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME - -#if LV_USE_ROLLER -/** - * Roller widget property names, name must be in order. - * Generated code from properties.py - */ -/* *INDENT-OFF* */ -const lv_property_name_t lv_roller_property_names[3] = { - {"options", LV_PROPERTY_ROLLER_OPTIONS,}, - {"selected", LV_PROPERTY_ROLLER_SELECTED,}, - {"visible_row_count", LV_PROPERTY_ROLLER_VISIBLE_ROW_COUNT,}, -}; -#endif /*LV_USE_ROLLER*/ - -/* *INDENT-ON* */ -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_style_properties.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_style_properties.c deleted file mode 100644 index 22ef3e2..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_style_properties.c +++ /dev/null @@ -1,132 +0,0 @@ - -/** - * GENERATED FILE, DO NOT EDIT IT! - * @file lv_style_properties.c - */ - -#include "lv_style_properties.h" - -#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME - - -/** - * Style property names, name must be in order. - * Generated code from properties.py - */ -/* *INDENT-OFF* */ -const lv_property_name_t lv_style_property_names[112] = { - {"align", LV_PROPERTY_STYLE_ALIGN,}, - {"anim", LV_PROPERTY_STYLE_ANIM,}, - {"anim_duration", LV_PROPERTY_STYLE_ANIM_DURATION,}, - {"arc_color", LV_PROPERTY_STYLE_ARC_COLOR,}, - {"arc_image_src", LV_PROPERTY_STYLE_ARC_IMAGE_SRC,}, - {"arc_opa", LV_PROPERTY_STYLE_ARC_OPA,}, - {"arc_rounded", LV_PROPERTY_STYLE_ARC_ROUNDED,}, - {"arc_width", LV_PROPERTY_STYLE_ARC_WIDTH,}, - {"base_dir", LV_PROPERTY_STYLE_BASE_DIR,}, - {"bg_color", LV_PROPERTY_STYLE_BG_COLOR,}, - {"bg_grad", LV_PROPERTY_STYLE_BG_GRAD,}, - {"bg_grad_color", LV_PROPERTY_STYLE_BG_GRAD_COLOR,}, - {"bg_grad_dir", LV_PROPERTY_STYLE_BG_GRAD_DIR,}, - {"bg_grad_opa", LV_PROPERTY_STYLE_BG_GRAD_OPA,}, - {"bg_grad_stop", LV_PROPERTY_STYLE_BG_GRAD_STOP,}, - {"bg_image_opa", LV_PROPERTY_STYLE_BG_IMAGE_OPA,}, - {"bg_image_recolor", LV_PROPERTY_STYLE_BG_IMAGE_RECOLOR,}, - {"bg_image_recolor_opa", LV_PROPERTY_STYLE_BG_IMAGE_RECOLOR_OPA,}, - {"bg_image_src", LV_PROPERTY_STYLE_BG_IMAGE_SRC,}, - {"bg_image_tiled", LV_PROPERTY_STYLE_BG_IMAGE_TILED,}, - {"bg_main_opa", LV_PROPERTY_STYLE_BG_MAIN_OPA,}, - {"bg_main_stop", LV_PROPERTY_STYLE_BG_MAIN_STOP,}, - {"bg_opa", LV_PROPERTY_STYLE_BG_OPA,}, - {"bitmap_mask_src", LV_PROPERTY_STYLE_BITMAP_MASK_SRC,}, - {"blend_mode", LV_PROPERTY_STYLE_BLEND_MODE,}, - {"border_color", LV_PROPERTY_STYLE_BORDER_COLOR,}, - {"border_opa", LV_PROPERTY_STYLE_BORDER_OPA,}, - {"border_post", LV_PROPERTY_STYLE_BORDER_POST,}, - {"border_side", LV_PROPERTY_STYLE_BORDER_SIDE,}, - {"border_width", LV_PROPERTY_STYLE_BORDER_WIDTH,}, - {"clip_corner", LV_PROPERTY_STYLE_CLIP_CORNER,}, - {"color_filter_dsc", LV_PROPERTY_STYLE_COLOR_FILTER_DSC,}, - {"color_filter_opa", LV_PROPERTY_STYLE_COLOR_FILTER_OPA,}, - {"flex_cross_place", LV_PROPERTY_STYLE_FLEX_CROSS_PLACE,}, - {"flex_flow", LV_PROPERTY_STYLE_FLEX_FLOW,}, - {"flex_grow", LV_PROPERTY_STYLE_FLEX_GROW,}, - {"flex_main_place", LV_PROPERTY_STYLE_FLEX_MAIN_PLACE,}, - {"flex_track_place", LV_PROPERTY_STYLE_FLEX_TRACK_PLACE,}, - {"grid_cell_column_pos", LV_PROPERTY_STYLE_GRID_CELL_COLUMN_POS,}, - {"grid_cell_column_span", LV_PROPERTY_STYLE_GRID_CELL_COLUMN_SPAN,}, - {"grid_cell_row_pos", LV_PROPERTY_STYLE_GRID_CELL_ROW_POS,}, - {"grid_cell_row_span", LV_PROPERTY_STYLE_GRID_CELL_ROW_SPAN,}, - {"grid_cell_x_align", LV_PROPERTY_STYLE_GRID_CELL_X_ALIGN,}, - {"grid_cell_y_align", LV_PROPERTY_STYLE_GRID_CELL_Y_ALIGN,}, - {"grid_column_align", LV_PROPERTY_STYLE_GRID_COLUMN_ALIGN,}, - {"grid_column_dsc_array", LV_PROPERTY_STYLE_GRID_COLUMN_DSC_ARRAY,}, - {"grid_row_align", LV_PROPERTY_STYLE_GRID_ROW_ALIGN,}, - {"grid_row_dsc_array", LV_PROPERTY_STYLE_GRID_ROW_DSC_ARRAY,}, - {"height", LV_PROPERTY_STYLE_HEIGHT,}, - {"image_opa", LV_PROPERTY_STYLE_IMAGE_OPA,}, - {"image_recolor", LV_PROPERTY_STYLE_IMAGE_RECOLOR,}, - {"image_recolor_opa", LV_PROPERTY_STYLE_IMAGE_RECOLOR_OPA,}, - {"last_built_in_prop", LV_PROPERTY_STYLE_LAST_BUILT_IN_PROP,}, - {"layout", LV_PROPERTY_STYLE_LAYOUT,}, - {"length", LV_PROPERTY_STYLE_LENGTH,}, - {"line_color", LV_PROPERTY_STYLE_LINE_COLOR,}, - {"line_dash_gap", LV_PROPERTY_STYLE_LINE_DASH_GAP,}, - {"line_dash_width", LV_PROPERTY_STYLE_LINE_DASH_WIDTH,}, - {"line_opa", LV_PROPERTY_STYLE_LINE_OPA,}, - {"line_rounded", LV_PROPERTY_STYLE_LINE_ROUNDED,}, - {"line_width", LV_PROPERTY_STYLE_LINE_WIDTH,}, - {"margin_bottom", LV_PROPERTY_STYLE_MARGIN_BOTTOM,}, - {"margin_left", LV_PROPERTY_STYLE_MARGIN_LEFT,}, - {"margin_right", LV_PROPERTY_STYLE_MARGIN_RIGHT,}, - {"margin_top", LV_PROPERTY_STYLE_MARGIN_TOP,}, - {"max_height", LV_PROPERTY_STYLE_MAX_HEIGHT,}, - {"max_width", LV_PROPERTY_STYLE_MAX_WIDTH,}, - {"min_height", LV_PROPERTY_STYLE_MIN_HEIGHT,}, - {"min_width", LV_PROPERTY_STYLE_MIN_WIDTH,}, - {"opa", LV_PROPERTY_STYLE_OPA,}, - {"opa_layered", LV_PROPERTY_STYLE_OPA_LAYERED,}, - {"outline_color", LV_PROPERTY_STYLE_OUTLINE_COLOR,}, - {"outline_opa", LV_PROPERTY_STYLE_OUTLINE_OPA,}, - {"outline_pad", LV_PROPERTY_STYLE_OUTLINE_PAD,}, - {"outline_width", LV_PROPERTY_STYLE_OUTLINE_WIDTH,}, - {"pad_bottom", LV_PROPERTY_STYLE_PAD_BOTTOM,}, - {"pad_column", LV_PROPERTY_STYLE_PAD_COLUMN,}, - {"pad_left", LV_PROPERTY_STYLE_PAD_LEFT,}, - {"pad_right", LV_PROPERTY_STYLE_PAD_RIGHT,}, - {"pad_row", LV_PROPERTY_STYLE_PAD_ROW,}, - {"pad_top", LV_PROPERTY_STYLE_PAD_TOP,}, - {"prop_inv", LV_PROPERTY_STYLE_PROP_INV,}, - {"radius", LV_PROPERTY_STYLE_RADIUS,}, - {"rotary_sensitivity", LV_PROPERTY_STYLE_ROTARY_SENSITIVITY,}, - {"shadow_color", LV_PROPERTY_STYLE_SHADOW_COLOR,}, - {"shadow_offset_x", LV_PROPERTY_STYLE_SHADOW_OFFSET_X,}, - {"shadow_offset_y", LV_PROPERTY_STYLE_SHADOW_OFFSET_Y,}, - {"shadow_opa", LV_PROPERTY_STYLE_SHADOW_OPA,}, - {"shadow_spread", LV_PROPERTY_STYLE_SHADOW_SPREAD,}, - {"shadow_width", LV_PROPERTY_STYLE_SHADOW_WIDTH,}, - {"text_align", LV_PROPERTY_STYLE_TEXT_ALIGN,}, - {"text_color", LV_PROPERTY_STYLE_TEXT_COLOR,}, - {"text_decor", LV_PROPERTY_STYLE_TEXT_DECOR,}, - {"text_font", LV_PROPERTY_STYLE_TEXT_FONT,}, - {"text_letter_space", LV_PROPERTY_STYLE_TEXT_LETTER_SPACE,}, - {"text_line_space", LV_PROPERTY_STYLE_TEXT_LINE_SPACE,}, - {"text_opa", LV_PROPERTY_STYLE_TEXT_OPA,}, - {"transform_height", LV_PROPERTY_STYLE_TRANSFORM_HEIGHT,}, - {"transform_pivot_x", LV_PROPERTY_STYLE_TRANSFORM_PIVOT_X,}, - {"transform_pivot_y", LV_PROPERTY_STYLE_TRANSFORM_PIVOT_Y,}, - {"transform_rotation", LV_PROPERTY_STYLE_TRANSFORM_ROTATION,}, - {"transform_scale_x", LV_PROPERTY_STYLE_TRANSFORM_SCALE_X,}, - {"transform_scale_y", LV_PROPERTY_STYLE_TRANSFORM_SCALE_Y,}, - {"transform_skew_x", LV_PROPERTY_STYLE_TRANSFORM_SKEW_X,}, - {"transform_skew_y", LV_PROPERTY_STYLE_TRANSFORM_SKEW_Y,}, - {"transform_width", LV_PROPERTY_STYLE_TRANSFORM_WIDTH,}, - {"transition", LV_PROPERTY_STYLE_TRANSITION,}, - {"translate_x", LV_PROPERTY_STYLE_TRANSLATE_X,}, - {"translate_y", LV_PROPERTY_STYLE_TRANSLATE_Y,}, - {"width", LV_PROPERTY_STYLE_WIDTH,}, - {"x", LV_PROPERTY_STYLE_X,}, - {"y", LV_PROPERTY_STYLE_Y,}, -}; -/* *INDENT-ON* */ -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_style_properties.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_style_properties.h deleted file mode 100644 index 146f35a..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_style_properties.h +++ /dev/null @@ -1,130 +0,0 @@ - -/** - * GENERATED FILE, DO NOT EDIT IT! - * @file lv_style_properties.h - */ -#ifndef LV_STYLE_PROPERTIES_H -#define LV_STYLE_PROPERTIES_H - -#include "../../core/lv_obj_property.h" -#if LV_USE_OBJ_PROPERTY - - -/* *INDENT-OFF* */ -enum { - LV_PROPERTY_ID(STYLE, ALIGN, LV_PROPERTY_TYPE_INT, LV_STYLE_ALIGN), - LV_PROPERTY_ID(STYLE, ANIM, LV_PROPERTY_TYPE_INT, LV_STYLE_ANIM), - LV_PROPERTY_ID(STYLE, ANIM_DURATION, LV_PROPERTY_TYPE_INT, LV_STYLE_ANIM_DURATION), - LV_PROPERTY_ID(STYLE, ARC_COLOR, LV_PROPERTY_TYPE_INT, LV_STYLE_ARC_COLOR), - LV_PROPERTY_ID(STYLE, ARC_IMAGE_SRC, LV_PROPERTY_TYPE_INT, LV_STYLE_ARC_IMAGE_SRC), - LV_PROPERTY_ID(STYLE, ARC_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_ARC_OPA), - LV_PROPERTY_ID(STYLE, ARC_ROUNDED, LV_PROPERTY_TYPE_INT, LV_STYLE_ARC_ROUNDED), - LV_PROPERTY_ID(STYLE, ARC_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_ARC_WIDTH), - LV_PROPERTY_ID(STYLE, BASE_DIR, LV_PROPERTY_TYPE_INT, LV_STYLE_BASE_DIR), - LV_PROPERTY_ID(STYLE, BG_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_BG_COLOR), - LV_PROPERTY_ID(STYLE, BG_GRAD, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_GRAD), - LV_PROPERTY_ID(STYLE, BG_GRAD_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_BG_GRAD_COLOR), - LV_PROPERTY_ID(STYLE, BG_GRAD_DIR, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_GRAD_DIR), - LV_PROPERTY_ID(STYLE, BG_GRAD_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_GRAD_OPA), - LV_PROPERTY_ID(STYLE, BG_GRAD_STOP, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_GRAD_STOP), - LV_PROPERTY_ID(STYLE, BG_IMAGE_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_IMAGE_OPA), - LV_PROPERTY_ID(STYLE, BG_IMAGE_RECOLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_BG_IMAGE_RECOLOR), - LV_PROPERTY_ID(STYLE, BG_IMAGE_RECOLOR_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_IMAGE_RECOLOR_OPA), - LV_PROPERTY_ID(STYLE, BG_IMAGE_SRC, LV_PROPERTY_TYPE_IMGSRC, LV_STYLE_BG_IMAGE_SRC), - LV_PROPERTY_ID(STYLE, BG_IMAGE_TILED, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_IMAGE_TILED), - LV_PROPERTY_ID(STYLE, BG_MAIN_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_MAIN_OPA), - LV_PROPERTY_ID(STYLE, BG_MAIN_STOP, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_MAIN_STOP), - LV_PROPERTY_ID(STYLE, BG_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_OPA), - LV_PROPERTY_ID(STYLE, BITMAP_MASK_SRC, LV_PROPERTY_TYPE_INT, LV_STYLE_BITMAP_MASK_SRC), - LV_PROPERTY_ID(STYLE, BLEND_MODE, LV_PROPERTY_TYPE_INT, LV_STYLE_BLEND_MODE), - LV_PROPERTY_ID(STYLE, BORDER_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_BORDER_COLOR), - LV_PROPERTY_ID(STYLE, BORDER_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_BORDER_OPA), - LV_PROPERTY_ID(STYLE, BORDER_POST, LV_PROPERTY_TYPE_INT, LV_STYLE_BORDER_POST), - LV_PROPERTY_ID(STYLE, BORDER_SIDE, LV_PROPERTY_TYPE_INT, LV_STYLE_BORDER_SIDE), - LV_PROPERTY_ID(STYLE, BORDER_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_BORDER_WIDTH), - LV_PROPERTY_ID(STYLE, CLIP_CORNER, LV_PROPERTY_TYPE_INT, LV_STYLE_CLIP_CORNER), - LV_PROPERTY_ID(STYLE, COLOR_FILTER_DSC, LV_PROPERTY_TYPE_INT, LV_STYLE_COLOR_FILTER_DSC), - LV_PROPERTY_ID(STYLE, COLOR_FILTER_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_COLOR_FILTER_OPA), - LV_PROPERTY_ID(STYLE, FLEX_CROSS_PLACE, LV_PROPERTY_TYPE_INT, LV_STYLE_FLEX_CROSS_PLACE), - LV_PROPERTY_ID(STYLE, FLEX_FLOW, LV_PROPERTY_TYPE_INT, LV_STYLE_FLEX_FLOW), - LV_PROPERTY_ID(STYLE, FLEX_GROW, LV_PROPERTY_TYPE_INT, LV_STYLE_FLEX_GROW), - LV_PROPERTY_ID(STYLE, FLEX_MAIN_PLACE, LV_PROPERTY_TYPE_INT, LV_STYLE_FLEX_MAIN_PLACE), - LV_PROPERTY_ID(STYLE, FLEX_TRACK_PLACE, LV_PROPERTY_TYPE_INT, LV_STYLE_FLEX_TRACK_PLACE), - LV_PROPERTY_ID(STYLE, GRID_CELL_COLUMN_POS, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_CELL_COLUMN_POS), - LV_PROPERTY_ID(STYLE, GRID_CELL_COLUMN_SPAN, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_CELL_COLUMN_SPAN), - LV_PROPERTY_ID(STYLE, GRID_CELL_ROW_POS, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_CELL_ROW_POS), - LV_PROPERTY_ID(STYLE, GRID_CELL_ROW_SPAN, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_CELL_ROW_SPAN), - LV_PROPERTY_ID(STYLE, GRID_CELL_X_ALIGN, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_CELL_X_ALIGN), - LV_PROPERTY_ID(STYLE, GRID_CELL_Y_ALIGN, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_CELL_Y_ALIGN), - LV_PROPERTY_ID(STYLE, GRID_COLUMN_ALIGN, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_COLUMN_ALIGN), - LV_PROPERTY_ID(STYLE, GRID_COLUMN_DSC_ARRAY, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_COLUMN_DSC_ARRAY), - LV_PROPERTY_ID(STYLE, GRID_ROW_ALIGN, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_ROW_ALIGN), - LV_PROPERTY_ID(STYLE, GRID_ROW_DSC_ARRAY, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_ROW_DSC_ARRAY), - LV_PROPERTY_ID(STYLE, HEIGHT, LV_PROPERTY_TYPE_INT, LV_STYLE_HEIGHT), - LV_PROPERTY_ID(STYLE, IMAGE_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_IMAGE_OPA), - LV_PROPERTY_ID(STYLE, IMAGE_RECOLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_IMAGE_RECOLOR), - LV_PROPERTY_ID(STYLE, IMAGE_RECOLOR_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_IMAGE_RECOLOR_OPA), - LV_PROPERTY_ID(STYLE, LAST_BUILT_IN_PROP, LV_PROPERTY_TYPE_INT, LV_STYLE_LAST_BUILT_IN_PROP), - LV_PROPERTY_ID(STYLE, LAYOUT, LV_PROPERTY_TYPE_INT, LV_STYLE_LAYOUT), - LV_PROPERTY_ID(STYLE, LENGTH, LV_PROPERTY_TYPE_INT, LV_STYLE_LENGTH), - LV_PROPERTY_ID(STYLE, LINE_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_LINE_COLOR), - LV_PROPERTY_ID(STYLE, LINE_DASH_GAP, LV_PROPERTY_TYPE_INT, LV_STYLE_LINE_DASH_GAP), - LV_PROPERTY_ID(STYLE, LINE_DASH_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_LINE_DASH_WIDTH), - LV_PROPERTY_ID(STYLE, LINE_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_LINE_OPA), - LV_PROPERTY_ID(STYLE, LINE_ROUNDED, LV_PROPERTY_TYPE_INT, LV_STYLE_LINE_ROUNDED), - LV_PROPERTY_ID(STYLE, LINE_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_LINE_WIDTH), - LV_PROPERTY_ID(STYLE, MARGIN_BOTTOM, LV_PROPERTY_TYPE_INT, LV_STYLE_MARGIN_BOTTOM), - LV_PROPERTY_ID(STYLE, MARGIN_LEFT, LV_PROPERTY_TYPE_INT, LV_STYLE_MARGIN_LEFT), - LV_PROPERTY_ID(STYLE, MARGIN_RIGHT, LV_PROPERTY_TYPE_INT, LV_STYLE_MARGIN_RIGHT), - LV_PROPERTY_ID(STYLE, MARGIN_TOP, LV_PROPERTY_TYPE_INT, LV_STYLE_MARGIN_TOP), - LV_PROPERTY_ID(STYLE, MAX_HEIGHT, LV_PROPERTY_TYPE_INT, LV_STYLE_MAX_HEIGHT), - LV_PROPERTY_ID(STYLE, MAX_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_MAX_WIDTH), - LV_PROPERTY_ID(STYLE, MIN_HEIGHT, LV_PROPERTY_TYPE_INT, LV_STYLE_MIN_HEIGHT), - LV_PROPERTY_ID(STYLE, MIN_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_MIN_WIDTH), - LV_PROPERTY_ID(STYLE, OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_OPA), - LV_PROPERTY_ID(STYLE, OPA_LAYERED, LV_PROPERTY_TYPE_INT, LV_STYLE_OPA_LAYERED), - LV_PROPERTY_ID(STYLE, OUTLINE_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_OUTLINE_COLOR), - LV_PROPERTY_ID(STYLE, OUTLINE_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_OUTLINE_OPA), - LV_PROPERTY_ID(STYLE, OUTLINE_PAD, LV_PROPERTY_TYPE_INT, LV_STYLE_OUTLINE_PAD), - LV_PROPERTY_ID(STYLE, OUTLINE_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_OUTLINE_WIDTH), - LV_PROPERTY_ID(STYLE, PAD_BOTTOM, LV_PROPERTY_TYPE_INT, LV_STYLE_PAD_BOTTOM), - LV_PROPERTY_ID(STYLE, PAD_COLUMN, LV_PROPERTY_TYPE_INT, LV_STYLE_PAD_COLUMN), - LV_PROPERTY_ID(STYLE, PAD_LEFT, LV_PROPERTY_TYPE_INT, LV_STYLE_PAD_LEFT), - LV_PROPERTY_ID(STYLE, PAD_RIGHT, LV_PROPERTY_TYPE_INT, LV_STYLE_PAD_RIGHT), - LV_PROPERTY_ID(STYLE, PAD_ROW, LV_PROPERTY_TYPE_INT, LV_STYLE_PAD_ROW), - LV_PROPERTY_ID(STYLE, PAD_TOP, LV_PROPERTY_TYPE_INT, LV_STYLE_PAD_TOP), - LV_PROPERTY_ID(STYLE, PROP_INV, LV_PROPERTY_TYPE_INT, LV_STYLE_PROP_INV), - LV_PROPERTY_ID(STYLE, RADIUS, LV_PROPERTY_TYPE_INT, LV_STYLE_RADIUS), - LV_PROPERTY_ID(STYLE, ROTARY_SENSITIVITY, LV_PROPERTY_TYPE_INT, LV_STYLE_ROTARY_SENSITIVITY), - LV_PROPERTY_ID(STYLE, SHADOW_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_SHADOW_COLOR), - LV_PROPERTY_ID(STYLE, SHADOW_OFFSET_X, LV_PROPERTY_TYPE_INT, LV_STYLE_SHADOW_OFFSET_X), - LV_PROPERTY_ID(STYLE, SHADOW_OFFSET_Y, LV_PROPERTY_TYPE_INT, LV_STYLE_SHADOW_OFFSET_Y), - LV_PROPERTY_ID(STYLE, SHADOW_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_SHADOW_OPA), - LV_PROPERTY_ID(STYLE, SHADOW_SPREAD, LV_PROPERTY_TYPE_INT, LV_STYLE_SHADOW_SPREAD), - LV_PROPERTY_ID(STYLE, SHADOW_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_SHADOW_WIDTH), - LV_PROPERTY_ID(STYLE, TEXT_ALIGN, LV_PROPERTY_TYPE_INT, LV_STYLE_TEXT_ALIGN), - LV_PROPERTY_ID(STYLE, TEXT_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_TEXT_COLOR), - LV_PROPERTY_ID(STYLE, TEXT_DECOR, LV_PROPERTY_TYPE_INT, LV_STYLE_TEXT_DECOR), - LV_PROPERTY_ID(STYLE, TEXT_FONT, LV_PROPERTY_TYPE_FONT, LV_STYLE_TEXT_FONT), - LV_PROPERTY_ID(STYLE, TEXT_LETTER_SPACE, LV_PROPERTY_TYPE_INT, LV_STYLE_TEXT_LETTER_SPACE), - LV_PROPERTY_ID(STYLE, TEXT_LINE_SPACE, LV_PROPERTY_TYPE_INT, LV_STYLE_TEXT_LINE_SPACE), - LV_PROPERTY_ID(STYLE, TEXT_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_TEXT_OPA), - LV_PROPERTY_ID(STYLE, TRANSFORM_HEIGHT, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_HEIGHT), - LV_PROPERTY_ID(STYLE, TRANSFORM_PIVOT_X, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_PIVOT_X), - LV_PROPERTY_ID(STYLE, TRANSFORM_PIVOT_Y, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_PIVOT_Y), - LV_PROPERTY_ID(STYLE, TRANSFORM_ROTATION, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_ROTATION), - LV_PROPERTY_ID(STYLE, TRANSFORM_SCALE_X, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_SCALE_X), - LV_PROPERTY_ID(STYLE, TRANSFORM_SCALE_Y, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_SCALE_Y), - LV_PROPERTY_ID(STYLE, TRANSFORM_SKEW_X, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_SKEW_X), - LV_PROPERTY_ID(STYLE, TRANSFORM_SKEW_Y, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_SKEW_Y), - LV_PROPERTY_ID(STYLE, TRANSFORM_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_WIDTH), - LV_PROPERTY_ID(STYLE, TRANSITION, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSITION), - LV_PROPERTY_ID(STYLE, TRANSLATE_X, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSLATE_X), - LV_PROPERTY_ID(STYLE, TRANSLATE_Y, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSLATE_Y), - LV_PROPERTY_ID(STYLE, WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_WIDTH), - LV_PROPERTY_ID(STYLE, X, LV_PROPERTY_TYPE_INT, LV_STYLE_X), - LV_PROPERTY_ID(STYLE, Y, LV_PROPERTY_TYPE_INT, LV_STYLE_Y), -}; - -#endif -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_textarea_properties.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_textarea_properties.c deleted file mode 100644 index 7bed65e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/property/lv_textarea_properties.c +++ /dev/null @@ -1,37 +0,0 @@ - -/** - * GENERATED FILE, DO NOT EDIT IT! - * @file lv_textarea_properties.c - */ - -#include "../textarea/lv_textarea.h" - -#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME - -#if LV_USE_TEXTAREA -/** - * Textarea widget property names, name must be in order. - * Generated code from properties.py - */ -/* *INDENT-OFF* */ -const lv_property_name_t lv_textarea_property_names[15] = { - {"accepted_chars", LV_PROPERTY_TEXTAREA_ACCEPTED_CHARS,}, - {"current_char", LV_PROPERTY_TEXTAREA_CURRENT_CHAR,}, - {"cursor_click_pos", LV_PROPERTY_TEXTAREA_CURSOR_CLICK_POS,}, - {"cursor_pos", LV_PROPERTY_TEXTAREA_CURSOR_POS,}, - {"insert_replace", LV_PROPERTY_TEXTAREA_INSERT_REPLACE,}, - {"label", LV_PROPERTY_TEXTAREA_LABEL,}, - {"max_length", LV_PROPERTY_TEXTAREA_MAX_LENGTH,}, - {"one_line", LV_PROPERTY_TEXTAREA_ONE_LINE,}, - {"password_bullet", LV_PROPERTY_TEXTAREA_PASSWORD_BULLET,}, - {"password_mode", LV_PROPERTY_TEXTAREA_PASSWORD_MODE,}, - {"password_show_time", LV_PROPERTY_TEXTAREA_PASSWORD_SHOW_TIME,}, - {"placeholder_text", LV_PROPERTY_TEXTAREA_PLACEHOLDER_TEXT,}, - {"text", LV_PROPERTY_TEXTAREA_TEXT,}, - {"text_is_selected", LV_PROPERTY_TEXTAREA_TEXT_IS_SELECTED,}, - {"text_selection", LV_PROPERTY_TEXTAREA_TEXT_SELECTION,}, -}; -#endif /*LV_USE_TEXTAREA*/ - -/* *INDENT-ON* */ -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/roller/lv_roller.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/roller/lv_roller.c deleted file mode 100644 index b762a1e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/roller/lv_roller.c +++ /dev/null @@ -1,863 +0,0 @@ -/** - * @file lv_roller.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_roller_private.h" -#include "../label/lv_label_private.h" -#include "../../misc/lv_area_private.h" -#include "../../misc/lv_anim_private.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_ROLLER != 0 - -#include "../../misc/lv_assert.h" -#include "../../misc/lv_text_private.h" -#include "../../draw/lv_draw_private.h" -#include "../../core/lv_group.h" -#include "../../indev/lv_indev.h" -#include "../../indev/lv_indev_scroll.h" -#include "../../indev/lv_indev_private.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_roller_class) -#define MY_CLASS_LABEL &lv_roller_label_class -#define EXTRA_INF_SIZE 1000 /*[px]: add the options multiple times until getting this height*/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_roller_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_roller_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void lv_roller_label_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void draw_main(lv_event_t * e); -static void draw_label(lv_event_t * e); -static void get_sel_area(lv_obj_t * obj, lv_area_t * sel_area); -static void refr_position(lv_obj_t * obj, lv_anim_enable_t animen); -static lv_result_t release_handler(lv_obj_t * obj); -static void inf_normalize(lv_obj_t * obj_scrl); -static lv_obj_t * get_label(const lv_obj_t * obj); -static int32_t get_selected_label_width(const lv_obj_t * obj); -static void scroll_anim_completed_cb(lv_anim_t * a); -static void set_y_anim(void * obj, int32_t v); -static void transform_vect_recursive(lv_obj_t * roller, lv_point_t * vect); - -/********************** - * STATIC VARIABLES - **********************/ -#if LV_USE_OBJ_PROPERTY -static const lv_property_ops_t properties[] = { - { - .id = LV_PROPERTY_ROLLER_OPTIONS, - .setter = NULL, - .getter = lv_roller_get_options, - }, - { - .id = LV_PROPERTY_ROLLER_SELECTED, - .setter = NULL, - .getter = lv_roller_get_selected, - }, - { - .id = LV_PROPERTY_ROLLER_VISIBLE_ROW_COUNT, - .setter = lv_roller_set_visible_row_count, - .getter = NULL, - }, -}; -#endif - -const lv_obj_class_t lv_roller_class = { - .constructor_cb = lv_roller_constructor, - .event_cb = lv_roller_event, - .width_def = LV_SIZE_CONTENT, - .height_def = LV_DPI_DEF, - .instance_size = sizeof(lv_roller_t), - .editable = LV_OBJ_CLASS_EDITABLE_TRUE, - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .base_class = &lv_obj_class, - .name = "roller", -#if LV_USE_OBJ_PROPERTY - .prop_index_start = LV_PROPERTY_ROLLER_START, - .prop_index_end = LV_PROPERTY_ROLLER_END, - .properties = properties, - .properties_count = sizeof(properties) / sizeof(properties[0]), - -#if LV_USE_OBJ_PROPERTY_NAME - .property_names = lv_roller_property_names, - .names_count = sizeof(lv_roller_property_names) / sizeof(lv_property_name_t), -#endif -#endif -}; - -const lv_obj_class_t lv_roller_label_class = { - .event_cb = lv_roller_label_event, - .instance_size = sizeof(lv_label_t), - .base_class = &lv_label_class, - .name = "roller-label", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_roller_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_roller_set_options(lv_obj_t * obj, const char * options, lv_roller_mode_t mode) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(options); - - lv_roller_t * roller = (lv_roller_t *)obj; - lv_obj_t * label = get_label(obj); - - roller->sel_opt_id = 0; - roller->sel_opt_id_ori = 0; - - /*Count the '\n'-s to determine the number of options*/ - roller->option_cnt = 0; - uint32_t cnt; - for(cnt = 0; options[cnt] != '\0'; cnt++) { - if(options[cnt] == '\n') roller->option_cnt++; - } - roller->option_cnt++; /*Last option has no `\n`*/ - - if(mode == LV_ROLLER_MODE_NORMAL) { - roller->mode = LV_ROLLER_MODE_NORMAL; - lv_label_set_text(label, options); - } - else { - roller->mode = LV_ROLLER_MODE_INFINITE; - - const lv_font_t * font = lv_obj_get_style_text_font(obj, 0); - int32_t normal_h = roller->option_cnt * (lv_font_get_line_height(font) + lv_obj_get_style_text_letter_space(obj, 0)); - roller->inf_page_cnt = LV_CLAMP(3, EXTRA_INF_SIZE / normal_h, 15); - if(!(roller->inf_page_cnt & 1)) roller->inf_page_cnt++; /*Make it odd*/ - LV_LOG_INFO("Using %" LV_PRIu32 " pages to make the roller look infinite", roller->inf_page_cnt); - - size_t opt_len = lv_strlen(options) + 1; /*+1 to add '\n' after option lists*/ - size_t opt_extra_len = opt_len * roller->inf_page_cnt; - if(opt_extra_len == 0) { - /*Prevent write overflow*/ - opt_extra_len = 1; - } - - char * opt_extra = lv_malloc(opt_extra_len); - uint32_t i; - for(i = 0; i < roller->inf_page_cnt; i++) { - lv_strcpy(&opt_extra[opt_len * i], options); - opt_extra[opt_len * (i + 1) - 1] = '\n'; - } - opt_extra[opt_extra_len - 1] = '\0'; - lv_label_set_text(label, opt_extra); - lv_free(opt_extra); - - roller->sel_opt_id = ((roller->inf_page_cnt / 2) + 0) * roller->option_cnt; - - roller->option_cnt = roller->option_cnt * roller->inf_page_cnt; - inf_normalize(obj); - } - - roller->sel_opt_id_ori = roller->sel_opt_id; - - /*If the selected text has larger font the label needs some extra draw padding to draw it.*/ - lv_obj_refresh_ext_draw_size(label); -} - -void lv_roller_set_selected(lv_obj_t * obj, uint32_t sel_opt, lv_anim_enable_t anim) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - /*Set the value even if it's the same as the current value because - *if moving to the next option with an animation which was just deleted in the PRESS Call the ancestor's event handler - *nothing will continue the animation.*/ - - lv_roller_t * roller = (lv_roller_t *)obj; - - /*In infinite mode interpret the new ID relative to the currently visible "page"*/ - if(roller->mode == LV_ROLLER_MODE_INFINITE) { - uint32_t real_option_cnt = roller->option_cnt / roller->inf_page_cnt; - uint32_t current_page = roller->sel_opt_id / real_option_cnt; - /*Set by the user to e.g. 0, 1, 2, 3... - *Upscale the value to the current page*/ - if(sel_opt < real_option_cnt) { - uint32_t act_opt = roller->sel_opt_id - current_page * real_option_cnt; - int32_t sel_opt_signed = sel_opt; - /*Huge jump? Probably from last to first or first to last option.*/ - if((uint32_t)LV_ABS((int16_t)(act_opt - sel_opt)) > real_option_cnt / 2) { - if(act_opt > sel_opt) sel_opt_signed += real_option_cnt; - else sel_opt_signed -= real_option_cnt; - } - sel_opt = sel_opt_signed + real_option_cnt * current_page; - } - } - - roller->sel_opt_id = sel_opt < roller->option_cnt ? sel_opt : roller->option_cnt - 1; - roller->sel_opt_id_ori = roller->sel_opt_id; - - refr_position(obj, anim); -} - -void lv_roller_set_visible_row_count(lv_obj_t * obj, uint32_t row_cnt) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - lv_obj_set_height(obj, (lv_font_get_line_height(font) + line_space) * row_cnt + 2 * border_width); -} - -/*===================== - * Getter functions - *====================*/ - -uint32_t lv_roller_get_selected(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_roller_t * roller = (lv_roller_t *)obj; - if(roller->mode == LV_ROLLER_MODE_INFINITE) { - uint32_t real_id_cnt = roller->option_cnt / roller->inf_page_cnt; - return roller->sel_opt_id % real_id_cnt; - } - else { - return roller->sel_opt_id; - } -} - -void lv_roller_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_roller_t * roller = (lv_roller_t *)obj; - lv_obj_t * label = get_label(obj); - uint32_t i; - uint32_t line = 0; - const char * opt_txt = lv_label_get_text(label); - size_t txt_len = lv_strlen(opt_txt); - - for(i = 0; i < txt_len && line != roller->sel_opt_id; i++) { - if(opt_txt[i] == '\n') line++; - } - - uint32_t c; - for(c = 0; i < txt_len && opt_txt[i] != '\n'; c++, i++) { - if(buf_size && c >= buf_size - 1) { - LV_LOG_WARN("the buffer was too small"); - break; - } - buf[c] = opt_txt[i]; - } - - buf[c] = '\0'; -} - -/** - * Get the options of a roller - * @param roller pointer to roller object - * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") - */ -const char * lv_roller_get_options(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - return lv_label_get_text(get_label(obj)); -} - -uint32_t lv_roller_get_option_count(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_roller_t * roller = (lv_roller_t *)obj; - if(roller->mode == LV_ROLLER_MODE_INFINITE) { - return roller->option_cnt / roller->inf_page_cnt; - } - else { - return roller->option_cnt; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_roller_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_roller_t * roller = (lv_roller_t *)obj; - - roller->mode = LV_ROLLER_MODE_NORMAL; - roller->option_cnt = 0; - roller->sel_opt_id = 0; - roller->sel_opt_id_ori = 0; - - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); - - LV_LOG_INFO("begin"); - lv_obj_t * label = lv_obj_class_create_obj(&lv_roller_label_class, obj); - lv_obj_class_init_obj(label); -#if LV_WIDGETS_HAS_DEFAULT_VALUE - lv_roller_set_options(obj, "Option 1\nOption 2\nOption 3\nOption 4\nOption 5", LV_ROLLER_MODE_NORMAL); -#endif - LV_LOG_TRACE("finished"); -} - -static void lv_roller_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - - /*Call the ancestor's event handler*/ - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - const lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - lv_roller_t * roller = (lv_roller_t *)obj; - - if(code == LV_EVENT_GET_SELF_SIZE) { - lv_point_t * p = lv_event_get_param(e); - p->x = get_selected_label_width(obj); - } - else if(code == LV_EVENT_STYLE_CHANGED) { - lv_obj_t * label = get_label(obj); - /*Be sure the label's style is updated before processing the roller*/ - if(label) lv_obj_send_event(label, LV_EVENT_STYLE_CHANGED, NULL); - lv_obj_refresh_self_size(obj); - refr_position(obj, LV_ANIM_OFF); - } - else if(code == LV_EVENT_SIZE_CHANGED) { - refr_position(obj, LV_ANIM_OFF); - } - else if(code == LV_EVENT_PRESSED) { - if(roller->option_cnt <= 1) return; - - roller->moved = 0; - lv_anim_delete(get_label(obj), set_y_anim); - } - else if(code == LV_EVENT_PRESSING) { - if(roller->option_cnt <= 1) return; - - lv_indev_t * indev = lv_indev_active(); - lv_point_t p; - lv_indev_get_vect(indev, &p); - transform_vect_recursive(obj, &p); - if(p.y) { - lv_obj_t * label = get_label(obj); - lv_obj_set_y(label, lv_obj_get_y_aligned(label) + p.y); - roller->moved = 1; - } - } - else if(code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { - if(roller->option_cnt <= 1) return; - - release_handler(obj); - } - else if(code == LV_EVENT_FOCUSED) { - lv_group_t * g = lv_obj_get_group(obj); - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); - - /*Encoders need special handling*/ - if(indev_type == LV_INDEV_TYPE_ENCODER) { - const bool editing = lv_group_get_editing(g); - - /*Save the current state when entered to edit mode*/ - if(editing) { - roller->sel_opt_id_ori = roller->sel_opt_id; - } - else { /*In navigate mode revert the original value*/ - if(roller->sel_opt_id != roller->sel_opt_id_ori) { - roller->sel_opt_id = roller->sel_opt_id_ori; - refr_position(obj, LV_ANIM_ON); - } - } - } - else { - /*Save the current value. Used to revert this - *state if ENTER won't be pressed*/ - roller->sel_opt_id_ori = roller->sel_opt_id; - } - } - else if(code == LV_EVENT_DEFOCUSED) { - /*Revert the original state*/ - if(roller->sel_opt_id != roller->sel_opt_id_ori) { - roller->sel_opt_id = roller->sel_opt_id_ori; - refr_position(obj, LV_ANIM_ON); - } - } - else if(code == LV_EVENT_KEY) { - if(roller->option_cnt <= 1) return; - - uint32_t c = lv_event_get_key(e); - if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN) { - if(roller->sel_opt_id + 1 < roller->option_cnt) { - uint32_t ori_id = roller->sel_opt_id_ori; /*lv_roller_set_selected will overwrite this*/ - lv_roller_set_selected(obj, roller->sel_opt_id + 1, LV_ANIM_ON); - roller->sel_opt_id_ori = ori_id; - } - } - else if(c == LV_KEY_LEFT || c == LV_KEY_UP) { - if(roller->sel_opt_id > 0) { - uint32_t ori_id = roller->sel_opt_id_ori; /*lv_roller_set_selected will overwrite this*/ - lv_roller_set_selected(obj, roller->sel_opt_id - 1, LV_ANIM_ON); - roller->sel_opt_id_ori = ori_id; - } - } - } - else if(code == LV_EVENT_ROTARY) { - if(roller->option_cnt <= 1) return; - - int32_t r = lv_event_get_rotary_diff(e); - int32_t new_id = roller->sel_opt_id + r; - new_id = LV_CLAMP(0, new_id, (int32_t)roller->option_cnt - 1); - if((int32_t)roller->sel_opt_id != new_id) { - uint32_t ori_id = roller->sel_opt_id_ori; /*lv_roller_set_selected will overwrite this*/ - lv_roller_set_selected(obj, new_id, LV_ANIM_ON); - roller->sel_opt_id_ori = ori_id; - } - } - else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - lv_obj_t * label = get_label(obj); - lv_obj_refresh_ext_draw_size(label); - } - else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST) { - draw_main(e); - } -} - -static void lv_roller_label_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - - lv_event_code_t code = lv_event_get_code(e); - /*LV_EVENT_DRAW_MAIN will be called in the draw function*/ - if(code != LV_EVENT_DRAW_MAIN) { - /* Call the ancestor's event handler */ - res = lv_obj_event_base(MY_CLASS_LABEL, e); - if(res != LV_RESULT_OK) return; - } - - lv_obj_t * label = lv_event_get_current_target(e); - if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - /*If the selected text has a larger font it needs some extra space to draw it*/ - int32_t * s = lv_event_get_param(e); - lv_obj_t * obj = lv_obj_get_parent(label); - int32_t sel_w = get_selected_label_width(obj); - int32_t label_w = lv_obj_get_width(label); - *s = LV_MAX(*s, sel_w - label_w); - } - else if(code == LV_EVENT_SIZE_CHANGED) { - refr_position(lv_obj_get_parent(label), LV_ANIM_OFF); - } - else if(code == LV_EVENT_DRAW_MAIN) { - draw_label(e); - } -} - -static void draw_main(lv_event_t * e) -{ - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - if(code == LV_EVENT_DRAW_MAIN) { - /*Draw the selected rectangle*/ - lv_layer_t * layer = lv_event_get_layer(e); - lv_area_t sel_area; - get_sel_area(obj, &sel_area); - lv_draw_rect_dsc_t sel_dsc; - lv_draw_rect_dsc_init(&sel_dsc); - lv_obj_init_draw_rect_dsc(obj, LV_PART_SELECTED, &sel_dsc); - lv_draw_rect(layer, &sel_dsc, &sel_area); - } - /*Post draw when the children are drawn*/ - else if(code == LV_EVENT_DRAW_POST) { - lv_layer_t * layer = lv_event_get_layer(e); - - lv_draw_label_dsc_t label_dsc; - lv_draw_label_dsc_init(&label_dsc); - lv_obj_init_draw_label_dsc(obj, LV_PART_SELECTED, &label_dsc); - - /*Redraw the text on the selected area*/ - lv_area_t sel_area; - get_sel_area(obj, &sel_area); - lv_area_t mask_sel; - bool area_ok; - area_ok = lv_area_intersect(&mask_sel, &layer->_clip_area, &sel_area); - if(area_ok) { - lv_obj_t * label = get_label(obj); - - /*Get the size of the "selected text"*/ - lv_point_t label_sel_size; - lv_text_get_size(&label_sel_size, lv_label_get_text(label), label_dsc.font, label_dsc.letter_space, - label_dsc.line_space, lv_obj_get_width(obj), LV_TEXT_FLAG_EXPAND); - - /*Move the selected label proportionally with the background label*/ - int32_t roller_h = lv_obj_get_height(obj); - const lv_font_t * normal_label_font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - /*label offset from the middle line of the roller*/ - int32_t label_y_prop = (label->coords.y1 + normal_label_font->line_height / 2) - (roller_h / 2 + obj->coords.y1); - - /*Proportional position from the middle line. - *Will be 0 for the first option, and 1 for the last option (upscaled by << 14)*/ - int32_t remain_h = lv_obj_get_height(label) - normal_label_font->line_height; - if(remain_h > 0) { - label_y_prop = (label_y_prop << 14) / remain_h; - } - - /*We don't want the selected label start and end exactly where the normal label is as - *a larger font won't centered on selected area.*/ - int32_t corr = label_dsc.font->line_height; - - /*Apply the proportional position to the selected text*/ - int32_t label_sel_y = roller_h / 2 + obj->coords.y1; - label_sel_y += ((label_sel_size.y - corr) * label_y_prop) >> 14; - label_sel_y -= corr / 2; - - int32_t bwidth = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - int32_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - - /*Draw the selected text*/ - lv_area_t label_sel_area; - label_sel_area.x1 = obj->coords.x1 + pleft + bwidth; - label_sel_area.y1 = label_sel_y; - label_sel_area.x2 = obj->coords.x2 - pright - bwidth; - label_sel_area.y2 = label_sel_area.y1 + label_sel_size.y; - - label_dsc.flag |= LV_TEXT_FLAG_EXPAND; - const lv_area_t clip_area_ori = layer->_clip_area; - layer->_clip_area = mask_sel; - label_dsc.text = lv_label_get_text(label); - lv_draw_label(layer, &label_dsc, &label_sel_area); - layer->_clip_area = clip_area_ori; - } - } -} - -static void draw_label(lv_event_t * e) -{ - /* Split the drawing of the label into an upper (above the selected area) - * and a lower (below the selected area)*/ - lv_obj_t * label_obj = lv_event_get_current_target(e); - lv_obj_t * roller = lv_obj_get_parent(label_obj); - lv_draw_label_dsc_t label_draw_dsc; - lv_draw_label_dsc_init(&label_draw_dsc); - lv_obj_init_draw_label_dsc(roller, LV_PART_MAIN, &label_draw_dsc); - lv_layer_t * layer = lv_event_get_layer(e); - - /*If the roller has shadow or outline it has some ext. draw size - *therefore the label can overflow the roller's boundaries. - *To solve this limit the clip area to the "plain" roller.*/ - const lv_area_t clip_area_ori = layer->_clip_area; - lv_area_t roller_clip_area; - if(!lv_area_intersect(&roller_clip_area, &layer->_clip_area, &roller->coords)) return; - layer->_clip_area = roller_clip_area; - - lv_area_t sel_area; - get_sel_area(roller, &sel_area); - - lv_area_t clip2; - clip2.x1 = label_obj->coords.x1; - clip2.y1 = label_obj->coords.y1; - clip2.x2 = label_obj->coords.x2; - clip2.y2 = sel_area.y1; - if(lv_area_intersect(&clip2, &layer->_clip_area, &clip2)) { - const lv_area_t clip_area_ori2 = layer->_clip_area; - layer->_clip_area = clip2; - label_draw_dsc.text = lv_label_get_text(label_obj); - lv_draw_label(layer, &label_draw_dsc, &label_obj->coords); - layer->_clip_area = clip_area_ori2; - } - - clip2.x1 = label_obj->coords.x1; - clip2.y1 = sel_area.y2; - clip2.x2 = label_obj->coords.x2; - clip2.y2 = label_obj->coords.y2; - if(lv_area_intersect(&clip2, &layer->_clip_area, &clip2)) { - const lv_area_t clip_area_ori2 = layer->_clip_area; - layer->_clip_area = clip2; - label_draw_dsc.text = lv_label_get_text(label_obj); - lv_draw_label(layer, &label_draw_dsc, &label_obj->coords); - layer->_clip_area = clip_area_ori2; - } - - layer->_clip_area = clip_area_ori; -} - -static void get_sel_area(lv_obj_t * obj, lv_area_t * sel_area) -{ - - const lv_font_t * font_main = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - const lv_font_t * font_sel = lv_obj_get_style_text_font(obj, LV_PART_SELECTED); - int32_t font_main_h = lv_font_get_line_height(font_main); - int32_t font_sel_h = lv_font_get_line_height(font_sel); - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - int32_t d = (font_sel_h + font_main_h) / 2 + line_space; - sel_area->y1 = obj->coords.y1 + lv_obj_get_height(obj) / 2 - d / 2; - sel_area->y2 = sel_area->y1 + d; - lv_area_t roller_coords; - lv_obj_get_coords(obj, &roller_coords); - - sel_area->x1 = roller_coords.x1; - sel_area->x2 = roller_coords.x2; - -} - -/** - * Refresh the position of the roller. It uses the id stored in: roller->ddlist.selected_option_id - * @param roller pointer to a roller object - * @param anim_en LV_ANIM_ON: refresh with animation; LV_ANIM_OFF: without animation - */ -static void refr_position(lv_obj_t * obj, lv_anim_enable_t anim_en) -{ - lv_obj_t * label = get_label(obj); - if(label == NULL) return; - - const lv_text_align_t align = lv_obj_calculate_style_text_align(label, LV_PART_MAIN, lv_label_get_text(label)); - - int32_t x = 0; - switch(align) { - case LV_TEXT_ALIGN_CENTER: - x = (lv_obj_get_content_width(obj) - lv_obj_get_width(label)) / 2; - break; - case LV_TEXT_ALIGN_RIGHT: - x = lv_obj_get_content_width(obj) - lv_obj_get_width(label); - break; - case LV_TEXT_ALIGN_LEFT: - x = 0; - break; - default: - /* Invalid alignment */ - break; - } - lv_obj_set_x(label, x); - - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - const int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - const int32_t font_h = lv_font_get_line_height(font); - const int32_t h = lv_obj_get_content_height(obj); - uint32_t anim_time = lv_obj_get_style_anim_duration(obj, LV_PART_MAIN); - - /*Normally the animation's `end_cb` sets correct position of the roller if infinite. - *But without animations we have to do it manually*/ - if(anim_en == LV_ANIM_OFF || anim_time == 0) { - inf_normalize(obj); - } - - /* Calculate animation configuration */ - lv_roller_t * roller = (lv_roller_t *)obj; - int32_t id = roller->sel_opt_id; - const int32_t sel_y1 = id * (font_h + line_space); - const int32_t mid_y1 = h / 2 - font_h / 2; - const int32_t new_y = mid_y1 - sel_y1; - - if(anim_en == LV_ANIM_OFF || anim_time == 0) { - lv_anim_delete(label, set_y_anim); - lv_obj_set_y(label, new_y); - } - else { - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, label); - lv_anim_set_exec_cb(&a, set_y_anim); - lv_anim_set_values(&a, lv_obj_get_y(label), new_y); - lv_anim_set_duration(&a, anim_time); - lv_anim_set_completed_cb(&a, scroll_anim_completed_cb); - lv_anim_set_path_cb(&a, lv_anim_path_ease_out); - lv_anim_start(&a); - } -} - -static lv_result_t release_handler(lv_obj_t * obj) -{ - lv_obj_t * label = get_label(obj); - if(label == NULL) return LV_RESULT_OK; - - lv_indev_t * indev = lv_indev_active(); - lv_roller_t * roller = (lv_roller_t *)obj; - - /*Leave edit mode once a new option is selected*/ - lv_indev_type_t indev_type = lv_indev_get_type(indev); - if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) { - roller->sel_opt_id_ori = roller->sel_opt_id; - - if(indev_type == LV_INDEV_TYPE_ENCODER) { - lv_group_t * g = lv_obj_get_group(obj); - if(lv_group_get_editing(g)) { - lv_group_set_editing(g, false); - } - } - } - - if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON) { - /*Search the clicked option (For KEYPAD and ENCODER the new value should be already set)*/ - int16_t new_opt = -1; - if(roller->moved == 0) { - new_opt = 0; - lv_point_t p; - lv_indev_get_point(indev, &p); - p.y -= label->coords.y1; - p.x -= label->coords.x1; - uint32_t letter_i; - letter_i = lv_label_get_letter_on(label, &p, true); - - const char * txt = lv_label_get_text(label); - uint32_t i = 0; - uint32_t i_prev = 0; - - uint32_t letter_cnt = 0; - for(letter_cnt = 0; letter_cnt < letter_i; letter_cnt++) { - uint32_t letter = lv_text_encoded_next(txt, &i); - /*Count he lines to reach the clicked letter. But ignore the last '\n' because it - * still belongs to the clicked line*/ - if(letter == '\n' && i_prev != letter_i) new_opt++; - i_prev = i; - } - } - else { - /*If dragged then align the list to have an element in the middle*/ - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - int32_t font_h = lv_font_get_line_height(font); - - int32_t label_unit = font_h + line_space; - int32_t mid = obj->coords.y1 + (obj->coords.y2 - obj->coords.y1) / 2; - - lv_point_t p = indev->pointer.scroll_throw_vect_ori; - transform_vect_recursive(obj, &p); - - int32_t scroll_throw = indev->scroll_throw; - int32_t sum = 0; - int32_t v = p.y; - while(v) { - sum += v; - v = v * (100 - scroll_throw) / 100; - } - - int32_t label_y1 = label->coords.y1 + sum; - int32_t id = (mid - label_y1) / label_unit; - - if(id < 0) id = 0; - if(id >= (int32_t)roller->option_cnt) id = roller->option_cnt - 1; - - new_opt = id; - } - - if(new_opt >= 0) { - lv_roller_set_selected(obj, new_opt, LV_ANIM_ON); - } - } - - uint32_t id = roller->sel_opt_id; /*Just to use uint32_t in event data*/ - lv_result_t res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &id); - return res; -} - -/** - * Set the middle page for the roller if infinite is enabled - * @param roller pointer to a roller object - */ -static void inf_normalize(lv_obj_t * obj) -{ - lv_roller_t * roller = (lv_roller_t *)obj; - - if(roller->mode == LV_ROLLER_MODE_INFINITE) { - uint32_t real_id_cnt = roller->option_cnt / roller->inf_page_cnt; - roller->sel_opt_id = roller->sel_opt_id % real_id_cnt; - roller->sel_opt_id += (roller->inf_page_cnt / 2) * real_id_cnt; /*Select the middle page*/ - - roller->sel_opt_id_ori = roller->sel_opt_id % real_id_cnt; - roller->sel_opt_id_ori += (roller->inf_page_cnt / 2) * real_id_cnt; /*Select the middle page*/ - - /*Move to the new id*/ - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - int32_t font_h = lv_font_get_line_height(font); - int32_t h = lv_obj_get_content_height(obj); - - lv_obj_t * label = get_label(obj); - - int32_t sel_y1 = roller->sel_opt_id * (font_h + line_space); - int32_t mid_y1 = h / 2 - font_h / 2; - int32_t new_y = mid_y1 - sel_y1; - lv_obj_set_y(label, new_y); - } -} - -static lv_obj_t * get_label(const lv_obj_t * obj) -{ - return lv_obj_get_child(obj, 0); -} - -static int32_t get_selected_label_width(const lv_obj_t * obj) -{ - lv_obj_t * label = get_label(obj); - if(label == NULL) return 0; - - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_SELECTED); - int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_SELECTED); - const char * txt = lv_label_get_text(label); - lv_point_t size; - lv_text_get_size(&size, txt, font, letter_space, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); - return size.x; -} - -static void scroll_anim_completed_cb(lv_anim_t * a) -{ - lv_obj_t * obj = lv_obj_get_parent(a->var); /*The label is animated*/ - inf_normalize(obj); -} - -static void set_y_anim(void * obj, int32_t v) -{ - lv_obj_set_y(obj, v); -} - -static void transform_vect_recursive(lv_obj_t * roller, lv_point_t * vect) -{ - int16_t angle = 0; - int32_t scale_x = 256; - int32_t scale_y = 256; - lv_obj_t * parent = roller; - while(parent) { - angle += lv_obj_get_style_transform_rotation(parent, 0); - int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, 0); - int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, 0); - scale_x = (scale_y * zoom_act_x) >> 8; - scale_y = (scale_y * zoom_act_y) >> 8; - parent = lv_obj_get_parent(parent); - } - lv_point_t pivot = { 0, 0 }; - - scale_x = 256 * 256 / scale_x; - scale_y = 256 * 256 / scale_y; - lv_point_transform(vect, -angle, scale_x, scale_y, &pivot, false); -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/roller/lv_roller.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/roller/lv_roller.h deleted file mode 100644 index e6a94b2..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/roller/lv_roller.h +++ /dev/null @@ -1,133 +0,0 @@ -/** - * @file lv_roller.h - * - */ - -#ifndef LV_ROLLER_H -#define LV_ROLLER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" - -#if LV_USE_ROLLER != 0 - -/*Testing of dependencies*/ -#if LV_USE_LABEL == 0 -#error "lv_roller: lv_label is required. Enable it in lv_conf.h (LV_USE_ROLLER 1)" -#endif - -#include "../label/lv_label.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Roller mode. */ -typedef enum { - LV_ROLLER_MODE_NORMAL, /**< Normal mode (roller ends at the end of the options). */ - LV_ROLLER_MODE_INFINITE, /**< Infinite mode (roller can be scrolled forever). */ -} lv_roller_mode_t; - -#if LV_USE_OBJ_PROPERTY -enum { - LV_PROPERTY_ID(ROLLER, OPTIONS, LV_PROPERTY_TYPE_TEXT, 0), - LV_PROPERTY_ID(ROLLER, SELECTED, LV_PROPERTY_TYPE_INT, 1), - LV_PROPERTY_ID(ROLLER, VISIBLE_ROW_COUNT, LV_PROPERTY_TYPE_INT, 2), - LV_PROPERTY_ROLLER_END, -}; -#endif - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_roller_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a roller object - * @param parent pointer to an object, it will be the parent of the new roller. - * @return pointer to the created roller - */ -lv_obj_t * lv_roller_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the options on a roller - * @param obj pointer to roller object - * @param options a string with '\n' separated options. E.g. "One\nTwo\nThree" - * @param mode `LV_ROLLER_MODE_NORMAL` or `LV_ROLLER_MODE_INFINITE` - */ -void lv_roller_set_options(lv_obj_t * obj, const char * options, lv_roller_mode_t mode); - -/** - * Set the selected option - * @param obj pointer to a roller object - * @param sel_opt index of the selected option (0 ... number of option - 1); - * @param anim LV_ANIM_ON: set with animation; LV_ANOM_OFF set immediately - */ -void lv_roller_set_selected(lv_obj_t * obj, uint32_t sel_opt, lv_anim_enable_t anim); - -/** - * Set the height to show the given number of rows (options) - * @param obj pointer to a roller object - * @param row_cnt number of desired visible rows - */ -void lv_roller_set_visible_row_count(lv_obj_t * obj, uint32_t row_cnt); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the index of the selected option - * @param obj pointer to a roller object - * @return index of the selected option (0 ... number of option - 1); - */ -uint32_t lv_roller_get_selected(const lv_obj_t * obj); - -/** - * Get the current selected option as a string. - * @param obj pointer to roller object - * @param buf pointer to an array to store the string - * @param buf_size size of `buf` in bytes. 0: to ignore it. - */ -void lv_roller_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size); - -/** - * Get the options of a roller - * @param obj pointer to roller object - * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") - */ -const char * lv_roller_get_options(const lv_obj_t * obj); - -/** - * Get the total number of options - * @param obj pointer to a roller object - * @return the total number of options - */ -uint32_t lv_roller_get_option_count(const lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_ROLLER*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_ROLLER_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/roller/lv_roller_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/roller/lv_roller_private.h deleted file mode 100644 index 5f784a3..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/roller/lv_roller_private.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @file lv_roller_private.h - * - */ - -#ifndef LV_ROLLER_PRIVATE_H -#define LV_ROLLER_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_roller.h" - -#if LV_USE_ROLLER != 0 -#include "../../core/lv_obj_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_roller_t { - lv_obj_t obj; - uint32_t option_cnt; /**< Number of options*/ - uint32_t sel_opt_id; /**< Index of the current option*/ - uint32_t sel_opt_id_ori; /**< Store the original index on focus*/ - uint32_t inf_page_cnt; /**< Number of extra pages added to make the roller look infinite */ - lv_roller_mode_t mode : 2; - uint32_t moved : 1; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_ROLLER != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_ROLLER_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/scale/lv_scale.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/scale/lv_scale.c deleted file mode 100644 index fbab460..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/scale/lv_scale.c +++ /dev/null @@ -1,1504 +0,0 @@ -/** - * @file lv_scale.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_scale_private.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_SCALE != 0 - -#include "../../core/lv_group.h" -#include "../../misc/lv_assert.h" -#include "../../misc/lv_math.h" -#include "../../draw/lv_draw_arc.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_scale_class) - -#define LV_SCALE_LABEL_TXT_LEN (20U) -#define LV_SCALE_DEFAULT_ANGLE_RANGE ((uint32_t) 270U) -#define LV_SCALE_DEFAULT_ROTATION ((int32_t) 135U) -#define LV_SCALE_TICK_IDX_DEFAULT_ID ((uint32_t) 255U) -#define LV_SCALE_DEFAULT_LABEL_GAP ((uint32_t) 15U) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void lv_scale_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_scale_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_scale_event(const lv_obj_class_t * class_p, lv_event_t * event); - -static void scale_draw_main(lv_obj_t * obj, lv_event_t * event); -static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event); -static void scale_draw_label(lv_obj_t * obj, lv_event_t * event, lv_draw_label_dsc_t * label_dsc, - const uint32_t major_tick_idx, const int32_t tick_value, lv_point_t * tick_point_b, const uint32_t tick_idx); -static void scale_calculate_main_compensation(lv_obj_t * obj); - -static void scale_get_center(const lv_obj_t * obj, lv_point_t * center, int32_t * arc_r); -static void scale_get_tick_points(lv_obj_t * obj, const uint32_t tick_idx, bool is_major_tick, - lv_point_t * tick_point_a, lv_point_t * tick_point_b); -static void scale_get_label_coords(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, lv_point_t * tick_point, - lv_area_t * label_coords); -static void scale_set_indicator_label_properties(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, - lv_style_t * indicator_section_style); -static void scale_set_line_properties(lv_obj_t * obj, lv_draw_line_dsc_t * line_dsc, lv_style_t * section_style, - lv_part_t part); -static void scale_set_arc_properties(lv_obj_t * obj, lv_draw_arc_dsc_t * arc_dsc, lv_style_t * section_style); -/* Helpers */ -static void scale_find_section_tick_idx(lv_obj_t * obj); -static void scale_store_main_line_tick_width_compensation(lv_obj_t * obj, const uint32_t tick_idx, - const bool is_major_tick, const int32_t major_tick_width, const int32_t minor_tick_width); -static void scale_store_section_line_tick_width_compensation(lv_obj_t * obj, const bool is_major_tick, - lv_draw_line_dsc_t * major_tick_dsc, lv_draw_line_dsc_t * minor_tick_dsc, - const int32_t tick_value, const uint8_t tick_idx, lv_point_t * tick_point_a); -static void scale_build_custom_label_text(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, - const uint16_t major_tick_idx); - -static void scale_free_line_needle_points_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_scale_class = { - .constructor_cb = lv_scale_constructor, - .destructor_cb = lv_scale_destructor, - .event_cb = lv_scale_event, - .instance_size = sizeof(lv_scale_t), - .editable = LV_OBJ_CLASS_EDITABLE_TRUE, - .base_class = &lv_obj_class, - .name = "scale", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_scale_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*====================== - * Add/remove functions - *=====================*/ - -/* - * New object specific "add" or "remove" functions come here - */ - -/*===================== - * Setter functions - *====================*/ - -void lv_scale_set_mode(lv_obj_t * obj, lv_scale_mode_t mode) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_scale_t * scale = (lv_scale_t *)obj; - - scale->mode = mode; - - lv_obj_invalidate(obj); -} - -void lv_scale_set_total_tick_count(lv_obj_t * obj, uint32_t total_tick_count) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_scale_t * scale = (lv_scale_t *)obj; - - scale->total_tick_count = total_tick_count; - - lv_obj_invalidate(obj); -} - -void lv_scale_set_major_tick_every(lv_obj_t * obj, uint32_t major_tick_every) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_scale_t * scale = (lv_scale_t *)obj; - - scale->major_tick_every = major_tick_every; - - lv_obj_invalidate(obj); -} - -void lv_scale_set_label_show(lv_obj_t * obj, bool show_label) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_scale_t * scale = (lv_scale_t *)obj; - - scale->label_enabled = show_label; - - lv_obj_invalidate(obj); -} - -void lv_scale_set_range(lv_obj_t * obj, int32_t min, int32_t max) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_scale_t * scale = (lv_scale_t *)obj; - - scale->range_min = min; - scale->range_max = max; - - lv_obj_invalidate(obj); -} - -void lv_scale_set_angle_range(lv_obj_t * obj, uint32_t angle_range) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_scale_t * scale = (lv_scale_t *)obj; - - scale->angle_range = angle_range; - - lv_obj_invalidate(obj); -} - -void lv_scale_set_rotation(lv_obj_t * obj, int32_t rotation) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_scale_t * scale = (lv_scale_t *)obj; - - scale->rotation = rotation; - - lv_obj_invalidate(obj); -} - -void lv_scale_set_line_needle_value(lv_obj_t * obj, lv_obj_t * needle_line, int32_t needle_length, - int32_t value) -{ - int32_t angle; - int32_t scale_width, scale_height; - int32_t actual_needle_length; - int32_t needle_length_x, needle_length_y; - lv_point_precise_t * needle_line_points = NULL; - - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_scale_t * scale = (lv_scale_t *)obj; - if((scale->mode != LV_SCALE_MODE_ROUND_INNER) && - (scale->mode != LV_SCALE_MODE_ROUND_OUTER)) { - return; - } - - lv_obj_align(needle_line, LV_ALIGN_TOP_LEFT, 0, 0); - - scale_width = lv_obj_get_style_width(obj, LV_PART_MAIN); - scale_height = lv_obj_get_style_height(obj, LV_PART_MAIN); - - if(scale_width != scale_height) { - return; - } - - if(needle_length >= scale_width / 2) { - actual_needle_length = scale_width / 2; - } - else if(needle_length >= 0) { - actual_needle_length = needle_length; - } - else if(needle_length + scale_width / 2 < 0) { - actual_needle_length = 0; - } - else { - actual_needle_length = scale_width / 2 + needle_length; - } - - if(value < scale->range_min) { - angle = 0; - } - else if(value > scale->range_max) { - angle = scale->angle_range; - } - else { - angle = scale->angle_range * (value - scale->range_min) / (scale->range_max - scale->range_min); - } - - needle_length_x = (actual_needle_length * lv_trigo_cos(scale->rotation + angle)) >> LV_TRIGO_SHIFT; - needle_length_y = (actual_needle_length * lv_trigo_sin(scale->rotation + angle)) >> LV_TRIGO_SHIFT; - - if(lv_line_is_point_array_mutable(needle_line) && lv_line_get_point_count(needle_line) >= 2) { - needle_line_points = lv_line_get_points_mutable(needle_line); - } - - if(needle_line_points == NULL) { - uint32_t i; - uint32_t line_event_cnt = lv_obj_get_event_count(needle_line); - for(i = 0; i < line_event_cnt; i--) { - lv_event_dsc_t * dsc = lv_obj_get_event_dsc(needle_line, i); - if(lv_event_dsc_get_cb(dsc) == scale_free_line_needle_points_cb) { - needle_line_points = lv_event_dsc_get_user_data(dsc); - break; - } - } - } - - if(needle_line_points == NULL) { - needle_line_points = lv_malloc(sizeof(lv_point_precise_t) * 2); - LV_ASSERT_MALLOC(needle_line_points); - if(needle_line_points == NULL) return; - lv_obj_add_event_cb(needle_line, scale_free_line_needle_points_cb, LV_EVENT_DELETE, needle_line_points); - } - - needle_line_points[0].x = scale_width / 2; - needle_line_points[0].y = scale_height / 2; - needle_line_points[1].x = scale_width / 2 + needle_length_x; - needle_line_points[1].y = scale_height / 2 + needle_length_y; - - lv_line_set_points_mutable(needle_line, needle_line_points, 2); -} - -void lv_scale_set_image_needle_value(lv_obj_t * obj, lv_obj_t * needle_img, int32_t value) -{ - int32_t angle; - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_scale_t * scale = (lv_scale_t *)obj; - if((scale->mode != LV_SCALE_MODE_ROUND_INNER) && - (scale->mode != LV_SCALE_MODE_ROUND_OUTER)) { - return; - } - - if(value < scale->range_min) { - angle = 0; - } - else if(value > scale->range_max) { - angle = scale->angle_range; - } - else { - angle = scale->angle_range * (value - scale->range_min) / (scale->range_max - scale->range_min); - } - - lv_image_set_rotation(needle_img, (scale->rotation + angle) * 10); -} - -void lv_scale_set_text_src(lv_obj_t * obj, const char * txt_src[]) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_scale_t * scale = (lv_scale_t *)obj; - - scale->txt_src = txt_src; - scale->custom_label_cnt = 0; - if(scale->txt_src) { - int32_t idx; - for(idx = 0; txt_src[idx]; ++idx) { - scale->custom_label_cnt++; - } - } - - lv_obj_invalidate(obj); -} - -void lv_scale_set_post_draw(lv_obj_t * obj, bool en) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_scale_t * scale = (lv_scale_t *)obj; - - scale->post_draw = en; - - lv_obj_invalidate(obj); -} - -void lv_scale_set_draw_ticks_on_top(lv_obj_t * obj, bool en) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_scale_t * scale = (lv_scale_t *)obj; - - scale->draw_ticks_on_top = en; - - lv_obj_invalidate(obj); -} - -lv_scale_section_t * lv_scale_add_section(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_scale_t * scale = (lv_scale_t *)obj; - lv_scale_section_t * section = lv_ll_ins_head(&scale->section_ll); - LV_ASSERT_MALLOC(section); - if(section == NULL) return NULL; - - /* Section default values */ - section->main_style = NULL; - section->indicator_style = NULL; - section->items_style = NULL; - section->minor_range = 0U; - section->major_range = 0U; - section->first_tick_idx_in_section = LV_SCALE_TICK_IDX_DEFAULT_ID; - section->last_tick_idx_in_section = LV_SCALE_TICK_IDX_DEFAULT_ID; - section->first_tick_idx_is_major = 0U; - section->last_tick_idx_is_major = 0U; - section->first_tick_in_section_width = 0U; - section->last_tick_in_section_width = 0U; - - return section; -} - -void lv_scale_section_set_range(lv_scale_section_t * section, int32_t minor_range, int32_t major_range) -{ - if(NULL == section) return; - - section->minor_range = minor_range; - section->major_range = major_range; -} - -void lv_scale_section_set_style(lv_scale_section_t * section, lv_part_t part, lv_style_t * section_part_style) -{ - if(NULL == section) return; - - switch(part) { - case LV_PART_MAIN: - section->main_style = section_part_style; - break; - case LV_PART_INDICATOR: - section->indicator_style = section_part_style; - break; - case LV_PART_ITEMS: - section->items_style = section_part_style; - break; - default: - /* Invalid part */ - break; - } -} - -/*===================== - * Getter functions - *====================*/ - -lv_scale_mode_t lv_scale_get_mode(lv_obj_t * obj) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - return scale->mode; -} - -int32_t lv_scale_get_total_tick_count(lv_obj_t * obj) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - return scale->total_tick_count; -} - -int32_t lv_scale_get_major_tick_every(lv_obj_t * obj) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - return scale->major_tick_every; -} - -bool lv_scale_get_label_show(lv_obj_t * obj) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - return scale->label_enabled; -} - -uint32_t lv_scale_get_angle_range(lv_obj_t * obj) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - return scale->angle_range; -} - -int32_t lv_scale_get_range_min_value(lv_obj_t * obj) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - return scale->range_min; -} - -int32_t lv_scale_get_range_max_value(lv_obj_t * obj) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - return scale->range_max; -} - -/*===================== - * Other functions - *====================*/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_scale_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_scale_t * scale = (lv_scale_t *)obj; - - lv_ll_init(&scale->section_ll, sizeof(lv_scale_section_t)); - - scale->total_tick_count = LV_SCALE_TOTAL_TICK_COUNT_DEFAULT; - scale->major_tick_every = LV_SCALE_MAJOR_TICK_EVERY_DEFAULT; - scale->mode = LV_SCALE_MODE_HORIZONTAL_BOTTOM; - scale->label_enabled = LV_SCALE_LABEL_ENABLED_DEFAULT; - scale->angle_range = LV_SCALE_DEFAULT_ANGLE_RANGE; - scale->rotation = LV_SCALE_DEFAULT_ROTATION; - scale->range_min = 0U; - scale->range_max = 100U; - scale->last_tick_width = 0U; - scale->first_tick_width = 0U; - scale->post_draw = false; - scale->draw_ticks_on_top = false; - scale->custom_label_cnt = 0U; - scale->txt_src = NULL; - - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_scale_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_scale_t * scale = (lv_scale_t *)obj; - lv_scale_section_t * section; - while(scale->section_ll.head) { - section = lv_ll_get_head(&scale->section_ll); - lv_ll_remove(&scale->section_ll, section); - lv_free(section); - } - lv_ll_clear(&scale->section_ll); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_scale_event(const lv_obj_class_t * class_p, lv_event_t * event) -{ - LV_UNUSED(class_p); - - /*Call the ancestor's event handler*/ - lv_result_t res = lv_obj_event_base(MY_CLASS, event); - if(res != LV_RESULT_OK) return; - - lv_event_code_t event_code = lv_event_get_code(event); - lv_obj_t * obj = lv_event_get_current_target(event); - lv_scale_t * scale = (lv_scale_t *) obj; - LV_UNUSED(scale); - - if(event_code == LV_EVENT_DRAW_MAIN) { - if(scale->post_draw == false) { - scale_find_section_tick_idx(obj); - scale_calculate_main_compensation(obj); - - if(scale->draw_ticks_on_top) { - scale_draw_main(obj, event); - scale_draw_indicator(obj, event); - } - else { - scale_draw_indicator(obj, event); - scale_draw_main(obj, event); - } - } - } - if(event_code == LV_EVENT_DRAW_POST) { - if(scale->post_draw == true) { - scale_find_section_tick_idx(obj); - scale_calculate_main_compensation(obj); - - if(scale->draw_ticks_on_top) { - scale_draw_main(obj, event); - scale_draw_indicator(obj, event); - } - else { - scale_draw_indicator(obj, event); - scale_draw_main(obj, event); - } - } - } - else if(event_code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - /* NOTE: Extend scale draw size so the first tick label can be shown */ - lv_event_set_ext_draw_size(event, 100); - } - else { - /* Nothing to do. Invalid event */ - } -} - -static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - lv_layer_t * layer = lv_event_get_layer(event); - - if(scale->total_tick_count <= 1) return; - - lv_draw_label_dsc_t label_dsc; - lv_draw_label_dsc_init(&label_dsc); - /* Formatting the labels with the configured style for LV_PART_INDICATOR */ - lv_obj_init_draw_label_dsc(obj, LV_PART_INDICATOR, &label_dsc); - - /* Major tick style */ - lv_draw_line_dsc_t major_tick_dsc; - lv_draw_line_dsc_init(&major_tick_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_INDICATOR, &major_tick_dsc); - if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { - major_tick_dsc.raw_end = 0; - } - - /* Configure line draw descriptor for the minor tick drawing */ - lv_draw_line_dsc_t minor_tick_dsc; - lv_draw_line_dsc_init(&minor_tick_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &minor_tick_dsc); - - /* Main line style */ - lv_draw_line_dsc_t main_line_dsc; - lv_draw_line_dsc_init(&main_line_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &main_line_dsc); - - const uint32_t total_tick_count = scale->total_tick_count; - uint32_t tick_idx = 0; - uint32_t major_tick_idx = 0; - for(tick_idx = 0; tick_idx < total_tick_count; tick_idx++) { - /* A major tick is the one which has a label in it */ - bool is_major_tick = false; - if(tick_idx % scale->major_tick_every == 0) is_major_tick = true; - if(is_major_tick) major_tick_idx++; - - const int32_t tick_value = lv_map(tick_idx, 0U, total_tick_count - 1, scale->range_min, scale->range_max); - - label_dsc.base.id1 = tick_idx; - label_dsc.base.id2 = tick_value; - - /* Overwrite label and tick properties if tick value is within section range */ - lv_scale_section_t * section; - LV_LL_READ_BACK(&scale->section_ll, section) { - if(section->minor_range <= tick_value && section->major_range >= tick_value) { - if(is_major_tick) { - scale_set_indicator_label_properties(obj, &label_dsc, section->indicator_style); - scale_set_line_properties(obj, &major_tick_dsc, section->indicator_style, LV_PART_INDICATOR); - } - else { - scale_set_line_properties(obj, &minor_tick_dsc, section->items_style, LV_PART_ITEMS); - } - break; - } - else { - /* Tick is not in section, get the proper styles */ - lv_obj_init_draw_label_dsc(obj, LV_PART_INDICATOR, &label_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_INDICATOR, &major_tick_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &minor_tick_dsc); - } - } - - /* The tick is represented by a line. We need two points to draw it */ - lv_point_t tick_point_a; - lv_point_t tick_point_b; - scale_get_tick_points(obj, tick_idx, is_major_tick, &tick_point_a, &tick_point_b); - - /* Setup a label if they're enabled and we're drawing a major tick */ - if(scale->label_enabled && is_major_tick) { - scale_draw_label(obj, event, &label_dsc, major_tick_idx, tick_value, &tick_point_b, tick_idx); - } - - if(is_major_tick) { - major_tick_dsc.p1 = lv_point_to_precise(&tick_point_a); - major_tick_dsc.p2 = lv_point_to_precise(&tick_point_b); - lv_draw_line(layer, &major_tick_dsc); - } - else { - minor_tick_dsc.p1 = lv_point_to_precise(&tick_point_a); - minor_tick_dsc.p2 = lv_point_to_precise(&tick_point_b); - lv_draw_line(layer, &minor_tick_dsc); - } - } -} - -static void scale_draw_label(lv_obj_t * obj, lv_event_t * event, lv_draw_label_dsc_t * label_dsc, - const uint32_t major_tick_idx, const int32_t tick_value, lv_point_t * tick_point_b, - const uint32_t tick_idx) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - lv_layer_t * layer = lv_event_get_layer(event); - - /* Label text setup */ - char text_buffer[LV_SCALE_LABEL_TXT_LEN] = {0}; - lv_area_t label_coords; - - /* Check if the custom text array has element for this major tick index */ - if(scale->txt_src) { - scale_build_custom_label_text(obj, label_dsc, major_tick_idx); - } - else { /* Add label with mapped values */ - lv_snprintf(text_buffer, sizeof(text_buffer), "%" LV_PRId32, tick_value); - label_dsc->text = text_buffer; - label_dsc->text_local = 1; - } - - if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) - || (LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode || LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode)) { - scale_get_label_coords(obj, label_dsc, tick_point_b, &label_coords); - } - else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { - lv_area_t scale_area; - lv_obj_get_content_coords(obj, &scale_area); - - /* Find the center of the scale */ - lv_point_t center_point; - int32_t radius_edge = LV_MIN(lv_area_get_width(&scale_area) / 2U, lv_area_get_height(&scale_area) / 2U); - center_point.x = scale_area.x1 + radius_edge; - center_point.y = scale_area.y1 + radius_edge; - - const int32_t major_len = lv_obj_get_style_length(obj, LV_PART_INDICATOR); - uint32_t label_gap = LV_SCALE_DEFAULT_LABEL_GAP; /* TODO: Add to style properties */ - - /* Also take into consideration the letter space of the style */ - int32_t angle_upscale = ((tick_idx * scale->angle_range) * 10U) / (scale->total_tick_count - 1); - angle_upscale += scale->rotation * 10U; - - uint32_t radius_text = 0; - if(LV_SCALE_MODE_ROUND_INNER == scale->mode) { - radius_text = (radius_edge - major_len) - (label_gap + label_dsc->letter_space); - } - else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode) { - radius_text = (radius_edge + major_len) + (label_gap + label_dsc->letter_space); - } - else { /* Nothing to do */ } - - lv_point_t point; - point.x = center_point.x + radius_text; - point.y = center_point.y; - lv_point_transform(&point, angle_upscale, LV_SCALE_NONE, LV_SCALE_NONE, ¢er_point, false); - scale_get_label_coords(obj, label_dsc, &point, &label_coords); - } - /* Invalid mode */ - else { - return; - } - - lv_draw_label(layer, label_dsc, &label_coords); -} - -static void scale_calculate_main_compensation(lv_obj_t * obj) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - - const uint32_t total_tick_count = scale->total_tick_count; - - if(total_tick_count <= 1) return; - /* Not supported in round modes */ - if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) return; - - /* Major tick style */ - lv_draw_line_dsc_t major_tick_dsc; - lv_draw_line_dsc_init(&major_tick_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_INDICATOR, &major_tick_dsc); - - /* Configure line draw descriptor for the minor tick drawing */ - lv_draw_line_dsc_t minor_tick_dsc; - lv_draw_line_dsc_init(&minor_tick_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &minor_tick_dsc); - - uint32_t tick_idx = 0; - for(tick_idx = 0; tick_idx < total_tick_count; tick_idx++) { - - const bool is_major_tick = tick_idx % scale->major_tick_every == 0; - - const int32_t tick_value = lv_map(tick_idx, 0U, total_tick_count - 1, scale->range_min, scale->range_max); - - /* Overwrite label and tick properties if tick value is within section range */ - lv_scale_section_t * section; - LV_LL_READ_BACK(&scale->section_ll, section) { - if(section->minor_range <= tick_value && section->major_range >= tick_value) { - if(is_major_tick) { - scale_set_line_properties(obj, &major_tick_dsc, section->indicator_style, LV_PART_INDICATOR); - } - else { - scale_set_line_properties(obj, &minor_tick_dsc, section->items_style, LV_PART_ITEMS); - } - break; - } - else { - /* Tick is not in section, get the proper styles */ - lv_obj_init_draw_line_dsc(obj, LV_PART_INDICATOR, &major_tick_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &minor_tick_dsc); - } - } - - /* The tick is represented by a line. We need two points to draw it */ - lv_point_t tick_point_a; - lv_point_t tick_point_b; - scale_get_tick_points(obj, tick_idx, is_major_tick, &tick_point_a, &tick_point_b); - - /* Store initial and last tick widths to be used in the main line drawing */ - scale_store_main_line_tick_width_compensation(obj, tick_idx, is_major_tick, major_tick_dsc.width, minor_tick_dsc.width); - /* Store the first and last section tick vertical/horizontal position */ - scale_store_section_line_tick_width_compensation(obj, is_major_tick, &major_tick_dsc, &minor_tick_dsc, - tick_value, tick_idx, &tick_point_a); - } -} - -static void scale_draw_main(lv_obj_t * obj, lv_event_t * event) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - lv_layer_t * layer = lv_event_get_layer(event); - - if(scale->total_tick_count <= 1) return; - - if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) - || (LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode || LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode)) { - - /* Configure both line and label draw descriptors for the tick and label drawings */ - lv_draw_line_dsc_t line_dsc; - lv_draw_line_dsc_init(&line_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &line_dsc); - - /* Get style properties so they can be used in the main line drawing */ - const int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - const int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; - const int32_t pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN) + border_width; - const int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; - const int32_t pad_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN) + border_width; - - int32_t x_ofs = 0U; - int32_t y_ofs = 0U; - - if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) { - x_ofs = obj->coords.x2 + (line_dsc.width / 2U) - pad_right; - y_ofs = obj->coords.y1 + pad_top; - } - else if(LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { - x_ofs = obj->coords.x1 + (line_dsc.width / 2U) + pad_left; - y_ofs = obj->coords.y1 + pad_top; - } - if(LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode) { - x_ofs = obj->coords.x1 + pad_right; - y_ofs = obj->coords.y1 + (line_dsc.width / 2U) + pad_top; - } - else if(LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode) { - x_ofs = obj->coords.x1 + pad_left; - y_ofs = obj->coords.y2 + (line_dsc.width / 2U) - pad_bottom; - } - else { /* Nothing to do */ } - - lv_point_t main_line_point_a; - lv_point_t main_line_point_b; - - /* Setup the tick points */ - if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { - main_line_point_a.x = x_ofs - 1U; - main_line_point_a.y = y_ofs; - main_line_point_b.x = x_ofs - 1U; - main_line_point_b.y = obj->coords.y2 - pad_bottom; - - /* Adjust main line with initial and last tick width */ - main_line_point_a.y -= scale->last_tick_width / 2U; - main_line_point_b.y += scale->first_tick_width / 2U; - } - else { - main_line_point_a.x = x_ofs; - main_line_point_a.y = y_ofs; - /* X of second point starts at the edge of the object minus the left pad */ - main_line_point_b.x = obj->coords.x2 - (pad_left); - main_line_point_b.y = y_ofs; - - /* Adjust main line with initial and last tick width */ - main_line_point_a.x -= scale->last_tick_width / 2U; - main_line_point_b.x += scale->first_tick_width / 2U; - } - - line_dsc.p1 = lv_point_to_precise(&main_line_point_a); - line_dsc.p2 = lv_point_to_precise(&main_line_point_b); - lv_draw_line(layer, &line_dsc); - - lv_scale_section_t * section; - LV_LL_READ_BACK(&scale->section_ll, section) { - lv_draw_line_dsc_t section_line_dsc; - lv_draw_line_dsc_init(§ion_line_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, §ion_line_dsc); - - /* Calculate the points of the section line */ - lv_point_t section_point_a; - lv_point_t section_point_b; - - const int32_t first_tick_width_halved = (int32_t)(section->first_tick_in_section_width / 2U); - const int32_t last_tick_width_halved = (int32_t)(section->last_tick_in_section_width / 2U); - - /* Calculate the position of the section based on the ticks (first and last) index */ - if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { - /* Calculate position of the first tick in the section */ - section_point_a.x = main_line_point_a.x; - section_point_a.y = section->first_tick_in_section.y + first_tick_width_halved; - - /* Calculate position of the last tick in the section */ - section_point_b.x = main_line_point_a.x; - section_point_b.y = section->last_tick_in_section.y - last_tick_width_halved; - } - else { - /* Calculate position of the first tick in the section */ - section_point_a.x = section->first_tick_in_section.x - first_tick_width_halved; - section_point_a.y = main_line_point_a.y; - - /* Calculate position of the last tick in the section */ - section_point_b.x = section->last_tick_in_section.x + last_tick_width_halved; - section_point_b.y = main_line_point_a.y; - } - - scale_set_line_properties(obj, §ion_line_dsc, section->main_style, LV_PART_MAIN); - - section_line_dsc.p1.x = section_point_a.x; - section_line_dsc.p1.y = section_point_a.y; - section_line_dsc.p2.x = section_point_b.x; - section_line_dsc.p2.y = section_point_b.y; - lv_draw_line(layer, §ion_line_dsc); - } - } - else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { - /* Configure arc draw descriptors for the main part */ - lv_draw_arc_dsc_t arc_dsc; - lv_draw_arc_dsc_init(&arc_dsc); - lv_obj_init_draw_arc_dsc(obj, LV_PART_MAIN, &arc_dsc); - - lv_point_t arc_center; - int32_t arc_radius; - scale_get_center(obj, &arc_center, &arc_radius); - - /* TODO: Add compensation for the width of the first and last tick over the arc */ - const int32_t start_angle = lv_map(scale->range_min, scale->range_min, scale->range_max, scale->rotation, - scale->rotation + scale->angle_range); - const int32_t end_angle = lv_map(scale->range_max, scale->range_min, scale->range_max, scale->rotation, - scale->rotation + scale->angle_range); - - arc_dsc.center = arc_center; - arc_dsc.radius = arc_radius; - arc_dsc.start_angle = start_angle; - arc_dsc.end_angle = end_angle; - - lv_draw_arc(layer, &arc_dsc); - - lv_scale_section_t * section; - LV_LL_READ_BACK(&scale->section_ll, section) { - lv_draw_arc_dsc_t main_arc_section_dsc; - lv_draw_arc_dsc_init(&main_arc_section_dsc); - lv_obj_init_draw_arc_dsc(obj, LV_PART_MAIN, &main_arc_section_dsc); - - lv_point_t section_arc_center; - int32_t section_arc_radius; - scale_get_center(obj, §ion_arc_center, §ion_arc_radius); - - /* TODO: Add compensation for the width of the first and last tick over the arc */ - const int32_t section_start_angle = lv_map(section->minor_range, scale->range_min, scale->range_max, scale->rotation, - scale->rotation + scale->angle_range); - const int32_t section_end_angle = lv_map(section->major_range, scale->range_min, scale->range_max, scale->rotation, - scale->rotation + scale->angle_range); - - scale_set_arc_properties(obj, &main_arc_section_dsc, section->main_style); - - main_arc_section_dsc.center = section_arc_center; - main_arc_section_dsc.radius = section_arc_radius; - main_arc_section_dsc.start_angle = section_start_angle; - main_arc_section_dsc.end_angle = section_end_angle; - - lv_draw_arc(layer, &main_arc_section_dsc); - } - } - else { /* Nothing to do */ } -} - -/** - * Get center point and radius of scale arc - * @param obj pointer to a scale object - * @param center pointer to center - * @param arc_r pointer to arc radius - */ -static void scale_get_center(const lv_obj_t * obj, lv_point_t * center, int32_t * arc_r) -{ - int32_t left_bg = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t right_bg = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - int32_t top_bg = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - int32_t bottom_bg = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - - int32_t r = (LV_MIN(lv_obj_get_width(obj) - left_bg - right_bg, lv_obj_get_height(obj) - top_bg - bottom_bg)) / 2U; - - center->x = obj->coords.x1 + r + left_bg; - center->y = obj->coords.y1 + r + top_bg; - - if(arc_r) *arc_r = r; -} - -/** - * Get points for ticks - * - * In order to draw ticks we need two points, this interface returns both points for all scale modes. - * - * @param obj pointer to a scale object - * @param tick_idx index of the current tick - * @param is_major_tick true if tick_idx is a major tick - * @param tick_point_a pointer to point 'a' of the tick - * @param tick_point_b pointer to point 'b' of the tick - */ -static void scale_get_tick_points(lv_obj_t * obj, const uint32_t tick_idx, bool is_major_tick, - lv_point_t * tick_point_a, lv_point_t * tick_point_b) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - - /* Main line style */ - lv_draw_line_dsc_t main_line_dsc; - lv_draw_line_dsc_init(&main_line_dsc); - lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &main_line_dsc); - - int32_t minor_len = 0; - int32_t major_len = 0; - - if(is_major_tick) { - major_len = lv_obj_get_style_length(obj, LV_PART_INDICATOR); - } - else { - minor_len = lv_obj_get_style_length(obj, LV_PART_ITEMS); - } - - if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) - || (LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode || LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode)) { - - /* Get style properties so they can be used in the tick and label drawing */ - const int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - const int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; - const int32_t pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN) + border_width; - const int32_t pad_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN) + border_width; - const int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; - const int32_t tick_pad_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); - const int32_t tick_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); - const int32_t tick_pad_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); - const int32_t tick_pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); - - int32_t x_ofs = 0U; - int32_t y_ofs = 0U; - - if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) { - x_ofs = obj->coords.x2 + (main_line_dsc.width / 2U) - pad_right; - y_ofs = obj->coords.y1 + (pad_top + tick_pad_top); - } - else if(LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { - x_ofs = obj->coords.x1 + (main_line_dsc.width / 2U) + pad_left; - y_ofs = obj->coords.y1 + (pad_top + tick_pad_top); - } - else if(LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode) { - x_ofs = obj->coords.x1 + (pad_right + tick_pad_right); - y_ofs = obj->coords.y1 + (main_line_dsc.width / 2U) + pad_top; - } - /* LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode */ - else { - x_ofs = obj->coords.x1 + (pad_left + tick_pad_left); - y_ofs = obj->coords.y2 + (main_line_dsc.width / 2U) - pad_bottom; - } - - /* Adjust length when tick will be drawn on horizontal top or vertical right scales */ - if((LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode) || (LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode)) { - if(is_major_tick) { - major_len *= -1; - } - else { - minor_len *= -1; - } - } - else { /* Nothing to do */ } - - const int32_t tick_length = is_major_tick ? major_len : minor_len; - /* NOTE - * Minus 1 because tick count starts at 0 - * TODO - * What if total_tick_count is 1? This will lead to an division by 0 further down */ - const uint32_t tmp_tick_count = scale->total_tick_count - 1U; - - /* Calculate the position of the tick points based on the mode and tick index */ - if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { - /* Vertical position starts at y2 of the scale main line, we start at y2 because the ticks are drawn from bottom to top */ - int32_t vertical_position = obj->coords.y2 - (pad_bottom + tick_pad_bottom); - - /* Position the last tick */ - if(tmp_tick_count == tick_idx) { - vertical_position = y_ofs; - } - /* Otherwise adjust the tick position depending of its index and number of ticks on the scale */ - else if(0 != tick_idx) { - const int32_t scale_total_height = lv_obj_get_height(obj) - (pad_top + pad_bottom + tick_pad_top + tick_pad_bottom); - const int32_t offset = ((int32_t) tick_idx * (int32_t) scale_total_height) / (int32_t)(tmp_tick_count); - vertical_position -= offset; - } - else { /* Nothing to do */ } - - tick_point_a->x = x_ofs - 1U; /* Move extra pixel out of scale boundary */ - tick_point_a->y = vertical_position; - tick_point_b->x = tick_point_a->x - tick_length; - tick_point_b->y = vertical_position; - } - else { - /* Horizontal position starts at x1 of the scale main line */ - int32_t horizontal_position = x_ofs; - - /* Position the last tick */ - if(tmp_tick_count == tick_idx) { - horizontal_position = obj->coords.x2 - (pad_left + tick_pad_left); - } - /* Otherwise adjust the tick position depending of its index and number of ticks on the scale */ - else if(0U != tick_idx) { - const int32_t scale_total_width = lv_obj_get_width(obj) - (pad_right + pad_left + tick_pad_right + tick_pad_left); - const int32_t offset = ((int32_t) tick_idx * (int32_t) scale_total_width) / (int32_t)(tmp_tick_count); - horizontal_position += offset; - } - else { /* Nothing to do */ } - - tick_point_a->x = horizontal_position; - tick_point_a->y = y_ofs; - tick_point_b->x = horizontal_position; - tick_point_b->y = tick_point_a->y + tick_length; - } - } - else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { - lv_area_t scale_area; - lv_obj_get_content_coords(obj, &scale_area); - - /* Find the center of the scale */ - lv_point_t center_point; - const int32_t radius_edge = LV_MIN(lv_area_get_width(&scale_area) / 2U, lv_area_get_height(&scale_area) / 2U); - center_point.x = scale_area.x1 + radius_edge; - center_point.y = scale_area.y1 + radius_edge; - - int32_t angle_upscale = ((tick_idx * scale->angle_range) * 10U) / (scale->total_tick_count - 1); - angle_upscale += scale->rotation * 10U; - - /* Draw a little bit longer lines to be sure the mask will clip them correctly - * and to get a better precision. Adding the main line width to the calculation so we don't have gaps - * between the arc and the ticks */ - int32_t point_closer_to_arc = 0; - int32_t adjusted_radio_with_tick_len = 0; - if(LV_SCALE_MODE_ROUND_INNER == scale->mode) { - point_closer_to_arc = radius_edge - main_line_dsc.width; - adjusted_radio_with_tick_len = point_closer_to_arc - (is_major_tick ? major_len : minor_len); - } - /* LV_SCALE_MODE_ROUND_OUTER == scale->mode */ - else { - point_closer_to_arc = radius_edge - main_line_dsc.width; - adjusted_radio_with_tick_len = point_closer_to_arc + (is_major_tick ? major_len : minor_len); - } - - tick_point_a->x = center_point.x + point_closer_to_arc; - tick_point_a->y = center_point.y; - lv_point_transform(tick_point_a, angle_upscale, LV_SCALE_NONE, LV_SCALE_NONE, ¢er_point, false); - - tick_point_b->x = center_point.x + adjusted_radio_with_tick_len; - tick_point_b->y = center_point.y; - lv_point_transform(tick_point_b, angle_upscale, LV_SCALE_NONE, LV_SCALE_NONE, ¢er_point, false); - } - else { /* Nothing to do */ } -} - -/** - * Get coordinates for label - * - * @param obj pointer to a scale object - * @param label_dsc pointer to label descriptor - * @param tick_point pointer to reference tick - * @param label_coords pointer to label coordinates output - */ -static void scale_get_label_coords(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, lv_point_t * tick_point, - lv_area_t * label_coords) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - - /* Reserve appropriate size for the tick label */ - lv_point_t label_size; - lv_text_get_size(&label_size, label_dsc->text, - label_dsc->font, label_dsc->letter_space, label_dsc->line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); - - /* Set the label draw area at some distance of the major tick */ - if((LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode) || (LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode)) { - label_coords->x1 = tick_point->x - (label_size.x / 2U); - label_coords->x2 = tick_point->x + (label_size.x / 2U); - - if(LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode) { - label_coords->y1 = tick_point->y + lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); - label_coords->y2 = label_coords->y1 + label_size.y; - } - else { - label_coords->y2 = tick_point->y - lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); - label_coords->y1 = label_coords->y2 - label_size.y; - } - } - else if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) || (LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode)) { - label_coords->y1 = tick_point->y - (label_size.y / 2U); - label_coords->y2 = tick_point->y + (label_size.y / 2U); - - if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) { - label_coords->x1 = tick_point->x - label_size.x - lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); - label_coords->x2 = tick_point->x - lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); - } - else { - label_coords->x1 = tick_point->x + lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); - label_coords->x2 = tick_point->x + label_size.x + lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); - } - } - else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { - label_coords->x1 = tick_point->x - (label_size.x / 2U); - label_coords->y1 = tick_point->y - (label_size.y / 2U); - label_coords->x2 = label_coords->x1 + label_size.x; - label_coords->y2 = label_coords->y1 + label_size.y; - } - else { /* Nothing to do */ } -} - -/** - * Set line properties - * - * Checks if the line has a custom section configuration or not and sets the properties accordingly. - * - * @param obj pointer to a scale object - * @param line_dsc pointer to line descriptor - * @param items_section_style pointer to indicator section style - * @param part line part, example: LV_PART_INDICATOR, LV_PART_ITEMS, LV_PART_MAIN - */ -static void scale_set_line_properties(lv_obj_t * obj, lv_draw_line_dsc_t * line_dsc, lv_style_t * section_style, - lv_part_t part) -{ - if(section_style) { - lv_style_value_t value; - lv_style_res_t res; - - /* Line width */ - res = lv_style_get_prop(section_style, LV_STYLE_LINE_WIDTH, &value); - if(res == LV_STYLE_RES_FOUND) { - line_dsc->width = (int32_t)value.num; - } - else { - line_dsc->width = lv_obj_get_style_line_width(obj, part); - } - - /* Line color */ - res = lv_style_get_prop(section_style, LV_STYLE_LINE_COLOR, &value); - if(res == LV_STYLE_RES_FOUND) { - line_dsc->color = value.color; - } - else { - line_dsc->color = lv_obj_get_style_line_color(obj, part); - } - - /* Line opa */ - res = lv_style_get_prop(section_style, LV_STYLE_LINE_OPA, &value); - if(res == LV_STYLE_RES_FOUND) { - line_dsc->opa = (lv_opa_t)value.num; - } - else { - line_dsc->opa = lv_obj_get_style_line_opa(obj, part); - } - } - else { - line_dsc->color = lv_obj_get_style_line_color(obj, part); - line_dsc->opa = lv_obj_get_style_line_opa(obj, part); - line_dsc->width = lv_obj_get_style_line_width(obj, part); - } -} - -/** - * Set arc properties - * - * Checks if the arc has a custom section configuration or not and sets the properties accordingly. - * - * @param obj pointer to a scale object - * @param line_dsc pointer to arc descriptor - * @param items_section_style pointer to indicator section style - */ -static void scale_set_arc_properties(lv_obj_t * obj, lv_draw_arc_dsc_t * arc_dsc, lv_style_t * section_style) -{ - if(section_style) { - lv_style_value_t value; - lv_style_res_t res; - - /* Line width */ - res = lv_style_get_prop(section_style, LV_STYLE_ARC_WIDTH, &value); - if(res == LV_STYLE_RES_FOUND) { - arc_dsc->width = (int32_t)value.num; - } - else { - arc_dsc->width = lv_obj_get_style_line_width(obj, LV_PART_MAIN); - } - - /* Line color */ - res = lv_style_get_prop(section_style, LV_STYLE_ARC_COLOR, &value); - if(res == LV_STYLE_RES_FOUND) { - arc_dsc->color = value.color; - } - else { - arc_dsc->color = lv_obj_get_style_line_color(obj, LV_PART_MAIN); - } - - /* Line opa */ - res = lv_style_get_prop(section_style, LV_STYLE_ARC_OPA, &value); - if(res == LV_STYLE_RES_FOUND) { - arc_dsc->opa = (lv_opa_t)value.num; - } - else { - arc_dsc->opa = lv_obj_get_style_line_opa(obj, LV_PART_MAIN); - } - } - else { - arc_dsc->color = lv_obj_get_style_line_color(obj, LV_PART_MAIN); - arc_dsc->opa = lv_obj_get_style_line_opa(obj, LV_PART_MAIN); - arc_dsc->width = lv_obj_get_style_line_width(obj, LV_PART_MAIN); - } -} - -/** - * Set indicator label properties - * - * Checks if the indicator has a custom section configuration or not and sets the properties accordingly. - * - * @param obj pointer to a scale object - * @param label_dsc pointer to label descriptor - * @param items_section_style pointer to indicator section style - */ -static void scale_set_indicator_label_properties(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, - lv_style_t * indicator_section_style) -{ - if(indicator_section_style) { - lv_style_value_t value; - lv_style_res_t res; - - /* Text color */ - res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_COLOR, &value); - if(res == LV_STYLE_RES_FOUND) { - label_dsc->color = value.color; - } - else { - label_dsc->color = lv_obj_get_style_text_color(obj, LV_PART_INDICATOR); - } - - /* Text opa */ - res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_OPA, &value); - if(res == LV_STYLE_RES_FOUND) { - label_dsc->opa = (lv_opa_t)value.num; - } - else { - label_dsc->opa = lv_obj_get_style_text_opa(obj, LV_PART_INDICATOR); - } - - /* Text letter space */ - res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_LETTER_SPACE, &value); - if(res == LV_STYLE_RES_FOUND) { - label_dsc->letter_space = (int32_t)value.num; - } - else { - label_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_INDICATOR); - } - - /* Text font */ - res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_FONT, &value); - if(res == LV_STYLE_RES_FOUND) { - label_dsc->font = (const lv_font_t *)value.ptr; - } - else { - label_dsc->font = lv_obj_get_style_text_font(obj, LV_PART_INDICATOR); - } - } - else { - /* If label is not within a range then get the indicator style */ - label_dsc->color = lv_obj_get_style_text_color(obj, LV_PART_INDICATOR); - label_dsc->opa = lv_obj_get_style_text_opa(obj, LV_PART_INDICATOR); - label_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_INDICATOR); - label_dsc->font = lv_obj_get_style_text_font(obj, LV_PART_INDICATOR); - } -} - -static void scale_find_section_tick_idx(lv_obj_t * obj) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - - const int32_t min_out = scale->range_min; - const int32_t max_out = scale->range_max; - const uint32_t total_tick_count = scale->total_tick_count; - - /* Section handling */ - uint32_t tick_idx = 0; - for(tick_idx = 0; tick_idx < total_tick_count; tick_idx++) { - bool is_major_tick = false; - if(tick_idx % scale->major_tick_every == 0) is_major_tick = true; - - const int32_t tick_value = lv_map(tick_idx, 0U, total_tick_count - 1, min_out, max_out); - - lv_scale_section_t * section; - LV_LL_READ_BACK(&scale->section_ll, section) { - if(section->minor_range <= tick_value && section->major_range >= tick_value) { - if(LV_SCALE_TICK_IDX_DEFAULT_ID == section->first_tick_idx_in_section) { - section->first_tick_idx_in_section = tick_idx; - section->first_tick_idx_is_major = is_major_tick; - } - if(section->first_tick_idx_in_section != tick_idx) { - section->last_tick_idx_in_section = tick_idx; - section->last_tick_idx_is_major = is_major_tick; - } - } - else { /* Nothing to do */ } - } - } -} - -/** - * Stores the width of the initial and last tick of the main line - * - * This width is used to compensate the main line drawing taking into consideration the widths of both ticks - * - * @param obj pointer to a scale object - * @param tick_idx index of the current tick - * @param is_major_tick true if tick_idx is a major tick - * @param major_tick_width width of the major tick - * @param minor_tick_width width of the minor tick - */ -static void scale_store_main_line_tick_width_compensation(lv_obj_t * obj, const uint32_t tick_idx, - const bool is_major_tick, const int32_t major_tick_width, const int32_t minor_tick_width) -{ - lv_scale_t * scale = (lv_scale_t *)obj; - const bool is_first_tick = 0U == tick_idx; - const bool is_last_tick = scale->total_tick_count == tick_idx; - const int32_t tick_width = is_major_tick ? major_tick_width : minor_tick_width; - - /* Exit early if tick_idx is neither the first nor last tick on the main line */ - if(((!is_last_tick) && (!is_first_tick)) - /* Exit early if scale mode is round. It doesn't support main line compensation */ - || ((LV_SCALE_MODE_ROUND_INNER == scale->mode) || (LV_SCALE_MODE_ROUND_OUTER == scale->mode))) { - return; - } - - if(is_last_tick) { - /* Mode is vertical */ - if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) || (LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode)) { - scale->last_tick_width = tick_width; - } - /* Mode is horizontal */ - else { - scale->first_tick_width = tick_width; - } - } - /* is_first_tick */ - else { - /* Mode is vertical */ - if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) || (LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode)) { - scale->first_tick_width = tick_width; - } - /* Mode is horizontal */ - else { - scale->last_tick_width = tick_width; - } - } -} - -/** - * Sets the text of the tick label descriptor when using custom labels - * - * Sets the text pointer when valid custom label is available, otherwise set it to NULL. - * - * @param obj pointer to a scale object - * @param label_dsc pointer to the label descriptor - * @param major_tick_idx index of the current major tick - */ -static void scale_build_custom_label_text(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, - const uint16_t major_tick_idx) -{ - lv_scale_t * scale = (lv_scale_t *) obj; - - /* Check if the scale has valid custom labels available, - * this avoids reading past txt_src array when the scale requires more tick labels than available */ - if(major_tick_idx <= scale->custom_label_cnt) { - if(scale->txt_src[major_tick_idx - 1U]) { - label_dsc->text = scale->txt_src[major_tick_idx - 1U]; - label_dsc->text_local = 0; - } - else { - label_dsc->text = NULL; - } - } - else { - label_dsc->text = NULL; - } -} - -/** - * Stores tick width compensation information for main line sections - * - * @param obj pointer to a scale object - * @param is_major_tick Indicates if tick is major or not - * @param major_tick_dsc pointer to the major_tick_dsc - * @param minor_tick_dsc pointer to the minor_tick_dsc - * @param tick_value Current tick value, used to know if tick_idx belongs to a section or not - * @param tick_idx Current tick index - * @param tick_point_a Pointer to tick point a - */ -static void scale_store_section_line_tick_width_compensation(lv_obj_t * obj, const bool is_major_tick, - lv_draw_line_dsc_t * major_tick_dsc, lv_draw_line_dsc_t * minor_tick_dsc, - const int32_t tick_value, const uint8_t tick_idx, lv_point_t * tick_point_a) -{ - lv_scale_t * scale = (lv_scale_t *) obj; - lv_scale_section_t * section; - - LV_LL_READ_BACK(&scale->section_ll, section) { - if(section->minor_range <= tick_value && section->major_range >= tick_value) { - if(is_major_tick) { - scale_set_line_properties(obj, major_tick_dsc, section->indicator_style, LV_PART_INDICATOR); - } - else { - scale_set_line_properties(obj, minor_tick_dsc, section->items_style, LV_PART_ITEMS); - } - } - - int32_t tmp_width = 0; - - if(tick_idx == section->first_tick_idx_in_section) { - if(section->first_tick_idx_is_major) { - tmp_width = major_tick_dsc->width; - } - else { - tmp_width = minor_tick_dsc->width; - } - - section->first_tick_in_section.y = tick_point_a->y; - /* Add 1px as adjustment if tmp_width is odd */ - if(tmp_width & 0x01U) { - if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { - tmp_width += 1U; - } - else { - tmp_width -= 1U; - } - } - section->first_tick_in_section_width = tmp_width; - } - else if(tick_idx == section->last_tick_idx_in_section) { - if(section->last_tick_idx_is_major) { - tmp_width = major_tick_dsc->width; - } - else { - tmp_width = minor_tick_dsc->width; - } - - section->last_tick_in_section.y = tick_point_a->y; - /* Add 1px as adjustment if tmp_width is odd */ - if(tmp_width & 0x01U) { - if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { - tmp_width -= 1U; - } - else { - tmp_width += 1U; - } - } - section->last_tick_in_section_width = tmp_width; - } - else { /* Nothing to do */ } - } -} - -static void scale_free_line_needle_points_cb(lv_event_t * e) -{ - lv_point_precise_t * needle_line_points = lv_event_get_user_data(e); - lv_free(needle_line_points); -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/scale/lv_scale.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/scale/lv_scale.h deleted file mode 100644 index ad1bd2b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/scale/lv_scale.h +++ /dev/null @@ -1,258 +0,0 @@ -/** - * @file lv_scale.h - * - */ - -#ifndef LV_SCALE_H -#define LV_SCALE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -#if LV_USE_SCALE != 0 - -#include "../../core/lv_obj.h" -#include "../line/lv_line.h" -#include "../image/lv_image.h" - -/********************* - * DEFINES - *********************/ - -/**Default value of total minor ticks. */ -#define LV_SCALE_TOTAL_TICK_COUNT_DEFAULT (11U) -LV_EXPORT_CONST_INT(LV_SCALE_TOTAL_TICK_COUNT_DEFAULT); - -/**Default value of major tick every nth ticks. */ -#define LV_SCALE_MAJOR_TICK_EVERY_DEFAULT (5U) -LV_EXPORT_CONST_INT(LV_SCALE_MAJOR_TICK_EVERY_DEFAULT); - -/**Default value of scale label enabled. */ -#define LV_SCALE_LABEL_ENABLED_DEFAULT (1U) -LV_EXPORT_CONST_INT(LV_SCALE_LABEL_ENABLED_DEFAULT); - -/********************** - * TYPEDEFS - **********************/ - -/** - * Scale mode - */ -typedef enum { - LV_SCALE_MODE_HORIZONTAL_TOP = 0x00U, - LV_SCALE_MODE_HORIZONTAL_BOTTOM = 0x01U, - LV_SCALE_MODE_VERTICAL_LEFT = 0x02U, - LV_SCALE_MODE_VERTICAL_RIGHT = 0x04U, - LV_SCALE_MODE_ROUND_INNER = 0x08U, - LV_SCALE_MODE_ROUND_OUTER = 0x10U, - LV_SCALE_MODE_LAST -} lv_scale_mode_t; - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_scale_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an scale object - * @param parent pointer to an object, it will be the parent of the new scale - * @return pointer to the created scale - */ -lv_obj_t * lv_scale_create(lv_obj_t * parent); - -/*====================== - * Add/remove functions - *=====================*/ - -/*===================== - * Setter functions - *====================*/ - -/** - * Set scale mode. See lv_scale_mode_t - * @param obj pointer the scale object - * @param mode the new scale mode - */ -void lv_scale_set_mode(lv_obj_t * obj, lv_scale_mode_t mode); - -/** - * Set scale total tick count (including minor and major ticks) - * @param obj pointer the scale object - * @param total_tick_count New total tick count - */ -void lv_scale_set_total_tick_count(lv_obj_t * obj, uint32_t total_tick_count); - -/** - * Sets how often the major tick will be drawn - * @param obj pointer the scale object - * @param major_tick_every the new count for major tick drawing - */ -void lv_scale_set_major_tick_every(lv_obj_t * obj, uint32_t major_tick_every); - -/** - * Sets label visibility - * @param obj pointer the scale object - * @param show_label true/false to enable tick label - */ -void lv_scale_set_label_show(lv_obj_t * obj, bool show_label); - -/** - * Set the minimal and maximal values on a scale - * @param obj pointer to a scale object - * @param min minimum value of the scale - * @param max maximum value of the scale - */ -void lv_scale_set_range(lv_obj_t * obj, int32_t min, int32_t max); - -/** - * Set properties specific to round scale - * @param obj pointer to a scale object - * @param angle_range the angular range of the scale - */ -void lv_scale_set_angle_range(lv_obj_t * obj, uint32_t angle_range); - -/** - * Set properties specific to round scale - * @param obj pointer to a scale object - * @param rotation the angular offset from the 3 o'clock position (clock-wise) - */ -void lv_scale_set_rotation(lv_obj_t * obj, int32_t rotation); - -/** - * Point the needle to the corresponding value through the line - * @param obj pointer to a scale object - * @param needle_line needle_line of the scale. The line points will be allocated and - * managed by the scale unless the line point array was previously set - * using `lv_line_set_points_mutable`. - * @param needle_length length of the needle - * needle_length>0 needle_length=needle_length; - * needle_length<0 needle_length=radius-|needle_length|; - * @param value needle to point to the corresponding value - */ -void lv_scale_set_line_needle_value(lv_obj_t * obj, lv_obj_t * needle_line, int32_t needle_length, - int32_t value); - -/** - * Point the needle to the corresponding value through the image, - image must point to the right. E.g. -O------> - * @param obj pointer to a scale object - * @param needle_img needle_img of the scale - * @param value needle to point to the corresponding value - */ -void lv_scale_set_image_needle_value(lv_obj_t * obj, lv_obj_t * needle_img, int32_t value); - -/** - * Set custom text source for major ticks labels - * @param obj pointer to a scale object - * @param txt_src pointer to an array of strings which will be display at major ticks - */ -void lv_scale_set_text_src(lv_obj_t * obj, const char * txt_src[]); - -/** - * Draw the scale after all the children are drawn - * @param obj pointer to a scale object - * @param en true: enable post draw - */ -void lv_scale_set_post_draw(lv_obj_t * obj, bool en); - -/** - * Draw the scale ticks on top of all parts - * @param obj pointer to a scale object - * @param en true: enable draw ticks on top of all parts - */ -void lv_scale_set_draw_ticks_on_top(lv_obj_t * obj, bool en); - -/** - * Add a section to the given scale - * @param obj pointer to a scale object - * @return pointer to the new section - */ -lv_scale_section_t * lv_scale_add_section(lv_obj_t * obj); - -/** - * Set the range for the given scale section - * @param section pointer to a scale section object - * @param minor_range section new minor range - * @param major_range section new major range - */ -void lv_scale_section_set_range(lv_scale_section_t * section, int32_t minor_range, int32_t major_range); - -/** - * Set the style of the part for the given scale section - * @param section pointer to a scale section object - * @param part the part for the section, e.g. LV_PART_INDICATOR - * @param section_part_style Pointer to the section part style - */ -void lv_scale_section_set_style(lv_scale_section_t * section, lv_part_t part, lv_style_t * section_part_style); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get scale mode. See lv_scale_mode_t - * @param obj pointer the scale object - * @return Scale mode - */ -lv_scale_mode_t lv_scale_get_mode(lv_obj_t * obj); - -/** - * Get scale total tick count (including minor and major ticks) - * @param obj pointer the scale object - * @return Scale total tick count - */ -int32_t lv_scale_get_total_tick_count(lv_obj_t * obj); - -/** - * Gets how often the major tick will be drawn - * @param obj pointer the scale object - * @return Scale major tick every count - */ -int32_t lv_scale_get_major_tick_every(lv_obj_t * obj); - -/** - * Gets label visibility - * @param obj pointer the scale object - * @return true if tick label is enabled, false otherwise - */ -bool lv_scale_get_label_show(lv_obj_t * obj); - -/** - * Get angle range of a round scale - * @param obj pointer to a scale object - * @return Scale angle_range - */ -uint32_t lv_scale_get_angle_range(lv_obj_t * obj); - -/** - * Get the min range for the given scale section - * @param obj pointer to a scale section object - * @return section minor range - */ -int32_t lv_scale_get_range_min_value(lv_obj_t * obj); - -/** - * Get the max range for the given scale section - * @param obj pointer to a scale section object - * @return section max range - */ -int32_t lv_scale_get_range_max_value(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_SCALE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_SCALE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/scale/lv_scale_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/scale/lv_scale_private.h deleted file mode 100644 index c755c17..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/scale/lv_scale_private.h +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @file lv_scale_private.h - * - */ - -#ifndef LV_SCALE_PRIVATE_H -#define LV_SCALE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_scale.h" - -#if LV_USE_SCALE != 0 -#include "../../core/lv_obj_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_scale_section_t { - lv_style_t * main_style; - lv_style_t * indicator_style; - lv_style_t * items_style; - int32_t minor_range; - int32_t major_range; - uint32_t first_tick_idx_in_section; - uint32_t last_tick_idx_in_section; - uint32_t first_tick_idx_is_major; - uint32_t last_tick_idx_is_major; - int32_t first_tick_in_section_width; - int32_t last_tick_in_section_width; - lv_point_t first_tick_in_section; - lv_point_t last_tick_in_section; -}; - -struct lv_scale_t { - lv_obj_t obj; - lv_ll_t section_ll; /**< Linked list for the sections (stores lv_scale_section_t)*/ - const char ** txt_src; - lv_scale_mode_t mode; - int32_t range_min; - int32_t range_max; - uint32_t total_tick_count : 15; - uint32_t major_tick_every : 15; - uint32_t label_enabled : 1; - uint32_t post_draw : 1; - uint32_t draw_ticks_on_top : 1; - /* Round scale */ - uint32_t angle_range; - int32_t rotation; - /* Private properties */ - int32_t custom_label_cnt; - int32_t last_tick_width; - int32_t first_tick_width; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_SCALE != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_SCALE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/slider/lv_slider.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/slider/lv_slider.c deleted file mode 100644 index e58597c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/slider/lv_slider.c +++ /dev/null @@ -1,556 +0,0 @@ -/** - * @file lv_slider.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_slider_private.h" -#include "../../misc/lv_area_private.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_obj_event_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_SLIDER != 0 - -#include "../../misc/lv_assert.h" -#include "../../core/lv_group.h" -#include "../../indev/lv_indev.h" -#include "../../indev/lv_indev_private.h" -#include "../../display/lv_display.h" -#include "../../draw/lv_draw.h" -#include "../../stdlib/lv_string.h" -#include "../../misc/lv_math.h" -#include "../image/lv_image.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_slider_class) - -#define LV_SLIDER_KNOB_COORD(is_reversed, area) (is_reversed ? area.x1 : area.x2) -#define LV_SLIDER_KNOB_COORD_VERTICAL(is_reversed, area) (is_reversed ? area.y2 : area.y1) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_slider_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, const int32_t knob_size, const bool hor); -static void draw_knob(lv_event_t * e); -static bool is_slider_horizontal(lv_obj_t * obj); -static void drag_start(lv_obj_t * obj); -static void update_knob_pos(lv_obj_t * obj, bool check_drag); - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_slider_class = { - .constructor_cb = lv_slider_constructor, - .event_cb = lv_slider_event, - .editable = LV_OBJ_CLASS_EDITABLE_TRUE, - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .instance_size = sizeof(lv_slider_t), - .base_class = &lv_bar_class, - .name = "slider", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_slider_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -bool lv_slider_is_dragged(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_slider_t * slider = (lv_slider_t *)obj; - - return slider->dragging; -} - -void lv_slider_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) -{ - lv_bar_set_value(obj, value, anim); -} - -void lv_slider_set_left_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) -{ - lv_bar_set_start_value(obj, value, anim); -} - -void lv_slider_set_range(lv_obj_t * obj, int32_t min, int32_t max) -{ - lv_bar_set_range(obj, min, max); -} - -void lv_slider_set_mode(lv_obj_t * obj, lv_slider_mode_t mode) -{ - lv_bar_set_mode(obj, (lv_bar_mode_t)mode); -} - -int32_t lv_slider_get_value(const lv_obj_t * obj) -{ - return lv_bar_get_value(obj); -} - -int32_t lv_slider_get_left_value(const lv_obj_t * obj) -{ - return lv_bar_get_start_value(obj); -} - -int32_t lv_slider_get_min_value(const lv_obj_t * obj) -{ - return lv_bar_get_min_value(obj); -} - -int32_t lv_slider_get_max_value(const lv_obj_t * obj) -{ - return lv_bar_get_max_value(obj); -} - -lv_slider_mode_t lv_slider_get_mode(lv_obj_t * slider) -{ - lv_bar_mode_t mode = lv_bar_get_mode(slider); - if(mode == LV_BAR_MODE_SYMMETRICAL) return LV_SLIDER_MODE_SYMMETRICAL; - else if(mode == LV_BAR_MODE_RANGE) return LV_SLIDER_MODE_RANGE; - else return LV_SLIDER_MODE_NORMAL; -} - -bool lv_slider_is_symmetrical(lv_obj_t * obj) -{ - return lv_bar_is_symmetrical(obj); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_slider_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_slider_t * slider = (lv_slider_t *)obj; - - /*Initialize the allocated 'slider'*/ - slider->value_to_set = NULL; - slider->dragging = 0U; - slider->left_knob_focus = 0U; - - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); - lv_obj_set_ext_click_area(obj, LV_DPX(8)); -} - -static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - - /*Call the ancestor's event handler*/ - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - lv_slider_t * slider = (lv_slider_t *)obj; - lv_slider_mode_t type = lv_slider_get_mode(obj); - - /*Advanced hit testing: react only on dragging the knob(s)*/ - if(code == LV_EVENT_HIT_TEST) { - lv_hit_test_info_t * info = lv_event_get_param(e); - int32_t ext_click_area = obj->spec_attr ? obj->spec_attr->ext_click_pad : 0; - - /*Ordinary slider: was the knob area hit?*/ - lv_area_t a; - lv_area_copy(&a, &slider->right_knob_area); - lv_area_increase(&a, ext_click_area, ext_click_area); - info->res = lv_area_is_point_on(&a, info->point, 0); - - /*There's still a chance that there is a hit if there is another knob*/ - if((info->res == false) && (type == LV_SLIDER_MODE_RANGE)) { - lv_area_copy(&a, &slider->left_knob_area); - lv_area_increase(&a, ext_click_area, ext_click_area); - info->res = lv_area_is_point_on(&a, info->point, 0); - } - } - else if(code == LV_EVENT_PRESSED) { - /*Save the pressed coordinates*/ - lv_indev_get_point(lv_indev_active(), &slider->pressed_point); - lv_obj_transform_point(obj, &slider->pressed_point, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE); - } - else if(code == LV_EVENT_PRESSING) { - update_knob_pos(obj, true); - } - else if(code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { - update_knob_pos(obj, false); - slider->dragging = false; - slider->value_to_set = NULL; - - lv_obj_invalidate(obj); - - /*Leave edit mode if released. (No need to wait for LONG_PRESS)*/ - lv_group_t * g = lv_obj_get_group(obj); - bool editing = lv_group_get_editing(g); - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); - if(indev_type == LV_INDEV_TYPE_ENCODER) { - if(editing) { - if(lv_slider_get_mode(obj) == LV_SLIDER_MODE_RANGE) { - if(slider->left_knob_focus == 0) slider->left_knob_focus = 1; - else { - slider->left_knob_focus = 0; - lv_group_set_editing(g, false); - } - } - else { - lv_group_set_editing(g, false); - } - } - } - else if(indev_type == LV_INDEV_TYPE_POINTER) { - if(is_slider_horizontal(obj)) lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); - else lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); - } - } - else if(code == LV_EVENT_FOCUSED) { - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); - if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) { - slider->left_knob_focus = 0; - } - } - else if(code == LV_EVENT_SIZE_CHANGED) { - if(is_slider_horizontal(obj)) { - lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); - } - else { - lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); - } - lv_obj_refresh_ext_draw_size(obj); - } - else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); - int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); - int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); - int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); - - /*The smaller size is the knob diameter*/ - int32_t trans_w = lv_obj_get_style_transform_width(obj, LV_PART_KNOB); - int32_t trans_h = lv_obj_get_style_transform_height(obj, LV_PART_KNOB); - int32_t knob_size = LV_MIN(lv_obj_get_width(obj) + 2 * trans_w, lv_obj_get_height(obj) + 2 * trans_h) >> 1; - knob_size += LV_MAX(LV_MAX(knob_left, knob_right), LV_MAX(knob_bottom, knob_top)); - knob_size += 2; /*For rounding error*/ - knob_size += lv_obj_calculate_ext_draw_size(obj, LV_PART_KNOB); - - /*Indic. size is handled by bar*/ - int32_t * s = lv_event_get_param(e); - *s = LV_MAX(*s, knob_size); - - } - else if(code == LV_EVENT_KEY) { - uint32_t c = lv_event_get_key(e); - - if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { - if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) + 1, LV_ANIM_ON); - else lv_slider_set_left_value(obj, lv_slider_get_left_value(obj) + 1, LV_ANIM_ON); - } - else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { - if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) - 1, LV_ANIM_ON); - else lv_slider_set_left_value(obj, lv_slider_get_left_value(obj) - 1, LV_ANIM_ON); - } - else { - return; - } - - res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - if(res != LV_RESULT_OK) return; - } - else if(code == LV_EVENT_ROTARY) { - int32_t r = lv_event_get_rotary_diff(e); - - if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) + r, LV_ANIM_ON); - else lv_slider_set_left_value(obj, lv_slider_get_left_value(obj) + 1, LV_ANIM_ON); - - res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - if(res != LV_RESULT_OK) return; - } - else if(code == LV_EVENT_DRAW_MAIN) { - draw_knob(e); - } -} - -static void draw_knob(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_slider_t * slider = (lv_slider_t *)obj; - lv_layer_t * layer = lv_event_get_layer(e); - - const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN); - const bool is_horizontal = is_slider_horizontal(obj); - const bool is_reversed = slider->bar.val_reversed ^ (is_rtl && is_horizontal); - - lv_area_t knob_area; - int32_t knob_size; - bool is_symmetrical = lv_slider_is_symmetrical(obj); - - if(is_horizontal) { - knob_size = lv_obj_get_height(obj); - if(is_symmetrical && - slider->bar.cur_value < 0) knob_area.x1 = LV_SLIDER_KNOB_COORD(!is_reversed, slider->bar.indic_area); - else knob_area.x1 = LV_SLIDER_KNOB_COORD(is_reversed, slider->bar.indic_area); - } - else { - knob_size = lv_obj_get_width(obj); - if(is_symmetrical && - slider->bar.cur_value < 0) knob_area.y1 = LV_SLIDER_KNOB_COORD_VERTICAL(!is_reversed, slider->bar.indic_area); - else knob_area.y1 = LV_SLIDER_KNOB_COORD_VERTICAL(is_reversed, slider->bar.indic_area); - } - lv_draw_rect_dsc_t knob_rect_dsc; - lv_draw_rect_dsc_init(&knob_rect_dsc); - lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &knob_rect_dsc); - /* Update knob area with knob style */ - position_knob(obj, &knob_area, knob_size, is_horizontal); - /* Update right knob area with calculated knob area */ - lv_area_copy(&slider->right_knob_area, &knob_area); - - if(lv_slider_get_mode(obj) != LV_SLIDER_MODE_RANGE) { - lv_draw_rect(layer, &knob_rect_dsc, &slider->right_knob_area); - } - else { - /*Save the draw part_draw_dsc. because it can be modified in the event*/ - lv_draw_rect_dsc_t knob_rect_dsc_tmp; - lv_memcpy(&knob_rect_dsc_tmp, &knob_rect_dsc, sizeof(lv_draw_rect_dsc_t)); - /* Draw the right knob */ - lv_draw_rect(layer, &knob_rect_dsc, &slider->right_knob_area); - - /*Calculate the second knob area*/ - if(is_horizontal) { - /*use !is_reversed to get the other knob*/ - knob_area.x1 = LV_SLIDER_KNOB_COORD(!is_reversed, slider->bar.indic_area); - } - else { - knob_area.y1 = LV_SLIDER_KNOB_COORD_VERTICAL(!is_reversed, slider->bar.indic_area); - } - position_knob(obj, &knob_area, knob_size, is_horizontal); - lv_area_copy(&slider->left_knob_area, &knob_area); - - lv_memcpy(&knob_rect_dsc, &knob_rect_dsc_tmp, sizeof(lv_draw_rect_dsc_t)); - - lv_draw_rect(layer, &knob_rect_dsc, &slider->left_knob_area); - } -} - -static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, const int32_t knob_size, const bool hor) -{ - if(hor) { - knob_area->x1 -= (knob_size >> 1); - knob_area->x2 = knob_area->x1 + knob_size - 1; - knob_area->y1 = obj->coords.y1; - knob_area->y2 = obj->coords.y2; - } - else { - knob_area->y1 -= (knob_size >> 1); - knob_area->y2 = knob_area->y1 + knob_size - 1; - knob_area->x1 = obj->coords.x1; - knob_area->x2 = obj->coords.x2; - } - - int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); - int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); - int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); - int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); - - int32_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_KNOB); - int32_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_KNOB); - - /*Apply the paddings on the knob area*/ - knob_area->x1 -= knob_left + transf_w; - knob_area->x2 += knob_right + transf_w; - knob_area->y1 -= knob_top + transf_h; - knob_area->y2 += knob_bottom + transf_h; -} - -static bool is_slider_horizontal(lv_obj_t * obj) -{ - return lv_obj_get_width(obj) >= lv_obj_get_height(obj); -} - -static void drag_start(lv_obj_t * obj) -{ - lv_slider_t * slider = (lv_slider_t *)obj; - lv_slider_mode_t mode = lv_slider_get_mode(obj); - lv_point_t p; - slider->dragging = true; - if(mode == LV_SLIDER_MODE_NORMAL || mode == LV_SLIDER_MODE_SYMMETRICAL) { - slider->value_to_set = &slider->bar.cur_value; - } - else if(mode == LV_SLIDER_MODE_RANGE) { - lv_indev_get_point(lv_indev_active(), &p); - lv_obj_transform_point(obj, &p, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE); - const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN); - const bool is_horizontal = is_slider_horizontal(obj); - const bool is_reversed = slider->bar.val_reversed ^ (is_rtl && is_horizontal); - int32_t dist_left, dist_right; - if(is_horizontal) { - if((!is_reversed && p.x > slider->right_knob_area.x2) || (is_reversed && p.x < slider->right_knob_area.x1)) { - slider->value_to_set = &slider->bar.cur_value; - } - else if((!is_reversed && p.x < slider->left_knob_area.x1) || (is_reversed && p.x > slider->left_knob_area.x2)) { - slider->value_to_set = &slider->bar.start_value; - } - else { - /*Calculate the distance from each knob*/ - dist_left = LV_ABS((slider->left_knob_area.x1 + (slider->left_knob_area.x2 - slider->left_knob_area.x1) / 2) - p.x); - dist_right = LV_ABS((slider->right_knob_area.x1 + (slider->right_knob_area.x2 - slider->right_knob_area.x1) / 2) - p.x); - /*Use whichever one is closer*/ - if(dist_right < dist_left) { - slider->value_to_set = &slider->bar.cur_value; - slider->left_knob_focus = 0; - } - else { - slider->value_to_set = &slider->bar.start_value; - slider->left_knob_focus = 1; - } - } - } - else { - if((!is_reversed && p.y < slider->right_knob_area.y1) || (is_reversed && p.y > slider->right_knob_area.y2)) { - slider->value_to_set = &slider->bar.cur_value; - } - else if((!is_reversed && p.y > slider->left_knob_area.y2) || (is_reversed && p.y < slider->left_knob_area.y1)) { - slider->value_to_set = &slider->bar.start_value; - } - else { - /*Calculate the distance from each knob*/ - dist_left = LV_ABS((slider->left_knob_area.y1 + (slider->left_knob_area.y2 - slider->left_knob_area.y1) / 2) - p.y); - dist_right = LV_ABS((slider->right_knob_area.y1 + (slider->right_knob_area.y2 - slider->right_knob_area.y1) / 2) - p.y); - - /*Use whichever one is closer*/ - if(dist_right < dist_left) { - slider->value_to_set = &slider->bar.cur_value; - slider->left_knob_focus = 0; - } - else { - slider->value_to_set = &slider->bar.start_value; - slider->left_knob_focus = 1; - } - } - } - } -} - -static void update_knob_pos(lv_obj_t * obj, bool check_drag) -{ - lv_slider_t * slider = (lv_slider_t *)obj; - lv_indev_t * indev = lv_indev_active(); - if(lv_indev_get_type(indev) != LV_INDEV_TYPE_POINTER) - return; - if(lv_indev_get_scroll_obj(indev) != NULL) - return; - - lv_point_t p; - lv_indev_get_point(indev, &p); - lv_obj_transform_point(obj, &p, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE); - - bool is_hor = is_slider_horizontal(obj); - - if(check_drag && !slider->dragging) { - int32_t ofs = is_hor ? (p.x - slider->pressed_point.x) : (p.y - slider->pressed_point.y); - - /*Stop processing when offset is below scroll_limit*/ - if(LV_ABS(ofs) < indev->scroll_limit) { - return; - } - } - - if(!slider->value_to_set) { - /*Ready to start drag*/ - drag_start(obj); - } - - int32_t new_value = 0; - const int32_t range = slider->bar.max_value - slider->bar.min_value; - const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN); - const bool is_horizontal = is_slider_horizontal(obj); - const bool is_reversed = slider->bar.val_reversed ^ (is_rtl && is_horizontal); - - if(is_hor) { - const int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - const int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - const int32_t w = lv_obj_get_width(obj); - const int32_t indic_w = w - bg_left - bg_right; - - if(is_reversed) { - /*Make the point relative to the indicator*/ - new_value = (obj->coords.x2 - bg_right) - p.x; - } - else { - /*Make the point relative to the indicator*/ - new_value = p.x - (obj->coords.x1 + bg_left); - } - if(indic_w) { - new_value = (new_value * range + indic_w / 2) / indic_w; - new_value += slider->bar.min_value; - } - } - else { - const int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - const int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - const int32_t h = lv_obj_get_height(obj); - const int32_t indic_h = h - bg_bottom - bg_top; - - if(is_reversed) { - /*Make the point relative to the indicator*/ - new_value = p.y - (obj->coords.y1 + bg_top); - } - else { - /*Make the point relative to the indicator*/ - new_value = p.y - (obj->coords.y2 + bg_bottom); - new_value = -new_value; - } - new_value = (new_value * range + indic_h / 2) / indic_h; - new_value += slider->bar.min_value; - } - - int32_t real_max_value = slider->bar.max_value; - int32_t real_min_value = slider->bar.min_value; - /*Figure out the min. and max. for this mode*/ - if(slider->value_to_set == &slider->bar.start_value) { - real_max_value = slider->bar.cur_value; - } - else { - real_min_value = slider->bar.start_value; - } - - new_value = LV_CLAMP(real_min_value, new_value, real_max_value); - if(*slider->value_to_set != new_value) { - *slider->value_to_set = new_value; - if(is_hor) - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); - else - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); - - lv_obj_invalidate(obj); - lv_result_t res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - if(res != LV_RESULT_OK) - return; - } -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/slider/lv_slider.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/slider/lv_slider.h deleted file mode 100644 index 5f08a5c..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/slider/lv_slider.h +++ /dev/null @@ -1,149 +0,0 @@ -/** - * @file lv_slider.h - * - */ - -#ifndef LV_SLIDER_H -#define LV_SLIDER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../bar/lv_bar.h" - -#if LV_USE_SLIDER != 0 - -/*Testing of dependencies*/ -#if LV_USE_BAR == 0 -#error "lv_slider: lv_bar is required. Enable it in lv_conf.h (LV_USE_BAR 1)" -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef enum { - LV_SLIDER_MODE_NORMAL = LV_BAR_MODE_NORMAL, - LV_SLIDER_MODE_SYMMETRICAL = LV_BAR_MODE_SYMMETRICAL, - LV_SLIDER_MODE_RANGE = LV_BAR_MODE_RANGE -} lv_slider_mode_t; - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_slider_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a slider object - * @param parent pointer to an object, it will be the parent of the new slider. - * @return pointer to the created slider - */ -lv_obj_t * lv_slider_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new value on the slider - * @param obj pointer to a slider object - * @param value the new value - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -void lv_slider_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim); - -/** - * Set a new value for the left knob of a slider - * @param obj pointer to a slider object - * @param value new value - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -void lv_slider_set_left_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim); - -/** - * Set minimum and the maximum values of a bar - * @param obj pointer to the slider object - * @param min minimum value - * @param max maximum value - */ -void lv_slider_set_range(lv_obj_t * obj, int32_t min, int32_t max); - -/** - * Set the mode of slider. - * @param obj pointer to a slider object - * @param mode the mode of the slider. See ::lv_slider_mode_t - */ -void lv_slider_set_mode(lv_obj_t * obj, lv_slider_mode_t mode); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the value of the main knob of a slider - * @param obj pointer to a slider object - * @return the value of the main knob of the slider - */ -int32_t lv_slider_get_value(const lv_obj_t * obj); - -/** - * Get the value of the left knob of a slider - * @param obj pointer to a slider object - * @return the value of the left knob of the slider - */ -int32_t lv_slider_get_left_value(const lv_obj_t * obj); - -/** - * Get the minimum value of a slider - * @param obj pointer to a slider object - * @return the minimum value of the slider - */ -int32_t lv_slider_get_min_value(const lv_obj_t * obj); - -/** - * Get the maximum value of a slider - * @param obj pointer to a slider object - * @return the maximum value of the slider - */ -int32_t lv_slider_get_max_value(const lv_obj_t * obj); - -/** - * Give the slider is being dragged or not - * @param obj pointer to a slider object - * @return true: drag in progress false: not dragged - */ -bool lv_slider_is_dragged(const lv_obj_t * obj); - -/** - * Get the mode of the slider. - * @param slider pointer to a slider object - * @return see ::lv_slider_mode_t - */ -lv_slider_mode_t lv_slider_get_mode(lv_obj_t * slider); - -/** - * Give the slider is in symmetrical mode or not - * @param obj pointer to slider object - * @return true: in symmetrical mode false : not in -*/ -bool lv_slider_is_symmetrical(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_SLIDER*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_SLIDER_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/slider/lv_slider_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/slider/lv_slider_private.h deleted file mode 100644 index a1eab2f..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/slider/lv_slider_private.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @file lv_slider_private.h - * - */ - -#ifndef LV_SLIDER_PRIVATE_H -#define LV_SLIDER_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../bar/lv_bar_private.h" -#include "lv_slider.h" - -#if LV_USE_SLIDER != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_slider_t { - lv_bar_t bar; /**< Add the ancestor's type first */ - lv_area_t left_knob_area; - lv_area_t right_knob_area; - lv_point_t pressed_point; - int32_t * value_to_set; /**< Which bar value to set */ - uint8_t dragging : 1; /**< 1: the slider is being dragged */ - uint8_t left_knob_focus : 1; /**< 1: with encoder now the right knob can be adjusted */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_SLIDER != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_SLIDER_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/span/lv_span.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/span/lv_span.c deleted file mode 100644 index c4afb43..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/span/lv_span.c +++ /dev/null @@ -1,1089 +0,0 @@ -/** - * @file lv_span.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_span_private.h" -#include "../../misc/lv_area_private.h" -#include "../../draw/lv_draw_private.h" -#include "../../core/lv_obj_class_private.h" - -#if LV_USE_SPAN != 0 - -#include "../../misc/lv_assert.h" -#include "../../misc/lv_text_private.h" -#include "../../core/lv_global.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_spangroup_class) -#define snippet_stack LV_GLOBAL_DEFAULT()->span_snippet_stack - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_span_t * span; - const char * txt; - const lv_font_t * font; - uint32_t bytes; - int32_t txt_w; - int32_t line_h; - int32_t letter_space; -} lv_snippet_t; - -struct _snippet_stack { - lv_snippet_t stack[LV_SPAN_SNIPPET_STACK_SIZE]; - uint32_t index; -}; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_spangroup_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_spangroup_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_spangroup_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void draw_main(lv_event_t * e); -static void refresh_self_size(lv_obj_t * obj); - -static const lv_font_t * lv_span_get_style_text_font(lv_obj_t * par, lv_span_t * span); -static int32_t lv_span_get_style_text_letter_space(lv_obj_t * par, lv_span_t * span); -static lv_color_t lv_span_get_style_text_color(lv_obj_t * par, lv_span_t * span); -static lv_opa_t lv_span_get_style_text_opa(lv_obj_t * par, lv_span_t * span); -static lv_blend_mode_t lv_span_get_style_text_blend_mode(lv_obj_t * par, lv_span_t * span); -static int32_t lv_span_get_style_text_decor(lv_obj_t * par, lv_span_t * span); - -static inline void span_text_check(const char ** text); -static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer); -static bool lv_text_get_snippet(const char * txt, const lv_font_t * font, int32_t letter_space, - int32_t max_width, lv_text_flag_t flag, int32_t * use_width, - uint32_t * end_ofs); - -static void lv_snippet_clear(void); -static uint32_t lv_get_snippet_count(void); -static void lv_snippet_push(lv_snippet_t * item); -static lv_snippet_t * lv_get_snippet(uint32_t index); -static int32_t convert_indent_pct(lv_obj_t * spans, int32_t width); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_spangroup_class = { - .base_class = &lv_obj_class, - .constructor_cb = lv_spangroup_constructor, - .destructor_cb = lv_spangroup_destructor, - .event_cb = lv_spangroup_event, - .instance_size = sizeof(lv_spangroup_t), - .width_def = LV_SIZE_CONTENT, - .height_def = LV_SIZE_CONTENT, - .name = "span", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ -void lv_span_stack_init(void) -{ - struct _snippet_stack * stack = snippet_stack = lv_malloc(sizeof(struct _snippet_stack)); - LV_ASSERT_MALLOC(stack); - if(!stack) { - LV_LOG_ERROR("malloc failed for snippet_stack"); - } -} - -void lv_span_stack_deinit(void) -{ - lv_free(snippet_stack); -} - -lv_obj_t * lv_spangroup_create(lv_obj_t * par) -{ - lv_obj_t * obj = lv_obj_class_create_obj(&lv_spangroup_class, par); - lv_obj_class_init_obj(obj); - return obj; -} - -lv_span_t * lv_spangroup_new_span(lv_obj_t * obj) -{ - if(obj == NULL) { - return NULL; - } - - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - lv_span_t * span = lv_ll_ins_tail(&spans->child_ll); - LV_ASSERT_MALLOC(span); - - lv_style_init(&span->style); - span->txt = (char *)""; - span->static_flag = 1; - span->spangroup = obj; - - refresh_self_size(obj); - - return span; -} - -void lv_spangroup_delete_span(lv_obj_t * obj, lv_span_t * span) -{ - if(obj == NULL || span == NULL) { - return; - } - - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - lv_span_t * cur_span; - LV_LL_READ(&spans->child_ll, cur_span) { - if(cur_span == span) { - lv_ll_remove(&spans->child_ll, cur_span); - if(cur_span->txt && cur_span->static_flag == 0) { - lv_free(cur_span->txt); - cur_span->txt = NULL; - } - lv_style_reset(&cur_span->style); - lv_free(cur_span); - cur_span = NULL; - break; - } - } - - refresh_self_size(obj); -} - -/*===================== - * Setter functions - *====================*/ - -void lv_span_set_text(lv_span_t * span, const char * text) -{ - if(span == NULL || text == NULL) { - return; - } - - size_t text_alloc_len = lv_strlen(text) + 1; - - if(span->txt == NULL || span->static_flag == 1) { - span->txt = lv_malloc(text_alloc_len); - LV_ASSERT_MALLOC(span->txt); - } - else { - span->txt = lv_realloc(span->txt, text_alloc_len); - LV_ASSERT_MALLOC(span->txt); - } - - if(span->txt == NULL) return; - - span->static_flag = 0; - lv_memcpy(span->txt, text, text_alloc_len); - - refresh_self_size(span->spangroup); -} - -void lv_span_set_text_static(lv_span_t * span, const char * text) -{ - if(span == NULL || text == NULL) { - return; - } - - if(span->txt && span->static_flag == 0) { - lv_free(span->txt); - span->txt = NULL; - } - span->static_flag = 1; - span->txt = (char *)text; - - refresh_self_size(span->spangroup); -} - -void lv_spangroup_set_align(lv_obj_t * obj, lv_text_align_t align) -{ - lv_obj_set_style_text_align(obj, align, LV_PART_MAIN); -} - -void lv_spangroup_set_overflow(lv_obj_t * obj, lv_span_overflow_t overflow) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - if(spans->overflow == overflow) return; - if(overflow >= LV_SPAN_OVERFLOW_LAST) return; - spans->overflow = overflow; - lv_obj_invalidate(obj); -} - -void lv_spangroup_set_indent(lv_obj_t * obj, int32_t indent) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - if(spans->indent == indent) return; - - spans->indent = indent; - - refresh_self_size(obj); -} - -void lv_spangroup_set_mode(lv_obj_t * obj, lv_span_mode_t mode) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - - if(mode >= LV_SPAN_MODE_LAST) return; - - spans->mode = mode; - lv_spangroup_refr_mode(obj); -} - -void lv_spangroup_set_max_lines(lv_obj_t * obj, int32_t lines) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - spans->lines = lines; - lv_spangroup_refr_mode(obj); -} - -/*===================== - * Getter functions - *====================*/ - -lv_style_t * lv_span_get_style(lv_span_t * span) -{ - return &span->style; -} - -lv_span_t * lv_spangroup_get_child(const lv_obj_t * obj, int32_t id) -{ - if(obj == NULL) { - return NULL; - } - - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - lv_ll_t * linked_list = &spans->child_ll; - - bool traverse_forwards = (id >= 0); - int32_t cur_idx = 0; - lv_ll_node_t * cur_node = linked_list->head; - - /*If using a negative index, start from the tail and use cur -1 to indicate the end*/ - if(!traverse_forwards) { - cur_idx = -1; - cur_node = linked_list->tail; - } - - while(cur_node != NULL) { - if(cur_idx == id) { - return (lv_span_t *) cur_node; - } - if(traverse_forwards) { - cur_node = (lv_ll_node_t *) lv_ll_get_next(linked_list, cur_node); - cur_idx++; - } - else { - cur_node = (lv_ll_node_t *) lv_ll_get_prev(linked_list, cur_node); - cur_idx--; - } - } - - return NULL; -} - -uint32_t lv_spangroup_get_span_count(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - if(obj == NULL) { - return 0; - } - - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - return lv_ll_get_len(&(spans->child_ll)); -} - -lv_text_align_t lv_spangroup_get_align(lv_obj_t * obj) -{ - return lv_obj_get_style_text_align(obj, LV_PART_MAIN); -} - -lv_span_overflow_t lv_spangroup_get_overflow(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - return spans->overflow; -} - -int32_t lv_spangroup_get_indent(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - return spans->indent; -} - -lv_span_mode_t lv_spangroup_get_mode(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - return spans->mode; -} - -int32_t lv_spangroup_get_max_lines(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - return spans->lines; -} - -void lv_spangroup_refr_mode(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - - if(spans->mode == LV_SPAN_MODE_EXPAND) { - lv_obj_set_width(obj, LV_SIZE_CONTENT); - lv_obj_set_height(obj, LV_SIZE_CONTENT); - } - else if(spans->mode == LV_SPAN_MODE_BREAK) { - if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { - lv_obj_set_width(obj, 100); - } - lv_obj_set_height(obj, LV_SIZE_CONTENT); - } - else if(spans->mode == LV_SPAN_MODE_FIXED) { - /* use this mode, The user needs to set the size. */ - /* This is just to prevent an infinite loop. */ - if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { - lv_obj_set_width(obj, 100); - } - if(lv_obj_get_style_height(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { - int32_t width = lv_obj_get_style_width(obj, LV_PART_MAIN); - if(LV_COORD_IS_PCT(width)) { - width = 100; - } - int32_t height = lv_spangroup_get_expand_height(obj, width); - lv_obj_set_content_height(obj, height); - } - } - - refresh_self_size(obj); -} - -int32_t lv_spangroup_get_max_line_height(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - - int32_t max_line_h = 0; - lv_span_t * cur_span; - LV_LL_READ(&spans->child_ll, cur_span) { - const lv_font_t * font = lv_span_get_style_text_font(obj, cur_span); - int32_t line_h = lv_font_get_line_height(font); - if(line_h > max_line_h) { - max_line_h = line_h; - } - } - - return max_line_h; -} - -uint32_t lv_spangroup_get_expand_width(lv_obj_t * obj, uint32_t max_width) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - - if(lv_ll_get_head(&spans->child_ll) == NULL) { - return 0; - } - - uint32_t width = LV_COORD_IS_PCT(spans->indent) ? 0 : spans->indent; - lv_span_t * cur_span; - int32_t letter_space = 0; - LV_LL_READ(&spans->child_ll, cur_span) { - const lv_font_t * font = lv_span_get_style_text_font(obj, cur_span); - letter_space = lv_span_get_style_text_letter_space(obj, cur_span); - uint32_t j = 0; - const char * cur_txt = cur_span->txt; - span_text_check(&cur_txt); - while(cur_txt[j] != '\0') { - if(max_width > 0 && width >= max_width) { - return max_width; - } - uint32_t letter = lv_text_encoded_next(cur_txt, &j); - uint32_t letter_next = lv_text_encoded_next(&cur_txt[j], NULL); - uint32_t letter_w = lv_font_get_glyph_width(font, letter, letter_next); - width = width + letter_w + letter_space; - } - } - - return width - letter_space; -} - -int32_t lv_spangroup_get_expand_height(lv_obj_t * obj, int32_t width) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - if(lv_ll_get_head(&spans->child_ll) == NULL || width <= 0) { - return 0; - } - - /* init draw variable */ - lv_text_flag_t txt_flag = LV_TEXT_FLAG_NONE; - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - int32_t max_width = width; - int32_t indent = convert_indent_pct(obj, max_width); - int32_t max_w = max_width - indent; /* first line need minus indent */ - - /* coords of draw span-txt */ - lv_point_t txt_pos; - lv_point_set(&txt_pos, indent, 0); /* first line need add indent */ - - lv_span_t * cur_span = lv_ll_get_head(&spans->child_ll); - const char * cur_txt = cur_span->txt; - span_text_check(&cur_txt); - uint32_t cur_txt_ofs = 0; - lv_snippet_t snippet; /* use to save cur_span info and push it to stack */ - lv_memset(&snippet, 0, sizeof(snippet)); - - int32_t line_cnt = 0; - int32_t lines = spans->lines < 0 ? INT32_MAX : spans->lines; - /* the loop control how many lines need to draw */ - while(cur_span) { - int snippet_cnt = 0; - int32_t max_line_h = 0; /* the max height of span-font when a line have a lot of span */ - - /* the loop control to find a line and push the relevant span info into stack */ - while(1) { - /* switch to the next span when current is end */ - if(cur_txt[cur_txt_ofs] == '\0') { - cur_span = lv_ll_get_next(&spans->child_ll, cur_span); - if(cur_span == NULL) break; - cur_txt = cur_span->txt; - span_text_check(&cur_txt); - cur_txt_ofs = 0; - /* maybe also cur_txt[cur_txt_ofs] == '\0' */ - continue; - } - - /* init span info to snippet. */ - if(cur_txt_ofs == 0) { - snippet.span = cur_span; - snippet.font = lv_span_get_style_text_font(obj, cur_span); - snippet.letter_space = lv_span_get_style_text_letter_space(obj, cur_span); - snippet.line_h = lv_font_get_line_height(snippet.font) + line_space; - } - - /* get current span text line info */ - uint32_t next_ofs = 0; - int32_t use_width = 0; - bool isfill = lv_text_get_snippet(&cur_txt[cur_txt_ofs], snippet.font, snippet.letter_space, - max_w, txt_flag, &use_width, &next_ofs); - - /* break word deal width */ - if(isfill && next_ofs > 0 && snippet_cnt > 0) { - int32_t drawn_width = use_width; - if(lv_ll_get_next(&spans->child_ll, cur_span) == NULL) { - drawn_width -= snippet.letter_space; - } - if(max_w < drawn_width) { - break; - } - - uint32_t tmp_ofs = next_ofs; - uint32_t letter = lv_text_encoded_prev(&cur_txt[cur_txt_ofs], &tmp_ofs); - uint32_t letter_next = lv_text_encoded_next(&cur_txt[cur_txt_ofs + next_ofs], NULL); - if(!(letter == '\0' || letter == '\n' || letter == '\r' || lv_text_is_break_char(letter) || - lv_text_is_a_word(letter) || lv_text_is_a_word(letter_next))) { - if(!(letter_next == '\0' || letter_next == '\n' || letter_next == '\r' || lv_text_is_break_char(letter_next))) { - break; - } - } - } - - snippet.txt = &cur_txt[cur_txt_ofs]; - snippet.bytes = next_ofs; - snippet.txt_w = use_width; - cur_txt_ofs += next_ofs; - if(max_line_h < snippet.line_h) { - max_line_h = snippet.line_h; - } - snippet_cnt ++; - max_w = max_w - use_width; - if(isfill || max_w <= 0) { - break; - } - } - - /* next line init */ - txt_pos.x = 0; - txt_pos.y += max_line_h; - max_w = max_width; - line_cnt += 1; - if(line_cnt >= lines) { - break; - } - } - txt_pos.y -= line_space; - - return txt_pos.y; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_spangroup_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - lv_ll_init(&spans->child_ll, sizeof(lv_span_t)); - spans->indent = 0; - spans->lines = -1; - spans->mode = LV_SPAN_MODE_EXPAND; - spans->overflow = LV_SPAN_OVERFLOW_CLIP; - spans->cache_w = 0; - spans->cache_h = 0; - spans->refresh = 1; -} - -static void lv_spangroup_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - lv_span_t * cur_span = lv_ll_get_head(&spans->child_ll); - while(cur_span) { - lv_ll_remove(&spans->child_ll, cur_span); - if(cur_span->txt && cur_span->static_flag == 0) { - lv_free(cur_span->txt); - cur_span->txt = NULL; - } - lv_style_reset(&cur_span->style); - lv_free(cur_span); - cur_span = lv_ll_get_head(&spans->child_ll); - } -} - -static void lv_spangroup_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - /* Call the ancestor's event handler */ - if(lv_obj_event_base(MY_CLASS, e) != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - - if(code == LV_EVENT_DRAW_MAIN) { - draw_main(e); - } - else if(code == LV_EVENT_STYLE_CHANGED) { - refresh_self_size(obj); - } - else if(code == LV_EVENT_SIZE_CHANGED) { - refresh_self_size(obj); - } - else if(code == LV_EVENT_GET_SELF_SIZE) { - int32_t width = 0; - int32_t height = 0; - lv_point_t * self_size = lv_event_get_param(e); - - if(spans->mode == LV_SPAN_MODE_EXPAND) { - if(spans->refresh) { - spans->cache_w = (int32_t)lv_spangroup_get_expand_width(obj, 0); - spans->cache_h = lv_spangroup_get_max_line_height(obj); - spans->refresh = 0; - } - width = spans->cache_w; - height = spans->cache_h; - } - else if(spans->mode == LV_SPAN_MODE_BREAK) { - width = lv_obj_get_content_width(obj); - if(self_size->y >= 0) { - if(width != spans->cache_w || spans->refresh) { - height = lv_spangroup_get_expand_height(obj, width); - spans->cache_w = width; - spans->cache_h = height; - spans->refresh = 0; - } - else { - height = spans->cache_h; - } - } - } - else if(spans->mode == LV_SPAN_MODE_FIXED) { - width = self_size->x >= 0 ? lv_obj_get_content_width(obj) : 0; - height = self_size->y >= 0 ? lv_obj_get_content_height(obj) : 0; - } - self_size->x = LV_MAX(self_size->x, width); - self_size->y = LV_MAX(self_size->y, height); - } -} - -static void draw_main(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_layer_t * layer = lv_event_get_layer(e); - - lv_draw_span(obj, layer); -} - -/** - * @return true for txt fill the max_width. - */ -static bool lv_text_get_snippet(const char * txt, const lv_font_t * font, - int32_t letter_space, int32_t max_width, lv_text_flag_t flag, - int32_t * use_width, uint32_t * end_ofs) -{ - if(txt == NULL || txt[0] == '\0') { - *end_ofs = 0; - *use_width = 0; - return false; - } - - int32_t real_max_width = max_width; -#if !LV_USE_FONT_PLACEHOLDER - /* fix incomplete text display when disable the placeholder. */ - /* workaround by: https://github.com/lvgl/lvgl/issues/3685 */ - real_max_width++; -#endif - - uint32_t ofs = lv_text_get_next_line(txt, font, letter_space, real_max_width, use_width, flag); - *end_ofs = ofs; - - if(txt[ofs] == '\0' && *use_width < max_width && !(ofs && (txt[ofs - 1] == '\n' || txt[ofs - 1] == '\r'))) { - return false; - } - else { - return true; - } -} - -static void lv_snippet_push(lv_snippet_t * item) -{ - struct _snippet_stack * stack_p = snippet_stack; - if(stack_p->index < LV_SPAN_SNIPPET_STACK_SIZE) { - lv_memcpy(&stack_p->stack[stack_p->index], item, sizeof(lv_snippet_t)); - stack_p->index++; - } - else { - LV_LOG_ERROR("span draw stack overflow, please set LV_SPAN_SNIPPET_STACK_SIZE too larger"); - } -} - -static uint32_t lv_get_snippet_count(void) -{ - return snippet_stack->index; -} - -static lv_snippet_t * lv_get_snippet(uint32_t index) -{ - return &snippet_stack->stack[index]; -} - -static void lv_snippet_clear(void) -{ - snippet_stack->index = 0; -} - -static const lv_font_t * lv_span_get_style_text_font(lv_obj_t * par, lv_span_t * span) -{ - const lv_font_t * font; - lv_style_value_t value; - lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_FONT, &value); - if(res != LV_STYLE_RES_FOUND) { - font = lv_obj_get_style_text_font(par, LV_PART_MAIN); - } - else { - font = (const lv_font_t *)value.ptr; - } - return font; -} - -static int32_t lv_span_get_style_text_letter_space(lv_obj_t * par, lv_span_t * span) -{ - int32_t letter_space; - lv_style_value_t value; - lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_LETTER_SPACE, &value); - if(res != LV_STYLE_RES_FOUND) { - letter_space = lv_obj_get_style_text_letter_space(par, LV_PART_MAIN); - } - else { - letter_space = (int32_t)value.num; - } - return letter_space; -} - -static lv_color_t lv_span_get_style_text_color(lv_obj_t * par, lv_span_t * span) -{ - lv_style_value_t value; - lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_COLOR, &value); - if(res != LV_STYLE_RES_FOUND) { - value.color = lv_obj_get_style_text_color(par, LV_PART_MAIN); - } - return value.color; -} - -static lv_opa_t lv_span_get_style_text_opa(lv_obj_t * par, lv_span_t * span) -{ - lv_opa_t opa; - lv_style_value_t value; - lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_OPA, &value); - if(res != LV_STYLE_RES_FOUND) { - opa = (lv_opa_t)lv_obj_get_style_text_opa(par, LV_PART_MAIN); - } - else { - opa = (lv_opa_t)value.num; - } - return opa; -} - -static lv_blend_mode_t lv_span_get_style_text_blend_mode(lv_obj_t * par, lv_span_t * span) -{ - lv_blend_mode_t mode; - lv_style_value_t value; - lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_BLEND_MODE, &value); - if(res != LV_STYLE_RES_FOUND) { - mode = (lv_blend_mode_t)lv_obj_get_style_blend_mode(par, LV_PART_MAIN); - } - else { - mode = (lv_blend_mode_t)value.num; - } - return mode; -} - -static int32_t lv_span_get_style_text_decor(lv_obj_t * par, lv_span_t * span) -{ - int32_t decor; - lv_style_value_t value; - lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_DECOR, &value); - if(res != LV_STYLE_RES_FOUND) { - decor = (lv_text_decor_t)lv_obj_get_style_text_decor(par, LV_PART_MAIN);; - } - else { - decor = (int32_t)value.num; - } - return decor; -} - -static inline void span_text_check(const char ** text) -{ - if(*text == NULL) { - *text = ""; - LV_LOG_ERROR("occur an error that span text == NULL"); - } -} - -static int32_t convert_indent_pct(lv_obj_t * obj, int32_t width) -{ - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - - int32_t indent = spans->indent; - if(LV_COORD_IS_PCT(spans->indent)) { - if(spans->mode == LV_SPAN_MODE_EXPAND) { - indent = 0; - } - else { - indent = (width * LV_COORD_GET_PCT(spans->indent)) / 100; - } - } - - return indent; -} - -/** - * draw span group - * @param spans obj handle - * @param coords coordinates of the label - * @param mask the label will be drawn only in this area - */ -static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer) -{ - - lv_area_t coords; - lv_obj_get_content_coords(obj, &coords); - - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - - /* return if not span */ - if(lv_ll_get_head(&spans->child_ll) == NULL) { - return; - } - - /* return if no draw area */ - lv_area_t clip_area; - if(!lv_area_intersect(&clip_area, &coords, &layer->_clip_area)) return; - const lv_area_t clip_area_ori = layer->_clip_area; - layer->_clip_area = clip_area; - - /* init draw variable */ - lv_text_flag_t txt_flag = LV_TEXT_FLAG_NONE; - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN);; - int32_t max_width = lv_area_get_width(&coords); - int32_t indent = convert_indent_pct(obj, max_width); - int32_t max_w = max_width - indent; /* first line need minus indent */ - lv_opa_t obj_opa = lv_obj_get_style_opa_recursive(obj, LV_PART_MAIN); - - /* coords of draw span-txt */ - lv_point_t txt_pos; - txt_pos.y = coords.y1; - txt_pos.x = coords.x1 + indent; /* first line need add indent */ - - lv_span_t * cur_span = lv_ll_get_head(&spans->child_ll); - const char * cur_txt = cur_span->txt; - span_text_check(&cur_txt); - uint32_t cur_txt_ofs = 0; - lv_snippet_t snippet; /* use to save cur_span info and push it to stack */ - lv_memzero(&snippet, sizeof(snippet)); - - lv_draw_label_dsc_t label_draw_dsc; - lv_draw_label_dsc_init(&label_draw_dsc); - - bool is_first_line = true; - /* the loop control how many lines need to draw */ - while(cur_span) { - bool is_end_line = false; - bool ellipsis_valid = false; - int32_t max_line_h = 0; /* the max height of span-font when a line have a lot of span */ - int32_t max_baseline = 0; /*baseline of the highest span*/ - lv_snippet_clear(); - - /* the loop control to find a line and push the relevant span info into stack */ - while(1) { - /* switch to the next span when current is end */ - if(cur_txt[cur_txt_ofs] == '\0') { - cur_span = lv_ll_get_next(&spans->child_ll, cur_span); - if(cur_span == NULL) break; - cur_txt = cur_span->txt; - span_text_check(&cur_txt); - cur_txt_ofs = 0; - /* maybe also cur_txt[cur_txt_ofs] == '\0' */ - continue; - } - - /* init span info to snippet. */ - if(cur_txt_ofs == 0) { - snippet.span = cur_span; - snippet.font = lv_span_get_style_text_font(obj, cur_span); - snippet.letter_space = lv_span_get_style_text_letter_space(obj, cur_span); - snippet.line_h = lv_font_get_line_height(snippet.font) + line_space; - } - - /* get current span text line info */ - uint32_t next_ofs = 0; - int32_t use_width = 0; - bool isfill = lv_text_get_snippet(&cur_txt[cur_txt_ofs], snippet.font, snippet.letter_space, - max_w, txt_flag, &use_width, &next_ofs); - - if(isfill) { - if(next_ofs > 0 && lv_get_snippet_count() > 0) { - int32_t drawn_width = use_width; - if(lv_ll_get_next(&spans->child_ll, cur_span) == NULL) { - drawn_width -= snippet.letter_space; - } - /* To prevent infinite loops, the lv_text_get_next_line() may return incomplete words, */ - /* This phenomenon should be avoided when lv_get_snippet_count() > 0 */ - if(max_w < drawn_width) { - break; - } - uint32_t tmp_ofs = next_ofs; - uint32_t letter = lv_text_encoded_prev(&cur_txt[cur_txt_ofs], &tmp_ofs); - uint32_t letter_next = lv_text_encoded_next(&cur_txt[cur_txt_ofs + next_ofs], NULL); - if(!(letter == '\0' || letter == '\n' || letter == '\r' || lv_text_is_break_char(letter) || - lv_text_is_a_word(letter) || lv_text_is_a_word(letter_next))) { - if(!(letter_next == '\0' || letter_next == '\n' || letter_next == '\r' || lv_text_is_break_char(letter_next))) { - break; - } - } - } - } - - snippet.txt = &cur_txt[cur_txt_ofs]; - snippet.bytes = next_ofs; - snippet.txt_w = use_width; - cur_txt_ofs += next_ofs; - if(max_line_h < snippet.line_h) { - max_line_h = snippet.line_h; - max_baseline = snippet.font->base_line; - } - - lv_snippet_push(&snippet); - max_w = max_w - use_width; - if(isfill || max_w <= 0) { - break; - } - } - - /* start current line deal with */ - - uint32_t item_cnt = lv_get_snippet_count(); - if(item_cnt == 0) { /* break if stack is empty */ - break; - } - - /* Whether the current line is the end line and does overflow processing */ - { - lv_snippet_t * last_snippet = lv_get_snippet(item_cnt - 1); - int32_t next_line_h = last_snippet->line_h; - if(last_snippet->txt[last_snippet->bytes] == '\0') { - next_line_h = 0; - lv_span_t * next_span = lv_ll_get_next(&spans->child_ll, last_snippet->span); - if(next_span) { /* have the next line */ - next_line_h = lv_font_get_line_height(lv_span_get_style_text_font(obj, next_span)) + line_space; - } - } - if(txt_pos.y + max_line_h + next_line_h - line_space > coords.y2 + 1) { /* for overflow if is end line. */ - if(last_snippet->txt[last_snippet->bytes] != '\0') { - last_snippet->bytes = lv_strlen(last_snippet->txt); - last_snippet->txt_w = lv_text_get_width(last_snippet->txt, last_snippet->bytes, last_snippet->font, - last_snippet->letter_space); - } - ellipsis_valid = spans->overflow == LV_SPAN_OVERFLOW_ELLIPSIS; - is_end_line = true; - } - } - - /*Go the first visible line*/ - if(txt_pos.y + max_line_h < clip_area.y1) { - goto Next_line_init; - } - - /* align deal with */ - lv_text_align_t align = lv_obj_get_style_text_align(obj, LV_PART_MAIN); - if(align == LV_TEXT_ALIGN_CENTER || align == LV_TEXT_ALIGN_RIGHT) { - int32_t align_ofs = 0; - int32_t txts_w = is_first_line ? indent : 0; - uint32_t i; - for(i = 0; i < item_cnt; i++) { - lv_snippet_t * pinfo = lv_get_snippet(i); - txts_w = txts_w + pinfo->txt_w; - } - txts_w -= lv_get_snippet(item_cnt - 1)->letter_space; - align_ofs = max_width > txts_w ? max_width - txts_w : 0; - if(align == LV_TEXT_ALIGN_CENTER) { - align_ofs = align_ofs >> 1; - } - txt_pos.x += align_ofs; - } - - /* draw line letters */ - uint32_t i; - for(i = 0; i < item_cnt; i++) { - lv_snippet_t * pinfo = lv_get_snippet(i); - - /* bidi deal with:todo */ - const char * bidi_txt = pinfo->txt; - - lv_point_t pos; - pos.x = txt_pos.x; - pos.y = txt_pos.y + max_line_h - pinfo->line_h - (max_baseline - pinfo->font->base_line); - label_draw_dsc.color = lv_span_get_style_text_color(obj, pinfo->span); - label_draw_dsc.opa = lv_span_get_style_text_opa(obj, pinfo->span); - label_draw_dsc.font = lv_span_get_style_text_font(obj, pinfo->span); - label_draw_dsc.blend_mode = lv_span_get_style_text_blend_mode(obj, pinfo->span); - if(obj_opa < LV_OPA_MAX) { - label_draw_dsc.opa = LV_OPA_MIX2(label_draw_dsc.opa, obj_opa); - } - uint32_t txt_bytes = pinfo->bytes; - - /* overflow */ - uint32_t dot_letter_w = 0; - uint32_t dot_width = 0; - if(ellipsis_valid) { - dot_letter_w = lv_font_get_glyph_width(pinfo->font, '.', '.'); - dot_width = dot_letter_w * 3; - } - int32_t ellipsis_width = coords.x1 + max_width - dot_width; - - uint32_t j = 0; - while(j < txt_bytes) { - /* skip invalid fields */ - if(pos.x > clip_area.x2) { - break; - } - uint32_t letter = lv_text_encoded_next(bidi_txt, &j); - uint32_t letter_next = lv_text_encoded_next(&bidi_txt[j], NULL); - int32_t letter_w = lv_font_get_glyph_width(pinfo->font, letter, letter_next); - - /* skip invalid fields */ - if(pos.x + letter_w + pinfo->letter_space < clip_area.x1) { - if(letter_w > 0) { - pos.x = pos.x + letter_w + pinfo->letter_space; - } - continue; - } - - if(ellipsis_valid && pos.x + letter_w + pinfo->letter_space > ellipsis_width) { - for(int ell = 0; ell < 3; ell++) { - lv_draw_character(layer, &label_draw_dsc, &pos, '.'); - pos.x = pos.x + dot_letter_w + pinfo->letter_space; - } - if(pos.x <= ellipsis_width) { - pos.x = ellipsis_width + 1; - } - break; - } - else { - lv_draw_character(layer, &label_draw_dsc, &pos, letter); - if(letter_w > 0) { - pos.x = pos.x + letter_w + pinfo->letter_space; - } - } - } - - /* draw decor */ - lv_text_decor_t decor = lv_span_get_style_text_decor(obj, pinfo->span); - if(decor != LV_TEXT_DECOR_NONE) { - lv_draw_line_dsc_t line_dsc; - lv_draw_line_dsc_init(&line_dsc); - line_dsc.color = label_draw_dsc.color; - line_dsc.width = label_draw_dsc.font->underline_thickness ? pinfo->font->underline_thickness : 1; - line_dsc.opa = label_draw_dsc.opa; - line_dsc.blend_mode = label_draw_dsc.blend_mode; - - if(decor & LV_TEXT_DECOR_STRIKETHROUGH) { - int32_t y = pos.y + ((pinfo->line_h - line_space) >> 1) + (line_dsc.width >> 1); - lv_point_precise_set(&line_dsc.p1, txt_pos.x, y); - lv_point_precise_set(&line_dsc.p2, pos.x, y); - lv_draw_line(layer, &line_dsc); - } - - if(decor & LV_TEXT_DECOR_UNDERLINE) { - int32_t y = pos.y + pinfo->line_h - line_space - pinfo->font->base_line - pinfo->font->underline_position; - lv_point_precise_set(&line_dsc.p1, txt_pos.x, y); - lv_point_precise_set(&line_dsc.p2, pos.x, y); - lv_draw_line(layer, &line_dsc); - } - } - txt_pos.x = pos.x; - } - -Next_line_init: - /* next line init */ - is_first_line = false; - txt_pos.x = coords.x1; - txt_pos.y += max_line_h; - if(is_end_line || txt_pos.y > clip_area.y2 + 1) { - layer->_clip_area = clip_area_ori; - return; - } - max_w = max_width; - } - layer->_clip_area = clip_area_ori; -} - -static void refresh_self_size(lv_obj_t * obj) -{ - lv_spangroup_t * spans = (lv_spangroup_t *)obj; - spans->refresh = 1; - lv_obj_invalidate(obj); - lv_obj_refresh_self_size(obj); -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/span/lv_span.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/span/lv_span.h deleted file mode 100644 index f0406b9..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/span/lv_span.h +++ /dev/null @@ -1,237 +0,0 @@ -/** - * @file lv_span.h - * - */ - -#ifndef LV_SPAN_H -#define LV_SPAN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../core/lv_obj.h" - -#if LV_USE_SPAN != 0 - -/********************* - * DEFINES - *********************/ -#ifndef LV_SPAN_SNIPPET_STACK_SIZE -#define LV_SPAN_SNIPPET_STACK_SIZE 64 -#endif - -/********************** - * TYPEDEFS - **********************/ -typedef enum { - LV_SPAN_OVERFLOW_CLIP, - LV_SPAN_OVERFLOW_ELLIPSIS, - LV_SPAN_OVERFLOW_LAST, /**< Fence member*/ -} lv_span_overflow_t; - -typedef enum { - LV_SPAN_MODE_FIXED, /**< fixed the obj size */ - LV_SPAN_MODE_EXPAND, /**< Expand the object size to the text size */ - LV_SPAN_MODE_BREAK, /**< Keep width, break the too long lines and expand height */ - LV_SPAN_MODE_LAST /**< Fence member */ -} lv_span_mode_t; - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_spangroup_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_span_stack_init(void); -void lv_span_stack_deinit(void); - -/** - * Create a spangroup object - * @param parent pointer to an object, it will be the parent of the new spangroup - * @return pointer to the created spangroup - */ -lv_obj_t * lv_spangroup_create(lv_obj_t * parent); - -/** - * Create a span string descriptor and add to spangroup. - * @param obj pointer to a spangroup object. - * @return pointer to the created span. - */ -lv_span_t * lv_spangroup_new_span(lv_obj_t * obj); - -/** - * Remove the span from the spangroup and free memory. - * @param obj pointer to a spangroup object. - * @param span pointer to a span. - */ -void lv_spangroup_delete_span(lv_obj_t * obj, lv_span_t * span); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new text for a span. Memory will be allocated to store the text by the span. - * @param span pointer to a span. - * @param text pointer to a text. - */ -void lv_span_set_text(lv_span_t * span, const char * text); - -/** - * Set a static text. It will not be saved by the span so the 'text' variable - * has to be 'alive' while the span exist. - * @param span pointer to a span. - * @param text pointer to a text. - */ -void lv_span_set_text_static(lv_span_t * span, const char * text); - -/** - * Set the align of the spangroup. - * @param obj pointer to a spangroup object. - * @param align see lv_text_align_t for details. - */ -void lv_spangroup_set_align(lv_obj_t * obj, lv_text_align_t align); - -/** - * Set the overflow of the spangroup. - * @param obj pointer to a spangroup object. - * @param overflow see lv_span_overflow_t for details. - */ -void lv_spangroup_set_overflow(lv_obj_t * obj, lv_span_overflow_t overflow); - -/** - * Set the indent of the spangroup. - * @param obj pointer to a spangroup object. - * @param indent the first line indentation - */ -void lv_spangroup_set_indent(lv_obj_t * obj, int32_t indent); - -/** - * Set the mode of the spangroup. - * @param obj pointer to a spangroup object. - * @param mode see lv_span_mode_t for details. - */ -void lv_spangroup_set_mode(lv_obj_t * obj, lv_span_mode_t mode); - -/** - * Set maximum lines of the spangroup. - * @param obj pointer to a spangroup object. - * @param lines max lines that can be displayed in LV_SPAN_MODE_BREAK mode. < 0 means no limit. - */ -void lv_spangroup_set_max_lines(lv_obj_t * obj, int32_t lines); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get a pointer to the style of a span - * @param span pointer to the span - * @return pointer to the style. valid as long as the span is valid -*/ -lv_style_t * lv_span_get_style(lv_span_t * span); - -/** - * Get a spangroup child by its index. - * - * @param obj The spangroup object - * @param id the index of the child. - * 0: the oldest (firstly created) child - * 1: the second oldest - * child count-1: the youngest - * -1: the youngest - * -2: the second youngest - * @return The child span at index `id`, or NULL if the ID does not exist - */ -lv_span_t * lv_spangroup_get_child(const lv_obj_t * obj, int32_t id); - -/** - * Get number of spans - * @param obj the spangroup object to get the child count of. - * @return the span count of the spangroup. - */ -uint32_t lv_spangroup_get_span_count(const lv_obj_t * obj); - -/** - * Get the align of the spangroup. - * @param obj pointer to a spangroup object. - * @return the align value. - */ -lv_text_align_t lv_spangroup_get_align(lv_obj_t * obj); - -/** - * Get the overflow of the spangroup. - * @param obj pointer to a spangroup object. - * @return the overflow value. - */ -lv_span_overflow_t lv_spangroup_get_overflow(lv_obj_t * obj); - -/** - * Get the indent of the spangroup. - * @param obj pointer to a spangroup object. - * @return the indent value. - */ -int32_t lv_spangroup_get_indent(lv_obj_t * obj); - -/** - * Get the mode of the spangroup. - * @param obj pointer to a spangroup object. - */ -lv_span_mode_t lv_spangroup_get_mode(lv_obj_t * obj); - -/** - * Get maximum lines of the spangroup. - * @param obj pointer to a spangroup object. - * @return the max lines value. - */ -int32_t lv_spangroup_get_max_lines(lv_obj_t * obj); - -/** - * Get max line height of all span in the spangroup. - * @param obj pointer to a spangroup object. - */ -int32_t lv_spangroup_get_max_line_height(lv_obj_t * obj); - -/** - * Get the text content width when all span of spangroup on a line. - * @param obj pointer to a spangroup object. - * @param max_width if text content width >= max_width, return max_width - * to reduce computation, if max_width == 0, returns the text content width. - * @return text content width or max_width. - */ -uint32_t lv_spangroup_get_expand_width(lv_obj_t * obj, uint32_t max_width); - -/** - * Get the text content height with width fixed. - * @param obj pointer to a spangroup object. - * @param width the width of the span group. - - */ -int32_t lv_spangroup_get_expand_height(lv_obj_t * obj, int32_t width); - -/*===================== - * Other functions - *====================*/ - -/** - * Update the mode of the spangroup. - * @param obj pointer to a spangroup object. - */ -void lv_spangroup_refr_mode(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_SPAN*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_SPAN_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/span/lv_span_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/span/lv_span_private.h deleted file mode 100644 index 099ea1b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/span/lv_span_private.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @file lv_span_private.h - * - */ - -#ifndef LV_SPAN_PRIVATE_H -#define LV_SPAN_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_span.h" - -#if LV_USE_SPAN != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_span_t { - char * txt; /**< a pointer to display text */ - lv_obj_t * spangroup; /**< a pointer to spangroup */ - lv_style_t style; /**< display text style */ - uint32_t static_flag : 1; /**< the text is static flag */ -}; - -/** Data of label*/ -struct lv_spangroup_t { - lv_obj_t obj; - int32_t lines; - int32_t indent; /**< first line indent */ - int32_t cache_w; /**< the cache automatically calculates the width */ - int32_t cache_h; /**< similar cache_w */ - lv_ll_t child_ll; - uint32_t mode : 2; /**< details see lv_span_mode_t */ - uint32_t overflow : 1; /**< details see lv_span_overflow_t */ - uint32_t refresh : 1; /**< the spangroup need refresh cache_w and cache_h */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_SPAN != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_SPAN_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/spinbox/lv_spinbox.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/spinbox/lv_spinbox.c deleted file mode 100644 index 69e8d13..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/spinbox/lv_spinbox.c +++ /dev/null @@ -1,474 +0,0 @@ -/** - * @file lv_spinbox.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_spinbox_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_SPINBOX - -#include "../../misc/lv_assert.h" -#include "../../indev/lv_indev.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_spinbox_class) -#define LV_SPINBOX_MAX_DIGIT_COUNT_WITH_8BYTES (LV_SPINBOX_MAX_DIGIT_COUNT + 8U) -#define LV_SPINBOX_MAX_DIGIT_COUNT_WITH_4BYTES (LV_SPINBOX_MAX_DIGIT_COUNT + 4U) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void lv_spinbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_spinbox_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void lv_spinbox_updatevalue(lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_spinbox_class = { - .constructor_cb = lv_spinbox_constructor, - .event_cb = lv_spinbox_event, - .width_def = LV_DPI_DEF, - .instance_size = sizeof(lv_spinbox_t), - .editable = LV_OBJ_CLASS_EDITABLE_TRUE, - .base_class = &lv_textarea_class, - .name = "spinbox", -}; -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_spinbox_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_spinbox_set_value(lv_obj_t * obj, int32_t v) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - if(v > spinbox->range_max) v = spinbox->range_max; - if(v < spinbox->range_min) v = spinbox->range_min; - - spinbox->value = v; - - lv_spinbox_updatevalue(obj); -} - -void lv_spinbox_set_rollover(lv_obj_t * obj, bool rollover) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - spinbox->rollover = rollover; -} - -void lv_spinbox_set_digit_format(lv_obj_t * obj, uint32_t digit_count, uint32_t sep_pos) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - if(digit_count > LV_SPINBOX_MAX_DIGIT_COUNT) digit_count = LV_SPINBOX_MAX_DIGIT_COUNT; - - if(sep_pos >= digit_count) sep_pos = 0; - - if(digit_count < LV_SPINBOX_MAX_DIGIT_COUNT) { - const int64_t max_val = lv_pow(10, digit_count); - if(spinbox->range_max > max_val - 1) spinbox->range_max = max_val - 1; - if(spinbox->range_min < -max_val + 1) spinbox->range_min = -max_val + 1; - } - - spinbox->digit_count = digit_count; - spinbox->dec_point_pos = sep_pos; - - lv_spinbox_updatevalue(obj); -} - -void lv_spinbox_set_step(lv_obj_t * obj, uint32_t step) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - spinbox->step = step; - lv_spinbox_updatevalue(obj); -} - -void lv_spinbox_set_range(lv_obj_t * obj, int32_t range_min, int32_t range_max) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - spinbox->range_max = range_max; - spinbox->range_min = range_min; - - if(spinbox->value > spinbox->range_max) spinbox->value = spinbox->range_max; - if(spinbox->value < spinbox->range_min) spinbox->value = spinbox->range_min; - - lv_spinbox_updatevalue(obj); -} - -void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint32_t pos) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - const int32_t step_limit = LV_MAX(spinbox->range_max, LV_ABS(spinbox->range_min)); - const int32_t new_step = lv_pow(10, pos); - - if(pos <= 0) spinbox->step = 1; - else if(new_step <= step_limit) spinbox->step = new_step; - - lv_spinbox_updatevalue(obj); -} - -void lv_spinbox_set_digit_step_direction(lv_obj_t * obj, lv_dir_t direction) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - spinbox->digit_step_dir = direction; - - lv_spinbox_updatevalue(obj); -} -/*===================== - * Getter functions - *====================*/ - -int32_t lv_spinbox_get_value(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - return spinbox->value; -} - -int32_t lv_spinbox_get_step(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - return spinbox->step; -} - -/*===================== - * Other functions - *====================*/ - -void lv_spinbox_step_next(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - const int32_t new_step = spinbox->step / 10; - spinbox->step = (new_step > 0) ? new_step : 1; - - lv_spinbox_updatevalue(obj); -} - -void lv_spinbox_step_prev(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - const int32_t step_limit = LV_MAX(spinbox->range_max, LV_ABS(spinbox->range_min)); - const int32_t new_step = spinbox->step * 10; - if(new_step <= step_limit) spinbox->step = new_step; - - lv_spinbox_updatevalue(obj); -} - -bool lv_spinbox_get_rollover(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - return spinbox->rollover; -} - -void lv_spinbox_increment(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - int32_t v = spinbox->value; - /* Special mode when zero crossing. E.g -3+10 should be 3, not 7. - * Pretend we are on -7 now.*/ - if((spinbox->value < 0) && (spinbox->value + spinbox->step) > 0) { - v = -(spinbox->step + spinbox->value); - } - - if(v + spinbox->step <= spinbox->range_max) { - v += spinbox->step; - } - else { - /*Rollover?*/ - if((spinbox->rollover) && (spinbox->value == spinbox->range_max)) - v = spinbox->range_min; - else - v = spinbox->range_max; - } - - if(v != spinbox->value) { - spinbox->value = v; - lv_spinbox_updatevalue(obj); - } -} - -void lv_spinbox_decrement(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - int32_t v = spinbox->value; - /* Special mode when zero crossing. E.g 3-10 should be -3, not -7. - * Pretend we are on 7 now.*/ - if((spinbox->value > 0) && (spinbox->value - spinbox->step) < 0) { - v = spinbox->step - spinbox->value; - } - - if(v - spinbox->step >= spinbox->range_min) { - v -= spinbox->step; - } - else { - /*Rollover?*/ - if((spinbox->rollover) && (spinbox->value == spinbox->range_min)) - v = spinbox->range_max; - else - v = spinbox->range_min; - } - - if(v != spinbox->value) { - spinbox->value = v; - lv_spinbox_updatevalue(obj); - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_spinbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_LOG_TRACE("begin"); - - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - /*Initialize the allocated 'ext'*/ - spinbox->value = 0; - spinbox->dec_point_pos = 0; - spinbox->digit_count = 5; - spinbox->step = 1; - spinbox->range_max = 99999; - spinbox->range_min = -99999; - spinbox->rollover = false; - spinbox->digit_step_dir = LV_DIR_RIGHT; - - lv_textarea_set_one_line(obj, true); - lv_textarea_set_cursor_click_pos(obj, true); - - lv_spinbox_updatevalue(obj); - - LV_LOG_TRACE("Spinbox constructor finished"); -} - -static void lv_spinbox_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - /*Call the ancestor's event handler*/ - lv_result_t res = LV_RESULT_OK; - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - const lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - if(code == LV_EVENT_RELEASED) { - /*If released with an ENCODER then move to the next digit*/ - lv_indev_t * indev = lv_indev_active(); - if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER && lv_group_get_editing(lv_obj_get_group(obj))) { - if(spinbox->digit_count > 1) { - if(spinbox->digit_step_dir == LV_DIR_RIGHT) { - if(spinbox->step > 1) { - lv_spinbox_step_next(obj); - } - else { - /*Restart from the MSB*/ - spinbox->step = lv_pow(10, spinbox->digit_count - 2); - lv_spinbox_step_prev(obj); - } - } - else { - if(spinbox->step < lv_pow(10, spinbox->digit_count - 1)) { - lv_spinbox_step_prev(obj); - } - else { - /*Restart from the LSB*/ - spinbox->step = 10; - lv_spinbox_step_next(obj); - } - } - } - } - /*The cursor has been positioned to a digit. - * Set `step` accordingly*/ - else { - const char * txt = lv_textarea_get_text(obj); - const size_t txt_len = lv_strlen(txt); - - /* Check cursor position */ - /* Cursor is in '.' digit */ - if(txt[spinbox->ta.cursor.pos] == '.') { - lv_textarea_cursor_left(obj); - } - /* Cursor is already in the right-most digit */ - else if(spinbox->ta.cursor.pos == (uint32_t)txt_len) { - lv_textarea_set_cursor_pos(obj, txt_len - 1); - } - /* Cursor is already in the left-most digit AND range_min is negative */ - else if(spinbox->ta.cursor.pos == 0 && spinbox->range_min < 0) { - lv_textarea_set_cursor_pos(obj, 1); - } - - /* Handle spinbox with decimal point (spinbox->dec_point_pos != 0) */ - uint32_t cp = spinbox->ta.cursor.pos; - if(spinbox->ta.cursor.pos > spinbox->dec_point_pos && spinbox->dec_point_pos != 0) cp--; - - const size_t len = spinbox->digit_count - 1; - uint32_t pos = len - cp; - - if(spinbox->range_min < 0) pos++; - - spinbox->step = 1; - uint32_t i; - for(i = 0; i < pos; i++) spinbox->step *= 10; - - lv_spinbox_updatevalue(obj); - } - } - else if(code == LV_EVENT_KEY) { - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); - - uint32_t c = *((uint32_t *)lv_event_get_param(e)); /*uint32_t because can be UTF-8*/ - if(c == LV_KEY_RIGHT) { - if(indev_type == LV_INDEV_TYPE_ENCODER) - lv_spinbox_increment(obj); - else - lv_spinbox_step_next(obj); - } - else if(c == LV_KEY_LEFT) { - if(indev_type == LV_INDEV_TYPE_ENCODER) - lv_spinbox_decrement(obj); - else - lv_spinbox_step_prev(obj); - } - else if(c == LV_KEY_UP) { - lv_spinbox_increment(obj); - } - else if(c == LV_KEY_DOWN) { - lv_spinbox_decrement(obj); - } - else { - lv_textarea_add_char(obj, c); - } - } -} - -static void lv_spinbox_updatevalue(lv_obj_t * obj) -{ - lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; - - /* LV_SPINBOX_MAX_DIGIT_COUNT_WITH_8BYTES (18): Max possible digit_count value (15) + sign + decimal point + NULL terminator */ - char textarea_txt[LV_SPINBOX_MAX_DIGIT_COUNT_WITH_8BYTES] = {0U}; - char * buf_p = textarea_txt; - - uint32_t cur_shift_left = 0; - if(spinbox->range_min < 0) { /*hide sign if there are only positive values*/ - /*Add the sign*/ - (*buf_p) = spinbox->value >= 0 ? '+' : '-'; - buf_p++; - } - else { - /*Cursor need shift to left*/ - cur_shift_left++; - } - - /*Convert the numbers to string (the sign is already handled so always convert positive number)*/ - char digits[LV_SPINBOX_MAX_DIGIT_COUNT_WITH_4BYTES]; - lv_snprintf(digits, LV_SPINBOX_MAX_DIGIT_COUNT_WITH_4BYTES, "%" LV_PRId32, LV_ABS(spinbox->value)); - - /*Add leading zeros*/ - int32_t i; - const size_t digits_len = lv_strlen(digits); - - const int leading_zeros_cnt = spinbox->digit_count - digits_len; - if(leading_zeros_cnt) { - for(i = (int32_t) digits_len; i >= 0; i--) { - digits[i + leading_zeros_cnt] = digits[i]; - } - /* NOTE: Substitute with memset? */ - for(i = 0; i < leading_zeros_cnt; i++) { - digits[i] = '0'; - } - } - - /*Add the decimal part*/ - const uint32_t intDigits = (spinbox->dec_point_pos == 0) ? spinbox->digit_count : spinbox->dec_point_pos; - for(i = 0; i < (int32_t)intDigits && digits[i] != '\0'; i++) { - (*buf_p) = digits[i]; - buf_p++; - } - - /*Insert the decimal point*/ - if(spinbox->dec_point_pos) { - (*buf_p) = '.'; - buf_p++; - - for(/*Leave i*/; i < spinbox->digit_count && digits[i] != '\0'; i++) { - (*buf_p) = digits[i]; - buf_p++; - } - } - - /*Refresh the text*/ - lv_textarea_set_text(obj, (char *)textarea_txt); - - /*Set the cursor position*/ - int32_t step = spinbox->step; - uint32_t cur_pos = (uint32_t)spinbox->digit_count; - while(step >= 10) { - step /= 10; - cur_pos--; - } - - if(cur_pos > intDigits) cur_pos++; /*Skip the decimal point*/ - - cur_pos -= cur_shift_left; - - lv_textarea_set_cursor_pos(obj, cur_pos); -} - -#endif /*LV_USE_SPINBOX*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/spinbox/lv_spinbox.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/spinbox/lv_spinbox.h deleted file mode 100644 index ae3fdb0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/spinbox/lv_spinbox.h +++ /dev/null @@ -1,164 +0,0 @@ -/** - * @file lv_spinbox.h - * - */ - -#ifndef LV_SPINBOX_H -#define LV_SPINBOX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../textarea/lv_textarea.h" - -#if LV_USE_SPINBOX - -/*Testing of dependencies*/ -#if LV_USE_TEXTAREA == 0 -#error "lv_spinbox: lv_ta is required. Enable it in lv_conf.h (LV_USE_TEXTAREA 1) " -#endif - -/********************* - * DEFINES - *********************/ -#define LV_SPINBOX_MAX_DIGIT_COUNT 10 - -/********************** - * TYPEDEFS - **********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_spinbox_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a spinbox object - * @param parent pointer to an object, it will be the parent of the new spinbox - * @return pointer to the created spinbox - */ -lv_obj_t * lv_spinbox_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set spinbox value - * @param obj pointer to spinbox - * @param v value to be set - */ -void lv_spinbox_set_value(lv_obj_t * obj, int32_t v); - -/** - * Set spinbox rollover function - * @param obj pointer to spinbox - * @param rollover true or false to enable or disable (default) - */ -void lv_spinbox_set_rollover(lv_obj_t * obj, bool rollover); - -/** - * Set spinbox digit format (digit count and decimal format) - * @param obj pointer to spinbox - * @param digit_count number of digit excluding the decimal separator and the sign - * @param sep_pos number of digit before the decimal point. If 0, decimal point is not - * shown - */ -void lv_spinbox_set_digit_format(lv_obj_t * obj, uint32_t digit_count, uint32_t sep_pos); - -/** - * Set spinbox step - * @param obj pointer to spinbox - * @param step steps on increment/decrement. Can be 1, 10, 100, 1000, etc the digit that will change. - */ -void lv_spinbox_set_step(lv_obj_t * obj, uint32_t step); - -/** - * Set spinbox value range - * @param obj pointer to spinbox - * @param range_min maximum value, inclusive - * @param range_max minimum value, inclusive - */ -void lv_spinbox_set_range(lv_obj_t * obj, int32_t range_min, int32_t range_max); - -/** - * Set cursor position to a specific digit for edition - * @param obj pointer to spinbox - * @param pos selected position in spinbox - */ -void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint32_t pos); - -/** - * Set direction of digit step when clicking an encoder button while in editing mode - * @param obj pointer to spinbox - * @param direction the direction (LV_DIR_RIGHT or LV_DIR_LEFT) - */ -void lv_spinbox_set_digit_step_direction(lv_obj_t * obj, lv_dir_t direction); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get spinbox rollover function status - * @param obj pointer to spinbox - */ -bool lv_spinbox_get_rollover(lv_obj_t * obj); - -/** - * Get the spinbox numeral value (user has to convert to float according to its digit format) - * @param obj pointer to spinbox - * @return value integer value of the spinbox - */ -int32_t lv_spinbox_get_value(lv_obj_t * obj); - -/** - * Get the spinbox step value (user has to convert to float according to its digit format) - * @param obj pointer to spinbox - * @return value integer step value of the spinbox - */ -int32_t lv_spinbox_get_step(lv_obj_t * obj); - -/*===================== - * Other functions - *====================*/ - -/** - * Select next lower digit for edition by dividing the step by 10 - * @param obj pointer to spinbox - */ -void lv_spinbox_step_next(lv_obj_t * obj); - -/** - * Select next higher digit for edition by multiplying the step by 10 - * @param obj pointer to spinbox - */ -void lv_spinbox_step_prev(lv_obj_t * obj); - -/** - * Increment spinbox value by one step - * @param obj pointer to spinbox - */ -void lv_spinbox_increment(lv_obj_t * obj); - -/** - * Decrement spinbox value by one step - * @param obj pointer to spinbox - */ -void lv_spinbox_decrement(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_SPINBOX*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif -#endif /*LV_SPINBOX_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/spinbox/lv_spinbox_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/spinbox/lv_spinbox_private.h deleted file mode 100644 index 0569f21..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/spinbox/lv_spinbox_private.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @file lv_spinbox_private.h - * - */ - -#ifndef LV_SPINBOX_PRIVATE_H -#define LV_SPINBOX_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../textarea/lv_textarea_private.h" -#include "lv_spinbox.h" - -#if LV_USE_SPINBOX - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Data of spinbox */ -struct lv_spinbox_t { - lv_textarea_t ta; /**< Ext. of ancestor */ - /*New data for this type*/ - int32_t value; - int32_t range_max; - int32_t range_min; - int32_t step; - uint32_t digit_count : 4; - uint32_t dec_point_pos : 4; /**< if 0, there is no separator and the number is an integer */ - uint32_t rollover : 1; /**< Set to true for rollover functionality */ - uint32_t digit_step_dir : 2; /**< the direction the digit will step on encoder button press when editing */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_SPINBOX */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_SPINBOX_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/spinner/lv_spinner.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/spinner/lv_spinner.c deleted file mode 100644 index 18cb005..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/spinner/lv_spinner.c +++ /dev/null @@ -1,106 +0,0 @@ -/** - * @file lv_spinner.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_anim_private.h" -#include "../../core/lv_obj_class_private.h" -#include "../../lvgl.h" -#if LV_USE_SPINNER - -/********************* - * DEFINES - *********************/ -#define DEF_ARC_ANGLE 200 -#define DEF_TIME 1000 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_spinner_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void arc_anim_start_angle(void * obj, int32_t v); -static void arc_anim_end_angle(void * obj, int32_t v); - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_spinner_class = { - .base_class = &lv_arc_class, - .constructor_cb = lv_spinner_constructor, - .name = "spinner", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_spinner_create(lv_obj_t * parent) -{ - - lv_obj_t * obj = lv_obj_class_create_obj(&lv_spinner_class, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -void lv_spinner_set_anim_params(lv_obj_t * obj, uint32_t t, uint32_t angle) -{ - /*Delete the current animation*/ - lv_anim_delete(obj, NULL); - - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, obj); - lv_anim_set_exec_cb(&a, arc_anim_end_angle); - lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); - lv_anim_set_duration(&a, t); - lv_anim_set_values(&a, angle, 360 + angle); - lv_anim_start(&a); - - lv_anim_set_path_cb(&a, lv_anim_path_custom_bezier3); - lv_anim_set_bezier3_param(&a, LV_BEZIER_VAL_FLOAT(0.42), LV_BEZIER_VAL_FLOAT(0.58), - LV_BEZIER_VAL_FLOAT(0), LV_BEZIER_VAL_FLOAT(1)); - lv_anim_set_values(&a, 0, 360); - lv_anim_set_exec_cb(&a, arc_anim_start_angle); - lv_anim_start(&a); - - lv_arc_set_bg_angles(obj, 0, 360); - lv_arc_set_rotation(obj, 270); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_spinner_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_TRACE_OBJ_CREATE("begin"); - - LV_UNUSED(class_p); - - lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); - - lv_spinner_set_anim_params(obj, DEF_TIME, DEF_ARC_ANGLE); -} - -static void arc_anim_start_angle(void * obj, int32_t v) -{ - lv_arc_set_start_angle(obj, (uint32_t) v); -} - -static void arc_anim_end_angle(void * obj, int32_t v) -{ - lv_arc_set_end_angle(obj, (uint32_t) v); -} - -#endif /*LV_USE_SPINNER*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/spinner/lv_spinner.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/spinner/lv_spinner.h deleted file mode 100644 index 9244563..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/spinner/lv_spinner.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @file lv_spinner.h - * - */ - -#ifndef LV_SPINNER_H -#define LV_SPINNER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -#if LV_USE_SPINNER - -/*Testing of dependencies*/ -#if LV_USE_ARC == 0 -#error "lv_spinner: lv_arc is required. Enable it in lv_conf.h (LV_USE_ARC 1) " -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_spinner_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a spinner widget - * @param parent pointer to an object, it will be the parent of the new spinner. - * @return the created spinner - */ -lv_obj_t * lv_spinner_create(lv_obj_t * parent); - -/** - * Set the animation time and arc length of the spinner - * @param obj pointer to a spinner - * @param t the animation time in milliseconds - * @param angle the angle of the arc in degrees - */ -void lv_spinner_set_anim_params(lv_obj_t * obj, uint32_t t, uint32_t angle); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_SPINNER*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_SPINNER_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/switch/lv_switch.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/switch/lv_switch.c deleted file mode 100644 index 89b4b63..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/switch/lv_switch.c +++ /dev/null @@ -1,266 +0,0 @@ -/** - * @file lv_sw.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_switch_private.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_obj_class_private.h" - -#if LV_USE_SWITCH != 0 - -#include "../../misc/lv_assert.h" -#include "../../misc/lv_math.h" -#include "../../misc/lv_anim_private.h" -#include "../../indev/lv_indev.h" -#include "../../display/lv_display.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_switch_class) - -#define LV_SWITCH_IS_ANIMATING(sw) (((sw)->anim_state) != LV_SWITCH_ANIM_STATE_INV) - -/** Switch animation start value. (Not the real value of the switch just indicates process animation)*/ -#define LV_SWITCH_ANIM_STATE_START 0 - -/** Switch animation end value. (Not the real value of the switch just indicates process animation)*/ -#define LV_SWITCH_ANIM_STATE_END 256 - -/** Mark no animation is in progress*/ -#define LV_SWITCH_ANIM_STATE_INV -1 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_switch_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_switch_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_switch_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void draw_main(lv_event_t * e); - -static void lv_switch_anim_exec_cb(void * sw, int32_t value); -static void lv_switch_trigger_anim(lv_obj_t * obj); -static void lv_switch_anim_completed(lv_anim_t * a); -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_switch_class = { - .constructor_cb = lv_switch_constructor, - .destructor_cb = lv_switch_destructor, - .event_cb = lv_switch_event, - .width_def = (4 * LV_DPI_DEF) / 10, - .height_def = (4 * LV_DPI_DEF) / 17, - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .instance_size = sizeof(lv_switch_t), - .base_class = &lv_obj_class, - .name = "switch", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_switch_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_switch_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_switch_t * sw = (lv_switch_t *)obj; - - sw->anim_state = LV_SWITCH_ANIM_STATE_INV; - - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_add_flag(obj, LV_OBJ_FLAG_CHECKABLE); - lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_switch_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_switch_t * sw = (lv_switch_t *)obj; - - lv_anim_delete(sw, NULL); -} - -static void lv_switch_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - - /*Call the ancestor's event handler*/ - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - - if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { - int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); - int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); - int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); - int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); - - /*The smaller size is the knob diameter*/ - int32_t knob_size = LV_MAX4(knob_left, knob_right, knob_bottom, knob_top); - knob_size += LV_SWITCH_KNOB_EXT_AREA_CORRECTION; - knob_size += lv_obj_calculate_ext_draw_size(obj, LV_PART_KNOB); - - int32_t * s = lv_event_get_param(e); - *s = LV_MAX(*s, knob_size); - *s = LV_MAX(*s, lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR)); - } - else if(code == LV_EVENT_VALUE_CHANGED) { - lv_switch_trigger_anim(obj); - lv_obj_invalidate(obj); - } - else if(code == LV_EVENT_DRAW_MAIN) { - draw_main(e); - } -} - -static void draw_main(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_switch_t * sw = (lv_switch_t *)obj; - - lv_layer_t * layer = lv_event_get_layer(e); - - /*Draw the indicator*/ - lv_area_t indic_area; - /*Exclude background's padding*/ - lv_obj_get_content_coords(obj, &indic_area); - - lv_draw_rect_dsc_t draw_indic_dsc; - lv_draw_rect_dsc_init(&draw_indic_dsc); - lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &draw_indic_dsc); - lv_draw_rect(layer, &draw_indic_dsc, &indic_area); - - /*Draw the knob*/ - int32_t anim_value_x = 0; - int32_t knob_size = lv_obj_get_height(obj); - int32_t anim_length = lv_area_get_width(&obj->coords) - knob_size; - - if(LV_SWITCH_IS_ANIMATING(sw)) { - /* Use the animation's coordinate */ - anim_value_x = (anim_length * sw->anim_state) / LV_SWITCH_ANIM_STATE_END; - } - else { - /* Use LV_STATE_CHECKED to decide the coordinate */ - bool chk = lv_obj_get_state(obj) & LV_STATE_CHECKED; - anim_value_x = chk ? anim_length : 0; - } - - if(LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN)) { - anim_value_x = anim_length - anim_value_x; - } - - lv_area_t knob_area; - lv_area_copy(&knob_area, &obj->coords); - knob_area.x1 += anim_value_x; - knob_area.x2 = knob_area.x1 + (knob_size > 0 ? knob_size - 1 : 0); - - int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); - int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); - int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); - int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); - - /*Apply the paddings on the knob area*/ - knob_area.x1 -= knob_left; - knob_area.x2 += knob_right; - knob_area.y1 -= knob_top; - knob_area.y2 += knob_bottom; - - lv_draw_rect_dsc_t knob_rect_dsc; - lv_draw_rect_dsc_init(&knob_rect_dsc); - lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &knob_rect_dsc); - - lv_draw_rect(layer, &knob_rect_dsc, &knob_area); -} - -static void lv_switch_anim_exec_cb(void * var, int32_t value) -{ - lv_switch_t * sw = var; - sw->anim_state = value; - lv_obj_invalidate((lv_obj_t *)sw); -} - -/** - * Resets the switch's animation state to "no animation in progress". - */ -static void lv_switch_anim_completed(lv_anim_t * a) -{ - lv_switch_t * sw = a->var; - sw->anim_state = LV_SWITCH_ANIM_STATE_INV; - lv_obj_invalidate((lv_obj_t *)sw); -} - -/** - * Starts an animation for the switch knob. if the anim_time style property is greater than 0 - * @param obj the switch to animate - */ -static void lv_switch_trigger_anim(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_switch_t * sw = (lv_switch_t *)obj; - - uint32_t anim_dur_full = lv_obj_get_style_anim_duration(obj, LV_PART_MAIN); - - if(anim_dur_full > 0) { - bool chk = lv_obj_get_state(obj) & LV_STATE_CHECKED; - int32_t anim_start; - int32_t anim_end; - /*No animation in progress -> simply set the values*/ - if(sw->anim_state == LV_SWITCH_ANIM_STATE_INV) { - anim_start = chk ? LV_SWITCH_ANIM_STATE_START : LV_SWITCH_ANIM_STATE_END; - anim_end = chk ? LV_SWITCH_ANIM_STATE_END : LV_SWITCH_ANIM_STATE_START; - } - /*Animation in progress. Start from the animation end value*/ - else { - anim_start = sw->anim_state; - anim_end = chk ? LV_SWITCH_ANIM_STATE_END : LV_SWITCH_ANIM_STATE_START; - } - /*Calculate actual animation duration*/ - uint32_t anim_dur = (anim_dur_full * LV_ABS(anim_start - anim_end)) / LV_SWITCH_ANIM_STATE_END; - - /*Stop the previous animation if it exists*/ - lv_anim_delete(sw, NULL); - - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, sw); - lv_anim_set_exec_cb(&a, lv_switch_anim_exec_cb); - lv_anim_set_values(&a, anim_start, anim_end); - lv_anim_set_completed_cb(&a, lv_switch_anim_completed); - lv_anim_set_duration(&a, anim_dur); - lv_anim_start(&a); - } -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/switch/lv_switch.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/switch/lv_switch.h deleted file mode 100644 index 989a3dd..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/switch/lv_switch.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file lv_switch.h - * - */ - -#ifndef LV_SWITCH_H -#define LV_SWITCH_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" - -#if LV_USE_SWITCH != 0 - -#include "../../core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/** Switch knob extra area correction factor */ -#define LV_SWITCH_KNOB_EXT_AREA_CORRECTION 2 - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_switch_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a switch object - * @param parent pointer to an object, it will be the parent of the new switch - * @return pointer to the created switch - */ -lv_obj_t * lv_switch_create(lv_obj_t * parent); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_SWITCH*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_SWITCH_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/switch/lv_switch_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/switch/lv_switch_private.h deleted file mode 100644 index 7bc2576..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/switch/lv_switch_private.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @file lv_switch_private.h - * - */ - -#ifndef LV_SWITCH_PRIVATE_H -#define LV_SWITCH_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_switch.h" - -#if LV_USE_SWITCH != 0 -#include "../../core/lv_obj_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_switch_t { - lv_obj_t obj; - int32_t anim_state; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_SWITCH != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_SWITCH_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/table/lv_table.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/table/lv_table.c deleted file mode 100644 index affb99b..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/table/lv_table.c +++ /dev/null @@ -1,1117 +0,0 @@ -/** - * @file lv_table.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_table_private.h" -#include "../../misc/lv_area_private.h" -#include "../../core/lv_obj_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_TABLE != 0 - -#include "../../indev/lv_indev.h" -#include "../../misc/lv_assert.h" -#include "../../misc/lv_text.h" -#include "../../misc/lv_text_ap.h" -#include "../../misc/lv_math.h" -#include "../../stdlib/lv_sprintf.h" -#include "../../draw/lv_draw_private.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_table_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_table_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_table_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_table_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void draw_main(lv_event_t * e); -static int32_t get_row_height(lv_obj_t * obj, uint32_t row_id, const lv_font_t * font, - int32_t letter_space, int32_t line_space, - int32_t cell_left, int32_t cell_right, int32_t cell_top, int32_t cell_bottom); -static void refr_size_form_row(lv_obj_t * obj, uint32_t start_row); -static void refr_cell_size(lv_obj_t * obj, uint32_t row, uint32_t col); -static lv_result_t get_pressed_cell(lv_obj_t * obj, uint32_t * row, uint32_t * col); -static size_t get_cell_txt_len(const char * txt); -static void copy_cell_txt(lv_table_cell_t * dst, const char * txt); -static void get_cell_area(lv_obj_t * obj, uint32_t row, uint32_t col, lv_area_t * area); -static void scroll_to_selected_cell(lv_obj_t * obj); - -static inline bool is_cell_empty(void * cell) -{ - return cell == NULL; -} - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_table_class = { - .constructor_cb = lv_table_constructor, - .destructor_cb = lv_table_destructor, - .event_cb = lv_table_event, - .width_def = LV_SIZE_CONTENT, - .height_def = LV_SIZE_CONTENT, - .base_class = &lv_obj_class, - .editable = LV_OBJ_CLASS_EDITABLE_TRUE, - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .instance_size = sizeof(lv_table_t), - .name = "table", -}; -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_table_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*===================== - * Setter functions - *====================*/ - -void lv_table_set_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col, const char * txt) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(txt); - - lv_table_t * table = (lv_table_t *)obj; - - /*Auto expand*/ - if(col >= table->col_cnt) lv_table_set_column_count(obj, col + 1); - if(row >= table->row_cnt) lv_table_set_row_count(obj, row + 1); - - uint32_t cell = row * table->col_cnt + col; - lv_table_cell_ctrl_t ctrl = 0; - - /*Save the control byte*/ - if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; - - void * user_data = NULL; - - /*Save the user data*/ - if(table->cell_data[cell]) user_data = table->cell_data[cell]->user_data; - - size_t to_allocate = get_cell_txt_len(txt); - - table->cell_data[cell] = lv_realloc(table->cell_data[cell], to_allocate); - LV_ASSERT_MALLOC(table->cell_data[cell]); - if(table->cell_data[cell] == NULL) return; - - copy_cell_txt(table->cell_data[cell], txt); - - table->cell_data[cell]->ctrl = ctrl; - table->cell_data[cell]->user_data = user_data; - refr_cell_size(obj, row, col); -} - -void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint32_t row, uint32_t col, const char * fmt, ...) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(fmt); - - lv_table_t * table = (lv_table_t *)obj; - if(col >= table->col_cnt) { - lv_table_set_column_count(obj, col + 1); - } - - /*Auto expand*/ - if(row >= table->row_cnt) { - lv_table_set_row_count(obj, row + 1); - } - - uint32_t cell = row * table->col_cnt + col; - lv_table_cell_ctrl_t ctrl = 0; - - /*Save the control byte*/ - if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; - - void * user_data = NULL; - - /*Save the user_data*/ - if(table->cell_data[cell]) user_data = table->cell_data[cell]->user_data; - - va_list ap, ap2; - va_start(ap, fmt); - va_copy(ap2, ap); - - /*Allocate space for the new text by using trick from C99 standard section 7.19.6.12*/ - uint32_t len = lv_vsnprintf(NULL, 0, fmt, ap); - va_end(ap); - -#if LV_USE_ARABIC_PERSIAN_CHARS - /*Put together the text according to the format string*/ - char * raw_txt = lv_malloc(len + 1); - LV_ASSERT_MALLOC(raw_txt); - if(raw_txt == NULL) { - va_end(ap2); - return; - } - - lv_vsnprintf(raw_txt, len + 1, fmt, ap2); - - /*Get the size of the Arabic text and process it*/ - size_t len_ap = lv_text_ap_calc_bytes_count(raw_txt); - table->cell_data[cell] = lv_realloc(table->cell_data[cell], sizeof(lv_table_cell_t) + len_ap + 1); - LV_ASSERT_MALLOC(table->cell_data[cell]); - if(table->cell_data[cell] == NULL) { - va_end(ap2); - return; - } - lv_text_ap_proc(raw_txt, table->cell_data[cell]->txt); - - lv_free(raw_txt); -#else - table->cell_data[cell] = lv_realloc(table->cell_data[cell], - sizeof(lv_table_cell_t) + len + 1); /*+1: trailing '\0; */ - LV_ASSERT_MALLOC(table->cell_data[cell]); - if(table->cell_data[cell] == NULL) { - va_end(ap2); - return; - } - - table->cell_data[cell]->txt[len] = 0; /*Ensure NULL termination*/ - - lv_vsnprintf(table->cell_data[cell]->txt, len + 1, fmt, ap2); -#endif - - va_end(ap2); - - table->cell_data[cell]->ctrl = ctrl; - table->cell_data[cell]->user_data = user_data; - refr_cell_size(obj, row, col); -} - -void lv_table_set_row_count(lv_obj_t * obj, uint32_t row_cnt) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_table_t * table = (lv_table_t *)obj; - - if(table->row_cnt == row_cnt) return; - - uint32_t old_row_cnt = table->row_cnt; - table->row_cnt = row_cnt; - - table->row_h = lv_realloc(table->row_h, table->row_cnt * sizeof(table->row_h[0])); - LV_ASSERT_MALLOC(table->row_h); - if(table->row_h == NULL) return; - - /*Free the unused cells*/ - if(old_row_cnt > row_cnt) { - uint32_t old_cell_cnt = old_row_cnt * table->col_cnt; - uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; - uint32_t i; - for(i = new_cell_cnt; i < old_cell_cnt; i++) { - if(table->cell_data[i] && table->cell_data[i]->user_data) { - lv_free(table->cell_data[i]->user_data); - table->cell_data[i]->user_data = NULL; - } - lv_free(table->cell_data[i]); - } - } - - table->cell_data = lv_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); - LV_ASSERT_MALLOC(table->cell_data); - if(table->cell_data == NULL) return; - - /*Initialize the new fields*/ - if(old_row_cnt < row_cnt) { - uint32_t old_cell_cnt = old_row_cnt * table->col_cnt; - uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; - lv_memzero(&table->cell_data[old_cell_cnt], (new_cell_cnt - old_cell_cnt) * sizeof(table->cell_data[0])); - } - - refr_size_form_row(obj, 0); -} - -void lv_table_set_column_count(lv_obj_t * obj, uint32_t col_cnt) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_table_t * table = (lv_table_t *)obj; - - if(table->col_cnt == col_cnt) return; - - uint32_t old_col_cnt = table->col_cnt; - table->col_cnt = col_cnt; - - lv_table_cell_t ** new_cell_data = lv_malloc(table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); - LV_ASSERT_MALLOC(new_cell_data); - if(new_cell_data == NULL) return; - uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; - - lv_memzero(new_cell_data, new_cell_cnt * sizeof(table->cell_data[0])); - - /*The new column(s) messes up the mapping of `cell_data`*/ - uint32_t old_col_start; - uint32_t new_col_start; - uint32_t min_col_cnt = LV_MIN(old_col_cnt, col_cnt); - uint32_t row; - for(row = 0; row < table->row_cnt; row++) { - old_col_start = row * old_col_cnt; - new_col_start = row * col_cnt; - - lv_memcpy(&new_cell_data[new_col_start], &table->cell_data[old_col_start], - sizeof(new_cell_data[0]) * min_col_cnt); - - /*Free the old cells (only if the table becomes smaller)*/ - int32_t i; - for(i = 0; i < (int32_t)old_col_cnt - (int32_t)col_cnt; i++) { - uint32_t idx = old_col_start + min_col_cnt + i; - if(table->cell_data[idx]->user_data) { - lv_free(table->cell_data[idx]->user_data); - table->cell_data[idx]->user_data = NULL; - } - lv_free(table->cell_data[idx]); - table->cell_data[idx] = NULL; - } - } - - lv_free(table->cell_data); - table->cell_data = new_cell_data; - - /*Initialize the new column widths if any*/ - table->col_w = lv_realloc(table->col_w, col_cnt * sizeof(table->col_w[0])); - LV_ASSERT_MALLOC(table->col_w); - if(table->col_w == NULL) return; - - uint32_t col; - for(col = old_col_cnt; col < col_cnt; col++) { - table->col_w[col] = LV_DPI_DEF; - } - - refr_size_form_row(obj, 0) ; -} - -void lv_table_set_column_width(lv_obj_t * obj, uint32_t col_id, int32_t w) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_table_t * table = (lv_table_t *)obj; - - /*Auto expand*/ - if(col_id >= table->col_cnt) lv_table_set_column_count(obj, col_id + 1); - - table->col_w[col_id] = w; - refr_size_form_row(obj, 0); -} - -void lv_table_add_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_table_t * table = (lv_table_t *)obj; - - /*Auto expand*/ - if(col >= table->col_cnt) lv_table_set_column_count(obj, col + 1); - if(row >= table->row_cnt) lv_table_set_row_count(obj, row + 1); - - uint32_t cell = row * table->col_cnt + col; - - if(is_cell_empty(table->cell_data[cell])) { - table->cell_data[cell] = lv_malloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ - LV_ASSERT_MALLOC(table->cell_data[cell]); - if(table->cell_data[cell] == NULL) return; - - table->cell_data[cell]->ctrl = 0; - table->cell_data[cell]->user_data = NULL; - table->cell_data[cell]->txt[0] = '\0'; - } - - table->cell_data[cell]->ctrl |= ctrl; -} - -void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_table_t * table = (lv_table_t *)obj; - - /*Auto expand*/ - if(col >= table->col_cnt) lv_table_set_column_count(obj, col + 1); - if(row >= table->row_cnt) lv_table_set_row_count(obj, row + 1); - - uint32_t cell = row * table->col_cnt + col; - - if(is_cell_empty(table->cell_data[cell])) { - table->cell_data[cell] = lv_malloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ - LV_ASSERT_MALLOC(table->cell_data[cell]); - if(table->cell_data[cell] == NULL) return; - - table->cell_data[cell]->ctrl = 0; - table->cell_data[cell]->user_data = NULL; - table->cell_data[cell]->txt[0] = '\0'; - } - - table->cell_data[cell]->ctrl &= (~ctrl); -} - -void lv_table_set_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col, void * user_data) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_table_t * table = (lv_table_t *)obj; - - /*Auto expand*/ - if(col >= table->col_cnt) lv_table_set_column_count(obj, col + 1); - if(row >= table->row_cnt) lv_table_set_row_count(obj, row + 1); - - uint32_t cell = row * table->col_cnt + col; - - if(is_cell_empty(table->cell_data[cell])) { - table->cell_data[cell] = lv_malloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ - LV_ASSERT_MALLOC(table->cell_data[cell]); - if(table->cell_data[cell] == NULL) return; - - table->cell_data[cell]->ctrl = 0; - table->cell_data[cell]->user_data = NULL; - table->cell_data[cell]->txt[0] = '\0'; - } - - if(table->cell_data[cell]->user_data) { - lv_free(table->cell_data[cell]->user_data); - } - - table->cell_data[cell]->user_data = user_data; -} - -void lv_table_set_selected_cell(lv_obj_t * obj, uint16_t row, uint16_t col) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_table_t * table = (lv_table_t *)obj; - - if(table->col_cnt == 0 || table->row_cnt == 0) return; - - if(table->col_act != col || table->row_act != row) { - table->col_act = (col >= table->col_cnt) ? (table->col_cnt - 1) : col; - table->row_act = (row >= table->row_cnt) ? (table->row_cnt - 1) : row; - - lv_obj_invalidate(obj); - - scroll_to_selected_cell(obj); - - lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - } -} - -/*===================== - * Getter functions - *====================*/ - -const char * lv_table_get_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_table_t * table = (lv_table_t *)obj; - if(row >= table->row_cnt || col >= table->col_cnt) { - LV_LOG_WARN("invalid row or column"); - return ""; - } - uint32_t cell = row * table->col_cnt + col; - - if(is_cell_empty(table->cell_data[cell])) return ""; - - return table->cell_data[cell]->txt; -} - -uint32_t lv_table_get_row_count(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_table_t * table = (lv_table_t *)obj; - return table->row_cnt; -} - -uint32_t lv_table_get_column_count(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_table_t * table = (lv_table_t *)obj; - return table->col_cnt; -} - -int32_t lv_table_get_column_width(lv_obj_t * obj, uint32_t col) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_table_t * table = (lv_table_t *)obj; - - if(col >= table->col_cnt) { - LV_LOG_WARN("too big 'col_id'. Must be < LV_TABLE_COL_MAX."); - return 0; - } - - return table->col_w[col]; -} - -bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_table_t * table = (lv_table_t *)obj; - if(row >= table->row_cnt || col >= table->col_cnt) { - LV_LOG_WARN("invalid row or column"); - return false; - } - uint32_t cell = row * table->col_cnt + col; - - if(is_cell_empty(table->cell_data[cell])) return false; - else return (table->cell_data[cell]->ctrl & ctrl) == ctrl; -} - -void lv_table_get_selected_cell(lv_obj_t * obj, uint32_t * row, uint32_t * col) -{ - lv_table_t * table = (lv_table_t *)obj; - *row = table->row_act; - *col = table->col_act; -} - -void * lv_table_get_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_table_t * table = (lv_table_t *)obj; - if(row >= table->row_cnt || col >= table->col_cnt) { - LV_LOG_WARN("invalid row or column"); - return NULL; - } - uint32_t cell = row * table->col_cnt + col; - - if(is_cell_empty(table->cell_data[cell])) return NULL; - - return table->cell_data[cell]->user_data; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_table_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_table_t * table = (lv_table_t *)obj; - - table->col_cnt = 1; - table->row_cnt = 1; - table->col_w = lv_malloc(table->col_cnt * sizeof(table->col_w[0])); - table->row_h = lv_malloc(table->row_cnt * sizeof(table->row_h[0])); - table->col_w[0] = LV_DPI_DEF; - table->row_h[0] = LV_DPI_DEF; - table->cell_data = lv_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); - table->cell_data[0] = NULL; - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_table_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_table_t * table = (lv_table_t *)obj; - /*Free the cell texts*/ - uint32_t i; - for(i = 0; i < table->col_cnt * table->row_cnt; i++) { - if(table->cell_data[i]) { - if(table->cell_data[i]->user_data) { - lv_free(table->cell_data[i]->user_data); - table->cell_data[i]->user_data = NULL; - } - lv_free(table->cell_data[i]); - table->cell_data[i] = NULL; - } - } - - if(table->cell_data) lv_free(table->cell_data); - if(table->row_h) lv_free(table->row_h); - if(table->col_w) lv_free(table->col_w); -} - -static void lv_table_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - - /*Call the ancestor's event handler*/ - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - lv_table_t * table = (lv_table_t *)obj; - - if(code == LV_EVENT_STYLE_CHANGED) { - refr_size_form_row(obj, 0); - } - else if(code == LV_EVENT_GET_SELF_SIZE) { - lv_point_t * p = lv_event_get_param(e); - uint32_t i; - int32_t w = 0; - for(i = 0; i < table->col_cnt; i++) w += table->col_w[i]; - - int32_t h = 0; - for(i = 0; i < table->row_cnt; i++) h += table->row_h[i]; - - p->x = w - 1; - p->y = h - 1; - } - else if(code == LV_EVENT_PRESSED || code == LV_EVENT_PRESSING) { - uint32_t col; - uint32_t row; - lv_result_t pr_res = get_pressed_cell(obj, &row, &col); - - if(pr_res == LV_RESULT_OK && (table->col_act != col || table->row_act != row)) { - table->col_act = col; - table->row_act = row; - lv_obj_invalidate(obj); - } - } - else if(code == LV_EVENT_RELEASED) { - lv_obj_invalidate(obj); - lv_indev_t * indev = lv_indev_active(); - lv_obj_t * scroll_obj = lv_indev_get_scroll_obj(indev); - if(table->col_act != LV_TABLE_CELL_NONE && table->row_act != LV_TABLE_CELL_NONE && scroll_obj == NULL) { - res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - if(res != LV_RESULT_OK) return; - } - - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); - if(indev_type == LV_INDEV_TYPE_POINTER || indev_type == LV_INDEV_TYPE_BUTTON) { - table->col_act = LV_TABLE_CELL_NONE; - table->row_act = LV_TABLE_CELL_NONE; - } - } - else if(code == LV_EVENT_FOCUSED) { - lv_obj_invalidate(obj); - } - else if(code == LV_EVENT_KEY) { - int32_t c = *((int32_t *)lv_event_get_param(e)); - int32_t col = table->col_act; - int32_t row = table->row_act; - if(col == LV_TABLE_CELL_NONE || row == LV_TABLE_CELL_NONE) { - table->col_act = 0; - table->row_act = 0; - scroll_to_selected_cell(obj); - lv_obj_invalidate(obj); - return; - } - - if(col >= (int32_t)table->col_cnt) col = 0; - if(row >= (int32_t)table->row_cnt) row = 0; - - if(c == LV_KEY_LEFT) col--; - else if(c == LV_KEY_RIGHT) col++; - else if(c == LV_KEY_UP) row--; - else if(c == LV_KEY_DOWN) row++; - else return; - - if(col >= (int32_t)table->col_cnt) { - if(row < (int32_t)table->row_cnt - 1) { - col = 0; - row++; - } - else { - col = table->col_cnt - 1; - } - } - else if(col < 0) { - if(row != 0) { - col = table->col_cnt - 1; - row--; - } - else { - col = 0; - } - } - - if(row >= (int32_t)table->row_cnt) { - row = table->row_cnt - 1; - } - else if(row < 0) { - row = 0; - } - - if((int32_t)table->col_act != col || (int32_t)table->row_act != row) { - table->col_act = col; - table->row_act = row; - lv_obj_invalidate(obj); - - scroll_to_selected_cell(obj); - res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - - if(res != LV_RESULT_OK) return; - } - } - else if(code == LV_EVENT_DRAW_MAIN) { - draw_main(e); - } -} - -static void draw_main(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_table_t * table = (lv_table_t *)obj; - lv_layer_t * layer = lv_event_get_layer(e); - lv_area_t clip_area; - if(!lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area)) return; - - const lv_area_t clip_area_ori = layer->_clip_area; - layer->_clip_area = clip_area; - - lv_point_t txt_size; - lv_area_t cell_area; - - int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - - lv_state_t state_ori = obj->state; - obj->state = LV_STATE_DEFAULT; - obj->skip_trans = 1; - lv_draw_rect_dsc_t rect_dsc_def; - lv_draw_rect_dsc_t rect_dsc_act; /*Passed to the event to modify it*/ - lv_draw_rect_dsc_init(&rect_dsc_def); - lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &rect_dsc_def); - - lv_draw_label_dsc_t label_dsc_def; - lv_draw_label_dsc_t label_dsc_act; /*Passed to the event to modify it*/ - lv_draw_label_dsc_init(&label_dsc_def); - lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &label_dsc_def); - obj->state = state_ori; - obj->skip_trans = 0; - - uint32_t col; - uint32_t row; - uint32_t cell = 0; - - cell_area.y2 = obj->coords.y1 + bg_top - 1 - lv_obj_get_scroll_y(obj) + border_width; - cell_area.x1 = 0; - cell_area.x2 = 0; - int32_t scroll_x = lv_obj_get_scroll_x(obj) ; - bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL; - - /*Handle custom drawer*/ - for(row = 0; row < table->row_cnt; row++) { - int32_t h_row = table->row_h[row]; - - cell_area.y1 = cell_area.y2 + 1; - cell_area.y2 = cell_area.y1 + h_row - 1; - - if(cell_area.y1 > clip_area.y2) break; - - if(rtl) cell_area.x1 = obj->coords.x2 - bg_right - 1 - scroll_x - border_width; - else cell_area.x2 = obj->coords.x1 + bg_left - 1 - scroll_x + border_width; - - for(col = 0; col < table->col_cnt; col++) { - lv_table_cell_ctrl_t ctrl = 0; - if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; - - if(rtl) { - cell_area.x2 = cell_area.x1 - 1; - cell_area.x1 = cell_area.x2 - table->col_w[col] + 1; - } - else { - cell_area.x1 = cell_area.x2 + 1; - cell_area.x2 = cell_area.x1 + table->col_w[col] - 1; - } - - uint32_t col_merge = 0; - for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) { - lv_table_cell_t * next_cell_data = table->cell_data[cell + col_merge]; - - if(is_cell_empty(next_cell_data)) break; - - lv_table_cell_ctrl_t merge_ctrl = (lv_table_cell_ctrl_t) next_cell_data->ctrl; - if(merge_ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) { - int32_t offset = table->col_w[col + col_merge + 1]; - - if(rtl) cell_area.x1 -= offset; - else cell_area.x2 += offset; - } - else { - break; - } - } - - if(cell_area.y2 < clip_area.y1) { - cell += col_merge + 1; - col += col_merge; - continue; - } - - /*Expand the cell area with a half border to avoid drawing 2 borders next to each other*/ - lv_area_t cell_area_border; - lv_area_copy(&cell_area_border, &cell_area); - if((rect_dsc_def.border_side & LV_BORDER_SIDE_LEFT) && cell_area_border.x1 > obj->coords.x1 + bg_left) { - cell_area_border.x1 -= rect_dsc_def.border_width / 2; - } - if((rect_dsc_def.border_side & LV_BORDER_SIDE_TOP) && cell_area_border.y1 > obj->coords.y1 + bg_top) { - cell_area_border.y1 -= rect_dsc_def.border_width / 2; - } - if((rect_dsc_def.border_side & LV_BORDER_SIDE_RIGHT) && cell_area_border.x2 < obj->coords.x2 - bg_right - 1) { - cell_area_border.x2 += rect_dsc_def.border_width / 2 + (rect_dsc_def.border_width & 0x1); - } - if((rect_dsc_def.border_side & LV_BORDER_SIDE_BOTTOM) && - cell_area_border.y2 < obj->coords.y2 - bg_bottom - 1) { - cell_area_border.y2 += rect_dsc_def.border_width / 2 + (rect_dsc_def.border_width & 0x1); - } - - lv_state_t cell_state = LV_STATE_DEFAULT; - if(row == table->row_act && col == table->col_act) { - if(!(obj->state & LV_STATE_SCROLLED) && (obj->state & LV_STATE_PRESSED)) cell_state |= LV_STATE_PRESSED; - if(obj->state & LV_STATE_FOCUSED) cell_state |= LV_STATE_FOCUSED; - if(obj->state & LV_STATE_FOCUS_KEY) cell_state |= LV_STATE_FOCUS_KEY; - if(obj->state & LV_STATE_EDITED) cell_state |= LV_STATE_EDITED; - } - - /*Set up the draw descriptors*/ - if(cell_state == LV_STATE_DEFAULT) { - lv_memcpy(&rect_dsc_act, &rect_dsc_def, sizeof(lv_draw_rect_dsc_t)); - lv_memcpy(&label_dsc_act, &label_dsc_def, sizeof(lv_draw_label_dsc_t)); - } - /*In other cases get the styles directly without caching them*/ - else { - obj->state = cell_state; - obj->skip_trans = 1; - lv_draw_rect_dsc_init(&rect_dsc_act); - lv_draw_label_dsc_init(&label_dsc_act); - lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &rect_dsc_act); - lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &label_dsc_act); - obj->state = state_ori; - obj->skip_trans = 0; - } - - rect_dsc_act.base.id1 = row; - rect_dsc_act.base.id2 = col; - label_dsc_act.base.id1 = row; - label_dsc_act.base.id2 = col; - - lv_draw_rect(layer, &rect_dsc_act, &cell_area_border); - - if(table->cell_data[cell]) { - const int32_t cell_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); - const int32_t cell_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); - const int32_t cell_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); - const int32_t cell_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); - lv_text_flag_t txt_flags = LV_TEXT_FLAG_NONE; - lv_area_t txt_area; - - txt_area.x1 = cell_area.x1 + cell_left; - txt_area.x2 = cell_area.x2 - cell_right; - txt_area.y1 = cell_area.y1 + cell_top; - txt_area.y2 = cell_area.y2 - cell_bottom; - - /*Align the content to the middle if not cropped*/ - bool crop = ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP; - if(crop) txt_flags = LV_TEXT_FLAG_EXPAND; - - lv_text_get_size(&txt_size, table->cell_data[cell]->txt, label_dsc_def.font, - label_dsc_act.letter_space, label_dsc_act.line_space, - lv_area_get_width(&txt_area), txt_flags); - - /*Align the content to the middle if not cropped*/ - if(!crop) { - txt_area.y1 = cell_area.y1 + h_row / 2 - txt_size.y / 2; - txt_area.y2 = cell_area.y1 + h_row / 2 + txt_size.y / 2; - } - - lv_area_t label_clip_area; - bool label_mask_ok; - label_mask_ok = lv_area_intersect(&label_clip_area, &clip_area, &cell_area); - if(label_mask_ok) { - layer->_clip_area = label_clip_area; - label_dsc_act.text = table->cell_data[cell]->txt; - lv_draw_label(layer, &label_dsc_act, &txt_area); - layer->_clip_area = clip_area; - } - } - - cell += col_merge + 1; - col += col_merge; - } - } - - layer->_clip_area = clip_area_ori; -} - -/* Refreshes size of the table starting from @start_row row */ -static void refr_size_form_row(lv_obj_t * obj, uint32_t start_row) -{ - const int32_t cell_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); - const int32_t cell_pad_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); - const int32_t cell_pad_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); - const int32_t cell_pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); - - int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_ITEMS); - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_ITEMS); - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_ITEMS); - - const int32_t minh = lv_obj_get_style_min_height(obj, LV_PART_ITEMS); - const int32_t maxh = lv_obj_get_style_max_height(obj, LV_PART_ITEMS); - - lv_table_t * table = (lv_table_t *)obj; - uint32_t i; - for(i = start_row; i < table->row_cnt; i++) { - int32_t calculated_height = get_row_height(obj, i, font, letter_space, line_space, - cell_pad_left, cell_pad_right, cell_pad_top, cell_pad_bottom); - table->row_h[i] = LV_CLAMP(minh, calculated_height, maxh); - } - - lv_obj_refresh_self_size(obj); - lv_obj_invalidate(obj); -} - -static void refr_cell_size(lv_obj_t * obj, uint32_t row, uint32_t col) -{ - const int32_t cell_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); - const int32_t cell_pad_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); - const int32_t cell_pad_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); - const int32_t cell_pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); - - int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_ITEMS); - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_ITEMS); - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_ITEMS); - - const int32_t minh = lv_obj_get_style_min_height(obj, LV_PART_ITEMS); - const int32_t maxh = lv_obj_get_style_max_height(obj, LV_PART_ITEMS); - - lv_table_t * table = (lv_table_t *)obj; - int32_t calculated_height = get_row_height(obj, row, font, letter_space, line_space, - cell_pad_left, cell_pad_right, cell_pad_top, cell_pad_bottom); - - int32_t prev_row_size = table->row_h[row]; - table->row_h[row] = LV_CLAMP(minh, calculated_height, maxh); - - /*If the row height haven't changed invalidate only this cell*/ - if(prev_row_size == table->row_h[row]) { - lv_area_t cell_area; - get_cell_area(obj, row, col, &cell_area); - lv_area_move(&cell_area, obj->coords.x1, obj->coords.y1); - lv_obj_invalidate_area(obj, &cell_area); - } - else { - lv_obj_refresh_self_size(obj); - lv_obj_invalidate(obj); - } -} - -static int32_t get_row_height(lv_obj_t * obj, uint32_t row_id, const lv_font_t * font, - int32_t letter_space, int32_t line_space, - int32_t cell_left, int32_t cell_right, int32_t cell_top, int32_t cell_bottom) -{ - lv_table_t * table = (lv_table_t *)obj; - - int32_t h_max = lv_font_get_line_height(font) + cell_top + cell_bottom; - /* Calculate the cell_data index where to start */ - uint32_t row_start = row_id * table->col_cnt; - - /* Traverse the cells in the row_id row */ - uint32_t cell; - uint32_t col; - for(cell = row_start, col = 0; cell < row_start + table->col_cnt; cell++, col++) { - lv_table_cell_t * cell_data = table->cell_data[cell]; - - if(is_cell_empty(cell_data)) { - continue; - } - - int32_t txt_w = table->col_w[col]; - - /* Traverse the current row from the first until the penultimate column. - * Increment the text width if the cell has the LV_TABLE_CELL_CTRL_MERGE_RIGHT control, - * exit the traversal when the current cell control is not LV_TABLE_CELL_CTRL_MERGE_RIGHT */ - uint32_t col_merge = 0; - for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) { - lv_table_cell_t * next_cell_data = table->cell_data[cell + col_merge]; - - if(is_cell_empty(next_cell_data)) break; - - lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) next_cell_data->ctrl; - if(ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) { - txt_w += table->col_w[col + col_merge + 1]; - } - else { - break; - } - } - - lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) cell_data->ctrl; - - /*When cropping the text we can assume the row height is equal to the line height*/ - if(ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP) { - h_max = LV_MAX(lv_font_get_line_height(font) + cell_top + cell_bottom, - h_max); - } - /*Else we have to calculate the height of the cell text*/ - else { - lv_point_t txt_size; - txt_w -= cell_left + cell_right; - - lv_text_get_size(&txt_size, table->cell_data[cell]->txt, font, - letter_space, line_space, txt_w, LV_TEXT_FLAG_NONE); - - h_max = LV_MAX(txt_size.y + cell_top + cell_bottom, h_max); - /*Skip until one element after the last merged column*/ - cell += col_merge; - col += col_merge; - } - } - - return h_max; -} - -static lv_result_t get_pressed_cell(lv_obj_t * obj, uint32_t * row, uint32_t * col) -{ - lv_table_t * table = (lv_table_t *)obj; - - lv_indev_type_t type = lv_indev_get_type(lv_indev_active()); - if(type != LV_INDEV_TYPE_POINTER && type != LV_INDEV_TYPE_BUTTON) { - if(col) *col = LV_TABLE_CELL_NONE; - if(row) *row = LV_TABLE_CELL_NONE; - return LV_RESULT_INVALID; - } - - lv_point_t p; - lv_indev_get_point(lv_indev_active(), &p); - - int32_t tmp; - if(col) { - int32_t x = p.x + lv_obj_get_scroll_x(obj); - - if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { - x = obj->coords.x2 - lv_obj_get_style_pad_right(obj, LV_PART_MAIN) - x; - } - else { - x -= obj->coords.x1; - x -= lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - } - - *col = 0; - tmp = 0; - for(*col = 0; *col < table->col_cnt; (*col)++) { - tmp += table->col_w[*col]; - if(x < tmp) break; - } - } - - if(row) { - int32_t y = p.y + lv_obj_get_scroll_y(obj);; - y -= obj->coords.y1; - y -= lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - - *row = 0; - tmp = 0; - - for(*row = 0; *row < table->row_cnt; (*row)++) { - tmp += table->row_h[*row]; - if(y < tmp) break; - } - } - - return LV_RESULT_OK; -} - -/* Returns number of bytes to allocate based on chars configuration */ -static size_t get_cell_txt_len(const char * txt) -{ - size_t retval = 0; - -#if LV_USE_ARABIC_PERSIAN_CHARS - retval = sizeof(lv_table_cell_t) + lv_text_ap_calc_bytes_count(txt) + 1; -#else - retval = sizeof(lv_table_cell_t) + lv_strlen(txt) + 1; -#endif - - return retval; -} - -/* Copy txt into dst skipping the format byte */ -static void copy_cell_txt(lv_table_cell_t * dst, const char * txt) -{ -#if LV_USE_ARABIC_PERSIAN_CHARS - lv_text_ap_proc(txt, dst->txt); -#else - lv_strcpy(dst->txt, txt); -#endif -} - -static void get_cell_area(lv_obj_t * obj, uint32_t row, uint32_t col, lv_area_t * area) -{ - lv_table_t * table = (lv_table_t *)obj; - - uint32_t c; - area->x1 = 0; - for(c = 0; c < col; c++) { - area->x1 += table->col_w[c]; - } - - bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL; - if(rtl) { - area->x1 += lv_obj_get_scroll_x(obj); - int32_t w = lv_obj_get_width(obj); - area->x2 = w - area->x1 - lv_obj_get_style_pad_right(obj, 0); - area->x1 = area->x2 - table->col_w[col]; - } - else { - area->x1 -= lv_obj_get_scroll_x(obj); - area->x1 += lv_obj_get_style_pad_left(obj, 0); - area->x2 = area->x1 + table->col_w[col] - 1; - } - - uint32_t r; - area->y1 = 0; - for(r = 0; r < row; r++) { - area->y1 += table->row_h[r]; - } - - area->y1 += lv_obj_get_style_pad_top(obj, 0); - area->y1 -= lv_obj_get_scroll_y(obj); - area->y2 = area->y1 + table->row_h[row] - 1; - -} - -static void scroll_to_selected_cell(lv_obj_t * obj) -{ - lv_table_t * table = (lv_table_t *)obj; - - lv_area_t a; - get_cell_area(obj, table->row_act, table->col_act, &a); - if(a.x1 < 0) { - lv_obj_scroll_by_bounded(obj, -a.x1, 0, LV_ANIM_ON); - } - else if(a.x2 > lv_obj_get_width(obj)) { - lv_obj_scroll_by_bounded(obj, lv_obj_get_width(obj) - a.x2, 0, LV_ANIM_ON); - } - - if(a.y1 < 0) { - lv_obj_scroll_by_bounded(obj, 0, -a.y1, LV_ANIM_ON); - } - else if(a.y2 > lv_obj_get_height(obj)) { - lv_obj_scroll_by_bounded(obj, 0, lv_obj_get_height(obj) - a.y2, LV_ANIM_ON); - } - -} -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/table/lv_table.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/table/lv_table.h deleted file mode 100644 index 0d615a1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/table/lv_table.h +++ /dev/null @@ -1,214 +0,0 @@ -/** - * @file lv_table.h - * - */ - -#ifndef LV_TABLE_H -#define LV_TABLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../label/lv_label.h" - -#if LV_USE_TABLE != 0 - -/*Testing of dependencies*/ -#if LV_USE_LABEL == 0 -#error "lv_table: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" -#endif - -/********************* - * DEFINES - *********************/ -#define LV_TABLE_CELL_NONE 0XFFFF -LV_EXPORT_CONST_INT(LV_TABLE_CELL_NONE); - -/********************** - * TYPEDEFS - **********************/ - -typedef enum { - LV_TABLE_CELL_CTRL_MERGE_RIGHT = 1 << 0, - LV_TABLE_CELL_CTRL_TEXT_CROP = 1 << 1, - LV_TABLE_CELL_CTRL_CUSTOM_1 = 1 << 4, - LV_TABLE_CELL_CTRL_CUSTOM_2 = 1 << 5, - LV_TABLE_CELL_CTRL_CUSTOM_3 = 1 << 6, - LV_TABLE_CELL_CTRL_CUSTOM_4 = 1 << 7, -} lv_table_cell_ctrl_t; - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_table_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a table object - * @param parent pointer to an object, it will be the parent of the new table - * @return pointer to the created table - */ -lv_obj_t * lv_table_create(lv_obj_t * parent); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the value of a cell. - * @param obj pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param txt text to display in the cell. It will be copied and saved so this variable is not required after this function call. - * @note New roes/columns are added automatically if required - */ -void lv_table_set_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col, const char * txt); - -/** - * Set the value of a cell. Memory will be allocated to store the text by the table. - * @param obj pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param fmt `printf`-like format - * @note New roes/columns are added automatically if required - */ -void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint32_t row, uint32_t col, const char * fmt, - ...) LV_FORMAT_ATTRIBUTE(4, 5); - -/** - * Set the number of rows - * @param obj table pointer to a Table object - * @param row_cnt number of rows - */ -void lv_table_set_row_count(lv_obj_t * obj, uint32_t row_cnt); - -/** - * Set the number of columns - * @param obj table pointer to a Table object - * @param col_cnt number of columns. - */ -void lv_table_set_column_count(lv_obj_t * obj, uint32_t col_cnt); - -/** - * Set the width of a column - * @param obj table pointer to a Table object - * @param col_id id of the column [0 .. LV_TABLE_COL_MAX -1] - * @param w width of the column - */ -void lv_table_set_column_width(lv_obj_t * obj, uint32_t col_id, int32_t w); - -/** - * Add control bits to the cell. - * @param obj pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param ctrl OR-ed values from ::lv_table_cell_ctrl_t - */ -void lv_table_add_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl); - -/** - * Clear control bits of the cell. - * @param obj pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param ctrl OR-ed values from ::lv_table_cell_ctrl_t - */ -void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl); - -/** - * Add custom user data to the cell. - * @param obj pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param user_data pointer to the new user_data. - * Should be allocated by `lv_malloc`, - * and it will be freed automatically when the table is deleted or - * when the cell is dropped due to lower row or column count. - */ -void lv_table_set_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col, void * user_data); - -/** - * Set the selected cell - * @param obj pointer to a table object - * @param row id of the cell row to select - * @param col id of the cell column to select - */ -void lv_table_set_selected_cell(lv_obj_t * obj, uint16_t row, uint16_t col); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the value of a cell. - * @param obj pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @return text in the cell - */ -const char * lv_table_get_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col); - -/** - * Get the number of rows. - * @param obj table pointer to a Table object - * @return number of rows. - */ -uint32_t lv_table_get_row_count(lv_obj_t * obj); - -/** - * Get the number of columns. - * @param obj table pointer to a Table object - * @return number of columns. - */ -uint32_t lv_table_get_column_count(lv_obj_t * obj); - -/** - * Get the width of a column - * @param obj table pointer to a Table object - * @param col id of the column [0 .. LV_TABLE_COL_MAX -1] - * @return width of the column - */ -int32_t lv_table_get_column_width(lv_obj_t * obj, uint32_t col); - -/** - * Get whether a cell has the control bits - * @param obj pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param ctrl OR-ed values from ::lv_table_cell_ctrl_t - * @return true: all control bits are set; false: not all control bits are set - */ -bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl); - -/** - * Get the selected cell (pressed and or focused) - * @param obj pointer to a table object - * @param row pointer to variable to store the selected row (LV_TABLE_CELL_NONE: if no cell selected) - * @param col pointer to variable to store the selected column (LV_TABLE_CELL_NONE: if no cell selected) - */ -void lv_table_get_selected_cell(lv_obj_t * obj, uint32_t * row, uint32_t * col); - -/** - * Get custom user data to the cell. - * @param obj pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - */ -void * lv_table_get_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_TABLE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TABLE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/table/lv_table_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/table/lv_table_private.h deleted file mode 100644 index 498ef5e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/table/lv_table_private.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @file lv_table_private.h - * - */ - -#ifndef LV_TABLE_PRIVATE_H -#define LV_TABLE_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_table.h" - -#if LV_USE_TABLE != 0 -#include "../../core/lv_obj_private.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Cell data */ -struct lv_table_cell_t { - lv_table_cell_ctrl_t ctrl; - void * user_data; /**< Custom user data */ - char txt[1]; /**< Variable length array */ -}; - -/** Table data */ -struct lv_table_t { - lv_obj_t obj; - uint32_t col_cnt; - uint32_t row_cnt; - lv_table_cell_t ** cell_data; - int32_t * row_h; - int32_t * col_w; - uint32_t col_act; - uint32_t row_act; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_TABLE != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TABLE_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/tabview/lv_tabview.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/tabview/lv_tabview.c deleted file mode 100644 index 29e3e2e..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/tabview/lv_tabview.c +++ /dev/null @@ -1,357 +0,0 @@ -/** - * @file lv_tabview.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_tabview_private.h" -#include "../../core/lv_obj_class_private.h" -#include "../../lvgl.h" - -#if LV_USE_TABVIEW - -#include "../../misc/lv_assert.h" -#include "../../indev/lv_indev_private.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_tabview_class) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_tabview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_tabview_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void button_clicked_event_cb(lv_event_t * e); -static void cont_scroll_end_event_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_tabview_class = { - .constructor_cb = lv_tabview_constructor, - .event_cb = lv_tabview_event, - .width_def = LV_PCT(100), - .height_def = LV_PCT(100), - .base_class = &lv_obj_class, - .instance_size = sizeof(lv_tabview_t), - .name = "tabview", -}; - -typedef struct { - lv_dir_t tab_pos; - int32_t tab_size; -} lv_tabview_create_info_t; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_tabview_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - - lv_obj_t * obj = lv_obj_class_create_obj(&lv_tabview_class, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -lv_obj_t * lv_tabview_add_tab(lv_obj_t * obj, const char * name) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_obj_t * cont = lv_tabview_get_content(obj); - - lv_obj_t * page = lv_obj_create(cont); - lv_obj_set_size(page, lv_pct(100), lv_pct(100)); - uint32_t tab_idx = lv_obj_get_child_count(cont); - - lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); - - lv_obj_t * button = lv_button_create(tab_bar); - lv_obj_set_flex_grow(button, 1); - lv_obj_set_size(button, lv_pct(100), lv_pct(100)); - lv_obj_add_event_cb(button, button_clicked_event_cb, LV_EVENT_CLICKED, NULL); - lv_group_t * g = lv_group_get_default(); - if(g) lv_group_add_obj(g, button); - - lv_obj_t * label = lv_label_create(button); - lv_label_set_text(label, name); - lv_obj_center(label); - - if(tab_idx == 1) { - lv_tabview_set_active(obj, 0, LV_ANIM_OFF); - } - - return page; -} - -void lv_tabview_rename_tab(lv_obj_t * obj, uint32_t idx, const char * new_name) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); - lv_obj_t * button = lv_obj_get_child_by_type(tab_bar, idx, &lv_button_class); - lv_obj_t * label = lv_obj_get_child_by_type(button, 0, &lv_label_class); - lv_label_set_text(label, new_name); -} - -void lv_tabview_set_active(lv_obj_t * obj, uint32_t idx, lv_anim_enable_t anim_en) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_tabview_t * tabview = (lv_tabview_t *)obj; - - lv_obj_t * cont = lv_tabview_get_content(obj); - lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); - - uint32_t tab_cnt = lv_tabview_get_tab_count(obj); - if(idx >= tab_cnt) { - idx = tab_cnt - 1; - } - - /*To be sure lv_obj_get_content_width will return valid value*/ - lv_obj_update_layout(obj); - - if(cont == NULL) return; - - if((tabview->tab_pos & LV_DIR_VER) != 0) { - int32_t gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN); - int32_t w = lv_obj_get_content_width(cont); - if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { - lv_obj_scroll_to_x(cont, idx * (gap + w), anim_en); - } - else { - int32_t id_rtl = -(int32_t)idx; - lv_obj_scroll_to_x(cont, (gap + w) * id_rtl, anim_en); - } - } - else { - int32_t gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN); - int32_t h = lv_obj_get_content_height(cont); - lv_obj_scroll_to_y(cont, idx * (gap + h), anim_en); - } - - uint32_t i = 0; - lv_obj_t * button = lv_obj_get_child_by_type(tab_bar, i, &lv_button_class); - while(button) { - lv_obj_set_state(button, LV_STATE_CHECKED, i == idx); - i++; - button = lv_obj_get_child_by_type(tab_bar, (int32_t)i, &lv_button_class); - } - - tabview->tab_cur = idx; -} - -void lv_tabview_set_tab_bar_position(lv_obj_t * obj, lv_dir_t dir) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_tabview_t * tabview = (lv_tabview_t *)obj; - - switch(dir) { - case LV_DIR_TOP: - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); - break; - case LV_DIR_BOTTOM: - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN_REVERSE); - break; - case LV_DIR_LEFT: - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); - break; - case LV_DIR_RIGHT: - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW_REVERSE); - break; - case LV_DIR_HOR: - case LV_DIR_VER: - case LV_DIR_ALL: - case LV_DIR_NONE: - break; - } - - lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); - lv_obj_t * cont = lv_tabview_get_content(obj); - - switch(dir) { - case LV_DIR_TOP: - case LV_DIR_BOTTOM: - lv_obj_set_width(cont, LV_PCT(100)); - lv_obj_set_flex_grow(cont, 1); - lv_obj_set_flex_flow(tab_bar, LV_FLEX_FLOW_ROW); - lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW); - lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_CENTER); - lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_NONE); - break; - case LV_DIR_LEFT: - case LV_DIR_RIGHT: - lv_obj_set_height(cont, LV_PCT(100)); - lv_obj_set_flex_grow(cont, 1); - lv_obj_set_flex_flow(tab_bar, LV_FLEX_FLOW_COLUMN); - lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN); - lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_NONE); - lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_CENTER); - break; - case LV_DIR_HOR: - case LV_DIR_VER: - case LV_DIR_ALL: - case LV_DIR_NONE: - break; - } - - bool was_ver = tabview->tab_pos & LV_DIR_VER; - bool now_ver = dir & LV_DIR_VER; - - if(was_ver != now_ver) { - int32_t dpi = lv_display_get_dpi(lv_obj_get_display(obj)); - if(now_ver) { - lv_obj_set_size(tab_bar, lv_pct(100), dpi / 2); - } - else { - lv_obj_set_size(tab_bar, dpi, lv_pct(100)); - } - } - tabview->tab_pos = dir; -} - -void lv_tabview_set_tab_bar_size(lv_obj_t * obj, int32_t size) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_tabview_t * tabview = (lv_tabview_t *)obj; - - lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); - if(tabview->tab_pos & LV_DIR_VER) { - lv_obj_set_height(tab_bar, size); - } - else { - lv_obj_set_width(tab_bar, size); - } - -} - -uint32_t lv_tabview_get_tab_active(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_tabview_t * tabview = (lv_tabview_t *)obj; - return tabview->tab_cur; -} - -uint32_t lv_tabview_get_tab_count(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); - return lv_obj_get_child_count_by_type(tab_bar, &lv_button_class); -} - -lv_obj_t * lv_tabview_get_content(lv_obj_t * tv) -{ - return lv_obj_get_child(tv, 1); -} - -lv_obj_t * lv_tabview_get_tab_bar(lv_obj_t * tv) -{ - return lv_obj_get_child(tv, 0); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_tabview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_tabview_t * tabview = (lv_tabview_t *)obj; - tabview->tab_pos = LV_DIR_NONE; /*Invalid value to apply the default TOP direction correctly*/ - - lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); - - lv_obj_t * cont; - - lv_obj_create(obj); - cont = lv_obj_create(obj); - lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW); - - lv_obj_add_event_cb(cont, cont_scroll_end_event_cb, LV_EVENT_ALL, NULL); - lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_OFF); - lv_tabview_set_tab_bar_position(obj, LV_DIR_TOP); - - lv_obj_add_flag(cont, LV_OBJ_FLAG_SCROLL_ONE); - lv_obj_remove_flag(cont, LV_OBJ_FLAG_SCROLL_ON_FOCUS); -} - -static void lv_tabview_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - lv_result_t res = lv_obj_event_base(&lv_tabview_class, e); - if(res != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * target = lv_event_get_current_target(e); - - if(code == LV_EVENT_SIZE_CHANGED) { - lv_tabview_set_active(target, lv_tabview_get_tab_active(target), LV_ANIM_OFF); - } -} - -static void button_clicked_event_cb(lv_event_t * e) -{ - lv_obj_t * button = lv_event_get_current_target(e); - - lv_obj_t * tv = lv_obj_get_parent(lv_obj_get_parent(button)); - int32_t idx = lv_obj_get_index_by_type(button, &lv_button_class); - lv_tabview_set_active(tv, idx, LV_ANIM_OFF); -} - -static void cont_scroll_end_event_cb(lv_event_t * e) -{ - lv_obj_t * cont = lv_event_get_current_target(e); - lv_event_code_t code = lv_event_get_code(e); - - lv_obj_t * tv = lv_obj_get_parent(cont); - lv_tabview_t * tv_obj = (lv_tabview_t *)tv; - if(code == LV_EVENT_LAYOUT_CHANGED) { - lv_tabview_set_active(tv, lv_tabview_get_tab_active(tv), LV_ANIM_OFF); - } - else if(code == LV_EVENT_SCROLL_END) { - lv_indev_t * indev = lv_indev_active(); - if(indev && indev->state == LV_INDEV_STATE_PRESSED) { - return; - } - - lv_point_t p; - lv_obj_get_scroll_end(cont, &p); - - int32_t t; - if((tv_obj->tab_pos & LV_DIR_VER) != 0) { - int32_t w = lv_obj_get_content_width(cont); - if(lv_obj_get_style_base_dir(tv, LV_PART_MAIN) == LV_BASE_DIR_RTL) t = -(p.x - w / 2) / w; - else t = (p.x + w / 2) / w; - } - else { - int32_t h = lv_obj_get_content_height(cont); - t = (p.y + h / 2) / h; - } - - if(t < 0) t = 0; - bool new_tab = false; - if(t != (int32_t)lv_tabview_get_tab_active(tv)) new_tab = true; - - /*If not scrolled by an indev set the tab immediately*/ - if(lv_indev_active()) { - lv_tabview_set_active(tv, t, LV_ANIM_ON); - } - else { - lv_tabview_set_active(tv, t, LV_ANIM_OFF); - } - - if(new_tab) lv_obj_send_event(tv, LV_EVENT_VALUE_CHANGED, NULL); - } -} -#endif /*LV_USE_TABVIEW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/tabview/lv_tabview.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/tabview/lv_tabview.h deleted file mode 100644 index f9bfdcc..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/tabview/lv_tabview.h +++ /dev/null @@ -1,115 +0,0 @@ -/** - * @file lv_tabview.h - * - */ - -#ifndef LV_TABVIEW_H -#define LV_TABVIEW_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../core/lv_obj.h" - -#if LV_USE_TABVIEW - -/********************* - * DEFINES - *********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_tabview_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a tabview widget - * @param parent pointer to a parent widget - * @return the created tabview - */ -lv_obj_t * lv_tabview_create(lv_obj_t * parent); - -/** - * Add a tab to the tabview - * @param obj pointer to a tabview widget - * @param name the name of the tab, it will be displayed on the tab bar - * @return the widget where the content of the tab can be created - */ -lv_obj_t * lv_tabview_add_tab(lv_obj_t * obj, const char * name); - -/** - * Change the name of the tab - * @param obj pointer to a tabview widget - * @param idx the index of the tab to rename - * @param new_name the new name as a string - */ -void lv_tabview_rename_tab(lv_obj_t * obj, uint32_t idx, const char * new_name); - -/** - * Show a tab - * @param obj pointer to a tabview widget - * @param idx the index of the tab to show - * @param anim_en LV_ANIM_ON/OFF - */ -void lv_tabview_set_active(lv_obj_t * obj, uint32_t idx, lv_anim_enable_t anim_en); - -/** - * Set the position of the tab bar - * @param obj pointer to a tabview widget - * @param dir LV_DIR_TOP/BOTTOM/LEFT/RIGHT - */ -void lv_tabview_set_tab_bar_position(lv_obj_t * obj, lv_dir_t dir); - -/** - * Set the width or height of the tab bar - * @param obj pointer to tabview widget - * @param size size of the tab bar in pixels or percentage. - * will be used as width or height based on the position of the tab bar) - */ -void lv_tabview_set_tab_bar_size(lv_obj_t * obj, int32_t size); - -/** - * Get the number of tabs - * @param obj pointer to a tabview widget - * @return the number of tabs - */ -uint32_t lv_tabview_get_tab_count(lv_obj_t * obj); - -/** - * Get the current tab's index - * @param obj pointer to a tabview widget - * @return the zero based index of the current tab - */ -uint32_t lv_tabview_get_tab_active(lv_obj_t * obj); - -/** - * Get the widget where the container of each tab is created - * @param obj pointer to a tabview widget - * @return the main container widget - */ -lv_obj_t * lv_tabview_get_content(lv_obj_t * obj); - -/** - * Get the tab bar where the buttons are created - * @param obj pointer to a tabview widget - * @return the tab bar - */ -lv_obj_t * lv_tabview_get_tab_bar(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_TABVIEW*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TABVIEW_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/tabview/lv_tabview_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/tabview/lv_tabview_private.h deleted file mode 100644 index b08c968..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/tabview/lv_tabview_private.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @file lv_tabview_private.h - * - */ - -#ifndef LV_TABVIEW_PRIVATE_H -#define LV_TABVIEW_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_tabview.h" - -#if LV_USE_TABVIEW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct lv_tabview_t { - lv_obj_t obj; - uint32_t tab_cur; - lv_dir_t tab_pos; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_TABVIEW */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TABVIEW_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/textarea/lv_textarea.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/textarea/lv_textarea.c deleted file mode 100644 index 1958371..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/textarea/lv_textarea.c +++ /dev/null @@ -1,1502 +0,0 @@ -/** - * @file lv_ta.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_textarea_private.h" -#include "../label/lv_label_private.h" -#include "../../core/lv_obj_class_private.h" -#if LV_USE_TEXTAREA != 0 - -#include "../../core/lv_group.h" -#include "../../core/lv_refr.h" -#include "../../indev/lv_indev.h" -#include "../../draw/lv_draw.h" -#include "../../misc/lv_assert.h" -#include "../../misc/lv_anim_private.h" -#include "../../misc/lv_text_private.h" -#include "../../misc/lv_math.h" -#include "../../stdlib/lv_string.h" - -/********************* - * DEFINES - *********************/ -#define MY_CLASS (&lv_textarea_class) - -/*Test configuration*/ -#ifndef LV_TEXTAREA_DEF_CURSOR_BLINK_TIME - #define LV_TEXTAREA_DEF_CURSOR_BLINK_TIME 400 /*ms*/ -#endif - -#ifndef LV_TEXTAREA_DEF_PWD_SHOW_TIME - #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ -#endif - -#define LV_TEXTAREA_PWD_BULLET_UNICODE 0x2022 -#define IGNORE_KERNING '\0' - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_textarea_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_textarea_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_textarea_event(const lv_obj_class_t * class_p, lv_event_t * e); -static void label_event_cb(lv_event_t * e); -static void cursor_blink_anim_cb(void * obj, int32_t show); -static void pwd_char_hider_anim(void * obj, int32_t x); -static void pwd_char_hider_anim_completed(lv_anim_t * a); -static void pwd_char_hider(lv_obj_t * obj); -static bool char_is_accepted(lv_obj_t * obj, uint32_t c); -static void start_cursor_blink(lv_obj_t * obj); -static void refr_cursor_area(lv_obj_t * obj); -static void update_cursor_position_on_click(lv_event_t * e); -static lv_result_t insert_handler(lv_obj_t * obj, const char * txt); -static void draw_placeholder(lv_event_t * e); -static void draw_cursor(lv_event_t * e); -static void auto_hide_characters(lv_obj_t * obj); -static void auto_hide_characters_cancel(lv_obj_t * obj); -static inline bool is_valid_but_non_printable_char(const uint32_t letter); - -/********************** - * STATIC VARIABLES - **********************/ -#if LV_USE_OBJ_PROPERTY -static const lv_property_ops_t properties[] = { - { - .id = LV_PROPERTY_TEXTAREA_TEXT, - .setter = lv_textarea_set_text, - .getter = lv_textarea_get_text, - }, - { - .id = LV_PROPERTY_TEXTAREA_PLACEHOLDER_TEXT, - .setter = lv_textarea_set_placeholder_text, - .getter = lv_textarea_get_placeholder_text, - }, - { - .id = LV_PROPERTY_TEXTAREA_CURSOR_POS, - .setter = lv_textarea_set_cursor_pos, - .getter = lv_textarea_get_cursor_pos, - }, - { - .id = LV_PROPERTY_TEXTAREA_CURSOR_CLICK_POS, - .setter = lv_textarea_set_cursor_click_pos, - .getter = lv_textarea_get_cursor_click_pos, - }, - { - .id = LV_PROPERTY_TEXTAREA_PASSWORD_MODE, - .setter = lv_textarea_set_password_mode, - .getter = lv_textarea_get_password_mode, - }, - { - .id = LV_PROPERTY_TEXTAREA_PASSWORD_BULLET, - .setter = lv_textarea_set_password_bullet, - .getter = lv_textarea_get_password_bullet, - }, - { - .id = LV_PROPERTY_TEXTAREA_ONE_LINE, - .setter = lv_textarea_set_one_line, - .getter = lv_textarea_get_one_line, - }, - { - .id = LV_PROPERTY_TEXTAREA_ACCEPTED_CHARS, - .setter = lv_textarea_set_accepted_chars, - .getter = lv_textarea_get_accepted_chars, - }, - { - .id = LV_PROPERTY_TEXTAREA_MAX_LENGTH, - .setter = lv_textarea_set_max_length, - .getter = lv_textarea_get_max_length, - }, - { - .id = LV_PROPERTY_TEXTAREA_INSERT_REPLACE, - .setter = lv_textarea_set_insert_replace, - .getter = NULL, - }, - { - .id = LV_PROPERTY_TEXTAREA_TEXT_SELECTION, - .setter = lv_textarea_set_text_selection, - .getter = lv_textarea_get_text_selection, - }, - { - .id = LV_PROPERTY_TEXTAREA_PASSWORD_SHOW_TIME, - .setter = lv_textarea_set_password_show_time, - .getter = lv_textarea_get_password_show_time, - }, - { - .id = LV_PROPERTY_TEXTAREA_LABEL, - .setter = NULL, - .getter = lv_textarea_get_label, - }, - { - .id = LV_PROPERTY_TEXTAREA_TEXT_IS_SELECTED, - .setter = NULL, - .getter = lv_textarea_text_is_selected, - }, - { - .id = LV_PROPERTY_TEXTAREA_CURRENT_CHAR, - .setter = NULL, - .getter = lv_textarea_get_current_char, - }, -}; -#endif - -const lv_obj_class_t lv_textarea_class = { - .constructor_cb = lv_textarea_constructor, - .destructor_cb = lv_textarea_destructor, - .event_cb = lv_textarea_event, - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .width_def = LV_DPI_DEF * 2, - .height_def = LV_DPI_DEF, - .editable = LV_OBJ_CLASS_EDITABLE_TRUE, - .instance_size = sizeof(lv_textarea_t), - .base_class = &lv_obj_class, - .name = "textarea", -#if LV_USE_OBJ_PROPERTY - .prop_index_start = LV_PROPERTY_TEXTAREA_START, - .prop_index_end = LV_PROPERTY_TEXTAREA_END, - .properties = properties, - .properties_count = sizeof(properties) / sizeof(properties[0]), - -#if LV_USE_OBJ_PROPERTY_NAME - .property_names = lv_textarea_property_names, - .names_count = sizeof(lv_textarea_property_names) / sizeof(lv_property_name_t), -#endif - -#endif -}; - -static const char * ta_insert_replace; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_textarea_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*====================== - * Add/remove functions - *=====================*/ - -void lv_textarea_add_char(lv_obj_t * obj, uint32_t c) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - - if(ta->one_line && (c == '\n' || c == '\r')) { - LV_LOG_INFO("Text area: line break ignored in one-line mode"); - return; - } - - uint32_t u32_buf[2]; - u32_buf[0] = c; - u32_buf[1] = 0; - - const char * letter_buf = (char *)&u32_buf; - - uint32_t c2 = c; -#if LV_BIG_ENDIAN_SYSTEM - if(c != 0) while(*letter_buf == 0) ++letter_buf; - - /*The byte order may or may not need to be swapped here to get correct c_uni below, - since lv_textarea_add_text is ordering bytes correctly before calling lv_textarea_add_char. - Assume swapping is needed if MSB is zero. May not be foolproof. */ - if((c != 0) && ((c & 0xff000000) == 0)) { - c2 = ((c >> 24) & 0xff) | /*move byte 3 to byte 0*/ - ((c << 8) & 0xff0000) | /*move byte 1 to byte 2*/ - ((c >> 8) & 0xff00) | /*move byte 2 to byte 1*/ - ((c << 24) & 0xff000000); /*byte 0 to byte 3*/ - } -#endif - - lv_result_t res = insert_handler(obj, letter_buf); - if(res != LV_RESULT_OK) return; - - uint32_t c_uni = lv_text_encoded_next((const char *)&c2, NULL); - - if(char_is_accepted(obj, c_uni) == false) { - LV_LOG_INFO("Character is not accepted by the text area (too long text or not in the accepted list)"); - return; - } - - if(ta->pwd_mode) pwd_char_hider(obj); /*Make sure all the current text contains only '*'*/ - - /*If the textarea is empty, invalidate it to hide the placeholder*/ - if(ta->placeholder_txt) { - const char * txt = lv_label_get_text(ta->label); - if(txt[0] == '\0') lv_obj_invalidate(obj); - } - - lv_label_ins_text(ta->label, ta->cursor.pos, letter_buf); /*Insert the character*/ - lv_textarea_clear_selection(obj); /*Clear selection*/ - - if(ta->pwd_mode) { - /*+2: the new char + \0*/ - size_t realloc_size = lv_strlen(ta->pwd_tmp) + lv_strlen(letter_buf) + 1; - ta->pwd_tmp = lv_realloc(ta->pwd_tmp, realloc_size); - LV_ASSERT_MALLOC(ta->pwd_tmp); - if(ta->pwd_tmp == NULL) return; - - lv_text_ins(ta->pwd_tmp, ta->cursor.pos, (const char *)letter_buf); - - /*Auto hide characters*/ - auto_hide_characters(obj); - } - - /*Move the cursor after the new character*/ - lv_textarea_set_cursor_pos(obj, lv_textarea_get_cursor_pos(obj) + 1); - - lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); -} - -void lv_textarea_add_text(lv_obj_t * obj, const char * txt) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(txt); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - - if(ta->pwd_mode) pwd_char_hider(obj); /*Make sure all the current text contains only '*'*/ - - /*Add the character one-by-one if not all characters are accepted or there is character limit.*/ - if(lv_textarea_get_accepted_chars(obj) || lv_textarea_get_max_length(obj)) { - uint32_t i = 0; - while(txt[i] != '\0') { - uint32_t c = lv_text_encoded_next(txt, &i); - lv_textarea_add_char(obj, lv_text_unicode_to_encoded(c)); - } - return; - } - - lv_result_t res = insert_handler(obj, txt); - if(res != LV_RESULT_OK) return; - - /*If the textarea is empty, invalidate it to hide the placeholder*/ - if(ta->placeholder_txt) { - const char * txt_act = lv_label_get_text(ta->label); - if(txt_act[0] == '\0') lv_obj_invalidate(obj); - } - - /*Insert the text*/ - lv_label_ins_text(ta->label, ta->cursor.pos, txt); - lv_textarea_clear_selection(obj); - - if(ta->pwd_mode) { - size_t realloc_size = lv_strlen(ta->pwd_tmp) + lv_strlen(txt) + 1; - ta->pwd_tmp = lv_realloc(ta->pwd_tmp, realloc_size); - LV_ASSERT_MALLOC(ta->pwd_tmp); - if(ta->pwd_tmp == NULL) return; - - lv_text_ins(ta->pwd_tmp, ta->cursor.pos, txt); - - /*Auto hide characters*/ - auto_hide_characters(obj); - } - - /*Move the cursor after the new text*/ - lv_textarea_set_cursor_pos(obj, lv_textarea_get_cursor_pos(obj) + lv_text_get_encoded_length(txt)); - - lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); -} - -void lv_textarea_delete_char(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - uint32_t cur_pos = ta->cursor.pos; - - if(cur_pos == 0) return; - - char del_buf[2] = {LV_KEY_DEL, '\0'}; - - lv_result_t res = insert_handler(obj, del_buf); - if(res != LV_RESULT_OK) return; - - char * label_txt = lv_label_get_text(ta->label); - - /*Delete a character*/ - lv_text_cut(label_txt, ta->cursor.pos - 1, 1); - - /*Refresh the label*/ - lv_label_set_text(ta->label, label_txt); - lv_textarea_clear_selection(obj); - - /*If the textarea became empty, invalidate it to hide the placeholder*/ - if(ta->placeholder_txt) { - const char * txt = lv_label_get_text(ta->label); - if(txt[0] == '\0') lv_obj_invalidate(obj); - } - - if(ta->pwd_mode) { - lv_text_cut(ta->pwd_tmp, ta->cursor.pos - 1, 1); - - ta->pwd_tmp = lv_realloc(ta->pwd_tmp, lv_strlen(ta->pwd_tmp) + 1); - LV_ASSERT_MALLOC(ta->pwd_tmp); - if(ta->pwd_tmp == NULL) return; - } - - /*Move the cursor to the place of the deleted character*/ - lv_textarea_set_cursor_pos(obj, ta->cursor.pos - 1); - - lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - -} - -void lv_textarea_delete_char_forward(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - uint32_t cp = lv_textarea_get_cursor_pos(obj); - lv_textarea_set_cursor_pos(obj, cp + 1); - if(cp != lv_textarea_get_cursor_pos(obj)) lv_textarea_delete_char(obj); -} - -/*===================== - * Setter functions - *====================*/ - -void lv_textarea_set_text(lv_obj_t * obj, const char * txt) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(txt); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - - /*Clear the existing selection*/ - lv_textarea_clear_selection(obj); - - /*Add the character one-by-one if not all characters are accepted or there is character limit.*/ - if(lv_textarea_get_accepted_chars(obj) || lv_textarea_get_max_length(obj)) { - lv_label_set_text(ta->label, ""); - lv_textarea_set_cursor_pos(obj, LV_TEXTAREA_CURSOR_LAST); - if(ta->pwd_mode) { - ta->pwd_tmp[0] = '\0'; /*Clear the password too*/ - } - uint32_t i = 0; - while(txt[i] != '\0') { - uint32_t c = lv_text_encoded_next(txt, &i); - lv_textarea_add_char(obj, lv_text_unicode_to_encoded(c)); - } - } - else { - lv_label_set_text(ta->label, txt); - lv_textarea_set_cursor_pos(obj, LV_TEXTAREA_CURSOR_LAST); - } - - /*If the textarea is empty, invalidate it to hide the placeholder*/ - if(ta->placeholder_txt) { - const char * txt_act = lv_label_get_text(ta->label); - if(txt_act[0] == '\0') lv_obj_invalidate(obj); - } - - if(ta->pwd_mode) { - lv_free(ta->pwd_tmp); - ta->pwd_tmp = lv_strdup(txt); - LV_ASSERT_MALLOC(ta->pwd_tmp); - if(ta->pwd_tmp == NULL) return; - - pwd_char_hider(obj); - } - - lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); -} - -void lv_textarea_set_placeholder_text(lv_obj_t * obj, const char * txt) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(txt); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - - size_t txt_len = lv_strlen(txt); - if((txt_len == 0) && (ta->placeholder_txt)) { - lv_free(ta->placeholder_txt); - ta->placeholder_txt = NULL; - } - else { - /*Allocate memory for the placeholder_txt text*/ - /*NOTE: Using special realloc behavior, malloc-like when data_p is NULL*/ - ta->placeholder_txt = lv_realloc(ta->placeholder_txt, txt_len + 1); - LV_ASSERT_MALLOC(ta->placeholder_txt); - if(ta->placeholder_txt == NULL) { - LV_LOG_ERROR("couldn't allocate memory for placeholder"); - return; - } - - lv_strcpy(ta->placeholder_txt, txt); - ta->placeholder_txt[txt_len] = '\0'; - } - - lv_obj_invalidate(obj); -} - -void lv_textarea_set_cursor_pos(lv_obj_t * obj, int32_t pos) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - if((uint32_t)ta->cursor.pos == (uint32_t)pos) return; - - uint32_t len = lv_text_get_encoded_length(lv_label_get_text(ta->label)); - - if(pos < 0) pos = len + pos; - - if(pos > (int32_t)len || pos == LV_TEXTAREA_CURSOR_LAST) pos = len; - - ta->cursor.pos = pos; - - /*Position the label to make the cursor visible*/ - lv_obj_update_layout(obj); - - lv_point_t cur_pos; - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - lv_label_get_letter_pos(ta->label, pos, &cur_pos); - - /*The text area needs to have it's final size to see if the cursor is out of the area or not*/ - - /*Check the top*/ - int32_t font_h = lv_font_get_line_height(font); - if(cur_pos.y < lv_obj_get_scroll_top(obj)) { - lv_obj_scroll_to_y(obj, cur_pos.y, LV_ANIM_ON); - } - /*Check the bottom*/ - int32_t h = lv_obj_get_content_height(obj); - if(cur_pos.y + font_h - lv_obj_get_scroll_top(obj) > h) { - lv_obj_scroll_to_y(obj, cur_pos.y - h + font_h, LV_ANIM_ON); - } - - /*Check the left*/ - if(cur_pos.x < lv_obj_get_scroll_left(obj)) { - lv_obj_scroll_to_x(obj, cur_pos.x, LV_ANIM_ON); - } - /*Check the right*/ - int32_t w = lv_obj_get_content_width(obj); - if(cur_pos.x + font_h - lv_obj_get_scroll_left(obj) > w) { - lv_obj_scroll_to_x(obj, cur_pos.x - w + font_h, LV_ANIM_ON); - } - - ta->cursor.valid_x = cur_pos.x; - - start_cursor_blink(obj); - - refr_cursor_area(obj); -} - -void lv_textarea_set_cursor_click_pos(lv_obj_t * obj, bool en) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - ta->cursor.click_pos = en ? 1U : 0U; -} - -void lv_textarea_set_password_mode(lv_obj_t * obj, bool en) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - if(ta->pwd_mode == en) return; - - ta->pwd_mode = en ? 1U : 0U; - /*Pwd mode is now enabled*/ - if(en) { - char * txt = lv_label_get_text(ta->label); - lv_free(ta->pwd_tmp); - ta->pwd_tmp = lv_strdup(txt); - LV_ASSERT_MALLOC(ta->pwd_tmp); - if(ta->pwd_tmp == NULL) return; - - pwd_char_hider(obj); - - lv_textarea_clear_selection(obj); - } - /*Pwd mode is now disabled*/ - else { - lv_textarea_clear_selection(obj); - lv_label_set_text(ta->label, ta->pwd_tmp); - lv_free(ta->pwd_tmp); - ta->pwd_tmp = NULL; - } - - refr_cursor_area(obj); -} - -void lv_textarea_set_password_bullet(lv_obj_t * obj, const char * bullet) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(bullet); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - - if(!bullet && (ta->pwd_bullet)) { - lv_free(ta->pwd_bullet); - ta->pwd_bullet = NULL; - } - else { - size_t txt_len = lv_strlen(bullet); - - /*Allocate memory for the pwd_bullet text*/ - /*NOTE: Using special realloc behavior, malloc-like when data_p is NULL*/ - ta->pwd_bullet = lv_realloc(ta->pwd_bullet, txt_len + 1); - LV_ASSERT_MALLOC(ta->pwd_bullet); - if(ta->pwd_bullet == NULL) { - LV_LOG_ERROR("couldn't allocate memory for bullet"); - return; - } - - lv_memcpy(ta->pwd_bullet, bullet, txt_len); - ta->pwd_bullet[txt_len] = '\0'; - } - - pwd_char_hider(obj); -} - -void lv_textarea_set_one_line(lv_obj_t * obj, bool en) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - if(ta->one_line == en) return; - - ta->one_line = en ? 1U : 0U; - int32_t width = en ? LV_SIZE_CONTENT : lv_pct(100); - int32_t min_width_value = en ? lv_pct(100) : 0; - - lv_obj_set_width(ta->label, width); - lv_obj_set_style_min_width(ta->label, min_width_value, 0); - - if(en) { - lv_obj_set_height(obj, LV_SIZE_CONTENT); - } - else { - lv_obj_remove_local_style_prop(obj, LV_STYLE_HEIGHT, LV_PART_MAIN); - } - - lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF); -} - -void lv_textarea_set_accepted_chars(lv_obj_t * obj, const char * list) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - - ta->accepted_chars = list; -} - -void lv_textarea_set_max_length(lv_obj_t * obj, uint32_t num) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - - ta->max_length = num; -} - -void lv_textarea_set_insert_replace(lv_obj_t * obj, const char * txt) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - LV_UNUSED(obj); - ta_insert_replace = txt; -} - -void lv_textarea_set_text_selection(lv_obj_t * obj, bool en) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - -#if LV_LABEL_TEXT_SELECTION - lv_textarea_t * ta = (lv_textarea_t *)obj; - - ta->text_sel_en = en; - - if(!en) lv_textarea_clear_selection(obj); -#else - LV_UNUSED(obj); /*Unused*/ - LV_UNUSED(en); /*Unused*/ -#endif -} - -void lv_textarea_set_password_show_time(lv_obj_t * obj, uint32_t time) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - ta->pwd_show_time = time; - pwd_char_hider(obj); -} - -void lv_textarea_set_align(lv_obj_t * obj, lv_text_align_t align) -{ - LV_LOG_WARN("Deprecated: use the normal text_align style property instead"); - lv_obj_set_style_text_align(obj, align, 0); - - switch(align) { - default: - case LV_TEXT_ALIGN_LEFT: - lv_obj_align(lv_textarea_get_label(obj), LV_ALIGN_TOP_LEFT, 0, 0); - break; - case LV_TEXT_ALIGN_RIGHT: - lv_obj_align(lv_textarea_get_label(obj), LV_ALIGN_TOP_RIGHT, 0, 0); - break; - case LV_TEXT_ALIGN_CENTER: - lv_obj_align(lv_textarea_get_label(obj), LV_ALIGN_TOP_MID, 0, 0); - break; - } -} - -/*===================== - * Getter functions - *====================*/ - -const char * lv_textarea_get_text(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - - const char * txt; - if(ta->pwd_mode == 0) { - txt = lv_label_get_text(ta->label); - } - else { - txt = ta->pwd_tmp; - } - - return txt; -} - -const char * lv_textarea_get_placeholder_text(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - if(ta->placeholder_txt) return ta->placeholder_txt; - else return ""; -} - -lv_obj_t * lv_textarea_get_label(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - return ta->label; -} - -uint32_t lv_textarea_get_cursor_pos(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - return ta->cursor.pos; -} - -bool lv_textarea_get_cursor_click_pos(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - return ta->cursor.click_pos; -} - -bool lv_textarea_get_password_mode(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - return ta->pwd_mode == 1U; -} - -const char * lv_textarea_get_password_bullet(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - - if(ta->pwd_bullet) return ta->pwd_bullet; - - lv_font_glyph_dsc_t g; - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - - /*If the textarea's font has the bullet character use it else fallback to "*"*/ - if(lv_font_get_glyph_dsc(font, &g, LV_TEXTAREA_PWD_BULLET_UNICODE, 0)) - return LV_SYMBOL_BULLET; - return "*"; -} - -bool lv_textarea_get_one_line(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - return ta->one_line == 1U; -} - -const char * lv_textarea_get_accepted_chars(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - - return ta->accepted_chars; -} - -uint32_t lv_textarea_get_max_length(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - return ta->max_length; -} - -bool lv_textarea_text_is_selected(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - -#if LV_LABEL_TEXT_SELECTION - lv_textarea_t * ta = (lv_textarea_t *)obj; - - if((lv_label_get_text_selection_start(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL || - lv_label_get_text_selection_end(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL)) { - return true; - } - else { - return false; - } -#else - LV_UNUSED(obj); /*Unused*/ - return false; -#endif -} - -bool lv_textarea_get_text_selection(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - -#if LV_LABEL_TEXT_SELECTION - lv_textarea_t * ta = (lv_textarea_t *)obj; - return ta->text_sel_en; -#else - LV_UNUSED(obj); /*Unused*/ - return false; -#endif -} - -uint32_t lv_textarea_get_password_show_time(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - - return ta->pwd_show_time; -} - -uint32_t lv_textarea_get_current_char(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - const char * txt = lv_textarea_get_text(obj); - lv_textarea_t * ta = (lv_textarea_t *)obj; - uint32_t pos = ta->cursor.pos; - if(lv_text_get_encoded_length(txt) >= pos && pos > 0) - return lv_text_encoded_prev(txt, &pos); - else - return 0; -} - -/*===================== - * Other functions - *====================*/ - -void lv_textarea_clear_selection(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - -#if LV_LABEL_TEXT_SELECTION - lv_textarea_t * ta = (lv_textarea_t *)obj; - - if(lv_label_get_text_selection_start(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL || - lv_label_get_text_selection_end(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL) { - lv_label_set_text_selection_start(ta->label, LV_DRAW_LABEL_NO_TXT_SEL); - lv_label_set_text_selection_end(ta->label, LV_DRAW_LABEL_NO_TXT_SEL); - } -#else - LV_UNUSED(obj); /*Unused*/ -#endif -} - -void lv_textarea_cursor_right(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - uint32_t cp = lv_textarea_get_cursor_pos(obj); - cp++; - lv_textarea_set_cursor_pos(obj, cp); -} - -void lv_textarea_cursor_left(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - uint32_t cp = lv_textarea_get_cursor_pos(obj); - if(cp > 0) { - cp--; - lv_textarea_set_cursor_pos(obj, cp); - } -} - -void lv_textarea_cursor_down(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - lv_point_t pos; - - /*Get the position of the current letter*/ - lv_label_get_letter_pos(ta->label, lv_textarea_get_cursor_pos(obj), &pos); - - /*Increment the y with one line and keep the valid x*/ - - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - int32_t font_h = lv_font_get_line_height(font); - pos.y += font_h + line_space + 1; - pos.x = ta->cursor.valid_x; - - /*Do not go below the last line*/ - if(pos.y < lv_obj_get_height(ta->label)) { - /*Get the letter index on the new cursor position and set it*/ - uint32_t new_cur_pos = lv_label_get_letter_on(ta->label, &pos, true); - - int32_t cur_valid_x_tmp = ta->cursor.valid_x; /*Cursor position set overwrites the valid position*/ - lv_textarea_set_cursor_pos(obj, new_cur_pos); - ta->cursor.valid_x = cur_valid_x_tmp; - } -} - -void lv_textarea_cursor_up(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - lv_point_t pos; - - /*Get the position of the current letter*/ - lv_label_get_letter_pos(ta->label, lv_textarea_get_cursor_pos(obj), &pos); - - /*Decrement the y with one line and keep the valid x*/ - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - int32_t font_h = lv_font_get_line_height(font); - pos.y -= font_h + line_space - 1; - pos.x = ta->cursor.valid_x; - - /*Get the letter index on the new cursor position and set it*/ - uint32_t new_cur_pos = lv_label_get_letter_on(ta->label, &pos, true); - int32_t cur_valid_x_tmp = ta->cursor.valid_x; /*Cursor position set overwrites the valid position*/ - lv_textarea_set_cursor_pos(obj, new_cur_pos); - ta->cursor.valid_x = cur_valid_x_tmp; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_textarea_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - LV_TRACE_OBJ_CREATE("begin"); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - - ta->pwd_mode = 0; - ta->pwd_tmp = NULL; - ta->pwd_bullet = NULL; - ta->pwd_show_time = LV_TEXTAREA_DEF_PWD_SHOW_TIME; - ta->accepted_chars = NULL; - ta->max_length = 0; - ta->cursor.show = 1; - /*It will be set to zero later (with zero value lv_textarea_set_cursor_pos(obj, 0); wouldn't do anything as there is no difference)*/ - ta->cursor.pos = 1; - ta->cursor.click_pos = 1; - ta->cursor.valid_x = 0; - ta->one_line = 0; -#if LV_LABEL_TEXT_SELECTION - ta->text_sel_en = 0; -#endif - ta->label = NULL; - ta->placeholder_txt = NULL; - - ta->label = lv_label_create(obj); - lv_obj_set_width(ta->label, lv_pct(100)); - lv_label_set_text(ta->label, ""); - lv_obj_add_event_cb(ta->label, label_event_cb, LV_EVENT_ALL, NULL); - lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_WITH_ARROW); - - lv_textarea_set_cursor_pos(obj, 0); - - start_cursor_blink(obj); - - LV_TRACE_OBJ_CREATE("finished"); -} - -static void lv_textarea_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - - lv_textarea_t * ta = (lv_textarea_t *)obj; - if(ta->pwd_tmp != NULL) { - lv_free(ta->pwd_tmp); - ta->pwd_tmp = NULL; - } - if(ta->pwd_bullet != NULL) { - lv_free(ta->pwd_bullet); - ta->pwd_bullet = NULL; - } - if(ta->placeholder_txt != NULL) { - lv_free(ta->placeholder_txt); - ta->placeholder_txt = NULL; - } -} - -static void lv_textarea_event(const lv_obj_class_t * class_p, lv_event_t * e) -{ - LV_UNUSED(class_p); - - lv_result_t res; - /*Call the ancestor's event handler*/ - res = lv_obj_event_base(MY_CLASS, e); - if(res != LV_RESULT_OK) return; - - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - - if(code == LV_EVENT_FOCUSED) { - start_cursor_blink(obj); - } - else if(code == LV_EVENT_KEY) { - uint32_t c = *((uint32_t *)lv_event_get_param(e)); /*uint32_t because can be UTF-8*/ - if(c == LV_KEY_RIGHT) - lv_textarea_cursor_right(obj); - else if(c == LV_KEY_LEFT) - lv_textarea_cursor_left(obj); - else if(c == LV_KEY_UP) - lv_textarea_cursor_up(obj); - else if(c == LV_KEY_DOWN) - lv_textarea_cursor_down(obj); - else if(c == LV_KEY_BACKSPACE) - lv_textarea_delete_char(obj); - else if(c == LV_KEY_DEL) - lv_textarea_delete_char_forward(obj); - else if(c == LV_KEY_HOME) - lv_textarea_set_cursor_pos(obj, 0); - else if(c == LV_KEY_END) - lv_textarea_set_cursor_pos(obj, LV_TEXTAREA_CURSOR_LAST); - else if(c == LV_KEY_ENTER && lv_textarea_get_one_line(obj)) - lv_obj_send_event(obj, LV_EVENT_READY, NULL); - else { - lv_textarea_add_char(obj, c); - } - } - else if(code == LV_EVENT_PRESSED || code == LV_EVENT_PRESSING || code == LV_EVENT_PRESS_LOST || - code == LV_EVENT_RELEASED) { - update_cursor_position_on_click(e); - } - else if(code == LV_EVENT_DRAW_MAIN) { - draw_placeholder(e); - } - else if(code == LV_EVENT_DRAW_POST) { - draw_cursor(e); - } -} - -static void label_event_cb(lv_event_t * e) -{ - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * label = lv_event_get_current_target(e); - lv_obj_t * ta = lv_obj_get_parent(label); - - if(code == LV_EVENT_STYLE_CHANGED || code == LV_EVENT_SIZE_CHANGED) { - lv_label_set_text(label, NULL); - refr_cursor_area(ta); - start_cursor_blink(ta); - } -} - -/** - * Called to blink the cursor - * @param ta pointer to a text area - * @param hide 1: hide the cursor, 0: show it - */ -static void cursor_blink_anim_cb(void * obj, int32_t show) -{ - lv_textarea_t * ta = (lv_textarea_t *)obj; - if(show != ta->cursor.show) { - ta->cursor.show = show ? 1U : 0U; - lv_area_t area_tmp; - lv_area_copy(&area_tmp, &ta->cursor.area); - area_tmp.x1 += ta->label->coords.x1; - area_tmp.y1 += ta->label->coords.y1; - area_tmp.x2 += ta->label->coords.x1; - area_tmp.y2 += ta->label->coords.y1; - lv_obj_invalidate_area(obj, &area_tmp); - } -} - -/** - * Dummy function to animate char hiding in pwd mode. - * Does nothing, but a function is required in car hiding anim. - * (pwd_char_hider callback do the real job) - * @param ta unused - * @param x unused - */ -static void pwd_char_hider_anim(void * obj, int32_t x) -{ - LV_UNUSED(obj); - LV_UNUSED(x); -} - -/** - * Call when an animation is ready to convert all characters to '*' - * @param a pointer to the animation - */ -static void pwd_char_hider_anim_completed(lv_anim_t * a) -{ - lv_obj_t * obj = a->var; - pwd_char_hider(obj); -} - -/** - * Hide all characters (convert them to '*') - * @param ta pointer to text area object - */ -static void pwd_char_hider(lv_obj_t * obj) -{ - lv_textarea_t * ta = (lv_textarea_t *)obj; - if(ta->pwd_mode == 0) { - return; - } - - /* When ta->label is empty we get 0 back */ - char * txt = lv_label_get_text(ta->label); - uint32_t enc_len = lv_text_get_encoded_length(txt); - if(enc_len == 0) return; - - const char * bullet = lv_textarea_get_password_bullet(obj); - const size_t bullet_len = lv_strlen(bullet); - char * txt_tmp = lv_malloc(enc_len * bullet_len + 1); - - uint32_t i; - for(i = 0; i < enc_len; i++) { - lv_memcpy(&txt_tmp[i * bullet_len], bullet, bullet_len); - } - txt_tmp[i * bullet_len] = '\0'; - - lv_label_set_text(ta->label, txt_tmp); - lv_free(txt_tmp); - - auto_hide_characters_cancel(obj); - - refr_cursor_area(obj); -} - -/** - * Test a unicode character if it is accepted or not. Checks max length and accepted char list. - * @param ta pointer to a test area object - * @param c a unicode character - * @return true: accepted; false: rejected - */ -static bool char_is_accepted(lv_obj_t * obj, uint32_t c) -{ - lv_textarea_t * ta = (lv_textarea_t *)obj; - - /*Too many characters?*/ - if(ta->max_length > 0 && lv_text_get_encoded_length(lv_textarea_get_text(obj)) >= ta->max_length) { - return false; - } - - if(ta->accepted_chars == NULL || ta->accepted_chars[0] == '\0') return true; - /*Accepted character?*/ - uint32_t i = 0; - - while(ta->accepted_chars[i] != '\0') { - uint32_t a = lv_text_encoded_next(ta->accepted_chars, &i); - if(a == c) return true; /*Accepted*/ - } - - return false; /*The character wasn't in the list*/ -} - -static void start_cursor_blink(lv_obj_t * obj) -{ - lv_textarea_t * ta = (lv_textarea_t *)obj; - uint32_t blink_time = lv_obj_get_style_anim_duration(obj, LV_PART_CURSOR); - if(blink_time == 0) { - lv_anim_delete(obj, cursor_blink_anim_cb); - ta->cursor.show = 1; - } - else { - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, ta); - lv_anim_set_exec_cb(&a, cursor_blink_anim_cb); - lv_anim_set_duration(&a, blink_time); - lv_anim_set_playback_duration(&a, blink_time); - lv_anim_set_values(&a, 1, 0); - lv_anim_set_path_cb(&a, lv_anim_path_step); - lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); - lv_anim_start(&a); - } -} - -static void refr_cursor_area(lv_obj_t * obj) -{ - lv_textarea_t * ta = (lv_textarea_t *)obj; - - const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); - - uint32_t cur_pos = lv_textarea_get_cursor_pos(obj); - const char * txt = lv_label_get_text(ta->label); - - uint32_t byte_pos = lv_text_encoded_get_byte_id(txt, cur_pos); - uint32_t letter = lv_text_encoded_next(&txt[byte_pos], NULL); - - /* Letter height and width */ - const int32_t letter_h = lv_font_get_line_height(font); - /*Set letter_w (set not 0 on non printable but valid chars)*/ - uint32_t letter_space = letter; - if(is_valid_but_non_printable_char(letter)) { - letter_space = ' '; - } - int32_t letter_w = lv_font_get_glyph_width(font, letter_space, IGNORE_KERNING); - - lv_point_t letter_pos; - lv_label_get_letter_pos(ta->label, cur_pos, &letter_pos); - - lv_text_align_t align = lv_obj_calculate_style_text_align(ta->label, LV_PART_MAIN, lv_label_get_text(ta->label)); - - /*If the cursor is out of the text (most right) draw it to the next line*/ - if(((letter_pos.x + ta->label->coords.x1) + letter_w > ta->label->coords.x2) && - (ta->one_line == 0 && align != LV_TEXT_ALIGN_RIGHT)) { - - letter_pos.x = 0; - letter_pos.y += letter_h + line_space; - - if(letter != '\0') { - byte_pos += lv_text_encoded_size(&txt[byte_pos]); - letter = lv_text_encoded_next(&txt[byte_pos], NULL); - } - - uint32_t tmp = letter; - if(is_valid_but_non_printable_char(letter)) { - tmp = ' '; - } - letter_w = lv_font_get_glyph_width(font, tmp, IGNORE_KERNING); - } - - /*Save the byte position. It is required to draw `LV_CURSOR_BLOCK`*/ - ta->cursor.txt_byte_pos = byte_pos; - - /*Calculate the cursor according to its type*/ - int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_CURSOR); - int32_t top = lv_obj_get_style_pad_top(obj, LV_PART_CURSOR) + border_width; - int32_t bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_CURSOR) + border_width; - int32_t left = lv_obj_get_style_pad_left(obj, LV_PART_CURSOR) + border_width; - int32_t right = lv_obj_get_style_pad_right(obj, LV_PART_CURSOR) + border_width; - - lv_area_t cur_area; - cur_area.x1 = letter_pos.x - left; - cur_area.y1 = letter_pos.y - top; - cur_area.x2 = letter_pos.x + right + letter_w - 1; - cur_area.y2 = letter_pos.y + bottom + letter_h - 1; - - /*Save the new area*/ - lv_area_t area_tmp; - lv_area_copy(&area_tmp, &ta->cursor.area); - area_tmp.x1 += ta->label->coords.x1; - area_tmp.y1 += ta->label->coords.y1; - area_tmp.x2 += ta->label->coords.x1; - area_tmp.y2 += ta->label->coords.y1; - lv_obj_invalidate_area(obj, &area_tmp); - - lv_area_copy(&ta->cursor.area, &cur_area); - - lv_area_copy(&area_tmp, &ta->cursor.area); - area_tmp.x1 += ta->label->coords.x1; - area_tmp.y1 += ta->label->coords.y1; - area_tmp.x2 += ta->label->coords.x1; - area_tmp.y2 += ta->label->coords.y1; - lv_obj_invalidate_area(obj, &area_tmp); -} - -static void update_cursor_position_on_click(lv_event_t * e) -{ - lv_indev_t * click_source = lv_indev_active(); - if(click_source == NULL) return; - - lv_obj_t * obj = lv_event_get_current_target(e); - lv_textarea_t * ta = (lv_textarea_t *)obj; - if(ta->cursor.click_pos == 0) return; - - if(lv_indev_get_type(click_source) == LV_INDEV_TYPE_KEYPAD || - lv_indev_get_type(click_source) == LV_INDEV_TYPE_ENCODER) { - return; - } - - lv_area_t label_coords; - lv_obj_get_coords(ta->label, &label_coords); - - lv_point_t point_act, vect_act; - lv_indev_get_point(click_source, &point_act); - lv_indev_get_vect(click_source, &vect_act); - - if(point_act.x < 0 || point_act.y < 0) return; /*Ignore event from keypad*/ - lv_point_t rel_pos; - rel_pos.x = point_act.x - label_coords.x1; - rel_pos.y = point_act.y - label_coords.y1; - - const lv_event_code_t code = lv_event_get_code(e); - - int32_t label_width = lv_obj_get_width(ta->label); - uint32_t char_id_at_click = 0; - -#if LV_LABEL_TEXT_SELECTION - lv_label_t * label_data = (lv_label_t *)ta->label; - bool click_outside_label = false; - /*Check if the click happened on the left side of the area outside the label*/ - if(rel_pos.x < 0) { - char_id_at_click = 0; - click_outside_label = true; - } - /*Check if the click happened on the right side of the area outside the label*/ - else if(rel_pos.x >= label_width) { - char_id_at_click = LV_TEXTAREA_CURSOR_LAST; - click_outside_label = true; - } - else { - char_id_at_click = lv_label_get_letter_on(ta->label, &rel_pos, true); - click_outside_label = !lv_label_is_char_under_pos(ta->label, &rel_pos); - } - - if(ta->text_sel_en) { - if(!ta->text_sel_in_prog && !click_outside_label && code == LV_EVENT_PRESSED) { - /*Input device just went down. Store the selection start position*/ - ta->sel_start = char_id_at_click; - ta->sel_end = LV_LABEL_TEXT_SELECTION_OFF; - ta->text_sel_in_prog = 1; - lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN); - } - else if(ta->text_sel_in_prog && code == LV_EVENT_PRESSING) { - /*Input device may be moving. Store the end position*/ - ta->sel_end = char_id_at_click; - } - else if(ta->text_sel_in_prog && (code == LV_EVENT_PRESS_LOST || code == LV_EVENT_RELEASED)) { - /*Input device is released. Check if anything was selected.*/ - lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN); - } - } - - if(ta->text_sel_in_prog || code == LV_EVENT_PRESSED) lv_textarea_set_cursor_pos(obj, char_id_at_click); - - if(ta->text_sel_in_prog) { - /*If the selected area has changed then update the real values and*/ - - /*Invalidate the text area.*/ - if(ta->sel_start > ta->sel_end) { - if(label_data->sel_start != ta->sel_end || label_data->sel_end != ta->sel_start) { - label_data->sel_start = ta->sel_end; - label_data->sel_end = ta->sel_start; - lv_obj_invalidate(obj); - } - } - else if(ta->sel_start < ta->sel_end) { - if(label_data->sel_start != ta->sel_start || label_data->sel_end != ta->sel_end) { - label_data->sel_start = ta->sel_start; - label_data->sel_end = ta->sel_end; - lv_obj_invalidate(obj); - } - } - else { - if(label_data->sel_start != LV_DRAW_LABEL_NO_TXT_SEL || label_data->sel_end != LV_DRAW_LABEL_NO_TXT_SEL) { - label_data->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; - label_data->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; - lv_obj_invalidate(obj); - } - } - /*Finish selection if necessary*/ - if(code == LV_EVENT_PRESS_LOST || code == LV_EVENT_RELEASED) { - ta->text_sel_in_prog = 0; - } - } -#else - /*Check if the click happened on the left side of the area outside the label*/ - if(rel_pos.x < 0) { - char_id_at_click = 0; - } - /*Check if the click happened on the right side of the area outside the label*/ - else if(rel_pos.x >= label_width) { - char_id_at_click = LV_TEXTAREA_CURSOR_LAST; - } - else { - char_id_at_click = lv_label_get_letter_on(ta->label, &rel_pos, true); - } - - if(code == LV_EVENT_PRESSED) lv_textarea_set_cursor_pos(obj, char_id_at_click); -#endif -} - -/* Returns LV_RESULT_OK when no operation were performed - * Returns LV_RESULT_INVALID when a user defined text was inserted */ -static lv_result_t insert_handler(lv_obj_t * obj, const char * txt) -{ - ta_insert_replace = NULL; - lv_obj_send_event(obj, LV_EVENT_INSERT, (char *)txt); - - /* Drop txt if insert replace is set to '\0' */ - if(ta_insert_replace && ta_insert_replace[0] == '\0') - return LV_RESULT_INVALID; - - if(ta_insert_replace) { - /*Add the replaced text directly it's different from the original*/ - if(lv_strcmp(ta_insert_replace, txt)) { - lv_textarea_add_text(obj, ta_insert_replace); - return LV_RESULT_INVALID; - } - } - - return LV_RESULT_OK; -} - -static void draw_placeholder(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_textarea_t * ta = (lv_textarea_t *)obj; - lv_layer_t * layer = lv_event_get_layer(e); - const char * txt = lv_label_get_text(ta->label); - - /*Draw the place holder*/ - if(txt[0] == '\0' && ta->placeholder_txt && ta->placeholder_txt[0] != 0) { - lv_draw_label_dsc_t ph_dsc; - lv_draw_label_dsc_init(&ph_dsc); - lv_obj_init_draw_label_dsc(obj, LV_PART_TEXTAREA_PLACEHOLDER, &ph_dsc); - - if(ta->one_line) ph_dsc.flag |= LV_TEXT_FLAG_EXPAND; - - int32_t left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - int32_t top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - int32_t bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); - lv_area_t ph_coords; - lv_area_copy(&ph_coords, &obj->coords); - ph_coords.x1 += left + border_width; - ph_coords.x2 -= right + border_width; - ph_coords.y1 += top + border_width; - ph_coords.y2 -= bottom + border_width; - ph_dsc.text = ta->placeholder_txt; - lv_draw_label(layer, &ph_dsc, &ph_coords); - } -} - -static void draw_cursor(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_current_target(e); - lv_textarea_t * ta = (lv_textarea_t *)obj; - lv_layer_t * layer = lv_event_get_layer(e); - const char * txt = lv_label_get_text(ta->label); - - if(ta->cursor.show == 0) return; - - lv_draw_rect_dsc_t cur_dsc; - lv_draw_rect_dsc_init(&cur_dsc); - lv_obj_init_draw_rect_dsc(obj, LV_PART_CURSOR, &cur_dsc); - - /*Draw he cursor according to the type*/ - lv_area_t cur_area; - lv_area_copy(&cur_area, &ta->cursor.area); - - cur_area.x1 += ta->label->coords.x1; - cur_area.y1 += ta->label->coords.y1; - cur_area.x2 += ta->label->coords.x1; - cur_area.y2 += ta->label->coords.y1; - - lv_draw_rect(layer, &cur_dsc, &cur_area); - - int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_CURSOR); - int32_t left = lv_obj_get_style_pad_left(obj, LV_PART_CURSOR) + border_width; - int32_t top = lv_obj_get_style_pad_top(obj, LV_PART_CURSOR) + border_width; - char letter_buf[8] = {0}; - lv_memcpy(letter_buf, &txt[ta->cursor.txt_byte_pos], lv_text_encoded_size(&txt[ta->cursor.txt_byte_pos])); - - cur_area.x1 += left; - cur_area.y1 += top; - - /*Draw the letter over the cursor only if - *the cursor has background or the letter has different color than the original. - *Else the original letter is drawn twice which makes it look bolder*/ - lv_color_t label_color = lv_obj_get_style_text_color(ta->label, 0); - lv_draw_label_dsc_t cur_label_dsc; - lv_draw_label_dsc_init(&cur_label_dsc); - lv_obj_init_draw_label_dsc(obj, LV_PART_CURSOR, &cur_label_dsc); - if(cur_dsc.bg_opa > LV_OPA_MIN || !lv_color_eq(cur_label_dsc.color, label_color)) { - cur_label_dsc.text = letter_buf; - cur_label_dsc.text_local = true; - lv_draw_label(layer, &cur_label_dsc, &cur_area); - } -} - -static void auto_hide_characters(lv_obj_t * obj) -{ - lv_textarea_t * ta = (lv_textarea_t *) obj; - - if(ta->pwd_show_time == 0) { - pwd_char_hider(obj); - } - else { - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, ta); - lv_anim_set_exec_cb(&a, pwd_char_hider_anim); - lv_anim_set_duration(&a, ta->pwd_show_time); - lv_anim_set_values(&a, 0, 1); - lv_anim_set_path_cb(&a, lv_anim_path_step); - lv_anim_set_completed_cb(&a, pwd_char_hider_anim_completed); - lv_anim_start(&a); - } -} - -static void auto_hide_characters_cancel(lv_obj_t * obj) -{ - lv_anim_delete(obj, pwd_char_hider_anim); -} - -static inline bool is_valid_but_non_printable_char(const uint32_t letter) -{ - if(letter == '\0' || letter == '\n' || letter == '\r') { - return true; - } - - return false; -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/textarea/lv_textarea.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/textarea/lv_textarea.h deleted file mode 100644 index 0804029..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/textarea/lv_textarea.h +++ /dev/null @@ -1,353 +0,0 @@ -/** - * @file lv_textarea.h - * - */ - -#ifndef LV_TEXTAREA_H -#define LV_TEXTAREA_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../label/lv_label.h" - -#if LV_USE_TEXTAREA != 0 - -/*Testing of dependencies*/ -#if LV_USE_LABEL == 0 -#error "lv_textarea: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" -#endif - -/********************* - * DEFINES - *********************/ -#define LV_TEXTAREA_CURSOR_LAST (0x7FFF) /*Put the cursor after the last character*/ - -LV_EXPORT_CONST_INT(LV_TEXTAREA_CURSOR_LAST); - -/********************** - * TYPEDEFS - **********************/ - -#if LV_USE_OBJ_PROPERTY -enum { - LV_PROPERTY_ID(TEXTAREA, TEXT, LV_PROPERTY_TYPE_TEXT, 0), - LV_PROPERTY_ID(TEXTAREA, PLACEHOLDER_TEXT, LV_PROPERTY_TYPE_TEXT, 1), - LV_PROPERTY_ID(TEXTAREA, CURSOR_POS, LV_PROPERTY_TYPE_INT, 2), - LV_PROPERTY_ID(TEXTAREA, CURSOR_CLICK_POS, LV_PROPERTY_TYPE_INT, 3), - LV_PROPERTY_ID(TEXTAREA, PASSWORD_MODE, LV_PROPERTY_TYPE_INT, 4), - LV_PROPERTY_ID(TEXTAREA, PASSWORD_BULLET, LV_PROPERTY_TYPE_TEXT, 5), - LV_PROPERTY_ID(TEXTAREA, ONE_LINE, LV_PROPERTY_TYPE_BOOL, 6), - LV_PROPERTY_ID(TEXTAREA, ACCEPTED_CHARS, LV_PROPERTY_TYPE_TEXT, 7), - LV_PROPERTY_ID(TEXTAREA, MAX_LENGTH, LV_PROPERTY_TYPE_INT, 8), - LV_PROPERTY_ID(TEXTAREA, INSERT_REPLACE, LV_PROPERTY_TYPE_TEXT, 9), - LV_PROPERTY_ID(TEXTAREA, TEXT_SELECTION, LV_PROPERTY_TYPE_BOOL, 10), - LV_PROPERTY_ID(TEXTAREA, PASSWORD_SHOW_TIME, LV_PROPERTY_TYPE_INT, 11), - LV_PROPERTY_ID(TEXTAREA, LABEL, LV_PROPERTY_TYPE_OBJ, 12), - LV_PROPERTY_ID(TEXTAREA, TEXT_IS_SELECTED, LV_PROPERTY_TYPE_INT, 13), - LV_PROPERTY_ID(TEXTAREA, CURRENT_CHAR, LV_PROPERTY_TYPE_INT, 14), - LV_PROPERTY_TEXTAREA_END, -}; -#endif - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_textarea_class; - -enum { - LV_PART_TEXTAREA_PLACEHOLDER = LV_PART_CUSTOM_FIRST, -}; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a text area object - * @param parent pointer to an object, it will be the parent of the new text area - * @return pointer to the created text area - */ -lv_obj_t * lv_textarea_create(lv_obj_t * parent); - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Insert a character to the current cursor position. - * To add a wide char, e.g. 'Á' use `lv_text_encoded_conv_wc('Á')` - * @param obj pointer to a text area object - * @param c a character (e.g. 'a') - */ -void lv_textarea_add_char(lv_obj_t * obj, uint32_t c); - -/** - * Insert a text to the current cursor position - * @param obj pointer to a text area object - * @param txt a '\0' terminated string to insert - */ -void lv_textarea_add_text(lv_obj_t * obj, const char * txt); - -/** - * Delete a the left character from the current cursor position - * @param obj pointer to a text area object - */ -void lv_textarea_delete_char(lv_obj_t * obj); - -/** - * Delete the right character from the current cursor position - * @param obj pointer to a text area object - */ -void lv_textarea_delete_char_forward(lv_obj_t * obj); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the text of a text area - * @param obj pointer to a text area object - * @param txt pointer to the text - */ -void lv_textarea_set_text(lv_obj_t * obj, const char * txt); - -/** - * Set the placeholder text of a text area - * @param obj pointer to a text area object - * @param txt pointer to the text - */ -void lv_textarea_set_placeholder_text(lv_obj_t * obj, const char * txt); - -/** - * Set the cursor position - * @param obj pointer to a text area object - * @param pos the new cursor position in character index - * < 0 : index from the end of the text - * LV_TEXTAREA_CURSOR_LAST: go after the last character - */ -void lv_textarea_set_cursor_pos(lv_obj_t * obj, int32_t pos); - -/** - * Enable/Disable the positioning of the cursor by clicking the text on the text area. - * @param obj pointer to a text area object - * @param en true: enable click positions; false: disable - */ -void lv_textarea_set_cursor_click_pos(lv_obj_t * obj, bool en); - -/** - * Enable/Disable password mode - * @param obj pointer to a text area object - * @param en true: enable, false: disable - */ -void lv_textarea_set_password_mode(lv_obj_t * obj, bool en); - -/** - * Set the replacement characters to show in password mode - * @param obj pointer to a text area object - * @param bullet pointer to the replacement text - */ -void lv_textarea_set_password_bullet(lv_obj_t * obj, const char * bullet); - -/** - * Configure the text area to one line or back to normal - * @param obj pointer to a text area object - * @param en true: one line, false: normal - */ -void lv_textarea_set_one_line(lv_obj_t * obj, bool en); - -/** - * Set a list of characters. Only these characters will be accepted by the text area - * @param obj pointer to a text area object - * @param list list of characters. Only the pointer is saved. E.g. "+-.,0123456789" - */ -void lv_textarea_set_accepted_chars(lv_obj_t * obj, const char * list); - -/** - * Set max length of a Text Area. - * @param obj pointer to a text area object - * @param num the maximal number of characters can be added (`lv_textarea_set_text` ignores it) - */ -void lv_textarea_set_max_length(lv_obj_t * obj, uint32_t num); - -/** - * In `LV_EVENT_INSERT` the text which planned to be inserted can be replaced by another text. - * It can be used to add automatic formatting to the text area. - * @param obj pointer to a text area object - * @param txt pointer to a new string to insert. If `""` no text will be added. - * The variable must be live after the `event_cb` exists. (Should be `global` or `static`) - */ -void lv_textarea_set_insert_replace(lv_obj_t * obj, const char * txt); - -/** - * Enable/disable selection mode. - * @param obj pointer to a text area object - * @param en true or false to enable/disable selection mode - */ -void lv_textarea_set_text_selection(lv_obj_t * obj, bool en); - -/** - * Set how long show the password before changing it to '*' - * @param obj pointer to a text area object - * @param time show time in milliseconds. 0: hide immediately. - */ -void lv_textarea_set_password_show_time(lv_obj_t * obj, uint32_t time); - -/** - * @deprecated Use the normal text_align style property instead - * Set the label's alignment. - * It sets where the label is aligned (in one line mode it can be smaller than the text area) - * and how the lines of the area align in case of multiline text area - * @param obj pointer to a text area object - * @param align the align mode from ::lv_text_align_t - */ -void lv_textarea_set_align(lv_obj_t * obj, lv_text_align_t align); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the text of a text area. In password mode it gives the real text (not '*'s). - * @param obj pointer to a text area object - * @return pointer to the text - */ -const char * lv_textarea_get_text(const lv_obj_t * obj); - -/** - * Get the placeholder text of a text area - * @param obj pointer to a text area object - * @return pointer to the text - */ -const char * lv_textarea_get_placeholder_text(lv_obj_t * obj); - -/** - * Get the label of a text area - * @param obj pointer to a text area object - * @return pointer to the label object - */ -lv_obj_t * lv_textarea_get_label(const lv_obj_t * obj); - -/** - * Get the current cursor position in character index - * @param obj pointer to a text area object - * @return the cursor position - */ -uint32_t lv_textarea_get_cursor_pos(const lv_obj_t * obj); - -/** - * Get whether the cursor click positioning is enabled or not. - * @param obj pointer to a text area object - * @return true: enable click positions; false: disable - */ -bool lv_textarea_get_cursor_click_pos(lv_obj_t * obj); - -/** - * Get the password mode attribute - * @param obj pointer to a text area object - * @return true: password mode is enabled, false: disabled - */ -bool lv_textarea_get_password_mode(const lv_obj_t * obj); - -/** - * Get the replacement characters to show in password mode - * @param obj pointer to a text area object - * @return pointer to the replacement text - */ -const char * lv_textarea_get_password_bullet(lv_obj_t * obj); - -/** - * Get the one line configuration attribute - * @param obj pointer to a text area object - * @return true: one line configuration is enabled, false: disabled - */ -bool lv_textarea_get_one_line(const lv_obj_t * obj); - -/** - * Get a list of accepted characters. - * @param obj pointer to a text area object - * @return list of accented characters. - */ -const char * lv_textarea_get_accepted_chars(lv_obj_t * obj); - -/** - * Get max length of a Text Area. - * @param obj pointer to a text area object - * @return the maximal number of characters to be add - */ -uint32_t lv_textarea_get_max_length(lv_obj_t * obj); - -/** - * Find whether text is selected or not. - * @param obj pointer to a text area object - * @return whether text is selected or not - */ -bool lv_textarea_text_is_selected(const lv_obj_t * obj); - -/** - * Find whether selection mode is enabled. - * @param obj pointer to a text area object - * @return true: selection mode is enabled, false: disabled - */ -bool lv_textarea_get_text_selection(lv_obj_t * obj); - -/** - * Set how long show the password before changing it to '*' - * @param obj pointer to a text area object - * @return show time in milliseconds. 0: hide immediately. - */ -uint32_t lv_textarea_get_password_show_time(lv_obj_t * obj); - -/** - * Get a the character from the current cursor position - * @param obj pointer to a text area object - * @return a the character or 0 - */ -uint32_t lv_textarea_get_current_char(lv_obj_t * obj); - -/*===================== - * Other functions - *====================*/ - -/** - * Clear the selection on the text area. - * @param obj pointer to a text area object - */ -void lv_textarea_clear_selection(lv_obj_t * obj); - -/** - * Move the cursor one character right - * @param obj pointer to a text area object - */ -void lv_textarea_cursor_right(lv_obj_t * obj); - -/** - * Move the cursor one character left - * @param obj pointer to a text area object - */ -void lv_textarea_cursor_left(lv_obj_t * obj); - -/** - * Move the cursor one line down - * @param obj pointer to a text area object - */ -void lv_textarea_cursor_down(lv_obj_t * obj); - -/** - * Move the cursor one line up - * @param obj pointer to a text area object - */ -void lv_textarea_cursor_up(lv_obj_t * obj); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_TEXTAREA_H*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TEXTAREA_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/textarea/lv_textarea_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/textarea/lv_textarea_private.h deleted file mode 100644 index e2d3aaa..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/textarea/lv_textarea_private.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @file lv_textarea_private.h - * - */ - -#ifndef LV_TEXTAREA_PRIVATE_H -#define LV_TEXTAREA_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_textarea.h" - -#if LV_USE_TEXTAREA != 0 - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Data of text area */ -struct lv_textarea_t { - lv_obj_t obj; - lv_obj_t * label; /**< Label of the text area */ - char * placeholder_txt; /**< Place holder label. only visible if text is an empty string */ - char * pwd_tmp; /**< Used to store the original text in password mode */ - char * pwd_bullet; /**< Replacement characters displayed in password mode */ - const char * accepted_chars; /**< Only these characters will be accepted. NULL: accept all */ - uint32_t max_length; /**< The max. number of characters. 0: no limit */ - uint32_t pwd_show_time; /**< Time to show characters in password mode before change them to '*' */ - struct { - int32_t valid_x; /**< Used when stepping up/down to a shorter line. - *(Used by the library) */ - uint32_t pos; /**< The current cursor position - *(0: before 1st letter; 1: before 2nd letter ...) */ - lv_area_t area; /**< Cursor area relative to the Text Area */ - uint32_t txt_byte_pos; /**< Byte index of the letter after (on) the cursor */ - uint8_t show : 1; /**< Cursor is visible now or not (Handled by the library) */ - uint8_t click_pos : 1; /**< 1: Enable positioning the cursor by clicking the text area */ - } cursor; -#if LV_LABEL_TEXT_SELECTION - uint32_t sel_start; /**< Temporary values for text selection */ - uint32_t sel_end; - uint8_t text_sel_in_prog : 1; /**< User is in process of selecting */ - uint8_t text_sel_en : 1; /**< Text can be selected on this text area */ -#endif - uint8_t pwd_mode : 1; /**< Replace characters with '*' */ - uint8_t one_line : 1; /**< One line mode (ignore line breaks) */ -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_TEXTAREA != 0 */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TEXTAREA_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/tileview/lv_tileview.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/tileview/lv_tileview.c deleted file mode 100644 index 8844a89..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/tileview/lv_tileview.c +++ /dev/null @@ -1,191 +0,0 @@ -/** - * @file lv_tileview.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_tileview_private.h" -#include "../../core/lv_obj_class_private.h" -#include "../../indev/lv_indev.h" -#include "../../indev/lv_indev_private.h" -#if LV_USE_TILEVIEW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_tileview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void lv_tileview_tile_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); -static void tileview_event_cb(lv_event_t * e); - -/********************** - * STATIC VARIABLES - **********************/ - -const lv_obj_class_t lv_tileview_class = { - .constructor_cb = lv_tileview_constructor, - .base_class = &lv_obj_class, - .instance_size = sizeof(lv_tileview_t), - .name = "tileview", -}; - -const lv_obj_class_t lv_tileview_tile_class = { - .constructor_cb = lv_tileview_tile_constructor, - .base_class = &lv_obj_class, - .instance_size = sizeof(lv_tileview_tile_t), - .name = "tile", -}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_tileview_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(&lv_tileview_class, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -/*====================== - * Add/remove functions - *=====================*/ - -lv_obj_t * lv_tileview_add_tile(lv_obj_t * tv, uint8_t col_id, uint8_t row_id, lv_dir_t dir) -{ - LV_LOG_INFO("begin"); - - lv_obj_t * obj = lv_obj_class_create_obj(&lv_tileview_tile_class, tv); - lv_obj_class_init_obj(obj); - lv_obj_set_pos(obj, lv_pct(col_id * 100), lv_pct(row_id * 100)); - - lv_tileview_tile_t * tile = (lv_tileview_tile_t *)obj; - tile->dir = dir; - - if(col_id == 0 && row_id == 0) { - lv_obj_set_scroll_dir(tv, dir); - } - return obj; -} - -void lv_tileview_set_tile(lv_obj_t * obj, lv_obj_t * tile_obj, lv_anim_enable_t anim_en) -{ - int32_t tx = lv_obj_get_x(tile_obj); - int32_t ty = lv_obj_get_y(tile_obj); - - lv_tileview_tile_t * tile = (lv_tileview_tile_t *)tile_obj; - lv_tileview_t * tv = (lv_tileview_t *) obj; - tv->tile_act = (lv_obj_t *)tile; - - lv_obj_set_scroll_dir(obj, tile->dir); - lv_obj_scroll_to(obj, tx, ty, anim_en); -} - -void lv_tileview_set_tile_by_index(lv_obj_t * tv, uint32_t col_id, uint32_t row_id, lv_anim_enable_t anim_en) -{ - lv_obj_update_layout(tv); - - int32_t w = lv_obj_get_content_width(tv); - int32_t h = lv_obj_get_content_height(tv); - - int32_t tx = col_id * w; - int32_t ty = row_id * h; - - uint32_t i; - for(i = 0; i < lv_obj_get_child_count(tv); i++) { - lv_obj_t * tile_obj = lv_obj_get_child(tv, i); - int32_t x = lv_obj_get_x(tile_obj); - int32_t y = lv_obj_get_y(tile_obj); - if(x == tx && y == ty) { - lv_tileview_set_tile(tv, tile_obj, anim_en); - return; - } - } - - LV_LOG_WARN("No tile found with at (%d,%d) index", (int)col_id, (int)row_id); -} - -lv_obj_t * lv_tileview_get_tile_active(lv_obj_t * obj) -{ - lv_tileview_t * tv = (lv_tileview_t *) obj; - return tv->tile_act; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_tileview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); - lv_obj_add_event_cb(obj, tileview_event_cb, LV_EVENT_ALL, NULL); - lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ONE); - lv_obj_set_scroll_snap_x(obj, LV_SCROLL_SNAP_CENTER); - lv_obj_set_scroll_snap_y(obj, LV_SCROLL_SNAP_CENTER); - -} - -static void lv_tileview_tile_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - - LV_UNUSED(class_p); - lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); - lv_obj_update_layout(obj); /*Be sure the size is correct*/ -} - -static void tileview_event_cb(lv_event_t * e) -{ - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t * obj = lv_event_get_current_target(e); - lv_tileview_t * tv = (lv_tileview_t *) obj; - - if(code == LV_EVENT_SCROLL_END) { - lv_indev_t * indev = lv_indev_active(); - if(indev && indev->state == LV_INDEV_STATE_PRESSED) { - return; - } - - int32_t w = lv_obj_get_content_width(obj); - int32_t h = lv_obj_get_content_height(obj); - - lv_point_t scroll_end; - lv_obj_get_scroll_end(obj, &scroll_end); - int32_t left = scroll_end.x; - int32_t top = scroll_end.y; - - int32_t tx = ((left + (w / 2)) / w) * w; - int32_t ty = ((top + (h / 2)) / h) * h; - - lv_dir_t dir = LV_DIR_ALL; - uint32_t i; - for(i = 0; i < lv_obj_get_child_count(obj); i++) { - lv_obj_t * tile_obj = lv_obj_get_child(obj, i); - int32_t x = lv_obj_get_x(tile_obj); - int32_t y = lv_obj_get_y(tile_obj); - if(x == tx && y == ty) { - lv_tileview_tile_t * tile = (lv_tileview_tile_t *)tile_obj; - tv->tile_act = (lv_obj_t *)tile; - dir = tile->dir; - lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); - break; - } - } - lv_obj_set_scroll_dir(obj, dir); - } -} -#endif /*LV_USE_TILEVIEW*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/tileview/lv_tileview.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/tileview/lv_tileview.h deleted file mode 100644 index d373a26..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/tileview/lv_tileview.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @file lv_tileview.h - * - */ - -#ifndef LV_TILEVIEW_H -#define LV_TILEVIEW_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../core/lv_obj.h" - -#if LV_USE_TILEVIEW - -/********************* - * DEFINES - *********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_tileview_class; -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_tileview_tile_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a Tileview object - * @param parent pointer to an object, it will be the parent of the new tileview - * @return pointer to the created tileview - */ -lv_obj_t * lv_tileview_create(lv_obj_t * parent); - -lv_obj_t * lv_tileview_add_tile(lv_obj_t * tv, uint8_t col_id, uint8_t row_id, lv_dir_t dir); - -void lv_tileview_set_tile(lv_obj_t * tv, lv_obj_t * tile_obj, lv_anim_enable_t anim_en); -void lv_tileview_set_tile_by_index(lv_obj_t * tv, uint32_t col_id, uint32_t row_id, lv_anim_enable_t anim_en); - -lv_obj_t * lv_tileview_get_tile_active(lv_obj_t * obj); - -/*===================== - * Other functions - *====================*/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_TILEVIEW*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TILEVIEW_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/tileview/lv_tileview_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/tileview/lv_tileview_private.h deleted file mode 100644 index 5c91a40..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/tileview/lv_tileview_private.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file lv_tileview_private.h - * - */ - -#ifndef LV_TILEVIEW_PRIVATE_H -#define LV_TILEVIEW_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_tileview.h" - -#if LV_USE_TILEVIEW - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ -struct lv_tileview_t { - lv_obj_t obj; - lv_obj_t * tile_act; -}; - -struct lv_tileview_tile_t { - lv_obj_t obj; - lv_dir_t dir; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_TILEVIEW */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TILEVIEW_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/win/lv_win.c b/software/Power_Pico/Middlewares/LVGL/src/widgets/win/lv_win.c deleted file mode 100644 index 508d2f0..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/win/lv_win.c +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @file lv_win.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_win_private.h" -#include "../../core/lv_obj_class_private.h" -#include "../../lvgl.h" -#if LV_USE_WIN - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_win_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ -const lv_obj_class_t lv_win_class = { - .constructor_cb = lv_win_constructor, - .width_def = LV_PCT(100), - .height_def = LV_PCT(100), - .base_class = &lv_obj_class, - .instance_size = sizeof(lv_win_t), - .name = "win", -}; -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_obj_t * lv_win_create(lv_obj_t * parent) -{ - LV_LOG_INFO("begin"); - lv_obj_t * obj = lv_obj_class_create_obj(&lv_win_class, parent); - lv_obj_class_init_obj(obj); - return obj; -} - -lv_obj_t * lv_win_add_title(lv_obj_t * win, const char * txt) -{ - lv_obj_t * header = lv_win_get_header(win); - lv_obj_t * title = lv_label_create(header); - lv_label_set_long_mode(title, LV_LABEL_LONG_DOT); - lv_label_set_text(title, txt); - lv_obj_set_flex_grow(title, 1); - return title; -} - -lv_obj_t * lv_win_add_button(lv_obj_t * win, const void * icon, int32_t btn_w) -{ - lv_obj_t * header = lv_win_get_header(win); - lv_obj_t * btn = lv_button_create(header); - lv_obj_set_size(btn, btn_w, LV_PCT(100)); - - if(icon) { - lv_obj_t * img = lv_image_create(btn); - lv_image_set_src(img, icon); - lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); - } - - return btn; -} - -lv_obj_t * lv_win_get_header(lv_obj_t * win) -{ - return lv_obj_get_child(win, 0); -} - -lv_obj_t * lv_win_get_content(lv_obj_t * win) -{ - return lv_obj_get_child(win, 1); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_win_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) -{ - LV_UNUSED(class_p); - lv_obj_t * parent = lv_obj_get_parent(obj); - lv_obj_set_size(obj, lv_obj_get_width(parent), lv_obj_get_height(parent)); - lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); - - lv_obj_t * header = lv_obj_create(obj); - lv_obj_set_size(header, LV_PCT(100), lv_display_get_dpi(lv_obj_get_display(obj)) / 2); - lv_obj_set_flex_flow(header, LV_FLEX_FLOW_ROW); - lv_obj_set_flex_align(header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - - lv_obj_t * cont = lv_obj_create(obj); - lv_obj_set_flex_grow(cont, 1); - lv_obj_set_width(cont, LV_PCT(100)); -} - -#endif diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/win/lv_win.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/win/lv_win.h deleted file mode 100644 index 8191bd1..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/win/lv_win.h +++ /dev/null @@ -1,44 +0,0 @@ -/** - * @file lv_win.h - * - */ - -#ifndef LV_WIN_H -#define LV_WIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../lv_conf_internal.h" -#include "../../core/lv_obj.h" -#if LV_USE_WIN -/********************* - * DEFINES - *********************/ - -LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_win_class; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -lv_obj_t * lv_win_create(lv_obj_t * parent); - -lv_obj_t * lv_win_add_title(lv_obj_t * win, const char * txt); -lv_obj_t * lv_win_add_button(lv_obj_t * win, const void * icon, int32_t btn_w); - -lv_obj_t * lv_win_get_header(lv_obj_t * win); -lv_obj_t * lv_win_get_content(lv_obj_t * win); -/********************** - * MACROS - **********************/ -#endif /*LV_USE_WIN*/ -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_WIN_H*/ diff --git a/software/Power_Pico/Middlewares/LVGL/src/widgets/win/lv_win_private.h b/software/Power_Pico/Middlewares/LVGL/src/widgets/win/lv_win_private.h deleted file mode 100644 index 0152247..0000000 --- a/software/Power_Pico/Middlewares/LVGL/src/widgets/win/lv_win_private.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file lv_win_private.h - * - */ - -#ifndef LV_WIN_PRIVATE_H -#define LV_WIN_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../core/lv_obj_private.h" -#include "lv_win.h" - -#if LV_USE_WIN - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * TYPEDEFS - **********************/ -struct lv_win_t { - lv_obj_t obj; -}; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#endif /* LV_USE_WIN */ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_WIN_PRIVATE_H*/ diff --git a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc/usbd_cdc.h b/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc/usbd_cdc.h deleted file mode 100644 index aeac6bf..0000000 --- a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc/usbd_cdc.h +++ /dev/null @@ -1,184 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc.h - * @author MCD Application Team - * @brief header file for the usbd_cdc.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CDC_H -#define __USB_CDC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup usbd_cdc - * @brief This file is the Header file for usbd_cdc.c - * @{ - */ - - -/** @defgroup usbd_cdc_Exported_Defines - * @{ - */ -#ifndef CDC_IN_EP -#define CDC_IN_EP 0x81U /* EP1 for data IN */ -#endif /* CDC_IN_EP */ -#ifndef CDC_OUT_EP -#define CDC_OUT_EP 0x01U /* EP1 for data OUT */ -#endif /* CDC_OUT_EP */ -#ifndef CDC_CMD_EP -#define CDC_CMD_EP 0x82U /* EP2 for CDC commands */ -#endif /* CDC_CMD_EP */ - -#ifndef CDC_HS_BINTERVAL -#define CDC_HS_BINTERVAL 0x10U -#endif /* CDC_HS_BINTERVAL */ - -#ifndef CDC_FS_BINTERVAL -#define CDC_FS_BINTERVAL 0x10U -#endif /* CDC_FS_BINTERVAL */ - -/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ -#define CDC_DATA_HS_MAX_PACKET_SIZE 512U /* Endpoint IN & OUT Packet size */ -#define CDC_DATA_FS_MAX_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */ -#define CDC_CMD_PACKET_SIZE 8U /* Control Endpoint Packet size */ - -#define USB_CDC_CONFIG_DESC_SIZ 67U -#define CDC_DATA_HS_IN_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE -#define CDC_DATA_HS_OUT_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE - -#define CDC_DATA_FS_IN_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE -#define CDC_DATA_FS_OUT_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE - -#define CDC_REQ_MAX_DATA_SIZE 0x7U -/*---------------------------------------------------------------------*/ -/* CDC definitions */ -/*---------------------------------------------------------------------*/ -#define CDC_SEND_ENCAPSULATED_COMMAND 0x00U -#define CDC_GET_ENCAPSULATED_RESPONSE 0x01U -#define CDC_SET_COMM_FEATURE 0x02U -#define CDC_GET_COMM_FEATURE 0x03U -#define CDC_CLEAR_COMM_FEATURE 0x04U -#define CDC_SET_LINE_CODING 0x20U -#define CDC_GET_LINE_CODING 0x21U -#define CDC_SET_CONTROL_LINE_STATE 0x22U -#define CDC_SEND_BREAK 0x23U - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - -/** - * @} - */ -typedef struct -{ - uint32_t bitrate; - uint8_t format; - uint8_t paritytype; - uint8_t datatype; -} USBD_CDC_LineCodingTypeDef; - -typedef struct _USBD_CDC_Itf -{ - int8_t (* Init)(void); - int8_t (* DeInit)(void); - int8_t (* Control)(uint8_t cmd, uint8_t *pbuf, uint16_t length); - int8_t (* Receive)(uint8_t *Buf, uint32_t *Len); - int8_t (* TransmitCplt)(uint8_t *Buf, uint32_t *Len, uint8_t epnum); -} USBD_CDC_ItfTypeDef; - - -typedef struct -{ - uint32_t data[CDC_DATA_HS_MAX_PACKET_SIZE / 4U]; /* Force 32-bit alignment */ - uint8_t CmdOpCode; - uint8_t CmdLength; - uint8_t *RxBuffer; - uint8_t *TxBuffer; - uint32_t RxLength; - uint32_t TxLength; - - __IO uint32_t TxState; - __IO uint32_t RxState; -} USBD_CDC_HandleTypeDef; - - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_ClassTypeDef USBD_CDC; -#define USBD_CDC_CLASS &USBD_CDC -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CDC_ItfTypeDef *fops); - -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, - uint32_t length, uint8_t ClassId); -uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t ClassId); -#else -uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, - uint32_t length); -uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev); -#endif /* USE_USBD_COMPOSITE */ -uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff); -uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_CDC_H */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c b/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c deleted file mode 100644 index ad8da25..0000000 --- a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c +++ /dev/null @@ -1,893 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc.c - * @author MCD Application Team - * @brief This file provides the high layer firmware functions to manage the - * following functionalities of the USB CDC Class: - * - Initialization and Configuration of high and low layer - * - Enumeration as CDC Device (and enumeration for each implemented memory interface) - * - OUT/IN data transfer - * - Command IN transfer (class requests management) - * - Error management - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * CDC Class Driver Description - * =================================================================== - * This driver manages the "Universal Serial Bus Class Definitions for Communications Devices - * Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus - * Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007" - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN) - * - Requests management (as described in section 6.2 in specification) - * - Abstract Control Model compliant - * - Union Functional collection (using 1 IN endpoint for control) - * - Data interface class - * - * These aspects may be enriched or modified for a specific user application. - * - * This driver doesn't implement the following aspects of the specification - * (but it is possible to manage these features with some modifications on this driver): - * - Any class-specific aspect relative to communication classes should be managed by user application. - * - All communication classes other than PSTN are not managed - * - * @endverbatim - * - ****************************************************************************** - */ - -/* BSPDependencies -- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" -- "stm32xxxxx_{eval}{discovery}_io.c" -EndBSPDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc.h" -#include "usbd_ctlreq.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_CDC - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_CDC_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_CDC_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_CDC_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CDC_Private_FunctionPrototypes - * @{ - */ - -static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev); -#ifndef USE_USBD_COMPOSITE -static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length); -static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length); -static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length); -uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ - -#ifndef USE_USBD_COMPOSITE -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CDC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; -#endif /* USE_USBD_COMPOSITE */ -/** - * @} - */ - -/** @defgroup USBD_CDC_Private_Variables - * @{ - */ - - -/* CDC interface class callbacks structure */ -USBD_ClassTypeDef USBD_CDC = -{ - USBD_CDC_Init, - USBD_CDC_DeInit, - USBD_CDC_Setup, - NULL, /* EP0_TxSent */ - USBD_CDC_EP0_RxReady, - USBD_CDC_DataIn, - USBD_CDC_DataOut, - NULL, - NULL, - NULL, -#ifdef USE_USBD_COMPOSITE - NULL, - NULL, - NULL, - NULL, -#else - USBD_CDC_GetHSCfgDesc, - USBD_CDC_GetFSCfgDesc, - USBD_CDC_GetOtherSpeedCfgDesc, - USBD_CDC_GetDeviceQualifierDescriptor, -#endif /* USE_USBD_COMPOSITE */ -}; - -#ifndef USE_USBD_COMPOSITE -/* USB CDC device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CDC_CfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = -{ - /* Configuration Descriptor */ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength */ - 0x00, - 0x02, /* bNumInterfaces: 2 interfaces */ - 0x01, /* bConfigurationValue: Configuration value */ - 0x00, /* iConfiguration: Index of string descriptor - describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower (mA) */ - - /*---------------------------------------------------------------------------*/ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoint used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - 0x01, /* bDataInterface */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - 0x00, /* bMasterInterface: Communication class interface */ - 0x01, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - 0x01, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass */ - 0x00, /* bInterfaceProtocol */ - 0x00, /* iInterface */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00 /* bInterval */ -}; -#endif /* USE_USBD_COMPOSITE */ - -static uint8_t CDCInEpAdd = CDC_IN_EP; -static uint8_t CDCOutEpAdd = CDC_OUT_EP; -static uint8_t CDCCmdEpAdd = CDC_CMD_EP; - -/** - * @} - */ - -/** @defgroup USBD_CDC_Private_Functions - * @{ - */ - -/** - * @brief USBD_CDC_Init - * Initialize the CDC interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - USBD_CDC_HandleTypeDef *hcdc; - - hcdc = (USBD_CDC_HandleTypeDef *)USBD_malloc(sizeof(USBD_CDC_HandleTypeDef)); - - if (hcdc == NULL) - { - pdev->pClassDataCmsit[pdev->classId] = NULL; - return (uint8_t)USBD_EMEM; - } - - (void)USBD_memset(hcdc, 0, sizeof(USBD_CDC_HandleTypeDef)); - - pdev->pClassDataCmsit[pdev->classId] = (void *)hcdc; - pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - CDCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - CDCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - CDCCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, CDCInEpAdd, USBD_EP_TYPE_BULK, - CDC_DATA_HS_IN_PACKET_SIZE); - - pdev->ep_in[CDCInEpAdd & 0xFU].is_used = 1U; - - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, CDCOutEpAdd, USBD_EP_TYPE_BULK, - CDC_DATA_HS_OUT_PACKET_SIZE); - - pdev->ep_out[CDCOutEpAdd & 0xFU].is_used = 1U; - - /* Set bInterval for CDC CMD Endpoint */ - pdev->ep_in[CDCCmdEpAdd & 0xFU].bInterval = CDC_HS_BINTERVAL; - } - else - { - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, CDCInEpAdd, USBD_EP_TYPE_BULK, - CDC_DATA_FS_IN_PACKET_SIZE); - - pdev->ep_in[CDCInEpAdd & 0xFU].is_used = 1U; - - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, CDCOutEpAdd, USBD_EP_TYPE_BULK, - CDC_DATA_FS_OUT_PACKET_SIZE); - - pdev->ep_out[CDCOutEpAdd & 0xFU].is_used = 1U; - - /* Set bInterval for CMD Endpoint */ - pdev->ep_in[CDCCmdEpAdd & 0xFU].bInterval = CDC_FS_BINTERVAL; - } - - /* Open Command IN EP */ - (void)USBD_LL_OpenEP(pdev, CDCCmdEpAdd, USBD_EP_TYPE_INTR, CDC_CMD_PACKET_SIZE); - pdev->ep_in[CDCCmdEpAdd & 0xFU].is_used = 1U; - - hcdc->RxBuffer = NULL; - - /* Init physical Interface components */ - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Init(); - - /* Init Xfer states */ - hcdc->TxState = 0U; - hcdc->RxState = 0U; - - if (hcdc->RxBuffer == NULL) - { - return (uint8_t)USBD_EMEM; - } - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer, - CDC_DATA_HS_OUT_PACKET_SIZE); - } - else - { - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer, - CDC_DATA_FS_OUT_PACKET_SIZE); - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_Init - * DeInitialize the CDC layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this CDC class instance */ - CDCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - CDCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - CDCCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Close EP IN */ - (void)USBD_LL_CloseEP(pdev, CDCInEpAdd); - pdev->ep_in[CDCInEpAdd & 0xFU].is_used = 0U; - - /* Close EP OUT */ - (void)USBD_LL_CloseEP(pdev, CDCOutEpAdd); - pdev->ep_out[CDCOutEpAdd & 0xFU].is_used = 0U; - - /* Close Command IN EP */ - (void)USBD_LL_CloseEP(pdev, CDCCmdEpAdd); - pdev->ep_in[CDCCmdEpAdd & 0xFU].is_used = 0U; - pdev->ep_in[CDCCmdEpAdd & 0xFU].bInterval = 0U; - - /* DeInit physical Interface components */ - if (pdev->pClassDataCmsit[pdev->classId] != NULL) - { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->DeInit(); - (void)USBD_free(pdev->pClassDataCmsit[pdev->classId]); - pdev->pClassDataCmsit[pdev->classId] = NULL; - pdev->pClassData = NULL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_Setup - * Handle the CDC specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t len; - uint8_t ifalt = 0U; - uint16_t status_info = 0U; - USBD_StatusTypeDef ret = USBD_OK; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - if (req->wLength != 0U) - { - if ((req->bmRequest & 0x80U) != 0U) - { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(req->bRequest, - (uint8_t *)hcdc->data, - req->wLength); - - len = MIN(CDC_REQ_MAX_DATA_SIZE, req->wLength); - (void)USBD_CtlSendData(pdev, (uint8_t *)hcdc->data, len); - } - else - { - hcdc->CmdOpCode = req->bRequest; - hcdc->CmdLength = (uint8_t)MIN(req->wLength, USB_MAX_EP0_SIZE); - - (void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, hcdc->CmdLength); - } - } - else - { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(req->bRequest, - (uint8_t *)req, 0U); - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, &ifalt, 1U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_SET_INTERFACE: - if (pdev->dev_state != USBD_STATE_CONFIGURED) - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_CLEAR_FEATURE: - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - - return (uint8_t)ret; -} - -/** - * @brief USBD_CDC_DataIn - * Data sent on non-control IN endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_CDC_HandleTypeDef *hcdc; - PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef *)pdev->pData; - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if ((pdev->ep_in[epnum & 0xFU].total_length > 0U) && - ((pdev->ep_in[epnum & 0xFU].total_length % hpcd->IN_ep[epnum & 0xFU].maxpacket) == 0U)) - { - /* Update the packet total length */ - pdev->ep_in[epnum & 0xFU].total_length = 0U; - - /* Send ZLP */ - (void)USBD_LL_Transmit(pdev, epnum, NULL, 0U); - } - else - { - hcdc->TxState = 0U; - - if (((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->TransmitCplt != NULL) - { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->TransmitCplt(hcdc->TxBuffer, &hcdc->TxLength, epnum); - } - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_DataOut - * Data received on non-control Out endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - /* Get the received data length */ - hcdc->RxLength = USBD_LL_GetRxDataSize(pdev, epnum); - - /* USB data will be immediately processed, this allow next USB traffic being - NAKed till the end of the application Xfer */ - - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Receive(hcdc->RxBuffer, &hcdc->RxLength); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_EP0_RxReady - * Handle EP0 Rx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if ((pdev->pUserData[pdev->classId] != NULL) && (hcdc->CmdOpCode != 0xFFU)) - { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(hcdc->CmdOpCode, - (uint8_t *)hcdc->data, - (uint16_t)hcdc->CmdLength); - hcdc->CmdOpCode = 0xFFU; - } - - return (uint8_t)USBD_OK; -} -#ifndef USE_USBD_COMPOSITE -/** - * @brief USBD_CDC_GetFSCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_CMD_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_OUT_EP); - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_IN_EP); - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CDC_FS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE; - } - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE; - } - - *length = (uint16_t)sizeof(USBD_CDC_CfgDesc); - return USBD_CDC_CfgDesc; -} - -/** - * @brief USBD_CDC_GetHSCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_CMD_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_OUT_EP); - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_IN_EP); - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CDC_HS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CDC_DATA_HS_MAX_PACKET_SIZE; - } - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CDC_DATA_HS_MAX_PACKET_SIZE; - } - - *length = (uint16_t)sizeof(USBD_CDC_CfgDesc); - return USBD_CDC_CfgDesc; -} - -/** - * @brief USBD_CDC_GetOtherSpeedCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_CMD_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_OUT_EP); - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_IN_EP); - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CDC_FS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE; - } - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE; - } - - *length = (uint16_t)sizeof(USBD_CDC_CfgDesc); - return USBD_CDC_CfgDesc; -} - -/** - * @brief USBD_CDC_GetDeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_CDC_DeviceQualifierDesc); - - return USBD_CDC_DeviceQualifierDesc; -} -#endif /* USE_USBD_COMPOSITE */ -/** - * @brief USBD_CDC_RegisterInterface - * @param pdev: device instance - * @param fops: CD Interface callback - * @retval status - */ -uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CDC_ItfTypeDef *fops) -{ - if (fops == NULL) - { - return (uint8_t)USBD_FAIL; - } - - pdev->pUserData[pdev->classId] = fops; - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_SetTxBuffer - * @param pdev: device instance - * @param pbuff: Tx Buffer - * @param length: length of data to be sent - * @param ClassId: The Class ID - * @retval status - */ -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, - uint8_t *pbuff, uint32_t length, uint8_t ClassId) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[ClassId]; -#else -uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, - uint8_t *pbuff, uint32_t length) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#endif /* USE_USBD_COMPOSITE */ - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hcdc->TxBuffer = pbuff; - hcdc->TxLength = length; - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_SetRxBuffer - * @param pdev: device instance - * @param pbuff: Rx Buffer - * @retval status - */ -uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hcdc->RxBuffer = pbuff; - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_TransmitPacket - * Transmit packet on IN endpoint - * @param pdev: device instance - * @param ClassId: The Class ID - * @retval status - */ -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t ClassId) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[ClassId]; -#else -uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#endif /* USE_USBD_COMPOSITE */ - - USBD_StatusTypeDef ret = USBD_BUSY; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - CDCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, ClassId); -#endif /* USE_USBD_COMPOSITE */ - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if (hcdc->TxState == 0U) - { - /* Tx Transfer in progress */ - hcdc->TxState = 1U; - - /* Update the packet total length */ - pdev->ep_in[CDCInEpAdd & 0xFU].total_length = hcdc->TxLength; - - /* Transmit next packet */ - (void)USBD_LL_Transmit(pdev, CDCInEpAdd, hcdc->TxBuffer, hcdc->TxLength); - - ret = USBD_OK; - } - - return (uint8_t)ret; -} - -/** - * @brief USBD_CDC_ReceivePacket - * prepare OUT Endpoint for reception - * @param pdev: device instance - * @retval status - */ -uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - CDCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer, - CDC_DATA_HS_OUT_PACKET_SIZE); - } - else - { - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer, - CDC_DATA_FS_OUT_PACKET_SIZE); - } - - return (uint8_t)USBD_OK; -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h b/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h deleted file mode 100644 index 4672921..0000000 --- a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h +++ /dev/null @@ -1,175 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_core.h - * @author MCD Application Team - * @brief Header file for usbd_core.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CORE_H -#define __USBD_CORE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" -#include "usbd_def.h" -#include "usbd_ioreq.h" -#include "usbd_ctlreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_CORE - * @brief This file is the Header file for usbd_core.c file - * @{ - */ - - -/** @defgroup USBD_CORE_Exported_Defines - * @{ - */ -#ifndef USBD_DEBUG_LEVEL -#define USBD_DEBUG_LEVEL 0U -#endif /* USBD_DEBUG_LEVEL */ -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ -#define USBD_SOF USBD_LL_SOF -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_FunctionsPrototype - * @{ - */ -USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id); -USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass); -#if (USBD_USER_REGISTER_CALLBACK == 1U) -USBD_StatusTypeDef USBD_RegisterDevStateCallback(USBD_HandleTypeDef *pdev, USBD_DevStateCallbackTypeDef pUserCallback); -#endif /* USBD_USER_REGISTER_CALLBACK */ - -#ifdef USE_USBD_COMPOSITE -USBD_StatusTypeDef USBD_RegisterClassComposite(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass, - USBD_CompositeClassTypeDef classtype, uint8_t *EpAddr); - -USBD_StatusTypeDef USBD_UnRegisterClassComposite(USBD_HandleTypeDef *pdev); -uint8_t USBD_CoreGetEPAdd(USBD_HandleTypeDef *pdev, uint8_t ep_dir, uint8_t ep_type, uint8_t ClassId); -#endif /* USE_USBD_COMPOSITE */ - -uint8_t USBD_CoreFindIF(USBD_HandleTypeDef *pdev, uint8_t index); -uint8_t USBD_CoreFindEP(USBD_HandleTypeDef *pdev, uint8_t index); - -USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); - -USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup); -USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); - -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); - -USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); - -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); - -/* USBD Low Level Driver */ -USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev); - -USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, - uint8_t ep_type, uint16_t ep_mps); - -USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr); - -USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, - uint8_t *pbuf, uint32_t size); - -USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, - uint8_t *pbuf, uint32_t size); - -#ifdef USBD_HS_TESTMODE_ENABLE -USBD_StatusTypeDef USBD_LL_SetTestMode(USBD_HandleTypeDef *pdev, uint8_t testmode); -#endif /* USBD_HS_TESTMODE_ENABLE */ - -uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); -uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr); - -void USBD_LL_Delay(uint32_t Delay); - -void *USBD_GetEpDesc(uint8_t *pConfDesc, uint8_t EpAddr); -USBD_DescHeaderTypeDef *USBD_GetNextDesc(uint8_t *pbuf, uint16_t *ptr); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CORE_H */ - -/** - * @} - */ - -/** - * @} - */ - - diff --git a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h b/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h deleted file mode 100644 index 6c45d6c..0000000 --- a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_req.h - * @author MCD Application Team - * @brief Header file for the usbd_req.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_REQUEST_H -#define __USB_REQUEST_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_REQ - * @brief header file for the usbd_req.c file - * @{ - */ - -/** @defgroup USBD_REQ_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_REQ_Exported_Types - * @{ - */ -/** - * @} - */ - - - -/** @defgroup USBD_REQ_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_REQ_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_REQ_Exported_FunctionsPrototype - * @{ - */ - -USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - -void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata); -void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_REQUEST_H */ - -/** - * @} - */ - -/** - * @} - */ - - diff --git a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h b/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h deleted file mode 100644 index 2a295d7..0000000 --- a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h +++ /dev/null @@ -1,523 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_def.h - * @author MCD Application Team - * @brief General defines for the usb device library - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_DEF_H -#define __USBD_DEF_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" - -/** @addtogroup STM32_USBD_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USB_DEF - * @brief general defines for the usb device library file - * @{ - */ - -/** @defgroup USB_DEF_Exported_Defines - * @{ - */ - -#ifndef NULL -#define NULL 0U -#endif /* NULL */ - -#ifndef USBD_MAX_NUM_INTERFACES -#define USBD_MAX_NUM_INTERFACES 1U -#endif /* USBD_MAX_NUM_CONFIGURATION */ - -#ifndef USBD_MAX_NUM_CONFIGURATION -#define USBD_MAX_NUM_CONFIGURATION 1U -#endif /* USBD_MAX_NUM_CONFIGURATION */ - -#ifdef USE_USBD_COMPOSITE -#ifndef USBD_MAX_SUPPORTED_CLASS -#define USBD_MAX_SUPPORTED_CLASS 4U -#endif /* USBD_MAX_SUPPORTED_CLASS */ -#else -#ifndef USBD_MAX_SUPPORTED_CLASS -#define USBD_MAX_SUPPORTED_CLASS 1U -#endif /* USBD_MAX_SUPPORTED_CLASS */ -#endif /* USE_USBD_COMPOSITE */ - -#ifndef USBD_MAX_CLASS_ENDPOINTS -#define USBD_MAX_CLASS_ENDPOINTS 5U -#endif /* USBD_MAX_CLASS_ENDPOINTS */ - -#ifndef USBD_MAX_CLASS_INTERFACES -#define USBD_MAX_CLASS_INTERFACES 5U -#endif /* USBD_MAX_CLASS_INTERFACES */ - -#ifndef USBD_LPM_ENABLED -#define USBD_LPM_ENABLED 0U -#endif /* USBD_LPM_ENABLED */ - -#ifndef USBD_SELF_POWERED -#define USBD_SELF_POWERED 1U -#endif /*USBD_SELF_POWERED */ - -#ifndef USBD_MAX_POWER -#define USBD_MAX_POWER 0x32U /* 100 mA */ -#endif /* USBD_MAX_POWER */ - -#ifndef USBD_SUPPORT_USER_STRING_DESC -#define USBD_SUPPORT_USER_STRING_DESC 0U -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - -#ifndef USBD_CLASS_USER_STRING_DESC -#define USBD_CLASS_USER_STRING_DESC 0U -#endif /* USBD_CLASS_USER_STRING_DESC */ - -#define USB_LEN_DEV_QUALIFIER_DESC 0x0AU -#define USB_LEN_DEV_DESC 0x12U -#define USB_LEN_CFG_DESC 0x09U -#define USB_LEN_IF_DESC 0x09U -#define USB_LEN_EP_DESC 0x07U -#define USB_LEN_OTG_DESC 0x03U -#define USB_LEN_LANGID_STR_DESC 0x04U -#define USB_LEN_OTHER_SPEED_DESC_SIZ 0x09U - -#define USBD_IDX_LANGID_STR 0x00U -#define USBD_IDX_MFC_STR 0x01U -#define USBD_IDX_PRODUCT_STR 0x02U -#define USBD_IDX_SERIAL_STR 0x03U -#define USBD_IDX_CONFIG_STR 0x04U -#define USBD_IDX_INTERFACE_STR 0x05U - -#define USB_REQ_TYPE_STANDARD 0x00U -#define USB_REQ_TYPE_CLASS 0x20U -#define USB_REQ_TYPE_VENDOR 0x40U -#define USB_REQ_TYPE_MASK 0x60U - -#define USB_REQ_RECIPIENT_DEVICE 0x00U -#define USB_REQ_RECIPIENT_INTERFACE 0x01U -#define USB_REQ_RECIPIENT_ENDPOINT 0x02U -#define USB_REQ_RECIPIENT_MASK 0x03U - -#define USB_REQ_GET_STATUS 0x00U -#define USB_REQ_CLEAR_FEATURE 0x01U -#define USB_REQ_SET_FEATURE 0x03U -#define USB_REQ_SET_ADDRESS 0x05U -#define USB_REQ_GET_DESCRIPTOR 0x06U -#define USB_REQ_SET_DESCRIPTOR 0x07U -#define USB_REQ_GET_CONFIGURATION 0x08U -#define USB_REQ_SET_CONFIGURATION 0x09U -#define USB_REQ_GET_INTERFACE 0x0AU -#define USB_REQ_SET_INTERFACE 0x0BU -#define USB_REQ_SYNCH_FRAME 0x0CU - -#define USB_DESC_TYPE_DEVICE 0x01U -#define USB_DESC_TYPE_CONFIGURATION 0x02U -#define USB_DESC_TYPE_STRING 0x03U -#define USB_DESC_TYPE_INTERFACE 0x04U -#define USB_DESC_TYPE_ENDPOINT 0x05U -#define USB_DESC_TYPE_DEVICE_QUALIFIER 0x06U -#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 0x07U -#define USB_DESC_TYPE_IAD 0x0BU -#define USB_DESC_TYPE_BOS 0x0FU - -#define USB_CONFIG_REMOTE_WAKEUP 0x02U -#define USB_CONFIG_SELF_POWERED 0x01U - -#define USB_FEATURE_EP_HALT 0x00U -#define USB_FEATURE_REMOTE_WAKEUP 0x01U -#define USB_FEATURE_TEST_MODE 0x02U - -#define USB_DEVICE_CAPABITY_TYPE 0x10U - -#define USB_CONF_DESC_SIZE 0x09U -#define USB_IF_DESC_SIZE 0x09U -#define USB_EP_DESC_SIZE 0x07U -#define USB_IAD_DESC_SIZE 0x08U - -#define USB_HS_MAX_PACKET_SIZE 512U -#define USB_FS_MAX_PACKET_SIZE 64U -#define USB_MAX_EP0_SIZE 64U - -/* Device Status */ -#define USBD_STATE_DEFAULT 0x01U -#define USBD_STATE_ADDRESSED 0x02U -#define USBD_STATE_CONFIGURED 0x03U -#define USBD_STATE_SUSPENDED 0x04U - - -/* EP0 State */ -#define USBD_EP0_IDLE 0x00U -#define USBD_EP0_SETUP 0x01U -#define USBD_EP0_DATA_IN 0x02U -#define USBD_EP0_DATA_OUT 0x03U -#define USBD_EP0_STATUS_IN 0x04U -#define USBD_EP0_STATUS_OUT 0x05U -#define USBD_EP0_STALL 0x06U - -#define USBD_EP_TYPE_CTRL 0x00U -#define USBD_EP_TYPE_ISOC 0x01U -#define USBD_EP_TYPE_BULK 0x02U -#define USBD_EP_TYPE_INTR 0x03U - -#ifdef USE_USBD_COMPOSITE -#define USBD_EP_IN 0x80U -#define USBD_EP_OUT 0x00U -#define USBD_FUNC_DESCRIPTOR_TYPE 0x24U -#define USBD_DESC_SUBTYPE_ACM 0x0FU -#define USBD_DESC_ECM_BCD_LOW 0x00U -#define USBD_DESC_ECM_BCD_HIGH 0x10U -#endif /* USE_USBD_COMPOSITE */ -/** - * @} - */ - - -/** @defgroup USBD_DEF_Exported_TypesDefinitions - * @{ - */ - -typedef struct usb_setup_req -{ - uint8_t bmRequest; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; -} USBD_SetupReqTypedef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t wTotalLength; - uint8_t bNumInterfaces; - uint8_t bConfigurationValue; - uint8_t iConfiguration; - uint8_t bmAttributes; - uint8_t bMaxPower; -} __PACKED USBD_ConfigDescTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t wTotalLength; - uint8_t bNumDeviceCaps; -} USBD_BosDescTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bEndpointAddress; - uint8_t bmAttributes; - uint16_t wMaxPacketSize; - uint8_t bInterval; -} __PACKED USBD_EpDescTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubType; -} USBD_DescHeaderTypeDef; - -struct _USBD_HandleTypeDef; - -typedef struct _Device_cb -{ - uint8_t (*Init)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); - uint8_t (*DeInit)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); - /* Control Endpoints*/ - uint8_t (*Setup)(struct _USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - uint8_t (*EP0_TxSent)(struct _USBD_HandleTypeDef *pdev); - uint8_t (*EP0_RxReady)(struct _USBD_HandleTypeDef *pdev); - /* Class Specific Endpoints*/ - uint8_t (*DataIn)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); - uint8_t (*DataOut)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); - uint8_t (*SOF)(struct _USBD_HandleTypeDef *pdev); - uint8_t (*IsoINIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); - uint8_t (*IsoOUTIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); - - uint8_t *(*GetHSConfigDescriptor)(uint16_t *length); - uint8_t *(*GetFSConfigDescriptor)(uint16_t *length); - uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length); - uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length); -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) - uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length); -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - -} USBD_ClassTypeDef; - -/* Following USB Device Speed */ -typedef enum -{ - USBD_SPEED_HIGH = 0U, - USBD_SPEED_FULL = 1U, - USBD_SPEED_LOW = 2U, -} USBD_SpeedTypeDef; - -/* Following USB Device status */ -typedef enum -{ - USBD_OK = 0U, - USBD_BUSY, - USBD_EMEM, - USBD_FAIL, -} USBD_StatusTypeDef; - -/* USB Device descriptors structure */ -typedef struct -{ - uint8_t *(*GetDeviceDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t *(*GetLangIDStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t *(*GetManufacturerStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t *(*GetProductStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t *(*GetSerialStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t *(*GetConfigurationStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t *(*GetInterfaceStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); -#if (USBD_CLASS_USER_STRING_DESC == 1) - uint8_t *(*GetUserStrDescriptor)(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); -#endif /* USBD_CLASS_USER_STRING_DESC */ -#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1)) - uint8_t *(*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); -#endif /* (USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1) */ -} USBD_DescriptorsTypeDef; - -/* USB Device handle structure */ -typedef struct -{ - uint32_t status; - uint32_t total_length; - uint32_t rem_length; - uint32_t maxpacket; - uint16_t is_used; - uint16_t bInterval; -} USBD_EndpointTypeDef; - -#ifdef USE_USBD_COMPOSITE -typedef enum -{ - CLASS_TYPE_NONE = 0, - CLASS_TYPE_HID = 1, - CLASS_TYPE_CDC = 2, - CLASS_TYPE_MSC = 3, - CLASS_TYPE_DFU = 4, - CLASS_TYPE_CHID = 5, - CLASS_TYPE_AUDIO = 6, - CLASS_TYPE_ECM = 7, - CLASS_TYPE_RNDIS = 8, - CLASS_TYPE_MTP = 9, - CLASS_TYPE_VIDEO = 10, - CLASS_TYPE_PRINTER = 11, - CLASS_TYPE_CCID = 12, -} USBD_CompositeClassTypeDef; - - -/* USB Device handle structure */ -typedef struct -{ - uint8_t add; - uint8_t type; - uint8_t size; - uint8_t is_used; -} USBD_EPTypeDef; - -/* USB Device handle structure */ -typedef struct -{ - USBD_CompositeClassTypeDef ClassType; - uint32_t ClassId; - uint32_t Active; - uint32_t NumEps; - USBD_EPTypeDef Eps[USBD_MAX_CLASS_ENDPOINTS]; - uint8_t *EpAdd; - uint32_t NumIf; - uint8_t Ifs[USBD_MAX_CLASS_INTERFACES]; - uint32_t CurrPcktSze; -} USBD_CompositeElementTypeDef; -#endif /* USE_USBD_COMPOSITE */ - -/* USB Device handle structure */ -typedef struct _USBD_HandleTypeDef -{ - uint8_t id; - uint32_t dev_config; - uint32_t dev_default_config; - uint32_t dev_config_status; - USBD_SpeedTypeDef dev_speed; - USBD_EndpointTypeDef ep_in[16]; - USBD_EndpointTypeDef ep_out[16]; - __IO uint32_t ep0_state; - uint32_t ep0_data_len; - __IO uint8_t dev_state; - __IO uint8_t dev_old_state; - uint8_t dev_address; - uint8_t dev_connection_status; - uint8_t dev_test_mode; - uint32_t dev_remote_wakeup; - uint8_t ConfIdx; - - USBD_SetupReqTypedef request; - USBD_DescriptorsTypeDef *pDesc; - USBD_ClassTypeDef *pClass[USBD_MAX_SUPPORTED_CLASS]; - void *pClassData; - void *pClassDataCmsit[USBD_MAX_SUPPORTED_CLASS]; - void *pUserData[USBD_MAX_SUPPORTED_CLASS]; - void *pData; - void *pBosDesc; - void *pConfDesc; - uint32_t classId; - uint32_t NumClasses; -#ifdef USE_USBD_COMPOSITE - USBD_CompositeElementTypeDef tclasslist[USBD_MAX_SUPPORTED_CLASS]; -#endif /* USE_USBD_COMPOSITE */ -#if (USBD_USER_REGISTER_CALLBACK == 1U) - void (* DevStateCallback)(uint8_t dev_state, uint8_t cfgidx); /*!< User Notification callback */ -#endif /* USBD_USER_REGISTER_CALLBACK */ -} USBD_HandleTypeDef; - -#if (USBD_USER_REGISTER_CALLBACK == 1U) -typedef void (*USBD_DevStateCallbackTypeDef)(uint8_t dev_state, uint8_t cfgidx); /*!< pointer to User callback function */ -#endif /* USBD_USER_REGISTER_CALLBACK */ - -/* USB Device endpoint direction */ -typedef enum -{ - OUT = 0x00, - IN = 0x80, -} USBD_EPDirectionTypeDef; - -typedef enum -{ - NETWORK_CONNECTION = 0x00, - RESPONSE_AVAILABLE = 0x01, - CONNECTION_SPEED_CHANGE = 0x2A -} USBD_CDC_NotifCodeTypeDef; -/** - * @} - */ - - - -/** @defgroup USBD_DEF_Exported_Macros - * @{ - */ -__STATIC_INLINE uint16_t SWAPBYTE(uint8_t *addr) -{ - uint16_t _SwapVal; - uint16_t _Byte1; - uint16_t _Byte2; - uint8_t *_pbuff = addr; - - _Byte1 = *(uint8_t *)_pbuff; - _pbuff++; - _Byte2 = *(uint8_t *)_pbuff; - - _SwapVal = (_Byte2 << 8) | _Byte1; - - return _SwapVal; -} - -#ifndef LOBYTE -#define LOBYTE(x) ((uint8_t)((x) & 0x00FFU)) -#endif /* LOBYTE */ - -#ifndef HIBYTE -#define HIBYTE(x) ((uint8_t)(((x) & 0xFF00U) >> 8U)) -#endif /* HIBYTE */ - -#ifndef MIN -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#endif /* MIN */ - -#ifndef MAX -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#endif /* MAX */ - -#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__ ) && !defined (__CC_ARM) /* GNU Compiler */ -#ifndef __ALIGN_END -#define __ALIGN_END __attribute__ ((aligned (4U))) -#endif /* __ALIGN_END */ -#ifndef __ALIGN_BEGIN -#define __ALIGN_BEGIN -#endif /* __ALIGN_BEGIN */ -#else -#ifndef __ALIGN_END -#define __ALIGN_END -#endif /* __ALIGN_END */ -#ifndef __ALIGN_BEGIN -#if defined (__CC_ARM) /* ARM Compiler */ -#define __ALIGN_BEGIN __align(4U) -#elif defined (__ICCARM__) /* IAR Compiler */ -#define __ALIGN_BEGIN -#endif /* __CC_ARM */ -#endif /* __ALIGN_BEGIN */ -#endif /* __GNUC__ */ - - -/** - * @} - */ - -/** @defgroup USBD_DEF_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_DEF_Exported_FunctionsPrototype - * @{ - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_DEF_H */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h b/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h deleted file mode 100644 index 15197b9..0000000 --- a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ioreq.h - * @author MCD Application Team - * @brief Header file for the usbd_ioreq.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_IOREQ_H -#define __USBD_IOREQ_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" -#include "usbd_core.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_IOREQ - * @brief header file for the usbd_ioreq.c file - * @{ - */ - -/** @defgroup USBD_IOREQ_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Exported_Types - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup USBD_IOREQ_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_IOREQ_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_IOREQ_Exported_FunctionsPrototype - * @{ - */ - -USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len); - -USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len); - -USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len); - -USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len); - -USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev); - -uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_IOREQ_H */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c b/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c deleted file mode 100644 index 0576c87..0000000 --- a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c +++ /dev/null @@ -1,1215 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_core.c - * @author MCD Application Team - * @brief This file provides all the USBD core functions. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" - -#ifdef USE_USBD_COMPOSITE -#include "usbd_composite_builder.h" -#endif /* USE_USBD_COMPOSITE */ - -/** @addtogroup STM32_USBD_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_CORE - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_CORE_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Private_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Private_Functions - * @{ - */ - -/** - * @brief USBD_Init - * Initialize the device stack and load the class driver - * @param pdev: device instance - * @param pdesc: Descriptor structure address - * @param id: Low level core index - * @retval status: USBD Status - */ -USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, - USBD_DescriptorsTypeDef *pdesc, uint8_t id) -{ - USBD_StatusTypeDef ret; - - /* Check whether the USB Host handle is valid */ - if (pdev == NULL) - { -#if (USBD_DEBUG_LEVEL > 1U) - USBD_ErrLog("Invalid Device handle"); -#endif /* (USBD_DEBUG_LEVEL > 1U) */ - return USBD_FAIL; - } - -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Unlink previous class*/ - pdev->pClass[i] = NULL; - pdev->pUserData[i] = NULL; - - /* Set class as inactive */ - pdev->tclasslist[i].Active = 0; - pdev->NumClasses = 0; - pdev->classId = 0; - } -#else - /* Unlink previous class*/ - pdev->pClass[0] = NULL; - pdev->pUserData[0] = NULL; -#endif /* USE_USBD_COMPOSITE */ - - pdev->pConfDesc = NULL; - - /* Assign USBD Descriptors */ - if (pdesc != NULL) - { - pdev->pDesc = pdesc; - } - - /* Set Device initial State */ - pdev->dev_state = USBD_STATE_DEFAULT; - pdev->id = id; - - /* Initialize low level driver */ - ret = USBD_LL_Init(pdev); - - return ret; -} - -/** - * @brief USBD_DeInit - * De-Initialize the device library - * @param pdev: device instance - * @retval status: USBD Status - */ -USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) -{ - USBD_StatusTypeDef ret; - - /* Disconnect the USB Device */ - (void)USBD_LL_Stop(pdev); - - /* Set Default State */ - pdev->dev_state = USBD_STATE_DEFAULT; - -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - pdev->classId = i; - /* Free Class Resources */ - pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config); - } - } - } -#else - /* Free Class Resources */ - if (pdev->pClass[0] != NULL) - { - pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config); - } - - pdev->pUserData[0] = NULL; - -#endif /* USE_USBD_COMPOSITE */ - - /* Free Device descriptors resources */ - pdev->pDesc = NULL; - pdev->pConfDesc = NULL; - - /* DeInitialize low level driver */ - ret = USBD_LL_DeInit(pdev); - - return ret; -} - -/** - * @brief USBD_RegisterClass - * Link class driver to Device Core. - * @param pdev: Device Handle - * @param pclass: Class handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) -{ - uint16_t len = 0U; - - if (pclass == NULL) - { -#if (USBD_DEBUG_LEVEL > 1U) - USBD_ErrLog("Invalid Class handle"); -#endif /* (USBD_DEBUG_LEVEL > 1U) */ - return USBD_FAIL; - } - - /* link the class to the USB Device handle */ - pdev->pClass[0] = pclass; - - /* Get Device Configuration Descriptor */ -#ifdef USE_USB_HS - if (pdev->pClass[pdev->classId]->GetHSConfigDescriptor != NULL) - { - pdev->pConfDesc = (void *)pdev->pClass[pdev->classId]->GetHSConfigDescriptor(&len); - } -#else /* Default USE_USB_FS */ - if (pdev->pClass[pdev->classId]->GetFSConfigDescriptor != NULL) - { - pdev->pConfDesc = (void *)pdev->pClass[pdev->classId]->GetFSConfigDescriptor(&len); - } -#endif /* USE_USB_FS */ - - /* Increment the NumClasses */ - pdev->NumClasses++; - - return USBD_OK; -} - -#ifdef USE_USBD_COMPOSITE -/** - * @brief USBD_RegisterClassComposite - * Link class driver to Device Core. - * @param pdev : Device Handle - * @param pclass: Class handle - * @param classtype: Class type - * @param EpAddr: Endpoint Address handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_RegisterClassComposite(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass, - USBD_CompositeClassTypeDef classtype, uint8_t *EpAddr) -{ - USBD_StatusTypeDef ret = USBD_OK; - uint16_t len = 0U; - - if ((pdev->classId < USBD_MAX_SUPPORTED_CLASS) && (pdev->NumClasses < USBD_MAX_SUPPORTED_CLASS)) - { - if ((uint32_t)pclass != 0U) - { - /* Link the class to the USB Device handle */ - pdev->pClass[pdev->classId] = pclass; - ret = USBD_OK; - - pdev->tclasslist[pdev->classId].EpAdd = EpAddr; - - /* Call the composite class builder */ - (void)USBD_CMPSIT_AddClass(pdev, pclass, classtype, 0); - - /* Increment the ClassId for the next occurrence */ - pdev->classId ++; - pdev->NumClasses ++; - } - else - { -#if (USBD_DEBUG_LEVEL > 1U) - USBD_ErrLog("Invalid Class handle"); -#endif /* (USBD_DEBUG_LEVEL > 1U) */ - ret = USBD_FAIL; - } - } - - if (ret == USBD_OK) - { - /* Get Device Configuration Descriptor */ -#ifdef USE_USB_HS - pdev->pConfDesc = USBD_CMPSIT.GetHSConfigDescriptor(&len); -#else /* Default USE_USB_FS */ - pdev->pConfDesc = USBD_CMPSIT.GetFSConfigDescriptor(&len); -#endif /* USE_USB_FS */ - } - - return ret; -} - -/** - * @brief USBD_UnRegisterClassComposite - * UnLink all composite class drivers from Device Core. - * @param pdev: Device Handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_UnRegisterClassComposite(USBD_HandleTypeDef *pdev) -{ - USBD_StatusTypeDef ret = USBD_FAIL; - uint8_t idx1; - uint8_t idx2; - - /* Unroll all activated classes */ - for (idx1 = 0; idx1 < pdev->NumClasses; idx1++) - { - /* Check if the class correspond to the requested type and if it is active */ - if (pdev->tclasslist[idx1].Active == 1U) - { - /* Set the new class ID */ - pdev->classId = idx1; - - /* Free resources used by the selected class */ - if (pdev->pClass[pdev->classId] != NULL) - { - /* Free Class Resources */ - if (pdev->pClass[pdev->classId]->DeInit(pdev, (uint8_t)pdev->dev_config) != 0U) - { -#if (USBD_DEBUG_LEVEL > 1U) - USBD_ErrLog("Class DeInit didn't succeed!, can't unregister selected class"); -#endif /* (USBD_DEBUG_LEVEL > 1U) */ - - ret = USBD_FAIL; - } - } - - /* Free the class pointer */ - pdev->pClass[pdev->classId] = NULL; - - /* Free the class location in classes table and reset its parameters to zero */ - pdev->tclasslist[pdev->classId].ClassType = CLASS_TYPE_NONE; - pdev->tclasslist[pdev->classId].ClassId = 0U; - pdev->tclasslist[pdev->classId].Active = 0U; - pdev->tclasslist[pdev->classId].NumEps = 0U; - pdev->tclasslist[pdev->classId].NumIf = 0U; - pdev->tclasslist[pdev->classId].CurrPcktSze = 0U; - - for (idx2 = 0U; idx2 < USBD_MAX_CLASS_ENDPOINTS; idx2++) - { - pdev->tclasslist[pdev->classId].Eps[idx2].add = 0U; - pdev->tclasslist[pdev->classId].Eps[idx2].type = 0U; - pdev->tclasslist[pdev->classId].Eps[idx2].size = 0U; - pdev->tclasslist[pdev->classId].Eps[idx2].is_used = 0U; - } - - for (idx2 = 0U; idx2 < USBD_MAX_CLASS_INTERFACES; idx2++) - { - pdev->tclasslist[pdev->classId].Ifs[idx2] = 0U; - } - } - } - - /* Reset the configuration descriptor */ - (void)USBD_CMPST_ClearConfDesc(pdev); - - /* Reset the class ID and number of classes */ - pdev->classId = 0U; - pdev->NumClasses = 0U; - - return ret; -} -#endif /* USE_USBD_COMPOSITE */ - -#if (USBD_USER_REGISTER_CALLBACK == 1U) -/** - * @brief USBD_RegisterDevStateCallback - * @param pdev : Device Handle - * @param pUserCallback: User Callback - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_RegisterDevStateCallback(USBD_HandleTypeDef *pdev, USBD_DevStateCallbackTypeDef pUserCallback) -{ - pdev->DevStateCallback = pUserCallback; - - return USBD_OK; -} -#endif /* USBD_USER_REGISTER_CALLBACK */ - -/** - * @brief USBD_Start - * Start the USB Device Core. - * @param pdev: Device Handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev) -{ -#ifdef USE_USBD_COMPOSITE - pdev->classId = 0U; -#endif /* USE_USBD_COMPOSITE */ - - /* Start the low level driver */ - return USBD_LL_Start(pdev); -} - -/** - * @brief USBD_Stop - * Stop the USB Device Core. - * @param pdev: Device Handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev) -{ - /* Disconnect USB Device */ - (void)USBD_LL_Stop(pdev); - - /* Free Class Resources */ -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - pdev->classId = i; - /* Free Class Resources */ - (void)pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config); - } - } - } - - /* Reset the class ID */ - pdev->classId = 0U; -#else - if (pdev->pClass[0] != NULL) - { - (void)pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config); - } -#endif /* USE_USBD_COMPOSITE */ - - return USBD_OK; -} - -/** - * @brief USBD_RunTestMode - * Launch test mode process - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev) -{ -#ifdef USBD_HS_TESTMODE_ENABLE - USBD_StatusTypeDef ret; - - /* Run USB HS test mode */ - ret = USBD_LL_SetTestMode(pdev, pdev->dev_test_mode); - - return ret; -#else - /* Prevent unused argument compilation warning */ - UNUSED(pdev); - - return USBD_OK; -#endif /* USBD_HS_TESTMODE_ENABLE */ -} - -/** - * @brief USBD_SetClassConfig - * Configure device and start the interface - * @param pdev: device instance - * @param cfgidx: configuration index - * @retval status - */ - -USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - USBD_StatusTypeDef ret = USBD_OK; - -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - pdev->classId = i; - /* Set configuration and Start the Class*/ - if (pdev->pClass[i]->Init(pdev, cfgidx) != 0U) - { - ret = USBD_FAIL; - } - } - } - } -#else - if (pdev->pClass[0] != NULL) - { - /* Set configuration and Start the Class */ - ret = (USBD_StatusTypeDef)pdev->pClass[0]->Init(pdev, cfgidx); - } -#endif /* USE_USBD_COMPOSITE */ - - return ret; -} - -/** - * @brief USBD_ClrClassConfig - * Clear current configuration - * @param pdev: device instance - * @param cfgidx: configuration index - * @retval status - */ -USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - USBD_StatusTypeDef ret = USBD_OK; - -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - pdev->classId = i; - /* Clear configuration and De-initialize the Class process */ - if (pdev->pClass[i]->DeInit(pdev, cfgidx) != 0U) - { - ret = USBD_FAIL; - } - } - } - } -#else - /* Clear configuration and De-initialize the Class process */ - if (pdev->pClass[0]->DeInit(pdev, cfgidx) != 0U) - { - ret = USBD_FAIL; - } -#endif /* USE_USBD_COMPOSITE */ - - return ret; -} - - -/** - * @brief USBD_LL_SetupStage - * Handle the setup stage - * @param pdev: device instance - * @param psetup: setup packet buffer pointer - * @retval status - */ -USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) -{ - USBD_StatusTypeDef ret; - - USBD_ParseSetupRequest(&pdev->request, psetup); - - pdev->ep0_state = USBD_EP0_SETUP; - - pdev->ep0_data_len = pdev->request.wLength; - - switch (pdev->request.bmRequest & 0x1FU) - { - case USB_REQ_RECIPIENT_DEVICE: - ret = USBD_StdDevReq(pdev, &pdev->request); - break; - - case USB_REQ_RECIPIENT_INTERFACE: - ret = USBD_StdItfReq(pdev, &pdev->request); - break; - - case USB_REQ_RECIPIENT_ENDPOINT: - ret = USBD_StdEPReq(pdev, &pdev->request); - break; - - default: - ret = USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U)); - break; - } - - return ret; -} - -/** - * @brief USBD_LL_DataOutStage - * Handle data OUT stage - * @param pdev: device instance - * @param epnum: endpoint index - * @param pdata: data pointer - * @retval status - */ -USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, - uint8_t epnum, uint8_t *pdata) -{ - USBD_EndpointTypeDef *pep; - USBD_StatusTypeDef ret = USBD_OK; - uint8_t idx; - - if (epnum == 0U) - { - pep = &pdev->ep_out[0]; - - if (pdev->ep0_state == USBD_EP0_DATA_OUT) - { - if (pep->rem_length > pep->maxpacket) - { - pep->rem_length -= pep->maxpacket; - - (void)USBD_CtlContinueRx(pdev, pdata, MIN(pep->rem_length, pep->maxpacket)); - } - else - { - /* Find the class ID relative to the current request */ - switch (pdev->request.bmRequest & 0x1FU) - { - case USB_REQ_RECIPIENT_DEVICE: - /* Device requests must be managed by the first instantiated class - (or duplicated by all classes for simplicity) */ - idx = 0U; - break; - - case USB_REQ_RECIPIENT_INTERFACE: - idx = USBD_CoreFindIF(pdev, LOBYTE(pdev->request.wIndex)); - break; - - case USB_REQ_RECIPIENT_ENDPOINT: - idx = USBD_CoreFindEP(pdev, LOBYTE(pdev->request.wIndex)); - break; - - default: - /* Back to the first class in case of doubt */ - idx = 0U; - break; - } - - if (idx < USBD_MAX_SUPPORTED_CLASS) - { - /* Setup the class ID and route the request to the relative class function */ - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass[idx]->EP0_RxReady != NULL) - { - pdev->classId = idx; - pdev->pClass[idx]->EP0_RxReady(pdev); - } - } - } - - (void)USBD_CtlSendStatus(pdev); - } - } - } - else - { - /* Get the class index relative to this interface */ - idx = USBD_CoreFindEP(pdev, (epnum & 0x7FU)); - - if (((uint16_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS)) - { - /* Call the class data out function to manage the request */ - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass[idx]->DataOut != NULL) - { - pdev->classId = idx; - ret = (USBD_StatusTypeDef)pdev->pClass[idx]->DataOut(pdev, epnum); - } - } - if (ret != USBD_OK) - { - return ret; - } - } - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_DataInStage - * Handle data in stage - * @param pdev: device instance - * @param epnum: endpoint index - * @param pdata: data pointer - * @retval status - */ -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, - uint8_t epnum, uint8_t *pdata) -{ - USBD_EndpointTypeDef *pep; - USBD_StatusTypeDef ret; - uint8_t idx; - - if (epnum == 0U) - { - pep = &pdev->ep_in[0]; - - if (pdev->ep0_state == USBD_EP0_DATA_IN) - { - if (pep->rem_length > pep->maxpacket) - { - pep->rem_length -= pep->maxpacket; - - (void)USBD_CtlContinueSendData(pdev, pdata, pep->rem_length); - - /* Prepare endpoint for premature end of transfer */ - (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); - } - else - { - /* last packet is MPS multiple, so send ZLP packet */ - if ((pep->maxpacket == pep->rem_length) && - (pep->total_length >= pep->maxpacket) && - (pep->total_length < pdev->ep0_data_len)) - { - (void)USBD_CtlContinueSendData(pdev, NULL, 0U); - pdev->ep0_data_len = 0U; - - /* Prepare endpoint for premature end of transfer */ - (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); - } - else - { - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass[0]->EP0_TxSent != NULL) - { - pdev->classId = 0U; - pdev->pClass[0]->EP0_TxSent(pdev); - } - } - (void)USBD_LL_StallEP(pdev, 0x80U); - (void)USBD_CtlReceiveStatus(pdev); - } - } - } - - if (pdev->dev_test_mode != 0U) - { - (void)USBD_RunTestMode(pdev); - pdev->dev_test_mode = 0U; - } - } - else - { - /* Get the class index relative to this interface */ - idx = USBD_CoreFindEP(pdev, ((uint8_t)epnum | 0x80U)); - - if (((uint16_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS)) - { - /* Call the class data out function to manage the request */ - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass[idx]->DataIn != NULL) - { - pdev->classId = idx; - ret = (USBD_StatusTypeDef)pdev->pClass[idx]->DataIn(pdev, epnum); - - if (ret != USBD_OK) - { - return ret; - } - } - } - } - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_Reset - * Handle Reset event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) -{ - USBD_StatusTypeDef ret = USBD_OK; - - /* Upon Reset call user call back */ - pdev->dev_state = USBD_STATE_DEFAULT; - pdev->ep0_state = USBD_EP0_IDLE; - pdev->dev_config = 0U; - pdev->dev_remote_wakeup = 0U; - pdev->dev_test_mode = 0U; - -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - pdev->classId = i; - /* Clear configuration and De-initialize the Class process*/ - - if (pdev->pClass[i]->DeInit != NULL) - { - if (pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config) != USBD_OK) - { - ret = USBD_FAIL; - } - } - } - } - } -#else - - if (pdev->pClass[0] != NULL) - { - if (pdev->pClass[0]->DeInit != NULL) - { - if (pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config) != USBD_OK) - { - ret = USBD_FAIL; - } - } - } -#endif /* USE_USBD_COMPOSITE */ - - /* Open EP0 OUT */ - (void)USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); - pdev->ep_out[0x00U & 0xFU].is_used = 1U; - - pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; - - /* Open EP0 IN */ - (void)USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); - pdev->ep_in[0x80U & 0xFU].is_used = 1U; - - pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; - - return ret; -} - -/** - * @brief USBD_LL_SetSpeed - * Handle Reset event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, - USBD_SpeedTypeDef speed) -{ - pdev->dev_speed = speed; - - return USBD_OK; -} - -/** - * @brief USBD_LL_Suspend - * Handle Suspend event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) -{ - if (pdev->dev_state != USBD_STATE_SUSPENDED) - { - pdev->dev_old_state = pdev->dev_state; - } - - pdev->dev_state = USBD_STATE_SUSPENDED; - - return USBD_OK; -} - -/** - * @brief USBD_LL_Resume - * Handle Resume event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) -{ - if (pdev->dev_state == USBD_STATE_SUSPENDED) - { - pdev->dev_state = pdev->dev_old_state; - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_SOF - * Handle SOF event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) -{ - /* The SOF event can be distributed for all classes that support it */ - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - if (pdev->pClass[i]->SOF != NULL) - { - pdev->classId = i; - (void)pdev->pClass[i]->SOF(pdev); - } - } - } - } -#else - if (pdev->pClass[0] != NULL) - { - if (pdev->pClass[0]->SOF != NULL) - { - (void)pdev->pClass[0]->SOF(pdev); - } - } -#endif /* USE_USBD_COMPOSITE */ - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_IsoINIncomplete - * Handle iso in incomplete event - * @param pdev: device instance - * @param epnum: Endpoint number - * @retval status - */ -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, - uint8_t epnum) -{ - if (pdev->pClass[pdev->classId] == NULL) - { - return USBD_FAIL; - } - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass[pdev->classId]->IsoINIncomplete != NULL) - { - (void)pdev->pClass[pdev->classId]->IsoINIncomplete(pdev, epnum); - } - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_IsoOUTIncomplete - * Handle iso out incomplete event - * @param pdev: device instance - * @param epnum: Endpoint number - * @retval status - */ -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, - uint8_t epnum) -{ - if (pdev->pClass[pdev->classId] == NULL) - { - return USBD_FAIL; - } - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass[pdev->classId]->IsoOUTIncomplete != NULL) - { - (void)pdev->pClass[pdev->classId]->IsoOUTIncomplete(pdev, epnum); - } - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_DevConnected - * Handle device connection event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) -{ - /* Prevent unused argument compilation warning */ - UNUSED(pdev); - - return USBD_OK; -} - -/** - * @brief USBD_LL_DevDisconnected - * Handle device disconnection event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) -{ - USBD_StatusTypeDef ret = USBD_OK; - - /* Free Class Resources */ - pdev->dev_state = USBD_STATE_DEFAULT; - -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - pdev->classId = i; - /* Clear configuration and De-initialize the Class process*/ - if (pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config) != 0U) - { - ret = USBD_FAIL; - } - } - } - } -#else - if (pdev->pClass[0] != NULL) - { - if (pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config) != 0U) - { - ret = USBD_FAIL; - } - } -#endif /* USE_USBD_COMPOSITE */ - - return ret; -} - -/** - * @brief USBD_CoreFindIF - * return the class index relative to the selected interface - * @param pdev: device instance - * @param index : selected interface number - * @retval index of the class using the selected interface number. OxFF if no class found. - */ -uint8_t USBD_CoreFindIF(USBD_HandleTypeDef *pdev, uint8_t index) -{ -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - /* Parse all interfaces listed in the current class */ - for (uint32_t j = 0U; j < pdev->tclasslist[i].NumIf; j++) - { - /* Check if requested Interface matches the current class interface */ - if (pdev->tclasslist[i].Ifs[j] == index) - { - if (pdev->pClass[i]->Setup != NULL) - { - return (uint8_t)i; - } - } - } - } - } - - return 0xFFU; -#else - UNUSED(pdev); - UNUSED(index); - - return 0x00U; -#endif /* USE_USBD_COMPOSITE */ -} - -/** - * @brief USBD_CoreFindEP - * return the class index relative to the selected endpoint - * @param pdev: device instance - * @param index : selected endpoint number - * @retval index of the class using the selected endpoint number. 0xFF if no class found. - */ -uint8_t USBD_CoreFindEP(USBD_HandleTypeDef *pdev, uint8_t index) -{ -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - /* Parse all endpoints listed in the current class */ - for (uint32_t j = 0U; j < pdev->tclasslist[i].NumEps; j++) - { - /* Check if requested endpoint matches the current class endpoint */ - if (pdev->tclasslist[i].Eps[j].add == index) - { - if (pdev->pClass[i]->Setup != NULL) - { - return (uint8_t)i; - } - } - } - } - } - - return 0xFFU; -#else - UNUSED(pdev); - UNUSED(index); - - return 0x00U; -#endif /* USE_USBD_COMPOSITE */ -} - -#ifdef USE_USBD_COMPOSITE -/** - * @brief USBD_CoreGetEPAdd - * Get the endpoint address relative to a selected class - * @param pdev: device instance - * @param ep_dir: USBD_EP_IN or USBD_EP_OUT - * @param ep_type: USBD_EP_TYPE_CTRL, USBD_EP_TYPE_ISOC, USBD_EP_TYPE_BULK or USBD_EP_TYPE_INTR - * @param ClassId: The Class ID - * @retval Address of the selected endpoint or 0xFFU if no endpoint found. - */ -uint8_t USBD_CoreGetEPAdd(USBD_HandleTypeDef *pdev, uint8_t ep_dir, uint8_t ep_type, uint8_t ClassId) -{ - uint8_t idx; - - /* Find the EP address in the selected class table */ - for (idx = 0; idx < pdev->tclasslist[ClassId].NumEps; idx++) - { - if (((pdev->tclasslist[ClassId].Eps[idx].add & USBD_EP_IN) == ep_dir) && \ - (pdev->tclasslist[ClassId].Eps[idx].type == ep_type) && \ - (pdev->tclasslist[ClassId].Eps[idx].is_used != 0U)) - { - return (pdev->tclasslist[ClassId].Eps[idx].add); - } - } - - /* If reaching this point, then no endpoint was found */ - return 0xFFU; -} -#endif /* USE_USBD_COMPOSITE */ - -/** - * @brief USBD_GetEpDesc - * This function return the Endpoint descriptor - * @param pdev: device instance - * @param pConfDesc: pointer to Bos descriptor - * @param EpAddr: endpoint address - * @retval pointer to video endpoint descriptor - */ -void *USBD_GetEpDesc(uint8_t *pConfDesc, uint8_t EpAddr) -{ - USBD_DescHeaderTypeDef *pdesc = (USBD_DescHeaderTypeDef *)(void *)pConfDesc; - USBD_ConfigDescTypeDef *desc = (USBD_ConfigDescTypeDef *)(void *)pConfDesc; - USBD_EpDescTypeDef *pEpDesc = NULL; - uint16_t ptr; - - if (desc->wTotalLength > desc->bLength) - { - ptr = desc->bLength; - - while (ptr < desc->wTotalLength) - { - pdesc = USBD_GetNextDesc((uint8_t *)pdesc, &ptr); - - if (pdesc->bDescriptorType == USB_DESC_TYPE_ENDPOINT) - { - pEpDesc = (USBD_EpDescTypeDef *)(void *)pdesc; - - if (pEpDesc->bEndpointAddress == EpAddr) - { - break; - } - else - { - pEpDesc = NULL; - } - } - } - } - - return (void *)pEpDesc; -} - -/** - * @brief USBD_GetNextDesc - * This function return the next descriptor header - * @param buf: Buffer where the descriptor is available - * @param ptr: data pointer inside the descriptor - * @retval next header - */ -USBD_DescHeaderTypeDef *USBD_GetNextDesc(uint8_t *pbuf, uint16_t *ptr) -{ - USBD_DescHeaderTypeDef *pnext = (USBD_DescHeaderTypeDef *)(void *)pbuf; - - *ptr += pnext->bLength; - pnext = (USBD_DescHeaderTypeDef *)(void *)(pbuf + pnext->bLength); - - return (pnext); -} - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - diff --git a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c b/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c deleted file mode 100644 index 814b810..0000000 --- a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c +++ /dev/null @@ -1,1058 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_req.c - * @author MCD Application Team - * @brief This file provides the standard USB requests following chapter 9. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ctlreq.h" -#include "usbd_ioreq.h" - -#ifdef USE_USBD_COMPOSITE -#include "usbd_composite_builder.h" -#endif /* USE_USBD_COMPOSITE */ - -/** @addtogroup STM32_USBD_STATE_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_REQ - * @brief USB standard requests module - * @{ - */ - -/** @defgroup USBD_REQ_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Defines - * @{ - */ -#ifndef USBD_MAX_STR_DESC_SIZ -#define USBD_MAX_STR_DESC_SIZ 64U -#endif /* USBD_MAX_STR_DESC_SIZ */ -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_FunctionPrototypes - * @{ - */ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_GetLen(uint8_t *buf); - -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Functions - * @{ - */ - - -/** - * @brief USBD_StdDevReq - * Handle standard usb device requests - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_StatusTypeDef ret = USBD_OK; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - case USB_REQ_TYPE_VENDOR: - ret = (USBD_StatusTypeDef)pdev->pClass[pdev->classId]->Setup(pdev, req); - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_DESCRIPTOR: - USBD_GetDescriptor(pdev, req); - break; - - case USB_REQ_SET_ADDRESS: - USBD_SetAddress(pdev, req); - break; - - case USB_REQ_SET_CONFIGURATION: - ret = USBD_SetConfig(pdev, req); - break; - - case USB_REQ_GET_CONFIGURATION: - USBD_GetConfig(pdev, req); - break; - - case USB_REQ_GET_STATUS: - USBD_GetStatus(pdev, req); - break; - - case USB_REQ_SET_FEATURE: - USBD_SetFeature(pdev, req); - break; - - case USB_REQ_CLEAR_FEATURE: - USBD_ClrFeature(pdev, req); - break; - - default: - USBD_CtlError(pdev, req); - break; - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } - - return ret; -} - -/** - * @brief USBD_StdItfReq - * Handle standard usb interface requests - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_StatusTypeDef ret = USBD_OK; - uint8_t idx; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - case USB_REQ_TYPE_VENDOR: - case USB_REQ_TYPE_STANDARD: - switch (pdev->dev_state) - { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - - if (LOBYTE(req->wIndex) <= USBD_MAX_NUM_INTERFACES) - { - /* Get the class index relative to this interface */ - idx = USBD_CoreFindIF(pdev, LOBYTE(req->wIndex)); - if (((uint8_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS)) - { - /* Call the class data out function to manage the request */ - if (pdev->pClass[idx]->Setup != NULL) - { - pdev->classId = idx; - ret = (USBD_StatusTypeDef)(pdev->pClass[idx]->Setup(pdev, req)); - } - else - { - /* should never reach this condition */ - ret = USBD_FAIL; - } - } - else - { - /* No relative interface found */ - ret = USBD_FAIL; - } - - if ((req->wLength == 0U) && (ret == USBD_OK)) - { - (void)USBD_CtlSendStatus(pdev); - } - } - else - { - USBD_CtlError(pdev, req); - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } - - return ret; -} - -/** - * @brief USBD_StdEPReq - * Handle standard usb endpoint requests - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_EndpointTypeDef *pep; - uint8_t ep_addr; - uint8_t idx; - USBD_StatusTypeDef ret = USBD_OK; - - ep_addr = LOBYTE(req->wIndex); - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - case USB_REQ_TYPE_VENDOR: - /* Get the class index relative to this endpoint */ - idx = USBD_CoreFindEP(pdev, ep_addr); - if (((uint8_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS)) - { - pdev->classId = idx; - /* Call the class data out function to manage the request */ - if (pdev->pClass[idx]->Setup != NULL) - { - ret = (USBD_StatusTypeDef)pdev->pClass[idx]->Setup(pdev, req); - } - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_SET_FEATURE: - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) - { - (void)USBD_LL_StallEP(pdev, ep_addr); - (void)USBD_LL_StallEP(pdev, 0x80U); - } - else - { - USBD_CtlError(pdev, req); - } - break; - - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_EP_HALT) - { - if ((ep_addr != 0x00U) && (ep_addr != 0x80U) && (req->wLength == 0x00U)) - { - (void)USBD_LL_StallEP(pdev, ep_addr); - } - } - (void)USBD_CtlSendStatus(pdev); - - break; - - default: - USBD_CtlError(pdev, req); - break; - } - break; - - case USB_REQ_CLEAR_FEATURE: - - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) - { - (void)USBD_LL_StallEP(pdev, ep_addr); - (void)USBD_LL_StallEP(pdev, 0x80U); - } - else - { - USBD_CtlError(pdev, req); - } - break; - - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_EP_HALT) - { - if ((ep_addr & 0x7FU) != 0x00U) - { - (void)USBD_LL_ClearStallEP(pdev, ep_addr); - } - (void)USBD_CtlSendStatus(pdev); - - /* Get the class index relative to this interface */ - idx = USBD_CoreFindEP(pdev, ep_addr); - if (((uint8_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS)) - { - pdev->classId = idx; - /* Call the class data out function to manage the request */ - if (pdev->pClass[idx]->Setup != NULL) - { - ret = (USBD_StatusTypeDef)(pdev->pClass[idx]->Setup(pdev, req)); - } - } - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } - break; - - case USB_REQ_GET_STATUS: - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) - { - USBD_CtlError(pdev, req); - break; - } - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ - &pdev->ep_out[ep_addr & 0x7FU]; - - pep->status = 0x0000U; - - (void)USBD_CtlSendData(pdev, (uint8_t *)&pep->status, 2U); - break; - - case USBD_STATE_CONFIGURED: - if ((ep_addr & 0x80U) == 0x80U) - { - if (pdev->ep_in[ep_addr & 0xFU].is_used == 0U) - { - USBD_CtlError(pdev, req); - break; - } - } - else - { - if (pdev->ep_out[ep_addr & 0xFU].is_used == 0U) - { - USBD_CtlError(pdev, req); - break; - } - } - - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ - &pdev->ep_out[ep_addr & 0x7FU]; - - if ((ep_addr == 0x00U) || (ep_addr == 0x80U)) - { - pep->status = 0x0000U; - } - else if (USBD_LL_IsStallEP(pdev, ep_addr) != 0U) - { - pep->status = 0x0001U; - } - else - { - pep->status = 0x0000U; - } - - (void)USBD_CtlSendData(pdev, (uint8_t *)&pep->status, 2U); - break; - - default: - USBD_CtlError(pdev, req); - break; - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } - - return ret; -} - - -/** - * @brief USBD_GetDescriptor - * Handle Get Descriptor requests - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - uint16_t len = 0U; - uint8_t *pbuf = NULL; - uint8_t err = 0U; - - switch (req->wValue >> 8) - { -#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1U)) - case USB_DESC_TYPE_BOS: - if (pdev->pDesc->GetBOSDescriptor != NULL) - { - pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; -#endif /* (USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1U) */ - case USB_DESC_TYPE_DEVICE: - pbuf = pdev->pDesc->GetDeviceDescriptor(pdev->dev_speed, &len); - break; - - case USB_DESC_TYPE_CONFIGURATION: - if (pdev->dev_speed == USBD_SPEED_HIGH) - { -#ifdef USE_USBD_COMPOSITE - if ((uint8_t)(pdev->NumClasses) > 0U) - { - pbuf = (uint8_t *)USBD_CMPSIT.GetHSConfigDescriptor(&len); - } - else -#endif /* USE_USBD_COMPOSITE */ - { - pbuf = (uint8_t *)pdev->pClass[0]->GetHSConfigDescriptor(&len); - } - pbuf[1] = USB_DESC_TYPE_CONFIGURATION; - } - else - { -#ifdef USE_USBD_COMPOSITE - if ((uint8_t)(pdev->NumClasses) > 0U) - { - pbuf = (uint8_t *)USBD_CMPSIT.GetFSConfigDescriptor(&len); - } - else -#endif /* USE_USBD_COMPOSITE */ - { - pbuf = (uint8_t *)pdev->pClass[0]->GetFSConfigDescriptor(&len); - } - pbuf[1] = USB_DESC_TYPE_CONFIGURATION; - } - break; - - case USB_DESC_TYPE_STRING: - switch ((uint8_t)(req->wValue)) - { - case USBD_IDX_LANGID_STR: - if (pdev->pDesc->GetLangIDStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - case USBD_IDX_MFC_STR: - if (pdev->pDesc->GetManufacturerStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - case USBD_IDX_PRODUCT_STR: - if (pdev->pDesc->GetProductStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - case USBD_IDX_SERIAL_STR: - if (pdev->pDesc->GetSerialStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - case USBD_IDX_CONFIG_STR: - if (pdev->pDesc->GetConfigurationStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - case USBD_IDX_INTERFACE_STR: - if (pdev->pDesc->GetInterfaceStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - default: -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) - pbuf = NULL; - - for (uint32_t idx = 0U; (idx < pdev->NumClasses); idx++) - { - if (pdev->pClass[idx]->GetUsrStrDescriptor != NULL) - { - pdev->classId = idx; - pbuf = pdev->pClass[idx]->GetUsrStrDescriptor(pdev, LOBYTE(req->wValue), &len); - - if (pbuf == NULL) /* This means that no class recognized the string index */ - { - continue; - } - else - { - break; - } - } - } -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - -#if (USBD_CLASS_USER_STRING_DESC == 1U) - if (pdev->pDesc->GetUserStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetUserStrDescriptor(pdev->dev_speed, LOBYTE(req->wValue), &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - -#if ((USBD_CLASS_USER_STRING_DESC == 0U) && (USBD_SUPPORT_USER_STRING_DESC == 0U)) - USBD_CtlError(pdev, req); - err++; -#endif /* (USBD_CLASS_USER_STRING_DESC == 0U) && (USBD_SUPPORT_USER_STRING_DESC == 0U) */ - break; - } - break; - - case USB_DESC_TYPE_DEVICE_QUALIFIER: - if (pdev->dev_speed == USBD_SPEED_HIGH) - { -#ifdef USE_USBD_COMPOSITE - if ((uint8_t)(pdev->NumClasses) > 0U) - { - pbuf = (uint8_t *)USBD_CMPSIT.GetDeviceQualifierDescriptor(&len); - } - else -#endif /* USE_USBD_COMPOSITE */ - { - pbuf = (uint8_t *)pdev->pClass[0]->GetDeviceQualifierDescriptor(&len); - } - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: - if (pdev->dev_speed == USBD_SPEED_HIGH) - { -#ifdef USE_USBD_COMPOSITE - if ((uint8_t)(pdev->NumClasses) > 0U) - { - pbuf = (uint8_t *)USBD_CMPSIT.GetOtherSpeedConfigDescriptor(&len); - } - else -#endif /* USE_USBD_COMPOSITE */ - { - pbuf = (uint8_t *)pdev->pClass[0]->GetOtherSpeedConfigDescriptor(&len); - } - pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - default: - USBD_CtlError(pdev, req); - err++; - break; - } - - if (err != 0U) - { - return; - } - - if (req->wLength != 0U) - { - if (len != 0U) - { - len = MIN(len, req->wLength); - (void)USBD_CtlSendData(pdev, pbuf, len); - } - else - { - USBD_CtlError(pdev, req); - } - } - else - { - (void)USBD_CtlSendStatus(pdev); - } -} - - -/** - * @brief USBD_SetAddress - * Set device address - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - uint8_t dev_addr; - - if ((req->wIndex == 0U) && (req->wLength == 0U) && (req->wValue < 128U)) - { - dev_addr = (uint8_t)(req->wValue) & 0x7FU; - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - USBD_CtlError(pdev, req); - } - else - { - pdev->dev_address = dev_addr; - (void)USBD_LL_SetUSBAddress(pdev, dev_addr); - (void)USBD_CtlSendStatus(pdev); - - if (dev_addr != 0U) - { - pdev->dev_state = USBD_STATE_ADDRESSED; - } - else - { - pdev->dev_state = USBD_STATE_DEFAULT; - } - } - } - else - { - USBD_CtlError(pdev, req); - } -} - -/** - * @brief USBD_SetConfig - * Handle Set device configuration request - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_StatusTypeDef ret = USBD_OK; - static uint8_t cfgidx; - - cfgidx = (uint8_t)(req->wValue); - - if (cfgidx > USBD_MAX_NUM_CONFIGURATION) - { - USBD_CtlError(pdev, req); - return USBD_FAIL; - } - - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if (cfgidx != 0U) - { - pdev->dev_config = cfgidx; - - ret = USBD_SetClassConfig(pdev, cfgidx); - - if (ret != USBD_OK) - { - USBD_CtlError(pdev, req); - pdev->dev_state = USBD_STATE_ADDRESSED; - } - else - { - (void)USBD_CtlSendStatus(pdev); - pdev->dev_state = USBD_STATE_CONFIGURED; - -#if (USBD_USER_REGISTER_CALLBACK == 1U) - if (pdev->DevStateCallback != NULL) - { - pdev->DevStateCallback(USBD_STATE_CONFIGURED, cfgidx); - } -#endif /* USBD_USER_REGISTER_CALLBACK */ - } - } - else - { - (void)USBD_CtlSendStatus(pdev); - } - break; - - case USBD_STATE_CONFIGURED: - if (cfgidx == 0U) - { - pdev->dev_state = USBD_STATE_ADDRESSED; - pdev->dev_config = cfgidx; - (void)USBD_ClrClassConfig(pdev, cfgidx); - (void)USBD_CtlSendStatus(pdev); - } - else if (cfgidx != pdev->dev_config) - { - /* Clear old configuration */ - (void)USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); - - /* set new configuration */ - pdev->dev_config = cfgidx; - - ret = USBD_SetClassConfig(pdev, cfgidx); - - if (ret != USBD_OK) - { - USBD_CtlError(pdev, req); - (void)USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); - pdev->dev_state = USBD_STATE_ADDRESSED; - } - else - { - (void)USBD_CtlSendStatus(pdev); - } - } - else - { - (void)USBD_CtlSendStatus(pdev); - } - break; - - default: - USBD_CtlError(pdev, req); - (void)USBD_ClrClassConfig(pdev, cfgidx); - ret = USBD_FAIL; - break; - } - - return ret; -} - -/** - * @brief USBD_GetConfig - * Handle Get device configuration request - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - if (req->wLength != 1U) - { - USBD_CtlError(pdev, req); - } - else - { - switch (pdev->dev_state) - { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - pdev->dev_default_config = 0U; - (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_default_config, 1U); - break; - - case USBD_STATE_CONFIGURED: - (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_config, 1U); - break; - - default: - USBD_CtlError(pdev, req); - break; - } - } -} - -/** - * @brief USBD_GetStatus - * Handle Get Status request - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - switch (pdev->dev_state) - { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - if (req->wLength != 0x2U) - { - USBD_CtlError(pdev, req); - break; - } - -#if (USBD_SELF_POWERED == 1U) - pdev->dev_config_status = USB_CONFIG_SELF_POWERED; -#else - pdev->dev_config_status = 0U; -#endif /* USBD_SELF_POWERED */ - - if (pdev->dev_remote_wakeup != 0U) - { - pdev->dev_config_status |= USB_CONFIG_REMOTE_WAKEUP; - } - - (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_config_status, 2U); - break; - - default: - USBD_CtlError(pdev, req); - break; - } -} - - -/** - * @brief USBD_SetFeature - * Handle Set device feature request - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev_remote_wakeup = 1U; - (void)USBD_CtlSendStatus(pdev); - } - else if (req->wValue == USB_FEATURE_TEST_MODE) - { - pdev->dev_test_mode = (uint8_t)(req->wIndex >> 8); - (void)USBD_CtlSendStatus(pdev); - } - else - { - USBD_CtlError(pdev, req); - } -} - - -/** - * @brief USBD_ClrFeature - * Handle clear device feature request - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - switch (pdev->dev_state) - { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev_remote_wakeup = 0U; - (void)USBD_CtlSendStatus(pdev); - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } -} - - -/** - * @brief USBD_ParseSetupRequest - * Copy buffer into setup structure - * @param req: usb request - * @param pdata: setup data pointer - * @retval None - */ -void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) -{ - uint8_t *pbuff = pdata; - - req->bmRequest = *(uint8_t *)(pbuff); - - pbuff++; - req->bRequest = *(uint8_t *)(pbuff); - - pbuff++; - req->wValue = SWAPBYTE(pbuff); - - pbuff++; - pbuff++; - req->wIndex = SWAPBYTE(pbuff); - - pbuff++; - pbuff++; - req->wLength = SWAPBYTE(pbuff); -} - - -/** - * @brief USBD_CtlError - * Handle USB low level Error - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - UNUSED(req); - - (void)USBD_LL_StallEP(pdev, 0x80U); - (void)USBD_LL_StallEP(pdev, 0U); -} - - -/** - * @brief USBD_GetString - * Convert Ascii string into unicode one - * @param desc : descriptor buffer - * @param unicode : Formatted string buffer (unicode) - * @param len : descriptor length - * @retval None - */ -void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) -{ - uint8_t idx = 0U; - uint8_t *pdesc; - - if (desc == NULL) - { - return; - } - - pdesc = desc; - *len = MIN(USBD_MAX_STR_DESC_SIZ, ((uint16_t)USBD_GetLen(pdesc) * 2U) + 2U); - - unicode[idx] = *(uint8_t *)len; - idx++; - unicode[idx] = USB_DESC_TYPE_STRING; - idx++; - - while (*pdesc != (uint8_t)'\0') - { - unicode[idx] = *pdesc; - pdesc++; - idx++; - - unicode[idx] = 0U; - idx++; - } -} - - -/** - * @brief USBD_GetLen - * return the string length - * @param buf : pointer to the ascii string buffer - * @retval string length - */ -static uint8_t USBD_GetLen(uint8_t *buf) -{ - uint8_t len = 0U; - uint8_t *pbuff = buf; - - while (*pbuff != (uint8_t)'\0') - { - len++; - pbuff++; - } - - return len; -} -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - diff --git a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c b/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c deleted file mode 100644 index 7c8004a..0000000 --- a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c +++ /dev/null @@ -1,224 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ioreq.c - * @author MCD Application Team - * @brief This file provides the IO requests APIs for control endpoints. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_IOREQ - * @brief control I/O requests module - * @{ - */ - -/** @defgroup USBD_IOREQ_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_FunctionPrototypes - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_Functions - * @{ - */ - -/** - * @brief USBD_CtlSendData - * send data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be sent - * @retval status - */ -USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len) -{ - /* Set EP0 State */ - pdev->ep0_state = USBD_EP0_DATA_IN; - pdev->ep_in[0].total_length = len; - -#ifdef USBD_AVOID_PACKET_SPLIT_MPS - pdev->ep_in[0].rem_length = 0U; -#else - pdev->ep_in[0].rem_length = len; -#endif /* USBD_AVOID_PACKET_SPLIT_MPS */ - - /* Start the transfer */ - (void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); - - return USBD_OK; -} - -/** - * @brief USBD_CtlContinueSendData - * continue sending data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be sent - * @retval status - */ -USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len) -{ - /* Start the next transfer */ - (void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); - - return USBD_OK; -} - -/** - * @brief USBD_CtlPrepareRx - * receive data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be received - * @retval status - */ -USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len) -{ - /* Set EP0 State */ - pdev->ep0_state = USBD_EP0_DATA_OUT; - pdev->ep_out[0].total_length = len; - -#ifdef USBD_AVOID_PACKET_SPLIT_MPS - pdev->ep_out[0].rem_length = 0U; -#else - pdev->ep_out[0].rem_length = len; -#endif /* USBD_AVOID_PACKET_SPLIT_MPS */ - - /* Start the transfer */ - (void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); - - return USBD_OK; -} - -/** - * @brief USBD_CtlContinueRx - * continue receive data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be received - * @retval status - */ -USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len) -{ - (void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); - - return USBD_OK; -} - -/** - * @brief USBD_CtlSendStatus - * send zero lzngth packet on the ctl pipe - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev) -{ - /* Set EP0 State */ - pdev->ep0_state = USBD_EP0_STATUS_IN; - - /* Start the transfer */ - (void)USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); - - return USBD_OK; -} - -/** - * @brief USBD_CtlReceiveStatus - * receive zero lzngth packet on the ctl pipe - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev) -{ - /* Set EP0 State */ - pdev->ep0_state = USBD_EP0_STATUS_OUT; - - /* Start the transfer */ - (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); - - return USBD_OK; -} - -/** - * @brief USBD_GetRxCount - * returns the received data length - * @param pdev: device instance - * @param ep_addr: endpoint address - * @retval Rx Data blength - */ -uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - return USBD_LL_GetRxDataSize(pdev, ep_addr); -} - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - diff --git a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/LICENSE.txt b/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/LICENSE.txt deleted file mode 100644 index e66295c..0000000 --- a/software/Power_Pico/Middlewares/ST/STM32_USB_Device_Library/LICENSE.txt +++ /dev/null @@ -1,86 +0,0 @@ -This software component is provided to you as part of a software package and -applicable license terms are in the Package_license file. If you received this -software component outside of a package or without applicable license terms, -the terms of the SLA0044 license shall apply and are fully reproduced below: - -SLA0044 Rev5/February 2018 - -Software license agreement - -ULTIMATE LIBERTY SOFTWARE LICENSE AGREEMENT - -BY INSTALLING, COPYING, DOWNLOADING, ACCESSING OR OTHERWISE USING THIS SOFTWARE -OR ANY PART THEREOF (AND THE RELATED DOCUMENTATION) FROM STMICROELECTRONICS -INTERNATIONAL N.V, SWISS BRANCH AND/OR ITS AFFILIATED COMPANIES -(STMICROELECTRONICS), THE RECIPIENT, ON BEHALF OF HIMSELF OR HERSELF, OR ON -BEHALF OF ANY ENTITY BY WHICH SUCH RECIPIENT IS EMPLOYED AND/OR ENGAGED AGREES -TO BE BOUND BY THIS SOFTWARE LICENSE AGREEMENT. - -Under STMicroelectronics’ intellectual property rights, the redistribution, -reproduction and use in source and binary forms of the software or any part -thereof, with or without modification, are permitted provided that the following -conditions are met: - -1. Redistribution of source code (modified or not) must retain any copyright -notice, this list of conditions and the disclaimer set forth below as items 10 -and 11. - -2. Redistributions in binary form, except as embedded into microcontroller or -microprocessor device manufactured by or for STMicroelectronics or a software -update for such device, must reproduce any copyright notice provided with the -binary code, this list of conditions, and the disclaimer set forth below as -items 10 and 11, in documentation and/or other materials provided with the -distribution. - -3. Neither the name of STMicroelectronics nor the names of other contributors to -this software may be used to endorse or promote products derived from this -software or part thereof without specific written permission. - -4. This software or any part thereof, including modifications and/or derivative -works of this software, must be used and execute solely and exclusively on or in -combination with a microcontroller or microprocessor device manufactured by or -for STMicroelectronics. - -5. No use, reproduction or redistribution of this software partially or totally -may be done in any manner that would subject this software to any Open Source -Terms. “Open Source Terms” shall mean any open source license which requires as -part of distribution of software that the source code of such software is -distributed therewith or otherwise made available, or open source license that -substantially complies with the Open Source definition specified at -www.opensource.org and any other comparable open source license such as for -example GNU General Public License (GPL), Eclipse Public License (EPL), Apache -Software License, BSD license or MIT license. - -6. STMicroelectronics has no obligation to provide any maintenance, support or -updates for the software. - -7. The software is and will remain the exclusive property of STMicroelectronics -and its licensors. The recipient will not take any action that jeopardizes -STMicroelectronics and its licensors' proprietary rights or acquire any rights -in the software, except the limited rights specified hereunder. - -8. The recipient shall comply with all applicable laws and regulations affecting -the use of the software or any part thereof including any applicable export -control law or regulation. - -9. Redistribution and use of this software or any part thereof other than as -permitted under this license is void and will automatically terminate your -rights under this license. - -10. THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS, WHICH ARE -DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT SHALL -STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -11. EXCEPT AS EXPRESSLY PERMITTED HEREUNDER, NO LICENSE OR OTHER RIGHTS, WHETHER -EXPRESS OR IMPLIED, ARE GRANTED UNDER ANY PATENT OR OTHER INTELLECTUAL PROPERTY -RIGHTS OF STMICROELECTRONICS OR ANY THIRD PARTY. - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os.h deleted file mode 100644 index 711408a..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os.h +++ /dev/null @@ -1,846 +0,0 @@ -/* - * Copyright (c) 2013-2019 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * ---------------------------------------------------------------------- - * - * $Date: 10. January 2017 - * $Revision: V2.1.0 - * - * Project: CMSIS-RTOS API - * Title: cmsis_os.h FreeRTOS header file - * - * Version 0.02 - * Initial Proposal Phase - * Version 0.03 - * osKernelStart added, optional feature: main started as thread - * osSemaphores have standard behavior - * osTimerCreate does not start the timer, added osTimerStart - * osThreadPass is renamed to osThreadYield - * Version 1.01 - * Support for C++ interface - * - const attribute removed from the osXxxxDef_t typedefs - * - const attribute added to the osXxxxDef macros - * Added: osTimerDelete, osMutexDelete, osSemaphoreDelete - * Added: osKernelInitialize - * Version 1.02 - * Control functions for short timeouts in microsecond resolution: - * Added: osKernelSysTick, osKernelSysTickFrequency, osKernelSysTickMicroSec - * Removed: osSignalGet - * Version 2.0.0 - * OS objects creation without macros (dynamic creation and resource allocation): - * - added: osXxxxNew functions which replace osXxxxCreate - * - added: osXxxxAttr_t structures - * - deprecated: osXxxxCreate functions, osXxxxDef_t structures - * - deprecated: osXxxxDef and osXxxx macros - * osStatus codes simplified and renamed to osStatus_t - * osEvent return structure deprecated - * Kernel: - * - added: osKernelInfo_t and osKernelGetInfo - * - added: osKernelState_t and osKernelGetState (replaces osKernelRunning) - * - added: osKernelLock, osKernelUnlock - * - added: osKernelSuspend, osKernelResume - * - added: osKernelGetTickCount, osKernelGetTickFreq - * - renamed osKernelSysTick to osKernelGetSysTimerCount - * - replaced osKernelSysTickFrequency with osKernelGetSysTimerFreq - * - deprecated osKernelSysTickMicroSec - * Thread: - * - extended number of thread priorities - * - renamed osPrioriry to osPrioriry_t - * - replaced osThreadCreate with osThreadNew - * - added: osThreadGetName - * - added: osThreadState_t and osThreadGetState - * - added: osThreadGetStackSize, osThreadGetStackSpace - * - added: osThreadSuspend, osThreadResume - * - added: osThreadJoin, osThreadDetach, osThreadExit - * - added: osThreadGetCount, osThreadEnumerate - * - added: Thread Flags (moved from Signals) - * Signals: - * - renamed osSignals to osThreadFlags (moved to Thread Flags) - * - changed return value of Set/Clear/Wait functions - * - Clear function limited to current running thread - * - extended Wait function (options) - * - added: osThreadFlagsGet - * Event Flags: - * - added new independent object for handling Event Flags - * Delay and Wait functions: - * - added: osDelayUntil - * - deprecated: osWait - * Timer: - * - replaced osTimerCreate with osTimerNew - * - added: osTimerGetName, osTimerIsRunning - * Mutex: - * - extended: attributes (Recursive, Priority Inherit, Robust) - * - replaced osMutexCreate with osMutexNew - * - renamed osMutexWait to osMutexAcquire - * - added: osMutexGetName, osMutexGetOwner - * Semaphore: - * - extended: maximum and initial token count - * - replaced osSemaphoreCreate with osSemaphoreNew - * - renamed osSemaphoreWait to osSemaphoreAcquire (changed return value) - * - added: osSemaphoreGetName, osSemaphoreGetCount - * Memory Pool: - * - using osMemoryPool prefix instead of osPool - * - replaced osPoolCreate with osMemoryPoolNew - * - extended osMemoryPoolAlloc (timeout) - * - added: osMemoryPoolGetName - * - added: osMemoryPoolGetCapacity, osMemoryPoolGetBlockSize - * - added: osMemoryPoolGetCount, osMemoryPoolGetSpace - * - added: osMemoryPoolDelete - * - deprecated: osPoolCAlloc - * Message Queue: - * - extended: fixed size message instead of a single 32-bit value - * - using osMessageQueue prefix instead of osMessage - * - replaced osMessageCreate with osMessageQueueNew - * - updated: osMessageQueuePut, osMessageQueueGet - * - added: osMessageQueueGetName - * - added: osMessageQueueGetCapacity, osMessageQueueGetMsgSize - * - added: osMessageQueueGetCount, osMessageQueueGetSpace - * - added: osMessageQueueReset, osMessageQueueDelete - * Mail Queue: - * - deprecated (superseded by extended Message Queue functionality) - * Version 2.1.0 - * Support for critical and uncritical sections (nesting safe): - * - updated: osKernelLock, osKernelUnlock - * - added: osKernelRestoreLock - * Updated Thread and Event Flags: - * - changed flags parameter and return type from int32_t to uint32_t - *---------------------------------------------------------------------------*/ - -#ifndef CMSIS_OS_H_ -#define CMSIS_OS_H_ - -#include "FreeRTOS.h" -#include "task.h" - -#define RTOS_ID_n ((tskKERNEL_VERSION_MAJOR << 16) | (tskKERNEL_VERSION_MINOR)) -#define RTOS_ID_s ("FreeRTOS " tskKERNEL_VERSION_NUMBER) - -#define osCMSIS 0x20001U ///< API version (main[31:16].sub[15:0]) - -#define osCMSIS_FreeRTOS RTOS_ID_n ///< RTOS identification and version (main[31:16].sub[15:0]) - -#define osKernelSystemId RTOS_ID_s ///< RTOS identification string - -#define osFeature_MainThread 0 ///< main thread 1=main can be thread, 0=not available -#define osFeature_Signals 24U ///< maximum number of Signal Flags available per thread -#define osFeature_Semaphore 65535U ///< maximum count for \ref osSemaphoreCreate function -#define osFeature_Wait 0 ///< osWait function: 1=available, 0=not available -#define osFeature_SysTick 1 ///< osKernelSysTick functions: 1=available, 0=not available -#define osFeature_Pool 0 ///< Memory Pools: 1=available, 0=not available -#define osFeature_MessageQ 1 ///< Message Queues: 1=available, 0=not available -#define osFeature_MailQ 0 ///< Mail Queues: 1=available, 0=not available - -#if defined(__CC_ARM) -#define os_InRegs __value_in_regs -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) -#define os_InRegs __attribute__((value_in_regs)) -#else -#define os_InRegs -#endif - -#include "cmsis_os2.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - -// ==== Enumerations, structures, defines ==== - -/// Priority values. -#if (osCMSIS < 0x20000U) -typedef enum { - osPriorityIdle = -3, ///< Priority: idle (lowest) - osPriorityLow = -2, ///< Priority: low - osPriorityBelowNormal = -1, ///< Priority: below normal - osPriorityNormal = 0, ///< Priority: normal (default) - osPriorityAboveNormal = +1, ///< Priority: above normal - osPriorityHigh = +2, ///< Priority: high - osPriorityRealtime = +3, ///< Priority: realtime (highest) - osPriorityError = 0x84, ///< System cannot determine priority or illegal priority. - osPriorityReserved = 0x7FFFFFFF ///< Prevents enum down-size compiler optimization. -} osPriority; -#else -#define osPriority osPriority_t -#endif - -/// Entry point of a thread. -typedef void (*os_pthread) (void const *argument); - -/// Entry point of a timer call back function. -typedef void (*os_ptimer) (void const *argument); - -/// Timer type. -#if (osCMSIS < 0x20000U) -typedef enum { - osTimerOnce = 0, ///< One-shot timer. - osTimerPeriodic = 1 ///< Repeating timer. -} os_timer_type; -#else -#define os_timer_type osTimerType_t -#endif - -/// Timeout value. -#define osWaitForever 0xFFFFFFFFU ///< Wait forever timeout value. - -/// Status code values returned by CMSIS-RTOS functions. -#if (osCMSIS < 0x20000U) -typedef enum { - osOK = 0, ///< Function completed; no error or event occurred. - osEventSignal = 0x08, ///< Function completed; signal event occurred. - osEventMessage = 0x10, ///< Function completed; message event occurred. - osEventMail = 0x20, ///< Function completed; mail event occurred. - osEventTimeout = 0x40, ///< Function completed; timeout occurred. - osErrorParameter = 0x80, ///< Parameter error: a mandatory parameter was missing or specified an incorrect object. - osErrorResource = 0x81, ///< Resource not available: a specified resource was not available. - osErrorTimeoutResource = 0xC1, ///< Resource not available within given time: a specified resource was not available within the timeout period. - osErrorISR = 0x82, ///< Not allowed in ISR context: the function cannot be called from interrupt service routines. - osErrorISRRecursive = 0x83, ///< Function called multiple times from ISR with same object. - osErrorPriority = 0x84, ///< System cannot determine priority or thread has illegal priority. - osErrorNoMemory = 0x85, ///< System is out of memory: it was impossible to allocate or reserve memory for the operation. - osErrorValue = 0x86, ///< Value of a parameter is out of range. - osErrorOS = 0xFF, ///< Unspecified RTOS error: run-time error but no other error message fits. - osStatusReserved = 0x7FFFFFFF ///< Prevents enum down-size compiler optimization. -} osStatus; -#else -typedef int32_t osStatus; -#define osEventSignal (0x08) -#define osEventMessage (0x10) -#define osEventMail (0x20) -#define osEventTimeout (0x40) -#define osErrorOS osError -#define osErrorTimeoutResource osErrorTimeout -#define osErrorISRRecursive (-126) -#define osErrorValue (-127) -#define osErrorPriority (-128) -#endif - - -// >>> the following data type definitions may be adapted towards a specific RTOS - -/// Thread ID identifies the thread. -#if (osCMSIS < 0x20000U) -typedef void *osThreadId; -#else -#define osThreadId osThreadId_t -#endif - -/// Timer ID identifies the timer. -#if (osCMSIS < 0x20000U) -typedef void *osTimerId; -#else -#define osTimerId osTimerId_t -#endif - -/// Mutex ID identifies the mutex. -#if (osCMSIS < 0x20000U) -typedef void *osMutexId; -#else -#define osMutexId osMutexId_t -#endif - -/// Semaphore ID identifies the semaphore. -#if (osCMSIS < 0x20000U) -typedef void *osSemaphoreId; -#else -#define osSemaphoreId osSemaphoreId_t -#endif - -/// Pool ID identifies the memory pool. -typedef void *osPoolId; - -/// Message ID identifies the message queue. -typedef void *osMessageQId; - -/// Mail ID identifies the mail queue. -typedef void *osMailQId; - - -/// Thread Definition structure contains startup information of a thread. -#if (osCMSIS < 0x20000U) -typedef struct os_thread_def { - os_pthread pthread; ///< start address of thread function - osPriority tpriority; ///< initial thread priority - uint32_t instances; ///< maximum number of instances of that thread function - uint32_t stacksize; ///< stack size requirements in bytes; 0 is default stack size -} osThreadDef_t; -#else -typedef struct os_thread_def { - os_pthread pthread; ///< start address of thread function - osThreadAttr_t attr; ///< thread attributes -} osThreadDef_t; -#endif - -/// Timer Definition structure contains timer parameters. -#if (osCMSIS < 0x20000U) -typedef struct os_timer_def { - os_ptimer ptimer; ///< start address of a timer function -} osTimerDef_t; -#else -typedef struct os_timer_def { - os_ptimer ptimer; ///< start address of a timer function - osTimerAttr_t attr; ///< timer attributes -} osTimerDef_t; -#endif - -/// Mutex Definition structure contains setup information for a mutex. -#if (osCMSIS < 0x20000U) -typedef struct os_mutex_def { - uint32_t dummy; ///< dummy value -} osMutexDef_t; -#else -#define osMutexDef_t osMutexAttr_t -#endif - -/// Semaphore Definition structure contains setup information for a semaphore. -#if (osCMSIS < 0x20000U) -typedef struct os_semaphore_def { - uint32_t dummy; ///< dummy value -} osSemaphoreDef_t; -#else -#define osSemaphoreDef_t osSemaphoreAttr_t -#endif - -/// Definition structure for memory block allocation. -#if (osCMSIS < 0x20000U) -typedef struct os_pool_def { - uint32_t pool_sz; ///< number of items (elements) in the pool - uint32_t item_sz; ///< size of an item - void *pool; ///< pointer to memory for pool -} osPoolDef_t; -#else -typedef struct os_pool_def { - uint32_t pool_sz; ///< number of items (elements) in the pool - uint32_t item_sz; ///< size of an item - osMemoryPoolAttr_t attr; ///< memory pool attributes -} osPoolDef_t; -#endif - -/// Definition structure for message queue. -#if (osCMSIS < 0x20000U) -typedef struct os_messageQ_def { - uint32_t queue_sz; ///< number of elements in the queue - void *pool; ///< memory array for messages -} osMessageQDef_t; -#else -typedef struct os_messageQ_def { - uint32_t queue_sz; ///< number of elements in the queue - osMessageQueueAttr_t attr; ///< message queue attributes -} osMessageQDef_t; -#endif - -/// Definition structure for mail queue. -#if (osCMSIS < 0x20000U) -typedef struct os_mailQ_def { - uint32_t queue_sz; ///< number of elements in the queue - uint32_t item_sz; ///< size of an item - void *pool; ///< memory array for mail -} osMailQDef_t; -#else -typedef struct os_mailQ_def { - uint32_t queue_sz; ///< number of elements in the queue - uint32_t item_sz; ///< size of an item - void *mail; ///< pointer to mail - osMemoryPoolAttr_t mp_attr; ///< memory pool attributes - osMessageQueueAttr_t mq_attr; ///< message queue attributes -} osMailQDef_t; -#endif - - -/// Event structure contains detailed information about an event. -typedef struct { - osStatus status; ///< status code: event or error information - union { - uint32_t v; ///< message as 32-bit value - void *p; ///< message or mail as void pointer - int32_t signals; ///< signal flags - } value; ///< event value - union { - osMailQId mail_id; ///< mail id obtained by \ref osMailCreate - osMessageQId message_id; ///< message id obtained by \ref osMessageCreate - } def; ///< event definition -} osEvent; - - -// ==== Kernel Management Functions ==== - -/// Initialize the RTOS Kernel for creating objects. -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osKernelInitialize (void); -#endif - -/// Start the RTOS Kernel scheduler. -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osKernelStart (void); -#endif - -/// Check if the RTOS kernel is already started. -/// \return 0 RTOS is not started, 1 RTOS is started. -#if (osCMSIS < 0x20000U) -int32_t osKernelRunning(void); -#endif - -#if (defined(osFeature_SysTick) && (osFeature_SysTick != 0)) // System Timer available - -/// Get the RTOS kernel system timer counter. -/// \return RTOS kernel system timer as 32-bit value -#if (osCMSIS < 0x20000U) -uint32_t osKernelSysTick (void); -#else -#define osKernelSysTick osKernelGetSysTimerCount -#endif - -/// The RTOS kernel system timer frequency in Hz. -/// \note Reflects the system timer setting and is typically defined in a configuration file. -#if (osCMSIS < 0x20000U) -#define osKernelSysTickFrequency 100000000 -#endif - -/// Convert a microseconds value to a RTOS kernel system timer value. -/// \param microsec time value in microseconds. -/// \return time value normalized to the \ref osKernelSysTickFrequency -#if (osCMSIS < 0x20000U) -#define osKernelSysTickMicroSec(microsec) (((uint64_t)microsec * (osKernelSysTickFrequency)) / 1000000) -#else -#define osKernelSysTickMicroSec(microsec) (((uint64_t)microsec * osKernelGetSysTimerFreq()) / 1000000) -#endif - -#endif // System Timer available - - -// ==== Thread Management Functions ==== - -/// Create a Thread Definition with function, priority, and stack requirements. -/// \param name name of the thread function. -/// \param priority initial priority of the thread function. -/// \param instances number of possible thread instances. -/// \param stacksz stack size (in bytes) requirements for the thread function. -#if defined (osObjectsExternal) // object is external -#define osThreadDef(name, priority, instances, stacksz) \ -extern const osThreadDef_t os_thread_def_##name -#else // define the object -#define osThreadDef(name, priority, instances, stacksz) \ -static uint64_t os_thread_stack##name[(stacksz)?(((stacksz+7)/8)):1]; \ -static StaticTask_t os_thread_cb_##name; \ -const osThreadDef_t os_thread_def_##name = \ -{ (name), \ - { NULL, osThreadDetached, \ - (instances == 1) ? (&os_thread_cb_##name) : NULL,\ - (instances == 1) ? sizeof(StaticTask_t) : 0U, \ - ((stacksz) && (instances == 1)) ? (&os_thread_stack##name) : NULL, \ - 8*((stacksz+7)/8), \ - (priority), 0U, 0U } } -#endif - -/// Access a Thread definition. -/// \param name name of the thread definition object. -#define osThread(name) \ -&os_thread_def_##name - -/// Create a thread and add it to Active Threads and set it to state READY. -/// \param[in] thread_def thread definition referenced with \ref osThread. -/// \param[in] argument pointer that is passed to the thread function as start argument. -/// \return thread ID for reference by other functions or NULL in case of error. -osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument); - -/// Return the thread ID of the current running thread. -/// \return thread ID for reference by other functions or NULL in case of error. -#if (osCMSIS < 0x20000U) -osThreadId osThreadGetId (void); -#endif - -/// Change priority of a thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. -/// \param[in] priority new priority value for the thread function. -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osThreadSetPriority (osThreadId thread_id, osPriority priority); -#endif - -/// Get current priority of a thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. -/// \return current priority value of the specified thread. -#if (osCMSIS < 0x20000U) -osPriority osThreadGetPriority (osThreadId thread_id); -#endif - -/// Pass control to next thread that is in state \b READY. -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osThreadYield (void); -#endif - -/// Terminate execution of a thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osThreadTerminate (osThreadId thread_id); -#endif - - -// ==== Signal Management ==== - -/// Set the specified Signal Flags of an active thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. -/// \param[in] signals specifies the signal flags of the thread that should be set. -/// \return previous signal flags of the specified thread or 0x80000000 in case of incorrect parameters. -int32_t osSignalSet (osThreadId thread_id, int32_t signals); - -/// Clear the specified Signal Flags of an active thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. -/// \param[in] signals specifies the signal flags of the thread that shall be cleared. -/// \return previous signal flags of the specified thread or 0x80000000 in case of incorrect parameters or call from ISR. -int32_t osSignalClear (osThreadId thread_id, int32_t signals); - -/// Wait for one or more Signal Flags to become signaled for the current \b RUNNING thread. -/// \param[in] signals wait until all specified signal flags set or 0 for any single signal flag. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return event flag information or error code. -os_InRegs osEvent osSignalWait (int32_t signals, uint32_t millisec); - - -// ==== Generic Wait Functions ==== - -/// Wait for Timeout (Time Delay). -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue "time delay" value -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osDelay (uint32_t millisec); -#endif - -#if (defined (osFeature_Wait) && (osFeature_Wait != 0)) // Generic Wait available - -/// Wait for Signal, Message, Mail, or Timeout. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out -/// \return event that contains signal, message, or mail information or error code. -os_InRegs osEvent osWait (uint32_t millisec); - -#endif // Generic Wait available - - -// ==== Timer Management Functions ==== - -/// Define a Timer object. -/// \param name name of the timer object. -/// \param function name of the timer call back function. -#if defined (osObjectsExternal) // object is external -#define osTimerDef(name, function) \ -extern const osTimerDef_t os_timer_def_##name -#else // define the object -#define osTimerDef(name, function) \ -static StaticTimer_t os_timer_cb_##name; \ -const osTimerDef_t os_timer_def_##name = \ -{ (function), { NULL, 0U, (&os_timer_cb_##name), sizeof(StaticTimer_t) } } -#endif - -/// Access a Timer definition. -/// \param name name of the timer object. -#define osTimer(name) \ -&os_timer_def_##name - -/// Create and Initialize a timer. -/// \param[in] timer_def timer object referenced with \ref osTimer. -/// \param[in] type osTimerOnce for one-shot or osTimerPeriodic for periodic behavior. -/// \param[in] argument argument to the timer call back function. -/// \return timer ID for reference by other functions or NULL in case of error. -osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void *argument); - -/// Start or restart a timer. -/// \param[in] timer_id timer ID obtained by \ref osTimerCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue "time delay" value of the timer. -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osTimerStart (osTimerId timer_id, uint32_t millisec); -#endif - -/// Stop a timer. -/// \param[in] timer_id timer ID obtained by \ref osTimerCreate. -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osTimerStop (osTimerId timer_id); -#endif - -/// Delete a timer. -/// \param[in] timer_id timer ID obtained by \ref osTimerCreate. -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osTimerDelete (osTimerId timer_id); -#endif - - -// ==== Mutex Management Functions ==== - -/// Define a Mutex. -/// \param name name of the mutex object. -#if defined (osObjectsExternal) // object is external -#define osMutexDef(name) \ -extern const osMutexDef_t os_mutex_def_##name -#else // define the object -#define osMutexDef(name) \ -static StaticSemaphore_t os_mutex_cb_##name; \ -const osMutexDef_t os_mutex_def_##name = \ -{ NULL, osMutexRecursive | osMutexPrioInherit, (&os_mutex_cb_##name), sizeof(StaticSemaphore_t) } -#endif - -/// Access a Mutex definition. -/// \param name name of the mutex object. -#define osMutex(name) \ -&os_mutex_def_##name - -/// Create and Initialize a Mutex object. -/// \param[in] mutex_def mutex definition referenced with \ref osMutex. -/// \return mutex ID for reference by other functions or NULL in case of error. -osMutexId osMutexCreate (const osMutexDef_t *mutex_def); - -/// Wait until a Mutex becomes available. -/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osMutexWait (osMutexId mutex_id, uint32_t millisec); -#else -#define osMutexWait osMutexAcquire -#endif - -/// Release a Mutex that was obtained by \ref osMutexWait. -/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate. -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osMutexRelease (osMutexId mutex_id); -#endif - -/// Delete a Mutex object. -/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate. -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osMutexDelete (osMutexId mutex_id); -#endif - - -// ==== Semaphore Management Functions ==== - -#if (defined (osFeature_Semaphore) && (osFeature_Semaphore != 0U)) // Semaphore available - -/// Define a Semaphore object. -/// \param name name of the semaphore object. -#if defined (osObjectsExternal) // object is external -#define osSemaphoreDef(name) \ -extern const osSemaphoreDef_t os_semaphore_def_##name -#else // define the object -#define osSemaphoreDef(name) \ -static StaticSemaphore_t os_semaphore_cb_##name; \ -const osSemaphoreDef_t os_semaphore_def_##name = \ -{ NULL, 0U, (&os_semaphore_cb_##name), sizeof(StaticSemaphore_t) } -#endif - -/// Access a Semaphore definition. -/// \param name name of the semaphore object. -#define osSemaphore(name) \ -&os_semaphore_def_##name - -/// Create and Initialize a Semaphore object. -/// \param[in] semaphore_def semaphore definition referenced with \ref osSemaphore. -/// \param[in] count maximum and initial number of available tokens. -/// \return semaphore ID for reference by other functions or NULL in case of error. -osSemaphoreId osSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count); - -/// Wait until a Semaphore token becomes available. -/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return number of available tokens, or -1 in case of incorrect parameters. -int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec); - -/// Release a Semaphore token. -/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate. -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osSemaphoreRelease (osSemaphoreId semaphore_id); -#endif - -/// Delete a Semaphore object. -/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate. -/// \return status code that indicates the execution status of the function. -#if (osCMSIS < 0x20000U) -osStatus osSemaphoreDelete (osSemaphoreId semaphore_id); -#endif - -#endif // Semaphore available - - -// ==== Memory Pool Management Functions ==== - -#if (defined(osFeature_Pool) && (osFeature_Pool != 0)) // Memory Pool available - -/// \brief Define a Memory Pool. -/// \param name name of the memory pool. -/// \param no maximum number of blocks (objects) in the memory pool. -/// \param type data type of a single block (object). -#if defined (osObjectsExternal) // object is external -#define osPoolDef(name, no, type) \ -extern const osPoolDef_t os_pool_def_##name -#else // define the object -#define osPoolDef(name, no, type) \ -const osPoolDef_t os_pool_def_##name = \ -{ (no), sizeof(type), {NULL} } -#endif - -/// \brief Access a Memory Pool definition. -/// \param name name of the memory pool -#define osPool(name) \ -&os_pool_def_##name - -/// Create and Initialize a Memory Pool object. -/// \param[in] pool_def memory pool definition referenced with \ref osPool. -/// \return memory pool ID for reference by other functions or NULL in case of error. -osPoolId osPoolCreate (const osPoolDef_t *pool_def); - -/// Allocate a memory block from a Memory Pool. -/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate. -/// \return address of the allocated memory block or NULL in case of no memory available. -void *osPoolAlloc (osPoolId pool_id); - -/// Allocate a memory block from a Memory Pool and set memory block to zero. -/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate. -/// \return address of the allocated memory block or NULL in case of no memory available. -void *osPoolCAlloc (osPoolId pool_id); - -/// Return an allocated memory block back to a Memory Pool. -/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate. -/// \param[in] block address of the allocated memory block to be returned to the memory pool. -/// \return status code that indicates the execution status of the function. -osStatus osPoolFree (osPoolId pool_id, void *block); - -#endif // Memory Pool available - - -// ==== Message Queue Management Functions ==== - -#if (defined(osFeature_MessageQ) && (osFeature_MessageQ != 0)) // Message Queue available - -/// \brief Create a Message Queue Definition. -/// \param name name of the queue. -/// \param queue_sz maximum number of messages in the queue. -/// \param type data type of a single message element (for debugger). -#if defined (osObjectsExternal) // object is external -#define osMessageQDef(name, queue_sz, type) \ -extern const osMessageQDef_t os_messageQ_def_##name -#else // define the object -#define osMessageQDef(name, queue_sz, type) \ -static StaticQueue_t os_mq_cb_##name; \ -static uint32_t os_mq_data_##name[(queue_sz) * sizeof(type)]; \ -const osMessageQDef_t os_messageQ_def_##name = \ -{ (queue_sz), \ - { NULL, 0U, (&os_mq_cb_##name), sizeof(StaticQueue_t), \ - (&os_mq_data_##name), sizeof(os_mq_data_##name) } } -#endif - -/// \brief Access a Message Queue Definition. -/// \param name name of the queue -#define osMessageQ(name) \ -&os_messageQ_def_##name - -/// Create and Initialize a Message Queue object. -/// \param[in] queue_def message queue definition referenced with \ref osMessageQ. -/// \param[in] thread_id thread ID (obtained by \ref osThreadCreate or \ref osThreadGetId) or NULL. -/// \return message queue ID for reference by other functions or NULL in case of error. -osMessageQId osMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id); - -/// Put a Message to a Queue. -/// \param[in] queue_id message queue ID obtained with \ref osMessageCreate. -/// \param[in] info message information. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return status code that indicates the execution status of the function. -osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec); - -/// Get a Message from a Queue or timeout if Queue is empty. -/// \param[in] queue_id message queue ID obtained with \ref osMessageCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return event information that includes status code. -os_InRegs osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec); - -#endif // Message Queue available - - -// ==== Mail Queue Management Functions ==== - -#if (defined(osFeature_MailQ) && (osFeature_MailQ != 0)) // Mail Queue available - -/// \brief Create a Mail Queue Definition. -/// \param name name of the queue. -/// \param queue_sz maximum number of mails in the queue. -/// \param type data type of a single mail element. -#if defined (osObjectsExternal) // object is external -#define osMailQDef(name, queue_sz, type) \ -extern const osMailQDef_t os_mailQ_def_##name -#else // define the object -#define osMailQDef(name, queue_sz, type) \ -const osMailQDef_t os_mailQ_def_##name = \ -{ (queue_sz), sizeof(type), NULL } -#endif - -/// \brief Access a Mail Queue Definition. -/// \param name name of the queue -#define osMailQ(name) \ -&os_mailQ_def_##name - -/// Create and Initialize a Mail Queue object. -/// \param[in] queue_def mail queue definition referenced with \ref osMailQ. -/// \param[in] thread_id thread ID (obtained by \ref osThreadCreate or \ref osThreadGetId) or NULL. -/// \return mail queue ID for reference by other functions or NULL in case of error. -osMailQId osMailCreate (const osMailQDef_t *queue_def, osThreadId thread_id); - -/// Allocate a memory block for mail from a mail memory pool. -/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out -/// \return pointer to memory block that can be filled with mail or NULL in case of error. -void *osMailAlloc (osMailQId queue_id, uint32_t millisec); - -/// Allocate a memory block for mail from a mail memory pool and set memory block to zero. -/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out -/// \return pointer to memory block that can be filled with mail or NULL in case of error. -void *osMailCAlloc (osMailQId queue_id, uint32_t millisec); - -/// Put a Mail into a Queue. -/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. -/// \param[in] mail pointer to memory with mail to put into a queue. -/// \return status code that indicates the execution status of the function. -osStatus osMailPut (osMailQId queue_id, const void *mail); - -/// Get a Mail from a Queue or timeout if Queue is empty. -/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return event information that includes status code. -os_InRegs osEvent osMailGet (osMailQId queue_id, uint32_t millisec); - -/// Free a memory block by returning it to a mail memory pool. -/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. -/// \param[in] mail pointer to memory block that was obtained with \ref osMailGet. -/// \return status code that indicates the execution status of the function. -osStatus osMailFree (osMailQId queue_id, void *mail); - -#endif // Mail Queue available - - -#ifdef __cplusplus -} -#endif - -#endif // CMSIS_OS_H_ diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c deleted file mode 100644 index 69ac328..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c +++ /dev/null @@ -1,2482 +0,0 @@ -/* -------------------------------------------------------------------------- - * Copyright (c) 2013-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Name: cmsis_os2.c - * Purpose: CMSIS RTOS2 wrapper for FreeRTOS - * - *---------------------------------------------------------------------------*/ - -#include - -#include "cmsis_os2.h" // ::CMSIS:RTOS2 -#include "cmsis_compiler.h" // Compiler agnostic definitions - -#include "FreeRTOS.h" // ARM.FreeRTOS::RTOS:Core -#include "task.h" // ARM.FreeRTOS::RTOS:Core -#include "event_groups.h" // ARM.FreeRTOS::RTOS:Event Groups -#include "semphr.h" // ARM.FreeRTOS::RTOS:Core - -#include "freertos_mpool.h" // osMemoryPool definitions -#include "freertos_os2.h" // Configuration check and setup - -/*---------------------------------------------------------------------------*/ -#ifndef __ARM_ARCH_6M__ - #define __ARM_ARCH_6M__ 0 -#endif -#ifndef __ARM_ARCH_7M__ - #define __ARM_ARCH_7M__ 0 -#endif -#ifndef __ARM_ARCH_7EM__ - #define __ARM_ARCH_7EM__ 0 -#endif -#ifndef __ARM_ARCH_8M_MAIN__ - #define __ARM_ARCH_8M_MAIN__ 0 -#endif -#ifndef __ARM_ARCH_7A__ - #define __ARM_ARCH_7A__ 0 -#endif - -#if ((__ARM_ARCH_7M__ == 1U) || \ - (__ARM_ARCH_7EM__ == 1U) || \ - (__ARM_ARCH_8M_MAIN__ == 1U)) -#define IS_IRQ_MASKED() ((__get_PRIMASK() != 0U) || (__get_BASEPRI() != 0U)) -#elif (__ARM_ARCH_6M__ == 1U) -#define IS_IRQ_MASKED() (__get_PRIMASK() != 0U) -#elif (__ARM_ARCH_7A__ == 1U) -/* CPSR mask bits */ -#define CPSR_MASKBIT_I 0x80U - -#define IS_IRQ_MASKED() ((__get_CPSR() & CPSR_MASKBIT_I) != 0U) -#else -#define IS_IRQ_MASKED() (__get_PRIMASK() != 0U) -#endif - -#if (__ARM_ARCH_7A__ == 1U) -/* CPSR mode bitmasks */ -#define CPSR_MODE_USER 0x10U -#define CPSR_MODE_SYSTEM 0x1FU - -#define IS_IRQ_MODE() ((__get_mode() != CPSR_MODE_USER) && (__get_mode() != CPSR_MODE_SYSTEM)) -#else -#define IS_IRQ_MODE() (__get_IPSR() != 0U) -#endif - -#define IS_IRQ() IS_IRQ_MODE() - -#define SVCall_IRQ_NBR (IRQn_Type) -5 /* SVCall_IRQ_NBR added as SV_Call handler name is not the same for CM0 and for all other CMx */ - -/* Limits */ -#define MAX_BITS_TASK_NOTIFY 31U -#define MAX_BITS_EVENT_GROUPS 24U - -#define THREAD_FLAGS_INVALID_BITS (~((1UL << MAX_BITS_TASK_NOTIFY) - 1U)) -#define EVENT_FLAGS_INVALID_BITS (~((1UL << MAX_BITS_EVENT_GROUPS) - 1U)) - -/* Kernel version and identification string definition (major.minor.rev: mmnnnrrrr dec) */ -#define KERNEL_VERSION (((uint32_t)tskKERNEL_VERSION_MAJOR * 10000000UL) | \ - ((uint32_t)tskKERNEL_VERSION_MINOR * 10000UL) | \ - ((uint32_t)tskKERNEL_VERSION_BUILD * 1UL)) - -#define KERNEL_ID ("FreeRTOS " tskKERNEL_VERSION_NUMBER) - -/* Timer callback information structure definition */ -typedef struct { - osTimerFunc_t func; - void *arg; -} TimerCallback_t; - -/* Kernel initialization state */ -static osKernelState_t KernelState = osKernelInactive; - -/* - Heap region definition used by heap_5 variant - - Define configAPPLICATION_ALLOCATED_HEAP as nonzero value in FreeRTOSConfig.h if - heap regions are already defined and vPortDefineHeapRegions is called in application. - - Otherwise vPortDefineHeapRegions will be called by osKernelInitialize using - definition configHEAP_5_REGIONS as parameter. Overriding configHEAP_5_REGIONS - is possible by defining it globally or in FreeRTOSConfig.h. -*/ -#if defined(USE_FreeRTOS_HEAP_5) -#if (configAPPLICATION_ALLOCATED_HEAP == 0) - /* - FreeRTOS heap is not defined by the application. - Single region of size configTOTAL_HEAP_SIZE (defined in FreeRTOSConfig.h) - is provided by default. Define configHEAP_5_REGIONS to provide custom - HeapRegion_t array. - */ - #define HEAP_5_REGION_SETUP 1 - - #ifndef configHEAP_5_REGIONS - #define configHEAP_5_REGIONS xHeapRegions - - static uint8_t ucHeap[configTOTAL_HEAP_SIZE]; - - static HeapRegion_t xHeapRegions[] = { - { ucHeap, configTOTAL_HEAP_SIZE }, - { NULL, 0 } - }; - #else - /* Global definition is provided to override default heap array */ - extern HeapRegion_t configHEAP_5_REGIONS[]; - #endif -#else - /* - The application already defined the array used for the FreeRTOS heap and - called vPortDefineHeapRegions to initialize heap. - */ - #define HEAP_5_REGION_SETUP 0 -#endif /* configAPPLICATION_ALLOCATED_HEAP */ -#endif /* USE_FreeRTOS_HEAP_5 */ - -#if defined(SysTick) -#undef SysTick_Handler - -/* CMSIS SysTick interrupt handler prototype */ -extern void SysTick_Handler (void); -/* FreeRTOS tick timer interrupt handler prototype */ -extern void xPortSysTickHandler (void); - -/* - SysTick handler implementation that also clears overflow flag. -*/ -#if (USE_CUSTOM_SYSTICK_HANDLER_IMPLEMENTATION == 0) -void SysTick_Handler (void) { - /* Clear overflow flag */ - SysTick->CTRL; - - if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { - /* Call tick handler */ - xPortSysTickHandler(); - } -} -#endif -#endif /* SysTick */ - -/* - Setup SVC to reset value. -*/ -__STATIC_INLINE void SVC_Setup (void) { -#if (__ARM_ARCH_7A__ == 0U) - /* Service Call interrupt might be configured before kernel start */ - /* and when its priority is lower or equal to BASEPRI, svc intruction */ - /* causes a Hard Fault. */ - NVIC_SetPriority (SVCall_IRQ_NBR, 0U); -#endif -} - -/* - Function macro used to retrieve semaphore count from ISR -*/ -#ifndef uxSemaphoreGetCountFromISR -#define uxSemaphoreGetCountFromISR( xSemaphore ) uxQueueMessagesWaitingFromISR( ( QueueHandle_t ) ( xSemaphore ) ) -#endif - -/* Get OS Tick count value */ -static uint32_t OS_Tick_GetCount (void); -/* Get OS Tick overflow status */ -static uint32_t OS_Tick_GetOverflow (void); -/* Get OS Tick interval */ -static uint32_t OS_Tick_GetInterval (void); -/*---------------------------------------------------------------------------*/ - -osStatus_t osKernelInitialize (void) { - osStatus_t stat; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else { - if (KernelState == osKernelInactive) { - #if defined(USE_TRACE_EVENT_RECORDER) - EvrFreeRTOSSetup(0U); - #endif - #if defined(USE_FreeRTOS_HEAP_5) && (HEAP_5_REGION_SETUP == 1) - vPortDefineHeapRegions (configHEAP_5_REGIONS); - #endif - KernelState = osKernelReady; - stat = osOK; - } else { - stat = osError; - } - } - - return (stat); -} - -osStatus_t osKernelGetInfo (osVersion_t *version, char *id_buf, uint32_t id_size) { - - if (version != NULL) { - /* Version encoding is major.minor.rev: mmnnnrrrr dec */ - version->api = KERNEL_VERSION; - version->kernel = KERNEL_VERSION; - } - - if ((id_buf != NULL) && (id_size != 0U)) { - if (id_size > sizeof(KERNEL_ID)) { - id_size = sizeof(KERNEL_ID); - } - memcpy(id_buf, KERNEL_ID, id_size); - } - - return (osOK); -} - -osKernelState_t osKernelGetState (void) { - osKernelState_t state; - - switch (xTaskGetSchedulerState()) { - case taskSCHEDULER_RUNNING: - state = osKernelRunning; - break; - - case taskSCHEDULER_SUSPENDED: - state = osKernelLocked; - break; - - case taskSCHEDULER_NOT_STARTED: - default: - if (KernelState == osKernelReady) { - state = osKernelReady; - } else { - state = osKernelInactive; - } - break; - } - - return (state); -} - -osStatus_t osKernelStart (void) { - osStatus_t stat; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else { - if (KernelState == osKernelReady) { - /* Ensure SVC priority is at the reset value */ - SVC_Setup(); - /* Change state to enable IRQ masking check */ - KernelState = osKernelRunning; - /* Start the kernel scheduler */ - vTaskStartScheduler(); - stat = osOK; - } else { - stat = osError; - } - } - - return (stat); -} - -int32_t osKernelLock (void) { - int32_t lock; - - if (IS_IRQ()) { - lock = (int32_t)osErrorISR; - } - else { - switch (xTaskGetSchedulerState()) { - case taskSCHEDULER_SUSPENDED: - lock = 1; - break; - - case taskSCHEDULER_RUNNING: - vTaskSuspendAll(); - lock = 0; - break; - - case taskSCHEDULER_NOT_STARTED: - default: - lock = (int32_t)osError; - break; - } - } - - return (lock); -} - -int32_t osKernelUnlock (void) { - int32_t lock; - - if (IS_IRQ()) { - lock = (int32_t)osErrorISR; - } - else { - switch (xTaskGetSchedulerState()) { - case taskSCHEDULER_SUSPENDED: - lock = 1; - - if (xTaskResumeAll() != pdTRUE) { - if (xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED) { - lock = (int32_t)osError; - } - } - break; - - case taskSCHEDULER_RUNNING: - lock = 0; - break; - - case taskSCHEDULER_NOT_STARTED: - default: - lock = (int32_t)osError; - break; - } - } - - return (lock); -} - -int32_t osKernelRestoreLock (int32_t lock) { - - if (IS_IRQ()) { - lock = (int32_t)osErrorISR; - } - else { - switch (xTaskGetSchedulerState()) { - case taskSCHEDULER_SUSPENDED: - case taskSCHEDULER_RUNNING: - if (lock == 1) { - vTaskSuspendAll(); - } - else { - if (lock != 0) { - lock = (int32_t)osError; - } - else { - if (xTaskResumeAll() != pdTRUE) { - if (xTaskGetSchedulerState() != taskSCHEDULER_RUNNING) { - lock = (int32_t)osError; - } - } - } - } - break; - - case taskSCHEDULER_NOT_STARTED: - default: - lock = (int32_t)osError; - break; - } - } - - return (lock); -} - -uint32_t osKernelGetTickCount (void) { - TickType_t ticks; - - if (IS_IRQ()) { - ticks = xTaskGetTickCountFromISR(); - } else { - ticks = xTaskGetTickCount(); - } - - return (ticks); -} - -uint32_t osKernelGetTickFreq (void) { - return (configTICK_RATE_HZ); -} - -/* Get OS Tick count value */ -static uint32_t OS_Tick_GetCount (void) { - uint32_t load = SysTick->LOAD; - return (load - SysTick->VAL); -} - -/* Get OS Tick overflow status */ -static uint32_t OS_Tick_GetOverflow (void) { - return ((SysTick->CTRL >> 16) & 1U); -} - -/* Get OS Tick interval */ -static uint32_t OS_Tick_GetInterval (void) { - return (SysTick->LOAD + 1U); -} - -uint32_t osKernelGetSysTimerCount (void) { - uint32_t irqmask = IS_IRQ_MASKED(); - TickType_t ticks; - uint32_t val; - - __disable_irq(); - - ticks = xTaskGetTickCount(); - val = OS_Tick_GetCount(); - - if (OS_Tick_GetOverflow() != 0U) { - val = OS_Tick_GetCount(); - ticks++; - } - val += ticks * OS_Tick_GetInterval(); - - if (irqmask == 0U) { - __enable_irq(); - } - - return (val); -} - -uint32_t osKernelGetSysTimerFreq (void) { - return (configCPU_CLOCK_HZ); -} - -/*---------------------------------------------------------------------------*/ - -osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr) { - const char *name; - uint32_t stack; - TaskHandle_t hTask; - UBaseType_t prio; - int32_t mem; - - hTask = NULL; - - if (!IS_IRQ() && (func != NULL)) { - stack = configMINIMAL_STACK_SIZE; - prio = (UBaseType_t)osPriorityNormal; - - name = NULL; - mem = -1; - - if (attr != NULL) { - if (attr->name != NULL) { - name = attr->name; - } - if (attr->priority != osPriorityNone) { - prio = (UBaseType_t)attr->priority; - } - - if ((prio < osPriorityIdle) || (prio > osPriorityISR) || ((attr->attr_bits & osThreadJoinable) == osThreadJoinable)) { - return (NULL); - } - - if (attr->stack_size > 0U) { - /* In FreeRTOS stack is not in bytes, but in sizeof(StackType_t) which is 4 on ARM ports. */ - /* Stack size should be therefore 4 byte aligned in order to avoid division caused side effects */ - stack = attr->stack_size / sizeof(StackType_t); - } - - if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(StaticTask_t)) && - (attr->stack_mem != NULL) && (attr->stack_size > 0U)) { - mem = 1; - } - else { - if ((attr->cb_mem == NULL) && (attr->cb_size == 0U) && (attr->stack_mem == NULL)) { - mem = 0; - } - } - } - else { - mem = 0; - } - - if (mem == 1) { - #if (configSUPPORT_STATIC_ALLOCATION == 1) - hTask = xTaskCreateStatic ((TaskFunction_t)func, name, stack, argument, prio, (StackType_t *)attr->stack_mem, - (StaticTask_t *)attr->cb_mem); - #endif - } - else { - if (mem == 0) { - #if (configSUPPORT_DYNAMIC_ALLOCATION == 1) - if (xTaskCreate ((TaskFunction_t)func, name, (uint16_t)stack, argument, prio, &hTask) != pdPASS) { - hTask = NULL; - } - #endif - } - } - } - - return ((osThreadId_t)hTask); -} - -const char *osThreadGetName (osThreadId_t thread_id) { - TaskHandle_t hTask = (TaskHandle_t)thread_id; - const char *name; - - if (IS_IRQ() || (hTask == NULL)) { - name = NULL; - } else { - name = pcTaskGetName (hTask); - } - - return (name); -} - -osThreadId_t osThreadGetId (void) { - osThreadId_t id; - - id = (osThreadId_t)xTaskGetCurrentTaskHandle(); - - return (id); -} - -osThreadState_t osThreadGetState (osThreadId_t thread_id) { - TaskHandle_t hTask = (TaskHandle_t)thread_id; - osThreadState_t state; - - if (IS_IRQ() || (hTask == NULL)) { - state = osThreadError; - } - else { - switch (eTaskGetState (hTask)) { - case eRunning: state = osThreadRunning; break; - case eReady: state = osThreadReady; break; - case eBlocked: - case eSuspended: state = osThreadBlocked; break; - case eDeleted: state = osThreadTerminated; break; - case eInvalid: - default: state = osThreadError; break; - } - } - - return (state); -} - -uint32_t osThreadGetStackSpace (osThreadId_t thread_id) { - TaskHandle_t hTask = (TaskHandle_t)thread_id; - uint32_t sz; - - if (IS_IRQ() || (hTask == NULL)) { - sz = 0U; - } else { - sz = (uint32_t)(uxTaskGetStackHighWaterMark(hTask) * sizeof(StackType_t)); - } - - return (sz); -} - -osStatus_t osThreadSetPriority (osThreadId_t thread_id, osPriority_t priority) { - TaskHandle_t hTask = (TaskHandle_t)thread_id; - osStatus_t stat; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else if ((hTask == NULL) || (priority < osPriorityIdle) || (priority > osPriorityISR)) { - stat = osErrorParameter; - } - else { - stat = osOK; - vTaskPrioritySet (hTask, (UBaseType_t)priority); - } - - return (stat); -} - -osPriority_t osThreadGetPriority (osThreadId_t thread_id) { - TaskHandle_t hTask = (TaskHandle_t)thread_id; - osPriority_t prio; - - if (IS_IRQ() || (hTask == NULL)) { - prio = osPriorityError; - } else { - prio = (osPriority_t)((int32_t)uxTaskPriorityGet (hTask)); - } - - return (prio); -} - -osStatus_t osThreadYield (void) { - osStatus_t stat; - - if (IS_IRQ()) { - stat = osErrorISR; - } else { - stat = osOK; - taskYIELD(); - } - - return (stat); -} - -#if (configUSE_OS2_THREAD_SUSPEND_RESUME == 1) -osStatus_t osThreadSuspend (osThreadId_t thread_id) { - TaskHandle_t hTask = (TaskHandle_t)thread_id; - osStatus_t stat; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else if (hTask == NULL) { - stat = osErrorParameter; - } - else { - stat = osOK; - vTaskSuspend (hTask); - } - - return (stat); -} - -osStatus_t osThreadResume (osThreadId_t thread_id) { - TaskHandle_t hTask = (TaskHandle_t)thread_id; - osStatus_t stat; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else if (hTask == NULL) { - stat = osErrorParameter; - } - else { - stat = osOK; - vTaskResume (hTask); - } - - return (stat); -} -#endif /* (configUSE_OS2_THREAD_SUSPEND_RESUME == 1) */ - -__NO_RETURN void osThreadExit (void) { -#ifndef USE_FreeRTOS_HEAP_1 - vTaskDelete (NULL); -#endif - for (;;); -} - -osStatus_t osThreadTerminate (osThreadId_t thread_id) { - TaskHandle_t hTask = (TaskHandle_t)thread_id; - osStatus_t stat; -#ifndef USE_FreeRTOS_HEAP_1 - eTaskState tstate; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else if (hTask == NULL) { - stat = osErrorParameter; - } - else { - tstate = eTaskGetState (hTask); - - if (tstate != eDeleted) { - stat = osOK; - vTaskDelete (hTask); - } else { - stat = osErrorResource; - } - } -#else - stat = osError; -#endif - - return (stat); -} - -uint32_t osThreadGetCount (void) { - uint32_t count; - - if (IS_IRQ()) { - count = 0U; - } else { - count = uxTaskGetNumberOfTasks(); - } - - return (count); -} - -#if (configUSE_OS2_THREAD_ENUMERATE == 1) -uint32_t osThreadEnumerate (osThreadId_t *thread_array, uint32_t array_items) { - uint32_t i, count; - TaskStatus_t *task; - - if (IS_IRQ() || (thread_array == NULL) || (array_items == 0U)) { - count = 0U; - } else { - vTaskSuspendAll(); - - count = uxTaskGetNumberOfTasks(); - task = pvPortMalloc (count * sizeof(TaskStatus_t)); - - if (task != NULL) { - count = uxTaskGetSystemState (task, count, NULL); - - for (i = 0U; (i < count) && (i < array_items); i++) { - thread_array[i] = (osThreadId_t)task[i].xHandle; - } - count = i; - } - (void)xTaskResumeAll(); - - vPortFree (task); - } - - return (count); -} -#endif /* (configUSE_OS2_THREAD_ENUMERATE == 1) */ - -#if (configUSE_OS2_THREAD_FLAGS == 1) -uint32_t osThreadFlagsSet (osThreadId_t thread_id, uint32_t flags) { - TaskHandle_t hTask = (TaskHandle_t)thread_id; - uint32_t rflags; - BaseType_t yield; - - if ((hTask == NULL) || ((flags & THREAD_FLAGS_INVALID_BITS) != 0U)) { - rflags = (uint32_t)osErrorParameter; - } - else { - rflags = (uint32_t)osError; - - if (IS_IRQ()) { - yield = pdFALSE; - - (void)xTaskNotifyFromISR (hTask, flags, eSetBits, &yield); - (void)xTaskNotifyAndQueryFromISR (hTask, 0, eNoAction, &rflags, NULL); - - portYIELD_FROM_ISR (yield); - } - else { - (void)xTaskNotify (hTask, flags, eSetBits); - (void)xTaskNotifyAndQuery (hTask, 0, eNoAction, &rflags); - } - } - /* Return flags after setting */ - return (rflags); -} - -uint32_t osThreadFlagsClear (uint32_t flags) { - TaskHandle_t hTask; - uint32_t rflags, cflags; - - if (IS_IRQ()) { - rflags = (uint32_t)osErrorISR; - } - else if ((flags & THREAD_FLAGS_INVALID_BITS) != 0U) { - rflags = (uint32_t)osErrorParameter; - } - else { - hTask = xTaskGetCurrentTaskHandle(); - - if (xTaskNotifyAndQuery (hTask, 0, eNoAction, &cflags) == pdPASS) { - rflags = cflags; - cflags &= ~flags; - - if (xTaskNotify (hTask, cflags, eSetValueWithOverwrite) != pdPASS) { - rflags = (uint32_t)osError; - } - } - else { - rflags = (uint32_t)osError; - } - } - - /* Return flags before clearing */ - return (rflags); -} - -uint32_t osThreadFlagsGet (void) { - TaskHandle_t hTask; - uint32_t rflags; - - if (IS_IRQ()) { - rflags = (uint32_t)osErrorISR; - } - else { - hTask = xTaskGetCurrentTaskHandle(); - - if (xTaskNotifyAndQuery (hTask, 0, eNoAction, &rflags) != pdPASS) { - rflags = (uint32_t)osError; - } - } - - return (rflags); -} - -uint32_t osThreadFlagsWait (uint32_t flags, uint32_t options, uint32_t timeout) { - uint32_t rflags, nval; - uint32_t clear; - TickType_t t0, td, tout; - BaseType_t rval; - - if (IS_IRQ()) { - rflags = (uint32_t)osErrorISR; - } - else if ((flags & THREAD_FLAGS_INVALID_BITS) != 0U) { - rflags = (uint32_t)osErrorParameter; - } - else { - if ((options & osFlagsNoClear) == osFlagsNoClear) { - clear = 0U; - } else { - clear = flags; - } - - rflags = 0U; - tout = timeout; - - t0 = xTaskGetTickCount(); - do { - rval = xTaskNotifyWait (0, clear, &nval, tout); - - if (rval == pdPASS) { - rflags &= flags; - rflags |= nval; - - if ((options & osFlagsWaitAll) == osFlagsWaitAll) { - if ((flags & rflags) == flags) { - break; - } else { - if (timeout == 0U) { - rflags = (uint32_t)osErrorResource; - break; - } - } - } - else { - if ((flags & rflags) != 0) { - break; - } else { - if (timeout == 0U) { - rflags = (uint32_t)osErrorResource; - break; - } - } - } - - /* Update timeout */ - td = xTaskGetTickCount() - t0; - - if (td > tout) { - tout = 0; - } else { - tout -= td; - } - } - else { - if (timeout == 0) { - rflags = (uint32_t)osErrorResource; - } else { - rflags = (uint32_t)osErrorTimeout; - } - } - } - while (rval != pdFAIL); - } - - /* Return flags before clearing */ - return (rflags); -} -#endif /* (configUSE_OS2_THREAD_FLAGS == 1) */ - -osStatus_t osDelay (uint32_t ticks) { - osStatus_t stat; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else { - stat = osOK; - - if (ticks != 0U) { - vTaskDelay(ticks); - } - } - - return (stat); -} - -osStatus_t osDelayUntil (uint32_t ticks) { - TickType_t tcnt, delay; - osStatus_t stat; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else { - stat = osOK; - tcnt = xTaskGetTickCount(); - - /* Determine remaining number of ticks to delay */ - delay = (TickType_t)ticks - tcnt; - - /* Check if target tick has not expired */ - if((delay != 0U) && (0 == (delay >> (8 * sizeof(TickType_t) - 1)))) { - vTaskDelayUntil (&tcnt, delay); - } - else - { - /* No delay or already expired */ - stat = osErrorParameter; - } - } - - return (stat); -} - -/*---------------------------------------------------------------------------*/ -#if (configUSE_OS2_TIMER == 1) - -static void TimerCallback (TimerHandle_t hTimer) { - TimerCallback_t *callb; - - callb = (TimerCallback_t *)pvTimerGetTimerID (hTimer); - - if (callb != NULL) { - callb->func (callb->arg); - } -} - -osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr) { - const char *name; - TimerHandle_t hTimer; - TimerCallback_t *callb; - UBaseType_t reload; - int32_t mem; - - hTimer = NULL; - - if (!IS_IRQ() && (func != NULL)) { - /* Allocate memory to store callback function and argument */ - callb = pvPortMalloc (sizeof(TimerCallback_t)); - - if (callb != NULL) { - callb->func = func; - callb->arg = argument; - - if (type == osTimerOnce) { - reload = pdFALSE; - } else { - reload = pdTRUE; - } - - mem = -1; - name = NULL; - - if (attr != NULL) { - if (attr->name != NULL) { - name = attr->name; - } - - if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(StaticTimer_t))) { - mem = 1; - } - else { - if ((attr->cb_mem == NULL) && (attr->cb_size == 0U)) { - mem = 0; - } - } - } - else { - mem = 0; - } - - if (mem == 1) { - #if (configSUPPORT_STATIC_ALLOCATION == 1) - hTimer = xTimerCreateStatic (name, 1, reload, callb, TimerCallback, (StaticTimer_t *)attr->cb_mem); - #endif - } - else { - if (mem == 0) { - #if (configSUPPORT_DYNAMIC_ALLOCATION == 1) - hTimer = xTimerCreate (name, 1, reload, callb, TimerCallback); - #endif - } - } - - if ((hTimer == NULL) && (callb != NULL)) { - vPortFree (callb); - } - } - } - - return ((osTimerId_t)hTimer); -} - -const char *osTimerGetName (osTimerId_t timer_id) { - TimerHandle_t hTimer = (TimerHandle_t)timer_id; - const char *p; - - if (IS_IRQ() || (hTimer == NULL)) { - p = NULL; - } else { - p = pcTimerGetName (hTimer); - } - - return (p); -} - -osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks) { - TimerHandle_t hTimer = (TimerHandle_t)timer_id; - osStatus_t stat; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else if (hTimer == NULL) { - stat = osErrorParameter; - } - else { - if (xTimerChangePeriod (hTimer, ticks, 0) == pdPASS) { - stat = osOK; - } else { - stat = osErrorResource; - } - } - - return (stat); -} - -osStatus_t osTimerStop (osTimerId_t timer_id) { - TimerHandle_t hTimer = (TimerHandle_t)timer_id; - osStatus_t stat; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else if (hTimer == NULL) { - stat = osErrorParameter; - } - else { - if (xTimerIsTimerActive (hTimer) == pdFALSE) { - stat = osErrorResource; - } - else { - if (xTimerStop (hTimer, 0) == pdPASS) { - stat = osOK; - } else { - stat = osError; - } - } - } - - return (stat); -} - -uint32_t osTimerIsRunning (osTimerId_t timer_id) { - TimerHandle_t hTimer = (TimerHandle_t)timer_id; - uint32_t running; - - if (IS_IRQ() || (hTimer == NULL)) { - running = 0U; - } else { - running = (uint32_t)xTimerIsTimerActive (hTimer); - } - - return (running); -} - -osStatus_t osTimerDelete (osTimerId_t timer_id) { - TimerHandle_t hTimer = (TimerHandle_t)timer_id; - osStatus_t stat; -#ifndef USE_FreeRTOS_HEAP_1 - TimerCallback_t *callb; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else if (hTimer == NULL) { - stat = osErrorParameter; - } - else { - callb = (TimerCallback_t *)pvTimerGetTimerID (hTimer); - - if (xTimerDelete (hTimer, 0) == pdPASS) { - vPortFree (callb); - stat = osOK; - } else { - stat = osErrorResource; - } - } -#else - stat = osError; -#endif - - return (stat); -} -#endif /* (configUSE_OS2_TIMER == 1) */ - -/*---------------------------------------------------------------------------*/ - -osEventFlagsId_t osEventFlagsNew (const osEventFlagsAttr_t *attr) { - EventGroupHandle_t hEventGroup; - int32_t mem; - - hEventGroup = NULL; - - if (!IS_IRQ()) { - mem = -1; - - if (attr != NULL) { - if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(StaticEventGroup_t))) { - mem = 1; - } - else { - if ((attr->cb_mem == NULL) && (attr->cb_size == 0U)) { - mem = 0; - } - } - } - else { - mem = 0; - } - - if (mem == 1) { - #if (configSUPPORT_STATIC_ALLOCATION == 1) - hEventGroup = xEventGroupCreateStatic (attr->cb_mem); - #endif - } - else { - if (mem == 0) { - #if (configSUPPORT_DYNAMIC_ALLOCATION == 1) - hEventGroup = xEventGroupCreate(); - #endif - } - } - } - - return ((osEventFlagsId_t)hEventGroup); -} - -uint32_t osEventFlagsSet (osEventFlagsId_t ef_id, uint32_t flags) { - EventGroupHandle_t hEventGroup = (EventGroupHandle_t)ef_id; - uint32_t rflags; - BaseType_t yield; - - if ((hEventGroup == NULL) || ((flags & EVENT_FLAGS_INVALID_BITS) != 0U)) { - rflags = (uint32_t)osErrorParameter; - } - else if (IS_IRQ()) { - #if (configUSE_OS2_EVENTFLAGS_FROM_ISR == 0) - (void)yield; - /* Enable timers and xTimerPendFunctionCall function to support osEventFlagsSet from ISR */ - rflags = (uint32_t)osErrorResource; - #else - yield = pdFALSE; - - if (xEventGroupSetBitsFromISR (hEventGroup, (EventBits_t)flags, &yield) == pdFAIL) { - rflags = (uint32_t)osErrorResource; - } else { - rflags = flags; - portYIELD_FROM_ISR (yield); - } - #endif - } - else { - rflags = xEventGroupSetBits (hEventGroup, (EventBits_t)flags); - } - - return (rflags); -} - -uint32_t osEventFlagsClear (osEventFlagsId_t ef_id, uint32_t flags) { - EventGroupHandle_t hEventGroup = (EventGroupHandle_t)ef_id; - uint32_t rflags; - - if ((hEventGroup == NULL) || ((flags & EVENT_FLAGS_INVALID_BITS) != 0U)) { - rflags = (uint32_t)osErrorParameter; - } - else if (IS_IRQ()) { - #if (configUSE_OS2_EVENTFLAGS_FROM_ISR == 0) - /* Enable timers and xTimerPendFunctionCall function to support osEventFlagsSet from ISR */ - rflags = (uint32_t)osErrorResource; - #else - rflags = xEventGroupGetBitsFromISR (hEventGroup); - - if (xEventGroupClearBitsFromISR (hEventGroup, (EventBits_t)flags) == pdFAIL) { - rflags = (uint32_t)osErrorResource; - } - #endif - } - else { - rflags = xEventGroupClearBits (hEventGroup, (EventBits_t)flags); - } - - return (rflags); -} - -uint32_t osEventFlagsGet (osEventFlagsId_t ef_id) { - EventGroupHandle_t hEventGroup = (EventGroupHandle_t)ef_id; - uint32_t rflags; - - if (ef_id == NULL) { - rflags = 0U; - } - else if (IS_IRQ()) { - rflags = xEventGroupGetBitsFromISR (hEventGroup); - } - else { - rflags = xEventGroupGetBits (hEventGroup); - } - - return (rflags); -} - -uint32_t osEventFlagsWait (osEventFlagsId_t ef_id, uint32_t flags, uint32_t options, uint32_t timeout) { - EventGroupHandle_t hEventGroup = (EventGroupHandle_t)ef_id; - BaseType_t wait_all; - BaseType_t exit_clr; - uint32_t rflags; - - if ((hEventGroup == NULL) || ((flags & EVENT_FLAGS_INVALID_BITS) != 0U)) { - rflags = (uint32_t)osErrorParameter; - } - else if (IS_IRQ()) { - rflags = (uint32_t)osErrorISR; - } - else { - if (options & osFlagsWaitAll) { - wait_all = pdTRUE; - } else { - wait_all = pdFAIL; - } - - if (options & osFlagsNoClear) { - exit_clr = pdFAIL; - } else { - exit_clr = pdTRUE; - } - - rflags = xEventGroupWaitBits (hEventGroup, (EventBits_t)flags, exit_clr, wait_all, (TickType_t)timeout); - - if (options & osFlagsWaitAll) { - if ((flags & rflags) != flags) { - if (timeout > 0U) { - rflags = (uint32_t)osErrorTimeout; - } else { - rflags = (uint32_t)osErrorResource; - } - } - } - else { - if ((flags & rflags) == 0U) { - if (timeout > 0U) { - rflags = (uint32_t)osErrorTimeout; - } else { - rflags = (uint32_t)osErrorResource; - } - } - } - } - - return (rflags); -} - -osStatus_t osEventFlagsDelete (osEventFlagsId_t ef_id) { - EventGroupHandle_t hEventGroup = (EventGroupHandle_t)ef_id; - osStatus_t stat; - -#ifndef USE_FreeRTOS_HEAP_1 - if (IS_IRQ()) { - stat = osErrorISR; - } - else if (hEventGroup == NULL) { - stat = osErrorParameter; - } - else { - stat = osOK; - vEventGroupDelete (hEventGroup); - } -#else - stat = osError; -#endif - - return (stat); -} - -/*---------------------------------------------------------------------------*/ -#if (configUSE_OS2_MUTEX == 1) - -osMutexId_t osMutexNew (const osMutexAttr_t *attr) { - SemaphoreHandle_t hMutex; - uint32_t type; - uint32_t rmtx; - int32_t mem; - #if (configQUEUE_REGISTRY_SIZE > 0) - const char *name; - #endif - - hMutex = NULL; - - if (!IS_IRQ()) { - if (attr != NULL) { - type = attr->attr_bits; - } else { - type = 0U; - } - - if ((type & osMutexRecursive) == osMutexRecursive) { - rmtx = 1U; - } else { - rmtx = 0U; - } - - if ((type & osMutexRobust) != osMutexRobust) { - mem = -1; - - if (attr != NULL) { - if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(StaticSemaphore_t))) { - mem = 1; - } - else { - if ((attr->cb_mem == NULL) && (attr->cb_size == 0U)) { - mem = 0; - } - } - } - else { - mem = 0; - } - - if (mem == 1) { - #if (configSUPPORT_STATIC_ALLOCATION == 1) - if (rmtx != 0U) { - #if (configUSE_RECURSIVE_MUTEXES == 1) - hMutex = xSemaphoreCreateRecursiveMutexStatic (attr->cb_mem); - #endif - } - else { - hMutex = xSemaphoreCreateMutexStatic (attr->cb_mem); - } - #endif - } - else { - if (mem == 0) { - #if (configSUPPORT_DYNAMIC_ALLOCATION == 1) - if (rmtx != 0U) { - #if (configUSE_RECURSIVE_MUTEXES == 1) - hMutex = xSemaphoreCreateRecursiveMutex (); - #endif - } else { - hMutex = xSemaphoreCreateMutex (); - } - #endif - } - } - - #if (configQUEUE_REGISTRY_SIZE > 0) - if (hMutex != NULL) { - if (attr != NULL) { - name = attr->name; - } else { - name = NULL; - } - vQueueAddToRegistry (hMutex, name); - } - #endif - - if ((hMutex != NULL) && (rmtx != 0U)) { - hMutex = (SemaphoreHandle_t)((uint32_t)hMutex | 1U); - } - } - } - - return ((osMutexId_t)hMutex); -} - -osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout) { - SemaphoreHandle_t hMutex; - osStatus_t stat; - uint32_t rmtx; - - hMutex = (SemaphoreHandle_t)((uint32_t)mutex_id & ~1U); - - rmtx = (uint32_t)mutex_id & 1U; - - stat = osOK; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else if (hMutex == NULL) { - stat = osErrorParameter; - } - else { - if (rmtx != 0U) { - #if (configUSE_RECURSIVE_MUTEXES == 1) - if (xSemaphoreTakeRecursive (hMutex, timeout) != pdPASS) { - if (timeout != 0U) { - stat = osErrorTimeout; - } else { - stat = osErrorResource; - } - } - #endif - } - else { - if (xSemaphoreTake (hMutex, timeout) != pdPASS) { - if (timeout != 0U) { - stat = osErrorTimeout; - } else { - stat = osErrorResource; - } - } - } - } - - return (stat); -} - -osStatus_t osMutexRelease (osMutexId_t mutex_id) { - SemaphoreHandle_t hMutex; - osStatus_t stat; - uint32_t rmtx; - - hMutex = (SemaphoreHandle_t)((uint32_t)mutex_id & ~1U); - - rmtx = (uint32_t)mutex_id & 1U; - - stat = osOK; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else if (hMutex == NULL) { - stat = osErrorParameter; - } - else { - if (rmtx != 0U) { - #if (configUSE_RECURSIVE_MUTEXES == 1) - if (xSemaphoreGiveRecursive (hMutex) != pdPASS) { - stat = osErrorResource; - } - #endif - } - else { - if (xSemaphoreGive (hMutex) != pdPASS) { - stat = osErrorResource; - } - } - } - - return (stat); -} - -osThreadId_t osMutexGetOwner (osMutexId_t mutex_id) { - SemaphoreHandle_t hMutex; - osThreadId_t owner; - - hMutex = (SemaphoreHandle_t)((uint32_t)mutex_id & ~1U); - - if (IS_IRQ() || (hMutex == NULL)) { - owner = NULL; - } else { - owner = (osThreadId_t)xSemaphoreGetMutexHolder (hMutex); - } - - return (owner); -} - -osStatus_t osMutexDelete (osMutexId_t mutex_id) { - osStatus_t stat; -#ifndef USE_FreeRTOS_HEAP_1 - SemaphoreHandle_t hMutex; - - hMutex = (SemaphoreHandle_t)((uint32_t)mutex_id & ~1U); - - if (IS_IRQ()) { - stat = osErrorISR; - } - else if (hMutex == NULL) { - stat = osErrorParameter; - } - else { - #if (configQUEUE_REGISTRY_SIZE > 0) - vQueueUnregisterQueue (hMutex); - #endif - stat = osOK; - vSemaphoreDelete (hMutex); - } -#else - stat = osError; -#endif - - return (stat); -} -#endif /* (configUSE_OS2_MUTEX == 1) */ - -/*---------------------------------------------------------------------------*/ - -osSemaphoreId_t osSemaphoreNew (uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr) { - SemaphoreHandle_t hSemaphore; - int32_t mem; - #if (configQUEUE_REGISTRY_SIZE > 0) - const char *name; - #endif - - hSemaphore = NULL; - - if (!IS_IRQ() && (max_count > 0U) && (initial_count <= max_count)) { - mem = -1; - - if (attr != NULL) { - if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(StaticSemaphore_t))) { - mem = 1; - } - else { - if ((attr->cb_mem == NULL) && (attr->cb_size == 0U)) { - mem = 0; - } - } - } - else { - mem = 0; - } - - if (mem != -1) { - if (max_count == 1U) { - if (mem == 1) { - #if (configSUPPORT_STATIC_ALLOCATION == 1) - hSemaphore = xSemaphoreCreateBinaryStatic ((StaticSemaphore_t *)attr->cb_mem); - #endif - } - else { - #if (configSUPPORT_DYNAMIC_ALLOCATION == 1) - hSemaphore = xSemaphoreCreateBinary(); - #endif - } - - if ((hSemaphore != NULL) && (initial_count != 0U)) { - if (xSemaphoreGive (hSemaphore) != pdPASS) { - vSemaphoreDelete (hSemaphore); - hSemaphore = NULL; - } - } - } - else { - if (mem == 1) { - #if (configSUPPORT_STATIC_ALLOCATION == 1) - hSemaphore = xSemaphoreCreateCountingStatic (max_count, initial_count, (StaticSemaphore_t *)attr->cb_mem); - #endif - } - else { - #if (configSUPPORT_DYNAMIC_ALLOCATION == 1) - hSemaphore = xSemaphoreCreateCounting (max_count, initial_count); - #endif - } - } - - #if (configQUEUE_REGISTRY_SIZE > 0) - if (hSemaphore != NULL) { - if (attr != NULL) { - name = attr->name; - } else { - name = NULL; - } - vQueueAddToRegistry (hSemaphore, name); - } - #endif - } - } - - return ((osSemaphoreId_t)hSemaphore); -} - -osStatus_t osSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout) { - SemaphoreHandle_t hSemaphore = (SemaphoreHandle_t)semaphore_id; - osStatus_t stat; - BaseType_t yield; - - stat = osOK; - - if (hSemaphore == NULL) { - stat = osErrorParameter; - } - else if (IS_IRQ()) { - if (timeout != 0U) { - stat = osErrorParameter; - } - else { - yield = pdFALSE; - - if (xSemaphoreTakeFromISR (hSemaphore, &yield) != pdPASS) { - stat = osErrorResource; - } else { - portYIELD_FROM_ISR (yield); - } - } - } - else { - if (xSemaphoreTake (hSemaphore, (TickType_t)timeout) != pdPASS) { - if (timeout != 0U) { - stat = osErrorTimeout; - } else { - stat = osErrorResource; - } - } - } - - return (stat); -} - -osStatus_t osSemaphoreRelease (osSemaphoreId_t semaphore_id) { - SemaphoreHandle_t hSemaphore = (SemaphoreHandle_t)semaphore_id; - osStatus_t stat; - BaseType_t yield; - - stat = osOK; - - if (hSemaphore == NULL) { - stat = osErrorParameter; - } - else if (IS_IRQ()) { - yield = pdFALSE; - - if (xSemaphoreGiveFromISR (hSemaphore, &yield) != pdTRUE) { - stat = osErrorResource; - } else { - portYIELD_FROM_ISR (yield); - } - } - else { - if (xSemaphoreGive (hSemaphore) != pdPASS) { - stat = osErrorResource; - } - } - - return (stat); -} - -uint32_t osSemaphoreGetCount (osSemaphoreId_t semaphore_id) { - SemaphoreHandle_t hSemaphore = (SemaphoreHandle_t)semaphore_id; - uint32_t count; - - if (hSemaphore == NULL) { - count = 0U; - } - else if (IS_IRQ()) { - count = uxQueueMessagesWaitingFromISR (hSemaphore); - } else { - count = (uint32_t)uxSemaphoreGetCount (hSemaphore); - } - - return (count); -} - -osStatus_t osSemaphoreDelete (osSemaphoreId_t semaphore_id) { - SemaphoreHandle_t hSemaphore = (SemaphoreHandle_t)semaphore_id; - osStatus_t stat; - -#ifndef USE_FreeRTOS_HEAP_1 - if (IS_IRQ()) { - stat = osErrorISR; - } - else if (hSemaphore == NULL) { - stat = osErrorParameter; - } - else { - #if (configQUEUE_REGISTRY_SIZE > 0) - vQueueUnregisterQueue (hSemaphore); - #endif - - stat = osOK; - vSemaphoreDelete (hSemaphore); - } -#else - stat = osError; -#endif - - return (stat); -} - -/*---------------------------------------------------------------------------*/ - -osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr) { - QueueHandle_t hQueue; - int32_t mem; - #if (configQUEUE_REGISTRY_SIZE > 0) - const char *name; - #endif - - hQueue = NULL; - - if (!IS_IRQ() && (msg_count > 0U) && (msg_size > 0U)) { - mem = -1; - - if (attr != NULL) { - if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(StaticQueue_t)) && - (attr->mq_mem != NULL) && (attr->mq_size >= (msg_count * msg_size))) { - mem = 1; - } - else { - if ((attr->cb_mem == NULL) && (attr->cb_size == 0U) && - (attr->mq_mem == NULL) && (attr->mq_size == 0U)) { - mem = 0; - } - } - } - else { - mem = 0; - } - - if (mem == 1) { - #if (configSUPPORT_STATIC_ALLOCATION == 1) - hQueue = xQueueCreateStatic (msg_count, msg_size, attr->mq_mem, attr->cb_mem); - #endif - } - else { - if (mem == 0) { - #if (configSUPPORT_DYNAMIC_ALLOCATION == 1) - hQueue = xQueueCreate (msg_count, msg_size); - #endif - } - } - - #if (configQUEUE_REGISTRY_SIZE > 0) - if (hQueue != NULL) { - if (attr != NULL) { - name = attr->name; - } else { - name = NULL; - } - vQueueAddToRegistry (hQueue, name); - } - #endif - - } - - return ((osMessageQueueId_t)hQueue); -} - -osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout) { - QueueHandle_t hQueue = (QueueHandle_t)mq_id; - osStatus_t stat; - BaseType_t yield; - - (void)msg_prio; /* Message priority is ignored */ - - stat = osOK; - - if (IS_IRQ()) { - if ((hQueue == NULL) || (msg_ptr == NULL) || (timeout != 0U)) { - stat = osErrorParameter; - } - else { - yield = pdFALSE; - - if (xQueueSendToBackFromISR (hQueue, msg_ptr, &yield) != pdTRUE) { - stat = osErrorResource; - } else { - portYIELD_FROM_ISR (yield); - } - } - } - else { - if ((hQueue == NULL) || (msg_ptr == NULL)) { - stat = osErrorParameter; - } - else { - if (xQueueSendToBack (hQueue, msg_ptr, (TickType_t)timeout) != pdPASS) { - if (timeout != 0U) { - stat = osErrorTimeout; - } else { - stat = osErrorResource; - } - } - } - } - - return (stat); -} - -osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout) { - QueueHandle_t hQueue = (QueueHandle_t)mq_id; - osStatus_t stat; - BaseType_t yield; - - (void)msg_prio; /* Message priority is ignored */ - - stat = osOK; - - if (IS_IRQ()) { - if ((hQueue == NULL) || (msg_ptr == NULL) || (timeout != 0U)) { - stat = osErrorParameter; - } - else { - yield = pdFALSE; - - if (xQueueReceiveFromISR (hQueue, msg_ptr, &yield) != pdPASS) { - stat = osErrorResource; - } else { - portYIELD_FROM_ISR (yield); - } - } - } - else { - if ((hQueue == NULL) || (msg_ptr == NULL)) { - stat = osErrorParameter; - } - else { - if (xQueueReceive (hQueue, msg_ptr, (TickType_t)timeout) != pdPASS) { - if (timeout != 0U) { - stat = osErrorTimeout; - } else { - stat = osErrorResource; - } - } - } - } - - return (stat); -} - -uint32_t osMessageQueueGetCapacity (osMessageQueueId_t mq_id) { - StaticQueue_t *mq = (StaticQueue_t *)mq_id; - uint32_t capacity; - - if (mq == NULL) { - capacity = 0U; - } else { - /* capacity = pxQueue->uxLength */ - capacity = mq->uxDummy4[1]; - } - - return (capacity); -} - -uint32_t osMessageQueueGetMsgSize (osMessageQueueId_t mq_id) { - StaticQueue_t *mq = (StaticQueue_t *)mq_id; - uint32_t size; - - if (mq == NULL) { - size = 0U; - } else { - /* size = pxQueue->uxItemSize */ - size = mq->uxDummy4[2]; - } - - return (size); -} - -uint32_t osMessageQueueGetCount (osMessageQueueId_t mq_id) { - QueueHandle_t hQueue = (QueueHandle_t)mq_id; - UBaseType_t count; - - if (hQueue == NULL) { - count = 0U; - } - else if (IS_IRQ()) { - count = uxQueueMessagesWaitingFromISR (hQueue); - } - else { - count = uxQueueMessagesWaiting (hQueue); - } - - return ((uint32_t)count); -} - -uint32_t osMessageQueueGetSpace (osMessageQueueId_t mq_id) { - StaticQueue_t *mq = (StaticQueue_t *)mq_id; - uint32_t space; - uint32_t isrm; - - if (mq == NULL) { - space = 0U; - } - else if (IS_IRQ()) { - isrm = taskENTER_CRITICAL_FROM_ISR(); - - /* space = pxQueue->uxLength - pxQueue->uxMessagesWaiting; */ - space = mq->uxDummy4[1] - mq->uxDummy4[0]; - - taskEXIT_CRITICAL_FROM_ISR(isrm); - } - else { - space = (uint32_t)uxQueueSpacesAvailable ((QueueHandle_t)mq); - } - - return (space); -} - -osStatus_t osMessageQueueReset (osMessageQueueId_t mq_id) { - QueueHandle_t hQueue = (QueueHandle_t)mq_id; - osStatus_t stat; - - if (IS_IRQ()) { - stat = osErrorISR; - } - else if (hQueue == NULL) { - stat = osErrorParameter; - } - else { - stat = osOK; - (void)xQueueReset (hQueue); - } - - return (stat); -} - -osStatus_t osMessageQueueDelete (osMessageQueueId_t mq_id) { - QueueHandle_t hQueue = (QueueHandle_t)mq_id; - osStatus_t stat; - -#ifndef USE_FreeRTOS_HEAP_1 - if (IS_IRQ()) { - stat = osErrorISR; - } - else if (hQueue == NULL) { - stat = osErrorParameter; - } - else { - #if (configQUEUE_REGISTRY_SIZE > 0) - vQueueUnregisterQueue (hQueue); - #endif - - stat = osOK; - vQueueDelete (hQueue); - } -#else - stat = osError; -#endif - - return (stat); -} - -/*---------------------------------------------------------------------------*/ -#ifdef FREERTOS_MPOOL_H_ - -/* Static memory pool functions */ -static void FreeBlock (MemPool_t *mp, void *block); -static void *AllocBlock (MemPool_t *mp); -static void *CreateBlock (MemPool_t *mp); - -osMemoryPoolId_t osMemoryPoolNew (uint32_t block_count, uint32_t block_size, const osMemoryPoolAttr_t *attr) { - MemPool_t *mp; - const char *name; - int32_t mem_cb, mem_mp; - uint32_t sz; - - if (IS_IRQ()) { - mp = NULL; - } - else if ((block_count == 0U) || (block_size == 0U)) { - mp = NULL; - } - else { - mp = NULL; - sz = MEMPOOL_ARR_SIZE (block_count, block_size); - - name = NULL; - mem_cb = -1; - mem_mp = -1; - - if (attr != NULL) { - if (attr->name != NULL) { - name = attr->name; - } - - if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(MemPool_t))) { - /* Static control block is provided */ - mem_cb = 1; - } - else if ((attr->cb_mem == NULL) && (attr->cb_size == 0U)) { - /* Allocate control block memory on heap */ - mem_cb = 0; - } - - if ((attr->mp_mem == NULL) && (attr->mp_size == 0U)) { - /* Allocate memory array on heap */ - mem_mp = 0; - } - else { - if (attr->mp_mem != NULL) { - /* Check if array is 4-byte aligned */ - if (((uint32_t)attr->mp_mem & 3U) == 0U) { - /* Check if array big enough */ - if (attr->mp_size >= sz) { - /* Static memory pool array is provided */ - mem_mp = 1; - } - } - } - } - } - else { - /* Attributes not provided, allocate memory on heap */ - mem_cb = 0; - mem_mp = 0; - } - - if (mem_cb == 0) { - mp = pvPortMalloc (sizeof(MemPool_t)); - } else { - mp = attr->cb_mem; - } - - if (mp != NULL) { - /* Create a semaphore (max count == initial count == block_count) */ - #if (configSUPPORT_STATIC_ALLOCATION == 1) - mp->sem = xSemaphoreCreateCountingStatic (block_count, block_count, &mp->mem_sem); - #elif (configSUPPORT_DYNAMIC_ALLOCATION == 1) - mp->sem = xSemaphoreCreateCounting (block_count, block_count); - #else - mp->sem == NULL; - #endif - - if (mp->sem != NULL) { - /* Setup memory array */ - if (mem_mp == 0) { - mp->mem_arr = pvPortMalloc (sz); - } else { - mp->mem_arr = attr->mp_mem; - } - } - } - - if ((mp != NULL) && (mp->mem_arr != NULL)) { - /* Memory pool can be created */ - mp->head = NULL; - mp->mem_sz = sz; - mp->name = name; - mp->bl_sz = block_size; - mp->bl_cnt = block_count; - mp->n = 0U; - - /* Set heap allocated memory flags */ - mp->status = MPOOL_STATUS; - - if (mem_cb == 0) { - /* Control block on heap */ - mp->status |= 1U; - } - if (mem_mp == 0) { - /* Memory array on heap */ - mp->status |= 2U; - } - } - else { - /* Memory pool cannot be created, release allocated resources */ - if ((mem_cb == 0) && (mp != NULL)) { - /* Free control block memory */ - vPortFree (mp); - } - mp = NULL; - } - } - - return (mp); -} - -const char *osMemoryPoolGetName (osMemoryPoolId_t mp_id) { - MemPool_t *mp = (osMemoryPoolId_t)mp_id; - const char *p; - - if (IS_IRQ()) { - p = NULL; - } - else if (mp_id == NULL) { - p = NULL; - } - else { - p = mp->name; - } - - return (p); -} - -void *osMemoryPoolAlloc (osMemoryPoolId_t mp_id, uint32_t timeout) { - MemPool_t *mp; - void *block; - uint32_t isrm; - - if (mp_id == NULL) { - /* Invalid input parameters */ - block = NULL; - } - else { - block = NULL; - - mp = (MemPool_t *)mp_id; - - if ((mp->status & MPOOL_STATUS) == MPOOL_STATUS) { - if (IS_IRQ()) { - if (timeout == 0U) { - if (xSemaphoreTakeFromISR (mp->sem, NULL) == pdTRUE) { - if ((mp->status & MPOOL_STATUS) == MPOOL_STATUS) { - isrm = taskENTER_CRITICAL_FROM_ISR(); - - /* Get a block from the free-list */ - block = AllocBlock(mp); - - if (block == NULL) { - /* List of free blocks is empty, 'create' new block */ - block = CreateBlock(mp); - } - - taskEXIT_CRITICAL_FROM_ISR(isrm); - } - } - } - } - else { - if (xSemaphoreTake (mp->sem, (TickType_t)timeout) == pdTRUE) { - if ((mp->status & MPOOL_STATUS) == MPOOL_STATUS) { - taskENTER_CRITICAL(); - - /* Get a block from the free-list */ - block = AllocBlock(mp); - - if (block == NULL) { - /* List of free blocks is empty, 'create' new block */ - block = CreateBlock(mp); - } - - taskEXIT_CRITICAL(); - } - } - } - } - } - - return (block); -} - -osStatus_t osMemoryPoolFree (osMemoryPoolId_t mp_id, void *block) { - MemPool_t *mp; - osStatus_t stat; - uint32_t isrm; - BaseType_t yield; - - if ((mp_id == NULL) || (block == NULL)) { - /* Invalid input parameters */ - stat = osErrorParameter; - } - else { - mp = (MemPool_t *)mp_id; - - if ((mp->status & MPOOL_STATUS) != MPOOL_STATUS) { - /* Invalid object status */ - stat = osErrorResource; - } - else if ((block < (void *)&mp->mem_arr[0]) || (block > (void*)&mp->mem_arr[mp->mem_sz-1])) { - /* Block pointer outside of memory array area */ - stat = osErrorParameter; - } - else { - stat = osOK; - - if (IS_IRQ()) { - if (uxSemaphoreGetCountFromISR (mp->sem) == mp->bl_cnt) { - stat = osErrorResource; - } - else { - isrm = taskENTER_CRITICAL_FROM_ISR(); - - /* Add block to the list of free blocks */ - FreeBlock(mp, block); - - taskEXIT_CRITICAL_FROM_ISR(isrm); - - yield = pdFALSE; - xSemaphoreGiveFromISR (mp->sem, &yield); - portYIELD_FROM_ISR (yield); - } - } - else { - if (uxSemaphoreGetCount (mp->sem) == mp->bl_cnt) { - stat = osErrorResource; - } - else { - taskENTER_CRITICAL(); - - /* Add block to the list of free blocks */ - FreeBlock(mp, block); - - taskEXIT_CRITICAL(); - - xSemaphoreGive (mp->sem); - } - } - } - } - - return (stat); -} - -uint32_t osMemoryPoolGetCapacity (osMemoryPoolId_t mp_id) { - MemPool_t *mp; - uint32_t n; - - if (mp_id == NULL) { - /* Invalid input parameters */ - n = 0U; - } - else { - mp = (MemPool_t *)mp_id; - - if ((mp->status & MPOOL_STATUS) != MPOOL_STATUS) { - /* Invalid object status */ - n = 0U; - } - else { - n = mp->bl_cnt; - } - } - - /* Return maximum number of memory blocks */ - return (n); -} - -uint32_t osMemoryPoolGetBlockSize (osMemoryPoolId_t mp_id) { - MemPool_t *mp; - uint32_t sz; - - if (mp_id == NULL) { - /* Invalid input parameters */ - sz = 0U; - } - else { - mp = (MemPool_t *)mp_id; - - if ((mp->status & MPOOL_STATUS) != MPOOL_STATUS) { - /* Invalid object status */ - sz = 0U; - } - else { - sz = mp->bl_sz; - } - } - - /* Return memory block size in bytes */ - return (sz); -} - -uint32_t osMemoryPoolGetCount (osMemoryPoolId_t mp_id) { - MemPool_t *mp; - uint32_t n; - - if (mp_id == NULL) { - /* Invalid input parameters */ - n = 0U; - } - else { - mp = (MemPool_t *)mp_id; - - if ((mp->status & MPOOL_STATUS) != MPOOL_STATUS) { - /* Invalid object status */ - n = 0U; - } - else { - if (IS_IRQ()) { - n = uxSemaphoreGetCountFromISR (mp->sem); - } else { - n = uxSemaphoreGetCount (mp->sem); - } - - n = mp->bl_cnt - n; - } - } - - /* Return number of memory blocks used */ - return (n); -} - -uint32_t osMemoryPoolGetSpace (osMemoryPoolId_t mp_id) { - MemPool_t *mp; - uint32_t n; - - if (mp_id == NULL) { - /* Invalid input parameters */ - n = 0U; - } - else { - mp = (MemPool_t *)mp_id; - - if ((mp->status & MPOOL_STATUS) != MPOOL_STATUS) { - /* Invalid object status */ - n = 0U; - } - else { - if (IS_IRQ()) { - n = uxSemaphoreGetCountFromISR (mp->sem); - } else { - n = uxSemaphoreGetCount (mp->sem); - } - } - } - - /* Return number of memory blocks available */ - return (n); -} - -osStatus_t osMemoryPoolDelete (osMemoryPoolId_t mp_id) { - MemPool_t *mp; - osStatus_t stat; - - if (mp_id == NULL) { - /* Invalid input parameters */ - stat = osErrorParameter; - } - else if (IS_IRQ()) { - stat = osErrorISR; - } - else { - mp = (MemPool_t *)mp_id; - - taskENTER_CRITICAL(); - - /* Invalidate control block status */ - mp->status = mp->status & 3U; - - /* Wake-up tasks waiting for pool semaphore */ - while (xSemaphoreGive (mp->sem) == pdTRUE); - - mp->head = NULL; - mp->bl_sz = 0U; - mp->bl_cnt = 0U; - - if ((mp->status & 2U) != 0U) { - /* Memory pool array allocated on heap */ - vPortFree (mp->mem_arr); - } - if ((mp->status & 1U) != 0U) { - /* Memory pool control block allocated on heap */ - vPortFree (mp); - } - - taskEXIT_CRITICAL(); - - stat = osOK; - } - - return (stat); -} - -/* - Create new block given according to the current block index. -*/ -static void *CreateBlock (MemPool_t *mp) { - MemPoolBlock_t *p = NULL; - - if (mp->n < mp->bl_cnt) { - /* Unallocated blocks exist, set pointer to new block */ - p = (void *)(mp->mem_arr + (mp->bl_sz * mp->n)); - - /* Increment block index */ - mp->n += 1U; - } - - return (p); -} - -/* - Allocate a block by reading the list of free blocks. -*/ -static void *AllocBlock (MemPool_t *mp) { - MemPoolBlock_t *p = NULL; - - if (mp->head != NULL) { - /* List of free block exists, get head block */ - p = mp->head; - - /* Head block is now next on the list */ - mp->head = p->next; - } - - return (p); -} - -/* - Free block by putting it to the list of free blocks. -*/ -static void FreeBlock (MemPool_t *mp, void *block) { - MemPoolBlock_t *p = block; - - /* Store current head into block memory space */ - p->next = mp->head; - - /* Store current block as new head */ - mp->head = p; -} -#endif /* FREERTOS_MPOOL_H_ */ -/*---------------------------------------------------------------------------*/ - -/* Callback function prototypes */ -extern void vApplicationIdleHook (void); -extern void vApplicationTickHook (void); -extern void vApplicationMallocFailedHook (void); -extern void vApplicationDaemonTaskStartupHook (void); -extern void vApplicationStackOverflowHook (TaskHandle_t xTask, signed char *pcTaskName); - -/** - Dummy implementation of the callback function vApplicationIdleHook(). -*/ -#if (configUSE_IDLE_HOOK == 1) -__WEAK void vApplicationIdleHook (void){} -#endif - -/** - Dummy implementation of the callback function vApplicationTickHook(). -*/ -#if (configUSE_TICK_HOOK == 1) - __WEAK void vApplicationTickHook (void){} -#endif - -/** - Dummy implementation of the callback function vApplicationMallocFailedHook(). -*/ -#if (configUSE_MALLOC_FAILED_HOOK == 1) -__WEAK void vApplicationMallocFailedHook (void){} -#endif - -/** - Dummy implementation of the callback function vApplicationDaemonTaskStartupHook(). -*/ -#if (configUSE_DAEMON_TASK_STARTUP_HOOK == 1) -__WEAK void vApplicationDaemonTaskStartupHook (void){} -#endif - -/** - Dummy implementation of the callback function vApplicationStackOverflowHook(). -*/ -#if (configCHECK_FOR_STACK_OVERFLOW > 0) -__WEAK void vApplicationStackOverflowHook (TaskHandle_t xTask, signed char *pcTaskName) { - (void)xTask; - (void)pcTaskName; - configASSERT(0); -} -#endif - -/*---------------------------------------------------------------------------*/ -#if (configSUPPORT_STATIC_ALLOCATION == 1) -/* External Idle and Timer task static memory allocation functions */ -extern void vApplicationGetIdleTaskMemory (StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize); -extern void vApplicationGetTimerTaskMemory (StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize); - -/* - vApplicationGetIdleTaskMemory gets called when configSUPPORT_STATIC_ALLOCATION - equals to 1 and is required for static memory allocation support. -*/ -__WEAK void vApplicationGetIdleTaskMemory (StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize) { - /* Idle task control block and stack */ - static StaticTask_t Idle_TCB; - static StackType_t Idle_Stack[configMINIMAL_STACK_SIZE]; - - *ppxIdleTaskTCBBuffer = &Idle_TCB; - *ppxIdleTaskStackBuffer = &Idle_Stack[0]; - *pulIdleTaskStackSize = (uint32_t)configMINIMAL_STACK_SIZE; -} - -/* - vApplicationGetTimerTaskMemory gets called when configSUPPORT_STATIC_ALLOCATION - equals to 1 and is required for static memory allocation support. -*/ -__WEAK void vApplicationGetTimerTaskMemory (StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize) { - /* Timer task control block and stack */ - static StaticTask_t Timer_TCB; - static StackType_t Timer_Stack[configTIMER_TASK_STACK_DEPTH]; - - *ppxTimerTaskTCBBuffer = &Timer_TCB; - *ppxTimerTaskStackBuffer = &Timer_Stack[0]; - *pulTimerTaskStackSize = (uint32_t)configTIMER_TASK_STACK_DEPTH; -} -#endif diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.h deleted file mode 100644 index 9774cc7..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.h +++ /dev/null @@ -1,734 +0,0 @@ -/* -------------------------------------------------------------------------- - * Portions Copyright © 2017 STMicroelectronics International N.V. All rights reserved. - * Portions Copyright (c) 2013-2017 ARM Limited. All rights reserved. - * -------------------------------------------------------------------------- - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Name: cmsis_os2.h - * Purpose: CMSIS RTOS2 wrapper for FreeRTOS - * - *---------------------------------------------------------------------------*/ - -#ifndef CMSIS_OS2_H_ -#define CMSIS_OS2_H_ - -#ifndef __NO_RETURN -#if defined(__CC_ARM) -#define __NO_RETURN __declspec(noreturn) -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) -#define __NO_RETURN __attribute__((__noreturn__)) -#elif defined(__GNUC__) -#define __NO_RETURN __attribute__((__noreturn__)) -#elif defined(__ICCARM__) -#define __NO_RETURN __noreturn -#else -#define __NO_RETURN -#endif -#endif - -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - - -// ==== Enumerations, structures, defines ==== - -/// Version information. -typedef struct { - uint32_t api; ///< API version (major.minor.rev: mmnnnrrrr dec). - uint32_t kernel; ///< Kernel version (major.minor.rev: mmnnnrrrr dec). -} osVersion_t; - -/// Kernel state. -typedef enum { - osKernelInactive = 0, ///< Inactive. - osKernelReady = 1, ///< Ready. - osKernelRunning = 2, ///< Running. - osKernelLocked = 3, ///< Locked. - osKernelSuspended = 4, ///< Suspended. - osKernelError = -1, ///< Error. - osKernelReserved = 0x7FFFFFFFU ///< Prevents enum down-size compiler optimization. -} osKernelState_t; - -/// Thread state. -typedef enum { - osThreadInactive = 0, ///< Inactive. - osThreadReady = 1, ///< Ready. - osThreadRunning = 2, ///< Running. - osThreadBlocked = 3, ///< Blocked. - osThreadTerminated = 4, ///< Terminated. - osThreadError = -1, ///< Error. - osThreadReserved = 0x7FFFFFFF ///< Prevents enum down-size compiler optimization. -} osThreadState_t; - -/// Priority values. -typedef enum { - osPriorityNone = 0, ///< No priority (not initialized). - osPriorityIdle = 1, ///< Reserved for Idle thread. - osPriorityLow = 8, ///< Priority: low - osPriorityLow1 = 8+1, ///< Priority: low + 1 - osPriorityLow2 = 8+2, ///< Priority: low + 2 - osPriorityLow3 = 8+3, ///< Priority: low + 3 - osPriorityLow4 = 8+4, ///< Priority: low + 4 - osPriorityLow5 = 8+5, ///< Priority: low + 5 - osPriorityLow6 = 8+6, ///< Priority: low + 6 - osPriorityLow7 = 8+7, ///< Priority: low + 7 - osPriorityBelowNormal = 16, ///< Priority: below normal - osPriorityBelowNormal1 = 16+1, ///< Priority: below normal + 1 - osPriorityBelowNormal2 = 16+2, ///< Priority: below normal + 2 - osPriorityBelowNormal3 = 16+3, ///< Priority: below normal + 3 - osPriorityBelowNormal4 = 16+4, ///< Priority: below normal + 4 - osPriorityBelowNormal5 = 16+5, ///< Priority: below normal + 5 - osPriorityBelowNormal6 = 16+6, ///< Priority: below normal + 6 - osPriorityBelowNormal7 = 16+7, ///< Priority: below normal + 7 - osPriorityNormal = 24, ///< Priority: normal - osPriorityNormal1 = 24+1, ///< Priority: normal + 1 - osPriorityNormal2 = 24+2, ///< Priority: normal + 2 - osPriorityNormal3 = 24+3, ///< Priority: normal + 3 - osPriorityNormal4 = 24+4, ///< Priority: normal + 4 - osPriorityNormal5 = 24+5, ///< Priority: normal + 5 - osPriorityNormal6 = 24+6, ///< Priority: normal + 6 - osPriorityNormal7 = 24+7, ///< Priority: normal + 7 - osPriorityAboveNormal = 32, ///< Priority: above normal - osPriorityAboveNormal1 = 32+1, ///< Priority: above normal + 1 - osPriorityAboveNormal2 = 32+2, ///< Priority: above normal + 2 - osPriorityAboveNormal3 = 32+3, ///< Priority: above normal + 3 - osPriorityAboveNormal4 = 32+4, ///< Priority: above normal + 4 - osPriorityAboveNormal5 = 32+5, ///< Priority: above normal + 5 - osPriorityAboveNormal6 = 32+6, ///< Priority: above normal + 6 - osPriorityAboveNormal7 = 32+7, ///< Priority: above normal + 7 - osPriorityHigh = 40, ///< Priority: high - osPriorityHigh1 = 40+1, ///< Priority: high + 1 - osPriorityHigh2 = 40+2, ///< Priority: high + 2 - osPriorityHigh3 = 40+3, ///< Priority: high + 3 - osPriorityHigh4 = 40+4, ///< Priority: high + 4 - osPriorityHigh5 = 40+5, ///< Priority: high + 5 - osPriorityHigh6 = 40+6, ///< Priority: high + 6 - osPriorityHigh7 = 40+7, ///< Priority: high + 7 - osPriorityRealtime = 48, ///< Priority: realtime - osPriorityRealtime1 = 48+1, ///< Priority: realtime + 1 - osPriorityRealtime2 = 48+2, ///< Priority: realtime + 2 - osPriorityRealtime3 = 48+3, ///< Priority: realtime + 3 - osPriorityRealtime4 = 48+4, ///< Priority: realtime + 4 - osPriorityRealtime5 = 48+5, ///< Priority: realtime + 5 - osPriorityRealtime6 = 48+6, ///< Priority: realtime + 6 - osPriorityRealtime7 = 48+7, ///< Priority: realtime + 7 - osPriorityISR = 56, ///< Reserved for ISR deferred thread. - osPriorityError = -1, ///< System cannot determine priority or illegal priority. - osPriorityReserved = 0x7FFFFFFF ///< Prevents enum down-size compiler optimization. -} osPriority_t; - -/// Entry point of a thread. -typedef void (*osThreadFunc_t) (void *argument); - -/// Timer callback function. -typedef void (*osTimerFunc_t) (void *argument); - -/// Timer type. -typedef enum { - osTimerOnce = 0, ///< One-shot timer. - osTimerPeriodic = 1 ///< Repeating timer. -} osTimerType_t; - -// Timeout value. -#define osWaitForever 0xFFFFFFFFU ///< Wait forever timeout value. - -// Flags options (\ref osThreadFlagsWait and \ref osEventFlagsWait). -#define osFlagsWaitAny 0x00000000U ///< Wait for any flag (default). -#define osFlagsWaitAll 0x00000001U ///< Wait for all flags. -#define osFlagsNoClear 0x00000002U ///< Do not clear flags which have been specified to wait for. - -// Flags errors (returned by osThreadFlagsXxxx and osEventFlagsXxxx). -#define osFlagsError 0x80000000U ///< Error indicator. -#define osFlagsErrorUnknown 0xFFFFFFFFU ///< osError (-1). -#define osFlagsErrorTimeout 0xFFFFFFFEU ///< osErrorTimeout (-2). -#define osFlagsErrorResource 0xFFFFFFFDU ///< osErrorResource (-3). -#define osFlagsErrorParameter 0xFFFFFFFCU ///< osErrorParameter (-4). -#define osFlagsErrorISR 0xFFFFFFFAU ///< osErrorISR (-6). - -// Thread attributes (attr_bits in \ref osThreadAttr_t). -#define osThreadDetached 0x00000000U ///< Thread created in detached mode (default) -#define osThreadJoinable 0x00000001U ///< Thread created in joinable mode - -// Mutex attributes (attr_bits in \ref osMutexAttr_t). -#define osMutexRecursive 0x00000001U ///< Recursive mutex. -#define osMutexPrioInherit 0x00000002U ///< Priority inherit protocol. -#define osMutexRobust 0x00000008U ///< Robust mutex. - -/// Status code values returned by CMSIS-RTOS functions. -typedef enum { - osOK = 0, ///< Operation completed successfully. - osError = -1, ///< Unspecified RTOS error: run-time error but no other error message fits. - osErrorTimeout = -2, ///< Operation not completed within the timeout period. - osErrorResource = -3, ///< Resource not available. - osErrorParameter = -4, ///< Parameter error. - osErrorNoMemory = -5, ///< System is out of memory: it was impossible to allocate or reserve memory for the operation. - osErrorISR = -6, ///< Not allowed in ISR context: the function cannot be called from interrupt service routines. - osStatusReserved = 0x7FFFFFFF ///< Prevents enum down-size compiler optimization. -} osStatus_t; - - -/// \details Thread ID identifies the thread. -typedef void *osThreadId_t; - -/// \details Timer ID identifies the timer. -typedef void *osTimerId_t; - -/// \details Event Flags ID identifies the event flags. -typedef void *osEventFlagsId_t; - -/// \details Mutex ID identifies the mutex. -typedef void *osMutexId_t; - -/// \details Semaphore ID identifies the semaphore. -typedef void *osSemaphoreId_t; - -/// \details Memory Pool ID identifies the memory pool. -typedef void *osMemoryPoolId_t; - -/// \details Message Queue ID identifies the message queue. -typedef void *osMessageQueueId_t; - - -#ifndef TZ_MODULEID_T -#define TZ_MODULEID_T -/// \details Data type that identifies secure software modules called by a process. -typedef uint32_t TZ_ModuleId_t; -#endif - - -/// Attributes structure for thread. -typedef struct { - const char *name; ///< name of the thread - uint32_t attr_bits; ///< attribute bits - void *cb_mem; ///< memory for control block - uint32_t cb_size; ///< size of provided memory for control block - void *stack_mem; ///< memory for stack - uint32_t stack_size; ///< size of stack - osPriority_t priority; ///< initial thread priority (default: osPriorityNormal) - TZ_ModuleId_t tz_module; ///< TrustZone module identifier - uint32_t reserved; ///< reserved (must be 0) -} osThreadAttr_t; - -/// Attributes structure for timer. -typedef struct { - const char *name; ///< name of the timer - uint32_t attr_bits; ///< attribute bits - void *cb_mem; ///< memory for control block - uint32_t cb_size; ///< size of provided memory for control block -} osTimerAttr_t; - -/// Attributes structure for event flags. -typedef struct { - const char *name; ///< name of the event flags - uint32_t attr_bits; ///< attribute bits - void *cb_mem; ///< memory for control block - uint32_t cb_size; ///< size of provided memory for control block -} osEventFlagsAttr_t; - -/// Attributes structure for mutex. -typedef struct { - const char *name; ///< name of the mutex - uint32_t attr_bits; ///< attribute bits - void *cb_mem; ///< memory for control block - uint32_t cb_size; ///< size of provided memory for control block -} osMutexAttr_t; - -/// Attributes structure for semaphore. -typedef struct { - const char *name; ///< name of the semaphore - uint32_t attr_bits; ///< attribute bits - void *cb_mem; ///< memory for control block - uint32_t cb_size; ///< size of provided memory for control block -} osSemaphoreAttr_t; - -/// Attributes structure for memory pool. -typedef struct { - const char *name; ///< name of the memory pool - uint32_t attr_bits; ///< attribute bits - void *cb_mem; ///< memory for control block - uint32_t cb_size; ///< size of provided memory for control block - void *mp_mem; ///< memory for data storage - uint32_t mp_size; ///< size of provided memory for data storage -} osMemoryPoolAttr_t; - -/// Attributes structure for message queue. -typedef struct { - const char *name; ///< name of the message queue - uint32_t attr_bits; ///< attribute bits - void *cb_mem; ///< memory for control block - uint32_t cb_size; ///< size of provided memory for control block - void *mq_mem; ///< memory for data storage - uint32_t mq_size; ///< size of provided memory for data storage -} osMessageQueueAttr_t; - - -// ==== Kernel Management Functions ==== - -/// Initialize the RTOS Kernel. -/// \return status code that indicates the execution status of the function. -osStatus_t osKernelInitialize (void); - -/// Get RTOS Kernel Information. -/// \param[out] version pointer to buffer for retrieving version information. -/// \param[out] id_buf pointer to buffer for retrieving kernel identification string. -/// \param[in] id_size size of buffer for kernel identification string. -/// \return status code that indicates the execution status of the function. -osStatus_t osKernelGetInfo (osVersion_t *version, char *id_buf, uint32_t id_size); - -/// Get the current RTOS Kernel state. -/// \return current RTOS Kernel state. -osKernelState_t osKernelGetState (void); - -/// Start the RTOS Kernel scheduler. -/// \return status code that indicates the execution status of the function. -osStatus_t osKernelStart (void); - -/// Lock the RTOS Kernel scheduler. -/// \return previous lock state (1 - locked, 0 - not locked, error code if negative). -int32_t osKernelLock (void); - -/// Unlock the RTOS Kernel scheduler. -/// \return previous lock state (1 - locked, 0 - not locked, error code if negative). -int32_t osKernelUnlock (void); - -/// Restore the RTOS Kernel scheduler lock state. -/// \param[in] lock lock state obtained by \ref osKernelLock or \ref osKernelUnlock. -/// \return new lock state (1 - locked, 0 - not locked, error code if negative). -int32_t osKernelRestoreLock (int32_t lock); - -/// Suspend the RTOS Kernel scheduler. -/// \return time in ticks, for how long the system can sleep or power-down. -uint32_t osKernelSuspend (void); - -/// Resume the RTOS Kernel scheduler. -/// \param[in] sleep_ticks time in ticks for how long the system was in sleep or power-down mode. -void osKernelResume (uint32_t sleep_ticks); - -/// Get the RTOS kernel tick count. -/// \return RTOS kernel current tick count. -uint32_t osKernelGetTickCount (void); - -/// Get the RTOS kernel tick frequency. -/// \return frequency of the kernel tick in hertz, i.e. kernel ticks per second. -uint32_t osKernelGetTickFreq (void); - -/// Get the RTOS kernel system timer count. -/// \return RTOS kernel current system timer count as 32-bit value. -uint32_t osKernelGetSysTimerCount (void); - -/// Get the RTOS kernel system timer frequency. -/// \return frequency of the system timer in hertz, i.e. timer ticks per second. -uint32_t osKernelGetSysTimerFreq (void); - - -// ==== Thread Management Functions ==== - -/// Create a thread and add it to Active Threads. -/// \param[in] func thread function. -/// \param[in] argument pointer that is passed to the thread function as start argument. -/// \param[in] attr thread attributes; NULL: default values. -/// \return thread ID for reference by other functions or NULL in case of error. -osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr); - -/// Get name of a thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. -/// \return name as NULL terminated string. -const char *osThreadGetName (osThreadId_t thread_id); - -/// Return the thread ID of the current running thread. -/// \return thread ID for reference by other functions or NULL in case of error. -osThreadId_t osThreadGetId (void); - -/// Get current thread state of a thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. -/// \return current thread state of the specified thread. -osThreadState_t osThreadGetState (osThreadId_t thread_id); - -/// Get stack size of a thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. -/// \return stack size in bytes. -uint32_t osThreadGetStackSize (osThreadId_t thread_id); - -/// Get available stack space of a thread based on stack watermark recording during execution. -/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. -/// \return remaining stack space in bytes. -uint32_t osThreadGetStackSpace (osThreadId_t thread_id); - -/// Change priority of a thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. -/// \param[in] priority new priority value for the thread function. -/// \return status code that indicates the execution status of the function. -osStatus_t osThreadSetPriority (osThreadId_t thread_id, osPriority_t priority); - -/// Get current priority of a thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. -/// \return current priority value of the specified thread. -osPriority_t osThreadGetPriority (osThreadId_t thread_id); - -/// Pass control to next thread that is in state \b READY. -/// \return status code that indicates the execution status of the function. -osStatus_t osThreadYield (void); - -/// Suspend execution of a thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. -/// \return status code that indicates the execution status of the function. -osStatus_t osThreadSuspend (osThreadId_t thread_id); - -/// Resume execution of a thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. -/// \return status code that indicates the execution status of the function. -osStatus_t osThreadResume (osThreadId_t thread_id); - -/// Detach a thread (thread storage can be reclaimed when thread terminates). -/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. -/// \return status code that indicates the execution status of the function. -osStatus_t osThreadDetach (osThreadId_t thread_id); - -/// Wait for specified thread to terminate. -/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. -/// \return status code that indicates the execution status of the function. -osStatus_t osThreadJoin (osThreadId_t thread_id); - -/// Terminate execution of current running thread. -__NO_RETURN void osThreadExit (void); - -/// Terminate execution of a thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. -/// \return status code that indicates the execution status of the function. -osStatus_t osThreadTerminate (osThreadId_t thread_id); - -/// Get number of active threads. -/// \return number of active threads. -uint32_t osThreadGetCount (void); - -/// Enumerate active threads. -/// \param[out] thread_array pointer to array for retrieving thread IDs. -/// \param[in] array_items maximum number of items in array for retrieving thread IDs. -/// \return number of enumerated threads. -uint32_t osThreadEnumerate (osThreadId_t *thread_array, uint32_t array_items); - - -// ==== Thread Flags Functions ==== - -/// Set the specified Thread Flags of a thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. -/// \param[in] flags specifies the flags of the thread that shall be set. -/// \return thread flags after setting or error code if highest bit set. -uint32_t osThreadFlagsSet (osThreadId_t thread_id, uint32_t flags); - -/// Clear the specified Thread Flags of current running thread. -/// \param[in] flags specifies the flags of the thread that shall be cleared. -/// \return thread flags before clearing or error code if highest bit set. -uint32_t osThreadFlagsClear (uint32_t flags); - -/// Get the current Thread Flags of current running thread. -/// \return current thread flags. -uint32_t osThreadFlagsGet (void); - -/// Wait for one or more Thread Flags of the current running thread to become signaled. -/// \param[in] flags specifies the flags to wait for. -/// \param[in] options specifies flags options (osFlagsXxxx). -/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return thread flags before clearing or error code if highest bit set. -uint32_t osThreadFlagsWait (uint32_t flags, uint32_t options, uint32_t timeout); - - -// ==== Generic Wait Functions ==== - -/// Wait for Timeout (Time Delay). -/// \param[in] ticks \ref CMSIS_RTOS_TimeOutValue "time ticks" value -/// \return status code that indicates the execution status of the function. -osStatus_t osDelay (uint32_t ticks); - -/// Wait until specified time. -/// \param[in] ticks absolute time in ticks -/// \return status code that indicates the execution status of the function. -osStatus_t osDelayUntil (uint32_t ticks); - - -// ==== Timer Management Functions ==== - -/// Create and Initialize a timer. -/// \param[in] func function pointer to callback function. -/// \param[in] type \ref osTimerOnce for one-shot or \ref osTimerPeriodic for periodic behavior. -/// \param[in] argument argument to the timer callback function. -/// \param[in] attr timer attributes; NULL: default values. -/// \return timer ID for reference by other functions or NULL in case of error. -osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr); - -/// Get name of a timer. -/// \param[in] timer_id timer ID obtained by \ref osTimerNew. -/// \return name as NULL terminated string. -const char *osTimerGetName (osTimerId_t timer_id); - -/// Start or restart a timer. -/// \param[in] timer_id timer ID obtained by \ref osTimerNew. -/// \param[in] ticks \ref CMSIS_RTOS_TimeOutValue "time ticks" value of the timer. -/// \return status code that indicates the execution status of the function. -osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks); - -/// Stop a timer. -/// \param[in] timer_id timer ID obtained by \ref osTimerNew. -/// \return status code that indicates the execution status of the function. -osStatus_t osTimerStop (osTimerId_t timer_id); - -/// Check if a timer is running. -/// \param[in] timer_id timer ID obtained by \ref osTimerNew. -/// \return 0 not running, 1 running. -uint32_t osTimerIsRunning (osTimerId_t timer_id); - -/// Delete a timer. -/// \param[in] timer_id timer ID obtained by \ref osTimerNew. -/// \return status code that indicates the execution status of the function. -osStatus_t osTimerDelete (osTimerId_t timer_id); - - -// ==== Event Flags Management Functions ==== - -/// Create and Initialize an Event Flags object. -/// \param[in] attr event flags attributes; NULL: default values. -/// \return event flags ID for reference by other functions or NULL in case of error. -osEventFlagsId_t osEventFlagsNew (const osEventFlagsAttr_t *attr); - -/// Get name of an Event Flags object. -/// \param[in] ef_id event flags ID obtained by \ref osEventFlagsNew. -/// \return name as NULL terminated string. -const char *osEventFlagsGetName (osEventFlagsId_t ef_id); - -/// Set the specified Event Flags. -/// \param[in] ef_id event flags ID obtained by \ref osEventFlagsNew. -/// \param[in] flags specifies the flags that shall be set. -/// \return event flags after setting or error code if highest bit set. -uint32_t osEventFlagsSet (osEventFlagsId_t ef_id, uint32_t flags); - -/// Clear the specified Event Flags. -/// \param[in] ef_id event flags ID obtained by \ref osEventFlagsNew. -/// \param[in] flags specifies the flags that shall be cleared. -/// \return event flags before clearing or error code if highest bit set. -uint32_t osEventFlagsClear (osEventFlagsId_t ef_id, uint32_t flags); - -/// Get the current Event Flags. -/// \param[in] ef_id event flags ID obtained by \ref osEventFlagsNew. -/// \return current event flags. -uint32_t osEventFlagsGet (osEventFlagsId_t ef_id); - -/// Wait for one or more Event Flags to become signaled. -/// \param[in] ef_id event flags ID obtained by \ref osEventFlagsNew. -/// \param[in] flags specifies the flags to wait for. -/// \param[in] options specifies flags options (osFlagsXxxx). -/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return event flags before clearing or error code if highest bit set. -uint32_t osEventFlagsWait (osEventFlagsId_t ef_id, uint32_t flags, uint32_t options, uint32_t timeout); - -/// Delete an Event Flags object. -/// \param[in] ef_id event flags ID obtained by \ref osEventFlagsNew. -/// \return status code that indicates the execution status of the function. -osStatus_t osEventFlagsDelete (osEventFlagsId_t ef_id); - - -// ==== Mutex Management Functions ==== - -/// Create and Initialize a Mutex object. -/// \param[in] attr mutex attributes; NULL: default values. -/// \return mutex ID for reference by other functions or NULL in case of error. -osMutexId_t osMutexNew (const osMutexAttr_t *attr); - -/// Get name of a Mutex object. -/// \param[in] mutex_id mutex ID obtained by \ref osMutexNew. -/// \return name as NULL terminated string. -const char *osMutexGetName (osMutexId_t mutex_id); - -/// Acquire a Mutex or timeout if it is locked. -/// \param[in] mutex_id mutex ID obtained by \ref osMutexNew. -/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return status code that indicates the execution status of the function. -osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout); - -/// Release a Mutex that was acquired by \ref osMutexAcquire. -/// \param[in] mutex_id mutex ID obtained by \ref osMutexNew. -/// \return status code that indicates the execution status of the function. -osStatus_t osMutexRelease (osMutexId_t mutex_id); - -/// Get Thread which owns a Mutex object. -/// \param[in] mutex_id mutex ID obtained by \ref osMutexNew. -/// \return thread ID of owner thread or NULL when mutex was not acquired. -osThreadId_t osMutexGetOwner (osMutexId_t mutex_id); - -/// Delete a Mutex object. -/// \param[in] mutex_id mutex ID obtained by \ref osMutexNew. -/// \return status code that indicates the execution status of the function. -osStatus_t osMutexDelete (osMutexId_t mutex_id); - - -// ==== Semaphore Management Functions ==== - -/// Create and Initialize a Semaphore object. -/// \param[in] max_count maximum number of available tokens. -/// \param[in] initial_count initial number of available tokens. -/// \param[in] attr semaphore attributes; NULL: default values. -/// \return semaphore ID for reference by other functions or NULL in case of error. -osSemaphoreId_t osSemaphoreNew (uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr); - -/// Get name of a Semaphore object. -/// \param[in] semaphore_id semaphore ID obtained by \ref osSemaphoreNew. -/// \return name as NULL terminated string. -const char *osSemaphoreGetName (osSemaphoreId_t semaphore_id); - -/// Acquire a Semaphore token or timeout if no tokens are available. -/// \param[in] semaphore_id semaphore ID obtained by \ref osSemaphoreNew. -/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return status code that indicates the execution status of the function. -osStatus_t osSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout); - -/// Release a Semaphore token up to the initial maximum count. -/// \param[in] semaphore_id semaphore ID obtained by \ref osSemaphoreNew. -/// \return status code that indicates the execution status of the function. -osStatus_t osSemaphoreRelease (osSemaphoreId_t semaphore_id); - -/// Get current Semaphore token count. -/// \param[in] semaphore_id semaphore ID obtained by \ref osSemaphoreNew. -/// \return number of tokens available. -uint32_t osSemaphoreGetCount (osSemaphoreId_t semaphore_id); - -/// Delete a Semaphore object. -/// \param[in] semaphore_id semaphore ID obtained by \ref osSemaphoreNew. -/// \return status code that indicates the execution status of the function. -osStatus_t osSemaphoreDelete (osSemaphoreId_t semaphore_id); - - -// ==== Memory Pool Management Functions ==== - -/// Create and Initialize a Memory Pool object. -/// \param[in] block_count maximum number of memory blocks in memory pool. -/// \param[in] block_size memory block size in bytes. -/// \param[in] attr memory pool attributes; NULL: default values. -/// \return memory pool ID for reference by other functions or NULL in case of error. -osMemoryPoolId_t osMemoryPoolNew (uint32_t block_count, uint32_t block_size, const osMemoryPoolAttr_t *attr); - -/// Get name of a Memory Pool object. -/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. -/// \return name as NULL terminated string. -const char *osMemoryPoolGetName (osMemoryPoolId_t mp_id); - -/// Allocate a memory block from a Memory Pool. -/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. -/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return address of the allocated memory block or NULL in case of no memory is available. -void *osMemoryPoolAlloc (osMemoryPoolId_t mp_id, uint32_t timeout); - -/// Return an allocated memory block back to a Memory Pool. -/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. -/// \param[in] block address of the allocated memory block to be returned to the memory pool. -/// \return status code that indicates the execution status of the function. -osStatus_t osMemoryPoolFree (osMemoryPoolId_t mp_id, void *block); - -/// Get maximum number of memory blocks in a Memory Pool. -/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. -/// \return maximum number of memory blocks. -uint32_t osMemoryPoolGetCapacity (osMemoryPoolId_t mp_id); - -/// Get memory block size in a Memory Pool. -/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. -/// \return memory block size in bytes. -uint32_t osMemoryPoolGetBlockSize (osMemoryPoolId_t mp_id); - -/// Get number of memory blocks used in a Memory Pool. -/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. -/// \return number of memory blocks used. -uint32_t osMemoryPoolGetCount (osMemoryPoolId_t mp_id); - -/// Get number of memory blocks available in a Memory Pool. -/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. -/// \return number of memory blocks available. -uint32_t osMemoryPoolGetSpace (osMemoryPoolId_t mp_id); - -/// Delete a Memory Pool object. -/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. -/// \return status code that indicates the execution status of the function. -osStatus_t osMemoryPoolDelete (osMemoryPoolId_t mp_id); - - -// ==== Message Queue Management Functions ==== - -/// Create and Initialize a Message Queue object. -/// \param[in] msg_count maximum number of messages in queue. -/// \param[in] msg_size maximum message size in bytes. -/// \param[in] attr message queue attributes; NULL: default values. -/// \return message queue ID for reference by other functions or NULL in case of error. -osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr); - -/// Get name of a Message Queue object. -/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. -/// \return name as NULL terminated string. -const char *osMessageQueueGetName (osMessageQueueId_t mq_id); - -/// Put a Message into a Queue or timeout if Queue is full. -/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. -/// \param[in] msg_ptr pointer to buffer with message to put into a queue. -/// \param[in] msg_prio message priority. -/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return status code that indicates the execution status of the function. -osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout); - -/// Get a Message from a Queue or timeout if Queue is empty. -/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. -/// \param[out] msg_ptr pointer to buffer for message to get from a queue. -/// \param[out] msg_prio pointer to buffer for message priority or NULL. -/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return status code that indicates the execution status of the function. -osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout); - -/// Get maximum number of messages in a Message Queue. -/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. -/// \return maximum number of messages. -uint32_t osMessageQueueGetCapacity (osMessageQueueId_t mq_id); - -/// Get maximum message size in a Memory Pool. -/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. -/// \return maximum message size in bytes. -uint32_t osMessageQueueGetMsgSize (osMessageQueueId_t mq_id); - -/// Get number of queued messages in a Message Queue. -/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. -/// \return number of queued messages. -uint32_t osMessageQueueGetCount (osMessageQueueId_t mq_id); - -/// Get number of available slots for messages in a Message Queue. -/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. -/// \return number of available slots for messages. -uint32_t osMessageQueueGetSpace (osMessageQueueId_t mq_id); - -/// Reset a Message Queue to initial empty state. -/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. -/// \return status code that indicates the execution status of the function. -osStatus_t osMessageQueueReset (osMessageQueueId_t mq_id); - -/// Delete a Message Queue object. -/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. -/// \return status code that indicates the execution status of the function. -osStatus_t osMessageQueueDelete (osMessageQueueId_t mq_id); - - -#ifdef __cplusplus -} -#endif - -#endif // CMSIS_OS2_H_ diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_mpool.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_mpool.h deleted file mode 100644 index cea5017..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_mpool.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -------------------------------------------------------------------------- - * Copyright (c) 2013-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Name: freertos_mpool.h - * Purpose: CMSIS RTOS2 wrapper for FreeRTOS - * - *---------------------------------------------------------------------------*/ - -#ifndef FREERTOS_MPOOL_H_ -#define FREERTOS_MPOOL_H_ - -#include -#include "FreeRTOS.h" -#include "semphr.h" - -/* Memory Pool implementation definitions */ -#define MPOOL_STATUS 0x5EED0000U - -/* Memory Block header */ -typedef struct { - void *next; /* Pointer to next block */ -} MemPoolBlock_t; - -/* Memory Pool control block */ -typedef struct MemPoolDef_t { - MemPoolBlock_t *head; /* Pointer to head block */ - SemaphoreHandle_t sem; /* Pool semaphore handle */ - uint8_t *mem_arr; /* Pool memory array */ - uint32_t mem_sz; /* Pool memory array size */ - const char *name; /* Pointer to name string */ - uint32_t bl_sz; /* Size of a single block */ - uint32_t bl_cnt; /* Number of blocks */ - uint32_t n; /* Block allocation index */ - volatile uint32_t status; /* Object status flags */ -#if (configSUPPORT_STATIC_ALLOCATION == 1) - StaticSemaphore_t mem_sem; /* Semaphore object memory */ -#endif -} MemPool_t; - -/* No need to hide static object type, just align to coding style */ -#define StaticMemPool_t MemPool_t - -/* Define memory pool control block size */ -#define MEMPOOL_CB_SIZE (sizeof(StaticMemPool_t)) - -/* Define size of the byte array required to create count of blocks of given size */ -#define MEMPOOL_ARR_SIZE(bl_count, bl_size) (((((bl_size) + (4 - 1)) / 4) * 4)*(bl_count)) - -#endif /* FREERTOS_MPOOL_H_ */ diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_os2.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_os2.h deleted file mode 100644 index c125e2a..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_os2.h +++ /dev/null @@ -1,310 +0,0 @@ -/* -------------------------------------------------------------------------- - * Copyright (c) 2013-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Name: freertos_os2.h - * Purpose: CMSIS RTOS2 wrapper for FreeRTOS - * - *---------------------------------------------------------------------------*/ - -#ifndef FREERTOS_OS2_H_ -#define FREERTOS_OS2_H_ - -#include -#include - -#include "FreeRTOS.h" // ARM.FreeRTOS::RTOS:Core - -#include CMSIS_device_header - -/* - CMSIS-RTOS2 FreeRTOS image size optimization definitions. - - Note: Definitions configUSE_OS2 can be used to optimize FreeRTOS image size when - certain functionality is not required when using CMSIS-RTOS2 API. - In general optimization decisions are left to the tool chain but in cases - when coding style prevents it to optimize the code following optional - definitions can be used. -*/ - -/* - Option to exclude CMSIS-RTOS2 functions osThreadSuspend and osThreadResume from - the application image. -*/ -#ifndef configUSE_OS2_THREAD_SUSPEND_RESUME -#define configUSE_OS2_THREAD_SUSPEND_RESUME 1 -#endif - -/* - Option to exclude CMSIS-RTOS2 function osThreadEnumerate from the application image. -*/ -#ifndef configUSE_OS2_THREAD_ENUMERATE -#define configUSE_OS2_THREAD_ENUMERATE 1 -#endif - -/* - Option to disable CMSIS-RTOS2 function osEventFlagsSet and osEventFlagsClear - operation from ISR. -*/ -#ifndef configUSE_OS2_EVENTFLAGS_FROM_ISR -#define configUSE_OS2_EVENTFLAGS_FROM_ISR 1 -#endif - -/* - Option to exclude CMSIS-RTOS2 Thread Flags API functions from the application image. -*/ -#ifndef configUSE_OS2_THREAD_FLAGS -#define configUSE_OS2_THREAD_FLAGS configUSE_TASK_NOTIFICATIONS -#endif - -/* - Option to exclude CMSIS-RTOS2 Timer API functions from the application image. -*/ -#ifndef configUSE_OS2_TIMER -#define configUSE_OS2_TIMER configUSE_TIMERS -#endif - -/* - Option to exclude CMSIS-RTOS2 Mutex API functions from the application image. -*/ -#ifndef configUSE_OS2_MUTEX -#define configUSE_OS2_MUTEX configUSE_MUTEXES -#endif - - -/* - CMSIS-RTOS2 FreeRTOS configuration check (FreeRTOSConfig.h). - - Note: CMSIS-RTOS API requires functions included by using following definitions. - In case if certain API function is not used compiler will optimize it away. -*/ -#if (INCLUDE_xSemaphoreGetMutexHolder == 0) - /* - CMSIS-RTOS2 function osMutexGetOwner uses FreeRTOS function xSemaphoreGetMutexHolder. In case if - osMutexGetOwner is not used in the application image, compiler will optimize it away. - Set #define INCLUDE_xSemaphoreGetMutexHolder 1 to fix this error. - */ - #error "Definition INCLUDE_xSemaphoreGetMutexHolder must equal 1 to implement Mutex Management API." -#endif -#if (INCLUDE_vTaskDelay == 0) - /* - CMSIS-RTOS2 function osDelay uses FreeRTOS function vTaskDelay. In case if - osDelay is not used in the application image, compiler will optimize it away. - Set #define INCLUDE_vTaskDelay 1 to fix this error. - */ - #error "Definition INCLUDE_vTaskDelay must equal 1 to implement Generic Wait Functions API." -#endif -#if (INCLUDE_vTaskDelayUntil == 0) - /* - CMSIS-RTOS2 function osDelayUntil uses FreeRTOS function vTaskDelayUntil. In case if - osDelayUntil is not used in the application image, compiler will optimize it away. - Set #define INCLUDE_vTaskDelayUntil 1 to fix this error. - */ - #error "Definition INCLUDE_vTaskDelayUntil must equal 1 to implement Generic Wait Functions API." -#endif -#if (INCLUDE_vTaskDelete == 0) - /* - CMSIS-RTOS2 function osThreadTerminate and osThreadExit uses FreeRTOS function - vTaskDelete. In case if they are not used in the application image, compiler - will optimize them away. - Set #define INCLUDE_vTaskDelete 1 to fix this error. - */ - #error "Definition INCLUDE_vTaskDelete must equal 1 to implement Thread Management API." -#endif -#if (INCLUDE_xTaskGetCurrentTaskHandle == 0) - /* - CMSIS-RTOS2 API uses FreeRTOS function xTaskGetCurrentTaskHandle to implement - functions osThreadGetId, osThreadFlagsClear and osThreadFlagsGet. In case if these - functions are not used in the application image, compiler will optimize them away. - Set #define INCLUDE_xTaskGetCurrentTaskHandle 1 to fix this error. - */ - #error "Definition INCLUDE_xTaskGetCurrentTaskHandle must equal 1 to implement Thread Management API." -#endif -#if (INCLUDE_xTaskGetSchedulerState == 0) - /* - CMSIS-RTOS2 API uses FreeRTOS function xTaskGetSchedulerState to implement Kernel - tick handling and therefore it is vital that xTaskGetSchedulerState is included into - the application image. - Set #define INCLUDE_xTaskGetSchedulerState 1 to fix this error. - */ - #error "Definition INCLUDE_xTaskGetSchedulerState must equal 1 to implement Kernel Information and Control API." -#endif -#if (INCLUDE_uxTaskGetStackHighWaterMark == 0) - /* - CMSIS-RTOS2 function osThreadGetStackSpace uses FreeRTOS function uxTaskGetStackHighWaterMark. - In case if osThreadGetStackSpace is not used in the application image, compiler will - optimize it away. - Set #define INCLUDE_uxTaskGetStackHighWaterMark 1 to fix this error. - */ - #error "Definition INCLUDE_uxTaskGetStackHighWaterMark must equal 1 to implement Thread Management API." -#endif -#if (INCLUDE_uxTaskPriorityGet == 0) - /* - CMSIS-RTOS2 function osThreadGetPriority uses FreeRTOS function uxTaskPriorityGet. In case if - osThreadGetPriority is not used in the application image, compiler will optimize it away. - Set #define INCLUDE_uxTaskPriorityGet 1 to fix this error. - */ - #error "Definition INCLUDE_uxTaskPriorityGet must equal 1 to implement Thread Management API." -#endif -#if (INCLUDE_vTaskPrioritySet == 0) - /* - CMSIS-RTOS2 function osThreadSetPriority uses FreeRTOS function vTaskPrioritySet. In case if - osThreadSetPriority is not used in the application image, compiler will optimize it away. - Set #define INCLUDE_vTaskPrioritySet 1 to fix this error. - */ - #error "Definition INCLUDE_vTaskPrioritySet must equal 1 to implement Thread Management API." -#endif -#if (INCLUDE_eTaskGetState == 0) - /* - CMSIS-RTOS2 API uses FreeRTOS function vTaskDelayUntil to implement functions osThreadGetState - and osThreadTerminate. In case if these functions are not used in the application image, - compiler will optimize them away. - Set #define INCLUDE_eTaskGetState 1 to fix this error. - */ - #error "Definition INCLUDE_eTaskGetState must equal 1 to implement Thread Management API." -#endif -#if (INCLUDE_vTaskSuspend == 0) - /* - CMSIS-RTOS2 API uses FreeRTOS functions vTaskSuspend and vTaskResume to implement - functions osThreadSuspend and osThreadResume. In case if these functions are not - used in the application image, compiler will optimize them away. - Set #define INCLUDE_vTaskSuspend 1 to fix this error. - - Alternatively, if the application does not use osThreadSuspend and - osThreadResume they can be excluded from the image code by setting: - #define configUSE_OS2_THREAD_SUSPEND_RESUME 0 (in FreeRTOSConfig.h) - */ - #if (configUSE_OS2_THREAD_SUSPEND_RESUME == 1) - #error "Definition INCLUDE_vTaskSuspend must equal 1 to implement Kernel Information and Control API." - #endif -#endif -#if (INCLUDE_xTimerPendFunctionCall == 0) - /* - CMSIS-RTOS2 function osEventFlagsSet and osEventFlagsClear, when called from - the ISR, call FreeRTOS functions xEventGroupSetBitsFromISR and - xEventGroupClearBitsFromISR which are only enabled if timers are operational and - xTimerPendFunctionCall in enabled. - Set #define INCLUDE_xTimerPendFunctionCall 1 and #define configUSE_TIMERS 1 - to fix this error. - - Alternatively, if the application does not use osEventFlagsSet and osEventFlagsClear - from the ISR their operation from ISR can be restricted by setting: - #define configUSE_OS2_EVENTFLAGS_FROM_ISR 0 (in FreeRTOSConfig.h) - */ - #if (configUSE_OS2_EVENTFLAGS_FROM_ISR == 1) - #error "Definition INCLUDE_xTimerPendFunctionCall must equal 1 to implement Event Flags API." - #endif -#endif - -#if (configUSE_TIMERS == 0) - /* - CMSIS-RTOS2 Timer Management API functions use FreeRTOS timer functions to implement - timer management. In case if these functions are not used in the application image, - compiler will optimize them away. - Set #define configUSE_TIMERS 1 to fix this error. - - Alternatively, if the application does not use timer functions they can be - excluded from the image code by setting: - #define configUSE_OS2_TIMER 0 (in FreeRTOSConfig.h) - */ - #if (configUSE_OS2_TIMER == 1) - #error "Definition configUSE_TIMERS must equal 1 to implement Timer Management API." - #endif -#endif - -#if (configUSE_MUTEXES == 0) - /* - CMSIS-RTOS2 Mutex Management API functions use FreeRTOS mutex functions to implement - mutex management. In case if these functions are not used in the application image, - compiler will optimize them away. - Set #define configUSE_MUTEXES 1 to fix this error. - - Alternatively, if the application does not use mutex functions they can be - excluded from the image code by setting: - #define configUSE_OS2_MUTEX 0 (in FreeRTOSConfig.h) - */ - #if (configUSE_OS2_MUTEX == 1) - #error "Definition configUSE_MUTEXES must equal 1 to implement Mutex Management API." - #endif -#endif - -#if (configUSE_COUNTING_SEMAPHORES == 0) - /* - CMSIS-RTOS2 Memory Pool functions use FreeRTOS function xSemaphoreCreateCounting - to implement memory pools. In case if these functions are not used in the application image, - compiler will optimize them away. - Set #define configUSE_COUNTING_SEMAPHORES 1 to fix this error. - */ - #error "Definition configUSE_COUNTING_SEMAPHORES must equal 1 to implement Memory Pool API." -#endif -#if (configUSE_TASK_NOTIFICATIONS == 0) - /* - CMSIS-RTOS2 Thread Flags API functions use FreeRTOS Task Notification functions to implement - thread flag management. In case if these functions are not used in the application image, - compiler will optimize them away. - Set #define configUSE_TASK_NOTIFICATIONS 1 to fix this error. - - Alternatively, if the application does not use thread flags functions they can be - excluded from the image code by setting: - #define configUSE_OS2_THREAD_FLAGS 0 (in FreeRTOSConfig.h) - */ - #if (configUSE_OS2_THREAD_FLAGS == 1) - #error "Definition configUSE_TASK_NOTIFICATIONS must equal 1 to implement Thread Flags API." - #endif -#endif - -#if (configUSE_TRACE_FACILITY == 0) - /* - CMSIS-RTOS2 function osThreadEnumerate requires FreeRTOS function uxTaskGetSystemState - which is only enabled if configUSE_TRACE_FACILITY == 1. - Set #define configUSE_TRACE_FACILITY 1 to fix this error. - - Alternatively, if the application does not use osThreadEnumerate it can be - excluded from the image code by setting: - #define configUSE_OS2_THREAD_ENUMERATE 0 (in FreeRTOSConfig.h) - */ - #if (configUSE_OS2_THREAD_ENUMERATE == 1) - #error "Definition configUSE_TRACE_FACILITY must equal 1 to implement osThreadEnumerate." - #endif -#endif - -#if (configUSE_16_BIT_TICKS == 1) - /* - CMSIS-RTOS2 wrapper for FreeRTOS relies on 32-bit tick timer which is also optimal on - a 32-bit CPU architectures. - Set #define configUSE_16_BIT_TICKS 0 to fix this error. - */ - #error "Definition configUSE_16_BIT_TICKS must be zero to implement CMSIS-RTOS2 API." -#endif - -#if (configMAX_PRIORITIES != 56) - /* - CMSIS-RTOS2 defines 56 different priorities (see osPriority_t) and portable CMSIS-RTOS2 - implementation should implement the same number of priorities. - Set #define configMAX_PRIORITIES 56 to fix this error. - */ - #error "Definition configMAX_PRIORITIES must equal 56 to implement Thread Management API." -#endif -#if (configUSE_PORT_OPTIMISED_TASK_SELECTION != 0) - /* - CMSIS-RTOS2 requires handling of 56 different priorities (see osPriority_t) while FreeRTOS port - optimised selection for Cortex core only handles 32 different priorities. - Set #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 to fix this error. - */ - #error "Definition configUSE_PORT_OPTIMISED_TASK_SELECTION must be zero to implement Thread Management API." -#endif - -#endif /* FREERTOS_OS2_H_ */ diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/LICENSE b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/LICENSE deleted file mode 100644 index 2ce4711..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. -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. - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/croutine.c b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/croutine.c deleted file mode 100644 index 9ce5003..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/croutine.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#include "FreeRTOS.h" -#include "task.h" -#include "croutine.h" - -/* Remove the whole file is co-routines are not being used. */ -#if( configUSE_CO_ROUTINES != 0 ) - -/* - * Some kernel aware debuggers require data to be viewed to be global, rather - * than file scope. - */ -#ifdef portREMOVE_STATIC_QUALIFIER - #define static -#endif - - -/* Lists for ready and blocked co-routines. --------------------*/ -static List_t pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */ -static List_t xDelayedCoRoutineList1; /*< Delayed co-routines. */ -static List_t xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ -static List_t * pxDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used. */ -static List_t * pxOverflowDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ -static List_t xPendingReadyCoRoutineList; /*< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */ - -/* Other file private variables. --------------------------------*/ -CRCB_t * pxCurrentCoRoutine = NULL; -static UBaseType_t uxTopCoRoutineReadyPriority = 0; -static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; - -/* The initial state of the co-routine when it is created. */ -#define corINITIAL_STATE ( 0 ) - -/* - * Place the co-routine represented by pxCRCB into the appropriate ready queue - * for the priority. It is inserted at the end of the list. - * - * This macro accesses the co-routine ready lists and therefore must not be - * used from within an ISR. - */ -#define prvAddCoRoutineToReadyQueue( pxCRCB ) \ -{ \ - if( pxCRCB->uxPriority > uxTopCoRoutineReadyPriority ) \ - { \ - uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \ - } \ - vListInsertEnd( ( List_t * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ -} - -/* - * Utility to ready all the lists used by the scheduler. This is called - * automatically upon the creation of the first co-routine. - */ -static void prvInitialiseCoRoutineLists( void ); - -/* - * Co-routines that are readied by an interrupt cannot be placed directly into - * the ready lists (there is no mutual exclusion). Instead they are placed in - * in the pending ready list in order that they can later be moved to the ready - * list by the co-routine scheduler. - */ -static void prvCheckPendingReadyList( void ); - -/* - * Macro that looks at the list of co-routines that are currently delayed to - * see if any require waking. - * - * Co-routines are stored in the queue in the order of their wake time - - * meaning once one co-routine has been found whose timer has not expired - * we need not look any further down the list. - */ -static void prvCheckDelayedList( void ); - -/*-----------------------------------------------------------*/ - -BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ) -{ -BaseType_t xReturn; -CRCB_t *pxCoRoutine; - - /* Allocate the memory that will store the co-routine control block. */ - pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) ); - if( pxCoRoutine ) - { - /* If pxCurrentCoRoutine is NULL then this is the first co-routine to - be created and the co-routine data structures need initialising. */ - if( pxCurrentCoRoutine == NULL ) - { - pxCurrentCoRoutine = pxCoRoutine; - prvInitialiseCoRoutineLists(); - } - - /* Check the priority is within limits. */ - if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) - { - uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; - } - - /* Fill out the co-routine control block from the function parameters. */ - pxCoRoutine->uxState = corINITIAL_STATE; - pxCoRoutine->uxPriority = uxPriority; - pxCoRoutine->uxIndex = uxIndex; - pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; - - /* Initialise all the other co-routine control block parameters. */ - vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); - vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); - - /* Set the co-routine control block as a link back from the ListItem_t. - This is so we can get back to the containing CRCB from a generic item - in a list. */ - listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine ); - listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine ); - - /* Event lists are always in priority order. */ - listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) ); - - /* Now the co-routine has been initialised it can be added to the ready - list at the correct priority. */ - prvAddCoRoutineToReadyQueue( pxCoRoutine ); - - xReturn = pdPASS; - } - else - { - xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList ) -{ -TickType_t xTimeToWake; - - /* Calculate the time to wake - this may overflow but this is - not a problem. */ - xTimeToWake = xCoRoutineTickCount + xTicksToDelay; - - /* We must remove ourselves from the ready list before adding - ourselves to the blocked list as the same list item is used for - both lists. */ - ( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); - - /* The list item will be inserted in wake time order. */ - listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); - - if( xTimeToWake < xCoRoutineTickCount ) - { - /* Wake time has overflowed. Place this item in the - overflow list. */ - vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); - } - else - { - /* The wake time has not overflowed, so we can use the - current block list. */ - vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); - } - - if( pxEventList ) - { - /* Also add the co-routine to an event list. If this is done then the - function must be called with interrupts disabled. */ - vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) ); - } -} -/*-----------------------------------------------------------*/ - -static void prvCheckPendingReadyList( void ) -{ - /* Are there any co-routines waiting to get moved to the ready list? These - are co-routines that have been readied by an ISR. The ISR cannot access - the ready lists itself. */ - while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE ) - { - CRCB_t *pxUnblockedCRCB; - - /* The pending ready list can be accessed by an ISR. */ - portDISABLE_INTERRUPTS(); - { - pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( (&xPendingReadyCoRoutineList) ); - ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); - } - portENABLE_INTERRUPTS(); - - ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); - prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); - } -} -/*-----------------------------------------------------------*/ - -static void prvCheckDelayedList( void ) -{ -CRCB_t *pxCRCB; - - xPassedTicks = xTaskGetTickCount() - xLastTickCount; - while( xPassedTicks ) - { - xCoRoutineTickCount++; - xPassedTicks--; - - /* If the tick count has overflowed we need to swap the ready lists. */ - if( xCoRoutineTickCount == 0 ) - { - List_t * pxTemp; - - /* Tick count has overflowed so we need to swap the delay lists. If there are - any items in pxDelayedCoRoutineList here then there is an error! */ - pxTemp = pxDelayedCoRoutineList; - pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList; - pxOverflowDelayedCoRoutineList = pxTemp; - } - - /* See if this tick has made a timeout expire. */ - while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) - { - pxCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); - - if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) - { - /* Timeout not yet expired. */ - break; - } - - portDISABLE_INTERRUPTS(); - { - /* The event could have occurred just before this critical - section. If this is the case then the generic list item will - have been moved to the pending ready list and the following - line is still valid. Also the pvContainer parameter will have - been set to NULL so the following lines are also valid. */ - ( void ) uxListRemove( &( pxCRCB->xGenericListItem ) ); - - /* Is the co-routine waiting on an event also? */ - if( pxCRCB->xEventListItem.pxContainer ) - { - ( void ) uxListRemove( &( pxCRCB->xEventListItem ) ); - } - } - portENABLE_INTERRUPTS(); - - prvAddCoRoutineToReadyQueue( pxCRCB ); - } - } - - xLastTickCount = xCoRoutineTickCount; -} -/*-----------------------------------------------------------*/ - -void vCoRoutineSchedule( void ) -{ - /* See if any co-routines readied by events need moving to the ready lists. */ - prvCheckPendingReadyList(); - - /* See if any delayed co-routines have timed out. */ - prvCheckDelayedList(); - - /* Find the highest priority queue that contains ready co-routines. */ - while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) ) - { - if( uxTopCoRoutineReadyPriority == 0 ) - { - /* No more co-routines to check. */ - return; - } - --uxTopCoRoutineReadyPriority; - } - - /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines - of the same priority get an equal share of the processor time. */ - listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ); - - /* Call the co-routine. */ - ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); - - return; -} -/*-----------------------------------------------------------*/ - -static void prvInitialiseCoRoutineLists( void ) -{ -UBaseType_t uxPriority; - - for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) - { - vListInitialise( ( List_t * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); - } - - vListInitialise( ( List_t * ) &xDelayedCoRoutineList1 ); - vListInitialise( ( List_t * ) &xDelayedCoRoutineList2 ); - vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList ); - - /* Start with pxDelayedCoRoutineList using list1 and the - pxOverflowDelayedCoRoutineList using list2. */ - pxDelayedCoRoutineList = &xDelayedCoRoutineList1; - pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2; -} -/*-----------------------------------------------------------*/ - -BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList ) -{ -CRCB_t *pxUnblockedCRCB; -BaseType_t xReturn; - - /* This function is called from within an interrupt. It can only access - event lists and the pending ready list. This function assumes that a - check has already been made to ensure pxEventList is not empty. */ - pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); - ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); - vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); - - if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - - return xReturn; -} - -#endif /* configUSE_CO_ROUTINES == 0 */ - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c deleted file mode 100644 index bf4ec24..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c +++ /dev/null @@ -1,753 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/* Standard includes. */ -#include - -/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining -all the API functions to use the MPU wrappers. That should only be done when -task.h is included from an application file. */ -#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE - -/* FreeRTOS includes. */ -#include "FreeRTOS.h" -#include "task.h" -#include "timers.h" -#include "event_groups.h" - -/* Lint e961, e750 and e9021 are suppressed as a MISRA exception justified -because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined -for the header files above, but not in this file, in order to generate the -correct privileged Vs unprivileged linkage and placement. */ -#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021 See comment above. */ - -/* The following bit fields convey control information in a task's event list -item value. It is important they don't clash with the -taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */ -#if configUSE_16_BIT_TICKS == 1 - #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U - #define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U - #define eventWAIT_FOR_ALL_BITS 0x0400U - #define eventEVENT_BITS_CONTROL_BYTES 0xff00U -#else - #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL - #define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL - #define eventWAIT_FOR_ALL_BITS 0x04000000UL - #define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL -#endif - -typedef struct EventGroupDef_t -{ - EventBits_t uxEventBits; - List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */ - - #if( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxEventGroupNumber; - #endif - - #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */ - #endif -} EventGroup_t; - -/*-----------------------------------------------------------*/ - -/* - * Test the bits set in uxCurrentEventBits to see if the wait condition is met. - * The wait condition is defined by xWaitForAllBits. If xWaitForAllBits is - * pdTRUE then the wait condition is met if all the bits set in uxBitsToWaitFor - * are also set in uxCurrentEventBits. If xWaitForAllBits is pdFALSE then the - * wait condition is met if any of the bits set in uxBitsToWait for are also set - * in uxCurrentEventBits. - */ -static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ) PRIVILEGED_FUNCTION; - -/*-----------------------------------------------------------*/ - -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - - EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) - { - EventGroup_t *pxEventBits; - - /* A StaticEventGroup_t object must be provided. */ - configASSERT( pxEventGroupBuffer ); - - #if( configASSERT_DEFINED == 1 ) - { - /* Sanity check that the size of the structure used to declare a - variable of type StaticEventGroup_t equals the size of the real - event group structure. */ - volatile size_t xSize = sizeof( StaticEventGroup_t ); - configASSERT( xSize == sizeof( EventGroup_t ) ); - } /*lint !e529 xSize is referenced if configASSERT() is defined. */ - #endif /* configASSERT_DEFINED */ - - /* The user has provided a statically allocated event group - use it. */ - pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 !e9087 EventGroup_t and StaticEventGroup_t are deliberately aliased for data hiding purposes and guaranteed to have the same size and alignment requirement - checked by configASSERT(). */ - - if( pxEventBits != NULL ) - { - pxEventBits->uxEventBits = 0; - vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); - - #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - { - /* Both static and dynamic allocation can be used, so note that - this event group was created statically in case the event group - is later deleted. */ - pxEventBits->ucStaticallyAllocated = pdTRUE; - } - #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ - - traceEVENT_GROUP_CREATE( pxEventBits ); - } - else - { - /* xEventGroupCreateStatic should only ever be called with - pxEventGroupBuffer pointing to a pre-allocated (compile time - allocated) StaticEventGroup_t variable. */ - traceEVENT_GROUP_CREATE_FAILED(); - } - - return pxEventBits; - } - -#endif /* configSUPPORT_STATIC_ALLOCATION */ -/*-----------------------------------------------------------*/ - -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - - EventGroupHandle_t xEventGroupCreate( void ) - { - EventGroup_t *pxEventBits; - - /* Allocate the event group. Justification for MISRA deviation as - follows: pvPortMalloc() always ensures returned memory blocks are - aligned per the requirements of the MCU stack. In this case - pvPortMalloc() must return a pointer that is guaranteed to meet the - alignment requirements of the EventGroup_t structure - which (if you - follow it through) is the alignment requirements of the TickType_t type - (EventBits_t being of TickType_t itself). Therefore, whenever the - stack alignment requirements are greater than or equal to the - TickType_t alignment requirements the cast is safe. In other cases, - where the natural word size of the architecture is less than - sizeof( TickType_t ), the TickType_t variables will be accessed in two - or more reads operations, and the alignment requirements is only that - of each individual read. */ - pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); /*lint !e9087 !e9079 see comment above. */ - - if( pxEventBits != NULL ) - { - pxEventBits->uxEventBits = 0; - vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); - - #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - { - /* Both static and dynamic allocation can be used, so note this - event group was allocated statically in case the event group is - later deleted. */ - pxEventBits->ucStaticallyAllocated = pdFALSE; - } - #endif /* configSUPPORT_STATIC_ALLOCATION */ - - traceEVENT_GROUP_CREATE( pxEventBits ); - } - else - { - traceEVENT_GROUP_CREATE_FAILED(); /*lint !e9063 Else branch only exists to allow tracing and does not generate code if trace macros are not defined. */ - } - - return pxEventBits; - } - -#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ -/*-----------------------------------------------------------*/ - -EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) -{ -EventBits_t uxOriginalBitValue, uxReturn; -EventGroup_t *pxEventBits = xEventGroup; -BaseType_t xAlreadyYielded; -BaseType_t xTimeoutOccurred = pdFALSE; - - configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); - configASSERT( uxBitsToWaitFor != 0 ); - #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - { - configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); - } - #endif - - vTaskSuspendAll(); - { - uxOriginalBitValue = pxEventBits->uxEventBits; - - ( void ) xEventGroupSetBits( xEventGroup, uxBitsToSet ); - - if( ( ( uxOriginalBitValue | uxBitsToSet ) & uxBitsToWaitFor ) == uxBitsToWaitFor ) - { - /* All the rendezvous bits are now set - no need to block. */ - uxReturn = ( uxOriginalBitValue | uxBitsToSet ); - - /* Rendezvous always clear the bits. They will have been cleared - already unless this is the only task in the rendezvous. */ - pxEventBits->uxEventBits &= ~uxBitsToWaitFor; - - xTicksToWait = 0; - } - else - { - if( xTicksToWait != ( TickType_t ) 0 ) - { - traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ); - - /* Store the bits that the calling task is waiting for in the - task's event list item so the kernel knows when a match is - found. Then enter the blocked state. */ - vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait ); - - /* This assignment is obsolete as uxReturn will get set after - the task unblocks, but some compilers mistakenly generate a - warning about uxReturn being returned without being set if the - assignment is omitted. */ - uxReturn = 0; - } - else - { - /* The rendezvous bits were not set, but no block time was - specified - just return the current event bit value. */ - uxReturn = pxEventBits->uxEventBits; - xTimeoutOccurred = pdTRUE; - } - } - } - xAlreadyYielded = xTaskResumeAll(); - - if( xTicksToWait != ( TickType_t ) 0 ) - { - if( xAlreadyYielded == pdFALSE ) - { - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* The task blocked to wait for its required bits to be set - at this - point either the required bits were set or the block time expired. If - the required bits were set they will have been stored in the task's - event list item, and they should now be retrieved then cleared. */ - uxReturn = uxTaskResetEventItemValue(); - - if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) - { - /* The task timed out, just return the current event bit value. */ - taskENTER_CRITICAL(); - { - uxReturn = pxEventBits->uxEventBits; - - /* Although the task got here because it timed out before the - bits it was waiting for were set, it is possible that since it - unblocked another task has set the bits. If this is the case - then it needs to clear the bits before exiting. */ - if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor ) - { - pxEventBits->uxEventBits &= ~uxBitsToWaitFor; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL(); - - xTimeoutOccurred = pdTRUE; - } - else - { - /* The task unblocked because the bits were set. */ - } - - /* Control bits might be set as the task had blocked should not be - returned. */ - uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; - } - - traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ); - - /* Prevent compiler warnings when trace macros are not used. */ - ( void ) xTimeoutOccurred; - - return uxReturn; -} -/*-----------------------------------------------------------*/ - -EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) -{ -EventGroup_t *pxEventBits = xEventGroup; -EventBits_t uxReturn, uxControlBits = 0; -BaseType_t xWaitConditionMet, xAlreadyYielded; -BaseType_t xTimeoutOccurred = pdFALSE; - - /* Check the user is not attempting to wait on the bits used by the kernel - itself, and that at least one bit is being requested. */ - configASSERT( xEventGroup ); - configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); - configASSERT( uxBitsToWaitFor != 0 ); - #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - { - configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); - } - #endif - - vTaskSuspendAll(); - { - const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits; - - /* Check to see if the wait condition is already met or not. */ - xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits ); - - if( xWaitConditionMet != pdFALSE ) - { - /* The wait condition has already been met so there is no need to - block. */ - uxReturn = uxCurrentEventBits; - xTicksToWait = ( TickType_t ) 0; - - /* Clear the wait bits if requested to do so. */ - if( xClearOnExit != pdFALSE ) - { - pxEventBits->uxEventBits &= ~uxBitsToWaitFor; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else if( xTicksToWait == ( TickType_t ) 0 ) - { - /* The wait condition has not been met, but no block time was - specified, so just return the current value. */ - uxReturn = uxCurrentEventBits; - xTimeoutOccurred = pdTRUE; - } - else - { - /* The task is going to block to wait for its required bits to be - set. uxControlBits are used to remember the specified behaviour of - this call to xEventGroupWaitBits() - for use when the event bits - unblock the task. */ - if( xClearOnExit != pdFALSE ) - { - uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - if( xWaitForAllBits != pdFALSE ) - { - uxControlBits |= eventWAIT_FOR_ALL_BITS; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Store the bits that the calling task is waiting for in the - task's event list item so the kernel knows when a match is - found. Then enter the blocked state. */ - vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait ); - - /* This is obsolete as it will get set after the task unblocks, but - some compilers mistakenly generate a warning about the variable - being returned without being set if it is not done. */ - uxReturn = 0; - - traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ); - } - } - xAlreadyYielded = xTaskResumeAll(); - - if( xTicksToWait != ( TickType_t ) 0 ) - { - if( xAlreadyYielded == pdFALSE ) - { - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* The task blocked to wait for its required bits to be set - at this - point either the required bits were set or the block time expired. If - the required bits were set they will have been stored in the task's - event list item, and they should now be retrieved then cleared. */ - uxReturn = uxTaskResetEventItemValue(); - - if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) - { - taskENTER_CRITICAL(); - { - /* The task timed out, just return the current event bit value. */ - uxReturn = pxEventBits->uxEventBits; - - /* It is possible that the event bits were updated between this - task leaving the Blocked state and running again. */ - if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE ) - { - if( xClearOnExit != pdFALSE ) - { - pxEventBits->uxEventBits &= ~uxBitsToWaitFor; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - xTimeoutOccurred = pdTRUE; - } - taskEXIT_CRITICAL(); - } - else - { - /* The task unblocked because the bits were set. */ - } - - /* The task blocked so control bits may have been set. */ - uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; - } - traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ); - - /* Prevent compiler warnings when trace macros are not used. */ - ( void ) xTimeoutOccurred; - - return uxReturn; -} -/*-----------------------------------------------------------*/ - -EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) -{ -EventGroup_t *pxEventBits = xEventGroup; -EventBits_t uxReturn; - - /* Check the user is not attempting to clear the bits used by the kernel - itself. */ - configASSERT( xEventGroup ); - configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); - - taskENTER_CRITICAL(); - { - traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ); - - /* The value returned is the event group value prior to the bits being - cleared. */ - uxReturn = pxEventBits->uxEventBits; - - /* Clear the bits. */ - pxEventBits->uxEventBits &= ~uxBitsToClear; - } - taskEXIT_CRITICAL(); - - return uxReturn; -} -/*-----------------------------------------------------------*/ - -#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) - - BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) - { - BaseType_t xReturn; - - traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ); - xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */ - - return xReturn; - } - -#endif -/*-----------------------------------------------------------*/ - -EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) -{ -UBaseType_t uxSavedInterruptStatus; -EventGroup_t const * const pxEventBits = xEventGroup; -EventBits_t uxReturn; - - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - { - uxReturn = pxEventBits->uxEventBits; - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - - return uxReturn; -} /*lint !e818 EventGroupHandle_t is a typedef used in other functions to so can't be pointer to const. */ -/*-----------------------------------------------------------*/ - -EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) -{ -ListItem_t *pxListItem, *pxNext; -ListItem_t const *pxListEnd; -List_t const * pxList; -EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits; -EventGroup_t *pxEventBits = xEventGroup; -BaseType_t xMatchFound = pdFALSE; - - /* Check the user is not attempting to set the bits used by the kernel - itself. */ - configASSERT( xEventGroup ); - configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); - - pxList = &( pxEventBits->xTasksWaitingForBits ); - pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ - vTaskSuspendAll(); - { - traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ); - - pxListItem = listGET_HEAD_ENTRY( pxList ); - - /* Set the bits. */ - pxEventBits->uxEventBits |= uxBitsToSet; - - /* See if the new bit value should unblock any tasks. */ - while( pxListItem != pxListEnd ) - { - pxNext = listGET_NEXT( pxListItem ); - uxBitsWaitedFor = listGET_LIST_ITEM_VALUE( pxListItem ); - xMatchFound = pdFALSE; - - /* Split the bits waited for from the control bits. */ - uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES; - uxBitsWaitedFor &= ~eventEVENT_BITS_CONTROL_BYTES; - - if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 ) - { - /* Just looking for single bit being set. */ - if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) != ( EventBits_t ) 0 ) - { - xMatchFound = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) == uxBitsWaitedFor ) - { - /* All bits are set. */ - xMatchFound = pdTRUE; - } - else - { - /* Need all bits to be set, but not all the bits were set. */ - } - - if( xMatchFound != pdFALSE ) - { - /* The bits match. Should the bits be cleared on exit? */ - if( ( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT ) != ( EventBits_t ) 0 ) - { - uxBitsToClear |= uxBitsWaitedFor; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Store the actual event flag value in the task's event list - item before removing the task from the event list. The - eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows - that is was unblocked due to its required bits matching, rather - than because it timed out. */ - vTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET ); - } - - /* Move onto the next list item. Note pxListItem->pxNext is not - used here as the list item may have been removed from the event list - and inserted into the ready/pending reading list. */ - pxListItem = pxNext; - } - - /* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT - bit was set in the control word. */ - pxEventBits->uxEventBits &= ~uxBitsToClear; - } - ( void ) xTaskResumeAll(); - - return pxEventBits->uxEventBits; -} -/*-----------------------------------------------------------*/ - -void vEventGroupDelete( EventGroupHandle_t xEventGroup ) -{ -EventGroup_t *pxEventBits = xEventGroup; -const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits ); - - vTaskSuspendAll(); - { - traceEVENT_GROUP_DELETE( xEventGroup ); - - while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 ) - { - /* Unblock the task, returning 0 as the event list is being deleted - and cannot therefore have any bits set. */ - configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( const ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) ); - vTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET ); - } - - #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) - { - /* The event group can only have been allocated dynamically - free - it again. */ - vPortFree( pxEventBits ); - } - #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - { - /* The event group could have been allocated statically or - dynamically, so check before attempting to free the memory. */ - if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) - { - vPortFree( pxEventBits ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ - } - ( void ) xTaskResumeAll(); -} -/*-----------------------------------------------------------*/ - -/* For internal use only - execute a 'set bits' command that was pended from -an interrupt. */ -void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) -{ - ( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */ -} -/*-----------------------------------------------------------*/ - -/* For internal use only - execute a 'clear bits' command that was pended from -an interrupt. */ -void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) -{ - ( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */ -} -/*-----------------------------------------------------------*/ - -static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ) -{ -BaseType_t xWaitConditionMet = pdFALSE; - - if( xWaitForAllBits == pdFALSE ) - { - /* Task only has to wait for one bit within uxBitsToWaitFor to be - set. Is one already set? */ - if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 ) - { - xWaitConditionMet = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* Task has to wait for all the bits in uxBitsToWaitFor to be set. - Are they set already? */ - if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor ) - { - xWaitConditionMet = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - - return xWaitConditionMet; -} -/*-----------------------------------------------------------*/ - -#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) - - BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) - { - BaseType_t xReturn; - - traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ); - xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */ - - return xReturn; - } - -#endif -/*-----------------------------------------------------------*/ - -#if (configUSE_TRACE_FACILITY == 1) - - UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) - { - UBaseType_t xReturn; - EventGroup_t const *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */ - - if( xEventGroup == NULL ) - { - xReturn = 0; - } - else - { - xReturn = pxEventBits->uxEventGroupNumber; - } - - return xReturn; - } - -#endif /* configUSE_TRACE_FACILITY */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - void vEventGroupSetNumber( void * xEventGroup, UBaseType_t uxEventGroupNumber ) - { - ( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */ - } - -#endif /* configUSE_TRACE_FACILITY */ -/*-----------------------------------------------------------*/ - - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h deleted file mode 100644 index ceb469a..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h +++ /dev/null @@ -1,1295 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef INC_FREERTOS_H -#define INC_FREERTOS_H - -/* - * Include the generic headers required for the FreeRTOS port being used. - */ -#include - -/* - * If stdint.h cannot be located then: - * + If using GCC ensure the -nostdint options is *not* being used. - * + Ensure the project's include path includes the directory in which your - * compiler stores stdint.h. - * + Set any compiler options necessary for it to support C99, as technically - * stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any - * other way). - * + The FreeRTOS download includes a simple stdint.h definition that can be - * used in cases where none is provided by the compiler. The files only - * contains the typedefs required to build FreeRTOS. Read the instructions - * in FreeRTOS/source/stdint.readme for more information. - */ -#include /* READ COMMENT ABOVE. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Application specific configuration options. */ -#include "FreeRTOSConfig.h" - -/* Basic FreeRTOS definitions. */ -#include "projdefs.h" - -/* Definitions specific to the port being used. */ -#include "portable.h" - -/* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */ -#ifndef configUSE_NEWLIB_REENTRANT - #define configUSE_NEWLIB_REENTRANT 0 -#endif - -/* Required if struct _reent is used. */ -#if ( configUSE_NEWLIB_REENTRANT == 1 ) - #include -#endif -/* - * Check all the required application specific macros have been defined. - * These macros are application specific and (as downloaded) are defined - * within FreeRTOSConfig.h. - */ - -#ifndef configMINIMAL_STACK_SIZE - #error Missing definition: configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h. configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task. Refer to the demo project provided for your port for a suitable value. -#endif - -#ifndef configMAX_PRIORITIES - #error Missing definition: configMAX_PRIORITIES must be defined in FreeRTOSConfig.h. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#if configMAX_PRIORITIES < 1 - #error configMAX_PRIORITIES must be defined to be greater than or equal to 1. -#endif - -#ifndef configUSE_PREEMPTION - #error Missing definition: configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef configUSE_IDLE_HOOK - #error Missing definition: configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef configUSE_TICK_HOOK - #error Missing definition: configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef configUSE_16_BIT_TICKS - #error Missing definition: configUSE_16_BIT_TICKS must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef configUSE_CO_ROUTINES - #define configUSE_CO_ROUTINES 0 -#endif - -#ifndef INCLUDE_vTaskPrioritySet - #define INCLUDE_vTaskPrioritySet 0 -#endif - -#ifndef INCLUDE_uxTaskPriorityGet - #define INCLUDE_uxTaskPriorityGet 0 -#endif - -#ifndef INCLUDE_vTaskDelete - #define INCLUDE_vTaskDelete 0 -#endif - -#ifndef INCLUDE_vTaskSuspend - #define INCLUDE_vTaskSuspend 0 -#endif - -#ifndef INCLUDE_vTaskDelayUntil - #define INCLUDE_vTaskDelayUntil 0 -#endif - -#ifndef INCLUDE_vTaskDelay - #define INCLUDE_vTaskDelay 0 -#endif - -#ifndef INCLUDE_xTaskGetIdleTaskHandle - #define INCLUDE_xTaskGetIdleTaskHandle 0 -#endif - -#ifndef INCLUDE_xTaskAbortDelay - #define INCLUDE_xTaskAbortDelay 0 -#endif - -#ifndef INCLUDE_xQueueGetMutexHolder - #define INCLUDE_xQueueGetMutexHolder 0 -#endif - -#ifndef INCLUDE_xSemaphoreGetMutexHolder - #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder -#endif - -#ifndef INCLUDE_xTaskGetHandle - #define INCLUDE_xTaskGetHandle 0 -#endif - -#ifndef INCLUDE_uxTaskGetStackHighWaterMark - #define INCLUDE_uxTaskGetStackHighWaterMark 0 -#endif - -#ifndef INCLUDE_uxTaskGetStackHighWaterMark2 - #define INCLUDE_uxTaskGetStackHighWaterMark2 0 -#endif - -#ifndef INCLUDE_eTaskGetState - #define INCLUDE_eTaskGetState 0 -#endif - -#ifndef INCLUDE_xTaskResumeFromISR - #define INCLUDE_xTaskResumeFromISR 1 -#endif - -#ifndef INCLUDE_xTimerPendFunctionCall - #define INCLUDE_xTimerPendFunctionCall 0 -#endif - -#ifndef INCLUDE_xTaskGetSchedulerState - #define INCLUDE_xTaskGetSchedulerState 0 -#endif - -#ifndef INCLUDE_xTaskGetCurrentTaskHandle - #define INCLUDE_xTaskGetCurrentTaskHandle 0 -#endif - -#if configUSE_CO_ROUTINES != 0 - #ifndef configMAX_CO_ROUTINE_PRIORITIES - #error configMAX_CO_ROUTINE_PRIORITIES must be greater than or equal to 1. - #endif -#endif - -#ifndef configUSE_DAEMON_TASK_STARTUP_HOOK - #define configUSE_DAEMON_TASK_STARTUP_HOOK 0 -#endif - -#ifndef configUSE_APPLICATION_TASK_TAG - #define configUSE_APPLICATION_TASK_TAG 0 -#endif - -#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS - #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 -#endif - -#ifndef configUSE_RECURSIVE_MUTEXES - #define configUSE_RECURSIVE_MUTEXES 0 -#endif - -#ifndef configUSE_MUTEXES - #define configUSE_MUTEXES 0 -#endif - -#ifndef configUSE_TIMERS - #define configUSE_TIMERS 0 -#endif - -#ifndef configUSE_COUNTING_SEMAPHORES - #define configUSE_COUNTING_SEMAPHORES 0 -#endif - -#ifndef configUSE_ALTERNATIVE_API - #define configUSE_ALTERNATIVE_API 0 -#endif - -#ifndef portCRITICAL_NESTING_IN_TCB - #define portCRITICAL_NESTING_IN_TCB 0 -#endif - -#ifndef configMAX_TASK_NAME_LEN - #define configMAX_TASK_NAME_LEN 16 -#endif - -#ifndef configIDLE_SHOULD_YIELD - #define configIDLE_SHOULD_YIELD 1 -#endif - -#if configMAX_TASK_NAME_LEN < 1 - #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h -#endif - -#ifndef configASSERT - #define configASSERT( x ) - #define configASSERT_DEFINED 0 -#else - #define configASSERT_DEFINED 1 -#endif - -/* configPRECONDITION should be defined as configASSERT. -The CBMC proofs need a way to track assumptions and assertions. -A configPRECONDITION statement should express an implicit invariant or -assumption made. A configASSERT statement should express an invariant that must -hold explicit before calling the code. */ -#ifndef configPRECONDITION - #define configPRECONDITION( X ) configASSERT(X) - #define configPRECONDITION_DEFINED 0 -#else - #define configPRECONDITION_DEFINED 1 -#endif - -#ifndef portMEMORY_BARRIER - #define portMEMORY_BARRIER() -#endif - -#ifndef portSOFTWARE_BARRIER - #define portSOFTWARE_BARRIER() -#endif - -/* The timers module relies on xTaskGetSchedulerState(). */ -#if configUSE_TIMERS == 1 - - #ifndef configTIMER_TASK_PRIORITY - #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. - #endif /* configTIMER_TASK_PRIORITY */ - - #ifndef configTIMER_QUEUE_LENGTH - #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. - #endif /* configTIMER_QUEUE_LENGTH */ - - #ifndef configTIMER_TASK_STACK_DEPTH - #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. - #endif /* configTIMER_TASK_STACK_DEPTH */ - -#endif /* configUSE_TIMERS */ - -#ifndef portSET_INTERRUPT_MASK_FROM_ISR - #define portSET_INTERRUPT_MASK_FROM_ISR() 0 -#endif - -#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR - #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue -#endif - -#ifndef portCLEAN_UP_TCB - #define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB -#endif - -#ifndef portPRE_TASK_DELETE_HOOK - #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending ) -#endif - -#ifndef portSETUP_TCB - #define portSETUP_TCB( pxTCB ) ( void ) pxTCB -#endif - -#ifndef configQUEUE_REGISTRY_SIZE - #define configQUEUE_REGISTRY_SIZE 0U -#endif - -#if ( configQUEUE_REGISTRY_SIZE < 1 ) - #define vQueueAddToRegistry( xQueue, pcName ) - #define vQueueUnregisterQueue( xQueue ) - #define pcQueueGetName( xQueue ) -#endif - -#ifndef portPOINTER_SIZE_TYPE - #define portPOINTER_SIZE_TYPE uint32_t -#endif - -/* Remove any unused trace macros. */ -#ifndef traceSTART - /* Used to perform any necessary initialisation - for example, open a file - into which trace is to be written. */ - #define traceSTART() -#endif - -#ifndef traceEND - /* Use to close a trace, for example close a file into which trace has been - written. */ - #define traceEND() -#endif - -#ifndef traceTASK_SWITCHED_IN - /* Called after a task has been selected to run. pxCurrentTCB holds a pointer - to the task control block of the selected task. */ - #define traceTASK_SWITCHED_IN() -#endif - -#ifndef traceINCREASE_TICK_COUNT - /* Called before stepping the tick count after waking from tickless idle - sleep. */ - #define traceINCREASE_TICK_COUNT( x ) -#endif - -#ifndef traceLOW_POWER_IDLE_BEGIN - /* Called immediately before entering tickless idle. */ - #define traceLOW_POWER_IDLE_BEGIN() -#endif - -#ifndef traceLOW_POWER_IDLE_END - /* Called when returning to the Idle task after a tickless idle. */ - #define traceLOW_POWER_IDLE_END() -#endif - -#ifndef traceTASK_SWITCHED_OUT - /* Called before a task has been selected to run. pxCurrentTCB holds a pointer - to the task control block of the task being switched out. */ - #define traceTASK_SWITCHED_OUT() -#endif - -#ifndef traceTASK_PRIORITY_INHERIT - /* Called when a task attempts to take a mutex that is already held by a - lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task - that holds the mutex. uxInheritedPriority is the priority the mutex holder - will inherit (the priority of the task that is attempting to obtain the - muted. */ - #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority ) -#endif - -#ifndef traceTASK_PRIORITY_DISINHERIT - /* Called when a task releases a mutex, the holding of which had resulted in - the task inheriting the priority of a higher priority task. - pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the - mutex. uxOriginalPriority is the task's configured (base) priority. */ - #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority ) -#endif - -#ifndef traceBLOCKING_ON_QUEUE_RECEIVE - /* Task is about to block because it cannot read from a - queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore - upon which the read was attempted. pxCurrentTCB points to the TCB of the - task that attempted the read. */ - #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) -#endif - -#ifndef traceBLOCKING_ON_QUEUE_PEEK - /* Task is about to block because it cannot read from a - queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore - upon which the read was attempted. pxCurrentTCB points to the TCB of the - task that attempted the read. */ - #define traceBLOCKING_ON_QUEUE_PEEK( pxQueue ) -#endif - -#ifndef traceBLOCKING_ON_QUEUE_SEND - /* Task is about to block because it cannot write to a - queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore - upon which the write was attempted. pxCurrentTCB points to the TCB of the - task that attempted the write. */ - #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) -#endif - -#ifndef configCHECK_FOR_STACK_OVERFLOW - #define configCHECK_FOR_STACK_OVERFLOW 0 -#endif - -#ifndef configRECORD_STACK_HIGH_ADDRESS - #define configRECORD_STACK_HIGH_ADDRESS 0 -#endif - -#ifndef configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H - #define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 0 -#endif - -/* The following event macros are embedded in the kernel API calls. */ - -#ifndef traceMOVED_TASK_TO_READY_STATE - #define traceMOVED_TASK_TO_READY_STATE( pxTCB ) -#endif - -#ifndef tracePOST_MOVED_TASK_TO_READY_STATE - #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) -#endif - -#ifndef traceQUEUE_CREATE - #define traceQUEUE_CREATE( pxNewQueue ) -#endif - -#ifndef traceQUEUE_CREATE_FAILED - #define traceQUEUE_CREATE_FAILED( ucQueueType ) -#endif - -#ifndef traceCREATE_MUTEX - #define traceCREATE_MUTEX( pxNewQueue ) -#endif - -#ifndef traceCREATE_MUTEX_FAILED - #define traceCREATE_MUTEX_FAILED() -#endif - -#ifndef traceGIVE_MUTEX_RECURSIVE - #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) -#endif - -#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED - #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) -#endif - -#ifndef traceTAKE_MUTEX_RECURSIVE - #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) -#endif - -#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED - #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) -#endif - -#ifndef traceCREATE_COUNTING_SEMAPHORE - #define traceCREATE_COUNTING_SEMAPHORE() -#endif - -#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED - #define traceCREATE_COUNTING_SEMAPHORE_FAILED() -#endif - -#ifndef traceQUEUE_SEND - #define traceQUEUE_SEND( pxQueue ) -#endif - -#ifndef traceQUEUE_SEND_FAILED - #define traceQUEUE_SEND_FAILED( pxQueue ) -#endif - -#ifndef traceQUEUE_RECEIVE - #define traceQUEUE_RECEIVE( pxQueue ) -#endif - -#ifndef traceQUEUE_PEEK - #define traceQUEUE_PEEK( pxQueue ) -#endif - -#ifndef traceQUEUE_PEEK_FAILED - #define traceQUEUE_PEEK_FAILED( pxQueue ) -#endif - -#ifndef traceQUEUE_PEEK_FROM_ISR - #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) -#endif - -#ifndef traceQUEUE_RECEIVE_FAILED - #define traceQUEUE_RECEIVE_FAILED( pxQueue ) -#endif - -#ifndef traceQUEUE_SEND_FROM_ISR - #define traceQUEUE_SEND_FROM_ISR( pxQueue ) -#endif - -#ifndef traceQUEUE_SEND_FROM_ISR_FAILED - #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) -#endif - -#ifndef traceQUEUE_RECEIVE_FROM_ISR - #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) -#endif - -#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED - #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) -#endif - -#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED - #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) -#endif - -#ifndef traceQUEUE_DELETE - #define traceQUEUE_DELETE( pxQueue ) -#endif - -#ifndef traceTASK_CREATE - #define traceTASK_CREATE( pxNewTCB ) -#endif - -#ifndef traceTASK_CREATE_FAILED - #define traceTASK_CREATE_FAILED() -#endif - -#ifndef traceTASK_DELETE - #define traceTASK_DELETE( pxTaskToDelete ) -#endif - -#ifndef traceTASK_DELAY_UNTIL - #define traceTASK_DELAY_UNTIL( x ) -#endif - -#ifndef traceTASK_DELAY - #define traceTASK_DELAY() -#endif - -#ifndef traceTASK_PRIORITY_SET - #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) -#endif - -#ifndef traceTASK_SUSPEND - #define traceTASK_SUSPEND( pxTaskToSuspend ) -#endif - -#ifndef traceTASK_RESUME - #define traceTASK_RESUME( pxTaskToResume ) -#endif - -#ifndef traceTASK_RESUME_FROM_ISR - #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) -#endif - -#ifndef traceTASK_INCREMENT_TICK - #define traceTASK_INCREMENT_TICK( xTickCount ) -#endif - -#ifndef traceTIMER_CREATE - #define traceTIMER_CREATE( pxNewTimer ) -#endif - -#ifndef traceTIMER_CREATE_FAILED - #define traceTIMER_CREATE_FAILED() -#endif - -#ifndef traceTIMER_COMMAND_SEND - #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) -#endif - -#ifndef traceTIMER_EXPIRED - #define traceTIMER_EXPIRED( pxTimer ) -#endif - -#ifndef traceTIMER_COMMAND_RECEIVED - #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) -#endif - -#ifndef traceMALLOC - #define traceMALLOC( pvAddress, uiSize ) -#endif - -#ifndef traceFREE - #define traceFREE( pvAddress, uiSize ) -#endif - -#ifndef traceEVENT_GROUP_CREATE - #define traceEVENT_GROUP_CREATE( xEventGroup ) -#endif - -#ifndef traceEVENT_GROUP_CREATE_FAILED - #define traceEVENT_GROUP_CREATE_FAILED() -#endif - -#ifndef traceEVENT_GROUP_SYNC_BLOCK - #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ) -#endif - -#ifndef traceEVENT_GROUP_SYNC_END - #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred -#endif - -#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK - #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ) -#endif - -#ifndef traceEVENT_GROUP_WAIT_BITS_END - #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred -#endif - -#ifndef traceEVENT_GROUP_CLEAR_BITS - #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ) -#endif - -#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR - #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ) -#endif - -#ifndef traceEVENT_GROUP_SET_BITS - #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ) -#endif - -#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR - #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ) -#endif - -#ifndef traceEVENT_GROUP_DELETE - #define traceEVENT_GROUP_DELETE( xEventGroup ) -#endif - -#ifndef tracePEND_FUNC_CALL - #define tracePEND_FUNC_CALL(xFunctionToPend, pvParameter1, ulParameter2, ret) -#endif - -#ifndef tracePEND_FUNC_CALL_FROM_ISR - #define tracePEND_FUNC_CALL_FROM_ISR(xFunctionToPend, pvParameter1, ulParameter2, ret) -#endif - -#ifndef traceQUEUE_REGISTRY_ADD - #define traceQUEUE_REGISTRY_ADD(xQueue, pcQueueName) -#endif - -#ifndef traceTASK_NOTIFY_TAKE_BLOCK - #define traceTASK_NOTIFY_TAKE_BLOCK() -#endif - -#ifndef traceTASK_NOTIFY_TAKE - #define traceTASK_NOTIFY_TAKE() -#endif - -#ifndef traceTASK_NOTIFY_WAIT_BLOCK - #define traceTASK_NOTIFY_WAIT_BLOCK() -#endif - -#ifndef traceTASK_NOTIFY_WAIT - #define traceTASK_NOTIFY_WAIT() -#endif - -#ifndef traceTASK_NOTIFY - #define traceTASK_NOTIFY() -#endif - -#ifndef traceTASK_NOTIFY_FROM_ISR - #define traceTASK_NOTIFY_FROM_ISR() -#endif - -#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR - #define traceTASK_NOTIFY_GIVE_FROM_ISR() -#endif - -#ifndef traceSTREAM_BUFFER_CREATE_FAILED - #define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_CREATE_STATIC_FAILED - #define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_CREATE - #define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_DELETE - #define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_RESET - #define traceSTREAM_BUFFER_RESET( xStreamBuffer ) -#endif - -#ifndef traceBLOCKING_ON_STREAM_BUFFER_SEND - #define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_SEND - #define traceSTREAM_BUFFER_SEND( xStreamBuffer, xBytesSent ) -#endif - -#ifndef traceSTREAM_BUFFER_SEND_FAILED - #define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_SEND_FROM_ISR - #define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xBytesSent ) -#endif - -#ifndef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE - #define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_RECEIVE - #define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) -#endif - -#ifndef traceSTREAM_BUFFER_RECEIVE_FAILED - #define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_RECEIVE_FROM_ISR - #define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) -#endif - -#ifndef configGENERATE_RUN_TIME_STATS - #define configGENERATE_RUN_TIME_STATS 0 -#endif - -#if ( configGENERATE_RUN_TIME_STATS == 1 ) - - #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS - #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. - #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ - - #ifndef portGET_RUN_TIME_COUNTER_VALUE - #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE - #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. - #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ - #endif /* portGET_RUN_TIME_COUNTER_VALUE */ - -#endif /* configGENERATE_RUN_TIME_STATS */ - -#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS - #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() -#endif - -#ifndef configUSE_MALLOC_FAILED_HOOK - #define configUSE_MALLOC_FAILED_HOOK 0 -#endif - -#ifndef portPRIVILEGE_BIT - #define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 ) -#endif - -#ifndef portYIELD_WITHIN_API - #define portYIELD_WITHIN_API portYIELD -#endif - -#ifndef portSUPPRESS_TICKS_AND_SLEEP - #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) -#endif - -#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP - #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 -#endif - -#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2 - #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2 -#endif - -#ifndef configUSE_TICKLESS_IDLE - #define configUSE_TICKLESS_IDLE 0 -#endif - -#ifndef configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING - #define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( x ) -#endif - -#ifndef configPRE_SLEEP_PROCESSING - #define configPRE_SLEEP_PROCESSING( x ) -#endif - -#ifndef configPOST_SLEEP_PROCESSING - #define configPOST_SLEEP_PROCESSING( x ) -#endif - -#ifndef configUSE_QUEUE_SETS - #define configUSE_QUEUE_SETS 0 -#endif - -#ifndef portTASK_USES_FLOATING_POINT - #define portTASK_USES_FLOATING_POINT() -#endif - -#ifndef portALLOCATE_SECURE_CONTEXT - #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) -#endif - -#ifndef portDONT_DISCARD - #define portDONT_DISCARD -#endif - -#ifndef configUSE_TIME_SLICING - #define configUSE_TIME_SLICING 1 -#endif - -#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS - #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 -#endif - -#ifndef configUSE_STATS_FORMATTING_FUNCTIONS - #define configUSE_STATS_FORMATTING_FUNCTIONS 0 -#endif - -#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID - #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() -#endif - -#ifndef configUSE_TRACE_FACILITY - #define configUSE_TRACE_FACILITY 0 -#endif - -#ifndef mtCOVERAGE_TEST_MARKER - #define mtCOVERAGE_TEST_MARKER() -#endif - -#ifndef mtCOVERAGE_TEST_DELAY - #define mtCOVERAGE_TEST_DELAY() -#endif - -#ifndef portASSERT_IF_IN_ISR - #define portASSERT_IF_IN_ISR() -#endif - -#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION - #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 -#endif - -#ifndef configAPPLICATION_ALLOCATED_HEAP - #define configAPPLICATION_ALLOCATED_HEAP 0 -#endif - -#ifndef configUSE_TASK_NOTIFICATIONS - #define configUSE_TASK_NOTIFICATIONS 1 -#endif - -#ifndef configUSE_POSIX_ERRNO - #define configUSE_POSIX_ERRNO 0 -#endif - -#ifndef portTICK_TYPE_IS_ATOMIC - #define portTICK_TYPE_IS_ATOMIC 0 -#endif - -#ifndef configSUPPORT_STATIC_ALLOCATION - /* Defaults to 0 for backward compatibility. */ - #define configSUPPORT_STATIC_ALLOCATION 0 -#endif - -#ifndef configSUPPORT_DYNAMIC_ALLOCATION - /* Defaults to 1 for backward compatibility. */ - #define configSUPPORT_DYNAMIC_ALLOCATION 1 -#endif - -#ifndef configSTACK_DEPTH_TYPE - /* Defaults to uint16_t for backward compatibility, but can be overridden - in FreeRTOSConfig.h if uint16_t is too restrictive. */ - #define configSTACK_DEPTH_TYPE uint16_t -#endif - -#ifndef configMESSAGE_BUFFER_LENGTH_TYPE - /* Defaults to size_t for backward compatibility, but can be overridden - in FreeRTOSConfig.h if lengths will always be less than the number of bytes - in a size_t. */ - #define configMESSAGE_BUFFER_LENGTH_TYPE size_t -#endif - -/* Sanity check the configuration. */ -#if( configUSE_TICKLESS_IDLE != 0 ) - #if( INCLUDE_vTaskSuspend != 1 ) - #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0 - #endif /* INCLUDE_vTaskSuspend */ -#endif /* configUSE_TICKLESS_IDLE */ - -#if( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) ) - #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1. -#endif - -#if( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) ) - #error configUSE_MUTEXES must be set to 1 to use recursive mutexes -#endif - -#ifndef configINITIAL_TICK_COUNT - #define configINITIAL_TICK_COUNT 0 -#endif - -#if( portTICK_TYPE_IS_ATOMIC == 0 ) - /* Either variables of tick type cannot be read atomically, or - portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when - the tick count is returned to the standard critical section macros. */ - #define portTICK_TYPE_ENTER_CRITICAL() portENTER_CRITICAL() - #define portTICK_TYPE_EXIT_CRITICAL() portEXIT_CRITICAL() - #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() - #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) ) -#else - /* The tick type can be read atomically, so critical sections used when the - tick count is returned can be defined away. */ - #define portTICK_TYPE_ENTER_CRITICAL() - #define portTICK_TYPE_EXIT_CRITICAL() - #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0 - #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) x -#endif - -/* Definitions to allow backward compatibility with FreeRTOS versions prior to -V8 if desired. */ -#ifndef configENABLE_BACKWARD_COMPATIBILITY - #define configENABLE_BACKWARD_COMPATIBILITY 1 -#endif - -#ifndef configPRINTF - /* configPRINTF() was not defined, so define it away to nothing. To use - configPRINTF() then define it as follows (where MyPrintFunction() is - provided by the application writer): - - void MyPrintFunction(const char *pcFormat, ... ); - #define configPRINTF( X ) MyPrintFunction X - - Then call like a standard printf() function, but placing brackets around - all parameters so they are passed as a single parameter. For example: - configPRINTF( ("Value = %d", MyVariable) ); */ - #define configPRINTF( X ) -#endif - -#ifndef configMAX - /* The application writer has not provided their own MAX macro, so define - the following generic implementation. */ - #define configMAX( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) -#endif - -#ifndef configMIN - /* The application writer has not provided their own MAX macro, so define - the following generic implementation. */ - #define configMIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) -#endif - -#if configENABLE_BACKWARD_COMPATIBILITY == 1 - #define eTaskStateGet eTaskGetState - #define portTickType TickType_t - #define xTaskHandle TaskHandle_t - #define xQueueHandle QueueHandle_t - #define xSemaphoreHandle SemaphoreHandle_t - #define xQueueSetHandle QueueSetHandle_t - #define xQueueSetMemberHandle QueueSetMemberHandle_t - #define xTimeOutType TimeOut_t - #define xMemoryRegion MemoryRegion_t - #define xTaskParameters TaskParameters_t - #define xTaskStatusType TaskStatus_t - #define xTimerHandle TimerHandle_t - #define xCoRoutineHandle CoRoutineHandle_t - #define pdTASK_HOOK_CODE TaskHookFunction_t - #define portTICK_RATE_MS portTICK_PERIOD_MS - #define pcTaskGetTaskName pcTaskGetName - #define pcTimerGetTimerName pcTimerGetName - #define pcQueueGetQueueName pcQueueGetName - #define vTaskGetTaskInfo vTaskGetInfo - #define xTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter - - /* Backward compatibility within the scheduler code only - these definitions - are not really required but are included for completeness. */ - #define tmrTIMER_CALLBACK TimerCallbackFunction_t - #define pdTASK_CODE TaskFunction_t - #define xListItem ListItem_t - #define xList List_t - - /* For libraries that break the list data hiding, and access list structure - members directly (which is not supposed to be done). */ - #define pxContainer pvContainer -#endif /* configENABLE_BACKWARD_COMPATIBILITY */ - -#if( configUSE_ALTERNATIVE_API != 0 ) - #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0 -#endif - -/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even -if floating point hardware is otherwise supported by the FreeRTOS port in use. -This constant is not supported by all FreeRTOS ports that include floating -point support. */ -#ifndef configUSE_TASK_FPU_SUPPORT - #define configUSE_TASK_FPU_SUPPORT 1 -#endif - -/* Set configENABLE_MPU to 1 to enable MPU support and 0 to disable it. This is -currently used in ARMv8M ports. */ -#ifndef configENABLE_MPU - #define configENABLE_MPU 0 -#endif - -/* Set configENABLE_FPU to 1 to enable FPU support and 0 to disable it. This is -currently used in ARMv8M ports. */ -#ifndef configENABLE_FPU - #define configENABLE_FPU 1 -#endif - -/* Set configENABLE_TRUSTZONE to 1 enable TrustZone support and 0 to disable it. -This is currently used in ARMv8M ports. */ -#ifndef configENABLE_TRUSTZONE - #define configENABLE_TRUSTZONE 1 -#endif - -/* Set configRUN_FREERTOS_SECURE_ONLY to 1 to run the FreeRTOS ARMv8M port on -the Secure Side only. */ -#ifndef configRUN_FREERTOS_SECURE_ONLY - #define configRUN_FREERTOS_SECURE_ONLY 0 -#endif - -/* Sometimes the FreeRTOSConfig.h settings only allow a task to be created using - * dynamically allocated RAM, in which case when any task is deleted it is known - * that both the task's stack and TCB need to be freed. Sometimes the - * FreeRTOSConfig.h settings only allow a task to be created using statically - * allocated RAM, in which case when any task is deleted it is known that neither - * the task's stack or TCB should be freed. Sometimes the FreeRTOSConfig.h - * settings allow a task to be created using either statically or dynamically - * allocated RAM, in which case a member of the TCB is used to record whether the - * stack and/or TCB were allocated statically or dynamically, so when a task is - * deleted the RAM that was allocated dynamically is freed again and no attempt is - * made to free the RAM that was allocated statically. - * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is only true if it is possible for a - * task to be created using either statically or dynamically allocated RAM. Note - * that if portUSING_MPU_WRAPPERS is 1 then a protected task can be created with - * a statically allocated stack and a dynamically allocated TCB. - * - * The following table lists various combinations of portUSING_MPU_WRAPPERS, - * configSUPPORT_DYNAMIC_ALLOCATION and configSUPPORT_STATIC_ALLOCATION and - * when it is possible to have both static and dynamic allocation: - * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ - * | MPU | Dynamic | Static | Available Functions | Possible Allocations | Both Dynamic and | Need Free | - * | | | | | | Static Possible | | - * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ - * | 0 | 0 | 1 | xTaskCreateStatic | TCB - Static, Stack - Static | No | No | - * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| - * | 0 | 1 | 0 | xTaskCreate | TCB - Dynamic, Stack - Dynamic | No | Yes | - * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| - * | 0 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | - * | | | | xTaskCreateStatic | 2. TCB - Static, Stack - Static | | | - * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| - * | 1 | 0 | 1 | xTaskCreateStatic, | TCB - Static, Stack - Static | No | No | - * | | | | xTaskCreateRestrictedStatic | | | | - * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| - * | 1 | 1 | 0 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | - * | | | | xTaskCreateRestricted | 2. TCB - Dynamic, Stack - Static | | | - * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| - * | 1 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | - * | | | | xTaskCreateStatic, | 2. TCB - Dynamic, Stack - Static | | | - * | | | | xTaskCreateRestricted, | 3. TCB - Static, Stack - Static | | | - * | | | | xTaskCreateRestrictedStatic | | | | - * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ - */ -#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE ( ( ( portUSING_MPU_WRAPPERS == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) || \ - ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) ) - -/* - * In line with software engineering best practice, FreeRTOS implements a strict - * data hiding policy, so the real structures used by FreeRTOS to maintain the - * state of tasks, queues, semaphores, etc. are not accessible to the application - * code. However, if the application writer wants to statically allocate such - * an object then the size of the object needs to be know. Dummy structures - * that are guaranteed to have the same size and alignment requirements of the - * real objects are used for this purpose. The dummy list and list item - * structures below are used for inclusion in such a dummy structure. - */ -struct xSTATIC_LIST_ITEM -{ - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy1; - #endif - TickType_t xDummy2; - void *pvDummy3[ 4 ]; - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy4; - #endif -}; -typedef struct xSTATIC_LIST_ITEM StaticListItem_t; - -/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ -struct xSTATIC_MINI_LIST_ITEM -{ - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy1; - #endif - TickType_t xDummy2; - void *pvDummy3[ 2 ]; -}; -typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t; - -/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ -typedef struct xSTATIC_LIST -{ - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy1; - #endif - UBaseType_t uxDummy2; - void *pvDummy3; - StaticMiniListItem_t xDummy4; - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy5; - #endif -} StaticList_t; - -/* - * In line with software engineering best practice, especially when supplying a - * library that is likely to change in future versions, FreeRTOS implements a - * strict data hiding policy. This means the Task structure used internally by - * FreeRTOS is not accessible to application code. However, if the application - * writer wants to statically allocate the memory required to create a task then - * the size of the task object needs to be know. The StaticTask_t structure - * below is provided for this purpose. Its sizes and alignment requirements are - * guaranteed to match those of the genuine structure, no matter which - * architecture is being used, and no matter how the values in FreeRTOSConfig.h - * are set. Its contents are somewhat obfuscated in the hope users will - * recognise that it would be unwise to make direct use of the structure members. - */ -typedef struct xSTATIC_TCB -{ - void *pxDummy1; - #if ( portUSING_MPU_WRAPPERS == 1 ) - xMPU_SETTINGS xDummy2; - #endif - StaticListItem_t xDummy3[ 2 ]; - UBaseType_t uxDummy5; - void *pxDummy6; - uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ]; - #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) - void *pxDummy8; - #endif - #if ( portCRITICAL_NESTING_IN_TCB == 1 ) - UBaseType_t uxDummy9; - #endif - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy10[ 2 ]; - #endif - #if ( configUSE_MUTEXES == 1 ) - UBaseType_t uxDummy12[ 2 ]; - #endif - #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - void *pxDummy14; - #endif - #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) - void *pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; - #endif - #if ( configGENERATE_RUN_TIME_STATS == 1 ) - uint32_t ulDummy16; - #endif - #if ( configUSE_NEWLIB_REENTRANT == 1 ) - struct _reent xDummy17; - #endif - #if ( configUSE_TASK_NOTIFICATIONS == 1 ) - uint32_t ulDummy18; - uint8_t ucDummy19; - #endif - #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) - uint8_t uxDummy20; - #endif - - #if( INCLUDE_xTaskAbortDelay == 1 ) - uint8_t ucDummy21; - #endif - #if ( configUSE_POSIX_ERRNO == 1 ) - int iDummy22; - #endif -} StaticTask_t; - -/* - * In line with software engineering best practice, especially when supplying a - * library that is likely to change in future versions, FreeRTOS implements a - * strict data hiding policy. This means the Queue structure used internally by - * FreeRTOS is not accessible to application code. However, if the application - * writer wants to statically allocate the memory required to create a queue - * then the size of the queue object needs to be know. The StaticQueue_t - * structure below is provided for this purpose. Its sizes and alignment - * requirements are guaranteed to match those of the genuine structure, no - * matter which architecture is being used, and no matter how the values in - * FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in the hope - * users will recognise that it would be unwise to make direct use of the - * structure members. - */ -typedef struct xSTATIC_QUEUE -{ - void *pvDummy1[ 3 ]; - - union - { - void *pvDummy2; - UBaseType_t uxDummy2; - } u; - - StaticList_t xDummy3[ 2 ]; - UBaseType_t uxDummy4[ 3 ]; - uint8_t ucDummy5[ 2 ]; - - #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - uint8_t ucDummy6; - #endif - - #if ( configUSE_QUEUE_SETS == 1 ) - void *pvDummy7; - #endif - - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy8; - uint8_t ucDummy9; - #endif - -} StaticQueue_t; -typedef StaticQueue_t StaticSemaphore_t; - -/* - * In line with software engineering best practice, especially when supplying a - * library that is likely to change in future versions, FreeRTOS implements a - * strict data hiding policy. This means the event group structure used - * internally by FreeRTOS is not accessible to application code. However, if - * the application writer wants to statically allocate the memory required to - * create an event group then the size of the event group object needs to be - * know. The StaticEventGroup_t structure below is provided for this purpose. - * Its sizes and alignment requirements are guaranteed to match those of the - * genuine structure, no matter which architecture is being used, and no matter - * how the values in FreeRTOSConfig.h are set. Its contents are somewhat - * obfuscated in the hope users will recognise that it would be unwise to make - * direct use of the structure members. - */ -typedef struct xSTATIC_EVENT_GROUP -{ - TickType_t xDummy1; - StaticList_t xDummy2; - - #if( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy3; - #endif - - #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - uint8_t ucDummy4; - #endif - -} StaticEventGroup_t; - -/* - * In line with software engineering best practice, especially when supplying a - * library that is likely to change in future versions, FreeRTOS implements a - * strict data hiding policy. This means the software timer structure used - * internally by FreeRTOS is not accessible to application code. However, if - * the application writer wants to statically allocate the memory required to - * create a software timer then the size of the queue object needs to be know. - * The StaticTimer_t structure below is provided for this purpose. Its sizes - * and alignment requirements are guaranteed to match those of the genuine - * structure, no matter which architecture is being used, and no matter how the - * values in FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in - * the hope users will recognise that it would be unwise to make direct use of - * the structure members. - */ -typedef struct xSTATIC_TIMER -{ - void *pvDummy1; - StaticListItem_t xDummy2; - TickType_t xDummy3; - void *pvDummy5; - TaskFunction_t pvDummy6; - #if( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy7; - #endif - uint8_t ucDummy8; - -} StaticTimer_t; - -/* -* In line with software engineering best practice, especially when supplying a -* library that is likely to change in future versions, FreeRTOS implements a -* strict data hiding policy. This means the stream buffer structure used -* internally by FreeRTOS is not accessible to application code. However, if -* the application writer wants to statically allocate the memory required to -* create a stream buffer then the size of the stream buffer object needs to be -* know. The StaticStreamBuffer_t structure below is provided for this purpose. -* Its size and alignment requirements are guaranteed to match those of the -* genuine structure, no matter which architecture is being used, and no matter -* how the values in FreeRTOSConfig.h are set. Its contents are somewhat -* obfuscated in the hope users will recognise that it would be unwise to make -* direct use of the structure members. -*/ -typedef struct xSTATIC_STREAM_BUFFER -{ - size_t uxDummy1[ 4 ]; - void * pvDummy2[ 3 ]; - uint8_t ucDummy3; - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy4; - #endif -} StaticStreamBuffer_t; - -/* Message buffers are built on stream buffers. */ -typedef StaticStreamBuffer_t StaticMessageBuffer_t; - -#ifdef __cplusplus -} -#endif - -#endif /* INC_FREERTOS_H */ - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h deleted file mode 100644 index 5643991..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef STACK_MACROS_H -#define STACK_MACROS_H - -#ifndef _MSC_VER /* Visual Studio doesn't support #warning. */ - #warning The name of this file has changed to stack_macros.h. Please update your code accordingly. This source file (which has the original name) will be removed in future released. -#endif - -/* - * Call the stack overflow hook function if the stack of the task being swapped - * out is currently overflowed, or looks like it might have overflowed in the - * past. - * - * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check - * the current stack state only - comparing the current top of stack value to - * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 - * will also cause the last few stack bytes to be checked to ensure the value - * to which the bytes were set when the task was created have not been - * overwritten. Note this second test does not guarantee that an overflowed - * stack will always be recognised. - */ - -/*-----------------------------------------------------------*/ - -#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) ) - - /* Only the current stack state is to be checked. */ - #define taskCHECK_FOR_STACK_OVERFLOW() \ - { \ - /* Is the currently saved stack pointer within the stack limit? */ \ - if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \ - { \ - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ - } \ - } - -#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ -/*-----------------------------------------------------------*/ - -#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) ) - - /* Only the current stack state is to be checked. */ - #define taskCHECK_FOR_STACK_OVERFLOW() \ - { \ - \ - /* Is the currently saved stack pointer within the stack limit? */ \ - if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack ) \ - { \ - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ - } \ - } - -#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ -/*-----------------------------------------------------------*/ - -#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) - - #define taskCHECK_FOR_STACK_OVERFLOW() \ - { \ - const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \ - const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \ - \ - if( ( pulStack[ 0 ] != ulCheckValue ) || \ - ( pulStack[ 1 ] != ulCheckValue ) || \ - ( pulStack[ 2 ] != ulCheckValue ) || \ - ( pulStack[ 3 ] != ulCheckValue ) ) \ - { \ - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ - } \ - } - -#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ -/*-----------------------------------------------------------*/ - -#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) - - #define taskCHECK_FOR_STACK_OVERFLOW() \ - { \ - int8_t *pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \ - static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ - \ - \ - pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ - \ - /* Has the extremity of the task stack ever been written over? */ \ - if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ - { \ - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ - } \ - } - -#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ -/*-----------------------------------------------------------*/ - -/* Remove stack overflow macro if not being used. */ -#ifndef taskCHECK_FOR_STACK_OVERFLOW - #define taskCHECK_FOR_STACK_OVERFLOW() -#endif - - - -#endif /* STACK_MACROS_H */ - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h deleted file mode 100644 index ceca696..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h +++ /dev/null @@ -1,414 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/** - * @file atomic.h - * @brief FreeRTOS atomic operation support. - * - * This file implements atomic functions by disabling interrupts globally. - * Implementations with architecture specific atomic instructions can be - * provided under each compiler directory. - */ - -#ifndef ATOMIC_H -#define ATOMIC_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h must appear in source files before include atomic.h" -#endif - -/* Standard includes. */ -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Port specific definitions -- entering/exiting critical section. - * Refer template -- ./lib/FreeRTOS/portable/Compiler/Arch/portmacro.h - * - * Every call to ATOMIC_EXIT_CRITICAL() must be closely paired with - * ATOMIC_ENTER_CRITICAL(). - * - */ -#if defined( portSET_INTERRUPT_MASK_FROM_ISR ) - - /* Nested interrupt scheme is supported in this port. */ - #define ATOMIC_ENTER_CRITICAL() \ - UBaseType_t uxCriticalSectionType = portSET_INTERRUPT_MASK_FROM_ISR() - - #define ATOMIC_EXIT_CRITICAL() \ - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxCriticalSectionType ) - -#else - - /* Nested interrupt scheme is NOT supported in this port. */ - #define ATOMIC_ENTER_CRITICAL() portENTER_CRITICAL() - #define ATOMIC_EXIT_CRITICAL() portEXIT_CRITICAL() - -#endif /* portSET_INTERRUPT_MASK_FROM_ISR() */ - -/* - * Port specific definition -- "always inline". - * Inline is compiler specific, and may not always get inlined depending on your - * optimization level. Also, inline is considered as performance optimization - * for atomic. Thus, if portFORCE_INLINE is not provided by portmacro.h, - * instead of resulting error, simply define it away. - */ -#ifndef portFORCE_INLINE - #define portFORCE_INLINE -#endif - -#define ATOMIC_COMPARE_AND_SWAP_SUCCESS 0x1U /**< Compare and swap succeeded, swapped. */ -#define ATOMIC_COMPARE_AND_SWAP_FAILURE 0x0U /**< Compare and swap failed, did not swap. */ - -/*----------------------------- Swap && CAS ------------------------------*/ - -/** - * Atomic compare-and-swap - * - * @brief Performs an atomic compare-and-swap operation on the specified values. - * - * @param[in, out] pulDestination Pointer to memory location from where value is - * to be loaded and checked. - * @param[in] ulExchange If condition meets, write this value to memory. - * @param[in] ulComparand Swap condition. - * - * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. - * - * @note This function only swaps *pulDestination with ulExchange, if previous - * *pulDestination value equals ulComparand. - */ -static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination, - uint32_t ulExchange, - uint32_t ulComparand ) -{ -uint32_t ulReturnValue; - - ATOMIC_ENTER_CRITICAL(); - { - if( *pulDestination == ulComparand ) - { - *pulDestination = ulExchange; - ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; - } - else - { - ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; - } - } - ATOMIC_EXIT_CRITICAL(); - - return ulReturnValue; -} -/*-----------------------------------------------------------*/ - -/** - * Atomic swap (pointers) - * - * @brief Atomically sets the address pointed to by *ppvDestination to the value - * of *pvExchange. - * - * @param[in, out] ppvDestination Pointer to memory location from where a pointer - * value is to be loaded and written back to. - * @param[in] pvExchange Pointer value to be written to *ppvDestination. - * - * @return The initial value of *ppvDestination. - */ -static portFORCE_INLINE void * Atomic_SwapPointers_p32( void * volatile * ppvDestination, - void * pvExchange ) -{ -void * pReturnValue; - - ATOMIC_ENTER_CRITICAL(); - { - pReturnValue = *ppvDestination; - *ppvDestination = pvExchange; - } - ATOMIC_EXIT_CRITICAL(); - - return pReturnValue; -} -/*-----------------------------------------------------------*/ - -/** - * Atomic compare-and-swap (pointers) - * - * @brief Performs an atomic compare-and-swap operation on the specified pointer - * values. - * - * @param[in, out] ppvDestination Pointer to memory location from where a pointer - * value is to be loaded and checked. - * @param[in] pvExchange If condition meets, write this value to memory. - * @param[in] pvComparand Swap condition. - * - * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. - * - * @note This function only swaps *ppvDestination with pvExchange, if previous - * *ppvDestination value equals pvComparand. - */ -static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( void * volatile * ppvDestination, - void * pvExchange, - void * pvComparand ) -{ -uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; - - ATOMIC_ENTER_CRITICAL(); - { - if( *ppvDestination == pvComparand ) - { - *ppvDestination = pvExchange; - ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; - } - } - ATOMIC_EXIT_CRITICAL(); - - return ulReturnValue; -} - - -/*----------------------------- Arithmetic ------------------------------*/ - -/** - * Atomic add - * - * @brief Atomically adds count to the value of the specified pointer points to. - * - * @param[in,out] pulAddend Pointer to memory location from where value is to be - * loaded and written back to. - * @param[in] ulCount Value to be added to *pulAddend. - * - * @return previous *pulAddend value. - */ -static portFORCE_INLINE uint32_t Atomic_Add_u32( uint32_t volatile * pulAddend, - uint32_t ulCount ) -{ - uint32_t ulCurrent; - - ATOMIC_ENTER_CRITICAL(); - { - ulCurrent = *pulAddend; - *pulAddend += ulCount; - } - ATOMIC_EXIT_CRITICAL(); - - return ulCurrent; -} -/*-----------------------------------------------------------*/ - -/** - * Atomic subtract - * - * @brief Atomically subtracts count from the value of the specified pointer - * pointers to. - * - * @param[in,out] pulAddend Pointer to memory location from where value is to be - * loaded and written back to. - * @param[in] ulCount Value to be subtract from *pulAddend. - * - * @return previous *pulAddend value. - */ -static portFORCE_INLINE uint32_t Atomic_Subtract_u32( uint32_t volatile * pulAddend, - uint32_t ulCount ) -{ - uint32_t ulCurrent; - - ATOMIC_ENTER_CRITICAL(); - { - ulCurrent = *pulAddend; - *pulAddend -= ulCount; - } - ATOMIC_EXIT_CRITICAL(); - - return ulCurrent; -} -/*-----------------------------------------------------------*/ - -/** - * Atomic increment - * - * @brief Atomically increments the value of the specified pointer points to. - * - * @param[in,out] pulAddend Pointer to memory location from where value is to be - * loaded and written back to. - * - * @return *pulAddend value before increment. - */ -static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pulAddend ) -{ -uint32_t ulCurrent; - - ATOMIC_ENTER_CRITICAL(); - { - ulCurrent = *pulAddend; - *pulAddend += 1; - } - ATOMIC_EXIT_CRITICAL(); - - return ulCurrent; -} -/*-----------------------------------------------------------*/ - -/** - * Atomic decrement - * - * @brief Atomically decrements the value of the specified pointer points to - * - * @param[in,out] pulAddend Pointer to memory location from where value is to be - * loaded and written back to. - * - * @return *pulAddend value before decrement. - */ -static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pulAddend ) -{ -uint32_t ulCurrent; - - ATOMIC_ENTER_CRITICAL(); - { - ulCurrent = *pulAddend; - *pulAddend -= 1; - } - ATOMIC_EXIT_CRITICAL(); - - return ulCurrent; -} - -/*----------------------------- Bitwise Logical ------------------------------*/ - -/** - * Atomic OR - * - * @brief Performs an atomic OR operation on the specified values. - * - * @param [in, out] pulDestination Pointer to memory location from where value is - * to be loaded and written back to. - * @param [in] ulValue Value to be ORed with *pulDestination. - * - * @return The original value of *pulDestination. - */ -static portFORCE_INLINE uint32_t Atomic_OR_u32( uint32_t volatile * pulDestination, - uint32_t ulValue ) -{ -uint32_t ulCurrent; - - ATOMIC_ENTER_CRITICAL(); - { - ulCurrent = *pulDestination; - *pulDestination |= ulValue; - } - ATOMIC_EXIT_CRITICAL(); - - return ulCurrent; -} -/*-----------------------------------------------------------*/ - -/** - * Atomic AND - * - * @brief Performs an atomic AND operation on the specified values. - * - * @param [in, out] pulDestination Pointer to memory location from where value is - * to be loaded and written back to. - * @param [in] ulValue Value to be ANDed with *pulDestination. - * - * @return The original value of *pulDestination. - */ -static portFORCE_INLINE uint32_t Atomic_AND_u32( uint32_t volatile * pulDestination, - uint32_t ulValue ) -{ -uint32_t ulCurrent; - - ATOMIC_ENTER_CRITICAL(); - { - ulCurrent = *pulDestination; - *pulDestination &= ulValue; - } - ATOMIC_EXIT_CRITICAL(); - - return ulCurrent; -} -/*-----------------------------------------------------------*/ - -/** - * Atomic NAND - * - * @brief Performs an atomic NAND operation on the specified values. - * - * @param [in, out] pulDestination Pointer to memory location from where value is - * to be loaded and written back to. - * @param [in] ulValue Value to be NANDed with *pulDestination. - * - * @return The original value of *pulDestination. - */ -static portFORCE_INLINE uint32_t Atomic_NAND_u32( uint32_t volatile * pulDestination, - uint32_t ulValue ) -{ -uint32_t ulCurrent; - - ATOMIC_ENTER_CRITICAL(); - { - ulCurrent = *pulDestination; - *pulDestination = ~( ulCurrent & ulValue ); - } - ATOMIC_EXIT_CRITICAL(); - - return ulCurrent; -} -/*-----------------------------------------------------------*/ - -/** - * Atomic XOR - * - * @brief Performs an atomic XOR operation on the specified values. - * - * @param [in, out] pulDestination Pointer to memory location from where value is - * to be loaded and written back to. - * @param [in] ulValue Value to be XORed with *pulDestination. - * - * @return The original value of *pulDestination. - */ -static portFORCE_INLINE uint32_t Atomic_XOR_u32( uint32_t volatile * pulDestination, - uint32_t ulValue ) -{ -uint32_t ulCurrent; - - ATOMIC_ENTER_CRITICAL(); - { - ulCurrent = *pulDestination; - *pulDestination ^= ulValue; - } - ATOMIC_EXIT_CRITICAL(); - - return ulCurrent; -} - -#ifdef __cplusplus -} -#endif - -#endif /* ATOMIC_H */ diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h deleted file mode 100644 index 8d7069c..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h +++ /dev/null @@ -1,720 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef CO_ROUTINE_H -#define CO_ROUTINE_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h must appear in source files before include croutine.h" -#endif - -#include "list.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Used to hide the implementation of the co-routine control block. The -control block structure however has to be included in the header due to -the macro implementation of the co-routine functionality. */ -typedef void * CoRoutineHandle_t; - -/* Defines the prototype to which co-routine functions must conform. */ -typedef void (*crCOROUTINE_CODE)( CoRoutineHandle_t, UBaseType_t ); - -typedef struct corCoRoutineControlBlock -{ - crCOROUTINE_CODE pxCoRoutineFunction; - ListItem_t xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */ - ListItem_t xEventListItem; /*< List item used to place the CRCB in event lists. */ - UBaseType_t uxPriority; /*< The priority of the co-routine in relation to other co-routines. */ - UBaseType_t uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ - uint16_t uxState; /*< Used internally by the co-routine implementation. */ -} CRCB_t; /* Co-routine control block. Note must be identical in size down to uxPriority with TCB_t. */ - -/** - * croutine. h - *
- BaseType_t xCoRoutineCreate(
-                                 crCOROUTINE_CODE pxCoRoutineCode,
-                                 UBaseType_t uxPriority,
-                                 UBaseType_t uxIndex
-                               );
- * - * Create a new co-routine and add it to the list of co-routines that are - * ready to run. - * - * @param pxCoRoutineCode Pointer to the co-routine function. Co-routine - * functions require special syntax - see the co-routine section of the WEB - * documentation for more information. - * - * @param uxPriority The priority with respect to other co-routines at which - * the co-routine will run. - * - * @param uxIndex Used to distinguish between different co-routines that - * execute the same function. See the example below and the co-routine section - * of the WEB documentation for further information. - * - * @return pdPASS if the co-routine was successfully created and added to a ready - * list, otherwise an error code defined with ProjDefs.h. - * - * Example usage: -
- // Co-routine to be created.
- void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
- {
- // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- // This may not be necessary for const variables.
- static const char cLedToFlash[ 2 ] = { 5, 6 };
- static const TickType_t uxFlashRates[ 2 ] = { 200, 400 };
-
-     // Must start every co-routine with a call to crSTART();
-     crSTART( xHandle );
-
-     for( ;; )
-     {
-         // This co-routine just delays for a fixed period, then toggles
-         // an LED.  Two co-routines are created using this function, so
-         // the uxIndex parameter is used to tell the co-routine which
-         // LED to flash and how int32_t to delay.  This assumes xQueue has
-         // already been created.
-         vParTestToggleLED( cLedToFlash[ uxIndex ] );
-         crDELAY( xHandle, uxFlashRates[ uxIndex ] );
-     }
-
-     // Must end every co-routine with a call to crEND();
-     crEND();
- }
-
- // Function that creates two co-routines.
- void vOtherFunction( void )
- {
- uint8_t ucParameterToPass;
- TaskHandle_t xHandle;
-
-     // Create two co-routines at priority 0.  The first is given index 0
-     // so (from the code above) toggles LED 5 every 200 ticks.  The second
-     // is given index 1 so toggles LED 6 every 400 ticks.
-     for( uxIndex = 0; uxIndex < 2; uxIndex++ )
-     {
-         xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex );
-     }
- }
-   
- * \defgroup xCoRoutineCreate xCoRoutineCreate - * \ingroup Tasks - */ -BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ); - - -/** - * croutine. h - *
- void vCoRoutineSchedule( void );
- * - * Run a co-routine. - * - * vCoRoutineSchedule() executes the highest priority co-routine that is able - * to run. The co-routine will execute until it either blocks, yields or is - * preempted by a task. Co-routines execute cooperatively so one - * co-routine cannot be preempted by another, but can be preempted by a task. - * - * If an application comprises of both tasks and co-routines then - * vCoRoutineSchedule should be called from the idle task (in an idle task - * hook). - * - * Example usage: -
- // This idle task hook will schedule a co-routine each time it is called.
- // The rest of the idle task will execute between co-routine calls.
- void vApplicationIdleHook( void )
- {
-	vCoRoutineSchedule();
- }
-
- // Alternatively, if you do not require any other part of the idle task to
- // execute, the idle task hook can call vCoRoutineSchedule() within an
- // infinite loop.
- void vApplicationIdleHook( void )
- {
-    for( ;; )
-    {
-        vCoRoutineSchedule();
-    }
- }
- 
- * \defgroup vCoRoutineSchedule vCoRoutineSchedule - * \ingroup Tasks - */ -void vCoRoutineSchedule( void ); - -/** - * croutine. h - *
- crSTART( CoRoutineHandle_t xHandle );
- * - * This macro MUST always be called at the start of a co-routine function. - * - * Example usage: -
- // Co-routine to be created.
- void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
- {
- // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- static int32_t ulAVariable;
-
-     // Must start every co-routine with a call to crSTART();
-     crSTART( xHandle );
-
-     for( ;; )
-     {
-          // Co-routine functionality goes here.
-     }
-
-     // Must end every co-routine with a call to crEND();
-     crEND();
- }
- * \defgroup crSTART crSTART - * \ingroup Tasks - */ -#define crSTART( pxCRCB ) switch( ( ( CRCB_t * )( pxCRCB ) )->uxState ) { case 0: - -/** - * croutine. h - *
- crEND();
- * - * This macro MUST always be called at the end of a co-routine function. - * - * Example usage: -
- // Co-routine to be created.
- void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
- {
- // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- static int32_t ulAVariable;
-
-     // Must start every co-routine with a call to crSTART();
-     crSTART( xHandle );
-
-     for( ;; )
-     {
-          // Co-routine functionality goes here.
-     }
-
-     // Must end every co-routine with a call to crEND();
-     crEND();
- }
- * \defgroup crSTART crSTART - * \ingroup Tasks - */ -#define crEND() } - -/* - * These macros are intended for internal use by the co-routine implementation - * only. The macros should not be used directly by application writers. - */ -#define crSET_STATE0( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = (__LINE__ * 2); return; case (__LINE__ * 2): -#define crSET_STATE1( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1): - -/** - * croutine. h - *
- crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );
- * - * Delay a co-routine for a fixed period of time. - * - * crDELAY can only be called from the co-routine function itself - not - * from within a function called by the co-routine function. This is because - * co-routines do not maintain their own stack. - * - * @param xHandle The handle of the co-routine to delay. This is the xHandle - * parameter of the co-routine function. - * - * @param xTickToDelay The number of ticks that the co-routine should delay - * for. The actual amount of time this equates to is defined by - * configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_PERIOD_MS - * can be used to convert ticks to milliseconds. - * - * Example usage: -
- // Co-routine to be created.
- void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
- {
- // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- // This may not be necessary for const variables.
- // We are to delay for 200ms.
- static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS;
-
-     // Must start every co-routine with a call to crSTART();
-     crSTART( xHandle );
-
-     for( ;; )
-     {
-        // Delay for 200ms.
-        crDELAY( xHandle, xDelayTime );
-
-        // Do something here.
-     }
-
-     // Must end every co-routine with a call to crEND();
-     crEND();
- }
- * \defgroup crDELAY crDELAY - * \ingroup Tasks - */ -#define crDELAY( xHandle, xTicksToDelay ) \ - if( ( xTicksToDelay ) > 0 ) \ - { \ - vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \ - } \ - crSET_STATE0( ( xHandle ) ); - -/** - *
- crQUEUE_SEND(
-                  CoRoutineHandle_t xHandle,
-                  QueueHandle_t pxQueue,
-                  void *pvItemToQueue,
-                  TickType_t xTicksToWait,
-                  BaseType_t *pxResult
-             )
- * - * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine - * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. - * - * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas - * xQueueSend() and xQueueReceive() can only be used from tasks. - * - * crQUEUE_SEND can only be called from the co-routine function itself - not - * from within a function called by the co-routine function. This is because - * co-routines do not maintain their own stack. - * - * See the co-routine section of the WEB documentation for information on - * passing data between tasks and co-routines and between ISR's and - * co-routines. - * - * @param xHandle The handle of the calling co-routine. This is the xHandle - * parameter of the co-routine function. - * - * @param pxQueue The handle of the queue on which the data will be posted. - * The handle is obtained as the return value when the queue is created using - * the xQueueCreate() API function. - * - * @param pvItemToQueue A pointer to the data being posted onto the queue. - * The number of bytes of each queued item is specified when the queue is - * created. This number of bytes is copied from pvItemToQueue into the queue - * itself. - * - * @param xTickToDelay The number of ticks that the co-routine should block - * to wait for space to become available on the queue, should space not be - * available immediately. The actual amount of time this equates to is defined - * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant - * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see example - * below). - * - * @param pxResult The variable pointed to by pxResult will be set to pdPASS if - * data was successfully posted onto the queue, otherwise it will be set to an - * error defined within ProjDefs.h. - * - * Example usage: -
- // Co-routine function that blocks for a fixed period then posts a number onto
- // a queue.
- static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
- {
- // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- static BaseType_t xNumberToPost = 0;
- static BaseType_t xResult;
-
-    // Co-routines must begin with a call to crSTART().
-    crSTART( xHandle );
-
-    for( ;; )
-    {
-        // This assumes the queue has already been created.
-        crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult );
-
-        if( xResult != pdPASS )
-        {
-            // The message was not posted!
-        }
-
-        // Increment the number to be posted onto the queue.
-        xNumberToPost++;
-
-        // Delay for 100 ticks.
-        crDELAY( xHandle, 100 );
-    }
-
-    // Co-routines must end with a call to crEND().
-    crEND();
- }
- * \defgroup crQUEUE_SEND crQUEUE_SEND - * \ingroup Tasks - */ -#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \ -{ \ - *( pxResult ) = xQueueCRSend( ( pxQueue) , ( pvItemToQueue) , ( xTicksToWait ) ); \ - if( *( pxResult ) == errQUEUE_BLOCKED ) \ - { \ - crSET_STATE0( ( xHandle ) ); \ - *pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 ); \ - } \ - if( *pxResult == errQUEUE_YIELD ) \ - { \ - crSET_STATE1( ( xHandle ) ); \ - *pxResult = pdPASS; \ - } \ -} - -/** - * croutine. h - *
-  crQUEUE_RECEIVE(
-                     CoRoutineHandle_t xHandle,
-                     QueueHandle_t pxQueue,
-                     void *pvBuffer,
-                     TickType_t xTicksToWait,
-                     BaseType_t *pxResult
-                 )
- * - * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine - * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. - * - * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas - * xQueueSend() and xQueueReceive() can only be used from tasks. - * - * crQUEUE_RECEIVE can only be called from the co-routine function itself - not - * from within a function called by the co-routine function. This is because - * co-routines do not maintain their own stack. - * - * See the co-routine section of the WEB documentation for information on - * passing data between tasks and co-routines and between ISR's and - * co-routines. - * - * @param xHandle The handle of the calling co-routine. This is the xHandle - * parameter of the co-routine function. - * - * @param pxQueue The handle of the queue from which the data will be received. - * The handle is obtained as the return value when the queue is created using - * the xQueueCreate() API function. - * - * @param pvBuffer The buffer into which the received item is to be copied. - * The number of bytes of each queued item is specified when the queue is - * created. This number of bytes is copied into pvBuffer. - * - * @param xTickToDelay The number of ticks that the co-routine should block - * to wait for data to become available from the queue, should data not be - * available immediately. The actual amount of time this equates to is defined - * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant - * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see the - * crQUEUE_SEND example). - * - * @param pxResult The variable pointed to by pxResult will be set to pdPASS if - * data was successfully retrieved from the queue, otherwise it will be set to - * an error code as defined within ProjDefs.h. - * - * Example usage: -
- // A co-routine receives the number of an LED to flash from a queue.  It
- // blocks on the queue until the number is received.
- static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
- {
- // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- static BaseType_t xResult;
- static UBaseType_t uxLEDToFlash;
-
-    // All co-routines must start with a call to crSTART().
-    crSTART( xHandle );
-
-    for( ;; )
-    {
-        // Wait for data to become available on the queue.
-        crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
-
-        if( xResult == pdPASS )
-        {
-            // We received the LED to flash - flash it!
-            vParTestToggleLED( uxLEDToFlash );
-        }
-    }
-
-    crEND();
- }
- * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE - * \ingroup Tasks - */ -#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \ -{ \ - *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), ( xTicksToWait ) ); \ - if( *( pxResult ) == errQUEUE_BLOCKED ) \ - { \ - crSET_STATE0( ( xHandle ) ); \ - *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), 0 ); \ - } \ - if( *( pxResult ) == errQUEUE_YIELD ) \ - { \ - crSET_STATE1( ( xHandle ) ); \ - *( pxResult ) = pdPASS; \ - } \ -} - -/** - * croutine. h - *
-  crQUEUE_SEND_FROM_ISR(
-                            QueueHandle_t pxQueue,
-                            void *pvItemToQueue,
-                            BaseType_t xCoRoutinePreviouslyWoken
-                       )
- * - * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the - * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() - * functions used by tasks. - * - * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to - * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and - * xQueueReceiveFromISR() can only be used to pass data between a task and and - * ISR. - * - * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue - * that is being used from within a co-routine. - * - * See the co-routine section of the WEB documentation for information on - * passing data between tasks and co-routines and between ISR's and - * co-routines. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto - * the same queue multiple times from a single interrupt. The first call - * should always pass in pdFALSE. Subsequent calls should pass in - * the value returned from the previous call. - * - * @return pdTRUE if a co-routine was woken by posting onto the queue. This is - * used by the ISR to determine if a context switch may be required following - * the ISR. - * - * Example usage: -
- // A co-routine that blocks on a queue waiting for characters to be received.
- static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
- {
- char cRxedChar;
- BaseType_t xResult;
-
-     // All co-routines must start with a call to crSTART().
-     crSTART( xHandle );
-
-     for( ;; )
-     {
-         // Wait for data to become available on the queue.  This assumes the
-         // queue xCommsRxQueue has already been created!
-         crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
-
-         // Was a character received?
-         if( xResult == pdPASS )
-         {
-             // Process the character here.
-         }
-     }
-
-     // All co-routines must end with a call to crEND().
-     crEND();
- }
-
- // An ISR that uses a queue to send characters received on a serial port to
- // a co-routine.
- void vUART_ISR( void )
- {
- char cRxedChar;
- BaseType_t xCRWokenByPost = pdFALSE;
-
-     // We loop around reading characters until there are none left in the UART.
-     while( UART_RX_REG_NOT_EMPTY() )
-     {
-         // Obtain the character from the UART.
-         cRxedChar = UART_RX_REG;
-
-         // Post the character onto a queue.  xCRWokenByPost will be pdFALSE
-         // the first time around the loop.  If the post causes a co-routine
-         // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE.
-         // In this manner we can ensure that if more than one co-routine is
-         // blocked on the queue only one is woken by this ISR no matter how
-         // many characters are posted to the queue.
-         xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost );
-     }
- }
- * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR - * \ingroup Tasks - */ -#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) - - -/** - * croutine. h - *
-  crQUEUE_SEND_FROM_ISR(
-                            QueueHandle_t pxQueue,
-                            void *pvBuffer,
-                            BaseType_t * pxCoRoutineWoken
-                       )
- * - * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the - * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() - * functions used by tasks. - * - * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to - * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and - * xQueueReceiveFromISR() can only be used to pass data between a task and and - * ISR. - * - * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data - * from a queue that is being used from within a co-routine (a co-routine - * posted to the queue). - * - * See the co-routine section of the WEB documentation for information on - * passing data between tasks and co-routines and between ISR's and - * co-routines. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvBuffer A pointer to a buffer into which the received item will be - * placed. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from the queue into - * pvBuffer. - * - * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become - * available on the queue. If crQUEUE_RECEIVE_FROM_ISR causes such a - * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise - * *pxCoRoutineWoken will remain unchanged. - * - * @return pdTRUE an item was successfully received from the queue, otherwise - * pdFALSE. - * - * Example usage: -
- // A co-routine that posts a character to a queue then blocks for a fixed
- // period.  The character is incremented each time.
- static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
- {
- // cChar holds its value while this co-routine is blocked and must therefore
- // be declared static.
- static char cCharToTx = 'a';
- BaseType_t xResult;
-
-     // All co-routines must start with a call to crSTART().
-     crSTART( xHandle );
-
-     for( ;; )
-     {
-         // Send the next character to the queue.
-         crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult );
-
-         if( xResult == pdPASS )
-         {
-             // The character was successfully posted to the queue.
-         }
-		 else
-		 {
-			// Could not post the character to the queue.
-		 }
-
-         // Enable the UART Tx interrupt to cause an interrupt in this
-		 // hypothetical UART.  The interrupt will obtain the character
-		 // from the queue and send it.
-		 ENABLE_RX_INTERRUPT();
-
-		 // Increment to the next character then block for a fixed period.
-		 // cCharToTx will maintain its value across the delay as it is
-		 // declared static.
-		 cCharToTx++;
-		 if( cCharToTx > 'x' )
-		 {
-			cCharToTx = 'a';
-		 }
-		 crDELAY( 100 );
-     }
-
-     // All co-routines must end with a call to crEND().
-     crEND();
- }
-
- // An ISR that uses a queue to receive characters to send on a UART.
- void vUART_ISR( void )
- {
- char cCharToTx;
- BaseType_t xCRWokenByPost = pdFALSE;
-
-     while( UART_TX_REG_EMPTY() )
-     {
-         // Are there any characters in the queue waiting to be sent?
-		 // xCRWokenByPost will automatically be set to pdTRUE if a co-routine
-		 // is woken by the post - ensuring that only a single co-routine is
-		 // woken no matter how many times we go around this loop.
-         if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) )
-		 {
-			 SEND_CHARACTER( cCharToTx );
-		 }
-     }
- }
- * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR - * \ingroup Tasks - */ -#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) ) - -/* - * This function is intended for internal use by the co-routine macros only. - * The macro nature of the co-routine implementation requires that the - * prototype appears here. The function should not be used by application - * writers. - * - * Removes the current co-routine from its ready list and places it in the - * appropriate delayed list. - */ -void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList ); - -/* - * This function is intended for internal use by the queue implementation only. - * The function should not be used by application writers. - * - * Removes the highest priority co-routine from the event list and places it in - * the pending ready list. - */ -BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList ); - -#ifdef __cplusplus -} -#endif - -#endif /* CO_ROUTINE_H */ diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h deleted file mode 100644 index 21657b9..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h +++ /dev/null @@ -1,279 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef DEPRECATED_DEFINITIONS_H -#define DEPRECATED_DEFINITIONS_H - - -/* Each FreeRTOS port has a unique portmacro.h header file. Originally a -pre-processor definition was used to ensure the pre-processor found the correct -portmacro.h file for the port being used. That scheme was deprecated in favour -of setting the compiler's include path such that it found the correct -portmacro.h file - removing the need for the constant and allowing the -portmacro.h file to be located anywhere in relation to the port being used. The -definitions below remain in the code for backward compatibility only. New -projects should not use them. */ - -#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT - #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT - #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef GCC_MEGA_AVR - #include "../portable/GCC/ATMega323/portmacro.h" -#endif - -#ifdef IAR_MEGA_AVR - #include "../portable/IAR/ATMega323/portmacro.h" -#endif - -#ifdef MPLAB_PIC24_PORT - #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" -#endif - -#ifdef MPLAB_DSPIC_PORT - #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" -#endif - -#ifdef MPLAB_PIC18F_PORT - #include "../../Source/portable/MPLAB/PIC18F/portmacro.h" -#endif - -#ifdef MPLAB_PIC32MX_PORT - #include "../../Source/portable/MPLAB/PIC32MX/portmacro.h" -#endif - -#ifdef _FEDPICC - #include "libFreeRTOS/Include/portmacro.h" -#endif - -#ifdef SDCC_CYGNAL - #include "../../Source/portable/SDCC/Cygnal/portmacro.h" -#endif - -#ifdef GCC_ARM7 - #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" -#endif - -#ifdef GCC_ARM7_ECLIPSE - #include "portmacro.h" -#endif - -#ifdef ROWLEY_LPC23xx - #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" -#endif - -#ifdef IAR_MSP430 - #include "..\..\Source\portable\IAR\MSP430\portmacro.h" -#endif - -#ifdef GCC_MSP430 - #include "../../Source/portable/GCC/MSP430F449/portmacro.h" -#endif - -#ifdef ROWLEY_MSP430 - #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" -#endif - -#ifdef ARM7_LPC21xx_KEIL_RVDS - #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" -#endif - -#ifdef SAM7_GCC - #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" -#endif - -#ifdef SAM7_IAR - #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" -#endif - -#ifdef SAM9XE_IAR - #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" -#endif - -#ifdef LPC2000_IAR - #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" -#endif - -#ifdef STR71X_IAR - #include "..\..\Source\portable\IAR\STR71x\portmacro.h" -#endif - -#ifdef STR75X_IAR - #include "..\..\Source\portable\IAR\STR75x\portmacro.h" -#endif - -#ifdef STR75X_GCC - #include "..\..\Source\portable\GCC\STR75x\portmacro.h" -#endif - -#ifdef STR91X_IAR - #include "..\..\Source\portable\IAR\STR91x\portmacro.h" -#endif - -#ifdef GCC_H8S - #include "../../Source/portable/GCC/H8S2329/portmacro.h" -#endif - -#ifdef GCC_AT91FR40008 - #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" -#endif - -#ifdef RVDS_ARMCM3_LM3S102 - #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" -#endif - -#ifdef GCC_ARMCM3_LM3S102 - #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" -#endif - -#ifdef GCC_ARMCM3 - #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" -#endif - -#ifdef IAR_ARM_CM3 - #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" -#endif - -#ifdef IAR_ARMCM3_LM - #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" -#endif - -#ifdef HCS12_CODE_WARRIOR - #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" -#endif - -#ifdef MICROBLAZE_GCC - #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" -#endif - -#ifdef TERN_EE - #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" -#endif - -#ifdef GCC_HCS12 - #include "../../Source/portable/GCC/HCS12/portmacro.h" -#endif - -#ifdef GCC_MCF5235 - #include "../../Source/portable/GCC/MCF5235/portmacro.h" -#endif - -#ifdef COLDFIRE_V2_GCC - #include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" -#endif - -#ifdef COLDFIRE_V2_CODEWARRIOR - #include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" -#endif - -#ifdef GCC_PPC405 - #include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" -#endif - -#ifdef GCC_PPC440 - #include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" -#endif - -#ifdef _16FX_SOFTUNE - #include "..\..\Source\portable\Softune\MB96340\portmacro.h" -#endif - -#ifdef BCC_INDUSTRIAL_PC_PORT - /* A short file name has to be used in place of the normal - FreeRTOSConfig.h when using the Borland compiler. */ - #include "frconfig.h" - #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef BCC_FLASH_LITE_186_PORT - /* A short file name has to be used in place of the normal - FreeRTOSConfig.h when using the Borland compiler. */ - #include "frconfig.h" - #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef __GNUC__ - #ifdef __AVR32_AVR32A__ - #include "portmacro.h" - #endif -#endif - -#ifdef __ICCAVR32__ - #ifdef __CORE__ - #if __CORE__ == __AVR32A__ - #include "portmacro.h" - #endif - #endif -#endif - -#ifdef __91467D - #include "portmacro.h" -#endif - -#ifdef __96340 - #include "portmacro.h" -#endif - - -#ifdef __IAR_V850ES_Fx3__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" -#endif - -#ifdef __IAR_V850ES_Jx3__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" -#endif - -#ifdef __IAR_V850ES_Jx3_L__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" -#endif - -#ifdef __IAR_V850ES_Jx2__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" -#endif - -#ifdef __IAR_V850ES_Hx2__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" -#endif - -#ifdef __IAR_78K0R_Kx3__ - #include "../../Source/portable/IAR/78K0R/portmacro.h" -#endif - -#ifdef __IAR_78K0R_Kx3L__ - #include "../../Source/portable/IAR/78K0R/portmacro.h" -#endif - -#endif /* DEPRECATED_DEFINITIONS_H */ - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h deleted file mode 100644 index a87fdf3..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h +++ /dev/null @@ -1,757 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef EVENT_GROUPS_H -#define EVENT_GROUPS_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h" must appear in source files before "include event_groups.h" -#endif - -/* FreeRTOS includes. */ -#include "timers.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * An event group is a collection of bits to which an application can assign a - * meaning. For example, an application may create an event group to convey - * the status of various CAN bus related events in which bit 0 might mean "A CAN - * message has been received and is ready for processing", bit 1 might mean "The - * application has queued a message that is ready for sending onto the CAN - * network", and bit 2 might mean "It is time to send a SYNC message onto the - * CAN network" etc. A task can then test the bit values to see which events - * are active, and optionally enter the Blocked state to wait for a specified - * bit or a group of specified bits to be active. To continue the CAN bus - * example, a CAN controlling task can enter the Blocked state (and therefore - * not consume any processing time) until either bit 0, bit 1 or bit 2 are - * active, at which time the bit that was actually active would inform the task - * which action it had to take (process a received message, send a message, or - * send a SYNC). - * - * The event groups implementation contains intelligence to avoid race - * conditions that would otherwise occur were an application to use a simple - * variable for the same purpose. This is particularly important with respect - * to when a bit within an event group is to be cleared, and when bits have to - * be set and then tested atomically - as is the case where event groups are - * used to create a synchronisation point between multiple tasks (a - * 'rendezvous'). - * - * \defgroup EventGroup - */ - - - -/** - * event_groups.h - * - * Type by which event groups are referenced. For example, a call to - * xEventGroupCreate() returns an EventGroupHandle_t variable that can then - * be used as a parameter to other event group functions. - * - * \defgroup EventGroupHandle_t EventGroupHandle_t - * \ingroup EventGroup - */ -struct EventGroupDef_t; -typedef struct EventGroupDef_t * EventGroupHandle_t; - -/* - * The type that holds event bits always matches TickType_t - therefore the - * number of bits it holds is set by configUSE_16_BIT_TICKS (16 bits if set to 1, - * 32 bits if set to 0. - * - * \defgroup EventBits_t EventBits_t - * \ingroup EventGroup - */ -typedef TickType_t EventBits_t; - -/** - * event_groups.h - *
- EventGroupHandle_t xEventGroupCreate( void );
- 
- * - * Create a new event group. - * - * Internally, within the FreeRTOS implementation, event groups use a [small] - * block of memory, in which the event group's structure is stored. If an event - * groups is created using xEventGropuCreate() then the required memory is - * automatically dynamically allocated inside the xEventGroupCreate() function. - * (see http://www.freertos.org/a00111.html). If an event group is created - * using xEventGropuCreateStatic() then the application writer must instead - * provide the memory that will get used by the event group. - * xEventGroupCreateStatic() therefore allows an event group to be created - * without using any dynamic memory allocation. - * - * Although event groups are not related to ticks, for internal implementation - * reasons the number of bits available for use in an event group is dependent - * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If - * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit - * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has - * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store - * event bits within an event group. - * - * @return If the event group was created then a handle to the event group is - * returned. If there was insufficient FreeRTOS heap available to create the - * event group then NULL is returned. See http://www.freertos.org/a00111.html - * - * Example usage: -
-	// Declare a variable to hold the created event group.
-	EventGroupHandle_t xCreatedEventGroup;
-
-	// Attempt to create the event group.
-	xCreatedEventGroup = xEventGroupCreate();
-
-	// Was the event group created successfully?
-	if( xCreatedEventGroup == NULL )
-	{
-		// The event group was not created because there was insufficient
-		// FreeRTOS heap available.
-	}
-	else
-	{
-		// The event group was created.
-	}
-   
- * \defgroup xEventGroupCreate xEventGroupCreate - * \ingroup EventGroup - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION; -#endif - -/** - * event_groups.h - *
- EventGroupHandle_t xEventGroupCreateStatic( EventGroupHandle_t * pxEventGroupBuffer );
- 
- * - * Create a new event group. - * - * Internally, within the FreeRTOS implementation, event groups use a [small] - * block of memory, in which the event group's structure is stored. If an event - * groups is created using xEventGropuCreate() then the required memory is - * automatically dynamically allocated inside the xEventGroupCreate() function. - * (see http://www.freertos.org/a00111.html). If an event group is created - * using xEventGropuCreateStatic() then the application writer must instead - * provide the memory that will get used by the event group. - * xEventGroupCreateStatic() therefore allows an event group to be created - * without using any dynamic memory allocation. - * - * Although event groups are not related to ticks, for internal implementation - * reasons the number of bits available for use in an event group is dependent - * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If - * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit - * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has - * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store - * event bits within an event group. - * - * @param pxEventGroupBuffer pxEventGroupBuffer must point to a variable of type - * StaticEventGroup_t, which will be then be used to hold the event group's data - * structures, removing the need for the memory to be allocated dynamically. - * - * @return If the event group was created then a handle to the event group is - * returned. If pxEventGroupBuffer was NULL then NULL is returned. - * - * Example usage: -
-	// StaticEventGroup_t is a publicly accessible structure that has the same
-	// size and alignment requirements as the real event group structure.  It is
-	// provided as a mechanism for applications to know the size of the event
-	// group (which is dependent on the architecture and configuration file
-	// settings) without breaking the strict data hiding policy by exposing the
-	// real event group internals.  This StaticEventGroup_t variable is passed
-	// into the xSemaphoreCreateEventGroupStatic() function and is used to store
-	// the event group's data structures
-	StaticEventGroup_t xEventGroupBuffer;
-
-	// Create the event group without dynamically allocating any memory.
-	xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer );
-   
- */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) PRIVILEGED_FUNCTION; -#endif - -/** - * event_groups.h - *
-	EventBits_t xEventGroupWaitBits( 	EventGroupHandle_t xEventGroup,
-										const EventBits_t uxBitsToWaitFor,
-										const BaseType_t xClearOnExit,
-										const BaseType_t xWaitForAllBits,
-										const TickType_t xTicksToWait );
- 
- * - * [Potentially] block to wait for one or more bits to be set within a - * previously created event group. - * - * This function cannot be called from an interrupt. - * - * @param xEventGroup The event group in which the bits are being tested. The - * event group must have previously been created using a call to - * xEventGroupCreate(). - * - * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test - * inside the event group. For example, to wait for bit 0 and/or bit 2 set - * uxBitsToWaitFor to 0x05. To wait for bits 0 and/or bit 1 and/or bit 2 set - * uxBitsToWaitFor to 0x07. Etc. - * - * @param xClearOnExit If xClearOnExit is set to pdTRUE then any bits within - * uxBitsToWaitFor that are set within the event group will be cleared before - * xEventGroupWaitBits() returns if the wait condition was met (if the function - * returns for a reason other than a timeout). If xClearOnExit is set to - * pdFALSE then the bits set in the event group are not altered when the call to - * xEventGroupWaitBits() returns. - * - * @param xWaitForAllBits If xWaitForAllBits is set to pdTRUE then - * xEventGroupWaitBits() will return when either all the bits in uxBitsToWaitFor - * are set or the specified block time expires. If xWaitForAllBits is set to - * pdFALSE then xEventGroupWaitBits() will return when any one of the bits set - * in uxBitsToWaitFor is set or the specified block time expires. The block - * time is specified by the xTicksToWait parameter. - * - * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait - * for one/all (depending on the xWaitForAllBits value) of the bits specified by - * uxBitsToWaitFor to become set. - * - * @return The value of the event group at the time either the bits being waited - * for became set, or the block time expired. Test the return value to know - * which bits were set. If xEventGroupWaitBits() returned because its timeout - * expired then not all the bits being waited for will be set. If - * xEventGroupWaitBits() returned because the bits it was waiting for were set - * then the returned value is the event group value before any bits were - * automatically cleared in the case that xClearOnExit parameter was set to - * pdTRUE. - * - * Example usage: -
-   #define BIT_0	( 1 << 0 )
-   #define BIT_4	( 1 << 4 )
-
-   void aFunction( EventGroupHandle_t xEventGroup )
-   {
-   EventBits_t uxBits;
-   const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
-
-		// Wait a maximum of 100ms for either bit 0 or bit 4 to be set within
-		// the event group.  Clear the bits before exiting.
-		uxBits = xEventGroupWaitBits(
-					xEventGroup,	// The event group being tested.
-					BIT_0 | BIT_4,	// The bits within the event group to wait for.
-					pdTRUE,			// BIT_0 and BIT_4 should be cleared before returning.
-					pdFALSE,		// Don't wait for both bits, either bit will do.
-					xTicksToWait );	// Wait a maximum of 100ms for either bit to be set.
-
-		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
-		{
-			// xEventGroupWaitBits() returned because both bits were set.
-		}
-		else if( ( uxBits & BIT_0 ) != 0 )
-		{
-			// xEventGroupWaitBits() returned because just BIT_0 was set.
-		}
-		else if( ( uxBits & BIT_4 ) != 0 )
-		{
-			// xEventGroupWaitBits() returned because just BIT_4 was set.
-		}
-		else
-		{
-			// xEventGroupWaitBits() returned because xTicksToWait ticks passed
-			// without either BIT_0 or BIT_4 becoming set.
-		}
-   }
-   
- * \defgroup xEventGroupWaitBits xEventGroupWaitBits - * \ingroup EventGroup - */ -EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - -/** - * event_groups.h - *
-	EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear );
- 
- * - * Clear bits within an event group. This function cannot be called from an - * interrupt. - * - * @param xEventGroup The event group in which the bits are to be cleared. - * - * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear - * in the event group. For example, to clear bit 3 only, set uxBitsToClear to - * 0x08. To clear bit 3 and bit 0 set uxBitsToClear to 0x09. - * - * @return The value of the event group before the specified bits were cleared. - * - * Example usage: -
-   #define BIT_0	( 1 << 0 )
-   #define BIT_4	( 1 << 4 )
-
-   void aFunction( EventGroupHandle_t xEventGroup )
-   {
-   EventBits_t uxBits;
-
-		// Clear bit 0 and bit 4 in xEventGroup.
-		uxBits = xEventGroupClearBits(
-								xEventGroup,	// The event group being updated.
-								BIT_0 | BIT_4 );// The bits being cleared.
-
-		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
-		{
-			// Both bit 0 and bit 4 were set before xEventGroupClearBits() was
-			// called.  Both will now be clear (not set).
-		}
-		else if( ( uxBits & BIT_0 ) != 0 )
-		{
-			// Bit 0 was set before xEventGroupClearBits() was called.  It will
-			// now be clear.
-		}
-		else if( ( uxBits & BIT_4 ) != 0 )
-		{
-			// Bit 4 was set before xEventGroupClearBits() was called.  It will
-			// now be clear.
-		}
-		else
-		{
-			// Neither bit 0 nor bit 4 were set in the first place.
-		}
-   }
-   
- * \defgroup xEventGroupClearBits xEventGroupClearBits - * \ingroup EventGroup - */ -EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; - -/** - * event_groups.h - *
-	BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
- 
- * - * A version of xEventGroupClearBits() that can be called from an interrupt. - * - * Setting bits in an event group is not a deterministic operation because there - * are an unknown number of tasks that may be waiting for the bit or bits being - * set. FreeRTOS does not allow nondeterministic operations to be performed - * while interrupts are disabled, so protects event groups that are accessed - * from tasks by suspending the scheduler rather than disabling interrupts. As - * a result event groups cannot be accessed directly from an interrupt service - * routine. Therefore xEventGroupClearBitsFromISR() sends a message to the - * timer task to have the clear operation performed in the context of the timer - * task. - * - * @param xEventGroup The event group in which the bits are to be cleared. - * - * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear. - * For example, to clear bit 3 only, set uxBitsToClear to 0x08. To clear bit 3 - * and bit 0 set uxBitsToClear to 0x09. - * - * @return If the request to execute the function was posted successfully then - * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned - * if the timer service queue was full. - * - * Example usage: -
-   #define BIT_0	( 1 << 0 )
-   #define BIT_4	( 1 << 4 )
-
-   // An event group which it is assumed has already been created by a call to
-   // xEventGroupCreate().
-   EventGroupHandle_t xEventGroup;
-
-   void anInterruptHandler( void )
-   {
-		// Clear bit 0 and bit 4 in xEventGroup.
-		xResult = xEventGroupClearBitsFromISR(
-							xEventGroup,	 // The event group being updated.
-							BIT_0 | BIT_4 ); // The bits being set.
-
-		if( xResult == pdPASS )
-		{
-			// The message was posted successfully.
-		}
-  }
-   
- * \defgroup xEventGroupClearBitsFromISR xEventGroupClearBitsFromISR - * \ingroup EventGroup - */ -#if( configUSE_TRACE_FACILITY == 1 ) - BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; -#else - #define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ) -#endif - -/** - * event_groups.h - *
-	EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
- 
- * - * Set bits within an event group. - * This function cannot be called from an interrupt. xEventGroupSetBitsFromISR() - * is a version that can be called from an interrupt. - * - * Setting bits in an event group will automatically unblock tasks that are - * blocked waiting for the bits. - * - * @param xEventGroup The event group in which the bits are to be set. - * - * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. - * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 - * and bit 0 set uxBitsToSet to 0x09. - * - * @return The value of the event group at the time the call to - * xEventGroupSetBits() returns. There are two reasons why the returned value - * might have the bits specified by the uxBitsToSet parameter cleared. First, - * if setting a bit results in a task that was waiting for the bit leaving the - * blocked state then it is possible the bit will be cleared automatically - * (see the xClearBitOnExit parameter of xEventGroupWaitBits()). Second, any - * unblocked (or otherwise Ready state) task that has a priority above that of - * the task that called xEventGroupSetBits() will execute and may change the - * event group value before the call to xEventGroupSetBits() returns. - * - * Example usage: -
-   #define BIT_0	( 1 << 0 )
-   #define BIT_4	( 1 << 4 )
-
-   void aFunction( EventGroupHandle_t xEventGroup )
-   {
-   EventBits_t uxBits;
-
-		// Set bit 0 and bit 4 in xEventGroup.
-		uxBits = xEventGroupSetBits(
-							xEventGroup,	// The event group being updated.
-							BIT_0 | BIT_4 );// The bits being set.
-
-		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
-		{
-			// Both bit 0 and bit 4 remained set when the function returned.
-		}
-		else if( ( uxBits & BIT_0 ) != 0 )
-		{
-			// Bit 0 remained set when the function returned, but bit 4 was
-			// cleared.  It might be that bit 4 was cleared automatically as a
-			// task that was waiting for bit 4 was removed from the Blocked
-			// state.
-		}
-		else if( ( uxBits & BIT_4 ) != 0 )
-		{
-			// Bit 4 remained set when the function returned, but bit 0 was
-			// cleared.  It might be that bit 0 was cleared automatically as a
-			// task that was waiting for bit 0 was removed from the Blocked
-			// state.
-		}
-		else
-		{
-			// Neither bit 0 nor bit 4 remained set.  It might be that a task
-			// was waiting for both of the bits to be set, and the bits were
-			// cleared as the task left the Blocked state.
-		}
-   }
-   
- * \defgroup xEventGroupSetBits xEventGroupSetBits - * \ingroup EventGroup - */ -EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; - -/** - * event_groups.h - *
-	BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken );
- 
- * - * A version of xEventGroupSetBits() that can be called from an interrupt. - * - * Setting bits in an event group is not a deterministic operation because there - * are an unknown number of tasks that may be waiting for the bit or bits being - * set. FreeRTOS does not allow nondeterministic operations to be performed in - * interrupts or from critical sections. Therefore xEventGroupSetBitsFromISR() - * sends a message to the timer task to have the set operation performed in the - * context of the timer task - where a scheduler lock is used in place of a - * critical section. - * - * @param xEventGroup The event group in which the bits are to be set. - * - * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. - * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 - * and bit 0 set uxBitsToSet to 0x09. - * - * @param pxHigherPriorityTaskWoken As mentioned above, calling this function - * will result in a message being sent to the timer daemon task. If the - * priority of the timer daemon task is higher than the priority of the - * currently running task (the task the interrupt interrupted) then - * *pxHigherPriorityTaskWoken will be set to pdTRUE by - * xEventGroupSetBitsFromISR(), indicating that a context switch should be - * requested before the interrupt exits. For that reason - * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the - * example code below. - * - * @return If the request to execute the function was posted successfully then - * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned - * if the timer service queue was full. - * - * Example usage: -
-   #define BIT_0	( 1 << 0 )
-   #define BIT_4	( 1 << 4 )
-
-   // An event group which it is assumed has already been created by a call to
-   // xEventGroupCreate().
-   EventGroupHandle_t xEventGroup;
-
-   void anInterruptHandler( void )
-   {
-   BaseType_t xHigherPriorityTaskWoken, xResult;
-
-		// xHigherPriorityTaskWoken must be initialised to pdFALSE.
-		xHigherPriorityTaskWoken = pdFALSE;
-
-		// Set bit 0 and bit 4 in xEventGroup.
-		xResult = xEventGroupSetBitsFromISR(
-							xEventGroup,	// The event group being updated.
-							BIT_0 | BIT_4   // The bits being set.
-							&xHigherPriorityTaskWoken );
-
-		// Was the message posted successfully?
-		if( xResult == pdPASS )
-		{
-			// If xHigherPriorityTaskWoken is now set to pdTRUE then a context
-			// switch should be requested.  The macro used is port specific and
-			// will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() -
-			// refer to the documentation page for the port being used.
-			portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
-		}
-  }
-   
- * \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR - * \ingroup EventGroup - */ -#if( configUSE_TRACE_FACILITY == 1 ) - BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; -#else - #define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ) -#endif - -/** - * event_groups.h - *
-	EventBits_t xEventGroupSync(	EventGroupHandle_t xEventGroup,
-									const EventBits_t uxBitsToSet,
-									const EventBits_t uxBitsToWaitFor,
-									TickType_t xTicksToWait );
- 
- * - * Atomically set bits within an event group, then wait for a combination of - * bits to be set within the same event group. This functionality is typically - * used to synchronise multiple tasks, where each task has to wait for the other - * tasks to reach a synchronisation point before proceeding. - * - * This function cannot be used from an interrupt. - * - * The function will return before its block time expires if the bits specified - * by the uxBitsToWait parameter are set, or become set within that time. In - * this case all the bits specified by uxBitsToWait will be automatically - * cleared before the function returns. - * - * @param xEventGroup The event group in which the bits are being tested. The - * event group must have previously been created using a call to - * xEventGroupCreate(). - * - * @param uxBitsToSet The bits to set in the event group before determining - * if, and possibly waiting for, all the bits specified by the uxBitsToWait - * parameter are set. - * - * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test - * inside the event group. For example, to wait for bit 0 and bit 2 set - * uxBitsToWaitFor to 0x05. To wait for bits 0 and bit 1 and bit 2 set - * uxBitsToWaitFor to 0x07. Etc. - * - * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait - * for all of the bits specified by uxBitsToWaitFor to become set. - * - * @return The value of the event group at the time either the bits being waited - * for became set, or the block time expired. Test the return value to know - * which bits were set. If xEventGroupSync() returned because its timeout - * expired then not all the bits being waited for will be set. If - * xEventGroupSync() returned because all the bits it was waiting for were - * set then the returned value is the event group value before any bits were - * automatically cleared. - * - * Example usage: -
- // Bits used by the three tasks.
- #define TASK_0_BIT		( 1 << 0 )
- #define TASK_1_BIT		( 1 << 1 )
- #define TASK_2_BIT		( 1 << 2 )
-
- #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT )
-
- // Use an event group to synchronise three tasks.  It is assumed this event
- // group has already been created elsewhere.
- EventGroupHandle_t xEventBits;
-
- void vTask0( void *pvParameters )
- {
- EventBits_t uxReturn;
- TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
-
-	 for( ;; )
-	 {
-		// Perform task functionality here.
-
-		// Set bit 0 in the event flag to note this task has reached the
-		// sync point.  The other two tasks will set the other two bits defined
-		// by ALL_SYNC_BITS.  All three tasks have reached the synchronisation
-		// point when all the ALL_SYNC_BITS are set.  Wait a maximum of 100ms
-		// for this to happen.
-		uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait );
-
-		if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS )
-		{
-			// All three tasks reached the synchronisation point before the call
-			// to xEventGroupSync() timed out.
-		}
-	}
- }
-
- void vTask1( void *pvParameters )
- {
-	 for( ;; )
-	 {
-		// Perform task functionality here.
-
-		// Set bit 1 in the event flag to note this task has reached the
-		// synchronisation point.  The other two tasks will set the other two
-		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the
-		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait
-		// indefinitely for this to happen.
-		xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY );
-
-		// xEventGroupSync() was called with an indefinite block time, so
-		// this task will only reach here if the syncrhonisation was made by all
-		// three tasks, so there is no need to test the return value.
-	 }
- }
-
- void vTask2( void *pvParameters )
- {
-	 for( ;; )
-	 {
-		// Perform task functionality here.
-
-		// Set bit 2 in the event flag to note this task has reached the
-		// synchronisation point.  The other two tasks will set the other two
-		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the
-		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait
-		// indefinitely for this to happen.
-		xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY );
-
-		// xEventGroupSync() was called with an indefinite block time, so
-		// this task will only reach here if the syncrhonisation was made by all
-		// three tasks, so there is no need to test the return value.
-	}
- }
-
- 
- * \defgroup xEventGroupSync xEventGroupSync - * \ingroup EventGroup - */ -EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - - -/** - * event_groups.h - *
-	EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup );
- 
- * - * Returns the current value of the bits in an event group. This function - * cannot be used from an interrupt. - * - * @param xEventGroup The event group being queried. - * - * @return The event group bits at the time xEventGroupGetBits() was called. - * - * \defgroup xEventGroupGetBits xEventGroupGetBits - * \ingroup EventGroup - */ -#define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( xEventGroup, 0 ) - -/** - * event_groups.h - *
-	EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );
- 
- * - * A version of xEventGroupGetBits() that can be called from an ISR. - * - * @param xEventGroup The event group being queried. - * - * @return The event group bits at the time xEventGroupGetBitsFromISR() was called. - * - * \defgroup xEventGroupGetBitsFromISR xEventGroupGetBitsFromISR - * \ingroup EventGroup - */ -EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; - -/** - * event_groups.h - *
-	void xEventGroupDelete( EventGroupHandle_t xEventGroup );
- 
- * - * Delete an event group that was previously created by a call to - * xEventGroupCreate(). Tasks that are blocked on the event group will be - * unblocked and obtain 0 as the event group's value. - * - * @param xEventGroup The event group being deleted. - */ -void vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; - -/* For internal use only. */ -void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION; -void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; - - -#if (configUSE_TRACE_FACILITY == 1) - UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) PRIVILEGED_FUNCTION; - void vEventGroupSetNumber( void* xEventGroup, UBaseType_t uxEventGroupNumber ) PRIVILEGED_FUNCTION; -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* EVENT_GROUPS_H */ - - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/list.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/list.h deleted file mode 100644 index a3e3024..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/list.h +++ /dev/null @@ -1,412 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/* - * This is the list implementation used by the scheduler. While it is tailored - * heavily for the schedulers needs, it is also available for use by - * application code. - * - * list_ts can only store pointers to list_item_ts. Each ListItem_t contains a - * numeric value (xItemValue). Most of the time the lists are sorted in - * descending item value order. - * - * Lists are created already containing one list item. The value of this - * item is the maximum possible that can be stored, it is therefore always at - * the end of the list and acts as a marker. The list member pxHead always - * points to this marker - even though it is at the tail of the list. This - * is because the tail contains a wrap back pointer to the true head of - * the list. - * - * In addition to it's value, each list item contains a pointer to the next - * item in the list (pxNext), a pointer to the list it is in (pxContainer) - * and a pointer to back to the object that contains it. These later two - * pointers are included for efficiency of list manipulation. There is - * effectively a two way link between the object containing the list item and - * the list item itself. - * - * - * \page ListIntroduction List Implementation - * \ingroup FreeRTOSIntro - */ - -#ifndef INC_FREERTOS_H - #error FreeRTOS.h must be included before list.h -#endif - -#ifndef LIST_H -#define LIST_H - -/* - * The list structure members are modified from within interrupts, and therefore - * by rights should be declared volatile. However, they are only modified in a - * functionally atomic way (within critical sections of with the scheduler - * suspended) and are either passed by reference into a function or indexed via - * a volatile variable. Therefore, in all use cases tested so far, the volatile - * qualifier can be omitted in order to provide a moderate performance - * improvement without adversely affecting functional behaviour. The assembly - * instructions generated by the IAR, ARM and GCC compilers when the respective - * compiler's options were set for maximum optimisation has been inspected and - * deemed to be as intended. That said, as compiler technology advances, and - * especially if aggressive cross module optimisation is used (a use case that - * has not been exercised to any great extend) then it is feasible that the - * volatile qualifier will be needed for correct optimisation. It is expected - * that a compiler removing essential code because, without the volatile - * qualifier on the list structure members and with aggressive cross module - * optimisation, the compiler deemed the code unnecessary will result in - * complete and obvious failure of the scheduler. If this is ever experienced - * then the volatile qualifier can be inserted in the relevant places within the - * list structures by simply defining configLIST_VOLATILE to volatile in - * FreeRTOSConfig.h (as per the example at the bottom of this comment block). - * If configLIST_VOLATILE is not defined then the preprocessor directives below - * will simply #define configLIST_VOLATILE away completely. - * - * To use volatile list structure members then add the following line to - * FreeRTOSConfig.h (without the quotes): - * "#define configLIST_VOLATILE volatile" - */ -#ifndef configLIST_VOLATILE - #define configLIST_VOLATILE -#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Macros that can be used to place known values within the list structures, -then check that the known values do not get corrupted during the execution of -the application. These may catch the list data structures being overwritten in -memory. They will not catch data errors caused by incorrect configuration or -use of FreeRTOS.*/ -#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) - /* Define the macros to do nothing. */ - #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE - #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE - #define listFIRST_LIST_INTEGRITY_CHECK_VALUE - #define listSECOND_LIST_INTEGRITY_CHECK_VALUE - #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) - #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) - #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) - #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) - #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) - #define listTEST_LIST_INTEGRITY( pxList ) -#else - /* Define macros that add new members into the list structures. */ - #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue1; - #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue2; - #define listFIRST_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue1; - #define listSECOND_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue2; - - /* Define macros that set the new structure members to known values. */ - #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE - #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE - #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) ( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE - #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE - - /* Define macros that will assert if one of the structure members does not - contain its expected value. */ - #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) - #define listTEST_LIST_INTEGRITY( pxList ) configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) -#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */ - - -/* - * Definition of the only type of object that a list can contain. - */ -struct xLIST; -struct xLIST_ITEM -{ - listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ - configLIST_VOLATILE TickType_t xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */ - struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */ - struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */ - void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ - struct xLIST * configLIST_VOLATILE pxContainer; /*< Pointer to the list in which this list item is placed (if any). */ - listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ -}; -typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */ - -struct xMINI_LIST_ITEM -{ - listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ - configLIST_VOLATILE TickType_t xItemValue; - struct xLIST_ITEM * configLIST_VOLATILE pxNext; - struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; -}; -typedef struct xMINI_LIST_ITEM MiniListItem_t; - -/* - * Definition of the type of queue used by the scheduler. - */ -typedef struct xLIST -{ - listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ - volatile UBaseType_t uxNumberOfItems; - ListItem_t * configLIST_VOLATILE pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */ - MiniListItem_t xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ - listSECOND_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ -} List_t; - -/* - * Access macro to set the owner of a list item. The owner of a list item - * is the object (usually a TCB) that contains the list item. - * - * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER - * \ingroup LinkedList - */ -#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) - -/* - * Access macro to get the owner of a list item. The owner of a list item - * is the object (usually a TCB) that contains the list item. - * - * \page listGET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER - * \ingroup LinkedList - */ -#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner ) - -/* - * Access macro to set the value of the list item. In most cases the value is - * used to sort the list in descending order. - * - * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE - * \ingroup LinkedList - */ -#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) ) - -/* - * Access macro to retrieve the value of the list item. The value can - * represent anything - for example the priority of a task, or the time at - * which a task should be unblocked. - * - * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE - * \ingroup LinkedList - */ -#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) - -/* - * Access macro to retrieve the value of the list item at the head of a given - * list. - * - * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE - * \ingroup LinkedList - */ -#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext->xItemValue ) - -/* - * Return the list item at the head of the list. - * - * \page listGET_HEAD_ENTRY listGET_HEAD_ENTRY - * \ingroup LinkedList - */ -#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext ) - -/* - * Return the next list item. - * - * \page listGET_NEXT listGET_NEXT - * \ingroup LinkedList - */ -#define listGET_NEXT( pxListItem ) ( ( pxListItem )->pxNext ) - -/* - * Return the list item that marks the end of the list - * - * \page listGET_END_MARKER listGET_END_MARKER - * \ingroup LinkedList - */ -#define listGET_END_MARKER( pxList ) ( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) ) - -/* - * Access macro to determine if a list contains any items. The macro will - * only have the value true if the list is empty. - * - * \page listLIST_IS_EMPTY listLIST_IS_EMPTY - * \ingroup LinkedList - */ -#define listLIST_IS_EMPTY( pxList ) ( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE ) - -/* - * Access macro to return the number of items in the list. - */ -#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) - -/* - * Access function to obtain the owner of the next entry in a list. - * - * The list member pxIndex is used to walk through a list. Calling - * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list - * and returns that entry's pxOwner parameter. Using multiple calls to this - * function it is therefore possible to move through every item contained in - * a list. - * - * The pxOwner parameter of a list item is a pointer to the object that owns - * the list item. In the scheduler this is normally a task control block. - * The pxOwner parameter effectively creates a two way link between the list - * item and its owner. - * - * @param pxTCB pxTCB is set to the address of the owner of the next list item. - * @param pxList The list from which the next item owner is to be returned. - * - * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY - * \ingroup LinkedList - */ -#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ -{ \ -List_t * const pxConstList = ( pxList ); \ - /* Increment the index to the next item and return the item, ensuring */ \ - /* we don't return the marker used at the end of the list. */ \ - ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ - if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \ - { \ - ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ - } \ - ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ -} - - -/* - * Access function to obtain the owner of the first entry in a list. Lists - * are normally sorted in ascending item value order. - * - * This function returns the pxOwner member of the first item in the list. - * The pxOwner parameter of a list item is a pointer to the object that owns - * the list item. In the scheduler this is normally a task control block. - * The pxOwner parameter effectively creates a two way link between the list - * item and its owner. - * - * @param pxList The list from which the owner of the head item is to be - * returned. - * - * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY - * \ingroup LinkedList - */ -#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner ) - -/* - * Check to see if a list item is within a list. The list item maintains a - * "container" pointer that points to the list it is in. All this macro does - * is check to see if the container and the list match. - * - * @param pxList The list we want to know if the list item is within. - * @param pxListItem The list item we want to know if is in the list. - * @return pdTRUE if the list item is in the list, otherwise pdFALSE. - */ -#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( ( pxListItem )->pxContainer == ( pxList ) ) ? ( pdTRUE ) : ( pdFALSE ) ) - -/* - * Return the list a list item is contained within (referenced from). - * - * @param pxListItem The list item being queried. - * @return A pointer to the List_t object that references the pxListItem - */ -#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pxContainer ) - -/* - * This provides a crude means of knowing if a list has been initialised, as - * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise() - * function. - */ -#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY ) - -/* - * Must be called before a list is used! This initialises all the members - * of the list structure and inserts the xListEnd item into the list as a - * marker to the back of the list. - * - * @param pxList Pointer to the list being initialised. - * - * \page vListInitialise vListInitialise - * \ingroup LinkedList - */ -void vListInitialise( List_t * const pxList ) PRIVILEGED_FUNCTION; - -/* - * Must be called before a list item is used. This sets the list container to - * null so the item does not think that it is already contained in a list. - * - * @param pxItem Pointer to the list item being initialised. - * - * \page vListInitialiseItem vListInitialiseItem - * \ingroup LinkedList - */ -void vListInitialiseItem( ListItem_t * const pxItem ) PRIVILEGED_FUNCTION; - -/* - * Insert a list item into a list. The item will be inserted into the list in - * a position determined by its item value (descending item value order). - * - * @param pxList The list into which the item is to be inserted. - * - * @param pxNewListItem The item that is to be placed in the list. - * - * \page vListInsert vListInsert - * \ingroup LinkedList - */ -void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; - -/* - * Insert a list item into a list. The item will be inserted in a position - * such that it will be the last item within the list returned by multiple - * calls to listGET_OWNER_OF_NEXT_ENTRY. - * - * The list member pxIndex is used to walk through a list. Calling - * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list. - * Placing an item in a list using vListInsertEnd effectively places the item - * in the list position pointed to by pxIndex. This means that every other - * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before - * the pxIndex parameter again points to the item being inserted. - * - * @param pxList The list into which the item is to be inserted. - * - * @param pxNewListItem The list item to be inserted into the list. - * - * \page vListInsertEnd vListInsertEnd - * \ingroup LinkedList - */ -void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; - -/* - * Remove an item from a list. The list item has a pointer to the list that - * it is in, so only the list item need be passed into the function. - * - * @param uxListRemove The item to be removed. The item will remove itself from - * the list pointed to by it's pxContainer parameter. - * - * @return The number of items that remain in the list after the list item has - * been removed. - * - * \page uxListRemove uxListRemove - * \ingroup LinkedList - */ -UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION; - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h deleted file mode 100644 index 0c3edb9..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h +++ /dev/null @@ -1,803 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - - -/* - * Message buffers build functionality on top of FreeRTOS stream buffers. - * Whereas stream buffers are used to send a continuous stream of data from one - * task or interrupt to another, message buffers are used to send variable - * length discrete messages from one task or interrupt to another. Their - * implementation is light weight, making them particularly suited for interrupt - * to task and core to core communication scenarios. - * - * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer - * implementation (so also the message buffer implementation, as message buffers - * are built on top of stream buffers) assumes there is only one task or - * interrupt that will write to the buffer (the writer), and only one task or - * interrupt that will read from the buffer (the reader). It is safe for the - * writer and reader to be different tasks or interrupts, but, unlike other - * FreeRTOS objects, it is not safe to have multiple different writers or - * multiple different readers. If there are to be multiple different writers - * then the application writer must place each call to a writing API function - * (such as xMessageBufferSend()) inside a critical section and set the send - * block time to 0. Likewise, if there are to be multiple different readers - * then the application writer must place each call to a reading API function - * (such as xMessageBufferRead()) inside a critical section and set the receive - * timeout to 0. - * - * Message buffers hold variable length messages. To enable that, when a - * message is written to the message buffer an additional sizeof( size_t ) bytes - * are also written to store the message's length (that happens internally, with - * the API function). sizeof( size_t ) is typically 4 bytes on a 32-bit - * architecture, so writing a 10 byte message to a message buffer on a 32-bit - * architecture will actually reduce the available space in the message buffer - * by 14 bytes (10 byte are used by the message, and 4 bytes to hold the length - * of the message). - */ - -#ifndef FREERTOS_MESSAGE_BUFFER_H -#define FREERTOS_MESSAGE_BUFFER_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h must appear in source files before include message_buffer.h" -#endif - -/* Message buffers are built onto of stream buffers. */ -#include "stream_buffer.h" - -#if defined( __cplusplus ) -extern "C" { -#endif - -/** - * Type by which message buffers are referenced. For example, a call to - * xMessageBufferCreate() returns an MessageBufferHandle_t variable that can - * then be used as a parameter to xMessageBufferSend(), xMessageBufferReceive(), - * etc. - */ -typedef void * MessageBufferHandle_t; - -/*-----------------------------------------------------------*/ - -/** - * message_buffer.h - * -
-MessageBufferHandle_t xMessageBufferCreate( size_t xBufferSizeBytes );
-
- * - * Creates a new message buffer using dynamically allocated memory. See - * xMessageBufferCreateStatic() for a version that uses statically allocated - * memory (memory that is allocated at compile time). - * - * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in - * FreeRTOSConfig.h for xMessageBufferCreate() to be available. - * - * @param xBufferSizeBytes The total number of bytes (not messages) the message - * buffer will be able to hold at any one time. When a message is written to - * the message buffer an additional sizeof( size_t ) bytes are also written to - * store the message's length. sizeof( size_t ) is typically 4 bytes on a - * 32-bit architecture, so on most 32-bit architectures a 10 byte message will - * take up 14 bytes of message buffer space. - * - * @return If NULL is returned, then the message buffer cannot be created - * because there is insufficient heap memory available for FreeRTOS to allocate - * the message buffer data structures and storage area. A non-NULL value being - * returned indicates that the message buffer has been created successfully - - * the returned value should be stored as the handle to the created message - * buffer. - * - * Example use: -
-
-void vAFunction( void )
-{
-MessageBufferHandle_t xMessageBuffer;
-const size_t xMessageBufferSizeBytes = 100;
-
-    // Create a message buffer that can hold 100 bytes.  The memory used to hold
-    // both the message buffer structure and the messages themselves is allocated
-    // dynamically.  Each message added to the buffer consumes an additional 4
-    // bytes which are used to hold the lengh of the message.
-    xMessageBuffer = xMessageBufferCreate( xMessageBufferSizeBytes );
-
-    if( xMessageBuffer == NULL )
-    {
-        // There was not enough heap memory space available to create the
-        // message buffer.
-    }
-    else
-    {
-        // The message buffer was created successfully and can now be used.
-    }
-
-
- * \defgroup xMessageBufferCreate xMessageBufferCreate - * \ingroup MessageBufferManagement - */ -#define xMessageBufferCreate( xBufferSizeBytes ) ( MessageBufferHandle_t ) xStreamBufferGenericCreate( xBufferSizeBytes, ( size_t ) 0, pdTRUE ) - -/** - * message_buffer.h - * -
-MessageBufferHandle_t xMessageBufferCreateStatic( size_t xBufferSizeBytes,
-                                                  uint8_t *pucMessageBufferStorageArea,
-                                                  StaticMessageBuffer_t *pxStaticMessageBuffer );
-
- * Creates a new message buffer using statically allocated memory. See - * xMessageBufferCreate() for a version that uses dynamically allocated memory. - * - * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the - * pucMessageBufferStorageArea parameter. When a message is written to the - * message buffer an additional sizeof( size_t ) bytes are also written to store - * the message's length. sizeof( size_t ) is typically 4 bytes on a 32-bit - * architecture, so on most 32-bit architecture a 10 byte message will take up - * 14 bytes of message buffer space. The maximum number of bytes that can be - * stored in the message buffer is actually (xBufferSizeBytes - 1). - * - * @param pucMessageBufferStorageArea Must point to a uint8_t array that is at - * least xBufferSizeBytes + 1 big. This is the array to which messages are - * copied when they are written to the message buffer. - * - * @param pxStaticMessageBuffer Must point to a variable of type - * StaticMessageBuffer_t, which will be used to hold the message buffer's data - * structure. - * - * @return If the message buffer is created successfully then a handle to the - * created message buffer is returned. If either pucMessageBufferStorageArea or - * pxStaticmessageBuffer are NULL then NULL is returned. - * - * Example use: -
-
-// Used to dimension the array used to hold the messages.  The available space
-// will actually be one less than this, so 999.
-#define STORAGE_SIZE_BYTES 1000
-
-// Defines the memory that will actually hold the messages within the message
-// buffer.
-static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ];
-
-// The variable used to hold the message buffer structure.
-StaticMessageBuffer_t xMessageBufferStruct;
-
-void MyFunction( void )
-{
-MessageBufferHandle_t xMessageBuffer;
-
-    xMessageBuffer = xMessageBufferCreateStatic( sizeof( ucBufferStorage ),
-                                                 ucBufferStorage,
-                                                 &xMessageBufferStruct );
-
-    // As neither the pucMessageBufferStorageArea or pxStaticMessageBuffer
-    // parameters were NULL, xMessageBuffer will not be NULL, and can be used to
-    // reference the created message buffer in other message buffer API calls.
-
-    // Other code that uses the message buffer can go here.
-}
-
-
- * \defgroup xMessageBufferCreateStatic xMessageBufferCreateStatic - * \ingroup MessageBufferManagement - */ -#define xMessageBufferCreateStatic( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer ) ( MessageBufferHandle_t ) xStreamBufferGenericCreateStatic( xBufferSizeBytes, 0, pdTRUE, pucMessageBufferStorageArea, pxStaticMessageBuffer ) - -/** - * message_buffer.h - * -
-size_t xMessageBufferSend( MessageBufferHandle_t xMessageBuffer,
-                           const void *pvTxData,
-                           size_t xDataLengthBytes,
-                           TickType_t xTicksToWait );
-
- *
- * Sends a discrete message to the message buffer.  The message can be any
- * length that fits within the buffer's free space, and is copied into the
- * buffer.
- *
- * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer
- * implementation (so also the message buffer implementation, as message buffers
- * are built on top of stream buffers) assumes there is only one task or
- * interrupt that will write to the buffer (the writer), and only one task or
- * interrupt that will read from the buffer (the reader).  It is safe for the
- * writer and reader to be different tasks or interrupts, but, unlike other
- * FreeRTOS objects, it is not safe to have multiple different writers or
- * multiple different readers.  If there are to be multiple different writers
- * then the application writer must place each call to a writing API function
- * (such as xMessageBufferSend()) inside a critical section and set the send
- * block time to 0.  Likewise, if there are to be multiple different readers
- * then the application writer must place each call to a reading API function
- * (such as xMessageBufferRead()) inside a critical section and set the receive
- * block time to 0.
- *
- * Use xMessageBufferSend() to write to a message buffer from a task.  Use
- * xMessageBufferSendFromISR() to write to a message buffer from an interrupt
- * service routine (ISR).
- *
- * @param xMessageBuffer The handle of the message buffer to which a message is
- * being sent.
- *
- * @param pvTxData A pointer to the message that is to be copied into the
- * message buffer.
- *
- * @param xDataLengthBytes The length of the message.  That is, the number of
- * bytes to copy from pvTxData into the message buffer.  When a message is
- * written to the message buffer an additional sizeof( size_t ) bytes are also
- * written to store the message's length.  sizeof( size_t ) is typically 4 bytes
- * on a 32-bit architecture, so on most 32-bit architecture setting
- * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24
- * bytes (20 bytes of message data and 4 bytes to hold the message length).
- *
- * @param xTicksToWait The maximum amount of time the calling task should remain
- * in the Blocked state to wait for enough space to become available in the
- * message buffer, should the message buffer have insufficient space when
- * xMessageBufferSend() is called.  The calling task will never block if
- * xTicksToWait is zero.  The block time is specified in tick periods, so the
- * absolute time it represents is dependent on the tick frequency.  The macro
- * pdMS_TO_TICKS() can be used to convert a time specified in milliseconds into
- * a time specified in ticks.  Setting xTicksToWait to portMAX_DELAY will cause
- * the task to wait indefinitely (without timing out), provided
- * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h.  Tasks do not use any
- * CPU time when they are in the Blocked state.
- *
- * @return The number of bytes written to the message buffer.  If the call to
- * xMessageBufferSend() times out before there was enough space to write the
- * message into the message buffer then zero is returned.  If the call did not
- * time out then xDataLengthBytes is returned.
- *
- * Example use:
-
-void vAFunction( MessageBufferHandle_t xMessageBuffer )
-{
-size_t xBytesSent;
-uint8_t ucArrayToSend[] = { 0, 1, 2, 3 };
-char *pcStringToSend = "String to send";
-const TickType_t x100ms = pdMS_TO_TICKS( 100 );
-
-    // Send an array to the message buffer, blocking for a maximum of 100ms to
-    // wait for enough space to be available in the message buffer.
-    xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms );
-
-    if( xBytesSent != sizeof( ucArrayToSend ) )
-    {
-        // The call to xMessageBufferSend() times out before there was enough
-        // space in the buffer for the data to be written.
-    }
-
-    // Send the string to the message buffer.  Return immediately if there is
-    // not enough space in the buffer.
-    xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 );
-
-    if( xBytesSent != strlen( pcStringToSend ) )
-    {
-        // The string could not be added to the message buffer because there was
-        // not enough free space in the buffer.
-    }
-}
-
- * \defgroup xMessageBufferSend xMessageBufferSend - * \ingroup MessageBufferManagement - */ -#define xMessageBufferSend( xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) xStreamBufferSend( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) - -/** - * message_buffer.h - * -
-size_t xMessageBufferSendFromISR( MessageBufferHandle_t xMessageBuffer,
-                                  const void *pvTxData,
-                                  size_t xDataLengthBytes,
-                                  BaseType_t *pxHigherPriorityTaskWoken );
-
- *
- * Interrupt safe version of the API function that sends a discrete message to
- * the message buffer.  The message can be any length that fits within the
- * buffer's free space, and is copied into the buffer.
- *
- * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer
- * implementation (so also the message buffer implementation, as message buffers
- * are built on top of stream buffers) assumes there is only one task or
- * interrupt that will write to the buffer (the writer), and only one task or
- * interrupt that will read from the buffer (the reader).  It is safe for the
- * writer and reader to be different tasks or interrupts, but, unlike other
- * FreeRTOS objects, it is not safe to have multiple different writers or
- * multiple different readers.  If there are to be multiple different writers
- * then the application writer must place each call to a writing API function
- * (such as xMessageBufferSend()) inside a critical section and set the send
- * block time to 0.  Likewise, if there are to be multiple different readers
- * then the application writer must place each call to a reading API function
- * (such as xMessageBufferRead()) inside a critical section and set the receive
- * block time to 0.
- *
- * Use xMessageBufferSend() to write to a message buffer from a task.  Use
- * xMessageBufferSendFromISR() to write to a message buffer from an interrupt
- * service routine (ISR).
- *
- * @param xMessageBuffer The handle of the message buffer to which a message is
- * being sent.
- *
- * @param pvTxData A pointer to the message that is to be copied into the
- * message buffer.
- *
- * @param xDataLengthBytes The length of the message.  That is, the number of
- * bytes to copy from pvTxData into the message buffer.  When a message is
- * written to the message buffer an additional sizeof( size_t ) bytes are also
- * written to store the message's length.  sizeof( size_t ) is typically 4 bytes
- * on a 32-bit architecture, so on most 32-bit architecture setting
- * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24
- * bytes (20 bytes of message data and 4 bytes to hold the message length).
- *
- * @param pxHigherPriorityTaskWoken  It is possible that a message buffer will
- * have a task blocked on it waiting for data.  Calling
- * xMessageBufferSendFromISR() can make data available, and so cause a task that
- * was waiting for data to leave the Blocked state.  If calling
- * xMessageBufferSendFromISR() causes a task to leave the Blocked state, and the
- * unblocked task has a priority higher than the currently executing task (the
- * task that was interrupted), then, internally, xMessageBufferSendFromISR()
- * will set *pxHigherPriorityTaskWoken to pdTRUE.  If
- * xMessageBufferSendFromISR() sets this value to pdTRUE, then normally a
- * context switch should be performed before the interrupt is exited.  This will
- * ensure that the interrupt returns directly to the highest priority Ready
- * state task.  *pxHigherPriorityTaskWoken should be set to pdFALSE before it
- * is passed into the function.  See the code example below for an example.
- *
- * @return The number of bytes actually written to the message buffer.  If the
- * message buffer didn't have enough free space for the message to be stored
- * then 0 is returned, otherwise xDataLengthBytes is returned.
- *
- * Example use:
-
-// A message buffer that has already been created.
-MessageBufferHandle_t xMessageBuffer;
-
-void vAnInterruptServiceRoutine( void )
-{
-size_t xBytesSent;
-char *pcStringToSend = "String to send";
-BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
-
-    // Attempt to send the string to the message buffer.
-    xBytesSent = xMessageBufferSendFromISR( xMessageBuffer,
-                                            ( void * ) pcStringToSend,
-                                            strlen( pcStringToSend ),
-                                            &xHigherPriorityTaskWoken );
-
-    if( xBytesSent != strlen( pcStringToSend ) )
-    {
-        // The string could not be added to the message buffer because there was
-        // not enough free space in the buffer.
-    }
-
-    // If xHigherPriorityTaskWoken was set to pdTRUE inside
-    // xMessageBufferSendFromISR() then a task that has a priority above the
-    // priority of the currently executing task was unblocked and a context
-    // switch should be performed to ensure the ISR returns to the unblocked
-    // task.  In most FreeRTOS ports this is done by simply passing
-    // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the
-    // variables value, and perform the context switch if necessary.  Check the
-    // documentation for the port in use for port specific instructions.
-    portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
-}
-
- * \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR - * \ingroup MessageBufferManagement - */ -#define xMessageBufferSendFromISR( xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) xStreamBufferSendFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) - -/** - * message_buffer.h - * -
-size_t xMessageBufferReceive( MessageBufferHandle_t xMessageBuffer,
-                              void *pvRxData,
-                              size_t xBufferLengthBytes,
-                              TickType_t xTicksToWait );
-
- * - * Receives a discrete message from a message buffer. Messages can be of - * variable length and are copied out of the buffer. - * - * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer - * implementation (so also the message buffer implementation, as message buffers - * are built on top of stream buffers) assumes there is only one task or - * interrupt that will write to the buffer (the writer), and only one task or - * interrupt that will read from the buffer (the reader). It is safe for the - * writer and reader to be different tasks or interrupts, but, unlike other - * FreeRTOS objects, it is not safe to have multiple different writers or - * multiple different readers. If there are to be multiple different writers - * then the application writer must place each call to a writing API function - * (such as xMessageBufferSend()) inside a critical section and set the send - * block time to 0. Likewise, if there are to be multiple different readers - * then the application writer must place each call to a reading API function - * (such as xMessageBufferRead()) inside a critical section and set the receive - * block time to 0. - * - * Use xMessageBufferReceive() to read from a message buffer from a task. Use - * xMessageBufferReceiveFromISR() to read from a message buffer from an - * interrupt service routine (ISR). - * - * @param xMessageBuffer The handle of the message buffer from which a message - * is being received. - * - * @param pvRxData A pointer to the buffer into which the received message is - * to be copied. - * - * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData - * parameter. This sets the maximum length of the message that can be received. - * If xBufferLengthBytes is too small to hold the next message then the message - * will be left in the message buffer and 0 will be returned. - * - * @param xTicksToWait The maximum amount of time the task should remain in the - * Blocked state to wait for a message, should the message buffer be empty. - * xMessageBufferReceive() will return immediately if xTicksToWait is zero and - * the message buffer is empty. The block time is specified in tick periods, so - * the absolute time it represents is dependent on the tick frequency. The - * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds - * into a time specified in ticks. Setting xTicksToWait to portMAX_DELAY will - * cause the task to wait indefinitely (without timing out), provided - * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. Tasks do not use any - * CPU time when they are in the Blocked state. - * - * @return The length, in bytes, of the message read from the message buffer, if - * any. If xMessageBufferReceive() times out before a message became available - * then zero is returned. If the length of the message is greater than - * xBufferLengthBytes then the message will be left in the message buffer and - * zero is returned. - * - * Example use: -
-void vAFunction( MessageBuffer_t xMessageBuffer )
-{
-uint8_t ucRxData[ 20 ];
-size_t xReceivedBytes;
-const TickType_t xBlockTime = pdMS_TO_TICKS( 20 );
-
-    // Receive the next message from the message buffer.  Wait in the Blocked
-    // state (so not using any CPU processing time) for a maximum of 100ms for
-    // a message to become available.
-    xReceivedBytes = xMessageBufferReceive( xMessageBuffer,
-                                            ( void * ) ucRxData,
-                                            sizeof( ucRxData ),
-                                            xBlockTime );
-
-    if( xReceivedBytes > 0 )
-    {
-        // A ucRxData contains a message that is xReceivedBytes long.  Process
-        // the message here....
-    }
-}
-
- * \defgroup xMessageBufferReceive xMessageBufferReceive - * \ingroup MessageBufferManagement - */ -#define xMessageBufferReceive( xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) xStreamBufferReceive( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) - - -/** - * message_buffer.h - * -
-size_t xMessageBufferReceiveFromISR( MessageBufferHandle_t xMessageBuffer,
-                                     void *pvRxData,
-                                     size_t xBufferLengthBytes,
-                                     BaseType_t *pxHigherPriorityTaskWoken );
-
- * - * An interrupt safe version of the API function that receives a discrete - * message from a message buffer. Messages can be of variable length and are - * copied out of the buffer. - * - * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer - * implementation (so also the message buffer implementation, as message buffers - * are built on top of stream buffers) assumes there is only one task or - * interrupt that will write to the buffer (the writer), and only one task or - * interrupt that will read from the buffer (the reader). It is safe for the - * writer and reader to be different tasks or interrupts, but, unlike other - * FreeRTOS objects, it is not safe to have multiple different writers or - * multiple different readers. If there are to be multiple different writers - * then the application writer must place each call to a writing API function - * (such as xMessageBufferSend()) inside a critical section and set the send - * block time to 0. Likewise, if there are to be multiple different readers - * then the application writer must place each call to a reading API function - * (such as xMessageBufferRead()) inside a critical section and set the receive - * block time to 0. - * - * Use xMessageBufferReceive() to read from a message buffer from a task. Use - * xMessageBufferReceiveFromISR() to read from a message buffer from an - * interrupt service routine (ISR). - * - * @param xMessageBuffer The handle of the message buffer from which a message - * is being received. - * - * @param pvRxData A pointer to the buffer into which the received message is - * to be copied. - * - * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData - * parameter. This sets the maximum length of the message that can be received. - * If xBufferLengthBytes is too small to hold the next message then the message - * will be left in the message buffer and 0 will be returned. - * - * @param pxHigherPriorityTaskWoken It is possible that a message buffer will - * have a task blocked on it waiting for space to become available. Calling - * xMessageBufferReceiveFromISR() can make space available, and so cause a task - * that is waiting for space to leave the Blocked state. If calling - * xMessageBufferReceiveFromISR() causes a task to leave the Blocked state, and - * the unblocked task has a priority higher than the currently executing task - * (the task that was interrupted), then, internally, - * xMessageBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE. - * If xMessageBufferReceiveFromISR() sets this value to pdTRUE, then normally a - * context switch should be performed before the interrupt is exited. That will - * ensure the interrupt returns directly to the highest priority Ready state - * task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it is - * passed into the function. See the code example below for an example. - * - * @return The length, in bytes, of the message read from the message buffer, if - * any. - * - * Example use: -
-// A message buffer that has already been created.
-MessageBuffer_t xMessageBuffer;
-
-void vAnInterruptServiceRoutine( void )
-{
-uint8_t ucRxData[ 20 ];
-size_t xReceivedBytes;
-BaseType_t xHigherPriorityTaskWoken = pdFALSE;  // Initialised to pdFALSE.
-
-    // Receive the next message from the message buffer.
-    xReceivedBytes = xMessageBufferReceiveFromISR( xMessageBuffer,
-                                                  ( void * ) ucRxData,
-                                                  sizeof( ucRxData ),
-                                                  &xHigherPriorityTaskWoken );
-
-    if( xReceivedBytes > 0 )
-    {
-        // A ucRxData contains a message that is xReceivedBytes long.  Process
-        // the message here....
-    }
-
-    // If xHigherPriorityTaskWoken was set to pdTRUE inside
-    // xMessageBufferReceiveFromISR() then a task that has a priority above the
-    // priority of the currently executing task was unblocked and a context
-    // switch should be performed to ensure the ISR returns to the unblocked
-    // task.  In most FreeRTOS ports this is done by simply passing
-    // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the
-    // variables value, and perform the context switch if necessary.  Check the
-    // documentation for the port in use for port specific instructions.
-    portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
-}
-
- * \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR - * \ingroup MessageBufferManagement - */ -#define xMessageBufferReceiveFromISR( xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) xStreamBufferReceiveFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) - -/** - * message_buffer.h - * -
-void vMessageBufferDelete( MessageBufferHandle_t xMessageBuffer );
-
- * - * Deletes a message buffer that was previously created using a call to - * xMessageBufferCreate() or xMessageBufferCreateStatic(). If the message - * buffer was created using dynamic memory (that is, by xMessageBufferCreate()), - * then the allocated memory is freed. - * - * A message buffer handle must not be used after the message buffer has been - * deleted. - * - * @param xMessageBuffer The handle of the message buffer to be deleted. - * - */ -#define vMessageBufferDelete( xMessageBuffer ) vStreamBufferDelete( ( StreamBufferHandle_t ) xMessageBuffer ) - -/** - * message_buffer.h -
-BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer ) );
-
- * - * Tests to see if a message buffer is full. A message buffer is full if it - * cannot accept any more messages, of any size, until space is made available - * by a message being removed from the message buffer. - * - * @param xMessageBuffer The handle of the message buffer being queried. - * - * @return If the message buffer referenced by xMessageBuffer is full then - * pdTRUE is returned. Otherwise pdFALSE is returned. - */ -#define xMessageBufferIsFull( xMessageBuffer ) xStreamBufferIsFull( ( StreamBufferHandle_t ) xMessageBuffer ) - -/** - * message_buffer.h -
-BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer ) );
-
- * - * Tests to see if a message buffer is empty (does not contain any messages). - * - * @param xMessageBuffer The handle of the message buffer being queried. - * - * @return If the message buffer referenced by xMessageBuffer is empty then - * pdTRUE is returned. Otherwise pdFALSE is returned. - * - */ -#define xMessageBufferIsEmpty( xMessageBuffer ) xStreamBufferIsEmpty( ( StreamBufferHandle_t ) xMessageBuffer ) - -/** - * message_buffer.h -
-BaseType_t xMessageBufferReset( MessageBufferHandle_t xMessageBuffer );
-
- * - * Resets a message buffer to its initial empty state, discarding any message it - * contained. - * - * A message buffer can only be reset if there are no tasks blocked on it. - * - * @param xMessageBuffer The handle of the message buffer being reset. - * - * @return If the message buffer was reset then pdPASS is returned. If the - * message buffer could not be reset because either there was a task blocked on - * the message queue to wait for space to become available, or to wait for a - * a message to be available, then pdFAIL is returned. - * - * \defgroup xMessageBufferReset xMessageBufferReset - * \ingroup MessageBufferManagement - */ -#define xMessageBufferReset( xMessageBuffer ) xStreamBufferReset( ( StreamBufferHandle_t ) xMessageBuffer ) - - -/** - * message_buffer.h -
-size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer ) );
-
- * Returns the number of bytes of free space in the message buffer. - * - * @param xMessageBuffer The handle of the message buffer being queried. - * - * @return The number of bytes that can be written to the message buffer before - * the message buffer would be full. When a message is written to the message - * buffer an additional sizeof( size_t ) bytes are also written to store the - * message's length. sizeof( size_t ) is typically 4 bytes on a 32-bit - * architecture, so if xMessageBufferSpacesAvailable() returns 10, then the size - * of the largest message that can be written to the message buffer is 6 bytes. - * - * \defgroup xMessageBufferSpaceAvailable xMessageBufferSpaceAvailable - * \ingroup MessageBufferManagement - */ -#define xMessageBufferSpaceAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) -#define xMessageBufferSpacesAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) /* Corrects typo in original macro name. */ - -/** - * message_buffer.h -
- size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer ) );
- 
- * Returns the length (in bytes) of the next message in a message buffer. - * Useful if xMessageBufferReceive() returned 0 because the size of the buffer - * passed into xMessageBufferReceive() was too small to hold the next message. - * - * @param xMessageBuffer The handle of the message buffer being queried. - * - * @return The length (in bytes) of the next message in the message buffer, or 0 - * if the message buffer is empty. - * - * \defgroup xMessageBufferNextLengthBytes xMessageBufferNextLengthBytes - * \ingroup MessageBufferManagement - */ -#define xMessageBufferNextLengthBytes( xMessageBuffer ) xStreamBufferNextMessageLengthBytes( ( StreamBufferHandle_t ) xMessageBuffer ) PRIVILEGED_FUNCTION; - -/** - * message_buffer.h - * -
-BaseType_t xMessageBufferSendCompletedFromISR( MessageBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
-
- * - * For advanced users only. - * - * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when - * data is sent to a message buffer or stream buffer. If there was a task that - * was blocked on the message or stream buffer waiting for data to arrive then - * the sbSEND_COMPLETED() macro sends a notification to the task to remove it - * from the Blocked state. xMessageBufferSendCompletedFromISR() does the same - * thing. It is provided to enable application writers to implement their own - * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME. - * - * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for - * additional information. - * - * @param xStreamBuffer The handle of the stream buffer to which data was - * written. - * - * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be - * initialised to pdFALSE before it is passed into - * xMessageBufferSendCompletedFromISR(). If calling - * xMessageBufferSendCompletedFromISR() removes a task from the Blocked state, - * and the task has a priority above the priority of the currently running task, - * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a - * context switch should be performed before exiting the ISR. - * - * @return If a task was removed from the Blocked state then pdTRUE is returned. - * Otherwise pdFALSE is returned. - * - * \defgroup xMessageBufferSendCompletedFromISR xMessageBufferSendCompletedFromISR - * \ingroup StreamBufferManagement - */ -#define xMessageBufferSendCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) xStreamBufferSendCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken ) - -/** - * message_buffer.h - * -
-BaseType_t xMessageBufferReceiveCompletedFromISR( MessageBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
-
- * - * For advanced users only. - * - * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when - * data is read out of a message buffer or stream buffer. If there was a task - * that was blocked on the message or stream buffer waiting for data to arrive - * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to - * remove it from the Blocked state. xMessageBufferReceiveCompletedFromISR() - * does the same thing. It is provided to enable application writers to - * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT - * ANY OTHER TIME. - * - * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for - * additional information. - * - * @param xStreamBuffer The handle of the stream buffer from which data was - * read. - * - * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be - * initialised to pdFALSE before it is passed into - * xMessageBufferReceiveCompletedFromISR(). If calling - * xMessageBufferReceiveCompletedFromISR() removes a task from the Blocked state, - * and the task has a priority above the priority of the currently running task, - * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a - * context switch should be performed before exiting the ISR. - * - * @return If a task was removed from the Blocked state then pdTRUE is returned. - * Otherwise pdFALSE is returned. - * - * \defgroup xMessageBufferReceiveCompletedFromISR xMessageBufferReceiveCompletedFromISR - * \ingroup StreamBufferManagement - */ -#define xMessageBufferReceiveCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) xStreamBufferReceiveCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken ) - -#if defined( __cplusplus ) -} /* extern "C" */ -#endif - -#endif /* !defined( FREERTOS_MESSAGE_BUFFER_H ) */ diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h deleted file mode 100644 index a21b7a6..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/* - * When the MPU is used the standard (non MPU) API functions are mapped to - * equivalents that start "MPU_", the prototypes for which are defined in this - * header files. This will cause the application code to call the MPU_ version - * which wraps the non-MPU version with privilege promoting then demoting code, - * so the kernel code always runs will full privileges. - */ - - -#ifndef MPU_PROTOTYPES_H -#define MPU_PROTOTYPES_H - -/* MPU versions of tasks.h API functions. */ -BaseType_t MPU_xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask ) FREERTOS_SYSTEM_CALL; -TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode, const char * const pcName, const uint32_t ulStackDepth, void * const pvParameters, UBaseType_t uxPriority, StackType_t * const puxStackBuffer, StaticTask_t * const pxTaskBuffer ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskDelete( TaskHandle_t xTaskToDelete ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskDelay( const TickType_t xTicksToDelay ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; -UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; -eTaskState MPU_eTaskGetState( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskResume( TaskHandle_t xTaskToResume ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskStartScheduler( void ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskSuspendAll( void ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTaskResumeAll( void ) FREERTOS_SYSTEM_CALL; -TickType_t MPU_xTaskGetTickCount( void ) FREERTOS_SYSTEM_CALL; -UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) FREERTOS_SYSTEM_CALL; -char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) FREERTOS_SYSTEM_CALL; -TaskHandle_t MPU_xTaskGetHandle( const char *pcNameToQuery ) FREERTOS_SYSTEM_CALL; -UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; -configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) FREERTOS_SYSTEM_CALL; -TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) FREERTOS_SYSTEM_CALL; -void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) FREERTOS_SYSTEM_CALL; -TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) FREERTOS_SYSTEM_CALL; -UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) FREERTOS_SYSTEM_CALL; -uint32_t MPU_ulTaskGetIdleRunTimeCounter( void ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskList( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskGetRunTimeStats( char *pcWriteBuffer ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; -uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; -uint32_t MPU_ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTaskIncrementTick( void ) FREERTOS_SYSTEM_CALL; -TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) FREERTOS_SYSTEM_CALL; -void MPU_vTaskMissedYield( void ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTaskGetSchedulerState( void ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) FREERTOS_SYSTEM_CALL; - -/* MPU versions of queue.h API functions. */ -BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; -UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; -UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; -void MPU_vQueueDelete( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; -QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL; -QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) FREERTOS_SYSTEM_CALL; -QueueHandle_t MPU_xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) FREERTOS_SYSTEM_CALL; -QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) FREERTOS_SYSTEM_CALL; -TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) FREERTOS_SYSTEM_CALL; -void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ) FREERTOS_SYSTEM_CALL; -void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; -const char * MPU_pcQueueGetName( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; -QueueHandle_t MPU_xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL; -QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL; -QueueSetHandle_t MPU_xQueueCreateSet( const UBaseType_t uxEventQueueLength ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL; -QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) FREERTOS_SYSTEM_CALL; -void MPU_vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) FREERTOS_SYSTEM_CALL; -UBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; -uint8_t MPU_ucQueueGetQueueType( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; - -/* MPU versions of timers.h API functions. */ -TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ) FREERTOS_SYSTEM_CALL; -TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction, StaticTimer_t *pxTimerBuffer ) FREERTOS_SYSTEM_CALL; -void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; -void MPU_vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; -TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; -const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; -void MPU_vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) FREERTOS_SYSTEM_CALL; -UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; -TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; -TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTimerCreateTimerTask( void ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; - -/* MPU versions of event_group.h API functions. */ -EventGroupHandle_t MPU_xEventGroupCreate( void ) FREERTOS_SYSTEM_CALL; -EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) FREERTOS_SYSTEM_CALL; -EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; -EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) FREERTOS_SYSTEM_CALL; -EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) FREERTOS_SYSTEM_CALL; -EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; -void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) FREERTOS_SYSTEM_CALL; -UBaseType_t MPU_uxEventGroupGetNumber( void* xEventGroup ) FREERTOS_SYSTEM_CALL; - -/* MPU versions of message/stream_buffer.h API functions. */ -size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; -size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; -size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; -void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; -size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; -size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; -BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) FREERTOS_SYSTEM_CALL; -StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer ) FREERTOS_SYSTEM_CALL; -StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer, uint8_t * const pucStreamBufferStorageArea, StaticStreamBuffer_t * const pxStaticStreamBuffer ) FREERTOS_SYSTEM_CALL; - - - -#endif /* MPU_PROTOTYPES_H */ - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h deleted file mode 100644 index 5f63d4f..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef MPU_WRAPPERS_H -#define MPU_WRAPPERS_H - -/* This file redefines API functions to be called through a wrapper macro, but -only for ports that are using the MPU. */ -#ifdef portUSING_MPU_WRAPPERS - - /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is - included from queue.c or task.c to prevent it from having an effect within - those files. */ - #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE - - /* - * Map standard (non MPU) API functions to equivalents that start - * "MPU_". This will cause the application code to call the MPU_ - * version, which wraps the non-MPU version with privilege promoting - * then demoting code, so the kernel code always runs will full - * privileges. - */ - - /* Map standard tasks.h API functions to the MPU equivalents. */ - #define xTaskCreate MPU_xTaskCreate - #define xTaskCreateStatic MPU_xTaskCreateStatic - #define xTaskCreateRestricted MPU_xTaskCreateRestricted - #define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions - #define vTaskDelete MPU_vTaskDelete - #define vTaskDelay MPU_vTaskDelay - #define vTaskDelayUntil MPU_vTaskDelayUntil - #define xTaskAbortDelay MPU_xTaskAbortDelay - #define uxTaskPriorityGet MPU_uxTaskPriorityGet - #define eTaskGetState MPU_eTaskGetState - #define vTaskGetInfo MPU_vTaskGetInfo - #define vTaskPrioritySet MPU_vTaskPrioritySet - #define vTaskSuspend MPU_vTaskSuspend - #define vTaskResume MPU_vTaskResume - #define vTaskSuspendAll MPU_vTaskSuspendAll - #define xTaskResumeAll MPU_xTaskResumeAll - #define xTaskGetTickCount MPU_xTaskGetTickCount - #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks - #define pcTaskGetName MPU_pcTaskGetName - #define xTaskGetHandle MPU_xTaskGetHandle - #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark - #define uxTaskGetStackHighWaterMark2 MPU_uxTaskGetStackHighWaterMark2 - #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag - #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag - #define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer - #define pvTaskGetThreadLocalStoragePointer MPU_pvTaskGetThreadLocalStoragePointer - #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook - #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle - #define uxTaskGetSystemState MPU_uxTaskGetSystemState - #define vTaskList MPU_vTaskList - #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats - #define ulTaskGetIdleRunTimeCounter MPU_ulTaskGetIdleRunTimeCounter - #define xTaskGenericNotify MPU_xTaskGenericNotify - #define xTaskNotifyWait MPU_xTaskNotifyWait - #define ulTaskNotifyTake MPU_ulTaskNotifyTake - #define xTaskNotifyStateClear MPU_xTaskNotifyStateClear - #define ulTaskNotifyValueClear MPU_ulTaskNotifyValueClear - #define xTaskCatchUpTicks MPU_xTaskCatchUpTicks - - #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle - #define vTaskSetTimeOutState MPU_vTaskSetTimeOutState - #define xTaskCheckForTimeOut MPU_xTaskCheckForTimeOut - #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState - - /* Map standard queue.h API functions to the MPU equivalents. */ - #define xQueueGenericSend MPU_xQueueGenericSend - #define xQueueReceive MPU_xQueueReceive - #define xQueuePeek MPU_xQueuePeek - #define xQueueSemaphoreTake MPU_xQueueSemaphoreTake - #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting - #define uxQueueSpacesAvailable MPU_uxQueueSpacesAvailable - #define vQueueDelete MPU_vQueueDelete - #define xQueueCreateMutex MPU_xQueueCreateMutex - #define xQueueCreateMutexStatic MPU_xQueueCreateMutexStatic - #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore - #define xQueueCreateCountingSemaphoreStatic MPU_xQueueCreateCountingSemaphoreStatic - #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder - #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive - #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive - #define xQueueGenericCreate MPU_xQueueGenericCreate - #define xQueueGenericCreateStatic MPU_xQueueGenericCreateStatic - #define xQueueCreateSet MPU_xQueueCreateSet - #define xQueueAddToSet MPU_xQueueAddToSet - #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet - #define xQueueSelectFromSet MPU_xQueueSelectFromSet - #define xQueueGenericReset MPU_xQueueGenericReset - - #if( configQUEUE_REGISTRY_SIZE > 0 ) - #define vQueueAddToRegistry MPU_vQueueAddToRegistry - #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue - #define pcQueueGetName MPU_pcQueueGetName - #endif - - /* Map standard timer.h API functions to the MPU equivalents. */ - #define xTimerCreate MPU_xTimerCreate - #define xTimerCreateStatic MPU_xTimerCreateStatic - #define pvTimerGetTimerID MPU_pvTimerGetTimerID - #define vTimerSetTimerID MPU_vTimerSetTimerID - #define xTimerIsTimerActive MPU_xTimerIsTimerActive - #define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle - #define xTimerPendFunctionCall MPU_xTimerPendFunctionCall - #define pcTimerGetName MPU_pcTimerGetName - #define vTimerSetReloadMode MPU_vTimerSetReloadMode - #define uxTimerGetReloadMode MPU_uxTimerGetReloadMode - #define xTimerGetPeriod MPU_xTimerGetPeriod - #define xTimerGetExpiryTime MPU_xTimerGetExpiryTime - #define xTimerGenericCommand MPU_xTimerGenericCommand - - /* Map standard event_group.h API functions to the MPU equivalents. */ - #define xEventGroupCreate MPU_xEventGroupCreate - #define xEventGroupCreateStatic MPU_xEventGroupCreateStatic - #define xEventGroupWaitBits MPU_xEventGroupWaitBits - #define xEventGroupClearBits MPU_xEventGroupClearBits - #define xEventGroupSetBits MPU_xEventGroupSetBits - #define xEventGroupSync MPU_xEventGroupSync - #define vEventGroupDelete MPU_vEventGroupDelete - - /* Map standard message/stream_buffer.h API functions to the MPU - equivalents. */ - #define xStreamBufferSend MPU_xStreamBufferSend - #define xStreamBufferReceive MPU_xStreamBufferReceive - #define xStreamBufferNextMessageLengthBytes MPU_xStreamBufferNextMessageLengthBytes - #define vStreamBufferDelete MPU_vStreamBufferDelete - #define xStreamBufferIsFull MPU_xStreamBufferIsFull - #define xStreamBufferIsEmpty MPU_xStreamBufferIsEmpty - #define xStreamBufferReset MPU_xStreamBufferReset - #define xStreamBufferSpacesAvailable MPU_xStreamBufferSpacesAvailable - #define xStreamBufferBytesAvailable MPU_xStreamBufferBytesAvailable - #define xStreamBufferSetTriggerLevel MPU_xStreamBufferSetTriggerLevel - #define xStreamBufferGenericCreate MPU_xStreamBufferGenericCreate - #define xStreamBufferGenericCreateStatic MPU_xStreamBufferGenericCreateStatic - - - /* Remove the privileged function macro, but keep the PRIVILEGED_DATA - macro so applications can place data in privileged access sections - (useful when using statically allocated objects). */ - #define PRIVILEGED_FUNCTION - #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) - #define FREERTOS_SYSTEM_CALL - - #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ - - /* Ensure API functions go in the privileged execution section. */ - #define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions"))) - #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) - #define FREERTOS_SYSTEM_CALL __attribute__((section( "freertos_system_calls"))) - - #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ - -#else /* portUSING_MPU_WRAPPERS */ - - #define PRIVILEGED_FUNCTION - #define PRIVILEGED_DATA - #define FREERTOS_SYSTEM_CALL - #define portUSING_MPU_WRAPPERS 0 - -#endif /* portUSING_MPU_WRAPPERS */ - - -#endif /* MPU_WRAPPERS_H */ - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h deleted file mode 100644 index a2099c3..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/*----------------------------------------------------------- - * Portable layer API. Each function must be defined for each port. - *----------------------------------------------------------*/ - -#ifndef PORTABLE_H -#define PORTABLE_H - -/* Each FreeRTOS port has a unique portmacro.h header file. Originally a -pre-processor definition was used to ensure the pre-processor found the correct -portmacro.h file for the port being used. That scheme was deprecated in favour -of setting the compiler's include path such that it found the correct -portmacro.h file - removing the need for the constant and allowing the -portmacro.h file to be located anywhere in relation to the port being used. -Purely for reasons of backward compatibility the old method is still valid, but -to make it clear that new projects should not use it, support for the port -specific constants has been moved into the deprecated_definitions.h header -file. */ -#include "deprecated_definitions.h" - -/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h -did not result in a portmacro.h header file being included - and it should be -included here. In this case the path to the correct portmacro.h header file -must be set in the compiler's include path. */ -#ifndef portENTER_CRITICAL - #include "portmacro.h" -#endif - -#if portBYTE_ALIGNMENT == 32 - #define portBYTE_ALIGNMENT_MASK ( 0x001f ) -#endif - -#if portBYTE_ALIGNMENT == 16 - #define portBYTE_ALIGNMENT_MASK ( 0x000f ) -#endif - -#if portBYTE_ALIGNMENT == 8 - #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) -#endif - -#if portBYTE_ALIGNMENT == 4 - #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) -#endif - -#if portBYTE_ALIGNMENT == 2 - #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) -#endif - -#if portBYTE_ALIGNMENT == 1 - #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) -#endif - -#ifndef portBYTE_ALIGNMENT_MASK - #error "Invalid portBYTE_ALIGNMENT definition" -#endif - -#ifndef portNUM_CONFIGURABLE_REGIONS - #define portNUM_CONFIGURABLE_REGIONS 1 -#endif - -#ifndef portHAS_STACK_OVERFLOW_CHECKING - #define portHAS_STACK_OVERFLOW_CHECKING 0 -#endif - -#ifndef portARCH_NAME - #define portARCH_NAME NULL -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#include "mpu_wrappers.h" - -/* - * Setup the stack of a new task so it is ready to be placed under the - * scheduler control. The registers have to be placed on the stack in - * the order that the port expects to find them. - * - */ -#if( portUSING_MPU_WRAPPERS == 1 ) - #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; - #else - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; - #endif -#else - #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; - #else - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; - #endif -#endif - -/* Used by heap_5.c to define the start address and size of each memory region -that together comprise the total FreeRTOS heap space. */ -typedef struct HeapRegion -{ - uint8_t *pucStartAddress; - size_t xSizeInBytes; -} HeapRegion_t; - -/* Used to pass information about the heap out of vPortGetHeapStats(). */ -typedef struct xHeapStats -{ - size_t xAvailableHeapSpaceInBytes; /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */ - size_t xSizeOfLargestFreeBlockInBytes; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ - size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ - size_t xNumberOfFreeBlocks; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */ - size_t xMinimumEverFreeBytesRemaining; /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */ - size_t xNumberOfSuccessfulAllocations; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */ - size_t xNumberOfSuccessfulFrees; /* The number of calls to vPortFree() that has successfully freed a block of memory. */ -} HeapStats_t; - -/* - * Used to define multiple heap regions for use by heap_5.c. This function - * must be called before any calls to pvPortMalloc() - not creating a task, - * queue, semaphore, mutex, software timer, event group, etc. will result in - * pvPortMalloc being called. - * - * pxHeapRegions passes in an array of HeapRegion_t structures - each of which - * defines a region of memory that can be used as the heap. The array is - * terminated by a HeapRegions_t structure that has a size of 0. The region - * with the lowest start address must appear first in the array. - */ -void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION; - -/* - * Returns a HeapStats_t structure filled with information about the current - * heap state. - */ -void vPortGetHeapStats( HeapStats_t *pxHeapStats ); - -/* - * Map to the memory management routines required for the port. - */ -void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; -void vPortFree( void *pv ) PRIVILEGED_FUNCTION; -void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; -size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; -size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; - -/* - * Setup the hardware ready for the scheduler to take control. This generally - * sets up a tick interrupt and sets timers for the correct tick frequency. - */ -BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION; - -/* - * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so - * the hardware is left in its original condition after the scheduler stops - * executing. - */ -void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; - -/* - * The structures and methods of manipulating the MPU are contained within the - * port layer. - * - * Fills the xMPUSettings structure with the memory region information - * contained in xRegions. - */ -#if( portUSING_MPU_WRAPPERS == 1 ) - struct xMEMORY_REGION; - void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth ) PRIVILEGED_FUNCTION; -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* PORTABLE_H */ - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h deleted file mode 100644 index 0d95130..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef PROJDEFS_H -#define PROJDEFS_H - -/* - * Defines the prototype to which task functions must conform. Defined in this - * file to ensure the type is known before portable.h is included. - */ -typedef void (*TaskFunction_t)( void * ); - -/* Converts a time in milliseconds to a time in ticks. This macro can be -overridden by a macro of the same name defined in FreeRTOSConfig.h in case the -definition here is not suitable for your application. */ -#ifndef pdMS_TO_TICKS - #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) ) -#endif - -#define pdFALSE ( ( BaseType_t ) 0 ) -#define pdTRUE ( ( BaseType_t ) 1 ) - -#define pdPASS ( pdTRUE ) -#define pdFAIL ( pdFALSE ) -#define errQUEUE_EMPTY ( ( BaseType_t ) 0 ) -#define errQUEUE_FULL ( ( BaseType_t ) 0 ) - -/* FreeRTOS error definitions. */ -#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) -#define errQUEUE_BLOCKED ( -4 ) -#define errQUEUE_YIELD ( -5 ) - -/* Macros used for basic data corruption checks. */ -#ifndef configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES - #define configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 0 -#endif - -#if( configUSE_16_BIT_TICKS == 1 ) - #define pdINTEGRITY_CHECK_VALUE 0x5a5a -#else - #define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5aUL -#endif - -/* The following errno values are used by FreeRTOS+ components, not FreeRTOS -itself. */ -#define pdFREERTOS_ERRNO_NONE 0 /* No errors */ -#define pdFREERTOS_ERRNO_ENOENT 2 /* No such file or directory */ -#define pdFREERTOS_ERRNO_EINTR 4 /* Interrupted system call */ -#define pdFREERTOS_ERRNO_EIO 5 /* I/O error */ -#define pdFREERTOS_ERRNO_ENXIO 6 /* No such device or address */ -#define pdFREERTOS_ERRNO_EBADF 9 /* Bad file number */ -#define pdFREERTOS_ERRNO_EAGAIN 11 /* No more processes */ -#define pdFREERTOS_ERRNO_EWOULDBLOCK 11 /* Operation would block */ -#define pdFREERTOS_ERRNO_ENOMEM 12 /* Not enough memory */ -#define pdFREERTOS_ERRNO_EACCES 13 /* Permission denied */ -#define pdFREERTOS_ERRNO_EFAULT 14 /* Bad address */ -#define pdFREERTOS_ERRNO_EBUSY 16 /* Mount device busy */ -#define pdFREERTOS_ERRNO_EEXIST 17 /* File exists */ -#define pdFREERTOS_ERRNO_EXDEV 18 /* Cross-device link */ -#define pdFREERTOS_ERRNO_ENODEV 19 /* No such device */ -#define pdFREERTOS_ERRNO_ENOTDIR 20 /* Not a directory */ -#define pdFREERTOS_ERRNO_EISDIR 21 /* Is a directory */ -#define pdFREERTOS_ERRNO_EINVAL 22 /* Invalid argument */ -#define pdFREERTOS_ERRNO_ENOSPC 28 /* No space left on device */ -#define pdFREERTOS_ERRNO_ESPIPE 29 /* Illegal seek */ -#define pdFREERTOS_ERRNO_EROFS 30 /* Read only file system */ -#define pdFREERTOS_ERRNO_EUNATCH 42 /* Protocol driver not attached */ -#define pdFREERTOS_ERRNO_EBADE 50 /* Invalid exchange */ -#define pdFREERTOS_ERRNO_EFTYPE 79 /* Inappropriate file type or format */ -#define pdFREERTOS_ERRNO_ENMFILE 89 /* No more files */ -#define pdFREERTOS_ERRNO_ENOTEMPTY 90 /* Directory not empty */ -#define pdFREERTOS_ERRNO_ENAMETOOLONG 91 /* File or path name too long */ -#define pdFREERTOS_ERRNO_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ -#define pdFREERTOS_ERRNO_ENOBUFS 105 /* No buffer space available */ -#define pdFREERTOS_ERRNO_ENOPROTOOPT 109 /* Protocol not available */ -#define pdFREERTOS_ERRNO_EADDRINUSE 112 /* Address already in use */ -#define pdFREERTOS_ERRNO_ETIMEDOUT 116 /* Connection timed out */ -#define pdFREERTOS_ERRNO_EINPROGRESS 119 /* Connection already in progress */ -#define pdFREERTOS_ERRNO_EALREADY 120 /* Socket already connected */ -#define pdFREERTOS_ERRNO_EADDRNOTAVAIL 125 /* Address not available */ -#define pdFREERTOS_ERRNO_EISCONN 127 /* Socket is already connected */ -#define pdFREERTOS_ERRNO_ENOTCONN 128 /* Socket is not connected */ -#define pdFREERTOS_ERRNO_ENOMEDIUM 135 /* No medium inserted */ -#define pdFREERTOS_ERRNO_EILSEQ 138 /* An invalid UTF-16 sequence was encountered. */ -#define pdFREERTOS_ERRNO_ECANCELED 140 /* Operation canceled. */ - -/* The following endian values are used by FreeRTOS+ components, not FreeRTOS -itself. */ -#define pdFREERTOS_LITTLE_ENDIAN 0 -#define pdFREERTOS_BIG_ENDIAN 1 - -/* Re-defining endian values for generic naming. */ -#define pdLITTLE_ENDIAN pdFREERTOS_LITTLE_ENDIAN -#define pdBIG_ENDIAN pdFREERTOS_BIG_ENDIAN - - -#endif /* PROJDEFS_H */ - - - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h deleted file mode 100644 index 52ccca5..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h +++ /dev/null @@ -1,1655 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - - -#ifndef QUEUE_H -#define QUEUE_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h" must appear in source files before "include queue.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#include "task.h" - -/** - * Type by which queues are referenced. For example, a call to xQueueCreate() - * returns an QueueHandle_t variable that can then be used as a parameter to - * xQueueSend(), xQueueReceive(), etc. - */ -struct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */ -typedef struct QueueDefinition * QueueHandle_t; - -/** - * Type by which queue sets are referenced. For example, a call to - * xQueueCreateSet() returns an xQueueSet variable that can then be used as a - * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc. - */ -typedef struct QueueDefinition * QueueSetHandle_t; - -/** - * Queue sets can contain both queues and semaphores, so the - * QueueSetMemberHandle_t is defined as a type to be used where a parameter or - * return value can be either an QueueHandle_t or an SemaphoreHandle_t. - */ -typedef struct QueueDefinition * QueueSetMemberHandle_t; - -/* For internal use only. */ -#define queueSEND_TO_BACK ( ( BaseType_t ) 0 ) -#define queueSEND_TO_FRONT ( ( BaseType_t ) 1 ) -#define queueOVERWRITE ( ( BaseType_t ) 2 ) - -/* For internal use only. These definitions *must* match those in queue.c. */ -#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U ) -#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U ) -#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U ) -#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U ) -#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) -#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U ) - -/** - * queue. h - *
- QueueHandle_t xQueueCreate(
-							  UBaseType_t uxQueueLength,
-							  UBaseType_t uxItemSize
-						  );
- * 
- * - * Creates a new queue instance, and returns a handle by which the new queue - * can be referenced. - * - * Internally, within the FreeRTOS implementation, queues use two blocks of - * memory. The first block is used to hold the queue's data structures. The - * second block is used to hold items placed into the queue. If a queue is - * created using xQueueCreate() then both blocks of memory are automatically - * dynamically allocated inside the xQueueCreate() function. (see - * http://www.freertos.org/a00111.html). If a queue is created using - * xQueueCreateStatic() then the application writer must provide the memory that - * will get used by the queue. xQueueCreateStatic() therefore allows a queue to - * be created without using any dynamic memory allocation. - * - * http://www.FreeRTOS.org/Embedded-RTOS-Queues.html - * - * @param uxQueueLength The maximum number of items that the queue can contain. - * - * @param uxItemSize The number of bytes each item in the queue will require. - * Items are queued by copy, not by reference, so this is the number of bytes - * that will be copied for each posted item. Each item on the queue must be - * the same size. - * - * @return If the queue is successfully create then a handle to the newly - * created queue is returned. If the queue cannot be created then 0 is - * returned. - * - * Example usage: -
- struct AMessage
- {
-	char ucMessageID;
-	char ucData[ 20 ];
- };
-
- void vATask( void *pvParameters )
- {
- QueueHandle_t xQueue1, xQueue2;
-
-	// Create a queue capable of containing 10 uint32_t values.
-	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
-	if( xQueue1 == 0 )
-	{
-		// Queue was not created and must not be used.
-	}
-
-	// Create a queue capable of containing 10 pointers to AMessage structures.
-	// These should be passed by pointer as they contain a lot of data.
-	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
-	if( xQueue2 == 0 )
-	{
-		// Queue was not created and must not be used.
-	}
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueCreate xQueueCreate - * \ingroup QueueManagement - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) ) -#endif - -/** - * queue. h - *
- QueueHandle_t xQueueCreateStatic(
-							  UBaseType_t uxQueueLength,
-							  UBaseType_t uxItemSize,
-							  uint8_t *pucQueueStorageBuffer,
-							  StaticQueue_t *pxQueueBuffer
-						  );
- * 
- * - * Creates a new queue instance, and returns a handle by which the new queue - * can be referenced. - * - * Internally, within the FreeRTOS implementation, queues use two blocks of - * memory. The first block is used to hold the queue's data structures. The - * second block is used to hold items placed into the queue. If a queue is - * created using xQueueCreate() then both blocks of memory are automatically - * dynamically allocated inside the xQueueCreate() function. (see - * http://www.freertos.org/a00111.html). If a queue is created using - * xQueueCreateStatic() then the application writer must provide the memory that - * will get used by the queue. xQueueCreateStatic() therefore allows a queue to - * be created without using any dynamic memory allocation. - * - * http://www.FreeRTOS.org/Embedded-RTOS-Queues.html - * - * @param uxQueueLength The maximum number of items that the queue can contain. - * - * @param uxItemSize The number of bytes each item in the queue will require. - * Items are queued by copy, not by reference, so this is the number of bytes - * that will be copied for each posted item. Each item on the queue must be - * the same size. - * - * @param pucQueueStorageBuffer If uxItemSize is not zero then - * pucQueueStorageBuffer must point to a uint8_t array that is at least large - * enough to hold the maximum number of items that can be in the queue at any - * one time - which is ( uxQueueLength * uxItemsSize ) bytes. If uxItemSize is - * zero then pucQueueStorageBuffer can be NULL. - * - * @param pxQueueBuffer Must point to a variable of type StaticQueue_t, which - * will be used to hold the queue's data structure. - * - * @return If the queue is created then a handle to the created queue is - * returned. If pxQueueBuffer is NULL then NULL is returned. - * - * Example usage: -
- struct AMessage
- {
-	char ucMessageID;
-	char ucData[ 20 ];
- };
-
- #define QUEUE_LENGTH 10
- #define ITEM_SIZE sizeof( uint32_t )
-
- // xQueueBuffer will hold the queue structure.
- StaticQueue_t xQueueBuffer;
-
- // ucQueueStorage will hold the items posted to the queue.  Must be at least
- // [(queue length) * ( queue item size)] bytes long.
- uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ];
-
- void vATask( void *pvParameters )
- {
- QueueHandle_t xQueue1;
-
-	// Create a queue capable of containing 10 uint32_t values.
-	xQueue1 = xQueueCreate( QUEUE_LENGTH, // The number of items the queue can hold.
-							ITEM_SIZE	  // The size of each item in the queue
-							&( ucQueueStorage[ 0 ] ), // The buffer that will hold the items in the queue.
-							&xQueueBuffer ); // The buffer that will hold the queue structure.
-
-	// The queue is guaranteed to be created successfully as no dynamic memory
-	// allocation is used.  Therefore xQueue1 is now a handle to a valid queue.
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueCreateStatic xQueueCreateStatic - * \ingroup QueueManagement - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * queue. h - *
- BaseType_t xQueueSendToToFront(
-								   QueueHandle_t	xQueue,
-								   const void		*pvItemToQueue,
-								   TickType_t		xTicksToWait
-							   );
- * 
- * - * Post an item to the front of a queue. The item is queued by copy, not by - * reference. This function must not be called from an interrupt service - * routine. See xQueueSendFromISR () for an alternative which may be used - * in an ISR. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for space to become available on the queue, should it already - * be full. The call will return immediately if this is set to 0 and the - * queue is full. The time is defined in tick periods so the constant - * portTICK_PERIOD_MS should be used to convert to real time if this is required. - * - * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. - * - * Example usage: -
- struct AMessage
- {
-	char ucMessageID;
-	char ucData[ 20 ];
- } xMessage;
-
- uint32_t ulVar = 10UL;
-
- void vATask( void *pvParameters )
- {
- QueueHandle_t xQueue1, xQueue2;
- struct AMessage *pxMessage;
-
-	// Create a queue capable of containing 10 uint32_t values.
-	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
-
-	// Create a queue capable of containing 10 pointers to AMessage structures.
-	// These should be passed by pointer as they contain a lot of data.
-	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
-
-	// ...
-
-	if( xQueue1 != 0 )
-	{
-		// Send an uint32_t.  Wait for 10 ticks for space to become
-		// available if necessary.
-		if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
-		{
-			// Failed to post the message, even after 10 ticks.
-		}
-	}
-
-	if( xQueue2 != 0 )
-	{
-		// Send a pointer to a struct AMessage object.  Don't block if the
-		// queue is already full.
-		pxMessage = & xMessage;
-		xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
-	}
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueSend xQueueSend - * \ingroup QueueManagement - */ -#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) - -/** - * queue. h - *
- BaseType_t xQueueSendToBack(
-								   QueueHandle_t	xQueue,
-								   const void		*pvItemToQueue,
-								   TickType_t		xTicksToWait
-							   );
- * 
- * - * This is a macro that calls xQueueGenericSend(). - * - * Post an item to the back of a queue. The item is queued by copy, not by - * reference. This function must not be called from an interrupt service - * routine. See xQueueSendFromISR () for an alternative which may be used - * in an ISR. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for space to become available on the queue, should it already - * be full. The call will return immediately if this is set to 0 and the queue - * is full. The time is defined in tick periods so the constant - * portTICK_PERIOD_MS should be used to convert to real time if this is required. - * - * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. - * - * Example usage: -
- struct AMessage
- {
-	char ucMessageID;
-	char ucData[ 20 ];
- } xMessage;
-
- uint32_t ulVar = 10UL;
-
- void vATask( void *pvParameters )
- {
- QueueHandle_t xQueue1, xQueue2;
- struct AMessage *pxMessage;
-
-	// Create a queue capable of containing 10 uint32_t values.
-	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
-
-	// Create a queue capable of containing 10 pointers to AMessage structures.
-	// These should be passed by pointer as they contain a lot of data.
-	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
-
-	// ...
-
-	if( xQueue1 != 0 )
-	{
-		// Send an uint32_t.  Wait for 10 ticks for space to become
-		// available if necessary.
-		if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
-		{
-			// Failed to post the message, even after 10 ticks.
-		}
-	}
-
-	if( xQueue2 != 0 )
-	{
-		// Send a pointer to a struct AMessage object.  Don't block if the
-		// queue is already full.
-		pxMessage = & xMessage;
-		xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
-	}
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueSend xQueueSend - * \ingroup QueueManagement - */ -#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) - -/** - * queue. h - *
- BaseType_t xQueueSend(
-							  QueueHandle_t xQueue,
-							  const void * pvItemToQueue,
-							  TickType_t xTicksToWait
-						 );
- * 
- * - * This is a macro that calls xQueueGenericSend(). It is included for - * backward compatibility with versions of FreeRTOS.org that did not - * include the xQueueSendToFront() and xQueueSendToBack() macros. It is - * equivalent to xQueueSendToBack(). - * - * Post an item on a queue. The item is queued by copy, not by reference. - * This function must not be called from an interrupt service routine. - * See xQueueSendFromISR () for an alternative which may be used in an ISR. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for space to become available on the queue, should it already - * be full. The call will return immediately if this is set to 0 and the - * queue is full. The time is defined in tick periods so the constant - * portTICK_PERIOD_MS should be used to convert to real time if this is required. - * - * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. - * - * Example usage: -
- struct AMessage
- {
-	char ucMessageID;
-	char ucData[ 20 ];
- } xMessage;
-
- uint32_t ulVar = 10UL;
-
- void vATask( void *pvParameters )
- {
- QueueHandle_t xQueue1, xQueue2;
- struct AMessage *pxMessage;
-
-	// Create a queue capable of containing 10 uint32_t values.
-	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
-
-	// Create a queue capable of containing 10 pointers to AMessage structures.
-	// These should be passed by pointer as they contain a lot of data.
-	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
-
-	// ...
-
-	if( xQueue1 != 0 )
-	{
-		// Send an uint32_t.  Wait for 10 ticks for space to become
-		// available if necessary.
-		if( xQueueSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
-		{
-			// Failed to post the message, even after 10 ticks.
-		}
-	}
-
-	if( xQueue2 != 0 )
-	{
-		// Send a pointer to a struct AMessage object.  Don't block if the
-		// queue is already full.
-		pxMessage = & xMessage;
-		xQueueSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
-	}
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueSend xQueueSend - * \ingroup QueueManagement - */ -#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) - -/** - * queue. h - *
- BaseType_t xQueueOverwrite(
-							  QueueHandle_t xQueue,
-							  const void * pvItemToQueue
-						 );
- * 
- * - * Only for use with queues that have a length of one - so the queue is either - * empty or full. - * - * Post an item on a queue. If the queue is already full then overwrite the - * value held in the queue. The item is queued by copy, not by reference. - * - * This function must not be called from an interrupt service routine. - * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR. - * - * @param xQueue The handle of the queue to which the data is being sent. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and - * therefore has the same return values as xQueueSendToFront(). However, pdPASS - * is the only value that can be returned because xQueueOverwrite() will write - * to the queue even when the queue is already full. - * - * Example usage: -
-
- void vFunction( void *pvParameters )
- {
- QueueHandle_t xQueue;
- uint32_t ulVarToSend, ulValReceived;
-
-	// Create a queue to hold one uint32_t value.  It is strongly
-	// recommended *not* to use xQueueOverwrite() on queues that can
-	// contain more than one value, and doing so will trigger an assertion
-	// if configASSERT() is defined.
-	xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
-
-	// Write the value 10 to the queue using xQueueOverwrite().
-	ulVarToSend = 10;
-	xQueueOverwrite( xQueue, &ulVarToSend );
-
-	// Peeking the queue should now return 10, but leave the value 10 in
-	// the queue.  A block time of zero is used as it is known that the
-	// queue holds a value.
-	ulValReceived = 0;
-	xQueuePeek( xQueue, &ulValReceived, 0 );
-
-	if( ulValReceived != 10 )
-	{
-		// Error unless the item was removed by a different task.
-	}
-
-	// The queue is still full.  Use xQueueOverwrite() to overwrite the
-	// value held in the queue with 100.
-	ulVarToSend = 100;
-	xQueueOverwrite( xQueue, &ulVarToSend );
-
-	// This time read from the queue, leaving the queue empty once more.
-	// A block time of 0 is used again.
-	xQueueReceive( xQueue, &ulValReceived, 0 );
-
-	// The value read should be the last value written, even though the
-	// queue was already full when the value was written.
-	if( ulValReceived != 100 )
-	{
-		// Error!
-	}
-
-	// ...
-}
- 
- * \defgroup xQueueOverwrite xQueueOverwrite - * \ingroup QueueManagement - */ -#define xQueueOverwrite( xQueue, pvItemToQueue ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE ) - - -/** - * queue. h - *
- BaseType_t xQueueGenericSend(
-									QueueHandle_t xQueue,
-									const void * pvItemToQueue,
-									TickType_t xTicksToWait
-									BaseType_t xCopyPosition
-								);
- * 
- * - * It is preferred that the macros xQueueSend(), xQueueSendToFront() and - * xQueueSendToBack() are used in place of calling this function directly. - * - * Post an item on a queue. The item is queued by copy, not by reference. - * This function must not be called from an interrupt service routine. - * See xQueueSendFromISR () for an alternative which may be used in an ISR. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for space to become available on the queue, should it already - * be full. The call will return immediately if this is set to 0 and the - * queue is full. The time is defined in tick periods so the constant - * portTICK_PERIOD_MS should be used to convert to real time if this is required. - * - * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the - * item at the back of the queue, or queueSEND_TO_FRONT to place the item - * at the front of the queue (for high priority messages). - * - * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. - * - * Example usage: -
- struct AMessage
- {
-	char ucMessageID;
-	char ucData[ 20 ];
- } xMessage;
-
- uint32_t ulVar = 10UL;
-
- void vATask( void *pvParameters )
- {
- QueueHandle_t xQueue1, xQueue2;
- struct AMessage *pxMessage;
-
-	// Create a queue capable of containing 10 uint32_t values.
-	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
-
-	// Create a queue capable of containing 10 pointers to AMessage structures.
-	// These should be passed by pointer as they contain a lot of data.
-	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
-
-	// ...
-
-	if( xQueue1 != 0 )
-	{
-		// Send an uint32_t.  Wait for 10 ticks for space to become
-		// available if necessary.
-		if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10, queueSEND_TO_BACK ) != pdPASS )
-		{
-			// Failed to post the message, even after 10 ticks.
-		}
-	}
-
-	if( xQueue2 != 0 )
-	{
-		// Send a pointer to a struct AMessage object.  Don't block if the
-		// queue is already full.
-		pxMessage = & xMessage;
-		xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0, queueSEND_TO_BACK );
-	}
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueSend xQueueSend - * \ingroup QueueManagement - */ -BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; - -/** - * queue. h - *
- BaseType_t xQueuePeek(
-							 QueueHandle_t xQueue,
-							 void * const pvBuffer,
-							 TickType_t xTicksToWait
-						 );
- * - * Receive an item from a queue without removing the item from the queue. - * The item is received by copy so a buffer of adequate size must be - * provided. The number of bytes copied into the buffer was defined when - * the queue was created. - * - * Successfully received items remain on the queue so will be returned again - * by the next call, or a call to xQueueReceive(). - * - * This macro must not be used in an interrupt service routine. See - * xQueuePeekFromISR() for an alternative that can be called from an interrupt - * service routine. - * - * @param xQueue The handle to the queue from which the item is to be - * received. - * - * @param pvBuffer Pointer to the buffer into which the received item will - * be copied. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for an item to receive should the queue be empty at the time - * of the call. The time is defined in tick periods so the constant - * portTICK_PERIOD_MS should be used to convert to real time if this is required. - * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue - * is empty. - * - * @return pdTRUE if an item was successfully received from the queue, - * otherwise pdFALSE. - * - * Example usage: -
- struct AMessage
- {
-	char ucMessageID;
-	char ucData[ 20 ];
- } xMessage;
-
- QueueHandle_t xQueue;
-
- // Task to create a queue and post a value.
- void vATask( void *pvParameters )
- {
- struct AMessage *pxMessage;
-
-	// Create a queue capable of containing 10 pointers to AMessage structures.
-	// These should be passed by pointer as they contain a lot of data.
-	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
-	if( xQueue == 0 )
-	{
-		// Failed to create the queue.
-	}
-
-	// ...
-
-	// Send a pointer to a struct AMessage object.  Don't block if the
-	// queue is already full.
-	pxMessage = & xMessage;
-	xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
-
-	// ... Rest of task code.
- }
-
- // Task to peek the data from the queue.
- void vADifferentTask( void *pvParameters )
- {
- struct AMessage *pxRxedMessage;
-
-	if( xQueue != 0 )
-	{
-		// Peek a message on the created queue.  Block for 10 ticks if a
-		// message is not immediately available.
-		if( xQueuePeek( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
-		{
-			// pcRxedMessage now points to the struct AMessage variable posted
-			// by vATask, but the item still remains on the queue.
-		}
-	}
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueuePeek xQueuePeek - * \ingroup QueueManagement - */ -BaseType_t xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - -/** - * queue. h - *
- BaseType_t xQueuePeekFromISR(
-									QueueHandle_t xQueue,
-									void *pvBuffer,
-								);
- * - * A version of xQueuePeek() that can be called from an interrupt service - * routine (ISR). - * - * Receive an item from a queue without removing the item from the queue. - * The item is received by copy so a buffer of adequate size must be - * provided. The number of bytes copied into the buffer was defined when - * the queue was created. - * - * Successfully received items remain on the queue so will be returned again - * by the next call, or a call to xQueueReceive(). - * - * @param xQueue The handle to the queue from which the item is to be - * received. - * - * @param pvBuffer Pointer to the buffer into which the received item will - * be copied. - * - * @return pdTRUE if an item was successfully received from the queue, - * otherwise pdFALSE. - * - * \defgroup xQueuePeekFromISR xQueuePeekFromISR - * \ingroup QueueManagement - */ -BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; - -/** - * queue. h - *
- BaseType_t xQueueReceive(
-								 QueueHandle_t xQueue,
-								 void *pvBuffer,
-								 TickType_t xTicksToWait
-							);
- * - * Receive an item from a queue. The item is received by copy so a buffer of - * adequate size must be provided. The number of bytes copied into the buffer - * was defined when the queue was created. - * - * Successfully received items are removed from the queue. - * - * This function must not be used in an interrupt service routine. See - * xQueueReceiveFromISR for an alternative that can. - * - * @param xQueue The handle to the queue from which the item is to be - * received. - * - * @param pvBuffer Pointer to the buffer into which the received item will - * be copied. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for an item to receive should the queue be empty at the time - * of the call. xQueueReceive() will return immediately if xTicksToWait - * is zero and the queue is empty. The time is defined in tick periods so the - * constant portTICK_PERIOD_MS should be used to convert to real time if this is - * required. - * - * @return pdTRUE if an item was successfully received from the queue, - * otherwise pdFALSE. - * - * Example usage: -
- struct AMessage
- {
-	char ucMessageID;
-	char ucData[ 20 ];
- } xMessage;
-
- QueueHandle_t xQueue;
-
- // Task to create a queue and post a value.
- void vATask( void *pvParameters )
- {
- struct AMessage *pxMessage;
-
-	// Create a queue capable of containing 10 pointers to AMessage structures.
-	// These should be passed by pointer as they contain a lot of data.
-	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
-	if( xQueue == 0 )
-	{
-		// Failed to create the queue.
-	}
-
-	// ...
-
-	// Send a pointer to a struct AMessage object.  Don't block if the
-	// queue is already full.
-	pxMessage = & xMessage;
-	xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
-
-	// ... Rest of task code.
- }
-
- // Task to receive from the queue.
- void vADifferentTask( void *pvParameters )
- {
- struct AMessage *pxRxedMessage;
-
-	if( xQueue != 0 )
-	{
-		// Receive a message on the created queue.  Block for 10 ticks if a
-		// message is not immediately available.
-		if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
-		{
-			// pcRxedMessage now points to the struct AMessage variable posted
-			// by vATask.
-		}
-	}
-
-	// ... Rest of task code.
- }
- 
- * \defgroup xQueueReceive xQueueReceive - * \ingroup QueueManagement - */ -BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - -/** - * queue. h - *
UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );
- * - * Return the number of messages stored in a queue. - * - * @param xQueue A handle to the queue being queried. - * - * @return The number of messages available in the queue. - * - * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting - * \ingroup QueueManagement - */ -UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; - -/** - * queue. h - *
UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );
- * - * Return the number of free spaces available in a queue. This is equal to the - * number of items that can be sent to the queue before the queue becomes full - * if no items are removed. - * - * @param xQueue A handle to the queue being queried. - * - * @return The number of spaces available in the queue. - * - * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting - * \ingroup QueueManagement - */ -UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; - -/** - * queue. h - *
void vQueueDelete( QueueHandle_t xQueue );
- * - * Delete a queue - freeing all the memory allocated for storing of items - * placed on the queue. - * - * @param xQueue A handle to the queue to be deleted. - * - * \defgroup vQueueDelete vQueueDelete - * \ingroup QueueManagement - */ -void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; - -/** - * queue. h - *
- BaseType_t xQueueSendToFrontFromISR(
-										 QueueHandle_t xQueue,
-										 const void *pvItemToQueue,
-										 BaseType_t *pxHigherPriorityTaskWoken
-									  );
- 
- * - * This is a macro that calls xQueueGenericSendFromISR(). - * - * Post an item to the front of a queue. It is safe to use this macro from - * within an interrupt service routine. - * - * Items are queued by copy not reference so it is preferable to only - * queue small items, especially when called from an ISR. In most cases - * it would be preferable to store a pointer to the item being queued. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xQueueSendToFromFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return pdTRUE if the data was successfully sent to the queue, otherwise - * errQUEUE_FULL. - * - * Example usage for buffered IO (where the ISR can obtain more than one value - * per call): -
- void vBufferISR( void )
- {
- char cIn;
- BaseType_t xHigherPrioritTaskWoken;
-
-	// We have not woken a task at the start of the ISR.
-	xHigherPriorityTaskWoken = pdFALSE;
-
-	// Loop until the buffer is empty.
-	do
-	{
-		// Obtain a byte from the buffer.
-		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
-
-		// Post the byte.
-		xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
-
-	} while( portINPUT_BYTE( BUFFER_COUNT ) );
-
-	// Now the buffer is empty we can switch context if necessary.
-	if( xHigherPriorityTaskWoken )
-	{
-		taskYIELD ();
-	}
- }
- 
- * - * \defgroup xQueueSendFromISR xQueueSendFromISR - * \ingroup QueueManagement - */ -#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) - - -/** - * queue. h - *
- BaseType_t xQueueSendToBackFromISR(
-										 QueueHandle_t xQueue,
-										 const void *pvItemToQueue,
-										 BaseType_t *pxHigherPriorityTaskWoken
-									  );
- 
- * - * This is a macro that calls xQueueGenericSendFromISR(). - * - * Post an item to the back of a queue. It is safe to use this macro from - * within an interrupt service routine. - * - * Items are queued by copy not reference so it is preferable to only - * queue small items, especially when called from an ISR. In most cases - * it would be preferable to store a pointer to the item being queued. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xQueueSendToBackFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return pdTRUE if the data was successfully sent to the queue, otherwise - * errQUEUE_FULL. - * - * Example usage for buffered IO (where the ISR can obtain more than one value - * per call): -
- void vBufferISR( void )
- {
- char cIn;
- BaseType_t xHigherPriorityTaskWoken;
-
-	// We have not woken a task at the start of the ISR.
-	xHigherPriorityTaskWoken = pdFALSE;
-
-	// Loop until the buffer is empty.
-	do
-	{
-		// Obtain a byte from the buffer.
-		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
-
-		// Post the byte.
-		xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
-
-	} while( portINPUT_BYTE( BUFFER_COUNT ) );
-
-	// Now the buffer is empty we can switch context if necessary.
-	if( xHigherPriorityTaskWoken )
-	{
-		taskYIELD ();
-	}
- }
- 
- * - * \defgroup xQueueSendFromISR xQueueSendFromISR - * \ingroup QueueManagement - */ -#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) - -/** - * queue. h - *
- BaseType_t xQueueOverwriteFromISR(
-							  QueueHandle_t xQueue,
-							  const void * pvItemToQueue,
-							  BaseType_t *pxHigherPriorityTaskWoken
-						 );
- * 
- * - * A version of xQueueOverwrite() that can be used in an interrupt service - * routine (ISR). - * - * Only for use with queues that can hold a single item - so the queue is either - * empty or full. - * - * Post an item on a queue. If the queue is already full then overwrite the - * value held in the queue. The item is queued by copy, not by reference. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param pxHigherPriorityTaskWoken xQueueOverwriteFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xQueueOverwriteFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return xQueueOverwriteFromISR() is a macro that calls - * xQueueGenericSendFromISR(), and therefore has the same return values as - * xQueueSendToFrontFromISR(). However, pdPASS is the only value that can be - * returned because xQueueOverwriteFromISR() will write to the queue even when - * the queue is already full. - * - * Example usage: -
-
- QueueHandle_t xQueue;
-
- void vFunction( void *pvParameters )
- {
- 	// Create a queue to hold one uint32_t value.  It is strongly
-	// recommended *not* to use xQueueOverwriteFromISR() on queues that can
-	// contain more than one value, and doing so will trigger an assertion
-	// if configASSERT() is defined.
-	xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
-}
-
-void vAnInterruptHandler( void )
-{
-// xHigherPriorityTaskWoken must be set to pdFALSE before it is used.
-BaseType_t xHigherPriorityTaskWoken = pdFALSE;
-uint32_t ulVarToSend, ulValReceived;
-
-	// Write the value 10 to the queue using xQueueOverwriteFromISR().
-	ulVarToSend = 10;
-	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
-
-	// The queue is full, but calling xQueueOverwriteFromISR() again will still
-	// pass because the value held in the queue will be overwritten with the
-	// new value.
-	ulVarToSend = 100;
-	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
-
-	// Reading from the queue will now return 100.
-
-	// ...
-
-	if( xHigherPrioritytaskWoken == pdTRUE )
-	{
-		// Writing to the queue caused a task to unblock and the unblocked task
-		// has a priority higher than or equal to the priority of the currently
-		// executing task (the task this interrupt interrupted).  Perform a context
-		// switch so this interrupt returns directly to the unblocked task.
-		portYIELD_FROM_ISR(); // or portEND_SWITCHING_ISR() depending on the port.
-	}
-}
- 
- * \defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR - * \ingroup QueueManagement - */ -#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE ) - -/** - * queue. h - *
- BaseType_t xQueueSendFromISR(
-									 QueueHandle_t xQueue,
-									 const void *pvItemToQueue,
-									 BaseType_t *pxHigherPriorityTaskWoken
-								);
- 
- * - * This is a macro that calls xQueueGenericSendFromISR(). It is included - * for backward compatibility with versions of FreeRTOS.org that did not - * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR() - * macros. - * - * Post an item to the back of a queue. It is safe to use this function from - * within an interrupt service routine. - * - * Items are queued by copy not reference so it is preferable to only - * queue small items, especially when called from an ISR. In most cases - * it would be preferable to store a pointer to the item being queued. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xQueueSendFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return pdTRUE if the data was successfully sent to the queue, otherwise - * errQUEUE_FULL. - * - * Example usage for buffered IO (where the ISR can obtain more than one value - * per call): -
- void vBufferISR( void )
- {
- char cIn;
- BaseType_t xHigherPriorityTaskWoken;
-
-	// We have not woken a task at the start of the ISR.
-	xHigherPriorityTaskWoken = pdFALSE;
-
-	// Loop until the buffer is empty.
-	do
-	{
-		// Obtain a byte from the buffer.
-		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
-
-		// Post the byte.
-		xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
-
-	} while( portINPUT_BYTE( BUFFER_COUNT ) );
-
-	// Now the buffer is empty we can switch context if necessary.
-	if( xHigherPriorityTaskWoken )
-	{
-		// Actual macro used here is port specific.
-		portYIELD_FROM_ISR ();
-	}
- }
- 
- * - * \defgroup xQueueSendFromISR xQueueSendFromISR - * \ingroup QueueManagement - */ -#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) - -/** - * queue. h - *
- BaseType_t xQueueGenericSendFromISR(
-										   QueueHandle_t		xQueue,
-										   const	void	*pvItemToQueue,
-										   BaseType_t	*pxHigherPriorityTaskWoken,
-										   BaseType_t	xCopyPosition
-									   );
- 
- * - * It is preferred that the macros xQueueSendFromISR(), - * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place - * of calling this function directly. xQueueGiveFromISR() is an - * equivalent for use by semaphores that don't actually copy any data. - * - * Post an item on a queue. It is safe to use this function from within an - * interrupt service routine. - * - * Items are queued by copy not reference so it is preferable to only - * queue small items, especially when called from an ISR. In most cases - * it would be preferable to store a pointer to the item being queued. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xQueueGenericSendFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the - * item at the back of the queue, or queueSEND_TO_FRONT to place the item - * at the front of the queue (for high priority messages). - * - * @return pdTRUE if the data was successfully sent to the queue, otherwise - * errQUEUE_FULL. - * - * Example usage for buffered IO (where the ISR can obtain more than one value - * per call): -
- void vBufferISR( void )
- {
- char cIn;
- BaseType_t xHigherPriorityTaskWokenByPost;
-
-	// We have not woken a task at the start of the ISR.
-	xHigherPriorityTaskWokenByPost = pdFALSE;
-
-	// Loop until the buffer is empty.
-	do
-	{
-		// Obtain a byte from the buffer.
-		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
-
-		// Post each byte.
-		xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK );
-
-	} while( portINPUT_BYTE( BUFFER_COUNT ) );
-
-	// Now the buffer is empty we can switch context if necessary.  Note that the
-	// name of the yield function required is port specific.
-	if( xHigherPriorityTaskWokenByPost )
-	{
-		portYIELD_FROM_ISR();
-	}
- }
- 
- * - * \defgroup xQueueSendFromISR xQueueSendFromISR - * \ingroup QueueManagement - */ -BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; -BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; - -/** - * queue. h - *
- BaseType_t xQueueReceiveFromISR(
-									   QueueHandle_t	xQueue,
-									   void	*pvBuffer,
-									   BaseType_t *pxTaskWoken
-								   );
- * 
- * - * Receive an item from a queue. It is safe to use this function from within an - * interrupt service routine. - * - * @param xQueue The handle to the queue from which the item is to be - * received. - * - * @param pvBuffer Pointer to the buffer into which the received item will - * be copied. - * - * @param pxTaskWoken A task may be blocked waiting for space to become - * available on the queue. If xQueueReceiveFromISR causes such a task to - * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will - * remain unchanged. - * - * @return pdTRUE if an item was successfully received from the queue, - * otherwise pdFALSE. - * - * Example usage: -
-
- QueueHandle_t xQueue;
-
- // Function to create a queue and post some values.
- void vAFunction( void *pvParameters )
- {
- char cValueToPost;
- const TickType_t xTicksToWait = ( TickType_t )0xff;
-
-	// Create a queue capable of containing 10 characters.
-	xQueue = xQueueCreate( 10, sizeof( char ) );
-	if( xQueue == 0 )
-	{
-		// Failed to create the queue.
-	}
-
-	// ...
-
-	// Post some characters that will be used within an ISR.  If the queue
-	// is full then this task will block for xTicksToWait ticks.
-	cValueToPost = 'a';
-	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
-	cValueToPost = 'b';
-	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
-
-	// ... keep posting characters ... this task may block when the queue
-	// becomes full.
-
-	cValueToPost = 'c';
-	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
- }
-
- // ISR that outputs all the characters received on the queue.
- void vISR_Routine( void )
- {
- BaseType_t xTaskWokenByReceive = pdFALSE;
- char cRxedChar;
-
-	while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )
-	{
-		// A character was received.  Output the character now.
-		vOutputCharacter( cRxedChar );
-
-		// If removing the character from the queue woke the task that was
-		// posting onto the queue cTaskWokenByReceive will have been set to
-		// pdTRUE.  No matter how many times this loop iterates only one
-		// task will be woken.
-	}
-
-	if( cTaskWokenByPost != ( char ) pdFALSE;
-	{
-		taskYIELD ();
-	}
- }
- 
- * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR - * \ingroup QueueManagement - */ -BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; - -/* - * Utilities to query queues that are safe to use from an ISR. These utilities - * should be used only from witin an ISR, or within a critical section. - */ -BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; - -/* - * The functions defined above are for passing data to and from tasks. The - * functions below are the equivalents for passing data to and from - * co-routines. - * - * These functions are called from the co-routine macro implementation and - * should not be called directly from application code. Instead use the macro - * wrappers defined within croutine.h. - */ -BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken ); -BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxTaskWoken ); -BaseType_t xQueueCRSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait ); -BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait ); - -/* - * For internal use only. Use xSemaphoreCreateMutex(), - * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling - * these functions directly. - */ -QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; -QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; -QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION; -QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; -BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; -TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; - -/* - * For internal use only. Use xSemaphoreTakeMutexRecursive() or - * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. - */ -BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; - -/* - * Reset a queue back to its original empty state. The return value is now - * obsolete and is always set to pdPASS. - */ -#define xQueueReset( xQueue ) xQueueGenericReset( xQueue, pdFALSE ) - -/* - * The registry is provided as a means for kernel aware debuggers to - * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add - * a queue, semaphore or mutex handle to the registry if you want the handle - * to be available to a kernel aware debugger. If you are not using a kernel - * aware debugger then this function can be ignored. - * - * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the - * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0 - * within FreeRTOSConfig.h for the registry to be available. Its value - * does not effect the number of queues, semaphores and mutexes that can be - * created - just the number that the registry can hold. - * - * @param xQueue The handle of the queue being added to the registry. This - * is the handle returned by a call to xQueueCreate(). Semaphore and mutex - * handles can also be passed in here. - * - * @param pcName The name to be associated with the handle. This is the - * name that the kernel aware debugger will display. The queue registry only - * stores a pointer to the string - so the string must be persistent (global or - * preferably in ROM/Flash), not on the stack. - */ -#if( configQUEUE_REGISTRY_SIZE > 0 ) - void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ -#endif - -/* - * The registry is provided as a means for kernel aware debuggers to - * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add - * a queue, semaphore or mutex handle to the registry if you want the handle - * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to - * remove the queue, semaphore or mutex from the register. If you are not using - * a kernel aware debugger then this function can be ignored. - * - * @param xQueue The handle of the queue being removed from the registry. - */ -#if( configQUEUE_REGISTRY_SIZE > 0 ) - void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -#endif - -/* - * The queue registry is provided as a means for kernel aware debuggers to - * locate queues, semaphores and mutexes. Call pcQueueGetName() to look - * up and return the name of a queue in the queue registry from the queue's - * handle. - * - * @param xQueue The handle of the queue the name of which will be returned. - * @return If the queue is in the registry then a pointer to the name of the - * queue is returned. If the queue is not in the registry then NULL is - * returned. - */ -#if( configQUEUE_REGISTRY_SIZE > 0 ) - const char *pcQueueGetName( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ -#endif - -/* - * Generic version of the function used to creaet a queue using dynamic memory - * allocation. This is called by other functions and macros that create other - * RTOS objects that use the queue structure as their base. - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; -#endif - -/* - * Generic version of the function used to creaet a queue using dynamic memory - * allocation. This is called by other functions and macros that create other - * RTOS objects that use the queue structure as their base. - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; -#endif - -/* - * Queue sets provide a mechanism to allow a task to block (pend) on a read - * operation from multiple queues or semaphores simultaneously. - * - * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this - * function. - * - * A queue set must be explicitly created using a call to xQueueCreateSet() - * before it can be used. Once created, standard FreeRTOS queues and semaphores - * can be added to the set using calls to xQueueAddToSet(). - * xQueueSelectFromSet() is then used to determine which, if any, of the queues - * or semaphores contained in the set is in a state where a queue read or - * semaphore take operation would be successful. - * - * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html - * for reasons why queue sets are very rarely needed in practice as there are - * simpler methods of blocking on multiple objects. - * - * Note 2: Blocking on a queue set that contains a mutex will not cause the - * mutex holder to inherit the priority of the blocked task. - * - * Note 3: An additional 4 bytes of RAM is required for each space in a every - * queue added to a queue set. Therefore counting semaphores that have a high - * maximum count value should not be added to a queue set. - * - * Note 4: A receive (in the case of a queue) or take (in the case of a - * semaphore) operation must not be performed on a member of a queue set unless - * a call to xQueueSelectFromSet() has first returned a handle to that set member. - * - * @param uxEventQueueLength Queue sets store events that occur on - * the queues and semaphores contained in the set. uxEventQueueLength specifies - * the maximum number of events that can be queued at once. To be absolutely - * certain that events are not lost uxEventQueueLength should be set to the - * total sum of the length of the queues added to the set, where binary - * semaphores and mutexes have a length of 1, and counting semaphores have a - * length set by their maximum count value. Examples: - * + If a queue set is to hold a queue of length 5, another queue of length 12, - * and a binary semaphore, then uxEventQueueLength should be set to - * (5 + 12 + 1), or 18. - * + If a queue set is to hold three binary semaphores then uxEventQueueLength - * should be set to (1 + 1 + 1 ), or 3. - * + If a queue set is to hold a counting semaphore that has a maximum count of - * 5, and a counting semaphore that has a maximum count of 3, then - * uxEventQueueLength should be set to (5 + 3), or 8. - * - * @return If the queue set is created successfully then a handle to the created - * queue set is returned. Otherwise NULL is returned. - */ -QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION; - -/* - * Adds a queue or semaphore to a queue set that was previously created by a - * call to xQueueCreateSet(). - * - * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this - * function. - * - * Note 1: A receive (in the case of a queue) or take (in the case of a - * semaphore) operation must not be performed on a member of a queue set unless - * a call to xQueueSelectFromSet() has first returned a handle to that set member. - * - * @param xQueueOrSemaphore The handle of the queue or semaphore being added to - * the queue set (cast to an QueueSetMemberHandle_t type). - * - * @param xQueueSet The handle of the queue set to which the queue or semaphore - * is being added. - * - * @return If the queue or semaphore was successfully added to the queue set - * then pdPASS is returned. If the queue could not be successfully added to the - * queue set because it is already a member of a different queue set then pdFAIL - * is returned. - */ -BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; - -/* - * Removes a queue or semaphore from a queue set. A queue or semaphore can only - * be removed from a set if the queue or semaphore is empty. - * - * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this - * function. - * - * @param xQueueOrSemaphore The handle of the queue or semaphore being removed - * from the queue set (cast to an QueueSetMemberHandle_t type). - * - * @param xQueueSet The handle of the queue set in which the queue or semaphore - * is included. - * - * @return If the queue or semaphore was successfully removed from the queue set - * then pdPASS is returned. If the queue was not in the queue set, or the - * queue (or semaphore) was not empty, then pdFAIL is returned. - */ -BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; - -/* - * xQueueSelectFromSet() selects from the members of a queue set a queue or - * semaphore that either contains data (in the case of a queue) or is available - * to take (in the case of a semaphore). xQueueSelectFromSet() effectively - * allows a task to block (pend) on a read operation on all the queues and - * semaphores in a queue set simultaneously. - * - * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this - * function. - * - * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html - * for reasons why queue sets are very rarely needed in practice as there are - * simpler methods of blocking on multiple objects. - * - * Note 2: Blocking on a queue set that contains a mutex will not cause the - * mutex holder to inherit the priority of the blocked task. - * - * Note 3: A receive (in the case of a queue) or take (in the case of a - * semaphore) operation must not be performed on a member of a queue set unless - * a call to xQueueSelectFromSet() has first returned a handle to that set member. - * - * @param xQueueSet The queue set on which the task will (potentially) block. - * - * @param xTicksToWait The maximum time, in ticks, that the calling task will - * remain in the Blocked state (with other tasks executing) to wait for a member - * of the queue set to be ready for a successful queue read or semaphore take - * operation. - * - * @return xQueueSelectFromSet() will return the handle of a queue (cast to - * a QueueSetMemberHandle_t type) contained in the queue set that contains data, - * or the handle of a semaphore (cast to a QueueSetMemberHandle_t type) contained - * in the queue set that is available, or NULL if no such queue or semaphore - * exists before before the specified block time expires. - */ -QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - -/* - * A version of xQueueSelectFromSet() that can be used from an ISR. - */ -QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; - -/* Not public API functions. */ -void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; -BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) PRIVILEGED_FUNCTION; -void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION; -UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; - - -#ifdef __cplusplus -} -#endif - -#endif /* QUEUE_H */ - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h deleted file mode 100644 index 787c791..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h +++ /dev/null @@ -1,1140 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef SEMAPHORE_H -#define SEMAPHORE_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h" must appear in source files before "include semphr.h" -#endif - -#include "queue.h" - -typedef QueueHandle_t SemaphoreHandle_t; - -#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( uint8_t ) 1U ) -#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) -#define semGIVE_BLOCK_TIME ( ( TickType_t ) 0U ) - - -/** - * semphr. h - *
vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore )
- * - * In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a binary semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the - * xSemaphoreCreateBinary() function. Note that binary semaphores created using - * the vSemaphoreCreateBinary() macro are created in a state such that the - * first call to 'take' the semaphore would pass, whereas binary semaphores - * created using xSemaphoreCreateBinary() are created in a state such that the - * the semaphore must first be 'given' before it can be 'taken'. - * - * Macro that implements a semaphore by using the existing queue mechanism. - * The queue length is 1 as this is a binary semaphore. The data size is 0 - * as we don't want to actually store any data - we just want to know if the - * queue is empty or full. - * - * This type of semaphore can be used for pure synchronisation between tasks or - * between an interrupt and a task. The semaphore need not be given back once - * obtained, so one task/interrupt can continuously 'give' the semaphore while - * another continuously 'takes' the semaphore. For this reason this type of - * semaphore does not use a priority inheritance mechanism. For an alternative - * that does use priority inheritance see xSemaphoreCreateMutex(). - * - * @param xSemaphore Handle to the created semaphore. Should be of type SemaphoreHandle_t. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore = NULL;
-
- void vATask( void * pvParameters )
- {
-    // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
-    // This is a macro so pass the variable in directly.
-    vSemaphoreCreateBinary( xSemaphore );
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.
-    }
- }
- 
- * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary - * \ingroup Semaphores - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define vSemaphoreCreateBinary( xSemaphore ) \ - { \ - ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ - if( ( xSemaphore ) != NULL ) \ - { \ - ( void ) xSemaphoreGive( ( xSemaphore ) ); \ - } \ - } -#endif - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateBinary( void )
- * - * Creates a new binary semaphore instance, and returns a handle by which the - * new semaphore can be referenced. - * - * In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a binary semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * Internally, within the FreeRTOS implementation, binary semaphores use a block - * of memory, in which the semaphore structure is stored. If a binary semaphore - * is created using xSemaphoreCreateBinary() then the required memory is - * automatically dynamically allocated inside the xSemaphoreCreateBinary() - * function. (see http://www.freertos.org/a00111.html). If a binary semaphore - * is created using xSemaphoreCreateBinaryStatic() then the application writer - * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a - * binary semaphore to be created without using any dynamic memory allocation. - * - * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this - * xSemaphoreCreateBinary() function. Note that binary semaphores created using - * the vSemaphoreCreateBinary() macro are created in a state such that the - * first call to 'take' the semaphore would pass, whereas binary semaphores - * created using xSemaphoreCreateBinary() are created in a state such that the - * the semaphore must first be 'given' before it can be 'taken'. - * - * This type of semaphore can be used for pure synchronisation between tasks or - * between an interrupt and a task. The semaphore need not be given back once - * obtained, so one task/interrupt can continuously 'give' the semaphore while - * another continuously 'takes' the semaphore. For this reason this type of - * semaphore does not use a priority inheritance mechanism. For an alternative - * that does use priority inheritance see xSemaphoreCreateMutex(). - * - * @return Handle to the created semaphore, or NULL if the memory required to - * hold the semaphore's data structures could not be allocated. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore = NULL;
-
- void vATask( void * pvParameters )
- {
-    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
-    // This is a macro so pass the variable in directly.
-    xSemaphore = xSemaphoreCreateBinary();
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.
-    }
- }
- 
- * \defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary - * \ingroup Semaphores - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) -#endif - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer )
- * - * Creates a new binary semaphore instance, and returns a handle by which the - * new semaphore can be referenced. - * - * NOTE: In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a binary semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * Internally, within the FreeRTOS implementation, binary semaphores use a block - * of memory, in which the semaphore structure is stored. If a binary semaphore - * is created using xSemaphoreCreateBinary() then the required memory is - * automatically dynamically allocated inside the xSemaphoreCreateBinary() - * function. (see http://www.freertos.org/a00111.html). If a binary semaphore - * is created using xSemaphoreCreateBinaryStatic() then the application writer - * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a - * binary semaphore to be created without using any dynamic memory allocation. - * - * This type of semaphore can be used for pure synchronisation between tasks or - * between an interrupt and a task. The semaphore need not be given back once - * obtained, so one task/interrupt can continuously 'give' the semaphore while - * another continuously 'takes' the semaphore. For this reason this type of - * semaphore does not use a priority inheritance mechanism. For an alternative - * that does use priority inheritance see xSemaphoreCreateMutex(). - * - * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, - * which will then be used to hold the semaphore's data structure, removing the - * need for the memory to be allocated dynamically. - * - * @return If the semaphore is created then a handle to the created semaphore is - * returned. If pxSemaphoreBuffer is NULL then NULL is returned. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore = NULL;
- StaticSemaphore_t xSemaphoreBuffer;
-
- void vATask( void * pvParameters )
- {
-    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
-    // The semaphore's data structures will be placed in the xSemaphoreBuffer
-    // variable, the address of which is passed into the function.  The
-    // function's parameter is not NULL, so the function will not attempt any
-    // dynamic memory allocation, and therefore the function will not return
-    // return NULL.
-    xSemaphore = xSemaphoreCreateBinary( &xSemaphoreBuffer );
-
-    // Rest of task code goes here.
- }
- 
- * \defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic - * \ingroup Semaphores - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore ) xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticSemaphore, queueQUEUE_TYPE_BINARY_SEMAPHORE ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * semphr. h - *
xSemaphoreTake(
- *                   SemaphoreHandle_t xSemaphore,
- *                   TickType_t xBlockTime
- *               )
- * - * Macro to obtain a semaphore. The semaphore must have previously been - * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or - * xSemaphoreCreateCounting(). - * - * @param xSemaphore A handle to the semaphore being taken - obtained when - * the semaphore was created. - * - * @param xBlockTime The time in ticks to wait for the semaphore to become - * available. The macro portTICK_PERIOD_MS can be used to convert this to a - * real time. A block time of zero can be used to poll the semaphore. A block - * time of portMAX_DELAY can be used to block indefinitely (provided - * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). - * - * @return pdTRUE if the semaphore was obtained. pdFALSE - * if xBlockTime expired without the semaphore becoming available. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore = NULL;
-
- // A task that creates a semaphore.
- void vATask( void * pvParameters )
- {
-    // Create the semaphore to guard a shared resource.
-    xSemaphore = xSemaphoreCreateBinary();
- }
-
- // A task that uses the semaphore.
- void vAnotherTask( void * pvParameters )
- {
-    // ... Do other things.
-
-    if( xSemaphore != NULL )
-    {
-        // See if we can obtain the semaphore.  If the semaphore is not available
-        // wait 10 ticks to see if it becomes free.
-        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
-        {
-            // We were able to obtain the semaphore and can now access the
-            // shared resource.
-
-            // ...
-
-            // We have finished accessing the shared resource.  Release the
-            // semaphore.
-            xSemaphoreGive( xSemaphore );
-        }
-        else
-        {
-            // We could not obtain the semaphore and can therefore not access
-            // the shared resource safely.
-        }
-    }
- }
- 
- * \defgroup xSemaphoreTake xSemaphoreTake - * \ingroup Semaphores - */ -#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) ) - -/** - * semphr. h - * xSemaphoreTakeRecursive( - * SemaphoreHandle_t xMutex, - * TickType_t xBlockTime - * ) - * - * Macro to recursively obtain, or 'take', a mutex type semaphore. - * The mutex must have previously been created using a call to - * xSemaphoreCreateRecursiveMutex(); - * - * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this - * macro to be available. - * - * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * @param xMutex A handle to the mutex being obtained. This is the - * handle returned by xSemaphoreCreateRecursiveMutex(); - * - * @param xBlockTime The time in ticks to wait for the semaphore to become - * available. The macro portTICK_PERIOD_MS can be used to convert this to a - * real time. A block time of zero can be used to poll the semaphore. If - * the task already owns the semaphore then xSemaphoreTakeRecursive() will - * return immediately no matter what the value of xBlockTime. - * - * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime - * expired without the semaphore becoming available. - * - * Example usage: -
- SemaphoreHandle_t xMutex = NULL;
-
- // A task that creates a mutex.
- void vATask( void * pvParameters )
- {
-    // Create the mutex to guard a shared resource.
-    xMutex = xSemaphoreCreateRecursiveMutex();
- }
-
- // A task that uses the mutex.
- void vAnotherTask( void * pvParameters )
- {
-    // ... Do other things.
-
-    if( xMutex != NULL )
-    {
-        // See if we can obtain the mutex.  If the mutex is not available
-        // wait 10 ticks to see if it becomes free.
-        if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
-        {
-            // We were able to obtain the mutex and can now access the
-            // shared resource.
-
-            // ...
-            // For some reason due to the nature of the code further calls to
-            // xSemaphoreTakeRecursive() are made on the same mutex.  In real
-            // code these would not be just sequential calls as this would make
-            // no sense.  Instead the calls are likely to be buried inside
-            // a more complex call structure.
-            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
-            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
-
-            // The mutex has now been 'taken' three times, so will not be
-            // available to another task until it has also been given back
-            // three times.  Again it is unlikely that real code would have
-            // these calls sequentially, but instead buried in a more complex
-            // call structure.  This is just for illustrative purposes.
-            xSemaphoreGiveRecursive( xMutex );
-            xSemaphoreGiveRecursive( xMutex );
-            xSemaphoreGiveRecursive( xMutex );
-
-            // Now the mutex can be taken by other tasks.
-        }
-        else
-        {
-            // We could not obtain the mutex and can therefore not access
-            // the shared resource safely.
-        }
-    }
- }
- 
- * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive - * \ingroup Semaphores - */ -#if( configUSE_RECURSIVE_MUTEXES == 1 ) - #define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) -#endif - -/** - * semphr. h - *
xSemaphoreGive( SemaphoreHandle_t xSemaphore )
- * - * Macro to release a semaphore. The semaphore must have previously been - * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or - * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). - * - * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for - * an alternative which can be used from an ISR. - * - * This macro must also not be used on semaphores created using - * xSemaphoreCreateRecursiveMutex(). - * - * @param xSemaphore A handle to the semaphore being released. This is the - * handle returned when the semaphore was created. - * - * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. - * Semaphores are implemented using queues. An error can occur if there is - * no space on the queue to post a message - indicating that the - * semaphore was not first obtained correctly. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore = NULL;
-
- void vATask( void * pvParameters )
- {
-    // Create the semaphore to guard a shared resource.
-    xSemaphore = vSemaphoreCreateBinary();
-
-    if( xSemaphore != NULL )
-    {
-        if( xSemaphoreGive( xSemaphore ) != pdTRUE )
-        {
-            // We would expect this call to fail because we cannot give
-            // a semaphore without first "taking" it!
-        }
-
-        // Obtain the semaphore - don't block if the semaphore is not
-        // immediately available.
-        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) )
-        {
-            // We now have the semaphore and can access the shared resource.
-
-            // ...
-
-            // We have finished accessing the shared resource so can free the
-            // semaphore.
-            if( xSemaphoreGive( xSemaphore ) != pdTRUE )
-            {
-                // We would not expect this call to fail because we must have
-                // obtained the semaphore to get here.
-            }
-        }
-    }
- }
- 
- * \defgroup xSemaphoreGive xSemaphoreGive - * \ingroup Semaphores - */ -#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) - -/** - * semphr. h - *
xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex )
- * - * Macro to recursively release, or 'give', a mutex type semaphore. - * The mutex must have previously been created using a call to - * xSemaphoreCreateRecursiveMutex(); - * - * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this - * macro to be available. - * - * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * @param xMutex A handle to the mutex being released, or 'given'. This is the - * handle returned by xSemaphoreCreateMutex(); - * - * @return pdTRUE if the semaphore was given. - * - * Example usage: -
- SemaphoreHandle_t xMutex = NULL;
-
- // A task that creates a mutex.
- void vATask( void * pvParameters )
- {
-    // Create the mutex to guard a shared resource.
-    xMutex = xSemaphoreCreateRecursiveMutex();
- }
-
- // A task that uses the mutex.
- void vAnotherTask( void * pvParameters )
- {
-    // ... Do other things.
-
-    if( xMutex != NULL )
-    {
-        // See if we can obtain the mutex.  If the mutex is not available
-        // wait 10 ticks to see if it becomes free.
-        if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE )
-        {
-            // We were able to obtain the mutex and can now access the
-            // shared resource.
-
-            // ...
-            // For some reason due to the nature of the code further calls to
-			// xSemaphoreTakeRecursive() are made on the same mutex.  In real
-			// code these would not be just sequential calls as this would make
-			// no sense.  Instead the calls are likely to be buried inside
-			// a more complex call structure.
-            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
-            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
-
-            // The mutex has now been 'taken' three times, so will not be
-			// available to another task until it has also been given back
-			// three times.  Again it is unlikely that real code would have
-			// these calls sequentially, it would be more likely that the calls
-			// to xSemaphoreGiveRecursive() would be called as a call stack
-			// unwound.  This is just for demonstrative purposes.
-            xSemaphoreGiveRecursive( xMutex );
-			xSemaphoreGiveRecursive( xMutex );
-			xSemaphoreGiveRecursive( xMutex );
-
-			// Now the mutex can be taken by other tasks.
-        }
-        else
-        {
-            // We could not obtain the mutex and can therefore not access
-            // the shared resource safely.
-        }
-    }
- }
- 
- * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive - * \ingroup Semaphores - */ -#if( configUSE_RECURSIVE_MUTEXES == 1 ) - #define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) -#endif - -/** - * semphr. h - *
- xSemaphoreGiveFromISR(
-                          SemaphoreHandle_t xSemaphore,
-                          BaseType_t *pxHigherPriorityTaskWoken
-                      )
- * - * Macro to release a semaphore. The semaphore must have previously been - * created with a call to xSemaphoreCreateBinary() or xSemaphoreCreateCounting(). - * - * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) - * must not be used with this macro. - * - * This macro can be used from an ISR. - * - * @param xSemaphore A handle to the semaphore being released. This is the - * handle returned when the semaphore was created. - * - * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. - * - * Example usage: -
- \#define LONG_TIME 0xffff
- \#define TICKS_TO_WAIT	10
- SemaphoreHandle_t xSemaphore = NULL;
-
- // Repetitive task.
- void vATask( void * pvParameters )
- {
-    for( ;; )
-    {
-        // We want this task to run every 10 ticks of a timer.  The semaphore
-        // was created before this task was started.
-
-        // Block waiting for the semaphore to become available.
-        if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )
-        {
-            // It is time to execute.
-
-            // ...
-
-            // We have finished our task.  Return to the top of the loop where
-            // we will block on the semaphore until it is time to execute
-            // again.  Note when using the semaphore for synchronisation with an
-			// ISR in this manner there is no need to 'give' the semaphore back.
-        }
-    }
- }
-
- // Timer ISR
- void vTimerISR( void * pvParameters )
- {
- static uint8_t ucLocalTickCount = 0;
- static BaseType_t xHigherPriorityTaskWoken;
-
-    // A timer tick has occurred.
-
-    // ... Do other time functions.
-
-    // Is it time for vATask () to run?
-	xHigherPriorityTaskWoken = pdFALSE;
-    ucLocalTickCount++;
-    if( ucLocalTickCount >= TICKS_TO_WAIT )
-    {
-        // Unblock the task by releasing the semaphore.
-        xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
-
-        // Reset the count so we release the semaphore again in 10 ticks time.
-        ucLocalTickCount = 0;
-    }
-
-    if( xHigherPriorityTaskWoken != pdFALSE )
-    {
-        // We can force a context switch here.  Context switching from an
-        // ISR uses port specific syntax.  Check the demo task for your port
-        // to find the syntax required.
-    }
- }
- 
- * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR - * \ingroup Semaphores - */ -#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) - -/** - * semphr. h - *
- xSemaphoreTakeFromISR(
-                          SemaphoreHandle_t xSemaphore,
-                          BaseType_t *pxHigherPriorityTaskWoken
-                      )
- * - * Macro to take a semaphore from an ISR. The semaphore must have - * previously been created with a call to xSemaphoreCreateBinary() or - * xSemaphoreCreateCounting(). - * - * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) - * must not be used with this macro. - * - * This macro can be used from an ISR, however taking a semaphore from an ISR - * is not a common operation. It is likely to only be useful when taking a - * counting semaphore when an interrupt is obtaining an object from a resource - * pool (when the semaphore count indicates the number of resources available). - * - * @param xSemaphore A handle to the semaphore being taken. This is the - * handle returned when the semaphore was created. - * - * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return pdTRUE if the semaphore was successfully taken, otherwise - * pdFALSE - */ -#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateMutex( void )
- * - * Creates a new mutex type semaphore instance, and returns a handle by which - * the new mutex can be referenced. - * - * Internally, within the FreeRTOS implementation, mutex semaphores use a block - * of memory, in which the mutex structure is stored. If a mutex is created - * using xSemaphoreCreateMutex() then the required memory is automatically - * dynamically allocated inside the xSemaphoreCreateMutex() function. (see - * http://www.freertos.org/a00111.html). If a mutex is created using - * xSemaphoreCreateMutexStatic() then the application writer must provided the - * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created - * without using any dynamic memory allocation. - * - * Mutexes created using this function can be accessed using the xSemaphoreTake() - * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and - * xSemaphoreGiveRecursive() macros must not be used. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @return If the mutex was successfully created then a handle to the created - * semaphore is returned. If there was not enough heap to allocate the mutex - * data structures then NULL is returned. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore;
-
- void vATask( void * pvParameters )
- {
-    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
-    // This is a macro so pass the variable in directly.
-    xSemaphore = xSemaphoreCreateMutex();
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.
-    }
- }
- 
- * \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex - * \ingroup Semaphores - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) -#endif - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer )
- * - * Creates a new mutex type semaphore instance, and returns a handle by which - * the new mutex can be referenced. - * - * Internally, within the FreeRTOS implementation, mutex semaphores use a block - * of memory, in which the mutex structure is stored. If a mutex is created - * using xSemaphoreCreateMutex() then the required memory is automatically - * dynamically allocated inside the xSemaphoreCreateMutex() function. (see - * http://www.freertos.org/a00111.html). If a mutex is created using - * xSemaphoreCreateMutexStatic() then the application writer must provided the - * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created - * without using any dynamic memory allocation. - * - * Mutexes created using this function can be accessed using the xSemaphoreTake() - * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and - * xSemaphoreGiveRecursive() macros must not be used. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, - * which will be used to hold the mutex's data structure, removing the need for - * the memory to be allocated dynamically. - * - * @return If the mutex was successfully created then a handle to the created - * mutex is returned. If pxMutexBuffer was NULL then NULL is returned. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore;
- StaticSemaphore_t xMutexBuffer;
-
- void vATask( void * pvParameters )
- {
-    // A mutex cannot be used before it has been created.  xMutexBuffer is
-    // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is
-    // attempted.
-    xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer );
-
-    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
-    // so there is no need to check it.
- }
- 
- * \defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic - * \ingroup Semaphores - */ - #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void )
- * - * Creates a new recursive mutex type semaphore instance, and returns a handle - * by which the new recursive mutex can be referenced. - * - * Internally, within the FreeRTOS implementation, recursive mutexs use a block - * of memory, in which the mutex structure is stored. If a recursive mutex is - * created using xSemaphoreCreateRecursiveMutex() then the required memory is - * automatically dynamically allocated inside the - * xSemaphoreCreateRecursiveMutex() function. (see - * http://www.freertos.org/a00111.html). If a recursive mutex is created using - * xSemaphoreCreateRecursiveMutexStatic() then the application writer must - * provide the memory that will get used by the mutex. - * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to - * be created without using any dynamic memory allocation. - * - * Mutexes created using this macro can be accessed using the - * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The - * xSemaphoreTake() and xSemaphoreGive() macros must not be used. - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @return xSemaphore Handle to the created mutex semaphore. Should be of type - * SemaphoreHandle_t. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore;
-
- void vATask( void * pvParameters )
- {
-    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
-    // This is a macro so pass the variable in directly.
-    xSemaphore = xSemaphoreCreateRecursiveMutex();
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.
-    }
- }
- 
- * \defgroup xSemaphoreCreateRecursiveMutex xSemaphoreCreateRecursiveMutex - * \ingroup Semaphores - */ -#if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) - #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) -#endif - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer )
- * - * Creates a new recursive mutex type semaphore instance, and returns a handle - * by which the new recursive mutex can be referenced. - * - * Internally, within the FreeRTOS implementation, recursive mutexs use a block - * of memory, in which the mutex structure is stored. If a recursive mutex is - * created using xSemaphoreCreateRecursiveMutex() then the required memory is - * automatically dynamically allocated inside the - * xSemaphoreCreateRecursiveMutex() function. (see - * http://www.freertos.org/a00111.html). If a recursive mutex is created using - * xSemaphoreCreateRecursiveMutexStatic() then the application writer must - * provide the memory that will get used by the mutex. - * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to - * be created without using any dynamic memory allocation. - * - * Mutexes created using this macro can be accessed using the - * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The - * xSemaphoreTake() and xSemaphoreGive() macros must not be used. - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, - * which will then be used to hold the recursive mutex's data structure, - * removing the need for the memory to be allocated dynamically. - * - * @return If the recursive mutex was successfully created then a handle to the - * created recursive mutex is returned. If pxMutexBuffer was NULL then NULL is - * returned. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore;
- StaticSemaphore_t xMutexBuffer;
-
- void vATask( void * pvParameters )
- {
-    // A recursive semaphore cannot be used before it is created.  Here a
-    // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic().
-    // The address of xMutexBuffer is passed into the function, and will hold
-    // the mutexes data structures - so no dynamic memory allocation will be
-    // attempted.
-    xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer );
-
-    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
-    // so there is no need to check it.
- }
- 
- * \defgroup xSemaphoreCreateRecursiveMutexStatic xSemaphoreCreateRecursiveMutexStatic - * \ingroup Semaphores - */ -#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) - #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore ) xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, pxStaticSemaphore ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount )
- * - * Creates a new counting semaphore instance, and returns a handle by which the - * new counting semaphore can be referenced. - * - * In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a counting semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * Internally, within the FreeRTOS implementation, counting semaphores use a - * block of memory, in which the counting semaphore structure is stored. If a - * counting semaphore is created using xSemaphoreCreateCounting() then the - * required memory is automatically dynamically allocated inside the - * xSemaphoreCreateCounting() function. (see - * http://www.freertos.org/a00111.html). If a counting semaphore is created - * using xSemaphoreCreateCountingStatic() then the application writer can - * instead optionally provide the memory that will get used by the counting - * semaphore. xSemaphoreCreateCountingStatic() therefore allows a counting - * semaphore to be created without using any dynamic memory allocation. - * - * Counting semaphores are typically used for two things: - * - * 1) Counting events. - * - * In this usage scenario an event handler will 'give' a semaphore each time - * an event occurs (incrementing the semaphore count value), and a handler - * task will 'take' a semaphore each time it processes an event - * (decrementing the semaphore count value). The count value is therefore - * the difference between the number of events that have occurred and the - * number that have been processed. In this case it is desirable for the - * initial count value to be zero. - * - * 2) Resource management. - * - * In this usage scenario the count value indicates the number of resources - * available. To obtain control of a resource a task must first obtain a - * semaphore - decrementing the semaphore count value. When the count value - * reaches zero there are no free resources. When a task finishes with the - * resource it 'gives' the semaphore back - incrementing the semaphore count - * value. In this case it is desirable for the initial count value to be - * equal to the maximum count value, indicating that all resources are free. - * - * @param uxMaxCount The maximum count value that can be reached. When the - * semaphore reaches this value it can no longer be 'given'. - * - * @param uxInitialCount The count value assigned to the semaphore when it is - * created. - * - * @return Handle to the created semaphore. Null if the semaphore could not be - * created. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore;
-
- void vATask( void * pvParameters )
- {
- SemaphoreHandle_t xSemaphore = NULL;
-
-    // Semaphore cannot be used before a call to xSemaphoreCreateCounting().
-    // The max value to which the semaphore can count should be 10, and the
-    // initial value assigned to the count should be 0.
-    xSemaphore = xSemaphoreCreateCounting( 10, 0 );
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.
-    }
- }
- 
- * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting - * \ingroup Semaphores - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) -#endif - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer )
- * - * Creates a new counting semaphore instance, and returns a handle by which the - * new counting semaphore can be referenced. - * - * In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a counting semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * Internally, within the FreeRTOS implementation, counting semaphores use a - * block of memory, in which the counting semaphore structure is stored. If a - * counting semaphore is created using xSemaphoreCreateCounting() then the - * required memory is automatically dynamically allocated inside the - * xSemaphoreCreateCounting() function. (see - * http://www.freertos.org/a00111.html). If a counting semaphore is created - * using xSemaphoreCreateCountingStatic() then the application writer must - * provide the memory. xSemaphoreCreateCountingStatic() therefore allows a - * counting semaphore to be created without using any dynamic memory allocation. - * - * Counting semaphores are typically used for two things: - * - * 1) Counting events. - * - * In this usage scenario an event handler will 'give' a semaphore each time - * an event occurs (incrementing the semaphore count value), and a handler - * task will 'take' a semaphore each time it processes an event - * (decrementing the semaphore count value). The count value is therefore - * the difference between the number of events that have occurred and the - * number that have been processed. In this case it is desirable for the - * initial count value to be zero. - * - * 2) Resource management. - * - * In this usage scenario the count value indicates the number of resources - * available. To obtain control of a resource a task must first obtain a - * semaphore - decrementing the semaphore count value. When the count value - * reaches zero there are no free resources. When a task finishes with the - * resource it 'gives' the semaphore back - incrementing the semaphore count - * value. In this case it is desirable for the initial count value to be - * equal to the maximum count value, indicating that all resources are free. - * - * @param uxMaxCount The maximum count value that can be reached. When the - * semaphore reaches this value it can no longer be 'given'. - * - * @param uxInitialCount The count value assigned to the semaphore when it is - * created. - * - * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, - * which will then be used to hold the semaphore's data structure, removing the - * need for the memory to be allocated dynamically. - * - * @return If the counting semaphore was successfully created then a handle to - * the created counting semaphore is returned. If pxSemaphoreBuffer was NULL - * then NULL is returned. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore;
- StaticSemaphore_t xSemaphoreBuffer;
-
- void vATask( void * pvParameters )
- {
- SemaphoreHandle_t xSemaphore = NULL;
-
-    // Counting semaphore cannot be used before they have been created.  Create
-    // a counting semaphore using xSemaphoreCreateCountingStatic().  The max
-    // value to which the semaphore can count is 10, and the initial value
-    // assigned to the count will be 0.  The address of xSemaphoreBuffer is
-    // passed in and will be used to hold the semaphore structure, so no dynamic
-    // memory allocation will be used.
-    xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer );
-
-    // No memory allocation was attempted so xSemaphore cannot be NULL, so there
-    // is no need to check its value.
- }
- 
- * \defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic - * \ingroup Semaphores - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer ) xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * semphr. h - *
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
- * - * Delete a semaphore. This function must be used with care. For example, - * do not delete a mutex type semaphore if the mutex is held by a task. - * - * @param xSemaphore A handle to the semaphore to be deleted. - * - * \defgroup vSemaphoreDelete vSemaphoreDelete - * \ingroup Semaphores - */ -#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) - -/** - * semphr.h - *
TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );
- * - * If xMutex is indeed a mutex type semaphore, return the current mutex holder. - * If xMutex is not a mutex type semaphore, or the mutex is available (not held - * by a task), return NULL. - * - * Note: This is a good way of determining if the calling task is the mutex - * holder, but not a good way of determining the identity of the mutex holder as - * the holder may change between the function exiting and the returned value - * being tested. - */ -#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) - -/** - * semphr.h - *
TaskHandle_t xSemaphoreGetMutexHolderFromISR( SemaphoreHandle_t xMutex );
- * - * If xMutex is indeed a mutex type semaphore, return the current mutex holder. - * If xMutex is not a mutex type semaphore, or the mutex is available (not held - * by a task), return NULL. - * - */ -#define xSemaphoreGetMutexHolderFromISR( xSemaphore ) xQueueGetMutexHolderFromISR( ( xSemaphore ) ) - -/** - * semphr.h - *
UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );
- * - * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns - * its current count value. If the semaphore is a binary semaphore then - * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the - * semaphore is not available. - * - */ -#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) ) - -#endif /* SEMAPHORE_H */ - - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h deleted file mode 100644 index b5bac08..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef STACK_MACROS_H -#define STACK_MACROS_H - -/* - * Call the stack overflow hook function if the stack of the task being swapped - * out is currently overflowed, or looks like it might have overflowed in the - * past. - * - * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check - * the current stack state only - comparing the current top of stack value to - * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 - * will also cause the last few stack bytes to be checked to ensure the value - * to which the bytes were set when the task was created have not been - * overwritten. Note this second test does not guarantee that an overflowed - * stack will always be recognised. - */ - -/*-----------------------------------------------------------*/ - -#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) ) - - /* Only the current stack state is to be checked. */ - #define taskCHECK_FOR_STACK_OVERFLOW() \ - { \ - /* Is the currently saved stack pointer within the stack limit? */ \ - if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \ - { \ - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ - } \ - } - -#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ -/*-----------------------------------------------------------*/ - -#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) ) - - /* Only the current stack state is to be checked. */ - #define taskCHECK_FOR_STACK_OVERFLOW() \ - { \ - \ - /* Is the currently saved stack pointer within the stack limit? */ \ - if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack ) \ - { \ - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ - } \ - } - -#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ -/*-----------------------------------------------------------*/ - -#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) - - #define taskCHECK_FOR_STACK_OVERFLOW() \ - { \ - const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \ - const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \ - \ - if( ( pulStack[ 0 ] != ulCheckValue ) || \ - ( pulStack[ 1 ] != ulCheckValue ) || \ - ( pulStack[ 2 ] != ulCheckValue ) || \ - ( pulStack[ 3 ] != ulCheckValue ) ) \ - { \ - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ - } \ - } - -#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ -/*-----------------------------------------------------------*/ - -#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) - - #define taskCHECK_FOR_STACK_OVERFLOW() \ - { \ - int8_t *pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \ - static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ - \ - \ - pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ - \ - /* Has the extremity of the task stack ever been written over? */ \ - if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ - { \ - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ - } \ - } - -#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ -/*-----------------------------------------------------------*/ - -/* Remove stack overflow macro if not being used. */ -#ifndef taskCHECK_FOR_STACK_OVERFLOW - #define taskCHECK_FOR_STACK_OVERFLOW() -#endif - - - -#endif /* STACK_MACROS_H */ - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h deleted file mode 100644 index a8b68ad..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h +++ /dev/null @@ -1,859 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/* - * Stream buffers are used to send a continuous stream of data from one task or - * interrupt to another. Their implementation is light weight, making them - * particularly suited for interrupt to task and core to core communication - * scenarios. - * - * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer - * implementation (so also the message buffer implementation, as message buffers - * are built on top of stream buffers) assumes there is only one task or - * interrupt that will write to the buffer (the writer), and only one task or - * interrupt that will read from the buffer (the reader). It is safe for the - * writer and reader to be different tasks or interrupts, but, unlike other - * FreeRTOS objects, it is not safe to have multiple different writers or - * multiple different readers. If there are to be multiple different writers - * then the application writer must place each call to a writing API function - * (such as xStreamBufferSend()) inside a critical section and set the send - * block time to 0. Likewise, if there are to be multiple different readers - * then the application writer must place each call to a reading API function - * (such as xStreamBufferReceive()) inside a critical section section and set the - * receive block time to 0. - * - */ - -#ifndef STREAM_BUFFER_H -#define STREAM_BUFFER_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h must appear in source files before include stream_buffer.h" -#endif - -#if defined( __cplusplus ) -extern "C" { -#endif - -/** - * Type by which stream buffers are referenced. For example, a call to - * xStreamBufferCreate() returns an StreamBufferHandle_t variable that can - * then be used as a parameter to xStreamBufferSend(), xStreamBufferReceive(), - * etc. - */ -struct StreamBufferDef_t; -typedef struct StreamBufferDef_t * StreamBufferHandle_t; - - -/** - * message_buffer.h - * -
-StreamBufferHandle_t xStreamBufferCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes );
-
- * - * Creates a new stream buffer using dynamically allocated memory. See - * xStreamBufferCreateStatic() for a version that uses statically allocated - * memory (memory that is allocated at compile time). - * - * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in - * FreeRTOSConfig.h for xStreamBufferCreate() to be available. - * - * @param xBufferSizeBytes The total number of bytes the stream buffer will be - * able to hold at any one time. - * - * @param xTriggerLevelBytes The number of bytes that must be in the stream - * buffer before a task that is blocked on the stream buffer to wait for data is - * moved out of the blocked state. For example, if a task is blocked on a read - * of an empty stream buffer that has a trigger level of 1 then the task will be - * unblocked when a single byte is written to the buffer or the task's block - * time expires. As another example, if a task is blocked on a read of an empty - * stream buffer that has a trigger level of 10 then the task will not be - * unblocked until the stream buffer contains at least 10 bytes or the task's - * block time expires. If a reading task's block time expires before the - * trigger level is reached then the task will still receive however many bytes - * are actually available. Setting a trigger level of 0 will result in a - * trigger level of 1 being used. It is not valid to specify a trigger level - * that is greater than the buffer size. - * - * @return If NULL is returned, then the stream buffer cannot be created - * because there is insufficient heap memory available for FreeRTOS to allocate - * the stream buffer data structures and storage area. A non-NULL value being - * returned indicates that the stream buffer has been created successfully - - * the returned value should be stored as the handle to the created stream - * buffer. - * - * Example use: -
-
-void vAFunction( void )
-{
-StreamBufferHandle_t xStreamBuffer;
-const size_t xStreamBufferSizeBytes = 100, xTriggerLevel = 10;
-
-    // Create a stream buffer that can hold 100 bytes.  The memory used to hold
-    // both the stream buffer structure and the data in the stream buffer is
-    // allocated dynamically.
-    xStreamBuffer = xStreamBufferCreate( xStreamBufferSizeBytes, xTriggerLevel );
-
-    if( xStreamBuffer == NULL )
-    {
-        // There was not enough heap memory space available to create the
-        // stream buffer.
-    }
-    else
-    {
-        // The stream buffer was created successfully and can now be used.
-    }
-}
-
- * \defgroup xStreamBufferCreate xStreamBufferCreate - * \ingroup StreamBufferManagement - */ -#define xStreamBufferCreate( xBufferSizeBytes, xTriggerLevelBytes ) xStreamBufferGenericCreate( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE ) - -/** - * stream_buffer.h - * -
-StreamBufferHandle_t xStreamBufferCreateStatic( size_t xBufferSizeBytes,
-                                                size_t xTriggerLevelBytes,
-                                                uint8_t *pucStreamBufferStorageArea,
-                                                StaticStreamBuffer_t *pxStaticStreamBuffer );
-
- * Creates a new stream buffer using statically allocated memory. See - * xStreamBufferCreate() for a version that uses dynamically allocated memory. - * - * configSUPPORT_STATIC_ALLOCATION must be set to 1 in FreeRTOSConfig.h for - * xStreamBufferCreateStatic() to be available. - * - * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the - * pucStreamBufferStorageArea parameter. - * - * @param xTriggerLevelBytes The number of bytes that must be in the stream - * buffer before a task that is blocked on the stream buffer to wait for data is - * moved out of the blocked state. For example, if a task is blocked on a read - * of an empty stream buffer that has a trigger level of 1 then the task will be - * unblocked when a single byte is written to the buffer or the task's block - * time expires. As another example, if a task is blocked on a read of an empty - * stream buffer that has a trigger level of 10 then the task will not be - * unblocked until the stream buffer contains at least 10 bytes or the task's - * block time expires. If a reading task's block time expires before the - * trigger level is reached then the task will still receive however many bytes - * are actually available. Setting a trigger level of 0 will result in a - * trigger level of 1 being used. It is not valid to specify a trigger level - * that is greater than the buffer size. - * - * @param pucStreamBufferStorageArea Must point to a uint8_t array that is at - * least xBufferSizeBytes + 1 big. This is the array to which streams are - * copied when they are written to the stream buffer. - * - * @param pxStaticStreamBuffer Must point to a variable of type - * StaticStreamBuffer_t, which will be used to hold the stream buffer's data - * structure. - * - * @return If the stream buffer is created successfully then a handle to the - * created stream buffer is returned. If either pucStreamBufferStorageArea or - * pxStaticstreamBuffer are NULL then NULL is returned. - * - * Example use: -
-
-// Used to dimension the array used to hold the streams.  The available space
-// will actually be one less than this, so 999.
-#define STORAGE_SIZE_BYTES 1000
-
-// Defines the memory that will actually hold the streams within the stream
-// buffer.
-static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ];
-
-// The variable used to hold the stream buffer structure.
-StaticStreamBuffer_t xStreamBufferStruct;
-
-void MyFunction( void )
-{
-StreamBufferHandle_t xStreamBuffer;
-const size_t xTriggerLevel = 1;
-
-    xStreamBuffer = xStreamBufferCreateStatic( sizeof( ucBufferStorage ),
-                                               xTriggerLevel,
-                                               ucBufferStorage,
-                                               &xStreamBufferStruct );
-
-    // As neither the pucStreamBufferStorageArea or pxStaticStreamBuffer
-    // parameters were NULL, xStreamBuffer will not be NULL, and can be used to
-    // reference the created stream buffer in other stream buffer API calls.
-
-    // Other code that uses the stream buffer can go here.
-}
-
-
- * \defgroup xStreamBufferCreateStatic xStreamBufferCreateStatic - * \ingroup StreamBufferManagement - */ -#define xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer ) xStreamBufferGenericCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE, pucStreamBufferStorageArea, pxStaticStreamBuffer ) - -/** - * stream_buffer.h - * -
-size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
-                          const void *pvTxData,
-                          size_t xDataLengthBytes,
-                          TickType_t xTicksToWait );
-
- * - * Sends bytes to a stream buffer. The bytes are copied into the stream buffer. - * - * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer - * implementation (so also the message buffer implementation, as message buffers - * are built on top of stream buffers) assumes there is only one task or - * interrupt that will write to the buffer (the writer), and only one task or - * interrupt that will read from the buffer (the reader). It is safe for the - * writer and reader to be different tasks or interrupts, but, unlike other - * FreeRTOS objects, it is not safe to have multiple different writers or - * multiple different readers. If there are to be multiple different writers - * then the application writer must place each call to a writing API function - * (such as xStreamBufferSend()) inside a critical section and set the send - * block time to 0. Likewise, if there are to be multiple different readers - * then the application writer must place each call to a reading API function - * (such as xStreamBufferReceive()) inside a critical section and set the receive - * block time to 0. - * - * Use xStreamBufferSend() to write to a stream buffer from a task. Use - * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt - * service routine (ISR). - * - * @param xStreamBuffer The handle of the stream buffer to which a stream is - * being sent. - * - * @param pvTxData A pointer to the buffer that holds the bytes to be copied - * into the stream buffer. - * - * @param xDataLengthBytes The maximum number of bytes to copy from pvTxData - * into the stream buffer. - * - * @param xTicksToWait The maximum amount of time the task should remain in the - * Blocked state to wait for enough space to become available in the stream - * buffer, should the stream buffer contain too little space to hold the - * another xDataLengthBytes bytes. The block time is specified in tick periods, - * so the absolute time it represents is dependent on the tick frequency. The - * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds - * into a time specified in ticks. Setting xTicksToWait to portMAX_DELAY will - * cause the task to wait indefinitely (without timing out), provided - * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. If a task times out - * before it can write all xDataLengthBytes into the buffer it will still write - * as many bytes as possible. A task does not use any CPU time when it is in - * the blocked state. - * - * @return The number of bytes written to the stream buffer. If a task times - * out before it can write all xDataLengthBytes into the buffer it will still - * write as many bytes as possible. - * - * Example use: -
-void vAFunction( StreamBufferHandle_t xStreamBuffer )
-{
-size_t xBytesSent;
-uint8_t ucArrayToSend[] = { 0, 1, 2, 3 };
-char *pcStringToSend = "String to send";
-const TickType_t x100ms = pdMS_TO_TICKS( 100 );
-
-    // Send an array to the stream buffer, blocking for a maximum of 100ms to
-    // wait for enough space to be available in the stream buffer.
-    xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms );
-
-    if( xBytesSent != sizeof( ucArrayToSend ) )
-    {
-        // The call to xStreamBufferSend() times out before there was enough
-        // space in the buffer for the data to be written, but it did
-        // successfully write xBytesSent bytes.
-    }
-
-    // Send the string to the stream buffer.  Return immediately if there is not
-    // enough space in the buffer.
-    xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 );
-
-    if( xBytesSent != strlen( pcStringToSend ) )
-    {
-        // The entire string could not be added to the stream buffer because
-        // there was not enough free space in the buffer, but xBytesSent bytes
-        // were sent.  Could try again to send the remaining bytes.
-    }
-}
-
- * \defgroup xStreamBufferSend xStreamBufferSend - * \ingroup StreamBufferManagement - */ -size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, - const void *pvTxData, - size_t xDataLengthBytes, - TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - -/** - * stream_buffer.h - * -
-size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,
-                                 const void *pvTxData,
-                                 size_t xDataLengthBytes,
-                                 BaseType_t *pxHigherPriorityTaskWoken );
-
- * - * Interrupt safe version of the API function that sends a stream of bytes to - * the stream buffer. - * - * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer - * implementation (so also the message buffer implementation, as message buffers - * are built on top of stream buffers) assumes there is only one task or - * interrupt that will write to the buffer (the writer), and only one task or - * interrupt that will read from the buffer (the reader). It is safe for the - * writer and reader to be different tasks or interrupts, but, unlike other - * FreeRTOS objects, it is not safe to have multiple different writers or - * multiple different readers. If there are to be multiple different writers - * then the application writer must place each call to a writing API function - * (such as xStreamBufferSend()) inside a critical section and set the send - * block time to 0. Likewise, if there are to be multiple different readers - * then the application writer must place each call to a reading API function - * (such as xStreamBufferReceive()) inside a critical section and set the receive - * block time to 0. - * - * Use xStreamBufferSend() to write to a stream buffer from a task. Use - * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt - * service routine (ISR). - * - * @param xStreamBuffer The handle of the stream buffer to which a stream is - * being sent. - * - * @param pvTxData A pointer to the data that is to be copied into the stream - * buffer. - * - * @param xDataLengthBytes The maximum number of bytes to copy from pvTxData - * into the stream buffer. - * - * @param pxHigherPriorityTaskWoken It is possible that a stream buffer will - * have a task blocked on it waiting for data. Calling - * xStreamBufferSendFromISR() can make data available, and so cause a task that - * was waiting for data to leave the Blocked state. If calling - * xStreamBufferSendFromISR() causes a task to leave the Blocked state, and the - * unblocked task has a priority higher than the currently executing task (the - * task that was interrupted), then, internally, xStreamBufferSendFromISR() - * will set *pxHigherPriorityTaskWoken to pdTRUE. If - * xStreamBufferSendFromISR() sets this value to pdTRUE, then normally a - * context switch should be performed before the interrupt is exited. This will - * ensure that the interrupt returns directly to the highest priority Ready - * state task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it - * is passed into the function. See the example code below for an example. - * - * @return The number of bytes actually written to the stream buffer, which will - * be less than xDataLengthBytes if the stream buffer didn't have enough free - * space for all the bytes to be written. - * - * Example use: -
-// A stream buffer that has already been created.
-StreamBufferHandle_t xStreamBuffer;
-
-void vAnInterruptServiceRoutine( void )
-{
-size_t xBytesSent;
-char *pcStringToSend = "String to send";
-BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
-
-    // Attempt to send the string to the stream buffer.
-    xBytesSent = xStreamBufferSendFromISR( xStreamBuffer,
-                                           ( void * ) pcStringToSend,
-                                           strlen( pcStringToSend ),
-                                           &xHigherPriorityTaskWoken );
-
-    if( xBytesSent != strlen( pcStringToSend ) )
-    {
-        // There was not enough free space in the stream buffer for the entire
-        // string to be written, ut xBytesSent bytes were written.
-    }
-
-    // If xHigherPriorityTaskWoken was set to pdTRUE inside
-    // xStreamBufferSendFromISR() then a task that has a priority above the
-    // priority of the currently executing task was unblocked and a context
-    // switch should be performed to ensure the ISR returns to the unblocked
-    // task.  In most FreeRTOS ports this is done by simply passing
-    // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the
-    // variables value, and perform the context switch if necessary.  Check the
-    // documentation for the port in use for port specific instructions.
-    taskYIELD_FROM_ISR( xHigherPriorityTaskWoken );
-}
-
- * \defgroup xStreamBufferSendFromISR xStreamBufferSendFromISR - * \ingroup StreamBufferManagement - */ -size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, - const void *pvTxData, - size_t xDataLengthBytes, - BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; - -/** - * stream_buffer.h - * -
-size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
-                             void *pvRxData,
-                             size_t xBufferLengthBytes,
-                             TickType_t xTicksToWait );
-
- * - * Receives bytes from a stream buffer. - * - * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer - * implementation (so also the message buffer implementation, as message buffers - * are built on top of stream buffers) assumes there is only one task or - * interrupt that will write to the buffer (the writer), and only one task or - * interrupt that will read from the buffer (the reader). It is safe for the - * writer and reader to be different tasks or interrupts, but, unlike other - * FreeRTOS objects, it is not safe to have multiple different writers or - * multiple different readers. If there are to be multiple different writers - * then the application writer must place each call to a writing API function - * (such as xStreamBufferSend()) inside a critical section and set the send - * block time to 0. Likewise, if there are to be multiple different readers - * then the application writer must place each call to a reading API function - * (such as xStreamBufferReceive()) inside a critical section and set the receive - * block time to 0. - * - * Use xStreamBufferReceive() to read from a stream buffer from a task. Use - * xStreamBufferReceiveFromISR() to read from a stream buffer from an - * interrupt service routine (ISR). - * - * @param xStreamBuffer The handle of the stream buffer from which bytes are to - * be received. - * - * @param pvRxData A pointer to the buffer into which the received bytes will be - * copied. - * - * @param xBufferLengthBytes The length of the buffer pointed to by the - * pvRxData parameter. This sets the maximum number of bytes to receive in one - * call. xStreamBufferReceive will return as many bytes as possible up to a - * maximum set by xBufferLengthBytes. - * - * @param xTicksToWait The maximum amount of time the task should remain in the - * Blocked state to wait for data to become available if the stream buffer is - * empty. xStreamBufferReceive() will return immediately if xTicksToWait is - * zero. The block time is specified in tick periods, so the absolute time it - * represents is dependent on the tick frequency. The macro pdMS_TO_TICKS() can - * be used to convert a time specified in milliseconds into a time specified in - * ticks. Setting xTicksToWait to portMAX_DELAY will cause the task to wait - * indefinitely (without timing out), provided INCLUDE_vTaskSuspend is set to 1 - * in FreeRTOSConfig.h. A task does not use any CPU time when it is in the - * Blocked state. - * - * @return The number of bytes actually read from the stream buffer, which will - * be less than xBufferLengthBytes if the call to xStreamBufferReceive() timed - * out before xBufferLengthBytes were available. - * - * Example use: -
-void vAFunction( StreamBuffer_t xStreamBuffer )
-{
-uint8_t ucRxData[ 20 ];
-size_t xReceivedBytes;
-const TickType_t xBlockTime = pdMS_TO_TICKS( 20 );
-
-    // Receive up to another sizeof( ucRxData ) bytes from the stream buffer.
-    // Wait in the Blocked state (so not using any CPU processing time) for a
-    // maximum of 100ms for the full sizeof( ucRxData ) number of bytes to be
-    // available.
-    xReceivedBytes = xStreamBufferReceive( xStreamBuffer,
-                                           ( void * ) ucRxData,
-                                           sizeof( ucRxData ),
-                                           xBlockTime );
-
-    if( xReceivedBytes > 0 )
-    {
-        // A ucRxData contains another xRecievedBytes bytes of data, which can
-        // be processed here....
-    }
-}
-
- * \defgroup xStreamBufferReceive xStreamBufferReceive - * \ingroup StreamBufferManagement - */ -size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, - void *pvRxData, - size_t xBufferLengthBytes, - TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - -/** - * stream_buffer.h - * -
-size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,
-                                    void *pvRxData,
-                                    size_t xBufferLengthBytes,
-                                    BaseType_t *pxHigherPriorityTaskWoken );
-
- * - * An interrupt safe version of the API function that receives bytes from a - * stream buffer. - * - * Use xStreamBufferReceive() to read bytes from a stream buffer from a task. - * Use xStreamBufferReceiveFromISR() to read bytes from a stream buffer from an - * interrupt service routine (ISR). - * - * @param xStreamBuffer The handle of the stream buffer from which a stream - * is being received. - * - * @param pvRxData A pointer to the buffer into which the received bytes are - * copied. - * - * @param xBufferLengthBytes The length of the buffer pointed to by the - * pvRxData parameter. This sets the maximum number of bytes to receive in one - * call. xStreamBufferReceive will return as many bytes as possible up to a - * maximum set by xBufferLengthBytes. - * - * @param pxHigherPriorityTaskWoken It is possible that a stream buffer will - * have a task blocked on it waiting for space to become available. Calling - * xStreamBufferReceiveFromISR() can make space available, and so cause a task - * that is waiting for space to leave the Blocked state. If calling - * xStreamBufferReceiveFromISR() causes a task to leave the Blocked state, and - * the unblocked task has a priority higher than the currently executing task - * (the task that was interrupted), then, internally, - * xStreamBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE. - * If xStreamBufferReceiveFromISR() sets this value to pdTRUE, then normally a - * context switch should be performed before the interrupt is exited. That will - * ensure the interrupt returns directly to the highest priority Ready state - * task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it is - * passed into the function. See the code example below for an example. - * - * @return The number of bytes read from the stream buffer, if any. - * - * Example use: -
-// A stream buffer that has already been created.
-StreamBuffer_t xStreamBuffer;
-
-void vAnInterruptServiceRoutine( void )
-{
-uint8_t ucRxData[ 20 ];
-size_t xReceivedBytes;
-BaseType_t xHigherPriorityTaskWoken = pdFALSE;  // Initialised to pdFALSE.
-
-    // Receive the next stream from the stream buffer.
-    xReceivedBytes = xStreamBufferReceiveFromISR( xStreamBuffer,
-                                                  ( void * ) ucRxData,
-                                                  sizeof( ucRxData ),
-                                                  &xHigherPriorityTaskWoken );
-
-    if( xReceivedBytes > 0 )
-    {
-        // ucRxData contains xReceivedBytes read from the stream buffer.
-        // Process the stream here....
-    }
-
-    // If xHigherPriorityTaskWoken was set to pdTRUE inside
-    // xStreamBufferReceiveFromISR() then a task that has a priority above the
-    // priority of the currently executing task was unblocked and a context
-    // switch should be performed to ensure the ISR returns to the unblocked
-    // task.  In most FreeRTOS ports this is done by simply passing
-    // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the
-    // variables value, and perform the context switch if necessary.  Check the
-    // documentation for the port in use for port specific instructions.
-    taskYIELD_FROM_ISR( xHigherPriorityTaskWoken );
-}
-
- * \defgroup xStreamBufferReceiveFromISR xStreamBufferReceiveFromISR - * \ingroup StreamBufferManagement - */ -size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, - void *pvRxData, - size_t xBufferLengthBytes, - BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; - -/** - * stream_buffer.h - * -
-void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer );
-
- * - * Deletes a stream buffer that was previously created using a call to - * xStreamBufferCreate() or xStreamBufferCreateStatic(). If the stream - * buffer was created using dynamic memory (that is, by xStreamBufferCreate()), - * then the allocated memory is freed. - * - * A stream buffer handle must not be used after the stream buffer has been - * deleted. - * - * @param xStreamBuffer The handle of the stream buffer to be deleted. - * - * \defgroup vStreamBufferDelete vStreamBufferDelete - * \ingroup StreamBufferManagement - */ -void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; - -/** - * stream_buffer.h - * -
-BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer );
-
- * - * Queries a stream buffer to see if it is full. A stream buffer is full if it - * does not have any free space, and therefore cannot accept any more data. - * - * @param xStreamBuffer The handle of the stream buffer being queried. - * - * @return If the stream buffer is full then pdTRUE is returned. Otherwise - * pdFALSE is returned. - * - * \defgroup xStreamBufferIsFull xStreamBufferIsFull - * \ingroup StreamBufferManagement - */ -BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; - -/** - * stream_buffer.h - * -
-BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer );
-
- * - * Queries a stream buffer to see if it is empty. A stream buffer is empty if - * it does not contain any data. - * - * @param xStreamBuffer The handle of the stream buffer being queried. - * - * @return If the stream buffer is empty then pdTRUE is returned. Otherwise - * pdFALSE is returned. - * - * \defgroup xStreamBufferIsEmpty xStreamBufferIsEmpty - * \ingroup StreamBufferManagement - */ -BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; - -/** - * stream_buffer.h - * -
-BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer );
-
- * - * Resets a stream buffer to its initial, empty, state. Any data that was in - * the stream buffer is discarded. A stream buffer can only be reset if there - * are no tasks blocked waiting to either send to or receive from the stream - * buffer. - * - * @param xStreamBuffer The handle of the stream buffer being reset. - * - * @return If the stream buffer is reset then pdPASS is returned. If there was - * a task blocked waiting to send to or read from the stream buffer then the - * stream buffer is not reset and pdFAIL is returned. - * - * \defgroup xStreamBufferReset xStreamBufferReset - * \ingroup StreamBufferManagement - */ -BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; - -/** - * stream_buffer.h - * -
-size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer );
-
- * - * Queries a stream buffer to see how much free space it contains, which is - * equal to the amount of data that can be sent to the stream buffer before it - * is full. - * - * @param xStreamBuffer The handle of the stream buffer being queried. - * - * @return The number of bytes that can be written to the stream buffer before - * the stream buffer would be full. - * - * \defgroup xStreamBufferSpacesAvailable xStreamBufferSpacesAvailable - * \ingroup StreamBufferManagement - */ -size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; - -/** - * stream_buffer.h - * -
-size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer );
-
- * - * Queries a stream buffer to see how much data it contains, which is equal to - * the number of bytes that can be read from the stream buffer before the stream - * buffer would be empty. - * - * @param xStreamBuffer The handle of the stream buffer being queried. - * - * @return The number of bytes that can be read from the stream buffer before - * the stream buffer would be empty. - * - * \defgroup xStreamBufferBytesAvailable xStreamBufferBytesAvailable - * \ingroup StreamBufferManagement - */ -size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; - -/** - * stream_buffer.h - * -
-BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel );
-
- * - * A stream buffer's trigger level is the number of bytes that must be in the - * stream buffer before a task that is blocked on the stream buffer to - * wait for data is moved out of the blocked state. For example, if a task is - * blocked on a read of an empty stream buffer that has a trigger level of 1 - * then the task will be unblocked when a single byte is written to the buffer - * or the task's block time expires. As another example, if a task is blocked - * on a read of an empty stream buffer that has a trigger level of 10 then the - * task will not be unblocked until the stream buffer contains at least 10 bytes - * or the task's block time expires. If a reading task's block time expires - * before the trigger level is reached then the task will still receive however - * many bytes are actually available. Setting a trigger level of 0 will result - * in a trigger level of 1 being used. It is not valid to specify a trigger - * level that is greater than the buffer size. - * - * A trigger level is set when the stream buffer is created, and can be modified - * using xStreamBufferSetTriggerLevel(). - * - * @param xStreamBuffer The handle of the stream buffer being updated. - * - * @param xTriggerLevel The new trigger level for the stream buffer. - * - * @return If xTriggerLevel was less than or equal to the stream buffer's length - * then the trigger level will be updated and pdTRUE is returned. Otherwise - * pdFALSE is returned. - * - * \defgroup xStreamBufferSetTriggerLevel xStreamBufferSetTriggerLevel - * \ingroup StreamBufferManagement - */ -BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) PRIVILEGED_FUNCTION; - -/** - * stream_buffer.h - * -
-BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
-
- * - * For advanced users only. - * - * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when - * data is sent to a message buffer or stream buffer. If there was a task that - * was blocked on the message or stream buffer waiting for data to arrive then - * the sbSEND_COMPLETED() macro sends a notification to the task to remove it - * from the Blocked state. xStreamBufferSendCompletedFromISR() does the same - * thing. It is provided to enable application writers to implement their own - * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME. - * - * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for - * additional information. - * - * @param xStreamBuffer The handle of the stream buffer to which data was - * written. - * - * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be - * initialised to pdFALSE before it is passed into - * xStreamBufferSendCompletedFromISR(). If calling - * xStreamBufferSendCompletedFromISR() removes a task from the Blocked state, - * and the task has a priority above the priority of the currently running task, - * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a - * context switch should be performed before exiting the ISR. - * - * @return If a task was removed from the Blocked state then pdTRUE is returned. - * Otherwise pdFALSE is returned. - * - * \defgroup xStreamBufferSendCompletedFromISR xStreamBufferSendCompletedFromISR - * \ingroup StreamBufferManagement - */ -BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; - -/** - * stream_buffer.h - * -
-BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
-
- * - * For advanced users only. - * - * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when - * data is read out of a message buffer or stream buffer. If there was a task - * that was blocked on the message or stream buffer waiting for data to arrive - * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to - * remove it from the Blocked state. xStreamBufferReceiveCompletedFromISR() - * does the same thing. It is provided to enable application writers to - * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT - * ANY OTHER TIME. - * - * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for - * additional information. - * - * @param xStreamBuffer The handle of the stream buffer from which data was - * read. - * - * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be - * initialised to pdFALSE before it is passed into - * xStreamBufferReceiveCompletedFromISR(). If calling - * xStreamBufferReceiveCompletedFromISR() removes a task from the Blocked state, - * and the task has a priority above the priority of the currently running task, - * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a - * context switch should be performed before exiting the ISR. - * - * @return If a task was removed from the Blocked state then pdTRUE is returned. - * Otherwise pdFALSE is returned. - * - * \defgroup xStreamBufferReceiveCompletedFromISR xStreamBufferReceiveCompletedFromISR - * \ingroup StreamBufferManagement - */ -BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; - -/* Functions below here are not part of the public API. */ -StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, - size_t xTriggerLevelBytes, - BaseType_t xIsMessageBuffer ) PRIVILEGED_FUNCTION; - -StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, - size_t xTriggerLevelBytes, - BaseType_t xIsMessageBuffer, - uint8_t * const pucStreamBufferStorageArea, - StaticStreamBuffer_t * const pxStaticStreamBuffer ) PRIVILEGED_FUNCTION; - -size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; - -#if( configUSE_TRACE_FACILITY == 1 ) - void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, UBaseType_t uxStreamBufferNumber ) PRIVILEGED_FUNCTION; - UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; - uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; -#endif - -#if defined( __cplusplus ) -} -#endif - -#endif /* !defined( STREAM_BUFFER_H ) */ diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/task.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/task.h deleted file mode 100644 index b0cc60b..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/task.h +++ /dev/null @@ -1,2543 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - - -#ifndef INC_TASK_H -#define INC_TASK_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h must appear in source files before include task.h" -#endif - -#include "list.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*----------------------------------------------------------- - * MACROS AND DEFINITIONS - *----------------------------------------------------------*/ - -#define tskKERNEL_VERSION_NUMBER "V10.3.1" -#define tskKERNEL_VERSION_MAJOR 10 -#define tskKERNEL_VERSION_MINOR 3 -#define tskKERNEL_VERSION_BUILD 1 - -/* MPU region parameters passed in ulParameters - * of MemoryRegion_t struct. */ -#define tskMPU_REGION_READ_ONLY ( 1UL << 0UL ) -#define tskMPU_REGION_READ_WRITE ( 1UL << 1UL ) -#define tskMPU_REGION_EXECUTE_NEVER ( 1UL << 2UL ) -#define tskMPU_REGION_NORMAL_MEMORY ( 1UL << 3UL ) -#define tskMPU_REGION_DEVICE_MEMORY ( 1UL << 4UL ) - -/** - * task. h - * - * Type by which tasks are referenced. For example, a call to xTaskCreate - * returns (via a pointer parameter) an TaskHandle_t variable that can then - * be used as a parameter to vTaskDelete to delete the task. - * - * \defgroup TaskHandle_t TaskHandle_t - * \ingroup Tasks - */ -struct tskTaskControlBlock; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ -typedef struct tskTaskControlBlock* TaskHandle_t; - -/* - * Defines the prototype to which the application task hook function must - * conform. - */ -typedef BaseType_t (*TaskHookFunction_t)( void * ); - -/* Task states returned by eTaskGetState. */ -typedef enum -{ - eRunning = 0, /* A task is querying the state of itself, so must be running. */ - eReady, /* The task being queried is in a read or pending ready list. */ - eBlocked, /* The task being queried is in the Blocked state. */ - eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ - eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */ - eInvalid /* Used as an 'invalid state' value. */ -} eTaskState; - -/* Actions that can be performed when vTaskNotify() is called. */ -typedef enum -{ - eNoAction = 0, /* Notify the task without updating its notify value. */ - eSetBits, /* Set bits in the task's notification value. */ - eIncrement, /* Increment the task's notification value. */ - eSetValueWithOverwrite, /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */ - eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */ -} eNotifyAction; - -/* - * Used internally only. - */ -typedef struct xTIME_OUT -{ - BaseType_t xOverflowCount; - TickType_t xTimeOnEntering; -} TimeOut_t; - -/* - * Defines the memory ranges allocated to the task when an MPU is used. - */ -typedef struct xMEMORY_REGION -{ - void *pvBaseAddress; - uint32_t ulLengthInBytes; - uint32_t ulParameters; -} MemoryRegion_t; - -/* - * Parameters required to create an MPU protected task. - */ -typedef struct xTASK_PARAMETERS -{ - TaskFunction_t pvTaskCode; - const char * const pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - configSTACK_DEPTH_TYPE usStackDepth; - void *pvParameters; - UBaseType_t uxPriority; - StackType_t *puxStackBuffer; - MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ]; - #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - StaticTask_t * const pxTaskBuffer; - #endif -} TaskParameters_t; - -/* Used with the uxTaskGetSystemState() function to return the state of each task -in the system. */ -typedef struct xTASK_STATUS -{ - TaskHandle_t xHandle; /* The handle of the task to which the rest of the information in the structure relates. */ - const char *pcTaskName; /* A pointer to the task's name. This value will be invalid if the task was deleted since the structure was populated! */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - UBaseType_t xTaskNumber; /* A number unique to the task. */ - eTaskState eCurrentState; /* The state in which the task existed when the structure was populated. */ - UBaseType_t uxCurrentPriority; /* The priority at which the task was running (may be inherited) when the structure was populated. */ - UBaseType_t uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */ - uint32_t ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See http://www.freertos.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ - StackType_t *pxStackBase; /* Points to the lowest address of the task's stack area. */ - configSTACK_DEPTH_TYPE usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ -} TaskStatus_t; - -/* Possible return values for eTaskConfirmSleepModeStatus(). */ -typedef enum -{ - eAbortSleep = 0, /* A task has been made ready or a context switch pended since portSUPPORESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */ - eStandardSleep, /* Enter a sleep mode that will not last any longer than the expected idle time. */ - eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */ -} eSleepModeStatus; - -/** - * Defines the priority used by the idle task. This must not be modified. - * - * \ingroup TaskUtils - */ -#define tskIDLE_PRIORITY ( ( UBaseType_t ) 0U ) - -/** - * task. h - * - * Macro for forcing a context switch. - * - * \defgroup taskYIELD taskYIELD - * \ingroup SchedulerControl - */ -#define taskYIELD() portYIELD() - -/** - * task. h - * - * Macro to mark the start of a critical code region. Preemptive context - * switches cannot occur when in a critical region. - * - * NOTE: This may alter the stack (depending on the portable implementation) - * so must be used with care! - * - * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL - * \ingroup SchedulerControl - */ -#define taskENTER_CRITICAL() portENTER_CRITICAL() -#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() - -/** - * task. h - * - * Macro to mark the end of a critical code region. Preemptive context - * switches cannot occur when in a critical region. - * - * NOTE: This may alter the stack (depending on the portable implementation) - * so must be used with care! - * - * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL - * \ingroup SchedulerControl - */ -#define taskEXIT_CRITICAL() portEXIT_CRITICAL() -#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) -/** - * task. h - * - * Macro to disable all maskable interrupts. - * - * \defgroup taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS - * \ingroup SchedulerControl - */ -#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() - -/** - * task. h - * - * Macro to enable microcontroller interrupts. - * - * \defgroup taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS - * \ingroup SchedulerControl - */ -#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() - -/* Definitions returned by xTaskGetSchedulerState(). taskSCHEDULER_SUSPENDED is -0 to generate more optimal code when configASSERT() is defined as the constant -is used in assert() statements. */ -#define taskSCHEDULER_SUSPENDED ( ( BaseType_t ) 0 ) -#define taskSCHEDULER_NOT_STARTED ( ( BaseType_t ) 1 ) -#define taskSCHEDULER_RUNNING ( ( BaseType_t ) 2 ) - - -/*----------------------------------------------------------- - * TASK CREATION API - *----------------------------------------------------------*/ - -/** - * task. h - *
- BaseType_t xTaskCreate(
-							  TaskFunction_t pvTaskCode,
-							  const char * const pcName,
-							  configSTACK_DEPTH_TYPE usStackDepth,
-							  void *pvParameters,
-							  UBaseType_t uxPriority,
-							  TaskHandle_t *pvCreatedTask
-						  );
- * - * Create a new task and add it to the list of tasks that are ready to run. - * - * Internally, within the FreeRTOS implementation, tasks use two blocks of - * memory. The first block is used to hold the task's data structures. The - * second block is used by the task as its stack. If a task is created using - * xTaskCreate() then both blocks of memory are automatically dynamically - * allocated inside the xTaskCreate() function. (see - * http://www.freertos.org/a00111.html). If a task is created using - * xTaskCreateStatic() then the application writer must provide the required - * memory. xTaskCreateStatic() therefore allows a task to be created without - * using any dynamic memory allocation. - * - * See xTaskCreateStatic() for a version that does not use any dynamic memory - * allocation. - * - * xTaskCreate() can only be used to create a task that has unrestricted - * access to the entire microcontroller memory map. Systems that include MPU - * support can alternatively create an MPU constrained task using - * xTaskCreateRestricted(). - * - * @param pvTaskCode Pointer to the task entry function. Tasks - * must be implemented to never return (i.e. continuous loop). - * - * @param pcName A descriptive name for the task. This is mainly used to - * facilitate debugging. Max length defined by configMAX_TASK_NAME_LEN - default - * is 16. - * - * @param usStackDepth The size of the task stack specified as the number of - * variables the stack can hold - not the number of bytes. For example, if - * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes - * will be allocated for stack storage. - * - * @param pvParameters Pointer that will be used as the parameter for the task - * being created. - * - * @param uxPriority The priority at which the task should run. Systems that - * include MPU support can optionally create tasks in a privileged (system) - * mode by setting bit portPRIVILEGE_BIT of the priority parameter. For - * example, to create a privileged task at priority 2 the uxPriority parameter - * should be set to ( 2 | portPRIVILEGE_BIT ). - * - * @param pvCreatedTask Used to pass back a handle by which the created task - * can be referenced. - * - * @return pdPASS if the task was successfully created and added to a ready - * list, otherwise an error code defined in the file projdefs.h - * - * Example usage: -
- // Task to be created.
- void vTaskCode( void * pvParameters )
- {
-	 for( ;; )
-	 {
-		 // Task code goes here.
-	 }
- }
-
- // Function that creates a task.
- void vOtherFunction( void )
- {
- static uint8_t ucParameterToPass;
- TaskHandle_t xHandle = NULL;
-
-	 // Create the task, storing the handle.  Note that the passed parameter ucParameterToPass
-	 // must exist for the lifetime of the task, so in this case is declared static.  If it was just an
-	 // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time
-	 // the new task attempts to access it.
-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
-	 configASSERT( xHandle );
-
-	 // Use the handle to delete the task.
-	 if( xHandle != NULL )
-	 {
-	 	vTaskDelete( xHandle );
-	 }
- }
-   
- * \defgroup xTaskCreate xTaskCreate - * \ingroup Tasks - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, - const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const configSTACK_DEPTH_TYPE usStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; -#endif - -/** - * task. h - *
- TaskHandle_t xTaskCreateStatic( TaskFunction_t pvTaskCode,
-								 const char * const pcName,
-								 uint32_t ulStackDepth,
-								 void *pvParameters,
-								 UBaseType_t uxPriority,
-								 StackType_t *pxStackBuffer,
-								 StaticTask_t *pxTaskBuffer );
- * - * Create a new task and add it to the list of tasks that are ready to run. - * - * Internally, within the FreeRTOS implementation, tasks use two blocks of - * memory. The first block is used to hold the task's data structures. The - * second block is used by the task as its stack. If a task is created using - * xTaskCreate() then both blocks of memory are automatically dynamically - * allocated inside the xTaskCreate() function. (see - * http://www.freertos.org/a00111.html). If a task is created using - * xTaskCreateStatic() then the application writer must provide the required - * memory. xTaskCreateStatic() therefore allows a task to be created without - * using any dynamic memory allocation. - * - * @param pvTaskCode Pointer to the task entry function. Tasks - * must be implemented to never return (i.e. continuous loop). - * - * @param pcName A descriptive name for the task. This is mainly used to - * facilitate debugging. The maximum length of the string is defined by - * configMAX_TASK_NAME_LEN in FreeRTOSConfig.h. - * - * @param ulStackDepth The size of the task stack specified as the number of - * variables the stack can hold - not the number of bytes. For example, if - * the stack is 32-bits wide and ulStackDepth is defined as 100 then 400 bytes - * will be allocated for stack storage. - * - * @param pvParameters Pointer that will be used as the parameter for the task - * being created. - * - * @param uxPriority The priority at which the task will run. - * - * @param pxStackBuffer Must point to a StackType_t array that has at least - * ulStackDepth indexes - the array will then be used as the task's stack, - * removing the need for the stack to be allocated dynamically. - * - * @param pxTaskBuffer Must point to a variable of type StaticTask_t, which will - * then be used to hold the task's data structures, removing the need for the - * memory to be allocated dynamically. - * - * @return If neither pxStackBuffer or pxTaskBuffer are NULL, then the task will - * be created and a handle to the created task is returned. If either - * pxStackBuffer or pxTaskBuffer are NULL then the task will not be created and - * NULL is returned. - * - * Example usage: -
-
-    // Dimensions the buffer that the task being created will use as its stack.
-    // NOTE:  This is the number of words the stack will hold, not the number of
-    // bytes.  For example, if each stack item is 32-bits, and this is set to 100,
-    // then 400 bytes (100 * 32-bits) will be allocated.
-    #define STACK_SIZE 200
-
-    // Structure that will hold the TCB of the task being created.
-    StaticTask_t xTaskBuffer;
-
-    // Buffer that the task being created will use as its stack.  Note this is
-    // an array of StackType_t variables.  The size of StackType_t is dependent on
-    // the RTOS port.
-    StackType_t xStack[ STACK_SIZE ];
-
-    // Function that implements the task being created.
-    void vTaskCode( void * pvParameters )
-    {
-        // The parameter value is expected to be 1 as 1 is passed in the
-        // pvParameters value in the call to xTaskCreateStatic().
-        configASSERT( ( uint32_t ) pvParameters == 1UL );
-
-        for( ;; )
-        {
-            // Task code goes here.
-        }
-    }
-
-    // Function that creates a task.
-    void vOtherFunction( void )
-    {
-        TaskHandle_t xHandle = NULL;
-
-        // Create the task without using any dynamic memory allocation.
-        xHandle = xTaskCreateStatic(
-                      vTaskCode,       // Function that implements the task.
-                      "NAME",          // Text name for the task.
-                      STACK_SIZE,      // Stack size in words, not bytes.
-                      ( void * ) 1,    // Parameter passed into the task.
-                      tskIDLE_PRIORITY,// Priority at which the task is created.
-                      xStack,          // Array to use as the task's stack.
-                      &xTaskBuffer );  // Variable to hold the task's data structure.
-
-        // puxStackBuffer and pxTaskBuffer were not NULL, so the task will have
-        // been created, and xHandle will be the task's handle.  Use the handle
-        // to suspend the task.
-        vTaskSuspend( xHandle );
-    }
-   
- * \defgroup xTaskCreateStatic xTaskCreateStatic - * \ingroup Tasks - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, - const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const uint32_t ulStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - StackType_t * const puxStackBuffer, - StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION; -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * task. h - *
- BaseType_t xTaskCreateRestricted( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask );
- * - * Only available when configSUPPORT_DYNAMIC_ALLOCATION is set to 1. - * - * xTaskCreateRestricted() should only be used in systems that include an MPU - * implementation. - * - * Create a new task and add it to the list of tasks that are ready to run. - * The function parameters define the memory regions and associated access - * permissions allocated to the task. - * - * See xTaskCreateRestrictedStatic() for a version that does not use any - * dynamic memory allocation. - * - * @param pxTaskDefinition Pointer to a structure that contains a member - * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API - * documentation) plus an optional stack buffer and the memory region - * definitions. - * - * @param pxCreatedTask Used to pass back a handle by which the created task - * can be referenced. - * - * @return pdPASS if the task was successfully created and added to a ready - * list, otherwise an error code defined in the file projdefs.h - * - * Example usage: -
-// Create an TaskParameters_t structure that defines the task to be created.
-static const TaskParameters_t xCheckTaskParameters =
-{
-	vATask,		// pvTaskCode - the function that implements the task.
-	"ATask",	// pcName - just a text name for the task to assist debugging.
-	100,		// usStackDepth	- the stack size DEFINED IN WORDS.
-	NULL,		// pvParameters - passed into the task function as the function parameters.
-	( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state.
-	cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack.
-
-	// xRegions - Allocate up to three separate memory regions for access by
-	// the task, with appropriate access permissions.  Different processors have
-	// different memory alignment requirements - refer to the FreeRTOS documentation
-	// for full information.
-	{
-		// Base address					Length	Parameters
-		{ cReadWriteArray,				32,		portMPU_REGION_READ_WRITE },
-		{ cReadOnlyArray,				32,		portMPU_REGION_READ_ONLY },
-		{ cPrivilegedOnlyAccessArray,	128,	portMPU_REGION_PRIVILEGED_READ_WRITE }
-	}
-};
-
-int main( void )
-{
-TaskHandle_t xHandle;
-
-	// Create a task from the const structure defined above.  The task handle
-	// is requested (the second parameter is not NULL) but in this case just for
-	// demonstration purposes as its not actually used.
-	xTaskCreateRestricted( &xRegTest1Parameters, &xHandle );
-
-	// Start the scheduler.
-	vTaskStartScheduler();
-
-	// Will only get here if there was insufficient memory to create the idle
-	// and/or timer task.
-	for( ;; );
-}
-   
- * \defgroup xTaskCreateRestricted xTaskCreateRestricted - * \ingroup Tasks - */ -#if( portUSING_MPU_WRAPPERS == 1 ) - BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) PRIVILEGED_FUNCTION; -#endif - -/** - * task. h - *
- BaseType_t xTaskCreateRestrictedStatic( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask );
- * - * Only available when configSUPPORT_STATIC_ALLOCATION is set to 1. - * - * xTaskCreateRestrictedStatic() should only be used in systems that include an - * MPU implementation. - * - * Internally, within the FreeRTOS implementation, tasks use two blocks of - * memory. The first block is used to hold the task's data structures. The - * second block is used by the task as its stack. If a task is created using - * xTaskCreateRestricted() then the stack is provided by the application writer, - * and the memory used to hold the task's data structure is automatically - * dynamically allocated inside the xTaskCreateRestricted() function. If a task - * is created using xTaskCreateRestrictedStatic() then the application writer - * must provide the memory used to hold the task's data structures too. - * xTaskCreateRestrictedStatic() therefore allows a memory protected task to be - * created without using any dynamic memory allocation. - * - * @param pxTaskDefinition Pointer to a structure that contains a member - * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API - * documentation) plus an optional stack buffer and the memory region - * definitions. If configSUPPORT_STATIC_ALLOCATION is set to 1 the structure - * contains an additional member, which is used to point to a variable of type - * StaticTask_t - which is then used to hold the task's data structure. - * - * @param pxCreatedTask Used to pass back a handle by which the created task - * can be referenced. - * - * @return pdPASS if the task was successfully created and added to a ready - * list, otherwise an error code defined in the file projdefs.h - * - * Example usage: -
-// Create an TaskParameters_t structure that defines the task to be created.
-// The StaticTask_t variable is only included in the structure when
-// configSUPPORT_STATIC_ALLOCATION is set to 1.  The PRIVILEGED_DATA macro can
-// be used to force the variable into the RTOS kernel's privileged data area.
-static PRIVILEGED_DATA StaticTask_t xTaskBuffer;
-static const TaskParameters_t xCheckTaskParameters =
-{
-	vATask,		// pvTaskCode - the function that implements the task.
-	"ATask",	// pcName - just a text name for the task to assist debugging.
-	100,		// usStackDepth	- the stack size DEFINED IN WORDS.
-	NULL,		// pvParameters - passed into the task function as the function parameters.
-	( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state.
-	cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack.
-
-	// xRegions - Allocate up to three separate memory regions for access by
-	// the task, with appropriate access permissions.  Different processors have
-	// different memory alignment requirements - refer to the FreeRTOS documentation
-	// for full information.
-	{
-		// Base address					Length	Parameters
-		{ cReadWriteArray,				32,		portMPU_REGION_READ_WRITE },
-		{ cReadOnlyArray,				32,		portMPU_REGION_READ_ONLY },
-		{ cPrivilegedOnlyAccessArray,	128,	portMPU_REGION_PRIVILEGED_READ_WRITE }
-	}
-
-	&xTaskBuffer; // Holds the task's data structure.
-};
-
-int main( void )
-{
-TaskHandle_t xHandle;
-
-	// Create a task from the const structure defined above.  The task handle
-	// is requested (the second parameter is not NULL) but in this case just for
-	// demonstration purposes as its not actually used.
-	xTaskCreateRestricted( &xRegTest1Parameters, &xHandle );
-
-	// Start the scheduler.
-	vTaskStartScheduler();
-
-	// Will only get here if there was insufficient memory to create the idle
-	// and/or timer task.
-	for( ;; );
-}
-   
- * \defgroup xTaskCreateRestrictedStatic xTaskCreateRestrictedStatic - * \ingroup Tasks - */ -#if( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) PRIVILEGED_FUNCTION; -#endif - -/** - * task. h - *
- void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions );
- * - * Memory regions are assigned to a restricted task when the task is created by - * a call to xTaskCreateRestricted(). These regions can be redefined using - * vTaskAllocateMPURegions(). - * - * @param xTask The handle of the task being updated. - * - * @param xRegions A pointer to an MemoryRegion_t structure that contains the - * new memory region definitions. - * - * Example usage: -
-// Define an array of MemoryRegion_t structures that configures an MPU region
-// allowing read/write access for 1024 bytes starting at the beginning of the
-// ucOneKByte array.  The other two of the maximum 3 definable regions are
-// unused so set to zero.
-static const MemoryRegion_t xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] =
-{
-	// Base address		Length		Parameters
-	{ ucOneKByte,		1024,		portMPU_REGION_READ_WRITE },
-	{ 0,				0,			0 },
-	{ 0,				0,			0 }
-};
-
-void vATask( void *pvParameters )
-{
-	// This task was created such that it has access to certain regions of
-	// memory as defined by the MPU configuration.  At some point it is
-	// desired that these MPU regions are replaced with that defined in the
-	// xAltRegions const struct above.  Use a call to vTaskAllocateMPURegions()
-	// for this purpose.  NULL is used as the task handle to indicate that this
-	// function should modify the MPU regions of the calling task.
-	vTaskAllocateMPURegions( NULL, xAltRegions );
-
-	// Now the task can continue its function, but from this point on can only
-	// access its stack and the ucOneKByte array (unless any other statically
-	// defined or shared regions have been declared elsewhere).
-}
-   
- * \defgroup xTaskCreateRestricted xTaskCreateRestricted - * \ingroup Tasks - */ -void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
void vTaskDelete( TaskHandle_t xTask );
- * - * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Remove a task from the RTOS real time kernel's management. The task being - * deleted will be removed from all ready, blocked, suspended and event lists. - * - * NOTE: The idle task is responsible for freeing the kernel allocated - * memory from tasks that have been deleted. It is therefore important that - * the idle task is not starved of microcontroller processing time if your - * application makes any calls to vTaskDelete (). Memory allocated by the - * task code is not automatically freed, and should be freed before the task - * is deleted. - * - * See the demo application file death.c for sample code that utilises - * vTaskDelete (). - * - * @param xTask The handle of the task to be deleted. Passing NULL will - * cause the calling task to be deleted. - * - * Example usage: -
- void vOtherFunction( void )
- {
- TaskHandle_t xHandle;
-
-	 // Create the task, storing the handle.
-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
-
-	 // Use the handle to delete the task.
-	 vTaskDelete( xHandle );
- }
-   
- * \defgroup vTaskDelete vTaskDelete - * \ingroup Tasks - */ -void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; - -/*----------------------------------------------------------- - * TASK CONTROL API - *----------------------------------------------------------*/ - -/** - * task. h - *
void vTaskDelay( const TickType_t xTicksToDelay );
- * - * Delay a task for a given number of ticks. The actual time that the - * task remains blocked depends on the tick rate. The constant - * portTICK_PERIOD_MS can be used to calculate real time from the tick - * rate - with the resolution of one tick period. - * - * INCLUDE_vTaskDelay must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * - * vTaskDelay() specifies a time at which the task wishes to unblock relative to - * the time at which vTaskDelay() is called. For example, specifying a block - * period of 100 ticks will cause the task to unblock 100 ticks after - * vTaskDelay() is called. vTaskDelay() does not therefore provide a good method - * of controlling the frequency of a periodic task as the path taken through the - * code, as well as other task and interrupt activity, will effect the frequency - * at which vTaskDelay() gets called and therefore the time at which the task - * next executes. See vTaskDelayUntil() for an alternative API function designed - * to facilitate fixed frequency execution. It does this by specifying an - * absolute time (rather than a relative time) at which the calling task should - * unblock. - * - * @param xTicksToDelay The amount of time, in tick periods, that - * the calling task should block. - * - * Example usage: - - void vTaskFunction( void * pvParameters ) - { - // Block for 500ms. - const TickType_t xDelay = 500 / portTICK_PERIOD_MS; - - for( ;; ) - { - // Simply toggle the LED every 500ms, blocking between each toggle. - vToggleLED(); - vTaskDelay( xDelay ); - } - } - - * \defgroup vTaskDelay vTaskDelay - * \ingroup TaskCtrl - */ -void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement );
- * - * INCLUDE_vTaskDelayUntil must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Delay a task until a specified time. This function can be used by periodic - * tasks to ensure a constant execution frequency. - * - * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will - * cause a task to block for the specified number of ticks from the time vTaskDelay () is - * called. It is therefore difficult to use vTaskDelay () by itself to generate a fixed - * execution frequency as the time between a task starting to execute and that task - * calling vTaskDelay () may not be fixed [the task may take a different path though the - * code between calls, or may get interrupted or preempted a different number of times - * each time it executes]. - * - * Whereas vTaskDelay () specifies a wake time relative to the time at which the function - * is called, vTaskDelayUntil () specifies the absolute (exact) time at which it wishes to - * unblock. - * - * The constant portTICK_PERIOD_MS can be used to calculate real time from the tick - * rate - with the resolution of one tick period. - * - * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the - * task was last unblocked. The variable must be initialised with the current time - * prior to its first use (see the example below). Following this the variable is - * automatically updated within vTaskDelayUntil (). - * - * @param xTimeIncrement The cycle time period. The task will be unblocked at - * time *pxPreviousWakeTime + xTimeIncrement. Calling vTaskDelayUntil with the - * same xTimeIncrement parameter value will cause the task to execute with - * a fixed interface period. - * - * Example usage: -
- // Perform an action every 10 ticks.
- void vTaskFunction( void * pvParameters )
- {
- TickType_t xLastWakeTime;
- const TickType_t xFrequency = 10;
-
-	 // Initialise the xLastWakeTime variable with the current time.
-	 xLastWakeTime = xTaskGetTickCount ();
-	 for( ;; )
-	 {
-		 // Wait for the next cycle.
-		 vTaskDelayUntil( &xLastWakeTime, xFrequency );
-
-		 // Perform action here.
-	 }
- }
-   
- * \defgroup vTaskDelayUntil vTaskDelayUntil - * \ingroup TaskCtrl - */ -void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
BaseType_t xTaskAbortDelay( TaskHandle_t xTask );
- * - * INCLUDE_xTaskAbortDelay must be defined as 1 in FreeRTOSConfig.h for this - * function to be available. - * - * A task will enter the Blocked state when it is waiting for an event. The - * event it is waiting for can be a temporal event (waiting for a time), such - * as when vTaskDelay() is called, or an event on an object, such as when - * xQueueReceive() or ulTaskNotifyTake() is called. If the handle of a task - * that is in the Blocked state is used in a call to xTaskAbortDelay() then the - * task will leave the Blocked state, and return from whichever function call - * placed the task into the Blocked state. - * - * There is no 'FromISR' version of this function as an interrupt would need to - * know which object a task was blocked on in order to know which actions to - * take. For example, if the task was blocked on a queue the interrupt handler - * would then need to know if the queue was locked. - * - * @param xTask The handle of the task to remove from the Blocked state. - * - * @return If the task referenced by xTask was not in the Blocked state then - * pdFAIL is returned. Otherwise pdPASS is returned. - * - * \defgroup xTaskAbortDelay xTaskAbortDelay - * \ingroup TaskCtrl - */ -BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );
- * - * INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Obtain the priority of any task. - * - * @param xTask Handle of the task to be queried. Passing a NULL - * handle results in the priority of the calling task being returned. - * - * @return The priority of xTask. - * - * Example usage: -
- void vAFunction( void )
- {
- TaskHandle_t xHandle;
-
-	 // Create a task, storing the handle.
-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
-
-	 // ...
-
-	 // Use the handle to obtain the priority of the created task.
-	 // It was created with tskIDLE_PRIORITY, but may have changed
-	 // it itself.
-	 if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY )
-	 {
-		 // The task has changed it's priority.
-	 }
-
-	 // ...
-
-	 // Is our priority higher than the created task?
-	 if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) )
-	 {
-		 // Our priority (obtained using NULL handle) is higher.
-	 }
- }
-   
- * \defgroup uxTaskPriorityGet uxTaskPriorityGet - * \ingroup TaskCtrl - */ -UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask );
- * - * A version of uxTaskPriorityGet() that can be used from an ISR. - */ -UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
eTaskState eTaskGetState( TaskHandle_t xTask );
- * - * INCLUDE_eTaskGetState must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Obtain the state of any task. States are encoded by the eTaskState - * enumerated type. - * - * @param xTask Handle of the task to be queried. - * - * @return The state of xTask at the time the function was called. Note the - * state of the task might change between the function being called, and the - * functions return value being tested by the calling task. - */ -eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState );
- * - * configUSE_TRACE_FACILITY must be defined as 1 for this function to be - * available. See the configuration section for more information. - * - * Populates a TaskStatus_t structure with information about a task. - * - * @param xTask Handle of the task being queried. If xTask is NULL then - * information will be returned about the calling task. - * - * @param pxTaskStatus A pointer to the TaskStatus_t structure that will be - * filled with information about the task referenced by the handle passed using - * the xTask parameter. - * - * @xGetFreeStackSpace The TaskStatus_t structure contains a member to report - * the stack high water mark of the task being queried. Calculating the stack - * high water mark takes a relatively long time, and can make the system - * temporarily unresponsive - so the xGetFreeStackSpace parameter is provided to - * allow the high water mark checking to be skipped. The high watermark value - * will only be written to the TaskStatus_t structure if xGetFreeStackSpace is - * not set to pdFALSE; - * - * @param eState The TaskStatus_t structure contains a member to report the - * state of the task being queried. Obtaining the task state is not as fast as - * a simple assignment - so the eState parameter is provided to allow the state - * information to be omitted from the TaskStatus_t structure. To obtain state - * information then set eState to eInvalid - otherwise the value passed in - * eState will be reported as the task state in the TaskStatus_t structure. - * - * Example usage: -
- void vAFunction( void )
- {
- TaskHandle_t xHandle;
- TaskStatus_t xTaskDetails;
-
-    // Obtain the handle of a task from its name.
-    xHandle = xTaskGetHandle( "Task_Name" );
-
-    // Check the handle is not NULL.
-    configASSERT( xHandle );
-
-    // Use the handle to obtain further information about the task.
-    vTaskGetInfo( xHandle,
-                  &xTaskDetails,
-                  pdTRUE, // Include the high water mark in xTaskDetails.
-                  eInvalid ); // Include the task state in xTaskDetails.
- }
-   
- * \defgroup vTaskGetInfo vTaskGetInfo - * \ingroup TaskCtrl - */ -void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );
- * - * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Set the priority of any task. - * - * A context switch will occur before the function returns if the priority - * being set is higher than the currently executing task. - * - * @param xTask Handle to the task for which the priority is being set. - * Passing a NULL handle results in the priority of the calling task being set. - * - * @param uxNewPriority The priority to which the task will be set. - * - * Example usage: -
- void vAFunction( void )
- {
- TaskHandle_t xHandle;
-
-	 // Create a task, storing the handle.
-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
-
-	 // ...
-
-	 // Use the handle to raise the priority of the created task.
-	 vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );
-
-	 // ...
-
-	 // Use a NULL handle to raise our priority to the same value.
-	 vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );
- }
-   
- * \defgroup vTaskPrioritySet vTaskPrioritySet - * \ingroup TaskCtrl - */ -void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
void vTaskSuspend( TaskHandle_t xTaskToSuspend );
- * - * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Suspend any task. When suspended a task will never get any microcontroller - * processing time, no matter what its priority. - * - * Calls to vTaskSuspend are not accumulative - - * i.e. calling vTaskSuspend () twice on the same task still only requires one - * call to vTaskResume () to ready the suspended task. - * - * @param xTaskToSuspend Handle to the task being suspended. Passing a NULL - * handle will cause the calling task to be suspended. - * - * Example usage: -
- void vAFunction( void )
- {
- TaskHandle_t xHandle;
-
-	 // Create a task, storing the handle.
-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
-
-	 // ...
-
-	 // Use the handle to suspend the created task.
-	 vTaskSuspend( xHandle );
-
-	 // ...
-
-	 // The created task will not run during this period, unless
-	 // another task calls vTaskResume( xHandle ).
-
-	 //...
-
-
-	 // Suspend ourselves.
-	 vTaskSuspend( NULL );
-
-	 // We cannot get here unless another task calls vTaskResume
-	 // with our handle as the parameter.
- }
-   
- * \defgroup vTaskSuspend vTaskSuspend - * \ingroup TaskCtrl - */ -void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
void vTaskResume( TaskHandle_t xTaskToResume );
- * - * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Resumes a suspended task. - * - * A task that has been suspended by one or more calls to vTaskSuspend () - * will be made available for running again by a single call to - * vTaskResume (). - * - * @param xTaskToResume Handle to the task being readied. - * - * Example usage: -
- void vAFunction( void )
- {
- TaskHandle_t xHandle;
-
-	 // Create a task, storing the handle.
-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
-
-	 // ...
-
-	 // Use the handle to suspend the created task.
-	 vTaskSuspend( xHandle );
-
-	 // ...
-
-	 // The created task will not run during this period, unless
-	 // another task calls vTaskResume( xHandle ).
-
-	 //...
-
-
-	 // Resume the suspended task ourselves.
-	 vTaskResume( xHandle );
-
-	 // The created task will once again get microcontroller processing
-	 // time in accordance with its priority within the system.
- }
-   
- * \defgroup vTaskResume vTaskResume - * \ingroup TaskCtrl - */ -void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
void xTaskResumeFromISR( TaskHandle_t xTaskToResume );
- * - * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be - * available. See the configuration section for more information. - * - * An implementation of vTaskResume() that can be called from within an ISR. - * - * A task that has been suspended by one or more calls to vTaskSuspend () - * will be made available for running again by a single call to - * xTaskResumeFromISR (). - * - * xTaskResumeFromISR() should not be used to synchronise a task with an - * interrupt if there is a chance that the interrupt could arrive prior to the - * task being suspended - as this can lead to interrupts being missed. Use of a - * semaphore as a synchronisation mechanism would avoid this eventuality. - * - * @param xTaskToResume Handle to the task being readied. - * - * @return pdTRUE if resuming the task should result in a context switch, - * otherwise pdFALSE. This is used by the ISR to determine if a context switch - * may be required following the ISR. - * - * \defgroup vTaskResumeFromISR vTaskResumeFromISR - * \ingroup TaskCtrl - */ -BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; - -/*----------------------------------------------------------- - * SCHEDULER CONTROL - *----------------------------------------------------------*/ - -/** - * task. h - *
void vTaskStartScheduler( void );
- * - * Starts the real time kernel tick processing. After calling the kernel - * has control over which tasks are executed and when. - * - * See the demo application file main.c for an example of creating - * tasks and starting the kernel. - * - * Example usage: -
- void vAFunction( void )
- {
-	 // Create at least one task before starting the kernel.
-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
-
-	 // Start the real time kernel with preemption.
-	 vTaskStartScheduler ();
-
-	 // Will not get here unless a task calls vTaskEndScheduler ()
- }
-   
- * - * \defgroup vTaskStartScheduler vTaskStartScheduler - * \ingroup SchedulerControl - */ -void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
void vTaskEndScheduler( void );
- * - * NOTE: At the time of writing only the x86 real mode port, which runs on a PC - * in place of DOS, implements this function. - * - * Stops the real time kernel tick. All created tasks will be automatically - * deleted and multitasking (either preemptive or cooperative) will - * stop. Execution then resumes from the point where vTaskStartScheduler () - * was called, as if vTaskStartScheduler () had just returned. - * - * See the demo application file main. c in the demo/PC directory for an - * example that uses vTaskEndScheduler (). - * - * vTaskEndScheduler () requires an exit function to be defined within the - * portable layer (see vPortEndScheduler () in port. c for the PC port). This - * performs hardware specific operations such as stopping the kernel tick. - * - * vTaskEndScheduler () will cause all of the resources allocated by the - * kernel to be freed - but will not free resources allocated by application - * tasks. - * - * Example usage: -
- void vTaskCode( void * pvParameters )
- {
-	 for( ;; )
-	 {
-		 // Task code goes here.
-
-		 // At some point we want to end the real time kernel processing
-		 // so call ...
-		 vTaskEndScheduler ();
-	 }
- }
-
- void vAFunction( void )
- {
-	 // Create at least one task before starting the kernel.
-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
-
-	 // Start the real time kernel with preemption.
-	 vTaskStartScheduler ();
-
-	 // Will only get here when the vTaskCode () task has called
-	 // vTaskEndScheduler ().  When we get here we are back to single task
-	 // execution.
- }
-   
- * - * \defgroup vTaskEndScheduler vTaskEndScheduler - * \ingroup SchedulerControl - */ -void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
void vTaskSuspendAll( void );
- * - * Suspends the scheduler without disabling interrupts. Context switches will - * not occur while the scheduler is suspended. - * - * After calling vTaskSuspendAll () the calling task will continue to execute - * without risk of being swapped out until a call to xTaskResumeAll () has been - * made. - * - * API functions that have the potential to cause a context switch (for example, - * vTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler - * is suspended. - * - * Example usage: -
- void vTask1( void * pvParameters )
- {
-	 for( ;; )
-	 {
-		 // Task code goes here.
-
-		 // ...
-
-		 // At some point the task wants to perform a long operation during
-		 // which it does not want to get swapped out.  It cannot use
-		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
-		 // operation may cause interrupts to be missed - including the
-		 // ticks.
-
-		 // Prevent the real time kernel swapping out the task.
-		 vTaskSuspendAll ();
-
-		 // Perform the operation here.  There is no need to use critical
-		 // sections as we have all the microcontroller processing time.
-		 // During this time interrupts will still operate and the kernel
-		 // tick count will be maintained.
-
-		 // ...
-
-		 // The operation is complete.  Restart the kernel.
-		 xTaskResumeAll ();
-	 }
- }
-   
- * \defgroup vTaskSuspendAll vTaskSuspendAll - * \ingroup SchedulerControl - */ -void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
BaseType_t xTaskResumeAll( void );
- * - * Resumes scheduler activity after it was suspended by a call to - * vTaskSuspendAll(). - * - * xTaskResumeAll() only resumes the scheduler. It does not unsuspend tasks - * that were previously suspended by a call to vTaskSuspend(). - * - * @return If resuming the scheduler caused a context switch then pdTRUE is - * returned, otherwise pdFALSE is returned. - * - * Example usage: -
- void vTask1( void * pvParameters )
- {
-	 for( ;; )
-	 {
-		 // Task code goes here.
-
-		 // ...
-
-		 // At some point the task wants to perform a long operation during
-		 // which it does not want to get swapped out.  It cannot use
-		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
-		 // operation may cause interrupts to be missed - including the
-		 // ticks.
-
-		 // Prevent the real time kernel swapping out the task.
-		 vTaskSuspendAll ();
-
-		 // Perform the operation here.  There is no need to use critical
-		 // sections as we have all the microcontroller processing time.
-		 // During this time interrupts will still operate and the real
-		 // time kernel tick count will be maintained.
-
-		 // ...
-
-		 // The operation is complete.  Restart the kernel.  We want to force
-		 // a context switch - but there is no point if resuming the scheduler
-		 // caused a context switch already.
-		 if( !xTaskResumeAll () )
-		 {
-			  taskYIELD ();
-		 }
-	 }
- }
-   
- * \defgroup xTaskResumeAll xTaskResumeAll - * \ingroup SchedulerControl - */ -BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION; - -/*----------------------------------------------------------- - * TASK UTILITIES - *----------------------------------------------------------*/ - -/** - * task. h - *
TickType_t xTaskGetTickCount( void );
- * - * @return The count of ticks since vTaskStartScheduler was called. - * - * \defgroup xTaskGetTickCount xTaskGetTickCount - * \ingroup TaskUtils - */ -TickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
TickType_t xTaskGetTickCountFromISR( void );
- * - * @return The count of ticks since vTaskStartScheduler was called. - * - * This is a version of xTaskGetTickCount() that is safe to be called from an - * ISR - provided that TickType_t is the natural word size of the - * microcontroller being used or interrupt nesting is either not supported or - * not being used. - * - * \defgroup xTaskGetTickCountFromISR xTaskGetTickCountFromISR - * \ingroup TaskUtils - */ -TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
uint16_t uxTaskGetNumberOfTasks( void );
- * - * @return The number of tasks that the real time kernel is currently managing. - * This includes all ready, blocked and suspended tasks. A task that - * has been deleted but not yet freed by the idle task will also be - * included in the count. - * - * \defgroup uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks - * \ingroup TaskUtils - */ -UBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
char *pcTaskGetName( TaskHandle_t xTaskToQuery );
- * - * @return The text (human readable) name of the task referenced by the handle - * xTaskToQuery. A task can query its own name by either passing in its own - * handle, or by setting xTaskToQuery to NULL. - * - * \defgroup pcTaskGetName pcTaskGetName - * \ingroup TaskUtils - */ -char *pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - -/** - * task. h - *
TaskHandle_t xTaskGetHandle( const char *pcNameToQuery );
- * - * NOTE: This function takes a relatively long time to complete and should be - * used sparingly. - * - * @return The handle of the task that has the human readable name pcNameToQuery. - * NULL is returned if no matching name is found. INCLUDE_xTaskGetHandle - * must be set to 1 in FreeRTOSConfig.h for pcTaskGetHandle() to be available. - * - * \defgroup pcTaskGetHandle pcTaskGetHandle - * \ingroup TaskUtils - */ -TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - -/** - * task.h - *
UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );
- * - * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for - * this function to be available. - * - * Returns the high water mark of the stack associated with xTask. That is, - * the minimum free stack space there has been (in words, so on a 32 bit machine - * a value of 1 means 4 bytes) since the task started. The smaller the returned - * number the closer the task has come to overflowing its stack. - * - * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the - * same except for their return type. Using configSTACK_DEPTH_TYPE allows the - * user to determine the return type. It gets around the problem of the value - * overflowing on 8-bit types without breaking backward compatibility for - * applications that expect an 8-bit return type. - * - * @param xTask Handle of the task associated with the stack to be checked. - * Set xTask to NULL to check the stack of the calling task. - * - * @return The smallest amount of free stack space there has been (in words, so - * actual spaces on the stack rather than bytes) since the task referenced by - * xTask was created. - */ -UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - -/** - * task.h - *
configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask );
- * - * INCLUDE_uxTaskGetStackHighWaterMark2 must be set to 1 in FreeRTOSConfig.h for - * this function to be available. - * - * Returns the high water mark of the stack associated with xTask. That is, - * the minimum free stack space there has been (in words, so on a 32 bit machine - * a value of 1 means 4 bytes) since the task started. The smaller the returned - * number the closer the task has come to overflowing its stack. - * - * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the - * same except for their return type. Using configSTACK_DEPTH_TYPE allows the - * user to determine the return type. It gets around the problem of the value - * overflowing on 8-bit types without breaking backward compatibility for - * applications that expect an 8-bit return type. - * - * @param xTask Handle of the task associated with the stack to be checked. - * Set xTask to NULL to check the stack of the calling task. - * - * @return The smallest amount of free stack space there has been (in words, so - * actual spaces on the stack rather than bytes) since the task referenced by - * xTask was created. - */ -configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - -/* When using trace macros it is sometimes necessary to include task.h before -FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined, -so the following two prototypes will cause a compilation error. This can be -fixed by simply guarding against the inclusion of these two prototypes unless -they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration -constant. */ -#ifdef configUSE_APPLICATION_TASK_TAG - #if configUSE_APPLICATION_TASK_TAG == 1 - /** - * task.h - *
void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction );
- * - * Sets pxHookFunction to be the task hook function used by the task xTask. - * Passing xTask as NULL has the effect of setting the calling tasks hook - * function. - */ - void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) PRIVILEGED_FUNCTION; - - /** - * task.h - *
void xTaskGetApplicationTaskTag( TaskHandle_t xTask );
- * - * Returns the pxHookFunction value assigned to the task xTask. Do not - * call from an interrupt service routine - call - * xTaskGetApplicationTaskTagFromISR() instead. - */ - TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - - /** - * task.h - *
void xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask );
- * - * Returns the pxHookFunction value assigned to the task xTask. Can - * be called from an interrupt service routine. - */ - TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ -#endif /* ifdef configUSE_APPLICATION_TASK_TAG */ - -#if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) - - /* Each task contains an array of pointers that is dimensioned by the - configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. The - kernel does not use the pointers itself, so the application writer can use - the pointers for any purpose they wish. The following two functions are - used to set and query a pointer respectively. */ - void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) PRIVILEGED_FUNCTION; - void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) PRIVILEGED_FUNCTION; - -#endif - -/** - * task.h - *
BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter );
- * - * Calls the hook function associated with xTask. Passing xTask as NULL has - * the effect of calling the Running tasks (the calling task) hook function. - * - * pvParameter is passed to the hook function for the task to interpret as it - * wants. The return value is the value returned by the task hook function - * registered by the user. - */ -BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) PRIVILEGED_FUNCTION; - -/** - * xTaskGetIdleTaskHandle() is only available if - * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h. - * - * Simply returns the handle of the idle task. It is not valid to call - * xTaskGetIdleTaskHandle() before the scheduler has been started. - */ -TaskHandle_t xTaskGetIdleTaskHandle( void ) PRIVILEGED_FUNCTION; - -/** - * configUSE_TRACE_FACILITY must be defined as 1 in FreeRTOSConfig.h for - * uxTaskGetSystemState() to be available. - * - * uxTaskGetSystemState() populates an TaskStatus_t structure for each task in - * the system. TaskStatus_t structures contain, among other things, members - * for the task handle, task name, task priority, task state, and total amount - * of run time consumed by the task. See the TaskStatus_t structure - * definition in this file for the full member list. - * - * NOTE: This function is intended for debugging use only as its use results in - * the scheduler remaining suspended for an extended period. - * - * @param pxTaskStatusArray A pointer to an array of TaskStatus_t structures. - * The array must contain at least one TaskStatus_t structure for each task - * that is under the control of the RTOS. The number of tasks under the control - * of the RTOS can be determined using the uxTaskGetNumberOfTasks() API function. - * - * @param uxArraySize The size of the array pointed to by the pxTaskStatusArray - * parameter. The size is specified as the number of indexes in the array, or - * the number of TaskStatus_t structures contained in the array, not by the - * number of bytes in the array. - * - * @param pulTotalRunTime If configGENERATE_RUN_TIME_STATS is set to 1 in - * FreeRTOSConfig.h then *pulTotalRunTime is set by uxTaskGetSystemState() to the - * total run time (as defined by the run time stats clock, see - * http://www.freertos.org/rtos-run-time-stats.html) since the target booted. - * pulTotalRunTime can be set to NULL to omit the total run time information. - * - * @return The number of TaskStatus_t structures that were populated by - * uxTaskGetSystemState(). This should equal the number returned by the - * uxTaskGetNumberOfTasks() API function, but will be zero if the value passed - * in the uxArraySize parameter was too small. - * - * Example usage: -
-    // This example demonstrates how a human readable table of run time stats
-	// information is generated from raw data provided by uxTaskGetSystemState().
-	// The human readable table is written to pcWriteBuffer
-	void vTaskGetRunTimeStats( char *pcWriteBuffer )
-	{
-	TaskStatus_t *pxTaskStatusArray;
-	volatile UBaseType_t uxArraySize, x;
-	uint32_t ulTotalRunTime, ulStatsAsPercentage;
-
-		// Make sure the write buffer does not contain a string.
-		*pcWriteBuffer = 0x00;
-
-		// Take a snapshot of the number of tasks in case it changes while this
-		// function is executing.
-		uxArraySize = uxTaskGetNumberOfTasks();
-
-		// Allocate a TaskStatus_t structure for each task.  An array could be
-		// allocated statically at compile time.
-		pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) );
-
-		if( pxTaskStatusArray != NULL )
-		{
-			// Generate raw status information about each task.
-			uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime );
-
-			// For percentage calculations.
-			ulTotalRunTime /= 100UL;
-
-			// Avoid divide by zero errors.
-			if( ulTotalRunTime > 0 )
-			{
-				// For each populated position in the pxTaskStatusArray array,
-				// format the raw data as human readable ASCII data
-				for( x = 0; x < uxArraySize; x++ )
-				{
-					// What percentage of the total run time has the task used?
-					// This will always be rounded down to the nearest integer.
-					// ulTotalRunTimeDiv100 has already been divided by 100.
-					ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime;
-
-					if( ulStatsAsPercentage > 0UL )
-					{
-						sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage );
-					}
-					else
-					{
-						// If the percentage is zero here then the task has
-						// consumed less than 1% of the total run time.
-						sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter );
-					}
-
-					pcWriteBuffer += strlen( ( char * ) pcWriteBuffer );
-				}
-			}
-
-			// The array is no longer needed, free the memory it consumes.
-			vPortFree( pxTaskStatusArray );
-		}
-	}
-	
- */ -UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
void vTaskList( char *pcWriteBuffer );
- * - * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must - * both be defined as 1 for this function to be available. See the - * configuration section of the FreeRTOS.org website for more information. - * - * NOTE 1: This function will disable interrupts for its duration. It is - * not intended for normal application runtime use but as a debug aid. - * - * Lists all the current tasks, along with their current state and stack - * usage high water mark. - * - * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or - * suspended ('S'). - * - * PLEASE NOTE: - * - * This function is provided for convenience only, and is used by many of the - * demo applications. Do not consider it to be part of the scheduler. - * - * vTaskList() calls uxTaskGetSystemState(), then formats part of the - * uxTaskGetSystemState() output into a human readable table that displays task - * names, states and stack usage. - * - * vTaskList() has a dependency on the sprintf() C library function that might - * bloat the code size, use a lot of stack, and provide different results on - * different platforms. An alternative, tiny, third party, and limited - * functionality implementation of sprintf() is provided in many of the - * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note - * printf-stdarg.c does not provide a full snprintf() implementation!). - * - * It is recommended that production systems call uxTaskGetSystemState() - * directly to get access to raw stats data, rather than indirectly through a - * call to vTaskList(). - * - * @param pcWriteBuffer A buffer into which the above mentioned details - * will be written, in ASCII form. This buffer is assumed to be large - * enough to contain the generated report. Approximately 40 bytes per - * task should be sufficient. - * - * \defgroup vTaskList vTaskList - * \ingroup TaskUtils - */ -void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - -/** - * task. h - *
void vTaskGetRunTimeStats( char *pcWriteBuffer );
- * - * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS - * must both be defined as 1 for this function to be available. The application - * must also then provide definitions for - * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() - * to configure a peripheral timer/counter and return the timers current count - * value respectively. The counter should be at least 10 times the frequency of - * the tick count. - * - * NOTE 1: This function will disable interrupts for its duration. It is - * not intended for normal application runtime use but as a debug aid. - * - * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total - * accumulated execution time being stored for each task. The resolution - * of the accumulated time value depends on the frequency of the timer - * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. - * Calling vTaskGetRunTimeStats() writes the total execution time of each - * task into a buffer, both as an absolute count value and as a percentage - * of the total system execution time. - * - * NOTE 2: - * - * This function is provided for convenience only, and is used by many of the - * demo applications. Do not consider it to be part of the scheduler. - * - * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part of the - * uxTaskGetSystemState() output into a human readable table that displays the - * amount of time each task has spent in the Running state in both absolute and - * percentage terms. - * - * vTaskGetRunTimeStats() has a dependency on the sprintf() C library function - * that might bloat the code size, use a lot of stack, and provide different - * results on different platforms. An alternative, tiny, third party, and - * limited functionality implementation of sprintf() is provided in many of the - * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note - * printf-stdarg.c does not provide a full snprintf() implementation!). - * - * It is recommended that production systems call uxTaskGetSystemState() directly - * to get access to raw stats data, rather than indirectly through a call to - * vTaskGetRunTimeStats(). - * - * @param pcWriteBuffer A buffer into which the execution times will be - * written, in ASCII form. This buffer is assumed to be large enough to - * contain the generated report. Approximately 40 bytes per task should - * be sufficient. - * - * \defgroup vTaskGetRunTimeStats vTaskGetRunTimeStats - * \ingroup TaskUtils - */ -void vTaskGetRunTimeStats( char *pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - -/** -* task. h -*
uint32_t ulTaskGetIdleRunTimeCounter( void );
-* -* configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS -* must both be defined as 1 for this function to be available. The application -* must also then provide definitions for -* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() -* to configure a peripheral timer/counter and return the timers current count -* value respectively. The counter should be at least 10 times the frequency of -* the tick count. -* -* Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total -* accumulated execution time being stored for each task. The resolution -* of the accumulated time value depends on the frequency of the timer -* configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. -* While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total -* execution time of each task into a buffer, ulTaskGetIdleRunTimeCounter() -* returns the total execution time of just the idle task. -* -* @return The total run time of the idle task. This is the amount of time the -* idle task has actually been executing. The unit of time is dependent on the -* frequency configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and -* portGET_RUN_TIME_COUNTER_VALUE() macros. -* -* \defgroup ulTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter -* \ingroup TaskUtils -*/ -uint32_t ulTaskGetIdleRunTimeCounter( void ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );
- * - * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this - * function to be available. - * - * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private - * "notification value", which is a 32-bit unsigned integer (uint32_t). - * - * Events can be sent to a task using an intermediary object. Examples of such - * objects are queues, semaphores, mutexes and event groups. Task notifications - * are a method of sending an event directly to a task without the need for such - * an intermediary object. - * - * A notification sent to a task can optionally perform an action, such as - * update, overwrite or increment the task's notification value. In that way - * task notifications can be used to send data to a task, or be used as light - * weight and fast binary or counting semaphores. - * - * A notification sent to a task will remain pending until it is cleared by the - * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was - * already in the Blocked state to wait for a notification when the notification - * arrives then the task will automatically be removed from the Blocked state - * (unblocked) and the notification cleared. - * - * A task can use xTaskNotifyWait() to [optionally] block to wait for a - * notification to be pending, or ulTaskNotifyTake() to [optionally] block - * to wait for its notification value to have a non-zero value. The task does - * not consume any CPU time while it is in the Blocked state. - * - * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. - * - * @param xTaskToNotify The handle of the task being notified. The handle to a - * task can be returned from the xTaskCreate() API function used to create the - * task, and the handle of the currently running task can be obtained by calling - * xTaskGetCurrentTaskHandle(). - * - * @param ulValue Data that can be sent with the notification. How the data is - * used depends on the value of the eAction parameter. - * - * @param eAction Specifies how the notification updates the task's notification - * value, if at all. Valid values for eAction are as follows: - * - * eSetBits - - * The task's notification value is bitwise ORed with ulValue. xTaskNofify() - * always returns pdPASS in this case. - * - * eIncrement - - * The task's notification value is incremented. ulValue is not used and - * xTaskNotify() always returns pdPASS in this case. - * - * eSetValueWithOverwrite - - * The task's notification value is set to the value of ulValue, even if the - * task being notified had not yet processed the previous notification (the - * task already had a notification pending). xTaskNotify() always returns - * pdPASS in this case. - * - * eSetValueWithoutOverwrite - - * If the task being notified did not already have a notification pending then - * the task's notification value is set to ulValue and xTaskNotify() will - * return pdPASS. If the task being notified already had a notification - * pending then no action is performed and pdFAIL is returned. - * - * eNoAction - - * The task receives a notification without its notification value being - * updated. ulValue is not used and xTaskNotify() always returns pdPASS in - * this case. - * - * pulPreviousNotificationValue - - * Can be used to pass out the subject task's notification value before any - * bits are modified by the notify function. - * - * @return Dependent on the value of eAction. See the description of the - * eAction parameter. - * - * \defgroup xTaskNotify xTaskNotify - * \ingroup TaskNotifications - */ -BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) PRIVILEGED_FUNCTION; -#define xTaskNotify( xTaskToNotify, ulValue, eAction ) xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL ) -#define xTaskNotifyAndQuery( xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue ) xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) ) - -/** - * task. h - *
BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken );
- * - * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this - * function to be available. - * - * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private - * "notification value", which is a 32-bit unsigned integer (uint32_t). - * - * A version of xTaskNotify() that can be used from an interrupt service routine - * (ISR). - * - * Events can be sent to a task using an intermediary object. Examples of such - * objects are queues, semaphores, mutexes and event groups. Task notifications - * are a method of sending an event directly to a task without the need for such - * an intermediary object. - * - * A notification sent to a task can optionally perform an action, such as - * update, overwrite or increment the task's notification value. In that way - * task notifications can be used to send data to a task, or be used as light - * weight and fast binary or counting semaphores. - * - * A notification sent to a task will remain pending until it is cleared by the - * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was - * already in the Blocked state to wait for a notification when the notification - * arrives then the task will automatically be removed from the Blocked state - * (unblocked) and the notification cleared. - * - * A task can use xTaskNotifyWait() to [optionally] block to wait for a - * notification to be pending, or ulTaskNotifyTake() to [optionally] block - * to wait for its notification value to have a non-zero value. The task does - * not consume any CPU time while it is in the Blocked state. - * - * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. - * - * @param xTaskToNotify The handle of the task being notified. The handle to a - * task can be returned from the xTaskCreate() API function used to create the - * task, and the handle of the currently running task can be obtained by calling - * xTaskGetCurrentTaskHandle(). - * - * @param ulValue Data that can be sent with the notification. How the data is - * used depends on the value of the eAction parameter. - * - * @param eAction Specifies how the notification updates the task's notification - * value, if at all. Valid values for eAction are as follows: - * - * eSetBits - - * The task's notification value is bitwise ORed with ulValue. xTaskNofify() - * always returns pdPASS in this case. - * - * eIncrement - - * The task's notification value is incremented. ulValue is not used and - * xTaskNotify() always returns pdPASS in this case. - * - * eSetValueWithOverwrite - - * The task's notification value is set to the value of ulValue, even if the - * task being notified had not yet processed the previous notification (the - * task already had a notification pending). xTaskNotify() always returns - * pdPASS in this case. - * - * eSetValueWithoutOverwrite - - * If the task being notified did not already have a notification pending then - * the task's notification value is set to ulValue and xTaskNotify() will - * return pdPASS. If the task being notified already had a notification - * pending then no action is performed and pdFAIL is returned. - * - * eNoAction - - * The task receives a notification without its notification value being - * updated. ulValue is not used and xTaskNotify() always returns pdPASS in - * this case. - * - * @param pxHigherPriorityTaskWoken xTaskNotifyFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the - * task to which the notification was sent to leave the Blocked state, and the - * unblocked task has a priority higher than the currently running task. If - * xTaskNotifyFromISR() sets this value to pdTRUE then a context switch should - * be requested before the interrupt is exited. How a context switch is - * requested from an ISR is dependent on the port - see the documentation page - * for the port in use. - * - * @return Dependent on the value of eAction. See the description of the - * eAction parameter. - * - * \defgroup xTaskNotify xTaskNotify - * \ingroup TaskNotifications - */ -BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; -#define xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) ) -#define xTaskNotifyAndQueryFromISR( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) ) - -/** - * task. h - *
BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait );
- * - * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this - * function to be available. - * - * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private - * "notification value", which is a 32-bit unsigned integer (uint32_t). - * - * Events can be sent to a task using an intermediary object. Examples of such - * objects are queues, semaphores, mutexes and event groups. Task notifications - * are a method of sending an event directly to a task without the need for such - * an intermediary object. - * - * A notification sent to a task can optionally perform an action, such as - * update, overwrite or increment the task's notification value. In that way - * task notifications can be used to send data to a task, or be used as light - * weight and fast binary or counting semaphores. - * - * A notification sent to a task will remain pending until it is cleared by the - * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was - * already in the Blocked state to wait for a notification when the notification - * arrives then the task will automatically be removed from the Blocked state - * (unblocked) and the notification cleared. - * - * A task can use xTaskNotifyWait() to [optionally] block to wait for a - * notification to be pending, or ulTaskNotifyTake() to [optionally] block - * to wait for its notification value to have a non-zero value. The task does - * not consume any CPU time while it is in the Blocked state. - * - * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. - * - * @param ulBitsToClearOnEntry Bits that are set in ulBitsToClearOnEntry value - * will be cleared in the calling task's notification value before the task - * checks to see if any notifications are pending, and optionally blocks if no - * notifications are pending. Setting ulBitsToClearOnEntry to ULONG_MAX (if - * limits.h is included) or 0xffffffffUL (if limits.h is not included) will have - * the effect of resetting the task's notification value to 0. Setting - * ulBitsToClearOnEntry to 0 will leave the task's notification value unchanged. - * - * @param ulBitsToClearOnExit If a notification is pending or received before - * the calling task exits the xTaskNotifyWait() function then the task's - * notification value (see the xTaskNotify() API function) is passed out using - * the pulNotificationValue parameter. Then any bits that are set in - * ulBitsToClearOnExit will be cleared in the task's notification value (note - * *pulNotificationValue is set before any bits are cleared). Setting - * ulBitsToClearOnExit to ULONG_MAX (if limits.h is included) or 0xffffffffUL - * (if limits.h is not included) will have the effect of resetting the task's - * notification value to 0 before the function exits. Setting - * ulBitsToClearOnExit to 0 will leave the task's notification value unchanged - * when the function exits (in which case the value passed out in - * pulNotificationValue will match the task's notification value). - * - * @param pulNotificationValue Used to pass the task's notification value out - * of the function. Note the value passed out will not be effected by the - * clearing of any bits caused by ulBitsToClearOnExit being non-zero. - * - * @param xTicksToWait The maximum amount of time that the task should wait in - * the Blocked state for a notification to be received, should a notification - * not already be pending when xTaskNotifyWait() was called. The task - * will not consume any processing time while it is in the Blocked state. This - * is specified in kernel ticks, the macro pdMS_TO_TICSK( value_in_ms ) can be - * used to convert a time specified in milliseconds to a time specified in - * ticks. - * - * @return If a notification was received (including notifications that were - * already pending when xTaskNotifyWait was called) then pdPASS is - * returned. Otherwise pdFAIL is returned. - * - * \defgroup xTaskNotifyWait xTaskNotifyWait - * \ingroup TaskNotifications - */ -BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
- * - * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro - * to be available. - * - * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private - * "notification value", which is a 32-bit unsigned integer (uint32_t). - * - * Events can be sent to a task using an intermediary object. Examples of such - * objects are queues, semaphores, mutexes and event groups. Task notifications - * are a method of sending an event directly to a task without the need for such - * an intermediary object. - * - * A notification sent to a task can optionally perform an action, such as - * update, overwrite or increment the task's notification value. In that way - * task notifications can be used to send data to a task, or be used as light - * weight and fast binary or counting semaphores. - * - * xTaskNotifyGive() is a helper macro intended for use when task notifications - * are used as light weight and faster binary or counting semaphore equivalents. - * Actual FreeRTOS semaphores are given using the xSemaphoreGive() API function, - * the equivalent action that instead uses a task notification is - * xTaskNotifyGive(). - * - * When task notifications are being used as a binary or counting semaphore - * equivalent then the task being notified should wait for the notification - * using the ulTaskNotificationTake() API function rather than the - * xTaskNotifyWait() API function. - * - * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details. - * - * @param xTaskToNotify The handle of the task being notified. The handle to a - * task can be returned from the xTaskCreate() API function used to create the - * task, and the handle of the currently running task can be obtained by calling - * xTaskGetCurrentTaskHandle(). - * - * @return xTaskNotifyGive() is a macro that calls xTaskNotify() with the - * eAction parameter set to eIncrement - so pdPASS is always returned. - * - * \defgroup xTaskNotifyGive xTaskNotifyGive - * \ingroup TaskNotifications - */ -#define xTaskNotifyGive( xTaskToNotify ) xTaskGenericNotify( ( xTaskToNotify ), ( 0 ), eIncrement, NULL ) - -/** - * task. h - *
void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken );
- *
- * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro
- * to be available.
- *
- * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private
- * "notification value", which is a 32-bit unsigned integer (uint32_t).
- *
- * A version of xTaskNotifyGive() that can be called from an interrupt service
- * routine (ISR).
- *
- * Events can be sent to a task using an intermediary object.  Examples of such
- * objects are queues, semaphores, mutexes and event groups.  Task notifications
- * are a method of sending an event directly to a task without the need for such
- * an intermediary object.
- *
- * A notification sent to a task can optionally perform an action, such as
- * update, overwrite or increment the task's notification value.  In that way
- * task notifications can be used to send data to a task, or be used as light
- * weight and fast binary or counting semaphores.
- *
- * vTaskNotifyGiveFromISR() is intended for use when task notifications are
- * used as light weight and faster binary or counting semaphore equivalents.
- * Actual FreeRTOS semaphores are given from an ISR using the
- * xSemaphoreGiveFromISR() API function, the equivalent action that instead uses
- * a task notification is vTaskNotifyGiveFromISR().
- *
- * When task notifications are being used as a binary or counting semaphore
- * equivalent then the task being notified should wait for the notification
- * using the ulTaskNotificationTake() API function rather than the
- * xTaskNotifyWait() API function.
- *
- * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details.
- *
- * @param xTaskToNotify The handle of the task being notified.  The handle to a
- * task can be returned from the xTaskCreate() API function used to create the
- * task, and the handle of the currently running task can be obtained by calling
- * xTaskGetCurrentTaskHandle().
- *
- * @param pxHigherPriorityTaskWoken  vTaskNotifyGiveFromISR() will set
- * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the
- * task to which the notification was sent to leave the Blocked state, and the
- * unblocked task has a priority higher than the currently running task.  If
- * vTaskNotifyGiveFromISR() sets this value to pdTRUE then a context switch
- * should be requested before the interrupt is exited.  How a context switch is
- * requested from an ISR is dependent on the port - see the documentation page
- * for the port in use.
- *
- * \defgroup xTaskNotifyWait xTaskNotifyWait
- * \ingroup TaskNotifications
- */
-void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
-
-/**
- * task. h
- * 
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
- * - * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this - * function to be available. - * - * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private - * "notification value", which is a 32-bit unsigned integer (uint32_t). - * - * Events can be sent to a task using an intermediary object. Examples of such - * objects are queues, semaphores, mutexes and event groups. Task notifications - * are a method of sending an event directly to a task without the need for such - * an intermediary object. - * - * A notification sent to a task can optionally perform an action, such as - * update, overwrite or increment the task's notification value. In that way - * task notifications can be used to send data to a task, or be used as light - * weight and fast binary or counting semaphores. - * - * ulTaskNotifyTake() is intended for use when a task notification is used as a - * faster and lighter weight binary or counting semaphore alternative. Actual - * FreeRTOS semaphores are taken using the xSemaphoreTake() API function, the - * equivalent action that instead uses a task notification is - * ulTaskNotifyTake(). - * - * When a task is using its notification value as a binary or counting semaphore - * other tasks should send notifications to it using the xTaskNotifyGive() - * macro, or xTaskNotify() function with the eAction parameter set to - * eIncrement. - * - * ulTaskNotifyTake() can either clear the task's notification value to - * zero on exit, in which case the notification value acts like a binary - * semaphore, or decrement the task's notification value on exit, in which case - * the notification value acts like a counting semaphore. - * - * A task can use ulTaskNotifyTake() to [optionally] block to wait for a - * the task's notification value to be non-zero. The task does not consume any - * CPU time while it is in the Blocked state. - * - * Where as xTaskNotifyWait() will return when a notification is pending, - * ulTaskNotifyTake() will return when the task's notification value is - * not zero. - * - * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. - * - * @param xClearCountOnExit if xClearCountOnExit is pdFALSE then the task's - * notification value is decremented when the function exits. In this way the - * notification value acts like a counting semaphore. If xClearCountOnExit is - * not pdFALSE then the task's notification value is cleared to zero when the - * function exits. In this way the notification value acts like a binary - * semaphore. - * - * @param xTicksToWait The maximum amount of time that the task should wait in - * the Blocked state for the task's notification value to be greater than zero, - * should the count not already be greater than zero when - * ulTaskNotifyTake() was called. The task will not consume any processing - * time while it is in the Blocked state. This is specified in kernel ticks, - * the macro pdMS_TO_TICSK( value_in_ms ) can be used to convert a time - * specified in milliseconds to a time specified in ticks. - * - * @return The task's notification count before it is either cleared to zero or - * decremented (see the xClearCountOnExit parameter). - * - * \defgroup ulTaskNotifyTake ulTaskNotifyTake - * \ingroup TaskNotifications - */ -uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask );
- * - * If the notification state of the task referenced by the handle xTask is - * eNotified, then set the task's notification state to eNotWaitingNotification. - * The task's notification value is not altered. Set xTask to NULL to clear the - * notification state of the calling task. - * - * @return pdTRUE if the task's notification state was set to - * eNotWaitingNotification, otherwise pdFALSE. - * \defgroup xTaskNotifyStateClear xTaskNotifyStateClear - * \ingroup TaskNotifications - */ -BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ); - -/** -* task. h -*
uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear );
-* -* Clears the bits specified by the ulBitsToClear bit mask in the notification -* value of the task referenced by xTask. -* -* Set ulBitsToClear to 0xffffffff (UINT_MAX on 32-bit architectures) to clear -* the notification value to 0. Set ulBitsToClear to 0 to query the task's -* notification value without clearing any bits. -* -* @return The value of the target task's notification value before the bits -* specified by ulBitsToClear were cleared. -* \defgroup ulTaskNotifyValueClear ulTaskNotifyValueClear -* \ingroup TaskNotifications -*/ -uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; - -/** - * task.h - *
void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut )
- * - * Capture the current time for future use with xTaskCheckForTimeOut(). - * - * @param pxTimeOut Pointer to a timeout object into which the current time - * is to be captured. The captured time includes the tick count and the number - * of times the tick count has overflowed since the system first booted. - * \defgroup vTaskSetTimeOutState vTaskSetTimeOutState - * \ingroup TaskCtrl - */ -void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; - -/** - * task.h - *
BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait );
- * - * Determines if pxTicksToWait ticks has passed since a time was captured - * using a call to vTaskSetTimeOutState(). The captured time includes the tick - * count and the number of times the tick count has overflowed. - * - * @param pxTimeOut The time status as captured previously using - * vTaskSetTimeOutState. If the timeout has not yet occurred, it is updated - * to reflect the current time status. - * @param pxTicksToWait The number of ticks to check for timeout i.e. if - * pxTicksToWait ticks have passed since pxTimeOut was last updated (either by - * vTaskSetTimeOutState() or xTaskCheckForTimeOut()), the timeout has occurred. - * If the timeout has not occurred, pxTIcksToWait is updated to reflect the - * number of remaining ticks. - * - * @return If timeout has occurred, pdTRUE is returned. Otherwise pdFALSE is - * returned and pxTicksToWait is updated to reflect the number of remaining - * ticks. - * - * @see https://www.freertos.org/xTaskCheckForTimeOut.html - * - * Example Usage: - *
-	// Driver library function used to receive uxWantedBytes from an Rx buffer
-	// that is filled by a UART interrupt. If there are not enough bytes in the
-	// Rx buffer then the task enters the Blocked state until it is notified that
-	// more data has been placed into the buffer. If there is still not enough
-	// data then the task re-enters the Blocked state, and xTaskCheckForTimeOut()
-	// is used to re-calculate the Block time to ensure the total amount of time
-	// spent in the Blocked state does not exceed MAX_TIME_TO_WAIT. This
-	// continues until either the buffer contains at least uxWantedBytes bytes,
-	// or the total amount of time spent in the Blocked state reaches
-	// MAX_TIME_TO_WAIT – at which point the task reads however many bytes are
-	// available up to a maximum of uxWantedBytes.
-
-	size_t xUART_Receive( uint8_t *pucBuffer, size_t uxWantedBytes )
-	{
-	size_t uxReceived = 0;
-	TickType_t xTicksToWait = MAX_TIME_TO_WAIT;
-	TimeOut_t xTimeOut;
-
-		// Initialize xTimeOut.  This records the time at which this function
-		// was entered.
-		vTaskSetTimeOutState( &xTimeOut );
-
-		// Loop until the buffer contains the wanted number of bytes, or a
-		// timeout occurs.
-		while( UART_bytes_in_rx_buffer( pxUARTInstance ) < uxWantedBytes )
-		{
-			// The buffer didn't contain enough data so this task is going to
-			// enter the Blocked state. Adjusting xTicksToWait to account for
-			// any time that has been spent in the Blocked state within this
-			// function so far to ensure the total amount of time spent in the
-			// Blocked state does not exceed MAX_TIME_TO_WAIT.
-			if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) != pdFALSE )
-			{
-				//Timed out before the wanted number of bytes were available,
-				// exit the loop.
-				break;
-			}
-
-			// Wait for a maximum of xTicksToWait ticks to be notified that the
-			// receive interrupt has placed more data into the buffer.
-			ulTaskNotifyTake( pdTRUE, xTicksToWait );
-		}
-
-		// Attempt to read uxWantedBytes from the receive buffer into pucBuffer.
-		// The actual number of bytes read (which might be less than
-		// uxWantedBytes) is returned.
-		uxReceived = UART_read_from_receive_buffer( pxUARTInstance,
-													pucBuffer,
-													uxWantedBytes );
-
-		return uxReceived;
-	}
- 
- * \defgroup xTaskCheckForTimeOut xTaskCheckForTimeOut - * \ingroup TaskCtrl - */ -BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION; - -/*----------------------------------------------------------- - * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES - *----------------------------------------------------------*/ - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY - * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS - * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * Called from the real time kernel tick (either preemptive or cooperative), - * this increments the tick count and checks if any tasks that are blocked - * for a finite period required removing from a blocked list and placing on - * a ready list. If a non-zero value is returned then a context switch is - * required because either: - * + A task was removed from a blocked list because its timeout had expired, - * or - * + Time slicing is in use and there is a task of equal priority to the - * currently running task. - */ -BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION; - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN - * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. - * - * Removes the calling task from the ready list and places it both - * on the list of tasks waiting for a particular event, and the - * list of delayed tasks. The task will be removed from both lists - * and replaced on the ready list should either the event occur (and - * there be no higher priority tasks waiting on the same event) or - * the delay period expires. - * - * The 'unordered' version replaces the event list item value with the - * xItemValue value, and inserts the list item at the end of the list. - * - * The 'ordered' version uses the existing event list item value (which is the - * owning tasks priority) to insert the list item into the event list is task - * priority order. - * - * @param pxEventList The list containing tasks that are blocked waiting - * for the event to occur. - * - * @param xItemValue The item value to use for the event list item when the - * event list is not ordered by task priority. - * - * @param xTicksToWait The maximum amount of time that the task should wait - * for the event to occur. This is specified in kernel ticks,the constant - * portTICK_PERIOD_MS can be used to convert kernel ticks into a real time - * period. - */ -void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN - * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. - * - * This function performs nearly the same function as vTaskPlaceOnEventList(). - * The difference being that this function does not permit tasks to block - * indefinitely, whereas vTaskPlaceOnEventList() does. - * - */ -void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN - * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. - * - * Removes a task from both the specified event list and the list of blocked - * tasks, and places it on a ready queue. - * - * xTaskRemoveFromEventList()/vTaskRemoveFromUnorderedEventList() will be called - * if either an event occurs to unblock a task, or the block timeout period - * expires. - * - * xTaskRemoveFromEventList() is used when the event list is in task priority - * order. It removes the list item from the head of the event list as that will - * have the highest priority owning task of all the tasks on the event list. - * vTaskRemoveFromUnorderedEventList() is used when the event list is not - * ordered and the event list items hold something other than the owning tasks - * priority. In this case the event list item value is updated to the value - * passed in the xItemValue parameter. - * - * @return pdTRUE if the task being removed has a higher priority than the task - * making the call, otherwise pdFALSE. - */ -BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) PRIVILEGED_FUNCTION; -void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const TickType_t xItemValue ) PRIVILEGED_FUNCTION; - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY - * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS - * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * Sets the pointer to the current TCB to the TCB of the highest priority task - * that is ready to run. - */ -portDONT_DISCARD void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; - -/* - * THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE. THEY ARE USED BY - * THE EVENT BITS MODULE. - */ -TickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION; - -/* - * Return the handle of the calling task. - */ -TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; - -/* - * Shortcut used by the queue implementation to prevent unnecessary call to - * taskYIELD(); - */ -void vTaskMissedYield( void ) PRIVILEGED_FUNCTION; - -/* - * Returns the scheduler state as taskSCHEDULER_RUNNING, - * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. - */ -BaseType_t xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION; - -/* - * Raises the priority of the mutex holder to that of the calling task should - * the mutex holder have a priority less than the calling task. - */ -BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; - -/* - * Set the priority of a task back to its proper priority in the case that it - * inherited a higher priority while it was holding a semaphore. - */ -BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; - -/* - * If a higher priority task attempting to obtain a mutex caused a lower - * priority task to inherit the higher priority task's priority - but the higher - * priority task then timed out without obtaining the mutex, then the lower - * priority task will disinherit the priority again - but only down as far as - * the highest priority task that is still waiting for the mutex (if there were - * more than one task waiting for the mutex). - */ -void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBaseType_t uxHighestPriorityWaitingTask ) PRIVILEGED_FUNCTION; - -/* - * Get the uxTCBNumber assigned to the task referenced by the xTask parameter. - */ -UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - -/* - * Set the uxTaskNumber of the task referenced by the xTask parameter to - * uxHandle. - */ -void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) PRIVILEGED_FUNCTION; - -/* - * Only available when configUSE_TICKLESS_IDLE is set to 1. - * If tickless mode is being used, or a low power mode is implemented, then - * the tick interrupt will not execute during idle periods. When this is the - * case, the tick count value maintained by the scheduler needs to be kept up - * to date with the actual execution time by being skipped forward by a time - * equal to the idle period. - */ -void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; - -/* Correct the tick count value after the application code has held -interrupts disabled for an extended period. xTicksToCatchUp is the number -of tick interrupts that have been missed due to interrupts being disabled. -Its value is not computed automatically, so must be computed by the -application writer. - -This function is similar to vTaskStepTick(), however, unlike -vTaskStepTick(), xTaskCatchUpTicks() may move the tick count forward past a -time at which a task should be removed from the blocked state. That means -tasks may have to be removed from the blocked state as the tick count is -moved. */ -BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) PRIVILEGED_FUNCTION; - -/* - * Only available when configUSE_TICKLESS_IDLE is set to 1. - * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port - * specific sleep function to determine if it is ok to proceed with the sleep, - * and if it is ok to proceed, if it is ok to sleep indefinitely. - * - * This function is necessary because portSUPPRESS_TICKS_AND_SLEEP() is only - * called with the scheduler suspended, not from within a critical section. It - * is therefore possible for an interrupt to request a context switch between - * portSUPPRESS_TICKS_AND_SLEEP() and the low power mode actually being - * entered. eTaskConfirmSleepModeStatus() should be called from a short - * critical section between the timer being stopped and the sleep mode being - * entered to ensure it is ok to proceed into the sleep mode. - */ -eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; - -/* - * For internal use only. Increment the mutex held count when a mutex is - * taken and return the handle of the task that has taken the mutex. - */ -TaskHandle_t pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION; - -/* - * For internal use only. Same as vTaskSetTimeOutState(), but without a critial - * section. - */ -void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; - - -#ifdef __cplusplus -} -#endif -#endif /* INC_TASK_H */ - - - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h deleted file mode 100644 index 307ea1f..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h +++ /dev/null @@ -1,1309 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - - -#ifndef TIMERS_H -#define TIMERS_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h must appear in source files before include timers.h" -#endif - -/*lint -save -e537 This headers are only multiply included if the application code -happens to also be including task.h. */ -#include "task.h" -/*lint -restore */ - -#ifdef __cplusplus -extern "C" { -#endif - -/*----------------------------------------------------------- - * MACROS AND DEFINITIONS - *----------------------------------------------------------*/ - -/* IDs for commands that can be sent/received on the timer queue. These are to -be used solely through the macros that make up the public software timer API, -as defined below. The commands that are sent from interrupts must use the -highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task -or interrupt version of the queue send function should be used. */ -#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 ) -#define tmrCOMMAND_EXECUTE_CALLBACK ( ( BaseType_t ) -1 ) -#define tmrCOMMAND_START_DONT_TRACE ( ( BaseType_t ) 0 ) -#define tmrCOMMAND_START ( ( BaseType_t ) 1 ) -#define tmrCOMMAND_RESET ( ( BaseType_t ) 2 ) -#define tmrCOMMAND_STOP ( ( BaseType_t ) 3 ) -#define tmrCOMMAND_CHANGE_PERIOD ( ( BaseType_t ) 4 ) -#define tmrCOMMAND_DELETE ( ( BaseType_t ) 5 ) - -#define tmrFIRST_FROM_ISR_COMMAND ( ( BaseType_t ) 6 ) -#define tmrCOMMAND_START_FROM_ISR ( ( BaseType_t ) 6 ) -#define tmrCOMMAND_RESET_FROM_ISR ( ( BaseType_t ) 7 ) -#define tmrCOMMAND_STOP_FROM_ISR ( ( BaseType_t ) 8 ) -#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR ( ( BaseType_t ) 9 ) - - -/** - * Type by which software timers are referenced. For example, a call to - * xTimerCreate() returns an TimerHandle_t variable that can then be used to - * reference the subject timer in calls to other software timer API functions - * (for example, xTimerStart(), xTimerReset(), etc.). - */ -struct tmrTimerControl; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ -typedef struct tmrTimerControl * TimerHandle_t; - -/* - * Defines the prototype to which timer callback functions must conform. - */ -typedef void (*TimerCallbackFunction_t)( TimerHandle_t xTimer ); - -/* - * Defines the prototype to which functions used with the - * xTimerPendFunctionCallFromISR() function must conform. - */ -typedef void (*PendedFunction_t)( void *, uint32_t ); - -/** - * TimerHandle_t xTimerCreate( const char * const pcTimerName, - * TickType_t xTimerPeriodInTicks, - * UBaseType_t uxAutoReload, - * void * pvTimerID, - * TimerCallbackFunction_t pxCallbackFunction ); - * - * Creates a new software timer instance, and returns a handle by which the - * created software timer can be referenced. - * - * Internally, within the FreeRTOS implementation, software timers use a block - * of memory, in which the timer data structure is stored. If a software timer - * is created using xTimerCreate() then the required memory is automatically - * dynamically allocated inside the xTimerCreate() function. (see - * http://www.freertos.org/a00111.html). If a software timer is created using - * xTimerCreateStatic() then the application writer must provide the memory that - * will get used by the software timer. xTimerCreateStatic() therefore allows a - * software timer to be created without using any dynamic memory allocation. - * - * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), - * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and - * xTimerChangePeriodFromISR() API functions can all be used to transition a - * timer into the active state. - * - * @param pcTimerName A text name that is assigned to the timer. This is done - * purely to assist debugging. The kernel itself only ever references a timer - * by its handle, and never by its name. - * - * @param xTimerPeriodInTicks The timer period. The time is defined in tick - * periods so the constant portTICK_PERIOD_MS can be used to convert a time that - * has been specified in milliseconds. For example, if the timer must expire - * after 100 ticks, then xTimerPeriodInTicks should be set to 100. - * Alternatively, if the timer must expire after 500ms, then xPeriod can be set - * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or - * equal to 1000. Time timer period must be greater than 0. - * - * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will - * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. - * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and - * enter the dormant state after it expires. - * - * @param pvTimerID An identifier that is assigned to the timer being created. - * Typically this would be used in the timer callback function to identify which - * timer expired when the same callback function is assigned to more than one - * timer. - * - * @param pxCallbackFunction The function to call when the timer expires. - * Callback functions must have the prototype defined by TimerCallbackFunction_t, - * which is "void vCallbackFunction( TimerHandle_t xTimer );". - * - * @return If the timer is successfully created then a handle to the newly - * created timer is returned. If the timer cannot be created because there is - * insufficient FreeRTOS heap remaining to allocate the timer - * structures then NULL is returned. - * - * Example usage: - * @verbatim - * #define NUM_TIMERS 5 - * - * // An array to hold handles to the created timers. - * TimerHandle_t xTimers[ NUM_TIMERS ]; - * - * // An array to hold a count of the number of times each timer expires. - * int32_t lExpireCounters[ NUM_TIMERS ] = { 0 }; - * - * // Define a callback function that will be used by multiple timer instances. - * // The callback function does nothing but count the number of times the - * // associated timer expires, and stop the timer once the timer has expired - * // 10 times. - * void vTimerCallback( TimerHandle_t pxTimer ) - * { - * int32_t lArrayIndex; - * const int32_t xMaxExpiryCountBeforeStopping = 10; - * - * // Optionally do something if the pxTimer parameter is NULL. - * configASSERT( pxTimer ); - * - * // Which timer expired? - * lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer ); - * - * // Increment the number of times that pxTimer has expired. - * lExpireCounters[ lArrayIndex ] += 1; - * - * // If the timer has expired 10 times then stop it from running. - * if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping ) - * { - * // Do not use a block time if calling a timer API function from a - * // timer callback function, as doing so could cause a deadlock! - * xTimerStop( pxTimer, 0 ); - * } - * } - * - * void main( void ) - * { - * int32_t x; - * - * // Create then start some timers. Starting the timers before the scheduler - * // has been started means the timers will start running immediately that - * // the scheduler starts. - * for( x = 0; x < NUM_TIMERS; x++ ) - * { - * xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel. - * ( 100 * x ), // The timer period in ticks. - * pdTRUE, // The timers will auto-reload themselves when they expire. - * ( void * ) x, // Assign each timer a unique id equal to its array index. - * vTimerCallback // Each timer calls the same callback when it expires. - * ); - * - * if( xTimers[ x ] == NULL ) - * { - * // The timer was not created. - * } - * else - * { - * // Start the timer. No block time is specified, and even if one was - * // it would be ignored because the scheduler has not yet been - * // started. - * if( xTimerStart( xTimers[ x ], 0 ) != pdPASS ) - * { - * // The timer could not be set into the Active state. - * } - * } - * } - * - * // ... - * // Create tasks here. - * // ... - * - * // Starting the scheduler will start the timers running as they have already - * // been set into the active state. - * vTaskStartScheduler(); - * - * // Should not reach here. - * for( ;; ); - * } - * @endverbatim - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - TimerHandle_t xTimerCreate( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const TickType_t xTimerPeriodInTicks, - const UBaseType_t uxAutoReload, - void * const pvTimerID, - TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION; -#endif - -/** - * TimerHandle_t xTimerCreateStatic(const char * const pcTimerName, - * TickType_t xTimerPeriodInTicks, - * UBaseType_t uxAutoReload, - * void * pvTimerID, - * TimerCallbackFunction_t pxCallbackFunction, - * StaticTimer_t *pxTimerBuffer ); - * - * Creates a new software timer instance, and returns a handle by which the - * created software timer can be referenced. - * - * Internally, within the FreeRTOS implementation, software timers use a block - * of memory, in which the timer data structure is stored. If a software timer - * is created using xTimerCreate() then the required memory is automatically - * dynamically allocated inside the xTimerCreate() function. (see - * http://www.freertos.org/a00111.html). If a software timer is created using - * xTimerCreateStatic() then the application writer must provide the memory that - * will get used by the software timer. xTimerCreateStatic() therefore allows a - * software timer to be created without using any dynamic memory allocation. - * - * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), - * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and - * xTimerChangePeriodFromISR() API functions can all be used to transition a - * timer into the active state. - * - * @param pcTimerName A text name that is assigned to the timer. This is done - * purely to assist debugging. The kernel itself only ever references a timer - * by its handle, and never by its name. - * - * @param xTimerPeriodInTicks The timer period. The time is defined in tick - * periods so the constant portTICK_PERIOD_MS can be used to convert a time that - * has been specified in milliseconds. For example, if the timer must expire - * after 100 ticks, then xTimerPeriodInTicks should be set to 100. - * Alternatively, if the timer must expire after 500ms, then xPeriod can be set - * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or - * equal to 1000. The timer period must be greater than 0. - * - * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will - * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. - * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and - * enter the dormant state after it expires. - * - * @param pvTimerID An identifier that is assigned to the timer being created. - * Typically this would be used in the timer callback function to identify which - * timer expired when the same callback function is assigned to more than one - * timer. - * - * @param pxCallbackFunction The function to call when the timer expires. - * Callback functions must have the prototype defined by TimerCallbackFunction_t, - * which is "void vCallbackFunction( TimerHandle_t xTimer );". - * - * @param pxTimerBuffer Must point to a variable of type StaticTimer_t, which - * will be then be used to hold the software timer's data structures, removing - * the need for the memory to be allocated dynamically. - * - * @return If the timer is created then a handle to the created timer is - * returned. If pxTimerBuffer was NULL then NULL is returned. - * - * Example usage: - * @verbatim - * - * // The buffer used to hold the software timer's data structure. - * static StaticTimer_t xTimerBuffer; - * - * // A variable that will be incremented by the software timer's callback - * // function. - * UBaseType_t uxVariableToIncrement = 0; - * - * // A software timer callback function that increments a variable passed to - * // it when the software timer was created. After the 5th increment the - * // callback function stops the software timer. - * static void prvTimerCallback( TimerHandle_t xExpiredTimer ) - * { - * UBaseType_t *puxVariableToIncrement; - * BaseType_t xReturned; - * - * // Obtain the address of the variable to increment from the timer ID. - * puxVariableToIncrement = ( UBaseType_t * ) pvTimerGetTimerID( xExpiredTimer ); - * - * // Increment the variable to show the timer callback has executed. - * ( *puxVariableToIncrement )++; - * - * // If this callback has executed the required number of times, stop the - * // timer. - * if( *puxVariableToIncrement == 5 ) - * { - * // This is called from a timer callback so must not block. - * xTimerStop( xExpiredTimer, staticDONT_BLOCK ); - * } - * } - * - * - * void main( void ) - * { - * // Create the software time. xTimerCreateStatic() has an extra parameter - * // than the normal xTimerCreate() API function. The parameter is a pointer - * // to the StaticTimer_t structure that will hold the software timer - * // structure. If the parameter is passed as NULL then the structure will be - * // allocated dynamically, just as if xTimerCreate() had been called. - * xTimer = xTimerCreateStatic( "T1", // Text name for the task. Helps debugging only. Not used by FreeRTOS. - * xTimerPeriod, // The period of the timer in ticks. - * pdTRUE, // This is an auto-reload timer. - * ( void * ) &uxVariableToIncrement, // A variable incremented by the software timer's callback function - * prvTimerCallback, // The function to execute when the timer expires. - * &xTimerBuffer ); // The buffer that will hold the software timer structure. - * - * // The scheduler has not started yet so a block time is not used. - * xReturned = xTimerStart( xTimer, 0 ); - * - * // ... - * // Create tasks here. - * // ... - * - * // Starting the scheduler will start the timers running as they have already - * // been set into the active state. - * vTaskStartScheduler(); - * - * // Should not reach here. - * for( ;; ); - * } - * @endverbatim - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const TickType_t xTimerPeriodInTicks, - const UBaseType_t uxAutoReload, - void * const pvTimerID, - TimerCallbackFunction_t pxCallbackFunction, - StaticTimer_t *pxTimerBuffer ) PRIVILEGED_FUNCTION; -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * void *pvTimerGetTimerID( TimerHandle_t xTimer ); - * - * Returns the ID assigned to the timer. - * - * IDs are assigned to timers using the pvTimerID parameter of the call to - * xTimerCreated() that was used to create the timer, and by calling the - * vTimerSetTimerID() API function. - * - * If the same callback function is assigned to multiple timers then the timer - * ID can be used as time specific (timer local) storage. - * - * @param xTimer The timer being queried. - * - * @return The ID assigned to the timer being queried. - * - * Example usage: - * - * See the xTimerCreate() API function example usage scenario. - */ -void *pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; - -/** - * void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ); - * - * Sets the ID assigned to the timer. - * - * IDs are assigned to timers using the pvTimerID parameter of the call to - * xTimerCreated() that was used to create the timer. - * - * If the same callback function is assigned to multiple timers then the timer - * ID can be used as time specific (timer local) storage. - * - * @param xTimer The timer being updated. - * - * @param pvNewID The ID to assign to the timer. - * - * Example usage: - * - * See the xTimerCreate() API function example usage scenario. - */ -void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) PRIVILEGED_FUNCTION; - -/** - * BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ); - * - * Queries a timer to see if it is active or dormant. - * - * A timer will be dormant if: - * 1) It has been created but not started, or - * 2) It is an expired one-shot timer that has not been restarted. - * - * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), - * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and - * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the - * active state. - * - * @param xTimer The timer being queried. - * - * @return pdFALSE will be returned if the timer is dormant. A value other than - * pdFALSE will be returned if the timer is active. - * - * Example usage: - * @verbatim - * // This function assumes xTimer has already been created. - * void vAFunction( TimerHandle_t xTimer ) - * { - * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" - * { - * // xTimer is active, do something. - * } - * else - * { - * // xTimer is not active, do something else. - * } - * } - * @endverbatim - */ -BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; - -/** - * TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ); - * - * Simply returns the handle of the timer service/daemon task. It it not valid - * to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started. - */ -TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; - -/** - * BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait ); - * - * Timer functionality is provided by a timer service/daemon task. Many of the - * public FreeRTOS timer API functions send commands to the timer service task - * through a queue called the timer command queue. The timer command queue is - * private to the kernel itself and is not directly accessible to application - * code. The length of the timer command queue is set by the - * configTIMER_QUEUE_LENGTH configuration constant. - * - * xTimerStart() starts a timer that was previously created using the - * xTimerCreate() API function. If the timer had already been started and was - * already in the active state, then xTimerStart() has equivalent functionality - * to the xTimerReset() API function. - * - * Starting a timer ensures the timer is in the active state. If the timer - * is not stopped, deleted, or reset in the mean time, the callback function - * associated with the timer will get called 'n' ticks after xTimerStart() was - * called, where 'n' is the timers defined period. - * - * It is valid to call xTimerStart() before the scheduler has been started, but - * when this is done the timer will not actually start until the scheduler is - * started, and the timers expiry time will be relative to when the scheduler is - * started, not relative to when xTimerStart() was called. - * - * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart() - * to be available. - * - * @param xTimer The handle of the timer being started/restarted. - * - * @param xTicksToWait Specifies the time, in ticks, that the calling task should - * be held in the Blocked state to wait for the start command to be successfully - * sent to the timer command queue, should the queue already be full when - * xTimerStart() was called. xTicksToWait is ignored if xTimerStart() is called - * before the scheduler is started. - * - * @return pdFAIL will be returned if the start command could not be sent to - * the timer command queue even after xTicksToWait ticks had passed. pdPASS will - * be returned if the command was successfully sent to the timer command queue. - * When the command is actually processed will depend on the priority of the - * timer service/daemon task relative to other tasks in the system, although the - * timers expiry time is relative to when xTimerStart() is actually called. The - * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY - * configuration constant. - * - * Example usage: - * - * See the xTimerCreate() API function example usage scenario. - * - */ -#define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) - -/** - * BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait ); - * - * Timer functionality is provided by a timer service/daemon task. Many of the - * public FreeRTOS timer API functions send commands to the timer service task - * through a queue called the timer command queue. The timer command queue is - * private to the kernel itself and is not directly accessible to application - * code. The length of the timer command queue is set by the - * configTIMER_QUEUE_LENGTH configuration constant. - * - * xTimerStop() stops a timer that was previously started using either of the - * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), - * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions. - * - * Stopping a timer ensures the timer is not in the active state. - * - * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop() - * to be available. - * - * @param xTimer The handle of the timer being stopped. - * - * @param xTicksToWait Specifies the time, in ticks, that the calling task should - * be held in the Blocked state to wait for the stop command to be successfully - * sent to the timer command queue, should the queue already be full when - * xTimerStop() was called. xTicksToWait is ignored if xTimerStop() is called - * before the scheduler is started. - * - * @return pdFAIL will be returned if the stop command could not be sent to - * the timer command queue even after xTicksToWait ticks had passed. pdPASS will - * be returned if the command was successfully sent to the timer command queue. - * When the command is actually processed will depend on the priority of the - * timer service/daemon task relative to other tasks in the system. The timer - * service/daemon task priority is set by the configTIMER_TASK_PRIORITY - * configuration constant. - * - * Example usage: - * - * See the xTimerCreate() API function example usage scenario. - * - */ -#define xTimerStop( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) ) - -/** - * BaseType_t xTimerChangePeriod( TimerHandle_t xTimer, - * TickType_t xNewPeriod, - * TickType_t xTicksToWait ); - * - * Timer functionality is provided by a timer service/daemon task. Many of the - * public FreeRTOS timer API functions send commands to the timer service task - * through a queue called the timer command queue. The timer command queue is - * private to the kernel itself and is not directly accessible to application - * code. The length of the timer command queue is set by the - * configTIMER_QUEUE_LENGTH configuration constant. - * - * xTimerChangePeriod() changes the period of a timer that was previously - * created using the xTimerCreate() API function. - * - * xTimerChangePeriod() can be called to change the period of an active or - * dormant state timer. - * - * The configUSE_TIMERS configuration constant must be set to 1 for - * xTimerChangePeriod() to be available. - * - * @param xTimer The handle of the timer that is having its period changed. - * - * @param xNewPeriod The new period for xTimer. Timer periods are specified in - * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time - * that has been specified in milliseconds. For example, if the timer must - * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, - * if the timer must expire after 500ms, then xNewPeriod can be set to - * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than - * or equal to 1000. - * - * @param xTicksToWait Specifies the time, in ticks, that the calling task should - * be held in the Blocked state to wait for the change period command to be - * successfully sent to the timer command queue, should the queue already be - * full when xTimerChangePeriod() was called. xTicksToWait is ignored if - * xTimerChangePeriod() is called before the scheduler is started. - * - * @return pdFAIL will be returned if the change period command could not be - * sent to the timer command queue even after xTicksToWait ticks had passed. - * pdPASS will be returned if the command was successfully sent to the timer - * command queue. When the command is actually processed will depend on the - * priority of the timer service/daemon task relative to other tasks in the - * system. The timer service/daemon task priority is set by the - * configTIMER_TASK_PRIORITY configuration constant. - * - * Example usage: - * @verbatim - * // This function assumes xTimer has already been created. If the timer - * // referenced by xTimer is already active when it is called, then the timer - * // is deleted. If the timer referenced by xTimer is not active when it is - * // called, then the period of the timer is set to 500ms and the timer is - * // started. - * void vAFunction( TimerHandle_t xTimer ) - * { - * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" - * { - * // xTimer is already active - delete it. - * xTimerDelete( xTimer ); - * } - * else - * { - * // xTimer is not active, change its period to 500ms. This will also - * // cause the timer to start. Block for a maximum of 100 ticks if the - * // change period command cannot immediately be sent to the timer - * // command queue. - * if( xTimerChangePeriod( xTimer, 500 / portTICK_PERIOD_MS, 100 ) == pdPASS ) - * { - * // The command was successfully sent. - * } - * else - * { - * // The command could not be sent, even after waiting for 100 ticks - * // to pass. Take appropriate action here. - * } - * } - * } - * @endverbatim - */ - #define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) ) - -/** - * BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait ); - * - * Timer functionality is provided by a timer service/daemon task. Many of the - * public FreeRTOS timer API functions send commands to the timer service task - * through a queue called the timer command queue. The timer command queue is - * private to the kernel itself and is not directly accessible to application - * code. The length of the timer command queue is set by the - * configTIMER_QUEUE_LENGTH configuration constant. - * - * xTimerDelete() deletes a timer that was previously created using the - * xTimerCreate() API function. - * - * The configUSE_TIMERS configuration constant must be set to 1 for - * xTimerDelete() to be available. - * - * @param xTimer The handle of the timer being deleted. - * - * @param xTicksToWait Specifies the time, in ticks, that the calling task should - * be held in the Blocked state to wait for the delete command to be - * successfully sent to the timer command queue, should the queue already be - * full when xTimerDelete() was called. xTicksToWait is ignored if xTimerDelete() - * is called before the scheduler is started. - * - * @return pdFAIL will be returned if the delete command could not be sent to - * the timer command queue even after xTicksToWait ticks had passed. pdPASS will - * be returned if the command was successfully sent to the timer command queue. - * When the command is actually processed will depend on the priority of the - * timer service/daemon task relative to other tasks in the system. The timer - * service/daemon task priority is set by the configTIMER_TASK_PRIORITY - * configuration constant. - * - * Example usage: - * - * See the xTimerChangePeriod() API function example usage scenario. - */ -#define xTimerDelete( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) ) - -/** - * BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait ); - * - * Timer functionality is provided by a timer service/daemon task. Many of the - * public FreeRTOS timer API functions send commands to the timer service task - * through a queue called the timer command queue. The timer command queue is - * private to the kernel itself and is not directly accessible to application - * code. The length of the timer command queue is set by the - * configTIMER_QUEUE_LENGTH configuration constant. - * - * xTimerReset() re-starts a timer that was previously created using the - * xTimerCreate() API function. If the timer had already been started and was - * already in the active state, then xTimerReset() will cause the timer to - * re-evaluate its expiry time so that it is relative to when xTimerReset() was - * called. If the timer was in the dormant state then xTimerReset() has - * equivalent functionality to the xTimerStart() API function. - * - * Resetting a timer ensures the timer is in the active state. If the timer - * is not stopped, deleted, or reset in the mean time, the callback function - * associated with the timer will get called 'n' ticks after xTimerReset() was - * called, where 'n' is the timers defined period. - * - * It is valid to call xTimerReset() before the scheduler has been started, but - * when this is done the timer will not actually start until the scheduler is - * started, and the timers expiry time will be relative to when the scheduler is - * started, not relative to when xTimerReset() was called. - * - * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset() - * to be available. - * - * @param xTimer The handle of the timer being reset/started/restarted. - * - * @param xTicksToWait Specifies the time, in ticks, that the calling task should - * be held in the Blocked state to wait for the reset command to be successfully - * sent to the timer command queue, should the queue already be full when - * xTimerReset() was called. xTicksToWait is ignored if xTimerReset() is called - * before the scheduler is started. - * - * @return pdFAIL will be returned if the reset command could not be sent to - * the timer command queue even after xTicksToWait ticks had passed. pdPASS will - * be returned if the command was successfully sent to the timer command queue. - * When the command is actually processed will depend on the priority of the - * timer service/daemon task relative to other tasks in the system, although the - * timers expiry time is relative to when xTimerStart() is actually called. The - * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY - * configuration constant. - * - * Example usage: - * @verbatim - * // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass - * // without a key being pressed, then the LCD back-light is switched off. In - * // this case, the timer is a one-shot timer. - * - * TimerHandle_t xBacklightTimer = NULL; - * - * // The callback function assigned to the one-shot timer. In this case the - * // parameter is not used. - * void vBacklightTimerCallback( TimerHandle_t pxTimer ) - * { - * // The timer expired, therefore 5 seconds must have passed since a key - * // was pressed. Switch off the LCD back-light. - * vSetBacklightState( BACKLIGHT_OFF ); - * } - * - * // The key press event handler. - * void vKeyPressEventHandler( char cKey ) - * { - * // Ensure the LCD back-light is on, then reset the timer that is - * // responsible for turning the back-light off after 5 seconds of - * // key inactivity. Wait 10 ticks for the command to be successfully sent - * // if it cannot be sent immediately. - * vSetBacklightState( BACKLIGHT_ON ); - * if( xTimerReset( xBacklightTimer, 100 ) != pdPASS ) - * { - * // The reset command was not executed successfully. Take appropriate - * // action here. - * } - * - * // Perform the rest of the key processing here. - * } - * - * void main( void ) - * { - * int32_t x; - * - * // Create then start the one-shot timer that is responsible for turning - * // the back-light off if no keys are pressed within a 5 second period. - * xBacklightTimer = xTimerCreate( "BacklightTimer", // Just a text name, not used by the kernel. - * ( 5000 / portTICK_PERIOD_MS), // The timer period in ticks. - * pdFALSE, // The timer is a one-shot timer. - * 0, // The id is not used by the callback so can take any value. - * vBacklightTimerCallback // The callback function that switches the LCD back-light off. - * ); - * - * if( xBacklightTimer == NULL ) - * { - * // The timer was not created. - * } - * else - * { - * // Start the timer. No block time is specified, and even if one was - * // it would be ignored because the scheduler has not yet been - * // started. - * if( xTimerStart( xBacklightTimer, 0 ) != pdPASS ) - * { - * // The timer could not be set into the Active state. - * } - * } - * - * // ... - * // Create tasks here. - * // ... - * - * // Starting the scheduler will start the timer running as it has already - * // been set into the active state. - * vTaskStartScheduler(); - * - * // Should not reach here. - * for( ;; ); - * } - * @endverbatim - */ -#define xTimerReset( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) - -/** - * BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, - * BaseType_t *pxHigherPriorityTaskWoken ); - * - * A version of xTimerStart() that can be called from an interrupt service - * routine. - * - * @param xTimer The handle of the timer being started/restarted. - * - * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most - * of its time in the Blocked state, waiting for messages to arrive on the timer - * command queue. Calling xTimerStartFromISR() writes a message to the timer - * command queue, so has the potential to transition the timer service/daemon - * task out of the Blocked state. If calling xTimerStartFromISR() causes the - * timer service/daemon task to leave the Blocked state, and the timer service/ - * daemon task has a priority equal to or greater than the currently executing - * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will - * get set to pdTRUE internally within the xTimerStartFromISR() function. If - * xTimerStartFromISR() sets this value to pdTRUE then a context switch should - * be performed before the interrupt exits. - * - * @return pdFAIL will be returned if the start command could not be sent to - * the timer command queue. pdPASS will be returned if the command was - * successfully sent to the timer command queue. When the command is actually - * processed will depend on the priority of the timer service/daemon task - * relative to other tasks in the system, although the timers expiry time is - * relative to when xTimerStartFromISR() is actually called. The timer - * service/daemon task priority is set by the configTIMER_TASK_PRIORITY - * configuration constant. - * - * Example usage: - * @verbatim - * // This scenario assumes xBacklightTimer has already been created. When a - * // key is pressed, an LCD back-light is switched on. If 5 seconds pass - * // without a key being pressed, then the LCD back-light is switched off. In - * // this case, the timer is a one-shot timer, and unlike the example given for - * // the xTimerReset() function, the key press event handler is an interrupt - * // service routine. - * - * // The callback function assigned to the one-shot timer. In this case the - * // parameter is not used. - * void vBacklightTimerCallback( TimerHandle_t pxTimer ) - * { - * // The timer expired, therefore 5 seconds must have passed since a key - * // was pressed. Switch off the LCD back-light. - * vSetBacklightState( BACKLIGHT_OFF ); - * } - * - * // The key press interrupt service routine. - * void vKeyPressEventInterruptHandler( void ) - * { - * BaseType_t xHigherPriorityTaskWoken = pdFALSE; - * - * // Ensure the LCD back-light is on, then restart the timer that is - * // responsible for turning the back-light off after 5 seconds of - * // key inactivity. This is an interrupt service routine so can only - * // call FreeRTOS API functions that end in "FromISR". - * vSetBacklightState( BACKLIGHT_ON ); - * - * // xTimerStartFromISR() or xTimerResetFromISR() could be called here - * // as both cause the timer to re-calculate its expiry time. - * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was - * // declared (in this function). - * if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) - * { - * // The start command was not executed successfully. Take appropriate - * // action here. - * } - * - * // Perform the rest of the key processing here. - * - * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch - * // should be performed. The syntax required to perform a context switch - * // from inside an ISR varies from port to port, and from compiler to - * // compiler. Inspect the demos for the port you are using to find the - * // actual syntax required. - * if( xHigherPriorityTaskWoken != pdFALSE ) - * { - * // Call the interrupt safe yield function here (actual function - * // depends on the FreeRTOS port being used). - * } - * } - * @endverbatim - */ -#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) - -/** - * BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, - * BaseType_t *pxHigherPriorityTaskWoken ); - * - * A version of xTimerStop() that can be called from an interrupt service - * routine. - * - * @param xTimer The handle of the timer being stopped. - * - * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most - * of its time in the Blocked state, waiting for messages to arrive on the timer - * command queue. Calling xTimerStopFromISR() writes a message to the timer - * command queue, so has the potential to transition the timer service/daemon - * task out of the Blocked state. If calling xTimerStopFromISR() causes the - * timer service/daemon task to leave the Blocked state, and the timer service/ - * daemon task has a priority equal to or greater than the currently executing - * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will - * get set to pdTRUE internally within the xTimerStopFromISR() function. If - * xTimerStopFromISR() sets this value to pdTRUE then a context switch should - * be performed before the interrupt exits. - * - * @return pdFAIL will be returned if the stop command could not be sent to - * the timer command queue. pdPASS will be returned if the command was - * successfully sent to the timer command queue. When the command is actually - * processed will depend on the priority of the timer service/daemon task - * relative to other tasks in the system. The timer service/daemon task - * priority is set by the configTIMER_TASK_PRIORITY configuration constant. - * - * Example usage: - * @verbatim - * // This scenario assumes xTimer has already been created and started. When - * // an interrupt occurs, the timer should be simply stopped. - * - * // The interrupt service routine that stops the timer. - * void vAnExampleInterruptServiceRoutine( void ) - * { - * BaseType_t xHigherPriorityTaskWoken = pdFALSE; - * - * // The interrupt has occurred - simply stop the timer. - * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined - * // (within this function). As this is an interrupt service routine, only - * // FreeRTOS API functions that end in "FromISR" can be used. - * if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) - * { - * // The stop command was not executed successfully. Take appropriate - * // action here. - * } - * - * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch - * // should be performed. The syntax required to perform a context switch - * // from inside an ISR varies from port to port, and from compiler to - * // compiler. Inspect the demos for the port you are using to find the - * // actual syntax required. - * if( xHigherPriorityTaskWoken != pdFALSE ) - * { - * // Call the interrupt safe yield function here (actual function - * // depends on the FreeRTOS port being used). - * } - * } - * @endverbatim - */ -#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U ) - -/** - * BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer, - * TickType_t xNewPeriod, - * BaseType_t *pxHigherPriorityTaskWoken ); - * - * A version of xTimerChangePeriod() that can be called from an interrupt - * service routine. - * - * @param xTimer The handle of the timer that is having its period changed. - * - * @param xNewPeriod The new period for xTimer. Timer periods are specified in - * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time - * that has been specified in milliseconds. For example, if the timer must - * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, - * if the timer must expire after 500ms, then xNewPeriod can be set to - * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than - * or equal to 1000. - * - * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most - * of its time in the Blocked state, waiting for messages to arrive on the timer - * command queue. Calling xTimerChangePeriodFromISR() writes a message to the - * timer command queue, so has the potential to transition the timer service/ - * daemon task out of the Blocked state. If calling xTimerChangePeriodFromISR() - * causes the timer service/daemon task to leave the Blocked state, and the - * timer service/daemon task has a priority equal to or greater than the - * currently executing task (the task that was interrupted), then - * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the - * xTimerChangePeriodFromISR() function. If xTimerChangePeriodFromISR() sets - * this value to pdTRUE then a context switch should be performed before the - * interrupt exits. - * - * @return pdFAIL will be returned if the command to change the timers period - * could not be sent to the timer command queue. pdPASS will be returned if the - * command was successfully sent to the timer command queue. When the command - * is actually processed will depend on the priority of the timer service/daemon - * task relative to other tasks in the system. The timer service/daemon task - * priority is set by the configTIMER_TASK_PRIORITY configuration constant. - * - * Example usage: - * @verbatim - * // This scenario assumes xTimer has already been created and started. When - * // an interrupt occurs, the period of xTimer should be changed to 500ms. - * - * // The interrupt service routine that changes the period of xTimer. - * void vAnExampleInterruptServiceRoutine( void ) - * { - * BaseType_t xHigherPriorityTaskWoken = pdFALSE; - * - * // The interrupt has occurred - change the period of xTimer to 500ms. - * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined - * // (within this function). As this is an interrupt service routine, only - * // FreeRTOS API functions that end in "FromISR" can be used. - * if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) - * { - * // The command to change the timers period was not executed - * // successfully. Take appropriate action here. - * } - * - * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch - * // should be performed. The syntax required to perform a context switch - * // from inside an ISR varies from port to port, and from compiler to - * // compiler. Inspect the demos for the port you are using to find the - * // actual syntax required. - * if( xHigherPriorityTaskWoken != pdFALSE ) - * { - * // Call the interrupt safe yield function here (actual function - * // depends on the FreeRTOS port being used). - * } - * } - * @endverbatim - */ -#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) - -/** - * BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, - * BaseType_t *pxHigherPriorityTaskWoken ); - * - * A version of xTimerReset() that can be called from an interrupt service - * routine. - * - * @param xTimer The handle of the timer that is to be started, reset, or - * restarted. - * - * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most - * of its time in the Blocked state, waiting for messages to arrive on the timer - * command queue. Calling xTimerResetFromISR() writes a message to the timer - * command queue, so has the potential to transition the timer service/daemon - * task out of the Blocked state. If calling xTimerResetFromISR() causes the - * timer service/daemon task to leave the Blocked state, and the timer service/ - * daemon task has a priority equal to or greater than the currently executing - * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will - * get set to pdTRUE internally within the xTimerResetFromISR() function. If - * xTimerResetFromISR() sets this value to pdTRUE then a context switch should - * be performed before the interrupt exits. - * - * @return pdFAIL will be returned if the reset command could not be sent to - * the timer command queue. pdPASS will be returned if the command was - * successfully sent to the timer command queue. When the command is actually - * processed will depend on the priority of the timer service/daemon task - * relative to other tasks in the system, although the timers expiry time is - * relative to when xTimerResetFromISR() is actually called. The timer service/daemon - * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. - * - * Example usage: - * @verbatim - * // This scenario assumes xBacklightTimer has already been created. When a - * // key is pressed, an LCD back-light is switched on. If 5 seconds pass - * // without a key being pressed, then the LCD back-light is switched off. In - * // this case, the timer is a one-shot timer, and unlike the example given for - * // the xTimerReset() function, the key press event handler is an interrupt - * // service routine. - * - * // The callback function assigned to the one-shot timer. In this case the - * // parameter is not used. - * void vBacklightTimerCallback( TimerHandle_t pxTimer ) - * { - * // The timer expired, therefore 5 seconds must have passed since a key - * // was pressed. Switch off the LCD back-light. - * vSetBacklightState( BACKLIGHT_OFF ); - * } - * - * // The key press interrupt service routine. - * void vKeyPressEventInterruptHandler( void ) - * { - * BaseType_t xHigherPriorityTaskWoken = pdFALSE; - * - * // Ensure the LCD back-light is on, then reset the timer that is - * // responsible for turning the back-light off after 5 seconds of - * // key inactivity. This is an interrupt service routine so can only - * // call FreeRTOS API functions that end in "FromISR". - * vSetBacklightState( BACKLIGHT_ON ); - * - * // xTimerStartFromISR() or xTimerResetFromISR() could be called here - * // as both cause the timer to re-calculate its expiry time. - * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was - * // declared (in this function). - * if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) - * { - * // The reset command was not executed successfully. Take appropriate - * // action here. - * } - * - * // Perform the rest of the key processing here. - * - * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch - * // should be performed. The syntax required to perform a context switch - * // from inside an ISR varies from port to port, and from compiler to - * // compiler. Inspect the demos for the port you are using to find the - * // actual syntax required. - * if( xHigherPriorityTaskWoken != pdFALSE ) - * { - * // Call the interrupt safe yield function here (actual function - * // depends on the FreeRTOS port being used). - * } - * } - * @endverbatim - */ -#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) - - -/** - * BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, - * void *pvParameter1, - * uint32_t ulParameter2, - * BaseType_t *pxHigherPriorityTaskWoken ); - * - * - * Used from application interrupt service routines to defer the execution of a - * function to the RTOS daemon task (the timer service task, hence this function - * is implemented in timers.c and is prefixed with 'Timer'). - * - * Ideally an interrupt service routine (ISR) is kept as short as possible, but - * sometimes an ISR either has a lot of processing to do, or needs to perform - * processing that is not deterministic. In these cases - * xTimerPendFunctionCallFromISR() can be used to defer processing of a function - * to the RTOS daemon task. - * - * A mechanism is provided that allows the interrupt to return directly to the - * task that will subsequently execute the pended callback function. This - * allows the callback function to execute contiguously in time with the - * interrupt - just as if the callback had executed in the interrupt itself. - * - * @param xFunctionToPend The function to execute from the timer service/ - * daemon task. The function must conform to the PendedFunction_t - * prototype. - * - * @param pvParameter1 The value of the callback function's first parameter. - * The parameter has a void * type to allow it to be used to pass any type. - * For example, unsigned longs can be cast to a void *, or the void * can be - * used to point to a structure. - * - * @param ulParameter2 The value of the callback function's second parameter. - * - * @param pxHigherPriorityTaskWoken As mentioned above, calling this function - * will result in a message being sent to the timer daemon task. If the - * priority of the timer daemon task (which is set using - * configTIMER_TASK_PRIORITY in FreeRTOSConfig.h) is higher than the priority of - * the currently running task (the task the interrupt interrupted) then - * *pxHigherPriorityTaskWoken will be set to pdTRUE within - * xTimerPendFunctionCallFromISR(), indicating that a context switch should be - * requested before the interrupt exits. For that reason - * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the - * example code below. - * - * @return pdPASS is returned if the message was successfully sent to the - * timer daemon task, otherwise pdFALSE is returned. - * - * Example usage: - * @verbatim - * - * // The callback function that will execute in the context of the daemon task. - * // Note callback functions must all use this same prototype. - * void vProcessInterface( void *pvParameter1, uint32_t ulParameter2 ) - * { - * BaseType_t xInterfaceToService; - * - * // The interface that requires servicing is passed in the second - * // parameter. The first parameter is not used in this case. - * xInterfaceToService = ( BaseType_t ) ulParameter2; - * - * // ...Perform the processing here... - * } - * - * // An ISR that receives data packets from multiple interfaces - * void vAnISR( void ) - * { - * BaseType_t xInterfaceToService, xHigherPriorityTaskWoken; - * - * // Query the hardware to determine which interface needs processing. - * xInterfaceToService = prvCheckInterfaces(); - * - * // The actual processing is to be deferred to a task. Request the - * // vProcessInterface() callback function is executed, passing in the - * // number of the interface that needs processing. The interface to - * // service is passed in the second parameter. The first parameter is - * // not used in this case. - * xHigherPriorityTaskWoken = pdFALSE; - * xTimerPendFunctionCallFromISR( vProcessInterface, NULL, ( uint32_t ) xInterfaceToService, &xHigherPriorityTaskWoken ); - * - * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context - * // switch should be requested. The macro used is port specific and will - * // be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to - * // the documentation page for the port being used. - * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); - * - * } - * @endverbatim - */ -BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; - - /** - * BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, - * void *pvParameter1, - * uint32_t ulParameter2, - * TickType_t xTicksToWait ); - * - * - * Used to defer the execution of a function to the RTOS daemon task (the timer - * service task, hence this function is implemented in timers.c and is prefixed - * with 'Timer'). - * - * @param xFunctionToPend The function to execute from the timer service/ - * daemon task. The function must conform to the PendedFunction_t - * prototype. - * - * @param pvParameter1 The value of the callback function's first parameter. - * The parameter has a void * type to allow it to be used to pass any type. - * For example, unsigned longs can be cast to a void *, or the void * can be - * used to point to a structure. - * - * @param ulParameter2 The value of the callback function's second parameter. - * - * @param xTicksToWait Calling this function will result in a message being - * sent to the timer daemon task on a queue. xTicksToWait is the amount of - * time the calling task should remain in the Blocked state (so not using any - * processing time) for space to become available on the timer queue if the - * queue is found to be full. - * - * @return pdPASS is returned if the message was successfully sent to the - * timer daemon task, otherwise pdFALSE is returned. - * - */ -BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - -/** - * const char * const pcTimerGetName( TimerHandle_t xTimer ); - * - * Returns the name that was assigned to a timer when the timer was created. - * - * @param xTimer The handle of the timer being queried. - * - * @return The name assigned to the timer specified by the xTimer parameter. - */ -const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - -/** - * void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ); - * - * Updates a timer to be either an auto-reload timer, in which case the timer - * automatically resets itself each time it expires, or a one-shot timer, in - * which case the timer will only expire once unless it is manually restarted. - * - * @param xTimer The handle of the timer being updated. - * - * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will - * expire repeatedly with a frequency set by the timer's period (see the - * xTimerPeriodInTicks parameter of the xTimerCreate() API function). If - * uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and - * enter the dormant state after it expires. - */ -void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) PRIVILEGED_FUNCTION; - -/** -* UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ); -* -* Queries a timer to determine if it is an auto-reload timer, in which case the timer -* automatically resets itself each time it expires, or a one-shot timer, in -* which case the timer will only expire once unless it is manually restarted. -* -* @param xTimer The handle of the timer being queried. -* -* @return If the timer is an auto-reload timer then pdTRUE is returned, otherwise -* pdFALSE is returned. -*/ -UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; - -/** - * TickType_t xTimerGetPeriod( TimerHandle_t xTimer ); - * - * Returns the period of a timer. - * - * @param xTimer The handle of the timer being queried. - * - * @return The period of the timer in ticks. - */ -TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; - -/** -* TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ); -* -* Returns the time in ticks at which the timer will expire. If this is less -* than the current tick count then the expiry time has overflowed from the -* current time. -* -* @param xTimer The handle of the timer being queried. -* -* @return If the timer is running then the time in ticks at which the timer -* will next expire is returned. If the timer is not running then the return -* value is undefined. -*/ -TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; - -/* - * Functions beyond this part are not part of the public API and are intended - * for use by the kernel only. - */ -BaseType_t xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; -BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - -#if( configUSE_TRACE_FACILITY == 1 ) - void vTimerSetTimerNumber( TimerHandle_t xTimer, UBaseType_t uxTimerNumber ) PRIVILEGED_FUNCTION; - UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; -#endif - -#ifdef __cplusplus -} -#endif -#endif /* TIMERS_H */ - - - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/list.c b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/list.c deleted file mode 100644 index 7618ee8..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/list.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - - -#include -#include "FreeRTOS.h" -#include "list.h" - -/*----------------------------------------------------------- - * PUBLIC LIST API documented in list.h - *----------------------------------------------------------*/ - -void vListInitialise( List_t * const pxList ) -{ - /* The list structure contains a list item which is used to mark the - end of the list. To initialise the list the list end is inserted - as the only list entry. */ - pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ - - /* The list end value is the highest possible value in the list to - ensure it remains at the end of the list. */ - pxList->xListEnd.xItemValue = portMAX_DELAY; - - /* The list end next and previous pointers point to itself so we know - when the list is empty. */ - pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ - pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ - - pxList->uxNumberOfItems = ( UBaseType_t ) 0U; - - /* Write known values into the list if - configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ - listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ); - listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ); -} -/*-----------------------------------------------------------*/ - -void vListInitialiseItem( ListItem_t * const pxItem ) -{ - /* Make sure the list item is not recorded as being on a list. */ - pxItem->pxContainer = NULL; - - /* Write known values into the list item if - configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ - listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); - listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); -} -/*-----------------------------------------------------------*/ - -void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) -{ -ListItem_t * const pxIndex = pxList->pxIndex; - - /* Only effective when configASSERT() is also defined, these tests may catch - the list data structures being overwritten in memory. They will not catch - data errors caused by incorrect configuration or use of FreeRTOS. */ - listTEST_LIST_INTEGRITY( pxList ); - listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); - - /* Insert a new list item into pxList, but rather than sort the list, - makes the new list item the last item to be removed by a call to - listGET_OWNER_OF_NEXT_ENTRY(). */ - pxNewListItem->pxNext = pxIndex; - pxNewListItem->pxPrevious = pxIndex->pxPrevious; - - /* Only used during decision coverage testing. */ - mtCOVERAGE_TEST_DELAY(); - - pxIndex->pxPrevious->pxNext = pxNewListItem; - pxIndex->pxPrevious = pxNewListItem; - - /* Remember which list the item is in. */ - pxNewListItem->pxContainer = pxList; - - ( pxList->uxNumberOfItems )++; -} -/*-----------------------------------------------------------*/ - -void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) -{ -ListItem_t *pxIterator; -const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; - - /* Only effective when configASSERT() is also defined, these tests may catch - the list data structures being overwritten in memory. They will not catch - data errors caused by incorrect configuration or use of FreeRTOS. */ - listTEST_LIST_INTEGRITY( pxList ); - listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); - - /* Insert the new list item into the list, sorted in xItemValue order. - - If the list already contains a list item with the same item value then the - new list item should be placed after it. This ensures that TCBs which are - stored in ready lists (all of which have the same xItemValue value) get a - share of the CPU. However, if the xItemValue is the same as the back marker - the iteration loop below will not end. Therefore the value is checked - first, and the algorithm slightly modified if necessary. */ - if( xValueOfInsertion == portMAX_DELAY ) - { - pxIterator = pxList->xListEnd.pxPrevious; - } - else - { - /* *** NOTE *********************************************************** - If you find your application is crashing here then likely causes are - listed below. In addition see https://www.freertos.org/FAQHelp.html for - more tips, and ensure configASSERT() is defined! - https://www.freertos.org/a00110.html#configASSERT - - 1) Stack overflow - - see https://www.freertos.org/Stacks-and-stack-overflow-checking.html - 2) Incorrect interrupt priority assignment, especially on Cortex-M - parts where numerically high priority values denote low actual - interrupt priorities, which can seem counter intuitive. See - https://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition - of configMAX_SYSCALL_INTERRUPT_PRIORITY on - https://www.freertos.org/a00110.html - 3) Calling an API function from within a critical section or when - the scheduler is suspended, or calling an API function that does - not end in "FromISR" from an interrupt. - 4) Using a queue or semaphore before it has been initialised or - before the scheduler has been started (are interrupts firing - before vTaskStartScheduler() has been called?). - **********************************************************************/ - - for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */ - { - /* There is nothing to do here, just iterating to the wanted - insertion position. */ - } - } - - pxNewListItem->pxNext = pxIterator->pxNext; - pxNewListItem->pxNext->pxPrevious = pxNewListItem; - pxNewListItem->pxPrevious = pxIterator; - pxIterator->pxNext = pxNewListItem; - - /* Remember which list the item is in. This allows fast removal of the - item later. */ - pxNewListItem->pxContainer = pxList; - - ( pxList->uxNumberOfItems )++; -} -/*-----------------------------------------------------------*/ - -UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) -{ -/* The list item knows which list it is in. Obtain the list from the list -item. */ -List_t * const pxList = pxItemToRemove->pxContainer; - - pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; - pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; - - /* Only used during decision coverage testing. */ - mtCOVERAGE_TEST_DELAY(); - - /* Make sure the index is left pointing to a valid item. */ - if( pxList->pxIndex == pxItemToRemove ) - { - pxList->pxIndex = pxItemToRemove->pxPrevious; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - pxItemToRemove->pxContainer = NULL; - ( pxList->uxNumberOfItems )--; - - return pxList->uxNumberOfItems; -} -/*-----------------------------------------------------------*/ - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c deleted file mode 100644 index eaf443f..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c +++ /dev/null @@ -1,492 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/* - * A sample implementation of pvPortMalloc() and vPortFree() that combines - * (coalescences) adjacent memory blocks as they are freed, and in so doing - * limits memory fragmentation. - * - * See heap_1.c, heap_2.c and heap_3.c for alternative implementations, and the - * memory management pages of http://www.FreeRTOS.org for more information. - */ -#include - -/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining -all the API functions to use the MPU wrappers. That should only be done when -task.h is included from an application file. */ -#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE - -#include "FreeRTOS.h" -#include "task.h" - -#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE - -#if( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) - #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 -#endif - -/* Block sizes must not get too small. */ -#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) - -/* Assumes 8bit bytes! */ -#define heapBITS_PER_BYTE ( ( size_t ) 8 ) - -/* Allocate the memory for the heap. */ -#if( configAPPLICATION_ALLOCATED_HEAP == 1 ) - /* The application writer has already defined the array used for the RTOS - heap - probably so it can be placed in a special segment or address. */ - extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; -#else - static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; -#endif /* configAPPLICATION_ALLOCATED_HEAP */ - -/* Define the linked list structure. This is used to link free blocks in order -of their memory address. */ -typedef struct A_BLOCK_LINK -{ - struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */ - size_t xBlockSize; /*<< The size of the free block. */ -} BlockLink_t; - -/*-----------------------------------------------------------*/ - -/* - * Inserts a block of memory that is being freed into the correct position in - * the list of free memory blocks. The block being freed will be merged with - * the block in front it and/or the block behind it if the memory blocks are - * adjacent to each other. - */ -static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ); - -/* - * Called automatically to setup the required heap structures the first time - * pvPortMalloc() is called. - */ -static void prvHeapInit( void ); - -/*-----------------------------------------------------------*/ - -/* The size of the structure placed at the beginning of each allocated memory -block must by correctly byte aligned. */ -static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); - -/* Create a couple of list links to mark the start and end of the list. */ -static BlockLink_t xStart, *pxEnd = NULL; - -/* Keeps track of the number of calls to allocate and free memory as well as the -number of free bytes remaining, but says nothing about fragmentation. */ -static size_t xFreeBytesRemaining = 0U; -static size_t xMinimumEverFreeBytesRemaining = 0U; -static size_t xNumberOfSuccessfulAllocations = 0; -static size_t xNumberOfSuccessfulFrees = 0; - -/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize -member of an BlockLink_t structure is set then the block belongs to the -application. When the bit is free the block is still part of the free heap -space. */ -static size_t xBlockAllocatedBit = 0; - -/*-----------------------------------------------------------*/ - -void *pvPortMalloc( size_t xWantedSize ) -{ -BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; -void *pvReturn = NULL; - - vTaskSuspendAll(); - { - /* If this is the first call to malloc then the heap will require - initialisation to setup the list of free blocks. */ - if( pxEnd == NULL ) - { - prvHeapInit(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Check the requested block size is not so large that the top bit is - set. The top bit of the block size member of the BlockLink_t structure - is used to determine who owns the block - the application or the - kernel, so it must be free. */ - if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) - { - /* The wanted size is increased so it can contain a BlockLink_t - structure in addition to the requested amount of bytes. */ - if( xWantedSize > 0 ) - { - xWantedSize += xHeapStructSize; - - /* Ensure that blocks are always aligned to the required number - of bytes. */ - if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) - { - /* Byte alignment required. */ - xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); - configASSERT( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) == 0 ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) - { - /* Traverse the list from the start (lowest address) block until - one of adequate size is found. */ - pxPreviousBlock = &xStart; - pxBlock = xStart.pxNextFreeBlock; - while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) - { - pxPreviousBlock = pxBlock; - pxBlock = pxBlock->pxNextFreeBlock; - } - - /* If the end marker was reached then a block of adequate size - was not found. */ - if( pxBlock != pxEnd ) - { - /* Return the memory space pointed to - jumping over the - BlockLink_t structure at its start. */ - pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); - - /* This block is being returned for use so must be taken out - of the list of free blocks. */ - pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; - - /* If the block is larger than required it can be split into - two. */ - if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) - { - /* This block is to be split into two. Create a new - block following the number of bytes requested. The void - cast is used to prevent byte alignment warnings from the - compiler. */ - pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); - configASSERT( ( ( ( size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 ); - - /* Calculate the sizes of two blocks split from the - single block. */ - pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; - pxBlock->xBlockSize = xWantedSize; - - /* Insert the new block into the list of free blocks. */ - prvInsertBlockIntoFreeList( pxNewBlockLink ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - xFreeBytesRemaining -= pxBlock->xBlockSize; - - if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) - { - xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* The block is being returned - it is allocated and owned - by the application and has no "next" block. */ - pxBlock->xBlockSize |= xBlockAllocatedBit; - pxBlock->pxNextFreeBlock = NULL; - xNumberOfSuccessfulAllocations++; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - traceMALLOC( pvReturn, xWantedSize ); - } - ( void ) xTaskResumeAll(); - - #if( configUSE_MALLOC_FAILED_HOOK == 1 ) - { - if( pvReturn == NULL ) - { - extern void vApplicationMallocFailedHook( void ); - vApplicationMallocFailedHook(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif - - configASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) portBYTE_ALIGNMENT_MASK ) == 0 ); - return pvReturn; -} -/*-----------------------------------------------------------*/ - -void vPortFree( void *pv ) -{ -uint8_t *puc = ( uint8_t * ) pv; -BlockLink_t *pxLink; - - if( pv != NULL ) - { - /* The memory being freed will have an BlockLink_t structure immediately - before it. */ - puc -= xHeapStructSize; - - /* This casting is to keep the compiler from issuing warnings. */ - pxLink = ( void * ) puc; - - /* Check the block is actually allocated. */ - configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); - configASSERT( pxLink->pxNextFreeBlock == NULL ); - - if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) - { - if( pxLink->pxNextFreeBlock == NULL ) - { - /* The block is being returned to the heap - it is no longer - allocated. */ - pxLink->xBlockSize &= ~xBlockAllocatedBit; - - vTaskSuspendAll(); - { - /* Add this block to the list of free blocks. */ - xFreeBytesRemaining += pxLink->xBlockSize; - traceFREE( pv, pxLink->xBlockSize ); - prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); - xNumberOfSuccessfulFrees++; - } - ( void ) xTaskResumeAll(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } -} -/*-----------------------------------------------------------*/ - -size_t xPortGetFreeHeapSize( void ) -{ - return xFreeBytesRemaining; -} -/*-----------------------------------------------------------*/ - -size_t xPortGetMinimumEverFreeHeapSize( void ) -{ - return xMinimumEverFreeBytesRemaining; -} -/*-----------------------------------------------------------*/ - -void vPortInitialiseBlocks( void ) -{ - /* This just exists to keep the linker quiet. */ -} -/*-----------------------------------------------------------*/ - -static void prvHeapInit( void ) -{ -BlockLink_t *pxFirstFreeBlock; -uint8_t *pucAlignedHeap; -size_t uxAddress; -size_t xTotalHeapSize = configTOTAL_HEAP_SIZE; - - /* Ensure the heap starts on a correctly aligned boundary. */ - uxAddress = ( size_t ) ucHeap; - - if( ( uxAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) - { - uxAddress += ( portBYTE_ALIGNMENT - 1 ); - uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); - xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; - } - - pucAlignedHeap = ( uint8_t * ) uxAddress; - - /* xStart is used to hold a pointer to the first item in the list of free - blocks. The void cast is used to prevent compiler warnings. */ - xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; - xStart.xBlockSize = ( size_t ) 0; - - /* pxEnd is used to mark the end of the list of free blocks and is inserted - at the end of the heap space. */ - uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; - uxAddress -= xHeapStructSize; - uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); - pxEnd = ( void * ) uxAddress; - pxEnd->xBlockSize = 0; - pxEnd->pxNextFreeBlock = NULL; - - /* To start with there is a single free block that is sized to take up the - entire heap space, minus the space taken by pxEnd. */ - pxFirstFreeBlock = ( void * ) pucAlignedHeap; - pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; - pxFirstFreeBlock->pxNextFreeBlock = pxEnd; - - /* Only one block exists - and it covers the entire usable heap space. */ - xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; - xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; - - /* Work out the position of the top bit in a size_t variable. */ - xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ); -} -/*-----------------------------------------------------------*/ - -static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ) -{ -BlockLink_t *pxIterator; -uint8_t *puc; - - /* Iterate through the list until a block is found that has a higher address - than the block being inserted. */ - for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) - { - /* Nothing to do here, just iterate to the right position. */ - } - - /* Do the block being inserted, and the block it is being inserted after - make a contiguous block of memory? */ - puc = ( uint8_t * ) pxIterator; - if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) - { - pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; - pxBlockToInsert = pxIterator; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Do the block being inserted, and the block it is being inserted before - make a contiguous block of memory? */ - puc = ( uint8_t * ) pxBlockToInsert; - if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) - { - if( pxIterator->pxNextFreeBlock != pxEnd ) - { - /* Form one big block from the two blocks. */ - pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; - pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; - } - else - { - pxBlockToInsert->pxNextFreeBlock = pxEnd; - } - } - else - { - pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; - } - - /* If the block being inserted plugged a gab, so was merged with the block - before and the block after, then it's pxNextFreeBlock pointer will have - already been set, and should not be set here as that would make it point - to itself. */ - if( pxIterator != pxBlockToInsert ) - { - pxIterator->pxNextFreeBlock = pxBlockToInsert; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } -} -/*-----------------------------------------------------------*/ - -void vPortGetHeapStats( HeapStats_t *pxHeapStats ) -{ -BlockLink_t *pxBlock; -size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */ - - vTaskSuspendAll(); - { - pxBlock = xStart.pxNextFreeBlock; - - /* pxBlock will be NULL if the heap has not been initialised. The heap - is initialised automatically when the first allocation is made. */ - if( pxBlock != NULL ) - { - do - { - /* Increment the number of blocks and record the largest block seen - so far. */ - xBlocks++; - - if( pxBlock->xBlockSize > xMaxSize ) - { - xMaxSize = pxBlock->xBlockSize; - } - - if( pxBlock->xBlockSize < xMinSize ) - { - xMinSize = pxBlock->xBlockSize; - } - - /* Move to the next block in the chain until the last block is - reached. */ - pxBlock = pxBlock->pxNextFreeBlock; - } while( pxBlock != pxEnd ); - } - } - xTaskResumeAll(); - - pxHeapStats->xSizeOfLargestFreeBlockInBytes = xMaxSize; - pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize; - pxHeapStats->xNumberOfFreeBlocks = xBlocks; - - taskENTER_CRITICAL(); - { - pxHeapStats->xAvailableHeapSpaceInBytes = xFreeBytesRemaining; - pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations; - pxHeapStats->xNumberOfSuccessfulFrees = xNumberOfSuccessfulFrees; - pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining; - } - taskEXIT_CRITICAL(); -} - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c deleted file mode 100644 index 6cd7542..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c +++ /dev/null @@ -1,788 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/*----------------------------------------------------------- - * Implementation of functions defined in portable.h for the ARM CM4F port. - *----------------------------------------------------------*/ - -/* Scheduler includes. */ -#include "FreeRTOS.h" -#include "task.h" - -#ifndef __TARGET_FPU_VFP - #error This port can only be used when the project options are configured to enable hardware floating point support. -#endif - -#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 - #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html -#endif - -#ifndef configSYSTICK_CLOCK_HZ - #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ - /* Ensure the SysTick is clocked at the same frequency as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) -#else - /* The way the SysTick is clocked is not modified in case it is not the same - as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 0 ) -#endif - -/* Legacy macro for backward compatibility only. This macro used to be used to -replace the function that configures the clock used to generate the tick -interrupt (prvSetupTimerInterrupt()), but now the function is declared weak so -the application writer can override it by simply defining a function of the -same name (vApplicationSetupTickInterrupt()). */ -#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION - #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 -#endif - -/* Constants required to manipulate the core. Registers first... */ -#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) -#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) -#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) -#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) -/* ...then bits in the registers. */ -#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) -#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) -#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) -#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) -#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) - -/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 -r0p1 port. */ -#define portCPUID ( * ( ( volatile uint32_t * ) 0xE000ed00 ) ) -#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) -#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) - -#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) -#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) - -/* Constants required to check the validity of an interrupt priority. */ -#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) -#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) -#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) -#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) -#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) -#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) -#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) -#define portPRIGROUP_SHIFT ( 8UL ) - -/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ -#define portVECTACTIVE_MASK ( 0xFFUL ) - -/* Constants required to manipulate the VFP. */ -#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ -#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) - -/* Constants required to set up the initial stack. */ -#define portINITIAL_XPSR ( 0x01000000 ) -#define portINITIAL_EXC_RETURN ( 0xfffffffd ) - -/* The systick is a 24-bit counter. */ -#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) - -/* A fiddle factor to estimate the number of SysTick counts that would have -occurred while the SysTick counter is stopped during tickless idle -calculations. */ -#define portMISSED_COUNTS_FACTOR ( 45UL ) - -/* For strict compliance with the Cortex-M spec the task start address should -have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ -#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) - -/* - * Setup the timer to generate the tick interrupts. The implementation in this - * file is weak to allow application writers to change the timer used to - * generate the tick interrupt. - */ -void vPortSetupTimerInterrupt( void ); - -/* - * Exception handlers. - */ -void xPortPendSVHandler( void ); -void xPortSysTickHandler( void ); -void vPortSVCHandler( void ); - -/* - * Start first task is a separate function so it can be tested in isolation. - */ -static void prvStartFirstTask( void ); - -/* - * Functions defined in portasm.s to enable the VFP. - */ -static void prvEnableVFP( void ); - -/* - * Used to catch tasks that attempt to return from their implementing function. - */ -static void prvTaskExitError( void ); - -/*-----------------------------------------------------------*/ - -/* Each task maintains its own interrupt status in the critical nesting -variable. */ -static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; - -/* - * The number of SysTick increments that make up one tick period. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulTimerCountsForOneTick = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * The maximum number of tick periods that can be suppressed is limited by the - * 24 bit resolution of the SysTick timer. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t xMaximumPossibleSuppressedTicks = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Compensate for the CPU cycles that pass while the SysTick is stopped (low - * power functionality only. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulStoppedTimerCompensation = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure - * FreeRTOS API functions are not called from interrupts that have been assigned - * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. - */ -#if ( configASSERT_DEFINED == 1 ) - static uint8_t ucMaxSysCallPriority = 0; - static uint32_t ulMaxPRIGROUPValue = 0; - static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; -#endif /* configASSERT_DEFINED */ - -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) -{ - /* Simulate the stack frame as it would be created by a context switch - interrupt. */ - - /* Offset added to account for the way the MCU uses the stack on entry/exit - of interrupts, and to ensure alignment. */ - pxTopOfStack--; - - *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ - pxTopOfStack--; - *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ - pxTopOfStack--; - *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ - - /* Save code space by skipping register initialisation. */ - pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ - *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ - - /* A save method is being used that requires each task to maintain its - own exec return value. */ - pxTopOfStack--; - *pxTopOfStack = portINITIAL_EXC_RETURN; - - pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ - - return pxTopOfStack; -} -/*-----------------------------------------------------------*/ - -static void prvTaskExitError( void ) -{ - /* A function that implements a task must not exit or attempt to return to - its caller as there is nothing to return to. If a task wants to exit it - should instead call vTaskDelete( NULL ). - - Artificially force an assert() to be triggered if configASSERT() is - defined, then stop here so application writers can catch the error. */ - configASSERT( uxCriticalNesting == ~0UL ); - portDISABLE_INTERRUPTS(); - for( ;; ); -} -/*-----------------------------------------------------------*/ - -__asm void vPortSVCHandler( void ) -{ - PRESERVE8 - - /* Get the location of the current TCB. */ - ldr r3, =pxCurrentTCB - ldr r1, [r3] - ldr r0, [r1] - /* Pop the core registers. */ - ldmia r0!, {r4-r11, r14} - msr psp, r0 - isb - mov r0, #0 - msr basepri, r0 - bx r14 -} -/*-----------------------------------------------------------*/ - -__asm void prvStartFirstTask( void ) -{ - PRESERVE8 - - /* Use the NVIC offset register to locate the stack. */ - ldr r0, =0xE000ED08 - ldr r0, [r0] - ldr r0, [r0] - /* Set the msp back to the start of the stack. */ - msr msp, r0 - /* Clear the bit that indicates the FPU is in use in case the FPU was used - before the scheduler was started - which would otherwise result in the - unnecessary leaving of space in the SVC stack for lazy saving of FPU - registers. */ - mov r0, #0 - msr control, r0 - /* Globally enable interrupts. */ - cpsie i - cpsie f - dsb - isb - /* Call SVC to start the first task. */ - svc 0 - nop - nop -} -/*-----------------------------------------------------------*/ - -__asm void prvEnableVFP( void ) -{ - PRESERVE8 - - /* The FPU enable bits are in the CPACR. */ - ldr.w r0, =0xE000ED88 - ldr r1, [r0] - - /* Enable CP10 and CP11 coprocessors, then save back. */ - orr r1, r1, #( 0xf << 20 ) - str r1, [r0] - bx r14 - nop -} -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -BaseType_t xPortStartScheduler( void ) -{ - /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. - See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ - configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); - - /* This port can be used on all revisions of the Cortex-M7 core other than - the r0p1 parts. r0p1 parts should use the port from the - /source/portable/GCC/ARM_CM7/r0p1 directory. */ - configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); - configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); - - #if( configASSERT_DEFINED == 1 ) - { - volatile uint32_t ulOriginalPriority; - volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); - volatile uint8_t ucMaxPriorityValue; - - /* Determine the maximum priority from which ISR safe FreeRTOS API - functions can be called. ISR safe functions are those that end in - "FromISR". FreeRTOS maintains separate thread and ISR API functions to - ensure interrupt entry is as fast and simple as possible. - - Save the interrupt priority value that is about to be clobbered. */ - ulOriginalPriority = *pucFirstUserPriorityRegister; - - /* Determine the number of priority bits available. First write to all - possible bits. */ - *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; - - /* Read the value back to see how many bits stuck. */ - ucMaxPriorityValue = *pucFirstUserPriorityRegister; - - /* The kernel interrupt priority should be set to the lowest - priority. */ - configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & ucMaxPriorityValue ) ); - - /* Use the same mask on the maximum system call priority. */ - ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; - - /* Calculate the maximum acceptable priority group value for the number - of bits read back. */ - ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; - while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) - { - ulMaxPRIGROUPValue--; - ucMaxPriorityValue <<= ( uint8_t ) 0x01; - } - - #ifdef __NVIC_PRIO_BITS - { - /* Check the CMSIS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); - } - #endif - - #ifdef configPRIO_BITS - { - /* Check the FreeRTOS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); - } - #endif - - /* Shift the priority group value back to its position within the AIRCR - register. */ - ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; - ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; - - /* Restore the clobbered interrupt priority register to its original - value. */ - *pucFirstUserPriorityRegister = ulOriginalPriority; - } - #endif /* conifgASSERT_DEFINED */ - - /* Make PendSV and SysTick the lowest priority interrupts. */ - portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; - portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; - - /* Start the timer that generates the tick ISR. Interrupts are disabled - here already. */ - vPortSetupTimerInterrupt(); - - /* Initialise the critical nesting count ready for the first task. */ - uxCriticalNesting = 0; - - /* Ensure the VFP is enabled - it should be anyway. */ - prvEnableVFP(); - - /* Lazy save always. */ - *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; - - /* Start the first task. */ - prvStartFirstTask(); - - /* Should not get here! */ - return 0; -} -/*-----------------------------------------------------------*/ - -void vPortEndScheduler( void ) -{ - /* Not implemented in ports where there is nothing to return to. - Artificially force an assert. */ - configASSERT( uxCriticalNesting == 1000UL ); -} -/*-----------------------------------------------------------*/ - -void vPortEnterCritical( void ) -{ - portDISABLE_INTERRUPTS(); - uxCriticalNesting++; - - /* This is not the interrupt safe version of the enter critical function so - assert() if it is being called from an interrupt context. Only API - functions that end in "FromISR" can be used in an interrupt. Only assert if - the critical nesting count is 1 to protect against recursive calls if the - assert function also uses a critical section. */ - if( uxCriticalNesting == 1 ) - { - configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); - } -} -/*-----------------------------------------------------------*/ - -void vPortExitCritical( void ) -{ - configASSERT( uxCriticalNesting ); - uxCriticalNesting--; - if( uxCriticalNesting == 0 ) - { - portENABLE_INTERRUPTS(); - } -} -/*-----------------------------------------------------------*/ - -__asm void xPortPendSVHandler( void ) -{ - extern uxCriticalNesting; - extern pxCurrentTCB; - extern vTaskSwitchContext; - - PRESERVE8 - - mrs r0, psp - isb - /* Get the location of the current TCB. */ - ldr r3, =pxCurrentTCB - ldr r2, [r3] - - /* Is the task using the FPU context? If so, push high vfp registers. */ - tst r14, #0x10 - it eq - vstmdbeq r0!, {s16-s31} - - /* Save the core registers. */ - stmdb r0!, {r4-r11, r14} - - /* Save the new top of stack into the first member of the TCB. */ - str r0, [r2] - - stmdb sp!, {r0, r3} - mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY - msr basepri, r0 - dsb - isb - bl vTaskSwitchContext - mov r0, #0 - msr basepri, r0 - ldmia sp!, {r0, r3} - - /* The first item in pxCurrentTCB is the task top of stack. */ - ldr r1, [r3] - ldr r0, [r1] - - /* Pop the core registers. */ - ldmia r0!, {r4-r11, r14} - - /* Is the task using the FPU context? If so, pop the high vfp registers - too. */ - tst r14, #0x10 - it eq - vldmiaeq r0!, {s16-s31} - - msr psp, r0 - isb - #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ - #if WORKAROUND_PMU_CM001 == 1 - push { r14 } - pop { pc } - nop - #endif - #endif - - bx r14 -} -/*-----------------------------------------------------------*/ - -void xPortSysTickHandler( void ) -{ - /* The SysTick runs at the lowest interrupt priority, so when this interrupt - executes all interrupts must be unmasked. There is therefore no need to - save and then restore the interrupt mask value as its value is already - known - therefore the slightly faster vPortRaiseBASEPRI() function is used - in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ - vPortRaiseBASEPRI(); - { - /* Increment the RTOS tick. */ - if( xTaskIncrementTick() != pdFALSE ) - { - /* A context switch is required. Context switching is performed in - the PendSV interrupt. Pend the PendSV interrupt. */ - portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; - } - } - vPortClearBASEPRIFromISR(); -} -/*-----------------------------------------------------------*/ - -#if( configUSE_TICKLESS_IDLE == 1 ) - - __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) - { - uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; - TickType_t xModifiableIdleTime; - - /* Make sure the SysTick reload value does not overflow the counter. */ - if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) - { - xExpectedIdleTime = xMaximumPossibleSuppressedTicks; - } - - /* Stop the SysTick momentarily. The time the SysTick is stopped for - is accounted for as best it can be, but using the tickless mode will - inevitably result in some tiny drift of the time maintained by the - kernel with respect to calendar time. */ - portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; - - /* Calculate the reload value required to wait xExpectedIdleTime - tick periods. -1 is used because this code will execute part way - through one of the tick periods. */ - ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); - if( ulReloadValue > ulStoppedTimerCompensation ) - { - ulReloadValue -= ulStoppedTimerCompensation; - } - - /* Enter a critical section but don't use the taskENTER_CRITICAL() - method as that will mask interrupts that should exit sleep mode. */ - __disable_irq(); - __dsb( portSY_FULL_READ_WRITE ); - __isb( portSY_FULL_READ_WRITE ); - - /* If a context switch is pending or a task is waiting for the scheduler - to be unsuspended then abandon the low power entry. */ - if( eTaskConfirmSleepModeStatus() == eAbortSleep ) - { - /* Restart from whatever is left in the count register to complete - this tick period. */ - portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Reset the reload register to the value required for normal tick - periods. */ - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Re-enable interrupts - see comments above __disable_irq() call - above. */ - __enable_irq(); - } - else - { - /* Set the new reload value. */ - portNVIC_SYSTICK_LOAD_REG = ulReloadValue; - - /* Clear the SysTick count flag and set the count value back to - zero. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can - set its parameter to 0 to indicate that its implementation contains - its own wait for interrupt or wait for event instruction, and so wfi - should not be executed again. However, the original expected idle - time variable must remain unmodified, so a copy is taken. */ - xModifiableIdleTime = xExpectedIdleTime; - configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); - if( xModifiableIdleTime > 0 ) - { - __dsb( portSY_FULL_READ_WRITE ); - __wfi(); - __isb( portSY_FULL_READ_WRITE ); - } - configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); - - /* Re-enable interrupts to allow the interrupt that brought the MCU - out of sleep mode to execute immediately. see comments above - __disable_interrupt() call above. */ - __enable_irq(); - __dsb( portSY_FULL_READ_WRITE ); - __isb( portSY_FULL_READ_WRITE ); - - /* Disable interrupts again because the clock is about to be stopped - and interrupts that execute while the clock is stopped will increase - any slippage between the time maintained by the RTOS and calendar - time. */ - __disable_irq(); - __dsb( portSY_FULL_READ_WRITE ); - __isb( portSY_FULL_READ_WRITE ); - - /* Disable the SysTick clock without reading the - portNVIC_SYSTICK_CTRL_REG register to ensure the - portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, - the time the SysTick is stopped for is accounted for as best it can - be, but using the tickless mode will inevitably result in some tiny - drift of the time maintained by the kernel with respect to calendar - time*/ - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); - - /* Determine if the SysTick clock has already counted to zero and - been set back to the current reload value (the reload back being - correct for the entire expected idle time) or if the SysTick is yet - to count to zero (in which case an interrupt other than the SysTick - must have brought the system out of sleep mode). */ - if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) - { - uint32_t ulCalculatedLoadValue; - - /* The tick interrupt is already pending, and the SysTick count - reloaded with ulReloadValue. Reset the - portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick - period. */ - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); - - /* Don't allow a tiny value, or values that have somehow - underflowed because the post sleep hook did something - that took too long. */ - if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) - { - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); - } - - portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; - - /* As the pending tick will be processed as soon as this - function exits, the tick value maintained by the tick is stepped - forward by one less than the time spent waiting. */ - ulCompleteTickPeriods = xExpectedIdleTime - 1UL; - } - else - { - /* Something other than the tick interrupt ended the sleep. - Work out how long the sleep lasted rounded to complete tick - periods (not the ulReload value which accounted for part - ticks). */ - ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* How many complete tick periods passed while the processor - was waiting? */ - ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; - - /* The reload value is set to whatever fraction of a single tick - period remains. */ - portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; - } - - /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG - again, then set portNVIC_SYSTICK_LOAD_REG back to its standard - value. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - vTaskStepTick( ulCompleteTickPeriods ); - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Exit with interrupts enabled. */ - __enable_irq(); - } - } - -#endif /* #if configUSE_TICKLESS_IDLE */ - -/*-----------------------------------------------------------*/ - -/* - * Setup the SysTick timer to generate the tick interrupts at the required - * frequency. - */ -#if( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) - - __weak void vPortSetupTimerInterrupt( void ) - { - /* Calculate the constants required to configure the tick interrupt. */ - #if( configUSE_TICKLESS_IDLE == 1 ) - { - ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); - xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; - ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); - } - #endif /* configUSE_TICKLESS_IDLE */ - - /* Stop and clear the SysTick. */ - portNVIC_SYSTICK_CTRL_REG = 0UL; - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Configure SysTick to interrupt at the requested rate. */ - portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); - } - -#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ -/*-----------------------------------------------------------*/ - -__asm uint32_t vPortGetIPSR( void ) -{ - PRESERVE8 - - mrs r0, ipsr - bx r14 -} -/*-----------------------------------------------------------*/ - -#if( configASSERT_DEFINED == 1 ) - - void vPortValidateInterruptPriority( void ) - { - uint32_t ulCurrentInterrupt; - uint8_t ucCurrentPriority; - - /* Obtain the number of the currently executing interrupt. */ - ulCurrentInterrupt = vPortGetIPSR(); - - /* Is the interrupt number a user defined interrupt? */ - if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) - { - /* Look up the interrupt's priority. */ - ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; - - /* The following assertion will fail if a service routine (ISR) for - an interrupt that has been assigned a priority above - configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API - function. ISR safe FreeRTOS API functions must *only* be called - from interrupts that have been assigned a priority at or below - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Numerically low interrupt priority numbers represent logically high - interrupt priorities, therefore the priority of the interrupt must - be set to a value equal to or numerically *higher* than - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Interrupts that use the FreeRTOS API must not be left at their - default priority of zero as that is the highest possible priority, - which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, - and therefore also guaranteed to be invalid. - - FreeRTOS maintains separate thread and ISR API functions to ensure - interrupt entry is as fast and simple as possible. - - The following links provide detailed information: - http://www.freertos.org/RTOS-Cortex-M3-M4.html - http://www.freertos.org/FAQHelp.html */ - configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); - } - - /* Priority grouping: The interrupt controller (NVIC) allows the bits - that define each interrupt's priority to be split between bits that - define the interrupt's pre-emption priority bits and bits that define - the interrupt's sub-priority. For simplicity all bits must be defined - to be pre-emption priority bits. The following assertion will fail if - this is not the case (if some bits represent a sub-priority). - - If the application only uses CMSIS libraries for interrupt - configuration then the correct setting can be achieved on all Cortex-M - devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the - scheduler. Note however that some vendor specific peripheral libraries - assume a non-zero priority group setting, in which cases using a value - of zero will result in unpredictable behaviour. */ - configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); - } - -#endif /* configASSERT_DEFINED */ - - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/portmacro.h b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/portmacro.h deleted file mode 100644 index 2b07ff1..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/portmacro.h +++ /dev/null @@ -1,252 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - - -#ifndef PORTMACRO_H -#define PORTMACRO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/*----------------------------------------------------------- - * Port specific definitions. - * - * The settings in this file configure FreeRTOS correctly for the - * given hardware and compiler. - * - * These settings should not be altered. - *----------------------------------------------------------- - */ - -/* Type definitions. */ -#define portCHAR char -#define portFLOAT float -#define portDOUBLE double -#define portLONG long -#define portSHORT short -#define portSTACK_TYPE uint32_t -#define portBASE_TYPE long - -typedef portSTACK_TYPE StackType_t; -typedef long BaseType_t; -typedef unsigned long UBaseType_t; - -#if( configUSE_16_BIT_TICKS == 1 ) - typedef uint16_t TickType_t; - #define portMAX_DELAY ( TickType_t ) 0xffff -#else - typedef uint32_t TickType_t; - #define portMAX_DELAY ( TickType_t ) 0xffffffffUL - - /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do - not need to be guarded with a critical section. */ - #define portTICK_TYPE_IS_ATOMIC 1 -#endif -/*-----------------------------------------------------------*/ - -/* Architecture specifics. */ -#define portSTACK_GROWTH ( -1 ) -#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) -#define portBYTE_ALIGNMENT 8 - -/* Constants used with memory barrier intrinsics. */ -#define portSY_FULL_READ_WRITE ( 15 ) - -/*-----------------------------------------------------------*/ - -/* Scheduler utilities. */ -#define portYIELD() \ -{ \ - /* Set a PendSV to request a context switch. */ \ - portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ - \ - /* Barriers are normally not required but do ensure the code is completely \ - within the specified behaviour for the architecture. */ \ - __dsb( portSY_FULL_READ_WRITE ); \ - __isb( portSY_FULL_READ_WRITE ); \ -} -/*-----------------------------------------------------------*/ - -#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) -#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) -#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() -#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) -/*-----------------------------------------------------------*/ - -/* Critical section management. */ -extern void vPortEnterCritical( void ); -extern void vPortExitCritical( void ); - -#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() -#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) -#define portENTER_CRITICAL() vPortEnterCritical() -#define portEXIT_CRITICAL() vPortExitCritical() -#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() -#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) - -/*-----------------------------------------------------------*/ - -/* Tickless idle/low power functionality. */ -#ifndef portSUPPRESS_TICKS_AND_SLEEP - extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); - #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) -#endif -/*-----------------------------------------------------------*/ - -/* Port specific optimisations. */ -#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION - #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 -#endif - -#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 - - /* Check the configuration. */ - #if( configMAX_PRIORITIES > 32 ) - #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. - #endif - - /* Store/clear the ready priorities in a bit map. */ - #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) - #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) - - /*-----------------------------------------------------------*/ - - #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) - -#endif /* taskRECORD_READY_PRIORITY */ -/*-----------------------------------------------------------*/ - -/* Task function macros as described on the FreeRTOS.org WEB site. These are -not necessary for to use this port. They are defined so the common demo files -(which build with all the ports) will build. */ -#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) -#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) -/*-----------------------------------------------------------*/ - -#ifdef configASSERT - void vPortValidateInterruptPriority( void ); - #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() -#endif - -/* portNOP() is not required by this port. */ -#define portNOP() - -#define portINLINE __inline - -#ifndef portFORCE_INLINE - #define portFORCE_INLINE __forceinline -#endif - -/*-----------------------------------------------------------*/ - -static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) -{ - __asm - { - /* Barrier instructions are not used as this function is only used to - lower the BASEPRI value. */ - msr basepri, ulBASEPRI - } -} -/*-----------------------------------------------------------*/ - -static portFORCE_INLINE void vPortRaiseBASEPRI( void ) -{ -uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; - - __asm - { - /* Set BASEPRI to the max syscall priority to effect a critical - section. */ - msr basepri, ulNewBASEPRI - dsb - isb - } -} -/*-----------------------------------------------------------*/ - -static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) -{ - __asm - { - /* Set BASEPRI to 0 so no interrupts are masked. This function is only - used to lower the mask in an interrupt, so memory barriers are not - used. */ - msr basepri, #0 - } -} -/*-----------------------------------------------------------*/ - -static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) -{ -uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; - - __asm - { - /* Set BASEPRI to the max syscall priority to effect a critical - section. */ - mrs ulReturn, basepri - msr basepri, ulNewBASEPRI - dsb - isb - } - - return ulReturn; -} -/*-----------------------------------------------------------*/ - -static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) -{ -uint32_t ulCurrentInterrupt; -BaseType_t xReturn; - - /* Obtain the number of the currently executing interrupt. */ - __asm - { - mrs ulCurrentInterrupt, ipsr - } - - if( ulCurrentInterrupt == 0 ) - { - xReturn = pdFALSE; - } - else - { - xReturn = pdTRUE; - } - - return xReturn; -} - - -#ifdef __cplusplus -} -#endif - -#endif /* PORTMACRO_H */ - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/queue.c b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/queue.c deleted file mode 100644 index b3203b8..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/queue.c +++ /dev/null @@ -1,2945 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#include -#include - -/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining -all the API functions to use the MPU wrappers. That should only be done when -task.h is included from an application file. */ -#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE - -#include "FreeRTOS.h" -#include "task.h" -#include "queue.h" - -#if ( configUSE_CO_ROUTINES == 1 ) - #include "croutine.h" -#endif - -/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified -because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined -for the header files above, but not in this file, in order to generate the -correct privileged Vs unprivileged linkage and placement. */ -#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ - - -/* Constants used with the cRxLock and cTxLock structure members. */ -#define queueUNLOCKED ( ( int8_t ) -1 ) -#define queueLOCKED_UNMODIFIED ( ( int8_t ) 0 ) - -/* When the Queue_t structure is used to represent a base queue its pcHead and -pcTail members are used as pointers into the queue storage area. When the -Queue_t structure is used to represent a mutex pcHead and pcTail pointers are -not necessary, and the pcHead pointer is set to NULL to indicate that the -structure instead holds a pointer to the mutex holder (if any). Map alternative -names to the pcHead and structure member to ensure the readability of the code -is maintained. The QueuePointers_t and SemaphoreData_t types are used to form -a union as their usage is mutually exclusive dependent on what the queue is -being used for. */ -#define uxQueueType pcHead -#define queueQUEUE_IS_MUTEX NULL - -typedef struct QueuePointers -{ - int8_t *pcTail; /*< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ - int8_t *pcReadFrom; /*< Points to the last place that a queued item was read from when the structure is used as a queue. */ -} QueuePointers_t; - -typedef struct SemaphoreData -{ - TaskHandle_t xMutexHolder; /*< The handle of the task that holds the mutex. */ - UBaseType_t uxRecursiveCallCount;/*< Maintains a count of the number of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */ -} SemaphoreData_t; - -/* Semaphores do not actually store or copy data, so have an item size of -zero. */ -#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( UBaseType_t ) 0 ) -#define queueMUTEX_GIVE_BLOCK_TIME ( ( TickType_t ) 0U ) - -#if( configUSE_PREEMPTION == 0 ) - /* If the cooperative scheduler is being used then a yield should not be - performed just because a higher priority task has been woken. */ - #define queueYIELD_IF_USING_PREEMPTION() -#else - #define queueYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() -#endif - -/* - * Definition of the queue used by the scheduler. - * Items are queued by copy, not reference. See the following link for the - * rationale: https://www.freertos.org/Embedded-RTOS-Queues.html - */ -typedef struct QueueDefinition /* The old naming convention is used to prevent breaking kernel aware debuggers. */ -{ - int8_t *pcHead; /*< Points to the beginning of the queue storage area. */ - int8_t *pcWriteTo; /*< Points to the free next place in the storage area. */ - - union - { - QueuePointers_t xQueue; /*< Data required exclusively when this structure is used as a queue. */ - SemaphoreData_t xSemaphore; /*< Data required exclusively when this structure is used as a semaphore. */ - } u; - - List_t xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ - List_t xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ - - volatile UBaseType_t uxMessagesWaiting;/*< The number of items currently in the queue. */ - UBaseType_t uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ - UBaseType_t uxItemSize; /*< The size of each items that the queue will hold. */ - - volatile int8_t cRxLock; /*< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ - volatile int8_t cTxLock; /*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ - - #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the memory used by the queue was statically allocated to ensure no attempt is made to free the memory. */ - #endif - - #if ( configUSE_QUEUE_SETS == 1 ) - struct QueueDefinition *pxQueueSetContainer; - #endif - - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxQueueNumber; - uint8_t ucQueueType; - #endif - -} xQUEUE; - -/* The old xQUEUE name is maintained above then typedefed to the new Queue_t -name below to enable the use of older kernel aware debuggers. */ -typedef xQUEUE Queue_t; - -/*-----------------------------------------------------------*/ - -/* - * The queue registry is just a means for kernel aware debuggers to locate - * queue structures. It has no other purpose so is an optional component. - */ -#if ( configQUEUE_REGISTRY_SIZE > 0 ) - - /* The type stored within the queue registry array. This allows a name - to be assigned to each queue making kernel aware debugging a little - more user friendly. */ - typedef struct QUEUE_REGISTRY_ITEM - { - const char *pcQueueName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - QueueHandle_t xHandle; - } xQueueRegistryItem; - - /* The old xQueueRegistryItem name is maintained above then typedefed to the - new xQueueRegistryItem name below to enable the use of older kernel aware - debuggers. */ - typedef xQueueRegistryItem QueueRegistryItem_t; - - /* The queue registry is simply an array of QueueRegistryItem_t structures. - The pcQueueName member of a structure being NULL is indicative of the - array position being vacant. */ - PRIVILEGED_DATA QueueRegistryItem_t xQueueRegistry[ configQUEUE_REGISTRY_SIZE ]; - -#endif /* configQUEUE_REGISTRY_SIZE */ - -/* - * Unlocks a queue locked by a call to prvLockQueue. Locking a queue does not - * prevent an ISR from adding or removing items to the queue, but does prevent - * an ISR from removing tasks from the queue event lists. If an ISR finds a - * queue is locked it will instead increment the appropriate queue lock count - * to indicate that a task may require unblocking. When the queue in unlocked - * these lock counts are inspected, and the appropriate action taken. - */ -static void prvUnlockQueue( Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; - -/* - * Uses a critical section to determine if there is any data in a queue. - * - * @return pdTRUE if the queue contains no items, otherwise pdFALSE. - */ -static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue ) PRIVILEGED_FUNCTION; - -/* - * Uses a critical section to determine if there is any space in a queue. - * - * @return pdTRUE if there is no space, otherwise pdFALSE; - */ -static BaseType_t prvIsQueueFull( const Queue_t *pxQueue ) PRIVILEGED_FUNCTION; - -/* - * Copies an item into the queue, either at the front of the queue or the - * back of the queue. - */ -static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ) PRIVILEGED_FUNCTION; - -/* - * Copies an item out of a queue. - */ -static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; - -#if ( configUSE_QUEUE_SETS == 1 ) - /* - * Checks to see if a queue is a member of a queue set, and if so, notifies - * the queue set that the queue contains data. - */ - static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; -#endif - -/* - * Called after a Queue_t structure has been allocated either statically or - * dynamically to fill in the structure's members. - */ -static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, const uint8_t ucQueueType, Queue_t *pxNewQueue ) PRIVILEGED_FUNCTION; - -/* - * Mutexes are a special type of queue. When a mutex is created, first the - * queue is created, then prvInitialiseMutex() is called to configure the queue - * as a mutex. - */ -#if( configUSE_MUTEXES == 1 ) - static void prvInitialiseMutex( Queue_t *pxNewQueue ) PRIVILEGED_FUNCTION; -#endif - -#if( configUSE_MUTEXES == 1 ) - /* - * If a task waiting for a mutex causes the mutex holder to inherit a - * priority, but the waiting task times out, then the holder should - * disinherit the priority - but only down to the highest priority of any - * other tasks that are waiting for the same mutex. This function returns - * that priority. - */ - static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; -#endif -/*-----------------------------------------------------------*/ - -/* - * Macro to mark a queue as locked. Locking a queue prevents an ISR from - * accessing the queue event lists. - */ -#define prvLockQueue( pxQueue ) \ - taskENTER_CRITICAL(); \ - { \ - if( ( pxQueue )->cRxLock == queueUNLOCKED ) \ - { \ - ( pxQueue )->cRxLock = queueLOCKED_UNMODIFIED; \ - } \ - if( ( pxQueue )->cTxLock == queueUNLOCKED ) \ - { \ - ( pxQueue )->cTxLock = queueLOCKED_UNMODIFIED; \ - } \ - } \ - taskEXIT_CRITICAL() -/*-----------------------------------------------------------*/ - -BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) -{ -Queue_t * const pxQueue = xQueue; - - configASSERT( pxQueue ); - - taskENTER_CRITICAL(); - { - pxQueue->u.xQueue.pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ - pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U; - pxQueue->pcWriteTo = pxQueue->pcHead; - pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - 1U ) * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ - pxQueue->cRxLock = queueUNLOCKED; - pxQueue->cTxLock = queueUNLOCKED; - - if( xNewQueue == pdFALSE ) - { - /* If there are tasks blocked waiting to read from the queue, then - the tasks will remain blocked as after this function exits the queue - will still be empty. If there are tasks blocked waiting to write to - the queue, then one should be unblocked as after this function exits - it will be possible to write to it. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* Ensure the event queues start in the correct state. */ - vListInitialise( &( pxQueue->xTasksWaitingToSend ) ); - vListInitialise( &( pxQueue->xTasksWaitingToReceive ) ); - } - } - taskEXIT_CRITICAL(); - - /* A value is returned for calling semantic consistency with previous - versions. */ - return pdPASS; -} -/*-----------------------------------------------------------*/ - -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - - QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) - { - Queue_t *pxNewQueue; - - configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); - - /* The StaticQueue_t structure and the queue storage area must be - supplied. */ - configASSERT( pxStaticQueue != NULL ); - - /* A queue storage area should be provided if the item size is not 0, and - should not be provided if the item size is 0. */ - configASSERT( !( ( pucQueueStorage != NULL ) && ( uxItemSize == 0 ) ) ); - configASSERT( !( ( pucQueueStorage == NULL ) && ( uxItemSize != 0 ) ) ); - - #if( configASSERT_DEFINED == 1 ) - { - /* Sanity check that the size of the structure used to declare a - variable of type StaticQueue_t or StaticSemaphore_t equals the size of - the real queue and semaphore structures. */ - volatile size_t xSize = sizeof( StaticQueue_t ); - configASSERT( xSize == sizeof( Queue_t ) ); - ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */ - } - #endif /* configASSERT_DEFINED */ - - /* The address of a statically allocated queue was passed in, use it. - The address of a statically allocated storage area was also passed in - but is already set. */ - pxNewQueue = ( Queue_t * ) pxStaticQueue; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ - - if( pxNewQueue != NULL ) - { - #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - { - /* Queues can be allocated wither statically or dynamically, so - note this queue was allocated statically in case the queue is - later deleted. */ - pxNewQueue->ucStaticallyAllocated = pdTRUE; - } - #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ - - prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); - } - else - { - traceQUEUE_CREATE_FAILED( ucQueueType ); - mtCOVERAGE_TEST_MARKER(); - } - - return pxNewQueue; - } - -#endif /* configSUPPORT_STATIC_ALLOCATION */ -/*-----------------------------------------------------------*/ - -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - - QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) - { - Queue_t *pxNewQueue; - size_t xQueueSizeInBytes; - uint8_t *pucQueueStorage; - - configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); - - /* Allocate enough space to hold the maximum number of items that - can be in the queue at any time. It is valid for uxItemSize to be - zero in the case the queue is used as a semaphore. */ - xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - - /* Allocate the queue and storage area. Justification for MISRA - deviation as follows: pvPortMalloc() always ensures returned memory - blocks are aligned per the requirements of the MCU stack. In this case - pvPortMalloc() must return a pointer that is guaranteed to meet the - alignment requirements of the Queue_t structure - which in this case - is an int8_t *. Therefore, whenever the stack alignment requirements - are greater than or equal to the pointer to char requirements the cast - is safe. In other cases alignment requirements are not strict (one or - two bytes). */ - pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); /*lint !e9087 !e9079 see comment above. */ - - if( pxNewQueue != NULL ) - { - /* Jump past the queue structure to find the location of the queue - storage area. */ - pucQueueStorage = ( uint8_t * ) pxNewQueue; - pucQueueStorage += sizeof( Queue_t ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ - - #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - { - /* Queues can be created either statically or dynamically, so - note this task was created dynamically in case it is later - deleted. */ - pxNewQueue->ucStaticallyAllocated = pdFALSE; - } - #endif /* configSUPPORT_STATIC_ALLOCATION */ - - prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); - } - else - { - traceQUEUE_CREATE_FAILED( ucQueueType ); - mtCOVERAGE_TEST_MARKER(); - } - - return pxNewQueue; - } - -#endif /* configSUPPORT_STATIC_ALLOCATION */ -/*-----------------------------------------------------------*/ - -static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, const uint8_t ucQueueType, Queue_t *pxNewQueue ) -{ - /* Remove compiler warnings about unused parameters should - configUSE_TRACE_FACILITY not be set to 1. */ - ( void ) ucQueueType; - - if( uxItemSize == ( UBaseType_t ) 0 ) - { - /* No RAM was allocated for the queue storage area, but PC head cannot - be set to NULL because NULL is used as a key to say the queue is used as - a mutex. Therefore just set pcHead to point to the queue as a benign - value that is known to be within the memory map. */ - pxNewQueue->pcHead = ( int8_t * ) pxNewQueue; - } - else - { - /* Set the head to the start of the queue storage area. */ - pxNewQueue->pcHead = ( int8_t * ) pucQueueStorage; - } - - /* Initialise the queue members as described where the queue type is - defined. */ - pxNewQueue->uxLength = uxQueueLength; - pxNewQueue->uxItemSize = uxItemSize; - ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); - - #if ( configUSE_TRACE_FACILITY == 1 ) - { - pxNewQueue->ucQueueType = ucQueueType; - } - #endif /* configUSE_TRACE_FACILITY */ - - #if( configUSE_QUEUE_SETS == 1 ) - { - pxNewQueue->pxQueueSetContainer = NULL; - } - #endif /* configUSE_QUEUE_SETS */ - - traceQUEUE_CREATE( pxNewQueue ); -} -/*-----------------------------------------------------------*/ - -#if( configUSE_MUTEXES == 1 ) - - static void prvInitialiseMutex( Queue_t *pxNewQueue ) - { - if( pxNewQueue != NULL ) - { - /* The queue create function will set all the queue structure members - correctly for a generic queue, but this function is creating a - mutex. Overwrite those members that need to be set differently - - in particular the information required for priority inheritance. */ - pxNewQueue->u.xSemaphore.xMutexHolder = NULL; - pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX; - - /* In case this is a recursive mutex. */ - pxNewQueue->u.xSemaphore.uxRecursiveCallCount = 0; - - traceCREATE_MUTEX( pxNewQueue ); - - /* Start with the semaphore in the expected state. */ - ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK ); - } - else - { - traceCREATE_MUTEX_FAILED(); - } - } - -#endif /* configUSE_MUTEXES */ -/*-----------------------------------------------------------*/ - -#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - - QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) - { - QueueHandle_t xNewQueue; - const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; - - xNewQueue = xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType ); - prvInitialiseMutex( ( Queue_t * ) xNewQueue ); - - return xNewQueue; - } - -#endif /* configUSE_MUTEXES */ -/*-----------------------------------------------------------*/ - -#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - - QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) - { - QueueHandle_t xNewQueue; - const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; - - /* Prevent compiler warnings about unused parameters if - configUSE_TRACE_FACILITY does not equal 1. */ - ( void ) ucQueueType; - - xNewQueue = xQueueGenericCreateStatic( uxMutexLength, uxMutexSize, NULL, pxStaticQueue, ucQueueType ); - prvInitialiseMutex( ( Queue_t * ) xNewQueue ); - - return xNewQueue; - } - -#endif /* configUSE_MUTEXES */ -/*-----------------------------------------------------------*/ - -#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) - - TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) - { - TaskHandle_t pxReturn; - Queue_t * const pxSemaphore = ( Queue_t * ) xSemaphore; - - /* This function is called by xSemaphoreGetMutexHolder(), and should not - be called directly. Note: This is a good way of determining if the - calling task is the mutex holder, but not a good way of determining the - identity of the mutex holder, as the holder may change between the - following critical section exiting and the function returning. */ - taskENTER_CRITICAL(); - { - if( pxSemaphore->uxQueueType == queueQUEUE_IS_MUTEX ) - { - pxReturn = pxSemaphore->u.xSemaphore.xMutexHolder; - } - else - { - pxReturn = NULL; - } - } - taskEXIT_CRITICAL(); - - return pxReturn; - } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ - -#endif -/*-----------------------------------------------------------*/ - -#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) - - TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) - { - TaskHandle_t pxReturn; - - configASSERT( xSemaphore ); - - /* Mutexes cannot be used in interrupt service routines, so the mutex - holder should not change in an ISR, and therefore a critical section is - not required here. */ - if( ( ( Queue_t * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX ) - { - pxReturn = ( ( Queue_t * ) xSemaphore )->u.xSemaphore.xMutexHolder; - } - else - { - pxReturn = NULL; - } - - return pxReturn; - } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ - -#endif -/*-----------------------------------------------------------*/ - -#if ( configUSE_RECURSIVE_MUTEXES == 1 ) - - BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) - { - BaseType_t xReturn; - Queue_t * const pxMutex = ( Queue_t * ) xMutex; - - configASSERT( pxMutex ); - - /* If this is the task that holds the mutex then xMutexHolder will not - change outside of this task. If this task does not hold the mutex then - pxMutexHolder can never coincidentally equal the tasks handle, and as - this is the only condition we are interested in it does not matter if - pxMutexHolder is accessed simultaneously by another task. Therefore no - mutual exclusion is required to test the pxMutexHolder variable. */ - if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) - { - traceGIVE_MUTEX_RECURSIVE( pxMutex ); - - /* uxRecursiveCallCount cannot be zero if xMutexHolder is equal to - the task handle, therefore no underflow check is required. Also, - uxRecursiveCallCount is only modified by the mutex holder, and as - there can only be one, no mutual exclusion is required to modify the - uxRecursiveCallCount member. */ - ( pxMutex->u.xSemaphore.uxRecursiveCallCount )--; - - /* Has the recursive call count unwound to 0? */ - if( pxMutex->u.xSemaphore.uxRecursiveCallCount == ( UBaseType_t ) 0 ) - { - /* Return the mutex. This will automatically unblock any other - task that might be waiting to access the mutex. */ - ( void ) xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - xReturn = pdPASS; - } - else - { - /* The mutex cannot be given because the calling task is not the - holder. */ - xReturn = pdFAIL; - - traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ); - } - - return xReturn; - } - -#endif /* configUSE_RECURSIVE_MUTEXES */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_RECURSIVE_MUTEXES == 1 ) - - BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) - { - BaseType_t xReturn; - Queue_t * const pxMutex = ( Queue_t * ) xMutex; - - configASSERT( pxMutex ); - - /* Comments regarding mutual exclusion as per those within - xQueueGiveMutexRecursive(). */ - - traceTAKE_MUTEX_RECURSIVE( pxMutex ); - - if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) - { - ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; - xReturn = pdPASS; - } - else - { - xReturn = xQueueSemaphoreTake( pxMutex, xTicksToWait ); - - /* pdPASS will only be returned if the mutex was successfully - obtained. The calling task may have entered the Blocked state - before reaching here. */ - if( xReturn != pdFAIL ) - { - ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; - } - else - { - traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ); - } - } - - return xReturn; - } - -#endif /* configUSE_RECURSIVE_MUTEXES */ -/*-----------------------------------------------------------*/ - -#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - - QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) - { - QueueHandle_t xHandle; - - configASSERT( uxMaxCount != 0 ); - configASSERT( uxInitialCount <= uxMaxCount ); - - xHandle = xQueueGenericCreateStatic( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticQueue, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); - - if( xHandle != NULL ) - { - ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; - - traceCREATE_COUNTING_SEMAPHORE(); - } - else - { - traceCREATE_COUNTING_SEMAPHORE_FAILED(); - } - - return xHandle; - } - -#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ -/*-----------------------------------------------------------*/ - -#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - - QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) - { - QueueHandle_t xHandle; - - configASSERT( uxMaxCount != 0 ); - configASSERT( uxInitialCount <= uxMaxCount ); - - xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); - - if( xHandle != NULL ) - { - ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; - - traceCREATE_COUNTING_SEMAPHORE(); - } - else - { - traceCREATE_COUNTING_SEMAPHORE_FAILED(); - } - - return xHandle; - } - -#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ -/*-----------------------------------------------------------*/ - -BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) -{ -BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired; -TimeOut_t xTimeOut; -Queue_t * const pxQueue = xQueue; - - configASSERT( pxQueue ); - configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); - configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); - #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - { - configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); - } - #endif - - - /*lint -save -e904 This function relaxes the coding standard somewhat to - allow return statements within the function itself. This is done in the - interest of execution time efficiency. */ - for( ;; ) - { - taskENTER_CRITICAL(); - { - /* Is there room on the queue now? The running task must be the - highest priority task wanting to access the queue. If the head item - in the queue is to be overwritten then it does not matter if the - queue is full. */ - if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) - { - traceQUEUE_SEND( pxQueue ); - - #if ( configUSE_QUEUE_SETS == 1 ) - { - const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; - - xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); - - if( pxQueue->pxQueueSetContainer != NULL ) - { - if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) - { - /* Do not notify the queue set as an existing item - was overwritten in the queue so the number of items - in the queue has not changed. */ - mtCOVERAGE_TEST_MARKER(); - } - else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) - { - /* The queue is a member of a queue set, and posting - to the queue set caused a higher priority task to - unblock. A context switch is required. */ - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* If there was a task waiting for data to arrive on the - queue then unblock it now. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The unblocked task has a priority higher than - our own so yield immediately. Yes it is ok to - do this from within the critical section - the - kernel takes care of that. */ - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else if( xYieldRequired != pdFALSE ) - { - /* This path is a special case that will only get - executed if the task was holding multiple mutexes - and the mutexes were given back in an order that is - different to that in which they were taken. */ - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - #else /* configUSE_QUEUE_SETS */ - { - xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); - - /* If there was a task waiting for data to arrive on the - queue then unblock it now. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The unblocked task has a priority higher than - our own so yield immediately. Yes it is ok to do - this from within the critical section - the kernel - takes care of that. */ - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else if( xYieldRequired != pdFALSE ) - { - /* This path is a special case that will only get - executed if the task was holding multiple mutexes and - the mutexes were given back in an order that is - different to that in which they were taken. */ - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_QUEUE_SETS */ - - taskEXIT_CRITICAL(); - return pdPASS; - } - else - { - if( xTicksToWait == ( TickType_t ) 0 ) - { - /* The queue was full and no block time is specified (or - the block time has expired) so leave now. */ - taskEXIT_CRITICAL(); - - /* Return to the original privilege level before exiting - the function. */ - traceQUEUE_SEND_FAILED( pxQueue ); - return errQUEUE_FULL; - } - else if( xEntryTimeSet == pdFALSE ) - { - /* The queue was full and a block time was specified so - configure the timeout structure. */ - vTaskInternalSetTimeOutState( &xTimeOut ); - xEntryTimeSet = pdTRUE; - } - else - { - /* Entry time was already set. */ - mtCOVERAGE_TEST_MARKER(); - } - } - } - taskEXIT_CRITICAL(); - - /* Interrupts and other tasks can send to and receive from the queue - now the critical section has been exited. */ - - vTaskSuspendAll(); - prvLockQueue( pxQueue ); - - /* Update the timeout state to see if it has expired yet. */ - if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) - { - if( prvIsQueueFull( pxQueue ) != pdFALSE ) - { - traceBLOCKING_ON_QUEUE_SEND( pxQueue ); - vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); - - /* Unlocking the queue means queue events can effect the - event list. It is possible that interrupts occurring now - remove this task from the event list again - but as the - scheduler is suspended the task will go onto the pending - ready last instead of the actual ready list. */ - prvUnlockQueue( pxQueue ); - - /* Resuming the scheduler will move tasks from the pending - ready list into the ready list - so it is feasible that this - task is already in a ready list before it yields - in which - case the yield will not cause a context switch unless there - is also a higher priority task in the pending ready list. */ - if( xTaskResumeAll() == pdFALSE ) - { - portYIELD_WITHIN_API(); - } - } - else - { - /* Try again. */ - prvUnlockQueue( pxQueue ); - ( void ) xTaskResumeAll(); - } - } - else - { - /* The timeout has expired. */ - prvUnlockQueue( pxQueue ); - ( void ) xTaskResumeAll(); - - traceQUEUE_SEND_FAILED( pxQueue ); - return errQUEUE_FULL; - } - } /*lint -restore */ -} -/*-----------------------------------------------------------*/ - -BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) -{ -BaseType_t xReturn; -UBaseType_t uxSavedInterruptStatus; -Queue_t * const pxQueue = xQueue; - - configASSERT( pxQueue ); - configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); - configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); - - /* RTOS ports that support interrupt nesting have the concept of a maximum - system call (or maximum API call) interrupt priority. Interrupts that are - above the maximum system call priority are kept permanently enabled, even - when the RTOS kernel is in a critical section, but cannot make any calls to - FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h - then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has been - assigned a priority above the configured maximum system call priority. - Only FreeRTOS functions that end in FromISR can be called from interrupts - that have been assigned a priority at or (logically) below the maximum - system call interrupt priority. FreeRTOS maintains a separate interrupt - safe API to ensure interrupt entry is as fast and as simple as possible. - More information (albeit Cortex-M specific) is provided on the following - link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - - /* Similar to xQueueGenericSend, except without blocking if there is no room - in the queue. Also don't directly wake a task that was blocked on a queue - read, instead return a flag to say whether a context switch is required or - not (i.e. has a task with a higher priority than us been woken by this - post). */ - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - { - if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) - { - const int8_t cTxLock = pxQueue->cTxLock; - const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; - - traceQUEUE_SEND_FROM_ISR( pxQueue ); - - /* Semaphores use xQueueGiveFromISR(), so pxQueue will not be a - semaphore or mutex. That means prvCopyDataToQueue() cannot result - in a task disinheriting a priority and prvCopyDataToQueue() can be - called here even though the disinherit function does not check if - the scheduler is suspended before accessing the ready lists. */ - ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); - - /* The event list is not altered if the queue is locked. This will - be done when the queue is unlocked later. */ - if( cTxLock == queueUNLOCKED ) - { - #if ( configUSE_QUEUE_SETS == 1 ) - { - if( pxQueue->pxQueueSetContainer != NULL ) - { - if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) - { - /* Do not notify the queue set as an existing item - was overwritten in the queue so the number of items - in the queue has not changed. */ - mtCOVERAGE_TEST_MARKER(); - } - else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) - { - /* The queue is a member of a queue set, and posting - to the queue set caused a higher priority task to - unblock. A context switch is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so - record that a context switch is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - #else /* configUSE_QUEUE_SETS */ - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so record that a - context switch is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Not used in this path. */ - ( void ) uxPreviousMessagesWaiting; - } - #endif /* configUSE_QUEUE_SETS */ - } - else - { - /* Increment the lock count so the task that unlocks the queue - knows that data was posted while it was locked. */ - pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); - } - - xReturn = pdPASS; - } - else - { - traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); - xReturn = errQUEUE_FULL; - } - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) -{ -BaseType_t xReturn; -UBaseType_t uxSavedInterruptStatus; -Queue_t * const pxQueue = xQueue; - - /* Similar to xQueueGenericSendFromISR() but used with semaphores where the - item size is 0. Don't directly wake a task that was blocked on a queue - read, instead return a flag to say whether a context switch is required or - not (i.e. has a task with a higher priority than us been woken by this - post). */ - - configASSERT( pxQueue ); - - /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR() - if the item size is not 0. */ - configASSERT( pxQueue->uxItemSize == 0 ); - - /* Normally a mutex would not be given from an interrupt, especially if - there is a mutex holder, as priority inheritance makes no sense for an - interrupts, only tasks. */ - configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->u.xSemaphore.xMutexHolder != NULL ) ) ); - - /* RTOS ports that support interrupt nesting have the concept of a maximum - system call (or maximum API call) interrupt priority. Interrupts that are - above the maximum system call priority are kept permanently enabled, even - when the RTOS kernel is in a critical section, but cannot make any calls to - FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h - then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has been - assigned a priority above the configured maximum system call priority. - Only FreeRTOS functions that end in FromISR can be called from interrupts - that have been assigned a priority at or (logically) below the maximum - system call interrupt priority. FreeRTOS maintains a separate interrupt - safe API to ensure interrupt entry is as fast and as simple as possible. - More information (albeit Cortex-M specific) is provided on the following - link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - { - const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; - - /* When the queue is used to implement a semaphore no data is ever - moved through the queue but it is still valid to see if the queue 'has - space'. */ - if( uxMessagesWaiting < pxQueue->uxLength ) - { - const int8_t cTxLock = pxQueue->cTxLock; - - traceQUEUE_SEND_FROM_ISR( pxQueue ); - - /* A task can only have an inherited priority if it is a mutex - holder - and if there is a mutex holder then the mutex cannot be - given from an ISR. As this is the ISR version of the function it - can be assumed there is no mutex holder and no need to determine if - priority disinheritance is needed. Simply increase the count of - messages (semaphores) available. */ - pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1; - - /* The event list is not altered if the queue is locked. This will - be done when the queue is unlocked later. */ - if( cTxLock == queueUNLOCKED ) - { - #if ( configUSE_QUEUE_SETS == 1 ) - { - if( pxQueue->pxQueueSetContainer != NULL ) - { - if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) - { - /* The semaphore is a member of a queue set, and - posting to the queue set caused a higher priority - task to unblock. A context switch is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so - record that a context switch is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - #else /* configUSE_QUEUE_SETS */ - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so record that a - context switch is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_QUEUE_SETS */ - } - else - { - /* Increment the lock count so the task that unlocks the queue - knows that data was posted while it was locked. */ - pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); - } - - xReturn = pdPASS; - } - else - { - traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); - xReturn = errQUEUE_FULL; - } - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) -{ -BaseType_t xEntryTimeSet = pdFALSE; -TimeOut_t xTimeOut; -Queue_t * const pxQueue = xQueue; - - /* Check the pointer is not NULL. */ - configASSERT( ( pxQueue ) ); - - /* The buffer into which data is received can only be NULL if the data size - is zero (so no data is copied into the buffer. */ - configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); - - /* Cannot block if the scheduler is suspended. */ - #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - { - configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); - } - #endif - - - /*lint -save -e904 This function relaxes the coding standard somewhat to - allow return statements within the function itself. This is done in the - interest of execution time efficiency. */ - for( ;; ) - { - taskENTER_CRITICAL(); - { - const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; - - /* Is there data in the queue now? To be running the calling task - must be the highest priority task wanting to access the queue. */ - if( uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - /* Data available, remove one item. */ - prvCopyDataFromQueue( pxQueue, pvBuffer ); - traceQUEUE_RECEIVE( pxQueue ); - pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; - - /* There is now space in the queue, were any tasks waiting to - post to the queue? If so, unblock the highest priority waiting - task. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - taskEXIT_CRITICAL(); - return pdPASS; - } - else - { - if( xTicksToWait == ( TickType_t ) 0 ) - { - /* The queue was empty and no block time is specified (or - the block time has expired) so leave now. */ - taskEXIT_CRITICAL(); - traceQUEUE_RECEIVE_FAILED( pxQueue ); - return errQUEUE_EMPTY; - } - else if( xEntryTimeSet == pdFALSE ) - { - /* The queue was empty and a block time was specified so - configure the timeout structure. */ - vTaskInternalSetTimeOutState( &xTimeOut ); - xEntryTimeSet = pdTRUE; - } - else - { - /* Entry time was already set. */ - mtCOVERAGE_TEST_MARKER(); - } - } - } - taskEXIT_CRITICAL(); - - /* Interrupts and other tasks can send to and receive from the queue - now the critical section has been exited. */ - - vTaskSuspendAll(); - prvLockQueue( pxQueue ); - - /* Update the timeout state to see if it has expired yet. */ - if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) - { - /* The timeout has not expired. If the queue is still empty place - the task on the list of tasks waiting to receive from the queue. */ - if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) - { - traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); - vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); - prvUnlockQueue( pxQueue ); - if( xTaskResumeAll() == pdFALSE ) - { - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* The queue contains data again. Loop back to try and read the - data. */ - prvUnlockQueue( pxQueue ); - ( void ) xTaskResumeAll(); - } - } - else - { - /* Timed out. If there is no data in the queue exit, otherwise loop - back and attempt to read the data. */ - prvUnlockQueue( pxQueue ); - ( void ) xTaskResumeAll(); - - if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) - { - traceQUEUE_RECEIVE_FAILED( pxQueue ); - return errQUEUE_EMPTY; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } /*lint -restore */ -} -/*-----------------------------------------------------------*/ - -BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) -{ -BaseType_t xEntryTimeSet = pdFALSE; -TimeOut_t xTimeOut; -Queue_t * const pxQueue = xQueue; - -#if( configUSE_MUTEXES == 1 ) - BaseType_t xInheritanceOccurred = pdFALSE; -#endif - - /* Check the queue pointer is not NULL. */ - configASSERT( ( pxQueue ) ); - - /* Check this really is a semaphore, in which case the item size will be - 0. */ - configASSERT( pxQueue->uxItemSize == 0 ); - - /* Cannot block if the scheduler is suspended. */ - #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - { - configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); - } - #endif - - - /*lint -save -e904 This function relaxes the coding standard somewhat to allow return - statements within the function itself. This is done in the interest - of execution time efficiency. */ - for( ;; ) - { - taskENTER_CRITICAL(); - { - /* Semaphores are queues with an item size of 0, and where the - number of messages in the queue is the semaphore's count value. */ - const UBaseType_t uxSemaphoreCount = pxQueue->uxMessagesWaiting; - - /* Is there data in the queue now? To be running the calling task - must be the highest priority task wanting to access the queue. */ - if( uxSemaphoreCount > ( UBaseType_t ) 0 ) - { - traceQUEUE_RECEIVE( pxQueue ); - - /* Semaphores are queues with a data size of zero and where the - messages waiting is the semaphore's count. Reduce the count. */ - pxQueue->uxMessagesWaiting = uxSemaphoreCount - ( UBaseType_t ) 1; - - #if ( configUSE_MUTEXES == 1 ) - { - if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) - { - /* Record the information required to implement - priority inheritance should it become necessary. */ - pxQueue->u.xSemaphore.xMutexHolder = pvTaskIncrementMutexHeldCount(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_MUTEXES */ - - /* Check to see if other tasks are blocked waiting to give the - semaphore, and if so, unblock the highest priority such task. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - taskEXIT_CRITICAL(); - return pdPASS; - } - else - { - if( xTicksToWait == ( TickType_t ) 0 ) - { - /* For inheritance to have occurred there must have been an - initial timeout, and an adjusted timeout cannot become 0, as - if it were 0 the function would have exited. */ - #if( configUSE_MUTEXES == 1 ) - { - configASSERT( xInheritanceOccurred == pdFALSE ); - } - #endif /* configUSE_MUTEXES */ - - /* The semaphore count was 0 and no block time is specified - (or the block time has expired) so exit now. */ - taskEXIT_CRITICAL(); - traceQUEUE_RECEIVE_FAILED( pxQueue ); - return errQUEUE_EMPTY; - } - else if( xEntryTimeSet == pdFALSE ) - { - /* The semaphore count was 0 and a block time was specified - so configure the timeout structure ready to block. */ - vTaskInternalSetTimeOutState( &xTimeOut ); - xEntryTimeSet = pdTRUE; - } - else - { - /* Entry time was already set. */ - mtCOVERAGE_TEST_MARKER(); - } - } - } - taskEXIT_CRITICAL(); - - /* Interrupts and other tasks can give to and take from the semaphore - now the critical section has been exited. */ - - vTaskSuspendAll(); - prvLockQueue( pxQueue ); - - /* Update the timeout state to see if it has expired yet. */ - if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) - { - /* A block time is specified and not expired. If the semaphore - count is 0 then enter the Blocked state to wait for a semaphore to - become available. As semaphores are implemented with queues the - queue being empty is equivalent to the semaphore count being 0. */ - if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) - { - traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); - - #if ( configUSE_MUTEXES == 1 ) - { - if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) - { - taskENTER_CRITICAL(); - { - xInheritanceOccurred = xTaskPriorityInherit( pxQueue->u.xSemaphore.xMutexHolder ); - } - taskEXIT_CRITICAL(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif - - vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); - prvUnlockQueue( pxQueue ); - if( xTaskResumeAll() == pdFALSE ) - { - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* There was no timeout and the semaphore count was not 0, so - attempt to take the semaphore again. */ - prvUnlockQueue( pxQueue ); - ( void ) xTaskResumeAll(); - } - } - else - { - /* Timed out. */ - prvUnlockQueue( pxQueue ); - ( void ) xTaskResumeAll(); - - /* If the semaphore count is 0 exit now as the timeout has - expired. Otherwise return to attempt to take the semaphore that is - known to be available. As semaphores are implemented by queues the - queue being empty is equivalent to the semaphore count being 0. */ - if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) - { - #if ( configUSE_MUTEXES == 1 ) - { - /* xInheritanceOccurred could only have be set if - pxQueue->uxQueueType == queueQUEUE_IS_MUTEX so no need to - test the mutex type again to check it is actually a mutex. */ - if( xInheritanceOccurred != pdFALSE ) - { - taskENTER_CRITICAL(); - { - UBaseType_t uxHighestWaitingPriority; - - /* This task blocking on the mutex caused another - task to inherit this task's priority. Now this task - has timed out the priority should be disinherited - again, but only as low as the next highest priority - task that is waiting for the same mutex. */ - uxHighestWaitingPriority = prvGetDisinheritPriorityAfterTimeout( pxQueue ); - vTaskPriorityDisinheritAfterTimeout( pxQueue->u.xSemaphore.xMutexHolder, uxHighestWaitingPriority ); - } - taskEXIT_CRITICAL(); - } - } - #endif /* configUSE_MUTEXES */ - - traceQUEUE_RECEIVE_FAILED( pxQueue ); - return errQUEUE_EMPTY; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } /*lint -restore */ -} -/*-----------------------------------------------------------*/ - -BaseType_t xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) -{ -BaseType_t xEntryTimeSet = pdFALSE; -TimeOut_t xTimeOut; -int8_t *pcOriginalReadPosition; -Queue_t * const pxQueue = xQueue; - - /* Check the pointer is not NULL. */ - configASSERT( ( pxQueue ) ); - - /* The buffer into which data is received can only be NULL if the data size - is zero (so no data is copied into the buffer. */ - configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); - - /* Cannot block if the scheduler is suspended. */ - #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - { - configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); - } - #endif - - - /*lint -save -e904 This function relaxes the coding standard somewhat to - allow return statements within the function itself. This is done in the - interest of execution time efficiency. */ - for( ;; ) - { - taskENTER_CRITICAL(); - { - const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; - - /* Is there data in the queue now? To be running the calling task - must be the highest priority task wanting to access the queue. */ - if( uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - /* Remember the read position so it can be reset after the data - is read from the queue as this function is only peeking the - data, not removing it. */ - pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; - - prvCopyDataFromQueue( pxQueue, pvBuffer ); - traceQUEUE_PEEK( pxQueue ); - - /* The data is not being removed, so reset the read pointer. */ - pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; - - /* The data is being left in the queue, so see if there are - any other tasks waiting for the data. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority than this task. */ - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - taskEXIT_CRITICAL(); - return pdPASS; - } - else - { - if( xTicksToWait == ( TickType_t ) 0 ) - { - /* The queue was empty and no block time is specified (or - the block time has expired) so leave now. */ - taskEXIT_CRITICAL(); - traceQUEUE_PEEK_FAILED( pxQueue ); - return errQUEUE_EMPTY; - } - else if( xEntryTimeSet == pdFALSE ) - { - /* The queue was empty and a block time was specified so - configure the timeout structure ready to enter the blocked - state. */ - vTaskInternalSetTimeOutState( &xTimeOut ); - xEntryTimeSet = pdTRUE; - } - else - { - /* Entry time was already set. */ - mtCOVERAGE_TEST_MARKER(); - } - } - } - taskEXIT_CRITICAL(); - - /* Interrupts and other tasks can send to and receive from the queue - now the critical section has been exited. */ - - vTaskSuspendAll(); - prvLockQueue( pxQueue ); - - /* Update the timeout state to see if it has expired yet. */ - if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) - { - /* Timeout has not expired yet, check to see if there is data in the - queue now, and if not enter the Blocked state to wait for data. */ - if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) - { - traceBLOCKING_ON_QUEUE_PEEK( pxQueue ); - vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); - prvUnlockQueue( pxQueue ); - if( xTaskResumeAll() == pdFALSE ) - { - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* There is data in the queue now, so don't enter the blocked - state, instead return to try and obtain the data. */ - prvUnlockQueue( pxQueue ); - ( void ) xTaskResumeAll(); - } - } - else - { - /* The timeout has expired. If there is still no data in the queue - exit, otherwise go back and try to read the data again. */ - prvUnlockQueue( pxQueue ); - ( void ) xTaskResumeAll(); - - if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) - { - traceQUEUE_PEEK_FAILED( pxQueue ); - return errQUEUE_EMPTY; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } /*lint -restore */ -} -/*-----------------------------------------------------------*/ - -BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) -{ -BaseType_t xReturn; -UBaseType_t uxSavedInterruptStatus; -Queue_t * const pxQueue = xQueue; - - configASSERT( pxQueue ); - configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); - - /* RTOS ports that support interrupt nesting have the concept of a maximum - system call (or maximum API call) interrupt priority. Interrupts that are - above the maximum system call priority are kept permanently enabled, even - when the RTOS kernel is in a critical section, but cannot make any calls to - FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h - then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has been - assigned a priority above the configured maximum system call priority. - Only FreeRTOS functions that end in FromISR can be called from interrupts - that have been assigned a priority at or (logically) below the maximum - system call interrupt priority. FreeRTOS maintains a separate interrupt - safe API to ensure interrupt entry is as fast and as simple as possible. - More information (albeit Cortex-M specific) is provided on the following - link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - { - const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; - - /* Cannot block in an ISR, so check there is data available. */ - if( uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - const int8_t cRxLock = pxQueue->cRxLock; - - traceQUEUE_RECEIVE_FROM_ISR( pxQueue ); - - prvCopyDataFromQueue( pxQueue, pvBuffer ); - pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; - - /* If the queue is locked the event list will not be modified. - Instead update the lock count so the task that unlocks the queue - will know that an ISR has removed data while the queue was - locked. */ - if( cRxLock == queueUNLOCKED ) - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - /* The task waiting has a higher priority than us so - force a context switch. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* Increment the lock count so the task that unlocks the queue - knows that data was removed while it was locked. */ - pxQueue->cRxLock = ( int8_t ) ( cRxLock + 1 ); - } - - xReturn = pdPASS; - } - else - { - xReturn = pdFAIL; - traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ); - } - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) -{ -BaseType_t xReturn; -UBaseType_t uxSavedInterruptStatus; -int8_t *pcOriginalReadPosition; -Queue_t * const pxQueue = xQueue; - - configASSERT( pxQueue ); - configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); - configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */ - - /* RTOS ports that support interrupt nesting have the concept of a maximum - system call (or maximum API call) interrupt priority. Interrupts that are - above the maximum system call priority are kept permanently enabled, even - when the RTOS kernel is in a critical section, but cannot make any calls to - FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h - then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has been - assigned a priority above the configured maximum system call priority. - Only FreeRTOS functions that end in FromISR can be called from interrupts - that have been assigned a priority at or (logically) below the maximum - system call interrupt priority. FreeRTOS maintains a separate interrupt - safe API to ensure interrupt entry is as fast and as simple as possible. - More information (albeit Cortex-M specific) is provided on the following - link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - { - /* Cannot block in an ISR, so check there is data available. */ - if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - traceQUEUE_PEEK_FROM_ISR( pxQueue ); - - /* Remember the read position so it can be reset as nothing is - actually being removed from the queue. */ - pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; - prvCopyDataFromQueue( pxQueue, pvBuffer ); - pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; - - xReturn = pdPASS; - } - else - { - xReturn = pdFAIL; - traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ); - } - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) -{ -UBaseType_t uxReturn; - - configASSERT( xQueue ); - - taskENTER_CRITICAL(); - { - uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; - } - taskEXIT_CRITICAL(); - - return uxReturn; -} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ -/*-----------------------------------------------------------*/ - -UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) -{ -UBaseType_t uxReturn; -Queue_t * const pxQueue = xQueue; - - configASSERT( pxQueue ); - - taskENTER_CRITICAL(); - { - uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting; - } - taskEXIT_CRITICAL(); - - return uxReturn; -} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ -/*-----------------------------------------------------------*/ - -UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) -{ -UBaseType_t uxReturn; -Queue_t * const pxQueue = xQueue; - - configASSERT( pxQueue ); - uxReturn = pxQueue->uxMessagesWaiting; - - return uxReturn; -} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ -/*-----------------------------------------------------------*/ - -void vQueueDelete( QueueHandle_t xQueue ) -{ -Queue_t * const pxQueue = xQueue; - - configASSERT( pxQueue ); - traceQUEUE_DELETE( pxQueue ); - - #if ( configQUEUE_REGISTRY_SIZE > 0 ) - { - vQueueUnregisterQueue( pxQueue ); - } - #endif - - #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) - { - /* The queue can only have been allocated dynamically - free it - again. */ - vPortFree( pxQueue ); - } - #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - { - /* The queue could have been allocated statically or dynamically, so - check before attempting to free the memory. */ - if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) - { - vPortFree( pxQueue ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #else - { - /* The queue must have been statically allocated, so is not going to be - deleted. Avoid compiler warnings about the unused parameter. */ - ( void ) pxQueue; - } - #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ -} -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) - { - return ( ( Queue_t * ) xQueue )->uxQueueNumber; - } - -#endif /* configUSE_TRACE_FACILITY */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) - { - ( ( Queue_t * ) xQueue )->uxQueueNumber = uxQueueNumber; - } - -#endif /* configUSE_TRACE_FACILITY */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) - { - return ( ( Queue_t * ) xQueue )->ucQueueType; - } - -#endif /* configUSE_TRACE_FACILITY */ -/*-----------------------------------------------------------*/ - -#if( configUSE_MUTEXES == 1 ) - - static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) - { - UBaseType_t uxHighestPriorityOfWaitingTasks; - - /* If a task waiting for a mutex causes the mutex holder to inherit a - priority, but the waiting task times out, then the holder should - disinherit the priority - but only down to the highest priority of any - other tasks that are waiting for the same mutex. For this purpose, - return the priority of the highest priority task that is waiting for the - mutex. */ - if( listCURRENT_LIST_LENGTH( &( pxQueue->xTasksWaitingToReceive ) ) > 0U ) - { - uxHighestPriorityOfWaitingTasks = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) listGET_ITEM_VALUE_OF_HEAD_ENTRY( &( pxQueue->xTasksWaitingToReceive ) ); - } - else - { - uxHighestPriorityOfWaitingTasks = tskIDLE_PRIORITY; - } - - return uxHighestPriorityOfWaitingTasks; - } - -#endif /* configUSE_MUTEXES */ -/*-----------------------------------------------------------*/ - -static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ) -{ -BaseType_t xReturn = pdFALSE; -UBaseType_t uxMessagesWaiting; - - /* This function is called from a critical section. */ - - uxMessagesWaiting = pxQueue->uxMessagesWaiting; - - if( pxQueue->uxItemSize == ( UBaseType_t ) 0 ) - { - #if ( configUSE_MUTEXES == 1 ) - { - if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) - { - /* The mutex is no longer being held. */ - xReturn = xTaskPriorityDisinherit( pxQueue->u.xSemaphore.xMutexHolder ); - pxQueue->u.xSemaphore.xMutexHolder = NULL; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_MUTEXES */ - } - else if( xPosition == queueSEND_TO_BACK ) - { - ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports, plus previous logic ensures a null pointer can only be passed to memcpy() if the copy size is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ - pxQueue->pcWriteTo += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ - if( pxQueue->pcWriteTo >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ - { - pxQueue->pcWriteTo = pxQueue->pcHead; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - ( void ) memcpy( ( void * ) pxQueue->u.xQueue.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e9087 !e418 MISRA exception as the casts are only redundant for some ports. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. Assert checks null pointer only used when length is 0. */ - pxQueue->u.xQueue.pcReadFrom -= pxQueue->uxItemSize; - if( pxQueue->u.xQueue.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ - { - pxQueue->u.xQueue.pcReadFrom = ( pxQueue->u.xQueue.pcTail - pxQueue->uxItemSize ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - if( xPosition == queueOVERWRITE ) - { - if( uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - /* An item is not being added but overwritten, so subtract - one from the recorded number of items in the queue so when - one is added again below the number of recorded items remains - correct. */ - --uxMessagesWaiting; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - - pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1; - - return xReturn; -} -/*-----------------------------------------------------------*/ - -static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ) -{ - if( pxQueue->uxItemSize != ( UBaseType_t ) 0 ) - { - pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ - if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */ - { - pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports. Also previous logic ensures a null pointer can only be passed to memcpy() when the count is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ - } -} -/*-----------------------------------------------------------*/ - -static void prvUnlockQueue( Queue_t * const pxQueue ) -{ - /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ - - /* The lock counts contains the number of extra data items placed or - removed from the queue while the queue was locked. When a queue is - locked items can be added or removed, but the event lists cannot be - updated. */ - taskENTER_CRITICAL(); - { - int8_t cTxLock = pxQueue->cTxLock; - - /* See if data was added to the queue while it was locked. */ - while( cTxLock > queueLOCKED_UNMODIFIED ) - { - /* Data was posted while the queue was locked. Are any tasks - blocked waiting for data to become available? */ - #if ( configUSE_QUEUE_SETS == 1 ) - { - if( pxQueue->pxQueueSetContainer != NULL ) - { - if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) - { - /* The queue is a member of a queue set, and posting to - the queue set caused a higher priority task to unblock. - A context switch is required. */ - vTaskMissedYield(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* Tasks that are removed from the event list will get - added to the pending ready list as the scheduler is still - suspended. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so record that a - context switch is required. */ - vTaskMissedYield(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - break; - } - } - } - #else /* configUSE_QUEUE_SETS */ - { - /* Tasks that are removed from the event list will get added to - the pending ready list as the scheduler is still suspended. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so record that - a context switch is required. */ - vTaskMissedYield(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - break; - } - } - #endif /* configUSE_QUEUE_SETS */ - - --cTxLock; - } - - pxQueue->cTxLock = queueUNLOCKED; - } - taskEXIT_CRITICAL(); - - /* Do the same for the Rx lock. */ - taskENTER_CRITICAL(); - { - int8_t cRxLock = pxQueue->cRxLock; - - while( cRxLock > queueLOCKED_UNMODIFIED ) - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - vTaskMissedYield(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - --cRxLock; - } - else - { - break; - } - } - - pxQueue->cRxLock = queueUNLOCKED; - } - taskEXIT_CRITICAL(); -} -/*-----------------------------------------------------------*/ - -static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue ) -{ -BaseType_t xReturn; - - taskENTER_CRITICAL(); - { - if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - } - taskEXIT_CRITICAL(); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) -{ -BaseType_t xReturn; -Queue_t * const pxQueue = xQueue; - - configASSERT( pxQueue ); - if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - - return xReturn; -} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ -/*-----------------------------------------------------------*/ - -static BaseType_t prvIsQueueFull( const Queue_t *pxQueue ) -{ -BaseType_t xReturn; - - taskENTER_CRITICAL(); - { - if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - } - taskEXIT_CRITICAL(); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) -{ -BaseType_t xReturn; -Queue_t * const pxQueue = xQueue; - - configASSERT( pxQueue ); - if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - - return xReturn; -} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_CO_ROUTINES == 1 ) - - BaseType_t xQueueCRSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait ) - { - BaseType_t xReturn; - Queue_t * const pxQueue = xQueue; - - /* If the queue is already full we may have to block. A critical section - is required to prevent an interrupt removing something from the queue - between the check to see if the queue is full and blocking on the queue. */ - portDISABLE_INTERRUPTS(); - { - if( prvIsQueueFull( pxQueue ) != pdFALSE ) - { - /* The queue is full - do we want to block or just leave without - posting? */ - if( xTicksToWait > ( TickType_t ) 0 ) - { - /* As this is called from a coroutine we cannot block directly, but - return indicating that we need to block. */ - vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) ); - portENABLE_INTERRUPTS(); - return errQUEUE_BLOCKED; - } - else - { - portENABLE_INTERRUPTS(); - return errQUEUE_FULL; - } - } - } - portENABLE_INTERRUPTS(); - - portDISABLE_INTERRUPTS(); - { - if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) - { - /* There is room in the queue, copy the data into the queue. */ - prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); - xReturn = pdPASS; - - /* Were any co-routines waiting for data to become available? */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - /* In this instance the co-routine could be placed directly - into the ready list as we are within a critical section. - Instead the same pending ready list mechanism is used as if - the event were caused from within an interrupt. */ - if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The co-routine waiting has a higher priority so record - that a yield might be appropriate. */ - xReturn = errQUEUE_YIELD; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - xReturn = errQUEUE_FULL; - } - } - portENABLE_INTERRUPTS(); - - return xReturn; - } - -#endif /* configUSE_CO_ROUTINES */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_CO_ROUTINES == 1 ) - - BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait ) - { - BaseType_t xReturn; - Queue_t * const pxQueue = xQueue; - - /* If the queue is already empty we may have to block. A critical section - is required to prevent an interrupt adding something to the queue - between the check to see if the queue is empty and blocking on the queue. */ - portDISABLE_INTERRUPTS(); - { - if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) - { - /* There are no messages in the queue, do we want to block or just - leave with nothing? */ - if( xTicksToWait > ( TickType_t ) 0 ) - { - /* As this is a co-routine we cannot block directly, but return - indicating that we need to block. */ - vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) ); - portENABLE_INTERRUPTS(); - return errQUEUE_BLOCKED; - } - else - { - portENABLE_INTERRUPTS(); - return errQUEUE_FULL; - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - portENABLE_INTERRUPTS(); - - portDISABLE_INTERRUPTS(); - { - if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - /* Data is available from the queue. */ - pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; - if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) - { - pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - --( pxQueue->uxMessagesWaiting ); - ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); - - xReturn = pdPASS; - - /* Were any co-routines waiting for space to become available? */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - /* In this instance the co-routine could be placed directly - into the ready list as we are within a critical section. - Instead the same pending ready list mechanism is used as if - the event were caused from within an interrupt. */ - if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - xReturn = errQUEUE_YIELD; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - xReturn = pdFAIL; - } - } - portENABLE_INTERRUPTS(); - - return xReturn; - } - -#endif /* configUSE_CO_ROUTINES */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_CO_ROUTINES == 1 ) - - BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken ) - { - Queue_t * const pxQueue = xQueue; - - /* Cannot block within an ISR so if there is no space on the queue then - exit without doing anything. */ - if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) - { - prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); - - /* We only want to wake one co-routine per ISR, so check that a - co-routine has not already been woken. */ - if( xCoRoutinePreviouslyWoken == pdFALSE ) - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - return pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - return xCoRoutinePreviouslyWoken; - } - -#endif /* configUSE_CO_ROUTINES */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_CO_ROUTINES == 1 ) - - BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxCoRoutineWoken ) - { - BaseType_t xReturn; - Queue_t * const pxQueue = xQueue; - - /* We cannot block from an ISR, so check there is data available. If - not then just leave without doing anything. */ - if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - /* Copy the data from the queue. */ - pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; - if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) - { - pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - --( pxQueue->uxMessagesWaiting ); - ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); - - if( ( *pxCoRoutineWoken ) == pdFALSE ) - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - *pxCoRoutineWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - xReturn = pdPASS; - } - else - { - xReturn = pdFAIL; - } - - return xReturn; - } - -#endif /* configUSE_CO_ROUTINES */ -/*-----------------------------------------------------------*/ - -#if ( configQUEUE_REGISTRY_SIZE > 0 ) - - void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - { - UBaseType_t ux; - - /* See if there is an empty space in the registry. A NULL name denotes - a free slot. */ - for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) - { - if( xQueueRegistry[ ux ].pcQueueName == NULL ) - { - /* Store the information on this queue. */ - xQueueRegistry[ ux ].pcQueueName = pcQueueName; - xQueueRegistry[ ux ].xHandle = xQueue; - - traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ); - break; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - -#endif /* configQUEUE_REGISTRY_SIZE */ -/*-----------------------------------------------------------*/ - -#if ( configQUEUE_REGISTRY_SIZE > 0 ) - - const char *pcQueueGetName( QueueHandle_t xQueue ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - { - UBaseType_t ux; - const char *pcReturn = NULL; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - - /* Note there is nothing here to protect against another task adding or - removing entries from the registry while it is being searched. */ - for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) - { - if( xQueueRegistry[ ux ].xHandle == xQueue ) - { - pcReturn = xQueueRegistry[ ux ].pcQueueName; - break; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - - return pcReturn; - } /*lint !e818 xQueue cannot be a pointer to const because it is a typedef. */ - -#endif /* configQUEUE_REGISTRY_SIZE */ -/*-----------------------------------------------------------*/ - -#if ( configQUEUE_REGISTRY_SIZE > 0 ) - - void vQueueUnregisterQueue( QueueHandle_t xQueue ) - { - UBaseType_t ux; - - /* See if the handle of the queue being unregistered in actually in the - registry. */ - for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) - { - if( xQueueRegistry[ ux ].xHandle == xQueue ) - { - /* Set the name to NULL to show that this slot if free again. */ - xQueueRegistry[ ux ].pcQueueName = NULL; - - /* Set the handle to NULL to ensure the same queue handle cannot - appear in the registry twice if it is added, removed, then - added again. */ - xQueueRegistry[ ux ].xHandle = ( QueueHandle_t ) 0; - break; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - - } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ - -#endif /* configQUEUE_REGISTRY_SIZE */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_TIMERS == 1 ) - - void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) - { - Queue_t * const pxQueue = xQueue; - - /* This function should not be called by application code hence the - 'Restricted' in its name. It is not part of the public API. It is - designed for use by kernel code, and has special calling requirements. - It can result in vListInsert() being called on a list that can only - possibly ever have one item in it, so the list will be fast, but even - so it should be called with the scheduler locked and not from a critical - section. */ - - /* Only do anything if there are no messages in the queue. This function - will not actually cause the task to block, just place it on a blocked - list. It will not block until the scheduler is unlocked - at which - time a yield will be performed. If an item is added to the queue while - the queue is locked, and the calling task blocks on the queue, then the - calling task will be immediately unblocked when the queue is unlocked. */ - prvLockQueue( pxQueue ); - if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U ) - { - /* There is nothing in the queue, block for the specified period. */ - vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait, xWaitIndefinitely ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - prvUnlockQueue( pxQueue ); - } - -#endif /* configUSE_TIMERS */ -/*-----------------------------------------------------------*/ - -#if( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - - QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) - { - QueueSetHandle_t pxQueue; - - pxQueue = xQueueGenericCreate( uxEventQueueLength, ( UBaseType_t ) sizeof( Queue_t * ), queueQUEUE_TYPE_SET ); - - return pxQueue; - } - -#endif /* configUSE_QUEUE_SETS */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_QUEUE_SETS == 1 ) - - BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) - { - BaseType_t xReturn; - - taskENTER_CRITICAL(); - { - if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ) - { - /* Cannot add a queue/semaphore to more than one queue set. */ - xReturn = pdFAIL; - } - else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting != ( UBaseType_t ) 0 ) - { - /* Cannot add a queue/semaphore to a queue set if there are already - items in the queue/semaphore. */ - xReturn = pdFAIL; - } - else - { - ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet; - xReturn = pdPASS; - } - } - taskEXIT_CRITICAL(); - - return xReturn; - } - -#endif /* configUSE_QUEUE_SETS */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_QUEUE_SETS == 1 ) - - BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) - { - BaseType_t xReturn; - Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore; - - if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet ) - { - /* The queue was not a member of the set. */ - xReturn = pdFAIL; - } - else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 ) - { - /* It is dangerous to remove a queue from a set when the queue is - not empty because the queue set will still hold pending events for - the queue. */ - xReturn = pdFAIL; - } - else - { - taskENTER_CRITICAL(); - { - /* The queue is no longer contained in the set. */ - pxQueueOrSemaphore->pxQueueSetContainer = NULL; - } - taskEXIT_CRITICAL(); - xReturn = pdPASS; - } - - return xReturn; - } /*lint !e818 xQueueSet could not be declared as pointing to const as it is a typedef. */ - -#endif /* configUSE_QUEUE_SETS */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_QUEUE_SETS == 1 ) - - QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, TickType_t const xTicksToWait ) - { - QueueSetMemberHandle_t xReturn = NULL; - - ( void ) xQueueReceive( ( QueueHandle_t ) xQueueSet, &xReturn, xTicksToWait ); /*lint !e961 Casting from one typedef to another is not redundant. */ - return xReturn; - } - -#endif /* configUSE_QUEUE_SETS */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_QUEUE_SETS == 1 ) - - QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) - { - QueueSetMemberHandle_t xReturn = NULL; - - ( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet, &xReturn, NULL ); /*lint !e961 Casting from one typedef to another is not redundant. */ - return xReturn; - } - -#endif /* configUSE_QUEUE_SETS */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_QUEUE_SETS == 1 ) - - static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue ) - { - Queue_t *pxQueueSetContainer = pxQueue->pxQueueSetContainer; - BaseType_t xReturn = pdFALSE; - - /* This function must be called form a critical section. */ - - configASSERT( pxQueueSetContainer ); - configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ); - - if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ) - { - const int8_t cTxLock = pxQueueSetContainer->cTxLock; - - traceQUEUE_SEND( pxQueueSetContainer ); - - /* The data copied is the handle of the queue that contains data. */ - xReturn = prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, queueSEND_TO_BACK ); - - if( cTxLock == queueUNLOCKED ) - { - if( listLIST_IS_EMPTY( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority. */ - xReturn = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - pxQueueSetContainer->cTxLock = ( int8_t ) ( cTxLock + 1 ); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - return xReturn; - } - -#endif /* configUSE_QUEUE_SETS */ - - - - - - - - - - - - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c deleted file mode 100644 index 7ad5d54..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c +++ /dev/null @@ -1,1263 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/* Standard includes. */ -#include -#include - -/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining -all the API functions to use the MPU wrappers. That should only be done when -task.h is included from an application file. */ -#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE - -/* FreeRTOS includes. */ -#include "FreeRTOS.h" -#include "task.h" -#include "stream_buffer.h" - -#if( configUSE_TASK_NOTIFICATIONS != 1 ) - #error configUSE_TASK_NOTIFICATIONS must be set to 1 to build stream_buffer.c -#endif - -/* Lint e961, e9021 and e750 are suppressed as a MISRA exception justified -because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined -for the header files above, but not in this file, in order to generate the -correct privileged Vs unprivileged linkage and placement. */ -#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ - -/* If the user has not provided application specific Rx notification macros, -or #defined the notification macros away, them provide default implementations -that uses task notifications. */ -/*lint -save -e9026 Function like macros allowed and needed here so they can be overidden. */ -#ifndef sbRECEIVE_COMPLETED - #define sbRECEIVE_COMPLETED( pxStreamBuffer ) \ - vTaskSuspendAll(); \ - { \ - if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ - { \ - ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToSend, \ - ( uint32_t ) 0, \ - eNoAction ); \ - ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ - } \ - } \ - ( void ) xTaskResumeAll(); -#endif /* sbRECEIVE_COMPLETED */ - -#ifndef sbRECEIVE_COMPLETED_FROM_ISR - #define sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, \ - pxHigherPriorityTaskWoken ) \ - { \ - UBaseType_t uxSavedInterruptStatus; \ - \ - uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); \ - { \ - if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ - { \ - ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, \ - ( uint32_t ) 0, \ - eNoAction, \ - pxHigherPriorityTaskWoken ); \ - ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ - } \ - } \ - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ - } -#endif /* sbRECEIVE_COMPLETED_FROM_ISR */ - -/* If the user has not provided an application specific Tx notification macro, -or #defined the notification macro away, them provide a default implementation -that uses task notifications. */ -#ifndef sbSEND_COMPLETED - #define sbSEND_COMPLETED( pxStreamBuffer ) \ - vTaskSuspendAll(); \ - { \ - if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ - { \ - ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToReceive, \ - ( uint32_t ) 0, \ - eNoAction ); \ - ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ - } \ - } \ - ( void ) xTaskResumeAll(); -#endif /* sbSEND_COMPLETED */ - -#ifndef sbSEND_COMPLETE_FROM_ISR - #define sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \ - { \ - UBaseType_t uxSavedInterruptStatus; \ - \ - uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); \ - { \ - if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ - { \ - ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, \ - ( uint32_t ) 0, \ - eNoAction, \ - pxHigherPriorityTaskWoken ); \ - ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ - } \ - } \ - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ - } -#endif /* sbSEND_COMPLETE_FROM_ISR */ -/*lint -restore (9026) */ - -/* The number of bytes used to hold the length of a message in the buffer. */ -#define sbBYTES_TO_STORE_MESSAGE_LENGTH ( sizeof( configMESSAGE_BUFFER_LENGTH_TYPE ) ) - -/* Bits stored in the ucFlags field of the stream buffer. */ -#define sbFLAGS_IS_MESSAGE_BUFFER ( ( uint8_t ) 1 ) /* Set if the stream buffer was created as a message buffer, in which case it holds discrete messages rather than a stream. */ -#define sbFLAGS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 2 ) /* Set if the stream buffer was created using statically allocated memory. */ - -/*-----------------------------------------------------------*/ - -/* Structure that hold state information on the buffer. */ -typedef struct StreamBufferDef_t /*lint !e9058 Style convention uses tag. */ -{ - volatile size_t xTail; /* Index to the next item to read within the buffer. */ - volatile size_t xHead; /* Index to the next item to write within the buffer. */ - size_t xLength; /* The length of the buffer pointed to by pucBuffer. */ - size_t xTriggerLevelBytes; /* The number of bytes that must be in the stream buffer before a task that is waiting for data is unblocked. */ - volatile TaskHandle_t xTaskWaitingToReceive; /* Holds the handle of a task waiting for data, or NULL if no tasks are waiting. */ - volatile TaskHandle_t xTaskWaitingToSend; /* Holds the handle of a task waiting to send data to a message buffer that is full. */ - uint8_t *pucBuffer; /* Points to the buffer itself - that is - the RAM that stores the data passed through the buffer. */ - uint8_t ucFlags; - - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxStreamBufferNumber; /* Used for tracing purposes. */ - #endif -} StreamBuffer_t; - -/* - * The number of bytes available to be read from the buffer. - */ -static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) PRIVILEGED_FUNCTION; - -/* - * Add xCount bytes from pucData into the pxStreamBuffer message buffer. - * Returns the number of bytes written, which will either equal xCount in the - * success case, or 0 if there was not enough space in the buffer (in which case - * no data is written into the buffer). - */ -static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, const uint8_t *pucData, size_t xCount ) PRIVILEGED_FUNCTION; - -/* - * If the stream buffer is being used as a message buffer, then reads an entire - * message out of the buffer. If the stream buffer is being used as a stream - * buffer then read as many bytes as possible from the buffer. - * prvReadBytesFromBuffer() is called to actually extract the bytes from the - * buffer's data storage area. - */ -static size_t prvReadMessageFromBuffer( StreamBuffer_t *pxStreamBuffer, - void *pvRxData, - size_t xBufferLengthBytes, - size_t xBytesAvailable, - size_t xBytesToStoreMessageLength ) PRIVILEGED_FUNCTION; - -/* - * If the stream buffer is being used as a message buffer, then writes an entire - * message to the buffer. If the stream buffer is being used as a stream - * buffer then write as many bytes as possible to the buffer. - * prvWriteBytestoBuffer() is called to actually send the bytes to the buffer's - * data storage area. - */ -static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer, - const void * pvTxData, - size_t xDataLengthBytes, - size_t xSpace, - size_t xRequiredSpace ) PRIVILEGED_FUNCTION; - -/* - * Read xMaxCount bytes from the pxStreamBuffer message buffer and write them - * to pucData. - */ -static size_t prvReadBytesFromBuffer( StreamBuffer_t *pxStreamBuffer, - uint8_t *pucData, - size_t xMaxCount, - size_t xBytesAvailable ) PRIVILEGED_FUNCTION; - -/* - * Called by both pxStreamBufferCreate() and pxStreamBufferCreateStatic() to - * initialise the members of the newly created stream buffer structure. - */ -static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer, - uint8_t * const pucBuffer, - size_t xBufferSizeBytes, - size_t xTriggerLevelBytes, - uint8_t ucFlags ) PRIVILEGED_FUNCTION; - -/*-----------------------------------------------------------*/ - -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - - StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer ) - { - uint8_t *pucAllocatedMemory; - uint8_t ucFlags; - - /* In case the stream buffer is going to be used as a message buffer - (that is, it will hold discrete messages with a little meta data that - says how big the next message is) check the buffer will be large enough - to hold at least one message. */ - if( xIsMessageBuffer == pdTRUE ) - { - /* Is a message buffer but not statically allocated. */ - ucFlags = sbFLAGS_IS_MESSAGE_BUFFER; - configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); - } - else - { - /* Not a message buffer and not statically allocated. */ - ucFlags = 0; - configASSERT( xBufferSizeBytes > 0 ); - } - configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); - - /* A trigger level of 0 would cause a waiting task to unblock even when - the buffer was empty. */ - if( xTriggerLevelBytes == ( size_t ) 0 ) - { - xTriggerLevelBytes = ( size_t ) 1; - } - - /* A stream buffer requires a StreamBuffer_t structure and a buffer. - Both are allocated in a single call to pvPortMalloc(). The - StreamBuffer_t structure is placed at the start of the allocated memory - and the buffer follows immediately after. The requested size is - incremented so the free space is returned as the user would expect - - this is a quirk of the implementation that means otherwise the free - space would be reported as one byte smaller than would be logically - expected. */ - xBufferSizeBytes++; - pucAllocatedMemory = ( uint8_t * ) pvPortMalloc( xBufferSizeBytes + sizeof( StreamBuffer_t ) ); /*lint !e9079 malloc() only returns void*. */ - - if( pucAllocatedMemory != NULL ) - { - prvInitialiseNewStreamBuffer( ( StreamBuffer_t * ) pucAllocatedMemory, /* Structure at the start of the allocated memory. */ /*lint !e9087 Safe cast as allocated memory is aligned. */ /*lint !e826 Area is not too small and alignment is guaranteed provided malloc() behaves as expected and returns aligned buffer. */ - pucAllocatedMemory + sizeof( StreamBuffer_t ), /* Storage area follows. */ /*lint !e9016 Indexing past structure valid for uint8_t pointer, also storage area has no alignment requirement. */ - xBufferSizeBytes, - xTriggerLevelBytes, - ucFlags ); - - traceSTREAM_BUFFER_CREATE( ( ( StreamBuffer_t * ) pucAllocatedMemory ), xIsMessageBuffer ); - } - else - { - traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ); - } - - return ( StreamBufferHandle_t ) pucAllocatedMemory; /*lint !e9087 !e826 Safe cast as allocated memory is aligned. */ - } - -#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ -/*-----------------------------------------------------------*/ - -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - - StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, - size_t xTriggerLevelBytes, - BaseType_t xIsMessageBuffer, - uint8_t * const pucStreamBufferStorageArea, - StaticStreamBuffer_t * const pxStaticStreamBuffer ) - { - StreamBuffer_t * const pxStreamBuffer = ( StreamBuffer_t * ) pxStaticStreamBuffer; /*lint !e740 !e9087 Safe cast as StaticStreamBuffer_t is opaque Streambuffer_t. */ - StreamBufferHandle_t xReturn; - uint8_t ucFlags; - - configASSERT( pucStreamBufferStorageArea ); - configASSERT( pxStaticStreamBuffer ); - configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); - - /* A trigger level of 0 would cause a waiting task to unblock even when - the buffer was empty. */ - if( xTriggerLevelBytes == ( size_t ) 0 ) - { - xTriggerLevelBytes = ( size_t ) 1; - } - - if( xIsMessageBuffer != pdFALSE ) - { - /* Statically allocated message buffer. */ - ucFlags = sbFLAGS_IS_MESSAGE_BUFFER | sbFLAGS_IS_STATICALLY_ALLOCATED; - } - else - { - /* Statically allocated stream buffer. */ - ucFlags = sbFLAGS_IS_STATICALLY_ALLOCATED; - } - - /* In case the stream buffer is going to be used as a message buffer - (that is, it will hold discrete messages with a little meta data that - says how big the next message is) check the buffer will be large enough - to hold at least one message. */ - configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); - - #if( configASSERT_DEFINED == 1 ) - { - /* Sanity check that the size of the structure used to declare a - variable of type StaticStreamBuffer_t equals the size of the real - message buffer structure. */ - volatile size_t xSize = sizeof( StaticStreamBuffer_t ); - configASSERT( xSize == sizeof( StreamBuffer_t ) ); - } /*lint !e529 xSize is referenced is configASSERT() is defined. */ - #endif /* configASSERT_DEFINED */ - - if( ( pucStreamBufferStorageArea != NULL ) && ( pxStaticStreamBuffer != NULL ) ) - { - prvInitialiseNewStreamBuffer( pxStreamBuffer, - pucStreamBufferStorageArea, - xBufferSizeBytes, - xTriggerLevelBytes, - ucFlags ); - - /* Remember this was statically allocated in case it is ever deleted - again. */ - pxStreamBuffer->ucFlags |= sbFLAGS_IS_STATICALLY_ALLOCATED; - - traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ); - - xReturn = ( StreamBufferHandle_t ) pxStaticStreamBuffer; /*lint !e9087 Data hiding requires cast to opaque type. */ - } - else - { - xReturn = NULL; - traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ); - } - - return xReturn; - } - -#endif /* ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ -/*-----------------------------------------------------------*/ - -void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) -{ -StreamBuffer_t * pxStreamBuffer = xStreamBuffer; - - configASSERT( pxStreamBuffer ); - - traceSTREAM_BUFFER_DELETE( xStreamBuffer ); - - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) pdFALSE ) - { - #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - { - /* Both the structure and the buffer were allocated using a single call - to pvPortMalloc(), hence only one call to vPortFree() is required. */ - vPortFree( ( void * ) pxStreamBuffer ); /*lint !e9087 Standard free() semantics require void *, plus pxStreamBuffer was allocated by pvPortMalloc(). */ - } - #else - { - /* Should not be possible to get here, ucFlags must be corrupt. - Force an assert. */ - configASSERT( xStreamBuffer == ( StreamBufferHandle_t ) ~0 ); - } - #endif - } - else - { - /* The structure and buffer were not allocated dynamically and cannot be - freed - just scrub the structure so future use will assert. */ - ( void ) memset( pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); - } -} -/*-----------------------------------------------------------*/ - -BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) -{ -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -BaseType_t xReturn = pdFAIL; - -#if( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxStreamBufferNumber; -#endif - - configASSERT( pxStreamBuffer ); - - #if( configUSE_TRACE_FACILITY == 1 ) - { - /* Store the stream buffer number so it can be restored after the - reset. */ - uxStreamBufferNumber = pxStreamBuffer->uxStreamBufferNumber; - } - #endif - - /* Can only reset a message buffer if there are no tasks blocked on it. */ - taskENTER_CRITICAL(); - { - if( pxStreamBuffer->xTaskWaitingToReceive == NULL ) - { - if( pxStreamBuffer->xTaskWaitingToSend == NULL ) - { - prvInitialiseNewStreamBuffer( pxStreamBuffer, - pxStreamBuffer->pucBuffer, - pxStreamBuffer->xLength, - pxStreamBuffer->xTriggerLevelBytes, - pxStreamBuffer->ucFlags ); - xReturn = pdPASS; - - #if( configUSE_TRACE_FACILITY == 1 ) - { - pxStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; - } - #endif - - traceSTREAM_BUFFER_RESET( xStreamBuffer ); - } - } - } - taskEXIT_CRITICAL(); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) -{ -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -BaseType_t xReturn; - - configASSERT( pxStreamBuffer ); - - /* It is not valid for the trigger level to be 0. */ - if( xTriggerLevel == ( size_t ) 0 ) - { - xTriggerLevel = ( size_t ) 1; - } - - /* The trigger level is the number of bytes that must be in the stream - buffer before a task that is waiting for data is unblocked. */ - if( xTriggerLevel <= pxStreamBuffer->xLength ) - { - pxStreamBuffer->xTriggerLevelBytes = xTriggerLevel; - xReturn = pdPASS; - } - else - { - xReturn = pdFALSE; - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) -{ -const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xSpace; - - configASSERT( pxStreamBuffer ); - - xSpace = pxStreamBuffer->xLength + pxStreamBuffer->xTail; - xSpace -= pxStreamBuffer->xHead; - xSpace -= ( size_t ) 1; - - if( xSpace >= pxStreamBuffer->xLength ) - { - xSpace -= pxStreamBuffer->xLength; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - return xSpace; -} -/*-----------------------------------------------------------*/ - -size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) -{ -const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xReturn; - - configASSERT( pxStreamBuffer ); - - xReturn = prvBytesInBuffer( pxStreamBuffer ); - return xReturn; -} -/*-----------------------------------------------------------*/ - -size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, - const void *pvTxData, - size_t xDataLengthBytes, - TickType_t xTicksToWait ) -{ -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xReturn, xSpace = 0; -size_t xRequiredSpace = xDataLengthBytes; -TimeOut_t xTimeOut; - - configASSERT( pvTxData ); - configASSERT( pxStreamBuffer ); - - /* This send function is used to write to both message buffers and stream - buffers. If this is a message buffer then the space needed must be - increased by the amount of bytes needed to store the length of the - message. */ - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) - { - xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; - - /* Overflow? */ - configASSERT( xRequiredSpace > xDataLengthBytes ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - if( xTicksToWait != ( TickType_t ) 0 ) - { - vTaskSetTimeOutState( &xTimeOut ); - - do - { - /* Wait until the required number of bytes are free in the message - buffer. */ - taskENTER_CRITICAL(); - { - xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); - - if( xSpace < xRequiredSpace ) - { - /* Clear notification state as going to wait for space. */ - ( void ) xTaskNotifyStateClear( NULL ); - - /* Should only be one writer. */ - configASSERT( pxStreamBuffer->xTaskWaitingToSend == NULL ); - pxStreamBuffer->xTaskWaitingToSend = xTaskGetCurrentTaskHandle(); - } - else - { - taskEXIT_CRITICAL(); - break; - } - } - taskEXIT_CRITICAL(); - - traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ); - ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); - pxStreamBuffer->xTaskWaitingToSend = NULL; - - } while( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - if( xSpace == ( size_t ) 0 ) - { - xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); - - if( xReturn > ( size_t ) 0 ) - { - traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn ); - - /* Was a task waiting for the data? */ - if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) - { - sbSEND_COMPLETED( pxStreamBuffer ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ); - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, - const void *pvTxData, - size_t xDataLengthBytes, - BaseType_t * const pxHigherPriorityTaskWoken ) -{ -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xReturn, xSpace; -size_t xRequiredSpace = xDataLengthBytes; - - configASSERT( pvTxData ); - configASSERT( pxStreamBuffer ); - - /* This send function is used to write to both message buffers and stream - buffers. If this is a message buffer then the space needed must be - increased by the amount of bytes needed to store the length of the - message. */ - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) - { - xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); - xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); - - if( xReturn > ( size_t ) 0 ) - { - /* Was a task waiting for the data? */ - if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) - { - sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xReturn ); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer, - const void * pvTxData, - size_t xDataLengthBytes, - size_t xSpace, - size_t xRequiredSpace ) -{ - BaseType_t xShouldWrite; - size_t xReturn; - - if( xSpace == ( size_t ) 0 ) - { - /* Doesn't matter if this is a stream buffer or a message buffer, there - is no space to write. */ - xShouldWrite = pdFALSE; - } - else if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) == ( uint8_t ) 0 ) - { - /* This is a stream buffer, as opposed to a message buffer, so writing a - stream of bytes rather than discrete messages. Write as many bytes as - possible. */ - xShouldWrite = pdTRUE; - xDataLengthBytes = configMIN( xDataLengthBytes, xSpace ); - } - else if( xSpace >= xRequiredSpace ) - { - /* This is a message buffer, as opposed to a stream buffer, and there - is enough space to write both the message length and the message itself - into the buffer. Start by writing the length of the data, the data - itself will be written later in this function. */ - xShouldWrite = pdTRUE; - ( void ) prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) &( xDataLengthBytes ), sbBYTES_TO_STORE_MESSAGE_LENGTH ); - } - else - { - /* There is space available, but not enough space. */ - xShouldWrite = pdFALSE; - } - - if( xShouldWrite != pdFALSE ) - { - /* Writes the data itself. */ - xReturn = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) pvTxData, xDataLengthBytes ); /*lint !e9079 Storage buffer is implemented as uint8_t for ease of sizing, alighment and access. */ - } - else - { - xReturn = 0; - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, - void *pvRxData, - size_t xBufferLengthBytes, - TickType_t xTicksToWait ) -{ -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; - - configASSERT( pvRxData ); - configASSERT( pxStreamBuffer ); - - /* This receive function is used by both message buffers, which store - discrete messages, and stream buffers, which store a continuous stream of - bytes. Discrete messages include an additional - sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the - message. */ - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) - { - xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; - } - else - { - xBytesToStoreMessageLength = 0; - } - - if( xTicksToWait != ( TickType_t ) 0 ) - { - /* Checking if there is data and clearing the notification state must be - performed atomically. */ - taskENTER_CRITICAL(); - { - xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); - - /* If this function was invoked by a message buffer read then - xBytesToStoreMessageLength holds the number of bytes used to hold - the length of the next discrete message. If this function was - invoked by a stream buffer read then xBytesToStoreMessageLength will - be 0. */ - if( xBytesAvailable <= xBytesToStoreMessageLength ) - { - /* Clear notification state as going to wait for data. */ - ( void ) xTaskNotifyStateClear( NULL ); - - /* Should only be one reader. */ - configASSERT( pxStreamBuffer->xTaskWaitingToReceive == NULL ); - pxStreamBuffer->xTaskWaitingToReceive = xTaskGetCurrentTaskHandle(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL(); - - if( xBytesAvailable <= xBytesToStoreMessageLength ) - { - /* Wait for data to be available. */ - traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ); - ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); - pxStreamBuffer->xTaskWaitingToReceive = NULL; - - /* Recheck the data available after blocking. */ - xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); - } - - /* Whether receiving a discrete message (where xBytesToStoreMessageLength - holds the number of bytes used to store the message length) or a stream of - bytes (where xBytesToStoreMessageLength is zero), the number of bytes - available must be greater than xBytesToStoreMessageLength to be able to - read bytes from the buffer. */ - if( xBytesAvailable > xBytesToStoreMessageLength ) - { - xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable, xBytesToStoreMessageLength ); - - /* Was a task waiting for space in the buffer? */ - if( xReceivedLength != ( size_t ) 0 ) - { - traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ); - sbRECEIVE_COMPLETED( pxStreamBuffer ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ); - mtCOVERAGE_TEST_MARKER(); - } - - return xReceivedLength; -} -/*-----------------------------------------------------------*/ - -size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) -{ -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xReturn, xBytesAvailable, xOriginalTail; -configMESSAGE_BUFFER_LENGTH_TYPE xTempReturn; - - configASSERT( pxStreamBuffer ); - - /* Ensure the stream buffer is being used as a message buffer. */ - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) - { - xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); - if( xBytesAvailable > sbBYTES_TO_STORE_MESSAGE_LENGTH ) - { - /* The number of bytes available is greater than the number of bytes - required to hold the length of the next message, so another message - is available. Return its length without removing the length bytes - from the buffer. A copy of the tail is stored so the buffer can be - returned to its prior state as the message is not actually being - removed from the buffer. */ - xOriginalTail = pxStreamBuffer->xTail; - ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempReturn, sbBYTES_TO_STORE_MESSAGE_LENGTH, xBytesAvailable ); - xReturn = ( size_t ) xTempReturn; - pxStreamBuffer->xTail = xOriginalTail; - } - else - { - /* The minimum amount of bytes in a message buffer is - ( sbBYTES_TO_STORE_MESSAGE_LENGTH + 1 ), so if xBytesAvailable is - less than sbBYTES_TO_STORE_MESSAGE_LENGTH the only other valid - value is 0. */ - configASSERT( xBytesAvailable == 0 ); - xReturn = 0; - } - } - else - { - xReturn = 0; - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, - void *pvRxData, - size_t xBufferLengthBytes, - BaseType_t * const pxHigherPriorityTaskWoken ) -{ -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; - - configASSERT( pvRxData ); - configASSERT( pxStreamBuffer ); - - /* This receive function is used by both message buffers, which store - discrete messages, and stream buffers, which store a continuous stream of - bytes. Discrete messages include an additional - sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the - message. */ - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) - { - xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; - } - else - { - xBytesToStoreMessageLength = 0; - } - - xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); - - /* Whether receiving a discrete message (where xBytesToStoreMessageLength - holds the number of bytes used to store the message length) or a stream of - bytes (where xBytesToStoreMessageLength is zero), the number of bytes - available must be greater than xBytesToStoreMessageLength to be able to - read bytes from the buffer. */ - if( xBytesAvailable > xBytesToStoreMessageLength ) - { - xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable, xBytesToStoreMessageLength ); - - /* Was a task waiting for space in the buffer? */ - if( xReceivedLength != ( size_t ) 0 ) - { - sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ); - - return xReceivedLength; -} -/*-----------------------------------------------------------*/ - -static size_t prvReadMessageFromBuffer( StreamBuffer_t *pxStreamBuffer, - void *pvRxData, - size_t xBufferLengthBytes, - size_t xBytesAvailable, - size_t xBytesToStoreMessageLength ) -{ -size_t xOriginalTail, xReceivedLength, xNextMessageLength; -configMESSAGE_BUFFER_LENGTH_TYPE xTempNextMessageLength; - - if( xBytesToStoreMessageLength != ( size_t ) 0 ) - { - /* A discrete message is being received. First receive the length - of the message. A copy of the tail is stored so the buffer can be - returned to its prior state if the length of the message is too - large for the provided buffer. */ - xOriginalTail = pxStreamBuffer->xTail; - ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempNextMessageLength, xBytesToStoreMessageLength, xBytesAvailable ); - xNextMessageLength = ( size_t ) xTempNextMessageLength; - - /* Reduce the number of bytes available by the number of bytes just - read out. */ - xBytesAvailable -= xBytesToStoreMessageLength; - - /* Check there is enough space in the buffer provided by the - user. */ - if( xNextMessageLength > xBufferLengthBytes ) - { - /* The user has provided insufficient space to read the message - so return the buffer to its previous state (so the length of - the message is in the buffer again). */ - pxStreamBuffer->xTail = xOriginalTail; - xNextMessageLength = 0; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* A stream of bytes is being received (as opposed to a discrete - message), so read as many bytes as possible. */ - xNextMessageLength = xBufferLengthBytes; - } - - /* Read the actual data. */ - xReceivedLength = prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) pvRxData, xNextMessageLength, xBytesAvailable ); /*lint !e9079 Data storage area is implemented as uint8_t array for ease of sizing, indexing and alignment. */ - - return xReceivedLength; -} -/*-----------------------------------------------------------*/ - -BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) -{ -const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -BaseType_t xReturn; -size_t xTail; - - configASSERT( pxStreamBuffer ); - - /* True if no bytes are available. */ - xTail = pxStreamBuffer->xTail; - if( pxStreamBuffer->xHead == xTail ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) -{ -BaseType_t xReturn; -size_t xBytesToStoreMessageLength; -const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; - - configASSERT( pxStreamBuffer ); - - /* This generic version of the receive function is used by both message - buffers, which store discrete messages, and stream buffers, which store a - continuous stream of bytes. Discrete messages include an additional - sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the message. */ - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) - { - xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; - } - else - { - xBytesToStoreMessageLength = 0; - } - - /* True if the available space equals zero. */ - if( xStreamBufferSpacesAvailable( xStreamBuffer ) <= xBytesToStoreMessageLength ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) -{ -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -BaseType_t xReturn; -UBaseType_t uxSavedInterruptStatus; - - configASSERT( pxStreamBuffer ); - - uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); - { - if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) - { - ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, - ( uint32_t ) 0, - eNoAction, - pxHigherPriorityTaskWoken ); - ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) -{ -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -BaseType_t xReturn; -UBaseType_t uxSavedInterruptStatus; - - configASSERT( pxStreamBuffer ); - - uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); - { - if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) - { - ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, - ( uint32_t ) 0, - eNoAction, - pxHigherPriorityTaskWoken ); - ( pxStreamBuffer )->xTaskWaitingToSend = NULL; - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, const uint8_t *pucData, size_t xCount ) -{ -size_t xNextHead, xFirstLength; - - configASSERT( xCount > ( size_t ) 0 ); - - xNextHead = pxStreamBuffer->xHead; - - /* Calculate the number of bytes that can be added in the first write - - which may be less than the total number of bytes that need to be added if - the buffer will wrap back to the beginning. */ - xFirstLength = configMIN( pxStreamBuffer->xLength - xNextHead, xCount ); - - /* Write as many bytes as can be written in the first write. */ - configASSERT( ( xNextHead + xFirstLength ) <= pxStreamBuffer->xLength ); - ( void ) memcpy( ( void* ) ( &( pxStreamBuffer->pucBuffer[ xNextHead ] ) ), ( const void * ) pucData, xFirstLength ); /*lint !e9087 memcpy() requires void *. */ - - /* If the number of bytes written was less than the number that could be - written in the first write... */ - if( xCount > xFirstLength ) - { - /* ...then write the remaining bytes to the start of the buffer. */ - configASSERT( ( xCount - xFirstLength ) <= pxStreamBuffer->xLength ); - ( void ) memcpy( ( void * ) pxStreamBuffer->pucBuffer, ( const void * ) &( pucData[ xFirstLength ] ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - xNextHead += xCount; - if( xNextHead >= pxStreamBuffer->xLength ) - { - xNextHead -= pxStreamBuffer->xLength; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - pxStreamBuffer->xHead = xNextHead; - - return xCount; -} -/*-----------------------------------------------------------*/ - -static size_t prvReadBytesFromBuffer( StreamBuffer_t *pxStreamBuffer, uint8_t *pucData, size_t xMaxCount, size_t xBytesAvailable ) -{ -size_t xCount, xFirstLength, xNextTail; - - /* Use the minimum of the wanted bytes and the available bytes. */ - xCount = configMIN( xBytesAvailable, xMaxCount ); - - if( xCount > ( size_t ) 0 ) - { - xNextTail = pxStreamBuffer->xTail; - - /* Calculate the number of bytes that can be read - which may be - less than the number wanted if the data wraps around to the start of - the buffer. */ - xFirstLength = configMIN( pxStreamBuffer->xLength - xNextTail, xCount ); - - /* Obtain the number of bytes it is possible to obtain in the first - read. Asserts check bounds of read and write. */ - configASSERT( xFirstLength <= xMaxCount ); - configASSERT( ( xNextTail + xFirstLength ) <= pxStreamBuffer->xLength ); - ( void ) memcpy( ( void * ) pucData, ( const void * ) &( pxStreamBuffer->pucBuffer[ xNextTail ] ), xFirstLength ); /*lint !e9087 memcpy() requires void *. */ - - /* If the total number of wanted bytes is greater than the number - that could be read in the first read... */ - if( xCount > xFirstLength ) - { - /*...then read the remaining bytes from the start of the buffer. */ - configASSERT( xCount <= xMaxCount ); - ( void ) memcpy( ( void * ) &( pucData[ xFirstLength ] ), ( void * ) ( pxStreamBuffer->pucBuffer ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Move the tail pointer to effectively remove the data read from - the buffer. */ - xNextTail += xCount; - - if( xNextTail >= pxStreamBuffer->xLength ) - { - xNextTail -= pxStreamBuffer->xLength; - } - - pxStreamBuffer->xTail = xNextTail; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - return xCount; -} -/*-----------------------------------------------------------*/ - -static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) -{ -/* Returns the distance between xTail and xHead. */ -size_t xCount; - - xCount = pxStreamBuffer->xLength + pxStreamBuffer->xHead; - xCount -= pxStreamBuffer->xTail; - if ( xCount >= pxStreamBuffer->xLength ) - { - xCount -= pxStreamBuffer->xLength; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - return xCount; -} -/*-----------------------------------------------------------*/ - -static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer, - uint8_t * const pucBuffer, - size_t xBufferSizeBytes, - size_t xTriggerLevelBytes, - uint8_t ucFlags ) -{ - /* Assert here is deliberately writing to the entire buffer to ensure it can - be written to without generating exceptions, and is setting the buffer to a - known value to assist in development/debugging. */ - #if( configASSERT_DEFINED == 1 ) - { - /* The value written just has to be identifiable when looking at the - memory. Don't use 0xA5 as that is the stack fill value and could - result in confusion as to what is actually being observed. */ - const BaseType_t xWriteValue = 0x55; - configASSERT( memset( pucBuffer, ( int ) xWriteValue, xBufferSizeBytes ) == pucBuffer ); - } /*lint !e529 !e438 xWriteValue is only used if configASSERT() is defined. */ - #endif - - ( void ) memset( ( void * ) pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); /*lint !e9087 memset() requires void *. */ - pxStreamBuffer->pucBuffer = pucBuffer; - pxStreamBuffer->xLength = xBufferSizeBytes; - pxStreamBuffer->xTriggerLevelBytes = xTriggerLevelBytes; - pxStreamBuffer->ucFlags = ucFlags; -} - -#if ( configUSE_TRACE_FACILITY == 1 ) - - UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) - { - return xStreamBuffer->uxStreamBufferNumber; - } - -#endif /* configUSE_TRACE_FACILITY */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, UBaseType_t uxStreamBufferNumber ) - { - xStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; - } - -#endif /* configUSE_TRACE_FACILITY */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) - { - return ( xStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ); - } - -#endif /* configUSE_TRACE_FACILITY */ -/*-----------------------------------------------------------*/ diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/tasks.c b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/tasks.c deleted file mode 100644 index f6a6a9b..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/tasks.c +++ /dev/null @@ -1,5310 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/* Standard includes. */ -#include -#include - -/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining -all the API functions to use the MPU wrappers. That should only be done when -task.h is included from an application file. */ -#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE - -/* FreeRTOS includes. */ -#include "FreeRTOS.h" -#include "task.h" -#include "timers.h" -#include "stack_macros.h" - -/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified -because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined -for the header files above, but not in this file, in order to generate the -correct privileged Vs unprivileged linkage and placement. */ -#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ - -/* Set configUSE_STATS_FORMATTING_FUNCTIONS to 2 to include the stats formatting -functions but without including stdio.h here. */ -#if ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) - /* At the bottom of this file are two optional functions that can be used - to generate human readable text from the raw data generated by the - uxTaskGetSystemState() function. Note the formatting functions are provided - for convenience only, and are NOT considered part of the kernel. */ - #include -#endif /* configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) */ - -#if( configUSE_PREEMPTION == 0 ) - /* If the cooperative scheduler is being used then a yield should not be - performed just because a higher priority task has been woken. */ - #define taskYIELD_IF_USING_PREEMPTION() -#else - #define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() -#endif - -/* Values that can be assigned to the ucNotifyState member of the TCB. */ -#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) -#define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 ) -#define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 ) - -/* - * The value used to fill the stack of a task when the task is created. This - * is used purely for checking the high water mark for tasks. - */ -#define tskSTACK_FILL_BYTE ( 0xa5U ) - -/* Bits used to recored how a task's stack and TCB were allocated. */ -#define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 0 ) -#define tskSTATICALLY_ALLOCATED_STACK_ONLY ( ( uint8_t ) 1 ) -#define tskSTATICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 2 ) - -/* If any of the following are set then task stacks are filled with a known -value so the high water mark can be determined. If none of the following are -set then don't fill the stack so there is no unnecessary dependency on memset. */ -#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) - #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 1 -#else - #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 0 -#endif - -/* - * Macros used by vListTask to indicate which state a task is in. - */ -#define tskRUNNING_CHAR ( 'X' ) -#define tskBLOCKED_CHAR ( 'B' ) -#define tskREADY_CHAR ( 'R' ) -#define tskDELETED_CHAR ( 'D' ) -#define tskSUSPENDED_CHAR ( 'S' ) - -/* - * Some kernel aware debuggers require the data the debugger needs access to be - * global, rather than file scope. - */ -#ifdef portREMOVE_STATIC_QUALIFIER - #define static -#endif - -/* The name allocated to the Idle task. This can be overridden by defining -configIDLE_TASK_NAME in FreeRTOSConfig.h. */ -#ifndef configIDLE_TASK_NAME - #define configIDLE_TASK_NAME "IDLE" -#endif - -#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) - - /* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 0 then task selection is - performed in a generic way that is not optimised to any particular - microcontroller architecture. */ - - /* uxTopReadyPriority holds the priority of the highest priority ready - state task. */ - #define taskRECORD_READY_PRIORITY( uxPriority ) \ - { \ - if( ( uxPriority ) > uxTopReadyPriority ) \ - { \ - uxTopReadyPriority = ( uxPriority ); \ - } \ - } /* taskRECORD_READY_PRIORITY */ - - /*-----------------------------------------------------------*/ - - #define taskSELECT_HIGHEST_PRIORITY_TASK() \ - { \ - UBaseType_t uxTopPriority = uxTopReadyPriority; \ - \ - /* Find the highest priority queue that contains ready tasks. */ \ - while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopPriority ] ) ) ) \ - { \ - configASSERT( uxTopPriority ); \ - --uxTopPriority; \ - } \ - \ - /* listGET_OWNER_OF_NEXT_ENTRY indexes through the list, so the tasks of \ - the same priority get an equal share of the processor time. */ \ - listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ - uxTopReadyPriority = uxTopPriority; \ - } /* taskSELECT_HIGHEST_PRIORITY_TASK */ - - /*-----------------------------------------------------------*/ - - /* Define away taskRESET_READY_PRIORITY() and portRESET_READY_PRIORITY() as - they are only required when a port optimised method of task selection is - being used. */ - #define taskRESET_READY_PRIORITY( uxPriority ) - #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority ) - -#else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ - - /* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 1 then task selection is - performed in a way that is tailored to the particular microcontroller - architecture being used. */ - - /* A port optimised version is provided. Call the port defined macros. */ - #define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority ) - - /*-----------------------------------------------------------*/ - - #define taskSELECT_HIGHEST_PRIORITY_TASK() \ - { \ - UBaseType_t uxTopPriority; \ - \ - /* Find the highest priority list that contains ready tasks. */ \ - portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \ - configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \ - listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ - } /* taskSELECT_HIGHEST_PRIORITY_TASK() */ - - /*-----------------------------------------------------------*/ - - /* A port optimised version is provided, call it only if the TCB being reset - is being referenced from a ready list. If it is referenced from a delayed - or suspended list then it won't be in a ready list. */ - #define taskRESET_READY_PRIORITY( uxPriority ) \ - { \ - if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \ - { \ - portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ - } \ - } - -#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ - -/*-----------------------------------------------------------*/ - -/* pxDelayedTaskList and pxOverflowDelayedTaskList are switched when the tick -count overflows. */ -#define taskSWITCH_DELAYED_LISTS() \ -{ \ - List_t *pxTemp; \ - \ - /* The delayed tasks list should be empty when the lists are switched. */ \ - configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); \ - \ - pxTemp = pxDelayedTaskList; \ - pxDelayedTaskList = pxOverflowDelayedTaskList; \ - pxOverflowDelayedTaskList = pxTemp; \ - xNumOfOverflows++; \ - prvResetNextTaskUnblockTime(); \ -} - -/*-----------------------------------------------------------*/ - -/* - * Place the task represented by pxTCB into the appropriate ready list for - * the task. It is inserted at the end of the list. - */ -#define prvAddTaskToReadyList( pxTCB ) \ - traceMOVED_TASK_TO_READY_STATE( pxTCB ); \ - taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ - vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \ - tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) -/*-----------------------------------------------------------*/ - -/* - * Several functions take an TaskHandle_t parameter that can optionally be NULL, - * where NULL is used to indicate that the handle of the currently executing - * task should be used in place of the parameter. This macro simply checks to - * see if the parameter is NULL and returns a pointer to the appropriate TCB. - */ -#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? pxCurrentTCB : ( pxHandle ) ) - -/* The item value of the event list item is normally used to hold the priority -of the task to which it belongs (coded to allow it to be held in reverse -priority order). However, it is occasionally borrowed for other purposes. It -is important its value is not updated due to a task priority change while it is -being used for another purpose. The following bit definition is used to inform -the scheduler that the value should not be changed - in which case it is the -responsibility of whichever module is using the value to ensure it gets set back -to its original value when it is released. */ -#if( configUSE_16_BIT_TICKS == 1 ) - #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x8000U -#else - #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x80000000UL -#endif - -/* - * Task control block. A task control block (TCB) is allocated for each task, - * and stores task state information, including a pointer to the task's context - * (the task's run time environment, including register values) - */ -typedef struct tskTaskControlBlock /* The old naming convention is used to prevent breaking kernel aware debuggers. */ -{ - volatile StackType_t *pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */ - - #if ( portUSING_MPU_WRAPPERS == 1 ) - xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */ - #endif - - ListItem_t xStateListItem; /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ - ListItem_t xEventListItem; /*< Used to reference a task from an event list. */ - UBaseType_t uxPriority; /*< The priority of the task. 0 is the lowest priority. */ - StackType_t *pxStack; /*< Points to the start of the stack. */ - char pcTaskName[ configMAX_TASK_NAME_LEN ];/*< Descriptive name given to the task when created. Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - - #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) - StackType_t *pxEndOfStack; /*< Points to the highest valid address for the stack. */ - #endif - - #if ( portCRITICAL_NESTING_IN_TCB == 1 ) - UBaseType_t uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ - #endif - - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxTCBNumber; /*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ - UBaseType_t uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */ - #endif - - #if ( configUSE_MUTEXES == 1 ) - UBaseType_t uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ - UBaseType_t uxMutexesHeld; - #endif - - #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - TaskHookFunction_t pxTaskTag; - #endif - - #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) - void *pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; - #endif - - #if( configGENERATE_RUN_TIME_STATS == 1 ) - uint32_t ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ - #endif - - #if ( configUSE_NEWLIB_REENTRANT == 1 ) - /* Allocate a Newlib reent structure that is specific to this task. - Note Newlib support has been included by popular demand, but is not - used by the FreeRTOS maintainers themselves. FreeRTOS is not - responsible for resulting newlib operation. User must be familiar with - newlib and must provide system-wide implementations of the necessary - stubs. Be warned that (at the time of writing) the current newlib design - implements a system-wide malloc() that must be provided with locks. - - See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html - for additional information. */ - struct _reent xNewLib_reent; - #endif - - #if( configUSE_TASK_NOTIFICATIONS == 1 ) - volatile uint32_t ulNotifiedValue; - volatile uint8_t ucNotifyState; - #endif - - /* See the comments in FreeRTOS.h with the definition of - tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */ - #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ - uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */ - #endif - - #if( INCLUDE_xTaskAbortDelay == 1 ) - uint8_t ucDelayAborted; - #endif - - #if( configUSE_POSIX_ERRNO == 1 ) - int iTaskErrno; - #endif - -} tskTCB; - -/* The old tskTCB name is maintained above then typedefed to the new TCB_t name -below to enable the use of older kernel aware debuggers. */ -typedef tskTCB TCB_t; - -/*lint -save -e956 A manual analysis and inspection has been used to determine -which static variables must be declared volatile. */ -PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL; - -/* Lists for ready and blocked tasks. -------------------- -xDelayedTaskList1 and xDelayedTaskList2 could be move to function scople but -doing so breaks some kernel aware debuggers and debuggers that rely on removing -the static qualifier. */ -PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];/*< Prioritised ready tasks. */ -PRIVILEGED_DATA static List_t xDelayedTaskList1; /*< Delayed tasks. */ -PRIVILEGED_DATA static List_t xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ -PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */ -PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ -PRIVILEGED_DATA static List_t xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */ - -#if( INCLUDE_vTaskDelete == 1 ) - - PRIVILEGED_DATA static List_t xTasksWaitingTermination; /*< Tasks that have been deleted - but their memory not yet freed. */ - PRIVILEGED_DATA static volatile UBaseType_t uxDeletedTasksWaitingCleanUp = ( UBaseType_t ) 0U; - -#endif - -#if ( INCLUDE_vTaskSuspend == 1 ) - - PRIVILEGED_DATA static List_t xSuspendedTaskList; /*< Tasks that are currently suspended. */ - -#endif - -/* Global POSIX errno. Its value is changed upon context switching to match -the errno of the currently running task. */ -#if ( configUSE_POSIX_ERRNO == 1 ) - int FreeRTOS_errno = 0; -#endif - -/* Other file private variables. --------------------------------*/ -PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseType_t ) 0U; -PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; -PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY; -PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE; -PRIVILEGED_DATA static volatile TickType_t xPendedTicks = ( TickType_t ) 0U; -PRIVILEGED_DATA static volatile BaseType_t xYieldPending = pdFALSE; -PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = ( BaseType_t ) 0; -PRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U; -PRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime = ( TickType_t ) 0U; /* Initialised to portMAX_DELAY before the scheduler starts. */ -PRIVILEGED_DATA static TaskHandle_t xIdleTaskHandle = NULL; /*< Holds the handle of the idle task. The idle task is created automatically when the scheduler is started. */ - -/* Context switches are held pending while the scheduler is suspended. Also, -interrupts must not manipulate the xStateListItem of a TCB, or any of the -lists the xStateListItem can be referenced from, if the scheduler is suspended. -If an interrupt needs to unblock a task while the scheduler is suspended then it -moves the task's event list item into the xPendingReadyList, ready for the -kernel to move the task from the pending ready list into the real ready list -when the scheduler is unsuspended. The pending ready list itself can only be -accessed from a critical section. */ -PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended = ( UBaseType_t ) pdFALSE; - -#if ( configGENERATE_RUN_TIME_STATS == 1 ) - - /* Do not move these variables to function scope as doing so prevents the - code working with debuggers that need to remove the static qualifier. */ - PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime = 0UL; /*< Holds the value of a timer/counter the last time a task was switched in. */ - PRIVILEGED_DATA static uint32_t ulTotalRunTime = 0UL; /*< Holds the total amount of execution time as defined by the run time counter clock. */ - -#endif - -/*lint -restore */ - -/*-----------------------------------------------------------*/ - -/* Callback function prototypes. --------------------------*/ -#if( configCHECK_FOR_STACK_OVERFLOW > 0 ) - - extern void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName ); - -#endif - -#if( configUSE_TICK_HOOK > 0 ) - - extern void vApplicationTickHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */ - -#endif - -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - - extern void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); /*lint !e526 Symbol not defined as it is an application callback. */ - -#endif - -/* File private functions. --------------------------------*/ - -/** - * Utility task that simply returns pdTRUE if the task referenced by xTask is - * currently in the Suspended state, or pdFALSE if the task referenced by xTask - * is in any other state. - */ -#if ( INCLUDE_vTaskSuspend == 1 ) - - static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - -#endif /* INCLUDE_vTaskSuspend */ - -/* - * Utility to ready all the lists used by the scheduler. This is called - * automatically upon the creation of the first task. - */ -static void prvInitialiseTaskLists( void ) PRIVILEGED_FUNCTION; - -/* - * The idle task, which as all tasks is implemented as a never ending loop. - * The idle task is automatically created and added to the ready lists upon - * creation of the first user task. - * - * The portTASK_FUNCTION_PROTO() macro is used to allow port/compiler specific - * language extensions. The equivalent prototype for this function is: - * - * void prvIdleTask( void *pvParameters ); - * - */ -static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ); - -/* - * Utility to free all memory allocated by the scheduler to hold a TCB, - * including the stack pointed to by the TCB. - * - * This does not free memory allocated by the task itself (i.e. memory - * allocated by calls to pvPortMalloc from within the tasks application code). - */ -#if ( INCLUDE_vTaskDelete == 1 ) - - static void prvDeleteTCB( TCB_t *pxTCB ) PRIVILEGED_FUNCTION; - -#endif - -/* - * Used only by the idle task. This checks to see if anything has been placed - * in the list of tasks waiting to be deleted. If so the task is cleaned up - * and its TCB deleted. - */ -static void prvCheckTasksWaitingTermination( void ) PRIVILEGED_FUNCTION; - -/* - * The currently executing task is entering the Blocked state. Add the task to - * either the current or the overflow delayed task list. - */ -static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely ) PRIVILEGED_FUNCTION; - -/* - * Fills an TaskStatus_t structure with information on each task that is - * referenced from the pxList list (which may be a ready list, a delayed list, - * a suspended list, etc.). - * - * THIS FUNCTION IS INTENDED FOR DEBUGGING ONLY, AND SHOULD NOT BE CALLED FROM - * NORMAL APPLICATION CODE. - */ -#if ( configUSE_TRACE_FACILITY == 1 ) - - static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) PRIVILEGED_FUNCTION; - -#endif - -/* - * Searches pxList for a task with name pcNameToQuery - returning a handle to - * the task if it is found, or NULL if the task is not found. - */ -#if ( INCLUDE_xTaskGetHandle == 1 ) - - static TCB_t *prvSearchForNameWithinSingleList( List_t *pxList, const char pcNameToQuery[] ) PRIVILEGED_FUNCTION; - -#endif - -/* - * When a task is created, the stack of the task is filled with a known value. - * This function determines the 'high water mark' of the task stack by - * determining how much of the stack remains at the original preset value. - */ -#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) - - static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) PRIVILEGED_FUNCTION; - -#endif - -/* - * Return the amount of time, in ticks, that will pass before the kernel will - * next move a task from the Blocked state to the Running state. - * - * This conditional compilation should use inequality to 0, not equality to 1. - * This is to ensure portSUPPRESS_TICKS_AND_SLEEP() can be called when user - * defined low power mode implementations require configUSE_TICKLESS_IDLE to be - * set to a value other than 1. - */ -#if ( configUSE_TICKLESS_IDLE != 0 ) - - static TickType_t prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION; - -#endif - -/* - * Set xNextTaskUnblockTime to the time at which the next Blocked state task - * will exit the Blocked state. - */ -static void prvResetNextTaskUnblockTime( void ); - -#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) - - /* - * Helper function used to pad task names with spaces when printing out - * human readable tables of task information. - */ - static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName ) PRIVILEGED_FUNCTION; - -#endif - -/* - * Called after a Task_t structure has been allocated either statically or - * dynamically to fill in the structure's members. - */ -static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, - const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const uint32_t ulStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - TaskHandle_t * const pxCreatedTask, - TCB_t *pxNewTCB, - const MemoryRegion_t * const xRegions ) PRIVILEGED_FUNCTION; - -/* - * Called after a new task has been created and initialised to place the task - * under the control of the scheduler. - */ -static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) PRIVILEGED_FUNCTION; - -/* - * freertos_tasks_c_additions_init() should only be called if the user definable - * macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is the only macro - * called by the function. - */ -#ifdef FREERTOS_TASKS_C_ADDITIONS_INIT - - static void freertos_tasks_c_additions_init( void ) PRIVILEGED_FUNCTION; - -#endif - -/*-----------------------------------------------------------*/ - -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - - TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, - const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const uint32_t ulStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - StackType_t * const puxStackBuffer, - StaticTask_t * const pxTaskBuffer ) - { - TCB_t *pxNewTCB; - TaskHandle_t xReturn; - - configASSERT( puxStackBuffer != NULL ); - configASSERT( pxTaskBuffer != NULL ); - - #if( configASSERT_DEFINED == 1 ) - { - /* Sanity check that the size of the structure used to declare a - variable of type StaticTask_t equals the size of the real task - structure. */ - volatile size_t xSize = sizeof( StaticTask_t ); - configASSERT( xSize == sizeof( TCB_t ) ); - ( void ) xSize; /* Prevent lint warning when configASSERT() is not used. */ - } - #endif /* configASSERT_DEFINED */ - - - if( ( pxTaskBuffer != NULL ) && ( puxStackBuffer != NULL ) ) - { - /* The memory used for the task's TCB and stack are passed into this - function - use them. */ - pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ - pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer; - - #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ - { - /* Tasks can be created statically or dynamically, so note this - task was created statically in case the task is later deleted. */ - pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; - } - #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ - - prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL ); - prvAddNewTaskToReadyList( pxNewTCB ); - } - else - { - xReturn = NULL; - } - - return xReturn; - } - -#endif /* SUPPORT_STATIC_ALLOCATION */ -/*-----------------------------------------------------------*/ - -#if( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - - BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) - { - TCB_t *pxNewTCB; - BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; - - configASSERT( pxTaskDefinition->puxStackBuffer != NULL ); - configASSERT( pxTaskDefinition->pxTaskBuffer != NULL ); - - if( ( pxTaskDefinition->puxStackBuffer != NULL ) && ( pxTaskDefinition->pxTaskBuffer != NULL ) ) - { - /* Allocate space for the TCB. Where the memory comes from depends - on the implementation of the port malloc function and whether or - not static allocation is being used. */ - pxNewTCB = ( TCB_t * ) pxTaskDefinition->pxTaskBuffer; - - /* Store the stack location in the TCB. */ - pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; - - #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) - { - /* Tasks can be created statically or dynamically, so note this - task was created statically in case the task is later deleted. */ - pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; - } - #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ - - prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, - pxTaskDefinition->pcName, - ( uint32_t ) pxTaskDefinition->usStackDepth, - pxTaskDefinition->pvParameters, - pxTaskDefinition->uxPriority, - pxCreatedTask, pxNewTCB, - pxTaskDefinition->xRegions ); - - prvAddNewTaskToReadyList( pxNewTCB ); - xReturn = pdPASS; - } - - return xReturn; - } - -#endif /* ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ -/*-----------------------------------------------------------*/ - -#if( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - - BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) - { - TCB_t *pxNewTCB; - BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; - - configASSERT( pxTaskDefinition->puxStackBuffer ); - - if( pxTaskDefinition->puxStackBuffer != NULL ) - { - /* Allocate space for the TCB. Where the memory comes from depends - on the implementation of the port malloc function and whether or - not static allocation is being used. */ - pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); - - if( pxNewTCB != NULL ) - { - /* Store the stack location in the TCB. */ - pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; - - #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) - { - /* Tasks can be created statically or dynamically, so note - this task had a statically allocated stack in case it is - later deleted. The TCB was allocated dynamically. */ - pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_ONLY; - } - #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ - - prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, - pxTaskDefinition->pcName, - ( uint32_t ) pxTaskDefinition->usStackDepth, - pxTaskDefinition->pvParameters, - pxTaskDefinition->uxPriority, - pxCreatedTask, pxNewTCB, - pxTaskDefinition->xRegions ); - - prvAddNewTaskToReadyList( pxNewTCB ); - xReturn = pdPASS; - } - } - - return xReturn; - } - -#endif /* portUSING_MPU_WRAPPERS */ -/*-----------------------------------------------------------*/ - -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - - BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, - const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const configSTACK_DEPTH_TYPE usStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - TaskHandle_t * const pxCreatedTask ) - { - TCB_t *pxNewTCB; - BaseType_t xReturn; - - /* If the stack grows down then allocate the stack then the TCB so the stack - does not grow into the TCB. Likewise if the stack grows up then allocate - the TCB then the stack. */ - #if( portSTACK_GROWTH > 0 ) - { - /* Allocate space for the TCB. Where the memory comes from depends on - the implementation of the port malloc function and whether or not static - allocation is being used. */ - pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); - - if( pxNewTCB != NULL ) - { - /* Allocate space for the stack used by the task being created. - The base of the stack memory stored in the TCB so the task can - be deleted later if required. */ - pxNewTCB->pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - - if( pxNewTCB->pxStack == NULL ) - { - /* Could not allocate the stack. Delete the allocated TCB. */ - vPortFree( pxNewTCB ); - pxNewTCB = NULL; - } - } - } - #else /* portSTACK_GROWTH */ - { - StackType_t *pxStack; - - /* Allocate space for the stack used by the task being created. */ - pxStack = pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */ - - if( pxStack != NULL ) - { - /* Allocate space for the TCB. */ - pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of TCB_t is always a pointer to the task's stack. */ - - if( pxNewTCB != NULL ) - { - /* Store the stack location in the TCB. */ - pxNewTCB->pxStack = pxStack; - } - else - { - /* The stack cannot be used as the TCB was not created. Free - it again. */ - vPortFree( pxStack ); - } - } - else - { - pxNewTCB = NULL; - } - } - #endif /* portSTACK_GROWTH */ - - if( pxNewTCB != NULL ) - { - #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e9029 !e731 Macro has been consolidated for readability reasons. */ - { - /* Tasks can be created statically or dynamically, so note this - task was created dynamically in case it is later deleted. */ - pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB; - } - #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ - - prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL ); - prvAddNewTaskToReadyList( pxNewTCB ); - xReturn = pdPASS; - } - else - { - xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; - } - - return xReturn; - } - -#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ -/*-----------------------------------------------------------*/ - -static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, - const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const uint32_t ulStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - TaskHandle_t * const pxCreatedTask, - TCB_t *pxNewTCB, - const MemoryRegion_t * const xRegions ) -{ -StackType_t *pxTopOfStack; -UBaseType_t x; - - #if( portUSING_MPU_WRAPPERS == 1 ) - /* Should the task be created in privileged mode? */ - BaseType_t xRunPrivileged; - if( ( uxPriority & portPRIVILEGE_BIT ) != 0U ) - { - xRunPrivileged = pdTRUE; - } - else - { - xRunPrivileged = pdFALSE; - } - uxPriority &= ~portPRIVILEGE_BIT; - #endif /* portUSING_MPU_WRAPPERS == 1 */ - - /* Avoid dependency on memset() if it is not required. */ - #if( tskSET_NEW_STACKS_TO_KNOWN_VALUE == 1 ) - { - /* Fill the stack with a known value to assist debugging. */ - ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) ); - } - #endif /* tskSET_NEW_STACKS_TO_KNOWN_VALUE */ - - /* Calculate the top of stack address. This depends on whether the stack - grows from high memory to low (as per the 80x86) or vice versa. - portSTACK_GROWTH is used to make the result positive or negative as required - by the port. */ - #if( portSTACK_GROWTH < 0 ) - { - pxTopOfStack = &( pxNewTCB->pxStack[ ulStackDepth - ( uint32_t ) 1 ] ); - pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 !e9033 !e9078 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. Checked by assert(). */ - - /* Check the alignment of the calculated top of stack is correct. */ - configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); - - #if( configRECORD_STACK_HIGH_ADDRESS == 1 ) - { - /* Also record the stack's high address, which may assist - debugging. */ - pxNewTCB->pxEndOfStack = pxTopOfStack; - } - #endif /* configRECORD_STACK_HIGH_ADDRESS */ - } - #else /* portSTACK_GROWTH */ - { - pxTopOfStack = pxNewTCB->pxStack; - - /* Check the alignment of the stack buffer is correct. */ - configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxNewTCB->pxStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); - - /* The other extreme of the stack space is required if stack checking is - performed. */ - pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); - } - #endif /* portSTACK_GROWTH */ - - /* Store the task name in the TCB. */ - if( pcName != NULL ) - { - for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) - { - pxNewTCB->pcTaskName[ x ] = pcName[ x ]; - - /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than - configMAX_TASK_NAME_LEN characters just in case the memory after the - string is not accessible (extremely unlikely). */ - if( pcName[ x ] == ( char ) 0x00 ) - { - break; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - - /* Ensure the name string is terminated in the case that the string length - was greater or equal to configMAX_TASK_NAME_LEN. */ - pxNewTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0'; - } - else - { - /* The task has not been given a name, so just ensure there is a NULL - terminator when it is read out. */ - pxNewTCB->pcTaskName[ 0 ] = 0x00; - } - - /* This is used as an array index so must ensure it's not too large. First - remove the privilege bit if one is present. */ - if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) - { - uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - pxNewTCB->uxPriority = uxPriority; - #if ( configUSE_MUTEXES == 1 ) - { - pxNewTCB->uxBasePriority = uxPriority; - pxNewTCB->uxMutexesHeld = 0; - } - #endif /* configUSE_MUTEXES */ - - vListInitialiseItem( &( pxNewTCB->xStateListItem ) ); - vListInitialiseItem( &( pxNewTCB->xEventListItem ) ); - - /* Set the pxNewTCB as a link back from the ListItem_t. This is so we can get - back to the containing TCB from a generic item in a list. */ - listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB ); - - /* Event lists are always in priority order. */ - listSET_LIST_ITEM_VALUE( &( pxNewTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - listSET_LIST_ITEM_OWNER( &( pxNewTCB->xEventListItem ), pxNewTCB ); - - #if ( portCRITICAL_NESTING_IN_TCB == 1 ) - { - pxNewTCB->uxCriticalNesting = ( UBaseType_t ) 0U; - } - #endif /* portCRITICAL_NESTING_IN_TCB */ - - #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - { - pxNewTCB->pxTaskTag = NULL; - } - #endif /* configUSE_APPLICATION_TASK_TAG */ - - #if ( configGENERATE_RUN_TIME_STATS == 1 ) - { - pxNewTCB->ulRunTimeCounter = 0UL; - } - #endif /* configGENERATE_RUN_TIME_STATS */ - - #if ( portUSING_MPU_WRAPPERS == 1 ) - { - vPortStoreTaskMPUSettings( &( pxNewTCB->xMPUSettings ), xRegions, pxNewTCB->pxStack, ulStackDepth ); - } - #else - { - /* Avoid compiler warning about unreferenced parameter. */ - ( void ) xRegions; - } - #endif - - #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) - { - for( x = 0; x < ( UBaseType_t ) configNUM_THREAD_LOCAL_STORAGE_POINTERS; x++ ) - { - pxNewTCB->pvThreadLocalStoragePointers[ x ] = NULL; - } - } - #endif - - #if ( configUSE_TASK_NOTIFICATIONS == 1 ) - { - pxNewTCB->ulNotifiedValue = 0; - pxNewTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; - } - #endif - - #if ( configUSE_NEWLIB_REENTRANT == 1 ) - { - /* Initialise this task's Newlib reent structure. - See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html - for additional information. */ - _REENT_INIT_PTR( ( &( pxNewTCB->xNewLib_reent ) ) ); - } - #endif - - #if( INCLUDE_xTaskAbortDelay == 1 ) - { - pxNewTCB->ucDelayAborted = pdFALSE; - } - #endif - - /* Initialize the TCB stack to look as if the task was already running, - but had been interrupted by the scheduler. The return address is set - to the start of the task function. Once the stack has been initialised - the top of stack variable is updated. */ - #if( portUSING_MPU_WRAPPERS == 1 ) - { - /* If the port has capability to detect stack overflow, - pass the stack end address to the stack initialization - function as well. */ - #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) - { - #if( portSTACK_GROWTH < 0 ) - { - pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters, xRunPrivileged ); - } - #else /* portSTACK_GROWTH */ - { - pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters, xRunPrivileged ); - } - #endif /* portSTACK_GROWTH */ - } - #else /* portHAS_STACK_OVERFLOW_CHECKING */ - { - pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged ); - } - #endif /* portHAS_STACK_OVERFLOW_CHECKING */ - } - #else /* portUSING_MPU_WRAPPERS */ - { - /* If the port has capability to detect stack overflow, - pass the stack end address to the stack initialization - function as well. */ - #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) - { - #if( portSTACK_GROWTH < 0 ) - { - pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters ); - } - #else /* portSTACK_GROWTH */ - { - pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters ); - } - #endif /* portSTACK_GROWTH */ - } - #else /* portHAS_STACK_OVERFLOW_CHECKING */ - { - pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); - } - #endif /* portHAS_STACK_OVERFLOW_CHECKING */ - } - #endif /* portUSING_MPU_WRAPPERS */ - - if( pxCreatedTask != NULL ) - { - /* Pass the handle out in an anonymous way. The handle can be used to - change the created task's priority, delete the created task, etc.*/ - *pxCreatedTask = ( TaskHandle_t ) pxNewTCB; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } -} -/*-----------------------------------------------------------*/ - -static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) -{ - /* Ensure interrupts don't access the task lists while the lists are being - updated. */ - taskENTER_CRITICAL(); - { - uxCurrentNumberOfTasks++; - if( pxCurrentTCB == NULL ) - { - /* There are no other tasks, or all the other tasks are in - the suspended state - make this the current task. */ - pxCurrentTCB = pxNewTCB; - - if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 ) - { - /* This is the first task to be created so do the preliminary - initialisation required. We will not recover if this call - fails, but we will report the failure. */ - prvInitialiseTaskLists(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* If the scheduler is not already running, make this task the - current task if it is the highest priority task to be created - so far. */ - if( xSchedulerRunning == pdFALSE ) - { - if( pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority ) - { - pxCurrentTCB = pxNewTCB; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - - uxTaskNumber++; - - #if ( configUSE_TRACE_FACILITY == 1 ) - { - /* Add a counter into the TCB for tracing only. */ - pxNewTCB->uxTCBNumber = uxTaskNumber; - } - #endif /* configUSE_TRACE_FACILITY */ - traceTASK_CREATE( pxNewTCB ); - - prvAddTaskToReadyList( pxNewTCB ); - - portSETUP_TCB( pxNewTCB ); - } - taskEXIT_CRITICAL(); - - if( xSchedulerRunning != pdFALSE ) - { - /* If the created task is of a higher priority than the current task - then it should run now. */ - if( pxCurrentTCB->uxPriority < pxNewTCB->uxPriority ) - { - taskYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } -} -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskDelete == 1 ) - - void vTaskDelete( TaskHandle_t xTaskToDelete ) - { - TCB_t *pxTCB; - - taskENTER_CRITICAL(); - { - /* If null is passed in here then it is the calling task that is - being deleted. */ - pxTCB = prvGetTCBFromHandle( xTaskToDelete ); - - /* Remove task from the ready/delayed list. */ - if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - taskRESET_READY_PRIORITY( pxTCB->uxPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Is the task waiting on an event also? */ - if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) - { - ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Increment the uxTaskNumber also so kernel aware debuggers can - detect that the task lists need re-generating. This is done before - portPRE_TASK_DELETE_HOOK() as in the Windows port that macro will - not return. */ - uxTaskNumber++; - - if( pxTCB == pxCurrentTCB ) - { - /* A task is deleting itself. This cannot complete within the - task itself, as a context switch to another task is required. - Place the task in the termination list. The idle task will - check the termination list and free up any memory allocated by - the scheduler for the TCB and stack of the deleted task. */ - vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) ); - - /* Increment the ucTasksDeleted variable so the idle task knows - there is a task that has been deleted and that it should therefore - check the xTasksWaitingTermination list. */ - ++uxDeletedTasksWaitingCleanUp; - - /* Call the delete hook before portPRE_TASK_DELETE_HOOK() as - portPRE_TASK_DELETE_HOOK() does not return in the Win32 port. */ - traceTASK_DELETE( pxTCB ); - - /* The pre-delete hook is primarily for the Windows simulator, - in which Windows specific clean up operations are performed, - after which it is not possible to yield away from this task - - hence xYieldPending is used to latch that a context switch is - required. */ - portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending ); - } - else - { - --uxCurrentNumberOfTasks; - traceTASK_DELETE( pxTCB ); - prvDeleteTCB( pxTCB ); - - /* Reset the next expected unblock time in case it referred to - the task that has just been deleted. */ - prvResetNextTaskUnblockTime(); - } - } - taskEXIT_CRITICAL(); - - /* Force a reschedule if it is the currently running task that has just - been deleted. */ - if( xSchedulerRunning != pdFALSE ) - { - if( pxTCB == pxCurrentTCB ) - { - configASSERT( uxSchedulerSuspended == 0 ); - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - -#endif /* INCLUDE_vTaskDelete */ -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskDelayUntil == 1 ) - - void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) - { - TickType_t xTimeToWake; - BaseType_t xAlreadyYielded, xShouldDelay = pdFALSE; - - configASSERT( pxPreviousWakeTime ); - configASSERT( ( xTimeIncrement > 0U ) ); - configASSERT( uxSchedulerSuspended == 0 ); - - vTaskSuspendAll(); - { - /* Minor optimisation. The tick count cannot change in this - block. */ - const TickType_t xConstTickCount = xTickCount; - - /* Generate the tick time at which the task wants to wake. */ - xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; - - if( xConstTickCount < *pxPreviousWakeTime ) - { - /* The tick count has overflowed since this function was - lasted called. In this case the only time we should ever - actually delay is if the wake time has also overflowed, - and the wake time is greater than the tick time. When this - is the case it is as if neither time had overflowed. */ - if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) ) - { - xShouldDelay = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* The tick time has not overflowed. In this case we will - delay if either the wake time has overflowed, and/or the - tick time is less than the wake time. */ - if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) ) - { - xShouldDelay = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - - /* Update the wake time ready for the next call. */ - *pxPreviousWakeTime = xTimeToWake; - - if( xShouldDelay != pdFALSE ) - { - traceTASK_DELAY_UNTIL( xTimeToWake ); - - /* prvAddCurrentTaskToDelayedList() needs the block time, not - the time to wake, so subtract the current tick count. */ - prvAddCurrentTaskToDelayedList( xTimeToWake - xConstTickCount, pdFALSE ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - xAlreadyYielded = xTaskResumeAll(); - - /* Force a reschedule if xTaskResumeAll has not already done so, we may - have put ourselves to sleep. */ - if( xAlreadyYielded == pdFALSE ) - { - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - -#endif /* INCLUDE_vTaskDelayUntil */ -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskDelay == 1 ) - - void vTaskDelay( const TickType_t xTicksToDelay ) - { - BaseType_t xAlreadyYielded = pdFALSE; - - /* A delay time of zero just forces a reschedule. */ - if( xTicksToDelay > ( TickType_t ) 0U ) - { - configASSERT( uxSchedulerSuspended == 0 ); - vTaskSuspendAll(); - { - traceTASK_DELAY(); - - /* A task that is removed from the event list while the - scheduler is suspended will not get placed in the ready - list or removed from the blocked list until the scheduler - is resumed. - - This task cannot be in an event list as it is the currently - executing task. */ - prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE ); - } - xAlreadyYielded = xTaskResumeAll(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Force a reschedule if xTaskResumeAll has not already done so, we may - have put ourselves to sleep. */ - if( xAlreadyYielded == pdFALSE ) - { - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - -#endif /* INCLUDE_vTaskDelay */ -/*-----------------------------------------------------------*/ - -#if( ( INCLUDE_eTaskGetState == 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_xTaskAbortDelay == 1 ) ) - - eTaskState eTaskGetState( TaskHandle_t xTask ) - { - eTaskState eReturn; - List_t const * pxStateList, *pxDelayedList, *pxOverflowedDelayedList; - const TCB_t * const pxTCB = xTask; - - configASSERT( pxTCB ); - - if( pxTCB == pxCurrentTCB ) - { - /* The task calling this function is querying its own state. */ - eReturn = eRunning; - } - else - { - taskENTER_CRITICAL(); - { - pxStateList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) ); - pxDelayedList = pxDelayedTaskList; - pxOverflowedDelayedList = pxOverflowDelayedTaskList; - } - taskEXIT_CRITICAL(); - - if( ( pxStateList == pxDelayedList ) || ( pxStateList == pxOverflowedDelayedList ) ) - { - /* The task being queried is referenced from one of the Blocked - lists. */ - eReturn = eBlocked; - } - - #if ( INCLUDE_vTaskSuspend == 1 ) - else if( pxStateList == &xSuspendedTaskList ) - { - /* The task being queried is referenced from the suspended - list. Is it genuinely suspended or is it blocked - indefinitely? */ - if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ) - { - #if( configUSE_TASK_NOTIFICATIONS == 1 ) - { - /* The task does not appear on the event list item of - and of the RTOS objects, but could still be in the - blocked state if it is waiting on its notification - rather than waiting on an object. */ - if( pxTCB->ucNotifyState == taskWAITING_NOTIFICATION ) - { - eReturn = eBlocked; - } - else - { - eReturn = eSuspended; - } - } - #else - { - eReturn = eSuspended; - } - #endif - } - else - { - eReturn = eBlocked; - } - } - #endif - - #if ( INCLUDE_vTaskDelete == 1 ) - else if( ( pxStateList == &xTasksWaitingTermination ) || ( pxStateList == NULL ) ) - { - /* The task being queried is referenced from the deleted - tasks list, or it is not referenced from any lists at - all. */ - eReturn = eDeleted; - } - #endif - - else /*lint !e525 Negative indentation is intended to make use of pre-processor clearer. */ - { - /* If the task is not in any other state, it must be in the - Ready (including pending ready) state. */ - eReturn = eReady; - } - } - - return eReturn; - } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ - -#endif /* INCLUDE_eTaskGetState */ -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_uxTaskPriorityGet == 1 ) - - UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) - { - TCB_t const *pxTCB; - UBaseType_t uxReturn; - - taskENTER_CRITICAL(); - { - /* If null is passed in here then it is the priority of the task - that called uxTaskPriorityGet() that is being queried. */ - pxTCB = prvGetTCBFromHandle( xTask ); - uxReturn = pxTCB->uxPriority; - } - taskEXIT_CRITICAL(); - - return uxReturn; - } - -#endif /* INCLUDE_uxTaskPriorityGet */ -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_uxTaskPriorityGet == 1 ) - - UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) - { - TCB_t const *pxTCB; - UBaseType_t uxReturn, uxSavedInterruptState; - - /* RTOS ports that support interrupt nesting have the concept of a - maximum system call (or maximum API call) interrupt priority. - Interrupts that are above the maximum system call priority are keep - permanently enabled, even when the RTOS kernel is in a critical section, - but cannot make any calls to FreeRTOS API functions. If configASSERT() - is defined in FreeRTOSConfig.h then - portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has - been assigned a priority above the configured maximum system call - priority. Only FreeRTOS functions that end in FromISR can be called - from interrupts that have been assigned a priority at or (logically) - below the maximum system call interrupt priority. FreeRTOS maintains a - separate interrupt safe API to ensure interrupt entry is as fast and as - simple as possible. More information (albeit Cortex-M specific) is - provided on the following link: - https://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - - uxSavedInterruptState = portSET_INTERRUPT_MASK_FROM_ISR(); - { - /* If null is passed in here then it is the priority of the calling - task that is being queried. */ - pxTCB = prvGetTCBFromHandle( xTask ); - uxReturn = pxTCB->uxPriority; - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptState ); - - return uxReturn; - } - -#endif /* INCLUDE_uxTaskPriorityGet */ -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskPrioritySet == 1 ) - - void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) - { - TCB_t *pxTCB; - UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry; - BaseType_t xYieldRequired = pdFALSE; - - configASSERT( ( uxNewPriority < configMAX_PRIORITIES ) ); - - /* Ensure the new priority is valid. */ - if( uxNewPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) - { - uxNewPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - taskENTER_CRITICAL(); - { - /* If null is passed in here then it is the priority of the calling - task that is being changed. */ - pxTCB = prvGetTCBFromHandle( xTask ); - - traceTASK_PRIORITY_SET( pxTCB, uxNewPriority ); - - #if ( configUSE_MUTEXES == 1 ) - { - uxCurrentBasePriority = pxTCB->uxBasePriority; - } - #else - { - uxCurrentBasePriority = pxTCB->uxPriority; - } - #endif - - if( uxCurrentBasePriority != uxNewPriority ) - { - /* The priority change may have readied a task of higher - priority than the calling task. */ - if( uxNewPriority > uxCurrentBasePriority ) - { - if( pxTCB != pxCurrentTCB ) - { - /* The priority of a task other than the currently - running task is being raised. Is the priority being - raised above that of the running task? */ - if( uxNewPriority >= pxCurrentTCB->uxPriority ) - { - xYieldRequired = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* The priority of the running task is being raised, - but the running task must already be the highest - priority task able to run so no yield is required. */ - } - } - else if( pxTCB == pxCurrentTCB ) - { - /* Setting the priority of the running task down means - there may now be another task of higher priority that - is ready to execute. */ - xYieldRequired = pdTRUE; - } - else - { - /* Setting the priority of any other task down does not - require a yield as the running task must be above the - new priority of the task being modified. */ - } - - /* Remember the ready list the task might be referenced from - before its uxPriority member is changed so the - taskRESET_READY_PRIORITY() macro can function correctly. */ - uxPriorityUsedOnEntry = pxTCB->uxPriority; - - #if ( configUSE_MUTEXES == 1 ) - { - /* Only change the priority being used if the task is not - currently using an inherited priority. */ - if( pxTCB->uxBasePriority == pxTCB->uxPriority ) - { - pxTCB->uxPriority = uxNewPriority; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* The base priority gets set whatever. */ - pxTCB->uxBasePriority = uxNewPriority; - } - #else - { - pxTCB->uxPriority = uxNewPriority; - } - #endif - - /* Only reset the event list item value if the value is not - being used for anything else. */ - if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) - { - listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxNewPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* If the task is in the blocked or suspended list we need do - nothing more than change its priority variable. However, if - the task is in a ready list it needs to be removed and placed - in the list appropriate to its new priority. */ - if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) - { - /* The task is currently in its ready list - remove before - adding it to it's new ready list. As we are in a critical - section we can do this even if the scheduler is suspended. */ - if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - /* It is known that the task is in its ready list so - there is no need to check again and the port level - reset macro can be called directly. */ - portRESET_READY_PRIORITY( uxPriorityUsedOnEntry, uxTopReadyPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - prvAddTaskToReadyList( pxTCB ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - if( xYieldRequired != pdFALSE ) - { - taskYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Remove compiler warning about unused variables when the port - optimised task selection is not being used. */ - ( void ) uxPriorityUsedOnEntry; - } - } - taskEXIT_CRITICAL(); - } - -#endif /* INCLUDE_vTaskPrioritySet */ -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskSuspend == 1 ) - - void vTaskSuspend( TaskHandle_t xTaskToSuspend ) - { - TCB_t *pxTCB; - - taskENTER_CRITICAL(); - { - /* If null is passed in here then it is the running task that is - being suspended. */ - pxTCB = prvGetTCBFromHandle( xTaskToSuspend ); - - traceTASK_SUSPEND( pxTCB ); - - /* Remove task from the ready/delayed list and place in the - suspended list. */ - if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - taskRESET_READY_PRIORITY( pxTCB->uxPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Is the task waiting on an event also? */ - if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) - { - ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ); - - #if( configUSE_TASK_NOTIFICATIONS == 1 ) - { - if( pxTCB->ucNotifyState == taskWAITING_NOTIFICATION ) - { - /* The task was blocked to wait for a notification, but is - now suspended, so no notification was received. */ - pxTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; - } - } - #endif - } - taskEXIT_CRITICAL(); - - if( xSchedulerRunning != pdFALSE ) - { - /* Reset the next expected unblock time in case it referred to the - task that is now in the Suspended state. */ - taskENTER_CRITICAL(); - { - prvResetNextTaskUnblockTime(); - } - taskEXIT_CRITICAL(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - if( pxTCB == pxCurrentTCB ) - { - if( xSchedulerRunning != pdFALSE ) - { - /* The current task has just been suspended. */ - configASSERT( uxSchedulerSuspended == 0 ); - portYIELD_WITHIN_API(); - } - else - { - /* The scheduler is not running, but the task that was pointed - to by pxCurrentTCB has just been suspended and pxCurrentTCB - must be adjusted to point to a different task. */ - if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) /*lint !e931 Right has no side effect, just volatile. */ - { - /* No other tasks are ready, so set pxCurrentTCB back to - NULL so when the next task is created pxCurrentTCB will - be set to point to it no matter what its relative priority - is. */ - pxCurrentTCB = NULL; - } - else - { - vTaskSwitchContext(); - } - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - -#endif /* INCLUDE_vTaskSuspend */ -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskSuspend == 1 ) - - static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) - { - BaseType_t xReturn = pdFALSE; - const TCB_t * const pxTCB = xTask; - - /* Accesses xPendingReadyList so must be called from a critical - section. */ - - /* It does not make sense to check if the calling task is suspended. */ - configASSERT( xTask ); - - /* Is the task being resumed actually in the suspended list? */ - if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ) != pdFALSE ) - { - /* Has the task already been resumed from within an ISR? */ - if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) == pdFALSE ) - { - /* Is it in the suspended list because it is in the Suspended - state, or because is is blocked with no timeout? */ - if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) != pdFALSE ) /*lint !e961. The cast is only redundant when NULL is used. */ - { - xReturn = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - return xReturn; - } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ - -#endif /* INCLUDE_vTaskSuspend */ -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskSuspend == 1 ) - - void vTaskResume( TaskHandle_t xTaskToResume ) - { - TCB_t * const pxTCB = xTaskToResume; - - /* It does not make sense to resume the calling task. */ - configASSERT( xTaskToResume ); - - /* The parameter cannot be NULL as it is impossible to resume the - currently executing task. */ - if( ( pxTCB != pxCurrentTCB ) && ( pxTCB != NULL ) ) - { - taskENTER_CRITICAL(); - { - if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) - { - traceTASK_RESUME( pxTCB ); - - /* The ready list can be accessed even if the scheduler is - suspended because this is inside a critical section. */ - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxTCB ); - - /* A higher priority task may have just been resumed. */ - if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) - { - /* This yield may not cause the task just resumed to run, - but will leave the lists in the correct state for the - next yield. */ - taskYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - -#endif /* INCLUDE_vTaskSuspend */ - -/*-----------------------------------------------------------*/ - -#if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) - - BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) - { - BaseType_t xYieldRequired = pdFALSE; - TCB_t * const pxTCB = xTaskToResume; - UBaseType_t uxSavedInterruptStatus; - - configASSERT( xTaskToResume ); - - /* RTOS ports that support interrupt nesting have the concept of a - maximum system call (or maximum API call) interrupt priority. - Interrupts that are above the maximum system call priority are keep - permanently enabled, even when the RTOS kernel is in a critical section, - but cannot make any calls to FreeRTOS API functions. If configASSERT() - is defined in FreeRTOSConfig.h then - portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has - been assigned a priority above the configured maximum system call - priority. Only FreeRTOS functions that end in FromISR can be called - from interrupts that have been assigned a priority at or (logically) - below the maximum system call interrupt priority. FreeRTOS maintains a - separate interrupt safe API to ensure interrupt entry is as fast and as - simple as possible. More information (albeit Cortex-M specific) is - provided on the following link: - https://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - { - if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) - { - traceTASK_RESUME_FROM_ISR( pxTCB ); - - /* Check the ready lists can be accessed. */ - if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) - { - /* Ready lists can be accessed so move the task from the - suspended list to the ready list directly. */ - if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) - { - xYieldRequired = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxTCB ); - } - else - { - /* The delayed or ready lists cannot be accessed so the task - is held in the pending ready list until the scheduler is - unsuspended. */ - vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - - return xYieldRequired; - } - -#endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */ -/*-----------------------------------------------------------*/ - -void vTaskStartScheduler( void ) -{ -BaseType_t xReturn; - - /* Add the idle task at the lowest priority. */ - #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - { - StaticTask_t *pxIdleTaskTCBBuffer = NULL; - StackType_t *pxIdleTaskStackBuffer = NULL; - uint32_t ulIdleTaskStackSize; - - /* The Idle task is created using user provided RAM - obtain the - address of the RAM then create the idle task. */ - vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize ); - xIdleTaskHandle = xTaskCreateStatic( prvIdleTask, - configIDLE_TASK_NAME, - ulIdleTaskStackSize, - ( void * ) NULL, /*lint !e961. The cast is not redundant for all compilers. */ - portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ - pxIdleTaskStackBuffer, - pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ - - if( xIdleTaskHandle != NULL ) - { - xReturn = pdPASS; - } - else - { - xReturn = pdFAIL; - } - } - #else - { - /* The Idle task is being created using dynamically allocated RAM. */ - xReturn = xTaskCreate( prvIdleTask, - configIDLE_TASK_NAME, - configMINIMAL_STACK_SIZE, - ( void * ) NULL, - portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ - &xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ - } - #endif /* configSUPPORT_STATIC_ALLOCATION */ - - #if ( configUSE_TIMERS == 1 ) - { - if( xReturn == pdPASS ) - { - xReturn = xTimerCreateTimerTask(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_TIMERS */ - - if( xReturn == pdPASS ) - { - /* freertos_tasks_c_additions_init() should only be called if the user - definable macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is - the only macro called by the function. */ - #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT - { - freertos_tasks_c_additions_init(); - } - #endif - - /* Interrupts are turned off here, to ensure a tick does not occur - before or during the call to xPortStartScheduler(). The stacks of - the created tasks contain a status word with interrupts switched on - so interrupts will automatically get re-enabled when the first task - starts to run. */ - portDISABLE_INTERRUPTS(); - - #if ( configUSE_NEWLIB_REENTRANT == 1 ) - { - /* Switch Newlib's _impure_ptr variable to point to the _reent - structure specific to the task that will run first. - See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html - for additional information. */ - _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); - } - #endif /* configUSE_NEWLIB_REENTRANT */ - - xNextTaskUnblockTime = portMAX_DELAY; - xSchedulerRunning = pdTRUE; - xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; - - /* If configGENERATE_RUN_TIME_STATS is defined then the following - macro must be defined to configure the timer/counter used to generate - the run time counter time base. NOTE: If configGENERATE_RUN_TIME_STATS - is set to 0 and the following line fails to build then ensure you do not - have portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() defined in your - FreeRTOSConfig.h file. */ - portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(); - - traceTASK_SWITCHED_IN(); - - /* Setting up the timer tick is hardware specific and thus in the - portable interface. */ - if( xPortStartScheduler() != pdFALSE ) - { - /* Should not reach here as if the scheduler is running the - function will not return. */ - } - else - { - /* Should only reach here if a task calls xTaskEndScheduler(). */ - } - } - else - { - /* This line will only be reached if the kernel could not be started, - because there was not enough FreeRTOS heap to create the idle task - or the timer task. */ - configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ); - } - - /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0, - meaning xIdleTaskHandle is not used anywhere else. */ - ( void ) xIdleTaskHandle; -} -/*-----------------------------------------------------------*/ - -void vTaskEndScheduler( void ) -{ - /* Stop the scheduler interrupts and call the portable scheduler end - routine so the original ISRs can be restored if necessary. The port - layer must ensure interrupts enable bit is left in the correct state. */ - portDISABLE_INTERRUPTS(); - xSchedulerRunning = pdFALSE; - vPortEndScheduler(); -} -/*----------------------------------------------------------*/ - -void vTaskSuspendAll( void ) -{ - /* A critical section is not required as the variable is of type - BaseType_t. Please read Richard Barry's reply in the following link to a - post in the FreeRTOS support forum before reporting this as a bug! - - http://goo.gl/wu4acr */ - - /* portSOFRWARE_BARRIER() is only implemented for emulated/simulated ports that - do not otherwise exhibit real time behaviour. */ - portSOFTWARE_BARRIER(); - - /* The scheduler is suspended if uxSchedulerSuspended is non-zero. An increment - is used to allow calls to vTaskSuspendAll() to nest. */ - ++uxSchedulerSuspended; - - /* Enforces ordering for ports and optimised compilers that may otherwise place - the above increment elsewhere. */ - portMEMORY_BARRIER(); -} -/*----------------------------------------------------------*/ - -#if ( configUSE_TICKLESS_IDLE != 0 ) - - static TickType_t prvGetExpectedIdleTime( void ) - { - TickType_t xReturn; - UBaseType_t uxHigherPriorityReadyTasks = pdFALSE; - - /* uxHigherPriorityReadyTasks takes care of the case where - configUSE_PREEMPTION is 0, so there may be tasks above the idle priority - task that are in the Ready state, even though the idle task is - running. */ - #if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) - { - if( uxTopReadyPriority > tskIDLE_PRIORITY ) - { - uxHigherPriorityReadyTasks = pdTRUE; - } - } - #else - { - const UBaseType_t uxLeastSignificantBit = ( UBaseType_t ) 0x01; - - /* When port optimised task selection is used the uxTopReadyPriority - variable is used as a bit map. If bits other than the least - significant bit are set then there are tasks that have a priority - above the idle priority that are in the Ready state. This takes - care of the case where the co-operative scheduler is in use. */ - if( uxTopReadyPriority > uxLeastSignificantBit ) - { - uxHigherPriorityReadyTasks = pdTRUE; - } - } - #endif - - if( pxCurrentTCB->uxPriority > tskIDLE_PRIORITY ) - { - xReturn = 0; - } - else if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > 1 ) - { - /* There are other idle priority tasks in the ready state. If - time slicing is used then the very next tick interrupt must be - processed. */ - xReturn = 0; - } - else if( uxHigherPriorityReadyTasks != pdFALSE ) - { - /* There are tasks in the Ready state that have a priority above the - idle priority. This path can only be reached if - configUSE_PREEMPTION is 0. */ - xReturn = 0; - } - else - { - xReturn = xNextTaskUnblockTime - xTickCount; - } - - return xReturn; - } - -#endif /* configUSE_TICKLESS_IDLE */ -/*----------------------------------------------------------*/ - -BaseType_t xTaskResumeAll( void ) -{ -TCB_t *pxTCB = NULL; -BaseType_t xAlreadyYielded = pdFALSE; - - /* If uxSchedulerSuspended is zero then this function does not match a - previous call to vTaskSuspendAll(). */ - configASSERT( uxSchedulerSuspended ); - - /* It is possible that an ISR caused a task to be removed from an event - list while the scheduler was suspended. If this was the case then the - removed task will have been added to the xPendingReadyList. Once the - scheduler has been resumed it is safe to move all the pending ready - tasks from this list into their appropriate ready list. */ - taskENTER_CRITICAL(); - { - --uxSchedulerSuspended; - - if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) - { - if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U ) - { - /* Move any readied tasks from the pending list into the - appropriate ready list. */ - while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE ) - { - pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxTCB ); - - /* If the moved task has a priority higher than the current - task then a yield must be performed. */ - if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) - { - xYieldPending = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - - if( pxTCB != NULL ) - { - /* A task was unblocked while the scheduler was suspended, - which may have prevented the next unblock time from being - re-calculated, in which case re-calculate it now. Mainly - important for low power tickless implementations, where - this can prevent an unnecessary exit from low power - state. */ - prvResetNextTaskUnblockTime(); - } - - /* If any ticks occurred while the scheduler was suspended then - they should be processed now. This ensures the tick count does - not slip, and that any delayed tasks are resumed at the correct - time. */ - { - TickType_t xPendedCounts = xPendedTicks; /* Non-volatile copy. */ - - if( xPendedCounts > ( TickType_t ) 0U ) - { - do - { - if( xTaskIncrementTick() != pdFALSE ) - { - xYieldPending = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - --xPendedCounts; - } while( xPendedCounts > ( TickType_t ) 0U ); - - xPendedTicks = 0; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - - if( xYieldPending != pdFALSE ) - { - #if( configUSE_PREEMPTION != 0 ) - { - xAlreadyYielded = pdTRUE; - } - #endif - taskYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL(); - - return xAlreadyYielded; -} -/*-----------------------------------------------------------*/ - -TickType_t xTaskGetTickCount( void ) -{ -TickType_t xTicks; - - /* Critical section required if running on a 16 bit processor. */ - portTICK_TYPE_ENTER_CRITICAL(); - { - xTicks = xTickCount; - } - portTICK_TYPE_EXIT_CRITICAL(); - - return xTicks; -} -/*-----------------------------------------------------------*/ - -TickType_t xTaskGetTickCountFromISR( void ) -{ -TickType_t xReturn; -UBaseType_t uxSavedInterruptStatus; - - /* RTOS ports that support interrupt nesting have the concept of a maximum - system call (or maximum API call) interrupt priority. Interrupts that are - above the maximum system call priority are kept permanently enabled, even - when the RTOS kernel is in a critical section, but cannot make any calls to - FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h - then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has been - assigned a priority above the configured maximum system call priority. - Only FreeRTOS functions that end in FromISR can be called from interrupts - that have been assigned a priority at or (logically) below the maximum - system call interrupt priority. FreeRTOS maintains a separate interrupt - safe API to ensure interrupt entry is as fast and as simple as possible. - More information (albeit Cortex-M specific) is provided on the following - link: https://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - - uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR(); - { - xReturn = xTickCount; - } - portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -UBaseType_t uxTaskGetNumberOfTasks( void ) -{ - /* A critical section is not required because the variables are of type - BaseType_t. */ - return uxCurrentNumberOfTasks; -} -/*-----------------------------------------------------------*/ - -char *pcTaskGetName( TaskHandle_t xTaskToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ -{ -TCB_t *pxTCB; - - /* If null is passed in here then the name of the calling task is being - queried. */ - pxTCB = prvGetTCBFromHandle( xTaskToQuery ); - configASSERT( pxTCB ); - return &( pxTCB->pcTaskName[ 0 ] ); -} -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_xTaskGetHandle == 1 ) - - static TCB_t *prvSearchForNameWithinSingleList( List_t *pxList, const char pcNameToQuery[] ) - { - TCB_t *pxNextTCB, *pxFirstTCB, *pxReturn = NULL; - UBaseType_t x; - char cNextChar; - BaseType_t xBreakLoop; - - /* This function is called with the scheduler suspended. */ - - if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) - { - listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - - do - { - listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - - /* Check each character in the name looking for a match or - mismatch. */ - xBreakLoop = pdFALSE; - for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) - { - cNextChar = pxNextTCB->pcTaskName[ x ]; - - if( cNextChar != pcNameToQuery[ x ] ) - { - /* Characters didn't match. */ - xBreakLoop = pdTRUE; - } - else if( cNextChar == ( char ) 0x00 ) - { - /* Both strings terminated, a match must have been - found. */ - pxReturn = pxNextTCB; - xBreakLoop = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - if( xBreakLoop != pdFALSE ) - { - break; - } - } - - if( pxReturn != NULL ) - { - /* The handle has been found. */ - break; - } - - } while( pxNextTCB != pxFirstTCB ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - return pxReturn; - } - -#endif /* INCLUDE_xTaskGetHandle */ -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_xTaskGetHandle == 1 ) - - TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - { - UBaseType_t uxQueue = configMAX_PRIORITIES; - TCB_t* pxTCB; - - /* Task names will be truncated to configMAX_TASK_NAME_LEN - 1 bytes. */ - configASSERT( strlen( pcNameToQuery ) < configMAX_TASK_NAME_LEN ); - - vTaskSuspendAll(); - { - /* Search the ready lists. */ - do - { - uxQueue--; - pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) &( pxReadyTasksLists[ uxQueue ] ), pcNameToQuery ); - - if( pxTCB != NULL ) - { - /* Found the handle. */ - break; - } - - } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - - /* Search the delayed lists. */ - if( pxTCB == NULL ) - { - pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxDelayedTaskList, pcNameToQuery ); - } - - if( pxTCB == NULL ) - { - pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxOverflowDelayedTaskList, pcNameToQuery ); - } - - #if ( INCLUDE_vTaskSuspend == 1 ) - { - if( pxTCB == NULL ) - { - /* Search the suspended list. */ - pxTCB = prvSearchForNameWithinSingleList( &xSuspendedTaskList, pcNameToQuery ); - } - } - #endif - - #if( INCLUDE_vTaskDelete == 1 ) - { - if( pxTCB == NULL ) - { - /* Search the deleted list. */ - pxTCB = prvSearchForNameWithinSingleList( &xTasksWaitingTermination, pcNameToQuery ); - } - } - #endif - } - ( void ) xTaskResumeAll(); - - return pxTCB; - } - -#endif /* INCLUDE_xTaskGetHandle */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) - { - UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES; - - vTaskSuspendAll(); - { - /* Is there a space in the array for each task in the system? */ - if( uxArraySize >= uxCurrentNumberOfTasks ) - { - /* Fill in an TaskStatus_t structure with information on each - task in the Ready state. */ - do - { - uxQueue--; - uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ), eReady ); - - } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - - /* Fill in an TaskStatus_t structure with information on each - task in the Blocked state. */ - uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxDelayedTaskList, eBlocked ); - uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxOverflowDelayedTaskList, eBlocked ); - - #if( INCLUDE_vTaskDelete == 1 ) - { - /* Fill in an TaskStatus_t structure with information on - each task that has been deleted but not yet cleaned up. */ - uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination, eDeleted ); - } - #endif - - #if ( INCLUDE_vTaskSuspend == 1 ) - { - /* Fill in an TaskStatus_t structure with information on - each task in the Suspended state. */ - uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList, eSuspended ); - } - #endif - - #if ( configGENERATE_RUN_TIME_STATS == 1) - { - if( pulTotalRunTime != NULL ) - { - #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE - portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) ); - #else - *pulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); - #endif - } - } - #else - { - if( pulTotalRunTime != NULL ) - { - *pulTotalRunTime = 0; - } - } - #endif - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - ( void ) xTaskResumeAll(); - - return uxTask; - } - -#endif /* configUSE_TRACE_FACILITY */ -/*----------------------------------------------------------*/ - -#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) - - TaskHandle_t xTaskGetIdleTaskHandle( void ) - { - /* If xTaskGetIdleTaskHandle() is called before the scheduler has been - started, then xIdleTaskHandle will be NULL. */ - configASSERT( ( xIdleTaskHandle != NULL ) ); - return xIdleTaskHandle; - } - -#endif /* INCLUDE_xTaskGetIdleTaskHandle */ -/*----------------------------------------------------------*/ - -/* This conditional compilation should use inequality to 0, not equality to 1. -This is to ensure vTaskStepTick() is available when user defined low power mode -implementations require configUSE_TICKLESS_IDLE to be set to a value other than -1. */ -#if ( configUSE_TICKLESS_IDLE != 0 ) - - void vTaskStepTick( const TickType_t xTicksToJump ) - { - /* Correct the tick count value after a period during which the tick - was suppressed. Note this does *not* call the tick hook function for - each stepped tick. */ - configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime ); - xTickCount += xTicksToJump; - traceINCREASE_TICK_COUNT( xTicksToJump ); - } - -#endif /* configUSE_TICKLESS_IDLE */ -/*----------------------------------------------------------*/ - -BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) -{ -BaseType_t xYieldRequired = pdFALSE; - - /* Must not be called with the scheduler suspended as the implementation - relies on xPendedTicks being wound down to 0 in xTaskResumeAll(). */ - configASSERT( uxSchedulerSuspended == 0 ); - - /* Use xPendedTicks to mimic xTicksToCatchUp number of ticks occurring when - the scheduler is suspended so the ticks are executed in xTaskResumeAll(). */ - vTaskSuspendAll(); - xPendedTicks += xTicksToCatchUp; - xYieldRequired = xTaskResumeAll(); - - return xYieldRequired; -} -/*----------------------------------------------------------*/ - -#if ( INCLUDE_xTaskAbortDelay == 1 ) - - BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) - { - TCB_t *pxTCB = xTask; - BaseType_t xReturn; - - configASSERT( pxTCB ); - - vTaskSuspendAll(); - { - /* A task can only be prematurely removed from the Blocked state if - it is actually in the Blocked state. */ - if( eTaskGetState( xTask ) == eBlocked ) - { - xReturn = pdPASS; - - /* Remove the reference to the task from the blocked list. An - interrupt won't touch the xStateListItem because the - scheduler is suspended. */ - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - - /* Is the task waiting on an event also? If so remove it from - the event list too. Interrupts can touch the event list item, - even though the scheduler is suspended, so a critical section - is used. */ - taskENTER_CRITICAL(); - { - if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) - { - ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); - - /* This lets the task know it was forcibly removed from the - blocked state so it should not re-evaluate its block time and - then block again. */ - pxTCB->ucDelayAborted = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL(); - - /* Place the unblocked task into the appropriate ready list. */ - prvAddTaskToReadyList( pxTCB ); - - /* A task being unblocked cannot cause an immediate context - switch if preemption is turned off. */ - #if ( configUSE_PREEMPTION == 1 ) - { - /* Preemption is on, but a context switch should only be - performed if the unblocked task has a priority that is - equal to or higher than the currently executing task. */ - if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) - { - /* Pend the yield to be performed when the scheduler - is unsuspended. */ - xYieldPending = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_PREEMPTION */ - } - else - { - xReturn = pdFAIL; - } - } - ( void ) xTaskResumeAll(); - - return xReturn; - } - -#endif /* INCLUDE_xTaskAbortDelay */ -/*----------------------------------------------------------*/ - -BaseType_t xTaskIncrementTick( void ) -{ -TCB_t * pxTCB; -TickType_t xItemValue; -BaseType_t xSwitchRequired = pdFALSE; - - /* Called by the portable layer each time a tick interrupt occurs. - Increments the tick then checks to see if the new tick value will cause any - tasks to be unblocked. */ - traceTASK_INCREMENT_TICK( xTickCount ); - if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) - { - /* Minor optimisation. The tick count cannot change in this - block. */ - const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1; - - /* Increment the RTOS tick, switching the delayed and overflowed - delayed lists if it wraps to 0. */ - xTickCount = xConstTickCount; - - if( xConstTickCount == ( TickType_t ) 0U ) /*lint !e774 'if' does not always evaluate to false as it is looking for an overflow. */ - { - taskSWITCH_DELAYED_LISTS(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* See if this tick has made a timeout expire. Tasks are stored in - the queue in the order of their wake time - meaning once one task - has been found whose block time has not expired there is no need to - look any further down the list. */ - if( xConstTickCount >= xNextTaskUnblockTime ) - { - for( ;; ) - { - if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) - { - /* The delayed list is empty. Set xNextTaskUnblockTime - to the maximum possible value so it is extremely - unlikely that the - if( xTickCount >= xNextTaskUnblockTime ) test will pass - next time through. */ - xNextTaskUnblockTime = portMAX_DELAY; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - break; - } - else - { - /* The delayed list is not empty, get the value of the - item at the head of the delayed list. This is the time - at which the task at the head of the delayed list must - be removed from the Blocked state. */ - pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) ); - - if( xConstTickCount < xItemValue ) - { - /* It is not time to unblock this item yet, but the - item value is the time at which the task at the head - of the blocked list must be removed from the Blocked - state - so record the item value in - xNextTaskUnblockTime. */ - xNextTaskUnblockTime = xItemValue; - break; /*lint !e9011 Code structure here is deedmed easier to understand with multiple breaks. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* It is time to remove the item from the Blocked state. */ - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - - /* Is the task waiting on an event also? If so remove - it from the event list. */ - if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) - { - ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Place the unblocked task into the appropriate ready - list. */ - prvAddTaskToReadyList( pxTCB ); - - /* A task being unblocked cannot cause an immediate - context switch if preemption is turned off. */ - #if ( configUSE_PREEMPTION == 1 ) - { - /* Preemption is on, but a context switch should - only be performed if the unblocked task has a - priority that is equal to or higher than the - currently executing task. */ - if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) - { - xSwitchRequired = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_PREEMPTION */ - } - } - } - - /* Tasks of equal priority to the currently running task will share - processing time (time slice) if preemption is on, and the application - writer has not explicitly turned time slicing off. */ - #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) - { - if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 ) - { - xSwitchRequired = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */ - - #if ( configUSE_TICK_HOOK == 1 ) - { - /* Guard against the tick hook being called when the pended tick - count is being unwound (when the scheduler is being unlocked). */ - if( xPendedTicks == ( TickType_t ) 0 ) - { - vApplicationTickHook(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_TICK_HOOK */ - - #if ( configUSE_PREEMPTION == 1 ) - { - if( xYieldPending != pdFALSE ) - { - xSwitchRequired = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_PREEMPTION */ - } - else - { - ++xPendedTicks; - - /* The tick hook gets called at regular intervals, even if the - scheduler is locked. */ - #if ( configUSE_TICK_HOOK == 1 ) - { - vApplicationTickHook(); - } - #endif - } - - return xSwitchRequired; -} -/*-----------------------------------------------------------*/ - -#if ( configUSE_APPLICATION_TASK_TAG == 1 ) - - void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) - { - TCB_t *xTCB; - - /* If xTask is NULL then it is the task hook of the calling task that is - getting set. */ - if( xTask == NULL ) - { - xTCB = ( TCB_t * ) pxCurrentTCB; - } - else - { - xTCB = xTask; - } - - /* Save the hook function in the TCB. A critical section is required as - the value can be accessed from an interrupt. */ - taskENTER_CRITICAL(); - { - xTCB->pxTaskTag = pxHookFunction; - } - taskEXIT_CRITICAL(); - } - -#endif /* configUSE_APPLICATION_TASK_TAG */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_APPLICATION_TASK_TAG == 1 ) - - TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) - { - TCB_t *pxTCB; - TaskHookFunction_t xReturn; - - /* If xTask is NULL then set the calling task's hook. */ - pxTCB = prvGetTCBFromHandle( xTask ); - - /* Save the hook function in the TCB. A critical section is required as - the value can be accessed from an interrupt. */ - taskENTER_CRITICAL(); - { - xReturn = pxTCB->pxTaskTag; - } - taskEXIT_CRITICAL(); - - return xReturn; - } - -#endif /* configUSE_APPLICATION_TASK_TAG */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_APPLICATION_TASK_TAG == 1 ) - - TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) - { - TCB_t *pxTCB; - TaskHookFunction_t xReturn; - UBaseType_t uxSavedInterruptStatus; - - /* If xTask is NULL then set the calling task's hook. */ - pxTCB = prvGetTCBFromHandle( xTask ); - - /* Save the hook function in the TCB. A critical section is required as - the value can be accessed from an interrupt. */ - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - { - xReturn = pxTCB->pxTaskTag; - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - - return xReturn; - } - -#endif /* configUSE_APPLICATION_TASK_TAG */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_APPLICATION_TASK_TAG == 1 ) - - BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) - { - TCB_t *xTCB; - BaseType_t xReturn; - - /* If xTask is NULL then we are calling our own task hook. */ - if( xTask == NULL ) - { - xTCB = pxCurrentTCB; - } - else - { - xTCB = xTask; - } - - if( xTCB->pxTaskTag != NULL ) - { - xReturn = xTCB->pxTaskTag( pvParameter ); - } - else - { - xReturn = pdFAIL; - } - - return xReturn; - } - -#endif /* configUSE_APPLICATION_TASK_TAG */ -/*-----------------------------------------------------------*/ - -void vTaskSwitchContext( void ) -{ - if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE ) - { - /* The scheduler is currently suspended - do not allow a context - switch. */ - xYieldPending = pdTRUE; - } - else - { - xYieldPending = pdFALSE; - traceTASK_SWITCHED_OUT(); - - #if ( configGENERATE_RUN_TIME_STATS == 1 ) - { - #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE - portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime ); - #else - ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); - #endif - - /* Add the amount of time the task has been running to the - accumulated time so far. The time the task started running was - stored in ulTaskSwitchedInTime. Note that there is no overflow - protection here so count values are only valid until the timer - overflows. The guard against negative values is to protect - against suspect run time stat counter implementations - which - are provided by the application, not the kernel. */ - if( ulTotalRunTime > ulTaskSwitchedInTime ) - { - pxCurrentTCB->ulRunTimeCounter += ( ulTotalRunTime - ulTaskSwitchedInTime ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - ulTaskSwitchedInTime = ulTotalRunTime; - } - #endif /* configGENERATE_RUN_TIME_STATS */ - - /* Check for stack overflow, if configured. */ - taskCHECK_FOR_STACK_OVERFLOW(); - - /* Before the currently running task is switched out, save its errno. */ - #if( configUSE_POSIX_ERRNO == 1 ) - { - pxCurrentTCB->iTaskErrno = FreeRTOS_errno; - } - #endif - - /* Select a new task to run using either the generic C or port - optimised asm code. */ - taskSELECT_HIGHEST_PRIORITY_TASK(); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - traceTASK_SWITCHED_IN(); - - /* After the new task is switched in, update the global errno. */ - #if( configUSE_POSIX_ERRNO == 1 ) - { - FreeRTOS_errno = pxCurrentTCB->iTaskErrno; - } - #endif - - #if ( configUSE_NEWLIB_REENTRANT == 1 ) - { - /* Switch Newlib's _impure_ptr variable to point to the _reent - structure specific to this task. - See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html - for additional information. */ - _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); - } - #endif /* configUSE_NEWLIB_REENTRANT */ - } -} -/*-----------------------------------------------------------*/ - -void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) -{ - configASSERT( pxEventList ); - - /* THIS FUNCTION MUST BE CALLED WITH EITHER INTERRUPTS DISABLED OR THE - SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */ - - /* Place the event list item of the TCB in the appropriate event list. - This is placed in the list in priority order so the highest priority task - is the first to be woken by the event. The queue that contains the event - list is locked, preventing simultaneous access from interrupts. */ - vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) ); - - prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); -} -/*-----------------------------------------------------------*/ - -void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) -{ - configASSERT( pxEventList ); - - /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by - the event groups implementation. */ - configASSERT( uxSchedulerSuspended != 0 ); - - /* Store the item value in the event list item. It is safe to access the - event list item here as interrupts won't access the event list item of a - task that is not in the Blocked state. */ - listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); - - /* Place the event list item of the TCB at the end of the appropriate event - list. It is safe to access the event list here because it is part of an - event group implementation - and interrupts don't access event groups - directly (instead they access them indirectly by pending function calls to - the task level). */ - vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) ); - - prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); -} -/*-----------------------------------------------------------*/ - -#if( configUSE_TIMERS == 1 ) - - void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) - { - configASSERT( pxEventList ); - - /* This function should not be called by application code hence the - 'Restricted' in its name. It is not part of the public API. It is - designed for use by kernel code, and has special calling requirements - - it should be called with the scheduler suspended. */ - - - /* Place the event list item of the TCB in the appropriate event list. - In this case it is assume that this is the only task that is going to - be waiting on this event list, so the faster vListInsertEnd() function - can be used in place of vListInsert. */ - vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) ); - - /* If the task should block indefinitely then set the block time to a - value that will be recognised as an indefinite delay inside the - prvAddCurrentTaskToDelayedList() function. */ - if( xWaitIndefinitely != pdFALSE ) - { - xTicksToWait = portMAX_DELAY; - } - - traceTASK_DELAY_UNTIL( ( xTickCount + xTicksToWait ) ); - prvAddCurrentTaskToDelayedList( xTicksToWait, xWaitIndefinitely ); - } - -#endif /* configUSE_TIMERS */ -/*-----------------------------------------------------------*/ - -BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) -{ -TCB_t *pxUnblockedTCB; -BaseType_t xReturn; - - /* THIS FUNCTION MUST BE CALLED FROM A CRITICAL SECTION. It can also be - called from a critical section within an ISR. */ - - /* The event list is sorted in priority order, so the first in the list can - be removed as it is known to be the highest priority. Remove the TCB from - the delayed list, and add it to the ready list. - - If an event is for a queue that is locked then this function will never - get called - the lock count on the queue will get modified instead. This - means exclusive access to the event list is guaranteed here. - - This function assumes that a check has already been made to ensure that - pxEventList is not empty. */ - pxUnblockedTCB = listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - configASSERT( pxUnblockedTCB ); - ( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) ); - - if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) - { - ( void ) uxListRemove( &( pxUnblockedTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxUnblockedTCB ); - - #if( configUSE_TICKLESS_IDLE != 0 ) - { - /* If a task is blocked on a kernel object then xNextTaskUnblockTime - might be set to the blocked task's time out time. If the task is - unblocked for a reason other than a timeout xNextTaskUnblockTime is - normally left unchanged, because it is automatically reset to a new - value when the tick count equals xNextTaskUnblockTime. However if - tickless idling is used it might be more important to enter sleep mode - at the earliest possible time - so reset xNextTaskUnblockTime here to - ensure it is updated at the earliest possible time. */ - prvResetNextTaskUnblockTime(); - } - #endif - } - else - { - /* The delayed and ready lists cannot be accessed, so hold this task - pending until the scheduler is resumed. */ - vListInsertEnd( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) ); - } - - if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) - { - /* Return true if the task removed from the event list has a higher - priority than the calling task. This allows the calling task to know if - it should force a context switch now. */ - xReturn = pdTRUE; - - /* Mark that a yield is pending in case the user is not using the - "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ - xYieldPending = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const TickType_t xItemValue ) -{ -TCB_t *pxUnblockedTCB; - - /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by - the event flags implementation. */ - configASSERT( uxSchedulerSuspended != pdFALSE ); - - /* Store the new item value in the event list. */ - listSET_LIST_ITEM_VALUE( pxEventListItem, xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); - - /* Remove the event list form the event flag. Interrupts do not access - event flags. */ - pxUnblockedTCB = listGET_LIST_ITEM_OWNER( pxEventListItem ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - configASSERT( pxUnblockedTCB ); - ( void ) uxListRemove( pxEventListItem ); - - #if( configUSE_TICKLESS_IDLE != 0 ) - { - /* If a task is blocked on a kernel object then xNextTaskUnblockTime - might be set to the blocked task's time out time. If the task is - unblocked for a reason other than a timeout xNextTaskUnblockTime is - normally left unchanged, because it is automatically reset to a new - value when the tick count equals xNextTaskUnblockTime. However if - tickless idling is used it might be more important to enter sleep mode - at the earliest possible time - so reset xNextTaskUnblockTime here to - ensure it is updated at the earliest possible time. */ - prvResetNextTaskUnblockTime(); - } - #endif - - /* Remove the task from the delayed list and add it to the ready list. The - scheduler is suspended so interrupts will not be accessing the ready - lists. */ - ( void ) uxListRemove( &( pxUnblockedTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxUnblockedTCB ); - - if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) - { - /* The unblocked task has a priority above that of the calling task, so - a context switch is required. This function is called with the - scheduler suspended so xYieldPending is set so the context switch - occurs immediately that the scheduler is resumed (unsuspended). */ - xYieldPending = pdTRUE; - } -} -/*-----------------------------------------------------------*/ - -void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) -{ - configASSERT( pxTimeOut ); - taskENTER_CRITICAL(); - { - pxTimeOut->xOverflowCount = xNumOfOverflows; - pxTimeOut->xTimeOnEntering = xTickCount; - } - taskEXIT_CRITICAL(); -} -/*-----------------------------------------------------------*/ - -void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) -{ - /* For internal use only as it does not use a critical section. */ - pxTimeOut->xOverflowCount = xNumOfOverflows; - pxTimeOut->xTimeOnEntering = xTickCount; -} -/*-----------------------------------------------------------*/ - -BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) -{ -BaseType_t xReturn; - - configASSERT( pxTimeOut ); - configASSERT( pxTicksToWait ); - - taskENTER_CRITICAL(); - { - /* Minor optimisation. The tick count cannot change in this block. */ - const TickType_t xConstTickCount = xTickCount; - const TickType_t xElapsedTime = xConstTickCount - pxTimeOut->xTimeOnEntering; - - #if( INCLUDE_xTaskAbortDelay == 1 ) - if( pxCurrentTCB->ucDelayAborted != ( uint8_t ) pdFALSE ) - { - /* The delay was aborted, which is not the same as a time out, - but has the same result. */ - pxCurrentTCB->ucDelayAborted = pdFALSE; - xReturn = pdTRUE; - } - else - #endif - - #if ( INCLUDE_vTaskSuspend == 1 ) - if( *pxTicksToWait == portMAX_DELAY ) - { - /* If INCLUDE_vTaskSuspend is set to 1 and the block time - specified is the maximum block time then the task should block - indefinitely, and therefore never time out. */ - xReturn = pdFALSE; - } - else - #endif - - if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */ - { - /* The tick count is greater than the time at which - vTaskSetTimeout() was called, but has also overflowed since - vTaskSetTimeOut() was called. It must have wrapped all the way - around and gone past again. This passed since vTaskSetTimeout() - was called. */ - xReturn = pdTRUE; - } - else if( xElapsedTime < *pxTicksToWait ) /*lint !e961 Explicit casting is only redundant with some compilers, whereas others require it to prevent integer conversion errors. */ - { - /* Not a genuine timeout. Adjust parameters for time remaining. */ - *pxTicksToWait -= xElapsedTime; - vTaskInternalSetTimeOutState( pxTimeOut ); - xReturn = pdFALSE; - } - else - { - *pxTicksToWait = 0; - xReturn = pdTRUE; - } - } - taskEXIT_CRITICAL(); - - return xReturn; -} -/*-----------------------------------------------------------*/ - -void vTaskMissedYield( void ) -{ - xYieldPending = pdTRUE; -} -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) - { - UBaseType_t uxReturn; - TCB_t const *pxTCB; - - if( xTask != NULL ) - { - pxTCB = xTask; - uxReturn = pxTCB->uxTaskNumber; - } - else - { - uxReturn = 0U; - } - - return uxReturn; - } - -#endif /* configUSE_TRACE_FACILITY */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) - { - TCB_t * pxTCB; - - if( xTask != NULL ) - { - pxTCB = xTask; - pxTCB->uxTaskNumber = uxHandle; - } - } - -#endif /* configUSE_TRACE_FACILITY */ - -/* - * ----------------------------------------------------------- - * The Idle task. - * ---------------------------------------------------------- - * - * The portTASK_FUNCTION() macro is used to allow port/compiler specific - * language extensions. The equivalent prototype for this function is: - * - * void prvIdleTask( void *pvParameters ); - * - */ -static portTASK_FUNCTION( prvIdleTask, pvParameters ) -{ - /* Stop warnings. */ - ( void ) pvParameters; - - /** THIS IS THE RTOS IDLE TASK - WHICH IS CREATED AUTOMATICALLY WHEN THE - SCHEDULER IS STARTED. **/ - - /* In case a task that has a secure context deletes itself, in which case - the idle task is responsible for deleting the task's secure context, if - any. */ - portALLOCATE_SECURE_CONTEXT( configMINIMAL_SECURE_STACK_SIZE ); - - for( ;; ) - { - /* See if any tasks have deleted themselves - if so then the idle task - is responsible for freeing the deleted task's TCB and stack. */ - prvCheckTasksWaitingTermination(); - - #if ( configUSE_PREEMPTION == 0 ) - { - /* If we are not using preemption we keep forcing a task switch to - see if any other task has become available. If we are using - preemption we don't need to do this as any task becoming available - will automatically get the processor anyway. */ - taskYIELD(); - } - #endif /* configUSE_PREEMPTION */ - - #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) - { - /* When using preemption tasks of equal priority will be - timesliced. If a task that is sharing the idle priority is ready - to run then the idle task should yield before the end of the - timeslice. - - A critical region is not required here as we are just reading from - the list, and an occasional incorrect value will not matter. If - the ready list at the idle priority contains more than one task - then a task other than the idle task is ready to execute. */ - if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ) - { - taskYIELD(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */ - - #if ( configUSE_IDLE_HOOK == 1 ) - { - extern void vApplicationIdleHook( void ); - - /* Call the user defined function from within the idle task. This - allows the application designer to add background functionality - without the overhead of a separate task. - NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, - CALL A FUNCTION THAT MIGHT BLOCK. */ - vApplicationIdleHook(); - } - #endif /* configUSE_IDLE_HOOK */ - - /* This conditional compilation should use inequality to 0, not equality - to 1. This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when - user defined low power mode implementations require - configUSE_TICKLESS_IDLE to be set to a value other than 1. */ - #if ( configUSE_TICKLESS_IDLE != 0 ) - { - TickType_t xExpectedIdleTime; - - /* It is not desirable to suspend then resume the scheduler on - each iteration of the idle task. Therefore, a preliminary - test of the expected idle time is performed without the - scheduler suspended. The result here is not necessarily - valid. */ - xExpectedIdleTime = prvGetExpectedIdleTime(); - - if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) - { - vTaskSuspendAll(); - { - /* Now the scheduler is suspended, the expected idle - time can be sampled again, and this time its value can - be used. */ - configASSERT( xNextTaskUnblockTime >= xTickCount ); - xExpectedIdleTime = prvGetExpectedIdleTime(); - - /* Define the following macro to set xExpectedIdleTime to 0 - if the application does not want - portSUPPRESS_TICKS_AND_SLEEP() to be called. */ - configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( xExpectedIdleTime ); - - if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) - { - traceLOW_POWER_IDLE_BEGIN(); - portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ); - traceLOW_POWER_IDLE_END(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - ( void ) xTaskResumeAll(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_TICKLESS_IDLE */ - } -} -/*-----------------------------------------------------------*/ - -#if( configUSE_TICKLESS_IDLE != 0 ) - - eSleepModeStatus eTaskConfirmSleepModeStatus( void ) - { - /* The idle task exists in addition to the application tasks. */ - const UBaseType_t uxNonApplicationTasks = 1; - eSleepModeStatus eReturn = eStandardSleep; - - /* This function must be called from a critical section. */ - - if( listCURRENT_LIST_LENGTH( &xPendingReadyList ) != 0 ) - { - /* A task was made ready while the scheduler was suspended. */ - eReturn = eAbortSleep; - } - else if( xYieldPending != pdFALSE ) - { - /* A yield was pended while the scheduler was suspended. */ - eReturn = eAbortSleep; - } - else - { - /* If all the tasks are in the suspended list (which might mean they - have an infinite block time rather than actually being suspended) - then it is safe to turn all clocks off and just wait for external - interrupts. */ - if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) ) - { - eReturn = eNoTasksWaitingTimeout; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - - return eReturn; - } - -#endif /* configUSE_TICKLESS_IDLE */ -/*-----------------------------------------------------------*/ - -#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) - - void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) - { - TCB_t *pxTCB; - - if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) - { - pxTCB = prvGetTCBFromHandle( xTaskToSet ); - configASSERT( pxTCB != NULL ); - pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue; - } - } - -#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ -/*-----------------------------------------------------------*/ - -#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) - - void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) - { - void *pvReturn = NULL; - TCB_t *pxTCB; - - if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) - { - pxTCB = prvGetTCBFromHandle( xTaskToQuery ); - pvReturn = pxTCB->pvThreadLocalStoragePointers[ xIndex ]; - } - else - { - pvReturn = NULL; - } - - return pvReturn; - } - -#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ -/*-----------------------------------------------------------*/ - -#if ( portUSING_MPU_WRAPPERS == 1 ) - - void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, const MemoryRegion_t * const xRegions ) - { - TCB_t *pxTCB; - - /* If null is passed in here then we are modifying the MPU settings of - the calling task. */ - pxTCB = prvGetTCBFromHandle( xTaskToModify ); - - vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 ); - } - -#endif /* portUSING_MPU_WRAPPERS */ -/*-----------------------------------------------------------*/ - -static void prvInitialiseTaskLists( void ) -{ -UBaseType_t uxPriority; - - for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) - { - vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) ); - } - - vListInitialise( &xDelayedTaskList1 ); - vListInitialise( &xDelayedTaskList2 ); - vListInitialise( &xPendingReadyList ); - - #if ( INCLUDE_vTaskDelete == 1 ) - { - vListInitialise( &xTasksWaitingTermination ); - } - #endif /* INCLUDE_vTaskDelete */ - - #if ( INCLUDE_vTaskSuspend == 1 ) - { - vListInitialise( &xSuspendedTaskList ); - } - #endif /* INCLUDE_vTaskSuspend */ - - /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList - using list2. */ - pxDelayedTaskList = &xDelayedTaskList1; - pxOverflowDelayedTaskList = &xDelayedTaskList2; -} -/*-----------------------------------------------------------*/ - -static void prvCheckTasksWaitingTermination( void ) -{ - - /** THIS FUNCTION IS CALLED FROM THE RTOS IDLE TASK **/ - - #if ( INCLUDE_vTaskDelete == 1 ) - { - TCB_t *pxTCB; - - /* uxDeletedTasksWaitingCleanUp is used to prevent taskENTER_CRITICAL() - being called too often in the idle task. */ - while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) - { - taskENTER_CRITICAL(); - { - pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - --uxCurrentNumberOfTasks; - --uxDeletedTasksWaitingCleanUp; - } - taskEXIT_CRITICAL(); - - prvDeleteTCB( pxTCB ); - } - } - #endif /* INCLUDE_vTaskDelete */ -} -/*-----------------------------------------------------------*/ - -#if( configUSE_TRACE_FACILITY == 1 ) - - void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) - { - TCB_t *pxTCB; - - /* xTask is NULL then get the state of the calling task. */ - pxTCB = prvGetTCBFromHandle( xTask ); - - pxTaskStatus->xHandle = ( TaskHandle_t ) pxTCB; - pxTaskStatus->pcTaskName = ( const char * ) &( pxTCB->pcTaskName [ 0 ] ); - pxTaskStatus->uxCurrentPriority = pxTCB->uxPriority; - pxTaskStatus->pxStackBase = pxTCB->pxStack; - pxTaskStatus->xTaskNumber = pxTCB->uxTCBNumber; - - #if ( configUSE_MUTEXES == 1 ) - { - pxTaskStatus->uxBasePriority = pxTCB->uxBasePriority; - } - #else - { - pxTaskStatus->uxBasePriority = 0; - } - #endif - - #if ( configGENERATE_RUN_TIME_STATS == 1 ) - { - pxTaskStatus->ulRunTimeCounter = pxTCB->ulRunTimeCounter; - } - #else - { - pxTaskStatus->ulRunTimeCounter = 0; - } - #endif - - /* Obtaining the task state is a little fiddly, so is only done if the - value of eState passed into this function is eInvalid - otherwise the - state is just set to whatever is passed in. */ - if( eState != eInvalid ) - { - if( pxTCB == pxCurrentTCB ) - { - pxTaskStatus->eCurrentState = eRunning; - } - else - { - pxTaskStatus->eCurrentState = eState; - - #if ( INCLUDE_vTaskSuspend == 1 ) - { - /* If the task is in the suspended list then there is a - chance it is actually just blocked indefinitely - so really - it should be reported as being in the Blocked state. */ - if( eState == eSuspended ) - { - vTaskSuspendAll(); - { - if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) - { - pxTaskStatus->eCurrentState = eBlocked; - } - } - ( void ) xTaskResumeAll(); - } - } - #endif /* INCLUDE_vTaskSuspend */ - } - } - else - { - pxTaskStatus->eCurrentState = eTaskGetState( pxTCB ); - } - - /* Obtaining the stack space takes some time, so the xGetFreeStackSpace - parameter is provided to allow it to be skipped. */ - if( xGetFreeStackSpace != pdFALSE ) - { - #if ( portSTACK_GROWTH > 0 ) - { - pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxEndOfStack ); - } - #else - { - pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxStack ); - } - #endif - } - else - { - pxTaskStatus->usStackHighWaterMark = 0; - } - } - -#endif /* configUSE_TRACE_FACILITY */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) - { - configLIST_VOLATILE TCB_t *pxNextTCB, *pxFirstTCB; - UBaseType_t uxTask = 0; - - if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) - { - listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - - /* Populate an TaskStatus_t structure within the - pxTaskStatusArray array for each task that is referenced from - pxList. See the definition of TaskStatus_t in task.h for the - meaning of each TaskStatus_t structure member. */ - do - { - listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - vTaskGetInfo( ( TaskHandle_t ) pxNextTCB, &( pxTaskStatusArray[ uxTask ] ), pdTRUE, eState ); - uxTask++; - } while( pxNextTCB != pxFirstTCB ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - return uxTask; - } - -#endif /* configUSE_TRACE_FACILITY */ -/*-----------------------------------------------------------*/ - -#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) - - static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) - { - uint32_t ulCount = 0U; - - while( *pucStackByte == ( uint8_t ) tskSTACK_FILL_BYTE ) - { - pucStackByte -= portSTACK_GROWTH; - ulCount++; - } - - ulCount /= ( uint32_t ) sizeof( StackType_t ); /*lint !e961 Casting is not redundant on smaller architectures. */ - - return ( configSTACK_DEPTH_TYPE ) ulCount; - } - -#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) */ -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) - - /* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the - same except for their return type. Using configSTACK_DEPTH_TYPE allows the - user to determine the return type. It gets around the problem of the value - overflowing on 8-bit types without breaking backward compatibility for - applications that expect an 8-bit return type. */ - configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) - { - TCB_t *pxTCB; - uint8_t *pucEndOfStack; - configSTACK_DEPTH_TYPE uxReturn; - - /* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are - the same except for their return type. Using configSTACK_DEPTH_TYPE - allows the user to determine the return type. It gets around the - problem of the value overflowing on 8-bit types without breaking - backward compatibility for applications that expect an 8-bit return - type. */ - - pxTCB = prvGetTCBFromHandle( xTask ); - - #if portSTACK_GROWTH < 0 - { - pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; - } - #else - { - pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; - } - #endif - - uxReturn = prvTaskCheckFreeStackSpace( pucEndOfStack ); - - return uxReturn; - } - -#endif /* INCLUDE_uxTaskGetStackHighWaterMark2 */ -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) - - UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) - { - TCB_t *pxTCB; - uint8_t *pucEndOfStack; - UBaseType_t uxReturn; - - pxTCB = prvGetTCBFromHandle( xTask ); - - #if portSTACK_GROWTH < 0 - { - pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; - } - #else - { - pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; - } - #endif - - uxReturn = ( UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack ); - - return uxReturn; - } - -#endif /* INCLUDE_uxTaskGetStackHighWaterMark */ -/*-----------------------------------------------------------*/ - -#if ( INCLUDE_vTaskDelete == 1 ) - - static void prvDeleteTCB( TCB_t *pxTCB ) - { - /* This call is required specifically for the TriCore port. It must be - above the vPortFree() calls. The call is also used by ports/demos that - want to allocate and clean RAM statically. */ - portCLEAN_UP_TCB( pxTCB ); - - /* Free up the memory allocated by the scheduler for the task. It is up - to the task to free any memory allocated at the application level. - See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html - for additional information. */ - #if ( configUSE_NEWLIB_REENTRANT == 1 ) - { - _reclaim_reent( &( pxTCB->xNewLib_reent ) ); - } - #endif /* configUSE_NEWLIB_REENTRANT */ - - #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) - { - /* The task can only have been allocated dynamically - free both - the stack and TCB. */ - vPortFree( pxTCB->pxStack ); - vPortFree( pxTCB ); - } - #elif( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ - { - /* The task could have been allocated statically or dynamically, so - check what was statically allocated before trying to free the - memory. */ - if( pxTCB->ucStaticallyAllocated == tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ) - { - /* Both the stack and TCB were allocated dynamically, so both - must be freed. */ - vPortFree( pxTCB->pxStack ); - vPortFree( pxTCB ); - } - else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY ) - { - /* Only the stack was statically allocated, so the TCB is the - only memory that must be freed. */ - vPortFree( pxTCB ); - } - else - { - /* Neither the stack nor the TCB were allocated dynamically, so - nothing needs to be freed. */ - configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ); - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ - } - -#endif /* INCLUDE_vTaskDelete */ -/*-----------------------------------------------------------*/ - -static void prvResetNextTaskUnblockTime( void ) -{ -TCB_t *pxTCB; - - if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) - { - /* The new current delayed list is empty. Set xNextTaskUnblockTime to - the maximum possible value so it is extremely unlikely that the - if( xTickCount >= xNextTaskUnblockTime ) test will pass until - there is an item in the delayed list. */ - xNextTaskUnblockTime = portMAX_DELAY; - } - else - { - /* The new current delayed list is not empty, get the value of - the item at the head of the delayed list. This is the time at - which the task at the head of the delayed list should be removed - from the Blocked state. */ - ( pxTCB ) = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) ); - } -} -/*-----------------------------------------------------------*/ - -#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) - - TaskHandle_t xTaskGetCurrentTaskHandle( void ) - { - TaskHandle_t xReturn; - - /* A critical section is not required as this is not called from - an interrupt and the current TCB will always be the same for any - individual execution thread. */ - xReturn = pxCurrentTCB; - - return xReturn; - } - -#endif /* ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */ -/*-----------------------------------------------------------*/ - -#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - - BaseType_t xTaskGetSchedulerState( void ) - { - BaseType_t xReturn; - - if( xSchedulerRunning == pdFALSE ) - { - xReturn = taskSCHEDULER_NOT_STARTED; - } - else - { - if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) - { - xReturn = taskSCHEDULER_RUNNING; - } - else - { - xReturn = taskSCHEDULER_SUSPENDED; - } - } - - return xReturn; - } - -#endif /* ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_MUTEXES == 1 ) - - BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) - { - TCB_t * const pxMutexHolderTCB = pxMutexHolder; - BaseType_t xReturn = pdFALSE; - - /* If the mutex was given back by an interrupt while the queue was - locked then the mutex holder might now be NULL. _RB_ Is this still - needed as interrupts can no longer use mutexes? */ - if( pxMutexHolder != NULL ) - { - /* If the holder of the mutex has a priority below the priority of - the task attempting to obtain the mutex then it will temporarily - inherit the priority of the task attempting to obtain the mutex. */ - if( pxMutexHolderTCB->uxPriority < pxCurrentTCB->uxPriority ) - { - /* Adjust the mutex holder state to account for its new - priority. Only reset the event list item value if the value is - not being used for anything else. */ - if( ( listGET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) - { - listSET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* If the task being modified is in the ready state it will need - to be moved into a new list. */ - if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxMutexHolderTCB->uxPriority ] ), &( pxMutexHolderTCB->xStateListItem ) ) != pdFALSE ) - { - if( uxListRemove( &( pxMutexHolderTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - /* It is known that the task is in its ready list so - there is no need to check again and the port level - reset macro can be called directly. */ - portRESET_READY_PRIORITY( pxMutexHolderTCB->uxPriority, uxTopReadyPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Inherit the priority before being moved into the new list. */ - pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority; - prvAddTaskToReadyList( pxMutexHolderTCB ); - } - else - { - /* Just inherit the priority. */ - pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority; - } - - traceTASK_PRIORITY_INHERIT( pxMutexHolderTCB, pxCurrentTCB->uxPriority ); - - /* Inheritance occurred. */ - xReturn = pdTRUE; - } - else - { - if( pxMutexHolderTCB->uxBasePriority < pxCurrentTCB->uxPriority ) - { - /* The base priority of the mutex holder is lower than the - priority of the task attempting to take the mutex, but the - current priority of the mutex holder is not lower than the - priority of the task attempting to take the mutex. - Therefore the mutex holder must have already inherited a - priority, but inheritance would have occurred if that had - not been the case. */ - xReturn = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - return xReturn; - } - -#endif /* configUSE_MUTEXES */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_MUTEXES == 1 ) - - BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) - { - TCB_t * const pxTCB = pxMutexHolder; - BaseType_t xReturn = pdFALSE; - - if( pxMutexHolder != NULL ) - { - /* A task can only have an inherited priority if it holds the mutex. - If the mutex is held by a task then it cannot be given from an - interrupt, and if a mutex is given by the holding task then it must - be the running state task. */ - configASSERT( pxTCB == pxCurrentTCB ); - configASSERT( pxTCB->uxMutexesHeld ); - ( pxTCB->uxMutexesHeld )--; - - /* Has the holder of the mutex inherited the priority of another - task? */ - if( pxTCB->uxPriority != pxTCB->uxBasePriority ) - { - /* Only disinherit if no other mutexes are held. */ - if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 ) - { - /* A task can only have an inherited priority if it holds - the mutex. If the mutex is held by a task then it cannot be - given from an interrupt, and if a mutex is given by the - holding task then it must be the running state task. Remove - the holding task from the ready/delayed list. */ - if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - taskRESET_READY_PRIORITY( pxTCB->uxPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Disinherit the priority before adding the task into the - new ready list. */ - traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); - pxTCB->uxPriority = pxTCB->uxBasePriority; - - /* Reset the event list item value. It cannot be in use for - any other purpose if this task is running, and it must be - running to give back the mutex. */ - listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - prvAddTaskToReadyList( pxTCB ); - - /* Return true to indicate that a context switch is required. - This is only actually required in the corner case whereby - multiple mutexes were held and the mutexes were given back - in an order different to that in which they were taken. - If a context switch did not occur when the first mutex was - returned, even if a task was waiting on it, then a context - switch should occur when the last mutex is returned whether - a task is waiting on it or not. */ - xReturn = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - return xReturn; - } - -#endif /* configUSE_MUTEXES */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_MUTEXES == 1 ) - - void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBaseType_t uxHighestPriorityWaitingTask ) - { - TCB_t * const pxTCB = pxMutexHolder; - UBaseType_t uxPriorityUsedOnEntry, uxPriorityToUse; - const UBaseType_t uxOnlyOneMutexHeld = ( UBaseType_t ) 1; - - if( pxMutexHolder != NULL ) - { - /* If pxMutexHolder is not NULL then the holder must hold at least - one mutex. */ - configASSERT( pxTCB->uxMutexesHeld ); - - /* Determine the priority to which the priority of the task that - holds the mutex should be set. This will be the greater of the - holding task's base priority and the priority of the highest - priority task that is waiting to obtain the mutex. */ - if( pxTCB->uxBasePriority < uxHighestPriorityWaitingTask ) - { - uxPriorityToUse = uxHighestPriorityWaitingTask; - } - else - { - uxPriorityToUse = pxTCB->uxBasePriority; - } - - /* Does the priority need to change? */ - if( pxTCB->uxPriority != uxPriorityToUse ) - { - /* Only disinherit if no other mutexes are held. This is a - simplification in the priority inheritance implementation. If - the task that holds the mutex is also holding other mutexes then - the other mutexes may have caused the priority inheritance. */ - if( pxTCB->uxMutexesHeld == uxOnlyOneMutexHeld ) - { - /* If a task has timed out because it already holds the - mutex it was trying to obtain then it cannot of inherited - its own priority. */ - configASSERT( pxTCB != pxCurrentTCB ); - - /* Disinherit the priority, remembering the previous - priority to facilitate determining the subject task's - state. */ - traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); - uxPriorityUsedOnEntry = pxTCB->uxPriority; - pxTCB->uxPriority = uxPriorityToUse; - - /* Only reset the event list item value if the value is not - being used for anything else. */ - if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) - { - listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriorityToUse ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* If the running task is not the task that holds the mutex - then the task that holds the mutex could be in either the - Ready, Blocked or Suspended states. Only remove the task - from its current state list if it is in the Ready state as - the task's priority is going to change and there is one - Ready list per priority. */ - if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) - { - if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - /* It is known that the task is in its ready list so - there is no need to check again and the port level - reset macro can be called directly. */ - portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - prvAddTaskToReadyList( pxTCB ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - -#endif /* configUSE_MUTEXES */ -/*-----------------------------------------------------------*/ - -#if ( portCRITICAL_NESTING_IN_TCB == 1 ) - - void vTaskEnterCritical( void ) - { - portDISABLE_INTERRUPTS(); - - if( xSchedulerRunning != pdFALSE ) - { - ( pxCurrentTCB->uxCriticalNesting )++; - - /* This is not the interrupt safe version of the enter critical - function so assert() if it is being called from an interrupt - context. Only API functions that end in "FromISR" can be used in an - interrupt. Only assert if the critical nesting count is 1 to - protect against recursive calls if the assert function also uses a - critical section. */ - if( pxCurrentTCB->uxCriticalNesting == 1 ) - { - portASSERT_IF_IN_ISR(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - -#endif /* portCRITICAL_NESTING_IN_TCB */ -/*-----------------------------------------------------------*/ - -#if ( portCRITICAL_NESTING_IN_TCB == 1 ) - - void vTaskExitCritical( void ) - { - if( xSchedulerRunning != pdFALSE ) - { - if( pxCurrentTCB->uxCriticalNesting > 0U ) - { - ( pxCurrentTCB->uxCriticalNesting )--; - - if( pxCurrentTCB->uxCriticalNesting == 0U ) - { - portENABLE_INTERRUPTS(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - -#endif /* portCRITICAL_NESTING_IN_TCB */ -/*-----------------------------------------------------------*/ - -#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) - - static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName ) - { - size_t x; - - /* Start by copying the entire string. */ - strcpy( pcBuffer, pcTaskName ); - - /* Pad the end of the string with spaces to ensure columns line up when - printed out. */ - for( x = strlen( pcBuffer ); x < ( size_t ) ( configMAX_TASK_NAME_LEN - 1 ); x++ ) - { - pcBuffer[ x ] = ' '; - } - - /* Terminate. */ - pcBuffer[ x ] = ( char ) 0x00; - - /* Return the new end of string. */ - return &( pcBuffer[ x ] ); - } - -#endif /* ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) */ -/*-----------------------------------------------------------*/ - -#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - - void vTaskList( char * pcWriteBuffer ) - { - TaskStatus_t *pxTaskStatusArray; - UBaseType_t uxArraySize, x; - char cStatus; - - /* - * PLEASE NOTE: - * - * This function is provided for convenience only, and is used by many - * of the demo applications. Do not consider it to be part of the - * scheduler. - * - * vTaskList() calls uxTaskGetSystemState(), then formats part of the - * uxTaskGetSystemState() output into a human readable table that - * displays task names, states and stack usage. - * - * vTaskList() has a dependency on the sprintf() C library function that - * might bloat the code size, use a lot of stack, and provide different - * results on different platforms. An alternative, tiny, third party, - * and limited functionality implementation of sprintf() is provided in - * many of the FreeRTOS/Demo sub-directories in a file called - * printf-stdarg.c (note printf-stdarg.c does not provide a full - * snprintf() implementation!). - * - * It is recommended that production systems call uxTaskGetSystemState() - * directly to get access to raw stats data, rather than indirectly - * through a call to vTaskList(). - */ - - - /* Make sure the write buffer does not contain a string. */ - *pcWriteBuffer = ( char ) 0x00; - - /* Take a snapshot of the number of tasks in case it changes while this - function is executing. */ - uxArraySize = uxCurrentNumberOfTasks; - - /* Allocate an array index for each task. NOTE! if - configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will - equate to NULL. */ - pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */ - - if( pxTaskStatusArray != NULL ) - { - /* Generate the (binary) data. */ - uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL ); - - /* Create a human readable table from the binary data. */ - for( x = 0; x < uxArraySize; x++ ) - { - switch( pxTaskStatusArray[ x ].eCurrentState ) - { - case eRunning: cStatus = tskRUNNING_CHAR; - break; - - case eReady: cStatus = tskREADY_CHAR; - break; - - case eBlocked: cStatus = tskBLOCKED_CHAR; - break; - - case eSuspended: cStatus = tskSUSPENDED_CHAR; - break; - - case eDeleted: cStatus = tskDELETED_CHAR; - break; - - case eInvalid: /* Fall through. */ - default: /* Should not get here, but it is included - to prevent static checking errors. */ - cStatus = ( char ) 0x00; - break; - } - - /* Write the task name to the string, padding with spaces so it - can be printed in tabular form more easily. */ - pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); - - /* Write the rest of the string. */ - sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ - pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers especially as in this case where it best denotes the intent of the code. */ - } - - /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION - is 0 then vPortFree() will be #defined to nothing. */ - vPortFree( pxTaskStatusArray ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - -#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ -/*----------------------------------------------------------*/ - -#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - - void vTaskGetRunTimeStats( char *pcWriteBuffer ) - { - TaskStatus_t *pxTaskStatusArray; - UBaseType_t uxArraySize, x; - uint32_t ulTotalTime, ulStatsAsPercentage; - - #if( configUSE_TRACE_FACILITY != 1 ) - { - #error configUSE_TRACE_FACILITY must also be set to 1 in FreeRTOSConfig.h to use vTaskGetRunTimeStats(). - } - #endif - - /* - * PLEASE NOTE: - * - * This function is provided for convenience only, and is used by many - * of the demo applications. Do not consider it to be part of the - * scheduler. - * - * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part - * of the uxTaskGetSystemState() output into a human readable table that - * displays the amount of time each task has spent in the Running state - * in both absolute and percentage terms. - * - * vTaskGetRunTimeStats() has a dependency on the sprintf() C library - * function that might bloat the code size, use a lot of stack, and - * provide different results on different platforms. An alternative, - * tiny, third party, and limited functionality implementation of - * sprintf() is provided in many of the FreeRTOS/Demo sub-directories in - * a file called printf-stdarg.c (note printf-stdarg.c does not provide - * a full snprintf() implementation!). - * - * It is recommended that production systems call uxTaskGetSystemState() - * directly to get access to raw stats data, rather than indirectly - * through a call to vTaskGetRunTimeStats(). - */ - - /* Make sure the write buffer does not contain a string. */ - *pcWriteBuffer = ( char ) 0x00; - - /* Take a snapshot of the number of tasks in case it changes while this - function is executing. */ - uxArraySize = uxCurrentNumberOfTasks; - - /* Allocate an array index for each task. NOTE! If - configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will - equate to NULL. */ - pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */ - - if( pxTaskStatusArray != NULL ) - { - /* Generate the (binary) data. */ - uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalTime ); - - /* For percentage calculations. */ - ulTotalTime /= 100UL; - - /* Avoid divide by zero errors. */ - if( ulTotalTime > 0UL ) - { - /* Create a human readable table from the binary data. */ - for( x = 0; x < uxArraySize; x++ ) - { - /* What percentage of the total run time has the task used? - This will always be rounded down to the nearest integer. - ulTotalRunTimeDiv100 has already been divided by 100. */ - ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalTime; - - /* Write the task name to the string, padding with - spaces so it can be printed in tabular form more - easily. */ - pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); - - if( ulStatsAsPercentage > 0UL ) - { - #ifdef portLU_PRINTF_SPECIFIER_REQUIRED - { - sprintf( pcWriteBuffer, "\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); - } - #else - { - /* sizeof( int ) == sizeof( long ) so a smaller - printf() library can be used. */ - sprintf( pcWriteBuffer, "\t%u\t\t%u%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ - } - #endif - } - else - { - /* If the percentage is zero here then the task has - consumed less than 1% of the total run time. */ - #ifdef portLU_PRINTF_SPECIFIER_REQUIRED - { - sprintf( pcWriteBuffer, "\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter ); - } - #else - { - /* sizeof( int ) == sizeof( long ) so a smaller - printf() library can be used. */ - sprintf( pcWriteBuffer, "\t%u\t\t<1%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ - } - #endif - } - - pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers especially as in this case where it best denotes the intent of the code. */ - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION - is 0 then vPortFree() will be #defined to nothing. */ - vPortFree( pxTaskStatusArray ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - -#endif /* ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */ -/*-----------------------------------------------------------*/ - -TickType_t uxTaskResetEventItemValue( void ) -{ -TickType_t uxReturn; - - uxReturn = listGET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ) ); - - /* Reset the event list item to its normal value - so it can be used with - queues and semaphores. */ - listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - - return uxReturn; -} -/*-----------------------------------------------------------*/ - -#if ( configUSE_MUTEXES == 1 ) - - TaskHandle_t pvTaskIncrementMutexHeldCount( void ) - { - /* If xSemaphoreCreateMutex() is called before any tasks have been created - then pxCurrentTCB will be NULL. */ - if( pxCurrentTCB != NULL ) - { - ( pxCurrentTCB->uxMutexesHeld )++; - } - - return pxCurrentTCB; - } - -#endif /* configUSE_MUTEXES */ -/*-----------------------------------------------------------*/ - -#if( configUSE_TASK_NOTIFICATIONS == 1 ) - - uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) - { - uint32_t ulReturn; - - taskENTER_CRITICAL(); - { - /* Only block if the notification count is not already non-zero. */ - if( pxCurrentTCB->ulNotifiedValue == 0UL ) - { - /* Mark this task as waiting for a notification. */ - pxCurrentTCB->ucNotifyState = taskWAITING_NOTIFICATION; - - if( xTicksToWait > ( TickType_t ) 0 ) - { - prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); - traceTASK_NOTIFY_TAKE_BLOCK(); - - /* All ports are written to allow a yield in a critical - section (some will yield immediately, others wait until the - critical section exits) - but it is not something that - application code should ever do. */ - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL(); - - taskENTER_CRITICAL(); - { - traceTASK_NOTIFY_TAKE(); - ulReturn = pxCurrentTCB->ulNotifiedValue; - - if( ulReturn != 0UL ) - { - if( xClearCountOnExit != pdFALSE ) - { - pxCurrentTCB->ulNotifiedValue = 0UL; - } - else - { - pxCurrentTCB->ulNotifiedValue = ulReturn - ( uint32_t ) 1; - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - pxCurrentTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; - } - taskEXIT_CRITICAL(); - - return ulReturn; - } - -#endif /* configUSE_TASK_NOTIFICATIONS */ -/*-----------------------------------------------------------*/ - -#if( configUSE_TASK_NOTIFICATIONS == 1 ) - - BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) - { - BaseType_t xReturn; - - taskENTER_CRITICAL(); - { - /* Only block if a notification is not already pending. */ - if( pxCurrentTCB->ucNotifyState != taskNOTIFICATION_RECEIVED ) - { - /* Clear bits in the task's notification value as bits may get - set by the notifying task or interrupt. This can be used to - clear the value to zero. */ - pxCurrentTCB->ulNotifiedValue &= ~ulBitsToClearOnEntry; - - /* Mark this task as waiting for a notification. */ - pxCurrentTCB->ucNotifyState = taskWAITING_NOTIFICATION; - - if( xTicksToWait > ( TickType_t ) 0 ) - { - prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); - traceTASK_NOTIFY_WAIT_BLOCK(); - - /* All ports are written to allow a yield in a critical - section (some will yield immediately, others wait until the - critical section exits) - but it is not something that - application code should ever do. */ - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL(); - - taskENTER_CRITICAL(); - { - traceTASK_NOTIFY_WAIT(); - - if( pulNotificationValue != NULL ) - { - /* Output the current notification value, which may or may not - have changed. */ - *pulNotificationValue = pxCurrentTCB->ulNotifiedValue; - } - - /* If ucNotifyValue is set then either the task never entered the - blocked state (because a notification was already pending) or the - task unblocked because of a notification. Otherwise the task - unblocked because of a timeout. */ - if( pxCurrentTCB->ucNotifyState != taskNOTIFICATION_RECEIVED ) - { - /* A notification was not received. */ - xReturn = pdFALSE; - } - else - { - /* A notification was already pending or a notification was - received while the task was waiting. */ - pxCurrentTCB->ulNotifiedValue &= ~ulBitsToClearOnExit; - xReturn = pdTRUE; - } - - pxCurrentTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; - } - taskEXIT_CRITICAL(); - - return xReturn; - } - -#endif /* configUSE_TASK_NOTIFICATIONS */ -/*-----------------------------------------------------------*/ - -#if( configUSE_TASK_NOTIFICATIONS == 1 ) - - BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) - { - TCB_t * pxTCB; - BaseType_t xReturn = pdPASS; - uint8_t ucOriginalNotifyState; - - configASSERT( xTaskToNotify ); - pxTCB = xTaskToNotify; - - taskENTER_CRITICAL(); - { - if( pulPreviousNotificationValue != NULL ) - { - *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; - } - - ucOriginalNotifyState = pxTCB->ucNotifyState; - - pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; - - switch( eAction ) - { - case eSetBits : - pxTCB->ulNotifiedValue |= ulValue; - break; - - case eIncrement : - ( pxTCB->ulNotifiedValue )++; - break; - - case eSetValueWithOverwrite : - pxTCB->ulNotifiedValue = ulValue; - break; - - case eSetValueWithoutOverwrite : - if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) - { - pxTCB->ulNotifiedValue = ulValue; - } - else - { - /* The value could not be written to the task. */ - xReturn = pdFAIL; - } - break; - - case eNoAction: - /* The task is being notified without its notify value being - updated. */ - break; - - default: - /* Should not get here if all enums are handled. - Artificially force an assert by testing a value the - compiler can't assume is const. */ - configASSERT( pxTCB->ulNotifiedValue == ~0UL ); - - break; - } - - traceTASK_NOTIFY(); - - /* If the task is in the blocked state specifically to wait for a - notification then unblock it now. */ - if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) - { - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxTCB ); - - /* The task should not have been on an event list. */ - configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); - - #if( configUSE_TICKLESS_IDLE != 0 ) - { - /* If a task is blocked waiting for a notification then - xNextTaskUnblockTime might be set to the blocked task's time - out time. If the task is unblocked for a reason other than - a timeout xNextTaskUnblockTime is normally left unchanged, - because it will automatically get reset to a new value when - the tick count equals xNextTaskUnblockTime. However if - tickless idling is used it might be more important to enter - sleep mode at the earliest possible time - so reset - xNextTaskUnblockTime here to ensure it is updated at the - earliest possible time. */ - prvResetNextTaskUnblockTime(); - } - #endif - - if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) - { - /* The notified task has a priority above the currently - executing task so a yield is required. */ - taskYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL(); - - return xReturn; - } - -#endif /* configUSE_TASK_NOTIFICATIONS */ -/*-----------------------------------------------------------*/ - -#if( configUSE_TASK_NOTIFICATIONS == 1 ) - - BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ) - { - TCB_t * pxTCB; - uint8_t ucOriginalNotifyState; - BaseType_t xReturn = pdPASS; - UBaseType_t uxSavedInterruptStatus; - - configASSERT( xTaskToNotify ); - - /* RTOS ports that support interrupt nesting have the concept of a - maximum system call (or maximum API call) interrupt priority. - Interrupts that are above the maximum system call priority are keep - permanently enabled, even when the RTOS kernel is in a critical section, - but cannot make any calls to FreeRTOS API functions. If configASSERT() - is defined in FreeRTOSConfig.h then - portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has - been assigned a priority above the configured maximum system call - priority. Only FreeRTOS functions that end in FromISR can be called - from interrupts that have been assigned a priority at or (logically) - below the maximum system call interrupt priority. FreeRTOS maintains a - separate interrupt safe API to ensure interrupt entry is as fast and as - simple as possible. More information (albeit Cortex-M specific) is - provided on the following link: - http://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - - pxTCB = xTaskToNotify; - - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - { - if( pulPreviousNotificationValue != NULL ) - { - *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; - } - - ucOriginalNotifyState = pxTCB->ucNotifyState; - pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; - - switch( eAction ) - { - case eSetBits : - pxTCB->ulNotifiedValue |= ulValue; - break; - - case eIncrement : - ( pxTCB->ulNotifiedValue )++; - break; - - case eSetValueWithOverwrite : - pxTCB->ulNotifiedValue = ulValue; - break; - - case eSetValueWithoutOverwrite : - if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) - { - pxTCB->ulNotifiedValue = ulValue; - } - else - { - /* The value could not be written to the task. */ - xReturn = pdFAIL; - } - break; - - case eNoAction : - /* The task is being notified without its notify value being - updated. */ - break; - - default: - /* Should not get here if all enums are handled. - Artificially force an assert by testing a value the - compiler can't assume is const. */ - configASSERT( pxTCB->ulNotifiedValue == ~0UL ); - break; - } - - traceTASK_NOTIFY_FROM_ISR(); - - /* If the task is in the blocked state specifically to wait for a - notification then unblock it now. */ - if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) - { - /* The task should not have been on an event list. */ - configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); - - if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) - { - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxTCB ); - } - else - { - /* The delayed and ready lists cannot be accessed, so hold - this task pending until the scheduler is resumed. */ - vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); - } - - if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) - { - /* The notified task has a priority above the currently - executing task so a yield is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - - /* Mark that a yield is pending in case the user is not - using the "xHigherPriorityTaskWoken" parameter to an ISR - safe FreeRTOS function. */ - xYieldPending = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - - return xReturn; - } - -#endif /* configUSE_TASK_NOTIFICATIONS */ -/*-----------------------------------------------------------*/ - -#if( configUSE_TASK_NOTIFICATIONS == 1 ) - - void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) - { - TCB_t * pxTCB; - uint8_t ucOriginalNotifyState; - UBaseType_t uxSavedInterruptStatus; - - configASSERT( xTaskToNotify ); - - /* RTOS ports that support interrupt nesting have the concept of a - maximum system call (or maximum API call) interrupt priority. - Interrupts that are above the maximum system call priority are keep - permanently enabled, even when the RTOS kernel is in a critical section, - but cannot make any calls to FreeRTOS API functions. If configASSERT() - is defined in FreeRTOSConfig.h then - portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has - been assigned a priority above the configured maximum system call - priority. Only FreeRTOS functions that end in FromISR can be called - from interrupts that have been assigned a priority at or (logically) - below the maximum system call interrupt priority. FreeRTOS maintains a - separate interrupt safe API to ensure interrupt entry is as fast and as - simple as possible. More information (albeit Cortex-M specific) is - provided on the following link: - http://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - - pxTCB = xTaskToNotify; - - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - { - ucOriginalNotifyState = pxTCB->ucNotifyState; - pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; - - /* 'Giving' is equivalent to incrementing a count in a counting - semaphore. */ - ( pxTCB->ulNotifiedValue )++; - - traceTASK_NOTIFY_GIVE_FROM_ISR(); - - /* If the task is in the blocked state specifically to wait for a - notification then unblock it now. */ - if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) - { - /* The task should not have been on an event list. */ - configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); - - if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) - { - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxTCB ); - } - else - { - /* The delayed and ready lists cannot be accessed, so hold - this task pending until the scheduler is resumed. */ - vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); - } - - if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) - { - /* The notified task has a priority above the currently - executing task so a yield is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - - /* Mark that a yield is pending in case the user is not - using the "xHigherPriorityTaskWoken" parameter in an ISR - safe FreeRTOS function. */ - xYieldPending = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - } - -#endif /* configUSE_TASK_NOTIFICATIONS */ -/*-----------------------------------------------------------*/ - -#if( configUSE_TASK_NOTIFICATIONS == 1 ) - - BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ) - { - TCB_t *pxTCB; - BaseType_t xReturn; - - /* If null is passed in here then it is the calling task that is having - its notification state cleared. */ - pxTCB = prvGetTCBFromHandle( xTask ); - - taskENTER_CRITICAL(); - { - if( pxTCB->ucNotifyState == taskNOTIFICATION_RECEIVED ) - { - pxTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; - xReturn = pdPASS; - } - else - { - xReturn = pdFAIL; - } - } - taskEXIT_CRITICAL(); - - return xReturn; - } - -#endif /* configUSE_TASK_NOTIFICATIONS */ -/*-----------------------------------------------------------*/ - -#if( configUSE_TASK_NOTIFICATIONS == 1 ) - - uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ) - { - TCB_t *pxTCB; - uint32_t ulReturn; - - /* If null is passed in here then it is the calling task that is having - its notification state cleared. */ - pxTCB = prvGetTCBFromHandle( xTask ); - - taskENTER_CRITICAL(); - { - /* Return the notification as it was before the bits were cleared, - then clear the bit mask. */ - ulReturn = pxCurrentTCB->ulNotifiedValue; - pxTCB->ulNotifiedValue &= ~ulBitsToClear; - } - taskEXIT_CRITICAL(); - - return ulReturn; - } - -#endif /* configUSE_TASK_NOTIFICATIONS */ -/*-----------------------------------------------------------*/ - -#if( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) - - uint32_t ulTaskGetIdleRunTimeCounter( void ) - { - return xIdleTaskHandle->ulRunTimeCounter; - } - -#endif -/*-----------------------------------------------------------*/ - -static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely ) -{ -TickType_t xTimeToWake; -const TickType_t xConstTickCount = xTickCount; - - #if( INCLUDE_xTaskAbortDelay == 1 ) - { - /* About to enter a delayed list, so ensure the ucDelayAborted flag is - reset to pdFALSE so it can be detected as having been set to pdTRUE - when the task leaves the Blocked state. */ - pxCurrentTCB->ucDelayAborted = pdFALSE; - } - #endif - - /* Remove the task from the ready list before adding it to the blocked list - as the same list item is used for both lists. */ - if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - /* The current task must be in a ready list, so there is no need to - check, and the port reset macro can be called directly. */ - portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); /*lint !e931 pxCurrentTCB cannot change as it is the calling task. pxCurrentTCB->uxPriority and uxTopReadyPriority cannot change as called with scheduler suspended or in a critical section. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - #if ( INCLUDE_vTaskSuspend == 1 ) - { - if( ( xTicksToWait == portMAX_DELAY ) && ( xCanBlockIndefinitely != pdFALSE ) ) - { - /* Add the task to the suspended task list instead of a delayed task - list to ensure it is not woken by a timing event. It will block - indefinitely. */ - vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) ); - } - else - { - /* Calculate the time at which the task should be woken if the event - does not occur. This may overflow but this doesn't matter, the - kernel will manage it correctly. */ - xTimeToWake = xConstTickCount + xTicksToWait; - - /* The list item will be inserted in wake time order. */ - listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); - - if( xTimeToWake < xConstTickCount ) - { - /* Wake time has overflowed. Place this item in the overflow - list. */ - vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); - } - else - { - /* The wake time has not overflowed, so the current block list - is used. */ - vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); - - /* If the task entering the blocked state was placed at the - head of the list of blocked tasks then xNextTaskUnblockTime - needs to be updated too. */ - if( xTimeToWake < xNextTaskUnblockTime ) - { - xNextTaskUnblockTime = xTimeToWake; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - } - #else /* INCLUDE_vTaskSuspend */ - { - /* Calculate the time at which the task should be woken if the event - does not occur. This may overflow but this doesn't matter, the kernel - will manage it correctly. */ - xTimeToWake = xConstTickCount + xTicksToWait; - - /* The list item will be inserted in wake time order. */ - listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); - - if( xTimeToWake < xConstTickCount ) - { - /* Wake time has overflowed. Place this item in the overflow list. */ - vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); - } - else - { - /* The wake time has not overflowed, so the current block list is used. */ - vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); - - /* If the task entering the blocked state was placed at the head of the - list of blocked tasks then xNextTaskUnblockTime needs to be updated - too. */ - if( xTimeToWake < xNextTaskUnblockTime ) - { - xNextTaskUnblockTime = xTimeToWake; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - - /* Avoid compiler warning when INCLUDE_vTaskSuspend is not 1. */ - ( void ) xCanBlockIndefinitely; - } - #endif /* INCLUDE_vTaskSuspend */ -} - -/* Code below here allows additional code to be inserted into this source file, -especially where access to file scope functions and data is needed (for example -when performing module tests). */ - -#ifdef FREERTOS_MODULE_TEST - #include "tasks_test_access_functions.h" -#endif - - -#if( configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H == 1 ) - - #include "freertos_tasks_c_additions.h" - - #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT - static void freertos_tasks_c_additions_init( void ) - { - FREERTOS_TASKS_C_ADDITIONS_INIT(); - } - #endif - -#endif - - diff --git a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/timers.c b/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/timers.c deleted file mode 100644 index 00200b8..0000000 --- a/software/Power_Pico/Middlewares/Third_Party/FreeRTOS/Source/timers.c +++ /dev/null @@ -1,1127 +0,0 @@ -/* - * FreeRTOS Kernel V10.3.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * 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. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/* Standard includes. */ -#include - -/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining -all the API functions to use the MPU wrappers. That should only be done when -task.h is included from an application file. */ -#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE - -#include "FreeRTOS.h" -#include "task.h" -#include "queue.h" -#include "timers.h" - -#if ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 0 ) - #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available. -#endif - -/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified -because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined -for the header files above, but not in this file, in order to generate the -correct privileged Vs unprivileged linkage and placement. */ -#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e9021 !e961 !e750. */ - - -/* This entire source file will be skipped if the application is not configured -to include software timer functionality. This #if is closed at the very bottom -of this file. If you want to include software timer functionality then ensure -configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ -#if ( configUSE_TIMERS == 1 ) - -/* Misc definitions. */ -#define tmrNO_DELAY ( TickType_t ) 0U - -/* The name assigned to the timer service task. This can be overridden by -defining trmTIMER_SERVICE_TASK_NAME in FreeRTOSConfig.h. */ -#ifndef configTIMER_SERVICE_TASK_NAME - #define configTIMER_SERVICE_TASK_NAME "Tmr Svc" -#endif - -/* Bit definitions used in the ucStatus member of a timer structure. */ -#define tmrSTATUS_IS_ACTIVE ( ( uint8_t ) 0x01 ) -#define tmrSTATUS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 0x02 ) -#define tmrSTATUS_IS_AUTORELOAD ( ( uint8_t ) 0x04 ) - -/* The definition of the timers themselves. */ -typedef struct tmrTimerControl /* The old naming convention is used to prevent breaking kernel aware debuggers. */ -{ - const char *pcTimerName; /*<< Text name. This is not used by the kernel, it is included simply to make debugging easier. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - ListItem_t xTimerListItem; /*<< Standard linked list item as used by all kernel features for event management. */ - TickType_t xTimerPeriodInTicks;/*<< How quickly and often the timer expires. */ - void *pvTimerID; /*<< An ID to identify the timer. This allows the timer to be identified when the same callback is used for multiple timers. */ - TimerCallbackFunction_t pxCallbackFunction; /*<< The function that will be called when the timer expires. */ - #if( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxTimerNumber; /*<< An ID assigned by trace tools such as FreeRTOS+Trace */ - #endif - uint8_t ucStatus; /*<< Holds bits to say if the timer was statically allocated or not, and if it is active or not. */ -} xTIMER; - -/* The old xTIMER name is maintained above then typedefed to the new Timer_t -name below to enable the use of older kernel aware debuggers. */ -typedef xTIMER Timer_t; - -/* The definition of messages that can be sent and received on the timer queue. -Two types of message can be queued - messages that manipulate a software timer, -and messages that request the execution of a non-timer related callback. The -two message types are defined in two separate structures, xTimerParametersType -and xCallbackParametersType respectively. */ -typedef struct tmrTimerParameters -{ - TickType_t xMessageValue; /*<< An optional value used by a subset of commands, for example, when changing the period of a timer. */ - Timer_t * pxTimer; /*<< The timer to which the command will be applied. */ -} TimerParameter_t; - - -typedef struct tmrCallbackParameters -{ - PendedFunction_t pxCallbackFunction; /* << The callback function to execute. */ - void *pvParameter1; /* << The value that will be used as the callback functions first parameter. */ - uint32_t ulParameter2; /* << The value that will be used as the callback functions second parameter. */ -} CallbackParameters_t; - -/* The structure that contains the two message types, along with an identifier -that is used to determine which message type is valid. */ -typedef struct tmrTimerQueueMessage -{ - BaseType_t xMessageID; /*<< The command being sent to the timer service task. */ - union - { - TimerParameter_t xTimerParameters; - - /* Don't include xCallbackParameters if it is not going to be used as - it makes the structure (and therefore the timer queue) larger. */ - #if ( INCLUDE_xTimerPendFunctionCall == 1 ) - CallbackParameters_t xCallbackParameters; - #endif /* INCLUDE_xTimerPendFunctionCall */ - } u; -} DaemonTaskMessage_t; - -/*lint -save -e956 A manual analysis and inspection has been used to determine -which static variables must be declared volatile. */ - -/* The list in which active timers are stored. Timers are referenced in expire -time order, with the nearest expiry time at the front of the list. Only the -timer service task is allowed to access these lists. -xActiveTimerList1 and xActiveTimerList2 could be at function scope but that -breaks some kernel aware debuggers, and debuggers that reply on removing the -static qualifier. */ -PRIVILEGED_DATA static List_t xActiveTimerList1; -PRIVILEGED_DATA static List_t xActiveTimerList2; -PRIVILEGED_DATA static List_t *pxCurrentTimerList; -PRIVILEGED_DATA static List_t *pxOverflowTimerList; - -/* A queue that is used to send commands to the timer service task. */ -PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL; -PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL; - -/*lint -restore */ - -/*-----------------------------------------------------------*/ - -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - - /* If static allocation is supported then the application must provide the - following callback function - which enables the application to optionally - provide the memory that will be used by the timer task as the task's stack - and TCB. */ - extern void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize ); - -#endif - -/* - * Initialise the infrastructure used by the timer service task if it has not - * been initialised already. - */ -static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION; - -/* - * The timer service task (daemon). Timer functionality is controlled by this - * task. Other tasks communicate with the timer service task using the - * xTimerQueue queue. - */ -static portTASK_FUNCTION_PROTO( prvTimerTask, pvParameters ) PRIVILEGED_FUNCTION; - -/* - * Called by the timer service task to interpret and process a command it - * received on the timer queue. - */ -static void prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION; - -/* - * Insert the timer into either xActiveTimerList1, or xActiveTimerList2, - * depending on if the expire time causes a timer counter overflow. - */ -static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime ) PRIVILEGED_FUNCTION; - -/* - * An active timer has reached its expire time. Reload the timer if it is an - * auto-reload timer, then call its callback. - */ -static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) PRIVILEGED_FUNCTION; - -/* - * The tick count has overflowed. Switch the timer lists after ensuring the - * current timer list does not still reference some timers. - */ -static void prvSwitchTimerLists( void ) PRIVILEGED_FUNCTION; - -/* - * Obtain the current tick count, setting *pxTimerListsWereSwitched to pdTRUE - * if a tick count overflow occurred since prvSampleTimeNow() was last called. - */ -static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION; - -/* - * If the timer list contains any active timers then return the expire time of - * the timer that will expire first and set *pxListWasEmpty to false. If the - * timer list does not contain any timers then return 0 and set *pxListWasEmpty - * to pdTRUE. - */ -static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) PRIVILEGED_FUNCTION; - -/* - * If a timer has expired, process it. Otherwise, block the timer service task - * until either a timer does expire or a command is received. - */ -static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION; - -/* - * Called after a Timer_t structure has been allocated either statically or - * dynamically to fill in the structure's members. - */ -static void prvInitialiseNewTimer( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const TickType_t xTimerPeriodInTicks, - const UBaseType_t uxAutoReload, - void * const pvTimerID, - TimerCallbackFunction_t pxCallbackFunction, - Timer_t *pxNewTimer ) PRIVILEGED_FUNCTION; -/*-----------------------------------------------------------*/ - -BaseType_t xTimerCreateTimerTask( void ) -{ -BaseType_t xReturn = pdFAIL; - - /* This function is called when the scheduler is started if - configUSE_TIMERS is set to 1. Check that the infrastructure used by the - timer service task has been created/initialised. If timers have already - been created then the initialisation will already have been performed. */ - prvCheckForValidListAndQueue(); - - if( xTimerQueue != NULL ) - { - #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - { - StaticTask_t *pxTimerTaskTCBBuffer = NULL; - StackType_t *pxTimerTaskStackBuffer = NULL; - uint32_t ulTimerTaskStackSize; - - vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize ); - xTimerTaskHandle = xTaskCreateStatic( prvTimerTask, - configTIMER_SERVICE_TASK_NAME, - ulTimerTaskStackSize, - NULL, - ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, - pxTimerTaskStackBuffer, - pxTimerTaskTCBBuffer ); - - if( xTimerTaskHandle != NULL ) - { - xReturn = pdPASS; - } - } - #else - { - xReturn = xTaskCreate( prvTimerTask, - configTIMER_SERVICE_TASK_NAME, - configTIMER_TASK_STACK_DEPTH, - NULL, - ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, - &xTimerTaskHandle ); - } - #endif /* configSUPPORT_STATIC_ALLOCATION */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - configASSERT( xReturn ); - return xReturn; -} -/*-----------------------------------------------------------*/ - -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - - TimerHandle_t xTimerCreate( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const TickType_t xTimerPeriodInTicks, - const UBaseType_t uxAutoReload, - void * const pvTimerID, - TimerCallbackFunction_t pxCallbackFunction ) - { - Timer_t *pxNewTimer; - - pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of Timer_t is always a pointer to the timer's mame. */ - - if( pxNewTimer != NULL ) - { - /* Status is thus far zero as the timer is not created statically - and has not been started. The auto-reload bit may get set in - prvInitialiseNewTimer. */ - pxNewTimer->ucStatus = 0x00; - prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); - } - - return pxNewTimer; - } - -#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ -/*-----------------------------------------------------------*/ - -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - - TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const TickType_t xTimerPeriodInTicks, - const UBaseType_t uxAutoReload, - void * const pvTimerID, - TimerCallbackFunction_t pxCallbackFunction, - StaticTimer_t *pxTimerBuffer ) - { - Timer_t *pxNewTimer; - - #if( configASSERT_DEFINED == 1 ) - { - /* Sanity check that the size of the structure used to declare a - variable of type StaticTimer_t equals the size of the real timer - structure. */ - volatile size_t xSize = sizeof( StaticTimer_t ); - configASSERT( xSize == sizeof( Timer_t ) ); - ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */ - } - #endif /* configASSERT_DEFINED */ - - /* A pointer to a StaticTimer_t structure MUST be provided, use it. */ - configASSERT( pxTimerBuffer ); - pxNewTimer = ( Timer_t * ) pxTimerBuffer; /*lint !e740 !e9087 StaticTimer_t is a pointer to a Timer_t, so guaranteed to be aligned and sized correctly (checked by an assert()), so this is safe. */ - - if( pxNewTimer != NULL ) - { - /* Timers can be created statically or dynamically so note this - timer was created statically in case it is later deleted. The - auto-reload bit may get set in prvInitialiseNewTimer(). */ - pxNewTimer->ucStatus = tmrSTATUS_IS_STATICALLY_ALLOCATED; - - prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); - } - - return pxNewTimer; - } - -#endif /* configSUPPORT_STATIC_ALLOCATION */ -/*-----------------------------------------------------------*/ - -static void prvInitialiseNewTimer( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const TickType_t xTimerPeriodInTicks, - const UBaseType_t uxAutoReload, - void * const pvTimerID, - TimerCallbackFunction_t pxCallbackFunction, - Timer_t *pxNewTimer ) -{ - /* 0 is not a valid value for xTimerPeriodInTicks. */ - configASSERT( ( xTimerPeriodInTicks > 0 ) ); - - if( pxNewTimer != NULL ) - { - /* Ensure the infrastructure used by the timer service task has been - created/initialised. */ - prvCheckForValidListAndQueue(); - - /* Initialise the timer structure members using the function - parameters. */ - pxNewTimer->pcTimerName = pcTimerName; - pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks; - pxNewTimer->pvTimerID = pvTimerID; - pxNewTimer->pxCallbackFunction = pxCallbackFunction; - vListInitialiseItem( &( pxNewTimer->xTimerListItem ) ); - if( uxAutoReload != pdFALSE ) - { - pxNewTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD; - } - traceTIMER_CREATE( pxNewTimer ); - } -} -/*-----------------------------------------------------------*/ - -BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) -{ -BaseType_t xReturn = pdFAIL; -DaemonTaskMessage_t xMessage; - - configASSERT( xTimer ); - - /* Send a message to the timer service task to perform a particular action - on a particular timer definition. */ - if( xTimerQueue != NULL ) - { - /* Send a command to the timer service task to start the xTimer timer. */ - xMessage.xMessageID = xCommandID; - xMessage.u.xTimerParameters.xMessageValue = xOptionalValue; - xMessage.u.xTimerParameters.pxTimer = xTimer; - - if( xCommandID < tmrFIRST_FROM_ISR_COMMAND ) - { - if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ) - { - xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); - } - else - { - xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY ); - } - } - else - { - xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); - } - - traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - return xReturn; -} -/*-----------------------------------------------------------*/ - -TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) -{ - /* If xTimerGetTimerDaemonTaskHandle() is called before the scheduler has been - started, then xTimerTaskHandle will be NULL. */ - configASSERT( ( xTimerTaskHandle != NULL ) ); - return xTimerTaskHandle; -} -/*-----------------------------------------------------------*/ - -TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) -{ -Timer_t *pxTimer = xTimer; - - configASSERT( xTimer ); - return pxTimer->xTimerPeriodInTicks; -} -/*-----------------------------------------------------------*/ - -void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) -{ -Timer_t * pxTimer = xTimer; - - configASSERT( xTimer ); - taskENTER_CRITICAL(); - { - if( uxAutoReload != pdFALSE ) - { - pxTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD; - } - else - { - pxTimer->ucStatus &= ~tmrSTATUS_IS_AUTORELOAD; - } - } - taskEXIT_CRITICAL(); -} -/*-----------------------------------------------------------*/ - -UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ) -{ -Timer_t * pxTimer = xTimer; -UBaseType_t uxReturn; - - configASSERT( xTimer ); - taskENTER_CRITICAL(); - { - if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) == 0 ) - { - /* Not an auto-reload timer. */ - uxReturn = ( UBaseType_t ) pdFALSE; - } - else - { - /* Is an auto-reload timer. */ - uxReturn = ( UBaseType_t ) pdTRUE; - } - } - taskEXIT_CRITICAL(); - - return uxReturn; -} -/*-----------------------------------------------------------*/ - -TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) -{ -Timer_t * pxTimer = xTimer; -TickType_t xReturn; - - configASSERT( xTimer ); - xReturn = listGET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ) ); - return xReturn; -} -/*-----------------------------------------------------------*/ - -const char * pcTimerGetName( TimerHandle_t xTimer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ -{ -Timer_t *pxTimer = xTimer; - - configASSERT( xTimer ); - return pxTimer->pcTimerName; -} -/*-----------------------------------------------------------*/ - -static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) -{ -BaseType_t xResult; -Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); /*lint !e9087 !e9079 void * is used as this macro is used with tasks and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - - /* Remove the timer from the list of active timers. A check has already - been performed to ensure the list is not empty. */ - ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); - traceTIMER_EXPIRED( pxTimer ); - - /* If the timer is an auto-reload timer then calculate the next - expiry time and re-insert the timer in the list of active timers. */ - if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) - { - /* The timer is inserted into a list using a time relative to anything - other than the current time. It will therefore be inserted into the - correct list relative to the time this task thinks it is now. */ - if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) != pdFALSE ) - { - /* The timer expired before it was added to the active timer - list. Reload it now. */ - xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); - configASSERT( xResult ); - ( void ) xResult; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; - mtCOVERAGE_TEST_MARKER(); - } - - /* Call the timer callback. */ - pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); -} -/*-----------------------------------------------------------*/ - -static portTASK_FUNCTION( prvTimerTask, pvParameters ) -{ -TickType_t xNextExpireTime; -BaseType_t xListWasEmpty; - - /* Just to avoid compiler warnings. */ - ( void ) pvParameters; - - #if( configUSE_DAEMON_TASK_STARTUP_HOOK == 1 ) - { - extern void vApplicationDaemonTaskStartupHook( void ); - - /* Allow the application writer to execute some code in the context of - this task at the point the task starts executing. This is useful if the - application includes initialisation code that would benefit from - executing after the scheduler has been started. */ - vApplicationDaemonTaskStartupHook(); - } - #endif /* configUSE_DAEMON_TASK_STARTUP_HOOK */ - - for( ;; ) - { - /* Query the timers list to see if it contains any timers, and if so, - obtain the time at which the next timer will expire. */ - xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty ); - - /* If a timer has expired, process it. Otherwise, block this task - until either a timer does expire, or a command is received. */ - prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty ); - - /* Empty the command queue. */ - prvProcessReceivedCommands(); - } -} -/*-----------------------------------------------------------*/ - -static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty ) -{ -TickType_t xTimeNow; -BaseType_t xTimerListsWereSwitched; - - vTaskSuspendAll(); - { - /* Obtain the time now to make an assessment as to whether the timer - has expired or not. If obtaining the time causes the lists to switch - then don't process this timer as any timers that remained in the list - when the lists were switched will have been processed within the - prvSampleTimeNow() function. */ - xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); - if( xTimerListsWereSwitched == pdFALSE ) - { - /* The tick count has not overflowed, has the timer expired? */ - if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) ) - { - ( void ) xTaskResumeAll(); - prvProcessExpiredTimer( xNextExpireTime, xTimeNow ); - } - else - { - /* The tick count has not overflowed, and the next expire - time has not been reached yet. This task should therefore - block to wait for the next expire time or a command to be - received - whichever comes first. The following line cannot - be reached unless xNextExpireTime > xTimeNow, except in the - case when the current timer list is empty. */ - if( xListWasEmpty != pdFALSE ) - { - /* The current timer list is empty - is the overflow list - also empty? */ - xListWasEmpty = listLIST_IS_EMPTY( pxOverflowTimerList ); - } - - vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ), xListWasEmpty ); - - if( xTaskResumeAll() == pdFALSE ) - { - /* Yield to wait for either a command to arrive, or the - block time to expire. If a command arrived between the - critical section being exited and this yield then the yield - will not cause the task to block. */ - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - else - { - ( void ) xTaskResumeAll(); - } - } -} -/*-----------------------------------------------------------*/ - -static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) -{ -TickType_t xNextExpireTime; - - /* Timers are listed in expiry time order, with the head of the list - referencing the task that will expire first. Obtain the time at which - the timer with the nearest expiry time will expire. If there are no - active timers then just set the next expire time to 0. That will cause - this task to unblock when the tick count overflows, at which point the - timer lists will be switched and the next expiry time can be - re-assessed. */ - *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList ); - if( *pxListWasEmpty == pdFALSE ) - { - xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); - } - else - { - /* Ensure the task unblocks when the tick count rolls over. */ - xNextExpireTime = ( TickType_t ) 0U; - } - - return xNextExpireTime; -} -/*-----------------------------------------------------------*/ - -static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) -{ -TickType_t xTimeNow; -PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */ - - xTimeNow = xTaskGetTickCount(); - - if( xTimeNow < xLastTime ) - { - prvSwitchTimerLists(); - *pxTimerListsWereSwitched = pdTRUE; - } - else - { - *pxTimerListsWereSwitched = pdFALSE; - } - - xLastTime = xTimeNow; - - return xTimeNow; -} -/*-----------------------------------------------------------*/ - -static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime ) -{ -BaseType_t xProcessTimerNow = pdFALSE; - - listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime ); - listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); - - if( xNextExpiryTime <= xTimeNow ) - { - /* Has the expiry time elapsed between the command to start/reset a - timer was issued, and the time the command was processed? */ - if( ( ( TickType_t ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks ) /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - { - /* The time between a command being issued and the command being - processed actually exceeds the timers period. */ - xProcessTimerNow = pdTRUE; - } - else - { - vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) ); - } - } - else - { - if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) ) - { - /* If, since the command was issued, the tick count has overflowed - but the expiry time has not, then the timer must have already passed - its expiry time and should be processed immediately. */ - xProcessTimerNow = pdTRUE; - } - else - { - vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); - } - } - - return xProcessTimerNow; -} -/*-----------------------------------------------------------*/ - -static void prvProcessReceivedCommands( void ) -{ -DaemonTaskMessage_t xMessage; -Timer_t *pxTimer; -BaseType_t xTimerListsWereSwitched, xResult; -TickType_t xTimeNow; - - while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) /*lint !e603 xMessage does not have to be initialised as it is passed out, not in, and it is not used unless xQueueReceive() returns pdTRUE. */ - { - #if ( INCLUDE_xTimerPendFunctionCall == 1 ) - { - /* Negative commands are pended function calls rather than timer - commands. */ - if( xMessage.xMessageID < ( BaseType_t ) 0 ) - { - const CallbackParameters_t * const pxCallback = &( xMessage.u.xCallbackParameters ); - - /* The timer uses the xCallbackParameters member to request a - callback be executed. Check the callback is not NULL. */ - configASSERT( pxCallback ); - - /* Call the function. */ - pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* INCLUDE_xTimerPendFunctionCall */ - - /* Commands that are positive are timer commands rather than pended - function calls. */ - if( xMessage.xMessageID >= ( BaseType_t ) 0 ) - { - /* The messages uses the xTimerParameters member to work on a - software timer. */ - pxTimer = xMessage.u.xTimerParameters.pxTimer; - - if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) /*lint !e961. The cast is only redundant when NULL is passed into the macro. */ - { - /* The timer is in a list, remove it. */ - ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.u.xTimerParameters.xMessageValue ); - - /* In this case the xTimerListsWereSwitched parameter is not used, but - it must be present in the function call. prvSampleTimeNow() must be - called after the message is received from xTimerQueue so there is no - possibility of a higher priority task adding a message to the message - queue with a time that is ahead of the timer daemon task (because it - pre-empted the timer daemon task after the xTimeNow value was set). */ - xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); - - switch( xMessage.xMessageID ) - { - case tmrCOMMAND_START : - case tmrCOMMAND_START_FROM_ISR : - case tmrCOMMAND_RESET : - case tmrCOMMAND_RESET_FROM_ISR : - case tmrCOMMAND_START_DONT_TRACE : - /* Start or restart a timer. */ - pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE; - if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) != pdFALSE ) - { - /* The timer expired before it was added to the active - timer list. Process it now. */ - pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); - traceTIMER_EXPIRED( pxTimer ); - - if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) - { - xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY ); - configASSERT( xResult ); - ( void ) xResult; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - break; - - case tmrCOMMAND_STOP : - case tmrCOMMAND_STOP_FROM_ISR : - /* The timer has already been removed from the active list. */ - pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; - break; - - case tmrCOMMAND_CHANGE_PERIOD : - case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR : - pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE; - pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue; - configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) ); - - /* The new period does not really have a reference, and can - be longer or shorter than the old one. The command time is - therefore set to the current time, and as the period cannot - be zero the next expiry time can only be in the future, - meaning (unlike for the xTimerStart() case above) there is - no fail case that needs to be handled here. */ - ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow ); - break; - - case tmrCOMMAND_DELETE : - #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - { - /* The timer has already been removed from the active list, - just free up the memory if the memory was dynamically - allocated. */ - if( ( pxTimer->ucStatus & tmrSTATUS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) 0 ) - { - vPortFree( pxTimer ); - } - else - { - pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; - } - } - #else - { - /* If dynamic allocation is not enabled, the memory - could not have been dynamically allocated. So there is - no need to free the memory - just mark the timer as - "not active". */ - pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; - } - #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ - break; - - default : - /* Don't expect to get here. */ - break; - } - } - } -} -/*-----------------------------------------------------------*/ - -static void prvSwitchTimerLists( void ) -{ -TickType_t xNextExpireTime, xReloadTime; -List_t *pxTemp; -Timer_t *pxTimer; -BaseType_t xResult; - - /* The tick count has overflowed. The timer lists must be switched. - If there are any timers still referenced from the current timer list - then they must have expired and should be processed before the lists - are switched. */ - while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE ) - { - xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); - - /* Remove the timer from the list. */ - pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); /*lint !e9087 !e9079 void * is used as this macro is used with tasks and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); - traceTIMER_EXPIRED( pxTimer ); - - /* Execute its callback, then send a command to restart the timer if - it is an auto-reload timer. It cannot be restarted here as the lists - have not yet been switched. */ - pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); - - if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) - { - /* Calculate the reload value, and if the reload value results in - the timer going into the same timer list then it has already expired - and the timer should be re-inserted into the current list so it is - processed again within this loop. Otherwise a command should be sent - to restart the timer to ensure it is only inserted into a list after - the lists have been swapped. */ - xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ); - if( xReloadTime > xNextExpireTime ) - { - listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xReloadTime ); - listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); - vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); - } - else - { - xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); - configASSERT( xResult ); - ( void ) xResult; - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - - pxTemp = pxCurrentTimerList; - pxCurrentTimerList = pxOverflowTimerList; - pxOverflowTimerList = pxTemp; -} -/*-----------------------------------------------------------*/ - -static void prvCheckForValidListAndQueue( void ) -{ - /* Check that the list from which active timers are referenced, and the - queue used to communicate with the timer service, have been - initialised. */ - taskENTER_CRITICAL(); - { - if( xTimerQueue == NULL ) - { - vListInitialise( &xActiveTimerList1 ); - vListInitialise( &xActiveTimerList2 ); - pxCurrentTimerList = &xActiveTimerList1; - pxOverflowTimerList = &xActiveTimerList2; - - #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - { - /* The timer queue is allocated statically in case - configSUPPORT_DYNAMIC_ALLOCATION is 0. */ - static StaticQueue_t xStaticTimerQueue; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */ - static uint8_t ucStaticTimerQueueStorage[ ( size_t ) configTIMER_QUEUE_LENGTH * sizeof( DaemonTaskMessage_t ) ]; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */ - - xTimerQueue = xQueueCreateStatic( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, ( UBaseType_t ) sizeof( DaemonTaskMessage_t ), &( ucStaticTimerQueueStorage[ 0 ] ), &xStaticTimerQueue ); - } - #else - { - xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ) ); - } - #endif - - #if ( configQUEUE_REGISTRY_SIZE > 0 ) - { - if( xTimerQueue != NULL ) - { - vQueueAddToRegistry( xTimerQueue, "TmrQ" ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configQUEUE_REGISTRY_SIZE */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL(); -} -/*-----------------------------------------------------------*/ - -BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) -{ -BaseType_t xReturn; -Timer_t *pxTimer = xTimer; - - configASSERT( xTimer ); - - /* Is the timer in the list of active timers? */ - taskENTER_CRITICAL(); - { - if( ( pxTimer->ucStatus & tmrSTATUS_IS_ACTIVE ) == 0 ) - { - xReturn = pdFALSE; - } - else - { - xReturn = pdTRUE; - } - } - taskEXIT_CRITICAL(); - - return xReturn; -} /*lint !e818 Can't be pointer to const due to the typedef. */ -/*-----------------------------------------------------------*/ - -void *pvTimerGetTimerID( const TimerHandle_t xTimer ) -{ -Timer_t * const pxTimer = xTimer; -void *pvReturn; - - configASSERT( xTimer ); - - taskENTER_CRITICAL(); - { - pvReturn = pxTimer->pvTimerID; - } - taskEXIT_CRITICAL(); - - return pvReturn; -} -/*-----------------------------------------------------------*/ - -void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) -{ -Timer_t * const pxTimer = xTimer; - - configASSERT( xTimer ); - - taskENTER_CRITICAL(); - { - pxTimer->pvTimerID = pvNewID; - } - taskEXIT_CRITICAL(); -} -/*-----------------------------------------------------------*/ - -#if( INCLUDE_xTimerPendFunctionCall == 1 ) - - BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) - { - DaemonTaskMessage_t xMessage; - BaseType_t xReturn; - - /* Complete the message with the function parameters and post it to the - daemon task. */ - xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR; - xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; - xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; - xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; - - xReturn = xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); - - tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); - - return xReturn; - } - -#endif /* INCLUDE_xTimerPendFunctionCall */ -/*-----------------------------------------------------------*/ - -#if( INCLUDE_xTimerPendFunctionCall == 1 ) - - BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) - { - DaemonTaskMessage_t xMessage; - BaseType_t xReturn; - - /* This function can only be called after a timer has been created or - after the scheduler has been started because, until then, the timer - queue does not exist. */ - configASSERT( xTimerQueue ); - - /* Complete the message with the function parameters and post it to the - daemon task. */ - xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK; - xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; - xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; - xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; - - xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); - - tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); - - return xReturn; - } - -#endif /* INCLUDE_xTimerPendFunctionCall */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) - { - return ( ( Timer_t * ) xTimer )->uxTimerNumber; - } - -#endif /* configUSE_TRACE_FACILITY */ -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - void vTimerSetTimerNumber( TimerHandle_t xTimer, UBaseType_t uxTimerNumber ) - { - ( ( Timer_t * ) xTimer )->uxTimerNumber = uxTimerNumber; - } - -#endif /* configUSE_TRACE_FACILITY */ -/*-----------------------------------------------------------*/ - -/* This entire source file will be skipped if the application is not configured -to include software timer functionality. If you want to include software timer -functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ -#endif /* configUSE_TIMERS == 1 */ - - - diff --git a/software/Power_Pico/USB_DEVICE/App/usb_device.c b/software/Power_Pico/USB_DEVICE/App/usb_device.c deleted file mode 100644 index 95aea19..0000000 --- a/software/Power_Pico/USB_DEVICE/App/usb_device.c +++ /dev/null @@ -1,113 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usb_device.c - * @version : v1.0_Cube - * @brief : This file implements the USB Device - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ - -#include "usb_device.h" -#include "usbd_core.h" -#include "usbd_desc.h" -#include "usbd_cdc.h" -#include "usbd_cdc_if.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* USER CODE BEGIN PV */ -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE END PV */ - -/* USER CODE BEGIN PFP */ -/* Private function prototypes -----------------------------------------------*/ - -/* USER CODE END PFP */ - -/* USB Device Core handle declaration. */ -USBD_HandleTypeDef hUsbDeviceFS; - -/* - * -- Insert your variables declaration here -- - */ -/* USER CODE BEGIN 0 */ - -void USER_USB_DEVICE_DeInit(void) -{ - USBD_Stop(&hUsbDeviceFS); - USBD_DeInit(&hUsbDeviceFS); - __HAL_RCC_USB_OTG_FS_FORCE_RESET(); - HAL_Delay(10); - __HAL_RCC_USB_OTG_FS_RELEASE_RESET(); - __HAL_RCC_USB_OTG_FS_CLK_DISABLE(); - HAL_PCD_MspDeInit(hUsbDeviceFS.pData); - // 手动配置USB引脚为GPIO输出,强制拉低DP线以模拟拔出 - USER_USBD_LL_Simulate_Disconnect(); -} - -/* USER CODE END 0 */ - -/* - * -- Insert your external function declaration here -- - */ -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/** - * Init USB device Library, add supported class and start the library - * @retval None - */ -void MX_USB_DEVICE_Init(void) -{ - /* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */ - - /* USER CODE END USB_DEVICE_Init_PreTreatment */ - - /* Init Device Library, add supported class and start the library. */ - if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK) - { - Error_Handler(); - } - if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC) != USBD_OK) - { - Error_Handler(); - } - if (USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS) != USBD_OK) - { - Error_Handler(); - } - if (USBD_Start(&hUsbDeviceFS) != USBD_OK) - { - Error_Handler(); - } - - /* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */ - - /* USER CODE END USB_DEVICE_Init_PostTreatment */ -} - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/USB_DEVICE/App/usb_device.h b/software/Power_Pico/USB_DEVICE/App/usb_device.h deleted file mode 100644 index 503bd49..0000000 --- a/software/Power_Pico/USB_DEVICE/App/usb_device.h +++ /dev/null @@ -1,104 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usb_device.h - * @version : v1.0_Cube - * @brief : Header for usb_device.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_DEVICE__H__ -#define __USB_DEVICE__H__ - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" -#include "stm32f4xx_hal.h" -#include "usbd_def.h" - -/* USER CODE BEGIN INCLUDE */ - -/* USER CODE END INCLUDE */ - -/** @addtogroup USBD_OTG_DRIVER - * @{ - */ - -/** @defgroup USBD_DEVICE USBD_DEVICE - * @brief Device file for Usb otg low level driver. - * @{ - */ - -/** @defgroup USBD_DEVICE_Exported_Variables USBD_DEVICE_Exported_Variables - * @brief Public variables. - * @{ - */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* - * -- Insert your variables declaration here -- - */ -/* USER CODE BEGIN VARIABLES */ - -/* USER CODE END VARIABLES */ -/** - * @} - */ - -/** @defgroup USBD_DEVICE_Exported_FunctionsPrototype USBD_DEVICE_Exported_FunctionsPrototype - * @brief Declaration of public functions for Usb device. - * @{ - */ - -/** USB Device initialization function. */ -void MX_USB_DEVICE_Init(void); - -/* - * -- Insert functions declaration here -- - */ -/* USER CODE BEGIN FD */ - -void USER_USB_DEVICE_DeInit(void); - -/* USER CODE END FD */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_DEVICE__H__ */ diff --git a/software/Power_Pico/USB_DEVICE/App/usbd_cdc_if.c b/software/Power_Pico/USB_DEVICE/App/usbd_cdc_if.c deleted file mode 100644 index 15478bc..0000000 --- a/software/Power_Pico/USB_DEVICE/App/usbd_cdc_if.c +++ /dev/null @@ -1,349 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usbd_cdc_if.c - * @version : v1.0_Cube - * @brief : Usb device for Virtual Com Port. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_if.h" - -/* USER CODE BEGIN INCLUDE */ - -/* 全局标志位,供 main.c 检测跳转 */ -volatile bool g_update_req = false; -bool get_update_request(void) { - return g_update_req; -} -void set_update_request(bool req) { - g_update_req = req; -} -/* USER CODE END INCLUDE */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ - -/* USER CODE BEGIN PV */ -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE END PV */ - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @brief Usb device library. - * @{ - */ - -/** @addtogroup USBD_CDC_IF - * @{ - */ - -/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions - * @brief Private types. - * @{ - */ - -/* USER CODE BEGIN PRIVATE_TYPES */ - -/* USER CODE END PRIVATE_TYPES */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines - * @brief Private defines. - * @{ - */ - -/* USER CODE BEGIN PRIVATE_DEFINES */ -/* USER CODE END PRIVATE_DEFINES */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros - * @brief Private macros. - * @{ - */ - -/* USER CODE BEGIN PRIVATE_MACRO */ - -/* USER CODE END PRIVATE_MACRO */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables - * @brief Private variables. - * @{ - */ -/* Create buffer for reception and transmission */ -/* It's up to user to redefine and/or remove those define */ -/** Received data over USB are stored in this buffer */ -uint8_t UserRxBufferFS[APP_RX_DATA_SIZE]; - -/** Data to send over USB CDC are stored in this buffer */ -uint8_t UserTxBufferFS[APP_TX_DATA_SIZE]; - -/* USER CODE BEGIN PRIVATE_VARIABLES */ - -/* USER CODE END PRIVATE_VARIABLES */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables - * @brief Public variables. - * @{ - */ - -extern USBD_HandleTypeDef hUsbDeviceFS; - -/* USER CODE BEGIN EXPORTED_VARIABLES */ - -/* USER CODE END EXPORTED_VARIABLES */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes - * @brief Private functions declaration. - * @{ - */ - -static int8_t CDC_Init_FS(void); -static int8_t CDC_DeInit_FS(void); -static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length); -static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len); -static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum); - -/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */ - -/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */ - -/** - * @} - */ - -USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = -{ - CDC_Init_FS, - CDC_DeInit_FS, - CDC_Control_FS, - CDC_Receive_FS, - CDC_TransmitCplt_FS -}; - -/* Private functions ---------------------------------------------------------*/ -/** - * @brief Initializes the CDC media low layer over the FS USB IP - * @retval USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_Init_FS(void) -{ - /* USER CODE BEGIN 3 */ - /* Set Application Buffers */ - USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0); - USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS); - return (USBD_OK); - /* USER CODE END 3 */ -} - -/** - * @brief DeInitializes the CDC media low layer - * @retval USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_DeInit_FS(void) -{ - /* USER CODE BEGIN 4 */ - return (USBD_OK); - /* USER CODE END 4 */ -} - -/** - * @brief Manage the CDC class requests - * @param cmd: Command code - * @param pbuf: Buffer containing command data (request parameters) - * @param length: Number of data to be sent (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length) -{ - /* USER CODE BEGIN 5 */ - switch(cmd) - { - case CDC_SEND_ENCAPSULATED_COMMAND: - - break; - - case CDC_GET_ENCAPSULATED_RESPONSE: - - break; - - case CDC_SET_COMM_FEATURE: - - break; - - case CDC_GET_COMM_FEATURE: - - break; - - case CDC_CLEAR_COMM_FEATURE: - - break; - - /*******************************************************************************/ - /* Line Coding Structure */ - /*-----------------------------------------------------------------------------*/ - /* Offset | Field | Size | Value | Description */ - /* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/ - /* 4 | bCharFormat | 1 | Number | Stop bits */ - /* 0 - 1 Stop bit */ - /* 1 - 1.5 Stop bits */ - /* 2 - 2 Stop bits */ - /* 5 | bParityType | 1 | Number | Parity */ - /* 0 - None */ - /* 1 - Odd */ - /* 2 - Even */ - /* 3 - Mark */ - /* 4 - Space */ - /* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */ - /*******************************************************************************/ - case CDC_SET_LINE_CODING: - - break; - - case CDC_GET_LINE_CODING: - - break; - - case CDC_SET_CONTROL_LINE_STATE: - - break; - - case CDC_SEND_BREAK: - - break; - - default: - break; - } - - return (USBD_OK); - /* USER CODE END 5 */ -} - -/** - * @brief Data received over USB OUT endpoint are sent over CDC interface - * through this function. - * - * @note - * This function will issue a NAK packet on any OUT packet received on - * USB endpoint until exiting this function. If you exit this function - * before transfer is complete on CDC interface (ie. using DMA controller) - * it will result in receiving more data while previous ones are still - * not sent. - * - * @param Buf: Buffer of data to be received - * @param Len: Number of data received (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) -{ - /* USER CODE BEGIN 6 */ - - if (*Len >= 6) { - // 临时确保它是字符串 - uint8_t temp_char = Buf[*Len]; - Buf[*Len] = 0; // 截断 - - if (strstr((char*)Buf, "update") != NULL) { - set_update_request(true); // 置位,主循环看到后执行 JumpToBootloader - } - - Buf[*Len] = temp_char; // 恢复 (虽然这里可能不需要) - } - - USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); - USBD_CDC_ReceivePacket(&hUsbDeviceFS); - return (USBD_OK); - /* USER CODE END 6 */ -} - -/** - * @brief CDC_Transmit_FS - * Data to send over USB IN endpoint are sent over CDC interface - * through this function. - * @note - * - * - * @param Buf: Buffer of data to be sent - * @param Len: Number of data to be sent (in bytes) - * @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY - */ -uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) -{ - uint8_t result = USBD_OK; - /* USER CODE BEGIN 7 */ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData; - if (hcdc->TxState != 0){ - return USBD_BUSY; - } - USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len); - result = USBD_CDC_TransmitPacket(&hUsbDeviceFS); - /* USER CODE END 7 */ - return result; -} - -/** - * @brief CDC_TransmitCplt_FS - * Data transmitted callback - * - * @note - * This function is IN transfer complete callback used to inform user that - * the submitted Data is successfully sent over USB. - * - * @param Buf: Buffer of data to be received - * @param Len: Number of data received (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum) -{ - uint8_t result = USBD_OK; - /* USER CODE BEGIN 13 */ - UNUSED(Buf); - UNUSED(Len); - UNUSED(epnum); - /* USER CODE END 13 */ - return result; -} - -/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */ - -/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/software/Power_Pico/USB_DEVICE/App/usbd_cdc_if.h b/software/Power_Pico/USB_DEVICE/App/usbd_cdc_if.h deleted file mode 100644 index c826ca7..0000000 --- a/software/Power_Pico/USB_DEVICE/App/usbd_cdc_if.h +++ /dev/null @@ -1,133 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usbd_cdc_if.h - * @version : v1.0_Cube - * @brief : Header for usbd_cdc_if.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ - -#ifndef __USBD_CDC_IF_H__ -#define __USBD_CDC_IF_H__ - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc.h" - -/* USER CODE BEGIN INCLUDE */ -#include -/* USER CODE END INCLUDE */ - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @brief For Usb device. - * @{ - */ - -/** @defgroup USBD_CDC_IF USBD_CDC_IF - * @brief Usb VCP device module - * @{ - */ - -/** @defgroup USBD_CDC_IF_Exported_Defines USBD_CDC_IF_Exported_Defines - * @brief Defines. - * @{ - */ -/* Define size for the receive and transmit buffer over CDC */ -#define APP_RX_DATA_SIZE 2048 -#define APP_TX_DATA_SIZE 2048 -/* USER CODE BEGIN EXPORTED_DEFINES */ - -/* USER CODE END EXPORTED_DEFINES */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Exported_Types USBD_CDC_IF_Exported_Types - * @brief Types. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_TYPES */ - -/* USER CODE END EXPORTED_TYPES */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Exported_Macros USBD_CDC_IF_Exported_Macros - * @brief Aliases. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_MACRO */ - -/* USER CODE END EXPORTED_MACRO */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables - * @brief Public variables. - * @{ - */ - -/** CDC Interface callback. */ -extern USBD_CDC_ItfTypeDef USBD_Interface_fops_FS; - -/* USER CODE BEGIN EXPORTED_VARIABLES */ - -/* USER CODE END EXPORTED_VARIABLES */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Exported_FunctionsPrototype USBD_CDC_IF_Exported_FunctionsPrototype - * @brief Public functions declaration. - * @{ - */ - -uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len); - -/* USER CODE BEGIN EXPORTED_FUNCTIONS */ -void set_update_request(bool req); -bool get_update_request(void); -/* USER CODE END EXPORTED_FUNCTIONS */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CDC_IF_H__ */ - diff --git a/software/Power_Pico/USB_DEVICE/App/usbd_desc.c b/software/Power_Pico/USB_DEVICE/App/usbd_desc.c deleted file mode 100644 index fed3574..0000000 --- a/software/Power_Pico/USB_DEVICE/App/usbd_desc.c +++ /dev/null @@ -1,445 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : App/usbd_desc.c - * @version : v1.0_Cube - * @brief : This file implements the USB device descriptors. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" -#include "usbd_desc.h" -#include "usbd_conf.h" - -/* USER CODE BEGIN INCLUDE */ - -/* USER CODE END INCLUDE */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ - -/* USER CODE BEGIN PV */ -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE END PV */ - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @addtogroup USBD_DESC - * @{ - */ - -/** @defgroup USBD_DESC_Private_TypesDefinitions USBD_DESC_Private_TypesDefinitions - * @brief Private types. - * @{ - */ - -/* USER CODE BEGIN PRIVATE_TYPES */ - -/* USER CODE END PRIVATE_TYPES */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Defines USBD_DESC_Private_Defines - * @brief Private defines. - * @{ - */ - -#define USBD_VID 1155 -#define USBD_LANGID_STRING 1033 -#define USBD_MANUFACTURER_STRING "STMicroelectronics" -#define USBD_PID_FS 22336 -#define USBD_PRODUCT_STRING_FS "STM32 Virtual ComPort" -#define USBD_CONFIGURATION_STRING_FS "CDC Config" -#define USBD_INTERFACE_STRING_FS "CDC Interface" - -#define USB_SIZ_BOS_DESC 0x0C - -/* USER CODE BEGIN PRIVATE_DEFINES */ - -/* USER CODE END PRIVATE_DEFINES */ - -/** - * @} - */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/** @defgroup USBD_DESC_Private_Macros USBD_DESC_Private_Macros - * @brief Private macros. - * @{ - */ - -/* USER CODE BEGIN PRIVATE_MACRO */ - -/* USER CODE END PRIVATE_MACRO */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes - * @brief Private functions declaration. - * @{ - */ - -static void Get_SerialNum(void); -static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len); - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes - * @brief Private functions declaration for FS. - * @{ - */ - -uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -#if (USBD_LPM_ENABLED == 1) -uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -#endif /* (USBD_LPM_ENABLED == 1) */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables - * @brief Private variables. - * @{ - */ - -USBD_DescriptorsTypeDef FS_Desc = -{ - USBD_FS_DeviceDescriptor -, USBD_FS_LangIDStrDescriptor -, USBD_FS_ManufacturerStrDescriptor -, USBD_FS_ProductStrDescriptor -, USBD_FS_SerialStrDescriptor -, USBD_FS_ConfigStrDescriptor -, USBD_FS_InterfaceStrDescriptor -#if (USBD_LPM_ENABLED == 1) -, USBD_FS_USR_BOSDescriptor -#endif /* (USBD_LPM_ENABLED == 1) */ -}; - -#if defined ( __ICCARM__ ) /* IAR Compiler */ - #pragma data_alignment=4 -#endif /* defined ( __ICCARM__ ) */ -/** USB standard device descriptor. */ -__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = -{ - 0x12, /*bLength */ - USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ -#if (USBD_LPM_ENABLED == 1) - 0x01, /*bcdUSB */ /* changed to USB version 2.01 - in order to support LPM L1 suspend - resume test of USBCV3.0*/ -#else - 0x00, /*bcdUSB */ -#endif /* (USBD_LPM_ENABLED == 1) */ - 0x02, - 0x02, /*bDeviceClass*/ - 0x02, /*bDeviceSubClass*/ - 0x00, /*bDeviceProtocol*/ - USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ - LOBYTE(USBD_VID), /*idVendor*/ - HIBYTE(USBD_VID), /*idVendor*/ - LOBYTE(USBD_PID_FS), /*idProduct*/ - HIBYTE(USBD_PID_FS), /*idProduct*/ - 0x00, /*bcdDevice rel. 2.00*/ - 0x02, - USBD_IDX_MFC_STR, /*Index of manufacturer string*/ - USBD_IDX_PRODUCT_STR, /*Index of product string*/ - USBD_IDX_SERIAL_STR, /*Index of serial number string*/ - USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/ -}; - -/* USB_DeviceDescriptor */ -/** BOS descriptor. */ -#if (USBD_LPM_ENABLED == 1) -#if defined ( __ICCARM__ ) /* IAR Compiler */ - #pragma data_alignment=4 -#endif /* defined ( __ICCARM__ ) */ -__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END = -{ - 0x5, - USB_DESC_TYPE_BOS, - 0xC, - 0x0, - 0x1, /* 1 device capability*/ - /* device capability*/ - 0x7, - USB_DEVICE_CAPABITY_TYPE, - 0x2, - 0x2, /* LPM capability bit set*/ - 0x0, - 0x0, - 0x0 -}; -#endif /* (USBD_LPM_ENABLED == 1) */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables - * @brief Private variables. - * @{ - */ - -#if defined ( __ICCARM__ ) /* IAR Compiler */ - #pragma data_alignment=4 -#endif /* defined ( __ICCARM__ ) */ - -/** USB lang identifier descriptor. */ -__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = -{ - USB_LEN_LANGID_STR_DESC, - USB_DESC_TYPE_STRING, - LOBYTE(USBD_LANGID_STRING), - HIBYTE(USBD_LANGID_STRING) -}; - -#if defined ( __ICCARM__ ) /* IAR Compiler */ - #pragma data_alignment=4 -#endif /* defined ( __ICCARM__ ) */ -/* Internal string descriptor. */ -__ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END; - -#if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 -#endif -__ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] __ALIGN_END = { - USB_SIZ_STRING_SERIAL, - USB_DESC_TYPE_STRING, -}; - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Functions USBD_DESC_Private_Functions - * @brief Private functions. - * @{ - */ - -/** - * @brief Return the device descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_FS_DeviceDesc); - return USBD_FS_DeviceDesc; -} - -/** - * @brief Return the LangID string descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_LangIDDesc); - return USBD_LangIDDesc; -} - -/** - * @brief Return the product string descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - if(speed == 0) - { - USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); - } - else - { - USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); - } - return USBD_StrDesc; -} - -/** - * @brief Return the manufacturer string descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); - return USBD_StrDesc; -} - -/** - * @brief Return the serial number string descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = USB_SIZ_STRING_SERIAL; - - /* Update the serial number string descriptor with the data from the unique - * ID */ - Get_SerialNum(); - /* USER CODE BEGIN USBD_FS_SerialStrDescriptor */ - - /* USER CODE END USBD_FS_SerialStrDescriptor */ - return (uint8_t *) USBD_StringSerial; -} - -/** - * @brief Return the configuration string descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - if(speed == USBD_SPEED_HIGH) - { - USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); - } - else - { - USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); - } - return USBD_StrDesc; -} - -/** - * @brief Return the interface string descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - if(speed == 0) - { - USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); - } - else - { - USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); - } - return USBD_StrDesc; -} - -#if (USBD_LPM_ENABLED == 1) -/** - * @brief Return the BOS descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_FS_BOSDesc); - return (uint8_t*)USBD_FS_BOSDesc; -} -#endif /* (USBD_LPM_ENABLED == 1) */ - -/** - * @brief Create the serial number string descriptor - * @param None - * @retval None - */ -static void Get_SerialNum(void) -{ - uint32_t deviceserial0; - uint32_t deviceserial1; - uint32_t deviceserial2; - - deviceserial0 = *(uint32_t *) DEVICE_ID1; - deviceserial1 = *(uint32_t *) DEVICE_ID2; - deviceserial2 = *(uint32_t *) DEVICE_ID3; - - deviceserial0 += deviceserial2; - - if (deviceserial0 != 0) - { - IntToUnicode(deviceserial0, &USBD_StringSerial[2], 8); - IntToUnicode(deviceserial1, &USBD_StringSerial[18], 4); - } -} - -/** - * @brief Convert Hex 32Bits value into char - * @param value: value to convert - * @param pbuf: pointer to the buffer - * @param len: buffer length - * @retval None - */ -static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len) -{ - uint8_t idx = 0; - - for (idx = 0; idx < len; idx++) - { - if (((value >> 28)) < 0xA) - { - pbuf[2 * idx] = (value >> 28) + '0'; - } - else - { - pbuf[2 * idx] = (value >> 28) + 'A' - 10; - } - - value = value << 4; - - pbuf[2 * idx + 1] = 0; - } -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/Power_Pico/USB_DEVICE/App/usbd_desc.h b/software/Power_Pico/USB_DEVICE/App/usbd_desc.h deleted file mode 100644 index fcef0ca..0000000 --- a/software/Power_Pico/USB_DEVICE/App/usbd_desc.h +++ /dev/null @@ -1,143 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usbd_desc.c - * @version : v1.0_Cube - * @brief : Header for usbd_conf.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_DESC__C__ -#define __USBD_DESC__C__ - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" - -/* USER CODE BEGIN INCLUDE */ - -/* USER CODE END INCLUDE */ - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_DESC USBD_DESC - * @brief Usb device descriptors module. - * @{ - */ - -/** @defgroup USBD_DESC_Exported_Constants USBD_DESC_Exported_Constants - * @brief Constants. - * @{ - */ -#define DEVICE_ID1 (UID_BASE) -#define DEVICE_ID2 (UID_BASE + 0x4) -#define DEVICE_ID3 (UID_BASE + 0x8) - -#define USB_SIZ_STRING_SERIAL 0x1A - -/* USER CODE BEGIN EXPORTED_CONSTANTS */ - -/* USER CODE END EXPORTED_CONSTANTS */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_Defines USBD_DESC_Exported_Defines - * @brief Defines. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_DEFINES */ - -/* USER CODE END EXPORTED_DEFINES */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_TypesDefinitions USBD_DESC_Exported_TypesDefinitions - * @brief Types. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_TYPES */ - -/* USER CODE END EXPORTED_TYPES */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_Macros USBD_DESC_Exported_Macros - * @brief Aliases. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_MACRO */ - -/* USER CODE END EXPORTED_MACRO */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_Variables USBD_DESC_Exported_Variables - * @brief Public variables. - * @{ - */ - -/** Descriptor for the Usb device. */ -extern USBD_DescriptorsTypeDef FS_Desc; - -/* USER CODE BEGIN EXPORTED_VARIABLES */ - -/* USER CODE END EXPORTED_VARIABLES */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_FunctionsPrototype USBD_DESC_Exported_FunctionsPrototype - * @brief Public functions declaration. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_FUNCTIONS */ - -/* USER CODE END EXPORTED_FUNCTIONS */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_DESC__C__ */ - diff --git a/software/Power_Pico/USB_DEVICE/Target/usbd_conf.c b/software/Power_Pico/USB_DEVICE/Target/usbd_conf.c deleted file mode 100644 index d1c84b4..0000000 --- a/software/Power_Pico/USB_DEVICE/Target/usbd_conf.c +++ /dev/null @@ -1,693 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : Target/usbd_conf.c - * @version : v1.0_Cube - * @brief : This file implements the board support package for the USB device library - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" -#include "stm32f4xx_hal.h" -#include "usbd_def.h" -#include "usbd_core.h" - -#include "usbd_cdc.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ - -/* USER CODE BEGIN PV */ -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE END PV */ - -PCD_HandleTypeDef hpcd_USB_OTG_FS; -void Error_Handler(void); - -/* External functions --------------------------------------------------------*/ -void SystemClock_Config(void); - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/* USER CODE BEGIN PFP */ -/* Private function prototypes -----------------------------------------------*/ -USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status); - -/* USER CODE END PFP */ - -/* Private functions ---------------------------------------------------------*/ - -/* USER CODE BEGIN 1 */ - -/** - * @brief Manually simulates a USB device disconnection by pulling D+ low. - * @retval None - */ -void USER_USBD_LL_Simulate_Disconnect(void) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - // 1. 确保 GPIOA 时钟已使能 - __HAL_RCC_GPIOA_CLK_ENABLE(); - - // 2. 将 PA12 (USB_DP) 配置为推挽输出 - GPIO_InitStruct.Pin = GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - // 3. 强制将 PA12 输出低电平,拉低 D+ - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET); -} - -/* USER CODE END 1 */ - -/******************************************************************************* - LL Driver Callbacks (PCD -> USB Device Library) -*******************************************************************************/ -/* MSP Init */ - -void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(pcdHandle->Instance==USB_OTG_FS) - { - /* USER CODE BEGIN USB_OTG_FS_MspInit 0 */ - - /* USER CODE END USB_OTG_FS_MspInit 0 */ - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**USB_OTG_FS GPIO Configuration - PA11 ------> USB_OTG_FS_DM - PA12 ------> USB_OTG_FS_DP - */ - GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* Peripheral clock enable */ - __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); - - /* Peripheral interrupt init */ - HAL_NVIC_SetPriority(OTG_FS_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(OTG_FS_IRQn); - /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */ - - /* USER CODE END USB_OTG_FS_MspInit 1 */ - } -} - -void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle) -{ - if(pcdHandle->Instance==USB_OTG_FS) - { - /* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */ - - /* USER CODE END USB_OTG_FS_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_USB_OTG_FS_CLK_DISABLE(); - - /**USB_OTG_FS GPIO Configuration - PA11 ------> USB_OTG_FS_DM - PA12 ------> USB_OTG_FS_DP - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12); - - /* Peripheral interrupt Deinit*/ - HAL_NVIC_DisableIRQ(OTG_FS_IRQn); - - /* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */ - - /* USER CODE END USB_OTG_FS_MspDeInit 1 */ - } -} - -/** - * @brief Setup stage callback - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t *)hpcd->Setup); -} - -/** - * @brief Data Out stage callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint number - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#else -void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); -} - -/** - * @brief Data In stage callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint number - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#else -void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); -} - -/** - * @brief SOF callback. - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_SOFCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData); -} - -/** - * @brief Reset callback. - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ResetCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_SpeedTypeDef speed = USBD_SPEED_FULL; - - if ( hpcd->Init.speed != PCD_SPEED_FULL) - { - Error_Handler(); - } - /* Set Speed. */ - USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed); - - /* Reset Device. */ - USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData); -} - -/** - * @brief Suspend callback. - * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - /* Inform USB library that core enters in suspend Mode. */ - USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData); - __HAL_PCD_GATE_PHYCLOCK(hpcd); - /* Enter in STOP mode. */ - /* USER CODE BEGIN 2 */ - if (hpcd->Init.low_power_enable) - { - /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */ - SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); - } - /* USER CODE END 2 */ -} - -/** - * @brief Resume callback. - * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - /* USER CODE BEGIN 3 */ - - /* USER CODE END 3 */ - USBD_LL_Resume((USBD_HandleTypeDef*)hpcd->pData); -} - -/** - * @brief ISOOUTIncomplete callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint number - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#else -void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_IsoOUTIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); -} - -/** - * @brief ISOINIncomplete callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint number - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#else -void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_IsoINIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); -} - -/** - * @brief Connect callback. - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_DevConnected((USBD_HandleTypeDef*)hpcd->pData); -} - -/** - * @brief Disconnect callback. - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData); -} - -/******************************************************************************* - LL Driver Interface (USB Device Library --> PCD) -*******************************************************************************/ - -/** - * @brief Initializes the low level portion of the device driver. - * @param pdev: Device handle - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) -{ - /* Init USB Ip. */ - if (pdev->id == DEVICE_FS) { - /* Link the driver to the stack. */ - hpcd_USB_OTG_FS.pData = pdev; - pdev->pData = &hpcd_USB_OTG_FS; - - hpcd_USB_OTG_FS.Instance = USB_OTG_FS; - hpcd_USB_OTG_FS.Init.dev_endpoints = 4; - hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL; - hpcd_USB_OTG_FS.Init.dma_enable = DISABLE; - hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED; - hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE; - hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE; - hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE; - hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE; - hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE; - if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK) - { - Error_Handler( ); - } - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - /* Register USB PCD CallBacks */ - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SOF_CB_ID, PCD_SOFCallback); - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SETUPSTAGE_CB_ID, PCD_SetupStageCallback); - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_RESET_CB_ID, PCD_ResetCallback); - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SUSPEND_CB_ID, PCD_SuspendCallback); - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_RESUME_CB_ID, PCD_ResumeCallback); - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_CONNECT_CB_ID, PCD_ConnectCallback); - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_DISCONNECT_CB_ID, PCD_DisconnectCallback); - - HAL_PCD_RegisterDataOutStageCallback(&hpcd_USB_OTG_FS, PCD_DataOutStageCallback); - HAL_PCD_RegisterDataInStageCallback(&hpcd_USB_OTG_FS, PCD_DataInStageCallback); - HAL_PCD_RegisterIsoOutIncpltCallback(&hpcd_USB_OTG_FS, PCD_ISOOUTIncompleteCallback); - HAL_PCD_RegisterIsoInIncpltCallback(&hpcd_USB_OTG_FS, PCD_ISOINIncompleteCallback); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x80); - HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40); - HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x80); - } - return USBD_OK; -} - -/** - * @brief De-Initializes the low level portion of the device driver. - * @param pdev: Device handle - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_DeInit(pdev->pData); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Starts the low level portion of the device driver. - * @param pdev: Device handle - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_Start(pdev->pData); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Stops the low level portion of the device driver. - * @param pdev: Device handle - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_Stop(pdev->pData); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Opens an endpoint of the low level driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @param ep_type: Endpoint type - * @param ep_mps: Endpoint max packet size - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Closes an endpoint of the low level driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_Close(pdev->pData, ep_addr); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Flushes an endpoint of the Low Level Driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_Flush(pdev->pData, ep_addr); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Sets a Stall condition on an endpoint of the Low Level Driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_SetStall(pdev->pData, ep_addr); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Clears a Stall condition on an endpoint of the Low Level Driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_ClrStall(pdev->pData, ep_addr); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Returns Stall condition. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @retval Stall (1: Yes, 0: No) - */ -uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef*) pdev->pData; - - if((ep_addr & 0x80) == 0x80) - { - return hpcd->IN_ep[ep_addr & 0x7F].is_stall; - } - else - { - return hpcd->OUT_ep[ep_addr & 0x7F].is_stall; - } -} - -/** - * @brief Assigns a USB address to the device. - * @param pdev: Device handle - * @param dev_addr: Device address - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_SetAddress(pdev->pData, dev_addr); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Transmits data over an endpoint. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @param pbuf: Pointer to data to be sent - * @param size: Data size - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Prepares an endpoint for reception. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @param pbuf: Pointer to data to be received - * @param size: Data size - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Returns the last transferred packet size. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @retval Received Data Size - */ -uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef*) pdev->pData, ep_addr); -} - -#ifdef USBD_HS_TESTMODE_ENABLE -/** - * @brief Set High speed Test mode. - * @param pdev: Device handle - * @param testmode: test mode - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_SetTestMode(USBD_HandleTypeDef *pdev, uint8_t testmode) -{ - UNUSED(pdev); - UNUSED(testmode); - - return USBD_OK; -} -#endif /* USBD_HS_TESTMODE_ENABLE */ - -/** - * @brief Static single allocation. - * @param size: Size of allocated memory - * @retval None - */ -void *USBD_static_malloc(uint32_t size) -{ - static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef)/4)+1];/* On 32-bit boundary */ - return mem; -} - -/** - * @brief Dummy memory free - * @param p: Pointer to allocated memory address - * @retval None - */ -void USBD_static_free(void *p) -{ - -} - -/** - * @brief Delays routine for the USB Device Library. - * @param Delay: Delay in ms - * @retval None - */ -void USBD_LL_Delay(uint32_t Delay) -{ - HAL_Delay(Delay); -} - -/** - * @brief Returns the USB status depending on the HAL status: - * @param hal_status: HAL status - * @retval USB status - */ -USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status) -{ - USBD_StatusTypeDef usb_status = USBD_OK; - - switch (hal_status) - { - case HAL_OK : - usb_status = USBD_OK; - break; - case HAL_ERROR : - usb_status = USBD_FAIL; - break; - case HAL_BUSY : - usb_status = USBD_BUSY; - break; - case HAL_TIMEOUT : - usb_status = USBD_FAIL; - break; - default : - usb_status = USBD_FAIL; - break; - } - return usb_status; -} diff --git a/software/Power_Pico/USB_DEVICE/Target/usbd_conf.h b/software/Power_Pico/USB_DEVICE/Target/usbd_conf.h deleted file mode 100644 index 70f1ee2..0000000 --- a/software/Power_Pico/USB_DEVICE/Target/usbd_conf.h +++ /dev/null @@ -1,175 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usbd_conf.h - * @version : v1.0_Cube - * @brief : Header for usbd_conf.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CONF__H__ -#define __USBD_CONF__H__ - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include -#include -#include -#include "main.h" -#include "stm32f4xx.h" -#include "stm32f4xx_hal.h" - -/* USER CODE BEGIN INCLUDE */ - -void USER_USBD_LL_Simulate_Disconnect(void); - -/* USER CODE END INCLUDE */ - -/** @addtogroup USBD_OTG_DRIVER - * @brief Driver for Usb device. - * @{ - */ - -/** @defgroup USBD_CONF USBD_CONF - * @brief Configuration file for Usb otg low level driver. - * @{ - */ - -/** @defgroup USBD_CONF_Exported_Variables USBD_CONF_Exported_Variables - * @brief Public variables. - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Defines USBD_CONF_Exported_Defines - * @brief Defines for configuration of the Usb device. - * @{ - */ - -/*---------- -----------*/ -#define USBD_MAX_NUM_INTERFACES 1U -/*---------- -----------*/ -#define USBD_MAX_NUM_CONFIGURATION 1U -/*---------- -----------*/ -#define USBD_MAX_STR_DESC_SIZ 512U -/*---------- -----------*/ -#define USBD_DEBUG_LEVEL 0U -/*---------- -----------*/ -#define USBD_LPM_ENABLED 0U -/*---------- -----------*/ -#define USBD_SELF_POWERED 1U - -/****************************************/ -/* #define for FS and HS identification */ -#define DEVICE_FS 0 -#define DEVICE_HS 1 - -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Macros USBD_CONF_Exported_Macros - * @brief Aliases. - * @{ - */ -/* Memory management macros make sure to use static memory allocation */ -/** Alias for memory allocation. */ - -#define USBD_malloc (void *)USBD_static_malloc - -/** Alias for memory release. */ -#define USBD_free USBD_static_free - -/** Alias for memory set. */ -#define USBD_memset memset - -/** Alias for memory copy. */ -#define USBD_memcpy memcpy - -/** Alias for delay. */ -#define USBD_Delay HAL_Delay - -/* DEBUG macros */ - -#if (USBD_DEBUG_LEVEL > 0) -#define USBD_UsrLog(...) printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBD_UsrLog(...) -#endif /* (USBD_DEBUG_LEVEL > 0U) */ - -#if (USBD_DEBUG_LEVEL > 1) - -#define USBD_ErrLog(...) printf("ERROR: ");\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBD_ErrLog(...) -#endif /* (USBD_DEBUG_LEVEL > 1U) */ - -#if (USBD_DEBUG_LEVEL > 2) -#define USBD_DbgLog(...) printf("DEBUG : ");\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBD_DbgLog(...) -#endif /* (USBD_DEBUG_LEVEL > 2U) */ - -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Types USBD_CONF_Exported_Types - * @brief Types. - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_FunctionsPrototype USBD_CONF_Exported_FunctionsPrototype - * @brief Declaration of public functions for Usb device. - * @{ - */ - -/* Exported functions -------------------------------------------------------*/ -void *USBD_static_malloc(uint32_t size); -void USBD_static_free(void *p); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CONF__H__ */ - diff --git a/software/Power_Pico/User/GUI/common/lv_i18n.c b/software/Power_Pico/User/GUI/common/lv_i18n.c deleted file mode 100644 index 10abc3d..0000000 --- a/software/Power_Pico/User/GUI/common/lv_i18n.c +++ /dev/null @@ -1,235 +0,0 @@ -#include "./lv_i18n.h" - - -//////////////////////////////////////////////////////////////////////////////// -// Define plural operands -// http://unicode.org/reports/tr35/tr35-numbers.html#Operands - -// Integer version, simplified - -#define UNUSED(x) (void)(x) - -static inline uint32_t op_n(int32_t val) { return (uint32_t)(val < 0 ? -val : val); } -static inline uint32_t op_i(uint32_t val) { return val; } -// always zero, when decimal part not exists. -static inline uint32_t op_v(uint32_t val) { UNUSED(val); return 0;} -static inline uint32_t op_w(uint32_t val) { UNUSED(val); return 0; } -static inline uint32_t op_f(uint32_t val) { UNUSED(val); return 0; } -static inline uint32_t op_t(uint32_t val) { UNUSED(val); return 0; } - -static lv_i18n_phrase_t en_singulars[] = { - {"press to Step Adjust", "press to Step Adjust"}, - {"press here to Fixed Set", "press here to Fixed Set"}, - {"press here to close PD", "press here to close PD"}, - {"Screen Brightness :", "Screen Brightness :"}, - {"Enable key sound", "Enable key sound"}, - {"Enable Chinese", "Enable Chinese"}, - {"Chose Rotation", "Chose Rotation"}, - {"PD Sink", "PD Sink"}, - {"Please reboot to apply\nall changes!", "Please reboot to apply\nall changes!"}, - {NULL, NULL} // End mark -}; - - - -static uint8_t en_plural_fn(int32_t num) -{ - uint32_t n = op_n(num); UNUSED(n); - uint32_t i = op_i(n); UNUSED(i); - uint32_t v = op_v(n); UNUSED(v); - - if ((i == 1 && v == 0)) return LV_I18N_PLURAL_TYPE_ONE; - return LV_I18N_PLURAL_TYPE_OTHER; -} - -static const lv_i18n_lang_t en_lang = { - .locale_name = "en", - .singulars = en_singulars, - - .locale_plural_fn = en_plural_fn -}; - -static lv_i18n_phrase_t zh_cn_singulars[] = { - {"press to Step Adjust", "进 入 步 进 调 节"}, - {"press here to Fixed Set", "进 入 固 定 调 节"}, - {"press here to close PD", "关 闭 PD 诱 骗"}, - {"Screen Brightness :", "屏 幕 亮 度 :"}, - {"Enable key sound", "按 键 声 音"}, - {"Enable Chinese", "中 英 文 切 换"}, - {"Chose Rotation", "旋 转 角 度 :"}, - {"PD Sink", "PD 诱 骗"}, - {"Please reboot to apply\nall changes!", "请重启以应用\n所有更改!"}, - {NULL, NULL} // End mark -}; - - - -static uint8_t zh_cn_plural_fn(int32_t num) -{ - - - - return LV_I18N_PLURAL_TYPE_OTHER; -} - -static const lv_i18n_lang_t zh_cn_lang = { - .locale_name = "zh-cn", - .singulars = zh_cn_singulars, - - .locale_plural_fn = zh_cn_plural_fn -}; - -const lv_i18n_language_pack_t lv_i18n_language_pack[] = { - &en_lang, - &zh_cn_lang, - NULL // End mark -}; - -//////////////////////////////////////////////////////////////////////////////// - - -// Internal state -static const lv_i18n_language_pack_t * current_lang_pack; -static const lv_i18n_lang_t * current_lang; - - -/** - * Reset internal state. For testing. - */ -void __lv_i18n_reset(void) -{ - current_lang_pack = NULL; - current_lang = NULL; -} - -/** - * Set the languages for internationalization - * @param langs pointer to the array of languages. (Last element has to be `NULL`) - */ -int lv_i18n_init(const lv_i18n_language_pack_t * langs) -{ - if(langs == NULL) return -1; - if(langs[0] == NULL) return -1; - - current_lang_pack = langs; - current_lang = langs[0]; /*Automatically select the first language*/ - return 0; -} - -/** - * Change the localization (language) - * @param l_name name of the translation locale to use. E.g. "en-GB" - */ -int lv_i18n_set_locale(const char * l_name) -{ - if(current_lang_pack == NULL) return -1; - - uint16_t i; - - for(i = 0; current_lang_pack[i] != NULL; i++) { - // Found -> finish - if(strcmp(current_lang_pack[i]->locale_name, l_name) == 0) { - current_lang = current_lang_pack[i]; - return 0; - } - } - - return -1; -} - - -static const char * __lv_i18n_get_text_core(lv_i18n_phrase_t * trans, const char * msg_id) -{ - uint16_t i; - for(i = 0; trans[i].msg_id != NULL; i++) { - if(strcmp(trans[i].msg_id, msg_id) == 0) { - /*The msg_id has found. Check the translation*/ - if(trans[i].translation) return trans[i].translation; - } - } - - return NULL; -} - - -/** - * Get the translation from a message ID - * @param msg_id message ID - * @return the translation of `msg_id` on the set local - */ -const char * lv_i18n_get_text(const char * msg_id) -{ - if(current_lang == NULL) return msg_id; - - const lv_i18n_lang_t * lang = current_lang; - const void * txt; - - // Search in current locale - if(lang->singulars != NULL) { - txt = __lv_i18n_get_text_core(lang->singulars, msg_id); - if (txt != NULL) return txt; - } - - // Try to fallback - if(lang == current_lang_pack[0]) return msg_id; - lang = current_lang_pack[0]; - - // Repeat search for default locale - if(lang->singulars != NULL) { - txt = __lv_i18n_get_text_core(lang->singulars, msg_id); - if (txt != NULL) return txt; - } - - return msg_id; -} - -/** - * Get the translation from a message ID and apply the language's plural rule to get correct form - * @param msg_id message ID - * @param num an integer to select the correct plural form - * @return the translation of `msg_id` on the set local - */ -const char * lv_i18n_get_text_plural(const char * msg_id, int32_t num) -{ - if(current_lang == NULL) return msg_id; - - const lv_i18n_lang_t * lang = current_lang; - const void * txt; - lv_i18n_plural_type_t ptype; - - // Search in current locale - if(lang->locale_plural_fn != NULL) { - ptype = lang->locale_plural_fn(num); - - if(lang->plurals[ptype] != NULL) { - txt = __lv_i18n_get_text_core(lang->plurals[ptype], msg_id); - if (txt != NULL) return txt; - } - } - - // Try to fallback - if(lang == current_lang_pack[0]) return msg_id; - lang = current_lang_pack[0]; - - // Repeat search for default locale - if(lang->locale_plural_fn != NULL) { - ptype = lang->locale_plural_fn(num); - - if(lang->plurals[ptype] != NULL) { - txt = __lv_i18n_get_text_core(lang->plurals[ptype], msg_id); - if (txt != NULL) return txt; - } - } - - return msg_id; -} - -/** - * Get the name of the currently used locale. - * @return name of the currently used locale. E.g. "en-GB" - */ -const char * lv_i18n_get_current_locale(void) -{ - if(!current_lang) return NULL; - return current_lang->locale_name; -} diff --git a/software/Power_Pico/User/GUI/common/lv_i18n.h b/software/Power_Pico/User/GUI/common/lv_i18n.h deleted file mode 100644 index 2b5514b..0000000 --- a/software/Power_Pico/User/GUI/common/lv_i18n.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef LV_I18N_H -#define LV_I18N_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -typedef enum { - LV_I18N_PLURAL_TYPE_ZERO, - LV_I18N_PLURAL_TYPE_ONE, - LV_I18N_PLURAL_TYPE_TWO, - LV_I18N_PLURAL_TYPE_FEW, - LV_I18N_PLURAL_TYPE_MANY, - LV_I18N_PLURAL_TYPE_OTHER, - _LV_I18N_PLURAL_TYPE_NUM, -} lv_i18n_plural_type_t; - -typedef struct { - const char * msg_id; - const char * translation; -} lv_i18n_phrase_t; - -typedef struct { - const char * locale_name; - lv_i18n_phrase_t * singulars; - lv_i18n_phrase_t * plurals[_LV_I18N_PLURAL_TYPE_NUM]; - uint8_t (*locale_plural_fn)(int32_t num); -} lv_i18n_lang_t; - -// Null-terminated list of languages. First one used as default. -typedef const lv_i18n_lang_t * lv_i18n_language_pack_t; - - -extern const lv_i18n_language_pack_t lv_i18n_language_pack[]; - - -/** - * Set the languages for internationalization - * @param langs pointer to the array of languages. (Last element has to be `NULL`) - */ -int lv_i18n_init(const lv_i18n_language_pack_t * langs); - -/** - * Change the localization (language) - * @param l_name name of the translation locale to use. E.g. "en_GB" - */ -int lv_i18n_set_locale(const char * l_name); - -/** - * Get the translation from a message ID - * @param msg_id message ID - * @return the translation of `msg_id` on the set local - */ -const char * lv_i18n_get_text(const char * msg_id); - -/** - * Get the translation from a message ID and apply the language's plural rule to get correct form - * @param msg_id message ID - * @param num an integer to select the correct plural form - * @return the translation of `msg_id` on the set local - */ -const char * lv_i18n_get_text_plural(const char * msg_id, int32_t num); - -/** - * Get the name of the currently used localization. - * @return name of the currently used localization. E.g. "en_GB" - */ -const char * lv_i18n_get_current_locale(void); - - -void __lv_i18n_reset(void); - - -#define _(text) lv_i18n_get_text(text) -#define _p(text, num) lv_i18n_get_text_plural(text, num) - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_LANG_H*/ \ No newline at end of file diff --git a/software/Power_Pico/User/GUI/common/lv_lib_animation.c b/software/Power_Pico/User/GUI/common/lv_lib_animation.c deleted file mode 100644 index 514a6e9..0000000 --- a/software/Power_Pico/User/GUI/common/lv_lib_animation.c +++ /dev/null @@ -1,58 +0,0 @@ -#include "lv_lib_animation.h" - -void lv_lib_anim_callback_set_x(void * var, int32_t v) -{ - lv_obj_set_x(var, v); -} - -void lv_lib_anim_callback_set_y(void * var, int32_t v) -{ - lv_obj_set_y(var, v); -} - -void lv_lib_anim_callback_set_hight(void * var, int32_t v) -{ - lv_obj_set_height(var, v); -} - -void lv_lib_anim_callback_set_width(void * var, int32_t v) -{ - lv_obj_set_width(var, v); -} - -void lv_lib_anim_callback_set_image_angle(void * var, int32_t v) -{ - lv_image_set_rotation(var, v); -} - -void lv_lib_anim_callback_set_scale(void * var, int32_t v) -{ - lv_image_set_scale(var, v); -} - -void lv_lib_anim_callback_set_opacity(void * var, int32_t v) -{ - lv_obj_set_style_opa(var, v, LV_PART_MAIN | LV_STATE_DEFAULT); -} - -void lv_lib_anim_user_animation(lv_obj_t * TagetObj, uint16_t delay, uint16_t time, int16_t start_value, int16_t end_value, - uint16_t playback_delay, uint16_t playback_time, uint16_t repeat_delay, uint16_t repeat_count, - lv_anim_path_cb_t path_cb, lv_anim_exec_xcb_t exec_cb, lv_anim_completed_cb_t completed_cb) -{ - lv_anim_t Animation; - lv_anim_init(&Animation); - lv_anim_set_var(&Animation, TagetObj); - lv_anim_set_time(&Animation, time); - lv_anim_set_values(&Animation, start_value, end_value); - lv_anim_set_exec_cb(&Animation, exec_cb); - lv_anim_set_path_cb(&Animation, path_cb); - lv_anim_set_delay(&Animation, delay); - lv_anim_set_playback_time(&Animation, playback_time); - lv_anim_set_playback_delay(&Animation, playback_delay); - lv_anim_set_repeat_count(&Animation, repeat_count); - lv_anim_set_repeat_delay(&Animation, repeat_delay); - lv_anim_set_early_apply(&Animation, false); - lv_anim_set_completed_cb(&Animation, completed_cb); - lv_anim_start(&Animation); -} - diff --git a/software/Power_Pico/User/GUI/common/lv_lib_animation.h b/software/Power_Pico/User/GUI/common/lv_lib_animation.h deleted file mode 100644 index 989ea95..0000000 --- a/software/Power_Pico/User/GUI/common/lv_lib_animation.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef LV_LIB_ANIMATION_H -#define LV_LIB_ANIMATION_H - -#include "lvgl.h" - -void lv_lib_anim_callback_set_x(void * var, int32_t v); -void lv_lib_anim_callback_set_y(void * var, int32_t v); -void lv_lib_anim_callback_set_hight(void * var, int32_t v); -void lv_lib_anim_callback_set_width(void * var, int32_t v); -void lv_lib_anim_callback_set_image_angle(void * var, int32_t v); -void lv_lib_anim_callback_set_scale(void * var, int32_t v); -void lv_lib_anim_callback_set_opacity(void * var, int32_t v); -// user set animation -void lv_lib_anim_user_animation(lv_obj_t * TagetObj, uint16_t delay, uint16_t time, int16_t start_value, int16_t end_value, - uint16_t playback_delay, uint16_t playback_time, uint16_t repeat_delay, uint16_t repeat_count, - lv_anim_path_cb_t path_cb, lv_anim_exec_xcb_t exec_cb, lv_anim_completed_cb_t completed_cb); - -#endif // LV_LIB_ANIMATION_H diff --git a/software/Power_Pico/User/GUI/common/lv_lib_pm.c b/software/Power_Pico/User/GUI/common/lv_lib_pm.c deleted file mode 100644 index f00ae59..0000000 --- a/software/Power_Pico/User/GUI/common/lv_lib_pm.c +++ /dev/null @@ -1,135 +0,0 @@ -#include "./lv_lib_pm.h" -#include - -// 定义全局实例 -PageManager_t PageManager; - -/** - * 初始化页面管理器 - */ -void lv_lib_pm_Init(void) { - memset(&PageManager, 0, sizeof(PageManager)); -} - -/** - * load init screen - */ -void lv_lib_pm_load_init_screen(void) { - if (PageManager.count == 0) return; - - Page_t* initial_page = PageManager.pages[0]; - if (initial_page->init) initial_page->init(); - lv_screen_load_anim(*initial_page->page_obj, LV_SCR_LOAD_ANIM_MOVE_LEFT, 200, 0, true); - PageManager.current_index = 0; -} - -/** - * 注册一个新页面 - * @param page 页面结构体指针 - */ -void lv_lib_pm_register(Page_t* page) { - if (PageManager.count >= MAX_PAGES) { - LV_LOG_WARN("PageManager: page list is full!"); - return; - } - PageManager.pages[PageManager.count++] = page; -} - -/** - * 切换到数组中下一个页面(循环) - */ -void lv_lib_pm_next(void) { - if (PageManager.count == 0) return; - - Page_t* prev = PageManager.pages[PageManager.current_index]; - Page_t* next = PageManager.pages[(PageManager.current_index + 1) % PageManager.count]; - - // 初始化新页面并切换 - if (next->init) next->init(); - lv_screen_load_anim(*next->page_obj, LV_SCR_LOAD_ANIM_MOVE_LEFT, 200, 0, true); - - // 反初始化前页 - if (prev->deinit) prev->deinit(); - - // 更新索引 - PageManager.current_index = (PageManager.current_index + 1) % PageManager.count; - -} - -/** - * 切换到数组中上一个页面(循环) - */ -void lv_lib_pm_prev(void) { - if (PageManager.count == 0) return; - - Page_t* current = PageManager.pages[PageManager.current_index]; - uint8_t prev_index = (PageManager.current_index == 0) ? PageManager.count - 1 : PageManager.current_index - 1; - Page_t* prev = PageManager.pages[prev_index]; - - if (prev->init) prev->init(); - lv_screen_load_anim(*prev->page_obj, LV_SCR_LOAD_ANIM_MOVE_RIGHT, 200, 0, true); - - if (current->deinit) current->deinit(); - - PageManager.current_index = prev_index; - -} - -/** - * 跳转到指定索引页面 - * @param page_name 页面名称,传入 NULL 则根据索引跳转 - * @param index 目标页面索引 - */ -void lv_lib_pm_goto(const char* page_name, uint8_t index) { - - if (page_name != NULL) { - // 根据页面名称查找索引 - for (uint8_t i = 0; i < PageManager.count; i++) { - if (strcmp(PageManager.pages[i]->name, page_name) == 0) { - index = i; - break; - } - } - } - - if(index >= PageManager.count || PageManager.count == 0) return; - - Page_t* current = PageManager.pages[PageManager.current_index]; - Page_t* target = PageManager.pages[index]; - - if (current != target) { - if (current->deinit) current->deinit(); - PageManager.current_index = index; - if (target->init) target->init(); - lv_screen_load_anim(*target->page_obj, LV_SCR_LOAD_ANIM_MOVE_LEFT, 200, 0, true); - } -} - -/** - * 跳转到首页面 - */ -void lv_lib_pm_goto_first(void) { - lv_lib_pm_goto(NULL, 0); -} - -/** - * 获取当前页面 - * @return 当前页面指针 - */ -Page_t* lv_lib_pm_get_current_page(void) { - if (PageManager.count == 0) return NULL; - return PageManager.pages[PageManager.current_index]; -} - -/** - * 处理按键事件,调用当前页面的按键事件处理函数 - * @param key_id 按键ID - */ -void lv_lib_pm_handle_key_event(void* key_event) { - Page_t* current_page = lv_lib_pm_get_current_page(); - if (current_page && current_page->key_event_handler) { - current_page->key_event_handler(key_event); // 调用当前页面的按键事件处理函数 - } else { - LV_LOG_WARN("No key event handler for current page\n"); - } -} diff --git a/software/Power_Pico/User/GUI/common/lv_lib_pm.h b/software/Power_Pico/User/GUI/common/lv_lib_pm.h deleted file mode 100644 index 43af8ec..0000000 --- a/software/Power_Pico/User/GUI/common/lv_lib_pm.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef PAGE_MANAGER_H -#define PAGE_MANAGER_H - -#include "lvgl.h" - -// 最大支持页面数量 -#define MAX_PAGES 5 - -// 页面结构体 -typedef struct { - void (*init)(void); - void (*deinit)(void); - lv_obj_t** page_obj; // 指向页面对象指针的指针 - void (*key_event_handler)(void* key_event); // 按键事件处理函数 - const char* name; // 可选:用于调试 -} Page_t; - -// 页面管理器结构体 -typedef struct { - Page_t* pages[MAX_PAGES]; - uint8_t count; - uint8_t current_index; -} PageManager_t; - -// 全局管理器实例(声明) -extern PageManager_t PageManager; - -// API 函数声明 -void lv_lib_pm_Init(void); -void lv_lib_pm_register(Page_t* page); -void lv_lib_pm_load_init_screen(void); -void lv_lib_pm_next(void); -void lv_lib_pm_prev(void); -void lv_lib_pm_goto(const char* page_name, uint8_t index); -void lv_lib_pm_goto_first(void); -Page_t* lv_lib_pm_get_current_page(void); -void lv_lib_pm_handle_key_event(void* key_event); - -#endif // PAGE_MANAGER_H diff --git a/software/Power_Pico/User/GUI/font/ui_font_HeiTi32.c b/software/Power_Pico/User/GUI/font/ui_font_HeiTi32.c deleted file mode 100644 index 3e83779..0000000 --- a/software/Power_Pico/User/GUI/font/ui_font_HeiTi32.c +++ /dev/null @@ -1,546 +0,0 @@ -/******************************************************************************* - * Size: 32 px - * Bpp: 4 - * Opts: --bpp 4 --size 32 --font E:/projects/SquareLine_Projects/PowerPico/assets/FangZhengHeiTi-GBK-1.ttf -o E:/projects/SquareLine_Projects/PowerPico/assets\ui_font_HeiTi32.c --format lvgl --symbols 1234567890.muAVW:- --no-compress --no-prefilter - ******************************************************************************/ - -#include "../ui.h" - -#ifndef UI_FONT_HEITI32 -#define UI_FONT_HEITI32 1 -#endif - -#if UI_FONT_HEITI32 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+002D "-" */ - 0x35, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, - - /* U+002E "." */ - 0x15, 0x55, 0x4, 0xff, 0xf2, 0x4f, 0xff, 0x24, - 0xff, 0xf2, - - /* U+0030 "0" */ - 0x0, 0x0, 0x3, 0x78, 0x86, 0x10, 0x0, 0x0, - 0x0, 0x2, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0xef, 0xfc, 0x40, 0x16, 0xef, 0xf9, 0x0, - 0x8, 0xff, 0xd0, 0x0, 0x0, 0x2f, 0xff, 0x20, - 0xe, 0xff, 0x30, 0x0, 0x0, 0x8, 0xff, 0x80, - 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, - 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf1, - 0x9f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf4, - 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, - 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, - 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf9, - 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf9, - 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, - 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, - 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf3, - 0x6f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf0, - 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, - 0xc, 0xff, 0x50, 0x0, 0x0, 0x9, 0xff, 0x60, - 0x4, 0xff, 0xe1, 0x0, 0x0, 0x3f, 0xfd, 0x0, - 0x0, 0x9f, 0xfd, 0x52, 0x27, 0xff, 0xf4, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x4a, 0xdf, 0xfd, 0x81, 0x0, 0x0, - - /* U+0031 "1" */ - 0x0, 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0x1f, - 0xf6, 0x0, 0x0, 0x9, 0xff, 0x60, 0x0, 0x6, - 0xff, 0xf6, 0x1, 0x5b, 0xff, 0xff, 0x6e, 0xff, - 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, 0x61, - 0x11, 0x11, 0x8f, 0xf6, 0x0, 0x0, 0x8, 0xff, - 0x60, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x8, - 0xff, 0x60, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, - 0x8, 0xff, 0x60, 0x0, 0x0, 0x8f, 0xf6, 0x0, - 0x0, 0x8, 0xff, 0x60, 0x0, 0x0, 0x8f, 0xf6, - 0x0, 0x0, 0x8, 0xff, 0x60, 0x0, 0x0, 0x8f, - 0xf6, 0x0, 0x0, 0x8, 0xff, 0x60, 0x0, 0x0, - 0x8f, 0xf6, 0x0, 0x0, 0x8, 0xff, 0x60, 0x0, - 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x8, 0xff, 0x60, - - /* U+0032 "2" */ - 0x0, 0x0, 0x6, 0xae, 0xff, 0xc9, 0x30, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x2f, 0xff, 0xfb, 0x9a, 0xdf, 0xff, - 0xb0, 0x0, 0xb, 0xff, 0xc1, 0x0, 0x0, 0x4f, - 0xff, 0x60, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x5f, 0xfd, 0x0, 0x6f, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xf1, 0x8, 0xff, 0x60, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x30, 0x8d, 0xd3, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3d, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xaf, 0xff, 0xd2, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, - 0x0, 0x5e, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf9, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x92, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x41, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, - - /* U+0033 "3" */ - 0x0, 0x0, 0x4, 0x78, 0x87, 0x40, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x6, 0xff, 0xf7, 0x20, 0x14, 0xbf, 0xff, 0x10, - 0xd, 0xff, 0x40, 0x0, 0x0, 0xc, 0xff, 0x70, - 0x2f, 0xfc, 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, - 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, - 0x3a, 0xa4, 0x0, 0x0, 0x0, 0x5, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x14, 0xcf, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xc4, 0x0, - 0x0, 0x0, 0x0, 0x45, 0x69, 0xef, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, - 0x12, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, - 0xbf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, - 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, - 0x2f, 0xff, 0x30, 0x0, 0x0, 0x8, 0xff, 0xd0, - 0xa, 0xff, 0xf8, 0x31, 0x25, 0xbf, 0xff, 0x30, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x5, 0xad, 0xff, 0xfd, 0xa5, 0x0, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xdf, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xc6, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf2, - 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, - 0x6, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1e, 0xfc, - 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x0, 0xa, 0xff, - 0x20, 0x6, 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, - 0x60, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x2, 0xff, - 0xb0, 0x0, 0x6, 0xff, 0x60, 0x0, 0x0, 0xcf, - 0xf1, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x7f, - 0xf6, 0x0, 0x0, 0x6, 0xff, 0x60, 0x0, 0x2f, - 0xfb, 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc1, 0x55, 0x55, 0x55, 0x55, 0x59, 0xff, 0x95, - 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xf6, 0x0, 0x0, - - /* U+0035 "5" */ - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0xdf, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0x10, - 0x0, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xfe, 0x4, 0x8a, 0xa7, 0x30, 0x0, 0x0, - 0xa, 0xfe, 0xcf, 0xff, 0xff, 0xfc, 0x40, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0xe, 0xff, 0xd6, 0x10, 0x27, 0xef, 0xff, 0x30, - 0xf, 0xfb, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, - 0xcd, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, - 0xbf, 0xf4, 0x0, 0x0, 0x0, 0x4, 0xff, 0xd0, - 0x6f, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x60, - 0xc, 0xff, 0xe7, 0x32, 0x26, 0xef, 0xfa, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x5, 0xad, 0xff, 0xec, 0x82, 0x0, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x0, 0x35, 0x66, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x6e, 0xff, 0xff, 0xfe, 0x70, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x8f, 0xfe, 0x71, 0x2, 0x8f, 0xff, 0x50, - 0x2, 0xff, 0xe2, 0x0, 0x0, 0x6, 0xff, 0xc0, - 0x9, 0xff, 0x60, 0x0, 0x0, 0x0, 0xef, 0xf0, - 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x13, 0x30, - 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xf6, 0x0, 0x36, 0x75, 0x10, 0x0, 0x0, - 0x8f, 0xf4, 0x4e, 0xff, 0xff, 0xfc, 0x40, 0x0, - 0xaf, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0xbf, 0xff, 0xf9, 0x30, 0x2, 0x9f, 0xff, 0x60, - 0xbf, 0xff, 0x70, 0x0, 0x0, 0x7, 0xff, 0xe0, - 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, - 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, - 0x9f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf9, - 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, - 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, - 0xe, 0xff, 0x30, 0x0, 0x0, 0x1, 0xff, 0xf1, - 0x7, 0xff, 0xd1, 0x0, 0x0, 0xb, 0xff, 0x90, - 0x0, 0xcf, 0xff, 0x96, 0x58, 0xdf, 0xfd, 0x0, - 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x5a, 0xef, 0xfd, 0xa5, 0x0, 0x0, - - /* U+0037 "7" */ - 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb8, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x0, 0x5, 0x78, 0x86, 0x30, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x4, 0xff, 0xf8, 0x20, 0x14, 0xcf, 0xfd, 0x0, - 0xa, 0xff, 0x70, 0x0, 0x0, 0xc, 0xff, 0x40, - 0xd, 0xff, 0x0, 0x0, 0x0, 0x5, 0xff, 0x80, - 0xf, 0xfe, 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, - 0xe, 0xff, 0x10, 0x0, 0x0, 0x6, 0xff, 0x70, - 0x9, 0xff, 0x80, 0x0, 0x0, 0xd, 0xff, 0x20, - 0x2, 0xff, 0xf9, 0x20, 0x14, 0xcf, 0xfa, 0x0, - 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x3, 0xef, 0xff, 0xb9, 0xac, 0xff, 0xfc, 0x0, - 0xe, 0xff, 0x90, 0x0, 0x0, 0x2c, 0xff, 0xa0, - 0x7f, 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, - 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf5, - 0xbf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, - 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf5, - 0x8f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, - 0x3f, 0xff, 0x40, 0x0, 0x0, 0x6, 0xff, 0xc0, - 0x9, 0xff, 0xf9, 0x41, 0x14, 0x9f, 0xff, 0x30, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x0, 0x2, 0x8c, 0xef, 0xfe, 0xb6, 0x0, 0x0, - - /* U+0039 "9" */ - 0x0, 0x1, 0x7c, 0xef, 0xec, 0x81, 0x0, 0x0, - 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x2, 0xff, 0xfd, 0x97, 0x8c, 0xff, 0xf5, 0x0, - 0xb, 0xff, 0x90, 0x0, 0x0, 0x5f, 0xfe, 0x10, - 0x2f, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0x70, - 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x2, 0xff, 0xd0, - 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, - 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, - 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf6, - 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf7, - 0x1f, 0xff, 0x20, 0x0, 0x0, 0xc, 0xff, 0xf7, - 0x8, 0xff, 0xf7, 0x20, 0x4, 0xcf, 0xff, 0xf5, - 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x9f, 0xf4, - 0x0, 0x7, 0xef, 0xff, 0xff, 0xb1, 0xaf, 0xf2, - 0x0, 0x0, 0x2, 0x45, 0x31, 0x0, 0xef, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, - 0x27, 0x73, 0x0, 0x0, 0x0, 0x8, 0xff, 0x60, - 0x3f, 0xf9, 0x0, 0x0, 0x0, 0xe, 0xfe, 0x0, - 0xe, 0xfe, 0x10, 0x0, 0x0, 0x9f, 0xf7, 0x0, - 0x7, 0xff, 0xc3, 0x0, 0x19, 0xff, 0xb0, 0x0, - 0x0, 0x9f, 0xff, 0xfe, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x4, 0xad, 0xff, 0xea, 0x40, 0x0, 0x0, - - /* U+003A ":" */ - 0x4f, 0xff, 0x24, 0xff, 0xf2, 0x4f, 0xff, 0x21, - 0x55, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x55, 0x50, 0x4f, 0xff, 0x24, 0xff, 0xf2, - 0x4f, 0xff, 0x20, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xfd, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x4e, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xe0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xf9, 0x4, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x30, 0xf, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xe0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xf8, 0x0, 0x5, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0xf, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x3, 0xff, 0xd0, - 0x0, 0x0, 0xaf, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xf8, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, 0x0, 0xf, - 0xff, 0x70, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x1f, 0xff, 0xbb, 0xbb, 0xbb, 0xbb, 0xbe, - 0xff, 0x80, 0x0, 0x7, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0xdf, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, - 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x90, 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x0, 0xef, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, 0x5f, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xb0, - - /* U+0056 "V" */ - 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x90, 0xdf, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf3, 0x7, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x0, - 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0x70, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf1, 0x0, 0x5, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfb, 0x0, 0x0, - 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x60, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, - 0x5, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, - 0xe, 0xff, 0x50, 0x0, 0x0, 0xf, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, 0x0, 0x5, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, - 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xff, 0x50, 0x0, 0x1f, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x0, 0x6, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, - 0x0, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0x50, 0x1f, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xfb, 0x7, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, - 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, - - /* U+0057 "W" */ - 0x5f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, 0x1f, - 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xd, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xf0, 0x9, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xb0, 0x5, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0xdf, 0xed, 0xff, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x70, 0x1, 0xff, 0xf0, 0x0, 0x0, - 0x2, 0xff, 0xa8, 0xff, 0x40, 0x0, 0x0, 0xf, - 0xff, 0x30, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x6, - 0xff, 0x64, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xfe, - 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0xa, 0xff, - 0x10, 0xff, 0xc0, 0x0, 0x0, 0x7f, 0xfa, 0x0, - 0x0, 0x4f, 0xfb, 0x0, 0x0, 0xe, 0xfd, 0x0, - 0xbf, 0xf1, 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, - 0xf, 0xff, 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x6f, - 0xf5, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0xc, - 0xff, 0x30, 0x0, 0x8f, 0xf4, 0x0, 0x2f, 0xf9, - 0x0, 0x2, 0xff, 0xe0, 0x0, 0x0, 0x8, 0xff, - 0x60, 0x0, 0xcf, 0xf0, 0x0, 0xd, 0xfe, 0x0, - 0x5, 0xff, 0x90, 0x0, 0x0, 0x3, 0xff, 0xa0, - 0x0, 0xff, 0xb0, 0x0, 0x9, 0xff, 0x20, 0x9, - 0xff, 0x50, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x5, - 0xff, 0x60, 0x0, 0x4, 0xff, 0x70, 0xd, 0xff, - 0x10, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x9, 0xff, - 0x20, 0x0, 0x0, 0xff, 0xb0, 0xf, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xf5, 0xd, 0xfd, 0x0, - 0x0, 0x0, 0xbf, 0xf0, 0x4f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xf9, 0x2f, 0xf9, 0x0, 0x0, - 0x0, 0x7f, 0xf4, 0x7f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xfd, 0x6f, 0xf4, 0x0, 0x0, 0x0, - 0x2f, 0xf8, 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0xe, - 0xfd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfc, 0x0, 0x0, - 0x0, - - /* U+006D "m" */ - 0x0, 0x0, 0x0, 0x57, 0x63, 0x0, 0x0, 0x2, - 0x67, 0x50, 0x0, 0xf, 0xfc, 0x7, 0xff, 0xff, - 0xfa, 0x0, 0x1b, 0xff, 0xff, 0xf7, 0x0, 0xff, - 0xc8, 0xff, 0xff, 0xff, 0xfa, 0x2e, 0xff, 0xff, - 0xff, 0xf7, 0xf, 0xff, 0xff, 0x83, 0x26, 0xff, - 0xff, 0xfd, 0x62, 0x4b, 0xff, 0xf1, 0xff, 0xff, - 0x30, 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0xd, - 0xff, 0x6f, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, - 0x40, 0x0, 0x0, 0x7f, 0xf8, 0xff, 0xf2, 0x0, - 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, - 0x9f, 0xff, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, - 0x0, 0x0, 0x4f, 0xfa, 0xff, 0xe0, 0x0, 0x0, - 0x2, 0xff, 0xc0, 0x0, 0x0, 0x4, 0xff, 0xaf, - 0xfe, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, - 0x0, 0x4f, 0xfa, 0xff, 0xe0, 0x0, 0x0, 0x2, - 0xff, 0xc0, 0x0, 0x0, 0x4, 0xff, 0xaf, 0xfe, - 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, - 0x4f, 0xfa, 0xff, 0xe0, 0x0, 0x0, 0x2, 0xff, - 0xc0, 0x0, 0x0, 0x4, 0xff, 0xaf, 0xfe, 0x0, - 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, 0x4f, - 0xfa, 0xff, 0xe0, 0x0, 0x0, 0x2, 0xff, 0xc0, - 0x0, 0x0, 0x4, 0xff, 0xaf, 0xfe, 0x0, 0x0, - 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, 0x4f, 0xfa, - 0xff, 0xe0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, - 0x0, 0x4, 0xff, 0xaf, 0xfe, 0x0, 0x0, 0x0, - 0x2f, 0xfc, 0x0, 0x0, 0x0, 0x4f, 0xfa, - - /* U+0075 "u" */ - 0xef, 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xfa, 0xef, - 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xfa, 0xef, 0xf0, - 0x0, 0x0, 0x0, 0x2f, 0xfa, 0xef, 0xf0, 0x0, - 0x0, 0x0, 0x2f, 0xfa, 0xef, 0xf0, 0x0, 0x0, - 0x0, 0x2f, 0xfa, 0xef, 0xf0, 0x0, 0x0, 0x0, - 0x2f, 0xfa, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x2f, - 0xfa, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xfa, - 0xef, 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xfa, 0xef, - 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xfa, 0xef, 0xf0, - 0x0, 0x0, 0x0, 0x4f, 0xfa, 0xef, 0xf0, 0x0, - 0x0, 0x0, 0x7f, 0xfa, 0xdf, 0xf2, 0x0, 0x0, - 0x0, 0xdf, 0xfa, 0xbf, 0xf9, 0x0, 0x0, 0x8, - 0xff, 0xfa, 0x6f, 0xff, 0x93, 0x14, 0xaf, 0xbf, - 0xfa, 0xb, 0xff, 0xff, 0xff, 0xfb, 0xf, 0xfa, - 0x0, 0x6c, 0xff, 0xeb, 0x50, 0xf, 0xfa -}; - - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 298, .box_w = 17, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 26, .adv_w = 142, .box_w = 5, .box_h = 4, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 36, .adv_w = 284, .box_w = 16, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 220, .adv_w = 284, .box_w = 9, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 324, .adv_w = 284, .box_w = 17, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 511, .adv_w = 284, .box_w = 16, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 695, .adv_w = 284, .box_w = 17, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 891, .adv_w = 284, .box_w = 16, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1067, .adv_w = 284, .box_w = 16, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1251, .adv_w = 284, .box_w = 16, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1427, .adv_w = 284, .box_w = 16, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1611, .adv_w = 284, .box_w = 16, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1787, .adv_w = 142, .box_w = 5, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1830, .adv_w = 340, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2072, .adv_w = 340, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2314, .adv_w = 482, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2659, .adv_w = 424, .box_w = 23, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2866, .adv_w = 284, .box_w = 14, .box_h = 17, .ofs_x = 2, .ofs_y = 0} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_0[] = { - 0x0, 0x1, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, - 0x9, 0xa, 0xb, 0xc, 0xd, 0x14, 0x29, 0x2a, - 0x40, 0x48 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = -{ - { - .range_start = 45, .range_length = 73, .glyph_id_start = 1, - .unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 18, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - - - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR == 8 -/*Store all the custom data of the font*/ -static lv_font_fmt_txt_glyph_cache_t cache; -#endif - -#if LVGL_VERSION_MAJOR >= 8 -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = NULL, - .kern_scale = 0, - .cmap_num = 1, - .bpp = 4, - .kern_classes = 0, - .bitmap_format = 0, -#if LVGL_VERSION_MAJOR == 8 - .cache = &cache -#endif -}; - - - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t ui_font_HeiTi32 = { -#else -lv_font_t ui_font_HeiTi32 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 23, /*The maximum line height required by the font*/ - .base_line = 0, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -6, - .underline_thickness = 2, -#endif - .dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9 - .fallback = NULL, -#endif - .user_data = NULL, -}; - - - -#endif /*#if UI_FONT_HEITI32*/ - diff --git a/software/Power_Pico/User/GUI/font/ui_font_HeiTi48.c b/software/Power_Pico/User/GUI/font/ui_font_HeiTi48.c deleted file mode 100644 index 1903f3b..0000000 --- a/software/Power_Pico/User/GUI/font/ui_font_HeiTi48.c +++ /dev/null @@ -1,1006 +0,0 @@ -/******************************************************************************* - * Size: 48 px - * Bpp: 4 - * Opts: --bpp 4 --size 48 --font E:/projects/SquareLine_Projects/PowerPico/assets/FangZhengHeiTi-GBK-1.ttf -o E:/projects/SquareLine_Projects/PowerPico/assets\ui_font_HeiTi48.c --format lvgl --symbols 1234567890.muAVW:- --no-compress --no-prefilter - ******************************************************************************/ - -#include "../ui.h" - -#ifndef UI_FONT_HEITI48 -#define UI_FONT_HEITI48 1 -#endif - -#if UI_FONT_HEITI48 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+002D "-" */ - 0x19, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x90, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, - - /* U+002E "." */ - 0x11, 0x11, 0x10, 0xef, 0xff, 0xf3, 0xef, 0xff, - 0xf3, 0xef, 0xff, 0xf3, 0xef, 0xff, 0xf3, 0xef, - 0xff, 0xf3, - - /* U+0030 "0" */ - 0x0, 0x0, 0x0, 0x0, 0x6a, 0xdf, 0xfe, 0xc8, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xfa, 0x30, 0x1, 0x6d, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf6, 0x0, - 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x1e, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, - 0x2, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xa0, 0x7, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe0, - 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xf2, 0xd, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, - 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf8, 0x1f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, - 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfc, 0x4f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, - 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xfe, 0x4f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfe, - 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xfd, 0x3f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfb, 0xf, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, - 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf6, 0xb, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, - 0x8, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf0, 0x4, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, - 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x60, 0x0, 0x9f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, - 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xb0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xfe, 0x84, 0x35, 0xaf, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x6b, 0xdf, 0xff, 0xc9, 0x30, 0x0, 0x0, 0x0, - - /* U+0031 "1" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1, 0x8f, 0xff, - 0xff, 0xf1, 0x13, 0x47, 0xaf, 0xff, 0xff, 0xff, - 0xf1, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - - /* U+0032 "2" */ - 0x0, 0x0, 0x0, 0x2, 0x6a, 0xcd, 0xed, 0xb7, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x10, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xe7, 0x20, 0x1, 0x4a, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x20, - 0x1, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x90, 0x5, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, - 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xf2, 0xc, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, - 0xd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf5, 0xe, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, - 0x2, 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xdf, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xfd, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - - /* U+0033 "3" */ - 0x0, 0x0, 0x0, 0x3, 0x8c, 0xdf, 0xfe, 0xda, - 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xc5, 0x10, - 0x0, 0x39, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x8, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0xef, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, - 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xff, 0xf7, 0x0, 0x5, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, - 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf7, 0x0, 0x7, 0xee, 0xe8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4d, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x99, 0x9b, 0xef, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x48, 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x3, - 0xbb, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf1, 0x3f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xd0, 0xf, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xfa, 0x0, 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x6, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, - 0xff, 0xd0, 0x0, 0xe, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xf5, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0xe9, 0x53, 0x34, 0x7c, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x9c, 0xef, 0xff, 0xed, 0xa7, 0x20, 0x0, 0x0, - 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xee, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0xff, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf7, 0x1f, 0xff, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x1, - 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0x10, 0x1f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, - 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x1f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe1, - 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0x1f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, - 0x30, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, - 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0xc, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x10, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf2, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x28, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0xff, 0xff, 0x99, 0x99, 0x91, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, - 0x0, - - /* U+0035 "5" */ - 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x6, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, - 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0x50, 0x5b, 0xff, 0xff, 0xd9, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x7e, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xa5, 0x20, 0x14, 0x9f, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0xff, 0xff, 0xd3, - 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0x40, - 0x1, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf7, 0x5d, 0xdd, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, - 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xf0, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xa0, - 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xff, 0x30, 0x3, 0xff, 0xff, 0xe4, - 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xf9, 0x0, - 0x0, 0x8f, 0xff, 0xff, 0xd8, 0x53, 0x35, 0x9e, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, - 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, - 0xce, 0xff, 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, - - /* U+0036 "6" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xbb, 0xa9, - 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0x93, 0x10, 0x26, - 0xdf, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xd2, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, - 0x0, 0xd, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0x90, 0x0, 0x4f, 0xff, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe0, - 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xf1, 0x0, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x33, 0x30, - 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, - 0x16, 0xbd, 0xef, 0xca, 0x61, 0x0, 0x0, 0x0, - 0xe, 0xff, 0xf5, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa2, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0xf, 0xff, 0xf8, 0xff, 0xff, 0xfd, 0xcd, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x1f, 0xff, 0xff, 0xff, - 0xc5, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0x30, - 0x1f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xff, 0xff, 0xb0, 0x1f, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, - 0x1f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf7, 0xf, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, - 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xfd, 0xd, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfe, - 0xb, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xfd, 0x7, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, - 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, - 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xc0, 0x0, 0xe, 0xff, 0xfe, - 0x40, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x40, - 0x0, 0x6, 0xff, 0xff, 0xfb, 0x62, 0x12, 0x38, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x67, 0x76, 0x52, - 0x0, 0x0, 0x0, 0x0, - - /* U+0037 "7" */ - 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x5, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x25, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0038 "8" */ - 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, 0xda, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0xb4, 0x10, 0x1, 0x49, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4f, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, - 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x10, 0x0, 0xdf, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, - 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x60, 0x0, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, - 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x30, 0x0, 0xaf, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, - 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x9, 0xff, 0xff, - 0xd6, 0x10, 0x0, 0x39, 0xff, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x4, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xb5, 0x20, 0x1, 0x37, - 0xef, 0xff, 0xfd, 0x0, 0x1, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, - 0x8, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xf1, 0xd, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, - 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xf9, 0x1f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, - 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xfa, 0xf, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, - 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0xf5, 0xb, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf1, - 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xef, 0xff, 0xb0, 0x0, 0xdf, 0xff, 0xfb, - 0x10, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0x30, - 0x0, 0x3f, 0xff, 0xff, 0xfa, 0x64, 0x34, 0x6a, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x9c, 0xef, 0xfe, 0xdb, 0x83, 0x0, 0x0, 0x0, - - /* U+0039 "9" */ - 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xdc, 0x72, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xec, - 0xce, 0xff, 0xff, 0xff, 0x40, 0x0, 0x2, 0xff, - 0xff, 0xf8, 0x10, 0x0, 0x2, 0x9f, 0xff, 0xfe, - 0x10, 0x0, 0xaf, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x1f, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf1, - 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x60, 0x9f, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0xb, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xf0, 0xdf, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x3e, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xf6, 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x8b, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xf9, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xa4, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, - 0xe, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xff, 0xff, 0xa0, 0x6f, 0xff, 0xfe, 0x60, - 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xf9, 0x0, - 0xbf, 0xff, 0xff, 0xfb, 0xa9, 0xae, 0xff, 0xfe, - 0xcf, 0xff, 0x80, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4c, 0xff, 0xf6, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0xef, - 0xff, 0x40, 0x0, 0x0, 0x16, 0xad, 0xef, 0xed, - 0xa5, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, 0x4, - 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x20, 0x6f, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x4, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf5, 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x30, - 0x0, 0x1, 0xef, 0xff, 0xf7, 0x10, 0x0, 0x4c, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xed, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xbe, - 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, 0x0, - - /* U+003A ":" */ - 0xef, 0xff, 0xf3, 0xef, 0xff, 0xf3, 0xef, 0xff, - 0xf3, 0xef, 0xff, 0xf3, 0xef, 0xff, 0xf3, 0x11, - 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x11, 0x10, 0xef, 0xff, 0xf3, 0xef, - 0xff, 0xf3, 0xef, 0xff, 0xf3, 0xef, 0xff, 0xf3, - 0xef, 0xff, 0xf3, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, - 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, - 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, - 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, - 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, - 0x5, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x0, - 0x0, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, - 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, - 0x0, 0x5f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, - 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb2, 0x22, 0x22, - 0x22, 0x22, 0x2f, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, 0x0, - 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, - 0x0, 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x0, - 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, - 0x0, 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, - 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x60, - 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xc0, - 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf2, - - /* U+0056 "V" */ - 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, - 0x8, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, - 0x2, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x30, - 0x0, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0, - 0x0, 0x6f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf1, 0x0, - 0x0, 0xa, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, - 0x0, 0xb, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, - 0x0, 0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf5, 0x0, - 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, - 0x0, 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, - 0x1, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x50, - 0x6, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xa0, - 0xb, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, - 0x1f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, - 0x6f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, - 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0057 "W" */ - 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0xdf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xf0, 0x9, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xfc, 0x0, 0x5f, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x80, 0x1, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, - 0x0, 0xc, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfc, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x0, 0x0, - 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xb0, 0x0, 0x4, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xe0, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xff, 0xf7, 0x0, 0x0, 0xf, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfa, 0x7, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, - 0xff, 0x20, 0x0, 0x0, 0xbf, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x2f, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xf1, 0x0, 0xef, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xfc, 0x0, 0xa, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0x80, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, - 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0xc, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x8f, 0xff, - 0x60, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x8, - 0xff, 0xf6, 0x0, 0x0, 0x4, 0xff, 0xfb, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, - 0x20, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, - 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0xe, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xf3, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf8, 0x0, 0x1, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, - 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x0, 0xe, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0x10, 0x9, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x2, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf5, 0x0, - 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x30, 0x7f, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0xf, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xf6, 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xfe, 0x4, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, - 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xf3, 0x7f, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x4f, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x7b, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xfc, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, - - /* U+006D "m" */ - 0x0, 0x0, 0x0, 0x0, 0x6b, 0xef, 0xec, 0x60, - 0x0, 0x0, 0x0, 0x39, 0xdf, 0xec, 0x83, 0x0, - 0x0, 0xff, 0xff, 0x20, 0x4e, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0xff, 0xff, 0x26, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x3, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0xff, 0xff, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x2e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, - 0xb6, 0x33, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xa4, - 0x0, 0x29, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, - 0xd3, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf7, 0xff, 0xff, - 0xfe, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xfe, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, - - /* U+0075 "u" */ - 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xff, 0x7d, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xff, 0xf7, 0xdf, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x7d, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xff, 0xf7, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0xff, 0x7d, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, 0xdf, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0x7d, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xf7, 0xdf, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x7d, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, - 0xf7, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xff, 0x7d, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, 0xdf, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0x7d, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0xf7, 0xdf, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0x7d, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf7, - 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0xff, 0x7c, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xff, 0xf7, 0xcf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x7a, - 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xff, 0xf7, 0x7f, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0x71, 0xff, 0xff, 0xfe, - 0x74, 0x34, 0x8d, 0xff, 0xd8, 0xff, 0xf7, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x8f, - 0xff, 0x70, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa1, 0x8, 0xff, 0xf7, 0x0, 0x1, 0x7b, 0xef, - 0xfe, 0xc8, 0x20, 0x0, 0x8f, 0xff, 0x70 -}; - - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 447, .box_w = 26, .box_h = 4, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 52, .adv_w = 213, .box_w = 6, .box_h = 6, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 70, .adv_w = 426, .box_w = 24, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 478, .adv_w = 426, .box_w = 14, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 716, .adv_w = 426, .box_w = 24, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1124, .adv_w = 426, .box_w = 25, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1549, .adv_w = 426, .box_w = 25, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1974, .adv_w = 426, .box_w = 24, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2382, .adv_w = 426, .box_w = 24, .box_h = 35, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2802, .adv_w = 426, .box_w = 25, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3227, .adv_w = 426, .box_w = 24, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3635, .adv_w = 426, .box_w = 23, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4026, .adv_w = 213, .box_w = 6, .box_h = 25, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 4101, .adv_w = 510, .box_w = 32, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4645, .adv_w = 510, .box_w = 32, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5189, .adv_w = 723, .box_w = 45, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5954, .adv_w = 636, .box_w = 34, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6396, .adv_w = 426, .box_w = 21, .box_h = 25, .ofs_x = 3, .ofs_y = 0} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_0[] = { - 0x0, 0x1, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, - 0x9, 0xa, 0xb, 0xc, 0xd, 0x14, 0x29, 0x2a, - 0x40, 0x48 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = -{ - { - .range_start = 45, .range_length = 73, .glyph_id_start = 1, - .unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 18, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - - - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR == 8 -/*Store all the custom data of the font*/ -static lv_font_fmt_txt_glyph_cache_t cache; -#endif - -#if LVGL_VERSION_MAJOR >= 8 -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = NULL, - .kern_scale = 0, - .cmap_num = 1, - .bpp = 4, - .kern_classes = 0, - .bitmap_format = 0, -#if LVGL_VERSION_MAJOR == 8 - .cache = &cache -#endif -}; - - - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t ui_font_HeiTi48 = { -#else -lv_font_t ui_font_HeiTi48 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 35, /*The maximum line height required by the font*/ - .base_line = 1, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -9, - .underline_thickness = 2, -#endif - .dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9 - .fallback = NULL, -#endif - .user_data = NULL, -}; - - - -#endif /*#if UI_FONT_HEITI48*/ - diff --git a/software/Power_Pico/User/GUI/font/ui_font_zhongyuan18.c b/software/Power_Pico/User/GUI/font/ui_font_zhongyuan18.c deleted file mode 100644 index 1d0b79e..0000000 --- a/software/Power_Pico/User/GUI/font/ui_font_zhongyuan18.c +++ /dev/null @@ -1,1705 +0,0 @@ -/******************************************************************************* - * Size: 18 px - * Bpp: 4 - * Opts: --bpp 4 --size 18 --font E:/projects/SquareLine_Projects/PowerPico/assets/HanYiZhongYuanJian-1.ttf -o E:/projects/SquareLine_Projects/PowerPico/assets\ui_font_zhongyuan18.c --format lvgl -r 0x20-0x7f --symbols 屏幕亮度:进入步进调节关闭诱骗按键声音中英文切换旋转角度 --no-compress --no-prefilter - ******************************************************************************/ - -#include "../ui.h" - -#ifndef UI_FONT_ZHONGYUAN18 -#define UI_FONT_ZHONGYUAN18 1 -#endif - -#if UI_FONT_ZHONGYUAN18 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x3e, 0x6, 0xf2, 0x5f, 0x15, 0xf1, 0x5f, 0x4, - 0xf0, 0x4f, 0x4, 0xf0, 0x3e, 0x1, 0x70, 0x0, - 0x6, 0xf3, 0x6e, 0x30, - - /* U+0022 "\"" */ - 0x0, 0x0, 0xa, 0x60, 0xb5, 0x96, 0xb, 0x58, - 0x60, 0xa3, 0x65, 0x9, 0x25, 0x50, 0x81, 0x34, - 0x7, 0x1, 0x30, 0x50, - - /* U+0023 "#" */ - 0x0, 0x0, 0x36, 0x0, 0x0, 0xa1, 0x0, 0x0, - 0x0, 0x98, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, - 0xc5, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x0, 0xf3, - 0x0, 0x5, 0xd0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x13, 0x36, 0xe3, 0x33, 0x3a, - 0xa3, 0x30, 0x0, 0x6, 0xb0, 0x0, 0xa, 0x70, - 0x0, 0x0, 0x8, 0x90, 0x0, 0xd, 0x50, 0x0, - 0x0, 0xa, 0x60, 0x0, 0xf, 0x30, 0x0, 0x0, - 0xd, 0x40, 0x0, 0x1f, 0x10, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x12, 0x4e, 0x22, - 0x22, 0x7d, 0x22, 0x20, 0x0, 0x4c, 0x0, 0x0, - 0x7a, 0x0, 0x0, 0x0, 0x79, 0x0, 0x0, 0xa7, - 0x0, 0x0, 0x0, 0x96, 0x0, 0x0, 0xb4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x0, 0x17, - 0xae, 0xfa, 0x40, 0x0, 0x3, 0xfd, 0x8d, 0xdb, - 0xf9, 0x0, 0xc, 0xc0, 0xb, 0xb0, 0x5f, 0x60, - 0xf, 0x50, 0xb, 0xb0, 0xb, 0xc0, 0xf, 0x70, - 0xb, 0xb0, 0x1, 0x40, 0x8, 0xfa, 0x5b, 0xb0, - 0x0, 0x0, 0x0, 0x6c, 0xff, 0xfe, 0xa4, 0x0, - 0x0, 0x0, 0xb, 0xc6, 0x9f, 0x60, 0x0, 0x0, - 0xb, 0xb0, 0x8, 0xe0, 0x5c, 0x0, 0xb, 0xb0, - 0x5, 0xf2, 0x3f, 0x70, 0xb, 0xb0, 0x8, 0xf0, - 0x7, 0xfb, 0x4b, 0xb1, 0x7f, 0x80, 0x0, 0x4c, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x1c, 0xc3, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, - - /* U+0025 "%" */ - 0x1, 0x9e, 0xd5, 0x0, 0x0, 0xa, 0x60, 0x0, - 0xbb, 0x37, 0xf4, 0x0, 0x7, 0xf4, 0x0, 0x3f, - 0x10, 0xa, 0xb0, 0x3, 0xf8, 0x0, 0x5, 0xd0, - 0x0, 0x7e, 0x0, 0xdc, 0x0, 0x0, 0x4e, 0x0, - 0x9, 0xc0, 0xaf, 0x20, 0x0, 0x0, 0xe9, 0x4, - 0xf6, 0x6f, 0x50, 0x0, 0x0, 0x3, 0xdf, 0xf8, - 0x2f, 0x95, 0xde, 0x91, 0x0, 0x0, 0x10, 0xc, - 0xd5, 0xf6, 0x3c, 0xb0, 0x0, 0x0, 0x9, 0xf2, - 0xb9, 0x0, 0x2f, 0x30, 0x0, 0x4, 0xf6, 0xe, - 0x60, 0x0, 0xf5, 0x0, 0x1, 0xea, 0x0, 0xc8, - 0x0, 0x2f, 0x40, 0x0, 0xbd, 0x10, 0x6, 0xe3, - 0xb, 0xd0, 0x0, 0x6f, 0x30, 0x0, 0x8, 0xff, - 0xc2, 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, 0x10, - 0x0, - - /* U+0026 "&" */ - 0x0, 0x5c, 0xfe, 0x90, 0x0, 0x0, 0x5, 0xfa, - 0x79, 0xfb, 0x0, 0x0, 0xb, 0xd0, 0x0, 0x6f, - 0x0, 0x0, 0xa, 0xf1, 0x0, 0x8f, 0x0, 0x0, - 0x3, 0xfc, 0x18, 0xf9, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x90, 0x0, 0x72, 0x0, 0xbf, 0xfd, 0x10, - 0x1, 0xf5, 0xb, 0xe4, 0x3e, 0xe2, 0x7, 0xf1, - 0x5f, 0x30, 0x2, 0xef, 0x4e, 0xa0, 0x8e, 0x0, - 0x0, 0x2d, 0xff, 0x30, 0x6f, 0x20, 0x0, 0x8, - 0xff, 0x60, 0xe, 0xd3, 0x14, 0xbf, 0x9d, 0xf6, - 0x2, 0xbf, 0xff, 0xc4, 0x1, 0xca, 0x0, 0x0, - 0x21, 0x0, 0x0, 0x0, - - /* U+0027 "'" */ - 0x1, 0x2e, 0x2e, 0x1c, 0xb, 0xa, 0x8, 0x5, - - /* U+0028 "(" */ - 0x0, 0x5, 0x40, 0x4, 0xf5, 0x0, 0xe9, 0x0, - 0x7e, 0x0, 0xd, 0x70, 0x3, 0xf2, 0x0, 0x6f, - 0x0, 0x7, 0xd0, 0x0, 0x7d, 0x0, 0x6, 0xf0, - 0x0, 0x2f, 0x30, 0x0, 0xd9, 0x0, 0x6, 0xf2, - 0x0, 0xc, 0xd0, 0x0, 0x1c, 0x50, 0x0, 0x0, - - /* U+0029 ")" */ - 0x44, 0x0, 0x6, 0xf3, 0x0, 0xa, 0xd0, 0x0, - 0x1e, 0x60, 0x0, 0x8c, 0x0, 0x3, 0xf1, 0x0, - 0xf, 0x40, 0x0, 0xe6, 0x0, 0xf, 0x50, 0x1, - 0xf4, 0x0, 0x5f, 0x10, 0xb, 0xb0, 0x3, 0xf5, - 0x1, 0xeb, 0x0, 0x6c, 0x10, 0x0, 0x0, 0x0, - - /* U+002A "*" */ - 0x0, 0x2e, 0x0, 0x0, 0x3, 0xf0, 0x0, 0xbd, - 0x2b, 0x3e, 0x81, 0x79, 0xaa, 0x60, 0x3a, 0xb9, - 0xa7, 0x1a, 0xb1, 0xd2, 0xd6, 0x0, 0x4f, 0x0, - 0x0, 0x0, 0x60, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, 0x1b, 0xbb, - 0xbb, 0xeb, 0xbb, 0xb7, 0x0, 0x0, 0x1, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa0, - 0x0, 0x0, - - /* U+002C "," */ - 0x3, 0xc, 0xf7, 0xbf, 0xa0, 0x95, 0x79, 0x2, - 0x0, - - /* U+002D "-" */ - 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xc7, - - /* U+002E "." */ - 0x0, 0x9, 0xf2, 0x8e, 0x20, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x83, 0x0, 0x0, 0x0, 0x0, 0x38, - 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, - 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x4, 0x70, - 0x0, 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, - 0x0, 0x0, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, - 0x9, 0x20, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, - 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x91, 0x0, 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x3b, 0xfb, 0x20, 0x0, 0x3f, 0x95, 0xbf, - 0x20, 0xc, 0x90, 0x0, 0xcb, 0x2, 0xf1, 0x0, - 0x4, 0xf1, 0x6d, 0x0, 0x0, 0xf, 0x58, 0xb0, - 0x0, 0x0, 0xd7, 0x8b, 0x0, 0x0, 0xd, 0x76, - 0xd0, 0x0, 0x0, 0xf6, 0x2f, 0x20, 0x0, 0x4f, - 0x20, 0xca, 0x0, 0xd, 0xb0, 0x3, 0xfb, 0x7d, - 0xf3, 0x0, 0x3, 0xcf, 0xc3, 0x0, - - /* U+0031 "1" */ - 0x0, 0x6, 0xe6, 0x2, 0xcf, 0xf7, 0x5f, 0xb2, - 0xe7, 0x44, 0x0, 0xe7, 0x0, 0x0, 0xe7, 0x0, - 0x0, 0xe7, 0x0, 0x0, 0xe7, 0x0, 0x0, 0xe7, - 0x0, 0x0, 0xe7, 0x0, 0x0, 0xe7, 0x0, 0x0, - 0xe7, 0x0, 0x0, 0xc5, - - /* U+0032 "2" */ - 0x0, 0x15, 0x74, 0x0, 0x0, 0x2e, 0xff, 0xfc, - 0x0, 0xd, 0xd1, 0x4, 0xf9, 0x4, 0xf4, 0x0, - 0x9, 0xe0, 0x6e, 0x0, 0x0, 0x5f, 0x10, 0x10, - 0x0, 0x7, 0xf0, 0x0, 0x0, 0x0, 0xda, 0x0, - 0x0, 0x0, 0xbf, 0x20, 0x0, 0x2, 0xce, 0x30, - 0x0, 0x6, 0xfb, 0x10, 0x0, 0xa, 0xf5, 0x0, - 0x0, 0x5, 0xf8, 0x44, 0x44, 0x41, 0x4f, 0xff, - 0xff, 0xff, 0x80, - - /* U+0033 "3" */ - 0x0, 0x17, 0x98, 0x10, 0x0, 0x2e, 0xda, 0xcf, - 0x30, 0xc, 0xb0, 0x0, 0xad, 0x1, 0xf3, 0x0, - 0x4, 0xf0, 0x5, 0x0, 0x0, 0x5f, 0x0, 0x0, - 0x0, 0x2d, 0xa0, 0x0, 0x2, 0xff, 0xf4, 0x0, - 0x0, 0x3, 0x4a, 0xf1, 0x0, 0x0, 0x0, 0xd, - 0x65, 0xd0, 0x0, 0x0, 0xd7, 0x2f, 0x60, 0x0, - 0x1f, 0x50, 0x7f, 0x95, 0x5d, 0xd0, 0x0, 0x5c, - 0xfe, 0xa1, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0xcc, - 0x0, 0x0, 0x0, 0x5f, 0xc0, 0x0, 0x0, 0xe, - 0xec, 0x0, 0x0, 0x8, 0xe7, 0xc0, 0x0, 0x1, - 0xf6, 0x7c, 0x0, 0x0, 0xac, 0x7, 0xc0, 0x0, - 0x3f, 0x30, 0x7c, 0x0, 0xc, 0x90, 0x7, 0xc0, - 0x5, 0xf2, 0x0, 0x7c, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0x70, 0x33, 0x33, 0x9d, 0x30, 0x0, 0x0, - 0x6, 0xc0, 0x0, 0x0, 0x0, 0x14, 0x0, - - /* U+0035 "5" */ - 0x4, 0xff, 0xff, 0xff, 0x10, 0x8d, 0x55, 0x55, - 0x40, 0xb, 0x80, 0x0, 0x0, 0x0, 0xd6, 0x14, - 0x30, 0x0, 0xf, 0xce, 0xce, 0xe3, 0x2, 0xf6, - 0x0, 0x7, 0xf1, 0x1, 0x0, 0x0, 0xe, 0x60, - 0x0, 0x0, 0x0, 0xb8, 0x68, 0x0, 0x0, 0xd, - 0x75, 0xf4, 0x0, 0x2, 0xf4, 0xa, 0xf8, 0x46, - 0xdc, 0x0, 0x6, 0xdf, 0xe9, 0x10, - - /* U+0036 "6" */ - 0x0, 0x3c, 0xfd, 0x70, 0x0, 0x3f, 0xa3, 0x6f, - 0x90, 0xc, 0xa0, 0x0, 0x5f, 0x12, 0xf2, 0x2, - 0x20, 0x40, 0x5e, 0x3c, 0x9a, 0xd2, 0x6, 0xed, - 0x10, 0x7, 0xd0, 0x6f, 0x70, 0x0, 0xf, 0x45, - 0xf5, 0x0, 0x0, 0xe6, 0x1f, 0x60, 0x0, 0xf, - 0x60, 0xcb, 0x0, 0x4, 0xf3, 0x3, 0xf9, 0x45, - 0xeb, 0x0, 0x4, 0xdf, 0xfa, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0037 "7" */ - 0x6f, 0xff, 0xff, 0xff, 0x71, 0x55, 0x55, 0x5c, - 0xf5, 0x0, 0x0, 0x1, 0xf8, 0x0, 0x0, 0x0, - 0xac, 0x0, 0x0, 0x0, 0x2f, 0x40, 0x0, 0x0, - 0x9, 0xc0, 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, - 0x0, 0x4f, 0x0, 0x0, 0x0, 0x9, 0xb0, 0x0, - 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, 0xf, 0x50, - 0x0, 0x0, 0x2, 0xf3, 0x0, 0x0, 0x0, 0x7, - 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x7d, 0xfe, 0x80, 0x0, 0x8e, 0x75, 0x7f, - 0x90, 0xf, 0x50, 0x0, 0x6f, 0x0, 0xf3, 0x0, - 0x4, 0xf1, 0xb, 0xb0, 0x0, 0xad, 0x0, 0x3f, - 0xfd, 0xef, 0x30, 0x1e, 0xb3, 0x25, 0xce, 0x16, - 0xf1, 0x0, 0x1, 0xf7, 0x8d, 0x0, 0x0, 0xd, - 0x87, 0xf2, 0x0, 0x1, 0xf6, 0xd, 0xe7, 0x56, - 0xde, 0x10, 0x19, 0xdf, 0xfc, 0x30, - - /* U+0039 "9" */ - 0x0, 0x7, 0x96, 0x10, 0x0, 0x2e, 0xda, 0xde, - 0x20, 0xc, 0xa0, 0x0, 0xbc, 0x2, 0xf1, 0x0, - 0x3, 0xf2, 0x4e, 0x0, 0x0, 0xf, 0x55, 0xf0, - 0x0, 0x1, 0xf7, 0x2f, 0x40, 0x0, 0x6f, 0x80, - 0xce, 0x41, 0x6f, 0xf7, 0x1, 0xbf, 0xff, 0xaf, - 0x60, 0x60, 0x13, 0x11, 0xf3, 0x2f, 0x50, 0x0, - 0x6f, 0x0, 0xaf, 0x50, 0x4e, 0x80, 0x0, 0x9f, - 0xff, 0x90, 0x0, 0x0, 0x12, 0x10, 0x0, - - /* U+003A ":" */ - 0x8e, 0x5e, 0xfa, 0x38, 0x10, 0x0, 0x38, 0x1e, - 0xfa, 0x9e, 0x50, - - /* U+003B ";" */ - 0x38, 0x1d, 0xfa, 0x8e, 0x50, 0x0, 0xaf, 0x5d, - 0xfa, 0x1b, 0x76, 0xb0, 0x10, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x7a, 0x0, 0x0, 0x0, - 0x0, 0x29, 0xc6, 0x0, 0x0, 0x0, 0x3, 0xab, - 0x40, 0x0, 0x0, 0x0, 0x5c, 0xa3, 0x0, 0x0, - 0x0, 0x6, 0xc8, 0x10, 0x0, 0x0, 0x0, 0x1e, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0x81, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xc9, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xb4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x9c, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x17, 0xc6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x30, - - /* U+003D "=" */ - 0x1b, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, - - /* U+003E ">" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8c, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xc8, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x92, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xbb, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2b, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x3a, 0xc5, 0x0, 0x0, 0x0, 0x4, - 0xbb, 0x40, 0x0, 0x0, 0x0, 0x6c, 0x92, 0x0, - 0x0, 0x0, 0x17, 0xc7, 0x10, 0x0, 0x0, 0x0, - 0x9c, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x8, 0xff, 0xf8, - 0x0, 0x9, 0xd4, 0x3, 0xd7, 0x3, 0xf1, 0x0, - 0x4, 0xf0, 0x7a, 0x0, 0x0, 0xf, 0x20, 0x0, - 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, 0x5d, 0x0, - 0x0, 0x0, 0x3e, 0x50, 0x0, 0x0, 0x5f, 0x60, - 0x0, 0x0, 0xd, 0x80, 0x0, 0x0, 0x0, 0xd5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xe8, 0x0, 0x0, 0x0, 0x1e, 0x80, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x1, 0x6a, 0xbb, 0xb9, 0x50, 0x0, - 0x0, 0x0, 0x7, 0xb5, 0x0, 0x0, 0x16, 0xb4, - 0x0, 0x0, 0xa, 0x70, 0x3, 0x88, 0x93, 0x32, - 0xb3, 0x0, 0x7, 0x70, 0x7, 0x80, 0x1, 0xdf, - 0x31, 0xc0, 0x2, 0xb0, 0x6, 0x80, 0x0, 0x8, - 0xe0, 0x8, 0x40, 0x93, 0x1, 0xd0, 0x0, 0x0, - 0x9a, 0x0, 0x47, 0xd, 0x0, 0x69, 0x0, 0x0, - 0xd, 0x60, 0x4, 0x70, 0xc0, 0x9, 0x60, 0x0, - 0x1, 0xf2, 0x0, 0x84, 0xc, 0x0, 0xa6, 0x0, - 0x0, 0x7e, 0x0, 0xd, 0x0, 0xd0, 0x7, 0xb0, - 0x0, 0x1e, 0xa0, 0x8, 0x70, 0x9, 0x50, 0x1e, - 0x92, 0x4d, 0xf9, 0x7, 0xa0, 0x0, 0x1d, 0x10, - 0x2a, 0xfe, 0x84, 0xed, 0x60, 0x43, 0x0, 0x5d, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, - 0x4d, 0x82, 0x0, 0x0, 0x16, 0xc7, 0x0, 0x0, - 0x0, 0x6, 0xbc, 0xcc, 0xcb, 0x71, 0x0, 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x0, 0xda, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xd, 0x8b, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0x14, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xba, 0x0, - 0xd9, 0x0, 0x0, 0x0, 0x2, 0xf4, 0x0, 0x6f, - 0x10, 0x0, 0x0, 0x9, 0xd0, 0x0, 0xe, 0x70, - 0x0, 0x0, 0xf, 0x60, 0x0, 0x8, 0xe0, 0x0, - 0x0, 0x6f, 0x10, 0x0, 0x2, 0xf5, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x4, 0xf6, - 0x33, 0x33, 0x33, 0x8f, 0x30, 0xb, 0xd0, 0x0, - 0x0, 0x0, 0xe, 0xa0, 0xf, 0x50, 0x0, 0x0, - 0x0, 0x7, 0xf0, 0x2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x20, - - /* U+0042 "B" */ - 0xb, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x1f, 0x94, - 0x44, 0x44, 0x5c, 0xe1, 0x1f, 0x40, 0x0, 0x0, - 0x1, 0xf6, 0x1f, 0x40, 0x0, 0x0, 0x1, 0xf5, - 0x1f, 0x40, 0x0, 0x0, 0x3b, 0xd0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x1f, 0x63, 0x33, 0x33, - 0x4b, 0xf3, 0x1f, 0x40, 0x0, 0x0, 0x0, 0xdb, - 0x1f, 0x40, 0x0, 0x0, 0x0, 0x8d, 0x1f, 0x40, - 0x0, 0x0, 0x0, 0xcb, 0x1f, 0xa4, 0x44, 0x44, - 0x6b, 0xf4, 0xa, 0xff, 0xff, 0xff, 0xfc, 0x50, - - /* U+0043 "C" */ - 0x0, 0x1, 0x8d, 0xff, 0xd8, 0x10, 0x0, 0x3, - 0xef, 0x96, 0x69, 0xfe, 0x30, 0x1, 0xec, 0x10, - 0x0, 0x2, 0xdf, 0x20, 0x9f, 0x10, 0x0, 0x0, - 0x2, 0xe6, 0xe, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, - 0x0, 0x6, 0x90, 0x7f, 0x40, 0x0, 0x0, 0x3, - 0xf9, 0x0, 0xdf, 0x60, 0x0, 0x5, 0xed, 0x0, - 0x1, 0xbf, 0xeb, 0xbe, 0xfb, 0x10, 0x0, 0x0, - 0x37, 0x9a, 0x83, 0x0, 0x0, - - /* U+0044 "D" */ - 0xa, 0xff, 0xff, 0xfe, 0xb5, 0x0, 0xf, 0xa5, - 0x55, 0x55, 0xbf, 0x70, 0xf, 0x50, 0x0, 0x0, - 0x9, 0xf2, 0xf, 0x50, 0x0, 0x0, 0x1, 0xf7, - 0xf, 0x50, 0x0, 0x0, 0x0, 0xcb, 0xf, 0x50, - 0x0, 0x0, 0x0, 0xad, 0xf, 0x50, 0x0, 0x0, - 0x0, 0xad, 0xf, 0x50, 0x0, 0x0, 0x0, 0xbc, - 0xf, 0x50, 0x0, 0x0, 0x0, 0xe9, 0xf, 0x50, - 0x0, 0x0, 0x3, 0xf5, 0xf, 0xc6, 0x55, 0x55, - 0x8e, 0xc0, 0x8, 0xef, 0xff, 0xff, 0xe9, 0x10, - - /* U+0045 "E" */ - 0xa, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf, 0xa4, - 0x44, 0x44, 0x44, 0x40, 0x1f, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x1f, 0x73, 0x33, 0x33, - 0x33, 0x0, 0x1f, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xa4, 0x44, 0x44, - 0x44, 0x41, 0x9, 0xef, 0xff, 0xff, 0xff, 0xf9, - - /* U+0046 "F" */ - 0xa, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf, 0xb5, - 0x55, 0x55, 0x55, 0x40, 0x1f, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0x61, 0x11, 0x11, 0x10, 0x0, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x1f, 0x84, 0x44, 0x44, - 0x43, 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, - 0x3b, 0xef, 0xfe, 0x92, 0x0, 0x0, 0x5f, 0xc6, - 0x34, 0x8e, 0xf4, 0x0, 0x2f, 0xa0, 0x0, 0x0, - 0x1d, 0xf2, 0xa, 0xe0, 0x0, 0x0, 0x0, 0x1e, - 0x70, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0x50, 0x0, 0x0, 0x11, 0x10, 0x0, 0xf5, 0x0, - 0x0, 0x7f, 0xff, 0xf6, 0xf, 0x70, 0x0, 0x0, - 0x34, 0x4d, 0xb0, 0xcc, 0x0, 0x0, 0x0, 0x0, - 0xbb, 0x5, 0xf6, 0x0, 0x0, 0x0, 0x3f, 0xb0, - 0xa, 0xf7, 0x0, 0x0, 0x5f, 0xfb, 0x0, 0x8, - 0xff, 0xdc, 0xef, 0x8a, 0xa0, 0x0, 0x1, 0x68, - 0x86, 0x10, 0x43, - - /* U+0048 "H" */ - 0x2, 0x0, 0x0, 0x0, 0x0, 0x30, 0xf, 0x30, - 0x0, 0x0, 0x0, 0xf4, 0x1f, 0x40, 0x0, 0x0, - 0x0, 0xf5, 0x1f, 0x40, 0x0, 0x0, 0x0, 0xf5, - 0x1f, 0x40, 0x0, 0x0, 0x0, 0xf5, 0x1f, 0x51, - 0x11, 0x11, 0x11, 0xf5, 0x1f, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x1f, 0x74, 0x44, 0x44, 0x44, 0xf5, - 0x1f, 0x40, 0x0, 0x0, 0x0, 0xf5, 0x1f, 0x40, - 0x0, 0x0, 0x0, 0xf5, 0x1f, 0x40, 0x0, 0x0, - 0x0, 0xf5, 0x1f, 0x40, 0x0, 0x0, 0x0, 0xf5, - 0x1f, 0x40, 0x0, 0x0, 0x0, 0xf5, 0xe, 0x20, - 0x0, 0x0, 0x0, 0xd3, - - /* U+0049 "I" */ - 0x3, 0x0, 0xf4, 0x1f, 0x41, 0xf4, 0x1f, 0x41, - 0xf4, 0x1f, 0x41, 0xf4, 0x1f, 0x41, 0xf4, 0x1f, - 0x41, 0xf4, 0xf, 0x40, 0x50, - - /* U+004A "J" */ - 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, - 0x0, 0x7e, 0x0, 0x0, 0x0, 0x0, 0x7e, 0x0, - 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, 0x0, 0x0, - 0x7e, 0x0, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, - 0x0, 0x0, 0x7e, 0x1, 0x0, 0x0, 0x0, 0x7e, - 0xe, 0x40, 0x0, 0x0, 0x7e, 0xe, 0x70, 0x0, - 0x0, 0x9c, 0xa, 0xd0, 0x0, 0x1, 0xe9, 0x2, - 0xed, 0x75, 0x6d, 0xf2, 0x0, 0x29, 0xdf, 0xea, - 0x20, - - /* U+004B "K" */ - 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0xf3, 0x0, - 0x0, 0x6, 0xf5, 0xf, 0x30, 0x0, 0x9, 0xf7, - 0x0, 0xf3, 0x0, 0x1c, 0xf4, 0x0, 0xf, 0x30, - 0x3e, 0xd2, 0x0, 0x0, 0xf3, 0x6f, 0xb0, 0x0, - 0x0, 0xf, 0xcf, 0xf9, 0x0, 0x0, 0x0, 0xfe, - 0x45, 0xf6, 0x0, 0x0, 0xf, 0x40, 0x8, 0xf3, - 0x0, 0x0, 0xf3, 0x0, 0xb, 0xe1, 0x0, 0xf, - 0x30, 0x0, 0x1e, 0xb0, 0x0, 0xf3, 0x0, 0x0, - 0x3f, 0x80, 0xf, 0x30, 0x0, 0x0, 0x6f, 0x10, - 0x50, 0x0, 0x0, 0x0, 0x20, - - /* U+004C "L" */ - 0x8, 0x10, 0x0, 0x0, 0x0, 0x0, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x1f, 0x50, 0x0, 0x0, 0x0, - 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0xf, 0x40, 0x0, 0x0, 0x0, 0x0, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xf, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xf, - 0x40, 0x0, 0x0, 0x0, 0x0, 0xf9, 0x44, 0x44, - 0x44, 0x30, 0xa, 0xff, 0xff, 0xff, 0xff, 0x40, - - /* U+004D "M" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xb0, 0x0, 0x0, 0x0, 0x6, 0xe2, 0xf, 0xf4, - 0x0, 0x0, 0x0, 0xe, 0xf5, 0xf, 0xfb, 0x0, - 0x0, 0x0, 0x5f, 0xf5, 0xf, 0xaf, 0x20, 0x0, - 0x0, 0xcb, 0xf5, 0xf, 0x5e, 0x90, 0x0, 0x3, - 0xf4, 0xf5, 0xf, 0x57, 0xf1, 0x0, 0x9, 0xd0, - 0xf5, 0xf, 0x51, 0xf7, 0x0, 0x1f, 0x60, 0xf5, - 0xf, 0x50, 0xae, 0x0, 0x7f, 0x0, 0xf5, 0xf, - 0x50, 0x3f, 0x50, 0xd9, 0x0, 0xf5, 0xf, 0x50, - 0xc, 0xc4, 0xf2, 0x0, 0xf5, 0xf, 0x50, 0x5, - 0xfe, 0xb0, 0x0, 0xf5, 0xe, 0x30, 0x0, 0xbe, - 0x30, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+004E "N" */ - 0x6, 0x10, 0x0, 0x0, 0x0, 0x81, 0xf, 0xb0, - 0x0, 0x0, 0x0, 0xf6, 0x1f, 0xf9, 0x0, 0x0, - 0x0, 0xf6, 0x1f, 0xaf, 0x70, 0x0, 0x0, 0xf6, - 0x1f, 0x58, 0xf4, 0x0, 0x0, 0xf6, 0x1f, 0x50, - 0xbf, 0x20, 0x0, 0xf6, 0x1f, 0x50, 0xd, 0xe1, - 0x0, 0xf6, 0x1f, 0x50, 0x1, 0xec, 0x0, 0xf6, - 0x1f, 0x50, 0x0, 0x3f, 0xa0, 0xf6, 0x1f, 0x50, - 0x0, 0x5, 0xf8, 0xf6, 0x1f, 0x50, 0x0, 0x0, - 0x8f, 0xf6, 0x1f, 0x50, 0x0, 0x0, 0xa, 0xf6, - 0xe, 0x30, 0x0, 0x0, 0x0, 0xa4, - - /* U+004F "O" */ - 0x0, 0x1, 0x8d, 0xff, 0xea, 0x30, 0x0, 0x0, - 0x2e, 0xe9, 0x66, 0x9e, 0xf6, 0x0, 0x1, 0xec, - 0x0, 0x0, 0x0, 0xaf, 0x40, 0x8, 0xf1, 0x0, - 0x0, 0x0, 0xd, 0xc0, 0xd, 0xa0, 0x0, 0x0, - 0x0, 0x7, 0xf2, 0xf, 0x70, 0x0, 0x0, 0x0, - 0x4, 0xf5, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x3, - 0xf5, 0xf, 0x70, 0x0, 0x0, 0x0, 0x4, 0xf4, - 0xe, 0xa0, 0x0, 0x0, 0x0, 0x8, 0xf2, 0x9, - 0xf2, 0x0, 0x0, 0x0, 0x1e, 0xc0, 0x2, 0xfe, - 0x30, 0x0, 0x2, 0xdf, 0x30, 0x0, 0x3e, 0xfd, - 0xaa, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x7b, 0xde, - 0xc7, 0x10, 0x0, - - /* U+0050 "P" */ - 0xb, 0xff, 0xff, 0xff, 0xeb, 0x40, 0x1, 0xfa, - 0x44, 0x44, 0x45, 0x9f, 0x50, 0x1f, 0x40, 0x0, - 0x0, 0x0, 0xac, 0x1, 0xf4, 0x0, 0x0, 0x0, - 0x6, 0xe0, 0x1f, 0x40, 0x0, 0x0, 0x0, 0x9d, - 0x1, 0xf5, 0x0, 0x0, 0x1, 0x6f, 0x70, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0x70, 0x1, 0xf7, 0x33, - 0x33, 0x32, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x1, 0x8d, 0xff, 0xd9, 0x40, 0x0, 0x0, - 0x4f, 0xe9, 0x66, 0x8d, 0xfa, 0x0, 0x2, 0xfb, - 0x0, 0x0, 0x0, 0x7f, 0x70, 0x9, 0xf0, 0x0, - 0x0, 0x0, 0xb, 0xe0, 0xe, 0x90, 0x0, 0x0, - 0x0, 0x4, 0xf3, 0xf, 0x70, 0x0, 0x0, 0x0, - 0x1, 0xf5, 0xf, 0x60, 0x0, 0x0, 0x0, 0x1, - 0xf5, 0xe, 0x90, 0x0, 0x0, 0x0, 0x3, 0xf3, - 0x9, 0xf1, 0x0, 0x0, 0x0, 0xa, 0xd0, 0x2, - 0xed, 0x30, 0x0, 0xfc, 0x8f, 0x40, 0x0, 0x2c, - 0xfc, 0x87, 0xcf, 0xf9, 0x0, 0x0, 0x0, 0x37, - 0xab, 0x97, 0xda, 0x0, - - /* U+0052 "R" */ - 0x9, 0xff, 0xff, 0xff, 0xfe, 0x80, 0xf, 0xa5, - 0x55, 0x55, 0x57, 0xf8, 0x1f, 0x40, 0x0, 0x0, - 0x0, 0x8e, 0x1f, 0x40, 0x0, 0x0, 0x0, 0x7f, - 0x1f, 0x50, 0x0, 0x0, 0x4, 0xe9, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x1f, 0x63, 0x33, 0x33, - 0x4c, 0xc0, 0x1f, 0x30, 0x0, 0x0, 0x1, 0xf5, - 0x1f, 0x30, 0x0, 0x0, 0x0, 0xe7, 0x1f, 0x30, - 0x0, 0x0, 0x0, 0xe7, 0x1f, 0x30, 0x0, 0x0, - 0x0, 0xe7, 0xd, 0x20, 0x0, 0x0, 0x0, 0xc5, - - /* U+0053 "S" */ - 0x0, 0x7, 0xce, 0xfe, 0xc7, 0x10, 0x0, 0xd, - 0xf9, 0x65, 0x57, 0xee, 0x20, 0x5, 0xf4, 0x0, - 0x0, 0x1, 0xdc, 0x0, 0x7f, 0x10, 0x0, 0x0, - 0x4, 0xf1, 0x2, 0xed, 0x51, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x7c, 0xfe, 0xb8, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x36, 0xae, 0xe4, 0x0, 0x30, 0x0, - 0x0, 0x0, 0x8, 0xf2, 0xf, 0x60, 0x0, 0x0, - 0x0, 0x1f, 0x50, 0xaf, 0x20, 0x0, 0x0, 0x5, - 0xf2, 0x1, 0xcf, 0x83, 0x22, 0x48, 0xf8, 0x0, - 0x0, 0x6c, 0xff, 0xfd, 0xa4, 0x0, - - /* U+0054 "T" */ - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x44, - 0x44, 0x7f, 0x64, 0x44, 0x40, 0x0, 0x0, 0x3, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x60, 0x0, 0x0, 0x0, - - /* U+0055 "U" */ - 0x9, 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0x50, - 0x0, 0x0, 0x0, 0xc6, 0x1f, 0x50, 0x0, 0x0, - 0x0, 0xd8, 0xf, 0x50, 0x0, 0x0, 0x0, 0xd8, - 0xf, 0x50, 0x0, 0x0, 0x0, 0xe8, 0xf, 0x50, - 0x0, 0x0, 0x0, 0xe8, 0xf, 0x50, 0x0, 0x0, - 0x0, 0xe8, 0xf, 0x50, 0x0, 0x0, 0x0, 0xe8, - 0xf, 0x50, 0x0, 0x0, 0x0, 0xe8, 0xf, 0x70, - 0x0, 0x0, 0x0, 0xf6, 0xb, 0xe1, 0x0, 0x0, - 0x6, 0xf2, 0x2, 0xee, 0x74, 0x35, 0x9f, 0x70, - 0x0, 0x19, 0xef, 0xfe, 0xa4, 0x0, - - /* U+0056 "V" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x30, - 0x0, 0x0, 0x3, 0xe2, 0xe, 0xa0, 0x0, 0x0, - 0x9, 0xf0, 0x8, 0xf0, 0x0, 0x0, 0xe, 0xa0, - 0x2, 0xf5, 0x0, 0x0, 0x4f, 0x40, 0x0, 0xcb, - 0x0, 0x0, 0x9e, 0x0, 0x0, 0x6f, 0x10, 0x0, - 0xe9, 0x0, 0x0, 0x1f, 0x60, 0x3, 0xf3, 0x0, - 0x0, 0xa, 0xc0, 0x9, 0xd0, 0x0, 0x0, 0x4, - 0xf2, 0xe, 0x80, 0x0, 0x0, 0x0, 0xe8, 0x3f, - 0x20, 0x0, 0x0, 0x0, 0x8e, 0x9c, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xa0, 0x0, 0x0, - - /* U+0057 "W" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xe3, 0x0, 0x0, 0xd1, 0x0, 0x4, 0xe0, 0xd, - 0x90, 0x0, 0x4f, 0x60, 0x0, 0x8d, 0x0, 0x9d, - 0x0, 0x7, 0xfa, 0x0, 0xc, 0xa0, 0x4, 0xf2, - 0x0, 0xaf, 0xe0, 0x0, 0xf6, 0x0, 0xf, 0x70, - 0xd, 0xbf, 0x20, 0x3f, 0x30, 0x0, 0xbb, 0x0, - 0xf4, 0xf6, 0x7, 0xf0, 0x0, 0x6, 0xf0, 0x3f, - 0x1b, 0xa0, 0xbc, 0x0, 0x0, 0x1f, 0x56, 0xe0, - 0x6e, 0xe, 0x80, 0x0, 0x0, 0xd9, 0xaa, 0x2, - 0xf4, 0xf4, 0x0, 0x0, 0x8, 0xed, 0x70, 0xe, - 0xcf, 0x10, 0x0, 0x0, 0x3f, 0xf4, 0x0, 0x9f, - 0xd0, 0x0, 0x0, 0x0, 0xef, 0x10, 0x5, 0xf9, - 0x0, 0x0, 0x0, 0x5, 0x70, 0x0, 0x8, 0x20, - 0x0, - - /* U+0058 "X" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe4, 0x0, - 0x0, 0x3, 0xe1, 0xa, 0xe1, 0x0, 0x1, 0xeb, - 0x0, 0xd, 0xc0, 0x0, 0xae, 0x10, 0x0, 0x3f, - 0x80, 0x6f, 0x40, 0x0, 0x0, 0x6f, 0x6f, 0x80, - 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, 0x0, - 0x9, 0xfd, 0x0, 0x0, 0x0, 0x5, 0xf8, 0xf9, - 0x0, 0x0, 0x2, 0xfa, 0x5, 0xf5, 0x0, 0x0, - 0xdd, 0x0, 0xa, 0xe1, 0x0, 0x9f, 0x20, 0x0, - 0xd, 0xc0, 0xe, 0x50, 0x0, 0x0, 0x3e, 0x10, - - /* U+0059 "Y" */ - 0x3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xf, 0x80, - 0x0, 0x0, 0x0, 0xbc, 0x6, 0xf4, 0x0, 0x0, - 0x7, 0xf3, 0x0, 0xae, 0x10, 0x0, 0x2f, 0x70, - 0x0, 0xd, 0xb0, 0x0, 0xdb, 0x0, 0x0, 0x3, - 0xf7, 0x8, 0xe1, 0x0, 0x0, 0x0, 0x7f, 0x7f, - 0x50, 0x0, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x60, 0x0, 0x0, - - /* U+005A "Z" */ - 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x35, - 0x55, 0x55, 0x55, 0x8f, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xd1, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0xc, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xd1, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xf7, 0x44, 0x44, 0x44, 0x44, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+005B "[" */ - 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, 0x1f, 0x83, - 0x31, 0x2f, 0x30, 0x0, 0x2f, 0x20, 0x0, 0x2f, - 0x20, 0x0, 0x2f, 0x20, 0x0, 0x2f, 0x20, 0x0, - 0x2f, 0x20, 0x0, 0x2f, 0x20, 0x0, 0x2f, 0x20, - 0x0, 0x2f, 0x20, 0x0, 0x2f, 0x20, 0x0, 0x2f, - 0x20, 0x0, 0x2f, 0x20, 0x0, 0x2f, 0x51, 0x10, - 0xd, 0xff, 0xf8, 0x0, 0x34, 0x31, - - /* U+005C "\\" */ - 0x20, 0x0, 0x0, 0x0, 0x0, 0x62, 0x0, 0x0, - 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, - 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x9, - 0x10, 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, 0x2, - - /* U+005D "]" */ - 0x0, 0x0, 0x0, 0xbf, 0xff, 0x80, 0x13, 0x4a, - 0xf0, 0x0, 0x5, 0xf0, 0x0, 0x5, 0xf0, 0x0, - 0x5, 0xf0, 0x0, 0x5, 0xf0, 0x0, 0x5, 0xf0, - 0x0, 0x5, 0xf0, 0x0, 0x5, 0xf0, 0x0, 0x5, - 0xf0, 0x0, 0x5, 0xf0, 0x0, 0x5, 0xf0, 0x0, - 0x5, 0xf0, 0x1, 0x18, 0xf0, 0xbf, 0xff, 0xb0, - 0x14, 0x42, 0x0, - - /* U+005E "^" */ - 0x0, 0x62, 0x0, 0x2, 0xfc, 0x0, 0xa, 0x58, - 0x70, 0x33, 0x0, 0x41, - - /* U+005F "_" */ - 0xbb, 0xbb, 0xbb, 0xbb, 0xa0, - - /* U+0060 "`" */ - 0x1, 0x2e, 0x2e, 0x1c, 0xb, 0xa, 0x8, 0x5, - - /* U+0061 "a" */ - 0x0, 0x19, 0xdf, 0xea, 0x30, 0x1, 0xed, 0x54, - 0x5a, 0xf2, 0x6, 0xe1, 0x0, 0x0, 0xd7, 0x0, - 0x49, 0xdf, 0xff, 0xf8, 0x6, 0xfc, 0x74, 0x33, - 0xd8, 0xe, 0xa0, 0x0, 0x0, 0xc8, 0xf, 0x60, - 0x0, 0x3, 0xf8, 0xb, 0xe5, 0x35, 0xaf, 0xf8, - 0x0, 0x8e, 0xfe, 0xb5, 0xa7, - - /* U+0062 "b" */ - 0x5, 0x10, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, - 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, 0xf, - 0x50, 0x0, 0x0, 0x0, 0xf, 0x56, 0xdf, 0xd6, - 0x0, 0xf, 0xdf, 0x85, 0xaf, 0x80, 0xf, 0xf3, - 0x0, 0x9, 0xf1, 0xf, 0xb0, 0x0, 0x1, 0xf5, - 0xf, 0x90, 0x0, 0x0, 0xf6, 0xf, 0xa0, 0x0, - 0x1, 0xf5, 0xf, 0xf1, 0x0, 0x6, 0xf1, 0xf, - 0xed, 0x53, 0x7f, 0x80, 0xf, 0x49, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - - /* U+0063 "c" */ - 0x0, 0x18, 0xdf, 0xd8, 0x0, 0x1, 0xde, 0x64, - 0x7e, 0xc0, 0x9, 0xe1, 0x0, 0x2, 0xf5, 0xe, - 0x80, 0x0, 0x0, 0x31, 0xf, 0x60, 0x0, 0x0, - 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0xc, 0xb0, - 0x0, 0x0, 0xd4, 0x5, 0xf7, 0x0, 0xa, 0xf2, - 0x0, 0x6f, 0xfd, 0xfe, 0x40, 0x0, 0x1, 0x57, - 0x50, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, - 0x1, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xf4, 0x0, - 0x3b, 0xfe, 0xa3, 0xf4, 0x3, 0xfa, 0x55, 0xaf, - 0xf4, 0xb, 0xb0, 0x0, 0x8, 0xf4, 0xf, 0x50, - 0x0, 0x1, 0xf4, 0x1f, 0x40, 0x0, 0x1, 0xf4, - 0xf, 0x50, 0x0, 0x1, 0xf4, 0xc, 0xa0, 0x0, - 0x5, 0xf4, 0x3, 0xfa, 0x43, 0x7f, 0xf4, 0x0, - 0x2c, 0xff, 0xb3, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0065 "e" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, - 0xe8, 0x0, 0x1, 0xed, 0x54, 0x8f, 0xb0, 0x9, - 0xd1, 0x0, 0x3, 0xf6, 0xd, 0x80, 0x0, 0x0, - 0xbb, 0xf, 0xff, 0xff, 0xff, 0xfd, 0xe, 0x93, - 0x33, 0x33, 0x31, 0xa, 0xd0, 0x0, 0x1, 0xb1, - 0x2, 0xfa, 0x20, 0x2c, 0xf1, 0x0, 0x3d, 0xff, - 0xfe, 0x40, 0x0, 0x0, 0x13, 0x20, 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x4a, 0xd7, 0x0, 0x4, 0xfb, 0x83, - 0x0, 0x8, 0xe0, 0x0, 0x0, 0x8, 0xd0, 0x0, - 0xd, 0xff, 0xff, 0xf7, 0x3, 0x5b, 0xd5, 0x41, - 0x0, 0x8, 0xd0, 0x0, 0x0, 0x8, 0xd0, 0x0, - 0x0, 0x8, 0xd0, 0x0, 0x0, 0x8, 0xd0, 0x0, - 0x0, 0x8, 0xd0, 0x0, 0x0, 0x8, 0xd0, 0x0, - 0x0, 0x6, 0xb0, 0x0, - - /* U+0067 "g" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, - 0xfc, 0x67, 0xf5, 0x3, 0xfb, 0x65, 0x9f, 0xf7, - 0x0, 0x9f, 0x0, 0x0, 0xbc, 0x0, 0x6, 0xf7, - 0x21, 0x5e, 0xa0, 0x0, 0xa, 0xff, 0xff, 0xc1, - 0x0, 0x2, 0xe8, 0x43, 0x10, 0x0, 0x0, 0x6f, - 0xcd, 0xff, 0xfb, 0x10, 0x5, 0xe8, 0x53, 0x35, - 0xea, 0x0, 0xf6, 0x0, 0x0, 0xb, 0xb0, 0xd, - 0xc4, 0x33, 0x48, 0xf6, 0x0, 0x18, 0xdf, 0xfe, - 0xb4, 0x0, - - /* U+0068 "h" */ - 0xe, 0x20, 0x0, 0x0, 0x0, 0xf, 0x40, 0x0, - 0x0, 0x0, 0xf, 0x40, 0x0, 0x0, 0x0, 0xf, - 0x44, 0x9a, 0x82, 0x0, 0xf, 0xde, 0xa9, 0xbf, - 0x60, 0xf, 0xd1, 0x0, 0x8, 0xf0, 0xf, 0x70, - 0x0, 0x4, 0xf1, 0xf, 0x50, 0x0, 0x3, 0xf2, - 0xf, 0x40, 0x0, 0x3, 0xf2, 0xf, 0x40, 0x0, - 0x3, 0xf2, 0xf, 0x40, 0x0, 0x3, 0xf2, 0xf, - 0x40, 0x0, 0x2, 0xe1, 0x6, 0x0, 0x0, 0x0, - 0x0, - - /* U+0069 "i" */ - 0x2, 0x1, 0xf7, 0x5, 0x10, 0x0, 0xc, 0x31, - 0xf6, 0x1f, 0x61, 0xf6, 0x1f, 0x61, 0xf6, 0x1f, - 0x61, 0xf6, 0xf, 0x50, 0x71, - - /* U+006A "j" */ - 0x0, 0x3, 0x0, 0x1, 0xf6, 0x0, 0x3, 0x0, - 0x0, 0x0, 0x0, 0xb, 0x10, 0x0, 0xf5, 0x0, - 0x1f, 0x50, 0x1, 0xf5, 0x0, 0x1f, 0x50, 0x1, - 0xf5, 0x0, 0x1f, 0x50, 0x1, 0xf5, 0x0, 0x1f, - 0x50, 0x47, 0xf4, 0x2f, 0xfc, 0x0, - - /* U+006B "k" */ - 0xe, 0x20, 0x0, 0x0, 0x1, 0xf3, 0x0, 0x0, - 0x0, 0x1f, 0x30, 0x0, 0x2, 0x1, 0xf3, 0x0, - 0x1c, 0xd0, 0x1f, 0x30, 0x2d, 0xe2, 0x1, 0xf3, - 0x3e, 0xd1, 0x0, 0x1f, 0x8f, 0xc0, 0x0, 0x1, - 0xff, 0xde, 0x20, 0x0, 0x1f, 0x70, 0xbe, 0x10, - 0x1, 0xf3, 0x0, 0xcd, 0x10, 0x1f, 0x30, 0x1, - 0xdc, 0x1, 0xf3, 0x0, 0x2, 0xea, 0x8, 0x0, - 0x0, 0x3, 0x70, - - /* U+006C "l" */ - 0x2, 0x0, 0xf3, 0xf, 0x40, 0xf4, 0xf, 0x40, - 0xf4, 0xf, 0x40, 0xf4, 0xf, 0x40, 0xf4, 0xf, - 0x40, 0xf4, 0xf, 0x40, 0x50, - - /* U+006D "m" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, - 0xcf, 0xf6, 0x4c, 0xfd, 0x60, 0xf, 0xf7, 0x28, - 0xff, 0x83, 0x8f, 0x40, 0xf6, 0x0, 0xf, 0xa0, - 0x0, 0xd8, 0xf, 0x40, 0x0, 0xe7, 0x0, 0xc, - 0x90, 0xf4, 0x0, 0xe, 0x70, 0x0, 0xc9, 0xf, - 0x40, 0x0, 0xe7, 0x0, 0xc, 0x90, 0xf4, 0x0, - 0xe, 0x70, 0x0, 0xc9, 0xf, 0x40, 0x0, 0xe7, - 0x0, 0xc, 0x90, 0xf4, 0x0, 0xd, 0x60, 0x0, - 0xa7, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+006E "n" */ - 0x2, 0x0, 0x0, 0x0, 0x0, 0xf4, 0x6c, 0xfe, - 0x90, 0x1f, 0xeb, 0x30, 0x4e, 0x91, 0xf9, 0x0, - 0x0, 0x9d, 0x1f, 0x40, 0x0, 0x7, 0xe1, 0xf4, - 0x0, 0x0, 0x7e, 0x1f, 0x40, 0x0, 0x7, 0xe1, - 0xf4, 0x0, 0x0, 0x7e, 0x1f, 0x40, 0x0, 0x7, - 0xe1, 0xf3, 0x0, 0x0, 0x6c, 0x3, 0x0, 0x0, - 0x0, 0x0, - - /* U+006F "o" */ - 0x0, 0x19, 0xef, 0xc4, 0x0, 0x1, 0xed, 0x65, - 0xaf, 0x70, 0x9, 0xd0, 0x0, 0x7, 0xf2, 0xf, - 0x60, 0x0, 0x0, 0xe7, 0x1f, 0x30, 0x0, 0x0, - 0xc8, 0xf, 0x60, 0x0, 0x0, 0xe7, 0xa, 0xd1, - 0x0, 0x7, 0xf2, 0x1, 0xed, 0x76, 0xaf, 0x70, - 0x0, 0x19, 0xef, 0xc4, 0x0, - - /* U+0070 "p" */ - 0x2, 0x0, 0x23, 0x10, 0x0, 0xf, 0x8d, 0xff, - 0xfa, 0x0, 0x1f, 0xf6, 0x0, 0x4e, 0x80, 0x1f, - 0x60, 0x0, 0x7, 0xf0, 0x1f, 0x50, 0x0, 0x3, - 0xf1, 0x1f, 0x50, 0x0, 0x3, 0xf2, 0x1f, 0x50, - 0x0, 0x5, 0xf0, 0x1f, 0xa0, 0x0, 0xa, 0xb0, - 0x1f, 0xec, 0x53, 0x8f, 0x20, 0x1f, 0x59, 0xef, - 0xb2, 0x0, 0x1f, 0x50, 0x0, 0x0, 0x0, 0xe, - 0x30, 0x0, 0x0, 0x0, - - /* U+0071 "q" */ - 0x0, 0x1, 0x42, 0x0, 0x30, 0x0, 0xaf, 0xff, - 0xd8, 0xf1, 0x8, 0xe4, 0x1, 0x6f, 0xf2, 0xf, - 0x60, 0x0, 0x6, 0xf2, 0x1f, 0x30, 0x0, 0x4, - 0xf2, 0x1f, 0x30, 0x0, 0x4, 0xf2, 0xf, 0x50, - 0x0, 0x4, 0xf2, 0xb, 0xa0, 0x0, 0xa, 0xf2, - 0x2, 0xf8, 0x35, 0xde, 0xf2, 0x0, 0x2b, 0xfe, - 0x95, 0xf2, 0x0, 0x0, 0x0, 0x4, 0xf2, 0x0, - 0x0, 0x0, 0x3, 0xd0, - - /* U+0072 "r" */ - 0x1, 0x0, 0x0, 0x0, 0xe4, 0x4b, 0xfb, 0xf, - 0xfe, 0x84, 0x20, 0xf8, 0x0, 0x0, 0xf, 0x50, - 0x0, 0x0, 0xf5, 0x0, 0x0, 0xf, 0x50, 0x0, - 0x0, 0xf5, 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, - 0xe3, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x4b, 0xff, 0xd7, 0x0, 0x6, 0xf8, 0x43, - 0x6e, 0xc0, 0xc, 0x90, 0x0, 0x2, 0xe3, 0x8, - 0xf8, 0x41, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xea, - 0x30, 0x2, 0x0, 0x0, 0x38, 0xf4, 0x2f, 0x40, - 0x0, 0x0, 0xd9, 0xb, 0xf7, 0x33, 0x4a, 0xf3, - 0x0, 0x7d, 0xff, 0xeb, 0x30, - - /* U+0074 "t" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb0, 0x0, - 0x0, 0x9, 0xc0, 0x0, 0x0, 0x9, 0xc0, 0x0, - 0xe, 0xff, 0xff, 0xf6, 0x3, 0x4b, 0xd4, 0x40, - 0x0, 0x9, 0xc0, 0x0, 0x0, 0x9, 0xc0, 0x0, - 0x0, 0x9, 0xc0, 0x0, 0x0, 0x9, 0xc0, 0x0, - 0x0, 0x9, 0xc0, 0x0, 0x0, 0x9, 0xe5, 0x51, - 0x0, 0x4, 0xef, 0xf7, - - /* U+0075 "u" */ - 0x8, 0x10, 0x0, 0x1, 0x80, 0x1f, 0x40, 0x0, - 0x4, 0xf1, 0x1f, 0x40, 0x0, 0x4, 0xf1, 0x1f, - 0x40, 0x0, 0x4, 0xf1, 0x1f, 0x40, 0x0, 0x4, - 0xf1, 0x1f, 0x40, 0x0, 0x4, 0xf1, 0x1f, 0x40, - 0x0, 0x5, 0xf1, 0xf, 0x50, 0x0, 0xb, 0xf1, - 0xc, 0xd4, 0x24, 0xbe, 0xf1, 0x1, 0x8d, 0xfe, - 0x83, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0076 "v" */ - 0x3, 0x0, 0x0, 0x0, 0x11, 0xf, 0x50, 0x0, - 0x0, 0xda, 0xc, 0xd0, 0x0, 0x4, 0xf5, 0x5, - 0xf4, 0x0, 0xa, 0xe0, 0x0, 0xdb, 0x0, 0x1f, - 0x70, 0x0, 0x6f, 0x20, 0x7f, 0x10, 0x0, 0xe, - 0x80, 0xe9, 0x0, 0x0, 0x8, 0xe5, 0xf2, 0x0, - 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x7e, - 0x20, 0x0, - - /* U+0077 "w" */ - 0xa, 0x10, 0x0, 0x17, 0x0, 0x0, 0x74, 0xe, - 0x90, 0x0, 0x8f, 0x10, 0x0, 0xf6, 0x8, 0xf0, - 0x0, 0xdf, 0x60, 0x6, 0xf1, 0x2, 0xf5, 0x1, - 0xfc, 0xb0, 0xb, 0xb0, 0x0, 0xcb, 0x6, 0xd6, - 0xf0, 0x1f, 0x50, 0x0, 0x6f, 0x1b, 0x81, 0xf5, - 0x6e, 0x0, 0x0, 0x1f, 0x8f, 0x30, 0xca, 0xc9, - 0x0, 0x0, 0xa, 0xfe, 0x0, 0x7f, 0xf3, 0x0, - 0x0, 0x4, 0xf9, 0x0, 0x2f, 0xd0, 0x0, 0x0, - 0x0, 0x71, 0x0, 0x5, 0x30, 0x0, - - /* U+0078 "x" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0x0, 0x0, - 0xc5, 0x7, 0xf5, 0x0, 0xaf, 0x20, 0xb, 0xf2, - 0x7f, 0x50, 0x0, 0x1d, 0xdf, 0xa0, 0x0, 0x0, - 0x3f, 0xe0, 0x0, 0x0, 0xa, 0xff, 0x50, 0x0, - 0x6, 0xf6, 0xaf, 0x20, 0x2, 0xfa, 0x1, 0xec, - 0x0, 0xdc, 0x0, 0x3, 0xf8, 0x6, 0x10, 0x0, - 0x4, 0x40, - - /* U+0079 "y" */ - 0xb, 0x20, 0x0, 0x0, 0xa6, 0xd, 0xb0, 0x0, - 0x3, 0xf4, 0x5, 0xf3, 0x0, 0xb, 0xd0, 0x0, - 0xdb, 0x0, 0x3f, 0x50, 0x0, 0x5f, 0x30, 0xae, - 0x0, 0x0, 0xd, 0xb2, 0xf7, 0x0, 0x0, 0x5, - 0xfc, 0xe0, 0x0, 0x0, 0x0, 0xdf, 0x80, 0x0, - 0x0, 0x0, 0x8f, 0x10, 0x0, 0x0, 0x56, 0xf9, - 0x0, 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, - - /* U+007A "z" */ - 0xd, 0xff, 0xff, 0xff, 0x90, 0x2, 0x44, 0x44, - 0xdf, 0x40, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, - 0x0, 0x4f, 0x70, 0x0, 0x0, 0x3, 0xf9, 0x0, - 0x0, 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x1, 0xec, - 0x0, 0x0, 0x0, 0xb, 0xf7, 0x55, 0x55, 0x40, - 0xd, 0xff, 0xff, 0xff, 0xf2, - - /* U+007B "{" */ - 0x0, 0x17, 0x0, 0xd, 0x20, 0x3, 0xe0, 0x0, - 0x4f, 0x0, 0x2, 0xf0, 0x0, 0xf, 0x20, 0x0, - 0xe0, 0x0, 0x47, 0x0, 0x66, 0x0, 0x1, 0x73, - 0x0, 0x0, 0xd0, 0x0, 0xf, 0x10, 0x1, 0xf1, - 0x0, 0x3f, 0x0, 0x4, 0xe0, 0x0, 0x2f, 0x0, - 0x0, 0x79, 0x0, 0x0, 0x20, - - /* U+007C "|" */ - 0x33, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, - 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, - 0x76, 0x76, - - /* U+007D "}" */ - 0x18, 0x0, 0x0, 0x5a, 0x0, 0x2, 0xf0, 0x0, - 0x2f, 0x10, 0x4, 0xf0, 0x0, 0x5c, 0x0, 0x2, - 0xc0, 0x0, 0xa, 0x10, 0x0, 0x8, 0x40, 0x6, - 0x50, 0x1, 0xb0, 0x0, 0x4c, 0x0, 0x4, 0xe0, - 0x0, 0x2f, 0x0, 0x1, 0xf1, 0x0, 0x3e, 0x0, - 0xb, 0x40, 0x1, 0x10, 0x0, - - /* U+007E "~" */ - 0x0, 0x0, 0x0, 0x0, 0x5e, 0x81, 0x27, 0x29, - 0x4a, 0xfc, 0x11, 0x0, 0x2, 0x0, - - /* U+4E2D "中" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x13, 0x44, 0x44, 0xaf, 0x44, 0x44, - 0x43, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x7, 0xf4, 0x33, 0x33, 0xae, 0x33, - 0x33, 0x39, 0xf0, 0x8e, 0x0, 0x0, 0x9, 0xe0, - 0x0, 0x0, 0x6f, 0x18, 0xe0, 0x0, 0x0, 0x9e, - 0x0, 0x0, 0x6, 0xf1, 0x8e, 0x0, 0x0, 0x9, - 0xe0, 0x0, 0x0, 0x6f, 0x18, 0xe0, 0x0, 0x0, - 0x9e, 0x0, 0x0, 0x6, 0xf1, 0x8e, 0x0, 0x0, - 0x9, 0xe0, 0x0, 0x0, 0x6f, 0x7, 0xf5, 0x44, - 0x44, 0xaf, 0x44, 0x44, 0x4b, 0xf0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2, - 0x22, 0x22, 0x9e, 0x22, 0x22, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+4EAE "亮" */ - 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, - 0x3, 0x55, 0x55, 0x55, 0xec, 0x55, 0x55, 0x55, - 0x40, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, - 0xe8, 0x0, 0x0, 0xc, 0xa3, 0x33, 0x33, 0x33, - 0x38, 0xf0, 0x0, 0x0, 0xd9, 0x33, 0x33, 0x33, - 0x33, 0x8f, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x11, 0x11, - 0x11, 0x11, 0x0, 0x0, 0x4, 0xbc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xba, 0x40, 0xcd, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0xcd, 0xd, 0x80, 0x1, - 0xef, 0xff, 0xe4, 0x0, 0xa, 0xb0, 0x95, 0x0, - 0x5f, 0x52, 0x3f, 0x70, 0x0, 0x84, 0x0, 0x0, - 0xc, 0xd0, 0x0, 0xe7, 0x0, 0x3, 0xe0, 0x0, - 0x1b, 0xf4, 0x0, 0xd, 0xd6, 0x44, 0xbf, 0x3, - 0xbf, 0xf5, 0x0, 0x0, 0x4c, 0xff, 0xfe, 0x60, - 0x6b, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5165 "入" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xfd, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xf3, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0x90, 0xcc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0x20, 0x6f, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xe8, 0x0, 0xe, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xd0, 0x0, 0x7, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x30, 0x0, - 0x0, 0xde, 0x20, 0x0, 0x0, 0x9, 0xf5, 0x0, - 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0xaf, 0x60, - 0x0, 0x0, 0x0, 0x6, 0xfa, 0x0, 0x1c, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x90, 0x8e, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x41, - - /* U+5173 "关" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x80, 0x0, 0x0, 0x0, 0x3e, - 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, - 0xdd, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x80, 0x0, - 0x8, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf2, - 0x0, 0x4f, 0x80, 0x0, 0x0, 0x1, 0x55, 0x56, - 0xf9, 0x55, 0xbe, 0x55, 0x55, 0x20, 0x7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x66, 0x66, 0x67, 0xf9, 0x66, 0x66, - 0x66, 0x50, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xd, 0xbe, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0x25, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xf9, 0x0, 0x9e, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xb0, 0x0, 0x9, 0xf8, 0x0, 0x0, 0x0, - 0x8, 0xfb, 0x0, 0x0, 0x0, 0x5e, 0xf9, 0x30, - 0x7, 0xef, 0x70, 0x0, 0x0, 0x0, 0x1, 0x7d, - 0xe0, 0x2f, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5207 "切" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd2, 0x0, 0x2, 0x44, 0x44, 0x44, - 0x30, 0x0, 0x1f, 0x40, 0x1, 0xff, 0xff, 0xff, - 0xff, 0xa0, 0x1, 0xf4, 0x0, 0x1, 0x11, 0xe9, - 0x11, 0x9e, 0x2, 0x5f, 0x76, 0x78, 0x50, 0xe, - 0x80, 0x5, 0xf0, 0xff, 0xff, 0xed, 0xc7, 0x0, - 0xf7, 0x0, 0x5f, 0x1, 0x3f, 0x20, 0x0, 0x0, - 0xf, 0x60, 0x6, 0xf0, 0x3, 0xf2, 0x0, 0x0, - 0x1, 0xf5, 0x0, 0x6e, 0x0, 0x3f, 0x10, 0x0, - 0x0, 0x3f, 0x30, 0x7, 0xe0, 0x4, 0xf1, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0x8d, 0x0, 0x5f, 0x10, - 0x4, 0xb0, 0xdb, 0x0, 0x9, 0xc0, 0x5, 0xf4, - 0x7d, 0xfa, 0x6f, 0x50, 0x0, 0xba, 0x0, 0x3f, - 0xff, 0x93, 0x4f, 0xb0, 0x0, 0xd, 0x80, 0x0, - 0x22, 0x1, 0x8f, 0xa0, 0x0, 0x1, 0xf4, 0x0, - 0x3, 0x8c, 0xfd, 0x40, 0x59, 0x77, 0xde, 0x0, - 0x0, 0xcd, 0x94, 0x0, 0x4, 0xcf, 0xfc, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+58F0 "声" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x33, 0x33, 0x33, 0x7f, 0x33, - 0x33, 0x33, 0x20, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, - 0x44, 0x8f, 0x44, 0x44, 0x42, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x1, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x4f, 0x10, 0x0, 0x4f, 0x0, 0x0, - 0x5f, 0x0, 0x0, 0x4f, 0x0, 0x0, 0x4f, 0x0, - 0x0, 0x5f, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x0, 0x6f, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x30, 0x0, 0x0, 0x8d, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xca, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1d, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5C4F "屏" */ - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0xf8, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x4f, 0x40, 0x0, 0xf5, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x2f, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0xf5, 0x11, 0xe6, - 0x11, 0x11, 0x1b, 0x90, 0x0, 0x0, 0xf4, 0x0, - 0x7f, 0x50, 0x0, 0x5f, 0x20, 0x0, 0x1, 0xf3, - 0x3, 0x3b, 0xe3, 0x35, 0xf9, 0x33, 0x0, 0x1, - 0xf3, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x1, 0xf2, 0x0, 0x4, 0xf0, 0x0, 0xf, 0x40, - 0x0, 0x2, 0xf2, 0x0, 0x5, 0xe0, 0x0, 0xf, - 0x40, 0x0, 0x4, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x7, 0xe0, 0x22, 0x2c, 0xa2, - 0x22, 0x2f, 0x62, 0x20, 0xa, 0xa0, 0x0, 0x2f, - 0x40, 0x0, 0xf, 0x40, 0x0, 0xf, 0x60, 0x0, - 0xcb, 0x0, 0x0, 0xf, 0x40, 0x0, 0x5f, 0x10, - 0x9, 0xe1, 0x0, 0x0, 0xf, 0x40, 0x0, 0x13, - 0x0, 0x2e, 0x30, 0x0, 0x0, 0xf, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+5E55 "幕" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x5, 0xa0, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x1f, 0x41, 0x11, - 0x17, 0xc1, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xe6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9b, 0x0, 0x0, 0xfd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xeb, 0x0, 0x0, - 0xe7, 0x33, 0x33, 0x33, 0x33, 0x33, 0xab, 0x0, - 0x0, 0xaf, 0xee, 0xee, 0xee, 0xee, 0xee, 0xf8, - 0x0, 0x0, 0x3, 0x33, 0xcd, 0x33, 0x33, 0x33, - 0x30, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe1, 0x0, 0x13, 0xde, 0x31, 0xb6, - 0x11, 0xbe, 0x51, 0x0, 0x0, 0x7e, 0xf8, 0x44, - 0xda, 0x44, 0x5f, 0xfb, 0x30, 0x4e, 0xff, 0xcc, - 0xcc, 0xfd, 0xcc, 0xcd, 0xfe, 0xf4, 0x36, 0x6e, - 0x0, 0x0, 0xd7, 0x0, 0x0, 0xf4, 0x0, 0x0, - 0x6e, 0x0, 0x0, 0xd7, 0x2, 0x31, 0xf4, 0x0, - 0x0, 0x39, 0x0, 0x0, 0xd7, 0x7, 0xef, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+5EA6 "度" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x6f, 0x42, - 0x22, 0x22, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb0, 0x1, 0xf5, 0x16, 0xe1, - 0x11, 0x11, 0x6e, 0x11, 0x0, 0x2, 0xf5, 0x48, - 0xf4, 0x44, 0x44, 0x8e, 0x44, 0x30, 0x2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x2, - 0xf1, 0x5, 0xe0, 0x0, 0x0, 0x5e, 0x0, 0x0, - 0x2, 0xf1, 0x4, 0xf6, 0x55, 0x55, 0xbc, 0x0, - 0x0, 0x2, 0xf1, 0x0, 0xae, 0xee, 0xee, 0xc5, - 0x0, 0x0, 0x2, 0xf1, 0x14, 0x44, 0x44, 0x44, - 0x44, 0x20, 0x0, 0x3, 0xf0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x4, 0xf0, 0x3, 0x30, - 0x0, 0x0, 0xc, 0xe0, 0x0, 0x6, 0xe0, 0x6, - 0xfa, 0x10, 0x2, 0xce, 0x20, 0x0, 0xa, 0xb0, - 0x0, 0x3c, 0xf7, 0x8f, 0xc1, 0x0, 0x0, 0xe, - 0x70, 0x0, 0x1, 0xcf, 0xfe, 0x50, 0x0, 0x0, - 0x1e, 0x23, 0x79, 0xdf, 0xd8, 0x5b, 0xff, 0xc8, - 0x50, 0x0, 0x1f, 0xeb, 0x72, 0x0, 0x0, 0x15, - 0x9c, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+6309 "按" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd2, 0x0, 0x0, 0xf, 0x40, 0x0, - 0x0, 0x0, 0xf, 0x40, 0x2, 0x22, 0xea, 0x22, - 0x20, 0x0, 0x0, 0xf4, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x1f, 0x50, 0xea, 0x66, 0x66, - 0x66, 0x7f, 0x70, 0xdf, 0xff, 0x9e, 0x50, 0x1a, - 0x0, 0x0, 0xe5, 0x2, 0x3f, 0x71, 0xd4, 0x6, - 0xf0, 0x0, 0x1f, 0x20, 0x0, 0xf4, 0x1, 0x11, - 0xcb, 0x11, 0x11, 0x20, 0x0, 0xf, 0x40, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf9, 0x82, - 0x3b, 0xd3, 0x33, 0xcb, 0x31, 0x3, 0x8f, 0xf6, - 0x3, 0xf4, 0x0, 0xf, 0x50, 0x2, 0xfc, 0xf4, - 0x0, 0xca, 0x0, 0x7, 0xe0, 0x0, 0x0, 0xf, - 0x40, 0xf, 0xb2, 0x2, 0xf7, 0x0, 0x0, 0x0, - 0xf4, 0x0, 0x3b, 0xfb, 0xeb, 0x0, 0x0, 0x0, - 0xf, 0x40, 0x0, 0x1b, 0xff, 0xe7, 0x0, 0x0, - 0x67, 0xf3, 0x15, 0xaf, 0xc4, 0x18, 0xfe, 0x81, - 0xc, 0xfb, 0x1f, 0xfa, 0x40, 0x0, 0x1, 0x8f, - 0xc0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x1, - - /* U+6362 "换" */ - 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6a, 0x0, 0x8, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x6b, 0x0, 0x4f, 0x93, 0x33, - 0xec, 0x0, 0x0, 0x0, 0x6b, 0x3, 0xf9, 0x0, - 0x8, 0xf3, 0x0, 0x0, 0x2c, 0xde, 0xb9, 0x60, - 0x0, 0x5f, 0x50, 0x0, 0x0, 0x17, 0xbd, 0x60, - 0x14, 0x46, 0xfa, 0x44, 0x40, 0x0, 0x0, 0x6b, - 0x0, 0xfe, 0xdd, 0xfe, 0xdd, 0xeb, 0x0, 0x0, - 0x6b, 0x2, 0xf0, 0x0, 0xf5, 0x0, 0x4e, 0x0, - 0x0, 0x6b, 0x63, 0xf0, 0x0, 0xf4, 0x0, 0x3f, - 0x0, 0x1, 0x9f, 0xc3, 0xf0, 0x1, 0xf3, 0x0, - 0x3f, 0x0, 0x3f, 0xec, 0x16, 0xf4, 0x46, 0xf6, - 0x44, 0x7f, 0x40, 0x1, 0x6b, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x6b, 0x0, 0x0, - 0xb, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x6b, 0x0, - 0x0, 0x5f, 0x4b, 0xd1, 0x0, 0x0, 0x0, 0x6b, - 0x0, 0x6, 0xf7, 0x0, 0xce, 0x40, 0x0, 0x6, - 0xaa, 0x18, 0xef, 0x50, 0x0, 0xa, 0xfb, 0x30, - 0xc, 0xf6, 0x7d, 0x71, 0x0, 0x0, 0x0, 0x4c, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, - - /* U+6587 "文" */ - 0x0, 0x0, 0x0, 0x1, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x66, 0x66, 0x66, 0xcc, 0x66, - 0x66, 0x66, 0x61, 0x1e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xda, 0x0, - 0x0, 0x0, 0x3f, 0x40, 0x0, 0x0, 0x0, 0x8e, - 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0x50, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xc0, 0x0, 0x7, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xf5, 0x0, 0x1f, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbe, 0x20, 0xce, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xdc, 0xe2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, - 0xcd, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, - 0xe6, 0x0, 0xaf, 0xd5, 0x0, 0x0, 0x18, 0xdf, - 0xf8, 0x10, 0x0, 0x5, 0xef, 0xd7, 0x10, 0x4f, - 0xc6, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x70, - - /* U+65CB "旋" */ - 0x0, 0x5, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0x70, 0x0, 0xb9, 0x11, 0x11, - 0x11, 0x0, 0x4, 0x5b, 0xe5, 0x32, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0xd, 0xff, 0xff, 0xec, 0xd4, - 0x44, 0x44, 0x44, 0x20, 0x0, 0x9b, 0x0, 0xbf, - 0x65, 0x55, 0x55, 0x54, 0x0, 0x0, 0x9b, 0x1, - 0xc3, 0x9d, 0xdf, 0xed, 0xdf, 0x50, 0x0, 0x9f, - 0xec, 0x10, 0x0, 0xe, 0x50, 0x2f, 0x30, 0x0, - 0xad, 0x8f, 0x40, 0x93, 0xe, 0x51, 0xeb, 0x0, - 0x0, 0xba, 0xe, 0x50, 0xe7, 0xe, 0x51, 0x80, - 0x0, 0x0, 0xd8, 0xf, 0x50, 0xf7, 0xe, 0x84, - 0x43, 0x0, 0x0, 0xf5, 0xf, 0x40, 0xf8, 0xe, - 0xff, 0xff, 0x50, 0x3, 0xf2, 0x1f, 0x34, 0xfc, - 0xe, 0x60, 0x0, 0x0, 0x7, 0xf0, 0x2f, 0x28, - 0xdf, 0x2e, 0x50, 0x0, 0x0, 0xc, 0xa0, 0x5f, - 0xd, 0x89, 0xbe, 0x50, 0x0, 0x0, 0x3f, 0x55, - 0xcc, 0x4f, 0x30, 0xdf, 0xa8, 0x77, 0x60, 0x5c, - 0x2f, 0xe4, 0xbc, 0x0, 0x7, 0xce, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x62, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+6B65 "步" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x6f, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x6f, - 0x77, 0x77, 0x61, 0x0, 0x0, 0x0, 0xe8, 0x0, - 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xe8, - 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, - 0xe9, 0x11, 0x7f, 0x11, 0x11, 0x11, 0x10, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0x3, 0x44, 0x45, 0x44, 0x9f, 0x44, 0x44, 0x44, - 0x30, 0x0, 0x0, 0x9e, 0x0, 0x6f, 0x0, 0x0, - 0x26, 0x0, 0x0, 0x3, 0xf8, 0x0, 0x6f, 0x0, - 0x0, 0xbd, 0x0, 0x0, 0x1d, 0xd0, 0x0, 0x6f, - 0x0, 0x3, 0xf7, 0x0, 0x2, 0xde, 0x20, 0x0, - 0x6f, 0x0, 0x1d, 0xd0, 0x0, 0xe, 0xe3, 0x0, - 0x0, 0x3a, 0x3, 0xde, 0x20, 0x0, 0x7, 0x10, - 0x0, 0x0, 0x3, 0xaf, 0xf3, 0x0, 0x0, 0x0, - 0x4, 0x67, 0x8a, 0xef, 0xfb, 0x20, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xfd, 0xa7, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8282 "节" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x8, 0x80, - 0x0, 0x0, 0x0, 0x0, 0xe, 0x60, 0x0, 0xa, - 0xa0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x4, 0x55, 0x5e, 0x95, - 0x55, 0x5c, 0xc5, 0x55, 0x40, 0x0, 0x0, 0xc, - 0x50, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, 0x23, - 0x33, 0x33, 0x33, 0x34, 0x41, 0x0, 0x0, 0x2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x0, 0x1, 0x11, 0x3f, 0x41, 0x11, 0x19, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, 0x0, 0x6, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, 0x0, - 0x6, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, - 0x0, 0x6, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0x30, 0x0, 0x6, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0x30, 0x12, 0x2c, 0xd0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0x30, 0xaf, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0x30, 0x3, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, - 0x0, 0x0, - - /* U+82F1 "英" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xd0, 0x0, 0x1, 0xd0, - 0x0, 0x0, 0x2, 0x44, 0x47, 0xf4, 0x44, 0x46, - 0xf4, 0x44, 0x30, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x3, 0xf0, - 0x22, 0x2, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x30, 0xaa, 0x0, 0x40, 0x0, 0x0, 0x0, 0xb, - 0xee, 0xee, 0xff, 0xee, 0xee, 0xa0, 0x0, 0x0, - 0x4f, 0x44, 0x44, 0xcb, 0x44, 0x45, 0xf4, 0x0, - 0x0, 0x5f, 0x0, 0x0, 0xb8, 0x0, 0x0, 0xf5, - 0x0, 0x0, 0x5f, 0x0, 0x0, 0xd7, 0x0, 0x0, - 0xf5, 0x0, 0x0, 0x5f, 0x0, 0x0, 0xf5, 0x0, - 0x0, 0xf5, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x3, 0x33, 0x33, 0x5f, - 0x9d, 0xc3, 0x33, 0x33, 0x30, 0x0, 0x0, 0x2, - 0xdc, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xb1, 0x0, 0x6f, 0x70, 0x0, 0x0, 0x2, - 0x8e, 0xe6, 0x0, 0x0, 0x7, 0xfb, 0x30, 0x0, - 0x1f, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xfd, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x49, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+89D2 "角" */ - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x4f, 0x83, 0x33, 0x33, 0x6f, 0x60, - 0x0, 0x0, 0x4f, 0xa3, 0x33, 0x33, 0x4e, 0xc3, - 0x20, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0xa, 0x8f, 0x30, 0x0, 0x3f, 0x10, - 0x0, 0x2f, 0x30, 0x3, 0xf1, 0x0, 0x3, 0xf1, - 0x0, 0x0, 0xf4, 0x0, 0x3f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x3, 0xf4, 0x44, 0x46, - 0xf5, 0x44, 0x44, 0xf4, 0x0, 0x4f, 0x0, 0x0, - 0x3f, 0x10, 0x0, 0xf, 0x40, 0x5, 0xf0, 0x0, - 0x3, 0xf1, 0x0, 0x0, 0xf4, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xa, 0xc4, - 0x44, 0x46, 0xf5, 0x44, 0x44, 0xf4, 0x1, 0xf6, - 0x0, 0x0, 0x3f, 0x10, 0x0, 0xf, 0x40, 0x9e, - 0x0, 0x0, 0x3, 0xf1, 0x0, 0x0, 0xf4, 0x3f, - 0x50, 0x0, 0x0, 0x1c, 0x3, 0x65, 0x6f, 0x31, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xb0, - - /* U+8BF1 "诱" */ - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x15, 0xb9, - 0x0, 0x4, 0xf4, 0x0, 0x24, 0x57, 0x9d, 0xff, - 0xe6, 0x0, 0x0, 0x8f, 0x30, 0xbe, 0xdb, 0xcf, - 0x63, 0x0, 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, - 0x6e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0xdd, - 0xdd, 0xef, 0xdd, 0xdd, 0x90, 0x2, 0x20, 0x0, - 0x56, 0x6c, 0xff, 0xf7, 0x66, 0x30, 0x6f, 0xfe, - 0x10, 0x0, 0x9e, 0xae, 0xcd, 0x30, 0x0, 0x1, - 0x3f, 0x40, 0x5d, 0xd2, 0x6e, 0x9, 0xfa, 0x30, - 0x0, 0xe, 0x5a, 0xf8, 0x0, 0x39, 0x0, 0x3b, - 0xf2, 0x0, 0xf, 0x52, 0x4d, 0xee, 0xee, 0xee, - 0x60, 0x0, 0x0, 0xf, 0x40, 0x5, 0x6e, 0xb6, - 0x7f, 0x80, 0x0, 0x0, 0xf, 0x40, 0x0, 0xf, - 0x50, 0x4f, 0x82, 0x0, 0x0, 0xf, 0x40, 0x0, - 0x5f, 0x10, 0x6f, 0xff, 0x10, 0x0, 0xf, 0x49, - 0x80, 0xdb, 0x0, 0x0, 0x3f, 0x20, 0x0, 0x1f, - 0xee, 0x2a, 0xf2, 0x0, 0x0, 0x5f, 0x0, 0x0, - 0x7f, 0xc2, 0xbf, 0x30, 0x5, 0x56, 0xda, 0x0, - 0x0, 0x13, 0x3, 0xd3, 0x0, 0x1d, 0xff, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8C03 "调" */ - 0x0, 0xd7, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, - 0x60, 0x4, 0xea, 0x3, 0xf5, 0x45, 0xf6, 0x44, - 0xad, 0x0, 0x1, 0xa2, 0x4f, 0x0, 0x2f, 0x30, - 0x6, 0xe0, 0x0, 0x0, 0x4, 0xf2, 0xef, 0xff, - 0xf5, 0x6e, 0x1e, 0xfd, 0x10, 0x4f, 0x4, 0x5f, - 0x64, 0x6, 0xe0, 0x78, 0xf4, 0x4, 0xf1, 0x46, - 0xf7, 0x43, 0x6e, 0x0, 0xf, 0x40, 0x4f, 0x5e, - 0xff, 0xff, 0xc6, 0xe0, 0x0, 0xf4, 0x4, 0xf0, - 0x0, 0x0, 0x0, 0x6e, 0x0, 0xf, 0x40, 0x5f, - 0x8, 0xff, 0xea, 0x6, 0xe0, 0x0, 0xf4, 0x5, - 0xe0, 0xe8, 0x46, 0xf2, 0x6e, 0x0, 0xf, 0x40, - 0x6d, 0xe, 0x30, 0x1f, 0x26, 0xe0, 0x0, 0xf5, - 0xe9, 0xb0, 0xe9, 0x57, 0xf2, 0x6e, 0x0, 0xf, - 0xec, 0xc8, 0x7, 0xef, 0xea, 0x6, 0xe0, 0x1, - 0xfe, 0x4f, 0x40, 0x0, 0x0, 0x0, 0x6e, 0x0, - 0x2c, 0x37, 0xe0, 0x0, 0x0, 0x48, 0x8d, 0xd0, - 0x0, 0x0, 0x33, 0x0, 0x0, 0x7, 0xff, 0xe4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+8F6C "转" */ - 0x0, 0x5, 0x30, 0x0, 0x0, 0x3, 0x60, 0x0, - 0x0, 0x0, 0xc, 0x70, 0x0, 0x0, 0x9, 0xc0, - 0x0, 0x0, 0x2, 0x3f, 0x73, 0x30, 0x0, 0xb, - 0xa0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf6, 0xdf, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x6d, 0x0, 0x0, - 0x24, 0x5f, 0x74, 0x43, 0x0, 0x0, 0xb9, 0x67, - 0x0, 0x0, 0x4f, 0x0, 0x0, 0x0, 0x0, 0xf4, - 0x9a, 0xd, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x5, - 0xf1, 0x9a, 0x3, 0x44, 0xea, 0x44, 0x44, 0x40, - 0xc, 0xff, 0xff, 0xf7, 0x1, 0xf4, 0x0, 0x0, - 0x0, 0x3, 0x56, 0xbc, 0x51, 0x9, 0xf6, 0x55, - 0x51, 0x0, 0x0, 0x0, 0x9a, 0x0, 0xd, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x9d, 0xae, 0x20, - 0x0, 0x0, 0xda, 0x0, 0x5, 0x9c, 0xff, 0xb5, - 0x1, 0x0, 0x3, 0xf3, 0x0, 0x2d, 0xb7, 0xba, - 0x0, 0x4f, 0xc5, 0xc, 0xb0, 0x0, 0x0, 0x0, - 0x9a, 0x0, 0x2, 0x9f, 0xef, 0x20, 0x0, 0x0, - 0x0, 0x9a, 0x0, 0x0, 0x1, 0x8f, 0xd3, 0x0, - 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x1, 0xab, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8FDB "进" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, 0xd, 0x20, - 0x0, 0xb, 0x70, 0x0, 0x4, 0xf2, 0x2, 0xf4, - 0x0, 0x0, 0x4f, 0x90, 0x0, 0x4f, 0x20, 0x2f, - 0x40, 0x0, 0x0, 0x3e, 0x90, 0x4, 0xf2, 0x2, - 0xf4, 0x0, 0x0, 0x0, 0x25, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x0, 0x0, 0x1, 0x69, 0xf8, - 0x67, 0xf9, 0x61, 0x4, 0x77, 0x40, 0x0, 0x4f, - 0x20, 0x2f, 0x40, 0x0, 0x9e, 0xff, 0x20, 0x4, - 0xf2, 0x2, 0xf4, 0x0, 0x0, 0x3, 0xf4, 0x68, - 0xaf, 0x98, 0x9f, 0xa7, 0x30, 0x0, 0x2f, 0x4d, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2, 0xf4, - 0x0, 0x9d, 0x0, 0x2f, 0x40, 0x0, 0x0, 0x2f, - 0x40, 0x2f, 0x60, 0x2, 0xf4, 0x0, 0x0, 0x8, - 0xf6, 0x2d, 0xc0, 0x0, 0x2f, 0x40, 0x0, 0x6, - 0xfb, 0xed, 0xb1, 0x0, 0x1, 0xf3, 0x0, 0x7, - 0xf6, 0x9, 0xfa, 0x65, 0x44, 0x47, 0x55, 0x50, - 0x65, 0x0, 0x3, 0xbe, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, - 0x0, - - /* U+952E "键" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0xc4, - 0x0, 0x0, 0x0, 0x8d, 0x0, 0x69, 0x70, 0x0, - 0xe6, 0x0, 0x0, 0x0, 0xdf, 0xfc, 0x7e, 0xe3, - 0xef, 0xff, 0xfc, 0x0, 0x3, 0xf6, 0x42, 0xb, - 0xa0, 0x34, 0xf8, 0x6f, 0x20, 0xa, 0xe0, 0x0, - 0xf, 0x41, 0x33, 0xe7, 0x4f, 0x50, 0x2f, 0xd9, - 0x95, 0x5e, 0xd, 0xff, 0xff, 0xff, 0xf5, 0x5c, - 0xbf, 0x85, 0xba, 0x0, 0x0, 0xe6, 0x1f, 0x30, - 0x0, 0x5f, 0x0, 0xef, 0xf8, 0xde, 0xff, 0xff, - 0x10, 0x5, 0x9f, 0x64, 0x12, 0xab, 0x24, 0xf8, - 0x31, 0x0, 0xf, 0xff, 0xff, 0xa2, 0x8a, 0x24, - 0xf8, 0x44, 0x0, 0x0, 0x5f, 0x0, 0xb9, 0xb8, - 0xcf, 0xff, 0xff, 0x30, 0x0, 0x5f, 0x0, 0x6e, - 0xe4, 0x0, 0xe6, 0x0, 0x0, 0x0, 0x5f, 0x2, - 0xe, 0xf5, 0xff, 0xff, 0xff, 0x70, 0x0, 0x5f, - 0xae, 0x3f, 0xf4, 0x33, 0xf8, 0x33, 0x0, 0x0, - 0x8f, 0xd6, 0xea, 0x8f, 0xc7, 0xd6, 0x33, 0x31, - 0x0, 0x58, 0x4f, 0xa0, 0x4, 0x9c, 0xef, 0xff, - 0xf7, 0x0, 0x0, 0x57, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+95ED "闭" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0x80, 0x7, 0xff, 0xff, 0xff, 0xb0, - 0x27, 0x5, 0xf6, 0x1, 0x44, 0x44, 0x45, 0xf4, - 0x6e, 0x0, 0x53, 0x0, 0x5, 0x10, 0x0, 0xf5, - 0x6e, 0x0, 0x0, 0x0, 0xe, 0x60, 0x0, 0xf5, - 0x6e, 0x0, 0x0, 0x0, 0xe, 0x70, 0x0, 0xf5, - 0x6e, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf5, - 0x6e, 0x2, 0x33, 0x37, 0xff, 0x83, 0x20, 0xf5, - 0x6e, 0x0, 0x0, 0xd, 0xbe, 0x60, 0x0, 0xf5, - 0x6e, 0x0, 0x0, 0xaf, 0x2e, 0x60, 0x0, 0xf5, - 0x6e, 0x0, 0xa, 0xf4, 0xe, 0x60, 0x0, 0xf5, - 0x6e, 0x2, 0xbf, 0x40, 0xe, 0x60, 0x0, 0xf5, - 0x6e, 0x1f, 0xc2, 0x0, 0xe, 0x60, 0x0, 0xf5, - 0x6e, 0x2, 0x0, 0x2a, 0x8f, 0x50, 0x0, 0xf5, - 0x6e, 0x0, 0x0, 0x1a, 0xca, 0x10, 0x0, 0xf5, - 0x5e, 0x0, 0x0, 0x0, 0x0, 0x5, 0x67, 0xf4, - 0x2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+97F3 "音" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x23, 0x33, 0x33, 0xdb, 0x33, - 0x33, 0x32, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x23, 0x7f, 0x63, - 0x33, 0x38, 0xf4, 0x32, 0x0, 0x0, 0x0, 0xe, - 0x80, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x0, 0x11, - 0x19, 0xe1, 0x11, 0x1f, 0x91, 0x11, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x40, 0x0, 0x1, 0x56, 0x66, 0x66, 0x66, 0x54, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xb0, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0x0, 0x3f, 0x75, 0x55, - 0x55, 0x55, 0x59, 0xf1, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x3f, - 0x31, 0x11, 0x11, 0x11, 0x16, 0xf1, 0x0, 0x0, - 0x2f, 0x95, 0x55, 0x55, 0x55, 0x5a, 0xf0, 0x0, - 0x0, 0x8, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x70, - 0x0, - - /* U+9A97 "骗" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x20, 0x0, - 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0xa, 0xe1, - 0x0, 0x0, 0x2, 0x44, 0x8f, 0x0, 0xcf, 0xff, - 0xff, 0xfe, 0x20, 0x0, 0xa1, 0x4f, 0x2, 0xf3, - 0x0, 0x0, 0xf, 0x60, 0x1, 0xf2, 0x4f, 0x2, - 0xfe, 0xee, 0xee, 0xef, 0x40, 0x2, 0xf1, 0x5e, - 0x2, 0xf3, 0x11, 0x11, 0x10, 0x0, 0x3, 0xf0, - 0x6d, 0x2, 0xf2, 0x35, 0x55, 0x55, 0x20, 0x4, - 0xf0, 0x7c, 0x2, 0xf5, 0xfe, 0xfe, 0xff, 0xd0, - 0x4, 0xff, 0xff, 0x82, 0xf6, 0xe1, 0xe4, 0xb3, - 0xf0, 0x0, 0x24, 0x4b, 0xd2, 0xf5, 0xe3, 0xe5, - 0xc4, 0xf0, 0x0, 0x0, 0x16, 0xc3, 0xf5, 0xff, - 0xff, 0xff, 0xf0, 0x6, 0xae, 0xb7, 0xb5, 0xe5, - 0xe2, 0xe4, 0xb3, 0xf0, 0x1c, 0xa5, 0x9, 0xa7, - 0xc5, 0xe1, 0xe4, 0xb3, 0xf0, 0x0, 0x0, 0xa, - 0x9a, 0x95, 0xe1, 0xe4, 0xb3, 0xf0, 0x0, 0x10, - 0xd, 0x7f, 0x55, 0xe1, 0xe4, 0xc6, 0xf0, 0x0, - 0xdf, 0xff, 0x6c, 0x4, 0xd0, 0xc2, 0xdf, 0xa0, - 0x0, 0x15, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0 -}; - - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 144, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 144, .box_w = 3, .box_h = 13, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 20, .adv_w = 144, .box_w = 5, .box_h = 8, .ofs_x = 2, .ofs_y = 6}, - {.bitmap_index = 40, .adv_w = 288, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 152, .adv_w = 189, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 248, .adv_w = 240, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 353, .adv_w = 201, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 437, .adv_w = 144, .box_w = 2, .box_h = 8, .ofs_x = 3, .ofs_y = 6}, - {.bitmap_index = 445, .adv_w = 144, .box_w = 5, .box_h = 16, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 485, .adv_w = 144, .box_w = 5, .box_h = 16, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 525, .adv_w = 144, .box_w = 7, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 553, .adv_w = 203, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 619, .adv_w = 144, .box_w = 3, .box_h = 6, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 628, .adv_w = 203, .box_w = 12, .box_h = 1, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 634, .adv_w = 144, .box_w = 3, .box_h = 3, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 639, .adv_w = 182, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 722, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 776, .adv_w = 144, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 812, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 871, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 930, .adv_w = 144, .box_w = 9, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 993, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1047, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1106, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1165, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1219, .adv_w = 144, .box_w = 9, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1282, .adv_w = 144, .box_w = 3, .box_h = 7, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 1293, .adv_w = 144, .box_w = 3, .box_h = 9, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 1307, .adv_w = 220, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1392, .adv_w = 204, .box_w = 12, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 1416, .adv_w = 222, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1501, .adv_w = 144, .box_w = 9, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1564, .adv_w = 281, .box_w = 17, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1692, .adv_w = 226, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1790, .adv_w = 206, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1862, .adv_w = 220, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1947, .adv_w = 209, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2019, .adv_w = 208, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2091, .adv_w = 202, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2169, .adv_w = 222, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2260, .adv_w = 200, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2344, .adv_w = 53, .box_w = 3, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2365, .adv_w = 180, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2430, .adv_w = 180, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2507, .adv_w = 181, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2579, .adv_w = 233, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2677, .adv_w = 203, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2755, .adv_w = 234, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2846, .adv_w = 209, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2931, .adv_w = 233, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3015, .adv_w = 205, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3087, .adv_w = 218, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3165, .adv_w = 215, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3250, .adv_w = 203, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3328, .adv_w = 198, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3412, .adv_w = 238, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3517, .adv_w = 177, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3589, .adv_w = 205, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3673, .adv_w = 221, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3758, .adv_w = 144, .box_w = 6, .box_h = 18, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 3812, .adv_w = 181, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 3892, .adv_w = 144, .box_w = 6, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 3943, .adv_w = 93, .box_w = 6, .box_h = 4, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 3955, .adv_w = 144, .box_w = 9, .box_h = 1, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3960, .adv_w = 144, .box_w = 2, .box_h = 8, .ofs_x = 3, .ofs_y = 6}, - {.bitmap_index = 3968, .adv_w = 171, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4013, .adv_w = 166, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4083, .adv_w = 174, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4133, .adv_w = 170, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4198, .adv_w = 178, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4253, .adv_w = 142, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4305, .adv_w = 178, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4371, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4436, .adv_w = 58, .box_w = 3, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4457, .adv_w = 56, .box_w = 5, .box_h = 15, .ofs_x = -2, .ofs_y = -2}, - {.bitmap_index = 4495, .adv_w = 164, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4554, .adv_w = 60, .box_w = 3, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4575, .adv_w = 222, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4647, .adv_w = 164, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4697, .adv_w = 176, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4742, .adv_w = 168, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4802, .adv_w = 169, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4862, .adv_w = 125, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4897, .adv_w = 169, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4942, .adv_w = 143, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4994, .adv_w = 167, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5049, .adv_w = 172, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5099, .adv_w = 236, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5169, .adv_w = 159, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5219, .adv_w = 172, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5274, .adv_w = 168, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5319, .adv_w = 144, .box_w = 5, .box_h = 18, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 5364, .adv_w = 63, .box_w = 2, .box_h = 18, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 5382, .adv_w = 144, .box_w = 5, .box_h = 18, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 5427, .adv_w = 116, .box_w = 7, .box_h = 4, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 5441, .adv_w = 288, .box_w = 17, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 5603, .adv_w = 288, .box_w = 17, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 5748, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 5901, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 6072, .adv_w = 288, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 6217, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 6388, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 6541, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 6712, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 6883, .adv_w = 288, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7036, .adv_w = 288, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 7198, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7351, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7504, .adv_w = 288, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7666, .adv_w = 288, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7828, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 7999, .adv_w = 288, .box_w = 17, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 8135, .adv_w = 288, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 8297, .adv_w = 288, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 8442, .adv_w = 288, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 8604, .adv_w = 288, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 8757, .adv_w = 288, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 8919, .adv_w = 288, .box_w = 16, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 9071, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9224, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -3} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x81, 0x338, 0x346, 0x3da, 0xac3, 0xe22, 0x1028, - 0x1079, 0x14dc, 0x1535, 0x175a, 0x179e, 0x1d38, 0x3455, 0x34c4, - 0x3ba5, 0x3dc4, 0x3dd6, 0x413f, 0x41ae, 0x4701, 0x47c0, 0x49c6, - 0x4c6a -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = -{ - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 20013, .range_length = 19563, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 25, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - - - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR == 8 -/*Store all the custom data of the font*/ -static lv_font_fmt_txt_glyph_cache_t cache; -#endif - -#if LVGL_VERSION_MAJOR >= 8 -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = NULL, - .kern_scale = 0, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 0, - .bitmap_format = 0, -#if LVGL_VERSION_MAJOR == 8 - .cache = &cache -#endif -}; - - - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t ui_font_zhongyuan18 = { -#else -lv_font_t ui_font_zhongyuan18 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 19, /*The maximum line height required by the font*/ - .base_line = 4, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -3, - .underline_thickness = 1, -#endif - .dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9 - .fallback = NULL, -#endif - .user_data = NULL, -}; - - - -#endif /*#if UI_FONT_ZHONGYUAN18*/ - diff --git a/software/Power_Pico/User/GUI/font/ui_font_zhongyuan20.c b/software/Power_Pico/User/GUI/font/ui_font_zhongyuan20.c deleted file mode 100644 index 2acc54d..0000000 --- a/software/Power_Pico/User/GUI/font/ui_font_zhongyuan20.c +++ /dev/null @@ -1,2293 +0,0 @@ -/******************************************************************************* - * Size: 20 px - * Bpp: 4 - * Opts: --bpp 4 --size 20 --font E:/projects/SquareLine_Projects/PowerPico/assets/HanYiZhongYuanJian-1.ttf -o E:/projects/SquareLine_Projects/PowerPico/assets\ui_font_zhongyuan20.c --format lvgl -r 0x20-0x7f --symbols 屏幕亮度:进入步进调节关闭诱骗按键声音中英文切换旋转角度固定档位请重启以应用所有更改 --no-compress --no-prefilter - ******************************************************************************/ - -#include "../ui.h" - -#ifndef UI_FONT_ZHONGYUAN20 -#define UI_FONT_ZHONGYUAN20 1 -#endif - -#if UI_FONT_ZHONGYUAN20 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+0020 " " */ - - /* U+0021 "!" */ - 0x9, 0x60, 0xf, 0xb0, 0xf, 0xb0, 0xf, 0xa0, - 0xe, 0xa0, 0xe, 0x90, 0xe, 0x90, 0xd, 0x80, - 0xd, 0x70, 0xd, 0x70, 0xa, 0x40, 0x0, 0x0, - 0x2, 0x10, 0x2f, 0xe0, 0x1d, 0xb0, - - /* U+0022 "\"" */ - 0x26, 0x0, 0x80, 0x6d, 0x2, 0xf1, 0x4c, 0x1, - 0xf0, 0x3c, 0x0, 0xe0, 0x2b, 0x0, 0xd0, 0xb, - 0x0, 0xb0, 0x9, 0x0, 0x90, 0x7, 0x0, 0x70, - 0x0, 0x0, 0x0, - - /* U+0023 "#" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, - 0x0, 0x0, 0xb, 0x60, 0x0, 0x9, 0xa0, 0x0, - 0x0, 0x0, 0xe, 0x40, 0x0, 0xb, 0x80, 0x0, - 0x0, 0x0, 0x1f, 0x20, 0x0, 0xe, 0x60, 0x0, - 0x0, 0x0, 0x4f, 0x0, 0x0, 0xf, 0x40, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x15, 0x55, 0xbc, 0x55, 0x55, 0x8f, 0x55, 0x50, - 0x0, 0x0, 0xb7, 0x0, 0x0, 0x6d, 0x0, 0x0, - 0x0, 0x0, 0xe4, 0x0, 0x0, 0x9b, 0x0, 0x0, - 0x0, 0x1, 0xf2, 0x0, 0x0, 0xb9, 0x0, 0x0, - 0x0, 0x14, 0xf1, 0x11, 0x11, 0xe7, 0x11, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x3, 0x4b, 0xa4, 0x44, 0x45, 0xf5, 0x44, 0x30, - 0x0, 0xc, 0x60, 0x0, 0x4, 0xf0, 0x0, 0x0, - 0x0, 0xe, 0x40, 0x0, 0x6, 0xd0, 0x0, 0x0, - 0x0, 0x1f, 0x10, 0x0, 0x9, 0xa0, 0x0, 0x0, - 0x0, 0x6, 0x0, 0x0, 0x4, 0x30, 0x0, 0x0, - - /* U+0024 "$" */ - 0x0, 0x0, 0x0, 0xd5, 0x0, 0x0, 0x0, 0x1, - 0x7b, 0xef, 0xfc, 0x60, 0x0, 0x2, 0xef, 0xb9, - 0xfc, 0xcf, 0xb0, 0x0, 0xaf, 0x30, 0x1f, 0x60, - 0x8f, 0x70, 0xf, 0xa0, 0x1, 0xf6, 0x0, 0xcf, - 0x0, 0xfa, 0x0, 0x1f, 0x60, 0x3, 0xa0, 0xb, - 0xf7, 0x11, 0xf6, 0x0, 0x0, 0x0, 0x1a, 0xff, - 0xdf, 0xb6, 0x30, 0x0, 0x0, 0x2, 0x7a, 0xff, - 0xff, 0xd2, 0x0, 0x0, 0x0, 0x1f, 0x60, 0x3d, - 0xd0, 0x15, 0x0, 0x1, 0xf6, 0x0, 0x5f, 0x45, - 0xf2, 0x0, 0x1f, 0x60, 0x4, 0xf6, 0x1e, 0xd2, - 0x1, 0xf6, 0x0, 0x9f, 0x30, 0x4f, 0xf8, 0x4f, - 0x61, 0x8f, 0xa0, 0x0, 0x2b, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x1, 0x6f, 0xa4, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, - - /* U+0025 "%" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x0, 0x8, 0xef, 0xb2, 0x0, 0x0, 0xa, 0xe0, - 0x0, 0xa, 0xe5, 0x4c, 0xe1, 0x0, 0x6, 0xf7, - 0x0, 0x1, 0xf4, 0x0, 0x1f, 0x70, 0x2, 0xfc, - 0x0, 0x0, 0x4f, 0x0, 0x0, 0xda, 0x0, 0xde, - 0x10, 0x0, 0x3, 0xf3, 0x0, 0xf, 0x80, 0x9f, - 0x40, 0x0, 0x0, 0xd, 0xd2, 0x1b, 0xf2, 0x5f, - 0x90, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xe4, 0x1e, - 0xc4, 0xdf, 0xc4, 0x0, 0x0, 0x2, 0x20, 0xc, - 0xf6, 0xf9, 0x4a, 0xf3, 0x0, 0x0, 0x0, 0x8, - 0xf5, 0xbc, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x4, - 0xfa, 0xf, 0x70, 0x0, 0x8e, 0x0, 0x0, 0x1, - 0xed, 0x0, 0xf7, 0x0, 0x8, 0xf0, 0x0, 0x0, - 0xbf, 0x30, 0xc, 0xb0, 0x0, 0xcc, 0x0, 0x0, - 0x7f, 0x60, 0x0, 0x6f, 0x60, 0x7f, 0x40, 0x0, - 0x2f, 0xb0, 0x0, 0x0, 0x7f, 0xff, 0x60, 0x0, - 0x3, 0xb1, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, - - /* U+0026 "&" */ - 0x0, 0x2a, 0xef, 0xd6, 0x0, 0x0, 0x0, 0x1, - 0xef, 0xaa, 0xef, 0x70, 0x0, 0x0, 0x8, 0xf4, - 0x0, 0xc, 0xe0, 0x0, 0x0, 0x9, 0xf3, 0x0, - 0xa, 0xf0, 0x0, 0x0, 0x4, 0xfc, 0x0, 0x5f, - 0xb0, 0x0, 0x0, 0x0, 0x9f, 0xca, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xa0, 0x0, 0xc, - 0x90, 0x1, 0xcf, 0xaf, 0xd2, 0x0, 0x2f, 0x80, - 0xc, 0xf4, 0x4, 0xfe, 0x30, 0x8f, 0x20, 0x5f, - 0x60, 0x0, 0x4f, 0xf6, 0xec, 0x0, 0x8f, 0x20, - 0x0, 0x3, 0xef, 0xf4, 0x0, 0x6f, 0x50, 0x0, - 0x0, 0xaf, 0xf8, 0x0, 0xe, 0xe4, 0x0, 0x3c, - 0xfb, 0xef, 0x80, 0x2, 0xdf, 0xff, 0xfe, 0x60, - 0x2e, 0xf1, 0x0, 0x3, 0x77, 0x50, 0x0, 0x1, - 0x20, - - /* U+0027 "'" */ - 0x63, 0xb8, 0xa6, 0xa5, 0x94, 0x83, 0x71, 0x60, - 0x0, - - /* U+0028 "(" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0xe3, 0x0, 0x1e, - 0xc0, 0x0, 0x9f, 0x10, 0x2, 0xf7, 0x0, 0x8, - 0xe0, 0x0, 0xd, 0x90, 0x0, 0x1f, 0x60, 0x0, - 0x2f, 0x30, 0x0, 0x3f, 0x30, 0x0, 0x2f, 0x50, - 0x0, 0xf, 0x80, 0x0, 0xc, 0xc0, 0x0, 0x6, - 0xf2, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x6f, 0x80, - 0x0, 0x9, 0xf1, 0x0, 0x0, 0x0, - - /* U+0029 ")" */ - 0x0, 0x0, 0x0, 0x4e, 0x20, 0x0, 0x1d, 0xd0, - 0x0, 0x2, 0xf8, 0x0, 0x0, 0x8f, 0x0, 0x0, - 0x1f, 0x60, 0x0, 0xb, 0xb0, 0x0, 0x7, 0xf0, - 0x0, 0x5, 0xf1, 0x0, 0x5, 0xf1, 0x0, 0x6, - 0xf0, 0x0, 0x9, 0xe0, 0x0, 0xe, 0xa0, 0x0, - 0x4f, 0x50, 0x0, 0xdd, 0x0, 0xa, 0xf4, 0x0, - 0x3f, 0x70, 0x0, 0x1, 0x0, 0x0, - - /* U+002A "*" */ - 0x0, 0xb, 0x70, 0x0, 0x0, 0xc, 0x90, 0x0, - 0x8d, 0x28, 0x54, 0xe5, 0x2a, 0xd8, 0x8e, 0x91, - 0x2, 0x7c, 0xa4, 0x0, 0x6f, 0xa7, 0x4d, 0xe3, - 0x36, 0xb, 0x71, 0x71, 0x0, 0xe, 0x90, 0x0, - 0x0, 0x4, 0x20, 0x0, - - /* U+002B "+" */ - 0x0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, 0xd, - 0xdd, 0xdd, 0xee, 0xdd, 0xdd, 0xc0, 0x0, 0x0, - 0x7, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x76, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, - - /* U+002C "," */ - 0x6, 0x40, 0x8f, 0xf2, 0x5f, 0xf4, 0x1, 0xe0, - 0x1c, 0x50, 0x33, 0x0, - - /* U+002D "-" */ - 0xd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xc0, - - /* U+002E "." */ - 0x3, 0x14, 0xfc, 0x3e, 0x90, - - /* U+002F "/" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, - 0x0, 0x6, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1b, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, - 0x0, 0x0, 0x6, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb1, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0030 "0" */ - 0x0, 0x8, 0xee, 0x70, 0x0, 0x0, 0xbe, 0x8a, - 0xfb, 0x0, 0x7, 0xf2, 0x0, 0x5f, 0x60, 0xe, - 0x80, 0x0, 0xb, 0xd0, 0x2f, 0x30, 0x0, 0x5, - 0xf2, 0x6f, 0x0, 0x0, 0x2, 0xf5, 0x7e, 0x0, - 0x0, 0x0, 0xf7, 0x7e, 0x0, 0x0, 0x0, 0xf7, - 0x6f, 0x0, 0x0, 0x2, 0xf5, 0x3f, 0x30, 0x0, - 0x6, 0xf2, 0xe, 0x90, 0x0, 0xc, 0xd0, 0x7, - 0xf3, 0x0, 0x7f, 0x60, 0x0, 0xbf, 0xac, 0xfb, - 0x0, 0x0, 0x8, 0xee, 0x80, 0x0, - - /* U+0031 "1" */ - 0x0, 0x1, 0x9e, 0x10, 0x4, 0xef, 0xf3, 0x9, - 0xfc, 0x7f, 0x37, 0xe6, 0x5, 0xf3, 0x0, 0x0, - 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, 0x0, 0x5f, - 0x30, 0x0, 0x5, 0xf3, 0x0, 0x0, 0x5f, 0x30, - 0x0, 0x5, 0xf3, 0x0, 0x0, 0x5f, 0x30, 0x0, - 0x5, 0xf3, 0x0, 0x0, 0x5f, 0x30, 0x0, 0x3, - 0xf1, - - /* U+0032 "2" */ - 0x0, 0x2a, 0xdc, 0x80, 0x0, 0x3, 0xff, 0xbc, - 0xfd, 0x0, 0xd, 0xe2, 0x0, 0x6f, 0x70, 0x3f, - 0x70, 0x0, 0xd, 0xd0, 0x5f, 0x20, 0x0, 0xa, - 0xf0, 0x3, 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, - 0x0, 0x1f, 0xa0, 0x0, 0x0, 0x0, 0xbf, 0x20, - 0x0, 0x0, 0x1b, 0xf5, 0x0, 0x0, 0x4, 0xee, - 0x40, 0x0, 0x0, 0x8f, 0xb1, 0x0, 0x0, 0xc, - 0xf5, 0x0, 0x0, 0x0, 0x5f, 0xc7, 0x77, 0x77, - 0x62, 0x2f, 0xff, 0xff, 0xff, 0xf8, - - /* U+0033 "3" */ - 0x0, 0x0, 0x44, 0x10, 0x0, 0x0, 0x6f, 0xff, - 0xf8, 0x0, 0x5, 0xf9, 0x21, 0x7f, 0x60, 0xd, - 0xb0, 0x0, 0xb, 0xd0, 0xf, 0x40, 0x0, 0x8, - 0xf0, 0x1, 0x0, 0x0, 0xb, 0xd0, 0x0, 0x0, - 0x2, 0x7f, 0x60, 0x0, 0x0, 0xcf, 0xfe, 0x10, - 0x0, 0x0, 0x25, 0x6e, 0xd0, 0x0, 0x0, 0x0, - 0x2, 0xf4, 0x17, 0x0, 0x0, 0x0, 0xf6, 0x5f, - 0x30, 0x0, 0x1, 0xf6, 0xe, 0xd1, 0x0, 0x7, - 0xf2, 0x3, 0xfe, 0x87, 0xaf, 0x90, 0x0, 0x2a, - 0xff, 0xc7, 0x0, - - /* U+0034 "4" */ - 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x3, - 0xf8, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, - 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0xeb, 0xd8, - 0x0, 0x0, 0x8, 0xf2, 0xd8, 0x0, 0x0, 0x2f, - 0x80, 0xd8, 0x0, 0x0, 0xae, 0x0, 0xd8, 0x0, - 0x4, 0xf5, 0x0, 0xd8, 0x0, 0xd, 0xb0, 0x0, - 0xd8, 0x0, 0x5f, 0x62, 0x22, 0xd9, 0x20, 0x8f, - 0xff, 0xff, 0xff, 0xf6, 0x4, 0x55, 0x55, 0xda, - 0x40, 0x0, 0x0, 0x0, 0xd8, 0x0, 0x0, 0x0, - 0x0, 0x84, 0x0, - - /* U+0035 "5" */ - 0x1, 0xdf, 0xff, 0xff, 0xe0, 0x5, 0xf8, 0x77, - 0x77, 0x60, 0x8, 0xe0, 0x0, 0x0, 0x0, 0xb, - 0xb0, 0x0, 0x0, 0x0, 0xe, 0xa9, 0xef, 0xc6, - 0x0, 0xf, 0xe7, 0x32, 0x6e, 0x90, 0x9, 0x10, - 0x0, 0x5, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xf6, - 0x2, 0x0, 0x0, 0x0, 0xf7, 0x7e, 0x10, 0x0, - 0x1, 0xf6, 0x2f, 0xb0, 0x0, 0x8, 0xf1, 0x6, - 0xfd, 0x86, 0xaf, 0x90, 0x0, 0x3a, 0xef, 0xd7, - 0x0, - - /* U+0036 "6" */ - 0x0, 0x8, 0xef, 0xb3, 0x0, 0x0, 0xcf, 0x96, - 0xcf, 0x40, 0x7, 0xf4, 0x0, 0xd, 0xd0, 0xd, - 0xa0, 0x0, 0x3, 0xc0, 0x2f, 0x41, 0x68, 0x61, - 0x0, 0x4f, 0x4e, 0xeb, 0xfe, 0x20, 0x5f, 0xe9, - 0x0, 0x1d, 0xb0, 0x5f, 0xd0, 0x0, 0x5, 0xf2, - 0x4f, 0xa0, 0x0, 0x2, 0xf5, 0x1f, 0x90, 0x0, - 0x1, 0xf5, 0xd, 0xb0, 0x0, 0x3, 0xf4, 0x6, - 0xf3, 0x0, 0xa, 0xf0, 0x0, 0xce, 0x75, 0xaf, - 0x60, 0x0, 0x1a, 0xff, 0xd6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0037 "7" */ - 0x5f, 0xff, 0xff, 0xff, 0xf6, 0x17, 0x77, 0x77, - 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x3f, 0x90, 0x0, - 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x5, 0xf3, - 0x0, 0x0, 0x0, 0xd, 0xb0, 0x0, 0x0, 0x0, - 0x4f, 0x30, 0x0, 0x0, 0x0, 0x9d, 0x0, 0x0, - 0x0, 0x0, 0xe7, 0x0, 0x0, 0x0, 0x3, 0xf3, - 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x0, - 0xa, 0xd0, 0x0, 0x0, 0x0, 0xd, 0xb0, 0x0, - 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0038 "8" */ - 0x0, 0x4c, 0xff, 0xc4, 0x0, 0x5, 0xfc, 0x88, - 0xdf, 0x50, 0xc, 0xc0, 0x0, 0xc, 0xe0, 0xf, - 0x70, 0x0, 0x7, 0xf0, 0xc, 0xa0, 0x0, 0xa, - 0xe0, 0x2, 0xe9, 0x44, 0x8f, 0x40, 0x6, 0xfd, - 0xaa, 0xef, 0x60, 0x2f, 0xa0, 0x0, 0xb, 0xf2, - 0x7f, 0x10, 0x0, 0x2, 0xf7, 0x8f, 0x0, 0x0, - 0x0, 0xf8, 0x5f, 0x80, 0x0, 0x5, 0xf5, 0xa, - 0xfc, 0x87, 0xaf, 0xd0, 0x0, 0x6c, 0xff, 0xea, - 0x10, - - /* U+0039 "9" */ - 0x0, 0x19, 0xdd, 0x81, 0x0, 0x1, 0xed, 0x78, - 0xee, 0x10, 0xb, 0xd0, 0x0, 0x1e, 0xa0, 0x1f, - 0x50, 0x0, 0x7, 0xf0, 0x3f, 0x20, 0x0, 0x4, - 0xf4, 0x4f, 0x20, 0x0, 0x4, 0xf6, 0x2f, 0x50, - 0x0, 0x7, 0xf7, 0xd, 0xd1, 0x0, 0x2e, 0xf7, - 0x4, 0xfe, 0x99, 0xff, 0xf6, 0x0, 0x3a, 0xee, - 0xa5, 0xf4, 0x1b, 0x10, 0x0, 0x5, 0xf1, 0xf, - 0xa0, 0x0, 0xb, 0xc0, 0x7, 0xfa, 0x21, 0x7f, - 0x50, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x1, - 0x44, 0x10, 0x0, - - /* U+003A ":" */ - 0x2c, 0xa0, 0x8f, 0xf4, 0x3e, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x2c, 0xa0, 0x8f, 0xf4, 0x3e, 0xc0, - - /* U+003B ";" */ - 0x2c, 0xa0, 0x8f, 0xf4, 0x3e, 0xc1, 0x0, 0x0, - 0x4e, 0xc0, 0x8f, 0xf4, 0x18, 0xf3, 0x8, 0xa0, - 0x37, 0x0, - - /* U+003C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x18, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x3a, 0xd6, 0x0, 0x0, 0x0, 0x0, - 0x4b, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xa3, - 0x0, 0x0, 0x0, 0x1, 0x7d, 0x92, 0x0, 0x0, - 0x0, 0x0, 0x9d, 0x71, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xea, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xcc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xbd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x9d, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x7d, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5c, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x31, - - /* U+003D "=" */ - 0xd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdc, - - /* U+003E ">" */ - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd9, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcb, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbc, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9d, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, - 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, - 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x3a, 0xd7, 0x10, 0x0, - 0x0, 0x0, 0x4b, 0xc5, 0x0, 0x0, 0x0, 0x0, - 0x6d, 0xa3, 0x0, 0x0, 0x0, 0x1, 0x7d, 0x92, - 0x0, 0x0, 0x0, 0x0, 0x9d, 0x71, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+003F "?" */ - 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x6e, 0xff, - 0xf5, 0x0, 0x7, 0xf7, 0x11, 0x7f, 0x40, 0x1f, - 0x60, 0x0, 0xa, 0xc0, 0x6e, 0x0, 0x0, 0x4, - 0xf0, 0x24, 0x0, 0x0, 0x3, 0xf1, 0x0, 0x0, - 0x0, 0x6, 0xe0, 0x0, 0x0, 0x0, 0xd, 0x80, - 0x0, 0x0, 0x2, 0xcc, 0x0, 0x0, 0x0, 0x2f, - 0xb0, 0x0, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x0, - 0x0, 0x5e, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0x40, 0x0, 0x0, 0x0, - 0x8e, 0x30, 0x0, - - /* U+0040 "@" */ - 0x0, 0x0, 0x2, 0x7b, 0xcd, 0xcb, 0x71, 0x0, - 0x0, 0x0, 0x1, 0xac, 0x51, 0x0, 0x1, 0x5b, - 0x80, 0x0, 0x0, 0x2d, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x6b, 0x0, 0x1, 0xd3, 0x0, 0x4, 0x99, - 0xa4, 0x13, 0x8, 0x70, 0xa, 0x50, 0x0, 0xa8, - 0x0, 0x1c, 0xea, 0x0, 0xd0, 0x3c, 0x0, 0xc, - 0x60, 0x0, 0x4, 0xf5, 0x0, 0x93, 0x95, 0x0, - 0x7b, 0x0, 0x0, 0x4, 0xf1, 0x0, 0x85, 0xd1, - 0x0, 0xd5, 0x0, 0x0, 0x7, 0xc0, 0x0, 0x93, - 0xe0, 0x1, 0xf1, 0x0, 0x0, 0xb, 0x80, 0x0, - 0xd0, 0xe0, 0x3, 0xf0, 0x0, 0x0, 0xf, 0x30, - 0x5, 0xa0, 0xc1, 0x1, 0xf1, 0x0, 0x0, 0x6f, - 0x0, 0x1d, 0x20, 0x86, 0x0, 0x87, 0x0, 0x2, - 0xed, 0x2, 0xd4, 0x0, 0x2d, 0x0, 0x7, 0x63, - 0x58, 0x3f, 0xfc, 0x30, 0x42, 0x8, 0xa0, 0x0, - 0x1, 0x0, 0x0, 0x10, 0x6, 0xc0, 0x0, 0xaa, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x9c, 0x10, 0x0, - 0x7, 0xe8, 0x30, 0x0, 0x3, 0x8e, 0x70, 0x0, - 0x0, 0x0, 0x17, 0xbd, 0xde, 0xeb, 0x71, 0x0, - 0x0, - - /* U+0041 "A" */ - 0x0, 0x0, 0x3, 0xe8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0x6f, 0x80, 0x0, 0x0, 0x0, 0x0, 0x9e, - 0x9, 0xf0, 0x0, 0x0, 0x0, 0x1, 0xf8, 0x2, - 0xf7, 0x0, 0x0, 0x0, 0x7, 0xf1, 0x0, 0xbe, - 0x0, 0x0, 0x0, 0xe, 0xa0, 0x0, 0x4f, 0x50, - 0x0, 0x0, 0x5f, 0x30, 0x0, 0xc, 0xc0, 0x0, - 0x0, 0xcd, 0x0, 0x0, 0x5, 0xf3, 0x0, 0x2, - 0xf7, 0x11, 0x11, 0x12, 0xea, 0x0, 0x9, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x1f, 0xb4, 0x44, - 0x44, 0x44, 0x7f, 0x80, 0x7f, 0x40, 0x0, 0x0, - 0x0, 0xd, 0xf0, 0xdc, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xf6, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x92, - - /* U+0042 "B" */ - 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x40, 0xf, 0xd7, - 0x77, 0x77, 0x77, 0xdf, 0x40, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0xea, 0xf, 0x80, 0x0, 0x0, 0x0, - 0xe, 0xa0, 0xf9, 0x11, 0x11, 0x12, 0x4a, 0xe2, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xfa, - 0x44, 0x44, 0x44, 0x6d, 0xf4, 0xf, 0x80, 0x0, - 0x0, 0x0, 0xd, 0xe0, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0x2f, 0x80, 0x0, 0x0, 0x0, 0x6, - 0xf2, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xce, 0xf, - 0xe7, 0x77, 0x77, 0x79, 0xdf, 0x60, 0x8f, 0xff, - 0xff, 0xff, 0xfc, 0x50, 0x0, - - /* U+0043 "C" */ - 0x0, 0x0, 0x4a, 0xef, 0xfc, 0x81, 0x0, 0x0, - 0x0, 0x9f, 0xfa, 0x89, 0xcf, 0xe4, 0x0, 0x0, - 0x9f, 0x90, 0x0, 0x0, 0x4e, 0xf4, 0x0, 0x3f, - 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xd0, 0xa, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x34, 0x0, 0xed, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0x20, 0x0, 0x0, - 0x0, 0x3, 0xe2, 0x4, 0xfa, 0x0, 0x0, 0x0, - 0x1, 0xee, 0x0, 0xa, 0xfa, 0x10, 0x0, 0x3, - 0xdf, 0x40, 0x0, 0xa, 0xff, 0xa8, 0x9c, 0xff, - 0x40, 0x0, 0x0, 0x3, 0xad, 0xee, 0xd8, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+0044 "D" */ - 0x7f, 0xff, 0xff, 0xfe, 0xb5, 0x0, 0xe, 0xe8, - 0x77, 0x77, 0x8e, 0xf7, 0x0, 0xea, 0x0, 0x0, - 0x0, 0xb, 0xf3, 0xe, 0x90, 0x0, 0x0, 0x0, - 0x1f, 0xa0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0xe, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf1, 0xe9, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0x2e, 0x90, 0x0, - 0x0, 0x0, 0x8, 0xf2, 0xe9, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0x1e, 0x90, 0x0, 0x0, 0x0, 0xd, - 0xd0, 0xea, 0x0, 0x0, 0x0, 0x4, 0xf8, 0xe, - 0xf9, 0x88, 0x88, 0x8a, 0xfe, 0x10, 0x6e, 0xff, - 0xff, 0xff, 0xe9, 0x10, 0x0, - - /* U+0045 "E" */ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xe, 0xd6, - 0x66, 0x66, 0x66, 0x66, 0x20, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf9, 0x11, 0x11, 0x11, 0x11, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xfb, - 0x44, 0x44, 0x44, 0x44, 0x0, 0xf, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xe7, 0x77, 0x77, 0x77, 0x77, 0x40, 0x7e, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, - - /* U+0046 "F" */ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xfe, 0x77, - 0x77, 0x77, 0x77, 0x72, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xfb, 0x22, 0x22, 0x22, 0x21, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0xfc, 0x55, 0x55, 0x55, - 0x54, 0x10, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0047 "G" */ - 0x0, 0x0, 0x28, 0xbd, 0xc9, 0x40, 0x0, 0x0, - 0x0, 0x7f, 0xfb, 0x9a, 0xff, 0xc1, 0x0, 0x0, - 0x8f, 0xa1, 0x0, 0x0, 0x8f, 0xd1, 0x0, 0x2f, - 0xb0, 0x0, 0x0, 0x0, 0x6f, 0xb0, 0x9, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x7a, 0x0, 0xdc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xa0, 0x0, - 0x0, 0x2, 0x22, 0x20, 0x0, 0xf9, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xd0, 0xd, 0xb0, 0x0, 0x0, - 0x25, 0x55, 0xbf, 0x10, 0xaf, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xf2, 0x5, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0x20, 0xc, 0xf5, 0x0, 0x0, 0x0, - 0x9f, 0xf2, 0x0, 0x1d, 0xfa, 0x53, 0x35, 0xcf, - 0xcf, 0x20, 0x0, 0x8, 0xef, 0xff, 0xfc, 0x46, - 0xf1, 0x0, 0x0, 0x0, 0x23, 0x31, 0x0, 0x2, - 0x0, - - /* U+0048 "H" */ - 0x20, 0x0, 0x0, 0x0, 0x0, 0x31, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0xd8, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xe9, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe9, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe9, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0xe9, 0xfc, 0x88, 0x88, 0x88, - 0x88, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe9, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0xe9, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xe9, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe9, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe9, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0xe9, 0xd6, 0x0, 0x0, 0x0, - 0x0, 0xb6, - - /* U+0049 "I" */ - 0x73, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, - 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xe8, 0x51, - - /* U+004A "J" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0x7, 0x40, 0x0, 0x0, 0x8, 0xf0, 0xd9, - 0x0, 0x0, 0x0, 0x9f, 0xb, 0xd0, 0x0, 0x0, - 0xb, 0xd0, 0x6f, 0x70, 0x0, 0x4, 0xf8, 0x0, - 0xbf, 0xc8, 0x7a, 0xfe, 0x10, 0x0, 0x6c, 0xef, - 0xd8, 0x10, 0x0, - - /* U+004B "K" */ - 0x73, 0x0, 0x0, 0x0, 0x6, 0x3e, 0x70, 0x0, - 0x0, 0x1b, 0xf6, 0xf7, 0x0, 0x0, 0x2d, 0xf5, - 0xf, 0x70, 0x0, 0x5f, 0xe3, 0x0, 0xf7, 0x0, - 0x8f, 0xb1, 0x0, 0xf, 0x71, 0xbf, 0x90, 0x0, - 0x0, 0xfa, 0xdf, 0xe1, 0x0, 0x0, 0xf, 0xfd, - 0x5f, 0xc0, 0x0, 0x0, 0xfb, 0x0, 0x5f, 0x90, - 0x0, 0xf, 0x70, 0x0, 0x8f, 0x60, 0x0, 0xf7, - 0x0, 0x0, 0xbf, 0x30, 0xf, 0x70, 0x0, 0x1, - 0xee, 0x10, 0xf7, 0x0, 0x0, 0x3, 0xfb, 0xe, - 0x70, 0x0, 0x0, 0x6, 0xf3, 0x52, 0x0, 0x0, - 0x0, 0x2, 0x0, - - /* U+004C "L" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x60, 0x0, - 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0xf, 0x90, 0x0, 0x0, 0x0, 0x0, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x90, 0x0, 0x0, 0x0, - 0x0, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xf, 0x90, - 0x0, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0xf, 0x90, 0x0, 0x0, 0x0, 0x0, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0xf, 0x90, 0x0, 0x0, - 0x0, 0x0, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xd6, 0x66, 0x66, 0x66, 0x61, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0x60, - - /* U+004D "M" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, - 0x10, 0x0, 0x0, 0x0, 0x2, 0xe7, 0xef, 0x80, - 0x0, 0x0, 0x0, 0x9, 0xfc, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0xf, 0xfd, 0xfd, 0xf6, 0x0, 0x0, - 0x0, 0x6f, 0xed, 0xf9, 0xec, 0x0, 0x0, 0x0, - 0xcc, 0xbd, 0xf9, 0x7f, 0x30, 0x0, 0x3, 0xf6, - 0xbd, 0xf9, 0x1f, 0x90, 0x0, 0x9, 0xf0, 0xbd, - 0xf9, 0xa, 0xf1, 0x0, 0xf, 0x90, 0xbd, 0xf9, - 0x4, 0xf6, 0x0, 0x6f, 0x30, 0xbd, 0xf9, 0x0, - 0xdd, 0x0, 0xcd, 0x0, 0xbd, 0xf9, 0x0, 0x7f, - 0x43, 0xf6, 0x0, 0xbd, 0xf9, 0x0, 0x1f, 0xa9, - 0xf1, 0x0, 0xbd, 0xf9, 0x0, 0xa, 0xff, 0x90, - 0x0, 0xbd, 0xc7, 0x0, 0x1, 0xdd, 0x10, 0x0, - 0x8a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+004E "N" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, - 0x0, 0x0, 0x0, 0xc8, 0xff, 0x50, 0x0, 0x0, - 0x0, 0xea, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xea, - 0xfb, 0xee, 0x10, 0x0, 0x0, 0xea, 0xf9, 0x3f, - 0xc0, 0x0, 0x0, 0xea, 0xf9, 0x6, 0xfa, 0x0, - 0x0, 0xea, 0xf9, 0x0, 0x8f, 0x80, 0x0, 0xea, - 0xf9, 0x0, 0xb, 0xf5, 0x0, 0xea, 0xf9, 0x0, - 0x0, 0xdf, 0x30, 0xea, 0xf9, 0x0, 0x0, 0x1e, - 0xe2, 0xea, 0xf9, 0x0, 0x0, 0x3, 0xfd, 0xea, - 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0xf9, 0x0, - 0x0, 0x0, 0x7, 0xfa, 0xc6, 0x0, 0x0, 0x0, - 0x0, 0x87, - - /* U+004F "O" */ - 0x0, 0x0, 0x3a, 0xdf, 0xfe, 0xa3, 0x0, 0x0, - 0x0, 0x9f, 0xea, 0x89, 0xcf, 0xf8, 0x0, 0x0, - 0x8f, 0x80, 0x0, 0x0, 0x2c, 0xf6, 0x0, 0x3f, - 0x90, 0x0, 0x0, 0x0, 0xd, 0xf1, 0x9, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0x70, 0xcd, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xfb, 0xf, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xd0, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xed, 0xe, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xc0, 0xce, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xf9, 0x7, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0x30, 0x1e, 0xd1, 0x0, 0x0, 0x0, - 0x5f, 0xa0, 0x0, 0x3e, 0xe6, 0x20, 0x3, 0x9f, - 0xb0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xfd, 0x60, - 0x0, 0x0, 0x0, 0x1, 0x35, 0x52, 0x0, 0x0, - 0x0, - - /* U+0050 "P" */ - 0x8f, 0xff, 0xff, 0xff, 0xeb, 0x40, 0xf, 0xe7, - 0x66, 0x66, 0x67, 0xcf, 0x60, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0xbe, 0xf, 0x80, 0x0, 0x0, 0x0, - 0x5, 0xf3, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0x4f, 0x80, 0x0, 0x0, 0x0, 0x8, 0xf1, 0xf9, - 0x22, 0x22, 0x22, 0x38, 0xfa, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0xfa, 0x55, 0x55, 0x55, - 0x31, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+0051 "Q" */ - 0x0, 0x0, 0x4a, 0xdf, 0xfd, 0x94, 0x0, 0x0, - 0x0, 0xbf, 0xea, 0x88, 0xae, 0xfb, 0x0, 0x0, - 0xbf, 0x60, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x5f, - 0x80, 0x0, 0x0, 0x0, 0x9, 0xf3, 0xa, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0x90, 0xec, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdc, 0xf, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xd0, 0xeb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdc, 0xb, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0x80, 0x5f, 0x90, 0x0, 0x0, - 0x41, 0x8, 0xf2, 0x0, 0xaf, 0xa2, 0x0, 0x1f, - 0xfa, 0xf8, 0x0, 0x0, 0x7f, 0xfc, 0x99, 0xdf, - 0xfd, 0x0, 0x0, 0x0, 0x15, 0x8a, 0xa8, 0x6c, - 0xe1, 0x0, - - /* U+0052 "R" */ - 0x6e, 0xff, 0xff, 0xff, 0xff, 0x91, 0xe, 0xe7, - 0x77, 0x77, 0x77, 0x9f, 0xc0, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0x3f, 0x80, 0x0, 0x0, 0x0, - 0x4, 0xf4, 0xf9, 0x11, 0x11, 0x11, 0x14, 0xdd, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xfa, - 0x44, 0x44, 0x44, 0x6d, 0xd0, 0xf, 0x70, 0x0, - 0x0, 0x0, 0x1f, 0x70, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0xdb, 0xf, 0x70, 0x0, 0x0, 0x0, 0xc, - 0xc0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcc, 0xf, - 0x70, 0x0, 0x0, 0x0, 0xc, 0xb0, 0xc5, 0x0, - 0x0, 0x0, 0x0, 0xa9, 0x0, - - /* U+0053 "S" */ - 0x0, 0x3, 0xad, 0xff, 0xeb, 0x70, 0x0, 0x0, - 0x7f, 0xe9, 0x87, 0x7a, 0xfe, 0x30, 0x1, 0xfd, - 0x10, 0x0, 0x0, 0x2e, 0xe0, 0x4, 0xf5, 0x0, - 0x0, 0x0, 0x4, 0xf6, 0x3, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x72, 0x0, 0xaf, 0xd7, 0x41, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x9e, 0xff, 0xda, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x15, 0x8c, 0xff, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xf6, 0xc, - 0x40, 0x0, 0x0, 0x0, 0x0, 0xeb, 0xc, 0xe1, - 0x0, 0x0, 0x0, 0x0, 0xea, 0x4, 0xfc, 0x10, - 0x0, 0x0, 0x8, 0xf5, 0x0, 0x6f, 0xe9, 0x65, - 0x57, 0xcf, 0x80, 0x0, 0x2, 0x8d, 0xff, 0xec, - 0x93, 0x0, - - /* U+0054 "T" */ - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x5, - 0x77, 0x77, 0xcf, 0x77, 0x77, 0x62, 0x0, 0x0, - 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x0, - 0x0, 0x0, - - /* U+0055 "U" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, - 0x0, 0x0, 0x0, 0xa9, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0xbd, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xbd, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0xbd, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0xcd, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0xcd, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xcd, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0xcc, 0xea, 0x0, 0x0, 0x0, - 0x0, 0xdb, 0xce, 0x0, 0x0, 0x0, 0x1, 0xf9, - 0x6f, 0x90, 0x0, 0x0, 0x9, 0xf3, 0x9, 0xfd, - 0x97, 0x68, 0xdf, 0x60, 0x0, 0x5b, 0xef, 0xed, - 0xa3, 0x0, - - /* U+0056 "V" */ - 0x3, 0x10, 0x0, 0x0, 0x0, 0x1, 0x0, 0xf9, - 0x0, 0x0, 0x0, 0x3, 0xf6, 0xc, 0xe0, 0x0, - 0x0, 0x0, 0x8f, 0x30, 0x6f, 0x50, 0x0, 0x0, - 0xe, 0xd0, 0x1, 0xfa, 0x0, 0x0, 0x3, 0xf7, - 0x0, 0xa, 0xf0, 0x0, 0x0, 0x8f, 0x20, 0x0, - 0x4f, 0x60, 0x0, 0xe, 0xc0, 0x0, 0x0, 0xeb, - 0x0, 0x3, 0xf6, 0x0, 0x0, 0x8, 0xf1, 0x0, - 0x8f, 0x10, 0x0, 0x0, 0x2f, 0x70, 0xd, 0xb0, - 0x0, 0x0, 0x0, 0xcc, 0x3, 0xf5, 0x0, 0x0, - 0x0, 0x6, 0xf2, 0x8f, 0x0, 0x0, 0x0, 0x0, - 0xf, 0x9d, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9f, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1, 0xda, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0057 "W" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0x60, 0x0, 0x3, 0xd0, 0x0, 0x0, 0xd7, 0xcd, - 0x0, 0x0, 0x8f, 0x40, 0x0, 0x1f, 0x78, 0xf1, - 0x0, 0xb, 0xf8, 0x0, 0x5, 0xf3, 0x3f, 0x60, - 0x0, 0xef, 0xc0, 0x0, 0x9f, 0x0, 0xeb, 0x0, - 0x1f, 0xef, 0x0, 0xc, 0xc0, 0x9, 0xf0, 0x4, - 0xf7, 0xf4, 0x0, 0xf8, 0x0, 0x5f, 0x40, 0x7f, - 0xf, 0x80, 0x4f, 0x50, 0x0, 0xf9, 0xa, 0xc0, - 0xbc, 0x7, 0xf1, 0x0, 0xb, 0xd0, 0xd9, 0x6, - 0xf0, 0xbe, 0x0, 0x0, 0x7f, 0x3f, 0x60, 0x2f, - 0x4f, 0xa0, 0x0, 0x2, 0xfa, 0xf3, 0x0, 0xeb, - 0xf7, 0x0, 0x0, 0xd, 0xff, 0x0, 0x9, 0xff, - 0x30, 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x5f, 0xf0, - 0x0, 0x0, 0x2, 0xf7, 0x0, 0x0, 0xe9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0058 "X" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x70, - 0x0, 0x0, 0x3, 0xe3, 0x9, 0xf4, 0x0, 0x0, - 0x1e, 0xe0, 0x0, 0xde, 0x10, 0x0, 0xbf, 0x30, - 0x0, 0x2f, 0xc0, 0x7, 0xf6, 0x0, 0x0, 0x4, - 0xf9, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0x8f, 0xed, - 0x0, 0x0, 0x0, 0x0, 0xe, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x3, - 0xfb, 0x2f, 0xb0, 0x0, 0x0, 0x1e, 0xd0, 0x6, - 0xf7, 0x0, 0x0, 0xcf, 0x20, 0x0, 0xaf, 0x30, - 0x9, 0xf5, 0x0, 0x0, 0xd, 0xe1, 0xd, 0x80, - 0x0, 0x0, 0x3, 0xe3, - - /* U+0059 "Y" */ - 0x9, 0x40, 0x0, 0x0, 0x0, 0x2, 0xa1, 0xc, - 0xe1, 0x0, 0x0, 0x0, 0xc, 0xe0, 0x2, 0xfc, - 0x0, 0x0, 0x0, 0x8f, 0x40, 0x0, 0x5f, 0x80, - 0x0, 0x3, 0xf9, 0x0, 0x0, 0xa, 0xf4, 0x0, - 0xd, 0xd0, 0x0, 0x0, 0x0, 0xde, 0x10, 0x9f, - 0x30, 0x0, 0x0, 0x0, 0x3f, 0xb4, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xae, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xae, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xae, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xae, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, - 0x0, - - /* U+005A "Z" */ - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, - 0x47, 0x77, 0x77, 0x77, 0x79, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xc6, 0x66, 0x66, 0x66, - 0x66, 0x40, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+005B "[" */ - 0x0, 0x12, 0x10, 0x5f, 0xff, 0xf7, 0xce, 0x55, - 0x41, 0xda, 0x0, 0x0, 0xda, 0x0, 0x0, 0xda, - 0x0, 0x0, 0xda, 0x0, 0x0, 0xda, 0x0, 0x0, - 0xda, 0x0, 0x0, 0xda, 0x0, 0x0, 0xda, 0x0, - 0x0, 0xda, 0x0, 0x0, 0xda, 0x0, 0x0, 0xda, - 0x0, 0x0, 0xda, 0x0, 0x0, 0xda, 0x0, 0x0, - 0xdc, 0x22, 0x20, 0x8f, 0xff, 0xf6, 0x2, 0x55, - 0x50, - - /* U+005C "\\" */ - 0x60, 0x0, 0x0, 0x0, 0x0, 0x2, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x6, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, - 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, - - /* U+005D "]" */ - 0x1, 0x11, 0x0, 0x9f, 0xff, 0xe3, 0x14, 0x46, - 0xf9, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, 0x0, - 0x0, 0xdb, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, - 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, 0x0, 0x0, - 0xdb, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, 0x0, - 0x0, 0xdb, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, - 0x2, 0x23, 0xea, 0x9f, 0xff, 0xf5, 0x15, 0x54, - 0x20, - - /* U+005E "^" */ - 0x0, 0x1, 0x0, 0x0, 0x6b, 0x0, 0x1, 0xfe, - 0x60, 0xa, 0x51, 0xb2, 0x33, 0x0, 0x5, - - /* U+005F "_" */ - 0xcd, 0xdd, 0xdd, 0xdd, 0xdb, - - /* U+0060 "`" */ - 0x63, 0xb8, 0xa6, 0xa5, 0x94, 0x83, 0x71, 0x60, - 0x0, - - /* U+0061 "a" */ - 0x0, 0x6b, 0xef, 0xd9, 0x10, 0xb, 0xfa, 0x66, - 0x8e, 0xe1, 0x4f, 0x80, 0x0, 0x2, 0xf7, 0x6, - 0x0, 0x0, 0x11, 0xe9, 0x2, 0x9d, 0xff, 0xff, - 0xf9, 0x4f, 0xf9, 0x65, 0x44, 0xe9, 0xde, 0x10, - 0x0, 0x0, 0xd9, 0xeb, 0x0, 0x0, 0x6, 0xf9, - 0x9f, 0x95, 0x58, 0xdf, 0xf9, 0x6, 0xdf, 0xfd, - 0x92, 0xb7, - - /* U+0062 "b" */ - 0x85, 0x0, 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, - 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe9, - 0x0, 0x0, 0x0, 0x0, 0xea, 0x1a, 0xee, 0xb3, - 0x0, 0xec, 0xee, 0x89, 0xff, 0x50, 0xef, 0xc0, - 0x0, 0x2e, 0xe0, 0xef, 0x30, 0x0, 0x6, 0xf4, - 0xee, 0x0, 0x0, 0x1, 0xf6, 0xed, 0x0, 0x0, - 0x1, 0xf6, 0xef, 0x0, 0x0, 0x3, 0xf5, 0xef, - 0x70, 0x0, 0xa, 0xf1, 0xef, 0xf6, 0x11, 0x8f, - 0x90, 0xe9, 0x8f, 0xff, 0xfb, 0x0, 0x32, 0x2, - 0x66, 0x30, 0x0, - - /* U+0063 "c" */ - 0x0, 0x5b, 0xef, 0xc6, 0x0, 0x9, 0xfc, 0x77, - 0xbf, 0xa0, 0x5f, 0x80, 0x0, 0x7, 0xf5, 0xbe, - 0x0, 0x0, 0x0, 0x94, 0xea, 0x0, 0x0, 0x0, - 0x0, 0xea, 0x0, 0x0, 0x0, 0x0, 0xcd, 0x0, - 0x0, 0x0, 0x62, 0x7f, 0x40, 0x0, 0x6, 0xf5, - 0xd, 0xf8, 0x33, 0x8f, 0xc0, 0x1, 0x9f, 0xff, - 0xfa, 0x10, 0x0, 0x0, 0x33, 0x0, 0x0, - - /* U+0064 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x1e, 0x20, 0x0, 0x0, - 0x0, 0x3, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0x50, 0x0, 0x5a, 0xc9, 0x43, 0xf5, 0x0, 0x9f, - 0xda, 0xcf, 0xbf, 0x50, 0x6f, 0x50, 0x0, 0x3e, - 0xf5, 0xc, 0xb0, 0x0, 0x0, 0x5f, 0x50, 0xf8, - 0x0, 0x0, 0x3, 0xf5, 0xf, 0x80, 0x0, 0x0, - 0x3f, 0x50, 0xda, 0x0, 0x0, 0x3, 0xf5, 0x8, - 0xf2, 0x0, 0x0, 0xaf, 0x50, 0x1d, 0xe8, 0x46, - 0xbf, 0xf5, 0x0, 0x9, 0xef, 0xe9, 0x2e, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+0065 "e" */ - 0x0, 0x6, 0x88, 0x50, 0x0, 0x3, 0xef, 0xde, - 0xfd, 0x30, 0x2e, 0xd1, 0x0, 0x4d, 0xe1, 0x8f, - 0x10, 0x0, 0x2, 0xf8, 0xcc, 0x11, 0x11, 0x11, - 0xcd, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0x44, - 0x44, 0x44, 0x42, 0x9f, 0x10, 0x0, 0x1, 0x70, - 0x3f, 0xa0, 0x0, 0xb, 0xf2, 0x7, 0xfe, 0xaa, - 0xef, 0x90, 0x0, 0x28, 0xbc, 0xa5, 0x0, - - /* U+0066 "f" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xae, 0xf6, - 0x0, 0xd, 0xf9, 0x72, 0x0, 0x1f, 0x70, 0x0, - 0x0, 0x2f, 0x50, 0x0, 0xbf, 0xff, 0xff, 0xf5, - 0x47, 0x8f, 0xa7, 0x71, 0x0, 0x2f, 0x50, 0x0, - 0x0, 0x2f, 0x50, 0x0, 0x0, 0x2f, 0x50, 0x0, - 0x0, 0x2f, 0x50, 0x0, 0x0, 0x2f, 0x50, 0x0, - 0x0, 0x2f, 0x50, 0x0, 0x0, 0x2f, 0x50, 0x0, - 0x0, 0x1e, 0x30, 0x0, - - /* U+0067 "g" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x2a, - 0xef, 0xeb, 0x58, 0xf8, 0x1, 0xec, 0x42, 0x38, - 0xff, 0x70, 0x6, 0xf4, 0x0, 0x0, 0xec, 0x0, - 0x4, 0xfc, 0x42, 0x38, 0xfa, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x9f, 0x65, 0x42, - 0x0, 0x0, 0x4, 0xf8, 0x0, 0x1, 0x0, 0x0, - 0x3, 0xfe, 0xdf, 0xff, 0xfc, 0x20, 0x3, 0xea, - 0x65, 0x44, 0x6f, 0xb0, 0xd, 0xa0, 0x0, 0x0, - 0xd, 0xd0, 0xc, 0xe8, 0x55, 0x56, 0xbf, 0x60, - 0x0, 0x7b, 0xef, 0xfe, 0xa4, 0x0, - - /* U+0068 "h" */ - 0xc6, 0x0, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xf9, - 0x3, 0x66, 0x30, 0x0, 0xfb, 0xcf, 0xef, 0xfc, - 0x20, 0xff, 0xb2, 0x0, 0x4e, 0xc0, 0xfe, 0x0, - 0x0, 0x7, 0xf1, 0xfa, 0x0, 0x0, 0x6, 0xf2, - 0xf9, 0x0, 0x0, 0x6, 0xf2, 0xf9, 0x0, 0x0, - 0x6, 0xf2, 0xf9, 0x0, 0x0, 0x6, 0xf2, 0xf9, - 0x0, 0x0, 0x6, 0xf2, 0xe9, 0x0, 0x0, 0x4, - 0xe1, 0x94, 0x0, 0x0, 0x0, 0x0, - - /* U+0069 "i" */ - 0x7, 0x50, 0xfc, 0x1, 0x10, 0x0, 0xa, 0x60, - 0xfa, 0xf, 0xa0, 0xfa, 0xf, 0xa0, 0xfa, 0xf, - 0xa0, 0xfa, 0xf, 0xa0, 0xea, 0x7, 0x40, - - /* U+006A "j" */ - 0x0, 0xc, 0x70, 0x0, 0xb7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, 0xf9, 0x0, - 0xf, 0x90, 0x0, 0xf9, 0x0, 0xf, 0x90, 0x0, - 0xf9, 0x0, 0xf, 0x90, 0x0, 0xf9, 0x0, 0xf, - 0x90, 0x0, 0xf9, 0x17, 0x9f, 0x84, 0xff, 0xd2, - - /* U+006B "k" */ - 0xe, 0x50, 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, - 0x0, 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0xf, - 0x70, 0x0, 0x9, 0xa0, 0xf, 0x70, 0x1, 0xcf, - 0x50, 0xf, 0x70, 0x2d, 0xf4, 0x0, 0xf, 0x73, - 0xee, 0x30, 0x0, 0xf, 0xbf, 0xf3, 0x0, 0x0, - 0xf, 0xfb, 0xec, 0x0, 0x0, 0xf, 0xa0, 0x3f, - 0xb0, 0x0, 0xf, 0x70, 0x5, 0xf9, 0x0, 0xf, - 0x70, 0x0, 0x7f, 0x70, 0xf, 0x70, 0x0, 0x9, - 0xf5, 0xe, 0x50, 0x0, 0x0, 0xac, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+006C "l" */ - 0x62, 0xe8, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, - 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xe8, 0x52, - - /* U+006D "m" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0xc, 0x78, - 0xff, 0xd3, 0x4c, 0xfe, 0x80, 0xef, 0xc4, 0x4d, - 0xff, 0x95, 0x8f, 0x9e, 0xc0, 0x0, 0x5f, 0x90, - 0x0, 0xae, 0xe9, 0x0, 0x3, 0xf5, 0x0, 0x8, - 0xfe, 0x90, 0x0, 0x3f, 0x50, 0x0, 0x8f, 0xe9, - 0x0, 0x3, 0xf5, 0x0, 0x8, 0xfe, 0x90, 0x0, - 0x3f, 0x50, 0x0, 0x8f, 0xe9, 0x0, 0x3, 0xf5, - 0x0, 0x8, 0xfe, 0x90, 0x0, 0x3f, 0x50, 0x0, - 0x8f, 0xd8, 0x0, 0x2, 0xf3, 0x0, 0x6, 0xd2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+006E "n" */ - 0x2, 0x10, 0x0, 0x0, 0x0, 0xf, 0x82, 0xae, - 0xfd, 0x70, 0xf, 0xdf, 0x93, 0x29, 0xf7, 0xf, - 0xf3, 0x0, 0x0, 0xdc, 0xf, 0x80, 0x0, 0x0, - 0xae, 0xf, 0x80, 0x0, 0x0, 0xae, 0xf, 0x80, - 0x0, 0x0, 0xae, 0xf, 0x80, 0x0, 0x0, 0xae, - 0xf, 0x80, 0x0, 0x0, 0xae, 0xf, 0x80, 0x0, - 0x0, 0xae, 0xf, 0x70, 0x0, 0x0, 0x8b, 0x3, - 0x10, 0x0, 0x0, 0x0, - - /* U+006F "o" */ - 0x0, 0x5, 0xcf, 0xea, 0x20, 0x0, 0x9, 0xfc, - 0x78, 0xef, 0x40, 0x5, 0xf7, 0x0, 0x1, 0xce, - 0x0, 0xcc, 0x0, 0x0, 0x2, 0xf6, 0xf, 0x80, - 0x0, 0x0, 0xe, 0x90, 0xf8, 0x0, 0x0, 0x0, - 0xe9, 0xc, 0xc0, 0x0, 0x0, 0x3f, 0x60, 0x5f, - 0x70, 0x0, 0x1c, 0xe1, 0x0, 0x9f, 0xc8, 0x9e, - 0xf4, 0x0, 0x0, 0x5c, 0xfe, 0xa2, 0x0, - - /* U+0070 "p" */ - 0x20, 0x0, 0x33, 0x0, 0x0, 0xe9, 0xaf, 0xff, - 0xf7, 0x0, 0xff, 0xc4, 0x12, 0x9f, 0x60, 0xfc, - 0x0, 0x0, 0xb, 0xd0, 0xf9, 0x0, 0x0, 0x6, - 0xf0, 0xf9, 0x0, 0x0, 0x4, 0xf2, 0xf9, 0x0, - 0x0, 0x5, 0xf1, 0xf9, 0x0, 0x0, 0x8, 0xe0, - 0xff, 0x50, 0x0, 0x1e, 0x90, 0xfe, 0xfb, 0x66, - 0xdd, 0x0, 0xf9, 0x4c, 0xfe, 0x80, 0x0, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0xc7, 0x0, 0x0, 0x0, - 0x0, - - /* U+0071 "q" */ - 0x0, 0x0, 0x44, 0x20, 0x3, 0x0, 0x6, 0xff, - 0xff, 0xc8, 0xf1, 0x4, 0xfa, 0x21, 0x4b, 0xff, - 0x20, 0xcd, 0x0, 0x0, 0xa, 0xf2, 0xf, 0x80, - 0x0, 0x0, 0x7f, 0x20, 0xf6, 0x0, 0x0, 0x7, - 0xf2, 0xf, 0x70, 0x0, 0x0, 0x7f, 0x20, 0xda, - 0x0, 0x0, 0x7, 0xf2, 0x7, 0xf2, 0x0, 0x3, - 0xef, 0x20, 0xc, 0xe7, 0x6a, 0xfd, 0xf2, 0x0, - 0x8, 0xef, 0xc6, 0x7f, 0x20, 0x0, 0x0, 0x0, - 0x7, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x5e, 0x0, - - /* U+0072 "r" */ - 0x0, 0x0, 0x0, 0xc, 0x81, 0x7e, 0xf7, 0xee, - 0xfe, 0x86, 0x2e, 0xd5, 0x0, 0x0, 0xe9, 0x0, - 0x0, 0xe, 0x90, 0x0, 0x0, 0xe9, 0x0, 0x0, - 0xe, 0x90, 0x0, 0x0, 0xe9, 0x0, 0x0, 0xe, - 0x90, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, - - /* U+0073 "s" */ - 0x0, 0x19, 0xef, 0xec, 0x50, 0x0, 0x3f, 0xd7, - 0x56, 0xbf, 0xa0, 0x9, 0xe0, 0x0, 0x0, 0x6f, - 0x30, 0x8f, 0x40, 0x0, 0x0, 0x40, 0x1, 0x9f, - 0xfc, 0x96, 0x10, 0x0, 0x0, 0x3, 0x7a, 0xdf, - 0xa0, 0x7, 0x10, 0x0, 0x0, 0x4f, 0x81, 0xfb, - 0x0, 0x0, 0x1, 0xe9, 0x6, 0xfd, 0x75, 0x58, - 0xef, 0x20, 0x3, 0xbe, 0xff, 0xd9, 0x20, - - /* U+0074 "t" */ - 0x0, 0x7, 0x0, 0x0, 0x0, 0x3f, 0x40, 0x0, - 0x0, 0x3f, 0x40, 0x0, 0x0, 0x3f, 0x40, 0x0, - 0xdf, 0xff, 0xff, 0xf4, 0x47, 0x9f, 0x97, 0x60, - 0x0, 0x3f, 0x40, 0x0, 0x0, 0x3f, 0x40, 0x0, - 0x0, 0x3f, 0x40, 0x0, 0x0, 0x3f, 0x40, 0x0, - 0x0, 0x3f, 0x40, 0x0, 0x0, 0x3f, 0x40, 0x0, - 0x0, 0x3f, 0xb7, 0x71, 0x0, 0xc, 0xff, 0xf5, - - /* U+0075 "u" */ - 0x83, 0x0, 0x0, 0x2, 0x90, 0xf8, 0x0, 0x0, - 0x6, 0xf1, 0xf8, 0x0, 0x0, 0x6, 0xf2, 0xf8, - 0x0, 0x0, 0x6, 0xf2, 0xf8, 0x0, 0x0, 0x6, - 0xf2, 0xf8, 0x0, 0x0, 0x6, 0xf2, 0xf8, 0x0, - 0x0, 0x6, 0xf2, 0xf8, 0x0, 0x0, 0x9, 0xf2, - 0xeb, 0x0, 0x0, 0x2f, 0xf2, 0x8f, 0x94, 0x59, - 0xfc, 0xf2, 0x5, 0xcf, 0xfc, 0x55, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+0076 "v" */ - 0x3, 0x0, 0x0, 0x0, 0x2, 0x20, 0xf9, 0x0, - 0x0, 0x0, 0xec, 0xb, 0xf1, 0x0, 0x0, 0x5f, - 0x60, 0x4f, 0x80, 0x0, 0xc, 0xf0, 0x0, 0xce, - 0x0, 0x2, 0xf9, 0x0, 0x5, 0xf5, 0x0, 0x9f, - 0x20, 0x0, 0xe, 0xc0, 0xf, 0xb0, 0x0, 0x0, - 0x7f, 0x36, 0xf4, 0x0, 0x0, 0x1, 0xfa, 0xdd, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x1d, 0xb0, 0x0, 0x0, - - /* U+0077 "w" */ - 0x5, 0x20, 0x0, 0x2, 0x30, 0x0, 0x1, 0x60, - 0xd, 0xb0, 0x0, 0xb, 0xd0, 0x0, 0x9, 0xf0, - 0x8, 0xf1, 0x0, 0xf, 0xf3, 0x0, 0xe, 0xa0, - 0x2, 0xf7, 0x0, 0x4f, 0xf8, 0x0, 0x4f, 0x50, - 0x0, 0xcd, 0x0, 0x9c, 0xcd, 0x0, 0x9e, 0x0, - 0x0, 0x6f, 0x30, 0xe8, 0x7f, 0x20, 0xe9, 0x0, - 0x0, 0x1f, 0x92, 0xf3, 0x2f, 0x74, 0xf3, 0x0, - 0x0, 0xb, 0xf8, 0xe0, 0xd, 0xcb, 0xd0, 0x0, - 0x0, 0x5, 0xff, 0x90, 0x8, 0xff, 0x80, 0x0, - 0x0, 0x0, 0xef, 0x40, 0x3, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x5a, 0x0, 0x0, 0x97, 0x0, 0x0, - - /* U+0078 "x" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb0, 0x0, - 0x2, 0xe4, 0x6, 0xf9, 0x0, 0xd, 0xf2, 0x0, - 0xaf, 0x50, 0x9f, 0x60, 0x0, 0xd, 0xf8, 0xfa, - 0x0, 0x0, 0x2, 0xff, 0xd0, 0x0, 0x0, 0x0, - 0xdf, 0x90, 0x0, 0x0, 0x9, 0xfd, 0xf5, 0x0, - 0x0, 0x5f, 0xa0, 0xdf, 0x20, 0x2, 0xfd, 0x0, - 0x2f, 0xd0, 0xc, 0xf2, 0x0, 0x6, 0xf8, 0x6, - 0x30, 0x0, 0x0, 0x74, - - /* U+0079 "y" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, 0x0, - 0x0, 0xe9, 0xaf, 0x10, 0x0, 0x6, 0xf4, 0x2f, - 0x90, 0x0, 0xd, 0xd0, 0xa, 0xf1, 0x0, 0x5f, - 0x50, 0x2, 0xf9, 0x0, 0xde, 0x0, 0x0, 0xaf, - 0x14, 0xf7, 0x0, 0x0, 0x2f, 0x8c, 0xe0, 0x0, - 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x2, 0xff, - 0x10, 0x0, 0x0, 0x2, 0xf9, 0x0, 0x0, 0x7, - 0x8d, 0xf1, 0x0, 0x0, 0x2f, 0xfe, 0x50, 0x0, - 0x0, - - /* U+007A "z" */ - 0xb, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x36, 0x66, - 0x67, 0xff, 0x50, 0x0, 0x0, 0x0, 0x7f, 0x70, - 0x0, 0x0, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x0, - 0x4f, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, - 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x0, 0x0, 0x1e, - 0xe1, 0x0, 0x0, 0x0, 0xb, 0xfc, 0x77, 0x77, - 0x76, 0x10, 0xcf, 0xff, 0xff, 0xff, 0xf3, - - /* U+007B "{" */ - 0x0, 0x0, 0x10, 0x1, 0xc5, 0x0, 0x99, 0x0, - 0xd, 0x70, 0x0, 0xe8, 0x0, 0xb, 0x90, 0x0, - 0x9b, 0x0, 0x8, 0x90, 0x0, 0xb3, 0x1, 0x75, - 0x0, 0x38, 0x20, 0x0, 0xa, 0x10, 0x0, 0x78, - 0x0, 0x8, 0xa0, 0x0, 0xa9, 0x0, 0xd, 0x80, - 0x0, 0xd7, 0x0, 0xb, 0x80, 0x0, 0x3d, 0x10, - 0x0, 0x36, - - /* U+007C "|" */ - 0x25, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, - 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, - 0x4a, 0x4a, 0x4a, 0x4a, - - /* U+007D "}" */ - 0x2, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0xc6, - 0x0, 0x0, 0xaa, 0x0, 0x0, 0xba, 0x0, 0x0, - 0xd8, 0x0, 0x0, 0xe5, 0x0, 0x0, 0xc4, 0x0, - 0x0, 0x68, 0x0, 0x0, 0x6, 0x60, 0x0, 0x5, - 0x71, 0x0, 0x58, 0x0, 0x0, 0xc4, 0x0, 0x0, - 0xd5, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xc9, 0x0, - 0x0, 0xaa, 0x0, 0x0, 0xc8, 0x0, 0x3, 0xd1, - 0x0, 0x7, 0x10, 0x0, - - /* U+007E "~" */ - 0x0, 0x0, 0x0, 0x0, 0x3, 0xec, 0x30, 0x55, - 0x1b, 0x59, 0xfe, 0xa0, 0x20, 0x0, 0x25, 0x0, - - /* U+4E2D "中" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbe, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x88, 0x88, 0x88, 0xdf, - 0x88, 0x88, 0x88, 0x60, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0x40, 0x0, - 0x0, 0xbe, 0x0, 0x0, 0x2, 0xfa, 0x8f, 0x10, - 0x0, 0x0, 0xbe, 0x0, 0x0, 0x0, 0xeb, 0x8f, - 0x10, 0x0, 0x0, 0xbe, 0x0, 0x0, 0x0, 0xeb, - 0x8f, 0x10, 0x0, 0x0, 0xbe, 0x0, 0x0, 0x0, - 0xeb, 0x8f, 0x10, 0x0, 0x0, 0xbe, 0x0, 0x0, - 0x0, 0xeb, 0x8f, 0x10, 0x0, 0x0, 0xbe, 0x0, - 0x0, 0x0, 0xeb, 0x8f, 0x10, 0x0, 0x0, 0xbe, - 0x0, 0x0, 0x0, 0xfa, 0x7f, 0xca, 0xaa, 0xaa, - 0xef, 0xaa, 0xaa, 0xab, 0xf8, 0x1c, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xbe, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, - 0x0, 0x0, 0x0, 0x0, - - /* U+4EAE "亮" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x38, 0x88, 0x88, 0x88, 0xfe, - 0x88, 0x88, 0x88, 0x85, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x1, 0x11, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x7f, 0x44, 0x44, 0x44, 0x44, 0x44, - 0xea, 0x0, 0x0, 0x7, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xa0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x35, - 0x66, 0x66, 0x66, 0x66, 0x64, 0x0, 0x0, 0x3, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0xbe, 0x21, 0x12, 0x56, 0x66, 0x52, - 0x11, 0x12, 0xdb, 0xb, 0xd0, 0x0, 0x7f, 0xff, - 0xff, 0x90, 0x0, 0xf, 0x80, 0x57, 0x0, 0xb, - 0xe0, 0x0, 0xdb, 0x0, 0x0, 0x91, 0x0, 0x0, - 0x4, 0xf9, 0x0, 0xc, 0xc0, 0x0, 0x1, 0x30, - 0x0, 0x5, 0xfe, 0x10, 0x0, 0xcc, 0x0, 0x0, - 0x9f, 0x0, 0x6c, 0xfe, 0x30, 0x0, 0x9, 0xfa, - 0x77, 0x8f, 0xc0, 0x7f, 0xd7, 0x10, 0x0, 0x0, - 0x1a, 0xdf, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4EE5 "以" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe5, 0xb, 0xd1, 0x0, 0x0, 0x0, - 0xa, 0x90, 0x0, 0x1f, 0x80, 0x4f, 0xd0, 0x0, - 0x0, 0x0, 0xdc, 0x0, 0x1, 0xf8, 0x0, 0x6f, - 0xb0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x1f, 0x80, - 0x0, 0x9f, 0x80, 0x0, 0x0, 0xeb, 0x0, 0x1, - 0xf8, 0x0, 0x0, 0xcf, 0x40, 0x0, 0xf, 0xa0, - 0x0, 0x1f, 0x80, 0x0, 0x2, 0xfd, 0x0, 0x1, - 0xf8, 0x0, 0x1, 0xf8, 0x0, 0x0, 0x4, 0x70, - 0x0, 0x3f, 0x60, 0x0, 0x1f, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xf3, 0x0, 0x1, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x1f, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, - 0x1, 0xf8, 0x0, 0x0, 0x9, 0xe0, 0x5, 0xf7, - 0x0, 0x0, 0x1f, 0x80, 0x0, 0x4e, 0xfb, 0x0, - 0xdf, 0xe2, 0x0, 0x1, 0xf8, 0x2, 0xbf, 0xe6, - 0x0, 0x9f, 0xaf, 0xd0, 0x0, 0x1f, 0xaa, 0xff, - 0x91, 0x0, 0x9f, 0x80, 0x5f, 0xa0, 0x5, 0xff, - 0xf9, 0x10, 0x17, 0xef, 0x60, 0x0, 0x9f, 0x60, - 0x5b, 0x73, 0x68, 0xcf, 0xfb, 0x20, 0x0, 0x0, - 0xde, 0x0, 0x0, 0xdf, 0xfd, 0x82, 0x0, 0x0, - 0x0, 0x3, 0xe1, 0x0, 0x3, 0x42, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+4F4D "位" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb8, 0x0, 0x0, 0x8e, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf8, 0x0, - 0x0, 0x4f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xf5, 0x9a, 0xaa, 0xaf, 0xfa, 0xaa, 0xaa, 0x70, - 0x0, 0xc, 0xe3, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x4, - 0x0, 0x0, 0x0, 0x2, 0x70, 0x0, 0x6, 0xff, - 0xa0, 0xf, 0x80, 0x0, 0x0, 0xa, 0xf0, 0x0, - 0x2f, 0xdf, 0xa0, 0xb, 0xd0, 0x0, 0x0, 0xc, - 0xe0, 0x0, 0x6f, 0x2f, 0xa0, 0x7, 0xf2, 0x0, - 0x0, 0xf, 0xb0, 0x0, 0x1, 0xf, 0xa0, 0x3, - 0xf6, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x0, 0xf, - 0xa0, 0x0, 0xf9, 0x0, 0x0, 0x5f, 0x50, 0x0, - 0x0, 0xf, 0xa0, 0x0, 0xdd, 0x0, 0x0, 0x8f, - 0x20, 0x0, 0x0, 0xf, 0xa0, 0x0, 0xaf, 0x0, - 0x0, 0xcf, 0x0, 0x0, 0x0, 0xf, 0xa0, 0x0, - 0x6f, 0x20, 0x0, 0xfb, 0x0, 0x0, 0x0, 0xf, - 0xa0, 0x0, 0x2d, 0x10, 0x4, 0xf8, 0x0, 0x0, - 0x0, 0xf, 0xa0, 0x0, 0x0, 0x0, 0x8, 0xf4, - 0x0, 0x0, 0x0, 0xf, 0xa6, 0xbb, 0xbb, 0xbb, - 0xbe, 0xfc, 0xbb, 0xb3, 0x0, 0xc, 0x77, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd3, - - /* U+5165 "入" */ - 0x0, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xdf, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0x3f, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xea, 0xc, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xf3, 0x6, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xa0, 0x0, - 0xed, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, - 0x10, 0x0, 0x7f, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xf6, 0x0, 0x0, 0xe, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xa0, 0x0, 0x0, 0x5, 0xfc, - 0x0, 0x0, 0x0, 0x6, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0x90, 0x0, 0x0, 0x7f, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xf7, 0x0, 0x9, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0x60, - 0x8f, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2e, 0xf4, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x92, - - /* U+5173 "关" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, - 0x0, 0xa9, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, - 0x0, 0x0, 0x7, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xf6, 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0x20, 0x1, 0xed, 0x10, - 0x0, 0x0, 0x1, 0x77, 0x77, 0x9f, 0x97, 0x7a, - 0xf9, 0x77, 0x77, 0x30, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xf, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x70, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x3, 0x77, - 0x77, 0x77, 0xef, 0xfb, 0x77, 0x77, 0x77, 0x50, - 0x0, 0x0, 0x0, 0x2, 0xf8, 0xbe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xe1, 0x2f, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0x40, 0x7, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1b, 0xf6, 0x0, 0x0, 0xaf, 0x90, 0x0, 0x0, - 0x0, 0x7, 0xef, 0x50, 0x0, 0x0, 0x9, 0xfd, - 0x50, 0x0, 0x6, 0xef, 0xc2, 0x0, 0x0, 0x0, - 0x0, 0x5e, 0xfe, 0x70, 0xe, 0xc5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x8d, 0xd0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5207 "切" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xb6, 0x0, 0x1, 0x89, 0x99, - 0x99, 0x98, 0x60, 0x0, 0xe, 0x90, 0x0, 0x4e, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xe9, 0x0, - 0x0, 0x0, 0xc, 0xd0, 0x1, 0xf8, 0x2, 0x4f, - 0xb6, 0x78, 0x94, 0x0, 0xdc, 0x0, 0xd, 0x90, - 0xff, 0xff, 0xff, 0xed, 0x60, 0xe, 0xb0, 0x0, - 0xe9, 0x3, 0x3f, 0x80, 0x0, 0x0, 0x0, 0xfa, - 0x0, 0xe, 0x90, 0x0, 0xf7, 0x0, 0x0, 0x0, - 0xf, 0x90, 0x0, 0xe8, 0x0, 0xf, 0x70, 0x0, - 0x0, 0x1, 0xf8, 0x0, 0xf, 0x80, 0x1, 0xf6, - 0x0, 0x0, 0x0, 0x3f, 0x50, 0x0, 0xf7, 0x0, - 0x2f, 0x60, 0x0, 0x2, 0x6, 0xf2, 0x0, 0x1f, - 0x60, 0x2, 0xf6, 0x0, 0x5d, 0xe0, 0xce, 0x0, - 0x2, 0xf5, 0x0, 0x2f, 0xb9, 0xef, 0xe4, 0x5f, - 0x90, 0x0, 0x3f, 0x40, 0x0, 0xef, 0xfa, 0x50, - 0x1e, 0xf2, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x10, - 0x0, 0x2d, 0xf5, 0x0, 0x0, 0x7f, 0x0, 0x0, - 0x0, 0x4, 0xaf, 0xd3, 0x0, 0x0, 0xd, 0xc0, - 0x0, 0x4, 0xbf, 0xfe, 0x70, 0x9, 0xeb, 0x9d, - 0xf4, 0x0, 0x0, 0x8e, 0xa5, 0x0, 0x0, 0x4b, - 0xef, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+542F "启" */ - 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x25, 0x66, 0x66, 0xfc, 0x55, - 0x55, 0x55, 0x10, 0x2, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x5, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1a, 0xf0, 0x5, 0xf2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xf1, 0x5, 0xf8, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x7d, 0xf0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, - 0x5, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xf1, 0x25, 0x55, 0x55, 0x55, 0x55, - 0x53, 0x0, 0x6, 0xf3, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x7, 0xf6, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xe0, 0x9, 0xf6, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xf0, 0xb, 0xd6, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xf0, 0xe, 0xa6, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x4f, - 0x66, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf0, - 0xbf, 0x14, 0xfb, 0x55, 0x55, 0x55, 0x55, 0x6e, - 0xe0, 0xd8, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+56FA "固" */ - 0x9, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x4f, 0xb7, 0x77, 0x77, 0x98, 0x77, 0x77, - 0x7c, 0xf4, 0x6f, 0x20, 0x0, 0x0, 0xda, 0x0, - 0x0, 0x2, 0xf7, 0x7f, 0x26, 0x66, 0x66, 0xed, - 0x66, 0x66, 0x60, 0xf8, 0x7f, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0xf8, 0x7f, 0x10, 0x0, - 0x0, 0xeb, 0x0, 0x0, 0x0, 0xf8, 0x7f, 0x10, - 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, 0xf8, 0x7f, - 0x10, 0x27, 0x88, 0xfd, 0x88, 0x73, 0x0, 0xf8, - 0x7f, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0xf8, 0x7f, 0x16, 0xf3, 0x0, 0x0, 0x0, 0x5f, - 0x50, 0xf8, 0x7f, 0x16, 0xf1, 0x0, 0x0, 0x0, - 0x1f, 0x60, 0xf8, 0x7f, 0x16, 0xf1, 0x0, 0x0, - 0x0, 0x2f, 0x60, 0xf8, 0x7f, 0x14, 0xfb, 0x88, - 0x88, 0x88, 0xcf, 0x40, 0xf8, 0x7f, 0x10, 0xaf, - 0xff, 0xff, 0xff, 0xea, 0x0, 0xf8, 0x6f, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf7, 0x3f, - 0xd8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8c, 0xf4, - 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, - - /* U+58F0 "声" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x77, 0x77, 0x77, - 0x7a, 0xf8, 0x77, 0x77, 0x77, 0x40, 0xb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0x66, 0x66, 0x6a, 0xf7, - 0x66, 0x66, 0x62, 0x0, 0x0, 0x4e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0xf, 0xb4, 0x44, 0x48, 0xf6, - 0x44, 0x44, 0xdc, 0x0, 0x0, 0xf, 0x70, 0x0, - 0x4, 0xf2, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xf, - 0xb7, 0x77, 0x79, 0xf8, 0x77, 0x77, 0xdc, 0x0, - 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe6, 0x0, 0x0, 0x2f, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xec, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5B9A "定" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xe4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x57, 0x77, 0x77, 0x8f, - 0xd7, 0x77, 0x77, 0x64, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x9, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x90, - 0x9e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xf7, 0x8, 0xd0, 0x67, 0x77, 0x77, 0x77, 0x77, - 0x73, 0x5f, 0x30, 0x0, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xa1, 0x60, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x80, 0x0, 0xae, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xbe, 0x0, 0xa, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xb0, 0x0, 0xaf, 0x99, 0x99, - 0x99, 0x30, 0x0, 0x1, 0xf8, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xf7, 0x0, 0x0, 0x6f, 0x80, 0x0, - 0xae, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0x10, 0xa, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xf6, 0xed, 0x20, 0xae, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xfc, 0x2, 0xef, 0x9c, 0xe0, 0x0, 0x0, - 0x0, 0x1, 0xee, 0x10, 0x1, 0xaf, 0xff, 0xfe, - 0xcb, 0xbb, 0xb5, 0x1c, 0x30, 0x0, 0x0, 0x15, - 0x8a, 0xcd, 0xef, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5C4F "屏" */ - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x0, 0x0, 0xcd, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x9f, 0x20, 0x0, 0xcb, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x7f, 0x20, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0xca, 0x11, 0x9c, 0x11, 0x11, 0x11, 0x3f, - 0x40, 0x0, 0x0, 0xda, 0x0, 0x3f, 0xb0, 0x0, - 0x1, 0xdd, 0x0, 0x0, 0x0, 0xda, 0x0, 0x4, - 0xf8, 0x0, 0x1c, 0xe2, 0x0, 0x0, 0x0, 0xd9, - 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0xe8, 0x3, 0x44, 0xea, 0x44, 0x44, 0xaf, - 0x43, 0x0, 0x0, 0xe8, 0x0, 0x0, 0xe8, 0x0, - 0x0, 0x8e, 0x0, 0x0, 0x0, 0xf7, 0x35, 0x55, - 0xfa, 0x55, 0x55, 0xaf, 0x55, 0x40, 0x1, 0xf5, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x4, 0xf2, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x8e, - 0x0, 0x0, 0x8, 0xf0, 0x0, 0xd, 0xb0, 0x0, - 0x0, 0x8e, 0x0, 0x0, 0xd, 0xb0, 0x0, 0x8f, - 0x20, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x2f, 0x50, - 0x6, 0xf6, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, - 0x18, 0x0, 0xe, 0x70, 0x0, 0x0, 0x0, 0x8e, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x25, 0x0, 0x0, - - /* U+5E55 "幕" */ - 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x5b, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x2, 0x22, 0x2a, 0xc2, - 0x22, 0x22, 0x8d, 0x22, 0x22, 0x10, 0x0, 0x5d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa0, 0x0, - 0x0, 0xda, 0x33, 0x33, 0x33, 0x33, 0x33, 0x34, - 0xf5, 0x0, 0x0, 0xea, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x55, 0xf6, 0x0, 0x0, 0xee, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xf6, 0x0, 0x0, 0xda, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x34, 0xf5, 0x0, - 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xc1, 0x0, 0x2, 0x33, 0x33, 0x6f, 0x83, 0x33, - 0x33, 0x33, 0x33, 0x10, 0xe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x1, - 0xae, 0x50, 0xf, 0x40, 0x5, 0xea, 0x10, 0x0, - 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe7, 0x0, 0x5f, 0xef, 0x73, 0x33, 0x4f, 0x73, - 0x33, 0x3c, 0xfc, 0xe1, 0x24, 0x4f, 0x20, 0x0, - 0x1f, 0x50, 0x0, 0x8, 0xe0, 0x30, 0x0, 0x4f, - 0x20, 0x0, 0x1f, 0x50, 0x0, 0x8, 0xe0, 0x0, - 0x0, 0x4f, 0x20, 0x0, 0x1f, 0x50, 0x39, 0x6c, - 0xd0, 0x0, 0x0, 0x1a, 0x0, 0x0, 0xd, 0x30, - 0x4c, 0xee, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5E94 "应" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xf5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x66, 0x66, - 0x67, 0xfb, 0x66, 0x66, 0x66, 0x40, 0x0, 0x5f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x7f, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0xb, 0xa0, - 0x0, 0x0, 0x20, 0x0, 0x0, 0x7f, 0x5, 0x0, - 0x8, 0xf0, 0x0, 0x1, 0xf3, 0x0, 0x0, 0x7f, - 0x3f, 0x30, 0x5, 0xf1, 0x0, 0x4, 0xf3, 0x0, - 0x0, 0x7f, 0xd, 0xa0, 0x2, 0xf4, 0x0, 0x7, - 0xf0, 0x0, 0x0, 0x7f, 0x7, 0xf0, 0x0, 0xf7, - 0x0, 0xb, 0xc0, 0x0, 0x0, 0x8e, 0x1, 0xf6, - 0x0, 0xe9, 0x0, 0xe, 0x90, 0x0, 0x0, 0x9e, - 0x0, 0xbc, 0x0, 0xca, 0x0, 0x2f, 0x50, 0x0, - 0x0, 0xad, 0x0, 0x6f, 0x10, 0xab, 0x0, 0x5f, - 0x10, 0x0, 0x0, 0xbc, 0x0, 0x1f, 0x60, 0xad, - 0x0, 0xad, 0x0, 0x0, 0x0, 0xea, 0x0, 0xd, - 0x90, 0x9d, 0x0, 0xe8, 0x0, 0x0, 0x2, 0xf6, - 0x0, 0x8, 0xa0, 0x12, 0x4, 0xf3, 0x0, 0x0, - 0x9, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xd0, - 0x0, 0x0, 0x1f, 0xa0, 0x57, 0x77, 0x77, 0x77, - 0x7f, 0xc7, 0x77, 0x30, 0x3d, 0x10, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+5EA6 "度" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x66, 0x66, - 0x6a, 0xf8, 0x66, 0x66, 0x66, 0x20, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x0, 0xe9, 0x0, 0xe7, 0x0, 0x0, 0x0, 0xf7, - 0x0, 0x0, 0x0, 0xfa, 0x55, 0xfa, 0x55, 0x55, - 0x55, 0xfa, 0x55, 0x30, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf6, - 0x0, 0xe7, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, - 0x0, 0xf6, 0x0, 0xec, 0x55, 0x55, 0x57, 0xf5, - 0x0, 0x0, 0x0, 0xf6, 0x0, 0x6d, 0xef, 0xff, - 0xfe, 0xa0, 0x0, 0x0, 0x0, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf6, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, - 0x0, 0xf6, 0x6, 0x77, 0x77, 0x77, 0x77, 0x9f, - 0xd0, 0x0, 0x2, 0xf4, 0x1, 0xf7, 0x0, 0x0, - 0x1, 0xdf, 0x30, 0x0, 0x4, 0xf2, 0x0, 0x7f, - 0xd4, 0x0, 0x6e, 0xe3, 0x0, 0x0, 0x8, 0xf0, - 0x0, 0x2, 0xbf, 0xcc, 0xfb, 0x10, 0x0, 0x0, - 0xc, 0xb0, 0x0, 0x1, 0x6e, 0xff, 0xf9, 0x50, - 0x0, 0x0, 0xf, 0x63, 0x8a, 0xdf, 0xfb, 0x53, - 0x8e, 0xff, 0xd9, 0x50, 0x1, 0xa, 0xfc, 0x95, - 0x0, 0x0, 0x0, 0x27, 0xae, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6240 "所" */ - 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0x8a, 0xdf, 0xf3, 0x0, - 0x25, 0x7a, 0xec, 0x0, 0x0, 0xcf, 0xeb, 0x97, - 0x30, 0x1d, 0xff, 0xdb, 0x83, 0x0, 0x0, 0xe8, - 0x0, 0x0, 0x0, 0x6f, 0x30, 0x0, 0x0, 0x0, - 0x0, 0xe9, 0x44, 0x33, 0x0, 0x7e, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xc0, 0x7f, - 0x44, 0x44, 0x44, 0x30, 0x0, 0xe8, 0x0, 0x9, - 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xe7, - 0x0, 0x7, 0xf0, 0x7e, 0x33, 0xaf, 0x33, 0x10, - 0x0, 0xe7, 0x0, 0x7, 0xf0, 0x7e, 0x0, 0x9f, - 0x0, 0x0, 0x0, 0xe8, 0x11, 0x1a, 0xf0, 0x7e, - 0x0, 0x9f, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xb0, 0x8d, 0x0, 0x9f, 0x0, 0x0, 0x1, 0xf9, - 0x55, 0x54, 0x0, 0x9b, 0x0, 0x9f, 0x0, 0x0, - 0x4, 0xf3, 0x0, 0x0, 0x0, 0xd8, 0x0, 0x9f, - 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x3, 0xf4, - 0x0, 0x9f, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, - 0xc, 0xd0, 0x0, 0x9f, 0x0, 0x0, 0x2f, 0x70, - 0x0, 0x1, 0xbf, 0x40, 0x0, 0x9f, 0x0, 0x0, - 0x7f, 0x10, 0x0, 0x2e, 0xf6, 0x0, 0x0, 0x9f, - 0x0, 0x0, 0x24, 0x0, 0x0, 0x5e, 0x50, 0x0, - 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, - - /* U+6309 "按" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, 0xa, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, - 0x33, 0x39, 0xf5, 0x33, 0x31, 0x0, 0x0, 0x8, - 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x1, 0x39, 0xf3, 0xf, 0xa5, 0x55, 0x55, 0x55, - 0x5f, 0x80, 0xc, 0xff, 0xff, 0x7f, 0x60, 0x9, - 0x50, 0x0, 0xf, 0x70, 0x1, 0x4a, 0xf4, 0xf, - 0x50, 0x1f, 0x70, 0x0, 0x2f, 0x30, 0x0, 0x8, - 0xe0, 0x2, 0x0, 0x7f, 0x20, 0x0, 0x3, 0x0, - 0x0, 0x8, 0xe0, 0x1e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x8, 0xe2, 0x36, 0x7a, 0xf9, - 0x77, 0x7f, 0xc7, 0x50, 0x0, 0x8, 0xff, 0x90, - 0xc, 0xd0, 0x0, 0x1f, 0x60, 0x0, 0x6, 0xdf, - 0xf8, 0x0, 0x5f, 0x50, 0x0, 0x6f, 0x10, 0x0, - 0xd, 0xbb, 0xe0, 0x0, 0xdc, 0x0, 0x0, 0xdb, - 0x0, 0x0, 0x0, 0x8, 0xe0, 0x1, 0xfd, 0x30, - 0x7, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, - 0x4d, 0xfb, 0x6f, 0xa0, 0x0, 0x0, 0x0, 0x8, - 0xe0, 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, 0x0, - 0x0, 0x8, 0xe0, 0x0, 0x17, 0xef, 0xbe, 0xfc, - 0x40, 0x0, 0x8, 0x8d, 0xd0, 0x6b, 0xff, 0xc3, - 0x0, 0x7e, 0xfc, 0x40, 0xa, 0xee, 0x55, 0xff, - 0xa3, 0x0, 0x0, 0x0, 0x6e, 0xf0, 0x0, 0x0, - 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6362 "换" */ - 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0x10, 0x0, 0xbf, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x2f, 0x10, 0x8, - 0xf9, 0x55, 0x5b, 0xf4, 0x0, 0x0, 0x0, 0x2f, - 0x10, 0x8f, 0x70, 0x0, 0x3f, 0x90, 0x0, 0x0, - 0x1a, 0xbf, 0xb8, 0xc4, 0x0, 0x3, 0xfa, 0x0, - 0x0, 0x0, 0x7, 0x9f, 0x84, 0x2, 0x44, 0x5f, - 0xd4, 0x44, 0x30, 0x0, 0x0, 0x2f, 0x10, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x2f, - 0x10, 0x8d, 0x0, 0xd, 0x90, 0x0, 0x7e, 0x0, - 0x0, 0x2f, 0x23, 0x8c, 0x0, 0xe, 0x80, 0x0, - 0x6e, 0x0, 0x0, 0x2f, 0xf9, 0x8c, 0x0, 0xf, - 0x70, 0x0, 0x6e, 0x0, 0x9, 0xff, 0x60, 0x8c, - 0x0, 0x1f, 0x50, 0x0, 0x6e, 0x0, 0x2b, 0x7f, - 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, - 0x0, 0x2f, 0x14, 0x66, 0x66, 0xbf, 0xf7, 0x66, - 0x66, 0x61, 0x0, 0x2f, 0x10, 0x0, 0x1, 0xec, - 0xec, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x10, 0x0, - 0xb, 0xe2, 0x3f, 0xb1, 0x0, 0x0, 0x0, 0x2f, - 0x10, 0x3, 0xcf, 0x30, 0x3, 0xfe, 0x50, 0x0, - 0x9, 0x9f, 0x17, 0xdf, 0xc2, 0x0, 0x0, 0x2c, - 0xfd, 0x50, 0xb, 0xfc, 0x1e, 0xb5, 0x0, 0x0, - 0x0, 0x0, 0x5c, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, - - /* U+6539 "改" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb0, - 0x0, 0x0, 0x0, 0xa, 0xcc, 0xcc, 0xa0, 0x0, - 0xd9, 0x0, 0x0, 0x0, 0x0, 0x7a, 0xaa, 0xbf, - 0x50, 0x1f, 0xa6, 0x66, 0x66, 0x50, 0x0, 0x0, - 0x0, 0xe7, 0x6, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0xe, 0x70, 0xbc, 0x0, 0x1, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xe7, 0x2f, 0x60, 0x0, - 0x3f, 0x20, 0x0, 0x16, 0x77, 0x9f, 0x69, 0xf4, - 0x0, 0x7, 0xf0, 0x0, 0xc, 0xff, 0xfe, 0xb2, - 0xfe, 0xd0, 0x0, 0xbb, 0x0, 0x0, 0xf7, 0x0, - 0x0, 0x3b, 0x6f, 0x0, 0xf, 0x50, 0x0, 0xf, - 0x60, 0x0, 0x0, 0x3, 0xf4, 0x6, 0xf0, 0x0, - 0x0, 0xf6, 0x0, 0x0, 0x0, 0xe, 0x90, 0xe9, - 0x0, 0x0, 0xf, 0x60, 0x0, 0x0, 0x0, 0x7f, - 0x9f, 0x10, 0x0, 0x0, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0xef, 0x70, 0x0, 0x0, 0xf, 0x60, 0x3, - 0x30, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0xf9, - 0x9e, 0xfb, 0x0, 0x7f, 0xa6, 0xf8, 0x0, 0x0, - 0x3f, 0xff, 0xa5, 0x2, 0xcf, 0x70, 0x7, 0xfa, - 0x0, 0x2, 0x84, 0x0, 0x4a, 0xfd, 0x30, 0x0, - 0x6, 0xfd, 0x30, 0x0, 0x0, 0xf, 0xc7, 0x0, - 0x0, 0x0, 0x4, 0xef, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, - - /* U+6587 "文" */ - 0x0, 0x0, 0x0, 0x0, 0x3e, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0x88, 0x88, 0x88, - 0x8d, 0xe8, 0x88, 0x88, 0x88, 0x81, 0xd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, - 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x0, 0xce, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, - 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xd, 0xd0, - 0x0, 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xf4, 0x0, 0x0, 0xd, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x6f, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x50, 0x1, - 0xed, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xe1, 0xb, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xfc, 0xbf, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, - 0xd3, 0x5f, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x16, - 0xdf, 0xf8, 0x0, 0x2, 0xcf, 0xe8, 0x10, 0x0, - 0x1b, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x6, 0xef, - 0xfb, 0x40, 0x3f, 0xc7, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xef, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0x40, - - /* U+65CB "旋" */ - 0x0, 0x2, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xb0, 0x0, 0xa, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf5, 0x0, - 0x2f, 0xec, 0xcc, 0xcc, 0xcc, 0x90, 0xb, 0xff, - 0xff, 0xf8, 0xaf, 0xbb, 0xbb, 0xbb, 0xbb, 0x90, - 0x5, 0xaf, 0x97, 0x7d, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0x20, 0x5f, 0xa6, 0xbb, - 0xba, 0xaa, 0xa9, 0x10, 0x0, 0x4f, 0x20, 0x47, - 0x8, 0xcc, 0xef, 0xcc, 0xdf, 0x60, 0x0, 0x4f, - 0xed, 0x80, 0x0, 0x0, 0x8e, 0x0, 0x4f, 0x40, - 0x0, 0x5f, 0xbd, 0xf0, 0x7, 0x20, 0x8e, 0x2, - 0xec, 0x0, 0x0, 0x6f, 0x15, 0xf0, 0xf, 0x70, - 0x8e, 0x5, 0xb1, 0x0, 0x0, 0x7f, 0x5, 0xf1, - 0xf, 0x80, 0x8e, 0x0, 0x0, 0x0, 0x0, 0x9d, - 0x6, 0xf0, 0x1f, 0x80, 0x8f, 0x88, 0x88, 0x10, - 0x0, 0xcb, 0x7, 0xf0, 0x2f, 0x90, 0x8f, 0xff, - 0xfe, 0x50, 0x0, 0xf8, 0x8, 0xf0, 0x6f, 0xd0, - 0x8e, 0x0, 0x0, 0x0, 0x3, 0xf5, 0x9, 0xd0, - 0x9e, 0xf3, 0x8e, 0x0, 0x0, 0x0, 0x7, 0xf1, - 0xb, 0xc0, 0xe9, 0xca, 0x8e, 0x0, 0x0, 0x0, - 0xd, 0xd0, 0xe, 0xa5, 0xf4, 0x3f, 0xde, 0x0, - 0x0, 0x0, 0x3f, 0x76, 0xaf, 0x5c, 0xe0, 0x6, - 0xff, 0xba, 0xa9, 0x81, 0x3e, 0x1c, 0xfa, 0x1f, - 0x70, 0x0, 0x29, 0xce, 0xff, 0xf2, 0x0, 0x0, - 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+66F4 "更" */ - 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x3, 0x77, 0x77, 0x77, 0x7b, 0xf7, - 0x77, 0x77, 0x77, 0x60, 0x0, 0x4, 0x66, 0x66, - 0x6b, 0xf6, 0x66, 0x66, 0x50, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x8f, 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, - 0x9e, 0x0, 0x0, 0x9f, 0x66, 0x66, 0x6b, 0xf6, - 0x66, 0x66, 0xbe, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x9e, - 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, 0x8e, 0x0, - 0x0, 0x8f, 0x10, 0x0, 0x8, 0xf0, 0x0, 0x0, - 0xae, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x2, 0x55, 0x55, - 0x5b, 0xf6, 0x55, 0x55, 0x40, 0x0, 0x0, 0x2, - 0xb1, 0x0, 0xc, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xfc, 0x0, 0x2f, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5f, 0xd4, 0xcf, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, - 0x7c, 0xff, 0xff, 0xea, 0x87, 0x66, 0x66, 0x40, - 0x1f, 0xff, 0xfc, 0x72, 0x15, 0x8b, 0xde, 0xff, - 0xff, 0xf2, 0x4, 0x42, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x11, 0x0, - - /* U+6709 "有" */ - 0x0, 0x0, 0x0, 0xd, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x11, 0x11, 0x8f, 0x51, 0x11, - 0x11, 0x11, 0x11, 0x10, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x4, 0x55, - 0x5c, 0xf5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x40, - 0x0, 0x0, 0x3f, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xa0, 0x0, 0x0, 0x1d, 0xfe, 0x77, - 0x77, 0x77, 0x77, 0x79, 0xf7, 0x0, 0x1, 0xdf, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, - 0x2e, 0xf4, 0xea, 0x44, 0x44, 0x44, 0x44, 0x44, - 0xf8, 0x0, 0x3c, 0x40, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xe9, 0x11, - 0x11, 0x11, 0x11, 0x11, 0xe8, 0x0, 0x0, 0x0, - 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, - 0x0, 0x0, 0xeb, 0x66, 0x66, 0x66, 0x66, 0x66, - 0xf8, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xe8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, - 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, - 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x39, 0x77, - 0xf7, 0x0, 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, - 0x3d, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+6863 "档" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, 0xc, - 0x70, 0x0, 0x0, 0x0, 0x0, 0xf6, 0x1, 0x60, - 0x0, 0xe9, 0x0, 0x1e, 0x30, 0x0, 0xf, 0x60, - 0x3f, 0x50, 0xe, 0x90, 0x8, 0xf1, 0x0, 0x0, - 0xf6, 0x0, 0xbe, 0x0, 0xe9, 0x0, 0xea, 0x0, - 0x66, 0x6f, 0xa6, 0x52, 0xf7, 0xe, 0x90, 0x7f, - 0x20, 0x2e, 0xff, 0xff, 0xfd, 0xa, 0xe0, 0xe9, - 0xe, 0xb0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x1c, - 0x1e, 0x94, 0xf2, 0x0, 0x0, 0xb, 0xfe, 0x10, - 0x0, 0x0, 0xe9, 0x13, 0x0, 0x0, 0x2, 0xff, - 0xfa, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, - 0xad, 0xfa, 0xf6, 0x55, 0x55, 0x55, 0x55, 0x8f, - 0x50, 0x3f, 0x4f, 0x6a, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0xf5, 0xd, 0xb0, 0xf6, 0x16, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0x54, 0xf2, 0xf, 0x60, 0xb, - 0xff, 0xff, 0xff, 0xff, 0xf5, 0x1, 0x0, 0xf6, - 0x0, 0x25, 0x55, 0x55, 0x55, 0x5f, 0x50, 0x0, - 0xf, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf5, - 0x0, 0x0, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0x50, 0x0, 0xf, 0x60, 0x3, 0x55, 0x55, - 0x55, 0x57, 0xf5, 0x0, 0x0, 0xd4, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xfe, 0x10, - - /* U+6B65 "步" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x10, - 0x6, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0x30, 0x6, 0xfa, 0x99, 0x99, 0x80, 0x0, - 0x0, 0x0, 0x6f, 0x30, 0x6, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x6f, 0x30, 0x6, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x30, - 0x6, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, - 0x7, 0x88, 0x88, 0x88, 0x8b, 0xf9, 0x88, 0x88, - 0x88, 0x60, 0x0, 0x0, 0xa, 0x60, 0x6, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x70, - 0x6, 0xf2, 0x0, 0x0, 0xc9, 0x0, 0x0, 0x2, - 0xfd, 0x0, 0x6, 0xf2, 0x0, 0x3, 0xf9, 0x0, - 0x0, 0x2e, 0xf3, 0x0, 0x6, 0xf2, 0x0, 0xa, - 0xf2, 0x0, 0x2, 0xef, 0x50, 0x0, 0x6, 0xf2, - 0x0, 0x4f, 0x90, 0x0, 0xe, 0xf5, 0x0, 0x0, - 0x5, 0xf1, 0x4, 0xfd, 0x0, 0x0, 0x6, 0x30, - 0x0, 0x0, 0x0, 0x11, 0x9f, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x2, 0x99, 0xab, 0xef, 0xff, - 0xa1, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, - 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+7528 "用" */ - 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe5, 0x0, 0xdd, 0x77, 0x77, 0x7f, 0xd7, 0x77, - 0x77, 0xdd, 0x0, 0xe9, 0x0, 0x0, 0xe, 0xb0, - 0x0, 0x0, 0x8e, 0x0, 0xe9, 0x0, 0x0, 0xe, - 0xb0, 0x0, 0x0, 0x8e, 0x0, 0xec, 0x77, 0x77, - 0x7f, 0xd7, 0x77, 0x77, 0xce, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xe9, - 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0x8e, 0x0, - 0xe9, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0x8e, - 0x0, 0xe9, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, - 0x8e, 0x0, 0xed, 0xaa, 0xaa, 0xaf, 0xea, 0xaa, - 0xaa, 0xde, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0xf7, 0x0, 0x0, 0xe, - 0xb0, 0x0, 0x0, 0x8e, 0x2, 0xf5, 0x0, 0x0, - 0xe, 0xb0, 0x0, 0x0, 0x8e, 0x5, 0xf3, 0x0, - 0x0, 0xe, 0xb0, 0x0, 0x0, 0x8e, 0xa, 0xf0, - 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0x8e, 0xf, - 0xb0, 0x0, 0x0, 0xe, 0xb0, 0x26, 0x31, 0xcd, - 0x9, 0x30, 0x0, 0x0, 0xb, 0x70, 0x3b, 0xef, - 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, - - /* U+8282 "节" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x4, - 0xe0, 0x0, 0x0, 0x1, 0x22, 0x26, 0xf3, 0x22, - 0x22, 0x7f, 0x32, 0x22, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3, 0x44, - 0x48, 0xf5, 0x44, 0x44, 0x9f, 0x54, 0x44, 0x20, - 0x0, 0x0, 0x4f, 0x0, 0x0, 0x6, 0xf0, 0x0, - 0x0, 0x0, 0x2, 0x22, 0x42, 0x22, 0x22, 0x26, - 0x10, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x35, 0x55, 0x59, - 0xf6, 0x55, 0x55, 0x7f, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0x20, 0x0, 0x0, 0xea, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xf2, 0x0, 0x0, 0xe, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, - 0xea, 0x0, 0x0, 0x0, 0x0, 0x6, 0xf2, 0x0, - 0x0, 0xe, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0x20, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xf2, 0x1, 0x43, 0x7f, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0x20, 0x8f, 0xff, 0xc1, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xf2, 0x0, 0x33, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+82F1 "英" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x0, 0x0, - 0xc, 0x60, 0x0, 0x0, 0x3, 0x66, 0x66, 0xcd, - 0x66, 0x66, 0x6f, 0xb6, 0x66, 0x50, 0x9, 0xee, - 0xee, 0xff, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xd0, - 0x0, 0x0, 0x0, 0xac, 0x2, 0x10, 0xe, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0xa, 0xb0, - 0x5, 0x20, 0x0, 0x0, 0x0, 0x1, 0x66, 0x77, - 0x7d, 0xd7, 0x77, 0x65, 0x10, 0x0, 0x0, 0xc, - 0xfe, 0xee, 0xef, 0xfe, 0xee, 0xef, 0xc0, 0x0, - 0x0, 0xf, 0x60, 0x0, 0xb, 0xa0, 0x0, 0x7, - 0xf0, 0x0, 0x0, 0xf, 0x60, 0x0, 0xd, 0x90, - 0x0, 0x6, 0xf0, 0x0, 0x0, 0xf, 0x60, 0x0, - 0xf, 0x70, 0x0, 0x6, 0xf0, 0x0, 0x5, 0x6f, - 0xa6, 0x66, 0x7f, 0x96, 0x66, 0x6a, 0xf6, 0x50, - 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x4, 0xf6, 0xbe, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xa0, 0x1e, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7, 0xfd, 0x10, 0x4, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x4, 0xcf, 0xb1, 0x0, 0x0, 0x4f, 0xe5, - 0x0, 0x0, 0x6, 0xdf, 0xd5, 0x0, 0x0, 0x0, - 0x2, 0xcf, 0xe8, 0x20, 0xe, 0xc5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xbf, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, - - /* U+89D2 "角" */ - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xe2, - 0x0, 0x0, 0x0, 0xb, 0xe7, 0x55, 0x55, 0x56, - 0xed, 0x0, 0x0, 0x0, 0xb, 0xf7, 0x55, 0x55, - 0x55, 0xcf, 0x65, 0x40, 0x0, 0x2d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xb, 0xae, - 0xa0, 0x0, 0x3, 0xf3, 0x0, 0x0, 0x8f, 0x0, - 0x0, 0xe8, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x6, - 0xf1, 0x0, 0xe, 0xb6, 0x66, 0x68, 0xf8, 0x66, - 0x66, 0xaf, 0x10, 0x0, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf1, 0x0, 0xf, 0x70, 0x0, - 0x3, 0xf3, 0x0, 0x0, 0x6f, 0x10, 0x0, 0xf7, - 0x0, 0x0, 0x3f, 0x30, 0x0, 0x6, 0xf1, 0x0, - 0x1f, 0x95, 0x55, 0x57, 0xf7, 0x55, 0x55, 0x9f, - 0x10, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf1, 0x0, 0x7f, 0x21, 0x11, 0x14, 0xf4, - 0x11, 0x11, 0x6f, 0x10, 0xd, 0xb0, 0x0, 0x0, - 0x3f, 0x30, 0x0, 0x6, 0xf1, 0x6, 0xf4, 0x0, - 0x0, 0x3, 0xf3, 0x0, 0x0, 0x6f, 0x11, 0xfb, - 0x0, 0x0, 0x0, 0x2f, 0x22, 0x98, 0x7c, 0xf0, - 0x2a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, - 0xe7, 0x0, - - /* U+8BF1 "诱" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xb2, 0x0, 0x0, 0x0, 0x0, - 0x25, 0x7b, 0xe5, 0x0, 0x0, 0xde, 0x20, 0x2b, - 0xdd, 0xff, 0xff, 0xeb, 0x81, 0x0, 0x0, 0x1e, - 0xd0, 0x17, 0x76, 0x57, 0xf2, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xf5, 0x0, 0x0, 0x4, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x16, - 0x66, 0xcf, 0xff, 0x96, 0x66, 0x20, 0x5f, 0xff, - 0x40, 0x0, 0x8, 0xfa, 0xfd, 0xf5, 0x0, 0x0, - 0x5, 0x6d, 0xa0, 0x3, 0xcf, 0x54, 0xf3, 0x9f, - 0xa2, 0x0, 0x0, 0xa, 0xc0, 0xaf, 0xc3, 0x4, - 0xf2, 0x5, 0xef, 0xb0, 0x0, 0xa, 0xb2, 0xb6, - 0x33, 0x33, 0x83, 0x31, 0x7, 0xb1, 0x0, 0xa, - 0xb0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0xb, 0xb0, 0x0, 0x33, 0xeb, 0x33, 0xcf, - 0x10, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x1, 0xf7, - 0x0, 0xee, 0x84, 0x0, 0x0, 0xb, 0xb0, 0x10, - 0x6, 0xf3, 0x1, 0xde, 0xff, 0x0, 0x0, 0xc, - 0xa7, 0xf3, 0xd, 0xd0, 0x0, 0x0, 0x9e, 0x0, - 0x0, 0xe, 0xff, 0x90, 0x9f, 0x40, 0x0, 0x0, - 0xdb, 0x0, 0x0, 0x3f, 0xf6, 0xa, 0xf7, 0x0, - 0x77, 0x7b, 0xf5, 0x0, 0x0, 0x5, 0x10, 0xaf, - 0x70, 0x0, 0xcf, 0xfe, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8BF7 "请" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc5, 0x0, 0x0, 0x0, 0x0, 0xd9, 0x0, 0x4, - 0x66, 0x66, 0xfb, 0x66, 0x66, 0x50, 0x0, 0x6f, - 0xa0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x6, 0xf9, 0x0, 0x0, 0x0, 0xe8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6b, 0x3, 0xcc, 0xcc, - 0xfe, 0xcc, 0xcc, 0x20, 0x2, 0x32, 0x0, 0x1, - 0x77, 0x77, 0xfb, 0x77, 0x76, 0x0, 0x2f, 0xff, - 0xb0, 0x25, 0x55, 0x55, 0xfa, 0x55, 0x55, 0x51, - 0x1, 0x28, 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x6, 0xf0, 0x1, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x0, 0x0, 0x7, 0xf0, 0x0, - 0x6e, 0xff, 0xff, 0xff, 0xe8, 0x0, 0x0, 0x7, - 0xf0, 0x0, 0xec, 0x88, 0x88, 0x88, 0xdf, 0x0, - 0x0, 0x7, 0xe0, 0x0, 0xf6, 0x0, 0x0, 0x0, - 0x6f, 0x10, 0x0, 0x8, 0xe0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x10, 0x0, 0x8, 0xd0, 0x0, - 0xf7, 0x0, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x9, - 0xc1, 0xa6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, - 0x0, 0x9, 0xee, 0xe3, 0xf7, 0x11, 0x11, 0x11, - 0x7f, 0x10, 0x0, 0xc, 0xfb, 0x10, 0xf6, 0x0, - 0x6, 0x97, 0xcf, 0x0, 0x0, 0x6, 0x50, 0x0, - 0xd4, 0x0, 0x6, 0xdf, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8C03 "调" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xc3, 0x0, 0xb, 0xff, 0xff, 0xff, - 0xff, 0xe6, 0x0, 0xaf, 0x60, 0x4f, 0x86, 0x6a, - 0xe6, 0x66, 0xcd, 0x0, 0x5, 0xc0, 0x5f, 0x0, - 0x7, 0xd0, 0x0, 0x8e, 0x0, 0x0, 0x0, 0x5f, - 0xb, 0xff, 0xff, 0xf2, 0x8e, 0xce, 0xe7, 0x0, - 0x5f, 0x2, 0x5a, 0xe5, 0x40, 0x8e, 0x57, 0xcf, - 0x0, 0x5f, 0x4, 0x5a, 0xe5, 0x52, 0x8e, 0x0, - 0x7f, 0x0, 0x5f, 0x2f, 0xff, 0xff, 0xfa, 0x8e, - 0x0, 0x7f, 0x0, 0x5f, 0x0, 0x0, 0x0, 0x0, - 0x8e, 0x0, 0x7f, 0x0, 0x6f, 0x0, 0x46, 0x65, - 0x0, 0x8e, 0x0, 0x7e, 0x0, 0x6f, 0x3, 0xff, - 0xff, 0xc0, 0x8e, 0x0, 0x7e, 0x0, 0x6f, 0x5, - 0xf0, 0x8, 0xe0, 0x8e, 0x0, 0x8e, 0x2, 0x7e, - 0x6, 0xe0, 0x7, 0xe0, 0x8e, 0x0, 0x8e, 0x7e, - 0xac, 0x5, 0xf8, 0x7c, 0xd0, 0x8e, 0x0, 0x8f, - 0xf9, 0xca, 0x1, 0xcf, 0xfe, 0x60, 0x8e, 0x0, - 0x9f, 0xd2, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x8e, - 0x0, 0xad, 0x17, 0xf1, 0x0, 0x0, 0x7, 0x78, - 0xec, 0x0, 0x0, 0xc, 0xb0, 0x0, 0x0, 0xc, - 0xff, 0xd4, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, - - /* U+8F6C "转" */ - 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xf0, 0x0, 0x0, 0x0, - 0x3f, 0x20, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, - 0x0, 0x0, 0x6f, 0x10, 0x0, 0x0, 0x5, 0x7d, - 0xd7, 0x76, 0x12, 0x33, 0x9f, 0x33, 0x31, 0x0, - 0xd, 0xef, 0xfe, 0xee, 0x4f, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x2f, 0x40, 0x0, 0x2, 0x33, - 0xdb, 0x33, 0x31, 0x0, 0x0, 0x6f, 0x7, 0x10, - 0x0, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xbb, - 0x1f, 0x40, 0x77, 0x78, 0xfa, 0x77, 0x77, 0x60, - 0x1, 0xf7, 0x1f, 0x42, 0xde, 0xef, 0xfe, 0xee, - 0xee, 0xd0, 0x8, 0xfa, 0x8f, 0xa7, 0x10, 0xc, - 0xa0, 0x0, 0x0, 0x0, 0x7, 0xcc, 0xcf, 0xdc, - 0x40, 0x2f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0x40, 0x0, 0xcf, 0xff, 0xff, 0xe6, 0x0, - 0x0, 0x0, 0x1f, 0x42, 0x50, 0x67, 0x77, 0x7a, - 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xef, 0xf1, 0x0, - 0x0, 0x5, 0xf3, 0x0, 0x7, 0xbf, 0xff, 0xc6, - 0x11, 0x40, 0x0, 0xc, 0xc0, 0x0, 0x1d, 0xb8, - 0x5f, 0x40, 0x4, 0xfe, 0x81, 0x5f, 0x40, 0x0, - 0x0, 0x0, 0x1f, 0x40, 0x0, 0x18, 0xef, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, - 0x5, 0xdf, 0xa1, 0x0, 0x0, 0x0, 0x1f, 0x40, - 0x0, 0x0, 0x0, 0x5, 0xd7, 0x0, 0x0, 0x0, - 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+8FDB "进" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xe2, 0x0, - 0x8a, 0x0, 0x0, 0x8, 0xa1, 0x0, 0x0, 0x4f, - 0x40, 0xb, 0xd0, 0x0, 0x0, 0x3e, 0xd1, 0x0, - 0x4, 0xf4, 0x0, 0xbd, 0x0, 0x0, 0x0, 0x2d, - 0xe2, 0x0, 0x5f, 0x50, 0xb, 0xd0, 0x0, 0x0, - 0x0, 0x1b, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x38, 0xaf, 0xa8, 0x8d, - 0xe8, 0x70, 0x2, 0x66, 0x50, 0x0, 0x4, 0xf4, - 0x0, 0xbd, 0x0, 0x0, 0x7e, 0xef, 0x90, 0x0, - 0x4f, 0x40, 0xb, 0xd0, 0x0, 0x0, 0x0, 0xcd, - 0x18, 0x8a, 0xfa, 0x88, 0xde, 0x88, 0x20, 0x0, - 0xb, 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0xbd, 0x0, 0x19, 0xf1, 0x11, 0xbd, - 0x10, 0x0, 0x0, 0xb, 0xd0, 0x0, 0xeb, 0x0, - 0xb, 0xd0, 0x0, 0x0, 0x0, 0xcd, 0x0, 0x7f, - 0x50, 0x0, 0xbd, 0x0, 0x0, 0x0, 0x1f, 0xf0, - 0x3f, 0xc0, 0x0, 0xb, 0xd0, 0x0, 0x0, 0xc, - 0xef, 0x8e, 0xe1, 0x0, 0x0, 0xad, 0x0, 0x0, - 0x1d, 0xf3, 0x7f, 0xe1, 0x0, 0x0, 0x6, 0x80, - 0x0, 0x8, 0xe3, 0x0, 0x9f, 0xd9, 0x76, 0x66, - 0x77, 0x77, 0x60, 0x1, 0x0, 0x0, 0x4a, 0xdf, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, - - /* U+91CD "重" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x45, 0x79, - 0xbc, 0x10, 0x0, 0xae, 0xee, 0xee, 0xff, 0xff, - 0xfe, 0xdb, 0x95, 0x0, 0x0, 0x24, 0x44, 0x43, - 0x3b, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, - 0x44, 0x44, 0x4c, 0xc4, 0x44, 0x44, 0x44, 0x30, - 0x3e, 0xff, 0xff, 0xee, 0xef, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x3f, - 0x63, 0x33, 0x3c, 0xc4, 0x44, 0x47, 0xf2, 0x0, - 0x0, 0x4f, 0x44, 0x44, 0x4c, 0xc4, 0x44, 0x45, - 0xf2, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x3f, 0x10, 0x0, - 0xb, 0xb0, 0x0, 0x3, 0xf2, 0x0, 0x0, 0xe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x23, 0x33, 0x3c, 0xc3, 0x33, 0x32, - 0x0, 0x0, 0x0, 0x13, 0x33, 0x33, 0x3c, 0xc4, - 0x44, 0x44, 0x42, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x33, 0x33, 0x33, 0x3c, 0xc3, 0x33, 0x33, - 0x33, 0x20, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, - - /* U+952E "键" */ - 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, - 0x6, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0x52, 0x1a, - 0xb8, 0x1, 0x29, 0xe2, 0x20, 0x0, 0x0, 0xaf, - 0xff, 0x98, 0xec, 0x1f, 0xff, 0xff, 0xfc, 0x0, - 0x1, 0xfa, 0x32, 0x0, 0xe7, 0x2, 0x39, 0xe3, - 0xaf, 0x0, 0x8, 0xf3, 0x0, 0x3, 0xf2, 0x45, - 0x5a, 0xf5, 0x9f, 0x50, 0x1f, 0xfa, 0xaa, 0x29, - 0xc0, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x4f, 0xaf, - 0xc9, 0x2e, 0x70, 0x0, 0x8, 0xe0, 0x6f, 0x0, - 0x0, 0x1f, 0x60, 0x3f, 0xfe, 0x5a, 0xce, 0xfc, - 0xee, 0x0, 0x0, 0x2f, 0x71, 0x16, 0x6d, 0xb6, - 0x8c, 0xf8, 0x83, 0x0, 0xe, 0xff, 0xff, 0xb6, - 0xa, 0xb0, 0x8, 0xe0, 0x0, 0x0, 0x3, 0x6f, - 0x95, 0x4f, 0x3c, 0x9b, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x1f, 0x60, 0xd, 0x9f, 0x63, 0x6b, 0xf6, - 0x65, 0x0, 0x0, 0x1f, 0x60, 0x7, 0xff, 0x23, - 0x39, 0xf3, 0x33, 0x0, 0x0, 0x1f, 0x61, 0x21, - 0xfd, 0x5f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x1f, - 0x9e, 0xa5, 0xff, 0x11, 0x29, 0xe2, 0x21, 0x0, - 0x0, 0x2f, 0xfd, 0x4e, 0xdf, 0xd3, 0x7, 0xd0, - 0x0, 0x0, 0x0, 0x4f, 0x93, 0xee, 0x24, 0xff, - 0xb9, 0x96, 0x66, 0x61, 0x0, 0x1, 0xf, 0xd1, - 0x0, 0x17, 0xbe, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+95ED "闭" */ - 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xf9, 0x0, 0x9f, 0xff, - 0xff, 0xfe, 0x60, 0x16, 0x0, 0x9f, 0x30, 0x26, - 0x77, 0x77, 0x7c, 0xf0, 0x5f, 0x10, 0x5, 0x0, - 0x0, 0x65, 0x0, 0x6, 0xf0, 0x5f, 0x10, 0x0, - 0x0, 0x0, 0xcb, 0x0, 0x6, 0xf0, 0x5f, 0x10, - 0x0, 0x0, 0x0, 0xcb, 0x0, 0x6, 0xf0, 0x5f, - 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0x86, 0xf0, - 0x5f, 0x13, 0x66, 0x77, 0x9f, 0xfd, 0x66, 0x26, - 0xf0, 0x5f, 0x10, 0x0, 0x0, 0xce, 0xdb, 0x0, - 0x6, 0xf0, 0x5f, 0x10, 0x0, 0x8, 0xf6, 0xcb, - 0x0, 0x6, 0xf0, 0x5f, 0x10, 0x0, 0x6f, 0xa0, - 0xcb, 0x0, 0x6, 0xf0, 0x5f, 0x10, 0x7, 0xfb, - 0x0, 0xcb, 0x0, 0x6, 0xf0, 0x5f, 0x12, 0xbf, - 0x90, 0x0, 0xcb, 0x0, 0x6, 0xf0, 0x5f, 0x1b, - 0xe5, 0x0, 0x0, 0xda, 0x0, 0x6, 0xf0, 0x5f, - 0x10, 0x0, 0x5, 0xca, 0xf9, 0x0, 0x6, 0xf0, - 0x5f, 0x10, 0x0, 0x2, 0xac, 0xb2, 0x0, 0x6, - 0xf0, 0x5f, 0x10, 0x0, 0x0, 0x0, 0x0, 0x48, - 0x8d, 0xe0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+97F3 "音" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0x88, 0x88, - 0x8f, 0xe8, 0x88, 0x88, 0x87, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, - 0x0, 0x0, 0xc, 0xe0, 0x0, 0x0, 0x3f, 0x70, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, - 0x7f, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf9, - 0x0, 0x0, 0xde, 0x0, 0x0, 0x0, 0x2e, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, - 0x8, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x70, 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, - 0x11, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xc, - 0xd6, 0x66, 0x66, 0x66, 0x66, 0x8f, 0x80, 0x0, - 0x0, 0xe, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xa0, 0x0, 0x0, 0xe, 0xd9, 0x99, 0x99, 0x99, - 0x99, 0x9f, 0xb0, 0x0, 0x0, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xe, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, - 0x0, 0xe, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xa0, 0x0, 0x0, 0xc, 0xe8, 0x88, 0x88, 0x88, - 0x88, 0x9f, 0x80, 0x0, 0x0, 0x3, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xeb, 0x10, 0x0, - - /* U+9A97 "骗" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0x70, 0x0, 0x0, 0x9, 0xff, 0xfe, 0x30, 0x0, - 0x22, 0x9f, 0x62, 0x20, 0x0, 0x29, 0x76, 0xf8, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0xe6, - 0xe, 0x80, 0x6f, 0x0, 0x0, 0x0, 0x8f, 0x0, - 0xf, 0x60, 0xf7, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x1, 0xf5, 0xf, 0x60, 0x6f, 0x33, 0x33, - 0x33, 0x20, 0x0, 0x2f, 0x41, 0xf5, 0x6, 0xf0, - 0x79, 0x99, 0x99, 0x81, 0x3, 0xf4, 0x2f, 0x40, - 0x6f, 0x4f, 0xef, 0xdf, 0xdf, 0x90, 0x3f, 0xff, - 0xfd, 0x16, 0xf6, 0xe0, 0xf2, 0xf2, 0xab, 0x0, - 0x57, 0x8a, 0xf6, 0x7f, 0x6e, 0xf, 0x2f, 0x2a, - 0xb0, 0x0, 0x0, 0xf, 0x67, 0xe6, 0xe6, 0xf7, - 0xf7, 0xcb, 0x0, 0x0, 0x0, 0xf5, 0x8c, 0x6f, - 0xef, 0xef, 0xef, 0xb0, 0x26, 0xaf, 0x5f, 0x4a, - 0xb6, 0xe0, 0xf2, 0xf2, 0xab, 0xf, 0xfb, 0x62, - 0xf3, 0xc8, 0x6e, 0xf, 0x2f, 0x2a, 0xb0, 0x10, - 0x0, 0x4f, 0x2f, 0x66, 0xe0, 0xf2, 0xf2, 0xab, - 0x0, 0x13, 0x19, 0xe6, 0xf1, 0x6e, 0xf, 0x2f, - 0x2a, 0xb0, 0x9, 0xff, 0xf9, 0xca, 0x6, 0xe0, - 0xf2, 0xf7, 0xdb, 0x0, 0x4, 0x65, 0x3, 0x0, - 0x5d, 0xd, 0xb, 0xfe, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 -}; - - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 160, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 160, .box_w = 4, .box_h = 15, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 30, .adv_w = 160, .box_w = 6, .box_h = 9, .ofs_x = 2, .ofs_y = 6}, - {.bitmap_index = 57, .adv_w = 320, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 193, .adv_w = 210, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 304, .adv_w = 267, .box_w = 17, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 440, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 545, .adv_w = 160, .box_w = 2, .box_h = 9, .ofs_x = 4, .ofs_y = 6}, - {.bitmap_index = 554, .adv_w = 160, .box_w = 6, .box_h = 18, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 608, .adv_w = 160, .box_w = 6, .box_h = 18, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 662, .adv_w = 160, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 698, .adv_w = 225, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 776, .adv_w = 160, .box_w = 4, .box_h = 6, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 788, .adv_w = 226, .box_w = 13, .box_h = 1, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 795, .adv_w = 160, .box_w = 3, .box_h = 3, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 800, .adv_w = 202, .box_w = 12, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 902, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 972, .adv_w = 160, .box_w = 7, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1021, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1091, .adv_w = 160, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1166, .adv_w = 160, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1241, .adv_w = 160, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1306, .adv_w = 160, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1381, .adv_w = 160, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1456, .adv_w = 160, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1521, .adv_w = 160, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1596, .adv_w = 160, .box_w = 4, .box_h = 8, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 1612, .adv_w = 160, .box_w = 4, .box_h = 9, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 1630, .adv_w = 244, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1728, .adv_w = 226, .box_w = 13, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 1754, .adv_w = 247, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1852, .adv_w = 160, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1927, .adv_w = 313, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 2080, .adv_w = 251, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2185, .adv_w = 229, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2270, .adv_w = 244, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2383, .adv_w = 233, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2468, .adv_w = 231, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2553, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2637, .adv_w = 247, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2750, .adv_w = 222, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2840, .adv_w = 59, .box_w = 2, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2855, .adv_w = 200, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2938, .adv_w = 200, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3021, .adv_w = 201, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3104, .adv_w = 259, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3216, .adv_w = 225, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3306, .adv_w = 260, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3419, .adv_w = 233, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3510, .adv_w = 258, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3608, .adv_w = 228, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3693, .adv_w = 243, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3791, .adv_w = 239, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3889, .adv_w = 226, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3979, .adv_w = 220, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4083, .adv_w = 265, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4203, .adv_w = 197, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4287, .adv_w = 228, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4392, .adv_w = 246, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4497, .adv_w = 160, .box_w = 6, .box_h = 19, .ofs_x = 3, .ofs_y = -4}, - {.bitmap_index = 4554, .adv_w = 201, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 4648, .adv_w = 160, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 4705, .adv_w = 103, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 4720, .adv_w = 160, .box_w = 10, .box_h = 1, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4725, .adv_w = 160, .box_w = 2, .box_h = 9, .ofs_x = 4, .ofs_y = 6}, - {.bitmap_index = 4734, .adv_w = 190, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4784, .adv_w = 184, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4859, .adv_w = 193, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4914, .adv_w = 188, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4991, .adv_w = 198, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5046, .adv_w = 157, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5106, .adv_w = 198, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5184, .adv_w = 184, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5254, .adv_w = 65, .box_w = 3, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5277, .adv_w = 62, .box_w = 5, .box_h = 16, .ofs_x = -2, .ofs_y = -2}, - {.bitmap_index = 5317, .adv_w = 182, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5392, .adv_w = 67, .box_w = 2, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5407, .adv_w = 247, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5485, .adv_w = 182, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5545, .adv_w = 195, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5600, .adv_w = 187, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 5665, .adv_w = 188, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5737, .adv_w = 139, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5776, .adv_w = 188, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5831, .adv_w = 159, .box_w = 8, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5887, .adv_w = 186, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5947, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6008, .adv_w = 262, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6096, .adv_w = 177, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6156, .adv_w = 191, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 6221, .adv_w = 186, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6276, .adv_w = 160, .box_w = 5, .box_h = 20, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 6326, .adv_w = 70, .box_w = 2, .box_h = 20, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 6346, .adv_w = 160, .box_w = 6, .box_h = 20, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 6406, .adv_w = 129, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 6422, .adv_w = 320, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 6602, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 6792, .adv_w = 320, .box_w = 19, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 6973, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7163, .adv_w = 320, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7343, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 7543, .adv_w = 320, .box_w = 19, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 7724, .adv_w = 320, .box_w = 18, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 7895, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 8048, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 8248, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 8438, .adv_w = 320, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 8618, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 8808, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 9008, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 9208, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 9398, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 9598, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 9788, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 9978, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 10168, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 10368, .adv_w = 320, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 10548, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 10738, .adv_w = 320, .box_w = 19, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10919, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 11119, .adv_w = 320, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 11281, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 11471, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 11671, .adv_w = 320, .box_w = 19, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11833, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 12033, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 12233, .adv_w = 320, .box_w = 18, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 12404, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 12604, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 12794, .adv_w = 320, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12974, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 13174, .adv_w = 320, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 13354, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 13544, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -4} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_1[] = { - 0x0, 0x81, 0xb8, 0x120, 0x338, 0x346, 0x3da, 0x602, - 0x8cd, 0xac3, 0xd6d, 0xe22, 0x1028, 0x1067, 0x1079, 0x1413, - 0x14dc, 0x1535, 0x170c, 0x175a, 0x179e, 0x18c7, 0x18dc, 0x1a36, - 0x1d38, 0x26fb, 0x3455, 0x34c4, 0x3ba5, 0x3dc4, 0x3dca, 0x3dd6, - 0x413f, 0x41ae, 0x43a0, 0x4701, 0x47c0, 0x49c6, 0x4c6a -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = -{ - { - .range_start = 32, .range_length = 95, .glyph_id_start = 1, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY - }, - { - .range_start = 20013, .range_length = 19563, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 39, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - - - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LVGL_VERSION_MAJOR == 8 -/*Store all the custom data of the font*/ -static lv_font_fmt_txt_glyph_cache_t cache; -#endif - -#if LVGL_VERSION_MAJOR >= 8 -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = NULL, - .kern_scale = 0, - .cmap_num = 2, - .bpp = 4, - .kern_classes = 0, - .bitmap_format = 0, -#if LVGL_VERSION_MAJOR == 8 - .cache = &cache -#endif -}; - - - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LVGL_VERSION_MAJOR >= 8 -const lv_font_t ui_font_zhongyuan20 = { -#else -lv_font_t ui_font_zhongyuan20 = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 20, /*The maximum line height required by the font*/ - .base_line = 4, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -3, - .underline_thickness = 1, -#endif - .dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9 - .fallback = NULL, -#endif - .user_data = NULL, -}; - - - -#endif /*#if UI_FONT_ZHONGYUAN20*/ - diff --git a/software/Power_Pico/User/GUI/images/ui_img_chicken_png.c b/software/Power_Pico/User/GUI/images/ui_img_chicken_png.c deleted file mode 100644 index 2de949f..0000000 --- a/software/Power_Pico/User/GUI/images/ui_img_chicken_png.c +++ /dev/null @@ -1,538 +0,0 @@ -// This file was generated by SquareLine Studio -// SquareLine Studio version: SquareLine Studio 1.5.3 -// LVGL version: 9.2.2 -// Project name: PowerPico - -#include "../ui.h" - -#ifndef LV_ATTRIBUTE_MEM_ALIGN - #define LV_ATTRIBUTE_MEM_ALIGN -#endif - -// IMAGE DATA: assets/chicken.png -const LV_ATTRIBUTE_MEM_ALIGN uint8_t ui_img_chicken_png_data[] = { - 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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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, - 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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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, - 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,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,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,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,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,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,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,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x6D,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,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,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,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,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,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x7F,0x7F,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x7F,0x7F,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,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,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,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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, - 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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x6D,0x7E,0x6D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x6D,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,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0xDE,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x1E,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x1E,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x5F,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x1E,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x6D,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0xDE,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x6D,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0xDF,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x5F,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0xDE,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x6D,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,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,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,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x6D,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x1E,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0xDF,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x6D,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x5F,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x5F,0x7F,0x1E,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x5F,0x7F,0x9F,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x3F,0x7F,0xDE,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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, - 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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x7F,0x7F,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0x86,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xBF,0x86,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x6D,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, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xBF,0x86,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x7F,0x7F,0xDE,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0x86,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0xDF,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0x86,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xBF,0x86,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x5F,0x7F,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x86,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x1E,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0x86,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0xDF,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0x86,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x1F,0x77,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x86,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x1F,0x77,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,0xDF,0x7E,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0xDF,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0xDF,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x1E,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0xDF,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x6D,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,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,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,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,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x1E,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0xDF,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0xDE,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x1E,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x76,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x5F,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x7F,0x7F,0x1E,0x6E,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x9F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x6D,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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, - 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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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, - 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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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, - 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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x6D,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,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,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,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,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,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,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,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,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,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,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,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,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x9E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x6D,0x9E,0x6D,0x9E,0x65,0x9E,0x65,0x7E,0x6D,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,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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, - 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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x6D,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, - 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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65, - 0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,0x9E,0x65,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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, - 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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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, - 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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - //alpha channel data: - 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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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, - 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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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, - 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,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x80,0x80,0x9F,0xBF,0x9F,0x9F,0x60,0x40,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,0x00,0x00,0x00,0x00,0x20,0x60,0x80,0x80,0x80,0x9F,0xBF,0xBF,0x9F,0x9F,0x9F,0x80,0x60,0x40,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x80,0x20,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,0x20,0x80,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xDF,0x9F,0x60,0x20,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x20,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x9F,0x60,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,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,0x00,0x00,0x00,0x00,0x20,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,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,0xDF,0x9F,0x20,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,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,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,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,0xDF,0x80,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,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,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,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,0xDF,0x80,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,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,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,0xDF,0x20,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, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xDF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x80,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xDF,0x00,0x00,0x00,0x00,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,0xDF,0x20,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x40,0x00,0x20,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,0xDF,0xDF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x60,0x00,0x00,0x20,0x40,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x20,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xBF,0x80,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x60,0x9F,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x80,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,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,0xDF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x80,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,0x20,0x60,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x20,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,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,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE8,0xE5,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xCF,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,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x40,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,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,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,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x40,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,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,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,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,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x20,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,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,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xBF,0x9F,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,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,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x40,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,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,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x40,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,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,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,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,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,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,0x00,0x00,0x90,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xBC,0xBC,0xBC,0xBC,0xBC,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,0x20,0x80,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,0x40,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x40,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,0xBF,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,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,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x20,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,0x60,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,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,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,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,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,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xDF,0xBF,0xA0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x20,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x9F,0xDF,0xBF,0xBF,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x00,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x9F,0x80,0x60,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x20,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,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,0x60,0xDF,0xFF,0xFF,0xFF,0xFF,0xDF,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,0x60,0x80,0x9F,0x60,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,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,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,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,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x60,0x40,0x20,0x80,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,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,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,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x40,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,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,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,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,0x9F,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,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,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,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,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,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,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,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,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x20,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,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,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,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x20,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,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,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,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x20,0x80,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x80,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,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,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x20,0x60,0x60,0x80,0x80,0x60,0x40,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,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,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,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x40,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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, - 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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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, - 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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,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, - 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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x40,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F, - 0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,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,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,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,0x00,0x00,0x00,0x20,0x60,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x80,0xBF,0xFF,0xFF,0xFF,0xFF,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x80,0xBF,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,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,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,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x40,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,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,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x80,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,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,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,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,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,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,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,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,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,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,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,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, - 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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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, - 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,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,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,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,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,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,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,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,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,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - -}; -const lv_image_dsc_t ui_img_chicken_png = { - .header.w = 128, - .header.h = 128, - .data_size = sizeof(ui_img_chicken_png_data), - .header.cf = LV_COLOR_FORMAT_NATIVE_WITH_ALPHA, - .header.magic = LV_IMAGE_HEADER_MAGIC, - .data = ui_img_chicken_png_data -}; - diff --git a/software/Power_Pico/User/GUI/screens/ui_ChartPage.c b/software/Power_Pico/User/GUI/screens/ui_ChartPage.c deleted file mode 100644 index 79739d0..0000000 --- a/software/Power_Pico/User/GUI/screens/ui_ChartPage.c +++ /dev/null @@ -1,353 +0,0 @@ -// This file was generated by SquareLine Studio -// SquareLine Studio version: SquareLine Studio 1.5.3 -// LVGL version: 9.2.2 -// Project name: PowerPico - -#include "../ui.h" - -lv_obj_t * ui_ChartPage = NULL; -static lv_obj_t * ui_ContainChart = NULL; -static lv_obj_t * row_line1 = NULL; -static lv_obj_t * row_line2 = NULL; -static lv_obj_t * row_line3 = NULL; -static lv_obj_t * row_line4 = NULL; -static lv_obj_t * col_line1 = NULL; -static lv_obj_t * col_line2 = NULL; -static lv_obj_t * col_line3 = NULL; -static lv_obj_t * col_line4 = NULL; -static lv_obj_t * ui_AxisV5 = NULL; -static lv_obj_t * ui_AxisV4 = NULL; -static lv_obj_t * ui_AxisV3 = NULL; -static lv_obj_t * ui_AxisV2 = NULL; -static lv_obj_t * ui_AxisV1 = NULL; -static lv_obj_t * ui_AxisV = NULL; -static lv_obj_t * ui_AxisC = NULL; -static lv_obj_t * ui_AxisC1 = NULL; -static lv_obj_t * ui_AxisC2 = NULL; -static lv_obj_t * ui_AxisC3 = NULL; -static lv_obj_t * ui_AxisC4 = NULL; -static lv_obj_t * ui_AxisC5 = NULL; -static lv_obj_t * ui_PanelVol = NULL; -static lv_obj_t * ui_LabelVol = NULL; -static lv_obj_t * ui_LabelVolUnit = NULL; -static lv_obj_t * ui_PanelCur = NULL; -static lv_obj_t * ui_LabelCur1 = NULL; -static lv_obj_t * ui_LabelCurUnit = NULL; -static lv_obj_t * ui_ButState = NULL; -static lv_obj_t * ui_LabelState = NULL; -static lv_obj_t * ui_LineVol = NULL; // 电压波形 -static lv_obj_t * ui_LineCur = NULL; // 电流波形 - -static lv_timer_t * chart_update_timer = NULL; // 定时器 -static bool is_chart_running = true; - -static lv_point_precise_t line_points[4][2] = {{{-170, 36}, {170, 36}}, {{-170, 72},{170, 72}}, {{-170,108},{170,108}}, {{-170, 144},{170, 144}}}; -static lv_point_precise_t col_points[4][2] = {{{34, -180}, {34, 180}}, {{68, -180},{68, 180}}, {{102, -180},{102, 180}}, {{136, -180},{136, 180}}}; - -#define POINTS_NUM 32 -// 模拟数据数组 -// 数据数组 -static lv_point_precise_t vol_points[POINTS_NUM]; // 电压波形点 -static lv_point_precise_t cur_points[POINTS_NUM]; // 电流波形点 -static uint8_t data_index = 0; - -// event funtions - -// 定时器回调函数:更新图表数据 -static void _chart_update_cb(lv_timer_t * timer) { - -} - -#include "key.h" -void ui_chart_page_key_handler(void* key_event) -{ - if ( ((key_event_t*)key_event)->id == KEY_ID_B && ((key_event_t*)key_event)->type == KEY_EVT_CLICK ) - { - lv_lib_pm_next(); - } -} - -// build funtions - -void ui_ChartPage_screen_init(void) -{ - ui_ChartPage = lv_obj_create(NULL); - lv_obj_remove_flag(ui_ChartPage, LV_OBJ_FLAG_SCROLLABLE); /// Flags - - ui_ContainChart = lv_obj_create(ui_ChartPage); - lv_obj_remove_style_all(ui_ContainChart); - lv_obj_set_width(ui_ContainChart, 170); - lv_obj_set_height(ui_ContainChart, 180); - lv_obj_set_x(ui_ContainChart, 0); - lv_obj_set_y(ui_ContainChart, -15); - lv_obj_set_align(ui_ContainChart, LV_ALIGN_CENTER); - lv_obj_remove_flag(ui_ContainChart, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_ContainChart, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_ContainChart, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_color(ui_ContainChart, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_ContainChart, 64, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_ContainChart, 2, LV_PART_MAIN | LV_STATE_DEFAULT); - - row_line1 = lv_line_create(ui_ContainChart); - lv_line_set_points(row_line1, line_points[0], 2); - lv_obj_set_style_line_color(row_line1, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_width(row_line1, 1, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_opa(row_line1, 64, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_align(row_line1, LV_ALIGN_TOP_MID); - - row_line2 = lv_line_create(ui_ContainChart); - lv_line_set_points(row_line2, line_points[1], 2); - lv_obj_set_style_line_color(row_line2, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_width(row_line2, 1, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_opa(row_line2, 64, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_align(row_line2, LV_ALIGN_TOP_MID); - - row_line3 = lv_line_create(ui_ContainChart); - lv_line_set_points(row_line3, line_points[2], 2); - lv_obj_set_style_line_color(row_line3, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_width(row_line3, 1, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_opa(row_line3, 64, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_align(row_line3, LV_ALIGN_TOP_MID); - - row_line4 = lv_line_create(ui_ContainChart); - lv_line_set_points(row_line4, line_points[3], 2); - lv_obj_set_style_line_color(row_line4, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_width(row_line4, 1, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_opa(row_line4, 64, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_align(row_line4, LV_ALIGN_TOP_MID); - - col_line1 = lv_line_create(ui_ContainChart); - lv_line_set_points(col_line1, col_points[0], 2); - lv_obj_set_style_line_color(col_line1, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_width(col_line1, 1, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_opa(col_line1, 64, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_align(col_line1, LV_ALIGN_LEFT_MID); - - col_line2 = lv_line_create(ui_ContainChart); - lv_line_set_points(col_line2, col_points[1], 2); - lv_obj_set_style_line_color(col_line2, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_width(col_line2, 1, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_opa(col_line2, 64, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_align(col_line2, LV_ALIGN_LEFT_MID); - - col_line3 = lv_line_create(ui_ContainChart); - lv_line_set_points(col_line3, col_points[2], 2); - lv_obj_set_style_line_color(col_line3, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_width(col_line3, 1, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_opa(col_line3, 64, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_align(col_line3, LV_ALIGN_LEFT_MID); - - col_line4 = lv_line_create(ui_ContainChart); - lv_line_set_points(col_line4, col_points[3], 2); - lv_obj_set_style_line_color(col_line4, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_width(col_line4, 1, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_line_opa(col_line4, 64, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_align(col_line4, LV_ALIGN_LEFT_MID); - - ui_AxisV5 = lv_label_create(ui_ChartPage); - lv_obj_set_width(ui_AxisV5, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_AxisV5, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_AxisV5, 100); - lv_obj_set_y(ui_AxisV5, -104); - lv_obj_set_align(ui_AxisV5, LV_ALIGN_CENTER); - lv_label_set_text(ui_AxisV5, "5.0"); - lv_obj_set_style_text_color(ui_AxisV5, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_text_opa(ui_AxisV5, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_AxisV4 = lv_label_create(ui_ChartPage); - lv_obj_set_width(ui_AxisV4, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_AxisV4, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_AxisV4, 100); - lv_obj_set_y(ui_AxisV4, -68); - lv_obj_set_align(ui_AxisV4, LV_ALIGN_CENTER); - lv_label_set_text(ui_AxisV4, "4.0"); - lv_obj_set_style_text_color(ui_AxisV4, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_text_opa(ui_AxisV4, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_AxisV3 = lv_label_create(ui_ChartPage); - lv_obj_set_width(ui_AxisV3, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_AxisV3, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_AxisV3, 100); - lv_obj_set_y(ui_AxisV3, -32); - lv_obj_set_align(ui_AxisV3, LV_ALIGN_CENTER); - lv_label_set_text(ui_AxisV3, "3.0"); - lv_obj_set_style_text_color(ui_AxisV3, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_text_opa(ui_AxisV3, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_AxisV2 = lv_label_create(ui_ChartPage); - lv_obj_set_width(ui_AxisV2, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_AxisV2, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_AxisV2, 100); - lv_obj_set_y(ui_AxisV2, 4); - lv_obj_set_align(ui_AxisV2, LV_ALIGN_CENTER); - lv_label_set_text(ui_AxisV2, "2.0"); - lv_obj_set_style_text_color(ui_AxisV2, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_text_opa(ui_AxisV2, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_AxisV1 = lv_label_create(ui_ChartPage); - lv_obj_set_width(ui_AxisV1, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_AxisV1, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_AxisV1, 100); - lv_obj_set_y(ui_AxisV1, 39); - lv_obj_set_align(ui_AxisV1, LV_ALIGN_CENTER); - lv_label_set_text(ui_AxisV1, "1.0"); - lv_obj_set_style_text_color(ui_AxisV1, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_text_opa(ui_AxisV1, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_AxisV = lv_label_create(ui_ChartPage); - lv_obj_set_width(ui_AxisV, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_AxisV, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_AxisV, 100); - lv_obj_set_y(ui_AxisV, 70); - lv_obj_set_align(ui_AxisV, LV_ALIGN_CENTER); - lv_label_set_text(ui_AxisV, "V"); - lv_obj_set_style_text_color(ui_AxisV, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_text_opa(ui_AxisV, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_AxisC = lv_label_create(ui_ChartPage); - lv_obj_set_width(ui_AxisC, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_AxisC, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_AxisC, -100); - lv_obj_set_y(ui_AxisC, 70); - lv_obj_set_align(ui_AxisC, LV_ALIGN_CENTER); - lv_label_set_text(ui_AxisC, "A"); - lv_obj_set_style_text_color(ui_AxisC, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_text_opa(ui_AxisC, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_AxisC1 = lv_label_create(ui_ChartPage); - lv_obj_set_width(ui_AxisC1, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_AxisC1, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_AxisC1, -100); - lv_obj_set_y(ui_AxisC1, 39); - lv_obj_set_align(ui_AxisC1, LV_ALIGN_CENTER); - lv_label_set_text(ui_AxisC1, "0.4"); - lv_obj_set_style_text_color(ui_AxisC1, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_text_opa(ui_AxisC1, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_AxisC2 = lv_label_create(ui_ChartPage); - lv_obj_set_width(ui_AxisC2, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_AxisC2, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_AxisC2, -100); - lv_obj_set_y(ui_AxisC2, 4); - lv_obj_set_align(ui_AxisC2, LV_ALIGN_CENTER); - lv_label_set_text(ui_AxisC2, "0.8"); - lv_obj_set_style_text_color(ui_AxisC2, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_text_opa(ui_AxisC2, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_AxisC3 = lv_label_create(ui_ChartPage); - lv_obj_set_width(ui_AxisC3, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_AxisC3, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_AxisC3, -100); - lv_obj_set_y(ui_AxisC3, -32); - lv_obj_set_align(ui_AxisC3, LV_ALIGN_CENTER); - lv_label_set_text(ui_AxisC3, "1.2"); - lv_obj_set_style_text_color(ui_AxisC3, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_text_opa(ui_AxisC3, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_AxisC4 = lv_label_create(ui_ChartPage); - lv_obj_set_width(ui_AxisC4, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_AxisC4, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_AxisC4, -100); - lv_obj_set_y(ui_AxisC4, -68); - lv_obj_set_align(ui_AxisC4, LV_ALIGN_CENTER); - lv_label_set_text(ui_AxisC4, "1.6"); - lv_obj_set_style_text_color(ui_AxisC4, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_text_opa(ui_AxisC4, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_AxisC5 = lv_label_create(ui_ChartPage); - lv_obj_set_width(ui_AxisC5, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_AxisC5, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_AxisC5, -100); - lv_obj_set_y(ui_AxisC5, -104); - lv_obj_set_align(ui_AxisC5, LV_ALIGN_CENTER); - lv_label_set_text(ui_AxisC5, "2.0"); - lv_obj_set_style_text_color(ui_AxisC5, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_text_opa(ui_AxisC5, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_PanelVol = lv_obj_create(ui_ChartPage); - lv_obj_set_width(ui_PanelVol, 80); - lv_obj_set_height(ui_PanelVol, 35); - lv_obj_set_x(ui_PanelVol, -30); - lv_obj_set_y(ui_PanelVol, -5); - lv_obj_set_align(ui_PanelVol, LV_ALIGN_BOTTOM_MID); - lv_obj_remove_flag(ui_PanelVol, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_PanelVol, lv_color_hex(0xE36666), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_PanelVol, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelVol = lv_label_create(ui_PanelVol); - lv_obj_set_width(ui_LabelVol, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelVol, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelVol, -12); - lv_obj_set_y(ui_LabelVol, 0); - lv_obj_set_align(ui_LabelVol, LV_ALIGN_RIGHT_MID); - lv_label_set_text(ui_LabelVol, "5.42"); - lv_obj_set_style_text_font(ui_LabelVol, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelVolUnit = lv_label_create(ui_PanelVol); - lv_obj_set_width(ui_LabelVolUnit, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelVolUnit, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelVolUnit, 5); - lv_obj_set_y(ui_LabelVolUnit, 0); - lv_obj_set_align(ui_LabelVolUnit, LV_ALIGN_RIGHT_MID); - lv_label_set_text(ui_LabelVolUnit, "V"); - lv_obj_set_style_text_font(ui_LabelVolUnit, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_PanelCur = lv_obj_create(ui_ChartPage); - lv_obj_set_width(ui_PanelCur, 100); - lv_obj_set_height(ui_PanelCur, 35); - lv_obj_set_x(ui_PanelCur, 60); - lv_obj_set_y(ui_PanelCur, -5); - lv_obj_set_align(ui_PanelCur, LV_ALIGN_BOTTOM_MID); - lv_obj_remove_flag(ui_PanelCur, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_PanelCur, lv_color_hex(0x42AA49), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_PanelCur, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelCur1 = lv_label_create(ui_PanelCur); - lv_obj_set_width(ui_LabelCur1, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelCur1, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelCur1, -30); - lv_obj_set_y(ui_LabelCur1, 0); - lv_obj_set_align(ui_LabelCur1, LV_ALIGN_RIGHT_MID); - lv_label_set_text(ui_LabelCur1, "15.23"); - lv_obj_set_style_text_font(ui_LabelCur1, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelCurUnit = lv_label_create(ui_PanelCur); - lv_obj_set_width(ui_LabelCurUnit, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelCurUnit, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelCurUnit, 5); - lv_obj_set_y(ui_LabelCurUnit, 0); - lv_obj_set_align(ui_LabelCurUnit, LV_ALIGN_RIGHT_MID); - lv_label_set_text(ui_LabelCurUnit, "mA"); - lv_obj_set_style_text_font(ui_LabelCurUnit, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_ButState = lv_button_create(ui_ChartPage); - lv_obj_set_width(ui_ButState, 35); - lv_obj_set_height(ui_ButState, 32); - lv_obj_set_x(ui_ButState, -90); - lv_obj_set_y(ui_ButState, -7); - lv_obj_set_align(ui_ButState, LV_ALIGN_BOTTOM_MID); - lv_obj_add_flag(ui_ButState, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_ButState, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_ButState, lv_color_hex(0xF03737), LV_PART_MAIN | LV_STATE_CHECKED); - lv_obj_set_style_bg_opa(ui_ButState, 255, LV_PART_MAIN | LV_STATE_CHECKED); - - ui_LabelState = lv_label_create(ui_ButState); - lv_obj_set_width(ui_LabelState, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelState, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelState, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelState, LV_SYMBOL_PLAY); - - // timer - chart_update_timer = lv_timer_create(_chart_update_cb, 100, NULL); // 每100ms更新一次数据 - -} - - -void ui_ChartPage_screen_destroy(void) -{ - if (chart_update_timer) { - lv_timer_delete(chart_update_timer); - chart_update_timer = NULL; - } - -} diff --git a/software/Power_Pico/User/GUI/screens/ui_ChartPage.h b/software/Power_Pico/User/GUI/screens/ui_ChartPage.h deleted file mode 100644 index 0c748d2..0000000 --- a/software/Power_Pico/User/GUI/screens/ui_ChartPage.h +++ /dev/null @@ -1,24 +0,0 @@ -// This file was generated by SquareLine Studio -// SquareLine Studio version: SquareLine Studio 1.5.3 -// LVGL version: 9.2.2 -// Project name: PowerPico - -#ifndef UI_CHARTPAGE_H -#define UI_CHARTPAGE_H - -#ifdef __cplusplus -extern "C" { -#endif - -// SCREEN: ui_ChartPage -extern void ui_ChartPage_screen_init(void); -extern void ui_ChartPage_screen_destroy(void); -extern lv_obj_t * ui_ChartPage; -void ui_chart_page_key_handler(void *key_event); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif - diff --git a/software/Power_Pico/User/GUI/screens/ui_PPSPage.c b/software/Power_Pico/User/GUI/screens/ui_PPSPage.c deleted file mode 100644 index be8f957..0000000 --- a/software/Power_Pico/User/GUI/screens/ui_PPSPage.c +++ /dev/null @@ -1,637 +0,0 @@ -// This file was generated by SquareLine Studio -// SquareLine Studio version: SquareLine Studio 1.5.4 -// LVGL version: 9.2.2 -// Project name: PowerPico - -#include "../ui.h" - -lv_obj_t * ui_PPSPage = NULL; -static lv_obj_t * ui_PanelPPSVol = NULL; -static lv_obj_t * ui_LabelPPSVol = NULL; -static lv_obj_t * ui_LabelPPSVolUnit = NULL; -static lv_obj_t * ui_PanelPPSCur = NULL; -static lv_obj_t * ui_LabelPPSCur = NULL; -static lv_obj_t * ui_LabelPPSCurUnit = NULL; -static lv_obj_t * ui_Spinner1 = NULL; -static lv_obj_t * ui_PanelPPS = NULL; -static lv_obj_t * ui_BtnSet1 = NULL; -static lv_obj_t * ui_LabelSet1 = NULL; -static lv_obj_t * ui_BtnSet2 = NULL; -static lv_obj_t * ui_LabelSet2 = NULL; -static lv_obj_t * ui_BtnSet3 = NULL; -static lv_obj_t * ui_LabelSet3 = NULL; -static lv_obj_t * ui_BtnSet4 = NULL; -static lv_obj_t * ui_LabelSet4 = NULL; -static lv_obj_t * ui_BtnSet5 = NULL; -static lv_obj_t * ui_LabelSet5 = NULL; -static lv_obj_t * ui_BtnSet6 = NULL; -static lv_obj_t * ui_LabelSet6 = NULL; -static lv_obj_t * ui_BtnValSet = NULL; -static lv_obj_t * ui_LabelValSet = NULL; -static lv_obj_t * ui_BtnValDec = NULL; -static lv_obj_t * ui_LabelValDec = NULL; -static lv_obj_t * ui_BtnValInc = NULL; -static lv_obj_t * ui_LabelValInc = NULL; -static lv_obj_t * ui_BtnCurSet = NULL; -static lv_obj_t * ui_LabelCurSet = NULL; -static lv_obj_t * ui_BtnCurDec = NULL; -static lv_obj_t * ui_LabelCurDec = NULL; -static lv_obj_t * ui_BtnCurInc = NULL; -static lv_obj_t * ui_LabelCurInc = NULL; -static lv_obj_t * ui_BtnSwitch = NULL; -static lv_obj_t * ui_LabelSwitch = NULL; -static lv_obj_t * ui_BtnClose = NULL; -static lv_obj_t * ui_LabelClose = NULL; - -static lv_timer_t* ui_pps_timer = NULL; - -// variables - -static uint8_t pps_voltage_index = 0; // 6-settings: 0:5V, 1:9V, 2:12V, 3:15V, 4:18V, 5:20V -static uint8_t pps_panel_index = 1; // 1 or 2 -static lv_obj_t * btns[14]; // 存储所有 btn 的指针 -static int current_btn_index = 0; // 当前选中的 btn 索引 - -static float cur_voltage = 5.0; -static float cur_current = 1.0; - -///////////////// timer functions /////////////////// - -static void _flush_timer_cb(void) { - // 刷新 PPS 电压电流显示 - char buf[5]; - float voltage = 0.0; - float current = 0.0; - ui_get_vol_cur(&voltage, ¤t); - sprintf(buf, "%.2f", voltage); - lv_label_set_text(ui_LabelPPSVol, buf); - sprintf(buf, "%.2f", current/1000000.0); // 转换为 A - lv_label_set_text(ui_LabelPPSCur, buf); -} - -///////////////// key function /////////////////// - -static void _set_label_val_cur(void) { - char buf[8]; - sprintf(buf, "%.2f V", cur_voltage); - lv_label_set_text(ui_LabelValSet, buf); - sprintf(buf, "%.2f A", cur_current); - lv_label_set_text(ui_LabelCurSet, buf); -} - -static void _switch_pps_panel(void) -{ - if(pps_panel_index == 1) - { - lv_lib_anim_user_animation(ui_PanelPPS, 0, 500, 120, -120, 0, 0, 0, 0, lv_anim_path_ease_in_out, lv_lib_anim_callback_set_x, NULL); - pps_panel_index = 2; - // 取消当前对象红色边框 - lv_obj_set_style_border_width(btns[current_btn_index], 0, LV_PART_MAIN | LV_STATE_DEFAULT); - current_btn_index = 8; - // 设置当前对象红色边框 - lv_obj_set_style_border_width(btns[current_btn_index], 3, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_label_set_text(ui_LabelSwitch, _("press here to Fixed Set")); - if(ui_get_language_select() == 0) - lv_obj_set_style_text_font(ui_LabelSwitch, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - else - lv_obj_set_style_text_font(ui_LabelSwitch, &ui_font_zhongyuan20, LV_PART_MAIN | LV_STATE_DEFAULT); - _set_label_val_cur(); - } - else - { - lv_lib_anim_user_animation(ui_PanelPPS, 0, 500, -120, 120, 0, 0, 0, 0, lv_anim_path_ease_in_out, lv_lib_anim_callback_set_x, NULL); - pps_panel_index = 1; - // 取消当前对象红色边框 - lv_obj_set_style_border_width(btns[current_btn_index], 0, LV_PART_MAIN | LV_STATE_DEFAULT); - current_btn_index = 0; - // 设置当前对象红色边框 - lv_obj_set_style_border_width(btns[current_btn_index], 3, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_label_set_text(ui_LabelSwitch, _("press to Step Adjust")); - if(ui_get_language_select() == 0) - lv_obj_set_style_text_font(ui_LabelSwitch, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - else - lv_obj_set_style_text_font(ui_LabelSwitch, &ui_font_zhongyuan20, LV_PART_MAIN | LV_STATE_DEFAULT); - - } -} - -static void _switch_btn(bool inc) -{ - // 取消当前对象红色边框 - lv_obj_set_style_border_width(btns[current_btn_index], 0, LV_PART_MAIN | LV_STATE_DEFAULT); - // 加减 - if(inc) { - current_btn_index++; - if (pps_panel_index == 1 && current_btn_index > 7) { - current_btn_index = 0; - } - else if (pps_panel_index == 2 && current_btn_index > 13) { - current_btn_index = 8; - } - } else { - if (pps_panel_index == 1) { - if (current_btn_index == 0) { - current_btn_index = 7; - } else { - current_btn_index--; - } - } - else if (pps_panel_index == 2) { - if (current_btn_index == 8) { - current_btn_index = 13; - } else { - current_btn_index--; - } - } - } - // 设置当前对象红色边框 - lv_obj_set_style_border_width(btns[current_btn_index], 3, LV_PART_MAIN | LV_STATE_DEFAULT); -} - -#include "key.h" -void ui_pps_page_key_handler(void* key_event) -{ - if(((key_event_t*)key_event)->id == KEY_ID_B && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - { - _switch_pps_panel(); - } - else if(((key_event_t*)key_event)->id == KEY_ID_L || ((key_event_t*)key_event)->id == KEY_ID_R) - { - if (((key_event_t*)key_event)->id == KEY_ID_R) { - _switch_btn(1); - } else if (((key_event_t*)key_event)->id == KEY_ID_L) { - _switch_btn(0); - } - } - else if (((key_event_t*)key_event)->id == KEY_ID_Y) - { - switch (current_btn_index) - { - // 6和12 切换 pps panel - case 6: - _switch_pps_panel(); - break; - case 12: - _switch_pps_panel(); - break; - // 7和13 关闭 PPS - case 7: - ui_send_pps_stop_msg(); - lv_lib_pm_goto("Set Page", NULL); - break; - case 13: - ui_send_pps_stop_msg(); - lv_lib_pm_goto("Set Page", NULL); - break; - case 0: - cur_voltage = 5.0; - cur_current = 1.0; - ui_send_pps_set_msg(cur_voltage, cur_current); - break; - case 1: - cur_voltage = 9.0; - cur_current = 1.0; - ui_send_pps_set_msg(cur_voltage, cur_current); - break; - case 2: - cur_voltage = 12.0; - cur_current = 1.0; - ui_send_pps_set_msg(cur_voltage, cur_current); - break; - case 3: - cur_voltage = 15.0; - cur_current = 1.0; - ui_send_pps_set_msg(cur_voltage, cur_current); - break; - case 4: - cur_voltage = 18.0; - cur_current = 1.0; - ui_send_pps_set_msg(cur_voltage, cur_current); - break; - case 5: - cur_voltage = 20.0; - cur_current = 1.0; - ui_send_pps_set_msg(cur_voltage, cur_current); - break; - case 8: - cur_voltage -= 0.1; - if (cur_voltage < 5.0) cur_voltage = 5.0; - ui_send_pps_set_msg(cur_voltage, cur_current); - break; - case 9: - cur_voltage += 0.1; - if (cur_voltage > 20.0) cur_voltage = 20.0; - ui_send_pps_set_msg(cur_voltage, cur_current); - break; - case 10: - cur_current -= 0.1; - if (cur_current < 1.0) cur_current = 1.0; - ui_send_pps_set_msg(cur_voltage, cur_current); - break; - case 11: - cur_current += 0.1; - if (cur_current > 3.0) cur_current = 3.0; - ui_send_pps_set_msg(cur_voltage, cur_current); - break; - } - _set_label_val_cur(); - } -} - - -/////////////////////// para_initialize ////////////////////// -static void _para_init(void) { - current_btn_index = 0; - pps_voltage_index = 0; - pps_panel_index = 1; - cur_voltage = 5.0; - cur_current = 1.0; -} - -/////////////////////// ui_initialize ////////////////////// - -void ui_PPSPage_screen_init(void) -{ - ui_PPSPage = lv_obj_create(NULL); - lv_obj_remove_flag(ui_PPSPage, LV_OBJ_FLAG_SCROLLABLE); /// Flags - - ui_PanelPPSVol = lv_obj_create(ui_PPSPage); - lv_obj_set_width(ui_PanelPPSVol, 80); - lv_obj_set_height(ui_PanelPPSVol, 35); - lv_obj_set_x(ui_PanelPPSVol, -30); - lv_obj_set_y(ui_PanelPPSVol, 10); - lv_obj_set_align(ui_PanelPPSVol, LV_ALIGN_TOP_MID); - lv_obj_remove_flag(ui_PanelPPSVol, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_PanelPPSVol, lv_color_hex(0xE36666), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_PanelPPSVol, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelPPSVol = lv_label_create(ui_PanelPPSVol); - lv_obj_set_width(ui_LabelPPSVol, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelPPSVol, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelPPSVol, -12); - lv_obj_set_y(ui_LabelPPSVol, 0); - lv_obj_set_align(ui_LabelPPSVol, LV_ALIGN_RIGHT_MID); - lv_label_set_text(ui_LabelPPSVol, "5.42"); - lv_obj_set_style_text_font(ui_LabelPPSVol, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelPPSVolUnit = lv_label_create(ui_PanelPPSVol); - lv_obj_set_width(ui_LabelPPSVolUnit, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelPPSVolUnit, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelPPSVolUnit, 5); - lv_obj_set_y(ui_LabelPPSVolUnit, 0); - lv_obj_set_align(ui_LabelPPSVolUnit, LV_ALIGN_RIGHT_MID); - lv_label_set_text(ui_LabelPPSVolUnit, "V"); - lv_obj_set_style_text_font(ui_LabelPPSVolUnit, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_PanelPPSCur = lv_obj_create(ui_PPSPage); - lv_obj_set_width(ui_PanelPPSCur, 80); - lv_obj_set_height(ui_PanelPPSCur, 35); - lv_obj_set_x(ui_PanelPPSCur, 60); - lv_obj_set_y(ui_PanelPPSCur, 10); - lv_obj_set_align(ui_PanelPPSCur, LV_ALIGN_TOP_MID); - lv_obj_remove_flag(ui_PanelPPSCur, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_PanelPPSCur, lv_color_hex(0x42AA49), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_PanelPPSCur, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelPPSCur = lv_label_create(ui_PanelPPSCur); - lv_obj_set_width(ui_LabelPPSCur, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelPPSCur, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelPPSCur, -12); - lv_obj_set_y(ui_LabelPPSCur, 0); - lv_obj_set_align(ui_LabelPPSCur, LV_ALIGN_RIGHT_MID); - lv_label_set_text(ui_LabelPPSCur, "2.25"); - lv_obj_set_style_text_font(ui_LabelPPSCur, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelPPSCurUnit = lv_label_create(ui_PanelPPSCur); - lv_obj_set_width(ui_LabelPPSCurUnit, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelPPSCurUnit, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelPPSCurUnit, 5); - lv_obj_set_y(ui_LabelPPSCurUnit, 0); - lv_obj_set_align(ui_LabelPPSCurUnit, LV_ALIGN_RIGHT_MID); - lv_label_set_text(ui_LabelPPSCurUnit, "A"); - lv_obj_set_style_text_font(ui_LabelPPSCurUnit, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_Spinner1 = lv_spinner_create(ui_PPSPage); - //lv_spinner_set_anim_params(ui_Spinner1, 1000, 90); - lv_obj_set_width(ui_Spinner1, 25); - lv_obj_set_height(ui_Spinner1, 25); - lv_obj_set_x(ui_Spinner1, -90); - lv_obj_set_y(ui_Spinner1, 15); - lv_obj_set_align(ui_Spinner1, LV_ALIGN_TOP_MID); - lv_obj_remove_flag(ui_Spinner1, LV_OBJ_FLAG_CLICKABLE); /// Flags - lv_obj_set_style_arc_width(ui_Spinner1, 5, LV_PART_MAIN | LV_STATE_DEFAULT); - - lv_obj_set_style_arc_width(ui_Spinner1, 5, LV_PART_INDICATOR | LV_STATE_DEFAULT); - - ui_PanelPPS = lv_obj_create(ui_PPSPage); - lv_obj_set_width(ui_PanelPPS, 480); - lv_obj_set_height(ui_PanelPPS, 110); - lv_obj_set_x(ui_PanelPPS, 120); - lv_obj_set_y(ui_PanelPPS, -10); - lv_obj_set_align(ui_PanelPPS, LV_ALIGN_CENTER); - lv_obj_remove_flag(ui_PanelPPS, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_PanelPPS, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_PanelPPS, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_color(ui_PanelPPS, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_PanelPPS, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnSet1 = lv_button_create(ui_PanelPPS); - lv_obj_set_width(ui_BtnSet1, 100); - lv_obj_set_height(ui_BtnSet1, 30); - lv_obj_set_x(ui_BtnSet1, -175); - lv_obj_set_y(ui_BtnSet1, -35); - lv_obj_set_align(ui_BtnSet1, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnSet1, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnSet1, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_border_color(ui_BtnSet1, lv_color_hex(0xF40F0F), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_BtnSet1, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_BtnSet1, 3, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelSet1 = lv_label_create(ui_BtnSet1); - lv_obj_set_width(ui_LabelSet1, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelSet1, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelSet1, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelSet1, "5V 1A"); - lv_obj_set_style_text_font(ui_LabelSet1, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnSet2 = lv_button_create(ui_PanelPPS); - lv_obj_set_width(ui_BtnSet2, 100); - lv_obj_set_height(ui_BtnSet2, 30); - lv_obj_set_x(ui_BtnSet2, -65); - lv_obj_set_y(ui_BtnSet2, -35); - lv_obj_set_align(ui_BtnSet2, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnSet2, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnSet2, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_border_color(ui_BtnSet2, lv_color_hex(0xF40F0F), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_BtnSet2, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_BtnSet2, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelSet2 = lv_label_create(ui_BtnSet2); - lv_obj_set_width(ui_LabelSet2, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelSet2, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelSet2, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelSet2, "9V 1A"); - lv_obj_set_style_text_font(ui_LabelSet2, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnSet3 = lv_button_create(ui_PanelPPS); - lv_obj_set_width(ui_BtnSet3, 100); - lv_obj_set_height(ui_BtnSet3, 30); - lv_obj_set_x(ui_BtnSet3, -175); - lv_obj_set_y(ui_BtnSet3, 0); - lv_obj_set_align(ui_BtnSet3, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnSet3, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnSet3, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_border_color(ui_BtnSet3, lv_color_hex(0xF40F0F), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_BtnSet3, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_BtnSet3, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelSet3 = lv_label_create(ui_BtnSet3); - lv_obj_set_width(ui_LabelSet3, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelSet3, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelSet3, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelSet3, "12V 1A"); - lv_obj_set_style_text_font(ui_LabelSet3, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnSet4 = lv_button_create(ui_PanelPPS); - lv_obj_set_width(ui_BtnSet4, 100); - lv_obj_set_height(ui_BtnSet4, 30); - lv_obj_set_x(ui_BtnSet4, -65); - lv_obj_set_y(ui_BtnSet4, 0); - lv_obj_set_align(ui_BtnSet4, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnSet4, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnSet4, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_border_color(ui_BtnSet4, lv_color_hex(0xF40F0F), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_BtnSet4, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_BtnSet4, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelSet4 = lv_label_create(ui_BtnSet4); - lv_obj_set_width(ui_LabelSet4, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelSet4, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelSet4, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelSet4, "15V 1A"); - lv_obj_set_style_text_font(ui_LabelSet4, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnSet5 = lv_button_create(ui_PanelPPS); - lv_obj_set_width(ui_BtnSet5, 100); - lv_obj_set_height(ui_BtnSet5, 30); - lv_obj_set_x(ui_BtnSet5, -175); - lv_obj_set_y(ui_BtnSet5, 35); - lv_obj_set_align(ui_BtnSet5, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnSet5, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnSet5, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_border_color(ui_BtnSet5, lv_color_hex(0xF40F0F), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_BtnSet5, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_BtnSet5, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelSet5 = lv_label_create(ui_BtnSet5); - lv_obj_set_width(ui_LabelSet5, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelSet5, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelSet5, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelSet5, "18V 1A"); - lv_obj_set_style_text_font(ui_LabelSet5, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnSet6 = lv_button_create(ui_PanelPPS); - lv_obj_set_width(ui_BtnSet6, 100); - lv_obj_set_height(ui_BtnSet6, 30); - lv_obj_set_x(ui_BtnSet6, -65); - lv_obj_set_y(ui_BtnSet6, 35); - lv_obj_set_align(ui_BtnSet6, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnSet6, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnSet6, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_border_color(ui_BtnSet6, lv_color_hex(0xF40F0F), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_BtnSet6, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_BtnSet6, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelSet6 = lv_label_create(ui_BtnSet6); - lv_obj_set_width(ui_LabelSet6, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelSet6, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelSet6, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelSet6, "20V 1A"); - lv_obj_set_style_text_font(ui_LabelSet6, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnValSet = lv_button_create(ui_PanelPPS); - lv_obj_set_width(ui_BtnValSet, 100); - lv_obj_set_height(ui_BtnValSet, 40); - lv_obj_set_x(ui_BtnValSet, 120); - lv_obj_set_y(ui_BtnValSet, -25); - lv_obj_set_align(ui_BtnValSet, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnValSet, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnValSet, LV_OBJ_FLAG_SCROLLABLE); /// Flags - - ui_LabelValSet = lv_label_create(ui_BtnValSet); - lv_obj_set_width(ui_LabelValSet, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelValSet, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelValSet, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelValSet, "5.00 V"); - lv_obj_set_style_text_font(ui_LabelValSet, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnValDec = lv_button_create(ui_PanelPPS); - lv_obj_set_width(ui_BtnValDec, 30); - lv_obj_set_height(ui_BtnValDec, 30); - lv_obj_set_x(ui_BtnValDec, 45); - lv_obj_set_y(ui_BtnValDec, -25); - lv_obj_set_align(ui_BtnValDec, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnValDec, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnValDec, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_border_color(ui_BtnValDec, lv_color_hex(0xF40F0F), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_BtnValDec, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_BtnValDec, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelValDec = lv_label_create(ui_BtnValDec); - lv_obj_set_width(ui_LabelValDec, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelValDec, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelValDec, 0); - lv_obj_set_y(ui_LabelValDec, -7); - lv_obj_set_align(ui_LabelValDec, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelValDec, "_"); - lv_obj_set_style_text_font(ui_LabelValDec, &lv_font_montserrat_20, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnValInc = lv_button_create(ui_PanelPPS); - lv_obj_set_width(ui_BtnValInc, 30); - lv_obj_set_height(ui_BtnValInc, 30); - lv_obj_set_x(ui_BtnValInc, 195); - lv_obj_set_y(ui_BtnValInc, -25); - lv_obj_set_align(ui_BtnValInc, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnValInc, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnValInc, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_border_color(ui_BtnValInc, lv_color_hex(0xF40F0F), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_BtnValInc, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_BtnValInc, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelValInc = lv_label_create(ui_BtnValInc); - lv_obj_set_width(ui_LabelValInc, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelValInc, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelValInc, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelValInc, "+"); - lv_obj_set_style_text_font(ui_LabelValInc, &lv_font_montserrat_22, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnCurSet = lv_button_create(ui_PanelPPS); - lv_obj_set_width(ui_BtnCurSet, 100); - lv_obj_set_height(ui_BtnCurSet, 40); - lv_obj_set_x(ui_BtnCurSet, 120); - lv_obj_set_y(ui_BtnCurSet, 25); - lv_obj_set_align(ui_BtnCurSet, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnCurSet, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnCurSet, LV_OBJ_FLAG_SCROLLABLE); /// Flags - - ui_LabelCurSet = lv_label_create(ui_BtnCurSet); - lv_obj_set_width(ui_LabelCurSet, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelCurSet, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelCurSet, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelCurSet, "1.00 A"); - lv_obj_set_style_text_font(ui_LabelCurSet, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnCurDec = lv_button_create(ui_PanelPPS); - lv_obj_set_width(ui_BtnCurDec, 30); - lv_obj_set_height(ui_BtnCurDec, 30); - lv_obj_set_x(ui_BtnCurDec, 45); - lv_obj_set_y(ui_BtnCurDec, 25); - lv_obj_set_align(ui_BtnCurDec, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnCurDec, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnCurDec, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_border_color(ui_BtnCurDec, lv_color_hex(0xF40F0F), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_BtnCurDec, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_BtnCurDec, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelCurDec = lv_label_create(ui_BtnCurDec); - lv_obj_set_width(ui_LabelCurDec, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelCurDec, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelCurDec, 0); - lv_obj_set_y(ui_LabelCurDec, -7); - lv_obj_set_align(ui_LabelCurDec, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelCurDec, "_"); - lv_obj_set_style_text_font(ui_LabelCurDec, &lv_font_montserrat_20, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnCurInc = lv_button_create(ui_PanelPPS); - lv_obj_set_width(ui_BtnCurInc, 30); - lv_obj_set_height(ui_BtnCurInc, 30); - lv_obj_set_x(ui_BtnCurInc, 195); - lv_obj_set_y(ui_BtnCurInc, 25); - lv_obj_set_align(ui_BtnCurInc, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnCurInc, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnCurInc, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_border_color(ui_BtnCurInc, lv_color_hex(0xF40F0F), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_BtnCurInc, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_BtnCurInc, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelCurInc = lv_label_create(ui_BtnCurInc); - lv_obj_set_width(ui_LabelCurInc, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelCurInc, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelCurInc, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelCurInc, "+"); - lv_obj_set_style_text_font(ui_LabelCurInc, &lv_font_montserrat_22, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnSwitch = lv_button_create(ui_PPSPage); - lv_obj_set_width(ui_BtnSwitch, 210); - lv_obj_set_height(ui_BtnSwitch, 30); - lv_obj_set_x(ui_BtnSwitch, 0); - lv_obj_set_y(ui_BtnSwitch, 60); - lv_obj_set_align(ui_BtnSwitch, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnSwitch, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnSwitch, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_BtnSwitch, lv_color_hex(0x725C08), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_BtnSwitch, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_color(ui_BtnSwitch, lv_color_hex(0xF40F0F), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_BtnSwitch, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_BtnSwitch, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - - ui_LabelSwitch = lv_label_create(ui_BtnSwitch); - lv_obj_set_width(ui_LabelSwitch, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelSwitch, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelSwitch, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelSwitch, _("press to Step Adjust")); - if(ui_get_language_select() == 0) - lv_obj_set_style_text_font(ui_LabelSwitch, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - else - lv_obj_set_style_text_font(ui_LabelSwitch, &ui_font_zhongyuan20, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_BtnClose = lv_button_create(ui_PPSPage); - lv_obj_set_width(ui_BtnClose, 210); - lv_obj_set_height(ui_BtnClose, 30); - lv_obj_set_x(ui_BtnClose, 0); - lv_obj_set_y(ui_BtnClose, 95); - lv_obj_set_align(ui_BtnClose, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_BtnClose, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_BtnClose, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_BtnClose, lv_color_hex(0x725C08), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_BtnClose, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_color(ui_BtnClose, lv_color_hex(0xF40F0F), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_BtnClose, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_BtnClose, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelClose = lv_label_create(ui_BtnClose); - lv_obj_set_width(ui_LabelClose, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelClose, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelClose, LV_ALIGN_CENTER); - lv_label_set_text(ui_LabelClose, _("press here to close PD")); - if(ui_get_language_select() == 0) - lv_obj_set_style_text_font(ui_LabelClose, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - else - lv_obj_set_style_text_font(ui_LabelClose, &ui_font_zhongyuan20, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_pps_timer = lv_timer_create(_flush_timer_cb, 500, NULL); - - // store panels in array - btns[0] = ui_BtnSet1; - btns[1] = ui_BtnSet2; - btns[2] = ui_BtnSet3; - btns[3] = ui_BtnSet4; - btns[4] = ui_BtnSet5; - btns[5] = ui_BtnSet6; - btns[6] = ui_BtnSwitch; - btns[7] = ui_BtnClose; - btns[8] = ui_BtnValDec; - btns[9] = ui_BtnValInc; - btns[10] = ui_BtnCurDec; - btns[11] = ui_BtnCurInc; - btns[12] = ui_BtnSwitch; - btns[13] = ui_BtnClose; - // - _para_init(); -} - -void ui_PPSPage_screen_destroy(void) -{ - if(ui_pps_timer) lv_timer_delete(ui_pps_timer); -} diff --git a/software/Power_Pico/User/GUI/screens/ui_PPSPage.h b/software/Power_Pico/User/GUI/screens/ui_PPSPage.h deleted file mode 100644 index 08db9c7..0000000 --- a/software/Power_Pico/User/GUI/screens/ui_PPSPage.h +++ /dev/null @@ -1,27 +0,0 @@ -// This file was generated by SquareLine Studio -// SquareLine Studio version: SquareLine Studio 1.5.4 -// LVGL version: 9.2.2 -// Project name: PowerPico - -#ifndef UI_PPSPAGE_H -#define UI_PPSPAGE_H - -#ifdef __cplusplus -extern "C" { -#endif - -// SCREEN: ui_PPSPage -void ui_PPSPage_screen_init(void); -void ui_PPSPage_screen_destroy(void); -extern lv_obj_t * ui_PPSPage; - -void ui_pps_page_key_handler(void* key_event); - -// CUSTOM VARIABLES - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif - diff --git a/software/Power_Pico/User/GUI/screens/ui_SetPage.c b/software/Power_Pico/User/GUI/screens/ui_SetPage.c deleted file mode 100644 index b7b5a7d..0000000 --- a/software/Power_Pico/User/GUI/screens/ui_SetPage.c +++ /dev/null @@ -1,531 +0,0 @@ -// This file was generated by SquareLine Studio -// SquareLine Studio version: SquareLine Studio 1.5.3 -// LVGL version: 9.2.2 -// Project name: PowerPico - -#include "../ui.h" -#include "./ui_PPSPage.h" - -lv_obj_t * ui_SetPage = NULL; -// backlight -static lv_obj_t * ui_PanelBL = NULL; -static lv_obj_t * ui_SliderBL = NULL; -static lv_obj_t * ui_LabelBL = NULL; -// key sound -static lv_obj_t * ui_PanelKS = NULL; -static lv_obj_t * ui_SwitchKS = NULL; -static lv_obj_t * ui_LabelKS = NULL; -// language -static lv_obj_t * ui_PanelLang = NULL; -static lv_obj_t * ui_SwitchLang = NULL; -static lv_obj_t * ui_LabelLang = NULL; -// chose rotation -static lv_obj_t * ui_PanelRotate = NULL; -static lv_obj_t * ui_LabelRotation = NULL; -static lv_obj_t * ui_LabelRotNum = NULL; -// enable PPS, goto PPS page -static lv_obj_t * ui_PanelPPS = NULL; -static lv_obj_t * ui_SwitchPPS = NULL; -static lv_obj_t * ui_LabelPPS = NULL; -// about -static lv_obj_t * ui_PanelAbout = NULL; -static lv_obj_t * ui_LabelAbout = NULL; - -static lv_timer_t * _setting_timer = NULL; - -static lv_obj_t * msgbox = NULL; // msgbox 对象 -static lv_obj_t * spinner = NULL; // spinner 对象 -static bool waiting_for_signal = false; // 标志位,表示是否在等待信号 - -static lv_obj_t * panels[6]; // 存储所有 panel 的指针 -static int current_panel_index = 0; // 当前选中的 panel 索引 - -static void show_wait_msgbox(void); -static void hide_wait_msgbox(void); -static void show_fail_msgbox(void); -static void show_restart_msgbox(void); - -// event funtions - -/////////////////////// Timer ////////////////////// -static void _setting_timer_cb(lv_timer_t * timer) { - int8_t Msg = 0; - Msg = MsgQueueGet_PPS_ready(); - if(Msg == 1) { - // 隐藏等待框 - hide_wait_msgbox(); - lv_lib_pm_goto("PPS Page", NULL); - } else if(Msg == -1) { - // 隐藏等待框 - hide_wait_msgbox(); - // 显示失败框 - show_fail_msgbox(); - ui_send_pps_stop_msg(); - } -} - -///////////////// key function /////////////////// - -#include "key.h" -void ui_set_page_key_handler(void *key_event) -{ - if(waiting_for_signal) return; - int panel_count = sizeof(panels) / sizeof(panels[0]); - // key boot - if (((key_event_t*)key_event)->id == KEY_ID_B && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - { - lv_lib_pm_goto_first(); - } - // key left - if (((key_event_t*)key_event)->id == KEY_ID_L && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - { - lv_obj_clear_state(panels[current_panel_index], LV_STATE_CHECKED); - current_panel_index = (current_panel_index - 1 + panel_count) % panel_count; - lv_obj_add_state(panels[current_panel_index], LV_STATE_CHECKED); - lv_obj_scroll_to_view(panels[current_panel_index], LV_ANIM_ON); - } - // key right - else if (((key_event_t*)key_event)->id == KEY_ID_R && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - { - lv_obj_clear_state(panels[current_panel_index], LV_STATE_CHECKED); - current_panel_index = (current_panel_index + 1) % panel_count; - lv_obj_add_state(panels[current_panel_index], LV_STATE_CHECKED); - lv_obj_scroll_to_view(panels[current_panel_index], LV_ANIM_ON); - } - // key yes or key neg - else if(((key_event_t*)key_event)->id == KEY_ID_Y || ((key_event_t*)key_event)->id == KEY_ID_N) - { - switch(current_panel_index) - { - // Screen Brightness - case 0: - if (((key_event_t*)key_event)->id == KEY_ID_Y && - (((key_event_t*)key_event)->type == KEY_EVT_CLICK || ((key_event_t*)key_event)->type == KEY_EVT_REPEAT)) { // key yes - int16_t slider_value = lv_slider_get_value(ui_SliderBL); - slider_value += 10; - if(slider_value > 100) slider_value = 100; - lv_slider_set_value(ui_SliderBL, slider_value, LV_ANIM_ON); - ui_set_back_light_level(slider_value); - } else if (((key_event_t*)key_event)->id == KEY_ID_N && - (((key_event_t*)key_event)->type == KEY_EVT_CLICK || ((key_event_t*)key_event)->type == KEY_EVT_REPEAT)) { // key neg - int16_t slider_value = lv_slider_get_value(ui_SliderBL); - slider_value -= 10; - if(slider_value < 10) slider_value = 10; - lv_slider_set_value(ui_SliderBL, slider_value, LV_ANIM_ON); - ui_set_back_light_level(slider_value); - } - break; - // key sound - case 1: - // key yes - if (((key_event_t*)key_event)->id == KEY_ID_Y && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - { - lv_obj_add_state(ui_SwitchKS, LV_STATE_CHECKED); - ui_set_key_sound_enable(1); - } - // key neg - else if (((key_event_t*)key_event)->id == KEY_ID_N && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - { - lv_obj_clear_state(ui_SwitchKS, LV_STATE_CHECKED); - ui_set_key_sound_enable(0); - } - break; - - // language - case 2: - // key yes - if (((key_event_t*)key_event)->id == KEY_ID_Y && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - { - show_restart_msgbox(); - lv_obj_add_state(ui_SwitchLang, LV_STATE_CHECKED); - ui_set_language_select(1); - lv_i18n_set_locale("zh-cn"); - } - // key neg - else if (((key_event_t*)key_event)->id == KEY_ID_N && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - { - show_restart_msgbox(); - lv_obj_clear_state(ui_SwitchLang, LV_STATE_CHECKED); - ui_set_language_select(0); - lv_i18n_set_locale("en"); - } - break; - - // chose rotation - case 3: - uint16_t rotation = ui_get_display_rotation(); - // key yes - if (((key_event_t*)key_event)->id == KEY_ID_Y && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - { - rotation = (rotation + 360 + 90) % 360; - } - // key neg - else if (((key_event_t*)key_event)->id == KEY_ID_N && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - { - rotation = (rotation + 360 - 90) % 360; - } - if (rotation == 0) { - lv_label_set_text(ui_LabelRotNum, "< 0 >"); - } else if (rotation == 90) { - lv_label_set_text(ui_LabelRotNum, "< 90 >"); - } else if (rotation == 180) { - lv_label_set_text(ui_LabelRotNum, "< 180 >"); - } else if (rotation == 270) { - lv_label_set_text(ui_LabelRotNum, "< 270 >"); - } - ui_set_display_rotation(rotation); - ui_full_screen_refresh(ui_SetPage); - break; - - // PPS page - case 4: - // 发送开启PD诱骗的信号 - if (((key_event_t*)key_event)->id == KEY_ID_Y && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - { - // 发送pps开始信号到PD UFP Task - ui_send_pps_start_msg(); - // 弹出 msgbox 等待PD完成,并锁住按键操作 - show_wait_msgbox(); - // lv_lib_pm_goto("PPS Page", NULL); - } - break; - // about - case 5: - // do nothing - break; - } - // save settings to eeprom - ui_system_settings_save(); - } -} - -/////////////////////// para_initialize ////////////////////// - -static void on_setpage_loaded(lv_event_t * e) { - // 当 SetPage 页面加载完成后,滚动到当前选中的 panel - lv_obj_scroll_to_view(panels[current_panel_index], LV_ANIM_ON); -} - -static void _setting_init(void) { - - // backlight - lv_slider_set_value(ui_SliderBL, ui_get_back_light_level(), LV_ANIM_OFF); - - // key sound - if(ui_get_key_sound_enable()) - lv_obj_add_state(ui_SwitchKS, LV_STATE_CHECKED); - else - lv_obj_clear_state(ui_SwitchKS, LV_STATE_CHECKED); - - // language - if(ui_get_language_select() == 1) - lv_obj_add_state(ui_SwitchLang, LV_STATE_CHECKED); - else - lv_obj_clear_state(ui_SwitchLang, LV_STATE_CHECKED); - - // lcd rotation - uint16_t rotation = ui_get_display_rotation(); - if (rotation == 0) { - lv_label_set_text(ui_LabelRotNum, "< 0 >"); - } else if (rotation == 90) { - lv_label_set_text(ui_LabelRotNum, "< 90 >"); - } else if (rotation == 180) { - lv_label_set_text(ui_LabelRotNum, "< 180 >"); - } else if (rotation == 270) { - lv_label_set_text(ui_LabelRotNum, "< 270 >"); - } -} - -/////////////////////// ui_components ////////////////////// - -// 显示 PD msgbox -static void show_wait_msgbox(void) { - - // 获取当前视角y pos - int32_t view_y = lv_obj_get_scroll_top(ui_SetPage); - // 创建 msgbox - msgbox = lv_obj_create(ui_SetPage); - lv_obj_set_size(msgbox, 200, 160); - lv_obj_center(msgbox); - lv_obj_set_pos(msgbox, 0, view_y); - lv_obj_set_style_bg_color(msgbox, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(msgbox, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - - // 添加 spinner - spinner = lv_spinner_create(msgbox); - lv_obj_set_size(spinner, 60, 60); - lv_obj_center(spinner); - - // 添加文本 - lv_obj_t * label = lv_label_create(msgbox); - lv_label_set_text(label, "Waiting for PD..."); - lv_obj_set_align(label, LV_ALIGN_BOTTOM_MID); - lv_obj_set_style_text_font(label, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - // 设置标志位 - waiting_for_signal = true; -} - -// 隐藏 PD msgbox -static void hide_wait_msgbox(void) { - if (msgbox) { - lv_obj_del(msgbox); - msgbox = NULL; - spinner = NULL; - } - waiting_for_signal = false; -} - -// 定时器回调函数,用于关闭失败弹窗 -static void _fail_msgbox_timer_cb(lv_timer_t * t) { - lv_obj_t * mbox = (lv_obj_t *)lv_timer_get_user_data(t); - if (mbox) { - lv_obj_del(mbox); // 删除 msgbox - } - lv_timer_del(t); // 删除定时器 -} - -// 显示重启提示弹窗 -static void show_restart_msgbox(void) { - // 获取当前视角y pos - int32_t view_y = lv_obj_get_scroll_top(ui_SetPage); - // 创建 msgbox - lv_obj_t * restart_msgbox = lv_obj_create(ui_SetPage); - lv_obj_set_size(restart_msgbox, 220, 100); - lv_obj_center(restart_msgbox); - lv_obj_set_pos(restart_msgbox, 0, view_y); - lv_obj_set_style_bg_color(restart_msgbox, lv_color_hex(0x958030), LV_PART_MAIN | LV_STATE_DEFAULT); // 黄色背景 - lv_obj_set_style_bg_opa(restart_msgbox, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - // 添加文本 - lv_obj_t * label = lv_label_create(restart_msgbox); - lv_label_set_text(label, _("Please reboot to apply\nall changes!")); - lv_obj_center(label); - if(ui_get_language_select() == 0) - { - // 如果是English - lv_obj_set_style_text_font(label, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - } - else - { - // 如果是中文 - lv_obj_set_style_text_font(label, &ui_font_zhongyuan20, LV_PART_MAIN | LV_STATE_DEFAULT); - } - lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0); - - // 设置定时器,2 秒后关闭弹窗 - lv_timer_t * timer = lv_timer_create(_fail_msgbox_timer_cb, 2000, restart_msgbox); // 重用关闭回调 - lv_timer_set_repeat_count(timer, 1); // 只执行一次 -} - -// 显示PPS失败提示弹窗 -static void show_fail_msgbox(void) { - // 获取当前视角y pos - int32_t view_y = lv_obj_get_scroll_top(ui_SetPage); - // 创建 msgbox - msgbox = lv_obj_create(ui_SetPage); - lv_obj_set_size(msgbox, 200, 100); - lv_obj_center(msgbox); - lv_obj_set_pos(msgbox, 0, view_y); - lv_obj_set_style_bg_color(msgbox, lv_color_hex(0xFF0000), LV_PART_MAIN | LV_STATE_DEFAULT); // 红色背景 - lv_obj_set_style_bg_opa(msgbox, 200, LV_PART_MAIN | LV_STATE_DEFAULT); - - // 添加文本 - lv_obj_t * label = lv_label_create(msgbox); - lv_label_set_text(label, "PD Setting Failed!"); - lv_obj_center(label); - lv_obj_set_style_text_font(label, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - - // 设置定时器,2 秒后关闭弹窗 - lv_timer_t * timer = lv_timer_create(_fail_msgbox_timer_cb, 2000, msgbox); // 传递 msgbox 对象 - lv_timer_set_repeat_count(timer, 1); // 只执行一次 -} - -/////////////////////// ui_initialize ////////////////////// - -void ui_SetPage_screen_init(void) -{ - ui_SetPage = lv_obj_create(NULL); - - ui_PanelBL = lv_obj_create(ui_SetPage); - lv_obj_set_width(ui_PanelBL, 234); - lv_obj_set_height(ui_PanelBL, 65); - lv_obj_set_x(ui_PanelBL, 0); - lv_obj_set_y(ui_PanelBL, 5); - lv_obj_set_align(ui_PanelBL, LV_ALIGN_TOP_MID); - lv_obj_add_flag(ui_PanelBL, LV_OBJ_FLAG_CHECKABLE); /// Flags - lv_obj_remove_flag(ui_PanelBL, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_PanelBL, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_CHECKED); - lv_obj_set_style_bg_opa(ui_PanelBL, 255, LV_PART_MAIN | LV_STATE_CHECKED); - - ui_SliderBL = lv_slider_create(ui_PanelBL); - lv_slider_set_value(ui_SliderBL, 50, LV_ANIM_OFF); - if(lv_slider_get_mode(ui_SliderBL) == LV_SLIDER_MODE_RANGE) lv_slider_set_left_value(ui_SliderBL, 0, LV_ANIM_OFF); - lv_obj_set_width(ui_SliderBL, 200); - lv_obj_set_height(ui_SliderBL, 10); - lv_obj_set_align(ui_SliderBL, LV_ALIGN_BOTTOM_MID); - - //Compensating for LVGL9.1 draw crash with bar/slider max value when top-padding is nonzero and right-padding is 0 - if(lv_obj_get_style_pad_top(ui_SliderBL, LV_PART_MAIN) > 0) lv_obj_set_style_pad_right(ui_SliderBL, lv_obj_get_style_pad_right(ui_SliderBL, LV_PART_MAIN) + 1, LV_PART_MAIN); - ui_LabelBL = lv_label_create(ui_PanelBL); - lv_obj_set_width(ui_LabelBL, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelBL, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelBL, 0); - lv_obj_set_y(ui_LabelBL, -5); - lv_label_set_text(ui_LabelBL, _("Screen Brightness :")); - if(ui_get_language_select() == 0) - lv_obj_set_style_text_font(ui_LabelBL, &lv_font_montserrat_16, LV_PART_MAIN | LV_STATE_DEFAULT); - else - lv_obj_set_style_text_font(ui_LabelBL, &ui_font_zhongyuan18, LV_PART_MAIN | LV_STATE_DEFAULT); - - - ui_PanelKS = lv_obj_create(ui_SetPage); - lv_obj_set_width(ui_PanelKS, 234); - lv_obj_set_height(ui_PanelKS, 45); - lv_obj_set_x(ui_PanelKS, 0); - lv_obj_set_y(ui_PanelKS, 75); - lv_obj_set_align(ui_PanelKS, LV_ALIGN_TOP_MID); - lv_obj_add_flag(ui_PanelKS, LV_OBJ_FLAG_CHECKABLE); /// Flags - lv_obj_remove_flag(ui_PanelKS, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_PanelKS, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_CHECKED); - lv_obj_set_style_bg_opa(ui_PanelKS, 255, LV_PART_MAIN | LV_STATE_CHECKED); - - ui_SwitchKS = lv_switch_create(ui_PanelKS); - lv_obj_set_width(ui_SwitchKS, 50); - lv_obj_set_height(ui_SwitchKS, 25); - lv_obj_set_align(ui_SwitchKS, LV_ALIGN_RIGHT_MID); - lv_obj_add_state(ui_SwitchKS, LV_STATE_CHECKED); /// States - - ui_LabelKS = lv_label_create(ui_PanelKS); - lv_obj_set_width(ui_LabelKS, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelKS, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelKS, LV_ALIGN_LEFT_MID); - lv_label_set_text(ui_LabelKS, _("Enable key sound")); - if(ui_get_language_select() == 0) - lv_obj_set_style_text_font(ui_LabelKS, &lv_font_montserrat_16, LV_PART_MAIN | LV_STATE_DEFAULT); - else - lv_obj_set_style_text_font(ui_LabelKS, &ui_font_zhongyuan18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_PanelLang = lv_obj_create(ui_SetPage); - lv_obj_set_width(ui_PanelLang, 234); - lv_obj_set_height(ui_PanelLang, 45); - lv_obj_set_x(ui_PanelLang, 0); - lv_obj_set_y(ui_PanelLang, 125); - lv_obj_set_align(ui_PanelLang, LV_ALIGN_TOP_MID); - lv_obj_add_flag(ui_PanelLang, LV_OBJ_FLAG_CHECKABLE); /// Flags - lv_obj_remove_flag(ui_PanelLang, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_PanelLang, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_CHECKED); - lv_obj_set_style_bg_opa(ui_PanelLang, 255, LV_PART_MAIN | LV_STATE_CHECKED); - - ui_SwitchLang = lv_switch_create(ui_PanelLang); - lv_obj_set_width(ui_SwitchLang, 50); - lv_obj_set_height(ui_SwitchLang, 25); - lv_obj_set_align(ui_SwitchLang, LV_ALIGN_RIGHT_MID); - - ui_LabelLang = lv_label_create(ui_PanelLang); - lv_obj_set_width(ui_LabelLang, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelLang, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelLang, LV_ALIGN_LEFT_MID); - lv_label_set_text(ui_LabelLang, _("Enable Chinese")); - if(ui_get_language_select() == 0) - lv_obj_set_style_text_font(ui_LabelLang, &lv_font_montserrat_16, LV_PART_MAIN | LV_STATE_DEFAULT); - else - lv_obj_set_style_text_font(ui_LabelLang, &ui_font_zhongyuan18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_PanelRotate = lv_obj_create(ui_SetPage); - lv_obj_set_width(ui_PanelRotate, 234); - lv_obj_set_height(ui_PanelRotate, 45); - lv_obj_set_x(ui_PanelRotate, 0); - lv_obj_set_y(ui_PanelRotate, 175); - lv_obj_set_align(ui_PanelRotate, LV_ALIGN_TOP_MID); - lv_obj_add_flag(ui_PanelRotate, LV_OBJ_FLAG_CHECKABLE); /// Flags - lv_obj_remove_flag(ui_PanelRotate, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_PanelRotate, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_CHECKED); - lv_obj_set_style_bg_opa(ui_PanelRotate, 255, LV_PART_MAIN | LV_STATE_CHECKED); - - ui_LabelRotation = lv_label_create(ui_PanelRotate); - lv_obj_set_width(ui_LabelRotation, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelRotation, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelRotation, LV_ALIGN_LEFT_MID); - lv_label_set_text(ui_LabelRotation, _("Chose Rotation")); - if(ui_get_language_select() == 0) - lv_obj_set_style_text_font(ui_LabelRotation, &lv_font_montserrat_16, LV_PART_MAIN | LV_STATE_DEFAULT); - else - lv_obj_set_style_text_font(ui_LabelRotation, &ui_font_zhongyuan18, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelRotNum = lv_label_create(ui_PanelRotate); - lv_obj_set_width(ui_LabelRotNum, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelRotNum, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelRotNum, LV_ALIGN_RIGHT_MID); - lv_label_set_text(ui_LabelRotNum, "< 180 >"); - lv_obj_set_style_text_font(ui_LabelRotNum, &lv_font_montserrat_16, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_PanelPPS = lv_obj_create(ui_SetPage); - lv_obj_set_width(ui_PanelPPS, 234); - lv_obj_set_height(ui_PanelPPS, 45); - lv_obj_set_x(ui_PanelPPS, 0); - lv_obj_set_y(ui_PanelPPS, 225); - lv_obj_set_align(ui_PanelPPS, LV_ALIGN_TOP_MID); - lv_obj_add_flag(ui_PanelPPS, LV_OBJ_FLAG_CHECKABLE); /// Flags - lv_obj_remove_flag(ui_PanelPPS, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_PanelPPS, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_CHECKED); - lv_obj_set_style_bg_opa(ui_PanelPPS, 255, LV_PART_MAIN | LV_STATE_CHECKED); - - ui_SwitchPPS = lv_switch_create(ui_PanelPPS); - lv_obj_set_width(ui_SwitchPPS, 50); - lv_obj_set_height(ui_SwitchPPS, 25); - lv_obj_set_align(ui_SwitchPPS, LV_ALIGN_RIGHT_MID); - - ui_LabelPPS = lv_label_create(ui_PanelPPS); - lv_obj_set_width(ui_LabelPPS, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelPPS, LV_SIZE_CONTENT); /// 1 - lv_obj_set_align(ui_LabelPPS, LV_ALIGN_LEFT_MID); - lv_label_set_text(ui_LabelPPS, _("PD Sink")); - if(ui_get_language_select() == 0) - lv_obj_set_style_text_font(ui_LabelPPS, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); - else - lv_obj_set_style_text_font(ui_LabelPPS, &ui_font_zhongyuan20, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_PanelAbout = lv_obj_create(ui_SetPage); - lv_obj_set_width(ui_PanelAbout, 234); - lv_obj_set_height(ui_PanelAbout, 100); - lv_obj_set_x(ui_PanelAbout, 0); - lv_obj_set_y(ui_PanelAbout, 275); - lv_obj_set_align(ui_PanelAbout, LV_ALIGN_TOP_MID); - lv_obj_add_flag(ui_PanelAbout, LV_OBJ_FLAG_CHECKABLE); /// Flags - lv_obj_remove_flag(ui_PanelAbout, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_PanelAbout, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_CHECKED); - lv_obj_set_style_bg_opa(ui_PanelAbout, 255, LV_PART_MAIN | LV_STATE_CHECKED); - - ui_LabelAbout = lv_label_create(ui_PanelAbout); - lv_obj_set_width(ui_LabelAbout, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelAbout, LV_SIZE_CONTENT); /// 1 - lv_label_set_text(ui_LabelAbout, "About\nPower-Pico\nThe uA current meter\nV 1.0.5"); - lv_obj_set_style_text_font(ui_LabelAbout, &lv_font_montserrat_16, LV_PART_MAIN | LV_STATE_DEFAULT); - - // init setting values - _setting_init(); - - // store panels in array - panels[0] = ui_PanelBL; - panels[1] = ui_PanelKS; - panels[2] = ui_PanelLang; - panels[3] = ui_PanelRotate; - panels[4] = ui_PanelPPS; - panels[5] = ui_PanelAbout; - lv_obj_add_state(panels[current_panel_index], LV_STATE_CHECKED); - - // timer - _setting_timer = lv_timer_create(_setting_timer_cb, 500, NULL); - - // - lv_obj_add_event_cb(ui_SetPage, on_setpage_loaded, LV_EVENT_SCREEN_LOADED, NULL); - -} - -void ui_SetPage_screen_destroy(void) -{ - if(_setting_timer) { - lv_timer_delete(_setting_timer); - } -} diff --git a/software/Power_Pico/User/GUI/screens/ui_SetPage.h b/software/Power_Pico/User/GUI/screens/ui_SetPage.h deleted file mode 100644 index 73b994a..0000000 --- a/software/Power_Pico/User/GUI/screens/ui_SetPage.h +++ /dev/null @@ -1,26 +0,0 @@ -// This file was generated by SquareLine Studio -// SquareLine Studio version: SquareLine Studio 1.5.3 -// LVGL version: 9.2.2 -// Project name: PowerPico - -#ifndef UI_SETPAGE_H -#define UI_SETPAGE_H - -#ifdef __cplusplus -extern "C" { -#endif - -// SCREEN: ui_SetPage -extern void ui_SetPage_screen_init(void); -extern void ui_SetPage_screen_destroy(void); -extern lv_obj_t * ui_SetPage; -void ui_set_page_key_handler(void *key_event); - -// CUSTOM VARIABLES - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif - diff --git a/software/Power_Pico/User/GUI/screens/ui_StartPage.c b/software/Power_Pico/User/GUI/screens/ui_StartPage.c deleted file mode 100644 index 897b241..0000000 --- a/software/Power_Pico/User/GUI/screens/ui_StartPage.c +++ /dev/null @@ -1,137 +0,0 @@ -// This file was generated by SquareLine Studio -// SquareLine Studio version: SquareLine Studio 1.5.3 -// LVGL version: 9.2.2 -// Project name: PowerPico - -#include "../ui.h" - -lv_obj_t * ui_StartPage = NULL; -static lv_obj_t * ui_Panel1 = NULL; -static lv_obj_t * ui_Image2 = NULL; -static lv_obj_t * ui_Label1 = NULL; -static lv_obj_t * ui_Panel2 = NULL; -static lv_obj_t * ui_Button1 = NULL; -static lv_obj_t * ui_Button2 = NULL; -static lv_obj_t * ui_Button3 = NULL; -static lv_obj_t * ui_Button4 = NULL; - -static lv_timer_t * _flush_timer = NULL; - -// event funtions - -static void ui_startpage_timer_cb(lv_timer_t * timer) -{ - ui_full_screen_refresh(ui_StartPage); -} - -// build funtions - -static void _ui_StartPage_btn_animation(void) -{ - lv_lib_anim_user_animation(ui_Button1, 0, 600, 50, 20, 0, 600, 0, LV_ANIM_REPEAT_INFINITE, lv_anim_path_ease_in_out, lv_lib_anim_callback_set_hight, NULL); - lv_lib_anim_user_animation(ui_Button2, 200, 600, 50, 20, 0, 600, 0, LV_ANIM_REPEAT_INFINITE, lv_anim_path_ease_in_out, lv_lib_anim_callback_set_hight, NULL); - lv_lib_anim_user_animation(ui_Button3, 400, 600, 50, 20, 0, 600, 0, LV_ANIM_REPEAT_INFINITE, lv_anim_path_ease_in_out, lv_lib_anim_callback_set_hight, NULL); - lv_lib_anim_user_animation(ui_Button4, 600, 600, 50, 20, 0, 600, 0, LV_ANIM_REPEAT_INFINITE, lv_anim_path_ease_in_out, lv_lib_anim_callback_set_hight, NULL); -} - -void ui_StartPage_screen_init(void) -{ - ui_StartPage = lv_obj_create(NULL); - lv_obj_remove_flag(ui_StartPage, LV_OBJ_FLAG_SCROLLABLE); /// Flags - - ui_Panel1 = lv_obj_create(ui_StartPage); - lv_obj_set_width(ui_Panel1, 120); - lv_obj_set_height(ui_Panel1, 120); - lv_obj_set_x(ui_Panel1, 0); - lv_obj_set_y(ui_Panel1, -35); - lv_obj_set_align(ui_Panel1, LV_ALIGN_CENTER); - lv_obj_remove_flag(ui_Panel1, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_radius(ui_Panel1, 128, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_color(ui_Panel1, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_Panel1, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_color(ui_Panel1, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_opa(ui_Panel1, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_Image2 = lv_image_create(ui_Panel1); - lv_image_set_src(ui_Image2, &ui_img_chicken_png); - lv_obj_set_width(ui_Image2, LV_SIZE_CONTENT); /// 128 - lv_obj_set_height(ui_Image2, LV_SIZE_CONTENT); /// 128 - lv_obj_set_x(ui_Image2, -4); - lv_obj_set_y(ui_Image2, -2); - lv_obj_set_align(ui_Image2, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_Image2, LV_OBJ_FLAG_CLICKABLE); /// Flags - lv_obj_remove_flag(ui_Image2, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_image_set_scale(ui_Image2, 196); - - ui_Label1 = lv_label_create(ui_StartPage); - lv_obj_set_width(ui_Label1, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_Label1, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_Label1, 0); - lv_obj_set_y(ui_Label1, 45); - lv_obj_set_align(ui_Label1, LV_ALIGN_CENTER); - lv_label_set_text(ui_Label1, "Power-Pico"); - lv_obj_set_style_text_font(ui_Label1, &lv_font_montserrat_28, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_Panel2 = lv_obj_create(ui_StartPage); - lv_obj_set_width(ui_Panel2, 150); - lv_obj_set_height(ui_Panel2, 50); - lv_obj_set_x(ui_Panel2, 0); - lv_obj_set_y(ui_Panel2, 90); - lv_obj_set_align(ui_Panel2, LV_ALIGN_CENTER); - lv_obj_remove_flag(ui_Panel2, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_radius(ui_Panel2, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_color(ui_Panel2, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_Panel2, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_border_width(ui_Panel2, 0, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_Button1 = lv_button_create(ui_Panel2); - lv_obj_set_width(ui_Button1, 30); - lv_obj_set_height(ui_Button1, 50); - lv_obj_set_x(ui_Button1, -54); - lv_obj_set_y(ui_Button1, 0); - lv_obj_set_align(ui_Button1, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_Button1, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_Button1, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_Button1, lv_color_hex(0xE36666), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_Button1, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_Button2 = lv_button_create(ui_Panel2); - lv_obj_set_width(ui_Button2, 30); - lv_obj_set_height(ui_Button2, 50); - lv_obj_set_x(ui_Button2, -18); - lv_obj_set_y(ui_Button2, 0); - lv_obj_set_align(ui_Button2, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_Button2, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_Button2, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_Button2, lv_color_hex(0x59D362), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_Button2, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_Button3 = lv_button_create(ui_Panel2); - lv_obj_set_width(ui_Button3, 30); - lv_obj_set_height(ui_Button3, 50); - lv_obj_set_x(ui_Button3, 18); - lv_obj_set_y(ui_Button3, 0); - lv_obj_set_align(ui_Button3, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_Button3, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_Button3, LV_OBJ_FLAG_SCROLLABLE); /// Flags - - ui_Button4 = lv_button_create(ui_Panel2); - lv_obj_set_width(ui_Button4, 30); - lv_obj_set_height(ui_Button4, 50); - lv_obj_set_x(ui_Button4, 54); - lv_obj_set_y(ui_Button4, 0); - lv_obj_set_align(ui_Button4, LV_ALIGN_CENTER); - lv_obj_add_flag(ui_Button4, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_Button4, LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_Button4, lv_color_hex(0x9F9960), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_Button4, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - - _ui_StartPage_btn_animation(); - // _flush_timer = lv_timer_create(ui_startpage_timer_cb, 500, NULL); - -} - -void ui_StartPage_screen_destroy(void) -{ - lv_timer_delete(_flush_timer); -} diff --git a/software/Power_Pico/User/GUI/screens/ui_StartPage.h b/software/Power_Pico/User/GUI/screens/ui_StartPage.h deleted file mode 100644 index ecddc7d..0000000 --- a/software/Power_Pico/User/GUI/screens/ui_StartPage.h +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by SquareLine Studio -// SquareLine Studio version: SquareLine Studio 1.5.3 -// LVGL version: 9.2.2 -// Project name: PowerPico - -#ifndef UI_STARTPAGE_H -#define UI_STARTPAGE_H - -#ifdef __cplusplus -extern "C" { -#endif - -// SCREEN: ui_StartPage -extern void ui_StartPage_screen_init(void); -extern void ui_StartPage_screen_destroy(void); -extern lv_obj_t * ui_StartPage; - -// CUSTOM VARIABLES - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif - diff --git a/software/Power_Pico/User/GUI/screens/ui_mainPage.c b/software/Power_Pico/User/GUI/screens/ui_mainPage.c deleted file mode 100644 index 6c08aef..0000000 --- a/software/Power_Pico/User/GUI/screens/ui_mainPage.c +++ /dev/null @@ -1,260 +0,0 @@ -// This file was generated by SquareLine Studio -// SquareLine Studio version: SquareLine Studio 1.5.3 -// LVGL version: 9.2.2 -// Project name: PowerPico - -#include "../ui.h" -#include "ui_mainPage.h" -#include "math.h" - -lv_obj_t * ui_HomeScreen = NULL; -static lv_obj_t * ui_ButVal = NULL; -static lv_obj_t * ui_LabelUnitVal = NULL; -static lv_obj_t * ui_LabelValt = NULL; -static lv_obj_t * ui_ButCur = NULL; -static lv_obj_t * ui_LabelUnitCur = NULL; -static lv_obj_t * ui_LabelCur = NULL; -static lv_obj_t * ui_ButEnerge = NULL; -static lv_obj_t * ui_LabelUnitEnerge = NULL; -static lv_obj_t * ui_LabelEnerge = NULL; -static lv_obj_t * ui_ButTime = NULL; -static lv_obj_t * ui_LabelTime = NULL; -static lv_timer_t * _flush_timer = NULL; - -// other funtions - -#include "key.h" -void ui_main_page_key_handler(void* key_event) -{ - if(((key_event_t*)key_event)->id == KEY_ID_B && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - { - lv_lib_pm_next(); - } - // else if (((key_event_t*)key_event)->id == KEY_ID_L && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - // { - // // rotation - 90 degrees - // // rotation – LV_DISPLAY_ROTATION_0/90/180/270 - // uint16_t rotation = ui_get_display_rotation(); - // rotation = (rotation + 360 - 90) % 360; - // // set rotation value - // ui_set_display_rotation(rotation); - // // save settings to eeprom - // ui_system_settings_save(); - // ui_full_screen_refresh(ui_HomeScreen); - // } - // else if (((key_event_t*)key_event)->id == KEY_ID_R && ((key_event_t*)key_event)->type == KEY_EVT_CLICK) - // { - // // rotation + 90 degrees - // uint16_t rotation = ui_get_display_rotation(); - // rotation = (rotation + 360 + 90) % 360; - // // set rotation value - // ui_set_display_rotation(rotation); - // // save settings to eeprom - // ui_system_settings_save(); - // ui_full_screen_refresh(ui_HomeScreen); - // } -} - -static void fmt_sig4(char *buf, size_t size, float v) -{ - if (!isfinite(v)) { snprintf(buf, size, "--"); return; } - if (fabsf(v) < 1e-9f) v = 0.0f; // 处理接近零的值 - float av = fabsf(v); - int int_digits = (av >= 1.0f) ? ((int)floorf(log10f(av)) + 1) : 0; - if(int_digits >= 4) { - snprintf(buf, size, "%.0f", roundf(v)); - return; - } - int decimals = (int_digits == 0) ? 3 : (4 - int_digits); // 确保总数字为 4 - snprintf(buf, size, "%.*f", decimals, v); -} - -static void set_val_cur_label(float voltage, float current) -{ - char buf[16]; - - // voltage (单位: V) -> 4 位有效数字 - fmt_sig4(buf, sizeof(buf), voltage); - lv_label_set_text(ui_LabelValt, buf); - - // current (原始单位: uA) - float cur_uA = current; - float cur_abs_uA = fabsf(cur_uA); - float cur_disp = 0.0f; - - if (cur_abs_uA >= 1e6f) { - cur_disp = cur_uA / 1e6f; // A - fmt_sig4(buf, sizeof(buf), cur_disp); - lv_label_set_text(ui_LabelCur, buf); - lv_label_set_text(ui_LabelUnitCur, "A"); - } else if (cur_abs_uA >= 1e3f) { - cur_disp = cur_uA / 1e3f; // mA - fmt_sig4(buf, sizeof(buf), cur_disp); - lv_label_set_text(ui_LabelCur, buf); - lv_label_set_text(ui_LabelUnitCur, "mA"); - } else { - cur_disp = cur_uA; // uA - fmt_sig4(buf, sizeof(buf), cur_disp); - lv_label_set_text(ui_LabelCur, buf); - lv_label_set_text(ui_LabelUnitCur, "uA"); - } - - // power = V * A,按 W/mW/uW 选择单位,4 位有效数字 - float power_W = voltage * (cur_uA / 1e6f); - float p_abs = fabsf(power_W); - - if (p_abs >= 1.0f) { - fmt_sig4(buf, sizeof(buf), power_W); // W - lv_label_set_text(ui_LabelEnerge, buf); - lv_label_set_text(ui_LabelUnitEnerge, "W"); - } else if (p_abs >= 1e-3f) { - fmt_sig4(buf, sizeof(buf), power_W * 1e3f); // mW - lv_label_set_text(ui_LabelEnerge, buf); - lv_label_set_text(ui_LabelUnitEnerge, "mW"); - } else { - fmt_sig4(buf, sizeof(buf), power_W * 1e6f); // uW - lv_label_set_text(ui_LabelEnerge, buf); - lv_label_set_text(ui_LabelUnitEnerge, "uW"); - } - - // time - uint8_t hours = 0, minutes = 0, seconds = 0; - ui_GetElapsedTime_HMS(&hours, &minutes, &seconds); - snprintf(buf, sizeof(buf), "%02d:%02d:%02d", hours, minutes, seconds); - lv_label_set_text(ui_LabelTime, buf); -} - -// event funtions - -static void _flush_timer_cb() -{ - float voltage = 0.0; - float current = 0.0; - ui_get_vol_cur(&voltage, ¤t); - set_val_cur_label(voltage, current); -} - -// build funtions - -void ui_main_screen_init(void) -{ - ui_HomeScreen = lv_obj_create(NULL); - lv_obj_remove_flag(ui_HomeScreen, LV_OBJ_FLAG_SCROLLABLE); /// Flags - - ui_ButVal = lv_button_create(ui_HomeScreen); - lv_obj_set_width(ui_ButVal, 234); - lv_obj_set_height(ui_ButVal, 55); - lv_obj_set_x(ui_ButVal, 0); - lv_obj_set_y(ui_ButVal, 4); - lv_obj_set_align(ui_ButVal, LV_ALIGN_TOP_MID); - lv_obj_add_flag(ui_ButVal, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_ButVal, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_ButVal, lv_color_hex(0xE36666), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_ButVal, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_ButCur = lv_button_create(ui_HomeScreen); - lv_obj_set_width(ui_ButCur, 234); - lv_obj_set_height(ui_ButCur, 55); - lv_obj_set_x(ui_ButCur, 0); - lv_obj_set_y(ui_ButCur, 63); - lv_obj_set_align(ui_ButCur, LV_ALIGN_TOP_MID); - lv_obj_add_flag(ui_ButCur, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_ButCur, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_ButCur, lv_color_hex(0x42AA49), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_ButCur, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_ButEnerge = lv_button_create(ui_HomeScreen); - lv_obj_set_width(ui_ButEnerge, 234); - lv_obj_set_height(ui_ButEnerge, 55); - lv_obj_set_x(ui_ButEnerge, 0); - lv_obj_set_y(ui_ButEnerge, 122); - lv_obj_set_align(ui_ButEnerge, LV_ALIGN_TOP_MID); - lv_obj_add_flag(ui_ButEnerge, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_ButEnerge, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_ButEnerge, lv_color_hex(0x4569C9), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_ButEnerge, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_ButTime = lv_button_create(ui_HomeScreen); - lv_obj_set_width(ui_ButTime, 234); - lv_obj_set_height(ui_ButTime, 55); - lv_obj_set_x(ui_ButTime, 0); - lv_obj_set_y(ui_ButTime, 181); - lv_obj_set_align(ui_ButTime, LV_ALIGN_TOP_MID); - lv_obj_add_flag(ui_ButTime, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags - lv_obj_remove_flag(ui_ButTime, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_SCROLLABLE); /// Flags - lv_obj_set_style_bg_color(ui_ButTime, lv_color_hex(0x9F9960), LV_PART_MAIN | LV_STATE_DEFAULT); - lv_obj_set_style_bg_opa(ui_ButTime, 255, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelUnitVal = lv_label_create(ui_HomeScreen); - lv_obj_set_width(ui_LabelUnitVal, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelUnitVal, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelUnitVal, 70); - lv_obj_set_y(ui_LabelUnitVal, 20); - lv_obj_set_align(ui_LabelUnitVal, LV_ALIGN_TOP_MID); - lv_label_set_text(ui_LabelUnitVal, "V"); - lv_obj_set_style_text_font(ui_LabelUnitVal, &ui_font_HeiTi32, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelValt = lv_label_create(ui_HomeScreen); - lv_obj_set_width(ui_LabelValt, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelValt, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelValt, -30); - lv_obj_set_y(ui_LabelValt, 14); - lv_obj_set_align(ui_LabelValt, LV_ALIGN_TOP_MID); - lv_label_set_text(ui_LabelValt, "0.00"); - lv_obj_set_style_text_font(ui_LabelValt, &ui_font_HeiTi48, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelUnitCur = lv_label_create(ui_HomeScreen); - lv_obj_set_width(ui_LabelUnitCur, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelUnitCur, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelUnitCur, 70); - lv_obj_set_y(ui_LabelUnitCur, 80); - lv_obj_set_align(ui_LabelUnitCur, LV_ALIGN_TOP_MID); - lv_label_set_text(ui_LabelUnitCur, "uA"); - lv_obj_set_style_text_font(ui_LabelUnitCur, &ui_font_HeiTi32, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelCur = lv_label_create(ui_HomeScreen); - lv_obj_set_width(ui_LabelCur, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelCur, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelCur, -30); - lv_obj_set_y(ui_LabelCur, 74); - lv_obj_set_align(ui_LabelCur, LV_ALIGN_TOP_MID); - lv_label_set_text(ui_LabelCur, "0.00"); - lv_obj_set_style_text_font(ui_LabelCur, &ui_font_HeiTi48, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelUnitEnerge = lv_label_create(ui_HomeScreen); - lv_obj_set_width(ui_LabelUnitEnerge, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelUnitEnerge, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelUnitEnerge, 70); - lv_obj_set_y(ui_LabelUnitEnerge, 140); - lv_obj_set_align(ui_LabelUnitEnerge, LV_ALIGN_TOP_MID); - lv_label_set_text(ui_LabelUnitEnerge, "mW"); - lv_obj_set_style_text_font(ui_LabelUnitEnerge, &ui_font_HeiTi32, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelEnerge = lv_label_create(ui_HomeScreen); - lv_obj_set_width(ui_LabelEnerge, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelEnerge, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelEnerge, -30); - lv_obj_set_y(ui_LabelEnerge, 133); - lv_obj_set_align(ui_LabelEnerge, LV_ALIGN_TOP_MID); - lv_label_set_text(ui_LabelEnerge, "0.00"); - lv_obj_set_style_text_font(ui_LabelEnerge, &ui_font_HeiTi48, LV_PART_MAIN | LV_STATE_DEFAULT); - - ui_LabelTime = lv_label_create(ui_HomeScreen); - lv_obj_set_width(ui_LabelTime, LV_SIZE_CONTENT); /// 1 - lv_obj_set_height(ui_LabelTime, LV_SIZE_CONTENT); /// 1 - lv_obj_set_x(ui_LabelTime, 0); - lv_obj_set_y(ui_LabelTime, 190); - lv_obj_set_align(ui_LabelTime, LV_ALIGN_TOP_MID); - lv_label_set_text(ui_LabelTime, "00:00:00"); - lv_obj_set_style_text_font(ui_LabelTime, &ui_font_HeiTi48, LV_PART_MAIN | LV_STATE_DEFAULT); - _flush_timer_cb(NULL); - // flush timer - _flush_timer = lv_timer_create(_flush_timer_cb, 250, NULL); - -} - - -void ui_main_screen_destroy(void) -{ - lv_timer_delete(_flush_timer); -} diff --git a/software/Power_Pico/User/GUI/screens/ui_mainPage.h b/software/Power_Pico/User/GUI/screens/ui_mainPage.h deleted file mode 100644 index e5941cf..0000000 --- a/software/Power_Pico/User/GUI/screens/ui_mainPage.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef UI_MAINPAGE_H -#define UI_MAINPAGE_H - -#ifdef __cplusplus -extern "C" { -#endif - -// SCREEN: ui_Screen1 -void ui_main_screen_init(void); -void ui_main_screen_destroy(void); -void ui_main_page_key_handler(void *key_event); - -extern lv_obj_t * ui_HomeScreen; - - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/software/Power_Pico/User/GUI/ui.c b/software/Power_Pico/User/GUI/ui.c deleted file mode 100644 index 8bd906b..0000000 --- a/software/Power_Pico/User/GUI/ui.c +++ /dev/null @@ -1,105 +0,0 @@ -// LVGL version: 9.2 -// Project name: PowerPico - -#include "./ui.h" -#include "./screens/ui_StartPage.h" -#include "./screens/ui_mainPage.h" -#include "./screens/ui_chartPage.h" -#include "./screens/ui_SetPage.h" -#include "./screens/ui_PPSPage.h" - -///////////////////// VARIABLES //////////////////// - -// pages -Page_t pages[] = { - { - .init = ui_main_screen_init, - .deinit = ui_main_screen_destroy, - .page_obj = &ui_HomeScreen, - .key_event_handler = ui_main_page_key_handler, - .name = "Main Page" - }, - // { - // .init = ui_ChartPage_screen_init, - // .deinit = ui_ChartPage_screen_destroy, - // .page_obj = &ui_ChartPage, - // .key_event_handler = ui_chart_page_key_handler, - // .name = "Chart Page" - // }, - { - .init = ui_SetPage_screen_init, - .deinit = ui_SetPage_screen_destroy, - .page_obj = &ui_SetPage, - .key_event_handler = ui_set_page_key_handler, - .name = "Set Page" - }, - { - .init = ui_PPSPage_screen_init, - .deinit = ui_PPSPage_screen_destroy, - .page_obj = &ui_PPSPage, - .key_event_handler = ui_pps_page_key_handler, - .name = "PPS Page" - }, - // 可以在这里添加更多页面 -}; - -///////////////////// TEST LVGL SETTINGS //////////////////// -#if LV_COLOR_DEPTH != 16 - #error "LV_COLOR_DEPTH should be 16bit to match SquareLine Studio's settings" -#endif - -/////////////////////// Timer ////////////////////// -/** - * Main timer for Refreshing the screens - */ -static void main_timer_cb(lv_timer_t * timer) -{ - // 1s 刷新一次全屏,防止有时候不知什么原因的LCD刷新错误(需要后续找到问题从根本解决不知是不是屏幕本身问题) - ui_full_screen_refresh(lv_screen_active()); -} - -////////////////////////// Animation ////////////////////// - -void ui_start_animation_done() { - // 初始化页面并加载主要界面 - lv_lib_pm_Init(); - for (uint8_t i = 0; i < sizeof(pages) / sizeof(pages[0]); i++) { - lv_lib_pm_register(&pages[i]); - } - lv_lib_pm_load_init_screen(); -} - -void ui_anima_set_light_level(void * var, int32_t v) { - ui_set_back_light_level(v); -} - -static void _ui_Start_animation(void) { - uint8_t target_level = ui_get_back_light_level(); - lv_lib_anim_user_animation(NULL, 0, 2000, 0, target_level, 0, 0, 0, 0, lv_anim_path_ease_in, ui_anima_set_light_level, ui_start_animation_done); -} - -/////////////////////// ui_initialize ////////////////////// -void ui_init(void) -{ - lv_disp_t * dispp = lv_display_get_default(); - lv_theme_t * theme = lv_theme_default_init(dispp, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), true, LV_FONT_DEFAULT); - lv_disp_set_theme(dispp, theme); - - // set system settings - ui_set_display_rotation(ui_get_display_rotation()); - - // internationalization init - lv_i18n_init(lv_i18n_language_pack); //lv_i18n 的语言初始化 - if(ui_get_language_select() == 0) - lv_i18n_set_locale("en"); //lv_i18n 设置当前语言 - else - lv_i18n_set_locale("zh-cn"); //lv_i18n 设置当前语言 - - // main timer (you can add someting to do in the timer_cb if needed) - lv_timer_t * ui_MainTimer = lv_timer_create(main_timer_cb, 1000, NULL); - - // start up, just load one time only - ui_StartPage_screen_init(); - lv_screen_load(ui_StartPage); - _ui_Start_animation(); -} diff --git a/software/Power_Pico/User/GUI/ui.h b/software/Power_Pico/User/GUI/ui.h deleted file mode 100644 index bc392b2..0000000 --- a/software/Power_Pico/User/GUI/ui.h +++ /dev/null @@ -1,33 +0,0 @@ -// LVGL VERSION: 9.2 - - -#ifndef _UI_H -#define _UI_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stdio.h" -#include "lvgl.h" -#include "./common/lv_lib_pm.h" -#include "./common/lv_lib_animation.h" -#include "./common/lv_i18n.h" -#include "./ui_helpers.h" - -void ui_init(void); - -// FONTS -LV_FONT_DECLARE(ui_font_HeiTi32); -LV_FONT_DECLARE(ui_font_HeiTi48); -LV_FONT_DECLARE(ui_font_zhongyuan18); -LV_FONT_DECLARE(ui_font_zhongyuan20); - -// IMAGES AND IMAGE SETS -LV_IMG_DECLARE(ui_img_chicken_png); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/software/Power_Pico/User/GUI/ui_helpers.c b/software/Power_Pico/User/GUI/ui_helpers.c deleted file mode 100644 index 850ef12..0000000 --- a/software/Power_Pico/User/GUI/ui_helpers.c +++ /dev/null @@ -1,130 +0,0 @@ -// LVGL version: 9.2 -// Project name: PowerPico - -#include "BL24C02.h" // system settings -#include "tim.h" // elapsed time -#include "adc.h" // for voltage/current minitor -#include "user_PDUFPTask.h" // comunicate with PD UFP Task - -#include "./ui_helpers.h" - -///////////////////// ui help funtions //////////////////// - -void ui_full_screen_refresh(lv_obj_t * screen) { - // 标记整个屏幕为脏区域 - lv_obj_invalidate(screen); - // 或者立即刷新整个屏幕 - lv_refr_now(NULL); -} - -//////////// interface for system hw settings /////////// - -//////////////// get functions /////////////// - -uint64_t ui_GetElaspseMicroseconds(void) { - return GetMicrosecondCounter(); -} - -// 获取经过的时间, 单位为时分秒, 必须定时运行以更新32位计数器溢出 -void ui_GetElapsedTime_HMS(uint8_t *hours, uint8_t *minutes, uint8_t *seconds) { - - uint64_t total_us = GetMicrosecondCounter(); - uint32_t total_seconds = total_us / 1000000; - - if (hours) { - *hours = (total_seconds / 3600); // 这里不取模,可以显示超过24小时 - } - if (minutes) { - *minutes = (total_seconds % 3600) / 60; - } - if (seconds) { - *seconds = total_seconds % 60; - } -} - -uint8_t ui_get_back_light_level(void) { - return Sys_Get_BacklightLevel(); -} - -bool ui_get_key_sound_enable(void) { - return Sys_Get_KeySoundEnable(); -} - -uint8_t ui_get_language_select(void) { - return Sys_Get_LanguageSelect(); -} - -uint16_t ui_get_display_rotation(void) { - return Sys_Get_Rotation(); -} - -// 获取当前电压, 单位 V; 当前电流, 单位 uA -void ui_get_vol_cur(float *voltage, float *current) { - Data_Monitor_Get_Values(voltage, current); -} - -//////////////// set functions /////////////// - -void ui_clear_microsecond_counter(void) { - ClearMicrosecondCounter(); -} - -void ui_set_back_light_level(uint8_t level) { - Sys_Set_BacklightLevel(level); -} - -void ui_set_key_sound_enable(bool enable) { - Sys_Set_KeySoundEnable(enable); -} - -void ui_set_language_select(uint8_t lang) { - Sys_Set_LanguageSelect(lang); -} - -void ui_set_display_rotation(uint16_t rotation) { - Sys_Set_Rotation(rotation); -} - -void ui_clear_data_monitor(void) { - Data_Monitor_Clear(); -} - -//////////////// sys save functions /////////////// -void ui_system_settings_save(void) { - EEPROM_SysSetting_Save(); -} - -///////////// interface for com with PD UFP Task ////////////// - -void ui_send_pps_start_msg(void) { - PD_command_msg_t pd_ui_msg; - pd_ui_msg.event = PD_CMD_START; - osMessageQueuePut(PD_cmd_MessageQueue, &pd_ui_msg, 0, 1); -} - -void ui_send_pps_stop_msg(void) { - PD_command_msg_t pd_ui_msg; - pd_ui_msg.event = PD_CMD_STOP; - osMessageQueuePut(PD_cmd_MessageQueue, &pd_ui_msg, 0, 1); -} - -void ui_send_pps_set_msg(float voltage, float current) { - PD_command_msg_t pd_ui_msg; - pd_ui_msg.event = PD_CMD_SET_PPS; - pd_ui_msg.set_voltage = voltage; - pd_ui_msg.set_current = current; - osMessageQueuePut(PD_cmd_MessageQueue, &pd_ui_msg, 0, 1); -} - -// 非阻塞获取消息队列, 查看是否ready -int8_t MsgQueueGet_PPS_ready(void) { - PD_handle_event_t pd_handle_event; - if(osMessageQueueGet(PD_handle_event_MsgQueue, &pd_handle_event, NULL, 0)==osOK) { - if(pd_handle_event == PD_EVT_PPS_READY) { - return 1; - } else if(pd_handle_event == PD_EVT_PPS_FAILED) { - return -1; - } - } - return 0; -} diff --git a/software/Power_Pico/User/GUI/ui_helpers.h b/software/Power_Pico/User/GUI/ui_helpers.h deleted file mode 100644 index c317875..0000000 --- a/software/Power_Pico/User/GUI/ui_helpers.h +++ /dev/null @@ -1,59 +0,0 @@ -// LVGL VERSION: 9.2 - - -#ifndef _UI_HELPERS_H -#define _UI_HELPERS_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "lvgl.h" -#include "stdio.h" - -///////////////////// help funtions //////////////////// - -void ui_full_screen_refresh(lv_obj_t * screen); - -///////////// interface for system settings //////////// - -// get functions - -uint64_t ui_GetElaspseMicroseconds(void); -void ui_GetElapsedTime_HMS(uint8_t *hours, uint8_t *minutes, uint8_t *seconds); -uint8_t ui_get_back_light_level(void); -bool ui_get_key_sound_enable(void); -uint8_t ui_get_language_select(void); -uint16_t ui_get_display_rotation(void); -void ui_get_vol_cur(float *voltage, float *current); - -// set functions - -void ui_clear_microsecond_counter(void); -void ui_set_back_light_level(uint8_t level); -void ui_set_key_sound_enable(bool enable); -void ui_set_language_select(uint8_t lang); -void ui_set_display_rotation(uint16_t rotation); -void ui_clear_data_monitor(void); - -// sys save function -void ui_system_settings_save(void); - -/////////////////////////////////////////////////////////////// - - -///////////// interface for com with PD UFP Task ////////////// - -void ui_send_pps_start_msg(void); -void ui_send_pps_stop_msg(void); -void ui_send_pps_set_msg(float voltage, float current); -int8_t MsgQueueGet_PPS_ready(void); - -/////////////////////////////////////////////////////////////// - - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/software/Power_Pico/User/Tasks/Inc/user_HardwareInitTask.h b/software/Power_Pico/User/Tasks/Inc/user_HardwareInitTask.h deleted file mode 100644 index b28c0a7..0000000 --- a/software/Power_Pico/User/Tasks/Inc/user_HardwareInitTask.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef __USER_HARDWAREINITTASK_H__ -#define __USER_HARDWAREINITTASK_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void HardwareInitTask(void *argument); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/software/Power_Pico/User/Tasks/Inc/user_KeyTask.h b/software/Power_Pico/User/Tasks/Inc/user_KeyTask.h deleted file mode 100644 index 9d0eaa0..0000000 --- a/software/Power_Pico/User/Tasks/Inc/user_KeyTask.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __USER_KEYTASK_H__ -#define __USER_KEYTASK_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void KeyTask(void *argument); - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/software/Power_Pico/User/Tasks/Inc/user_LVGLTask.h b/software/Power_Pico/User/Tasks/Inc/user_LVGLTask.h deleted file mode 100644 index bf02cf6..0000000 --- a/software/Power_Pico/User/Tasks/Inc/user_LVGLTask.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __USER_LVGLTASK_H__ -#define __USER_LVGLTASK_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void LvHandlerTask(void *argument); - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/software/Power_Pico/User/Tasks/Inc/user_MessageTask.h b/software/Power_Pico/User/Tasks/Inc/user_MessageTask.h deleted file mode 100644 index 16892bb..0000000 --- a/software/Power_Pico/User/Tasks/Inc/user_MessageTask.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __USER_MESSAGETASK_H__ -#define __USER_MESSAGETASK_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void MessageTask(void *argument); - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/software/Power_Pico/User/Tasks/Inc/user_PDUFPTask.h b/software/Power_Pico/User/Tasks/Inc/user_PDUFPTask.h deleted file mode 100644 index fc696fb..0000000 --- a/software/Power_Pico/User/Tasks/Inc/user_PDUFPTask.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef __USER_PDUFPTASK_H__ -#define __USER_PDUFPTASK_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "user_TasksInit.h" - -// 定义UI层发送给PD UFP Task的指令的信号 // -typedef enum { - PD_CMD_START = 0, - PD_CMD_STOP, - PD_CMD_SET_PPS, -} PD_command_t; - -// 定义PD UFP Task任务发送到UI层的处理信号 // -typedef enum { - PD_EVT_PPS_READY = 0, - PD_EVT_PPS_FAILED, -} PD_handle_event_t; - -// UI层发送到PD UFP Task任务的命令信号结构体 // -typedef struct -{ - PD_command_t event; - float set_voltage; - float set_current; -} PD_command_msg_t; - - -void PDUFPTask(void *argument); - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/software/Power_Pico/User/Tasks/Inc/user_TasksInit.h b/software/Power_Pico/User/Tasks/Inc/user_TasksInit.h deleted file mode 100644 index f969542..0000000 --- a/software/Power_Pico/User/Tasks/Inc/user_TasksInit.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef __USER_TASKSINIT_H__ -#define __USER_TASKSINIT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "FreeRTOS.h" -#include "cmsis_os.h" - -extern osMessageQueueId_t Key_MessageQueue; -extern osMessageQueueId_t PD_cmd_MessageQueue; -extern osMessageQueueId_t PD_handle_event_MsgQueue; - -void User_Tasks_Init(void); -void TaskTickHook(void); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/software/Power_Pico/User/Tasks/Src/user_HardwareInitTask.c b/software/Power_Pico/User/Tasks/Src/user_HardwareInitTask.c deleted file mode 100644 index 1376989..0000000 --- a/software/Power_Pico/User/Tasks/Src/user_HardwareInitTask.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Private includes -----------------------------------------------------------*/ - -// includes -// sys -#include "tim.h" -#include "adc.h" -#include "i2c.h" - -// user -#include "user_TasksInit.h" - -// bsp -#include "key.h" -#include "lcd.h" -#include "lcd_init.h" -#include "gate.h" -#include "fusb302_dev.h" -#include "BL24C02.h" // settings - -// ui -#include "lvgl.h" -#include "lv_port_disp.h" -#include "ui.h" - -/* Private typedef -----------------------------------------------------------*/ - -/* Private define ------------------------------------------------------------*/ - -/* Private variables ---------------------------------------------------------*/ - -/* Private function prototypes -----------------------------------------------*/ - - -/** - * @brief hardwares init task - * @param argument: Not used - * @retval None - */ -void HardwareInitTask(void *argument) -{ - while(1) - { - vTaskSuspendAll(); - - // gate, for current flow route selection, high current by default - Gate_Port_Init(); - flow_route_selection(HIGH_CUR); - - // ADC sample start - HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_raw_buffer, ADC_TIMES*2 * ADC_CHANNELS); /*启动ADC的DMA传输,配合定时器触发ADC转换 12位的ADC对应0-4095 */ - HAL_TIM_Base_Start(&htim2); /*开启定时器,用溢出时间来触发ADC*/ - - // PWM Start for LCD backlight - HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3); - - // beep - // HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4); - - // key - Key_Init(); - - // system settings from eeprom - if(!EEPROM_Init_Check()) { - EEPROM_SysSetting_Get(); - } - - // FUSB CC pin dis connect - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); - - // FUSB302 init - fusb302_dev_init(); - - // lcd - // done in lvgl disp init - - // tim5 for elapsed time (us) - HAL_TIM_Base_Start(&htim5); - - // ui - // LVGL and disp init - lv_init(); - lv_port_disp_init(); - ui_init(); - - xTaskResumeAll(); - vTaskDelete(NULL); - } -} - - diff --git a/software/Power_Pico/User/Tasks/Src/user_KeyTask.c b/software/Power_Pico/User/Tasks/Src/user_KeyTask.c deleted file mode 100644 index b0d1949..0000000 --- a/software/Power_Pico/User/Tasks/Src/user_KeyTask.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Private includes -----------------------------------------------------------*/ -//includes -#include "user_TasksInit.h" -#include "main.h" -#include "key.h" -#include "beep.h" -#include "BL24C02.h" // settings - -/* Private typedef -----------------------------------------------------------*/ - -/* Private define ------------------------------------------------------------*/ - -/* Private variables ---------------------------------------------------------*/ - -/* Private function prototypes -----------------------------------------------*/ - - -/** - * @brief Key press check task - * @param argument: Not used - * @retval None - */ -void KeyTask(void *argument) -{ - key_event_t key_event; - while(1) - { - if(Key_Scan(&key_event)) - { - osMessageQueuePut(Key_MessageQueue, &key_event, 0, 1); - // beep - if(Sys_Get_KeySoundEnable()) - { - beep_open(); - osDelay(50); - beep_close(); - } - } - osDelay(10); - } -} diff --git a/software/Power_Pico/User/Tasks/Src/user_LVGLTask.c b/software/Power_Pico/User/Tasks/Src/user_LVGLTask.c deleted file mode 100644 index 403b5dc..0000000 --- a/software/Power_Pico/User/Tasks/Src/user_LVGLTask.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Private includes -----------------------------------------------------------*/ -//includes - -//bsp -#include "key.h" - -// tasks -#include "user_TasksInit.h" -#include "user_LVGLTask.h" - -//gui -#include "lvgl.h" -#include "lv_lib_pm.h" - -/* Private typedef -----------------------------------------------------------*/ - -/* Private define ------------------------------------------------------------*/ - -/* Private variables ---------------------------------------------------------*/ - -/* Private function prototypes -----------------------------------------------*/ - - -/** - * @brief FreeRTOS Tick Hook, to increase the LVGL tick - * @param None - * @retval None - */ -void TaskTickHook(void) -{ - //to increase the LVGL tick - lv_tick_inc(1); -} - - -/** - * @brief LVGL Handler task, to run the lvgl - * @param argument: Not used - * @retval None - */ -void LvHandlerTask(void *argument) -{ - key_event_t key_event; - while(1) - { - if(osMessageQueueGet(Key_MessageQueue, &key_event, NULL, 1)==osOK) { - lv_lib_pm_handle_key_event(&key_event); - } - lv_task_handler(); - osDelay(1); - } -} diff --git a/software/Power_Pico/User/Tasks/Src/user_MessageTask.c b/software/Power_Pico/User/Tasks/Src/user_MessageTask.c deleted file mode 100644 index 9801d5d..0000000 --- a/software/Power_Pico/User/Tasks/Src/user_MessageTask.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Private includes -----------------------------------------------------------*/ -//includes -#include "user_TasksInit.h" -#include "user_MessageTask.h" -#include "usbd_cdc_if.h" -#include "BL24C02.h" - -/* Private typedef -----------------------------------------------------------*/ - -/* Private define ------------------------------------------------------------*/ - -/* Private variables ---------------------------------------------------------*/ - -/* Private function prototypes -----------------------------------------------*/ - - -/** - * @brief task for check the usart message - * @param argument: Not used - * @retval None - */ -void MessageTask(void *argument) -{ - while(1) - { - if(get_update_request()) { - - // clear the flag - set_update_request(false); - // set the EEPROM flag - EEPROM_UpdateCommand_Write(true); - HAL_Delay(100); - USER_USB_DEVICE_DeInit(); - // 给予PC足够的时间来识别设备断开 - HAL_Delay(500); - // reset - NVIC_SystemReset(); - } - osDelay(500); - } -} diff --git a/software/Power_Pico/User/Tasks/Src/user_PDUFPTask.c b/software/Power_Pico/User/Tasks/Src/user_PDUFPTask.c deleted file mode 100644 index 2ea07a8..0000000 --- a/software/Power_Pico/User/Tasks/Src/user_PDUFPTask.c +++ /dev/null @@ -1,94 +0,0 @@ -/* Private includes -----------------------------------------------------------*/ -//includes -#include "user_TasksInit.h" -#include "user_PDUFPTask.h" -#include "main.h" -#include "fusb302_dev.h" -/* Private typedef -----------------------------------------------------------*/ - -/* Private define ------------------------------------------------------------*/ - -/* Private variables ---------------------------------------------------------*/ - -uint8_t _pd_working_status = 0; -osTimerId_t PD_UFP_Task_timer_id; - -/* Private function prototypes -----------------------------------------------*/ - -static void _timer_callback(void *argument) -{ - PD_handle_event_t ready; - static uint8_t time_count = 0; - time_count++; - if(is_PPS_ready()) { - ready = PD_EVT_PPS_READY; - osMessageQueuePut(PD_handle_event_MsgQueue, &ready, 0, 1); - time_count = 0; - osTimerStop(PD_UFP_Task_timer_id); - } else if(time_count >= 5) { // 5秒超时 - ready = PD_EVT_PPS_FAILED; - osMessageQueuePut(PD_handle_event_MsgQueue, &ready, 0, 1); - time_count = 0; - osTimerStop(PD_UFP_Task_timer_id); - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); // FUSB CC pin disconnect - _pd_working_status = 0; - } -} - -/** - * @brief task for PD_UFP - * @param argument: Not used - * @retval None - */ -void PDUFPTask(void *argument) -{ - // 快充诱骗时需要另外一个端口也供电,因为快充口会有可能断电 - // 可以检测 status_power 来判断是否有PPS供电 - PD_command_msg_t ui_msg; - // 创建定时器 - PD_UFP_Task_timer_id = osTimerNew(_timer_callback, osTimerPeriodic, NULL, NULL); - while(1) - { - // 非阻塞获取消息 - if(osMessageQueueGet(PD_cmd_MessageQueue, &ui_msg, NULL, 0)==osOK) { - if(!_pd_working_status && ui_msg.event == PD_CMD_START) { - // FUSB CC pin connect - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); - PD_protocol_init(&app_pd.protocol); - PD_protocol_set_power_option(&app_pd.protocol, PD_POWER_OPTION_MAX_5V); - PD_protocol_set_PPS(&app_pd.protocol, PPS_V(5.0), PPS_A(1.0), false); // 初始PPS 5V 1A - // send_power_request(); - if(osTimerIsRunning(PD_UFP_Task_timer_id)) { - osTimerStop(PD_UFP_Task_timer_id); - } - osTimerStart(PD_UFP_Task_timer_id, 1000); // 1s - _pd_working_status = 1; - - } else if(_pd_working_status && ui_msg.event == PD_CMD_STOP) { - // FUSB CC pin disconnect - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); - _pd_working_status = 0; - - } else if(_pd_working_status && ui_msg.event == PD_CMD_SET_PPS) { - // 设置PPS电压电流 - if(ui_msg.set_voltage > 0 && ui_msg.set_current > 0 && ui_msg.set_voltage <= 20.0 && ui_msg.set_current <= 5.0) { - PD_protocol_set_PPS(&app_pd.protocol, PPS_V(ui_msg.set_voltage), PPS_A(ui_msg.set_current), false); - send_power_request(); - } - } - } - - if(_pd_working_status) - { - if (fusb302_timer() || HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) == GPIO_PIN_RESET) - { - FUSB302_event_t FUSB302_events = 0; - for (uint8_t i = 0; i < 3 && FUSB302_alert(&fusb302_dev, &FUSB302_events) != FUSB302_SUCCESS; i++) {} - if (FUSB302_events) { - handle_FUSB302_event(FUSB302_events); - } - } - } - osDelay(1); - } -} diff --git a/software/Power_Pico/User/Tasks/Src/user_TasksInit.c b/software/Power_Pico/User/Tasks/Src/user_TasksInit.c deleted file mode 100644 index 0251ff5..0000000 --- a/software/Power_Pico/User/Tasks/Src/user_TasksInit.c +++ /dev/null @@ -1,119 +0,0 @@ -/* Private includes -----------------------------------------------------------*/ -//includes -#include "user_TasksInit.h" -//sys -#include "sys.h" -#include "stdio.h" - -//bsp -#include "key.h" - -//gui -#include "lvgl.h" -#include "lv_lib_pm.h" - -//tasks -#include "user_HardwareInitTask.h" -#include "user_LVGLTask.h" -#include "user_PDUFPTask.h" -#include "user_KeyTask.h" -#include "user_MessageTask.h" - -/* Private typedef -----------------------------------------------------------*/ - - -/* Private define ------------------------------------------------------------*/ - - -/* Private variables ---------------------------------------------------------*/ - - -/* Timers --------------------------------------------------------------------*/ -osTimerId_t IdleTimerHandle; - - -/* Tasks ---------------------------------------------------------------------*/ -// Hardwares initialization -osThreadId_t HardwareInitTaskHandle; -const osThreadAttr_t HardwareInitTask_attributes = { - .name = "HardwareInitTask", - .stack_size = 128 * 10, - .priority = (osPriority_t) osPriorityHigh, -}; - -// message task -osThreadId_t MessageTaskHandle; -const osThreadAttr_t MessageTask_attributes = { - .name = "MessageTask", - .stack_size = 128 * 1, - .priority = (osPriority_t) osPriorityNormal2, -}; - -// Key task -osThreadId_t KeyTaskHandle; -const osThreadAttr_t KeyTask_attributes = { - .name = "KeyTask", - .stack_size = 128 * 1, - .priority = (osPriority_t) osPriorityNormal, -}; - -// PDUFP task -osThreadId_t PDUFPTaskHandle; -const osThreadAttr_t PDUFPTask_attributes = { - .name = "PDUFPTask", - .stack_size = 128 * 5, - .priority = (osPriority_t) osPriorityLow2, -}; - -// LVGL Handler task -osThreadId_t LvHandlerTaskHandle; -const osThreadAttr_t LvHandlerTask_attributes = { - .name = "LvHandlerTask", - .stack_size = 128 * 24, - .priority = (osPriority_t) osPriorityLow, -}; - - -/* Message queues ------------------------------------------------------------*/ -// Key task 中发送出的按键信息的消息队列 -osMessageQueueId_t Key_MessageQueue; -// UI layer发送给PDUFPTask任务的命令消息队列 -osMessageQueueId_t PD_cmd_MessageQueue; -// PDUFPTask任务发送给UI层的通知处理情况的消息队列 -osMessageQueueId_t PD_handle_event_MsgQueue; - -/* Private function prototypes -----------------------------------------------*/ -void LvHandlerTask(void *argument); - -/** - * @brief FreeRTOS initialization - * @param None - * @retval None - */ -void User_Tasks_Init(void) -{ - /* add mutexes, ... */ - - /* add semaphores, ... */ - - /* start timers, add new ones, ... */ - - /* add queues, ... */ - Key_MessageQueue = osMessageQueueNew(4, sizeof(key_event_t), NULL); - PD_cmd_MessageQueue = osMessageQueueNew(4, sizeof(PD_command_msg_t), NULL); - PD_handle_event_MsgQueue = osMessageQueueNew(4, 1, NULL); // uint8_t message - - /* add threads, ... */ - HardwareInitTaskHandle = osThreadNew(HardwareInitTask, NULL, &HardwareInitTask_attributes); - PDUFPTaskHandle = osThreadNew(PDUFPTask, NULL, &PDUFPTask_attributes); - KeyTaskHandle = osThreadNew(KeyTask, NULL, &KeyTask_attributes); - MessageTaskHandle = osThreadNew(MessageTask, NULL, &MessageTask_attributes); - LvHandlerTaskHandle = osThreadNew(LvHandlerTask, NULL, &LvHandlerTask_attributes); - - /* add events, ... */ - - /* add others ... */ - - -} - diff --git a/software/Power_Pico/power_pico.ioc b/software/Power_Pico/power_pico.ioc deleted file mode 100644 index 66bb558..0000000 --- a/software/Power_Pico/power_pico.ioc +++ /dev/null @@ -1,290 +0,0 @@ -#MicroXplorer Configuration settings - do not modify -ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_5 -ADC1.Channel-1\#ChannelRegularConversion=ADC_CHANNEL_6 -ADC1.Channel-2\#ChannelRegularConversion=ADC_CHANNEL_7 -ADC1.Channel-3\#ChannelRegularConversion=ADC_CHANNEL_8 -ADC1.Channel-4\#ChannelRegularConversion=ADC_CHANNEL_9 -ADC1.DMAContinuousRequests=ENABLE -ADC1.ExternalTrigConv=ADC_EXTERNALTRIGCONV_T2_TRGO -ADC1.IPParameters=Rank-0\#ChannelRegularConversion,master,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,NbrOfConversionFlag,ExternalTrigConv,DMAContinuousRequests,NbrOfConversion,Rank-1\#ChannelRegularConversion,Channel-1\#ChannelRegularConversion,SamplingTime-1\#ChannelRegularConversion,Rank-2\#ChannelRegularConversion,Channel-2\#ChannelRegularConversion,SamplingTime-2\#ChannelRegularConversion,Rank-3\#ChannelRegularConversion,Channel-3\#ChannelRegularConversion,SamplingTime-3\#ChannelRegularConversion,Rank-4\#ChannelRegularConversion,Channel-4\#ChannelRegularConversion,SamplingTime-4\#ChannelRegularConversion -ADC1.NbrOfConversion=5 -ADC1.NbrOfConversionFlag=1 -ADC1.Rank-0\#ChannelRegularConversion=1 -ADC1.Rank-1\#ChannelRegularConversion=2 -ADC1.Rank-2\#ChannelRegularConversion=3 -ADC1.Rank-3\#ChannelRegularConversion=4 -ADC1.Rank-4\#ChannelRegularConversion=5 -ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_28CYCLES -ADC1.SamplingTime-1\#ChannelRegularConversion=ADC_SAMPLETIME_28CYCLES -ADC1.SamplingTime-2\#ChannelRegularConversion=ADC_SAMPLETIME_28CYCLES -ADC1.SamplingTime-3\#ChannelRegularConversion=ADC_SAMPLETIME_28CYCLES -ADC1.SamplingTime-4\#ChannelRegularConversion=ADC_SAMPLETIME_28CYCLES -ADC1.master=1 -CAD.formats= -CAD.pinconfig= -CAD.provider= -Dma.ADC1.1.Direction=DMA_PERIPH_TO_MEMORY -Dma.ADC1.1.FIFOMode=DMA_FIFOMODE_DISABLE -Dma.ADC1.1.Instance=DMA2_Stream0 -Dma.ADC1.1.MemDataAlignment=DMA_MDATAALIGN_HALFWORD -Dma.ADC1.1.MemInc=DMA_MINC_ENABLE -Dma.ADC1.1.Mode=DMA_CIRCULAR -Dma.ADC1.1.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD -Dma.ADC1.1.PeriphInc=DMA_PINC_DISABLE -Dma.ADC1.1.Priority=DMA_PRIORITY_LOW -Dma.ADC1.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode -Dma.Request0=SPI2_TX -Dma.Request1=ADC1 -Dma.RequestsNb=2 -Dma.SPI2_TX.0.Direction=DMA_MEMORY_TO_PERIPH -Dma.SPI2_TX.0.FIFOMode=DMA_FIFOMODE_DISABLE -Dma.SPI2_TX.0.Instance=DMA1_Stream4 -Dma.SPI2_TX.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD -Dma.SPI2_TX.0.MemInc=DMA_MINC_ENABLE -Dma.SPI2_TX.0.Mode=DMA_NORMAL -Dma.SPI2_TX.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD -Dma.SPI2_TX.0.PeriphInc=DMA_PINC_DISABLE -Dma.SPI2_TX.0.Priority=DMA_PRIORITY_LOW -Dma.SPI2_TX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode -FREERTOS.IPParameters=Tasks01,configUSE_TICK_HOOK -FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL -FREERTOS.configUSE_TICK_HOOK=1 -File.Version=6 -GPIO.groupedBy= -KeepUserPlacement=false -Mcu.CPN=STM32F411CEU6 -Mcu.Family=STM32F4 -Mcu.IP0=ADC1 -Mcu.IP1=DMA -Mcu.IP10=TIM4 -Mcu.IP11=TIM5 -Mcu.IP12=USB_DEVICE -Mcu.IP13=USB_OTG_FS -Mcu.IP2=FREERTOS -Mcu.IP3=I2C1 -Mcu.IP4=NVIC -Mcu.IP5=RCC -Mcu.IP6=SPI2 -Mcu.IP7=SYS -Mcu.IP8=TIM1 -Mcu.IP9=TIM2 -Mcu.IPNb=14 -Mcu.Name=STM32F411C(C-E)Ux -Mcu.Package=UFQFPN48 -Mcu.Pin0=PC13-ANTI_TAMP -Mcu.Pin1=PH0 - OSC_IN -Mcu.Pin10=PB15 -Mcu.Pin11=PA10 -Mcu.Pin12=PA11 -Mcu.Pin13=PA12 -Mcu.Pin14=PA13 -Mcu.Pin15=PA14 -Mcu.Pin16=PB4 -Mcu.Pin17=PB6 -Mcu.Pin18=PB7 -Mcu.Pin19=PB9 -Mcu.Pin2=PH1 - OSC_OUT -Mcu.Pin20=VP_FREERTOS_VS_CMSIS_V2 -Mcu.Pin21=VP_SYS_VS_tim11 -Mcu.Pin22=VP_TIM2_VS_ClockSourceITR -Mcu.Pin23=VP_TIM5_VS_no_output1 -Mcu.Pin24=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS -Mcu.Pin3=PA5 -Mcu.Pin4=PA6 -Mcu.Pin5=PA7 -Mcu.Pin6=PB0 -Mcu.Pin7=PB1 -Mcu.Pin8=PB10 -Mcu.Pin9=PB13 -Mcu.PinsNb=25 -Mcu.ThirdPartyNb=0 -Mcu.UserConstants= -Mcu.UserName=STM32F411CEUx -MxCube.Version=6.14.1 -MxDb.Version=DB.6.0.141 -NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false -NVIC.DMA1_Stream4_IRQn=true\:5\:0\:true\:false\:true\:true\:false\:true\:true -NVIC.DMA2_Stream0_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true -NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false -NVIC.ForceEnableDMAVector=true -NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false -NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false -NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false -NVIC.OTG_FS_IRQn=true\:5\:0\:true\:false\:true\:true\:false\:true\:true -NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false\:false -NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 -NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false\:false -NVIC.SavedPendsvIrqHandlerGenerated=true -NVIC.SavedSvcallIrqHandlerGenerated=true -NVIC.SavedSystickIrqHandlerGenerated=true -NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:true\:false -NVIC.TIM1_TRG_COM_TIM11_IRQn=true\:15\:0\:false\:false\:true\:false\:false\:true\:true -NVIC.TimeBase=TIM1_TRG_COM_TIM11_IRQn -NVIC.TimeBaseIP=TIM11 -NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false -PA10.Locked=true -PA10.Signal=S_TIM1_CH3 -PA11.Mode=Device_Only -PA11.Signal=USB_OTG_FS_DM -PA12.Mode=Device_Only -PA12.Signal=USB_OTG_FS_DP -PA13.Mode=Serial_Wire -PA13.Signal=SYS_JTMS-SWDIO -PA14.Mode=Serial_Wire -PA14.Signal=SYS_JTCK-SWCLK -PA5.Locked=true -PA5.Signal=ADCx_IN5 -PA6.Locked=true -PA6.Signal=ADCx_IN6 -PA7.Locked=true -PA7.Signal=ADCx_IN7 -PB0.Locked=true -PB0.Signal=ADCx_IN8 -PB1.Locked=true -PB1.Signal=ADCx_IN9 -PB10.Locked=true -PB10.Signal=GPIO_Output -PB13.Locked=true -PB13.Mode=TX_Only_Simplex_Unidirect_Master -PB13.Signal=SPI2_SCK -PB15.Locked=true -PB15.Mode=TX_Only_Simplex_Unidirect_Master -PB15.Signal=SPI2_MOSI -PB4.Locked=true -PB4.Signal=GPIO_Input -PB6.Locked=true -PB6.Mode=I2C -PB6.Signal=I2C1_SCL -PB7.Locked=true -PB7.Mode=I2C -PB7.Signal=I2C1_SDA -PB9.Locked=true -PB9.Signal=S_TIM4_CH4 -PC13-ANTI_TAMP.Locked=true -PC13-ANTI_TAMP.Signal=GPIO_Output -PH0\ -\ OSC_IN.Mode=HSE-External-Oscillator -PH0\ -\ OSC_IN.Signal=RCC_OSC_IN -PH1\ -\ OSC_OUT.Mode=HSE-External-Oscillator -PH1\ -\ OSC_OUT.Signal=RCC_OSC_OUT -PinOutPanel.RotationAngle=0 -ProjectManager.AskForMigrate=true -ProjectManager.BackupPrevious=false -ProjectManager.CompilerLinker=GCC -ProjectManager.CompilerOptimize=6 -ProjectManager.ComputerToolchain=false -ProjectManager.CoupleFile=true -ProjectManager.CustomerFirmwarePackage= -ProjectManager.DefaultFWLocation=true -ProjectManager.DeletePrevious=true -ProjectManager.DeviceId=STM32F411CEUx -ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.28.1 -ProjectManager.FreePins=false -ProjectManager.HalAssertFull=false -ProjectManager.HeapSize=0x200 -ProjectManager.KeepUserCode=true -ProjectManager.LastFirmware=true -ProjectManager.LibraryCopy=1 -ProjectManager.MainLocation=Core/Src -ProjectManager.NoMain=false -ProjectManager.PreviousToolchain= -ProjectManager.ProjectBuild=false -ProjectManager.ProjectFileName=power_pico.ioc -ProjectManager.ProjectName=power_pico -ProjectManager.ProjectStructure= -ProjectManager.RegisterCallBack= -ProjectManager.StackSize=0x400 -ProjectManager.TargetToolchain=MDK-ARM V5.32 -ProjectManager.ToolChainLocation= -ProjectManager.UAScriptAfterPath= -ProjectManager.UAScriptBeforePath= -ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_TIM1_Init-TIM1-false-HAL-true,6-MX_TIM4_Init-TIM4-false-HAL-true,7-MX_SPI2_Init-SPI2-false-HAL-true,8-MX_I2C1_Init-I2C1-false-HAL-true,9-MX_TIM2_Init-TIM2-false-HAL-true,10-MX_TIM5_Init-TIM5-false-HAL-true,11-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false -RCC.48MHZClocksFreq_Value=48000000 -RCC.AHBFreq_Value=96000000 -RCC.APB1CLKDivider=RCC_HCLK_DIV2 -RCC.APB1Freq_Value=48000000 -RCC.APB1TimFreq_Value=96000000 -RCC.APB2Freq_Value=96000000 -RCC.APB2TimFreq_Value=96000000 -RCC.CortexFreq_Value=96000000 -RCC.EthernetFreq_Value=96000000 -RCC.FCLKCortexFreq_Value=96000000 -RCC.FamilyName=M -RCC.HCLKFreq_Value=96000000 -RCC.HSE_VALUE=25000000 -RCC.HSI_VALUE=16000000 -RCC.I2SClocksFreq_Value=150000000 -RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,PLLCLKFreq_Value,PLLM,PLLQCLKFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOInputMFreq_Value,VCOOutputFreq_Value,VcooutputI2S -RCC.LSE_VALUE=32768 -RCC.LSI_VALUE=32000 -RCC.PLLCLKFreq_Value=96000000 -RCC.PLLM=25 -RCC.PLLQCLKFreq_Value=48000000 -RCC.RTCFreq_Value=32000 -RCC.RTCHSEDivFreq_Value=12500000 -RCC.SYSCLKFreq_VALUE=96000000 -RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK -RCC.VCOI2SOutputFreq_Value=300000000 -RCC.VCOInputFreq_Value=1000000 -RCC.VCOInputMFreq_Value=1562500 -RCC.VCOOutputFreq_Value=192000000 -RCC.VcooutputI2S=150000000 -SH.ADCx_IN5.0=ADC1_IN5,IN5 -SH.ADCx_IN5.ConfNb=1 -SH.ADCx_IN6.0=ADC1_IN6,IN6 -SH.ADCx_IN6.ConfNb=1 -SH.ADCx_IN7.0=ADC1_IN7,IN7 -SH.ADCx_IN7.ConfNb=1 -SH.ADCx_IN8.0=ADC1_IN8,IN8 -SH.ADCx_IN8.ConfNb=1 -SH.ADCx_IN9.0=ADC1_IN9,IN9 -SH.ADCx_IN9.ConfNb=1 -SH.S_TIM1_CH3.0=TIM1_CH3,PWM Generation3 CH3 -SH.S_TIM1_CH3.ConfNb=1 -SH.S_TIM4_CH4.0=TIM4_CH4,PWM Generation4 CH4 -SH.S_TIM4_CH4.ConfNb=1 -SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2 -SPI2.CLKPhase=SPI_PHASE_2EDGE -SPI2.CLKPolarity=SPI_POLARITY_HIGH -SPI2.CalculateBaudRate=24.0 MBits/s -SPI2.DataSize=SPI_DATASIZE_8BIT -SPI2.Direction=SPI_DIRECTION_2LINES -SPI2.FirstBit=SPI_FIRSTBIT_MSB -SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,CLKPolarity,CLKPhase,DataSize,FirstBit,BaudRatePrescaler -SPI2.Mode=SPI_MODE_MASTER -SPI2.VirtualType=VM_MASTER -TIM1.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 -TIM1.IPParameters=Prescaler,Period,Channel-PWM Generation3 CH3 -TIM1.Period=300 -TIM1.Prescaler=95 -TIM2.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE -TIM2.IPParameters=Prescaler,Period,TIM_MasterOutputTrigger,AutoReloadPreload -TIM2.Period=99 -TIM2.Prescaler=95 -TIM2.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE -TIM4.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 -TIM4.IPParameters=Prescaler,Channel-PWM Generation4 CH4,Period,Pulse-PWM Generation4 CH4 -TIM4.Period=500 -TIM4.Prescaler=95 -TIM4.Pulse-PWM\ Generation4\ CH4=250 -TIM5.Channel-PWM\ Generation1\ No\ Output=TIM_CHANNEL_1 -TIM5.IPParameters=Channel-PWM Generation1 No Output,Prescaler -TIM5.Prescaler=95 -USB_DEVICE.CLASS_NAME_FS=CDC -USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS -USB_DEVICE.VirtualMode=Cdc -USB_DEVICE.VirtualModeFS=Cdc_FS -USB_OTG_FS.IPParameters=VirtualMode -USB_OTG_FS.VirtualMode=Device_Only -VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 -VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 -VP_SYS_VS_tim11.Mode=TIM11 -VP_SYS_VS_tim11.Signal=SYS_VS_tim11 -VP_TIM2_VS_ClockSourceITR.Mode=TriggerSource_ITR0 -VP_TIM2_VS_ClockSourceITR.Signal=TIM2_VS_ClockSourceITR -VP_TIM5_VS_no_output1.Mode=PWM Generation1 No Output -VP_TIM5_VS_no_output1.Signal=TIM5_VS_no_output1 -VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS -VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_CDC_FS -board=custom -rtos.0.ip=FREERTOS diff --git a/software/bootloader/.mxproject b/software/bootloader/.mxproject deleted file mode 100644 index cadfd87..0000000 --- a/software/bootloader/.mxproject +++ /dev/null @@ -1,47 +0,0 @@ -[PreviousLibFiles] -LibFiles=Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pcd.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pcd_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_usb.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_bus.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_system.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_utils.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dmamux.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h;Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_crc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_crc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_i2c.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_spi.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_core.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_ctlreq.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_def.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_ioreq.h;Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Inc\usbd_cdc.h;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_usb.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Src\usbd_cdc.c;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pcd.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pcd_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_usb.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_bus.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_system.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_utils.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dmamux.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h;Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_crc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_crc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_i2c.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_spi.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_core.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_ctlreq.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_def.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_ioreq.h;Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Inc\usbd_cdc.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f411xe.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;Drivers\CMSIS\Include\cachel1_armv7.h;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_armclang_ltm.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv81mml.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm35p.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm55.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_cm85.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\core_starmc1.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\pac_armv81.h;Drivers\CMSIS\Include\pmu_armv8.h;Drivers\CMSIS\Include\tz_context.h; - -[PreviousUsedKeilFiles] -SourceFiles=..\Core\Src\main.c;..\Core\Src\gpio.c;..\Core\Src\crc.c;..\Core\Src\i2c.c;..\Core\Src\spi.c;..\Core\Src\tim.c;..\USB_DEVICE\App\usb_device.c;..\USB_DEVICE\Target\usbd_conf.c;..\USB_DEVICE\App\usbd_desc.c;..\USB_DEVICE\App\usbd_cdc_if.c;..\Core\Src\stm32f4xx_it.c;..\Core\Src\stm32f4xx_hal_msp.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_usb.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Src\usbd_cdc.c;..\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;..\Core\Src\system_stm32f4xx.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_usb.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Src\usbd_cdc.c;..\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;..\Core\Src\system_stm32f4xx.c;;;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Src\usbd_cdc.c; -HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;..\Middlewares\ST\STM32_USB_Device_Library\Core\Inc;..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Inc;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Core\Inc;..\USB_DEVICE\App;..\USB_DEVICE\Target; -CDefines=USE_HAL_DRIVER;STM32F411xE;USE_HAL_DRIVER;USE_HAL_DRIVER; - -[PreviousGenFiles] -AdvancedFolderStructure=true -HeaderFileListSize=12 -HeaderFiles#0=..\Core\Inc\gpio.h -HeaderFiles#1=..\Core\Inc\crc.h -HeaderFiles#2=..\Core\Inc\i2c.h -HeaderFiles#3=..\Core\Inc\spi.h -HeaderFiles#4=..\Core\Inc\tim.h -HeaderFiles#5=..\USB_DEVICE\App\usb_device.h -HeaderFiles#6=..\USB_DEVICE\Target\usbd_conf.h -HeaderFiles#7=..\USB_DEVICE\App\usbd_desc.h -HeaderFiles#8=..\USB_DEVICE\App\usbd_cdc_if.h -HeaderFiles#9=..\Core\Inc\stm32f4xx_it.h -HeaderFiles#10=..\Core\Inc\stm32f4xx_hal_conf.h -HeaderFiles#11=..\Core\Inc\main.h -HeaderFolderListSize=3 -HeaderPath#0=..\Core\Inc -HeaderPath#1=..\USB_DEVICE\App -HeaderPath#2=..\USB_DEVICE\Target -HeaderFiles=; -SourceFileListSize=12 -SourceFiles#0=..\Core\Src\gpio.c -SourceFiles#1=..\Core\Src\crc.c -SourceFiles#2=..\Core\Src\i2c.c -SourceFiles#3=..\Core\Src\spi.c -SourceFiles#4=..\Core\Src\tim.c -SourceFiles#5=..\USB_DEVICE\App\usb_device.c -SourceFiles#6=..\USB_DEVICE\Target\usbd_conf.c -SourceFiles#7=..\USB_DEVICE\App\usbd_desc.c -SourceFiles#8=..\USB_DEVICE\App\usbd_cdc_if.c -SourceFiles#9=..\Core\Src\stm32f4xx_it.c -SourceFiles#10=..\Core\Src\stm32f4xx_hal_msp.c -SourceFiles#11=..\Core\Src\main.c -SourceFolderListSize=3 -SourcePath#0=..\Core\Src -SourcePath#1=..\USB_DEVICE\App -SourcePath#2=..\USB_DEVICE\Target -SourceFiles=; - diff --git a/software/bootloader/BSP/EEPROM/BL24C02.c b/software/bootloader/BSP/EEPROM/BL24C02.c deleted file mode 100644 index 131fecb..0000000 --- a/software/bootloader/BSP/EEPROM/BL24C02.c +++ /dev/null @@ -1,125 +0,0 @@ -#include "BL24C02.h" -#include "i2c.h" - -SysSettings_T sys_settings = { - .backlight_level = 50, - .key_sound_enable = 1, - .language_select = 0, - .rotation = 0 -}; - -static void BL24C02_Write(uint8_t addr, uint16_t length, uint8_t buff[]) -{ - HAL_I2C_Mem_Write(&hi2c1, BL24C02_ADDRESS<<1, addr, I2C_MEMADD_SIZE_8BIT, buff, length, 10); -} - -static void BL24C02_Read(uint8_t addr, uint8_t length, uint8_t buff[]) -{ - HAL_I2C_Mem_Read(&hi2c1, BL24C02_ADDRESS<<1, addr, I2C_MEMADD_SIZE_8BIT, buff, length, 10); -} - -static void delay_ms(uint32_t ms) -{ - HAL_Delay(ms); -} - -/****************************************** -EEPROM Data description: -[0x00]: 0x55 for check -[0x01]: 0xAA for check - -[0x10]: user backlight_level setting -[0x11]: user key_sound_enable setting -[0x12]: user language_select setting -[0x13-14]: user rotation setting - -[0x20-]: update command storage area, "update\r\n" -*******************************************/ - -// to check the Data is right and the EEPROM is working, 0-ok, 1-erro -uint8_t EEPROM_Init_Check(void) -{ - uint8_t check_buff[2]; - delay_ms(10); - BL24C02_Read(0,2,check_buff); - if(check_buff[0] == 0x55 && check_buff[1] == 0xAA) - { - return 0;//check OK - } - else - { - check_buff[0] = 0x55; - check_buff[1] = 0xAA; - delay_ms(10); - BL24C02_Write(0,2,check_buff); - memset(check_buff,0,2); - delay_ms(10); - BL24C02_Read(0,2,check_buff); - if(check_buff[0] == 0x55 && check_buff[1] == 0xAA) - return 0;//check ok - } - return 1;//check erro -} - - -// to Save the settings -void EEPROM_SysSetting_Save(void) -{ - uint8_t buff[5]; - buff[0] = sys_settings.backlight_level; - buff[1] = sys_settings.key_sound_enable; - buff[2] = sys_settings.language_select; - buff[3] = (uint8_t)(sys_settings.rotation & 0x00FF); - buff[4] = (uint8_t)((sys_settings.rotation >> 8) & 0x00FF); - BL24C02_Write(0x10,5,buff); -} - - -// to Get the settings -void EEPROM_SysSetting_Get(void) -{ - uint8_t buff[5]; - BL24C02_Read(0x10,5,buff); - // 判断是否在范围内 - if(buff[0] <= 100) - sys_settings.backlight_level = buff[0]; - else - sys_settings.backlight_level = 80; - if(buff[1] <= 1) - sys_settings.key_sound_enable = buff[1]; - else - sys_settings.key_sound_enable = 1; - if(buff[2] <= 1) - sys_settings.language_select = buff[2]; - else - sys_settings.language_select = 0; - uint16_t rotation = (uint16_t)buff[3] | ((uint16_t)buff[4] << 8); - if(rotation == 0 || rotation == 90 || rotation == 180 || rotation == 270) - sys_settings.rotation = rotation; - else - sys_settings.rotation = 180; -} - -// to write the update command -void EEPROM_UpdateCommand_Write(bool is_update) -{ - if(is_update) { - char cmd[] = "update\r\n"; - BL24C02_Write(0x20, strlen(cmd), (uint8_t *)cmd); - } else { - char cmd[] = "-nope-\r\n"; - BL24C02_Write(0x20, strlen(cmd), (uint8_t *)cmd); - } -} - -// to check the update command -bool EEPROM_UpdateCommand_Check(void) -{ - char cmd[10] = {0}; - BL24C02_Read(0x20, 8, (uint8_t *)cmd); - if(strcmp(cmd, "update\r\n") == 0) { - return true; - } else { - return false; - } -} diff --git a/software/bootloader/BSP/EEPROM/BL24C02.h b/software/bootloader/BSP/EEPROM/BL24C02.h deleted file mode 100644 index c20df71..0000000 --- a/software/bootloader/BSP/EEPROM/BL24C02.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __BL24C02_H -#define __BL24C02_H - -#include -#include -#include - -#define BL24C02_ADDRESS 0x50 - -typedef struct { - uint8_t backlight_level; // 0-100 - uint8_t key_sound_enable; // 0:disable, 1:enable - uint8_t language_select; // 0:English, 1:Chinese - uint16_t rotation; // 0, 90, 180, 270 -} SysSettings_T; - -extern SysSettings_T sys_settings; - -uint8_t EEPROM_Init_Check(void); -void EEPROM_SysSetting_Save(void); -void EEPROM_SysSetting_Get(void); -void EEPROM_UpdateCommand_Write(bool is_update); -bool EEPROM_UpdateCommand_Check(void); - -#endif diff --git a/software/bootloader/BSP/KEY/key.c b/software/bootloader/BSP/KEY/key.c deleted file mode 100644 index e2546c7..0000000 --- a/software/bootloader/BSP/KEY/key.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "key.h" -#include "delay.h" - -void Key_Port_Init(void) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - - /*Configure GPIO pin : PA0 */ - GPIO_InitStruct.Pin = KEYB_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_PULLUP; - HAL_GPIO_Init(KEYB_PORT, &GPIO_InitStruct); - -} - -uint8_t KeyScan(uint8_t mode) -{ - static uint8_t key_up = 1; - uint8_t keyvalue=0; - if(mode) key_up = 1; - if( key_up && !KEYB) - { - delay_ms(3);//ensure the key is down - if(!KEYB) keyvalue = 1; - if(keyvalue) key_up = 0; - } - else - { - delay_ms(3);//ensure the key is up - if(KEYB) - key_up = 1; - } - return keyvalue; -} - diff --git a/software/bootloader/BSP/KEY/key.h b/software/bootloader/BSP/KEY/key.h deleted file mode 100644 index b977dcc..0000000 --- a/software/bootloader/BSP/KEY/key.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __KEY_H__ -#define __KEY_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "main.h" - -//KEY1 -#define KEYB_PORT GPIOA -#define KEYB_PIN GPIO_PIN_0 -#define KEYB HAL_GPIO_ReadPin(KEYB_PORT,KEYB_PIN) - -void Key_Port_Init(void); -uint8_t KeyScan(uint8_t mode); - - - - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/software/bootloader/BSP/LCD/ST7789.txt b/software/bootloader/BSP/LCD/ST7789.txt deleted file mode 100644 index e69de29..0000000 diff --git a/software/bootloader/BSP/LCD/lcd.c b/software/bootloader/BSP/LCD/lcd.c deleted file mode 100644 index 49a1370..0000000 --- a/software/bootloader/BSP/LCD/lcd.c +++ /dev/null @@ -1,586 +0,0 @@ -#include "lcd.h" -#include "lcd_init.h" -#include "lcdfont.h" -#include "delay.h" -#include "spi.h" - -#define OFFSET_Y 80 - -/****************************************************************************** - 函数说明:在指定区域填充颜色 - 入口数据:xsta,ysta 起始坐标 - xend,yend 终止坐标 - color 要填充的颜色 - 返回值: 无 -******************************************************************************/ -void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color) -{ - u16 i,j; - LCD_Address_Set(xsta,ysta+OFFSET_Y,xend-1,yend-1+OFFSET_Y);//设置显示范围 - for(i=ysta;iCR1|=SPI_CR1_DFF; -// HAL_SPI_Transmit_DMA(&hspi1,(uint8_t*)color_p,size); -// while(__HAL_DMA_GET_COUNTER(&hdma_spi1_tx)!=0); -// -// hspi1.Init.DataSize = SPI_DATASIZE_8BIT; -// hspi1.Instance->CR1&=~SPI_CR1_DFF; -// -//} - -/****************************************************************************** - 函数说明:在指定位置画点 - 入口数据:x,y 画点坐标 - color 点的颜色 - 返回值: 无 -******************************************************************************/ -void LCD_DrawPoint(u16 x,u16 y,u16 color) -{ - LCD_Address_Set(x,y+OFFSET_Y,x,y+OFFSET_Y);//设置光标位置 - LCD_WR_DATA(color); -} - - -/****************************************************************************** - 函数说明:画线 - 入口数据:x1,y1 起始坐标 - x2,y2 终止坐标 - color 线的颜色 - 返回值: 无 -******************************************************************************/ -void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color) -{ - u16 t; - int xerr=0,yerr=0,delta_x,delta_y,distance; - int incx,incy,uRow,uCol; - delta_x=x2-x1; //计算坐标增量 - delta_y=y2-y1; - uRow=x1;//画线起点坐标 - uCol=y1; - if(delta_x>0)incx=1; //设置单步方向 - else if (delta_x==0)incx=0;//垂直线 - else {incx=-1;delta_x=-delta_x;} - if(delta_y>0)incy=1; - else if (delta_y==0)incy=0;//水平线 - else {incy=-1;delta_y=-delta_y;} - if(delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴 - else distance=delta_y; - for(t=0;tdistance) - { - xerr-=distance; - uRow+=incx; - } - if(yerr>distance) - { - yerr-=distance; - uCol+=incy; - } - } -} - - -/****************************************************************************** - 函数说明:画矩形 - 入口数据:x1,y1 起始坐标 - x2,y2 终止坐标 - color 矩形的颜色 - 返回值: 无 -******************************************************************************/ -void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color) -{ - LCD_DrawLine(x1,y1,x2,y1,color); - LCD_DrawLine(x1,y1,x1,y2,color); - LCD_DrawLine(x1,y2,x2,y2,color); - LCD_DrawLine(x2,y1,x2,y2,color); -} - - -/****************************************************************************** - 函数说明:画圆 - 入口数据:x0,y0 圆心坐标 - r 半径 - color 圆的颜色 - 返回值: 无 -******************************************************************************/ -void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color) -{ - int a,b; - a=0;b=r; - while(a<=b) - { - LCD_DrawPoint(x0-b,y0-a,color); //3 - LCD_DrawPoint(x0+b,y0-a,color); //0 - LCD_DrawPoint(x0-a,y0+b,color); //1 - LCD_DrawPoint(x0-a,y0-b,color); //2 - LCD_DrawPoint(x0+b,y0+a,color); //4 - LCD_DrawPoint(x0+a,y0-b,color); //5 - LCD_DrawPoint(x0+a,y0+b,color); //6 - LCD_DrawPoint(x0-b,y0+a,color); //7 - a++; - if((a*a+b*b)>(r*r))//判断要画的点是否过远 - { - b--; - } - } -} - -/****************************************************************************** - 函数说明:显示汉字串 - 入口数据:x,y显示坐标 - *s 要显示的汉字串 - fc 字的颜色 - bc 字的背景色 - sizey 字号 可选 16 24 32 - mode: 0非叠加模式 1叠加模式 - 返回值: 无 -******************************************************************************/ -void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode) -{ - while(*s!=0) - { - if(sizey==12) LCD_ShowChinese12x12(x,y,s,fc,bc,sizey,mode); - else if(sizey==16) LCD_ShowChinese16x16(x,y,s,fc,bc,sizey,mode); - else if(sizey==24) LCD_ShowChinese24x24(x,y,s,fc,bc,sizey,mode); - else if(sizey==32) LCD_ShowChinese32x32(x,y,s,fc,bc,sizey,mode); - else return; - s+=2; - x+=sizey; - } -} - -/****************************************************************************** - 函数说明:显示单个12x12汉字 - 入口数据:x,y显示坐标 - *s 要显示的汉字 - fc 字的颜色 - bc 字的背景色 - sizey 字号 - mode: 0非叠加模式 1叠加模式 - 返回值: 无 -******************************************************************************/ -void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode) -{ - u8 i,j,m=0; - u16 k; - u16 HZnum;//汉字数目 - u16 TypefaceNum;//一个字符所占字节大小 - u16 x0=x; - TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey; - - HZnum=sizeof(tfont12)/sizeof(typFNT_GB12); //统计汉字数目 - for(k=0;k>8); -// LCD_Writ_Bus(dat); - uint8_t temp[2]; - temp[0]=(dat>>8)&0xff; - temp[1]=dat&0xff; - HAL_SPI_Transmit(&hspi2,temp,2,1); - -} - - -/****************************************************************************** - ˵LCDд - ݣdat д - ֵ -******************************************************************************/ -void LCD_WR_REG(u8 dat) -{ - LCD_DC_Clr();//д - LCD_Writ_Bus(dat); - LCD_DC_Set();//д -} - - -/****************************************************************************** - ˵ʼͽַ - ݣx1,x2 еʼͽַ - y1,y2 еʼͽַ - ֵ -******************************************************************************/ -void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2) -{ - LCD_WR_REG(0x2a);//еַ - LCD_WR_DATA(x1); - LCD_WR_DATA(x2); - LCD_WR_REG(0x2b);//еַ - LCD_WR_DATA(y1); - LCD_WR_DATA(y2); - LCD_WR_REG(0x2c);//д -} - - -/****************************************************************************** - ˵LCDڱ - ݣdc,ռձ,5%~100% - ֵ -******************************************************************************/ -void LCD_Set_Light(uint8_t dc) -{ - if(dc>=5 && dc<=100) - __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,dc*PWM_PERIOD/100); -} - - -/****************************************************************************** - ˵LCDرձ - ݣ - ֵ -******************************************************************************/ -void LCD_Close_Light(void) -{ - __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,0); - //HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_3); -} - - -/****************************************************************************** - ˵LCD - ݣ - ֵ -******************************************************************************/ -void LCD_Open_Light(void) -{ - HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3); -} - -/****************************************************************************** - ˵ST7789 SLEEP IN - ݣ - ֵ -******************************************************************************/ -void LCD_ST7789_SleepIn(void) -{ - LCD_WR_REG(0x10); - delay_ms(100); -} - - -/****************************************************************************** - ˵ST7789 SLEEP OUT - ݣ - ֵ -******************************************************************************/ -void LCD_ST7789_SleepOut(void) -{ - LCD_WR_REG(0x11); - delay_ms(100); -} - - -/****************************************************************************** - ˵LCDʼ - ݣ - ֵ -******************************************************************************/ -void LCD_Init(void) -{ - LCD_GPIO_Init();//ʼGPIO - LCD_CS_Clr(); //chip select - - LCD_RES_Clr(); //λ - delay_ms(100); - LCD_RES_Set(); - delay_ms(100); - - LCD_WR_REG(0x11); - delay_ms(120); - LCD_WR_REG(0x36); - if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00); - else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0); - else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70); - else LCD_WR_DATA8(0xA0); - - LCD_WR_REG(0x3A); - LCD_WR_DATA8(0x05); - - LCD_WR_REG(0xB2); - LCD_WR_DATA8(0x0C); - LCD_WR_DATA8(0x0C); - LCD_WR_DATA8(0x00); - LCD_WR_DATA8(0x33); - LCD_WR_DATA8(0x33); - - LCD_WR_REG(0xB7); - LCD_WR_DATA8(0x35); - - LCD_WR_REG(0xBB); - LCD_WR_DATA8(0x19); - - LCD_WR_REG(0xC0); - LCD_WR_DATA8(0x2C); - - LCD_WR_REG(0xC2); - LCD_WR_DATA8(0x01); - - LCD_WR_REG(0xC3); - LCD_WR_DATA8(0x12); - - LCD_WR_REG(0xC4); - LCD_WR_DATA8(0x20); - - LCD_WR_REG(0xC6); - LCD_WR_DATA8(0x0F); - - LCD_WR_REG(0xD0); - LCD_WR_DATA8(0xA4); - LCD_WR_DATA8(0xA1); - - LCD_WR_REG(0xE0); - LCD_WR_DATA8(0xD0); - LCD_WR_DATA8(0x04); - LCD_WR_DATA8(0x0D); - LCD_WR_DATA8(0x11); - LCD_WR_DATA8(0x13); - LCD_WR_DATA8(0x2B); - LCD_WR_DATA8(0x3F); - LCD_WR_DATA8(0x54); - LCD_WR_DATA8(0x4C); - LCD_WR_DATA8(0x18); - LCD_WR_DATA8(0x0D); - LCD_WR_DATA8(0x0B); - LCD_WR_DATA8(0x1F); - LCD_WR_DATA8(0x23); - - LCD_WR_REG(0xE1); - LCD_WR_DATA8(0xD0); - LCD_WR_DATA8(0x04); - LCD_WR_DATA8(0x0C); - LCD_WR_DATA8(0x11); - LCD_WR_DATA8(0x13); - LCD_WR_DATA8(0x2C); - LCD_WR_DATA8(0x3F); - LCD_WR_DATA8(0x44); - LCD_WR_DATA8(0x51); - LCD_WR_DATA8(0x2F); - LCD_WR_DATA8(0x1F); - LCD_WR_DATA8(0x1F); - LCD_WR_DATA8(0x20); - LCD_WR_DATA8(0x23); - - LCD_WR_REG(0x21); - - LCD_WR_REG(0x29); -} - - - diff --git a/software/bootloader/BSP/LCD/lcd_init.h b/software/bootloader/BSP/LCD/lcd_init.h deleted file mode 100644 index 047ed6c..0000000 --- a/software/bootloader/BSP/LCD/lcd_init.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef __LCD_INIT_H -#define __LCD_INIT_H - -#include "sys.h" - -#define USE_HORIZONTAL 1 //úʾ 01Ϊ 23Ϊ - - -#if USE_HORIZONTAL==0||USE_HORIZONTAL==1 -#define LCD_W 240 -#define LCD_H 240 - -#else -#define LCD_W 240 -#define LCD_H 240 -#endif - - -//-----------------LCD˿ڶ---------------- -#define SCLK_PORT GPIOB -#define SCLK_PIN GPIO_PIN_13 - -#define SDA_PORT GPIOB -#define SDA_PIN GPIO_PIN_15 - -#define RES_PORT GPIOB -#define RES_PIN GPIO_PIN_12 - -#define DC_PORT GPIOA -#define DC_PIN GPIO_PIN_9 - -#define CS_PORT GPIOA -#define CS_PIN GPIO_PIN_8 - -#define BLK_PORT GPIOA -#define BLK_PIN GPIO_PIN_10 - -#define LCD_SCLK_Clr() HAL_GPIO_WritePin(SCLK_PORT,SCLK_PIN,GPIO_PIN_RESET)//SCL=SCLK -#define LCD_SCLK_Set() HAL_GPIO_WritePin(SCLK_PORT,SCLK_PIN,GPIO_PIN_SET) - -#define LCD_MOSI_Clr() HAL_GPIO_WritePin(SDA_PORT,SDA_PIN,GPIO_PIN_RESET)//SDA=MOSI -#define LCD_MOSI_Set() HAL_GPIO_WritePin(SDA_PORT,SDA_PIN,GPIO_PIN_SET) - -#define LCD_RES_Clr() HAL_GPIO_WritePin(RES_PORT,RES_PIN,GPIO_PIN_RESET)//RES -#define LCD_RES_Set() HAL_GPIO_WritePin(RES_PORT,RES_PIN,GPIO_PIN_SET) - -#define LCD_DC_Clr() HAL_GPIO_WritePin(DC_PORT,DC_PIN,GPIO_PIN_RESET)//DC -#define LCD_DC_Set() HAL_GPIO_WritePin(DC_PORT,DC_PIN,GPIO_PIN_SET) - -#define LCD_CS_Clr() HAL_GPIO_WritePin(CS_PORT,CS_PIN,GPIO_PIN_RESET)//CS -#define LCD_CS_Set() HAL_GPIO_WritePin(CS_PORT,CS_PIN,GPIO_PIN_SET) - -#define LCD_BLK_Clr() HAL_GPIO_WritePin(BLK_PORT,BLK_PIN,GPIO_PIN_RESET)//BLK -#define LCD_BLK_Set() HAL_GPIO_WritePin(BLK_PORT,BLK_PIN,GPIO_PIN_SET) - -void LCD_GPIO_Init(void);//ʼGPIO -void LCD_Writ_Bus(u8 dat);//ģSPIʱ -void LCD_WR_DATA8(u8 dat);//дһֽ -void LCD_WR_DATA(u16 dat);//дֽ -void LCD_WR_REG(u8 dat);//дһָ -void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);//꺯 -void LCD_Init(void);//LCDʼ -void LCD_Set_Light(uint8_t dc); -void LCD_Close_Light(void); -void LCD_ST7789_SleepIn(void); -void LCD_ST7789_SleepOut(void); -void LCD_Open_Light(void); -#endif - - - - diff --git a/software/bootloader/BSP/LCD/lcdfont.h b/software/bootloader/BSP/LCD/lcdfont.h deleted file mode 100644 index ae3b43a..0000000 --- a/software/bootloader/BSP/LCD/lcdfont.h +++ /dev/null @@ -1,535 +0,0 @@ -#ifndef __LCDFONT_H -#define __LCDFONT_H - -const unsigned char ascii_1206[][12]={ - -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ -{0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x00,0x00},/*"!",1*/ -{0x14,0x14,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/ -{0x00,0x00,0x0A,0x0A,0x1F,0x0A,0x0A,0x1F,0x0A,0x0A,0x00,0x00},/*"#",3*/ -{0x00,0x04,0x0E,0x15,0x05,0x06,0x0C,0x14,0x15,0x0E,0x04,0x00},/*"$",4*/ -{0x00,0x00,0x12,0x15,0x0D,0x15,0x2E,0x2C,0x2A,0x12,0x00,0x00},/*"%",5*/ -{0x00,0x00,0x04,0x0A,0x0A,0x36,0x15,0x15,0x29,0x16,0x00,0x00},/*"&",6*/ -{0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ -{0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x10,0x00},/*"(",8*/ -{0x02,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x02,0x00},/*")",9*/ -{0x00,0x00,0x00,0x04,0x15,0x0E,0x0E,0x15,0x04,0x00,0x00,0x00},/*"*",10*/ -{0x00,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00,0x00,0x00},/*"+",11*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x01,0x00},/*",",12*/ -{0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00},/*".",14*/ -{0x00,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x01,0x00},/*"/",15*/ -{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"0",16*/ -{0x00,0x00,0x04,0x06,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"1",17*/ -{0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x02,0x01,0x1F,0x00,0x00},/*"2",18*/ -{0x00,0x00,0x0E,0x11,0x10,0x0C,0x10,0x10,0x11,0x0E,0x00,0x00},/*"3",19*/ -{0x00,0x00,0x08,0x0C,0x0C,0x0A,0x09,0x1F,0x08,0x1C,0x00,0x00},/*"4",20*/ -{0x00,0x00,0x1F,0x01,0x01,0x0F,0x11,0x10,0x11,0x0E,0x00,0x00},/*"5",21*/ -{0x00,0x00,0x0C,0x12,0x01,0x0D,0x13,0x11,0x11,0x0E,0x00,0x00},/*"6",22*/ -{0x00,0x00,0x1E,0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x00,0x00},/*"7",23*/ -{0x00,0x00,0x0E,0x11,0x11,0x0E,0x11,0x11,0x11,0x0E,0x00,0x00},/*"8",24*/ -{0x00,0x00,0x0E,0x11,0x11,0x19,0x16,0x10,0x09,0x06,0x00,0x00},/*"9",25*/ -{0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00},/*":",26*/ -{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x04,0x00},/*";",27*/ -{0x00,0x00,0x10,0x08,0x04,0x02,0x02,0x04,0x08,0x10,0x00,0x00},/*"<",28*/ -{0x00,0x00,0x00,0x00,0x3F,0x00,0x3F,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ -{0x00,0x00,0x02,0x04,0x08,0x10,0x10,0x08,0x04,0x02,0x00,0x00},/*">",30*/ -{0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x04,0x00,0x04,0x00,0x00},/*"?",31*/ -{0x00,0x00,0x1C,0x22,0x29,0x2D,0x2D,0x1D,0x22,0x1C,0x00,0x00},/*"@",32*/ -{0x00,0x00,0x04,0x04,0x0C,0x0A,0x0A,0x1E,0x12,0x33,0x00,0x00},/*"A",33*/ -{0x00,0x00,0x0F,0x12,0x12,0x0E,0x12,0x12,0x12,0x0F,0x00,0x00},/*"B",34*/ -{0x00,0x00,0x1E,0x11,0x01,0x01,0x01,0x01,0x11,0x0E,0x00,0x00},/*"C",35*/ -{0x00,0x00,0x0F,0x12,0x12,0x12,0x12,0x12,0x12,0x0F,0x00,0x00},/*"D",36*/ -{0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x12,0x1F,0x00,0x00},/*"E",37*/ -{0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x02,0x07,0x00,0x00},/*"F",38*/ -{0x00,0x00,0x1C,0x12,0x01,0x01,0x39,0x11,0x12,0x0C,0x00,0x00},/*"G",39*/ -{0x00,0x00,0x33,0x12,0x12,0x1E,0x12,0x12,0x12,0x33,0x00,0x00},/*"H",40*/ -{0x00,0x00,0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"I",41*/ -{0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x07},/*"J",42*/ -{0x00,0x00,0x37,0x12,0x0A,0x06,0x0A,0x12,0x12,0x37,0x00,0x00},/*"K",43*/ -{0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x22,0x3F,0x00,0x00},/*"L",44*/ -{0x00,0x00,0x3B,0x1B,0x1B,0x1B,0x15,0x15,0x15,0x35,0x00,0x00},/*"M",45*/ -{0x00,0x00,0x3B,0x12,0x16,0x16,0x1A,0x1A,0x12,0x17,0x00,0x00},/*"N",46*/ -{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"O",47*/ -{0x00,0x00,0x0F,0x12,0x12,0x0E,0x02,0x02,0x02,0x07,0x00,0x00},/*"P",48*/ -{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x17,0x19,0x0E,0x18,0x00},/*"Q",49*/ -{0x00,0x00,0x0F,0x12,0x12,0x0E,0x0A,0x12,0x12,0x37,0x00,0x00},/*"R",50*/ -{0x00,0x00,0x1E,0x11,0x01,0x06,0x08,0x10,0x11,0x0F,0x00,0x00},/*"S",51*/ -{0x00,0x00,0x1F,0x15,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"T",52*/ -{0x00,0x00,0x33,0x12,0x12,0x12,0x12,0x12,0x12,0x0C,0x00,0x00},/*"U",53*/ -{0x00,0x00,0x33,0x12,0x12,0x0A,0x0A,0x0C,0x04,0x04,0x00,0x00},/*"V",54*/ -{0x00,0x00,0x15,0x15,0x15,0x15,0x0E,0x0A,0x0A,0x0A,0x00,0x00},/*"W",55*/ -{0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x0A,0x0A,0x1B,0x00,0x00},/*"X",56*/ -{0x00,0x00,0x1B,0x0A,0x0A,0x0A,0x04,0x04,0x04,0x0E,0x00,0x00},/*"Y",57*/ -{0x00,0x00,0x1F,0x09,0x08,0x04,0x04,0x02,0x12,0x1F,0x00,0x00},/*"Z",58*/ -{0x1C,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1C,0x00},/*"[",59*/ -{0x00,0x02,0x02,0x04,0x04,0x04,0x08,0x08,0x08,0x10,0x10,0x00},/*"\",60*/ -{0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0E,0x00},/*"]",61*/ -{0x04,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F},/*"_",63*/ -{0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ -{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1C,0x12,0x3C,0x00,0x00},/*"a",65*/ -{0x00,0x03,0x02,0x02,0x02,0x0E,0x12,0x12,0x12,0x0E,0x00,0x00},/*"b",66*/ -{0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x02,0x12,0x0C,0x00,0x00},/*"c",67*/ -{0x00,0x18,0x10,0x10,0x10,0x1C,0x12,0x12,0x12,0x3C,0x00,0x00},/*"d",68*/ -{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1E,0x02,0x1C,0x00,0x00},/*"e",69*/ -{0x00,0x18,0x24,0x04,0x04,0x1E,0x04,0x04,0x04,0x1E,0x00,0x00},/*"f",70*/ -{0x00,0x00,0x00,0x00,0x00,0x3C,0x12,0x0C,0x02,0x1C,0x22,0x1C},/*"g",71*/ -{0x00,0x03,0x02,0x02,0x02,0x0E,0x12,0x12,0x12,0x37,0x00,0x00},/*"h",72*/ -{0x00,0x04,0x04,0x00,0x00,0x06,0x04,0x04,0x04,0x0E,0x00,0x00},/*"i",73*/ -{0x00,0x08,0x08,0x00,0x00,0x0C,0x08,0x08,0x08,0x08,0x08,0x07},/*"j",74*/ -{0x00,0x03,0x02,0x02,0x02,0x1A,0x0A,0x06,0x0A,0x13,0x00,0x00},/*"k",75*/ -{0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"l",76*/ -{0x00,0x00,0x00,0x00,0x00,0x0F,0x15,0x15,0x15,0x15,0x00,0x00},/*"m",77*/ -{0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x37,0x00,0x00},/*"n",78*/ -{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x12,0x12,0x0C,0x00,0x00},/*"o",79*/ -{0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x0E,0x02,0x07},/*"p",80*/ -{0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x12,0x12,0x1C,0x10,0x38},/*"q",81*/ -{0x00,0x00,0x00,0x00,0x00,0x1B,0x06,0x02,0x02,0x07,0x00,0x00},/*"r",82*/ -{0x00,0x00,0x00,0x00,0x00,0x1E,0x02,0x0C,0x10,0x1E,0x00,0x00},/*"s",83*/ -{0x00,0x00,0x00,0x04,0x04,0x1E,0x04,0x04,0x04,0x1C,0x00,0x00},/*"t",84*/ -{0x00,0x00,0x00,0x00,0x00,0x1B,0x12,0x12,0x12,0x3C,0x00,0x00},/*"u",85*/ -{0x00,0x00,0x00,0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x00,0x00},/*"v",86*/ -{0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x0E,0x0A,0x0A,0x00,0x00},/*"w",87*/ -{0x00,0x00,0x00,0x00,0x00,0x1B,0x0A,0x04,0x0A,0x1B,0x00,0x00},/*"x",88*/ -{0x00,0x00,0x00,0x00,0x00,0x33,0x12,0x12,0x0C,0x08,0x04,0x03},/*"y",89*/ -{0x00,0x00,0x00,0x00,0x00,0x1E,0x08,0x04,0x04,0x1E,0x00,0x00},/*"z",90*/ -{0x18,0x08,0x08,0x08,0x08,0x0C,0x08,0x08,0x08,0x08,0x18,0x00},/*"{",91*/ -{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},/*"|",92*/ -{0x06,0x04,0x04,0x04,0x04,0x08,0x04,0x04,0x04,0x04,0x06,0x00},/*"}",93*/ -{0x16,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ -}; - -const unsigned char ascii_1608[][16]={ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ -{0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x18,0x18,0x00,0x00},/*"!",1*/ -{0x00,0x48,0x6C,0x24,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/ -{0x00,0x00,0x00,0x24,0x24,0x24,0x7F,0x12,0x12,0x12,0x7F,0x12,0x12,0x12,0x00,0x00},/*"#",3*/ -{0x00,0x00,0x08,0x1C,0x2A,0x2A,0x0A,0x0C,0x18,0x28,0x28,0x2A,0x2A,0x1C,0x08,0x08},/*"$",4*/ -{0x00,0x00,0x00,0x22,0x25,0x15,0x15,0x15,0x2A,0x58,0x54,0x54,0x54,0x22,0x00,0x00},/*"%",5*/ -{0x00,0x00,0x00,0x0C,0x12,0x12,0x12,0x0A,0x76,0x25,0x29,0x11,0x91,0x6E,0x00,0x00},/*"&",6*/ -{0x00,0x06,0x06,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ -{0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x00},/*"(",8*/ -{0x00,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x04,0x02,0x00},/*")",9*/ -{0x00,0x00,0x00,0x00,0x08,0x08,0x6B,0x1C,0x1C,0x6B,0x08,0x08,0x00,0x00,0x00,0x00},/*"*",10*/ -{0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x7F,0x08,0x08,0x08,0x08,0x00,0x00,0x00},/*"+",11*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x04,0x03},/*",",12*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00},/*".",14*/ -{0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x00},/*"/",15*/ -{0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*"0",16*/ -{0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"1",17*/ -{0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00},/*"2",18*/ -{0x00,0x00,0x00,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,0x22,0x1C,0x00,0x00},/*"3",19*/ -{0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,0x20,0x78,0x00,0x00},/*"4",20*/ -{0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,0x22,0x1C,0x00,0x00},/*"5",21*/ -{0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*"6",22*/ -{0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00},/*"7",23*/ -{0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00},/*"8",24*/ -{0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,0x24,0x1C,0x00,0x00},/*"9",25*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00},/*":",26*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x04},/*";",27*/ -{0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x40,0x00,0x00},/*"<",28*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ -{0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00},/*">",30*/ -{0x00,0x00,0x00,0x3C,0x42,0x42,0x46,0x40,0x20,0x10,0x10,0x00,0x18,0x18,0x00,0x00},/*"?",31*/ -{0x00,0x00,0x00,0x1C,0x22,0x5A,0x55,0x55,0x55,0x55,0x2D,0x42,0x22,0x1C,0x00,0x00},/*"@",32*/ -{0x00,0x00,0x00,0x08,0x08,0x18,0x14,0x14,0x24,0x3C,0x22,0x42,0x42,0xE7,0x00,0x00},/*"A",33*/ -{0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x1E,0x22,0x42,0x42,0x42,0x22,0x1F,0x00,0x00},/*"B",34*/ -{0x00,0x00,0x00,0x7C,0x42,0x42,0x01,0x01,0x01,0x01,0x01,0x42,0x22,0x1C,0x00,0x00},/*"C",35*/ -{0x00,0x00,0x00,0x1F,0x22,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x22,0x1F,0x00,0x00},/*"D",36*/ -{0x00,0x00,0x00,0x3F,0x42,0x12,0x12,0x1E,0x12,0x12,0x02,0x42,0x42,0x3F,0x00,0x00},/*"E",37*/ -{0x00,0x00,0x00,0x3F,0x42,0x12,0x12,0x1E,0x12,0x12,0x02,0x02,0x02,0x07,0x00,0x00},/*"F",38*/ -{0x00,0x00,0x00,0x3C,0x22,0x22,0x01,0x01,0x01,0x71,0x21,0x22,0x22,0x1C,0x00,0x00},/*"G",39*/ -{0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"H",40*/ -{0x00,0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"I",41*/ -{0x00,0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x0F},/*"J",42*/ -{0x00,0x00,0x00,0x77,0x22,0x12,0x0A,0x0E,0x0A,0x12,0x12,0x22,0x22,0x77,0x00,0x00},/*"K",43*/ -{0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x7F,0x00,0x00},/*"L",44*/ -{0x00,0x00,0x00,0x77,0x36,0x36,0x36,0x36,0x2A,0x2A,0x2A,0x2A,0x2A,0x6B,0x00,0x00},/*"M",45*/ -{0x00,0x00,0x00,0xE3,0x46,0x46,0x4A,0x4A,0x52,0x52,0x52,0x62,0x62,0x47,0x00,0x00},/*"N",46*/ -{0x00,0x00,0x00,0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x22,0x1C,0x00,0x00},/*"O",47*/ -{0x00,0x00,0x00,0x3F,0x42,0x42,0x42,0x42,0x3E,0x02,0x02,0x02,0x02,0x07,0x00,0x00},/*"P",48*/ -{0x00,0x00,0x00,0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x4D,0x53,0x32,0x1C,0x60,0x00},/*"Q",49*/ -{0x00,0x00,0x00,0x3F,0x42,0x42,0x42,0x3E,0x12,0x12,0x22,0x22,0x42,0xC7,0x00,0x00},/*"R",50*/ -{0x00,0x00,0x00,0x7C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x42,0x42,0x3E,0x00,0x00},/*"S",51*/ -{0x00,0x00,0x00,0x7F,0x49,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00},/*"T",52*/ -{0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00},/*"U",53*/ -{0x00,0x00,0x00,0xE7,0x42,0x42,0x22,0x24,0x24,0x14,0x14,0x18,0x08,0x08,0x00,0x00},/*"V",54*/ -{0x00,0x00,0x00,0x6B,0x49,0x49,0x49,0x49,0x55,0x55,0x36,0x22,0x22,0x22,0x00,0x00},/*"W",55*/ -{0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x18,0x18,0x18,0x24,0x24,0x42,0xE7,0x00,0x00},/*"X",56*/ -{0x00,0x00,0x00,0x77,0x22,0x22,0x14,0x14,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00},/*"Y",57*/ -{0x00,0x00,0x00,0x7E,0x21,0x20,0x10,0x10,0x08,0x04,0x04,0x42,0x42,0x3F,0x00,0x00},/*"Z",58*/ -{0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78,0x00},/*"[",59*/ -{0x00,0x00,0x02,0x02,0x04,0x04,0x08,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x40,0x40},/*"\",60*/ -{0x00,0x1E,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1E,0x00},/*"]",61*/ -{0x00,0x38,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF},/*"_",63*/ -{0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x78,0x44,0x42,0x42,0xFC,0x00,0x00},/*"a",65*/ -{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x26,0x1A,0x00,0x00},/*"b",66*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x02,0x02,0x02,0x44,0x38,0x00,0x00},/*"c",67*/ -{0x00,0x00,0x00,0x60,0x40,0x40,0x40,0x78,0x44,0x42,0x42,0x42,0x64,0xD8,0x00,0x00},/*"d",68*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x7E,0x02,0x02,0x42,0x3C,0x00,0x00},/*"e",69*/ -{0x00,0x00,0x00,0xF0,0x88,0x08,0x08,0x7E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"f",70*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x22,0x22,0x1C,0x02,0x3C,0x42,0x42,0x3C},/*"g",71*/ -{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x3A,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"h",72*/ -{0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"i",73*/ -{0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x1E},/*"j",74*/ -{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x72,0x12,0x0A,0x16,0x12,0x22,0x77,0x00,0x00},/*"k",75*/ -{0x00,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"l",76*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x92,0x92,0x92,0x92,0x92,0xB7,0x00,0x00},/*"m",77*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"n",78*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00},/*"o",79*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0x26,0x42,0x42,0x42,0x22,0x1E,0x02,0x07},/*"p",80*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x42,0x42,0x42,0x44,0x78,0x40,0xE0},/*"q",81*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x4C,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"r",82*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x42,0x02,0x3C,0x40,0x42,0x3E,0x00,0x00},/*"s",83*/ -{0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00},/*"t",84*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x42,0x42,0x42,0x42,0x62,0xDC,0x00,0x00},/*"u",85*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x14,0x08,0x08,0x00,0x00},/*"v",86*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEB,0x49,0x49,0x55,0x55,0x22,0x22,0x00,0x00},/*"w",87*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x24,0x18,0x18,0x18,0x24,0x6E,0x00,0x00},/*"x",88*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x14,0x18,0x08,0x08,0x07},/*"y",89*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x22,0x10,0x08,0x08,0x44,0x7E,0x00,0x00},/*"z",90*/ -{0x00,0xC0,0x20,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0xC0,0x00},/*"{",91*/ -{0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10},/*"|",92*/ -{0x00,0x06,0x08,0x08,0x08,0x08,0x08,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x00},/*"}",93*/ -{0x0C,0x32,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ -}; -const unsigned char ascii_2412[][48]={ -{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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/ -{0x00,0x00,0x00,0x00,0x60,0x06,0x60,0x06,0x30,0x03,0x98,0x01,0x88,0x00,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,0x00,0x00,0x00,0x00,0x00},/*""",2*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0xFE,0x07,0xFE,0x07,0x08,0x02,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0xFE,0x07,0xFE,0x07,0x04,0x01,0x04,0x01,0x04,0x01,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"#",3*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0xF0,0x01,0x58,0x03,0x4C,0x03,0xCC,0x03,0x4C,0x00,0x58,0x00,0x70,0x00,0xE0,0x00,0xC0,0x01,0xC0,0x01,0x40,0x03,0x4C,0x03,0x5C,0x03,0x4C,0x03,0x48,0x01,0xF0,0x00,0x40,0x00,0x40,0x00,0x00,0x00},/*"$",4*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x01,0x0A,0x01,0x91,0x00,0x91,0x00,0x91,0x00,0x51,0x00,0x51,0x00,0x3A,0x00,0xAE,0x03,0xA0,0x02,0x50,0x04,0x50,0x04,0x48,0x04,0x48,0x04,0x48,0x04,0x84,0x02,0x84,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"%",5*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x2C,0x00,0x98,0x07,0x1C,0x01,0x1A,0x01,0x33,0x01,0x33,0x01,0x63,0x01,0xE3,0x00,0xC3,0x08,0xC6,0x09,0x3C,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"&",6*/ -{0x00,0x00,0x00,0x00,0x0C,0x00,0x1C,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,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,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ -{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x80,0x00,0x80,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00},/*"(",8*/ -{0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00,0x00},/*")",9*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xC0,0x00,0x40,0x00,0x46,0x0C,0x4E,0x0F,0xD0,0x01,0xF0,0x01,0x5E,0x0F,0x46,0x0C,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"*",10*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0xFE,0x0F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"+",11*/ -{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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1C,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,0x00},/*",",12*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/ -{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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/ -{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x01,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x00,0x00},/*"/",15*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0x0C,0x03,0x98,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"0",16*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x7C,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"1",17*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x84,0x01,0x02,0x03,0x06,0x03,0x06,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0xC0,0x00,0x60,0x00,0x20,0x00,0x10,0x00,0x08,0x02,0x04,0x02,0x06,0x02,0xFE,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"2",18*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0xC6,0x00,0x86,0x01,0x86,0x01,0x80,0x01,0x80,0x01,0xC0,0x00,0x70,0x00,0x80,0x01,0x00,0x01,0x00,0x03,0x00,0x03,0x06,0x03,0x06,0x03,0x86,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"3",19*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0xC0,0x01,0xA0,0x01,0xA0,0x01,0x90,0x01,0x88,0x01,0x88,0x01,0x84,0x01,0x82,0x01,0xFE,0x0F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"4",20*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xF4,0x00,0x8C,0x01,0x04,0x03,0x00,0x03,0x00,0x03,0x06,0x03,0x06,0x03,0x82,0x01,0x84,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"5",21*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x18,0x03,0x0C,0x03,0x0C,0x00,0x04,0x00,0x06,0x00,0xE6,0x01,0x16,0x03,0x0E,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x0C,0x02,0x18,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"6",22*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x0C,0x06,0x04,0x02,0x04,0x01,0x00,0x01,0x00,0x01,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"7",23*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x02,0x1C,0x03,0xF0,0x00,0xC8,0x01,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"8",24*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x0C,0x01,0x0C,0x03,0x06,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x8C,0x06,0x78,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x0C,0x01,0x8C,0x01,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"9",25*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x40,0x00,0x20,0x00,0x20,0x00},/*";",27*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00},/*"<",28*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*">",30*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x06,0x04,0x0C,0x04,0x0C,0x0C,0x0C,0x0C,0x0C,0x00,0x07,0x80,0x01,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"?",31*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x18,0x03,0x0C,0x02,0xCC,0x05,0x64,0x05,0x66,0x05,0xA6,0x05,0xB6,0x04,0xB6,0x04,0xB6,0x04,0xB6,0x04,0xB6,0x02,0xE4,0x01,0x0C,0x04,0x0C,0x02,0x18,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"@",32*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x50,0x00,0xD0,0x00,0x90,0x00,0x90,0x00,0x88,0x00,0x88,0x01,0x08,0x01,0xF8,0x01,0x04,0x03,0x04,0x03,0x04,0x02,0x02,0x02,0x02,0x06,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00},/*"A",33*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x8C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x8C,0x01,0xFC,0x00,0x0C,0x03,0x0C,0x02,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x03,0xFE,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"B",34*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x03,0x0C,0x06,0x0C,0x04,0x04,0x04,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x04,0x0C,0x04,0x0C,0x02,0x18,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"C",35*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x8C,0x01,0x0C,0x03,0x0C,0x03,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x03,0x0C,0x03,0x8C,0x01,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"D",36*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x06,0x03,0x06,0x04,0x06,0x04,0x06,0x00,0x86,0x00,0x86,0x00,0xFE,0x00,0x86,0x00,0x86,0x00,0x86,0x00,0x06,0x00,0x06,0x04,0x06,0x04,0x06,0x02,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"E",37*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x06,0x03,0x06,0x04,0x06,0x04,0x06,0x00,0x86,0x00,0x86,0x00,0xFE,0x00,0x86,0x00,0x86,0x00,0x86,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"F",38*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x18,0x01,0x0C,0x02,0x0C,0x02,0x04,0x02,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xC6,0x0F,0x06,0x03,0x06,0x03,0x0C,0x03,0x0C,0x03,0x18,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"G",39*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xFE,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00},/*"H",40*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"I",41*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC6,0x00,0x66,0x00,0x3C,0x00},/*"J",42*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x03,0x86,0x01,0xC6,0x00,0x46,0x00,0x26,0x00,0x16,0x00,0x36,0x00,0x2E,0x00,0x6E,0x00,0x46,0x00,0xC6,0x00,0x86,0x00,0x86,0x01,0x06,0x01,0x06,0x03,0x8F,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"K",43*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x04,0x06,0x04,0x06,0x02,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"L",44*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x86,0x03,0x86,0x03,0x8E,0x03,0x8E,0x03,0x4E,0x03,0x4E,0x03,0x4A,0x03,0x5A,0x03,0x5A,0x03,0x3A,0x03,0x32,0x03,0x32,0x03,0x32,0x03,0x12,0x03,0x87,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"M",45*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8E,0x0F,0x0C,0x02,0x1C,0x02,0x1C,0x02,0x34,0x02,0x34,0x02,0x64,0x02,0x64,0x02,0x44,0x02,0xC4,0x02,0x84,0x02,0x84,0x03,0x84,0x03,0x04,0x03,0x04,0x03,0x1F,0x02,0x00,0x00,0x00,0x00,0x00,0x00},/*"N",46*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x0C,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x02,0x0C,0x03,0x98,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"O",47*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x06,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x86,0x03,0xFE,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"P",48*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x0C,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x76,0x06,0x4C,0x02,0xCC,0x03,0x98,0x01,0xF0,0x00,0x80,0x07,0x00,0x03,0x00,0x00},/*"Q",49*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x06,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0xFE,0x00,0x46,0x00,0xC6,0x00,0x86,0x00,0x86,0x01,0x06,0x03,0x06,0x03,0x06,0x06,0x0F,0x0E,0x00,0x00,0x00,0x00,0x00,0x00},/*"R",50*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x02,0x0C,0x03,0x06,0x02,0x06,0x02,0x06,0x00,0x0E,0x00,0x3C,0x00,0xF8,0x00,0xE0,0x03,0x80,0x03,0x00,0x07,0x02,0x06,0x02,0x06,0x06,0x06,0x0C,0x03,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"S",51*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x62,0x04,0x61,0x08,0x61,0x08,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"T",52*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x07,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x0C,0x02,0x18,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"U",53*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x07,0x06,0x02,0x04,0x01,0x04,0x01,0x0C,0x01,0x0C,0x01,0x88,0x00,0x88,0x00,0x98,0x00,0x98,0x00,0x50,0x00,0x50,0x00,0x70,0x00,0x30,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"V",54*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF7,0x0E,0x62,0x04,0x42,0x04,0x46,0x04,0x46,0x04,0x64,0x02,0x64,0x02,0xE4,0x02,0xE4,0x02,0x9C,0x02,0x9C,0x01,0x98,0x01,0x98,0x01,0x88,0x01,0x88,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"W",55*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x07,0x0C,0x01,0x08,0x01,0x18,0x01,0x90,0x00,0xB0,0x00,0x60,0x00,0x20,0x00,0x60,0x00,0x60,0x00,0xD0,0x00,0x90,0x00,0x88,0x01,0x08,0x01,0x04,0x03,0x8E,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"X",56*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x06,0x04,0x04,0x02,0x0C,0x02,0x08,0x01,0x18,0x01,0xB8,0x00,0xB0,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"Y",57*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0x0C,0x02,0x06,0x03,0x02,0x01,0x80,0x01,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x18,0x00,0x08,0x04,0x0C,0x04,0x04,0x02,0xFE,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"Z",58*/ -{0x00,0x00,0x00,0x00,0xE0,0x03,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0xE0,0x03,0x00,0x00},/*"[",59*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0xC0,0x00,0x80,0x00,0x80,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04},/*"\",60*/ -{0x00,0x00,0x00,0x00,0x7C,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7C,0x00,0x00,0x00},/*"]",61*/ -{0x00,0x00,0x60,0x00,0x90,0x00,0x08,0x01,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ -{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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F},/*"_",63*/ -{0x00,0x00,0x00,0x00,0x18,0x00,0x60,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x0C,0x03,0x0C,0x03,0x00,0x03,0xE0,0x03,0x1C,0x03,0x0E,0x03,0x06,0x03,0x06,0x03,0x8E,0x0B,0x7C,0x0E,0x00,0x00,0x00,0x00,0x00,0x00},/*"a",65*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0xCC,0x01,0x3C,0x03,0x1C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x02,0x1C,0x03,0xE4,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"b",66*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x8C,0x01,0x8C,0x01,0x86,0x01,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x02,0x0C,0x02,0x0C,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"c",67*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xC0,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x78,0x03,0x8C,0x03,0x0C,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x04,0x03,0x8C,0x07,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"d",68*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x18,0x03,0x08,0x02,0x0C,0x06,0x0C,0x06,0xFC,0x07,0x0C,0x00,0x0C,0x00,0x18,0x04,0x18,0x02,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"e",69*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x60,0x06,0x30,0x06,0x30,0x00,0x30,0x00,0xFE,0x01,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"f",70*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0xD8,0x06,0x8C,0x01,0x8C,0x01,0x8C,0x01,0x98,0x01,0xF8,0x00,0x0C,0x00,0xFC,0x00,0xCC,0x03,0x06,0x03,0x06,0x03,0x8E,0x03,0xF8,0x00},/*"g",71*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0xEC,0x01,0x1C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x9E,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"h",72*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x7C,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"i",73*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xCC,0x00,0x7C,0x00},/*"j",74*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x8C,0x03,0x8C,0x00,0x8C,0x00,0x4C,0x00,0x6C,0x00,0x5C,0x00,0x8C,0x00,0x8C,0x01,0x0C,0x01,0x0C,0x03,0x9E,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"k",75*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x7C,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"l",76*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x07,0xEE,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00},/*"m",77*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x01,0x1C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x9E,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"n",78*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0x0C,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"o",79*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x01,0x1C,0x03,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x03,0x1C,0x03,0xEC,0x01,0x0C,0x00,0x0C,0x00,0x3E,0x00},/*"p",80*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x8C,0x03,0x0C,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x04,0x03,0x8C,0x03,0x78,0x03,0x00,0x03,0x00,0x03,0xC0,0x07},/*"q",81*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x03,0x58,0x06,0x38,0x06,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"r",82*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x03,0x1C,0x03,0x0C,0x02,0x0C,0x02,0x38,0x00,0xF0,0x00,0xC0,0x03,0x04,0x03,0x04,0x03,0x8C,0x03,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"s",83*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x30,0x00,0x30,0x00,0xFE,0x01,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x02,0x30,0x02,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"t",84*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x02,0x8E,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x9C,0x07,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"u",85*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x07,0x0C,0x02,0x08,0x01,0x08,0x01,0x18,0x01,0x90,0x00,0xB0,0x00,0xB0,0x00,0x60,0x00,0x60,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"v",86*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF7,0x0E,0x62,0x04,0x46,0x04,0x64,0x02,0x64,0x02,0xEC,0x02,0x9C,0x01,0x98,0x01,0x98,0x01,0x98,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"w",87*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBC,0x07,0x18,0x01,0x10,0x01,0xB0,0x00,0x60,0x00,0x60,0x00,0xE0,0x00,0x90,0x00,0x08,0x01,0x08,0x03,0x9E,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"x",88*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x07,0x08,0x01,0x08,0x01,0x08,0x01,0x90,0x00,0x90,0x00,0xB0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x20,0x00,0x20,0x00,0x24,0x00,0x1C,0x00},/*"y",89*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x84,0x01,0xC4,0x00,0x44,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x18,0x02,0x08,0x02,0x0C,0x03,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"z",90*/ -{0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x40,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x03,0x00,0x00},/*"{",91*/ -{0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00},/*"|",92*/ -{0x00,0x00,0x00,0x00,0x0C,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x0C,0x00,0x00,0x00},/*"}",93*/ -{0x00,0x00,0x1C,0x00,0x22,0x04,0xC2,0x04,0x80,0x03,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ - - -}; -const unsigned char ascii_3216[][64]={ -{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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0xC0,0x03,0xC0,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1C,0xE0,0x1C,0xF0,0x1E,0x70,0x0E,0x38,0x07,0x18,0x03,0x08,0x01,0x84,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0xFE,0x7F,0xFE,0x7F,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0xFE,0x7F,0xFE,0x7F,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"#",3*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xC0,0x07,0x60,0x19,0x10,0x31,0x18,0x31,0x18,0x39,0x18,0x39,0x38,0x01,0x70,0x01,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0F,0x00,0x1D,0x00,0x39,0x00,0x31,0x1C,0x31,0x1C,0x31,0x0C,0x31,0x0C,0x11,0x18,0x0D,0xE0,0x07,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00},/*"$",4*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x10,0x36,0x18,0x63,0x08,0x63,0x0C,0x63,0x04,0x63,0x04,0x63,0x02,0x63,0x02,0x63,0x01,0x36,0x1D,0x9C,0x37,0x80,0x22,0x80,0x63,0x40,0x63,0x40,0x63,0x20,0x63,0x20,0x63,0x30,0x63,0x10,0x22,0x18,0x36,0x08,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"%",5*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x00,0xCC,0x00,0x78,0x00,0x18,0x3E,0x1C,0x08,0x36,0x08,0x32,0x08,0x63,0x04,0x63,0x04,0xC3,0x04,0xC3,0x03,0x83,0x43,0x06,0x43,0x8E,0x26,0x78,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"&",6*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x3C,0x00,0x3C,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x0C,0x00,0x06,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x03,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x00},/*"(",8*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00,0x00},/*")",9*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0x80,0x03,0x00,0x01,0x1C,0x71,0x3C,0x79,0x78,0x3D,0xC0,0x07,0x00,0x01,0xC0,0x07,0x78,0x3D,0x3C,0x79,0x1C,0x71,0x00,0x01,0x80,0x03,0x80,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"*",10*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0xFC,0x7F,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"+",11*/ -{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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x3C,0x00,0x3C,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x0C,0x00,0x06,0x00},/*",",12*/ -{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,0x00,0x00,0x00,0x00,0xFE,0x7F,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,0x00,0x00},/*"-",13*/ -{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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x3C,0x00,0x3C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x10,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0xC0,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x10,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00,0x00},/*"/",15*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x60,0x0C,0x30,0x18,0x18,0x30,0x18,0x30,0x18,0x20,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x18,0x20,0x18,0x30,0x18,0x30,0x30,0x18,0x60,0x0C,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"0",16*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xC0,0x03,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"1",17*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x10,0x1C,0x08,0x18,0x04,0x30,0x04,0x30,0x0C,0x30,0x0C,0x30,0x00,0x30,0x00,0x18,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x20,0x20,0x10,0x20,0x08,0x20,0x04,0x30,0xFC,0x1F,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"2",18*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x0E,0x0C,0x0C,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x00,0x18,0x00,0x0C,0x00,0x06,0xC0,0x03,0x00,0x0E,0x00,0x18,0x00,0x10,0x00,0x30,0x00,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x10,0x0C,0x18,0x18,0x0C,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"3",19*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0E,0x00,0x0E,0x00,0x0F,0x80,0x0E,0x80,0x0E,0x40,0x0E,0x60,0x0E,0x20,0x0E,0x10,0x0E,0x10,0x0E,0x08,0x0E,0x04,0x0E,0x04,0x0E,0xFE,0x7F,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0xC0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"4",20*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0xF0,0x3F,0x10,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0xC8,0x07,0x28,0x0C,0x18,0x18,0x08,0x10,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x0C,0x30,0x0C,0x30,0x04,0x18,0x04,0x18,0x08,0x0C,0xF0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"5",21*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0xC0,0x10,0x20,0x30,0x10,0x30,0x18,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x8C,0x0F,0x6C,0x18,0x3C,0x30,0x1C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x18,0x60,0x18,0x20,0x30,0x30,0x60,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"6",22*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0xF8,0x3F,0x1C,0x10,0x0C,0x08,0x04,0x08,0x04,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"7",23*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x30,0x0C,0x18,0x18,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x1C,0x30,0x38,0x18,0x70,0x08,0xE0,0x07,0xB0,0x07,0x18,0x0E,0x0C,0x1C,0x06,0x38,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x0C,0x18,0x18,0x0C,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"8",24*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x04,0x0C,0x08,0x0C,0x18,0x06,0x10,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x38,0x0C,0x3C,0x18,0x36,0xF0,0x31,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x18,0x0C,0x0C,0x0C,0x06,0x0C,0x03,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"9",25*/ -{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,0x80,0x01,0xC0,0x03,0xC0,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0xC0,0x03,0xC0,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/ -{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,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0xC0,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x00,0x00},/*";",27*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x00,0x80,0x01,0x00,0x03,0x00,0x06,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"<",28*/ -{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,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x60,0x00,0xC0,0x00,0x80,0x01,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*">",30*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x30,0x18,0x08,0x30,0x08,0x60,0x0C,0x60,0x1C,0x60,0x1C,0x60,0x1C,0x60,0x00,0x30,0x00,0x1C,0x00,0x06,0x00,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0xC0,0x03,0xC0,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"?",31*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x60,0x18,0x10,0x30,0x18,0x20,0x0C,0x2F,0x8C,0x4D,0x86,0x4C,0xC6,0x4C,0xC6,0x4C,0x66,0x4C,0x66,0x44,0x66,0x44,0x66,0x26,0x66,0x26,0x66,0x15,0xCC,0x1C,0x0C,0x40,0x08,0x20,0x18,0x30,0x30,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"@",32*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x40,0x01,0x60,0x03,0x20,0x03,0x20,0x03,0x20,0x03,0x30,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0xF8,0x0F,0x08,0x0C,0x08,0x0C,0x08,0x0C,0x0C,0x0C,0x04,0x18,0x04,0x18,0x06,0x18,0x1F,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"A",33*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x18,0x1C,0x18,0x38,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x18,0x18,0x0C,0xF8,0x07,0x18,0x18,0x18,0x30,0x18,0x20,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x30,0x18,0x18,0xFE,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"B",34*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x27,0x60,0x38,0x10,0x30,0x18,0x20,0x0C,0x40,0x0C,0x40,0x04,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0C,0x40,0x0C,0x40,0x0C,0x20,0x18,0x30,0x30,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"C",35*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x18,0x0E,0x18,0x18,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x30,0x18,0x30,0x18,0x10,0x18,0x18,0x18,0x0E,0xFE,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"D",36*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x18,0x30,0x18,0x20,0x18,0x60,0x18,0x40,0x18,0x00,0x18,0x08,0x18,0x08,0x18,0x0C,0xF8,0x0F,0x18,0x0C,0x18,0x08,0x18,0x08,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x40,0x18,0x40,0x18,0x20,0x18,0x30,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"E",37*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x18,0x70,0x18,0x40,0x18,0xC0,0x18,0x80,0x18,0x00,0x18,0x10,0x18,0x10,0x18,0x18,0xF8,0x1F,0x18,0x18,0x18,0x10,0x18,0x10,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"F",38*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x13,0x70,0x1C,0x10,0x10,0x18,0x10,0x0C,0x20,0x0C,0x20,0x04,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0xFC,0x06,0x30,0x06,0x30,0x0C,0x30,0x0C,0x30,0x18,0x30,0x18,0x30,0x30,0x08,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"G",39*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x7E,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0xFC,0x1F,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x3F,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"H",40*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"I",41*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x7F,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x0E,0x06,0x0E,0x03,0x8E,0x01,0xFC,0x00},/*"J",42*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x7C,0x18,0x18,0x18,0x08,0x18,0x04,0x18,0x06,0x18,0x02,0x18,0x01,0x98,0x01,0x98,0x01,0xD8,0x01,0xB8,0x03,0x38,0x03,0x18,0x07,0x18,0x06,0x18,0x0E,0x18,0x0C,0x18,0x1C,0x18,0x18,0x18,0x30,0x18,0x30,0x7E,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"K",43*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x40,0x18,0x40,0x18,0x20,0x18,0x30,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"L",44*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x3C,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x36,0x74,0x32,0x64,0x32,0x64,0x32,0x64,0x32,0x64,0x31,0xC4,0x31,0xC4,0x31,0xC4,0x31,0xC4,0x30,0xC4,0x30,0x84,0x30,0x9F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"M",45*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x7C,0x1C,0x10,0x3C,0x10,0x34,0x10,0x34,0x10,0x74,0x10,0x64,0x10,0xE4,0x10,0xC4,0x10,0xC4,0x11,0x84,0x11,0x84,0x13,0x04,0x13,0x04,0x17,0x04,0x16,0x04,0x1E,0x04,0x1C,0x04,0x1C,0x04,0x1C,0x04,0x18,0x1F,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"N",46*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x30,0x0C,0x18,0x18,0x08,0x10,0x0C,0x30,0x0C,0x30,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x0C,0x20,0x0C,0x30,0x08,0x10,0x18,0x18,0x30,0x0C,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"O",47*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x18,0x18,0x18,0x30,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x30,0x18,0x18,0xF8,0x0F,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"P",48*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x30,0x0C,0x18,0x18,0x0C,0x10,0x0C,0x30,0x0C,0x20,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0xE4,0x61,0x2C,0x33,0x1C,0x32,0x18,0x16,0x30,0x0E,0xC0,0x07,0x00,0x4C,0x00,0x7C,0x00,0x38,0x00,0x00,0x00,0x00},/*"Q",49*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x18,0x1C,0x18,0x38,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x18,0x18,0x0C,0xF8,0x07,0x98,0x03,0x18,0x03,0x18,0x07,0x18,0x06,0x18,0x06,0x18,0x0E,0x18,0x0C,0x18,0x0C,0x18,0x1C,0x18,0x18,0x7E,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"R",50*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x27,0x30,0x38,0x18,0x30,0x0C,0x20,0x0C,0x20,0x0C,0x00,0x0C,0x00,0x18,0x00,0x78,0x00,0xE0,0x03,0x80,0x0F,0x00,0x1E,0x00,0x38,0x00,0x70,0x00,0x60,0x04,0x60,0x04,0x60,0x08,0x60,0x18,0x30,0x38,0x18,0xC8,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"S",51*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x3F,0x8C,0x21,0x84,0x61,0x82,0x41,0x82,0x41,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"T",52*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x7C,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x08,0x08,0x38,0x04,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"U",53*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0xF8,0x18,0x20,0x18,0x20,0x18,0x20,0x30,0x10,0x30,0x10,0x30,0x10,0x30,0x10,0x60,0x08,0x60,0x08,0x60,0x08,0xE0,0x0C,0xC0,0x04,0xC0,0x04,0xC0,0x04,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"V",54*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0xF3,0x86,0x61,0x86,0x21,0x86,0x21,0x8C,0x21,0x0C,0x21,0x8C,0x23,0x8C,0x13,0x8C,0x13,0x8C,0x13,0x4C,0x13,0x58,0x12,0x58,0x16,0x58,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x30,0x0C,0x10,0x04,0x10,0x04,0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"W",55*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x3E,0x18,0x08,0x38,0x08,0x30,0x04,0x30,0x04,0x70,0x02,0x60,0x02,0xE0,0x01,0xC0,0x01,0xC0,0x01,0x80,0x01,0x80,0x03,0x40,0x03,0x40,0x07,0x20,0x06,0x20,0x06,0x10,0x0C,0x10,0x0C,0x08,0x18,0x08,0x18,0x3E,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"X",56*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x7C,0x1C,0x10,0x18,0x10,0x18,0x08,0x30,0x08,0x30,0x0C,0x70,0x04,0x60,0x04,0x60,0x02,0xC0,0x02,0xC0,0x02,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"Y",57*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x18,0x18,0x08,0x18,0x04,0x0C,0x04,0x0E,0x00,0x06,0x00,0x07,0x00,0x03,0x80,0x03,0x80,0x01,0xC0,0x01,0xC0,0x00,0xE0,0x00,0x60,0x00,0x70,0x00,0x30,0x00,0x38,0x20,0x18,0x20,0x1C,0x10,0x0C,0x18,0xFE,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"Z",58*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0xC0,0x3F,0x00,0x00,0x00,0x00},/*"[",59*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x18,0x00,0x18,0x00,0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0x60,0x00,0x40,0x00,0xC0,0x00,0x80,0x00,0x80,0x01,0x80,0x01,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x04,0x00,0x0C,0x00,0x08,0x00,0x18,0x00,0x18,0x00,0x10,0x00,0x30,0x00,0x20,0x00,0x00},/*"\",60*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0xFC,0x03,0x00,0x00,0x00,0x00},/*"]",61*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0xC0,0x06,0x20,0x08,0x10,0x10,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ -{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,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,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF},/*"_",63*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0xC0,0x00,0x00,0x01,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ -{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,0xF0,0x03,0x18,0x06,0x0C,0x0C,0x0C,0x0C,0x00,0x0C,0x80,0x0F,0x70,0x0C,0x1C,0x0C,0x0C,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x4C,0x0C,0x4F,0xF8,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"a",65*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x0F,0xD8,0x18,0x38,0x30,0x38,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x20,0x38,0x30,0x78,0x18,0xC8,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"b",66*/ -{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,0xC0,0x07,0x70,0x0C,0x18,0x18,0x18,0x18,0x0C,0x18,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x20,0x18,0x20,0x18,0x10,0x30,0x08,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"c",67*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0xE0,0x1B,0x30,0x1C,0x18,0x18,0x18,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x08,0x18,0x18,0x1C,0x30,0x7A,0xE0,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"d",68*/ -{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,0xC0,0x07,0x30,0x0C,0x18,0x18,0x08,0x10,0x0C,0x30,0x0C,0x30,0xFC,0x3F,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x20,0x18,0x10,0x70,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"e",69*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x80,0xC3,0x80,0xC0,0xC0,0xC0,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xFC,0x1F,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xF8,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"f",70*/ -{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,0xC0,0x77,0x30,0x6C,0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x10,0x18,0x30,0x0C,0xF0,0x07,0x18,0x00,0x18,0x00,0xF0,0x0F,0xF0,0x3F,0x08,0x70,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x38,0x38,0xE0,0x0F},/*"g",71*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x98,0x0F,0xD8,0x18,0x38,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x7E,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"h",72*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"i",73*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x80,0x1F,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x18,0x0C,0x18,0x06,0xF0,0x03},/*"j",74*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x3E,0x18,0x0C,0x18,0x06,0x18,0x03,0x18,0x01,0x98,0x01,0xD8,0x01,0x38,0x03,0x18,0x07,0x18,0x06,0x18,0x0C,0x18,0x1C,0x18,0x18,0x7E,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"k",75*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"l",76*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0xEE,0x1C,0x9C,0x33,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0xDE,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"m",77*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x0F,0xD8,0x18,0x38,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x7E,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"n",78*/ -{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,0xC0,0x07,0x70,0x1C,0x10,0x30,0x18,0x30,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x18,0x30,0x18,0x30,0x30,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"o",79*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x9E,0x0F,0x58,0x18,0x38,0x30,0x18,0x20,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x30,0x38,0x30,0x78,0x18,0x98,0x07,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00},/*"p",80*/ -{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,0xC0,0x23,0x30,0x3C,0x18,0x38,0x18,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x08,0x30,0x18,0x38,0x30,0x3C,0xE0,0x33,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0xFC},/*"q",81*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x7E,0x3C,0x60,0x66,0x60,0x61,0xE0,0x00,0xE0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"r",82*/ -{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,0xE0,0x27,0x30,0x38,0x18,0x30,0x18,0x20,0x18,0x00,0x70,0x00,0xE0,0x03,0x80,0x0F,0x00,0x1C,0x04,0x30,0x04,0x30,0x0C,0x30,0x1C,0x18,0xEC,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"s",83*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xC0,0x00,0xE0,0x00,0xFC,0x1F,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x20,0xC0,0x20,0x80,0x11,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"t",84*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x1E,0x3C,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x38,0x30,0xF4,0xE0,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"u",85*/ -{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,0x7E,0x3C,0x18,0x18,0x18,0x08,0x38,0x08,0x30,0x04,0x30,0x04,0x70,0x02,0x60,0x02,0x60,0x02,0xE0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"v",86*/ -{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,0xDF,0xF7,0x8E,0x63,0x0C,0x23,0x8C,0x23,0x8C,0x23,0x98,0x13,0x98,0x13,0x58,0x16,0x58,0x16,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x20,0x04,0x20,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"w",87*/ -{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,0xFC,0x3E,0x70,0x08,0x70,0x04,0xE0,0x04,0xC0,0x02,0xC0,0x01,0x80,0x03,0x80,0x03,0x40,0x07,0x60,0x06,0x20,0x0C,0x10,0x0C,0x18,0x18,0x3E,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"x",88*/ -{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,0x7E,0x7C,0x18,0x18,0x18,0x08,0x30,0x08,0x30,0x08,0x30,0x04,0x60,0x04,0x60,0x04,0xC0,0x02,0xC0,0x02,0xC0,0x02,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x4C,0x00,0x3C,0x00},/*"y",89*/ -{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,0xFC,0x1F,0x0C,0x0C,0x04,0x0E,0x04,0x06,0x00,0x03,0x80,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x20,0x30,0x20,0x38,0x30,0x1C,0x18,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"z",90*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x00},/*"{",91*/ -{0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01},/*"|",92*/ -{0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x0C,0x00,0x00,0x00},/*"}",93*/ -{0x00,0x00,0x38,0x00,0xC4,0x00,0x86,0x40,0x02,0x61,0x00,0x22,0x00,0x1C,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ -}; - -typedef struct -{ - unsigned char Index[2]; - unsigned char Msk[24]; -}typFNT_GB12; - - -const typFNT_GB12 tfont12[]={ -"",0x20,0x00,0x20,0x00,0x20,0x00,0xFE,0x03,0x22,0x02,0x22,0x02,0x22,0x02,0xFE,0x03, -0x22,0x02,0x20,0x00,0x20,0x00,0x20,0x00,/*"",0*/ -"",0xFC,0x01,0x04,0x01,0xFC,0x01,0x04,0x01,0xFC,0x01,0x20,0x00,0xFF,0x07,0x04,0x01, -0xFC,0x01,0x20,0x00,0x24,0x01,0x32,0x02,/*"",1*/ -"԰",0xFE,0x07,0x02,0x04,0xFA,0x04,0x02,0x04,0x02,0x04,0xFE,0x05,0x52,0x04,0x52,0x04, -0x4A,0x05,0x86,0x05,0x02,0x04,0xFE,0x07,/*"԰",2*/ -"",0x10,0x00,0x10,0x00,0xFF,0x01,0x11,0x01,0x11,0x01,0xFF,0x01,0x11,0x01,0x11,0x01, -0xFF,0x01,0x11,0x04,0x10,0x04,0xE0,0x07,/*"",3*/ -"",0x00,0x00,0xFC,0x01,0x80,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0xFF,0x07,0x20,0x00, -0x20,0x00,0x20,0x00,0x20,0x00,0x38,0x00,/*"",4*/ - -}; - -typedef struct -{ - unsigned char Index[2]; - unsigned char Msk[32]; -}typFNT_GB16; - - -const typFNT_GB16 tfont16[]={ - -"",0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10, -0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x10,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,/*"",0*/ -"",0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x80,0x00,0xFF,0x7F,0x00,0x00, -0xF8,0x0F,0x08,0x08,0x08,0x08,0xF8,0x0F,0x80,0x00,0x84,0x10,0xA2,0x20,0x40,0x00,/*"",1*/ -"԰",0x00,0x00,0xFE,0x3F,0x02,0x20,0xF2,0x27,0x02,0x20,0x02,0x20,0xFA,0x2F,0x22,0x21, -0x22,0x21,0x22,0x21,0x12,0x29,0x12,0x29,0x0A,0x2E,0x02,0x20,0xFE,0x3F,0x02,0x20,/*"԰",2*/ -"",0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,0xFC,0x1F, -0x84,0x10,0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x50,0x80,0x40,0x80,0x40,0x00,0x7F,/*"",3*/ -"",0x00,0x00,0xFE,0x1F,0x00,0x08,0x00,0x04,0x00,0x02,0x80,0x01,0x80,0x00,0xFF,0x7F, -0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,/*"",4*/ -}; - - -typedef struct -{ - unsigned char Index[2]; - unsigned char Msk[72]; -}typFNT_GB24; - - -const typFNT_GB24 tfont24[]={ - -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00, -0x08,0x00,0x08,0x08,0x18,0xF8,0xFF,0x1F,0x18,0x08,0x18,0x18,0x08,0x18,0x18,0x08, -0x18,0x18,0x08,0x18,0x18,0x08,0x18,0x18,0x08,0x18,0xF8,0xFF,0x1F,0x08,0x08,0x08, -0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x18,0x00,0x00, -0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,/*"",0*/ - -"",0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x06,0xC0,0xFF,0x07,0x40,0x00,0x06,0xC0, -0xFF,0x07,0x40,0x00,0x06,0xC0,0xFF,0x07,0x40,0x08,0x02,0x00,0x30,0x00,0xFE,0xFF, -0x3F,0x00,0x00,0x00,0xC0,0xFF,0x07,0xC0,0x00,0x02,0xC0,0x00,0x02,0xC0,0x00,0x02, -0xC0,0xFF,0x03,0x80,0x10,0x00,0x80,0x11,0x01,0x60,0x10,0x0E,0x30,0x10,0x18,0x0C, -0x1E,0x30,0x00,0x1C,0x00,0x00,0x00,0x00,/*"",1*/ - -"԰",0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x30,0xF8,0xFF,0x1F,0x08,0x00,0x10,0x08, -0xC0,0x10,0x08,0x3F,0x10,0x08,0x00,0x10,0x08,0x00,0x10,0x08,0x00,0x13,0xC8,0xFF, -0x10,0x08,0x22,0x10,0x08,0x22,0x10,0x08,0x22,0x10,0x08,0x22,0x10,0x08,0x21,0x12, -0x08,0x21,0x14,0x88,0x60,0x16,0x48,0xC0,0x13,0x28,0x00,0x10,0x08,0x00,0x10,0xF8, -0xFF,0x1F,0x08,0x00,0x10,0x00,0x00,0x00,/*"԰",2*/ - -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00, -0x08,0x00,0xF0,0xFF,0x0F,0x10,0x08,0x04,0x10,0x08,0x04,0x10,0x08,0x04,0x10,0x08, -0x04,0xF0,0xFF,0x07,0x10,0x08,0x04,0x10,0x08,0x04,0x10,0x08,0x04,0x10,0x08,0x04, -0xF0,0xFF,0x07,0x10,0x08,0x00,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x20,0x00, -0x18,0x30,0x00,0xF0,0x1F,0x00,0x00,0x00,/*"",3*/ - -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xF0,0xFF,0x0F,0x00,0x00,0x06,0x00, -0x00,0x01,0x00,0xC0,0x00,0x00,0x28,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18, -0x30,0xFE,0xFF,0x7F,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00, -0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00, -0x1F,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,/*"",4*/ - -}; - - -typedef struct -{ - unsigned char Index[2]; - unsigned char Msk[128]; -}typFNT_GB32; - - -const typFNT_GB32 tfont32[]={ - -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x01,0x00, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00, -0x10,0x80,0x01,0x0C,0xF0,0xFF,0xFF,0x0F,0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04, -0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04, -0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04,0xF0,0xFF,0xFF,0x07,0x30,0x80,0x01,0x04, -0x30,0x80,0x01,0x04,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,/*"",0*/ -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01, -0x00,0xFF,0xFF,0x01,0x00,0x03,0x80,0x01,0x00,0x03,0x80,0x01,0x00,0xFF,0xFF,0x01, -0x00,0x03,0x80,0x01,0x00,0x03,0x80,0x01,0x00,0xFF,0xFF,0x01,0x00,0x81,0x81,0x00, -0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x1C,0xFC,0xFF,0xFF,0x3F,0x00,0x00,0x40,0x00, -0x00,0x03,0xC0,0x01,0x00,0xFF,0xFF,0x01,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, -0x00,0x03,0xC0,0x00,0x00,0xFF,0xFF,0x00,0x00,0x01,0x41,0x00,0x00,0x04,0x01,0x00, -0x00,0x0E,0x71,0x00,0x00,0x07,0x81,0x01,0x80,0x01,0x01,0x07,0x60,0x00,0x01,0x0E, -0x18,0x98,0x01,0x1C,0x04,0xE0,0x01,0x18,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,/*"",1*/ -"԰",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xF0,0xFF,0xFF,0x1F, -0x30,0x00,0x00,0x0C,0x30,0x00,0x00,0x0C,0x30,0x00,0x10,0x0C,0x30,0xFE,0x3F,0x0C, -0x30,0x04,0x00,0x0C,0x30,0x00,0x00,0x0C,0x30,0x00,0x00,0x0C,0x30,0x00,0x00,0x0C, -0x30,0x00,0xC0,0x0C,0xF0,0xFF,0xFF,0x0D,0x30,0x30,0x06,0x0E,0x30,0x30,0x06,0x0C, -0x30,0x10,0x06,0x0C,0x30,0x10,0x06,0x0C,0x30,0x10,0x06,0x0C,0x30,0x18,0x86,0x0C, -0x30,0x18,0x86,0x0C,0x30,0x08,0x06,0x0D,0x30,0x0C,0x86,0x0D,0x30,0x06,0xEE,0x0F, -0x30,0x02,0xFC,0x0D,0x30,0x01,0x00,0x0C,0xF0,0x00,0x00,0x0C,0x30,0x00,0x00,0x0C, -0xF0,0xFF,0xFF,0x0F,0x30,0x00,0x00,0x0C,0x10,0x00,0x00,0x04,0x00,0x00,0x00,0x00,/*"԰",2*/ -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x01,0x00, -0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00, -0xE0,0xFF,0xFF,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03, -0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0xE0,0xFF,0xFF,0x03, -0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03, -0x60,0xC0,0x00,0x03,0xE0,0xFF,0xFF,0x03,0x60,0xC0,0x00,0x01,0x60,0xC0,0x00,0x00, -0x00,0xC0,0x00,0x08,0x00,0xC0,0x00,0x10,0x00,0xC0,0x00,0x10,0x00,0xC0,0x00,0x18, -0x00,0xC0,0x01,0x38,0x00,0x80,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"",3*/ -"",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, -0xC0,0xFF,0xFF,0x07,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0x00, -0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x03,0x00, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x08,0x00,0x80,0x01,0x1C,0xFC,0xFF,0xFF,0x3F, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00, -0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00, -0x00,0xFC,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,/*"",4*/ -}; - -#endif - - diff --git a/software/bootloader/BSP/LCD/pic.h b/software/bootloader/BSP/LCD/pic.h deleted file mode 100644 index 48d492c..0000000 --- a/software/bootloader/BSP/LCD/pic.h +++ /dev/null @@ -1,209 +0,0 @@ -#ifndef __PIC_H -#define __PIC_H - -const unsigned char gImage_1[3200] = { /* 0X10,0X10,0X00,0X28,0X00,0X28,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,0XF7,0XBE, -0XFF,0XFF,0XFF,0XDE,0XC6,0X38,0X8C,0X92,0X6B,0X8E,0X6B,0X6E,0X7C,0X10,0XAD,0X96, -0XE7,0X3C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0X5D, -0X9D,0X15,0X63,0X4F,0X42,0X6C,0X32,0X0A,0X29,0X88,0X19,0X46,0X19,0X25,0X21,0X45, -0X31,0XE8,0X6B,0X8E,0XC6,0X38,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XA5,0X36,0X53,0X10, -0X4B,0X10,0X53,0X51,0X4B,0X0F,0X3A,0X6C,0X31,0XE9,0X21,0X67,0X19,0X25,0X10,0XE4, -0X08,0XA3,0X00,0X62,0X08,0X83,0X52,0XCB,0XD6,0X9A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X3C,0X63,0X70,0X63,0XB3,0X7C,0XB8, -0X63,0XF5,0X43,0X11,0X32,0X4D,0X29,0XEA,0X21,0X88,0X19,0X26,0X19,0X05,0X19,0X05, -0X11,0X04,0X11,0X04,0X10,0XE4,0X00,0X83,0X08,0XA3,0X8C,0X72,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDE,0XDB,0X3A,0X4B,0X42,0XF0,0X6C,0X35,0X4B,0X54, -0X32,0XB1,0X2A,0X2E,0X21,0XEB,0X21,0XA9,0X19,0X67,0X19,0X05,0X11,0X04,0X11,0X04, -0X11,0X04,0X11,0X04,0X11,0X04,0X19,0X05,0X10,0XE4,0X00,0X42,0X73,0XAF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XEF,0X5D,0X32,0X09,0X32,0X4C,0X4B,0X10,0X32,0X8F,0X2A,0X4F, -0X2A,0X2E,0X19,0XCC,0X19,0X89,0X21,0X89,0X19,0X47,0X19,0X05,0X11,0X04,0X11,0X04, -0X10,0XC4,0X10,0XC4,0X11,0X04,0X11,0X04,0X11,0X04,0X10,0XE4,0X00,0X42,0X84,0X31, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0X52,0XEC,0X19,0X47,0X32,0X4C,0X2A,0X0B,0X21,0XEC,0X21,0XEC, -0X22,0X0C,0X5B,0X91,0X4A,0XEE,0X11,0X06,0X19,0X26,0X19,0X04,0X10,0XE4,0X10,0XE4, -0X29,0XA7,0X21,0X66,0X08,0XA3,0X19,0X05,0X11,0X04,0X11,0X04,0X10,0XE4,0X00,0X82, -0XBD,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,0XA5,0X35,0X08,0X83,0X21,0X88,0X21,0X88,0X21,0X89,0X21,0XAA,0X21,0X8A, -0X42,0X6B,0X8C,0X71,0XFF,0XFF,0X8C,0X72,0X08,0X83,0X11,0X04,0X08,0XC4,0X42,0X29, -0XDE,0XFB,0XEF,0X5D,0X5A,0XEC,0X08,0X83,0X11,0X04,0X11,0X04,0X11,0X04,0X08,0X83, -0X31,0XE8,0XFF,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, -0XF7,0XBE,0X31,0XC7,0X10,0XC4,0X19,0X25,0X19,0X26,0X19,0X47,0X19,0X47,0X29,0XA8, -0X52,0X8A,0X4A,0X28,0XAD,0X55,0XFF,0XFF,0X31,0XE8,0X08,0XA3,0X19,0X05,0X6B,0X4D, -0X6B,0X4D,0XFF,0XFF,0XEF,0X7D,0X21,0X45,0X10,0XC4,0X11,0X04,0X11,0X04,0X11,0X04, -0X00,0X62,0XAD,0X76,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XB5,0X96,0X00,0X62,0X11,0X04,0X19,0X04,0X11,0X05,0X19,0X05,0X08,0XC4,0X4A,0X8B, -0XB5,0XB6,0XEF,0X5D,0XBD,0XF7,0XFF,0XFF,0X6B,0X8E,0X00,0X62,0X42,0X29,0X5A,0XAA, -0X42,0X08,0XFF,0XFF,0XFF,0XFF,0X52,0XCC,0X08,0X83,0X11,0X04,0X11,0X04,0X11,0X04, -0X08,0XA3,0X52,0XAD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X1C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X63,0X4E,0X00,0X62,0X11,0X04,0X11,0X04,0X11,0X04,0X10,0XE4,0X00,0X62,0X63,0X8E, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X73,0XCF,0X00,0X01,0X9C,0XF3,0X63,0X2C, -0XB5,0X96,0XFF,0XFF,0XFF,0XFF,0X5B,0X2D,0X00,0X83,0X11,0X04,0X11,0X04,0X11,0X04, -0X10,0XE4,0X21,0X67,0XEF,0X3D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XBD,0XF8,0XB5,0XB7,0XEF,0X9E,0X52,0XCB,0X94,0XB3,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF, -0X31,0XE8,0X08,0XA3,0X11,0X04,0X11,0X04,0X11,0X04,0X11,0X04,0X08,0XA3,0X42,0X49, -0XF7,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0X4A,0X6A,0X00,0X01,0X84,0X72,0XFF,0XFF, -0XFF,0XFF,0XF7,0XFF,0XEF,0XDF,0X3A,0X09,0X08,0XA3,0X11,0X04,0X11,0X04,0X11,0X04, -0X11,0X04,0X11,0X05,0XBE,0X18,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X7B,0XF0,0X00,0X62,0X31,0XE8,0X31,0XC7,0X00,0X41,0XA5,0X35,0XFF,0XFF,0XEF,0X5D, -0X21,0X46,0X10,0XC4,0X11,0X04,0X11,0X04,0X11,0X04,0X11,0X04,0X10,0XE4,0X08,0XA3, -0X9D,0X76,0XF7,0XFF,0XFF,0XFF,0XAD,0XB7,0X08,0XA3,0X08,0XA3,0X31,0XC7,0XE7,0X9E, -0XF7,0XFF,0XF7,0XFF,0XA5,0X76,0X08,0XA3,0X10,0XE4,0X11,0X04,0X11,0X04,0X11,0X04, -0X11,0X05,0X11,0X05,0XA5,0X35,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XDE,0XDB,0X29,0XA7,0X00,0X83,0X10,0XC4,0X10,0XC4,0X10,0XC4,0XE7,0X1C,0XEF,0X9E, -0X11,0X05,0X10,0XE4,0X11,0X04,0X11,0X04,0X11,0X04,0X11,0X04,0X19,0X04,0X08,0XC4, -0X10,0XE5,0X6B,0XD1,0X6B,0XD1,0X08,0XC5,0X00,0X64,0X08,0XA5,0X00,0X43,0X32,0X2B, -0X9D,0X77,0X84,0XB3,0X19,0X25,0X10,0XC4,0X11,0X04,0X11,0X04,0X11,0X04,0X11,0X04, -0X19,0X25,0X09,0X26,0X9D,0X35,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X73,0XAF,0X00,0X62,0X19,0X04,0X19,0X05,0X00,0X82,0X5B,0X0D,0X9B,0X8E, -0X10,0X62,0X11,0X05,0X11,0X04,0X11,0X04,0X19,0X04,0X10,0XE4,0X00,0X85,0X11,0X05, -0X39,0XC4,0X5A,0X81,0X7B,0X40,0X9C,0X22,0XAC,0X43,0XA4,0X03,0X9B,0X83,0X72,0X82, -0X49,0X82,0X18,0XC2,0X00,0XA4,0X00,0XC5,0X10,0XE4,0X19,0X04,0X11,0X04,0X19,0X05, -0X19,0X47,0X11,0X67,0X5A,0XEC,0XFF,0XBE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XDF,0XDE,0XDB,0X10,0XC4,0X10,0XE4,0X11,0X04,0X11,0X05,0X18,0XA4,0XC0,0X01, -0X88,0X83,0X00,0XE4,0X19,0X05,0X19,0X04,0X08,0XC5,0X21,0X44,0X83,0X43,0XD5,0X23, -0XFE,0X42,0XFE,0XE4,0XFF,0X27,0XFF,0X07,0XFE,0XA4,0XFE,0X64,0XFE,0X03,0XFD,0XA3, -0XFC,0XE2,0XEC,0X42,0XB3,0X83,0X62,0X24,0X10,0XE5,0X08,0XC4,0X19,0X04,0X19,0X26, -0X19,0XA8,0X21,0X87,0X90,0X00,0XBC,0XD3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XDF,0XFF,0XFF,0X7C,0X10,0X00,0X42,0X19,0X05,0X11,0X05,0X28,0X83,0XD0,0X01, -0XF8,0X44,0X48,0XA3,0X00,0XE4,0X08,0XC5,0X5A,0X44,0XED,0X02,0XFD,0XE2,0XFE,0X02, -0XFE,0X66,0XFF,0X74,0XFF,0XB8,0XFF,0X73,0XF6,0XE7,0XF6,0XA6,0XF6,0X45,0XF5,0XA4, -0XFC,0XC3,0XFC,0X62,0XFC,0XC2,0XFC,0XC2,0XCB,0XE3,0X49,0XC4,0X11,0X06,0X19,0X88, -0X01,0X87,0X90,0XA4,0XF8,0X01,0X9A,0XEC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XF7,0XBE,0X31,0XE8,0X00,0X83,0X09,0X05,0X40,0X82,0XC0,0X01, -0XF8,0X23,0XF0,0X85,0X48,0XA3,0X00,0XA4,0X5A,0X44,0XFD,0X02,0XCC,0X23,0XDC,0XC2, -0XFE,0X04,0XFE,0X28,0XF6,0X48,0XF6,0X46,0XF6,0X24,0XF5,0XE4,0XFD,0X64,0XFC,0XE3, -0XFC,0X62,0XFC,0XC2,0XE4,0X02,0XDC,0X02,0XFC,0XE2,0X7A,0XA4,0X01,0X48,0X01,0X67, -0X78,0XC4,0XF8,0X24,0XF8,0X02,0XB0,0X84,0XE7,0X7D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDE,0XDB,0X19,0X25,0X00,0XA3,0X38,0XC4,0XE0,0X02, -0XD8,0X22,0XF8,0X44,0XF8,0XA6,0X78,0XA4,0X00,0X63,0X21,0X43,0X72,0X83,0X39,0X83, -0X9B,0X82,0XF5,0X21,0XFD,0X61,0XFD,0X22,0XFC,0XE2,0XFC,0XA2,0XFC,0X42,0XFC,0X42, -0XFC,0X42,0XAB,0X22,0X41,0X83,0X92,0XC3,0X52,0X04,0X01,0X26,0X19,0X25,0X98,0XA4, -0XF8,0X44,0XF8,0X23,0XF8,0X02,0XD0,0XA4,0XEF,0X9E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XD6,0X9A,0X29,0X87,0X00,0XA5,0XB8,0X43, -0XF8,0X22,0XE0,0X23,0XF8,0X65,0XF8,0XE8,0XC9,0X07,0X48,0X83,0X00,0X42,0X00,0XA3, -0X00,0X84,0X29,0X63,0X7A,0XA2,0XB3,0X62,0XCB,0XA2,0XD3,0X62,0XBB,0X02,0X8A,0X82, -0X39,0X83,0X00,0XA4,0X00,0XE5,0X00,0XE5,0X08,0XE5,0X60,0XC4,0XD8,0X64,0XF8,0X44, -0XF8,0X24,0XF8,0X23,0XF8,0X02,0X88,0X83,0XC6,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X3D,0X5B,0X50,0X31,0X08, -0XE8,0X23,0XF8,0X43,0XF0,0X44,0XF8,0X65,0XF9,0X09,0XF9,0XAB,0XD1,0X89,0X89,0X06, -0X48,0XA3,0X18,0X42,0X00,0X02,0X00,0X42,0X00,0X61,0X00,0X82,0X00,0X62,0X00,0X62, -0X00,0X83,0X20,0XA3,0X50,0XC4,0X88,0XA5,0XD8,0X85,0XF8,0X65,0XF8,0X44,0XF8,0X44, -0XF8,0X23,0XF8,0X23,0XD0,0X03,0X10,0X82,0X29,0XC7,0XEF,0X5D,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X32,0X6C, -0X38,0XA5,0XD8,0X02,0XF8,0X23,0XF8,0X65,0XF8,0X66,0XF8,0XA7,0XF9,0X4A,0XFA,0X0C, -0XFA,0X4D,0XEA,0X4C,0XD2,0X0B,0XB9,0XA9,0XB1,0X68,0XA9,0X47,0XB1,0X27,0XB9,0X07, -0XD1,0X07,0XE8,0XE7,0XF8,0XC7,0XF8,0XA7,0XF8,0X65,0XF8,0X65,0XF8,0X44,0XF8,0X23, -0XF8,0X03,0XD0,0X02,0X28,0XA3,0X09,0X05,0X08,0XC4,0X5A,0XEC,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDE,0XFB,0X19,0X05, -0X00,0XC4,0X41,0XA7,0XC0,0XE6,0XF8,0X03,0XF8,0X86,0XF8,0XA7,0XF8,0X87,0XF8,0X86, -0XF8,0XC7,0XF9,0X29,0XF9,0X8A,0XF9,0XAB,0XF9,0XAB,0XF9,0X8B,0XF9,0X6A,0XF9,0X29, -0XF9,0X08,0XF8,0XC7,0XF8,0XA6,0XF8,0X86,0XF8,0X65,0XF8,0X64,0XF8,0X23,0XF0,0X02, -0XB1,0X06,0X29,0X25,0X00,0XE4,0X10,0XE4,0X19,0X25,0X19,0X25,0X9D,0X14,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XAD,0X96,0X00,0X62, -0X08,0X82,0X95,0X35,0XCE,0XBA,0XA2,0X8B,0XD0,0X44,0XF8,0X25,0XF8,0X87,0XF8,0XA7, -0XF8,0XC7,0XF8,0XA7,0XF8,0X87,0XF8,0X86,0XF8,0X86,0XF8,0X86,0XF8,0X87,0XF8,0XA7, -0XF8,0XA7,0XF8,0XA6,0XF8,0X85,0XF8,0X65,0XF8,0X64,0XF0,0X24,0XB8,0X64,0X93,0X0D, -0XB6,0XBB,0X63,0XCF,0X08,0X83,0X11,0X04,0X10,0XE4,0X21,0X66,0X3A,0X49,0XEF,0X5D, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X94,0XD3,0X00,0X42, -0X10,0XE4,0XCE,0XBB,0XFF,0XFF,0XE7,0XBE,0XB5,0X76,0XAA,0XCC,0XC1,0X07,0XE0,0X45, -0XF8,0X45,0XF8,0X46,0XF8,0X66,0XF8,0X86,0XF8,0X86,0XF8,0X86,0XF8,0X86,0XF8,0X65, -0XF8,0X45,0XF8,0X65,0XE8,0X65,0XD0,0X44,0XA8,0X43,0X88,0X01,0X90,0X82,0XD7,0X3C, -0XEF,0XFF,0X95,0X55,0X08,0X83,0X11,0X04,0X11,0X04,0X19,0X05,0X19,0X46,0X94,0XB3, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X94,0XB3,0X00,0X41, -0X21,0X86,0XDF,0X5D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0XDF,0XC6,0X7A,0XB4,0XD3, -0XB3,0X4E,0XC2,0X2A,0XD1,0X68,0XE0,0XE6,0XE8,0XA6,0XE8,0XA5,0XE8,0XA5,0XD8,0XE6, -0XC9,0X88,0XA9,0X06,0XA8,0X22,0XA8,0X02,0XA0,0X00,0XC8,0X00,0XD8,0X00,0XE5,0XF7, -0XE7,0XFF,0XAD,0XF8,0X10,0XC4,0X10,0XE4,0X11,0X04,0X10,0XE4,0X11,0X05,0X4A,0X8B, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XA5,0X55,0X00,0X41, -0X29,0XA7,0XDF,0X5D,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XEF,0XFF,0XDF,0X7D,0XCE,0XDB,0XCE,0X59,0XCD,0XF8,0XCD,0XD7,0XC5,0XF7,0XCE,0X79, -0XBE,0XFB,0XA2,0XAB,0XF0,0X03,0XF8,0X45,0XD0,0X42,0XE8,0X43,0XF0,0X00,0XD4,0X72, -0XDF,0XFF,0XAE,0X39,0X10,0XE4,0X10,0XE4,0X11,0X04,0X10,0XE4,0X11,0X05,0X29,0X87, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCE,0X59,0X08,0X83, -0X21,0X46,0XD7,0X1C,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, -0XEF,0XFF,0XBA,0X8B,0XF8,0X04,0XF8,0X45,0XE0,0X62,0XF0,0X44,0XF8,0X00,0XDB,0X8E, -0XDF,0XFF,0XA5,0XF8,0X10,0XC4,0X10,0XE4,0X10,0XE4,0X11,0X04,0X10,0XE4,0X19,0X25, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBE,0X29,0X87, -0X08,0X83,0XB6,0X39,0XF7,0XFF,0XF7,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, -0XE7,0XBE,0XBA,0X4A,0XF8,0X03,0XF8,0X45,0XF8,0X64,0XF8,0X44,0XF8,0X00,0XE3,0X6E, -0XD7,0XFF,0X8C,0XF4,0X08,0X83,0X11,0X04,0X10,0XE4,0X10,0XE4,0X10,0XE4,0X19,0X05, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X73,0XEF, -0X00,0X00,0X84,0X72,0XEF,0XFF,0XEF,0XBE,0XFF,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XE7,0XDF,0XBA,0X8B,0XF8,0X03,0XF8,0X45,0XF8,0X45,0XF8,0X23,0XF8,0X00,0XD4,0XD3, -0XD7,0XFF,0X5B,0X4E,0X00,0X21,0X3A,0X29,0XA5,0X55,0X08,0X83,0X10,0XC4,0X19,0X25, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDE,0XFB, -0X08,0XA3,0X31,0XE8,0XDF,0X9E,0XE7,0X9E,0XEF,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XF7,0XFF,0XBC,0X51,0XE0,0X02,0XF8,0X03,0XF0,0X03,0XE0,0X43,0XC2,0XEC,0XCF,0X7E, -0XBE,0XFC,0X21,0X46,0X00,0X21,0X94,0XD3,0XFF,0XFF,0X84,0X51,0X00,0X00,0X29,0X87, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X84,0X51,0X00,0X00,0X8C,0XF4,0XEF,0XFF,0XE7,0X9E,0XEF,0XBF,0XFF,0XDF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XDF,0X3D,0XBD,0X55,0XBC,0X52,0XBC,0X72,0XB5,0XB7,0XC7,0X5D,0XDF,0XFF, -0X6B,0XF0,0X00,0X00,0X3A,0X09,0XF7,0XBF,0XFF,0XFF,0XFF,0XFF,0X9D,0X14,0XA5,0X55, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X4A,0XAC,0X08,0XA4,0XBE,0XBB,0XE7,0XDF,0XE7,0X7E,0XEF,0XBE,0XF7,0XDF, -0XFF,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XDF,0XF7,0XDF,0XEF,0XFF,0XDF,0XDF,0XD7,0XBF,0XD7,0X9E,0XDF,0XDF,0XA5,0XD8, -0X08,0X83,0X11,0X26,0XD6,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XEE,0X79,0XDC,0X8B,0X31,0X21,0X21,0XA9,0XCF,0X3D,0XDF,0XBF,0XDF,0X7E,0XE7,0X9E, -0XEF,0XBE,0XEF,0XBF,0XF7,0XDF,0XF7,0XDF,0XF7,0XDF,0XF7,0XDF,0XF7,0XDF,0XEF,0XBF, -0XEF,0XBE,0XE7,0X9E,0XDF,0X7E,0XD7,0X5E,0XD7,0X5E,0XDF,0XDF,0XB6,0X9A,0X19,0X26, -0X08,0X42,0XA3,0XED,0XFF,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,0XDD,0X74, -0XDB,0XC0,0XFE,0X00,0XEE,0X42,0X42,0X02,0X21,0X89,0XB6,0X7B,0XDF,0XDF,0XD7,0X7E, -0XDF,0X7E,0XDF,0X7E,0XE7,0X9E,0XE7,0X9E,0XE7,0X9E,0XE7,0X9E,0XE7,0X9E,0XDF,0X7E, -0XDF,0X7E,0XD7,0X5D,0XD7,0X5D,0XDF,0X9E,0XE7,0XFF,0XA5,0XF8,0X11,0X07,0X18,0XE3, -0XC5,0X02,0XFD,0X60,0XD3,0XE6,0XEE,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0X9E,0XBA,0X84, -0XFC,0XC1,0XFE,0X42,0XFE,0X82,0XFE,0XA2,0X83,0X81,0X21,0X45,0X74,0X74,0XC7,0X5E, -0XDF,0XDF,0XD7,0X7E,0XD7,0X5E,0XD7,0X5D,0XD7,0X5E,0XD7,0X5E,0XD7,0X5D,0XD7,0X5D, -0XD7,0X5E,0XDF,0X9E,0XE7,0XFF,0XC7,0X3D,0X63,0XF1,0X08,0X84,0X52,0X42,0XE6,0X26, -0XFF,0X29,0XFE,0X86,0XF3,0XE0,0XC3,0X6A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDE,0X18,0XD2,0XC1, -0XFD,0XA2,0XFE,0X22,0XFE,0X42,0XFE,0X42,0XFE,0X62,0XD4,0XE2,0X6A,0X41,0X42,0X49, -0X74,0X53,0XA6,0X3B,0XC7,0X3E,0XD7,0XBF,0XD7,0XBF,0XD7,0XBF,0XDF,0XBF,0XD7,0XBF, -0XC7,0X3E,0XA6,0X1A,0X63,0XF2,0X29,0XA7,0X41,0X82,0XB4,0X22,0XFE,0X62,0XFE,0X83, -0XFE,0XAA,0XFF,0X0F,0XFD,0X67,0XBA,0X63,0XEF,0X3C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE6,0X9A,0XD2,0X80, -0XFD,0X21,0XFD,0XC2,0XF5,0XE2,0XF5,0XC2,0XF5,0X82,0XFD,0X82,0XFD,0X62,0XDC,0X61, -0X9B,0X21,0X6A,0X84,0X6A,0XE9,0X63,0X2C,0X63,0XAF,0X74,0X11,0X63,0X6E,0X63,0X2C, -0X5A,0X89,0X52,0X04,0X7A,0X81,0XCB,0XC2,0XFC,0XE2,0XFD,0X62,0XFD,0X82,0XFD,0XC2, -0XFD,0XC2,0XFD,0XE4,0XFD,0X24,0XCA,0X62,0XE7,0X1C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCC,0XB1, -0XD2,0X81,0XF3,0XC0,0XFC,0XC1,0XFD,0X02,0XFD,0X02,0XFC,0XE2,0XFC,0XC2,0XFC,0XC2, -0XFC,0X81,0XFB,0X80,0XC9,0XC0,0X81,0XA4,0XAD,0X35,0XCE,0X59,0X9C,0X71,0X81,0X21, -0XDA,0X00,0XFB,0XA1,0XFC,0X82,0XFC,0XA2,0XFC,0X82,0XFC,0XA2,0XFD,0X02,0XFD,0X22, -0XFC,0XE2,0XFC,0X00,0XDA,0X60,0XCC,0X90,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XDE,0X59,0XC4,0X0D,0XCB,0X06,0XD2,0XE4,0XDB,0X03,0XDB,0X03,0XDA,0XE3,0XD2,0XC3, -0XC2,0XA4,0XB3,0X09,0XBC,0XD2,0XF7,0X9E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE6,0XFB, -0XB4,0X0E,0XBA,0XA6,0XD2,0X83,0XE2,0XE3,0XEB,0X02,0XEB,0X22,0XE3,0X22,0XDB,0X03, -0XD2,0XE4,0XC3,0X6A,0XD5,0XB6,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -}; - -#endif - - diff --git a/software/bootloader/Core/Inc/crc.h b/software/bootloader/Core/Inc/crc.h deleted file mode 100644 index ec798fc..0000000 --- a/software/bootloader/Core/Inc/crc.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file crc.h - * @brief This file contains all the function prototypes for - * the crc.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __CRC_H__ -#define __CRC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern CRC_HandleTypeDef hcrc; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_CRC_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CRC_H__ */ - diff --git a/software/bootloader/Core/Inc/gpio.h b/software/bootloader/Core/Inc/gpio.h deleted file mode 100644 index 708bac7..0000000 --- a/software/bootloader/Core/Inc/gpio.h +++ /dev/null @@ -1,49 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file gpio.h - * @brief This file contains all the function prototypes for - * the gpio.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GPIO_H__ -#define __GPIO_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_GPIO_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif -#endif /*__ GPIO_H__ */ - diff --git a/software/bootloader/Core/Inc/i2c.h b/software/bootloader/Core/Inc/i2c.h deleted file mode 100644 index e5f10f5..0000000 --- a/software/bootloader/Core/Inc/i2c.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file i2c.h - * @brief This file contains all the function prototypes for - * the i2c.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __I2C_H__ -#define __I2C_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern I2C_HandleTypeDef hi2c1; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_I2C1_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __I2C_H__ */ - diff --git a/software/bootloader/Core/Inc/main.h b/software/bootloader/Core/Inc/main.h deleted file mode 100644 index a46bccd..0000000 --- a/software/bootloader/Core/Inc/main.h +++ /dev/null @@ -1,69 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.h - * @brief : Header for main.c file. - * This file contains the common defines of the application. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MAIN_H -#define __MAIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ - -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void Error_Handler(void); - -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -/* Private defines -----------------------------------------------------------*/ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -#ifdef __cplusplus -} -#endif - -#endif /* __MAIN_H */ diff --git a/software/bootloader/Core/Inc/spi.h b/software/bootloader/Core/Inc/spi.h deleted file mode 100644 index 5d4e747..0000000 --- a/software/bootloader/Core/Inc/spi.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file spi.h - * @brief This file contains all the function prototypes for - * the spi.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPI_H__ -#define __SPI_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern SPI_HandleTypeDef hspi2; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_SPI2_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __SPI_H__ */ - diff --git a/software/bootloader/Core/Inc/stm32f4xx_hal_conf.h b/software/bootloader/Core/Inc/stm32f4xx_hal_conf.h deleted file mode 100644 index 97a0af6..0000000 --- a/software/bootloader/Core/Inc/stm32f4xx_hal_conf.h +++ /dev/null @@ -1,495 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_hal_conf_template.h - * @author MCD Application Team - * @brief HAL configuration template file. - * This file should be copied to the application folder and renamed - * to stm32f4xx_hal_conf.h. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CONF_H -#define __STM32F4xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED - - /* #define HAL_CRYP_MODULE_ENABLED */ -/* #define HAL_ADC_MODULE_ENABLED */ -/* #define HAL_CAN_MODULE_ENABLED */ -#define HAL_CRC_MODULE_ENABLED -/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ -/* #define HAL_DAC_MODULE_ENABLED */ -/* #define HAL_DCMI_MODULE_ENABLED */ -/* #define HAL_DMA2D_MODULE_ENABLED */ -/* #define HAL_ETH_MODULE_ENABLED */ -/* #define HAL_ETH_LEGACY_MODULE_ENABLED */ -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_PCCARD_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ -/* #define HAL_HASH_MODULE_ENABLED */ -#define HAL_I2C_MODULE_ENABLED -/* #define HAL_I2S_MODULE_ENABLED */ -/* #define HAL_IWDG_MODULE_ENABLED */ -/* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_RNG_MODULE_ENABLED */ -/* #define HAL_RTC_MODULE_ENABLED */ -/* #define HAL_SAI_MODULE_ENABLED */ -/* #define HAL_SD_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ -#define HAL_SPI_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -/* #define HAL_UART_MODULE_ENABLED */ -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ -#define HAL_PCD_MODULE_ENABLED -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_DSI_MODULE_ENABLED */ -/* #define HAL_QSPI_MODULE_ENABLED */ -/* #define HAL_QSPI_MODULE_ENABLED */ -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_FMPI2C_MODULE_ENABLED */ -/* #define HAL_FMPSMBUS_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -#define HAL_GPIO_MODULE_ENABLED -#define HAL_EXTI_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED - -/* ########################## HSE/HSI Values adaptation ##################### */ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) - #define LSI_VALUE 32000U /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature.*/ -/** - * @brief External Low Speed oscillator (LSE) value. - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External audio frequency in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#define VDD_VALUE 3300U /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY 15U /*!< tick interrupt priority */ -#define USE_RTOS 0U -#define PREFETCH_ENABLE 1U -#define INSTRUCTION_CACHE_ENABLE 1U -#define DATA_CACHE_ENABLE 1U - -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ -#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ -#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ -#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ -#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ -#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ -#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ -#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ -#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ -#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ -#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ -#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ -#define USE_HAL_FMPSMBUS_REGISTER_CALLBACKS 0U /* FMPSMBUS register callback disabled */ -#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ -#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ -#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ -#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ -#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ -#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ -#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ -#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ -#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ -#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ -#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ -#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ -#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ -#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ -#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ -#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ -#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1U */ - -/* ################## Ethernet peripheral configuration ##################### */ - -/* Section 1 : Ethernet peripheral configuration */ - -/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ -#define MAC_ADDR0 2U -#define MAC_ADDR1 0U -#define MAC_ADDR2 0U -#define MAC_ADDR3 0U -#define MAC_ADDR4 0U -#define MAC_ADDR5 0U - -/* Definition of the Ethernet driver buffers size and count */ -#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ -#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ - -/* Section 2: PHY configuration section */ - -/* DP83848_PHY_ADDRESS Address*/ -#define DP83848_PHY_ADDRESS -/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ -#define PHY_RESET_DELAY 0x000000FFU -/* PHY Configuration delay */ -#define PHY_CONFIG_DELAY 0x00000FFFU - -#define PHY_READ_TO 0x0000FFFFU -#define PHY_WRITE_TO 0x0000FFFFU - -/* Section 3: Common PHY Registers */ - -#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ -#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ - -#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ -#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ -#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ - -#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ -#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ -#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ - -/* Section 4: Extended PHY Registers */ -#define PHY_SR ((uint16_t)) /*!< PHY status register Offset */ - -#define PHY_SPEED_STATUS ((uint16_t)) /*!< PHY Speed mask */ -#define PHY_DUPLEX_STATUS ((uint16_t)) /*!< PHY Duplex mask */ - -/* ################## SPI peripheral configuration ########################## */ - -/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver -* Activated: CRC code is present inside driver -* Deactivated: CRC code cleaned from driver -*/ - -#define USE_SPI_CRC 0U - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED - #include "stm32f4xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32f4xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED - #include "stm32f4xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32f4xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32f4xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32f4xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_CAN_MODULE_ENABLED - #include "stm32f4xx_hal_can.h" -#endif /* HAL_CAN_MODULE_ENABLED */ - -#ifdef HAL_CAN_LEGACY_MODULE_ENABLED - #include "stm32f4xx_hal_can_legacy.h" -#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32f4xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32f4xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DMA2D_MODULE_ENABLED - #include "stm32f4xx_hal_dma2d.h" -#endif /* HAL_DMA2D_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32f4xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED - #include "stm32f4xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED - #include "stm32f4xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_ETH_LEGACY_MODULE_ENABLED - #include "stm32f4xx_hal_eth_legacy.h" -#endif /* HAL_ETH_LEGACY_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32f4xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32f4xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32f4xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_PCCARD_MODULE_ENABLED - #include "stm32f4xx_hal_pccard.h" -#endif /* HAL_PCCARD_MODULE_ENABLED */ - -#ifdef HAL_SDRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sdram.h" -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED - #include "stm32f4xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32f4xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED - #include "stm32f4xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED - #include "stm32f4xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32f4xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_LTDC_MODULE_ENABLED - #include "stm32f4xx_hal_ltdc.h" -#endif /* HAL_LTDC_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32f4xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED - #include "stm32f4xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32f4xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED - #include "stm32f4xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED - #include "stm32f4xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32f4xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32f4xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32f4xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32f4xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32f4xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32f4xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32f4xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32f4xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED - #include "stm32f4xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_DSI_MODULE_ENABLED - #include "stm32f4xx_hal_dsi.h" -#endif /* HAL_DSI_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED - #include "stm32f4xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED - #include "stm32f4xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_FMPI2C_MODULE_ENABLED - #include "stm32f4xx_hal_fmpi2c.h" -#endif /* HAL_FMPI2C_MODULE_ENABLED */ - -#ifdef HAL_FMPSMBUS_MODULE_ENABLED - #include "stm32f4xx_hal_fmpsmbus.h" -#endif /* HAL_FMPSMBUS_MODULE_ENABLED */ - -#ifdef HAL_SPDIFRX_MODULE_ENABLED - #include "stm32f4xx_hal_spdifrx.h" -#endif /* HAL_SPDIFRX_MODULE_ENABLED */ - -#ifdef HAL_DFSDM_MODULE_ENABLED - #include "stm32f4xx_hal_dfsdm.h" -#endif /* HAL_DFSDM_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED - #include "stm32f4xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -#ifdef HAL_MMC_MODULE_ENABLED - #include "stm32f4xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_CONF_H */ diff --git a/software/bootloader/Core/Inc/stm32f4xx_it.h b/software/bootloader/Core/Inc/stm32f4xx_it.h deleted file mode 100644 index 68a0fb9..0000000 --- a/software/bootloader/Core/Inc/stm32f4xx_it.h +++ /dev/null @@ -1,67 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_it.h - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_IT_H -#define __STM32F4xx_IT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ - -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void NMI_Handler(void); -void HardFault_Handler(void); -void MemManage_Handler(void); -void BusFault_Handler(void); -void UsageFault_Handler(void); -void SVC_Handler(void); -void DebugMon_Handler(void); -void PendSV_Handler(void); -void SysTick_Handler(void); -void OTG_FS_IRQHandler(void); -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_IT_H */ diff --git a/software/bootloader/Core/Inc/tim.h b/software/bootloader/Core/Inc/tim.h deleted file mode 100644 index 5cc8975..0000000 --- a/software/bootloader/Core/Inc/tim.h +++ /dev/null @@ -1,54 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file tim.h - * @brief This file contains all the function prototypes for - * the tim.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __TIM_H__ -#define __TIM_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern TIM_HandleTypeDef htim1; - -/* USER CODE BEGIN Private defines */ -#define PWM_PERIOD 300 -/* USER CODE END Private defines */ - -void MX_TIM1_Init(void); - -void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __TIM_H__ */ - diff --git a/software/bootloader/Core/Src/crc.c b/software/bootloader/Core/Src/crc.c deleted file mode 100644 index f3c7f74..0000000 --- a/software/bootloader/Core/Src/crc.c +++ /dev/null @@ -1,85 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file crc.c - * @brief This file provides code for the configuration - * of the CRC instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "crc.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -CRC_HandleTypeDef hcrc; - -/* CRC init function */ -void MX_CRC_Init(void) -{ - - /* USER CODE BEGIN CRC_Init 0 */ - - /* USER CODE END CRC_Init 0 */ - - /* USER CODE BEGIN CRC_Init 1 */ - - /* USER CODE END CRC_Init 1 */ - hcrc.Instance = CRC; - if (HAL_CRC_Init(&hcrc) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN CRC_Init 2 */ - - /* USER CODE END CRC_Init 2 */ - -} - -void HAL_CRC_MspInit(CRC_HandleTypeDef* crcHandle) -{ - - if(crcHandle->Instance==CRC) - { - /* USER CODE BEGIN CRC_MspInit 0 */ - - /* USER CODE END CRC_MspInit 0 */ - /* CRC clock enable */ - __HAL_RCC_CRC_CLK_ENABLE(); - /* USER CODE BEGIN CRC_MspInit 1 */ - - /* USER CODE END CRC_MspInit 1 */ - } -} - -void HAL_CRC_MspDeInit(CRC_HandleTypeDef* crcHandle) -{ - - if(crcHandle->Instance==CRC) - { - /* USER CODE BEGIN CRC_MspDeInit 0 */ - - /* USER CODE END CRC_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_CRC_CLK_DISABLE(); - /* USER CODE BEGIN CRC_MspDeInit 1 */ - - /* USER CODE END CRC_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/software/bootloader/Core/Src/gpio.c b/software/bootloader/Core/Src/gpio.c deleted file mode 100644 index 9b36170..0000000 --- a/software/bootloader/Core/Src/gpio.c +++ /dev/null @@ -1,54 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file gpio.c - * @brief This file provides code for the configuration - * of all used GPIO pins. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "gpio.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/*----------------------------------------------------------------------------*/ -/* Configure GPIO */ -/*----------------------------------------------------------------------------*/ -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/** Configure pins as - * Analog - * Input - * Output - * EVENT_OUT - * EXTI -*/ -void MX_GPIO_Init(void) -{ - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOH_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - -} - -/* USER CODE BEGIN 2 */ - -/* USER CODE END 2 */ diff --git a/software/bootloader/Core/Src/i2c.c b/software/bootloader/Core/Src/i2c.c deleted file mode 100644 index deff244..0000000 --- a/software/bootloader/Core/Src/i2c.c +++ /dev/null @@ -1,116 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file i2c.c - * @brief This file provides code for the configuration - * of the I2C instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "i2c.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -I2C_HandleTypeDef hi2c1; - -/* I2C1 init function */ -void MX_I2C1_Init(void) -{ - - /* USER CODE BEGIN I2C1_Init 0 */ - - /* USER CODE END I2C1_Init 0 */ - - /* USER CODE BEGIN I2C1_Init 1 */ - - /* USER CODE END I2C1_Init 1 */ - hi2c1.Instance = I2C1; - hi2c1.Init.ClockSpeed = 100000; - hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; - hi2c1.Init.OwnAddress1 = 0; - hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - hi2c1.Init.OwnAddress2 = 0; - hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - if (HAL_I2C_Init(&hi2c1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN I2C1_Init 2 */ - - /* USER CODE END I2C1_Init 2 */ - -} - -void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(i2cHandle->Instance==I2C1) - { - /* USER CODE BEGIN I2C1_MspInit 0 */ - - /* USER CODE END I2C1_MspInit 0 */ - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA - */ - GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* I2C1 clock enable */ - __HAL_RCC_I2C1_CLK_ENABLE(); - /* USER CODE BEGIN I2C1_MspInit 1 */ - - /* USER CODE END I2C1_MspInit 1 */ - } -} - -void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) -{ - - if(i2cHandle->Instance==I2C1) - { - /* USER CODE BEGIN I2C1_MspDeInit 0 */ - - /* USER CODE END I2C1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_I2C1_CLK_DISABLE(); - - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6); - - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); - - /* USER CODE BEGIN I2C1_MspDeInit 1 */ - - /* USER CODE END I2C1_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/software/bootloader/Core/Src/main.c b/software/bootloader/Core/Src/main.c deleted file mode 100644 index fadbc8f..0000000 --- a/software/bootloader/Core/Src/main.c +++ /dev/null @@ -1,304 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.c - * @brief : Main program body - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -#include "crc.h" -#include "i2c.h" -#include "spi.h" -#include "tim.h" -#include "usb_device.h" -#include "gpio.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -#include -#include -#include "menu.h" -#include "common.h" -#include "delay.h" -#include "lcd.h" -#include "lcd_init.h" -#include "key.h" -#include "BL24C02.h" -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN PTD */ - -/* USER CODE END PTD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE BEGIN PV */ - -extern pFunction Jump_To_Application; -extern uint32_t JumpAddress; - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -void SystemClock_Config(void); -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ -void Bootloader_Main(void) -{ - // Bootloader 循环等待上位机指令 - while (1) - { - // 1. 发送握手信号 - USB_PutString("##PICO_BOOT##\r\n"); - // 2. 在延时期间(比如500ms)不断检查有没有收到数据 - // 这样既实现了延时,又不会阻塞接收 - uint8_t key = 0; - for (int i = 0; i < 50; i++) - { - // USB_KeyPressed 应该是一个非阻塞检查函数 - // 如果收到数据返回 1,否则返回 0 - if (USB_KeyPressed(&key)) - { - if (key == '0') - { - // 收到 '0',进入菜单 - Main_Menu(); - } - } - HAL_Delay(10); // 每次只延时 10ms,检查 50 次 = 500ms - } - } -} -/* USER CODE END 0 */ - -/** - * @brief The application entry point. - * @retval int - */ -int main(void) -{ - - /* USER CODE BEGIN 1 */ - SCB->VTOR = FLASH_BASE; - /* USER CODE END 1 */ - - /* MCU Configuration--------------------------------------------------------*/ - - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); - - /* USER CODE BEGIN Init */ - - /* USER CODE END Init */ - - /* Configure the system clock */ - SystemClock_Config(); - - /* USER CODE BEGIN SysInit */ - - /* USER CODE END SysInit */ - - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_SPI2_Init(); - MX_TIM1_Init(); - MX_I2C1_Init(); - MX_USB_DEVICE_Init(); - MX_CRC_Init(); - /* USER CODE BEGIN 2 */ - - //sys delay - delay_init(); - - //key_boot - Key_Port_Init(); - - // PWM Start for LCD backlight - HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3); - - //lcd - LCD_Init(); - LCD_Fill(0, 0, LCD_W, LCD_H, BLACK); - delay_ms(10); - LCD_Set_Light(50); - - // extern eeprom BL24C02 - uint8_t update_flag = 0; - if(!EEPROM_Init_Check()) { - update_flag = EEPROM_UpdateCommand_Check(); - if(EEPROM_UpdateCommand_Check()) { - USB_PutString("enter firmware update mode\r\n"); - EEPROM_UpdateCommand_Write(false); - } - } - - // 开机启动时如果按下KEY, 或EEPROM有升级标志, 进入boot中IAP升级模式 - if(HAL_GPIO_ReadPin(KEYB_PORT, KEYB_PIN) == 0 || update_flag) - { - // 延时判断是否真的按下 - delay_ms(500); - if(HAL_GPIO_ReadPin(KEYB_PORT, KEYB_PIN) == 0 || update_flag) - { - LCD_ShowString(72, LCD_H/3, (uint8_t*)"Bootload", WHITE, BLACK, 24, 0);//12*6,16*8,24*12,32*16 - FLASH_If_Init(); - Bootloader_Main(); - } - } - - // 如果没按下KEY1, 且有APP程序, 则运行APP, 没有APP则 - else - { - UpgradeInfo_t app_info; - pFunction Jump_To_Application; - - // 1. 从独立的校验区(Sector 3)读取升级信息结构体 - memcpy(&app_info, (void*)UPGRADE_INFO_ADDRESS, sizeof(UpgradeInfo_t)); - - // 2. 检查标志是否有效 (魔法字和完成状态) - if (app_info.magic_word == MAGIC_WORD && app_info.upgrade_status == UPGRADE_STATUS_COMPLETE) - { - // 3. 校验APP固件的完整性 - uint32_t current_crc = Calculate_CRC32(APPLICATION_ADDRESS, app_info.new_app_size); - - if (current_crc == app_info.new_app_crc32) - { - // 4. 校验成功,执行跳转 - USB_PutString("Valid APP found, jumping to application...\r\n"); - jump_to_app(); - } - } - // no legal APP - else - { - USB_PutString("No App found, enter firmware update mode\r\n"); - LCD_ShowString(74, LCD_H/3, (uint8_t*)"No App!", WHITE, BLACK, 24, 0);//12*6,16*8,24*12,32*16 - LCD_ShowString(24, LCD_H/3+48, (uint8_t*)"Plz Download APP", WHITE, BLACK, 24, 0); - HAL_Delay(2000); - LCD_ShowString(72, LCD_H/3, (uint8_t*)"Bootload", WHITE, BLACK, 24, 0);//12*6,16*8,24*12,32*16 - FLASH_If_Init(); - Bootloader_Main(); - } - } - - - /* USER CODE END 2 */ - - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - while (1) - { - /* USER CODE END WHILE */ - - /* USER CODE BEGIN 3 */ - HAL_Delay(500); - } - /* USER CODE END 3 */ -} - -/** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) -{ - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - - /** Configure the main internal regulator output voltage - */ - __HAL_RCC_PWR_CLK_ENABLE(); - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 25; - RCC_OscInitStruct.PLL.PLLN = 192; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 4; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - { - Error_Handler(); - } - - /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK) - { - Error_Handler(); - } -} - -/* USER CODE BEGIN 4 */ - -/* USER CODE END 4 */ - -/** - * @brief This function is executed in case of error occurrence. - * @retval None - */ -void Error_Handler(void) -{ - /* USER CODE BEGIN Error_Handler_Debug */ - /* User can add his own implementation to report the HAL error return state */ - __disable_irq(); - while (1) - { - } - /* USER CODE END Error_Handler_Debug */ -} - -#ifdef USE_FULL_ASSERT -/** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ -void assert_failed(uint8_t *file, uint32_t line) -{ - /* USER CODE BEGIN 6 */ - /* User can add his own implementation to report the file name and line number, - ex: Serial_PutString("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ -} -#endif /* USE_FULL_ASSERT */ diff --git a/software/bootloader/Core/Src/spi.c b/software/bootloader/Core/Src/spi.c deleted file mode 100644 index ac91d7d..0000000 --- a/software/bootloader/Core/Src/spi.c +++ /dev/null @@ -1,117 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file spi.c - * @brief This file provides code for the configuration - * of the SPI instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "spi.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -SPI_HandleTypeDef hspi2; - -/* SPI2 init function */ -void MX_SPI2_Init(void) -{ - - /* USER CODE BEGIN SPI2_Init 0 */ - - /* USER CODE END SPI2_Init 0 */ - - /* USER CODE BEGIN SPI2_Init 1 */ - - /* USER CODE END SPI2_Init 1 */ - hspi2.Instance = SPI2; - hspi2.Init.Mode = SPI_MODE_MASTER; - hspi2.Init.Direction = SPI_DIRECTION_2LINES; - hspi2.Init.DataSize = SPI_DATASIZE_8BIT; - hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH; - hspi2.Init.CLKPhase = SPI_PHASE_2EDGE; - hspi2.Init.NSS = SPI_NSS_SOFT; - hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi2.Init.TIMode = SPI_TIMODE_DISABLE; - hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi2.Init.CRCPolynomial = 10; - if (HAL_SPI_Init(&hspi2) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN SPI2_Init 2 */ - - /* USER CODE END SPI2_Init 2 */ - -} - -void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(spiHandle->Instance==SPI2) - { - /* USER CODE BEGIN SPI2_MspInit 0 */ - - /* USER CODE END SPI2_MspInit 0 */ - /* SPI2 clock enable */ - __HAL_RCC_SPI2_CLK_ENABLE(); - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**SPI2 GPIO Configuration - PB13 ------> SPI2_SCK - PB15 ------> SPI2_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI2_MspInit 1 */ - - /* USER CODE END SPI2_MspInit 1 */ - } -} - -void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) -{ - - if(spiHandle->Instance==SPI2) - { - /* USER CODE BEGIN SPI2_MspDeInit 0 */ - - /* USER CODE END SPI2_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI2_CLK_DISABLE(); - - /**SPI2 GPIO Configuration - PB13 ------> SPI2_SCK - PB15 ------> SPI2_MOSI - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_15); - - /* USER CODE BEGIN SPI2_MspDeInit 1 */ - - /* USER CODE END SPI2_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/software/bootloader/Core/Src/stm32f4xx_hal_msp.c b/software/bootloader/Core/Src/stm32f4xx_hal_msp.c deleted file mode 100644 index 178202d..0000000 --- a/software/bootloader/Core/Src/stm32f4xx_hal_msp.c +++ /dev/null @@ -1,82 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_hal_msp.c - * @brief This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Define */ - -/* USER CODE END Define */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Macro */ - -/* USER CODE END Macro */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* External functions --------------------------------------------------------*/ -/* USER CODE BEGIN ExternalFunctions */ - -/* USER CODE END ExternalFunctions */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/software/bootloader/Core/Src/stm32f4xx_it.c b/software/bootloader/Core/Src/stm32f4xx_it.c deleted file mode 100644 index 7681c04..0000000 --- a/software/bootloader/Core/Src/stm32f4xx_it.c +++ /dev/null @@ -1,217 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -#include "stm32f4xx_it.h" -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/* External variables --------------------------------------------------------*/ -extern PCD_HandleTypeDef hpcd_USB_OTG_FS; -/* USER CODE BEGIN EV */ - -/* USER CODE END EV */ - -/******************************************************************************/ -/* Cortex-M4 Processor Interruption and Exception Handlers */ -/******************************************************************************/ -/** - * @brief This function handles Non maskable interrupt. - */ -void NMI_Handler(void) -{ - /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ - - /* USER CODE END NonMaskableInt_IRQn 0 */ - /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ - while (1) - { - } - /* USER CODE END NonMaskableInt_IRQn 1 */ -} - -/** - * @brief This function handles Hard fault interrupt. - */ -void HardFault_Handler(void) -{ - /* USER CODE BEGIN HardFault_IRQn 0 */ - - /* USER CODE END HardFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_HardFault_IRQn 0 */ - /* USER CODE END W1_HardFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Memory management fault. - */ -void MemManage_Handler(void) -{ - /* USER CODE BEGIN MemoryManagement_IRQn 0 */ - - /* USER CODE END MemoryManagement_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ - /* USER CODE END W1_MemoryManagement_IRQn 0 */ - } -} - -/** - * @brief This function handles Pre-fetch fault, memory access fault. - */ -void BusFault_Handler(void) -{ - /* USER CODE BEGIN BusFault_IRQn 0 */ - - /* USER CODE END BusFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_BusFault_IRQn 0 */ - /* USER CODE END W1_BusFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Undefined instruction or illegal state. - */ -void UsageFault_Handler(void) -{ - /* USER CODE BEGIN UsageFault_IRQn 0 */ - - /* USER CODE END UsageFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ - /* USER CODE END W1_UsageFault_IRQn 0 */ - } -} - -/** - * @brief This function handles System service call via SWI instruction. - */ -void SVC_Handler(void) -{ - /* USER CODE BEGIN SVCall_IRQn 0 */ - - /* USER CODE END SVCall_IRQn 0 */ - /* USER CODE BEGIN SVCall_IRQn 1 */ - - /* USER CODE END SVCall_IRQn 1 */ -} - -/** - * @brief This function handles Debug monitor. - */ -void DebugMon_Handler(void) -{ - /* USER CODE BEGIN DebugMonitor_IRQn 0 */ - - /* USER CODE END DebugMonitor_IRQn 0 */ - /* USER CODE BEGIN DebugMonitor_IRQn 1 */ - - /* USER CODE END DebugMonitor_IRQn 1 */ -} - -/** - * @brief This function handles Pendable request for system service. - */ -void PendSV_Handler(void) -{ - /* USER CODE BEGIN PendSV_IRQn 0 */ - - /* USER CODE END PendSV_IRQn 0 */ - /* USER CODE BEGIN PendSV_IRQn 1 */ - - /* USER CODE END PendSV_IRQn 1 */ -} - -/** - * @brief This function handles System tick timer. - */ -void SysTick_Handler(void) -{ - /* USER CODE BEGIN SysTick_IRQn 0 */ - - /* USER CODE END SysTick_IRQn 0 */ - HAL_IncTick(); - /* USER CODE BEGIN SysTick_IRQn 1 */ - - /* USER CODE END SysTick_IRQn 1 */ -} - -/******************************************************************************/ -/* STM32F4xx Peripheral Interrupt Handlers */ -/* Add here the Interrupt Handlers for the used peripherals. */ -/* For the available peripheral interrupt handler names, */ -/* please refer to the startup file (startup_stm32f4xx.s). */ -/******************************************************************************/ - -/** - * @brief This function handles USB On The Go FS global interrupt. - */ -void OTG_FS_IRQHandler(void) -{ - /* USER CODE BEGIN OTG_FS_IRQn 0 */ - - /* USER CODE END OTG_FS_IRQn 0 */ - HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS); - /* USER CODE BEGIN OTG_FS_IRQn 1 */ - - /* USER CODE END OTG_FS_IRQn 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/software/bootloader/Core/Src/system_stm32f4xx.c b/software/bootloader/Core/Src/system_stm32f4xx.c deleted file mode 100644 index 3bd40f7..0000000 --- a/software/bootloader/Core/Src/system_stm32f4xx.c +++ /dev/null @@ -1,747 +0,0 @@ -/** - ****************************************************************************** - * @file system_stm32f4xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f4xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx_system - * @{ - */ - -/** @addtogroup STM32F4xx_System_Private_Includes - * @{ - */ - - -#include "stm32f4xx.h" - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ -/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) -/* #define DATA_IN_ExtSRAM */ -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\ - STM32F412Zx || STM32F412Vx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/* #define DATA_IN_ExtSDRAM */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ - STM32F479xx */ - -/* Note: Following vector table addresses must be defined in line with linker - configuration. */ -/*!< Uncomment the following line if you need to relocate the vector table - anywhere in Flash or Sram, else the vector table is kept at the automatic - remap of boot address selected */ -/* #define USER_VECT_TAB_ADDRESS */ - -#if defined(USER_VECT_TAB_ADDRESS) -/*!< Uncomment the following line if you need to relocate your vector Table - in Sram else user remap will be done in Flash. */ -/* #define VECT_TAB_SRAM */ -#if defined(VECT_TAB_SRAM) -#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field. - This value must be a multiple of 0x200. */ -#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -#else -#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. - This value must be a multiple of 0x200. */ -#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -#endif /* VECT_TAB_SRAM */ -#endif /* USER_VECT_TAB_ADDRESS */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Variables - * @{ - */ - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ -uint32_t SystemCoreClock = 16000000; -const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; -const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes - * @{ - */ - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - static void SystemInit_ExtMemCtl(void); -#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the FPU setting, vector table location and External memory - * configuration. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - SystemInit_ExtMemCtl(); -#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ - - /* Configure the Vector Table location -------------------------------------*/ -#if defined(USER_VECT_TAB_ADDRESS) - SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#endif /* USER_VECT_TAB_ADDRESS */ -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value - * depends on the application requirements), user has to ensure that HSE_VALUE - * is same as the real frequency of the crystal used. Otherwise, this function - * may have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f4xx.s before jump to main. - * This function configures the external memories (SRAM/SDRAM) - * This SRAM/SDRAM will be used as program data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; - - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - - /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ - RCC->AHB1ENR |= 0x000001F8; - - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xAAAA0A8A; - /* Configure PDx pins speed to 100 MHz */ - GPIOD->OSPEEDR = 0xFFFF0FCF; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA828A; - /* Configure PEx pins speed to 100 MHz */ - GPIOE->OSPEEDR = 0xFFFFC3CF; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA800AAA; - /* Configure PFx pins speed to 50 MHz */ - GPIOF->OSPEEDR = 0xAA800AAA; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0xAAAAAAAA; - /* Configure PGx pins speed to 50 MHz */ - GPIOG->OSPEEDR = 0xAAAAAAAA; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - - /* Connect PHx pins to FMC Alternate function */ - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - /* Configure PHx pins in Alternate function mode */ - GPIOH->MODER = 0xAAAA08A0; - /* Configure PHx pins speed to 50 MHz */ - GPIOH->OSPEEDR = 0xAAAA08A0; - /* Configure PHx pins Output type to push-pull */ - GPIOH->OTYPER = 0x00000000; - /* No pull-up, pull-down for PHx pins */ - GPIOH->PUPDR = 0x00000000; - - /* Connect PIx pins to FMC Alternate function */ - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - /* Configure PIx pins in Alternate function mode */ - GPIOI->MODER = 0x0028AAAA; - /* Configure PIx pins speed to 50 MHz */ - GPIOI->OSPEEDR = 0x0028AAAA; - /* Configure PIx pins Output type to push-pull */ - GPIOI->OTYPER = 0x00000000; - /* No pull-up, pull-down for PIx pins */ - GPIOI->PUPDR = 0x00000000; - -/*-- FMC Configuration -------------------------------------------------------*/ - /* Enable the FMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - - FMC_Bank5_6->SDCR[0] = 0x000019E4; - FMC_Bank5_6->SDTR[0] = 0x01115351; - - /* SDRAM initialization sequence */ - /* Clock enable command */ - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Delay */ - for (index = 0; index<1000; index++); - - /* PALL command */ - FMC_Bank5_6->SDCMR = 0x00000012; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Auto refresh command */ - FMC_Bank5_6->SDCMR = 0x00000073; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* MRD register program */ - FMC_Bank5_6->SDCMR = 0x00046014; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Set refresh count */ - tmpreg = FMC_Bank5_6->SDRTR; - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); - - /* Disable write protection */ - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F469xx || STM32F479xx */ - - (void)(tmp); -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f4xx.s before jump to main. - * This function configures the external memories (SRAM/SDRAM) - * This SRAM/SDRAM will be used as program data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#if defined (DATA_IN_ExtSDRAM) - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - -#if defined(STM32F446xx) - /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface - clock */ - RCC->AHB1ENR |= 0x0000007D; -#else - /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface - clock */ - RCC->AHB1ENR |= 0x000001F8; -#endif /* STM32F446xx */ - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - -#if defined(STM32F446xx) - /* Connect PAx pins to FMC Alternate function */ - GPIOA->AFR[0] |= 0xC0000000; - GPIOA->AFR[1] |= 0x00000000; - /* Configure PDx pins in Alternate function mode */ - GPIOA->MODER |= 0x00008000; - /* Configure PDx pins speed to 50 MHz */ - GPIOA->OSPEEDR |= 0x00008000; - /* Configure PDx pins Output type to push-pull */ - GPIOA->OTYPER |= 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOA->PUPDR |= 0x00000000; - - /* Connect PCx pins to FMC Alternate function */ - GPIOC->AFR[0] |= 0x00CC0000; - GPIOC->AFR[1] |= 0x00000000; - /* Configure PDx pins in Alternate function mode */ - GPIOC->MODER |= 0x00000A00; - /* Configure PDx pins speed to 50 MHz */ - GPIOC->OSPEEDR |= 0x00000A00; - /* Configure PDx pins Output type to push-pull */ - GPIOC->OTYPER |= 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOC->PUPDR |= 0x00000000; -#endif /* STM32F446xx */ - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x000000CC; - GPIOD->AFR[1] = 0xCC000CCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xA02A000A; - /* Configure PDx pins speed to 50 MHz */ - GPIOD->OSPEEDR = 0xA02A000A; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00000CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA800A; - /* Configure PEx pins speed to 50 MHz */ - GPIOE->OSPEEDR = 0xAAAA800A; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA800AAA; - /* Configure PFx pins speed to 50 MHz */ - GPIOF->OSPEEDR = 0xAA800AAA; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0xAAAAAAAA; - /* Configure PGx pins speed to 50 MHz */ - GPIOG->OSPEEDR = 0xAAAAAAAA; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) - /* Connect PHx pins to FMC Alternate function */ - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - /* Configure PHx pins in Alternate function mode */ - GPIOH->MODER = 0xAAAA08A0; - /* Configure PHx pins speed to 50 MHz */ - GPIOH->OSPEEDR = 0xAAAA08A0; - /* Configure PHx pins Output type to push-pull */ - GPIOH->OTYPER = 0x00000000; - /* No pull-up, pull-down for PHx pins */ - GPIOH->PUPDR = 0x00000000; - - /* Connect PIx pins to FMC Alternate function */ - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - /* Configure PIx pins in Alternate function mode */ - GPIOI->MODER = 0x0028AAAA; - /* Configure PIx pins speed to 50 MHz */ - GPIOI->OSPEEDR = 0x0028AAAA; - /* Configure PIx pins Output type to push-pull */ - GPIOI->OTYPER = 0x00000000; - /* No pull-up, pull-down for PIx pins */ - GPIOI->PUPDR = 0x00000000; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -/*-- FMC Configuration -------------------------------------------------------*/ - /* Enable the FMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - - /* Configure and enable SDRAM bank1 */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCR[0] = 0x00001954; -#else - FMC_Bank5_6->SDCR[0] = 0x000019E4; -#endif /* STM32F446xx */ - FMC_Bank5_6->SDTR[0] = 0x01115351; - - /* SDRAM initialization sequence */ - /* Clock enable command */ - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Delay */ - for (index = 0; index<1000; index++); - - /* PALL command */ - FMC_Bank5_6->SDCMR = 0x00000012; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Auto refresh command */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x000000F3; -#else - FMC_Bank5_6->SDCMR = 0x00000073; -#endif /* STM32F446xx */ - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* MRD register program */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x00044014; -#else - FMC_Bank5_6->SDCMR = 0x00046014; -#endif /* STM32F446xx */ - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Set refresh count */ - tmpreg = FMC_Bank5_6->SDRTR; -#if defined(STM32F446xx) - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); -#else - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); -#endif /* STM32F446xx */ - - /* Disable write protection */ - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); -#endif /* DATA_IN_ExtSDRAM */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) - -#if defined(DATA_IN_ExtSRAM) -/*-- GPIOs Configuration -----------------------------------------------------*/ - /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ - RCC->AHB1ENR |= 0x00000078; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xAAAA0A8A; - /* Configure PDx pins speed to 100 MHz */ - GPIOD->OSPEEDR = 0xFFFF0FCF; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA828A; - /* Configure PEx pins speed to 100 MHz */ - GPIOE->OSPEEDR = 0xFFFFC3CF; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0x00CCCCCC; - GPIOF->AFR[1] = 0xCCCC0000; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA000AAA; - /* Configure PFx pins speed to 100 MHz */ - GPIOF->OSPEEDR = 0xFF000FFF; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0x00CCCCCC; - GPIOG->AFR[1] = 0x000000C0; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0x00085AAA; - /* Configure PGx pins speed to 100 MHz */ - GPIOG->OSPEEDR = 0x000CAFFF; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - -/*-- FMC/FSMC Configuration --------------------------------------------------*/ - /* Enable the FMC/FSMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F469xx || STM32F479xx */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ - || defined(STM32F412Zx) || defined(STM32F412Vx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); - /* Configure and enable Bank1_SRAM2 */ - FSMC_Bank1->BTCR[2] = 0x00001011; - FSMC_Bank1->BTCR[3] = 0x00000201; - FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ - -#endif /* DATA_IN_ExtSRAM */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ - STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ - (void)(tmp); -} -#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/software/bootloader/Core/Src/tim.c b/software/bootloader/Core/Src/tim.c deleted file mode 100644 index 871ee6c..0000000 --- a/software/bootloader/Core/Src/tim.c +++ /dev/null @@ -1,151 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file tim.c - * @brief This file provides code for the configuration - * of the TIM instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "tim.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -TIM_HandleTypeDef htim1; - -/* TIM1 init function */ -void MX_TIM1_Init(void) -{ - - /* USER CODE BEGIN TIM1_Init 0 */ - - /* USER CODE END TIM1_Init 0 */ - - TIM_MasterConfigTypeDef sMasterConfig = {0}; - TIM_OC_InitTypeDef sConfigOC = {0}; - TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; - - /* USER CODE BEGIN TIM1_Init 1 */ - - /* USER CODE END TIM1_Init 1 */ - htim1.Instance = TIM1; - htim1.Init.Prescaler = 99; - htim1.Init.CounterMode = TIM_COUNTERMODE_UP; - htim1.Init.Period = 250; - htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim1.Init.RepetitionCounter = 0; - htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) - { - Error_Handler(); - } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 0; - sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; - sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; - sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; - sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; - sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; - if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) - { - Error_Handler(); - } - sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; - sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; - sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; - sBreakDeadTimeConfig.DeadTime = 0; - sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; - sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; - sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; - if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM1_Init 2 */ - - /* USER CODE END TIM1_Init 2 */ - HAL_TIM_MspPostInit(&htim1); - -} - -void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle) -{ - - if(tim_pwmHandle->Instance==TIM1) - { - /* USER CODE BEGIN TIM1_MspInit 0 */ - - /* USER CODE END TIM1_MspInit 0 */ - /* TIM1 clock enable */ - __HAL_RCC_TIM1_CLK_ENABLE(); - /* USER CODE BEGIN TIM1_MspInit 1 */ - - /* USER CODE END TIM1_MspInit 1 */ - } -} -void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(timHandle->Instance==TIM1) - { - /* USER CODE BEGIN TIM1_MspPostInit 0 */ - - /* USER CODE END TIM1_MspPostInit 0 */ - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**TIM1 GPIO Configuration - PA10 ------> TIM1_CH3 - */ - GPIO_InitStruct.Pin = GPIO_PIN_10; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN TIM1_MspPostInit 1 */ - - /* USER CODE END TIM1_MspPostInit 1 */ - } - -} - -void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* tim_pwmHandle) -{ - - if(tim_pwmHandle->Instance==TIM1) - { - /* USER CODE BEGIN TIM1_MspDeInit 0 */ - - /* USER CODE END TIM1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM1_CLK_DISABLE(); - /* USER CODE BEGIN TIM1_MspDeInit 1 */ - - /* USER CODE END TIM1_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/software/bootloader/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f411xe.h b/software/bootloader/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f411xe.h deleted file mode 100644 index baa9edc..0000000 --- a/software/bootloader/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f411xe.h +++ /dev/null @@ -1,8680 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f411xe.h - * @author MCD Application Team - * @brief CMSIS STM32F411xE Device Peripheral Access Layer Header File. - * - * This file contains: - * - Data structures and the address mapping for all peripherals - * - peripherals registers declarations and bits definition - * - Macros to access peripheral's registers hardware - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS_Device - * @{ - */ - -/** @addtogroup stm32f411xe - * @{ - */ - -#ifndef __STM32F411xE_H -#define __STM32F411xE_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M4 Processor and Core Peripherals - */ -#define __CM4_REV 0x0001U /*!< Core revision r0p1 */ -#define __MPU_PRESENT 1U /*!< STM32F4XX provides an MPU */ -#define __NVIC_PRIO_BITS 4U /*!< STM32F4XX uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ -#define __FPU_PRESENT 1U /*!< FPU present */ - -/** - * @} - */ - -/** @addtogroup Peripheral_interrupt_number_definition - * @{ - */ - -/** - * @brief STM32F4XX Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum -{ - /****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */ - /****** STM32 specific Interrupt Numbers **********************************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ - DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ - DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ - DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ - DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ - DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ - DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ - ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ - TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ - TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ - DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ - DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ - DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ - DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ - DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ - OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ - DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ - DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ - DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ - USART6_IRQn = 71, /*!< USART6 global interrupt */ - I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ - I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ - FPU_IRQn = 81, /*!< FPU global interrupt */ - SPI4_IRQn = 84, /*!< SPI4 global Interrupt */ - SPI5_IRQn = 85 /*!< SPI5 global Interrupt */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ -#include "system_stm32f4xx.h" -#include - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ - __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ - __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ - __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ - __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ - __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ - __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ - __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ - __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ - __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ - __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ - __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ - __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __IO uint32_t CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ -} ADC_Common_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ -} CRC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -} DBGMCU_TypeDef; - - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DMA stream x configuration register */ - __IO uint32_t NDTR; /*!< DMA stream x number of data register */ - __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ - __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ - __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ - __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ -} DMA_Stream_TypeDef; - -typedef struct -{ - __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ - __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ - __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ - __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ -} DMA_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ - __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ - __IO uint32_t OPTCR; /*!< FLASH option control register , Address offset: 0x14 */ - __IO uint32_t OPTCR1; /*!< FLASH option control register 1, Address offset: 0x18 */ -} FLASH_TypeDef; - -/** - * @brief General Purpose I/O - */ - -typedef struct -{ - __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ - __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ -} GPIO_TypeDef; - -/** - * @brief System configuration controller - */ - -typedef struct -{ - __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ - __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ - __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ - uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ - __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ - __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ - __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ - __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ - __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ - __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ - __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ - __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ - __IO uint32_t FLTR; /*!< I2C FLTR register, Address offset: 0x24 */ -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ - __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ - __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ -} IWDG_TypeDef; - - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ - __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ - __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32_t RESERVED0; /*!< Reserved, 0x1C */ - __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32_t RESERVED2; /*!< Reserved, 0x3C */ - __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32_t RESERVED4; /*!< Reserved, 0x5C */ - __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ - uint32_t RESERVED7[1]; /*!< Reserved, 0x88 */ - __IO uint32_t DCKCFGR; /*!< RCC Dedicated Clocks configuration register, Address offset: 0x8C */ -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ - __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ - __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ - __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ - __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ - __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ - __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ - __IO uint32_t SSR; /*!< RTC sub second register, Address offset: 0x28 */ - __IO uint32_t SHIFTR; /*!< RTC shift control register, Address offset: 0x2C */ - __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ - __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ - __IO uint32_t TSSSR; /*!< RTC time-stamp sub second register, Address offset: 0x38 */ - __IO uint32_t CALR; /*!< RTC calibration register, Address offset: 0x3C */ - __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ - __IO uint32_t ALRMASSR;/*!< RTC alarm A sub second register, Address offset: 0x44 */ - __IO uint32_t ALRMBSSR;/*!< RTC alarm B sub second register, Address offset: 0x48 */ - uint32_t RESERVED7; /*!< Reserved, 0x4C */ - __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ - __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ - __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ - __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ - __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ - __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ - __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ - __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ - __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ - __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ - __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ - __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ - __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ - __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ - __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ - __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ - __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ - __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ - __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ - __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ -} RTC_TypeDef; - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ - __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ - __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ - __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ - __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ - __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ - __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ - __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ - __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ - __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ - __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ - __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ - __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ - __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ - __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ - __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ - uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ - __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ - uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ - __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ - __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ - __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ - __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ - __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ - __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ - __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ - __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ - __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ -} SPI_TypeDef; - - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ - __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ - __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ - __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ - __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ - __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ - __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ - __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ - __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ - __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ - __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ - __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ - __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ - __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ - __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ - __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ - __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ - __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ - __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ - __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ - __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ - __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ - __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ - __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ - __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ - __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ - __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ -} WWDG_TypeDef; -/** - * @brief USB_OTG_Core_Registers - */ -typedef struct -{ - __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h */ - __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h */ - __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h */ - __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch */ - __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h */ - __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h */ - __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h */ - __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch */ - __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h */ - __IO uint32_t GRXFSIZ; /*!< Receive FIFO Size Register 024h */ - __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h */ - __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch */ - uint32_t Reserved30[2]; /*!< Reserved 030h */ - __IO uint32_t GCCFG; /*!< General Purpose IO Register 038h */ - __IO uint32_t CID; /*!< User ID Register 03Ch */ - uint32_t Reserved40[48]; /*!< Reserved 0x40-0xFF */ - __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg 100h */ - __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO */ -} USB_OTG_GlobalTypeDef; - -/** - * @brief USB_OTG_device_Registers - */ -typedef struct -{ - __IO uint32_t DCFG; /*!< dev Configuration Register 800h */ - __IO uint32_t DCTL; /*!< dev Control Register 804h */ - __IO uint32_t DSTS; /*!< dev Status Register (RO) 808h */ - uint32_t Reserved0C; /*!< Reserved 80Ch */ - __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask 810h */ - __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask 814h */ - __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg 818h */ - __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask 81Ch */ - uint32_t Reserved20; /*!< Reserved 820h */ - uint32_t Reserved9; /*!< Reserved 824h */ - __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register 828h */ - __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register 82Ch */ - __IO uint32_t DTHRCTL; /*!< dev threshold 830h */ - __IO uint32_t DIEPEMPMSK; /*!< dev empty msk 834h */ - __IO uint32_t DEACHINT; /*!< dedicated EP interrupt 838h */ - __IO uint32_t DEACHMSK; /*!< dedicated EP msk 83Ch */ - uint32_t Reserved40; /*!< dedicated EP mask 840h */ - __IO uint32_t DINEP1MSK; /*!< dedicated EP mask 844h */ - uint32_t Reserved44[15]; /*!< Reserved 844-87Ch */ - __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk 884h */ -} USB_OTG_DeviceTypeDef; - -/** - * @brief USB_OTG_IN_Endpoint-Specific_Register - */ -typedef struct -{ - __IO uint32_t DIEPCTL; /*!< dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ - uint32_t Reserved04; /*!< Reserved 900h + (ep_num * 20h) + 04h */ - __IO uint32_t DIEPINT; /*!< dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ - uint32_t Reserved0C; /*!< Reserved 900h + (ep_num * 20h) + 0Ch */ - __IO uint32_t DIEPTSIZ; /*!< IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ - __IO uint32_t DIEPDMA; /*!< IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ - __IO uint32_t DTXFSTS; /*!< IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ - uint32_t Reserved18; /*!< Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ -} USB_OTG_INEndpointTypeDef; - -/** - * @brief USB_OTG_OUT_Endpoint-Specific_Registers - */ -typedef struct -{ - __IO uint32_t DOEPCTL; /*!< dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h */ - uint32_t Reserved04; /*!< Reserved B00h + (ep_num * 20h) + 04h */ - __IO uint32_t DOEPINT; /*!< dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h */ - uint32_t Reserved0C; /*!< Reserved B00h + (ep_num * 20h) + 0Ch */ - __IO uint32_t DOEPTSIZ; /*!< dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h */ - __IO uint32_t DOEPDMA; /*!< dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h */ - uint32_t Reserved18[2]; /*!< Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch */ -} USB_OTG_OUTEndpointTypeDef; - -/** - * @brief USB_OTG_Host_Mode_Register_Structures - */ -typedef struct -{ - __IO uint32_t HCFG; /*!< Host Configuration Register 400h */ - __IO uint32_t HFIR; /*!< Host Frame Interval Register 404h */ - __IO uint32_t HFNUM; /*!< Host Frame Nbr/Frame Remaining 408h */ - uint32_t Reserved40C; /*!< Reserved 40Ch */ - __IO uint32_t HPTXSTS; /*!< Host Periodic Tx FIFO/ Queue Status 410h */ - __IO uint32_t HAINT; /*!< Host All Channels Interrupt Register 414h */ - __IO uint32_t HAINTMSK; /*!< Host All Channels Interrupt Mask 418h */ -} USB_OTG_HostTypeDef; - -/** - * @brief USB_OTG_Host_Channel_Specific_Registers - */ -typedef struct -{ - __IO uint32_t HCCHAR; /*!< Host Channel Characteristics Register 500h */ - __IO uint32_t HCSPLT; /*!< Host Channel Split Control Register 504h */ - __IO uint32_t HCINT; /*!< Host Channel Interrupt Register 508h */ - __IO uint32_t HCINTMSK; /*!< Host Channel Interrupt Mask Register 50Ch */ - __IO uint32_t HCTSIZ; /*!< Host Channel Transfer Size Register 510h */ - __IO uint32_t HCDMA; /*!< Host Channel DMA Address Register 514h */ - uint32_t Reserved[2]; /*!< Reserved */ -} USB_OTG_HostChannelTypeDef; - -/** - * @} - */ - -/** @addtogroup Peripheral_memory_map - * @{ - */ -#define FLASH_BASE 0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region */ -#define SRAM1_BASE 0x20000000UL /*!< SRAM1(128 KB) base address in the alias region */ -#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */ -#define SRAM1_BB_BASE 0x22000000UL /*!< SRAM1(128 KB) base address in the bit-band region */ -#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */ -#define BKPSRAM_BB_BASE 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */ -#define FLASH_END 0x0807FFFFUL /*!< FLASH end address */ -#define FLASH_OTP_BASE 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ -#define FLASH_OTP_END 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ - -/* Legacy defines */ -#define SRAM_BASE SRAM1_BASE -#define SRAM_BB_BASE SRAM1_BB_BASE - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) -#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) -#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000UL) - -/*!< APB1 peripherals */ -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000UL) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400UL) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800UL) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00UL) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800UL) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00UL) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000UL) -#define I2S2ext_BASE (APB1PERIPH_BASE + 0x3400UL) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) -#define I2S3ext_BASE (APB1PERIPH_BASE + 0x4000UL) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400UL) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400UL) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800UL) -#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00UL) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000UL) - -/*!< APB2 peripherals */ -#define TIM1_BASE (APB2PERIPH_BASE + 0x0000UL) -#define USART1_BASE (APB2PERIPH_BASE + 0x1000UL) -#define USART6_BASE (APB2PERIPH_BASE + 0x1400UL) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2000UL) -#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300UL) -/* Legacy define */ -#define ADC_BASE ADC1_COMMON_BASE -#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00UL) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000UL) -#define SPI4_BASE (APB2PERIPH_BASE + 0x3400UL) -#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800UL) -#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00UL) -#define TIM9_BASE (APB2PERIPH_BASE + 0x4000UL) -#define TIM10_BASE (APB2PERIPH_BASE + 0x4400UL) -#define TIM11_BASE (APB2PERIPH_BASE + 0x4800UL) -#define SPI5_BASE (APB2PERIPH_BASE + 0x5000UL) - -/*!< AHB1 peripherals */ -#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL) -#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL) -#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800UL) -#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00UL) -#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000UL) -#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00UL) -#define CRC_BASE (AHB1PERIPH_BASE + 0x3000UL) -#define RCC_BASE (AHB1PERIPH_BASE + 0x3800UL) -#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00UL) -#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000UL) -#define DMA1_Stream0_BASE (DMA1_BASE + 0x010UL) -#define DMA1_Stream1_BASE (DMA1_BASE + 0x028UL) -#define DMA1_Stream2_BASE (DMA1_BASE + 0x040UL) -#define DMA1_Stream3_BASE (DMA1_BASE + 0x058UL) -#define DMA1_Stream4_BASE (DMA1_BASE + 0x070UL) -#define DMA1_Stream5_BASE (DMA1_BASE + 0x088UL) -#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0UL) -#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8UL) -#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400UL) -#define DMA2_Stream0_BASE (DMA2_BASE + 0x010UL) -#define DMA2_Stream1_BASE (DMA2_BASE + 0x028UL) -#define DMA2_Stream2_BASE (DMA2_BASE + 0x040UL) -#define DMA2_Stream3_BASE (DMA2_BASE + 0x058UL) -#define DMA2_Stream4_BASE (DMA2_BASE + 0x070UL) -#define DMA2_Stream5_BASE (DMA2_BASE + 0x088UL) -#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0UL) -#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8UL) - - -/*!< Debug MCU registers base address */ -#define DBGMCU_BASE 0xE0042000UL -/*!< USB registers base address */ -#define USB_OTG_FS_PERIPH_BASE 0x50000000UL - -#define USB_OTG_GLOBAL_BASE 0x000UL -#define USB_OTG_DEVICE_BASE 0x800UL -#define USB_OTG_IN_ENDPOINT_BASE 0x900UL -#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL -#define USB_OTG_EP_REG_SIZE 0x20UL -#define USB_OTG_HOST_BASE 0x400UL -#define USB_OTG_HOST_PORT_BASE 0x440UL -#define USB_OTG_HOST_CHANNEL_BASE 0x500UL -#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL -#define USB_OTG_PCGCCTL_BASE 0xE00UL -#define USB_OTG_FIFO_BASE 0x1000UL -#define USB_OTG_FIFO_SIZE 0x1000UL - -#define UID_BASE 0x1FFF7A10UL /*!< Unique device ID register base address */ -#define FLASHSIZE_BASE 0x1FFF7A22UL /*!< FLASH Size register base address */ -#define PACKAGE_BASE 0x1FFF7BF0UL /*!< Package size register base address */ -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define I2S2ext ((SPI_TypeDef *) I2S2ext_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define I2S3ext ((SPI_TypeDef *) I2S3ext_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define I2C3 ((I2C_TypeDef *) I2C3_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) -/* Legacy define */ -#define ADC ADC1_COMMON -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define SPI4 ((SPI_TypeDef *) SPI4_BASE) -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define SPI5 ((SPI_TypeDef *) SPI5_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) -#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) -#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) -#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) -#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) -#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) -#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) -#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) -#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) -#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) -#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) -#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) -#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) -#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) -#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) -#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - -/** @addtogroup Hardware_Constant_Definition - * @{ - */ -#define LSI_STARTUP_TIME 40U /*!< LSI Maximum startup time in us */ -/** - * @} - */ - -/** @addtogroup Peripheral_Registers_Bits_Definition -* @{ -*/ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* Analog to Digital Converter */ -/* */ -/******************************************************************************/ - -/******************** Bit definition for ADC_SR register ********************/ -#define ADC_SR_AWD_Pos (0U) -#define ADC_SR_AWD_Msk (0x1UL << ADC_SR_AWD_Pos) /*!< 0x00000001 */ -#define ADC_SR_AWD ADC_SR_AWD_Msk /*!> SCB_CCSIDR_ASSOCIATIVITY_Pos) -#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) - -#ifndef __SCB_DCACHE_LINE_SIZE -#define __SCB_DCACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ -#endif - -#ifndef __SCB_ICACHE_LINE_SIZE -#define __SCB_ICACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ -#endif - -/** - \brief Enable I-Cache - \details Turns on I-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */ - - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable I-Cache - \details Turns off I-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate I-Cache - \details Invalidates I-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; - __DSB(); - __ISB(); - #endif -} - - -/** - \brief I-Cache Invalidate by address - \details Invalidates I-Cache for the given address. - I-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - I-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] isize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateICache_by_Addr (volatile void *addr, int32_t isize) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if ( isize > 0 ) { - int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_ICACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->ICIMVAU = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_ICACHE_LINE_SIZE; - op_size -= __SCB_ICACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief Enable D-Cache - \details Turns on D-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */ - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - __DSB(); - - SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable D-Cache - \details Turns off D-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate D-Cache - \details Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean D-Cache - \details Cleans D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | - ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean & Invalidate D-Cache - \details Cleans and Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief D-Cache Invalidate by address - \details Invalidates D-Cache for the given address. - D-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateDCache_by_Addr (volatile void *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean by address - \details Cleans D-Cache for the given address - D-Cache is cleaned starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanDCache_by_Addr (volatile void *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean and Invalidate by address - \details Cleans and invalidates D_Cache for the given address - D-Cache is cleaned and invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned and invalidated. - \param[in] addr address (aligned to 32-byte boundary) - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache_by_Addr (volatile void *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - -/*@} end of CMSIS_Core_CacheFunctions */ - -#endif /* ARM_CACHEL1_ARMV7_H */ diff --git a/software/bootloader/Drivers/CMSIS/Include/cmsis_armcc.h b/software/bootloader/Drivers/CMSIS/Include/cmsis_armcc.h deleted file mode 100644 index a955d47..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/cmsis_armcc.h +++ /dev/null @@ -1,888 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armcc.h - * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file - * @version V5.3.2 - * @date 27. May 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __CMSIS_ARMCC_H -#define __CMSIS_ARMCC_H - - -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) - #error "Please use Arm Compiler Toolchain V4.0.677 or later!" -#endif - -/* CMSIS compiler control architecture macros */ -#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ - (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) - #define __ARM_ARCH_6M__ 1 -#endif - -#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) - #define __ARM_ARCH_7M__ 1 -#endif - -#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) - #define __ARM_ARCH_7EM__ 1 -#endif - - /* __ARM_ARCH_8M_BASE__ not applicable */ - /* __ARM_ARCH_8M_MAIN__ not applicable */ - /* __ARM_ARCH_8_1M_MAIN__ not applicable */ - -/* CMSIS compiler control DSP macros */ -#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - #define __ARM_FEATURE_DSP 1 -#endif - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE __inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline -#endif -#ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE static __forceinline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __declspec(noreturn) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed)) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT __packed struct -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION __packed union -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __memory_changed() -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START -#define __PROGRAM_START __main -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET"))) -#endif - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __nop - - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI __wfi - - -/** - \brief Wait For Event - \details 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. - */ -#define __WFE __wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __sev - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -#define __ISB() __isb(0xF) - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __dsb(0xF) - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __dmb(0xF) - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV __rev - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) -{ - rev16 r0, r0 - bx lr -} -#endif - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) -{ - revsh r0, r0 - bx lr -} -#endif - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -#define __ROR __ror - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __breakpoint(value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - #define __RBIT __rbit -#else -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ - - result = value; /* r will be reversed bits of v; first get LSB of v */ - for (value >>= 1U; value != 0U; value >>= 1U) - { - result <<= 1U; - result |= value & 1U; - s--; - } - result <<= s; /* shift when v's highest bits are zero */ - return result; -} -#endif - - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __clz - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) -#else - #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) -#else - #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) -#else - #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXB(value, ptr) __strex(value, ptr) -#else - #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXH(value, ptr) __strex(value, ptr) -#else - #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXW(value, ptr) __strex(value, ptr) -#else - #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __clrex - - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __ssat - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __usat - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) -{ - rrx r0, r0 - bx lr -} -#endif - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRBT(value, ptr) __strt(value, ptr) - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRHT(value, ptr) __strt(value, ptr) - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRT(value, ptr) __strt(value, ptr) - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) -{ - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; -} - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) -{ - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -/* intrinsic void __enable_irq(); */ - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -/* intrinsic void __disable_irq(); */ - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_INLINE uint32_t __get_CONTROL(void) -{ - register uint32_t __regControl __ASM("control"); - return(__regControl); -} - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - register uint32_t __regControl __ASM("control"); - __regControl = control; - __ISB(); -} - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_INLINE uint32_t __get_IPSR(void) -{ - register uint32_t __regIPSR __ASM("ipsr"); - return(__regIPSR); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_INLINE uint32_t __get_APSR(void) -{ - register uint32_t __regAPSR __ASM("apsr"); - return(__regAPSR); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_INLINE uint32_t __get_xPSR(void) -{ - register uint32_t __regXPSR __ASM("xpsr"); - return(__regXPSR); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - return(__regProcessStackPointer); -} - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - __regProcessStackPointer = topOfProcStack; -} - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - return(__regMainStackPointer); -} - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - __regMainStackPointer = topOfMainStack; -} - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - register uint32_t __regPriMask __ASM("primask"); - return(__regPriMask); -} - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - register uint32_t __regPriMask __ASM("primask"); - __regPriMask = (priMask); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -#define __disable_fault_irq __disable_fiq - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - register uint32_t __regBasePri __ASM("basepri"); - return(__regBasePri); -} - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) -{ - register uint32_t __regBasePri __ASM("basepri"); - __regBasePri = (basePri & 0xFFU); -} - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - register uint32_t __regBasePriMax __ASM("basepri_max"); - __regBasePriMax = (basePri & 0xFFU); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - return(__regFaultMask); -} - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - __regFaultMask = (faultMask & (uint32_t)1U); -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -__STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - register uint32_t __regfpscr __ASM("fpscr"); - return(__regfpscr); -#else - return(0U); -#endif -} - - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - register uint32_t __regfpscr __ASM("fpscr"); - __regfpscr = (fpscr); -#else - (void)fpscr; -#endif -} - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -#define __SADD8 __sadd8 -#define __QADD8 __qadd8 -#define __SHADD8 __shadd8 -#define __UADD8 __uadd8 -#define __UQADD8 __uqadd8 -#define __UHADD8 __uhadd8 -#define __SSUB8 __ssub8 -#define __QSUB8 __qsub8 -#define __SHSUB8 __shsub8 -#define __USUB8 __usub8 -#define __UQSUB8 __uqsub8 -#define __UHSUB8 __uhsub8 -#define __SADD16 __sadd16 -#define __QADD16 __qadd16 -#define __SHADD16 __shadd16 -#define __UADD16 __uadd16 -#define __UQADD16 __uqadd16 -#define __UHADD16 __uhadd16 -#define __SSUB16 __ssub16 -#define __QSUB16 __qsub16 -#define __SHSUB16 __shsub16 -#define __USUB16 __usub16 -#define __UQSUB16 __uqsub16 -#define __UHSUB16 __uhsub16 -#define __SASX __sasx -#define __QASX __qasx -#define __SHASX __shasx -#define __UASX __uasx -#define __UQASX __uqasx -#define __UHASX __uhasx -#define __SSAX __ssax -#define __QSAX __qsax -#define __SHSAX __shsax -#define __USAX __usax -#define __UQSAX __uqsax -#define __UHSAX __uhsax -#define __USAD8 __usad8 -#define __USADA8 __usada8 -#define __SSAT16 __ssat16 -#define __USAT16 __usat16 -#define __UXTB16 __uxtb16 -#define __UXTAB16 __uxtab16 -#define __SXTB16 __sxtb16 -#define __SXTAB16 __sxtab16 -#define __SMUAD __smuad -#define __SMUADX __smuadx -#define __SMLAD __smlad -#define __SMLADX __smladx -#define __SMLALD __smlald -#define __SMLALDX __smlaldx -#define __SMUSD __smusd -#define __SMUSDX __smusdx -#define __SMLSD __smlsd -#define __SMLSDX __smlsdx -#define __SMLSLD __smlsld -#define __SMLSLDX __smlsldx -#define __SEL __sel -#define __QADD __qadd -#define __QSUB __qsub - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ - ((int64_t)(ARG3) << 32U) ) >> 32U)) - -#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) - -#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) - -#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCC_H */ diff --git a/software/bootloader/Drivers/CMSIS/Include/cmsis_armclang.h b/software/bootloader/Drivers/CMSIS/Include/cmsis_armclang.h deleted file mode 100644 index 6911417..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/cmsis_armclang.h +++ /dev/null @@ -1,1503 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armclang.h - * @brief CMSIS compiler armclang (Arm Compiler 6) header file - * @version V5.4.3 - * @date 27. May 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ - -#ifndef __CMSIS_ARMCLANG_H -#define __CMSIS_ARMCLANG_H - -#pragma clang system_header /* treat file as system include file */ - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE __inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline -#endif -#ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __attribute__((__noreturn__)) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START -#define __PROGRAM_START __main -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET"))) -#endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#ifndef __STACK_SEAL -#define __STACK_SEAL Image$$STACKSEAL$$ZI$$Base -#endif - -#ifndef __TZ_STACK_SEAL_SIZE -#define __TZ_STACK_SEAL_SIZE 8U -#endif - -#ifndef __TZ_STACK_SEAL_VALUE -#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL -#endif - - -__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { - *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; -} -#endif - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_RW_REG(r) "+l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_RW_REG(r) "+r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __builtin_arm_nop - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI __builtin_arm_wfi - - -/** - \brief Wait For Event - \details 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. - */ -#define __WFE __builtin_arm_wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __builtin_arm_sev - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -#define __ISB() __builtin_arm_isb(0xF) - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __builtin_arm_dsb(0xF) - - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __builtin_arm_dmb(0xF) - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV(value) __builtin_bswap32(value) - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV16(value) __ROR(__REV(value), 16) - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REVSH(value) (int16_t)__builtin_bswap16(value) - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - op2 %= 32U; - if (op2 == 0U) - { - return op1; - } - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __ASM volatile ("bkpt "#value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -#define __RBIT __builtin_arm_rbit - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) -{ - /* Even though __builtin_clz produces a CLZ instruction on ARM, formally - __builtin_clz(0) is undefined behaviour, so handle this case specially. - This guarantees ARM-compatible results if happening to compile on a non-ARM - target, and ensures the compiler doesn't decide to activate any - optimisations using the logic "value was passed to __builtin_clz, so it - is non-zero". - ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a - single CLZ instruction. - */ - if (value == 0U) - { - return 32U; - } - return __builtin_clz(value); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDREXB (uint8_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDREXH (uint16_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDREXW (uint32_t)__builtin_arm_ldrex - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXB (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXH (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXW (uint32_t)__builtin_arm_strex - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __builtin_arm_clrex - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __builtin_arm_ssat - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __builtin_arm_usat - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); -} - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) -{ - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; -} - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) -{ - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief Load-Acquire (8 bit) - \details Executes a LDAB instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire (16 bit) - \details Executes a LDAH instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire (32 bit) - \details Executes a LDA instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return(result); -} - - -/** - \brief Store-Release (8 bit) - \details Executes a STLB instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (16 bit) - \details Executes a STLH instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (32 bit) - \details Executes a STL instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Load-Acquire Exclusive (8 bit) - \details Executes a LDAB exclusive instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDAEXB (uint8_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (16 bit) - \details Executes a LDAH exclusive instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDAEXH (uint16_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (32 bit) - \details Executes a LDA exclusive instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDAEX (uint32_t)__builtin_arm_ldaex - - -/** - \brief Store-Release Exclusive (8 bit) - \details Executes a STLB exclusive instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXB (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (16 bit) - \details Executes a STLH exclusive instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXH (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (32 bit) - \details Executes a STL exclusive instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEX (uint32_t)__builtin_arm_stlex - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -#ifndef __ARM_COMPAT_H -__STATIC_FORCEINLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i" : : : "memory"); -} -#endif - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -#ifndef __ARM_COMPAT_H -__STATIC_FORCEINLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i" : : : "memory"); -} -#endif - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Control Register (non-secure) - \details Returns the content of the non-secure Control Register when in secure mode. - \return non-secure Control Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); - __ISB(); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Control Register (non-secure) - \details Writes the given value to the non-secure Control Register when in secure state. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); - __ISB(); -} -#endif - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); -} -#endif - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); -} -#endif - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Stack Pointer (non-secure) - \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. - \return SP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. - \param [in] topOfStack Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) -{ - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); -} -#endif - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Priority Mask (non-secure) - \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Priority Mask (non-secure) - \details Assigns the given value to the non-secure Priority Mask Register when in secure state. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) -{ - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); -} -#endif - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f" : : : "memory"); -} - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f" : : : "memory"); -} - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Base Priority (non-secure) - \details Returns the current value of the non-secure Base Priority register when in secure state. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Base Priority (non-secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); -} -#endif - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Fault Mask (non-secure) - \details Returns the current value of the non-secure Fault Mask register when in secure state. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Fault Mask (non-secure) - \details Assigns the given value to the non-secure Fault Mask register when in secure state. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); -} -#endif - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief Get Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return result; -#endif -} - -#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); -#endif -} -#endif - - -/** - \brief Get Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - return result; -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). - \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. - \param [in] MainStackPtrLimit Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); -#endif -} -#endif - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr -#else -#define __get_FPSCR() ((uint32_t)0U) -#endif - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __set_FPSCR __builtin_arm_set_fpscr -#else -#define __set_FPSCR(x) ((void)(x)) -#endif - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - -#define __SADD8 __builtin_arm_sadd8 -#define __QADD8 __builtin_arm_qadd8 -#define __SHADD8 __builtin_arm_shadd8 -#define __UADD8 __builtin_arm_uadd8 -#define __UQADD8 __builtin_arm_uqadd8 -#define __UHADD8 __builtin_arm_uhadd8 -#define __SSUB8 __builtin_arm_ssub8 -#define __QSUB8 __builtin_arm_qsub8 -#define __SHSUB8 __builtin_arm_shsub8 -#define __USUB8 __builtin_arm_usub8 -#define __UQSUB8 __builtin_arm_uqsub8 -#define __UHSUB8 __builtin_arm_uhsub8 -#define __SADD16 __builtin_arm_sadd16 -#define __QADD16 __builtin_arm_qadd16 -#define __SHADD16 __builtin_arm_shadd16 -#define __UADD16 __builtin_arm_uadd16 -#define __UQADD16 __builtin_arm_uqadd16 -#define __UHADD16 __builtin_arm_uhadd16 -#define __SSUB16 __builtin_arm_ssub16 -#define __QSUB16 __builtin_arm_qsub16 -#define __SHSUB16 __builtin_arm_shsub16 -#define __USUB16 __builtin_arm_usub16 -#define __UQSUB16 __builtin_arm_uqsub16 -#define __UHSUB16 __builtin_arm_uhsub16 -#define __SASX __builtin_arm_sasx -#define __QASX __builtin_arm_qasx -#define __SHASX __builtin_arm_shasx -#define __UASX __builtin_arm_uasx -#define __UQASX __builtin_arm_uqasx -#define __UHASX __builtin_arm_uhasx -#define __SSAX __builtin_arm_ssax -#define __QSAX __builtin_arm_qsax -#define __SHSAX __builtin_arm_shsax -#define __USAX __builtin_arm_usax -#define __UQSAX __builtin_arm_uqsax -#define __UHSAX __builtin_arm_uhsax -#define __USAD8 __builtin_arm_usad8 -#define __USADA8 __builtin_arm_usada8 -#define __SSAT16 __builtin_arm_ssat16 -#define __USAT16 __builtin_arm_usat16 -#define __UXTB16 __builtin_arm_uxtb16 -#define __UXTAB16 __builtin_arm_uxtab16 -#define __SXTB16 __builtin_arm_sxtb16 -#define __SXTAB16 __builtin_arm_sxtab16 -#define __SMUAD __builtin_arm_smuad -#define __SMUADX __builtin_arm_smuadx -#define __SMLAD __builtin_arm_smlad -#define __SMLADX __builtin_arm_smladx -#define __SMLALD __builtin_arm_smlald -#define __SMLALDX __builtin_arm_smlaldx -#define __SMUSD __builtin_arm_smusd -#define __SMUSDX __builtin_arm_smusdx -#define __SMLSD __builtin_arm_smlsd -#define __SMLSDX __builtin_arm_smlsdx -#define __SMLSLD __builtin_arm_smlsld -#define __SMLSLDX __builtin_arm_smlsldx -#define __SEL __builtin_arm_sel -#define __QADD __builtin_arm_qadd -#define __QSUB __builtin_arm_qsub - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) - -#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) - -__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__ARM_FEATURE_DSP == 1) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCLANG_H */ diff --git a/software/bootloader/Drivers/CMSIS/Include/cmsis_armclang_ltm.h b/software/bootloader/Drivers/CMSIS/Include/cmsis_armclang_ltm.h deleted file mode 100644 index 1e255d5..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/cmsis_armclang_ltm.h +++ /dev/null @@ -1,1928 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armclang_ltm.h - * @brief CMSIS compiler armclang (Arm Compiler 6) header file - * @version V1.5.3 - * @date 27. May 2021 - ******************************************************************************/ -/* - * Copyright (c) 2018-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ - -#ifndef __CMSIS_ARMCLANG_H -#define __CMSIS_ARMCLANG_H - -#pragma clang system_header /* treat file as system include file */ - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE __inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline -#endif -#ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __attribute__((__noreturn__)) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START -#define __PROGRAM_START __main -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET"))) -#endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#ifndef __STACK_SEAL -#define __STACK_SEAL Image$$STACKSEAL$$ZI$$Base -#endif - -#ifndef __TZ_STACK_SEAL_SIZE -#define __TZ_STACK_SEAL_SIZE 8U -#endif - -#ifndef __TZ_STACK_SEAL_VALUE -#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL -#endif - - -__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { - *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; -} -#endif - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __builtin_arm_nop - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI __builtin_arm_wfi - - -/** - \brief Wait For Event - \details 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. - */ -#define __WFE __builtin_arm_wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __builtin_arm_sev - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -#define __ISB() __builtin_arm_isb(0xF) - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __builtin_arm_dsb(0xF) - - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __builtin_arm_dmb(0xF) - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV(value) __builtin_bswap32(value) - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV16(value) __ROR(__REV(value), 16) - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REVSH(value) (int16_t)__builtin_bswap16(value) - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - op2 %= 32U; - if (op2 == 0U) - { - return op1; - } - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __ASM volatile ("bkpt "#value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -#define __RBIT __builtin_arm_rbit - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) -{ - /* Even though __builtin_clz produces a CLZ instruction on ARM, formally - __builtin_clz(0) is undefined behaviour, so handle this case specially. - This guarantees ARM-compatible results if happening to compile on a non-ARM - target, and ensures the compiler doesn't decide to activate any - optimisations using the logic "value was passed to __builtin_clz, so it - is non-zero". - ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a - single CLZ instruction. - */ - if (value == 0U) - { - return 32U; - } - return __builtin_clz(value); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDREXB (uint8_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDREXH (uint16_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDREXW (uint32_t)__builtin_arm_ldrex - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXB (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXH (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXW (uint32_t)__builtin_arm_strex - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __builtin_arm_clrex - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __builtin_arm_ssat - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __builtin_arm_usat - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); -} - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) -{ - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; -} - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) -{ - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief Load-Acquire (8 bit) - \details Executes a LDAB instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire (16 bit) - \details Executes a LDAH instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire (32 bit) - \details Executes a LDA instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return(result); -} - - -/** - \brief Store-Release (8 bit) - \details Executes a STLB instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (16 bit) - \details Executes a STLH instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (32 bit) - \details Executes a STL instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Load-Acquire Exclusive (8 bit) - \details Executes a LDAB exclusive instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDAEXB (uint8_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (16 bit) - \details Executes a LDAH exclusive instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDAEXH (uint16_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (32 bit) - \details Executes a LDA exclusive instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDAEX (uint32_t)__builtin_arm_ldaex - - -/** - \brief Store-Release Exclusive (8 bit) - \details Executes a STLB exclusive instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXB (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (16 bit) - \details Executes a STLH exclusive instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXH (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (32 bit) - \details Executes a STL exclusive instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEX (uint32_t)__builtin_arm_stlex - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -#ifndef __ARM_COMPAT_H -__STATIC_FORCEINLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i" : : : "memory"); -} -#endif - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -#ifndef __ARM_COMPAT_H -__STATIC_FORCEINLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i" : : : "memory"); -} -#endif - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Control Register (non-secure) - \details Returns the content of the non-secure Control Register when in secure mode. - \return non-secure Control Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); - __ISB(); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Control Register (non-secure) - \details Writes the given value to the non-secure Control Register when in secure state. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); - __ISB(); -} -#endif - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); -} -#endif - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); -} -#endif - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Stack Pointer (non-secure) - \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. - \return SP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. - \param [in] topOfStack Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) -{ - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); -} -#endif - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Priority Mask (non-secure) - \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Priority Mask (non-secure) - \details Assigns the given value to the non-secure Priority Mask Register when in secure state. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) -{ - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); -} -#endif - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f" : : : "memory"); -} - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f" : : : "memory"); -} - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Base Priority (non-secure) - \details Returns the current value of the non-secure Base Priority register when in secure state. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Base Priority (non-secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); -} -#endif - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Fault Mask (non-secure) - \details Returns the current value of the non-secure Fault Mask register when in secure state. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Fault Mask (non-secure) - \details Assigns the given value to the non-secure Fault Mask register when in secure state. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); -} -#endif - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) - -/** - \brief Get Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return result; -#endif -} - -#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); -#endif -} -#endif - - -/** - \brief Get Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - return result; -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). - \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. - \param [in] MainStackPtrLimit Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); -#endif -} -#endif - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr -#else -#define __get_FPSCR() ((uint32_t)0U) -#endif - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __set_FPSCR __builtin_arm_set_fpscr -#else -#define __set_FPSCR(x) ((void)(x)) -#endif - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - -__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SSAT16(ARG1,ARG2) \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -#define __USAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) - -#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) - -__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__ARM_FEATURE_DSP == 1) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCLANG_H */ diff --git a/software/bootloader/Drivers/CMSIS/Include/cmsis_compiler.h b/software/bootloader/Drivers/CMSIS/Include/cmsis_compiler.h deleted file mode 100644 index adbf296..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/cmsis_compiler.h +++ /dev/null @@ -1,283 +0,0 @@ -/**************************************************************************//** - * @file cmsis_compiler.h - * @brief CMSIS compiler generic header file - * @version V5.1.0 - * @date 09. October 2018 - ******************************************************************************/ -/* - * Copyright (c) 2009-2018 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __CMSIS_COMPILER_H -#define __CMSIS_COMPILER_H - -#include - -/* - * Arm Compiler 4/5 - */ -#if defined ( __CC_ARM ) - #include "cmsis_armcc.h" - - -/* - * Arm Compiler 6.6 LTM (armclang) - */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) - #include "cmsis_armclang_ltm.h" - - /* - * Arm Compiler above 6.10.1 (armclang) - */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) - #include "cmsis_armclang.h" - - -/* - * GNU Compiler - */ -#elif defined ( __GNUC__ ) - #include "cmsis_gcc.h" - - -/* - * IAR Compiler - */ -#elif defined ( __ICCARM__ ) - #include - - -/* - * TI Arm Compiler - */ -#elif defined ( __TI_ARM__ ) - #include - - #ifndef __ASM - #define __ASM __asm - #endif - #ifndef __INLINE - #define __INLINE inline - #endif - #ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline - #endif - #ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __STATIC_INLINE - #endif - #ifndef __NO_RETURN - #define __NO_RETURN __attribute__((noreturn)) - #endif - #ifndef __USED - #define __USED __attribute__((used)) - #endif - #ifndef __WEAK - #define __WEAK __attribute__((weak)) - #endif - #ifndef __PACKED - #define __PACKED __attribute__((packed)) - #endif - #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed)) - #endif - #ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed)) - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) - #endif - #ifndef __RESTRICT - #define __RESTRICT __restrict - #endif - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif - - -/* - * TASKING Compiler - */ -#elif defined ( __TASKING__ ) - /* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all intrinsics, - * Including the CMSIS ones. - */ - - #ifndef __ASM - #define __ASM __asm - #endif - #ifndef __INLINE - #define __INLINE inline - #endif - #ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline - #endif - #ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __STATIC_INLINE - #endif - #ifndef __NO_RETURN - #define __NO_RETURN __attribute__((noreturn)) - #endif - #ifndef __USED - #define __USED __attribute__((used)) - #endif - #ifndef __WEAK - #define __WEAK __attribute__((weak)) - #endif - #ifndef __PACKED - #define __PACKED __packed__ - #endif - #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __packed__ - #endif - #ifndef __PACKED_UNION - #define __PACKED_UNION union __packed__ - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - struct __packed__ T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED - #define __ALIGNED(x) __align(x) - #endif - #ifndef __RESTRICT - #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. - #define __RESTRICT - #endif - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif - - -/* - * COSMIC Compiler - */ -#elif defined ( __CSMC__ ) - #include - - #ifndef __ASM - #define __ASM _asm - #endif - #ifndef __INLINE - #define __INLINE inline - #endif - #ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline - #endif - #ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __STATIC_INLINE - #endif - #ifndef __NO_RETURN - // NO RETURN is automatically detected hence no warning here - #define __NO_RETURN - #endif - #ifndef __USED - #warning No compiler specific solution for __USED. __USED is ignored. - #define __USED - #endif - #ifndef __WEAK - #define __WEAK __weak - #endif - #ifndef __PACKED - #define __PACKED @packed - #endif - #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT @packed struct - #endif - #ifndef __PACKED_UNION - #define __PACKED_UNION @packed union - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - @packed struct T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED - #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. - #define __ALIGNED(x) - #endif - #ifndef __RESTRICT - #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. - #define __RESTRICT - #endif - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif - - -#else - #error Unknown compiler. -#endif - - -#endif /* __CMSIS_COMPILER_H */ - diff --git a/software/bootloader/Drivers/CMSIS/Include/cmsis_gcc.h b/software/bootloader/Drivers/CMSIS/Include/cmsis_gcc.h deleted file mode 100644 index 67bda4e..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/cmsis_gcc.h +++ /dev/null @@ -1,2211 +0,0 @@ -/**************************************************************************//** - * @file cmsis_gcc.h - * @brief CMSIS compiler GCC header file - * @version V5.4.1 - * @date 27. May 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __CMSIS_GCC_H -#define __CMSIS_GCC_H - -/* ignore some GCC warnings */ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wsign-conversion" -#pragma GCC diagnostic ignored "-Wconversion" -#pragma GCC diagnostic ignored "-Wunused-parameter" - -/* Fallback for __has_builtin */ -#ifndef __has_builtin - #define __has_builtin(x) (0) -#endif - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline -#endif -#ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __attribute__((__noreturn__)) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START - -/** - \brief Initializes data and bss sections - \details This default implementations initialized all data and additional bss - sections relying on .copy.table and .zero.table specified properly - in the used linker script. - - */ -__STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void) -{ - extern void _start(void) __NO_RETURN; - - typedef struct { - uint32_t const* src; - uint32_t* dest; - uint32_t wlen; - } __copy_table_t; - - typedef struct { - uint32_t* dest; - uint32_t wlen; - } __zero_table_t; - - extern const __copy_table_t __copy_table_start__; - extern const __copy_table_t __copy_table_end__; - extern const __zero_table_t __zero_table_start__; - extern const __zero_table_t __zero_table_end__; - - for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) { - for(uint32_t i=0u; iwlen; ++i) { - pTable->dest[i] = pTable->src[i]; - } - } - - for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) { - for(uint32_t i=0u; iwlen; ++i) { - pTable->dest[i] = 0u; - } - } - - _start(); -} - -#define __PROGRAM_START __cmsis_start -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP __StackTop -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT __StackLimit -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section(".vectors"))) -#endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#ifndef __STACK_SEAL -#define __STACK_SEAL __StackSeal -#endif - -#ifndef __TZ_STACK_SEAL_SIZE -#define __TZ_STACK_SEAL_SIZE 8U -#endif - -#ifndef __TZ_STACK_SEAL_VALUE -#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL -#endif - - -__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { - *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; -} -#endif - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_RW_REG(r) "+l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_RW_REG(r) "+r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP() __ASM volatile ("nop") - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI() __ASM volatile ("wfi":::"memory") - - -/** - \brief Wait For Event - \details 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. - */ -#define __WFE() __ASM volatile ("wfe":::"memory") - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV() __ASM volatile ("sev") - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -__STATIC_FORCEINLINE void __ISB(void) -{ - __ASM volatile ("isb 0xF":::"memory"); -} - - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -__STATIC_FORCEINLINE void __DSB(void) -{ - __ASM volatile ("dsb 0xF":::"memory"); -} - - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -__STATIC_FORCEINLINE void __DMB(void) -{ - __ASM volatile ("dmb 0xF":::"memory"); -} - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. - \param [in] value Value to reverse - \return Reversed value - */ -__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) -{ -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) - return __builtin_bswap32(value); -#else - uint32_t result; - - __ASM ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return result; -#endif -} - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. - \param [in] value Value to reverse - \return Reversed value - */ -__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) -{ - uint32_t result; - - __ASM ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return result; -} - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. - \param [in] value Value to reverse - \return Reversed value - */ -__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) -{ -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - return (int16_t)__builtin_bswap16(value); -#else - int16_t result; - - __ASM ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return result; -#endif -} - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - op2 %= 32U; - if (op2 == 0U) - { - return op1; - } - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __ASM volatile ("bkpt "#value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) - __ASM ("rbit %0, %1" : "=r" (result) : "r" (value) ); -#else - uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ - - result = value; /* r will be reversed bits of v; first get LSB of v */ - for (value >>= 1U; value != 0U; value >>= 1U) - { - result <<= 1U; - result |= value & 1U; - s--; - } - result <<= s; /* shift when v's highest bits are zero */ -#endif - return result; -} - - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) -{ - /* Even though __builtin_clz produces a CLZ instruction on ARM, formally - __builtin_clz(0) is undefined behaviour, so handle this case specially. - This guarantees ARM-compatible results if happening to compile on a non-ARM - target, and ensures the compiler doesn't decide to activate any - optimisations using the logic "value was passed to __builtin_clz, so it - is non-zero". - ARM GCC 7.3 and possibly earlier will optimise this test away, leaving a - single CLZ instruction. - */ - if (value == 0U) - { - return 32U; - } - return __builtin_clz(value); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); - return(result); -} - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); - return(result); -} - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); - return(result); -} - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); - return(result); -} - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -__STATIC_FORCEINLINE void __CLREX(void) -{ - __ASM volatile ("clrex" ::: "memory"); -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] ARG1 Value to be saturated - \param [in] ARG2 Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT(ARG1, ARG2) \ -__extension__ \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM volatile ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ - __RES; \ - }) - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] ARG1 Value to be saturated - \param [in] ARG2 Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT(ARG1, ARG2) \ -__extension__ \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM volatile ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ - __RES; \ - }) - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); -#endif - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); -#endif - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); -} - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) -{ - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; -} - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) -{ - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief Load-Acquire (8 bit) - \details Executes a LDAB instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire (16 bit) - \details Executes a LDAH instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire (32 bit) - \details Executes a LDA instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return(result); -} - - -/** - \brief Store-Release (8 bit) - \details Executes a STLB instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (16 bit) - \details Executes a STLH instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (32 bit) - \details Executes a STL instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Load-Acquire Exclusive (8 bit) - \details Executes a LDAB exclusive instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire Exclusive (16 bit) - \details Executes a LDAH exclusive instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire Exclusive (32 bit) - \details Executes a LDA exclusive instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return(result); -} - - -/** - \brief Store-Release Exclusive (8 bit) - \details Executes a STLB exclusive instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); - return(result); -} - - -/** - \brief Store-Release Exclusive (16 bit) - \details Executes a STLH exclusive instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); - return(result); -} - - -/** - \brief Store-Release Exclusive (32 bit) - \details Executes a STL exclusive instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); - return(result); -} - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i" : : : "memory"); -} - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i" : : : "memory"); -} - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Control Register (non-secure) - \details Returns the content of the non-secure Control Register when in secure mode. - \return non-secure Control Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); - __ISB(); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Control Register (non-secure) - \details Writes the given value to the non-secure Control Register when in secure state. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); - __ISB(); -} -#endif - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); -} -#endif - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); -} -#endif - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Stack Pointer (non-secure) - \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. - \return SP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. - \param [in] topOfStack Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) -{ - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); -} -#endif - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Priority Mask (non-secure) - \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Priority Mask (non-secure) - \details Assigns the given value to the non-secure Priority Mask Register when in secure state. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) -{ - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); -} -#endif - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f" : : : "memory"); -} - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f" : : : "memory"); -} - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Base Priority (non-secure) - \details Returns the current value of the non-secure Base Priority register when in secure state. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Base Priority (non-secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); -} -#endif - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Fault Mask (non-secure) - \details Returns the current value of the non-secure Fault Mask register when in secure state. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Fault Mask (non-secure) - \details Assigns the given value to the non-secure Fault Mask register when in secure state. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); -} -#endif - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) - -/** - \brief Get Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return result; -#endif -} - -#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); -#endif -} -#endif - - -/** - \brief Get Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - return result; -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). - \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. - \param [in] MainStackPtrLimit Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); -#endif -} -#endif - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#if __has_builtin(__builtin_arm_get_fpscr) -// Re-enable using built-in when GCC has been fixed -// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) - /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ - return __builtin_arm_get_fpscr(); -#else - uint32_t result; - - __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); - return(result); -#endif -#else - return(0U); -#endif -} - - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#if __has_builtin(__builtin_arm_set_fpscr) -// Re-enable using built-in when GCC has been fixed -// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) - /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ - __builtin_arm_set_fpscr(fpscr); -#else - __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); -#endif -#else - (void)fpscr; -#endif -} - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - -__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SSAT16(ARG1, ARG2) \ -__extension__ \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM volatile ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ - __RES; \ - }) - -#define __USAT16(ARG1, ARG2) \ -__extension__ \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM volatile ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ - __RES; \ - }) - -__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTB16_RORn(uint32_t op1, uint32_t rotate) -{ - uint32_t result; - if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) { - __ASM volatile ("sxtb16 %0, %1, ROR %2" : "=r" (result) : "r" (op1), "i" (rotate) ); - } else { - result = __SXTB16(__ROR(op1, rotate)) ; - } - return result; -} - -__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTAB16_RORn(uint32_t op1, uint32_t op2, uint32_t rotate) -{ - uint32_t result; - if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) { - __ASM volatile ("sxtab16 %0, %1, %2, ROR %3" : "=r" (result) : "r" (op1) , "r" (op2) , "i" (rotate)); - } else { - result = __SXTAB16(op1, __ROR(op2, rotate)); - } - return result; -} - - -__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -#define __PKHBT(ARG1,ARG2,ARG3) \ -__extension__ \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -#define __PKHTB(ARG1,ARG2,ARG3) \ -__extension__ \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - if (ARG3 == 0) \ - __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ - else \ - __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - - -__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__ARM_FEATURE_DSP == 1) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#pragma GCC diagnostic pop - -#endif /* __CMSIS_GCC_H */ diff --git a/software/bootloader/Drivers/CMSIS/Include/cmsis_iccarm.h b/software/bootloader/Drivers/CMSIS/Include/cmsis_iccarm.h deleted file mode 100644 index 65b824b..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/cmsis_iccarm.h +++ /dev/null @@ -1,1002 +0,0 @@ -/**************************************************************************//** - * @file cmsis_iccarm.h - * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file - * @version V5.3.0 - * @date 14. April 2021 - ******************************************************************************/ - -//------------------------------------------------------------------------------ -// -// Copyright (c) 2017-2021 IAR Systems -// Copyright (c) 2017-2021 Arm Limited. All rights reserved. -// -// SPDX-License-Identifier: Apache-2.0 -// -// Licensed under the Apache License, Version 2.0 (the "License") -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//------------------------------------------------------------------------------ - - -#ifndef __CMSIS_ICCARM_H__ -#define __CMSIS_ICCARM_H__ - -#ifndef __ICCARM__ - #error This file should only be compiled by ICCARM -#endif - -#pragma system_include - -#define __IAR_FT _Pragma("inline=forced") __intrinsic - -#if (__VER__ >= 8000000) - #define __ICCARM_V8 1 -#else - #define __ICCARM_V8 0 -#endif - -#ifndef __ALIGNED - #if __ICCARM_V8 - #define __ALIGNED(x) __attribute__((aligned(x))) - #elif (__VER__ >= 7080000) - /* Needs IAR language extensions */ - #define __ALIGNED(x) __attribute__((aligned(x))) - #else - #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. - #define __ALIGNED(x) - #endif -#endif - - -/* Define compiler macros for CPU architecture, used in CMSIS 5. - */ -#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ -/* Macros already defined */ -#else - #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) - #define __ARM_ARCH_8M_MAIN__ 1 - #elif defined(__ARM8M_BASELINE__) - #define __ARM_ARCH_8M_BASE__ 1 - #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' - #if __ARM_ARCH == 6 - #define __ARM_ARCH_6M__ 1 - #elif __ARM_ARCH == 7 - #if __ARM_FEATURE_DSP - #define __ARM_ARCH_7EM__ 1 - #else - #define __ARM_ARCH_7M__ 1 - #endif - #endif /* __ARM_ARCH */ - #endif /* __ARM_ARCH_PROFILE == 'M' */ -#endif - -/* Alternativ core deduction for older ICCARM's */ -#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ - !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) - #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) - #define __ARM_ARCH_6M__ 1 - #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) - #define __ARM_ARCH_7M__ 1 - #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) - #define __ARM_ARCH_7EM__ 1 - #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) - #define __ARM_ARCH_8M_BASE__ 1 - #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) - #define __ARM_ARCH_8M_MAIN__ 1 - #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) - #define __ARM_ARCH_8M_MAIN__ 1 - #else - #error "Unknown target." - #endif -#endif - - - -#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 - #define __IAR_M0_FAMILY 1 -#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 - #define __IAR_M0_FAMILY 1 -#else - #define __IAR_M0_FAMILY 0 -#endif - - -#ifndef __ASM - #define __ASM __asm -#endif - -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") -#endif - -#ifndef __INLINE - #define __INLINE inline -#endif - -#ifndef __NO_RETURN - #if __ICCARM_V8 - #define __NO_RETURN __attribute__((__noreturn__)) - #else - #define __NO_RETURN _Pragma("object_attribute=__noreturn") - #endif -#endif - -#ifndef __PACKED - #if __ICCARM_V8 - #define __PACKED __attribute__((packed, aligned(1))) - #else - /* Needs IAR language extensions */ - #define __PACKED __packed - #endif -#endif - -#ifndef __PACKED_STRUCT - #if __ICCARM_V8 - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) - #else - /* Needs IAR language extensions */ - #define __PACKED_STRUCT __packed struct - #endif -#endif - -#ifndef __PACKED_UNION - #if __ICCARM_V8 - #define __PACKED_UNION union __attribute__((packed, aligned(1))) - #else - /* Needs IAR language extensions */ - #define __PACKED_UNION __packed union - #endif -#endif - -#ifndef __RESTRICT - #if __ICCARM_V8 - #define __RESTRICT __restrict - #else - /* Needs IAR language extensions */ - #define __RESTRICT restrict - #endif -#endif - -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline -#endif - -#ifndef __FORCEINLINE - #define __FORCEINLINE _Pragma("inline=forced") -#endif - -#ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE -#endif - -#ifndef __UNALIGNED_UINT16_READ -#pragma language=save -#pragma language=extended -__IAR_FT uint16_t __iar_uint16_read(void const *ptr) -{ - return *(__packed uint16_t*)(ptr); -} -#pragma language=restore -#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) -#endif - - -#ifndef __UNALIGNED_UINT16_WRITE -#pragma language=save -#pragma language=extended -__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) -{ - *(__packed uint16_t*)(ptr) = val;; -} -#pragma language=restore -#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) -#endif - -#ifndef __UNALIGNED_UINT32_READ -#pragma language=save -#pragma language=extended -__IAR_FT uint32_t __iar_uint32_read(void const *ptr) -{ - return *(__packed uint32_t*)(ptr); -} -#pragma language=restore -#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) -#endif - -#ifndef __UNALIGNED_UINT32_WRITE -#pragma language=save -#pragma language=extended -__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) -{ - *(__packed uint32_t*)(ptr) = val;; -} -#pragma language=restore -#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) -#endif - -#ifndef __UNALIGNED_UINT32 /* deprecated */ -#pragma language=save -#pragma language=extended -__packed struct __iar_u32 { uint32_t v; }; -#pragma language=restore -#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) -#endif - -#ifndef __USED - #if __ICCARM_V8 - #define __USED __attribute__((used)) - #else - #define __USED _Pragma("__root") - #endif -#endif - -#undef __WEAK /* undo the definition from DLib_Defaults.h */ -#ifndef __WEAK - #if __ICCARM_V8 - #define __WEAK __attribute__((weak)) - #else - #define __WEAK _Pragma("__weak") - #endif -#endif - -#ifndef __PROGRAM_START -#define __PROGRAM_START __iar_program_start -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP CSTACK$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT CSTACK$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __vector_table -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE @".intvec" -#endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#ifndef __STACK_SEAL -#define __STACK_SEAL STACKSEAL$$Base -#endif - -#ifndef __TZ_STACK_SEAL_SIZE -#define __TZ_STACK_SEAL_SIZE 8U -#endif - -#ifndef __TZ_STACK_SEAL_VALUE -#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL -#endif - -__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { - *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; -} -#endif - -#ifndef __ICCARM_INTRINSICS_VERSION__ - #define __ICCARM_INTRINSICS_VERSION__ 0 -#endif - -#if __ICCARM_INTRINSICS_VERSION__ == 2 - - #if defined(__CLZ) - #undef __CLZ - #endif - #if defined(__REVSH) - #undef __REVSH - #endif - #if defined(__RBIT) - #undef __RBIT - #endif - #if defined(__SSAT) - #undef __SSAT - #endif - #if defined(__USAT) - #undef __USAT - #endif - - #include "iccarm_builtin.h" - - #define __disable_fault_irq __iar_builtin_disable_fiq - #define __disable_irq __iar_builtin_disable_interrupt - #define __enable_fault_irq __iar_builtin_enable_fiq - #define __enable_irq __iar_builtin_enable_interrupt - #define __arm_rsr __iar_builtin_rsr - #define __arm_wsr __iar_builtin_wsr - - - #define __get_APSR() (__arm_rsr("APSR")) - #define __get_BASEPRI() (__arm_rsr("BASEPRI")) - #define __get_CONTROL() (__arm_rsr("CONTROL")) - #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) - - #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - #define __get_FPSCR() (__arm_rsr("FPSCR")) - #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) - #else - #define __get_FPSCR() ( 0 ) - #define __set_FPSCR(VALUE) ((void)VALUE) - #endif - - #define __get_IPSR() (__arm_rsr("IPSR")) - #define __get_MSP() (__arm_rsr("MSP")) - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - #define __get_MSPLIM() (0U) - #else - #define __get_MSPLIM() (__arm_rsr("MSPLIM")) - #endif - #define __get_PRIMASK() (__arm_rsr("PRIMASK")) - #define __get_PSP() (__arm_rsr("PSP")) - - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - #define __get_PSPLIM() (0U) - #else - #define __get_PSPLIM() (__arm_rsr("PSPLIM")) - #endif - - #define __get_xPSR() (__arm_rsr("xPSR")) - - #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) - #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) - -__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) -{ - __arm_wsr("CONTROL", control); - __iar_builtin_ISB(); -} - - #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) - #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) - - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - #define __set_MSPLIM(VALUE) ((void)(VALUE)) - #else - #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) - #endif - #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) - #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - #define __set_PSPLIM(VALUE) ((void)(VALUE)) - #else - #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) - #endif - - #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) - -__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __arm_wsr("CONTROL_NS", control); - __iar_builtin_ISB(); -} - - #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) - #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) - #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) - #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) - #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) - #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) - #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) - #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) - #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) - #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) - #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) - #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) - - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - #define __TZ_get_PSPLIM_NS() (0U) - #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) - #else - #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) - #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) - #endif - - #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) - #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) - - #define __NOP __iar_builtin_no_operation - - #define __CLZ __iar_builtin_CLZ - #define __CLREX __iar_builtin_CLREX - - #define __DMB __iar_builtin_DMB - #define __DSB __iar_builtin_DSB - #define __ISB __iar_builtin_ISB - - #define __LDREXB __iar_builtin_LDREXB - #define __LDREXH __iar_builtin_LDREXH - #define __LDREXW __iar_builtin_LDREX - - #define __RBIT __iar_builtin_RBIT - #define __REV __iar_builtin_REV - #define __REV16 __iar_builtin_REV16 - - __IAR_FT int16_t __REVSH(int16_t val) - { - return (int16_t) __iar_builtin_REVSH(val); - } - - #define __ROR __iar_builtin_ROR - #define __RRX __iar_builtin_RRX - - #define __SEV __iar_builtin_SEV - - #if !__IAR_M0_FAMILY - #define __SSAT __iar_builtin_SSAT - #endif - - #define __STREXB __iar_builtin_STREXB - #define __STREXH __iar_builtin_STREXH - #define __STREXW __iar_builtin_STREX - - #if !__IAR_M0_FAMILY - #define __USAT __iar_builtin_USAT - #endif - - #define __WFE __iar_builtin_WFE - #define __WFI __iar_builtin_WFI - - #if __ARM_MEDIA__ - #define __SADD8 __iar_builtin_SADD8 - #define __QADD8 __iar_builtin_QADD8 - #define __SHADD8 __iar_builtin_SHADD8 - #define __UADD8 __iar_builtin_UADD8 - #define __UQADD8 __iar_builtin_UQADD8 - #define __UHADD8 __iar_builtin_UHADD8 - #define __SSUB8 __iar_builtin_SSUB8 - #define __QSUB8 __iar_builtin_QSUB8 - #define __SHSUB8 __iar_builtin_SHSUB8 - #define __USUB8 __iar_builtin_USUB8 - #define __UQSUB8 __iar_builtin_UQSUB8 - #define __UHSUB8 __iar_builtin_UHSUB8 - #define __SADD16 __iar_builtin_SADD16 - #define __QADD16 __iar_builtin_QADD16 - #define __SHADD16 __iar_builtin_SHADD16 - #define __UADD16 __iar_builtin_UADD16 - #define __UQADD16 __iar_builtin_UQADD16 - #define __UHADD16 __iar_builtin_UHADD16 - #define __SSUB16 __iar_builtin_SSUB16 - #define __QSUB16 __iar_builtin_QSUB16 - #define __SHSUB16 __iar_builtin_SHSUB16 - #define __USUB16 __iar_builtin_USUB16 - #define __UQSUB16 __iar_builtin_UQSUB16 - #define __UHSUB16 __iar_builtin_UHSUB16 - #define __SASX __iar_builtin_SASX - #define __QASX __iar_builtin_QASX - #define __SHASX __iar_builtin_SHASX - #define __UASX __iar_builtin_UASX - #define __UQASX __iar_builtin_UQASX - #define __UHASX __iar_builtin_UHASX - #define __SSAX __iar_builtin_SSAX - #define __QSAX __iar_builtin_QSAX - #define __SHSAX __iar_builtin_SHSAX - #define __USAX __iar_builtin_USAX - #define __UQSAX __iar_builtin_UQSAX - #define __UHSAX __iar_builtin_UHSAX - #define __USAD8 __iar_builtin_USAD8 - #define __USADA8 __iar_builtin_USADA8 - #define __SSAT16 __iar_builtin_SSAT16 - #define __USAT16 __iar_builtin_USAT16 - #define __UXTB16 __iar_builtin_UXTB16 - #define __UXTAB16 __iar_builtin_UXTAB16 - #define __SXTB16 __iar_builtin_SXTB16 - #define __SXTAB16 __iar_builtin_SXTAB16 - #define __SMUAD __iar_builtin_SMUAD - #define __SMUADX __iar_builtin_SMUADX - #define __SMMLA __iar_builtin_SMMLA - #define __SMLAD __iar_builtin_SMLAD - #define __SMLADX __iar_builtin_SMLADX - #define __SMLALD __iar_builtin_SMLALD - #define __SMLALDX __iar_builtin_SMLALDX - #define __SMUSD __iar_builtin_SMUSD - #define __SMUSDX __iar_builtin_SMUSDX - #define __SMLSD __iar_builtin_SMLSD - #define __SMLSDX __iar_builtin_SMLSDX - #define __SMLSLD __iar_builtin_SMLSLD - #define __SMLSLDX __iar_builtin_SMLSLDX - #define __SEL __iar_builtin_SEL - #define __QADD __iar_builtin_QADD - #define __QSUB __iar_builtin_QSUB - #define __PKHBT __iar_builtin_PKHBT - #define __PKHTB __iar_builtin_PKHTB - #endif - -#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ - - #if __IAR_M0_FAMILY - /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ - #define __CLZ __cmsis_iar_clz_not_active - #define __SSAT __cmsis_iar_ssat_not_active - #define __USAT __cmsis_iar_usat_not_active - #define __RBIT __cmsis_iar_rbit_not_active - #define __get_APSR __cmsis_iar_get_APSR_not_active - #endif - - - #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) - #define __get_FPSCR __cmsis_iar_get_FPSR_not_active - #define __set_FPSCR __cmsis_iar_set_FPSR_not_active - #endif - - #ifdef __INTRINSICS_INCLUDED - #error intrinsics.h is already included previously! - #endif - - #include - - #if __IAR_M0_FAMILY - /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ - #undef __CLZ - #undef __SSAT - #undef __USAT - #undef __RBIT - #undef __get_APSR - - __STATIC_INLINE uint8_t __CLZ(uint32_t data) - { - if (data == 0U) { return 32U; } - - uint32_t count = 0U; - uint32_t mask = 0x80000000U; - - while ((data & mask) == 0U) - { - count += 1U; - mask = mask >> 1U; - } - return count; - } - - __STATIC_INLINE uint32_t __RBIT(uint32_t v) - { - uint8_t sc = 31U; - uint32_t r = v; - for (v >>= 1U; v; v >>= 1U) - { - r <<= 1U; - r |= v & 1U; - sc--; - } - return (r << sc); - } - - __STATIC_INLINE uint32_t __get_APSR(void) - { - uint32_t res; - __asm("MRS %0,APSR" : "=r" (res)); - return res; - } - - #endif - - #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) - #undef __get_FPSCR - #undef __set_FPSCR - #define __get_FPSCR() (0) - #define __set_FPSCR(VALUE) ((void)VALUE) - #endif - - #pragma diag_suppress=Pe940 - #pragma diag_suppress=Pe177 - - #define __enable_irq __enable_interrupt - #define __disable_irq __disable_interrupt - #define __NOP __no_operation - - #define __get_xPSR __get_PSR - - #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) - - __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) - { - return __LDREX((unsigned long *)ptr); - } - - __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) - { - return __STREX(value, (unsigned long *)ptr); - } - #endif - - - /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ - #if (__CORTEX_M >= 0x03) - - __IAR_FT uint32_t __RRX(uint32_t value) - { - uint32_t result; - __ASM volatile("RRX %0, %1" : "=r"(result) : "r" (value)); - return(result); - } - - __IAR_FT void __set_BASEPRI_MAX(uint32_t value) - { - __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); - } - - - #define __enable_fault_irq __enable_fiq - #define __disable_fault_irq __disable_fiq - - - #endif /* (__CORTEX_M >= 0x03) */ - - __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) - { - return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); - } - - #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) - - __IAR_FT uint32_t __get_MSPLIM(void) - { - uint32_t res; - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - res = 0U; - #else - __asm volatile("MRS %0,MSPLIM" : "=r" (res)); - #endif - return res; - } - - __IAR_FT void __set_MSPLIM(uint32_t value) - { - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)value; - #else - __asm volatile("MSR MSPLIM,%0" :: "r" (value)); - #endif - } - - __IAR_FT uint32_t __get_PSPLIM(void) - { - uint32_t res; - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - res = 0U; - #else - __asm volatile("MRS %0,PSPLIM" : "=r" (res)); - #endif - return res; - } - - __IAR_FT void __set_PSPLIM(uint32_t value) - { - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)value; - #else - __asm volatile("MSR PSPLIM,%0" :: "r" (value)); - #endif - } - - __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) - { - __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); - __iar_builtin_ISB(); - } - - __IAR_FT uint32_t __TZ_get_PSP_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,PSP_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_PSP_NS(uint32_t value) - { - __asm volatile("MSR PSP_NS,%0" :: "r" (value)); - } - - __IAR_FT uint32_t __TZ_get_MSP_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,MSP_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_MSP_NS(uint32_t value) - { - __asm volatile("MSR MSP_NS,%0" :: "r" (value)); - } - - __IAR_FT uint32_t __TZ_get_SP_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,SP_NS" : "=r" (res)); - return res; - } - __IAR_FT void __TZ_set_SP_NS(uint32_t value) - { - __asm volatile("MSR SP_NS,%0" :: "r" (value)); - } - - __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) - { - __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); - } - - __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) - { - __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); - } - - __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) - { - __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); - } - - __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) - { - uint32_t res; - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - res = 0U; - #else - __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); - #endif - return res; - } - - __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) - { - #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ - (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)value; - #else - __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); - #endif - } - - __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) - { - uint32_t res; - __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); - return res; - } - - __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) - { - __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); - } - - #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ - -#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ - -#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) - -#if __IAR_M0_FAMILY - __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) - { - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; - } - - __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) - { - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; - } -#endif - -#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ - - __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) - { - uint32_t res; - __ASM volatile ("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); - return ((uint8_t)res); - } - - __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) - { - uint32_t res; - __ASM volatile ("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); - return ((uint16_t)res); - } - - __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) - { - uint32_t res; - __ASM volatile ("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); - return res; - } - - __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) - { - __ASM volatile ("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); - } - - __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) - { - __ASM volatile ("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); - } - - __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) - { - __ASM volatile ("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); - } - -#endif /* (__CORTEX_M >= 0x03) */ - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) - - - __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) - { - uint32_t res; - __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); - return ((uint8_t)res); - } - - __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) - { - uint32_t res; - __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); - return ((uint16_t)res); - } - - __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) - { - uint32_t res; - __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); - return res; - } - - __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) - { - __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); - } - - __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) - { - __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); - } - - __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) - { - __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); - } - - __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) - { - uint32_t res; - __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); - return ((uint8_t)res); - } - - __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) - { - uint32_t res; - __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); - return ((uint16_t)res); - } - - __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) - { - uint32_t res; - __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); - return res; - } - - __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) - { - uint32_t res; - __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); - return res; - } - - __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) - { - uint32_t res; - __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); - return res; - } - - __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) - { - uint32_t res; - __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); - return res; - } - -#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ - -#undef __IAR_FT -#undef __IAR_M0_FAMILY -#undef __ICCARM_V8 - -#pragma diag_default=Pe940 -#pragma diag_default=Pe177 - -#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) - -#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) - -#endif /* __CMSIS_ICCARM_H__ */ diff --git a/software/bootloader/Drivers/CMSIS/Include/cmsis_version.h b/software/bootloader/Drivers/CMSIS/Include/cmsis_version.h deleted file mode 100644 index 8b4765f..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/cmsis_version.h +++ /dev/null @@ -1,39 +0,0 @@ -/**************************************************************************//** - * @file cmsis_version.h - * @brief CMSIS Core(M) Version definitions - * @version V5.0.5 - * @date 02. February 2022 - ******************************************************************************/ -/* - * Copyright (c) 2009-2022 ARM Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CMSIS_VERSION_H -#define __CMSIS_VERSION_H - -/* CMSIS Version definitions */ -#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ -#define __CM_CMSIS_VERSION_SUB ( 6U) /*!< [15:0] CMSIS Core(M) sub version */ -#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ - __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ -#endif diff --git a/software/bootloader/Drivers/CMSIS/Include/core_armv81mml.h b/software/bootloader/Drivers/CMSIS/Include/core_armv81mml.h deleted file mode 100644 index 94128a1..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_armv81mml.h +++ /dev/null @@ -1,4228 +0,0 @@ -/**************************************************************************//** - * @file core_armv81mml.h - * @brief CMSIS Armv8.1-M Mainline Core Peripheral Access Layer Header File - * @version V1.4.2 - * @date 13. October 2021 - ******************************************************************************/ -/* - * Copyright (c) 2018-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_ARMV81MML_H_GENERIC -#define __CORE_ARMV81MML_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_ARMV81MML - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS ARMV81MML definitions */ -#define __ARMv81MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __ARMv81MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __ARMv81MML_CMSIS_VERSION ((__ARMv81MML_CMSIS_VERSION_MAIN << 16U) | \ - __ARMv81MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (81U) /*!< Cortex-M Core */ - -#if defined ( __CC_ARM ) - #error Legacy Arm Compiler does not support Armv8.1-M target architecture. -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV81MML_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_ARMV81MML_H_DEPENDANT -#define __CORE_ARMV81MML_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __ARMv81MML_REV - #define __ARMv81MML_REV 0x0000U - #warning "__ARMv81MML_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #if __FPU_PRESENT != 0U - #ifndef __FPU_DP - #define __FPU_DP 0U - #warning "__FPU_DP not defined in device header file; using default!" - #endif - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __PMU_PRESENT - #define __PMU_PRESENT 0U - #warning "__PMU_PRESENT not defined in device header file; using default!" - #endif - - #if __PMU_PRESENT != 0U - #ifndef __PMU_NUM_EVENTCNT - #define __PMU_NUM_EVENTCNT 2U - #warning "__PMU_NUM_EVENTCNT not defined in device header file; using default!" - #elif (__PMU_NUM_EVENTCNT > 31 || __PMU_NUM_EVENTCNT < 2) - #error "__PMU_NUM_EVENTCNT is out of range in device header file!" */ - #endif - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group ARMv81MML */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - __IOM uint32_t RFSR; /*!< Offset: 0x204 (R/W) RAS Fault Status Register */ - uint32_t RESERVED4[14U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_IESB_Pos 5U /*!< SCB AIRCR: Implicit ESB Enable Position */ -#define SCB_AIRCR_IESB_Msk (1UL << SCB_AIRCR_IESB_Pos) /*!< SCB AIRCR: Implicit ESB Enable Mask */ - -#define SCB_AIRCR_DIT_Pos 4U /*!< SCB AIRCR: Data Independent Timing Position */ -#define SCB_AIRCR_DIT_Msk (1UL << SCB_AIRCR_DIT_Pos) /*!< SCB AIRCR: Data Independent Timing Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_TRD_Pos 20U /*!< SCB CCR: TRD Position */ -#define SCB_CCR_TRD_Msk (1UL << SCB_CCR_TRD_Pos) /*!< SCB CCR: TRD Mask */ - -#define SCB_CCR_LOB_Pos 19U /*!< SCB CCR: LOB Position */ -#define SCB_CCR_LOB_Msk (1UL << SCB_CCR_LOB_Pos) /*!< SCB CCR: LOB Mask */ - -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_PMU_Pos 5U /*!< SCB DFSR: PMU Position */ -#define SCB_DFSR_PMU_Msk (1UL << SCB_DFSR_PMU_Pos) /*!< SCB DFSR: PMU Mask */ - -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CP7_Pos 7U /*!< SCB NSACR: CP7 Position */ -#define SCB_NSACR_CP7_Msk (1UL << SCB_NSACR_CP7_Pos) /*!< SCB NSACR: CP7 Mask */ - -#define SCB_NSACR_CP6_Pos 6U /*!< SCB NSACR: CP6 Position */ -#define SCB_NSACR_CP6_Msk (1UL << SCB_NSACR_CP6_Pos) /*!< SCB NSACR: CP6 Mask */ - -#define SCB_NSACR_CP5_Pos 5U /*!< SCB NSACR: CP5 Position */ -#define SCB_NSACR_CP5_Msk (1UL << SCB_NSACR_CP5_Pos) /*!< SCB NSACR: CP5 Mask */ - -#define SCB_NSACR_CP4_Pos 4U /*!< SCB NSACR: CP4 Position */ -#define SCB_NSACR_CP4_Msk (1UL << SCB_NSACR_CP4_Pos) /*!< SCB NSACR: CP4 Mask */ - -#define SCB_NSACR_CP3_Pos 3U /*!< SCB NSACR: CP3 Position */ -#define SCB_NSACR_CP3_Msk (1UL << SCB_NSACR_CP3_Pos) /*!< SCB NSACR: CP3 Mask */ - -#define SCB_NSACR_CP2_Pos 2U /*!< SCB NSACR: CP2 Position */ -#define SCB_NSACR_CP2_Msk (1UL << SCB_NSACR_CP2_Pos) /*!< SCB NSACR: CP2 Mask */ - -#define SCB_NSACR_CP1_Pos 1U /*!< SCB NSACR: CP1 Position */ -#define SCB_NSACR_CP1_Msk (1UL << SCB_NSACR_CP1_Pos) /*!< SCB NSACR: CP1 Mask */ - -#define SCB_NSACR_CP0_Pos 0U /*!< SCB NSACR: CP0 Position */ -#define SCB_NSACR_CP0_Msk (1UL /*<< SCB_NSACR_CP0_Pos*/) /*!< SCB NSACR: CP0 Mask */ - -/* SCB Debug Feature Register 0 Definitions */ -#define SCB_ID_DFR_UDE_Pos 28U /*!< SCB ID_DFR: UDE Position */ -#define SCB_ID_DFR_UDE_Msk (0xFUL << SCB_ID_DFR_UDE_Pos) /*!< SCB ID_DFR: UDE Mask */ - -#define SCB_ID_DFR_MProfDbg_Pos 20U /*!< SCB ID_DFR: MProfDbg Position */ -#define SCB_ID_DFR_MProfDbg_Msk (0xFUL << SCB_ID_DFR_MProfDbg_Pos) /*!< SCB ID_DFR: MProfDbg Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB RAS Fault Status Register Definitions */ -#define SCB_RFSR_V_Pos 31U /*!< SCB RFSR: V Position */ -#define SCB_RFSR_V_Msk (1UL << SCB_RFSR_V_Pos) /*!< SCB RFSR: V Mask */ - -#define SCB_RFSR_IS_Pos 16U /*!< SCB RFSR: IS Position */ -#define SCB_RFSR_IS_Msk (0x7FFFUL << SCB_RFSR_IS_Pos) /*!< SCB RFSR: IS Mask */ - -#define SCB_RFSR_UET_Pos 0U /*!< SCB RFSR: UET Position */ -#define SCB_RFSR_UET_Msk (3UL /*<< SCB_RFSR_UET_Pos*/) /*!< SCB RFSR: UET Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[3U]; - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) ITM Device Type Register */ - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFmt_Pos 0U /*!< TPI FFCR: EnFmt Position */ -#define TPI_FFCR_EnFmt_Msk (0x3UL << /*TPI_FFCR_EnFmt_Pos*/) /*!< TPI FFCR: EnFmt Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_PMU Performance Monitoring Unit (PMU) - \brief Type definitions for the Performance Monitoring Unit (PMU) - @{ - */ - -/** - \brief Structure type to access the Performance Monitoring Unit (PMU). - */ -typedef struct -{ - __IOM uint32_t EVCNTR[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x0 (R/W) PMU Event Counter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED0[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCNTR; /*!< Offset: 0x7C (R/W) PMU Cycle Counter Register */ - uint32_t RESERVED1[224]; - __IOM uint32_t EVTYPER[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x400 (R/W) PMU Event Type and Filter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED2[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCFILTR; /*!< Offset: 0x47C (R/W) PMU Cycle Counter Filter Register */ - uint32_t RESERVED3[480]; - __IOM uint32_t CNTENSET; /*!< Offset: 0xC00 (R/W) PMU Count Enable Set Register */ - uint32_t RESERVED4[7]; - __IOM uint32_t CNTENCLR; /*!< Offset: 0xC20 (R/W) PMU Count Enable Clear Register */ - uint32_t RESERVED5[7]; - __IOM uint32_t INTENSET; /*!< Offset: 0xC40 (R/W) PMU Interrupt Enable Set Register */ - uint32_t RESERVED6[7]; - __IOM uint32_t INTENCLR; /*!< Offset: 0xC60 (R/W) PMU Interrupt Enable Clear Register */ - uint32_t RESERVED7[7]; - __IOM uint32_t OVSCLR; /*!< Offset: 0xC80 (R/W) PMU Overflow Flag Status Clear Register */ - uint32_t RESERVED8[7]; - __IOM uint32_t SWINC; /*!< Offset: 0xCA0 (R/W) PMU Software Increment Register */ - uint32_t RESERVED9[7]; - __IOM uint32_t OVSSET; /*!< Offset: 0xCC0 (R/W) PMU Overflow Flag Status Set Register */ - uint32_t RESERVED10[79]; - __IOM uint32_t TYPE; /*!< Offset: 0xE00 (R/W) PMU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0xE04 (R/W) PMU Control Register */ - uint32_t RESERVED11[108]; - __IOM uint32_t AUTHSTATUS; /*!< Offset: 0xFB8 (R/W) PMU Authentication Status Register */ - __IOM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/W) PMU Device Architecture Register */ - uint32_t RESERVED12[3]; - __IOM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/W) PMU Device Type Register */ - __IOM uint32_t PIDR4; /*!< Offset: 0xFD0 (R/W) PMU Peripheral Identification Register 4 */ - uint32_t RESERVED13[3]; - __IOM uint32_t PIDR0; /*!< Offset: 0xFE0 (R/W) PMU Peripheral Identification Register 0 */ - __IOM uint32_t PIDR1; /*!< Offset: 0xFE4 (R/W) PMU Peripheral Identification Register 1 */ - __IOM uint32_t PIDR2; /*!< Offset: 0xFE8 (R/W) PMU Peripheral Identification Register 2 */ - __IOM uint32_t PIDR3; /*!< Offset: 0xFEC (R/W) PMU Peripheral Identification Register 3 */ - __IOM uint32_t CIDR0; /*!< Offset: 0xFF0 (R/W) PMU Component Identification Register 0 */ - __IOM uint32_t CIDR1; /*!< Offset: 0xFF4 (R/W) PMU Component Identification Register 1 */ - __IOM uint32_t CIDR2; /*!< Offset: 0xFF8 (R/W) PMU Component Identification Register 2 */ - __IOM uint32_t CIDR3; /*!< Offset: 0xFFC (R/W) PMU Component Identification Register 3 */ -} PMU_Type; - -/** \brief PMU Event Counter Registers (0-30) Definitions */ - -#define PMU_EVCNTR_CNT_Pos 0U /*!< PMU EVCNTR: Counter Position */ -#define PMU_EVCNTR_CNT_Msk (0xFFFFUL /*<< PMU_EVCNTRx_CNT_Pos*/) /*!< PMU EVCNTR: Counter Mask */ - -/** \brief PMU Event Type and Filter Registers (0-30) Definitions */ - -#define PMU_EVTYPER_EVENTTOCNT_Pos 0U /*!< PMU EVTYPER: Event to Count Position */ -#define PMU_EVTYPER_EVENTTOCNT_Msk (0xFFFFUL /*<< EVTYPERx_EVENTTOCNT_Pos*/) /*!< PMU EVTYPER: Event to Count Mask */ - -/** \brief PMU Count Enable Set Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENSET: Event Counter 0 Enable Set Position */ -#define PMU_CNTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENSET_CNT0_ENABLE_Pos*/) /*!< PMU CNTENSET: Event Counter 0 Enable Set Mask */ - -#define PMU_CNTENSET_CNT1_ENABLE_Pos 1U /*!< PMU CNTENSET: Event Counter 1 Enable Set Position */ -#define PMU_CNTENSET_CNT1_ENABLE_Msk (1UL << PMU_CNTENSET_CNT1_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 1 Enable Set Mask */ - -#define PMU_CNTENSET_CNT2_ENABLE_Pos 2U /*!< PMU CNTENSET: Event Counter 2 Enable Set Position */ -#define PMU_CNTENSET_CNT2_ENABLE_Msk (1UL << PMU_CNTENSET_CNT2_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 2 Enable Set Mask */ - -#define PMU_CNTENSET_CNT3_ENABLE_Pos 3U /*!< PMU CNTENSET: Event Counter 3 Enable Set Position */ -#define PMU_CNTENSET_CNT3_ENABLE_Msk (1UL << PMU_CNTENSET_CNT3_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 3 Enable Set Mask */ - -#define PMU_CNTENSET_CNT4_ENABLE_Pos 4U /*!< PMU CNTENSET: Event Counter 4 Enable Set Position */ -#define PMU_CNTENSET_CNT4_ENABLE_Msk (1UL << PMU_CNTENSET_CNT4_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 4 Enable Set Mask */ - -#define PMU_CNTENSET_CNT5_ENABLE_Pos 5U /*!< PMU CNTENSET: Event Counter 5 Enable Set Position */ -#define PMU_CNTENSET_CNT5_ENABLE_Msk (1UL << PMU_CNTENSET_CNT5_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 5 Enable Set Mask */ - -#define PMU_CNTENSET_CNT6_ENABLE_Pos 6U /*!< PMU CNTENSET: Event Counter 6 Enable Set Position */ -#define PMU_CNTENSET_CNT6_ENABLE_Msk (1UL << PMU_CNTENSET_CNT6_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 6 Enable Set Mask */ - -#define PMU_CNTENSET_CNT7_ENABLE_Pos 7U /*!< PMU CNTENSET: Event Counter 7 Enable Set Position */ -#define PMU_CNTENSET_CNT7_ENABLE_Msk (1UL << PMU_CNTENSET_CNT7_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 7 Enable Set Mask */ - -#define PMU_CNTENSET_CNT8_ENABLE_Pos 8U /*!< PMU CNTENSET: Event Counter 8 Enable Set Position */ -#define PMU_CNTENSET_CNT8_ENABLE_Msk (1UL << PMU_CNTENSET_CNT8_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 8 Enable Set Mask */ - -#define PMU_CNTENSET_CNT9_ENABLE_Pos 9U /*!< PMU CNTENSET: Event Counter 9 Enable Set Position */ -#define PMU_CNTENSET_CNT9_ENABLE_Msk (1UL << PMU_CNTENSET_CNT9_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 9 Enable Set Mask */ - -#define PMU_CNTENSET_CNT10_ENABLE_Pos 10U /*!< PMU CNTENSET: Event Counter 10 Enable Set Position */ -#define PMU_CNTENSET_CNT10_ENABLE_Msk (1UL << PMU_CNTENSET_CNT10_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 10 Enable Set Mask */ - -#define PMU_CNTENSET_CNT11_ENABLE_Pos 11U /*!< PMU CNTENSET: Event Counter 11 Enable Set Position */ -#define PMU_CNTENSET_CNT11_ENABLE_Msk (1UL << PMU_CNTENSET_CNT11_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 11 Enable Set Mask */ - -#define PMU_CNTENSET_CNT12_ENABLE_Pos 12U /*!< PMU CNTENSET: Event Counter 12 Enable Set Position */ -#define PMU_CNTENSET_CNT12_ENABLE_Msk (1UL << PMU_CNTENSET_CNT12_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 12 Enable Set Mask */ - -#define PMU_CNTENSET_CNT13_ENABLE_Pos 13U /*!< PMU CNTENSET: Event Counter 13 Enable Set Position */ -#define PMU_CNTENSET_CNT13_ENABLE_Msk (1UL << PMU_CNTENSET_CNT13_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 13 Enable Set Mask */ - -#define PMU_CNTENSET_CNT14_ENABLE_Pos 14U /*!< PMU CNTENSET: Event Counter 14 Enable Set Position */ -#define PMU_CNTENSET_CNT14_ENABLE_Msk (1UL << PMU_CNTENSET_CNT14_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 14 Enable Set Mask */ - -#define PMU_CNTENSET_CNT15_ENABLE_Pos 15U /*!< PMU CNTENSET: Event Counter 15 Enable Set Position */ -#define PMU_CNTENSET_CNT15_ENABLE_Msk (1UL << PMU_CNTENSET_CNT15_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 15 Enable Set Mask */ - -#define PMU_CNTENSET_CNT16_ENABLE_Pos 16U /*!< PMU CNTENSET: Event Counter 16 Enable Set Position */ -#define PMU_CNTENSET_CNT16_ENABLE_Msk (1UL << PMU_CNTENSET_CNT16_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 16 Enable Set Mask */ - -#define PMU_CNTENSET_CNT17_ENABLE_Pos 17U /*!< PMU CNTENSET: Event Counter 17 Enable Set Position */ -#define PMU_CNTENSET_CNT17_ENABLE_Msk (1UL << PMU_CNTENSET_CNT17_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 17 Enable Set Mask */ - -#define PMU_CNTENSET_CNT18_ENABLE_Pos 18U /*!< PMU CNTENSET: Event Counter 18 Enable Set Position */ -#define PMU_CNTENSET_CNT18_ENABLE_Msk (1UL << PMU_CNTENSET_CNT18_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 18 Enable Set Mask */ - -#define PMU_CNTENSET_CNT19_ENABLE_Pos 19U /*!< PMU CNTENSET: Event Counter 19 Enable Set Position */ -#define PMU_CNTENSET_CNT19_ENABLE_Msk (1UL << PMU_CNTENSET_CNT19_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 19 Enable Set Mask */ - -#define PMU_CNTENSET_CNT20_ENABLE_Pos 20U /*!< PMU CNTENSET: Event Counter 20 Enable Set Position */ -#define PMU_CNTENSET_CNT20_ENABLE_Msk (1UL << PMU_CNTENSET_CNT20_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 20 Enable Set Mask */ - -#define PMU_CNTENSET_CNT21_ENABLE_Pos 21U /*!< PMU CNTENSET: Event Counter 21 Enable Set Position */ -#define PMU_CNTENSET_CNT21_ENABLE_Msk (1UL << PMU_CNTENSET_CNT21_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 21 Enable Set Mask */ - -#define PMU_CNTENSET_CNT22_ENABLE_Pos 22U /*!< PMU CNTENSET: Event Counter 22 Enable Set Position */ -#define PMU_CNTENSET_CNT22_ENABLE_Msk (1UL << PMU_CNTENSET_CNT22_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 22 Enable Set Mask */ - -#define PMU_CNTENSET_CNT23_ENABLE_Pos 23U /*!< PMU CNTENSET: Event Counter 23 Enable Set Position */ -#define PMU_CNTENSET_CNT23_ENABLE_Msk (1UL << PMU_CNTENSET_CNT23_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 23 Enable Set Mask */ - -#define PMU_CNTENSET_CNT24_ENABLE_Pos 24U /*!< PMU CNTENSET: Event Counter 24 Enable Set Position */ -#define PMU_CNTENSET_CNT24_ENABLE_Msk (1UL << PMU_CNTENSET_CNT24_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 24 Enable Set Mask */ - -#define PMU_CNTENSET_CNT25_ENABLE_Pos 25U /*!< PMU CNTENSET: Event Counter 25 Enable Set Position */ -#define PMU_CNTENSET_CNT25_ENABLE_Msk (1UL << PMU_CNTENSET_CNT25_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 25 Enable Set Mask */ - -#define PMU_CNTENSET_CNT26_ENABLE_Pos 26U /*!< PMU CNTENSET: Event Counter 26 Enable Set Position */ -#define PMU_CNTENSET_CNT26_ENABLE_Msk (1UL << PMU_CNTENSET_CNT26_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 26 Enable Set Mask */ - -#define PMU_CNTENSET_CNT27_ENABLE_Pos 27U /*!< PMU CNTENSET: Event Counter 27 Enable Set Position */ -#define PMU_CNTENSET_CNT27_ENABLE_Msk (1UL << PMU_CNTENSET_CNT27_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 27 Enable Set Mask */ - -#define PMU_CNTENSET_CNT28_ENABLE_Pos 28U /*!< PMU CNTENSET: Event Counter 28 Enable Set Position */ -#define PMU_CNTENSET_CNT28_ENABLE_Msk (1UL << PMU_CNTENSET_CNT28_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 28 Enable Set Mask */ - -#define PMU_CNTENSET_CNT29_ENABLE_Pos 29U /*!< PMU CNTENSET: Event Counter 29 Enable Set Position */ -#define PMU_CNTENSET_CNT29_ENABLE_Msk (1UL << PMU_CNTENSET_CNT29_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 29 Enable Set Mask */ - -#define PMU_CNTENSET_CNT30_ENABLE_Pos 30U /*!< PMU CNTENSET: Event Counter 30 Enable Set Position */ -#define PMU_CNTENSET_CNT30_ENABLE_Msk (1UL << PMU_CNTENSET_CNT30_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 30 Enable Set Mask */ - -#define PMU_CNTENSET_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENSET: Cycle Counter Enable Set Position */ -#define PMU_CNTENSET_CCNTR_ENABLE_Msk (1UL << PMU_CNTENSET_CCNTR_ENABLE_Pos) /*!< PMU CNTENSET: Cycle Counter Enable Set Mask */ - -/** \brief PMU Count Enable Clear Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Position */ -#define PMU_CNTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU CNTENCLR: Event Counter 1 Enable Clear Position */ -#define PMU_CNTENCLR_CNT1_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT1_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 1 Enable Clear */ - -#define PMU_CNTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Position */ -#define PMU_CNTENCLR_CNT2_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT2_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Position */ -#define PMU_CNTENCLR_CNT3_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT3_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Position */ -#define PMU_CNTENCLR_CNT4_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT4_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Position */ -#define PMU_CNTENCLR_CNT5_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT5_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Position */ -#define PMU_CNTENCLR_CNT6_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT6_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Position */ -#define PMU_CNTENCLR_CNT7_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT7_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Position */ -#define PMU_CNTENCLR_CNT8_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT8_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Position */ -#define PMU_CNTENCLR_CNT9_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT9_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Position */ -#define PMU_CNTENCLR_CNT10_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT10_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Position */ -#define PMU_CNTENCLR_CNT11_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT11_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Position */ -#define PMU_CNTENCLR_CNT12_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT12_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Position */ -#define PMU_CNTENCLR_CNT13_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT13_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Position */ -#define PMU_CNTENCLR_CNT14_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT14_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Position */ -#define PMU_CNTENCLR_CNT15_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT15_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Position */ -#define PMU_CNTENCLR_CNT16_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT16_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Position */ -#define PMU_CNTENCLR_CNT17_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT17_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Position */ -#define PMU_CNTENCLR_CNT18_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT18_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Position */ -#define PMU_CNTENCLR_CNT19_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT19_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Position */ -#define PMU_CNTENCLR_CNT20_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT20_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Position */ -#define PMU_CNTENCLR_CNT21_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT21_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Position */ -#define PMU_CNTENCLR_CNT22_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT22_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Position */ -#define PMU_CNTENCLR_CNT23_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT23_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Position */ -#define PMU_CNTENCLR_CNT24_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT24_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Position */ -#define PMU_CNTENCLR_CNT25_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT25_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Position */ -#define PMU_CNTENCLR_CNT26_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT26_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Position */ -#define PMU_CNTENCLR_CNT27_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT27_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Position */ -#define PMU_CNTENCLR_CNT28_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT28_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Position */ -#define PMU_CNTENCLR_CNT29_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT29_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Position */ -#define PMU_CNTENCLR_CNT30_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT30_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Mask */ - -#define PMU_CNTENCLR_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENCLR: Cycle Counter Enable Clear Position */ -#define PMU_CNTENCLR_CCNTR_ENABLE_Msk (1UL << PMU_CNTENCLR_CCNTR_ENABLE_Pos) /*!< PMU CNTENCLR: Cycle Counter Enable Clear Mask */ - -/** \brief PMU Interrupt Enable Set Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENSET_CNT0_ENABLE_Pos*/) /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT1_ENABLE_Pos 1U /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT1_ENABLE_Msk (1UL << PMU_INTENSET_CNT1_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT2_ENABLE_Pos 2U /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT2_ENABLE_Msk (1UL << PMU_INTENSET_CNT2_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT3_ENABLE_Pos 3U /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT3_ENABLE_Msk (1UL << PMU_INTENSET_CNT3_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT4_ENABLE_Pos 4U /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT4_ENABLE_Msk (1UL << PMU_INTENSET_CNT4_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT5_ENABLE_Pos 5U /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT5_ENABLE_Msk (1UL << PMU_INTENSET_CNT5_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT6_ENABLE_Pos 6U /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT6_ENABLE_Msk (1UL << PMU_INTENSET_CNT6_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT7_ENABLE_Pos 7U /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT7_ENABLE_Msk (1UL << PMU_INTENSET_CNT7_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT8_ENABLE_Pos 8U /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT8_ENABLE_Msk (1UL << PMU_INTENSET_CNT8_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT9_ENABLE_Pos 9U /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT9_ENABLE_Msk (1UL << PMU_INTENSET_CNT9_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT10_ENABLE_Pos 10U /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT10_ENABLE_Msk (1UL << PMU_INTENSET_CNT10_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT11_ENABLE_Pos 11U /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT11_ENABLE_Msk (1UL << PMU_INTENSET_CNT11_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT12_ENABLE_Pos 12U /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT12_ENABLE_Msk (1UL << PMU_INTENSET_CNT12_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT13_ENABLE_Pos 13U /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT13_ENABLE_Msk (1UL << PMU_INTENSET_CNT13_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT14_ENABLE_Pos 14U /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT14_ENABLE_Msk (1UL << PMU_INTENSET_CNT14_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT15_ENABLE_Pos 15U /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT15_ENABLE_Msk (1UL << PMU_INTENSET_CNT15_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT16_ENABLE_Pos 16U /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT16_ENABLE_Msk (1UL << PMU_INTENSET_CNT16_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT17_ENABLE_Pos 17U /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT17_ENABLE_Msk (1UL << PMU_INTENSET_CNT17_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT18_ENABLE_Pos 18U /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT18_ENABLE_Msk (1UL << PMU_INTENSET_CNT18_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT19_ENABLE_Pos 19U /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT19_ENABLE_Msk (1UL << PMU_INTENSET_CNT19_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT20_ENABLE_Pos 20U /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT20_ENABLE_Msk (1UL << PMU_INTENSET_CNT20_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT21_ENABLE_Pos 21U /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT21_ENABLE_Msk (1UL << PMU_INTENSET_CNT21_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT22_ENABLE_Pos 22U /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT22_ENABLE_Msk (1UL << PMU_INTENSET_CNT22_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT23_ENABLE_Pos 23U /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT23_ENABLE_Msk (1UL << PMU_INTENSET_CNT23_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT24_ENABLE_Pos 24U /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT24_ENABLE_Msk (1UL << PMU_INTENSET_CNT24_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT25_ENABLE_Pos 25U /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT25_ENABLE_Msk (1UL << PMU_INTENSET_CNT25_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT26_ENABLE_Pos 26U /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT26_ENABLE_Msk (1UL << PMU_INTENSET_CNT26_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT27_ENABLE_Pos 27U /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT27_ENABLE_Msk (1UL << PMU_INTENSET_CNT27_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT28_ENABLE_Pos 28U /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT28_ENABLE_Msk (1UL << PMU_INTENSET_CNT28_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT29_ENABLE_Pos 29U /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT29_ENABLE_Msk (1UL << PMU_INTENSET_CNT29_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT30_ENABLE_Pos 30U /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT30_ENABLE_Msk (1UL << PMU_INTENSET_CNT30_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Position */ -#define PMU_INTENSET_CCYCNT_ENABLE_Msk (1UL << PMU_INTENSET_CYCCNT_ENABLE_Pos) /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Mask */ - -/** \brief PMU Interrupt Enable Clear Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT1_ENABLE_Msk (1UL << PMU_INTENCLR_CNT1_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear */ - -#define PMU_INTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT2_ENABLE_Msk (1UL << PMU_INTENCLR_CNT2_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT3_ENABLE_Msk (1UL << PMU_INTENCLR_CNT3_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT4_ENABLE_Msk (1UL << PMU_INTENCLR_CNT4_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT5_ENABLE_Msk (1UL << PMU_INTENCLR_CNT5_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT6_ENABLE_Msk (1UL << PMU_INTENCLR_CNT6_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT7_ENABLE_Msk (1UL << PMU_INTENCLR_CNT7_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT8_ENABLE_Msk (1UL << PMU_INTENCLR_CNT8_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT9_ENABLE_Msk (1UL << PMU_INTENCLR_CNT9_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT10_ENABLE_Msk (1UL << PMU_INTENCLR_CNT10_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT11_ENABLE_Msk (1UL << PMU_INTENCLR_CNT11_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT12_ENABLE_Msk (1UL << PMU_INTENCLR_CNT12_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT13_ENABLE_Msk (1UL << PMU_INTENCLR_CNT13_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT14_ENABLE_Msk (1UL << PMU_INTENCLR_CNT14_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT15_ENABLE_Msk (1UL << PMU_INTENCLR_CNT15_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT16_ENABLE_Msk (1UL << PMU_INTENCLR_CNT16_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT17_ENABLE_Msk (1UL << PMU_INTENCLR_CNT17_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT18_ENABLE_Msk (1UL << PMU_INTENCLR_CNT18_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT19_ENABLE_Msk (1UL << PMU_INTENCLR_CNT19_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT20_ENABLE_Msk (1UL << PMU_INTENCLR_CNT20_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT21_ENABLE_Msk (1UL << PMU_INTENCLR_CNT21_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT22_ENABLE_Msk (1UL << PMU_INTENCLR_CNT22_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT23_ENABLE_Msk (1UL << PMU_INTENCLR_CNT23_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT24_ENABLE_Msk (1UL << PMU_INTENCLR_CNT24_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT25_ENABLE_Msk (1UL << PMU_INTENCLR_CNT25_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT26_ENABLE_Msk (1UL << PMU_INTENCLR_CNT26_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT27_ENABLE_Msk (1UL << PMU_INTENCLR_CNT27_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT28_ENABLE_Msk (1UL << PMU_INTENCLR_CNT28_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT29_ENABLE_Msk (1UL << PMU_INTENCLR_CNT29_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT30_ENABLE_Msk (1UL << PMU_INTENCLR_CNT30_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CYCCNT_ENABLE_Msk (1UL << PMU_INTENCLR_CYCCNT_ENABLE_Pos) /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Mask */ - -/** \brief PMU Overflow Flag Status Set Register Definitions */ - -#define PMU_OVSSET_CNT0_STATUS_Pos 0U /*!< PMU OVSSET: Event Counter 0 Overflow Set Position */ -#define PMU_OVSSET_CNT0_STATUS_Msk (1UL /*<< PMU_OVSSET_CNT0_STATUS_Pos*/) /*!< PMU OVSSET: Event Counter 0 Overflow Set Mask */ - -#define PMU_OVSSET_CNT1_STATUS_Pos 1U /*!< PMU OVSSET: Event Counter 1 Overflow Set Position */ -#define PMU_OVSSET_CNT1_STATUS_Msk (1UL << PMU_OVSSET_CNT1_STATUS_Pos) /*!< PMU OVSSET: Event Counter 1 Overflow Set Mask */ - -#define PMU_OVSSET_CNT2_STATUS_Pos 2U /*!< PMU OVSSET: Event Counter 2 Overflow Set Position */ -#define PMU_OVSSET_CNT2_STATUS_Msk (1UL << PMU_OVSSET_CNT2_STATUS_Pos) /*!< PMU OVSSET: Event Counter 2 Overflow Set Mask */ - -#define PMU_OVSSET_CNT3_STATUS_Pos 3U /*!< PMU OVSSET: Event Counter 3 Overflow Set Position */ -#define PMU_OVSSET_CNT3_STATUS_Msk (1UL << PMU_OVSSET_CNT3_STATUS_Pos) /*!< PMU OVSSET: Event Counter 3 Overflow Set Mask */ - -#define PMU_OVSSET_CNT4_STATUS_Pos 4U /*!< PMU OVSSET: Event Counter 4 Overflow Set Position */ -#define PMU_OVSSET_CNT4_STATUS_Msk (1UL << PMU_OVSSET_CNT4_STATUS_Pos) /*!< PMU OVSSET: Event Counter 4 Overflow Set Mask */ - -#define PMU_OVSSET_CNT5_STATUS_Pos 5U /*!< PMU OVSSET: Event Counter 5 Overflow Set Position */ -#define PMU_OVSSET_CNT5_STATUS_Msk (1UL << PMU_OVSSET_CNT5_STATUS_Pos) /*!< PMU OVSSET: Event Counter 5 Overflow Set Mask */ - -#define PMU_OVSSET_CNT6_STATUS_Pos 6U /*!< PMU OVSSET: Event Counter 6 Overflow Set Position */ -#define PMU_OVSSET_CNT6_STATUS_Msk (1UL << PMU_OVSSET_CNT6_STATUS_Pos) /*!< PMU OVSSET: Event Counter 6 Overflow Set Mask */ - -#define PMU_OVSSET_CNT7_STATUS_Pos 7U /*!< PMU OVSSET: Event Counter 7 Overflow Set Position */ -#define PMU_OVSSET_CNT7_STATUS_Msk (1UL << PMU_OVSSET_CNT7_STATUS_Pos) /*!< PMU OVSSET: Event Counter 7 Overflow Set Mask */ - -#define PMU_OVSSET_CNT8_STATUS_Pos 8U /*!< PMU OVSSET: Event Counter 8 Overflow Set Position */ -#define PMU_OVSSET_CNT8_STATUS_Msk (1UL << PMU_OVSSET_CNT8_STATUS_Pos) /*!< PMU OVSSET: Event Counter 8 Overflow Set Mask */ - -#define PMU_OVSSET_CNT9_STATUS_Pos 9U /*!< PMU OVSSET: Event Counter 9 Overflow Set Position */ -#define PMU_OVSSET_CNT9_STATUS_Msk (1UL << PMU_OVSSET_CNT9_STATUS_Pos) /*!< PMU OVSSET: Event Counter 9 Overflow Set Mask */ - -#define PMU_OVSSET_CNT10_STATUS_Pos 10U /*!< PMU OVSSET: Event Counter 10 Overflow Set Position */ -#define PMU_OVSSET_CNT10_STATUS_Msk (1UL << PMU_OVSSET_CNT10_STATUS_Pos) /*!< PMU OVSSET: Event Counter 10 Overflow Set Mask */ - -#define PMU_OVSSET_CNT11_STATUS_Pos 11U /*!< PMU OVSSET: Event Counter 11 Overflow Set Position */ -#define PMU_OVSSET_CNT11_STATUS_Msk (1UL << PMU_OVSSET_CNT11_STATUS_Pos) /*!< PMU OVSSET: Event Counter 11 Overflow Set Mask */ - -#define PMU_OVSSET_CNT12_STATUS_Pos 12U /*!< PMU OVSSET: Event Counter 12 Overflow Set Position */ -#define PMU_OVSSET_CNT12_STATUS_Msk (1UL << PMU_OVSSET_CNT12_STATUS_Pos) /*!< PMU OVSSET: Event Counter 12 Overflow Set Mask */ - -#define PMU_OVSSET_CNT13_STATUS_Pos 13U /*!< PMU OVSSET: Event Counter 13 Overflow Set Position */ -#define PMU_OVSSET_CNT13_STATUS_Msk (1UL << PMU_OVSSET_CNT13_STATUS_Pos) /*!< PMU OVSSET: Event Counter 13 Overflow Set Mask */ - -#define PMU_OVSSET_CNT14_STATUS_Pos 14U /*!< PMU OVSSET: Event Counter 14 Overflow Set Position */ -#define PMU_OVSSET_CNT14_STATUS_Msk (1UL << PMU_OVSSET_CNT14_STATUS_Pos) /*!< PMU OVSSET: Event Counter 14 Overflow Set Mask */ - -#define PMU_OVSSET_CNT15_STATUS_Pos 15U /*!< PMU OVSSET: Event Counter 15 Overflow Set Position */ -#define PMU_OVSSET_CNT15_STATUS_Msk (1UL << PMU_OVSSET_CNT15_STATUS_Pos) /*!< PMU OVSSET: Event Counter 15 Overflow Set Mask */ - -#define PMU_OVSSET_CNT16_STATUS_Pos 16U /*!< PMU OVSSET: Event Counter 16 Overflow Set Position */ -#define PMU_OVSSET_CNT16_STATUS_Msk (1UL << PMU_OVSSET_CNT16_STATUS_Pos) /*!< PMU OVSSET: Event Counter 16 Overflow Set Mask */ - -#define PMU_OVSSET_CNT17_STATUS_Pos 17U /*!< PMU OVSSET: Event Counter 17 Overflow Set Position */ -#define PMU_OVSSET_CNT17_STATUS_Msk (1UL << PMU_OVSSET_CNT17_STATUS_Pos) /*!< PMU OVSSET: Event Counter 17 Overflow Set Mask */ - -#define PMU_OVSSET_CNT18_STATUS_Pos 18U /*!< PMU OVSSET: Event Counter 18 Overflow Set Position */ -#define PMU_OVSSET_CNT18_STATUS_Msk (1UL << PMU_OVSSET_CNT18_STATUS_Pos) /*!< PMU OVSSET: Event Counter 18 Overflow Set Mask */ - -#define PMU_OVSSET_CNT19_STATUS_Pos 19U /*!< PMU OVSSET: Event Counter 19 Overflow Set Position */ -#define PMU_OVSSET_CNT19_STATUS_Msk (1UL << PMU_OVSSET_CNT19_STATUS_Pos) /*!< PMU OVSSET: Event Counter 19 Overflow Set Mask */ - -#define PMU_OVSSET_CNT20_STATUS_Pos 20U /*!< PMU OVSSET: Event Counter 20 Overflow Set Position */ -#define PMU_OVSSET_CNT20_STATUS_Msk (1UL << PMU_OVSSET_CNT20_STATUS_Pos) /*!< PMU OVSSET: Event Counter 20 Overflow Set Mask */ - -#define PMU_OVSSET_CNT21_STATUS_Pos 21U /*!< PMU OVSSET: Event Counter 21 Overflow Set Position */ -#define PMU_OVSSET_CNT21_STATUS_Msk (1UL << PMU_OVSSET_CNT21_STATUS_Pos) /*!< PMU OVSSET: Event Counter 21 Overflow Set Mask */ - -#define PMU_OVSSET_CNT22_STATUS_Pos 22U /*!< PMU OVSSET: Event Counter 22 Overflow Set Position */ -#define PMU_OVSSET_CNT22_STATUS_Msk (1UL << PMU_OVSSET_CNT22_STATUS_Pos) /*!< PMU OVSSET: Event Counter 22 Overflow Set Mask */ - -#define PMU_OVSSET_CNT23_STATUS_Pos 23U /*!< PMU OVSSET: Event Counter 23 Overflow Set Position */ -#define PMU_OVSSET_CNT23_STATUS_Msk (1UL << PMU_OVSSET_CNT23_STATUS_Pos) /*!< PMU OVSSET: Event Counter 23 Overflow Set Mask */ - -#define PMU_OVSSET_CNT24_STATUS_Pos 24U /*!< PMU OVSSET: Event Counter 24 Overflow Set Position */ -#define PMU_OVSSET_CNT24_STATUS_Msk (1UL << PMU_OVSSET_CNT24_STATUS_Pos) /*!< PMU OVSSET: Event Counter 24 Overflow Set Mask */ - -#define PMU_OVSSET_CNT25_STATUS_Pos 25U /*!< PMU OVSSET: Event Counter 25 Overflow Set Position */ -#define PMU_OVSSET_CNT25_STATUS_Msk (1UL << PMU_OVSSET_CNT25_STATUS_Pos) /*!< PMU OVSSET: Event Counter 25 Overflow Set Mask */ - -#define PMU_OVSSET_CNT26_STATUS_Pos 26U /*!< PMU OVSSET: Event Counter 26 Overflow Set Position */ -#define PMU_OVSSET_CNT26_STATUS_Msk (1UL << PMU_OVSSET_CNT26_STATUS_Pos) /*!< PMU OVSSET: Event Counter 26 Overflow Set Mask */ - -#define PMU_OVSSET_CNT27_STATUS_Pos 27U /*!< PMU OVSSET: Event Counter 27 Overflow Set Position */ -#define PMU_OVSSET_CNT27_STATUS_Msk (1UL << PMU_OVSSET_CNT27_STATUS_Pos) /*!< PMU OVSSET: Event Counter 27 Overflow Set Mask */ - -#define PMU_OVSSET_CNT28_STATUS_Pos 28U /*!< PMU OVSSET: Event Counter 28 Overflow Set Position */ -#define PMU_OVSSET_CNT28_STATUS_Msk (1UL << PMU_OVSSET_CNT28_STATUS_Pos) /*!< PMU OVSSET: Event Counter 28 Overflow Set Mask */ - -#define PMU_OVSSET_CNT29_STATUS_Pos 29U /*!< PMU OVSSET: Event Counter 29 Overflow Set Position */ -#define PMU_OVSSET_CNT29_STATUS_Msk (1UL << PMU_OVSSET_CNT29_STATUS_Pos) /*!< PMU OVSSET: Event Counter 29 Overflow Set Mask */ - -#define PMU_OVSSET_CNT30_STATUS_Pos 30U /*!< PMU OVSSET: Event Counter 30 Overflow Set Position */ -#define PMU_OVSSET_CNT30_STATUS_Msk (1UL << PMU_OVSSET_CNT30_STATUS_Pos) /*!< PMU OVSSET: Event Counter 30 Overflow Set Mask */ - -#define PMU_OVSSET_CYCCNT_STATUS_Pos 31U /*!< PMU OVSSET: Cycle Counter Overflow Set Position */ -#define PMU_OVSSET_CYCCNT_STATUS_Msk (1UL << PMU_OVSSET_CYCCNT_STATUS_Pos) /*!< PMU OVSSET: Cycle Counter Overflow Set Mask */ - -/** \brief PMU Overflow Flag Status Clear Register Definitions */ - -#define PMU_OVSCLR_CNT0_STATUS_Pos 0U /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Position */ -#define PMU_OVSCLR_CNT0_STATUS_Msk (1UL /*<< PMU_OVSCLR_CNT0_STATUS_Pos*/) /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT1_STATUS_Pos 1U /*!< PMU OVSCLR: Event Counter 1 Overflow Clear Position */ -#define PMU_OVSCLR_CNT1_STATUS_Msk (1UL << PMU_OVSCLR_CNT1_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 1 Overflow Clear */ - -#define PMU_OVSCLR_CNT2_STATUS_Pos 2U /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Position */ -#define PMU_OVSCLR_CNT2_STATUS_Msk (1UL << PMU_OVSCLR_CNT2_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT3_STATUS_Pos 3U /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Position */ -#define PMU_OVSCLR_CNT3_STATUS_Msk (1UL << PMU_OVSCLR_CNT3_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT4_STATUS_Pos 4U /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Position */ -#define PMU_OVSCLR_CNT4_STATUS_Msk (1UL << PMU_OVSCLR_CNT4_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT5_STATUS_Pos 5U /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Position */ -#define PMU_OVSCLR_CNT5_STATUS_Msk (1UL << PMU_OVSCLR_CNT5_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT6_STATUS_Pos 6U /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Position */ -#define PMU_OVSCLR_CNT6_STATUS_Msk (1UL << PMU_OVSCLR_CNT6_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT7_STATUS_Pos 7U /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Position */ -#define PMU_OVSCLR_CNT7_STATUS_Msk (1UL << PMU_OVSCLR_CNT7_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT8_STATUS_Pos 8U /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Position */ -#define PMU_OVSCLR_CNT8_STATUS_Msk (1UL << PMU_OVSCLR_CNT8_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT9_STATUS_Pos 9U /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Position */ -#define PMU_OVSCLR_CNT9_STATUS_Msk (1UL << PMU_OVSCLR_CNT9_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT10_STATUS_Pos 10U /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Position */ -#define PMU_OVSCLR_CNT10_STATUS_Msk (1UL << PMU_OVSCLR_CNT10_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT11_STATUS_Pos 11U /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Position */ -#define PMU_OVSCLR_CNT11_STATUS_Msk (1UL << PMU_OVSCLR_CNT11_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT12_STATUS_Pos 12U /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Position */ -#define PMU_OVSCLR_CNT12_STATUS_Msk (1UL << PMU_OVSCLR_CNT12_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT13_STATUS_Pos 13U /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Position */ -#define PMU_OVSCLR_CNT13_STATUS_Msk (1UL << PMU_OVSCLR_CNT13_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT14_STATUS_Pos 14U /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Position */ -#define PMU_OVSCLR_CNT14_STATUS_Msk (1UL << PMU_OVSCLR_CNT14_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT15_STATUS_Pos 15U /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Position */ -#define PMU_OVSCLR_CNT15_STATUS_Msk (1UL << PMU_OVSCLR_CNT15_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT16_STATUS_Pos 16U /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Position */ -#define PMU_OVSCLR_CNT16_STATUS_Msk (1UL << PMU_OVSCLR_CNT16_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT17_STATUS_Pos 17U /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Position */ -#define PMU_OVSCLR_CNT17_STATUS_Msk (1UL << PMU_OVSCLR_CNT17_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT18_STATUS_Pos 18U /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Position */ -#define PMU_OVSCLR_CNT18_STATUS_Msk (1UL << PMU_OVSCLR_CNT18_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT19_STATUS_Pos 19U /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Position */ -#define PMU_OVSCLR_CNT19_STATUS_Msk (1UL << PMU_OVSCLR_CNT19_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT20_STATUS_Pos 20U /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Position */ -#define PMU_OVSCLR_CNT20_STATUS_Msk (1UL << PMU_OVSCLR_CNT20_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT21_STATUS_Pos 21U /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Position */ -#define PMU_OVSCLR_CNT21_STATUS_Msk (1UL << PMU_OVSCLR_CNT21_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT22_STATUS_Pos 22U /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Position */ -#define PMU_OVSCLR_CNT22_STATUS_Msk (1UL << PMU_OVSCLR_CNT22_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT23_STATUS_Pos 23U /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Position */ -#define PMU_OVSCLR_CNT23_STATUS_Msk (1UL << PMU_OVSCLR_CNT23_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT24_STATUS_Pos 24U /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Position */ -#define PMU_OVSCLR_CNT24_STATUS_Msk (1UL << PMU_OVSCLR_CNT24_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT25_STATUS_Pos 25U /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Position */ -#define PMU_OVSCLR_CNT25_STATUS_Msk (1UL << PMU_OVSCLR_CNT25_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT26_STATUS_Pos 26U /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Position */ -#define PMU_OVSCLR_CNT26_STATUS_Msk (1UL << PMU_OVSCLR_CNT26_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT27_STATUS_Pos 27U /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Position */ -#define PMU_OVSCLR_CNT27_STATUS_Msk (1UL << PMU_OVSCLR_CNT27_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT28_STATUS_Pos 28U /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Position */ -#define PMU_OVSCLR_CNT28_STATUS_Msk (1UL << PMU_OVSCLR_CNT28_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT29_STATUS_Pos 29U /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Position */ -#define PMU_OVSCLR_CNT29_STATUS_Msk (1UL << PMU_OVSCLR_CNT29_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT30_STATUS_Pos 30U /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Position */ -#define PMU_OVSCLR_CNT30_STATUS_Msk (1UL << PMU_OVSCLR_CNT30_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Mask */ - -#define PMU_OVSCLR_CYCCNT_STATUS_Pos 31U /*!< PMU OVSCLR: Cycle Counter Overflow Clear Position */ -#define PMU_OVSCLR_CYCCNT_STATUS_Msk (1UL << PMU_OVSCLR_CYCCNT_STATUS_Pos) /*!< PMU OVSCLR: Cycle Counter Overflow Clear Mask */ - -/** \brief PMU Software Increment Counter */ - -#define PMU_SWINC_CNT0_Pos 0U /*!< PMU SWINC: Event Counter 0 Software Increment Position */ -#define PMU_SWINC_CNT0_Msk (1UL /*<< PMU_SWINC_CNT0_Pos */) /*!< PMU SWINC: Event Counter 0 Software Increment Mask */ - -#define PMU_SWINC_CNT1_Pos 1U /*!< PMU SWINC: Event Counter 1 Software Increment Position */ -#define PMU_SWINC_CNT1_Msk (1UL << PMU_SWINC_CNT1_Pos) /*!< PMU SWINC: Event Counter 1 Software Increment Mask */ - -#define PMU_SWINC_CNT2_Pos 2U /*!< PMU SWINC: Event Counter 2 Software Increment Position */ -#define PMU_SWINC_CNT2_Msk (1UL << PMU_SWINC_CNT2_Pos) /*!< PMU SWINC: Event Counter 2 Software Increment Mask */ - -#define PMU_SWINC_CNT3_Pos 3U /*!< PMU SWINC: Event Counter 3 Software Increment Position */ -#define PMU_SWINC_CNT3_Msk (1UL << PMU_SWINC_CNT3_Pos) /*!< PMU SWINC: Event Counter 3 Software Increment Mask */ - -#define PMU_SWINC_CNT4_Pos 4U /*!< PMU SWINC: Event Counter 4 Software Increment Position */ -#define PMU_SWINC_CNT4_Msk (1UL << PMU_SWINC_CNT4_Pos) /*!< PMU SWINC: Event Counter 4 Software Increment Mask */ - -#define PMU_SWINC_CNT5_Pos 5U /*!< PMU SWINC: Event Counter 5 Software Increment Position */ -#define PMU_SWINC_CNT5_Msk (1UL << PMU_SWINC_CNT5_Pos) /*!< PMU SWINC: Event Counter 5 Software Increment Mask */ - -#define PMU_SWINC_CNT6_Pos 6U /*!< PMU SWINC: Event Counter 6 Software Increment Position */ -#define PMU_SWINC_CNT6_Msk (1UL << PMU_SWINC_CNT6_Pos) /*!< PMU SWINC: Event Counter 6 Software Increment Mask */ - -#define PMU_SWINC_CNT7_Pos 7U /*!< PMU SWINC: Event Counter 7 Software Increment Position */ -#define PMU_SWINC_CNT7_Msk (1UL << PMU_SWINC_CNT7_Pos) /*!< PMU SWINC: Event Counter 7 Software Increment Mask */ - -#define PMU_SWINC_CNT8_Pos 8U /*!< PMU SWINC: Event Counter 8 Software Increment Position */ -#define PMU_SWINC_CNT8_Msk (1UL << PMU_SWINC_CNT8_Pos) /*!< PMU SWINC: Event Counter 8 Software Increment Mask */ - -#define PMU_SWINC_CNT9_Pos 9U /*!< PMU SWINC: Event Counter 9 Software Increment Position */ -#define PMU_SWINC_CNT9_Msk (1UL << PMU_SWINC_CNT9_Pos) /*!< PMU SWINC: Event Counter 9 Software Increment Mask */ - -#define PMU_SWINC_CNT10_Pos 10U /*!< PMU SWINC: Event Counter 10 Software Increment Position */ -#define PMU_SWINC_CNT10_Msk (1UL << PMU_SWINC_CNT10_Pos) /*!< PMU SWINC: Event Counter 10 Software Increment Mask */ - -#define PMU_SWINC_CNT11_Pos 11U /*!< PMU SWINC: Event Counter 11 Software Increment Position */ -#define PMU_SWINC_CNT11_Msk (1UL << PMU_SWINC_CNT11_Pos) /*!< PMU SWINC: Event Counter 11 Software Increment Mask */ - -#define PMU_SWINC_CNT12_Pos 12U /*!< PMU SWINC: Event Counter 12 Software Increment Position */ -#define PMU_SWINC_CNT12_Msk (1UL << PMU_SWINC_CNT12_Pos) /*!< PMU SWINC: Event Counter 12 Software Increment Mask */ - -#define PMU_SWINC_CNT13_Pos 13U /*!< PMU SWINC: Event Counter 13 Software Increment Position */ -#define PMU_SWINC_CNT13_Msk (1UL << PMU_SWINC_CNT13_Pos) /*!< PMU SWINC: Event Counter 13 Software Increment Mask */ - -#define PMU_SWINC_CNT14_Pos 14U /*!< PMU SWINC: Event Counter 14 Software Increment Position */ -#define PMU_SWINC_CNT14_Msk (1UL << PMU_SWINC_CNT14_Pos) /*!< PMU SWINC: Event Counter 14 Software Increment Mask */ - -#define PMU_SWINC_CNT15_Pos 15U /*!< PMU SWINC: Event Counter 15 Software Increment Position */ -#define PMU_SWINC_CNT15_Msk (1UL << PMU_SWINC_CNT15_Pos) /*!< PMU SWINC: Event Counter 15 Software Increment Mask */ - -#define PMU_SWINC_CNT16_Pos 16U /*!< PMU SWINC: Event Counter 16 Software Increment Position */ -#define PMU_SWINC_CNT16_Msk (1UL << PMU_SWINC_CNT16_Pos) /*!< PMU SWINC: Event Counter 16 Software Increment Mask */ - -#define PMU_SWINC_CNT17_Pos 17U /*!< PMU SWINC: Event Counter 17 Software Increment Position */ -#define PMU_SWINC_CNT17_Msk (1UL << PMU_SWINC_CNT17_Pos) /*!< PMU SWINC: Event Counter 17 Software Increment Mask */ - -#define PMU_SWINC_CNT18_Pos 18U /*!< PMU SWINC: Event Counter 18 Software Increment Position */ -#define PMU_SWINC_CNT18_Msk (1UL << PMU_SWINC_CNT18_Pos) /*!< PMU SWINC: Event Counter 18 Software Increment Mask */ - -#define PMU_SWINC_CNT19_Pos 19U /*!< PMU SWINC: Event Counter 19 Software Increment Position */ -#define PMU_SWINC_CNT19_Msk (1UL << PMU_SWINC_CNT19_Pos) /*!< PMU SWINC: Event Counter 19 Software Increment Mask */ - -#define PMU_SWINC_CNT20_Pos 20U /*!< PMU SWINC: Event Counter 20 Software Increment Position */ -#define PMU_SWINC_CNT20_Msk (1UL << PMU_SWINC_CNT20_Pos) /*!< PMU SWINC: Event Counter 20 Software Increment Mask */ - -#define PMU_SWINC_CNT21_Pos 21U /*!< PMU SWINC: Event Counter 21 Software Increment Position */ -#define PMU_SWINC_CNT21_Msk (1UL << PMU_SWINC_CNT21_Pos) /*!< PMU SWINC: Event Counter 21 Software Increment Mask */ - -#define PMU_SWINC_CNT22_Pos 22U /*!< PMU SWINC: Event Counter 22 Software Increment Position */ -#define PMU_SWINC_CNT22_Msk (1UL << PMU_SWINC_CNT22_Pos) /*!< PMU SWINC: Event Counter 22 Software Increment Mask */ - -#define PMU_SWINC_CNT23_Pos 23U /*!< PMU SWINC: Event Counter 23 Software Increment Position */ -#define PMU_SWINC_CNT23_Msk (1UL << PMU_SWINC_CNT23_Pos) /*!< PMU SWINC: Event Counter 23 Software Increment Mask */ - -#define PMU_SWINC_CNT24_Pos 24U /*!< PMU SWINC: Event Counter 24 Software Increment Position */ -#define PMU_SWINC_CNT24_Msk (1UL << PMU_SWINC_CNT24_Pos) /*!< PMU SWINC: Event Counter 24 Software Increment Mask */ - -#define PMU_SWINC_CNT25_Pos 25U /*!< PMU SWINC: Event Counter 25 Software Increment Position */ -#define PMU_SWINC_CNT25_Msk (1UL << PMU_SWINC_CNT25_Pos) /*!< PMU SWINC: Event Counter 25 Software Increment Mask */ - -#define PMU_SWINC_CNT26_Pos 26U /*!< PMU SWINC: Event Counter 26 Software Increment Position */ -#define PMU_SWINC_CNT26_Msk (1UL << PMU_SWINC_CNT26_Pos) /*!< PMU SWINC: Event Counter 26 Software Increment Mask */ - -#define PMU_SWINC_CNT27_Pos 27U /*!< PMU SWINC: Event Counter 27 Software Increment Position */ -#define PMU_SWINC_CNT27_Msk (1UL << PMU_SWINC_CNT27_Pos) /*!< PMU SWINC: Event Counter 27 Software Increment Mask */ - -#define PMU_SWINC_CNT28_Pos 28U /*!< PMU SWINC: Event Counter 28 Software Increment Position */ -#define PMU_SWINC_CNT28_Msk (1UL << PMU_SWINC_CNT28_Pos) /*!< PMU SWINC: Event Counter 28 Software Increment Mask */ - -#define PMU_SWINC_CNT29_Pos 29U /*!< PMU SWINC: Event Counter 29 Software Increment Position */ -#define PMU_SWINC_CNT29_Msk (1UL << PMU_SWINC_CNT29_Pos) /*!< PMU SWINC: Event Counter 29 Software Increment Mask */ - -#define PMU_SWINC_CNT30_Pos 30U /*!< PMU SWINC: Event Counter 30 Software Increment Position */ -#define PMU_SWINC_CNT30_Msk (1UL << PMU_SWINC_CNT30_Pos) /*!< PMU SWINC: Event Counter 30 Software Increment Mask */ - -/** \brief PMU Control Register Definitions */ - -#define PMU_CTRL_ENABLE_Pos 0U /*!< PMU CTRL: ENABLE Position */ -#define PMU_CTRL_ENABLE_Msk (1UL /*<< PMU_CTRL_ENABLE_Pos*/) /*!< PMU CTRL: ENABLE Mask */ - -#define PMU_CTRL_EVENTCNT_RESET_Pos 1U /*!< PMU CTRL: Event Counter Reset Position */ -#define PMU_CTRL_EVENTCNT_RESET_Msk (1UL << PMU_CTRL_EVENTCNT_RESET_Pos) /*!< PMU CTRL: Event Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_RESET_Pos 2U /*!< PMU CTRL: Cycle Counter Reset Position */ -#define PMU_CTRL_CYCCNT_RESET_Msk (1UL << PMU_CTRL_CYCCNT_RESET_Pos) /*!< PMU CTRL: Cycle Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_DISABLE_Pos 5U /*!< PMU CTRL: Disable Cycle Counter Position */ -#define PMU_CTRL_CYCCNT_DISABLE_Msk (1UL << PMU_CTRL_CYCCNT_DISABLE_Pos) /*!< PMU CTRL: Disable Cycle Counter Mask */ - -#define PMU_CTRL_FRZ_ON_OV_Pos 9U /*!< PMU CTRL: Freeze-on-overflow Position */ -#define PMU_CTRL_FRZ_ON_OV_Msk (1UL << PMU_CTRL_FRZ_ON_OVERFLOW_Pos) /*!< PMU CTRL: Freeze-on-overflow Mask */ - -#define PMU_CTRL_TRACE_ON_OV_Pos 11U /*!< PMU CTRL: Trace-on-overflow Position */ -#define PMU_CTRL_TRACE_ON_OV_Msk (1UL << PMU_CTRL_TRACE_ON_OVERFLOW_Pos) /*!< PMU CTRL: Trace-on-overflow Mask */ - -/** \brief PMU Type Register Definitions */ - -#define PMU_TYPE_NUM_CNTS_Pos 0U /*!< PMU TYPE: Number of Counters Position */ -#define PMU_TYPE_NUM_CNTS_Msk (0xFFUL /*<< PMU_TYPE_NUM_CNTS_Pos*/) /*!< PMU TYPE: Number of Counters Mask */ - -#define PMU_TYPE_SIZE_CNTS_Pos 8U /*!< PMU TYPE: Size of Counters Position */ -#define PMU_TYPE_SIZE_CNTS_Msk (0x3FUL << PMU_TYPE_SIZE_CNTS_Pos) /*!< PMU TYPE: Size of Counters Mask */ - -#define PMU_TYPE_CYCCNT_PRESENT_Pos 14U /*!< PMU TYPE: Cycle Counter Present Position */ -#define PMU_TYPE_CYCCNT_PRESENT_Msk (1UL << PMU_TYPE_CYCCNT_PRESENT_Pos) /*!< PMU TYPE: Cycle Counter Present Mask */ - -#define PMU_TYPE_FRZ_OV_SUPPORT_Pos 21U /*!< PMU TYPE: Freeze-on-overflow Support Position */ -#define PMU_TYPE_FRZ_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Freeze-on-overflow Support Mask */ - -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Pos 23U /*!< PMU TYPE: Trace-on-overflow Support Position */ -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Trace-on-overflow Support Mask */ - -/** \brief PMU Authentication Status Register Definitions */ - -#define PMU_AUTHSTATUS_NSID_Pos 0U /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSID_Msk (0x3UL /*<< PMU_AUTHSTATUS_NSID_Pos*/) /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSNID_Pos 2U /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSNID_Msk (0x3UL << PMU_AUTHSTATUS_NSNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SID_Pos 4U /*!< PMU AUTHSTATUS: Secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_SID_Msk (0x3UL << PMU_AUTHSTATUS_SID_Pos) /*!< PMU AUTHSTATUS: Secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SNID_Pos 6U /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SNID_Msk (0x3UL << PMU_AUTHSTATUS_SNID_Pos) /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUID_Pos 16U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUID_Msk (0x3UL << PMU_AUTHSTATUS_NSUID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUNID_Pos 18U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUNID_Msk (0x3UL << PMU_AUTHSTATUS_NSUNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUID_Pos 20U /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_SUID_Msk (0x3UL << PMU_AUTHSTATUS_SUID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUNID_Pos 22U /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SUNID_Msk (0x3UL << PMU_AUTHSTATUS_SUNID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Mask */ - -/*@} end of group CMSIS_PMU */ -#endif - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ -#define MPU_RLAR_PXN_Msk (1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -#define FPU_FPDSCR_FZ16_Pos 19U /*!< FPDSCR: FZ16 bit Position */ -#define FPU_FPDSCR_FZ16_Msk (1UL << FPU_FPDSCR_FZ16_Pos) /*!< FPDSCR: FZ16 bit Mask */ - -#define FPU_FPDSCR_LTPSIZE_Pos 16U /*!< FPDSCR: LTPSIZE bit Position */ -#define FPU_FPDSCR_LTPSIZE_Msk (7UL << FPU_FPDSCR_LTPSIZE_Pos) /*!< FPDSCR: LTPSIZE bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FPRound_Pos 28U /*!< MVFR0: FPRound bits Position */ -#define FPU_MVFR0_FPRound_Msk (0xFUL << FPU_MVFR0_FPRound_Pos) /*!< MVFR0: FPRound bits Mask */ - -#define FPU_MVFR0_FPSqrt_Pos 20U /*!< MVFR0: FPSqrt bits Position */ -#define FPU_MVFR0_FPSqrt_Msk (0xFUL << FPU_MVFR0_FPSqrt_Pos) /*!< MVFR0: FPSqrt bits Mask */ - -#define FPU_MVFR0_FPDivide_Pos 16U /*!< MVFR0: FPDivide bits Position */ -#define FPU_MVFR0_FPDivide_Msk (0xFUL << FPU_MVFR0_FPDivide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FPDP_Pos 8U /*!< MVFR0: FPDP bits Position */ -#define FPU_MVFR0_FPDP_Msk (0xFUL << FPU_MVFR0_FPDP_Pos) /*!< MVFR0: FPDP bits Mask */ - -#define FPU_MVFR0_FPSP_Pos 4U /*!< MVFR0: FPSP bits Position */ -#define FPU_MVFR0_FPSP_Msk (0xFUL << FPU_MVFR0_FPSP_Pos) /*!< MVFR0: FPSP bits Mask */ - -#define FPU_MVFR0_SIMDReg_Pos 0U /*!< MVFR0: SIMDReg bits Position */ -#define FPU_MVFR0_SIMDReg_Msk (0xFUL /*<< FPU_MVFR0_SIMDReg_Pos*/) /*!< MVFR0: SIMDReg bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FMAC_Pos 28U /*!< MVFR1: FMAC bits Position */ -#define FPU_MVFR1_FMAC_Msk (0xFUL << FPU_MVFR1_FMAC_Pos) /*!< MVFR1: FMAC bits Mask */ - -#define FPU_MVFR1_FPHP_Pos 24U /*!< MVFR1: FPHP bits Position */ -#define FPU_MVFR1_FPHP_Msk (0xFUL << FPU_MVFR1_FPHP_Pos) /*!< MVFR1: FPHP bits Mask */ - -#define FPU_MVFR1_FP16_Pos 20U /*!< MVFR1: FP16 bits Position */ -#define FPU_MVFR1_FP16_Msk (0xFUL << FPU_MVFR1_FP16_Pos) /*!< MVFR1: FP16 bits Mask */ - -#define FPU_MVFR1_MVE_Pos 8U /*!< MVFR1: MVE bits Position */ -#define FPU_MVFR1_MVE_Msk (0xFUL << FPU_MVFR1_MVE_Pos) /*!< MVFR1: MVE bits Mask */ - -#define FPU_MVFR1_FPDNaN_Pos 4U /*!< MVFR1: FPDNaN bits Position */ -#define FPU_MVFR1_FPDNaN_Msk (0xFUL << FPU_MVFR1_FPDNaN_Pos) /*!< MVFR1: FPDNaN bits Mask */ - -#define FPU_MVFR1_FPFtZ_Pos 0U /*!< MVFR1: FPFtZ bits Position */ -#define FPU_MVFR1_FPFtZ_Msk (0xFUL /*<< FPU_MVFR1_FPFtZ_Pos*/) /*!< MVFR1: FPFtZ bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_FPD_Pos 23U /*!< \deprecated CoreDebug DHCSR: S_FPD Position */ -#define CoreDebug_DHCSR_S_FPD_Msk (1UL << CoreDebug_DHCSR_S_FPD_Pos) /*!< \deprecated CoreDebug DHCSR: S_FPD Mask */ - -#define CoreDebug_DHCSR_S_SUIDE_Pos 22U /*!< \deprecated CoreDebug DHCSR: S_SUIDE Position */ -#define CoreDebug_DHCSR_S_SUIDE_Msk (1UL << CoreDebug_DHCSR_S_SUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SUIDE Mask */ - -#define CoreDebug_DHCSR_S_NSUIDE_Pos 21U /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Position */ -#define CoreDebug_DHCSR_S_NSUIDE_Msk (1UL << CoreDebug_DHCSR_S_NSUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Mask */ - -#define CoreDebug_DHCSR_S_SDE_Pos 20U /*!< \deprecated CoreDebug DHCSR: S_SDE Position */ -#define CoreDebug_DHCSR_S_SDE_Msk (1UL << CoreDebug_DHCSR_S_SDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SDE Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_PMOV_Pos 6U /*!< \deprecated CoreDebug DHCSR: C_PMOV Position */ -#define CoreDebug_DHCSR_C_PMOV_Msk (1UL << CoreDebug_DHCSR_C_PMOV_Pos) /*!< \deprecated CoreDebug DHCSR: C_PMOV Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Set Clear Exception and Monitor Control Register Definitions */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_REQ_Pos 3U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_SET_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_PEND_Pos 1U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_SET_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_UIDEN_Pos 10U /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_UIDAPEN_Pos 9U /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDAPEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDAPEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Mask */ - -#define CoreDebug_DAUTHCTRL_FSDMA_Pos 8U /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Position */ -#define CoreDebug_DAUTHCTRL_FSDMA_Msk (1UL << CoreDebug_DAUTHCTRL_FSDMA_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_FPD_Pos 23U /*!< DCB DHCSR: Floating-point registers Debuggable Position */ -#define DCB_DHCSR_S_FPD_Msk (0x1UL << DCB_DHCSR_S_FPD_Pos) /*!< DCB DHCSR: Floating-point registers Debuggable Mask */ - -#define DCB_DHCSR_S_SUIDE_Pos 22U /*!< DCB DHCSR: Secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_SUIDE_Msk (0x1UL << DCB_DHCSR_S_SUIDE_Pos) /*!< DCB DHCSR: Secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_NSUIDE_Pos 21U /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_NSUIDE_Msk (0x1UL << DCB_DHCSR_S_NSUIDE_Pos) /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_PMOV_Pos 6U /*!< DCB DHCSR: Halt on PMU overflow control Position */ -#define DCB_DHCSR_C_PMOV_Msk (0x1UL << DCB_DHCSR_C_PMOV_Pos) /*!< DCB DHCSR: Halt on PMU overflow control Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DSCEMCR, Debug Set Clear Exception and Monitor Control Register Definitions */ -#define DCB_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< DCB DSCEMCR: Clear monitor request Position */ -#define DCB_DSCEMCR_CLR_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_REQ_Pos) /*!< DCB DSCEMCR: Clear monitor request Mask */ - -#define DCB_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< DCB DSCEMCR: Clear monitor pend Position */ -#define DCB_DSCEMCR_CLR_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_PEND_Pos) /*!< DCB DSCEMCR: Clear monitor pend Mask */ - -#define DCB_DSCEMCR_SET_MON_REQ_Pos 3U /*!< DCB DSCEMCR: Set monitor request Position */ -#define DCB_DSCEMCR_SET_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_SET_MON_REQ_Pos) /*!< DCB DSCEMCR: Set monitor request Mask */ - -#define DCB_DSCEMCR_SET_MON_PEND_Pos 1U /*!< DCB DSCEMCR: Set monitor pend Position */ -#define DCB_DSCEMCR_SET_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_SET_MON_PEND_Pos) /*!< DCB DSCEMCR: Set monitor pend Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_UIDEN_Pos 10U /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Position */ -#define DCB_DAUTHCTRL_UIDEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Mask */ - -#define DCB_DAUTHCTRL_UIDAPEN_Pos 9U /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Position */ -#define DCB_DAUTHCTRL_UIDAPEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDAPEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Mask */ - -#define DCB_DAUTHCTRL_FSDMA_Pos 8U /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Position */ -#define DCB_DAUTHCTRL_FSDMA_Msk (0x1UL << DCB_DAUTHCTRL_FSDMA_Pos) /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Mask */ - -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SUNID_Pos 22U /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUNID_Msk (0x3UL << DIB_DAUTHSTATUS_SUNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SUID_Pos 20U /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUID_Msk (0x3UL << DIB_DAUTHSTATUS_SUID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_NSUNID_Pos 18U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Position */ -#define DIB_DAUTHSTATUS_NSUNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Mask */ - -#define DIB_DAUTHSTATUS_NSUID_Pos 16U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_NSUID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - #define PMU_BASE (0xE0003000UL) /*!< PMU Base Address */ - #define PMU ((PMU_Type *) PMU_BASE ) /*!< PMU configuration struct */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## PMU functions and events #################################### */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - -#include "pmu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - -/* ########################## MVE functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_MveFunctions MVE Functions - \brief Function that provides MVE type. - @{ - */ - -/** - \brief get MVE type - \details returns the MVE type - \returns - - \b 0: No Vector Extension (MVE) - - \b 1: Integer Vector Extension (MVE-I) - - \b 2: Floating-point Vector Extension (MVE-F) - */ -__STATIC_INLINE uint32_t SCB_GetMVEType(void) -{ - const uint32_t mvfr1 = FPU->MVFR1; - if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x2U << FPU_MVFR1_MVE_Pos)) - { - return 2U; - } - else if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x1U << FPU_MVFR1_MVE_Pos)) - { - return 1U; - } - else - { - return 0U; - } -} - - -/*@} end of CMSIS_Core_MveFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV81MML_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_armv8mbl.h b/software/bootloader/Drivers/CMSIS/Include/core_armv8mbl.h deleted file mode 100644 index 932d3d1..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_armv8mbl.h +++ /dev/null @@ -1,2222 +0,0 @@ -/**************************************************************************//** - * @file core_armv8mbl.h - * @brief CMSIS Armv8-M Baseline Core Peripheral Access Layer Header File - * @version V5.1.0 - * @date 27. March 2020 - ******************************************************************************/ -/* - * Copyright (c) 2009-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_ARMV8MBL_H_GENERIC -#define __CORE_ARMV8MBL_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_ARMv8MBL - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS definitions */ -#define __ARMv8MBL_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __ARMv8MBL_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __ARMv8MBL_CMSIS_VERSION ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \ - __ARMv8MBL_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (2U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MBL_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_ARMV8MBL_H_DEPENDANT -#define __CORE_ARMV8MBL_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __ARMv8MBL_REV - #define __ARMv8MBL_REV 0x0000U - #warning "__ARMv8MBL_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif - - #ifndef __ETM_PRESENT - #define __ETM_PRESENT 0U - #warning "__ETM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MTB_PRESENT - #define __MTB_PRESENT 0U - #warning "__MTB_PRESENT not defined in device header file; using default!" - #endif - -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group ARMv8MBL */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - uint32_t RESERVED0[6U]; - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - uint32_t RESERVED0[7U]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 1U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#endif -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: DWTENA Position */ -#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< \deprecated CoreDebug DEMCR: DWTENA Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/* Interrupt Priorities are WORD accessible only under Armv6-M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - -#define __NVIC_SetPriorityGrouping(X) (void)(X) -#define __NVIC_GetPriorityGrouping() (0U) - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - If VTOR is not present address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MBL_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_armv8mml.h b/software/bootloader/Drivers/CMSIS/Include/core_armv8mml.h deleted file mode 100644 index c119fbf..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_armv8mml.h +++ /dev/null @@ -1,3209 +0,0 @@ -/**************************************************************************//** - * @file core_armv8mml.h - * @brief CMSIS Armv8-M Mainline Core Peripheral Access Layer Header File - * @version V5.2.3 - * @date 13. October 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_ARMV8MML_H_GENERIC -#define __CORE_ARMV8MML_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_ARMv8MML - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS Armv8MML definitions */ -#define __ARMv8MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __ARMv8MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __ARMv8MML_CMSIS_VERSION ((__ARMv8MML_CMSIS_VERSION_MAIN << 16U) | \ - __ARMv8MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (80U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MML_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_ARMV8MML_H_DEPENDANT -#define __CORE_ARMV8MML_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __ARMv8MML_REV - #define __ARMv8MML_REV 0x0000U - #warning "__ARMv8MML_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group ARMv8MML */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MML_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_cm0.h b/software/bootloader/Drivers/CMSIS/Include/core_cm0.h deleted file mode 100644 index 6441ff3..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_cm0.h +++ /dev/null @@ -1,952 +0,0 @@ -/**************************************************************************//** - * @file core_cm0.h - * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File - * @version V5.0.8 - * @date 21. August 2019 - ******************************************************************************/ -/* - * Copyright (c) 2009-2019 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM0_H_GENERIC -#define __CORE_CM0_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M0 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM0 definitions */ -#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ - __CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (0U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0_H_DEPENDANT -#define __CORE_CM0_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0_REV - #define __CM0_REV 0x0000U - #warning "__CM0_REV not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M0 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t _reserved0:1; /*!< bit: 0 Reserved */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - uint32_t RESERVED0; - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the Cortex-M0 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ -/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */ - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ - - -/* Interrupt Priorities are WORD accessible only under Armv6-M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - -#define __NVIC_SetPriorityGrouping(X) (void)(X) -#define __NVIC_GetPriorityGrouping() (0U) - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - Address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ - *(vectors + (int32_t)IRQn) = vector; /* use pointer arithmetic to access vector */ - /* ARM Application Note 321 states that the M0 does not require the architectural barrier */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ - return *(vectors + (int32_t)IRQn); /* use pointer arithmetic to access vector */ -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_cm0plus.h b/software/bootloader/Drivers/CMSIS/Include/core_cm0plus.h deleted file mode 100644 index 4e7179a..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_cm0plus.h +++ /dev/null @@ -1,1087 +0,0 @@ -/**************************************************************************//** - * @file core_cm0plus.h - * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File - * @version V5.0.9 - * @date 21. August 2019 - ******************************************************************************/ -/* - * Copyright (c) 2009-2019 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM0PLUS_H_GENERIC -#define __CORE_CM0PLUS_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex-M0+ - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM0+ definitions */ -#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ - __CM0PLUS_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (0U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0PLUS_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0PLUS_H_DEPENDANT -#define __CORE_CM0PLUS_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0PLUS_REV - #define __CM0PLUS_REV 0x0000U - #warning "__CM0PLUS_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex-M0+ */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -#define MPU_TYPE_RALIASES 1U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the Cortex-M0+ header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ -/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0+ */ - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ - - -/* Interrupt Priorities are WORD accessible only under Armv6-M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - -#define __NVIC_SetPriorityGrouping(X) (void)(X) -#define __NVIC_GetPriorityGrouping() (0U) - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - If VTOR is not present address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -#else - uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ - *(vectors + (int32_t)IRQn) = vector; /* use pointer arithmetic to access vector */ -#endif - /* ARM Application Note 321 states that the M0+ does not require the architectural barrier */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -#else - uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ - return *(vectors + (int32_t)IRQn); /* use pointer arithmetic to access vector */ -#endif -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0PLUS_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_cm1.h b/software/bootloader/Drivers/CMSIS/Include/core_cm1.h deleted file mode 100644 index 76b4569..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_cm1.h +++ /dev/null @@ -1,979 +0,0 @@ -/**************************************************************************//** - * @file core_cm1.h - * @brief CMSIS Cortex-M1 Core Peripheral Access Layer Header File - * @version V1.0.1 - * @date 12. November 2018 - ******************************************************************************/ -/* - * Copyright (c) 2009-2018 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM1_H_GENERIC -#define __CORE_CM1_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M1 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM1 definitions */ -#define __CM1_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM1_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM1_CMSIS_VERSION ((__CM1_CMSIS_VERSION_MAIN << 16U) | \ - __CM1_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (1U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM1_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM1_H_DEPENDANT -#define __CORE_CM1_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM1_REV - #define __CM1_REV 0x0100U - #warning "__CM1_REV not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M1 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t _reserved0:1; /*!< bit: 0 Reserved */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - uint32_t RESERVED0; - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_ITCMUAEN_Pos 4U /*!< ACTLR: Instruction TCM Upper Alias Enable Position */ -#define SCnSCB_ACTLR_ITCMUAEN_Msk (1UL << SCnSCB_ACTLR_ITCMUAEN_Pos) /*!< ACTLR: Instruction TCM Upper Alias Enable Mask */ - -#define SCnSCB_ACTLR_ITCMLAEN_Pos 3U /*!< ACTLR: Instruction TCM Lower Alias Enable Position */ -#define SCnSCB_ACTLR_ITCMLAEN_Msk (1UL << SCnSCB_ACTLR_ITCMLAEN_Pos) /*!< ACTLR: Instruction TCM Lower Alias Enable Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M1 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the Cortex-M1 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ -/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M1 */ - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ - - -/* Interrupt Priorities are WORD accessible only under Armv6-M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - -#define __NVIC_SetPriorityGrouping(X) (void)(X) -#define __NVIC_GetPriorityGrouping() (0U) - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - Address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)0x0U; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M1 does not require the architectural barrier */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)0x0U; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM1_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_cm23.h b/software/bootloader/Drivers/CMSIS/Include/core_cm23.h deleted file mode 100644 index 55fff99..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_cm23.h +++ /dev/null @@ -1,2297 +0,0 @@ -/**************************************************************************//** - * @file core_cm23.h - * @brief CMSIS Cortex-M23 Core Peripheral Access Layer Header File - * @version V5.1.0 - * @date 11. February 2020 - ******************************************************************************/ -/* - * Copyright (c) 2009-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM23_H_GENERIC -#define __CORE_CM23_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M23 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS definitions */ -#define __CM23_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM23_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM23_CMSIS_VERSION ((__CM23_CMSIS_VERSION_MAIN << 16U) | \ - __CM23_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (23U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM23_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM23_H_DEPENDANT -#define __CORE_CM23_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM23_REV - #define __CM23_REV 0x0000U - #warning "__CM23_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif - - #ifndef __ETM_PRESENT - #define __ETM_PRESENT 0U - #warning "__ETM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MTB_PRESENT - #define __MTB_PRESENT 0U - #warning "__MTB_PRESENT not defined in device header file; using default!" - #endif - -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M23 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - uint32_t RESERVED0[6U]; - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ - __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ - __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration Test FIFO Test Data 0 Register Definitions */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ -#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ -#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ -#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ - -/* TPI Integration Test ATB Control Register 2 Register Definitions */ -#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ -#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ - -#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ -#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ - -#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ -#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ - -#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ -#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ - -/* TPI Integration Test FIFO Test Data 1 Register Definitions */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ -#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ -#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ -#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ - -/* TPI Integration Test ATB Control Register 0 Definitions */ -#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ -#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ - -#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ -#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ - -#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ -#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ - -#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ -#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - uint32_t RESERVED0[7U]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 1U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#endif -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: DWTENA Position */ -#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< \deprecated CoreDebug DEMCR: DWTENA Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else -/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M23 */ -/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M23 */ - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/* Interrupt Priorities are WORD accessible only under Armv6-M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - -#define __NVIC_SetPriorityGrouping(X) (void)(X) -#define __NVIC_GetPriorityGrouping() (0U) - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - If VTOR is not present address 0 must be mapped to SRAM. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM23_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_cm3.h b/software/bootloader/Drivers/CMSIS/Include/core_cm3.h deleted file mode 100644 index 74fb87e..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_cm3.h +++ /dev/null @@ -1,1943 +0,0 @@ -/**************************************************************************//** - * @file core_cm3.h - * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File - * @version V5.1.2 - * @date 04. June 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM3_H_GENERIC -#define __CORE_CM3_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M3 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM3 definitions */ -#define __CM3_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM3_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ - __CM3_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (3U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM3_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM3_H_DEPENDANT -#define __CORE_CM3_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM3_REV - #define __CM3_REV 0x0200U - #warning "__CM3_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M3 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#if defined (__CM3_REV) && (__CM3_REV < 0x0201U) /* core r2p1 */ -#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#else -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ -#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -#else - uint32_t RESERVED1[1U]; -#endif -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) -#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ -#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ - -#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ -#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ -#endif - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ -#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ - -#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ -#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ -#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ - -#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ -#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M3 does not require the architectural barrier */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM3_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_cm33.h b/software/bootloader/Drivers/CMSIS/Include/core_cm33.h deleted file mode 100644 index 18a2e6f..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_cm33.h +++ /dev/null @@ -1,3277 +0,0 @@ -/**************************************************************************//** - * @file core_cm33.h - * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File - * @version V5.2.3 - * @date 13. October 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM33_H_GENERIC -#define __CORE_CM33_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M33 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM33 definitions */ -#define __CM33_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM33_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM33_CMSIS_VERSION ((__CM33_CMSIS_VERSION_MAIN << 16U) | \ - __CM33_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (33U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined (__TARGET_FPU_VFP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined (__ARM_FP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined (__ARMVFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined (__TI_VFP_SUPPORT__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined (__FPU_VFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM33_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM33_H_DEPENDANT -#define __CORE_CM33_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM33_REV - #define __CM33_REV 0x0000U - #warning "__CM33_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M33 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ - __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ - __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration Test FIFO Test Data 0 Register Definitions */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ -#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ -#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ -#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ - -/* TPI Integration Test ATB Control Register 2 Register Definitions */ -#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ -#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ - -#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ -#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ - -#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ -#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ - -#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ -#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ - -/* TPI Integration Test FIFO Test Data 1 Register Definitions */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ -#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ -#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ -#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ - -/* TPI Integration Test ATB Control Register 0 Definitions */ -#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ -#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ - -#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ -#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ - -#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ -#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ - -#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ -#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM33_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_cm35p.h b/software/bootloader/Drivers/CMSIS/Include/core_cm35p.h deleted file mode 100644 index 3843d95..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_cm35p.h +++ /dev/null @@ -1,3277 +0,0 @@ -/**************************************************************************//** - * @file core_cm35p.h - * @brief CMSIS Cortex-M35P Core Peripheral Access Layer Header File - * @version V1.1.3 - * @date 13. October 2021 - ******************************************************************************/ -/* - * Copyright (c) 2018-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM35P_H_GENERIC -#define __CORE_CM35P_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M35P - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM35P definitions */ -#define __CM35P_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM35P_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM35P_CMSIS_VERSION ((__CM35P_CMSIS_VERSION_MAIN << 16U) | \ - __CM35P_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (35U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined (__TARGET_FPU_VFP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined (__ARM_FP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined (__ARMVFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined (__TI_VFP_SUPPORT__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined (__FPU_VFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM35P_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM35P_H_DEPENDANT -#define __CORE_CM35P_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM35P_REV - #define __CM35P_REV 0x0000U - #warning "__CM35P_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M35P */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ - __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ - __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration Test FIFO Test Data 0 Register Definitions */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ -#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ -#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ -#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ - -/* TPI Integration Test ATB Control Register 2 Register Definitions */ -#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ -#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ - -#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ -#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ - -#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ -#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ - -#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ -#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ - -/* TPI Integration Test FIFO Test Data 1 Register Definitions */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ -#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ -#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ -#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ - -/* TPI Integration Test ATB Control Register 0 Definitions */ -#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ -#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ - -#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ -#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ - -#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ -#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ - -#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ -#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM35P_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_cm4.h b/software/bootloader/Drivers/CMSIS/Include/core_cm4.h deleted file mode 100644 index e21cd14..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_cm4.h +++ /dev/null @@ -1,2129 +0,0 @@ -/**************************************************************************//** - * @file core_cm4.h - * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File - * @version V5.1.2 - * @date 04. June 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM4_H_GENERIC -#define __CORE_CM4_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M4 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM4 definitions */ -#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ - __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (4U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM4_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM4_H_DEPENDANT -#define __CORE_CM4_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM4_REV - #define __CM4_REV 0x0000U - #warning "__CM4_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M4 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ -#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ - -#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ -#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ -#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ - -#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ -#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ -#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ - -#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ -#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and FP Feature Register 2 Definitions */ - -#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */ -#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */ - -/*@} end of group CMSIS_FPU */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ -#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ -#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M4 does not require the architectural barrier */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM4_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_cm55.h b/software/bootloader/Drivers/CMSIS/Include/core_cm55.h deleted file mode 100644 index faa30ce..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_cm55.h +++ /dev/null @@ -1,4817 +0,0 @@ -/**************************************************************************//** - * @file core_cm55.h - * @brief CMSIS Cortex-M55 Core Peripheral Access Layer Header File - * @version V1.2.4 - * @date 21. April 2022 - ******************************************************************************/ -/* - * Copyright (c) 2018-2022 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM55_H_GENERIC -#define __CORE_CM55_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M55 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM55 definitions */ -#define __CM55_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM55_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM55_CMSIS_VERSION ((__CM55_CMSIS_VERSION_MAIN << 16U) | \ - __CM55_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (55U) /*!< Cortex-M Core */ - -#if defined ( __CC_ARM ) - #error Legacy Arm Compiler does not support Armv8.1-M target architecture. -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM55_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM55_H_DEPENDANT -#define __CORE_CM55_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM55_REV - #define __CM55_REV 0x0000U - #warning "__CM55_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #if __FPU_PRESENT != 0U - #ifndef __FPU_DP - #define __FPU_DP 0U - #warning "__FPU_DP not defined in device header file; using default!" - #endif - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __PMU_PRESENT - #define __PMU_PRESENT 0U - #warning "__PMU_PRESENT not defined in device header file; using default!" - #endif - - #if __PMU_PRESENT != 0U - #ifndef __PMU_NUM_EVENTCNT - #define __PMU_NUM_EVENTCNT 8U - #warning "__PMU_NUM_EVENTCNT not defined in device header file; using default!" - #elif (__PMU_NUM_EVENTCNT > 8 || __PMU_NUM_EVENTCNT < 2) - #error "__PMU_NUM_EVENTCNT is out of range in device header file!" */ - #endif - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M55 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core EWIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core PMU Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - __IOM uint32_t RFSR; /*!< Offset: 0x204 (R/W) RAS Fault Status Register */ - uint32_t RESERVED4[14U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_IESB_Pos 5U /*!< SCB AIRCR: Implicit ESB Enable Position */ -#define SCB_AIRCR_IESB_Msk (1UL << SCB_AIRCR_IESB_Pos) /*!< SCB AIRCR: Implicit ESB Enable Mask */ - -#define SCB_AIRCR_DIT_Pos 4U /*!< SCB AIRCR: Data Independent Timing Position */ -#define SCB_AIRCR_DIT_Msk (1UL << SCB_AIRCR_DIT_Pos) /*!< SCB AIRCR: Data Independent Timing Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_TRD_Pos 20U /*!< SCB CCR: TRD Position */ -#define SCB_CCR_TRD_Msk (1UL << SCB_CCR_TRD_Pos) /*!< SCB CCR: TRD Mask */ - -#define SCB_CCR_LOB_Pos 19U /*!< SCB CCR: LOB Position */ -#define SCB_CCR_LOB_Msk (1UL << SCB_CCR_LOB_Pos) /*!< SCB CCR: LOB Mask */ - -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_PMU_Pos 5U /*!< SCB DFSR: PMU Position */ -#define SCB_DFSR_PMU_Msk (1UL << SCB_DFSR_PMU_Pos) /*!< SCB DFSR: PMU Mask */ - -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CP7_Pos 7U /*!< SCB NSACR: CP7 Position */ -#define SCB_NSACR_CP7_Msk (1UL << SCB_NSACR_CP7_Pos) /*!< SCB NSACR: CP7 Mask */ - -#define SCB_NSACR_CP6_Pos 6U /*!< SCB NSACR: CP6 Position */ -#define SCB_NSACR_CP6_Msk (1UL << SCB_NSACR_CP6_Pos) /*!< SCB NSACR: CP6 Mask */ - -#define SCB_NSACR_CP5_Pos 5U /*!< SCB NSACR: CP5 Position */ -#define SCB_NSACR_CP5_Msk (1UL << SCB_NSACR_CP5_Pos) /*!< SCB NSACR: CP5 Mask */ - -#define SCB_NSACR_CP4_Pos 4U /*!< SCB NSACR: CP4 Position */ -#define SCB_NSACR_CP4_Msk (1UL << SCB_NSACR_CP4_Pos) /*!< SCB NSACR: CP4 Mask */ - -#define SCB_NSACR_CP3_Pos 3U /*!< SCB NSACR: CP3 Position */ -#define SCB_NSACR_CP3_Msk (1UL << SCB_NSACR_CP3_Pos) /*!< SCB NSACR: CP3 Mask */ - -#define SCB_NSACR_CP2_Pos 2U /*!< SCB NSACR: CP2 Position */ -#define SCB_NSACR_CP2_Msk (1UL << SCB_NSACR_CP2_Pos) /*!< SCB NSACR: CP2 Mask */ - -#define SCB_NSACR_CP1_Pos 1U /*!< SCB NSACR: CP1 Position */ -#define SCB_NSACR_CP1_Msk (1UL << SCB_NSACR_CP1_Pos) /*!< SCB NSACR: CP1 Mask */ - -#define SCB_NSACR_CP0_Pos 0U /*!< SCB NSACR: CP0 Position */ -#define SCB_NSACR_CP0_Msk (1UL /*<< SCB_NSACR_CP0_Pos*/) /*!< SCB NSACR: CP0 Mask */ - -/* SCB Debug Feature Register 0 Definitions */ -#define SCB_ID_DFR_UDE_Pos 28U /*!< SCB ID_DFR: UDE Position */ -#define SCB_ID_DFR_UDE_Msk (0xFUL << SCB_ID_DFR_UDE_Pos) /*!< SCB ID_DFR: UDE Mask */ - -#define SCB_ID_DFR_MProfDbg_Pos 20U /*!< SCB ID_DFR: MProfDbg Position */ -#define SCB_ID_DFR_MProfDbg_Msk (0xFUL << SCB_ID_DFR_MProfDbg_Pos) /*!< SCB ID_DFR: MProfDbg Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB RAS Fault Status Register Definitions */ -#define SCB_RFSR_V_Pos 31U /*!< SCB RFSR: V Position */ -#define SCB_RFSR_V_Msk (1UL << SCB_RFSR_V_Pos) /*!< SCB RFSR: V Mask */ - -#define SCB_RFSR_IS_Pos 16U /*!< SCB RFSR: IS Position */ -#define SCB_RFSR_IS_Msk (0x7FFFUL << SCB_RFSR_IS_Pos) /*!< SCB RFSR: IS Mask */ - -#define SCB_RFSR_UET_Pos 0U /*!< SCB RFSR: UET Position */ -#define SCB_RFSR_UET_Msk (3UL /*<< SCB_RFSR_UET_Pos*/) /*!< SCB RFSR: UET Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ICB Implementation Control Block register (ICB) - \brief Type definitions for the Implementation Control Block Register - @{ - */ - -/** - \brief Structure type to access the Implementation Control Block (ICB). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} ICB_Type; - -/* Auxiliary Control Register Definitions */ -#define ICB_ACTLR_DISCRITAXIRUW_Pos 27U /*!< ACTLR: DISCRITAXIRUW Position */ -#define ICB_ACTLR_DISCRITAXIRUW_Msk (1UL << ICB_ACTLR_DISCRITAXIRUW_Pos) /*!< ACTLR: DISCRITAXIRUW Mask */ - -#define ICB_ACTLR_DISDI_Pos 16U /*!< ACTLR: DISDI Position */ -#define ICB_ACTLR_DISDI_Msk (3UL << ICB_ACTLR_DISDI_Pos) /*!< ACTLR: DISDI Mask */ - -#define ICB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ -#define ICB_ACTLR_DISCRITAXIRUR_Msk (1UL << ICB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ - -#define ICB_ACTLR_EVENTBUSEN_Pos 14U /*!< ACTLR: EVENTBUSEN Position */ -#define ICB_ACTLR_EVENTBUSEN_Msk (1UL << ICB_ACTLR_EVENTBUSEN_Pos) /*!< ACTLR: EVENTBUSEN Mask */ - -#define ICB_ACTLR_EVENTBUSEN_S_Pos 13U /*!< ACTLR: EVENTBUSEN_S Position */ -#define ICB_ACTLR_EVENTBUSEN_S_Msk (1UL << ICB_ACTLR_EVENTBUSEN_S_Pos) /*!< ACTLR: EVENTBUSEN_S Mask */ - -#define ICB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ -#define ICB_ACTLR_DISITMATBFLUSH_Msk (1UL << ICB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ - -#define ICB_ACTLR_DISNWAMODE_Pos 11U /*!< ACTLR: DISNWAMODE Position */ -#define ICB_ACTLR_DISNWAMODE_Msk (1UL << ICB_ACTLR_DISNWAMODE_Pos) /*!< ACTLR: DISNWAMODE Mask */ - -#define ICB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ -#define ICB_ACTLR_FPEXCODIS_Msk (1UL << ICB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ - -#define ICB_ACTLR_DISOLAP_Pos 7U /*!< ACTLR: DISOLAP Position */ -#define ICB_ACTLR_DISOLAP_Msk (1UL << ICB_ACTLR_DISOLAP_Pos) /*!< ACTLR: DISOLAP Mask */ - -#define ICB_ACTLR_DISOLAPS_Pos 6U /*!< ACTLR: DISOLAPS Position */ -#define ICB_ACTLR_DISOLAPS_Msk (1UL << ICB_ACTLR_DISOLAPS_Pos) /*!< ACTLR: DISOLAPS Mask */ - -#define ICB_ACTLR_DISLOBR_Pos 5U /*!< ACTLR: DISLOBR Position */ -#define ICB_ACTLR_DISLOBR_Msk (1UL << ICB_ACTLR_DISLOBR_Pos) /*!< ACTLR: DISLOBR Mask */ - -#define ICB_ACTLR_DISLO_Pos 4U /*!< ACTLR: DISLO Position */ -#define ICB_ACTLR_DISLO_Msk (1UL << ICB_ACTLR_DISLO_Pos) /*!< ACTLR: DISLO Mask */ - -#define ICB_ACTLR_DISLOLEP_Pos 3U /*!< ACTLR: DISLOLEP Position */ -#define ICB_ACTLR_DISLOLEP_Msk (1UL << ICB_ACTLR_DISLOLEP_Pos) /*!< ACTLR: DISLOLEP Mask */ - -#define ICB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define ICB_ACTLR_DISFOLD_Msk (1UL << ICB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -/* Interrupt Controller Type Register Definitions */ -#define ICB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define ICB_ICTR_INTLINESNUM_Msk (0xFUL /*<< ICB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_ICB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[3U]; - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) ITM Device Type Register */ - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup MemSysCtl_Type Memory System Control Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Memory System Control Registers (MEMSYSCTL) - @{ - */ - -/** - \brief Structure type to access the Memory System Control Registers (MEMSYSCTL). - */ -typedef struct -{ - __IOM uint32_t MSCR; /*!< Offset: 0x000 (R/W) Memory System Control Register */ - __IOM uint32_t PFCR; /*!< Offset: 0x004 (R/W) Prefetcher Control Register */ - uint32_t RESERVED1[2U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x010 (R/W) ITCM Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x014 (R/W) DTCM Control Register */ - __IOM uint32_t PAHBCR; /*!< Offset: 0x018 (R/W) P-AHB Control Register */ - uint32_t RESERVED2[313U]; - __IOM uint32_t ITGU_CTRL; /*!< Offset: 0x500 (R/W) ITGU Control Register */ - __IOM uint32_t ITGU_CFG; /*!< Offset: 0x504 (R/W) ITGU Configuration Register */ - uint32_t RESERVED3[2U]; - __IOM uint32_t ITGU_LUT[16U]; /*!< Offset: 0x510 (R/W) ITGU Look Up Table Register */ - uint32_t RESERVED4[44U]; - __IOM uint32_t DTGU_CTRL; /*!< Offset: 0x600 (R/W) DTGU Control Registers */ - __IOM uint32_t DTGU_CFG; /*!< Offset: 0x604 (R/W) DTGU Configuration Register */ - uint32_t RESERVED5[2U]; - __IOM uint32_t DTGU_LUT[16U]; /*!< Offset: 0x610 (R/W) DTGU Look Up Table Register */ -} MemSysCtl_Type; - -/* MEMSYSCTL Memory System Control Register (MSCR) Register Definitions */ -#define MEMSYSCTL_MSCR_CPWRDN_Pos 17U /*!< MEMSYSCTL MSCR: CPWRDN Position */ -#define MEMSYSCTL_MSCR_CPWRDN_Msk (0x1UL << MEMSYSCTL_MSCR_CPWRDN_Pos) /*!< MEMSYSCTL MSCR: CPWRDN Mask */ - -#define MEMSYSCTL_MSCR_DCCLEAN_Pos 16U /*!< MEMSYSCTL MSCR: DCCLEAN Position */ -#define MEMSYSCTL_MSCR_DCCLEAN_Msk (0x1UL << MEMSYSCTL_MSCR_DCCLEAN_Pos) /*!< MEMSYSCTL MSCR: DCCLEAN Mask */ - -#define MEMSYSCTL_MSCR_ICACTIVE_Pos 13U /*!< MEMSYSCTL MSCR: ICACTIVE Position */ -#define MEMSYSCTL_MSCR_ICACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_ICACTIVE_Pos) /*!< MEMSYSCTL MSCR: ICACTIVE Mask */ - -#define MEMSYSCTL_MSCR_DCACTIVE_Pos 12U /*!< MEMSYSCTL MSCR: DCACTIVE Position */ -#define MEMSYSCTL_MSCR_DCACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_DCACTIVE_Pos) /*!< MEMSYSCTL MSCR: DCACTIVE Mask */ - -#define MEMSYSCTL_MSCR_TECCCHKDIS_Pos 4U /*!< MEMSYSCTL MSCR: TECCCHKDIS Position */ -#define MEMSYSCTL_MSCR_TECCCHKDIS_Msk (0x1UL << MEMSYSCTL_MSCR_TECCCHKDIS_Pos) /*!< MEMSYSCTL MSCR: TECCCHKDIS Mask */ - -#define MEMSYSCTL_MSCR_EVECCFAULT_Pos 3U /*!< MEMSYSCTL MSCR: EVECCFAULT Position */ -#define MEMSYSCTL_MSCR_EVECCFAULT_Msk (0x1UL << MEMSYSCTL_MSCR_EVECCFAULT_Pos) /*!< MEMSYSCTL MSCR: EVECCFAULT Mask */ - -#define MEMSYSCTL_MSCR_FORCEWT_Pos 2U /*!< MEMSYSCTL MSCR: FORCEWT Position */ -#define MEMSYSCTL_MSCR_FORCEWT_Msk (0x1UL << MEMSYSCTL_MSCR_FORCEWT_Pos) /*!< MEMSYSCTL MSCR: FORCEWT Mask */ - -#define MEMSYSCTL_MSCR_ECCEN_Pos 1U /*!< MEMSYSCTL MSCR: ECCEN Position */ -#define MEMSYSCTL_MSCR_ECCEN_Msk (0x1UL << MEMSYSCTL_MSCR_ECCEN_Pos) /*!< MEMSYSCTL MSCR: ECCEN Mask */ - -/* MEMSYSCTL Prefetcher Control Register (PFCR) Register Definitions */ -#define MEMSYSCTL_PFCR_MAX_OS_Pos 7U /*!< MEMSYSCTL PFCR: MAX_OS Position */ -#define MEMSYSCTL_PFCR_MAX_OS_Msk (0x7UL << MEMSYSCTL_PFCR_MAX_OS_Pos) /*!< MEMSYSCTL PFCR: MAX_OS Mask */ - -#define MEMSYSCTL_PFCR_MAX_LA_Pos 4U /*!< MEMSYSCTL PFCR: MAX_LA Position */ -#define MEMSYSCTL_PFCR_MAX_LA_Msk (0x7UL << MEMSYSCTL_PFCR_MAX_LA_Pos) /*!< MEMSYSCTL PFCR: MAX_LA Mask */ - -#define MEMSYSCTL_PFCR_MIN_LA_Pos 1U /*!< MEMSYSCTL PFCR: MIN_LA Position */ -#define MEMSYSCTL_PFCR_MIN_LA_Msk (0x7UL << MEMSYSCTL_PFCR_MIN_LA_Pos) /*!< MEMSYSCTL PFCR: MIN_LA Mask */ - -#define MEMSYSCTL_PFCR_ENABLE_Pos 0U /*!< MEMSYSCTL PFCR: ENABLE Position */ -#define MEMSYSCTL_PFCR_ENABLE_Msk (0x1UL /*<< MEMSYSCTL_PFCR_ENABLE_Pos*/) /*!< MEMSYSCTL PFCR: ENABLE Mask */ - -/* MEMSYSCTL ITCM Control Register (ITCMCR) Register Definitions */ -#define MEMSYSCTL_ITCMCR_SZ_Pos 3U /*!< MEMSYSCTL ITCMCR: SZ Position */ -#define MEMSYSCTL_ITCMCR_SZ_Msk (0xFUL << MEMSYSCTL_ITCMCR_SZ_Pos) /*!< MEMSYSCTL ITCMCR: SZ Mask */ - -#define MEMSYSCTL_ITCMCR_EN_Pos 0U /*!< MEMSYSCTL ITCMCR: EN Position */ -#define MEMSYSCTL_ITCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_ITCMCR_EN_Pos*/) /*!< MEMSYSCTL ITCMCR: EN Mask */ - -/* MEMSYSCTL DTCM Control Register (DTCMCR) Register Definitions */ -#define MEMSYSCTL_DTCMCR_SZ_Pos 3U /*!< MEMSYSCTL DTCMCR: SZ Position */ -#define MEMSYSCTL_DTCMCR_SZ_Msk (0xFUL << MEMSYSCTL_DTCMCR_SZ_Pos) /*!< MEMSYSCTL DTCMCR: SZ Mask */ - -#define MEMSYSCTL_DTCMCR_EN_Pos 0U /*!< MEMSYSCTL DTCMCR: EN Position */ -#define MEMSYSCTL_DTCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_DTCMCR_EN_Pos*/) /*!< MEMSYSCTL DTCMCR: EN Mask */ - -/* MEMSYSCTL P-AHB Control Register (PAHBCR) Register Definitions */ -#define MEMSYSCTL_PAHBCR_SZ_Pos 1U /*!< MEMSYSCTL PAHBCR: SZ Position */ -#define MEMSYSCTL_PAHBCR_SZ_Msk (0x7UL << MEMSYSCTL_PAHBCR_SZ_Pos) /*!< MEMSYSCTL PAHBCR: SZ Mask */ - -#define MEMSYSCTL_PAHBCR_EN_Pos 0U /*!< MEMSYSCTL PAHBCR: EN Position */ -#define MEMSYSCTL_PAHBCR_EN_Msk (0x1UL /*<< MEMSYSCTL_PAHBCR_EN_Pos*/) /*!< MEMSYSCTL PAHBCR: EN Mask */ - -/* MEMSYSCTL ITGU Control Register (ITGU_CTRL) Register Definitions */ -#define MEMSYSCTL_ITGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL ITGU_CTRL: DEREN Position */ -#define MEMSYSCTL_ITGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_ITGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL ITGU_CTRL: DEREN Mask */ - -#define MEMSYSCTL_ITGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL ITGU_CTRL: DBFEN Position */ -#define MEMSYSCTL_ITGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_ITGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL ITGU_CTRL: DBFEN Mask */ - -/* MEMSYSCTL ITGU Configuration Register (ITGU_CFG) Register Definitions */ -#define MEMSYSCTL_ITGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL ITGU_CFG: PRESENT Position */ -#define MEMSYSCTL_ITGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_ITGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL ITGU_CFG: PRESENT Mask */ - -#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Position */ -#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Mask */ - -#define MEMSYSCTL_ITGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL ITGU_CFG: BLKSZ Position */ -#define MEMSYSCTL_ITGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_ITGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL ITGU_CFG: BLKSZ Mask */ - -/* MEMSYSCTL DTGU Control Registers (DTGU_CTRL) Register Definitions */ -#define MEMSYSCTL_DTGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL DTGU_CTRL: DEREN Position */ -#define MEMSYSCTL_DTGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_DTGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL DTGU_CTRL: DEREN Mask */ - -#define MEMSYSCTL_DTGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL DTGU_CTRL: DBFEN Position */ -#define MEMSYSCTL_DTGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_DTGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL DTGU_CTRL: DBFEN Mask */ - -/* MEMSYSCTL DTGU Configuration Register (DTGU_CFG) Register Definitions */ -#define MEMSYSCTL_DTGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL DTGU_CFG: PRESENT Position */ -#define MEMSYSCTL_DTGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_DTGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL DTGU_CFG: PRESENT Mask */ - -#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Position */ -#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Mask */ - -#define MEMSYSCTL_DTGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL DTGU_CFG: BLKSZ Position */ -#define MEMSYSCTL_DTGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_DTGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL DTGU_CFG: BLKSZ Mask */ - - -/*@}*/ /* end of group MemSysCtl_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup PwrModCtl_Type Power Mode Control Registers - \brief Type definitions for the Power Mode Control Registers (PWRMODCTL) - @{ - */ - -/** - \brief Structure type to access the Power Mode Control Registers (PWRMODCTL). - */ -typedef struct -{ - __IOM uint32_t CPDLPSTATE; /*!< Offset: 0x000 (R/W) Core Power Domain Low Power State Register */ - __IOM uint32_t DPDLPSTATE; /*!< Offset: 0x004 (R/W) Debug Power Domain Low Power State Register */ -} PwrModCtl_Type; - -/* PWRMODCTL Core Power Domain Low Power State (CPDLPSTATE) Register Definitions */ -#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos 8U /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Mask */ - -#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos 4U /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Mask */ - -#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos 0U /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Msk (0x3UL /*<< PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos*/) /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Mask */ - -/* PWRMODCTL Debug Power Domain Low Power State (DPDLPSTATE) Register Definitions */ -#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos 0U /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Position */ -#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Msk (0x3UL /*<< PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos*/) /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Mask */ - -/*@}*/ /* end of group PwrModCtl_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup EWIC_Type External Wakeup Interrupt Controller Registers - \brief Type definitions for the External Wakeup Interrupt Controller Registers (EWIC) - @{ - */ - -/** - \brief Structure type to access the External Wakeup Interrupt Controller Registers (EWIC). - */ -typedef struct -{ - __OM uint32_t EVENTSPR; /*!< Offset: 0x000 ( /W) Event Set Pending Register */ - uint32_t RESERVED0[31U]; - __IM uint32_t EVENTMASKA; /*!< Offset: 0x080 (R/W) Event Mask A Register */ - __IM uint32_t EVENTMASK[15]; /*!< Offset: 0x084 (R/W) Event Mask Register */ -} EWIC_Type; - -/* EWIC External Wakeup Interrupt Controller (EVENTSPR) Register Definitions */ -#define EWIC_EVENTSPR_EDBGREQ_Pos 2U /*!< EWIC EVENTSPR: EDBGREQ Position */ -#define EWIC_EVENTSPR_EDBGREQ_Msk (0x1UL << EWIC_EVENTSPR_EDBGREQ_Pos) /*!< EWIC EVENTSPR: EDBGREQ Mask */ - -#define EWIC_EVENTSPR_NMI_Pos 1U /*!< EWIC EVENTSPR: NMI Position */ -#define EWIC_EVENTSPR_NMI_Msk (0x1UL << EWIC_EVENTSPR_NMI_Pos) /*!< EWIC EVENTSPR: NMI Mask */ - -#define EWIC_EVENTSPR_EVENT_Pos 0U /*!< EWIC EVENTSPR: EVENT Position */ -#define EWIC_EVENTSPR_EVENT_Msk (0x1UL /*<< EWIC_EVENTSPR_EVENT_Pos*/) /*!< EWIC EVENTSPR: EVENT Mask */ - -/* EWIC External Wakeup Interrupt Controller (EVENTMASKA) Register Definitions */ -#define EWIC_EVENTMASKA_EDBGREQ_Pos 2U /*!< EWIC EVENTMASKA: EDBGREQ Position */ -#define EWIC_EVENTMASKA_EDBGREQ_Msk (0x1UL << EWIC_EVENTMASKA_EDBGREQ_Pos) /*!< EWIC EVENTMASKA: EDBGREQ Mask */ - -#define EWIC_EVENTMASKA_NMI_Pos 1U /*!< EWIC EVENTMASKA: NMI Position */ -#define EWIC_EVENTMASKA_NMI_Msk (0x1UL << EWIC_EVENTMASKA_NMI_Pos) /*!< EWIC EVENTMASKA: NMI Mask */ - -#define EWIC_EVENTMASKA_EVENT_Pos 0U /*!< EWIC EVENTMASKA: EVENT Position */ -#define EWIC_EVENTMASKA_EVENT_Msk (0x1UL /*<< EWIC_EVENTMASKA_EVENT_Pos*/) /*!< EWIC EVENTMASKA: EVENT Mask */ - -/* EWIC External Wakeup Interrupt Controller (EVENTMASK) Register Definitions */ -#define EWIC_EVENTMASK_IRQ_Pos 0U /*!< EWIC EVENTMASKA: IRQ Position */ -#define EWIC_EVENTMASK_IRQ_Msk (0xFFFFFFFFUL /*<< EWIC_EVENTMASKA_IRQ_Pos*/) /*!< EWIC EVENTMASKA: IRQ Mask */ - -/*@}*/ /* end of group EWIC_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup ErrBnk_Type Error Banking Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Error Banking Registers (ERRBNK) - @{ - */ - -/** - \brief Structure type to access the Error Banking Registers (ERRBNK). - */ -typedef struct -{ - __IOM uint32_t IEBR0; /*!< Offset: 0x000 (R/W) Instruction Cache Error Bank Register 0 */ - __IOM uint32_t IEBR1; /*!< Offset: 0x004 (R/W) Instruction Cache Error Bank Register 1 */ - uint32_t RESERVED0[2U]; - __IOM uint32_t DEBR0; /*!< Offset: 0x010 (R/W) Data Cache Error Bank Register 0 */ - __IOM uint32_t DEBR1; /*!< Offset: 0x014 (R/W) Data Cache Error Bank Register 1 */ - uint32_t RESERVED1[2U]; - __IOM uint32_t TEBR0; /*!< Offset: 0x020 (R/W) TCM Error Bank Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t TEBR1; /*!< Offset: 0x028 (R/W) TCM Error Bank Register 1 */ -} ErrBnk_Type; - -/* ERRBNK Instruction Cache Error Bank Register 0 (IEBR0) Register Definitions */ -#define ERRBNK_IEBR0_SWDEF_Pos 30U /*!< ERRBNK IEBR0: SWDEF Position */ -#define ERRBNK_IEBR0_SWDEF_Msk (0x3UL << ERRBNK_IEBR0_SWDEF_Pos) /*!< ERRBNK IEBR0: SWDEF Mask */ - -#define ERRBNK_IEBR0_BANK_Pos 16U /*!< ERRBNK IEBR0: BANK Position */ -#define ERRBNK_IEBR0_BANK_Msk (0x1UL << ERRBNK_IEBR0_BANK_Pos) /*!< ERRBNK IEBR0: BANK Mask */ - -#define ERRBNK_IEBR0_LOCATION_Pos 2U /*!< ERRBNK IEBR0: LOCATION Position */ -#define ERRBNK_IEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR0_LOCATION_Pos) /*!< ERRBNK IEBR0: LOCATION Mask */ - -#define ERRBNK_IEBR0_LOCKED_Pos 1U /*!< ERRBNK IEBR0: LOCKED Position */ -#define ERRBNK_IEBR0_LOCKED_Msk (0x1UL << ERRBNK_IEBR0_LOCKED_Pos) /*!< ERRBNK IEBR0: LOCKED Mask */ - -#define ERRBNK_IEBR0_VALID_Pos 0U /*!< ERRBNK IEBR0: VALID Position */ -#define ERRBNK_IEBR0_VALID_Msk (0x1UL << /*ERRBNK_IEBR0_VALID_Pos*/) /*!< ERRBNK IEBR0: VALID Mask */ - -/* ERRBNK Instruction Cache Error Bank Register 1 (IEBR1) Register Definitions */ -#define ERRBNK_IEBR1_SWDEF_Pos 30U /*!< ERRBNK IEBR1: SWDEF Position */ -#define ERRBNK_IEBR1_SWDEF_Msk (0x3UL << ERRBNK_IEBR1_SWDEF_Pos) /*!< ERRBNK IEBR1: SWDEF Mask */ - -#define ERRBNK_IEBR1_BANK_Pos 16U /*!< ERRBNK IEBR1: BANK Position */ -#define ERRBNK_IEBR1_BANK_Msk (0x1UL << ERRBNK_IEBR1_BANK_Pos) /*!< ERRBNK IEBR1: BANK Mask */ - -#define ERRBNK_IEBR1_LOCATION_Pos 2U /*!< ERRBNK IEBR1: LOCATION Position */ -#define ERRBNK_IEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR1_LOCATION_Pos) /*!< ERRBNK IEBR1: LOCATION Mask */ - -#define ERRBNK_IEBR1_LOCKED_Pos 1U /*!< ERRBNK IEBR1: LOCKED Position */ -#define ERRBNK_IEBR1_LOCKED_Msk (0x1UL << ERRBNK_IEBR1_LOCKED_Pos) /*!< ERRBNK IEBR1: LOCKED Mask */ - -#define ERRBNK_IEBR1_VALID_Pos 0U /*!< ERRBNK IEBR1: VALID Position */ -#define ERRBNK_IEBR1_VALID_Msk (0x1UL << /*ERRBNK_IEBR1_VALID_Pos*/) /*!< ERRBNK IEBR1: VALID Mask */ - -/* ERRBNK Data Cache Error Bank Register 0 (DEBR0) Register Definitions */ -#define ERRBNK_DEBR0_SWDEF_Pos 30U /*!< ERRBNK DEBR0: SWDEF Position */ -#define ERRBNK_DEBR0_SWDEF_Msk (0x3UL << ERRBNK_DEBR0_SWDEF_Pos) /*!< ERRBNK DEBR0: SWDEF Mask */ - -#define ERRBNK_DEBR0_TYPE_Pos 17U /*!< ERRBNK DEBR0: TYPE Position */ -#define ERRBNK_DEBR0_TYPE_Msk (0x1UL << ERRBNK_DEBR0_TYPE_Pos) /*!< ERRBNK DEBR0: TYPE Mask */ - -#define ERRBNK_DEBR0_BANK_Pos 16U /*!< ERRBNK DEBR0: BANK Position */ -#define ERRBNK_DEBR0_BANK_Msk (0x1UL << ERRBNK_DEBR0_BANK_Pos) /*!< ERRBNK DEBR0: BANK Mask */ - -#define ERRBNK_DEBR0_LOCATION_Pos 2U /*!< ERRBNK DEBR0: LOCATION Position */ -#define ERRBNK_DEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR0_LOCATION_Pos) /*!< ERRBNK DEBR0: LOCATION Mask */ - -#define ERRBNK_DEBR0_LOCKED_Pos 1U /*!< ERRBNK DEBR0: LOCKED Position */ -#define ERRBNK_DEBR0_LOCKED_Msk (0x1UL << ERRBNK_DEBR0_LOCKED_Pos) /*!< ERRBNK DEBR0: LOCKED Mask */ - -#define ERRBNK_DEBR0_VALID_Pos 0U /*!< ERRBNK DEBR0: VALID Position */ -#define ERRBNK_DEBR0_VALID_Msk (0x1UL << /*ERRBNK_DEBR0_VALID_Pos*/) /*!< ERRBNK DEBR0: VALID Mask */ - -/* ERRBNK Data Cache Error Bank Register 1 (DEBR1) Register Definitions */ -#define ERRBNK_DEBR1_SWDEF_Pos 30U /*!< ERRBNK DEBR1: SWDEF Position */ -#define ERRBNK_DEBR1_SWDEF_Msk (0x3UL << ERRBNK_DEBR1_SWDEF_Pos) /*!< ERRBNK DEBR1: SWDEF Mask */ - -#define ERRBNK_DEBR1_TYPE_Pos 17U /*!< ERRBNK DEBR1: TYPE Position */ -#define ERRBNK_DEBR1_TYPE_Msk (0x1UL << ERRBNK_DEBR1_TYPE_Pos) /*!< ERRBNK DEBR1: TYPE Mask */ - -#define ERRBNK_DEBR1_BANK_Pos 16U /*!< ERRBNK DEBR1: BANK Position */ -#define ERRBNK_DEBR1_BANK_Msk (0x1UL << ERRBNK_DEBR1_BANK_Pos) /*!< ERRBNK DEBR1: BANK Mask */ - -#define ERRBNK_DEBR1_LOCATION_Pos 2U /*!< ERRBNK DEBR1: LOCATION Position */ -#define ERRBNK_DEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR1_LOCATION_Pos) /*!< ERRBNK DEBR1: LOCATION Mask */ - -#define ERRBNK_DEBR1_LOCKED_Pos 1U /*!< ERRBNK DEBR1: LOCKED Position */ -#define ERRBNK_DEBR1_LOCKED_Msk (0x1UL << ERRBNK_DEBR1_LOCKED_Pos) /*!< ERRBNK DEBR1: LOCKED Mask */ - -#define ERRBNK_DEBR1_VALID_Pos 0U /*!< ERRBNK DEBR1: VALID Position */ -#define ERRBNK_DEBR1_VALID_Msk (0x1UL << /*ERRBNK_DEBR1_VALID_Pos*/) /*!< ERRBNK DEBR1: VALID Mask */ - -/* ERRBNK TCM Error Bank Register 0 (TEBR0) Register Definitions */ -#define ERRBNK_TEBR0_SWDEF_Pos 30U /*!< ERRBNK TEBR0: SWDEF Position */ -#define ERRBNK_TEBR0_SWDEF_Msk (0x3UL << ERRBNK_TEBR0_SWDEF_Pos) /*!< ERRBNK TEBR0: SWDEF Mask */ - -#define ERRBNK_TEBR0_POISON_Pos 28U /*!< ERRBNK TEBR0: POISON Position */ -#define ERRBNK_TEBR0_POISON_Msk (0x1UL << ERRBNK_TEBR0_POISON_Pos) /*!< ERRBNK TEBR0: POISON Mask */ - -#define ERRBNK_TEBR0_TYPE_Pos 27U /*!< ERRBNK TEBR0: TYPE Position */ -#define ERRBNK_TEBR0_TYPE_Msk (0x1UL << ERRBNK_TEBR0_TYPE_Pos) /*!< ERRBNK TEBR0: TYPE Mask */ - -#define ERRBNK_TEBR0_BANK_Pos 24U /*!< ERRBNK TEBR0: BANK Position */ -#define ERRBNK_TEBR0_BANK_Msk (0x3UL << ERRBNK_TEBR0_BANK_Pos) /*!< ERRBNK TEBR0: BANK Mask */ - -#define ERRBNK_TEBR0_LOCATION_Pos 2U /*!< ERRBNK TEBR0: LOCATION Position */ -#define ERRBNK_TEBR0_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR0_LOCATION_Pos) /*!< ERRBNK TEBR0: LOCATION Mask */ - -#define ERRBNK_TEBR0_LOCKED_Pos 1U /*!< ERRBNK TEBR0: LOCKED Position */ -#define ERRBNK_TEBR0_LOCKED_Msk (0x1UL << ERRBNK_TEBR0_LOCKED_Pos) /*!< ERRBNK TEBR0: LOCKED Mask */ - -#define ERRBNK_TEBR0_VALID_Pos 0U /*!< ERRBNK TEBR0: VALID Position */ -#define ERRBNK_TEBR0_VALID_Msk (0x1UL << /*ERRBNK_TEBR0_VALID_Pos*/) /*!< ERRBNK TEBR0: VALID Mask */ - -/* ERRBNK TCM Error Bank Register 1 (TEBR1) Register Definitions */ -#define ERRBNK_TEBR1_SWDEF_Pos 30U /*!< ERRBNK TEBR1: SWDEF Position */ -#define ERRBNK_TEBR1_SWDEF_Msk (0x3UL << ERRBNK_TEBR1_SWDEF_Pos) /*!< ERRBNK TEBR1: SWDEF Mask */ - -#define ERRBNK_TEBR1_POISON_Pos 28U /*!< ERRBNK TEBR1: POISON Position */ -#define ERRBNK_TEBR1_POISON_Msk (0x1UL << ERRBNK_TEBR1_POISON_Pos) /*!< ERRBNK TEBR1: POISON Mask */ - -#define ERRBNK_TEBR1_TYPE_Pos 27U /*!< ERRBNK TEBR1: TYPE Position */ -#define ERRBNK_TEBR1_TYPE_Msk (0x1UL << ERRBNK_TEBR1_TYPE_Pos) /*!< ERRBNK TEBR1: TYPE Mask */ - -#define ERRBNK_TEBR1_BANK_Pos 24U /*!< ERRBNK TEBR1: BANK Position */ -#define ERRBNK_TEBR1_BANK_Msk (0x3UL << ERRBNK_TEBR1_BANK_Pos) /*!< ERRBNK TEBR1: BANK Mask */ - -#define ERRBNK_TEBR1_LOCATION_Pos 2U /*!< ERRBNK TEBR1: LOCATION Position */ -#define ERRBNK_TEBR1_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR1_LOCATION_Pos) /*!< ERRBNK TEBR1: LOCATION Mask */ - -#define ERRBNK_TEBR1_LOCKED_Pos 1U /*!< ERRBNK TEBR1: LOCKED Position */ -#define ERRBNK_TEBR1_LOCKED_Msk (0x1UL << ERRBNK_TEBR1_LOCKED_Pos) /*!< ERRBNK TEBR1: LOCKED Mask */ - -#define ERRBNK_TEBR1_VALID_Pos 0U /*!< ERRBNK TEBR1: VALID Position */ -#define ERRBNK_TEBR1_VALID_Msk (0x1UL << /*ERRBNK_TEBR1_VALID_Pos*/) /*!< ERRBNK TEBR1: VALID Mask */ - -/*@}*/ /* end of group ErrBnk_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup PrcCfgInf_Type Processor Configuration Information Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Processor Configuration Information Registerss (PRCCFGINF) - @{ - */ - -/** - \brief Structure type to access the Processor Configuration Information Registerss (PRCCFGINF). - */ -typedef struct -{ - __OM uint32_t CFGINFOSEL; /*!< Offset: 0x000 ( /W) Processor Configuration Information Selection Register */ - __IM uint32_t CFGINFORD; /*!< Offset: 0x004 (R/ ) Processor Configuration Information Read Data Register */ -} PrcCfgInf_Type; - -/* PRCCFGINF Processor Configuration Information Selection Register (CFGINFOSEL) Definitions */ - -/* PRCCFGINF Processor Configuration Information Read Data Register (CFGINFORD) Definitions */ - -/*@}*/ /* end of group PrcCfgInf_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup STL_Type Software Test Library Observation Registers - \brief Type definitions for the Software Test Library Observation Registerss (STL) - @{ - */ - -/** - \brief Structure type to access the Software Test Library Observation Registerss (STL). - */ -typedef struct -{ - __IM uint32_t STLNVICPENDOR; /*!< Offset: 0x000 (R/ ) NVIC Pending Priority Tree Register */ - __IM uint32_t STLNVICACTVOR; /*!< Offset: 0x004 (R/ ) NVIC Active Priority Tree Register */ - uint32_t RESERVED0[2U]; - __OM uint32_t STLIDMPUSR; /*!< Offset: 0x010 ( /W) MPU Sanple Register */ - __IM uint32_t STLIMPUOR; /*!< Offset: 0x014 (R/ ) MPU Region Hit Register */ - __IM uint32_t STLD0MPUOR; /*!< Offset: 0x018 (R/ ) MPU Memory Attributes Register 0 */ - __IM uint32_t STLD1MPUOR; /*!< Offset: 0x01C (R/ ) MPU Memory Attributes Register 1 */ - -} STL_Type; - -/* STL Software Test Library Observation Register (STLNVICPENDOR) Definitions */ -#define STL_STLNVICPENDOR_VALID_Pos 18U /*!< STL STLNVICPENDOR: VALID Position */ -#define STL_STLNVICPENDOR_VALID_Msk (0x1UL << STL_STLNVICPENDOR_VALID_Pos) /*!< STL STLNVICPENDOR: VALID Mask */ - -#define STL_STLNVICPENDOR_TARGET_Pos 17U /*!< STL STLNVICPENDOR: TARGET Position */ -#define STL_STLNVICPENDOR_TARGET_Msk (0x1UL << STL_STLNVICPENDOR_TARGET_Pos) /*!< STL STLNVICPENDOR: TARGET Mask */ - -#define STL_STLNVICPENDOR_PRIORITY_Pos 9U /*!< STL STLNVICPENDOR: PRIORITY Position */ -#define STL_STLNVICPENDOR_PRIORITY_Msk (0xFFUL << STL_STLNVICPENDOR_PRIORITY_Pos) /*!< STL STLNVICPENDOR: PRIORITY Mask */ - -#define STL_STLNVICPENDOR_INTNUM_Pos 0U /*!< STL STLNVICPENDOR: INTNUM Position */ -#define STL_STLNVICPENDOR_INTNUM_Msk (0x1FFUL /*<< STL_STLNVICPENDOR_INTNUM_Pos*/) /*!< STL STLNVICPENDOR: INTNUM Mask */ - -/* STL Software Test Library Observation Register (STLNVICACTVOR) Definitions */ -#define STL_STLNVICACTVOR_VALID_Pos 18U /*!< STL STLNVICACTVOR: VALID Position */ -#define STL_STLNVICACTVOR_VALID_Msk (0x1UL << STL_STLNVICACTVOR_VALID_Pos) /*!< STL STLNVICACTVOR: VALID Mask */ - -#define STL_STLNVICACTVOR_TARGET_Pos 17U /*!< STL STLNVICACTVOR: TARGET Position */ -#define STL_STLNVICACTVOR_TARGET_Msk (0x1UL << STL_STLNVICACTVOR_TARGET_Pos) /*!< STL STLNVICACTVOR: TARGET Mask */ - -#define STL_STLNVICACTVOR_PRIORITY_Pos 9U /*!< STL STLNVICACTVOR: PRIORITY Position */ -#define STL_STLNVICACTVOR_PRIORITY_Msk (0xFFUL << STL_STLNVICACTVOR_PRIORITY_Pos) /*!< STL STLNVICACTVOR: PRIORITY Mask */ - -#define STL_STLNVICACTVOR_INTNUM_Pos 0U /*!< STL STLNVICACTVOR: INTNUM Position */ -#define STL_STLNVICACTVOR_INTNUM_Msk (0x1FFUL /*<< STL_STLNVICACTVOR_INTNUM_Pos*/) /*!< STL STLNVICACTVOR: INTNUM Mask */ - -/* STL Software Test Library Observation Register (STLIDMPUSR) Definitions */ -#define STL_STLIDMPUSR_ADDR_Pos 5U /*!< STL STLIDMPUSR: ADDR Position */ -#define STL_STLIDMPUSR_ADDR_Msk (0x7FFFFFFUL << STL_STLIDMPUSR_ADDR_Pos) /*!< STL STLIDMPUSR: ADDR Mask */ - -#define STL_STLIDMPUSR_INSTR_Pos 2U /*!< STL STLIDMPUSR: INSTR Position */ -#define STL_STLIDMPUSR_INSTR_Msk (0x1UL << STL_STLIDMPUSR_INSTR_Pos) /*!< STL STLIDMPUSR: INSTR Mask */ - -#define STL_STLIDMPUSR_DATA_Pos 1U /*!< STL STLIDMPUSR: DATA Position */ -#define STL_STLIDMPUSR_DATA_Msk (0x1UL << STL_STLIDMPUSR_DATA_Pos) /*!< STL STLIDMPUSR: DATA Mask */ - -/* STL Software Test Library Observation Register (STLIMPUOR) Definitions */ -#define STL_STLIMPUOR_HITREGION_Pos 9U /*!< STL STLIMPUOR: HITREGION Position */ -#define STL_STLIMPUOR_HITREGION_Msk (0xFFUL << STL_STLIMPUOR_HITREGION_Pos) /*!< STL STLIMPUOR: HITREGION Mask */ - -#define STL_STLIMPUOR_ATTR_Pos 0U /*!< STL STLIMPUOR: ATTR Position */ -#define STL_STLIMPUOR_ATTR_Msk (0x1FFUL /*<< STL_STLIMPUOR_ATTR_Pos*/) /*!< STL STLIMPUOR: ATTR Mask */ - -/* STL Software Test Library Observation Register (STLD0MPUOR) Definitions */ -#define STL_STLD0MPUOR_HITREGION_Pos 9U /*!< STL STLD0MPUOR: HITREGION Position */ -#define STL_STLD0MPUOR_HITREGION_Msk (0xFFUL << STL_STLD0MPUOR_HITREGION_Pos) /*!< STL STLD0MPUOR: HITREGION Mask */ - -#define STL_STLD0MPUOR_ATTR_Pos 0U /*!< STL STLD0MPUOR: ATTR Position */ -#define STL_STLD0MPUOR_ATTR_Msk (0x1FFUL /*<< STL_STLD0MPUOR_ATTR_Pos*/) /*!< STL STLD0MPUOR: ATTR Mask */ - -/* STL Software Test Library Observation Register (STLD1MPUOR) Definitions */ -#define STL_STLD1MPUOR_HITREGION_Pos 9U /*!< STL STLD1MPUOR: HITREGION Position */ -#define STL_STLD1MPUOR_HITREGION_Msk (0xFFUL << STL_STLD1MPUOR_HITREGION_Pos) /*!< STL STLD1MPUOR: HITREGION Mask */ - -#define STL_STLD1MPUOR_ATTR_Pos 0U /*!< STL STLD1MPUOR: ATTR Position */ -#define STL_STLD1MPUOR_ATTR_Msk (0x1FFUL /*<< STL_STLD1MPUOR_ATTR_Pos*/) /*!< STL STLD1MPUOR: ATTR Mask */ - -/*@}*/ /* end of group STL_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFmt_Pos 0U /*!< TPI FFCR: EnFmt Position */ -#define TPI_FFCR_EnFmt_Msk (0x3UL << /*TPI_FFCR_EnFmt_Pos*/) /*!< TPI FFCR: EnFmt Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_PMU Performance Monitoring Unit (PMU) - \brief Type definitions for the Performance Monitoring Unit (PMU) - @{ - */ - -/** - \brief Structure type to access the Performance Monitoring Unit (PMU). - */ -typedef struct -{ - __IOM uint32_t EVCNTR[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x0 (R/W) PMU Event Counter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED0[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCNTR; /*!< Offset: 0x7C (R/W) PMU Cycle Counter Register */ - uint32_t RESERVED1[224]; - __IOM uint32_t EVTYPER[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x400 (R/W) PMU Event Type and Filter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED2[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCFILTR; /*!< Offset: 0x47C (R/W) PMU Cycle Counter Filter Register */ - uint32_t RESERVED3[480]; - __IOM uint32_t CNTENSET; /*!< Offset: 0xC00 (R/W) PMU Count Enable Set Register */ - uint32_t RESERVED4[7]; - __IOM uint32_t CNTENCLR; /*!< Offset: 0xC20 (R/W) PMU Count Enable Clear Register */ - uint32_t RESERVED5[7]; - __IOM uint32_t INTENSET; /*!< Offset: 0xC40 (R/W) PMU Interrupt Enable Set Register */ - uint32_t RESERVED6[7]; - __IOM uint32_t INTENCLR; /*!< Offset: 0xC60 (R/W) PMU Interrupt Enable Clear Register */ - uint32_t RESERVED7[7]; - __IOM uint32_t OVSCLR; /*!< Offset: 0xC80 (R/W) PMU Overflow Flag Status Clear Register */ - uint32_t RESERVED8[7]; - __IOM uint32_t SWINC; /*!< Offset: 0xCA0 (R/W) PMU Software Increment Register */ - uint32_t RESERVED9[7]; - __IOM uint32_t OVSSET; /*!< Offset: 0xCC0 (R/W) PMU Overflow Flag Status Set Register */ - uint32_t RESERVED10[79]; - __IOM uint32_t TYPE; /*!< Offset: 0xE00 (R/W) PMU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0xE04 (R/W) PMU Control Register */ - uint32_t RESERVED11[108]; - __IOM uint32_t AUTHSTATUS; /*!< Offset: 0xFB8 (R/W) PMU Authentication Status Register */ - __IOM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/W) PMU Device Architecture Register */ - uint32_t RESERVED12[3]; - __IOM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/W) PMU Device Type Register */ - __IOM uint32_t PIDR4; /*!< Offset: 0xFD0 (R/W) PMU Peripheral Identification Register 4 */ - uint32_t RESERVED13[3]; - __IOM uint32_t PIDR0; /*!< Offset: 0xFE0 (R/W) PMU Peripheral Identification Register 0 */ - __IOM uint32_t PIDR1; /*!< Offset: 0xFE4 (R/W) PMU Peripheral Identification Register 1 */ - __IOM uint32_t PIDR2; /*!< Offset: 0xFE8 (R/W) PMU Peripheral Identification Register 2 */ - __IOM uint32_t PIDR3; /*!< Offset: 0xFEC (R/W) PMU Peripheral Identification Register 3 */ - __IOM uint32_t CIDR0; /*!< Offset: 0xFF0 (R/W) PMU Component Identification Register 0 */ - __IOM uint32_t CIDR1; /*!< Offset: 0xFF4 (R/W) PMU Component Identification Register 1 */ - __IOM uint32_t CIDR2; /*!< Offset: 0xFF8 (R/W) PMU Component Identification Register 2 */ - __IOM uint32_t CIDR3; /*!< Offset: 0xFFC (R/W) PMU Component Identification Register 3 */ -} PMU_Type; - -/** \brief PMU Event Counter Registers (0-30) Definitions */ - -#define PMU_EVCNTR_CNT_Pos 0U /*!< PMU EVCNTR: Counter Position */ -#define PMU_EVCNTR_CNT_Msk (0xFFFFUL /*<< PMU_EVCNTRx_CNT_Pos*/) /*!< PMU EVCNTR: Counter Mask */ - -/** \brief PMU Event Type and Filter Registers (0-30) Definitions */ - -#define PMU_EVTYPER_EVENTTOCNT_Pos 0U /*!< PMU EVTYPER: Event to Count Position */ -#define PMU_EVTYPER_EVENTTOCNT_Msk (0xFFFFUL /*<< EVTYPERx_EVENTTOCNT_Pos*/) /*!< PMU EVTYPER: Event to Count Mask */ - -/** \brief PMU Count Enable Set Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENSET: Event Counter 0 Enable Set Position */ -#define PMU_CNTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENSET_CNT0_ENABLE_Pos*/) /*!< PMU CNTENSET: Event Counter 0 Enable Set Mask */ - -#define PMU_CNTENSET_CNT1_ENABLE_Pos 1U /*!< PMU CNTENSET: Event Counter 1 Enable Set Position */ -#define PMU_CNTENSET_CNT1_ENABLE_Msk (1UL << PMU_CNTENSET_CNT1_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 1 Enable Set Mask */ - -#define PMU_CNTENSET_CNT2_ENABLE_Pos 2U /*!< PMU CNTENSET: Event Counter 2 Enable Set Position */ -#define PMU_CNTENSET_CNT2_ENABLE_Msk (1UL << PMU_CNTENSET_CNT2_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 2 Enable Set Mask */ - -#define PMU_CNTENSET_CNT3_ENABLE_Pos 3U /*!< PMU CNTENSET: Event Counter 3 Enable Set Position */ -#define PMU_CNTENSET_CNT3_ENABLE_Msk (1UL << PMU_CNTENSET_CNT3_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 3 Enable Set Mask */ - -#define PMU_CNTENSET_CNT4_ENABLE_Pos 4U /*!< PMU CNTENSET: Event Counter 4 Enable Set Position */ -#define PMU_CNTENSET_CNT4_ENABLE_Msk (1UL << PMU_CNTENSET_CNT4_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 4 Enable Set Mask */ - -#define PMU_CNTENSET_CNT5_ENABLE_Pos 5U /*!< PMU CNTENSET: Event Counter 5 Enable Set Position */ -#define PMU_CNTENSET_CNT5_ENABLE_Msk (1UL << PMU_CNTENSET_CNT5_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 5 Enable Set Mask */ - -#define PMU_CNTENSET_CNT6_ENABLE_Pos 6U /*!< PMU CNTENSET: Event Counter 6 Enable Set Position */ -#define PMU_CNTENSET_CNT6_ENABLE_Msk (1UL << PMU_CNTENSET_CNT6_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 6 Enable Set Mask */ - -#define PMU_CNTENSET_CNT7_ENABLE_Pos 7U /*!< PMU CNTENSET: Event Counter 7 Enable Set Position */ -#define PMU_CNTENSET_CNT7_ENABLE_Msk (1UL << PMU_CNTENSET_CNT7_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 7 Enable Set Mask */ - -#define PMU_CNTENSET_CNT8_ENABLE_Pos 8U /*!< PMU CNTENSET: Event Counter 8 Enable Set Position */ -#define PMU_CNTENSET_CNT8_ENABLE_Msk (1UL << PMU_CNTENSET_CNT8_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 8 Enable Set Mask */ - -#define PMU_CNTENSET_CNT9_ENABLE_Pos 9U /*!< PMU CNTENSET: Event Counter 9 Enable Set Position */ -#define PMU_CNTENSET_CNT9_ENABLE_Msk (1UL << PMU_CNTENSET_CNT9_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 9 Enable Set Mask */ - -#define PMU_CNTENSET_CNT10_ENABLE_Pos 10U /*!< PMU CNTENSET: Event Counter 10 Enable Set Position */ -#define PMU_CNTENSET_CNT10_ENABLE_Msk (1UL << PMU_CNTENSET_CNT10_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 10 Enable Set Mask */ - -#define PMU_CNTENSET_CNT11_ENABLE_Pos 11U /*!< PMU CNTENSET: Event Counter 11 Enable Set Position */ -#define PMU_CNTENSET_CNT11_ENABLE_Msk (1UL << PMU_CNTENSET_CNT11_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 11 Enable Set Mask */ - -#define PMU_CNTENSET_CNT12_ENABLE_Pos 12U /*!< PMU CNTENSET: Event Counter 12 Enable Set Position */ -#define PMU_CNTENSET_CNT12_ENABLE_Msk (1UL << PMU_CNTENSET_CNT12_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 12 Enable Set Mask */ - -#define PMU_CNTENSET_CNT13_ENABLE_Pos 13U /*!< PMU CNTENSET: Event Counter 13 Enable Set Position */ -#define PMU_CNTENSET_CNT13_ENABLE_Msk (1UL << PMU_CNTENSET_CNT13_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 13 Enable Set Mask */ - -#define PMU_CNTENSET_CNT14_ENABLE_Pos 14U /*!< PMU CNTENSET: Event Counter 14 Enable Set Position */ -#define PMU_CNTENSET_CNT14_ENABLE_Msk (1UL << PMU_CNTENSET_CNT14_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 14 Enable Set Mask */ - -#define PMU_CNTENSET_CNT15_ENABLE_Pos 15U /*!< PMU CNTENSET: Event Counter 15 Enable Set Position */ -#define PMU_CNTENSET_CNT15_ENABLE_Msk (1UL << PMU_CNTENSET_CNT15_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 15 Enable Set Mask */ - -#define PMU_CNTENSET_CNT16_ENABLE_Pos 16U /*!< PMU CNTENSET: Event Counter 16 Enable Set Position */ -#define PMU_CNTENSET_CNT16_ENABLE_Msk (1UL << PMU_CNTENSET_CNT16_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 16 Enable Set Mask */ - -#define PMU_CNTENSET_CNT17_ENABLE_Pos 17U /*!< PMU CNTENSET: Event Counter 17 Enable Set Position */ -#define PMU_CNTENSET_CNT17_ENABLE_Msk (1UL << PMU_CNTENSET_CNT17_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 17 Enable Set Mask */ - -#define PMU_CNTENSET_CNT18_ENABLE_Pos 18U /*!< PMU CNTENSET: Event Counter 18 Enable Set Position */ -#define PMU_CNTENSET_CNT18_ENABLE_Msk (1UL << PMU_CNTENSET_CNT18_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 18 Enable Set Mask */ - -#define PMU_CNTENSET_CNT19_ENABLE_Pos 19U /*!< PMU CNTENSET: Event Counter 19 Enable Set Position */ -#define PMU_CNTENSET_CNT19_ENABLE_Msk (1UL << PMU_CNTENSET_CNT19_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 19 Enable Set Mask */ - -#define PMU_CNTENSET_CNT20_ENABLE_Pos 20U /*!< PMU CNTENSET: Event Counter 20 Enable Set Position */ -#define PMU_CNTENSET_CNT20_ENABLE_Msk (1UL << PMU_CNTENSET_CNT20_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 20 Enable Set Mask */ - -#define PMU_CNTENSET_CNT21_ENABLE_Pos 21U /*!< PMU CNTENSET: Event Counter 21 Enable Set Position */ -#define PMU_CNTENSET_CNT21_ENABLE_Msk (1UL << PMU_CNTENSET_CNT21_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 21 Enable Set Mask */ - -#define PMU_CNTENSET_CNT22_ENABLE_Pos 22U /*!< PMU CNTENSET: Event Counter 22 Enable Set Position */ -#define PMU_CNTENSET_CNT22_ENABLE_Msk (1UL << PMU_CNTENSET_CNT22_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 22 Enable Set Mask */ - -#define PMU_CNTENSET_CNT23_ENABLE_Pos 23U /*!< PMU CNTENSET: Event Counter 23 Enable Set Position */ -#define PMU_CNTENSET_CNT23_ENABLE_Msk (1UL << PMU_CNTENSET_CNT23_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 23 Enable Set Mask */ - -#define PMU_CNTENSET_CNT24_ENABLE_Pos 24U /*!< PMU CNTENSET: Event Counter 24 Enable Set Position */ -#define PMU_CNTENSET_CNT24_ENABLE_Msk (1UL << PMU_CNTENSET_CNT24_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 24 Enable Set Mask */ - -#define PMU_CNTENSET_CNT25_ENABLE_Pos 25U /*!< PMU CNTENSET: Event Counter 25 Enable Set Position */ -#define PMU_CNTENSET_CNT25_ENABLE_Msk (1UL << PMU_CNTENSET_CNT25_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 25 Enable Set Mask */ - -#define PMU_CNTENSET_CNT26_ENABLE_Pos 26U /*!< PMU CNTENSET: Event Counter 26 Enable Set Position */ -#define PMU_CNTENSET_CNT26_ENABLE_Msk (1UL << PMU_CNTENSET_CNT26_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 26 Enable Set Mask */ - -#define PMU_CNTENSET_CNT27_ENABLE_Pos 27U /*!< PMU CNTENSET: Event Counter 27 Enable Set Position */ -#define PMU_CNTENSET_CNT27_ENABLE_Msk (1UL << PMU_CNTENSET_CNT27_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 27 Enable Set Mask */ - -#define PMU_CNTENSET_CNT28_ENABLE_Pos 28U /*!< PMU CNTENSET: Event Counter 28 Enable Set Position */ -#define PMU_CNTENSET_CNT28_ENABLE_Msk (1UL << PMU_CNTENSET_CNT28_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 28 Enable Set Mask */ - -#define PMU_CNTENSET_CNT29_ENABLE_Pos 29U /*!< PMU CNTENSET: Event Counter 29 Enable Set Position */ -#define PMU_CNTENSET_CNT29_ENABLE_Msk (1UL << PMU_CNTENSET_CNT29_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 29 Enable Set Mask */ - -#define PMU_CNTENSET_CNT30_ENABLE_Pos 30U /*!< PMU CNTENSET: Event Counter 30 Enable Set Position */ -#define PMU_CNTENSET_CNT30_ENABLE_Msk (1UL << PMU_CNTENSET_CNT30_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 30 Enable Set Mask */ - -#define PMU_CNTENSET_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENSET: Cycle Counter Enable Set Position */ -#define PMU_CNTENSET_CCNTR_ENABLE_Msk (1UL << PMU_CNTENSET_CCNTR_ENABLE_Pos) /*!< PMU CNTENSET: Cycle Counter Enable Set Mask */ - -/** \brief PMU Count Enable Clear Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Position */ -#define PMU_CNTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU CNTENCLR: Event Counter 1 Enable Clear Position */ -#define PMU_CNTENCLR_CNT1_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT1_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 1 Enable Clear */ - -#define PMU_CNTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Position */ -#define PMU_CNTENCLR_CNT2_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT2_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Position */ -#define PMU_CNTENCLR_CNT3_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT3_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Position */ -#define PMU_CNTENCLR_CNT4_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT4_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Position */ -#define PMU_CNTENCLR_CNT5_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT5_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Position */ -#define PMU_CNTENCLR_CNT6_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT6_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Position */ -#define PMU_CNTENCLR_CNT7_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT7_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Position */ -#define PMU_CNTENCLR_CNT8_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT8_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Position */ -#define PMU_CNTENCLR_CNT9_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT9_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Position */ -#define PMU_CNTENCLR_CNT10_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT10_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Position */ -#define PMU_CNTENCLR_CNT11_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT11_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Position */ -#define PMU_CNTENCLR_CNT12_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT12_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Position */ -#define PMU_CNTENCLR_CNT13_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT13_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Position */ -#define PMU_CNTENCLR_CNT14_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT14_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Position */ -#define PMU_CNTENCLR_CNT15_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT15_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Position */ -#define PMU_CNTENCLR_CNT16_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT16_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Position */ -#define PMU_CNTENCLR_CNT17_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT17_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Position */ -#define PMU_CNTENCLR_CNT18_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT18_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Position */ -#define PMU_CNTENCLR_CNT19_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT19_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Position */ -#define PMU_CNTENCLR_CNT20_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT20_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Position */ -#define PMU_CNTENCLR_CNT21_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT21_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Position */ -#define PMU_CNTENCLR_CNT22_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT22_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Position */ -#define PMU_CNTENCLR_CNT23_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT23_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Position */ -#define PMU_CNTENCLR_CNT24_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT24_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Position */ -#define PMU_CNTENCLR_CNT25_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT25_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Position */ -#define PMU_CNTENCLR_CNT26_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT26_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Position */ -#define PMU_CNTENCLR_CNT27_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT27_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Position */ -#define PMU_CNTENCLR_CNT28_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT28_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Position */ -#define PMU_CNTENCLR_CNT29_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT29_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Position */ -#define PMU_CNTENCLR_CNT30_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT30_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Mask */ - -#define PMU_CNTENCLR_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENCLR: Cycle Counter Enable Clear Position */ -#define PMU_CNTENCLR_CCNTR_ENABLE_Msk (1UL << PMU_CNTENCLR_CCNTR_ENABLE_Pos) /*!< PMU CNTENCLR: Cycle Counter Enable Clear Mask */ - -/** \brief PMU Interrupt Enable Set Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENSET_CNT0_ENABLE_Pos*/) /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT1_ENABLE_Pos 1U /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT1_ENABLE_Msk (1UL << PMU_INTENSET_CNT1_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT2_ENABLE_Pos 2U /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT2_ENABLE_Msk (1UL << PMU_INTENSET_CNT2_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT3_ENABLE_Pos 3U /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT3_ENABLE_Msk (1UL << PMU_INTENSET_CNT3_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT4_ENABLE_Pos 4U /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT4_ENABLE_Msk (1UL << PMU_INTENSET_CNT4_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT5_ENABLE_Pos 5U /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT5_ENABLE_Msk (1UL << PMU_INTENSET_CNT5_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT6_ENABLE_Pos 6U /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT6_ENABLE_Msk (1UL << PMU_INTENSET_CNT6_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT7_ENABLE_Pos 7U /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT7_ENABLE_Msk (1UL << PMU_INTENSET_CNT7_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT8_ENABLE_Pos 8U /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT8_ENABLE_Msk (1UL << PMU_INTENSET_CNT8_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT9_ENABLE_Pos 9U /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT9_ENABLE_Msk (1UL << PMU_INTENSET_CNT9_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT10_ENABLE_Pos 10U /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT10_ENABLE_Msk (1UL << PMU_INTENSET_CNT10_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT11_ENABLE_Pos 11U /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT11_ENABLE_Msk (1UL << PMU_INTENSET_CNT11_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT12_ENABLE_Pos 12U /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT12_ENABLE_Msk (1UL << PMU_INTENSET_CNT12_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT13_ENABLE_Pos 13U /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT13_ENABLE_Msk (1UL << PMU_INTENSET_CNT13_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT14_ENABLE_Pos 14U /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT14_ENABLE_Msk (1UL << PMU_INTENSET_CNT14_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT15_ENABLE_Pos 15U /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT15_ENABLE_Msk (1UL << PMU_INTENSET_CNT15_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT16_ENABLE_Pos 16U /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT16_ENABLE_Msk (1UL << PMU_INTENSET_CNT16_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT17_ENABLE_Pos 17U /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT17_ENABLE_Msk (1UL << PMU_INTENSET_CNT17_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT18_ENABLE_Pos 18U /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT18_ENABLE_Msk (1UL << PMU_INTENSET_CNT18_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT19_ENABLE_Pos 19U /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT19_ENABLE_Msk (1UL << PMU_INTENSET_CNT19_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT20_ENABLE_Pos 20U /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT20_ENABLE_Msk (1UL << PMU_INTENSET_CNT20_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT21_ENABLE_Pos 21U /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT21_ENABLE_Msk (1UL << PMU_INTENSET_CNT21_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT22_ENABLE_Pos 22U /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT22_ENABLE_Msk (1UL << PMU_INTENSET_CNT22_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT23_ENABLE_Pos 23U /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT23_ENABLE_Msk (1UL << PMU_INTENSET_CNT23_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT24_ENABLE_Pos 24U /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT24_ENABLE_Msk (1UL << PMU_INTENSET_CNT24_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT25_ENABLE_Pos 25U /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT25_ENABLE_Msk (1UL << PMU_INTENSET_CNT25_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT26_ENABLE_Pos 26U /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT26_ENABLE_Msk (1UL << PMU_INTENSET_CNT26_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT27_ENABLE_Pos 27U /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT27_ENABLE_Msk (1UL << PMU_INTENSET_CNT27_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT28_ENABLE_Pos 28U /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT28_ENABLE_Msk (1UL << PMU_INTENSET_CNT28_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT29_ENABLE_Pos 29U /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT29_ENABLE_Msk (1UL << PMU_INTENSET_CNT29_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT30_ENABLE_Pos 30U /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT30_ENABLE_Msk (1UL << PMU_INTENSET_CNT30_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Position */ -#define PMU_INTENSET_CCYCNT_ENABLE_Msk (1UL << PMU_INTENSET_CYCCNT_ENABLE_Pos) /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Mask */ - -/** \brief PMU Interrupt Enable Clear Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT1_ENABLE_Msk (1UL << PMU_INTENCLR_CNT1_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear */ - -#define PMU_INTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT2_ENABLE_Msk (1UL << PMU_INTENCLR_CNT2_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT3_ENABLE_Msk (1UL << PMU_INTENCLR_CNT3_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT4_ENABLE_Msk (1UL << PMU_INTENCLR_CNT4_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT5_ENABLE_Msk (1UL << PMU_INTENCLR_CNT5_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT6_ENABLE_Msk (1UL << PMU_INTENCLR_CNT6_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT7_ENABLE_Msk (1UL << PMU_INTENCLR_CNT7_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT8_ENABLE_Msk (1UL << PMU_INTENCLR_CNT8_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT9_ENABLE_Msk (1UL << PMU_INTENCLR_CNT9_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT10_ENABLE_Msk (1UL << PMU_INTENCLR_CNT10_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT11_ENABLE_Msk (1UL << PMU_INTENCLR_CNT11_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT12_ENABLE_Msk (1UL << PMU_INTENCLR_CNT12_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT13_ENABLE_Msk (1UL << PMU_INTENCLR_CNT13_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT14_ENABLE_Msk (1UL << PMU_INTENCLR_CNT14_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT15_ENABLE_Msk (1UL << PMU_INTENCLR_CNT15_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT16_ENABLE_Msk (1UL << PMU_INTENCLR_CNT16_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT17_ENABLE_Msk (1UL << PMU_INTENCLR_CNT17_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT18_ENABLE_Msk (1UL << PMU_INTENCLR_CNT18_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT19_ENABLE_Msk (1UL << PMU_INTENCLR_CNT19_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT20_ENABLE_Msk (1UL << PMU_INTENCLR_CNT20_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT21_ENABLE_Msk (1UL << PMU_INTENCLR_CNT21_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT22_ENABLE_Msk (1UL << PMU_INTENCLR_CNT22_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT23_ENABLE_Msk (1UL << PMU_INTENCLR_CNT23_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT24_ENABLE_Msk (1UL << PMU_INTENCLR_CNT24_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT25_ENABLE_Msk (1UL << PMU_INTENCLR_CNT25_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT26_ENABLE_Msk (1UL << PMU_INTENCLR_CNT26_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT27_ENABLE_Msk (1UL << PMU_INTENCLR_CNT27_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT28_ENABLE_Msk (1UL << PMU_INTENCLR_CNT28_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT29_ENABLE_Msk (1UL << PMU_INTENCLR_CNT29_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT30_ENABLE_Msk (1UL << PMU_INTENCLR_CNT30_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CYCCNT_ENABLE_Msk (1UL << PMU_INTENCLR_CYCCNT_ENABLE_Pos) /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Mask */ - -/** \brief PMU Overflow Flag Status Set Register Definitions */ - -#define PMU_OVSSET_CNT0_STATUS_Pos 0U /*!< PMU OVSSET: Event Counter 0 Overflow Set Position */ -#define PMU_OVSSET_CNT0_STATUS_Msk (1UL /*<< PMU_OVSSET_CNT0_STATUS_Pos*/) /*!< PMU OVSSET: Event Counter 0 Overflow Set Mask */ - -#define PMU_OVSSET_CNT1_STATUS_Pos 1U /*!< PMU OVSSET: Event Counter 1 Overflow Set Position */ -#define PMU_OVSSET_CNT1_STATUS_Msk (1UL << PMU_OVSSET_CNT1_STATUS_Pos) /*!< PMU OVSSET: Event Counter 1 Overflow Set Mask */ - -#define PMU_OVSSET_CNT2_STATUS_Pos 2U /*!< PMU OVSSET: Event Counter 2 Overflow Set Position */ -#define PMU_OVSSET_CNT2_STATUS_Msk (1UL << PMU_OVSSET_CNT2_STATUS_Pos) /*!< PMU OVSSET: Event Counter 2 Overflow Set Mask */ - -#define PMU_OVSSET_CNT3_STATUS_Pos 3U /*!< PMU OVSSET: Event Counter 3 Overflow Set Position */ -#define PMU_OVSSET_CNT3_STATUS_Msk (1UL << PMU_OVSSET_CNT3_STATUS_Pos) /*!< PMU OVSSET: Event Counter 3 Overflow Set Mask */ - -#define PMU_OVSSET_CNT4_STATUS_Pos 4U /*!< PMU OVSSET: Event Counter 4 Overflow Set Position */ -#define PMU_OVSSET_CNT4_STATUS_Msk (1UL << PMU_OVSSET_CNT4_STATUS_Pos) /*!< PMU OVSSET: Event Counter 4 Overflow Set Mask */ - -#define PMU_OVSSET_CNT5_STATUS_Pos 5U /*!< PMU OVSSET: Event Counter 5 Overflow Set Position */ -#define PMU_OVSSET_CNT5_STATUS_Msk (1UL << PMU_OVSSET_CNT5_STATUS_Pos) /*!< PMU OVSSET: Event Counter 5 Overflow Set Mask */ - -#define PMU_OVSSET_CNT6_STATUS_Pos 6U /*!< PMU OVSSET: Event Counter 6 Overflow Set Position */ -#define PMU_OVSSET_CNT6_STATUS_Msk (1UL << PMU_OVSSET_CNT6_STATUS_Pos) /*!< PMU OVSSET: Event Counter 6 Overflow Set Mask */ - -#define PMU_OVSSET_CNT7_STATUS_Pos 7U /*!< PMU OVSSET: Event Counter 7 Overflow Set Position */ -#define PMU_OVSSET_CNT7_STATUS_Msk (1UL << PMU_OVSSET_CNT7_STATUS_Pos) /*!< PMU OVSSET: Event Counter 7 Overflow Set Mask */ - -#define PMU_OVSSET_CNT8_STATUS_Pos 8U /*!< PMU OVSSET: Event Counter 8 Overflow Set Position */ -#define PMU_OVSSET_CNT8_STATUS_Msk (1UL << PMU_OVSSET_CNT8_STATUS_Pos) /*!< PMU OVSSET: Event Counter 8 Overflow Set Mask */ - -#define PMU_OVSSET_CNT9_STATUS_Pos 9U /*!< PMU OVSSET: Event Counter 9 Overflow Set Position */ -#define PMU_OVSSET_CNT9_STATUS_Msk (1UL << PMU_OVSSET_CNT9_STATUS_Pos) /*!< PMU OVSSET: Event Counter 9 Overflow Set Mask */ - -#define PMU_OVSSET_CNT10_STATUS_Pos 10U /*!< PMU OVSSET: Event Counter 10 Overflow Set Position */ -#define PMU_OVSSET_CNT10_STATUS_Msk (1UL << PMU_OVSSET_CNT10_STATUS_Pos) /*!< PMU OVSSET: Event Counter 10 Overflow Set Mask */ - -#define PMU_OVSSET_CNT11_STATUS_Pos 11U /*!< PMU OVSSET: Event Counter 11 Overflow Set Position */ -#define PMU_OVSSET_CNT11_STATUS_Msk (1UL << PMU_OVSSET_CNT11_STATUS_Pos) /*!< PMU OVSSET: Event Counter 11 Overflow Set Mask */ - -#define PMU_OVSSET_CNT12_STATUS_Pos 12U /*!< PMU OVSSET: Event Counter 12 Overflow Set Position */ -#define PMU_OVSSET_CNT12_STATUS_Msk (1UL << PMU_OVSSET_CNT12_STATUS_Pos) /*!< PMU OVSSET: Event Counter 12 Overflow Set Mask */ - -#define PMU_OVSSET_CNT13_STATUS_Pos 13U /*!< PMU OVSSET: Event Counter 13 Overflow Set Position */ -#define PMU_OVSSET_CNT13_STATUS_Msk (1UL << PMU_OVSSET_CNT13_STATUS_Pos) /*!< PMU OVSSET: Event Counter 13 Overflow Set Mask */ - -#define PMU_OVSSET_CNT14_STATUS_Pos 14U /*!< PMU OVSSET: Event Counter 14 Overflow Set Position */ -#define PMU_OVSSET_CNT14_STATUS_Msk (1UL << PMU_OVSSET_CNT14_STATUS_Pos) /*!< PMU OVSSET: Event Counter 14 Overflow Set Mask */ - -#define PMU_OVSSET_CNT15_STATUS_Pos 15U /*!< PMU OVSSET: Event Counter 15 Overflow Set Position */ -#define PMU_OVSSET_CNT15_STATUS_Msk (1UL << PMU_OVSSET_CNT15_STATUS_Pos) /*!< PMU OVSSET: Event Counter 15 Overflow Set Mask */ - -#define PMU_OVSSET_CNT16_STATUS_Pos 16U /*!< PMU OVSSET: Event Counter 16 Overflow Set Position */ -#define PMU_OVSSET_CNT16_STATUS_Msk (1UL << PMU_OVSSET_CNT16_STATUS_Pos) /*!< PMU OVSSET: Event Counter 16 Overflow Set Mask */ - -#define PMU_OVSSET_CNT17_STATUS_Pos 17U /*!< PMU OVSSET: Event Counter 17 Overflow Set Position */ -#define PMU_OVSSET_CNT17_STATUS_Msk (1UL << PMU_OVSSET_CNT17_STATUS_Pos) /*!< PMU OVSSET: Event Counter 17 Overflow Set Mask */ - -#define PMU_OVSSET_CNT18_STATUS_Pos 18U /*!< PMU OVSSET: Event Counter 18 Overflow Set Position */ -#define PMU_OVSSET_CNT18_STATUS_Msk (1UL << PMU_OVSSET_CNT18_STATUS_Pos) /*!< PMU OVSSET: Event Counter 18 Overflow Set Mask */ - -#define PMU_OVSSET_CNT19_STATUS_Pos 19U /*!< PMU OVSSET: Event Counter 19 Overflow Set Position */ -#define PMU_OVSSET_CNT19_STATUS_Msk (1UL << PMU_OVSSET_CNT19_STATUS_Pos) /*!< PMU OVSSET: Event Counter 19 Overflow Set Mask */ - -#define PMU_OVSSET_CNT20_STATUS_Pos 20U /*!< PMU OVSSET: Event Counter 20 Overflow Set Position */ -#define PMU_OVSSET_CNT20_STATUS_Msk (1UL << PMU_OVSSET_CNT20_STATUS_Pos) /*!< PMU OVSSET: Event Counter 20 Overflow Set Mask */ - -#define PMU_OVSSET_CNT21_STATUS_Pos 21U /*!< PMU OVSSET: Event Counter 21 Overflow Set Position */ -#define PMU_OVSSET_CNT21_STATUS_Msk (1UL << PMU_OVSSET_CNT21_STATUS_Pos) /*!< PMU OVSSET: Event Counter 21 Overflow Set Mask */ - -#define PMU_OVSSET_CNT22_STATUS_Pos 22U /*!< PMU OVSSET: Event Counter 22 Overflow Set Position */ -#define PMU_OVSSET_CNT22_STATUS_Msk (1UL << PMU_OVSSET_CNT22_STATUS_Pos) /*!< PMU OVSSET: Event Counter 22 Overflow Set Mask */ - -#define PMU_OVSSET_CNT23_STATUS_Pos 23U /*!< PMU OVSSET: Event Counter 23 Overflow Set Position */ -#define PMU_OVSSET_CNT23_STATUS_Msk (1UL << PMU_OVSSET_CNT23_STATUS_Pos) /*!< PMU OVSSET: Event Counter 23 Overflow Set Mask */ - -#define PMU_OVSSET_CNT24_STATUS_Pos 24U /*!< PMU OVSSET: Event Counter 24 Overflow Set Position */ -#define PMU_OVSSET_CNT24_STATUS_Msk (1UL << PMU_OVSSET_CNT24_STATUS_Pos) /*!< PMU OVSSET: Event Counter 24 Overflow Set Mask */ - -#define PMU_OVSSET_CNT25_STATUS_Pos 25U /*!< PMU OVSSET: Event Counter 25 Overflow Set Position */ -#define PMU_OVSSET_CNT25_STATUS_Msk (1UL << PMU_OVSSET_CNT25_STATUS_Pos) /*!< PMU OVSSET: Event Counter 25 Overflow Set Mask */ - -#define PMU_OVSSET_CNT26_STATUS_Pos 26U /*!< PMU OVSSET: Event Counter 26 Overflow Set Position */ -#define PMU_OVSSET_CNT26_STATUS_Msk (1UL << PMU_OVSSET_CNT26_STATUS_Pos) /*!< PMU OVSSET: Event Counter 26 Overflow Set Mask */ - -#define PMU_OVSSET_CNT27_STATUS_Pos 27U /*!< PMU OVSSET: Event Counter 27 Overflow Set Position */ -#define PMU_OVSSET_CNT27_STATUS_Msk (1UL << PMU_OVSSET_CNT27_STATUS_Pos) /*!< PMU OVSSET: Event Counter 27 Overflow Set Mask */ - -#define PMU_OVSSET_CNT28_STATUS_Pos 28U /*!< PMU OVSSET: Event Counter 28 Overflow Set Position */ -#define PMU_OVSSET_CNT28_STATUS_Msk (1UL << PMU_OVSSET_CNT28_STATUS_Pos) /*!< PMU OVSSET: Event Counter 28 Overflow Set Mask */ - -#define PMU_OVSSET_CNT29_STATUS_Pos 29U /*!< PMU OVSSET: Event Counter 29 Overflow Set Position */ -#define PMU_OVSSET_CNT29_STATUS_Msk (1UL << PMU_OVSSET_CNT29_STATUS_Pos) /*!< PMU OVSSET: Event Counter 29 Overflow Set Mask */ - -#define PMU_OVSSET_CNT30_STATUS_Pos 30U /*!< PMU OVSSET: Event Counter 30 Overflow Set Position */ -#define PMU_OVSSET_CNT30_STATUS_Msk (1UL << PMU_OVSSET_CNT30_STATUS_Pos) /*!< PMU OVSSET: Event Counter 30 Overflow Set Mask */ - -#define PMU_OVSSET_CYCCNT_STATUS_Pos 31U /*!< PMU OVSSET: Cycle Counter Overflow Set Position */ -#define PMU_OVSSET_CYCCNT_STATUS_Msk (1UL << PMU_OVSSET_CYCCNT_STATUS_Pos) /*!< PMU OVSSET: Cycle Counter Overflow Set Mask */ - -/** \brief PMU Overflow Flag Status Clear Register Definitions */ - -#define PMU_OVSCLR_CNT0_STATUS_Pos 0U /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Position */ -#define PMU_OVSCLR_CNT0_STATUS_Msk (1UL /*<< PMU_OVSCLR_CNT0_STATUS_Pos*/) /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT1_STATUS_Pos 1U /*!< PMU OVSCLR: Event Counter 1 Overflow Clear Position */ -#define PMU_OVSCLR_CNT1_STATUS_Msk (1UL << PMU_OVSCLR_CNT1_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 1 Overflow Clear */ - -#define PMU_OVSCLR_CNT2_STATUS_Pos 2U /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Position */ -#define PMU_OVSCLR_CNT2_STATUS_Msk (1UL << PMU_OVSCLR_CNT2_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT3_STATUS_Pos 3U /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Position */ -#define PMU_OVSCLR_CNT3_STATUS_Msk (1UL << PMU_OVSCLR_CNT3_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT4_STATUS_Pos 4U /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Position */ -#define PMU_OVSCLR_CNT4_STATUS_Msk (1UL << PMU_OVSCLR_CNT4_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT5_STATUS_Pos 5U /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Position */ -#define PMU_OVSCLR_CNT5_STATUS_Msk (1UL << PMU_OVSCLR_CNT5_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT6_STATUS_Pos 6U /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Position */ -#define PMU_OVSCLR_CNT6_STATUS_Msk (1UL << PMU_OVSCLR_CNT6_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT7_STATUS_Pos 7U /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Position */ -#define PMU_OVSCLR_CNT7_STATUS_Msk (1UL << PMU_OVSCLR_CNT7_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT8_STATUS_Pos 8U /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Position */ -#define PMU_OVSCLR_CNT8_STATUS_Msk (1UL << PMU_OVSCLR_CNT8_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT9_STATUS_Pos 9U /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Position */ -#define PMU_OVSCLR_CNT9_STATUS_Msk (1UL << PMU_OVSCLR_CNT9_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT10_STATUS_Pos 10U /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Position */ -#define PMU_OVSCLR_CNT10_STATUS_Msk (1UL << PMU_OVSCLR_CNT10_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT11_STATUS_Pos 11U /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Position */ -#define PMU_OVSCLR_CNT11_STATUS_Msk (1UL << PMU_OVSCLR_CNT11_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT12_STATUS_Pos 12U /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Position */ -#define PMU_OVSCLR_CNT12_STATUS_Msk (1UL << PMU_OVSCLR_CNT12_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT13_STATUS_Pos 13U /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Position */ -#define PMU_OVSCLR_CNT13_STATUS_Msk (1UL << PMU_OVSCLR_CNT13_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT14_STATUS_Pos 14U /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Position */ -#define PMU_OVSCLR_CNT14_STATUS_Msk (1UL << PMU_OVSCLR_CNT14_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT15_STATUS_Pos 15U /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Position */ -#define PMU_OVSCLR_CNT15_STATUS_Msk (1UL << PMU_OVSCLR_CNT15_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT16_STATUS_Pos 16U /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Position */ -#define PMU_OVSCLR_CNT16_STATUS_Msk (1UL << PMU_OVSCLR_CNT16_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT17_STATUS_Pos 17U /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Position */ -#define PMU_OVSCLR_CNT17_STATUS_Msk (1UL << PMU_OVSCLR_CNT17_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT18_STATUS_Pos 18U /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Position */ -#define PMU_OVSCLR_CNT18_STATUS_Msk (1UL << PMU_OVSCLR_CNT18_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT19_STATUS_Pos 19U /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Position */ -#define PMU_OVSCLR_CNT19_STATUS_Msk (1UL << PMU_OVSCLR_CNT19_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT20_STATUS_Pos 20U /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Position */ -#define PMU_OVSCLR_CNT20_STATUS_Msk (1UL << PMU_OVSCLR_CNT20_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT21_STATUS_Pos 21U /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Position */ -#define PMU_OVSCLR_CNT21_STATUS_Msk (1UL << PMU_OVSCLR_CNT21_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT22_STATUS_Pos 22U /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Position */ -#define PMU_OVSCLR_CNT22_STATUS_Msk (1UL << PMU_OVSCLR_CNT22_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT23_STATUS_Pos 23U /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Position */ -#define PMU_OVSCLR_CNT23_STATUS_Msk (1UL << PMU_OVSCLR_CNT23_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT24_STATUS_Pos 24U /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Position */ -#define PMU_OVSCLR_CNT24_STATUS_Msk (1UL << PMU_OVSCLR_CNT24_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT25_STATUS_Pos 25U /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Position */ -#define PMU_OVSCLR_CNT25_STATUS_Msk (1UL << PMU_OVSCLR_CNT25_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT26_STATUS_Pos 26U /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Position */ -#define PMU_OVSCLR_CNT26_STATUS_Msk (1UL << PMU_OVSCLR_CNT26_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT27_STATUS_Pos 27U /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Position */ -#define PMU_OVSCLR_CNT27_STATUS_Msk (1UL << PMU_OVSCLR_CNT27_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT28_STATUS_Pos 28U /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Position */ -#define PMU_OVSCLR_CNT28_STATUS_Msk (1UL << PMU_OVSCLR_CNT28_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT29_STATUS_Pos 29U /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Position */ -#define PMU_OVSCLR_CNT29_STATUS_Msk (1UL << PMU_OVSCLR_CNT29_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT30_STATUS_Pos 30U /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Position */ -#define PMU_OVSCLR_CNT30_STATUS_Msk (1UL << PMU_OVSCLR_CNT30_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Mask */ - -#define PMU_OVSCLR_CYCCNT_STATUS_Pos 31U /*!< PMU OVSCLR: Cycle Counter Overflow Clear Position */ -#define PMU_OVSCLR_CYCCNT_STATUS_Msk (1UL << PMU_OVSCLR_CYCCNT_STATUS_Pos) /*!< PMU OVSCLR: Cycle Counter Overflow Clear Mask */ - -/** \brief PMU Software Increment Counter */ - -#define PMU_SWINC_CNT0_Pos 0U /*!< PMU SWINC: Event Counter 0 Software Increment Position */ -#define PMU_SWINC_CNT0_Msk (1UL /*<< PMU_SWINC_CNT0_Pos */) /*!< PMU SWINC: Event Counter 0 Software Increment Mask */ - -#define PMU_SWINC_CNT1_Pos 1U /*!< PMU SWINC: Event Counter 1 Software Increment Position */ -#define PMU_SWINC_CNT1_Msk (1UL << PMU_SWINC_CNT1_Pos) /*!< PMU SWINC: Event Counter 1 Software Increment Mask */ - -#define PMU_SWINC_CNT2_Pos 2U /*!< PMU SWINC: Event Counter 2 Software Increment Position */ -#define PMU_SWINC_CNT2_Msk (1UL << PMU_SWINC_CNT2_Pos) /*!< PMU SWINC: Event Counter 2 Software Increment Mask */ - -#define PMU_SWINC_CNT3_Pos 3U /*!< PMU SWINC: Event Counter 3 Software Increment Position */ -#define PMU_SWINC_CNT3_Msk (1UL << PMU_SWINC_CNT3_Pos) /*!< PMU SWINC: Event Counter 3 Software Increment Mask */ - -#define PMU_SWINC_CNT4_Pos 4U /*!< PMU SWINC: Event Counter 4 Software Increment Position */ -#define PMU_SWINC_CNT4_Msk (1UL << PMU_SWINC_CNT4_Pos) /*!< PMU SWINC: Event Counter 4 Software Increment Mask */ - -#define PMU_SWINC_CNT5_Pos 5U /*!< PMU SWINC: Event Counter 5 Software Increment Position */ -#define PMU_SWINC_CNT5_Msk (1UL << PMU_SWINC_CNT5_Pos) /*!< PMU SWINC: Event Counter 5 Software Increment Mask */ - -#define PMU_SWINC_CNT6_Pos 6U /*!< PMU SWINC: Event Counter 6 Software Increment Position */ -#define PMU_SWINC_CNT6_Msk (1UL << PMU_SWINC_CNT6_Pos) /*!< PMU SWINC: Event Counter 6 Software Increment Mask */ - -#define PMU_SWINC_CNT7_Pos 7U /*!< PMU SWINC: Event Counter 7 Software Increment Position */ -#define PMU_SWINC_CNT7_Msk (1UL << PMU_SWINC_CNT7_Pos) /*!< PMU SWINC: Event Counter 7 Software Increment Mask */ - -#define PMU_SWINC_CNT8_Pos 8U /*!< PMU SWINC: Event Counter 8 Software Increment Position */ -#define PMU_SWINC_CNT8_Msk (1UL << PMU_SWINC_CNT8_Pos) /*!< PMU SWINC: Event Counter 8 Software Increment Mask */ - -#define PMU_SWINC_CNT9_Pos 9U /*!< PMU SWINC: Event Counter 9 Software Increment Position */ -#define PMU_SWINC_CNT9_Msk (1UL << PMU_SWINC_CNT9_Pos) /*!< PMU SWINC: Event Counter 9 Software Increment Mask */ - -#define PMU_SWINC_CNT10_Pos 10U /*!< PMU SWINC: Event Counter 10 Software Increment Position */ -#define PMU_SWINC_CNT10_Msk (1UL << PMU_SWINC_CNT10_Pos) /*!< PMU SWINC: Event Counter 10 Software Increment Mask */ - -#define PMU_SWINC_CNT11_Pos 11U /*!< PMU SWINC: Event Counter 11 Software Increment Position */ -#define PMU_SWINC_CNT11_Msk (1UL << PMU_SWINC_CNT11_Pos) /*!< PMU SWINC: Event Counter 11 Software Increment Mask */ - -#define PMU_SWINC_CNT12_Pos 12U /*!< PMU SWINC: Event Counter 12 Software Increment Position */ -#define PMU_SWINC_CNT12_Msk (1UL << PMU_SWINC_CNT12_Pos) /*!< PMU SWINC: Event Counter 12 Software Increment Mask */ - -#define PMU_SWINC_CNT13_Pos 13U /*!< PMU SWINC: Event Counter 13 Software Increment Position */ -#define PMU_SWINC_CNT13_Msk (1UL << PMU_SWINC_CNT13_Pos) /*!< PMU SWINC: Event Counter 13 Software Increment Mask */ - -#define PMU_SWINC_CNT14_Pos 14U /*!< PMU SWINC: Event Counter 14 Software Increment Position */ -#define PMU_SWINC_CNT14_Msk (1UL << PMU_SWINC_CNT14_Pos) /*!< PMU SWINC: Event Counter 14 Software Increment Mask */ - -#define PMU_SWINC_CNT15_Pos 15U /*!< PMU SWINC: Event Counter 15 Software Increment Position */ -#define PMU_SWINC_CNT15_Msk (1UL << PMU_SWINC_CNT15_Pos) /*!< PMU SWINC: Event Counter 15 Software Increment Mask */ - -#define PMU_SWINC_CNT16_Pos 16U /*!< PMU SWINC: Event Counter 16 Software Increment Position */ -#define PMU_SWINC_CNT16_Msk (1UL << PMU_SWINC_CNT16_Pos) /*!< PMU SWINC: Event Counter 16 Software Increment Mask */ - -#define PMU_SWINC_CNT17_Pos 17U /*!< PMU SWINC: Event Counter 17 Software Increment Position */ -#define PMU_SWINC_CNT17_Msk (1UL << PMU_SWINC_CNT17_Pos) /*!< PMU SWINC: Event Counter 17 Software Increment Mask */ - -#define PMU_SWINC_CNT18_Pos 18U /*!< PMU SWINC: Event Counter 18 Software Increment Position */ -#define PMU_SWINC_CNT18_Msk (1UL << PMU_SWINC_CNT18_Pos) /*!< PMU SWINC: Event Counter 18 Software Increment Mask */ - -#define PMU_SWINC_CNT19_Pos 19U /*!< PMU SWINC: Event Counter 19 Software Increment Position */ -#define PMU_SWINC_CNT19_Msk (1UL << PMU_SWINC_CNT19_Pos) /*!< PMU SWINC: Event Counter 19 Software Increment Mask */ - -#define PMU_SWINC_CNT20_Pos 20U /*!< PMU SWINC: Event Counter 20 Software Increment Position */ -#define PMU_SWINC_CNT20_Msk (1UL << PMU_SWINC_CNT20_Pos) /*!< PMU SWINC: Event Counter 20 Software Increment Mask */ - -#define PMU_SWINC_CNT21_Pos 21U /*!< PMU SWINC: Event Counter 21 Software Increment Position */ -#define PMU_SWINC_CNT21_Msk (1UL << PMU_SWINC_CNT21_Pos) /*!< PMU SWINC: Event Counter 21 Software Increment Mask */ - -#define PMU_SWINC_CNT22_Pos 22U /*!< PMU SWINC: Event Counter 22 Software Increment Position */ -#define PMU_SWINC_CNT22_Msk (1UL << PMU_SWINC_CNT22_Pos) /*!< PMU SWINC: Event Counter 22 Software Increment Mask */ - -#define PMU_SWINC_CNT23_Pos 23U /*!< PMU SWINC: Event Counter 23 Software Increment Position */ -#define PMU_SWINC_CNT23_Msk (1UL << PMU_SWINC_CNT23_Pos) /*!< PMU SWINC: Event Counter 23 Software Increment Mask */ - -#define PMU_SWINC_CNT24_Pos 24U /*!< PMU SWINC: Event Counter 24 Software Increment Position */ -#define PMU_SWINC_CNT24_Msk (1UL << PMU_SWINC_CNT24_Pos) /*!< PMU SWINC: Event Counter 24 Software Increment Mask */ - -#define PMU_SWINC_CNT25_Pos 25U /*!< PMU SWINC: Event Counter 25 Software Increment Position */ -#define PMU_SWINC_CNT25_Msk (1UL << PMU_SWINC_CNT25_Pos) /*!< PMU SWINC: Event Counter 25 Software Increment Mask */ - -#define PMU_SWINC_CNT26_Pos 26U /*!< PMU SWINC: Event Counter 26 Software Increment Position */ -#define PMU_SWINC_CNT26_Msk (1UL << PMU_SWINC_CNT26_Pos) /*!< PMU SWINC: Event Counter 26 Software Increment Mask */ - -#define PMU_SWINC_CNT27_Pos 27U /*!< PMU SWINC: Event Counter 27 Software Increment Position */ -#define PMU_SWINC_CNT27_Msk (1UL << PMU_SWINC_CNT27_Pos) /*!< PMU SWINC: Event Counter 27 Software Increment Mask */ - -#define PMU_SWINC_CNT28_Pos 28U /*!< PMU SWINC: Event Counter 28 Software Increment Position */ -#define PMU_SWINC_CNT28_Msk (1UL << PMU_SWINC_CNT28_Pos) /*!< PMU SWINC: Event Counter 28 Software Increment Mask */ - -#define PMU_SWINC_CNT29_Pos 29U /*!< PMU SWINC: Event Counter 29 Software Increment Position */ -#define PMU_SWINC_CNT29_Msk (1UL << PMU_SWINC_CNT29_Pos) /*!< PMU SWINC: Event Counter 29 Software Increment Mask */ - -#define PMU_SWINC_CNT30_Pos 30U /*!< PMU SWINC: Event Counter 30 Software Increment Position */ -#define PMU_SWINC_CNT30_Msk (1UL << PMU_SWINC_CNT30_Pos) /*!< PMU SWINC: Event Counter 30 Software Increment Mask */ - -/** \brief PMU Control Register Definitions */ - -#define PMU_CTRL_ENABLE_Pos 0U /*!< PMU CTRL: ENABLE Position */ -#define PMU_CTRL_ENABLE_Msk (1UL /*<< PMU_CTRL_ENABLE_Pos*/) /*!< PMU CTRL: ENABLE Mask */ - -#define PMU_CTRL_EVENTCNT_RESET_Pos 1U /*!< PMU CTRL: Event Counter Reset Position */ -#define PMU_CTRL_EVENTCNT_RESET_Msk (1UL << PMU_CTRL_EVENTCNT_RESET_Pos) /*!< PMU CTRL: Event Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_RESET_Pos 2U /*!< PMU CTRL: Cycle Counter Reset Position */ -#define PMU_CTRL_CYCCNT_RESET_Msk (1UL << PMU_CTRL_CYCCNT_RESET_Pos) /*!< PMU CTRL: Cycle Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_DISABLE_Pos 5U /*!< PMU CTRL: Disable Cycle Counter Position */ -#define PMU_CTRL_CYCCNT_DISABLE_Msk (1UL << PMU_CTRL_CYCCNT_DISABLE_Pos) /*!< PMU CTRL: Disable Cycle Counter Mask */ - -#define PMU_CTRL_FRZ_ON_OV_Pos 9U /*!< PMU CTRL: Freeze-on-overflow Position */ -#define PMU_CTRL_FRZ_ON_OV_Msk (1UL << PMU_CTRL_FRZ_ON_OVERFLOW_Pos) /*!< PMU CTRL: Freeze-on-overflow Mask */ - -#define PMU_CTRL_TRACE_ON_OV_Pos 11U /*!< PMU CTRL: Trace-on-overflow Position */ -#define PMU_CTRL_TRACE_ON_OV_Msk (1UL << PMU_CTRL_TRACE_ON_OVERFLOW_Pos) /*!< PMU CTRL: Trace-on-overflow Mask */ - -/** \brief PMU Type Register Definitions */ - -#define PMU_TYPE_NUM_CNTS_Pos 0U /*!< PMU TYPE: Number of Counters Position */ -#define PMU_TYPE_NUM_CNTS_Msk (0xFFUL /*<< PMU_TYPE_NUM_CNTS_Pos*/) /*!< PMU TYPE: Number of Counters Mask */ - -#define PMU_TYPE_SIZE_CNTS_Pos 8U /*!< PMU TYPE: Size of Counters Position */ -#define PMU_TYPE_SIZE_CNTS_Msk (0x3FUL << PMU_TYPE_SIZE_CNTS_Pos) /*!< PMU TYPE: Size of Counters Mask */ - -#define PMU_TYPE_CYCCNT_PRESENT_Pos 14U /*!< PMU TYPE: Cycle Counter Present Position */ -#define PMU_TYPE_CYCCNT_PRESENT_Msk (1UL << PMU_TYPE_CYCCNT_PRESENT_Pos) /*!< PMU TYPE: Cycle Counter Present Mask */ - -#define PMU_TYPE_FRZ_OV_SUPPORT_Pos 21U /*!< PMU TYPE: Freeze-on-overflow Support Position */ -#define PMU_TYPE_FRZ_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Freeze-on-overflow Support Mask */ - -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Pos 23U /*!< PMU TYPE: Trace-on-overflow Support Position */ -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Trace-on-overflow Support Mask */ - -/** \brief PMU Authentication Status Register Definitions */ - -#define PMU_AUTHSTATUS_NSID_Pos 0U /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSID_Msk (0x3UL /*<< PMU_AUTHSTATUS_NSID_Pos*/) /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSNID_Pos 2U /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSNID_Msk (0x3UL << PMU_AUTHSTATUS_NSNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SID_Pos 4U /*!< PMU AUTHSTATUS: Secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_SID_Msk (0x3UL << PMU_AUTHSTATUS_SID_Pos) /*!< PMU AUTHSTATUS: Secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SNID_Pos 6U /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SNID_Msk (0x3UL << PMU_AUTHSTATUS_SNID_Pos) /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUID_Pos 16U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUID_Msk (0x3UL << PMU_AUTHSTATUS_NSUID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUNID_Pos 18U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUNID_Msk (0x3UL << PMU_AUTHSTATUS_NSUNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUID_Pos 20U /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_SUID_Msk (0x3UL << PMU_AUTHSTATUS_SUID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUNID_Pos 22U /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SUNID_Msk (0x3UL << PMU_AUTHSTATUS_SUNID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Mask */ - - -/*@} end of group CMSIS_PMU */ -#endif - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ -#define MPU_RLAR_PXN_Msk (1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -#define FPU_FPDSCR_FZ16_Pos 19U /*!< FPDSCR: FZ16 bit Position */ -#define FPU_FPDSCR_FZ16_Msk (1UL << FPU_FPDSCR_FZ16_Pos) /*!< FPDSCR: FZ16 bit Mask */ - -#define FPU_FPDSCR_LTPSIZE_Pos 16U /*!< FPDSCR: LTPSIZE bit Position */ -#define FPU_FPDSCR_LTPSIZE_Msk (7UL << FPU_FPDSCR_LTPSIZE_Pos) /*!< FPDSCR: LTPSIZE bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FPRound_Pos 28U /*!< MVFR0: FPRound bits Position */ -#define FPU_MVFR0_FPRound_Msk (0xFUL << FPU_MVFR0_FPRound_Pos) /*!< MVFR0: FPRound bits Mask */ - -#define FPU_MVFR0_FPSqrt_Pos 20U /*!< MVFR0: FPSqrt bits Position */ -#define FPU_MVFR0_FPSqrt_Msk (0xFUL << FPU_MVFR0_FPSqrt_Pos) /*!< MVFR0: FPSqrt bits Mask */ - -#define FPU_MVFR0_FPDivide_Pos 16U /*!< MVFR0: FPDivide bits Position */ -#define FPU_MVFR0_FPDivide_Msk (0xFUL << FPU_MVFR0_FPDivide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FPDP_Pos 8U /*!< MVFR0: FPDP bits Position */ -#define FPU_MVFR0_FPDP_Msk (0xFUL << FPU_MVFR0_FPDP_Pos) /*!< MVFR0: FPDP bits Mask */ - -#define FPU_MVFR0_FPSP_Pos 4U /*!< MVFR0: FPSP bits Position */ -#define FPU_MVFR0_FPSP_Msk (0xFUL << FPU_MVFR0_FPSP_Pos) /*!< MVFR0: FPSP bits Mask */ - -#define FPU_MVFR0_SIMDReg_Pos 0U /*!< MVFR0: SIMDReg bits Position */ -#define FPU_MVFR0_SIMDReg_Msk (0xFUL /*<< FPU_MVFR0_SIMDReg_Pos*/) /*!< MVFR0: SIMDReg bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FMAC_Pos 28U /*!< MVFR1: FMAC bits Position */ -#define FPU_MVFR1_FMAC_Msk (0xFUL << FPU_MVFR1_FMAC_Pos) /*!< MVFR1: FMAC bits Mask */ - -#define FPU_MVFR1_FPHP_Pos 24U /*!< MVFR1: FPHP bits Position */ -#define FPU_MVFR1_FPHP_Msk (0xFUL << FPU_MVFR1_FPHP_Pos) /*!< MVFR1: FPHP bits Mask */ - -#define FPU_MVFR1_FP16_Pos 20U /*!< MVFR1: FP16 bits Position */ -#define FPU_MVFR1_FP16_Msk (0xFUL << FPU_MVFR1_FP16_Pos) /*!< MVFR1: FP16 bits Mask */ - -#define FPU_MVFR1_MVE_Pos 8U /*!< MVFR1: MVE bits Position */ -#define FPU_MVFR1_MVE_Msk (0xFUL << FPU_MVFR1_MVE_Pos) /*!< MVFR1: MVE bits Mask */ - -#define FPU_MVFR1_FPDNaN_Pos 4U /*!< MVFR1: FPDNaN bits Position */ -#define FPU_MVFR1_FPDNaN_Msk (0xFUL << FPU_MVFR1_FPDNaN_Pos) /*!< MVFR1: FPDNaN bits Mask */ - -#define FPU_MVFR1_FPFtZ_Pos 0U /*!< MVFR1: FPFtZ bits Position */ -#define FPU_MVFR1_FPFtZ_Msk (0xFUL /*<< FPU_MVFR1_FPFtZ_Pos*/) /*!< MVFR1: FPFtZ bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_FPD_Pos 23U /*!< \deprecated CoreDebug DHCSR: S_FPD Position */ -#define CoreDebug_DHCSR_S_FPD_Msk (1UL << CoreDebug_DHCSR_S_FPD_Pos) /*!< \deprecated CoreDebug DHCSR: S_FPD Mask */ - -#define CoreDebug_DHCSR_S_SUIDE_Pos 22U /*!< \deprecated CoreDebug DHCSR: S_SUIDE Position */ -#define CoreDebug_DHCSR_S_SUIDE_Msk (1UL << CoreDebug_DHCSR_S_SUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SUIDE Mask */ - -#define CoreDebug_DHCSR_S_NSUIDE_Pos 21U /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Position */ -#define CoreDebug_DHCSR_S_NSUIDE_Msk (1UL << CoreDebug_DHCSR_S_NSUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Mask */ - -#define CoreDebug_DHCSR_S_SDE_Pos 20U /*!< \deprecated CoreDebug DHCSR: S_SDE Position */ -#define CoreDebug_DHCSR_S_SDE_Msk (1UL << CoreDebug_DHCSR_S_SDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SDE Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_PMOV_Pos 6U /*!< \deprecated CoreDebug DHCSR: C_PMOV Position */ -#define CoreDebug_DHCSR_C_PMOV_Msk (1UL << CoreDebug_DHCSR_C_PMOV_Pos) /*!< \deprecated CoreDebug DHCSR: C_PMOV Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Set Clear Exception and Monitor Control Register Definitions */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_REQ_Pos 3U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_SET_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_PEND_Pos 1U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_SET_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_UIDEN_Pos 10U /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_UIDAPEN_Pos 9U /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDAPEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDAPEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Mask */ - -#define CoreDebug_DAUTHCTRL_FSDMA_Pos 8U /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Position */ -#define CoreDebug_DAUTHCTRL_FSDMA_Msk (1UL << CoreDebug_DAUTHCTRL_FSDMA_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_FPD_Pos 23U /*!< DCB DHCSR: Floating-point registers Debuggable Position */ -#define DCB_DHCSR_S_FPD_Msk (0x1UL << DCB_DHCSR_S_FPD_Pos) /*!< DCB DHCSR: Floating-point registers Debuggable Mask */ - -#define DCB_DHCSR_S_SUIDE_Pos 22U /*!< DCB DHCSR: Secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_SUIDE_Msk (0x1UL << DCB_DHCSR_S_SUIDE_Pos) /*!< DCB DHCSR: Secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_NSUIDE_Pos 21U /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_NSUIDE_Msk (0x1UL << DCB_DHCSR_S_NSUIDE_Pos) /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_PMOV_Pos 6U /*!< DCB DHCSR: Halt on PMU overflow control Position */ -#define DCB_DHCSR_C_PMOV_Msk (0x1UL << DCB_DHCSR_C_PMOV_Pos) /*!< DCB DHCSR: Halt on PMU overflow control Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DSCEMCR, Debug Set Clear Exception and Monitor Control Register Definitions */ -#define DCB_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< DCB DSCEMCR: Clear monitor request Position */ -#define DCB_DSCEMCR_CLR_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_REQ_Pos) /*!< DCB DSCEMCR: Clear monitor request Mask */ - -#define DCB_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< DCB DSCEMCR: Clear monitor pend Position */ -#define DCB_DSCEMCR_CLR_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_PEND_Pos) /*!< DCB DSCEMCR: Clear monitor pend Mask */ - -#define DCB_DSCEMCR_SET_MON_REQ_Pos 3U /*!< DCB DSCEMCR: Set monitor request Position */ -#define DCB_DSCEMCR_SET_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_SET_MON_REQ_Pos) /*!< DCB DSCEMCR: Set monitor request Mask */ - -#define DCB_DSCEMCR_SET_MON_PEND_Pos 1U /*!< DCB DSCEMCR: Set monitor pend Position */ -#define DCB_DSCEMCR_SET_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_SET_MON_PEND_Pos) /*!< DCB DSCEMCR: Set monitor pend Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_UIDEN_Pos 10U /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Position */ -#define DCB_DAUTHCTRL_UIDEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Mask */ - -#define DCB_DAUTHCTRL_UIDAPEN_Pos 9U /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Position */ -#define DCB_DAUTHCTRL_UIDAPEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDAPEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Mask */ - -#define DCB_DAUTHCTRL_FSDMA_Pos 8U /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Position */ -#define DCB_DAUTHCTRL_FSDMA_Msk (0x1UL << DCB_DAUTHCTRL_FSDMA_Pos) /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Mask */ - -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SUNID_Pos 22U /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUNID_Msk (0x3UL << DIB_DAUTHSTATUS_SUNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SUID_Pos 20U /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUID_Msk (0x3UL << DIB_DAUTHSTATUS_SUID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_NSUNID_Pos 18U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Position */ -#define DIB_DAUTHSTATUS_NSUNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Mask */ - -#define DIB_DAUTHSTATUS_NSUID_Pos 16U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_NSUID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define MEMSYSCTL_BASE (0xE001E000UL) /*!< Memory System Control Base Address */ - #define ERRBNK_BASE (0xE001E100UL) /*!< Error Banking Base Address */ - #define PWRMODCTL_BASE (0xE001E300UL) /*!< Power Mode Control Base Address */ - #define EWIC_BASE (0xE001E400UL) /*!< External Wakeup Interrupt Controller Base Address */ - #define PRCCFGINF_BASE (0xE001E700UL) /*!< Processor Configuration Information Base Address */ - #define STL_BASE (0xE001E800UL) /*!< Software Test Library Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define ICB ((ICB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define MEMSYSCTL ((MemSysCtl_Type *) MEMSYSCTL_BASE ) /*!< Memory System Control configuration struct */ - #define ERRBNK ((ErrBnk_Type *) ERRBNK_BASE ) /*!< Error Banking configuration struct */ - #define PWRMODCTL ((PwrModCtl_Type *) PWRMODCTL_BASE ) /*!< Power Mode Control configuration struct */ - #define EWIC ((EWIC_Type *) EWIC_BASE ) /*!< EWIC configuration struct */ - #define PRCCFGINF ((PrcCfgInf_Type *) PRCCFGINF_BASE ) /*!< Processor Configuration Information configuration struct */ - #define STL ((STL_Type *) STL_BASE ) /*!< Software Test Library configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - #define PMU_BASE (0xE0003000UL) /*!< PMU Base Address */ - #define PMU ((PMU_Type *) PMU_BASE ) /*!< PMU configuration struct */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define ICB_NS ((ICB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ - -/* 'SCnSCB' is deprecated and replaced by 'ICB' */ -typedef ICB_Type SCnSCB_Type; - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISCRITAXIRUW_Pos (ICB_ACTLR_DISCRITAXIRUW_Pos) -#define SCnSCB_ACTLR_DISCRITAXIRUW_Msk (ICB_ACTLR_DISCRITAXIRUW_Msk) - -#define SCnSCB_ACTLR_DISDI_Pos (ICB_ACTLR_DISDI_Pos) -#define SCnSCB_ACTLR_DISDI_Msk (ICB_ACTLR_DISDI_Msk) - -#define SCnSCB_ACTLR_DISCRITAXIRUR_Pos (ICB_ACTLR_DISCRITAXIRUR_Pos) -#define SCnSCB_ACTLR_DISCRITAXIRUR_Msk (ICB_ACTLR_DISCRITAXIRUR_Msk) - -#define SCnSCB_ACTLR_EVENTBUSEN_Pos (ICB_ACTLR_EVENTBUSEN_Pos) -#define SCnSCB_ACTLR_EVENTBUSEN_Msk (ICB_ACTLR_EVENTBUSEN_Msk) - -#define SCnSCB_ACTLR_EVENTBUSEN_S_Pos (ICB_ACTLR_EVENTBUSEN_S_Pos) -#define SCnSCB_ACTLR_EVENTBUSEN_S_Msk (ICB_ACTLR_EVENTBUSEN_S_Msk) - -#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos (ICB_ACTLR_DISITMATBFLUSH_Pos) -#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (ICB_ACTLR_DISITMATBFLUSH_Msk) - -#define SCnSCB_ACTLR_DISNWAMODE_Pos (ICB_ACTLR_DISNWAMODE_Pos) -#define SCnSCB_ACTLR_DISNWAMODE_Msk (ICB_ACTLR_DISNWAMODE_Msk) - -#define SCnSCB_ACTLR_FPEXCODIS_Pos (ICB_ACTLR_FPEXCODIS_Pos) -#define SCnSCB_ACTLR_FPEXCODIS_Msk (ICB_ACTLR_FPEXCODIS_Msk) - -#define SCnSCB_ACTLR_DISOLAP_Pos (ICB_ACTLR_DISOLAP_Pos) -#define SCnSCB_ACTLR_DISOLAP_Msk (ICB_ACTLR_DISOLAP_Msk) - -#define SCnSCB_ACTLR_DISOLAPS_Pos (ICB_ACTLR_DISOLAPS_Pos) -#define SCnSCB_ACTLR_DISOLAPS_Msk (ICB_ACTLR_DISOLAPS_Msk) - -#define SCnSCB_ACTLR_DISLOBR_Pos (ICB_ACTLR_DISLOBR_Pos) -#define SCnSCB_ACTLR_DISLOBR_Msk (ICB_ACTLR_DISLOBR_Msk) - -#define SCnSCB_ACTLR_DISLO_Pos (ICB_ACTLR_DISLO_Pos) -#define SCnSCB_ACTLR_DISLO_Msk (ICB_ACTLR_DISLO_Msk) - -#define SCnSCB_ACTLR_DISLOLEP_Pos (ICB_ACTLR_DISLOLEP_Pos) -#define SCnSCB_ACTLR_DISLOLEP_Msk (ICB_ACTLR_DISLOLEP_Msk) - -#define SCnSCB_ACTLR_DISFOLD_Pos (ICB_ACTLR_DISFOLD_Pos) -#define SCnSCB_ACTLR_DISFOLD_Msk (ICB_ACTLR_DISFOLD_Msk) - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos (ICB_ICTR_INTLINESNUM_Pos) -#define SCnSCB_ICTR_INTLINESNUM_Msk (ICB_ICTR_INTLINESNUM_Msk) - -#define SCnSCB (ICB) -#define SCnSCB_NS (ICB_NS) - -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## PMU functions and events #################################### */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - -#include "pmu_armv8.h" - -/** - \brief Cortex-M55 PMU events - \note Architectural PMU events can be found in pmu_armv8.h -*/ - -#define ARMCM55_PMU_ECC_ERR 0xC000 /*!< Any ECC error */ -#define ARMCM55_PMU_ECC_ERR_FATAL 0xC001 /*!< Any fatal ECC error */ -#define ARMCM55_PMU_ECC_ERR_DCACHE 0xC010 /*!< Any ECC error in the data cache */ -#define ARMCM55_PMU_ECC_ERR_ICACHE 0xC011 /*!< Any ECC error in the instruction cache */ -#define ARMCM55_PMU_ECC_ERR_FATAL_DCACHE 0xC012 /*!< Any fatal ECC error in the data cache */ -#define ARMCM55_PMU_ECC_ERR_FATAL_ICACHE 0xC013 /*!< Any fatal ECC error in the instruction cache*/ -#define ARMCM55_PMU_ECC_ERR_DTCM 0xC020 /*!< Any ECC error in the DTCM */ -#define ARMCM55_PMU_ECC_ERR_ITCM 0xC021 /*!< Any ECC error in the ITCM */ -#define ARMCM55_PMU_ECC_ERR_FATAL_DTCM 0xC022 /*!< Any fatal ECC error in the DTCM */ -#define ARMCM55_PMU_ECC_ERR_FATAL_ITCM 0xC023 /*!< Any fatal ECC error in the ITCM */ -#define ARMCM55_PMU_PF_LINEFILL 0xC100 /*!< A prefetcher starts a line-fill */ -#define ARMCM55_PMU_PF_CANCEL 0xC101 /*!< A prefetcher stops prefetching */ -#define ARMCM55_PMU_PF_DROP_LINEFILL 0xC102 /*!< A linefill triggered by a prefetcher has been dropped because of lack of buffering */ -#define ARMCM55_PMU_NWAMODE_ENTER 0xC200 /*!< No write-allocate mode entry */ -#define ARMCM55_PMU_NWAMODE 0xC201 /*!< Write-allocate store is not allocated into the data cache due to no-write-allocate mode */ -#define ARMCM55_PMU_SAHB_ACCESS 0xC300 /*!< Read or write access on the S-AHB interface to the TCM */ -#define ARMCM55_PMU_PAHB_ACCESS 0xC301 /*!< Read or write access to the P-AHB write interface */ -#define ARMCM55_PMU_AXI_WRITE_ACCESS 0xC302 /*!< Any beat access to M-AXI write interface */ -#define ARMCM55_PMU_AXI_READ_ACCESS 0xC303 /*!< Any beat access to M-AXI read interface */ -#define ARMCM55_PMU_DOSTIMEOUT_DOUBLE 0xC400 /*!< Denial of Service timeout has fired twice and caused buffers to drain to allow forward progress */ -#define ARMCM55_PMU_DOSTIMEOUT_TRIPLE 0xC401 /*!< Denial of Service timeout has fired three times and blocked the LSU to force forward progress */ - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - -/* ########################## MVE functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_MveFunctions MVE Functions - \brief Function that provides MVE type. - @{ - */ - -/** - \brief get MVE type - \details returns the MVE type - \returns - - \b 0: No Vector Extension (MVE) - - \b 1: Integer Vector Extension (MVE-I) - - \b 2: Floating-point Vector Extension (MVE-F) - */ -__STATIC_INLINE uint32_t SCB_GetMVEType(void) -{ - const uint32_t mvfr1 = FPU->MVFR1; - if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x2U << FPU_MVFR1_MVE_Pos)) - { - return 2U; - } - else if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x1U << FPU_MVFR1_MVE_Pos)) - { - return 1U; - } - else - { - return 0U; - } -} - - -/*@} end of CMSIS_Core_MveFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM55_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_cm7.h b/software/bootloader/Drivers/CMSIS/Include/core_cm7.h deleted file mode 100644 index 010506e..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_cm7.h +++ /dev/null @@ -1,2366 +0,0 @@ -/**************************************************************************//** - * @file core_cm7.h - * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File - * @version V5.1.6 - * @date 04. June 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM7_H_GENERIC -#define __CORE_CM7_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M7 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM7 definitions */ -#define __CM7_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM7_CMSIS_VERSION_SUB ( __CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ - __CM7_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (7U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM7_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM7_H_DEPENDANT -#define __CORE_CM7_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM7_REV - #define __CM7_REV 0x0000U - #warning "__CM7_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DTCM_PRESENT - #define __DTCM_PRESENT 0U - #warning "__DTCM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M7 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[1U]; - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - uint32_t RESERVED3[93U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ - uint32_t RESERVED7[5U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ - __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ - __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ - __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ - uint32_t RESERVED8[1U]; - __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ - -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/* Instruction Tightly-Coupled Memory Control Register Definitions */ -#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ -#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ - -#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ -#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ - -#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ -#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ - -#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ -#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ - -/* Data Tightly-Coupled Memory Control Register Definitions */ -#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ -#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ - -#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ -#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ - -#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ -#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ - -#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ -#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ - -/* AHBP Control Register Definitions */ -#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ -#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ - -#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ -#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ - -/* L1 Cache Control Register Definitions */ -#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ -#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ - -#define SCB_CACR_ECCEN_Pos 1U /*!< \deprecated SCB CACR: ECCEN Position */ -#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< \deprecated SCB CACR: ECCEN Mask */ - -#define SCB_CACR_ECCDIS_Pos 1U /*!< SCB CACR: ECCDIS Position */ -#define SCB_CACR_ECCDIS_Msk (1UL << SCB_CACR_ECCDIS_Pos) /*!< SCB CACR: ECCDIS Mask */ - -#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ -#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ - -/* AHBS Control Register Definitions */ -#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ -#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBSCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ - -#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ -#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBSCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ - -#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ -#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBSCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ - -/* Auxiliary Bus Fault Status Register Definitions */ -#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ -#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ - -#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ -#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ - -#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ -#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ - -#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ -#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ - -#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ -#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ - -#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ -#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISDYNADD_Pos 26U /*!< ACTLR: DISDYNADD Position */ -#define SCnSCB_ACTLR_DISDYNADD_Msk (1UL << SCnSCB_ACTLR_DISDYNADD_Pos) /*!< ACTLR: DISDYNADD Mask */ - -#define SCnSCB_ACTLR_DISISSCH1_Pos 21U /*!< ACTLR: DISISSCH1 Position */ -#define SCnSCB_ACTLR_DISISSCH1_Msk (0x1FUL << SCnSCB_ACTLR_DISISSCH1_Pos) /*!< ACTLR: DISISSCH1 Mask */ - -#define SCnSCB_ACTLR_DISDI_Pos 16U /*!< ACTLR: DISDI Position */ -#define SCnSCB_ACTLR_DISDI_Msk (0x1FUL << SCnSCB_ACTLR_DISDI_Pos) /*!< ACTLR: DISDI Mask */ - -#define SCnSCB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ -#define SCnSCB_ACTLR_DISCRITAXIRUR_Msk (1UL << SCnSCB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ - -#define SCnSCB_ACTLR_DISBTACALLOC_Pos 14U /*!< ACTLR: DISBTACALLOC Position */ -#define SCnSCB_ACTLR_DISBTACALLOC_Msk (1UL << SCnSCB_ACTLR_DISBTACALLOC_Pos) /*!< ACTLR: DISBTACALLOC Mask */ - -#define SCnSCB_ACTLR_DISBTACREAD_Pos 13U /*!< ACTLR: DISBTACREAD Position */ -#define SCnSCB_ACTLR_DISBTACREAD_Msk (1UL << SCnSCB_ACTLR_DISBTACREAD_Pos) /*!< ACTLR: DISBTACREAD Mask */ - -#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ -#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ - -#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ -#define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ - -#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ -#define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED3[981U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ -#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ - -#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ -#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ -#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ - -#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ -#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and FP Feature Register 2 Definitions */ - -#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */ -#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */ - -/*@} end of group CMSIS_FPU */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ -#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ -#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = SCB->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - -/*@} end of CMSIS_Core_FpuFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM7_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_cm85.h b/software/bootloader/Drivers/CMSIS/Include/core_cm85.h deleted file mode 100644 index 6046311..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_cm85.h +++ /dev/null @@ -1,4672 +0,0 @@ -/**************************************************************************//** - * @file core_cm85.h - * @brief CMSIS Cortex-M85 Core Peripheral Access Layer Header File - * @version V1.0.4 - * @date 21. April 2022 - ******************************************************************************/ -/* - * Copyright (c) 2022 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM85_H_GENERIC -#define __CORE_CM85_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M85 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM85 definitions */ - -#define __CORTEX_M (85U) /*!< Cortex-M Core */ - -#if defined ( __CC_ARM ) - #error Legacy Arm Compiler does not support Armv8.1-M target architecture. -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM85_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM85_H_DEPENDANT -#define __CORE_CM85_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM85_REV - #define __CM85_REV 0x0001U - #warning "__CM85_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #if __FPU_PRESENT != 0U - #ifndef __FPU_DP - #define __FPU_DP 0U - #warning "__FPU_DP not defined in device header file; using default!" - #endif - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __PMU_PRESENT - #define __PMU_PRESENT 0U - #warning "__PMU_PRESENT not defined in device header file; using default!" - #endif - - #if __PMU_PRESENT != 0U - #ifndef __PMU_NUM_EVENTCNT - #define __PMU_NUM_EVENTCNT 8U - #warning "__PMU_NUM_EVENTCNT not defined in device header file; using default!" - #elif (__PMU_NUM_EVENTCNT > 8 || __PMU_NUM_EVENTCNT < 2) - #error "__PMU_NUM_EVENTCNT is out of range in device header file!" */ - #endif - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M85 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core EWIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core PMU Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:1; /*!< bit: 20 Reserved */ - uint32_t B:1; /*!< bit: 21 BTI active (read 0) */ - uint32_t _reserved2:2; /*!< bit: 22..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_B_Pos 21U /*!< xPSR: B Position */ -#define xPSR_B_Msk (1UL << xPSR_B_Pos) /*!< xPSR: B Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t BTI_EN:1; /*!< bit: 4 Privileged branch target identification enable */ - uint32_t UBTI_EN:1; /*!< bit: 5 Unprivileged branch target identification enable */ - uint32_t PAC_EN:1; /*!< bit: 6 Privileged pointer authentication enable */ - uint32_t UPAC_EN:1; /*!< bit: 7 Unprivileged pointer authentication enable */ - uint32_t _reserved1:24; /*!< bit: 8..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_UPAC_EN_Pos 7U /*!< CONTROL: UPAC_EN Position */ -#define CONTROL_UPAC_EN_Msk (1UL << CONTROL_UPAC_EN_Pos) /*!< CONTROL: UPAC_EN Mask */ - -#define CONTROL_PAC_EN_Pos 6U /*!< CONTROL: PAC_EN Position */ -#define CONTROL_PAC_EN_Msk (1UL << CONTROL_PAC_EN_Pos) /*!< CONTROL: PAC_EN Mask */ - -#define CONTROL_UBTI_EN_Pos 5U /*!< CONTROL: UBTI_EN Position */ -#define CONTROL_UBTI_EN_Msk (1UL << CONTROL_UBTI_EN_Pos) /*!< CONTROL: UBTI_EN Mask */ - -#define CONTROL_BTI_EN_Pos 4U /*!< CONTROL: BTI_EN Position */ -#define CONTROL_BTI_EN_Msk (1UL << CONTROL_BTI_EN_Pos) /*!< CONTROL: BTI_EN Mask */ - -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - __IOM uint32_t RFSR; /*!< Offset: 0x204 (R/W) RAS Fault Status Register */ - uint32_t RESERVED4[14U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_IESB_Pos 5U /*!< SCB AIRCR: Implicit ESB Enable Position */ -#define SCB_AIRCR_IESB_Msk (1UL << SCB_AIRCR_IESB_Pos) /*!< SCB AIRCR: Implicit ESB Enable Mask */ - -#define SCB_AIRCR_DIT_Pos 4U /*!< SCB AIRCR: Data Independent Timing Position */ -#define SCB_AIRCR_DIT_Msk (1UL << SCB_AIRCR_DIT_Pos) /*!< SCB AIRCR: Data Independent Timing Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_TRD_Pos 20U /*!< SCB CCR: TRD Position */ -#define SCB_CCR_TRD_Msk (1UL << SCB_CCR_TRD_Pos) /*!< SCB CCR: TRD Mask */ - -#define SCB_CCR_LOB_Pos 19U /*!< SCB CCR: LOB Position */ -#define SCB_CCR_LOB_Msk (1UL << SCB_CCR_LOB_Pos) /*!< SCB CCR: LOB Mask */ - -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_PMU_Pos 5U /*!< SCB DFSR: PMU Position */ -#define SCB_DFSR_PMU_Msk (1UL << SCB_DFSR_PMU_Pos) /*!< SCB DFSR: PMU Mask */ - -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CP7_Pos 7U /*!< SCB NSACR: CP7 Position */ -#define SCB_NSACR_CP7_Msk (1UL << SCB_NSACR_CP7_Pos) /*!< SCB NSACR: CP7 Mask */ - -#define SCB_NSACR_CP6_Pos 6U /*!< SCB NSACR: CP6 Position */ -#define SCB_NSACR_CP6_Msk (1UL << SCB_NSACR_CP6_Pos) /*!< SCB NSACR: CP6 Mask */ - -#define SCB_NSACR_CP5_Pos 5U /*!< SCB NSACR: CP5 Position */ -#define SCB_NSACR_CP5_Msk (1UL << SCB_NSACR_CP5_Pos) /*!< SCB NSACR: CP5 Mask */ - -#define SCB_NSACR_CP4_Pos 4U /*!< SCB NSACR: CP4 Position */ -#define SCB_NSACR_CP4_Msk (1UL << SCB_NSACR_CP4_Pos) /*!< SCB NSACR: CP4 Mask */ - -#define SCB_NSACR_CP3_Pos 3U /*!< SCB NSACR: CP3 Position */ -#define SCB_NSACR_CP3_Msk (1UL << SCB_NSACR_CP3_Pos) /*!< SCB NSACR: CP3 Mask */ - -#define SCB_NSACR_CP2_Pos 2U /*!< SCB NSACR: CP2 Position */ -#define SCB_NSACR_CP2_Msk (1UL << SCB_NSACR_CP2_Pos) /*!< SCB NSACR: CP2 Mask */ - -#define SCB_NSACR_CP1_Pos 1U /*!< SCB NSACR: CP1 Position */ -#define SCB_NSACR_CP1_Msk (1UL << SCB_NSACR_CP1_Pos) /*!< SCB NSACR: CP1 Mask */ - -#define SCB_NSACR_CP0_Pos 0U /*!< SCB NSACR: CP0 Position */ -#define SCB_NSACR_CP0_Msk (1UL /*<< SCB_NSACR_CP0_Pos*/) /*!< SCB NSACR: CP0 Mask */ - -/* SCB Debug Feature Register 0 Definitions */ -#define SCB_ID_DFR_UDE_Pos 28U /*!< SCB ID_DFR: UDE Position */ -#define SCB_ID_DFR_UDE_Msk (0xFUL << SCB_ID_DFR_UDE_Pos) /*!< SCB ID_DFR: UDE Mask */ - -#define SCB_ID_DFR_MProfDbg_Pos 20U /*!< SCB ID_DFR: MProfDbg Position */ -#define SCB_ID_DFR_MProfDbg_Msk (0xFUL << SCB_ID_DFR_MProfDbg_Pos) /*!< SCB ID_DFR: MProfDbg Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB RAS Fault Status Register Definitions */ -#define SCB_RFSR_V_Pos 31U /*!< SCB RFSR: V Position */ -#define SCB_RFSR_V_Msk (1UL << SCB_RFSR_V_Pos) /*!< SCB RFSR: V Mask */ - -#define SCB_RFSR_IS_Pos 16U /*!< SCB RFSR: IS Position */ -#define SCB_RFSR_IS_Msk (0x7FFFUL << SCB_RFSR_IS_Pos) /*!< SCB RFSR: IS Mask */ - -#define SCB_RFSR_UET_Pos 0U /*!< SCB RFSR: UET Position */ -#define SCB_RFSR_UET_Msk (3UL /*<< SCB_RFSR_UET_Pos*/) /*!< SCB RFSR: UET Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ICB Implementation Control Block register (ICB) - \brief Type definitions for the Implementation Control Block Register - @{ - */ - -/** - \brief Structure type to access the Implementation Control Block (ICB). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} ICB_Type; - -/* Auxiliary Control Register Definitions */ -#define ICB_ACTLR_DISCRITAXIRUW_Pos 27U /*!< ACTLR: DISCRITAXIRUW Position */ -#define ICB_ACTLR_DISCRITAXIRUW_Msk (1UL << ICB_ACTLR_DISCRITAXIRUW_Pos) /*!< ACTLR: DISCRITAXIRUW Mask */ - -#define ICB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ -#define ICB_ACTLR_DISCRITAXIRUR_Msk (1UL << ICB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ - -#define ICB_ACTLR_EVENTBUSEN_Pos 14U /*!< ACTLR: EVENTBUSEN Position */ -#define ICB_ACTLR_EVENTBUSEN_Msk (1UL << ICB_ACTLR_EVENTBUSEN_Pos) /*!< ACTLR: EVENTBUSEN Mask */ - -#define ICB_ACTLR_EVENTBUSEN_S_Pos 13U /*!< ACTLR: EVENTBUSEN_S Position */ -#define ICB_ACTLR_EVENTBUSEN_S_Msk (1UL << ICB_ACTLR_EVENTBUSEN_S_Pos) /*!< ACTLR: EVENTBUSEN_S Mask */ - -#define ICB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ -#define ICB_ACTLR_DISITMATBFLUSH_Msk (1UL << ICB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ - -#define ICB_ACTLR_DISNWAMODE_Pos 11U /*!< ACTLR: DISNWAMODE Position */ -#define ICB_ACTLR_DISNWAMODE_Msk (1UL << ICB_ACTLR_DISNWAMODE_Pos) /*!< ACTLR: DISNWAMODE Mask */ - -#define ICB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ -#define ICB_ACTLR_FPEXCODIS_Msk (1UL << ICB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ - -/* Interrupt Controller Type Register Definitions */ -#define ICB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define ICB_ICTR_INTLINESNUM_Msk (0xFUL /*<< ICB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_ICB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[3U]; - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) ITM Device Type Register */ - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup MemSysCtl_Type Memory System Control Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Memory System Control Registers (MEMSYSCTL) - @{ - */ - -/** - \brief Structure type to access the Memory System Control Registers (MEMSYSCTL). - */ -typedef struct -{ - __IOM uint32_t MSCR; /*!< Offset: 0x000 (R/W) Memory System Control Register */ - __IOM uint32_t PFCR; /*!< Offset: 0x004 (R/W) Prefetcher Control Register */ - uint32_t RESERVED1[2U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x010 (R/W) ITCM Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x014 (R/W) DTCM Control Register */ - __IOM uint32_t PAHBCR; /*!< Offset: 0x018 (R/W) P-AHB Control Register */ - uint32_t RESERVED2[313U]; - __IOM uint32_t ITGU_CTRL; /*!< Offset: 0x500 (R/W) ITGU Control Register */ - __IOM uint32_t ITGU_CFG; /*!< Offset: 0x504 (R/W) ITGU Configuration Register */ - uint32_t RESERVED3[2U]; - __IOM uint32_t ITGU_LUT[16U]; /*!< Offset: 0x510 (R/W) ITGU Look Up Table Register */ - uint32_t RESERVED4[44U]; - __IOM uint32_t DTGU_CTRL; /*!< Offset: 0x600 (R/W) DTGU Control Registers */ - __IOM uint32_t DTGU_CFG; /*!< Offset: 0x604 (R/W) DTGU Configuration Register */ - uint32_t RESERVED5[2U]; - __IOM uint32_t DTGU_LUT[16U]; /*!< Offset: 0x610 (R/W) DTGU Look Up Table Register */ -} MemSysCtl_Type; - -/* MEMSYSCTL Memory System Control Register (MSCR) Register Definitions */ -#define MEMSYSCTL_MSCR_CPWRDN_Pos 17U /*!< MEMSYSCTL MSCR: CPWRDN Position */ -#define MEMSYSCTL_MSCR_CPWRDN_Msk (0x1UL << MEMSYSCTL_MSCR_CPWRDN_Pos) /*!< MEMSYSCTL MSCR: CPWRDN Mask */ - -#define MEMSYSCTL_MSCR_DCCLEAN_Pos 16U /*!< MEMSYSCTL MSCR: DCCLEAN Position */ -#define MEMSYSCTL_MSCR_DCCLEAN_Msk (0x1UL << MEMSYSCTL_MSCR_DCCLEAN_Pos) /*!< MEMSYSCTL MSCR: DCCLEAN Mask */ - -#define MEMSYSCTL_MSCR_ICACTIVE_Pos 13U /*!< MEMSYSCTL MSCR: ICACTIVE Position */ -#define MEMSYSCTL_MSCR_ICACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_ICACTIVE_Pos) /*!< MEMSYSCTL MSCR: ICACTIVE Mask */ - -#define MEMSYSCTL_MSCR_DCACTIVE_Pos 12U /*!< MEMSYSCTL MSCR: DCACTIVE Position */ -#define MEMSYSCTL_MSCR_DCACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_DCACTIVE_Pos) /*!< MEMSYSCTL MSCR: DCACTIVE Mask */ - -#define MEMSYSCTL_MSCR_EVECCFAULT_Pos 3U /*!< MEMSYSCTL MSCR: EVECCFAULT Position */ -#define MEMSYSCTL_MSCR_EVECCFAULT_Msk (0x1UL << MEMSYSCTL_MSCR_EVECCFAULT_Pos) /*!< MEMSYSCTL MSCR: EVECCFAULT Mask */ - -#define MEMSYSCTL_MSCR_FORCEWT_Pos 2U /*!< MEMSYSCTL MSCR: FORCEWT Position */ -#define MEMSYSCTL_MSCR_FORCEWT_Msk (0x1UL << MEMSYSCTL_MSCR_FORCEWT_Pos) /*!< MEMSYSCTL MSCR: FORCEWT Mask */ - -#define MEMSYSCTL_MSCR_ECCEN_Pos 1U /*!< MEMSYSCTL MSCR: ECCEN Position */ -#define MEMSYSCTL_MSCR_ECCEN_Msk (0x1UL << MEMSYSCTL_MSCR_ECCEN_Pos) /*!< MEMSYSCTL MSCR: ECCEN Mask */ - -/* MEMSYSCTL Prefetcher Control Register (PFCR) Register Definitions */ -#define MEMSYSCTL_PFCR_DIS_NLP_Pos 7U /*!< MEMSYSCTL PFCR: DIS_NLP Position */ -#define MEMSYSCTL_PFCR_DIS_NLP_Msk (0x1UL << MEMSYSCTL_PFCR_DIS_NLP_Pos) /*!< MEMSYSCTL PFCR: DIS_NLP Mask */ - -#define MEMSYSCTL_PFCR_ENABLE_Pos 0U /*!< MEMSYSCTL PFCR: ENABLE Position */ -#define MEMSYSCTL_PFCR_ENABLE_Msk (0x1UL /*<< MEMSYSCTL_PFCR_ENABLE_Pos*/) /*!< MEMSYSCTL PFCR: ENABLE Mask */ - -/* MEMSYSCTL ITCM Control Register (ITCMCR) Register Definitions */ -#define MEMSYSCTL_ITCMCR_SZ_Pos 3U /*!< MEMSYSCTL ITCMCR: SZ Position */ -#define MEMSYSCTL_ITCMCR_SZ_Msk (0xFUL << MEMSYSCTL_ITCMCR_SZ_Pos) /*!< MEMSYSCTL ITCMCR: SZ Mask */ - -#define MEMSYSCTL_ITCMCR_EN_Pos 0U /*!< MEMSYSCTL ITCMCR: EN Position */ -#define MEMSYSCTL_ITCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_ITCMCR_EN_Pos*/) /*!< MEMSYSCTL ITCMCR: EN Mask */ - -/* MEMSYSCTL DTCM Control Register (DTCMCR) Register Definitions */ -#define MEMSYSCTL_DTCMCR_SZ_Pos 3U /*!< MEMSYSCTL DTCMCR: SZ Position */ -#define MEMSYSCTL_DTCMCR_SZ_Msk (0xFUL << MEMSYSCTL_DTCMCR_SZ_Pos) /*!< MEMSYSCTL DTCMCR: SZ Mask */ - -#define MEMSYSCTL_DTCMCR_EN_Pos 0U /*!< MEMSYSCTL DTCMCR: EN Position */ -#define MEMSYSCTL_DTCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_DTCMCR_EN_Pos*/) /*!< MEMSYSCTL DTCMCR: EN Mask */ - -/* MEMSYSCTL P-AHB Control Register (PAHBCR) Register Definitions */ -#define MEMSYSCTL_PAHBCR_SZ_Pos 1U /*!< MEMSYSCTL PAHBCR: SZ Position */ -#define MEMSYSCTL_PAHBCR_SZ_Msk (0x7UL << MEMSYSCTL_PAHBCR_SZ_Pos) /*!< MEMSYSCTL PAHBCR: SZ Mask */ - -#define MEMSYSCTL_PAHBCR_EN_Pos 0U /*!< MEMSYSCTL PAHBCR: EN Position */ -#define MEMSYSCTL_PAHBCR_EN_Msk (0x1UL /*<< MEMSYSCTL_PAHBCR_EN_Pos*/) /*!< MEMSYSCTL PAHBCR: EN Mask */ - -/* MEMSYSCTL ITGU Control Register (ITGU_CTRL) Register Definitions */ -#define MEMSYSCTL_ITGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL ITGU_CTRL: DEREN Position */ -#define MEMSYSCTL_ITGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_ITGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL ITGU_CTRL: DEREN Mask */ - -#define MEMSYSCTL_ITGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL ITGU_CTRL: DBFEN Position */ -#define MEMSYSCTL_ITGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_ITGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL ITGU_CTRL: DBFEN Mask */ - -/* MEMSYSCTL ITGU Configuration Register (ITGU_CFG) Register Definitions */ -#define MEMSYSCTL_ITGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL ITGU_CFG: PRESENT Position */ -#define MEMSYSCTL_ITGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_ITGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL ITGU_CFG: PRESENT Mask */ - -#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Position */ -#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Mask */ - -#define MEMSYSCTL_ITGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL ITGU_CFG: BLKSZ Position */ -#define MEMSYSCTL_ITGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_ITGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL ITGU_CFG: BLKSZ Mask */ - -/* MEMSYSCTL DTGU Control Registers (DTGU_CTRL) Register Definitions */ -#define MEMSYSCTL_DTGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL DTGU_CTRL: DEREN Position */ -#define MEMSYSCTL_DTGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_DTGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL DTGU_CTRL: DEREN Mask */ - -#define MEMSYSCTL_DTGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL DTGU_CTRL: DBFEN Position */ -#define MEMSYSCTL_DTGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_DTGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL DTGU_CTRL: DBFEN Mask */ - -/* MEMSYSCTL DTGU Configuration Register (DTGU_CFG) Register Definitions */ -#define MEMSYSCTL_DTGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL DTGU_CFG: PRESENT Position */ -#define MEMSYSCTL_DTGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_DTGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL DTGU_CFG: PRESENT Mask */ - -#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Position */ -#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Mask */ - -#define MEMSYSCTL_DTGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL DTGU_CFG: BLKSZ Position */ -#define MEMSYSCTL_DTGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_DTGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL DTGU_CFG: BLKSZ Mask */ - - -/*@}*/ /* end of group MemSysCtl_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup PwrModCtl_Type Power Mode Control Registers - \brief Type definitions for the Power Mode Control Registers (PWRMODCTL) - @{ - */ - -/** - \brief Structure type to access the Power Mode Control Registers (PWRMODCTL). - */ -typedef struct -{ - __IOM uint32_t CPDLPSTATE; /*!< Offset: 0x000 (R/W) Core Power Domain Low Power State Register */ - __IOM uint32_t DPDLPSTATE; /*!< Offset: 0x004 (R/W) Debug Power Domain Low Power State Register */ -} PwrModCtl_Type; - -/* PWRMODCTL Core Power Domain Low Power State (CPDLPSTATE) Register Definitions */ -#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos 8U /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Mask */ - -#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos 4U /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Mask */ - -#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos 0U /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Msk (0x3UL /*<< PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos*/) /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Mask */ - -/* PWRMODCTL Debug Power Domain Low Power State (DPDLPSTATE) Register Definitions */ -#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos 0U /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Position */ -#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Msk (0x3UL /*<< PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos*/) /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Mask */ - -/*@}*/ /* end of group PwrModCtl_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup EWIC_Type External Wakeup Interrupt Controller Registers - \brief Type definitions for the External Wakeup Interrupt Controller Registers (EWIC) - @{ - */ - -/** - \brief Structure type to access the External Wakeup Interrupt Controller Registers (EWIC). - */ -typedef struct -{ - __OM uint32_t EVENTSPR; /*!< Offset: 0x000 ( /W) Event Set Pending Register */ - uint32_t RESERVED0[31U]; - __IM uint32_t EVENTMASKA; /*!< Offset: 0x080 (R/W) Event Mask A Register */ - __IM uint32_t EVENTMASK[15]; /*!< Offset: 0x084 (R/W) Event Mask Register */ -} EWIC_Type; - -/* EWIC External Wakeup Interrupt Controller (EVENTSPR) Register Definitions */ -#define EWIC_EVENTSPR_EDBGREQ_Pos 2U /*!< EWIC EVENTSPR: EDBGREQ Position */ -#define EWIC_EVENTSPR_EDBGREQ_Msk (0x1UL << EWIC_EVENTSPR_EDBGREQ_Pos) /*!< EWIC EVENTSPR: EDBGREQ Mask */ - -#define EWIC_EVENTSPR_NMI_Pos 1U /*!< EWIC EVENTSPR: NMI Position */ -#define EWIC_EVENTSPR_NMI_Msk (0x1UL << EWIC_EVENTSPR_NMI_Pos) /*!< EWIC EVENTSPR: NMI Mask */ - -#define EWIC_EVENTSPR_EVENT_Pos 0U /*!< EWIC EVENTSPR: EVENT Position */ -#define EWIC_EVENTSPR_EVENT_Msk (0x1UL /*<< EWIC_EVENTSPR_EVENT_Pos*/) /*!< EWIC EVENTSPR: EVENT Mask */ - -/* EWIC External Wakeup Interrupt Controller (EVENTMASKA) Register Definitions */ -#define EWIC_EVENTMASKA_EDBGREQ_Pos 2U /*!< EWIC EVENTMASKA: EDBGREQ Position */ -#define EWIC_EVENTMASKA_EDBGREQ_Msk (0x1UL << EWIC_EVENTMASKA_EDBGREQ_Pos) /*!< EWIC EVENTMASKA: EDBGREQ Mask */ - -#define EWIC_EVENTMASKA_NMI_Pos 1U /*!< EWIC EVENTMASKA: NMI Position */ -#define EWIC_EVENTMASKA_NMI_Msk (0x1UL << EWIC_EVENTMASKA_NMI_Pos) /*!< EWIC EVENTMASKA: NMI Mask */ - -#define EWIC_EVENTMASKA_EVENT_Pos 0U /*!< EWIC EVENTMASKA: EVENT Position */ -#define EWIC_EVENTMASKA_EVENT_Msk (0x1UL /*<< EWIC_EVENTMASKA_EVENT_Pos*/) /*!< EWIC EVENTMASKA: EVENT Mask */ - -/* EWIC External Wakeup Interrupt Controller (EVENTMASK) Register Definitions */ -#define EWIC_EVENTMASK_IRQ_Pos 0U /*!< EWIC EVENTMASKA: IRQ Position */ -#define EWIC_EVENTMASK_IRQ_Msk (0xFFFFFFFFUL /*<< EWIC_EVENTMASKA_IRQ_Pos*/) /*!< EWIC EVENTMASKA: IRQ Mask */ - -/*@}*/ /* end of group EWIC_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup ErrBnk_Type Error Banking Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Error Banking Registers (ERRBNK) - @{ - */ - -/** - \brief Structure type to access the Error Banking Registers (ERRBNK). - */ -typedef struct -{ - __IOM uint32_t IEBR0; /*!< Offset: 0x000 (R/W) Instruction Cache Error Bank Register 0 */ - __IOM uint32_t IEBR1; /*!< Offset: 0x004 (R/W) Instruction Cache Error Bank Register 1 */ - uint32_t RESERVED0[2U]; - __IOM uint32_t DEBR0; /*!< Offset: 0x010 (R/W) Data Cache Error Bank Register 0 */ - __IOM uint32_t DEBR1; /*!< Offset: 0x014 (R/W) Data Cache Error Bank Register 1 */ - uint32_t RESERVED1[2U]; - __IOM uint32_t TEBR0; /*!< Offset: 0x020 (R/W) TCM Error Bank Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t TEBR1; /*!< Offset: 0x028 (R/W) TCM Error Bank Register 1 */ -} ErrBnk_Type; - -/* ERRBNK Instruction Cache Error Bank Register 0 (IEBR0) Register Definitions */ -#define ERRBNK_IEBR0_SWDEF_Pos 30U /*!< ERRBNK IEBR0: SWDEF Position */ -#define ERRBNK_IEBR0_SWDEF_Msk (0x3UL << ERRBNK_IEBR0_SWDEF_Pos) /*!< ERRBNK IEBR0: SWDEF Mask */ - -#define ERRBNK_IEBR0_BANK_Pos 16U /*!< ERRBNK IEBR0: BANK Position */ -#define ERRBNK_IEBR0_BANK_Msk (0x1UL << ERRBNK_IEBR0_BANK_Pos) /*!< ERRBNK IEBR0: BANK Mask */ - -#define ERRBNK_IEBR0_LOCATION_Pos 2U /*!< ERRBNK IEBR0: LOCATION Position */ -#define ERRBNK_IEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR0_LOCATION_Pos) /*!< ERRBNK IEBR0: LOCATION Mask */ - -#define ERRBNK_IEBR0_LOCKED_Pos 1U /*!< ERRBNK IEBR0: LOCKED Position */ -#define ERRBNK_IEBR0_LOCKED_Msk (0x1UL << ERRBNK_IEBR0_LOCKED_Pos) /*!< ERRBNK IEBR0: LOCKED Mask */ - -#define ERRBNK_IEBR0_VALID_Pos 0U /*!< ERRBNK IEBR0: VALID Position */ -#define ERRBNK_IEBR0_VALID_Msk (0x1UL << /*ERRBNK_IEBR0_VALID_Pos*/) /*!< ERRBNK IEBR0: VALID Mask */ - -/* ERRBNK Instruction Cache Error Bank Register 1 (IEBR1) Register Definitions */ -#define ERRBNK_IEBR1_SWDEF_Pos 30U /*!< ERRBNK IEBR1: SWDEF Position */ -#define ERRBNK_IEBR1_SWDEF_Msk (0x3UL << ERRBNK_IEBR1_SWDEF_Pos) /*!< ERRBNK IEBR1: SWDEF Mask */ - -#define ERRBNK_IEBR1_BANK_Pos 16U /*!< ERRBNK IEBR1: BANK Position */ -#define ERRBNK_IEBR1_BANK_Msk (0x1UL << ERRBNK_IEBR1_BANK_Pos) /*!< ERRBNK IEBR1: BANK Mask */ - -#define ERRBNK_IEBR1_LOCATION_Pos 2U /*!< ERRBNK IEBR1: LOCATION Position */ -#define ERRBNK_IEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR1_LOCATION_Pos) /*!< ERRBNK IEBR1: LOCATION Mask */ - -#define ERRBNK_IEBR1_LOCKED_Pos 1U /*!< ERRBNK IEBR1: LOCKED Position */ -#define ERRBNK_IEBR1_LOCKED_Msk (0x1UL << ERRBNK_IEBR1_LOCKED_Pos) /*!< ERRBNK IEBR1: LOCKED Mask */ - -#define ERRBNK_IEBR1_VALID_Pos 0U /*!< ERRBNK IEBR1: VALID Position */ -#define ERRBNK_IEBR1_VALID_Msk (0x1UL << /*ERRBNK_IEBR1_VALID_Pos*/) /*!< ERRBNK IEBR1: VALID Mask */ - -/* ERRBNK Data Cache Error Bank Register 0 (DEBR0) Register Definitions */ -#define ERRBNK_DEBR0_SWDEF_Pos 30U /*!< ERRBNK DEBR0: SWDEF Position */ -#define ERRBNK_DEBR0_SWDEF_Msk (0x3UL << ERRBNK_DEBR0_SWDEF_Pos) /*!< ERRBNK DEBR0: SWDEF Mask */ - -#define ERRBNK_DEBR0_TYPE_Pos 17U /*!< ERRBNK DEBR0: TYPE Position */ -#define ERRBNK_DEBR0_TYPE_Msk (0x1UL << ERRBNK_DEBR0_TYPE_Pos) /*!< ERRBNK DEBR0: TYPE Mask */ - -#define ERRBNK_DEBR0_BANK_Pos 16U /*!< ERRBNK DEBR0: BANK Position */ -#define ERRBNK_DEBR0_BANK_Msk (0x1UL << ERRBNK_DEBR0_BANK_Pos) /*!< ERRBNK DEBR0: BANK Mask */ - -#define ERRBNK_DEBR0_LOCATION_Pos 2U /*!< ERRBNK DEBR0: LOCATION Position */ -#define ERRBNK_DEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR0_LOCATION_Pos) /*!< ERRBNK DEBR0: LOCATION Mask */ - -#define ERRBNK_DEBR0_LOCKED_Pos 1U /*!< ERRBNK DEBR0: LOCKED Position */ -#define ERRBNK_DEBR0_LOCKED_Msk (0x1UL << ERRBNK_DEBR0_LOCKED_Pos) /*!< ERRBNK DEBR0: LOCKED Mask */ - -#define ERRBNK_DEBR0_VALID_Pos 0U /*!< ERRBNK DEBR0: VALID Position */ -#define ERRBNK_DEBR0_VALID_Msk (0x1UL << /*ERRBNK_DEBR0_VALID_Pos*/) /*!< ERRBNK DEBR0: VALID Mask */ - -/* ERRBNK Data Cache Error Bank Register 1 (DEBR1) Register Definitions */ -#define ERRBNK_DEBR1_SWDEF_Pos 30U /*!< ERRBNK DEBR1: SWDEF Position */ -#define ERRBNK_DEBR1_SWDEF_Msk (0x3UL << ERRBNK_DEBR1_SWDEF_Pos) /*!< ERRBNK DEBR1: SWDEF Mask */ - -#define ERRBNK_DEBR1_TYPE_Pos 17U /*!< ERRBNK DEBR1: TYPE Position */ -#define ERRBNK_DEBR1_TYPE_Msk (0x1UL << ERRBNK_DEBR1_TYPE_Pos) /*!< ERRBNK DEBR1: TYPE Mask */ - -#define ERRBNK_DEBR1_BANK_Pos 16U /*!< ERRBNK DEBR1: BANK Position */ -#define ERRBNK_DEBR1_BANK_Msk (0x1UL << ERRBNK_DEBR1_BANK_Pos) /*!< ERRBNK DEBR1: BANK Mask */ - -#define ERRBNK_DEBR1_LOCATION_Pos 2U /*!< ERRBNK DEBR1: LOCATION Position */ -#define ERRBNK_DEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR1_LOCATION_Pos) /*!< ERRBNK DEBR1: LOCATION Mask */ - -#define ERRBNK_DEBR1_LOCKED_Pos 1U /*!< ERRBNK DEBR1: LOCKED Position */ -#define ERRBNK_DEBR1_LOCKED_Msk (0x1UL << ERRBNK_DEBR1_LOCKED_Pos) /*!< ERRBNK DEBR1: LOCKED Mask */ - -#define ERRBNK_DEBR1_VALID_Pos 0U /*!< ERRBNK DEBR1: VALID Position */ -#define ERRBNK_DEBR1_VALID_Msk (0x1UL << /*ERRBNK_DEBR1_VALID_Pos*/) /*!< ERRBNK DEBR1: VALID Mask */ - -/* ERRBNK TCM Error Bank Register 0 (TEBR0) Register Definitions */ -#define ERRBNK_TEBR0_SWDEF_Pos 30U /*!< ERRBNK TEBR0: SWDEF Position */ -#define ERRBNK_TEBR0_SWDEF_Msk (0x3UL << ERRBNK_TEBR0_SWDEF_Pos) /*!< ERRBNK TEBR0: SWDEF Mask */ - -#define ERRBNK_TEBR0_POISON_Pos 28U /*!< ERRBNK TEBR0: POISON Position */ -#define ERRBNK_TEBR0_POISON_Msk (0x1UL << ERRBNK_TEBR0_POISON_Pos) /*!< ERRBNK TEBR0: POISON Mask */ - -#define ERRBNK_TEBR0_TYPE_Pos 27U /*!< ERRBNK TEBR0: TYPE Position */ -#define ERRBNK_TEBR0_TYPE_Msk (0x1UL << ERRBNK_TEBR0_TYPE_Pos) /*!< ERRBNK TEBR0: TYPE Mask */ - -#define ERRBNK_TEBR0_BANK_Pos 24U /*!< ERRBNK TEBR0: BANK Position */ -#define ERRBNK_TEBR0_BANK_Msk (0x3UL << ERRBNK_TEBR0_BANK_Pos) /*!< ERRBNK TEBR0: BANK Mask */ - -#define ERRBNK_TEBR0_LOCATION_Pos 2U /*!< ERRBNK TEBR0: LOCATION Position */ -#define ERRBNK_TEBR0_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR0_LOCATION_Pos) /*!< ERRBNK TEBR0: LOCATION Mask */ - -#define ERRBNK_TEBR0_LOCKED_Pos 1U /*!< ERRBNK TEBR0: LOCKED Position */ -#define ERRBNK_TEBR0_LOCKED_Msk (0x1UL << ERRBNK_TEBR0_LOCKED_Pos) /*!< ERRBNK TEBR0: LOCKED Mask */ - -#define ERRBNK_TEBR0_VALID_Pos 0U /*!< ERRBNK TEBR0: VALID Position */ -#define ERRBNK_TEBR0_VALID_Msk (0x1UL << /*ERRBNK_TEBR0_VALID_Pos*/) /*!< ERRBNK TEBR0: VALID Mask */ - -/* ERRBNK TCM Error Bank Register 1 (TEBR1) Register Definitions */ -#define ERRBNK_TEBR1_SWDEF_Pos 30U /*!< ERRBNK TEBR1: SWDEF Position */ -#define ERRBNK_TEBR1_SWDEF_Msk (0x3UL << ERRBNK_TEBR1_SWDEF_Pos) /*!< ERRBNK TEBR1: SWDEF Mask */ - -#define ERRBNK_TEBR1_POISON_Pos 28U /*!< ERRBNK TEBR1: POISON Position */ -#define ERRBNK_TEBR1_POISON_Msk (0x1UL << ERRBNK_TEBR1_POISON_Pos) /*!< ERRBNK TEBR1: POISON Mask */ - -#define ERRBNK_TEBR1_TYPE_Pos 27U /*!< ERRBNK TEBR1: TYPE Position */ -#define ERRBNK_TEBR1_TYPE_Msk (0x1UL << ERRBNK_TEBR1_TYPE_Pos) /*!< ERRBNK TEBR1: TYPE Mask */ - -#define ERRBNK_TEBR1_BANK_Pos 24U /*!< ERRBNK TEBR1: BANK Position */ -#define ERRBNK_TEBR1_BANK_Msk (0x3UL << ERRBNK_TEBR1_BANK_Pos) /*!< ERRBNK TEBR1: BANK Mask */ - -#define ERRBNK_TEBR1_LOCATION_Pos 2U /*!< ERRBNK TEBR1: LOCATION Position */ -#define ERRBNK_TEBR1_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR1_LOCATION_Pos) /*!< ERRBNK TEBR1: LOCATION Mask */ - -#define ERRBNK_TEBR1_LOCKED_Pos 1U /*!< ERRBNK TEBR1: LOCKED Position */ -#define ERRBNK_TEBR1_LOCKED_Msk (0x1UL << ERRBNK_TEBR1_LOCKED_Pos) /*!< ERRBNK TEBR1: LOCKED Mask */ - -#define ERRBNK_TEBR1_VALID_Pos 0U /*!< ERRBNK TEBR1: VALID Position */ -#define ERRBNK_TEBR1_VALID_Msk (0x1UL << /*ERRBNK_TEBR1_VALID_Pos*/) /*!< ERRBNK TEBR1: VALID Mask */ - -/*@}*/ /* end of group ErrBnk_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup PrcCfgInf_Type Processor Configuration Information Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Processor Configuration Information Registerss (PRCCFGINF) - @{ - */ - -/** - \brief Structure type to access the Processor Configuration Information Registerss (PRCCFGINF). - */ -typedef struct -{ - __OM uint32_t CFGINFOSEL; /*!< Offset: 0x000 ( /W) Processor Configuration Information Selection Register */ - __IM uint32_t CFGINFORD; /*!< Offset: 0x004 (R/ ) Processor Configuration Information Read Data Register */ -} PrcCfgInf_Type; - -/* PRCCFGINF Processor Configuration Information Selection Register (CFGINFOSEL) Definitions */ - -/* PRCCFGINF Processor Configuration Information Read Data Register (CFGINFORD) Definitions */ - -/*@}*/ /* end of group PrcCfgInf_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFmt_Pos 0U /*!< TPI FFCR: EnFmt Position */ -#define TPI_FFCR_EnFmt_Msk (0x3UL << /*TPI_FFCR_EnFmt_Pos*/) /*!< TPI FFCR: EnFmt Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_PMU Performance Monitoring Unit (PMU) - \brief Type definitions for the Performance Monitoring Unit (PMU) - @{ - */ - -/** - \brief Structure type to access the Performance Monitoring Unit (PMU). - */ -typedef struct -{ - __IOM uint32_t EVCNTR[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x0 (R/W) PMU Event Counter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED0[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCNTR; /*!< Offset: 0x7C (R/W) PMU Cycle Counter Register */ - uint32_t RESERVED1[224]; - __IOM uint32_t EVTYPER[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x400 (R/W) PMU Event Type and Filter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED2[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCFILTR; /*!< Offset: 0x47C (R/W) PMU Cycle Counter Filter Register */ - uint32_t RESERVED3[480]; - __IOM uint32_t CNTENSET; /*!< Offset: 0xC00 (R/W) PMU Count Enable Set Register */ - uint32_t RESERVED4[7]; - __IOM uint32_t CNTENCLR; /*!< Offset: 0xC20 (R/W) PMU Count Enable Clear Register */ - uint32_t RESERVED5[7]; - __IOM uint32_t INTENSET; /*!< Offset: 0xC40 (R/W) PMU Interrupt Enable Set Register */ - uint32_t RESERVED6[7]; - __IOM uint32_t INTENCLR; /*!< Offset: 0xC60 (R/W) PMU Interrupt Enable Clear Register */ - uint32_t RESERVED7[7]; - __IOM uint32_t OVSCLR; /*!< Offset: 0xC80 (R/W) PMU Overflow Flag Status Clear Register */ - uint32_t RESERVED8[7]; - __IOM uint32_t SWINC; /*!< Offset: 0xCA0 (R/W) PMU Software Increment Register */ - uint32_t RESERVED9[7]; - __IOM uint32_t OVSSET; /*!< Offset: 0xCC0 (R/W) PMU Overflow Flag Status Set Register */ - uint32_t RESERVED10[79]; - __IOM uint32_t TYPE; /*!< Offset: 0xE00 (R/W) PMU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0xE04 (R/W) PMU Control Register */ - uint32_t RESERVED11[108]; - __IOM uint32_t AUTHSTATUS; /*!< Offset: 0xFB8 (R/W) PMU Authentication Status Register */ - __IOM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/W) PMU Device Architecture Register */ - uint32_t RESERVED12[3]; - __IOM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/W) PMU Device Type Register */ - __IOM uint32_t PIDR4; /*!< Offset: 0xFD0 (R/W) PMU Peripheral Identification Register 4 */ - uint32_t RESERVED13[3]; - __IOM uint32_t PIDR0; /*!< Offset: 0xFE0 (R/W) PMU Peripheral Identification Register 0 */ - __IOM uint32_t PIDR1; /*!< Offset: 0xFE4 (R/W) PMU Peripheral Identification Register 1 */ - __IOM uint32_t PIDR2; /*!< Offset: 0xFE8 (R/W) PMU Peripheral Identification Register 2 */ - __IOM uint32_t PIDR3; /*!< Offset: 0xFEC (R/W) PMU Peripheral Identification Register 3 */ - __IOM uint32_t CIDR0; /*!< Offset: 0xFF0 (R/W) PMU Component Identification Register 0 */ - __IOM uint32_t CIDR1; /*!< Offset: 0xFF4 (R/W) PMU Component Identification Register 1 */ - __IOM uint32_t CIDR2; /*!< Offset: 0xFF8 (R/W) PMU Component Identification Register 2 */ - __IOM uint32_t CIDR3; /*!< Offset: 0xFFC (R/W) PMU Component Identification Register 3 */ -} PMU_Type; - -/** \brief PMU Event Counter Registers (0-30) Definitions */ - -#define PMU_EVCNTR_CNT_Pos 0U /*!< PMU EVCNTR: Counter Position */ -#define PMU_EVCNTR_CNT_Msk (0xFFFFUL /*<< PMU_EVCNTRx_CNT_Pos*/) /*!< PMU EVCNTR: Counter Mask */ - -/** \brief PMU Event Type and Filter Registers (0-30) Definitions */ - -#define PMU_EVTYPER_EVENTTOCNT_Pos 0U /*!< PMU EVTYPER: Event to Count Position */ -#define PMU_EVTYPER_EVENTTOCNT_Msk (0xFFFFUL /*<< EVTYPERx_EVENTTOCNT_Pos*/) /*!< PMU EVTYPER: Event to Count Mask */ - -/** \brief PMU Count Enable Set Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENSET: Event Counter 0 Enable Set Position */ -#define PMU_CNTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENSET_CNT0_ENABLE_Pos*/) /*!< PMU CNTENSET: Event Counter 0 Enable Set Mask */ - -#define PMU_CNTENSET_CNT1_ENABLE_Pos 1U /*!< PMU CNTENSET: Event Counter 1 Enable Set Position */ -#define PMU_CNTENSET_CNT1_ENABLE_Msk (1UL << PMU_CNTENSET_CNT1_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 1 Enable Set Mask */ - -#define PMU_CNTENSET_CNT2_ENABLE_Pos 2U /*!< PMU CNTENSET: Event Counter 2 Enable Set Position */ -#define PMU_CNTENSET_CNT2_ENABLE_Msk (1UL << PMU_CNTENSET_CNT2_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 2 Enable Set Mask */ - -#define PMU_CNTENSET_CNT3_ENABLE_Pos 3U /*!< PMU CNTENSET: Event Counter 3 Enable Set Position */ -#define PMU_CNTENSET_CNT3_ENABLE_Msk (1UL << PMU_CNTENSET_CNT3_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 3 Enable Set Mask */ - -#define PMU_CNTENSET_CNT4_ENABLE_Pos 4U /*!< PMU CNTENSET: Event Counter 4 Enable Set Position */ -#define PMU_CNTENSET_CNT4_ENABLE_Msk (1UL << PMU_CNTENSET_CNT4_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 4 Enable Set Mask */ - -#define PMU_CNTENSET_CNT5_ENABLE_Pos 5U /*!< PMU CNTENSET: Event Counter 5 Enable Set Position */ -#define PMU_CNTENSET_CNT5_ENABLE_Msk (1UL << PMU_CNTENSET_CNT5_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 5 Enable Set Mask */ - -#define PMU_CNTENSET_CNT6_ENABLE_Pos 6U /*!< PMU CNTENSET: Event Counter 6 Enable Set Position */ -#define PMU_CNTENSET_CNT6_ENABLE_Msk (1UL << PMU_CNTENSET_CNT6_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 6 Enable Set Mask */ - -#define PMU_CNTENSET_CNT7_ENABLE_Pos 7U /*!< PMU CNTENSET: Event Counter 7 Enable Set Position */ -#define PMU_CNTENSET_CNT7_ENABLE_Msk (1UL << PMU_CNTENSET_CNT7_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 7 Enable Set Mask */ - -#define PMU_CNTENSET_CNT8_ENABLE_Pos 8U /*!< PMU CNTENSET: Event Counter 8 Enable Set Position */ -#define PMU_CNTENSET_CNT8_ENABLE_Msk (1UL << PMU_CNTENSET_CNT8_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 8 Enable Set Mask */ - -#define PMU_CNTENSET_CNT9_ENABLE_Pos 9U /*!< PMU CNTENSET: Event Counter 9 Enable Set Position */ -#define PMU_CNTENSET_CNT9_ENABLE_Msk (1UL << PMU_CNTENSET_CNT9_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 9 Enable Set Mask */ - -#define PMU_CNTENSET_CNT10_ENABLE_Pos 10U /*!< PMU CNTENSET: Event Counter 10 Enable Set Position */ -#define PMU_CNTENSET_CNT10_ENABLE_Msk (1UL << PMU_CNTENSET_CNT10_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 10 Enable Set Mask */ - -#define PMU_CNTENSET_CNT11_ENABLE_Pos 11U /*!< PMU CNTENSET: Event Counter 11 Enable Set Position */ -#define PMU_CNTENSET_CNT11_ENABLE_Msk (1UL << PMU_CNTENSET_CNT11_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 11 Enable Set Mask */ - -#define PMU_CNTENSET_CNT12_ENABLE_Pos 12U /*!< PMU CNTENSET: Event Counter 12 Enable Set Position */ -#define PMU_CNTENSET_CNT12_ENABLE_Msk (1UL << PMU_CNTENSET_CNT12_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 12 Enable Set Mask */ - -#define PMU_CNTENSET_CNT13_ENABLE_Pos 13U /*!< PMU CNTENSET: Event Counter 13 Enable Set Position */ -#define PMU_CNTENSET_CNT13_ENABLE_Msk (1UL << PMU_CNTENSET_CNT13_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 13 Enable Set Mask */ - -#define PMU_CNTENSET_CNT14_ENABLE_Pos 14U /*!< PMU CNTENSET: Event Counter 14 Enable Set Position */ -#define PMU_CNTENSET_CNT14_ENABLE_Msk (1UL << PMU_CNTENSET_CNT14_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 14 Enable Set Mask */ - -#define PMU_CNTENSET_CNT15_ENABLE_Pos 15U /*!< PMU CNTENSET: Event Counter 15 Enable Set Position */ -#define PMU_CNTENSET_CNT15_ENABLE_Msk (1UL << PMU_CNTENSET_CNT15_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 15 Enable Set Mask */ - -#define PMU_CNTENSET_CNT16_ENABLE_Pos 16U /*!< PMU CNTENSET: Event Counter 16 Enable Set Position */ -#define PMU_CNTENSET_CNT16_ENABLE_Msk (1UL << PMU_CNTENSET_CNT16_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 16 Enable Set Mask */ - -#define PMU_CNTENSET_CNT17_ENABLE_Pos 17U /*!< PMU CNTENSET: Event Counter 17 Enable Set Position */ -#define PMU_CNTENSET_CNT17_ENABLE_Msk (1UL << PMU_CNTENSET_CNT17_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 17 Enable Set Mask */ - -#define PMU_CNTENSET_CNT18_ENABLE_Pos 18U /*!< PMU CNTENSET: Event Counter 18 Enable Set Position */ -#define PMU_CNTENSET_CNT18_ENABLE_Msk (1UL << PMU_CNTENSET_CNT18_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 18 Enable Set Mask */ - -#define PMU_CNTENSET_CNT19_ENABLE_Pos 19U /*!< PMU CNTENSET: Event Counter 19 Enable Set Position */ -#define PMU_CNTENSET_CNT19_ENABLE_Msk (1UL << PMU_CNTENSET_CNT19_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 19 Enable Set Mask */ - -#define PMU_CNTENSET_CNT20_ENABLE_Pos 20U /*!< PMU CNTENSET: Event Counter 20 Enable Set Position */ -#define PMU_CNTENSET_CNT20_ENABLE_Msk (1UL << PMU_CNTENSET_CNT20_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 20 Enable Set Mask */ - -#define PMU_CNTENSET_CNT21_ENABLE_Pos 21U /*!< PMU CNTENSET: Event Counter 21 Enable Set Position */ -#define PMU_CNTENSET_CNT21_ENABLE_Msk (1UL << PMU_CNTENSET_CNT21_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 21 Enable Set Mask */ - -#define PMU_CNTENSET_CNT22_ENABLE_Pos 22U /*!< PMU CNTENSET: Event Counter 22 Enable Set Position */ -#define PMU_CNTENSET_CNT22_ENABLE_Msk (1UL << PMU_CNTENSET_CNT22_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 22 Enable Set Mask */ - -#define PMU_CNTENSET_CNT23_ENABLE_Pos 23U /*!< PMU CNTENSET: Event Counter 23 Enable Set Position */ -#define PMU_CNTENSET_CNT23_ENABLE_Msk (1UL << PMU_CNTENSET_CNT23_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 23 Enable Set Mask */ - -#define PMU_CNTENSET_CNT24_ENABLE_Pos 24U /*!< PMU CNTENSET: Event Counter 24 Enable Set Position */ -#define PMU_CNTENSET_CNT24_ENABLE_Msk (1UL << PMU_CNTENSET_CNT24_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 24 Enable Set Mask */ - -#define PMU_CNTENSET_CNT25_ENABLE_Pos 25U /*!< PMU CNTENSET: Event Counter 25 Enable Set Position */ -#define PMU_CNTENSET_CNT25_ENABLE_Msk (1UL << PMU_CNTENSET_CNT25_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 25 Enable Set Mask */ - -#define PMU_CNTENSET_CNT26_ENABLE_Pos 26U /*!< PMU CNTENSET: Event Counter 26 Enable Set Position */ -#define PMU_CNTENSET_CNT26_ENABLE_Msk (1UL << PMU_CNTENSET_CNT26_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 26 Enable Set Mask */ - -#define PMU_CNTENSET_CNT27_ENABLE_Pos 27U /*!< PMU CNTENSET: Event Counter 27 Enable Set Position */ -#define PMU_CNTENSET_CNT27_ENABLE_Msk (1UL << PMU_CNTENSET_CNT27_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 27 Enable Set Mask */ - -#define PMU_CNTENSET_CNT28_ENABLE_Pos 28U /*!< PMU CNTENSET: Event Counter 28 Enable Set Position */ -#define PMU_CNTENSET_CNT28_ENABLE_Msk (1UL << PMU_CNTENSET_CNT28_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 28 Enable Set Mask */ - -#define PMU_CNTENSET_CNT29_ENABLE_Pos 29U /*!< PMU CNTENSET: Event Counter 29 Enable Set Position */ -#define PMU_CNTENSET_CNT29_ENABLE_Msk (1UL << PMU_CNTENSET_CNT29_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 29 Enable Set Mask */ - -#define PMU_CNTENSET_CNT30_ENABLE_Pos 30U /*!< PMU CNTENSET: Event Counter 30 Enable Set Position */ -#define PMU_CNTENSET_CNT30_ENABLE_Msk (1UL << PMU_CNTENSET_CNT30_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 30 Enable Set Mask */ - -#define PMU_CNTENSET_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENSET: Cycle Counter Enable Set Position */ -#define PMU_CNTENSET_CCNTR_ENABLE_Msk (1UL << PMU_CNTENSET_CCNTR_ENABLE_Pos) /*!< PMU CNTENSET: Cycle Counter Enable Set Mask */ - -/** \brief PMU Count Enable Clear Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Position */ -#define PMU_CNTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU CNTENCLR: Event Counter 1 Enable Clear Position */ -#define PMU_CNTENCLR_CNT1_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT1_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 1 Enable Clear */ - -#define PMU_CNTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Position */ -#define PMU_CNTENCLR_CNT2_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT2_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Position */ -#define PMU_CNTENCLR_CNT3_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT3_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Position */ -#define PMU_CNTENCLR_CNT4_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT4_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Position */ -#define PMU_CNTENCLR_CNT5_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT5_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Position */ -#define PMU_CNTENCLR_CNT6_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT6_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Position */ -#define PMU_CNTENCLR_CNT7_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT7_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Position */ -#define PMU_CNTENCLR_CNT8_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT8_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Position */ -#define PMU_CNTENCLR_CNT9_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT9_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Position */ -#define PMU_CNTENCLR_CNT10_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT10_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Position */ -#define PMU_CNTENCLR_CNT11_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT11_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Position */ -#define PMU_CNTENCLR_CNT12_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT12_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Position */ -#define PMU_CNTENCLR_CNT13_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT13_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Position */ -#define PMU_CNTENCLR_CNT14_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT14_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Position */ -#define PMU_CNTENCLR_CNT15_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT15_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Position */ -#define PMU_CNTENCLR_CNT16_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT16_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Position */ -#define PMU_CNTENCLR_CNT17_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT17_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Position */ -#define PMU_CNTENCLR_CNT18_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT18_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Position */ -#define PMU_CNTENCLR_CNT19_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT19_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Position */ -#define PMU_CNTENCLR_CNT20_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT20_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Position */ -#define PMU_CNTENCLR_CNT21_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT21_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Position */ -#define PMU_CNTENCLR_CNT22_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT22_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Position */ -#define PMU_CNTENCLR_CNT23_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT23_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Position */ -#define PMU_CNTENCLR_CNT24_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT24_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Position */ -#define PMU_CNTENCLR_CNT25_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT25_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Position */ -#define PMU_CNTENCLR_CNT26_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT26_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Position */ -#define PMU_CNTENCLR_CNT27_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT27_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Position */ -#define PMU_CNTENCLR_CNT28_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT28_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Position */ -#define PMU_CNTENCLR_CNT29_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT29_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Position */ -#define PMU_CNTENCLR_CNT30_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT30_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Mask */ - -#define PMU_CNTENCLR_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENCLR: Cycle Counter Enable Clear Position */ -#define PMU_CNTENCLR_CCNTR_ENABLE_Msk (1UL << PMU_CNTENCLR_CCNTR_ENABLE_Pos) /*!< PMU CNTENCLR: Cycle Counter Enable Clear Mask */ - -/** \brief PMU Interrupt Enable Set Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENSET_CNT0_ENABLE_Pos*/) /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT1_ENABLE_Pos 1U /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT1_ENABLE_Msk (1UL << PMU_INTENSET_CNT1_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT2_ENABLE_Pos 2U /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT2_ENABLE_Msk (1UL << PMU_INTENSET_CNT2_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT3_ENABLE_Pos 3U /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT3_ENABLE_Msk (1UL << PMU_INTENSET_CNT3_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT4_ENABLE_Pos 4U /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT4_ENABLE_Msk (1UL << PMU_INTENSET_CNT4_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT5_ENABLE_Pos 5U /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT5_ENABLE_Msk (1UL << PMU_INTENSET_CNT5_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT6_ENABLE_Pos 6U /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT6_ENABLE_Msk (1UL << PMU_INTENSET_CNT6_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT7_ENABLE_Pos 7U /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT7_ENABLE_Msk (1UL << PMU_INTENSET_CNT7_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT8_ENABLE_Pos 8U /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT8_ENABLE_Msk (1UL << PMU_INTENSET_CNT8_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT9_ENABLE_Pos 9U /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT9_ENABLE_Msk (1UL << PMU_INTENSET_CNT9_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT10_ENABLE_Pos 10U /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT10_ENABLE_Msk (1UL << PMU_INTENSET_CNT10_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT11_ENABLE_Pos 11U /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT11_ENABLE_Msk (1UL << PMU_INTENSET_CNT11_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT12_ENABLE_Pos 12U /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT12_ENABLE_Msk (1UL << PMU_INTENSET_CNT12_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT13_ENABLE_Pos 13U /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT13_ENABLE_Msk (1UL << PMU_INTENSET_CNT13_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT14_ENABLE_Pos 14U /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT14_ENABLE_Msk (1UL << PMU_INTENSET_CNT14_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT15_ENABLE_Pos 15U /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT15_ENABLE_Msk (1UL << PMU_INTENSET_CNT15_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT16_ENABLE_Pos 16U /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT16_ENABLE_Msk (1UL << PMU_INTENSET_CNT16_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT17_ENABLE_Pos 17U /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT17_ENABLE_Msk (1UL << PMU_INTENSET_CNT17_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT18_ENABLE_Pos 18U /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT18_ENABLE_Msk (1UL << PMU_INTENSET_CNT18_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT19_ENABLE_Pos 19U /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT19_ENABLE_Msk (1UL << PMU_INTENSET_CNT19_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT20_ENABLE_Pos 20U /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT20_ENABLE_Msk (1UL << PMU_INTENSET_CNT20_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT21_ENABLE_Pos 21U /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT21_ENABLE_Msk (1UL << PMU_INTENSET_CNT21_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT22_ENABLE_Pos 22U /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT22_ENABLE_Msk (1UL << PMU_INTENSET_CNT22_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT23_ENABLE_Pos 23U /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT23_ENABLE_Msk (1UL << PMU_INTENSET_CNT23_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT24_ENABLE_Pos 24U /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT24_ENABLE_Msk (1UL << PMU_INTENSET_CNT24_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT25_ENABLE_Pos 25U /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT25_ENABLE_Msk (1UL << PMU_INTENSET_CNT25_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT26_ENABLE_Pos 26U /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT26_ENABLE_Msk (1UL << PMU_INTENSET_CNT26_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT27_ENABLE_Pos 27U /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT27_ENABLE_Msk (1UL << PMU_INTENSET_CNT27_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT28_ENABLE_Pos 28U /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT28_ENABLE_Msk (1UL << PMU_INTENSET_CNT28_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT29_ENABLE_Pos 29U /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT29_ENABLE_Msk (1UL << PMU_INTENSET_CNT29_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT30_ENABLE_Pos 30U /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT30_ENABLE_Msk (1UL << PMU_INTENSET_CNT30_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Position */ -#define PMU_INTENSET_CCYCNT_ENABLE_Msk (1UL << PMU_INTENSET_CYCCNT_ENABLE_Pos) /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Mask */ - -/** \brief PMU Interrupt Enable Clear Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT1_ENABLE_Msk (1UL << PMU_INTENCLR_CNT1_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear */ - -#define PMU_INTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT2_ENABLE_Msk (1UL << PMU_INTENCLR_CNT2_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT3_ENABLE_Msk (1UL << PMU_INTENCLR_CNT3_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT4_ENABLE_Msk (1UL << PMU_INTENCLR_CNT4_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT5_ENABLE_Msk (1UL << PMU_INTENCLR_CNT5_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT6_ENABLE_Msk (1UL << PMU_INTENCLR_CNT6_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT7_ENABLE_Msk (1UL << PMU_INTENCLR_CNT7_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT8_ENABLE_Msk (1UL << PMU_INTENCLR_CNT8_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT9_ENABLE_Msk (1UL << PMU_INTENCLR_CNT9_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT10_ENABLE_Msk (1UL << PMU_INTENCLR_CNT10_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT11_ENABLE_Msk (1UL << PMU_INTENCLR_CNT11_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT12_ENABLE_Msk (1UL << PMU_INTENCLR_CNT12_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT13_ENABLE_Msk (1UL << PMU_INTENCLR_CNT13_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT14_ENABLE_Msk (1UL << PMU_INTENCLR_CNT14_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT15_ENABLE_Msk (1UL << PMU_INTENCLR_CNT15_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT16_ENABLE_Msk (1UL << PMU_INTENCLR_CNT16_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT17_ENABLE_Msk (1UL << PMU_INTENCLR_CNT17_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT18_ENABLE_Msk (1UL << PMU_INTENCLR_CNT18_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT19_ENABLE_Msk (1UL << PMU_INTENCLR_CNT19_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT20_ENABLE_Msk (1UL << PMU_INTENCLR_CNT20_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT21_ENABLE_Msk (1UL << PMU_INTENCLR_CNT21_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT22_ENABLE_Msk (1UL << PMU_INTENCLR_CNT22_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT23_ENABLE_Msk (1UL << PMU_INTENCLR_CNT23_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT24_ENABLE_Msk (1UL << PMU_INTENCLR_CNT24_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT25_ENABLE_Msk (1UL << PMU_INTENCLR_CNT25_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT26_ENABLE_Msk (1UL << PMU_INTENCLR_CNT26_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT27_ENABLE_Msk (1UL << PMU_INTENCLR_CNT27_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT28_ENABLE_Msk (1UL << PMU_INTENCLR_CNT28_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT29_ENABLE_Msk (1UL << PMU_INTENCLR_CNT29_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT30_ENABLE_Msk (1UL << PMU_INTENCLR_CNT30_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CYCCNT_ENABLE_Msk (1UL << PMU_INTENCLR_CYCCNT_ENABLE_Pos) /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Mask */ - -/** \brief PMU Overflow Flag Status Set Register Definitions */ - -#define PMU_OVSSET_CNT0_STATUS_Pos 0U /*!< PMU OVSSET: Event Counter 0 Overflow Set Position */ -#define PMU_OVSSET_CNT0_STATUS_Msk (1UL /*<< PMU_OVSSET_CNT0_STATUS_Pos*/) /*!< PMU OVSSET: Event Counter 0 Overflow Set Mask */ - -#define PMU_OVSSET_CNT1_STATUS_Pos 1U /*!< PMU OVSSET: Event Counter 1 Overflow Set Position */ -#define PMU_OVSSET_CNT1_STATUS_Msk (1UL << PMU_OVSSET_CNT1_STATUS_Pos) /*!< PMU OVSSET: Event Counter 1 Overflow Set Mask */ - -#define PMU_OVSSET_CNT2_STATUS_Pos 2U /*!< PMU OVSSET: Event Counter 2 Overflow Set Position */ -#define PMU_OVSSET_CNT2_STATUS_Msk (1UL << PMU_OVSSET_CNT2_STATUS_Pos) /*!< PMU OVSSET: Event Counter 2 Overflow Set Mask */ - -#define PMU_OVSSET_CNT3_STATUS_Pos 3U /*!< PMU OVSSET: Event Counter 3 Overflow Set Position */ -#define PMU_OVSSET_CNT3_STATUS_Msk (1UL << PMU_OVSSET_CNT3_STATUS_Pos) /*!< PMU OVSSET: Event Counter 3 Overflow Set Mask */ - -#define PMU_OVSSET_CNT4_STATUS_Pos 4U /*!< PMU OVSSET: Event Counter 4 Overflow Set Position */ -#define PMU_OVSSET_CNT4_STATUS_Msk (1UL << PMU_OVSSET_CNT4_STATUS_Pos) /*!< PMU OVSSET: Event Counter 4 Overflow Set Mask */ - -#define PMU_OVSSET_CNT5_STATUS_Pos 5U /*!< PMU OVSSET: Event Counter 5 Overflow Set Position */ -#define PMU_OVSSET_CNT5_STATUS_Msk (1UL << PMU_OVSSET_CNT5_STATUS_Pos) /*!< PMU OVSSET: Event Counter 5 Overflow Set Mask */ - -#define PMU_OVSSET_CNT6_STATUS_Pos 6U /*!< PMU OVSSET: Event Counter 6 Overflow Set Position */ -#define PMU_OVSSET_CNT6_STATUS_Msk (1UL << PMU_OVSSET_CNT6_STATUS_Pos) /*!< PMU OVSSET: Event Counter 6 Overflow Set Mask */ - -#define PMU_OVSSET_CNT7_STATUS_Pos 7U /*!< PMU OVSSET: Event Counter 7 Overflow Set Position */ -#define PMU_OVSSET_CNT7_STATUS_Msk (1UL << PMU_OVSSET_CNT7_STATUS_Pos) /*!< PMU OVSSET: Event Counter 7 Overflow Set Mask */ - -#define PMU_OVSSET_CNT8_STATUS_Pos 8U /*!< PMU OVSSET: Event Counter 8 Overflow Set Position */ -#define PMU_OVSSET_CNT8_STATUS_Msk (1UL << PMU_OVSSET_CNT8_STATUS_Pos) /*!< PMU OVSSET: Event Counter 8 Overflow Set Mask */ - -#define PMU_OVSSET_CNT9_STATUS_Pos 9U /*!< PMU OVSSET: Event Counter 9 Overflow Set Position */ -#define PMU_OVSSET_CNT9_STATUS_Msk (1UL << PMU_OVSSET_CNT9_STATUS_Pos) /*!< PMU OVSSET: Event Counter 9 Overflow Set Mask */ - -#define PMU_OVSSET_CNT10_STATUS_Pos 10U /*!< PMU OVSSET: Event Counter 10 Overflow Set Position */ -#define PMU_OVSSET_CNT10_STATUS_Msk (1UL << PMU_OVSSET_CNT10_STATUS_Pos) /*!< PMU OVSSET: Event Counter 10 Overflow Set Mask */ - -#define PMU_OVSSET_CNT11_STATUS_Pos 11U /*!< PMU OVSSET: Event Counter 11 Overflow Set Position */ -#define PMU_OVSSET_CNT11_STATUS_Msk (1UL << PMU_OVSSET_CNT11_STATUS_Pos) /*!< PMU OVSSET: Event Counter 11 Overflow Set Mask */ - -#define PMU_OVSSET_CNT12_STATUS_Pos 12U /*!< PMU OVSSET: Event Counter 12 Overflow Set Position */ -#define PMU_OVSSET_CNT12_STATUS_Msk (1UL << PMU_OVSSET_CNT12_STATUS_Pos) /*!< PMU OVSSET: Event Counter 12 Overflow Set Mask */ - -#define PMU_OVSSET_CNT13_STATUS_Pos 13U /*!< PMU OVSSET: Event Counter 13 Overflow Set Position */ -#define PMU_OVSSET_CNT13_STATUS_Msk (1UL << PMU_OVSSET_CNT13_STATUS_Pos) /*!< PMU OVSSET: Event Counter 13 Overflow Set Mask */ - -#define PMU_OVSSET_CNT14_STATUS_Pos 14U /*!< PMU OVSSET: Event Counter 14 Overflow Set Position */ -#define PMU_OVSSET_CNT14_STATUS_Msk (1UL << PMU_OVSSET_CNT14_STATUS_Pos) /*!< PMU OVSSET: Event Counter 14 Overflow Set Mask */ - -#define PMU_OVSSET_CNT15_STATUS_Pos 15U /*!< PMU OVSSET: Event Counter 15 Overflow Set Position */ -#define PMU_OVSSET_CNT15_STATUS_Msk (1UL << PMU_OVSSET_CNT15_STATUS_Pos) /*!< PMU OVSSET: Event Counter 15 Overflow Set Mask */ - -#define PMU_OVSSET_CNT16_STATUS_Pos 16U /*!< PMU OVSSET: Event Counter 16 Overflow Set Position */ -#define PMU_OVSSET_CNT16_STATUS_Msk (1UL << PMU_OVSSET_CNT16_STATUS_Pos) /*!< PMU OVSSET: Event Counter 16 Overflow Set Mask */ - -#define PMU_OVSSET_CNT17_STATUS_Pos 17U /*!< PMU OVSSET: Event Counter 17 Overflow Set Position */ -#define PMU_OVSSET_CNT17_STATUS_Msk (1UL << PMU_OVSSET_CNT17_STATUS_Pos) /*!< PMU OVSSET: Event Counter 17 Overflow Set Mask */ - -#define PMU_OVSSET_CNT18_STATUS_Pos 18U /*!< PMU OVSSET: Event Counter 18 Overflow Set Position */ -#define PMU_OVSSET_CNT18_STATUS_Msk (1UL << PMU_OVSSET_CNT18_STATUS_Pos) /*!< PMU OVSSET: Event Counter 18 Overflow Set Mask */ - -#define PMU_OVSSET_CNT19_STATUS_Pos 19U /*!< PMU OVSSET: Event Counter 19 Overflow Set Position */ -#define PMU_OVSSET_CNT19_STATUS_Msk (1UL << PMU_OVSSET_CNT19_STATUS_Pos) /*!< PMU OVSSET: Event Counter 19 Overflow Set Mask */ - -#define PMU_OVSSET_CNT20_STATUS_Pos 20U /*!< PMU OVSSET: Event Counter 20 Overflow Set Position */ -#define PMU_OVSSET_CNT20_STATUS_Msk (1UL << PMU_OVSSET_CNT20_STATUS_Pos) /*!< PMU OVSSET: Event Counter 20 Overflow Set Mask */ - -#define PMU_OVSSET_CNT21_STATUS_Pos 21U /*!< PMU OVSSET: Event Counter 21 Overflow Set Position */ -#define PMU_OVSSET_CNT21_STATUS_Msk (1UL << PMU_OVSSET_CNT21_STATUS_Pos) /*!< PMU OVSSET: Event Counter 21 Overflow Set Mask */ - -#define PMU_OVSSET_CNT22_STATUS_Pos 22U /*!< PMU OVSSET: Event Counter 22 Overflow Set Position */ -#define PMU_OVSSET_CNT22_STATUS_Msk (1UL << PMU_OVSSET_CNT22_STATUS_Pos) /*!< PMU OVSSET: Event Counter 22 Overflow Set Mask */ - -#define PMU_OVSSET_CNT23_STATUS_Pos 23U /*!< PMU OVSSET: Event Counter 23 Overflow Set Position */ -#define PMU_OVSSET_CNT23_STATUS_Msk (1UL << PMU_OVSSET_CNT23_STATUS_Pos) /*!< PMU OVSSET: Event Counter 23 Overflow Set Mask */ - -#define PMU_OVSSET_CNT24_STATUS_Pos 24U /*!< PMU OVSSET: Event Counter 24 Overflow Set Position */ -#define PMU_OVSSET_CNT24_STATUS_Msk (1UL << PMU_OVSSET_CNT24_STATUS_Pos) /*!< PMU OVSSET: Event Counter 24 Overflow Set Mask */ - -#define PMU_OVSSET_CNT25_STATUS_Pos 25U /*!< PMU OVSSET: Event Counter 25 Overflow Set Position */ -#define PMU_OVSSET_CNT25_STATUS_Msk (1UL << PMU_OVSSET_CNT25_STATUS_Pos) /*!< PMU OVSSET: Event Counter 25 Overflow Set Mask */ - -#define PMU_OVSSET_CNT26_STATUS_Pos 26U /*!< PMU OVSSET: Event Counter 26 Overflow Set Position */ -#define PMU_OVSSET_CNT26_STATUS_Msk (1UL << PMU_OVSSET_CNT26_STATUS_Pos) /*!< PMU OVSSET: Event Counter 26 Overflow Set Mask */ - -#define PMU_OVSSET_CNT27_STATUS_Pos 27U /*!< PMU OVSSET: Event Counter 27 Overflow Set Position */ -#define PMU_OVSSET_CNT27_STATUS_Msk (1UL << PMU_OVSSET_CNT27_STATUS_Pos) /*!< PMU OVSSET: Event Counter 27 Overflow Set Mask */ - -#define PMU_OVSSET_CNT28_STATUS_Pos 28U /*!< PMU OVSSET: Event Counter 28 Overflow Set Position */ -#define PMU_OVSSET_CNT28_STATUS_Msk (1UL << PMU_OVSSET_CNT28_STATUS_Pos) /*!< PMU OVSSET: Event Counter 28 Overflow Set Mask */ - -#define PMU_OVSSET_CNT29_STATUS_Pos 29U /*!< PMU OVSSET: Event Counter 29 Overflow Set Position */ -#define PMU_OVSSET_CNT29_STATUS_Msk (1UL << PMU_OVSSET_CNT29_STATUS_Pos) /*!< PMU OVSSET: Event Counter 29 Overflow Set Mask */ - -#define PMU_OVSSET_CNT30_STATUS_Pos 30U /*!< PMU OVSSET: Event Counter 30 Overflow Set Position */ -#define PMU_OVSSET_CNT30_STATUS_Msk (1UL << PMU_OVSSET_CNT30_STATUS_Pos) /*!< PMU OVSSET: Event Counter 30 Overflow Set Mask */ - -#define PMU_OVSSET_CYCCNT_STATUS_Pos 31U /*!< PMU OVSSET: Cycle Counter Overflow Set Position */ -#define PMU_OVSSET_CYCCNT_STATUS_Msk (1UL << PMU_OVSSET_CYCCNT_STATUS_Pos) /*!< PMU OVSSET: Cycle Counter Overflow Set Mask */ - -/** \brief PMU Overflow Flag Status Clear Register Definitions */ - -#define PMU_OVSCLR_CNT0_STATUS_Pos 0U /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Position */ -#define PMU_OVSCLR_CNT0_STATUS_Msk (1UL /*<< PMU_OVSCLR_CNT0_STATUS_Pos*/) /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT1_STATUS_Pos 1U /*!< PMU OVSCLR: Event Counter 1 Overflow Clear Position */ -#define PMU_OVSCLR_CNT1_STATUS_Msk (1UL << PMU_OVSCLR_CNT1_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 1 Overflow Clear */ - -#define PMU_OVSCLR_CNT2_STATUS_Pos 2U /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Position */ -#define PMU_OVSCLR_CNT2_STATUS_Msk (1UL << PMU_OVSCLR_CNT2_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT3_STATUS_Pos 3U /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Position */ -#define PMU_OVSCLR_CNT3_STATUS_Msk (1UL << PMU_OVSCLR_CNT3_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT4_STATUS_Pos 4U /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Position */ -#define PMU_OVSCLR_CNT4_STATUS_Msk (1UL << PMU_OVSCLR_CNT4_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT5_STATUS_Pos 5U /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Position */ -#define PMU_OVSCLR_CNT5_STATUS_Msk (1UL << PMU_OVSCLR_CNT5_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT6_STATUS_Pos 6U /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Position */ -#define PMU_OVSCLR_CNT6_STATUS_Msk (1UL << PMU_OVSCLR_CNT6_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT7_STATUS_Pos 7U /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Position */ -#define PMU_OVSCLR_CNT7_STATUS_Msk (1UL << PMU_OVSCLR_CNT7_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT8_STATUS_Pos 8U /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Position */ -#define PMU_OVSCLR_CNT8_STATUS_Msk (1UL << PMU_OVSCLR_CNT8_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT9_STATUS_Pos 9U /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Position */ -#define PMU_OVSCLR_CNT9_STATUS_Msk (1UL << PMU_OVSCLR_CNT9_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT10_STATUS_Pos 10U /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Position */ -#define PMU_OVSCLR_CNT10_STATUS_Msk (1UL << PMU_OVSCLR_CNT10_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT11_STATUS_Pos 11U /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Position */ -#define PMU_OVSCLR_CNT11_STATUS_Msk (1UL << PMU_OVSCLR_CNT11_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT12_STATUS_Pos 12U /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Position */ -#define PMU_OVSCLR_CNT12_STATUS_Msk (1UL << PMU_OVSCLR_CNT12_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT13_STATUS_Pos 13U /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Position */ -#define PMU_OVSCLR_CNT13_STATUS_Msk (1UL << PMU_OVSCLR_CNT13_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT14_STATUS_Pos 14U /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Position */ -#define PMU_OVSCLR_CNT14_STATUS_Msk (1UL << PMU_OVSCLR_CNT14_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT15_STATUS_Pos 15U /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Position */ -#define PMU_OVSCLR_CNT15_STATUS_Msk (1UL << PMU_OVSCLR_CNT15_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT16_STATUS_Pos 16U /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Position */ -#define PMU_OVSCLR_CNT16_STATUS_Msk (1UL << PMU_OVSCLR_CNT16_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT17_STATUS_Pos 17U /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Position */ -#define PMU_OVSCLR_CNT17_STATUS_Msk (1UL << PMU_OVSCLR_CNT17_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT18_STATUS_Pos 18U /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Position */ -#define PMU_OVSCLR_CNT18_STATUS_Msk (1UL << PMU_OVSCLR_CNT18_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT19_STATUS_Pos 19U /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Position */ -#define PMU_OVSCLR_CNT19_STATUS_Msk (1UL << PMU_OVSCLR_CNT19_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT20_STATUS_Pos 20U /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Position */ -#define PMU_OVSCLR_CNT20_STATUS_Msk (1UL << PMU_OVSCLR_CNT20_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT21_STATUS_Pos 21U /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Position */ -#define PMU_OVSCLR_CNT21_STATUS_Msk (1UL << PMU_OVSCLR_CNT21_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT22_STATUS_Pos 22U /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Position */ -#define PMU_OVSCLR_CNT22_STATUS_Msk (1UL << PMU_OVSCLR_CNT22_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT23_STATUS_Pos 23U /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Position */ -#define PMU_OVSCLR_CNT23_STATUS_Msk (1UL << PMU_OVSCLR_CNT23_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT24_STATUS_Pos 24U /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Position */ -#define PMU_OVSCLR_CNT24_STATUS_Msk (1UL << PMU_OVSCLR_CNT24_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT25_STATUS_Pos 25U /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Position */ -#define PMU_OVSCLR_CNT25_STATUS_Msk (1UL << PMU_OVSCLR_CNT25_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT26_STATUS_Pos 26U /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Position */ -#define PMU_OVSCLR_CNT26_STATUS_Msk (1UL << PMU_OVSCLR_CNT26_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT27_STATUS_Pos 27U /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Position */ -#define PMU_OVSCLR_CNT27_STATUS_Msk (1UL << PMU_OVSCLR_CNT27_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT28_STATUS_Pos 28U /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Position */ -#define PMU_OVSCLR_CNT28_STATUS_Msk (1UL << PMU_OVSCLR_CNT28_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT29_STATUS_Pos 29U /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Position */ -#define PMU_OVSCLR_CNT29_STATUS_Msk (1UL << PMU_OVSCLR_CNT29_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT30_STATUS_Pos 30U /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Position */ -#define PMU_OVSCLR_CNT30_STATUS_Msk (1UL << PMU_OVSCLR_CNT30_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Mask */ - -#define PMU_OVSCLR_CYCCNT_STATUS_Pos 31U /*!< PMU OVSCLR: Cycle Counter Overflow Clear Position */ -#define PMU_OVSCLR_CYCCNT_STATUS_Msk (1UL << PMU_OVSCLR_CYCCNT_STATUS_Pos) /*!< PMU OVSCLR: Cycle Counter Overflow Clear Mask */ - -/** \brief PMU Software Increment Counter */ - -#define PMU_SWINC_CNT0_Pos 0U /*!< PMU SWINC: Event Counter 0 Software Increment Position */ -#define PMU_SWINC_CNT0_Msk (1UL /*<< PMU_SWINC_CNT0_Pos */) /*!< PMU SWINC: Event Counter 0 Software Increment Mask */ - -#define PMU_SWINC_CNT1_Pos 1U /*!< PMU SWINC: Event Counter 1 Software Increment Position */ -#define PMU_SWINC_CNT1_Msk (1UL << PMU_SWINC_CNT1_Pos) /*!< PMU SWINC: Event Counter 1 Software Increment Mask */ - -#define PMU_SWINC_CNT2_Pos 2U /*!< PMU SWINC: Event Counter 2 Software Increment Position */ -#define PMU_SWINC_CNT2_Msk (1UL << PMU_SWINC_CNT2_Pos) /*!< PMU SWINC: Event Counter 2 Software Increment Mask */ - -#define PMU_SWINC_CNT3_Pos 3U /*!< PMU SWINC: Event Counter 3 Software Increment Position */ -#define PMU_SWINC_CNT3_Msk (1UL << PMU_SWINC_CNT3_Pos) /*!< PMU SWINC: Event Counter 3 Software Increment Mask */ - -#define PMU_SWINC_CNT4_Pos 4U /*!< PMU SWINC: Event Counter 4 Software Increment Position */ -#define PMU_SWINC_CNT4_Msk (1UL << PMU_SWINC_CNT4_Pos) /*!< PMU SWINC: Event Counter 4 Software Increment Mask */ - -#define PMU_SWINC_CNT5_Pos 5U /*!< PMU SWINC: Event Counter 5 Software Increment Position */ -#define PMU_SWINC_CNT5_Msk (1UL << PMU_SWINC_CNT5_Pos) /*!< PMU SWINC: Event Counter 5 Software Increment Mask */ - -#define PMU_SWINC_CNT6_Pos 6U /*!< PMU SWINC: Event Counter 6 Software Increment Position */ -#define PMU_SWINC_CNT6_Msk (1UL << PMU_SWINC_CNT6_Pos) /*!< PMU SWINC: Event Counter 6 Software Increment Mask */ - -#define PMU_SWINC_CNT7_Pos 7U /*!< PMU SWINC: Event Counter 7 Software Increment Position */ -#define PMU_SWINC_CNT7_Msk (1UL << PMU_SWINC_CNT7_Pos) /*!< PMU SWINC: Event Counter 7 Software Increment Mask */ - -#define PMU_SWINC_CNT8_Pos 8U /*!< PMU SWINC: Event Counter 8 Software Increment Position */ -#define PMU_SWINC_CNT8_Msk (1UL << PMU_SWINC_CNT8_Pos) /*!< PMU SWINC: Event Counter 8 Software Increment Mask */ - -#define PMU_SWINC_CNT9_Pos 9U /*!< PMU SWINC: Event Counter 9 Software Increment Position */ -#define PMU_SWINC_CNT9_Msk (1UL << PMU_SWINC_CNT9_Pos) /*!< PMU SWINC: Event Counter 9 Software Increment Mask */ - -#define PMU_SWINC_CNT10_Pos 10U /*!< PMU SWINC: Event Counter 10 Software Increment Position */ -#define PMU_SWINC_CNT10_Msk (1UL << PMU_SWINC_CNT10_Pos) /*!< PMU SWINC: Event Counter 10 Software Increment Mask */ - -#define PMU_SWINC_CNT11_Pos 11U /*!< PMU SWINC: Event Counter 11 Software Increment Position */ -#define PMU_SWINC_CNT11_Msk (1UL << PMU_SWINC_CNT11_Pos) /*!< PMU SWINC: Event Counter 11 Software Increment Mask */ - -#define PMU_SWINC_CNT12_Pos 12U /*!< PMU SWINC: Event Counter 12 Software Increment Position */ -#define PMU_SWINC_CNT12_Msk (1UL << PMU_SWINC_CNT12_Pos) /*!< PMU SWINC: Event Counter 12 Software Increment Mask */ - -#define PMU_SWINC_CNT13_Pos 13U /*!< PMU SWINC: Event Counter 13 Software Increment Position */ -#define PMU_SWINC_CNT13_Msk (1UL << PMU_SWINC_CNT13_Pos) /*!< PMU SWINC: Event Counter 13 Software Increment Mask */ - -#define PMU_SWINC_CNT14_Pos 14U /*!< PMU SWINC: Event Counter 14 Software Increment Position */ -#define PMU_SWINC_CNT14_Msk (1UL << PMU_SWINC_CNT14_Pos) /*!< PMU SWINC: Event Counter 14 Software Increment Mask */ - -#define PMU_SWINC_CNT15_Pos 15U /*!< PMU SWINC: Event Counter 15 Software Increment Position */ -#define PMU_SWINC_CNT15_Msk (1UL << PMU_SWINC_CNT15_Pos) /*!< PMU SWINC: Event Counter 15 Software Increment Mask */ - -#define PMU_SWINC_CNT16_Pos 16U /*!< PMU SWINC: Event Counter 16 Software Increment Position */ -#define PMU_SWINC_CNT16_Msk (1UL << PMU_SWINC_CNT16_Pos) /*!< PMU SWINC: Event Counter 16 Software Increment Mask */ - -#define PMU_SWINC_CNT17_Pos 17U /*!< PMU SWINC: Event Counter 17 Software Increment Position */ -#define PMU_SWINC_CNT17_Msk (1UL << PMU_SWINC_CNT17_Pos) /*!< PMU SWINC: Event Counter 17 Software Increment Mask */ - -#define PMU_SWINC_CNT18_Pos 18U /*!< PMU SWINC: Event Counter 18 Software Increment Position */ -#define PMU_SWINC_CNT18_Msk (1UL << PMU_SWINC_CNT18_Pos) /*!< PMU SWINC: Event Counter 18 Software Increment Mask */ - -#define PMU_SWINC_CNT19_Pos 19U /*!< PMU SWINC: Event Counter 19 Software Increment Position */ -#define PMU_SWINC_CNT19_Msk (1UL << PMU_SWINC_CNT19_Pos) /*!< PMU SWINC: Event Counter 19 Software Increment Mask */ - -#define PMU_SWINC_CNT20_Pos 20U /*!< PMU SWINC: Event Counter 20 Software Increment Position */ -#define PMU_SWINC_CNT20_Msk (1UL << PMU_SWINC_CNT20_Pos) /*!< PMU SWINC: Event Counter 20 Software Increment Mask */ - -#define PMU_SWINC_CNT21_Pos 21U /*!< PMU SWINC: Event Counter 21 Software Increment Position */ -#define PMU_SWINC_CNT21_Msk (1UL << PMU_SWINC_CNT21_Pos) /*!< PMU SWINC: Event Counter 21 Software Increment Mask */ - -#define PMU_SWINC_CNT22_Pos 22U /*!< PMU SWINC: Event Counter 22 Software Increment Position */ -#define PMU_SWINC_CNT22_Msk (1UL << PMU_SWINC_CNT22_Pos) /*!< PMU SWINC: Event Counter 22 Software Increment Mask */ - -#define PMU_SWINC_CNT23_Pos 23U /*!< PMU SWINC: Event Counter 23 Software Increment Position */ -#define PMU_SWINC_CNT23_Msk (1UL << PMU_SWINC_CNT23_Pos) /*!< PMU SWINC: Event Counter 23 Software Increment Mask */ - -#define PMU_SWINC_CNT24_Pos 24U /*!< PMU SWINC: Event Counter 24 Software Increment Position */ -#define PMU_SWINC_CNT24_Msk (1UL << PMU_SWINC_CNT24_Pos) /*!< PMU SWINC: Event Counter 24 Software Increment Mask */ - -#define PMU_SWINC_CNT25_Pos 25U /*!< PMU SWINC: Event Counter 25 Software Increment Position */ -#define PMU_SWINC_CNT25_Msk (1UL << PMU_SWINC_CNT25_Pos) /*!< PMU SWINC: Event Counter 25 Software Increment Mask */ - -#define PMU_SWINC_CNT26_Pos 26U /*!< PMU SWINC: Event Counter 26 Software Increment Position */ -#define PMU_SWINC_CNT26_Msk (1UL << PMU_SWINC_CNT26_Pos) /*!< PMU SWINC: Event Counter 26 Software Increment Mask */ - -#define PMU_SWINC_CNT27_Pos 27U /*!< PMU SWINC: Event Counter 27 Software Increment Position */ -#define PMU_SWINC_CNT27_Msk (1UL << PMU_SWINC_CNT27_Pos) /*!< PMU SWINC: Event Counter 27 Software Increment Mask */ - -#define PMU_SWINC_CNT28_Pos 28U /*!< PMU SWINC: Event Counter 28 Software Increment Position */ -#define PMU_SWINC_CNT28_Msk (1UL << PMU_SWINC_CNT28_Pos) /*!< PMU SWINC: Event Counter 28 Software Increment Mask */ - -#define PMU_SWINC_CNT29_Pos 29U /*!< PMU SWINC: Event Counter 29 Software Increment Position */ -#define PMU_SWINC_CNT29_Msk (1UL << PMU_SWINC_CNT29_Pos) /*!< PMU SWINC: Event Counter 29 Software Increment Mask */ - -#define PMU_SWINC_CNT30_Pos 30U /*!< PMU SWINC: Event Counter 30 Software Increment Position */ -#define PMU_SWINC_CNT30_Msk (1UL << PMU_SWINC_CNT30_Pos) /*!< PMU SWINC: Event Counter 30 Software Increment Mask */ - -/** \brief PMU Control Register Definitions */ - -#define PMU_CTRL_ENABLE_Pos 0U /*!< PMU CTRL: ENABLE Position */ -#define PMU_CTRL_ENABLE_Msk (1UL /*<< PMU_CTRL_ENABLE_Pos*/) /*!< PMU CTRL: ENABLE Mask */ - -#define PMU_CTRL_EVENTCNT_RESET_Pos 1U /*!< PMU CTRL: Event Counter Reset Position */ -#define PMU_CTRL_EVENTCNT_RESET_Msk (1UL << PMU_CTRL_EVENTCNT_RESET_Pos) /*!< PMU CTRL: Event Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_RESET_Pos 2U /*!< PMU CTRL: Cycle Counter Reset Position */ -#define PMU_CTRL_CYCCNT_RESET_Msk (1UL << PMU_CTRL_CYCCNT_RESET_Pos) /*!< PMU CTRL: Cycle Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_DISABLE_Pos 5U /*!< PMU CTRL: Disable Cycle Counter Position */ -#define PMU_CTRL_CYCCNT_DISABLE_Msk (1UL << PMU_CTRL_CYCCNT_DISABLE_Pos) /*!< PMU CTRL: Disable Cycle Counter Mask */ - -#define PMU_CTRL_FRZ_ON_OV_Pos 9U /*!< PMU CTRL: Freeze-on-overflow Position */ -#define PMU_CTRL_FRZ_ON_OV_Msk (1UL << PMU_CTRL_FRZ_ON_OVERFLOW_Pos) /*!< PMU CTRL: Freeze-on-overflow Mask */ - -#define PMU_CTRL_TRACE_ON_OV_Pos 11U /*!< PMU CTRL: Trace-on-overflow Position */ -#define PMU_CTRL_TRACE_ON_OV_Msk (1UL << PMU_CTRL_TRACE_ON_OVERFLOW_Pos) /*!< PMU CTRL: Trace-on-overflow Mask */ - -/** \brief PMU Type Register Definitions */ - -#define PMU_TYPE_NUM_CNTS_Pos 0U /*!< PMU TYPE: Number of Counters Position */ -#define PMU_TYPE_NUM_CNTS_Msk (0xFFUL /*<< PMU_TYPE_NUM_CNTS_Pos*/) /*!< PMU TYPE: Number of Counters Mask */ - -#define PMU_TYPE_SIZE_CNTS_Pos 8U /*!< PMU TYPE: Size of Counters Position */ -#define PMU_TYPE_SIZE_CNTS_Msk (0x3FUL << PMU_TYPE_SIZE_CNTS_Pos) /*!< PMU TYPE: Size of Counters Mask */ - -#define PMU_TYPE_CYCCNT_PRESENT_Pos 14U /*!< PMU TYPE: Cycle Counter Present Position */ -#define PMU_TYPE_CYCCNT_PRESENT_Msk (1UL << PMU_TYPE_CYCCNT_PRESENT_Pos) /*!< PMU TYPE: Cycle Counter Present Mask */ - -#define PMU_TYPE_FRZ_OV_SUPPORT_Pos 21U /*!< PMU TYPE: Freeze-on-overflow Support Position */ -#define PMU_TYPE_FRZ_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Freeze-on-overflow Support Mask */ - -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Pos 23U /*!< PMU TYPE: Trace-on-overflow Support Position */ -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Trace-on-overflow Support Mask */ - -/** \brief PMU Authentication Status Register Definitions */ - -#define PMU_AUTHSTATUS_NSID_Pos 0U /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSID_Msk (0x3UL /*<< PMU_AUTHSTATUS_NSID_Pos*/) /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSNID_Pos 2U /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSNID_Msk (0x3UL << PMU_AUTHSTATUS_NSNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SID_Pos 4U /*!< PMU AUTHSTATUS: Secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_SID_Msk (0x3UL << PMU_AUTHSTATUS_SID_Pos) /*!< PMU AUTHSTATUS: Secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SNID_Pos 6U /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SNID_Msk (0x3UL << PMU_AUTHSTATUS_SNID_Pos) /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUID_Pos 16U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUID_Msk (0x3UL << PMU_AUTHSTATUS_NSUID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUNID_Pos 18U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUNID_Msk (0x3UL << PMU_AUTHSTATUS_NSUNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUID_Pos 20U /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_SUID_Msk (0x3UL << PMU_AUTHSTATUS_SUID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUNID_Pos 22U /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SUNID_Msk (0x3UL << PMU_AUTHSTATUS_SUNID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Mask */ - - -/*@} end of group CMSIS_PMU */ -#endif - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ -#define MPU_RLAR_PXN_Msk (1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -#define FPU_FPDSCR_FZ16_Pos 19U /*!< FPDSCR: FZ16 bit Position */ -#define FPU_FPDSCR_FZ16_Msk (1UL << FPU_FPDSCR_FZ16_Pos) /*!< FPDSCR: FZ16 bit Mask */ - -#define FPU_FPDSCR_LTPSIZE_Pos 16U /*!< FPDSCR: LTPSIZE bit Position */ -#define FPU_FPDSCR_LTPSIZE_Msk (7UL << FPU_FPDSCR_LTPSIZE_Pos) /*!< FPDSCR: LTPSIZE bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FPRound_Pos 28U /*!< MVFR0: FPRound bits Position */ -#define FPU_MVFR0_FPRound_Msk (0xFUL << FPU_MVFR0_FPRound_Pos) /*!< MVFR0: FPRound bits Mask */ - -#define FPU_MVFR0_FPSqrt_Pos 20U /*!< MVFR0: FPSqrt bits Position */ -#define FPU_MVFR0_FPSqrt_Msk (0xFUL << FPU_MVFR0_FPSqrt_Pos) /*!< MVFR0: FPSqrt bits Mask */ - -#define FPU_MVFR0_FPDivide_Pos 16U /*!< MVFR0: FPDivide bits Position */ -#define FPU_MVFR0_FPDivide_Msk (0xFUL << FPU_MVFR0_FPDivide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FPDP_Pos 8U /*!< MVFR0: FPDP bits Position */ -#define FPU_MVFR0_FPDP_Msk (0xFUL << FPU_MVFR0_FPDP_Pos) /*!< MVFR0: FPDP bits Mask */ - -#define FPU_MVFR0_FPSP_Pos 4U /*!< MVFR0: FPSP bits Position */ -#define FPU_MVFR0_FPSP_Msk (0xFUL << FPU_MVFR0_FPSP_Pos) /*!< MVFR0: FPSP bits Mask */ - -#define FPU_MVFR0_SIMDReg_Pos 0U /*!< MVFR0: SIMDReg bits Position */ -#define FPU_MVFR0_SIMDReg_Msk (0xFUL /*<< FPU_MVFR0_SIMDReg_Pos*/) /*!< MVFR0: SIMDReg bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FMAC_Pos 28U /*!< MVFR1: FMAC bits Position */ -#define FPU_MVFR1_FMAC_Msk (0xFUL << FPU_MVFR1_FMAC_Pos) /*!< MVFR1: FMAC bits Mask */ - -#define FPU_MVFR1_FPHP_Pos 24U /*!< MVFR1: FPHP bits Position */ -#define FPU_MVFR1_FPHP_Msk (0xFUL << FPU_MVFR1_FPHP_Pos) /*!< MVFR1: FPHP bits Mask */ - -#define FPU_MVFR1_FP16_Pos 20U /*!< MVFR1: FP16 bits Position */ -#define FPU_MVFR1_FP16_Msk (0xFUL << FPU_MVFR1_FP16_Pos) /*!< MVFR1: FP16 bits Mask */ - -#define FPU_MVFR1_MVE_Pos 8U /*!< MVFR1: MVE bits Position */ -#define FPU_MVFR1_MVE_Msk (0xFUL << FPU_MVFR1_MVE_Pos) /*!< MVFR1: MVE bits Mask */ - -#define FPU_MVFR1_FPDNaN_Pos 4U /*!< MVFR1: FPDNaN bits Position */ -#define FPU_MVFR1_FPDNaN_Msk (0xFUL << FPU_MVFR1_FPDNaN_Pos) /*!< MVFR1: FPDNaN bits Mask */ - -#define FPU_MVFR1_FPFtZ_Pos 0U /*!< MVFR1: FPFtZ bits Position */ -#define FPU_MVFR1_FPFtZ_Msk (0xFUL /*<< FPU_MVFR1_FPFtZ_Pos*/) /*!< MVFR1: FPFtZ bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_FPD_Pos 23U /*!< \deprecated CoreDebug DHCSR: S_FPD Position */ -#define CoreDebug_DHCSR_S_FPD_Msk (1UL << CoreDebug_DHCSR_S_FPD_Pos) /*!< \deprecated CoreDebug DHCSR: S_FPD Mask */ - -#define CoreDebug_DHCSR_S_SUIDE_Pos 22U /*!< \deprecated CoreDebug DHCSR: S_SUIDE Position */ -#define CoreDebug_DHCSR_S_SUIDE_Msk (1UL << CoreDebug_DHCSR_S_SUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SUIDE Mask */ - -#define CoreDebug_DHCSR_S_NSUIDE_Pos 21U /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Position */ -#define CoreDebug_DHCSR_S_NSUIDE_Msk (1UL << CoreDebug_DHCSR_S_NSUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Mask */ - -#define CoreDebug_DHCSR_S_SDE_Pos 20U /*!< \deprecated CoreDebug DHCSR: S_SDE Position */ -#define CoreDebug_DHCSR_S_SDE_Msk (1UL << CoreDebug_DHCSR_S_SDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SDE Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_PMOV_Pos 6U /*!< \deprecated CoreDebug DHCSR: C_PMOV Position */ -#define CoreDebug_DHCSR_C_PMOV_Msk (1UL << CoreDebug_DHCSR_C_PMOV_Pos) /*!< \deprecated CoreDebug DHCSR: C_PMOV Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Set Clear Exception and Monitor Control Register Definitions */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_REQ_Pos 3U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_SET_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_PEND_Pos 1U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_SET_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_UIDEN_Pos 10U /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_UIDAPEN_Pos 9U /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDAPEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDAPEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Mask */ - -#define CoreDebug_DAUTHCTRL_FSDMA_Pos 8U /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Position */ -#define CoreDebug_DAUTHCTRL_FSDMA_Msk (1UL << CoreDebug_DAUTHCTRL_FSDMA_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_FPD_Pos 23U /*!< DCB DHCSR: Floating-point registers Debuggable Position */ -#define DCB_DHCSR_S_FPD_Msk (0x1UL << DCB_DHCSR_S_FPD_Pos) /*!< DCB DHCSR: Floating-point registers Debuggable Mask */ - -#define DCB_DHCSR_S_SUIDE_Pos 22U /*!< DCB DHCSR: Secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_SUIDE_Msk (0x1UL << DCB_DHCSR_S_SUIDE_Pos) /*!< DCB DHCSR: Secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_NSUIDE_Pos 21U /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_NSUIDE_Msk (0x1UL << DCB_DHCSR_S_NSUIDE_Pos) /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_PMOV_Pos 6U /*!< DCB DHCSR: Halt on PMU overflow control Position */ -#define DCB_DHCSR_C_PMOV_Msk (0x1UL << DCB_DHCSR_C_PMOV_Pos) /*!< DCB DHCSR: Halt on PMU overflow control Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DSCEMCR, Debug Set Clear Exception and Monitor Control Register Definitions */ -#define DCB_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< DCB DSCEMCR: Clear monitor request Position */ -#define DCB_DSCEMCR_CLR_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_REQ_Pos) /*!< DCB DSCEMCR: Clear monitor request Mask */ - -#define DCB_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< DCB DSCEMCR: Clear monitor pend Position */ -#define DCB_DSCEMCR_CLR_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_PEND_Pos) /*!< DCB DSCEMCR: Clear monitor pend Mask */ - -#define DCB_DSCEMCR_SET_MON_REQ_Pos 3U /*!< DCB DSCEMCR: Set monitor request Position */ -#define DCB_DSCEMCR_SET_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_SET_MON_REQ_Pos) /*!< DCB DSCEMCR: Set monitor request Mask */ - -#define DCB_DSCEMCR_SET_MON_PEND_Pos 1U /*!< DCB DSCEMCR: Set monitor pend Position */ -#define DCB_DSCEMCR_SET_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_SET_MON_PEND_Pos) /*!< DCB DSCEMCR: Set monitor pend Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_UIDEN_Pos 10U /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Position */ -#define DCB_DAUTHCTRL_UIDEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Mask */ - -#define DCB_DAUTHCTRL_UIDAPEN_Pos 9U /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Position */ -#define DCB_DAUTHCTRL_UIDAPEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDAPEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Mask */ - -#define DCB_DAUTHCTRL_FSDMA_Pos 8U /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Position */ -#define DCB_DAUTHCTRL_FSDMA_Msk (0x1UL << DCB_DAUTHCTRL_FSDMA_Pos) /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Mask */ - -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SUNID_Pos 22U /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUNID_Msk (0x3UL << DIB_DAUTHSTATUS_SUNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SUID_Pos 20U /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUID_Msk (0x3UL << DIB_DAUTHSTATUS_SUID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_NSUNID_Pos 18U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Position */ -#define DIB_DAUTHSTATUS_NSUNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Mask */ - -#define DIB_DAUTHSTATUS_NSUID_Pos 16U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_NSUID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define MEMSYSCTL_BASE (0xE001E000UL) /*!< Memory System Control Base Address */ - #define ERRBNK_BASE (0xE001E100UL) /*!< Error Banking Base Address */ - #define PWRMODCTL_BASE (0xE001E300UL) /*!< Power Mode Control Base Address */ - #define EWIC_BASE (0xE001E400UL) /*!< External Wakeup Interrupt Controller Base Address */ - #define PRCCFGINF_BASE (0xE001E700UL) /*!< Processor Configuration Information Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ - #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ - #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - - #define ICB ((ICB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ - #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ - #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define MEMSYSCTL ((MemSysCtl_Type *) MEMSYSCTL_BASE ) /*!< Memory System Control configuration struct */ - #define ERRBNK ((ErrBnk_Type *) ERRBNK_BASE ) /*!< Error Banking configuration struct */ - #define PWRMODCTL ((PwrModCtl_Type *) PWRMODCTL_BASE ) /*!< Power Mode Control configuration struct */ - #define EWIC ((EWIC_Type *) EWIC_BASE ) /*!< EWIC configuration struct */ - #define PRCCFGINF ((PrcCfgInf_Type *) PRCCFGINF_BASE ) /*!< Processor Configuration Information configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - #define PMU_BASE (0xE0003000UL) /*!< PMU Base Address */ - #define PMU ((PMU_Type *) PMU_BASE ) /*!< PMU configuration struct */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define ICB_NS ((ICB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ - -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## PMU functions and events #################################### */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - -#include "pmu_armv8.h" - -/** - \brief Cortex-M85 PMU events - \note Architectural PMU events can be found in pmu_armv8.h -*/ - -#define ARMCM85_PMU_ECC_ERR 0xC000 /*!< One or more Error Correcting Code (ECC) errors detected */ -#define ARMCM85_PMU_ECC_ERR_MBIT 0xC001 /*!< One or more multi-bit ECC errors detected */ -#define ARMCM85_PMU_ECC_ERR_DCACHE 0xC010 /*!< One or more ECC errors in the data cache */ -#define ARMCM85_PMU_ECC_ERR_ICACHE 0xC011 /*!< One or more ECC errors in the instruction cache */ -#define ARMCM85_PMU_ECC_ERR_MBIT_DCACHE 0xC012 /*!< One or more multi-bit ECC errors in the data cache */ -#define ARMCM85_PMU_ECC_ERR_MBIT_ICACHE 0xC013 /*!< One or more multi-bit ECC errors in the instruction cache */ -#define ARMCM85_PMU_ECC_ERR_DTCM 0xC020 /*!< One or more ECC errors in the Data Tightly Coupled Memory (DTCM) */ -#define ARMCM85_PMU_ECC_ERR_ITCM 0xC021 /*!< One or more ECC errors in the Instruction Tightly Coupled Memory (ITCM) */ -#define ARMCM85_PMU_ECC_ERR_MBIT_DTCM 0xC022 /*!< One or more multi-bit ECC errors in the DTCM */ -#define ARMCM85_PMU_ECC_ERR_MBIT_ITCM 0xC023 /*!< One or more multi-bit ECC errors in the ITCM */ -#define ARMCM85_PMU_PF_LINEFILL 0xC100 /*!< The prefetcher starts a line-fill */ -#define ARMCM85_PMU_PF_CANCEL 0xC101 /*!< The prefetcher stops prefetching */ -#define ARMCM85_PMU_PF_DROP_LINEFILL 0xC102 /*!< A linefill triggered by a prefetcher has been dropped because of lack of buffering */ -#define ARMCM85_PMU_NWAMODE_ENTER 0xC200 /*!< No write-allocate mode entry */ -#define ARMCM85_PMU_NWAMODE 0xC201 /*!< Write-allocate store is not allocated into the data cache due to no-write-allocate mode */ -#define ARMCM85_PMU_SAHB_ACCESS 0xC300 /*!< Read or write access on the S-AHB interface to the TCM */ -#define ARMCM85_PMU_PAHB_ACCESS 0xC301 /*!< Read or write access on the P-AHB write interface */ -#define ARMCM85_PMU_AXI_WRITE_ACCESS 0xC302 /*!< Any beat access to M-AXI write interface */ -#define ARMCM85_PMU_AXI_READ_ACCESS 0xC303 /*!< Any beat access to M-AXI read interface */ -#define ARMCM85_PMU_DOSTIMEOUT_DOUBLE 0xC400 /*!< Denial of Service timeout has fired twice and caused buffers to drain to allow forward progress */ -#define ARMCM85_PMU_DOSTIMEOUT_TRIPLE 0xC401 /*!< Denial of Service timeout has fired three times and blocked the LSU to force forward progress */ - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - -/* ########################## MVE functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_MveFunctions MVE Functions - \brief Function that provides MVE type. - @{ - */ - -/** - \brief get MVE type - \details returns the MVE type - \returns - - \b 0: No Vector Extension (MVE) - - \b 1: Integer Vector Extension (MVE-I) - - \b 2: Floating-point Vector Extension (MVE-F) - */ -__STATIC_INLINE uint32_t SCB_GetMVEType(void) -{ - const uint32_t mvfr1 = FPU->MVFR1; - if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x2U << FPU_MVFR1_MVE_Pos)) - { - return 2U; - } - else if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x1U << FPU_MVFR1_MVE_Pos)) - { - return 1U; - } - else - { - return 0U; - } -} - - -/*@} end of CMSIS_Core_MveFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - -/* ################### PAC Key functions ########################### */ - -#if (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) -#include "pac_armv81.h" -#endif - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM85_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_sc000.h b/software/bootloader/Drivers/CMSIS/Include/core_sc000.h deleted file mode 100644 index dbc755f..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_sc000.h +++ /dev/null @@ -1,1030 +0,0 @@ -/**************************************************************************//** - * @file core_sc000.h - * @brief CMSIS SC000 Core Peripheral Access Layer Header File - * @version V5.0.7 - * @date 27. March 2020 - ******************************************************************************/ -/* - * Copyright (c) 2009-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_SC000_H_GENERIC -#define __CORE_SC000_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup SC000 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS SC000 definitions */ -#define __SC000_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __SC000_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ - __SC000_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_SC (000U) /*!< Cortex secure core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC000_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_SC000_H_DEPENDANT -#define __CORE_SC000_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __SC000_REV - #define __SC000_REV 0x0000U - #warning "__SC000_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group SC000 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t _reserved0:1; /*!< bit: 0 Reserved */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - uint32_t RESERVED1[154U]; - __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the SC000 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else -/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for SC000 */ -/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for SC000 */ - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ -/*#define NVIC_GetActive __NVIC_GetActive not available for SC000 */ - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ - - -/* Interrupt Priorities are WORD accessible only under Armv6-M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M0 and M0+ do not require the architectural barrier - assume SC000 is the same */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC000_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_sc300.h b/software/bootloader/Drivers/CMSIS/Include/core_sc300.h deleted file mode 100644 index d666210..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_sc300.h +++ /dev/null @@ -1,1917 +0,0 @@ -/**************************************************************************//** - * @file core_sc300.h - * @brief CMSIS SC300 Core Peripheral Access Layer Header File - * @version V5.0.10 - * @date 04. June 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_SC300_H_GENERIC -#define __CORE_SC300_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup SC3000 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS SC300 definitions */ -#define __SC300_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __SC300_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ - __SC300_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_SC (300U) /*!< Cortex secure core */ - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC300_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_SC300_H_DEPENDANT -#define __CORE_SC300_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __SC300_REV - #define __SC300_REV 0x0000U - #warning "__SC300_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group SC300 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - uint32_t RESERVED1[129U]; - __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ -#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ - -#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ -#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ -#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ - -#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ -#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -#ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset -#endif /* CMSIS_NVIC_VIRTUAL */ - -#ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE -#else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector -#endif /* (CMSIS_VECTAB_VIRTUAL) */ - -#define NVIC_USER_IRQ_OFFSET 16 - - -/* The following EXC_RETURN values are saved the LR on exception entry */ -#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ -#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ -#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M3 does not require the architectural barrier */ -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - return 0U; /* No FPU */ -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC300_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/core_starmc1.h b/software/bootloader/Drivers/CMSIS/Include/core_starmc1.h deleted file mode 100644 index d86c8d3..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/core_starmc1.h +++ /dev/null @@ -1,3592 +0,0 @@ -/**************************************************************************//** - * @file core_starmc1.h - * @brief CMSIS ArmChina STAR-MC1 Core Peripheral Access Layer Header File - * @version V1.0.2 - * @date 07. April 2022 - ******************************************************************************/ -/* - * Copyright (c) 2009-2018 Arm Limited. - * Copyright (c) 2018-2022 Arm China. - * All rights reserved. - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_STAR_H_GENERIC -#define __CORE_STAR_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup STAR-MC1 - @{ - */ - -#include "cmsis_version.h" - -/* Macro Define for STAR-MC1 */ -#define __STAR_MC (1U) /*!< STAR-MC Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined (__TARGET_FPU_VFP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined (__ARM_FP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined (__ARMVFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined (__TI_VFP_SUPPORT__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined (__FPU_VFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_STAR_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_STAR_H_DEPENDANT -#define __CORE_STAR_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __STAR_REV - #define __STAR_REV 0x0000U - #warning "__STAR_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DTCM_PRESENT - #define __DTCM_PRESENT 0U - #warning "__DTCM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - 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 */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group STAR-MC1 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for STAR-MC1 processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[1U]; - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED_ADD1[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: F00-D00=0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ -} SCB_Type; - -typedef struct -{ - __IOM uint32_t CACR; /*!< Offset: 0x0 (R/W) L1 Cache Control Register */ - __IOM uint32_t ITCMCR; /*!< Offset: 0x10 (R/W) Instruction Tightly-Coupled Memory Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x14 (R/W) Data Tightly-Coupled Memory Control Registers */ -}EMSS_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -#define SCB_CLIDR_IC_Pos 0U /*!< SCB CLIDR: IC Position */ -#define SCB_CLIDR_IC_Msk (1UL << SCB_CLIDR_IC_Pos) /*!< SCB CLIDR: IC Mask */ - -#define SCB_CLIDR_DC_Pos 1U /*!< SCB CLIDR: DC Position */ -#define SCB_CLIDR_DC_Msk (1UL << SCB_CLIDR_DC_Pos) /*!< SCB CLIDR: DC Mask */ - - - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache line Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_LEVEL_Pos 1U /*!< SCB DCISW: Level Position */ -#define SCB_DCISW_LEVEL_Msk (7UL << SCB_DCISW_LEVEL_Pos) /*!< SCB DCISW: Level Mask */ - -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0xFFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean line by Set-way Register Definitions */ -#define SCB_DCCSW_LEVEL_Pos 1U /*!< SCB DCCSW: Level Position */ -#define SCB_DCCSW_LEVEL_Msk (7UL << SCB_DCCSW_LEVEL_Pos) /*!< SCB DCCSW: Level Mask */ - -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0xFFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_LEVEL_Pos 1U /*!< SCB DCCISW: Level Position */ -#define SCB_DCCISW_LEVEL_Msk (7UL << SCB_DCCISW_LEVEL_Pos) /*!< SCB DCCISW: Level Mask */ - -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0xFFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/* ArmChina: Implementation Defined */ -/* Instruction Tightly-Coupled Memory Control Register Definitions */ -#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ -#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ - -#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ -#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ - -/* Data Tightly-Coupled Memory Control Register Definitions */ -#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ -#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ - -#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ -#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ - -/* L1 Cache Control Register Definitions */ -#define SCB_CACR_DCCLEAN_Pos 16U /*!< SCB CACR: DCCLEAN Position */ -#define SCB_CACR_DCCLEAN_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: DCCLEAN Mask */ - -#define SCB_CACR_ICACTIVE_Pos 13U /*!< SCB CACR: ICACTIVE Position */ -#define SCB_CACR_ICACTIVE_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: ICACTIVE Mask */ - -#define SCB_CACR_DCACTIVE_Pos 12U /*!< SCB CACR: DCACTIVE Position */ -#define SCB_CACR_DCACTIVE_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: DCACTIVE Mask */ - -#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ -#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ - __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ - __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration Test FIFO Test Data 0 Register Definitions */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ -#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ -#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ -#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ - -/* TPI Integration Test ATB Control Register 2 Register Definitions */ -#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ -#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ - -#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ -#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ - -#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ -#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ - -#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ -#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ - -/* TPI Integration Test FIFO Test Data 1 Register Definitions */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ -#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ -#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ -#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ - -/* TPI Integration Test ATB Control Register 0 Definitions */ -#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ -#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ - -#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ -#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ - -#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ -#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ - -#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ -#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - - - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. This parameter is interpreted as an uint32_t type. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Core Hardware */ - #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ - #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define EMSS_BASE (0xE001E000UL) /*!AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt - \details Enables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \brief Get Interrupt Enable status - \details Returns a device specific interrupt enable status from the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt - \details Disables a device specific interrupt in the NVIC interrupt controller. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } -} - - -/** - \brief Get Pending Interrupt - \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of a device specific interrupt in the NVIC pending register. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \brief Set Interrupt Priority - \details Sets the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every processor exception. - */ -__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of a device specific interrupt or a processor exception. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief Set Interrupt Vector - \details Sets an interrupt vector in SRAM based interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - VTOR must been relocated to SRAM before. - \param [in] IRQn Interrupt number - \param [in] vector Address of interrupt handler function - */ -__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \brief Get Interrupt Vector - \details Reads an interrupt vector from interrupt vector table. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Address of interrupt handler function - */ -__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) -{ - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses including - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/** - \brief Software Reset - \details Initiates a system reset request to reset the CPU. - */ -__NO_RETURN __STATIC_INLINE void __SW_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses including - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_BFHFNMINS_Msk) | /* Keep BFHFNMINS unchanged. Use this Reset function in case your case need to keep it */ - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | /* Keep priority group unchanged */ - SCB_AIRCR_SYSRESETREQ_Msk ); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt is not enabled. - \return 1 Interrupt is enabled. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - \note The priority cannot be set for every non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - The interrupt number can be positive to specify a device specific interrupt, - or negative to specify a processor exception. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) - -/* ########################## Cache functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_CacheFunctions Cache Functions - \brief Functions that configure Instruction and Data cache. - @{ - */ - -/* Cache Size ID Register Macros */ -#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) -#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) - -#define __SCB_DCACHE_LINE_SIZE 32U /*!< STAR-MC1 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ -#define __SCB_ICACHE_LINE_SIZE 32U /*!< STAR-MC1 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ - -/** - \brief Enable I-Cache - \details Turns on I-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */ - - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable I-Cache - \details Turns off I-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate I-Cache - \details Invalidates I-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; - __DSB(); - __ISB(); - #endif -} - - -/** - \brief I-Cache Invalidate by address - \details Invalidates I-Cache for the given address. - I-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - I-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] isize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateICache_by_Addr (void *addr, int32_t isize) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if ( isize > 0 ) { - int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_ICACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->ICIMVAU = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_ICACHE_LINE_SIZE; - op_size -= __SCB_ICACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief Enable D-Cache - \details Turns on D-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */ - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - __DSB(); - - SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable D-Cache - \details Turns off D-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate D-Cache - \details Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean D-Cache - \details Cleans D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | - ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean & Invalidate D-Cache - \details Cleans and Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief D-Cache Invalidate by address - \details Invalidates D-Cache for the given address. - D-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateDCache_by_Addr (void *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean by address - \details Cleans D-Cache for the given address - D-Cache is cleaned starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean and Invalidate by address - \details Cleans and invalidates D_Cache for the given address - D-Cache is cleaned and invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned and invalidated. - \param[in] addr address (aligned to 32-byte boundary) - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - -/*@} end of CMSIS_Core_CacheFunctions */ -#endif - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_STAR_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/software/bootloader/Drivers/CMSIS/Include/mpu_armv7.h b/software/bootloader/Drivers/CMSIS/Include/mpu_armv7.h deleted file mode 100644 index d9eedf8..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/mpu_armv7.h +++ /dev/null @@ -1,275 +0,0 @@ -/****************************************************************************** - * @file mpu_armv7.h - * @brief CMSIS MPU API for Armv7-M MPU - * @version V5.1.2 - * @date 25. May 2020 - ******************************************************************************/ -/* - * Copyright (c) 2017-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef ARM_MPU_ARMV7_H -#define ARM_MPU_ARMV7_H - -#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes -#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes -#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes -#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes -#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes -#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte -#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes -#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes -#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes -#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes -#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes -#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes -#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes -#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes -#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes -#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte -#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes -#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes -#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes -#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes -#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes -#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes -#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes -#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes -#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes -#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte -#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes -#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes - -#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access -#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only -#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only -#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access -#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only -#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access - -/** MPU Region Base Address Register Value -* -* \param Region The region to be configured, number 0 to 15. -* \param BaseAddress The base address for the region. -*/ -#define ARM_MPU_RBAR(Region, BaseAddress) \ - (((BaseAddress) & MPU_RBAR_ADDR_Msk) | \ - ((Region) & MPU_RBAR_REGION_Msk) | \ - (MPU_RBAR_VALID_Msk)) - -/** -* MPU Memory Access Attributes -* -* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. -* \param IsShareable Region is shareable between multiple bus masters. -* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. -* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. -*/ -#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \ - ((((TypeExtField) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ - (((IsShareable) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ - (((IsCacheable) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ - (((IsBufferable) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk)) - -/** -* MPU Region Attribute and Size Register Value -* -* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. -* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. -* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_. -* \param SubRegionDisable Sub-region disable field. -* \param Size Region size of the region to be configured, for example 4K, 8K. -*/ -#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \ - ((((DisableExec) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ - (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ - (((AccessAttributes) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) | \ - (((SubRegionDisable) << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \ - (((Size) << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \ - (((MPU_RASR_ENABLE_Msk)))) - -/** -* MPU Region Attribute and Size Register Value -* -* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. -* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. -* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. -* \param IsShareable Region is shareable between multiple bus masters. -* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. -* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. -* \param SubRegionDisable Sub-region disable field. -* \param Size Region size of the region to be configured, for example 4K, 8K. -*/ -#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ - ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size) - -/** -* MPU Memory Access Attribute for strongly ordered memory. -* - TEX: 000b -* - Shareable -* - Non-cacheable -* - Non-bufferable -*/ -#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U) - -/** -* MPU Memory Access Attribute for device memory. -* - TEX: 000b (if shareable) or 010b (if non-shareable) -* - Shareable or non-shareable -* - Non-cacheable -* - Bufferable (if shareable) or non-bufferable (if non-shareable) -* -* \param IsShareable Configures the device memory as shareable or non-shareable. -*/ -#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U)) - -/** -* MPU Memory Access Attribute for normal memory. -* - TEX: 1BBb (reflecting outer cacheability rules) -* - Shareable or non-shareable -* - Cacheable or non-cacheable (reflecting inner cacheability rules) -* - Bufferable or non-bufferable (reflecting inner cacheability rules) -* -* \param OuterCp Configures the outer cache policy. -* \param InnerCp Configures the inner cache policy. -* \param IsShareable Configures the memory as shareable or non-shareable. -*/ -#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) >> 1U), ((InnerCp) & 1U)) - -/** -* MPU Memory Access Attribute non-cacheable policy. -*/ -#define ARM_MPU_CACHEP_NOCACHE 0U - -/** -* MPU Memory Access Attribute write-back, write and read allocate policy. -*/ -#define ARM_MPU_CACHEP_WB_WRA 1U - -/** -* MPU Memory Access Attribute write-through, no write allocate policy. -*/ -#define ARM_MPU_CACHEP_WT_NWA 2U - -/** -* MPU Memory Access Attribute write-back, no write allocate policy. -*/ -#define ARM_MPU_CACHEP_WB_NWA 3U - - -/** -* Struct for a single MPU Region -*/ -typedef struct { - uint32_t RBAR; //!< The region base address register value (RBAR) - uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR -} ARM_MPU_Region_t; - -/** Enable the MPU. -* \param MPU_Control Default access permissions for unconfigured regions. -*/ -__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) -{ - __DMB(); - MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; -#endif - __DSB(); - __ISB(); -} - -/** Disable the MPU. -*/ -__STATIC_INLINE void ARM_MPU_Disable(void) -{ - __DMB(); -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; -#endif - MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; - __DSB(); - __ISB(); -} - -/** Clear and disable the given MPU region. -* \param rnr Region number to be cleared. -*/ -__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) -{ - MPU->RNR = rnr; - MPU->RASR = 0U; -} - -/** Configure an MPU region. -* \param rbar Value for RBAR register. -* \param rasr Value for RASR register. -*/ -__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) -{ - MPU->RBAR = rbar; - MPU->RASR = rasr; -} - -/** Configure the given MPU region. -* \param rnr Region number to be configured. -* \param rbar Value for RBAR register. -* \param rasr Value for RASR register. -*/ -__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) -{ - MPU->RNR = rnr; - MPU->RBAR = rbar; - MPU->RASR = rasr; -} - -/** Memcpy with strictly ordered memory access, e.g. used by code in ARM_MPU_Load(). -* \param dst Destination data is copied to. -* \param src Source data is copied from. -* \param len Amount of data words to be copied. -*/ -__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) -{ - uint32_t i; - for (i = 0U; i < len; ++i) - { - dst[i] = src[i]; - } -} - -/** Load the given number of MPU regions from a table. -* \param table Pointer to the MPU configuration table. -* \param cnt Amount of regions to be configured. -*/ -__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) -{ - const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; - while (cnt > MPU_TYPE_RALIASES) { - ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); - table += MPU_TYPE_RALIASES; - cnt -= MPU_TYPE_RALIASES; - } - ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); -} - -#endif diff --git a/software/bootloader/Drivers/CMSIS/Include/mpu_armv8.h b/software/bootloader/Drivers/CMSIS/Include/mpu_armv8.h deleted file mode 100644 index 3de16ef..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/mpu_armv8.h +++ /dev/null @@ -1,352 +0,0 @@ -/****************************************************************************** - * @file mpu_armv8.h - * @brief CMSIS MPU API for Armv8-M and Armv8.1-M MPU - * @version V5.1.3 - * @date 03. February 2021 - ******************************************************************************/ -/* - * Copyright (c) 2017-2021 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef ARM_MPU_ARMV8_H -#define ARM_MPU_ARMV8_H - -/** \brief Attribute for device memory (outer only) */ -#define ARM_MPU_ATTR_DEVICE ( 0U ) - -/** \brief Attribute for non-cacheable, normal memory */ -#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U ) - -/** \brief Attribute for normal memory (outer and inner) -* \param NT Non-Transient: Set to 1 for non-transient data. -* \param WB Write-Back: Set to 1 to use write-back update policy. -* \param RA Read Allocation: Set to 1 to use cache allocation on read miss. -* \param WA Write Allocation: Set to 1 to use cache allocation on write miss. -*/ -#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ - ((((NT) & 1U) << 3U) | (((WB) & 1U) << 2U) | (((RA) & 1U) << 1U) | ((WA) & 1U)) - -/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ -#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) - -/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ -#define ARM_MPU_ATTR_DEVICE_nGnRE (1U) - -/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ -#define ARM_MPU_ATTR_DEVICE_nGRE (2U) - -/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ -#define ARM_MPU_ATTR_DEVICE_GRE (3U) - -/** \brief Memory Attribute -* \param O Outer memory attributes -* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes -*/ -#define ARM_MPU_ATTR(O, I) ((((O) & 0xFU) << 4U) | ((((O) & 0xFU) != 0U) ? ((I) & 0xFU) : (((I) & 0x3U) << 2U))) - -/** \brief Normal memory non-shareable */ -#define ARM_MPU_SH_NON (0U) - -/** \brief Normal memory outer shareable */ -#define ARM_MPU_SH_OUTER (2U) - -/** \brief Normal memory inner shareable */ -#define ARM_MPU_SH_INNER (3U) - -/** \brief Memory access permissions -* \param RO Read-Only: Set to 1 for read-only memory. -* \param NP Non-Privileged: Set to 1 for non-privileged memory. -*/ -#define ARM_MPU_AP_(RO, NP) ((((RO) & 1U) << 1U) | ((NP) & 1U)) - -/** \brief Region Base Address Register value -* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. -* \param SH Defines the Shareability domain for this memory region. -* \param RO Read-Only: Set to 1 for a read-only memory region. -* \param NP Non-Privileged: Set to 1 for a non-privileged memory region. -* \oaram XN eXecute Never: Set to 1 for a non-executable memory region. -*/ -#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ - (((BASE) & MPU_RBAR_BASE_Msk) | \ - (((SH) << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ - ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ - (((XN) << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) - -/** \brief Region Limit Address Register value -* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. -* \param IDX The attribute index to be associated with this memory region. -*/ -#define ARM_MPU_RLAR(LIMIT, IDX) \ - (((LIMIT) & MPU_RLAR_LIMIT_Msk) | \ - (((IDX) << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ - (MPU_RLAR_EN_Msk)) - -#if defined(MPU_RLAR_PXN_Pos) - -/** \brief Region Limit Address Register with PXN value -* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. -* \param PXN Privileged execute never. Defines whether code can be executed from this privileged region. -* \param IDX The attribute index to be associated with this memory region. -*/ -#define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX) \ - (((LIMIT) & MPU_RLAR_LIMIT_Msk) | \ - (((PXN) << MPU_RLAR_PXN_Pos) & MPU_RLAR_PXN_Msk) | \ - (((IDX) << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ - (MPU_RLAR_EN_Msk)) - -#endif - -/** -* Struct for a single MPU Region -*/ -typedef struct { - uint32_t RBAR; /*!< Region Base Address Register value */ - uint32_t RLAR; /*!< Region Limit Address Register value */ -} ARM_MPU_Region_t; - -/** Enable the MPU. -* \param MPU_Control Default access permissions for unconfigured regions. -*/ -__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) -{ - __DMB(); - MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; -#endif - __DSB(); - __ISB(); -} - -/** Disable the MPU. -*/ -__STATIC_INLINE void ARM_MPU_Disable(void) -{ - __DMB(); -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; -#endif - MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; - __DSB(); - __ISB(); -} - -#ifdef MPU_NS -/** Enable the Non-secure MPU. -* \param MPU_Control Default access permissions for unconfigured regions. -*/ -__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) -{ - __DMB(); - MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; -#endif - __DSB(); - __ISB(); -} - -/** Disable the Non-secure MPU. -*/ -__STATIC_INLINE void ARM_MPU_Disable_NS(void) -{ - __DMB(); -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; -#endif - MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk; - __DSB(); - __ISB(); -} -#endif - -/** Set the memory attribute encoding to the given MPU. -* \param mpu Pointer to the MPU to be configured. -* \param idx The attribute index to be set [0-7] -* \param attr The attribute value to be set. -*/ -__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) -{ - const uint8_t reg = idx / 4U; - const uint32_t pos = ((idx % 4U) * 8U); - const uint32_t mask = 0xFFU << pos; - - if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { - return; // invalid index - } - - mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); -} - -/** Set the memory attribute encoding. -* \param idx The attribute index to be set [0-7] -* \param attr The attribute value to be set. -*/ -__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) -{ - ARM_MPU_SetMemAttrEx(MPU, idx, attr); -} - -#ifdef MPU_NS -/** Set the memory attribute encoding to the Non-secure MPU. -* \param idx The attribute index to be set [0-7] -* \param attr The attribute value to be set. -*/ -__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) -{ - ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); -} -#endif - -/** Clear and disable the given MPU region of the given MPU. -* \param mpu Pointer to MPU to be used. -* \param rnr Region number to be cleared. -*/ -__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) -{ - mpu->RNR = rnr; - mpu->RLAR = 0U; -} - -/** Clear and disable the given MPU region. -* \param rnr Region number to be cleared. -*/ -__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) -{ - ARM_MPU_ClrRegionEx(MPU, rnr); -} - -#ifdef MPU_NS -/** Clear and disable the given Non-secure MPU region. -* \param rnr Region number to be cleared. -*/ -__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) -{ - ARM_MPU_ClrRegionEx(MPU_NS, rnr); -} -#endif - -/** Configure the given MPU region of the given MPU. -* \param mpu Pointer to MPU to be used. -* \param rnr Region number to be configured. -* \param rbar Value for RBAR register. -* \param rlar Value for RLAR register. -*/ -__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) -{ - mpu->RNR = rnr; - mpu->RBAR = rbar; - mpu->RLAR = rlar; -} - -/** Configure the given MPU region. -* \param rnr Region number to be configured. -* \param rbar Value for RBAR register. -* \param rlar Value for RLAR register. -*/ -__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) -{ - ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); -} - -#ifdef MPU_NS -/** Configure the given Non-secure MPU region. -* \param rnr Region number to be configured. -* \param rbar Value for RBAR register. -* \param rlar Value for RLAR register. -*/ -__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) -{ - ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar); -} -#endif - -/** Memcpy with strictly ordered memory access, e.g. used by code in ARM_MPU_LoadEx() -* \param dst Destination data is copied to. -* \param src Source data is copied from. -* \param len Amount of data words to be copied. -*/ -__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) -{ - uint32_t i; - for (i = 0U; i < len; ++i) - { - dst[i] = src[i]; - } -} - -/** Load the given number of MPU regions from a table to the given MPU. -* \param mpu Pointer to the MPU registers to be used. -* \param rnr First region number to be configured. -* \param table Pointer to the MPU configuration table. -* \param cnt Amount of regions to be configured. -*/ -__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) -{ - const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; - if (cnt == 1U) { - mpu->RNR = rnr; - ARM_MPU_OrderedMemcpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); - } else { - uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U); - uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; - - mpu->RNR = rnrBase; - while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { - uint32_t c = MPU_TYPE_RALIASES - rnrOffset; - ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); - table += c; - cnt -= c; - rnrOffset = 0U; - rnrBase += MPU_TYPE_RALIASES; - mpu->RNR = rnrBase; - } - - ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); - } -} - -/** Load the given number of MPU regions from a table. -* \param rnr First region number to be configured. -* \param table Pointer to the MPU configuration table. -* \param cnt Amount of regions to be configured. -*/ -__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) -{ - ARM_MPU_LoadEx(MPU, rnr, table, cnt); -} - -#ifdef MPU_NS -/** Load the given number of MPU regions from a table to the Non-secure MPU. -* \param rnr First region number to be configured. -* \param table Pointer to the MPU configuration table. -* \param cnt Amount of regions to be configured. -*/ -__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) -{ - ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); -} -#endif - -#endif - diff --git a/software/bootloader/Drivers/CMSIS/Include/pac_armv81.h b/software/bootloader/Drivers/CMSIS/Include/pac_armv81.h deleted file mode 100644 index 854b60a..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/pac_armv81.h +++ /dev/null @@ -1,206 +0,0 @@ -/****************************************************************************** - * @file pac_armv81.h - * @brief CMSIS PAC key functions for Armv8.1-M PAC extension - * @version V1.0.0 - * @date 23. March 2022 - ******************************************************************************/ -/* - * Copyright (c) 2022 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef PAC_ARMV81_H -#define PAC_ARMV81_H - - -/* ################### PAC Key functions ########################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_PacKeyFunctions PAC Key functions - \brief Functions that access the PAC keys. - @{ - */ - -#if (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) - -/** - \brief read the PAC key used for privileged mode - \details Reads the PAC key stored in the PAC_KEY_P registers. - \param [out] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __get_PAC_KEY_P (uint32_t* pPacKey) { - __ASM volatile ( - "mrs r1, pac_key_p_0\n" - "str r1,[%0,#0]\n" - "mrs r1, pac_key_p_1\n" - "str r1,[%0,#4]\n" - "mrs r1, pac_key_p_2\n" - "str r1,[%0,#8]\n" - "mrs r1, pac_key_p_3\n" - "str r1,[%0,#12]\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief write the PAC key used for privileged mode - \details writes the given PAC key to the PAC_KEY_P registers. - \param [in] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __set_PAC_KEY_P (uint32_t* pPacKey) { - __ASM volatile ( - "ldr r1,[%0,#0]\n" - "msr pac_key_p_0, r1\n" - "ldr r1,[%0,#4]\n" - "msr pac_key_p_1, r1\n" - "ldr r1,[%0,#8]\n" - "msr pac_key_p_2, r1\n" - "ldr r1,[%0,#12]\n" - "msr pac_key_p_3, r1\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief read the PAC key used for unprivileged mode - \details Reads the PAC key stored in the PAC_KEY_U registers. - \param [out] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __get_PAC_KEY_U (uint32_t* pPacKey) { - __ASM volatile ( - "mrs r1, pac_key_u_0\n" - "str r1,[%0,#0]\n" - "mrs r1, pac_key_u_1\n" - "str r1,[%0,#4]\n" - "mrs r1, pac_key_u_2\n" - "str r1,[%0,#8]\n" - "mrs r1, pac_key_u_3\n" - "str r1,[%0,#12]\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief write the PAC key used for unprivileged mode - \details writes the given PAC key to the PAC_KEY_U registers. - \param [in] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __set_PAC_KEY_U (uint32_t* pPacKey) { - __ASM volatile ( - "ldr r1,[%0,#0]\n" - "msr pac_key_u_0, r1\n" - "ldr r1,[%0,#4]\n" - "msr pac_key_u_1, r1\n" - "ldr r1,[%0,#8]\n" - "msr pac_key_u_2, r1\n" - "ldr r1,[%0,#12]\n" - "msr pac_key_u_3, r1\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) - -/** - \brief read the PAC key used for privileged mode (non-secure) - \details Reads the PAC key stored in the non-secure PAC_KEY_P registers when in secure mode. - \param [out] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __TZ_get_PAC_KEY_P_NS (uint32_t* pPacKey) { - __ASM volatile ( - "mrs r1, pac_key_p_0_ns\n" - "str r1,[%0,#0]\n" - "mrs r1, pac_key_p_1_ns\n" - "str r1,[%0,#4]\n" - "mrs r1, pac_key_p_2_ns\n" - "str r1,[%0,#8]\n" - "mrs r1, pac_key_p_3_ns\n" - "str r1,[%0,#12]\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief write the PAC key used for privileged mode (non-secure) - \details writes the given PAC key to the non-secure PAC_KEY_P registers when in secure mode. - \param [in] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __TZ_set_PAC_KEY_P_NS (uint32_t* pPacKey) { - __ASM volatile ( - "ldr r1,[%0,#0]\n" - "msr pac_key_p_0_ns, r1\n" - "ldr r1,[%0,#4]\n" - "msr pac_key_p_1_ns, r1\n" - "ldr r1,[%0,#8]\n" - "msr pac_key_p_2_ns, r1\n" - "ldr r1,[%0,#12]\n" - "msr pac_key_p_3_ns, r1\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief read the PAC key used for unprivileged mode (non-secure) - \details Reads the PAC key stored in the non-secure PAC_KEY_U registers when in secure mode. - \param [out] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __TZ_get_PAC_KEY_U_NS (uint32_t* pPacKey) { - __ASM volatile ( - "mrs r1, pac_key_u_0_ns\n" - "str r1,[%0,#0]\n" - "mrs r1, pac_key_u_1_ns\n" - "str r1,[%0,#4]\n" - "mrs r1, pac_key_u_2_ns\n" - "str r1,[%0,#8]\n" - "mrs r1, pac_key_u_3_ns\n" - "str r1,[%0,#12]\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief write the PAC key used for unprivileged mode (non-secure) - \details writes the given PAC key to the non-secure PAC_KEY_U registers when in secure mode. - \param [in] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __TZ_set_PAC_KEY_U_NS (uint32_t* pPacKey) { - __ASM volatile ( - "ldr r1,[%0,#0]\n" - "msr pac_key_u_0_ns, r1\n" - "ldr r1,[%0,#4]\n" - "msr pac_key_u_1_ns, r1\n" - "ldr r1,[%0,#8]\n" - "msr pac_key_u_2_ns, r1\n" - "ldr r1,[%0,#12]\n" - "msr pac_key_u_3_ns, r1\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -#endif /* (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) */ - -#endif /* (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) */ - -/*@} end of CMSIS_Core_PacKeyFunctions */ - - -#endif /* PAC_ARMV81_H */ diff --git a/software/bootloader/Drivers/CMSIS/Include/pmu_armv8.h b/software/bootloader/Drivers/CMSIS/Include/pmu_armv8.h deleted file mode 100644 index f8f3d89..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/pmu_armv8.h +++ /dev/null @@ -1,337 +0,0 @@ -/****************************************************************************** - * @file pmu_armv8.h - * @brief CMSIS PMU API for Armv8.1-M PMU - * @version V1.0.1 - * @date 15. April 2020 - ******************************************************************************/ -/* - * Copyright (c) 2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef ARM_PMU_ARMV8_H -#define ARM_PMU_ARMV8_H - -/** - * \brief PMU Events - * \note See the Armv8.1-M Architecture Reference Manual for full details on these PMU events. - * */ - -#define ARM_PMU_SW_INCR 0x0000 /*!< Software update to the PMU_SWINC register, architecturally executed and condition code check pass */ -#define ARM_PMU_L1I_CACHE_REFILL 0x0001 /*!< L1 I-Cache refill */ -#define ARM_PMU_L1D_CACHE_REFILL 0x0003 /*!< L1 D-Cache refill */ -#define ARM_PMU_L1D_CACHE 0x0004 /*!< L1 D-Cache access */ -#define ARM_PMU_LD_RETIRED 0x0006 /*!< Memory-reading instruction architecturally executed and condition code check pass */ -#define ARM_PMU_ST_RETIRED 0x0007 /*!< Memory-writing instruction architecturally executed and condition code check pass */ -#define ARM_PMU_INST_RETIRED 0x0008 /*!< Instruction architecturally executed */ -#define ARM_PMU_EXC_TAKEN 0x0009 /*!< Exception entry */ -#define ARM_PMU_EXC_RETURN 0x000A /*!< Exception return instruction architecturally executed and the condition code check pass */ -#define ARM_PMU_PC_WRITE_RETIRED 0x000C /*!< Software change to the Program Counter (PC). Instruction is architecturally executed and condition code check pass */ -#define ARM_PMU_BR_IMMED_RETIRED 0x000D /*!< Immediate branch architecturally executed */ -#define ARM_PMU_BR_RETURN_RETIRED 0x000E /*!< Function return instruction architecturally executed and the condition code check pass */ -#define ARM_PMU_UNALIGNED_LDST_RETIRED 0x000F /*!< Unaligned memory memory-reading or memory-writing instruction architecturally executed and condition code check pass */ -#define ARM_PMU_BR_MIS_PRED 0x0010 /*!< Mispredicted or not predicted branch speculatively executed */ -#define ARM_PMU_CPU_CYCLES 0x0011 /*!< Cycle */ -#define ARM_PMU_BR_PRED 0x0012 /*!< Predictable branch speculatively executed */ -#define ARM_PMU_MEM_ACCESS 0x0013 /*!< Data memory access */ -#define ARM_PMU_L1I_CACHE 0x0014 /*!< Level 1 instruction cache access */ -#define ARM_PMU_L1D_CACHE_WB 0x0015 /*!< Level 1 data cache write-back */ -#define ARM_PMU_L2D_CACHE 0x0016 /*!< Level 2 data cache access */ -#define ARM_PMU_L2D_CACHE_REFILL 0x0017 /*!< Level 2 data cache refill */ -#define ARM_PMU_L2D_CACHE_WB 0x0018 /*!< Level 2 data cache write-back */ -#define ARM_PMU_BUS_ACCESS 0x0019 /*!< Bus access */ -#define ARM_PMU_MEMORY_ERROR 0x001A /*!< Local memory error */ -#define ARM_PMU_INST_SPEC 0x001B /*!< Instruction speculatively executed */ -#define ARM_PMU_BUS_CYCLES 0x001D /*!< Bus cycles */ -#define ARM_PMU_CHAIN 0x001E /*!< For an odd numbered counter, increment when an overflow occurs on the preceding even-numbered counter on the same PE */ -#define ARM_PMU_L1D_CACHE_ALLOCATE 0x001F /*!< Level 1 data cache allocation without refill */ -#define ARM_PMU_L2D_CACHE_ALLOCATE 0x0020 /*!< Level 2 data cache allocation without refill */ -#define ARM_PMU_BR_RETIRED 0x0021 /*!< Branch instruction architecturally executed */ -#define ARM_PMU_BR_MIS_PRED_RETIRED 0x0022 /*!< Mispredicted branch instruction architecturally executed */ -#define ARM_PMU_STALL_FRONTEND 0x0023 /*!< No operation issued because of the frontend */ -#define ARM_PMU_STALL_BACKEND 0x0024 /*!< No operation issued because of the backend */ -#define ARM_PMU_L2I_CACHE 0x0027 /*!< Level 2 instruction cache access */ -#define ARM_PMU_L2I_CACHE_REFILL 0x0028 /*!< Level 2 instruction cache refill */ -#define ARM_PMU_L3D_CACHE_ALLOCATE 0x0029 /*!< Level 3 data cache allocation without refill */ -#define ARM_PMU_L3D_CACHE_REFILL 0x002A /*!< Level 3 data cache refill */ -#define ARM_PMU_L3D_CACHE 0x002B /*!< Level 3 data cache access */ -#define ARM_PMU_L3D_CACHE_WB 0x002C /*!< Level 3 data cache write-back */ -#define ARM_PMU_LL_CACHE_RD 0x0036 /*!< Last level data cache read */ -#define ARM_PMU_LL_CACHE_MISS_RD 0x0037 /*!< Last level data cache read miss */ -#define ARM_PMU_L1D_CACHE_MISS_RD 0x0039 /*!< Level 1 data cache read miss */ -#define ARM_PMU_OP_COMPLETE 0x003A /*!< Operation retired */ -#define ARM_PMU_OP_SPEC 0x003B /*!< Operation speculatively executed */ -#define ARM_PMU_STALL 0x003C /*!< Stall cycle for instruction or operation not sent for execution */ -#define ARM_PMU_STALL_OP_BACKEND 0x003D /*!< Stall cycle for instruction or operation not sent for execution due to pipeline backend */ -#define ARM_PMU_STALL_OP_FRONTEND 0x003E /*!< Stall cycle for instruction or operation not sent for execution due to pipeline frontend */ -#define ARM_PMU_STALL_OP 0x003F /*!< Instruction or operation slots not occupied each cycle */ -#define ARM_PMU_L1D_CACHE_RD 0x0040 /*!< Level 1 data cache read */ -#define ARM_PMU_LE_RETIRED 0x0100 /*!< Loop end instruction executed */ -#define ARM_PMU_LE_SPEC 0x0101 /*!< Loop end instruction speculatively executed */ -#define ARM_PMU_BF_RETIRED 0x0104 /*!< Branch future instruction architecturally executed and condition code check pass */ -#define ARM_PMU_BF_SPEC 0x0105 /*!< Branch future instruction speculatively executed and condition code check pass */ -#define ARM_PMU_LE_CANCEL 0x0108 /*!< Loop end instruction not taken */ -#define ARM_PMU_BF_CANCEL 0x0109 /*!< Branch future instruction not taken */ -#define ARM_PMU_SE_CALL_S 0x0114 /*!< Call to secure function, resulting in Security state change */ -#define ARM_PMU_SE_CALL_NS 0x0115 /*!< Call to non-secure function, resulting in Security state change */ -#define ARM_PMU_DWT_CMPMATCH0 0x0118 /*!< DWT comparator 0 match */ -#define ARM_PMU_DWT_CMPMATCH1 0x0119 /*!< DWT comparator 1 match */ -#define ARM_PMU_DWT_CMPMATCH2 0x011A /*!< DWT comparator 2 match */ -#define ARM_PMU_DWT_CMPMATCH3 0x011B /*!< DWT comparator 3 match */ -#define ARM_PMU_MVE_INST_RETIRED 0x0200 /*!< MVE instruction architecturally executed */ -#define ARM_PMU_MVE_INST_SPEC 0x0201 /*!< MVE instruction speculatively executed */ -#define ARM_PMU_MVE_FP_RETIRED 0x0204 /*!< MVE floating-point instruction architecturally executed */ -#define ARM_PMU_MVE_FP_SPEC 0x0205 /*!< MVE floating-point instruction speculatively executed */ -#define ARM_PMU_MVE_FP_HP_RETIRED 0x0208 /*!< MVE half-precision floating-point instruction architecturally executed */ -#define ARM_PMU_MVE_FP_HP_SPEC 0x0209 /*!< MVE half-precision floating-point instruction speculatively executed */ -#define ARM_PMU_MVE_FP_SP_RETIRED 0x020C /*!< MVE single-precision floating-point instruction architecturally executed */ -#define ARM_PMU_MVE_FP_SP_SPEC 0x020D /*!< MVE single-precision floating-point instruction speculatively executed */ -#define ARM_PMU_MVE_FP_MAC_RETIRED 0x0214 /*!< MVE floating-point multiply or multiply-accumulate instruction architecturally executed */ -#define ARM_PMU_MVE_FP_MAC_SPEC 0x0215 /*!< MVE floating-point multiply or multiply-accumulate instruction speculatively executed */ -#define ARM_PMU_MVE_INT_RETIRED 0x0224 /*!< MVE integer instruction architecturally executed */ -#define ARM_PMU_MVE_INT_SPEC 0x0225 /*!< MVE integer instruction speculatively executed */ -#define ARM_PMU_MVE_INT_MAC_RETIRED 0x0228 /*!< MVE multiply or multiply-accumulate instruction architecturally executed */ -#define ARM_PMU_MVE_INT_MAC_SPEC 0x0229 /*!< MVE multiply or multiply-accumulate instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_RETIRED 0x0238 /*!< MVE load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_SPEC 0x0239 /*!< MVE load or store instruction speculatively executed */ -#define ARM_PMU_MVE_LD_RETIRED 0x023C /*!< MVE load instruction architecturally executed */ -#define ARM_PMU_MVE_LD_SPEC 0x023D /*!< MVE load instruction speculatively executed */ -#define ARM_PMU_MVE_ST_RETIRED 0x0240 /*!< MVE store instruction architecturally executed */ -#define ARM_PMU_MVE_ST_SPEC 0x0241 /*!< MVE store instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_CONTIG_RETIRED 0x0244 /*!< MVE contiguous load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_CONTIG_SPEC 0x0245 /*!< MVE contiguous load or store instruction speculatively executed */ -#define ARM_PMU_MVE_LD_CONTIG_RETIRED 0x0248 /*!< MVE contiguous load instruction architecturally executed */ -#define ARM_PMU_MVE_LD_CONTIG_SPEC 0x0249 /*!< MVE contiguous load instruction speculatively executed */ -#define ARM_PMU_MVE_ST_CONTIG_RETIRED 0x024C /*!< MVE contiguous store instruction architecturally executed */ -#define ARM_PMU_MVE_ST_CONTIG_SPEC 0x024D /*!< MVE contiguous store instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_NONCONTIG_RETIRED 0x0250 /*!< MVE non-contiguous load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_NONCONTIG_SPEC 0x0251 /*!< MVE non-contiguous load or store instruction speculatively executed */ -#define ARM_PMU_MVE_LD_NONCONTIG_RETIRED 0x0254 /*!< MVE non-contiguous load instruction architecturally executed */ -#define ARM_PMU_MVE_LD_NONCONTIG_SPEC 0x0255 /*!< MVE non-contiguous load instruction speculatively executed */ -#define ARM_PMU_MVE_ST_NONCONTIG_RETIRED 0x0258 /*!< MVE non-contiguous store instruction architecturally executed */ -#define ARM_PMU_MVE_ST_NONCONTIG_SPEC 0x0259 /*!< MVE non-contiguous store instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_MULTI_RETIRED 0x025C /*!< MVE memory instruction targeting multiple registers architecturally executed */ -#define ARM_PMU_MVE_LDST_MULTI_SPEC 0x025D /*!< MVE memory instruction targeting multiple registers speculatively executed */ -#define ARM_PMU_MVE_LD_MULTI_RETIRED 0x0260 /*!< MVE memory load instruction targeting multiple registers architecturally executed */ -#define ARM_PMU_MVE_LD_MULTI_SPEC 0x0261 /*!< MVE memory load instruction targeting multiple registers speculatively executed */ -#define ARM_PMU_MVE_ST_MULTI_RETIRED 0x0261 /*!< MVE memory store instruction targeting multiple registers architecturally executed */ -#define ARM_PMU_MVE_ST_MULTI_SPEC 0x0265 /*!< MVE memory store instruction targeting multiple registers speculatively executed */ -#define ARM_PMU_MVE_LDST_UNALIGNED_RETIRED 0x028C /*!< MVE unaligned memory load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_UNALIGNED_SPEC 0x028D /*!< MVE unaligned memory load or store instruction speculatively executed */ -#define ARM_PMU_MVE_LD_UNALIGNED_RETIRED 0x0290 /*!< MVE unaligned load instruction architecturally executed */ -#define ARM_PMU_MVE_LD_UNALIGNED_SPEC 0x0291 /*!< MVE unaligned load instruction speculatively executed */ -#define ARM_PMU_MVE_ST_UNALIGNED_RETIRED 0x0294 /*!< MVE unaligned store instruction architecturally executed */ -#define ARM_PMU_MVE_ST_UNALIGNED_SPEC 0x0295 /*!< MVE unaligned store instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_UNALIGNED_NONCONTIG_RETIRED 0x0298 /*!< MVE unaligned noncontiguous load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_UNALIGNED_NONCONTIG_SPEC 0x0299 /*!< MVE unaligned noncontiguous load or store instruction speculatively executed */ -#define ARM_PMU_MVE_VREDUCE_RETIRED 0x02A0 /*!< MVE vector reduction instruction architecturally executed */ -#define ARM_PMU_MVE_VREDUCE_SPEC 0x02A1 /*!< MVE vector reduction instruction speculatively executed */ -#define ARM_PMU_MVE_VREDUCE_FP_RETIRED 0x02A4 /*!< MVE floating-point vector reduction instruction architecturally executed */ -#define ARM_PMU_MVE_VREDUCE_FP_SPEC 0x02A5 /*!< MVE floating-point vector reduction instruction speculatively executed */ -#define ARM_PMU_MVE_VREDUCE_INT_RETIRED 0x02A8 /*!< MVE integer vector reduction instruction architecturally executed */ -#define ARM_PMU_MVE_VREDUCE_INT_SPEC 0x02A9 /*!< MVE integer vector reduction instruction speculatively executed */ -#define ARM_PMU_MVE_PRED 0x02B8 /*!< Cycles where one or more predicated beats architecturally executed */ -#define ARM_PMU_MVE_STALL 0x02CC /*!< Stall cycles caused by an MVE instruction */ -#define ARM_PMU_MVE_STALL_RESOURCE 0x02CD /*!< Stall cycles caused by an MVE instruction because of resource conflicts */ -#define ARM_PMU_MVE_STALL_RESOURCE_MEM 0x02CE /*!< Stall cycles caused by an MVE instruction because of memory resource conflicts */ -#define ARM_PMU_MVE_STALL_RESOURCE_FP 0x02CF /*!< Stall cycles caused by an MVE instruction because of floating-point resource conflicts */ -#define ARM_PMU_MVE_STALL_RESOURCE_INT 0x02D0 /*!< Stall cycles caused by an MVE instruction because of integer resource conflicts */ -#define ARM_PMU_MVE_STALL_BREAK 0x02D3 /*!< Stall cycles caused by an MVE chain break */ -#define ARM_PMU_MVE_STALL_DEPENDENCY 0x02D4 /*!< Stall cycles caused by MVE register dependency */ -#define ARM_PMU_ITCM_ACCESS 0x4007 /*!< Instruction TCM access */ -#define ARM_PMU_DTCM_ACCESS 0x4008 /*!< Data TCM access */ -#define ARM_PMU_TRCEXTOUT0 0x4010 /*!< ETM external output 0 */ -#define ARM_PMU_TRCEXTOUT1 0x4011 /*!< ETM external output 1 */ -#define ARM_PMU_TRCEXTOUT2 0x4012 /*!< ETM external output 2 */ -#define ARM_PMU_TRCEXTOUT3 0x4013 /*!< ETM external output 3 */ -#define ARM_PMU_CTI_TRIGOUT4 0x4018 /*!< Cross-trigger Interface output trigger 4 */ -#define ARM_PMU_CTI_TRIGOUT5 0x4019 /*!< Cross-trigger Interface output trigger 5 */ -#define ARM_PMU_CTI_TRIGOUT6 0x401A /*!< Cross-trigger Interface output trigger 6 */ -#define ARM_PMU_CTI_TRIGOUT7 0x401B /*!< Cross-trigger Interface output trigger 7 */ - -/** \brief PMU Functions */ - -__STATIC_INLINE void ARM_PMU_Enable(void); -__STATIC_INLINE void ARM_PMU_Disable(void); - -__STATIC_INLINE void ARM_PMU_Set_EVTYPER(uint32_t num, uint32_t type); - -__STATIC_INLINE void ARM_PMU_CYCCNT_Reset(void); -__STATIC_INLINE void ARM_PMU_EVCNTR_ALL_Reset(void); - -__STATIC_INLINE void ARM_PMU_CNTR_Enable(uint32_t mask); -__STATIC_INLINE void ARM_PMU_CNTR_Disable(uint32_t mask); - -__STATIC_INLINE uint32_t ARM_PMU_Get_CCNTR(void); -__STATIC_INLINE uint32_t ARM_PMU_Get_EVCNTR(uint32_t num); - -__STATIC_INLINE uint32_t ARM_PMU_Get_CNTR_OVS(void); -__STATIC_INLINE void ARM_PMU_Set_CNTR_OVS(uint32_t mask); - -__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Enable(uint32_t mask); -__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Disable(uint32_t mask); - -__STATIC_INLINE void ARM_PMU_CNTR_Increment(uint32_t mask); - -/** - \brief Enable the PMU -*/ -__STATIC_INLINE void ARM_PMU_Enable(void) -{ - PMU->CTRL |= PMU_CTRL_ENABLE_Msk; -} - -/** - \brief Disable the PMU -*/ -__STATIC_INLINE void ARM_PMU_Disable(void) -{ - PMU->CTRL &= ~PMU_CTRL_ENABLE_Msk; -} - -/** - \brief Set event to count for PMU eventer counter - \param [in] num Event counter (0-30) to configure - \param [in] type Event to count -*/ -__STATIC_INLINE void ARM_PMU_Set_EVTYPER(uint32_t num, uint32_t type) -{ - PMU->EVTYPER[num] = type; -} - -/** - \brief Reset cycle counter -*/ -__STATIC_INLINE void ARM_PMU_CYCCNT_Reset(void) -{ - PMU->CTRL |= PMU_CTRL_CYCCNT_RESET_Msk; -} - -/** - \brief Reset all event counters -*/ -__STATIC_INLINE void ARM_PMU_EVCNTR_ALL_Reset(void) -{ - PMU->CTRL |= PMU_CTRL_EVENTCNT_RESET_Msk; -} - -/** - \brief Enable counters - \param [in] mask Counters to enable - \note Enables one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_CNTR_Enable(uint32_t mask) -{ - PMU->CNTENSET = mask; -} - -/** - \brief Disable counters - \param [in] mask Counters to enable - \note Disables one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_CNTR_Disable(uint32_t mask) -{ - PMU->CNTENCLR = mask; -} - -/** - \brief Read cycle counter - \return Cycle count -*/ -__STATIC_INLINE uint32_t ARM_PMU_Get_CCNTR(void) -{ - return PMU->CCNTR; -} - -/** - \brief Read event counter - \param [in] num Event counter (0-30) to read - \return Event count -*/ -__STATIC_INLINE uint32_t ARM_PMU_Get_EVCNTR(uint32_t num) -{ - return PMU_EVCNTR_CNT_Msk & PMU->EVCNTR[num]; -} - -/** - \brief Read counter overflow status - \return Counter overflow status bits for the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE uint32_t ARM_PMU_Get_CNTR_OVS(void) -{ - return PMU->OVSSET; -} - -/** - \brief Clear counter overflow status - \param [in] mask Counter overflow status bits to clear - \note Clears overflow status bits for one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_Set_CNTR_OVS(uint32_t mask) -{ - PMU->OVSCLR = mask; -} - -/** - \brief Enable counter overflow interrupt request - \param [in] mask Counter overflow interrupt request bits to set - \note Sets overflow interrupt request bits for one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Enable(uint32_t mask) -{ - PMU->INTENSET = mask; -} - -/** - \brief Disable counter overflow interrupt request - \param [in] mask Counter overflow interrupt request bits to clear - \note Clears overflow interrupt request bits for one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Disable(uint32_t mask) -{ - PMU->INTENCLR = mask; -} - -/** - \brief Software increment event counter - \param [in] mask Counters to increment - \note Software increment bits for one or more event counters (0-30) -*/ -__STATIC_INLINE void ARM_PMU_CNTR_Increment(uint32_t mask) -{ - PMU->SWINC = mask; -} - -#endif diff --git a/software/bootloader/Drivers/CMSIS/Include/tz_context.h b/software/bootloader/Drivers/CMSIS/Include/tz_context.h deleted file mode 100644 index 0d09749..0000000 --- a/software/bootloader/Drivers/CMSIS/Include/tz_context.h +++ /dev/null @@ -1,70 +0,0 @@ -/****************************************************************************** - * @file tz_context.h - * @brief Context Management for Armv8-M TrustZone - * @version V1.0.1 - * @date 10. January 2018 - ******************************************************************************/ -/* - * Copyright (c) 2017-2018 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef TZ_CONTEXT_H -#define TZ_CONTEXT_H - -#include - -#ifndef TZ_MODULEID_T -#define TZ_MODULEID_T -/// \details Data type that identifies secure software modules called by a process. -typedef uint32_t TZ_ModuleId_t; -#endif - -/// \details TZ Memory ID identifies an allocated memory slot. -typedef uint32_t TZ_MemoryId_t; - -/// Initialize secure context memory system -/// \return execution status (1: success, 0: error) -uint32_t TZ_InitContextSystem_S (void); - -/// Allocate context memory for calling secure software modules in TrustZone -/// \param[in] module identifies software modules called from non-secure mode -/// \return value != 0 id TrustZone memory slot identifier -/// \return value 0 no memory available or internal error -TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); - -/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S -/// \param[in] id TrustZone memory slot identifier -/// \return execution status (1: success, 0: error) -uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); - -/// Load secure context (called on RTOS thread context switch) -/// \param[in] id TrustZone memory slot identifier -/// \return execution status (1: success, 0: error) -uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); - -/// Store secure context (called on RTOS thread context switch) -/// \param[in] id TrustZone memory slot identifier -/// \return execution status (1: success, 0: error) -uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); - -#endif // TZ_CONTEXT_H diff --git a/software/bootloader/Drivers/CMSIS/LICENSE.txt b/software/bootloader/Drivers/CMSIS/LICENSE.txt deleted file mode 100644 index 8dada3e..0000000 --- a/software/bootloader/Drivers/CMSIS/LICENSE.txt +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h deleted file mode 100644 index 239d149..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ /dev/null @@ -1,4359 +0,0 @@ -/** - ****************************************************************************** - * @file stm32_hal_legacy.h - * @author MCD Application Team - * @brief This file contains aliases definition for the STM32Cube HAL constants - * macros and functions maintained for legacy purpose. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32_HAL_LEGACY -#define STM32_HAL_LEGACY - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup HAL_AES_Aliased_Defines HAL CRYP Aliased Defines maintained for legacy purpose - * @{ - */ -#define AES_FLAG_RDERR CRYP_FLAG_RDERR -#define AES_FLAG_WRERR CRYP_FLAG_WRERR -#define AES_CLEARFLAG_CCF CRYP_CLEARFLAG_CCF -#define AES_CLEARFLAG_RDERR CRYP_CLEARFLAG_RDERR -#define AES_CLEARFLAG_WRERR CRYP_CLEARFLAG_WRERR -#if defined(STM32H7) || defined(STM32MP1) -#define CRYP_DATATYPE_32B CRYP_NO_SWAP -#define CRYP_DATATYPE_16B CRYP_HALFWORD_SWAP -#define CRYP_DATATYPE_8B CRYP_BYTE_SWAP -#define CRYP_DATATYPE_1B CRYP_BIT_SWAP -#endif /* STM32H7 || STM32MP1 */ -/** - * @} - */ - -/** @defgroup HAL_ADC_Aliased_Defines HAL ADC Aliased Defines maintained for legacy purpose - * @{ - */ -#define ADC_RESOLUTION12b ADC_RESOLUTION_12B -#define ADC_RESOLUTION10b ADC_RESOLUTION_10B -#define ADC_RESOLUTION8b ADC_RESOLUTION_8B -#define ADC_RESOLUTION6b ADC_RESOLUTION_6B -#define OVR_DATA_OVERWRITTEN ADC_OVR_DATA_OVERWRITTEN -#define OVR_DATA_PRESERVED ADC_OVR_DATA_PRESERVED -#define EOC_SINGLE_CONV ADC_EOC_SINGLE_CONV -#define EOC_SEQ_CONV ADC_EOC_SEQ_CONV -#define EOC_SINGLE_SEQ_CONV ADC_EOC_SINGLE_SEQ_CONV -#define REGULAR_GROUP ADC_REGULAR_GROUP -#define INJECTED_GROUP ADC_INJECTED_GROUP -#define REGULAR_INJECTED_GROUP ADC_REGULAR_INJECTED_GROUP -#define AWD_EVENT ADC_AWD_EVENT -#define AWD1_EVENT ADC_AWD1_EVENT -#define AWD2_EVENT ADC_AWD2_EVENT -#define AWD3_EVENT ADC_AWD3_EVENT -#define OVR_EVENT ADC_OVR_EVENT -#define JQOVF_EVENT ADC_JQOVF_EVENT -#define ALL_CHANNELS ADC_ALL_CHANNELS -#define REGULAR_CHANNELS ADC_REGULAR_CHANNELS -#define INJECTED_CHANNELS ADC_INJECTED_CHANNELS -#define SYSCFG_FLAG_SENSOR_ADC ADC_FLAG_SENSOR -#define SYSCFG_FLAG_VREF_ADC ADC_FLAG_VREFINT -#define ADC_CLOCKPRESCALER_PCLK_DIV1 ADC_CLOCK_SYNC_PCLK_DIV1 -#define ADC_CLOCKPRESCALER_PCLK_DIV2 ADC_CLOCK_SYNC_PCLK_DIV2 -#define ADC_CLOCKPRESCALER_PCLK_DIV4 ADC_CLOCK_SYNC_PCLK_DIV4 -#define ADC_CLOCKPRESCALER_PCLK_DIV6 ADC_CLOCK_SYNC_PCLK_DIV6 -#define ADC_CLOCKPRESCALER_PCLK_DIV8 ADC_CLOCK_SYNC_PCLK_DIV8 -#define ADC_EXTERNALTRIG0_T6_TRGO ADC_EXTERNALTRIGCONV_T6_TRGO -#define ADC_EXTERNALTRIG1_T21_CC2 ADC_EXTERNALTRIGCONV_T21_CC2 -#define ADC_EXTERNALTRIG2_T2_TRGO ADC_EXTERNALTRIGCONV_T2_TRGO -#define ADC_EXTERNALTRIG3_T2_CC4 ADC_EXTERNALTRIGCONV_T2_CC4 -#define ADC_EXTERNALTRIG4_T22_TRGO ADC_EXTERNALTRIGCONV_T22_TRGO -#define ADC_EXTERNALTRIG7_EXT_IT11 ADC_EXTERNALTRIGCONV_EXT_IT11 -#define ADC_CLOCK_ASYNC ADC_CLOCK_ASYNC_DIV1 -#define ADC_EXTERNALTRIG_EDGE_NONE ADC_EXTERNALTRIGCONVEDGE_NONE -#define ADC_EXTERNALTRIG_EDGE_RISING ADC_EXTERNALTRIGCONVEDGE_RISING -#define ADC_EXTERNALTRIG_EDGE_FALLING ADC_EXTERNALTRIGCONVEDGE_FALLING -#define ADC_EXTERNALTRIG_EDGE_RISINGFALLING ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING -#define ADC_SAMPLETIME_2CYCLE_5 ADC_SAMPLETIME_2CYCLES_5 - -#define HAL_ADC_STATE_BUSY_REG HAL_ADC_STATE_REG_BUSY -#define HAL_ADC_STATE_BUSY_INJ HAL_ADC_STATE_INJ_BUSY -#define HAL_ADC_STATE_EOC_REG HAL_ADC_STATE_REG_EOC -#define HAL_ADC_STATE_EOC_INJ HAL_ADC_STATE_INJ_EOC -#define HAL_ADC_STATE_ERROR HAL_ADC_STATE_ERROR_INTERNAL -#define HAL_ADC_STATE_BUSY HAL_ADC_STATE_BUSY_INTERNAL -#define HAL_ADC_STATE_AWD HAL_ADC_STATE_AWD1 - -#if defined(STM32H7) -#define ADC_CHANNEL_VBAT_DIV4 ADC_CHANNEL_VBAT -#endif /* STM32H7 */ - -#if defined(STM32U5) -#define ADC_SAMPLETIME_5CYCLE ADC_SAMPLETIME_5CYCLES -#define ADC_SAMPLETIME_391CYCLES_5 ADC_SAMPLETIME_391CYCLES -#define ADC4_SAMPLETIME_160CYCLES_5 ADC4_SAMPLETIME_814CYCLES_5 -#endif /* STM32U5 */ - -#if defined(STM32H5) -#define ADC_CHANNEL_VCORE ADC_CHANNEL_VDDCORE -#endif /* STM32H5 */ -/** - * @} - */ - -/** @defgroup HAL_CEC_Aliased_Defines HAL CEC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define __HAL_CEC_GET_IT __HAL_CEC_GET_FLAG - -/** - * @} - */ - -/** @defgroup HAL_COMP_Aliased_Defines HAL COMP Aliased Defines maintained for legacy purpose - * @{ - */ -#define COMP_WINDOWMODE_DISABLED COMP_WINDOWMODE_DISABLE -#define COMP_WINDOWMODE_ENABLED COMP_WINDOWMODE_ENABLE -#define COMP_EXTI_LINE_COMP1_EVENT COMP_EXTI_LINE_COMP1 -#define COMP_EXTI_LINE_COMP2_EVENT COMP_EXTI_LINE_COMP2 -#define COMP_EXTI_LINE_COMP3_EVENT COMP_EXTI_LINE_COMP3 -#define COMP_EXTI_LINE_COMP4_EVENT COMP_EXTI_LINE_COMP4 -#define COMP_EXTI_LINE_COMP5_EVENT COMP_EXTI_LINE_COMP5 -#define COMP_EXTI_LINE_COMP6_EVENT COMP_EXTI_LINE_COMP6 -#define COMP_EXTI_LINE_COMP7_EVENT COMP_EXTI_LINE_COMP7 -#if defined(STM32L0) -#define COMP_LPTIMCONNECTION_ENABLED ((uint32_t)0x00000003U) /*!< COMPX output generic naming: connected to LPTIM - input 1 for COMP1, LPTIM input 2 for COMP2 */ -#endif -#define COMP_OUTPUT_COMP6TIM2OCREFCLR COMP_OUTPUT_COMP6_TIM2OCREFCLR -#if defined(STM32F373xC) || defined(STM32F378xx) -#define COMP_OUTPUT_TIM3IC1 COMP_OUTPUT_COMP1_TIM3IC1 -#define COMP_OUTPUT_TIM3OCREFCLR COMP_OUTPUT_COMP1_TIM3OCREFCLR -#endif /* STM32F373xC || STM32F378xx */ - -#if defined(STM32L0) || defined(STM32L4) -#define COMP_WINDOWMODE_ENABLE COMP_WINDOWMODE_COMP1_INPUT_PLUS_COMMON - -#define COMP_NONINVERTINGINPUT_IO1 COMP_INPUT_PLUS_IO1 -#define COMP_NONINVERTINGINPUT_IO2 COMP_INPUT_PLUS_IO2 -#define COMP_NONINVERTINGINPUT_IO3 COMP_INPUT_PLUS_IO3 -#define COMP_NONINVERTINGINPUT_IO4 COMP_INPUT_PLUS_IO4 -#define COMP_NONINVERTINGINPUT_IO5 COMP_INPUT_PLUS_IO5 -#define COMP_NONINVERTINGINPUT_IO6 COMP_INPUT_PLUS_IO6 - -#define COMP_INVERTINGINPUT_1_4VREFINT COMP_INPUT_MINUS_1_4VREFINT -#define COMP_INVERTINGINPUT_1_2VREFINT COMP_INPUT_MINUS_1_2VREFINT -#define COMP_INVERTINGINPUT_3_4VREFINT COMP_INPUT_MINUS_3_4VREFINT -#define COMP_INVERTINGINPUT_VREFINT COMP_INPUT_MINUS_VREFINT -#define COMP_INVERTINGINPUT_DAC1_CH1 COMP_INPUT_MINUS_DAC1_CH1 -#define COMP_INVERTINGINPUT_DAC1_CH2 COMP_INPUT_MINUS_DAC1_CH2 -#define COMP_INVERTINGINPUT_DAC1 COMP_INPUT_MINUS_DAC1_CH1 -#define COMP_INVERTINGINPUT_DAC2 COMP_INPUT_MINUS_DAC1_CH2 -#define COMP_INVERTINGINPUT_IO1 COMP_INPUT_MINUS_IO1 -#if defined(STM32L0) -/* Issue fixed on STM32L0 COMP driver: only 2 dedicated IO (IO1 and IO2), */ -/* IO2 was wrongly assigned to IO shared with DAC and IO3 was corresponding */ -/* to the second dedicated IO (only for COMP2). */ -#define COMP_INVERTINGINPUT_IO2 COMP_INPUT_MINUS_DAC1_CH2 -#define COMP_INVERTINGINPUT_IO3 COMP_INPUT_MINUS_IO2 -#else -#define COMP_INVERTINGINPUT_IO2 COMP_INPUT_MINUS_IO2 -#define COMP_INVERTINGINPUT_IO3 COMP_INPUT_MINUS_IO3 -#endif -#define COMP_INVERTINGINPUT_IO4 COMP_INPUT_MINUS_IO4 -#define COMP_INVERTINGINPUT_IO5 COMP_INPUT_MINUS_IO5 - -#define COMP_OUTPUTLEVEL_LOW COMP_OUTPUT_LEVEL_LOW -#define COMP_OUTPUTLEVEL_HIGH COMP_OUTPUT_LEVEL_HIGH - -/* Note: Literal "COMP_FLAG_LOCK" kept for legacy purpose. */ -/* To check COMP lock state, use macro "__HAL_COMP_IS_LOCKED()". */ -#if defined(COMP_CSR_LOCK) -#define COMP_FLAG_LOCK COMP_CSR_LOCK -#elif defined(COMP_CSR_COMP1LOCK) -#define COMP_FLAG_LOCK COMP_CSR_COMP1LOCK -#elif defined(COMP_CSR_COMPxLOCK) -#define COMP_FLAG_LOCK COMP_CSR_COMPxLOCK -#endif - -#if defined(STM32L4) -#define COMP_BLANKINGSRCE_TIM1OC5 COMP_BLANKINGSRC_TIM1_OC5_COMP1 -#define COMP_BLANKINGSRCE_TIM2OC3 COMP_BLANKINGSRC_TIM2_OC3_COMP1 -#define COMP_BLANKINGSRCE_TIM3OC3 COMP_BLANKINGSRC_TIM3_OC3_COMP1 -#define COMP_BLANKINGSRCE_TIM3OC4 COMP_BLANKINGSRC_TIM3_OC4_COMP2 -#define COMP_BLANKINGSRCE_TIM8OC5 COMP_BLANKINGSRC_TIM8_OC5_COMP2 -#define COMP_BLANKINGSRCE_TIM15OC1 COMP_BLANKINGSRC_TIM15_OC1_COMP2 -#define COMP_BLANKINGSRCE_NONE COMP_BLANKINGSRC_NONE -#endif - -#if defined(STM32L0) -#define COMP_MODE_HIGHSPEED COMP_POWERMODE_MEDIUMSPEED -#define COMP_MODE_LOWSPEED COMP_POWERMODE_ULTRALOWPOWER -#else -#define COMP_MODE_HIGHSPEED COMP_POWERMODE_HIGHSPEED -#define COMP_MODE_MEDIUMSPEED COMP_POWERMODE_MEDIUMSPEED -#define COMP_MODE_LOWPOWER COMP_POWERMODE_LOWPOWER -#define COMP_MODE_ULTRALOWPOWER COMP_POWERMODE_ULTRALOWPOWER -#endif - -#endif - -#if defined(STM32U5) -#define __HAL_COMP_COMP1_EXTI_CLEAR_RASING_FLAG __HAL_COMP_COMP1_EXTI_CLEAR_RISING_FLAG -#endif - -/** - * @} - */ - -/** @defgroup HAL_CORTEX_Aliased_Defines HAL CORTEX Aliased Defines maintained for legacy purpose - * @{ - */ -#define __HAL_CORTEX_SYSTICKCLK_CONFIG HAL_SYSTICK_CLKSourceConfig -#if defined(STM32U5) -#define MPU_DEVICE_nGnRnE MPU_DEVICE_NGNRNE -#define MPU_DEVICE_nGnRE MPU_DEVICE_NGNRE -#define MPU_DEVICE_nGRE MPU_DEVICE_NGRE -#endif /* STM32U5 */ -/** - * @} - */ - -/** @defgroup CRC_Aliases CRC API aliases - * @{ - */ -#if defined(STM32H5) || defined(STM32C0) -#else -#define HAL_CRC_Input_Data_Reverse HAL_CRCEx_Input_Data_Reverse /*!< Aliased to HAL_CRCEx_Input_Data_Reverse for - inter STM32 series compatibility */ -#define HAL_CRC_Output_Data_Reverse HAL_CRCEx_Output_Data_Reverse /*!< Aliased to HAL_CRCEx_Output_Data_Reverse for - inter STM32 series compatibility */ -#endif -/** - * @} - */ - -/** @defgroup HAL_CRC_Aliased_Defines HAL CRC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define CRC_OUTPUTDATA_INVERSION_DISABLED CRC_OUTPUTDATA_INVERSION_DISABLE -#define CRC_OUTPUTDATA_INVERSION_ENABLED CRC_OUTPUTDATA_INVERSION_ENABLE - -/** - * @} - */ - -/** @defgroup HAL_DAC_Aliased_Defines HAL DAC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define DAC1_CHANNEL_1 DAC_CHANNEL_1 -#define DAC1_CHANNEL_2 DAC_CHANNEL_2 -#define DAC2_CHANNEL_1 DAC_CHANNEL_1 -#define DAC_WAVE_NONE 0x00000000U -#define DAC_WAVE_NOISE DAC_CR_WAVE1_0 -#define DAC_WAVE_TRIANGLE DAC_CR_WAVE1_1 -#define DAC_WAVEGENERATION_NONE DAC_WAVE_NONE -#define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE -#define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE - -#if defined(STM32G4) || defined(STM32H7) || defined (STM32U5) -#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL -#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL -#endif - -#if defined(STM32U5) -#define DAC_TRIGGER_STOP_LPTIM1_OUT DAC_TRIGGER_STOP_LPTIM1_CH1 -#define DAC_TRIGGER_STOP_LPTIM3_OUT DAC_TRIGGER_STOP_LPTIM3_CH1 -#define DAC_TRIGGER_LPTIM1_OUT DAC_TRIGGER_LPTIM1_CH1 -#define DAC_TRIGGER_LPTIM3_OUT DAC_TRIGGER_LPTIM3_CH1 -#endif - -#if defined(STM32H5) -#define DAC_TRIGGER_LPTIM1_OUT DAC_TRIGGER_LPTIM1_CH1 -#define DAC_TRIGGER_LPTIM2_OUT DAC_TRIGGER_LPTIM2_CH1 -#endif - -#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || \ - defined(STM32F4) || defined(STM32G4) -#define HAL_DAC_MSP_INIT_CB_ID HAL_DAC_MSPINIT_CB_ID -#define HAL_DAC_MSP_DEINIT_CB_ID HAL_DAC_MSPDEINIT_CB_ID -#endif - -/** - * @} - */ - -/** @defgroup HAL_DMA_Aliased_Defines HAL DMA Aliased Defines maintained for legacy purpose - * @{ - */ -#define HAL_REMAPDMA_ADC_DMA_CH2 DMA_REMAP_ADC_DMA_CH2 -#define HAL_REMAPDMA_USART1_TX_DMA_CH4 DMA_REMAP_USART1_TX_DMA_CH4 -#define HAL_REMAPDMA_USART1_RX_DMA_CH5 DMA_REMAP_USART1_RX_DMA_CH5 -#define HAL_REMAPDMA_TIM16_DMA_CH4 DMA_REMAP_TIM16_DMA_CH4 -#define HAL_REMAPDMA_TIM17_DMA_CH2 DMA_REMAP_TIM17_DMA_CH2 -#define HAL_REMAPDMA_USART3_DMA_CH32 DMA_REMAP_USART3_DMA_CH32 -#define HAL_REMAPDMA_TIM16_DMA_CH6 DMA_REMAP_TIM16_DMA_CH6 -#define HAL_REMAPDMA_TIM17_DMA_CH7 DMA_REMAP_TIM17_DMA_CH7 -#define HAL_REMAPDMA_SPI2_DMA_CH67 DMA_REMAP_SPI2_DMA_CH67 -#define HAL_REMAPDMA_USART2_DMA_CH67 DMA_REMAP_USART2_DMA_CH67 -#define HAL_REMAPDMA_I2C1_DMA_CH76 DMA_REMAP_I2C1_DMA_CH76 -#define HAL_REMAPDMA_TIM1_DMA_CH6 DMA_REMAP_TIM1_DMA_CH6 -#define HAL_REMAPDMA_TIM2_DMA_CH7 DMA_REMAP_TIM2_DMA_CH7 -#define HAL_REMAPDMA_TIM3_DMA_CH6 DMA_REMAP_TIM3_DMA_CH6 - -#define IS_HAL_REMAPDMA IS_DMA_REMAP -#define __HAL_REMAPDMA_CHANNEL_ENABLE __HAL_DMA_REMAP_CHANNEL_ENABLE -#define __HAL_REMAPDMA_CHANNEL_DISABLE __HAL_DMA_REMAP_CHANNEL_DISABLE - -#if defined(STM32L4) - -#define HAL_DMAMUX1_REQUEST_GEN_EXTI0 HAL_DMAMUX1_REQ_GEN_EXTI0 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI1 HAL_DMAMUX1_REQ_GEN_EXTI1 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI2 HAL_DMAMUX1_REQ_GEN_EXTI2 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI3 HAL_DMAMUX1_REQ_GEN_EXTI3 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI4 HAL_DMAMUX1_REQ_GEN_EXTI4 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI5 HAL_DMAMUX1_REQ_GEN_EXTI5 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI6 HAL_DMAMUX1_REQ_GEN_EXTI6 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI7 HAL_DMAMUX1_REQ_GEN_EXTI7 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI8 HAL_DMAMUX1_REQ_GEN_EXTI8 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI9 HAL_DMAMUX1_REQ_GEN_EXTI9 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI10 HAL_DMAMUX1_REQ_GEN_EXTI10 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI11 HAL_DMAMUX1_REQ_GEN_EXTI11 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI12 HAL_DMAMUX1_REQ_GEN_EXTI12 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI13 HAL_DMAMUX1_REQ_GEN_EXTI13 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI14 HAL_DMAMUX1_REQ_GEN_EXTI14 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI15 HAL_DMAMUX1_REQ_GEN_EXTI15 -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH0_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH0_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH1_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH1_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH2_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH2_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH3_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH3_EVT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM1_OUT HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX1_REQ_GEN_LPTIM2_OUT -#define HAL_DMAMUX1_REQUEST_GEN_DSI_TE HAL_DMAMUX1_REQ_GEN_DSI_TE -#define HAL_DMAMUX1_REQUEST_GEN_DSI_EOT HAL_DMAMUX1_REQ_GEN_DSI_EOT -#define HAL_DMAMUX1_REQUEST_GEN_DMA2D_EOT HAL_DMAMUX1_REQ_GEN_DMA2D_EOT -#define HAL_DMAMUX1_REQUEST_GEN_LTDC_IT HAL_DMAMUX1_REQ_GEN_LTDC_IT - -#define HAL_DMAMUX_REQUEST_GEN_NO_EVENT HAL_DMAMUX_REQ_GEN_NO_EVENT -#define HAL_DMAMUX_REQUEST_GEN_RISING HAL_DMAMUX_REQ_GEN_RISING -#define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING -#define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING - -#if defined(STM32L4R5xx) || defined(STM32L4R9xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || \ - defined(STM32L4S7xx) || defined(STM32L4S9xx) -#define DMA_REQUEST_DCMI_PSSI DMA_REQUEST_DCMI -#endif - -#endif /* STM32L4 */ - -#if defined(STM32G0) -#define DMA_REQUEST_DAC1_CHANNEL1 DMA_REQUEST_DAC1_CH1 -#define DMA_REQUEST_DAC1_CHANNEL2 DMA_REQUEST_DAC1_CH2 -#define DMA_REQUEST_TIM16_TRIG_COM DMA_REQUEST_TIM16_COM -#define DMA_REQUEST_TIM17_TRIG_COM DMA_REQUEST_TIM17_COM - -#define LL_DMAMUX_REQ_TIM16_TRIG_COM LL_DMAMUX_REQ_TIM16_COM -#define LL_DMAMUX_REQ_TIM17_TRIG_COM LL_DMAMUX_REQ_TIM17_COM -#endif - -#if defined(STM32H7) - -#define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1 -#define DMA_REQUEST_DAC2 DMA_REQUEST_DAC1_CH2 - -#define BDMA_REQUEST_LP_UART1_RX BDMA_REQUEST_LPUART1_RX -#define BDMA_REQUEST_LP_UART1_TX BDMA_REQUEST_LPUART1_TX - -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH0_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH0_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH1_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH1_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH2_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH2_EVT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM1_OUT HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX1_REQ_GEN_LPTIM2_OUT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM3_OUT HAL_DMAMUX1_REQ_GEN_LPTIM3_OUT -#define HAL_DMAMUX1_REQUEST_GEN_EXTI0 HAL_DMAMUX1_REQ_GEN_EXTI0 -#define HAL_DMAMUX1_REQUEST_GEN_TIM12_TRGO HAL_DMAMUX1_REQ_GEN_TIM12_TRGO - -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH0_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH0_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH1_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH1_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH2_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH2_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH3_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH3_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH4_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH4_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH5_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH5_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH6_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH6_EVT -#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_RX_WKUP HAL_DMAMUX2_REQ_GEN_LPUART1_RX_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_TX_WKUP HAL_DMAMUX2_REQ_GEN_LPUART1_TX_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM2_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM2_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX2_REQ_GEN_LPTIM2_OUT -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM3_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM3_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM3_OUT HAL_DMAMUX2_REQ_GEN_LPTIM3_OUT -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM4_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM4_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM5_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM5_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_I2C4_WKUP HAL_DMAMUX2_REQ_GEN_I2C4_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_SPI6_WKUP HAL_DMAMUX2_REQ_GEN_SPI6_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_COMP1_OUT HAL_DMAMUX2_REQ_GEN_COMP1_OUT -#define HAL_DMAMUX2_REQUEST_GEN_COMP2_OUT HAL_DMAMUX2_REQ_GEN_COMP2_OUT -#define HAL_DMAMUX2_REQUEST_GEN_RTC_WKUP HAL_DMAMUX2_REQ_GEN_RTC_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_EXTI0 HAL_DMAMUX2_REQ_GEN_EXTI0 -#define HAL_DMAMUX2_REQUEST_GEN_EXTI2 HAL_DMAMUX2_REQ_GEN_EXTI2 -#define HAL_DMAMUX2_REQUEST_GEN_I2C4_IT_EVT HAL_DMAMUX2_REQ_GEN_I2C4_IT_EVT -#define HAL_DMAMUX2_REQUEST_GEN_SPI6_IT HAL_DMAMUX2_REQ_GEN_SPI6_IT -#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_TX_IT HAL_DMAMUX2_REQ_GEN_LPUART1_TX_IT -#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_RX_IT HAL_DMAMUX2_REQ_GEN_LPUART1_RX_IT -#define HAL_DMAMUX2_REQUEST_GEN_ADC3_IT HAL_DMAMUX2_REQ_GEN_ADC3_IT -#define HAL_DMAMUX2_REQUEST_GEN_ADC3_AWD1_OUT HAL_DMAMUX2_REQ_GEN_ADC3_AWD1_OUT -#define HAL_DMAMUX2_REQUEST_GEN_BDMA_CH0_IT HAL_DMAMUX2_REQ_GEN_BDMA_CH0_IT -#define HAL_DMAMUX2_REQUEST_GEN_BDMA_CH1_IT HAL_DMAMUX2_REQ_GEN_BDMA_CH1_IT - -#define HAL_DMAMUX_REQUEST_GEN_NO_EVENT HAL_DMAMUX_REQ_GEN_NO_EVENT -#define HAL_DMAMUX_REQUEST_GEN_RISING HAL_DMAMUX_REQ_GEN_RISING -#define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING -#define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING - -#define DFSDM_FILTER_EXT_TRIG_LPTIM1 DFSDM_FILTER_EXT_TRIG_LPTIM1_OUT -#define DFSDM_FILTER_EXT_TRIG_LPTIM2 DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT -#define DFSDM_FILTER_EXT_TRIG_LPTIM3 DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT - -#define DAC_TRIGGER_LP1_OUT DAC_TRIGGER_LPTIM1_OUT -#define DAC_TRIGGER_LP2_OUT DAC_TRIGGER_LPTIM2_OUT - -#endif /* STM32H7 */ - -#if defined(STM32U5) -#define GPDMA1_REQUEST_DCMI GPDMA1_REQUEST_DCMI_PSSI -#endif /* STM32U5 */ -/** - * @} - */ - -/** @defgroup HAL_FLASH_Aliased_Defines HAL FLASH Aliased Defines maintained for legacy purpose - * @{ - */ - -#define TYPEPROGRAM_BYTE FLASH_TYPEPROGRAM_BYTE -#define TYPEPROGRAM_HALFWORD FLASH_TYPEPROGRAM_HALFWORD -#define TYPEPROGRAM_WORD FLASH_TYPEPROGRAM_WORD -#define TYPEPROGRAM_DOUBLEWORD FLASH_TYPEPROGRAM_DOUBLEWORD -#define TYPEERASE_SECTORS FLASH_TYPEERASE_SECTORS -#define TYPEERASE_PAGES FLASH_TYPEERASE_PAGES -#define TYPEERASE_PAGEERASE FLASH_TYPEERASE_PAGES -#define TYPEERASE_MASSERASE FLASH_TYPEERASE_MASSERASE -#define WRPSTATE_DISABLE OB_WRPSTATE_DISABLE -#define WRPSTATE_ENABLE OB_WRPSTATE_ENABLE -#define HAL_FLASH_TIMEOUT_VALUE FLASH_TIMEOUT_VALUE -#define OBEX_PCROP OPTIONBYTE_PCROP -#define OBEX_BOOTCONFIG OPTIONBYTE_BOOTCONFIG -#define PCROPSTATE_DISABLE OB_PCROP_STATE_DISABLE -#define PCROPSTATE_ENABLE OB_PCROP_STATE_ENABLE -#define TYPEERASEDATA_BYTE FLASH_TYPEERASEDATA_BYTE -#define TYPEERASEDATA_HALFWORD FLASH_TYPEERASEDATA_HALFWORD -#define TYPEERASEDATA_WORD FLASH_TYPEERASEDATA_WORD -#define TYPEPROGRAMDATA_BYTE FLASH_TYPEPROGRAMDATA_BYTE -#define TYPEPROGRAMDATA_HALFWORD FLASH_TYPEPROGRAMDATA_HALFWORD -#define TYPEPROGRAMDATA_WORD FLASH_TYPEPROGRAMDATA_WORD -#define TYPEPROGRAMDATA_FASTBYTE FLASH_TYPEPROGRAMDATA_FASTBYTE -#define TYPEPROGRAMDATA_FASTHALFWORD FLASH_TYPEPROGRAMDATA_FASTHALFWORD -#define TYPEPROGRAMDATA_FASTWORD FLASH_TYPEPROGRAMDATA_FASTWORD -#define PAGESIZE FLASH_PAGE_SIZE -#define TYPEPROGRAM_FASTBYTE FLASH_TYPEPROGRAM_BYTE -#define TYPEPROGRAM_FASTHALFWORD FLASH_TYPEPROGRAM_HALFWORD -#define TYPEPROGRAM_FASTWORD FLASH_TYPEPROGRAM_WORD -#define VOLTAGE_RANGE_1 FLASH_VOLTAGE_RANGE_1 -#define VOLTAGE_RANGE_2 FLASH_VOLTAGE_RANGE_2 -#define VOLTAGE_RANGE_3 FLASH_VOLTAGE_RANGE_3 -#define VOLTAGE_RANGE_4 FLASH_VOLTAGE_RANGE_4 -#define TYPEPROGRAM_FAST FLASH_TYPEPROGRAM_FAST -#define TYPEPROGRAM_FAST_AND_LAST FLASH_TYPEPROGRAM_FAST_AND_LAST -#define WRPAREA_BANK1_AREAA OB_WRPAREA_BANK1_AREAA -#define WRPAREA_BANK1_AREAB OB_WRPAREA_BANK1_AREAB -#define WRPAREA_BANK2_AREAA OB_WRPAREA_BANK2_AREAA -#define WRPAREA_BANK2_AREAB OB_WRPAREA_BANK2_AREAB -#define IWDG_STDBY_FREEZE OB_IWDG_STDBY_FREEZE -#define IWDG_STDBY_ACTIVE OB_IWDG_STDBY_RUN -#define IWDG_STOP_FREEZE OB_IWDG_STOP_FREEZE -#define IWDG_STOP_ACTIVE OB_IWDG_STOP_RUN -#define FLASH_ERROR_NONE HAL_FLASH_ERROR_NONE -#define FLASH_ERROR_RD HAL_FLASH_ERROR_RD -#define FLASH_ERROR_PG HAL_FLASH_ERROR_PROG -#define FLASH_ERROR_PGP HAL_FLASH_ERROR_PGS -#define FLASH_ERROR_WRP HAL_FLASH_ERROR_WRP -#define FLASH_ERROR_OPTV HAL_FLASH_ERROR_OPTV -#define FLASH_ERROR_OPTVUSR HAL_FLASH_ERROR_OPTVUSR -#define FLASH_ERROR_PROG HAL_FLASH_ERROR_PROG -#define FLASH_ERROR_OP HAL_FLASH_ERROR_OPERATION -#define FLASH_ERROR_PGA HAL_FLASH_ERROR_PGA -#define FLASH_ERROR_SIZE HAL_FLASH_ERROR_SIZE -#define FLASH_ERROR_SIZ HAL_FLASH_ERROR_SIZE -#define FLASH_ERROR_PGS HAL_FLASH_ERROR_PGS -#define FLASH_ERROR_MIS HAL_FLASH_ERROR_MIS -#define FLASH_ERROR_FAST HAL_FLASH_ERROR_FAST -#define FLASH_ERROR_FWWERR HAL_FLASH_ERROR_FWWERR -#define FLASH_ERROR_NOTZERO HAL_FLASH_ERROR_NOTZERO -#define FLASH_ERROR_OPERATION HAL_FLASH_ERROR_OPERATION -#define FLASH_ERROR_ERS HAL_FLASH_ERROR_ERS -#define OB_WDG_SW OB_IWDG_SW -#define OB_WDG_HW OB_IWDG_HW -#define OB_SDADC12_VDD_MONITOR_SET OB_SDACD_VDD_MONITOR_SET -#define OB_SDADC12_VDD_MONITOR_RESET OB_SDACD_VDD_MONITOR_RESET -#define OB_RAM_PARITY_CHECK_SET OB_SRAM_PARITY_SET -#define OB_RAM_PARITY_CHECK_RESET OB_SRAM_PARITY_RESET -#define IS_OB_SDADC12_VDD_MONITOR IS_OB_SDACD_VDD_MONITOR -#define OB_RDP_LEVEL0 OB_RDP_LEVEL_0 -#define OB_RDP_LEVEL1 OB_RDP_LEVEL_1 -#define OB_RDP_LEVEL2 OB_RDP_LEVEL_2 -#if defined(STM32G0) || defined(STM32C0) -#define OB_BOOT_LOCK_DISABLE OB_BOOT_ENTRY_FORCED_NONE -#define OB_BOOT_LOCK_ENABLE OB_BOOT_ENTRY_FORCED_FLASH -#else -#define OB_BOOT_ENTRY_FORCED_NONE OB_BOOT_LOCK_DISABLE -#define OB_BOOT_ENTRY_FORCED_FLASH OB_BOOT_LOCK_ENABLE -#endif -#if defined(STM32H7) -#define FLASH_FLAG_SNECCE_BANK1RR FLASH_FLAG_SNECCERR_BANK1 -#define FLASH_FLAG_DBECCE_BANK1RR FLASH_FLAG_DBECCERR_BANK1 -#define FLASH_FLAG_STRBER_BANK1R FLASH_FLAG_STRBERR_BANK1 -#define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2 -#define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2 -#define FLASH_FLAG_STRBER_BANK2R FLASH_FLAG_STRBERR_BANK2 -#define FLASH_FLAG_WDW FLASH_FLAG_WBNE -#define OB_WRP_SECTOR_All OB_WRP_SECTOR_ALL -#endif /* STM32H7 */ -#if defined(STM32U5) -#define OB_USER_nRST_STOP OB_USER_NRST_STOP -#define OB_USER_nRST_STDBY OB_USER_NRST_STDBY -#define OB_USER_nRST_SHDW OB_USER_NRST_SHDW -#define OB_USER_nSWBOOT0 OB_USER_NSWBOOT0 -#define OB_USER_nBOOT0 OB_USER_NBOOT0 -#define OB_nBOOT0_RESET OB_NBOOT0_RESET -#define OB_nBOOT0_SET OB_NBOOT0_SET -#define OB_USER_SRAM134_RST OB_USER_SRAM_RST -#define OB_SRAM134_RST_ERASE OB_SRAM_RST_ERASE -#define OB_SRAM134_RST_NOT_ERASE OB_SRAM_RST_NOT_ERASE -#endif /* STM32U5 */ -#if defined(STM32U0) -#define OB_USER_nRST_STOP OB_USER_NRST_STOP -#define OB_USER_nRST_STDBY OB_USER_NRST_STDBY -#define OB_USER_nRST_SHDW OB_USER_NRST_SHDW -#define OB_USER_nBOOT_SEL OB_USER_NBOOT_SEL -#define OB_USER_nBOOT0 OB_USER_NBOOT0 -#define OB_USER_nBOOT1 OB_USER_NBOOT1 -#define OB_nBOOT0_RESET OB_NBOOT0_RESET -#define OB_nBOOT0_SET OB_NBOOT0_SET -#endif /* STM32U0 */ - -/** - * @} - */ - -/** @defgroup HAL_JPEG_Aliased_Macros HAL JPEG Aliased Macros maintained for legacy purpose - * @{ - */ - -#if defined(STM32H7) -#define __HAL_RCC_JPEG_CLK_ENABLE __HAL_RCC_JPGDECEN_CLK_ENABLE -#define __HAL_RCC_JPEG_CLK_DISABLE __HAL_RCC_JPGDECEN_CLK_DISABLE -#define __HAL_RCC_JPEG_FORCE_RESET __HAL_RCC_JPGDECRST_FORCE_RESET -#define __HAL_RCC_JPEG_RELEASE_RESET __HAL_RCC_JPGDECRST_RELEASE_RESET -#define __HAL_RCC_JPEG_CLK_SLEEP_ENABLE __HAL_RCC_JPGDEC_CLK_SLEEP_ENABLE -#define __HAL_RCC_JPEG_CLK_SLEEP_DISABLE __HAL_RCC_JPGDEC_CLK_SLEEP_DISABLE -#endif /* STM32H7 */ - -/** - * @} - */ - -/** @defgroup HAL_SYSCFG_Aliased_Defines HAL SYSCFG Aliased Defines maintained for legacy purpose - * @{ - */ - -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PA9 I2C_FASTMODEPLUS_PA9 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PA10 I2C_FASTMODEPLUS_PA10 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB6 I2C_FASTMODEPLUS_PB6 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB7 I2C_FASTMODEPLUS_PB7 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB8 I2C_FASTMODEPLUS_PB8 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB9 I2C_FASTMODEPLUS_PB9 -#define HAL_SYSCFG_FASTMODEPLUS_I2C1 I2C_FASTMODEPLUS_I2C1 -#define HAL_SYSCFG_FASTMODEPLUS_I2C2 I2C_FASTMODEPLUS_I2C2 -#define HAL_SYSCFG_FASTMODEPLUS_I2C3 I2C_FASTMODEPLUS_I2C3 -#if defined(STM32G4) - -#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOSwitchBooster -#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOSwitchBooster -#define HAL_SYSCFG_EnableIOAnalogSwitchVDD HAL_SYSCFG_EnableIOSwitchVDD -#define HAL_SYSCFG_DisableIOAnalogSwitchVDD HAL_SYSCFG_DisableIOSwitchVDD -#endif /* STM32G4 */ - -#if defined(STM32H5) -#define SYSCFG_IT_FPU_IOC SBS_IT_FPU_IOC -#define SYSCFG_IT_FPU_DZC SBS_IT_FPU_DZC -#define SYSCFG_IT_FPU_UFC SBS_IT_FPU_UFC -#define SYSCFG_IT_FPU_OFC SBS_IT_FPU_OFC -#define SYSCFG_IT_FPU_IDC SBS_IT_FPU_IDC -#define SYSCFG_IT_FPU_IXC SBS_IT_FPU_IXC - -#define SYSCFG_BREAK_FLASH_ECC SBS_BREAK_FLASH_ECC -#define SYSCFG_BREAK_PVD SBS_BREAK_PVD -#define SYSCFG_BREAK_SRAM_ECC SBS_BREAK_SRAM_ECC -#define SYSCFG_BREAK_LOCKUP SBS_BREAK_LOCKUP - -#define SYSCFG_VREFBUF_VOLTAGE_SCALE0 VREFBUF_VOLTAGE_SCALE0 -#define SYSCFG_VREFBUF_VOLTAGE_SCALE1 VREFBUF_VOLTAGE_SCALE1 -#define SYSCFG_VREFBUF_VOLTAGE_SCALE2 VREFBUF_VOLTAGE_SCALE2 -#define SYSCFG_VREFBUF_VOLTAGE_SCALE3 VREFBUF_VOLTAGE_SCALE3 - -#define SYSCFG_VREFBUF_HIGH_IMPEDANCE_DISABLE VREFBUF_HIGH_IMPEDANCE_DISABLE -#define SYSCFG_VREFBUF_HIGH_IMPEDANCE_ENABLE VREFBUF_HIGH_IMPEDANCE_ENABLE - -#define SYSCFG_FASTMODEPLUS_PB6 SBS_FASTMODEPLUS_PB6 -#define SYSCFG_FASTMODEPLUS_PB7 SBS_FASTMODEPLUS_PB7 -#define SYSCFG_FASTMODEPLUS_PB8 SBS_FASTMODEPLUS_PB8 -#define SYSCFG_FASTMODEPLUS_PB9 SBS_FASTMODEPLUS_PB9 - -#define SYSCFG_ETH_MII SBS_ETH_MII -#define SYSCFG_ETH_RMII SBS_ETH_RMII -#define IS_SYSCFG_ETHERNET_CONFIG IS_SBS_ETHERNET_CONFIG - -#define SYSCFG_MEMORIES_ERASE_FLAG_IPMEE SBS_MEMORIES_ERASE_FLAG_IPMEE -#define SYSCFG_MEMORIES_ERASE_FLAG_MCLR SBS_MEMORIES_ERASE_FLAG_MCLR -#define IS_SYSCFG_MEMORIES_ERASE_FLAG IS_SBS_MEMORIES_ERASE_FLAG - -#define IS_SYSCFG_CODE_CONFIG IS_SBS_CODE_CONFIG - -#define SYSCFG_MPU_NSEC SBS_MPU_NSEC -#define SYSCFG_VTOR_NSEC SBS_VTOR_NSEC -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#define SYSCFG_SAU SBS_SAU -#define SYSCFG_MPU_SEC SBS_MPU_SEC -#define SYSCFG_VTOR_AIRCR_SEC SBS_VTOR_AIRCR_SEC -#define SYSCFG_LOCK_ALL SBS_LOCK_ALL -#else -#define SYSCFG_LOCK_ALL SBS_LOCK_ALL -#endif /* __ARM_FEATURE_CMSE */ - -#define SYSCFG_CLK SBS_CLK -#define SYSCFG_CLASSB SBS_CLASSB -#define SYSCFG_FPU SBS_FPU -#define SYSCFG_ALL SBS_ALL - -#define SYSCFG_SEC SBS_SEC -#define SYSCFG_NSEC SBS_NSEC - -#define __HAL_SYSCFG_FPU_INTERRUPT_ENABLE __HAL_SBS_FPU_INTERRUPT_ENABLE -#define __HAL_SYSCFG_FPU_INTERRUPT_DISABLE __HAL_SBS_FPU_INTERRUPT_DISABLE - -#define __HAL_SYSCFG_BREAK_ECC_LOCK __HAL_SBS_BREAK_ECC_LOCK -#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK __HAL_SBS_BREAK_LOCKUP_LOCK -#define __HAL_SYSCFG_BREAK_PVD_LOCK __HAL_SBS_BREAK_PVD_LOCK -#define __HAL_SYSCFG_BREAK_SRAM_ECC_LOCK __HAL_SBS_BREAK_SRAM_ECC_LOCK - -#define __HAL_SYSCFG_FASTMODEPLUS_ENABLE __HAL_SBS_FASTMODEPLUS_ENABLE -#define __HAL_SYSCFG_FASTMODEPLUS_DISABLE __HAL_SBS_FASTMODEPLUS_DISABLE - -#define __HAL_SYSCFG_GET_MEMORIES_ERASE_STATUS __HAL_SBS_GET_MEMORIES_ERASE_STATUS -#define __HAL_SYSCFG_CLEAR_MEMORIES_ERASE_STATUS __HAL_SBS_CLEAR_MEMORIES_ERASE_STATUS - -#define IS_SYSCFG_FPU_INTERRUPT IS_SBS_FPU_INTERRUPT -#define IS_SYSCFG_BREAK_CONFIG IS_SBS_BREAK_CONFIG -#define IS_SYSCFG_VREFBUF_VOLTAGE_SCALE IS_VREFBUF_VOLTAGE_SCALE -#define IS_SYSCFG_VREFBUF_HIGH_IMPEDANCE IS_VREFBUF_HIGH_IMPEDANCE -#define IS_SYSCFG_VREFBUF_TRIMMING IS_VREFBUF_TRIMMING -#define IS_SYSCFG_FASTMODEPLUS IS_SBS_FASTMODEPLUS -#define IS_SYSCFG_ITEMS_ATTRIBUTES IS_SBS_ITEMS_ATTRIBUTES -#define IS_SYSCFG_ATTRIBUTES IS_SBS_ATTRIBUTES -#define IS_SYSCFG_LOCK_ITEMS IS_SBS_LOCK_ITEMS - -#define HAL_SYSCFG_VREFBUF_VoltageScalingConfig HAL_VREFBUF_VoltageScalingConfig -#define HAL_SYSCFG_VREFBUF_HighImpedanceConfig HAL_VREFBUF_HighImpedanceConfig -#define HAL_SYSCFG_VREFBUF_TrimmingConfig HAL_VREFBUF_TrimmingConfig -#define HAL_SYSCFG_EnableVREFBUF HAL_EnableVREFBUF -#define HAL_SYSCFG_DisableVREFBUF HAL_DisableVREFBUF - -#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SBS_EnableIOAnalogSwitchBooster -#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SBS_DisableIOAnalogSwitchBooster -#define HAL_SYSCFG_ETHInterfaceSelect HAL_SBS_ETHInterfaceSelect - -#define HAL_SYSCFG_Lock HAL_SBS_Lock -#define HAL_SYSCFG_GetLock HAL_SBS_GetLock - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#define HAL_SYSCFG_ConfigAttributes HAL_SBS_ConfigAttributes -#define HAL_SYSCFG_GetConfigAttributes HAL_SBS_GetConfigAttributes -#endif /* __ARM_FEATURE_CMSE */ - -#endif /* STM32H5 */ - - -/** - * @} - */ - - -/** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose - * @{ - */ -#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) -#define FMC_NAND_PCC_WAIT_FEATURE_DISABLE FMC_NAND_WAIT_FEATURE_DISABLE -#define FMC_NAND_PCC_WAIT_FEATURE_ENABLE FMC_NAND_WAIT_FEATURE_ENABLE -#define FMC_NAND_PCC_MEM_BUS_WIDTH_8 FMC_NAND_MEM_BUS_WIDTH_8 -#define FMC_NAND_PCC_MEM_BUS_WIDTH_16 FMC_NAND_MEM_BUS_WIDTH_16 -#elif defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) -#define FMC_NAND_WAIT_FEATURE_DISABLE FMC_NAND_PCC_WAIT_FEATURE_DISABLE -#define FMC_NAND_WAIT_FEATURE_ENABLE FMC_NAND_PCC_WAIT_FEATURE_ENABLE -#define FMC_NAND_MEM_BUS_WIDTH_8 FMC_NAND_PCC_MEM_BUS_WIDTH_8 -#define FMC_NAND_MEM_BUS_WIDTH_16 FMC_NAND_PCC_MEM_BUS_WIDTH_16 -#endif -/** - * @} - */ - -/** @defgroup LL_FSMC_Aliased_Defines LL FSMC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define FSMC_NORSRAM_TYPEDEF FSMC_NORSRAM_TypeDef -#define FSMC_NORSRAM_EXTENDED_TYPEDEF FSMC_NORSRAM_EXTENDED_TypeDef -/** - * @} - */ - -/** @defgroup HAL_GPIO_Aliased_Macros HAL GPIO Aliased Macros maintained for legacy purpose - * @{ - */ -#define GET_GPIO_SOURCE GPIO_GET_INDEX -#define GET_GPIO_INDEX GPIO_GET_INDEX - -#if defined(STM32F4) -#define GPIO_AF12_SDMMC GPIO_AF12_SDIO -#define GPIO_AF12_SDMMC1 GPIO_AF12_SDIO -#endif - -#if defined(STM32F7) -#define GPIO_AF12_SDIO GPIO_AF12_SDMMC1 -#define GPIO_AF12_SDMMC GPIO_AF12_SDMMC1 -#endif - -#if defined(STM32L4) -#define GPIO_AF12_SDIO GPIO_AF12_SDMMC1 -#define GPIO_AF12_SDMMC GPIO_AF12_SDMMC1 -#endif - -#if defined(STM32H7) -#define GPIO_AF7_SDIO1 GPIO_AF7_SDMMC1 -#define GPIO_AF8_SDIO1 GPIO_AF8_SDMMC1 -#define GPIO_AF12_SDIO1 GPIO_AF12_SDMMC1 -#define GPIO_AF9_SDIO2 GPIO_AF9_SDMMC2 -#define GPIO_AF10_SDIO2 GPIO_AF10_SDMMC2 -#define GPIO_AF11_SDIO2 GPIO_AF11_SDMMC2 - -#if defined (STM32H743xx) || defined (STM32H753xx) || defined (STM32H750xx) || defined (STM32H742xx) || \ - defined (STM32H745xx) || defined (STM32H755xx) || defined (STM32H747xx) || defined (STM32H757xx) -#define GPIO_AF10_OTG2_HS GPIO_AF10_OTG2_FS -#define GPIO_AF10_OTG1_FS GPIO_AF10_OTG1_HS -#define GPIO_AF12_OTG2_FS GPIO_AF12_OTG1_FS -#endif /*STM32H743xx || STM32H753xx || STM32H750xx || STM32H742xx || STM32H745xx || STM32H755xx || STM32H747xx || \ - STM32H757xx */ -#endif /* STM32H7 */ - -#define GPIO_AF0_LPTIM GPIO_AF0_LPTIM1 -#define GPIO_AF1_LPTIM GPIO_AF1_LPTIM1 -#define GPIO_AF2_LPTIM GPIO_AF2_LPTIM1 - -#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || \ - defined(STM32G4) || defined(STM32H7) || defined(STM32WB) || defined(STM32U5) -#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW -#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM -#define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH -#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7 || STM32WB || STM32U5*/ - -#if defined(STM32L1) -#define GPIO_SPEED_VERY_LOW GPIO_SPEED_FREQ_LOW -#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_MEDIUM -#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_HIGH -#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L1 */ - -#if defined(STM32F0) || defined(STM32F3) || defined(STM32F1) -#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW -#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM -#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_HIGH -#endif /* STM32F0 || STM32F3 || STM32F1 */ - -#define GPIO_AF6_DFSDM GPIO_AF6_DFSDM1 - -#if defined(STM32U5) || defined(STM32H5) -#define GPIO_AF0_RTC_50Hz GPIO_AF0_RTC_50HZ -#endif /* STM32U5 || STM32H5 */ -#if defined(STM32U5) -#define GPIO_AF0_S2DSTOP GPIO_AF0_SRDSTOP -#define GPIO_AF11_LPGPIO GPIO_AF11_LPGPIO1 -#endif /* STM32U5 */ -/** - * @} - */ - -/** @defgroup HAL_GTZC_Aliased_Defines HAL GTZC Aliased Defines maintained for legacy purpose - * @{ - */ -#if defined(STM32U5) -#define GTZC_PERIPH_DCMI GTZC_PERIPH_DCMI_PSSI -#define GTZC_PERIPH_LTDC GTZC_PERIPH_LTDCUSB -#endif /* STM32U5 */ -#if defined(STM32H5) -#define GTZC_PERIPH_DAC12 GTZC_PERIPH_DAC1 -#define GTZC_PERIPH_ADC12 GTZC_PERIPH_ADC -#define GTZC_PERIPH_USBFS GTZC_PERIPH_USB -#endif /* STM32H5 */ -#if defined(STM32H5) || defined(STM32U5) -#define GTZC_MCPBB_NB_VCTR_REG_MAX GTZC_MPCBB_NB_VCTR_REG_MAX -#define GTZC_MCPBB_NB_LCK_VCTR_REG_MAX GTZC_MPCBB_NB_LCK_VCTR_REG_MAX -#define GTZC_MCPBB_SUPERBLOCK_UNLOCKED GTZC_MPCBB_SUPERBLOCK_UNLOCKED -#define GTZC_MCPBB_SUPERBLOCK_LOCKED GTZC_MPCBB_SUPERBLOCK_LOCKED -#define GTZC_MCPBB_BLOCK_NSEC GTZC_MPCBB_BLOCK_NSEC -#define GTZC_MCPBB_BLOCK_SEC GTZC_MPCBB_BLOCK_SEC -#define GTZC_MCPBB_BLOCK_NPRIV GTZC_MPCBB_BLOCK_NPRIV -#define GTZC_MCPBB_BLOCK_PRIV GTZC_MPCBB_BLOCK_PRIV -#define GTZC_MCPBB_LOCK_OFF GTZC_MPCBB_LOCK_OFF -#define GTZC_MCPBB_LOCK_ON GTZC_MPCBB_LOCK_ON -#endif /* STM32H5 || STM32U5 */ -/** - * @} - */ - -/** @defgroup HAL_HRTIM_Aliased_Macros HAL HRTIM Aliased Macros maintained for legacy purpose - * @{ - */ -#define HRTIM_TIMDELAYEDPROTECTION_DISABLED HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT1_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT1_EEV6 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT2_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT2_EEV6 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDBOTH_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDBOTH_EEV6 -#define HRTIM_TIMDELAYEDPROTECTION_BALANCED_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_BALANCED_EEV6 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT1_DEEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT1_DEEV7 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT2_DEEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT2_DEEV7 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDBOTH_EEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDBOTH_EEV7 -#define HRTIM_TIMDELAYEDPROTECTION_BALANCED_EEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_BALANCED_EEV7 - -#define __HAL_HRTIM_SetCounter __HAL_HRTIM_SETCOUNTER -#define __HAL_HRTIM_GetCounter __HAL_HRTIM_GETCOUNTER -#define __HAL_HRTIM_SetPeriod __HAL_HRTIM_SETPERIOD -#define __HAL_HRTIM_GetPeriod __HAL_HRTIM_GETPERIOD -#define __HAL_HRTIM_SetClockPrescaler __HAL_HRTIM_SETCLOCKPRESCALER -#define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER -#define __HAL_HRTIM_SetCompare __HAL_HRTIM_SETCOMPARE -#define __HAL_HRTIM_GetCompare __HAL_HRTIM_GETCOMPARE - -#if defined(STM32G4) -#define HAL_HRTIM_ExternalEventCounterConfig HAL_HRTIM_ExtEventCounterConfig -#define HAL_HRTIM_ExternalEventCounterEnable HAL_HRTIM_ExtEventCounterEnable -#define HAL_HRTIM_ExternalEventCounterDisable HAL_HRTIM_ExtEventCounterDisable -#define HAL_HRTIM_ExternalEventCounterReset HAL_HRTIM_ExtEventCounterReset -#define HRTIM_TIMEEVENT_A HRTIM_EVENTCOUNTER_A -#define HRTIM_TIMEEVENT_B HRTIM_EVENTCOUNTER_B -#define HRTIM_TIMEEVENTRESETMODE_UNCONDITIONAL HRTIM_EVENTCOUNTER_RSTMODE_UNCONDITIONAL -#define HRTIM_TIMEEVENTRESETMODE_CONDITIONAL HRTIM_EVENTCOUNTER_RSTMODE_CONDITIONAL -#endif /* STM32G4 */ - -#if defined(STM32H7) -#define HRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 - -#define HRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 -#endif /* STM32H7 */ - -#if defined(STM32F3) -/** @brief Constants defining available sources associated to external events. - */ -#define HRTIM_EVENTSRC_1 (0x00000000U) -#define HRTIM_EVENTSRC_2 (HRTIM_EECR1_EE1SRC_0) -#define HRTIM_EVENTSRC_3 (HRTIM_EECR1_EE1SRC_1) -#define HRTIM_EVENTSRC_4 (HRTIM_EECR1_EE1SRC_1 | HRTIM_EECR1_EE1SRC_0) - -/** @brief Constants defining the DLL calibration periods (in micro seconds) - */ -#define HRTIM_CALIBRATIONRATE_7300 0x00000000U -#define HRTIM_CALIBRATIONRATE_910 (HRTIM_DLLCR_CALRTE_0) -#define HRTIM_CALIBRATIONRATE_114 (HRTIM_DLLCR_CALRTE_1) -#define HRTIM_CALIBRATIONRATE_14 (HRTIM_DLLCR_CALRTE_1 | HRTIM_DLLCR_CALRTE_0) - -#endif /* STM32F3 */ -/** - * @} - */ - -/** @defgroup HAL_I2C_Aliased_Defines HAL I2C Aliased Defines maintained for legacy purpose - * @{ - */ -#define I2C_DUALADDRESS_DISABLED I2C_DUALADDRESS_DISABLE -#define I2C_DUALADDRESS_ENABLED I2C_DUALADDRESS_ENABLE -#define I2C_GENERALCALL_DISABLED I2C_GENERALCALL_DISABLE -#define I2C_GENERALCALL_ENABLED I2C_GENERALCALL_ENABLE -#define I2C_NOSTRETCH_DISABLED I2C_NOSTRETCH_DISABLE -#define I2C_NOSTRETCH_ENABLED I2C_NOSTRETCH_ENABLE -#define I2C_ANALOGFILTER_ENABLED I2C_ANALOGFILTER_ENABLE -#define I2C_ANALOGFILTER_DISABLED I2C_ANALOGFILTER_DISABLE -#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32G0) || defined(STM32L4) || \ - defined(STM32L1) || defined(STM32F7) -#define HAL_I2C_STATE_MEM_BUSY_TX HAL_I2C_STATE_BUSY_TX -#define HAL_I2C_STATE_MEM_BUSY_RX HAL_I2C_STATE_BUSY_RX -#define HAL_I2C_STATE_MASTER_BUSY_TX HAL_I2C_STATE_BUSY_TX -#define HAL_I2C_STATE_MASTER_BUSY_RX HAL_I2C_STATE_BUSY_RX -#define HAL_I2C_STATE_SLAVE_BUSY_TX HAL_I2C_STATE_BUSY_TX -#define HAL_I2C_STATE_SLAVE_BUSY_RX HAL_I2C_STATE_BUSY_RX -#endif -/** - * @} - */ - -/** @defgroup HAL_IRDA_Aliased_Defines HAL IRDA Aliased Defines maintained for legacy purpose - * @{ - */ -#define IRDA_ONE_BIT_SAMPLE_DISABLED IRDA_ONE_BIT_SAMPLE_DISABLE -#define IRDA_ONE_BIT_SAMPLE_ENABLED IRDA_ONE_BIT_SAMPLE_ENABLE - -/** - * @} - */ - -/** @defgroup HAL_IWDG_Aliased_Defines HAL IWDG Aliased Defines maintained for legacy purpose - * @{ - */ -#define KR_KEY_RELOAD IWDG_KEY_RELOAD -#define KR_KEY_ENABLE IWDG_KEY_ENABLE -#define KR_KEY_EWA IWDG_KEY_WRITE_ACCESS_ENABLE -#define KR_KEY_DWA IWDG_KEY_WRITE_ACCESS_DISABLE -/** - * @} - */ - -/** @defgroup HAL_LPTIM_Aliased_Defines HAL LPTIM Aliased Defines maintained for legacy purpose - * @{ - */ - -#define LPTIM_CLOCKSAMPLETIME_DIRECTTRANSISTION LPTIM_CLOCKSAMPLETIME_DIRECTTRANSITION -#define LPTIM_CLOCKSAMPLETIME_2TRANSISTIONS LPTIM_CLOCKSAMPLETIME_2TRANSITIONS -#define LPTIM_CLOCKSAMPLETIME_4TRANSISTIONS LPTIM_CLOCKSAMPLETIME_4TRANSITIONS -#define LPTIM_CLOCKSAMPLETIME_8TRANSISTIONS LPTIM_CLOCKSAMPLETIME_8TRANSITIONS - -#define LPTIM_CLOCKPOLARITY_RISINGEDGE LPTIM_CLOCKPOLARITY_RISING -#define LPTIM_CLOCKPOLARITY_FALLINGEDGE LPTIM_CLOCKPOLARITY_FALLING -#define LPTIM_CLOCKPOLARITY_BOTHEDGES LPTIM_CLOCKPOLARITY_RISING_FALLING - -#define LPTIM_TRIGSAMPLETIME_DIRECTTRANSISTION LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION -#define LPTIM_TRIGSAMPLETIME_2TRANSISTIONS LPTIM_TRIGSAMPLETIME_2TRANSITIONS -#define LPTIM_TRIGSAMPLETIME_4TRANSISTIONS LPTIM_TRIGSAMPLETIME_4TRANSITIONS -#define LPTIM_TRIGSAMPLETIME_8TRANSISTIONS LPTIM_TRIGSAMPLETIME_8TRANSITIONS - -/* The following 3 definition have also been present in a temporary version of lptim.h */ -/* They need to be renamed also to the right name, just in case */ -#define LPTIM_TRIGSAMPLETIME_2TRANSITION LPTIM_TRIGSAMPLETIME_2TRANSITIONS -#define LPTIM_TRIGSAMPLETIME_4TRANSITION LPTIM_TRIGSAMPLETIME_4TRANSITIONS -#define LPTIM_TRIGSAMPLETIME_8TRANSITION LPTIM_TRIGSAMPLETIME_8TRANSITIONS - - -/** @defgroup HAL_LPTIM_Aliased_Defines HAL LPTIM Aliased Defines maintained for legacy purpose - * @{ - */ -#define HAL_LPTIM_ReadCompare HAL_LPTIM_ReadCapturedValue -/** - * @} - */ - -#if defined(STM32U5) -#define LPTIM_ISR_CC1 LPTIM_ISR_CC1IF -#define LPTIM_ISR_CC2 LPTIM_ISR_CC2IF -#define LPTIM_CHANNEL_ALL 0x00000000U -#endif /* STM32U5 */ -/** - * @} - */ - -/** @defgroup HAL_NAND_Aliased_Defines HAL NAND Aliased Defines maintained for legacy purpose - * @{ - */ -#define HAL_NAND_Read_Page HAL_NAND_Read_Page_8b -#define HAL_NAND_Write_Page HAL_NAND_Write_Page_8b -#define HAL_NAND_Read_SpareArea HAL_NAND_Read_SpareArea_8b -#define HAL_NAND_Write_SpareArea HAL_NAND_Write_SpareArea_8b - -#define NAND_AddressTypedef NAND_AddressTypeDef - -#define __ARRAY_ADDRESS ARRAY_ADDRESS -#define __ADDR_1st_CYCLE ADDR_1ST_CYCLE -#define __ADDR_2nd_CYCLE ADDR_2ND_CYCLE -#define __ADDR_3rd_CYCLE ADDR_3RD_CYCLE -#define __ADDR_4th_CYCLE ADDR_4TH_CYCLE -/** - * @} - */ - -/** @defgroup HAL_NOR_Aliased_Defines HAL NOR Aliased Defines maintained for legacy purpose - * @{ - */ -#define NOR_StatusTypedef HAL_NOR_StatusTypeDef -#define NOR_SUCCESS HAL_NOR_STATUS_SUCCESS -#define NOR_ONGOING HAL_NOR_STATUS_ONGOING -#define NOR_ERROR HAL_NOR_STATUS_ERROR -#define NOR_TIMEOUT HAL_NOR_STATUS_TIMEOUT - -#define __NOR_WRITE NOR_WRITE -#define __NOR_ADDR_SHIFT NOR_ADDR_SHIFT -/** - * @} - */ - -/** @defgroup HAL_OPAMP_Aliased_Defines HAL OPAMP Aliased Defines maintained for legacy purpose - * @{ - */ - -#define OPAMP_NONINVERTINGINPUT_VP0 OPAMP_NONINVERTINGINPUT_IO0 -#define OPAMP_NONINVERTINGINPUT_VP1 OPAMP_NONINVERTINGINPUT_IO1 -#define OPAMP_NONINVERTINGINPUT_VP2 OPAMP_NONINVERTINGINPUT_IO2 -#define OPAMP_NONINVERTINGINPUT_VP3 OPAMP_NONINVERTINGINPUT_IO3 - -#define OPAMP_SEC_NONINVERTINGINPUT_VP0 OPAMP_SEC_NONINVERTINGINPUT_IO0 -#define OPAMP_SEC_NONINVERTINGINPUT_VP1 OPAMP_SEC_NONINVERTINGINPUT_IO1 -#define OPAMP_SEC_NONINVERTINGINPUT_VP2 OPAMP_SEC_NONINVERTINGINPUT_IO2 -#define OPAMP_SEC_NONINVERTINGINPUT_VP3 OPAMP_SEC_NONINVERTINGINPUT_IO3 - -#define OPAMP_INVERTINGINPUT_VM0 OPAMP_INVERTINGINPUT_IO0 -#define OPAMP_INVERTINGINPUT_VM1 OPAMP_INVERTINGINPUT_IO1 - -#define IOPAMP_INVERTINGINPUT_VM0 OPAMP_INVERTINGINPUT_IO0 -#define IOPAMP_INVERTINGINPUT_VM1 OPAMP_INVERTINGINPUT_IO1 - -#define OPAMP_SEC_INVERTINGINPUT_VM0 OPAMP_SEC_INVERTINGINPUT_IO0 -#define OPAMP_SEC_INVERTINGINPUT_VM1 OPAMP_SEC_INVERTINGINPUT_IO1 - -#define OPAMP_INVERTINGINPUT_VINM OPAMP_SEC_INVERTINGINPUT_IO1 - -#define OPAMP_PGACONNECT_NO OPAMP_PGA_CONNECT_INVERTINGINPUT_NO -#define OPAMP_PGACONNECT_VM0 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0 -#define OPAMP_PGACONNECT_VM1 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1 - -#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5) || defined(STM32H7) || defined(STM32G4) || defined(STM32U5) -#define HAL_OPAMP_MSP_INIT_CB_ID HAL_OPAMP_MSPINIT_CB_ID -#define HAL_OPAMP_MSP_DEINIT_CB_ID HAL_OPAMP_MSPDEINIT_CB_ID -#endif - -#if defined(STM32L4) || defined(STM32L5) -#define OPAMP_POWERMODE_NORMAL OPAMP_POWERMODE_NORMALPOWER -#elif defined(STM32G4) -#define OPAMP_POWERMODE_NORMAL OPAMP_POWERMODE_NORMALSPEED -#endif - -/** - * @} - */ - -/** @defgroup HAL_I2S_Aliased_Defines HAL I2S Aliased Defines maintained for legacy purpose - * @{ - */ -#define I2S_STANDARD_PHILLIPS I2S_STANDARD_PHILIPS - -#if defined(STM32H7) -#define I2S_IT_TXE I2S_IT_TXP -#define I2S_IT_RXNE I2S_IT_RXP - -#define I2S_FLAG_TXE I2S_FLAG_TXP -#define I2S_FLAG_RXNE I2S_FLAG_RXP -#endif - -#if defined(STM32F7) -#define I2S_CLOCK_SYSCLK I2S_CLOCK_PLL -#endif -/** - * @} - */ - -/** @defgroup HAL_PCCARD_Aliased_Defines HAL PCCARD Aliased Defines maintained for legacy purpose - * @{ - */ - -/* Compact Flash-ATA registers description */ -#define CF_DATA ATA_DATA -#define CF_SECTOR_COUNT ATA_SECTOR_COUNT -#define CF_SECTOR_NUMBER ATA_SECTOR_NUMBER -#define CF_CYLINDER_LOW ATA_CYLINDER_LOW -#define CF_CYLINDER_HIGH ATA_CYLINDER_HIGH -#define CF_CARD_HEAD ATA_CARD_HEAD -#define CF_STATUS_CMD ATA_STATUS_CMD -#define CF_STATUS_CMD_ALTERNATE ATA_STATUS_CMD_ALTERNATE -#define CF_COMMON_DATA_AREA ATA_COMMON_DATA_AREA - -/* Compact Flash-ATA commands */ -#define CF_READ_SECTOR_CMD ATA_READ_SECTOR_CMD -#define CF_WRITE_SECTOR_CMD ATA_WRITE_SECTOR_CMD -#define CF_ERASE_SECTOR_CMD ATA_ERASE_SECTOR_CMD -#define CF_IDENTIFY_CMD ATA_IDENTIFY_CMD - -#define PCCARD_StatusTypedef HAL_PCCARD_StatusTypeDef -#define PCCARD_SUCCESS HAL_PCCARD_STATUS_SUCCESS -#define PCCARD_ONGOING HAL_PCCARD_STATUS_ONGOING -#define PCCARD_ERROR HAL_PCCARD_STATUS_ERROR -#define PCCARD_TIMEOUT HAL_PCCARD_STATUS_TIMEOUT -/** - * @} - */ - -/** @defgroup HAL_RTC_Aliased_Defines HAL RTC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define FORMAT_BIN RTC_FORMAT_BIN -#define FORMAT_BCD RTC_FORMAT_BCD - -#define RTC_ALARMSUBSECONDMASK_None RTC_ALARMSUBSECONDMASK_NONE -#define RTC_TAMPERERASEBACKUP_DISABLED RTC_TAMPER_ERASE_BACKUP_DISABLE -#define RTC_TAMPERMASK_FLAG_DISABLED RTC_TAMPERMASK_FLAG_DISABLE -#define RTC_TAMPERMASK_FLAG_ENABLED RTC_TAMPERMASK_FLAG_ENABLE - -#define RTC_MASKTAMPERFLAG_DISABLED RTC_TAMPERMASK_FLAG_DISABLE -#define RTC_MASKTAMPERFLAG_ENABLED RTC_TAMPERMASK_FLAG_ENABLE -#define RTC_TAMPERERASEBACKUP_ENABLED RTC_TAMPER_ERASE_BACKUP_ENABLE -#define RTC_TAMPER1_2_INTERRUPT RTC_ALL_TAMPER_INTERRUPT -#define RTC_TAMPER1_2_3_INTERRUPT RTC_ALL_TAMPER_INTERRUPT - -#define RTC_TIMESTAMPPIN_PC13 RTC_TIMESTAMPPIN_DEFAULT -#define RTC_TIMESTAMPPIN_PA0 RTC_TIMESTAMPPIN_POS1 -#define RTC_TIMESTAMPPIN_PI8 RTC_TIMESTAMPPIN_POS1 -#define RTC_TIMESTAMPPIN_PC1 RTC_TIMESTAMPPIN_POS2 - -#define RTC_OUTPUT_REMAP_PC13 RTC_OUTPUT_REMAP_NONE -#define RTC_OUTPUT_REMAP_PB14 RTC_OUTPUT_REMAP_POS1 -#define RTC_OUTPUT_REMAP_PB2 RTC_OUTPUT_REMAP_POS1 - -#define RTC_TAMPERPIN_PC13 RTC_TAMPERPIN_DEFAULT -#define RTC_TAMPERPIN_PA0 RTC_TAMPERPIN_POS1 -#define RTC_TAMPERPIN_PI8 RTC_TAMPERPIN_POS1 - -#if defined(STM32H5) || defined(STM32H7RS) -#define TAMP_SECRETDEVICE_ERASE_NONE TAMP_DEVICESECRETS_ERASE_NONE -#define TAMP_SECRETDEVICE_ERASE_BKP_SRAM TAMP_DEVICESECRETS_ERASE_BKPSRAM -#endif /* STM32H5 || STM32H7RS */ - -#if defined(STM32WBA) -#define TAMP_SECRETDEVICE_ERASE_NONE TAMP_DEVICESECRETS_ERASE_NONE -#define TAMP_SECRETDEVICE_ERASE_SRAM2 TAMP_DEVICESECRETS_ERASE_SRAM2 -#define TAMP_SECRETDEVICE_ERASE_RHUK TAMP_DEVICESECRETS_ERASE_RHUK -#define TAMP_SECRETDEVICE_ERASE_ICACHE TAMP_DEVICESECRETS_ERASE_ICACHE -#define TAMP_SECRETDEVICE_ERASE_SAES_AES_HASH TAMP_DEVICESECRETS_ERASE_SAES_AES_HASH -#define TAMP_SECRETDEVICE_ERASE_PKA_SRAM TAMP_DEVICESECRETS_ERASE_PKA_SRAM -#define TAMP_SECRETDEVICE_ERASE_ALL TAMP_DEVICESECRETS_ERASE_ALL -#endif /* STM32WBA */ - -#if defined(STM32H5) || defined(STM32WBA) || defined(STM32H7RS) -#define TAMP_SECRETDEVICE_ERASE_DISABLE TAMP_DEVICESECRETS_ERASE_NONE -#define TAMP_SECRETDEVICE_ERASE_ENABLE TAMP_SECRETDEVICE_ERASE_ALL -#endif /* STM32H5 || STM32WBA || STM32H7RS */ - -#if defined(STM32F7) -#define RTC_TAMPCR_TAMPXE RTC_TAMPER_ENABLE_BITS_MASK -#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_IT_ENABLE_BITS_MASK -#endif /* STM32F7 */ - -#if defined(STM32H7) -#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X -#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT -#endif /* STM32H7 */ - -#if defined(STM32F7) || defined(STM32H7) || defined(STM32L0) -#define RTC_TAMPER1_INTERRUPT RTC_IT_TAMP1 -#define RTC_TAMPER2_INTERRUPT RTC_IT_TAMP2 -#define RTC_TAMPER3_INTERRUPT RTC_IT_TAMP3 -#define RTC_ALL_TAMPER_INTERRUPT RTC_IT_TAMP -#endif /* STM32F7 || STM32H7 || STM32L0 */ - -/** - * @} - */ - - -/** @defgroup HAL_SMARTCARD_Aliased_Defines HAL SMARTCARD Aliased Defines maintained for legacy purpose - * @{ - */ -#define SMARTCARD_NACK_ENABLED SMARTCARD_NACK_ENABLE -#define SMARTCARD_NACK_DISABLED SMARTCARD_NACK_DISABLE - -#define SMARTCARD_ONEBIT_SAMPLING_DISABLED SMARTCARD_ONE_BIT_SAMPLE_DISABLE -#define SMARTCARD_ONEBIT_SAMPLING_ENABLED SMARTCARD_ONE_BIT_SAMPLE_ENABLE -#define SMARTCARD_ONEBIT_SAMPLING_DISABLE SMARTCARD_ONE_BIT_SAMPLE_DISABLE -#define SMARTCARD_ONEBIT_SAMPLING_ENABLE SMARTCARD_ONE_BIT_SAMPLE_ENABLE - -#define SMARTCARD_TIMEOUT_DISABLED SMARTCARD_TIMEOUT_DISABLE -#define SMARTCARD_TIMEOUT_ENABLED SMARTCARD_TIMEOUT_ENABLE - -#define SMARTCARD_LASTBIT_DISABLED SMARTCARD_LASTBIT_DISABLE -#define SMARTCARD_LASTBIT_ENABLED SMARTCARD_LASTBIT_ENABLE -/** - * @} - */ - - -/** @defgroup HAL_SMBUS_Aliased_Defines HAL SMBUS Aliased Defines maintained for legacy purpose - * @{ - */ -#define SMBUS_DUALADDRESS_DISABLED SMBUS_DUALADDRESS_DISABLE -#define SMBUS_DUALADDRESS_ENABLED SMBUS_DUALADDRESS_ENABLE -#define SMBUS_GENERALCALL_DISABLED SMBUS_GENERALCALL_DISABLE -#define SMBUS_GENERALCALL_ENABLED SMBUS_GENERALCALL_ENABLE -#define SMBUS_NOSTRETCH_DISABLED SMBUS_NOSTRETCH_DISABLE -#define SMBUS_NOSTRETCH_ENABLED SMBUS_NOSTRETCH_ENABLE -#define SMBUS_ANALOGFILTER_ENABLED SMBUS_ANALOGFILTER_ENABLE -#define SMBUS_ANALOGFILTER_DISABLED SMBUS_ANALOGFILTER_DISABLE -#define SMBUS_PEC_DISABLED SMBUS_PEC_DISABLE -#define SMBUS_PEC_ENABLED SMBUS_PEC_ENABLE -#define HAL_SMBUS_STATE_SLAVE_LISTEN HAL_SMBUS_STATE_LISTEN -/** - * @} - */ - -/** @defgroup HAL_SPI_Aliased_Defines HAL SPI Aliased Defines maintained for legacy purpose - * @{ - */ -#define SPI_TIMODE_DISABLED SPI_TIMODE_DISABLE -#define SPI_TIMODE_ENABLED SPI_TIMODE_ENABLE - -#define SPI_CRCCALCULATION_DISABLED SPI_CRCCALCULATION_DISABLE -#define SPI_CRCCALCULATION_ENABLED SPI_CRCCALCULATION_ENABLE - -#define SPI_NSS_PULSE_DISABLED SPI_NSS_PULSE_DISABLE -#define SPI_NSS_PULSE_ENABLED SPI_NSS_PULSE_ENABLE - -#if defined(STM32H7) - -#define SPI_FLAG_TXE SPI_FLAG_TXP -#define SPI_FLAG_RXNE SPI_FLAG_RXP - -#define SPI_IT_TXE SPI_IT_TXP -#define SPI_IT_RXNE SPI_IT_RXP - -#define SPI_FRLVL_EMPTY SPI_RX_FIFO_0PACKET -#define SPI_FRLVL_QUARTER_FULL SPI_RX_FIFO_1PACKET -#define SPI_FRLVL_HALF_FULL SPI_RX_FIFO_2PACKET -#define SPI_FRLVL_FULL SPI_RX_FIFO_3PACKET - -#endif /* STM32H7 */ - -/** - * @} - */ - -/** @defgroup HAL_TIM_Aliased_Defines HAL TIM Aliased Defines maintained for legacy purpose - * @{ - */ -#define CCER_CCxE_MASK TIM_CCER_CCxE_MASK -#define CCER_CCxNE_MASK TIM_CCER_CCxNE_MASK - -#define TIM_DMABase_CR1 TIM_DMABASE_CR1 -#define TIM_DMABase_CR2 TIM_DMABASE_CR2 -#define TIM_DMABase_SMCR TIM_DMABASE_SMCR -#define TIM_DMABase_DIER TIM_DMABASE_DIER -#define TIM_DMABase_SR TIM_DMABASE_SR -#define TIM_DMABase_EGR TIM_DMABASE_EGR -#define TIM_DMABase_CCMR1 TIM_DMABASE_CCMR1 -#define TIM_DMABase_CCMR2 TIM_DMABASE_CCMR2 -#define TIM_DMABase_CCER TIM_DMABASE_CCER -#define TIM_DMABase_CNT TIM_DMABASE_CNT -#define TIM_DMABase_PSC TIM_DMABASE_PSC -#define TIM_DMABase_ARR TIM_DMABASE_ARR -#define TIM_DMABase_RCR TIM_DMABASE_RCR -#define TIM_DMABase_CCR1 TIM_DMABASE_CCR1 -#define TIM_DMABase_CCR2 TIM_DMABASE_CCR2 -#define TIM_DMABase_CCR3 TIM_DMABASE_CCR3 -#define TIM_DMABase_CCR4 TIM_DMABASE_CCR4 -#define TIM_DMABase_BDTR TIM_DMABASE_BDTR -#define TIM_DMABase_DCR TIM_DMABASE_DCR -#define TIM_DMABase_DMAR TIM_DMABASE_DMAR -#define TIM_DMABase_OR1 TIM_DMABASE_OR1 -#define TIM_DMABase_CCMR3 TIM_DMABASE_CCMR3 -#define TIM_DMABase_CCR5 TIM_DMABASE_CCR5 -#define TIM_DMABase_CCR6 TIM_DMABASE_CCR6 -#define TIM_DMABase_OR2 TIM_DMABASE_OR2 -#define TIM_DMABase_OR3 TIM_DMABASE_OR3 -#define TIM_DMABase_OR TIM_DMABASE_OR - -#define TIM_EventSource_Update TIM_EVENTSOURCE_UPDATE -#define TIM_EventSource_CC1 TIM_EVENTSOURCE_CC1 -#define TIM_EventSource_CC2 TIM_EVENTSOURCE_CC2 -#define TIM_EventSource_CC3 TIM_EVENTSOURCE_CC3 -#define TIM_EventSource_CC4 TIM_EVENTSOURCE_CC4 -#define TIM_EventSource_COM TIM_EVENTSOURCE_COM -#define TIM_EventSource_Trigger TIM_EVENTSOURCE_TRIGGER -#define TIM_EventSource_Break TIM_EVENTSOURCE_BREAK -#define TIM_EventSource_Break2 TIM_EVENTSOURCE_BREAK2 - -#define TIM_DMABurstLength_1Transfer TIM_DMABURSTLENGTH_1TRANSFER -#define TIM_DMABurstLength_2Transfers TIM_DMABURSTLENGTH_2TRANSFERS -#define TIM_DMABurstLength_3Transfers TIM_DMABURSTLENGTH_3TRANSFERS -#define TIM_DMABurstLength_4Transfers TIM_DMABURSTLENGTH_4TRANSFERS -#define TIM_DMABurstLength_5Transfers TIM_DMABURSTLENGTH_5TRANSFERS -#define TIM_DMABurstLength_6Transfers TIM_DMABURSTLENGTH_6TRANSFERS -#define TIM_DMABurstLength_7Transfers TIM_DMABURSTLENGTH_7TRANSFERS -#define TIM_DMABurstLength_8Transfers TIM_DMABURSTLENGTH_8TRANSFERS -#define TIM_DMABurstLength_9Transfers TIM_DMABURSTLENGTH_9TRANSFERS -#define TIM_DMABurstLength_10Transfers TIM_DMABURSTLENGTH_10TRANSFERS -#define TIM_DMABurstLength_11Transfers TIM_DMABURSTLENGTH_11TRANSFERS -#define TIM_DMABurstLength_12Transfers TIM_DMABURSTLENGTH_12TRANSFERS -#define TIM_DMABurstLength_13Transfers TIM_DMABURSTLENGTH_13TRANSFERS -#define TIM_DMABurstLength_14Transfers TIM_DMABURSTLENGTH_14TRANSFERS -#define TIM_DMABurstLength_15Transfers TIM_DMABURSTLENGTH_15TRANSFERS -#define TIM_DMABurstLength_16Transfers TIM_DMABURSTLENGTH_16TRANSFERS -#define TIM_DMABurstLength_17Transfers TIM_DMABURSTLENGTH_17TRANSFERS -#define TIM_DMABurstLength_18Transfers TIM_DMABURSTLENGTH_18TRANSFERS - -#if defined(STM32L0) -#define TIM22_TI1_GPIO1 TIM22_TI1_GPIO -#define TIM22_TI1_GPIO2 TIM22_TI1_GPIO -#endif - -#if defined(STM32F3) -#define IS_TIM_HALL_INTERFACE_INSTANCE IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE -#endif - -#if defined(STM32H7) -#define TIM_TIM1_ETR_COMP1_OUT TIM_TIM1_ETR_COMP1 -#define TIM_TIM1_ETR_COMP2_OUT TIM_TIM1_ETR_COMP2 -#define TIM_TIM8_ETR_COMP1_OUT TIM_TIM8_ETR_COMP1 -#define TIM_TIM8_ETR_COMP2_OUT TIM_TIM8_ETR_COMP2 -#define TIM_TIM2_ETR_COMP1_OUT TIM_TIM2_ETR_COMP1 -#define TIM_TIM2_ETR_COMP2_OUT TIM_TIM2_ETR_COMP2 -#define TIM_TIM3_ETR_COMP1_OUT TIM_TIM3_ETR_COMP1 -#define TIM_TIM1_TI1_COMP1_OUT TIM_TIM1_TI1_COMP1 -#define TIM_TIM8_TI1_COMP2_OUT TIM_TIM8_TI1_COMP2 -#define TIM_TIM2_TI4_COMP1_OUT TIM_TIM2_TI4_COMP1 -#define TIM_TIM2_TI4_COMP2_OUT TIM_TIM2_TI4_COMP2 -#define TIM_TIM2_TI4_COMP1COMP2_OUT TIM_TIM2_TI4_COMP1_COMP2 -#define TIM_TIM3_TI1_COMP1_OUT TIM_TIM3_TI1_COMP1 -#define TIM_TIM3_TI1_COMP2_OUT TIM_TIM3_TI1_COMP2 -#define TIM_TIM3_TI1_COMP1COMP2_OUT TIM_TIM3_TI1_COMP1_COMP2 -#endif - -#if defined(STM32U5) -#define OCREF_CLEAR_SELECT_Pos OCREF_CLEAR_SELECT_POS -#define OCREF_CLEAR_SELECT_Msk OCREF_CLEAR_SELECT_MSK -#endif -/** - * @} - */ - -/** @defgroup HAL_TSC_Aliased_Defines HAL TSC Aliased Defines maintained for legacy purpose - * @{ - */ -#define TSC_SYNC_POL_FALL TSC_SYNC_POLARITY_FALLING -#define TSC_SYNC_POL_RISE_HIGH TSC_SYNC_POLARITY_RISING -/** - * @} - */ - -/** @defgroup HAL_UART_Aliased_Defines HAL UART Aliased Defines maintained for legacy purpose - * @{ - */ -#define UART_ONEBIT_SAMPLING_DISABLED UART_ONE_BIT_SAMPLE_DISABLE -#define UART_ONEBIT_SAMPLING_ENABLED UART_ONE_BIT_SAMPLE_ENABLE -#define UART_ONE_BIT_SAMPLE_DISABLED UART_ONE_BIT_SAMPLE_DISABLE -#define UART_ONE_BIT_SAMPLE_ENABLED UART_ONE_BIT_SAMPLE_ENABLE - -#define __HAL_UART_ONEBIT_ENABLE __HAL_UART_ONE_BIT_SAMPLE_ENABLE -#define __HAL_UART_ONEBIT_DISABLE __HAL_UART_ONE_BIT_SAMPLE_DISABLE - -#define __DIV_SAMPLING16 UART_DIV_SAMPLING16 -#define __DIVMANT_SAMPLING16 UART_DIVMANT_SAMPLING16 -#define __DIVFRAQ_SAMPLING16 UART_DIVFRAQ_SAMPLING16 -#define __UART_BRR_SAMPLING16 UART_BRR_SAMPLING16 - -#define __DIV_SAMPLING8 UART_DIV_SAMPLING8 -#define __DIVMANT_SAMPLING8 UART_DIVMANT_SAMPLING8 -#define __DIVFRAQ_SAMPLING8 UART_DIVFRAQ_SAMPLING8 -#define __UART_BRR_SAMPLING8 UART_BRR_SAMPLING8 - -#define __DIV_LPUART UART_DIV_LPUART - -#define UART_WAKEUPMETHODE_IDLELINE UART_WAKEUPMETHOD_IDLELINE -#define UART_WAKEUPMETHODE_ADDRESSMARK UART_WAKEUPMETHOD_ADDRESSMARK - -/** - * @} - */ - - -/** @defgroup HAL_USART_Aliased_Defines HAL USART Aliased Defines maintained for legacy purpose - * @{ - */ - -#define USART_CLOCK_DISABLED USART_CLOCK_DISABLE -#define USART_CLOCK_ENABLED USART_CLOCK_ENABLE - -#define USARTNACK_ENABLED USART_NACK_ENABLE -#define USARTNACK_DISABLED USART_NACK_DISABLE -/** - * @} - */ - -/** @defgroup HAL_WWDG_Aliased_Defines HAL WWDG Aliased Defines maintained for legacy purpose - * @{ - */ -#define CFR_BASE WWDG_CFR_BASE - -/** - * @} - */ - -/** @defgroup HAL_CAN_Aliased_Defines HAL CAN Aliased Defines maintained for legacy purpose - * @{ - */ -#define CAN_FilterFIFO0 CAN_FILTER_FIFO0 -#define CAN_FilterFIFO1 CAN_FILTER_FIFO1 -#define CAN_IT_RQCP0 CAN_IT_TME -#define CAN_IT_RQCP1 CAN_IT_TME -#define CAN_IT_RQCP2 CAN_IT_TME -#define INAK_TIMEOUT CAN_TIMEOUT_VALUE -#define SLAK_TIMEOUT CAN_TIMEOUT_VALUE -#define CAN_TXSTATUS_FAILED ((uint8_t)0x00U) -#define CAN_TXSTATUS_OK ((uint8_t)0x01U) -#define CAN_TXSTATUS_PENDING ((uint8_t)0x02U) - -/** - * @} - */ - -/** @defgroup HAL_ETH_Aliased_Defines HAL ETH Aliased Defines maintained for legacy purpose - * @{ - */ - -#define VLAN_TAG ETH_VLAN_TAG -#define MIN_ETH_PAYLOAD ETH_MIN_ETH_PAYLOAD -#define MAX_ETH_PAYLOAD ETH_MAX_ETH_PAYLOAD -#define JUMBO_FRAME_PAYLOAD ETH_JUMBO_FRAME_PAYLOAD -#define MACMIIAR_CR_MASK ETH_MACMIIAR_CR_MASK -#define MACCR_CLEAR_MASK ETH_MACCR_CLEAR_MASK -#define MACFCR_CLEAR_MASK ETH_MACFCR_CLEAR_MASK -#define DMAOMR_CLEAR_MASK ETH_DMAOMR_CLEAR_MASK - -#define ETH_MMCCR 0x00000100U -#define ETH_MMCRIR 0x00000104U -#define ETH_MMCTIR 0x00000108U -#define ETH_MMCRIMR 0x0000010CU -#define ETH_MMCTIMR 0x00000110U -#define ETH_MMCTGFSCCR 0x0000014CU -#define ETH_MMCTGFMSCCR 0x00000150U -#define ETH_MMCTGFCR 0x00000168U -#define ETH_MMCRFCECR 0x00000194U -#define ETH_MMCRFAECR 0x00000198U -#define ETH_MMCRGUFCR 0x000001C4U - -#define ETH_MAC_TXFIFO_FULL 0x02000000U /* Tx FIFO full */ -#define ETH_MAC_TXFIFONOT_EMPTY 0x01000000U /* Tx FIFO not empty */ -#define ETH_MAC_TXFIFO_WRITE_ACTIVE 0x00400000U /* Tx FIFO write active */ -#define ETH_MAC_TXFIFO_IDLE 0x00000000U /* Tx FIFO read status: Idle */ -#define ETH_MAC_TXFIFO_READ 0x00100000U /* Tx FIFO read status: Read (transferring data to - the MAC transmitter) */ -#define ETH_MAC_TXFIFO_WAITING 0x00200000U /* Tx FIFO read status: Waiting for TxStatus from - MAC transmitter */ -#define ETH_MAC_TXFIFO_WRITING 0x00300000U /* Tx FIFO read status: Writing the received TxStatus - or flushing the TxFIFO */ -#define ETH_MAC_TRANSMISSION_PAUSE 0x00080000U /* MAC transmitter in pause */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_IDLE 0x00000000U /* MAC transmit frame controller: Idle */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_WAITING 0x00020000U /* MAC transmit frame controller: Waiting for Status - of previous frame or IFG/backoff period to be over */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_GENRATING_PCF 0x00040000U /* MAC transmit frame controller: Generating and - transmitting a Pause control frame (in full duplex mode) */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_TRANSFERRING 0x00060000U /* MAC transmit frame controller: Transferring input - frame for transmission */ -#define ETH_MAC_MII_TRANSMIT_ACTIVE 0x00010000U /* MAC MII transmit engine active */ -#define ETH_MAC_RXFIFO_EMPTY 0x00000000U /* Rx FIFO fill level: empty */ -#define ETH_MAC_RXFIFO_BELOW_THRESHOLD 0x00000100U /* Rx FIFO fill level: fill-level below flow-control - de-activate threshold */ -#define ETH_MAC_RXFIFO_ABOVE_THRESHOLD 0x00000200U /* Rx FIFO fill level: fill-level above flow-control - activate threshold */ -#define ETH_MAC_RXFIFO_FULL 0x00000300U /* Rx FIFO fill level: full */ -#if defined(STM32F1) -#else -#define ETH_MAC_READCONTROLLER_IDLE 0x00000000U /* Rx FIFO read controller IDLE state */ -#define ETH_MAC_READCONTROLLER_READING_DATA 0x00000020U /* Rx FIFO read controller Reading frame data */ -#define ETH_MAC_READCONTROLLER_READING_STATUS 0x00000040U /* Rx FIFO read controller Reading frame status - (or time-stamp) */ -#endif -#define ETH_MAC_READCONTROLLER_FLUSHING 0x00000060U /* Rx FIFO read controller Flushing the frame data and - status */ -#define ETH_MAC_RXFIFO_WRITE_ACTIVE 0x00000010U /* Rx FIFO write controller active */ -#define ETH_MAC_SMALL_FIFO_NOTACTIVE 0x00000000U /* MAC small FIFO read / write controllers not active */ -#define ETH_MAC_SMALL_FIFO_READ_ACTIVE 0x00000002U /* MAC small FIFO read controller active */ -#define ETH_MAC_SMALL_FIFO_WRITE_ACTIVE 0x00000004U /* MAC small FIFO write controller active */ -#define ETH_MAC_SMALL_FIFO_RW_ACTIVE 0x00000006U /* MAC small FIFO read / write controllers active */ -#define ETH_MAC_MII_RECEIVE_PROTOCOL_ACTIVE 0x00000001U /* MAC MII receive protocol engine active */ - -#define ETH_TxPacketConfig ETH_TxPacketConfigTypeDef /* Transmit Packet Configuration structure definition */ - -/** - * @} - */ - -/** @defgroup HAL_DCMI_Aliased_Defines HAL DCMI Aliased Defines maintained for legacy purpose - * @{ - */ -#define HAL_DCMI_ERROR_OVF HAL_DCMI_ERROR_OVR -#define DCMI_IT_OVF DCMI_IT_OVR -#define DCMI_FLAG_OVFRI DCMI_FLAG_OVRRI -#define DCMI_FLAG_OVFMI DCMI_FLAG_OVRMI - -#define HAL_DCMI_ConfigCROP HAL_DCMI_ConfigCrop -#define HAL_DCMI_EnableCROP HAL_DCMI_EnableCrop -#define HAL_DCMI_DisableCROP HAL_DCMI_DisableCrop - -/** - * @} - */ - -#if defined(STM32L4) || defined(STM32F7) || defined(STM32F427xx) || defined(STM32F437xx) \ - || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) \ - || defined(STM32H7) -/** @defgroup HAL_DMA2D_Aliased_Defines HAL DMA2D Aliased Defines maintained for legacy purpose - * @{ - */ -#define DMA2D_ARGB8888 DMA2D_OUTPUT_ARGB8888 -#define DMA2D_RGB888 DMA2D_OUTPUT_RGB888 -#define DMA2D_RGB565 DMA2D_OUTPUT_RGB565 -#define DMA2D_ARGB1555 DMA2D_OUTPUT_ARGB1555 -#define DMA2D_ARGB4444 DMA2D_OUTPUT_ARGB4444 - -#define CM_ARGB8888 DMA2D_INPUT_ARGB8888 -#define CM_RGB888 DMA2D_INPUT_RGB888 -#define CM_RGB565 DMA2D_INPUT_RGB565 -#define CM_ARGB1555 DMA2D_INPUT_ARGB1555 -#define CM_ARGB4444 DMA2D_INPUT_ARGB4444 -#define CM_L8 DMA2D_INPUT_L8 -#define CM_AL44 DMA2D_INPUT_AL44 -#define CM_AL88 DMA2D_INPUT_AL88 -#define CM_L4 DMA2D_INPUT_L4 -#define CM_A8 DMA2D_INPUT_A8 -#define CM_A4 DMA2D_INPUT_A4 -/** - * @} - */ -#endif /* STM32L4 || STM32F7 || STM32F4 || STM32H7 */ - -#if defined(STM32L4) || defined(STM32F7) || defined(STM32F427xx) || defined(STM32F437xx) \ - || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) \ - || defined(STM32H7) || defined(STM32U5) -/** @defgroup DMA2D_Aliases DMA2D API Aliases - * @{ - */ -#define HAL_DMA2D_DisableCLUT HAL_DMA2D_CLUTLoading_Abort /*!< Aliased to HAL_DMA2D_CLUTLoading_Abort - for compatibility with legacy code */ -/** - * @} - */ - -#endif /* STM32L4 || STM32F7 || STM32F4 || STM32H7 || STM32U5 */ - -/** @defgroup HAL_PPP_Aliased_Defines HAL PPP Aliased Defines maintained for legacy purpose - * @{ - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup HAL_CRYP_Aliased_Functions HAL CRYP Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_CRYP_ComputationCpltCallback HAL_CRYPEx_ComputationCpltCallback -/** - * @} - */ - -/** @defgroup HAL_DCACHE_Aliased_Functions HAL DCACHE Aliased Functions maintained for legacy purpose - * @{ - */ - -#if defined(STM32U5) -#define HAL_DCACHE_CleanInvalidateByAddr HAL_DCACHE_CleanInvalidByAddr -#define HAL_DCACHE_CleanInvalidateByAddr_IT HAL_DCACHE_CleanInvalidByAddr_IT -#endif /* STM32U5 */ - -/** - * @} - */ - -#if !defined(STM32F2) -/** @defgroup HASH_alias HASH API alias - * @{ - */ -#define HAL_HASHEx_IRQHandler HAL_HASH_IRQHandler /*!< Redirection for compatibility with legacy code */ -/** - * - * @} - */ -#endif /* STM32F2 */ -/** @defgroup HAL_HASH_Aliased_Functions HAL HASH Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_HASH_STATETypeDef HAL_HASH_StateTypeDef -#define HAL_HASHPhaseTypeDef HAL_HASH_PhaseTypeDef -#define HAL_HMAC_MD5_Finish HAL_HASH_MD5_Finish -#define HAL_HMAC_SHA1_Finish HAL_HASH_SHA1_Finish -#define HAL_HMAC_SHA224_Finish HAL_HASH_SHA224_Finish -#define HAL_HMAC_SHA256_Finish HAL_HASH_SHA256_Finish - -/*HASH Algorithm Selection*/ - -#define HASH_AlgoSelection_SHA1 HASH_ALGOSELECTION_SHA1 -#define HASH_AlgoSelection_SHA224 HASH_ALGOSELECTION_SHA224 -#define HASH_AlgoSelection_SHA256 HASH_ALGOSELECTION_SHA256 -#define HASH_AlgoSelection_MD5 HASH_ALGOSELECTION_MD5 - -#define HASH_AlgoMode_HASH HASH_ALGOMODE_HASH -#define HASH_AlgoMode_HMAC HASH_ALGOMODE_HMAC - -#define HASH_HMACKeyType_ShortKey HASH_HMAC_KEYTYPE_SHORTKEY -#define HASH_HMACKeyType_LongKey HASH_HMAC_KEYTYPE_LONGKEY - -#if defined(STM32L4) || defined(STM32L5) || defined(STM32F2) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) - -#define HAL_HASH_MD5_Accumulate HAL_HASH_MD5_Accmlt -#define HAL_HASH_MD5_Accumulate_End HAL_HASH_MD5_Accmlt_End -#define HAL_HASH_MD5_Accumulate_IT HAL_HASH_MD5_Accmlt_IT -#define HAL_HASH_MD5_Accumulate_End_IT HAL_HASH_MD5_Accmlt_End_IT - -#define HAL_HASH_SHA1_Accumulate HAL_HASH_SHA1_Accmlt -#define HAL_HASH_SHA1_Accumulate_End HAL_HASH_SHA1_Accmlt_End -#define HAL_HASH_SHA1_Accumulate_IT HAL_HASH_SHA1_Accmlt_IT -#define HAL_HASH_SHA1_Accumulate_End_IT HAL_HASH_SHA1_Accmlt_End_IT - -#define HAL_HASHEx_SHA224_Accumulate HAL_HASHEx_SHA224_Accmlt -#define HAL_HASHEx_SHA224_Accumulate_End HAL_HASHEx_SHA224_Accmlt_End -#define HAL_HASHEx_SHA224_Accumulate_IT HAL_HASHEx_SHA224_Accmlt_IT -#define HAL_HASHEx_SHA224_Accumulate_End_IT HAL_HASHEx_SHA224_Accmlt_End_IT - -#define HAL_HASHEx_SHA256_Accumulate HAL_HASHEx_SHA256_Accmlt -#define HAL_HASHEx_SHA256_Accumulate_End HAL_HASHEx_SHA256_Accmlt_End -#define HAL_HASHEx_SHA256_Accumulate_IT HAL_HASHEx_SHA256_Accmlt_IT -#define HAL_HASHEx_SHA256_Accumulate_End_IT HAL_HASHEx_SHA256_Accmlt_End_IT - -#endif /* STM32L4 || STM32L5 || STM32F2 || STM32F4 || STM32F7 || STM32H7 */ -/** - * @} - */ - -/** @defgroup HAL_Aliased_Functions HAL Generic Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_EnableDBGSleepMode HAL_DBGMCU_EnableDBGSleepMode -#define HAL_DisableDBGSleepMode HAL_DBGMCU_DisableDBGSleepMode -#define HAL_EnableDBGStopMode HAL_DBGMCU_EnableDBGStopMode -#define HAL_DisableDBGStopMode HAL_DBGMCU_DisableDBGStopMode -#define HAL_EnableDBGStandbyMode HAL_DBGMCU_EnableDBGStandbyMode -#define HAL_DisableDBGStandbyMode HAL_DBGMCU_DisableDBGStandbyMode -#define HAL_DBG_LowPowerConfig(Periph, cmd) (((cmd\ - )==ENABLE)? HAL_DBGMCU_DBG_EnableLowPowerConfig(Periph) : \ - HAL_DBGMCU_DBG_DisableLowPowerConfig(Periph)) -#define HAL_VREFINT_OutputSelect HAL_SYSCFG_VREFINT_OutputSelect -#define HAL_Lock_Cmd(cmd) (((cmd)==ENABLE) ? HAL_SYSCFG_Enable_Lock_VREFINT() : HAL_SYSCFG_Disable_Lock_VREFINT()) -#if defined(STM32L0) -#else -#define HAL_VREFINT_Cmd(cmd) (((cmd)==ENABLE)? HAL_SYSCFG_EnableVREFINT() : HAL_SYSCFG_DisableVREFINT()) -#endif -#define HAL_ADC_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT()) -#define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd\ - )==ENABLE) ? HAL_ADCEx_EnableVREFINTTempSensor() : \ - HAL_ADCEx_DisableVREFINTTempSensor()) -#if defined(STM32H7A3xx) || defined(STM32H7B3xx) || defined(STM32H7B0xx) || defined(STM32H7A3xxQ) || \ - defined(STM32H7B3xxQ) || defined(STM32H7B0xxQ) -#define HAL_EnableSRDomainDBGStopMode HAL_EnableDomain3DBGStopMode -#define HAL_DisableSRDomainDBGStopMode HAL_DisableDomain3DBGStopMode -#define HAL_EnableSRDomainDBGStandbyMode HAL_EnableDomain3DBGStandbyMode -#define HAL_DisableSRDomainDBGStandbyMode HAL_DisableDomain3DBGStandbyMode -#endif /* STM32H7A3xx || STM32H7B3xx || STM32H7B0xx || STM32H7A3xxQ || STM32H7B3xxQ || STM32H7B0xxQ */ - -/** - * @} - */ - -/** @defgroup HAL_FLASH_Aliased_Functions HAL FLASH Aliased Functions maintained for legacy purpose - * @{ - */ -#define FLASH_HalfPageProgram HAL_FLASHEx_HalfPageProgram -#define FLASH_EnableRunPowerDown HAL_FLASHEx_EnableRunPowerDown -#define FLASH_DisableRunPowerDown HAL_FLASHEx_DisableRunPowerDown -#define HAL_DATA_EEPROMEx_Unlock HAL_FLASHEx_DATAEEPROM_Unlock -#define HAL_DATA_EEPROMEx_Lock HAL_FLASHEx_DATAEEPROM_Lock -#define HAL_DATA_EEPROMEx_Erase HAL_FLASHEx_DATAEEPROM_Erase -#define HAL_DATA_EEPROMEx_Program HAL_FLASHEx_DATAEEPROM_Program - -/** - * @} - */ - -/** @defgroup HAL_I2C_Aliased_Functions HAL I2C Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_I2CEx_AnalogFilter_Config HAL_I2CEx_ConfigAnalogFilter -#define HAL_I2CEx_DigitalFilter_Config HAL_I2CEx_ConfigDigitalFilter -#define HAL_FMPI2CEx_AnalogFilter_Config HAL_FMPI2CEx_ConfigAnalogFilter -#define HAL_FMPI2CEx_DigitalFilter_Config HAL_FMPI2CEx_ConfigDigitalFilter - -#define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd) == ENABLE)? \ - HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): \ - HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus)) - -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || \ - defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || \ - defined(STM32L4) || defined(STM32L5) || defined(STM32G4) || defined(STM32L1) -#define HAL_I2C_Master_Sequential_Transmit_IT HAL_I2C_Master_Seq_Transmit_IT -#define HAL_I2C_Master_Sequential_Receive_IT HAL_I2C_Master_Seq_Receive_IT -#define HAL_I2C_Slave_Sequential_Transmit_IT HAL_I2C_Slave_Seq_Transmit_IT -#define HAL_I2C_Slave_Sequential_Receive_IT HAL_I2C_Slave_Seq_Receive_IT -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 || - STM32L4 || STM32L5 || STM32G4 || STM32L1 */ -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || \ - defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4)|| defined(STM32L1) -#define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA -#define HAL_I2C_Master_Sequential_Receive_DMA HAL_I2C_Master_Seq_Receive_DMA -#define HAL_I2C_Slave_Sequential_Transmit_DMA HAL_I2C_Slave_Seq_Transmit_DMA -#define HAL_I2C_Slave_Sequential_Receive_DMA HAL_I2C_Slave_Seq_Receive_DMA -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 || STM32L1 */ - -#if defined(STM32F4) -#define HAL_FMPI2C_Master_Sequential_Transmit_IT HAL_FMPI2C_Master_Seq_Transmit_IT -#define HAL_FMPI2C_Master_Sequential_Receive_IT HAL_FMPI2C_Master_Seq_Receive_IT -#define HAL_FMPI2C_Slave_Sequential_Transmit_IT HAL_FMPI2C_Slave_Seq_Transmit_IT -#define HAL_FMPI2C_Slave_Sequential_Receive_IT HAL_FMPI2C_Slave_Seq_Receive_IT -#define HAL_FMPI2C_Master_Sequential_Transmit_DMA HAL_FMPI2C_Master_Seq_Transmit_DMA -#define HAL_FMPI2C_Master_Sequential_Receive_DMA HAL_FMPI2C_Master_Seq_Receive_DMA -#define HAL_FMPI2C_Slave_Sequential_Transmit_DMA HAL_FMPI2C_Slave_Seq_Transmit_DMA -#define HAL_FMPI2C_Slave_Sequential_Receive_DMA HAL_FMPI2C_Slave_Seq_Receive_DMA -#endif /* STM32F4 */ -/** - * @} - */ - -/** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose - * @{ - */ - -#if defined(STM32G0) -#define HAL_PWR_ConfigPVD HAL_PWREx_ConfigPVD -#define HAL_PWR_EnablePVD HAL_PWREx_EnablePVD -#define HAL_PWR_DisablePVD HAL_PWREx_DisablePVD -#define HAL_PWR_PVD_IRQHandler HAL_PWREx_PVD_IRQHandler -#endif -#define HAL_PWR_PVDConfig HAL_PWR_ConfigPVD -#define HAL_PWR_DisableBkUpReg HAL_PWREx_DisableBkUpReg -#define HAL_PWR_DisableFlashPowerDown HAL_PWREx_DisableFlashPowerDown -#define HAL_PWR_DisableVddio2Monitor HAL_PWREx_DisableVddio2Monitor -#define HAL_PWR_EnableBkUpReg HAL_PWREx_EnableBkUpReg -#define HAL_PWR_EnableFlashPowerDown HAL_PWREx_EnableFlashPowerDown -#define HAL_PWR_EnableVddio2Monitor HAL_PWREx_EnableVddio2Monitor -#define HAL_PWR_PVD_PVM_IRQHandler HAL_PWREx_PVD_PVM_IRQHandler -#define HAL_PWR_PVDLevelConfig HAL_PWR_ConfigPVD -#define HAL_PWR_Vddio2Monitor_IRQHandler HAL_PWREx_Vddio2Monitor_IRQHandler -#define HAL_PWR_Vddio2MonitorCallback HAL_PWREx_Vddio2MonitorCallback -#define HAL_PWREx_ActivateOverDrive HAL_PWREx_EnableOverDrive -#define HAL_PWREx_DeactivateOverDrive HAL_PWREx_DisableOverDrive -#define HAL_PWREx_DisableSDADCAnalog HAL_PWREx_DisableSDADC -#define HAL_PWREx_EnableSDADCAnalog HAL_PWREx_EnableSDADC -#define HAL_PWREx_PVMConfig HAL_PWREx_ConfigPVM - -#define PWR_MODE_NORMAL PWR_PVD_MODE_NORMAL -#define PWR_MODE_IT_RISING PWR_PVD_MODE_IT_RISING -#define PWR_MODE_IT_FALLING PWR_PVD_MODE_IT_FALLING -#define PWR_MODE_IT_RISING_FALLING PWR_PVD_MODE_IT_RISING_FALLING -#define PWR_MODE_EVENT_RISING PWR_PVD_MODE_EVENT_RISING -#define PWR_MODE_EVENT_FALLING PWR_PVD_MODE_EVENT_FALLING -#define PWR_MODE_EVENT_RISING_FALLING PWR_PVD_MODE_EVENT_RISING_FALLING - -#define CR_OFFSET_BB PWR_CR_OFFSET_BB -#define CSR_OFFSET_BB PWR_CSR_OFFSET_BB -#define PMODE_BIT_NUMBER VOS_BIT_NUMBER -#define CR_PMODE_BB CR_VOS_BB - -#define DBP_BitNumber DBP_BIT_NUMBER -#define PVDE_BitNumber PVDE_BIT_NUMBER -#define PMODE_BitNumber PMODE_BIT_NUMBER -#define EWUP_BitNumber EWUP_BIT_NUMBER -#define FPDS_BitNumber FPDS_BIT_NUMBER -#define ODEN_BitNumber ODEN_BIT_NUMBER -#define ODSWEN_BitNumber ODSWEN_BIT_NUMBER -#define MRLVDS_BitNumber MRLVDS_BIT_NUMBER -#define LPLVDS_BitNumber LPLVDS_BIT_NUMBER -#define BRE_BitNumber BRE_BIT_NUMBER - -#define PWR_MODE_EVT PWR_PVD_MODE_NORMAL - -#if defined (STM32U5) -#define PWR_SRAM1_PAGE1_STOP_RETENTION PWR_SRAM1_PAGE1_STOP -#define PWR_SRAM1_PAGE2_STOP_RETENTION PWR_SRAM1_PAGE2_STOP -#define PWR_SRAM1_PAGE3_STOP_RETENTION PWR_SRAM1_PAGE3_STOP -#define PWR_SRAM1_PAGE4_STOP_RETENTION PWR_SRAM1_PAGE4_STOP -#define PWR_SRAM1_PAGE5_STOP_RETENTION PWR_SRAM1_PAGE5_STOP -#define PWR_SRAM1_PAGE6_STOP_RETENTION PWR_SRAM1_PAGE6_STOP -#define PWR_SRAM1_PAGE7_STOP_RETENTION PWR_SRAM1_PAGE7_STOP -#define PWR_SRAM1_PAGE8_STOP_RETENTION PWR_SRAM1_PAGE8_STOP -#define PWR_SRAM1_PAGE9_STOP_RETENTION PWR_SRAM1_PAGE9_STOP -#define PWR_SRAM1_PAGE10_STOP_RETENTION PWR_SRAM1_PAGE10_STOP -#define PWR_SRAM1_PAGE11_STOP_RETENTION PWR_SRAM1_PAGE11_STOP -#define PWR_SRAM1_PAGE12_STOP_RETENTION PWR_SRAM1_PAGE12_STOP -#define PWR_SRAM1_FULL_STOP_RETENTION PWR_SRAM1_FULL_STOP - -#define PWR_SRAM2_PAGE1_STOP_RETENTION PWR_SRAM2_PAGE1_STOP -#define PWR_SRAM2_PAGE2_STOP_RETENTION PWR_SRAM2_PAGE2_STOP -#define PWR_SRAM2_FULL_STOP_RETENTION PWR_SRAM2_FULL_STOP - -#define PWR_SRAM3_PAGE1_STOP_RETENTION PWR_SRAM3_PAGE1_STOP -#define PWR_SRAM3_PAGE2_STOP_RETENTION PWR_SRAM3_PAGE2_STOP -#define PWR_SRAM3_PAGE3_STOP_RETENTION PWR_SRAM3_PAGE3_STOP -#define PWR_SRAM3_PAGE4_STOP_RETENTION PWR_SRAM3_PAGE4_STOP -#define PWR_SRAM3_PAGE5_STOP_RETENTION PWR_SRAM3_PAGE5_STOP -#define PWR_SRAM3_PAGE6_STOP_RETENTION PWR_SRAM3_PAGE6_STOP -#define PWR_SRAM3_PAGE7_STOP_RETENTION PWR_SRAM3_PAGE7_STOP -#define PWR_SRAM3_PAGE8_STOP_RETENTION PWR_SRAM3_PAGE8_STOP -#define PWR_SRAM3_PAGE9_STOP_RETENTION PWR_SRAM3_PAGE9_STOP -#define PWR_SRAM3_PAGE10_STOP_RETENTION PWR_SRAM3_PAGE10_STOP -#define PWR_SRAM3_PAGE11_STOP_RETENTION PWR_SRAM3_PAGE11_STOP -#define PWR_SRAM3_PAGE12_STOP_RETENTION PWR_SRAM3_PAGE12_STOP -#define PWR_SRAM3_PAGE13_STOP_RETENTION PWR_SRAM3_PAGE13_STOP -#define PWR_SRAM3_FULL_STOP_RETENTION PWR_SRAM3_FULL_STOP - -#define PWR_SRAM4_FULL_STOP_RETENTION PWR_SRAM4_FULL_STOP - -#define PWR_SRAM5_PAGE1_STOP_RETENTION PWR_SRAM5_PAGE1_STOP -#define PWR_SRAM5_PAGE2_STOP_RETENTION PWR_SRAM5_PAGE2_STOP -#define PWR_SRAM5_PAGE3_STOP_RETENTION PWR_SRAM5_PAGE3_STOP -#define PWR_SRAM5_PAGE4_STOP_RETENTION PWR_SRAM5_PAGE4_STOP -#define PWR_SRAM5_PAGE5_STOP_RETENTION PWR_SRAM5_PAGE5_STOP -#define PWR_SRAM5_PAGE6_STOP_RETENTION PWR_SRAM5_PAGE6_STOP -#define PWR_SRAM5_PAGE7_STOP_RETENTION PWR_SRAM5_PAGE7_STOP -#define PWR_SRAM5_PAGE8_STOP_RETENTION PWR_SRAM5_PAGE8_STOP -#define PWR_SRAM5_PAGE9_STOP_RETENTION PWR_SRAM5_PAGE9_STOP -#define PWR_SRAM5_PAGE10_STOP_RETENTION PWR_SRAM5_PAGE10_STOP -#define PWR_SRAM5_PAGE11_STOP_RETENTION PWR_SRAM5_PAGE11_STOP -#define PWR_SRAM5_PAGE12_STOP_RETENTION PWR_SRAM5_PAGE12_STOP -#define PWR_SRAM5_PAGE13_STOP_RETENTION PWR_SRAM5_PAGE13_STOP -#define PWR_SRAM5_FULL_STOP_RETENTION PWR_SRAM5_FULL_STOP - -#define PWR_SRAM6_PAGE1_STOP_RETENTION PWR_SRAM6_PAGE1_STOP -#define PWR_SRAM6_PAGE2_STOP_RETENTION PWR_SRAM6_PAGE2_STOP -#define PWR_SRAM6_PAGE3_STOP_RETENTION PWR_SRAM6_PAGE3_STOP -#define PWR_SRAM6_PAGE4_STOP_RETENTION PWR_SRAM6_PAGE4_STOP -#define PWR_SRAM6_PAGE5_STOP_RETENTION PWR_SRAM6_PAGE5_STOP -#define PWR_SRAM6_PAGE6_STOP_RETENTION PWR_SRAM6_PAGE6_STOP -#define PWR_SRAM6_PAGE7_STOP_RETENTION PWR_SRAM6_PAGE7_STOP -#define PWR_SRAM6_PAGE8_STOP_RETENTION PWR_SRAM6_PAGE8_STOP -#define PWR_SRAM6_FULL_STOP_RETENTION PWR_SRAM6_FULL_STOP - - -#define PWR_ICACHE_FULL_STOP_RETENTION PWR_ICACHE_FULL_STOP -#define PWR_DCACHE1_FULL_STOP_RETENTION PWR_DCACHE1_FULL_STOP -#define PWR_DCACHE2_FULL_STOP_RETENTION PWR_DCACHE2_FULL_STOP -#define PWR_DMA2DRAM_FULL_STOP_RETENTION PWR_DMA2DRAM_FULL_STOP -#define PWR_PERIPHRAM_FULL_STOP_RETENTION PWR_PERIPHRAM_FULL_STOP -#define PWR_PKA32RAM_FULL_STOP_RETENTION PWR_PKA32RAM_FULL_STOP -#define PWR_GRAPHICPRAM_FULL_STOP_RETENTION PWR_GRAPHICPRAM_FULL_STOP -#define PWR_DSIRAM_FULL_STOP_RETENTION PWR_DSIRAM_FULL_STOP -#define PWR_JPEGRAM_FULL_STOP_RETENTION PWR_JPEGRAM_FULL_STOP - - -#define PWR_SRAM2_PAGE1_STANDBY_RETENTION PWR_SRAM2_PAGE1_STANDBY -#define PWR_SRAM2_PAGE2_STANDBY_RETENTION PWR_SRAM2_PAGE2_STANDBY -#define PWR_SRAM2_FULL_STANDBY_RETENTION PWR_SRAM2_FULL_STANDBY - -#define PWR_SRAM1_FULL_RUN_RETENTION PWR_SRAM1_FULL_RUN -#define PWR_SRAM2_FULL_RUN_RETENTION PWR_SRAM2_FULL_RUN -#define PWR_SRAM3_FULL_RUN_RETENTION PWR_SRAM3_FULL_RUN -#define PWR_SRAM4_FULL_RUN_RETENTION PWR_SRAM4_FULL_RUN -#define PWR_SRAM5_FULL_RUN_RETENTION PWR_SRAM5_FULL_RUN -#define PWR_SRAM6_FULL_RUN_RETENTION PWR_SRAM6_FULL_RUN - -#define PWR_ALL_RAM_RUN_RETENTION_MASK PWR_ALL_RAM_RUN_MASK -#endif - -/** - * @} - */ - -/** @defgroup HAL_RTC_Aliased_Functions HAL RTC Aliased Functions maintained for legacy purpose - * @{ - */ -#if defined(STM32H5) || defined(STM32WBA) || defined(STM32H7RS) -#define HAL_RTCEx_SetBoothardwareKey HAL_RTCEx_LockBootHardwareKey -#define HAL_RTCEx_BKUPBlock_Enable HAL_RTCEx_BKUPBlock -#define HAL_RTCEx_BKUPBlock_Disable HAL_RTCEx_BKUPUnblock -#define HAL_RTCEx_Erase_SecretDev_Conf HAL_RTCEx_ConfigEraseDeviceSecrets -#endif /* STM32H5 || STM32WBA || STM32H7RS */ - -/** - * @} - */ - -/** @defgroup HAL_SMBUS_Aliased_Functions HAL SMBUS Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_SMBUS_Slave_Listen_IT HAL_SMBUS_EnableListen_IT -#define HAL_SMBUS_SlaveAddrCallback HAL_SMBUS_AddrCallback -#define HAL_SMBUS_SlaveListenCpltCallback HAL_SMBUS_ListenCpltCallback -/** - * @} - */ - -/** @defgroup HAL_SPI_Aliased_Functions HAL SPI Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_SPI_FlushRxFifo HAL_SPIEx_FlushRxFifo -/** - * @} - */ - -/** @defgroup HAL_TIM_Aliased_Functions HAL TIM Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_TIM_DMADelayPulseCplt TIM_DMADelayPulseCplt -#define HAL_TIM_DMAError TIM_DMAError -#define HAL_TIM_DMACaptureCplt TIM_DMACaptureCplt -#define HAL_TIMEx_DMACommutationCplt TIMEx_DMACommutationCplt -#if defined(STM32H7) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || \ - defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) -#define HAL_TIM_SlaveConfigSynchronization HAL_TIM_SlaveConfigSynchro -#define HAL_TIM_SlaveConfigSynchronization_IT HAL_TIM_SlaveConfigSynchro_IT -#define HAL_TIMEx_CommutationCallback HAL_TIMEx_CommutCallback -#define HAL_TIMEx_ConfigCommutationEvent HAL_TIMEx_ConfigCommutEvent -#define HAL_TIMEx_ConfigCommutationEvent_IT HAL_TIMEx_ConfigCommutEvent_IT -#define HAL_TIMEx_ConfigCommutationEvent_DMA HAL_TIMEx_ConfigCommutEvent_DMA -#endif /* STM32H7 || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 */ -/** - * @} - */ - -/** @defgroup HAL_UART_Aliased_Functions HAL UART Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_UART_WakeupCallback HAL_UARTEx_WakeupCallback -/** - * @} - */ - -/** @defgroup HAL_LTDC_Aliased_Functions HAL LTDC Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_LTDC_LineEvenCallback HAL_LTDC_LineEventCallback -#define HAL_LTDC_Relaod HAL_LTDC_Reload -#define HAL_LTDC_StructInitFromVideoConfig HAL_LTDCEx_StructInitFromVideoConfig -#define HAL_LTDC_StructInitFromAdaptedCommandConfig HAL_LTDCEx_StructInitFromAdaptedCommandConfig -/** - * @} - */ - - -/** @defgroup HAL_PPP_Aliased_Functions HAL PPP Aliased Functions maintained for legacy purpose - * @{ - */ - -/** - * @} - */ - -/* Exported macros ------------------------------------------------------------*/ - -/** @defgroup HAL_AES_Aliased_Macros HAL CRYP Aliased Macros maintained for legacy purpose - * @{ - */ -#define AES_IT_CC CRYP_IT_CC -#define AES_IT_ERR CRYP_IT_ERR -#define AES_FLAG_CCF CRYP_FLAG_CCF -/** - * @} - */ - -/** @defgroup HAL_Aliased_Macros HAL Generic Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_GET_BOOT_MODE __HAL_SYSCFG_GET_BOOT_MODE -#define __HAL_REMAPMEMORY_FLASH __HAL_SYSCFG_REMAPMEMORY_FLASH -#define __HAL_REMAPMEMORY_SYSTEMFLASH __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH -#define __HAL_REMAPMEMORY_SRAM __HAL_SYSCFG_REMAPMEMORY_SRAM -#define __HAL_REMAPMEMORY_FMC __HAL_SYSCFG_REMAPMEMORY_FMC -#define __HAL_REMAPMEMORY_FMC_SDRAM __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM -#define __HAL_REMAPMEMORY_FSMC __HAL_SYSCFG_REMAPMEMORY_FSMC -#define __HAL_REMAPMEMORY_QUADSPI __HAL_SYSCFG_REMAPMEMORY_QUADSPI -#define __HAL_FMC_BANK __HAL_SYSCFG_FMC_BANK -#define __HAL_GET_FLAG __HAL_SYSCFG_GET_FLAG -#define __HAL_CLEAR_FLAG __HAL_SYSCFG_CLEAR_FLAG -#define __HAL_VREFINT_OUT_ENABLE __HAL_SYSCFG_VREFINT_OUT_ENABLE -#define __HAL_VREFINT_OUT_DISABLE __HAL_SYSCFG_VREFINT_OUT_DISABLE -#define __HAL_SYSCFG_SRAM2_WRP_ENABLE __HAL_SYSCFG_SRAM2_WRP_0_31_ENABLE - -#define SYSCFG_FLAG_VREF_READY SYSCFG_FLAG_VREFINT_READY -#define SYSCFG_FLAG_RC48 RCC_FLAG_HSI48 -#define IS_SYSCFG_FASTMODEPLUS_CONFIG IS_I2C_FASTMODEPLUS -#define UFB_MODE_BitNumber UFB_MODE_BIT_NUMBER -#define CMP_PD_BitNumber CMP_PD_BIT_NUMBER - -/** - * @} - */ - - -/** @defgroup HAL_ADC_Aliased_Macros HAL ADC Aliased Macros maintained for legacy purpose - * @{ - */ -#define __ADC_ENABLE __HAL_ADC_ENABLE -#define __ADC_DISABLE __HAL_ADC_DISABLE -#define __HAL_ADC_ENABLING_CONDITIONS ADC_ENABLING_CONDITIONS -#define __HAL_ADC_DISABLING_CONDITIONS ADC_DISABLING_CONDITIONS -#define __HAL_ADC_IS_ENABLED ADC_IS_ENABLE -#define __ADC_IS_ENABLED ADC_IS_ENABLE -#define __HAL_ADC_IS_SOFTWARE_START_REGULAR ADC_IS_SOFTWARE_START_REGULAR -#define __HAL_ADC_IS_SOFTWARE_START_INJECTED ADC_IS_SOFTWARE_START_INJECTED -#define __HAL_ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED -#define __HAL_ADC_IS_CONVERSION_ONGOING_REGULAR ADC_IS_CONVERSION_ONGOING_REGULAR -#define __HAL_ADC_IS_CONVERSION_ONGOING_INJECTED ADC_IS_CONVERSION_ONGOING_INJECTED -#define __HAL_ADC_IS_CONVERSION_ONGOING ADC_IS_CONVERSION_ONGOING -#define __HAL_ADC_CLEAR_ERRORCODE ADC_CLEAR_ERRORCODE - -#define __HAL_ADC_GET_RESOLUTION ADC_GET_RESOLUTION -#define __HAL_ADC_JSQR_RK ADC_JSQR_RK -#define __HAL_ADC_CFGR_AWD1CH ADC_CFGR_AWD1CH_SHIFT -#define __HAL_ADC_CFGR_AWD23CR ADC_CFGR_AWD23CR -#define __HAL_ADC_CFGR_INJECT_AUTO_CONVERSION ADC_CFGR_INJECT_AUTO_CONVERSION -#define __HAL_ADC_CFGR_INJECT_CONTEXT_QUEUE ADC_CFGR_INJECT_CONTEXT_QUEUE -#define __HAL_ADC_CFGR_INJECT_DISCCONTINUOUS ADC_CFGR_INJECT_DISCCONTINUOUS -#define __HAL_ADC_CFGR_REG_DISCCONTINUOUS ADC_CFGR_REG_DISCCONTINUOUS -#define __HAL_ADC_CFGR_DISCONTINUOUS_NUM ADC_CFGR_DISCONTINUOUS_NUM -#define __HAL_ADC_CFGR_AUTOWAIT ADC_CFGR_AUTOWAIT -#define __HAL_ADC_CFGR_CONTINUOUS ADC_CFGR_CONTINUOUS -#define __HAL_ADC_CFGR_OVERRUN ADC_CFGR_OVERRUN -#define __HAL_ADC_CFGR_DMACONTREQ ADC_CFGR_DMACONTREQ -#define __HAL_ADC_CFGR_EXTSEL ADC_CFGR_EXTSEL_SET -#define __HAL_ADC_JSQR_JEXTSEL ADC_JSQR_JEXTSEL_SET -#define __HAL_ADC_OFR_CHANNEL ADC_OFR_CHANNEL -#define __HAL_ADC_DIFSEL_CHANNEL ADC_DIFSEL_CHANNEL -#define __HAL_ADC_CALFACT_DIFF_SET ADC_CALFACT_DIFF_SET -#define __HAL_ADC_CALFACT_DIFF_GET ADC_CALFACT_DIFF_GET -#define __HAL_ADC_TRX_HIGHTHRESHOLD ADC_TRX_HIGHTHRESHOLD - -#define __HAL_ADC_OFFSET_SHIFT_RESOLUTION ADC_OFFSET_SHIFT_RESOLUTION -#define __HAL_ADC_AWD1THRESHOLD_SHIFT_RESOLUTION ADC_AWD1THRESHOLD_SHIFT_RESOLUTION -#define __HAL_ADC_AWD23THRESHOLD_SHIFT_RESOLUTION ADC_AWD23THRESHOLD_SHIFT_RESOLUTION -#define __HAL_ADC_COMMON_REGISTER ADC_COMMON_REGISTER -#define __HAL_ADC_COMMON_CCR_MULTI ADC_COMMON_CCR_MULTI -#define __HAL_ADC_MULTIMODE_IS_ENABLED ADC_MULTIMODE_IS_ENABLE -#define __ADC_MULTIMODE_IS_ENABLED ADC_MULTIMODE_IS_ENABLE -#define __HAL_ADC_NONMULTIMODE_OR_MULTIMODEMASTER ADC_NONMULTIMODE_OR_MULTIMODEMASTER -#define __HAL_ADC_COMMON_ADC_OTHER ADC_COMMON_ADC_OTHER -#define __HAL_ADC_MULTI_SLAVE ADC_MULTI_SLAVE - -#define __HAL_ADC_SQR1_L ADC_SQR1_L_SHIFT -#define __HAL_ADC_JSQR_JL ADC_JSQR_JL_SHIFT -#define __HAL_ADC_JSQR_RK_JL ADC_JSQR_RK_JL -#define __HAL_ADC_CR1_DISCONTINUOUS_NUM ADC_CR1_DISCONTINUOUS_NUM -#define __HAL_ADC_CR1_SCAN ADC_CR1_SCAN_SET -#define __HAL_ADC_CONVCYCLES_MAX_RANGE ADC_CONVCYCLES_MAX_RANGE -#define __HAL_ADC_CLOCK_PRESCALER_RANGE ADC_CLOCK_PRESCALER_RANGE -#define __HAL_ADC_GET_CLOCK_PRESCALER ADC_GET_CLOCK_PRESCALER - -#define __HAL_ADC_SQR1 ADC_SQR1 -#define __HAL_ADC_SMPR1 ADC_SMPR1 -#define __HAL_ADC_SMPR2 ADC_SMPR2 -#define __HAL_ADC_SQR3_RK ADC_SQR3_RK -#define __HAL_ADC_SQR2_RK ADC_SQR2_RK -#define __HAL_ADC_SQR1_RK ADC_SQR1_RK -#define __HAL_ADC_CR2_CONTINUOUS ADC_CR2_CONTINUOUS -#define __HAL_ADC_CR1_DISCONTINUOUS ADC_CR1_DISCONTINUOUS -#define __HAL_ADC_CR1_SCANCONV ADC_CR1_SCANCONV -#define __HAL_ADC_CR2_EOCSelection ADC_CR2_EOCSelection -#define __HAL_ADC_CR2_DMAContReq ADC_CR2_DMAContReq -#define __HAL_ADC_JSQR ADC_JSQR - -#define __HAL_ADC_CHSELR_CHANNEL ADC_CHSELR_CHANNEL -#define __HAL_ADC_CFGR1_REG_DISCCONTINUOUS ADC_CFGR1_REG_DISCCONTINUOUS -#define __HAL_ADC_CFGR1_AUTOOFF ADC_CFGR1_AUTOOFF -#define __HAL_ADC_CFGR1_AUTOWAIT ADC_CFGR1_AUTOWAIT -#define __HAL_ADC_CFGR1_CONTINUOUS ADC_CFGR1_CONTINUOUS -#define __HAL_ADC_CFGR1_OVERRUN ADC_CFGR1_OVERRUN -#define __HAL_ADC_CFGR1_SCANDIR ADC_CFGR1_SCANDIR -#define __HAL_ADC_CFGR1_DMACONTREQ ADC_CFGR1_DMACONTREQ - -/** - * @} - */ - -/** @defgroup HAL_DAC_Aliased_Macros HAL DAC Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_DHR12R1_ALIGNEMENT DAC_DHR12R1_ALIGNMENT -#define __HAL_DHR12R2_ALIGNEMENT DAC_DHR12R2_ALIGNMENT -#define __HAL_DHR12RD_ALIGNEMENT DAC_DHR12RD_ALIGNMENT -#define IS_DAC_GENERATE_WAVE IS_DAC_WAVE - -/** - * @} - */ - -/** @defgroup HAL_DBGMCU_Aliased_Macros HAL DBGMCU Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_FREEZE_TIM1_DBGMCU __HAL_DBGMCU_FREEZE_TIM1 -#define __HAL_UNFREEZE_TIM1_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM1 -#define __HAL_FREEZE_TIM2_DBGMCU __HAL_DBGMCU_FREEZE_TIM2 -#define __HAL_UNFREEZE_TIM2_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM2 -#define __HAL_FREEZE_TIM3_DBGMCU __HAL_DBGMCU_FREEZE_TIM3 -#define __HAL_UNFREEZE_TIM3_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM3 -#define __HAL_FREEZE_TIM4_DBGMCU __HAL_DBGMCU_FREEZE_TIM4 -#define __HAL_UNFREEZE_TIM4_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM4 -#define __HAL_FREEZE_TIM5_DBGMCU __HAL_DBGMCU_FREEZE_TIM5 -#define __HAL_UNFREEZE_TIM5_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM5 -#define __HAL_FREEZE_TIM6_DBGMCU __HAL_DBGMCU_FREEZE_TIM6 -#define __HAL_UNFREEZE_TIM6_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM6 -#define __HAL_FREEZE_TIM7_DBGMCU __HAL_DBGMCU_FREEZE_TIM7 -#define __HAL_UNFREEZE_TIM7_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM7 -#define __HAL_FREEZE_TIM8_DBGMCU __HAL_DBGMCU_FREEZE_TIM8 -#define __HAL_UNFREEZE_TIM8_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM8 - -#define __HAL_FREEZE_TIM9_DBGMCU __HAL_DBGMCU_FREEZE_TIM9 -#define __HAL_UNFREEZE_TIM9_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM9 -#define __HAL_FREEZE_TIM10_DBGMCU __HAL_DBGMCU_FREEZE_TIM10 -#define __HAL_UNFREEZE_TIM10_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM10 -#define __HAL_FREEZE_TIM11_DBGMCU __HAL_DBGMCU_FREEZE_TIM11 -#define __HAL_UNFREEZE_TIM11_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM11 -#define __HAL_FREEZE_TIM12_DBGMCU __HAL_DBGMCU_FREEZE_TIM12 -#define __HAL_UNFREEZE_TIM12_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM12 -#define __HAL_FREEZE_TIM13_DBGMCU __HAL_DBGMCU_FREEZE_TIM13 -#define __HAL_UNFREEZE_TIM13_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM13 -#define __HAL_FREEZE_TIM14_DBGMCU __HAL_DBGMCU_FREEZE_TIM14 -#define __HAL_UNFREEZE_TIM14_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM14 -#define __HAL_FREEZE_CAN2_DBGMCU __HAL_DBGMCU_FREEZE_CAN2 -#define __HAL_UNFREEZE_CAN2_DBGMCU __HAL_DBGMCU_UNFREEZE_CAN2 - - -#define __HAL_FREEZE_TIM15_DBGMCU __HAL_DBGMCU_FREEZE_TIM15 -#define __HAL_UNFREEZE_TIM15_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM15 -#define __HAL_FREEZE_TIM16_DBGMCU __HAL_DBGMCU_FREEZE_TIM16 -#define __HAL_UNFREEZE_TIM16_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM16 -#define __HAL_FREEZE_TIM17_DBGMCU __HAL_DBGMCU_FREEZE_TIM17 -#define __HAL_UNFREEZE_TIM17_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM17 -#define __HAL_FREEZE_RTC_DBGMCU __HAL_DBGMCU_FREEZE_RTC -#define __HAL_UNFREEZE_RTC_DBGMCU __HAL_DBGMCU_UNFREEZE_RTC -#if defined(STM32H7) -#define __HAL_FREEZE_WWDG_DBGMCU __HAL_DBGMCU_FREEZE_WWDG1 -#define __HAL_UNFREEZE_WWDG_DBGMCU __HAL_DBGMCU_UnFreeze_WWDG1 -#define __HAL_FREEZE_IWDG_DBGMCU __HAL_DBGMCU_FREEZE_IWDG1 -#define __HAL_UNFREEZE_IWDG_DBGMCU __HAL_DBGMCU_UnFreeze_IWDG1 -#else -#define __HAL_FREEZE_WWDG_DBGMCU __HAL_DBGMCU_FREEZE_WWDG -#define __HAL_UNFREEZE_WWDG_DBGMCU __HAL_DBGMCU_UNFREEZE_WWDG -#define __HAL_FREEZE_IWDG_DBGMCU __HAL_DBGMCU_FREEZE_IWDG -#define __HAL_UNFREEZE_IWDG_DBGMCU __HAL_DBGMCU_UNFREEZE_IWDG -#endif /* STM32H7 */ -#define __HAL_FREEZE_I2C1_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT -#define __HAL_UNFREEZE_I2C1_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT -#define __HAL_FREEZE_I2C2_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT -#define __HAL_UNFREEZE_I2C2_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT -#define __HAL_FREEZE_I2C3_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT -#define __HAL_UNFREEZE_I2C3_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT -#define __HAL_FREEZE_CAN1_DBGMCU __HAL_DBGMCU_FREEZE_CAN1 -#define __HAL_UNFREEZE_CAN1_DBGMCU __HAL_DBGMCU_UNFREEZE_CAN1 -#define __HAL_FREEZE_LPTIM1_DBGMCU __HAL_DBGMCU_FREEZE_LPTIM1 -#define __HAL_UNFREEZE_LPTIM1_DBGMCU __HAL_DBGMCU_UNFREEZE_LPTIM1 -#define __HAL_FREEZE_LPTIM2_DBGMCU __HAL_DBGMCU_FREEZE_LPTIM2 -#define __HAL_UNFREEZE_LPTIM2_DBGMCU __HAL_DBGMCU_UNFREEZE_LPTIM2 - -/** - * @} - */ - -/** @defgroup HAL_COMP_Aliased_Macros HAL COMP Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined(STM32F3) -#define COMP_START __HAL_COMP_ENABLE -#define COMP_STOP __HAL_COMP_DISABLE -#define COMP_LOCK __HAL_COMP_LOCK - -#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) || defined(STM32F303x8) || \ - defined(STM32F334x8) || defined(STM32F328xx) -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP6_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP6_EXTI_CLEAR_FLAG()) -#endif -#if defined(STM32F302xE) || defined(STM32F302xC) -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP6_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP6_EXTI_CLEAR_FLAG()) -#endif -#if defined(STM32F303xE) || defined(STM32F398xx) || defined(STM32F303xC) || defined(STM32F358xx) -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP7_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP7_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP7_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP7_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP7_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP7_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP7_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP7_EXTI_CLEAR_FLAG()) -#endif -#if defined(STM32F373xC) ||defined(STM32F378xx) -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP2_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP2_EXTI_CLEAR_FLAG()) -#endif -#else -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP2_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP2_EXTI_CLEAR_FLAG()) -#endif - -#define __HAL_COMP_GET_EXTI_LINE COMP_GET_EXTI_LINE - -#if defined(STM32L0) || defined(STM32L4) -/* Note: On these STM32 families, the only argument of this macro */ -/* is COMP_FLAG_LOCK. */ -/* This macro is replaced by __HAL_COMP_IS_LOCKED with only HAL handle */ -/* argument. */ -#define __HAL_COMP_GET_FLAG(__HANDLE__, __FLAG__) (__HAL_COMP_IS_LOCKED(__HANDLE__)) -#endif -/** - * @} - */ - -#if defined(STM32L0) || defined(STM32L4) -/** @defgroup HAL_COMP_Aliased_Functions HAL COMP Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_COMP_Start_IT HAL_COMP_Start /* Function considered as legacy as EXTI event or IT configuration is - done into HAL_COMP_Init() */ -#define HAL_COMP_Stop_IT HAL_COMP_Stop /* Function considered as legacy as EXTI event or IT configuration is - done into HAL_COMP_Init() */ -/** - * @} - */ -#endif - -/** @defgroup HAL_DAC_Aliased_Macros HAL DAC Aliased Macros maintained for legacy purpose - * @{ - */ - -#define IS_DAC_WAVE(WAVE) (((WAVE) == DAC_WAVE_NONE) || \ - ((WAVE) == DAC_WAVE_NOISE)|| \ - ((WAVE) == DAC_WAVE_TRIANGLE)) - -/** - * @} - */ - -/** @defgroup HAL_FLASH_Aliased_Macros HAL FLASH Aliased Macros maintained for legacy purpose - * @{ - */ - -#define IS_WRPAREA IS_OB_WRPAREA -#define IS_TYPEPROGRAM IS_FLASH_TYPEPROGRAM -#define IS_TYPEPROGRAMFLASH IS_FLASH_TYPEPROGRAM -#define IS_TYPEERASE IS_FLASH_TYPEERASE -#define IS_NBSECTORS IS_FLASH_NBSECTORS -#define IS_OB_WDG_SOURCE IS_OB_IWDG_SOURCE - -/** - * @} - */ - -/** @defgroup HAL_I2C_Aliased_Macros HAL I2C Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_I2C_RESET_CR2 I2C_RESET_CR2 -#define __HAL_I2C_GENERATE_START I2C_GENERATE_START -#if defined(STM32F1) -#define __HAL_I2C_FREQ_RANGE I2C_FREQRANGE -#else -#define __HAL_I2C_FREQ_RANGE I2C_FREQ_RANGE -#endif /* STM32F1 */ -#define __HAL_I2C_RISE_TIME I2C_RISE_TIME -#define __HAL_I2C_SPEED_STANDARD I2C_SPEED_STANDARD -#define __HAL_I2C_SPEED_FAST I2C_SPEED_FAST -#define __HAL_I2C_SPEED I2C_SPEED -#define __HAL_I2C_7BIT_ADD_WRITE I2C_7BIT_ADD_WRITE -#define __HAL_I2C_7BIT_ADD_READ I2C_7BIT_ADD_READ -#define __HAL_I2C_10BIT_ADDRESS I2C_10BIT_ADDRESS -#define __HAL_I2C_10BIT_HEADER_WRITE I2C_10BIT_HEADER_WRITE -#define __HAL_I2C_10BIT_HEADER_READ I2C_10BIT_HEADER_READ -#define __HAL_I2C_MEM_ADD_MSB I2C_MEM_ADD_MSB -#define __HAL_I2C_MEM_ADD_LSB I2C_MEM_ADD_LSB -#define __HAL_I2C_FREQRANGE I2C_FREQRANGE -/** - * @} - */ - -/** @defgroup HAL_I2S_Aliased_Macros HAL I2S Aliased Macros maintained for legacy purpose - * @{ - */ - -#define IS_I2S_INSTANCE IS_I2S_ALL_INSTANCE -#define IS_I2S_INSTANCE_EXT IS_I2S_ALL_INSTANCE_EXT - -#if defined(STM32H7) -#define __HAL_I2S_CLEAR_FREFLAG __HAL_I2S_CLEAR_TIFREFLAG -#endif - -/** - * @} - */ - -/** @defgroup HAL_IRDA_Aliased_Macros HAL IRDA Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __IRDA_DISABLE __HAL_IRDA_DISABLE -#define __IRDA_ENABLE __HAL_IRDA_ENABLE - -#define __HAL_IRDA_GETCLOCKSOURCE IRDA_GETCLOCKSOURCE -#define __HAL_IRDA_MASK_COMPUTATION IRDA_MASK_COMPUTATION -#define __IRDA_GETCLOCKSOURCE IRDA_GETCLOCKSOURCE -#define __IRDA_MASK_COMPUTATION IRDA_MASK_COMPUTATION - -#define IS_IRDA_ONEBIT_SAMPLE IS_IRDA_ONE_BIT_SAMPLE - - -/** - * @} - */ - - -/** @defgroup HAL_IWDG_Aliased_Macros HAL IWDG Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_IWDG_ENABLE_WRITE_ACCESS IWDG_ENABLE_WRITE_ACCESS -#define __HAL_IWDG_DISABLE_WRITE_ACCESS IWDG_DISABLE_WRITE_ACCESS -/** - * @} - */ - - -/** @defgroup HAL_LPTIM_Aliased_Macros HAL LPTIM Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_LPTIM_ENABLE_INTERRUPT __HAL_LPTIM_ENABLE_IT -#define __HAL_LPTIM_DISABLE_INTERRUPT __HAL_LPTIM_DISABLE_IT -#define __HAL_LPTIM_GET_ITSTATUS __HAL_LPTIM_GET_IT_SOURCE - -/** - * @} - */ - - -/** @defgroup HAL_OPAMP_Aliased_Macros HAL OPAMP Aliased Macros maintained for legacy purpose - * @{ - */ -#define __OPAMP_CSR_OPAXPD OPAMP_CSR_OPAXPD -#define __OPAMP_CSR_S3SELX OPAMP_CSR_S3SELX -#define __OPAMP_CSR_S4SELX OPAMP_CSR_S4SELX -#define __OPAMP_CSR_S5SELX OPAMP_CSR_S5SELX -#define __OPAMP_CSR_S6SELX OPAMP_CSR_S6SELX -#define __OPAMP_CSR_OPAXCAL_L OPAMP_CSR_OPAXCAL_L -#define __OPAMP_CSR_OPAXCAL_H OPAMP_CSR_OPAXCAL_H -#define __OPAMP_CSR_OPAXLPM OPAMP_CSR_OPAXLPM -#define __OPAMP_CSR_ALL_SWITCHES OPAMP_CSR_ALL_SWITCHES -#define __OPAMP_CSR_ANAWSELX OPAMP_CSR_ANAWSELX -#define __OPAMP_CSR_OPAXCALOUT OPAMP_CSR_OPAXCALOUT -#define __OPAMP_OFFSET_TRIM_BITSPOSITION OPAMP_OFFSET_TRIM_BITSPOSITION -#define __OPAMP_OFFSET_TRIM_SET OPAMP_OFFSET_TRIM_SET - -/** - * @} - */ - - -/** @defgroup HAL_PWR_Aliased_Macros HAL PWR Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_PVD_EVENT_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_EVENT -#define __HAL_PVD_EVENT_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_EVENT -#define __HAL_PVD_EXTI_FALLINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE -#define __HAL_PVD_EXTI_FALLINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE -#define __HAL_PVD_EXTI_RISINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE -#define __HAL_PVD_EXTI_RISINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE -#define __HAL_PVM_EVENT_DISABLE __HAL_PWR_PVM_EVENT_DISABLE -#define __HAL_PVM_EVENT_ENABLE __HAL_PWR_PVM_EVENT_ENABLE -#define __HAL_PVM_EXTI_FALLINGTRIGGER_DISABLE __HAL_PWR_PVM_EXTI_FALLINGTRIGGER_DISABLE -#define __HAL_PVM_EXTI_FALLINGTRIGGER_ENABLE __HAL_PWR_PVM_EXTI_FALLINGTRIGGER_ENABLE -#define __HAL_PVM_EXTI_RISINGTRIGGER_DISABLE __HAL_PWR_PVM_EXTI_RISINGTRIGGER_DISABLE -#define __HAL_PVM_EXTI_RISINGTRIGGER_ENABLE __HAL_PWR_PVM_EXTI_RISINGTRIGGER_ENABLE -#define __HAL_PWR_INTERNALWAKEUP_DISABLE HAL_PWREx_DisableInternalWakeUpLine -#define __HAL_PWR_INTERNALWAKEUP_ENABLE HAL_PWREx_EnableInternalWakeUpLine -#define __HAL_PWR_PULL_UP_DOWN_CONFIG_DISABLE HAL_PWREx_DisablePullUpPullDownConfig -#define __HAL_PWR_PULL_UP_DOWN_CONFIG_ENABLE HAL_PWREx_EnablePullUpPullDownConfig -#define __HAL_PWR_PVD_EXTI_CLEAR_EGDE_TRIGGER() do { __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); \ - __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); \ - } while(0) -#define __HAL_PWR_PVD_EXTI_EVENT_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_EVENT -#define __HAL_PWR_PVD_EXTI_EVENT_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_EVENT -#define __HAL_PWR_PVD_EXTI_FALLINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE -#define __HAL_PWR_PVD_EXTI_FALLINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE -#define __HAL_PWR_PVD_EXTI_RISINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE -#define __HAL_PWR_PVD_EXTI_RISINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE -#define __HAL_PWR_PVD_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE -#define __HAL_PWR_PVD_EXTI_SET_RISING_EDGE_TRIGGER __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE -#define __HAL_PWR_PVM_DISABLE() do { HAL_PWREx_DisablePVM1();HAL_PWREx_DisablePVM2(); \ - HAL_PWREx_DisablePVM3();HAL_PWREx_DisablePVM4(); \ - } while(0) -#define __HAL_PWR_PVM_ENABLE() do { HAL_PWREx_EnablePVM1();HAL_PWREx_EnablePVM2(); \ - HAL_PWREx_EnablePVM3();HAL_PWREx_EnablePVM4(); \ - } while(0) -#define __HAL_PWR_SRAM2CONTENT_PRESERVE_DISABLE HAL_PWREx_DisableSRAM2ContentRetention -#define __HAL_PWR_SRAM2CONTENT_PRESERVE_ENABLE HAL_PWREx_EnableSRAM2ContentRetention -#define __HAL_PWR_VDDIO2_DISABLE HAL_PWREx_DisableVddIO2 -#define __HAL_PWR_VDDIO2_ENABLE HAL_PWREx_EnableVddIO2 -#define __HAL_PWR_VDDIO2_EXTI_CLEAR_EGDE_TRIGGER __HAL_PWR_VDDIO2_EXTI_DISABLE_FALLING_EDGE -#define __HAL_PWR_VDDIO2_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_PWR_VDDIO2_EXTI_ENABLE_FALLING_EDGE -#define __HAL_PWR_VDDUSB_DISABLE HAL_PWREx_DisableVddUSB -#define __HAL_PWR_VDDUSB_ENABLE HAL_PWREx_EnableVddUSB - -#if defined (STM32F4) -#define __HAL_PVD_EXTI_ENABLE_IT(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_ENABLE_IT() -#define __HAL_PVD_EXTI_DISABLE_IT(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_DISABLE_IT() -#define __HAL_PVD_EXTI_GET_FLAG(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_GET_FLAG() -#define __HAL_PVD_EXTI_CLEAR_FLAG(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_CLEAR_FLAG() -#define __HAL_PVD_EXTI_GENERATE_SWIT(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_GENERATE_SWIT() -#else -#define __HAL_PVD_EXTI_CLEAR_FLAG __HAL_PWR_PVD_EXTI_CLEAR_FLAG -#define __HAL_PVD_EXTI_DISABLE_IT __HAL_PWR_PVD_EXTI_DISABLE_IT -#define __HAL_PVD_EXTI_ENABLE_IT __HAL_PWR_PVD_EXTI_ENABLE_IT -#define __HAL_PVD_EXTI_GENERATE_SWIT __HAL_PWR_PVD_EXTI_GENERATE_SWIT -#define __HAL_PVD_EXTI_GET_FLAG __HAL_PWR_PVD_EXTI_GET_FLAG -#endif /* STM32F4 */ -/** - * @} - */ - - -/** @defgroup HAL_RCC_Aliased HAL RCC Aliased maintained for legacy purpose - * @{ - */ - -#define RCC_StopWakeUpClock_MSI RCC_STOP_WAKEUPCLOCK_MSI -#define RCC_StopWakeUpClock_HSI RCC_STOP_WAKEUPCLOCK_HSI - -#define HAL_RCC_CCSCallback HAL_RCC_CSSCallback -#define HAL_RC48_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? \ - HAL_RCCEx_EnableHSI48_VREFINT() : HAL_RCCEx_DisableHSI48_VREFINT()) - -#define __ADC_CLK_DISABLE __HAL_RCC_ADC_CLK_DISABLE -#define __ADC_CLK_ENABLE __HAL_RCC_ADC_CLK_ENABLE -#define __ADC_CLK_SLEEP_DISABLE __HAL_RCC_ADC_CLK_SLEEP_DISABLE -#define __ADC_CLK_SLEEP_ENABLE __HAL_RCC_ADC_CLK_SLEEP_ENABLE -#define __ADC_FORCE_RESET __HAL_RCC_ADC_FORCE_RESET -#define __ADC_RELEASE_RESET __HAL_RCC_ADC_RELEASE_RESET -#define __ADC1_CLK_DISABLE __HAL_RCC_ADC1_CLK_DISABLE -#define __ADC1_CLK_ENABLE __HAL_RCC_ADC1_CLK_ENABLE -#define __ADC1_FORCE_RESET __HAL_RCC_ADC1_FORCE_RESET -#define __ADC1_RELEASE_RESET __HAL_RCC_ADC1_RELEASE_RESET -#define __ADC1_CLK_SLEEP_ENABLE __HAL_RCC_ADC1_CLK_SLEEP_ENABLE -#define __ADC1_CLK_SLEEP_DISABLE __HAL_RCC_ADC1_CLK_SLEEP_DISABLE -#define __ADC2_CLK_DISABLE __HAL_RCC_ADC2_CLK_DISABLE -#define __ADC2_CLK_ENABLE __HAL_RCC_ADC2_CLK_ENABLE -#define __ADC2_FORCE_RESET __HAL_RCC_ADC2_FORCE_RESET -#define __ADC2_RELEASE_RESET __HAL_RCC_ADC2_RELEASE_RESET -#define __ADC3_CLK_DISABLE __HAL_RCC_ADC3_CLK_DISABLE -#define __ADC3_CLK_ENABLE __HAL_RCC_ADC3_CLK_ENABLE -#define __ADC3_FORCE_RESET __HAL_RCC_ADC3_FORCE_RESET -#define __ADC3_RELEASE_RESET __HAL_RCC_ADC3_RELEASE_RESET -#define __AES_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE -#define __AES_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE -#define __AES_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE -#define __AES_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE -#define __AES_FORCE_RESET __HAL_RCC_AES_FORCE_RESET -#define __AES_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET -#define __CRYP_CLK_SLEEP_ENABLE __HAL_RCC_CRYP_CLK_SLEEP_ENABLE -#define __CRYP_CLK_SLEEP_DISABLE __HAL_RCC_CRYP_CLK_SLEEP_DISABLE -#define __CRYP_CLK_ENABLE __HAL_RCC_CRYP_CLK_ENABLE -#define __CRYP_CLK_DISABLE __HAL_RCC_CRYP_CLK_DISABLE -#define __CRYP_FORCE_RESET __HAL_RCC_CRYP_FORCE_RESET -#define __CRYP_RELEASE_RESET __HAL_RCC_CRYP_RELEASE_RESET -#define __AFIO_CLK_DISABLE __HAL_RCC_AFIO_CLK_DISABLE -#define __AFIO_CLK_ENABLE __HAL_RCC_AFIO_CLK_ENABLE -#define __AFIO_FORCE_RESET __HAL_RCC_AFIO_FORCE_RESET -#define __AFIO_RELEASE_RESET __HAL_RCC_AFIO_RELEASE_RESET -#define __AHB_FORCE_RESET __HAL_RCC_AHB_FORCE_RESET -#define __AHB_RELEASE_RESET __HAL_RCC_AHB_RELEASE_RESET -#define __AHB1_FORCE_RESET __HAL_RCC_AHB1_FORCE_RESET -#define __AHB1_RELEASE_RESET __HAL_RCC_AHB1_RELEASE_RESET -#define __AHB2_FORCE_RESET __HAL_RCC_AHB2_FORCE_RESET -#define __AHB2_RELEASE_RESET __HAL_RCC_AHB2_RELEASE_RESET -#define __AHB3_FORCE_RESET __HAL_RCC_AHB3_FORCE_RESET -#define __AHB3_RELEASE_RESET __HAL_RCC_AHB3_RELEASE_RESET -#define __APB1_FORCE_RESET __HAL_RCC_APB1_FORCE_RESET -#define __APB1_RELEASE_RESET __HAL_RCC_APB1_RELEASE_RESET -#define __APB2_FORCE_RESET __HAL_RCC_APB2_FORCE_RESET -#define __APB2_RELEASE_RESET __HAL_RCC_APB2_RELEASE_RESET -#if defined(STM32C0) -#define __HAL_RCC_APB1_FORCE_RESET __HAL_RCC_APB1_GRP1_FORCE_RESET -#define __HAL_RCC_APB1_RELEASE_RESET __HAL_RCC_APB1_GRP1_RELEASE_RESET -#define __HAL_RCC_APB2_FORCE_RESET __HAL_RCC_APB1_GRP2_FORCE_RESET -#define __HAL_RCC_APB2_RELEASE_RESET __HAL_RCC_APB1_GRP2_RELEASE_RESET -#endif /* STM32C0 */ -#define __BKP_CLK_DISABLE __HAL_RCC_BKP_CLK_DISABLE -#define __BKP_CLK_ENABLE __HAL_RCC_BKP_CLK_ENABLE -#define __BKP_FORCE_RESET __HAL_RCC_BKP_FORCE_RESET -#define __BKP_RELEASE_RESET __HAL_RCC_BKP_RELEASE_RESET -#define __CAN1_CLK_DISABLE __HAL_RCC_CAN1_CLK_DISABLE -#define __CAN1_CLK_ENABLE __HAL_RCC_CAN1_CLK_ENABLE -#define __CAN1_CLK_SLEEP_DISABLE __HAL_RCC_CAN1_CLK_SLEEP_DISABLE -#define __CAN1_CLK_SLEEP_ENABLE __HAL_RCC_CAN1_CLK_SLEEP_ENABLE -#define __CAN1_FORCE_RESET __HAL_RCC_CAN1_FORCE_RESET -#define __CAN1_RELEASE_RESET __HAL_RCC_CAN1_RELEASE_RESET -#define __CAN_CLK_DISABLE __HAL_RCC_CAN1_CLK_DISABLE -#define __CAN_CLK_ENABLE __HAL_RCC_CAN1_CLK_ENABLE -#define __CAN_FORCE_RESET __HAL_RCC_CAN1_FORCE_RESET -#define __CAN_RELEASE_RESET __HAL_RCC_CAN1_RELEASE_RESET -#define __CAN2_CLK_DISABLE __HAL_RCC_CAN2_CLK_DISABLE -#define __CAN2_CLK_ENABLE __HAL_RCC_CAN2_CLK_ENABLE -#define __CAN2_FORCE_RESET __HAL_RCC_CAN2_FORCE_RESET -#define __CAN2_RELEASE_RESET __HAL_RCC_CAN2_RELEASE_RESET -#define __CEC_CLK_DISABLE __HAL_RCC_CEC_CLK_DISABLE -#define __CEC_CLK_ENABLE __HAL_RCC_CEC_CLK_ENABLE -#define __COMP_CLK_DISABLE __HAL_RCC_COMP_CLK_DISABLE -#define __COMP_CLK_ENABLE __HAL_RCC_COMP_CLK_ENABLE -#define __COMP_FORCE_RESET __HAL_RCC_COMP_FORCE_RESET -#define __COMP_RELEASE_RESET __HAL_RCC_COMP_RELEASE_RESET -#define __COMP_CLK_SLEEP_ENABLE __HAL_RCC_COMP_CLK_SLEEP_ENABLE -#define __COMP_CLK_SLEEP_DISABLE __HAL_RCC_COMP_CLK_SLEEP_DISABLE -#define __CEC_FORCE_RESET __HAL_RCC_CEC_FORCE_RESET -#define __CEC_RELEASE_RESET __HAL_RCC_CEC_RELEASE_RESET -#define __CRC_CLK_DISABLE __HAL_RCC_CRC_CLK_DISABLE -#define __CRC_CLK_ENABLE __HAL_RCC_CRC_CLK_ENABLE -#define __CRC_CLK_SLEEP_DISABLE __HAL_RCC_CRC_CLK_SLEEP_DISABLE -#define __CRC_CLK_SLEEP_ENABLE __HAL_RCC_CRC_CLK_SLEEP_ENABLE -#define __CRC_FORCE_RESET __HAL_RCC_CRC_FORCE_RESET -#define __CRC_RELEASE_RESET __HAL_RCC_CRC_RELEASE_RESET -#define __DAC_CLK_DISABLE __HAL_RCC_DAC_CLK_DISABLE -#define __DAC_CLK_ENABLE __HAL_RCC_DAC_CLK_ENABLE -#define __DAC_FORCE_RESET __HAL_RCC_DAC_FORCE_RESET -#define __DAC_RELEASE_RESET __HAL_RCC_DAC_RELEASE_RESET -#define __DAC1_CLK_DISABLE __HAL_RCC_DAC1_CLK_DISABLE -#define __DAC1_CLK_ENABLE __HAL_RCC_DAC1_CLK_ENABLE -#define __DAC1_CLK_SLEEP_DISABLE __HAL_RCC_DAC1_CLK_SLEEP_DISABLE -#define __DAC1_CLK_SLEEP_ENABLE __HAL_RCC_DAC1_CLK_SLEEP_ENABLE -#define __DAC1_FORCE_RESET __HAL_RCC_DAC1_FORCE_RESET -#define __DAC1_RELEASE_RESET __HAL_RCC_DAC1_RELEASE_RESET -#define __DBGMCU_CLK_ENABLE __HAL_RCC_DBGMCU_CLK_ENABLE -#define __DBGMCU_CLK_DISABLE __HAL_RCC_DBGMCU_CLK_DISABLE -#define __DBGMCU_FORCE_RESET __HAL_RCC_DBGMCU_FORCE_RESET -#define __DBGMCU_RELEASE_RESET __HAL_RCC_DBGMCU_RELEASE_RESET -#define __DFSDM_CLK_DISABLE __HAL_RCC_DFSDM_CLK_DISABLE -#define __DFSDM_CLK_ENABLE __HAL_RCC_DFSDM_CLK_ENABLE -#define __DFSDM_CLK_SLEEP_DISABLE __HAL_RCC_DFSDM_CLK_SLEEP_DISABLE -#define __DFSDM_CLK_SLEEP_ENABLE __HAL_RCC_DFSDM_CLK_SLEEP_ENABLE -#define __DFSDM_FORCE_RESET __HAL_RCC_DFSDM_FORCE_RESET -#define __DFSDM_RELEASE_RESET __HAL_RCC_DFSDM_RELEASE_RESET -#define __DMA1_CLK_DISABLE __HAL_RCC_DMA1_CLK_DISABLE -#define __DMA1_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE -#define __DMA1_CLK_SLEEP_DISABLE __HAL_RCC_DMA1_CLK_SLEEP_DISABLE -#define __DMA1_CLK_SLEEP_ENABLE __HAL_RCC_DMA1_CLK_SLEEP_ENABLE -#define __DMA1_FORCE_RESET __HAL_RCC_DMA1_FORCE_RESET -#define __DMA1_RELEASE_RESET __HAL_RCC_DMA1_RELEASE_RESET -#define __DMA2_CLK_DISABLE __HAL_RCC_DMA2_CLK_DISABLE -#define __DMA2_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE -#define __DMA2_CLK_SLEEP_DISABLE __HAL_RCC_DMA2_CLK_SLEEP_DISABLE -#define __DMA2_CLK_SLEEP_ENABLE __HAL_RCC_DMA2_CLK_SLEEP_ENABLE -#define __DMA2_FORCE_RESET __HAL_RCC_DMA2_FORCE_RESET -#define __DMA2_RELEASE_RESET __HAL_RCC_DMA2_RELEASE_RESET -#define __ETHMAC_CLK_DISABLE __HAL_RCC_ETHMAC_CLK_DISABLE -#define __ETHMAC_CLK_ENABLE __HAL_RCC_ETHMAC_CLK_ENABLE -#define __ETHMAC_FORCE_RESET __HAL_RCC_ETHMAC_FORCE_RESET -#define __ETHMAC_RELEASE_RESET __HAL_RCC_ETHMAC_RELEASE_RESET -#define __ETHMACRX_CLK_DISABLE __HAL_RCC_ETHMACRX_CLK_DISABLE -#define __ETHMACRX_CLK_ENABLE __HAL_RCC_ETHMACRX_CLK_ENABLE -#define __ETHMACTX_CLK_DISABLE __HAL_RCC_ETHMACTX_CLK_DISABLE -#define __ETHMACTX_CLK_ENABLE __HAL_RCC_ETHMACTX_CLK_ENABLE -#define __FIREWALL_CLK_DISABLE __HAL_RCC_FIREWALL_CLK_DISABLE -#define __FIREWALL_CLK_ENABLE __HAL_RCC_FIREWALL_CLK_ENABLE -#define __FLASH_CLK_DISABLE __HAL_RCC_FLASH_CLK_DISABLE -#define __FLASH_CLK_ENABLE __HAL_RCC_FLASH_CLK_ENABLE -#define __FLASH_CLK_SLEEP_DISABLE __HAL_RCC_FLASH_CLK_SLEEP_DISABLE -#define __FLASH_CLK_SLEEP_ENABLE __HAL_RCC_FLASH_CLK_SLEEP_ENABLE -#define __FLASH_FORCE_RESET __HAL_RCC_FLASH_FORCE_RESET -#define __FLASH_RELEASE_RESET __HAL_RCC_FLASH_RELEASE_RESET -#define __FLITF_CLK_DISABLE __HAL_RCC_FLITF_CLK_DISABLE -#define __FLITF_CLK_ENABLE __HAL_RCC_FLITF_CLK_ENABLE -#define __FLITF_FORCE_RESET __HAL_RCC_FLITF_FORCE_RESET -#define __FLITF_RELEASE_RESET __HAL_RCC_FLITF_RELEASE_RESET -#define __FLITF_CLK_SLEEP_ENABLE __HAL_RCC_FLITF_CLK_SLEEP_ENABLE -#define __FLITF_CLK_SLEEP_DISABLE __HAL_RCC_FLITF_CLK_SLEEP_DISABLE -#define __FMC_CLK_DISABLE __HAL_RCC_FMC_CLK_DISABLE -#define __FMC_CLK_ENABLE __HAL_RCC_FMC_CLK_ENABLE -#define __FMC_CLK_SLEEP_DISABLE __HAL_RCC_FMC_CLK_SLEEP_DISABLE -#define __FMC_CLK_SLEEP_ENABLE __HAL_RCC_FMC_CLK_SLEEP_ENABLE -#define __FMC_FORCE_RESET __HAL_RCC_FMC_FORCE_RESET -#define __FMC_RELEASE_RESET __HAL_RCC_FMC_RELEASE_RESET -#define __FSMC_CLK_DISABLE __HAL_RCC_FSMC_CLK_DISABLE -#define __FSMC_CLK_ENABLE __HAL_RCC_FSMC_CLK_ENABLE -#define __GPIOA_CLK_DISABLE __HAL_RCC_GPIOA_CLK_DISABLE -#define __GPIOA_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE -#define __GPIOA_CLK_SLEEP_DISABLE __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE -#define __GPIOA_CLK_SLEEP_ENABLE __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE -#define __GPIOA_FORCE_RESET __HAL_RCC_GPIOA_FORCE_RESET -#define __GPIOA_RELEASE_RESET __HAL_RCC_GPIOA_RELEASE_RESET -#define __GPIOB_CLK_DISABLE __HAL_RCC_GPIOB_CLK_DISABLE -#define __GPIOB_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE -#define __GPIOB_CLK_SLEEP_DISABLE __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE -#define __GPIOB_CLK_SLEEP_ENABLE __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE -#define __GPIOB_FORCE_RESET __HAL_RCC_GPIOB_FORCE_RESET -#define __GPIOB_RELEASE_RESET __HAL_RCC_GPIOB_RELEASE_RESET -#define __GPIOC_CLK_DISABLE __HAL_RCC_GPIOC_CLK_DISABLE -#define __GPIOC_CLK_ENABLE __HAL_RCC_GPIOC_CLK_ENABLE -#define __GPIOC_CLK_SLEEP_DISABLE __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE -#define __GPIOC_CLK_SLEEP_ENABLE __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE -#define __GPIOC_FORCE_RESET __HAL_RCC_GPIOC_FORCE_RESET -#define __GPIOC_RELEASE_RESET __HAL_RCC_GPIOC_RELEASE_RESET -#define __GPIOD_CLK_DISABLE __HAL_RCC_GPIOD_CLK_DISABLE -#define __GPIOD_CLK_ENABLE __HAL_RCC_GPIOD_CLK_ENABLE -#define __GPIOD_CLK_SLEEP_DISABLE __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE -#define __GPIOD_CLK_SLEEP_ENABLE __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE -#define __GPIOD_FORCE_RESET __HAL_RCC_GPIOD_FORCE_RESET -#define __GPIOD_RELEASE_RESET __HAL_RCC_GPIOD_RELEASE_RESET -#define __GPIOE_CLK_DISABLE __HAL_RCC_GPIOE_CLK_DISABLE -#define __GPIOE_CLK_ENABLE __HAL_RCC_GPIOE_CLK_ENABLE -#define __GPIOE_CLK_SLEEP_DISABLE __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE -#define __GPIOE_CLK_SLEEP_ENABLE __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE -#define __GPIOE_FORCE_RESET __HAL_RCC_GPIOE_FORCE_RESET -#define __GPIOE_RELEASE_RESET __HAL_RCC_GPIOE_RELEASE_RESET -#define __GPIOF_CLK_DISABLE __HAL_RCC_GPIOF_CLK_DISABLE -#define __GPIOF_CLK_ENABLE __HAL_RCC_GPIOF_CLK_ENABLE -#define __GPIOF_CLK_SLEEP_DISABLE __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE -#define __GPIOF_CLK_SLEEP_ENABLE __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE -#define __GPIOF_FORCE_RESET __HAL_RCC_GPIOF_FORCE_RESET -#define __GPIOF_RELEASE_RESET __HAL_RCC_GPIOF_RELEASE_RESET -#define __GPIOG_CLK_DISABLE __HAL_RCC_GPIOG_CLK_DISABLE -#define __GPIOG_CLK_ENABLE __HAL_RCC_GPIOG_CLK_ENABLE -#define __GPIOG_CLK_SLEEP_DISABLE __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE -#define __GPIOG_CLK_SLEEP_ENABLE __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE -#define __GPIOG_FORCE_RESET __HAL_RCC_GPIOG_FORCE_RESET -#define __GPIOG_RELEASE_RESET __HAL_RCC_GPIOG_RELEASE_RESET -#define __GPIOH_CLK_DISABLE __HAL_RCC_GPIOH_CLK_DISABLE -#define __GPIOH_CLK_ENABLE __HAL_RCC_GPIOH_CLK_ENABLE -#define __GPIOH_CLK_SLEEP_DISABLE __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE -#define __GPIOH_CLK_SLEEP_ENABLE __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE -#define __GPIOH_FORCE_RESET __HAL_RCC_GPIOH_FORCE_RESET -#define __GPIOH_RELEASE_RESET __HAL_RCC_GPIOH_RELEASE_RESET -#define __I2C1_CLK_DISABLE __HAL_RCC_I2C1_CLK_DISABLE -#define __I2C1_CLK_ENABLE __HAL_RCC_I2C1_CLK_ENABLE -#define __I2C1_CLK_SLEEP_DISABLE __HAL_RCC_I2C1_CLK_SLEEP_DISABLE -#define __I2C1_CLK_SLEEP_ENABLE __HAL_RCC_I2C1_CLK_SLEEP_ENABLE -#define __I2C1_FORCE_RESET __HAL_RCC_I2C1_FORCE_RESET -#define __I2C1_RELEASE_RESET __HAL_RCC_I2C1_RELEASE_RESET -#define __I2C2_CLK_DISABLE __HAL_RCC_I2C2_CLK_DISABLE -#define __I2C2_CLK_ENABLE __HAL_RCC_I2C2_CLK_ENABLE -#define __I2C2_CLK_SLEEP_DISABLE __HAL_RCC_I2C2_CLK_SLEEP_DISABLE -#define __I2C2_CLK_SLEEP_ENABLE __HAL_RCC_I2C2_CLK_SLEEP_ENABLE -#define __I2C2_FORCE_RESET __HAL_RCC_I2C2_FORCE_RESET -#define __I2C2_RELEASE_RESET __HAL_RCC_I2C2_RELEASE_RESET -#define __I2C3_CLK_DISABLE __HAL_RCC_I2C3_CLK_DISABLE -#define __I2C3_CLK_ENABLE __HAL_RCC_I2C3_CLK_ENABLE -#define __I2C3_CLK_SLEEP_DISABLE __HAL_RCC_I2C3_CLK_SLEEP_DISABLE -#define __I2C3_CLK_SLEEP_ENABLE __HAL_RCC_I2C3_CLK_SLEEP_ENABLE -#define __I2C3_FORCE_RESET __HAL_RCC_I2C3_FORCE_RESET -#define __I2C3_RELEASE_RESET __HAL_RCC_I2C3_RELEASE_RESET -#define __LCD_CLK_DISABLE __HAL_RCC_LCD_CLK_DISABLE -#define __LCD_CLK_ENABLE __HAL_RCC_LCD_CLK_ENABLE -#define __LCD_CLK_SLEEP_DISABLE __HAL_RCC_LCD_CLK_SLEEP_DISABLE -#define __LCD_CLK_SLEEP_ENABLE __HAL_RCC_LCD_CLK_SLEEP_ENABLE -#define __LCD_FORCE_RESET __HAL_RCC_LCD_FORCE_RESET -#define __LCD_RELEASE_RESET __HAL_RCC_LCD_RELEASE_RESET -#define __LPTIM1_CLK_DISABLE __HAL_RCC_LPTIM1_CLK_DISABLE -#define __LPTIM1_CLK_ENABLE __HAL_RCC_LPTIM1_CLK_ENABLE -#define __LPTIM1_CLK_SLEEP_DISABLE __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE -#define __LPTIM1_CLK_SLEEP_ENABLE __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE -#define __LPTIM1_FORCE_RESET __HAL_RCC_LPTIM1_FORCE_RESET -#define __LPTIM1_RELEASE_RESET __HAL_RCC_LPTIM1_RELEASE_RESET -#define __LPTIM2_CLK_DISABLE __HAL_RCC_LPTIM2_CLK_DISABLE -#define __LPTIM2_CLK_ENABLE __HAL_RCC_LPTIM2_CLK_ENABLE -#define __LPTIM2_CLK_SLEEP_DISABLE __HAL_RCC_LPTIM2_CLK_SLEEP_DISABLE -#define __LPTIM2_CLK_SLEEP_ENABLE __HAL_RCC_LPTIM2_CLK_SLEEP_ENABLE -#define __LPTIM2_FORCE_RESET __HAL_RCC_LPTIM2_FORCE_RESET -#define __LPTIM2_RELEASE_RESET __HAL_RCC_LPTIM2_RELEASE_RESET -#define __LPUART1_CLK_DISABLE __HAL_RCC_LPUART1_CLK_DISABLE -#define __LPUART1_CLK_ENABLE __HAL_RCC_LPUART1_CLK_ENABLE -#define __LPUART1_CLK_SLEEP_DISABLE __HAL_RCC_LPUART1_CLK_SLEEP_DISABLE -#define __LPUART1_CLK_SLEEP_ENABLE __HAL_RCC_LPUART1_CLK_SLEEP_ENABLE -#define __LPUART1_FORCE_RESET __HAL_RCC_LPUART1_FORCE_RESET -#define __LPUART1_RELEASE_RESET __HAL_RCC_LPUART1_RELEASE_RESET -#define __OPAMP_CLK_DISABLE __HAL_RCC_OPAMP_CLK_DISABLE -#define __OPAMP_CLK_ENABLE __HAL_RCC_OPAMP_CLK_ENABLE -#define __OPAMP_CLK_SLEEP_DISABLE __HAL_RCC_OPAMP_CLK_SLEEP_DISABLE -#define __OPAMP_CLK_SLEEP_ENABLE __HAL_RCC_OPAMP_CLK_SLEEP_ENABLE -#define __OPAMP_FORCE_RESET __HAL_RCC_OPAMP_FORCE_RESET -#define __OPAMP_RELEASE_RESET __HAL_RCC_OPAMP_RELEASE_RESET -#define __OTGFS_CLK_DISABLE __HAL_RCC_OTGFS_CLK_DISABLE -#define __OTGFS_CLK_ENABLE __HAL_RCC_OTGFS_CLK_ENABLE -#define __OTGFS_CLK_SLEEP_DISABLE __HAL_RCC_OTGFS_CLK_SLEEP_DISABLE -#define __OTGFS_CLK_SLEEP_ENABLE __HAL_RCC_OTGFS_CLK_SLEEP_ENABLE -#define __OTGFS_FORCE_RESET __HAL_RCC_OTGFS_FORCE_RESET -#define __OTGFS_RELEASE_RESET __HAL_RCC_OTGFS_RELEASE_RESET -#define __PWR_CLK_DISABLE __HAL_RCC_PWR_CLK_DISABLE -#define __PWR_CLK_ENABLE __HAL_RCC_PWR_CLK_ENABLE -#define __PWR_CLK_SLEEP_DISABLE __HAL_RCC_PWR_CLK_SLEEP_DISABLE -#define __PWR_CLK_SLEEP_ENABLE __HAL_RCC_PWR_CLK_SLEEP_ENABLE -#define __PWR_FORCE_RESET __HAL_RCC_PWR_FORCE_RESET -#define __PWR_RELEASE_RESET __HAL_RCC_PWR_RELEASE_RESET -#define __QSPI_CLK_DISABLE __HAL_RCC_QSPI_CLK_DISABLE -#define __QSPI_CLK_ENABLE __HAL_RCC_QSPI_CLK_ENABLE -#define __QSPI_CLK_SLEEP_DISABLE __HAL_RCC_QSPI_CLK_SLEEP_DISABLE -#define __QSPI_CLK_SLEEP_ENABLE __HAL_RCC_QSPI_CLK_SLEEP_ENABLE -#define __QSPI_FORCE_RESET __HAL_RCC_QSPI_FORCE_RESET -#define __QSPI_RELEASE_RESET __HAL_RCC_QSPI_RELEASE_RESET - -#if defined(STM32WB) -#define __HAL_RCC_QSPI_CLK_DISABLE __HAL_RCC_QUADSPI_CLK_DISABLE -#define __HAL_RCC_QSPI_CLK_ENABLE __HAL_RCC_QUADSPI_CLK_ENABLE -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE __HAL_RCC_QUADSPI_CLK_SLEEP_DISABLE -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE __HAL_RCC_QUADSPI_CLK_SLEEP_ENABLE -#define __HAL_RCC_QSPI_FORCE_RESET __HAL_RCC_QUADSPI_FORCE_RESET -#define __HAL_RCC_QSPI_RELEASE_RESET __HAL_RCC_QUADSPI_RELEASE_RESET -#define __HAL_RCC_QSPI_IS_CLK_ENABLED __HAL_RCC_QUADSPI_IS_CLK_ENABLED -#define __HAL_RCC_QSPI_IS_CLK_DISABLED __HAL_RCC_QUADSPI_IS_CLK_DISABLED -#define __HAL_RCC_QSPI_IS_CLK_SLEEP_ENABLED __HAL_RCC_QUADSPI_IS_CLK_SLEEP_ENABLED -#define __HAL_RCC_QSPI_IS_CLK_SLEEP_DISABLED __HAL_RCC_QUADSPI_IS_CLK_SLEEP_DISABLED -#define QSPI_IRQHandler QUADSPI_IRQHandler -#endif /* __HAL_RCC_QUADSPI_CLK_ENABLE */ - -#define __RNG_CLK_DISABLE __HAL_RCC_RNG_CLK_DISABLE -#define __RNG_CLK_ENABLE __HAL_RCC_RNG_CLK_ENABLE -#define __RNG_CLK_SLEEP_DISABLE __HAL_RCC_RNG_CLK_SLEEP_DISABLE -#define __RNG_CLK_SLEEP_ENABLE __HAL_RCC_RNG_CLK_SLEEP_ENABLE -#define __RNG_FORCE_RESET __HAL_RCC_RNG_FORCE_RESET -#define __RNG_RELEASE_RESET __HAL_RCC_RNG_RELEASE_RESET -#define __SAI1_CLK_DISABLE __HAL_RCC_SAI1_CLK_DISABLE -#define __SAI1_CLK_ENABLE __HAL_RCC_SAI1_CLK_ENABLE -#define __SAI1_CLK_SLEEP_DISABLE __HAL_RCC_SAI1_CLK_SLEEP_DISABLE -#define __SAI1_CLK_SLEEP_ENABLE __HAL_RCC_SAI1_CLK_SLEEP_ENABLE -#define __SAI1_FORCE_RESET __HAL_RCC_SAI1_FORCE_RESET -#define __SAI1_RELEASE_RESET __HAL_RCC_SAI1_RELEASE_RESET -#define __SAI2_CLK_DISABLE __HAL_RCC_SAI2_CLK_DISABLE -#define __SAI2_CLK_ENABLE __HAL_RCC_SAI2_CLK_ENABLE -#define __SAI2_CLK_SLEEP_DISABLE __HAL_RCC_SAI2_CLK_SLEEP_DISABLE -#define __SAI2_CLK_SLEEP_ENABLE __HAL_RCC_SAI2_CLK_SLEEP_ENABLE -#define __SAI2_FORCE_RESET __HAL_RCC_SAI2_FORCE_RESET -#define __SAI2_RELEASE_RESET __HAL_RCC_SAI2_RELEASE_RESET -#define __SDIO_CLK_DISABLE __HAL_RCC_SDIO_CLK_DISABLE -#define __SDIO_CLK_ENABLE __HAL_RCC_SDIO_CLK_ENABLE -#define __SDMMC_CLK_DISABLE __HAL_RCC_SDMMC_CLK_DISABLE -#define __SDMMC_CLK_ENABLE __HAL_RCC_SDMMC_CLK_ENABLE -#define __SDMMC_CLK_SLEEP_DISABLE __HAL_RCC_SDMMC_CLK_SLEEP_DISABLE -#define __SDMMC_CLK_SLEEP_ENABLE __HAL_RCC_SDMMC_CLK_SLEEP_ENABLE -#define __SDMMC_FORCE_RESET __HAL_RCC_SDMMC_FORCE_RESET -#define __SDMMC_RELEASE_RESET __HAL_RCC_SDMMC_RELEASE_RESET -#define __SPI1_CLK_DISABLE __HAL_RCC_SPI1_CLK_DISABLE -#define __SPI1_CLK_ENABLE __HAL_RCC_SPI1_CLK_ENABLE -#define __SPI1_CLK_SLEEP_DISABLE __HAL_RCC_SPI1_CLK_SLEEP_DISABLE -#define __SPI1_CLK_SLEEP_ENABLE __HAL_RCC_SPI1_CLK_SLEEP_ENABLE -#define __SPI1_FORCE_RESET __HAL_RCC_SPI1_FORCE_RESET -#define __SPI1_RELEASE_RESET __HAL_RCC_SPI1_RELEASE_RESET -#define __SPI2_CLK_DISABLE __HAL_RCC_SPI2_CLK_DISABLE -#define __SPI2_CLK_ENABLE __HAL_RCC_SPI2_CLK_ENABLE -#define __SPI2_CLK_SLEEP_DISABLE __HAL_RCC_SPI2_CLK_SLEEP_DISABLE -#define __SPI2_CLK_SLEEP_ENABLE __HAL_RCC_SPI2_CLK_SLEEP_ENABLE -#define __SPI2_FORCE_RESET __HAL_RCC_SPI2_FORCE_RESET -#define __SPI2_RELEASE_RESET __HAL_RCC_SPI2_RELEASE_RESET -#define __SPI3_CLK_DISABLE __HAL_RCC_SPI3_CLK_DISABLE -#define __SPI3_CLK_ENABLE __HAL_RCC_SPI3_CLK_ENABLE -#define __SPI3_CLK_SLEEP_DISABLE __HAL_RCC_SPI3_CLK_SLEEP_DISABLE -#define __SPI3_CLK_SLEEP_ENABLE __HAL_RCC_SPI3_CLK_SLEEP_ENABLE -#define __SPI3_FORCE_RESET __HAL_RCC_SPI3_FORCE_RESET -#define __SPI3_RELEASE_RESET __HAL_RCC_SPI3_RELEASE_RESET -#define __SRAM_CLK_DISABLE __HAL_RCC_SRAM_CLK_DISABLE -#define __SRAM_CLK_ENABLE __HAL_RCC_SRAM_CLK_ENABLE -#define __SRAM1_CLK_SLEEP_DISABLE __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE -#define __SRAM1_CLK_SLEEP_ENABLE __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE -#define __SRAM2_CLK_SLEEP_DISABLE __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE -#define __SRAM2_CLK_SLEEP_ENABLE __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE -#define __SWPMI1_CLK_DISABLE __HAL_RCC_SWPMI1_CLK_DISABLE -#define __SWPMI1_CLK_ENABLE __HAL_RCC_SWPMI1_CLK_ENABLE -#define __SWPMI1_CLK_SLEEP_DISABLE __HAL_RCC_SWPMI1_CLK_SLEEP_DISABLE -#define __SWPMI1_CLK_SLEEP_ENABLE __HAL_RCC_SWPMI1_CLK_SLEEP_ENABLE -#define __SWPMI1_FORCE_RESET __HAL_RCC_SWPMI1_FORCE_RESET -#define __SWPMI1_RELEASE_RESET __HAL_RCC_SWPMI1_RELEASE_RESET -#define __SYSCFG_CLK_DISABLE __HAL_RCC_SYSCFG_CLK_DISABLE -#define __SYSCFG_CLK_ENABLE __HAL_RCC_SYSCFG_CLK_ENABLE -#define __SYSCFG_CLK_SLEEP_DISABLE __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE -#define __SYSCFG_CLK_SLEEP_ENABLE __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE -#define __SYSCFG_FORCE_RESET __HAL_RCC_SYSCFG_FORCE_RESET -#define __SYSCFG_RELEASE_RESET __HAL_RCC_SYSCFG_RELEASE_RESET -#define __TIM1_CLK_DISABLE __HAL_RCC_TIM1_CLK_DISABLE -#define __TIM1_CLK_ENABLE __HAL_RCC_TIM1_CLK_ENABLE -#define __TIM1_CLK_SLEEP_DISABLE __HAL_RCC_TIM1_CLK_SLEEP_DISABLE -#define __TIM1_CLK_SLEEP_ENABLE __HAL_RCC_TIM1_CLK_SLEEP_ENABLE -#define __TIM1_FORCE_RESET __HAL_RCC_TIM1_FORCE_RESET -#define __TIM1_RELEASE_RESET __HAL_RCC_TIM1_RELEASE_RESET -#define __TIM10_CLK_DISABLE __HAL_RCC_TIM10_CLK_DISABLE -#define __TIM10_CLK_ENABLE __HAL_RCC_TIM10_CLK_ENABLE -#define __TIM10_FORCE_RESET __HAL_RCC_TIM10_FORCE_RESET -#define __TIM10_RELEASE_RESET __HAL_RCC_TIM10_RELEASE_RESET -#define __TIM11_CLK_DISABLE __HAL_RCC_TIM11_CLK_DISABLE -#define __TIM11_CLK_ENABLE __HAL_RCC_TIM11_CLK_ENABLE -#define __TIM11_FORCE_RESET __HAL_RCC_TIM11_FORCE_RESET -#define __TIM11_RELEASE_RESET __HAL_RCC_TIM11_RELEASE_RESET -#define __TIM12_CLK_DISABLE __HAL_RCC_TIM12_CLK_DISABLE -#define __TIM12_CLK_ENABLE __HAL_RCC_TIM12_CLK_ENABLE -#define __TIM12_FORCE_RESET __HAL_RCC_TIM12_FORCE_RESET -#define __TIM12_RELEASE_RESET __HAL_RCC_TIM12_RELEASE_RESET -#define __TIM13_CLK_DISABLE __HAL_RCC_TIM13_CLK_DISABLE -#define __TIM13_CLK_ENABLE __HAL_RCC_TIM13_CLK_ENABLE -#define __TIM13_FORCE_RESET __HAL_RCC_TIM13_FORCE_RESET -#define __TIM13_RELEASE_RESET __HAL_RCC_TIM13_RELEASE_RESET -#define __TIM14_CLK_DISABLE __HAL_RCC_TIM14_CLK_DISABLE -#define __TIM14_CLK_ENABLE __HAL_RCC_TIM14_CLK_ENABLE -#define __TIM14_FORCE_RESET __HAL_RCC_TIM14_FORCE_RESET -#define __TIM14_RELEASE_RESET __HAL_RCC_TIM14_RELEASE_RESET -#define __TIM15_CLK_DISABLE __HAL_RCC_TIM15_CLK_DISABLE -#define __TIM15_CLK_ENABLE __HAL_RCC_TIM15_CLK_ENABLE -#define __TIM15_CLK_SLEEP_DISABLE __HAL_RCC_TIM15_CLK_SLEEP_DISABLE -#define __TIM15_CLK_SLEEP_ENABLE __HAL_RCC_TIM15_CLK_SLEEP_ENABLE -#define __TIM15_FORCE_RESET __HAL_RCC_TIM15_FORCE_RESET -#define __TIM15_RELEASE_RESET __HAL_RCC_TIM15_RELEASE_RESET -#define __TIM16_CLK_DISABLE __HAL_RCC_TIM16_CLK_DISABLE -#define __TIM16_CLK_ENABLE __HAL_RCC_TIM16_CLK_ENABLE -#define __TIM16_CLK_SLEEP_DISABLE __HAL_RCC_TIM16_CLK_SLEEP_DISABLE -#define __TIM16_CLK_SLEEP_ENABLE __HAL_RCC_TIM16_CLK_SLEEP_ENABLE -#define __TIM16_FORCE_RESET __HAL_RCC_TIM16_FORCE_RESET -#define __TIM16_RELEASE_RESET __HAL_RCC_TIM16_RELEASE_RESET -#define __TIM17_CLK_DISABLE __HAL_RCC_TIM17_CLK_DISABLE -#define __TIM17_CLK_ENABLE __HAL_RCC_TIM17_CLK_ENABLE -#define __TIM17_CLK_SLEEP_DISABLE __HAL_RCC_TIM17_CLK_SLEEP_DISABLE -#define __TIM17_CLK_SLEEP_ENABLE __HAL_RCC_TIM17_CLK_SLEEP_ENABLE -#define __TIM17_FORCE_RESET __HAL_RCC_TIM17_FORCE_RESET -#define __TIM17_RELEASE_RESET __HAL_RCC_TIM17_RELEASE_RESET -#define __TIM2_CLK_DISABLE __HAL_RCC_TIM2_CLK_DISABLE -#define __TIM2_CLK_ENABLE __HAL_RCC_TIM2_CLK_ENABLE -#define __TIM2_CLK_SLEEP_DISABLE __HAL_RCC_TIM2_CLK_SLEEP_DISABLE -#define __TIM2_CLK_SLEEP_ENABLE __HAL_RCC_TIM2_CLK_SLEEP_ENABLE -#define __TIM2_FORCE_RESET __HAL_RCC_TIM2_FORCE_RESET -#define __TIM2_RELEASE_RESET __HAL_RCC_TIM2_RELEASE_RESET -#define __TIM3_CLK_DISABLE __HAL_RCC_TIM3_CLK_DISABLE -#define __TIM3_CLK_ENABLE __HAL_RCC_TIM3_CLK_ENABLE -#define __TIM3_CLK_SLEEP_DISABLE __HAL_RCC_TIM3_CLK_SLEEP_DISABLE -#define __TIM3_CLK_SLEEP_ENABLE __HAL_RCC_TIM3_CLK_SLEEP_ENABLE -#define __TIM3_FORCE_RESET __HAL_RCC_TIM3_FORCE_RESET -#define __TIM3_RELEASE_RESET __HAL_RCC_TIM3_RELEASE_RESET -#define __TIM4_CLK_DISABLE __HAL_RCC_TIM4_CLK_DISABLE -#define __TIM4_CLK_ENABLE __HAL_RCC_TIM4_CLK_ENABLE -#define __TIM4_CLK_SLEEP_DISABLE __HAL_RCC_TIM4_CLK_SLEEP_DISABLE -#define __TIM4_CLK_SLEEP_ENABLE __HAL_RCC_TIM4_CLK_SLEEP_ENABLE -#define __TIM4_FORCE_RESET __HAL_RCC_TIM4_FORCE_RESET -#define __TIM4_RELEASE_RESET __HAL_RCC_TIM4_RELEASE_RESET -#define __TIM5_CLK_DISABLE __HAL_RCC_TIM5_CLK_DISABLE -#define __TIM5_CLK_ENABLE __HAL_RCC_TIM5_CLK_ENABLE -#define __TIM5_CLK_SLEEP_DISABLE __HAL_RCC_TIM5_CLK_SLEEP_DISABLE -#define __TIM5_CLK_SLEEP_ENABLE __HAL_RCC_TIM5_CLK_SLEEP_ENABLE -#define __TIM5_FORCE_RESET __HAL_RCC_TIM5_FORCE_RESET -#define __TIM5_RELEASE_RESET __HAL_RCC_TIM5_RELEASE_RESET -#define __TIM6_CLK_DISABLE __HAL_RCC_TIM6_CLK_DISABLE -#define __TIM6_CLK_ENABLE __HAL_RCC_TIM6_CLK_ENABLE -#define __TIM6_CLK_SLEEP_DISABLE __HAL_RCC_TIM6_CLK_SLEEP_DISABLE -#define __TIM6_CLK_SLEEP_ENABLE __HAL_RCC_TIM6_CLK_SLEEP_ENABLE -#define __TIM6_FORCE_RESET __HAL_RCC_TIM6_FORCE_RESET -#define __TIM6_RELEASE_RESET __HAL_RCC_TIM6_RELEASE_RESET -#define __TIM7_CLK_DISABLE __HAL_RCC_TIM7_CLK_DISABLE -#define __TIM7_CLK_ENABLE __HAL_RCC_TIM7_CLK_ENABLE -#define __TIM7_CLK_SLEEP_DISABLE __HAL_RCC_TIM7_CLK_SLEEP_DISABLE -#define __TIM7_CLK_SLEEP_ENABLE __HAL_RCC_TIM7_CLK_SLEEP_ENABLE -#define __TIM7_FORCE_RESET __HAL_RCC_TIM7_FORCE_RESET -#define __TIM7_RELEASE_RESET __HAL_RCC_TIM7_RELEASE_RESET -#define __TIM8_CLK_DISABLE __HAL_RCC_TIM8_CLK_DISABLE -#define __TIM8_CLK_ENABLE __HAL_RCC_TIM8_CLK_ENABLE -#define __TIM8_CLK_SLEEP_DISABLE __HAL_RCC_TIM8_CLK_SLEEP_DISABLE -#define __TIM8_CLK_SLEEP_ENABLE __HAL_RCC_TIM8_CLK_SLEEP_ENABLE -#define __TIM8_FORCE_RESET __HAL_RCC_TIM8_FORCE_RESET -#define __TIM8_RELEASE_RESET __HAL_RCC_TIM8_RELEASE_RESET -#define __TIM9_CLK_DISABLE __HAL_RCC_TIM9_CLK_DISABLE -#define __TIM9_CLK_ENABLE __HAL_RCC_TIM9_CLK_ENABLE -#define __TIM9_FORCE_RESET __HAL_RCC_TIM9_FORCE_RESET -#define __TIM9_RELEASE_RESET __HAL_RCC_TIM9_RELEASE_RESET -#define __TSC_CLK_DISABLE __HAL_RCC_TSC_CLK_DISABLE -#define __TSC_CLK_ENABLE __HAL_RCC_TSC_CLK_ENABLE -#define __TSC_CLK_SLEEP_DISABLE __HAL_RCC_TSC_CLK_SLEEP_DISABLE -#define __TSC_CLK_SLEEP_ENABLE __HAL_RCC_TSC_CLK_SLEEP_ENABLE -#define __TSC_FORCE_RESET __HAL_RCC_TSC_FORCE_RESET -#define __TSC_RELEASE_RESET __HAL_RCC_TSC_RELEASE_RESET -#define __UART4_CLK_DISABLE __HAL_RCC_UART4_CLK_DISABLE -#define __UART4_CLK_ENABLE __HAL_RCC_UART4_CLK_ENABLE -#define __UART4_CLK_SLEEP_DISABLE __HAL_RCC_UART4_CLK_SLEEP_DISABLE -#define __UART4_CLK_SLEEP_ENABLE __HAL_RCC_UART4_CLK_SLEEP_ENABLE -#define __UART4_FORCE_RESET __HAL_RCC_UART4_FORCE_RESET -#define __UART4_RELEASE_RESET __HAL_RCC_UART4_RELEASE_RESET -#define __UART5_CLK_DISABLE __HAL_RCC_UART5_CLK_DISABLE -#define __UART5_CLK_ENABLE __HAL_RCC_UART5_CLK_ENABLE -#define __UART5_CLK_SLEEP_DISABLE __HAL_RCC_UART5_CLK_SLEEP_DISABLE -#define __UART5_CLK_SLEEP_ENABLE __HAL_RCC_UART5_CLK_SLEEP_ENABLE -#define __UART5_FORCE_RESET __HAL_RCC_UART5_FORCE_RESET -#define __UART5_RELEASE_RESET __HAL_RCC_UART5_RELEASE_RESET -#define __USART1_CLK_DISABLE __HAL_RCC_USART1_CLK_DISABLE -#define __USART1_CLK_ENABLE __HAL_RCC_USART1_CLK_ENABLE -#define __USART1_CLK_SLEEP_DISABLE __HAL_RCC_USART1_CLK_SLEEP_DISABLE -#define __USART1_CLK_SLEEP_ENABLE __HAL_RCC_USART1_CLK_SLEEP_ENABLE -#define __USART1_FORCE_RESET __HAL_RCC_USART1_FORCE_RESET -#define __USART1_RELEASE_RESET __HAL_RCC_USART1_RELEASE_RESET -#define __USART2_CLK_DISABLE __HAL_RCC_USART2_CLK_DISABLE -#define __USART2_CLK_ENABLE __HAL_RCC_USART2_CLK_ENABLE -#define __USART2_CLK_SLEEP_DISABLE __HAL_RCC_USART2_CLK_SLEEP_DISABLE -#define __USART2_CLK_SLEEP_ENABLE __HAL_RCC_USART2_CLK_SLEEP_ENABLE -#define __USART2_FORCE_RESET __HAL_RCC_USART2_FORCE_RESET -#define __USART2_RELEASE_RESET __HAL_RCC_USART2_RELEASE_RESET -#define __USART3_CLK_DISABLE __HAL_RCC_USART3_CLK_DISABLE -#define __USART3_CLK_ENABLE __HAL_RCC_USART3_CLK_ENABLE -#define __USART3_CLK_SLEEP_DISABLE __HAL_RCC_USART3_CLK_SLEEP_DISABLE -#define __USART3_CLK_SLEEP_ENABLE __HAL_RCC_USART3_CLK_SLEEP_ENABLE -#define __USART3_FORCE_RESET __HAL_RCC_USART3_FORCE_RESET -#define __USART3_RELEASE_RESET __HAL_RCC_USART3_RELEASE_RESET -#define __USART4_CLK_DISABLE __HAL_RCC_UART4_CLK_DISABLE -#define __USART4_CLK_ENABLE __HAL_RCC_UART4_CLK_ENABLE -#define __USART4_CLK_SLEEP_ENABLE __HAL_RCC_UART4_CLK_SLEEP_ENABLE -#define __USART4_CLK_SLEEP_DISABLE __HAL_RCC_UART4_CLK_SLEEP_DISABLE -#define __USART4_FORCE_RESET __HAL_RCC_UART4_FORCE_RESET -#define __USART4_RELEASE_RESET __HAL_RCC_UART4_RELEASE_RESET -#define __USART5_CLK_DISABLE __HAL_RCC_UART5_CLK_DISABLE -#define __USART5_CLK_ENABLE __HAL_RCC_UART5_CLK_ENABLE -#define __USART5_CLK_SLEEP_ENABLE __HAL_RCC_UART5_CLK_SLEEP_ENABLE -#define __USART5_CLK_SLEEP_DISABLE __HAL_RCC_UART5_CLK_SLEEP_DISABLE -#define __USART5_FORCE_RESET __HAL_RCC_UART5_FORCE_RESET -#define __USART5_RELEASE_RESET __HAL_RCC_UART5_RELEASE_RESET -#define __USART7_CLK_DISABLE __HAL_RCC_UART7_CLK_DISABLE -#define __USART7_CLK_ENABLE __HAL_RCC_UART7_CLK_ENABLE -#define __USART7_FORCE_RESET __HAL_RCC_UART7_FORCE_RESET -#define __USART7_RELEASE_RESET __HAL_RCC_UART7_RELEASE_RESET -#define __USART8_CLK_DISABLE __HAL_RCC_UART8_CLK_DISABLE -#define __USART8_CLK_ENABLE __HAL_RCC_UART8_CLK_ENABLE -#define __USART8_FORCE_RESET __HAL_RCC_UART8_FORCE_RESET -#define __USART8_RELEASE_RESET __HAL_RCC_UART8_RELEASE_RESET -#define __USB_CLK_DISABLE __HAL_RCC_USB_CLK_DISABLE -#define __USB_CLK_ENABLE __HAL_RCC_USB_CLK_ENABLE -#define __USB_FORCE_RESET __HAL_RCC_USB_FORCE_RESET -#define __USB_CLK_SLEEP_ENABLE __HAL_RCC_USB_CLK_SLEEP_ENABLE -#define __USB_CLK_SLEEP_DISABLE __HAL_RCC_USB_CLK_SLEEP_DISABLE -#define __USB_OTG_FS_CLK_DISABLE __HAL_RCC_USB_OTG_FS_CLK_DISABLE -#define __USB_OTG_FS_CLK_ENABLE __HAL_RCC_USB_OTG_FS_CLK_ENABLE -#define __USB_RELEASE_RESET __HAL_RCC_USB_RELEASE_RESET - -#if defined(STM32H7) -#define __HAL_RCC_WWDG_CLK_DISABLE __HAL_RCC_WWDG1_CLK_DISABLE -#define __HAL_RCC_WWDG_CLK_ENABLE __HAL_RCC_WWDG1_CLK_ENABLE -#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG1_CLK_SLEEP_DISABLE -#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG1_CLK_SLEEP_ENABLE - -#define __HAL_RCC_WWDG_FORCE_RESET ((void)0U) /* Not available on the STM32H7*/ -#define __HAL_RCC_WWDG_RELEASE_RESET ((void)0U) /* Not available on the STM32H7*/ - - -#define __HAL_RCC_WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG1_IS_CLK_ENABLED -#define __HAL_RCC_WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG1_IS_CLK_DISABLED -#define RCC_SPI4CLKSOURCE_D2PCLK1 RCC_SPI4CLKSOURCE_D2PCLK2 -#define RCC_SPI5CLKSOURCE_D2PCLK1 RCC_SPI5CLKSOURCE_D2PCLK2 -#define RCC_SPI45CLKSOURCE_D2PCLK1 RCC_SPI45CLKSOURCE_D2PCLK2 -#define RCC_SPI45CLKSOURCE_CDPCLK1 RCC_SPI45CLKSOURCE_CDPCLK2 -#define RCC_SPI45CLKSOURCE_PCLK1 RCC_SPI45CLKSOURCE_PCLK2 -#endif - -#define __WWDG_CLK_DISABLE __HAL_RCC_WWDG_CLK_DISABLE -#define __WWDG_CLK_ENABLE __HAL_RCC_WWDG_CLK_ENABLE -#define __WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG_CLK_SLEEP_DISABLE -#define __WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG_CLK_SLEEP_ENABLE -#define __WWDG_FORCE_RESET __HAL_RCC_WWDG_FORCE_RESET -#define __WWDG_RELEASE_RESET __HAL_RCC_WWDG_RELEASE_RESET - -#define __TIM21_CLK_ENABLE __HAL_RCC_TIM21_CLK_ENABLE -#define __TIM21_CLK_DISABLE __HAL_RCC_TIM21_CLK_DISABLE -#define __TIM21_FORCE_RESET __HAL_RCC_TIM21_FORCE_RESET -#define __TIM21_RELEASE_RESET __HAL_RCC_TIM21_RELEASE_RESET -#define __TIM21_CLK_SLEEP_ENABLE __HAL_RCC_TIM21_CLK_SLEEP_ENABLE -#define __TIM21_CLK_SLEEP_DISABLE __HAL_RCC_TIM21_CLK_SLEEP_DISABLE -#define __TIM22_CLK_ENABLE __HAL_RCC_TIM22_CLK_ENABLE -#define __TIM22_CLK_DISABLE __HAL_RCC_TIM22_CLK_DISABLE -#define __TIM22_FORCE_RESET __HAL_RCC_TIM22_FORCE_RESET -#define __TIM22_RELEASE_RESET __HAL_RCC_TIM22_RELEASE_RESET -#define __TIM22_CLK_SLEEP_ENABLE __HAL_RCC_TIM22_CLK_SLEEP_ENABLE -#define __TIM22_CLK_SLEEP_DISABLE __HAL_RCC_TIM22_CLK_SLEEP_DISABLE -#define __CRS_CLK_DISABLE __HAL_RCC_CRS_CLK_DISABLE -#define __CRS_CLK_ENABLE __HAL_RCC_CRS_CLK_ENABLE -#define __CRS_CLK_SLEEP_DISABLE __HAL_RCC_CRS_CLK_SLEEP_DISABLE -#define __CRS_CLK_SLEEP_ENABLE __HAL_RCC_CRS_CLK_SLEEP_ENABLE -#define __CRS_FORCE_RESET __HAL_RCC_CRS_FORCE_RESET -#define __CRS_RELEASE_RESET __HAL_RCC_CRS_RELEASE_RESET -#define __RCC_BACKUPRESET_FORCE __HAL_RCC_BACKUPRESET_FORCE -#define __RCC_BACKUPRESET_RELEASE __HAL_RCC_BACKUPRESET_RELEASE - -#define __USB_OTG_FS_FORCE_RESET __HAL_RCC_USB_OTG_FS_FORCE_RESET -#define __USB_OTG_FS_RELEASE_RESET __HAL_RCC_USB_OTG_FS_RELEASE_RESET -#define __USB_OTG_FS_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE -#define __USB_OTG_FS_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE -#define __USB_OTG_HS_CLK_DISABLE __HAL_RCC_USB_OTG_HS_CLK_DISABLE -#define __USB_OTG_HS_CLK_ENABLE __HAL_RCC_USB_OTG_HS_CLK_ENABLE -#define __USB_OTG_HS_ULPI_CLK_ENABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE -#define __USB_OTG_HS_ULPI_CLK_DISABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE -#define __TIM9_CLK_SLEEP_ENABLE __HAL_RCC_TIM9_CLK_SLEEP_ENABLE -#define __TIM9_CLK_SLEEP_DISABLE __HAL_RCC_TIM9_CLK_SLEEP_DISABLE -#define __TIM10_CLK_SLEEP_ENABLE __HAL_RCC_TIM10_CLK_SLEEP_ENABLE -#define __TIM10_CLK_SLEEP_DISABLE __HAL_RCC_TIM10_CLK_SLEEP_DISABLE -#define __TIM11_CLK_SLEEP_ENABLE __HAL_RCC_TIM11_CLK_SLEEP_ENABLE -#define __TIM11_CLK_SLEEP_DISABLE __HAL_RCC_TIM11_CLK_SLEEP_DISABLE -#define __ETHMACPTP_CLK_SLEEP_ENABLE __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE -#define __ETHMACPTP_CLK_SLEEP_DISABLE __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE -#define __ETHMACPTP_CLK_ENABLE __HAL_RCC_ETHMACPTP_CLK_ENABLE -#define __ETHMACPTP_CLK_DISABLE __HAL_RCC_ETHMACPTP_CLK_DISABLE -#define __HASH_CLK_ENABLE __HAL_RCC_HASH_CLK_ENABLE -#define __HASH_FORCE_RESET __HAL_RCC_HASH_FORCE_RESET -#define __HASH_RELEASE_RESET __HAL_RCC_HASH_RELEASE_RESET -#define __HASH_CLK_SLEEP_ENABLE __HAL_RCC_HASH_CLK_SLEEP_ENABLE -#define __HASH_CLK_SLEEP_DISABLE __HAL_RCC_HASH_CLK_SLEEP_DISABLE -#define __HASH_CLK_DISABLE __HAL_RCC_HASH_CLK_DISABLE -#define __SPI5_CLK_ENABLE __HAL_RCC_SPI5_CLK_ENABLE -#define __SPI5_CLK_DISABLE __HAL_RCC_SPI5_CLK_DISABLE -#define __SPI5_FORCE_RESET __HAL_RCC_SPI5_FORCE_RESET -#define __SPI5_RELEASE_RESET __HAL_RCC_SPI5_RELEASE_RESET -#define __SPI5_CLK_SLEEP_ENABLE __HAL_RCC_SPI5_CLK_SLEEP_ENABLE -#define __SPI5_CLK_SLEEP_DISABLE __HAL_RCC_SPI5_CLK_SLEEP_DISABLE -#define __SPI6_CLK_ENABLE __HAL_RCC_SPI6_CLK_ENABLE -#define __SPI6_CLK_DISABLE __HAL_RCC_SPI6_CLK_DISABLE -#define __SPI6_FORCE_RESET __HAL_RCC_SPI6_FORCE_RESET -#define __SPI6_RELEASE_RESET __HAL_RCC_SPI6_RELEASE_RESET -#define __SPI6_CLK_SLEEP_ENABLE __HAL_RCC_SPI6_CLK_SLEEP_ENABLE -#define __SPI6_CLK_SLEEP_DISABLE __HAL_RCC_SPI6_CLK_SLEEP_DISABLE -#define __LTDC_CLK_ENABLE __HAL_RCC_LTDC_CLK_ENABLE -#define __LTDC_CLK_DISABLE __HAL_RCC_LTDC_CLK_DISABLE -#define __LTDC_FORCE_RESET __HAL_RCC_LTDC_FORCE_RESET -#define __LTDC_RELEASE_RESET __HAL_RCC_LTDC_RELEASE_RESET -#define __LTDC_CLK_SLEEP_ENABLE __HAL_RCC_LTDC_CLK_SLEEP_ENABLE -#define __ETHMAC_CLK_SLEEP_ENABLE __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE -#define __ETHMAC_CLK_SLEEP_DISABLE __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE -#define __ETHMACTX_CLK_SLEEP_ENABLE __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE -#define __ETHMACTX_CLK_SLEEP_DISABLE __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE -#define __ETHMACRX_CLK_SLEEP_ENABLE __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE -#define __ETHMACRX_CLK_SLEEP_DISABLE __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE -#define __TIM12_CLK_SLEEP_ENABLE __HAL_RCC_TIM12_CLK_SLEEP_ENABLE -#define __TIM12_CLK_SLEEP_DISABLE __HAL_RCC_TIM12_CLK_SLEEP_DISABLE -#define __TIM13_CLK_SLEEP_ENABLE __HAL_RCC_TIM13_CLK_SLEEP_ENABLE -#define __TIM13_CLK_SLEEP_DISABLE __HAL_RCC_TIM13_CLK_SLEEP_DISABLE -#define __TIM14_CLK_SLEEP_ENABLE __HAL_RCC_TIM14_CLK_SLEEP_ENABLE -#define __TIM14_CLK_SLEEP_DISABLE __HAL_RCC_TIM14_CLK_SLEEP_DISABLE -#define __BKPSRAM_CLK_ENABLE __HAL_RCC_BKPSRAM_CLK_ENABLE -#define __BKPSRAM_CLK_DISABLE __HAL_RCC_BKPSRAM_CLK_DISABLE -#define __BKPSRAM_CLK_SLEEP_ENABLE __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE -#define __BKPSRAM_CLK_SLEEP_DISABLE __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE -#define __CCMDATARAMEN_CLK_ENABLE __HAL_RCC_CCMDATARAMEN_CLK_ENABLE -#define __CCMDATARAMEN_CLK_DISABLE __HAL_RCC_CCMDATARAMEN_CLK_DISABLE -#define __USART6_CLK_ENABLE __HAL_RCC_USART6_CLK_ENABLE -#define __USART6_CLK_DISABLE __HAL_RCC_USART6_CLK_DISABLE -#define __USART6_FORCE_RESET __HAL_RCC_USART6_FORCE_RESET -#define __USART6_RELEASE_RESET __HAL_RCC_USART6_RELEASE_RESET -#define __USART6_CLK_SLEEP_ENABLE __HAL_RCC_USART6_CLK_SLEEP_ENABLE -#define __USART6_CLK_SLEEP_DISABLE __HAL_RCC_USART6_CLK_SLEEP_DISABLE -#define __SPI4_CLK_ENABLE __HAL_RCC_SPI4_CLK_ENABLE -#define __SPI4_CLK_DISABLE __HAL_RCC_SPI4_CLK_DISABLE -#define __SPI4_FORCE_RESET __HAL_RCC_SPI4_FORCE_RESET -#define __SPI4_RELEASE_RESET __HAL_RCC_SPI4_RELEASE_RESET -#define __SPI4_CLK_SLEEP_ENABLE __HAL_RCC_SPI4_CLK_SLEEP_ENABLE -#define __SPI4_CLK_SLEEP_DISABLE __HAL_RCC_SPI4_CLK_SLEEP_DISABLE -#define __GPIOI_CLK_ENABLE __HAL_RCC_GPIOI_CLK_ENABLE -#define __GPIOI_CLK_DISABLE __HAL_RCC_GPIOI_CLK_DISABLE -#define __GPIOI_FORCE_RESET __HAL_RCC_GPIOI_FORCE_RESET -#define __GPIOI_RELEASE_RESET __HAL_RCC_GPIOI_RELEASE_RESET -#define __GPIOI_CLK_SLEEP_ENABLE __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE -#define __GPIOI_CLK_SLEEP_DISABLE __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE -#define __GPIOJ_CLK_ENABLE __HAL_RCC_GPIOJ_CLK_ENABLE -#define __GPIOJ_CLK_DISABLE __HAL_RCC_GPIOJ_CLK_DISABLE -#define __GPIOJ_FORCE_RESET __HAL_RCC_GPIOJ_FORCE_RESET -#define __GPIOJ_RELEASE_RESET __HAL_RCC_GPIOJ_RELEASE_RESET -#define __GPIOJ_CLK_SLEEP_ENABLE __HAL_RCC_GPIOJ_CLK_SLEEP_ENABLE -#define __GPIOJ_CLK_SLEEP_DISABLE __HAL_RCC_GPIOJ_CLK_SLEEP_DISABLE -#define __GPIOK_CLK_ENABLE __HAL_RCC_GPIOK_CLK_ENABLE -#define __GPIOK_CLK_DISABLE __HAL_RCC_GPIOK_CLK_DISABLE -#define __GPIOK_RELEASE_RESET __HAL_RCC_GPIOK_RELEASE_RESET -#define __GPIOK_CLK_SLEEP_ENABLE __HAL_RCC_GPIOK_CLK_SLEEP_ENABLE -#define __GPIOK_CLK_SLEEP_DISABLE __HAL_RCC_GPIOK_CLK_SLEEP_DISABLE -#define __ETH_CLK_ENABLE __HAL_RCC_ETH_CLK_ENABLE -#define __ETH_CLK_DISABLE __HAL_RCC_ETH_CLK_DISABLE -#define __DCMI_CLK_ENABLE __HAL_RCC_DCMI_CLK_ENABLE -#define __DCMI_CLK_DISABLE __HAL_RCC_DCMI_CLK_DISABLE -#define __DCMI_FORCE_RESET __HAL_RCC_DCMI_FORCE_RESET -#define __DCMI_RELEASE_RESET __HAL_RCC_DCMI_RELEASE_RESET -#define __DCMI_CLK_SLEEP_ENABLE __HAL_RCC_DCMI_CLK_SLEEP_ENABLE -#define __DCMI_CLK_SLEEP_DISABLE __HAL_RCC_DCMI_CLK_SLEEP_DISABLE -#define __UART7_CLK_ENABLE __HAL_RCC_UART7_CLK_ENABLE -#define __UART7_CLK_DISABLE __HAL_RCC_UART7_CLK_DISABLE -#define __UART7_RELEASE_RESET __HAL_RCC_UART7_RELEASE_RESET -#define __UART7_FORCE_RESET __HAL_RCC_UART7_FORCE_RESET -#define __UART7_CLK_SLEEP_ENABLE __HAL_RCC_UART7_CLK_SLEEP_ENABLE -#define __UART7_CLK_SLEEP_DISABLE __HAL_RCC_UART7_CLK_SLEEP_DISABLE -#define __UART8_CLK_ENABLE __HAL_RCC_UART8_CLK_ENABLE -#define __UART8_CLK_DISABLE __HAL_RCC_UART8_CLK_DISABLE -#define __UART8_FORCE_RESET __HAL_RCC_UART8_FORCE_RESET -#define __UART8_RELEASE_RESET __HAL_RCC_UART8_RELEASE_RESET -#define __UART8_CLK_SLEEP_ENABLE __HAL_RCC_UART8_CLK_SLEEP_ENABLE -#define __UART8_CLK_SLEEP_DISABLE __HAL_RCC_UART8_CLK_SLEEP_DISABLE -#define __OTGHS_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE -#define __OTGHS_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE -#define __OTGHS_FORCE_RESET __HAL_RCC_USB_OTG_HS_FORCE_RESET -#define __OTGHS_RELEASE_RESET __HAL_RCC_USB_OTG_HS_RELEASE_RESET -#define __OTGHSULPI_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE -#define __OTGHSULPI_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE -#define __HAL_RCC_OTGHS_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE -#define __HAL_RCC_OTGHS_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE -#define __HAL_RCC_OTGHS_IS_CLK_SLEEP_ENABLED __HAL_RCC_USB_OTG_HS_IS_CLK_SLEEP_ENABLED -#define __HAL_RCC_OTGHS_IS_CLK_SLEEP_DISABLED __HAL_RCC_USB_OTG_HS_IS_CLK_SLEEP_DISABLED -#define __HAL_RCC_OTGHS_FORCE_RESET __HAL_RCC_USB_OTG_HS_FORCE_RESET -#define __HAL_RCC_OTGHS_RELEASE_RESET __HAL_RCC_USB_OTG_HS_RELEASE_RESET -#define __HAL_RCC_OTGHSULPI_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE -#define __HAL_RCC_OTGHSULPI_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE -#define __HAL_RCC_OTGHSULPI_IS_CLK_SLEEP_ENABLED __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_SLEEP_ENABLED -#define __HAL_RCC_OTGHSULPI_IS_CLK_SLEEP_DISABLED __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_SLEEP_DISABLED -#define __SRAM3_CLK_SLEEP_ENABLE __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE -#define __CAN2_CLK_SLEEP_ENABLE __HAL_RCC_CAN2_CLK_SLEEP_ENABLE -#define __CAN2_CLK_SLEEP_DISABLE __HAL_RCC_CAN2_CLK_SLEEP_DISABLE -#define __DAC_CLK_SLEEP_ENABLE __HAL_RCC_DAC_CLK_SLEEP_ENABLE -#define __DAC_CLK_SLEEP_DISABLE __HAL_RCC_DAC_CLK_SLEEP_DISABLE -#define __ADC2_CLK_SLEEP_ENABLE __HAL_RCC_ADC2_CLK_SLEEP_ENABLE -#define __ADC2_CLK_SLEEP_DISABLE __HAL_RCC_ADC2_CLK_SLEEP_DISABLE -#define __ADC3_CLK_SLEEP_ENABLE __HAL_RCC_ADC3_CLK_SLEEP_ENABLE -#define __ADC3_CLK_SLEEP_DISABLE __HAL_RCC_ADC3_CLK_SLEEP_DISABLE -#define __FSMC_FORCE_RESET __HAL_RCC_FSMC_FORCE_RESET -#define __FSMC_RELEASE_RESET __HAL_RCC_FSMC_RELEASE_RESET -#define __FSMC_CLK_SLEEP_ENABLE __HAL_RCC_FSMC_CLK_SLEEP_ENABLE -#define __FSMC_CLK_SLEEP_DISABLE __HAL_RCC_FSMC_CLK_SLEEP_DISABLE -#define __SDIO_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET -#define __SDIO_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET -#define __SDIO_CLK_SLEEP_DISABLE __HAL_RCC_SDIO_CLK_SLEEP_DISABLE -#define __SDIO_CLK_SLEEP_ENABLE __HAL_RCC_SDIO_CLK_SLEEP_ENABLE -#define __DMA2D_CLK_ENABLE __HAL_RCC_DMA2D_CLK_ENABLE -#define __DMA2D_CLK_DISABLE __HAL_RCC_DMA2D_CLK_DISABLE -#define __DMA2D_FORCE_RESET __HAL_RCC_DMA2D_FORCE_RESET -#define __DMA2D_RELEASE_RESET __HAL_RCC_DMA2D_RELEASE_RESET -#define __DMA2D_CLK_SLEEP_ENABLE __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE -#define __DMA2D_CLK_SLEEP_DISABLE __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE - -/* alias define maintained for legacy */ -#define __HAL_RCC_OTGFS_FORCE_RESET __HAL_RCC_USB_OTG_FS_FORCE_RESET -#define __HAL_RCC_OTGFS_RELEASE_RESET __HAL_RCC_USB_OTG_FS_RELEASE_RESET - -#define __ADC12_CLK_ENABLE __HAL_RCC_ADC12_CLK_ENABLE -#define __ADC12_CLK_DISABLE __HAL_RCC_ADC12_CLK_DISABLE -#define __ADC34_CLK_ENABLE __HAL_RCC_ADC34_CLK_ENABLE -#define __ADC34_CLK_DISABLE __HAL_RCC_ADC34_CLK_DISABLE -#define __DAC2_CLK_ENABLE __HAL_RCC_DAC2_CLK_ENABLE -#define __DAC2_CLK_DISABLE __HAL_RCC_DAC2_CLK_DISABLE -#define __TIM18_CLK_ENABLE __HAL_RCC_TIM18_CLK_ENABLE -#define __TIM18_CLK_DISABLE __HAL_RCC_TIM18_CLK_DISABLE -#define __TIM19_CLK_ENABLE __HAL_RCC_TIM19_CLK_ENABLE -#define __TIM19_CLK_DISABLE __HAL_RCC_TIM19_CLK_DISABLE -#define __TIM20_CLK_ENABLE __HAL_RCC_TIM20_CLK_ENABLE -#define __TIM20_CLK_DISABLE __HAL_RCC_TIM20_CLK_DISABLE -#define __HRTIM1_CLK_ENABLE __HAL_RCC_HRTIM1_CLK_ENABLE -#define __HRTIM1_CLK_DISABLE __HAL_RCC_HRTIM1_CLK_DISABLE -#define __SDADC1_CLK_ENABLE __HAL_RCC_SDADC1_CLK_ENABLE -#define __SDADC2_CLK_ENABLE __HAL_RCC_SDADC2_CLK_ENABLE -#define __SDADC3_CLK_ENABLE __HAL_RCC_SDADC3_CLK_ENABLE -#define __SDADC1_CLK_DISABLE __HAL_RCC_SDADC1_CLK_DISABLE -#define __SDADC2_CLK_DISABLE __HAL_RCC_SDADC2_CLK_DISABLE -#define __SDADC3_CLK_DISABLE __HAL_RCC_SDADC3_CLK_DISABLE - -#define __ADC12_FORCE_RESET __HAL_RCC_ADC12_FORCE_RESET -#define __ADC12_RELEASE_RESET __HAL_RCC_ADC12_RELEASE_RESET -#define __ADC34_FORCE_RESET __HAL_RCC_ADC34_FORCE_RESET -#define __ADC34_RELEASE_RESET __HAL_RCC_ADC34_RELEASE_RESET -#define __DAC2_FORCE_RESET __HAL_RCC_DAC2_FORCE_RESET -#define __DAC2_RELEASE_RESET __HAL_RCC_DAC2_RELEASE_RESET -#define __TIM18_FORCE_RESET __HAL_RCC_TIM18_FORCE_RESET -#define __TIM18_RELEASE_RESET __HAL_RCC_TIM18_RELEASE_RESET -#define __TIM19_FORCE_RESET __HAL_RCC_TIM19_FORCE_RESET -#define __TIM19_RELEASE_RESET __HAL_RCC_TIM19_RELEASE_RESET -#define __TIM20_FORCE_RESET __HAL_RCC_TIM20_FORCE_RESET -#define __TIM20_RELEASE_RESET __HAL_RCC_TIM20_RELEASE_RESET -#define __HRTIM1_FORCE_RESET __HAL_RCC_HRTIM1_FORCE_RESET -#define __HRTIM1_RELEASE_RESET __HAL_RCC_HRTIM1_RELEASE_RESET -#define __SDADC1_FORCE_RESET __HAL_RCC_SDADC1_FORCE_RESET -#define __SDADC2_FORCE_RESET __HAL_RCC_SDADC2_FORCE_RESET -#define __SDADC3_FORCE_RESET __HAL_RCC_SDADC3_FORCE_RESET -#define __SDADC1_RELEASE_RESET __HAL_RCC_SDADC1_RELEASE_RESET -#define __SDADC2_RELEASE_RESET __HAL_RCC_SDADC2_RELEASE_RESET -#define __SDADC3_RELEASE_RESET __HAL_RCC_SDADC3_RELEASE_RESET - -#define __ADC1_IS_CLK_ENABLED __HAL_RCC_ADC1_IS_CLK_ENABLED -#define __ADC1_IS_CLK_DISABLED __HAL_RCC_ADC1_IS_CLK_DISABLED -#define __ADC12_IS_CLK_ENABLED __HAL_RCC_ADC12_IS_CLK_ENABLED -#define __ADC12_IS_CLK_DISABLED __HAL_RCC_ADC12_IS_CLK_DISABLED -#define __ADC34_IS_CLK_ENABLED __HAL_RCC_ADC34_IS_CLK_ENABLED -#define __ADC34_IS_CLK_DISABLED __HAL_RCC_ADC34_IS_CLK_DISABLED -#define __CEC_IS_CLK_ENABLED __HAL_RCC_CEC_IS_CLK_ENABLED -#define __CEC_IS_CLK_DISABLED __HAL_RCC_CEC_IS_CLK_DISABLED -#define __CRC_IS_CLK_ENABLED __HAL_RCC_CRC_IS_CLK_ENABLED -#define __CRC_IS_CLK_DISABLED __HAL_RCC_CRC_IS_CLK_DISABLED -#define __DAC1_IS_CLK_ENABLED __HAL_RCC_DAC1_IS_CLK_ENABLED -#define __DAC1_IS_CLK_DISABLED __HAL_RCC_DAC1_IS_CLK_DISABLED -#define __DAC2_IS_CLK_ENABLED __HAL_RCC_DAC2_IS_CLK_ENABLED -#define __DAC2_IS_CLK_DISABLED __HAL_RCC_DAC2_IS_CLK_DISABLED -#define __DMA1_IS_CLK_ENABLED __HAL_RCC_DMA1_IS_CLK_ENABLED -#define __DMA1_IS_CLK_DISABLED __HAL_RCC_DMA1_IS_CLK_DISABLED -#define __DMA2_IS_CLK_ENABLED __HAL_RCC_DMA2_IS_CLK_ENABLED -#define __DMA2_IS_CLK_DISABLED __HAL_RCC_DMA2_IS_CLK_DISABLED -#define __FLITF_IS_CLK_ENABLED __HAL_RCC_FLITF_IS_CLK_ENABLED -#define __FLITF_IS_CLK_DISABLED __HAL_RCC_FLITF_IS_CLK_DISABLED -#define __FMC_IS_CLK_ENABLED __HAL_RCC_FMC_IS_CLK_ENABLED -#define __FMC_IS_CLK_DISABLED __HAL_RCC_FMC_IS_CLK_DISABLED -#define __GPIOA_IS_CLK_ENABLED __HAL_RCC_GPIOA_IS_CLK_ENABLED -#define __GPIOA_IS_CLK_DISABLED __HAL_RCC_GPIOA_IS_CLK_DISABLED -#define __GPIOB_IS_CLK_ENABLED __HAL_RCC_GPIOB_IS_CLK_ENABLED -#define __GPIOB_IS_CLK_DISABLED __HAL_RCC_GPIOB_IS_CLK_DISABLED -#define __GPIOC_IS_CLK_ENABLED __HAL_RCC_GPIOC_IS_CLK_ENABLED -#define __GPIOC_IS_CLK_DISABLED __HAL_RCC_GPIOC_IS_CLK_DISABLED -#define __GPIOD_IS_CLK_ENABLED __HAL_RCC_GPIOD_IS_CLK_ENABLED -#define __GPIOD_IS_CLK_DISABLED __HAL_RCC_GPIOD_IS_CLK_DISABLED -#define __GPIOE_IS_CLK_ENABLED __HAL_RCC_GPIOE_IS_CLK_ENABLED -#define __GPIOE_IS_CLK_DISABLED __HAL_RCC_GPIOE_IS_CLK_DISABLED -#define __GPIOF_IS_CLK_ENABLED __HAL_RCC_GPIOF_IS_CLK_ENABLED -#define __GPIOF_IS_CLK_DISABLED __HAL_RCC_GPIOF_IS_CLK_DISABLED -#define __GPIOG_IS_CLK_ENABLED __HAL_RCC_GPIOG_IS_CLK_ENABLED -#define __GPIOG_IS_CLK_DISABLED __HAL_RCC_GPIOG_IS_CLK_DISABLED -#define __GPIOH_IS_CLK_ENABLED __HAL_RCC_GPIOH_IS_CLK_ENABLED -#define __GPIOH_IS_CLK_DISABLED __HAL_RCC_GPIOH_IS_CLK_DISABLED -#define __HRTIM1_IS_CLK_ENABLED __HAL_RCC_HRTIM1_IS_CLK_ENABLED -#define __HRTIM1_IS_CLK_DISABLED __HAL_RCC_HRTIM1_IS_CLK_DISABLED -#define __I2C1_IS_CLK_ENABLED __HAL_RCC_I2C1_IS_CLK_ENABLED -#define __I2C1_IS_CLK_DISABLED __HAL_RCC_I2C1_IS_CLK_DISABLED -#define __I2C2_IS_CLK_ENABLED __HAL_RCC_I2C2_IS_CLK_ENABLED -#define __I2C2_IS_CLK_DISABLED __HAL_RCC_I2C2_IS_CLK_DISABLED -#define __I2C3_IS_CLK_ENABLED __HAL_RCC_I2C3_IS_CLK_ENABLED -#define __I2C3_IS_CLK_DISABLED __HAL_RCC_I2C3_IS_CLK_DISABLED -#define __PWR_IS_CLK_ENABLED __HAL_RCC_PWR_IS_CLK_ENABLED -#define __PWR_IS_CLK_DISABLED __HAL_RCC_PWR_IS_CLK_DISABLED -#define __SYSCFG_IS_CLK_ENABLED __HAL_RCC_SYSCFG_IS_CLK_ENABLED -#define __SYSCFG_IS_CLK_DISABLED __HAL_RCC_SYSCFG_IS_CLK_DISABLED -#define __SPI1_IS_CLK_ENABLED __HAL_RCC_SPI1_IS_CLK_ENABLED -#define __SPI1_IS_CLK_DISABLED __HAL_RCC_SPI1_IS_CLK_DISABLED -#define __SPI2_IS_CLK_ENABLED __HAL_RCC_SPI2_IS_CLK_ENABLED -#define __SPI2_IS_CLK_DISABLED __HAL_RCC_SPI2_IS_CLK_DISABLED -#define __SPI3_IS_CLK_ENABLED __HAL_RCC_SPI3_IS_CLK_ENABLED -#define __SPI3_IS_CLK_DISABLED __HAL_RCC_SPI3_IS_CLK_DISABLED -#define __SPI4_IS_CLK_ENABLED __HAL_RCC_SPI4_IS_CLK_ENABLED -#define __SPI4_IS_CLK_DISABLED __HAL_RCC_SPI4_IS_CLK_DISABLED -#define __SDADC1_IS_CLK_ENABLED __HAL_RCC_SDADC1_IS_CLK_ENABLED -#define __SDADC1_IS_CLK_DISABLED __HAL_RCC_SDADC1_IS_CLK_DISABLED -#define __SDADC2_IS_CLK_ENABLED __HAL_RCC_SDADC2_IS_CLK_ENABLED -#define __SDADC2_IS_CLK_DISABLED __HAL_RCC_SDADC2_IS_CLK_DISABLED -#define __SDADC3_IS_CLK_ENABLED __HAL_RCC_SDADC3_IS_CLK_ENABLED -#define __SDADC3_IS_CLK_DISABLED __HAL_RCC_SDADC3_IS_CLK_DISABLED -#define __SRAM_IS_CLK_ENABLED __HAL_RCC_SRAM_IS_CLK_ENABLED -#define __SRAM_IS_CLK_DISABLED __HAL_RCC_SRAM_IS_CLK_DISABLED -#define __TIM1_IS_CLK_ENABLED __HAL_RCC_TIM1_IS_CLK_ENABLED -#define __TIM1_IS_CLK_DISABLED __HAL_RCC_TIM1_IS_CLK_DISABLED -#define __TIM2_IS_CLK_ENABLED __HAL_RCC_TIM2_IS_CLK_ENABLED -#define __TIM2_IS_CLK_DISABLED __HAL_RCC_TIM2_IS_CLK_DISABLED -#define __TIM3_IS_CLK_ENABLED __HAL_RCC_TIM3_IS_CLK_ENABLED -#define __TIM3_IS_CLK_DISABLED __HAL_RCC_TIM3_IS_CLK_DISABLED -#define __TIM4_IS_CLK_ENABLED __HAL_RCC_TIM4_IS_CLK_ENABLED -#define __TIM4_IS_CLK_DISABLED __HAL_RCC_TIM4_IS_CLK_DISABLED -#define __TIM5_IS_CLK_ENABLED __HAL_RCC_TIM5_IS_CLK_ENABLED -#define __TIM5_IS_CLK_DISABLED __HAL_RCC_TIM5_IS_CLK_DISABLED -#define __TIM6_IS_CLK_ENABLED __HAL_RCC_TIM6_IS_CLK_ENABLED -#define __TIM6_IS_CLK_DISABLED __HAL_RCC_TIM6_IS_CLK_DISABLED -#define __TIM7_IS_CLK_ENABLED __HAL_RCC_TIM7_IS_CLK_ENABLED -#define __TIM7_IS_CLK_DISABLED __HAL_RCC_TIM7_IS_CLK_DISABLED -#define __TIM8_IS_CLK_ENABLED __HAL_RCC_TIM8_IS_CLK_ENABLED -#define __TIM8_IS_CLK_DISABLED __HAL_RCC_TIM8_IS_CLK_DISABLED -#define __TIM12_IS_CLK_ENABLED __HAL_RCC_TIM12_IS_CLK_ENABLED -#define __TIM12_IS_CLK_DISABLED __HAL_RCC_TIM12_IS_CLK_DISABLED -#define __TIM13_IS_CLK_ENABLED __HAL_RCC_TIM13_IS_CLK_ENABLED -#define __TIM13_IS_CLK_DISABLED __HAL_RCC_TIM13_IS_CLK_DISABLED -#define __TIM14_IS_CLK_ENABLED __HAL_RCC_TIM14_IS_CLK_ENABLED -#define __TIM14_IS_CLK_DISABLED __HAL_RCC_TIM14_IS_CLK_DISABLED -#define __TIM15_IS_CLK_ENABLED __HAL_RCC_TIM15_IS_CLK_ENABLED -#define __TIM15_IS_CLK_DISABLED __HAL_RCC_TIM15_IS_CLK_DISABLED -#define __TIM16_IS_CLK_ENABLED __HAL_RCC_TIM16_IS_CLK_ENABLED -#define __TIM16_IS_CLK_DISABLED __HAL_RCC_TIM16_IS_CLK_DISABLED -#define __TIM17_IS_CLK_ENABLED __HAL_RCC_TIM17_IS_CLK_ENABLED -#define __TIM17_IS_CLK_DISABLED __HAL_RCC_TIM17_IS_CLK_DISABLED -#define __TIM18_IS_CLK_ENABLED __HAL_RCC_TIM18_IS_CLK_ENABLED -#define __TIM18_IS_CLK_DISABLED __HAL_RCC_TIM18_IS_CLK_DISABLED -#define __TIM19_IS_CLK_ENABLED __HAL_RCC_TIM19_IS_CLK_ENABLED -#define __TIM19_IS_CLK_DISABLED __HAL_RCC_TIM19_IS_CLK_DISABLED -#define __TIM20_IS_CLK_ENABLED __HAL_RCC_TIM20_IS_CLK_ENABLED -#define __TIM20_IS_CLK_DISABLED __HAL_RCC_TIM20_IS_CLK_DISABLED -#define __TSC_IS_CLK_ENABLED __HAL_RCC_TSC_IS_CLK_ENABLED -#define __TSC_IS_CLK_DISABLED __HAL_RCC_TSC_IS_CLK_DISABLED -#define __UART4_IS_CLK_ENABLED __HAL_RCC_UART4_IS_CLK_ENABLED -#define __UART4_IS_CLK_DISABLED __HAL_RCC_UART4_IS_CLK_DISABLED -#define __UART5_IS_CLK_ENABLED __HAL_RCC_UART5_IS_CLK_ENABLED -#define __UART5_IS_CLK_DISABLED __HAL_RCC_UART5_IS_CLK_DISABLED -#define __USART1_IS_CLK_ENABLED __HAL_RCC_USART1_IS_CLK_ENABLED -#define __USART1_IS_CLK_DISABLED __HAL_RCC_USART1_IS_CLK_DISABLED -#define __USART2_IS_CLK_ENABLED __HAL_RCC_USART2_IS_CLK_ENABLED -#define __USART2_IS_CLK_DISABLED __HAL_RCC_USART2_IS_CLK_DISABLED -#define __USART3_IS_CLK_ENABLED __HAL_RCC_USART3_IS_CLK_ENABLED -#define __USART3_IS_CLK_DISABLED __HAL_RCC_USART3_IS_CLK_DISABLED -#define __USB_IS_CLK_ENABLED __HAL_RCC_USB_IS_CLK_ENABLED -#define __USB_IS_CLK_DISABLED __HAL_RCC_USB_IS_CLK_DISABLED -#define __WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG_IS_CLK_ENABLED -#define __WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG_IS_CLK_DISABLED - -#if defined(STM32L1) -#define __HAL_RCC_CRYP_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE -#define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE -#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE -#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE -#define __HAL_RCC_CRYP_FORCE_RESET __HAL_RCC_AES_FORCE_RESET -#define __HAL_RCC_CRYP_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET -#endif /* STM32L1 */ - -#if defined(STM32F4) -#define __HAL_RCC_SDMMC1_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET -#define __HAL_RCC_SDMMC1_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET -#define __HAL_RCC_SDMMC1_CLK_SLEEP_ENABLE __HAL_RCC_SDIO_CLK_SLEEP_ENABLE -#define __HAL_RCC_SDMMC1_CLK_SLEEP_DISABLE __HAL_RCC_SDIO_CLK_SLEEP_DISABLE -#define __HAL_RCC_SDMMC1_CLK_ENABLE __HAL_RCC_SDIO_CLK_ENABLE -#define __HAL_RCC_SDMMC1_CLK_DISABLE __HAL_RCC_SDIO_CLK_DISABLE -#define __HAL_RCC_SDMMC1_IS_CLK_ENABLED __HAL_RCC_SDIO_IS_CLK_ENABLED -#define __HAL_RCC_SDMMC1_IS_CLK_DISABLED __HAL_RCC_SDIO_IS_CLK_DISABLED -#define Sdmmc1ClockSelection SdioClockSelection -#define RCC_PERIPHCLK_SDMMC1 RCC_PERIPHCLK_SDIO -#define RCC_SDMMC1CLKSOURCE_CLK48 RCC_SDIOCLKSOURCE_CK48 -#define RCC_SDMMC1CLKSOURCE_SYSCLK RCC_SDIOCLKSOURCE_SYSCLK -#define __HAL_RCC_SDMMC1_CONFIG __HAL_RCC_SDIO_CONFIG -#define __HAL_RCC_GET_SDMMC1_SOURCE __HAL_RCC_GET_SDIO_SOURCE -#endif - -#if defined(STM32F7) || defined(STM32L4) -#define __HAL_RCC_SDIO_FORCE_RESET __HAL_RCC_SDMMC1_FORCE_RESET -#define __HAL_RCC_SDIO_RELEASE_RESET __HAL_RCC_SDMMC1_RELEASE_RESET -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE __HAL_RCC_SDMMC1_CLK_SLEEP_ENABLE -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE __HAL_RCC_SDMMC1_CLK_SLEEP_DISABLE -#define __HAL_RCC_SDIO_CLK_ENABLE __HAL_RCC_SDMMC1_CLK_ENABLE -#define __HAL_RCC_SDIO_CLK_DISABLE __HAL_RCC_SDMMC1_CLK_DISABLE -#define __HAL_RCC_SDIO_IS_CLK_ENABLED __HAL_RCC_SDMMC1_IS_CLK_ENABLED -#define __HAL_RCC_SDIO_IS_CLK_DISABLED __HAL_RCC_SDMMC1_IS_CLK_DISABLED -#define SdioClockSelection Sdmmc1ClockSelection -#define RCC_PERIPHCLK_SDIO RCC_PERIPHCLK_SDMMC1 -#define __HAL_RCC_SDIO_CONFIG __HAL_RCC_SDMMC1_CONFIG -#define __HAL_RCC_GET_SDIO_SOURCE __HAL_RCC_GET_SDMMC1_SOURCE -#endif - -#if defined(STM32F7) -#define RCC_SDIOCLKSOURCE_CLK48 RCC_SDMMC1CLKSOURCE_CLK48 -#define RCC_SDIOCLKSOURCE_SYSCLK RCC_SDMMC1CLKSOURCE_SYSCLK -#endif - -#if defined(STM32H7) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() __HAL_RCC_USB1_OTG_HS_CLK_ENABLE() -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_ENABLE() -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() __HAL_RCC_USB1_OTG_HS_CLK_DISABLE() -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_DISABLE() -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() __HAL_RCC_USB1_OTG_HS_FORCE_RESET() -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() __HAL_RCC_USB1_OTG_HS_RELEASE_RESET() -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() __HAL_RCC_USB1_OTG_HS_CLK_SLEEP_ENABLE() -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_SLEEP_ENABLE() -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() __HAL_RCC_USB1_OTG_HS_CLK_SLEEP_DISABLE() -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_SLEEP_DISABLE() - -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() __HAL_RCC_USB2_OTG_FS_CLK_ENABLE() -#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_ENABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_ENABLE() -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() __HAL_RCC_USB2_OTG_FS_CLK_DISABLE() -#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_DISABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_DISABLE() -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() __HAL_RCC_USB2_OTG_FS_FORCE_RESET() -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() __HAL_RCC_USB2_OTG_FS_RELEASE_RESET() -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() __HAL_RCC_USB2_OTG_FS_CLK_SLEEP_ENABLE() -#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_SLEEP_ENABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_ENABLE() -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() __HAL_RCC_USB2_OTG_FS_CLK_SLEEP_DISABLE() -#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_SLEEP_DISABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_DISABLE() -#endif - -#define __HAL_RCC_I2SCLK __HAL_RCC_I2S_CONFIG -#define __HAL_RCC_I2SCLK_CONFIG __HAL_RCC_I2S_CONFIG - -#define __RCC_PLLSRC RCC_GET_PLL_OSCSOURCE - -#define IS_RCC_MSIRANGE IS_RCC_MSI_CLOCK_RANGE -#define IS_RCC_RTCCLK_SOURCE IS_RCC_RTCCLKSOURCE -#define IS_RCC_SYSCLK_DIV IS_RCC_HCLK -#define IS_RCC_HCLK_DIV IS_RCC_PCLK -#define IS_RCC_PERIPHCLK IS_RCC_PERIPHCLOCK - -#define RCC_IT_HSI14 RCC_IT_HSI14RDY - -#define RCC_IT_CSSLSE RCC_IT_LSECSS -#define RCC_IT_CSSHSE RCC_IT_CSS - -#define RCC_PLLMUL_3 RCC_PLL_MUL3 -#define RCC_PLLMUL_4 RCC_PLL_MUL4 -#define RCC_PLLMUL_6 RCC_PLL_MUL6 -#define RCC_PLLMUL_8 RCC_PLL_MUL8 -#define RCC_PLLMUL_12 RCC_PLL_MUL12 -#define RCC_PLLMUL_16 RCC_PLL_MUL16 -#define RCC_PLLMUL_24 RCC_PLL_MUL24 -#define RCC_PLLMUL_32 RCC_PLL_MUL32 -#define RCC_PLLMUL_48 RCC_PLL_MUL48 - -#define RCC_PLLDIV_2 RCC_PLL_DIV2 -#define RCC_PLLDIV_3 RCC_PLL_DIV3 -#define RCC_PLLDIV_4 RCC_PLL_DIV4 - -#define IS_RCC_MCOSOURCE IS_RCC_MCO1SOURCE -#define __HAL_RCC_MCO_CONFIG __HAL_RCC_MCO1_CONFIG -#define RCC_MCO_NODIV RCC_MCODIV_1 -#define RCC_MCO_DIV1 RCC_MCODIV_1 -#define RCC_MCO_DIV2 RCC_MCODIV_2 -#define RCC_MCO_DIV4 RCC_MCODIV_4 -#define RCC_MCO_DIV8 RCC_MCODIV_8 -#define RCC_MCO_DIV16 RCC_MCODIV_16 -#define RCC_MCO_DIV32 RCC_MCODIV_32 -#define RCC_MCO_DIV64 RCC_MCODIV_64 -#define RCC_MCO_DIV128 RCC_MCODIV_128 -#define RCC_MCOSOURCE_NONE RCC_MCO1SOURCE_NOCLOCK -#define RCC_MCOSOURCE_LSI RCC_MCO1SOURCE_LSI -#define RCC_MCOSOURCE_LSE RCC_MCO1SOURCE_LSE -#define RCC_MCOSOURCE_SYSCLK RCC_MCO1SOURCE_SYSCLK -#define RCC_MCOSOURCE_HSI RCC_MCO1SOURCE_HSI -#define RCC_MCOSOURCE_HSI14 RCC_MCO1SOURCE_HSI14 -#define RCC_MCOSOURCE_HSI48 RCC_MCO1SOURCE_HSI48 -#define RCC_MCOSOURCE_HSE RCC_MCO1SOURCE_HSE -#define RCC_MCOSOURCE_PLLCLK_DIV1 RCC_MCO1SOURCE_PLLCLK -#define RCC_MCOSOURCE_PLLCLK_NODIV RCC_MCO1SOURCE_PLLCLK -#define RCC_MCOSOURCE_PLLCLK_DIV2 RCC_MCO1SOURCE_PLLCLK_DIV2 - -#if defined(STM32U0) -#define RCC_SYSCLKSOURCE_STATUS_PLLR RCC_SYSCLKSOURCE_STATUS_PLLCLK -#endif - -#if defined(STM32L4) || defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) || \ - defined(STM32WL) || defined(STM32C0) || defined(STM32H7RS) || defined(STM32U0) -#define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE -#else -#define RCC_RTCCLKSOURCE_NONE RCC_RTCCLKSOURCE_NO_CLK -#endif - -#define RCC_USBCLK_PLLSAI1 RCC_USBCLKSOURCE_PLLSAI1 -#define RCC_USBCLK_PLL RCC_USBCLKSOURCE_PLL -#define RCC_USBCLK_MSI RCC_USBCLKSOURCE_MSI -#define RCC_USBCLKSOURCE_PLLCLK RCC_USBCLKSOURCE_PLL -#define RCC_USBPLLCLK_DIV1 RCC_USBCLKSOURCE_PLL -#define RCC_USBPLLCLK_DIV1_5 RCC_USBCLKSOURCE_PLL_DIV1_5 -#define RCC_USBPLLCLK_DIV2 RCC_USBCLKSOURCE_PLL_DIV2 -#define RCC_USBPLLCLK_DIV3 RCC_USBCLKSOURCE_PLL_DIV3 - -#define HSION_BitNumber RCC_HSION_BIT_NUMBER -#define HSION_BITNUMBER RCC_HSION_BIT_NUMBER -#define HSEON_BitNumber RCC_HSEON_BIT_NUMBER -#define HSEON_BITNUMBER RCC_HSEON_BIT_NUMBER -#define MSION_BITNUMBER RCC_MSION_BIT_NUMBER -#define CSSON_BitNumber RCC_CSSON_BIT_NUMBER -#define CSSON_BITNUMBER RCC_CSSON_BIT_NUMBER -#define PLLON_BitNumber RCC_PLLON_BIT_NUMBER -#define PLLON_BITNUMBER RCC_PLLON_BIT_NUMBER -#define PLLI2SON_BitNumber RCC_PLLI2SON_BIT_NUMBER -#define I2SSRC_BitNumber RCC_I2SSRC_BIT_NUMBER -#define RTCEN_BitNumber RCC_RTCEN_BIT_NUMBER -#define RTCEN_BITNUMBER RCC_RTCEN_BIT_NUMBER -#define BDRST_BitNumber RCC_BDRST_BIT_NUMBER -#define BDRST_BITNUMBER RCC_BDRST_BIT_NUMBER -#define RTCRST_BITNUMBER RCC_RTCRST_BIT_NUMBER -#define LSION_BitNumber RCC_LSION_BIT_NUMBER -#define LSION_BITNUMBER RCC_LSION_BIT_NUMBER -#define LSEON_BitNumber RCC_LSEON_BIT_NUMBER -#define LSEON_BITNUMBER RCC_LSEON_BIT_NUMBER -#define LSEBYP_BITNUMBER RCC_LSEBYP_BIT_NUMBER -#define PLLSAION_BitNumber RCC_PLLSAION_BIT_NUMBER -#define TIMPRE_BitNumber RCC_TIMPRE_BIT_NUMBER -#define RMVF_BitNumber RCC_RMVF_BIT_NUMBER -#define RMVF_BITNUMBER RCC_RMVF_BIT_NUMBER -#define RCC_CR2_HSI14TRIM_BitNumber RCC_HSI14TRIM_BIT_NUMBER -#define CR_BYTE2_ADDRESS RCC_CR_BYTE2_ADDRESS -#define CIR_BYTE1_ADDRESS RCC_CIR_BYTE1_ADDRESS -#define CIR_BYTE2_ADDRESS RCC_CIR_BYTE2_ADDRESS -#define BDCR_BYTE0_ADDRESS RCC_BDCR_BYTE0_ADDRESS -#define DBP_TIMEOUT_VALUE RCC_DBP_TIMEOUT_VALUE -#define LSE_TIMEOUT_VALUE RCC_LSE_TIMEOUT_VALUE - -#define CR_HSION_BB RCC_CR_HSION_BB -#define CR_CSSON_BB RCC_CR_CSSON_BB -#define CR_PLLON_BB RCC_CR_PLLON_BB -#define CR_PLLI2SON_BB RCC_CR_PLLI2SON_BB -#define CR_MSION_BB RCC_CR_MSION_BB -#define CSR_LSION_BB RCC_CSR_LSION_BB -#define CSR_LSEON_BB RCC_CSR_LSEON_BB -#define CSR_LSEBYP_BB RCC_CSR_LSEBYP_BB -#define CSR_RTCEN_BB RCC_CSR_RTCEN_BB -#define CSR_RTCRST_BB RCC_CSR_RTCRST_BB -#define CFGR_I2SSRC_BB RCC_CFGR_I2SSRC_BB -#define BDCR_RTCEN_BB RCC_BDCR_RTCEN_BB -#define BDCR_BDRST_BB RCC_BDCR_BDRST_BB -#define CR_HSEON_BB RCC_CR_HSEON_BB -#define CSR_RMVF_BB RCC_CSR_RMVF_BB -#define CR_PLLSAION_BB RCC_CR_PLLSAION_BB -#define DCKCFGR_TIMPRE_BB RCC_DCKCFGR_TIMPRE_BB - -#define __HAL_RCC_CRS_ENABLE_FREQ_ERROR_COUNTER __HAL_RCC_CRS_FREQ_ERROR_COUNTER_ENABLE -#define __HAL_RCC_CRS_DISABLE_FREQ_ERROR_COUNTER __HAL_RCC_CRS_FREQ_ERROR_COUNTER_DISABLE -#define __HAL_RCC_CRS_ENABLE_AUTOMATIC_CALIB __HAL_RCC_CRS_AUTOMATIC_CALIB_ENABLE -#define __HAL_RCC_CRS_DISABLE_AUTOMATIC_CALIB __HAL_RCC_CRS_AUTOMATIC_CALIB_DISABLE -#define __HAL_RCC_CRS_CALCULATE_RELOADVALUE __HAL_RCC_CRS_RELOADVALUE_CALCULATE - -#define __HAL_RCC_GET_IT_SOURCE __HAL_RCC_GET_IT - -#define RCC_CRS_SYNCWARM RCC_CRS_SYNCWARN -#define RCC_CRS_TRIMOV RCC_CRS_TRIMOVF - -#define RCC_PERIPHCLK_CK48 RCC_PERIPHCLK_CLK48 -#define RCC_CK48CLKSOURCE_PLLQ RCC_CLK48CLKSOURCE_PLLQ -#define RCC_CK48CLKSOURCE_PLLSAIP RCC_CLK48CLKSOURCE_PLLSAIP -#define RCC_CK48CLKSOURCE_PLLI2SQ RCC_CLK48CLKSOURCE_PLLI2SQ -#define IS_RCC_CK48CLKSOURCE IS_RCC_CLK48CLKSOURCE -#define RCC_SDIOCLKSOURCE_CK48 RCC_SDIOCLKSOURCE_CLK48 - -#define __HAL_RCC_DFSDM_CLK_ENABLE __HAL_RCC_DFSDM1_CLK_ENABLE -#define __HAL_RCC_DFSDM_CLK_DISABLE __HAL_RCC_DFSDM1_CLK_DISABLE -#define __HAL_RCC_DFSDM_IS_CLK_ENABLED __HAL_RCC_DFSDM1_IS_CLK_ENABLED -#define __HAL_RCC_DFSDM_IS_CLK_DISABLED __HAL_RCC_DFSDM1_IS_CLK_DISABLED -#define __HAL_RCC_DFSDM_FORCE_RESET __HAL_RCC_DFSDM1_FORCE_RESET -#define __HAL_RCC_DFSDM_RELEASE_RESET __HAL_RCC_DFSDM1_RELEASE_RESET -#define __HAL_RCC_DFSDM_CLK_SLEEP_ENABLE __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE -#define __HAL_RCC_DFSDM_CLK_SLEEP_DISABLE __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE -#define __HAL_RCC_DFSDM_IS_CLK_SLEEP_ENABLED __HAL_RCC_DFSDM1_IS_CLK_SLEEP_ENABLED -#define __HAL_RCC_DFSDM_IS_CLK_SLEEP_DISABLED __HAL_RCC_DFSDM1_IS_CLK_SLEEP_DISABLED -#define DfsdmClockSelection Dfsdm1ClockSelection -#define RCC_PERIPHCLK_DFSDM RCC_PERIPHCLK_DFSDM1 -#define RCC_DFSDMCLKSOURCE_PCLK RCC_DFSDM1CLKSOURCE_PCLK2 -#define RCC_DFSDMCLKSOURCE_SYSCLK RCC_DFSDM1CLKSOURCE_SYSCLK -#define __HAL_RCC_DFSDM_CONFIG __HAL_RCC_DFSDM1_CONFIG -#define __HAL_RCC_GET_DFSDM_SOURCE __HAL_RCC_GET_DFSDM1_SOURCE -#define RCC_DFSDM1CLKSOURCE_PCLK RCC_DFSDM1CLKSOURCE_PCLK2 -#define RCC_SWPMI1CLKSOURCE_PCLK RCC_SWPMI1CLKSOURCE_PCLK1 -#if !defined(STM32U0) -#define RCC_LPTIM1CLKSOURCE_PCLK RCC_LPTIM1CLKSOURCE_PCLK1 -#define RCC_LPTIM2CLKSOURCE_PCLK RCC_LPTIM2CLKSOURCE_PCLK1 -#endif - -#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB1 RCC_DFSDM1AUDIOCLKSOURCE_I2S1 -#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB2 RCC_DFSDM1AUDIOCLKSOURCE_I2S2 -#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB1 RCC_DFSDM2AUDIOCLKSOURCE_I2S1 -#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB2 RCC_DFSDM2AUDIOCLKSOURCE_I2S2 -#define RCC_DFSDM1CLKSOURCE_APB2 RCC_DFSDM1CLKSOURCE_PCLK2 -#define RCC_DFSDM2CLKSOURCE_APB2 RCC_DFSDM2CLKSOURCE_PCLK2 -#define RCC_FMPI2C1CLKSOURCE_APB RCC_FMPI2C1CLKSOURCE_PCLK1 -#if defined(STM32U5) -#define MSIKPLLModeSEL RCC_MSIKPLL_MODE_SEL -#define MSISPLLModeSEL RCC_MSISPLL_MODE_SEL -#define __HAL_RCC_AHB21_CLK_DISABLE __HAL_RCC_AHB2_1_CLK_DISABLE -#define __HAL_RCC_AHB22_CLK_DISABLE __HAL_RCC_AHB2_2_CLK_DISABLE -#define __HAL_RCC_AHB1_CLK_Disable_Clear __HAL_RCC_AHB1_CLK_ENABLE -#define __HAL_RCC_AHB21_CLK_Disable_Clear __HAL_RCC_AHB2_1_CLK_ENABLE -#define __HAL_RCC_AHB22_CLK_Disable_Clear __HAL_RCC_AHB2_2_CLK_ENABLE -#define __HAL_RCC_AHB3_CLK_Disable_Clear __HAL_RCC_AHB3_CLK_ENABLE -#define __HAL_RCC_APB1_CLK_Disable_Clear __HAL_RCC_APB1_CLK_ENABLE -#define __HAL_RCC_APB2_CLK_Disable_Clear __HAL_RCC_APB2_CLK_ENABLE -#define __HAL_RCC_APB3_CLK_Disable_Clear __HAL_RCC_APB3_CLK_ENABLE -#define IS_RCC_MSIPLLModeSelection IS_RCC_MSIPLLMODE_SELECT -#define RCC_PERIPHCLK_CLK48 RCC_PERIPHCLK_ICLK -#define RCC_CLK48CLKSOURCE_HSI48 RCC_ICLK_CLKSOURCE_HSI48 -#define RCC_CLK48CLKSOURCE_PLL2 RCC_ICLK_CLKSOURCE_PLL2 -#define RCC_CLK48CLKSOURCE_PLL1 RCC_ICLK_CLKSOURCE_PLL1 -#define RCC_CLK48CLKSOURCE_MSIK RCC_ICLK_CLKSOURCE_MSIK -#define __HAL_RCC_ADC1_CLK_ENABLE __HAL_RCC_ADC12_CLK_ENABLE -#define __HAL_RCC_ADC1_CLK_DISABLE __HAL_RCC_ADC12_CLK_DISABLE -#define __HAL_RCC_ADC1_IS_CLK_ENABLED __HAL_RCC_ADC12_IS_CLK_ENABLED -#define __HAL_RCC_ADC1_IS_CLK_DISABLED __HAL_RCC_ADC12_IS_CLK_DISABLED -#define __HAL_RCC_ADC1_FORCE_RESET __HAL_RCC_ADC12_FORCE_RESET -#define __HAL_RCC_ADC1_RELEASE_RESET __HAL_RCC_ADC12_RELEASE_RESET -#define __HAL_RCC_ADC1_CLK_SLEEP_ENABLE __HAL_RCC_ADC12_CLK_SLEEP_ENABLE -#define __HAL_RCC_ADC1_CLK_SLEEP_DISABLE __HAL_RCC_ADC12_CLK_SLEEP_DISABLE -#define __HAL_RCC_GET_CLK48_SOURCE __HAL_RCC_GET_ICLK_SOURCE -#define __HAL_RCC_PLLFRACN_ENABLE __HAL_RCC_PLL_FRACN_ENABLE -#define __HAL_RCC_PLLFRACN_DISABLE __HAL_RCC_PLL_FRACN_DISABLE -#define __HAL_RCC_PLLFRACN_CONFIG __HAL_RCC_PLL_FRACN_CONFIG -#define IS_RCC_PLLFRACN_VALUE IS_RCC_PLL_FRACN_VALUE -#endif /* STM32U5 */ - -#if defined(STM32H5) -#define __HAL_RCC_PLLFRACN_ENABLE __HAL_RCC_PLL_FRACN_ENABLE -#define __HAL_RCC_PLLFRACN_DISABLE __HAL_RCC_PLL_FRACN_DISABLE -#define __HAL_RCC_PLLFRACN_CONFIG __HAL_RCC_PLL_FRACN_CONFIG -#define IS_RCC_PLLFRACN_VALUE IS_RCC_PLL_FRACN_VALUE - -#define RCC_PLLSOURCE_NONE RCC_PLL1_SOURCE_NONE -#define RCC_PLLSOURCE_HSI RCC_PLL1_SOURCE_HSI -#define RCC_PLLSOURCE_CSI RCC_PLL1_SOURCE_CSI -#define RCC_PLLSOURCE_HSE RCC_PLL1_SOURCE_HSE -#define RCC_PLLVCIRANGE_0 RCC_PLL1_VCIRANGE_0 -#define RCC_PLLVCIRANGE_1 RCC_PLL1_VCIRANGE_1 -#define RCC_PLLVCIRANGE_2 RCC_PLL1_VCIRANGE_2 -#define RCC_PLLVCIRANGE_3 RCC_PLL1_VCIRANGE_3 -#define RCC_PLL1VCOWIDE RCC_PLL1_VCORANGE_WIDE -#define RCC_PLL1VCOMEDIUM RCC_PLL1_VCORANGE_MEDIUM - -#define IS_RCC_PLLSOURCE IS_RCC_PLL1_SOURCE -#define IS_RCC_PLLRGE_VALUE IS_RCC_PLL1_VCIRGE_VALUE -#define IS_RCC_PLLVCORGE_VALUE IS_RCC_PLL1_VCORGE_VALUE -#define IS_RCC_PLLCLOCKOUT_VALUE IS_RCC_PLL1_CLOCKOUT_VALUE -#define IS_RCC_PLL_FRACN_VALUE IS_RCC_PLL1_FRACN_VALUE -#define IS_RCC_PLLM_VALUE IS_RCC_PLL1_DIVM_VALUE -#define IS_RCC_PLLN_VALUE IS_RCC_PLL1_MULN_VALUE -#define IS_RCC_PLLP_VALUE IS_RCC_PLL1_DIVP_VALUE -#define IS_RCC_PLLQ_VALUE IS_RCC_PLL1_DIVQ_VALUE -#define IS_RCC_PLLR_VALUE IS_RCC_PLL1_DIVR_VALUE - -#define __HAL_RCC_PLL_ENABLE __HAL_RCC_PLL1_ENABLE -#define __HAL_RCC_PLL_DISABLE __HAL_RCC_PLL1_DISABLE -#define __HAL_RCC_PLL_FRACN_ENABLE __HAL_RCC_PLL1_FRACN_ENABLE -#define __HAL_RCC_PLL_FRACN_DISABLE __HAL_RCC_PLL1_FRACN_DISABLE -#define __HAL_RCC_PLL_CONFIG __HAL_RCC_PLL1_CONFIG -#define __HAL_RCC_PLL_PLLSOURCE_CONFIG __HAL_RCC_PLL1_PLLSOURCE_CONFIG -#define __HAL_RCC_PLL_DIVM_CONFIG __HAL_RCC_PLL1_DIVM_CONFIG -#define __HAL_RCC_PLL_FRACN_CONFIG __HAL_RCC_PLL1_FRACN_CONFIG -#define __HAL_RCC_PLL_VCIRANGE __HAL_RCC_PLL1_VCIRANGE -#define __HAL_RCC_PLL_VCORANGE __HAL_RCC_PLL1_VCORANGE -#define __HAL_RCC_GET_PLL_OSCSOURCE __HAL_RCC_GET_PLL1_OSCSOURCE -#define __HAL_RCC_PLLCLKOUT_ENABLE __HAL_RCC_PLL1_CLKOUT_ENABLE -#define __HAL_RCC_PLLCLKOUT_DISABLE __HAL_RCC_PLL1_CLKOUT_DISABLE -#define __HAL_RCC_GET_PLLCLKOUT_CONFIG __HAL_RCC_GET_PLL1_CLKOUT_CONFIG - -#define __HAL_RCC_PLL2FRACN_ENABLE __HAL_RCC_PLL2_FRACN_ENABLE -#define __HAL_RCC_PLL2FRACN_DISABLE __HAL_RCC_PLL2_FRACN_DISABLE -#define __HAL_RCC_PLL2CLKOUT_ENABLE __HAL_RCC_PLL2_CLKOUT_ENABLE -#define __HAL_RCC_PLL2CLKOUT_DISABLE __HAL_RCC_PLL2_CLKOUT_DISABLE -#define __HAL_RCC_PLL2FRACN_CONFIG __HAL_RCC_PLL2_FRACN_CONFIG -#define __HAL_RCC_GET_PLL2CLKOUT_CONFIG __HAL_RCC_GET_PLL2_CLKOUT_CONFIG - -#define __HAL_RCC_PLL3FRACN_ENABLE __HAL_RCC_PLL3_FRACN_ENABLE -#define __HAL_RCC_PLL3FRACN_DISABLE __HAL_RCC_PLL3_FRACN_DISABLE -#define __HAL_RCC_PLL3CLKOUT_ENABLE __HAL_RCC_PLL3_CLKOUT_ENABLE -#define __HAL_RCC_PLL3CLKOUT_DISABLE __HAL_RCC_PLL3_CLKOUT_DISABLE -#define __HAL_RCC_PLL3FRACN_CONFIG __HAL_RCC_PLL3_FRACN_CONFIG -#define __HAL_RCC_GET_PLL3CLKOUT_CONFIG __HAL_RCC_GET_PLL3_CLKOUT_CONFIG - -#define RCC_PLL2VCIRANGE_0 RCC_PLL2_VCIRANGE_0 -#define RCC_PLL2VCIRANGE_1 RCC_PLL2_VCIRANGE_1 -#define RCC_PLL2VCIRANGE_2 RCC_PLL2_VCIRANGE_2 -#define RCC_PLL2VCIRANGE_3 RCC_PLL2_VCIRANGE_3 - -#define RCC_PLL2VCOWIDE RCC_PLL2_VCORANGE_WIDE -#define RCC_PLL2VCOMEDIUM RCC_PLL2_VCORANGE_MEDIUM - -#define RCC_PLL2SOURCE_NONE RCC_PLL2_SOURCE_NONE -#define RCC_PLL2SOURCE_HSI RCC_PLL2_SOURCE_HSI -#define RCC_PLL2SOURCE_CSI RCC_PLL2_SOURCE_CSI -#define RCC_PLL2SOURCE_HSE RCC_PLL2_SOURCE_HSE - -#define RCC_PLL3VCIRANGE_0 RCC_PLL3_VCIRANGE_0 -#define RCC_PLL3VCIRANGE_1 RCC_PLL3_VCIRANGE_1 -#define RCC_PLL3VCIRANGE_2 RCC_PLL3_VCIRANGE_2 -#define RCC_PLL3VCIRANGE_3 RCC_PLL3_VCIRANGE_3 - -#define RCC_PLL3VCOWIDE RCC_PLL3_VCORANGE_WIDE -#define RCC_PLL3VCOMEDIUM RCC_PLL3_VCORANGE_MEDIUM - -#define RCC_PLL3SOURCE_NONE RCC_PLL3_SOURCE_NONE -#define RCC_PLL3SOURCE_HSI RCC_PLL3_SOURCE_HSI -#define RCC_PLL3SOURCE_CSI RCC_PLL3_SOURCE_CSI -#define RCC_PLL3SOURCE_HSE RCC_PLL3_SOURCE_HSE - - -#endif /* STM32H5 */ - -/** - * @} - */ - -/** @defgroup HAL_RNG_Aliased_Macros HAL RNG Aliased Macros maintained for legacy purpose - * @{ - */ -#define HAL_RNG_ReadyCallback(__HANDLE__) HAL_RNG_ReadyDataCallback((__HANDLE__), uint32_t random32bit) - -/** - * @} - */ - -/** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || \ - defined (STM32L4P5xx)|| defined (STM32L4Q5xx) || defined (STM32G4) || defined (STM32WL) || defined (STM32U5) || \ - defined (STM32WBA) || defined (STM32H5) || defined (STM32C0) || defined (STM32H7RS) || defined (STM32U0) -#else -#define __HAL_RTC_CLEAR_FLAG __HAL_RTC_EXTI_CLEAR_FLAG -#endif -#define __HAL_RTC_DISABLE_IT __HAL_RTC_EXTI_DISABLE_IT -#define __HAL_RTC_ENABLE_IT __HAL_RTC_EXTI_ENABLE_IT - -#if defined (STM32F1) -#define __HAL_RTC_EXTI_CLEAR_FLAG(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_CLEAR_FLAG() - -#define __HAL_RTC_EXTI_ENABLE_IT(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_ENABLE_IT() - -#define __HAL_RTC_EXTI_DISABLE_IT(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_DISABLE_IT() - -#define __HAL_RTC_EXTI_GET_FLAG(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_GET_FLAG() - -#define __HAL_RTC_EXTI_GENERATE_SWIT(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_GENERATE_SWIT() -#else -#define __HAL_RTC_EXTI_CLEAR_FLAG(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_CLEAR_FLAG() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_CLEAR_FLAG())) -#define __HAL_RTC_EXTI_ENABLE_IT(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_ENABLE_IT() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_IT())) -#define __HAL_RTC_EXTI_DISABLE_IT(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_DISABLE_IT() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_DISABLE_IT() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_DISABLE_IT())) -#define __HAL_RTC_EXTI_GET_FLAG(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_GET_FLAG() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_GET_FLAG() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_GET_FLAG())) -#define __HAL_RTC_EXTI_GENERATE_SWIT(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_GENERATE_SWIT() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_GENERATE_SWIT() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_GENERATE_SWIT())) -#endif /* STM32F1 */ - -#if defined (STM32F0) || defined (STM32F2) || defined (STM32F3) || defined (STM32F4) || defined (STM32F7) || \ - defined (STM32H7) || \ - defined (STM32L0) || defined (STM32L1) || \ - defined (STM32WB) -#define __HAL_RTC_TAMPER_GET_IT __HAL_RTC_TAMPER_GET_FLAG -#endif - -#define IS_ALARM IS_RTC_ALARM -#define IS_ALARM_MASK IS_RTC_ALARM_MASK -#define IS_TAMPER IS_RTC_TAMPER -#define IS_TAMPER_ERASE_MODE IS_RTC_TAMPER_ERASE_MODE -#define IS_TAMPER_FILTER IS_RTC_TAMPER_FILTER -#define IS_TAMPER_INTERRUPT IS_RTC_TAMPER_INTERRUPT -#define IS_TAMPER_MASKFLAG_STATE IS_RTC_TAMPER_MASKFLAG_STATE -#define IS_TAMPER_PRECHARGE_DURATION IS_RTC_TAMPER_PRECHARGE_DURATION -#define IS_TAMPER_PULLUP_STATE IS_RTC_TAMPER_PULLUP_STATE -#define IS_TAMPER_SAMPLING_FREQ IS_RTC_TAMPER_SAMPLING_FREQ -#define IS_TAMPER_TIMESTAMPONTAMPER_DETECTION IS_RTC_TAMPER_TIMESTAMPONTAMPER_DETECTION -#define IS_TAMPER_TRIGGER IS_RTC_TAMPER_TRIGGER -#define IS_WAKEUP_CLOCK IS_RTC_WAKEUP_CLOCK -#define IS_WAKEUP_COUNTER IS_RTC_WAKEUP_COUNTER - -#define __RTC_WRITEPROTECTION_ENABLE __HAL_RTC_WRITEPROTECTION_ENABLE -#define __RTC_WRITEPROTECTION_DISABLE __HAL_RTC_WRITEPROTECTION_DISABLE - -#if defined (STM32H5) -#define __HAL_RCC_RTCAPB_CLK_ENABLE __HAL_RCC_RTC_CLK_ENABLE -#define __HAL_RCC_RTCAPB_CLK_DISABLE __HAL_RCC_RTC_CLK_DISABLE -#endif /* STM32H5 */ - -/** - * @} - */ - -/** @defgroup HAL_SD_Aliased_Macros HAL SD/MMC Aliased Macros maintained for legacy purpose - * @{ - */ - -#define SD_OCR_CID_CSD_OVERWRIETE SD_OCR_CID_CSD_OVERWRITE -#define SD_CMD_SD_APP_STAUS SD_CMD_SD_APP_STATUS - -#if !defined(STM32F1) && !defined(STM32F2) && !defined(STM32F4) && !defined(STM32L1) -#define eMMC_HIGH_VOLTAGE_RANGE EMMC_HIGH_VOLTAGE_RANGE -#define eMMC_DUAL_VOLTAGE_RANGE EMMC_DUAL_VOLTAGE_RANGE -#define eMMC_LOW_VOLTAGE_RANGE EMMC_LOW_VOLTAGE_RANGE - -#define SDMMC_NSpeed_CLK_DIV SDMMC_NSPEED_CLK_DIV -#define SDMMC_HSpeed_CLK_DIV SDMMC_HSPEED_CLK_DIV -#endif - -#if defined(STM32F4) || defined(STM32F2) -#define SD_SDMMC_DISABLED SD_SDIO_DISABLED -#define SD_SDMMC_FUNCTION_BUSY SD_SDIO_FUNCTION_BUSY -#define SD_SDMMC_FUNCTION_FAILED SD_SDIO_FUNCTION_FAILED -#define SD_SDMMC_UNKNOWN_FUNCTION SD_SDIO_UNKNOWN_FUNCTION -#define SD_CMD_SDMMC_SEN_OP_COND SD_CMD_SDIO_SEN_OP_COND -#define SD_CMD_SDMMC_RW_DIRECT SD_CMD_SDIO_RW_DIRECT -#define SD_CMD_SDMMC_RW_EXTENDED SD_CMD_SDIO_RW_EXTENDED -#define __HAL_SD_SDMMC_ENABLE __HAL_SD_SDIO_ENABLE -#define __HAL_SD_SDMMC_DISABLE __HAL_SD_SDIO_DISABLE -#define __HAL_SD_SDMMC_DMA_ENABLE __HAL_SD_SDIO_DMA_ENABLE -#define __HAL_SD_SDMMC_DMA_DISABLE __HAL_SD_SDIO_DMA_DISABL -#define __HAL_SD_SDMMC_ENABLE_IT __HAL_SD_SDIO_ENABLE_IT -#define __HAL_SD_SDMMC_DISABLE_IT __HAL_SD_SDIO_DISABLE_IT -#define __HAL_SD_SDMMC_GET_FLAG __HAL_SD_SDIO_GET_FLAG -#define __HAL_SD_SDMMC_CLEAR_FLAG __HAL_SD_SDIO_CLEAR_FLAG -#define __HAL_SD_SDMMC_GET_IT __HAL_SD_SDIO_GET_IT -#define __HAL_SD_SDMMC_CLEAR_IT __HAL_SD_SDIO_CLEAR_IT -#define SDMMC_STATIC_FLAGS SDIO_STATIC_FLAGS -#define SDMMC_CMD0TIMEOUT SDIO_CMD0TIMEOUT -#define SD_SDMMC_SEND_IF_COND SD_SDIO_SEND_IF_COND -/* alias CMSIS */ -#define SDMMC1_IRQn SDIO_IRQn -#define SDMMC1_IRQHandler SDIO_IRQHandler -#endif - -#if defined(STM32F7) || defined(STM32L4) -#define SD_SDIO_DISABLED SD_SDMMC_DISABLED -#define SD_SDIO_FUNCTION_BUSY SD_SDMMC_FUNCTION_BUSY -#define SD_SDIO_FUNCTION_FAILED SD_SDMMC_FUNCTION_FAILED -#define SD_SDIO_UNKNOWN_FUNCTION SD_SDMMC_UNKNOWN_FUNCTION -#define SD_CMD_SDIO_SEN_OP_COND SD_CMD_SDMMC_SEN_OP_COND -#define SD_CMD_SDIO_RW_DIRECT SD_CMD_SDMMC_RW_DIRECT -#define SD_CMD_SDIO_RW_EXTENDED SD_CMD_SDMMC_RW_EXTENDED -#define __HAL_SD_SDIO_ENABLE __HAL_SD_SDMMC_ENABLE -#define __HAL_SD_SDIO_DISABLE __HAL_SD_SDMMC_DISABLE -#define __HAL_SD_SDIO_DMA_ENABLE __HAL_SD_SDMMC_DMA_ENABLE -#define __HAL_SD_SDIO_DMA_DISABL __HAL_SD_SDMMC_DMA_DISABLE -#define __HAL_SD_SDIO_ENABLE_IT __HAL_SD_SDMMC_ENABLE_IT -#define __HAL_SD_SDIO_DISABLE_IT __HAL_SD_SDMMC_DISABLE_IT -#define __HAL_SD_SDIO_GET_FLAG __HAL_SD_SDMMC_GET_FLAG -#define __HAL_SD_SDIO_CLEAR_FLAG __HAL_SD_SDMMC_CLEAR_FLAG -#define __HAL_SD_SDIO_GET_IT __HAL_SD_SDMMC_GET_IT -#define __HAL_SD_SDIO_CLEAR_IT __HAL_SD_SDMMC_CLEAR_IT -#define SDIO_STATIC_FLAGS SDMMC_STATIC_FLAGS -#define SDIO_CMD0TIMEOUT SDMMC_CMD0TIMEOUT -#define SD_SDIO_SEND_IF_COND SD_SDMMC_SEND_IF_COND -/* alias CMSIS for compatibilities */ -#define SDIO_IRQn SDMMC1_IRQn -#define SDIO_IRQHandler SDMMC1_IRQHandler -#endif - -#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4) || defined(STM32H7) -#define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef -#define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef -#define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef -#define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef -#endif - -#if defined(STM32H7) || defined(STM32L5) -#define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback HAL_MMCEx_Read_DMADoubleBuf0CpltCallback -#define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback HAL_MMCEx_Read_DMADoubleBuf1CpltCallback -#define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback HAL_MMCEx_Write_DMADoubleBuf0CpltCallback -#define HAL_MMCEx_Write_DMADoubleBuffer1CpltCallback HAL_MMCEx_Write_DMADoubleBuf1CpltCallback -#define HAL_SDEx_Read_DMADoubleBuffer0CpltCallback HAL_SDEx_Read_DMADoubleBuf0CpltCallback -#define HAL_SDEx_Read_DMADoubleBuffer1CpltCallback HAL_SDEx_Read_DMADoubleBuf1CpltCallback -#define HAL_SDEx_Write_DMADoubleBuffer0CpltCallback HAL_SDEx_Write_DMADoubleBuf0CpltCallback -#define HAL_SDEx_Write_DMADoubleBuffer1CpltCallback HAL_SDEx_Write_DMADoubleBuf1CpltCallback -#define HAL_SD_DriveTransciver_1_8V_Callback HAL_SD_DriveTransceiver_1_8V_Callback -#endif -/** - * @} - */ - -/** @defgroup HAL_SMARTCARD_Aliased_Macros HAL SMARTCARD Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __SMARTCARD_ENABLE_IT __HAL_SMARTCARD_ENABLE_IT -#define __SMARTCARD_DISABLE_IT __HAL_SMARTCARD_DISABLE_IT -#define __SMARTCARD_ENABLE __HAL_SMARTCARD_ENABLE -#define __SMARTCARD_DISABLE __HAL_SMARTCARD_DISABLE -#define __SMARTCARD_DMA_REQUEST_ENABLE __HAL_SMARTCARD_DMA_REQUEST_ENABLE -#define __SMARTCARD_DMA_REQUEST_DISABLE __HAL_SMARTCARD_DMA_REQUEST_DISABLE - -#define __HAL_SMARTCARD_GETCLOCKSOURCE SMARTCARD_GETCLOCKSOURCE -#define __SMARTCARD_GETCLOCKSOURCE SMARTCARD_GETCLOCKSOURCE - -#define IS_SMARTCARD_ONEBIT_SAMPLING IS_SMARTCARD_ONE_BIT_SAMPLE - -/** - * @} - */ - -/** @defgroup HAL_SMBUS_Aliased_Macros HAL SMBUS Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_SMBUS_RESET_CR1 SMBUS_RESET_CR1 -#define __HAL_SMBUS_RESET_CR2 SMBUS_RESET_CR2 -#define __HAL_SMBUS_GENERATE_START SMBUS_GENERATE_START -#define __HAL_SMBUS_GET_ADDR_MATCH SMBUS_GET_ADDR_MATCH -#define __HAL_SMBUS_GET_DIR SMBUS_GET_DIR -#define __HAL_SMBUS_GET_STOP_MODE SMBUS_GET_STOP_MODE -#define __HAL_SMBUS_GET_PEC_MODE SMBUS_GET_PEC_MODE -#define __HAL_SMBUS_GET_ALERT_ENABLED SMBUS_GET_ALERT_ENABLED -/** - * @} - */ - -/** @defgroup HAL_SPI_Aliased_Macros HAL SPI Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_SPI_1LINE_TX SPI_1LINE_TX -#define __HAL_SPI_1LINE_RX SPI_1LINE_RX -#define __HAL_SPI_RESET_CRC SPI_RESET_CRC - -/** - * @} - */ - -/** @defgroup HAL_UART_Aliased_Macros HAL UART Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_UART_GETCLOCKSOURCE UART_GETCLOCKSOURCE -#define __HAL_UART_MASK_COMPUTATION UART_MASK_COMPUTATION -#define __UART_GETCLOCKSOURCE UART_GETCLOCKSOURCE -#define __UART_MASK_COMPUTATION UART_MASK_COMPUTATION - -#define IS_UART_WAKEUPMETHODE IS_UART_WAKEUPMETHOD - -#define IS_UART_ONEBIT_SAMPLE IS_UART_ONE_BIT_SAMPLE -#define IS_UART_ONEBIT_SAMPLING IS_UART_ONE_BIT_SAMPLE - -/** - * @} - */ - - -/** @defgroup HAL_USART_Aliased_Macros HAL USART Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __USART_ENABLE_IT __HAL_USART_ENABLE_IT -#define __USART_DISABLE_IT __HAL_USART_DISABLE_IT -#define __USART_ENABLE __HAL_USART_ENABLE -#define __USART_DISABLE __HAL_USART_DISABLE - -#define __HAL_USART_GETCLOCKSOURCE USART_GETCLOCKSOURCE -#define __USART_GETCLOCKSOURCE USART_GETCLOCKSOURCE - -#if defined(STM32F0) || defined(STM32F3) || defined(STM32F7) -#define USART_OVERSAMPLING_16 0x00000000U -#define USART_OVERSAMPLING_8 USART_CR1_OVER8 - -#define IS_USART_OVERSAMPLING(__SAMPLING__) (((__SAMPLING__) == USART_OVERSAMPLING_16) || \ - ((__SAMPLING__) == USART_OVERSAMPLING_8)) -#endif /* STM32F0 || STM32F3 || STM32F7 */ -/** - * @} - */ - -/** @defgroup HAL_USB_Aliased_Macros HAL USB Aliased Macros maintained for legacy purpose - * @{ - */ -#define USB_EXTI_LINE_WAKEUP USB_WAKEUP_EXTI_LINE - -#define USB_FS_EXTI_TRIGGER_RISING_EDGE USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE -#define USB_FS_EXTI_TRIGGER_FALLING_EDGE USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE -#define USB_FS_EXTI_TRIGGER_BOTH_EDGE USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE -#define USB_FS_EXTI_LINE_WAKEUP USB_OTG_FS_WAKEUP_EXTI_LINE - -#define USB_HS_EXTI_TRIGGER_RISING_EDGE USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE -#define USB_HS_EXTI_TRIGGER_FALLING_EDGE USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE -#define USB_HS_EXTI_TRIGGER_BOTH_EDGE USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE -#define USB_HS_EXTI_LINE_WAKEUP USB_OTG_HS_WAKEUP_EXTI_LINE - -#define __HAL_USB_EXTI_ENABLE_IT __HAL_USB_WAKEUP_EXTI_ENABLE_IT -#define __HAL_USB_EXTI_DISABLE_IT __HAL_USB_WAKEUP_EXTI_DISABLE_IT -#define __HAL_USB_EXTI_GET_FLAG __HAL_USB_WAKEUP_EXTI_GET_FLAG -#define __HAL_USB_EXTI_CLEAR_FLAG __HAL_USB_WAKEUP_EXTI_CLEAR_FLAG -#define __HAL_USB_EXTI_SET_RISING_EDGE_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_EDGE -#define __HAL_USB_EXTI_SET_FALLING_EDGE_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_FALLING_EDGE -#define __HAL_USB_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE - -#define __HAL_USB_FS_EXTI_ENABLE_IT __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT -#define __HAL_USB_FS_EXTI_DISABLE_IT __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT -#define __HAL_USB_FS_EXTI_GET_FLAG __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG -#define __HAL_USB_FS_EXTI_CLEAR_FLAG __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG -#define __HAL_USB_FS_EXTI_SET_RISING_EGDE_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE -#define __HAL_USB_FS_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_FALLING_EDGE -#define __HAL_USB_FS_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE -#define __HAL_USB_FS_EXTI_GENERATE_SWIT __HAL_USB_OTG_FS_WAKEUP_EXTI_GENERATE_SWIT - -#define __HAL_USB_HS_EXTI_ENABLE_IT __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT -#define __HAL_USB_HS_EXTI_DISABLE_IT __HAL_USB_OTG_HS_WAKEUP_EXTI_DISABLE_IT -#define __HAL_USB_HS_EXTI_GET_FLAG __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG -#define __HAL_USB_HS_EXTI_CLEAR_FLAG __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG -#define __HAL_USB_HS_EXTI_SET_RISING_EGDE_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE -#define __HAL_USB_HS_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_FALLING_EDGE -#define __HAL_USB_HS_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE -#define __HAL_USB_HS_EXTI_GENERATE_SWIT __HAL_USB_OTG_HS_WAKEUP_EXTI_GENERATE_SWIT - -#define HAL_PCD_ActiveRemoteWakeup HAL_PCD_ActivateRemoteWakeup -#define HAL_PCD_DeActiveRemoteWakeup HAL_PCD_DeActivateRemoteWakeup - -#define HAL_PCD_SetTxFiFo HAL_PCDEx_SetTxFiFo -#define HAL_PCD_SetRxFiFo HAL_PCDEx_SetRxFiFo -/** - * @} - */ - -/** @defgroup HAL_TIM_Aliased_Macros HAL TIM Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_TIM_SetICPrescalerValue TIM_SET_ICPRESCALERVALUE -#define __HAL_TIM_ResetICPrescalerValue TIM_RESET_ICPRESCALERVALUE - -#define TIM_GET_ITSTATUS __HAL_TIM_GET_IT_SOURCE -#define TIM_GET_CLEAR_IT __HAL_TIM_CLEAR_IT - -#define __HAL_TIM_GET_ITSTATUS __HAL_TIM_GET_IT_SOURCE - -#define __HAL_TIM_DIRECTION_STATUS __HAL_TIM_IS_TIM_COUNTING_DOWN -#define __HAL_TIM_PRESCALER __HAL_TIM_SET_PRESCALER -#define __HAL_TIM_SetCounter __HAL_TIM_SET_COUNTER -#define __HAL_TIM_GetCounter __HAL_TIM_GET_COUNTER -#define __HAL_TIM_SetAutoreload __HAL_TIM_SET_AUTORELOAD -#define __HAL_TIM_GetAutoreload __HAL_TIM_GET_AUTORELOAD -#define __HAL_TIM_SetClockDivision __HAL_TIM_SET_CLOCKDIVISION -#define __HAL_TIM_GetClockDivision __HAL_TIM_GET_CLOCKDIVISION -#define __HAL_TIM_SetICPrescaler __HAL_TIM_SET_ICPRESCALER -#define __HAL_TIM_GetICPrescaler __HAL_TIM_GET_ICPRESCALER -#define __HAL_TIM_SetCompare __HAL_TIM_SET_COMPARE -#define __HAL_TIM_GetCompare __HAL_TIM_GET_COMPARE - -#define TIM_BREAKINPUTSOURCE_DFSDM TIM_BREAKINPUTSOURCE_DFSDM1 - -#define TIM_OCMODE_ASSYMETRIC_PWM1 TIM_OCMODE_ASYMMETRIC_PWM1 -#define TIM_OCMODE_ASSYMETRIC_PWM2 TIM_OCMODE_ASYMMETRIC_PWM2 -/** - * @} - */ - -/** @defgroup HAL_ETH_Aliased_Macros HAL ETH Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_ETH_EXTI_ENABLE_IT __HAL_ETH_WAKEUP_EXTI_ENABLE_IT -#define __HAL_ETH_EXTI_DISABLE_IT __HAL_ETH_WAKEUP_EXTI_DISABLE_IT -#define __HAL_ETH_EXTI_GET_FLAG __HAL_ETH_WAKEUP_EXTI_GET_FLAG -#define __HAL_ETH_EXTI_CLEAR_FLAG __HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG -#define __HAL_ETH_EXTI_SET_RISING_EGDE_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_RISING_EDGE_TRIGGER -#define __HAL_ETH_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_FALLING_EDGE_TRIGGER -#define __HAL_ETH_EXTI_SET_FALLINGRISING_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_FALLINGRISING_TRIGGER - -#define ETH_PROMISCIOUSMODE_ENABLE ETH_PROMISCUOUS_MODE_ENABLE -#define ETH_PROMISCIOUSMODE_DISABLE ETH_PROMISCUOUS_MODE_DISABLE -#define IS_ETH_PROMISCIOUS_MODE IS_ETH_PROMISCUOUS_MODE -/** - * @} - */ - -/** @defgroup HAL_LTDC_Aliased_Macros HAL LTDC Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_LTDC_LAYER LTDC_LAYER -#define __HAL_LTDC_RELOAD_CONFIG __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG -/** - * @} - */ - -/** @defgroup HAL_SAI_Aliased_Macros HAL SAI Aliased Macros maintained for legacy purpose - * @{ - */ -#define SAI_OUTPUTDRIVE_DISABLED SAI_OUTPUTDRIVE_DISABLE -#define SAI_OUTPUTDRIVE_ENABLED SAI_OUTPUTDRIVE_ENABLE -#define SAI_MASTERDIVIDER_ENABLED SAI_MASTERDIVIDER_ENABLE -#define SAI_MASTERDIVIDER_DISABLED SAI_MASTERDIVIDER_DISABLE -#define SAI_STREOMODE SAI_STEREOMODE -#define SAI_FIFOStatus_Empty SAI_FIFOSTATUS_EMPTY -#define SAI_FIFOStatus_Less1QuarterFull SAI_FIFOSTATUS_LESS1QUARTERFULL -#define SAI_FIFOStatus_1QuarterFull SAI_FIFOSTATUS_1QUARTERFULL -#define SAI_FIFOStatus_HalfFull SAI_FIFOSTATUS_HALFFULL -#define SAI_FIFOStatus_3QuartersFull SAI_FIFOSTATUS_3QUARTERFULL -#define SAI_FIFOStatus_Full SAI_FIFOSTATUS_FULL -#define IS_SAI_BLOCK_MONO_STREO_MODE IS_SAI_BLOCK_MONO_STEREO_MODE -#define SAI_SYNCHRONOUS_EXT SAI_SYNCHRONOUS_EXT_SAI1 -#define SAI_SYNCEXT_IN_ENABLE SAI_SYNCEXT_OUTBLOCKA_ENABLE -/** - * @} - */ - -/** @defgroup HAL_SPDIFRX_Aliased_Macros HAL SPDIFRX Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined(STM32H7) -#define HAL_SPDIFRX_ReceiveControlFlow HAL_SPDIFRX_ReceiveCtrlFlow -#define HAL_SPDIFRX_ReceiveControlFlow_IT HAL_SPDIFRX_ReceiveCtrlFlow_IT -#define HAL_SPDIFRX_ReceiveControlFlow_DMA HAL_SPDIFRX_ReceiveCtrlFlow_DMA -#endif -/** - * @} - */ - -/** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose - * @{ - */ -#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3) -#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT -#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA -#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart -#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT -#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA -#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop -#endif -/** - * @} - */ - -/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined (STM32L4) || defined (STM32F4) || defined (STM32F7) || defined(STM32H7) -#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE -#endif /* STM32L4 || STM32F4 || STM32F7 */ -/** - * @} - */ - -/** @defgroup HAL_Generic_Aliased_Macros HAL Generic Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined (STM32F7) -#define ART_ACCLERATOR_ENABLE ART_ACCELERATOR_ENABLE -#endif /* STM32F7 */ -/** - * @} - */ - -/** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose - * @{ - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32_HAL_LEGACY */ - - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h deleted file mode 100644 index f7eb847..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h +++ /dev/null @@ -1,297 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal.h - * @author MCD Application Team - * @brief This file contains all the functions prototypes for the HAL - * module driver. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_H -#define __STM32F4xx_HAL_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_conf.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup HAL - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup HAL_Exported_Constants HAL Exported Constants - * @{ - */ - -/** @defgroup HAL_TICK_FREQ Tick Frequency - * @{ - */ -typedef enum -{ - HAL_TICK_FREQ_10HZ = 100U, - HAL_TICK_FREQ_100HZ = 10U, - HAL_TICK_FREQ_1KHZ = 1U, - HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ -} HAL_TickFreqTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup HAL_Exported_Macros HAL Exported Macros - * @{ - */ - -/** @brief Freeze/Unfreeze Peripherals in Debug mode - */ -#define __HAL_DBGMCU_FREEZE_TIM2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM2_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM3() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM3_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM4() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM4_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM5() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM5_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM6() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM6_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM7() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM7_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM12() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM12_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM13() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM13_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM14() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM14_STOP)) -#define __HAL_DBGMCU_FREEZE_RTC() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_RTC_STOP)) -#define __HAL_DBGMCU_FREEZE_WWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_WWDG_STOP)) -#define __HAL_DBGMCU_FREEZE_IWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_IWDG_STOP)) -#define __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_CAN1() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN1_STOP)) -#define __HAL_DBGMCU_FREEZE_CAN2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN2_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM1() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM1_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM8() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM8_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM9() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM9_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM10() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM10_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM11() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM11_STOP)) - -#define __HAL_DBGMCU_UNFREEZE_TIM2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM2_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM3() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM3_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM4() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM4_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM5() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM5_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM6() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM6_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM7() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM7_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM12() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM12_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM13() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM13_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM14() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM14_STOP)) -#define __HAL_DBGMCU_UNFREEZE_RTC() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_RTC_STOP)) -#define __HAL_DBGMCU_UNFREEZE_WWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_WWDG_STOP)) -#define __HAL_DBGMCU_UNFREEZE_IWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_IWDG_STOP)) -#define __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_CAN1() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN1_STOP)) -#define __HAL_DBGMCU_UNFREEZE_CAN2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN2_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM1() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM1_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM8() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM8_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM9() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM9_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM10() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM10_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM11() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM11_STOP)) - -/** @brief Main Flash memory mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FLASH() (SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE)) - -/** @brief System Flash memory mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= SYSCFG_MEMRMP_MEM_MODE_0;\ - }while(0); - -/** @brief Embedded SRAM mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_SRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_0 | SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -/** @brief FSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FSMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** @brief FMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); - -/** @brief FMC/SDRAM Bank 1 and 2 mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_2);\ - }while(0); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup Cortex_Lockup_Enable Cortex Lockup Enable - * @{ - */ -/** @brief SYSCFG Break Lockup lock - * Enables and locks the connection of Cortex-M4 LOCKUP (Hardfault) output to TIM1/8 input - * @note The selected configuration is locked and can be unlocked by system reset - */ -#define __HAL_SYSCFG_BREAK_PVD_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_PVD_LOCK); \ - SYSCFG->CFGR2 |= SYSCFG_CFGR2_PVD_LOCK; \ - }while(0) -/** - * @} - */ - -/** @defgroup PVD_Lock_Enable PVD Lock - * @{ - */ -/** @brief SYSCFG Break PVD lock - * Enables and locks the PVD connection with Timer1/8 Break Input, , as well as the PVDE and PLS[2:0] in the PWR_CR register - * @note The selected configuration is locked and can be unlocked by system reset - */ -#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_LOCKUP_LOCK); \ - SYSCFG->CFGR2 |= SYSCFG_CFGR2_LOCKUP_LOCK; \ - }while(0) -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup HAL_Private_Macros HAL Private Macros - * @{ - */ -#define IS_TICKFREQ(FREQ) (((FREQ) == HAL_TICK_FREQ_10HZ) || \ - ((FREQ) == HAL_TICK_FREQ_100HZ) || \ - ((FREQ) == HAL_TICK_FREQ_1KHZ)) -/** - * @} - */ - -/* Exported variables --------------------------------------------------------*/ - -/** @addtogroup HAL_Exported_Variables - * @{ - */ -extern __IO uint32_t uwTick; -extern uint32_t uwTickPrio; -extern HAL_TickFreqTypeDef uwTickFreq; -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_Exported_Functions - * @{ - */ -/** @addtogroup HAL_Exported_Functions_Group1 - * @{ - */ -/* Initialization and Configuration functions ******************************/ -HAL_StatusTypeDef HAL_Init(void); -HAL_StatusTypeDef HAL_DeInit(void); -void HAL_MspInit(void); -void HAL_MspDeInit(void); -HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority); -/** - * @} - */ - -/** @addtogroup HAL_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions ************************************************/ -void HAL_IncTick(void); -void HAL_Delay(uint32_t Delay); -uint32_t HAL_GetTick(void); -uint32_t HAL_GetTickPrio(void); -HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq); -HAL_TickFreqTypeDef HAL_GetTickFreq(void); -void HAL_SuspendTick(void); -void HAL_ResumeTick(void); -uint32_t HAL_GetHalVersion(void); -uint32_t HAL_GetREVID(void); -uint32_t HAL_GetDEVID(void); -void HAL_DBGMCU_EnableDBGSleepMode(void); -void HAL_DBGMCU_DisableDBGSleepMode(void); -void HAL_DBGMCU_EnableDBGStopMode(void); -void HAL_DBGMCU_DisableDBGStopMode(void); -void HAL_DBGMCU_EnableDBGStandbyMode(void); -void HAL_DBGMCU_DisableDBGStandbyMode(void); -void HAL_EnableCompensationCell(void); -void HAL_DisableCompensationCell(void); -uint32_t HAL_GetUIDw0(void); -uint32_t HAL_GetUIDw1(void); -uint32_t HAL_GetUIDw2(void); -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -void HAL_EnableMemorySwappingBank(void); -void HAL_DisableMemorySwappingBank(void); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup HAL_Private_Variables HAL Private Variables - * @{ - */ -/** - * @} - */ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup HAL_Private_Constants HAL Private Constants - * @{ - */ -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_H */ - - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h deleted file mode 100644 index 7690930..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h +++ /dev/null @@ -1,410 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_cortex.h - * @author MCD Application Team - * @brief Header file of CORTEX HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CORTEX_H -#define __STM32F4xx_HAL_CORTEX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup CORTEX - * @{ - */ -/* Exported types ------------------------------------------------------------*/ -/** @defgroup CORTEX_Exported_Types Cortex Exported Types - * @{ - */ - -#if (__MPU_PRESENT == 1U) -/** @defgroup CORTEX_MPU_Region_Initialization_Structure_definition MPU Region Initialization Structure Definition - * @brief MPU Region initialization structure - * @{ - */ -typedef struct -{ - uint8_t Enable; /*!< Specifies the status of the region. - This parameter can be a value of @ref CORTEX_MPU_Region_Enable */ - uint8_t Number; /*!< Specifies the number of the region to protect. - This parameter can be a value of @ref CORTEX_MPU_Region_Number */ - uint32_t BaseAddress; /*!< Specifies the base address of the region to protect. */ - uint8_t Size; /*!< Specifies the size of the region to protect. - This parameter can be a value of @ref CORTEX_MPU_Region_Size */ - uint8_t SubRegionDisable; /*!< Specifies the number of the subregion protection to disable. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF */ - uint8_t TypeExtField; /*!< Specifies the TEX field level. - This parameter can be a value of @ref CORTEX_MPU_TEX_Levels */ - uint8_t AccessPermission; /*!< Specifies the region access permission type. - This parameter can be a value of @ref CORTEX_MPU_Region_Permission_Attributes */ - uint8_t DisableExec; /*!< Specifies the instruction access status. - This parameter can be a value of @ref CORTEX_MPU_Instruction_Access */ - uint8_t IsShareable; /*!< Specifies the shareability status of the protected region. - This parameter can be a value of @ref CORTEX_MPU_Access_Shareable */ - uint8_t IsCacheable; /*!< Specifies the cacheable status of the region protected. - This parameter can be a value of @ref CORTEX_MPU_Access_Cacheable */ - uint8_t IsBufferable; /*!< Specifies the bufferable status of the protected region. - This parameter can be a value of @ref CORTEX_MPU_Access_Bufferable */ -}MPU_Region_InitTypeDef; -/** - * @} - */ -#endif /* __MPU_PRESENT */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup CORTEX_Exported_Constants CORTEX Exported Constants - * @{ - */ - -/** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group - * @{ - */ -#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority - 4 bits for subpriority */ -#define NVIC_PRIORITYGROUP_1 0x00000006U /*!< 1 bits for pre-emption priority - 3 bits for subpriority */ -#define NVIC_PRIORITYGROUP_2 0x00000005U /*!< 2 bits for pre-emption priority - 2 bits for subpriority */ -#define NVIC_PRIORITYGROUP_3 0x00000004U /*!< 3 bits for pre-emption priority - 1 bits for subpriority */ -#define NVIC_PRIORITYGROUP_4 0x00000003U /*!< 4 bits for pre-emption priority - 0 bits for subpriority */ -/** - * @} - */ - -/** @defgroup CORTEX_SysTick_clock_source CORTEX _SysTick clock source - * @{ - */ -#define SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U -#define SYSTICK_CLKSOURCE_HCLK 0x00000004U - -/** - * @} - */ - -#if (__MPU_PRESENT == 1) -/** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control - * @{ - */ -#define MPU_HFNMI_PRIVDEF_NONE 0x00000000U -#define MPU_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk -#define MPU_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk -#define MPU_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) - -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable - * @{ - */ -#define MPU_REGION_ENABLE ((uint8_t)0x01) -#define MPU_REGION_DISABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access - * @{ - */ -#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00) -#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable - * @{ - */ -#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable - * @{ - */ -#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable - * @{ - */ -#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_TEX_Levels MPU TEX Levels - * @{ - */ -#define MPU_TEX_LEVEL0 ((uint8_t)0x00) -#define MPU_TEX_LEVEL1 ((uint8_t)0x01) -#define MPU_TEX_LEVEL2 ((uint8_t)0x02) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size - * @{ - */ -#define MPU_REGION_SIZE_32B ((uint8_t)0x04) -#define MPU_REGION_SIZE_64B ((uint8_t)0x05) -#define MPU_REGION_SIZE_128B ((uint8_t)0x06) -#define MPU_REGION_SIZE_256B ((uint8_t)0x07) -#define MPU_REGION_SIZE_512B ((uint8_t)0x08) -#define MPU_REGION_SIZE_1KB ((uint8_t)0x09) -#define MPU_REGION_SIZE_2KB ((uint8_t)0x0A) -#define MPU_REGION_SIZE_4KB ((uint8_t)0x0B) -#define MPU_REGION_SIZE_8KB ((uint8_t)0x0C) -#define MPU_REGION_SIZE_16KB ((uint8_t)0x0D) -#define MPU_REGION_SIZE_32KB ((uint8_t)0x0E) -#define MPU_REGION_SIZE_64KB ((uint8_t)0x0F) -#define MPU_REGION_SIZE_128KB ((uint8_t)0x10) -#define MPU_REGION_SIZE_256KB ((uint8_t)0x11) -#define MPU_REGION_SIZE_512KB ((uint8_t)0x12) -#define MPU_REGION_SIZE_1MB ((uint8_t)0x13) -#define MPU_REGION_SIZE_2MB ((uint8_t)0x14) -#define MPU_REGION_SIZE_4MB ((uint8_t)0x15) -#define MPU_REGION_SIZE_8MB ((uint8_t)0x16) -#define MPU_REGION_SIZE_16MB ((uint8_t)0x17) -#define MPU_REGION_SIZE_32MB ((uint8_t)0x18) -#define MPU_REGION_SIZE_64MB ((uint8_t)0x19) -#define MPU_REGION_SIZE_128MB ((uint8_t)0x1A) -#define MPU_REGION_SIZE_256MB ((uint8_t)0x1B) -#define MPU_REGION_SIZE_512MB ((uint8_t)0x1C) -#define MPU_REGION_SIZE_1GB ((uint8_t)0x1D) -#define MPU_REGION_SIZE_2GB ((uint8_t)0x1E) -#define MPU_REGION_SIZE_4GB ((uint8_t)0x1F) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes - * @{ - */ -#define MPU_REGION_NO_ACCESS ((uint8_t)0x00) -#define MPU_REGION_PRIV_RW ((uint8_t)0x01) -#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02) -#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03) -#define MPU_REGION_PRIV_RO ((uint8_t)0x05) -#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number - * @{ - */ -#define MPU_REGION_NUMBER0 ((uint8_t)0x00) -#define MPU_REGION_NUMBER1 ((uint8_t)0x01) -#define MPU_REGION_NUMBER2 ((uint8_t)0x02) -#define MPU_REGION_NUMBER3 ((uint8_t)0x03) -#define MPU_REGION_NUMBER4 ((uint8_t)0x04) -#define MPU_REGION_NUMBER5 ((uint8_t)0x05) -#define MPU_REGION_NUMBER6 ((uint8_t)0x06) -#define MPU_REGION_NUMBER7 ((uint8_t)0x07) -/** - * @} - */ -#endif /* __MPU_PRESENT */ - -/** - * @} - */ - - -/* Exported Macros -----------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup CORTEX_Exported_Functions - * @{ - */ - -/** @addtogroup CORTEX_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); -void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); -void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); -void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); -void HAL_NVIC_SystemReset(void); -uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb); -/** - * @} - */ - -/** @addtogroup CORTEX_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions ***********************************************/ -uint32_t HAL_NVIC_GetPriorityGrouping(void); -void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority); -uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); -void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn); -void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn); -uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn); -void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource); -void HAL_SYSTICK_IRQHandler(void); -void HAL_SYSTICK_Callback(void); - -#if (__MPU_PRESENT == 1U) -void HAL_MPU_Enable(uint32_t MPU_Control); -void HAL_MPU_Disable(void); -void HAL_MPU_EnableRegion(uint32_t RegionNumber); -void HAL_MPU_DisableRegion(uint32_t RegionNumber); -void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init); -#endif /* __MPU_PRESENT */ -void HAL_CORTEX_ClearEvent(void); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup CORTEX_Private_Macros CORTEX Private Macros - * @{ - */ -#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PRIORITYGROUP_0) || \ - ((GROUP) == NVIC_PRIORITYGROUP_1) || \ - ((GROUP) == NVIC_PRIORITYGROUP_2) || \ - ((GROUP) == NVIC_PRIORITYGROUP_3) || \ - ((GROUP) == NVIC_PRIORITYGROUP_4)) - -#define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY) ((PRIORITY) < 0x10U) - -#define IS_NVIC_SUB_PRIORITY(PRIORITY) ((PRIORITY) < 0x10U) - -#define IS_NVIC_DEVICE_IRQ(IRQ) ((IRQ) >= (IRQn_Type)0x00U) - -#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SYSTICK_CLKSOURCE_HCLK) || \ - ((SOURCE) == SYSTICK_CLKSOURCE_HCLK_DIV8)) - -#if (__MPU_PRESENT == 1U) -#define IS_MPU_REGION_ENABLE(STATE) (((STATE) == MPU_REGION_ENABLE) || \ - ((STATE) == MPU_REGION_DISABLE)) - -#define IS_MPU_INSTRUCTION_ACCESS(STATE) (((STATE) == MPU_INSTRUCTION_ACCESS_ENABLE) || \ - ((STATE) == MPU_INSTRUCTION_ACCESS_DISABLE)) - -#define IS_MPU_ACCESS_SHAREABLE(STATE) (((STATE) == MPU_ACCESS_SHAREABLE) || \ - ((STATE) == MPU_ACCESS_NOT_SHAREABLE)) - -#define IS_MPU_ACCESS_CACHEABLE(STATE) (((STATE) == MPU_ACCESS_CACHEABLE) || \ - ((STATE) == MPU_ACCESS_NOT_CACHEABLE)) - -#define IS_MPU_ACCESS_BUFFERABLE(STATE) (((STATE) == MPU_ACCESS_BUFFERABLE) || \ - ((STATE) == MPU_ACCESS_NOT_BUFFERABLE)) - -#define IS_MPU_TEX_LEVEL(TYPE) (((TYPE) == MPU_TEX_LEVEL0) || \ - ((TYPE) == MPU_TEX_LEVEL1) || \ - ((TYPE) == MPU_TEX_LEVEL2)) - -#define IS_MPU_REGION_PERMISSION_ATTRIBUTE(TYPE) (((TYPE) == MPU_REGION_NO_ACCESS) || \ - ((TYPE) == MPU_REGION_PRIV_RW) || \ - ((TYPE) == MPU_REGION_PRIV_RW_URO) || \ - ((TYPE) == MPU_REGION_FULL_ACCESS) || \ - ((TYPE) == MPU_REGION_PRIV_RO) || \ - ((TYPE) == MPU_REGION_PRIV_RO_URO)) - -#define IS_MPU_REGION_NUMBER(NUMBER) (((NUMBER) == MPU_REGION_NUMBER0) || \ - ((NUMBER) == MPU_REGION_NUMBER1) || \ - ((NUMBER) == MPU_REGION_NUMBER2) || \ - ((NUMBER) == MPU_REGION_NUMBER3) || \ - ((NUMBER) == MPU_REGION_NUMBER4) || \ - ((NUMBER) == MPU_REGION_NUMBER5) || \ - ((NUMBER) == MPU_REGION_NUMBER6) || \ - ((NUMBER) == MPU_REGION_NUMBER7)) - -#define IS_MPU_REGION_SIZE(SIZE) (((SIZE) == MPU_REGION_SIZE_32B) || \ - ((SIZE) == MPU_REGION_SIZE_64B) || \ - ((SIZE) == MPU_REGION_SIZE_128B) || \ - ((SIZE) == MPU_REGION_SIZE_256B) || \ - ((SIZE) == MPU_REGION_SIZE_512B) || \ - ((SIZE) == MPU_REGION_SIZE_1KB) || \ - ((SIZE) == MPU_REGION_SIZE_2KB) || \ - ((SIZE) == MPU_REGION_SIZE_4KB) || \ - ((SIZE) == MPU_REGION_SIZE_8KB) || \ - ((SIZE) == MPU_REGION_SIZE_16KB) || \ - ((SIZE) == MPU_REGION_SIZE_32KB) || \ - ((SIZE) == MPU_REGION_SIZE_64KB) || \ - ((SIZE) == MPU_REGION_SIZE_128KB) || \ - ((SIZE) == MPU_REGION_SIZE_256KB) || \ - ((SIZE) == MPU_REGION_SIZE_512KB) || \ - ((SIZE) == MPU_REGION_SIZE_1MB) || \ - ((SIZE) == MPU_REGION_SIZE_2MB) || \ - ((SIZE) == MPU_REGION_SIZE_4MB) || \ - ((SIZE) == MPU_REGION_SIZE_8MB) || \ - ((SIZE) == MPU_REGION_SIZE_16MB) || \ - ((SIZE) == MPU_REGION_SIZE_32MB) || \ - ((SIZE) == MPU_REGION_SIZE_64MB) || \ - ((SIZE) == MPU_REGION_SIZE_128MB) || \ - ((SIZE) == MPU_REGION_SIZE_256MB) || \ - ((SIZE) == MPU_REGION_SIZE_512MB) || \ - ((SIZE) == MPU_REGION_SIZE_1GB) || \ - ((SIZE) == MPU_REGION_SIZE_2GB) || \ - ((SIZE) == MPU_REGION_SIZE_4GB)) - -#define IS_MPU_SUB_REGION_DISABLE(SUBREGION) ((SUBREGION) < (uint16_t)0x00FF) -#endif /* __MPU_PRESENT */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_CORTEX_H */ - - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_crc.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_crc.h deleted file mode 100644 index ac36ed8..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_crc.h +++ /dev/null @@ -1,181 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_crc.h - * @author MCD Application Team - * @brief Header file of CRC HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_CRC_H -#define STM32F4xx_HAL_CRC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup CRC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup CRC_Exported_Types CRC Exported Types - * @{ - */ - -/** - * @brief CRC HAL State Structure definition - */ -typedef enum -{ - HAL_CRC_STATE_RESET = 0x00U, /*!< CRC not yet initialized or disabled */ - HAL_CRC_STATE_READY = 0x01U, /*!< CRC initialized and ready for use */ - HAL_CRC_STATE_BUSY = 0x02U, /*!< CRC internal process is ongoing */ - HAL_CRC_STATE_TIMEOUT = 0x03U, /*!< CRC timeout state */ - HAL_CRC_STATE_ERROR = 0x04U /*!< CRC error state */ -} HAL_CRC_StateTypeDef; - - -/** - * @brief CRC Handle Structure definition - */ -typedef struct -{ - CRC_TypeDef *Instance; /*!< Register base address */ - - HAL_LockTypeDef Lock; /*!< CRC Locking object */ - - __IO HAL_CRC_StateTypeDef State; /*!< CRC communication state */ - -} CRC_HandleTypeDef; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup CRC_Exported_Constants CRC Exported Constants - * @{ - */ - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup CRC_Exported_Macros CRC Exported Macros - * @{ - */ - -/** @brief Reset CRC handle state. - * @param __HANDLE__ CRC handle. - * @retval None - */ -#define __HAL_CRC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_CRC_STATE_RESET) - -/** - * @brief Reset CRC Data Register. - * @param __HANDLE__ CRC handle - * @retval None - */ -#define __HAL_CRC_DR_RESET(__HANDLE__) ((__HANDLE__)->Instance->CR |= CRC_CR_RESET) - -/** - * @brief Store data in the Independent Data (ID) register. - * @param __HANDLE__ CRC handle - * @param __VALUE__ Value to be stored in the ID register - * @note Refer to the Reference Manual to get the authorized __VALUE__ length in bits - * @retval None - */ -#define __HAL_CRC_SET_IDR(__HANDLE__, __VALUE__) (WRITE_REG((__HANDLE__)->Instance->IDR, (__VALUE__))) - -/** - * @brief Return the data stored in the Independent Data (ID) register. - * @param __HANDLE__ CRC handle - * @note Refer to the Reference Manual to get the authorized __VALUE__ length in bits - * @retval Value of the ID register - */ -#define __HAL_CRC_GET_IDR(__HANDLE__) (((__HANDLE__)->Instance->IDR) & CRC_IDR_IDR) -/** - * @} - */ - - -/* Private macros --------------------------------------------------------*/ -/** @defgroup CRC_Private_Macros CRC Private Macros - * @{ - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup CRC_Exported_Functions CRC Exported Functions - * @{ - */ - -/* Initialization and de-initialization functions ****************************/ -/** @defgroup CRC_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -HAL_StatusTypeDef HAL_CRC_Init(CRC_HandleTypeDef *hcrc); -HAL_StatusTypeDef HAL_CRC_DeInit(CRC_HandleTypeDef *hcrc); -void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc); -void HAL_CRC_MspDeInit(CRC_HandleTypeDef *hcrc); -/** - * @} - */ - -/* Peripheral Control functions ***********************************************/ -/** @defgroup CRC_Exported_Functions_Group2 Peripheral Control functions - * @{ - */ -uint32_t HAL_CRC_Accumulate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength); -uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength); -/** - * @} - */ - -/* Peripheral State and Error functions ***************************************/ -/** @defgroup CRC_Exported_Functions_Group3 Peripheral State functions - * @{ - */ -HAL_CRC_StateTypeDef HAL_CRC_GetState(const CRC_HandleTypeDef *hcrc); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_CRC_H */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h deleted file mode 100644 index 1df0d7d..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h +++ /dev/null @@ -1,212 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_def.h - * @author MCD Application Team - * @brief This file contains HAL common defines, enumeration, macros and - * structures definitions. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DEF -#define __STM32F4xx_HAL_DEF - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" -#include "Legacy/stm32_hal_legacy.h" -#include - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief HAL Status structures definition - */ -typedef enum -{ - HAL_OK = 0x00U, - HAL_ERROR = 0x01U, - HAL_BUSY = 0x02U, - HAL_TIMEOUT = 0x03U -} HAL_StatusTypeDef; - -/** - * @brief HAL Lock structures definition - */ -typedef enum -{ - HAL_UNLOCKED = 0x00U, - HAL_LOCKED = 0x01U -} HAL_LockTypeDef; - -/* Exported macro ------------------------------------------------------------*/ - -#if !defined(UNUSED) -#define UNUSED(X) (void)X /* To avoid gcc/g++ warnings */ -#endif /* UNUSED */ - -#define HAL_MAX_DELAY 0xFFFFFFFFU - -#define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) == (BIT)) -#define HAL_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == 0U) - -#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ - do{ \ - (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \ - (__DMA_HANDLE__).Parent = (__HANDLE__); \ - } while(0U) - -/** @brief Reset the Handle's State field. - * @param __HANDLE__ specifies the Peripheral Handle. - * @note This macro can be used for the following purpose: - * - When the Handle is declared as local variable; before passing it as parameter - * to HAL_PPP_Init() for the first time, it is mandatory to use this macro - * to set to 0 the Handle's "State" field. - * Otherwise, "State" field may have any random value and the first time the function - * HAL_PPP_Init() is called, the low level hardware initialization will be missed - * (i.e. HAL_PPP_MspInit() will not be executed). - * - When there is a need to reconfigure the low level hardware: instead of calling - * HAL_PPP_DeInit() then HAL_PPP_Init(), user can make a call to this macro then HAL_PPP_Init(). - * In this later function, when the Handle's "State" field is set to 0, it will execute the function - * HAL_PPP_MspInit() which will reconfigure the low level hardware. - * @retval None - */ -#define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0U) - -#if (USE_RTOS == 1U) - /* Reserved for future use */ - #error "USE_RTOS should be 0 in the current HAL release" -#else - #define __HAL_LOCK(__HANDLE__) \ - do{ \ - if((__HANDLE__)->Lock == HAL_LOCKED) \ - { \ - return HAL_BUSY; \ - } \ - else \ - { \ - (__HANDLE__)->Lock = HAL_LOCKED; \ - } \ - }while (0U) - - #define __HAL_UNLOCK(__HANDLE__) \ - do{ \ - (__HANDLE__)->Lock = HAL_UNLOCKED; \ - }while (0U) -#endif /* USE_RTOS */ - -#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */ - #ifndef __weak - #define __weak __attribute__((weak)) - #endif - #ifndef __packed - #define __packed __attribute__((packed)) - #endif -#elif defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ - #ifndef __weak - #define __weak __attribute__((weak)) - #endif /* __weak */ - #ifndef __packed - #define __packed __attribute__((__packed__)) - #endif /* __packed */ -#endif /* __GNUC__ */ - - -/* Macro to get variable aligned on 4-bytes, for __ICCARM__ the directive "#pragma data_alignment=4" must be used instead */ -#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */ - #ifndef __ALIGN_BEGIN - #define __ALIGN_BEGIN - #endif - #ifndef __ALIGN_END - #define __ALIGN_END __attribute__ ((aligned (4))) - #endif -#elif defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ - #ifndef __ALIGN_END -#define __ALIGN_END __attribute__ ((aligned (4))) - #endif /* __ALIGN_END */ - #ifndef __ALIGN_BEGIN - #define __ALIGN_BEGIN - #endif /* __ALIGN_BEGIN */ -#else - #ifndef __ALIGN_END - #define __ALIGN_END - #endif /* __ALIGN_END */ - #ifndef __ALIGN_BEGIN - #if defined (__CC_ARM) /* ARM Compiler V5*/ -#define __ALIGN_BEGIN __align(4) - #elif defined (__ICCARM__) /* IAR Compiler */ - #define __ALIGN_BEGIN - #endif /* __CC_ARM */ - #endif /* __ALIGN_BEGIN */ -#endif /* __GNUC__ */ - - -/** - * @brief __RAM_FUNC definition - */ -#if defined ( __CC_ARM ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) -/* ARM Compiler V4/V5 and V6 - -------------------------- - RAM functions are defined using the toolchain options. - Functions that are executed in RAM should reside in a separate source module. - Using the 'Options for File' dialog you can simply change the 'Code / Const' - area of a module to a memory space in physical RAM. - Available memory areas are declared in the 'Target' tab of the 'Options for Target' - dialog. -*/ -#define __RAM_FUNC - -#elif defined ( __ICCARM__ ) -/* ICCARM Compiler - --------------- - RAM functions are defined using a specific toolchain keyword "__ramfunc". -*/ -#define __RAM_FUNC __ramfunc - -#elif defined ( __GNUC__ ) -/* GNU Compiler - ------------ - RAM functions are defined using a specific toolchain attribute - "__attribute__((section(".RamFunc")))". -*/ -#define __RAM_FUNC __attribute__((section(".RamFunc"))) - -#endif - -/** - * @brief __NOINLINE definition - */ -#if defined ( __CC_ARM ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) || defined ( __GNUC__ ) -/* ARM V4/V5 and V6 & GNU Compiler - ------------------------------- -*/ -#define __NOINLINE __attribute__ ( (noinline) ) - -#elif defined ( __ICCARM__ ) -/* ICCARM Compiler - --------------- -*/ -#define __NOINLINE _Pragma("optimize = no_inline") - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* ___STM32F4xx_HAL_DEF */ - - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h deleted file mode 100644 index 7ff3836..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h +++ /dev/null @@ -1,802 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma.h - * @author MCD Application Team - * @brief Header file of DMA HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DMA_H -#define __STM32F4xx_HAL_DMA_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup DMA - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Types DMA Exported Types - * @brief DMA Exported Types - * @{ - */ - -/** - * @brief DMA Configuration Structure definition - */ -typedef struct -{ - uint32_t Channel; /*!< Specifies the channel used for the specified stream. - This parameter can be a value of @ref DMA_Channel_selection */ - - uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, - from memory to memory or from peripheral to memory. - This parameter can be a value of @ref DMA_Data_transfer_direction */ - - uint32_t PeriphInc; /*!< Specifies whether the Peripheral address register should be incremented or not. - This parameter can be a value of @ref DMA_Peripheral_incremented_mode */ - - uint32_t MemInc; /*!< Specifies whether the memory address register should be incremented or not. - This parameter can be a value of @ref DMA_Memory_incremented_mode */ - - uint32_t PeriphDataAlignment; /*!< Specifies the Peripheral data width. - This parameter can be a value of @ref DMA_Peripheral_data_size */ - - uint32_t MemDataAlignment; /*!< Specifies the Memory data width. - This parameter can be a value of @ref DMA_Memory_data_size */ - - uint32_t Mode; /*!< Specifies the operation mode of the DMAy Streamx. - This parameter can be a value of @ref DMA_mode - @note The circular buffer mode cannot be used if the memory-to-memory - data transfer is configured on the selected Stream */ - - uint32_t Priority; /*!< Specifies the software priority for the DMAy Streamx. - This parameter can be a value of @ref DMA_Priority_level */ - - uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. - This parameter can be a value of @ref DMA_FIFO_direct_mode - @note The Direct mode (FIFO mode disabled) cannot be used if the - memory-to-memory data transfer is configured on the selected stream */ - - uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. - This parameter can be a value of @ref DMA_FIFO_threshold_level */ - - uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_Memory_burst - @note The burst mode is possible only if the address Increment mode is enabled. */ - - uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_Peripheral_burst - @note The burst mode is possible only if the address Increment mode is enabled. */ -}DMA_InitTypeDef; - - -/** - * @brief HAL DMA State structures definition - */ -typedef enum -{ - HAL_DMA_STATE_RESET = 0x00U, /*!< DMA not yet initialized or disabled */ - HAL_DMA_STATE_READY = 0x01U, /*!< DMA initialized and ready for use */ - HAL_DMA_STATE_BUSY = 0x02U, /*!< DMA process is ongoing */ - HAL_DMA_STATE_TIMEOUT = 0x03U, /*!< DMA timeout state */ - HAL_DMA_STATE_ERROR = 0x04U, /*!< DMA error state */ - HAL_DMA_STATE_ABORT = 0x05U, /*!< DMA Abort state */ -}HAL_DMA_StateTypeDef; - -/** - * @brief HAL DMA Error Code structure definition - */ -typedef enum -{ - HAL_DMA_FULL_TRANSFER = 0x00U, /*!< Full transfer */ - HAL_DMA_HALF_TRANSFER = 0x01U /*!< Half Transfer */ -}HAL_DMA_LevelCompleteTypeDef; - -/** - * @brief HAL DMA Error Code structure definition - */ -typedef enum -{ - HAL_DMA_XFER_CPLT_CB_ID = 0x00U, /*!< Full transfer */ - HAL_DMA_XFER_HALFCPLT_CB_ID = 0x01U, /*!< Half Transfer */ - HAL_DMA_XFER_M1CPLT_CB_ID = 0x02U, /*!< M1 Full Transfer */ - HAL_DMA_XFER_M1HALFCPLT_CB_ID = 0x03U, /*!< M1 Half Transfer */ - HAL_DMA_XFER_ERROR_CB_ID = 0x04U, /*!< Error */ - HAL_DMA_XFER_ABORT_CB_ID = 0x05U, /*!< Abort */ - HAL_DMA_XFER_ALL_CB_ID = 0x06U /*!< All */ -}HAL_DMA_CallbackIDTypeDef; - -/** - * @brief DMA handle Structure definition - */ -typedef struct __DMA_HandleTypeDef -{ - DMA_Stream_TypeDef *Instance; /*!< Register base address */ - - DMA_InitTypeDef Init; /*!< DMA communication parameters */ - - HAL_LockTypeDef Lock; /*!< DMA locking object */ - - __IO HAL_DMA_StateTypeDef State; /*!< DMA transfer state */ - - void *Parent; /*!< Parent object state */ - - void (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete callback */ - - void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA Half transfer complete callback */ - - void (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete Memory1 callback */ - - void (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Half complete Memory1 callback */ - - void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer error callback */ - - void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Abort callback */ - - __IO uint32_t ErrorCode; /*!< DMA Error code */ - - uint32_t StreamBaseAddress; /*!< DMA Stream Base Address */ - - uint32_t StreamIndex; /*!< DMA Stream Index */ - -}DMA_HandleTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Constants DMA Exported Constants - * @brief DMA Exported constants - * @{ - */ - -/** @defgroup DMA_Error_Code DMA Error Code - * @brief DMA Error Code - * @{ - */ -#define HAL_DMA_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_DMA_ERROR_TE 0x00000001U /*!< Transfer error */ -#define HAL_DMA_ERROR_FE 0x00000002U /*!< FIFO error */ -#define HAL_DMA_ERROR_DME 0x00000004U /*!< Direct Mode error */ -#define HAL_DMA_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ -#define HAL_DMA_ERROR_PARAM 0x00000040U /*!< Parameter error */ -#define HAL_DMA_ERROR_NO_XFER 0x00000080U /*!< Abort requested with no Xfer ongoing */ -#define HAL_DMA_ERROR_NOT_SUPPORTED 0x00000100U /*!< Not supported mode */ -/** - * @} - */ - -/** @defgroup DMA_Channel_selection DMA Channel selection - * @brief DMA channel selection - * @{ - */ -#define DMA_CHANNEL_0 0x00000000U /*!< DMA Channel 0 */ -#define DMA_CHANNEL_1 0x02000000U /*!< DMA Channel 1 */ -#define DMA_CHANNEL_2 0x04000000U /*!< DMA Channel 2 */ -#define DMA_CHANNEL_3 0x06000000U /*!< DMA Channel 3 */ -#define DMA_CHANNEL_4 0x08000000U /*!< DMA Channel 4 */ -#define DMA_CHANNEL_5 0x0A000000U /*!< DMA Channel 5 */ -#define DMA_CHANNEL_6 0x0C000000U /*!< DMA Channel 6 */ -#define DMA_CHANNEL_7 0x0E000000U /*!< DMA Channel 7 */ -#if defined (DMA_SxCR_CHSEL_3) -#define DMA_CHANNEL_8 0x10000000U /*!< DMA Channel 8 */ -#define DMA_CHANNEL_9 0x12000000U /*!< DMA Channel 9 */ -#define DMA_CHANNEL_10 0x14000000U /*!< DMA Channel 10 */ -#define DMA_CHANNEL_11 0x16000000U /*!< DMA Channel 11 */ -#define DMA_CHANNEL_12 0x18000000U /*!< DMA Channel 12 */ -#define DMA_CHANNEL_13 0x1A000000U /*!< DMA Channel 13 */ -#define DMA_CHANNEL_14 0x1C000000U /*!< DMA Channel 14 */ -#define DMA_CHANNEL_15 0x1E000000U /*!< DMA Channel 15 */ -#endif /* DMA_SxCR_CHSEL_3 */ -/** - * @} - */ - -/** @defgroup DMA_Data_transfer_direction DMA Data transfer direction - * @brief DMA data transfer direction - * @{ - */ -#define DMA_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ -#define DMA_MEMORY_TO_PERIPH ((uint32_t)DMA_SxCR_DIR_0) /*!< Memory to peripheral direction */ -#define DMA_MEMORY_TO_MEMORY ((uint32_t)DMA_SxCR_DIR_1) /*!< Memory to memory direction */ -/** - * @} - */ - -/** @defgroup DMA_Peripheral_incremented_mode DMA Peripheral incremented mode - * @brief DMA peripheral incremented mode - * @{ - */ -#define DMA_PINC_ENABLE ((uint32_t)DMA_SxCR_PINC) /*!< Peripheral increment mode enable */ -#define DMA_PINC_DISABLE 0x00000000U /*!< Peripheral increment mode disable */ -/** - * @} - */ - -/** @defgroup DMA_Memory_incremented_mode DMA Memory incremented mode - * @brief DMA memory incremented mode - * @{ - */ -#define DMA_MINC_ENABLE ((uint32_t)DMA_SxCR_MINC) /*!< Memory increment mode enable */ -#define DMA_MINC_DISABLE 0x00000000U /*!< Memory increment mode disable */ -/** - * @} - */ - -/** @defgroup DMA_Peripheral_data_size DMA Peripheral data size - * @brief DMA peripheral data size - * @{ - */ -#define DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment: Byte */ -#define DMA_PDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_PSIZE_0) /*!< Peripheral data alignment: HalfWord */ -#define DMA_PDATAALIGN_WORD ((uint32_t)DMA_SxCR_PSIZE_1) /*!< Peripheral data alignment: Word */ -/** - * @} - */ - -/** @defgroup DMA_Memory_data_size DMA Memory data size - * @brief DMA memory data size - * @{ - */ -#define DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment: Byte */ -#define DMA_MDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_MSIZE_0) /*!< Memory data alignment: HalfWord */ -#define DMA_MDATAALIGN_WORD ((uint32_t)DMA_SxCR_MSIZE_1) /*!< Memory data alignment: Word */ -/** - * @} - */ - -/** @defgroup DMA_mode DMA mode - * @brief DMA mode - * @{ - */ -#define DMA_NORMAL 0x00000000U /*!< Normal mode */ -#define DMA_CIRCULAR ((uint32_t)DMA_SxCR_CIRC) /*!< Circular mode */ -#define DMA_PFCTRL ((uint32_t)DMA_SxCR_PFCTRL) /*!< Peripheral flow control mode */ -/** - * @} - */ - -/** @defgroup DMA_Priority_level DMA Priority level - * @brief DMA priority levels - * @{ - */ -#define DMA_PRIORITY_LOW 0x00000000U /*!< Priority level: Low */ -#define DMA_PRIORITY_MEDIUM ((uint32_t)DMA_SxCR_PL_0) /*!< Priority level: Medium */ -#define DMA_PRIORITY_HIGH ((uint32_t)DMA_SxCR_PL_1) /*!< Priority level: High */ -#define DMA_PRIORITY_VERY_HIGH ((uint32_t)DMA_SxCR_PL) /*!< Priority level: Very High */ -/** - * @} - */ - -/** @defgroup DMA_FIFO_direct_mode DMA FIFO direct mode - * @brief DMA FIFO direct mode - * @{ - */ -#define DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */ -#define DMA_FIFOMODE_ENABLE ((uint32_t)DMA_SxFCR_DMDIS) /*!< FIFO mode enable */ -/** - * @} - */ - -/** @defgroup DMA_FIFO_threshold_level DMA FIFO threshold level - * @brief DMA FIFO level - * @{ - */ -#define DMA_FIFO_THRESHOLD_1QUARTERFULL 0x00000000U /*!< FIFO threshold 1 quart full configuration */ -#define DMA_FIFO_THRESHOLD_HALFFULL ((uint32_t)DMA_SxFCR_FTH_0) /*!< FIFO threshold half full configuration */ -#define DMA_FIFO_THRESHOLD_3QUARTERSFULL ((uint32_t)DMA_SxFCR_FTH_1) /*!< FIFO threshold 3 quarts full configuration */ -#define DMA_FIFO_THRESHOLD_FULL ((uint32_t)DMA_SxFCR_FTH) /*!< FIFO threshold full configuration */ -/** - * @} - */ - -/** @defgroup DMA_Memory_burst DMA Memory burst - * @brief DMA memory burst - * @{ - */ -#define DMA_MBURST_SINGLE 0x00000000U -#define DMA_MBURST_INC4 ((uint32_t)DMA_SxCR_MBURST_0) -#define DMA_MBURST_INC8 ((uint32_t)DMA_SxCR_MBURST_1) -#define DMA_MBURST_INC16 ((uint32_t)DMA_SxCR_MBURST) -/** - * @} - */ - -/** @defgroup DMA_Peripheral_burst DMA Peripheral burst - * @brief DMA peripheral burst - * @{ - */ -#define DMA_PBURST_SINGLE 0x00000000U -#define DMA_PBURST_INC4 ((uint32_t)DMA_SxCR_PBURST_0) -#define DMA_PBURST_INC8 ((uint32_t)DMA_SxCR_PBURST_1) -#define DMA_PBURST_INC16 ((uint32_t)DMA_SxCR_PBURST) -/** - * @} - */ - -/** @defgroup DMA_interrupt_enable_definitions DMA interrupt enable definitions - * @brief DMA interrupts definition - * @{ - */ -#define DMA_IT_TC ((uint32_t)DMA_SxCR_TCIE) -#define DMA_IT_HT ((uint32_t)DMA_SxCR_HTIE) -#define DMA_IT_TE ((uint32_t)DMA_SxCR_TEIE) -#define DMA_IT_DME ((uint32_t)DMA_SxCR_DMEIE) -#define DMA_IT_FE 0x00000080U -/** - * @} - */ - -/** @defgroup DMA_flag_definitions DMA flag definitions - * @brief DMA flag definitions - * @{ - */ -#define DMA_FLAG_FEIF0_4 0x00000001U -#define DMA_FLAG_DMEIF0_4 0x00000004U -#define DMA_FLAG_TEIF0_4 0x00000008U -#define DMA_FLAG_HTIF0_4 0x00000010U -#define DMA_FLAG_TCIF0_4 0x00000020U -#define DMA_FLAG_FEIF1_5 0x00000040U -#define DMA_FLAG_DMEIF1_5 0x00000100U -#define DMA_FLAG_TEIF1_5 0x00000200U -#define DMA_FLAG_HTIF1_5 0x00000400U -#define DMA_FLAG_TCIF1_5 0x00000800U -#define DMA_FLAG_FEIF2_6 0x00010000U -#define DMA_FLAG_DMEIF2_6 0x00040000U -#define DMA_FLAG_TEIF2_6 0x00080000U -#define DMA_FLAG_HTIF2_6 0x00100000U -#define DMA_FLAG_TCIF2_6 0x00200000U -#define DMA_FLAG_FEIF3_7 0x00400000U -#define DMA_FLAG_DMEIF3_7 0x01000000U -#define DMA_FLAG_TEIF3_7 0x02000000U -#define DMA_FLAG_HTIF3_7 0x04000000U -#define DMA_FLAG_TCIF3_7 0x08000000U -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ - -/** @brief Reset DMA handle state - * @param __HANDLE__ specifies the DMA handle. - * @retval None - */ -#define __HAL_DMA_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DMA_STATE_RESET) - -/** - * @brief Return the current DMA Stream FIFO filled level. - * @param __HANDLE__ DMA handle - * @retval The FIFO filling state. - * - DMA_FIFOStatus_Less1QuarterFull: when FIFO is less than 1 quarter-full - * and not empty. - * - DMA_FIFOStatus_1QuarterFull: if more than 1 quarter-full. - * - DMA_FIFOStatus_HalfFull: if more than 1 half-full. - * - DMA_FIFOStatus_3QuartersFull: if more than 3 quarters-full. - * - DMA_FIFOStatus_Empty: when FIFO is empty - * - DMA_FIFOStatus_Full: when FIFO is full - */ -#define __HAL_DMA_GET_FS(__HANDLE__) (((__HANDLE__)->Instance->FCR & (DMA_SxFCR_FS))) - -/** - * @brief Enable the specified DMA Stream. - * @param __HANDLE__ DMA handle - * @retval None - */ -#define __HAL_DMA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DMA_SxCR_EN) - -/** - * @brief Disable the specified DMA Stream. - * @param __HANDLE__ DMA handle - * @retval None - */ -#define __HAL_DMA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~DMA_SxCR_EN) - -/* Interrupt & Flag management */ - -/** - * @brief Return the current DMA Stream transfer complete flag. - * @param __HANDLE__ DMA handle - * @retval The specified transfer complete flag index. - */ -#define __HAL_DMA_GET_TC_FLAG_INDEX(__HANDLE__) \ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TCIF2_6 :\ - DMA_FLAG_TCIF3_7) - -/** - * @brief Return the current DMA Stream half transfer complete flag. - * @param __HANDLE__ DMA handle - * @retval The specified half transfer complete flag index. - */ -#define __HAL_DMA_GET_HT_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_HTIF2_6 :\ - DMA_FLAG_HTIF3_7) - -/** - * @brief Return the current DMA Stream transfer error flag. - * @param __HANDLE__ DMA handle - * @retval The specified transfer error flag index. - */ -#define __HAL_DMA_GET_TE_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TEIF2_6 :\ - DMA_FLAG_TEIF3_7) - -/** - * @brief Return the current DMA Stream FIFO error flag. - * @param __HANDLE__ DMA handle - * @retval The specified FIFO error flag index. - */ -#define __HAL_DMA_GET_FE_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_FEIF2_6 :\ - DMA_FLAG_FEIF3_7) - -/** - * @brief Return the current DMA Stream direct mode error flag. - * @param __HANDLE__ DMA handle - * @retval The specified direct mode error flag index. - */ -#define __HAL_DMA_GET_DME_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_DMEIF2_6 :\ - DMA_FLAG_DMEIF3_7) - -/** - * @brief Get the DMA Stream pending flags. - * @param __HANDLE__ DMA handle - * @param __FLAG__ Get the specified flag. - * This parameter can be any combination of the following values: - * @arg DMA_FLAG_TCIFx: Transfer complete flag. - * @arg DMA_FLAG_HTIFx: Half transfer complete flag. - * @arg DMA_FLAG_TEIFx: Transfer error flag. - * @arg DMA_FLAG_DMEIFx: Direct mode error flag. - * @arg DMA_FLAG_FEIFx: FIFO error flag. - * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. - * @retval The state of FLAG (SET or RESET). - */ -#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)\ -(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HISR & (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LISR & (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HISR & (__FLAG__)) : (DMA1->LISR & (__FLAG__))) - -/** - * @brief Clear the DMA Stream pending flags. - * @param __HANDLE__ DMA handle - * @param __FLAG__ specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg DMA_FLAG_TCIFx: Transfer complete flag. - * @arg DMA_FLAG_HTIFx: Half transfer complete flag. - * @arg DMA_FLAG_TEIFx: Transfer error flag. - * @arg DMA_FLAG_DMEIFx: Direct mode error flag. - * @arg DMA_FLAG_FEIFx: FIFO error flag. - * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. - * @retval None - */ -#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) \ -(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HIFCR = (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LIFCR = (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HIFCR = (__FLAG__)) : (DMA1->LIFCR = (__FLAG__))) - -/** - * @brief Enable the specified DMA Stream interrupts. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval None - */ -#define __HAL_DMA_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ -((__HANDLE__)->Instance->CR |= (__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR |= (__INTERRUPT__))) - -/** - * @brief Disable the specified DMA Stream interrupts. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval None - */ -#define __HAL_DMA_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ -((__HANDLE__)->Instance->CR &= ~(__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR &= ~(__INTERRUPT__))) - -/** - * @brief Check whether the specified DMA Stream interrupt is enabled or disabled. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt source to check. - * This parameter can be one of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval The state of DMA_IT. - */ -#define __HAL_DMA_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ - ((__HANDLE__)->Instance->CR & (__INTERRUPT__)) : \ - ((__HANDLE__)->Instance->FCR & (__INTERRUPT__))) - -/** - * @brief Writes the number of data units to be transferred on the DMA Stream. - * @param __HANDLE__ DMA handle - * @param __COUNTER__ Number of data units to be transferred (from 0 to 65535) - * Number of data items depends only on the Peripheral data format. - * - * @note If Peripheral data format is Bytes: number of data units is equal - * to total number of bytes to be transferred. - * - * @note If Peripheral data format is Half-Word: number of data units is - * equal to total number of bytes to be transferred / 2. - * - * @note If Peripheral data format is Word: number of data units is equal - * to total number of bytes to be transferred / 4. - * - * @retval The number of remaining data units in the current DMAy Streamx transfer. - */ -#define __HAL_DMA_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->NDTR = (uint16_t)(__COUNTER__)) - -/** - * @brief Returns the number of remaining data units in the current DMAy Streamx transfer. - * @param __HANDLE__ DMA handle - * - * @retval The number of remaining data units in the current DMA Stream transfer. - */ -#define __HAL_DMA_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->NDTR) - - -/* Include DMA HAL Extension module */ -#include "stm32f4xx_hal_dma_ex.h" - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Functions DMA Exported Functions - * @brief DMA Exported functions - * @{ - */ - -/** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * @{ - */ -HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma); -/** - * @} - */ - -/** @defgroup DMA_Exported_Functions_Group2 I/O operation functions - * @brief I/O operation functions - * @{ - */ -HAL_StatusTypeDef HAL_DMA_Start (DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout); -void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_CleanCallbacks(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)); -HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID); - -/** - * @} - */ - -/** @defgroup DMA_Exported_Functions_Group3 Peripheral State functions - * @brief Peripheral State functions - * @{ - */ -HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma); -uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma); -/** - * @} - */ -/** - * @} - */ -/* Private Constants -------------------------------------------------------------*/ -/** @defgroup DMA_Private_Constants DMA Private Constants - * @brief DMA private defines and constants - * @{ - */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup DMA_Private_Macros DMA Private Macros - * @brief DMA private macros - * @{ - */ -#if defined (DMA_SxCR_CHSEL_3) -#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ - ((CHANNEL) == DMA_CHANNEL_1) || \ - ((CHANNEL) == DMA_CHANNEL_2) || \ - ((CHANNEL) == DMA_CHANNEL_3) || \ - ((CHANNEL) == DMA_CHANNEL_4) || \ - ((CHANNEL) == DMA_CHANNEL_5) || \ - ((CHANNEL) == DMA_CHANNEL_6) || \ - ((CHANNEL) == DMA_CHANNEL_7) || \ - ((CHANNEL) == DMA_CHANNEL_8) || \ - ((CHANNEL) == DMA_CHANNEL_9) || \ - ((CHANNEL) == DMA_CHANNEL_10)|| \ - ((CHANNEL) == DMA_CHANNEL_11)|| \ - ((CHANNEL) == DMA_CHANNEL_12)|| \ - ((CHANNEL) == DMA_CHANNEL_13)|| \ - ((CHANNEL) == DMA_CHANNEL_14)|| \ - ((CHANNEL) == DMA_CHANNEL_15)) -#else -#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ - ((CHANNEL) == DMA_CHANNEL_1) || \ - ((CHANNEL) == DMA_CHANNEL_2) || \ - ((CHANNEL) == DMA_CHANNEL_3) || \ - ((CHANNEL) == DMA_CHANNEL_4) || \ - ((CHANNEL) == DMA_CHANNEL_5) || \ - ((CHANNEL) == DMA_CHANNEL_6) || \ - ((CHANNEL) == DMA_CHANNEL_7)) -#endif /* DMA_SxCR_CHSEL_3 */ - -#define IS_DMA_DIRECTION(DIRECTION) (((DIRECTION) == DMA_PERIPH_TO_MEMORY ) || \ - ((DIRECTION) == DMA_MEMORY_TO_PERIPH) || \ - ((DIRECTION) == DMA_MEMORY_TO_MEMORY)) - -#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x01U) && ((SIZE) < 0x10000U)) - -#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PINC_ENABLE) || \ - ((STATE) == DMA_PINC_DISABLE)) - -#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MINC_ENABLE) || \ - ((STATE) == DMA_MINC_DISABLE)) - -#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PDATAALIGN_BYTE) || \ - ((SIZE) == DMA_PDATAALIGN_HALFWORD) || \ - ((SIZE) == DMA_PDATAALIGN_WORD)) - -#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MDATAALIGN_BYTE) || \ - ((SIZE) == DMA_MDATAALIGN_HALFWORD) || \ - ((SIZE) == DMA_MDATAALIGN_WORD )) - -#define IS_DMA_MODE(MODE) (((MODE) == DMA_NORMAL ) || \ - ((MODE) == DMA_CIRCULAR) || \ - ((MODE) == DMA_PFCTRL)) - -#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_PRIORITY_LOW ) || \ - ((PRIORITY) == DMA_PRIORITY_MEDIUM) || \ - ((PRIORITY) == DMA_PRIORITY_HIGH) || \ - ((PRIORITY) == DMA_PRIORITY_VERY_HIGH)) - -#define IS_DMA_FIFO_MODE_STATE(STATE) (((STATE) == DMA_FIFOMODE_DISABLE ) || \ - ((STATE) == DMA_FIFOMODE_ENABLE)) - -#define IS_DMA_FIFO_THRESHOLD(THRESHOLD) (((THRESHOLD) == DMA_FIFO_THRESHOLD_1QUARTERFULL ) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_HALFFULL) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_3QUARTERSFULL) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_FULL)) - -#define IS_DMA_MEMORY_BURST(BURST) (((BURST) == DMA_MBURST_SINGLE) || \ - ((BURST) == DMA_MBURST_INC4) || \ - ((BURST) == DMA_MBURST_INC8) || \ - ((BURST) == DMA_MBURST_INC16)) - -#define IS_DMA_PERIPHERAL_BURST(BURST) (((BURST) == DMA_PBURST_SINGLE) || \ - ((BURST) == DMA_PBURST_INC4) || \ - ((BURST) == DMA_PBURST_INC8) || \ - ((BURST) == DMA_PBURST_INC16)) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DMA_Private_Functions DMA Private Functions - * @brief DMA private functions - * @{ - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_DMA_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h deleted file mode 100644 index 9858c74..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma_ex.h - * @author MCD Application Team - * @brief Header file of DMA HAL extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DMA_EX_H -#define __STM32F4xx_HAL_DMA_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup DMAEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup DMAEx_Exported_Types DMAEx Exported Types - * @brief DMAEx Exported types - * @{ - */ - -/** - * @brief HAL DMA Memory definition - */ -typedef enum -{ - MEMORY0 = 0x00U, /*!< Memory 0 */ - MEMORY1 = 0x01U /*!< Memory 1 */ -}HAL_DMA_MemoryTypeDef; - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup DMAEx_Exported_Functions DMAEx Exported Functions - * @brief DMAEx Exported functions - * @{ - */ - -/** @defgroup DMAEx_Exported_Functions_Group1 Extended features functions - * @brief Extended features functions - * @{ - */ - -/* IO operation functions *******************************************************/ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory); - -/** - * @} - */ -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DMAEx_Private_Functions DMAEx Private Functions - * @brief DMAEx Private functions - * @{ - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_HAL_DMA_EX_H*/ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h deleted file mode 100644 index b18a228..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h +++ /dev/null @@ -1,366 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_exti.h - * @author MCD Application Team - * @brief Header file of EXTI HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2018 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS.Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32f4xx_HAL_EXTI_H -#define STM32f4xx_HAL_EXTI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup EXTI EXTI - * @brief EXTI HAL module driver - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup EXTI_Exported_Types EXTI Exported Types - * @{ - */ -typedef enum -{ - HAL_EXTI_COMMON_CB_ID = 0x00U -} EXTI_CallbackIDTypeDef; - -/** - * @brief EXTI Handle structure definition - */ -typedef struct -{ - uint32_t Line; /*!< Exti line number */ - void (* PendingCallback)(void); /*!< Exti pending callback */ -} EXTI_HandleTypeDef; - -/** - * @brief EXTI Configuration structure definition - */ -typedef struct -{ - uint32_t Line; /*!< The Exti line to be configured. This parameter - can be a value of @ref EXTI_Line */ - uint32_t Mode; /*!< The Exit Mode to be configured for a core. - This parameter can be a combination of @ref EXTI_Mode */ - uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter - can be a value of @ref EXTI_Trigger */ - uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. - This parameter is only possible for line 0 to 15. It - can be a value of @ref EXTI_GPIOSel */ -} EXTI_ConfigTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Constants EXTI Exported Constants - * @{ - */ - -/** @defgroup EXTI_Line EXTI Line - * @{ - */ -#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ -#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ -#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ -#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ -#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ -#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ -#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ -#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ -#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ -#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ -#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ -#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ -#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ -#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ -#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ -#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ -#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ -#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#if defined(EXTI_IMR_IM18) -#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#else -#define EXTI_LINE_18 (EXTI_RESERVED | 0x12u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM18 */ -#if defined(EXTI_IMR_IM19) -#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#else -#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM19 */ -#if defined(EXTI_IMR_IM20) -#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#else -#define EXTI_LINE_20 (EXTI_RESERVED | 0x14u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM20 */ -#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM1 asynchronous event */ -#endif /* EXTI_IMR_IM23 */ - -/** - * @} - */ - -/** @defgroup EXTI_Mode EXTI Mode - * @{ - */ -#define EXTI_MODE_NONE 0x00000000u -#define EXTI_MODE_INTERRUPT 0x00000001u -#define EXTI_MODE_EVENT 0x00000002u -/** - * @} - */ - -/** @defgroup EXTI_Trigger EXTI Trigger - * @{ - */ - -#define EXTI_TRIGGER_NONE 0x00000000u -#define EXTI_TRIGGER_RISING 0x00000001u -#define EXTI_TRIGGER_FALLING 0x00000002u -#define EXTI_TRIGGER_RISING_FALLING (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) -/** - * @} - */ - -/** @defgroup EXTI_GPIOSel EXTI GPIOSel - * @brief - * @{ - */ -#define EXTI_GPIOA 0x00000000u -#define EXTI_GPIOB 0x00000001u -#define EXTI_GPIOC 0x00000002u -#if defined (GPIOD) -#define EXTI_GPIOD 0x00000003u -#endif /* GPIOD */ -#if defined (GPIOE) -#define EXTI_GPIOE 0x00000004u -#endif /* GPIOE */ -#if defined (GPIOF) -#define EXTI_GPIOF 0x00000005u -#endif /* GPIOF */ -#if defined (GPIOG) -#define EXTI_GPIOG 0x00000006u -#endif /* GPIOG */ -#if defined (GPIOH) -#define EXTI_GPIOH 0x00000007u -#endif /* GPIOH */ -#if defined (GPIOI) -#define EXTI_GPIOI 0x00000008u -#endif /* GPIOI */ -#if defined (GPIOJ) -#define EXTI_GPIOJ 0x00000009u -#endif /* GPIOJ */ -#if defined (GPIOK) -#define EXTI_GPIOK 0x0000000Au -#endif /* GPIOK */ - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Macros EXTI Exported Macros - * @{ - */ - -/** - * @} - */ - -/* Private constants --------------------------------------------------------*/ -/** @defgroup EXTI_Private_Constants EXTI Private Constants - * @{ - */ -/** - * @brief EXTI Line property definition - */ -#define EXTI_PROPERTY_SHIFT 24u -#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) -#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) -#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) -#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) - -/** - * @brief EXTI bit usage - */ -#define EXTI_PIN_MASK 0x0000001Fu - -/** - * @brief EXTI Mask for interrupt & event mode - */ -#define EXTI_MODE_MASK (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT) - -/** - * @brief EXTI Mask for trigger possibilities - */ -#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) - -/** - * @brief EXTI Line number - */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_NB 24UL -#else -#define EXTI_LINE_NB 23UL -#endif /* EXTI_IMR_IM23 */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup EXTI_Private_Macros EXTI Private Macros - * @{ - */ -#define IS_EXTI_LINE(__EXTI_LINE__) ((((__EXTI_LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ - ((((__EXTI_LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ - (((__EXTI_LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ - (((__EXTI_LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) - -#define IS_EXTI_MODE(__EXTI_LINE__) ((((__EXTI_LINE__) & EXTI_MODE_MASK) != 0x00u) && \ - (((__EXTI_LINE__) & ~EXTI_MODE_MASK) == 0x00u)) - -#define IS_EXTI_TRIGGER(__EXTI_LINE__) (((__EXTI_LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) - -#define IS_EXTI_PENDING_EDGE(__EXTI_LINE__) ((__EXTI_LINE__) == EXTI_TRIGGER_RISING_FALLING) - -#define IS_EXTI_CONFIG_LINE(__EXTI_LINE__) (((__EXTI_LINE__) & EXTI_CONFIG) != 0x00u) - -#if !defined (GPIOD) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOE) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOF) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOI) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOJ) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH) || \ - ((__PORT__) == EXTI_GPIOI)) -#else -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH) || \ - ((__PORT__) == EXTI_GPIOI) || \ - ((__PORT__) == EXTI_GPIOJ) || \ - ((__PORT__) == EXTI_GPIOK)) -#endif /* GPIOD */ - -#define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Functions EXTI Exported Functions - * @brief EXTI Exported Functions - * @{ - */ - -/** @defgroup EXTI_Exported_Functions_Group1 Configuration functions - * @brief Configuration functions - * @{ - */ -/* Configuration functions ****************************************************/ -HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); -HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); -HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti); -HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)); -HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine); -/** - * @} - */ - -/** @defgroup EXTI_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * @{ - */ -/* IO operation functions *****************************************************/ -void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti); -uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); -void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); -void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32f4xx_HAL_EXTI_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h deleted file mode 100644 index 41f77d2..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h +++ /dev/null @@ -1,425 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash.h - * @author MCD Application Team - * @brief Header file of FLASH HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_FLASH_H -#define __STM32F4xx_HAL_FLASH_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASH - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Types FLASH Exported Types - * @{ - */ - -/** - * @brief FLASH Procedure structure definition - */ -typedef enum -{ - FLASH_PROC_NONE = 0U, - FLASH_PROC_SECTERASE, - FLASH_PROC_MASSERASE, - FLASH_PROC_PROGRAM -} FLASH_ProcedureTypeDef; - -/** - * @brief FLASH handle Structure definition - */ -typedef struct -{ - __IO FLASH_ProcedureTypeDef ProcedureOnGoing; /*Internal variable to indicate which procedure is ongoing or not in IT context*/ - - __IO uint32_t NbSectorsToErase; /*Internal variable to save the remaining sectors to erase in IT context*/ - - __IO uint8_t VoltageForErase; /*Internal variable to provide voltage range selected by user in IT context*/ - - __IO uint32_t Sector; /*Internal variable to define the current sector which is erasing*/ - - __IO uint32_t Bank; /*Internal variable to save current bank selected during mass erase*/ - - __IO uint32_t Address; /*Internal variable to save address selected for program*/ - - HAL_LockTypeDef Lock; /* FLASH locking object */ - - __IO uint32_t ErrorCode; /* FLASH error code */ - -} FLASH_ProcessTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Constants FLASH Exported Constants - * @{ - */ -/** @defgroup FLASH_Error_Code FLASH Error Code - * @brief FLASH Error Code - * @{ - */ -#define HAL_FLASH_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_FLASH_ERROR_RD 0x00000001U /*!< Read Protection error */ -#define HAL_FLASH_ERROR_PGS 0x00000002U /*!< Programming Sequence error */ -#define HAL_FLASH_ERROR_PGP 0x00000004U /*!< Programming Parallelism error */ -#define HAL_FLASH_ERROR_PGA 0x00000008U /*!< Programming Alignment error */ -#define HAL_FLASH_ERROR_WRP 0x00000010U /*!< Write protection error */ -#define HAL_FLASH_ERROR_OPERATION 0x00000020U /*!< Operation Error */ -/** - * @} - */ - -/** @defgroup FLASH_Type_Program FLASH Type Program - * @{ - */ -#define FLASH_TYPEPROGRAM_BYTE 0x00000000U /*!< Program byte (8-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_HALFWORD 0x00000001U /*!< Program a half-word (16-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_WORD 0x00000002U /*!< Program a word (32-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_DOUBLEWORD 0x00000003U /*!< Program a double word (64-bit) at a specified address */ -/** - * @} - */ - -/** @defgroup FLASH_Flag_definition FLASH Flag definition - * @brief Flag definition - * @{ - */ -#define FLASH_FLAG_EOP FLASH_SR_EOP /*!< FLASH End of Operation flag */ -#define FLASH_FLAG_OPERR FLASH_SR_SOP /*!< FLASH operation Error flag */ -#define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /*!< FLASH Write protected error flag */ -#define FLASH_FLAG_PGAERR FLASH_SR_PGAERR /*!< FLASH Programming Alignment error flag */ -#define FLASH_FLAG_PGPERR FLASH_SR_PGPERR /*!< FLASH Programming Parallelism error flag */ -#define FLASH_FLAG_PGSERR FLASH_SR_PGSERR /*!< FLASH Programming Sequence error flag */ -#if defined(FLASH_SR_RDERR) -#define FLASH_FLAG_RDERR FLASH_SR_RDERR /*!< Read Protection error flag (PCROP) */ -#endif /* FLASH_SR_RDERR */ -#define FLASH_FLAG_BSY FLASH_SR_BSY /*!< FLASH Busy flag */ -/** - * @} - */ - -/** @defgroup FLASH_Interrupt_definition FLASH Interrupt definition - * @brief FLASH Interrupt definition - * @{ - */ -#define FLASH_IT_EOP FLASH_CR_EOPIE /*!< End of FLASH Operation Interrupt source */ -#define FLASH_IT_ERR 0x02000000U /*!< Error Interrupt source */ -/** - * @} - */ - -/** @defgroup FLASH_Program_Parallelism FLASH Program Parallelism - * @{ - */ -#define FLASH_PSIZE_BYTE 0x00000000U -#define FLASH_PSIZE_HALF_WORD 0x00000100U -#define FLASH_PSIZE_WORD 0x00000200U -#define FLASH_PSIZE_DOUBLE_WORD 0x00000300U -#define CR_PSIZE_MASK 0xFFFFFCFFU -/** - * @} - */ - -/** @defgroup FLASH_Keys FLASH Keys - * @{ - */ -#define RDP_KEY ((uint16_t)0x00A5) -#define FLASH_KEY1 0x45670123U -#define FLASH_KEY2 0xCDEF89ABU -#define FLASH_OPT_KEY1 0x08192A3BU -#define FLASH_OPT_KEY2 0x4C5D6E7FU -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Macros FLASH Exported Macros - * @{ - */ -/** - * @brief Set the FLASH Latency. - * @param __LATENCY__ FLASH Latency - * The value of this parameter depend on device used within the same series - * @retval none - */ -#define __HAL_FLASH_SET_LATENCY(__LATENCY__) (*(__IO uint8_t *)ACR_BYTE0_ADDRESS = (uint8_t)(__LATENCY__)) - -/** - * @brief Get the FLASH Latency. - * @retval FLASH Latency - * The value of this parameter depend on device used within the same series - */ -#define __HAL_FLASH_GET_LATENCY() (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)) - -/** - * @brief Enable the FLASH prefetch buffer. - * @retval none - */ -#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE() (FLASH->ACR |= FLASH_ACR_PRFTEN) - -/** - * @brief Disable the FLASH prefetch buffer. - * @retval none - */ -#define __HAL_FLASH_PREFETCH_BUFFER_DISABLE() (FLASH->ACR &= (~FLASH_ACR_PRFTEN)) - -/** - * @brief Enable the FLASH instruction cache. - * @retval none - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_ICEN) - -/** - * @brief Disable the FLASH instruction cache. - * @retval none - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_ICEN)) - -/** - * @brief Enable the FLASH data cache. - * @retval none - */ -#define __HAL_FLASH_DATA_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_DCEN) - -/** - * @brief Disable the FLASH data cache. - * @retval none - */ -#define __HAL_FLASH_DATA_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_DCEN)) - -/** - * @brief Resets the FLASH instruction Cache. - * @note This function must be used only when the Instruction Cache is disabled. - * @retval None - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_ICRST; \ - FLASH->ACR &= ~FLASH_ACR_ICRST; \ - }while(0U) - -/** - * @brief Resets the FLASH data Cache. - * @note This function must be used only when the data Cache is disabled. - * @retval None - */ -#define __HAL_FLASH_DATA_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_DCRST; \ - FLASH->ACR &= ~FLASH_ACR_DCRST; \ - }while(0U) -/** - * @brief Enable the specified FLASH interrupt. - * @param __INTERRUPT__ FLASH interrupt - * This parameter can be any combination of the following values: - * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt - * @arg FLASH_IT_ERR: Error Interrupt - * @retval none - */ -#define __HAL_FLASH_ENABLE_IT(__INTERRUPT__) (FLASH->CR |= (__INTERRUPT__)) - -/** - * @brief Disable the specified FLASH interrupt. - * @param __INTERRUPT__ FLASH interrupt - * This parameter can be any combination of the following values: - * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt - * @arg FLASH_IT_ERR: Error Interrupt - * @retval none - */ -#define __HAL_FLASH_DISABLE_IT(__INTERRUPT__) (FLASH->CR &= ~(uint32_t)(__INTERRUPT__)) - -/** - * @brief Get the specified FLASH flag status. - * @param __FLAG__ specifies the FLASH flags to check. - * This parameter can be any combination of the following values: - * @arg FLASH_FLAG_EOP : FLASH End of Operation flag - * @arg FLASH_FLAG_OPERR : FLASH operation Error flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag - * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag - * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) - * @arg FLASH_FLAG_BSY : FLASH Busy flag - * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices - * @retval The new state of __FLAG__ (SET or RESET). - */ -#define __HAL_FLASH_GET_FLAG(__FLAG__) ((FLASH->SR & (__FLAG__))) - -/** - * @brief Clear the specified FLASH flags. - * @param __FLAG__ specifies the FLASH flags to clear. - * This parameter can be any combination of the following values: - * @arg FLASH_FLAG_EOP : FLASH End of Operation flag - * @arg FLASH_FLAG_OPERR : FLASH operation Error flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag - * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag - * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) - * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices - * @retval none - */ -#define __HAL_FLASH_CLEAR_FLAG(__FLAG__) (FLASH->SR = (__FLAG__)) -/** - * @} - */ - -/* Include FLASH HAL Extension module */ -#include "stm32f4xx_hal_flash_ex.h" -#include "stm32f4xx_hal_flash_ramfunc.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup FLASH_Exported_Functions - * @{ - */ -/** @addtogroup FLASH_Exported_Functions_Group1 - * @{ - */ -/* Program operation functions ***********************************************/ -HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data); -HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data); -/* FLASH IRQ handler method */ -void HAL_FLASH_IRQHandler(void); -/* Callbacks in non blocking modes */ -void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue); -void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue); -/** - * @} - */ - -/** @addtogroup FLASH_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions **********************************************/ -HAL_StatusTypeDef HAL_FLASH_Unlock(void); -HAL_StatusTypeDef HAL_FLASH_Lock(void); -HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void); -HAL_StatusTypeDef HAL_FLASH_OB_Lock(void); -/* Option bytes control */ -HAL_StatusTypeDef HAL_FLASH_OB_Launch(void); -/** - * @} - */ - -/** @addtogroup FLASH_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State functions ************************************************/ -uint32_t HAL_FLASH_GetError(void); -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Variables FLASH Private Variables - * @{ - */ - -/** - * @} - */ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Constants FLASH Private Constants - * @{ - */ - -/** - * @brief ACR register byte 0 (Bits[7:0]) base address - */ -#define ACR_BYTE0_ADDRESS 0x40023C00U -/** - * @brief OPTCR register byte 0 (Bits[7:0]) base address - */ -#define OPTCR_BYTE0_ADDRESS 0x40023C14U -/** - * @brief OPTCR register byte 1 (Bits[15:8]) base address - */ -#define OPTCR_BYTE1_ADDRESS 0x40023C15U -/** - * @brief OPTCR register byte 2 (Bits[23:16]) base address - */ -#define OPTCR_BYTE2_ADDRESS 0x40023C16U -/** - * @brief OPTCR register byte 3 (Bits[31:24]) base address - */ -#define OPTCR_BYTE3_ADDRESS 0x40023C17U - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup FLASH_Private_Macros FLASH Private Macros - * @{ - */ - -/** @defgroup FLASH_IS_FLASH_Definitions FLASH Private macros to check input parameters - * @{ - */ -#define IS_FLASH_TYPEPROGRAM(VALUE)(((VALUE) == FLASH_TYPEPROGRAM_BYTE) || \ - ((VALUE) == FLASH_TYPEPROGRAM_HALFWORD) || \ - ((VALUE) == FLASH_TYPEPROGRAM_WORD) || \ - ((VALUE) == FLASH_TYPEPROGRAM_DOUBLEWORD)) -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Functions FLASH Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_FLASH_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h deleted file mode 100644 index 5fa89db..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h +++ /dev/null @@ -1,1063 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ex.h - * @author MCD Application Team - * @brief Header file of FLASH HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_FLASH_EX_H -#define __STM32F4xx_HAL_FLASH_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASHEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup FLASHEx_Exported_Types FLASH Exported Types - * @{ - */ - -/** - * @brief FLASH Erase structure definition - */ -typedef struct -{ - uint32_t TypeErase; /*!< Mass erase or sector Erase. - This parameter can be a value of @ref FLASHEx_Type_Erase */ - - uint32_t Banks; /*!< Select banks to erase when Mass erase is enabled. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint32_t Sector; /*!< Initial FLASH sector to erase when Mass erase is disabled - This parameter must be a value of @ref FLASHEx_Sectors */ - - uint32_t NbSectors; /*!< Number of sectors to be erased. - This parameter must be a value between 1 and (max number of sectors - value of Initial sector)*/ - - uint32_t VoltageRange;/*!< The device voltage range which defines the erase parallelism - This parameter must be a value of @ref FLASHEx_Voltage_Range */ - -} FLASH_EraseInitTypeDef; - -/** - * @brief FLASH Option Bytes Program structure definition - */ -typedef struct -{ - uint32_t OptionType; /*!< Option byte to be configured. - This parameter can be a value of @ref FLASHEx_Option_Type */ - - uint32_t WRPState; /*!< Write protection activation or deactivation. - This parameter can be a value of @ref FLASHEx_WRP_State */ - - uint32_t WRPSector; /*!< Specifies the sector(s) to be write protected. - The value of this parameter depend on device used within the same series */ - - uint32_t Banks; /*!< Select banks for WRP activation/deactivation of all sectors. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint32_t RDPLevel; /*!< Set the read protection level. - This parameter can be a value of @ref FLASHEx_Option_Bytes_Read_Protection */ - - uint32_t BORLevel; /*!< Set the BOR Level. - This parameter can be a value of @ref FLASHEx_BOR_Reset_Level */ - - uint8_t USERConfig; /*!< Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. */ - -} FLASH_OBProgramInitTypeDef; - -/** - * @brief FLASH Advanced Option Bytes Program structure definition - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -typedef struct -{ - uint32_t OptionType; /*!< Option byte to be configured for extension. - This parameter can be a value of @ref FLASHEx_Advanced_Option_Type */ - - uint32_t PCROPState; /*!< PCROP activation or deactivation. - This parameter can be a value of @ref FLASHEx_PCROP_State */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - uint16_t Sectors; /*!< specifies the sector(s) set for PCROP. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx ||\ - STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - uint32_t Banks; /*!< Select banks for PCROP activation/deactivation of all sectors. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint16_t SectorsBank1; /*!< Specifies the sector(s) set for PCROP for Bank1. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ - - uint16_t SectorsBank2; /*!< Specifies the sector(s) set for PCROP for Bank2. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ - - uint8_t BootConfig; /*!< Specifies Option bytes for boot config. - This parameter can be a value of @ref FLASHEx_Dual_Boot */ - -#endif /*STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -} FLASH_AdvOBProgramInitTypeDef; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || - STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup FLASHEx_Exported_Constants FLASH Exported Constants - * @{ - */ - -/** @defgroup FLASHEx_Type_Erase FLASH Type Erase - * @{ - */ -#define FLASH_TYPEERASE_SECTORS 0x00000000U /*!< Sectors erase only */ -#define FLASH_TYPEERASE_MASSERASE 0x00000001U /*!< Flash Mass erase activation */ -/** - * @} - */ - -/** @defgroup FLASHEx_Voltage_Range FLASH Voltage Range - * @{ - */ -#define FLASH_VOLTAGE_RANGE_1 0x00000000U /*!< Device operating range: 1.8V to 2.1V */ -#define FLASH_VOLTAGE_RANGE_2 0x00000001U /*!< Device operating range: 2.1V to 2.7V */ -#define FLASH_VOLTAGE_RANGE_3 0x00000002U /*!< Device operating range: 2.7V to 3.6V */ -#define FLASH_VOLTAGE_RANGE_4 0x00000003U /*!< Device operating range: 2.7V to 3.6V + External Vpp */ -/** - * @} - */ - -/** @defgroup FLASHEx_WRP_State FLASH WRP State - * @{ - */ -#define OB_WRPSTATE_DISABLE 0x00000000U /*!< Disable the write protection of the desired bank 1 sectors */ -#define OB_WRPSTATE_ENABLE 0x00000001U /*!< Enable the write protection of the desired bank 1 sectors */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Type FLASH Option Type - * @{ - */ -#define OPTIONBYTE_WRP 0x00000001U /*!< WRP option byte configuration */ -#define OPTIONBYTE_RDP 0x00000002U /*!< RDP option byte configuration */ -#define OPTIONBYTE_USER 0x00000004U /*!< USER option byte configuration */ -#define OPTIONBYTE_BOR 0x00000008U /*!< BOR option byte configuration */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_Read_Protection FLASH Option Bytes Read Protection - * @{ - */ -#define OB_RDP_LEVEL_0 ((uint8_t)0xAA) -#define OB_RDP_LEVEL_1 ((uint8_t)0x55) -#define OB_RDP_LEVEL_2 ((uint8_t)0xCC) /*!< Warning: When enabling read protection level 2 - it s no more possible to go back to level 1 or 0 */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_IWatchdog FLASH Option Bytes IWatchdog - * @{ - */ -#define OB_IWDG_SW ((uint8_t)0x20) /*!< Software IWDG selected */ -#define OB_IWDG_HW ((uint8_t)0x00) /*!< Hardware IWDG selected */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_nRST_STOP FLASH Option Bytes nRST_STOP - * @{ - */ -#define OB_STOP_NO_RST ((uint8_t)0x40) /*!< No reset generated when entering in STOP */ -#define OB_STOP_RST ((uint8_t)0x00) /*!< Reset generated when entering in STOP */ -/** - * @} - */ - - -/** @defgroup FLASHEx_Option_Bytes_nRST_STDBY FLASH Option Bytes nRST_STDBY - * @{ - */ -#define OB_STDBY_NO_RST ((uint8_t)0x80) /*!< No reset generated when entering in STANDBY */ -#define OB_STDBY_RST ((uint8_t)0x00) /*!< Reset generated when entering in STANDBY */ -/** - * @} - */ - -/** @defgroup FLASHEx_BOR_Reset_Level FLASH BOR Reset Level - * @{ - */ -#define OB_BOR_LEVEL3 ((uint8_t)0x00) /*!< Supply voltage ranges from 2.70 to 3.60 V */ -#define OB_BOR_LEVEL2 ((uint8_t)0x04) /*!< Supply voltage ranges from 2.40 to 2.70 V */ -#define OB_BOR_LEVEL1 ((uint8_t)0x08) /*!< Supply voltage ranges from 2.10 to 2.40 V */ -#define OB_BOR_OFF ((uint8_t)0x0C) /*!< Supply voltage ranges from 1.62 to 2.10 V */ -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup FLASHEx_PCROP_State FLASH PCROP State - * @{ - */ -#define OB_PCROP_STATE_DISABLE 0x00000000U /*!< Disable PCROP */ -#define OB_PCROP_STATE_ENABLE 0x00000001U /*!< Enable PCROP */ -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/** @defgroup FLASHEx_Advanced_Option_Type FLASH Advanced Option Type - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define OPTIONBYTE_PCROP 0x00000001U /*!< PCROP option byte configuration */ -#define OPTIONBYTE_BOOTCONFIG 0x00000002U /*!< BOOTConfig option byte configuration */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -#define OPTIONBYTE_PCROP 0x00000001U /*!= FLASH_BASE) && ((ADDRESS) <= FLASH_END)) || \ - (((ADDRESS) >= FLASH_OTP_BASE) && ((ADDRESS) <= FLASH_OTP_END))) - -#define IS_FLASH_NBSECTORS(NBSECTORS) (((NBSECTORS) != 0) && ((NBSECTORS) <= FLASH_SECTOR_TOTAL)) - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFF000000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xC */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F401xC) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xC */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_BOOT(BOOT) (((BOOT) == OB_DUAL_BOOT_ENABLE) || ((BOOT) == OB_DUAL_BOOT_DISABLE)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_PCROP_SELECT(PCROP) (((PCROP) == OB_PCROP_SELECTED) || ((PCROP) == OB_PCROP_DESELECTED)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup FLASHEx_Private_Functions FLASH Private Functions - * @{ - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange); -void FLASH_FlushCaches(void); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_FLASH_EX_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h deleted file mode 100644 index 2112e74..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ramfunc.h - * @author MCD Application Team - * @brief Header file of FLASH RAMFUNC driver. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_FLASH_RAMFUNC_H -#define __STM32F4xx_FLASH_RAMFUNC_H - -#ifdef __cplusplus -extern "C" { -#endif -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASH_RAMFUNC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup FLASH_RAMFUNC_Exported_Functions - * @{ - */ - -/** @addtogroup FLASH_RAMFUNC_Exported_Functions_Group1 - * @{ - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_FLASH_RAMFUNC_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h deleted file mode 100644 index 5f3d749..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h +++ /dev/null @@ -1,325 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio.h - * @author MCD Application Team - * @brief Header file of GPIO HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_GPIO_H -#define __STM32F4xx_HAL_GPIO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup GPIO - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Types GPIO Exported Types - * @{ - */ - -/** - * @brief GPIO Init structure definition - */ -typedef struct -{ - uint32_t Pin; /*!< Specifies the GPIO pins to be configured. - This parameter can be any value of @ref GPIO_pins_define */ - - uint32_t Mode; /*!< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref GPIO_mode_define */ - - uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. - This parameter can be a value of @ref GPIO_pull_define */ - - uint32_t Speed; /*!< Specifies the speed for the selected pins. - This parameter can be a value of @ref GPIO_speed_define */ - - uint32_t Alternate; /*!< Peripheral to be connected to the selected pins. - This parameter can be a value of @ref GPIO_Alternate_function_selection */ -}GPIO_InitTypeDef; - -/** - * @brief GPIO Bit SET and Bit RESET enumeration - */ -typedef enum -{ - GPIO_PIN_RESET = 0, - GPIO_PIN_SET -}GPIO_PinState; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup GPIO_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_pins_define GPIO pins define - * @{ - */ -#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */ -#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */ -#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */ -#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */ -#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */ -#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */ -#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */ -#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */ -#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */ -#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */ -#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */ -#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */ -#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */ -#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */ -#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */ -#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */ -#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */ - -#define GPIO_PIN_MASK 0x0000FFFFU /* PIN mask for assert test */ -/** - * @} - */ - -/** @defgroup GPIO_mode_define GPIO mode define - * @brief GPIO Configuration Mode - * Elements values convention: 0x00WX00YZ - * - W : EXTI trigger detection on 3 bits - * - X : EXTI mode (IT or Event) on 2 bits - * - Y : Output type (Push Pull or Open Drain) on 1 bit - * - Z : GPIO mode (Input, Output, Alternate or Analog) on 2 bits - * @{ - */ -#define GPIO_MODE_INPUT MODE_INPUT /*!< Input Floating Mode */ -#define GPIO_MODE_OUTPUT_PP (MODE_OUTPUT | OUTPUT_PP) /*!< Output Push Pull Mode */ -#define GPIO_MODE_OUTPUT_OD (MODE_OUTPUT | OUTPUT_OD) /*!< Output Open Drain Mode */ -#define GPIO_MODE_AF_PP (MODE_AF | OUTPUT_PP) /*!< Alternate Function Push Pull Mode */ -#define GPIO_MODE_AF_OD (MODE_AF | OUTPUT_OD) /*!< Alternate Function Open Drain Mode */ - -#define GPIO_MODE_ANALOG MODE_ANALOG /*!< Analog Mode */ - -#define GPIO_MODE_IT_RISING (MODE_INPUT | EXTI_IT | TRIGGER_RISING) /*!< External Interrupt Mode with Rising edge trigger detection */ -#define GPIO_MODE_IT_FALLING (MODE_INPUT | EXTI_IT | TRIGGER_FALLING) /*!< External Interrupt Mode with Falling edge trigger detection */ -#define GPIO_MODE_IT_RISING_FALLING (MODE_INPUT | EXTI_IT | TRIGGER_RISING | TRIGGER_FALLING) /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ - -#define GPIO_MODE_EVT_RISING (MODE_INPUT | EXTI_EVT | TRIGGER_RISING) /*!< External Event Mode with Rising edge trigger detection */ -#define GPIO_MODE_EVT_FALLING (MODE_INPUT | EXTI_EVT | TRIGGER_FALLING) /*!< External Event Mode with Falling edge trigger detection */ -#define GPIO_MODE_EVT_RISING_FALLING (MODE_INPUT | EXTI_EVT | TRIGGER_RISING | TRIGGER_FALLING) /*!< External Event Mode with Rising/Falling edge trigger detection */ - -/** - * @} - */ - -/** @defgroup GPIO_speed_define GPIO speed define - * @brief GPIO Output Maximum frequency - * @{ - */ -#define GPIO_SPEED_FREQ_LOW 0x00000000U /*!< IO works at 2 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_MEDIUM 0x00000001U /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_HIGH 0x00000002U /*!< range 25 MHz to 100 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_VERY_HIGH 0x00000003U /*!< range 50 MHz to 200 MHz, please refer to the product datasheet */ -/** - * @} - */ - - /** @defgroup GPIO_pull_define GPIO pull define - * @brief GPIO Pull-Up or Pull-Down Activation - * @{ - */ -#define GPIO_NOPULL 0x00000000U /*!< No Pull-up or Pull-down activation */ -#define GPIO_PULLUP 0x00000001U /*!< Pull-up activation */ -#define GPIO_PULLDOWN 0x00000002U /*!< Pull-down activation */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Macros GPIO Exported Macros - * @{ - */ - -/** - * @brief Checks whether the specified EXTI line flag is set or not. - * @param __EXTI_LINE__ specifies the EXTI line flag to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval The new state of __EXTI_LINE__ (SET or RESET). - */ -#define __HAL_GPIO_EXTI_GET_FLAG(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) - -/** - * @brief Clears the EXTI's line pending flags. - * @param __EXTI_LINE__ specifies the EXTI lines flags to clear. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_CLEAR_FLAG(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) - -/** - * @brief Checks whether the specified EXTI line is asserted or not. - * @param __EXTI_LINE__ specifies the EXTI line to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval The new state of __EXTI_LINE__ (SET or RESET). - */ -#define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) - -/** - * @brief Clears the EXTI's line pending bits. - * @param __EXTI_LINE__ specifies the EXTI lines to clear. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) - -/** - * @brief Generates a Software interrupt on selected EXTI line. - * @param __EXTI_LINE__ specifies the EXTI line to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__) (EXTI->SWIER |= (__EXTI_LINE__)) -/** - * @} - */ - -/* Include GPIO HAL Extension module */ -#include "stm32f4xx_hal_gpio_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup GPIO_Exported_Functions - * @{ - */ - -/** @addtogroup GPIO_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); -void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); -/** - * @} - */ - -/** @addtogroup GPIO_Exported_Functions_Group2 - * @{ - */ -/* IO operation functions *****************************************************/ -GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); -void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin); -void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup GPIO_Private_Constants GPIO Private Constants - * @{ - */ -#define GPIO_MODE_Pos 0U -#define GPIO_MODE (0x3UL << GPIO_MODE_Pos) -#define MODE_INPUT (0x0UL << GPIO_MODE_Pos) -#define MODE_OUTPUT (0x1UL << GPIO_MODE_Pos) -#define MODE_AF (0x2UL << GPIO_MODE_Pos) -#define MODE_ANALOG (0x3UL << GPIO_MODE_Pos) -#define OUTPUT_TYPE_Pos 4U -#define OUTPUT_TYPE (0x1UL << OUTPUT_TYPE_Pos) -#define OUTPUT_PP (0x0UL << OUTPUT_TYPE_Pos) -#define OUTPUT_OD (0x1UL << OUTPUT_TYPE_Pos) -#define EXTI_MODE_Pos 16U -#define EXTI_MODE (0x3UL << EXTI_MODE_Pos) -#define EXTI_IT (0x1UL << EXTI_MODE_Pos) -#define EXTI_EVT (0x2UL << EXTI_MODE_Pos) -#define TRIGGER_MODE_Pos 20U -#define TRIGGER_MODE (0x7UL << TRIGGER_MODE_Pos) -#define TRIGGER_RISING (0x1UL << TRIGGER_MODE_Pos) -#define TRIGGER_FALLING (0x2UL << TRIGGER_MODE_Pos) - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup GPIO_Private_Macros GPIO Private Macros - * @{ - */ -#define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(PIN) (((((uint32_t)PIN) & GPIO_PIN_MASK ) != 0x00U) && ((((uint32_t)PIN) & ~GPIO_PIN_MASK) == 0x00U)) -#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ - ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ - ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ - ((MODE) == GPIO_MODE_AF_PP) ||\ - ((MODE) == GPIO_MODE_AF_OD) ||\ - ((MODE) == GPIO_MODE_IT_RISING) ||\ - ((MODE) == GPIO_MODE_IT_FALLING) ||\ - ((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\ - ((MODE) == GPIO_MODE_EVT_RISING) ||\ - ((MODE) == GPIO_MODE_EVT_FALLING) ||\ - ((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||\ - ((MODE) == GPIO_MODE_ANALOG)) -#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_SPEED_FREQ_LOW) || ((SPEED) == GPIO_SPEED_FREQ_MEDIUM) || \ - ((SPEED) == GPIO_SPEED_FREQ_HIGH) || ((SPEED) == GPIO_SPEED_FREQ_VERY_HIGH)) -#define IS_GPIO_PULL(PULL) (((PULL) == GPIO_NOPULL) || ((PULL) == GPIO_PULLUP) || \ - ((PULL) == GPIO_PULLDOWN)) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup GPIO_Private_Functions GPIO Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_GPIO_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h deleted file mode 100644 index 5e0b7cc..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h +++ /dev/null @@ -1,1590 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio_ex.h - * @author MCD Application Team - * @brief Header file of GPIO HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_GPIO_EX_H -#define __STM32F4xx_HAL_GPIO_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup GPIOEx GPIOEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_Alternate_function_selection GPIO Alternate Function Selection - * @{ - */ - -/*------------------------------------------ STM32F429xx/STM32F439xx ---------*/ -#if defined(STM32F429xx) || defined(STM32F439xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -/** @brief GPIO_Legacy - */ -#define GPIO_AF5_I2S3ext GPIO_AF5_SPI3 /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F427xx || STM32F437xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ -#if defined(STM32F407xx) || defined(STM32F417xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F405xx || STM32F415xx */ - -/*----------------------------------------------------------------------------*/ - -/*---------------------------------------- STM32F401xx------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ - - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F401xC || STM32F401xE */ -/*----------------------------------------------------------------------------*/ - -/*--------------- STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-------------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ -#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ -#define GPIO_AF10_FMC ((uint8_t)0x0A) /* FMC Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -/*----------------------------------------------------------------------------*/ - -/*--------------- STM32F413xx/STM32F423xx-------------------------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ -#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ -#define GPIO_AF3_DFSDM2 ((uint8_t)0x03) /* DFSDM2 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF6_DFSDM2 ((uint8_t)0x06) /* DFSDM2 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_SAI1 ((uint8_t)0x07) /* SAI1 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ -#define GPIO_AF7_DFSDM2 ((uint8_t)0x07) /* DFSDM2 Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ -#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_SAI1 ((uint8_t)0x0A) /* SAI1 Alternate Function mapping */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF10_DFSDM2 ((uint8_t)0x0A) /* DFSDM2 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ -#define GPIO_AF10_FSMC ((uint8_t)0x0A) /* FSMC Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_UART4 ((uint8_t)0x0B) /* UART4 Alternate Function mapping */ -#define GPIO_AF11_UART5 ((uint8_t)0x0B) /* UART5 Alternate Function mapping */ -#define GPIO_AF11_UART9 ((uint8_t)0x0B) /* UART9 Alternate Function mapping */ -#define GPIO_AF11_UART10 ((uint8_t)0x0B) /* UART10 Alternate Function mapping */ -#define GPIO_AF11_CAN3 ((uint8_t)0x0B) /* CAN3 Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_RNG ((uint8_t)0x0E) /* RNG Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F413xx || STM32F423xx */ - -/*---------------------------------------- STM32F411xx------------------------*/ -#if defined(STM32F411xE) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F411xE */ - -/*---------------------------------------- STM32F410xx------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#if defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#endif /* STM32F410Cx || STM32F410Rx */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI1 ((uint8_t)0x06) /* SPI1 Alternate Function mapping */ -#if defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#endif /* STM32F410Cx || STM32F410Rx */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/*---------------------------------------- STM32F446xx -----------------------*/ -#if defined(STM32F446xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ -#define GPIO_AF3_CEC ((uint8_t)0x03) /* CEC Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF4_CEC ((uint8_t)0x04) /* CEC Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4 Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_UART5 ((uint8_t)0x07) /* UART5 Alternate Function mapping */ -#define GPIO_AF7_SPI2 ((uint8_t)0x07) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_SPDIFRX ((uint8_t)0x07) /* SPDIFRX Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_SPDIFRX ((uint8_t)0x08) /* SPDIFRX Alternate Function mapping */ -#define GPIO_AF8_SAI2 ((uint8_t)0x08) /* SAI2 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ -#define GPIO_AF10_SAI2 ((uint8_t)0x0A) /* SAI2 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F469xx/STM32F479xx--------------------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ -#define GPIO_AF13_DSI ((uint8_t)0x0D) /* DSI Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ - -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Macros GPIO Exported Macros - * @{ - */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Functions GPIO Exported Functions - * @{ - */ -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Constants GPIO Private Constants - * @{ - */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Macros GPIO Private Macros - * @{ - */ -/** @defgroup GPIOEx_Get_Port_Index GPIO Get Port Index - * @{ - */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U :\ - ((__GPIOx__) == (GPIOH))? 7U : 8U) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U :\ - ((__GPIOx__) == (GPIOH))? 7U :\ - ((__GPIOx__) == (GPIOI))? 8U :\ - ((__GPIOx__) == (GPIOJ))? 9U : 10U) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U : 7U) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U : 7U) -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U : 7U) -#endif /* STM32F446xx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U : 7U) -#endif /* STM32F412Vx */ -#if defined(STM32F412Rx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U : 7U) -#endif /* STM32F412Rx */ -#if defined(STM32F412Cx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U : 7U) -#endif /* STM32F412Cx */ - -/** - * @} - */ - -/** @defgroup GPIOEx_IS_Alternat_function_selection GPIO Check Alternate Function - * @{ - */ -/*------------------------- STM32F429xx/STM32F439xx---------------------------*/ -#if defined(STM32F429xx) || defined(STM32F439xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF14_LTDC)) - -#endif /* STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1)) - -#endif /* STM32F427xx || STM32F437xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ -#if defined(STM32F407xx) || defined(STM32F417xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF12_OTG_HS_FS) || ((AF) == GPIO_AF12_SDIO) || \ - ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F405xx || STM32F415xx */ - -/*----------------------------------------------------------------------------*/ - -/*---------------------------------------- STM32F401xx------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF12_SDIO) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM9) || \ - ((AF) == GPIO_AF3_TIM10) || ((AF) == GPIO_AF3_TIM11) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF7_USART1) || \ - ((AF) == GPIO_AF7_USART2) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF15_EVENTOUT)) -#endif /* STM32F401xC || STM32F401xE */ -/*----------------------------------------------------------------------------*/ -/*---------------------------------------- STM32F410xx------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_GPIO_AF(AF) (((AF) < 10U) || ((AF) == 15U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/*---------------------------------------- STM32F411xx------------------------*/ -#if defined(STM32F411xE) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF4_I2C1) || \ - ((AF) == GPIO_AF4_I2C2) || ((AF) == GPIO_AF4_I2C3) || \ - ((AF) == GPIO_AF5_SPI1) || ((AF) == GPIO_AF5_SPI2) || \ - ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI4) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF6_SPI5) || ((AF) == GPIO_AF7_SPI3) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF8_USART6) || ((AF) == GPIO_AF10_OTG_FS) || \ - ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F411xE */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------------------------- STM32F446xx ----------------*/ -#if defined(STM32F446xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF3_CEC) || ((AF) == GPIO_AF4_CEC) || \ - ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI2) || \ - ((AF) == GPIO_AF6_SPI4) || ((AF) == GPIO_AF7_UART5) || \ - ((AF) == GPIO_AF7_SPI2) || ((AF) == GPIO_AF7_SPI3) || \ - ((AF) == GPIO_AF7_SPDIFRX) || ((AF) == GPIO_AF8_SPDIFRX) || \ - ((AF) == GPIO_AF8_SAI2) || ((AF) == GPIO_AF9_QSPI) || \ - ((AF) == GPIO_AF10_SAI2) || ((AF) == GPIO_AF10_QSPI)) - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------------------- STM32F469xx/STM32F479xx --------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF14_LTDC) || ((AF) == GPIO_AF13_DSI) || \ - ((AF) == GPIO_AF9_QSPI) || ((AF) == GPIO_AF10_QSPI)) - -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-----------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 11U) && ((AF) != 14U) && ((AF) != 13U)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/*----------------------------------------------------------------------------*/ - -/*------------------STM32F413xx/STM32F423xx-----------------------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 13U)) -#endif /* STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Functions GPIO Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_GPIO_EX_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h deleted file mode 100644 index 9a7a67e..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h +++ /dev/null @@ -1,741 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_i2c.h - * @author MCD Application Team - * @brief Header file of I2C HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_I2C_H -#define __STM32F4xx_HAL_I2C_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup I2C - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup I2C_Exported_Types I2C Exported Types - * @{ - */ - -/** @defgroup I2C_Configuration_Structure_definition I2C Configuration Structure definition - * @brief I2C Configuration Structure definition - * @{ - */ -typedef struct -{ - uint32_t ClockSpeed; /*!< Specifies the clock frequency. - This parameter must be set to a value lower than 400kHz */ - - uint32_t DutyCycle; /*!< Specifies the I2C fast mode duty cycle. - This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */ - - uint32_t OwnAddress1; /*!< Specifies the first device own address. - This parameter can be a 7-bit or 10-bit address. */ - - uint32_t AddressingMode; /*!< Specifies if 7-bit or 10-bit addressing mode is selected. - This parameter can be a value of @ref I2C_addressing_mode */ - - uint32_t DualAddressMode; /*!< Specifies if dual addressing mode is selected. - This parameter can be a value of @ref I2C_dual_addressing_mode */ - - uint32_t OwnAddress2; /*!< Specifies the second device own address if dual addressing mode is selected - This parameter can be a 7-bit address. */ - - uint32_t GeneralCallMode; /*!< Specifies if general call mode is selected. - This parameter can be a value of @ref I2C_general_call_addressing_mode */ - - uint32_t NoStretchMode; /*!< Specifies if nostretch mode is selected. - This parameter can be a value of @ref I2C_nostretch_mode */ - -} I2C_InitTypeDef; - -/** - * @} - */ - -/** @defgroup HAL_state_structure_definition HAL state structure definition - * @brief HAL State structure definition - * @note HAL I2C State value coding follow below described bitmap : - * b7-b6 Error information - * 00 : No Error - * 01 : Abort (Abort user request on going) - * 10 : Timeout - * 11 : Error - * b5 Peripheral initialization status - * 0 : Reset (Peripheral not initialized) - * 1 : Init done (Peripheral initialized and ready to use. HAL I2C Init function called) - * b4 (not used) - * x : Should be set to 0 - * b3 - * 0 : Ready or Busy (No Listen mode ongoing) - * 1 : Listen (Peripheral in Address Listen Mode) - * b2 Intrinsic process state - * 0 : Ready - * 1 : Busy (Peripheral busy with some configuration or internal operations) - * b1 Rx state - * 0 : Ready (no Rx operation ongoing) - * 1 : Busy (Rx operation ongoing) - * b0 Tx state - * 0 : Ready (no Tx operation ongoing) - * 1 : Busy (Tx operation ongoing) - * @{ - */ -typedef enum -{ - HAL_I2C_STATE_RESET = 0x00U, /*!< Peripheral is not yet Initialized */ - HAL_I2C_STATE_READY = 0x20U, /*!< Peripheral Initialized and ready for use */ - HAL_I2C_STATE_BUSY = 0x24U, /*!< An internal process is ongoing */ - HAL_I2C_STATE_BUSY_TX = 0x21U, /*!< Data Transmission process is ongoing */ - HAL_I2C_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing */ - HAL_I2C_STATE_LISTEN = 0x28U, /*!< Address Listen Mode is ongoing */ - HAL_I2C_STATE_BUSY_TX_LISTEN = 0x29U, /*!< Address Listen Mode and Data Transmission - process is ongoing */ - HAL_I2C_STATE_BUSY_RX_LISTEN = 0x2AU, /*!< Address Listen Mode and Data Reception - process is ongoing */ - HAL_I2C_STATE_ABORT = 0x60U, /*!< Abort user request ongoing */ - HAL_I2C_STATE_TIMEOUT = 0xA0U, /*!< Timeout state */ - HAL_I2C_STATE_ERROR = 0xE0U /*!< Error */ - -} HAL_I2C_StateTypeDef; - -/** - * @} - */ - -/** @defgroup HAL_mode_structure_definition HAL mode structure definition - * @brief HAL Mode structure definition - * @note HAL I2C Mode value coding follow below described bitmap :\n - * b7 (not used)\n - * x : Should be set to 0\n - * b6\n - * 0 : None\n - * 1 : Memory (HAL I2C communication is in Memory Mode)\n - * b5\n - * 0 : None\n - * 1 : Slave (HAL I2C communication is in Slave Mode)\n - * b4\n - * 0 : None\n - * 1 : Master (HAL I2C communication is in Master Mode)\n - * b3-b2-b1-b0 (not used)\n - * xxxx : Should be set to 0000 - * @{ - */ -typedef enum -{ - HAL_I2C_MODE_NONE = 0x00U, /*!< No I2C communication on going */ - HAL_I2C_MODE_MASTER = 0x10U, /*!< I2C communication is in Master Mode */ - HAL_I2C_MODE_SLAVE = 0x20U, /*!< I2C communication is in Slave Mode */ - HAL_I2C_MODE_MEM = 0x40U /*!< I2C communication is in Memory Mode */ - -} HAL_I2C_ModeTypeDef; - -/** - * @} - */ - -/** @defgroup I2C_Error_Code_definition I2C Error Code definition - * @brief I2C Error Code definition - * @{ - */ -#define HAL_I2C_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_I2C_ERROR_BERR 0x00000001U /*!< BERR error */ -#define HAL_I2C_ERROR_ARLO 0x00000002U /*!< ARLO error */ -#define HAL_I2C_ERROR_AF 0x00000004U /*!< AF error */ -#define HAL_I2C_ERROR_OVR 0x00000008U /*!< OVR error */ -#define HAL_I2C_ERROR_DMA 0x00000010U /*!< DMA transfer error */ -#define HAL_I2C_ERROR_TIMEOUT 0x00000020U /*!< Timeout Error */ -#define HAL_I2C_ERROR_SIZE 0x00000040U /*!< Size Management error */ -#define HAL_I2C_ERROR_DMA_PARAM 0x00000080U /*!< DMA Parameter Error */ -#define HAL_I2C_WRONG_START 0x00000200U /*!< Wrong start Error */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -#define HAL_I2C_ERROR_INVALID_CALLBACK 0x00000100U /*!< Invalid Callback error */ -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup I2C_handle_Structure_definition I2C handle Structure definition - * @brief I2C handle Structure definition - * @{ - */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -typedef struct __I2C_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -{ - I2C_TypeDef *Instance; /*!< I2C registers base address */ - - I2C_InitTypeDef Init; /*!< I2C communication parameters */ - - uint8_t *pBuffPtr; /*!< Pointer to I2C transfer buffer */ - - uint16_t XferSize; /*!< I2C transfer size */ - - __IO uint16_t XferCount; /*!< I2C transfer counter */ - - __IO uint32_t XferOptions; /*!< I2C transfer options */ - - __IO uint32_t PreviousState; /*!< I2C communication Previous state and mode - context for internal usage */ - - DMA_HandleTypeDef *hdmatx; /*!< I2C Tx DMA handle parameters */ - - DMA_HandleTypeDef *hdmarx; /*!< I2C Rx DMA handle parameters */ - - HAL_LockTypeDef Lock; /*!< I2C locking object */ - - __IO HAL_I2C_StateTypeDef State; /*!< I2C communication state */ - - __IO HAL_I2C_ModeTypeDef Mode; /*!< I2C communication mode */ - - __IO uint32_t ErrorCode; /*!< I2C Error code */ - - __IO uint32_t Devaddress; /*!< I2C Target device address */ - - __IO uint32_t Memaddress; /*!< I2C Target memory address */ - - __IO uint32_t MemaddSize; /*!< I2C Target memory address size */ - - __IO uint32_t EventCount; /*!< I2C Event counter */ - - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Master Tx Transfer completed callback */ - void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Master Rx Transfer completed callback */ - void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Slave Tx Transfer completed callback */ - void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Slave Rx Transfer completed callback */ - void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Listen Complete callback */ - void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Memory Tx Transfer completed callback */ - void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Memory Rx Transfer completed callback */ - void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Error callback */ - void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Abort callback */ - - void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< I2C Slave Address Match callback */ - - void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Msp Init callback */ - void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Msp DeInit callback */ - -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -} I2C_HandleTypeDef; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -/** - * @brief HAL I2C Callback ID enumeration definition - */ -typedef enum -{ - HAL_I2C_MASTER_TX_COMPLETE_CB_ID = 0x00U, /*!< I2C Master Tx Transfer completed callback ID */ - HAL_I2C_MASTER_RX_COMPLETE_CB_ID = 0x01U, /*!< I2C Master Rx Transfer completed callback ID */ - HAL_I2C_SLAVE_TX_COMPLETE_CB_ID = 0x02U, /*!< I2C Slave Tx Transfer completed callback ID */ - HAL_I2C_SLAVE_RX_COMPLETE_CB_ID = 0x03U, /*!< I2C Slave Rx Transfer completed callback ID */ - HAL_I2C_LISTEN_COMPLETE_CB_ID = 0x04U, /*!< I2C Listen Complete callback ID */ - HAL_I2C_MEM_TX_COMPLETE_CB_ID = 0x05U, /*!< I2C Memory Tx Transfer callback ID */ - HAL_I2C_MEM_RX_COMPLETE_CB_ID = 0x06U, /*!< I2C Memory Rx Transfer completed callback ID */ - HAL_I2C_ERROR_CB_ID = 0x07U, /*!< I2C Error callback ID */ - HAL_I2C_ABORT_CB_ID = 0x08U, /*!< I2C Abort callback ID */ - - HAL_I2C_MSPINIT_CB_ID = 0x09U, /*!< I2C Msp Init callback ID */ - HAL_I2C_MSPDEINIT_CB_ID = 0x0AU /*!< I2C Msp DeInit callback ID */ - -} HAL_I2C_CallbackIDTypeDef; - -/** - * @brief HAL I2C Callback pointer definition - */ -typedef void (*pI2C_CallbackTypeDef)(I2C_HandleTypeDef *hi2c); /*!< pointer to an I2C callback function */ -typedef void (*pI2C_AddrCallbackTypeDef)(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< pointer to an I2C Address Match callback function */ - -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** - * @} - */ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup I2C_Exported_Constants I2C Exported Constants - * @{ - */ - -/** @defgroup I2C_duty_cycle_in_fast_mode I2C duty cycle in fast mode - * @{ - */ -#define I2C_DUTYCYCLE_2 0x00000000U -#define I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY -/** - * @} - */ - -/** @defgroup I2C_addressing_mode I2C addressing mode - * @{ - */ -#define I2C_ADDRESSINGMODE_7BIT 0x00004000U -#define I2C_ADDRESSINGMODE_10BIT (I2C_OAR1_ADDMODE | 0x00004000U) -/** - * @} - */ - -/** @defgroup I2C_dual_addressing_mode I2C dual addressing mode - * @{ - */ -#define I2C_DUALADDRESS_DISABLE 0x00000000U -#define I2C_DUALADDRESS_ENABLE I2C_OAR2_ENDUAL -/** - * @} - */ - -/** @defgroup I2C_general_call_addressing_mode I2C general call addressing mode - * @{ - */ -#define I2C_GENERALCALL_DISABLE 0x00000000U -#define I2C_GENERALCALL_ENABLE I2C_CR1_ENGC -/** - * @} - */ - -/** @defgroup I2C_nostretch_mode I2C nostretch mode - * @{ - */ -#define I2C_NOSTRETCH_DISABLE 0x00000000U -#define I2C_NOSTRETCH_ENABLE I2C_CR1_NOSTRETCH -/** - * @} - */ - -/** @defgroup I2C_Memory_Address_Size I2C Memory Address Size - * @{ - */ -#define I2C_MEMADD_SIZE_8BIT 0x00000001U -#define I2C_MEMADD_SIZE_16BIT 0x00000010U -/** - * @} - */ - -/** @defgroup I2C_XferDirection_definition I2C XferDirection definition - * @{ - */ -#define I2C_DIRECTION_RECEIVE 0x00000000U -#define I2C_DIRECTION_TRANSMIT 0x00000001U -/** - * @} - */ - -/** @defgroup I2C_XferOptions_definition I2C XferOptions definition - * @{ - */ -#define I2C_FIRST_FRAME 0x00000001U -#define I2C_FIRST_AND_NEXT_FRAME 0x00000002U -#define I2C_NEXT_FRAME 0x00000004U -#define I2C_FIRST_AND_LAST_FRAME 0x00000008U -#define I2C_LAST_FRAME_NO_STOP 0x00000010U -#define I2C_LAST_FRAME 0x00000020U - -/* List of XferOptions in usage of : - * 1- Restart condition in all use cases (direction change or not) - */ -#define I2C_OTHER_FRAME (0x00AA0000U) -#define I2C_OTHER_AND_LAST_FRAME (0xAA000000U) -/** - * @} - */ - -/** @defgroup I2C_Interrupt_configuration_definition I2C Interrupt configuration definition - * @brief I2C Interrupt definition - * Elements values convention: 0xXXXXXXXX - * - XXXXXXXX : Interrupt control mask - * @{ - */ -#define I2C_IT_BUF I2C_CR2_ITBUFEN -#define I2C_IT_EVT I2C_CR2_ITEVTEN -#define I2C_IT_ERR I2C_CR2_ITERREN -/** - * @} - */ - -/** @defgroup I2C_Flag_definition I2C Flag definition - * @{ - */ - -#define I2C_FLAG_OVR 0x00010800U -#define I2C_FLAG_AF 0x00010400U -#define I2C_FLAG_ARLO 0x00010200U -#define I2C_FLAG_BERR 0x00010100U -#define I2C_FLAG_TXE 0x00010080U -#define I2C_FLAG_RXNE 0x00010040U -#define I2C_FLAG_STOPF 0x00010010U -#define I2C_FLAG_ADD10 0x00010008U -#define I2C_FLAG_BTF 0x00010004U -#define I2C_FLAG_ADDR 0x00010002U -#define I2C_FLAG_SB 0x00010001U -#define I2C_FLAG_DUALF 0x00100080U -#define I2C_FLAG_GENCALL 0x00100010U -#define I2C_FLAG_TRA 0x00100004U -#define I2C_FLAG_BUSY 0x00100002U -#define I2C_FLAG_MSL 0x00100001U -/** - * @} - */ - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ - -/** @defgroup I2C_Exported_Macros I2C Exported Macros - * @{ - */ - -/** @brief Reset I2C handle state. - * @param __HANDLE__ specifies the I2C Handle. - * @retval None - */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) do{ \ - (__HANDLE__)->State = HAL_I2C_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_I2C_STATE_RESET) -#endif - -/** @brief Enable or disable the specified I2C interrupts. - * @param __HANDLE__ specifies the I2C Handle. - * @param __INTERRUPT__ specifies the interrupt source to enable or disable. - * This parameter can be one of the following values: - * @arg I2C_IT_BUF: Buffer interrupt enable - * @arg I2C_IT_EVT: Event interrupt enable - * @arg I2C_IT_ERR: Error interrupt enable - * @retval None - */ -#define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BIT((__HANDLE__)->Instance->CR2,(__INTERRUPT__)) -#define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__) CLEAR_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__)) - -/** @brief Checks if the specified I2C interrupt source is enabled or disabled. - * @param __HANDLE__ specifies the I2C Handle. - * @param __INTERRUPT__ specifies the I2C interrupt source to check. - * This parameter can be one of the following values: - * @arg I2C_IT_BUF: Buffer interrupt enable - * @arg I2C_IT_EVT: Event interrupt enable - * @arg I2C_IT_ERR: Error interrupt enable - * @retval The new state of __INTERRUPT__ (TRUE or FALSE). - */ -#define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) - -/** @brief Checks whether the specified I2C flag is set or not. - * @param __HANDLE__ specifies the I2C Handle. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg I2C_FLAG_OVR: Overrun/Underrun flag - * @arg I2C_FLAG_AF: Acknowledge failure flag - * @arg I2C_FLAG_ARLO: Arbitration lost flag - * @arg I2C_FLAG_BERR: Bus error flag - * @arg I2C_FLAG_TXE: Data register empty flag - * @arg I2C_FLAG_RXNE: Data register not empty flag - * @arg I2C_FLAG_STOPF: Stop detection flag - * @arg I2C_FLAG_ADD10: 10-bit header sent flag - * @arg I2C_FLAG_BTF: Byte transfer finished flag - * @arg I2C_FLAG_ADDR: Address sent flag - * Address matched flag - * @arg I2C_FLAG_SB: Start bit flag - * @arg I2C_FLAG_DUALF: Dual flag - * @arg I2C_FLAG_GENCALL: General call header flag - * @arg I2C_FLAG_TRA: Transmitter/Receiver flag - * @arg I2C_FLAG_BUSY: Bus busy flag - * @arg I2C_FLAG_MSL: Master/Slave flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) ((((uint8_t)((__FLAG__) >> 16U)) == 0x01U) ? \ - (((((__HANDLE__)->Instance->SR1) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET) : \ - (((((__HANDLE__)->Instance->SR2) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET)) - -/** @brief Clears the I2C pending flags which are cleared by writing 0 in a specific bit. - * @param __HANDLE__ specifies the I2C Handle. - * @param __FLAG__ specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) - * @arg I2C_FLAG_AF: Acknowledge failure flag - * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) - * @arg I2C_FLAG_BERR: Bus error flag - * @retval None - */ -#define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR1 = ~((__FLAG__) & I2C_FLAG_MASK)) - -/** @brief Clears the I2C ADDR pending flag. - * @param __HANDLE__ specifies the I2C Handle. - * This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral. - * @retval None - */ -#define __HAL_I2C_CLEAR_ADDRFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg = 0x00U; \ - tmpreg = (__HANDLE__)->Instance->SR1; \ - tmpreg = (__HANDLE__)->Instance->SR2; \ - UNUSED(tmpreg); \ - } while(0) - -/** @brief Clears the I2C STOPF pending flag. - * @param __HANDLE__ specifies the I2C Handle. - * @retval None - */ -#define __HAL_I2C_CLEAR_STOPFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg = 0x00U; \ - tmpreg = (__HANDLE__)->Instance->SR1; \ - SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE); \ - UNUSED(tmpreg); \ - } while(0) - -/** @brief Enable the specified I2C peripheral. - * @param __HANDLE__ specifies the I2C Handle. - * @retval None - */ -#define __HAL_I2C_ENABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE) - -/** @brief Disable the specified I2C peripheral. - * @param __HANDLE__ specifies the I2C Handle. - * @retval None - */ -#define __HAL_I2C_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE) - -/** - * @} - */ - -/* Include I2C HAL Extension module */ -#include "stm32f4xx_hal_i2c_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup I2C_Exported_Functions - * @{ - */ - -/** @addtogroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -/* Initialization and de-initialization functions******************************/ -HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c); -HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID); - -HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @addtogroup I2C_Exported_Functions_Group2 Input and Output operation functions - * @{ - */ -/* IO operation functions ****************************************************/ -/******* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout); - -/******* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); - -HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c); -HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c); -HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress); - -/******* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); - -HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -/** - * @} - */ - -/** @addtogroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @{ - */ -/******* I2C IRQHandler and Callbacks used in non blocking modes (Interrupt and DMA) */ -void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c); -void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); -void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c); -/** - * @} - */ - -/** @addtogroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions - * @{ - */ -/* Peripheral State, Mode and Error functions *********************************/ -HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c); -HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c); -uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c); - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup I2C_Private_Constants I2C Private Constants - * @{ - */ -#define I2C_FLAG_MASK 0x0000FFFFU -#define I2C_MIN_PCLK_FREQ_STANDARD 2000000U /*!< 2 MHz */ -#define I2C_MIN_PCLK_FREQ_FAST 4000000U /*!< 4 MHz */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup I2C_Private_Macros I2C Private Macros - * @{ - */ - -#define I2C_MIN_PCLK_FREQ(__PCLK__, __SPEED__) (((__SPEED__) <= 100000U) ? ((__PCLK__) < I2C_MIN_PCLK_FREQ_STANDARD) : ((__PCLK__) < I2C_MIN_PCLK_FREQ_FAST)) -#define I2C_CCR_CALCULATION(__PCLK__, __SPEED__, __COEFF__) (((((__PCLK__) - 1U)/((__SPEED__) * (__COEFF__))) + 1U) & I2C_CCR_CCR) -#define I2C_FREQRANGE(__PCLK__) ((__PCLK__)/1000000U) -#define I2C_RISE_TIME(__FREQRANGE__, __SPEED__) (((__SPEED__) <= 100000U) ? ((__FREQRANGE__) + 1U) : ((((__FREQRANGE__) * 300U) / 1000U) + 1U)) -#define I2C_SPEED_STANDARD(__PCLK__, __SPEED__) ((I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U) < 4U)? 4U:I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U)) -#define I2C_SPEED_FAST(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__DUTYCYCLE__) == I2C_DUTYCYCLE_2)? I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 3U) : (I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 25U) | I2C_DUTYCYCLE_16_9)) -#define I2C_SPEED(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__SPEED__) <= 100000U)? (I2C_SPEED_STANDARD((__PCLK__), (__SPEED__))) : \ - ((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__)) & I2C_CCR_CCR) == 0U)? 1U : \ - ((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__))) | I2C_CCR_FS)) - -#define I2C_7BIT_ADD_WRITE(__ADDRESS__) ((uint8_t)((__ADDRESS__) & (uint8_t)(~I2C_OAR1_ADD0))) -#define I2C_7BIT_ADD_READ(__ADDRESS__) ((uint8_t)((__ADDRESS__) | I2C_OAR1_ADD0)) - -#define I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF))) -#define I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)0x00F0))) -#define I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)(0x00F1)))) - -#define I2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0xFF00)) >> 8))) -#define I2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF))) - -/** @defgroup I2C_IS_RTC_Definitions I2C Private macros to check input parameters - * @{ - */ -#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DUTYCYCLE_2) || \ - ((CYCLE) == I2C_DUTYCYCLE_16_9)) -#define IS_I2C_ADDRESSING_MODE(ADDRESS) (((ADDRESS) == I2C_ADDRESSINGMODE_7BIT) || \ - ((ADDRESS) == I2C_ADDRESSINGMODE_10BIT)) -#define IS_I2C_DUAL_ADDRESS(ADDRESS) (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \ - ((ADDRESS) == I2C_DUALADDRESS_ENABLE)) -#define IS_I2C_GENERAL_CALL(CALL) (((CALL) == I2C_GENERALCALL_DISABLE) || \ - ((CALL) == I2C_GENERALCALL_ENABLE)) -#define IS_I2C_NO_STRETCH(STRETCH) (((STRETCH) == I2C_NOSTRETCH_DISABLE) || \ - ((STRETCH) == I2C_NOSTRETCH_ENABLE)) -#define IS_I2C_MEMADD_SIZE(SIZE) (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \ - ((SIZE) == I2C_MEMADD_SIZE_16BIT)) -#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) > 0U) && ((SPEED) <= 400000U)) -#define IS_I2C_OWN_ADDRESS1(ADDRESS1) (((ADDRESS1) & 0xFFFFFC00U) == 0U) -#define IS_I2C_OWN_ADDRESS2(ADDRESS2) (((ADDRESS2) & 0xFFFFFF01U) == 0U) -#define IS_I2C_TRANSFER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_FIRST_FRAME) || \ - ((REQUEST) == I2C_FIRST_AND_NEXT_FRAME) || \ - ((REQUEST) == I2C_NEXT_FRAME) || \ - ((REQUEST) == I2C_FIRST_AND_LAST_FRAME) || \ - ((REQUEST) == I2C_LAST_FRAME) || \ - ((REQUEST) == I2C_LAST_FRAME_NO_STOP) || \ - IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST)) - -#define IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_OTHER_FRAME) || \ - ((REQUEST) == I2C_OTHER_AND_LAST_FRAME)) - -#define I2C_CHECK_FLAG(__ISR__, __FLAG__) ((((__ISR__) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET) -#define I2C_CHECK_IT_SOURCE(__CR1__, __IT__) ((((__CR1__) & (__IT__)) == (__IT__)) ? SET : RESET) -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup I2C_Private_Functions I2C Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_HAL_I2C_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h deleted file mode 100644 index 31ad99c..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h +++ /dev/null @@ -1,115 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_i2c_ex.h - * @author MCD Application Team - * @brief Header file of I2C HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_I2C_EX_H -#define __STM32F4xx_HAL_I2C_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup I2CEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2CEx_Exported_Constants I2C Exported Constants - * @{ - */ - -/** @defgroup I2CEx_Analog_Filter I2C Analog Filter - * @{ - */ -#define I2C_ANALOGFILTER_ENABLE 0x00000000U -#define I2C_ANALOGFILTER_DISABLE I2C_FLTR_ANOFF -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup I2CEx_Exported_Functions - * @{ - */ - -/** @addtogroup I2CEx_Exported_Functions_Group1 - * @{ - */ -/* Peripheral Control functions ************************************************/ -HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t AnalogFilter); -HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup I2CEx_Private_Constants I2C Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup I2CEx_Private_Macros I2C Private Macros - * @{ - */ -#define IS_I2C_ANALOG_FILTER(FILTER) (((FILTER) == I2C_ANALOGFILTER_ENABLE) || \ - ((FILTER) == I2C_ANALOGFILTER_DISABLE)) -#define IS_I2C_DIGITAL_FILTER(FILTER) ((FILTER) <= 0x0000000FU) -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_I2C_EX_H */ - - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h deleted file mode 100644 index de1ec24..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h +++ /dev/null @@ -1,461 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pcd.h - * @author MCD Application Team - * @brief Header file of PCD HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_PCD_H -#define STM32F4xx_HAL_PCD_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_ll_usb.h" - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PCD - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup PCD_Exported_Types PCD Exported Types - * @{ - */ - -/** - * @brief PCD State structure definition - */ -typedef enum -{ - HAL_PCD_STATE_RESET = 0x00, - HAL_PCD_STATE_READY = 0x01, - HAL_PCD_STATE_ERROR = 0x02, - HAL_PCD_STATE_BUSY = 0x03, - HAL_PCD_STATE_TIMEOUT = 0x04 -} PCD_StateTypeDef; - -/* Device LPM suspend state */ -typedef enum -{ - LPM_L0 = 0x00, /* on */ - LPM_L1 = 0x01, /* LPM L1 sleep */ - LPM_L2 = 0x02, /* suspend */ - LPM_L3 = 0x03, /* off */ -} PCD_LPM_StateTypeDef; - -typedef enum -{ - PCD_LPM_L0_ACTIVE = 0x00, /* on */ - PCD_LPM_L1_ACTIVE = 0x01, /* LPM L1 sleep */ -} PCD_LPM_MsgTypeDef; - -typedef enum -{ - PCD_BCD_ERROR = 0xFF, - PCD_BCD_CONTACT_DETECTION = 0xFE, - PCD_BCD_STD_DOWNSTREAM_PORT = 0xFD, - PCD_BCD_CHARGING_DOWNSTREAM_PORT = 0xFC, - PCD_BCD_DEDICATED_CHARGING_PORT = 0xFB, - PCD_BCD_DISCOVERY_COMPLETED = 0x00, - -} PCD_BCD_MsgTypeDef; - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -typedef USB_OTG_GlobalTypeDef PCD_TypeDef; -typedef USB_OTG_CfgTypeDef PCD_InitTypeDef; -typedef USB_OTG_EPTypeDef PCD_EPTypeDef; -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -/** - * @brief PCD Handle Structure definition - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -typedef struct __PCD_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - PCD_TypeDef *Instance; /*!< Register base address */ - PCD_InitTypeDef Init; /*!< PCD required parameters */ - __IO uint8_t USB_Address; /*!< USB Address */ - PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ - PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ - HAL_LockTypeDef Lock; /*!< PCD peripheral status */ - __IO PCD_StateTypeDef State; /*!< PCD communication state */ - __IO uint32_t ErrorCode; /*!< PCD Error code */ - uint32_t Setup[12]; /*!< Setup packet buffer */ - PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ - uint32_t BESL; - uint32_t FrameNumber; /*!< Store Current Frame number */ - - - uint32_t lpm_active; /*!< Enable or disable the Link Power Management . - This parameter can be set to ENABLE or DISABLE */ - - uint32_t battery_charging_active; /*!< Enable or disable Battery charging. - This parameter can be set to ENABLE or DISABLE */ - void *pData; /*!< Pointer to upper stack Handler */ - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - void (* SOFCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD SOF callback */ - void (* SetupStageCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Setup Stage callback */ - void (* ResetCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Reset callback */ - void (* SuspendCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Suspend callback */ - void (* ResumeCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Resume callback */ - void (* ConnectCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Connect callback */ - void (* DisconnectCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Disconnect callback */ - - void (* DataOutStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD Data OUT Stage callback */ - void (* DataInStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD Data IN Stage callback */ - void (* ISOOUTIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD ISO OUT Incomplete callback */ - void (* ISOINIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD ISO IN Incomplete callback */ - void (* BCDCallback)(struct __PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg); /*!< USB OTG PCD BCD callback */ - void (* LPMCallback)(struct __PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); /*!< USB OTG PCD LPM callback */ - - void (* MspInitCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Msp Init callback */ - void (* MspDeInitCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Msp DeInit callback */ -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -} PCD_HandleTypeDef; - -/** - * @} - */ - -/* Include PCD HAL Extended module */ -#include "stm32f4xx_hal_pcd_ex.h" - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PCD_Exported_Constants PCD Exported Constants - * @{ - */ - -/** @defgroup PCD_Speed PCD Speed - * @{ - */ -#define PCD_SPEED_HIGH USBD_HS_SPEED -#define PCD_SPEED_HIGH_IN_FULL USBD_HSINFS_SPEED -#define PCD_SPEED_FULL USBD_FS_SPEED -/** - * @} - */ - -/** @defgroup PCD_PHY_Module PCD PHY Module - * @{ - */ -#define PCD_PHY_ULPI 1U -#define PCD_PHY_EMBEDDED 2U -#define PCD_PHY_UTMI 3U -/** - * @} - */ - -/** @defgroup PCD_Error_Code_definition PCD Error Code definition - * @brief PCD Error Code definition - * @{ - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -#define HAL_PCD_ERROR_INVALID_CALLBACK (0x00000010U) /*!< Invalid Callback error */ -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup PCD_Exported_Macros PCD Exported Macros - * @brief macros to handle interrupts and specific clock configurations - * @{ - */ -#define __HAL_PCD_ENABLE(__HANDLE__) (void)USB_EnableGlobalInt ((__HANDLE__)->Instance) -#define __HAL_PCD_DISABLE(__HANDLE__) (void)USB_DisableGlobalInt ((__HANDLE__)->Instance) - -#define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__) \ - ((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__)) - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->GINTSTS) &= (__INTERRUPT__)) -#define __HAL_PCD_IS_INVALID_INTERRUPT(__HANDLE__) (USB_ReadInterrupts((__HANDLE__)->Instance) == 0U) - -#define __HAL_PCD_UNGATE_PHYCLOCK(__HANDLE__) \ - *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) &= ~(USB_OTG_PCGCCTL_STOPCLK) - -#define __HAL_PCD_GATE_PHYCLOCK(__HANDLE__) \ - *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) |= USB_OTG_PCGCCTL_STOPCLK - -#define __HAL_PCD_IS_PHY_SUSPENDED(__HANDLE__) \ - ((*(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE)) & 0x10U) - -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= (USB_OTG_HS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_HS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = (USB_OTG_HS_WAKEUP_EXTI_LINE) - -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ - do { \ - EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE); \ - EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE; \ - } while(0U) -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= USB_OTG_FS_WAKEUP_EXTI_LINE -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_FS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = USB_OTG_FS_WAKEUP_EXTI_LINE - -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ - do { \ - EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE); \ - EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE; \ - } while(0U) -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PCD_Exported_Functions PCD Exported Functions - * @{ - */ - -/* Initialization/de-initialization functions ********************************/ -/** @addtogroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd); -void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd); -void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd); - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -/** @defgroup HAL_PCD_Callback_ID_enumeration_definition HAL USB OTG PCD Callback ID enumeration definition - * @brief HAL USB OTG PCD Callback ID enumeration definition - * @{ - */ -typedef enum -{ - HAL_PCD_SOF_CB_ID = 0x01, /*!< USB PCD SOF callback ID */ - HAL_PCD_SETUPSTAGE_CB_ID = 0x02, /*!< USB PCD Setup Stage callback ID */ - HAL_PCD_RESET_CB_ID = 0x03, /*!< USB PCD Reset callback ID */ - HAL_PCD_SUSPEND_CB_ID = 0x04, /*!< USB PCD Suspend callback ID */ - HAL_PCD_RESUME_CB_ID = 0x05, /*!< USB PCD Resume callback ID */ - HAL_PCD_CONNECT_CB_ID = 0x06, /*!< USB PCD Connect callback ID */ - HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ - - HAL_PCD_MSPINIT_CB_ID = 0x08, /*!< USB PCD MspInit callback ID */ - HAL_PCD_MSPDEINIT_CB_ID = 0x09 /*!< USB PCD MspDeInit callback ID */ - -} HAL_PCD_CallbackIDTypeDef; -/** - * @} - */ - -/** @defgroup HAL_PCD_Callback_pointer_definition HAL USB OTG PCD Callback pointer definition - * @brief HAL USB OTG PCD Callback pointer definition - * @{ - */ - -typedef void (*pPCD_CallbackTypeDef)(PCD_HandleTypeDef *hpcd); /*!< pointer to a common USB OTG PCD callback function */ -typedef void (*pPCD_DataOutStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD Data OUT Stage callback */ -typedef void (*pPCD_DataInStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD Data IN Stage callback */ -typedef void (*pPCD_IsoOutIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD ISO OUT Incomplete callback */ -typedef void (*pPCD_IsoInIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD ISO IN Incomplete callback */ -typedef void (*pPCD_LpmCallbackTypeDef)(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); /*!< pointer to USB OTG PCD LPM callback */ -typedef void (*pPCD_BcdCallbackTypeDef)(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg); /*!< pointer to USB OTG PCD BCD callback */ - -/** - * @} - */ - -HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID, - pPCD_CallbackTypeDef pCallback); - -HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID); - -HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, - pPCD_DataOutStageCallbackTypeDef pCallback); - -HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd); - -HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, - pPCD_DataInStageCallbackTypeDef pCallback); - -HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd); - -HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, - pPCD_IsoOutIncpltCallbackTypeDef pCallback); - -HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd); - -HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, - pPCD_IsoInIncpltCallbackTypeDef pCallback); - -HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd); - -HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, pPCD_BcdCallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_PCD_UnRegisterBcdCallback(PCD_HandleTypeDef *hpcd); - -HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_PCD_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* I/O operation functions ***************************************************/ -/* Non-Blocking mode: Interrupt */ -/** @addtogroup PCD_Exported_Functions_Group2 Input and Output operation functions - * @{ - */ -HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd); -void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd); -void HAL_PCD_WKUP_IRQHandler(PCD_HandleTypeDef *hpcd); - -void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd); - -void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); -void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); -void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); -void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); -/** - * @} - */ - -/* Peripheral Control functions **********************************************/ -/** @addtogroup PCD_Exported_Functions_Group3 Peripheral Control functions - * @{ - */ -HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address); -HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type); -HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len); -HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len); -HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_EP_Abort(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd); -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -HAL_StatusTypeDef HAL_PCD_SetTestMode(const PCD_HandleTypeDef *hpcd, uint8_t testmode); -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef const *hpcd, uint8_t ep_addr); -/** - * @} - */ - -/* Peripheral State functions ************************************************/ -/** @addtogroup PCD_Exported_Functions_Group4 Peripheral State functions - * @{ - */ -PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef const *hpcd); -/** - * @} - */ - -/** - * @} - */ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PCD_Private_Constants PCD Private Constants - * @{ - */ -/** @defgroup USB_EXTI_Line_Interrupt USB EXTI line interrupt - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -#define USB_OTG_FS_WAKEUP_EXTI_LINE (0x1U << 18) /*!< USB FS EXTI Line WakeUp Interrupt */ -#define USB_OTG_HS_WAKEUP_EXTI_LINE (0x1U << 20) /*!< USB HS EXTI Line WakeUp Interrupt */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - - -/** - * @} - */ -/** - * @} - */ - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -#ifndef USB_OTG_DOEPINT_OTEPSPR -#define USB_OTG_DOEPINT_OTEPSPR (0x1UL << 5) /*!< Status Phase Received interrupt */ -#endif /* defined USB_OTG_DOEPINT_OTEPSPR */ - -#ifndef USB_OTG_DOEPMSK_OTEPSPRM -#define USB_OTG_DOEPMSK_OTEPSPRM (0x1UL << 5) /*!< Setup Packet Received interrupt mask */ -#endif /* defined USB_OTG_DOEPMSK_OTEPSPRM */ - -#ifndef USB_OTG_DOEPINT_NAK -#define USB_OTG_DOEPINT_NAK (0x1UL << 13) /*!< NAK interrupt */ -#endif /* defined USB_OTG_DOEPINT_NAK */ - -#ifndef USB_OTG_DOEPMSK_NAKM -#define USB_OTG_DOEPMSK_NAKM (0x1UL << 13) /*!< OUT Packet NAK interrupt mask */ -#endif /* defined USB_OTG_DOEPMSK_NAKM */ - -#ifndef USB_OTG_DOEPINT_STPKTRX -#define USB_OTG_DOEPINT_STPKTRX (0x1UL << 15) /*!< Setup Packet Received interrupt */ -#endif /* defined USB_OTG_DOEPINT_STPKTRX */ - -#ifndef USB_OTG_DOEPMSK_NYETM -#define USB_OTG_DOEPMSK_NYETM (0x1UL << 14) /*!< Setup Packet Received interrupt mask */ -#endif /* defined USB_OTG_DOEPMSK_NYETM */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PCD_Private_Macros PCD Private Macros - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_PCD_H */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd_ex.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd_ex.h deleted file mode 100644 index 284c9d5..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd_ex.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pcd_ex.h - * @author MCD Application Team - * @brief Header file of PCD HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_PCD_EX_H -#define STM32F4xx_HAL_PCD_EX_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PCDEx - * @{ - */ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PCDEx_Exported_Functions PCDEx Exported Functions - * @{ - */ -/** @addtogroup PCDEx_Exported_Functions_Group1 Peripheral Control functions - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size); -HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size); -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \ - || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \ - || defined(STM32F423xx) -HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd); -#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || - defined(STM32F423xx) */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) \ - || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -HAL_StatusTypeDef HAL_PCDEx_ActivateBCD(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCDEx_DeActivateBCD(PCD_HandleTypeDef *hpcd); -void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd); -#endif /* defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) */ -void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); -void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* STM32F4xx_HAL_PCD_EX_H */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h deleted file mode 100644 index a7273d5..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h +++ /dev/null @@ -1,436 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr.h - * @author MCD Application Team - * @brief Header file of PWR HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_PWR_H -#define __STM32F4xx_HAL_PWR_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PWR - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup PWR_Exported_Types PWR Exported Types - * @{ - */ - -/** - * @brief PWR PVD configuration structure definition - */ -typedef struct -{ - uint32_t PVDLevel; /*!< PVDLevel: Specifies the PVD detection level. - This parameter can be a value of @ref PWR_PVD_detection_level */ - - uint32_t Mode; /*!< Mode: Specifies the operating mode for the selected pins. - This parameter can be a value of @ref PWR_PVD_Mode */ -}PWR_PVDTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWR_Exported_Constants PWR Exported Constants - * @{ - */ - -/** @defgroup PWR_WakeUp_Pins PWR WakeUp Pins - * @{ - */ -#define PWR_WAKEUP_PIN1 0x00000100U -/** - * @} - */ - -/** @defgroup PWR_PVD_detection_level PWR PVD detection level - * @{ - */ -#define PWR_PVDLEVEL_0 PWR_CR_PLS_LEV0 -#define PWR_PVDLEVEL_1 PWR_CR_PLS_LEV1 -#define PWR_PVDLEVEL_2 PWR_CR_PLS_LEV2 -#define PWR_PVDLEVEL_3 PWR_CR_PLS_LEV3 -#define PWR_PVDLEVEL_4 PWR_CR_PLS_LEV4 -#define PWR_PVDLEVEL_5 PWR_CR_PLS_LEV5 -#define PWR_PVDLEVEL_6 PWR_CR_PLS_LEV6 -#define PWR_PVDLEVEL_7 PWR_CR_PLS_LEV7/* External input analog voltage - (Compare internally to VREFINT) */ -/** - * @} - */ - -/** @defgroup PWR_PVD_Mode PWR PVD Mode - * @{ - */ -#define PWR_PVD_MODE_NORMAL 0x00000000U /*!< basic mode is used */ -#define PWR_PVD_MODE_IT_RISING 0x00010001U /*!< External Interrupt Mode with Rising edge trigger detection */ -#define PWR_PVD_MODE_IT_FALLING 0x00010002U /*!< External Interrupt Mode with Falling edge trigger detection */ -#define PWR_PVD_MODE_IT_RISING_FALLING 0x00010003U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ -#define PWR_PVD_MODE_EVENT_RISING 0x00020001U /*!< Event Mode with Rising edge trigger detection */ -#define PWR_PVD_MODE_EVENT_FALLING 0x00020002U /*!< Event Mode with Falling edge trigger detection */ -#define PWR_PVD_MODE_EVENT_RISING_FALLING 0x00020003U /*!< Event Mode with Rising/Falling edge trigger detection */ -/** - * @} - */ - - -/** @defgroup PWR_Regulator_state_in_STOP_mode PWR Regulator state in SLEEP/STOP mode - * @{ - */ -#define PWR_MAINREGULATOR_ON 0x00000000U -#define PWR_LOWPOWERREGULATOR_ON PWR_CR_LPDS -/** - * @} - */ - -/** @defgroup PWR_SLEEP_mode_entry PWR SLEEP mode entry - * @{ - */ -#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01) -#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02) -#define PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR ((uint8_t)0x03) - -/** - * @} - */ - -/** @defgroup PWR_STOP_mode_entry PWR STOP mode entry - * @{ - */ -#define PWR_STOPENTRY_WFI ((uint8_t)0x01) -#define PWR_STOPENTRY_WFE ((uint8_t)0x02) -#define PWR_STOPENTRY_WFE_NO_EVT_CLEAR ((uint8_t)0x03) -/** - * @} - */ - -/** @defgroup PWR_Flag PWR Flag - * @{ - */ -#define PWR_FLAG_WU PWR_CSR_WUF -#define PWR_FLAG_SB PWR_CSR_SBF -#define PWR_FLAG_PVDO PWR_CSR_PVDO -#define PWR_FLAG_BRR PWR_CSR_BRR -#define PWR_FLAG_VOSRDY PWR_CSR_VOSRDY -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWR_Exported_Macro PWR Exported Macro - * @{ - */ - -/** @brief Check PWR flag is set or not. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag. This flag indicates that a wakeup event - * was received from the WKUP pin or from the RTC alarm (Alarm A - * or Alarm B), RTC Tamper event, RTC TimeStamp event or RTC Wakeup. - * An additional wakeup event is detected if the WKUP pin is enabled - * (by setting the EWUP bit) when the WKUP pin level is already high. - * @arg PWR_FLAG_SB: StandBy flag. This flag indicates that the system was - * resumed from StandBy mode. - * @arg PWR_FLAG_PVDO: PVD Output. This flag is valid only if PVD is enabled - * by the HAL_PWR_EnablePVD() function. The PVD is stopped by Standby mode - * For this reason, this bit is equal to 0 after Standby or reset - * until the PVDE bit is set. - * @arg PWR_FLAG_BRR: Backup regulator ready flag. This bit is not reset - * when the device wakes up from Standby mode or by a system reset - * or power reset. - * @arg PWR_FLAG_VOSRDY: This flag indicates that the Regulator voltage - * scaling output selection is ready. - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_PWR_GET_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the PWR's pending flags. - * @param __FLAG__ specifies the flag to clear. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag - * @arg PWR_FLAG_SB: StandBy flag - */ -#define __HAL_PWR_CLEAR_FLAG(__FLAG__) (PWR->CR |= (__FLAG__) << 2U) - -/** - * @brief Enable the PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_IT() (EXTI->IMR |= (PWR_EXTI_LINE_PVD)) - -/** - * @brief Disable the PVD EXTI Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_IT() (EXTI->IMR &= ~(PWR_EXTI_LINE_PVD)) - -/** - * @brief Enable event on PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_EVENT() (EXTI->EMR |= (PWR_EXTI_LINE_PVD)) - -/** - * @brief Disable event on PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_EVENT() (EXTI->EMR &= ~(PWR_EXTI_LINE_PVD)) - -/** - * @brief Enable the PVD Extended Interrupt Rising Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE() SET_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) - -/** - * @brief Disable the PVD Extended Interrupt Rising Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE() CLEAR_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) - -/** - * @brief Enable the PVD Extended Interrupt Falling Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE() SET_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) - - -/** - * @brief Disable the PVD Extended Interrupt Falling Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE() CLEAR_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) - - -/** - * @brief PVD EXTI line configuration: set rising & falling edge trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE();\ - __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE();\ - }while(0U) - -/** - * @brief Disable the PVD Extended Interrupt Rising & Falling Trigger. - * This parameter can be: - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();\ - __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE();\ - }while(0U) - -/** - * @brief checks whether the specified PVD Exti interrupt flag is set or not. - * @retval EXTI PVD Line Status. - */ -#define __HAL_PWR_PVD_EXTI_GET_FLAG() (EXTI->PR & (PWR_EXTI_LINE_PVD)) - -/** - * @brief Clear the PVD Exti flag. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_CLEAR_FLAG() (EXTI->PR = (PWR_EXTI_LINE_PVD)) - -/** - * @brief Generates a Software interrupt on PVD EXTI line. - * @retval None - */ -#define __HAL_PWR_PVD_EXTI_GENERATE_SWIT() (EXTI->SWIER |= (PWR_EXTI_LINE_PVD)) - -/** - * @} - */ - -/* Include PWR HAL Extension module */ -#include "stm32f4xx_hal_pwr_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PWR_Exported_Functions PWR Exported Functions - * @{ - */ - -/** @addtogroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_PWR_DeInit(void); -void HAL_PWR_EnableBkUpAccess(void); -void HAL_PWR_DisableBkUpAccess(void); -/** - * @} - */ - -/** @addtogroup PWR_Exported_Functions_Group2 Peripheral Control functions - * @{ - */ -/* Peripheral Control functions **********************************************/ -/* PVD configuration */ -void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD); -void HAL_PWR_EnablePVD(void); -void HAL_PWR_DisablePVD(void); - -/* WakeUp pins configuration */ -void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx); -void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx); - -/* Low Power modes entry */ -void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry); -void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry); -void HAL_PWR_EnterSTANDBYMode(void); - -/* Power PVD IRQ Handler */ -void HAL_PWR_PVD_IRQHandler(void); -void HAL_PWR_PVDCallback(void); - -/* Cortex System Control functions *******************************************/ -void HAL_PWR_EnableSleepOnExit(void); -void HAL_PWR_DisableSleepOnExit(void); -void HAL_PWR_EnableSEVOnPend(void); -void HAL_PWR_DisableSEVOnPend(void); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PWR_Private_Constants PWR Private Constants - * @{ - */ - -/** @defgroup PWR_PVD_EXTI_Line PWR PVD EXTI Line - * @{ - */ -#define PWR_EXTI_LINE_PVD ((uint32_t)EXTI_IMR_MR16) /*!< External interrupt line 16 Connected to the PVD EXTI Line */ -/** - * @} - */ - -/** @defgroup PWR_register_alias_address PWR Register alias address - * @{ - */ -/* ------------- PWR registers bit address in the alias region ---------------*/ -#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) -#define PWR_CR_OFFSET 0x00U -#define PWR_CSR_OFFSET 0x04U -#define PWR_CR_OFFSET_BB (PWR_OFFSET + PWR_CR_OFFSET) -#define PWR_CSR_OFFSET_BB (PWR_OFFSET + PWR_CSR_OFFSET) -/** - * @} - */ - -/** @defgroup PWR_CR_register_alias PWR CR Register alias address - * @{ - */ -/* --- CR Register ---*/ -/* Alias word address of DBP bit */ -#define DBP_BIT_NUMBER PWR_CR_DBP_Pos -#define CR_DBP_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (DBP_BIT_NUMBER * 4U)) - -/* Alias word address of PVDE bit */ -#define PVDE_BIT_NUMBER PWR_CR_PVDE_Pos -#define CR_PVDE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (PVDE_BIT_NUMBER * 4U)) - -/* Alias word address of VOS bit */ -#define VOS_BIT_NUMBER PWR_CR_VOS_Pos -#define CR_VOS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (VOS_BIT_NUMBER * 4U)) -/** - * @} - */ - -/** @defgroup PWR_CSR_register_alias PWR CSR Register alias address - * @{ - */ -/* --- CSR Register ---*/ -/* Alias word address of EWUP bit */ -#define EWUP_BIT_NUMBER PWR_CSR_EWUP_Pos -#define CSR_EWUP_BB (PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (EWUP_BIT_NUMBER * 4U)) -/** - * @} - */ - -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PWR_Private_Macros PWR Private Macros - * @{ - */ - -/** @defgroup PWR_IS_PWR_Definitions PWR Private macros to check input parameters - * @{ - */ -#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLEVEL_0) || ((LEVEL) == PWR_PVDLEVEL_1)|| \ - ((LEVEL) == PWR_PVDLEVEL_2) || ((LEVEL) == PWR_PVDLEVEL_3)|| \ - ((LEVEL) == PWR_PVDLEVEL_4) || ((LEVEL) == PWR_PVDLEVEL_5)|| \ - ((LEVEL) == PWR_PVDLEVEL_6) || ((LEVEL) == PWR_PVDLEVEL_7)) -#define IS_PWR_PVD_MODE(MODE) (((MODE) == PWR_PVD_MODE_IT_RISING)|| ((MODE) == PWR_PVD_MODE_IT_FALLING) || \ - ((MODE) == PWR_PVD_MODE_IT_RISING_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING) || \ - ((MODE) == PWR_PVD_MODE_EVENT_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING_FALLING) || \ - ((MODE) == PWR_PVD_MODE_NORMAL)) -#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_ON) || \ - ((REGULATOR) == PWR_LOWPOWERREGULATOR_ON)) - -#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPENTRY_WFI) || \ - ((ENTRY) == PWR_SLEEPENTRY_WFE) || \ - ((ENTRY) == PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR)) - -#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPENTRY_WFI) || \ - ((ENTRY) == PWR_STOPENTRY_WFE) || \ - ((ENTRY) == PWR_STOPENTRY_WFE_NO_EVT_CLEAR)) -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_HAL_PWR_H */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h deleted file mode 100644 index 57fd4d9..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h +++ /dev/null @@ -1,340 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr_ex.h - * @author MCD Application Team - * @brief Header file of PWR HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_PWR_EX_H -#define __STM32F4xx_HAL_PWR_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PWREx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Constants PWREx Exported Constants - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** @defgroup PWREx_Regulator_state_in_UnderDrive_mode PWREx Regulator state in UnderDrive mode - * @{ - */ -#define PWR_MAINREGULATOR_UNDERDRIVE_ON PWR_CR_MRUDS -#define PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON ((uint32_t)(PWR_CR_LPDS | PWR_CR_LPUDS)) -/** - * @} - */ - -/** @defgroup PWREx_Over_Under_Drive_Flag PWREx Over Under Drive Flag - * @{ - */ -#define PWR_FLAG_ODRDY PWR_CSR_ODRDY -#define PWR_FLAG_ODSWRDY PWR_CSR_ODSWRDY -#define PWR_FLAG_UDRDY PWR_CSR_UDSWRDY -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -/** @defgroup PWREx_Regulator_Voltage_Scale PWREx Regulator Voltage Scale - * @{ - */ -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK = 168 MHz. */ -#define PWR_REGULATOR_VOLTAGE_SCALE2 0x00000000U /* Scale 2 mode: the maximum value of fHCLK = 144 MHz. */ -#else -#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK is 168 MHz. It can be extended to - 180 MHz by activating the over-drive mode. */ -#define PWR_REGULATOR_VOLTAGE_SCALE2 PWR_CR_VOS_1 /* Scale 2 mode: the maximum value of fHCLK is 144 MHz. It can be extended to - 168 MHz by activating the over-drive mode. */ -#define PWR_REGULATOR_VOLTAGE_SCALE3 PWR_CR_VOS_0 /* Scale 3 mode: the maximum value of fHCLK is 120 MHz. */ -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ -/** - * @} - */ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup PWREx_WakeUp_Pins PWREx WakeUp Pins - * @{ - */ -#define PWR_WAKEUP_PIN2 0x00000080U -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define PWR_WAKEUP_PIN3 0x00000040U -#endif /* STM32F410xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Zx || STM32F412Vx || \ - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ -#endif /* STM32F410xx || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Constants PWREx Exported Constants - * @{ - */ - -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -/** @brief macros configure the main internal regulator output voltage. - * @param __REGULATOR__ specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption when the device does - * not operate at the maximum frequency (refer to the datasheets for more details). - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * @retval None - */ -#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ - UNUSED(tmpreg); \ - } while(0U) -#else -/** @brief macros configure the main internal regulator output voltage. - * @param __REGULATOR__ specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption when the device does - * not operate at the maximum frequency (refer to the datasheets for more details). - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode - * @retval None - */ -#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macros to enable or disable the Over drive mode. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_OVERDRIVE_ENABLE() (*(__IO uint32_t *) CR_ODEN_BB = ENABLE) -#define __HAL_PWR_OVERDRIVE_DISABLE() (*(__IO uint32_t *) CR_ODEN_BB = DISABLE) - -/** @brief Macros to enable or disable the Over drive switching. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_OVERDRIVESWITCHING_ENABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = ENABLE) -#define __HAL_PWR_OVERDRIVESWITCHING_DISABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = DISABLE) - -/** @brief Macros to enable or disable the Under drive mode. - * @note This mode is enabled only with STOP low power mode. - * In this mode, the 1.2V domain is preserved in reduced leakage mode. This - * mode is only available when the main regulator or the low power regulator - * is in low voltage mode. - * @note If the Under-drive mode was enabled, it is automatically disabled after - * exiting Stop mode. - * When the voltage regulator operates in Under-drive mode, an additional - * startup delay is induced when waking up from Stop mode. - */ -#define __HAL_PWR_UNDERDRIVE_ENABLE() (PWR->CR |= (uint32_t)PWR_CR_UDEN) -#define __HAL_PWR_UNDERDRIVE_DISABLE() (PWR->CR &= (uint32_t)(~PWR_CR_UDEN)) - -/** @brief Check PWR flag is set or not. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg PWR_FLAG_ODRDY: This flag indicates that the Over-drive mode - * is ready - * @arg PWR_FLAG_ODSWRDY: This flag indicates that the Over-drive mode - * switching is ready - * @arg PWR_FLAG_UDRDY: This flag indicates that the Under-drive mode - * is enabled in Stop mode - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_PWR_GET_ODRUDR_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the Under-Drive Ready flag. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_CLEAR_ODRUDR_FLAG() (PWR->CSR |= PWR_FLAG_UDRDY) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PWREx_Exported_Functions PWREx Exported Functions - * @{ - */ - -/** @addtogroup PWREx_Exported_Functions_Group1 - * @{ - */ -void HAL_PWREx_EnableFlashPowerDown(void); -void HAL_PWREx_DisableFlashPowerDown(void); -HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void); -HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void); -uint32_t HAL_PWREx_GetVoltageRange(void); -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling); - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ - defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -void HAL_PWREx_EnableMainRegulatorLowVoltage(void); -void HAL_PWREx_DisableMainRegulatorLowVoltage(void); -void HAL_PWREx_EnableLowRegulatorLowVoltage(void); -void HAL_PWREx_DisableLowRegulatorLowVoltage(void); -#endif /* STM32F410xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F412Zx || STM32F412Vx ||\ - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void); -HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void); -HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PWREx_Private_Constants PWREx Private Constants - * @{ - */ - -/** @defgroup PWREx_register_alias_address PWREx Register alias address - * @{ - */ -/* ------------- PWR registers bit address in the alias region ---------------*/ -/* --- CR Register ---*/ -/* Alias word address of FPDS bit */ -#define FPDS_BIT_NUMBER PWR_CR_FPDS_Pos -#define CR_FPDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (FPDS_BIT_NUMBER * 4U)) - -/* Alias word address of ODEN bit */ -#define ODEN_BIT_NUMBER PWR_CR_ODEN_Pos -#define CR_ODEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODEN_BIT_NUMBER * 4U)) - -/* Alias word address of ODSWEN bit */ -#define ODSWEN_BIT_NUMBER PWR_CR_ODSWEN_Pos -#define CR_ODSWEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODSWEN_BIT_NUMBER * 4U)) - -/* Alias word address of MRLVDS bit */ -#define MRLVDS_BIT_NUMBER PWR_CR_MRLVDS_Pos -#define CR_MRLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (MRLVDS_BIT_NUMBER * 4U)) - -/* Alias word address of LPLVDS bit */ -#define LPLVDS_BIT_NUMBER PWR_CR_LPLVDS_Pos -#define CR_LPLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (LPLVDS_BIT_NUMBER * 4U)) - - /** - * @} - */ - -/** @defgroup PWREx_CSR_register_alias PWRx CSR Register alias address - * @{ - */ -/* --- CSR Register ---*/ -/* Alias word address of BRE bit */ -#define BRE_BIT_NUMBER PWR_CSR_BRE_Pos -#define CSR_BRE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (BRE_BIT_NUMBER * 4U)) - -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PWREx_Private_Macros PWREx Private Macros - * @{ - */ - -/** @defgroup PWREx_IS_PWR_Definitions PWREx Private macros to check input parameters - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_PWR_REGULATOR_UNDERDRIVE(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_UNDERDRIVE_ON) || \ - ((REGULATOR) == PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2)) -#else -#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE3)) -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ - -#if defined(STM32F446xx) -#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2)) -#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2) || \ - ((PIN) == PWR_WAKEUP_PIN3)) -#else -#define IS_PWR_WAKEUP_PIN(PIN) ((PIN) == PWR_WAKEUP_PIN1) -#endif /* STM32F446xx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_HAL_PWR_EX_H */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h deleted file mode 100644 index cf01e51..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h +++ /dev/null @@ -1,1458 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc.h - * @author MCD Application Team - * @brief Header file of RCC HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_RCC_H -#define __STM32F4xx_HAL_RCC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/* Include RCC HAL Extended module */ -/* (include on top of file since RCC structures are defined in extended file) */ -#include "stm32f4xx_hal_rcc_ex.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup RCC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup RCC_Exported_Types RCC Exported Types - * @{ - */ - -/** - * @brief RCC Internal/External Oscillator (HSE, HSI, LSE and LSI) configuration structure definition - */ -typedef struct -{ - uint32_t OscillatorType; /*!< The oscillators to be configured. - This parameter can be a value of @ref RCC_Oscillator_Type */ - - uint32_t HSEState; /*!< The new state of the HSE. - This parameter can be a value of @ref RCC_HSE_Config */ - - uint32_t LSEState; /*!< The new state of the LSE. - This parameter can be a value of @ref RCC_LSE_Config */ - - uint32_t HSIState; /*!< The new state of the HSI. - This parameter can be a value of @ref RCC_HSI_Config */ - - uint32_t HSICalibrationValue; /*!< The HSI calibration trimming value (default is RCC_HSICALIBRATION_DEFAULT). - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F */ - - uint32_t LSIState; /*!< The new state of the LSI. - This parameter can be a value of @ref RCC_LSI_Config */ - - RCC_PLLInitTypeDef PLL; /*!< PLL structure parameters */ -} RCC_OscInitTypeDef; - -/** - * @brief RCC System, AHB and APB busses clock configuration structure definition - */ -typedef struct -{ - uint32_t ClockType; /*!< The clock to be configured. - This parameter can be a value of @ref RCC_System_Clock_Type */ - - uint32_t SYSCLKSource; /*!< The clock source (SYSCLKS) used as system clock. - This parameter can be a value of @ref RCC_System_Clock_Source */ - - uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). - This parameter can be a value of @ref RCC_AHB_Clock_Source */ - - uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). - This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ - - uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). - This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ - -} RCC_ClkInitTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RCC_Exported_Constants RCC Exported Constants - * @{ - */ - -/** @defgroup RCC_Oscillator_Type Oscillator Type - * @{ - */ -#define RCC_OSCILLATORTYPE_NONE 0x00000000U -#define RCC_OSCILLATORTYPE_HSE 0x00000001U -#define RCC_OSCILLATORTYPE_HSI 0x00000002U -#define RCC_OSCILLATORTYPE_LSE 0x00000004U -#define RCC_OSCILLATORTYPE_LSI 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_HSE_Config HSE Config - * @{ - */ -#define RCC_HSE_OFF 0x00000000U -#define RCC_HSE_ON RCC_CR_HSEON -#define RCC_HSE_BYPASS ((uint32_t)(RCC_CR_HSEBYP | RCC_CR_HSEON)) -/** - * @} - */ - -/** @defgroup RCC_LSE_Config LSE Config - * @{ - */ -#define RCC_LSE_OFF 0x00000000U -#define RCC_LSE_ON RCC_BDCR_LSEON -#define RCC_LSE_BYPASS ((uint32_t)(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON)) -/** - * @} - */ - -/** @defgroup RCC_HSI_Config HSI Config - * @{ - */ -#define RCC_HSI_OFF ((uint8_t)0x00) -#define RCC_HSI_ON ((uint8_t)0x01) - -#define RCC_HSICALIBRATION_DEFAULT 0x10U /* Default HSI calibration trimming value */ -/** - * @} - */ - -/** @defgroup RCC_LSI_Config LSI Config - * @{ - */ -#define RCC_LSI_OFF ((uint8_t)0x00) -#define RCC_LSI_ON ((uint8_t)0x01) -/** - * @} - */ - -/** @defgroup RCC_PLL_Config PLL Config - * @{ - */ -#define RCC_PLL_NONE ((uint8_t)0x00) -#define RCC_PLL_OFF ((uint8_t)0x01) -#define RCC_PLL_ON ((uint8_t)0x02) -/** - * @} - */ - -/** @defgroup RCC_PLLP_Clock_Divider PLLP Clock Divider - * @{ - */ -#define RCC_PLLP_DIV2 0x00000002U -#define RCC_PLLP_DIV4 0x00000004U -#define RCC_PLLP_DIV6 0x00000006U -#define RCC_PLLP_DIV8 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_PLL_Clock_Source PLL Clock Source - * @{ - */ -#define RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI -#define RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Type System Clock Type - * @{ - */ -#define RCC_CLOCKTYPE_SYSCLK 0x00000001U -#define RCC_CLOCKTYPE_HCLK 0x00000002U -#define RCC_CLOCKTYPE_PCLK1 0x00000004U -#define RCC_CLOCKTYPE_PCLK2 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Source System Clock Source - * @note The RCC_SYSCLKSOURCE_PLLRCLK parameter is available only for - * STM32F446xx devices. - * @{ - */ -#define RCC_SYSCLKSOURCE_HSI RCC_CFGR_SW_HSI -#define RCC_SYSCLKSOURCE_HSE RCC_CFGR_SW_HSE -#define RCC_SYSCLKSOURCE_PLLCLK RCC_CFGR_SW_PLL -#define RCC_SYSCLKSOURCE_PLLRCLK ((uint32_t)(RCC_CFGR_SW_0 | RCC_CFGR_SW_1)) -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Source_Status System Clock Source Status - * @note The RCC_SYSCLKSOURCE_STATUS_PLLRCLK parameter is available only for - * STM32F446xx devices. - * @{ - */ -#define RCC_SYSCLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_PLLCLK RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_PLLRCLK ((uint32_t)(RCC_CFGR_SWS_0 | RCC_CFGR_SWS_1)) /*!< PLLR used as system clock */ -/** - * @} - */ - -/** @defgroup RCC_AHB_Clock_Source AHB Clock Source - * @{ - */ -#define RCC_SYSCLK_DIV1 RCC_CFGR_HPRE_DIV1 -#define RCC_SYSCLK_DIV2 RCC_CFGR_HPRE_DIV2 -#define RCC_SYSCLK_DIV4 RCC_CFGR_HPRE_DIV4 -#define RCC_SYSCLK_DIV8 RCC_CFGR_HPRE_DIV8 -#define RCC_SYSCLK_DIV16 RCC_CFGR_HPRE_DIV16 -#define RCC_SYSCLK_DIV64 RCC_CFGR_HPRE_DIV64 -#define RCC_SYSCLK_DIV128 RCC_CFGR_HPRE_DIV128 -#define RCC_SYSCLK_DIV256 RCC_CFGR_HPRE_DIV256 -#define RCC_SYSCLK_DIV512 RCC_CFGR_HPRE_DIV512 -/** - * @} - */ - -/** @defgroup RCC_APB1_APB2_Clock_Source APB1/APB2 Clock Source - * @{ - */ -#define RCC_HCLK_DIV1 RCC_CFGR_PPRE1_DIV1 -#define RCC_HCLK_DIV2 RCC_CFGR_PPRE1_DIV2 -#define RCC_HCLK_DIV4 RCC_CFGR_PPRE1_DIV4 -#define RCC_HCLK_DIV8 RCC_CFGR_PPRE1_DIV8 -#define RCC_HCLK_DIV16 RCC_CFGR_PPRE1_DIV16 -/** - * @} - */ - -/** @defgroup RCC_RTC_Clock_Source RTC Clock Source - * @{ - */ -#define RCC_RTCCLKSOURCE_NO_CLK 0x00000000U -#define RCC_RTCCLKSOURCE_LSE 0x00000100U -#define RCC_RTCCLKSOURCE_LSI 0x00000200U -#define RCC_RTCCLKSOURCE_HSE_DIVX 0x00000300U -#define RCC_RTCCLKSOURCE_HSE_DIV2 0x00020300U -#define RCC_RTCCLKSOURCE_HSE_DIV3 0x00030300U -#define RCC_RTCCLKSOURCE_HSE_DIV4 0x00040300U -#define RCC_RTCCLKSOURCE_HSE_DIV5 0x00050300U -#define RCC_RTCCLKSOURCE_HSE_DIV6 0x00060300U -#define RCC_RTCCLKSOURCE_HSE_DIV7 0x00070300U -#define RCC_RTCCLKSOURCE_HSE_DIV8 0x00080300U -#define RCC_RTCCLKSOURCE_HSE_DIV9 0x00090300U -#define RCC_RTCCLKSOURCE_HSE_DIV10 0x000A0300U -#define RCC_RTCCLKSOURCE_HSE_DIV11 0x000B0300U -#define RCC_RTCCLKSOURCE_HSE_DIV12 0x000C0300U -#define RCC_RTCCLKSOURCE_HSE_DIV13 0x000D0300U -#define RCC_RTCCLKSOURCE_HSE_DIV14 0x000E0300U -#define RCC_RTCCLKSOURCE_HSE_DIV15 0x000F0300U -#define RCC_RTCCLKSOURCE_HSE_DIV16 0x00100300U -#define RCC_RTCCLKSOURCE_HSE_DIV17 0x00110300U -#define RCC_RTCCLKSOURCE_HSE_DIV18 0x00120300U -#define RCC_RTCCLKSOURCE_HSE_DIV19 0x00130300U -#define RCC_RTCCLKSOURCE_HSE_DIV20 0x00140300U -#define RCC_RTCCLKSOURCE_HSE_DIV21 0x00150300U -#define RCC_RTCCLKSOURCE_HSE_DIV22 0x00160300U -#define RCC_RTCCLKSOURCE_HSE_DIV23 0x00170300U -#define RCC_RTCCLKSOURCE_HSE_DIV24 0x00180300U -#define RCC_RTCCLKSOURCE_HSE_DIV25 0x00190300U -#define RCC_RTCCLKSOURCE_HSE_DIV26 0x001A0300U -#define RCC_RTCCLKSOURCE_HSE_DIV27 0x001B0300U -#define RCC_RTCCLKSOURCE_HSE_DIV28 0x001C0300U -#define RCC_RTCCLKSOURCE_HSE_DIV29 0x001D0300U -#define RCC_RTCCLKSOURCE_HSE_DIV30 0x001E0300U -#define RCC_RTCCLKSOURCE_HSE_DIV31 0x001F0300U -/** - * @} - */ - -/** @defgroup RCC_MCO_Index MCO Index - * @{ - */ -#define RCC_MCO1 0x00000000U -#define RCC_MCO2 0x00000001U -/** - * @} - */ - -/** @defgroup RCC_MCO1_Clock_Source MCO1 Clock Source - * @{ - */ -#define RCC_MCO1SOURCE_HSI 0x00000000U -#define RCC_MCO1SOURCE_LSE RCC_CFGR_MCO1_0 -#define RCC_MCO1SOURCE_HSE RCC_CFGR_MCO1_1 -#define RCC_MCO1SOURCE_PLLCLK RCC_CFGR_MCO1 -/** - * @} - */ - -/** @defgroup RCC_MCOx_Clock_Prescaler MCOx Clock Prescaler - * @{ - */ -#define RCC_MCODIV_1 0x00000000U -#define RCC_MCODIV_2 RCC_CFGR_MCO1PRE_2 -#define RCC_MCODIV_3 ((uint32_t)RCC_CFGR_MCO1PRE_0 | RCC_CFGR_MCO1PRE_2) -#define RCC_MCODIV_4 ((uint32_t)RCC_CFGR_MCO1PRE_1 | RCC_CFGR_MCO1PRE_2) -#define RCC_MCODIV_5 RCC_CFGR_MCO1PRE -/** - * @} - */ - -/** @defgroup RCC_Interrupt Interrupts - * @{ - */ -#define RCC_IT_LSIRDY ((uint8_t)0x01) -#define RCC_IT_LSERDY ((uint8_t)0x02) -#define RCC_IT_HSIRDY ((uint8_t)0x04) -#define RCC_IT_HSERDY ((uint8_t)0x08) -#define RCC_IT_PLLRDY ((uint8_t)0x10) -#define RCC_IT_PLLI2SRDY ((uint8_t)0x20) -#define RCC_IT_CSS ((uint8_t)0x80) -/** - * @} - */ - -/** @defgroup RCC_Flag Flags - * Elements values convention: 0XXYYYYYb - * - YYYYY : Flag position in the register - * - 0XX : Register index - * - 01: CR register - * - 10: BDCR register - * - 11: CSR register - * @{ - */ -/* Flags in the CR register */ -#define RCC_FLAG_HSIRDY ((uint8_t)0x21) -#define RCC_FLAG_HSERDY ((uint8_t)0x31) -#define RCC_FLAG_PLLRDY ((uint8_t)0x39) -#define RCC_FLAG_PLLI2SRDY ((uint8_t)0x3B) - -/* Flags in the BDCR register */ -#define RCC_FLAG_LSERDY ((uint8_t)0x41) - -/* Flags in the CSR register */ -#define RCC_FLAG_LSIRDY ((uint8_t)0x61) -#define RCC_FLAG_BORRST ((uint8_t)0x79) -#define RCC_FLAG_PINRST ((uint8_t)0x7A) -#define RCC_FLAG_PORRST ((uint8_t)0x7B) -#define RCC_FLAG_SFTRST ((uint8_t)0x7C) -#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) -#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) -#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RCC_Exported_Macros RCC Exported Macros - * @{ - */ - -/** @defgroup RCC_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_GPIOA_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN)) -#define __HAL_RCC_GPIOB_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOBEN)) -#define __HAL_RCC_GPIOC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOCEN)) -#define __HAL_RCC_GPIOH_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOHEN)) -#define __HAL_RCC_DMA1_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA1EN)) -#define __HAL_RCC_DMA2_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2EN)) -/** - * @} - */ - -/** @defgroup RCC_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOA_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) != RESET) -#define __HAL_RCC_GPIOB_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) != RESET) -#define __HAL_RCC_GPIOC_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) != RESET) -#define __HAL_RCC_GPIOH_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) != RESET) -#define __HAL_RCC_DMA1_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) != RESET) -#define __HAL_RCC_DMA2_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) != RESET) - -#define __HAL_RCC_GPIOA_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) == RESET) -#define __HAL_RCC_GPIOB_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) == RESET) -#define __HAL_RCC_GPIOC_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) == RESET) -#define __HAL_RCC_GPIOH_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) == RESET) -#define __HAL_RCC_DMA1_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) == RESET) -#define __HAL_RCC_DMA2_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_WWDG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_PWR_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN)) -#define __HAL_RCC_WWDG_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_WWDGEN)) -#define __HAL_RCC_SPI2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN)) -#define __HAL_RCC_USART2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART2EN)) -#define __HAL_RCC_I2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN)) -#define __HAL_RCC_I2C2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN)) -#define __HAL_RCC_PWR_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_PWREN)) -/** - * @} - */ - -/** @defgroup RCC_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) != RESET) -#define __HAL_RCC_WWDG_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) != RESET) -#define __HAL_RCC_SPI2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) != RESET) -#define __HAL_RCC_USART2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) != RESET) -#define __HAL_RCC_I2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) != RESET) -#define __HAL_RCC_I2C2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) != RESET) -#define __HAL_RCC_PWR_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) != RESET) - -#define __HAL_RCC_TIM5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) == RESET) -#define __HAL_RCC_WWDG_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) == RESET) -#define __HAL_RCC_SPI2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) == RESET) -#define __HAL_RCC_USART2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) == RESET) -#define __HAL_RCC_I2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) == RESET) -#define __HAL_RCC_I2C2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) == RESET) -#define __HAL_RCC_PWR_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SYSCFG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM9_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM11_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM1EN)) -#define __HAL_RCC_USART1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) -#define __HAL_RCC_USART6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART6EN)) -#define __HAL_RCC_ADC1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN)) -#define __HAL_RCC_SPI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN)) -#define __HAL_RCC_SYSCFG_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SYSCFGEN)) -#define __HAL_RCC_TIM9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM9EN)) -#define __HAL_RCC_TIM11_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM11EN)) -/** - * @} - */ - -/** @defgroup RCC_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) != RESET) -#define __HAL_RCC_USART1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) != RESET) -#define __HAL_RCC_USART6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) != RESET) -#define __HAL_RCC_ADC1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) != RESET) -#define __HAL_RCC_SPI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) != RESET) -#define __HAL_RCC_SYSCFG_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) != RESET) -#define __HAL_RCC_TIM9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) != RESET) -#define __HAL_RCC_TIM11_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) != RESET) - -#define __HAL_RCC_TIM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) == RESET) -#define __HAL_RCC_USART1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) == RESET) -#define __HAL_RCC_USART6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) == RESET) -#define __HAL_RCC_ADC1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) == RESET) -#define __HAL_RCC_SPI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) == RESET) -#define __HAL_RCC_SYSCFG_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) == RESET) -#define __HAL_RCC_TIM9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) == RESET) -#define __HAL_RCC_TIM11_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_GPIOA_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOARST)) -#define __HAL_RCC_GPIOB_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOBRST)) -#define __HAL_RCC_GPIOC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOCRST)) -#define __HAL_RCC_GPIOH_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOHRST)) -#define __HAL_RCC_DMA1_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA1RST)) -#define __HAL_RCC_DMA2_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2RST)) - -#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) -#define __HAL_RCC_GPIOA_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOARST)) -#define __HAL_RCC_GPIOB_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOBRST)) -#define __HAL_RCC_GPIOC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOCRST)) -#define __HAL_RCC_GPIOH_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOHRST)) -#define __HAL_RCC_DMA1_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA1RST)) -#define __HAL_RCC_DMA2_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2RST)) -/** - * @} - */ - -/** @defgroup RCC_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM5RST)) -#define __HAL_RCC_WWDG_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_WWDGRST)) -#define __HAL_RCC_SPI2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI2RST)) -#define __HAL_RCC_USART2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART2RST)) -#define __HAL_RCC_I2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C1RST)) -#define __HAL_RCC_I2C2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C2RST)) -#define __HAL_RCC_PWR_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_PWRRST)) - -#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) -#define __HAL_RCC_TIM5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM5RST)) -#define __HAL_RCC_WWDG_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_WWDGRST)) -#define __HAL_RCC_SPI2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI2RST)) -#define __HAL_RCC_USART2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART2RST)) -#define __HAL_RCC_I2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C1RST)) -#define __HAL_RCC_I2C2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C2RST)) -#define __HAL_RCC_PWR_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_PWRRST)) -/** - * @} - */ - -/** @defgroup RCC_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM1RST)) -#define __HAL_RCC_USART1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART1RST)) -#define __HAL_RCC_USART6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART6RST)) -#define __HAL_RCC_ADC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_ADCRST)) -#define __HAL_RCC_SPI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI1RST)) -#define __HAL_RCC_SYSCFG_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SYSCFGRST)) -#define __HAL_RCC_TIM9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM9RST)) -#define __HAL_RCC_TIM11_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM11RST)) - -#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) -#define __HAL_RCC_TIM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM1RST)) -#define __HAL_RCC_USART1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART1RST)) -#define __HAL_RCC_USART6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART6RST)) -#define __HAL_RCC_ADC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_ADCRST)) -#define __HAL_RCC_SPI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI1RST)) -#define __HAL_RCC_SYSCFG_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SYSCFGRST)) -#define __HAL_RCC_TIM9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM9RST)) -#define __HAL_RCC_TIM11_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM11RST)) -/** - * @} - */ - -/** @defgroup RCC_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOALPEN)) -#define __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOBLPEN)) -#define __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOCLPEN)) -#define __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOHLPEN)) -#define __HAL_RCC_DMA1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA1LPEN)) -#define __HAL_RCC_DMA2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2LPEN)) - -#define __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOALPEN)) -#define __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOBLPEN)) -#define __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOCLPEN)) -#define __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOHLPEN)) -#define __HAL_RCC_DMA1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA1LPEN)) -#define __HAL_RCC_DMA2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2LPEN)) -/** - * @} - */ - -/** @defgroup RCC_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM5LPEN)) -#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_WWDGLPEN)) -#define __HAL_RCC_SPI2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI2LPEN)) -#define __HAL_RCC_USART2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART2LPEN)) -#define __HAL_RCC_I2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C1LPEN)) -#define __HAL_RCC_I2C2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C2LPEN)) -#define __HAL_RCC_PWR_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_PWRLPEN)) - -#define __HAL_RCC_TIM5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM5LPEN)) -#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_WWDGLPEN)) -#define __HAL_RCC_SPI2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI2LPEN)) -#define __HAL_RCC_USART2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART2LPEN)) -#define __HAL_RCC_I2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C1LPEN)) -#define __HAL_RCC_I2C2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C2LPEN)) -#define __HAL_RCC_PWR_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_PWRLPEN)) -/** - * @} - */ - -/** @defgroup RCC_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM1LPEN)) -#define __HAL_RCC_USART1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART1LPEN)) -#define __HAL_RCC_USART6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART6LPEN)) -#define __HAL_RCC_ADC1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC1LPEN)) -#define __HAL_RCC_SPI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI1LPEN)) -#define __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SYSCFGLPEN)) -#define __HAL_RCC_TIM9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM9LPEN)) -#define __HAL_RCC_TIM11_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM11LPEN)) - -#define __HAL_RCC_TIM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM1LPEN)) -#define __HAL_RCC_USART1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART1LPEN)) -#define __HAL_RCC_USART6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART6LPEN)) -#define __HAL_RCC_ADC1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC1LPEN)) -#define __HAL_RCC_SPI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI1LPEN)) -#define __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SYSCFGLPEN)) -#define __HAL_RCC_TIM9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM9LPEN)) -#define __HAL_RCC_TIM11_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM11LPEN)) -/** - * @} - */ - -/** @defgroup RCC_HSI_Configuration HSI Configuration - * @{ - */ - -/** @brief Macros to enable or disable the Internal High Speed oscillator (HSI). - * @note The HSI is stopped by hardware when entering STOP and STANDBY modes. - * It is used (enabled by hardware) as system clock source after startup - * from Reset, wake-up from STOP and STANDBY mode, or in case of failure - * of the HSE used directly or indirectly as system clock (if the Clock - * Security System CSS is enabled). - * @note HSI can not be stopped if it is used as system clock source. In this case, - * you have to select another source of the system clock then stop the HSI. - * @note After enabling the HSI, the application software should wait on HSIRDY - * flag to be set indicating that HSI clock is stable and can be used as - * system clock source. - * This parameter can be: ENABLE or DISABLE. - * @note When the HSI is stopped, HSIRDY flag goes low after 6 HSI oscillator - * clock cycles. - */ -#define __HAL_RCC_HSI_ENABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = ENABLE) -#define __HAL_RCC_HSI_DISABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = DISABLE) - -/** @brief Macro to adjust the Internal High Speed oscillator (HSI) calibration value. - * @note The calibration is used to compensate for the variations in voltage - * and temperature that influence the frequency of the internal HSI RC. - * @param __HSICalibrationValue__ specifies the calibration trimming value. - * (default is RCC_HSICALIBRATION_DEFAULT). - * This parameter must be a number between 0 and 0x1F. - */ -#define __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(__HSICalibrationValue__) (MODIFY_REG(RCC->CR,\ - RCC_CR_HSITRIM, (uint32_t)(__HSICalibrationValue__) << RCC_CR_HSITRIM_Pos)) -/** - * @} - */ - -/** @defgroup RCC_LSI_Configuration LSI Configuration - * @{ - */ - -/** @brief Macros to enable or disable the Internal Low Speed oscillator (LSI). - * @note After enabling the LSI, the application software should wait on - * LSIRDY flag to be set indicating that LSI clock is stable and can - * be used to clock the IWDG and/or the RTC. - * @note LSI can not be disabled if the IWDG is running. - * @note When the LSI is stopped, LSIRDY flag goes low after 6 LSI oscillator - * clock cycles. - */ -#define __HAL_RCC_LSI_ENABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = ENABLE) -#define __HAL_RCC_LSI_DISABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = DISABLE) -/** - * @} - */ - -/** @defgroup RCC_HSE_Configuration HSE Configuration - * @{ - */ - -/** - * @brief Macro to configure the External High Speed oscillator (HSE). - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not supported by this macro. - * User should request a transition to HSE Off first and then HSE On or HSE Bypass. - * @note After enabling the HSE (RCC_HSE_ON or RCC_HSE_Bypass), the application - * software should wait on HSERDY flag to be set indicating that HSE clock - * is stable and can be used to clock the PLL and/or system clock. - * @note HSE state can not be changed if it is used directly or through the - * PLL as system clock. In this case, you have to select another source - * of the system clock then change the HSE state (ex. disable it). - * @note The HSE is stopped by hardware when entering STOP and STANDBY modes. - * @note This function reset the CSSON bit, so if the clock security system(CSS) - * was previously enabled you have to enable it again after calling this - * function. - * @param __STATE__ specifies the new state of the HSE. - * This parameter can be one of the following values: - * @arg RCC_HSE_OFF: turn OFF the HSE oscillator, HSERDY flag goes low after - * 6 HSE oscillator clock cycles. - * @arg RCC_HSE_ON: turn ON the HSE oscillator. - * @arg RCC_HSE_BYPASS: HSE oscillator bypassed with external clock. - */ -#define __HAL_RCC_HSE_CONFIG(__STATE__) \ - do { \ - if ((__STATE__) == RCC_HSE_ON) \ - { \ - SET_BIT(RCC->CR, RCC_CR_HSEON); \ - } \ - else if ((__STATE__) == RCC_HSE_BYPASS) \ - { \ - SET_BIT(RCC->CR, RCC_CR_HSEBYP); \ - SET_BIT(RCC->CR, RCC_CR_HSEON); \ - } \ - else \ - { \ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON); \ - CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); \ - } \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCC_LSE_Configuration LSE Configuration - * @{ - */ - -/** - * @brief Macro to configure the External Low Speed oscillator (LSE). - * @note Transition LSE Bypass to LSE On and LSE On to LSE Bypass are not supported by this macro. - * User should request a transition to LSE Off first and then LSE On or LSE Bypass. - * @note As the LSE is in the Backup domain and write access is denied to - * this domain after reset, you have to enable write access using - * HAL_PWR_EnableBkUpAccess() function before to configure the LSE - * (to be done once after reset). - * @note After enabling the LSE (RCC_LSE_ON or RCC_LSE_BYPASS), the application - * software should wait on LSERDY flag to be set indicating that LSE clock - * is stable and can be used to clock the RTC. - * @param __STATE__ specifies the new state of the LSE. - * This parameter can be one of the following values: - * @arg RCC_LSE_OFF: turn OFF the LSE oscillator, LSERDY flag goes low after - * 6 LSE oscillator clock cycles. - * @arg RCC_LSE_ON: turn ON the LSE oscillator. - * @arg RCC_LSE_BYPASS: LSE oscillator bypassed with external clock. - */ -#define __HAL_RCC_LSE_CONFIG(__STATE__) \ - do { \ - if((__STATE__) == RCC_LSE_ON) \ - { \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - } \ - else if((__STATE__) == RCC_LSE_BYPASS) \ - { \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - } \ - else \ - { \ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ - } \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCC_Internal_RTC_Clock_Configuration RTC Clock Configuration - * @{ - */ - -/** @brief Macros to enable or disable the RTC clock. - * @note These macros must be used only after the RTC clock source was selected. - */ -#define __HAL_RCC_RTC_ENABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = ENABLE) -#define __HAL_RCC_RTC_DISABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = DISABLE) - -/** @brief Macros to configure the RTC clock (RTCCLK). - * @note As the RTC clock configuration bits are in the Backup domain and write - * access is denied to this domain after reset, you have to enable write - * access using the Power Backup Access macro before to configure - * the RTC clock source (to be done once after reset). - * @note Once the RTC clock is configured it can't be changed unless the - * Backup domain is reset using __HAL_RCC_BackupReset_RELEASE() macro, or by - * a Power On Reset (POR). - * @param __RTCCLKSource__ specifies the RTC clock source. - * This parameter can be one of the following values: - * @arg @ref RCC_RTCCLKSOURCE_NO_CLK : No clock selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_LSE : LSE selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_LSI : LSI selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() - * @note If the LSE or LSI is used as RTC clock source, the RTC continues to - * work in STOP and STANDBY modes, and can be used as wake-up source. - * However, when the HSE clock is used as RTC clock source, the RTC - * cannot be used in STOP and STANDBY modes. - * @note The maximum input clock frequency for RTC is 1MHz (when using HSE as - * RTC clock source). - */ -#define __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__) (((__RTCCLKSource__) & RCC_BDCR_RTCSEL) == RCC_BDCR_RTCSEL) ? \ - MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, ((__RTCCLKSource__) & 0xFFFFCFFU)) : CLEAR_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) - -#define __HAL_RCC_RTC_CONFIG(__RTCCLKSource__) do { __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__); \ - RCC->BDCR |= ((__RTCCLKSource__) & 0x00000FFFU); \ - } while(0U) - -/** @brief Macro to get the RTC clock source. - * @retval The clock source can be one of the following values: - * @arg @ref RCC_RTCCLKSOURCE_NO_CLK No clock selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_LSE LSE selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_LSI LSI selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() - */ -#define __HAL_RCC_GET_RTC_SOURCE() (READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)) - -/** - * @brief Get the RTC and HSE clock divider (RTCPRE). - * @retval Returned value can be one of the following values: - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() - */ -#define __HAL_RCC_GET_RTC_HSE_PRESCALER() (READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) | RCC_BDCR_RTCSEL) - -/** @brief Macros to force or release the Backup domain reset. - * @note This function resets the RTC peripheral (including the backup registers) - * and the RTC clock source selection in RCC_CSR register. - * @note The BKPSRAM is not affected by this reset. - */ -#define __HAL_RCC_BACKUPRESET_FORCE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = ENABLE) -#define __HAL_RCC_BACKUPRESET_RELEASE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = DISABLE) -/** - * @} - */ - -/** @defgroup RCC_PLL_Configuration PLL Configuration - * @{ - */ - -/** @brief Macros to enable or disable the main PLL. - * @note After enabling the main PLL, the application software should wait on - * PLLRDY flag to be set indicating that PLL clock is stable and can - * be used as system clock source. - * @note The main PLL can not be disabled if it is used as system clock source - * @note The main PLL is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLL_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = ENABLE) -#define __HAL_RCC_PLL_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = DISABLE) - -/** @brief Macro to configure the PLL clock source. - * @note This function must be used only when the main PLL is disabled. - * @param __PLLSOURCE__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * - */ -#define __HAL_RCC_PLL_PLLSOURCE_CONFIG(__PLLSOURCE__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (__PLLSOURCE__)) - -/** @brief Macro to configure the PLL multiplication factor. - * @note This function must be used only when the main PLL is disabled. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * - */ -#define __HAL_RCC_PLL_PLLM_CONFIG(__PLLM__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, (__PLLM__)) -/** - * @} - */ - -/** @defgroup RCC_Get_Clock_source Get Clock source - * @{ - */ -/** - * @brief Macro to configure the system clock source. - * @param __RCC_SYSCLKSOURCE__ specifies the system clock source. - * This parameter can be one of the following values: - * - RCC_SYSCLKSOURCE_HSI: HSI oscillator is used as system clock source. - * - RCC_SYSCLKSOURCE_HSE: HSE oscillator is used as system clock source. - * - RCC_SYSCLKSOURCE_PLLCLK: PLL output is used as system clock source. - * - RCC_SYSCLKSOURCE_PLLRCLK: PLLR output is used as system clock source. This - * parameter is available only for STM32F446xx devices. - */ -#define __HAL_RCC_SYSCLK_CONFIG(__RCC_SYSCLKSOURCE__) MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (__RCC_SYSCLKSOURCE__)) - -/** @brief Macro to get the clock source used as system clock. - * @retval The clock source used as system clock. The returned value can be one - * of the following: - * - RCC_SYSCLKSOURCE_STATUS_HSI: HSI used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_HSE: HSE used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_PLLCLK: PLL used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_PLLRCLK: PLLR used as system clock. This parameter - * is available only for STM32F446xx devices. - */ -#define __HAL_RCC_GET_SYSCLK_SOURCE() (RCC->CFGR & RCC_CFGR_SWS) - -/** @brief Macro to get the oscillator used as PLL clock source. - * @retval The oscillator used as PLL clock source. The returned value can be one - * of the following: - * - RCC_PLLSOURCE_HSI: HSI oscillator is used as PLL clock source. - * - RCC_PLLSOURCE_HSE: HSE oscillator is used as PLL clock source. - */ -#define __HAL_RCC_GET_PLL_OSCSOURCE() ((uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC)) -/** - * @} - */ - -/** @defgroup RCCEx_MCOx_Clock_Config RCC Extended MCOx Clock Config - * @{ - */ - -/** @brief Macro to configure the MCO1 clock. - * @param __MCOCLKSOURCE__ specifies the MCO clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source - * @param __MCODIV__ specifies the MCO clock prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - */ -#define __HAL_RCC_MCO1_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), ((__MCOCLKSOURCE__) | (__MCODIV__))) - -/** @brief Macro to configure the MCO2 clock. - * @param __MCOCLKSOURCE__ specifies the MCO clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx - * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices - * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source - * @param __MCODIV__ specifies the MCO clock prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - * @note For STM32F410Rx devices, to output I2SCLK clock on MCO2, you should have - * at least one of the SPI clocks enabled (SPI1, SPI2 or SPI5). - */ -#define __HAL_RCC_MCO2_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), ((__MCOCLKSOURCE__) | ((__MCODIV__) << 3U))); -/** - * @} - */ - -/** @defgroup RCC_Flags_Interrupts_Management Flags Interrupts Management - * @brief macros to manage the specified RCC Flags and interrupts. - * @{ - */ - -/** @brief Enable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to enable - * the selected interrupts). - * @param __INTERRUPT__ specifies the RCC interrupt sources to be enabled. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - */ -#define __HAL_RCC_ENABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS |= (__INTERRUPT__)) - -/** @brief Disable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to disable - * the selected interrupts). - * @param __INTERRUPT__ specifies the RCC interrupt sources to be disabled. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - */ -#define __HAL_RCC_DISABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS &= (uint8_t)(~(__INTERRUPT__))) - -/** @brief Clear the RCC's interrupt pending bits (Perform Byte access to RCC_CIR[23:16] - * bits to clear the selected interrupt pending bits. - * @param __INTERRUPT__ specifies the interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - * @arg RCC_IT_CSS: Clock Security System interrupt - */ -#define __HAL_RCC_CLEAR_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE2_ADDRESS = (__INTERRUPT__)) - -/** @brief Check the RCC's interrupt has occurred or not. - * @param __INTERRUPT__ specifies the RCC interrupt source to check. - * This parameter can be one of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - * @arg RCC_IT_CSS: Clock Security System interrupt - * @retval The new state of __INTERRUPT__ (TRUE or FALSE). - */ -#define __HAL_RCC_GET_IT(__INTERRUPT__) ((RCC->CIR & (__INTERRUPT__)) == (__INTERRUPT__)) - -/** @brief Set RMVF bit to clear the reset flags: RCC_FLAG_PINRST, RCC_FLAG_PORRST, - * RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST and RCC_FLAG_LPWRRST. - */ -#define __HAL_RCC_CLEAR_RESET_FLAGS() (RCC->CSR |= RCC_CSR_RMVF) - -/** @brief Check RCC flag is set or not. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready. - * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready. - * @arg RCC_FLAG_PLLRDY: Main PLL clock ready. - * @arg RCC_FLAG_PLLI2SRDY: PLLI2S clock ready. - * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready. - * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready. - * @arg RCC_FLAG_BORRST: POR/PDR or BOR reset. - * @arg RCC_FLAG_PINRST: Pin reset. - * @arg RCC_FLAG_PORRST: POR/PDR reset. - * @arg RCC_FLAG_SFTRST: Software reset. - * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset. - * @arg RCC_FLAG_WWDGRST: Window Watchdog reset. - * @arg RCC_FLAG_LPWRRST: Low Power reset. - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define RCC_FLAG_MASK ((uint8_t)0x1FU) -#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U)\ - == 1U)? RCC->CR :((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :((((__FLAG__) >> 5U) == 3U)? RCC->CSR :RCC->CIR))) &\ - (1U << ((__FLAG__) & RCC_FLAG_MASK)))!= 0U)? 1U : 0U) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup RCC_Exported_Functions - * @{ - */ - -/** @addtogroup RCC_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions ******************************/ -HAL_StatusTypeDef HAL_RCC_DeInit(void); -HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct); -HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency); -/** - * @} - */ - -/** @addtogroup RCC_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions ************************************************/ -void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv); -void HAL_RCC_EnableCSS(void); -void HAL_RCC_DisableCSS(void); -uint32_t HAL_RCC_GetSysClockFreq(void); -uint32_t HAL_RCC_GetHCLKFreq(void); -uint32_t HAL_RCC_GetPCLK1Freq(void); -uint32_t HAL_RCC_GetPCLK2Freq(void); -void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct); -void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency); - -/* CSS NMI IRQ handler */ -void HAL_RCC_NMI_IRQHandler(void); - -/* User Callbacks in non blocking mode (IT mode) */ -void HAL_RCC_CSSCallback(void); - -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup RCC_Private_Constants RCC Private Constants - * @{ - */ - -/** @defgroup RCC_BitAddress_AliasRegion RCC BitAddress AliasRegion - * @brief RCC registers bit address in the alias region - * @{ - */ -#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) -/* --- CR Register --- */ -/* Alias word address of HSION bit */ -#define RCC_CR_OFFSET (RCC_OFFSET + 0x00U) -#define RCC_HSION_BIT_NUMBER 0x00U -#define RCC_CR_HSION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_HSION_BIT_NUMBER * 4U)) -/* Alias word address of CSSON bit */ -#define RCC_CSSON_BIT_NUMBER 0x13U -#define RCC_CR_CSSON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_CSSON_BIT_NUMBER * 4U)) -/* Alias word address of PLLON bit */ -#define RCC_PLLON_BIT_NUMBER 0x18U -#define RCC_CR_PLLON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLON_BIT_NUMBER * 4U)) - -/* --- BDCR Register --- */ -/* Alias word address of RTCEN bit */ -#define RCC_BDCR_OFFSET (RCC_OFFSET + 0x70U) -#define RCC_RTCEN_BIT_NUMBER 0x0FU -#define RCC_BDCR_RTCEN_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_RTCEN_BIT_NUMBER * 4U)) -/* Alias word address of BDRST bit */ -#define RCC_BDRST_BIT_NUMBER 0x10U -#define RCC_BDCR_BDRST_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_BDRST_BIT_NUMBER * 4U)) - -/* --- CSR Register --- */ -/* Alias word address of LSION bit */ -#define RCC_CSR_OFFSET (RCC_OFFSET + 0x74U) -#define RCC_LSION_BIT_NUMBER 0x00U -#define RCC_CSR_LSION_BB (PERIPH_BB_BASE + (RCC_CSR_OFFSET * 32U) + (RCC_LSION_BIT_NUMBER * 4U)) - -/* CR register byte 3 (Bits[23:16]) base address */ -#define RCC_CR_BYTE2_ADDRESS 0x40023802U - -/* CIR register byte 2 (Bits[15:8]) base address */ -#define RCC_CIR_BYTE1_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x01U)) - -/* CIR register byte 3 (Bits[23:16]) base address */ -#define RCC_CIR_BYTE2_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x02U)) - -/* BDCR register base address */ -#define RCC_BDCR_BYTE0_ADDRESS (PERIPH_BASE + RCC_BDCR_OFFSET) - -#define RCC_DBP_TIMEOUT_VALUE 2U -#define RCC_LSE_TIMEOUT_VALUE LSE_STARTUP_TIMEOUT - -#define HSE_TIMEOUT_VALUE HSE_STARTUP_TIMEOUT -#define HSI_TIMEOUT_VALUE 2U /* 2 ms */ -#define LSI_TIMEOUT_VALUE 2U /* 2 ms */ -#define CLOCKSWITCH_TIMEOUT_VALUE 5000U /* 5 s */ - -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup RCC_Private_Macros RCC Private Macros - * @{ - */ - -/** @defgroup RCC_IS_RCC_Definitions RCC Private macros to check input parameters - * @{ - */ -#define IS_RCC_OSCILLATORTYPE(OSCILLATOR) ((OSCILLATOR) <= 15U) - -#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ - ((HSE) == RCC_HSE_BYPASS)) - -#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ - ((LSE) == RCC_LSE_BYPASS)) - -#define IS_RCC_HSI(HSI) (((HSI) == RCC_HSI_OFF) || ((HSI) == RCC_HSI_ON)) - -#define IS_RCC_LSI(LSI) (((LSI) == RCC_LSI_OFF) || ((LSI) == RCC_LSI_ON)) - -#define IS_RCC_PLL(PLL) (((PLL) == RCC_PLL_NONE) ||((PLL) == RCC_PLL_OFF) || ((PLL) == RCC_PLL_ON)) - -#define IS_RCC_PLLSOURCE(SOURCE) (((SOURCE) == RCC_PLLSOURCE_HSI) || \ - ((SOURCE) == RCC_PLLSOURCE_HSE)) - -#define IS_RCC_SYSCLKSOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSOURCE_HSI) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_HSE) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_PLLCLK) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_PLLRCLK)) - -#define IS_RCC_RTCCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_RTCCLKSOURCE_LSE) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_LSI) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV2) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV3) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV4) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV5) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV6) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV7) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV8) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV9) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV10) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV11) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV12) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV13) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV14) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV15) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV16) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV17) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV18) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV19) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV20) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV21) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV22) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV23) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV24) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV25) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV26) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV27) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV28) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV29) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV30) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV31)) - -#define IS_RCC_PLLM_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 63U)) - -#define IS_RCC_PLLP_VALUE(VALUE) (((VALUE) == 2U) || ((VALUE) == 4U) || ((VALUE) == 6U) || ((VALUE) == 8U)) - -#define IS_RCC_PLLQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_DIV1) || ((HCLK) == RCC_SYSCLK_DIV2) || \ - ((HCLK) == RCC_SYSCLK_DIV4) || ((HCLK) == RCC_SYSCLK_DIV8) || \ - ((HCLK) == RCC_SYSCLK_DIV16) || ((HCLK) == RCC_SYSCLK_DIV64) || \ - ((HCLK) == RCC_SYSCLK_DIV128) || ((HCLK) == RCC_SYSCLK_DIV256) || \ - ((HCLK) == RCC_SYSCLK_DIV512)) - -#define IS_RCC_CLOCKTYPE(CLK) ((1U <= (CLK)) && ((CLK) <= 15U)) - -#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_DIV1) || ((PCLK) == RCC_HCLK_DIV2) || \ - ((PCLK) == RCC_HCLK_DIV4) || ((PCLK) == RCC_HCLK_DIV8) || \ - ((PCLK) == RCC_HCLK_DIV16)) - -#define IS_RCC_MCO(MCOx) (((MCOx) == RCC_MCO1) || ((MCOx) == RCC_MCO2)) - -#define IS_RCC_MCO1SOURCE(SOURCE) (((SOURCE) == RCC_MCO1SOURCE_HSI) || ((SOURCE) == RCC_MCO1SOURCE_LSE) || \ - ((SOURCE) == RCC_MCO1SOURCE_HSE) || ((SOURCE) == RCC_MCO1SOURCE_PLLCLK)) - -#define IS_RCC_MCODIV(DIV) (((DIV) == RCC_MCODIV_1) || ((DIV) == RCC_MCODIV_2) || \ - ((DIV) == RCC_MCODIV_3) || ((DIV) == RCC_MCODIV_4) || \ - ((DIV) == RCC_MCODIV_5)) -#define IS_RCC_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1FU) - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_RCC_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h deleted file mode 100644 index 3b62134..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h +++ /dev/null @@ -1,7190 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc_ex.h - * @author MCD Application Team - * @brief Header file of RCC HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_RCC_EX_H -#define __STM32F4xx_HAL_RCC_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup RCCEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Types RCCEx Exported Types - * @{ - */ - -/** - * @brief RCC PLL configuration structure definition - */ -typedef struct -{ - uint32_t PLLState; /*!< The new state of the PLL. - This parameter can be a value of @ref RCC_PLL_Config */ - - uint32_t PLLSource; /*!< RCC_PLLSource: PLL entry clock source. - This parameter must be a value of @ref RCC_PLL_Clock_Source */ - - uint32_t PLLM; /*!< PLLM: Division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 0 and Max_Data = 63 */ - - uint32_t PLLN; /*!< PLLN: Multiplication factor for PLL VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 - except for STM32F411xE devices where the Min_Data = 192 */ - - uint32_t PLLP; /*!< PLLP: Division factor for main system clock (SYSCLK). - This parameter must be a value of @ref RCC_PLLP_Clock_Divider */ - - uint32_t PLLQ; /*!< PLLQ: Division factor for OTG FS, SDIO and RNG clocks. - This parameter must be a number between Min_Data = 2 and Max_Data = 15 */ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) - uint32_t PLLR; /*!< PLLR: PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. - This parameter is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx - and STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. - This parameter must be a number between Min_Data = 2 and Max_Data = 7 */ -#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -} RCC_PLLInitTypeDef; - -#if defined(STM32F446xx) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLI2SP; /*!< Specifies division factor for SPDIFRX Clock. - This parameter must be a value of @ref RCCEx_PLLI2SP_Clock_Divider */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ -} RCC_PLLI2SInitTypeDef; - -/** - * @brief PLLSAI Clock structure definition - */ -typedef struct -{ - uint32_t PLLSAIM; /*!< Specifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS, SDIO and RNG clocks. - This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ - - uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ -} RCC_PLLSAIInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ - - uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ - - uint32_t Sai1ClockSelection; /*!< Specifies SAI1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_SAI1_Clock_Source */ - - uint32_t Sai2ClockSelection; /*!< Specifies SAI2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_SAI2_Clock_Source */ - - uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ - - uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ - - uint32_t CecClockSelection; /*!< Specifies CEC Clock Source Selection. - This parameter can be a value of @ref RCCEx_CEC_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint32_t SpdifClockSelection; /*!< Specifies SPDIFRX Clock Source Selection. - This parameter can be a value of @ref RCCEx_SPDIFRX_Clock_Source */ - - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -} RCC_PeriphCLKInitTypeDef; -#endif /* STM32F446xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - uint32_t I2SClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2S_APB_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -} RCC_PeriphCLKInitTypeDef; -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ -} RCC_PLLI2SInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ - -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t PLLDivR; /*!< Specifies the PLL division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLL is selected as Clock Source SAI */ - - uint32_t PLLI2SDivR; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ -#endif /* STM32F413xx || STM32F423xx */ - - uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ - - uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint32_t Dfsdm1ClockSelection; /*!< Specifies DFSDM1 Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM1_Kernel_Clock_Source */ - - uint32_t Dfsdm1AudioClockSelection;/*!< Specifies DFSDM1 Audio Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM1_Audio_Clock_Source */ - -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t Dfsdm2ClockSelection; /*!< Specifies DFSDM2 Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM2_Kernel_Clock_Source */ - - uint32_t Dfsdm2AudioClockSelection;/*!< Specifies DFSDM2 Audio Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM2_Audio_Clock_Source */ - - uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ - - uint32_t SaiAClockSelection; /*!< Specifies SAI1_A Clock Prescalers Selection - This parameter can be a value of @ref RCCEx_SAI1_BlockA_Clock_Source */ - - uint32_t SaiBClockSelection; /*!< Specifies SAI1_B Clock Prescalers Selection - This parameter can be a value of @ref RCCEx_SAI1_BlockB_Clock_Source */ -#endif /* STM32F413xx || STM32F423xx */ - - uint32_t PLLI2SSelection; /*!< Specifies PLL I2S Clock Source Selection. - This parameter can be a value of @ref RCCEx_PLL_I2S_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -} RCC_PeriphCLKInitTypeDef; -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI1 clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ -} RCC_PLLI2SInitTypeDef; - -/** - * @brief PLLSAI Clock structure definition - */ -typedef struct -{ - uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432. - This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ -#if defined(STM32F469xx) || defined(STM32F479xx) - uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS and SDIO clocks. - This parameter is only available in STM32F469xx/STM32F479xx devices. - This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ -#endif /* STM32F469xx || STM32F479xx */ - - uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI1 clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ - - uint32_t PLLSAIR; /*!< specifies the division factor for LTDC clock - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLSAI is selected as Clock Source LTDC */ - -} RCC_PLLSAIInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ - - uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ - - uint32_t PLLSAIDivR; /*!< Specifies the PLLSAI division factor for LTDC clock. - This parameter must be one value of @ref RCCEx_PLLSAI_DIVR */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Prescalers Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -#if defined(STM32F469xx) || defined(STM32F479xx) - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ -#endif /* STM32F469xx || STM32F479xx */ -} RCC_PeriphCLKInitTypeDef; - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ -#if defined(STM32F411xE) - uint32_t PLLI2SM; /*!< PLLM: Division factor for PLLI2S VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 62 */ -#endif /* STM32F411xE */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 - Except for STM32F411xE devices where the Min_Data = 192. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - -} RCC_PLLI2SInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -} RCC_PeriphCLKInitTypeDef; -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Constants RCCEx Exported Constants - * @{ - */ - -/** @defgroup RCCEx_Periph_Clock_Selection RCC Periph Clock Selection - * @{ - */ -/* Peripheral Clock source for STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -#define RCC_PERIPHCLK_I2S_APB1 0x00000001U -#define RCC_PERIPHCLK_I2S_APB2 0x00000002U -#define RCC_PERIPHCLK_TIM 0x00000004U -#define RCC_PERIPHCLK_RTC 0x00000008U -#define RCC_PERIPHCLK_FMPI2C1 0x00000010U -#define RCC_PERIPHCLK_CLK48 0x00000020U -#define RCC_PERIPHCLK_SDIO 0x00000040U -#define RCC_PERIPHCLK_PLLI2S 0x00000080U -#define RCC_PERIPHCLK_DFSDM1 0x00000100U -#define RCC_PERIPHCLK_DFSDM1_AUDIO 0x00000200U -#endif /* STM32F412Zx || STM32F412Vx) || STM32F412Rx || STM32F412Cx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define RCC_PERIPHCLK_DFSDM2 0x00000400U -#define RCC_PERIPHCLK_DFSDM2_AUDIO 0x00000800U -#define RCC_PERIPHCLK_LPTIM1 0x00001000U -#define RCC_PERIPHCLK_SAIA 0x00002000U -#define RCC_PERIPHCLK_SAIB 0x00004000U -#endif /* STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- Peripheral Clock source for STM32F410xx ----------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_TIM 0x00000002U -#define RCC_PERIPHCLK_RTC 0x00000004U -#define RCC_PERIPHCLK_FMPI2C1 0x00000008U -#define RCC_PERIPHCLK_LPTIM1 0x00000010U -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- Peripheral Clock source for STM32F446xx ----------------*/ -#if defined(STM32F446xx) -#define RCC_PERIPHCLK_I2S_APB1 0x00000001U -#define RCC_PERIPHCLK_I2S_APB2 0x00000002U -#define RCC_PERIPHCLK_SAI1 0x00000004U -#define RCC_PERIPHCLK_SAI2 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_CEC 0x00000040U -#define RCC_PERIPHCLK_FMPI2C1 0x00000080U -#define RCC_PERIPHCLK_CLK48 0x00000100U -#define RCC_PERIPHCLK_SDIO 0x00000200U -#define RCC_PERIPHCLK_SPDIFRX 0x00000400U -#define RCC_PERIPHCLK_PLLI2S 0x00000800U -#endif /* STM32F446xx */ -/*-----------------------------------------------------------------------------*/ - -/*----------- Peripheral Clock source for STM32F469xx/STM32F479xx -------------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U -#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U -#define RCC_PERIPHCLK_LTDC 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_PLLI2S 0x00000040U -#define RCC_PERIPHCLK_CLK48 0x00000080U -#define RCC_PERIPHCLK_SDIO 0x00000100U -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*-------- Peripheral Clock source for STM32F42xxx/STM32F43xxx ---------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U -#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U -#define RCC_PERIPHCLK_LTDC 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_PLLI2S 0x00000040U -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*-------- Peripheral Clock source for STM32F40xxx/STM32F41xxx ---------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_RTC 0x00000002U -#define RCC_PERIPHCLK_PLLI2S 0x00000004U -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define RCC_PERIPHCLK_TIM 0x00000008U -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -/*----------------------------------------------------------------------------*/ -/** - * @} - */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ - defined(STM32F479xx) -/** @defgroup RCCEx_I2S_Clock_Source I2S Clock Source - * @{ - */ -#define RCC_I2SCLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SCLKSOURCE_EXT RCC_CFGR_I2SSRC -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */ - -/** @defgroup RCCEx_PLLSAI_DIVR RCC PLLSAI DIVR - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PLLSAIDIVR_2 0x00000000U -#define RCC_PLLSAIDIVR_4 0x00010000U -#define RCC_PLLSAIDIVR_8 0x00020000U -#define RCC_PLLSAIDIVR_16 0x00030000U -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_PLLI2SP_Clock_Divider RCC PLLI2SP Clock Divider - * @{ - */ -#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define RCC_PLLI2SP_DIV2 0x00000002U -#define RCC_PLLI2SP_DIV4 0x00000004U -#define RCC_PLLI2SP_DIV6 0x00000006U -#define RCC_PLLI2SP_DIV8 0x00000008U -#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/** - * @} - */ - -/** @defgroup RCCEx_PLLSAIP_Clock_Divider RCC PLLSAIP Clock Divider - * @{ - */ -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PLLSAIP_DIV2 0x00000002U -#define RCC_PLLSAIP_DIV4 0x00000004U -#define RCC_PLLSAIP_DIV6 0x00000006U -#define RCC_PLLSAIP_DIV8 0x00000008U -#endif /* STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_SAI_BlockA_Clock_Source RCC SAI BlockA Clock Source - * @{ - */ -#define RCC_SAIACLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAIACLKSOURCE_PLLI2S 0x00100000U -#define RCC_SAIACLKSOURCE_EXT 0x00200000U -/** - * @} - */ - -/** @defgroup RCCEx_SAI_BlockB_Clock_Source RCC SAI BlockB Clock Source - * @{ - */ -#define RCC_SAIBCLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAIBCLKSOURCE_PLLI2S 0x00400000U -#define RCC_SAIBCLKSOURCE_EXT 0x00800000U -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_SDIOSEL) -/** - * @} - */ - -/** @defgroup RCCEx_DSI_Clock_Source RCC DSI Clock Source - * @{ - */ -#define RCC_DSICLKSOURCE_DSIPHY 0x00000000U -#define RCC_DSICLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_DSISEL) -/** - * @} - */ -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F446xx) -/** @defgroup RCCEx_SAI1_Clock_Source RCC SAI1 Clock Source - * @{ - */ -#define RCC_SAI1CLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAI1CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI1SRC_0) -#define RCC_SAI1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1SRC_1) -#define RCC_SAI1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_SAI2_Clock_Source RCC SAI2 Clock Source - * @{ - */ -#define RCC_SAI2CLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAI2CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI2SRC_0) -#define RCC_SAI2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI2SRC_1) -#define RCC_SAI2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source - * @{ - */ -#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) -#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) -#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source - * @{ - */ -#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) -#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) -#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_CEC_Clock_Source RCC CEC Clock Source - * @{ - */ -#define RCC_CECCLKSOURCE_HSI 0x00000000U -#define RCC_CECCLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_CECSEL) -/** - * @} - */ - -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR2_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SPDIFRX_Clock_Source RCC SPDIFRX Clock Source - * @{ - */ -#define RCC_SPDIFRXCLKSOURCE_PLLR 0x00000000U -#define RCC_SPDIFRXCLKSOURCE_PLLI2SP ((uint32_t)RCC_DCKCFGR2_SPDIFRXSEL) -/** - * @} - */ - -#endif /* STM32F446xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_SAI1_BlockA_Clock_Source RCC SAI BlockA Clock Source - * @{ - */ -#define RCC_SAIACLKSOURCE_PLLI2SR 0x00000000U -#define RCC_SAIACLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0) -#define RCC_SAIACLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1ASRC_1) -#define RCC_SAIACLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0 | RCC_DCKCFGR_SAI1ASRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_SAI1_BlockB_Clock_Source RCC SAI BlockB Clock Source - * @{ - */ -#define RCC_SAIBCLKSOURCE_PLLI2SR 0x00000000U -#define RCC_SAIBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0) -#define RCC_SAIBCLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1BSRC_1) -#define RCC_SAIBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0 | RCC_DCKCFGR_SAI1BSRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source - * @{ - */ -#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U -#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) -#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) -#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) -/** - * @} - */ - - -/** @defgroup RCCEx_DFSDM2_Audio_Clock_Source RCC DFSDM2 Audio Clock Source - * @{ - */ -#define RCC_DFSDM2AUDIOCLKSOURCE_I2S1 0x00000000U -#define RCC_DFSDM2AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM2ASEL) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM2_Kernel_Clock_Source RCC DFSDM2 Kernel Clock Source - * @{ - */ -#define RCC_DFSDM2CLKSOURCE_PCLK2 0x00000000U -#define RCC_DFSDM2CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) -/** - * @} - */ - -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_PLL_I2S_Clock_Source PLL I2S Clock Source - * @{ - */ -#define RCC_PLLI2SCLKSOURCE_PLLSRC 0x00000000U -#define RCC_PLLI2SCLKSOURCE_EXT ((uint32_t)RCC_PLLI2SCFGR_PLLI2SSRC) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM1_Audio_Clock_Source RCC DFSDM1 Audio Clock Source - * @{ - */ -#define RCC_DFSDM1AUDIOCLKSOURCE_I2S1 0x00000000U -#define RCC_DFSDM1AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM1ASEL) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM1_Kernel_Clock_Source RCC DFSDM1 Kernel Clock Source - * @{ - */ -#define RCC_DFSDM1CLKSOURCE_PCLK2 0x00000000U -#define RCC_DFSDM1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source - * @{ - */ -#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) -#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) -#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source - * @{ - */ -#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) -#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) -#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLI2SQ ((uint32_t)RCC_DCKCFGR2_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) -/** - * @} - */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) - -/** @defgroup RCCEx_I2S_APB_Clock_Source RCC I2S APB Clock Source - * @{ - */ -#define RCC_I2SAPBCLKSOURCE_PLLR 0x00000000U -#define RCC_I2SAPBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2SSRC_0) -#define RCC_I2SAPBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2SSRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source - * @{ - */ -#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U -#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) -#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) -#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_TIM_PRescaler_Selection RCC TIM PRescaler Selection - * @{ - */ -#define RCC_TIMPRES_DESACTIVATED ((uint8_t)0x00) -#define RCC_TIMPRES_ACTIVATED ((uint8_t)0x01) -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -/** @defgroup RCCEx_LSE_Dual_Mode_Selection RCC LSE Dual Mode Selection - * @{ - */ -#define RCC_LSE_LOWPOWER_MODE ((uint8_t)0x00) -#define RCC_LSE_HIGHDRIVE_MODE ((uint8_t)0x01) -/** - * @} - */ -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx ||\ - STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source - * @{ - */ -#define RCC_MCO2SOURCE_SYSCLK 0x00000000U -#define RCC_MCO2SOURCE_PLLI2SCLK RCC_CFGR_MCO2_0 -#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 -#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F413xx | STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source - * @{ - */ -#define RCC_MCO2SOURCE_SYSCLK 0x00000000U -#define RCC_MCO2SOURCE_I2SCLK RCC_CFGR_MCO2_0 -#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 -#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Macros RCCEx Exported Macros - * @{ - */ -/*------------------- STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx --------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOJ_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOK_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA2D_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) -#define __HAL_RCC_GPIOJ_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOJEN)) -#define __HAL_RCC_GPIOK_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOKEN)) -#define __HAL_RCC_DMA2D_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2DEN)) -#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) -#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) -#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) -#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) - -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETH_CLK_ENABLE() do { \ - __HAL_RCC_ETHMAC_CLK_ENABLE(); \ - __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ - __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ - } while(0U) -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETH_CLK_DISABLE() do { \ - __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ - __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ - __HAL_RCC_ETHMAC_CLK_DISABLE(); \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) -#define __HAL_RCC_GPIOJ_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) != RESET) -#define __HAL_RCC_GPIOK_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) != RESET) -#define __HAL_RCC_DMA2D_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) != RESET) -#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) -#define __HAL_RCC_GPIOJ_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) == RESET) -#define __HAL_RCC_GPIOK_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) == RESET) -#define __HAL_RCC_DMA2D_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) == RESET) -#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_HASH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) -#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ - -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) -#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) - -#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) -#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) -#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) -#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) -#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) -#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) -#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#define __HAL_RCC_SPI6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI6EN)) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_LTDC_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_LTDCEN)) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_DSI_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DSIEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#define __HAL_RCC_SPI6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) != RESET) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))!= RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))== RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#define __HAL_RCC_SPI6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) == RESET) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) != RESET) -#define __HAL_RCC_LTDC_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) == RESET) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) != RESET) -#define __HAL_RCC_DSI_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) == RESET) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x22E017FFU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_GPIOJ_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOJRST)) -#define __HAL_RCC_GPIOK_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOKRST)) -#define __HAL_RCC_DMA2D_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2DRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_GPIOJ_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOJRST)) -#define __HAL_RCC_GPIOK_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOKRST)) -#define __HAL_RCC_DMA2D_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2DRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F469xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000C1U) -#endif /* STM32F427xx || STM32F429xx || STM32F469xx */ -#if defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000F1U) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) - -#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000001U) -#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000003U) -#endif /* STM32F469xx || STM32F479xx */ -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xF6FEC9FFU) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x0C777933U) -#endif /* STM32F469xx || STM32F479xx */ -#if defined(STM32F429xx) || defined(STM32F439xx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x04777933U) -#endif /* STM32F429xx || STM32F439xx */ -#if defined(STM32F427xx) || defined(STM32F437xx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00777933U) -#endif /* STM32F427xx || STM32F437xx */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI6RST)) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI6RST)) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_LTDCRST)) -#define __HAL_RCC_LTDC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_LTDCRST)) -#endif /* STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DSIRST)) -#define __HAL_RCC_DSI_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DSIRST)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_GPIOJ_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOJLPEN)) -#define __HAL_RCC_GPIOK_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOKLPEN)) -#define __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM3LPEN)) -#define __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2DLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_GPIOJ_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOJLPEN)) -#define __HAL_RCC_GPIOK_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOKLPEN)) -#define __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2DLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) - -#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SPI6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI6LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SPI6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI6LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_LTDCLPEN)) - -#define __HAL_RCC_LTDC_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_LTDCLPEN)) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DSILPEN)) -#define __HAL_RCC_DSI_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DSILPEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------------- STM32F40xxx/STM32F41xxx-----------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#if defined(STM32F407xx)|| defined(STM32F417xx) -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETH_CLK_ENABLE() do { \ - __HAL_RCC_ETHMAC_CLK_ENABLE(); \ - __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ - __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ - } while(0U) - -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) -#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) -#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) -#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) -#define __HAL_RCC_ETH_CLK_DISABLE() do { \ - __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ - __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ - __HAL_RCC_ETHMAC_CLK_DISABLE(); \ - } while(0U) -#endif /* STM32F407xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN))== RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#if defined(STM32F407xx)|| defined(STM32F417xx) -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) -#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) -#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) -#endif /* STM32F407xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_HASH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) -#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) -#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) - -#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) -#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) -#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#if defined (STM32F405xx) || defined (STM32F415xx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x206011FFU) -#endif /* STM32F405xx || STM32F415xx */ -#if defined (STM32F407xx) || defined (STM32F417xx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x226011FFU) -#endif /* STM32F407xx || STM32F417xx */ -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#if defined (STM32F415xx) || defined (STM32F417xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000F1U) -#endif /* STM32F415xx || STM32F417xx */ -#if defined (STM32F405xx) || defined (STM32F407xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000C1U) -#endif /* STM32F405xx || STM32F407xx */ -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) - -#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) -#endif /* STM32F415xx || STM32F417xx */ - -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000001U) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xF6FEC9FFU) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x04777933U) -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) - -#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------- STM32F401xE/STM32F401xC --------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -/** - * @} - */ -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060109FU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x00000080U) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x10E2C80FU) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00077931U) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -/** - * @} - */ -#endif /* STM32F401xC || STM32F401xE*/ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F410xx -------------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) != RESET) - -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB1) peripheral clock. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) -#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) -#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) -#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) - -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x80601087U) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_RNGRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() -#define __HAL_RCC_AHB2_RELEASE_RESET() -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() -#define __HAL_RCC_AHB3_RELEASE_RESET() -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#if defined (STM32F410Rx) || defined (STM32F410Cx) -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x31624A18U) -#endif /* STM32F410Rx || STM32F410Cx */ -#if defined (STM32F410Tx) -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x31620A18U) -#endif /* STM32F410Tx */ -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) - -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#if defined (STM32F410Rx) || defined (STM32F410Cx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00155131U) -#endif /* STM32F410Rx || STM32F410Cx */ -#if defined (STM32F410Tx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00055111U) -#endif /* STM32F410Tx */ -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_RNGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_RNGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) -#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) - -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) -#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) -/** - * @} - */ - -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F411xx -------------------------------*/ -#if defined(STM32F411xE) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEX_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060109FU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x00000080U) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x10E2C80FU) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00177931U) -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -/** - * @} - */ -#endif /* STM32F411xE */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F446xx -----------------------------*/ -#if defined(STM32F446xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN))!= RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) - -#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPDIFRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CEC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_SPDIFRX_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPDIFRXEN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_CEC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CECEN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_SPDIFRX_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_CEC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_SPDIFRX_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_CEC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) -#define __HAL_RCC_SAI2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI2EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#define __HAL_RCC_SAI2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) -#define __HAL_RCC_SAI2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x206010FFU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x00000081U) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000003U) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) - -#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x3FFFC9FFU) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_SPDIFRX_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPDIFRXRST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_CEC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CECRST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_SPDIFRX_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPDIFRXRST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_CEC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CECRST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00C77933U) -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SAI2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI2RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SAI2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI2RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) - -#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_SPDIFRX_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPDIFRXLPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_CEC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CECLPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_SPDIFRX_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPDIFRXLPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_CEC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CECLPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SAI2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI2LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SAI2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI2LPEN)) -/** - * @} - */ - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*-------STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx-------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_AES_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_AESEN)) -#endif /* STM32F423xx */ - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) - -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) != RESET) -#define __HAL_RCC_AES_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) == RESET) -#endif /* STM32F423xx */ - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) - -#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN3EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) -#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) -#endif /* STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN))!= RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) -#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) -#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) -#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART9EN)) -#define __HAL_RCC_UART10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART10EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM1EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM2EN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) != RESET) -#define __HAL_RCC_UART10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) == RESET) -#define __HAL_RCC_UART10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#if defined (STM32F412Zx) || defined(STM32F413xx) || defined (STM32F423xx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x006010FFU) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined (STM32F412Cx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x00601087U) -#endif /* STM32F412Cx */ -#if defined (STM32F412Vx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060109FU) -#endif /* STM32F412Vx */ -#if defined (STM32F412Rx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060108FU) -#endif /* STM32F412Rx */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000D0U) -#define __HAL_RCC_AES_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_AESRST)) -#define __HAL_RCC_AES_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_AESRST)) -#else -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000C0U) -#endif /* STM32F423xx */ -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) - -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000003U) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) - -#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Cx) -#define __HAL_RCC_AHB3_FORCE_RESET() -#define __HAL_RCC_AHB3_RELEASE_RESET() - -#define __HAL_RCC_FSMC_FORCE_RESET() -#define __HAL_RCC_QSPI_FORCE_RESET() - -#define __HAL_RCC_FSMC_RELEASE_RESET() -#define __HAL_RCC_QSPI_RELEASE_RESET() -#endif /* STM32F412Cx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xFFFECBFFU) -#endif /* STM32F413xx || STM32F423xx */ -#if defined (STM32F412Zx) || defined (STM32F412Vx) || defined (STM32F412Rx) || defined (STM32F412Cx) -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x17E6C9FFU) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN3RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN3RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#if defined(STM32F413xx)|| defined(STM32F423xx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x035779F3U) -#endif /* STM32F413xx || STM32F423xx */ -#if defined (STM32F412Zx) || defined (STM32F412Vx) || defined (STM32F412Rx) || defined (STM32F412Cx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x01177933U) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART9RST)) -#define __HAL_RCC_UART10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART10RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM1RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM2RST)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART9RST)) -#define __HAL_RCC_UART10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART10RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM1RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM2RST)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_AESLPEN)) -#define __HAL_RCC_AES_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_AESLPEN)) -#endif /* STM32F423xx */ - -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) - -#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN3LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN3LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART9LPEN)) -#define __HAL_RCC_UART10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART10LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART9LPEN)) -#define __HAL_RCC_UART10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART10LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------- PLL Configuration --------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the main PLL clock source, multiplication and division factors. - * @note This function must be used only when the main PLL is disabled. - * @param __RCC_PLLSource__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLN parameter correctly to ensure that the VCO - * output frequency is between 100 and 432 MHz. - * - * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note If the USB OTG FS is used in your application, you have to set the - * PLLQ parameter correctly to have 48 MHz clock for the USB. However, - * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work - * correctly. - * - * @param __PLLR__ PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note This parameter is only available in STM32F446xx/STM32F469xx/STM32F479xx/ - STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. - * - */ -#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__) \ - (RCC->PLLCFGR = ((__RCC_PLLSource__) | (__PLLM__) | \ - ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ - ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ - ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos) | \ - ((__PLLR__) << RCC_PLLCFGR_PLLR_Pos))) -#else -/** @brief Macro to configure the main PLL clock source, multiplication and division factors. - * @note This function must be used only when the main PLL is disabled. - * @param __RCC_PLLSource__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432 - * Except for STM32F411xE devices where Min_Data = 192. - * @note You have to set the PLLN parameter correctly to ensure that the VCO - * output frequency is between 100 and 432 MHz, Except for STM32F411xE devices - * where frequency is between 192 and 432 MHz. - * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note If the USB OTG FS is used in your application, you have to set the - * PLLQ parameter correctly to have 48 MHz clock for the USB. However, - * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work - * correctly. - * - */ -#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__) \ - (RCC->PLLCFGR = (0x20000000U | (__RCC_PLLSource__) | (__PLLM__)| \ - ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ - ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ - ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos))) -#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------PLLI2S Configuration ---------------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - -/** @brief Macros to enable or disable the PLLI2S. - * @note The PLLI2S is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLLI2S_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = ENABLE) -#define __HAL_RCC_PLLI2S_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = DISABLE) - -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F412Cx */ -#if defined(STM32F446xx) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SP__ specifies division factor for SPDIFRX Clock. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * @note the PLLI2SP parameter is only available with STM32F446xx Devices - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - * @param __PLLI2SQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SP__, __PLLI2SQ__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((((__PLLI2SP__) >> 1U) -1U) << RCC_PLLI2SCFGR_PLLI2SP_Pos) |\ - ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - * @param __PLLI2SQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#else -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SN__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = (((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#endif /* STM32F446xx */ - -#if defined(STM32F411xE) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note The PLLI2SM parameter is only used with STM32F411xE/STM32F410xx Devices - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLLI2S jitter. - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 192 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 192 and Max_Data = 432 MHz. - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - */ -#define __HAL_RCC_PLLI2S_I2SCLK_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#endif /* STM32F411xE */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro used by the SAI HAL driver to configure the PLLI2S clock multiplication and division factors. - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API) - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * @param __PLLI2SQ__ specifies the division factor for SAI1 clock. - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note the PLLI2SQ parameter is only available with STM32F427xx/437xx/429xx/439xx/469xx/479xx - * Devices and can be configured using the __HAL_RCC_PLLI2S_PLLSAICLK_CONFIG() macro - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - */ -#define __HAL_RCC_PLLI2S_SAICLK_CONFIG(__PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SN__) << 6U) |\ - ((__PLLI2SQ__) << 24U) |\ - ((__PLLI2SR__) << 28U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------ PLLSAI Configuration ------------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macros to Enable or Disable the PLLISAI. - * @note The PLLSAI is only available with STM32F429x/439x Devices. - * @note The PLLSAI is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLLSAI_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = ENABLE) -#define __HAL_RCC_PLLSAI_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = DISABLE) - -#if defined(STM32F446xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIM__ specifies the division factor for PLLSAI VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLSAIM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * @note The PLLSAIM parameter is only used with STM32F446xx Devices - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIP__ specifies division factor for OTG FS, SDIO and RNG clocks. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * @note the PLLSAIP parameter is only available with STM32F446xx Devices - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIM__, __PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = ((__PLLSAIM__) | \ - ((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ - ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) | \ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos))) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIP__ specifies division factor for SDIO and CLK48 clocks. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) |\ - ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) |\ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) |\ - ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) | \ - ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- PLLSAI/PLLI2S Dividers Configuration -------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. - * @note This function must be called before enabling the PLLI2S. - * @param __PLLI2SDivR__ specifies the PLLI2S division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLI2SR) / __PLLI2SDivR__ - */ -#define __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(__PLLI2SDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, (__PLLI2SDivR__)-1U)) - -/** @brief Macro to configure the SAI clock Divider coming from PLL. - * @param __PLLDivR__ specifies the PLL division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLR) / __PLLDivR__ - */ -#define __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(__PLLDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, ((__PLLDivR__)-1U)<<8U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. - * @note This function must be called before enabling the PLLI2S. - * @param __PLLI2SDivQ__ specifies the PLLI2S division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLI2SQ) / __PLLI2SDivQ__ - */ -#define __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(__PLLI2SDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, (__PLLI2SDivQ__)-1U)) - -/** @brief Macro to configure the SAI clock Divider coming from PLLSAI. - * @note This function must be called before enabling the PLLSAI. - * @param __PLLSAIDivQ__ specifies the PLLSAI division factor for SAI1 clock . - * This parameter must be a number between Min_Data = 1 and Max_Data = 32. - * SAI1 clock frequency = f(PLLSAIQ) / __PLLSAIDivQ__ - */ -#define __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(__PLLSAIDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, ((__PLLSAIDivQ__)-1U)<<8U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the LTDC clock Divider coming from PLLSAI. - * - * @note The LTDC peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling the PLLSAI. - * @param __PLLSAIDivR__ specifies the PLLSAI division factor for LTDC clock . - * This parameter must be a number between Min_Data = 2 and Max_Data = 16. - * LTDC clock frequency = f(PLLSAIR) / __PLLSAIDivR__ - */ -#define __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(__PLLSAIDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, (__PLLSAIDivR__))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------- Peripheral Clock selection -----------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||\ - defined(STM32F479xx) -/** @brief Macro to configure the I2S clock source (I2SCLK). - * @note This function must be called before enabling the I2S APB clock. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. - * @arg RCC_I2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin - * used as I2S clock source. - */ -#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (MODIFY_REG(RCC->CFGR, RCC_CFGR_I2SSRC, (__SOURCE__))) - - -/** @brief Macro to get the I2S clock source (I2SCLK). - * @retval The clock source can be one of the following values: - * @arg @ref RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. - * @arg @ref RCC_I2SCLKSOURCE_EXT External clock mapped on the I2S_CKIN pin - * used as I2S clock source - */ -#define __HAL_RCC_GET_I2S_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_I2SSRC))) -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** @brief Macro to configure SAI1BlockA clock source selection. - * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used - * as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used - * as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin - * used as SAI1 Block A clock. - */ -#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) - -/** @brief Macro to configure SAI1BlockB clock source selection. - * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block B clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used - * as SAI1 Block B clock. - * @arg RCC_SAIBCLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used - * as SAI1 Block B clock. - * @arg RCC_SAIBCLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin - * used as SAI1 Block B clock. - */ -#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F446xx) -/** @brief Macro to configure SAI1 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI1 clock source. - * This parameter can be one of the following values: - * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - */ -#define __HAL_RCC_SAI1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - */ -#define __HAL_RCC_GET_SAI1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC)) - -/** @brief Macro to configure SAI2 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI2 clock source. - * This parameter can be one of the following values: - * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. - */ -#define __HAL_RCC_SAI2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC, (__SOURCE__))) - -/** @brief Macro to Get SAI2 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. - */ -#define __HAL_RCC_GET_SAI2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC)) - -/** @brief Macro to configure I2S APB1 clock source selection. - * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. - * @param __SOURCE__ specifies the I2S APB1 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB1 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) - -/** @brief Macro to configure I2S APB2 clock source selection. - * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB2 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) - -/** @brief Macro to configure the CEC clock. - * @param __SOURCE__ specifies the CEC clock source. - * This parameter can be one of the following values: - * @arg RCC_CECCLKSOURCE_HSI: HSI selected as CEC clock - * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock - */ -#define __HAL_RCC_CEC_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CEC clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CECCLKSOURCE_HSI488: HSI selected as CEC clock - * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock - */ -#define __HAL_RCC_GET_CEC_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) - -/** @brief Macro to configure the SPDIFRX clock. - * @param __SOURCE__ specifies the SPDIFRX clock source. - * This parameter can be one of the following values: - * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. - * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. - */ -#define __HAL_RCC_SPDIFRX_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SPDIFRX clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. - * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. - */ -#define __HAL_RCC_GET_SPDIFRX_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL)) - -/** @brief Macro to configure the DSI clock. - * @param __SOURCE__ specifies the DSI clock source. - * This parameter can be one of the following values: - * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. - * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. - */ -#define __HAL_RCC_DSI_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the DSI clock. - * @retval The clock source can be one of the following values: - * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. - * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. - */ -#define __HAL_RCC_GET_DSI_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL)) - -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the DFSDM1 clock. - * @param __DFSDM1_CLKSOURCE__ specifies the DFSDM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernel clock. - * @retval None - */ -#define __HAL_RCC_DFSDM1_CONFIG(__DFSDM1_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM1_CLKSOURCE__)) - -/** @brief Macro to get the DFSDM1 clock source. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernel clock. - */ -#define __HAL_RCC_GET_DFSDM1_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) - -/** @brief Macro to configure DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ - STM32F413xx/STM32F423xx Devices. - * @param __SOURCE__ specifies the DFSDM1 Audio clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_DFSDM1AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL, (__SOURCE__))) - -/** @brief Macro to Get DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ - STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_GET_DFSDM1AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL)) - -#if defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the DFSDM2 clock. - * @param __DFSDM2_CLKSOURCE__ specifies the DFSDM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernel clock. - * @retval None - */ -#define __HAL_RCC_DFSDM2_CONFIG(__DFSDM2_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM2_CLKSOURCE__)) - -/** @brief Macro to get the DFSDM2 clock source. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernel clock. - */ -#define __HAL_RCC_GET_DFSDM2_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) - -/** @brief Macro to configure DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @param __SOURCE__ specifies the DFSDM2 Audio clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_DFSDM2AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL, (__SOURCE__))) - -/** @brief Macro to Get DFSDM2 Audio clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_GET_DFSDM2AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL)) - -/** @brief Macro to configure SAI1BlockA clock source selection. - * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 BlockA clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_SAI_BLOCKA_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC)) - -/** @brief Macro to configure SAI1 BlockB clock source selection. - * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block B clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 BlockB clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_SAI_BLOCKB_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC)) - -/** @brief Macro to configure the LPTIM1 clock. - * @param __SOURCE__ specifies the LPTIM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the LPTIM1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) -#endif /* STM32F413xx || STM32F423xx */ - -/** @brief Macro to configure I2S APB1 clock source selection. - * @param __SOURCE__ specifies the I2S APB1 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB1 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) - -/** @brief Macro to configure I2S APB2 clock source selection. - * @param __SOURCE__ specifies the I2S APB2 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB2 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) - -/** @brief Macro to configure the PLL I2S clock source (PLLI2SCLK). - * @note This macro must be called before enabling the I2S APB clock. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLI2SCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - * @arg RCC_PLLI2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin - * used as I2S clock source. - */ -#define __HAL_RCC_PLL_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_PLLI2SCFGR_PLLI2SSRC_BB = (__SOURCE__)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) - -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @brief Macro to configure I2S clock source selection. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. - * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. - */ -#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC, (__SOURCE__))) - -/** @brief Macro to Get I2S clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. - * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. - */ -#define __HAL_RCC_GET_I2S_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the LPTIM1 clock. - * @param __SOURCE__ specifies the LPTIM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the LPTIM1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the Timers clocks prescalers - * @note This feature is only available with STM32F429x/439x Devices. - * @param __PRESC__ specifies the Timers clocks prescalers selection - * This parameter can be one of the following values: - * @arg RCC_TIMPRES_DESACTIVATED: The Timers kernels clocks prescaler is - * equal to HPRE if PPREx is corresponding to division by 1 or 2, - * else it is equal to [(HPRE * PPREx) / 2] if PPREx is corresponding to - * division by 4 or more. - * @arg RCC_TIMPRES_ACTIVATED: The Timers kernels clocks prescaler is - * equal to HPRE if PPREx is corresponding to division by 1, 2 or 4, - * else it is equal to [(HPRE * PPREx) / 4] if PPREx is corresponding - * to division by 8 or more. - */ -#define __HAL_RCC_TIMCLKPRESCALER(__PRESC__) (*(__IO uint32_t *) RCC_DCKCFGR_TIMPRE_BB = (__PRESC__)) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx) || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE ||\ - STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx ||\ - STM32F423xx */ - -/*----------------------------------------------------------------------------*/ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Enable PLLSAI_RDY interrupt. - */ -#define __HAL_RCC_PLLSAI_ENABLE_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYIE)) - -/** @brief Disable PLLSAI_RDY interrupt. - */ -#define __HAL_RCC_PLLSAI_DISABLE_IT() (RCC->CIR &= ~(RCC_CIR_PLLSAIRDYIE)) - -/** @brief Clear the PLLSAI RDY interrupt pending bits. - */ -#define __HAL_RCC_PLLSAI_CLEAR_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYF)) - -/** @brief Check the PLLSAI RDY interrupt has occurred or not. - * @retval The new state (TRUE or FALSE). - */ -#define __HAL_RCC_PLLSAI_GET_IT() ((RCC->CIR & (RCC_CIR_PLLSAIRDYIE)) == (RCC_CIR_PLLSAIRDYIE)) - -/** @brief Check PLLSAI RDY flag is set or not. - * @retval The new state (TRUE or FALSE). - */ -#define __HAL_RCC_PLLSAI_GET_FLAG() ((RCC->CR & (RCC_CR_PLLSAIRDY)) == (RCC_CR_PLLSAIRDY)) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @brief Macros to enable or disable the RCC MCO1 feature. - */ -#define __HAL_RCC_MCO1_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = ENABLE) -#define __HAL_RCC_MCO1_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = DISABLE) - -/** @brief Macros to enable or disable the RCC MCO2 feature. - */ -#define __HAL_RCC_MCO2_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = ENABLE) -#define __HAL_RCC_MCO2_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = DISABLE) - -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup RCCEx_Exported_Functions - * @{ - */ - -/** @addtogroup RCCEx_Exported_Functions_Group1 - * @{ - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); - -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk); - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -void HAL_RCCEx_SelectLSEMode(uint8_t Mode); -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -#if defined(RCC_PLLI2S_SUPPORT) -HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit); -HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void); -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit); -HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void); -#endif /* RCC_PLLSAI_SUPPORT */ -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup RCCEx_Private_Constants RCCEx Private Constants - * @{ - */ - -/** @defgroup RCCEx_BitAddress_AliasRegion RCC BitAddress AliasRegion - * @brief RCC registers bit address in the alias region - * @{ - */ -/* --- CR Register ---*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/* Alias word address of PLLSAION bit */ -#define RCC_PLLSAION_BIT_NUMBER 0x1CU -#define RCC_CR_PLLSAION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLSAION_BIT_NUMBER * 4U)) - -#define PLLSAI_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/* Alias word address of PLLI2SON bit */ -#define RCC_PLLI2SON_BIT_NUMBER 0x1AU -#define RCC_CR_PLLI2SON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLI2SON_BIT_NUMBER * 4U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/* --- DCKCFGR Register ---*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ - defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/* Alias word address of TIMPRE bit */ -#define RCC_DCKCFGR_OFFSET (RCC_OFFSET + 0x8CU) -#define RCC_TIMPRE_BIT_NUMBER 0x18U -#define RCC_DCKCFGR_TIMPRE_BB (PERIPH_BB_BASE + (RCC_DCKCFGR_OFFSET * 32U) + (RCC_TIMPRE_BIT_NUMBER * 4U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F410xx || STM32F401xC ||\ - STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/* --- CFGR Register ---*/ -#define RCC_CFGR_OFFSET (RCC_OFFSET + 0x08U) -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) -/* Alias word address of I2SSRC bit */ -#define RCC_I2SSRC_BIT_NUMBER 0x17U -#define RCC_CFGR_I2SSRC_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_I2SSRC_BIT_NUMBER * 4U)) - -#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/* --- PLLI2SCFGR Register ---*/ -#define RCC_PLLI2SCFGR_OFFSET (RCC_OFFSET + 0x84U) -/* Alias word address of PLLI2SSRC bit */ -#define RCC_PLLI2SSRC_BIT_NUMBER 0x16U -#define RCC_PLLI2SCFGR_PLLI2SSRC_BB (PERIPH_BB_BASE\ - + (RCC_PLLI2SCFGR_OFFSET * 32U) + (RCC_PLLI2SSRC_BIT_NUMBER * 4U)) - -#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx | STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/* Alias word address of MCO1EN bit */ -#define RCC_MCO1EN_BIT_NUMBER 0x8U -#define RCC_CFGR_MCO1EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO1EN_BIT_NUMBER * 4U)) - -/* Alias word address of MCO2EN bit */ -#define RCC_MCO2EN_BIT_NUMBER 0x9U -#define RCC_CFGR_MCO2EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO2EN_BIT_NUMBER * 4U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#define PLL_TIMEOUT_VALUE 2U /* 2 ms */ -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup RCCEx_Private_Macros RCCEx Private Macros - * @{ - */ -/** @defgroup RCCEx_IS_RCC_Definitions RCC Private macros to check input parameters - * @{ - */ -#define IS_RCC_PLLN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) -#define IS_RCC_PLLI2SN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000007FU)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000007U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000000FU)) -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000001FU)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F446xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000FFFU)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000001FFU)) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000003FFU)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00007FFFU)) -#endif /* STM32F413xx || STM32F423xx */ - -#define IS_RCC_PLLI2SR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLSAIN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) - -#define IS_RCC_PLLSAIQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLSAIR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLSAI_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLI2S_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLSAI_DIVR_VALUE(VALUE) (((VALUE) == RCC_PLLSAIDIVR_2) ||\ - ((VALUE) == RCC_PLLSAIDIVR_4) ||\ - ((VALUE) == RCC_PLLSAIDIVR_8) ||\ - ((VALUE) == RCC_PLLSAIDIVR_16)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PLLI2SM_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 63U)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) -#endif /* STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) - -#define IS_RCC_I2SAPBCLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPBCLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLSRC)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F446xx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLI2SP_VALUE(VALUE) (((VALUE) == RCC_PLLI2SP_DIV2) ||\ - ((VALUE) == RCC_PLLI2SP_DIV4) ||\ - ((VALUE) == RCC_PLLI2SP_DIV6) ||\ - ((VALUE) == RCC_PLLI2SP_DIV8)) - -#define IS_RCC_PLLSAIM_VALUE(VALUE) ((VALUE) <= 63U) - -#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ - ((VALUE) == RCC_PLLSAIP_DIV4) ||\ - ((VALUE) == RCC_PLLSAIP_DIV6) ||\ - ((VALUE) == RCC_PLLSAIP_DIV8)) - -#define IS_RCC_SAI1CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI1CLKSOURCE_PLLSAI) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_EXT)) - -#define IS_RCC_SAI2CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI2CLKSOURCE_PLLSAI) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLSRC)) - -#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) - -#define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_CECCLKSOURCE(SOURCE) (((SOURCE) == RCC_CECCLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_CECCLKSOURCE_LSE)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_SPDIFRXCLKSOURCE(SOURCE) (((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ - ((VALUE) == RCC_PLLSAIP_DIV4) ||\ - ((VALUE) == RCC_PLLSAIP_DIV6) ||\ - ((VALUE) == RCC_PLLSAIP_DIV8)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_DSIBYTELANECLKSOURCE(SOURCE) (((SOURCE) == RCC_DSICLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_DSICLKSOURCE_DSIPHY)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLI2SCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_PLLI2SCLKSOURCE_PLLSRC) || \ - ((__SOURCE__) == RCC_PLLI2SCLKSOURCE_EXT)) - -#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) - -#define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLI2SQ)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM1CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1CLKSOURCE_PCLK2) || \ - ((__SOURCE__) == RCC_DFSDM1CLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM1AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S1) || \ - ((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S2)) - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_DFSDM2CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2CLKSOURCE_PCLK2) || \ - ((__SOURCE__) == RCC_DFSDM2CLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM2AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S1) || \ - ((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S2)) - -#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) - -#define IS_RCC_SAIACLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIACLKSOURCE_PLLI2SR) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_PLLSRC)) - -#define IS_RCC_SAIBCLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIBCLKSOURCE_PLLI2SR) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_PLLSRC)) - -#define IS_RCC_PLL_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLI2S_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#endif /* STM32F413xx || STM32F423xx */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - -#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_PLLI2SCLK)|| \ - ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) - -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || \ - STM32F412Rx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_I2SCLK)|| \ - ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_RCC_EX_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h deleted file mode 100644 index 4e2de04..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h +++ /dev/null @@ -1,729 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_spi.h - * @author MCD Application Team - * @brief Header file of SPI HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_SPI_H -#define STM32F4xx_HAL_SPI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup SPI - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup SPI_Exported_Types SPI Exported Types - * @{ - */ - -/** - * @brief SPI Configuration Structure definition - */ -typedef struct -{ - uint32_t Mode; /*!< Specifies the SPI operating mode. - This parameter can be a value of @ref SPI_Mode */ - - uint32_t Direction; /*!< Specifies the SPI bidirectional mode state. - This parameter can be a value of @ref SPI_Direction */ - - uint32_t DataSize; /*!< Specifies the SPI data size. - This parameter can be a value of @ref SPI_Data_Size */ - - uint32_t CLKPolarity; /*!< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_Clock_Polarity */ - - uint32_t CLKPhase; /*!< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_Clock_Phase */ - - uint32_t NSS; /*!< Specifies whether the NSS signal is managed by - hardware (NSS pin) or by software using the SSI bit. - This parameter can be a value of @ref SPI_Slave_Select_management */ - - uint32_t BaudRatePrescaler; /*!< Specifies the Baud Rate prescaler value which will be - used to configure the transmit and receive SCK clock. - This parameter can be a value of @ref SPI_BaudRate_Prescaler - @note The communication clock is derived from the master - clock. The slave clock does not need to be set. */ - - uint32_t FirstBit; /*!< Specifies whether data transfers start from MSB or LSB bit. - This parameter can be a value of @ref SPI_MSB_LSB_transmission */ - - uint32_t TIMode; /*!< Specifies if the TI mode is enabled or not. - This parameter can be a value of @ref SPI_TI_mode */ - - uint32_t CRCCalculation; /*!< Specifies if the CRC calculation is enabled or not. - This parameter can be a value of @ref SPI_CRC_Calculation */ - - uint32_t CRCPolynomial; /*!< Specifies the polynomial used for the CRC calculation. - This parameter must be an odd number between Min_Data = 1 and Max_Data = 65535 */ -} SPI_InitTypeDef; - -/** - * @brief HAL SPI State structure definition - */ -typedef enum -{ - HAL_SPI_STATE_RESET = 0x00U, /*!< Peripheral not Initialized */ - HAL_SPI_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ - HAL_SPI_STATE_BUSY = 0x02U, /*!< an internal process is ongoing */ - HAL_SPI_STATE_BUSY_TX = 0x03U, /*!< Data Transmission process is ongoing */ - HAL_SPI_STATE_BUSY_RX = 0x04U, /*!< Data Reception process is ongoing */ - HAL_SPI_STATE_BUSY_TX_RX = 0x05U, /*!< Data Transmission and Reception process is ongoing */ - HAL_SPI_STATE_ERROR = 0x06U, /*!< SPI error state */ - HAL_SPI_STATE_ABORT = 0x07U /*!< SPI abort is ongoing */ -} HAL_SPI_StateTypeDef; - -/** - * @brief SPI handle Structure definition - */ -typedef struct __SPI_HandleTypeDef -{ - SPI_TypeDef *Instance; /*!< SPI registers base address */ - - SPI_InitTypeDef Init; /*!< SPI communication parameters */ - - const uint8_t *pTxBuffPtr; /*!< Pointer to SPI Tx transfer Buffer */ - - uint16_t TxXferSize; /*!< SPI Tx Transfer size */ - - __IO uint16_t TxXferCount; /*!< SPI Tx Transfer Counter */ - - uint8_t *pRxBuffPtr; /*!< Pointer to SPI Rx transfer Buffer */ - - uint16_t RxXferSize; /*!< SPI Rx Transfer size */ - - __IO uint16_t RxXferCount; /*!< SPI Rx Transfer Counter */ - - void (*RxISR)(struct __SPI_HandleTypeDef *hspi); /*!< function pointer on Rx ISR */ - - void (*TxISR)(struct __SPI_HandleTypeDef *hspi); /*!< function pointer on Tx ISR */ - - DMA_HandleTypeDef *hdmatx; /*!< SPI Tx DMA Handle parameters */ - - DMA_HandleTypeDef *hdmarx; /*!< SPI Rx DMA Handle parameters */ - - HAL_LockTypeDef Lock; /*!< Locking object */ - - __IO HAL_SPI_StateTypeDef State; /*!< SPI communication state */ - - __IO uint32_t ErrorCode; /*!< SPI Error code */ - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - void (* TxCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Tx Completed callback */ - void (* RxCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Rx Completed callback */ - void (* TxRxCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI TxRx Completed callback */ - void (* TxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Tx Half Completed callback */ - void (* RxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Rx Half Completed callback */ - void (* TxRxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI TxRx Half Completed callback */ - void (* ErrorCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Error callback */ - void (* AbortCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Abort callback */ - void (* MspInitCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Msp Init callback */ - void (* MspDeInitCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Msp DeInit callback */ - -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} SPI_HandleTypeDef; - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -/** - * @brief HAL SPI Callback ID enumeration definition - */ -typedef enum -{ - HAL_SPI_TX_COMPLETE_CB_ID = 0x00U, /*!< SPI Tx Completed callback ID */ - HAL_SPI_RX_COMPLETE_CB_ID = 0x01U, /*!< SPI Rx Completed callback ID */ - HAL_SPI_TX_RX_COMPLETE_CB_ID = 0x02U, /*!< SPI TxRx Completed callback ID */ - HAL_SPI_TX_HALF_COMPLETE_CB_ID = 0x03U, /*!< SPI Tx Half Completed callback ID */ - HAL_SPI_RX_HALF_COMPLETE_CB_ID = 0x04U, /*!< SPI Rx Half Completed callback ID */ - HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID = 0x05U, /*!< SPI TxRx Half Completed callback ID */ - HAL_SPI_ERROR_CB_ID = 0x06U, /*!< SPI Error callback ID */ - HAL_SPI_ABORT_CB_ID = 0x07U, /*!< SPI Abort callback ID */ - HAL_SPI_MSPINIT_CB_ID = 0x08U, /*!< SPI Msp Init callback ID */ - HAL_SPI_MSPDEINIT_CB_ID = 0x09U /*!< SPI Msp DeInit callback ID */ - -} HAL_SPI_CallbackIDTypeDef; - -/** - * @brief HAL SPI Callback pointer definition - */ -typedef void (*pSPI_CallbackTypeDef)(SPI_HandleTypeDef *hspi); /*!< pointer to an SPI callback function */ - -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SPI_Exported_Constants SPI Exported Constants - * @{ - */ - -/** @defgroup SPI_Error_Code SPI Error Code - * @{ - */ -#define HAL_SPI_ERROR_NONE (0x00000000U) /*!< No error */ -#define HAL_SPI_ERROR_MODF (0x00000001U) /*!< MODF error */ -#define HAL_SPI_ERROR_CRC (0x00000002U) /*!< CRC error */ -#define HAL_SPI_ERROR_OVR (0x00000004U) /*!< OVR error */ -#define HAL_SPI_ERROR_FRE (0x00000008U) /*!< FRE error */ -#define HAL_SPI_ERROR_DMA (0x00000010U) /*!< DMA transfer error */ -#define HAL_SPI_ERROR_FLAG (0x00000020U) /*!< Error on RXNE/TXE/BSY Flag */ -#define HAL_SPI_ERROR_ABORT (0x00000040U) /*!< Error during SPI Abort procedure */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -#define HAL_SPI_ERROR_INVALID_CALLBACK (0x00000080U) /*!< Invalid Callback error */ -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup SPI_Mode SPI Mode - * @{ - */ -#define SPI_MODE_SLAVE (0x00000000U) -#define SPI_MODE_MASTER (SPI_CR1_MSTR | SPI_CR1_SSI) -/** - * @} - */ - -/** @defgroup SPI_Direction SPI Direction Mode - * @{ - */ -#define SPI_DIRECTION_2LINES (0x00000000U) -#define SPI_DIRECTION_2LINES_RXONLY SPI_CR1_RXONLY -#define SPI_DIRECTION_1LINE SPI_CR1_BIDIMODE -/** - * @} - */ - -/** @defgroup SPI_Data_Size SPI Data Size - * @{ - */ -#define SPI_DATASIZE_8BIT (0x00000000U) -#define SPI_DATASIZE_16BIT SPI_CR1_DFF -/** - * @} - */ - -/** @defgroup SPI_Clock_Polarity SPI Clock Polarity - * @{ - */ -#define SPI_POLARITY_LOW (0x00000000U) -#define SPI_POLARITY_HIGH SPI_CR1_CPOL -/** - * @} - */ - -/** @defgroup SPI_Clock_Phase SPI Clock Phase - * @{ - */ -#define SPI_PHASE_1EDGE (0x00000000U) -#define SPI_PHASE_2EDGE SPI_CR1_CPHA -/** - * @} - */ - -/** @defgroup SPI_Slave_Select_management SPI Slave Select Management - * @{ - */ -#define SPI_NSS_SOFT SPI_CR1_SSM -#define SPI_NSS_HARD_INPUT (0x00000000U) -#define SPI_NSS_HARD_OUTPUT (SPI_CR2_SSOE << 16U) -/** - * @} - */ - -/** @defgroup SPI_BaudRate_Prescaler SPI BaudRate Prescaler - * @{ - */ -#define SPI_BAUDRATEPRESCALER_2 (0x00000000U) -#define SPI_BAUDRATEPRESCALER_4 (SPI_CR1_BR_0) -#define SPI_BAUDRATEPRESCALER_8 (SPI_CR1_BR_1) -#define SPI_BAUDRATEPRESCALER_16 (SPI_CR1_BR_1 | SPI_CR1_BR_0) -#define SPI_BAUDRATEPRESCALER_32 (SPI_CR1_BR_2) -#define SPI_BAUDRATEPRESCALER_64 (SPI_CR1_BR_2 | SPI_CR1_BR_0) -#define SPI_BAUDRATEPRESCALER_128 (SPI_CR1_BR_2 | SPI_CR1_BR_1) -#define SPI_BAUDRATEPRESCALER_256 (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0) -/** - * @} - */ - -/** @defgroup SPI_MSB_LSB_transmission SPI MSB LSB Transmission - * @{ - */ -#define SPI_FIRSTBIT_MSB (0x00000000U) -#define SPI_FIRSTBIT_LSB SPI_CR1_LSBFIRST -/** - * @} - */ - -/** @defgroup SPI_TI_mode SPI TI Mode - * @{ - */ -#define SPI_TIMODE_DISABLE (0x00000000U) -#define SPI_TIMODE_ENABLE SPI_CR2_FRF -/** - * @} - */ - -/** @defgroup SPI_CRC_Calculation SPI CRC Calculation - * @{ - */ -#define SPI_CRCCALCULATION_DISABLE (0x00000000U) -#define SPI_CRCCALCULATION_ENABLE SPI_CR1_CRCEN -/** - * @} - */ - -/** @defgroup SPI_Interrupt_definition SPI Interrupt Definition - * @{ - */ -#define SPI_IT_TXE SPI_CR2_TXEIE -#define SPI_IT_RXNE SPI_CR2_RXNEIE -#define SPI_IT_ERR SPI_CR2_ERRIE -/** - * @} - */ - -/** @defgroup SPI_Flags_definition SPI Flags Definition - * @{ - */ -#define SPI_FLAG_RXNE SPI_SR_RXNE /* SPI status flag: Rx buffer not empty flag */ -#define SPI_FLAG_TXE SPI_SR_TXE /* SPI status flag: Tx buffer empty flag */ -#define SPI_FLAG_BSY SPI_SR_BSY /* SPI status flag: Busy flag */ -#define SPI_FLAG_CRCERR SPI_SR_CRCERR /* SPI Error flag: CRC error flag */ -#define SPI_FLAG_MODF SPI_SR_MODF /* SPI Error flag: Mode fault flag */ -#define SPI_FLAG_OVR SPI_SR_OVR /* SPI Error flag: Overrun flag */ -#define SPI_FLAG_FRE SPI_SR_FRE /* SPI Error flag: TI mode frame format error flag */ -#define SPI_FLAG_MASK (SPI_SR_RXNE | SPI_SR_TXE | SPI_SR_BSY | SPI_SR_CRCERR\ - | SPI_SR_MODF | SPI_SR_OVR | SPI_SR_FRE) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup SPI_Exported_Macros SPI Exported Macros - * @{ - */ - -/** @brief Reset SPI handle state. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -#define __HAL_SPI_RESET_HANDLE_STATE(__HANDLE__) do{ \ - (__HANDLE__)->State = HAL_SPI_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_SPI_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_SPI_STATE_RESET) -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - -/** @brief Enable the specified SPI interrupts. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @param __INTERRUPT__ specifies the interrupt source to enable. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval None - */ -#define __HAL_SPI_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__)) - -/** @brief Disable the specified SPI interrupts. - * @param __HANDLE__ specifies the SPI handle. - * This parameter can be SPIx where x: 1, 2, or 3 to select the SPI peripheral. - * @param __INTERRUPT__ specifies the interrupt source to disable. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval None - */ -#define __HAL_SPI_DISABLE_IT(__HANDLE__, __INTERRUPT__) CLEAR_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__)) - -/** @brief Check whether the specified SPI interrupt source is enabled or not. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @param __INTERRUPT__ specifies the SPI interrupt source to check. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval The new state of __IT__ (TRUE or FALSE). - */ -#define __HAL_SPI_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2\ - & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) - -/** @brief Check whether the specified SPI flag is set or not. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg SPI_FLAG_RXNE: Receive buffer not empty flag - * @arg SPI_FLAG_TXE: Transmit buffer empty flag - * @arg SPI_FLAG_CRCERR: CRC error flag - * @arg SPI_FLAG_MODF: Mode fault flag - * @arg SPI_FLAG_OVR: Overrun flag - * @arg SPI_FLAG_BSY: Busy flag - * @arg SPI_FLAG_FRE: Frame format error flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_SPI_GET_FLAG(__HANDLE__, __FLAG__) ((((__HANDLE__)->Instance->SR) & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the SPI CRCERR pending flag. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_CRCERRFLAG(__HANDLE__) ((__HANDLE__)->Instance->SR = (uint16_t)(~SPI_FLAG_CRCERR)) - -/** @brief Clear the SPI MODF pending flag. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_MODFFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg_modf = 0x00U; \ - tmpreg_modf = (__HANDLE__)->Instance->SR; \ - CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE); \ - UNUSED(tmpreg_modf); \ - } while(0U) - -/** @brief Clear the SPI OVR pending flag. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_OVRFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg_ovr = 0x00U; \ - tmpreg_ovr = (__HANDLE__)->Instance->DR; \ - tmpreg_ovr = (__HANDLE__)->Instance->SR; \ - UNUSED(tmpreg_ovr); \ - } while(0U) - -/** @brief Clear the SPI FRE pending flag. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_FREFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg_fre = 0x00U; \ - tmpreg_fre = (__HANDLE__)->Instance->SR; \ - UNUSED(tmpreg_fre); \ - }while(0U) - -/** @brief Enable the SPI peripheral. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_ENABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE) - -/** @brief Disable the SPI peripheral. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE) - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup SPI_Private_Macros SPI Private Macros - * @{ - */ - -/** @brief Set the SPI transmit-only mode. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define SPI_1LINE_TX(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_BIDIOE) - -/** @brief Set the SPI receive-only mode. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define SPI_1LINE_RX(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_BIDIOE) - -/** @brief Reset the CRC calculation of the SPI. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define SPI_RESET_CRC(__HANDLE__) do{CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_CRCEN);\ - SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_CRCEN);}while(0U) - -/** @brief Check whether the specified SPI flag is set or not. - * @param __SR__ copy of SPI SR register. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg SPI_FLAG_RXNE: Receive buffer not empty flag - * @arg SPI_FLAG_TXE: Transmit buffer empty flag - * @arg SPI_FLAG_CRCERR: CRC error flag - * @arg SPI_FLAG_MODF: Mode fault flag - * @arg SPI_FLAG_OVR: Overrun flag - * @arg SPI_FLAG_BSY: Busy flag - * @arg SPI_FLAG_FRE: Frame format error flag - * @retval SET or RESET. - */ -#define SPI_CHECK_FLAG(__SR__, __FLAG__) ((((__SR__) & ((__FLAG__) & SPI_FLAG_MASK)) == \ - ((__FLAG__) & SPI_FLAG_MASK)) ? SET : RESET) - -/** @brief Check whether the specified SPI Interrupt is set or not. - * @param __CR2__ copy of SPI CR2 register. - * @param __INTERRUPT__ specifies the SPI interrupt source to check. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval SET or RESET. - */ -#define SPI_CHECK_IT_SOURCE(__CR2__, __INTERRUPT__) ((((__CR2__) & (__INTERRUPT__)) == \ - (__INTERRUPT__)) ? SET : RESET) - -/** @brief Checks if SPI Mode parameter is in allowed range. - * @param __MODE__ specifies the SPI Mode. - * This parameter can be a value of @ref SPI_Mode - * @retval None - */ -#define IS_SPI_MODE(__MODE__) (((__MODE__) == SPI_MODE_SLAVE) || \ - ((__MODE__) == SPI_MODE_MASTER)) - -/** @brief Checks if SPI Direction Mode parameter is in allowed range. - * @param __MODE__ specifies the SPI Direction Mode. - * This parameter can be a value of @ref SPI_Direction - * @retval None - */ -#define IS_SPI_DIRECTION(__MODE__) (((__MODE__) == SPI_DIRECTION_2LINES) || \ - ((__MODE__) == SPI_DIRECTION_2LINES_RXONLY) || \ - ((__MODE__) == SPI_DIRECTION_1LINE)) - -/** @brief Checks if SPI Direction Mode parameter is 2 lines. - * @param __MODE__ specifies the SPI Direction Mode. - * @retval None - */ -#define IS_SPI_DIRECTION_2LINES(__MODE__) ((__MODE__) == SPI_DIRECTION_2LINES) - -/** @brief Checks if SPI Direction Mode parameter is 1 or 2 lines. - * @param __MODE__ specifies the SPI Direction Mode. - * @retval None - */ -#define IS_SPI_DIRECTION_2LINES_OR_1LINE(__MODE__) (((__MODE__) == SPI_DIRECTION_2LINES) || \ - ((__MODE__) == SPI_DIRECTION_1LINE)) - -/** @brief Checks if SPI Data Size parameter is in allowed range. - * @param __DATASIZE__ specifies the SPI Data Size. - * This parameter can be a value of @ref SPI_Data_Size - * @retval None - */ -#define IS_SPI_DATASIZE(__DATASIZE__) (((__DATASIZE__) == SPI_DATASIZE_16BIT) || \ - ((__DATASIZE__) == SPI_DATASIZE_8BIT)) - -/** @brief Checks if SPI Serial clock steady state parameter is in allowed range. - * @param __CPOL__ specifies the SPI serial clock steady state. - * This parameter can be a value of @ref SPI_Clock_Polarity - * @retval None - */ -#define IS_SPI_CPOL(__CPOL__) (((__CPOL__) == SPI_POLARITY_LOW) || \ - ((__CPOL__) == SPI_POLARITY_HIGH)) - -/** @brief Checks if SPI Clock Phase parameter is in allowed range. - * @param __CPHA__ specifies the SPI Clock Phase. - * This parameter can be a value of @ref SPI_Clock_Phase - * @retval None - */ -#define IS_SPI_CPHA(__CPHA__) (((__CPHA__) == SPI_PHASE_1EDGE) || \ - ((__CPHA__) == SPI_PHASE_2EDGE)) - -/** @brief Checks if SPI Slave Select parameter is in allowed range. - * @param __NSS__ specifies the SPI Slave Select management parameter. - * This parameter can be a value of @ref SPI_Slave_Select_management - * @retval None - */ -#define IS_SPI_NSS(__NSS__) (((__NSS__) == SPI_NSS_SOFT) || \ - ((__NSS__) == SPI_NSS_HARD_INPUT) || \ - ((__NSS__) == SPI_NSS_HARD_OUTPUT)) - -/** @brief Checks if SPI Baudrate prescaler parameter is in allowed range. - * @param __PRESCALER__ specifies the SPI Baudrate prescaler. - * This parameter can be a value of @ref SPI_BaudRate_Prescaler - * @retval None - */ -#define IS_SPI_BAUDRATE_PRESCALER(__PRESCALER__) (((__PRESCALER__) == SPI_BAUDRATEPRESCALER_2) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_4) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_8) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_16) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_32) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_64) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_128) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_256)) - -/** @brief Checks if SPI MSB LSB transmission parameter is in allowed range. - * @param __BIT__ specifies the SPI MSB LSB transmission (whether data transfer starts from MSB or LSB bit). - * This parameter can be a value of @ref SPI_MSB_LSB_transmission - * @retval None - */ -#define IS_SPI_FIRST_BIT(__BIT__) (((__BIT__) == SPI_FIRSTBIT_MSB) || \ - ((__BIT__) == SPI_FIRSTBIT_LSB)) - -/** @brief Checks if SPI TI mode parameter is in allowed range. - * @param __MODE__ specifies the SPI TI mode. - * This parameter can be a value of @ref SPI_TI_mode - * @retval None - */ -#define IS_SPI_TIMODE(__MODE__) (((__MODE__) == SPI_TIMODE_DISABLE) || \ - ((__MODE__) == SPI_TIMODE_ENABLE)) - -/** @brief Checks if SPI CRC calculation enabled state is in allowed range. - * @param __CALCULATION__ specifies the SPI CRC calculation enable state. - * This parameter can be a value of @ref SPI_CRC_Calculation - * @retval None - */ -#define IS_SPI_CRC_CALCULATION(__CALCULATION__) (((__CALCULATION__) == SPI_CRCCALCULATION_DISABLE) || \ - ((__CALCULATION__) == SPI_CRCCALCULATION_ENABLE)) - -/** @brief Checks if SPI polynomial value to be used for the CRC calculation, is in allowed range. - * @param __POLYNOMIAL__ specifies the SPI polynomial value to be used for the CRC calculation. - * This parameter must be a number between Min_Data = 0 and Max_Data = 65535 - * @retval None - */ -#define IS_SPI_CRC_POLYNOMIAL(__POLYNOMIAL__) (((__POLYNOMIAL__) >= 0x1U) && \ - ((__POLYNOMIAL__) <= 0xFFFFU) && \ - (((__POLYNOMIAL__)&0x1U) != 0U)) - -/** @brief Checks if DMA handle is valid. - * @param __HANDLE__ specifies a DMA Handle. - * @retval None - */ -#define IS_SPI_DMA_HANDLE(__HANDLE__) ((__HANDLE__) != NULL) - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup SPI_Exported_Functions - * @{ - */ - -/** @addtogroup SPI_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions ********************************/ -HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi); -void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi); -void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID, - pSPI_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @addtogroup SPI_Exported_Functions_Group2 - * @{ - */ -/* I/O operation functions ***************************************************/ -HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size); -HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size); -HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi); -/* Transfer Abort functions */ -HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi); - -void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi); -/** - * @} - */ - -/** @addtogroup SPI_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State and Error functions ***************************************/ -HAL_SPI_StateTypeDef HAL_SPI_GetState(const SPI_HandleTypeDef *hspi); -uint32_t HAL_SPI_GetError(const SPI_HandleTypeDef *hspi); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_SPI_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h deleted file mode 100644 index 1a8357c..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h +++ /dev/null @@ -1,2155 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim.h - * @author MCD Application Team - * @brief Header file of TIM HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_TIM_H -#define STM32F4xx_HAL_TIM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup TIM - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup TIM_Exported_Types TIM Exported Types - * @{ - */ - -/** - * @brief TIM Time base Configuration Structure definition - */ -typedef struct -{ - uint32_t Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t CounterMode; /*!< Specifies the counter mode. - This parameter can be a value of @ref TIM_Counter_Mode */ - - uint32_t Period; /*!< Specifies the period value to be loaded into the active - Auto-Reload Register at the next update event. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ - - uint32_t ClockDivision; /*!< Specifies the clock division. - This parameter can be a value of @ref TIM_ClockDivision */ - - uint32_t RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter - reaches zero, an update event is generated and counting restarts - from the RCR value (N). - This means in PWM mode that (N+1) corresponds to: - - the number of PWM periods in edge-aligned mode - - the number of half PWM period in center-aligned mode - GP timers: this parameter must be a number between Min_Data = 0x00 and - Max_Data = 0xFF. - Advanced timers: this parameter must be a number between Min_Data = 0x0000 and - Max_Data = 0xFFFF. */ - - uint32_t AutoReloadPreload; /*!< Specifies the auto-reload preload. - This parameter can be a value of @ref TIM_AutoReloadPreload */ -} TIM_Base_InitTypeDef; - -/** - * @brief TIM Output Compare Configuration Structure definition - */ -typedef struct -{ - uint32_t OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCFastMode; /*!< Specifies the Fast mode state. - This parameter can be a value of @ref TIM_Output_Fast_State - @note This parameter is valid only in PWM1 and PWM2 mode. */ - - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ -} TIM_OC_InitTypeDef; - -/** - * @brief TIM One Pulse Mode Configuration Structure definition - */ -typedef struct -{ - uint32_t OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_OnePulse_InitTypeDef; - -/** - * @brief TIM Input Capture Configuration Structure definition - */ -typedef struct -{ - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_IC_InitTypeDef; - -/** - * @brief TIM Encoder Configuration Structure definition - */ -typedef struct -{ - uint32_t EncoderMode; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Mode */ - - uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ - - uint32_t IC1Selection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC1Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ - - uint32_t IC2Selection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t IC2Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC2Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_Encoder_InitTypeDef; - -/** - * @brief Clock Configuration Handle Structure definition - */ -typedef struct -{ - uint32_t ClockSource; /*!< TIM clock sources - This parameter can be a value of @ref TIM_Clock_Source */ - uint32_t ClockPolarity; /*!< TIM clock polarity - This parameter can be a value of @ref TIM_Clock_Polarity */ - uint32_t ClockPrescaler; /*!< TIM clock prescaler - This parameter can be a value of @ref TIM_Clock_Prescaler */ - uint32_t ClockFilter; /*!< TIM clock filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_ClockConfigTypeDef; - -/** - * @brief TIM Clear Input Configuration Handle Structure definition - */ -typedef struct -{ - uint32_t ClearInputState; /*!< TIM clear Input state - This parameter can be ENABLE or DISABLE */ - uint32_t ClearInputSource; /*!< TIM clear Input sources - This parameter can be a value of @ref TIM_ClearInput_Source */ - uint32_t ClearInputPolarity; /*!< TIM Clear Input polarity - This parameter can be a value of @ref TIM_ClearInput_Polarity */ - uint32_t ClearInputPrescaler; /*!< TIM Clear Input prescaler - This parameter must be 0: When OCRef clear feature is used with ETR source, - ETR prescaler must be off */ - uint32_t ClearInputFilter; /*!< TIM Clear Input filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_ClearInputConfigTypeDef; - -/** - * @brief TIM Master configuration Structure definition - */ -typedef struct -{ - uint32_t MasterOutputTrigger; /*!< Trigger output (TRGO) selection - This parameter can be a value of @ref TIM_Master_Mode_Selection */ - uint32_t MasterSlaveMode; /*!< Master/slave mode selection - This parameter can be a value of @ref TIM_Master_Slave_Mode - @note When the Master/slave mode is enabled, the effect of - an event on the trigger input (TRGI) is delayed to allow a - perfect synchronization between the current timer and its - slaves (through TRGO). It is not mandatory in case of timer - synchronization mode. */ -} TIM_MasterConfigTypeDef; - -/** - * @brief TIM Slave configuration Structure definition - */ -typedef struct -{ - uint32_t SlaveMode; /*!< Slave mode selection - This parameter can be a value of @ref TIM_Slave_Mode */ - uint32_t InputTrigger; /*!< Input Trigger source - This parameter can be a value of @ref TIM_Trigger_Selection */ - uint32_t TriggerPolarity; /*!< Input Trigger polarity - This parameter can be a value of @ref TIM_Trigger_Polarity */ - uint32_t TriggerPrescaler; /*!< Input trigger prescaler - This parameter can be a value of @ref TIM_Trigger_Prescaler */ - uint32_t TriggerFilter; /*!< Input trigger filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - -} TIM_SlaveConfigTypeDef; - -/** - * @brief TIM Break input(s) and Dead time configuration Structure definition - * @note 2 break inputs can be configured (BKIN and BKIN2) with configurable - * filter and polarity. - */ -typedef struct -{ - uint32_t OffStateRunMode; /*!< TIM off state in run mode, This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */ - - uint32_t OffStateIDLEMode; /*!< TIM off state in IDLE mode, This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */ - - uint32_t LockLevel; /*!< TIM Lock level, This parameter can be a value of @ref TIM_Lock_level */ - - uint32_t DeadTime; /*!< TIM dead Time, This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF */ - - uint32_t BreakState; /*!< TIM Break State, This parameter can be a value of @ref TIM_Break_Input_enable_disable */ - - uint32_t BreakPolarity; /*!< TIM Break input polarity, This parameter can be a value of @ref TIM_Break_Polarity */ - - uint32_t BreakFilter; /*!< Specifies the break input filter.This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t AutomaticOutput; /*!< TIM Automatic Output Enable state, This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ - -} TIM_BreakDeadTimeConfigTypeDef; - -/** - * @brief HAL State structures definition - */ -typedef enum -{ - HAL_TIM_STATE_RESET = 0x00U, /*!< Peripheral not yet initialized or disabled */ - HAL_TIM_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ - HAL_TIM_STATE_BUSY = 0x02U, /*!< An internal process is ongoing */ - HAL_TIM_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ - HAL_TIM_STATE_ERROR = 0x04U /*!< Reception process is ongoing */ -} HAL_TIM_StateTypeDef; - -/** - * @brief TIM Channel States definition - */ -typedef enum -{ - HAL_TIM_CHANNEL_STATE_RESET = 0x00U, /*!< TIM Channel initial state */ - HAL_TIM_CHANNEL_STATE_READY = 0x01U, /*!< TIM Channel ready for use */ - HAL_TIM_CHANNEL_STATE_BUSY = 0x02U, /*!< An internal process is ongoing on the TIM channel */ -} HAL_TIM_ChannelStateTypeDef; - -/** - * @brief DMA Burst States definition - */ -typedef enum -{ - HAL_DMA_BURST_STATE_RESET = 0x00U, /*!< DMA Burst initial state */ - HAL_DMA_BURST_STATE_READY = 0x01U, /*!< DMA Burst ready for use */ - HAL_DMA_BURST_STATE_BUSY = 0x02U, /*!< Ongoing DMA Burst */ -} HAL_TIM_DMABurstStateTypeDef; - -/** - * @brief HAL Active channel structures definition - */ -typedef enum -{ - HAL_TIM_ACTIVE_CHANNEL_1 = 0x01U, /*!< The active channel is 1 */ - HAL_TIM_ACTIVE_CHANNEL_2 = 0x02U, /*!< The active channel is 2 */ - HAL_TIM_ACTIVE_CHANNEL_3 = 0x04U, /*!< The active channel is 3 */ - HAL_TIM_ACTIVE_CHANNEL_4 = 0x08U, /*!< The active channel is 4 */ - HAL_TIM_ACTIVE_CHANNEL_CLEARED = 0x00U /*!< All active channels cleared */ -} HAL_TIM_ActiveChannel; - -/** - * @brief TIM Time Base Handle Structure definition - */ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -typedef struct __TIM_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -{ - TIM_TypeDef *Instance; /*!< Register base address */ - TIM_Base_InitTypeDef Init; /*!< TIM Time Base required parameters */ - HAL_TIM_ActiveChannel Channel; /*!< Active channel */ - DMA_HandleTypeDef *hdma[7]; /*!< DMA Handlers array - This array is accessed by a @ref DMA_Handle_index */ - HAL_LockTypeDef Lock; /*!< Locking object */ - __IO HAL_TIM_StateTypeDef State; /*!< TIM operation state */ - __IO HAL_TIM_ChannelStateTypeDef ChannelState[4]; /*!< TIM channel operation state */ - __IO HAL_TIM_ChannelStateTypeDef ChannelNState[4]; /*!< TIM complementary channel operation state */ - __IO HAL_TIM_DMABurstStateTypeDef DMABurstState; /*!< DMA burst operation state */ - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - void (* Base_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp Init Callback */ - void (* Base_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp DeInit Callback */ - void (* IC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp Init Callback */ - void (* IC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp DeInit Callback */ - void (* OC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp Init Callback */ - void (* OC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp DeInit Callback */ - void (* PWM_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp Init Callback */ - void (* PWM_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp DeInit Callback */ - void (* OnePulse_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp Init Callback */ - void (* OnePulse_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp DeInit Callback */ - void (* Encoder_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp Init Callback */ - void (* Encoder_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp DeInit Callback */ - void (* HallSensor_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp Init Callback */ - void (* HallSensor_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp DeInit Callback */ - void (* PeriodElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed Callback */ - void (* PeriodElapsedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed half complete Callback */ - void (* TriggerCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger Callback */ - void (* TriggerHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger half complete Callback */ - void (* IC_CaptureCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture Callback */ - void (* IC_CaptureHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture half complete Callback */ - void (* OC_DelayElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Output Compare Delay Elapsed Callback */ - void (* PWM_PulseFinishedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished Callback */ - void (* PWM_PulseFinishedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished half complete Callback */ - void (* ErrorCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Error Callback */ - void (* CommutationCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation Callback */ - void (* CommutationHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation half complete Callback */ - void (* BreakCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Break Callback */ -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} TIM_HandleTypeDef; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief HAL TIM Callback ID enumeration definition - */ -typedef enum -{ - HAL_TIM_BASE_MSPINIT_CB_ID = 0x00U /*!< TIM Base MspInit Callback ID */ - , HAL_TIM_BASE_MSPDEINIT_CB_ID = 0x01U /*!< TIM Base MspDeInit Callback ID */ - , HAL_TIM_IC_MSPINIT_CB_ID = 0x02U /*!< TIM IC MspInit Callback ID */ - , HAL_TIM_IC_MSPDEINIT_CB_ID = 0x03U /*!< TIM IC MspDeInit Callback ID */ - , HAL_TIM_OC_MSPINIT_CB_ID = 0x04U /*!< TIM OC MspInit Callback ID */ - , HAL_TIM_OC_MSPDEINIT_CB_ID = 0x05U /*!< TIM OC MspDeInit Callback ID */ - , HAL_TIM_PWM_MSPINIT_CB_ID = 0x06U /*!< TIM PWM MspInit Callback ID */ - , HAL_TIM_PWM_MSPDEINIT_CB_ID = 0x07U /*!< TIM PWM MspDeInit Callback ID */ - , HAL_TIM_ONE_PULSE_MSPINIT_CB_ID = 0x08U /*!< TIM One Pulse MspInit Callback ID */ - , HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID = 0x09U /*!< TIM One Pulse MspDeInit Callback ID */ - , HAL_TIM_ENCODER_MSPINIT_CB_ID = 0x0AU /*!< TIM Encoder MspInit Callback ID */ - , HAL_TIM_ENCODER_MSPDEINIT_CB_ID = 0x0BU /*!< TIM Encoder MspDeInit Callback ID */ - , HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID = 0x0CU /*!< TIM Hall Sensor MspDeInit Callback ID */ - , HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID = 0x0DU /*!< TIM Hall Sensor MspDeInit Callback ID */ - , HAL_TIM_PERIOD_ELAPSED_CB_ID = 0x0EU /*!< TIM Period Elapsed Callback ID */ - , HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID = 0x0FU /*!< TIM Period Elapsed half complete Callback ID */ - , HAL_TIM_TRIGGER_CB_ID = 0x10U /*!< TIM Trigger Callback ID */ - , HAL_TIM_TRIGGER_HALF_CB_ID = 0x11U /*!< TIM Trigger half complete Callback ID */ - , HAL_TIM_IC_CAPTURE_CB_ID = 0x12U /*!< TIM Input Capture Callback ID */ - , HAL_TIM_IC_CAPTURE_HALF_CB_ID = 0x13U /*!< TIM Input Capture half complete Callback ID */ - , HAL_TIM_OC_DELAY_ELAPSED_CB_ID = 0x14U /*!< TIM Output Compare Delay Elapsed Callback ID */ - , HAL_TIM_PWM_PULSE_FINISHED_CB_ID = 0x15U /*!< TIM PWM Pulse Finished Callback ID */ - , HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID = 0x16U /*!< TIM PWM Pulse Finished half complete Callback ID */ - , HAL_TIM_ERROR_CB_ID = 0x17U /*!< TIM Error Callback ID */ - , HAL_TIM_COMMUTATION_CB_ID = 0x18U /*!< TIM Commutation Callback ID */ - , HAL_TIM_COMMUTATION_HALF_CB_ID = 0x19U /*!< TIM Commutation half complete Callback ID */ - , HAL_TIM_BREAK_CB_ID = 0x1AU /*!< TIM Break Callback ID */ -} HAL_TIM_CallbackIDTypeDef; - -/** - * @brief HAL TIM Callback pointer definition - */ -typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to the TIM callback function */ - -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ -/* End of exported types -----------------------------------------------------*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIM_Exported_Constants TIM Exported Constants - * @{ - */ - -/** @defgroup TIM_ClearInput_Source TIM Clear Input Source - * @{ - */ -#define TIM_CLEARINPUTSOURCE_NONE 0x00000000U /*!< OCREF_CLR is disabled */ -#define TIM_CLEARINPUTSOURCE_ETR 0x00000001U /*!< OCREF_CLR is connected to ETRF input */ -/** - * @} - */ - -/** @defgroup TIM_DMA_Base_address TIM DMA Base Address - * @{ - */ -#define TIM_DMABASE_CR1 0x00000000U -#define TIM_DMABASE_CR2 0x00000001U -#define TIM_DMABASE_SMCR 0x00000002U -#define TIM_DMABASE_DIER 0x00000003U -#define TIM_DMABASE_SR 0x00000004U -#define TIM_DMABASE_EGR 0x00000005U -#define TIM_DMABASE_CCMR1 0x00000006U -#define TIM_DMABASE_CCMR2 0x00000007U -#define TIM_DMABASE_CCER 0x00000008U -#define TIM_DMABASE_CNT 0x00000009U -#define TIM_DMABASE_PSC 0x0000000AU -#define TIM_DMABASE_ARR 0x0000000BU -#define TIM_DMABASE_RCR 0x0000000CU -#define TIM_DMABASE_CCR1 0x0000000DU -#define TIM_DMABASE_CCR2 0x0000000EU -#define TIM_DMABASE_CCR3 0x0000000FU -#define TIM_DMABASE_CCR4 0x00000010U -#define TIM_DMABASE_BDTR 0x00000011U -#define TIM_DMABASE_DCR 0x00000012U -#define TIM_DMABASE_DMAR 0x00000013U -/** - * @} - */ - -/** @defgroup TIM_Event_Source TIM Event Source - * @{ - */ -#define TIM_EVENTSOURCE_UPDATE TIM_EGR_UG /*!< Reinitialize the counter and generates an update of the registers */ -#define TIM_EVENTSOURCE_CC1 TIM_EGR_CC1G /*!< A capture/compare event is generated on channel 1 */ -#define TIM_EVENTSOURCE_CC2 TIM_EGR_CC2G /*!< A capture/compare event is generated on channel 2 */ -#define TIM_EVENTSOURCE_CC3 TIM_EGR_CC3G /*!< A capture/compare event is generated on channel 3 */ -#define TIM_EVENTSOURCE_CC4 TIM_EGR_CC4G /*!< A capture/compare event is generated on channel 4 */ -#define TIM_EVENTSOURCE_COM TIM_EGR_COMG /*!< A commutation event is generated */ -#define TIM_EVENTSOURCE_TRIGGER TIM_EGR_TG /*!< A trigger event is generated */ -#define TIM_EVENTSOURCE_BREAK TIM_EGR_BG /*!< A break event is generated */ -/** - * @} - */ - -/** @defgroup TIM_Input_Channel_Polarity TIM Input Channel polarity - * @{ - */ -#define TIM_INPUTCHANNELPOLARITY_RISING 0x00000000U /*!< Polarity for TIx source */ -#define TIM_INPUTCHANNELPOLARITY_FALLING TIM_CCER_CC1P /*!< Polarity for TIx source */ -#define TIM_INPUTCHANNELPOLARITY_BOTHEDGE (TIM_CCER_CC1P | TIM_CCER_CC1NP) /*!< Polarity for TIx source */ -/** - * @} - */ - -/** @defgroup TIM_ETR_Polarity TIM ETR Polarity - * @{ - */ -#define TIM_ETRPOLARITY_INVERTED TIM_SMCR_ETP /*!< Polarity for ETR source */ -#define TIM_ETRPOLARITY_NONINVERTED 0x00000000U /*!< Polarity for ETR source */ -/** - * @} - */ - -/** @defgroup TIM_ETR_Prescaler TIM ETR Prescaler - * @{ - */ -#define TIM_ETRPRESCALER_DIV1 0x00000000U /*!< No prescaler is used */ -#define TIM_ETRPRESCALER_DIV2 TIM_SMCR_ETPS_0 /*!< ETR input source is divided by 2 */ -#define TIM_ETRPRESCALER_DIV4 TIM_SMCR_ETPS_1 /*!< ETR input source is divided by 4 */ -#define TIM_ETRPRESCALER_DIV8 TIM_SMCR_ETPS /*!< ETR input source is divided by 8 */ -/** - * @} - */ - -/** @defgroup TIM_Counter_Mode TIM Counter Mode - * @{ - */ -#define TIM_COUNTERMODE_UP 0x00000000U /*!< Counter used as up-counter */ -#define TIM_COUNTERMODE_DOWN TIM_CR1_DIR /*!< Counter used as down-counter */ -#define TIM_COUNTERMODE_CENTERALIGNED1 TIM_CR1_CMS_0 /*!< Center-aligned mode 1 */ -#define TIM_COUNTERMODE_CENTERALIGNED2 TIM_CR1_CMS_1 /*!< Center-aligned mode 2 */ -#define TIM_COUNTERMODE_CENTERALIGNED3 TIM_CR1_CMS /*!< Center-aligned mode 3 */ -/** - * @} - */ - -/** @defgroup TIM_ClockDivision TIM Clock Division - * @{ - */ -#define TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< Clock division: tDTS=tCK_INT */ -#define TIM_CLOCKDIVISION_DIV2 TIM_CR1_CKD_0 /*!< Clock division: tDTS=2*tCK_INT */ -#define TIM_CLOCKDIVISION_DIV4 TIM_CR1_CKD_1 /*!< Clock division: tDTS=4*tCK_INT */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_State TIM Output Compare State - * @{ - */ -#define TIM_OUTPUTSTATE_DISABLE 0x00000000U /*!< Capture/Compare 1 output disabled */ -#define TIM_OUTPUTSTATE_ENABLE TIM_CCER_CC1E /*!< Capture/Compare 1 output enabled */ -/** - * @} - */ - -/** @defgroup TIM_AutoReloadPreload TIM Auto-Reload Preload - * @{ - */ -#define TIM_AUTORELOAD_PRELOAD_DISABLE 0x00000000U /*!< TIMx_ARR register is not buffered */ -#define TIM_AUTORELOAD_PRELOAD_ENABLE TIM_CR1_ARPE /*!< TIMx_ARR register is buffered */ - -/** - * @} - */ - -/** @defgroup TIM_Output_Fast_State TIM Output Fast State - * @{ - */ -#define TIM_OCFAST_DISABLE 0x00000000U /*!< Output Compare fast disable */ -#define TIM_OCFAST_ENABLE TIM_CCMR1_OC1FE /*!< Output Compare fast enable */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_State TIM Complementary Output Compare State - * @{ - */ -#define TIM_OUTPUTNSTATE_DISABLE 0x00000000U /*!< OCxN is disabled */ -#define TIM_OUTPUTNSTATE_ENABLE TIM_CCER_CC1NE /*!< OCxN is enabled */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Polarity TIM Output Compare Polarity - * @{ - */ -#define TIM_OCPOLARITY_HIGH 0x00000000U /*!< Capture/Compare output polarity */ -#define TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< Capture/Compare output polarity */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Polarity TIM Complementary Output Compare Polarity - * @{ - */ -#define TIM_OCNPOLARITY_HIGH 0x00000000U /*!< Capture/Compare complementary output polarity */ -#define TIM_OCNPOLARITY_LOW TIM_CCER_CC1NP /*!< Capture/Compare complementary output polarity */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Idle_State TIM Output Compare Idle State - * @{ - */ -#define TIM_OCIDLESTATE_SET TIM_CR2_OIS1 /*!< Output Idle state: OCx=1 when MOE=0 */ -#define TIM_OCIDLESTATE_RESET 0x00000000U /*!< Output Idle state: OCx=0 when MOE=0 */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Idle_State TIM Complementary Output Compare Idle State - * @{ - */ -#define TIM_OCNIDLESTATE_SET TIM_CR2_OIS1N /*!< Complementary output Idle state: OCxN=1 when MOE=0 */ -#define TIM_OCNIDLESTATE_RESET 0x00000000U /*!< Complementary output Idle state: OCxN=0 when MOE=0 */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Polarity TIM Input Capture Polarity - * @{ - */ -#define TIM_ICPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Capture triggered by rising edge on timer input */ -#define TIM_ICPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Capture triggered by falling edge on timer input */ -#define TIM_ICPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Capture triggered by both rising and falling edges on timer input*/ -/** - * @} - */ - -/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity - * @{ - */ -#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ -#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection - * @{ - */ -#define TIM_ICSELECTION_DIRECTTI TIM_CCMR1_CC1S_0 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC1, IC2, IC3 or IC4, respectively */ -#define TIM_ICSELECTION_INDIRECTTI TIM_CCMR1_CC1S_1 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC2, IC1, IC4 or IC3, respectively */ -#define TIM_ICSELECTION_TRC TIM_CCMR1_CC1S /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Prescaler TIM Input Capture Prescaler - * @{ - */ -#define TIM_ICPSC_DIV1 0x00000000U /*!< Capture performed each time an edge is detected on the capture input */ -#define TIM_ICPSC_DIV2 TIM_CCMR1_IC1PSC_0 /*!< Capture performed once every 2 events */ -#define TIM_ICPSC_DIV4 TIM_CCMR1_IC1PSC_1 /*!< Capture performed once every 4 events */ -#define TIM_ICPSC_DIV8 TIM_CCMR1_IC1PSC /*!< Capture performed once every 8 events */ -/** - * @} - */ - -/** @defgroup TIM_One_Pulse_Mode TIM One Pulse Mode - * @{ - */ -#define TIM_OPMODE_SINGLE TIM_CR1_OPM /*!< Counter stops counting at the next update event */ -#define TIM_OPMODE_REPETITIVE 0x00000000U /*!< Counter is not stopped at update event */ -/** - * @} - */ - -/** @defgroup TIM_Encoder_Mode TIM Encoder Mode - * @{ - */ -#define TIM_ENCODERMODE_TI1 TIM_SMCR_SMS_0 /*!< Quadrature encoder mode 1, x2 mode, counts up/down on TI1FP1 edge depending on TI2FP2 level */ -#define TIM_ENCODERMODE_TI2 TIM_SMCR_SMS_1 /*!< Quadrature encoder mode 2, x2 mode, counts up/down on TI2FP2 edge depending on TI1FP1 level. */ -#define TIM_ENCODERMODE_TI12 (TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< Quadrature encoder mode 3, x4 mode, counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. */ -/** - * @} - */ - -/** @defgroup TIM_Interrupt_definition TIM interrupt Definition - * @{ - */ -#define TIM_IT_UPDATE TIM_DIER_UIE /*!< Update interrupt */ -#define TIM_IT_CC1 TIM_DIER_CC1IE /*!< Capture/Compare 1 interrupt */ -#define TIM_IT_CC2 TIM_DIER_CC2IE /*!< Capture/Compare 2 interrupt */ -#define TIM_IT_CC3 TIM_DIER_CC3IE /*!< Capture/Compare 3 interrupt */ -#define TIM_IT_CC4 TIM_DIER_CC4IE /*!< Capture/Compare 4 interrupt */ -#define TIM_IT_COM TIM_DIER_COMIE /*!< Commutation interrupt */ -#define TIM_IT_TRIGGER TIM_DIER_TIE /*!< Trigger interrupt */ -#define TIM_IT_BREAK TIM_DIER_BIE /*!< Break interrupt */ -/** - * @} - */ - -/** @defgroup TIM_Commutation_Source TIM Commutation Source - * @{ - */ -#define TIM_COMMUTATION_TRGI TIM_CR2_CCUS /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit or when an rising edge occurs on trigger input */ -#define TIM_COMMUTATION_SOFTWARE 0x00000000U /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit */ -/** - * @} - */ - -/** @defgroup TIM_DMA_sources TIM DMA Sources - * @{ - */ -#define TIM_DMA_UPDATE TIM_DIER_UDE /*!< DMA request is triggered by the update event */ -#define TIM_DMA_CC1 TIM_DIER_CC1DE /*!< DMA request is triggered by the capture/compare macth 1 event */ -#define TIM_DMA_CC2 TIM_DIER_CC2DE /*!< DMA request is triggered by the capture/compare macth 2 event event */ -#define TIM_DMA_CC3 TIM_DIER_CC3DE /*!< DMA request is triggered by the capture/compare macth 3 event event */ -#define TIM_DMA_CC4 TIM_DIER_CC4DE /*!< DMA request is triggered by the capture/compare macth 4 event event */ -#define TIM_DMA_COM TIM_DIER_COMDE /*!< DMA request is triggered by the commutation event */ -#define TIM_DMA_TRIGGER TIM_DIER_TDE /*!< DMA request is triggered by the trigger event */ -/** - * @} - */ - -/** @defgroup TIM_CC_DMA_Request CCx DMA request selection - * @{ - */ -#define TIM_CCDMAREQUEST_CC 0x00000000U /*!< CCx DMA request sent when capture or compare match event occurs */ -#define TIM_CCDMAREQUEST_UPDATE TIM_CR2_CCDS /*!< CCx DMA requests sent when update event occurs */ -/** - * @} - */ - -/** @defgroup TIM_Flag_definition TIM Flag Definition - * @{ - */ -#define TIM_FLAG_UPDATE TIM_SR_UIF /*!< Update interrupt flag */ -#define TIM_FLAG_CC1 TIM_SR_CC1IF /*!< Capture/Compare 1 interrupt flag */ -#define TIM_FLAG_CC2 TIM_SR_CC2IF /*!< Capture/Compare 2 interrupt flag */ -#define TIM_FLAG_CC3 TIM_SR_CC3IF /*!< Capture/Compare 3 interrupt flag */ -#define TIM_FLAG_CC4 TIM_SR_CC4IF /*!< Capture/Compare 4 interrupt flag */ -#define TIM_FLAG_COM TIM_SR_COMIF /*!< Commutation interrupt flag */ -#define TIM_FLAG_TRIGGER TIM_SR_TIF /*!< Trigger interrupt flag */ -#define TIM_FLAG_BREAK TIM_SR_BIF /*!< Break interrupt flag */ -#define TIM_FLAG_CC1OF TIM_SR_CC1OF /*!< Capture 1 overcapture flag */ -#define TIM_FLAG_CC2OF TIM_SR_CC2OF /*!< Capture 2 overcapture flag */ -#define TIM_FLAG_CC3OF TIM_SR_CC3OF /*!< Capture 3 overcapture flag */ -#define TIM_FLAG_CC4OF TIM_SR_CC4OF /*!< Capture 4 overcapture flag */ -/** - * @} - */ - -/** @defgroup TIM_Channel TIM Channel - * @{ - */ -#define TIM_CHANNEL_1 0x00000000U /*!< Capture/compare channel 1 identifier */ -#define TIM_CHANNEL_2 0x00000004U /*!< Capture/compare channel 2 identifier */ -#define TIM_CHANNEL_3 0x00000008U /*!< Capture/compare channel 3 identifier */ -#define TIM_CHANNEL_4 0x0000000CU /*!< Capture/compare channel 4 identifier */ -#define TIM_CHANNEL_ALL 0x0000003CU /*!< Global Capture/compare channel identifier */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Source TIM Clock Source - * @{ - */ -#define TIM_CLOCKSOURCE_INTERNAL TIM_SMCR_ETPS_0 /*!< Internal clock source */ -#define TIM_CLOCKSOURCE_ETRMODE1 TIM_TS_ETRF /*!< External clock source mode 1 (ETRF) */ -#define TIM_CLOCKSOURCE_ETRMODE2 TIM_SMCR_ETPS_1 /*!< External clock source mode 2 */ -#define TIM_CLOCKSOURCE_TI1ED TIM_TS_TI1F_ED /*!< External clock source mode 1 (TTI1FP1 + edge detect.) */ -#define TIM_CLOCKSOURCE_TI1 TIM_TS_TI1FP1 /*!< External clock source mode 1 (TTI1FP1) */ -#define TIM_CLOCKSOURCE_TI2 TIM_TS_TI2FP2 /*!< External clock source mode 1 (TTI2FP2) */ -#define TIM_CLOCKSOURCE_ITR0 TIM_TS_ITR0 /*!< External clock source mode 1 (ITR0) */ -#define TIM_CLOCKSOURCE_ITR1 TIM_TS_ITR1 /*!< External clock source mode 1 (ITR1) */ -#define TIM_CLOCKSOURCE_ITR2 TIM_TS_ITR2 /*!< External clock source mode 1 (ITR2) */ -#define TIM_CLOCKSOURCE_ITR3 TIM_TS_ITR3 /*!< External clock source mode 1 (ITR3) */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Polarity TIM Clock Polarity - * @{ - */ -#define TIM_CLOCKPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx clock sources */ -#define TIM_CLOCKPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx clock sources */ -#define TIM_CLOCKPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIx clock sources */ -#define TIM_CLOCKPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIx clock sources */ -#define TIM_CLOCKPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIx clock sources */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Prescaler TIM Clock Prescaler - * @{ - */ -#define TIM_CLOCKPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_CLOCKPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Clock: Capture performed once every 2 events. */ -#define TIM_CLOCKPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Clock: Capture performed once every 4 events. */ -#define TIM_CLOCKPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Clock: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_ClearInput_Polarity TIM Clear Input Polarity - * @{ - */ -#define TIM_CLEARINPUTPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx pin */ -#define TIM_CLEARINPUTPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx pin */ -/** - * @} - */ - -/** @defgroup TIM_ClearInput_Prescaler TIM Clear Input Prescaler - * @{ - */ -#define TIM_CLEARINPUTPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_CLEARINPUTPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR pin: Capture performed once every 2 events. */ -#define TIM_CLEARINPUTPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR pin: Capture performed once every 4 events. */ -#define TIM_CLEARINPUTPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR pin: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state TIM OSSR OffState Selection for Run mode state - * @{ - */ -#define TIM_OSSR_ENABLE TIM_BDTR_OSSR /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ -#define TIM_OSSR_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ -/** - * @} - */ - -/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state TIM OSSI OffState Selection for Idle mode state - * @{ - */ -#define TIM_OSSI_ENABLE TIM_BDTR_OSSI /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ -#define TIM_OSSI_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ -/** - * @} - */ -/** @defgroup TIM_Lock_level TIM Lock level - * @{ - */ -#define TIM_LOCKLEVEL_OFF 0x00000000U /*!< LOCK OFF */ -#define TIM_LOCKLEVEL_1 TIM_BDTR_LOCK_0 /*!< LOCK Level 1 */ -#define TIM_LOCKLEVEL_2 TIM_BDTR_LOCK_1 /*!< LOCK Level 2 */ -#define TIM_LOCKLEVEL_3 TIM_BDTR_LOCK /*!< LOCK Level 3 */ -/** - * @} - */ - -/** @defgroup TIM_Break_Input_enable_disable TIM Break Input Enable - * @{ - */ -#define TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break input BRK is enabled */ -#define TIM_BREAK_DISABLE 0x00000000U /*!< Break input BRK is disabled */ -/** - * @} - */ - -/** @defgroup TIM_Break_Polarity TIM Break Input Polarity - * @{ - */ -#define TIM_BREAKPOLARITY_LOW 0x00000000U /*!< Break input BRK is active low */ -#define TIM_BREAKPOLARITY_HIGH TIM_BDTR_BKP /*!< Break input BRK is active high */ -/** - * @} - */ - -/** @defgroup TIM_AOE_Bit_Set_Reset TIM Automatic Output Enable - * @{ - */ -#define TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /*!< MOE can be set only by software */ -#define TIM_AUTOMATICOUTPUT_ENABLE TIM_BDTR_AOE /*!< MOE can be set by software or automatically at the next update event (if none of the break inputs BRK and BRK2 is active) */ -/** - * @} - */ - -/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection - * @{ - */ -#define TIM_TRGO_RESET 0x00000000U /*!< TIMx_EGR.UG bit is used as trigger output (TRGO) */ -#define TIM_TRGO_ENABLE TIM_CR2_MMS_0 /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO) */ -#define TIM_TRGO_UPDATE TIM_CR2_MMS_1 /*!< Update event is used as trigger output (TRGO) */ -#define TIM_TRGO_OC1 (TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< Capture or a compare match 1 is used as trigger output (TRGO) */ -#define TIM_TRGO_OC1REF TIM_CR2_MMS_2 /*!< OC1REF signal is used as trigger output (TRGO) */ -#define TIM_TRGO_OC2REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_0) /*!< OC2REF signal is used as trigger output(TRGO) */ -#define TIM_TRGO_OC3REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1) /*!< OC3REF signal is used as trigger output(TRGO) */ -#define TIM_TRGO_OC4REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< OC4REF signal is used as trigger output(TRGO) */ -/** - * @} - */ - -/** @defgroup TIM_Master_Slave_Mode TIM Master/Slave Mode - * @{ - */ -#define TIM_MASTERSLAVEMODE_ENABLE TIM_SMCR_MSM /*!< No action */ -#define TIM_MASTERSLAVEMODE_DISABLE 0x00000000U /*!< Master/slave mode is selected */ -/** - * @} - */ - -/** @defgroup TIM_Slave_Mode TIM Slave mode - * @{ - */ -#define TIM_SLAVEMODE_DISABLE 0x00000000U /*!< Slave mode disabled */ -#define TIM_SLAVEMODE_RESET TIM_SMCR_SMS_2 /*!< Reset Mode */ -#define TIM_SLAVEMODE_GATED (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0) /*!< Gated Mode */ -#define TIM_SLAVEMODE_TRIGGER (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1) /*!< Trigger Mode */ -#define TIM_SLAVEMODE_EXTERNAL1 (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< External Clock Mode 1 */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_and_PWM_modes TIM Output Compare and PWM Modes - * @{ - */ -#define TIM_OCMODE_TIMING 0x00000000U /*!< Frozen */ -#define TIM_OCMODE_ACTIVE TIM_CCMR1_OC1M_0 /*!< Set channel to active level on match */ -#define TIM_OCMODE_INACTIVE TIM_CCMR1_OC1M_1 /*!< Set channel to inactive level on match */ -#define TIM_OCMODE_TOGGLE (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< Toggle */ -#define TIM_OCMODE_PWM1 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1) /*!< PWM mode 1 */ -#define TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< PWM mode 2 */ -#define TIM_OCMODE_FORCED_ACTIVE (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0) /*!< Force active level */ -#define TIM_OCMODE_FORCED_INACTIVE TIM_CCMR1_OC1M_2 /*!< Force inactive level */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Selection TIM Trigger Selection - * @{ - */ -#define TIM_TS_ITR0 0x00000000U /*!< Internal Trigger 0 (ITR0) */ -#define TIM_TS_ITR1 TIM_SMCR_TS_0 /*!< Internal Trigger 1 (ITR1) */ -#define TIM_TS_ITR2 TIM_SMCR_TS_1 /*!< Internal Trigger 2 (ITR2) */ -#define TIM_TS_ITR3 (TIM_SMCR_TS_0 | TIM_SMCR_TS_1) /*!< Internal Trigger 3 (ITR3) */ -#define TIM_TS_TI1F_ED TIM_SMCR_TS_2 /*!< TI1 Edge Detector (TI1F_ED) */ -#define TIM_TS_TI1FP1 (TIM_SMCR_TS_0 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 1 (TI1FP1) */ -#define TIM_TS_TI2FP2 (TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 2 (TI2FP2) */ -#define TIM_TS_ETRF (TIM_SMCR_TS_0 | TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered External Trigger input (ETRF) */ -#define TIM_TS_NONE 0x0000FFFFU /*!< No trigger selected */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Polarity TIM Trigger Polarity - * @{ - */ -#define TIM_TRIGGERPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx trigger sources */ -#define TIM_TRIGGERPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx trigger sources */ -#define TIM_TRIGGERPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -#define TIM_TRIGGERPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -#define TIM_TRIGGERPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Prescaler TIM Trigger Prescaler - * @{ - */ -#define TIM_TRIGGERPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_TRIGGERPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Trigger: Capture performed once every 2 events. */ -#define TIM_TRIGGERPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Trigger: Capture performed once every 4 events. */ -#define TIM_TRIGGERPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Trigger: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_TI1_Selection TIM TI1 Input Selection - * @{ - */ -#define TIM_TI1SELECTION_CH1 0x00000000U /*!< The TIMx_CH1 pin is connected to TI1 input */ -#define TIM_TI1SELECTION_XORCOMBINATION TIM_CR2_TI1S /*!< The TIMx_CH1, CH2 and CH3 pins are connected to the TI1 input (XOR combination) */ -/** - * @} - */ - -/** @defgroup TIM_DMA_Burst_Length TIM DMA Burst Length - * @{ - */ -#define TIM_DMABURSTLENGTH_1TRANSFER 0x00000000U /*!< The transfer is done to 1 register starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_2TRANSFERS 0x00000100U /*!< The transfer is done to 2 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_3TRANSFERS 0x00000200U /*!< The transfer is done to 3 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_4TRANSFERS 0x00000300U /*!< The transfer is done to 4 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_5TRANSFERS 0x00000400U /*!< The transfer is done to 5 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_6TRANSFERS 0x00000500U /*!< The transfer is done to 6 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_7TRANSFERS 0x00000600U /*!< The transfer is done to 7 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_8TRANSFERS 0x00000700U /*!< The transfer is done to 8 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_9TRANSFERS 0x00000800U /*!< The transfer is done to 9 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_10TRANSFERS 0x00000900U /*!< The transfer is done to 10 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_11TRANSFERS 0x00000A00U /*!< The transfer is done to 11 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_12TRANSFERS 0x00000B00U /*!< The transfer is done to 12 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_13TRANSFERS 0x00000C00U /*!< The transfer is done to 13 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_14TRANSFERS 0x00000D00U /*!< The transfer is done to 14 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_15TRANSFERS 0x00000E00U /*!< The transfer is done to 15 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_16TRANSFERS 0x00000F00U /*!< The transfer is done to 16 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_17TRANSFERS 0x00001000U /*!< The transfer is done to 17 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_18TRANSFERS 0x00001100U /*!< The transfer is done to 18 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -/** - * @} - */ - -/** @defgroup DMA_Handle_index TIM DMA Handle Index - * @{ - */ -#define TIM_DMA_ID_UPDATE ((uint16_t) 0x0000) /*!< Index of the DMA handle used for Update DMA requests */ -#define TIM_DMA_ID_CC1 ((uint16_t) 0x0001) /*!< Index of the DMA handle used for Capture/Compare 1 DMA requests */ -#define TIM_DMA_ID_CC2 ((uint16_t) 0x0002) /*!< Index of the DMA handle used for Capture/Compare 2 DMA requests */ -#define TIM_DMA_ID_CC3 ((uint16_t) 0x0003) /*!< Index of the DMA handle used for Capture/Compare 3 DMA requests */ -#define TIM_DMA_ID_CC4 ((uint16_t) 0x0004) /*!< Index of the DMA handle used for Capture/Compare 4 DMA requests */ -#define TIM_DMA_ID_COMMUTATION ((uint16_t) 0x0005) /*!< Index of the DMA handle used for Commutation DMA requests */ -#define TIM_DMA_ID_TRIGGER ((uint16_t) 0x0006) /*!< Index of the DMA handle used for Trigger DMA requests */ -/** - * @} - */ - -/** @defgroup Channel_CC_State TIM Capture/Compare Channel State - * @{ - */ -#define TIM_CCx_ENABLE 0x00000001U /*!< Input or output channel is enabled */ -#define TIM_CCx_DISABLE 0x00000000U /*!< Input or output channel is disabled */ -#define TIM_CCxN_ENABLE 0x00000004U /*!< Complementary output channel is enabled */ -#define TIM_CCxN_DISABLE 0x00000000U /*!< Complementary output channel is enabled */ -/** - * @} - */ - -/** - * @} - */ -/* End of exported constants -------------------------------------------------*/ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup TIM_Exported_Macros TIM Exported Macros - * @{ - */ - -/** @brief Reset TIM handle state. - * @param __HANDLE__ TIM handle. - * @retval None - */ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ - (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ - (__HANDLE__)->ChannelState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->DMABurstState = HAL_DMA_BURST_STATE_RESET; \ - (__HANDLE__)->Base_MspInitCallback = NULL; \ - (__HANDLE__)->Base_MspDeInitCallback = NULL; \ - (__HANDLE__)->IC_MspInitCallback = NULL; \ - (__HANDLE__)->IC_MspDeInitCallback = NULL; \ - (__HANDLE__)->OC_MspInitCallback = NULL; \ - (__HANDLE__)->OC_MspDeInitCallback = NULL; \ - (__HANDLE__)->PWM_MspInitCallback = NULL; \ - (__HANDLE__)->PWM_MspDeInitCallback = NULL; \ - (__HANDLE__)->OnePulse_MspInitCallback = NULL; \ - (__HANDLE__)->OnePulse_MspDeInitCallback = NULL; \ - (__HANDLE__)->Encoder_MspInitCallback = NULL; \ - (__HANDLE__)->Encoder_MspDeInitCallback = NULL; \ - (__HANDLE__)->HallSensor_MspInitCallback = NULL; \ - (__HANDLE__)->HallSensor_MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ - (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ - (__HANDLE__)->ChannelState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->DMABurstState = HAL_DMA_BURST_STATE_RESET; \ - } while(0) -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @brief Enable the TIM peripheral. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|=(TIM_CR1_CEN)) - -/** - * @brief Enable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_MOE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->BDTR|=(TIM_BDTR_MOE)) - -/** - * @brief Disable the TIM peripheral. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) - -/** - * @brief Disable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been - * disabled - */ -#define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) - -/** - * @brief Disable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - * @note The Main Output Enable of a timer instance is disabled unconditionally - */ -#define __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(__HANDLE__) (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE) - -/** @brief Enable the specified TIM interrupt. - * @param __HANDLE__ specifies the TIM Handle. - * @param __INTERRUPT__ specifies the TIM interrupt source to enable. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__)) - -/** @brief Disable the specified TIM interrupt. - * @param __HANDLE__ specifies the TIM Handle. - * @param __INTERRUPT__ specifies the TIM interrupt source to disable. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER &= ~(__INTERRUPT__)) - -/** @brief Enable the specified DMA request. - * @param __HANDLE__ specifies the TIM Handle. - * @param __DMA__ specifies the TIM DMA request to enable. - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: Update DMA request - * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request - * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request - * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request - * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request - * @arg TIM_DMA_COM: Commutation DMA request - * @arg TIM_DMA_TRIGGER: Trigger DMA request - * @retval None - */ -#define __HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER |= (__DMA__)) - -/** @brief Disable the specified DMA request. - * @param __HANDLE__ specifies the TIM Handle. - * @param __DMA__ specifies the TIM DMA request to disable. - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: Update DMA request - * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request - * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request - * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request - * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request - * @arg TIM_DMA_COM: Commutation DMA request - * @arg TIM_DMA_TRIGGER: Trigger DMA request - * @retval None - */ -#define __HAL_TIM_DISABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER &= ~(__DMA__)) - -/** @brief Check whether the specified TIM interrupt flag is set or not. - * @param __HANDLE__ specifies the TIM Handle. - * @param __FLAG__ specifies the TIM interrupt flag to check. - * This parameter can be one of the following values: - * @arg TIM_FLAG_UPDATE: Update interrupt flag - * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag - * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag - * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag - * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag - * @arg TIM_FLAG_COM: Commutation interrupt flag - * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag - * @arg TIM_FLAG_BREAK: Break interrupt flag - * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag - * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag - * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag - * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__)) - -/** @brief Clear the specified TIM interrupt flag. - * @param __HANDLE__ specifies the TIM Handle. - * @param __FLAG__ specifies the TIM interrupt flag to clear. - * This parameter can be one of the following values: - * @arg TIM_FLAG_UPDATE: Update interrupt flag - * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag - * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag - * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag - * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag - * @arg TIM_FLAG_COM: Commutation interrupt flag - * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag - * @arg TIM_FLAG_BREAK: Break interrupt flag - * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag - * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag - * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag - * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) - -/** - * @brief Check whether the specified TIM interrupt source is enabled or not. - * @param __HANDLE__ TIM handle - * @param __INTERRUPT__ specifies the TIM interrupt source to check. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval The state of TIM_IT (SET or RESET). - */ -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ - == (__INTERRUPT__)) ? SET : RESET) - -/** @brief Clear the TIM interrupt pending bits. - * @param __HANDLE__ TIM handle - * @param __INTERRUPT__ specifies the interrupt pending bit to clear. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) - -/** - * @brief Indicates whether or not the TIM Counter is used as downcounter. - * @param __HANDLE__ TIM handle. - * @retval False (Counter used as upcounter) or True (Counter used as downcounter) - * @note This macro is particularly useful to get the counting mode when the timer operates in Center-aligned mode - * or Encoder mode. - */ -#define __HAL_TIM_IS_TIM_COUNTING_DOWN(__HANDLE__) (((__HANDLE__)->Instance->CR1 &(TIM_CR1_DIR)) == (TIM_CR1_DIR)) - -/** - * @brief Set the TIM Prescaler on runtime. - * @param __HANDLE__ TIM handle. - * @param __PRESC__ specifies the Prescaler new value. - * @retval None - */ -#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__)) - -/** - * @brief Set the TIM Counter Register value on runtime. - * @param __HANDLE__ TIM handle. - * @param __COUNTER__ specifies the Counter register new value. - * @retval None - */ -#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->CNT = (__COUNTER__)) - -/** - * @brief Get the TIM Counter Register value on runtime. - * @param __HANDLE__ TIM handle. - * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) - */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) - -/** - * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. - * @param __HANDLE__ TIM handle. - * @param __AUTORELOAD__ specifies the Counter register new value. - * @retval None - */ -#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) - -/** - * @brief Get the TIM Autoreload Register value on runtime. - * @param __HANDLE__ TIM handle. - * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) - */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) - -/** - * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. - * @param __HANDLE__ TIM handle. - * @param __CKD__ specifies the clock division value. - * This parameter can be one of the following value: - * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT - * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT - * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT - * @retval None - */ -#define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) - -/** - * @brief Get the TIM Clock Division value on runtime. - * @param __HANDLE__ TIM handle. - * @retval The clock division can be one of the following values: - * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT - * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT - * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT - */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) - -/** - * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() - * function. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __ICPSC__ specifies the Input Capture4 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -#define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) - -/** - * @brief Get the TIM Input Capture prescaler on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: get input capture 1 prescaler value - * @arg TIM_CHANNEL_2: get input capture 2 prescaler value - * @arg TIM_CHANNEL_3: get input capture 3 prescaler value - * @arg TIM_CHANNEL_4: get input capture 4 prescaler value - * @retval The input capture prescaler can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - */ -#define __HAL_TIM_GET_ICPRESCALER(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? (((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC2PSC) >> 8U) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC3PSC) :\ - (((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC4PSC)) >> 8U) - -/** - * @brief Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __COMPARE__ specifies the Capture Compare register new value. - * @retval None - */ -#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ - ((__HANDLE__)->Instance->CCR4 = (__COMPARE__))) - -/** - * @brief Get the TIM Capture Compare Register value on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channel associated with the capture compare register - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: get capture/compare 1 register value - * @arg TIM_CHANNEL_2: get capture/compare 2 register value - * @arg TIM_CHANNEL_3: get capture/compare 3 register value - * @arg TIM_CHANNEL_4: get capture/compare 4 register value - * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) - */ -#define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ - ((__HANDLE__)->Instance->CCR4)) - -/** - * @brief Set the TIM Output compare preload. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval None - */ -#define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ - ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE)) - -/** - * @brief Reset the TIM Output compare preload. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval None - */ -#define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE)) - -/** - * @brief Enable fast mode for a given channel. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @note When fast mode is enabled an active edge on the trigger input acts - * like a compare match on CCx output. Delay to sample the trigger - * input and to activate CCx output is reduced to 3 clock cycles. - * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. - * @retval None - */ -#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ - ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE)) - -/** - * @brief Disable fast mode for a given channel. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @note When fast mode is disabled CCx output behaves normally depending - * on counter and CCRx values even when the trigger is ON. The minimum - * delay to activate CCx output when an active edge occurs on the - * trigger input is 5 clock cycles. - * @retval None - */ -#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE)) - -/** - * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. - * @param __HANDLE__ TIM handle. - * @note When the URS bit of the TIMx_CR1 register is set, only counter - * overflow/underflow generates an update interrupt or DMA request (if - * enabled) - * @retval None - */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) - -/** - * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. - * @param __HANDLE__ TIM handle. - * @note When the URS bit of the TIMx_CR1 register is reset, any of the - * following events generate an update interrupt or DMA request (if - * enabled): - * _ Counter overflow underflow - * _ Setting the UG bit - * _ Update generation through the slave mode controller - * @retval None - */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) - -/** - * @brief Set the TIM Capture x input polarity on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __POLARITY__ Polarity for TIx source - * @arg TIM_INPUTCHANNELPOLARITY_RISING: Rising Edge - * @arg TIM_INPUTCHANNELPOLARITY_FALLING: Falling Edge - * @arg TIM_INPUTCHANNELPOLARITY_BOTHEDGE: Rising and Falling Edge - * @retval None - */ -#define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) - -/** @brief Select the Capture/compare DMA request source. - * @param __HANDLE__ specifies the TIM Handle. - * @param __CCDMA__ specifies Capture/compare DMA request source - * This parameter can be one of the following values: - * @arg TIM_CCDMAREQUEST_CC: CCx DMA request generated on Capture/Compare event - * @arg TIM_CCDMAREQUEST_UPDATE: CCx DMA request generated on Update event - * @retval None - */ -#define __HAL_TIM_SELECT_CCDMAREQUEST(__HANDLE__, __CCDMA__) \ - MODIFY_REG((__HANDLE__)->Instance->CR2, TIM_CR2_CCDS, (__CCDMA__)) - -/** - * @} - */ -/* End of exported macros ----------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup TIM_Private_Constants TIM Private Constants - * @{ - */ -/* The counter of a timer instance is disabled only if all the CCx and CCxN - channels have been disabled */ -#define TIM_CCER_CCxE_MASK ((uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)) -#define TIM_CCER_CCxNE_MASK ((uint32_t)(TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) -/** - * @} - */ -/* End of private constants --------------------------------------------------*/ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup TIM_Private_Macros TIM Private Macros - * @{ - */ -#define IS_TIM_CLEARINPUT_SOURCE(__MODE__) (((__MODE__) == TIM_CLEARINPUTSOURCE_NONE) || \ - ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) - -#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ - ((__BASE__) == TIM_DMABASE_CR2) || \ - ((__BASE__) == TIM_DMABASE_SMCR) || \ - ((__BASE__) == TIM_DMABASE_DIER) || \ - ((__BASE__) == TIM_DMABASE_SR) || \ - ((__BASE__) == TIM_DMABASE_EGR) || \ - ((__BASE__) == TIM_DMABASE_CCMR1) || \ - ((__BASE__) == TIM_DMABASE_CCMR2) || \ - ((__BASE__) == TIM_DMABASE_CCER) || \ - ((__BASE__) == TIM_DMABASE_CNT) || \ - ((__BASE__) == TIM_DMABASE_PSC) || \ - ((__BASE__) == TIM_DMABASE_ARR) || \ - ((__BASE__) == TIM_DMABASE_RCR) || \ - ((__BASE__) == TIM_DMABASE_CCR1) || \ - ((__BASE__) == TIM_DMABASE_CCR2) || \ - ((__BASE__) == TIM_DMABASE_CCR3) || \ - ((__BASE__) == TIM_DMABASE_CCR4) || \ - ((__BASE__) == TIM_DMABASE_BDTR)) - -#define IS_TIM_EVENT_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFFFF00U) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) - -#define IS_TIM_COUNTER_MODE(__MODE__) (((__MODE__) == TIM_COUNTERMODE_UP) || \ - ((__MODE__) == TIM_COUNTERMODE_DOWN) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED1) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) - -#define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ - ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ - ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) - -#define IS_TIM_AUTORELOAD_PRELOAD(PRELOAD) (((PRELOAD) == TIM_AUTORELOAD_PRELOAD_DISABLE) || \ - ((PRELOAD) == TIM_AUTORELOAD_PRELOAD_ENABLE)) - -#define IS_TIM_FAST_STATE(__STATE__) (((__STATE__) == TIM_OCFAST_DISABLE) || \ - ((__STATE__) == TIM_OCFAST_ENABLE)) - -#define IS_TIM_OC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCPOLARITY_HIGH) || \ - ((__POLARITY__) == TIM_OCPOLARITY_LOW)) - -#define IS_TIM_OCN_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCNPOLARITY_HIGH) || \ - ((__POLARITY__) == TIM_OCNPOLARITY_LOW)) - -#define IS_TIM_OCIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCIDLESTATE_SET) || \ - ((__STATE__) == TIM_OCIDLESTATE_RESET)) - -#define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ - ((__STATE__) == TIM_OCNIDLESTATE_RESET)) - -#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) - -#define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ - ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) - -#define IS_TIM_IC_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_ICSELECTION_DIRECTTI) || \ - ((__SELECTION__) == TIM_ICSELECTION_INDIRECTTI) || \ - ((__SELECTION__) == TIM_ICSELECTION_TRC)) - -#define IS_TIM_IC_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_ICPSC_DIV1) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV2) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV4) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV8)) - -#define IS_TIM_OPM_MODE(__MODE__) (((__MODE__) == TIM_OPMODE_SINGLE) || \ - ((__MODE__) == TIM_OPMODE_REPETITIVE)) - -#define IS_TIM_ENCODER_MODE(__MODE__) (((__MODE__) == TIM_ENCODERMODE_TI1) || \ - ((__MODE__) == TIM_ENCODERMODE_TI2) || \ - ((__MODE__) == TIM_ENCODERMODE_TI12)) - -#define IS_TIM_DMA_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFF80FFU) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) - -#define IS_TIM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2) || \ - ((__CHANNEL__) == TIM_CHANNEL_3) || \ - ((__CHANNEL__) == TIM_CHANNEL_4) || \ - ((__CHANNEL__) == TIM_CHANNEL_ALL)) - -#define IS_TIM_OPM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2)) - -#define IS_TIM_PERIOD(__HANDLE__, __PERIOD__) ((IS_TIM_32B_COUNTER_INSTANCE(((__HANDLE__)->Instance)) == 0U) ? \ - (((__PERIOD__) > 0U) && ((__PERIOD__) <= 0x0000FFFFU)) : \ - ((__PERIOD__) > 0U)) - -#define IS_TIM_COMPLEMENTARY_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2) || \ - ((__CHANNEL__) == TIM_CHANNEL_3)) - -#define IS_TIM_CLOCKSOURCE(__CLOCK__) (((__CLOCK__) == TIM_CLOCKSOURCE_INTERNAL) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE1) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI1ED) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI1) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR0) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR1) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR3)) - -#define IS_TIM_CLOCKPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLOCKPOLARITY_INVERTED) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_NONINVERTED) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_FALLING) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_BOTHEDGE)) - -#define IS_TIM_CLOCKPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV8)) - -#define IS_TIM_CLOCKFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_CLEARINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLEARINPUTPOLARITY_INVERTED) || \ - ((__POLARITY__) == TIM_CLEARINPUTPOLARITY_NONINVERTED)) - -#define IS_TIM_CLEARINPUT_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV8)) - -#define IS_TIM_CLEARINPUT_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_OSSR_STATE(__STATE__) (((__STATE__) == TIM_OSSR_ENABLE) || \ - ((__STATE__) == TIM_OSSR_DISABLE)) - -#define IS_TIM_OSSI_STATE(__STATE__) (((__STATE__) == TIM_OSSI_ENABLE) || \ - ((__STATE__) == TIM_OSSI_DISABLE)) - -#define IS_TIM_LOCK_LEVEL(__LEVEL__) (((__LEVEL__) == TIM_LOCKLEVEL_OFF) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_1) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_2) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_3)) - -#define IS_TIM_BREAK_FILTER(__BRKFILTER__) ((__BRKFILTER__) <= 0xFUL) - -#define IS_TIM_BREAK_STATE(__STATE__) (((__STATE__) == TIM_BREAK_ENABLE) || \ - ((__STATE__) == TIM_BREAK_DISABLE)) - -#define IS_TIM_BREAK_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_BREAKPOLARITY_LOW) || \ - ((__POLARITY__) == TIM_BREAKPOLARITY_HIGH)) - -#define IS_TIM_AUTOMATIC_OUTPUT_STATE(__STATE__) (((__STATE__) == TIM_AUTOMATICOUTPUT_ENABLE) || \ - ((__STATE__) == TIM_AUTOMATICOUTPUT_DISABLE)) - -#define IS_TIM_TRGO_SOURCE(__SOURCE__) (((__SOURCE__) == TIM_TRGO_RESET) || \ - ((__SOURCE__) == TIM_TRGO_ENABLE) || \ - ((__SOURCE__) == TIM_TRGO_UPDATE) || \ - ((__SOURCE__) == TIM_TRGO_OC1) || \ - ((__SOURCE__) == TIM_TRGO_OC1REF) || \ - ((__SOURCE__) == TIM_TRGO_OC2REF) || \ - ((__SOURCE__) == TIM_TRGO_OC3REF) || \ - ((__SOURCE__) == TIM_TRGO_OC4REF)) - -#define IS_TIM_MSM_STATE(__STATE__) (((__STATE__) == TIM_MASTERSLAVEMODE_ENABLE) || \ - ((__STATE__) == TIM_MASTERSLAVEMODE_DISABLE)) - -#define IS_TIM_SLAVE_MODE(__MODE__) (((__MODE__) == TIM_SLAVEMODE_DISABLE) || \ - ((__MODE__) == TIM_SLAVEMODE_RESET) || \ - ((__MODE__) == TIM_SLAVEMODE_GATED) || \ - ((__MODE__) == TIM_SLAVEMODE_TRIGGER) || \ - ((__MODE__) == TIM_SLAVEMODE_EXTERNAL1)) - -#define IS_TIM_PWM_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_PWM1) || \ - ((__MODE__) == TIM_OCMODE_PWM2)) - -#define IS_TIM_OC_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_TIMING) || \ - ((__MODE__) == TIM_OCMODE_ACTIVE) || \ - ((__MODE__) == TIM_OCMODE_INACTIVE) || \ - ((__MODE__) == TIM_OCMODE_TOGGLE) || \ - ((__MODE__) == TIM_OCMODE_FORCED_ACTIVE) || \ - ((__MODE__) == TIM_OCMODE_FORCED_INACTIVE)) - -#define IS_TIM_TRIGGER_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ - ((__SELECTION__) == TIM_TS_ITR1) || \ - ((__SELECTION__) == TIM_TS_ITR2) || \ - ((__SELECTION__) == TIM_TS_ITR3) || \ - ((__SELECTION__) == TIM_TS_TI1F_ED) || \ - ((__SELECTION__) == TIM_TS_TI1FP1) || \ - ((__SELECTION__) == TIM_TS_TI2FP2) || \ - ((__SELECTION__) == TIM_TS_ETRF)) - -#define IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ - ((__SELECTION__) == TIM_TS_ITR1) || \ - ((__SELECTION__) == TIM_TS_ITR2) || \ - ((__SELECTION__) == TIM_TS_ITR3) || \ - ((__SELECTION__) == TIM_TS_NONE)) - -#define IS_TIM_TRIGGERPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_TRIGGERPOLARITY_INVERTED ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_NONINVERTED) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_RISING ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_FALLING ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_BOTHEDGE )) - -#define IS_TIM_TRIGGERPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV8)) - -#define IS_TIM_TRIGGERFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_TI1SELECTION(__TI1SELECTION__) (((__TI1SELECTION__) == TIM_TI1SELECTION_CH1) || \ - ((__TI1SELECTION__) == TIM_TI1SELECTION_XORCOMBINATION)) - -#define IS_TIM_DMA_LENGTH(__LENGTH__) (((__LENGTH__) == TIM_DMABURSTLENGTH_1TRANSFER) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_2TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_3TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_4TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_5TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_6TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_7TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_8TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_9TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_10TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_11TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_12TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_13TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_14TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_15TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_16TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_17TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_18TRANSFERS)) - -#define IS_TIM_DMA_DATA_LENGTH(LENGTH) (((LENGTH) >= 0x1U) && ((LENGTH) < 0x10000U)) - -#define IS_TIM_IC_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_DEADTIME(__DEADTIME__) ((__DEADTIME__) <= 0xFFU) - -#define IS_TIM_SLAVEMODE_TRIGGER_ENABLED(__TRIGGER__) ((__TRIGGER__) == TIM_SLAVEMODE_TRIGGER) - -#define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) - -#define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) - -#define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) - -#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) - -#define TIM_CHANNEL_STATE_GET(__HANDLE__, __CHANNEL__)\ - (((__CHANNEL__) == TIM_CHANNEL_1) ? (__HANDLE__)->ChannelState[0] :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? (__HANDLE__)->ChannelState[1] :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? (__HANDLE__)->ChannelState[2] :\ - (__HANDLE__)->ChannelState[3]) - -#define TIM_CHANNEL_STATE_SET(__HANDLE__, __CHANNEL__, __CHANNEL_STATE__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->ChannelState[0] = (__CHANNEL_STATE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->ChannelState[1] = (__CHANNEL_STATE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->ChannelState[2] = (__CHANNEL_STATE__)) :\ - ((__HANDLE__)->ChannelState[3] = (__CHANNEL_STATE__))) - -#define TIM_CHANNEL_STATE_SET_ALL(__HANDLE__, __CHANNEL_STATE__) do { \ - (__HANDLE__)->ChannelState[0] = (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelState[1] = (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelState[2] = (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelState[3] = (__CHANNEL_STATE__); \ - } while(0) - -#define TIM_CHANNEL_N_STATE_GET(__HANDLE__, __CHANNEL__)\ - (((__CHANNEL__) == TIM_CHANNEL_1) ? (__HANDLE__)->ChannelNState[0] :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? (__HANDLE__)->ChannelNState[1] :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? (__HANDLE__)->ChannelNState[2] :\ - (__HANDLE__)->ChannelNState[3]) - -#define TIM_CHANNEL_N_STATE_SET(__HANDLE__, __CHANNEL__, __CHANNEL_STATE__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->ChannelNState[0] = (__CHANNEL_STATE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->ChannelNState[1] = (__CHANNEL_STATE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->ChannelNState[2] = (__CHANNEL_STATE__)) :\ - ((__HANDLE__)->ChannelNState[3] = (__CHANNEL_STATE__))) - -#define TIM_CHANNEL_N_STATE_SET_ALL(__HANDLE__, __CHANNEL_STATE__) do { \ - (__HANDLE__)->ChannelNState[0] = \ - (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelNState[1] = \ - (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelNState[2] = \ - (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelNState[3] = \ - (__CHANNEL_STATE__); \ - } while(0) - -/** - * @} - */ -/* End of private macros -----------------------------------------------------*/ - -/* Include TIM HAL Extended module */ -#include "stm32f4xx_hal_tim_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup TIM_Exported_Functions TIM Exported Functions - * @{ - */ - -/** @addtogroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * @{ - */ -/* Time Base functions ********************************************************/ -HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, const uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * @{ - */ -/* Timer Output Compare functions *********************************************/ -HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length); -HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * @{ - */ -/* Timer PWM functions ********************************************************/ -HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length); -HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * @{ - */ -/* Timer Input Capture functions **********************************************/ -HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * @{ - */ -/* Timer One Pulse functions **************************************************/ -HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode); -HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * @{ - */ -/* Timer Encoder functions ****************************************************/ -HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, const TIM_Encoder_InitTypeDef *sConfig); -HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, - uint32_t *pData2, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief IRQ handler management - * @{ - */ -/* Interrupt Handler functions ***********************************************/ -void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ -/* Control functions *********************************************************/ -HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_OC_InitTypeDef *sConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_OC_InitTypeDef *sConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_IC_InitTypeDef *sConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, - uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, - const TIM_ClearInputConfigTypeDef *sClearInputConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, const TIM_ClockConfigTypeDef *sClockSourceConfig); -HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, - uint32_t BurstLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, - uint32_t BurstLength, uint32_t DataLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, - uint32_t BurstLength, uint32_t DataLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); -uint32_t HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * @{ - */ -/* Callback in non blocking modes (Interrupt and DMA) *************************/ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, - pTIM_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief Peripheral State functions - * @{ - */ -/* Peripheral State functions ************************************************/ -HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(const TIM_HandleTypeDef *htim); - -/* Peripheral Channel state functions ************************************************/ -HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(const TIM_HandleTypeDef *htim); -HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(const TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(const TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** - * @} - */ -/* End of exported functions -------------------------------------------------*/ - -/* Private functions----------------------------------------------------------*/ -/** @defgroup TIM_Private_Functions TIM Private Functions - * @{ - */ -void TIM_Base_SetConfig(TIM_TypeDef *TIMx, const TIM_Base_InitTypeDef *Structure); -void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); -void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); -void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, - uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter); - -void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma); -void TIM_DMAError(DMA_HandleTypeDef *hdma); -void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma); -void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma); -void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -void TIM_ResetCallback(TIM_HandleTypeDef *htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ -/* End of private functions --------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_TIM_H */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h deleted file mode 100644 index 561e9bb..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h +++ /dev/null @@ -1,355 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim_ex.h - * @author MCD Application Team - * @brief Header file of TIM HAL Extended module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_TIM_EX_H -#define STM32F4xx_HAL_TIM_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup TIMEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Types TIM Extended Exported Types - * @{ - */ - -/** - * @brief TIM Hall sensor Configuration Structure definition - */ - -typedef struct -{ - uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC1Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t Commutation_Delay; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ -} TIM_HallSensor_InitTypeDef; -/** - * @} - */ -/* End of exported types -----------------------------------------------------*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Constants TIM Extended Exported Constants - * @{ - */ - -/** @defgroup TIMEx_Remap TIM Extended Remapping - * @{ - */ -#if defined (TIM2) -#if defined(TIM8) -#define TIM_TIM2_TIM8_TRGO 0x00000000U /*!< TIM2 ITR1 is connected to TIM8 TRGO */ -#endif /* TIM8 */ -#define TIM_TIM2_ETH_PTP TIM_OR_ITR1_RMP_0 /*!< TIM2 ITR1 is connected to PTP trigger output */ -#define TIM_TIM2_USBFS_SOF TIM_OR_ITR1_RMP_1 /*!< TIM2 ITR1 is connected to OTG FS SOF */ -#define TIM_TIM2_USBHS_SOF (TIM_OR_ITR1_RMP_1 | TIM_OR_ITR1_RMP_0) /*!< TIM2 ITR1 is connected to OTG HS SOF */ -#endif /* TIM2 */ - -#define TIM_TIM5_GPIO 0x00000000U /*!< TIM5 TI4 is connected to GPIO */ -#define TIM_TIM5_LSI TIM_OR_TI4_RMP_0 /*!< TIM5 TI4 is connected to LSI */ -#define TIM_TIM5_LSE TIM_OR_TI4_RMP_1 /*!< TIM5 TI4 is connected to LSE */ -#define TIM_TIM5_RTC (TIM_OR_TI4_RMP_1 | TIM_OR_TI4_RMP_0) /*!< TIM5 TI4 is connected to the RTC wakeup interrupt */ - -#define TIM_TIM11_GPIO 0x00000000U /*!< TIM11 TI1 is connected to GPIO */ -#define TIM_TIM11_HSE TIM_OR_TI1_RMP_1 /*!< TIM11 TI1 is connected to HSE_RTC clock */ -#if defined(SPDIFRX) -#define TIM_TIM11_SPDIFRX TIM_OR_TI1_RMP_0 /*!< TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC */ -#endif /* SPDIFRX*/ - -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) -#define LPTIM_REMAP_MASK 0x10000000U - -#define TIM_TIM9_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM9 ITR1 is connected to TIM3 TRGO */ -#define TIM_TIM9_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM9_ITR1_RMP) /*!< TIM9 ITR1 is connected to LPTIM1 output */ - -#define TIM_TIM5_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM5 ITR1 is connected to TIM3 TRGO */ -#define TIM_TIM5_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM5_ITR1_RMP) /*!< TIM5 ITR1 is connected to LPTIM1 output */ - -#define TIM_TIM1_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM1 ITR2 is connected to TIM3 TRGO */ -#define TIM_TIM1_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM1_ITR2_RMP) /*!< TIM1 ITR2 is connected to LPTIM1 output */ -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ -/** - * @} - */ - -/** - * @} - */ -/* End of exported constants -------------------------------------------------*/ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Macros TIM Extended Exported Macros - * @{ - */ - -/** - * @} - */ -/* End of exported macro -----------------------------------------------------*/ - -/* Private macro -------------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Macros TIM Extended Private Macros - * @{ - */ -#if defined(SPDIFRX) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_SPDIFRX) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#elif defined(TIM2) -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE))) || \ - (((INSTANCE) == TIM1) && (((TIM_REMAP) == TIM_TIM1_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM1_LPTIM))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM5_LPTIM))) || \ - (((INSTANCE) == TIM9) && (((TIM_REMAP) == TIM_TIM9_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM9_LPTIM)))) -#elif defined(TIM8) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#else -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_ETH_PTP) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ -#else -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#endif /* SPDIFRX */ - -/** - * @} - */ -/* End of private macro ------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup TIMEx_Exported_Functions TIM Extended Exported Functions - * @{ - */ - -/** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * @{ - */ -/* Timer Hall Sensor functions **********************************************/ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, const TIM_HallSensor_InitTypeDef *sConfig); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); - -void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim); - -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * @{ - */ -/* Timer Complementary Output Compare functions *****************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * @{ - */ -/* Timer Complementary PWM functions ****************************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * @{ - */ -/* Timer Complementary One Pulse functions **********************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ -/* Extended Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, - const TIM_MasterConfigTypeDef *sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, - const TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); -HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions - * @brief Extended Callbacks functions - * @{ - */ -/* Extended Callback **********************************************************/ -void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim); -void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions - * @brief Extended Peripheral State functions - * @{ - */ -/* Extended Peripheral State functions ***************************************/ -HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(const TIM_HandleTypeDef *htim, uint32_t ChannelN); -/** - * @} - */ - -/** - * @} - */ -/* End of exported functions -------------------------------------------------*/ - -/* Private functions----------------------------------------------------------*/ -/** @addtogroup TIMEx_Private_Functions TIM Extended Private Functions - * @{ - */ -void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); -void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma); -/** - * @} - */ -/* End of private functions --------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* STM32F4xx_HAL_TIM_EX_H */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h deleted file mode 100644 index ce19d4d..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h +++ /dev/null @@ -1,2105 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_bus.h - * @author MCD Application Team - * @brief Header file of BUS LL module. - - @verbatim - ##### RCC Limitations ##### - ============================================================================== - [..] - A delay between an RCC peripheral clock enable and the effective peripheral - enabling should be taken into account in order to manage the peripheral read/write - from/to registers. - (+) This delay depends on the peripheral mapping. - (++) AHB & APB peripherals, 1 dummy read is necessary - - [..] - Workarounds: - (#) For AHB & APB peripherals, a dummy read to the peripheral register has been - inserted in each LL_{BUS}_GRP{x}_EnableClock() function. - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_BUS_H -#define __STM32F4xx_LL_BUS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined(RCC) - -/** @defgroup BUS_LL BUS - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup BUS_LL_Exported_Constants BUS Exported Constants - * @{ - */ - -/** @defgroup BUS_LL_EC_AHB1_GRP1_PERIPH AHB1 GRP1 PERIPH - * @{ - */ -#define LL_AHB1_GRP1_PERIPH_ALL 0xFFFFFFFFU -#define LL_AHB1_GRP1_PERIPH_GPIOA RCC_AHB1ENR_GPIOAEN -#define LL_AHB1_GRP1_PERIPH_GPIOB RCC_AHB1ENR_GPIOBEN -#define LL_AHB1_GRP1_PERIPH_GPIOC RCC_AHB1ENR_GPIOCEN -#if defined(GPIOD) -#define LL_AHB1_GRP1_PERIPH_GPIOD RCC_AHB1ENR_GPIODEN -#endif /* GPIOD */ -#if defined(GPIOE) -#define LL_AHB1_GRP1_PERIPH_GPIOE RCC_AHB1ENR_GPIOEEN -#endif /* GPIOE */ -#if defined(GPIOF) -#define LL_AHB1_GRP1_PERIPH_GPIOF RCC_AHB1ENR_GPIOFEN -#endif /* GPIOF */ -#if defined(GPIOG) -#define LL_AHB1_GRP1_PERIPH_GPIOG RCC_AHB1ENR_GPIOGEN -#endif /* GPIOG */ -#if defined(GPIOH) -#define LL_AHB1_GRP1_PERIPH_GPIOH RCC_AHB1ENR_GPIOHEN -#endif /* GPIOH */ -#if defined(GPIOI) -#define LL_AHB1_GRP1_PERIPH_GPIOI RCC_AHB1ENR_GPIOIEN -#endif /* GPIOI */ -#if defined(GPIOJ) -#define LL_AHB1_GRP1_PERIPH_GPIOJ RCC_AHB1ENR_GPIOJEN -#endif /* GPIOJ */ -#if defined(GPIOK) -#define LL_AHB1_GRP1_PERIPH_GPIOK RCC_AHB1ENR_GPIOKEN -#endif /* GPIOK */ -#define LL_AHB1_GRP1_PERIPH_CRC RCC_AHB1ENR_CRCEN -#if defined(RCC_AHB1ENR_BKPSRAMEN) -#define LL_AHB1_GRP1_PERIPH_BKPSRAM RCC_AHB1ENR_BKPSRAMEN -#endif /* RCC_AHB1ENR_BKPSRAMEN */ -#if defined(RCC_AHB1ENR_CCMDATARAMEN) -#define LL_AHB1_GRP1_PERIPH_CCMDATARAM RCC_AHB1ENR_CCMDATARAMEN -#endif /* RCC_AHB1ENR_CCMDATARAMEN */ -#define LL_AHB1_GRP1_PERIPH_DMA1 RCC_AHB1ENR_DMA1EN -#define LL_AHB1_GRP1_PERIPH_DMA2 RCC_AHB1ENR_DMA2EN -#if defined(RCC_AHB1ENR_RNGEN) -#define LL_AHB1_GRP1_PERIPH_RNG RCC_AHB1ENR_RNGEN -#endif /* RCC_AHB1ENR_RNGEN */ -#if defined(DMA2D) -#define LL_AHB1_GRP1_PERIPH_DMA2D RCC_AHB1ENR_DMA2DEN -#endif /* DMA2D */ -#if defined(ETH) -#define LL_AHB1_GRP1_PERIPH_ETHMAC RCC_AHB1ENR_ETHMACEN -#define LL_AHB1_GRP1_PERIPH_ETHMACTX RCC_AHB1ENR_ETHMACTXEN -#define LL_AHB1_GRP1_PERIPH_ETHMACRX RCC_AHB1ENR_ETHMACRXEN -#define LL_AHB1_GRP1_PERIPH_ETHMACPTP RCC_AHB1ENR_ETHMACPTPEN -#endif /* ETH */ -#if defined(USB_OTG_HS) -#define LL_AHB1_GRP1_PERIPH_OTGHS RCC_AHB1ENR_OTGHSEN -#define LL_AHB1_GRP1_PERIPH_OTGHSULPI RCC_AHB1ENR_OTGHSULPIEN -#endif /* USB_OTG_HS */ -#define LL_AHB1_GRP1_PERIPH_FLITF RCC_AHB1LPENR_FLITFLPEN -#define LL_AHB1_GRP1_PERIPH_SRAM1 RCC_AHB1LPENR_SRAM1LPEN -#if defined(RCC_AHB1LPENR_SRAM2LPEN) -#define LL_AHB1_GRP1_PERIPH_SRAM2 RCC_AHB1LPENR_SRAM2LPEN -#endif /* RCC_AHB1LPENR_SRAM2LPEN */ -#if defined(RCC_AHB1LPENR_SRAM3LPEN) -#define LL_AHB1_GRP1_PERIPH_SRAM3 RCC_AHB1LPENR_SRAM3LPEN -#endif /* RCC_AHB1LPENR_SRAM3LPEN */ -/** - * @} - */ - -#if defined(RCC_AHB2_SUPPORT) -/** @defgroup BUS_LL_EC_AHB2_GRP1_PERIPH AHB2 GRP1 PERIPH - * @{ - */ -#define LL_AHB2_GRP1_PERIPH_ALL 0xFFFFFFFFU -#if defined(DCMI) -#define LL_AHB2_GRP1_PERIPH_DCMI RCC_AHB2ENR_DCMIEN -#endif /* DCMI */ -#if defined(CRYP) -#define LL_AHB2_GRP1_PERIPH_CRYP RCC_AHB2ENR_CRYPEN -#endif /* CRYP */ -#if defined(AES) -#define LL_AHB2_GRP1_PERIPH_AES RCC_AHB2ENR_AESEN -#endif /* AES */ -#if defined(HASH) -#define LL_AHB2_GRP1_PERIPH_HASH RCC_AHB2ENR_HASHEN -#endif /* HASH */ -#if defined(RCC_AHB2ENR_RNGEN) -#define LL_AHB2_GRP1_PERIPH_RNG RCC_AHB2ENR_RNGEN -#endif /* RCC_AHB2ENR_RNGEN */ -#if defined(USB_OTG_FS) -#define LL_AHB2_GRP1_PERIPH_OTGFS RCC_AHB2ENR_OTGFSEN -#endif /* USB_OTG_FS */ -/** - * @} - */ -#endif /* RCC_AHB2_SUPPORT */ - -#if defined(RCC_AHB3_SUPPORT) -/** @defgroup BUS_LL_EC_AHB3_GRP1_PERIPH AHB3 GRP1 PERIPH - * @{ - */ -#define LL_AHB3_GRP1_PERIPH_ALL 0xFFFFFFFFU -#if defined(FSMC_Bank1) -#define LL_AHB3_GRP1_PERIPH_FSMC RCC_AHB3ENR_FSMCEN -#endif /* FSMC_Bank1 */ -#if defined(FMC_Bank1) -#define LL_AHB3_GRP1_PERIPH_FMC RCC_AHB3ENR_FMCEN -#endif /* FMC_Bank1 */ -#if defined(QUADSPI) -#define LL_AHB3_GRP1_PERIPH_QSPI RCC_AHB3ENR_QSPIEN -#endif /* QUADSPI */ -/** - * @} - */ -#endif /* RCC_AHB3_SUPPORT */ - -/** @defgroup BUS_LL_EC_APB1_GRP1_PERIPH APB1 GRP1 PERIPH - * @{ - */ -#define LL_APB1_GRP1_PERIPH_ALL 0xFFFFFFFFU -#if defined(TIM2) -#define LL_APB1_GRP1_PERIPH_TIM2 RCC_APB1ENR_TIM2EN -#endif /* TIM2 */ -#if defined(TIM3) -#define LL_APB1_GRP1_PERIPH_TIM3 RCC_APB1ENR_TIM3EN -#endif /* TIM3 */ -#if defined(TIM4) -#define LL_APB1_GRP1_PERIPH_TIM4 RCC_APB1ENR_TIM4EN -#endif /* TIM4 */ -#define LL_APB1_GRP1_PERIPH_TIM5 RCC_APB1ENR_TIM5EN -#if defined(TIM6) -#define LL_APB1_GRP1_PERIPH_TIM6 RCC_APB1ENR_TIM6EN -#endif /* TIM6 */ -#if defined(TIM7) -#define LL_APB1_GRP1_PERIPH_TIM7 RCC_APB1ENR_TIM7EN -#endif /* TIM7 */ -#if defined(TIM12) -#define LL_APB1_GRP1_PERIPH_TIM12 RCC_APB1ENR_TIM12EN -#endif /* TIM12 */ -#if defined(TIM13) -#define LL_APB1_GRP1_PERIPH_TIM13 RCC_APB1ENR_TIM13EN -#endif /* TIM13 */ -#if defined(TIM14) -#define LL_APB1_GRP1_PERIPH_TIM14 RCC_APB1ENR_TIM14EN -#endif /* TIM14 */ -#if defined(LPTIM1) -#define LL_APB1_GRP1_PERIPH_LPTIM1 RCC_APB1ENR_LPTIM1EN -#endif /* LPTIM1 */ -#if defined(RCC_APB1ENR_RTCAPBEN) -#define LL_APB1_GRP1_PERIPH_RTCAPB RCC_APB1ENR_RTCAPBEN -#endif /* RCC_APB1ENR_RTCAPBEN */ -#define LL_APB1_GRP1_PERIPH_WWDG RCC_APB1ENR_WWDGEN -#if defined(SPI2) -#define LL_APB1_GRP1_PERIPH_SPI2 RCC_APB1ENR_SPI2EN -#endif /* SPI2 */ -#if defined(SPI3) -#define LL_APB1_GRP1_PERIPH_SPI3 RCC_APB1ENR_SPI3EN -#endif /* SPI3 */ -#if defined(SPDIFRX) -#define LL_APB1_GRP1_PERIPH_SPDIFRX RCC_APB1ENR_SPDIFRXEN -#endif /* SPDIFRX */ -#define LL_APB1_GRP1_PERIPH_USART2 RCC_APB1ENR_USART2EN -#if defined(USART3) -#define LL_APB1_GRP1_PERIPH_USART3 RCC_APB1ENR_USART3EN -#endif /* USART3 */ -#if defined(UART4) -#define LL_APB1_GRP1_PERIPH_UART4 RCC_APB1ENR_UART4EN -#endif /* UART4 */ -#if defined(UART5) -#define LL_APB1_GRP1_PERIPH_UART5 RCC_APB1ENR_UART5EN -#endif /* UART5 */ -#define LL_APB1_GRP1_PERIPH_I2C1 RCC_APB1ENR_I2C1EN -#define LL_APB1_GRP1_PERIPH_I2C2 RCC_APB1ENR_I2C2EN -#if defined(I2C3) -#define LL_APB1_GRP1_PERIPH_I2C3 RCC_APB1ENR_I2C3EN -#endif /* I2C3 */ -#if defined(FMPI2C1) -#define LL_APB1_GRP1_PERIPH_FMPI2C1 RCC_APB1ENR_FMPI2C1EN -#endif /* FMPI2C1 */ -#if defined(CAN1) -#define LL_APB1_GRP1_PERIPH_CAN1 RCC_APB1ENR_CAN1EN -#endif /* CAN1 */ -#if defined(CAN2) -#define LL_APB1_GRP1_PERIPH_CAN2 RCC_APB1ENR_CAN2EN -#endif /* CAN2 */ -#if defined(CAN3) -#define LL_APB1_GRP1_PERIPH_CAN3 RCC_APB1ENR_CAN3EN -#endif /* CAN3 */ -#if defined(CEC) -#define LL_APB1_GRP1_PERIPH_CEC RCC_APB1ENR_CECEN -#endif /* CEC */ -#define LL_APB1_GRP1_PERIPH_PWR RCC_APB1ENR_PWREN -#if defined(DAC1) -#define LL_APB1_GRP1_PERIPH_DAC1 RCC_APB1ENR_DACEN -#endif /* DAC1 */ -#if defined(UART7) -#define LL_APB1_GRP1_PERIPH_UART7 RCC_APB1ENR_UART7EN -#endif /* UART7 */ -#if defined(UART8) -#define LL_APB1_GRP1_PERIPH_UART8 RCC_APB1ENR_UART8EN -#endif /* UART8 */ -/** - * @} - */ - -/** @defgroup BUS_LL_EC_APB2_GRP1_PERIPH APB2 GRP1 PERIPH - * @{ - */ -#define LL_APB2_GRP1_PERIPH_ALL 0xFFFFFFFFU -#define LL_APB2_GRP1_PERIPH_TIM1 RCC_APB2ENR_TIM1EN -#if defined(TIM8) -#define LL_APB2_GRP1_PERIPH_TIM8 RCC_APB2ENR_TIM8EN -#endif /* TIM8 */ -#define LL_APB2_GRP1_PERIPH_USART1 RCC_APB2ENR_USART1EN -#if defined(USART6) -#define LL_APB2_GRP1_PERIPH_USART6 RCC_APB2ENR_USART6EN -#endif /* USART6 */ -#if defined(UART9) -#define LL_APB2_GRP1_PERIPH_UART9 RCC_APB2ENR_UART9EN -#endif /* UART9 */ -#if defined(UART10) -#define LL_APB2_GRP1_PERIPH_UART10 RCC_APB2ENR_UART10EN -#endif /* UART10 */ -#define LL_APB2_GRP1_PERIPH_ADC1 RCC_APB2ENR_ADC1EN -#if defined(ADC2) -#define LL_APB2_GRP1_PERIPH_ADC2 RCC_APB2ENR_ADC2EN -#endif /* ADC2 */ -#if defined(ADC3) -#define LL_APB2_GRP1_PERIPH_ADC3 RCC_APB2ENR_ADC3EN -#endif /* ADC3 */ -#if defined(SDIO) -#define LL_APB2_GRP1_PERIPH_SDIO RCC_APB2ENR_SDIOEN -#endif /* SDIO */ -#define LL_APB2_GRP1_PERIPH_SPI1 RCC_APB2ENR_SPI1EN -#if defined(SPI4) -#define LL_APB2_GRP1_PERIPH_SPI4 RCC_APB2ENR_SPI4EN -#endif /* SPI4 */ -#define LL_APB2_GRP1_PERIPH_SYSCFG RCC_APB2ENR_SYSCFGEN -#if defined(RCC_APB2ENR_EXTITEN) -#define LL_APB2_GRP1_PERIPH_EXTI RCC_APB2ENR_EXTITEN -#endif /* RCC_APB2ENR_EXTITEN */ -#define LL_APB2_GRP1_PERIPH_TIM9 RCC_APB2ENR_TIM9EN -#if defined(TIM10) -#define LL_APB2_GRP1_PERIPH_TIM10 RCC_APB2ENR_TIM10EN -#endif /* TIM10 */ -#define LL_APB2_GRP1_PERIPH_TIM11 RCC_APB2ENR_TIM11EN -#if defined(SPI5) -#define LL_APB2_GRP1_PERIPH_SPI5 RCC_APB2ENR_SPI5EN -#endif /* SPI5 */ -#if defined(SPI6) -#define LL_APB2_GRP1_PERIPH_SPI6 RCC_APB2ENR_SPI6EN -#endif /* SPI6 */ -#if defined(SAI1) -#define LL_APB2_GRP1_PERIPH_SAI1 RCC_APB2ENR_SAI1EN -#endif /* SAI1 */ -#if defined(SAI2) -#define LL_APB2_GRP1_PERIPH_SAI2 RCC_APB2ENR_SAI2EN -#endif /* SAI2 */ -#if defined(LTDC) -#define LL_APB2_GRP1_PERIPH_LTDC RCC_APB2ENR_LTDCEN -#endif /* LTDC */ -#if defined(DSI) -#define LL_APB2_GRP1_PERIPH_DSI RCC_APB2ENR_DSIEN -#endif /* DSI */ -#if defined(DFSDM1_Channel0) -#define LL_APB2_GRP1_PERIPH_DFSDM1 RCC_APB2ENR_DFSDM1EN -#endif /* DFSDM1_Channel0 */ -#if defined(DFSDM2_Channel0) -#define LL_APB2_GRP1_PERIPH_DFSDM2 RCC_APB2ENR_DFSDM2EN -#endif /* DFSDM2_Channel0 */ -#define LL_APB2_GRP1_PERIPH_ADC RCC_APB2RSTR_ADCRST -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup BUS_LL_Exported_Functions BUS Exported Functions - * @{ - */ - -/** @defgroup BUS_LL_EF_AHB1 AHB1 - * @{ - */ - -/** - * @brief Enable AHB1 peripherals clock. - * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOBEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOCEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIODEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOEEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOFEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOGEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOHEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOIEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOJEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOKEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR CRCEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR DMA1EN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR DMA2EN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR RNGEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR DMA2DEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR ETHMACEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR OTGHSEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB1ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB1ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if AHB1 peripheral clock is enabled or not - * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOBEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOCEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIODEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOEEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOFEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOGEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOHEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOIEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOJEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOKEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR CRCEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR DMA1EN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR DMA2EN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR RNGEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR DMA2DEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR ETHMACEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR OTGHSEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_AHB1_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->AHB1ENR, Periphs) == Periphs); -} - -/** - * @brief Disable AHB1 peripherals clock. - * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOBEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOCEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIODEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOEEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOFEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOGEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOHEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOIEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOJEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOKEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR CRCEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR DMA1EN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR DMA2EN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR RNGEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR DMA2DEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR ETHMACEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR OTGHSEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB1ENR, Periphs); -} - -/** - * @brief Force AHB1 peripherals reset. - * @rmtoll AHB1RSTR GPIOARST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOBRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOCRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIODRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOERST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOFRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOGRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOHRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOIRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOJRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOKRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR CRCRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR DMA1RST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR DMA2RST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR RNGRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR DMA2DRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR ETHMACRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR OTGHSRST LL_AHB1_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_ALL - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->AHB1RSTR, Periphs); -} - -/** - * @brief Release AHB1 peripherals reset. - * @rmtoll AHB1RSTR GPIOARST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOBRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOCRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIODRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOERST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOFRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOGRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOHRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOIRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOJRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOKRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR CRCRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR DMA1RST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR DMA2RST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR RNGRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR DMA2DRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR ETHMACRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR OTGHSRST LL_AHB1_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_ALL - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB1RSTR, Periphs); -} - -/** - * @brief Enable AHB1 peripheral clocks in low-power mode - * @rmtoll AHB1LPENR GPIOALPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOBLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOCLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIODLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOELPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOFLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOGLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOHLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOILPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOJLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOKLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR CRCLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR FLITFLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR SRAM1LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR SRAM2LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR SRAM3LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR DMA1LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR DMA2LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR DMA2DLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR RNGLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR ETHMACLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR ETHMACTXLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR ETHMACRXLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR ETHMACPTPLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR OTGHSLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR OTGHSULPILPEN LL_AHB1_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_FLITF - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM1 - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM2 (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM3 (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB1LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB1LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable AHB1 peripheral clocks in low-power mode - * @rmtoll AHB1LPENR GPIOALPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOBLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOCLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIODLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOELPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOFLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOGLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOHLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOILPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOJLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOKLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR CRCLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR FLITFLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR SRAM1LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR SRAM2LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR SRAM3LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR DMA1LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR DMA2LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR DMA2DLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR RNGLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR ETHMACLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR ETHMACTXLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR ETHMACRXLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR ETHMACPTPLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR OTGHSLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR OTGHSULPILPEN LL_AHB1_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_FLITF - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM1 - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM2 (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM3 (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB1LPENR, Periphs); -} - -/** - * @} - */ - -#if defined(RCC_AHB2_SUPPORT) -/** @defgroup BUS_LL_EF_AHB2 AHB2 - * @{ - */ - -/** - * @brief Enable AHB2 peripherals clock. - * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR CRYPEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR AESEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR HASHEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR RNGEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR OTGFSEN LL_AHB2_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB2ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB2ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if AHB2 peripheral clock is enabled or not - * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR CRYPEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR AESEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR HASHEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR RNGEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR OTGFSEN LL_AHB2_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_AHB2_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->AHB2ENR, Periphs) == Periphs); -} - -/** - * @brief Disable AHB2 peripherals clock. - * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR CRYPEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR AESEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR HASHEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR RNGEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR OTGFSEN LL_AHB2_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB2ENR, Periphs); -} - -/** - * @brief Force AHB2 peripherals reset. - * @rmtoll AHB2RSTR DCMIRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR CRYPRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR AESRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR HASHRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR RNGRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR OTGFSRST LL_AHB2_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_ALL - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->AHB2RSTR, Periphs); -} - -/** - * @brief Release AHB2 peripherals reset. - * @rmtoll AHB2RSTR DCMIRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR CRYPRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR AESRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR HASHRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR RNGRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR OTGFSRST LL_AHB2_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_ALL - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB2RSTR, Periphs); -} - -/** - * @brief Enable AHB2 peripheral clocks in low-power mode - * @rmtoll AHB2LPENR DCMILPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR CRYPLPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR AESLPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR HASHLPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR RNGLPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR OTGFSLPEN LL_AHB2_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB2LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB2LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable AHB2 peripheral clocks in low-power mode - * @rmtoll AHB2LPENR DCMILPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR CRYPLPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR AESLPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR HASHLPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR RNGLPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR OTGFSLPEN LL_AHB2_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB2LPENR, Periphs); -} - -/** - * @} - */ -#endif /* RCC_AHB2_SUPPORT */ - -#if defined(RCC_AHB3_SUPPORT) -/** @defgroup BUS_LL_EF_AHB3 AHB3 - * @{ - */ - -/** - * @brief Enable AHB3 peripherals clock. - * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_EnableClock\n - * AHB3ENR FSMCEN LL_AHB3_GRP1_EnableClock\n - * AHB3ENR QSPIEN LL_AHB3_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB3ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB3ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if AHB3 peripheral clock is enabled or not - * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_IsEnabledClock\n - * AHB3ENR FSMCEN LL_AHB3_GRP1_IsEnabledClock\n - * AHB3ENR QSPIEN LL_AHB3_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_AHB3_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->AHB3ENR, Periphs) == Periphs); -} - -/** - * @brief Disable AHB3 peripherals clock. - * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_DisableClock\n - * AHB3ENR FSMCEN LL_AHB3_GRP1_DisableClock\n - * AHB3ENR QSPIEN LL_AHB3_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB3ENR, Periphs); -} - -/** - * @brief Force AHB3 peripherals reset. - * @rmtoll AHB3RSTR FMCRST LL_AHB3_GRP1_ForceReset\n - * AHB3RSTR FSMCRST LL_AHB3_GRP1_ForceReset\n - * AHB3RSTR QSPIRST LL_AHB3_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_ALL - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->AHB3RSTR, Periphs); -} - -/** - * @brief Release AHB3 peripherals reset. - * @rmtoll AHB3RSTR FMCRST LL_AHB3_GRP1_ReleaseReset\n - * AHB3RSTR FSMCRST LL_AHB3_GRP1_ReleaseReset\n - * AHB3RSTR QSPIRST LL_AHB3_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_ALL - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB3RSTR, Periphs); -} - -/** - * @brief Enable AHB3 peripheral clocks in low-power mode - * @rmtoll AHB3LPENR FMCLPEN LL_AHB3_GRP1_EnableClockLowPower\n - * AHB3LPENR FSMCLPEN LL_AHB3_GRP1_EnableClockLowPower\n - * AHB3LPENR QSPILPEN LL_AHB3_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB3LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB3LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable AHB3 peripheral clocks in low-power mode - * @rmtoll AHB3LPENR FMCLPEN LL_AHB3_GRP1_DisableClockLowPower\n - * AHB3LPENR FSMCLPEN LL_AHB3_GRP1_DisableClockLowPower\n - * AHB3LPENR QSPILPEN LL_AHB3_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB3LPENR, Periphs); -} - -/** - * @} - */ -#endif /* RCC_AHB3_SUPPORT */ - -/** @defgroup BUS_LL_EF_APB1 APB1 - * @{ - */ - -/** - * @brief Enable APB1 peripherals clock. - * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM4EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM5EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM6EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM7EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM12EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM13EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM14EN LL_APB1_GRP1_EnableClock\n - * APB1ENR LPTIM1EN LL_APB1_GRP1_EnableClock\n - * APB1ENR WWDGEN LL_APB1_GRP1_EnableClock\n - * APB1ENR SPI2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR SPI3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR SPDIFRXEN LL_APB1_GRP1_EnableClock\n - * APB1ENR USART2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR USART3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR UART4EN LL_APB1_GRP1_EnableClock\n - * APB1ENR UART5EN LL_APB1_GRP1_EnableClock\n - * APB1ENR I2C1EN LL_APB1_GRP1_EnableClock\n - * APB1ENR I2C2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR I2C3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR FMPI2C1EN LL_APB1_GRP1_EnableClock\n - * APB1ENR CAN1EN LL_APB1_GRP1_EnableClock\n - * APB1ENR CAN2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR CAN3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR CECEN LL_APB1_GRP1_EnableClock\n - * APB1ENR PWREN LL_APB1_GRP1_EnableClock\n - * APB1ENR DACEN LL_APB1_GRP1_EnableClock\n - * APB1ENR UART7EN LL_APB1_GRP1_EnableClock\n - * APB1ENR UART8EN LL_APB1_GRP1_EnableClock\n - * APB1ENR RTCAPBEN LL_APB1_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->APB1ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->APB1ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if APB1 peripheral clock is enabled or not - * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM4EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM5EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM6EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM7EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM12EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM13EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM14EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR LPTIM1EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR WWDGEN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR SPI2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR SPI3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR SPDIFRXEN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR USART2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR USART3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR UART4EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR UART5EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR I2C1EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR I2C2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR I2C3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR FMPI2C1EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR CAN1EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR CAN2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR CAN3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR CECEN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR PWREN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR DACEN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR UART7EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR UART8EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR RTCAPBEN LL_APB1_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_APB1_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->APB1ENR, Periphs) == Periphs); -} - -/** - * @brief Disable APB1 peripherals clock. - * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM4EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM5EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM6EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM7EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM12EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM13EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM14EN LL_APB1_GRP1_DisableClock\n - * APB1ENR LPTIM1EN LL_APB1_GRP1_DisableClock\n - * APB1ENR WWDGEN LL_APB1_GRP1_DisableClock\n - * APB1ENR SPI2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR SPI3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR SPDIFRXEN LL_APB1_GRP1_DisableClock\n - * APB1ENR USART2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR USART3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR UART4EN LL_APB1_GRP1_DisableClock\n - * APB1ENR UART5EN LL_APB1_GRP1_DisableClock\n - * APB1ENR I2C1EN LL_APB1_GRP1_DisableClock\n - * APB1ENR I2C2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR I2C3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR FMPI2C1EN LL_APB1_GRP1_DisableClock\n - * APB1ENR CAN1EN LL_APB1_GRP1_DisableClock\n - * APB1ENR CAN2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR CAN3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR CECEN LL_APB1_GRP1_DisableClock\n - * APB1ENR PWREN LL_APB1_GRP1_DisableClock\n - * APB1ENR DACEN LL_APB1_GRP1_DisableClock\n - * APB1ENR UART7EN LL_APB1_GRP1_DisableClock\n - * APB1ENR UART8EN LL_APB1_GRP1_DisableClock\n - * APB1ENR RTCAPBEN LL_APB1_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB1ENR, Periphs); -} - -/** - * @brief Force APB1 peripherals reset. - * @rmtoll APB1RSTR TIM2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM4RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM5RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM6RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM7RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM12RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM13RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM14RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR LPTIM1RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR WWDGRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR SPI2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR SPI3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR SPDIFRXRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR USART2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR USART3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR UART4RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR UART5RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR I2C1RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR I2C2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR I2C3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR FMPI2C1RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR CAN1RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR CAN2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR CAN3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR CECRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR PWRRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR DACRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR UART7RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR UART8RST LL_APB1_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->APB1RSTR, Periphs); -} - -/** - * @brief Release APB1 peripherals reset. - * @rmtoll APB1RSTR TIM2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM4RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM5RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM6RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM7RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM12RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM13RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM14RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR LPTIM1RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR WWDGRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR SPI2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR SPI3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR SPDIFRXRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR USART2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR USART3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR UART4RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR UART5RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR I2C1RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR I2C2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR I2C3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR FMPI2C1RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR CAN1RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR CAN2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR CAN3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR CECRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR PWRRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR DACRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR UART7RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR UART8RST LL_APB1_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB1RSTR, Periphs); -} - -/** - * @brief Enable APB1 peripheral clocks in low-power mode - * @rmtoll APB1LPENR TIM2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM4LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM5LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM6LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM7LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM12LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM13LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM14LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR LPTIM1LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR WWDGLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR SPI2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR SPI3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR SPDIFRXLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR USART2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR USART3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR UART4LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR UART5LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR I2C1LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR I2C2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR I2C3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR FMPI2C1LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR CAN1LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR CAN2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR CAN3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR CECLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR PWRLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR DACLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR UART7LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR UART8LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR RTCAPBLPEN LL_APB1_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->APB1LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->APB1LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable APB1 peripheral clocks in low-power mode - * @rmtoll APB1LPENR TIM2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM4LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM5LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM6LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM7LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM12LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM13LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM14LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR LPTIM1LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR WWDGLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR SPI2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR SPI3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR SPDIFRXLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR USART2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR USART3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR UART4LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR UART5LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR I2C1LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR I2C2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR I2C3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR FMPI2C1LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR CAN1LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR CAN2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR CAN3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR CECLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR PWRLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR DACLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR UART7LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR UART8LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR RTCAPBLPEN LL_APB1_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB1LPENR, Periphs); -} - -/** - * @} - */ - -/** @defgroup BUS_LL_EF_APB2 APB2 - * @{ - */ - -/** - * @brief Enable APB2 peripherals clock. - * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR TIM8EN LL_APB2_GRP1_EnableClock\n - * APB2ENR USART1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR USART6EN LL_APB2_GRP1_EnableClock\n - * APB2ENR UART9EN LL_APB2_GRP1_EnableClock\n - * APB2ENR UART10EN LL_APB2_GRP1_EnableClock\n - * APB2ENR ADC1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR ADC2EN LL_APB2_GRP1_EnableClock\n - * APB2ENR ADC3EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SDIOEN LL_APB2_GRP1_EnableClock\n - * APB2ENR SPI1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SPI4EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SYSCFGEN LL_APB2_GRP1_EnableClock\n - * APB2ENR EXTITEN LL_APB2_GRP1_EnableClock\n - * APB2ENR TIM9EN LL_APB2_GRP1_EnableClock\n - * APB2ENR TIM10EN LL_APB2_GRP1_EnableClock\n - * APB2ENR TIM11EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SPI5EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SPI6EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SAI1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SAI2EN LL_APB2_GRP1_EnableClock\n - * APB2ENR LTDCEN LL_APB2_GRP1_EnableClock\n - * APB2ENR DSIEN LL_APB2_GRP1_EnableClock\n - * APB2ENR DFSDM1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR DFSDM2EN LL_APB2_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->APB2ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->APB2ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if APB2 peripheral clock is enabled or not - * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR TIM8EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR USART1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR USART6EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR UART9EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR UART10EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR ADC1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR ADC2EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR ADC3EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SDIOEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SPI1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SPI4EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SYSCFGEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR EXTITEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR TIM9EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR TIM10EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR TIM11EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SPI5EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SPI6EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SAI1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SAI2EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR LTDCEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR DSIEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR DFSDM1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR DFSDM2EN LL_APB2_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_APB2_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->APB2ENR, Periphs) == Periphs); -} - -/** - * @brief Disable APB2 peripherals clock. - * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR TIM8EN LL_APB2_GRP1_DisableClock\n - * APB2ENR USART1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR USART6EN LL_APB2_GRP1_DisableClock\n - * APB2ENR UART9EN LL_APB2_GRP1_DisableClock\n - * APB2ENR UART10EN LL_APB2_GRP1_DisableClock\n - * APB2ENR ADC1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR ADC2EN LL_APB2_GRP1_DisableClock\n - * APB2ENR ADC3EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SDIOEN LL_APB2_GRP1_DisableClock\n - * APB2ENR SPI1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SPI4EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SYSCFGEN LL_APB2_GRP1_DisableClock\n - * APB2ENR EXTITEN LL_APB2_GRP1_DisableClock\n - * APB2ENR TIM9EN LL_APB2_GRP1_DisableClock\n - * APB2ENR TIM10EN LL_APB2_GRP1_DisableClock\n - * APB2ENR TIM11EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SPI5EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SPI6EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SAI1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SAI2EN LL_APB2_GRP1_DisableClock\n - * APB2ENR LTDCEN LL_APB2_GRP1_DisableClock\n - * APB2ENR DSIEN LL_APB2_GRP1_DisableClock\n - * APB2ENR DFSDM1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR DFSDM2EN LL_APB2_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB2ENR, Periphs); -} - -/** - * @brief Force APB2 peripherals reset. - * @rmtoll APB2RSTR TIM1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR TIM8RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR USART1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR USART6RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR UART9RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR UART10RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR ADCRST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SDIORST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SPI1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SPI4RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SYSCFGRST LL_APB2_GRP1_ForceReset\n - * APB2RSTR TIM9RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR TIM10RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR TIM11RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SPI5RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SPI6RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SAI1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SAI2RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR LTDCRST LL_APB2_GRP1_ForceReset\n - * APB2RSTR DSIRST LL_APB2_GRP1_ForceReset\n - * APB2RSTR DFSDM1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR DFSDM2RST LL_APB2_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_ALL - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->APB2RSTR, Periphs); -} - -/** - * @brief Release APB2 peripherals reset. - * @rmtoll APB2RSTR TIM1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR TIM8RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR USART1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR USART6RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR UART9RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR UART10RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR ADCRST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SDIORST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SPI1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SPI4RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SYSCFGRST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR TIM9RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR TIM10RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR TIM11RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SPI5RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SPI6RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SAI1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SAI2RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR LTDCRST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR DSIRST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR DFSDM1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR DFSDM2RST LL_APB2_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_ALL - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB2RSTR, Periphs); -} - -/** - * @brief Enable APB2 peripheral clocks in low-power mode - * @rmtoll APB2LPENR TIM1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR TIM8LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR USART1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR USART6LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR UART9LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR UART10LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR ADC1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR ADC2LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR ADC3LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SDIOLPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SPI1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SPI4LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SYSCFGLPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR EXTITLPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR TIM9LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR TIM10LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR TIM11LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SPI5LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SPI6LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SAI1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SAI2LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR LTDCLPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR DSILPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR DFSDM1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR DSILPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR DFSDM2LPEN LL_APB2_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->APB2LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->APB2LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable APB2 peripheral clocks in low-power mode - * @rmtoll APB2LPENR TIM1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR TIM8LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR USART1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR USART6LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR UART9LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR UART10LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR ADC1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR ADC2LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR ADC3LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SDIOLPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SPI1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SPI4LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SYSCFGLPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR EXTITLPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR TIM9LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR TIM10LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR TIM11LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SPI5LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SPI6LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SAI1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SAI2LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR LTDCLPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR DSILPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR DFSDM1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR DSILPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR DFSDM2LPEN LL_APB2_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB2LPENR, Periphs); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined(RCC) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_BUS_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h deleted file mode 100644 index 9a183ea..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h +++ /dev/null @@ -1,647 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_cortex.h - * @author MCD Application Team - * @brief Header file of CORTEX LL module. - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The LL CORTEX driver contains a set of generic APIs that can be - used by user: - (+) SYSTICK configuration used by LL_mDelay and LL_Init1msTick - functions - (+) Low power mode configuration (SCB register of Cortex-MCU) - (+) MPU API to configure and enable regions - (MPU services provided only on some devices) - (+) API to access to MCU info (CPUID register) - (+) API to enable fault handler (SHCSR accesses) - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_CORTEX_H -#define __STM32F4xx_LL_CORTEX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -/** @defgroup CORTEX_LL CORTEX - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ - -/* Private macros ------------------------------------------------------------*/ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup CORTEX_LL_Exported_Constants CORTEX Exported Constants - * @{ - */ - -/** @defgroup CORTEX_LL_EC_CLKSOURCE_HCLK SYSTICK Clock Source - * @{ - */ -#define LL_SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U /*!< AHB clock divided by 8 selected as SysTick clock source.*/ -#define LL_SYSTICK_CLKSOURCE_HCLK SysTick_CTRL_CLKSOURCE_Msk /*!< AHB clock selected as SysTick clock source. */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_FAULT Handler Fault type - * @{ - */ -#define LL_HANDLER_FAULT_USG SCB_SHCSR_USGFAULTENA_Msk /*!< Usage fault */ -#define LL_HANDLER_FAULT_BUS SCB_SHCSR_BUSFAULTENA_Msk /*!< Bus fault */ -#define LL_HANDLER_FAULT_MEM SCB_SHCSR_MEMFAULTENA_Msk /*!< Memory management fault */ -/** - * @} - */ - -#if __MPU_PRESENT - -/** @defgroup CORTEX_LL_EC_CTRL_HFNMI_PRIVDEF MPU Control - * @{ - */ -#define LL_MPU_CTRL_HFNMI_PRIVDEF_NONE 0x00000000U /*!< Disable NMI and privileged SW access */ -#define LL_MPU_CTRL_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk /*!< Enables the operation of MPU during hard fault, NMI, and FAULTMASK handlers */ -#define LL_MPU_CTRL_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk /*!< Enable privileged software access to default memory map */ -#define LL_MPU_CTRL_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) /*!< Enable NMI and privileged SW access */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_REGION MPU Region Number - * @{ - */ -#define LL_MPU_REGION_NUMBER0 0x00U /*!< REGION Number 0 */ -#define LL_MPU_REGION_NUMBER1 0x01U /*!< REGION Number 1 */ -#define LL_MPU_REGION_NUMBER2 0x02U /*!< REGION Number 2 */ -#define LL_MPU_REGION_NUMBER3 0x03U /*!< REGION Number 3 */ -#define LL_MPU_REGION_NUMBER4 0x04U /*!< REGION Number 4 */ -#define LL_MPU_REGION_NUMBER5 0x05U /*!< REGION Number 5 */ -#define LL_MPU_REGION_NUMBER6 0x06U /*!< REGION Number 6 */ -#define LL_MPU_REGION_NUMBER7 0x07U /*!< REGION Number 7 */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_REGION_SIZE MPU Region Size - * @{ - */ -#define LL_MPU_REGION_SIZE_32B (0x04U << MPU_RASR_SIZE_Pos) /*!< 32B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_64B (0x05U << MPU_RASR_SIZE_Pos) /*!< 64B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_128B (0x06U << MPU_RASR_SIZE_Pos) /*!< 128B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_256B (0x07U << MPU_RASR_SIZE_Pos) /*!< 256B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_512B (0x08U << MPU_RASR_SIZE_Pos) /*!< 512B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_1KB (0x09U << MPU_RASR_SIZE_Pos) /*!< 1KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_2KB (0x0AU << MPU_RASR_SIZE_Pos) /*!< 2KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_4KB (0x0BU << MPU_RASR_SIZE_Pos) /*!< 4KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_8KB (0x0CU << MPU_RASR_SIZE_Pos) /*!< 8KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_16KB (0x0DU << MPU_RASR_SIZE_Pos) /*!< 16KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_32KB (0x0EU << MPU_RASR_SIZE_Pos) /*!< 32KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_64KB (0x0FU << MPU_RASR_SIZE_Pos) /*!< 64KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_128KB (0x10U << MPU_RASR_SIZE_Pos) /*!< 128KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_256KB (0x11U << MPU_RASR_SIZE_Pos) /*!< 256KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_512KB (0x12U << MPU_RASR_SIZE_Pos) /*!< 512KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_1MB (0x13U << MPU_RASR_SIZE_Pos) /*!< 1MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_2MB (0x14U << MPU_RASR_SIZE_Pos) /*!< 2MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_4MB (0x15U << MPU_RASR_SIZE_Pos) /*!< 4MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_8MB (0x16U << MPU_RASR_SIZE_Pos) /*!< 8MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_16MB (0x17U << MPU_RASR_SIZE_Pos) /*!< 16MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_32MB (0x18U << MPU_RASR_SIZE_Pos) /*!< 32MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_64MB (0x19U << MPU_RASR_SIZE_Pos) /*!< 64MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_128MB (0x1AU << MPU_RASR_SIZE_Pos) /*!< 128MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_256MB (0x1BU << MPU_RASR_SIZE_Pos) /*!< 256MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_512MB (0x1CU << MPU_RASR_SIZE_Pos) /*!< 512MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_1GB (0x1DU << MPU_RASR_SIZE_Pos) /*!< 1GB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_2GB (0x1EU << MPU_RASR_SIZE_Pos) /*!< 2GB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_4GB (0x1FU << MPU_RASR_SIZE_Pos) /*!< 4GB Size of the MPU protection region */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_REGION_PRIVILEDGES MPU Region Privileges - * @{ - */ -#define LL_MPU_REGION_NO_ACCESS (0x00U << MPU_RASR_AP_Pos) /*!< No access*/ -#define LL_MPU_REGION_PRIV_RW (0x01U << MPU_RASR_AP_Pos) /*!< RW privileged (privileged access only)*/ -#define LL_MPU_REGION_PRIV_RW_URO (0x02U << MPU_RASR_AP_Pos) /*!< RW privileged - RO user (Write in a user program generates a fault) */ -#define LL_MPU_REGION_FULL_ACCESS (0x03U << MPU_RASR_AP_Pos) /*!< RW privileged & user (Full access) */ -#define LL_MPU_REGION_PRIV_RO (0x05U << MPU_RASR_AP_Pos) /*!< RO privileged (privileged read only)*/ -#define LL_MPU_REGION_PRIV_RO_URO (0x06U << MPU_RASR_AP_Pos) /*!< RO privileged & user (read only) */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_TEX MPU TEX Level - * @{ - */ -#define LL_MPU_TEX_LEVEL0 (0x00U << MPU_RASR_TEX_Pos) /*!< b000 for TEX bits */ -#define LL_MPU_TEX_LEVEL1 (0x01U << MPU_RASR_TEX_Pos) /*!< b001 for TEX bits */ -#define LL_MPU_TEX_LEVEL2 (0x02U << MPU_RASR_TEX_Pos) /*!< b010 for TEX bits */ -#define LL_MPU_TEX_LEVEL4 (0x04U << MPU_RASR_TEX_Pos) /*!< b100 for TEX bits */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_INSTRUCTION_ACCESS MPU Instruction Access - * @{ - */ -#define LL_MPU_INSTRUCTION_ACCESS_ENABLE 0x00U /*!< Instruction fetches enabled */ -#define LL_MPU_INSTRUCTION_ACCESS_DISABLE MPU_RASR_XN_Msk /*!< Instruction fetches disabled*/ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_SHAREABLE_ACCESS MPU Shareable Access - * @{ - */ -#define LL_MPU_ACCESS_SHAREABLE MPU_RASR_S_Msk /*!< Shareable memory attribute */ -#define LL_MPU_ACCESS_NOT_SHAREABLE 0x00U /*!< Not Shareable memory attribute */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_CACHEABLE_ACCESS MPU Cacheable Access - * @{ - */ -#define LL_MPU_ACCESS_CACHEABLE MPU_RASR_C_Msk /*!< Cacheable memory attribute */ -#define LL_MPU_ACCESS_NOT_CACHEABLE 0x00U /*!< Not Cacheable memory attribute */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_BUFFERABLE_ACCESS MPU Bufferable Access - * @{ - */ -#define LL_MPU_ACCESS_BUFFERABLE MPU_RASR_B_Msk /*!< Bufferable memory attribute */ -#define LL_MPU_ACCESS_NOT_BUFFERABLE 0x00U /*!< Not Bufferable memory attribute */ -/** - * @} - */ -#endif /* __MPU_PRESENT */ -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup CORTEX_LL_Exported_Functions CORTEX Exported Functions - * @{ - */ - -/** @defgroup CORTEX_LL_EF_SYSTICK SYSTICK - * @{ - */ - -/** - * @brief This function checks if the Systick counter flag is active or not. - * @note It can be used in timeout function on application side. - * @rmtoll STK_CTRL COUNTFLAG LL_SYSTICK_IsActiveCounterFlag - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SYSTICK_IsActiveCounterFlag(void) -{ - return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk)); -} - -/** - * @brief Configures the SysTick clock source - * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_SetClkSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 - * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK - * @retval None - */ -__STATIC_INLINE void LL_SYSTICK_SetClkSource(uint32_t Source) -{ - if (Source == LL_SYSTICK_CLKSOURCE_HCLK) - { - SET_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); - } - else - { - CLEAR_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); - } -} - -/** - * @brief Get the SysTick clock source - * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_GetClkSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 - * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK - */ -__STATIC_INLINE uint32_t LL_SYSTICK_GetClkSource(void) -{ - return READ_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); -} - -/** - * @brief Enable SysTick exception request - * @rmtoll STK_CTRL TICKINT LL_SYSTICK_EnableIT - * @retval None - */ -__STATIC_INLINE void LL_SYSTICK_EnableIT(void) -{ - SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); -} - -/** - * @brief Disable SysTick exception request - * @rmtoll STK_CTRL TICKINT LL_SYSTICK_DisableIT - * @retval None - */ -__STATIC_INLINE void LL_SYSTICK_DisableIT(void) -{ - CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); -} - -/** - * @brief Checks if the SYSTICK interrupt is enabled or disabled. - * @rmtoll STK_CTRL TICKINT LL_SYSTICK_IsEnabledIT - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SYSTICK_IsEnabledIT(void) -{ - return (READ_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk) == (SysTick_CTRL_TICKINT_Msk)); -} - -/** - * @} - */ - -/** @defgroup CORTEX_LL_EF_LOW_POWER_MODE LOW POWER MODE - * @{ - */ - -/** - * @brief Processor uses sleep as its low power mode - * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableSleep - * @retval None - */ -__STATIC_INLINE void LL_LPM_EnableSleep(void) -{ - /* Clear SLEEPDEEP bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); -} - -/** - * @brief Processor uses deep sleep as its low power mode - * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableDeepSleep - * @retval None - */ -__STATIC_INLINE void LL_LPM_EnableDeepSleep(void) -{ - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); -} - -/** - * @brief Configures sleep-on-exit when returning from Handler mode to Thread mode. - * @note Setting this bit to 1 enables an interrupt-driven application to avoid returning to an - * empty main application. - * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_EnableSleepOnExit - * @retval None - */ -__STATIC_INLINE void LL_LPM_EnableSleepOnExit(void) -{ - /* Set SLEEPONEXIT bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Do not sleep when returning to Thread mode. - * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_DisableSleepOnExit - * @retval None - */ -__STATIC_INLINE void LL_LPM_DisableSleepOnExit(void) -{ - /* Clear SLEEPONEXIT bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Enabled events and all interrupts, including disabled interrupts, can wakeup the - * processor. - * @rmtoll SCB_SCR SEVEONPEND LL_LPM_EnableEventOnPend - * @retval None - */ -__STATIC_INLINE void LL_LPM_EnableEventOnPend(void) -{ - /* Set SEVEONPEND bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @brief Only enabled interrupts or events can wakeup the processor, disabled interrupts are - * excluded - * @rmtoll SCB_SCR SEVEONPEND LL_LPM_DisableEventOnPend - * @retval None - */ -__STATIC_INLINE void LL_LPM_DisableEventOnPend(void) -{ - /* Clear SEVEONPEND bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @brief Clear pending events. - * @retval None - */ -__STATIC_INLINE void LL_LPM_ClearEvent(void) -{ - __SEV(); - __WFE(); -} - -/** - * @} - */ - -/** @defgroup CORTEX_LL_EF_HANDLER HANDLER - * @{ - */ - -/** - * @brief Enable a fault in System handler control register (SHCSR) - * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_EnableFault - * @param Fault This parameter can be a combination of the following values: - * @arg @ref LL_HANDLER_FAULT_USG - * @arg @ref LL_HANDLER_FAULT_BUS - * @arg @ref LL_HANDLER_FAULT_MEM - * @retval None - */ -__STATIC_INLINE void LL_HANDLER_EnableFault(uint32_t Fault) -{ - /* Enable the system handler fault */ - SET_BIT(SCB->SHCSR, Fault); -} - -/** - * @brief Disable a fault in System handler control register (SHCSR) - * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_DisableFault - * @param Fault This parameter can be a combination of the following values: - * @arg @ref LL_HANDLER_FAULT_USG - * @arg @ref LL_HANDLER_FAULT_BUS - * @arg @ref LL_HANDLER_FAULT_MEM - * @retval None - */ -__STATIC_INLINE void LL_HANDLER_DisableFault(uint32_t Fault) -{ - /* Disable the system handler fault */ - CLEAR_BIT(SCB->SHCSR, Fault); -} - -/** - * @} - */ - -/** @defgroup CORTEX_LL_EF_MCU_INFO MCU INFO - * @{ - */ - -/** - * @brief Get Implementer code - * @rmtoll SCB_CPUID IMPLEMENTER LL_CPUID_GetImplementer - * @retval Value should be equal to 0x41 for ARM - */ -__STATIC_INLINE uint32_t LL_CPUID_GetImplementer(void) -{ - return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_IMPLEMENTER_Msk) >> SCB_CPUID_IMPLEMENTER_Pos); -} - -/** - * @brief Get Variant number (The r value in the rnpn product revision identifier) - * @rmtoll SCB_CPUID VARIANT LL_CPUID_GetVariant - * @retval Value between 0 and 255 (0x0: revision 0) - */ -__STATIC_INLINE uint32_t LL_CPUID_GetVariant(void) -{ - return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_VARIANT_Msk) >> SCB_CPUID_VARIANT_Pos); -} - -/** - * @brief Get Constant number - * @rmtoll SCB_CPUID ARCHITECTURE LL_CPUID_GetConstant - * @retval Value should be equal to 0xF for Cortex-M4 devices - */ -__STATIC_INLINE uint32_t LL_CPUID_GetConstant(void) -{ - return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_ARCHITECTURE_Msk) >> SCB_CPUID_ARCHITECTURE_Pos); -} - -/** - * @brief Get Part number - * @rmtoll SCB_CPUID PARTNO LL_CPUID_GetParNo - * @retval Value should be equal to 0xC24 for Cortex-M4 - */ -__STATIC_INLINE uint32_t LL_CPUID_GetParNo(void) -{ - return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_PARTNO_Msk) >> SCB_CPUID_PARTNO_Pos); -} - -/** - * @brief Get Revision number (The p value in the rnpn product revision identifier, indicates patch release) - * @rmtoll SCB_CPUID REVISION LL_CPUID_GetRevision - * @retval Value between 0 and 255 (0x1: patch 1) - */ -__STATIC_INLINE uint32_t LL_CPUID_GetRevision(void) -{ - return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_REVISION_Msk) >> SCB_CPUID_REVISION_Pos); -} - -/** - * @} - */ - -#if __MPU_PRESENT -/** @defgroup CORTEX_LL_EF_MPU MPU - * @{ - */ - -/** - * @brief Enable MPU with input options - * @rmtoll MPU_CTRL ENABLE LL_MPU_Enable - * @param Options This parameter can be one of the following values: - * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF_NONE - * @arg @ref LL_MPU_CTRL_HARDFAULT_NMI - * @arg @ref LL_MPU_CTRL_PRIVILEGED_DEFAULT - * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF - * @retval None - */ -__STATIC_INLINE void LL_MPU_Enable(uint32_t Options) -{ - /* Enable the MPU*/ - WRITE_REG(MPU->CTRL, (MPU_CTRL_ENABLE_Msk | Options)); - /* Ensure MPU settings take effects */ - __DSB(); - /* Sequence instruction fetches using update settings */ - __ISB(); -} - -/** - * @brief Disable MPU - * @rmtoll MPU_CTRL ENABLE LL_MPU_Disable - * @retval None - */ -__STATIC_INLINE void LL_MPU_Disable(void) -{ - /* Make sure outstanding transfers are done */ - __DMB(); - /* Disable MPU*/ - WRITE_REG(MPU->CTRL, 0U); -} - -/** - * @brief Check if MPU is enabled or not - * @rmtoll MPU_CTRL ENABLE LL_MPU_IsEnabled - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_MPU_IsEnabled(void) -{ - return (READ_BIT(MPU->CTRL, MPU_CTRL_ENABLE_Msk) == (MPU_CTRL_ENABLE_Msk)); -} - -/** - * @brief Enable a MPU region - * @rmtoll MPU_RASR ENABLE LL_MPU_EnableRegion - * @param Region This parameter can be one of the following values: - * @arg @ref LL_MPU_REGION_NUMBER0 - * @arg @ref LL_MPU_REGION_NUMBER1 - * @arg @ref LL_MPU_REGION_NUMBER2 - * @arg @ref LL_MPU_REGION_NUMBER3 - * @arg @ref LL_MPU_REGION_NUMBER4 - * @arg @ref LL_MPU_REGION_NUMBER5 - * @arg @ref LL_MPU_REGION_NUMBER6 - * @arg @ref LL_MPU_REGION_NUMBER7 - * @retval None - */ -__STATIC_INLINE void LL_MPU_EnableRegion(uint32_t Region) -{ - /* Set Region number */ - WRITE_REG(MPU->RNR, Region); - /* Enable the MPU region */ - SET_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); -} - -/** - * @brief Configure and enable a region - * @rmtoll MPU_RNR REGION LL_MPU_ConfigRegion\n - * MPU_RBAR REGION LL_MPU_ConfigRegion\n - * MPU_RBAR ADDR LL_MPU_ConfigRegion\n - * MPU_RASR XN LL_MPU_ConfigRegion\n - * MPU_RASR AP LL_MPU_ConfigRegion\n - * MPU_RASR S LL_MPU_ConfigRegion\n - * MPU_RASR C LL_MPU_ConfigRegion\n - * MPU_RASR B LL_MPU_ConfigRegion\n - * MPU_RASR SIZE LL_MPU_ConfigRegion - * @param Region This parameter can be one of the following values: - * @arg @ref LL_MPU_REGION_NUMBER0 - * @arg @ref LL_MPU_REGION_NUMBER1 - * @arg @ref LL_MPU_REGION_NUMBER2 - * @arg @ref LL_MPU_REGION_NUMBER3 - * @arg @ref LL_MPU_REGION_NUMBER4 - * @arg @ref LL_MPU_REGION_NUMBER5 - * @arg @ref LL_MPU_REGION_NUMBER6 - * @arg @ref LL_MPU_REGION_NUMBER7 - * @param Address Value of region base address - * @param SubRegionDisable Sub-region disable value between Min_Data = 0x00 and Max_Data = 0xFF - * @param Attributes This parameter can be a combination of the following values: - * @arg @ref LL_MPU_REGION_SIZE_32B or @ref LL_MPU_REGION_SIZE_64B or @ref LL_MPU_REGION_SIZE_128B or @ref LL_MPU_REGION_SIZE_256B or @ref LL_MPU_REGION_SIZE_512B - * or @ref LL_MPU_REGION_SIZE_1KB or @ref LL_MPU_REGION_SIZE_2KB or @ref LL_MPU_REGION_SIZE_4KB or @ref LL_MPU_REGION_SIZE_8KB or @ref LL_MPU_REGION_SIZE_16KB - * or @ref LL_MPU_REGION_SIZE_32KB or @ref LL_MPU_REGION_SIZE_64KB or @ref LL_MPU_REGION_SIZE_128KB or @ref LL_MPU_REGION_SIZE_256KB or @ref LL_MPU_REGION_SIZE_512KB - * or @ref LL_MPU_REGION_SIZE_1MB or @ref LL_MPU_REGION_SIZE_2MB or @ref LL_MPU_REGION_SIZE_4MB or @ref LL_MPU_REGION_SIZE_8MB or @ref LL_MPU_REGION_SIZE_16MB - * or @ref LL_MPU_REGION_SIZE_32MB or @ref LL_MPU_REGION_SIZE_64MB or @ref LL_MPU_REGION_SIZE_128MB or @ref LL_MPU_REGION_SIZE_256MB or @ref LL_MPU_REGION_SIZE_512MB - * or @ref LL_MPU_REGION_SIZE_1GB or @ref LL_MPU_REGION_SIZE_2GB or @ref LL_MPU_REGION_SIZE_4GB - * @arg @ref LL_MPU_REGION_NO_ACCESS or @ref LL_MPU_REGION_PRIV_RW or @ref LL_MPU_REGION_PRIV_RW_URO or @ref LL_MPU_REGION_FULL_ACCESS - * or @ref LL_MPU_REGION_PRIV_RO or @ref LL_MPU_REGION_PRIV_RO_URO - * @arg @ref LL_MPU_TEX_LEVEL0 or @ref LL_MPU_TEX_LEVEL1 or @ref LL_MPU_TEX_LEVEL2 or @ref LL_MPU_TEX_LEVEL4 - * @arg @ref LL_MPU_INSTRUCTION_ACCESS_ENABLE or @ref LL_MPU_INSTRUCTION_ACCESS_DISABLE - * @arg @ref LL_MPU_ACCESS_SHAREABLE or @ref LL_MPU_ACCESS_NOT_SHAREABLE - * @arg @ref LL_MPU_ACCESS_CACHEABLE or @ref LL_MPU_ACCESS_NOT_CACHEABLE - * @arg @ref LL_MPU_ACCESS_BUFFERABLE or @ref LL_MPU_ACCESS_NOT_BUFFERABLE - * @retval None - */ -__STATIC_INLINE void LL_MPU_ConfigRegion(uint32_t Region, uint32_t SubRegionDisable, uint32_t Address, uint32_t Attributes) -{ - /* Set Region number */ - WRITE_REG(MPU->RNR, Region); - /* Set base address */ - WRITE_REG(MPU->RBAR, (Address & 0xFFFFFFE0U)); - /* Configure MPU */ - WRITE_REG(MPU->RASR, (MPU_RASR_ENABLE_Msk | Attributes | (SubRegionDisable << MPU_RASR_SRD_Pos))); -} - -/** - * @brief Disable a region - * @rmtoll MPU_RNR REGION LL_MPU_DisableRegion\n - * MPU_RASR ENABLE LL_MPU_DisableRegion - * @param Region This parameter can be one of the following values: - * @arg @ref LL_MPU_REGION_NUMBER0 - * @arg @ref LL_MPU_REGION_NUMBER1 - * @arg @ref LL_MPU_REGION_NUMBER2 - * @arg @ref LL_MPU_REGION_NUMBER3 - * @arg @ref LL_MPU_REGION_NUMBER4 - * @arg @ref LL_MPU_REGION_NUMBER5 - * @arg @ref LL_MPU_REGION_NUMBER6 - * @arg @ref LL_MPU_REGION_NUMBER7 - * @retval None - */ -__STATIC_INLINE void LL_MPU_DisableRegion(uint32_t Region) -{ - /* Set Region number */ - WRITE_REG(MPU->RNR, Region); - /* Disable the MPU region */ - CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); -} - -/** - * @} - */ - -#endif /* __MPU_PRESENT */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_CORTEX_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_crc.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_crc.h deleted file mode 100644 index 8ada06d..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_crc.h +++ /dev/null @@ -1,201 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_crc.h - * @author MCD Application Team - * @brief Header file of CRC LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_LL_CRC_H -#define STM32F4xx_LL_CRC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined(CRC) - -/** @defgroup CRC_LL CRC - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup CRC_LL_Exported_Constants CRC Exported Constants - * @{ - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup CRC_LL_Exported_Macros CRC Exported Macros - * @{ - */ - -/** @defgroup CRC_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in CRC register - * @param __INSTANCE__ CRC Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_CRC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, __VALUE__) - -/** - * @brief Read a value in CRC register - * @param __INSTANCE__ CRC Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_CRC_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** - * @} - */ - - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup CRC_LL_Exported_Functions CRC Exported Functions - * @{ - */ - -/** @defgroup CRC_LL_EF_Configuration CRC Configuration functions - * @{ - */ - -/** - * @brief Reset the CRC calculation unit. - * @note If Programmable Initial CRC value feature - * is available, also set the Data Register to the value stored in the - * CRC_INIT register, otherwise, reset Data Register to its default value. - * @rmtoll CR RESET LL_CRC_ResetCRCCalculationUnit - * @param CRCx CRC Instance - * @retval None - */ -__STATIC_INLINE void LL_CRC_ResetCRCCalculationUnit(CRC_TypeDef *CRCx) -{ - SET_BIT(CRCx->CR, CRC_CR_RESET); -} - -/** - * @} - */ - -/** @defgroup CRC_LL_EF_Data_Management Data_Management - * @{ - */ - -/** - * @brief Write given 32-bit data to the CRC calculator - * @rmtoll DR DR LL_CRC_FeedData32 - * @param CRCx CRC Instance - * @param InData value to be provided to CRC calculator between between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_CRC_FeedData32(CRC_TypeDef *CRCx, uint32_t InData) -{ - WRITE_REG(CRCx->DR, InData); -} - -/** - * @brief Return current CRC calculation result. 32 bits value is returned. - * @rmtoll DR DR LL_CRC_ReadData32 - * @param CRCx CRC Instance - * @retval Current CRC calculation result as stored in CRC_DR register (32 bits). - */ -__STATIC_INLINE uint32_t LL_CRC_ReadData32(const CRC_TypeDef *CRCx) -{ - return (uint32_t)(READ_REG(CRCx->DR)); -} - -/** - * @brief Return data stored in the Independent Data(IDR) register. - * @note This register can be used as a temporary storage location for one byte. - * @rmtoll IDR IDR LL_CRC_Read_IDR - * @param CRCx CRC Instance - * @retval Value stored in CRC_IDR register (General-purpose 8-bit data register). - */ -__STATIC_INLINE uint32_t LL_CRC_Read_IDR(CRC_TypeDef *CRCx) -{ - return (uint32_t)(READ_REG(CRCx->IDR)); -} - -/** - * @brief Store data in the Independent Data(IDR) register. - * @note This register can be used as a temporary storage location for one byte. - * @rmtoll IDR IDR LL_CRC_Write_IDR - * @param CRCx CRC Instance - * @param InData value to be stored in CRC_IDR register (8-bit) between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_CRC_Write_IDR(CRC_TypeDef *CRCx, uint32_t InData) -{ - *((uint8_t __IO *)(&CRCx->IDR)) = (uint8_t) InData; -} -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup CRC_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -ErrorStatus LL_CRC_DeInit(const CRC_TypeDef *CRCx); - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined(CRC) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_LL_CRC_H */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h deleted file mode 100644 index c0182de..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h +++ /dev/null @@ -1,2868 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_dma.h - * @author MCD Application Team - * @brief Header file of DMA LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_DMA_H -#define __STM32F4xx_LL_DMA_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (DMA1) || defined (DMA2) - -/** @defgroup DMA_LL DMA - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup DMA_LL_Private_Variables DMA Private Variables - * @{ - */ -/* Array used to get the DMA stream register offset versus stream index LL_DMA_STREAM_x */ -static const uint8_t STREAM_OFFSET_TAB[] = -{ - (uint8_t)(DMA1_Stream0_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream1_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream2_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream3_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream4_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream5_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream6_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream7_BASE - DMA1_BASE) -}; - -/** - * @} - */ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup DMA_LL_Private_Constants DMA Private Constants - * @{ - */ -/** - * @} - */ - - -/* Private macros ------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup DMA_LL_ES_INIT DMA Exported Init structure - * @{ - */ -typedef struct -{ - uint32_t PeriphOrM2MSrcAddress; /*!< Specifies the peripheral base address for DMA transfer - or as Source base address in case of memory to memory transfer direction. - - This parameter must be a value between Min_Data = 0 and Max_Data = 0xFFFFFFFF. */ - - uint32_t MemoryOrM2MDstAddress; /*!< Specifies the memory base address for DMA transfer - or as Destination base address in case of memory to memory transfer direction. - - This parameter must be a value between Min_Data = 0 and Max_Data = 0xFFFFFFFF. */ - - uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, - from memory to memory or from peripheral to memory. - This parameter can be a value of @ref DMA_LL_EC_DIRECTION - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetDataTransferDirection(). */ - - uint32_t Mode; /*!< Specifies the normal or circular operation mode. - This parameter can be a value of @ref DMA_LL_EC_MODE - @note The circular buffer mode cannot be used if the memory to memory - data transfer direction is configured on the selected Stream - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetMode(). */ - - uint32_t PeriphOrM2MSrcIncMode; /*!< Specifies whether the Peripheral address or Source address in case of memory to memory transfer direction - is incremented or not. - This parameter can be a value of @ref DMA_LL_EC_PERIPH - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphIncMode(). */ - - uint32_t MemoryOrM2MDstIncMode; /*!< Specifies whether the Memory address or Destination address in case of memory to memory transfer direction - is incremented or not. - This parameter can be a value of @ref DMA_LL_EC_MEMORY - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemoryIncMode(). */ - - uint32_t PeriphOrM2MSrcDataSize; /*!< Specifies the Peripheral data size alignment or Source data size alignment (byte, half word, word) - in case of memory to memory transfer direction. - This parameter can be a value of @ref DMA_LL_EC_PDATAALIGN - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphSize(). */ - - uint32_t MemoryOrM2MDstDataSize; /*!< Specifies the Memory data size alignment or Destination data size alignment (byte, half word, word) - in case of memory to memory transfer direction. - This parameter can be a value of @ref DMA_LL_EC_MDATAALIGN - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemorySize(). */ - - uint32_t NbData; /*!< Specifies the number of data to transfer, in data unit. - The data unit is equal to the source buffer configuration set in PeripheralSize - or MemorySize parameters depending in the transfer direction. - This parameter must be a value between Min_Data = 0 and Max_Data = 0x0000FFFF - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetDataLength(). */ - - uint32_t Channel; /*!< Specifies the peripheral channel. - This parameter can be a value of @ref DMA_LL_EC_CHANNEL - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetChannelSelection(). */ - - uint32_t Priority; /*!< Specifies the channel priority level. - This parameter can be a value of @ref DMA_LL_EC_PRIORITY - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetStreamPriorityLevel(). */ - - uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. - This parameter can be a value of @ref DMA_LL_FIFOMODE - @note The Direct mode (FIFO mode disabled) cannot be used if the - memory-to-memory data transfer is configured on the selected stream - - This feature can be modified afterwards using unitary functions @ref LL_DMA_EnableFifoMode() or @ref LL_DMA_EnableFifoMode() . */ - - uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. - This parameter can be a value of @ref DMA_LL_EC_FIFOTHRESHOLD - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetFIFOThreshold(). */ - - uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_LL_EC_MBURST - @note The burst mode is possible only if the address Increment mode is enabled. - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemoryBurstxfer(). */ - - uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_LL_EC_PBURST - @note The burst mode is possible only if the address Increment mode is enabled. - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphBurstxfer(). */ - -} LL_DMA_InitTypeDef; -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup DMA_LL_Exported_Constants DMA Exported Constants - * @{ - */ - -/** @defgroup DMA_LL_EC_STREAM STREAM - * @{ - */ -#define LL_DMA_STREAM_0 0x00000000U -#define LL_DMA_STREAM_1 0x00000001U -#define LL_DMA_STREAM_2 0x00000002U -#define LL_DMA_STREAM_3 0x00000003U -#define LL_DMA_STREAM_4 0x00000004U -#define LL_DMA_STREAM_5 0x00000005U -#define LL_DMA_STREAM_6 0x00000006U -#define LL_DMA_STREAM_7 0x00000007U -#define LL_DMA_STREAM_ALL 0xFFFF0000U -/** - * @} - */ - -/** @defgroup DMA_LL_EC_DIRECTION DIRECTION - * @{ - */ -#define LL_DMA_DIRECTION_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ -#define LL_DMA_DIRECTION_MEMORY_TO_PERIPH DMA_SxCR_DIR_0 /*!< Memory to peripheral direction */ -#define LL_DMA_DIRECTION_MEMORY_TO_MEMORY DMA_SxCR_DIR_1 /*!< Memory to memory direction */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_MODE MODE - * @{ - */ -#define LL_DMA_MODE_NORMAL 0x00000000U /*!< Normal Mode */ -#define LL_DMA_MODE_CIRCULAR DMA_SxCR_CIRC /*!< Circular Mode */ -#define LL_DMA_MODE_PFCTRL DMA_SxCR_PFCTRL /*!< Peripheral flow control mode */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_DOUBLEBUFFER_MODE DOUBLEBUFFER MODE - * @{ - */ -#define LL_DMA_DOUBLEBUFFER_MODE_DISABLE 0x00000000U /*!< Disable double buffering mode */ -#define LL_DMA_DOUBLEBUFFER_MODE_ENABLE DMA_SxCR_DBM /*!< Enable double buffering mode */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_PERIPH PERIPH - * @{ - */ -#define LL_DMA_PERIPH_NOINCREMENT 0x00000000U /*!< Peripheral increment mode Disable */ -#define LL_DMA_PERIPH_INCREMENT DMA_SxCR_PINC /*!< Peripheral increment mode Enable */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_MEMORY MEMORY - * @{ - */ -#define LL_DMA_MEMORY_NOINCREMENT 0x00000000U /*!< Memory increment mode Disable */ -#define LL_DMA_MEMORY_INCREMENT DMA_SxCR_MINC /*!< Memory increment mode Enable */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_PDATAALIGN PDATAALIGN - * @{ - */ -#define LL_DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment : Byte */ -#define LL_DMA_PDATAALIGN_HALFWORD DMA_SxCR_PSIZE_0 /*!< Peripheral data alignment : HalfWord */ -#define LL_DMA_PDATAALIGN_WORD DMA_SxCR_PSIZE_1 /*!< Peripheral data alignment : Word */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_MDATAALIGN MDATAALIGN - * @{ - */ -#define LL_DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment : Byte */ -#define LL_DMA_MDATAALIGN_HALFWORD DMA_SxCR_MSIZE_0 /*!< Memory data alignment : HalfWord */ -#define LL_DMA_MDATAALIGN_WORD DMA_SxCR_MSIZE_1 /*!< Memory data alignment : Word */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_OFFSETSIZE OFFSETSIZE - * @{ - */ -#define LL_DMA_OFFSETSIZE_PSIZE 0x00000000U /*!< Peripheral increment offset size is linked to the PSIZE */ -#define LL_DMA_OFFSETSIZE_FIXEDTO4 DMA_SxCR_PINCOS /*!< Peripheral increment offset size is fixed to 4 (32-bit alignment) */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_PRIORITY PRIORITY - * @{ - */ -#define LL_DMA_PRIORITY_LOW 0x00000000U /*!< Priority level : Low */ -#define LL_DMA_PRIORITY_MEDIUM DMA_SxCR_PL_0 /*!< Priority level : Medium */ -#define LL_DMA_PRIORITY_HIGH DMA_SxCR_PL_1 /*!< Priority level : High */ -#define LL_DMA_PRIORITY_VERYHIGH DMA_SxCR_PL /*!< Priority level : Very_High */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_CHANNEL CHANNEL - * @{ - */ -#define LL_DMA_CHANNEL_0 0x00000000U /* Select Channel0 of DMA Instance */ -#define LL_DMA_CHANNEL_1 DMA_SxCR_CHSEL_0 /* Select Channel1 of DMA Instance */ -#define LL_DMA_CHANNEL_2 DMA_SxCR_CHSEL_1 /* Select Channel2 of DMA Instance */ -#define LL_DMA_CHANNEL_3 (DMA_SxCR_CHSEL_0 | DMA_SxCR_CHSEL_1) /* Select Channel3 of DMA Instance */ -#define LL_DMA_CHANNEL_4 DMA_SxCR_CHSEL_2 /* Select Channel4 of DMA Instance */ -#define LL_DMA_CHANNEL_5 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_0) /* Select Channel5 of DMA Instance */ -#define LL_DMA_CHANNEL_6 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1) /* Select Channel6 of DMA Instance */ -#define LL_DMA_CHANNEL_7 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0) /* Select Channel7 of DMA Instance */ -#if defined (DMA_SxCR_CHSEL_3) -#define LL_DMA_CHANNEL_8 DMA_SxCR_CHSEL_3 /* Select Channel8 of DMA Instance */ -#define LL_DMA_CHANNEL_9 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_0) /* Select Channel9 of DMA Instance */ -#define LL_DMA_CHANNEL_10 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_1) /* Select Channel10 of DMA Instance */ -#define LL_DMA_CHANNEL_11 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0) /* Select Channel11 of DMA Instance */ -#define LL_DMA_CHANNEL_12 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2) /* Select Channel12 of DMA Instance */ -#define LL_DMA_CHANNEL_13 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_0) /* Select Channel13 of DMA Instance */ -#define LL_DMA_CHANNEL_14 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1) /* Select Channel14 of DMA Instance */ -#define LL_DMA_CHANNEL_15 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0) /* Select Channel15 of DMA Instance */ -#endif /* DMA_SxCR_CHSEL_3 */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_MBURST MBURST - * @{ - */ -#define LL_DMA_MBURST_SINGLE 0x00000000U /*!< Memory burst single transfer configuration */ -#define LL_DMA_MBURST_INC4 DMA_SxCR_MBURST_0 /*!< Memory burst of 4 beats transfer configuration */ -#define LL_DMA_MBURST_INC8 DMA_SxCR_MBURST_1 /*!< Memory burst of 8 beats transfer configuration */ -#define LL_DMA_MBURST_INC16 (DMA_SxCR_MBURST_0 | DMA_SxCR_MBURST_1) /*!< Memory burst of 16 beats transfer configuration */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_PBURST PBURST - * @{ - */ -#define LL_DMA_PBURST_SINGLE 0x00000000U /*!< Peripheral burst single transfer configuration */ -#define LL_DMA_PBURST_INC4 DMA_SxCR_PBURST_0 /*!< Peripheral burst of 4 beats transfer configuration */ -#define LL_DMA_PBURST_INC8 DMA_SxCR_PBURST_1 /*!< Peripheral burst of 8 beats transfer configuration */ -#define LL_DMA_PBURST_INC16 (DMA_SxCR_PBURST_0 | DMA_SxCR_PBURST_1) /*!< Peripheral burst of 16 beats transfer configuration */ -/** - * @} - */ - -/** @defgroup DMA_LL_FIFOMODE DMA_LL_FIFOMODE - * @{ - */ -#define LL_DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable (direct mode is enabled) */ -#define LL_DMA_FIFOMODE_ENABLE DMA_SxFCR_DMDIS /*!< FIFO mode enable */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_FIFOSTATUS_0 FIFOSTATUS 0 - * @{ - */ -#define LL_DMA_FIFOSTATUS_0_25 0x00000000U /*!< 0 < fifo_level < 1/4 */ -#define LL_DMA_FIFOSTATUS_25_50 DMA_SxFCR_FS_0 /*!< 1/4 < fifo_level < 1/2 */ -#define LL_DMA_FIFOSTATUS_50_75 DMA_SxFCR_FS_1 /*!< 1/2 < fifo_level < 3/4 */ -#define LL_DMA_FIFOSTATUS_75_100 (DMA_SxFCR_FS_1 | DMA_SxFCR_FS_0) /*!< 3/4 < fifo_level < full */ -#define LL_DMA_FIFOSTATUS_EMPTY DMA_SxFCR_FS_2 /*!< FIFO is empty */ -#define LL_DMA_FIFOSTATUS_FULL (DMA_SxFCR_FS_2 | DMA_SxFCR_FS_0) /*!< FIFO is full */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_FIFOTHRESHOLD FIFOTHRESHOLD - * @{ - */ -#define LL_DMA_FIFOTHRESHOLD_1_4 0x00000000U /*!< FIFO threshold 1 quart full configuration */ -#define LL_DMA_FIFOTHRESHOLD_1_2 DMA_SxFCR_FTH_0 /*!< FIFO threshold half full configuration */ -#define LL_DMA_FIFOTHRESHOLD_3_4 DMA_SxFCR_FTH_1 /*!< FIFO threshold 3 quarts full configuration */ -#define LL_DMA_FIFOTHRESHOLD_FULL DMA_SxFCR_FTH /*!< FIFO threshold full configuration */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_CURRENTTARGETMEM CURRENTTARGETMEM - * @{ - */ -#define LL_DMA_CURRENTTARGETMEM0 0x00000000U /*!< Set CurrentTarget Memory to Memory 0 */ -#define LL_DMA_CURRENTTARGETMEM1 DMA_SxCR_CT /*!< Set CurrentTarget Memory to Memory 1 */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup DMA_LL_Exported_Macros DMA Exported Macros - * @{ - */ - -/** @defgroup DMA_LL_EM_WRITE_READ Common Write and read registers macros - * @{ - */ -/** - * @brief Write a value in DMA register - * @param __INSTANCE__ DMA Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_DMA_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in DMA register - * @param __INSTANCE__ DMA Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_DMA_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** @defgroup DMA_LL_EM_CONVERT_DMAxCHANNELy Convert DMAxStreamy - * @{ - */ -/** - * @brief Convert DMAx_Streamy into DMAx - * @param __STREAM_INSTANCE__ DMAx_Streamy - * @retval DMAx - */ -#define __LL_DMA_GET_INSTANCE(__STREAM_INSTANCE__) \ -(((uint32_t)(__STREAM_INSTANCE__) > ((uint32_t)DMA1_Stream7)) ? DMA2 : DMA1) - -/** - * @brief Convert DMAx_Streamy into LL_DMA_STREAM_y - * @param __STREAM_INSTANCE__ DMAx_Streamy - * @retval LL_DMA_CHANNEL_y - */ -#define __LL_DMA_GET_STREAM(__STREAM_INSTANCE__) \ -(((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream0)) ? LL_DMA_STREAM_0 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream0)) ? LL_DMA_STREAM_0 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream1)) ? LL_DMA_STREAM_1 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream1)) ? LL_DMA_STREAM_1 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream2)) ? LL_DMA_STREAM_2 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream2)) ? LL_DMA_STREAM_2 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream3)) ? LL_DMA_STREAM_3 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream3)) ? LL_DMA_STREAM_3 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream4)) ? LL_DMA_STREAM_4 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream4)) ? LL_DMA_STREAM_4 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream5)) ? LL_DMA_STREAM_5 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream5)) ? LL_DMA_STREAM_5 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream6)) ? LL_DMA_STREAM_6 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream6)) ? LL_DMA_STREAM_6 : \ - LL_DMA_STREAM_7) - -/** - * @brief Convert DMA Instance DMAx and LL_DMA_STREAM_y into DMAx_Streamy - * @param __DMA_INSTANCE__ DMAx - * @param __STREAM__ LL_DMA_STREAM_y - * @retval DMAx_Streamy - */ -#define __LL_DMA_GET_STREAM_INSTANCE(__DMA_INSTANCE__, __STREAM__) \ -((((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_0))) ? DMA1_Stream0 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_0))) ? DMA2_Stream0 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_1))) ? DMA1_Stream1 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_1))) ? DMA2_Stream1 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_2))) ? DMA1_Stream2 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_2))) ? DMA2_Stream2 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_3))) ? DMA1_Stream3 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_3))) ? DMA2_Stream3 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_4))) ? DMA1_Stream4 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_4))) ? DMA2_Stream4 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_5))) ? DMA1_Stream5 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_5))) ? DMA2_Stream5 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_6))) ? DMA1_Stream6 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_6))) ? DMA2_Stream6 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_7))) ? DMA1_Stream7 : \ - DMA2_Stream7) - -/** - * @} - */ - -/** - * @} - */ - - -/* Exported functions --------------------------------------------------------*/ - /** @defgroup DMA_LL_Exported_Functions DMA Exported Functions - * @{ - */ - -/** @defgroup DMA_LL_EF_Configuration Configuration - * @{ - */ -/** - * @brief Enable DMA stream. - * @rmtoll CR EN LL_DMA_EnableStream - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableStream(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN); -} - -/** - * @brief Disable DMA stream. - * @rmtoll CR EN LL_DMA_DisableStream - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableStream(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN); -} - -/** - * @brief Check if DMA stream is enabled or disabled. - * @rmtoll CR EN LL_DMA_IsEnabledStream - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledStream(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN) == (DMA_SxCR_EN)); -} - -/** - * @brief Configure all parameters linked to DMA transfer. - * @rmtoll CR DIR LL_DMA_ConfigTransfer\n - * CR CIRC LL_DMA_ConfigTransfer\n - * CR PINC LL_DMA_ConfigTransfer\n - * CR MINC LL_DMA_ConfigTransfer\n - * CR PSIZE LL_DMA_ConfigTransfer\n - * CR MSIZE LL_DMA_ConfigTransfer\n - * CR PL LL_DMA_ConfigTransfer\n - * CR PFCTRL LL_DMA_ConfigTransfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Configuration This parameter must be a combination of all the following values: - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY or @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH or @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - * @arg @ref LL_DMA_MODE_NORMAL or @ref LL_DMA_MODE_CIRCULAR or @ref LL_DMA_MODE_PFCTRL - * @arg @ref LL_DMA_PERIPH_INCREMENT or @ref LL_DMA_PERIPH_NOINCREMENT - * @arg @ref LL_DMA_MEMORY_INCREMENT or @ref LL_DMA_MEMORY_NOINCREMENT - * @arg @ref LL_DMA_PDATAALIGN_BYTE or @ref LL_DMA_PDATAALIGN_HALFWORD or @ref LL_DMA_PDATAALIGN_WORD - * @arg @ref LL_DMA_MDATAALIGN_BYTE or @ref LL_DMA_MDATAALIGN_HALFWORD or @ref LL_DMA_MDATAALIGN_WORD - * @arg @ref LL_DMA_PRIORITY_LOW or @ref LL_DMA_PRIORITY_MEDIUM or @ref LL_DMA_PRIORITY_HIGH or @ref LL_DMA_PRIORITY_VERYHIGH - *@retval None - */ -__STATIC_INLINE void LL_DMA_ConfigTransfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Configuration) -{ - MODIFY_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, - DMA_SxCR_DIR | DMA_SxCR_CIRC | DMA_SxCR_PINC | DMA_SxCR_MINC | DMA_SxCR_PSIZE | DMA_SxCR_MSIZE | DMA_SxCR_PL | DMA_SxCR_PFCTRL, - Configuration); -} - -/** - * @brief Set Data transfer direction (read from peripheral or from memory). - * @rmtoll CR DIR LL_DMA_SetDataTransferDirection - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Direction This parameter can be one of the following values: - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetDataTransferDirection(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Direction) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DIR, Direction); -} - -/** - * @brief Get Data transfer direction (read from peripheral or from memory). - * @rmtoll CR DIR LL_DMA_GetDataTransferDirection - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - */ -__STATIC_INLINE uint32_t LL_DMA_GetDataTransferDirection(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DIR)); -} - -/** - * @brief Set DMA mode normal, circular or peripheral flow control. - * @rmtoll CR CIRC LL_DMA_SetMode\n - * CR PFCTRL LL_DMA_SetMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_DMA_MODE_NORMAL - * @arg @ref LL_DMA_MODE_CIRCULAR - * @arg @ref LL_DMA_MODE_PFCTRL - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Mode) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CIRC | DMA_SxCR_PFCTRL, Mode); -} - -/** - * @brief Get DMA mode normal, circular or peripheral flow control. - * @rmtoll CR CIRC LL_DMA_GetMode\n - * CR PFCTRL LL_DMA_GetMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_MODE_NORMAL - * @arg @ref LL_DMA_MODE_CIRCULAR - * @arg @ref LL_DMA_MODE_PFCTRL - */ -__STATIC_INLINE uint32_t LL_DMA_GetMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CIRC | DMA_SxCR_PFCTRL)); -} - -/** - * @brief Set Peripheral increment mode. - * @rmtoll CR PINC LL_DMA_SetPeriphIncMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param IncrementMode This parameter can be one of the following values: - * @arg @ref LL_DMA_PERIPH_NOINCREMENT - * @arg @ref LL_DMA_PERIPH_INCREMENT - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t IncrementMode) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINC, IncrementMode); -} - -/** - * @brief Get Peripheral increment mode. - * @rmtoll CR PINC LL_DMA_GetPeriphIncMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PERIPH_NOINCREMENT - * @arg @ref LL_DMA_PERIPH_INCREMENT - */ -__STATIC_INLINE uint32_t LL_DMA_GetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINC)); -} - -/** - * @brief Set Memory increment mode. - * @rmtoll CR MINC LL_DMA_SetMemoryIncMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param IncrementMode This parameter can be one of the following values: - * @arg @ref LL_DMA_MEMORY_NOINCREMENT - * @arg @ref LL_DMA_MEMORY_INCREMENT - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t IncrementMode) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MINC, IncrementMode); -} - -/** - * @brief Get Memory increment mode. - * @rmtoll CR MINC LL_DMA_GetMemoryIncMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_MEMORY_NOINCREMENT - * @arg @ref LL_DMA_MEMORY_INCREMENT - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MINC)); -} - -/** - * @brief Set Peripheral size. - * @rmtoll CR PSIZE LL_DMA_SetPeriphSize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Size This parameter can be one of the following values: - * @arg @ref LL_DMA_PDATAALIGN_BYTE - * @arg @ref LL_DMA_PDATAALIGN_HALFWORD - * @arg @ref LL_DMA_PDATAALIGN_WORD - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetPeriphSize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Size) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PSIZE, Size); -} - -/** - * @brief Get Peripheral size. - * @rmtoll CR PSIZE LL_DMA_GetPeriphSize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PDATAALIGN_BYTE - * @arg @ref LL_DMA_PDATAALIGN_HALFWORD - * @arg @ref LL_DMA_PDATAALIGN_WORD - */ -__STATIC_INLINE uint32_t LL_DMA_GetPeriphSize(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PSIZE)); -} - -/** - * @brief Set Memory size. - * @rmtoll CR MSIZE LL_DMA_SetMemorySize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Size This parameter can be one of the following values: - * @arg @ref LL_DMA_MDATAALIGN_BYTE - * @arg @ref LL_DMA_MDATAALIGN_HALFWORD - * @arg @ref LL_DMA_MDATAALIGN_WORD - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemorySize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Size) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MSIZE, Size); -} - -/** - * @brief Get Memory size. - * @rmtoll CR MSIZE LL_DMA_GetMemorySize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_MDATAALIGN_BYTE - * @arg @ref LL_DMA_MDATAALIGN_HALFWORD - * @arg @ref LL_DMA_MDATAALIGN_WORD - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemorySize(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MSIZE)); -} - -/** - * @brief Set Peripheral increment offset size. - * @rmtoll CR PINCOS LL_DMA_SetIncOffsetSize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param OffsetSize This parameter can be one of the following values: - * @arg @ref LL_DMA_OFFSETSIZE_PSIZE - * @arg @ref LL_DMA_OFFSETSIZE_FIXEDTO4 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetIncOffsetSize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t OffsetSize) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINCOS, OffsetSize); -} - -/** - * @brief Get Peripheral increment offset size. - * @rmtoll CR PINCOS LL_DMA_GetIncOffsetSize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_OFFSETSIZE_PSIZE - * @arg @ref LL_DMA_OFFSETSIZE_FIXEDTO4 - */ -__STATIC_INLINE uint32_t LL_DMA_GetIncOffsetSize(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINCOS)); -} - -/** - * @brief Set Stream priority level. - * @rmtoll CR PL LL_DMA_SetStreamPriorityLevel - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Priority This parameter can be one of the following values: - * @arg @ref LL_DMA_PRIORITY_LOW - * @arg @ref LL_DMA_PRIORITY_MEDIUM - * @arg @ref LL_DMA_PRIORITY_HIGH - * @arg @ref LL_DMA_PRIORITY_VERYHIGH - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetStreamPriorityLevel(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Priority) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PL, Priority); -} - -/** - * @brief Get Stream priority level. - * @rmtoll CR PL LL_DMA_GetStreamPriorityLevel - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PRIORITY_LOW - * @arg @ref LL_DMA_PRIORITY_MEDIUM - * @arg @ref LL_DMA_PRIORITY_HIGH - * @arg @ref LL_DMA_PRIORITY_VERYHIGH - */ -__STATIC_INLINE uint32_t LL_DMA_GetStreamPriorityLevel(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PL)); -} - -/** - * @brief Set Number of data to transfer. - * @rmtoll NDTR NDT LL_DMA_SetDataLength - * @note This action has no effect if - * stream is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param NbData Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetDataLength(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t NbData) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->NDTR, DMA_SxNDT, NbData); -} - -/** - * @brief Get Number of data to transfer. - * @rmtoll NDTR NDT LL_DMA_GetDataLength - * @note Once the stream is enabled, the return value indicate the - * remaining bytes to be transmitted. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetDataLength(DMA_TypeDef* DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->NDTR, DMA_SxNDT)); -} - -/** - * @brief Select Channel number associated to the Stream. - * @rmtoll CR CHSEL LL_DMA_SetChannelSelection - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetChannelSelection(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Channel) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CHSEL, Channel); -} - -/** - * @brief Get the Channel number associated to the Stream. - * @rmtoll CR CHSEL LL_DMA_GetChannelSelection - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @arg @ref LL_DMA_CHANNEL_1 - * @arg @ref LL_DMA_CHANNEL_2 - * @arg @ref LL_DMA_CHANNEL_3 - * @arg @ref LL_DMA_CHANNEL_4 - * @arg @ref LL_DMA_CHANNEL_5 - * @arg @ref LL_DMA_CHANNEL_6 - * @arg @ref LL_DMA_CHANNEL_7 - */ -__STATIC_INLINE uint32_t LL_DMA_GetChannelSelection(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CHSEL)); -} - -/** - * @brief Set Memory burst transfer configuration. - * @rmtoll CR MBURST LL_DMA_SetMemoryBurstxfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Mburst This parameter can be one of the following values: - * @arg @ref LL_DMA_MBURST_SINGLE - * @arg @ref LL_DMA_MBURST_INC4 - * @arg @ref LL_DMA_MBURST_INC8 - * @arg @ref LL_DMA_MBURST_INC16 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemoryBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Mburst) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MBURST, Mburst); -} - -/** - * @brief Get Memory burst transfer configuration. - * @rmtoll CR MBURST LL_DMA_GetMemoryBurstxfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_MBURST_SINGLE - * @arg @ref LL_DMA_MBURST_INC4 - * @arg @ref LL_DMA_MBURST_INC8 - * @arg @ref LL_DMA_MBURST_INC16 - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemoryBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MBURST)); -} - -/** - * @brief Set Peripheral burst transfer configuration. - * @rmtoll CR PBURST LL_DMA_SetPeriphBurstxfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Pburst This parameter can be one of the following values: - * @arg @ref LL_DMA_PBURST_SINGLE - * @arg @ref LL_DMA_PBURST_INC4 - * @arg @ref LL_DMA_PBURST_INC8 - * @arg @ref LL_DMA_PBURST_INC16 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetPeriphBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Pburst) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PBURST, Pburst); -} - -/** - * @brief Get Peripheral burst transfer configuration. - * @rmtoll CR PBURST LL_DMA_GetPeriphBurstxfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PBURST_SINGLE - * @arg @ref LL_DMA_PBURST_INC4 - * @arg @ref LL_DMA_PBURST_INC8 - * @arg @ref LL_DMA_PBURST_INC16 - */ -__STATIC_INLINE uint32_t LL_DMA_GetPeriphBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PBURST)); -} - -/** - * @brief Set Current target (only in double buffer mode) to Memory 1 or Memory 0. - * @rmtoll CR CT LL_DMA_SetCurrentTargetMem - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param CurrentMemory This parameter can be one of the following values: - * @arg @ref LL_DMA_CURRENTTARGETMEM0 - * @arg @ref LL_DMA_CURRENTTARGETMEM1 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetCurrentTargetMem(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t CurrentMemory) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CT, CurrentMemory); -} - -/** - * @brief Get Current target (only in double buffer mode). - * @rmtoll CR CT LL_DMA_GetCurrentTargetMem - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_CURRENTTARGETMEM0 - * @arg @ref LL_DMA_CURRENTTARGETMEM1 - */ -__STATIC_INLINE uint32_t LL_DMA_GetCurrentTargetMem(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CT)); -} - -/** - * @brief Enable the double buffer mode. - * @rmtoll CR DBM LL_DMA_EnableDoubleBufferMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableDoubleBufferMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DBM); -} - -/** - * @brief Disable the double buffer mode. - * @rmtoll CR DBM LL_DMA_DisableDoubleBufferMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableDoubleBufferMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DBM); -} - -/** - * @brief Get FIFO status. - * @rmtoll FCR FS LL_DMA_GetFIFOStatus - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_FIFOSTATUS_0_25 - * @arg @ref LL_DMA_FIFOSTATUS_25_50 - * @arg @ref LL_DMA_FIFOSTATUS_50_75 - * @arg @ref LL_DMA_FIFOSTATUS_75_100 - * @arg @ref LL_DMA_FIFOSTATUS_EMPTY - * @arg @ref LL_DMA_FIFOSTATUS_FULL - */ -__STATIC_INLINE uint32_t LL_DMA_GetFIFOStatus(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FS)); -} - -/** - * @brief Disable Fifo mode. - * @rmtoll FCR DMDIS LL_DMA_DisableFifoMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableFifoMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_DMDIS); -} - -/** - * @brief Enable Fifo mode. - * @rmtoll FCR DMDIS LL_DMA_EnableFifoMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableFifoMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_DMDIS); -} - -/** - * @brief Select FIFO threshold. - * @rmtoll FCR FTH LL_DMA_SetFIFOThreshold - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Threshold This parameter can be one of the following values: - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 - * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetFIFOThreshold(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Threshold) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH, Threshold); -} - -/** - * @brief Get FIFO threshold. - * @rmtoll FCR FTH LL_DMA_GetFIFOThreshold - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 - * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL - */ -__STATIC_INLINE uint32_t LL_DMA_GetFIFOThreshold(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH)); -} - -/** - * @brief Configure the FIFO . - * @rmtoll FCR FTH LL_DMA_ConfigFifo\n - * FCR DMDIS LL_DMA_ConfigFifo - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param FifoMode This parameter can be one of the following values: - * @arg @ref LL_DMA_FIFOMODE_ENABLE - * @arg @ref LL_DMA_FIFOMODE_DISABLE - * @param FifoThreshold This parameter can be one of the following values: - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 - * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL - * @retval None - */ -__STATIC_INLINE void LL_DMA_ConfigFifo(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t FifoMode, uint32_t FifoThreshold) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH|DMA_SxFCR_DMDIS, FifoMode|FifoThreshold); -} - -/** - * @brief Configure the Source and Destination addresses. - * @note This API must not be called when the DMA stream is enabled. - * @rmtoll M0AR M0A LL_DMA_ConfigAddresses\n - * PAR PA LL_DMA_ConfigAddresses - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param SrcAddress Between 0 to 0xFFFFFFFF - * @param DstAddress Between 0 to 0xFFFFFFFF - * @param Direction This parameter can be one of the following values: - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - * @retval None - */ -__STATIC_INLINE void LL_DMA_ConfigAddresses(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t SrcAddress, uint32_t DstAddress, uint32_t Direction) -{ - /* Direction Memory to Periph */ - if (Direction == LL_DMA_DIRECTION_MEMORY_TO_PERIPH) - { - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, SrcAddress); - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, DstAddress); - } - /* Direction Periph to Memory and Memory to Memory */ - else - { - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, SrcAddress); - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, DstAddress); - } -} - -/** - * @brief Set the Memory address. - * @rmtoll M0AR M0A LL_DMA_SetMemoryAddress - * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. - * @note This API must not be called when the DMA channel is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param MemoryAddress Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) -{ - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, MemoryAddress); -} - -/** - * @brief Set the Peripheral address. - * @rmtoll PAR PA LL_DMA_SetPeriphAddress - * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. - * @note This API must not be called when the DMA channel is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param PeriphAddress Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t PeriphAddress) -{ - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, PeriphAddress); -} - -/** - * @brief Get the Memory address. - * @rmtoll M0AR M0A LL_DMA_GetMemoryAddress - * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream) -{ - return (READ_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR)); -} - -/** - * @brief Get the Peripheral address. - * @rmtoll PAR PA LL_DMA_GetPeriphAddress - * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream) -{ - return (READ_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR)); -} - -/** - * @brief Set the Memory to Memory Source address. - * @rmtoll PAR PA LL_DMA_SetM2MSrcAddress - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * @note This API must not be called when the DMA channel is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param MemoryAddress Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetM2MSrcAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) -{ - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, MemoryAddress); -} - -/** - * @brief Set the Memory to Memory Destination address. - * @rmtoll M0AR M0A LL_DMA_SetM2MDstAddress - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * @note This API must not be called when the DMA channel is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param MemoryAddress Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetM2MDstAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) - { - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, MemoryAddress); - } - -/** - * @brief Get the Memory to Memory Source address. - * @rmtoll PAR PA LL_DMA_GetM2MSrcAddress - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetM2MSrcAddress(DMA_TypeDef* DMAx, uint32_t Stream) - { - return (READ_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR)); - } - -/** - * @brief Get the Memory to Memory Destination address. - * @rmtoll M0AR M0A LL_DMA_GetM2MDstAddress - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetM2MDstAddress(DMA_TypeDef* DMAx, uint32_t Stream) -{ - return (READ_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR)); -} - -/** - * @brief Set Memory 1 address (used in case of Double buffer mode). - * @rmtoll M1AR M1A LL_DMA_SetMemory1Address - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Address Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemory1Address(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Address) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M1AR, DMA_SxM1AR_M1A, Address); -} - -/** - * @brief Get Memory 1 address (used in case of Double buffer mode). - * @rmtoll M1AR M1A LL_DMA_GetMemory1Address - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemory1Address(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M1AR); -} - -/** - * @} - */ - -/** @defgroup DMA_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Get Stream 0 half transfer flag. - * @rmtoll LISR HTIF0 LL_DMA_IsActiveFlag_HT0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF0)==(DMA_LISR_HTIF0)); -} - -/** - * @brief Get Stream 1 half transfer flag. - * @rmtoll LISR HTIF1 LL_DMA_IsActiveFlag_HT1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF1)==(DMA_LISR_HTIF1)); -} - -/** - * @brief Get Stream 2 half transfer flag. - * @rmtoll LISR HTIF2 LL_DMA_IsActiveFlag_HT2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF2)==(DMA_LISR_HTIF2)); -} - -/** - * @brief Get Stream 3 half transfer flag. - * @rmtoll LISR HTIF3 LL_DMA_IsActiveFlag_HT3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF3)==(DMA_LISR_HTIF3)); -} - -/** - * @brief Get Stream 4 half transfer flag. - * @rmtoll HISR HTIF4 LL_DMA_IsActiveFlag_HT4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF4)==(DMA_HISR_HTIF4)); -} - -/** - * @brief Get Stream 5 half transfer flag. - * @rmtoll HISR HTIF0 LL_DMA_IsActiveFlag_HT5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF5)==(DMA_HISR_HTIF5)); -} - -/** - * @brief Get Stream 6 half transfer flag. - * @rmtoll HISR HTIF6 LL_DMA_IsActiveFlag_HT6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF6)==(DMA_HISR_HTIF6)); -} - -/** - * @brief Get Stream 7 half transfer flag. - * @rmtoll HISR HTIF7 LL_DMA_IsActiveFlag_HT7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF7)==(DMA_HISR_HTIF7)); -} - -/** - * @brief Get Stream 0 transfer complete flag. - * @rmtoll LISR TCIF0 LL_DMA_IsActiveFlag_TC0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF0)==(DMA_LISR_TCIF0)); -} - -/** - * @brief Get Stream 1 transfer complete flag. - * @rmtoll LISR TCIF1 LL_DMA_IsActiveFlag_TC1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF1)==(DMA_LISR_TCIF1)); -} - -/** - * @brief Get Stream 2 transfer complete flag. - * @rmtoll LISR TCIF2 LL_DMA_IsActiveFlag_TC2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF2)==(DMA_LISR_TCIF2)); -} - -/** - * @brief Get Stream 3 transfer complete flag. - * @rmtoll LISR TCIF3 LL_DMA_IsActiveFlag_TC3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF3)==(DMA_LISR_TCIF3)); -} - -/** - * @brief Get Stream 4 transfer complete flag. - * @rmtoll HISR TCIF4 LL_DMA_IsActiveFlag_TC4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF4)==(DMA_HISR_TCIF4)); -} - -/** - * @brief Get Stream 5 transfer complete flag. - * @rmtoll HISR TCIF0 LL_DMA_IsActiveFlag_TC5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF5)==(DMA_HISR_TCIF5)); -} - -/** - * @brief Get Stream 6 transfer complete flag. - * @rmtoll HISR TCIF6 LL_DMA_IsActiveFlag_TC6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF6)==(DMA_HISR_TCIF6)); -} - -/** - * @brief Get Stream 7 transfer complete flag. - * @rmtoll HISR TCIF7 LL_DMA_IsActiveFlag_TC7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF7)==(DMA_HISR_TCIF7)); -} - -/** - * @brief Get Stream 0 transfer error flag. - * @rmtoll LISR TEIF0 LL_DMA_IsActiveFlag_TE0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF0)==(DMA_LISR_TEIF0)); -} - -/** - * @brief Get Stream 1 transfer error flag. - * @rmtoll LISR TEIF1 LL_DMA_IsActiveFlag_TE1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF1)==(DMA_LISR_TEIF1)); -} - -/** - * @brief Get Stream 2 transfer error flag. - * @rmtoll LISR TEIF2 LL_DMA_IsActiveFlag_TE2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF2)==(DMA_LISR_TEIF2)); -} - -/** - * @brief Get Stream 3 transfer error flag. - * @rmtoll LISR TEIF3 LL_DMA_IsActiveFlag_TE3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF3)==(DMA_LISR_TEIF3)); -} - -/** - * @brief Get Stream 4 transfer error flag. - * @rmtoll HISR TEIF4 LL_DMA_IsActiveFlag_TE4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF4)==(DMA_HISR_TEIF4)); -} - -/** - * @brief Get Stream 5 transfer error flag. - * @rmtoll HISR TEIF0 LL_DMA_IsActiveFlag_TE5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF5)==(DMA_HISR_TEIF5)); -} - -/** - * @brief Get Stream 6 transfer error flag. - * @rmtoll HISR TEIF6 LL_DMA_IsActiveFlag_TE6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF6)==(DMA_HISR_TEIF6)); -} - -/** - * @brief Get Stream 7 transfer error flag. - * @rmtoll HISR TEIF7 LL_DMA_IsActiveFlag_TE7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF7)==(DMA_HISR_TEIF7)); -} - -/** - * @brief Get Stream 0 direct mode error flag. - * @rmtoll LISR DMEIF0 LL_DMA_IsActiveFlag_DME0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF0)==(DMA_LISR_DMEIF0)); -} - -/** - * @brief Get Stream 1 direct mode error flag. - * @rmtoll LISR DMEIF1 LL_DMA_IsActiveFlag_DME1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF1)==(DMA_LISR_DMEIF1)); -} - -/** - * @brief Get Stream 2 direct mode error flag. - * @rmtoll LISR DMEIF2 LL_DMA_IsActiveFlag_DME2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF2)==(DMA_LISR_DMEIF2)); -} - -/** - * @brief Get Stream 3 direct mode error flag. - * @rmtoll LISR DMEIF3 LL_DMA_IsActiveFlag_DME3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF3)==(DMA_LISR_DMEIF3)); -} - -/** - * @brief Get Stream 4 direct mode error flag. - * @rmtoll HISR DMEIF4 LL_DMA_IsActiveFlag_DME4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF4)==(DMA_HISR_DMEIF4)); -} - -/** - * @brief Get Stream 5 direct mode error flag. - * @rmtoll HISR DMEIF0 LL_DMA_IsActiveFlag_DME5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF5)==(DMA_HISR_DMEIF5)); -} - -/** - * @brief Get Stream 6 direct mode error flag. - * @rmtoll HISR DMEIF6 LL_DMA_IsActiveFlag_DME6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF6)==(DMA_HISR_DMEIF6)); -} - -/** - * @brief Get Stream 7 direct mode error flag. - * @rmtoll HISR DMEIF7 LL_DMA_IsActiveFlag_DME7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF7)==(DMA_HISR_DMEIF7)); -} - -/** - * @brief Get Stream 0 FIFO error flag. - * @rmtoll LISR FEIF0 LL_DMA_IsActiveFlag_FE0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF0)==(DMA_LISR_FEIF0)); -} - -/** - * @brief Get Stream 1 FIFO error flag. - * @rmtoll LISR FEIF1 LL_DMA_IsActiveFlag_FE1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF1)==(DMA_LISR_FEIF1)); -} - -/** - * @brief Get Stream 2 FIFO error flag. - * @rmtoll LISR FEIF2 LL_DMA_IsActiveFlag_FE2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF2)==(DMA_LISR_FEIF2)); -} - -/** - * @brief Get Stream 3 FIFO error flag. - * @rmtoll LISR FEIF3 LL_DMA_IsActiveFlag_FE3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF3)==(DMA_LISR_FEIF3)); -} - -/** - * @brief Get Stream 4 FIFO error flag. - * @rmtoll HISR FEIF4 LL_DMA_IsActiveFlag_FE4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF4)==(DMA_HISR_FEIF4)); -} - -/** - * @brief Get Stream 5 FIFO error flag. - * @rmtoll HISR FEIF0 LL_DMA_IsActiveFlag_FE5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF5)==(DMA_HISR_FEIF5)); -} - -/** - * @brief Get Stream 6 FIFO error flag. - * @rmtoll HISR FEIF6 LL_DMA_IsActiveFlag_FE6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF6)==(DMA_HISR_FEIF6)); -} - -/** - * @brief Get Stream 7 FIFO error flag. - * @rmtoll HISR FEIF7 LL_DMA_IsActiveFlag_FE7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF7)==(DMA_HISR_FEIF7)); -} - -/** - * @brief Clear Stream 0 half transfer flag. - * @rmtoll LIFCR CHTIF0 LL_DMA_ClearFlag_HT0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF0); -} - -/** - * @brief Clear Stream 1 half transfer flag. - * @rmtoll LIFCR CHTIF1 LL_DMA_ClearFlag_HT1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF1); -} - -/** - * @brief Clear Stream 2 half transfer flag. - * @rmtoll LIFCR CHTIF2 LL_DMA_ClearFlag_HT2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF2); -} - -/** - * @brief Clear Stream 3 half transfer flag. - * @rmtoll LIFCR CHTIF3 LL_DMA_ClearFlag_HT3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF3); -} - -/** - * @brief Clear Stream 4 half transfer flag. - * @rmtoll HIFCR CHTIF4 LL_DMA_ClearFlag_HT4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF4); -} - -/** - * @brief Clear Stream 5 half transfer flag. - * @rmtoll HIFCR CHTIF5 LL_DMA_ClearFlag_HT5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF5); -} - -/** - * @brief Clear Stream 6 half transfer flag. - * @rmtoll HIFCR CHTIF6 LL_DMA_ClearFlag_HT6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF6); -} - -/** - * @brief Clear Stream 7 half transfer flag. - * @rmtoll HIFCR CHTIF7 LL_DMA_ClearFlag_HT7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF7); -} - -/** - * @brief Clear Stream 0 transfer complete flag. - * @rmtoll LIFCR CTCIF0 LL_DMA_ClearFlag_TC0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF0); -} - -/** - * @brief Clear Stream 1 transfer complete flag. - * @rmtoll LIFCR CTCIF1 LL_DMA_ClearFlag_TC1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF1); -} - -/** - * @brief Clear Stream 2 transfer complete flag. - * @rmtoll LIFCR CTCIF2 LL_DMA_ClearFlag_TC2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF2); -} - -/** - * @brief Clear Stream 3 transfer complete flag. - * @rmtoll LIFCR CTCIF3 LL_DMA_ClearFlag_TC3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF3); -} - -/** - * @brief Clear Stream 4 transfer complete flag. - * @rmtoll HIFCR CTCIF4 LL_DMA_ClearFlag_TC4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF4); -} - -/** - * @brief Clear Stream 5 transfer complete flag. - * @rmtoll HIFCR CTCIF5 LL_DMA_ClearFlag_TC5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF5); -} - -/** - * @brief Clear Stream 6 transfer complete flag. - * @rmtoll HIFCR CTCIF6 LL_DMA_ClearFlag_TC6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF6); -} - -/** - * @brief Clear Stream 7 transfer complete flag. - * @rmtoll HIFCR CTCIF7 LL_DMA_ClearFlag_TC7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF7); -} - -/** - * @brief Clear Stream 0 transfer error flag. - * @rmtoll LIFCR CTEIF0 LL_DMA_ClearFlag_TE0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF0); -} - -/** - * @brief Clear Stream 1 transfer error flag. - * @rmtoll LIFCR CTEIF1 LL_DMA_ClearFlag_TE1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF1); -} - -/** - * @brief Clear Stream 2 transfer error flag. - * @rmtoll LIFCR CTEIF2 LL_DMA_ClearFlag_TE2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF2); -} - -/** - * @brief Clear Stream 3 transfer error flag. - * @rmtoll LIFCR CTEIF3 LL_DMA_ClearFlag_TE3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF3); -} - -/** - * @brief Clear Stream 4 transfer error flag. - * @rmtoll HIFCR CTEIF4 LL_DMA_ClearFlag_TE4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF4); -} - -/** - * @brief Clear Stream 5 transfer error flag. - * @rmtoll HIFCR CTEIF5 LL_DMA_ClearFlag_TE5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF5); -} - -/** - * @brief Clear Stream 6 transfer error flag. - * @rmtoll HIFCR CTEIF6 LL_DMA_ClearFlag_TE6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF6); -} - -/** - * @brief Clear Stream 7 transfer error flag. - * @rmtoll HIFCR CTEIF7 LL_DMA_ClearFlag_TE7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF7); -} - -/** - * @brief Clear Stream 0 direct mode error flag. - * @rmtoll LIFCR CDMEIF0 LL_DMA_ClearFlag_DME0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF0); -} - -/** - * @brief Clear Stream 1 direct mode error flag. - * @rmtoll LIFCR CDMEIF1 LL_DMA_ClearFlag_DME1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF1); -} - -/** - * @brief Clear Stream 2 direct mode error flag. - * @rmtoll LIFCR CDMEIF2 LL_DMA_ClearFlag_DME2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF2); -} - -/** - * @brief Clear Stream 3 direct mode error flag. - * @rmtoll LIFCR CDMEIF3 LL_DMA_ClearFlag_DME3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF3); -} - -/** - * @brief Clear Stream 4 direct mode error flag. - * @rmtoll HIFCR CDMEIF4 LL_DMA_ClearFlag_DME4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF4); -} - -/** - * @brief Clear Stream 5 direct mode error flag. - * @rmtoll HIFCR CDMEIF5 LL_DMA_ClearFlag_DME5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF5); -} - -/** - * @brief Clear Stream 6 direct mode error flag. - * @rmtoll HIFCR CDMEIF6 LL_DMA_ClearFlag_DME6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF6); -} - -/** - * @brief Clear Stream 7 direct mode error flag. - * @rmtoll HIFCR CDMEIF7 LL_DMA_ClearFlag_DME7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF7); -} - -/** - * @brief Clear Stream 0 FIFO error flag. - * @rmtoll LIFCR CFEIF0 LL_DMA_ClearFlag_FE0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF0); -} - -/** - * @brief Clear Stream 1 FIFO error flag. - * @rmtoll LIFCR CFEIF1 LL_DMA_ClearFlag_FE1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF1); -} - -/** - * @brief Clear Stream 2 FIFO error flag. - * @rmtoll LIFCR CFEIF2 LL_DMA_ClearFlag_FE2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF2); -} - -/** - * @brief Clear Stream 3 FIFO error flag. - * @rmtoll LIFCR CFEIF3 LL_DMA_ClearFlag_FE3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF3); -} - -/** - * @brief Clear Stream 4 FIFO error flag. - * @rmtoll HIFCR CFEIF4 LL_DMA_ClearFlag_FE4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF4); -} - -/** - * @brief Clear Stream 5 FIFO error flag. - * @rmtoll HIFCR CFEIF5 LL_DMA_ClearFlag_FE5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF5); -} - -/** - * @brief Clear Stream 6 FIFO error flag. - * @rmtoll HIFCR CFEIF6 LL_DMA_ClearFlag_FE6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF6); -} - -/** - * @brief Clear Stream 7 FIFO error flag. - * @rmtoll HIFCR CFEIF7 LL_DMA_ClearFlag_FE7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF7); -} - -/** - * @} - */ - -/** @defgroup DMA_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable Half transfer interrupt. - * @rmtoll CR HTIE LL_DMA_EnableIT_HT - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE); -} - -/** - * @brief Enable Transfer error interrupt. - * @rmtoll CR TEIE LL_DMA_EnableIT_TE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE); -} - -/** - * @brief Enable Transfer complete interrupt. - * @rmtoll CR TCIE LL_DMA_EnableIT_TC - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE); -} - -/** - * @brief Enable Direct mode error interrupt. - * @rmtoll CR DMEIE LL_DMA_EnableIT_DME - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE); -} - -/** - * @brief Enable FIFO error interrupt. - * @rmtoll FCR FEIE LL_DMA_EnableIT_FE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE); -} - -/** - * @brief Disable Half transfer interrupt. - * @rmtoll CR HTIE LL_DMA_DisableIT_HT - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE); -} - -/** - * @brief Disable Transfer error interrupt. - * @rmtoll CR TEIE LL_DMA_DisableIT_TE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE); -} - -/** - * @brief Disable Transfer complete interrupt. - * @rmtoll CR TCIE LL_DMA_DisableIT_TC - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE); -} - -/** - * @brief Disable Direct mode error interrupt. - * @rmtoll CR DMEIE LL_DMA_DisableIT_DME - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE); -} - -/** - * @brief Disable FIFO error interrupt. - * @rmtoll FCR FEIE LL_DMA_DisableIT_FE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE); -} - -/** - * @brief Check if Half transfer interrupt is enabled. - * @rmtoll CR HTIE LL_DMA_IsEnabledIT_HT - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE) == DMA_SxCR_HTIE); -} - -/** - * @brief Check if Transfer error nterrup is enabled. - * @rmtoll CR TEIE LL_DMA_IsEnabledIT_TE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE) == DMA_SxCR_TEIE); -} - -/** - * @brief Check if Transfer complete interrupt is enabled. - * @rmtoll CR TCIE LL_DMA_IsEnabledIT_TC - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE) == DMA_SxCR_TCIE); -} - -/** - * @brief Check if Direct mode error interrupt is enabled. - * @rmtoll CR DMEIE LL_DMA_IsEnabledIT_DME - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE) == DMA_SxCR_DMEIE); -} - -/** - * @brief Check if FIFO error interrupt is enabled. - * @rmtoll FCR FEIE LL_DMA_IsEnabledIT_FE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE) == DMA_SxFCR_FEIE); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup DMA_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -uint32_t LL_DMA_Init(DMA_TypeDef *DMAx, uint32_t Stream, LL_DMA_InitTypeDef *DMA_InitStruct); -uint32_t LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Stream); -void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct); - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* DMA1 || DMA2 */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_DMA_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h deleted file mode 100644 index 65ab691..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h +++ /dev/null @@ -1,954 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_exti.h - * @author MCD Application Team - * @brief Header file of EXTI LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS.Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_EXTI_H -#define __STM32F4xx_LL_EXTI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (EXTI) - -/** @defgroup EXTI_LL EXTI - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private Macros ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup EXTI_LL_Private_Macros EXTI Private Macros - * @{ - */ -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup EXTI_LL_ES_INIT EXTI Exported Init structure - * @{ - */ -typedef struct -{ - - uint32_t Line_0_31; /*!< Specifies the EXTI lines to be enabled or disabled for Lines in range 0 to 31 - This parameter can be any combination of @ref EXTI_LL_EC_LINE */ - - FunctionalState LineCommand; /*!< Specifies the new state of the selected EXTI lines. - This parameter can be set either to ENABLE or DISABLE */ - - uint8_t Mode; /*!< Specifies the mode for the EXTI lines. - This parameter can be a value of @ref EXTI_LL_EC_MODE. */ - - uint8_t Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. - This parameter can be a value of @ref EXTI_LL_EC_TRIGGER. */ -} LL_EXTI_InitTypeDef; - -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup EXTI_LL_Exported_Constants EXTI Exported Constants - * @{ - */ - -/** @defgroup EXTI_LL_EC_LINE LINE - * @{ - */ -#define LL_EXTI_LINE_0 EXTI_IMR_IM0 /*!< Extended line 0 */ -#define LL_EXTI_LINE_1 EXTI_IMR_IM1 /*!< Extended line 1 */ -#define LL_EXTI_LINE_2 EXTI_IMR_IM2 /*!< Extended line 2 */ -#define LL_EXTI_LINE_3 EXTI_IMR_IM3 /*!< Extended line 3 */ -#define LL_EXTI_LINE_4 EXTI_IMR_IM4 /*!< Extended line 4 */ -#define LL_EXTI_LINE_5 EXTI_IMR_IM5 /*!< Extended line 5 */ -#define LL_EXTI_LINE_6 EXTI_IMR_IM6 /*!< Extended line 6 */ -#define LL_EXTI_LINE_7 EXTI_IMR_IM7 /*!< Extended line 7 */ -#define LL_EXTI_LINE_8 EXTI_IMR_IM8 /*!< Extended line 8 */ -#define LL_EXTI_LINE_9 EXTI_IMR_IM9 /*!< Extended line 9 */ -#define LL_EXTI_LINE_10 EXTI_IMR_IM10 /*!< Extended line 10 */ -#define LL_EXTI_LINE_11 EXTI_IMR_IM11 /*!< Extended line 11 */ -#define LL_EXTI_LINE_12 EXTI_IMR_IM12 /*!< Extended line 12 */ -#define LL_EXTI_LINE_13 EXTI_IMR_IM13 /*!< Extended line 13 */ -#define LL_EXTI_LINE_14 EXTI_IMR_IM14 /*!< Extended line 14 */ -#define LL_EXTI_LINE_15 EXTI_IMR_IM15 /*!< Extended line 15 */ -#if defined(EXTI_IMR_IM16) -#define LL_EXTI_LINE_16 EXTI_IMR_IM16 /*!< Extended line 16 */ -#endif -#define LL_EXTI_LINE_17 EXTI_IMR_IM17 /*!< Extended line 17 */ -#if defined(EXTI_IMR_IM18) -#define LL_EXTI_LINE_18 EXTI_IMR_IM18 /*!< Extended line 18 */ -#endif -#define LL_EXTI_LINE_19 EXTI_IMR_IM19 /*!< Extended line 19 */ -#if defined(EXTI_IMR_IM20) -#define LL_EXTI_LINE_20 EXTI_IMR_IM20 /*!< Extended line 20 */ -#endif -#if defined(EXTI_IMR_IM21) -#define LL_EXTI_LINE_21 EXTI_IMR_IM21 /*!< Extended line 21 */ -#endif -#if defined(EXTI_IMR_IM22) -#define LL_EXTI_LINE_22 EXTI_IMR_IM22 /*!< Extended line 22 */ -#endif -#if defined(EXTI_IMR_IM23) -#define LL_EXTI_LINE_23 EXTI_IMR_IM23 /*!< Extended line 23 */ -#endif -#if defined(EXTI_IMR_IM24) -#define LL_EXTI_LINE_24 EXTI_IMR_IM24 /*!< Extended line 24 */ -#endif -#if defined(EXTI_IMR_IM25) -#define LL_EXTI_LINE_25 EXTI_IMR_IM25 /*!< Extended line 25 */ -#endif -#if defined(EXTI_IMR_IM26) -#define LL_EXTI_LINE_26 EXTI_IMR_IM26 /*!< Extended line 26 */ -#endif -#if defined(EXTI_IMR_IM27) -#define LL_EXTI_LINE_27 EXTI_IMR_IM27 /*!< Extended line 27 */ -#endif -#if defined(EXTI_IMR_IM28) -#define LL_EXTI_LINE_28 EXTI_IMR_IM28 /*!< Extended line 28 */ -#endif -#if defined(EXTI_IMR_IM29) -#define LL_EXTI_LINE_29 EXTI_IMR_IM29 /*!< Extended line 29 */ -#endif -#if defined(EXTI_IMR_IM30) -#define LL_EXTI_LINE_30 EXTI_IMR_IM30 /*!< Extended line 30 */ -#endif -#if defined(EXTI_IMR_IM31) -#define LL_EXTI_LINE_31 EXTI_IMR_IM31 /*!< Extended line 31 */ -#endif -#define LL_EXTI_LINE_ALL_0_31 EXTI_IMR_IM /*!< All Extended line not reserved*/ - - -#define LL_EXTI_LINE_ALL ((uint32_t)0xFFFFFFFFU) /*!< All Extended line */ - -#if defined(USE_FULL_LL_DRIVER) -#define LL_EXTI_LINE_NONE ((uint32_t)0x00000000U) /*!< None Extended line */ -#endif /*USE_FULL_LL_DRIVER*/ - -/** - * @} - */ -#if defined(USE_FULL_LL_DRIVER) - -/** @defgroup EXTI_LL_EC_MODE Mode - * @{ - */ -#define LL_EXTI_MODE_IT ((uint8_t)0x00U) /*!< Interrupt Mode */ -#define LL_EXTI_MODE_EVENT ((uint8_t)0x01U) /*!< Event Mode */ -#define LL_EXTI_MODE_IT_EVENT ((uint8_t)0x02U) /*!< Interrupt & Event Mode */ -/** - * @} - */ - -/** @defgroup EXTI_LL_EC_TRIGGER Edge Trigger - * @{ - */ -#define LL_EXTI_TRIGGER_NONE ((uint8_t)0x00U) /*!< No Trigger Mode */ -#define LL_EXTI_TRIGGER_RISING ((uint8_t)0x01U) /*!< Trigger Rising Mode */ -#define LL_EXTI_TRIGGER_FALLING ((uint8_t)0x02U) /*!< Trigger Falling Mode */ -#define LL_EXTI_TRIGGER_RISING_FALLING ((uint8_t)0x03U) /*!< Trigger Rising & Falling Mode */ - -/** - * @} - */ - - -#endif /*USE_FULL_LL_DRIVER*/ - - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup EXTI_LL_Exported_Macros EXTI Exported Macros - * @{ - */ - -/** @defgroup EXTI_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in EXTI register - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_EXTI_WriteReg(__REG__, __VALUE__) WRITE_REG(EXTI->__REG__, (__VALUE__)) - -/** - * @brief Read a value in EXTI register - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_EXTI_ReadReg(__REG__) READ_REG(EXTI->__REG__) -/** - * @} - */ - - -/** - * @} - */ - - - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup EXTI_LL_Exported_Functions EXTI Exported Functions - * @{ - */ -/** @defgroup EXTI_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable ExtiLine Interrupt request for Lines in range 0 to 31 - * @note The reset value for the direct or internal lines (see RM) - * is set to 1 in order to enable the interrupt by default. - * Bits are set automatically at Power on. - * @rmtoll IMR IMx LL_EXTI_EnableIT_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_EnableIT_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->IMR, ExtiLine); -} - -/** - * @brief Disable ExtiLine Interrupt request for Lines in range 0 to 31 - * @note The reset value for the direct or internal lines (see RM) - * is set to 1 in order to enable the interrupt by default. - * Bits are set automatically at Power on. - * @rmtoll IMR IMx LL_EXTI_DisableIT_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_DisableIT_0_31(uint32_t ExtiLine) -{ - CLEAR_BIT(EXTI->IMR, ExtiLine); -} - - -/** - * @brief Indicate if ExtiLine Interrupt request is enabled for Lines in range 0 to 31 - * @note The reset value for the direct or internal lines (see RM) - * is set to 1 in order to enable the interrupt by default. - * Bits are set automatically at Power on. - * @rmtoll IMR IMx LL_EXTI_IsEnabledIT_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsEnabledIT_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->IMR, ExtiLine) == (ExtiLine)); -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Event_Management Event_Management - * @{ - */ - -/** - * @brief Enable ExtiLine Event request for Lines in range 0 to 31 - * @rmtoll EMR EMx LL_EXTI_EnableEvent_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_EnableEvent_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->EMR, ExtiLine); - -} - - -/** - * @brief Disable ExtiLine Event request for Lines in range 0 to 31 - * @rmtoll EMR EMx LL_EXTI_DisableEvent_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_DisableEvent_0_31(uint32_t ExtiLine) -{ - CLEAR_BIT(EXTI->EMR, ExtiLine); -} - - -/** - * @brief Indicate if ExtiLine Event request is enabled for Lines in range 0 to 31 - * @rmtoll EMR EMx LL_EXTI_IsEnabledEvent_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsEnabledEvent_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->EMR, ExtiLine) == (ExtiLine)); - -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Rising_Trigger_Management Rising_Trigger_Management - * @{ - */ - -/** - * @brief Enable ExtiLine Rising Edge Trigger for Lines in range 0 to 31 - * @note The configurable wakeup lines are edge-triggered. No glitch must be - * generated on these lines. If a rising edge on a configurable interrupt - * line occurs during a write operation in the EXTI_RTSR register, the - * pending bit is not set. - * Rising and falling edge triggers can be set for - * the same interrupt line. In this case, both generate a trigger - * condition. - * @rmtoll RTSR RTx LL_EXTI_EnableRisingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_EnableRisingTrig_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->RTSR, ExtiLine); - -} - - -/** - * @brief Disable ExtiLine Rising Edge Trigger for Lines in range 0 to 31 - * @note The configurable wakeup lines are edge-triggered. No glitch must be - * generated on these lines. If a rising edge on a configurable interrupt - * line occurs during a write operation in the EXTI_RTSR register, the - * pending bit is not set. - * Rising and falling edge triggers can be set for - * the same interrupt line. In this case, both generate a trigger - * condition. - * @rmtoll RTSR RTx LL_EXTI_DisableRisingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_DisableRisingTrig_0_31(uint32_t ExtiLine) -{ - CLEAR_BIT(EXTI->RTSR, ExtiLine); - -} - - -/** - * @brief Check if rising edge trigger is enabled for Lines in range 0 to 31 - * @rmtoll RTSR RTx LL_EXTI_IsEnabledRisingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsEnabledRisingTrig_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->RTSR, ExtiLine) == (ExtiLine)); -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Falling_Trigger_Management Falling_Trigger_Management - * @{ - */ - -/** - * @brief Enable ExtiLine Falling Edge Trigger for Lines in range 0 to 31 - * @note The configurable wakeup lines are edge-triggered. No glitch must be - * generated on these lines. If a falling edge on a configurable interrupt - * line occurs during a write operation in the EXTI_FTSR register, the - * pending bit is not set. - * Rising and falling edge triggers can be set for - * the same interrupt line. In this case, both generate a trigger - * condition. - * @rmtoll FTSR FTx LL_EXTI_EnableFallingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_EnableFallingTrig_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->FTSR, ExtiLine); -} - - -/** - * @brief Disable ExtiLine Falling Edge Trigger for Lines in range 0 to 31 - * @note The configurable wakeup lines are edge-triggered. No glitch must be - * generated on these lines. If a Falling edge on a configurable interrupt - * line occurs during a write operation in the EXTI_FTSR register, the - * pending bit is not set. - * Rising and falling edge triggers can be set for the same interrupt line. - * In this case, both generate a trigger condition. - * @rmtoll FTSR FTx LL_EXTI_DisableFallingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_DisableFallingTrig_0_31(uint32_t ExtiLine) -{ - CLEAR_BIT(EXTI->FTSR, ExtiLine); -} - - -/** - * @brief Check if falling edge trigger is enabled for Lines in range 0 to 31 - * @rmtoll FTSR FTx LL_EXTI_IsEnabledFallingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsEnabledFallingTrig_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->FTSR, ExtiLine) == (ExtiLine)); -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Software_Interrupt_Management Software_Interrupt_Management - * @{ - */ - -/** - * @brief Generate a software Interrupt Event for Lines in range 0 to 31 - * @note If the interrupt is enabled on this line in the EXTI_IMR, writing a 1 to - * this bit when it is at '0' sets the corresponding pending bit in EXTI_PR - * resulting in an interrupt request generation. - * This bit is cleared by clearing the corresponding bit in the EXTI_PR - * register (by writing a 1 into the bit) - * @rmtoll SWIER SWIx LL_EXTI_GenerateSWI_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_GenerateSWI_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->SWIER, ExtiLine); -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Flag_Management Flag_Management - * @{ - */ - -/** - * @brief Check if the ExtLine Flag is set or not for Lines in range 0 to 31 - * @note This bit is set when the selected edge event arrives on the interrupt - * line. This bit is cleared by writing a 1 to the bit. - * @rmtoll PR PIFx LL_EXTI_IsActiveFlag_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsActiveFlag_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->PR, ExtiLine) == (ExtiLine)); -} - - -/** - * @brief Read ExtLine Combination Flag for Lines in range 0 to 31 - * @note This bit is set when the selected edge event arrives on the interrupt - * line. This bit is cleared by writing a 1 to the bit. - * @rmtoll PR PIFx LL_EXTI_ReadFlag_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval @note This bit is set when the selected edge event arrives on the interrupt - */ -__STATIC_INLINE uint32_t LL_EXTI_ReadFlag_0_31(uint32_t ExtiLine) -{ - return (uint32_t)(READ_BIT(EXTI->PR, ExtiLine)); -} - - -/** - * @brief Clear ExtLine Flags for Lines in range 0 to 31 - * @note This bit is set when the selected edge event arrives on the interrupt - * line. This bit is cleared by writing a 1 to the bit. - * @rmtoll PR PIFx LL_EXTI_ClearFlag_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_ClearFlag_0_31(uint32_t ExtiLine) -{ - WRITE_REG(EXTI->PR, ExtiLine); -} - - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup EXTI_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -uint32_t LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct); -uint32_t LL_EXTI_DeInit(void); -void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct); - - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* EXTI */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_EXTI_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h deleted file mode 100644 index 6bee7fd..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h +++ /dev/null @@ -1,981 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_gpio.h - * @author MCD Application Team - * @brief Header file of GPIO LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_GPIO_H -#define __STM32F4xx_LL_GPIO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK) - -/** @defgroup GPIO_LL GPIO - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup GPIO_LL_Private_Macros GPIO Private Macros - * @{ - */ - -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup GPIO_LL_ES_INIT GPIO Exported Init structures - * @{ - */ - -/** - * @brief LL GPIO Init Structure definition - */ -typedef struct -{ - uint32_t Pin; /*!< Specifies the GPIO pins to be configured. - This parameter can be any value of @ref GPIO_LL_EC_PIN */ - - uint32_t Mode; /*!< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref GPIO_LL_EC_MODE. - - GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinMode().*/ - - uint32_t Speed; /*!< Specifies the speed for the selected pins. - This parameter can be a value of @ref GPIO_LL_EC_SPEED. - - GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinSpeed().*/ - - uint32_t OutputType; /*!< Specifies the operating output type for the selected pins. - This parameter can be a value of @ref GPIO_LL_EC_OUTPUT. - - GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinOutputType().*/ - - uint32_t Pull; /*!< Specifies the operating Pull-up/Pull down for the selected pins. - This parameter can be a value of @ref GPIO_LL_EC_PULL. - - GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinPull().*/ - - uint32_t Alternate; /*!< Specifies the Peripheral to be connected to the selected pins. - This parameter can be a value of @ref GPIO_LL_EC_AF. - - GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetAFPin_0_7() and LL_GPIO_SetAFPin_8_15().*/ -} LL_GPIO_InitTypeDef; - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup GPIO_LL_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_LL_EC_PIN PIN - * @{ - */ -#define LL_GPIO_PIN_0 GPIO_BSRR_BS_0 /*!< Select pin 0 */ -#define LL_GPIO_PIN_1 GPIO_BSRR_BS_1 /*!< Select pin 1 */ -#define LL_GPIO_PIN_2 GPIO_BSRR_BS_2 /*!< Select pin 2 */ -#define LL_GPIO_PIN_3 GPIO_BSRR_BS_3 /*!< Select pin 3 */ -#define LL_GPIO_PIN_4 GPIO_BSRR_BS_4 /*!< Select pin 4 */ -#define LL_GPIO_PIN_5 GPIO_BSRR_BS_5 /*!< Select pin 5 */ -#define LL_GPIO_PIN_6 GPIO_BSRR_BS_6 /*!< Select pin 6 */ -#define LL_GPIO_PIN_7 GPIO_BSRR_BS_7 /*!< Select pin 7 */ -#define LL_GPIO_PIN_8 GPIO_BSRR_BS_8 /*!< Select pin 8 */ -#define LL_GPIO_PIN_9 GPIO_BSRR_BS_9 /*!< Select pin 9 */ -#define LL_GPIO_PIN_10 GPIO_BSRR_BS_10 /*!< Select pin 10 */ -#define LL_GPIO_PIN_11 GPIO_BSRR_BS_11 /*!< Select pin 11 */ -#define LL_GPIO_PIN_12 GPIO_BSRR_BS_12 /*!< Select pin 12 */ -#define LL_GPIO_PIN_13 GPIO_BSRR_BS_13 /*!< Select pin 13 */ -#define LL_GPIO_PIN_14 GPIO_BSRR_BS_14 /*!< Select pin 14 */ -#define LL_GPIO_PIN_15 GPIO_BSRR_BS_15 /*!< Select pin 15 */ -#define LL_GPIO_PIN_ALL (GPIO_BSRR_BS_0 | GPIO_BSRR_BS_1 | GPIO_BSRR_BS_2 | \ - GPIO_BSRR_BS_3 | GPIO_BSRR_BS_4 | GPIO_BSRR_BS_5 | \ - GPIO_BSRR_BS_6 | GPIO_BSRR_BS_7 | GPIO_BSRR_BS_8 | \ - GPIO_BSRR_BS_9 | GPIO_BSRR_BS_10 | GPIO_BSRR_BS_11 | \ - GPIO_BSRR_BS_12 | GPIO_BSRR_BS_13 | GPIO_BSRR_BS_14 | \ - GPIO_BSRR_BS_15) /*!< Select all pins */ -/** - * @} - */ - -/** @defgroup GPIO_LL_EC_MODE Mode - * @{ - */ -#define LL_GPIO_MODE_INPUT (0x00000000U) /*!< Select input mode */ -#define LL_GPIO_MODE_OUTPUT GPIO_MODER_MODER0_0 /*!< Select output mode */ -#define LL_GPIO_MODE_ALTERNATE GPIO_MODER_MODER0_1 /*!< Select alternate function mode */ -#define LL_GPIO_MODE_ANALOG GPIO_MODER_MODER0 /*!< Select analog mode */ -/** - * @} - */ - -/** @defgroup GPIO_LL_EC_OUTPUT Output Type - * @{ - */ -#define LL_GPIO_OUTPUT_PUSHPULL (0x00000000U) /*!< Select push-pull as output type */ -#define LL_GPIO_OUTPUT_OPENDRAIN GPIO_OTYPER_OT_0 /*!< Select open-drain as output type */ -/** - * @} - */ - -/** @defgroup GPIO_LL_EC_SPEED Output Speed - * @{ - */ -#define LL_GPIO_SPEED_FREQ_LOW (0x00000000U) /*!< Select I/O low output speed */ -#define LL_GPIO_SPEED_FREQ_MEDIUM GPIO_OSPEEDER_OSPEEDR0_0 /*!< Select I/O medium output speed */ -#define LL_GPIO_SPEED_FREQ_HIGH GPIO_OSPEEDER_OSPEEDR0_1 /*!< Select I/O fast output speed */ -#define LL_GPIO_SPEED_FREQ_VERY_HIGH GPIO_OSPEEDER_OSPEEDR0 /*!< Select I/O high output speed */ -/** - * @} - */ - -/** @defgroup GPIO_LL_EC_PULL Pull Up Pull Down - * @{ - */ -#define LL_GPIO_PULL_NO (0x00000000U) /*!< Select I/O no pull */ -#define LL_GPIO_PULL_UP GPIO_PUPDR_PUPDR0_0 /*!< Select I/O pull up */ -#define LL_GPIO_PULL_DOWN GPIO_PUPDR_PUPDR0_1 /*!< Select I/O pull down */ -/** - * @} - */ - -/** @defgroup GPIO_LL_EC_AF Alternate Function - * @{ - */ -#define LL_GPIO_AF_0 (0x0000000U) /*!< Select alternate function 0 */ -#define LL_GPIO_AF_1 (0x0000001U) /*!< Select alternate function 1 */ -#define LL_GPIO_AF_2 (0x0000002U) /*!< Select alternate function 2 */ -#define LL_GPIO_AF_3 (0x0000003U) /*!< Select alternate function 3 */ -#define LL_GPIO_AF_4 (0x0000004U) /*!< Select alternate function 4 */ -#define LL_GPIO_AF_5 (0x0000005U) /*!< Select alternate function 5 */ -#define LL_GPIO_AF_6 (0x0000006U) /*!< Select alternate function 6 */ -#define LL_GPIO_AF_7 (0x0000007U) /*!< Select alternate function 7 */ -#define LL_GPIO_AF_8 (0x0000008U) /*!< Select alternate function 8 */ -#define LL_GPIO_AF_9 (0x0000009U) /*!< Select alternate function 9 */ -#define LL_GPIO_AF_10 (0x000000AU) /*!< Select alternate function 10 */ -#define LL_GPIO_AF_11 (0x000000BU) /*!< Select alternate function 11 */ -#define LL_GPIO_AF_12 (0x000000CU) /*!< Select alternate function 12 */ -#define LL_GPIO_AF_13 (0x000000DU) /*!< Select alternate function 13 */ -#define LL_GPIO_AF_14 (0x000000EU) /*!< Select alternate function 14 */ -#define LL_GPIO_AF_15 (0x000000FU) /*!< Select alternate function 15 */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIO_LL_Exported_Macros GPIO Exported Macros - * @{ - */ - -/** @defgroup GPIO_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in GPIO register - * @param __INSTANCE__ GPIO Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_GPIO_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in GPIO register - * @param __INSTANCE__ GPIO Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_GPIO_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup GPIO_LL_Exported_Functions GPIO Exported Functions - * @{ - */ - -/** @defgroup GPIO_LL_EF_Port_Configuration Port Configuration - * @{ - */ - -/** - * @brief Configure gpio mode for a dedicated pin on dedicated port. - * @note I/O mode can be Input mode, General purpose output, Alternate function mode or Analog. - * @note Warning: only one pin can be passed as parameter. - * @rmtoll MODER MODEy LL_GPIO_SetPinMode - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_GPIO_MODE_INPUT - * @arg @ref LL_GPIO_MODE_OUTPUT - * @arg @ref LL_GPIO_MODE_ALTERNATE - * @arg @ref LL_GPIO_MODE_ANALOG - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode) -{ - MODIFY_REG(GPIOx->MODER, (GPIO_MODER_MODER0 << (POSITION_VAL(Pin) * 2U)), (Mode << (POSITION_VAL(Pin) * 2U))); -} - -/** - * @brief Return gpio mode for a dedicated pin on dedicated port. - * @note I/O mode can be Input mode, General purpose output, Alternate function mode or Analog. - * @note Warning: only one pin can be passed as parameter. - * @rmtoll MODER MODEy LL_GPIO_GetPinMode - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_MODE_INPUT - * @arg @ref LL_GPIO_MODE_OUTPUT - * @arg @ref LL_GPIO_MODE_ALTERNATE - * @arg @ref LL_GPIO_MODE_ANALOG - */ -__STATIC_INLINE uint32_t LL_GPIO_GetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->MODER, - (GPIO_MODER_MODER0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); -} - -/** - * @brief Configure gpio output type for several pins on dedicated port. - * @note Output type as to be set when gpio pin is in output or - * alternate modes. Possible type are Push-pull or Open-drain. - * @rmtoll OTYPER OTy LL_GPIO_SetPinOutputType - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @param OutputType This parameter can be one of the following values: - * @arg @ref LL_GPIO_OUTPUT_PUSHPULL - * @arg @ref LL_GPIO_OUTPUT_OPENDRAIN - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t PinMask, uint32_t OutputType) -{ - MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType)); -} - -/** - * @brief Return gpio output type for several pins on dedicated port. - * @note Output type as to be set when gpio pin is in output or - * alternate modes. Possible type are Push-pull or Open-drain. - * @note Warning: only one pin can be passed as parameter. - * @rmtoll OTYPER OTy LL_GPIO_GetPinOutputType - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_OUTPUT_PUSHPULL - * @arg @ref LL_GPIO_OUTPUT_OPENDRAIN - */ -__STATIC_INLINE uint32_t LL_GPIO_GetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->OTYPER, Pin) >> POSITION_VAL(Pin)); -} - -/** - * @brief Configure gpio speed for a dedicated pin on dedicated port. - * @note I/O speed can be Low, Medium, Fast or High speed. - * @note Warning: only one pin can be passed as parameter. - * @note Refer to datasheet for frequency specifications and the power - * supply and load conditions for each speed. - * @rmtoll OSPEEDR OSPEEDy LL_GPIO_SetPinSpeed - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @param Speed This parameter can be one of the following values: - * @arg @ref LL_GPIO_SPEED_FREQ_LOW - * @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM - * @arg @ref LL_GPIO_SPEED_FREQ_HIGH - * @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Speed) -{ - MODIFY_REG(GPIOx->OSPEEDR, (GPIO_OSPEEDER_OSPEEDR0 << (POSITION_VAL(Pin) * 2U)), - (Speed << (POSITION_VAL(Pin) * 2U))); -} - -/** - * @brief Return gpio speed for a dedicated pin on dedicated port. - * @note I/O speed can be Low, Medium, Fast or High speed. - * @note Warning: only one pin can be passed as parameter. - * @note Refer to datasheet for frequency specifications and the power - * supply and load conditions for each speed. - * @rmtoll OSPEEDR OSPEEDy LL_GPIO_GetPinSpeed - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_SPEED_FREQ_LOW - * @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM - * @arg @ref LL_GPIO_SPEED_FREQ_HIGH - * @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH - */ -__STATIC_INLINE uint32_t LL_GPIO_GetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->OSPEEDR, - (GPIO_OSPEEDER_OSPEEDR0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); -} - -/** - * @brief Configure gpio pull-up or pull-down for a dedicated pin on a dedicated port. - * @note Warning: only one pin can be passed as parameter. - * @rmtoll PUPDR PUPDy LL_GPIO_SetPinPull - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @param Pull This parameter can be one of the following values: - * @arg @ref LL_GPIO_PULL_NO - * @arg @ref LL_GPIO_PULL_UP - * @arg @ref LL_GPIO_PULL_DOWN - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Pull) -{ - MODIFY_REG(GPIOx->PUPDR, (GPIO_PUPDR_PUPDR0 << (POSITION_VAL(Pin) * 2U)), (Pull << (POSITION_VAL(Pin) * 2U))); -} - -/** - * @brief Return gpio pull-up or pull-down for a dedicated pin on a dedicated port - * @note Warning: only one pin can be passed as parameter. - * @rmtoll PUPDR PUPDy LL_GPIO_GetPinPull - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_PULL_NO - * @arg @ref LL_GPIO_PULL_UP - * @arg @ref LL_GPIO_PULL_DOWN - */ -__STATIC_INLINE uint32_t LL_GPIO_GetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->PUPDR, - (GPIO_PUPDR_PUPDR0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); -} - -/** - * @brief Configure gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port. - * @note Possible values are from AF0 to AF15 depending on target. - * @note Warning: only one pin can be passed as parameter. - * @rmtoll AFRL AFSELy LL_GPIO_SetAFPin_0_7 - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @param Alternate This parameter can be one of the following values: - * @arg @ref LL_GPIO_AF_0 - * @arg @ref LL_GPIO_AF_1 - * @arg @ref LL_GPIO_AF_2 - * @arg @ref LL_GPIO_AF_3 - * @arg @ref LL_GPIO_AF_4 - * @arg @ref LL_GPIO_AF_5 - * @arg @ref LL_GPIO_AF_6 - * @arg @ref LL_GPIO_AF_7 - * @arg @ref LL_GPIO_AF_8 - * @arg @ref LL_GPIO_AF_9 - * @arg @ref LL_GPIO_AF_10 - * @arg @ref LL_GPIO_AF_11 - * @arg @ref LL_GPIO_AF_12 - * @arg @ref LL_GPIO_AF_13 - * @arg @ref LL_GPIO_AF_14 - * @arg @ref LL_GPIO_AF_15 - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) -{ - MODIFY_REG(GPIOx->AFR[0], (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * 4U)), - (Alternate << (POSITION_VAL(Pin) * 4U))); -} - -/** - * @brief Return gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port. - * @rmtoll AFRL AFSELy LL_GPIO_GetAFPin_0_7 - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_AF_0 - * @arg @ref LL_GPIO_AF_1 - * @arg @ref LL_GPIO_AF_2 - * @arg @ref LL_GPIO_AF_3 - * @arg @ref LL_GPIO_AF_4 - * @arg @ref LL_GPIO_AF_5 - * @arg @ref LL_GPIO_AF_6 - * @arg @ref LL_GPIO_AF_7 - * @arg @ref LL_GPIO_AF_8 - * @arg @ref LL_GPIO_AF_9 - * @arg @ref LL_GPIO_AF_10 - * @arg @ref LL_GPIO_AF_11 - * @arg @ref LL_GPIO_AF_12 - * @arg @ref LL_GPIO_AF_13 - * @arg @ref LL_GPIO_AF_14 - * @arg @ref LL_GPIO_AF_15 - */ -__STATIC_INLINE uint32_t LL_GPIO_GetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->AFR[0], - (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * 4U))) >> (POSITION_VAL(Pin) * 4U)); -} - -/** - * @brief Configure gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. - * @note Possible values are from AF0 to AF15 depending on target. - * @note Warning: only one pin can be passed as parameter. - * @rmtoll AFRH AFSELy LL_GPIO_SetAFPin_8_15 - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @param Alternate This parameter can be one of the following values: - * @arg @ref LL_GPIO_AF_0 - * @arg @ref LL_GPIO_AF_1 - * @arg @ref LL_GPIO_AF_2 - * @arg @ref LL_GPIO_AF_3 - * @arg @ref LL_GPIO_AF_4 - * @arg @ref LL_GPIO_AF_5 - * @arg @ref LL_GPIO_AF_6 - * @arg @ref LL_GPIO_AF_7 - * @arg @ref LL_GPIO_AF_8 - * @arg @ref LL_GPIO_AF_9 - * @arg @ref LL_GPIO_AF_10 - * @arg @ref LL_GPIO_AF_11 - * @arg @ref LL_GPIO_AF_12 - * @arg @ref LL_GPIO_AF_13 - * @arg @ref LL_GPIO_AF_14 - * @arg @ref LL_GPIO_AF_15 - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) -{ - MODIFY_REG(GPIOx->AFR[1], (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * 4U)), - (Alternate << (POSITION_VAL(Pin >> 8U) * 4U))); -} - -/** - * @brief Return gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. - * @note Possible values are from AF0 to AF15 depending on target. - * @rmtoll AFRH AFSELy LL_GPIO_GetAFPin_8_15 - * @param GPIOx GPIO Port - * @param Pin This parameter can be one of the following values: - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_GPIO_AF_0 - * @arg @ref LL_GPIO_AF_1 - * @arg @ref LL_GPIO_AF_2 - * @arg @ref LL_GPIO_AF_3 - * @arg @ref LL_GPIO_AF_4 - * @arg @ref LL_GPIO_AF_5 - * @arg @ref LL_GPIO_AF_6 - * @arg @ref LL_GPIO_AF_7 - * @arg @ref LL_GPIO_AF_8 - * @arg @ref LL_GPIO_AF_9 - * @arg @ref LL_GPIO_AF_10 - * @arg @ref LL_GPIO_AF_11 - * @arg @ref LL_GPIO_AF_12 - * @arg @ref LL_GPIO_AF_13 - * @arg @ref LL_GPIO_AF_14 - * @arg @ref LL_GPIO_AF_15 - */ -__STATIC_INLINE uint32_t LL_GPIO_GetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->AFR[1], - (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * 4U))) >> (POSITION_VAL(Pin >> 8U) * 4U)); -} - - -/** - * @brief Lock configuration of several pins for a dedicated port. - * @note When the lock sequence has been applied on a port bit, the - * value of this port bit can no longer be modified until the - * next reset. - * @note Each lock bit freezes a specific configuration register - * (control and alternate function registers). - * @rmtoll LCKR LCKK LL_GPIO_LockPin - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void LL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - __IO uint32_t temp; - WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask); - WRITE_REG(GPIOx->LCKR, PinMask); - WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask); - temp = READ_REG(GPIOx->LCKR); - (void) temp; -} - -/** - * @brief Return 1 if all pins passed as parameter, of a dedicated port, are locked. else Return 0. - * @rmtoll LCKR LCKy LL_GPIO_IsPinLocked - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_GPIO_IsPinLocked(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - return (READ_BIT(GPIOx->LCKR, PinMask) == (PinMask)); -} - -/** - * @brief Return 1 if one of the pin of a dedicated port is locked. else return 0. - * @rmtoll LCKR LCKK LL_GPIO_IsAnyPinLocked - * @param GPIOx GPIO Port - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_GPIO_IsAnyPinLocked(GPIO_TypeDef *GPIOx) -{ - return (READ_BIT(GPIOx->LCKR, GPIO_LCKR_LCKK) == (GPIO_LCKR_LCKK)); -} - -/** - * @} - */ - -/** @defgroup GPIO_LL_EF_Data_Access Data Access - * @{ - */ - -/** - * @brief Return full input data register value for a dedicated port. - * @rmtoll IDR IDy LL_GPIO_ReadInputPort - * @param GPIOx GPIO Port - * @retval Input data register value of port - */ -__STATIC_INLINE uint32_t LL_GPIO_ReadInputPort(GPIO_TypeDef *GPIOx) -{ - return (uint32_t)(READ_REG(GPIOx->IDR)); -} - -/** - * @brief Return if input data level for several pins of dedicated port is high or low. - * @rmtoll IDR IDy LL_GPIO_IsInputPinSet - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_GPIO_IsInputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - return (READ_BIT(GPIOx->IDR, PinMask) == (PinMask)); -} - -/** - * @brief Write output data register for the port. - * @rmtoll ODR ODy LL_GPIO_WriteOutputPort - * @param GPIOx GPIO Port - * @param PortValue Level value for each pin of the port - * @retval None - */ -__STATIC_INLINE void LL_GPIO_WriteOutputPort(GPIO_TypeDef *GPIOx, uint32_t PortValue) -{ - WRITE_REG(GPIOx->ODR, PortValue); -} - -/** - * @brief Return full output data register value for a dedicated port. - * @rmtoll ODR ODy LL_GPIO_ReadOutputPort - * @param GPIOx GPIO Port - * @retval Output data register value of port - */ -__STATIC_INLINE uint32_t LL_GPIO_ReadOutputPort(GPIO_TypeDef *GPIOx) -{ - return (uint32_t)(READ_REG(GPIOx->ODR)); -} - -/** - * @brief Return if input data level for several pins of dedicated port is high or low. - * @rmtoll ODR ODy LL_GPIO_IsOutputPinSet - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_GPIO_IsOutputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - return (READ_BIT(GPIOx->ODR, PinMask) == (PinMask)); -} - -/** - * @brief Set several pins to high level on dedicated gpio port. - * @rmtoll BSRR BSy LL_GPIO_SetOutputPin - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - WRITE_REG(GPIOx->BSRR, PinMask); -} - -/** - * @brief Set several pins to low level on dedicated gpio port. - * @rmtoll BSRR BRy LL_GPIO_ResetOutputPin - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void LL_GPIO_ResetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - WRITE_REG(GPIOx->BSRR, (PinMask << 16)); -} - -/** - * @brief Toggle data value for several pin of dedicated port. - * @rmtoll ODR ODy LL_GPIO_TogglePin - * @param GPIOx GPIO Port - * @param PinMask This parameter can be a combination of the following values: - * @arg @ref LL_GPIO_PIN_0 - * @arg @ref LL_GPIO_PIN_1 - * @arg @ref LL_GPIO_PIN_2 - * @arg @ref LL_GPIO_PIN_3 - * @arg @ref LL_GPIO_PIN_4 - * @arg @ref LL_GPIO_PIN_5 - * @arg @ref LL_GPIO_PIN_6 - * @arg @ref LL_GPIO_PIN_7 - * @arg @ref LL_GPIO_PIN_8 - * @arg @ref LL_GPIO_PIN_9 - * @arg @ref LL_GPIO_PIN_10 - * @arg @ref LL_GPIO_PIN_11 - * @arg @ref LL_GPIO_PIN_12 - * @arg @ref LL_GPIO_PIN_13 - * @arg @ref LL_GPIO_PIN_14 - * @arg @ref LL_GPIO_PIN_15 - * @arg @ref LL_GPIO_PIN_ALL - * @retval None - */ -__STATIC_INLINE void LL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint32_t PinMask) -{ - uint32_t odr = READ_REG(GPIOx->ODR); - WRITE_REG(GPIOx->BSRR, ((odr & PinMask) << 16u) | (~odr & PinMask)); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup GPIO_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -ErrorStatus LL_GPIO_DeInit(GPIO_TypeDef *GPIOx); -ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct); -void LL_GPIO_StructInit(LL_GPIO_InitTypeDef *GPIO_InitStruct); - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK) */ -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_GPIO_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h deleted file mode 100644 index 92d4a74..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h +++ /dev/null @@ -1,1890 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_i2c.h - * @author MCD Application Team - * @brief Header file of I2C LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_I2C_H -#define __STM32F4xx_LL_I2C_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (I2C1) || defined (I2C2) || defined (I2C3) - -/** @defgroup I2C_LL I2C - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup I2C_LL_Private_Constants I2C Private Constants - * @{ - */ - -/* Defines used to perform compute and check in the macros */ -#define LL_I2C_MAX_SPEED_STANDARD 100000U -#define LL_I2C_MAX_SPEED_FAST 400000U -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2C_LL_Private_Macros I2C Private Macros - * @{ - */ -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2C_LL_ES_INIT I2C Exported Init structure - * @{ - */ -typedef struct -{ - uint32_t PeripheralMode; /*!< Specifies the peripheral mode. - This parameter can be a value of @ref I2C_LL_EC_PERIPHERAL_MODE - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetMode(). */ - - uint32_t ClockSpeed; /*!< Specifies the clock frequency. - This parameter must be set to a value lower than 400kHz (in Hz) - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetClockPeriod() - or @ref LL_I2C_SetDutyCycle() or @ref LL_I2C_SetClockSpeedMode() or @ref LL_I2C_ConfigSpeed(). */ - - uint32_t DutyCycle; /*!< Specifies the I2C fast mode duty cycle. - This parameter can be a value of @ref I2C_LL_EC_DUTYCYCLE - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetDutyCycle(). */ - -#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) - uint32_t AnalogFilter; /*!< Enables or disables analog noise filter. - This parameter can be a value of @ref I2C_LL_EC_ANALOGFILTER_SELECTION - - This feature can be modified afterwards using unitary functions @ref LL_I2C_EnableAnalogFilter() or LL_I2C_DisableAnalogFilter(). */ - - uint32_t DigitalFilter; /*!< Configures the digital noise filter. - This parameter can be a number between Min_Data = 0x00 and Max_Data = 0x0F - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetDigitalFilter(). */ - -#endif - uint32_t OwnAddress1; /*!< Specifies the device own address 1. - This parameter must be a value between Min_Data = 0x00 and Max_Data = 0x3FF - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetOwnAddress1(). */ - - uint32_t TypeAcknowledge; /*!< Specifies the ACKnowledge or Non ACKnowledge condition after the address receive match code or next received byte. - This parameter can be a value of @ref I2C_LL_EC_I2C_ACKNOWLEDGE - - This feature can be modified afterwards using unitary function @ref LL_I2C_AcknowledgeNextData(). */ - - uint32_t OwnAddrSize; /*!< Specifies the device own address 1 size (7-bit or 10-bit). - This parameter can be a value of @ref I2C_LL_EC_OWNADDRESS1 - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetOwnAddress1(). */ -} LL_I2C_InitTypeDef; -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2C_LL_Exported_Constants I2C Exported Constants - * @{ - */ - -/** @defgroup I2C_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_I2C_ReadReg function - * @{ - */ -#define LL_I2C_SR1_SB I2C_SR1_SB /*!< Start Bit (master mode) */ -#define LL_I2C_SR1_ADDR I2C_SR1_ADDR /*!< Address sent (master mode) or - Address matched flag (slave mode) */ -#define LL_I2C_SR1_BTF I2C_SR1_BTF /*!< Byte Transfer Finished flag */ -#define LL_I2C_SR1_ADD10 I2C_SR1_ADD10 /*!< 10-bit header sent (master mode) */ -#define LL_I2C_SR1_STOPF I2C_SR1_STOPF /*!< Stop detection flag (slave mode) */ -#define LL_I2C_SR1_RXNE I2C_SR1_RXNE /*!< Data register not empty (receivers) */ -#define LL_I2C_SR1_TXE I2C_SR1_TXE /*!< Data register empty (transmitters) */ -#define LL_I2C_SR1_BERR I2C_SR1_BERR /*!< Bus error */ -#define LL_I2C_SR1_ARLO I2C_SR1_ARLO /*!< Arbitration lost */ -#define LL_I2C_SR1_AF I2C_SR1_AF /*!< Acknowledge failure flag */ -#define LL_I2C_SR1_OVR I2C_SR1_OVR /*!< Overrun/Underrun */ -#define LL_I2C_SR1_PECERR I2C_ISR_PECERR /*!< PEC Error in reception (SMBus mode) */ -#define LL_I2C_SR1_TIMEOUT I2C_ISR_TIMEOUT /*!< Timeout detection flag (SMBus mode) */ -#define LL_I2C_SR1_SMALERT I2C_ISR_SMALERT /*!< SMBus alert (SMBus mode) */ -#define LL_I2C_SR2_MSL I2C_SR2_MSL /*!< Master/Slave flag */ -#define LL_I2C_SR2_BUSY I2C_SR2_BUSY /*!< Bus busy flag */ -#define LL_I2C_SR2_TRA I2C_SR2_TRA /*!< Transmitter/receiver direction */ -#define LL_I2C_SR2_GENCALL I2C_SR2_GENCALL /*!< General call address (Slave mode) */ -#define LL_I2C_SR2_SMBDEFAULT I2C_SR2_SMBDEFAULT /*!< SMBus Device default address (Slave mode) */ -#define LL_I2C_SR2_SMBHOST I2C_SR2_SMBHOST /*!< SMBus Host address (Slave mode) */ -#define LL_I2C_SR2_DUALF I2C_SR2_DUALF /*!< Dual flag (Slave mode) */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_I2C_ReadReg and LL_I2C_WriteReg functions - * @{ - */ -#define LL_I2C_CR2_ITEVTEN I2C_CR2_ITEVTEN /*!< Events interrupts enable */ -#define LL_I2C_CR2_ITBUFEN I2C_CR2_ITBUFEN /*!< Buffer interrupts enable */ -#define LL_I2C_CR2_ITERREN I2C_CR2_ITERREN /*!< Error interrupts enable */ -/** - * @} - */ - -#if defined(I2C_FLTR_ANOFF) -/** @defgroup I2C_LL_EC_ANALOGFILTER_SELECTION Analog Filter Selection - * @{ - */ -#define LL_I2C_ANALOGFILTER_ENABLE 0x00000000U /*!< Analog filter is enabled. */ -#define LL_I2C_ANALOGFILTER_DISABLE I2C_FLTR_ANOFF /*!< Analog filter is disabled.*/ -/** - * @} - */ - -#endif -/** @defgroup I2C_LL_EC_OWNADDRESS1 Own Address 1 Length - * @{ - */ -#define LL_I2C_OWNADDRESS1_7BIT 0x00004000U /*!< Own address 1 is a 7-bit address. */ -#define LL_I2C_OWNADDRESS1_10BIT (uint32_t)(I2C_OAR1_ADDMODE | 0x00004000U) /*!< Own address 1 is a 10-bit address. */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_DUTYCYCLE Fast Mode Duty Cycle - * @{ - */ -#define LL_I2C_DUTYCYCLE_2 0x00000000U /*!< I2C fast mode Tlow/Thigh = 2 */ -#define LL_I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY /*!< I2C fast mode Tlow/Thigh = 16/9 */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_CLOCK_SPEED_MODE Master Clock Speed Mode - * @{ - */ -#define LL_I2C_CLOCK_SPEED_STANDARD_MODE 0x00000000U /*!< Master clock speed range is standard mode */ -#define LL_I2C_CLOCK_SPEED_FAST_MODE I2C_CCR_FS /*!< Master clock speed range is fast mode */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_PERIPHERAL_MODE Peripheral Mode - * @{ - */ -#define LL_I2C_MODE_I2C 0x00000000U /*!< I2C Master or Slave mode */ -#define LL_I2C_MODE_SMBUS_HOST (uint32_t)(I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP) /*!< SMBus Host address acknowledge */ -#define LL_I2C_MODE_SMBUS_DEVICE I2C_CR1_SMBUS /*!< SMBus Device default mode (Default address not acknowledge) */ -#define LL_I2C_MODE_SMBUS_DEVICE_ARP (uint32_t)(I2C_CR1_SMBUS | I2C_CR1_ENARP) /*!< SMBus Device Default address acknowledge */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_I2C_ACKNOWLEDGE Acknowledge Generation - * @{ - */ -#define LL_I2C_ACK I2C_CR1_ACK /*!< ACK is sent after current received byte. */ -#define LL_I2C_NACK 0x00000000U /*!< NACK is sent after current received byte.*/ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_DIRECTION Read Write Direction - * @{ - */ -#define LL_I2C_DIRECTION_WRITE I2C_SR2_TRA /*!< Bus is in write transfer */ -#define LL_I2C_DIRECTION_READ 0x00000000U /*!< Bus is in read transfer */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup I2C_LL_Exported_Macros I2C Exported Macros - * @{ - */ - -/** @defgroup I2C_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in I2C register - * @param __INSTANCE__ I2C Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_I2C_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in I2C register - * @param __INSTANCE__ I2C Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_I2C_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** @defgroup I2C_LL_EM_Exported_Macros_Helper Exported Macros Helper - * @{ - */ - -/** - * @brief Convert Peripheral Clock Frequency in Mhz. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). - * @retval Value of peripheral clock (in Mhz) - */ -#define __LL_I2C_FREQ_HZ_TO_MHZ(__PCLK__) (uint32_t)((__PCLK__)/1000000U) - -/** - * @brief Convert Peripheral Clock Frequency in Hz. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Mhz). - * @retval Value of peripheral clock (in Hz) - */ -#define __LL_I2C_FREQ_MHZ_TO_HZ(__PCLK__) (uint32_t)((__PCLK__)*1000000U) - -/** - * @brief Compute I2C Clock rising time. - * @param __FREQRANGE__ This parameter must be a value of peripheral clock (in Mhz). - * @param __SPEED__ This parameter must be a value lower than 400kHz (in Hz). - * @retval Value between Min_Data=0x02 and Max_Data=0x3F - */ -#define __LL_I2C_RISE_TIME(__FREQRANGE__, __SPEED__) (uint32_t)(((__SPEED__) <= LL_I2C_MAX_SPEED_STANDARD) ? ((__FREQRANGE__) + 1U) : ((((__FREQRANGE__) * 300U) / 1000U) + 1U)) - -/** - * @brief Compute Speed clock range to a Clock Control Register (I2C_CCR_CCR) value. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). - * @param __SPEED__ This parameter must be a value lower than 400kHz (in Hz). - * @param __DUTYCYCLE__ This parameter can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - * @retval Value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. - */ -#define __LL_I2C_SPEED_TO_CCR(__PCLK__, __SPEED__, __DUTYCYCLE__) (uint32_t)(((__SPEED__) <= LL_I2C_MAX_SPEED_STANDARD)? \ - (__LL_I2C_SPEED_STANDARD_TO_CCR((__PCLK__), (__SPEED__))) : \ - (__LL_I2C_SPEED_FAST_TO_CCR((__PCLK__), (__SPEED__), (__DUTYCYCLE__)))) - -/** - * @brief Compute Speed Standard clock range to a Clock Control Register (I2C_CCR_CCR) value. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). - * @param __SPEED__ This parameter must be a value lower than 100kHz (in Hz). - * @retval Value between Min_Data=0x004 and Max_Data=0xFFF. - */ -#define __LL_I2C_SPEED_STANDARD_TO_CCR(__PCLK__, __SPEED__) (uint32_t)(((((__PCLK__)/((__SPEED__) << 1U)) & I2C_CCR_CCR) < 4U)? 4U:((__PCLK__) / ((__SPEED__) << 1U))) - -/** - * @brief Compute Speed Fast clock range to a Clock Control Register (I2C_CCR_CCR) value. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). - * @param __SPEED__ This parameter must be a value between Min_Data=100Khz and Max_Data=400Khz (in Hz). - * @param __DUTYCYCLE__ This parameter can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - * @retval Value between Min_Data=0x001 and Max_Data=0xFFF - */ -#define __LL_I2C_SPEED_FAST_TO_CCR(__PCLK__, __SPEED__, __DUTYCYCLE__) (uint32_t)(((__DUTYCYCLE__) == LL_I2C_DUTYCYCLE_2)? \ - (((((__PCLK__) / ((__SPEED__) * 3U)) & I2C_CCR_CCR) == 0U)? 1U:((__PCLK__) / ((__SPEED__) * 3U))) : \ - (((((__PCLK__) / ((__SPEED__) * 25U)) & I2C_CCR_CCR) == 0U)? 1U:((__PCLK__) / ((__SPEED__) * 25U)))) - -/** - * @brief Get the Least significant bits of a 10-Bits address. - * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. - * @retval Value between Min_Data=0x00 and Max_Data=0xFF - */ -#define __LL_I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FF)))) - -/** - * @brief Convert a 10-Bits address to a 10-Bits header with Write direction. - * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. - * @retval Value between Min_Data=0xF0 and Max_Data=0xF6 - */ -#define __LL_I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300))) >> 7) | (uint16_t)(0xF0)))) - -/** - * @brief Convert a 10-Bits address to a 10-Bits header with Read direction. - * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. - * @retval Value between Min_Data=0xF1 and Max_Data=0xF7 - */ -#define __LL_I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300))) >> 7) | (uint16_t)(0xF1)))) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup I2C_LL_Exported_Functions I2C Exported Functions - * @{ - */ - -/** @defgroup I2C_LL_EF_Configuration Configuration - * @{ - */ - -/** - * @brief Enable I2C peripheral (PE = 1). - * @rmtoll CR1 PE LL_I2C_Enable - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_Enable(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_PE); -} - -/** - * @brief Disable I2C peripheral (PE = 0). - * @rmtoll CR1 PE LL_I2C_Disable - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_Disable(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_PE); -} - -/** - * @brief Check if the I2C peripheral is enabled or disabled. - * @rmtoll CR1 PE LL_I2C_IsEnabled - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabled(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_PE) == (I2C_CR1_PE)); -} - -#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) -/** - * @brief Configure Noise Filters (Analog and Digital). - * @note If the analog filter is also enabled, the digital filter is added to analog filter. - * The filters can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll FLTR ANOFF LL_I2C_ConfigFilters\n - * FLTR DNF LL_I2C_ConfigFilters - * @param I2Cx I2C Instance. - * @param AnalogFilter This parameter can be one of the following values: - * @arg @ref LL_I2C_ANALOGFILTER_ENABLE - * @arg @ref LL_I2C_ANALOGFILTER_DISABLE - * @param DigitalFilter This parameter must be a value between Min_Data=0x00 (Digital filter disabled) and Max_Data=0x0F (Digital filter enabled and filtering capability up to 15*TPCLK1) - * This parameter is used to configure the digital noise filter on SDA and SCL input. The digital filter will suppress the spikes with a length of up to DNF[3:0]*TPCLK1. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ConfigFilters(I2C_TypeDef *I2Cx, uint32_t AnalogFilter, uint32_t DigitalFilter) -{ - MODIFY_REG(I2Cx->FLTR, I2C_FLTR_ANOFF | I2C_FLTR_DNF, AnalogFilter | DigitalFilter); -} -#endif -#if defined(I2C_FLTR_DNF) - -/** - * @brief Configure Digital Noise Filter. - * @note If the analog filter is also enabled, the digital filter is added to analog filter. - * This filter can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll FLTR DNF LL_I2C_SetDigitalFilter - * @param I2Cx I2C Instance. - * @param DigitalFilter This parameter must be a value between Min_Data=0x00 (Digital filter disabled) and Max_Data=0x0F (Digital filter enabled and filtering capability up to 15*TPCLK1) - * This parameter is used to configure the digital noise filter on SDA and SCL input. The digital filter will suppress the spikes with a length of up to DNF[3:0]*TPCLK1. - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetDigitalFilter(I2C_TypeDef *I2Cx, uint32_t DigitalFilter) -{ - MODIFY_REG(I2Cx->FLTR, I2C_FLTR_DNF, DigitalFilter); -} - -/** - * @brief Get the current Digital Noise Filter configuration. - * @rmtoll FLTR DNF LL_I2C_GetDigitalFilter - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x0 and Max_Data=0xF - */ -__STATIC_INLINE uint32_t LL_I2C_GetDigitalFilter(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->FLTR, I2C_FLTR_DNF)); -} -#endif -#if defined(I2C_FLTR_ANOFF) - -/** - * @brief Enable Analog Noise Filter. - * @note This filter can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll FLTR ANOFF LL_I2C_EnableAnalogFilter - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableAnalogFilter(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF); -} - -/** - * @brief Disable Analog Noise Filter. - * @note This filter can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll FLTR ANOFF LL_I2C_DisableAnalogFilter - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableAnalogFilter(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF); -} - -/** - * @brief Check if Analog Noise Filter is enabled or disabled. - * @rmtoll FLTR ANOFF LL_I2C_IsEnabledAnalogFilter - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledAnalogFilter(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF) == (I2C_FLTR_ANOFF)); -} -#endif - -/** - * @brief Enable DMA transmission requests. - * @rmtoll CR2 DMAEN LL_I2C_EnableDMAReq_TX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableDMAReq_TX(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_DMAEN); -} - -/** - * @brief Disable DMA transmission requests. - * @rmtoll CR2 DMAEN LL_I2C_DisableDMAReq_TX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableDMAReq_TX(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_DMAEN); -} - -/** - * @brief Check if DMA transmission requests are enabled or disabled. - * @rmtoll CR2 DMAEN LL_I2C_IsEnabledDMAReq_TX - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledDMAReq_TX(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_DMAEN) == (I2C_CR2_DMAEN)); -} - -/** - * @brief Enable DMA reception requests. - * @rmtoll CR2 DMAEN LL_I2C_EnableDMAReq_RX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableDMAReq_RX(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_DMAEN); -} - -/** - * @brief Disable DMA reception requests. - * @rmtoll CR2 DMAEN LL_I2C_DisableDMAReq_RX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableDMAReq_RX(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_DMAEN); -} - -/** - * @brief Check if DMA reception requests are enabled or disabled. - * @rmtoll CR2 DMAEN LL_I2C_IsEnabledDMAReq_RX - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledDMAReq_RX(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_DMAEN) == (I2C_CR2_DMAEN)); -} - -/** - * @brief Get the data register address used for DMA transfer. - * @rmtoll DR DR LL_I2C_DMA_GetRegAddr - * @param I2Cx I2C Instance. - * @retval Address of data register - */ -__STATIC_INLINE uint32_t LL_I2C_DMA_GetRegAddr(I2C_TypeDef *I2Cx) -{ - return (uint32_t) & (I2Cx->DR); -} - -/** - * @brief Enable Clock stretching. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll CR1 NOSTRETCH LL_I2C_EnableClockStretching - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableClockStretching(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH); -} - -/** - * @brief Disable Clock stretching. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll CR1 NOSTRETCH LL_I2C_DisableClockStretching - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableClockStretching(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH); -} - -/** - * @brief Check if Clock stretching is enabled or disabled. - * @rmtoll CR1 NOSTRETCH LL_I2C_IsEnabledClockStretching - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledClockStretching(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH) != (I2C_CR1_NOSTRETCH)); -} - -/** - * @brief Enable General Call. - * @note When enabled the Address 0x00 is ACKed. - * @rmtoll CR1 ENGC LL_I2C_EnableGeneralCall - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableGeneralCall(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_ENGC); -} - -/** - * @brief Disable General Call. - * @note When disabled the Address 0x00 is NACKed. - * @rmtoll CR1 ENGC LL_I2C_DisableGeneralCall - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableGeneralCall(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_ENGC); -} - -/** - * @brief Check if General Call is enabled or disabled. - * @rmtoll CR1 ENGC LL_I2C_IsEnabledGeneralCall - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledGeneralCall(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_ENGC) == (I2C_CR1_ENGC)); -} - -/** - * @brief Set the Own Address1. - * @rmtoll OAR1 ADD0 LL_I2C_SetOwnAddress1\n - * OAR1 ADD1_7 LL_I2C_SetOwnAddress1\n - * OAR1 ADD8_9 LL_I2C_SetOwnAddress1\n - * OAR1 ADDMODE LL_I2C_SetOwnAddress1 - * @param I2Cx I2C Instance. - * @param OwnAddress1 This parameter must be a value between Min_Data=0 and Max_Data=0x3FF. - * @param OwnAddrSize This parameter can be one of the following values: - * @arg @ref LL_I2C_OWNADDRESS1_7BIT - * @arg @ref LL_I2C_OWNADDRESS1_10BIT - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetOwnAddress1(I2C_TypeDef *I2Cx, uint32_t OwnAddress1, uint32_t OwnAddrSize) -{ - MODIFY_REG(I2Cx->OAR1, I2C_OAR1_ADD0 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD8_9 | I2C_OAR1_ADDMODE, OwnAddress1 | OwnAddrSize); -} - -/** - * @brief Set the 7bits Own Address2. - * @note This action has no effect if own address2 is enabled. - * @rmtoll OAR2 ADD2 LL_I2C_SetOwnAddress2 - * @param I2Cx I2C Instance. - * @param OwnAddress2 This parameter must be a value between Min_Data=0 and Max_Data=0x7F. - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetOwnAddress2(I2C_TypeDef *I2Cx, uint32_t OwnAddress2) -{ - MODIFY_REG(I2Cx->OAR2, I2C_OAR2_ADD2, OwnAddress2); -} - -/** - * @brief Enable acknowledge on Own Address2 match address. - * @rmtoll OAR2 ENDUAL LL_I2C_EnableOwnAddress2 - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableOwnAddress2(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL); -} - -/** - * @brief Disable acknowledge on Own Address2 match address. - * @rmtoll OAR2 ENDUAL LL_I2C_DisableOwnAddress2 - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableOwnAddress2(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL); -} - -/** - * @brief Check if Own Address1 acknowledge is enabled or disabled. - * @rmtoll OAR2 ENDUAL LL_I2C_IsEnabledOwnAddress2 - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledOwnAddress2(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL) == (I2C_OAR2_ENDUAL)); -} - -/** - * @brief Configure the Peripheral clock frequency. - * @rmtoll CR2 FREQ LL_I2C_SetPeriphClock - * @param I2Cx I2C Instance. - * @param PeriphClock Peripheral Clock (in Hz) - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetPeriphClock(I2C_TypeDef *I2Cx, uint32_t PeriphClock) -{ - MODIFY_REG(I2Cx->CR2, I2C_CR2_FREQ, __LL_I2C_FREQ_HZ_TO_MHZ(PeriphClock)); -} - -/** - * @brief Get the Peripheral clock frequency. - * @rmtoll CR2 FREQ LL_I2C_GetPeriphClock - * @param I2Cx I2C Instance. - * @retval Value of Peripheral Clock (in Hz) - */ -__STATIC_INLINE uint32_t LL_I2C_GetPeriphClock(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(__LL_I2C_FREQ_MHZ_TO_HZ(READ_BIT(I2Cx->CR2, I2C_CR2_FREQ))); -} - -/** - * @brief Configure the Duty cycle (Fast mode only). - * @rmtoll CCR DUTY LL_I2C_SetDutyCycle - * @param I2Cx I2C Instance. - * @param DutyCycle This parameter can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetDutyCycle(I2C_TypeDef *I2Cx, uint32_t DutyCycle) -{ - MODIFY_REG(I2Cx->CCR, I2C_CCR_DUTY, DutyCycle); -} - -/** - * @brief Get the Duty cycle (Fast mode only). - * @rmtoll CCR DUTY LL_I2C_GetDutyCycle - * @param I2Cx I2C Instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - */ -__STATIC_INLINE uint32_t LL_I2C_GetDutyCycle(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_DUTY)); -} - -/** - * @brief Configure the I2C master clock speed mode. - * @rmtoll CCR FS LL_I2C_SetClockSpeedMode - * @param I2Cx I2C Instance. - * @param ClockSpeedMode This parameter can be one of the following values: - * @arg @ref LL_I2C_CLOCK_SPEED_STANDARD_MODE - * @arg @ref LL_I2C_CLOCK_SPEED_FAST_MODE - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetClockSpeedMode(I2C_TypeDef *I2Cx, uint32_t ClockSpeedMode) -{ - MODIFY_REG(I2Cx->CCR, I2C_CCR_FS, ClockSpeedMode); -} - -/** - * @brief Get the the I2C master speed mode. - * @rmtoll CCR FS LL_I2C_GetClockSpeedMode - * @param I2Cx I2C Instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_CLOCK_SPEED_STANDARD_MODE - * @arg @ref LL_I2C_CLOCK_SPEED_FAST_MODE - */ -__STATIC_INLINE uint32_t LL_I2C_GetClockSpeedMode(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_FS)); -} - -/** - * @brief Configure the SCL, SDA rising time. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll TRISE TRISE LL_I2C_SetRiseTime - * @param I2Cx I2C Instance. - * @param RiseTime This parameter must be a value between Min_Data=0x02 and Max_Data=0x3F. - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetRiseTime(I2C_TypeDef *I2Cx, uint32_t RiseTime) -{ - MODIFY_REG(I2Cx->TRISE, I2C_TRISE_TRISE, RiseTime); -} - -/** - * @brief Get the SCL, SDA rising time. - * @rmtoll TRISE TRISE LL_I2C_GetRiseTime - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x02 and Max_Data=0x3F - */ -__STATIC_INLINE uint32_t LL_I2C_GetRiseTime(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->TRISE, I2C_TRISE_TRISE)); -} - -/** - * @brief Configure the SCL high and low period. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll CCR CCR LL_I2C_SetClockPeriod - * @param I2Cx I2C Instance. - * @param ClockPeriod This parameter must be a value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetClockPeriod(I2C_TypeDef *I2Cx, uint32_t ClockPeriod) -{ - MODIFY_REG(I2Cx->CCR, I2C_CCR_CCR, ClockPeriod); -} - -/** - * @brief Get the SCL high and low period. - * @rmtoll CCR CCR LL_I2C_GetClockPeriod - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. - */ -__STATIC_INLINE uint32_t LL_I2C_GetClockPeriod(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_CCR)); -} - -/** - * @brief Configure the SCL speed. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll CR2 FREQ LL_I2C_ConfigSpeed\n - * TRISE TRISE LL_I2C_ConfigSpeed\n - * CCR FS LL_I2C_ConfigSpeed\n - * CCR DUTY LL_I2C_ConfigSpeed\n - * CCR CCR LL_I2C_ConfigSpeed - * @param I2Cx I2C Instance. - * @param PeriphClock Peripheral Clock (in Hz) - * @param ClockSpeed This parameter must be a value lower than 400kHz (in Hz). - * @param DutyCycle This parameter can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - * @retval None - */ -__STATIC_INLINE void LL_I2C_ConfigSpeed(I2C_TypeDef *I2Cx, uint32_t PeriphClock, uint32_t ClockSpeed, - uint32_t DutyCycle) -{ - uint32_t freqrange = 0x0U; - uint32_t clockconfig = 0x0U; - - /* Compute frequency range */ - freqrange = __LL_I2C_FREQ_HZ_TO_MHZ(PeriphClock); - - /* Configure I2Cx: Frequency range register */ - MODIFY_REG(I2Cx->CR2, I2C_CR2_FREQ, freqrange); - - /* Configure I2Cx: Rise Time register */ - MODIFY_REG(I2Cx->TRISE, I2C_TRISE_TRISE, __LL_I2C_RISE_TIME(freqrange, ClockSpeed)); - - /* Configure Speed mode, Duty Cycle and Clock control register value */ - if (ClockSpeed > LL_I2C_MAX_SPEED_STANDARD) - { - /* Set Speed mode at fast and duty cycle for Clock Speed request in fast clock range */ - clockconfig = LL_I2C_CLOCK_SPEED_FAST_MODE | \ - __LL_I2C_SPEED_FAST_TO_CCR(PeriphClock, ClockSpeed, DutyCycle) | \ - DutyCycle; - } - else - { - /* Set Speed mode at standard for Clock Speed request in standard clock range */ - clockconfig = LL_I2C_CLOCK_SPEED_STANDARD_MODE | \ - __LL_I2C_SPEED_STANDARD_TO_CCR(PeriphClock, ClockSpeed); - } - - /* Configure I2Cx: Clock control register */ - MODIFY_REG(I2Cx->CCR, (I2C_CCR_FS | I2C_CCR_DUTY | I2C_CCR_CCR), clockconfig); -} - -/** - * @brief Configure peripheral mode. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 SMBUS LL_I2C_SetMode\n - * CR1 SMBTYPE LL_I2C_SetMode\n - * CR1 ENARP LL_I2C_SetMode - * @param I2Cx I2C Instance. - * @param PeripheralMode This parameter can be one of the following values: - * @arg @ref LL_I2C_MODE_I2C - * @arg @ref LL_I2C_MODE_SMBUS_HOST - * @arg @ref LL_I2C_MODE_SMBUS_DEVICE - * @arg @ref LL_I2C_MODE_SMBUS_DEVICE_ARP - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetMode(I2C_TypeDef *I2Cx, uint32_t PeripheralMode) -{ - MODIFY_REG(I2Cx->CR1, I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP, PeripheralMode); -} - -/** - * @brief Get peripheral mode. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 SMBUS LL_I2C_GetMode\n - * CR1 SMBTYPE LL_I2C_GetMode\n - * CR1 ENARP LL_I2C_GetMode - * @param I2Cx I2C Instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_MODE_I2C - * @arg @ref LL_I2C_MODE_SMBUS_HOST - * @arg @ref LL_I2C_MODE_SMBUS_DEVICE - * @arg @ref LL_I2C_MODE_SMBUS_DEVICE_ARP - */ -__STATIC_INLINE uint32_t LL_I2C_GetMode(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->CR1, I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP)); -} - -/** - * @brief Enable SMBus alert (Host or Device mode) - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note SMBus Device mode: - * - SMBus Alert pin is drived low and - * Alert Response Address Header acknowledge is enabled. - * SMBus Host mode: - * - SMBus Alert pin management is supported. - * @rmtoll CR1 ALERT LL_I2C_EnableSMBusAlert - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableSMBusAlert(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_ALERT); -} - -/** - * @brief Disable SMBus alert (Host or Device mode) - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note SMBus Device mode: - * - SMBus Alert pin is not drived (can be used as a standard GPIO) and - * Alert Response Address Header acknowledge is disabled. - * SMBus Host mode: - * - SMBus Alert pin management is not supported. - * @rmtoll CR1 ALERT LL_I2C_DisableSMBusAlert - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableSMBusAlert(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_ALERT); -} - -/** - * @brief Check if SMBus alert (Host or Device mode) is enabled or disabled. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 ALERT LL_I2C_IsEnabledSMBusAlert - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusAlert(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_ALERT) == (I2C_CR1_ALERT)); -} - -/** - * @brief Enable SMBus Packet Error Calculation (PEC). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 ENPEC LL_I2C_EnableSMBusPEC - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableSMBusPEC(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_ENPEC); -} - -/** - * @brief Disable SMBus Packet Error Calculation (PEC). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 ENPEC LL_I2C_DisableSMBusPEC - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableSMBusPEC(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_ENPEC); -} - -/** - * @brief Check if SMBus Packet Error Calculation (PEC) is enabled or disabled. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 ENPEC LL_I2C_IsEnabledSMBusPEC - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusPEC(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_ENPEC) == (I2C_CR1_ENPEC)); -} - -/** - * @} - */ - -/** @defgroup I2C_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable TXE interrupt. - * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_TX\n - * CR2 ITBUFEN LL_I2C_EnableIT_TX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_TX(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); -} - -/** - * @brief Disable TXE interrupt. - * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_TX\n - * CR2 ITBUFEN LL_I2C_DisableIT_TX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_TX(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); -} - -/** - * @brief Check if the TXE Interrupt is enabled or disabled. - * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_TX\n - * CR2 ITBUFEN LL_I2C_IsEnabledIT_TX - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_TX(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN) == (I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN)); -} - -/** - * @brief Enable RXNE interrupt. - * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_RX\n - * CR2 ITBUFEN LL_I2C_EnableIT_RX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_RX(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); -} - -/** - * @brief Disable RXNE interrupt. - * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_RX\n - * CR2 ITBUFEN LL_I2C_DisableIT_RX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_RX(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); -} - -/** - * @brief Check if the RXNE Interrupt is enabled or disabled. - * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_RX\n - * CR2 ITBUFEN LL_I2C_IsEnabledIT_RX - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_RX(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN) == (I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN)); -} - -/** - * @brief Enable Events interrupts. - * @note Any of these events will generate interrupt : - * Start Bit (SB) - * Address sent, Address matched (ADDR) - * 10-bit header sent (ADD10) - * Stop detection (STOPF) - * Byte transfer finished (BTF) - * - * @note Any of these events will generate interrupt if Buffer interrupts are enabled too(using unitary function @ref LL_I2C_EnableIT_BUF()) : - * Receive buffer not empty (RXNE) - * Transmit buffer empty (TXE) - * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_EVT - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_EVT(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN); -} - -/** - * @brief Disable Events interrupts. - * @note Any of these events will generate interrupt : - * Start Bit (SB) - * Address sent, Address matched (ADDR) - * 10-bit header sent (ADD10) - * Stop detection (STOPF) - * Byte transfer finished (BTF) - * Receive buffer not empty (RXNE) - * Transmit buffer empty (TXE) - * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_EVT - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_EVT(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN); -} - -/** - * @brief Check if Events interrupts are enabled or disabled. - * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_EVT - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_EVT(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN) == (I2C_CR2_ITEVTEN)); -} - -/** - * @brief Enable Buffer interrupts. - * @note Any of these Buffer events will generate interrupt if Events interrupts are enabled too(using unitary function @ref LL_I2C_EnableIT_EVT()) : - * Receive buffer not empty (RXNE) - * Transmit buffer empty (TXE) - * @rmtoll CR2 ITBUFEN LL_I2C_EnableIT_BUF - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_BUF(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN); -} - -/** - * @brief Disable Buffer interrupts. - * @note Any of these Buffer events will generate interrupt : - * Receive buffer not empty (RXNE) - * Transmit buffer empty (TXE) - * @rmtoll CR2 ITBUFEN LL_I2C_DisableIT_BUF - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_BUF(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN); -} - -/** - * @brief Check if Buffer interrupts are enabled or disabled. - * @rmtoll CR2 ITBUFEN LL_I2C_IsEnabledIT_BUF - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_BUF(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN) == (I2C_CR2_ITBUFEN)); -} - -/** - * @brief Enable Error interrupts. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note Any of these errors will generate interrupt : - * Bus Error detection (BERR) - * Arbitration Loss (ARLO) - * Acknowledge Failure(AF) - * Overrun/Underrun (OVR) - * SMBus Timeout detection (TIMEOUT) - * SMBus PEC error detection (PECERR) - * SMBus Alert pin event detection (SMBALERT) - * @rmtoll CR2 ITERREN LL_I2C_EnableIT_ERR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_ERR(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITERREN); -} - -/** - * @brief Disable Error interrupts. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note Any of these errors will generate interrupt : - * Bus Error detection (BERR) - * Arbitration Loss (ARLO) - * Acknowledge Failure(AF) - * Overrun/Underrun (OVR) - * SMBus Timeout detection (TIMEOUT) - * SMBus PEC error detection (PECERR) - * SMBus Alert pin event detection (SMBALERT) - * @rmtoll CR2 ITERREN LL_I2C_DisableIT_ERR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_ERR(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITERREN); -} - -/** - * @brief Check if Error interrupts are enabled or disabled. - * @rmtoll CR2 ITERREN LL_I2C_IsEnabledIT_ERR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_ERR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITERREN) == (I2C_CR2_ITERREN)); -} - -/** - * @} - */ - -/** @defgroup I2C_LL_EF_FLAG_management FLAG_management - * @{ - */ - -/** - * @brief Indicate the status of Transmit data register empty flag. - * @note RESET: When next data is written in Transmit data register. - * SET: When Transmit data register is empty. - * @rmtoll SR1 TXE LL_I2C_IsActiveFlag_TXE - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_TXE(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_TXE) == (I2C_SR1_TXE)); -} - -/** - * @brief Indicate the status of Byte Transfer Finished flag. - * RESET: When Data byte transfer not done. - * SET: When Data byte transfer succeeded. - * @rmtoll SR1 BTF LL_I2C_IsActiveFlag_BTF - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BTF(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_BTF) == (I2C_SR1_BTF)); -} - -/** - * @brief Indicate the status of Receive data register not empty flag. - * @note RESET: When Receive data register is read. - * SET: When the received data is copied in Receive data register. - * @rmtoll SR1 RXNE LL_I2C_IsActiveFlag_RXNE - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_RXNE(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_RXNE) == (I2C_SR1_RXNE)); -} - -/** - * @brief Indicate the status of Start Bit (master mode). - * @note RESET: When No Start condition. - * SET: When Start condition is generated. - * @rmtoll SR1 SB LL_I2C_IsActiveFlag_SB - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_SB(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_SB) == (I2C_SR1_SB)); -} - -/** - * @brief Indicate the status of Address sent (master mode) or Address matched flag (slave mode). - * @note RESET: Clear default value. - * SET: When the address is fully sent (master mode) or when the received slave address matched with one of the enabled slave address (slave mode). - * @rmtoll SR1 ADDR LL_I2C_IsActiveFlag_ADDR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ADDR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_ADDR) == (I2C_SR1_ADDR)); -} - -/** - * @brief Indicate the status of 10-bit header sent (master mode). - * @note RESET: When no ADD10 event occurred. - * SET: When the master has sent the first address byte (header). - * @rmtoll SR1 ADD10 LL_I2C_IsActiveFlag_ADD10 - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ADD10(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_ADD10) == (I2C_SR1_ADD10)); -} - -/** - * @brief Indicate the status of Acknowledge failure flag. - * @note RESET: No acknowledge failure. - * SET: When an acknowledge failure is received after a byte transmission. - * @rmtoll SR1 AF LL_I2C_IsActiveFlag_AF - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_AF(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_AF) == (I2C_SR1_AF)); -} - -/** - * @brief Indicate the status of Stop detection flag (slave mode). - * @note RESET: Clear default value. - * SET: When a Stop condition is detected. - * @rmtoll SR1 STOPF LL_I2C_IsActiveFlag_STOP - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_STOP(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_STOPF) == (I2C_SR1_STOPF)); -} - -/** - * @brief Indicate the status of Bus error flag. - * @note RESET: Clear default value. - * SET: When a misplaced Start or Stop condition is detected. - * @rmtoll SR1 BERR LL_I2C_IsActiveFlag_BERR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BERR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_BERR) == (I2C_SR1_BERR)); -} - -/** - * @brief Indicate the status of Arbitration lost flag. - * @note RESET: Clear default value. - * SET: When arbitration lost. - * @rmtoll SR1 ARLO LL_I2C_IsActiveFlag_ARLO - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ARLO(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_ARLO) == (I2C_SR1_ARLO)); -} - -/** - * @brief Indicate the status of Overrun/Underrun flag. - * @note RESET: Clear default value. - * SET: When an overrun/underrun error occurs (Clock Stretching Disabled). - * @rmtoll SR1 OVR LL_I2C_IsActiveFlag_OVR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_OVR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_OVR) == (I2C_SR1_OVR)); -} - -/** - * @brief Indicate the status of SMBus PEC error flag in reception. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 PECERR LL_I2C_IsActiveSMBusFlag_PECERR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_PECERR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_PECERR) == (I2C_SR1_PECERR)); -} - -/** - * @brief Indicate the status of SMBus Timeout detection flag. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 TIMEOUT LL_I2C_IsActiveSMBusFlag_TIMEOUT - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_TIMEOUT(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_TIMEOUT) == (I2C_SR1_TIMEOUT)); -} - -/** - * @brief Indicate the status of SMBus alert flag. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 SMBALERT LL_I2C_IsActiveSMBusFlag_ALERT - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_ALERT(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_SMBALERT) == (I2C_SR1_SMBALERT)); -} - -/** - * @brief Indicate the status of Bus Busy flag. - * @note RESET: Clear default value. - * SET: When a Start condition is detected. - * @rmtoll SR2 BUSY LL_I2C_IsActiveFlag_BUSY - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BUSY(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_BUSY) == (I2C_SR2_BUSY)); -} - -/** - * @brief Indicate the status of Dual flag. - * @note RESET: Received address matched with OAR1. - * SET: Received address matched with OAR2. - * @rmtoll SR2 DUALF LL_I2C_IsActiveFlag_DUAL - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_DUAL(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_DUALF) == (I2C_SR2_DUALF)); -} - -/** - * @brief Indicate the status of SMBus Host address reception (Slave mode). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note RESET: No SMBus Host address - * SET: SMBus Host address received. - * @note This status is cleared by hardware after a STOP condition or repeated START condition. - * @rmtoll SR2 SMBHOST LL_I2C_IsActiveSMBusFlag_SMBHOST - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_SMBHOST(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_SMBHOST) == (I2C_SR2_SMBHOST)); -} - -/** - * @brief Indicate the status of SMBus Device default address reception (Slave mode). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note RESET: No SMBus Device default address - * SET: SMBus Device default address received. - * @note This status is cleared by hardware after a STOP condition or repeated START condition. - * @rmtoll SR2 SMBDEFAULT LL_I2C_IsActiveSMBusFlag_SMBDEFAULT - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_SMBDEFAULT(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_SMBDEFAULT) == (I2C_SR2_SMBDEFAULT)); -} - -/** - * @brief Indicate the status of General call address reception (Slave mode). - * @note RESET: No General call address - * SET: General call address received. - * @note This status is cleared by hardware after a STOP condition or repeated START condition. - * @rmtoll SR2 GENCALL LL_I2C_IsActiveFlag_GENCALL - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_GENCALL(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_GENCALL) == (I2C_SR2_GENCALL)); -} - -/** - * @brief Indicate the status of Master/Slave flag. - * @note RESET: Slave Mode. - * SET: Master Mode. - * @rmtoll SR2 MSL LL_I2C_IsActiveFlag_MSL - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_MSL(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_MSL) == (I2C_SR2_MSL)); -} - -/** - * @brief Clear Address Matched flag. - * @note Clearing this flag is done by a read access to the I2Cx_SR1 - * register followed by a read access to the I2Cx_SR2 register. - * @rmtoll SR1 ADDR LL_I2C_ClearFlag_ADDR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_ADDR(I2C_TypeDef *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = I2Cx->SR1; - (void) tmpreg; - tmpreg = I2Cx->SR2; - (void) tmpreg; -} - -/** - * @brief Clear Acknowledge failure flag. - * @rmtoll SR1 AF LL_I2C_ClearFlag_AF - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_AF(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_AF); -} - -/** - * @brief Clear Stop detection flag. - * @note Clearing this flag is done by a read access to the I2Cx_SR1 - * register followed by a write access to I2Cx_CR1 register. - * @rmtoll SR1 STOPF LL_I2C_ClearFlag_STOP\n - * CR1 PE LL_I2C_ClearFlag_STOP - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_STOP(I2C_TypeDef *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = I2Cx->SR1; - (void) tmpreg; - SET_BIT(I2Cx->CR1, I2C_CR1_PE); -} - -/** - * @brief Clear Bus error flag. - * @rmtoll SR1 BERR LL_I2C_ClearFlag_BERR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_BERR(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_BERR); -} - -/** - * @brief Clear Arbitration lost flag. - * @rmtoll SR1 ARLO LL_I2C_ClearFlag_ARLO - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_ARLO(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_ARLO); -} - -/** - * @brief Clear Overrun/Underrun flag. - * @rmtoll SR1 OVR LL_I2C_ClearFlag_OVR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_OVR(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_OVR); -} - -/** - * @brief Clear SMBus PEC error flag. - * @rmtoll SR1 PECERR LL_I2C_ClearSMBusFlag_PECERR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearSMBusFlag_PECERR(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_PECERR); -} - -/** - * @brief Clear SMBus Timeout detection flag. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 TIMEOUT LL_I2C_ClearSMBusFlag_TIMEOUT - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearSMBusFlag_TIMEOUT(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_TIMEOUT); -} - -/** - * @brief Clear SMBus Alert flag. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 SMBALERT LL_I2C_ClearSMBusFlag_ALERT - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearSMBusFlag_ALERT(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_SMBALERT); -} - -/** - * @} - */ - -/** @defgroup I2C_LL_EF_Data_Management Data_Management - * @{ - */ - -/** - * @brief Enable Reset of I2C peripheral. - * @rmtoll CR1 SWRST LL_I2C_EnableReset - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableReset(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_SWRST); -} - -/** - * @brief Disable Reset of I2C peripheral. - * @rmtoll CR1 SWRST LL_I2C_DisableReset - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableReset(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_SWRST); -} - -/** - * @brief Check if the I2C peripheral is under reset state or not. - * @rmtoll CR1 SWRST LL_I2C_IsResetEnabled - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsResetEnabled(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_SWRST) == (I2C_CR1_SWRST)); -} - -/** - * @brief Prepare the generation of a ACKnowledge or Non ACKnowledge condition after the address receive match code or next received byte. - * @note Usage in Slave or Master mode. - * @rmtoll CR1 ACK LL_I2C_AcknowledgeNextData - * @param I2Cx I2C Instance. - * @param TypeAcknowledge This parameter can be one of the following values: - * @arg @ref LL_I2C_ACK - * @arg @ref LL_I2C_NACK - * @retval None - */ -__STATIC_INLINE void LL_I2C_AcknowledgeNextData(I2C_TypeDef *I2Cx, uint32_t TypeAcknowledge) -{ - MODIFY_REG(I2Cx->CR1, I2C_CR1_ACK, TypeAcknowledge); -} - -/** - * @brief Generate a START or RESTART condition - * @note The START bit can be set even if bus is BUSY or I2C is in slave mode. - * This action has no effect when RELOAD is set. - * @rmtoll CR1 START LL_I2C_GenerateStartCondition - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_GenerateStartCondition(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_START); -} - -/** - * @brief Generate a STOP condition after the current byte transfer (master mode). - * @rmtoll CR1 STOP LL_I2C_GenerateStopCondition - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_GenerateStopCondition(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_STOP); -} - -/** - * @brief Enable bit POS (master/host mode). - * @note In that case, the ACK bit controls the (N)ACK of the next byte received or the PEC bit indicates that the next byte in shift register is a PEC. - * @rmtoll CR1 POS LL_I2C_EnableBitPOS - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableBitPOS(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_POS); -} - -/** - * @brief Disable bit POS (master/host mode). - * @note In that case, the ACK bit controls the (N)ACK of the current byte received or the PEC bit indicates that the current byte in shift register is a PEC. - * @rmtoll CR1 POS LL_I2C_DisableBitPOS - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableBitPOS(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_POS); -} - -/** - * @brief Check if bit POS is enabled or disabled. - * @rmtoll CR1 POS LL_I2C_IsEnabledBitPOS - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledBitPOS(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_POS) == (I2C_CR1_POS)); -} - -/** - * @brief Indicate the value of transfer direction. - * @note RESET: Bus is in read transfer (peripheral point of view). - * SET: Bus is in write transfer (peripheral point of view). - * @rmtoll SR2 TRA LL_I2C_GetTransferDirection - * @param I2Cx I2C Instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_DIRECTION_WRITE - * @arg @ref LL_I2C_DIRECTION_READ - */ -__STATIC_INLINE uint32_t LL_I2C_GetTransferDirection(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->SR2, I2C_SR2_TRA)); -} - -/** - * @brief Enable DMA last transfer. - * @note This action mean that next DMA EOT is the last transfer. - * @rmtoll CR2 LAST LL_I2C_EnableLastDMA - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableLastDMA(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_LAST); -} - -/** - * @brief Disable DMA last transfer. - * @note This action mean that next DMA EOT is not the last transfer. - * @rmtoll CR2 LAST LL_I2C_DisableLastDMA - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableLastDMA(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_LAST); -} - -/** - * @brief Check if DMA last transfer is enabled or disabled. - * @rmtoll CR2 LAST LL_I2C_IsEnabledLastDMA - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledLastDMA(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_LAST) == (I2C_CR2_LAST)); -} - -/** - * @brief Enable transfer or internal comparison of the SMBus Packet Error byte (transmission or reception mode). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note This feature is cleared by hardware when the PEC byte is transferred or compared, - * or by a START or STOP condition, it is also cleared by software. - * @rmtoll CR1 PEC LL_I2C_EnableSMBusPECCompare - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableSMBusPECCompare(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_PEC); -} - -/** - * @brief Disable transfer or internal comparison of the SMBus Packet Error byte (transmission or reception mode). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 PEC LL_I2C_DisableSMBusPECCompare - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableSMBusPECCompare(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_PEC); -} - -/** - * @brief Check if the SMBus Packet Error byte transfer or internal comparison is requested or not. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 PEC LL_I2C_IsEnabledSMBusPECCompare - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusPECCompare(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_PEC) == (I2C_CR1_PEC)); -} - -/** - * @brief Get the SMBus Packet Error byte calculated. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR2 PEC LL_I2C_GetSMBusPEC - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x00 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_I2C_GetSMBusPEC(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->SR2, I2C_SR2_PEC) >> I2C_SR2_PEC_Pos); -} - -/** - * @brief Read Receive Data register. - * @rmtoll DR DR LL_I2C_ReceiveData8 - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x0 and Max_Data=0xFF - */ -__STATIC_INLINE uint8_t LL_I2C_ReceiveData8(I2C_TypeDef *I2Cx) -{ - return (uint8_t)(READ_BIT(I2Cx->DR, I2C_DR_DR)); -} - -/** - * @brief Write in Transmit Data Register . - * @rmtoll DR DR LL_I2C_TransmitData8 - * @param I2Cx I2C Instance. - * @param Data Value between Min_Data=0x0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_I2C_TransmitData8(I2C_TypeDef *I2Cx, uint8_t Data) -{ - MODIFY_REG(I2Cx->DR, I2C_DR_DR, Data); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2C_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -uint32_t LL_I2C_Init(I2C_TypeDef *I2Cx, LL_I2C_InitTypeDef *I2C_InitStruct); -uint32_t LL_I2C_DeInit(I2C_TypeDef *I2Cx); -void LL_I2C_StructInit(LL_I2C_InitTypeDef *I2C_InitStruct); - - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* I2C1 || I2C2 || I2C3 */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_I2C_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h deleted file mode 100644 index ea23dc5..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h +++ /dev/null @@ -1,985 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_pwr.h - * @author MCD Application Team - * @brief Header file of PWR LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_PWR_H -#define __STM32F4xx_LL_PWR_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined(PWR) - -/** @defgroup PWR_LL PWR - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWR_LL_Exported_Constants PWR Exported Constants - * @{ - */ - -/** @defgroup PWR_LL_EC_CLEAR_FLAG Clear Flags Defines - * @brief Flags defines which can be used with LL_PWR_WriteReg function - * @{ - */ -#define LL_PWR_CR_CSBF PWR_CR_CSBF /*!< Clear standby flag */ -#define LL_PWR_CR_CWUF PWR_CR_CWUF /*!< Clear wakeup flag */ -/** - * @} - */ - -/** @defgroup PWR_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_PWR_ReadReg function - * @{ - */ -#define LL_PWR_CSR_WUF PWR_CSR_WUF /*!< Wakeup flag */ -#define LL_PWR_CSR_SBF PWR_CSR_SBF /*!< Standby flag */ -#define LL_PWR_CSR_PVDO PWR_CSR_PVDO /*!< Power voltage detector output flag */ -#define LL_PWR_CSR_VOS PWR_CSR_VOSRDY /*!< Voltage scaling select flag */ -#if defined(PWR_CSR_EWUP) -#define LL_PWR_CSR_EWUP1 PWR_CSR_EWUP /*!< Enable WKUP pin */ -#elif defined(PWR_CSR_EWUP1) -#define LL_PWR_CSR_EWUP1 PWR_CSR_EWUP1 /*!< Enable WKUP pin 1 */ -#endif /* PWR_CSR_EWUP */ -#if defined(PWR_CSR_EWUP2) -#define LL_PWR_CSR_EWUP2 PWR_CSR_EWUP2 /*!< Enable WKUP pin 2 */ -#endif /* PWR_CSR_EWUP2 */ -#if defined(PWR_CSR_EWUP3) -#define LL_PWR_CSR_EWUP3 PWR_CSR_EWUP3 /*!< Enable WKUP pin 3 */ -#endif /* PWR_CSR_EWUP3 */ -/** - * @} - */ - -/** @defgroup PWR_LL_EC_REGU_VOLTAGE Regulator Voltage - * @{ - */ -#if defined(PWR_CR_VOS_0) -#define LL_PWR_REGU_VOLTAGE_SCALE3 (PWR_CR_VOS_0) -#define LL_PWR_REGU_VOLTAGE_SCALE2 (PWR_CR_VOS_1) -#define LL_PWR_REGU_VOLTAGE_SCALE1 (PWR_CR_VOS_0 | PWR_CR_VOS_1) /* The SCALE1 is not available for STM32F401xx devices */ -#else -#define LL_PWR_REGU_VOLTAGE_SCALE1 (PWR_CR_VOS) -#define LL_PWR_REGU_VOLTAGE_SCALE2 0x00000000U -#endif /* PWR_CR_VOS_0 */ -/** - * @} - */ - -/** @defgroup PWR_LL_EC_MODE_PWR Mode Power - * @{ - */ -#define LL_PWR_MODE_STOP_MAINREGU 0x00000000U /*!< Enter Stop mode when the CPU enters deepsleep */ -#define LL_PWR_MODE_STOP_LPREGU (PWR_CR_LPDS) /*!< Enter Stop mode (with low power Regulator ON) when the CPU enters deepsleep */ -#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) -#define LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (PWR_CR_MRUDS | PWR_CR_FPDS) /*!< Enter Stop mode (with main Regulator in under-drive mode) when the CPU enters deepsleep */ -#define LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_FPDS) /*!< Enter Stop mode (with low power Regulator in under-drive mode) when the CPU enters deepsleep */ -#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ -#if defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) -#define LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (PWR_CR_MRLVDS | PWR_CR_FPDS) /*!< Enter Stop mode (with main Regulator in Deep Sleep mode) when the CPU enters deepsleep */ -#define LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (PWR_CR_LPDS | PWR_CR_LPLVDS | PWR_CR_FPDS) /*!< Enter Stop mode (with low power Regulator in Deep Sleep mode) when the CPU enters deepsleep */ -#endif /* PWR_CR_MRLVDS && PWR_CR_LPLVDS && PWR_CR_FPDS */ -#define LL_PWR_MODE_STANDBY (PWR_CR_PDDS) /*!< Enter Standby mode when the CPU enters deepsleep */ -/** - * @} - */ - -/** @defgroup PWR_LL_EC_REGU_MODE_DS_MODE Regulator Mode In Deep Sleep Mode - * @{ - */ -#define LL_PWR_REGU_DSMODE_MAIN 0x00000000U /*!< Voltage Regulator in main mode during deepsleep mode */ -#define LL_PWR_REGU_DSMODE_LOW_POWER (PWR_CR_LPDS) /*!< Voltage Regulator in low-power mode during deepsleep mode */ -/** - * @} - */ - -/** @defgroup PWR_LL_EC_PVDLEVEL Power Voltage Detector Level - * @{ - */ -#define LL_PWR_PVDLEVEL_0 (PWR_CR_PLS_LEV0) /*!< Voltage threshold detected by PVD 2.2 V */ -#define LL_PWR_PVDLEVEL_1 (PWR_CR_PLS_LEV1) /*!< Voltage threshold detected by PVD 2.3 V */ -#define LL_PWR_PVDLEVEL_2 (PWR_CR_PLS_LEV2) /*!< Voltage threshold detected by PVD 2.4 V */ -#define LL_PWR_PVDLEVEL_3 (PWR_CR_PLS_LEV3) /*!< Voltage threshold detected by PVD 2.5 V */ -#define LL_PWR_PVDLEVEL_4 (PWR_CR_PLS_LEV4) /*!< Voltage threshold detected by PVD 2.6 V */ -#define LL_PWR_PVDLEVEL_5 (PWR_CR_PLS_LEV5) /*!< Voltage threshold detected by PVD 2.7 V */ -#define LL_PWR_PVDLEVEL_6 (PWR_CR_PLS_LEV6) /*!< Voltage threshold detected by PVD 2.8 V */ -#define LL_PWR_PVDLEVEL_7 (PWR_CR_PLS_LEV7) /*!< Voltage threshold detected by PVD 2.9 V */ -/** - * @} - */ -/** @defgroup PWR_LL_EC_WAKEUP_PIN Wakeup Pins - * @{ - */ -#if defined(PWR_CSR_EWUP) -#define LL_PWR_WAKEUP_PIN1 (PWR_CSR_EWUP) /*!< WKUP pin : PA0 */ -#endif /* PWR_CSR_EWUP */ -#if defined(PWR_CSR_EWUP1) -#define LL_PWR_WAKEUP_PIN1 (PWR_CSR_EWUP1) /*!< WKUP pin 1 : PA0 */ -#endif /* PWR_CSR_EWUP1 */ -#if defined(PWR_CSR_EWUP2) -#define LL_PWR_WAKEUP_PIN2 (PWR_CSR_EWUP2) /*!< WKUP pin 2 : PC0 or PC13 according to device */ -#endif /* PWR_CSR_EWUP2 */ -#if defined(PWR_CSR_EWUP3) -#define LL_PWR_WAKEUP_PIN3 (PWR_CSR_EWUP3) /*!< WKUP pin 3 : PC1 */ -#endif /* PWR_CSR_EWUP3 */ -/** - * @} - */ - -/** - * @} - */ - - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWR_LL_Exported_Macros PWR Exported Macros - * @{ - */ - -/** @defgroup PWR_LL_EM_WRITE_READ Common write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in PWR register - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_PWR_WriteReg(__REG__, __VALUE__) WRITE_REG(PWR->__REG__, (__VALUE__)) - -/** - * @brief Read a value in PWR register - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_PWR_ReadReg(__REG__) READ_REG(PWR->__REG__) -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup PWR_LL_Exported_Functions PWR Exported Functions - * @{ - */ - -/** @defgroup PWR_LL_EF_Configuration Configuration - * @{ - */ -#if defined(PWR_CR_FISSR) -/** - * @brief Enable FLASH interface STOP while system Run is ON - * @rmtoll CR FISSR LL_PWR_EnableFLASHInterfaceSTOP - * @note This mode is enabled only with STOP low power mode. - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableFLASHInterfaceSTOP(void) -{ - SET_BIT(PWR->CR, PWR_CR_FISSR); -} - -/** - * @brief Disable FLASH Interface STOP while system Run is ON - * @rmtoll CR FISSR LL_PWR_DisableFLASHInterfaceSTOP - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableFLASHInterfaceSTOP(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_FISSR); -} - -/** - * @brief Check if FLASH Interface STOP while system Run feature is enabled - * @rmtoll CR FISSR LL_PWR_IsEnabledFLASHInterfaceSTOP - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledFLASHInterfaceSTOP(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_FISSR) == (PWR_CR_FISSR)); -} -#endif /* PWR_CR_FISSR */ - -#if defined(PWR_CR_FMSSR) -/** - * @brief Enable FLASH Memory STOP while system Run is ON - * @rmtoll CR FMSSR LL_PWR_EnableFLASHMemorySTOP - * @note This mode is enabled only with STOP low power mode. - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableFLASHMemorySTOP(void) -{ - SET_BIT(PWR->CR, PWR_CR_FMSSR); -} - -/** - * @brief Disable FLASH Memory STOP while system Run is ON - * @rmtoll CR FMSSR LL_PWR_DisableFLASHMemorySTOP - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableFLASHMemorySTOP(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); -} - -/** - * @brief Check if FLASH Memory STOP while system Run feature is enabled - * @rmtoll CR FMSSR LL_PWR_IsEnabledFLASHMemorySTOP - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledFLASHMemorySTOP(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_FMSSR) == (PWR_CR_FMSSR)); -} -#endif /* PWR_CR_FMSSR */ -#if defined(PWR_CR_UDEN) -/** - * @brief Enable Under Drive Mode - * @rmtoll CR UDEN LL_PWR_EnableUnderDriveMode - * @note This mode is enabled only with STOP low power mode. - * In this mode, the 1.2V domain is preserved in reduced leakage mode. This - * mode is only available when the main Regulator or the low power Regulator - * is in low voltage mode. - * @note If the Under-drive mode was enabled, it is automatically disabled after - * exiting Stop mode. - * When the voltage Regulator operates in Under-drive mode, an additional - * startup delay is induced when waking up from Stop mode. - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableUnderDriveMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_UDEN); -} - -/** - * @brief Disable Under Drive Mode - * @rmtoll CR UDEN LL_PWR_DisableUnderDriveMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableUnderDriveMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_UDEN); -} - -/** - * @brief Check if Under Drive Mode is enabled - * @rmtoll CR UDEN LL_PWR_IsEnabledUnderDriveMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledUnderDriveMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_UDEN) == (PWR_CR_UDEN)); -} -#endif /* PWR_CR_UDEN */ - -#if defined(PWR_CR_ODSWEN) -/** - * @brief Enable Over drive switching - * @rmtoll CR ODSWEN LL_PWR_EnableOverDriveSwitching - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableOverDriveSwitching(void) -{ - SET_BIT(PWR->CR, PWR_CR_ODSWEN); -} - -/** - * @brief Disable Over drive switching - * @rmtoll CR ODSWEN LL_PWR_DisableOverDriveSwitching - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableOverDriveSwitching(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_ODSWEN); -} - -/** - * @brief Check if Over drive switching is enabled - * @rmtoll CR ODSWEN LL_PWR_IsEnabledOverDriveSwitching - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledOverDriveSwitching(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_ODSWEN) == (PWR_CR_ODSWEN)); -} -#endif /* PWR_CR_ODSWEN */ -#if defined(PWR_CR_ODEN) -/** - * @brief Enable Over drive Mode - * @rmtoll CR ODEN LL_PWR_EnableOverDriveMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableOverDriveMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_ODEN); -} - -/** - * @brief Disable Over drive Mode - * @rmtoll CR ODEN LL_PWR_DisableOverDriveMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableOverDriveMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_ODEN); -} - -/** - * @brief Check if Over drive switching is enabled - * @rmtoll CR ODEN LL_PWR_IsEnabledOverDriveMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledOverDriveMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_ODEN) == (PWR_CR_ODEN)); -} -#endif /* PWR_CR_ODEN */ -#if defined(PWR_CR_MRUDS) -/** - * @brief Enable Main Regulator in deepsleep under-drive Mode - * @rmtoll CR MRUDS LL_PWR_EnableMainRegulatorDeepSleepUDMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableMainRegulatorDeepSleepUDMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_MRUDS); -} - -/** - * @brief Disable Main Regulator in deepsleep under-drive Mode - * @rmtoll CR MRUDS LL_PWR_DisableMainRegulatorDeepSleepUDMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableMainRegulatorDeepSleepUDMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_MRUDS); -} - -/** - * @brief Check if Main Regulator in deepsleep under-drive Mode is enabled - * @rmtoll CR MRUDS LL_PWR_IsEnabledMainRegulatorDeepSleepUDMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledMainRegulatorDeepSleepUDMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_MRUDS) == (PWR_CR_MRUDS)); -} -#endif /* PWR_CR_MRUDS */ - -#if defined(PWR_CR_LPUDS) -/** - * @brief Enable Low Power Regulator in deepsleep under-drive Mode - * @rmtoll CR LPUDS LL_PWR_EnableLowPowerRegulatorDeepSleepUDMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableLowPowerRegulatorDeepSleepUDMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_LPUDS); -} - -/** - * @brief Disable Low Power Regulator in deepsleep under-drive Mode - * @rmtoll CR LPUDS LL_PWR_DisableLowPowerRegulatorDeepSleepUDMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableLowPowerRegulatorDeepSleepUDMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_LPUDS); -} - -/** - * @brief Check if Low Power Regulator in deepsleep under-drive Mode is enabled - * @rmtoll CR LPUDS LL_PWR_IsEnabledLowPowerRegulatorDeepSleepUDMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledLowPowerRegulatorDeepSleepUDMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_LPUDS) == (PWR_CR_LPUDS)); -} -#endif /* PWR_CR_LPUDS */ - -#if defined(PWR_CR_MRLVDS) -/** - * @brief Enable Main Regulator low voltage Mode - * @rmtoll CR MRLVDS LL_PWR_EnableMainRegulatorLowVoltageMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableMainRegulatorLowVoltageMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_MRLVDS); -} - -/** - * @brief Disable Main Regulator low voltage Mode - * @rmtoll CR MRLVDS LL_PWR_DisableMainRegulatorLowVoltageMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableMainRegulatorLowVoltageMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_MRLVDS); -} - -/** - * @brief Check if Main Regulator low voltage Mode is enabled - * @rmtoll CR MRLVDS LL_PWR_IsEnabledMainRegulatorLowVoltageMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledMainRegulatorLowVoltageMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_MRLVDS) == (PWR_CR_MRLVDS)); -} -#endif /* PWR_CR_MRLVDS */ - -#if defined(PWR_CR_LPLVDS) -/** - * @brief Enable Low Power Regulator low voltage Mode - * @rmtoll CR LPLVDS LL_PWR_EnableLowPowerRegulatorLowVoltageMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableLowPowerRegulatorLowVoltageMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_LPLVDS); -} - -/** - * @brief Disable Low Power Regulator low voltage Mode - * @rmtoll CR LPLVDS LL_PWR_DisableLowPowerRegulatorLowVoltageMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableLowPowerRegulatorLowVoltageMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_LPLVDS); -} - -/** - * @brief Check if Low Power Regulator low voltage Mode is enabled - * @rmtoll CR LPLVDS LL_PWR_IsEnabledLowPowerRegulatorLowVoltageMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledLowPowerRegulatorLowVoltageMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_LPLVDS) == (PWR_CR_LPLVDS)); -} -#endif /* PWR_CR_LPLVDS */ -/** - * @brief Set the main internal Regulator output voltage - * @rmtoll CR VOS LL_PWR_SetRegulVoltageScaling - * @param VoltageScaling This parameter can be one of the following values: - * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE1 (*) - * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE2 - * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE3 - * (*) LL_PWR_REGU_VOLTAGE_SCALE1 is not available for STM32F401xx devices - * @retval None - */ -__STATIC_INLINE void LL_PWR_SetRegulVoltageScaling(uint32_t VoltageScaling) -{ - MODIFY_REG(PWR->CR, PWR_CR_VOS, VoltageScaling); -} - -/** - * @brief Get the main internal Regulator output voltage - * @rmtoll CR VOS LL_PWR_GetRegulVoltageScaling - * @retval Returned value can be one of the following values: - * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE1 (*) - * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE2 - * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE3 - * (*) LL_PWR_REGU_VOLTAGE_SCALE1 is not available for STM32F401xx devices - */ -__STATIC_INLINE uint32_t LL_PWR_GetRegulVoltageScaling(void) -{ - return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_VOS)); -} -/** - * @brief Enable the Flash Power Down in Stop Mode - * @rmtoll CR FPDS LL_PWR_EnableFlashPowerDown - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableFlashPowerDown(void) -{ - SET_BIT(PWR->CR, PWR_CR_FPDS); -} - -/** - * @brief Disable the Flash Power Down in Stop Mode - * @rmtoll CR FPDS LL_PWR_DisableFlashPowerDown - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableFlashPowerDown(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_FPDS); -} - -/** - * @brief Check if the Flash Power Down in Stop Mode is enabled - * @rmtoll CR FPDS LL_PWR_IsEnabledFlashPowerDown - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledFlashPowerDown(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_FPDS) == (PWR_CR_FPDS)); -} - -/** - * @brief Enable access to the backup domain - * @rmtoll CR DBP LL_PWR_EnableBkUpAccess - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableBkUpAccess(void) -{ - SET_BIT(PWR->CR, PWR_CR_DBP); -} - -/** - * @brief Disable access to the backup domain - * @rmtoll CR DBP LL_PWR_DisableBkUpAccess - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableBkUpAccess(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_DBP); -} - -/** - * @brief Check if the backup domain is enabled - * @rmtoll CR DBP LL_PWR_IsEnabledBkUpAccess - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledBkUpAccess(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_DBP) == (PWR_CR_DBP)); -} -/** - * @brief Enable the backup Regulator - * @rmtoll CSR BRE LL_PWR_EnableBkUpRegulator - * @note The BRE bit of the PWR_CSR register is protected against parasitic write access. - * The LL_PWR_EnableBkUpAccess() must be called before using this API. - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableBkUpRegulator(void) -{ - SET_BIT(PWR->CSR, PWR_CSR_BRE); -} - -/** - * @brief Disable the backup Regulator - * @rmtoll CSR BRE LL_PWR_DisableBkUpRegulator - * @note The BRE bit of the PWR_CSR register is protected against parasitic write access. - * The LL_PWR_EnableBkUpAccess() must be called before using this API. - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableBkUpRegulator(void) -{ - CLEAR_BIT(PWR->CSR, PWR_CSR_BRE); -} - -/** - * @brief Check if the backup Regulator is enabled - * @rmtoll CSR BRE LL_PWR_IsEnabledBkUpRegulator - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledBkUpRegulator(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_BRE) == (PWR_CSR_BRE)); -} - -/** - * @brief Set voltage Regulator mode during deep sleep mode - * @rmtoll CR LPDS LL_PWR_SetRegulModeDS - * @param RegulMode This parameter can be one of the following values: - * @arg @ref LL_PWR_REGU_DSMODE_MAIN - * @arg @ref LL_PWR_REGU_DSMODE_LOW_POWER - * @retval None - */ -__STATIC_INLINE void LL_PWR_SetRegulModeDS(uint32_t RegulMode) -{ - MODIFY_REG(PWR->CR, PWR_CR_LPDS, RegulMode); -} - -/** - * @brief Get voltage Regulator mode during deep sleep mode - * @rmtoll CR LPDS LL_PWR_GetRegulModeDS - * @retval Returned value can be one of the following values: - * @arg @ref LL_PWR_REGU_DSMODE_MAIN - * @arg @ref LL_PWR_REGU_DSMODE_LOW_POWER - */ -__STATIC_INLINE uint32_t LL_PWR_GetRegulModeDS(void) -{ - return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_LPDS)); -} - -/** - * @brief Set Power Down mode when CPU enters deepsleep - * @rmtoll CR PDDS LL_PWR_SetPowerMode\n - * @rmtoll CR MRUDS LL_PWR_SetPowerMode\n - * @rmtoll CR LPUDS LL_PWR_SetPowerMode\n - * @rmtoll CR FPDS LL_PWR_SetPowerMode\n - * @rmtoll CR MRLVDS LL_PWR_SetPowerMode\n - * @rmtoll CR LPlVDS LL_PWR_SetPowerMode\n - * @rmtoll CR FPDS LL_PWR_SetPowerMode\n - * @rmtoll CR LPDS LL_PWR_SetPowerMode - * @param PDMode This parameter can be one of the following values: - * @arg @ref LL_PWR_MODE_STOP_MAINREGU - * @arg @ref LL_PWR_MODE_STOP_LPREGU - * @arg @ref LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (*) - * @arg @ref LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (*) - * @arg @ref LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (*) - * @arg @ref LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (*) - * - * (*) not available on all devices - * @arg @ref LL_PWR_MODE_STANDBY - * @retval None - */ -__STATIC_INLINE void LL_PWR_SetPowerMode(uint32_t PDMode) -{ -#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) - MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPUDS | PWR_CR_MRUDS), PDMode); -#elif defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) - MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPLVDS | PWR_CR_MRLVDS), PDMode); -#else - MODIFY_REG(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS), PDMode); -#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ -} - -/** - * @brief Get Power Down mode when CPU enters deepsleep - * @rmtoll CR PDDS LL_PWR_GetPowerMode\n - * @rmtoll CR MRUDS LL_PWR_GetPowerMode\n - * @rmtoll CR LPUDS LL_PWR_GetPowerMode\n - * @rmtoll CR FPDS LL_PWR_GetPowerMode\n - * @rmtoll CR MRLVDS LL_PWR_GetPowerMode\n - * @rmtoll CR LPLVDS LL_PWR_GetPowerMode\n - * @rmtoll CR FPDS LL_PWR_GetPowerMode\n - * @rmtoll CR LPDS LL_PWR_GetPowerMode - * @retval Returned value can be one of the following values: - * @arg @ref LL_PWR_MODE_STOP_MAINREGU - * @arg @ref LL_PWR_MODE_STOP_LPREGU - * @arg @ref LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (*) - * @arg @ref LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (*) - * @arg @ref LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (*) - * @arg @ref LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (*) - * - * (*) not available on all devices - * @arg @ref LL_PWR_MODE_STANDBY - */ -__STATIC_INLINE uint32_t LL_PWR_GetPowerMode(void) -{ -#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) - return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPUDS | PWR_CR_MRUDS))); -#elif defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) - return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPLVDS | PWR_CR_MRLVDS))); -#else - return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS))); -#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ -} - -/** - * @brief Configure the voltage threshold detected by the Power Voltage Detector - * @rmtoll CR PLS LL_PWR_SetPVDLevel - * @param PVDLevel This parameter can be one of the following values: - * @arg @ref LL_PWR_PVDLEVEL_0 - * @arg @ref LL_PWR_PVDLEVEL_1 - * @arg @ref LL_PWR_PVDLEVEL_2 - * @arg @ref LL_PWR_PVDLEVEL_3 - * @arg @ref LL_PWR_PVDLEVEL_4 - * @arg @ref LL_PWR_PVDLEVEL_5 - * @arg @ref LL_PWR_PVDLEVEL_6 - * @arg @ref LL_PWR_PVDLEVEL_7 - * @retval None - */ -__STATIC_INLINE void LL_PWR_SetPVDLevel(uint32_t PVDLevel) -{ - MODIFY_REG(PWR->CR, PWR_CR_PLS, PVDLevel); -} - -/** - * @brief Get the voltage threshold detection - * @rmtoll CR PLS LL_PWR_GetPVDLevel - * @retval Returned value can be one of the following values: - * @arg @ref LL_PWR_PVDLEVEL_0 - * @arg @ref LL_PWR_PVDLEVEL_1 - * @arg @ref LL_PWR_PVDLEVEL_2 - * @arg @ref LL_PWR_PVDLEVEL_3 - * @arg @ref LL_PWR_PVDLEVEL_4 - * @arg @ref LL_PWR_PVDLEVEL_5 - * @arg @ref LL_PWR_PVDLEVEL_6 - * @arg @ref LL_PWR_PVDLEVEL_7 - */ -__STATIC_INLINE uint32_t LL_PWR_GetPVDLevel(void) -{ - return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_PLS)); -} - -/** - * @brief Enable Power Voltage Detector - * @rmtoll CR PVDE LL_PWR_EnablePVD - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnablePVD(void) -{ - SET_BIT(PWR->CR, PWR_CR_PVDE); -} - -/** - * @brief Disable Power Voltage Detector - * @rmtoll CR PVDE LL_PWR_DisablePVD - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisablePVD(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_PVDE); -} - -/** - * @brief Check if Power Voltage Detector is enabled - * @rmtoll CR PVDE LL_PWR_IsEnabledPVD - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledPVD(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_PVDE) == (PWR_CR_PVDE)); -} - -/** - * @brief Enable the WakeUp PINx functionality - * @rmtoll CSR EWUP LL_PWR_EnableWakeUpPin\n - * @rmtoll CSR EWUP1 LL_PWR_EnableWakeUpPin\n - * @rmtoll CSR EWUP2 LL_PWR_EnableWakeUpPin\n - * @rmtoll CSR EWUP3 LL_PWR_EnableWakeUpPin - * @param WakeUpPin This parameter can be one of the following values: - * @arg @ref LL_PWR_WAKEUP_PIN1 - * @arg @ref LL_PWR_WAKEUP_PIN2 (*) - * @arg @ref LL_PWR_WAKEUP_PIN3 (*) - * - * (*) not available on all devices - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableWakeUpPin(uint32_t WakeUpPin) -{ - SET_BIT(PWR->CSR, WakeUpPin); -} - -/** - * @brief Disable the WakeUp PINx functionality - * @rmtoll CSR EWUP LL_PWR_DisableWakeUpPin\n - * @rmtoll CSR EWUP1 LL_PWR_DisableWakeUpPin\n - * @rmtoll CSR EWUP2 LL_PWR_DisableWakeUpPin\n - * @rmtoll CSR EWUP3 LL_PWR_DisableWakeUpPin - * @param WakeUpPin This parameter can be one of the following values: - * @arg @ref LL_PWR_WAKEUP_PIN1 - * @arg @ref LL_PWR_WAKEUP_PIN2 (*) - * @arg @ref LL_PWR_WAKEUP_PIN3 (*) - * - * (*) not available on all devices - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableWakeUpPin(uint32_t WakeUpPin) -{ - CLEAR_BIT(PWR->CSR, WakeUpPin); -} - -/** - * @brief Check if the WakeUp PINx functionality is enabled - * @rmtoll CSR EWUP LL_PWR_IsEnabledWakeUpPin\n - * @rmtoll CSR EWUP1 LL_PWR_IsEnabledWakeUpPin\n - * @rmtoll CSR EWUP2 LL_PWR_IsEnabledWakeUpPin\n - * @rmtoll CSR EWUP3 LL_PWR_IsEnabledWakeUpPin - * @param WakeUpPin This parameter can be one of the following values: - * @arg @ref LL_PWR_WAKEUP_PIN1 - * @arg @ref LL_PWR_WAKEUP_PIN2 (*) - * @arg @ref LL_PWR_WAKEUP_PIN3 (*) - * - * (*) not available on all devices - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledWakeUpPin(uint32_t WakeUpPin) -{ - return (READ_BIT(PWR->CSR, WakeUpPin) == (WakeUpPin)); -} - - -/** - * @} - */ - -/** @defgroup PWR_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Get Wake-up Flag - * @rmtoll CSR WUF LL_PWR_IsActiveFlag_WU - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_WU(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_WUF) == (PWR_CSR_WUF)); -} - -/** - * @brief Get Standby Flag - * @rmtoll CSR SBF LL_PWR_IsActiveFlag_SB - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_SB(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_SBF) == (PWR_CSR_SBF)); -} - -/** - * @brief Get Backup Regulator ready Flag - * @rmtoll CSR BRR LL_PWR_IsActiveFlag_BRR - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_BRR(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_BRR) == (PWR_CSR_BRR)); -} -/** - * @brief Indicate whether VDD voltage is below the selected PVD threshold - * @rmtoll CSR PVDO LL_PWR_IsActiveFlag_PVDO - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_PVDO(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_PVDO) == (PWR_CSR_PVDO)); -} - -/** - * @brief Indicate whether the Regulator is ready in the selected voltage range or if its output voltage is still changing to the required voltage level - * @rmtoll CSR VOS LL_PWR_IsActiveFlag_VOS - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_VOS(void) -{ - return (READ_BIT(PWR->CSR, LL_PWR_CSR_VOS) == (LL_PWR_CSR_VOS)); -} -#if defined(PWR_CR_ODEN) -/** - * @brief Indicate whether the Over-Drive mode is ready or not - * @rmtoll CSR ODRDY LL_PWR_IsActiveFlag_OD - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_OD(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_ODRDY) == (PWR_CSR_ODRDY)); -} -#endif /* PWR_CR_ODEN */ - -#if defined(PWR_CR_ODSWEN) -/** - * @brief Indicate whether the Over-Drive mode switching is ready or not - * @rmtoll CSR ODSWRDY LL_PWR_IsActiveFlag_ODSW - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_ODSW(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_ODSWRDY) == (PWR_CSR_ODSWRDY)); -} -#endif /* PWR_CR_ODSWEN */ - -#if defined(PWR_CR_UDEN) -/** - * @brief Indicate whether the Under-Drive mode is ready or not - * @rmtoll CSR UDRDY LL_PWR_IsActiveFlag_UD - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_UD(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_UDRDY) == (PWR_CSR_UDRDY)); -} -#endif /* PWR_CR_UDEN */ -/** - * @brief Clear Standby Flag - * @rmtoll CR CSBF LL_PWR_ClearFlag_SB - * @retval None - */ -__STATIC_INLINE void LL_PWR_ClearFlag_SB(void) -{ - SET_BIT(PWR->CR, PWR_CR_CSBF); -} - -/** - * @brief Clear Wake-up Flags - * @rmtoll CR CWUF LL_PWR_ClearFlag_WU - * @retval None - */ -__STATIC_INLINE void LL_PWR_ClearFlag_WU(void) -{ - SET_BIT(PWR->CR, PWR_CR_CWUF); -} -#if defined(PWR_CSR_UDRDY) -/** - * @brief Clear Under-Drive ready Flag - * @rmtoll CSR UDRDY LL_PWR_ClearFlag_UD - * @retval None - */ -__STATIC_INLINE void LL_PWR_ClearFlag_UD(void) -{ - WRITE_REG(PWR->CSR, PWR_CSR_UDRDY); -} -#endif /* PWR_CSR_UDRDY */ - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup PWR_LL_EF_Init De-initialization function - * @{ - */ -ErrorStatus LL_PWR_DeInit(void); -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined(PWR) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_PWR_H */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h deleted file mode 100644 index 796f06d..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h +++ /dev/null @@ -1,7101 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_rcc.h - * @author MCD Application Team - * @brief Header file of RCC LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_RCC_H -#define __STM32F4xx_LL_RCC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined(RCC) - -/** @defgroup RCC_LL RCC - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup RCC_LL_Private_Variables RCC Private Variables - * @{ - */ - -#if defined(RCC_DCKCFGR_PLLSAIDIVR) -static const uint8_t aRCC_PLLSAIDIVRPrescTable[4] = {2, 4, 8, 16}; -#endif /* RCC_DCKCFGR_PLLSAIDIVR */ - -/** - * @} - */ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup RCC_LL_Private_Macros RCC Private Macros - * @{ - */ -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup RCC_LL_Exported_Types RCC Exported Types - * @{ - */ - -/** @defgroup LL_ES_CLOCK_FREQ Clocks Frequency Structure - * @{ - */ - -/** - * @brief RCC Clocks Frequency Structure - */ -typedef struct -{ - uint32_t SYSCLK_Frequency; /*!< SYSCLK clock frequency */ - uint32_t HCLK_Frequency; /*!< HCLK clock frequency */ - uint32_t PCLK1_Frequency; /*!< PCLK1 clock frequency */ - uint32_t PCLK2_Frequency; /*!< PCLK2 clock frequency */ -} LL_RCC_ClocksTypeDef; - -/** - * @} - */ - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RCC_LL_Exported_Constants RCC Exported Constants - * @{ - */ - -/** @defgroup RCC_LL_EC_OSC_VALUES Oscillator Values adaptation - * @brief Defines used to adapt values of different oscillators - * @note These values could be modified in the user environment according to - * HW set-up. - * @{ - */ -#if !defined (HSE_VALUE) -#define HSE_VALUE 25000000U /*!< Value of the HSE oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) -#define HSI_VALUE 16000000U /*!< Value of the HSI oscillator in Hz */ -#endif /* HSI_VALUE */ - -#if !defined (LSE_VALUE) -#define LSE_VALUE 32768U /*!< Value of the LSE oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined (LSI_VALUE) -#define LSI_VALUE 32000U /*!< Value of the LSI oscillator in Hz */ -#endif /* LSI_VALUE */ - -#if !defined (EXTERNAL_CLOCK_VALUE) -#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the I2S_CKIN external oscillator in Hz */ -#endif /* EXTERNAL_CLOCK_VALUE */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_CLEAR_FLAG Clear Flags Defines - * @brief Flags defines which can be used with LL_RCC_WriteReg function - * @{ - */ -#define LL_RCC_CIR_LSIRDYC RCC_CIR_LSIRDYC /*!< LSI Ready Interrupt Clear */ -#define LL_RCC_CIR_LSERDYC RCC_CIR_LSERDYC /*!< LSE Ready Interrupt Clear */ -#define LL_RCC_CIR_HSIRDYC RCC_CIR_HSIRDYC /*!< HSI Ready Interrupt Clear */ -#define LL_RCC_CIR_HSERDYC RCC_CIR_HSERDYC /*!< HSE Ready Interrupt Clear */ -#define LL_RCC_CIR_PLLRDYC RCC_CIR_PLLRDYC /*!< PLL Ready Interrupt Clear */ -#if defined(RCC_PLLI2S_SUPPORT) -#define LL_RCC_CIR_PLLI2SRDYC RCC_CIR_PLLI2SRDYC /*!< PLLI2S Ready Interrupt Clear */ -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_CIR_PLLSAIRDYC RCC_CIR_PLLSAIRDYC /*!< PLLSAI Ready Interrupt Clear */ -#endif /* RCC_PLLSAI_SUPPORT */ -#define LL_RCC_CIR_CSSC RCC_CIR_CSSC /*!< Clock Security System Interrupt Clear */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_RCC_ReadReg function - * @{ - */ -#define LL_RCC_CIR_LSIRDYF RCC_CIR_LSIRDYF /*!< LSI Ready Interrupt flag */ -#define LL_RCC_CIR_LSERDYF RCC_CIR_LSERDYF /*!< LSE Ready Interrupt flag */ -#define LL_RCC_CIR_HSIRDYF RCC_CIR_HSIRDYF /*!< HSI Ready Interrupt flag */ -#define LL_RCC_CIR_HSERDYF RCC_CIR_HSERDYF /*!< HSE Ready Interrupt flag */ -#define LL_RCC_CIR_PLLRDYF RCC_CIR_PLLRDYF /*!< PLL Ready Interrupt flag */ -#if defined(RCC_PLLI2S_SUPPORT) -#define LL_RCC_CIR_PLLI2SRDYF RCC_CIR_PLLI2SRDYF /*!< PLLI2S Ready Interrupt flag */ -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_CIR_PLLSAIRDYF RCC_CIR_PLLSAIRDYF /*!< PLLSAI Ready Interrupt flag */ -#endif /* RCC_PLLSAI_SUPPORT */ -#define LL_RCC_CIR_CSSF RCC_CIR_CSSF /*!< Clock Security System Interrupt flag */ -#define LL_RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF /*!< Low-Power reset flag */ -#define LL_RCC_CSR_PINRSTF RCC_CSR_PINRSTF /*!< PIN reset flag */ -#define LL_RCC_CSR_PORRSTF RCC_CSR_PORRSTF /*!< POR/PDR reset flag */ -#define LL_RCC_CSR_SFTRSTF RCC_CSR_SFTRSTF /*!< Software Reset flag */ -#define LL_RCC_CSR_IWDGRSTF RCC_CSR_IWDGRSTF /*!< Independent Watchdog reset flag */ -#define LL_RCC_CSR_WWDGRSTF RCC_CSR_WWDGRSTF /*!< Window watchdog reset flag */ -#if defined(RCC_CSR_BORRSTF) -#define LL_RCC_CSR_BORRSTF RCC_CSR_BORRSTF /*!< BOR reset flag */ -#endif /* RCC_CSR_BORRSTF */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_RCC_ReadReg and LL_RCC_WriteReg functions - * @{ - */ -#define LL_RCC_CIR_LSIRDYIE RCC_CIR_LSIRDYIE /*!< LSI Ready Interrupt Enable */ -#define LL_RCC_CIR_LSERDYIE RCC_CIR_LSERDYIE /*!< LSE Ready Interrupt Enable */ -#define LL_RCC_CIR_HSIRDYIE RCC_CIR_HSIRDYIE /*!< HSI Ready Interrupt Enable */ -#define LL_RCC_CIR_HSERDYIE RCC_CIR_HSERDYIE /*!< HSE Ready Interrupt Enable */ -#define LL_RCC_CIR_PLLRDYIE RCC_CIR_PLLRDYIE /*!< PLL Ready Interrupt Enable */ -#if defined(RCC_PLLI2S_SUPPORT) -#define LL_RCC_CIR_PLLI2SRDYIE RCC_CIR_PLLI2SRDYIE /*!< PLLI2S Ready Interrupt Enable */ -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_CIR_PLLSAIRDYIE RCC_CIR_PLLSAIRDYIE /*!< PLLSAI Ready Interrupt Enable */ -#endif /* RCC_PLLSAI_SUPPORT */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_SYS_CLKSOURCE System clock switch - * @{ - */ -#define LL_RCC_SYS_CLKSOURCE_HSI RCC_CFGR_SW_HSI /*!< HSI selection as system clock */ -#define LL_RCC_SYS_CLKSOURCE_HSE RCC_CFGR_SW_HSE /*!< HSE selection as system clock */ -#define LL_RCC_SYS_CLKSOURCE_PLL RCC_CFGR_SW_PLL /*!< PLL selection as system clock */ -#if defined(RCC_CFGR_SW_PLLR) -#define LL_RCC_SYS_CLKSOURCE_PLLR RCC_CFGR_SW_PLLR /*!< PLLR selection as system clock */ -#endif /* RCC_CFGR_SW_PLLR */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_SYS_CLKSOURCE_STATUS System clock switch status - * @{ - */ -#define LL_RCC_SYS_CLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ -#define LL_RCC_SYS_CLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ -#define LL_RCC_SYS_CLKSOURCE_STATUS_PLL RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ -#if defined(RCC_PLLR_SYSCLK_SUPPORT) -#define LL_RCC_SYS_CLKSOURCE_STATUS_PLLR RCC_CFGR_SWS_PLLR /*!< PLLR used as system clock */ -#endif /* RCC_PLLR_SYSCLK_SUPPORT */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_SYSCLK_DIV AHB prescaler - * @{ - */ -#define LL_RCC_SYSCLK_DIV_1 RCC_CFGR_HPRE_DIV1 /*!< SYSCLK not divided */ -#define LL_RCC_SYSCLK_DIV_2 RCC_CFGR_HPRE_DIV2 /*!< SYSCLK divided by 2 */ -#define LL_RCC_SYSCLK_DIV_4 RCC_CFGR_HPRE_DIV4 /*!< SYSCLK divided by 4 */ -#define LL_RCC_SYSCLK_DIV_8 RCC_CFGR_HPRE_DIV8 /*!< SYSCLK divided by 8 */ -#define LL_RCC_SYSCLK_DIV_16 RCC_CFGR_HPRE_DIV16 /*!< SYSCLK divided by 16 */ -#define LL_RCC_SYSCLK_DIV_64 RCC_CFGR_HPRE_DIV64 /*!< SYSCLK divided by 64 */ -#define LL_RCC_SYSCLK_DIV_128 RCC_CFGR_HPRE_DIV128 /*!< SYSCLK divided by 128 */ -#define LL_RCC_SYSCLK_DIV_256 RCC_CFGR_HPRE_DIV256 /*!< SYSCLK divided by 256 */ -#define LL_RCC_SYSCLK_DIV_512 RCC_CFGR_HPRE_DIV512 /*!< SYSCLK divided by 512 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_APB1_DIV APB low-speed prescaler (APB1) - * @{ - */ -#define LL_RCC_APB1_DIV_1 RCC_CFGR_PPRE1_DIV1 /*!< HCLK not divided */ -#define LL_RCC_APB1_DIV_2 RCC_CFGR_PPRE1_DIV2 /*!< HCLK divided by 2 */ -#define LL_RCC_APB1_DIV_4 RCC_CFGR_PPRE1_DIV4 /*!< HCLK divided by 4 */ -#define LL_RCC_APB1_DIV_8 RCC_CFGR_PPRE1_DIV8 /*!< HCLK divided by 8 */ -#define LL_RCC_APB1_DIV_16 RCC_CFGR_PPRE1_DIV16 /*!< HCLK divided by 16 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_APB2_DIV APB high-speed prescaler (APB2) - * @{ - */ -#define LL_RCC_APB2_DIV_1 RCC_CFGR_PPRE2_DIV1 /*!< HCLK not divided */ -#define LL_RCC_APB2_DIV_2 RCC_CFGR_PPRE2_DIV2 /*!< HCLK divided by 2 */ -#define LL_RCC_APB2_DIV_4 RCC_CFGR_PPRE2_DIV4 /*!< HCLK divided by 4 */ -#define LL_RCC_APB2_DIV_8 RCC_CFGR_PPRE2_DIV8 /*!< HCLK divided by 8 */ -#define LL_RCC_APB2_DIV_16 RCC_CFGR_PPRE2_DIV16 /*!< HCLK divided by 16 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_MCOxSOURCE MCO source selection - * @{ - */ -#define LL_RCC_MCO1SOURCE_HSI (uint32_t)(RCC_CFGR_MCO1|0x00000000U) /*!< HSI selection as MCO1 source */ -#define LL_RCC_MCO1SOURCE_LSE (uint32_t)(RCC_CFGR_MCO1|(RCC_CFGR_MCO1_0 >> 16U)) /*!< LSE selection as MCO1 source */ -#define LL_RCC_MCO1SOURCE_HSE (uint32_t)(RCC_CFGR_MCO1|(RCC_CFGR_MCO1_1 >> 16U)) /*!< HSE selection as MCO1 source */ -#define LL_RCC_MCO1SOURCE_PLLCLK (uint32_t)(RCC_CFGR_MCO1|((RCC_CFGR_MCO1_1|RCC_CFGR_MCO1_0) >> 16U)) /*!< PLLCLK selection as MCO1 source */ -#if defined(RCC_CFGR_MCO2) -#define LL_RCC_MCO2SOURCE_SYSCLK (uint32_t)(RCC_CFGR_MCO2|0x00000000U) /*!< SYSCLK selection as MCO2 source */ -#define LL_RCC_MCO2SOURCE_PLLI2S (uint32_t)(RCC_CFGR_MCO2|(RCC_CFGR_MCO2_0 >> 16U)) /*!< PLLI2S selection as MCO2 source */ -#define LL_RCC_MCO2SOURCE_HSE (uint32_t)(RCC_CFGR_MCO2|(RCC_CFGR_MCO2_1 >> 16U)) /*!< HSE selection as MCO2 source */ -#define LL_RCC_MCO2SOURCE_PLLCLK (uint32_t)(RCC_CFGR_MCO2|((RCC_CFGR_MCO2_1|RCC_CFGR_MCO2_0) >> 16U)) /*!< PLLCLK selection as MCO2 source */ -#endif /* RCC_CFGR_MCO2 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_MCOx_DIV MCO prescaler - * @{ - */ -#define LL_RCC_MCO1_DIV_1 (uint32_t)(RCC_CFGR_MCO1PRE|0x00000000U) /*!< MCO1 not divided */ -#define LL_RCC_MCO1_DIV_2 (uint32_t)(RCC_CFGR_MCO1PRE|(RCC_CFGR_MCO1PRE_2 >> 16U)) /*!< MCO1 divided by 2 */ -#define LL_RCC_MCO1_DIV_3 (uint32_t)(RCC_CFGR_MCO1PRE|((RCC_CFGR_MCO1PRE_2|RCC_CFGR_MCO1PRE_0) >> 16U)) /*!< MCO1 divided by 3 */ -#define LL_RCC_MCO1_DIV_4 (uint32_t)(RCC_CFGR_MCO1PRE|((RCC_CFGR_MCO1PRE_2|RCC_CFGR_MCO1PRE_1) >> 16U)) /*!< MCO1 divided by 4 */ -#define LL_RCC_MCO1_DIV_5 (uint32_t)(RCC_CFGR_MCO1PRE|(RCC_CFGR_MCO1PRE >> 16U)) /*!< MCO1 divided by 5 */ -#if defined(RCC_CFGR_MCO2PRE) -#define LL_RCC_MCO2_DIV_1 (uint32_t)(RCC_CFGR_MCO2PRE|0x00000000U) /*!< MCO2 not divided */ -#define LL_RCC_MCO2_DIV_2 (uint32_t)(RCC_CFGR_MCO2PRE|(RCC_CFGR_MCO2PRE_2 >> 16U)) /*!< MCO2 divided by 2 */ -#define LL_RCC_MCO2_DIV_3 (uint32_t)(RCC_CFGR_MCO2PRE|((RCC_CFGR_MCO2PRE_2|RCC_CFGR_MCO2PRE_0) >> 16U)) /*!< MCO2 divided by 3 */ -#define LL_RCC_MCO2_DIV_4 (uint32_t)(RCC_CFGR_MCO2PRE|((RCC_CFGR_MCO2PRE_2|RCC_CFGR_MCO2PRE_1) >> 16U)) /*!< MCO2 divided by 4 */ -#define LL_RCC_MCO2_DIV_5 (uint32_t)(RCC_CFGR_MCO2PRE|(RCC_CFGR_MCO2PRE >> 16U)) /*!< MCO2 divided by 5 */ -#endif /* RCC_CFGR_MCO2PRE */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_RTC_HSEDIV HSE prescaler for RTC clock - * @{ - */ -#define LL_RCC_RTC_NOCLOCK 0x00000000U /*!< HSE not divided */ -#define LL_RCC_RTC_HSE_DIV_2 RCC_CFGR_RTCPRE_1 /*!< HSE clock divided by 2 */ -#define LL_RCC_RTC_HSE_DIV_3 (RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 3 */ -#define LL_RCC_RTC_HSE_DIV_4 RCC_CFGR_RTCPRE_2 /*!< HSE clock divided by 4 */ -#define LL_RCC_RTC_HSE_DIV_5 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 5 */ -#define LL_RCC_RTC_HSE_DIV_6 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 6 */ -#define LL_RCC_RTC_HSE_DIV_7 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 7 */ -#define LL_RCC_RTC_HSE_DIV_8 RCC_CFGR_RTCPRE_3 /*!< HSE clock divided by 8 */ -#define LL_RCC_RTC_HSE_DIV_9 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 9 */ -#define LL_RCC_RTC_HSE_DIV_10 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 10 */ -#define LL_RCC_RTC_HSE_DIV_11 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 11 */ -#define LL_RCC_RTC_HSE_DIV_12 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 12 */ -#define LL_RCC_RTC_HSE_DIV_13 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 13 */ -#define LL_RCC_RTC_HSE_DIV_14 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 14 */ -#define LL_RCC_RTC_HSE_DIV_15 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 15 */ -#define LL_RCC_RTC_HSE_DIV_16 RCC_CFGR_RTCPRE_4 /*!< HSE clock divided by 16 */ -#define LL_RCC_RTC_HSE_DIV_17 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 17 */ -#define LL_RCC_RTC_HSE_DIV_18 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 18 */ -#define LL_RCC_RTC_HSE_DIV_19 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 19 */ -#define LL_RCC_RTC_HSE_DIV_20 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 20 */ -#define LL_RCC_RTC_HSE_DIV_21 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 21 */ -#define LL_RCC_RTC_HSE_DIV_22 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 22 */ -#define LL_RCC_RTC_HSE_DIV_23 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 23 */ -#define LL_RCC_RTC_HSE_DIV_24 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3) /*!< HSE clock divided by 24 */ -#define LL_RCC_RTC_HSE_DIV_25 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 25 */ -#define LL_RCC_RTC_HSE_DIV_26 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 26 */ -#define LL_RCC_RTC_HSE_DIV_27 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 27 */ -#define LL_RCC_RTC_HSE_DIV_28 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 28 */ -#define LL_RCC_RTC_HSE_DIV_29 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 29 */ -#define LL_RCC_RTC_HSE_DIV_30 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 30 */ -#define LL_RCC_RTC_HSE_DIV_31 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 31 */ -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup RCC_LL_EC_PERIPH_FREQUENCY Peripheral clock frequency - * @{ - */ -#define LL_RCC_PERIPH_FREQUENCY_NO 0x00000000U /*!< No clock enabled for the peripheral */ -#define LL_RCC_PERIPH_FREQUENCY_NA 0xFFFFFFFFU /*!< Frequency cannot be provided as external clock */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -#if defined(FMPI2C1) -/** @defgroup RCC_LL_EC_FMPI2C1_CLKSOURCE Peripheral FMPI2C clock source selection - * @{ - */ -#define LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 0x00000000U /*!< PCLK1 clock used as FMPI2C1 clock source */ -#define LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK RCC_DCKCFGR2_FMPI2C1SEL_0 /*!< SYSCLK clock used as FMPI2C1 clock source */ -#define LL_RCC_FMPI2C1_CLKSOURCE_HSI RCC_DCKCFGR2_FMPI2C1SEL_1 /*!< HSI clock used as FMPI2C1 clock source */ -/** - * @} - */ -#endif /* FMPI2C1 */ - -#if defined(LPTIM1) -/** @defgroup RCC_LL_EC_LPTIM1_CLKSOURCE Peripheral LPTIM clock source selection - * @{ - */ -#define LL_RCC_LPTIM1_CLKSOURCE_PCLK1 0x00000000U /*!< PCLK1 clock used as LPTIM1 clock */ -#define LL_RCC_LPTIM1_CLKSOURCE_HSI RCC_DCKCFGR2_LPTIM1SEL_0 /*!< LSI oscillator clock used as LPTIM1 clock */ -#define LL_RCC_LPTIM1_CLKSOURCE_LSI RCC_DCKCFGR2_LPTIM1SEL_1 /*!< HSI oscillator clock used as LPTIM1 clock */ -#define LL_RCC_LPTIM1_CLKSOURCE_LSE (uint32_t)(RCC_DCKCFGR2_LPTIM1SEL_1 | RCC_DCKCFGR2_LPTIM1SEL_0) /*!< LSE oscillator clock used as LPTIM1 clock */ -/** - * @} - */ -#endif /* LPTIM1 */ - -#if defined(SAI1) -/** @defgroup RCC_LL_EC_SAIx_CLKSOURCE Peripheral SAI clock source selection - * @{ - */ -#if defined(RCC_DCKCFGR_SAI1SRC) -#define LL_RCC_SAI1_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1SRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 clock source */ -#define LL_RCC_SAI1_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 clock source */ -#define LL_RCC_SAI1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC_1 >> 16)) /*!< PLL clock used as SAI1 clock source */ -#define LL_RCC_SAI1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC >> 16)) /*!< External pin clock used as SAI1 clock source */ -#endif /* RCC_DCKCFGR_SAI1SRC */ -#if defined(RCC_DCKCFGR_SAI2SRC) -#define LL_RCC_SAI2_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI2SRC | 0x00000000U) /*!< PLLSAI clock used as SAI2 clock source */ -#define LL_RCC_SAI2_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC_0 >> 16)) /*!< PLLI2S clock used as SAI2 clock source */ -#define LL_RCC_SAI2_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC_1 >> 16)) /*!< PLL clock used as SAI2 clock source */ -#define LL_RCC_SAI2_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC >> 16)) /*!< PLL Main clock used as SAI2 clock source */ -#endif /* RCC_DCKCFGR_SAI2SRC */ -#if defined(RCC_DCKCFGR_SAI1ASRC) -#if defined(RCC_SAI1A_PLLSOURCE_SUPPORT) -#define LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1ASRC | 0x00000000U) /*!< PLLI2S clock used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_0 >> 16)) /*!< External pin used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_1 >> 16)) /*!< PLL clock used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC >> 16)) /*!< PLL Main clock used as SAI1 block A clock source */ -#else -#define LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1ASRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_1 >> 16)) /*!< External pin clock used as SAI1 block A clock source */ -#endif /* RCC_SAI1A_PLLSOURCE_SUPPORT */ -#endif /* RCC_DCKCFGR_SAI1ASRC */ -#if defined(RCC_DCKCFGR_SAI1BSRC) -#if defined(RCC_SAI1B_PLLSOURCE_SUPPORT) -#define LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1BSRC | 0x00000000U) /*!< PLLI2S clock used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_0 >> 16)) /*!< External pin used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_1 >> 16)) /*!< PLL clock used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC >> 16)) /*!< PLL Main clock used as SAI1 block B clock source */ -#else -#define LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1BSRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_1 >> 16)) /*!< External pin clock used as SAI1 block B clock source */ -#endif /* RCC_SAI1B_PLLSOURCE_SUPPORT */ -#endif /* RCC_DCKCFGR_SAI1BSRC */ -/** - * @} - */ -#endif /* SAI1 */ - -#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) -/** @defgroup RCC_LL_EC_SDIOx_CLKSOURCE Peripheral SDIO clock source selection - * @{ - */ -#define LL_RCC_SDIO_CLKSOURCE_PLL48CLK 0x00000000U /*!< PLL 48M domain clock used as SDIO clock */ -#if defined(RCC_DCKCFGR_SDIOSEL) -#define LL_RCC_SDIO_CLKSOURCE_SYSCLK RCC_DCKCFGR_SDIOSEL /*!< System clock clock used as SDIO clock */ -#else -#define LL_RCC_SDIO_CLKSOURCE_SYSCLK RCC_DCKCFGR2_SDIOSEL /*!< System clock clock used as SDIO clock */ -#endif /* RCC_DCKCFGR_SDIOSEL */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ - -#if defined(DSI) -/** @defgroup RCC_LL_EC_DSI_CLKSOURCE Peripheral DSI clock source selection - * @{ - */ -#define LL_RCC_DSI_CLKSOURCE_PHY 0x00000000U /*!< DSI-PHY clock used as DSI byte lane clock source */ -#define LL_RCC_DSI_CLKSOURCE_PLL RCC_DCKCFGR_DSISEL /*!< PLL clock used as DSI byte lane clock source */ -/** - * @} - */ -#endif /* DSI */ - -#if defined(CEC) -/** @defgroup RCC_LL_EC_CEC_CLKSOURCE Peripheral CEC clock source selection - * @{ - */ -#define LL_RCC_CEC_CLKSOURCE_HSI_DIV488 0x00000000U /*!< HSI oscillator clock divided by 488 used as CEC clock */ -#define LL_RCC_CEC_CLKSOURCE_LSE RCC_DCKCFGR2_CECSEL /*!< LSE oscillator clock used as CEC clock */ -/** - * @} - */ -#endif /* CEC */ - -/** @defgroup RCC_LL_EC_I2S1_CLKSOURCE Peripheral I2S clock source selection - * @{ - */ -#if defined(RCC_CFGR_I2SSRC) -#define LL_RCC_I2S1_CLKSOURCE_PLLI2S 0x00000000U /*!< I2S oscillator clock used as I2S1 clock */ -#define LL_RCC_I2S1_CLKSOURCE_PIN RCC_CFGR_I2SSRC /*!< External pin clock used as I2S1 clock */ -#endif /* RCC_CFGR_I2SSRC */ -#if defined(RCC_DCKCFGR_I2SSRC) -#define LL_RCC_I2S1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2SSRC | 0x00000000U) /*!< PLL clock used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2SSRC | (RCC_DCKCFGR_I2SSRC_0 >> 16)) /*!< External pin used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2SSRC | (RCC_DCKCFGR_I2SSRC_1 >> 16)) /*!< PLL Main clock used as I2S1 clock source */ -#endif /* RCC_DCKCFGR_I2SSRC */ -#if defined(RCC_DCKCFGR_I2S1SRC) -#define LL_RCC_I2S1_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_I2S1SRC | 0x00000000U) /*!< PLLI2S clock used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC_0 >> 16)) /*!< External pin used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC_1 >> 16)) /*!< PLL clock used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC >> 16)) /*!< PLL Main clock used as I2S1 clock source */ -#endif /* RCC_DCKCFGR_I2S1SRC */ -#if defined(RCC_DCKCFGR_I2S2SRC) -#define LL_RCC_I2S2_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_I2S2SRC | 0x00000000U) /*!< PLLI2S clock used as I2S2 clock source */ -#define LL_RCC_I2S2_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC_0 >> 16)) /*!< External pin used as I2S2 clock source */ -#define LL_RCC_I2S2_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC_1 >> 16)) /*!< PLL clock used as I2S2 clock source */ -#define LL_RCC_I2S2_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC >> 16)) /*!< PLL Main clock used as I2S2 clock source */ -#endif /* RCC_DCKCFGR_I2S2SRC */ -/** - * @} - */ - -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -/** @defgroup RCC_LL_EC_CK48M_CLKSOURCE Peripheral 48Mhz domain clock source selection - * @{ - */ -#if defined(RCC_DCKCFGR_CK48MSEL) -#define LL_RCC_CK48M_CLKSOURCE_PLL 0x00000000U /*!< PLL oscillator clock used as 48Mhz domain clock */ -#define LL_RCC_CK48M_CLKSOURCE_PLLSAI RCC_DCKCFGR_CK48MSEL /*!< PLLSAI oscillator clock used as 48Mhz domain clock */ -#endif /* RCC_DCKCFGR_CK48MSEL */ -#if defined(RCC_DCKCFGR2_CK48MSEL) -#define LL_RCC_CK48M_CLKSOURCE_PLL 0x00000000U /*!< PLL oscillator clock used as 48Mhz domain clock */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_CK48M_CLKSOURCE_PLLSAI RCC_DCKCFGR2_CK48MSEL /*!< PLLSAI oscillator clock used as 48Mhz domain clock */ -#endif /* RCC_PLLSAI_SUPPORT */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -#define LL_RCC_CK48M_CLKSOURCE_PLLI2S RCC_DCKCFGR2_CK48MSEL /*!< PLLI2S oscillator clock used as 48Mhz domain clock */ -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ -#endif /* RCC_DCKCFGR2_CK48MSEL */ -/** - * @} - */ - -#if defined(RNG) -/** @defgroup RCC_LL_EC_RNG_CLKSOURCE Peripheral RNG clock source selection - * @{ - */ -#define LL_RCC_RNG_CLKSOURCE_PLL LL_RCC_CK48M_CLKSOURCE_PLL /*!< PLL clock used as RNG clock source */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_RNG_CLKSOURCE_PLLSAI LL_RCC_CK48M_CLKSOURCE_PLLSAI /*!< PLLSAI clock used as RNG clock source */ -#endif /* RCC_PLLSAI_SUPPORT */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -#define LL_RCC_RNG_CLKSOURCE_PLLI2S LL_RCC_CK48M_CLKSOURCE_PLLI2S /*!< PLLI2S clock used as RNG clock source */ -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ -/** - * @} - */ -#endif /* RNG */ - -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -/** @defgroup RCC_LL_EC_USB_CLKSOURCE Peripheral USB clock source selection - * @{ - */ -#define LL_RCC_USB_CLKSOURCE_PLL LL_RCC_CK48M_CLKSOURCE_PLL /*!< PLL clock used as USB clock source */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_USB_CLKSOURCE_PLLSAI LL_RCC_CK48M_CLKSOURCE_PLLSAI /*!< PLLSAI clock used as USB clock source */ -#endif /* RCC_PLLSAI_SUPPORT */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -#define LL_RCC_USB_CLKSOURCE_PLLI2S LL_RCC_CK48M_CLKSOURCE_PLLI2S /*!< PLLI2S clock used as USB clock source */ -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ -/** - * @} - */ -#endif /* USB_OTG_FS || USB_OTG_HS */ - -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ - -#if defined(DFSDM1_Channel0) || defined(DFSDM2_Channel0) -/** @defgroup RCC_LL_EC_DFSDM1_AUDIO_CLKSOURCE Peripheral DFSDM Audio clock source selection - * @{ - */ -#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 (uint32_t)(RCC_DCKCFGR_CKDFSDM1ASEL | 0x00000000U) /*!< I2S1 clock used as DFSDM1 Audio clock source */ -#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 (uint32_t)(RCC_DCKCFGR_CKDFSDM1ASEL | (RCC_DCKCFGR_CKDFSDM1ASEL << 16)) /*!< I2S2 clock used as DFSDM1 Audio clock source */ -#if defined(DFSDM2_Channel0) -#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (uint32_t)(RCC_DCKCFGR_CKDFSDM2ASEL | 0x00000000U) /*!< I2S1 clock used as DFSDM2 Audio clock source */ -#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (uint32_t)(RCC_DCKCFGR_CKDFSDM2ASEL | (RCC_DCKCFGR_CKDFSDM2ASEL << 16)) /*!< I2S2 clock used as DFSDM2 Audio clock source */ -#endif /* DFSDM2_Channel0 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_DFSDM1_CLKSOURCE Peripheral DFSDM clock source selection - * @{ - */ -#define LL_RCC_DFSDM1_CLKSOURCE_PCLK2 0x00000000U /*!< PCLK2 clock used as DFSDM1 clock */ -#define LL_RCC_DFSDM1_CLKSOURCE_SYSCLK RCC_DCKCFGR_CKDFSDM1SEL /*!< System clock used as DFSDM1 clock */ -#if defined(DFSDM2_Channel0) -#define LL_RCC_DFSDM2_CLKSOURCE_PCLK2 0x00000000U /*!< PCLK2 clock used as DFSDM2 clock */ -#define LL_RCC_DFSDM2_CLKSOURCE_SYSCLK RCC_DCKCFGR_CKDFSDM1SEL /*!< System clock used as DFSDM2 clock */ -#endif /* DFSDM2_Channel0 */ -/** - * @} - */ -#endif /* DFSDM1_Channel0 || DFSDM2_Channel0 */ - -#if defined(FMPI2C1) -/** @defgroup RCC_LL_EC_FMPI2C1 Peripheral FMPI2C get clock source - * @{ - */ -#define LL_RCC_FMPI2C1_CLKSOURCE RCC_DCKCFGR2_FMPI2C1SEL /*!< FMPI2C1 Clock source selection */ -/** - * @} - */ -#endif /* FMPI2C1 */ - -#if defined(SPDIFRX) -/** @defgroup RCC_LL_EC_SPDIFRX_CLKSOURCE Peripheral SPDIFRX clock source selection - * @{ - */ -#define LL_RCC_SPDIFRX1_CLKSOURCE_PLL 0x00000000U /*!< PLL clock used as SPDIFRX clock source */ -#define LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S RCC_DCKCFGR2_SPDIFRXSEL /*!< PLLI2S clock used as SPDIFRX clock source */ -/** - * @} - */ -#endif /* SPDIFRX */ - -#if defined(LPTIM1) -/** @defgroup RCC_LL_EC_LPTIM1 Peripheral LPTIM get clock source - * @{ - */ -#define LL_RCC_LPTIM1_CLKSOURCE RCC_DCKCFGR2_LPTIM1SEL /*!< LPTIM1 Clock source selection */ -/** - * @} - */ -#endif /* LPTIM1 */ - -#if defined(SAI1) -/** @defgroup RCC_LL_EC_SAIx Peripheral SAI get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_SAI1ASRC) -#define LL_RCC_SAI1_A_CLKSOURCE RCC_DCKCFGR_SAI1ASRC /*!< SAI1 block A Clock source selection */ -#endif /* RCC_DCKCFGR_SAI1ASRC */ -#if defined(RCC_DCKCFGR_SAI1BSRC) -#define LL_RCC_SAI1_B_CLKSOURCE RCC_DCKCFGR_SAI1BSRC /*!< SAI1 block B Clock source selection */ -#endif /* RCC_DCKCFGR_SAI1BSRC */ -#if defined(RCC_DCKCFGR_SAI1SRC) -#define LL_RCC_SAI1_CLKSOURCE RCC_DCKCFGR_SAI1SRC /*!< SAI1 Clock source selection */ -#endif /* RCC_DCKCFGR_SAI1SRC */ -#if defined(RCC_DCKCFGR_SAI2SRC) -#define LL_RCC_SAI2_CLKSOURCE RCC_DCKCFGR_SAI2SRC /*!< SAI2 Clock source selection */ -#endif /* RCC_DCKCFGR_SAI2SRC */ -/** - * @} - */ -#endif /* SAI1 */ - -#if defined(SDIO) -/** @defgroup RCC_LL_EC_SDIOx Peripheral SDIO get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_SDIOSEL) -#define LL_RCC_SDIO_CLKSOURCE RCC_DCKCFGR_SDIOSEL /*!< SDIO Clock source selection */ -#elif defined(RCC_DCKCFGR2_SDIOSEL) -#define LL_RCC_SDIO_CLKSOURCE RCC_DCKCFGR2_SDIOSEL /*!< SDIO Clock source selection */ -#else -#define LL_RCC_SDIO_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< SDIO Clock source selection */ -#endif /* RCC_DCKCFGR_SDIOSEL */ -/** - * @} - */ -#endif /* SDIO */ - -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -/** @defgroup RCC_LL_EC_CK48M Peripheral CK48M get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_CK48MSEL) -#define LL_RCC_CK48M_CLKSOURCE RCC_DCKCFGR_CK48MSEL /*!< CK48M Domain clock source selection */ -#endif /* RCC_DCKCFGR_CK48MSEL */ -#if defined(RCC_DCKCFGR2_CK48MSEL) -#define LL_RCC_CK48M_CLKSOURCE RCC_DCKCFGR2_CK48MSEL /*!< CK48M Domain clock source selection */ -#endif /* RCC_DCKCFGR_CK48MSEL */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ - -#if defined(RNG) -/** @defgroup RCC_LL_EC_RNG Peripheral RNG get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -#define LL_RCC_RNG_CLKSOURCE LL_RCC_CK48M_CLKSOURCE /*!< RNG Clock source selection */ -#else -#define LL_RCC_RNG_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< RNG Clock source selection */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ -/** - * @} - */ -#endif /* RNG */ - -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -/** @defgroup RCC_LL_EC_USB Peripheral USB get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -#define LL_RCC_USB_CLKSOURCE LL_RCC_CK48M_CLKSOURCE /*!< USB Clock source selection */ -#else -#define LL_RCC_USB_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< USB Clock source selection */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ -/** - * @} - */ -#endif /* USB_OTG_FS || USB_OTG_HS */ - -#if defined(CEC) -/** @defgroup RCC_LL_EC_CEC Peripheral CEC get clock source - * @{ - */ -#define LL_RCC_CEC_CLKSOURCE RCC_DCKCFGR2_CECSEL /*!< CEC Clock source selection */ -/** - * @} - */ -#endif /* CEC */ - -/** @defgroup RCC_LL_EC_I2S1 Peripheral I2S get clock source - * @{ - */ -#if defined(RCC_CFGR_I2SSRC) -#define LL_RCC_I2S1_CLKSOURCE RCC_CFGR_I2SSRC /*!< I2S1 Clock source selection */ -#endif /* RCC_CFGR_I2SSRC */ -#if defined(RCC_DCKCFGR_I2SSRC) -#define LL_RCC_I2S1_CLKSOURCE RCC_DCKCFGR_I2SSRC /*!< I2S1 Clock source selection */ -#endif /* RCC_DCKCFGR_I2SSRC */ -#if defined(RCC_DCKCFGR_I2S1SRC) -#define LL_RCC_I2S1_CLKSOURCE RCC_DCKCFGR_I2S1SRC /*!< I2S1 Clock source selection */ -#endif /* RCC_DCKCFGR_I2S1SRC */ -#if defined(RCC_DCKCFGR_I2S2SRC) -#define LL_RCC_I2S2_CLKSOURCE RCC_DCKCFGR_I2S2SRC /*!< I2S2 Clock source selection */ -#endif /* RCC_DCKCFGR_I2S2SRC */ -/** - * @} - */ - -#if defined(DFSDM1_Channel0) || defined(DFSDM2_Channel0) -/** @defgroup RCC_LL_EC_DFSDM_AUDIO Peripheral DFSDM Audio get clock source - * @{ - */ -#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE RCC_DCKCFGR_CKDFSDM1ASEL /*!< DFSDM1 Audio Clock source selection */ -#if defined(DFSDM2_Channel0) -#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE RCC_DCKCFGR_CKDFSDM2ASEL /*!< DFSDM2 Audio Clock source selection */ -#endif /* DFSDM2_Channel0 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_DFSDM Peripheral DFSDM get clock source - * @{ - */ -#define LL_RCC_DFSDM1_CLKSOURCE RCC_DCKCFGR_CKDFSDM1SEL /*!< DFSDM1 Clock source selection */ -#if defined(DFSDM2_Channel0) -#define LL_RCC_DFSDM2_CLKSOURCE RCC_DCKCFGR_CKDFSDM1SEL /*!< DFSDM2 Clock source selection */ -#endif /* DFSDM2_Channel0 */ -/** - * @} - */ -#endif /* DFSDM1_Channel0 || DFSDM2_Channel0 */ - -#if defined(SPDIFRX) -/** @defgroup RCC_LL_EC_SPDIFRX Peripheral SPDIFRX get clock source - * @{ - */ -#define LL_RCC_SPDIFRX1_CLKSOURCE RCC_DCKCFGR2_SPDIFRXSEL /*!< SPDIFRX Clock source selection */ -/** - * @} - */ -#endif /* SPDIFRX */ - -#if defined(DSI) -/** @defgroup RCC_LL_EC_DSI Peripheral DSI get clock source - * @{ - */ -#define LL_RCC_DSI_CLKSOURCE RCC_DCKCFGR_DSISEL /*!< DSI Clock source selection */ -/** - * @} - */ -#endif /* DSI */ - -#if defined(LTDC) -/** @defgroup RCC_LL_EC_LTDC Peripheral LTDC get clock source - * @{ - */ -#define LL_RCC_LTDC_CLKSOURCE RCC_DCKCFGR_PLLSAIDIVR /*!< LTDC Clock source selection */ -/** - * @} - */ -#endif /* LTDC */ - - -/** @defgroup RCC_LL_EC_RTC_CLKSOURCE RTC clock source selection - * @{ - */ -#define LL_RCC_RTC_CLKSOURCE_NONE 0x00000000U /*!< No clock used as RTC clock */ -#define LL_RCC_RTC_CLKSOURCE_LSE RCC_BDCR_RTCSEL_0 /*!< LSE oscillator clock used as RTC clock */ -#define LL_RCC_RTC_CLKSOURCE_LSI RCC_BDCR_RTCSEL_1 /*!< LSI oscillator clock used as RTC clock */ -#define LL_RCC_RTC_CLKSOURCE_HSE RCC_BDCR_RTCSEL /*!< HSE oscillator clock divided by HSE prescaler used as RTC clock */ -/** - * @} - */ - -#if defined(RCC_DCKCFGR_TIMPRE) -/** @defgroup RCC_LL_EC_TIM_CLKPRESCALER Timers clocks prescalers selection - * @{ - */ -#define LL_RCC_TIM_PRESCALER_TWICE 0x00000000U /*!< Timers clock to twice PCLK */ -#define LL_RCC_TIM_PRESCALER_FOUR_TIMES RCC_DCKCFGR_TIMPRE /*!< Timers clock to four time PCLK */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_TIMPRE */ - -/** @defgroup RCC_LL_EC_PLLSOURCE PLL, PLLI2S and PLLSAI entry clock source - * @{ - */ -#define LL_RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI /*!< HSI16 clock selected as PLL entry clock source */ -#define LL_RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE /*!< HSE clock selected as PLL entry clock source */ -#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) -#define LL_RCC_PLLI2SSOURCE_PIN (RCC_PLLI2SCFGR_PLLI2SSRC | 0x80U) /*!< I2S External pin input clock selected as PLLI2S entry clock source */ -#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_PLLM_DIV PLL, PLLI2S and PLLSAI division factor - * @{ - */ -#define LL_RCC_PLLM_DIV_2 (RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 2 */ -#define LL_RCC_PLLM_DIV_3 (RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 3 */ -#define LL_RCC_PLLM_DIV_4 (RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 4 */ -#define LL_RCC_PLLM_DIV_5 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 5 */ -#define LL_RCC_PLLM_DIV_6 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 6 */ -#define LL_RCC_PLLM_DIV_7 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 7 */ -#define LL_RCC_PLLM_DIV_8 (RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 8 */ -#define LL_RCC_PLLM_DIV_9 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 9 */ -#define LL_RCC_PLLM_DIV_10 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 10 */ -#define LL_RCC_PLLM_DIV_11 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 11 */ -#define LL_RCC_PLLM_DIV_12 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 12 */ -#define LL_RCC_PLLM_DIV_13 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 13 */ -#define LL_RCC_PLLM_DIV_14 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 14 */ -#define LL_RCC_PLLM_DIV_15 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 15 */ -#define LL_RCC_PLLM_DIV_16 (RCC_PLLCFGR_PLLM_4) /*!< PLL, PLLI2S and PLLSAI division factor by 16 */ -#define LL_RCC_PLLM_DIV_17 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 17 */ -#define LL_RCC_PLLM_DIV_18 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 18 */ -#define LL_RCC_PLLM_DIV_19 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 19 */ -#define LL_RCC_PLLM_DIV_20 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 20 */ -#define LL_RCC_PLLM_DIV_21 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 21 */ -#define LL_RCC_PLLM_DIV_22 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 22 */ -#define LL_RCC_PLLM_DIV_23 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 23 */ -#define LL_RCC_PLLM_DIV_24 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 24 */ -#define LL_RCC_PLLM_DIV_25 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 25 */ -#define LL_RCC_PLLM_DIV_26 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 26 */ -#define LL_RCC_PLLM_DIV_27 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 27 */ -#define LL_RCC_PLLM_DIV_28 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 28 */ -#define LL_RCC_PLLM_DIV_29 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 29 */ -#define LL_RCC_PLLM_DIV_30 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 30 */ -#define LL_RCC_PLLM_DIV_31 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 31 */ -#define LL_RCC_PLLM_DIV_32 (RCC_PLLCFGR_PLLM_5) /*!< PLL, PLLI2S and PLLSAI division factor by 32 */ -#define LL_RCC_PLLM_DIV_33 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 33 */ -#define LL_RCC_PLLM_DIV_34 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 34 */ -#define LL_RCC_PLLM_DIV_35 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 35 */ -#define LL_RCC_PLLM_DIV_36 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 36 */ -#define LL_RCC_PLLM_DIV_37 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 37 */ -#define LL_RCC_PLLM_DIV_38 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 38 */ -#define LL_RCC_PLLM_DIV_39 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 39 */ -#define LL_RCC_PLLM_DIV_40 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 40 */ -#define LL_RCC_PLLM_DIV_41 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 41 */ -#define LL_RCC_PLLM_DIV_42 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 42 */ -#define LL_RCC_PLLM_DIV_43 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 43 */ -#define LL_RCC_PLLM_DIV_44 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 44 */ -#define LL_RCC_PLLM_DIV_45 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 45 */ -#define LL_RCC_PLLM_DIV_46 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 46 */ -#define LL_RCC_PLLM_DIV_47 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 47 */ -#define LL_RCC_PLLM_DIV_48 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4) /*!< PLL, PLLI2S and PLLSAI division factor by 48 */ -#define LL_RCC_PLLM_DIV_49 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 49 */ -#define LL_RCC_PLLM_DIV_50 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 50 */ -#define LL_RCC_PLLM_DIV_51 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 51 */ -#define LL_RCC_PLLM_DIV_52 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 52 */ -#define LL_RCC_PLLM_DIV_53 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 53 */ -#define LL_RCC_PLLM_DIV_54 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 54 */ -#define LL_RCC_PLLM_DIV_55 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 55 */ -#define LL_RCC_PLLM_DIV_56 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 56 */ -#define LL_RCC_PLLM_DIV_57 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 57 */ -#define LL_RCC_PLLM_DIV_58 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 58 */ -#define LL_RCC_PLLM_DIV_59 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 59 */ -#define LL_RCC_PLLM_DIV_60 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 60 */ -#define LL_RCC_PLLM_DIV_61 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 61 */ -#define LL_RCC_PLLM_DIV_62 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 62 */ -#define LL_RCC_PLLM_DIV_63 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 63 */ -/** - * @} - */ - -#if defined(RCC_PLLCFGR_PLLR) -/** @defgroup RCC_LL_EC_PLLR_DIV PLL division factor (PLLR) - * @{ - */ -#define LL_RCC_PLLR_DIV_2 (RCC_PLLCFGR_PLLR_1) /*!< Main PLL division factor for PLLCLK (system clock) by 2 */ -#define LL_RCC_PLLR_DIV_3 (RCC_PLLCFGR_PLLR_1|RCC_PLLCFGR_PLLR_0) /*!< Main PLL division factor for PLLCLK (system clock) by 3 */ -#define LL_RCC_PLLR_DIV_4 (RCC_PLLCFGR_PLLR_2) /*!< Main PLL division factor for PLLCLK (system clock) by 4 */ -#define LL_RCC_PLLR_DIV_5 (RCC_PLLCFGR_PLLR_2|RCC_PLLCFGR_PLLR_0) /*!< Main PLL division factor for PLLCLK (system clock) by 5 */ -#define LL_RCC_PLLR_DIV_6 (RCC_PLLCFGR_PLLR_2|RCC_PLLCFGR_PLLR_1) /*!< Main PLL division factor for PLLCLK (system clock) by 6 */ -#define LL_RCC_PLLR_DIV_7 (RCC_PLLCFGR_PLLR) /*!< Main PLL division factor for PLLCLK (system clock) by 7 */ -/** - * @} - */ -#endif /* RCC_PLLCFGR_PLLR */ - -#if defined(RCC_DCKCFGR_PLLDIVR) -/** @defgroup RCC_LL_EC_PLLDIVR PLLDIVR division factor (PLLDIVR) - * @{ - */ -#define LL_RCC_PLLDIVR_DIV_1 (RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 1 */ -#define LL_RCC_PLLDIVR_DIV_2 (RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 2 */ -#define LL_RCC_PLLDIVR_DIV_3 (RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 3 */ -#define LL_RCC_PLLDIVR_DIV_4 (RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 4 */ -#define LL_RCC_PLLDIVR_DIV_5 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 5 */ -#define LL_RCC_PLLDIVR_DIV_6 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 6 */ -#define LL_RCC_PLLDIVR_DIV_7 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 7 */ -#define LL_RCC_PLLDIVR_DIV_8 (RCC_DCKCFGR_PLLDIVR_3) /*!< PLL division factor for PLLDIVR output by 8 */ -#define LL_RCC_PLLDIVR_DIV_9 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 9 */ -#define LL_RCC_PLLDIVR_DIV_10 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 10 */ -#define LL_RCC_PLLDIVR_DIV_11 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 11 */ -#define LL_RCC_PLLDIVR_DIV_12 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 12 */ -#define LL_RCC_PLLDIVR_DIV_13 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 13 */ -#define LL_RCC_PLLDIVR_DIV_14 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 14 */ -#define LL_RCC_PLLDIVR_DIV_15 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 15 */ -#define LL_RCC_PLLDIVR_DIV_16 (RCC_DCKCFGR_PLLDIVR_4) /*!< PLL division factor for PLLDIVR output by 16 */ -#define LL_RCC_PLLDIVR_DIV_17 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 17 */ -#define LL_RCC_PLLDIVR_DIV_18 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 18 */ -#define LL_RCC_PLLDIVR_DIV_19 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 19 */ -#define LL_RCC_PLLDIVR_DIV_20 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 20 */ -#define LL_RCC_PLLDIVR_DIV_21 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 21 */ -#define LL_RCC_PLLDIVR_DIV_22 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 22 */ -#define LL_RCC_PLLDIVR_DIV_23 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 23 */ -#define LL_RCC_PLLDIVR_DIV_24 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3) /*!< PLL division factor for PLLDIVR output by 24 */ -#define LL_RCC_PLLDIVR_DIV_25 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 25 */ -#define LL_RCC_PLLDIVR_DIV_26 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 26 */ -#define LL_RCC_PLLDIVR_DIV_27 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 27 */ -#define LL_RCC_PLLDIVR_DIV_28 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 28 */ -#define LL_RCC_PLLDIVR_DIV_29 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 29 */ -#define LL_RCC_PLLDIVR_DIV_30 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 30 */ -#define LL_RCC_PLLDIVR_DIV_31 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 31 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLDIVR */ - -/** @defgroup RCC_LL_EC_PLLP_DIV PLL division factor (PLLP) - * @{ - */ -#define LL_RCC_PLLP_DIV_2 0x00000000U /*!< Main PLL division factor for PLLP output by 2 */ -#define LL_RCC_PLLP_DIV_4 RCC_PLLCFGR_PLLP_0 /*!< Main PLL division factor for PLLP output by 4 */ -#define LL_RCC_PLLP_DIV_6 RCC_PLLCFGR_PLLP_1 /*!< Main PLL division factor for PLLP output by 6 */ -#define LL_RCC_PLLP_DIV_8 (RCC_PLLCFGR_PLLP_1 | RCC_PLLCFGR_PLLP_0) /*!< Main PLL division factor for PLLP output by 8 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_PLLQ_DIV PLL division factor (PLLQ) - * @{ - */ -#define LL_RCC_PLLQ_DIV_2 RCC_PLLCFGR_PLLQ_1 /*!< Main PLL division factor for PLLQ output by 2 */ -#define LL_RCC_PLLQ_DIV_3 (RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 3 */ -#define LL_RCC_PLLQ_DIV_4 RCC_PLLCFGR_PLLQ_2 /*!< Main PLL division factor for PLLQ output by 4 */ -#define LL_RCC_PLLQ_DIV_5 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 5 */ -#define LL_RCC_PLLQ_DIV_6 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 6 */ -#define LL_RCC_PLLQ_DIV_7 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 7 */ -#define LL_RCC_PLLQ_DIV_8 RCC_PLLCFGR_PLLQ_3 /*!< Main PLL division factor for PLLQ output by 8 */ -#define LL_RCC_PLLQ_DIV_9 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 9 */ -#define LL_RCC_PLLQ_DIV_10 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 10 */ -#define LL_RCC_PLLQ_DIV_11 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 11 */ -#define LL_RCC_PLLQ_DIV_12 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2) /*!< Main PLL division factor for PLLQ output by 12 */ -#define LL_RCC_PLLQ_DIV_13 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 13 */ -#define LL_RCC_PLLQ_DIV_14 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 14 */ -#define LL_RCC_PLLQ_DIV_15 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 15 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_PLL_SPRE_SEL PLL Spread Spectrum Selection - * @{ - */ -#define LL_RCC_SPREAD_SELECT_CENTER 0x00000000U /*!< PLL center spread spectrum selection */ -#define LL_RCC_SPREAD_SELECT_DOWN RCC_SSCGR_SPREADSEL /*!< PLL down spread spectrum selection */ -/** - * @} - */ - -#if defined(RCC_PLLI2S_SUPPORT) -/** @defgroup RCC_LL_EC_PLLI2SM PLLI2SM division factor (PLLI2SM) - * @{ - */ -#if defined(RCC_PLLI2SCFGR_PLLI2SM) -#define LL_RCC_PLLI2SM_DIV_2 (RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 2 */ -#define LL_RCC_PLLI2SM_DIV_3 (RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 3 */ -#define LL_RCC_PLLI2SM_DIV_4 (RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 4 */ -#define LL_RCC_PLLI2SM_DIV_5 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 5 */ -#define LL_RCC_PLLI2SM_DIV_6 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 6 */ -#define LL_RCC_PLLI2SM_DIV_7 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 7 */ -#define LL_RCC_PLLI2SM_DIV_8 (RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 8 */ -#define LL_RCC_PLLI2SM_DIV_9 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 9 */ -#define LL_RCC_PLLI2SM_DIV_10 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 10 */ -#define LL_RCC_PLLI2SM_DIV_11 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 11 */ -#define LL_RCC_PLLI2SM_DIV_12 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 12 */ -#define LL_RCC_PLLI2SM_DIV_13 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 13 */ -#define LL_RCC_PLLI2SM_DIV_14 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 14 */ -#define LL_RCC_PLLI2SM_DIV_15 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 15 */ -#define LL_RCC_PLLI2SM_DIV_16 (RCC_PLLI2SCFGR_PLLI2SM_4) /*!< PLLI2S division factor for PLLI2SM output by 16 */ -#define LL_RCC_PLLI2SM_DIV_17 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 17 */ -#define LL_RCC_PLLI2SM_DIV_18 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 18 */ -#define LL_RCC_PLLI2SM_DIV_19 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 19 */ -#define LL_RCC_PLLI2SM_DIV_20 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 20 */ -#define LL_RCC_PLLI2SM_DIV_21 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 21 */ -#define LL_RCC_PLLI2SM_DIV_22 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 22 */ -#define LL_RCC_PLLI2SM_DIV_23 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 23 */ -#define LL_RCC_PLLI2SM_DIV_24 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 24 */ -#define LL_RCC_PLLI2SM_DIV_25 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 25 */ -#define LL_RCC_PLLI2SM_DIV_26 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 26 */ -#define LL_RCC_PLLI2SM_DIV_27 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 27 */ -#define LL_RCC_PLLI2SM_DIV_28 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 28 */ -#define LL_RCC_PLLI2SM_DIV_29 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 29 */ -#define LL_RCC_PLLI2SM_DIV_30 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 30 */ -#define LL_RCC_PLLI2SM_DIV_31 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 31 */ -#define LL_RCC_PLLI2SM_DIV_32 (RCC_PLLI2SCFGR_PLLI2SM_5) /*!< PLLI2S division factor for PLLI2SM output by 32 */ -#define LL_RCC_PLLI2SM_DIV_33 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 33 */ -#define LL_RCC_PLLI2SM_DIV_34 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 34 */ -#define LL_RCC_PLLI2SM_DIV_35 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 35 */ -#define LL_RCC_PLLI2SM_DIV_36 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 36 */ -#define LL_RCC_PLLI2SM_DIV_37 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 37 */ -#define LL_RCC_PLLI2SM_DIV_38 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 38 */ -#define LL_RCC_PLLI2SM_DIV_39 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 39 */ -#define LL_RCC_PLLI2SM_DIV_40 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 40 */ -#define LL_RCC_PLLI2SM_DIV_41 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 41 */ -#define LL_RCC_PLLI2SM_DIV_42 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 42 */ -#define LL_RCC_PLLI2SM_DIV_43 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 43 */ -#define LL_RCC_PLLI2SM_DIV_44 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 44 */ -#define LL_RCC_PLLI2SM_DIV_45 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 45 */ -#define LL_RCC_PLLI2SM_DIV_46 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 46 */ -#define LL_RCC_PLLI2SM_DIV_47 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 47 */ -#define LL_RCC_PLLI2SM_DIV_48 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4) /*!< PLLI2S division factor for PLLI2SM output by 48 */ -#define LL_RCC_PLLI2SM_DIV_49 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 49 */ -#define LL_RCC_PLLI2SM_DIV_50 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 50 */ -#define LL_RCC_PLLI2SM_DIV_51 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 51 */ -#define LL_RCC_PLLI2SM_DIV_52 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 52 */ -#define LL_RCC_PLLI2SM_DIV_53 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 53 */ -#define LL_RCC_PLLI2SM_DIV_54 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 54 */ -#define LL_RCC_PLLI2SM_DIV_55 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 55 */ -#define LL_RCC_PLLI2SM_DIV_56 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 56 */ -#define LL_RCC_PLLI2SM_DIV_57 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 57 */ -#define LL_RCC_PLLI2SM_DIV_58 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 58 */ -#define LL_RCC_PLLI2SM_DIV_59 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 59 */ -#define LL_RCC_PLLI2SM_DIV_60 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 60 */ -#define LL_RCC_PLLI2SM_DIV_61 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 61 */ -#define LL_RCC_PLLI2SM_DIV_62 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 62 */ -#define LL_RCC_PLLI2SM_DIV_63 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 63 */ -#else -#define LL_RCC_PLLI2SM_DIV_2 LL_RCC_PLLM_DIV_2 /*!< PLLI2S division factor for PLLI2SM output by 2 */ -#define LL_RCC_PLLI2SM_DIV_3 LL_RCC_PLLM_DIV_3 /*!< PLLI2S division factor for PLLI2SM output by 3 */ -#define LL_RCC_PLLI2SM_DIV_4 LL_RCC_PLLM_DIV_4 /*!< PLLI2S division factor for PLLI2SM output by 4 */ -#define LL_RCC_PLLI2SM_DIV_5 LL_RCC_PLLM_DIV_5 /*!< PLLI2S division factor for PLLI2SM output by 5 */ -#define LL_RCC_PLLI2SM_DIV_6 LL_RCC_PLLM_DIV_6 /*!< PLLI2S division factor for PLLI2SM output by 6 */ -#define LL_RCC_PLLI2SM_DIV_7 LL_RCC_PLLM_DIV_7 /*!< PLLI2S division factor for PLLI2SM output by 7 */ -#define LL_RCC_PLLI2SM_DIV_8 LL_RCC_PLLM_DIV_8 /*!< PLLI2S division factor for PLLI2SM output by 8 */ -#define LL_RCC_PLLI2SM_DIV_9 LL_RCC_PLLM_DIV_9 /*!< PLLI2S division factor for PLLI2SM output by 9 */ -#define LL_RCC_PLLI2SM_DIV_10 LL_RCC_PLLM_DIV_10 /*!< PLLI2S division factor for PLLI2SM output by 10 */ -#define LL_RCC_PLLI2SM_DIV_11 LL_RCC_PLLM_DIV_11 /*!< PLLI2S division factor for PLLI2SM output by 11 */ -#define LL_RCC_PLLI2SM_DIV_12 LL_RCC_PLLM_DIV_12 /*!< PLLI2S division factor for PLLI2SM output by 12 */ -#define LL_RCC_PLLI2SM_DIV_13 LL_RCC_PLLM_DIV_13 /*!< PLLI2S division factor for PLLI2SM output by 13 */ -#define LL_RCC_PLLI2SM_DIV_14 LL_RCC_PLLM_DIV_14 /*!< PLLI2S division factor for PLLI2SM output by 14 */ -#define LL_RCC_PLLI2SM_DIV_15 LL_RCC_PLLM_DIV_15 /*!< PLLI2S division factor for PLLI2SM output by 15 */ -#define LL_RCC_PLLI2SM_DIV_16 LL_RCC_PLLM_DIV_16 /*!< PLLI2S division factor for PLLI2SM output by 16 */ -#define LL_RCC_PLLI2SM_DIV_17 LL_RCC_PLLM_DIV_17 /*!< PLLI2S division factor for PLLI2SM output by 17 */ -#define LL_RCC_PLLI2SM_DIV_18 LL_RCC_PLLM_DIV_18 /*!< PLLI2S division factor for PLLI2SM output by 18 */ -#define LL_RCC_PLLI2SM_DIV_19 LL_RCC_PLLM_DIV_19 /*!< PLLI2S division factor for PLLI2SM output by 19 */ -#define LL_RCC_PLLI2SM_DIV_20 LL_RCC_PLLM_DIV_20 /*!< PLLI2S division factor for PLLI2SM output by 20 */ -#define LL_RCC_PLLI2SM_DIV_21 LL_RCC_PLLM_DIV_21 /*!< PLLI2S division factor for PLLI2SM output by 21 */ -#define LL_RCC_PLLI2SM_DIV_22 LL_RCC_PLLM_DIV_22 /*!< PLLI2S division factor for PLLI2SM output by 22 */ -#define LL_RCC_PLLI2SM_DIV_23 LL_RCC_PLLM_DIV_23 /*!< PLLI2S division factor for PLLI2SM output by 23 */ -#define LL_RCC_PLLI2SM_DIV_24 LL_RCC_PLLM_DIV_24 /*!< PLLI2S division factor for PLLI2SM output by 24 */ -#define LL_RCC_PLLI2SM_DIV_25 LL_RCC_PLLM_DIV_25 /*!< PLLI2S division factor for PLLI2SM output by 25 */ -#define LL_RCC_PLLI2SM_DIV_26 LL_RCC_PLLM_DIV_26 /*!< PLLI2S division factor for PLLI2SM output by 26 */ -#define LL_RCC_PLLI2SM_DIV_27 LL_RCC_PLLM_DIV_27 /*!< PLLI2S division factor for PLLI2SM output by 27 */ -#define LL_RCC_PLLI2SM_DIV_28 LL_RCC_PLLM_DIV_28 /*!< PLLI2S division factor for PLLI2SM output by 28 */ -#define LL_RCC_PLLI2SM_DIV_29 LL_RCC_PLLM_DIV_29 /*!< PLLI2S division factor for PLLI2SM output by 29 */ -#define LL_RCC_PLLI2SM_DIV_30 LL_RCC_PLLM_DIV_30 /*!< PLLI2S division factor for PLLI2SM output by 30 */ -#define LL_RCC_PLLI2SM_DIV_31 LL_RCC_PLLM_DIV_31 /*!< PLLI2S division factor for PLLI2SM output by 31 */ -#define LL_RCC_PLLI2SM_DIV_32 LL_RCC_PLLM_DIV_32 /*!< PLLI2S division factor for PLLI2SM output by 32 */ -#define LL_RCC_PLLI2SM_DIV_33 LL_RCC_PLLM_DIV_33 /*!< PLLI2S division factor for PLLI2SM output by 33 */ -#define LL_RCC_PLLI2SM_DIV_34 LL_RCC_PLLM_DIV_34 /*!< PLLI2S division factor for PLLI2SM output by 34 */ -#define LL_RCC_PLLI2SM_DIV_35 LL_RCC_PLLM_DIV_35 /*!< PLLI2S division factor for PLLI2SM output by 35 */ -#define LL_RCC_PLLI2SM_DIV_36 LL_RCC_PLLM_DIV_36 /*!< PLLI2S division factor for PLLI2SM output by 36 */ -#define LL_RCC_PLLI2SM_DIV_37 LL_RCC_PLLM_DIV_37 /*!< PLLI2S division factor for PLLI2SM output by 37 */ -#define LL_RCC_PLLI2SM_DIV_38 LL_RCC_PLLM_DIV_38 /*!< PLLI2S division factor for PLLI2SM output by 38 */ -#define LL_RCC_PLLI2SM_DIV_39 LL_RCC_PLLM_DIV_39 /*!< PLLI2S division factor for PLLI2SM output by 39 */ -#define LL_RCC_PLLI2SM_DIV_40 LL_RCC_PLLM_DIV_40 /*!< PLLI2S division factor for PLLI2SM output by 40 */ -#define LL_RCC_PLLI2SM_DIV_41 LL_RCC_PLLM_DIV_41 /*!< PLLI2S division factor for PLLI2SM output by 41 */ -#define LL_RCC_PLLI2SM_DIV_42 LL_RCC_PLLM_DIV_42 /*!< PLLI2S division factor for PLLI2SM output by 42 */ -#define LL_RCC_PLLI2SM_DIV_43 LL_RCC_PLLM_DIV_43 /*!< PLLI2S division factor for PLLI2SM output by 43 */ -#define LL_RCC_PLLI2SM_DIV_44 LL_RCC_PLLM_DIV_44 /*!< PLLI2S division factor for PLLI2SM output by 44 */ -#define LL_RCC_PLLI2SM_DIV_45 LL_RCC_PLLM_DIV_45 /*!< PLLI2S division factor for PLLI2SM output by 45 */ -#define LL_RCC_PLLI2SM_DIV_46 LL_RCC_PLLM_DIV_46 /*!< PLLI2S division factor for PLLI2SM output by 46 */ -#define LL_RCC_PLLI2SM_DIV_47 LL_RCC_PLLM_DIV_47 /*!< PLLI2S division factor for PLLI2SM output by 47 */ -#define LL_RCC_PLLI2SM_DIV_48 LL_RCC_PLLM_DIV_48 /*!< PLLI2S division factor for PLLI2SM output by 48 */ -#define LL_RCC_PLLI2SM_DIV_49 LL_RCC_PLLM_DIV_49 /*!< PLLI2S division factor for PLLI2SM output by 49 */ -#define LL_RCC_PLLI2SM_DIV_50 LL_RCC_PLLM_DIV_50 /*!< PLLI2S division factor for PLLI2SM output by 50 */ -#define LL_RCC_PLLI2SM_DIV_51 LL_RCC_PLLM_DIV_51 /*!< PLLI2S division factor for PLLI2SM output by 51 */ -#define LL_RCC_PLLI2SM_DIV_52 LL_RCC_PLLM_DIV_52 /*!< PLLI2S division factor for PLLI2SM output by 52 */ -#define LL_RCC_PLLI2SM_DIV_53 LL_RCC_PLLM_DIV_53 /*!< PLLI2S division factor for PLLI2SM output by 53 */ -#define LL_RCC_PLLI2SM_DIV_54 LL_RCC_PLLM_DIV_54 /*!< PLLI2S division factor for PLLI2SM output by 54 */ -#define LL_RCC_PLLI2SM_DIV_55 LL_RCC_PLLM_DIV_55 /*!< PLLI2S division factor for PLLI2SM output by 55 */ -#define LL_RCC_PLLI2SM_DIV_56 LL_RCC_PLLM_DIV_56 /*!< PLLI2S division factor for PLLI2SM output by 56 */ -#define LL_RCC_PLLI2SM_DIV_57 LL_RCC_PLLM_DIV_57 /*!< PLLI2S division factor for PLLI2SM output by 57 */ -#define LL_RCC_PLLI2SM_DIV_58 LL_RCC_PLLM_DIV_58 /*!< PLLI2S division factor for PLLI2SM output by 58 */ -#define LL_RCC_PLLI2SM_DIV_59 LL_RCC_PLLM_DIV_59 /*!< PLLI2S division factor for PLLI2SM output by 59 */ -#define LL_RCC_PLLI2SM_DIV_60 LL_RCC_PLLM_DIV_60 /*!< PLLI2S division factor for PLLI2SM output by 60 */ -#define LL_RCC_PLLI2SM_DIV_61 LL_RCC_PLLM_DIV_61 /*!< PLLI2S division factor for PLLI2SM output by 61 */ -#define LL_RCC_PLLI2SM_DIV_62 LL_RCC_PLLM_DIV_62 /*!< PLLI2S division factor for PLLI2SM output by 62 */ -#define LL_RCC_PLLI2SM_DIV_63 LL_RCC_PLLM_DIV_63 /*!< PLLI2S division factor for PLLI2SM output by 63 */ -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ -/** - * @} - */ - -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) -/** @defgroup RCC_LL_EC_PLLI2SQ PLLI2SQ division factor (PLLI2SQ) - * @{ - */ -#define LL_RCC_PLLI2SQ_DIV_2 RCC_PLLI2SCFGR_PLLI2SQ_1 /*!< PLLI2S division factor for PLLI2SQ output by 2 */ -#define LL_RCC_PLLI2SQ_DIV_3 (RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 3 */ -#define LL_RCC_PLLI2SQ_DIV_4 RCC_PLLI2SCFGR_PLLI2SQ_2 /*!< PLLI2S division factor for PLLI2SQ output by 4 */ -#define LL_RCC_PLLI2SQ_DIV_5 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 5 */ -#define LL_RCC_PLLI2SQ_DIV_6 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 6 */ -#define LL_RCC_PLLI2SQ_DIV_7 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 7 */ -#define LL_RCC_PLLI2SQ_DIV_8 RCC_PLLI2SCFGR_PLLI2SQ_3 /*!< PLLI2S division factor for PLLI2SQ output by 8 */ -#define LL_RCC_PLLI2SQ_DIV_9 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 9 */ -#define LL_RCC_PLLI2SQ_DIV_10 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 10 */ -#define LL_RCC_PLLI2SQ_DIV_11 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 11 */ -#define LL_RCC_PLLI2SQ_DIV_12 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2) /*!< PLLI2S division factor for PLLI2SQ output by 12 */ -#define LL_RCC_PLLI2SQ_DIV_13 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 13 */ -#define LL_RCC_PLLI2SQ_DIV_14 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 14 */ -#define LL_RCC_PLLI2SQ_DIV_15 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 15 */ -/** - * @} - */ -#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ - -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) -/** @defgroup RCC_LL_EC_PLLI2SDIVQ PLLI2SDIVQ division factor (PLLI2SDIVQ) - * @{ - */ -#define LL_RCC_PLLI2SDIVQ_DIV_1 0x00000000U /*!< PLLI2S division factor for PLLI2SDIVQ output by 1 */ -#define LL_RCC_PLLI2SDIVQ_DIV_2 RCC_DCKCFGR_PLLI2SDIVQ_0 /*!< PLLI2S division factor for PLLI2SDIVQ output by 2 */ -#define LL_RCC_PLLI2SDIVQ_DIV_3 RCC_DCKCFGR_PLLI2SDIVQ_1 /*!< PLLI2S division factor for PLLI2SDIVQ output by 3 */ -#define LL_RCC_PLLI2SDIVQ_DIV_4 (RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 4 */ -#define LL_RCC_PLLI2SDIVQ_DIV_5 RCC_DCKCFGR_PLLI2SDIVQ_2 /*!< PLLI2S division factor for PLLI2SDIVQ output by 5 */ -#define LL_RCC_PLLI2SDIVQ_DIV_6 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 6 */ -#define LL_RCC_PLLI2SDIVQ_DIV_7 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 7 */ -#define LL_RCC_PLLI2SDIVQ_DIV_8 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 8 */ -#define LL_RCC_PLLI2SDIVQ_DIV_9 RCC_DCKCFGR_PLLI2SDIVQ_3 /*!< PLLI2S division factor for PLLI2SDIVQ output by 9 */ -#define LL_RCC_PLLI2SDIVQ_DIV_10 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 10 */ -#define LL_RCC_PLLI2SDIVQ_DIV_11 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 11 */ -#define LL_RCC_PLLI2SDIVQ_DIV_12 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 12 */ -#define LL_RCC_PLLI2SDIVQ_DIV_13 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 13 */ -#define LL_RCC_PLLI2SDIVQ_DIV_14 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 14 */ -#define LL_RCC_PLLI2SDIVQ_DIV_15 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 15 */ -#define LL_RCC_PLLI2SDIVQ_DIV_16 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 16 */ -#define LL_RCC_PLLI2SDIVQ_DIV_17 RCC_DCKCFGR_PLLI2SDIVQ_4 /*!< PLLI2S division factor for PLLI2SDIVQ output by 17 */ -#define LL_RCC_PLLI2SDIVQ_DIV_18 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 18 */ -#define LL_RCC_PLLI2SDIVQ_DIV_19 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 19 */ -#define LL_RCC_PLLI2SDIVQ_DIV_20 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 20 */ -#define LL_RCC_PLLI2SDIVQ_DIV_21 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 21 */ -#define LL_RCC_PLLI2SDIVQ_DIV_22 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 22 */ -#define LL_RCC_PLLI2SDIVQ_DIV_23 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 23 */ -#define LL_RCC_PLLI2SDIVQ_DIV_24 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 24 */ -#define LL_RCC_PLLI2SDIVQ_DIV_25 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3) /*!< PLLI2S division factor for PLLI2SDIVQ output by 25 */ -#define LL_RCC_PLLI2SDIVQ_DIV_26 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 26 */ -#define LL_RCC_PLLI2SDIVQ_DIV_27 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 27 */ -#define LL_RCC_PLLI2SDIVQ_DIV_28 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 28 */ -#define LL_RCC_PLLI2SDIVQ_DIV_29 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 29 */ -#define LL_RCC_PLLI2SDIVQ_DIV_30 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 30 */ -#define LL_RCC_PLLI2SDIVQ_DIV_31 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 31 */ -#define LL_RCC_PLLI2SDIVQ_DIV_32 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 32 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ - -#if defined(RCC_DCKCFGR_PLLI2SDIVR) -/** @defgroup RCC_LL_EC_PLLI2SDIVR PLLI2SDIVR division factor (PLLI2SDIVR) - * @{ - */ -#define LL_RCC_PLLI2SDIVR_DIV_1 (RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 1 */ -#define LL_RCC_PLLI2SDIVR_DIV_2 (RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 2 */ -#define LL_RCC_PLLI2SDIVR_DIV_3 (RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 3 */ -#define LL_RCC_PLLI2SDIVR_DIV_4 (RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 4 */ -#define LL_RCC_PLLI2SDIVR_DIV_5 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 5 */ -#define LL_RCC_PLLI2SDIVR_DIV_6 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 6 */ -#define LL_RCC_PLLI2SDIVR_DIV_7 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 7 */ -#define LL_RCC_PLLI2SDIVR_DIV_8 (RCC_DCKCFGR_PLLI2SDIVR_3) /*!< PLLI2S division factor for PLLI2SDIVR output by 8 */ -#define LL_RCC_PLLI2SDIVR_DIV_9 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 9 */ -#define LL_RCC_PLLI2SDIVR_DIV_10 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 10 */ -#define LL_RCC_PLLI2SDIVR_DIV_11 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 11 */ -#define LL_RCC_PLLI2SDIVR_DIV_12 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 12 */ -#define LL_RCC_PLLI2SDIVR_DIV_13 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 13 */ -#define LL_RCC_PLLI2SDIVR_DIV_14 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 14 */ -#define LL_RCC_PLLI2SDIVR_DIV_15 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 15 */ -#define LL_RCC_PLLI2SDIVR_DIV_16 (RCC_DCKCFGR_PLLI2SDIVR_4) /*!< PLLI2S division factor for PLLI2SDIVR output by 16 */ -#define LL_RCC_PLLI2SDIVR_DIV_17 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 17 */ -#define LL_RCC_PLLI2SDIVR_DIV_18 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 18 */ -#define LL_RCC_PLLI2SDIVR_DIV_19 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 19 */ -#define LL_RCC_PLLI2SDIVR_DIV_20 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 20 */ -#define LL_RCC_PLLI2SDIVR_DIV_21 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 21 */ -#define LL_RCC_PLLI2SDIVR_DIV_22 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 22 */ -#define LL_RCC_PLLI2SDIVR_DIV_23 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 23 */ -#define LL_RCC_PLLI2SDIVR_DIV_24 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3) /*!< PLLI2S division factor for PLLI2SDIVR output by 24 */ -#define LL_RCC_PLLI2SDIVR_DIV_25 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 25 */ -#define LL_RCC_PLLI2SDIVR_DIV_26 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 26 */ -#define LL_RCC_PLLI2SDIVR_DIV_27 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 27 */ -#define LL_RCC_PLLI2SDIVR_DIV_28 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 28 */ -#define LL_RCC_PLLI2SDIVR_DIV_29 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 29 */ -#define LL_RCC_PLLI2SDIVR_DIV_30 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 30 */ -#define LL_RCC_PLLI2SDIVR_DIV_31 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 31 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLI2SDIVR */ - -/** @defgroup RCC_LL_EC_PLLI2SR PLLI2SR division factor (PLLI2SR) - * @{ - */ -#define LL_RCC_PLLI2SR_DIV_2 RCC_PLLI2SCFGR_PLLI2SR_1 /*!< PLLI2S division factor for PLLI2SR output by 2 */ -#define LL_RCC_PLLI2SR_DIV_3 (RCC_PLLI2SCFGR_PLLI2SR_1 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 3 */ -#define LL_RCC_PLLI2SR_DIV_4 RCC_PLLI2SCFGR_PLLI2SR_2 /*!< PLLI2S division factor for PLLI2SR output by 4 */ -#define LL_RCC_PLLI2SR_DIV_5 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 5 */ -#define LL_RCC_PLLI2SR_DIV_6 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_1) /*!< PLLI2S division factor for PLLI2SR output by 6 */ -#define LL_RCC_PLLI2SR_DIV_7 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_1 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 7 */ -/** - * @} - */ - -#if defined(RCC_PLLI2SCFGR_PLLI2SP) -/** @defgroup RCC_LL_EC_PLLI2SP PLLI2SP division factor (PLLI2SP) - * @{ - */ -#define LL_RCC_PLLI2SP_DIV_2 0x00000000U /*!< PLLI2S division factor for PLLI2SP output by 2 */ -#define LL_RCC_PLLI2SP_DIV_4 RCC_PLLI2SCFGR_PLLI2SP_0 /*!< PLLI2S division factor for PLLI2SP output by 4 */ -#define LL_RCC_PLLI2SP_DIV_6 RCC_PLLI2SCFGR_PLLI2SP_1 /*!< PLLI2S division factor for PLLI2SP output by 6 */ -#define LL_RCC_PLLI2SP_DIV_8 (RCC_PLLI2SCFGR_PLLI2SP_1 | RCC_PLLI2SCFGR_PLLI2SP_0) /*!< PLLI2S division factor for PLLI2SP output by 8 */ -/** - * @} - */ -#endif /* RCC_PLLI2SCFGR_PLLI2SP */ -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** @defgroup RCC_LL_EC_PLLSAIM PLLSAIM division factor (PLLSAIM or PLLM) - * @{ - */ -#if defined(RCC_PLLSAICFGR_PLLSAIM) -#define LL_RCC_PLLSAIM_DIV_2 (RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 2 */ -#define LL_RCC_PLLSAIM_DIV_3 (RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 3 */ -#define LL_RCC_PLLSAIM_DIV_4 (RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 4 */ -#define LL_RCC_PLLSAIM_DIV_5 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 5 */ -#define LL_RCC_PLLSAIM_DIV_6 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 6 */ -#define LL_RCC_PLLSAIM_DIV_7 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 7 */ -#define LL_RCC_PLLSAIM_DIV_8 (RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 8 */ -#define LL_RCC_PLLSAIM_DIV_9 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 9 */ -#define LL_RCC_PLLSAIM_DIV_10 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 10 */ -#define LL_RCC_PLLSAIM_DIV_11 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 11 */ -#define LL_RCC_PLLSAIM_DIV_12 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 12 */ -#define LL_RCC_PLLSAIM_DIV_13 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 13 */ -#define LL_RCC_PLLSAIM_DIV_14 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 14 */ -#define LL_RCC_PLLSAIM_DIV_15 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 15 */ -#define LL_RCC_PLLSAIM_DIV_16 (RCC_PLLSAICFGR_PLLSAIM_4) /*!< PLLSAI division factor for PLLSAIM output by 16 */ -#define LL_RCC_PLLSAIM_DIV_17 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 17 */ -#define LL_RCC_PLLSAIM_DIV_18 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 18 */ -#define LL_RCC_PLLSAIM_DIV_19 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 19 */ -#define LL_RCC_PLLSAIM_DIV_20 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 20 */ -#define LL_RCC_PLLSAIM_DIV_21 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 21 */ -#define LL_RCC_PLLSAIM_DIV_22 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 22 */ -#define LL_RCC_PLLSAIM_DIV_23 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 23 */ -#define LL_RCC_PLLSAIM_DIV_24 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 24 */ -#define LL_RCC_PLLSAIM_DIV_25 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 25 */ -#define LL_RCC_PLLSAIM_DIV_26 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 26 */ -#define LL_RCC_PLLSAIM_DIV_27 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 27 */ -#define LL_RCC_PLLSAIM_DIV_28 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 28 */ -#define LL_RCC_PLLSAIM_DIV_29 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 29 */ -#define LL_RCC_PLLSAIM_DIV_30 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 30 */ -#define LL_RCC_PLLSAIM_DIV_31 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 31 */ -#define LL_RCC_PLLSAIM_DIV_32 (RCC_PLLSAICFGR_PLLSAIM_5) /*!< PLLSAI division factor for PLLSAIM output by 32 */ -#define LL_RCC_PLLSAIM_DIV_33 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 33 */ -#define LL_RCC_PLLSAIM_DIV_34 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 34 */ -#define LL_RCC_PLLSAIM_DIV_35 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 35 */ -#define LL_RCC_PLLSAIM_DIV_36 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 36 */ -#define LL_RCC_PLLSAIM_DIV_37 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 37 */ -#define LL_RCC_PLLSAIM_DIV_38 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 38 */ -#define LL_RCC_PLLSAIM_DIV_39 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 39 */ -#define LL_RCC_PLLSAIM_DIV_40 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 40 */ -#define LL_RCC_PLLSAIM_DIV_41 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 41 */ -#define LL_RCC_PLLSAIM_DIV_42 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 42 */ -#define LL_RCC_PLLSAIM_DIV_43 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 43 */ -#define LL_RCC_PLLSAIM_DIV_44 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 44 */ -#define LL_RCC_PLLSAIM_DIV_45 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 45 */ -#define LL_RCC_PLLSAIM_DIV_46 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 46 */ -#define LL_RCC_PLLSAIM_DIV_47 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 47 */ -#define LL_RCC_PLLSAIM_DIV_48 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4) /*!< PLLSAI division factor for PLLSAIM output by 48 */ -#define LL_RCC_PLLSAIM_DIV_49 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 49 */ -#define LL_RCC_PLLSAIM_DIV_50 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 50 */ -#define LL_RCC_PLLSAIM_DIV_51 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 51 */ -#define LL_RCC_PLLSAIM_DIV_52 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 52 */ -#define LL_RCC_PLLSAIM_DIV_53 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 53 */ -#define LL_RCC_PLLSAIM_DIV_54 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 54 */ -#define LL_RCC_PLLSAIM_DIV_55 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 55 */ -#define LL_RCC_PLLSAIM_DIV_56 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 56 */ -#define LL_RCC_PLLSAIM_DIV_57 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 57 */ -#define LL_RCC_PLLSAIM_DIV_58 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 58 */ -#define LL_RCC_PLLSAIM_DIV_59 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 59 */ -#define LL_RCC_PLLSAIM_DIV_60 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 60 */ -#define LL_RCC_PLLSAIM_DIV_61 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 61 */ -#define LL_RCC_PLLSAIM_DIV_62 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 62 */ -#define LL_RCC_PLLSAIM_DIV_63 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 63 */ -#else -#define LL_RCC_PLLSAIM_DIV_2 LL_RCC_PLLM_DIV_2 /*!< PLLSAI division factor for PLLSAIM output by 2 */ -#define LL_RCC_PLLSAIM_DIV_3 LL_RCC_PLLM_DIV_3 /*!< PLLSAI division factor for PLLSAIM output by 3 */ -#define LL_RCC_PLLSAIM_DIV_4 LL_RCC_PLLM_DIV_4 /*!< PLLSAI division factor for PLLSAIM output by 4 */ -#define LL_RCC_PLLSAIM_DIV_5 LL_RCC_PLLM_DIV_5 /*!< PLLSAI division factor for PLLSAIM output by 5 */ -#define LL_RCC_PLLSAIM_DIV_6 LL_RCC_PLLM_DIV_6 /*!< PLLSAI division factor for PLLSAIM output by 6 */ -#define LL_RCC_PLLSAIM_DIV_7 LL_RCC_PLLM_DIV_7 /*!< PLLSAI division factor for PLLSAIM output by 7 */ -#define LL_RCC_PLLSAIM_DIV_8 LL_RCC_PLLM_DIV_8 /*!< PLLSAI division factor for PLLSAIM output by 8 */ -#define LL_RCC_PLLSAIM_DIV_9 LL_RCC_PLLM_DIV_9 /*!< PLLSAI division factor for PLLSAIM output by 9 */ -#define LL_RCC_PLLSAIM_DIV_10 LL_RCC_PLLM_DIV_10 /*!< PLLSAI division factor for PLLSAIM output by 10 */ -#define LL_RCC_PLLSAIM_DIV_11 LL_RCC_PLLM_DIV_11 /*!< PLLSAI division factor for PLLSAIM output by 11 */ -#define LL_RCC_PLLSAIM_DIV_12 LL_RCC_PLLM_DIV_12 /*!< PLLSAI division factor for PLLSAIM output by 12 */ -#define LL_RCC_PLLSAIM_DIV_13 LL_RCC_PLLM_DIV_13 /*!< PLLSAI division factor for PLLSAIM output by 13 */ -#define LL_RCC_PLLSAIM_DIV_14 LL_RCC_PLLM_DIV_14 /*!< PLLSAI division factor for PLLSAIM output by 14 */ -#define LL_RCC_PLLSAIM_DIV_15 LL_RCC_PLLM_DIV_15 /*!< PLLSAI division factor for PLLSAIM output by 15 */ -#define LL_RCC_PLLSAIM_DIV_16 LL_RCC_PLLM_DIV_16 /*!< PLLSAI division factor for PLLSAIM output by 16 */ -#define LL_RCC_PLLSAIM_DIV_17 LL_RCC_PLLM_DIV_17 /*!< PLLSAI division factor for PLLSAIM output by 17 */ -#define LL_RCC_PLLSAIM_DIV_18 LL_RCC_PLLM_DIV_18 /*!< PLLSAI division factor for PLLSAIM output by 18 */ -#define LL_RCC_PLLSAIM_DIV_19 LL_RCC_PLLM_DIV_19 /*!< PLLSAI division factor for PLLSAIM output by 19 */ -#define LL_RCC_PLLSAIM_DIV_20 LL_RCC_PLLM_DIV_20 /*!< PLLSAI division factor for PLLSAIM output by 20 */ -#define LL_RCC_PLLSAIM_DIV_21 LL_RCC_PLLM_DIV_21 /*!< PLLSAI division factor for PLLSAIM output by 21 */ -#define LL_RCC_PLLSAIM_DIV_22 LL_RCC_PLLM_DIV_22 /*!< PLLSAI division factor for PLLSAIM output by 22 */ -#define LL_RCC_PLLSAIM_DIV_23 LL_RCC_PLLM_DIV_23 /*!< PLLSAI division factor for PLLSAIM output by 23 */ -#define LL_RCC_PLLSAIM_DIV_24 LL_RCC_PLLM_DIV_24 /*!< PLLSAI division factor for PLLSAIM output by 24 */ -#define LL_RCC_PLLSAIM_DIV_25 LL_RCC_PLLM_DIV_25 /*!< PLLSAI division factor for PLLSAIM output by 25 */ -#define LL_RCC_PLLSAIM_DIV_26 LL_RCC_PLLM_DIV_26 /*!< PLLSAI division factor for PLLSAIM output by 26 */ -#define LL_RCC_PLLSAIM_DIV_27 LL_RCC_PLLM_DIV_27 /*!< PLLSAI division factor for PLLSAIM output by 27 */ -#define LL_RCC_PLLSAIM_DIV_28 LL_RCC_PLLM_DIV_28 /*!< PLLSAI division factor for PLLSAIM output by 28 */ -#define LL_RCC_PLLSAIM_DIV_29 LL_RCC_PLLM_DIV_29 /*!< PLLSAI division factor for PLLSAIM output by 29 */ -#define LL_RCC_PLLSAIM_DIV_30 LL_RCC_PLLM_DIV_30 /*!< PLLSAI division factor for PLLSAIM output by 30 */ -#define LL_RCC_PLLSAIM_DIV_31 LL_RCC_PLLM_DIV_31 /*!< PLLSAI division factor for PLLSAIM output by 31 */ -#define LL_RCC_PLLSAIM_DIV_32 LL_RCC_PLLM_DIV_32 /*!< PLLSAI division factor for PLLSAIM output by 32 */ -#define LL_RCC_PLLSAIM_DIV_33 LL_RCC_PLLM_DIV_33 /*!< PLLSAI division factor for PLLSAIM output by 33 */ -#define LL_RCC_PLLSAIM_DIV_34 LL_RCC_PLLM_DIV_34 /*!< PLLSAI division factor for PLLSAIM output by 34 */ -#define LL_RCC_PLLSAIM_DIV_35 LL_RCC_PLLM_DIV_35 /*!< PLLSAI division factor for PLLSAIM output by 35 */ -#define LL_RCC_PLLSAIM_DIV_36 LL_RCC_PLLM_DIV_36 /*!< PLLSAI division factor for PLLSAIM output by 36 */ -#define LL_RCC_PLLSAIM_DIV_37 LL_RCC_PLLM_DIV_37 /*!< PLLSAI division factor for PLLSAIM output by 37 */ -#define LL_RCC_PLLSAIM_DIV_38 LL_RCC_PLLM_DIV_38 /*!< PLLSAI division factor for PLLSAIM output by 38 */ -#define LL_RCC_PLLSAIM_DIV_39 LL_RCC_PLLM_DIV_39 /*!< PLLSAI division factor for PLLSAIM output by 39 */ -#define LL_RCC_PLLSAIM_DIV_40 LL_RCC_PLLM_DIV_40 /*!< PLLSAI division factor for PLLSAIM output by 40 */ -#define LL_RCC_PLLSAIM_DIV_41 LL_RCC_PLLM_DIV_41 /*!< PLLSAI division factor for PLLSAIM output by 41 */ -#define LL_RCC_PLLSAIM_DIV_42 LL_RCC_PLLM_DIV_42 /*!< PLLSAI division factor for PLLSAIM output by 42 */ -#define LL_RCC_PLLSAIM_DIV_43 LL_RCC_PLLM_DIV_43 /*!< PLLSAI division factor for PLLSAIM output by 43 */ -#define LL_RCC_PLLSAIM_DIV_44 LL_RCC_PLLM_DIV_44 /*!< PLLSAI division factor for PLLSAIM output by 44 */ -#define LL_RCC_PLLSAIM_DIV_45 LL_RCC_PLLM_DIV_45 /*!< PLLSAI division factor for PLLSAIM output by 45 */ -#define LL_RCC_PLLSAIM_DIV_46 LL_RCC_PLLM_DIV_46 /*!< PLLSAI division factor for PLLSAIM output by 46 */ -#define LL_RCC_PLLSAIM_DIV_47 LL_RCC_PLLM_DIV_47 /*!< PLLSAI division factor for PLLSAIM output by 47 */ -#define LL_RCC_PLLSAIM_DIV_48 LL_RCC_PLLM_DIV_48 /*!< PLLSAI division factor for PLLSAIM output by 48 */ -#define LL_RCC_PLLSAIM_DIV_49 LL_RCC_PLLM_DIV_49 /*!< PLLSAI division factor for PLLSAIM output by 49 */ -#define LL_RCC_PLLSAIM_DIV_50 LL_RCC_PLLM_DIV_50 /*!< PLLSAI division factor for PLLSAIM output by 50 */ -#define LL_RCC_PLLSAIM_DIV_51 LL_RCC_PLLM_DIV_51 /*!< PLLSAI division factor for PLLSAIM output by 51 */ -#define LL_RCC_PLLSAIM_DIV_52 LL_RCC_PLLM_DIV_52 /*!< PLLSAI division factor for PLLSAIM output by 52 */ -#define LL_RCC_PLLSAIM_DIV_53 LL_RCC_PLLM_DIV_53 /*!< PLLSAI division factor for PLLSAIM output by 53 */ -#define LL_RCC_PLLSAIM_DIV_54 LL_RCC_PLLM_DIV_54 /*!< PLLSAI division factor for PLLSAIM output by 54 */ -#define LL_RCC_PLLSAIM_DIV_55 LL_RCC_PLLM_DIV_55 /*!< PLLSAI division factor for PLLSAIM output by 55 */ -#define LL_RCC_PLLSAIM_DIV_56 LL_RCC_PLLM_DIV_56 /*!< PLLSAI division factor for PLLSAIM output by 56 */ -#define LL_RCC_PLLSAIM_DIV_57 LL_RCC_PLLM_DIV_57 /*!< PLLSAI division factor for PLLSAIM output by 57 */ -#define LL_RCC_PLLSAIM_DIV_58 LL_RCC_PLLM_DIV_58 /*!< PLLSAI division factor for PLLSAIM output by 58 */ -#define LL_RCC_PLLSAIM_DIV_59 LL_RCC_PLLM_DIV_59 /*!< PLLSAI division factor for PLLSAIM output by 59 */ -#define LL_RCC_PLLSAIM_DIV_60 LL_RCC_PLLM_DIV_60 /*!< PLLSAI division factor for PLLSAIM output by 60 */ -#define LL_RCC_PLLSAIM_DIV_61 LL_RCC_PLLM_DIV_61 /*!< PLLSAI division factor for PLLSAIM output by 61 */ -#define LL_RCC_PLLSAIM_DIV_62 LL_RCC_PLLM_DIV_62 /*!< PLLSAI division factor for PLLSAIM output by 62 */ -#define LL_RCC_PLLSAIM_DIV_63 LL_RCC_PLLM_DIV_63 /*!< PLLSAI division factor for PLLSAIM output by 63 */ -#endif /* RCC_PLLSAICFGR_PLLSAIM */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_PLLSAIQ PLLSAIQ division factor (PLLSAIQ) - * @{ - */ -#define LL_RCC_PLLSAIQ_DIV_2 RCC_PLLSAICFGR_PLLSAIQ_1 /*!< PLLSAI division factor for PLLSAIQ output by 2 */ -#define LL_RCC_PLLSAIQ_DIV_3 (RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 3 */ -#define LL_RCC_PLLSAIQ_DIV_4 RCC_PLLSAICFGR_PLLSAIQ_2 /*!< PLLSAI division factor for PLLSAIQ output by 4 */ -#define LL_RCC_PLLSAIQ_DIV_5 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 5 */ -#define LL_RCC_PLLSAIQ_DIV_6 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 6 */ -#define LL_RCC_PLLSAIQ_DIV_7 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 7 */ -#define LL_RCC_PLLSAIQ_DIV_8 RCC_PLLSAICFGR_PLLSAIQ_3 /*!< PLLSAI division factor for PLLSAIQ output by 8 */ -#define LL_RCC_PLLSAIQ_DIV_9 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 9 */ -#define LL_RCC_PLLSAIQ_DIV_10 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 10 */ -#define LL_RCC_PLLSAIQ_DIV_11 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 11 */ -#define LL_RCC_PLLSAIQ_DIV_12 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2) /*!< PLLSAI division factor for PLLSAIQ output by 12 */ -#define LL_RCC_PLLSAIQ_DIV_13 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 13 */ -#define LL_RCC_PLLSAIQ_DIV_14 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 14 */ -#define LL_RCC_PLLSAIQ_DIV_15 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 15 */ -/** - * @} - */ - -#if defined(RCC_DCKCFGR_PLLSAIDIVQ) -/** @defgroup RCC_LL_EC_PLLSAIDIVQ PLLSAIDIVQ division factor (PLLSAIDIVQ) - * @{ - */ -#define LL_RCC_PLLSAIDIVQ_DIV_1 0x00000000U /*!< PLLSAI division factor for PLLSAIDIVQ output by 1 */ -#define LL_RCC_PLLSAIDIVQ_DIV_2 RCC_DCKCFGR_PLLSAIDIVQ_0 /*!< PLLSAI division factor for PLLSAIDIVQ output by 2 */ -#define LL_RCC_PLLSAIDIVQ_DIV_3 RCC_DCKCFGR_PLLSAIDIVQ_1 /*!< PLLSAI division factor for PLLSAIDIVQ output by 3 */ -#define LL_RCC_PLLSAIDIVQ_DIV_4 (RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 4 */ -#define LL_RCC_PLLSAIDIVQ_DIV_5 RCC_DCKCFGR_PLLSAIDIVQ_2 /*!< PLLSAI division factor for PLLSAIDIVQ output by 5 */ -#define LL_RCC_PLLSAIDIVQ_DIV_6 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 6 */ -#define LL_RCC_PLLSAIDIVQ_DIV_7 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 7 */ -#define LL_RCC_PLLSAIDIVQ_DIV_8 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 8 */ -#define LL_RCC_PLLSAIDIVQ_DIV_9 RCC_DCKCFGR_PLLSAIDIVQ_3 /*!< PLLSAI division factor for PLLSAIDIVQ output by 9 */ -#define LL_RCC_PLLSAIDIVQ_DIV_10 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 10 */ -#define LL_RCC_PLLSAIDIVQ_DIV_11 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 11 */ -#define LL_RCC_PLLSAIDIVQ_DIV_12 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 12 */ -#define LL_RCC_PLLSAIDIVQ_DIV_13 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 13 */ -#define LL_RCC_PLLSAIDIVQ_DIV_14 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 14 */ -#define LL_RCC_PLLSAIDIVQ_DIV_15 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 15 */ -#define LL_RCC_PLLSAIDIVQ_DIV_16 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 16 */ -#define LL_RCC_PLLSAIDIVQ_DIV_17 RCC_DCKCFGR_PLLSAIDIVQ_4 /*!< PLLSAI division factor for PLLSAIDIVQ output by 17 */ -#define LL_RCC_PLLSAIDIVQ_DIV_18 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 18 */ -#define LL_RCC_PLLSAIDIVQ_DIV_19 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 19 */ -#define LL_RCC_PLLSAIDIVQ_DIV_20 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 20 */ -#define LL_RCC_PLLSAIDIVQ_DIV_21 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 21 */ -#define LL_RCC_PLLSAIDIVQ_DIV_22 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 22 */ -#define LL_RCC_PLLSAIDIVQ_DIV_23 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 23 */ -#define LL_RCC_PLLSAIDIVQ_DIV_24 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 24 */ -#define LL_RCC_PLLSAIDIVQ_DIV_25 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3) /*!< PLLSAI division factor for PLLSAIDIVQ output by 25 */ -#define LL_RCC_PLLSAIDIVQ_DIV_26 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 26 */ -#define LL_RCC_PLLSAIDIVQ_DIV_27 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 27 */ -#define LL_RCC_PLLSAIDIVQ_DIV_28 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 28 */ -#define LL_RCC_PLLSAIDIVQ_DIV_29 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 29 */ -#define LL_RCC_PLLSAIDIVQ_DIV_30 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 30 */ -#define LL_RCC_PLLSAIDIVQ_DIV_31 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 31 */ -#define LL_RCC_PLLSAIDIVQ_DIV_32 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 32 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLSAIDIVQ */ - -#if defined(RCC_PLLSAICFGR_PLLSAIR) -/** @defgroup RCC_LL_EC_PLLSAIR PLLSAIR division factor (PLLSAIR) - * @{ - */ -#define LL_RCC_PLLSAIR_DIV_2 RCC_PLLSAICFGR_PLLSAIR_1 /*!< PLLSAI division factor for PLLSAIR output by 2 */ -#define LL_RCC_PLLSAIR_DIV_3 (RCC_PLLSAICFGR_PLLSAIR_1 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 3 */ -#define LL_RCC_PLLSAIR_DIV_4 RCC_PLLSAICFGR_PLLSAIR_2 /*!< PLLSAI division factor for PLLSAIR output by 4 */ -#define LL_RCC_PLLSAIR_DIV_5 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 5 */ -#define LL_RCC_PLLSAIR_DIV_6 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_1) /*!< PLLSAI division factor for PLLSAIR output by 6 */ -#define LL_RCC_PLLSAIR_DIV_7 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_1 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 7 */ -/** - * @} - */ -#endif /* RCC_PLLSAICFGR_PLLSAIR */ - -#if defined(RCC_DCKCFGR_PLLSAIDIVR) -/** @defgroup RCC_LL_EC_PLLSAIDIVR PLLSAIDIVR division factor (PLLSAIDIVR) - * @{ - */ -#define LL_RCC_PLLSAIDIVR_DIV_2 0x00000000U /*!< PLLSAI division factor for PLLSAIDIVR output by 2 */ -#define LL_RCC_PLLSAIDIVR_DIV_4 RCC_DCKCFGR_PLLSAIDIVR_0 /*!< PLLSAI division factor for PLLSAIDIVR output by 4 */ -#define LL_RCC_PLLSAIDIVR_DIV_8 RCC_DCKCFGR_PLLSAIDIVR_1 /*!< PLLSAI division factor for PLLSAIDIVR output by 8 */ -#define LL_RCC_PLLSAIDIVR_DIV_16 (RCC_DCKCFGR_PLLSAIDIVR_1 | RCC_DCKCFGR_PLLSAIDIVR_0) /*!< PLLSAI division factor for PLLSAIDIVR output by 16 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLSAIDIVR */ - -#if defined(RCC_PLLSAICFGR_PLLSAIP) -/** @defgroup RCC_LL_EC_PLLSAIP PLLSAIP division factor (PLLSAIP) - * @{ - */ -#define LL_RCC_PLLSAIP_DIV_2 0x00000000U /*!< PLLSAI division factor for PLLSAIP output by 2 */ -#define LL_RCC_PLLSAIP_DIV_4 RCC_PLLSAICFGR_PLLSAIP_0 /*!< PLLSAI division factor for PLLSAIP output by 4 */ -#define LL_RCC_PLLSAIP_DIV_6 RCC_PLLSAICFGR_PLLSAIP_1 /*!< PLLSAI division factor for PLLSAIP output by 6 */ -#define LL_RCC_PLLSAIP_DIV_8 (RCC_PLLSAICFGR_PLLSAIP_1 | RCC_PLLSAICFGR_PLLSAIP_0) /*!< PLLSAI division factor for PLLSAIP output by 8 */ -/** - * @} - */ -#endif /* RCC_PLLSAICFGR_PLLSAIP */ -#endif /* RCC_PLLSAI_SUPPORT */ -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RCC_LL_Exported_Macros RCC Exported Macros - * @{ - */ - -/** @defgroup RCC_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in RCC register - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_RCC_WriteReg(__REG__, __VALUE__) WRITE_REG(RCC->__REG__, (__VALUE__)) - -/** - * @brief Read a value in RCC register - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_RCC_ReadReg(__REG__) READ_REG(RCC->__REG__) -/** - * @} - */ - -/** @defgroup RCC_LL_EM_CALC_FREQ Calculate frequencies - * @{ - */ - -/** - * @brief Helper macro to calculate the PLLCLK frequency on system domain - * @note ex: @ref __LL_RCC_CALC_PLLCLK_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetP ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLP__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLP_DIV_2 - * @arg @ref LL_RCC_PLLP_DIV_4 - * @arg @ref LL_RCC_PLLP_DIV_6 - * @arg @ref LL_RCC_PLLP_DIV_8 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLP__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((((__PLLP__) >> RCC_PLLCFGR_PLLP_Pos ) + 1U) * 2U)) - -#if defined(RCC_PLLR_SYSCLK_SUPPORT) -/** - * @brief Helper macro to calculate the PLLRCLK frequency on system domain - * @note ex: @ref __LL_RCC_CALC_PLLRCLK_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLRCLK_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) - -#endif /* RCC_PLLR_SYSCLK_SUPPORT */ - -/** - * @brief Helper macro to calculate the PLLCLK frequency used on 48M domain - * @note ex: @ref __LL_RCC_CALC_PLLCLK_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetQ ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLQ__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLQ_DIV_2 - * @arg @ref LL_RCC_PLLQ_DIV_3 - * @arg @ref LL_RCC_PLLQ_DIV_4 - * @arg @ref LL_RCC_PLLQ_DIV_5 - * @arg @ref LL_RCC_PLLQ_DIV_6 - * @arg @ref LL_RCC_PLLQ_DIV_7 - * @arg @ref LL_RCC_PLLQ_DIV_8 - * @arg @ref LL_RCC_PLLQ_DIV_9 - * @arg @ref LL_RCC_PLLQ_DIV_10 - * @arg @ref LL_RCC_PLLQ_DIV_11 - * @arg @ref LL_RCC_PLLQ_DIV_12 - * @arg @ref LL_RCC_PLLQ_DIV_13 - * @arg @ref LL_RCC_PLLQ_DIV_14 - * @arg @ref LL_RCC_PLLQ_DIV_15 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLQ__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLQ__) >> RCC_PLLCFGR_PLLQ_Pos )) - -#if defined(DSI) -/** - * @brief Helper macro to calculate the PLLCLK frequency used on DSI - * @note ex: @ref __LL_RCC_CALC_PLLCLK_DSI_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_DSI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) -#endif /* DSI */ - -#if defined(RCC_PLLR_I2S_CLKSOURCE_SUPPORT) -/** - * @brief Helper macro to calculate the PLLCLK frequency used on I2S - * @note ex: @ref __LL_RCC_CALC_PLLCLK_I2S_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_I2S_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) -#endif /* RCC_PLLR_I2S_CLKSOURCE_SUPPORT */ - -#if defined(SPDIFRX) -/** - * @brief Helper macro to calculate the PLLCLK frequency used on SPDIFRX - * @note ex: @ref __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) -#endif /* SPDIFRX */ - -#if defined(RCC_PLLCFGR_PLLR) -#if defined(SAI1) -/** - * @brief Helper macro to calculate the PLLCLK frequency used on SAI - * @note ex: @ref __LL_RCC_CALC_PLLCLK_SAI_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR (), @ref LL_RCC_PLL_GetDIVR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @param __PLLDIVR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLDIVR_DIV_1 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_2 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_3 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_4 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_5 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_6 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_7 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_8 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_9 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_10 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_11 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_12 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_13 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_14 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_15 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_16 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_17 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_18 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_19 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_20 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_21 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_22 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_23 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_24 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_25 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_26 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_27 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_28 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_29 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_30 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_31 (*) - * - * (*) value not defined in all devices. - * @retval PLL clock frequency (in Hz) - */ -#if defined(RCC_DCKCFGR_PLLDIVR) -#define __LL_RCC_CALC_PLLCLK_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__, __PLLDIVR__) (((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) / ((__PLLDIVR__) >> RCC_DCKCFGR_PLLDIVR_Pos )) -#else -#define __LL_RCC_CALC_PLLCLK_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) -#endif /* RCC_DCKCFGR_PLLDIVR */ -#endif /* SAI1 */ -#endif /* RCC_PLLCFGR_PLLR */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Helper macro to calculate the PLLSAI frequency used for SAI domain - * @note ex: @ref __LL_RCC_CALC_PLLSAI_SAI_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), - * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetQ (), @ref LL_RCC_PLLSAI_GetDIVQ ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param __PLLSAIN__ Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLSAIQ__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIQ_DIV_15 - * @param __PLLSAIDIVQ__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 - * @retval PLLSAI clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLSAI_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIQ__, __PLLSAIDIVQ__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ - (((__PLLSAIQ__) >> RCC_PLLSAICFGR_PLLSAIQ_Pos) * (((__PLLSAIDIVQ__) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos) + 1U))) - -#if defined(RCC_PLLSAICFGR_PLLSAIP) -/** - * @brief Helper macro to calculate the PLLSAI frequency used on 48Mhz domain - * @note ex: @ref __LL_RCC_CALC_PLLSAI_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), - * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetP ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param __PLLSAIN__ Between 50 and 432 - * @param __PLLSAIP__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIP_DIV_2 - * @arg @ref LL_RCC_PLLSAIP_DIV_4 - * @arg @ref LL_RCC_PLLSAIP_DIV_6 - * @arg @ref LL_RCC_PLLSAIP_DIV_8 - * @retval PLLSAI clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLSAI_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIP__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ - ((((__PLLSAIP__) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) * 2U)) -#endif /* RCC_PLLSAICFGR_PLLSAIP */ - -#if defined(LTDC) -/** - * @brief Helper macro to calculate the PLLSAI frequency used for LTDC domain - * @note ex: @ref __LL_RCC_CALC_PLLSAI_LTDC_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), - * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetR (), @ref LL_RCC_PLLSAI_GetDIVR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param __PLLSAIN__ Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLSAIR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIR_DIV_2 - * @arg @ref LL_RCC_PLLSAIR_DIV_3 - * @arg @ref LL_RCC_PLLSAIR_DIV_4 - * @arg @ref LL_RCC_PLLSAIR_DIV_5 - * @arg @ref LL_RCC_PLLSAIR_DIV_6 - * @arg @ref LL_RCC_PLLSAIR_DIV_7 - * @param __PLLSAIDIVR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 - * @retval PLLSAI clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLSAI_LTDC_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIR__, __PLLSAIDIVR__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ - (((__PLLSAIR__) >> RCC_PLLSAICFGR_PLLSAIR_Pos) * (aRCC_PLLSAIDIVRPrescTable[(__PLLSAIDIVR__) >> RCC_DCKCFGR_PLLSAIDIVR_Pos]))) -#endif /* LTDC */ -#endif /* RCC_PLLSAI_SUPPORT */ - -#if defined(RCC_PLLI2S_SUPPORT) -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) || defined(RCC_DCKCFGR_PLLI2SDIVR) -/** - * @brief Helper macro to calculate the PLLI2S frequency used for SAI domain - * @note ex: @ref __LL_RCC_CALC_PLLI2S_SAI_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), - * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetQ (), @ref LL_RCC_PLLI2S_GetDIVQ ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param __PLLI2SN__ Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLI2SQ_R__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_7 (*) - * - * (*) value not defined in all devices. - * @param __PLLI2SDIVQ_R__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 (*) - * - * (*) value not defined in all devices. - * @retval PLLI2S clock frequency (in Hz) - */ -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) -#define __LL_RCC_CALC_PLLI2S_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ_R__, __PLLI2SDIVQ_R__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - (((__PLLI2SQ_R__) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos) * (((__PLLI2SDIVQ_R__) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos) + 1U))) -#else -#define __LL_RCC_CALC_PLLI2S_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ_R__, __PLLI2SDIVQ_R__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - (((__PLLI2SQ_R__) >> RCC_PLLI2SCFGR_PLLI2SR_Pos) * ((__PLLI2SDIVQ_R__) >> RCC_DCKCFGR_PLLI2SDIVR_Pos))) - -#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ -#endif /* RCC_DCKCFGR_PLLI2SDIVQ || RCC_DCKCFGR_PLLI2SDIVR */ - -#if defined(SPDIFRX) -/** - * @brief Helper macro to calculate the PLLI2S frequency used on SPDIFRX domain - * @note ex: @ref __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), - * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetP ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param __PLLI2SN__ Between 50 and 432 - * @param __PLLI2SP__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SP_DIV_2 - * @arg @ref LL_RCC_PLLI2SP_DIV_4 - * @arg @ref LL_RCC_PLLI2SP_DIV_6 - * @arg @ref LL_RCC_PLLI2SP_DIV_8 - * @retval PLLI2S clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SP__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - ((((__PLLI2SP__) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) * 2U)) - -#endif /* SPDIFRX */ - -/** - * @brief Helper macro to calculate the PLLI2S frequency used for I2S domain - * @note ex: @ref __LL_RCC_CALC_PLLI2S_I2S_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), - * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param __PLLI2SN__ Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLI2SR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SR_DIV_2 - * @arg @ref LL_RCC_PLLI2SR_DIV_3 - * @arg @ref LL_RCC_PLLI2SR_DIV_4 - * @arg @ref LL_RCC_PLLI2SR_DIV_5 - * @arg @ref LL_RCC_PLLI2SR_DIV_6 - * @arg @ref LL_RCC_PLLI2SR_DIV_7 - * @retval PLLI2S clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLI2S_I2S_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SR__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - ((__PLLI2SR__) >> RCC_PLLI2SCFGR_PLLI2SR_Pos)) - -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -/** - * @brief Helper macro to calculate the PLLI2S frequency used for 48Mhz domain - * @note ex: @ref __LL_RCC_CALC_PLLI2S_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), - * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetQ ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param __PLLI2SN__ Between 50 and 432 - * @param __PLLI2SQ__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 - * @retval PLLI2S clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLI2S_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - ((__PLLI2SQ__) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos)) - -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ -#endif /* RCC_PLLI2S_SUPPORT */ - -/** - * @brief Helper macro to calculate the HCLK frequency - * @param __SYSCLKFREQ__ SYSCLK frequency (based on HSE/HSI/PLLCLK) - * @param __AHBPRESCALER__ This parameter can be one of the following values: - * @arg @ref LL_RCC_SYSCLK_DIV_1 - * @arg @ref LL_RCC_SYSCLK_DIV_2 - * @arg @ref LL_RCC_SYSCLK_DIV_4 - * @arg @ref LL_RCC_SYSCLK_DIV_8 - * @arg @ref LL_RCC_SYSCLK_DIV_16 - * @arg @ref LL_RCC_SYSCLK_DIV_64 - * @arg @ref LL_RCC_SYSCLK_DIV_128 - * @arg @ref LL_RCC_SYSCLK_DIV_256 - * @arg @ref LL_RCC_SYSCLK_DIV_512 - * @retval HCLK clock frequency (in Hz) - */ -#define __LL_RCC_CALC_HCLK_FREQ(__SYSCLKFREQ__, __AHBPRESCALER__) ((__SYSCLKFREQ__) >> AHBPrescTable[((__AHBPRESCALER__) &\ - RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]) - -/** - * @brief Helper macro to calculate the PCLK1 frequency (ABP1) - * @param __HCLKFREQ__ HCLK frequency - * @param __APB1PRESCALER__ This parameter can be one of the following values: - * @arg @ref LL_RCC_APB1_DIV_1 - * @arg @ref LL_RCC_APB1_DIV_2 - * @arg @ref LL_RCC_APB1_DIV_4 - * @arg @ref LL_RCC_APB1_DIV_8 - * @arg @ref LL_RCC_APB1_DIV_16 - * @retval PCLK1 clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PCLK1_FREQ(__HCLKFREQ__, __APB1PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB1PRESCALER__) >> RCC_CFGR_PPRE1_Pos]) - -/** - * @brief Helper macro to calculate the PCLK2 frequency (ABP2) - * @param __HCLKFREQ__ HCLK frequency - * @param __APB2PRESCALER__ This parameter can be one of the following values: - * @arg @ref LL_RCC_APB2_DIV_1 - * @arg @ref LL_RCC_APB2_DIV_2 - * @arg @ref LL_RCC_APB2_DIV_4 - * @arg @ref LL_RCC_APB2_DIV_8 - * @arg @ref LL_RCC_APB2_DIV_16 - * @retval PCLK2 clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PCLK2_FREQ(__HCLKFREQ__, __APB2PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB2PRESCALER__) >> RCC_CFGR_PPRE2_Pos]) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup RCC_LL_Exported_Functions RCC Exported Functions - * @{ - */ - -/** @defgroup RCC_LL_EF_HSE HSE - * @{ - */ - -/** - * @brief Enable the Clock Security System. - * @rmtoll CR CSSON LL_RCC_HSE_EnableCSS - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_EnableCSS(void) -{ - SET_BIT(RCC->CR, RCC_CR_CSSON); -} - -/** - * @brief Enable HSE external oscillator (HSE Bypass) - * @rmtoll CR HSEBYP LL_RCC_HSE_EnableBypass - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_EnableBypass(void) -{ - SET_BIT(RCC->CR, RCC_CR_HSEBYP); -} - -/** - * @brief Disable HSE external oscillator (HSE Bypass) - * @rmtoll CR HSEBYP LL_RCC_HSE_DisableBypass - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_DisableBypass(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); -} - -/** - * @brief Enable HSE crystal oscillator (HSE ON) - * @rmtoll CR HSEON LL_RCC_HSE_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_HSEON); -} - -/** - * @brief Disable HSE crystal oscillator (HSE ON) - * @rmtoll CR HSEON LL_RCC_HSE_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON); -} - -/** - * @brief Check if HSE oscillator Ready - * @rmtoll CR HSERDY LL_RCC_HSE_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_HSE_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_HSERDY) == (RCC_CR_HSERDY)); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_HSI HSI - * @{ - */ - -/** - * @brief Enable HSI oscillator - * @rmtoll CR HSION LL_RCC_HSI_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSI_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_HSION); -} - -/** - * @brief Disable HSI oscillator - * @rmtoll CR HSION LL_RCC_HSI_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSI_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_HSION); -} - -/** - * @brief Check if HSI clock is ready - * @rmtoll CR HSIRDY LL_RCC_HSI_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_HSI_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == (RCC_CR_HSIRDY)); -} - -/** - * @brief Get HSI Calibration value - * @note When HSITRIM is written, HSICAL is updated with the sum of - * HSITRIM and the factory trim value - * @rmtoll CR HSICAL LL_RCC_HSI_GetCalibration - * @retval Between Min_Data = 0x00 and Max_Data = 0xFF - */ -__STATIC_INLINE uint32_t LL_RCC_HSI_GetCalibration(void) -{ - return (uint32_t)(READ_BIT(RCC->CR, RCC_CR_HSICAL) >> RCC_CR_HSICAL_Pos); -} - -/** - * @brief Set HSI Calibration trimming - * @note user-programmable trimming value that is added to the HSICAL - * @note Default value is 16, which, when added to the HSICAL value, - * should trim the HSI to 16 MHz +/- 1 % - * @rmtoll CR HSITRIM LL_RCC_HSI_SetCalibTrimming - * @param Value Between Min_Data = 0 and Max_Data = 31 - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSI_SetCalibTrimming(uint32_t Value) -{ - MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, Value << RCC_CR_HSITRIM_Pos); -} - -/** - * @brief Get HSI Calibration trimming - * @rmtoll CR HSITRIM LL_RCC_HSI_GetCalibTrimming - * @retval Between Min_Data = 0 and Max_Data = 31 - */ -__STATIC_INLINE uint32_t LL_RCC_HSI_GetCalibTrimming(void) -{ - return (uint32_t)(READ_BIT(RCC->CR, RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_LSE LSE - * @{ - */ - -/** - * @brief Enable Low Speed External (LSE) crystal. - * @rmtoll BDCR LSEON LL_RCC_LSE_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_Enable(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); -} - -/** - * @brief Disable Low Speed External (LSE) crystal. - * @rmtoll BDCR LSEON LL_RCC_LSE_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_Disable(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); -} - -/** - * @brief Enable external clock source (LSE bypass). - * @rmtoll BDCR LSEBYP LL_RCC_LSE_EnableBypass - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_EnableBypass(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); -} - -/** - * @brief Disable external clock source (LSE bypass). - * @rmtoll BDCR LSEBYP LL_RCC_LSE_DisableBypass - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_DisableBypass(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); -} - -/** - * @brief Check if LSE oscillator Ready - * @rmtoll BDCR LSERDY LL_RCC_LSE_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_LSE_IsReady(void) -{ - return (READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == (RCC_BDCR_LSERDY)); -} - -#if defined(RCC_BDCR_LSEMOD) -/** - * @brief Enable LSE high drive mode. - * @note LSE high drive mode can be enabled only when the LSE clock is disabled - * @rmtoll BDCR LSEMOD LL_RCC_LSE_EnableHighDriveMode - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_EnableHighDriveMode(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); -} - -/** - * @brief Disable LSE high drive mode. - * @note LSE high drive mode can be disabled only when the LSE clock is disabled - * @rmtoll BDCR LSEMOD LL_RCC_LSE_DisableHighDriveMode - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_DisableHighDriveMode(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); -} -#endif /* RCC_BDCR_LSEMOD */ - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_LSI LSI - * @{ - */ - -/** - * @brief Enable LSI Oscillator - * @rmtoll CSR LSION LL_RCC_LSI_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSI_Enable(void) -{ - SET_BIT(RCC->CSR, RCC_CSR_LSION); -} - -/** - * @brief Disable LSI Oscillator - * @rmtoll CSR LSION LL_RCC_LSI_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSI_Disable(void) -{ - CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); -} - -/** - * @brief Check if LSI is Ready - * @rmtoll CSR LSIRDY LL_RCC_LSI_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_LSI_IsReady(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == (RCC_CSR_LSIRDY)); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_System System - * @{ - */ - -/** - * @brief Configure the system clock source - * @rmtoll CFGR SW LL_RCC_SetSysClkSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_SYS_CLKSOURCE_HSI - * @arg @ref LL_RCC_SYS_CLKSOURCE_HSE - * @arg @ref LL_RCC_SYS_CLKSOURCE_PLL - * @arg @ref LL_RCC_SYS_CLKSOURCE_PLLR (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetSysClkSource(uint32_t Source) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, Source); -} - -/** - * @brief Get the system clock source - * @rmtoll CFGR SWS LL_RCC_GetSysClkSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSI - * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSE - * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_PLL - * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_PLLR (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetSysClkSource(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_SWS)); -} - -/** - * @brief Set AHB prescaler - * @rmtoll CFGR HPRE LL_RCC_SetAHBPrescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_SYSCLK_DIV_1 - * @arg @ref LL_RCC_SYSCLK_DIV_2 - * @arg @ref LL_RCC_SYSCLK_DIV_4 - * @arg @ref LL_RCC_SYSCLK_DIV_8 - * @arg @ref LL_RCC_SYSCLK_DIV_16 - * @arg @ref LL_RCC_SYSCLK_DIV_64 - * @arg @ref LL_RCC_SYSCLK_DIV_128 - * @arg @ref LL_RCC_SYSCLK_DIV_256 - * @arg @ref LL_RCC_SYSCLK_DIV_512 - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetAHBPrescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, Prescaler); -} - -/** - * @brief Set APB1 prescaler - * @rmtoll CFGR PPRE1 LL_RCC_SetAPB1Prescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_APB1_DIV_1 - * @arg @ref LL_RCC_APB1_DIV_2 - * @arg @ref LL_RCC_APB1_DIV_4 - * @arg @ref LL_RCC_APB1_DIV_8 - * @arg @ref LL_RCC_APB1_DIV_16 - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetAPB1Prescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, Prescaler); -} - -/** - * @brief Set APB2 prescaler - * @rmtoll CFGR PPRE2 LL_RCC_SetAPB2Prescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_APB2_DIV_1 - * @arg @ref LL_RCC_APB2_DIV_2 - * @arg @ref LL_RCC_APB2_DIV_4 - * @arg @ref LL_RCC_APB2_DIV_8 - * @arg @ref LL_RCC_APB2_DIV_16 - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetAPB2Prescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, Prescaler); -} - -/** - * @brief Get AHB prescaler - * @rmtoll CFGR HPRE LL_RCC_GetAHBPrescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SYSCLK_DIV_1 - * @arg @ref LL_RCC_SYSCLK_DIV_2 - * @arg @ref LL_RCC_SYSCLK_DIV_4 - * @arg @ref LL_RCC_SYSCLK_DIV_8 - * @arg @ref LL_RCC_SYSCLK_DIV_16 - * @arg @ref LL_RCC_SYSCLK_DIV_64 - * @arg @ref LL_RCC_SYSCLK_DIV_128 - * @arg @ref LL_RCC_SYSCLK_DIV_256 - * @arg @ref LL_RCC_SYSCLK_DIV_512 - */ -__STATIC_INLINE uint32_t LL_RCC_GetAHBPrescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_HPRE)); -} - -/** - * @brief Get APB1 prescaler - * @rmtoll CFGR PPRE1 LL_RCC_GetAPB1Prescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_APB1_DIV_1 - * @arg @ref LL_RCC_APB1_DIV_2 - * @arg @ref LL_RCC_APB1_DIV_4 - * @arg @ref LL_RCC_APB1_DIV_8 - * @arg @ref LL_RCC_APB1_DIV_16 - */ -__STATIC_INLINE uint32_t LL_RCC_GetAPB1Prescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE1)); -} - -/** - * @brief Get APB2 prescaler - * @rmtoll CFGR PPRE2 LL_RCC_GetAPB2Prescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_APB2_DIV_1 - * @arg @ref LL_RCC_APB2_DIV_2 - * @arg @ref LL_RCC_APB2_DIV_4 - * @arg @ref LL_RCC_APB2_DIV_8 - * @arg @ref LL_RCC_APB2_DIV_16 - */ -__STATIC_INLINE uint32_t LL_RCC_GetAPB2Prescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2)); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_MCO MCO - * @{ - */ - -#if defined(RCC_CFGR_MCO1EN) -/** - * @brief Enable MCO1 output - * @rmtoll CFGR RCC_CFGR_MCO1EN LL_RCC_MCO1_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_MCO1_Enable(void) -{ - SET_BIT(RCC->CFGR, RCC_CFGR_MCO1EN); -} - -/** - * @brief Disable MCO1 output - * @rmtoll CFGR RCC_CFGR_MCO1EN LL_RCC_MCO1_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_MCO1_Disable(void) -{ - CLEAR_BIT(RCC->CFGR, RCC_CFGR_MCO1EN); -} -#endif /* RCC_CFGR_MCO1EN */ - -#if defined(RCC_CFGR_MCO2EN) -/** - * @brief Enable MCO2 output - * @rmtoll CFGR RCC_CFGR_MCO2EN LL_RCC_MCO2_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_MCO2_Enable(void) -{ - SET_BIT(RCC->CFGR, RCC_CFGR_MCO2EN); -} - -/** - * @brief Disable MCO2 output - * @rmtoll CFGR RCC_CFGR_MCO2EN LL_RCC_MCO2_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_MCO2_Disable(void) -{ - CLEAR_BIT(RCC->CFGR, RCC_CFGR_MCO2EN); -} -#endif /* RCC_CFGR_MCO2EN */ - -/** - * @brief Configure MCOx - * @rmtoll CFGR MCO1 LL_RCC_ConfigMCO\n - * CFGR MCO1PRE LL_RCC_ConfigMCO\n - * CFGR MCO2 LL_RCC_ConfigMCO\n - * CFGR MCO2PRE LL_RCC_ConfigMCO - * @param MCOxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_MCO1SOURCE_HSI - * @arg @ref LL_RCC_MCO1SOURCE_LSE - * @arg @ref LL_RCC_MCO1SOURCE_HSE - * @arg @ref LL_RCC_MCO1SOURCE_PLLCLK - * @arg @ref LL_RCC_MCO2SOURCE_SYSCLK - * @arg @ref LL_RCC_MCO2SOURCE_PLLI2S - * @arg @ref LL_RCC_MCO2SOURCE_HSE - * @arg @ref LL_RCC_MCO2SOURCE_PLLCLK - * @param MCOxPrescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_MCO1_DIV_1 - * @arg @ref LL_RCC_MCO1_DIV_2 - * @arg @ref LL_RCC_MCO1_DIV_3 - * @arg @ref LL_RCC_MCO1_DIV_4 - * @arg @ref LL_RCC_MCO1_DIV_5 - * @arg @ref LL_RCC_MCO2_DIV_1 - * @arg @ref LL_RCC_MCO2_DIV_2 - * @arg @ref LL_RCC_MCO2_DIV_3 - * @arg @ref LL_RCC_MCO2_DIV_4 - * @arg @ref LL_RCC_MCO2_DIV_5 - * @retval None - */ -__STATIC_INLINE void LL_RCC_ConfigMCO(uint32_t MCOxSource, uint32_t MCOxPrescaler) -{ - MODIFY_REG(RCC->CFGR, (MCOxSource & 0xFFFF0000U) | (MCOxPrescaler & 0xFFFF0000U), (MCOxSource << 16U) | (MCOxPrescaler << 16U)); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_Peripheral_Clock_Source Peripheral Clock Source - * @{ - */ -#if defined(FMPI2C1) -/** - * @brief Configure FMPI2C clock source - * @rmtoll DCKCFGR2 FMPI2C1SEL LL_RCC_SetFMPI2CClockSource - * @param FMPI2CxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_HSI - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetFMPI2CClockSource(uint32_t FMPI2CxSource) -{ - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, FMPI2CxSource); -} -#endif /* FMPI2C1 */ - -#if defined(LPTIM1) -/** - * @brief Configure LPTIMx clock source - * @rmtoll DCKCFGR2 LPTIM1SEL LL_RCC_SetLPTIMClockSource - * @param LPTIMxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_PCLK1 - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_HSI - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSI - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSE - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetLPTIMClockSource(uint32_t LPTIMxSource) -{ - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, LPTIMxSource); -} -#endif /* LPTIM1 */ - -#if defined(SAI1) -/** - * @brief Configure SAIx clock source - * @rmtoll DCKCFGR SAI1SRC LL_RCC_SetSAIClockSource\n - * DCKCFGR SAI2SRC LL_RCC_SetSAIClockSource\n - * DCKCFGR SAI1ASRC LL_RCC_SetSAIClockSource\n - * DCKCFGR SAI1BSRC LL_RCC_SetSAIClockSource - * @param SAIxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetSAIClockSource(uint32_t SAIxSource) -{ - MODIFY_REG(RCC->DCKCFGR, (SAIxSource & 0xFFFF0000U), (SAIxSource << 16U)); -} -#endif /* SAI1 */ - -#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) -/** - * @brief Configure SDIO clock source - * @rmtoll DCKCFGR SDIOSEL LL_RCC_SetSDIOClockSource\n - * DCKCFGR2 SDIOSEL LL_RCC_SetSDIOClockSource - * @param SDIOxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_SDIO_CLKSOURCE_PLL48CLK - * @arg @ref LL_RCC_SDIO_CLKSOURCE_SYSCLK - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetSDIOClockSource(uint32_t SDIOxSource) -{ -#if defined(RCC_DCKCFGR_SDIOSEL) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, SDIOxSource); -#else - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, SDIOxSource); -#endif /* RCC_DCKCFGR_SDIOSEL */ -} -#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ - -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -/** - * @brief Configure 48Mhz domain clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetCK48MClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_SetCK48MClockSource - * @param CK48MxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLL - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetCK48MClockSource(uint32_t CK48MxSource) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, CK48MxSource); -#else - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, CK48MxSource); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} - -#if defined(RNG) -/** - * @brief Configure RNG clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetRNGClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_SetRNGClockSource - * @param RNGxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLL - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetRNGClockSource(uint32_t RNGxSource) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, RNGxSource); -#else - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, RNGxSource); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} -#endif /* RNG */ - -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -/** - * @brief Configure USB clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetUSBClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_SetUSBClockSource - * @param USBxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_USB_CLKSOURCE_PLL - * @arg @ref LL_RCC_USB_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_USB_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetUSBClockSource(uint32_t USBxSource) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, USBxSource); -#else - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, USBxSource); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} -#endif /* USB_OTG_FS || USB_OTG_HS */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ - -#if defined(CEC) -/** - * @brief Configure CEC clock source - * @rmtoll DCKCFGR2 CECSEL LL_RCC_SetCECClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_CEC_CLKSOURCE_HSI_DIV488 - * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetCECClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, Source); -} -#endif /* CEC */ - -/** - * @brief Configure I2S clock source - * @rmtoll CFGR I2SSRC LL_RCC_SetI2SClockSource\n - * DCKCFGR I2SSRC LL_RCC_SetI2SClockSource\n - * DCKCFGR I2S1SRC LL_RCC_SetI2SClockSource\n - * DCKCFGR I2S2SRC LL_RCC_SetI2SClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PIN - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLSRC (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetI2SClockSource(uint32_t Source) -{ -#if defined(RCC_CFGR_I2SSRC) - MODIFY_REG(RCC->CFGR, RCC_CFGR_I2SSRC, Source); -#else - MODIFY_REG(RCC->DCKCFGR, (Source & 0xFFFF0000U), (Source << 16U)); -#endif /* RCC_CFGR_I2SSRC */ -} - -#if defined(DSI) -/** - * @brief Configure DSI clock source - * @rmtoll DCKCFGR DSISEL LL_RCC_SetDSIClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_DSI_CLKSOURCE_PHY - * @arg @ref LL_RCC_DSI_CLKSOURCE_PLL - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetDSIClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, Source); -} -#endif /* DSI */ - -#if defined(DFSDM1_Channel0) -/** - * @brief Configure DFSDM Audio clock source - * @rmtoll DCKCFGR CKDFSDM1ASEL LL_RCC_SetDFSDMAudioClockSource\n - * DCKCFGR CKDFSDM2ASEL LL_RCC_SetDFSDMAudioClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (*) - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetDFSDMAudioClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->DCKCFGR, (Source & 0x0000FFFFU), (Source >> 16U)); -} - -/** - * @brief Configure DFSDM Kernel clock source - * @rmtoll DCKCFGR CKDFSDM1SEL LL_RCC_SetDFSDMClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_PCLK2 - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_SYSCLK - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_PCLK2 (*) - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_SYSCLK (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetDFSDMClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, Source); -} -#endif /* DFSDM1_Channel0 */ - -#if defined(SPDIFRX) -/** - * @brief Configure SPDIFRX clock source - * @rmtoll DCKCFGR2 SPDIFRXSEL LL_RCC_SetSPDIFRXClockSource - * @param SPDIFRXxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLL - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetSPDIFRXClockSource(uint32_t SPDIFRXxSource) -{ - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, SPDIFRXxSource); -} -#endif /* SPDIFRX */ - -#if defined(FMPI2C1) -/** - * @brief Get FMPI2C clock source - * @rmtoll DCKCFGR2 FMPI2C1SEL LL_RCC_GetFMPI2CClockSource - * @param FMPI2Cx This parameter can be one of the following values: - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_HSI - */ -__STATIC_INLINE uint32_t LL_RCC_GetFMPI2CClockSource(uint32_t FMPI2Cx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, FMPI2Cx)); -} -#endif /* FMPI2C1 */ - -#if defined(LPTIM1) -/** - * @brief Get LPTIMx clock source - * @rmtoll DCKCFGR2 LPTIM1SEL LL_RCC_GetLPTIMClockSource - * @param LPTIMx This parameter can be one of the following values: - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_PCLK1 - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_HSI - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSI - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSE - */ -__STATIC_INLINE uint32_t LL_RCC_GetLPTIMClockSource(uint32_t LPTIMx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)); -} -#endif /* LPTIM1 */ - -#if defined(SAI1) -/** - * @brief Get SAIx clock source - * @rmtoll DCKCFGR SAI1SEL LL_RCC_GetSAIClockSource\n - * DCKCFGR SAI2SEL LL_RCC_GetSAIClockSource\n - * DCKCFGR SAI1ASRC LL_RCC_GetSAIClockSource\n - * DCKCFGR SAI1BSRC LL_RCC_GetSAIClockSource - * @param SAIx This parameter can be one of the following values: - * @arg @ref LL_RCC_SAI1_CLKSOURCE (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE (*) - * - * (*) value not defined in all devices. - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetSAIClockSource(uint32_t SAIx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, SAIx) >> 16U | SAIx); -} -#endif /* SAI1 */ - -#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) -/** - * @brief Get SDIOx clock source - * @rmtoll DCKCFGR SDIOSEL LL_RCC_GetSDIOClockSource\n - * DCKCFGR2 SDIOSEL LL_RCC_GetSDIOClockSource - * @param SDIOx This parameter can be one of the following values: - * @arg @ref LL_RCC_SDIO_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SDIO_CLKSOURCE_PLL48CLK - * @arg @ref LL_RCC_SDIO_CLKSOURCE_SYSCLK - */ -__STATIC_INLINE uint32_t LL_RCC_GetSDIOClockSource(uint32_t SDIOx) -{ -#if defined(RCC_DCKCFGR_SDIOSEL) - return (uint32_t)(READ_BIT(RCC->DCKCFGR, SDIOx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, SDIOx)); -#endif /* RCC_DCKCFGR_SDIOSEL */ -} -#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ - -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -/** - * @brief Get 48Mhz domain clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetCK48MClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_GetCK48MClockSource - * @param CK48Mx This parameter can be one of the following values: - * @arg @ref LL_RCC_CK48M_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLL - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetCK48MClockSource(uint32_t CK48Mx) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - return (uint32_t)(READ_BIT(RCC->DCKCFGR, CK48Mx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, CK48Mx)); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} - -#if defined(RNG) -/** - * @brief Get RNGx clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetRNGClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_GetRNGClockSource - * @param RNGx This parameter can be one of the following values: - * @arg @ref LL_RCC_RNG_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLL - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetRNGClockSource(uint32_t RNGx) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RNGx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, RNGx)); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} -#endif /* RNG */ - -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -/** - * @brief Get USBx clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetUSBClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_GetUSBClockSource - * @param USBx This parameter can be one of the following values: - * @arg @ref LL_RCC_USB_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_USB_CLKSOURCE_PLL - * @arg @ref LL_RCC_USB_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_USB_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetUSBClockSource(uint32_t USBx) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - return (uint32_t)(READ_BIT(RCC->DCKCFGR, USBx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, USBx)); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} -#endif /* USB_OTG_FS || USB_OTG_HS */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ - -#if defined(CEC) -/** - * @brief Get CEC Clock Source - * @rmtoll DCKCFGR2 CECSEL LL_RCC_GetCECClockSource - * @param CECx This parameter can be one of the following values: - * @arg @ref LL_RCC_CEC_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_CEC_CLKSOURCE_HSI_DIV488 - * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE - */ -__STATIC_INLINE uint32_t LL_RCC_GetCECClockSource(uint32_t CECx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, CECx)); -} -#endif /* CEC */ - -/** - * @brief Get I2S Clock Source - * @rmtoll CFGR I2SSRC LL_RCC_GetI2SClockSource\n - * DCKCFGR I2SSRC LL_RCC_GetI2SClockSource\n - * DCKCFGR I2S1SRC LL_RCC_GetI2SClockSource\n - * DCKCFGR I2S2SRC LL_RCC_GetI2SClockSource - * @param I2Sx This parameter can be one of the following values: - * @arg @ref LL_RCC_I2S1_CLKSOURCE - * @arg @ref LL_RCC_I2S2_CLKSOURCE (*) - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PIN - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLSRC (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetI2SClockSource(uint32_t I2Sx) -{ -#if defined(RCC_CFGR_I2SSRC) - return (uint32_t)(READ_BIT(RCC->CFGR, I2Sx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR, I2Sx) >> 16U | I2Sx); -#endif /* RCC_CFGR_I2SSRC */ -} - -#if defined(DFSDM1_Channel0) -/** - * @brief Get DFSDM Audio Clock Source - * @rmtoll DCKCFGR CKDFSDM1ASEL LL_RCC_GetDFSDMAudioClockSource\n - * DCKCFGR CKDFSDM2ASEL LL_RCC_GetDFSDMAudioClockSource - * @param DFSDMx This parameter can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE (*) - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (*) - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetDFSDMAudioClockSource(uint32_t DFSDMx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, DFSDMx) << 16U | DFSDMx); -} - -/** - * @brief Get DFSDM Audio Clock Source - * @rmtoll DCKCFGR CKDFSDM1SEL LL_RCC_GetDFSDMClockSource - * @param DFSDMx This parameter can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE (*) - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_PCLK2 - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_SYSCLK - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_PCLK2 (*) - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_SYSCLK (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetDFSDMClockSource(uint32_t DFSDMx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, DFSDMx)); -} -#endif /* DFSDM1_Channel0 */ - -#if defined(SPDIFRX) -/** - * @brief Get SPDIFRX clock source - * @rmtoll DCKCFGR2 SPDIFRXSEL LL_RCC_GetSPDIFRXClockSource - * @param SPDIFRXx This parameter can be one of the following values: - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLL - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetSPDIFRXClockSource(uint32_t SPDIFRXx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, SPDIFRXx)); -} -#endif /* SPDIFRX */ - -#if defined(DSI) -/** - * @brief Get DSI Clock Source - * @rmtoll DCKCFGR DSISEL LL_RCC_GetDSIClockSource - * @param DSIx This parameter can be one of the following values: - * @arg @ref LL_RCC_DSI_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_DSI_CLKSOURCE_PHY - * @arg @ref LL_RCC_DSI_CLKSOURCE_PLL - */ -__STATIC_INLINE uint32_t LL_RCC_GetDSIClockSource(uint32_t DSIx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, DSIx)); -} -#endif /* DSI */ - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_RTC RTC - * @{ - */ - -/** - * @brief Set RTC Clock Source - * @note Once the RTC clock source has been selected, it cannot be changed anymore unless - * the Backup domain is reset, or unless a failure is detected on LSE (LSECSSD is - * set). The BDRST bit can be used to reset them. - * @rmtoll BDCR RTCSEL LL_RCC_SetRTCClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_RTC_CLKSOURCE_NONE - * @arg @ref LL_RCC_RTC_CLKSOURCE_LSE - * @arg @ref LL_RCC_RTC_CLKSOURCE_LSI - * @arg @ref LL_RCC_RTC_CLKSOURCE_HSE - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetRTCClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->BDCR, RCC_BDCR_RTCSEL, Source); -} - -/** - * @brief Get RTC Clock Source - * @rmtoll BDCR RTCSEL LL_RCC_GetRTCClockSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_RTC_CLKSOURCE_NONE - * @arg @ref LL_RCC_RTC_CLKSOURCE_LSE - * @arg @ref LL_RCC_RTC_CLKSOURCE_LSI - * @arg @ref LL_RCC_RTC_CLKSOURCE_HSE - */ -__STATIC_INLINE uint32_t LL_RCC_GetRTCClockSource(void) -{ - return (uint32_t)(READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)); -} - -/** - * @brief Enable RTC - * @rmtoll BDCR RTCEN LL_RCC_EnableRTC - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableRTC(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_RTCEN); -} - -/** - * @brief Disable RTC - * @rmtoll BDCR RTCEN LL_RCC_DisableRTC - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableRTC(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_RTCEN); -} - -/** - * @brief Check if RTC has been enabled or not - * @rmtoll BDCR RTCEN LL_RCC_IsEnabledRTC - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledRTC(void) -{ - return (READ_BIT(RCC->BDCR, RCC_BDCR_RTCEN) == (RCC_BDCR_RTCEN)); -} - -/** - * @brief Force the Backup domain reset - * @rmtoll BDCR BDRST LL_RCC_ForceBackupDomainReset - * @retval None - */ -__STATIC_INLINE void LL_RCC_ForceBackupDomainReset(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_BDRST); -} - -/** - * @brief Release the Backup domain reset - * @rmtoll BDCR BDRST LL_RCC_ReleaseBackupDomainReset - * @retval None - */ -__STATIC_INLINE void LL_RCC_ReleaseBackupDomainReset(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_BDRST); -} - -/** - * @brief Set HSE Prescalers for RTC Clock - * @rmtoll CFGR RTCPRE LL_RCC_SetRTC_HSEPrescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_RTC_NOCLOCK - * @arg @ref LL_RCC_RTC_HSE_DIV_2 - * @arg @ref LL_RCC_RTC_HSE_DIV_3 - * @arg @ref LL_RCC_RTC_HSE_DIV_4 - * @arg @ref LL_RCC_RTC_HSE_DIV_5 - * @arg @ref LL_RCC_RTC_HSE_DIV_6 - * @arg @ref LL_RCC_RTC_HSE_DIV_7 - * @arg @ref LL_RCC_RTC_HSE_DIV_8 - * @arg @ref LL_RCC_RTC_HSE_DIV_9 - * @arg @ref LL_RCC_RTC_HSE_DIV_10 - * @arg @ref LL_RCC_RTC_HSE_DIV_11 - * @arg @ref LL_RCC_RTC_HSE_DIV_12 - * @arg @ref LL_RCC_RTC_HSE_DIV_13 - * @arg @ref LL_RCC_RTC_HSE_DIV_14 - * @arg @ref LL_RCC_RTC_HSE_DIV_15 - * @arg @ref LL_RCC_RTC_HSE_DIV_16 - * @arg @ref LL_RCC_RTC_HSE_DIV_17 - * @arg @ref LL_RCC_RTC_HSE_DIV_18 - * @arg @ref LL_RCC_RTC_HSE_DIV_19 - * @arg @ref LL_RCC_RTC_HSE_DIV_20 - * @arg @ref LL_RCC_RTC_HSE_DIV_21 - * @arg @ref LL_RCC_RTC_HSE_DIV_22 - * @arg @ref LL_RCC_RTC_HSE_DIV_23 - * @arg @ref LL_RCC_RTC_HSE_DIV_24 - * @arg @ref LL_RCC_RTC_HSE_DIV_25 - * @arg @ref LL_RCC_RTC_HSE_DIV_26 - * @arg @ref LL_RCC_RTC_HSE_DIV_27 - * @arg @ref LL_RCC_RTC_HSE_DIV_28 - * @arg @ref LL_RCC_RTC_HSE_DIV_29 - * @arg @ref LL_RCC_RTC_HSE_DIV_30 - * @arg @ref LL_RCC_RTC_HSE_DIV_31 - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetRTC_HSEPrescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, Prescaler); -} - -/** - * @brief Get HSE Prescalers for RTC Clock - * @rmtoll CFGR RTCPRE LL_RCC_GetRTC_HSEPrescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_RTC_NOCLOCK - * @arg @ref LL_RCC_RTC_HSE_DIV_2 - * @arg @ref LL_RCC_RTC_HSE_DIV_3 - * @arg @ref LL_RCC_RTC_HSE_DIV_4 - * @arg @ref LL_RCC_RTC_HSE_DIV_5 - * @arg @ref LL_RCC_RTC_HSE_DIV_6 - * @arg @ref LL_RCC_RTC_HSE_DIV_7 - * @arg @ref LL_RCC_RTC_HSE_DIV_8 - * @arg @ref LL_RCC_RTC_HSE_DIV_9 - * @arg @ref LL_RCC_RTC_HSE_DIV_10 - * @arg @ref LL_RCC_RTC_HSE_DIV_11 - * @arg @ref LL_RCC_RTC_HSE_DIV_12 - * @arg @ref LL_RCC_RTC_HSE_DIV_13 - * @arg @ref LL_RCC_RTC_HSE_DIV_14 - * @arg @ref LL_RCC_RTC_HSE_DIV_15 - * @arg @ref LL_RCC_RTC_HSE_DIV_16 - * @arg @ref LL_RCC_RTC_HSE_DIV_17 - * @arg @ref LL_RCC_RTC_HSE_DIV_18 - * @arg @ref LL_RCC_RTC_HSE_DIV_19 - * @arg @ref LL_RCC_RTC_HSE_DIV_20 - * @arg @ref LL_RCC_RTC_HSE_DIV_21 - * @arg @ref LL_RCC_RTC_HSE_DIV_22 - * @arg @ref LL_RCC_RTC_HSE_DIV_23 - * @arg @ref LL_RCC_RTC_HSE_DIV_24 - * @arg @ref LL_RCC_RTC_HSE_DIV_25 - * @arg @ref LL_RCC_RTC_HSE_DIV_26 - * @arg @ref LL_RCC_RTC_HSE_DIV_27 - * @arg @ref LL_RCC_RTC_HSE_DIV_28 - * @arg @ref LL_RCC_RTC_HSE_DIV_29 - * @arg @ref LL_RCC_RTC_HSE_DIV_30 - * @arg @ref LL_RCC_RTC_HSE_DIV_31 - */ -__STATIC_INLINE uint32_t LL_RCC_GetRTC_HSEPrescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE)); -} - -/** - * @} - */ - -#if defined(RCC_DCKCFGR_TIMPRE) -/** @defgroup RCC_LL_EF_TIM_CLOCK_PRESCALER TIM - * @{ - */ - -/** - * @brief Set Timers Clock Prescalers - * @rmtoll DCKCFGR TIMPRE LL_RCC_SetTIMPrescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_TIM_PRESCALER_TWICE - * @arg @ref LL_RCC_TIM_PRESCALER_FOUR_TIMES - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetTIMPrescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_TIMPRE, Prescaler); -} - -/** - * @brief Get Timers Clock Prescalers - * @rmtoll DCKCFGR TIMPRE LL_RCC_GetTIMPrescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_TIM_PRESCALER_TWICE - * @arg @ref LL_RCC_TIM_PRESCALER_FOUR_TIMES - */ -__STATIC_INLINE uint32_t LL_RCC_GetTIMPrescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_TIMPRE)); -} - -/** - * @} - */ -#endif /* RCC_DCKCFGR_TIMPRE */ - -/** @defgroup RCC_LL_EF_PLL PLL - * @{ - */ - -/** - * @brief Enable PLL - * @rmtoll CR PLLON LL_RCC_PLL_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_PLLON); -} - -/** - * @brief Disable PLL - * @note Cannot be disabled if the PLL clock is used as the system clock - * @rmtoll CR PLLON LL_RCC_PLL_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_PLLON); -} - -/** - * @brief Check if PLL Ready - * @rmtoll CR PLLRDY LL_RCC_PLL_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_PLLRDY) == (RCC_CR_PLLRDY)); -} - -/** - * @brief Configure PLL used for SYSCLK Domain - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLP can be written only when PLL is disabled - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SYS\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SYS\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SYS\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SYS\n - * PLLCFGR PLLP LL_RCC_PLL_ConfigDomain_SYS - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLP_R This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLP_DIV_2 - * @arg @ref LL_RCC_PLLP_DIV_4 - * @arg @ref LL_RCC_PLLP_DIV_6 - * @arg @ref LL_RCC_PLLP_DIV_8 - * @arg @ref LL_RCC_PLLR_DIV_2 (*) - * @arg @ref LL_RCC_PLLR_DIV_3 (*) - * @arg @ref LL_RCC_PLLR_DIV_4 (*) - * @arg @ref LL_RCC_PLLR_DIV_5 (*) - * @arg @ref LL_RCC_PLLR_DIV_6 (*) - * @arg @ref LL_RCC_PLLR_DIV_7 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SYS(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP_R) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos); - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLP, PLLP_R); -#if defined(RCC_PLLR_SYSCLK_SUPPORT) - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLR, PLLP_R); -#endif /* RCC_PLLR_SYSCLK_SUPPORT */ -} - -/** - * @brief Configure PLL used for 48Mhz domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLQ can be written only when PLL is disabled - * @note This can be selected for USB, RNG, SDIO - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_48M\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_48M\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_48M\n - * PLLCFGR PLLQ LL_RCC_PLL_ConfigDomain_48M - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLQ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLQ_DIV_2 - * @arg @ref LL_RCC_PLLQ_DIV_3 - * @arg @ref LL_RCC_PLLQ_DIV_4 - * @arg @ref LL_RCC_PLLQ_DIV_5 - * @arg @ref LL_RCC_PLLQ_DIV_6 - * @arg @ref LL_RCC_PLLQ_DIV_7 - * @arg @ref LL_RCC_PLLQ_DIV_8 - * @arg @ref LL_RCC_PLLQ_DIV_9 - * @arg @ref LL_RCC_PLLQ_DIV_10 - * @arg @ref LL_RCC_PLLQ_DIV_11 - * @arg @ref LL_RCC_PLLQ_DIV_12 - * @arg @ref LL_RCC_PLLQ_DIV_13 - * @arg @ref LL_RCC_PLLQ_DIV_14 - * @arg @ref LL_RCC_PLLQ_DIV_15 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLQ, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLQ); -} - -#if defined(DSI) -/** - * @brief Configure PLL used for DSI clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI are disabled - * @note PLLN/PLLR can be written only when PLL is disabled - * @note This can be selected for DSI - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_DSI\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_DSI\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_DSI\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_DSI - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_DSI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); -} -#endif /* DSI */ - -#if defined(RCC_PLLR_I2S_CLKSOURCE_SUPPORT) -/** - * @brief Configure PLL used for I2S clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI are disabled - * @note PLLN/PLLR can be written only when PLL is disabled - * @note This can be selected for I2S - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_I2S\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_I2S\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_I2S\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_I2S - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_I2S(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); -} -#endif /* RCC_PLLR_I2S_CLKSOURCE_SUPPORT */ - -#if defined(SPDIFRX) -/** - * @brief Configure PLL used for SPDIFRX clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI are disabled - * @note PLLN/PLLR can be written only when PLL is disabled - * @note This can be selected for SPDIFRX - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SPDIFRX\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SPDIFRX\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SPDIFRX\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SPDIFRX - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SPDIFRX(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); -} -#endif /* SPDIFRX */ - -#if defined(RCC_PLLCFGR_PLLR) -#if defined(SAI1) -/** - * @brief Configure PLL used for SAI clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI are disabled - * @note PLLN/PLLR can be written only when PLL is disabled - * @note This can be selected for SAI - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SAI\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SAI\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SAI\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SAI\n - * DCKCFGR PLLDIVR LL_RCC_PLL_ConfigDomain_SAI - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @param PLLDIVR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLDIVR_DIV_1 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_2 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_3 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_4 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_5 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_6 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_7 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_8 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_9 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_10 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_11 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_12 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_13 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_14 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_15 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_16 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_17 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_18 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_19 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_20 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_21 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_22 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_23 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_24 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_25 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_26 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_27 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_28 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_29 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_30 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_31 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -#if defined(RCC_DCKCFGR_PLLDIVR) -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR, - uint32_t PLLDIVR) -#else -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -#endif /* RCC_DCKCFGR_PLLDIVR */ -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); -#if defined(RCC_DCKCFGR_PLLDIVR) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, PLLDIVR); -#endif /* RCC_DCKCFGR_PLLDIVR */ -} -#endif /* SAI1 */ -#endif /* RCC_PLLCFGR_PLLR */ - -/** - * @brief Configure PLL clock source - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_SetMainSource - * @param PLLSource This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_SetMainSource(uint32_t PLLSource) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, PLLSource); -} - -/** - * @brief Get the oscillator used as PLL clock source. - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_GetMainSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetMainSource(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC)); -} - -/** - * @brief Get Main PLL multiplication factor for VCO - * @rmtoll PLLCFGR PLLN LL_RCC_PLL_GetN - * @retval Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetN(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); -} - -/** - * @brief Get Main PLL division factor for PLLP - * @rmtoll PLLCFGR PLLP LL_RCC_PLL_GetP - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLP_DIV_2 - * @arg @ref LL_RCC_PLLP_DIV_4 - * @arg @ref LL_RCC_PLLP_DIV_6 - * @arg @ref LL_RCC_PLLP_DIV_8 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetP(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP)); -} - -/** - * @brief Get Main PLL division factor for PLLQ - * @note used for PLL48MCLK selected for USB, RNG, SDIO (48 MHz clock) - * @rmtoll PLLCFGR PLLQ LL_RCC_PLL_GetQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLQ_DIV_2 - * @arg @ref LL_RCC_PLLQ_DIV_3 - * @arg @ref LL_RCC_PLLQ_DIV_4 - * @arg @ref LL_RCC_PLLQ_DIV_5 - * @arg @ref LL_RCC_PLLQ_DIV_6 - * @arg @ref LL_RCC_PLLQ_DIV_7 - * @arg @ref LL_RCC_PLLQ_DIV_8 - * @arg @ref LL_RCC_PLLQ_DIV_9 - * @arg @ref LL_RCC_PLLQ_DIV_10 - * @arg @ref LL_RCC_PLLQ_DIV_11 - * @arg @ref LL_RCC_PLLQ_DIV_12 - * @arg @ref LL_RCC_PLLQ_DIV_13 - * @arg @ref LL_RCC_PLLQ_DIV_14 - * @arg @ref LL_RCC_PLLQ_DIV_15 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetQ(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ)); -} - -#if defined(RCC_PLLCFGR_PLLR) -/** - * @brief Get Main PLL division factor for PLLR - * @note used for PLLCLK (system clock) - * @rmtoll PLLCFGR PLLR LL_RCC_PLL_GetR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetR(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR)); -} -#endif /* RCC_PLLCFGR_PLLR */ - -#if defined(RCC_DCKCFGR_PLLDIVR) -/** - * @brief Get Main PLL division factor for PLLDIVR - * @note used for PLLSAICLK (SAI1 and SAI2 clock) - * @rmtoll DCKCFGR PLLDIVR LL_RCC_PLL_GetDIVR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLDIVR_DIV_1 - * @arg @ref LL_RCC_PLLDIVR_DIV_2 - * @arg @ref LL_RCC_PLLDIVR_DIV_3 - * @arg @ref LL_RCC_PLLDIVR_DIV_4 - * @arg @ref LL_RCC_PLLDIVR_DIV_5 - * @arg @ref LL_RCC_PLLDIVR_DIV_6 - * @arg @ref LL_RCC_PLLDIVR_DIV_7 - * @arg @ref LL_RCC_PLLDIVR_DIV_8 - * @arg @ref LL_RCC_PLLDIVR_DIV_9 - * @arg @ref LL_RCC_PLLDIVR_DIV_10 - * @arg @ref LL_RCC_PLLDIVR_DIV_11 - * @arg @ref LL_RCC_PLLDIVR_DIV_12 - * @arg @ref LL_RCC_PLLDIVR_DIV_13 - * @arg @ref LL_RCC_PLLDIVR_DIV_14 - * @arg @ref LL_RCC_PLLDIVR_DIV_15 - * @arg @ref LL_RCC_PLLDIVR_DIV_16 - * @arg @ref LL_RCC_PLLDIVR_DIV_17 - * @arg @ref LL_RCC_PLLDIVR_DIV_18 - * @arg @ref LL_RCC_PLLDIVR_DIV_19 - * @arg @ref LL_RCC_PLLDIVR_DIV_20 - * @arg @ref LL_RCC_PLLDIVR_DIV_21 - * @arg @ref LL_RCC_PLLDIVR_DIV_22 - * @arg @ref LL_RCC_PLLDIVR_DIV_23 - * @arg @ref LL_RCC_PLLDIVR_DIV_24 - * @arg @ref LL_RCC_PLLDIVR_DIV_25 - * @arg @ref LL_RCC_PLLDIVR_DIV_26 - * @arg @ref LL_RCC_PLLDIVR_DIV_27 - * @arg @ref LL_RCC_PLLDIVR_DIV_28 - * @arg @ref LL_RCC_PLLDIVR_DIV_29 - * @arg @ref LL_RCC_PLLDIVR_DIV_30 - * @arg @ref LL_RCC_PLLDIVR_DIV_31 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetDIVR(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR)); -} -#endif /* RCC_DCKCFGR_PLLDIVR */ - -/** - * @brief Get Division factor for the main PLL and other PLL - * @rmtoll PLLCFGR PLLM LL_RCC_PLL_GetDivider - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetDivider(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); -} - -/** - * @brief Configure Spread Spectrum used for PLL - * @note These bits must be written before enabling PLL - * @rmtoll SSCGR MODPER LL_RCC_PLL_ConfigSpreadSpectrum\n - * SSCGR INCSTEP LL_RCC_PLL_ConfigSpreadSpectrum\n - * SSCGR SPREADSEL LL_RCC_PLL_ConfigSpreadSpectrum - * @param Mod Between Min_Data=0 and Max_Data=8191 - * @param Inc Between Min_Data=0 and Max_Data=32767 - * @param Sel This parameter can be one of the following values: - * @arg @ref LL_RCC_SPREAD_SELECT_CENTER - * @arg @ref LL_RCC_SPREAD_SELECT_DOWN - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigSpreadSpectrum(uint32_t Mod, uint32_t Inc, uint32_t Sel) -{ - MODIFY_REG(RCC->SSCGR, RCC_SSCGR_MODPER | RCC_SSCGR_INCSTEP | RCC_SSCGR_SPREADSEL, Mod | (Inc << RCC_SSCGR_INCSTEP_Pos) | Sel); -} - -/** - * @brief Get Spread Spectrum Modulation Period for PLL - * @rmtoll SSCGR MODPER LL_RCC_PLL_GetPeriodModulation - * @retval Between Min_Data=0 and Max_Data=8191 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetPeriodModulation(void) -{ - return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_MODPER)); -} - -/** - * @brief Get Spread Spectrum Incrementation Step for PLL - * @note Must be written before enabling PLL - * @rmtoll SSCGR INCSTEP LL_RCC_PLL_GetStepIncrementation - * @retval Between Min_Data=0 and Max_Data=32767 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetStepIncrementation(void) -{ - return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_INCSTEP) >> RCC_SSCGR_INCSTEP_Pos); -} - -/** - * @brief Get Spread Spectrum Selection for PLL - * @note Must be written before enabling PLL - * @rmtoll SSCGR SPREADSEL LL_RCC_PLL_GetSpreadSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SPREAD_SELECT_CENTER - * @arg @ref LL_RCC_SPREAD_SELECT_DOWN - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetSpreadSelection(void) -{ - return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_SPREADSEL)); -} - -/** - * @brief Enable Spread Spectrum for PLL. - * @rmtoll SSCGR SSCGEN LL_RCC_PLL_SpreadSpectrum_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_SpreadSpectrum_Enable(void) -{ - SET_BIT(RCC->SSCGR, RCC_SSCGR_SSCGEN); -} - -/** - * @brief Disable Spread Spectrum for PLL. - * @rmtoll SSCGR SSCGEN LL_RCC_PLL_SpreadSpectrum_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_SpreadSpectrum_Disable(void) -{ - CLEAR_BIT(RCC->SSCGR, RCC_SSCGR_SSCGEN); -} - -/** - * @} - */ - -#if defined(RCC_PLLI2S_SUPPORT) -/** @defgroup RCC_LL_EF_PLLI2S PLLI2S - * @{ - */ - -/** - * @brief Enable PLLI2S - * @rmtoll CR PLLI2SON LL_RCC_PLLI2S_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_PLLI2SON); -} - -/** - * @brief Disable PLLI2S - * @rmtoll CR PLLI2SON LL_RCC_PLLI2S_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); -} - -/** - * @brief Check if PLLI2S Ready - * @rmtoll CR PLLI2SRDY LL_RCC_PLLI2S_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) == (RCC_CR_PLLI2SRDY)); -} - -#if (defined(RCC_DCKCFGR_PLLI2SDIVQ) || defined(RCC_DCKCFGR_PLLI2SDIVR)) -/** - * @brief Configure PLLI2S used for SAI domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLQ/PLLR can be written only when PLLI2S is disabled - * @note This can be selected for SAI - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_ConfigDomain_SAI\n - * DCKCFGR PLLI2SDIVQ LL_RCC_PLLI2S_ConfigDomain_SAI\n - * DCKCFGR PLLI2SDIVR LL_RCC_PLLI2S_ConfigDomain_SAI - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) - * - * (*) value not defined in all devices. - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param PLLN Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLQ_R This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_7 (*) - * - * (*) value not defined in all devices. - * @param PLLDIVQ_R This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ_R, - uint32_t PLLDIVQ_R) -{ - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); - MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos); -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SQ, PLLQ_R); - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, PLLDIVQ_R); -#else - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SR, PLLQ_R); - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, PLLDIVQ_R); -#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ -} -#endif /* RCC_DCKCFGR_PLLI2SDIVQ && RCC_DCKCFGR_PLLI2SDIVR */ - -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -/** - * @brief Configure PLLI2S used for 48Mhz domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLQ can be written only when PLLI2S is disabled - * @note This can be selected for RNG, USB, SDIO - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_ConfigDomain_48M - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) - * - * (*) value not defined in all devices. - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLQ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ) -{ - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); - MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SQ, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLQ); -} -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ - -#if defined(SPDIFRX) -/** - * @brief Configure PLLI2S used for SPDIFRX domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLP can be written only when PLLI2S is disabled - * @note This can be selected for SPDIFRX - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n - * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n - * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n - * PLLI2SCFGR PLLI2SP LL_RCC_PLLI2S_ConfigDomain_SPDIFRX - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLP This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SP_DIV_2 - * @arg @ref LL_RCC_PLLI2SP_DIV_4 - * @arg @ref LL_RCC_PLLI2SP_DIV_6 - * @arg @ref LL_RCC_PLLI2SP_DIV_8 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_SPDIFRX(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SP, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLP); -} -#endif /* SPDIFRX */ - -/** - * @brief Configure PLLI2S used for I2S1 domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLR can be written only when PLLI2S is disabled - * @note This can be selected for I2S - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_ConfigDomain_I2S - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) - * - * (*) value not defined in all devices. - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param PLLN Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SR_DIV_2 - * @arg @ref LL_RCC_PLLI2SR_DIV_3 - * @arg @ref LL_RCC_PLLI2SR_DIV_4 - * @arg @ref LL_RCC_PLLI2SR_DIV_5 - * @arg @ref LL_RCC_PLLI2SR_DIV_6 - * @arg @ref LL_RCC_PLLI2SR_DIV_7 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_I2S(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -{ - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); - MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SR, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLR); -} - -/** - * @brief Get I2SPLL multiplication factor for VCO - * @rmtoll PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_GetN - * @retval Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetN(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); -} - -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) -/** - * @brief Get I2SPLL division factor for PLLI2SQ - * @rmtoll PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_GetQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetQ(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SQ)); -} -#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ - -/** - * @brief Get I2SPLL division factor for PLLI2SR - * @note used for PLLI2SCLK (I2S clock) - * @rmtoll PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_GetR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SR_DIV_2 - * @arg @ref LL_RCC_PLLI2SR_DIV_3 - * @arg @ref LL_RCC_PLLI2SR_DIV_4 - * @arg @ref LL_RCC_PLLI2SR_DIV_5 - * @arg @ref LL_RCC_PLLI2SR_DIV_6 - * @arg @ref LL_RCC_PLLI2SR_DIV_7 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetR(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SR)); -} - -#if defined(RCC_PLLI2SCFGR_PLLI2SP) -/** - * @brief Get I2SPLL division factor for PLLI2SP - * @note used for PLLSPDIFRXCLK (SPDIFRX clock) - * @rmtoll PLLI2SCFGR PLLI2SP LL_RCC_PLLI2S_GetP - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SP_DIV_2 - * @arg @ref LL_RCC_PLLI2SP_DIV_4 - * @arg @ref LL_RCC_PLLI2SP_DIV_6 - * @arg @ref LL_RCC_PLLI2SP_DIV_8 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetP(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SP)); -} -#endif /* RCC_PLLI2SCFGR_PLLI2SP */ - -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) -/** - * @brief Get I2SPLL division factor for PLLI2SDIVQ - * @note used PLLSAICLK selected (SAI clock) - * @rmtoll DCKCFGR PLLI2SDIVQ LL_RCC_PLLI2S_GetDIVQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDIVQ(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ)); -} -#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ - -#if defined(RCC_DCKCFGR_PLLI2SDIVR) -/** - * @brief Get I2SPLL division factor for PLLI2SDIVR - * @note used PLLSAICLK selected (SAI clock) - * @rmtoll DCKCFGR PLLI2SDIVR LL_RCC_PLLI2S_GetDIVR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDIVR(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR)); -} -#endif /* RCC_DCKCFGR_PLLI2SDIVR */ - -/** - * @brief Get division factor for PLLI2S input clock - * @rmtoll PLLCFGR PLLM LL_RCC_PLLI2S_GetDivider\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_GetDivider - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDivider(void) -{ -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM)); -#else - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ -} - -/** - * @brief Get the oscillator used as PLL clock source. - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_GetMainSource\n - * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_GetMainSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetMainSource(void) -{ -#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) - uint32_t pllsrc = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC); - uint32_t plli2sssrc0 = READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SSRC); - uint32_t plli2sssrc1 = READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SSRC) >> 15U; - return (uint32_t)(pllsrc | plli2sssrc0 | plli2sssrc1); -#else - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC)); -#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ -} - -/** - * @} - */ -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** @defgroup RCC_LL_EF_PLLSAI PLLSAI - * @{ - */ - -/** - * @brief Enable PLLSAI - * @rmtoll CR PLLSAION LL_RCC_PLLSAI_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_PLLSAION); -} - -/** - * @brief Disable PLLSAI - * @rmtoll CR PLLSAION LL_RCC_PLLSAI_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); -} - -/** - * @brief Check if PLLSAI Ready - * @rmtoll CR PLLSAIRDY LL_RCC_PLLSAI_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) == (RCC_CR_PLLSAIRDY)); -} - -/** - * @brief Configure PLLSAI used for SAI domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLQ can be written only when PLLSAI is disabled - * @note This can be selected for SAI - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_SAI\n - * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_SAI\n - * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_ConfigDomain_SAI\n - * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_SAI\n - * PLLSAICFGR PLLSAIQ LL_RCC_PLLSAI_ConfigDomain_SAI\n - * DCKCFGR PLLSAIDIVQ LL_RCC_PLLSAI_ConfigDomain_SAI - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param PLLN Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLQ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIQ_DIV_15 - * @param PLLDIVQ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ, - uint32_t PLLDIVQ) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); -#if defined(RCC_PLLSAICFGR_PLLSAIM) - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIQ, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLQ); - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, PLLDIVQ); -} - -#if defined(RCC_PLLSAICFGR_PLLSAIP) -/** - * @brief Configure PLLSAI used for 48Mhz domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLP can be written only when PLLSAI is disabled - * @note This can be selected for USB, RNG, SDIO - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_48M\n - * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_48M\n - * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_ConfigDomain_48M\n - * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_48M\n - * PLLSAICFGR PLLSAIP LL_RCC_PLLSAI_ConfigDomain_48M - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLP This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIP_DIV_2 - * @arg @ref LL_RCC_PLLSAIP_DIV_4 - * @arg @ref LL_RCC_PLLSAIP_DIV_6 - * @arg @ref LL_RCC_PLLSAIP_DIV_8 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); -#if defined(RCC_PLLSAICFGR_PLLSAIM) - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIP, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLP); -} -#endif /* RCC_PLLSAICFGR_PLLSAIP */ - -#if defined(LTDC) -/** - * @brief Configure PLLSAI used for LTDC domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLR can be written only when PLLSAI is disabled - * @note This can be selected for LTDC - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_LTDC\n - * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_LTDC\n - * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_LTDC\n - * PLLSAICFGR PLLSAIR LL_RCC_PLLSAI_ConfigDomain_LTDC\n - * DCKCFGR PLLSAIDIVR LL_RCC_PLLSAI_ConfigDomain_LTDC - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param PLLN Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIR_DIV_2 - * @arg @ref LL_RCC_PLLSAIR_DIV_3 - * @arg @ref LL_RCC_PLLSAIR_DIV_4 - * @arg @ref LL_RCC_PLLSAIR_DIV_5 - * @arg @ref LL_RCC_PLLSAIR_DIV_6 - * @arg @ref LL_RCC_PLLSAIR_DIV_7 - * @param PLLDIVR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_LTDC(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR, - uint32_t PLLDIVR) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM, Source | PLLM); - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIR, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLR); - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, PLLDIVR); -} -#endif /* LTDC */ - -/** - * @brief Get division factor for PLLSAI input clock - * @rmtoll PLLCFGR PLLM LL_RCC_PLLSAI_GetDivider\n - * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_GetDivider - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDivider(void) -{ -#if defined(RCC_PLLSAICFGR_PLLSAIM) - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM)); -#else - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ -} - -/** - * @brief Get SAIPLL multiplication factor for VCO - * @rmtoll PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_GetN - * @retval Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetN(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); -} - -/** - * @brief Get SAIPLL division factor for PLLSAIQ - * @rmtoll PLLSAICFGR PLLSAIQ LL_RCC_PLLSAI_GetQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIQ_DIV_15 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetQ(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIQ)); -} - -#if defined(RCC_PLLSAICFGR_PLLSAIR) -/** - * @brief Get SAIPLL division factor for PLLSAIR - * @note used for PLLSAICLK (SAI clock) - * @rmtoll PLLSAICFGR PLLSAIR LL_RCC_PLLSAI_GetR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIR_DIV_2 - * @arg @ref LL_RCC_PLLSAIR_DIV_3 - * @arg @ref LL_RCC_PLLSAIR_DIV_4 - * @arg @ref LL_RCC_PLLSAIR_DIV_5 - * @arg @ref LL_RCC_PLLSAIR_DIV_6 - * @arg @ref LL_RCC_PLLSAIR_DIV_7 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetR(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIR)); -} -#endif /* RCC_PLLSAICFGR_PLLSAIR */ - -#if defined(RCC_PLLSAICFGR_PLLSAIP) -/** - * @brief Get SAIPLL division factor for PLLSAIP - * @note used for PLL48MCLK (48M domain clock) - * @rmtoll PLLSAICFGR PLLSAIP LL_RCC_PLLSAI_GetP - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIP_DIV_2 - * @arg @ref LL_RCC_PLLSAIP_DIV_4 - * @arg @ref LL_RCC_PLLSAIP_DIV_6 - * @arg @ref LL_RCC_PLLSAIP_DIV_8 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetP(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIP)); -} -#endif /* RCC_PLLSAICFGR_PLLSAIP */ - -/** - * @brief Get SAIPLL division factor for PLLSAIDIVQ - * @note used PLLSAICLK selected (SAI clock) - * @rmtoll DCKCFGR PLLSAIDIVQ LL_RCC_PLLSAI_GetDIVQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDIVQ(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ)); -} - -#if defined(RCC_DCKCFGR_PLLSAIDIVR) -/** - * @brief Get SAIPLL division factor for PLLSAIDIVR - * @note used for LTDC domain clock - * @rmtoll DCKCFGR PLLSAIDIVR LL_RCC_PLLSAI_GetDIVR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDIVR(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR)); -} -#endif /* RCC_DCKCFGR_PLLSAIDIVR */ - -/** - * @} - */ -#endif /* RCC_PLLSAI_SUPPORT */ - -/** @defgroup RCC_LL_EF_FLAG_Management FLAG Management - * @{ - */ - -/** - * @brief Clear LSI ready interrupt flag - * @rmtoll CIR LSIRDYC LL_RCC_ClearFlag_LSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_LSIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC); -} - -/** - * @brief Clear LSE ready interrupt flag - * @rmtoll CIR LSERDYC LL_RCC_ClearFlag_LSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_LSERDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_LSERDYC); -} - -/** - * @brief Clear HSI ready interrupt flag - * @rmtoll CIR HSIRDYC LL_RCC_ClearFlag_HSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_HSIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_HSIRDYC); -} - -/** - * @brief Clear HSE ready interrupt flag - * @rmtoll CIR HSERDYC LL_RCC_ClearFlag_HSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_HSERDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_HSERDYC); -} - -/** - * @brief Clear PLL ready interrupt flag - * @rmtoll CIR PLLRDYC LL_RCC_ClearFlag_PLLRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_PLLRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLRDYC); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Clear PLLI2S ready interrupt flag - * @rmtoll CIR PLLI2SRDYC LL_RCC_ClearFlag_PLLI2SRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_PLLI2SRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Clear PLLSAI ready interrupt flag - * @rmtoll CIR PLLSAIRDYC LL_RCC_ClearFlag_PLLSAIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_PLLSAIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); -} - -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @brief Clear Clock security system interrupt flag - * @rmtoll CIR CSSC LL_RCC_ClearFlag_HSECSS - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_HSECSS(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_CSSC); -} - -/** - * @brief Check if LSI ready interrupt occurred or not - * @rmtoll CIR LSIRDYF LL_RCC_IsActiveFlag_LSIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LSIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_LSIRDYF) == (RCC_CIR_LSIRDYF)); -} - -/** - * @brief Check if LSE ready interrupt occurred or not - * @rmtoll CIR LSERDYF LL_RCC_IsActiveFlag_LSERDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LSERDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_LSERDYF) == (RCC_CIR_LSERDYF)); -} - -/** - * @brief Check if HSI ready interrupt occurred or not - * @rmtoll CIR HSIRDYF LL_RCC_IsActiveFlag_HSIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_HSIRDYF) == (RCC_CIR_HSIRDYF)); -} - -/** - * @brief Check if HSE ready interrupt occurred or not - * @rmtoll CIR HSERDYF LL_RCC_IsActiveFlag_HSERDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSERDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_HSERDYF) == (RCC_CIR_HSERDYF)); -} - -/** - * @brief Check if PLL ready interrupt occurred or not - * @rmtoll CIR PLLRDYF LL_RCC_IsActiveFlag_PLLRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLRDYF) == (RCC_CIR_PLLRDYF)); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Check if PLLI2S ready interrupt occurred or not - * @rmtoll CIR PLLI2SRDYF LL_RCC_IsActiveFlag_PLLI2SRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLI2SRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYF) == (RCC_CIR_PLLI2SRDYF)); -} -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Check if PLLSAI ready interrupt occurred or not - * @rmtoll CIR PLLSAIRDYF LL_RCC_IsActiveFlag_PLLSAIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLSAIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYF) == (RCC_CIR_PLLSAIRDYF)); -} -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @brief Check if Clock security system interrupt occurred or not - * @rmtoll CIR CSSF LL_RCC_IsActiveFlag_HSECSS - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSECSS(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_CSSF) == (RCC_CIR_CSSF)); -} - -/** - * @brief Check if RCC flag Independent Watchdog reset is set or not. - * @rmtoll CSR IWDGRSTF LL_RCC_IsActiveFlag_IWDGRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_IWDGRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_IWDGRSTF) == (RCC_CSR_IWDGRSTF)); -} - -/** - * @brief Check if RCC flag Low Power reset is set or not. - * @rmtoll CSR LPWRRSTF LL_RCC_IsActiveFlag_LPWRRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LPWRRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_LPWRRSTF) == (RCC_CSR_LPWRRSTF)); -} - -/** - * @brief Check if RCC flag Pin reset is set or not. - * @rmtoll CSR PINRSTF LL_RCC_IsActiveFlag_PINRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PINRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_PINRSTF) == (RCC_CSR_PINRSTF)); -} - -/** - * @brief Check if RCC flag POR/PDR reset is set or not. - * @rmtoll CSR PORRSTF LL_RCC_IsActiveFlag_PORRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PORRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_PORRSTF) == (RCC_CSR_PORRSTF)); -} - -/** - * @brief Check if RCC flag Software reset is set or not. - * @rmtoll CSR SFTRSTF LL_RCC_IsActiveFlag_SFTRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_SFTRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_SFTRSTF) == (RCC_CSR_SFTRSTF)); -} - -/** - * @brief Check if RCC flag Window Watchdog reset is set or not. - * @rmtoll CSR WWDGRSTF LL_RCC_IsActiveFlag_WWDGRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_WWDGRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_WWDGRSTF) == (RCC_CSR_WWDGRSTF)); -} - -#if defined(RCC_CSR_BORRSTF) -/** - * @brief Check if RCC flag BOR reset is set or not. - * @rmtoll CSR BORRSTF LL_RCC_IsActiveFlag_BORRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_BORRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_BORRSTF) == (RCC_CSR_BORRSTF)); -} -#endif /* RCC_CSR_BORRSTF */ - -/** - * @brief Set RMVF bit to clear the reset flags. - * @rmtoll CSR RMVF LL_RCC_ClearResetFlags - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearResetFlags(void) -{ - SET_BIT(RCC->CSR, RCC_CSR_RMVF); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_IT_Management IT Management - * @{ - */ - -/** - * @brief Enable LSI ready interrupt - * @rmtoll CIR LSIRDYIE LL_RCC_EnableIT_LSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_LSIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_LSIRDYIE); -} - -/** - * @brief Enable LSE ready interrupt - * @rmtoll CIR LSERDYIE LL_RCC_EnableIT_LSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_LSERDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_LSERDYIE); -} - -/** - * @brief Enable HSI ready interrupt - * @rmtoll CIR HSIRDYIE LL_RCC_EnableIT_HSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_HSIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_HSIRDYIE); -} - -/** - * @brief Enable HSE ready interrupt - * @rmtoll CIR HSERDYIE LL_RCC_EnableIT_HSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_HSERDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_HSERDYIE); -} - -/** - * @brief Enable PLL ready interrupt - * @rmtoll CIR PLLRDYIE LL_RCC_EnableIT_PLLRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_PLLRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLRDYIE); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Enable PLLI2S ready interrupt - * @rmtoll CIR PLLI2SRDYIE LL_RCC_EnableIT_PLLI2SRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_PLLI2SRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); -} -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Enable PLLSAI ready interrupt - * @rmtoll CIR PLLSAIRDYIE LL_RCC_EnableIT_PLLSAIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_PLLSAIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); -} -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @brief Disable LSI ready interrupt - * @rmtoll CIR LSIRDYIE LL_RCC_DisableIT_LSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_LSIRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE); -} - -/** - * @brief Disable LSE ready interrupt - * @rmtoll CIR LSERDYIE LL_RCC_DisableIT_LSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_LSERDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_LSERDYIE); -} - -/** - * @brief Disable HSI ready interrupt - * @rmtoll CIR HSIRDYIE LL_RCC_DisableIT_HSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_HSIRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_HSIRDYIE); -} - -/** - * @brief Disable HSE ready interrupt - * @rmtoll CIR HSERDYIE LL_RCC_DisableIT_HSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_HSERDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_HSERDYIE); -} - -/** - * @brief Disable PLL ready interrupt - * @rmtoll CIR PLLRDYIE LL_RCC_DisableIT_PLLRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_PLLRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLRDYIE); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Disable PLLI2S ready interrupt - * @rmtoll CIR PLLI2SRDYIE LL_RCC_DisableIT_PLLI2SRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_PLLI2SRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Disable PLLSAI ready interrupt - * @rmtoll CIR PLLSAIRDYIE LL_RCC_DisableIT_PLLSAIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_PLLSAIRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); -} -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @brief Checks if LSI ready interrupt source is enabled or disabled. - * @rmtoll CIR LSIRDYIE LL_RCC_IsEnabledIT_LSIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_LSIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_LSIRDYIE) == (RCC_CIR_LSIRDYIE)); -} - -/** - * @brief Checks if LSE ready interrupt source is enabled or disabled. - * @rmtoll CIR LSERDYIE LL_RCC_IsEnabledIT_LSERDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_LSERDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_LSERDYIE) == (RCC_CIR_LSERDYIE)); -} - -/** - * @brief Checks if HSI ready interrupt source is enabled or disabled. - * @rmtoll CIR HSIRDYIE LL_RCC_IsEnabledIT_HSIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_HSIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_HSIRDYIE) == (RCC_CIR_HSIRDYIE)); -} - -/** - * @brief Checks if HSE ready interrupt source is enabled or disabled. - * @rmtoll CIR HSERDYIE LL_RCC_IsEnabledIT_HSERDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_HSERDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_HSERDYIE) == (RCC_CIR_HSERDYIE)); -} - -/** - * @brief Checks if PLL ready interrupt source is enabled or disabled. - * @rmtoll CIR PLLRDYIE LL_RCC_IsEnabledIT_PLLRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLRDYIE) == (RCC_CIR_PLLRDYIE)); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Checks if PLLI2S ready interrupt source is enabled or disabled. - * @rmtoll CIR PLLI2SRDYIE LL_RCC_IsEnabledIT_PLLI2SRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLI2SRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE) == (RCC_CIR_PLLI2SRDYIE)); -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Checks if PLLSAI ready interrupt source is enabled or disabled. - * @rmtoll CIR PLLSAIRDYIE LL_RCC_IsEnabledIT_PLLSAIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLSAIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE) == (RCC_CIR_PLLSAIRDYIE)); -} -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup RCC_LL_EF_Init De-initialization function - * @{ - */ -ErrorStatus LL_RCC_DeInit(void); -/** - * @} - */ - -/** @defgroup RCC_LL_EF_Get_Freq Get system and peripherals clocks frequency functions - * @{ - */ -void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks); -#if defined(FMPI2C1) -uint32_t LL_RCC_GetFMPI2CClockFreq(uint32_t FMPI2CxSource); -#endif /* FMPI2C1 */ -#if defined(LPTIM1) -uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource); -#endif /* LPTIM1 */ -#if defined(SAI1) -uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource); -#endif /* SAI1 */ -#if defined(SDIO) -uint32_t LL_RCC_GetSDIOClockFreq(uint32_t SDIOxSource); -#endif /* SDIO */ -#if defined(RNG) -uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource); -#endif /* RNG */ -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource); -#endif /* USB_OTG_FS || USB_OTG_HS */ -#if defined(DFSDM1_Channel0) -uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource); -uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource); -#endif /* DFSDM1_Channel0 */ -uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource); -#if defined(CEC) -uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource); -#endif /* CEC */ -#if defined(LTDC) -uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource); -#endif /* LTDC */ -#if defined(SPDIFRX) -uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource); -#endif /* SPDIFRX */ -#if defined(DSI) -uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource); -#endif /* DSI */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined(RCC) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_RCC_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h deleted file mode 100644 index 371383e..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h +++ /dev/null @@ -1,2027 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_spi.h - * @author MCD Application Team - * @brief Header file of SPI LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_LL_SPI_H -#define STM32F4xx_LL_SPI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (SPI1) || defined (SPI2) || defined (SPI3) || defined (SPI4) || defined (SPI5) || defined(SPI6) - -/** @defgroup SPI_LL SPI - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup SPI_LL_ES_INIT SPI Exported Init structure - * @{ - */ - -/** - * @brief SPI Init structures definition - */ -typedef struct -{ - uint32_t TransferDirection; /*!< Specifies the SPI unidirectional or bidirectional data mode. - This parameter can be a value of @ref SPI_LL_EC_TRANSFER_MODE. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetTransferDirection().*/ - - uint32_t Mode; /*!< Specifies the SPI mode (Master/Slave). - This parameter can be a value of @ref SPI_LL_EC_MODE. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetMode().*/ - - uint32_t DataWidth; /*!< Specifies the SPI data width. - This parameter can be a value of @ref SPI_LL_EC_DATAWIDTH. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetDataWidth().*/ - - uint32_t ClockPolarity; /*!< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_LL_EC_POLARITY. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetClockPolarity().*/ - - uint32_t ClockPhase; /*!< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_LL_EC_PHASE. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetClockPhase().*/ - - uint32_t NSS; /*!< Specifies whether the NSS signal is managed by hardware (NSS pin) or by software using the SSI bit. - This parameter can be a value of @ref SPI_LL_EC_NSS_MODE. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetNSSMode().*/ - - uint32_t BaudRate; /*!< Specifies the BaudRate prescaler value which will be used to configure the transmit and receive SCK clock. - This parameter can be a value of @ref SPI_LL_EC_BAUDRATEPRESCALER. - @note The communication clock is derived from the master clock. The slave clock does not need to be set. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetBaudRatePrescaler().*/ - - uint32_t BitOrder; /*!< Specifies whether data transfers start from MSB or LSB bit. - This parameter can be a value of @ref SPI_LL_EC_BIT_ORDER. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetTransferBitOrder().*/ - - uint32_t CRCCalculation; /*!< Specifies if the CRC calculation is enabled or not. - This parameter can be a value of @ref SPI_LL_EC_CRC_CALCULATION. - - This feature can be modified afterwards using unitary functions @ref LL_SPI_EnableCRC() and @ref LL_SPI_DisableCRC().*/ - - uint32_t CRCPoly; /*!< Specifies the polynomial used for the CRC calculation. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFFFF. - - This feature can be modified afterwards using unitary function @ref LL_SPI_SetCRCPolynomial().*/ - -} LL_SPI_InitTypeDef; - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SPI_LL_Exported_Constants SPI Exported Constants - * @{ - */ - -/** @defgroup SPI_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_SPI_ReadReg function - * @{ - */ -#define LL_SPI_SR_RXNE SPI_SR_RXNE /*!< Rx buffer not empty flag */ -#define LL_SPI_SR_TXE SPI_SR_TXE /*!< Tx buffer empty flag */ -#define LL_SPI_SR_BSY SPI_SR_BSY /*!< Busy flag */ -#define LL_SPI_SR_CRCERR SPI_SR_CRCERR /*!< CRC error flag */ -#define LL_SPI_SR_MODF SPI_SR_MODF /*!< Mode fault flag */ -#define LL_SPI_SR_OVR SPI_SR_OVR /*!< Overrun flag */ -#define LL_SPI_SR_FRE SPI_SR_FRE /*!< TI mode frame format error flag */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions - * @{ - */ -#define LL_SPI_CR2_RXNEIE SPI_CR2_RXNEIE /*!< Rx buffer not empty interrupt enable */ -#define LL_SPI_CR2_TXEIE SPI_CR2_TXEIE /*!< Tx buffer empty interrupt enable */ -#define LL_SPI_CR2_ERRIE SPI_CR2_ERRIE /*!< Error interrupt enable */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_MODE Operation Mode - * @{ - */ -#define LL_SPI_MODE_MASTER (SPI_CR1_MSTR | SPI_CR1_SSI) /*!< Master configuration */ -#define LL_SPI_MODE_SLAVE 0x00000000U /*!< Slave configuration */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_PROTOCOL Serial Protocol - * @{ - */ -#define LL_SPI_PROTOCOL_MOTOROLA 0x00000000U /*!< Motorola mode. Used as default value */ -#define LL_SPI_PROTOCOL_TI (SPI_CR2_FRF) /*!< TI mode */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_PHASE Clock Phase - * @{ - */ -#define LL_SPI_PHASE_1EDGE 0x00000000U /*!< First clock transition is the first data capture edge */ -#define LL_SPI_PHASE_2EDGE (SPI_CR1_CPHA) /*!< Second clock transition is the first data capture edge */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_POLARITY Clock Polarity - * @{ - */ -#define LL_SPI_POLARITY_LOW 0x00000000U /*!< Clock to 0 when idle */ -#define LL_SPI_POLARITY_HIGH (SPI_CR1_CPOL) /*!< Clock to 1 when idle */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_BAUDRATEPRESCALER Baud Rate Prescaler - * @{ - */ -#define LL_SPI_BAUDRATEPRESCALER_DIV2 0x00000000U /*!< BaudRate control equal to fPCLK/2 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV4 (SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/4 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV8 (SPI_CR1_BR_1) /*!< BaudRate control equal to fPCLK/8 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV16 (SPI_CR1_BR_1 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/16 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV32 (SPI_CR1_BR_2) /*!< BaudRate control equal to fPCLK/32 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV64 (SPI_CR1_BR_2 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/64 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV128 (SPI_CR1_BR_2 | SPI_CR1_BR_1) /*!< BaudRate control equal to fPCLK/128 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV256 (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/256 */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_BIT_ORDER Transmission Bit Order - * @{ - */ -#define LL_SPI_LSB_FIRST (SPI_CR1_LSBFIRST) /*!< Data is transmitted/received with the LSB first */ -#define LL_SPI_MSB_FIRST 0x00000000U /*!< Data is transmitted/received with the MSB first */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_TRANSFER_MODE Transfer Mode - * @{ - */ -#define LL_SPI_FULL_DUPLEX 0x00000000U /*!< Full-Duplex mode. Rx and Tx transfer on 2 lines */ -#define LL_SPI_SIMPLEX_RX (SPI_CR1_RXONLY) /*!< Simplex Rx mode. Rx transfer only on 1 line */ -#define LL_SPI_HALF_DUPLEX_RX (SPI_CR1_BIDIMODE) /*!< Half-Duplex Rx mode. Rx transfer on 1 line */ -#define LL_SPI_HALF_DUPLEX_TX (SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE) /*!< Half-Duplex Tx mode. Tx transfer on 1 line */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_NSS_MODE Slave Select Pin Mode - * @{ - */ -#define LL_SPI_NSS_SOFT (SPI_CR1_SSM) /*!< NSS managed internally. NSS pin not used and free */ -#define LL_SPI_NSS_HARD_INPUT 0x00000000U /*!< NSS pin used in Input. Only used in Master mode */ -#define LL_SPI_NSS_HARD_OUTPUT (((uint32_t)SPI_CR2_SSOE << 16U)) /*!< NSS pin used in Output. Only used in Slave mode as chip select */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_DATAWIDTH Datawidth - * @{ - */ -#define LL_SPI_DATAWIDTH_8BIT 0x00000000U /*!< Data length for SPI transfer: 8 bits */ -#define LL_SPI_DATAWIDTH_16BIT (SPI_CR1_DFF) /*!< Data length for SPI transfer: 16 bits */ -/** - * @} - */ -#if defined(USE_FULL_LL_DRIVER) - -/** @defgroup SPI_LL_EC_CRC_CALCULATION CRC Calculation - * @{ - */ -#define LL_SPI_CRCCALCULATION_DISABLE 0x00000000U /*!< CRC calculation disabled */ -#define LL_SPI_CRCCALCULATION_ENABLE (SPI_CR1_CRCEN) /*!< CRC calculation enabled */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup SPI_LL_Exported_Macros SPI Exported Macros - * @{ - */ - -/** @defgroup SPI_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in SPI register - * @param __INSTANCE__ SPI Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_SPI_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in SPI register - * @param __INSTANCE__ SPI Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_SPI_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SPI_LL_Exported_Functions SPI Exported Functions - * @{ - */ - -/** @defgroup SPI_LL_EF_Configuration Configuration - * @{ - */ - -/** - * @brief Enable SPI peripheral - * @rmtoll CR1 SPE LL_SPI_Enable - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_Enable(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR1, SPI_CR1_SPE); -} - -/** - * @brief Disable SPI peripheral - * @note When disabling the SPI, follow the procedure described in the Reference Manual. - * @rmtoll CR1 SPE LL_SPI_Disable - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_Disable(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR1, SPI_CR1_SPE); -} - -/** - * @brief Check if SPI peripheral is enabled - * @rmtoll CR1 SPE LL_SPI_IsEnabled - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabled(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR1, SPI_CR1_SPE) == (SPI_CR1_SPE)) ? 1UL : 0UL); -} - -/** - * @brief Set SPI operation mode to Master or Slave - * @note This bit should not be changed when communication is ongoing. - * @rmtoll CR1 MSTR LL_SPI_SetMode\n - * CR1 SSI LL_SPI_SetMode - * @param SPIx SPI Instance - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_SPI_MODE_MASTER - * @arg @ref LL_SPI_MODE_SLAVE - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetMode(SPI_TypeDef *SPIx, uint32_t Mode) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_MSTR | SPI_CR1_SSI, Mode); -} - -/** - * @brief Get SPI operation mode (Master or Slave) - * @rmtoll CR1 MSTR LL_SPI_GetMode\n - * CR1 SSI LL_SPI_GetMode - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_MODE_MASTER - * @arg @ref LL_SPI_MODE_SLAVE - */ -__STATIC_INLINE uint32_t LL_SPI_GetMode(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_MSTR | SPI_CR1_SSI)); -} - -/** - * @brief Set serial protocol used - * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. - * @rmtoll CR2 FRF LL_SPI_SetStandard - * @param SPIx SPI Instance - * @param Standard This parameter can be one of the following values: - * @arg @ref LL_SPI_PROTOCOL_MOTOROLA - * @arg @ref LL_SPI_PROTOCOL_TI - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetStandard(SPI_TypeDef *SPIx, uint32_t Standard) -{ - MODIFY_REG(SPIx->CR2, SPI_CR2_FRF, Standard); -} - -/** - * @brief Get serial protocol used - * @rmtoll CR2 FRF LL_SPI_GetStandard - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_PROTOCOL_MOTOROLA - * @arg @ref LL_SPI_PROTOCOL_TI - */ -__STATIC_INLINE uint32_t LL_SPI_GetStandard(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_FRF)); -} - -/** - * @brief Set clock phase - * @note This bit should not be changed when communication is ongoing. - * This bit is not used in SPI TI mode. - * @rmtoll CR1 CPHA LL_SPI_SetClockPhase - * @param SPIx SPI Instance - * @param ClockPhase This parameter can be one of the following values: - * @arg @ref LL_SPI_PHASE_1EDGE - * @arg @ref LL_SPI_PHASE_2EDGE - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetClockPhase(SPI_TypeDef *SPIx, uint32_t ClockPhase) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_CPHA, ClockPhase); -} - -/** - * @brief Get clock phase - * @rmtoll CR1 CPHA LL_SPI_GetClockPhase - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_PHASE_1EDGE - * @arg @ref LL_SPI_PHASE_2EDGE - */ -__STATIC_INLINE uint32_t LL_SPI_GetClockPhase(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPHA)); -} - -/** - * @brief Set clock polarity - * @note This bit should not be changed when communication is ongoing. - * This bit is not used in SPI TI mode. - * @rmtoll CR1 CPOL LL_SPI_SetClockPolarity - * @param SPIx SPI Instance - * @param ClockPolarity This parameter can be one of the following values: - * @arg @ref LL_SPI_POLARITY_LOW - * @arg @ref LL_SPI_POLARITY_HIGH - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetClockPolarity(SPI_TypeDef *SPIx, uint32_t ClockPolarity) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_CPOL, ClockPolarity); -} - -/** - * @brief Get clock polarity - * @rmtoll CR1 CPOL LL_SPI_GetClockPolarity - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_POLARITY_LOW - * @arg @ref LL_SPI_POLARITY_HIGH - */ -__STATIC_INLINE uint32_t LL_SPI_GetClockPolarity(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPOL)); -} - -/** - * @brief Set baud rate prescaler - * @note These bits should not be changed when communication is ongoing. SPI BaudRate = fPCLK/Prescaler. - * @rmtoll CR1 BR LL_SPI_SetBaudRatePrescaler - * @param SPIx SPI Instance - * @param BaudRate This parameter can be one of the following values: - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV2 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV4 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV8 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV16 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV32 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV64 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV128 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV256 - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetBaudRatePrescaler(SPI_TypeDef *SPIx, uint32_t BaudRate) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_BR, BaudRate); -} - -/** - * @brief Get baud rate prescaler - * @rmtoll CR1 BR LL_SPI_GetBaudRatePrescaler - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV2 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV4 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV8 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV16 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV32 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV64 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV128 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV256 - */ -__STATIC_INLINE uint32_t LL_SPI_GetBaudRatePrescaler(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_BR)); -} - -/** - * @brief Set transfer bit order - * @note This bit should not be changed when communication is ongoing. This bit is not used in SPI TI mode. - * @rmtoll CR1 LSBFIRST LL_SPI_SetTransferBitOrder - * @param SPIx SPI Instance - * @param BitOrder This parameter can be one of the following values: - * @arg @ref LL_SPI_LSB_FIRST - * @arg @ref LL_SPI_MSB_FIRST - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetTransferBitOrder(SPI_TypeDef *SPIx, uint32_t BitOrder) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_LSBFIRST, BitOrder); -} - -/** - * @brief Get transfer bit order - * @rmtoll CR1 LSBFIRST LL_SPI_GetTransferBitOrder - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_LSB_FIRST - * @arg @ref LL_SPI_MSB_FIRST - */ -__STATIC_INLINE uint32_t LL_SPI_GetTransferBitOrder(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_LSBFIRST)); -} - -/** - * @brief Set transfer direction mode - * @note For Half-Duplex mode, Rx Direction is set by default. - * In master mode, the MOSI pin is used and in slave mode, the MISO pin is used for Half-Duplex. - * @rmtoll CR1 RXONLY LL_SPI_SetTransferDirection\n - * CR1 BIDIMODE LL_SPI_SetTransferDirection\n - * CR1 BIDIOE LL_SPI_SetTransferDirection - * @param SPIx SPI Instance - * @param TransferDirection This parameter can be one of the following values: - * @arg @ref LL_SPI_FULL_DUPLEX - * @arg @ref LL_SPI_SIMPLEX_RX - * @arg @ref LL_SPI_HALF_DUPLEX_RX - * @arg @ref LL_SPI_HALF_DUPLEX_TX - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetTransferDirection(SPI_TypeDef *SPIx, uint32_t TransferDirection) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE, TransferDirection); -} - -/** - * @brief Get transfer direction mode - * @rmtoll CR1 RXONLY LL_SPI_GetTransferDirection\n - * CR1 BIDIMODE LL_SPI_GetTransferDirection\n - * CR1 BIDIOE LL_SPI_GetTransferDirection - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_FULL_DUPLEX - * @arg @ref LL_SPI_SIMPLEX_RX - * @arg @ref LL_SPI_HALF_DUPLEX_RX - * @arg @ref LL_SPI_HALF_DUPLEX_TX - */ -__STATIC_INLINE uint32_t LL_SPI_GetTransferDirection(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE)); -} - -/** - * @brief Set frame data width - * @rmtoll CR1 DFF LL_SPI_SetDataWidth - * @param SPIx SPI Instance - * @param DataWidth This parameter can be one of the following values: - * @arg @ref LL_SPI_DATAWIDTH_8BIT - * @arg @ref LL_SPI_DATAWIDTH_16BIT - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetDataWidth(SPI_TypeDef *SPIx, uint32_t DataWidth) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_DFF, DataWidth); -} - -/** - * @brief Get frame data width - * @rmtoll CR1 DFF LL_SPI_GetDataWidth - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_DATAWIDTH_8BIT - * @arg @ref LL_SPI_DATAWIDTH_16BIT - */ -__STATIC_INLINE uint32_t LL_SPI_GetDataWidth(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_DFF)); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_CRC_Management CRC Management - * @{ - */ - -/** - * @brief Enable CRC - * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. - * @rmtoll CR1 CRCEN LL_SPI_EnableCRC - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableCRC(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR1, SPI_CR1_CRCEN); -} - -/** - * @brief Disable CRC - * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. - * @rmtoll CR1 CRCEN LL_SPI_DisableCRC - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableCRC(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR1, SPI_CR1_CRCEN); -} - -/** - * @brief Check if CRC is enabled - * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. - * @rmtoll CR1 CRCEN LL_SPI_IsEnabledCRC - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledCRC(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR1, SPI_CR1_CRCEN) == (SPI_CR1_CRCEN)) ? 1UL : 0UL); -} - -/** - * @brief Set CRCNext to transfer CRC on the line - * @note This bit has to be written as soon as the last data is written in the SPIx_DR register. - * @rmtoll CR1 CRCNEXT LL_SPI_SetCRCNext - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetCRCNext(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR1, SPI_CR1_CRCNEXT); -} - -/** - * @brief Set polynomial for CRC calculation - * @rmtoll CRCPR CRCPOLY LL_SPI_SetCRCPolynomial - * @param SPIx SPI Instance - * @param CRCPoly This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFFFF - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetCRCPolynomial(SPI_TypeDef *SPIx, uint32_t CRCPoly) -{ - WRITE_REG(SPIx->CRCPR, (uint16_t)CRCPoly); -} - -/** - * @brief Get polynomial for CRC calculation - * @rmtoll CRCPR CRCPOLY LL_SPI_GetCRCPolynomial - * @param SPIx SPI Instance - * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF - */ -__STATIC_INLINE uint32_t LL_SPI_GetCRCPolynomial(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->CRCPR)); -} - -/** - * @brief Get Rx CRC - * @rmtoll RXCRCR RXCRC LL_SPI_GetRxCRC - * @param SPIx SPI Instance - * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF - */ -__STATIC_INLINE uint32_t LL_SPI_GetRxCRC(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->RXCRCR)); -} - -/** - * @brief Get Tx CRC - * @rmtoll TXCRCR TXCRC LL_SPI_GetTxCRC - * @param SPIx SPI Instance - * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF - */ -__STATIC_INLINE uint32_t LL_SPI_GetTxCRC(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->TXCRCR)); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_NSS_Management Slave Select Pin Management - * @{ - */ - -/** - * @brief Set NSS mode - * @note LL_SPI_NSS_SOFT Mode is not used in SPI TI mode. - * @rmtoll CR1 SSM LL_SPI_SetNSSMode\n - * @rmtoll CR2 SSOE LL_SPI_SetNSSMode - * @param SPIx SPI Instance - * @param NSS This parameter can be one of the following values: - * @arg @ref LL_SPI_NSS_SOFT - * @arg @ref LL_SPI_NSS_HARD_INPUT - * @arg @ref LL_SPI_NSS_HARD_OUTPUT - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetNSSMode(SPI_TypeDef *SPIx, uint32_t NSS) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_SSM, NSS); - MODIFY_REG(SPIx->CR2, SPI_CR2_SSOE, ((uint32_t)(NSS >> 16U))); -} - -/** - * @brief Get NSS mode - * @rmtoll CR1 SSM LL_SPI_GetNSSMode\n - * @rmtoll CR2 SSOE LL_SPI_GetNSSMode - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_NSS_SOFT - * @arg @ref LL_SPI_NSS_HARD_INPUT - * @arg @ref LL_SPI_NSS_HARD_OUTPUT - */ -__STATIC_INLINE uint32_t LL_SPI_GetNSSMode(const SPI_TypeDef *SPIx) -{ - uint32_t Ssm = (READ_BIT(SPIx->CR1, SPI_CR1_SSM)); - uint32_t Ssoe = (READ_BIT(SPIx->CR2, SPI_CR2_SSOE) << 16U); - return (Ssm | Ssoe); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_FLAG_Management FLAG Management - * @{ - */ - -/** - * @brief Check if Rx buffer is not empty - * @rmtoll SR RXNE LL_SPI_IsActiveFlag_RXNE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_RXNE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_RXNE) == (SPI_SR_RXNE)) ? 1UL : 0UL); -} - -/** - * @brief Check if Tx buffer is empty - * @rmtoll SR TXE LL_SPI_IsActiveFlag_TXE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_TXE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_TXE) == (SPI_SR_TXE)) ? 1UL : 0UL); -} - -/** - * @brief Get CRC error flag - * @rmtoll SR CRCERR LL_SPI_IsActiveFlag_CRCERR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_CRCERR(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_CRCERR) == (SPI_SR_CRCERR)) ? 1UL : 0UL); -} - -/** - * @brief Get mode fault error flag - * @rmtoll SR MODF LL_SPI_IsActiveFlag_MODF - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_MODF(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_MODF) == (SPI_SR_MODF)) ? 1UL : 0UL); -} - -/** - * @brief Get overrun error flag - * @rmtoll SR OVR LL_SPI_IsActiveFlag_OVR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_OVR(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_OVR) == (SPI_SR_OVR)) ? 1UL : 0UL); -} - -/** - * @brief Get busy flag - * @note The BSY flag is cleared under any one of the following conditions: - * -When the SPI is correctly disabled - * -When a fault is detected in Master mode (MODF bit set to 1) - * -In Master mode, when it finishes a data transmission and no new data is ready to be - * sent - * -In Slave mode, when the BSY flag is set to '0' for at least one SPI clock cycle between - * each data transfer. - * @rmtoll SR BSY LL_SPI_IsActiveFlag_BSY - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_BSY(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_BSY) == (SPI_SR_BSY)) ? 1UL : 0UL); -} - -/** - * @brief Get frame format error flag - * @rmtoll SR FRE LL_SPI_IsActiveFlag_FRE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_FRE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_FRE) == (SPI_SR_FRE)) ? 1UL : 0UL); -} - -/** - * @brief Clear CRC error flag - * @rmtoll SR CRCERR LL_SPI_ClearFlag_CRCERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_ClearFlag_CRCERR(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->SR, SPI_SR_CRCERR); -} - -/** - * @brief Clear mode fault error flag - * @note Clearing this flag is done by a read access to the SPIx_SR - * register followed by a write access to the SPIx_CR1 register - * @rmtoll SR MODF LL_SPI_ClearFlag_MODF - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_ClearFlag_MODF(SPI_TypeDef *SPIx) -{ - __IO uint32_t tmpreg_sr; - tmpreg_sr = SPIx->SR; - (void) tmpreg_sr; - CLEAR_BIT(SPIx->CR1, SPI_CR1_SPE); -} - -/** - * @brief Clear overrun error flag - * @note Clearing this flag is done by a read access to the SPIx_DR - * register followed by a read access to the SPIx_SR register - * @rmtoll SR OVR LL_SPI_ClearFlag_OVR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_ClearFlag_OVR(SPI_TypeDef *SPIx) -{ - __IO uint32_t tmpreg; - tmpreg = SPIx->DR; - (void) tmpreg; - tmpreg = SPIx->SR; - (void) tmpreg; -} - -/** - * @brief Clear frame format error flag - * @note Clearing this flag is done by reading SPIx_SR register - * @rmtoll SR FRE LL_SPI_ClearFlag_FRE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_ClearFlag_FRE(SPI_TypeDef *SPIx) -{ - __IO uint32_t tmpreg; - tmpreg = SPIx->SR; - (void) tmpreg; -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_IT_Management Interrupt Management - * @{ - */ - -/** - * @brief Enable error interrupt - * @note This bit controls the generation of an interrupt when an error condition occurs (CRCERR, OVR, MODF in SPI mode, FRE at TI mode). - * @rmtoll CR2 ERRIE LL_SPI_EnableIT_ERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableIT_ERR(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_ERRIE); -} - -/** - * @brief Enable Rx buffer not empty interrupt - * @rmtoll CR2 RXNEIE LL_SPI_EnableIT_RXNE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableIT_RXNE(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_RXNEIE); -} - -/** - * @brief Enable Tx buffer empty interrupt - * @rmtoll CR2 TXEIE LL_SPI_EnableIT_TXE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableIT_TXE(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_TXEIE); -} - -/** - * @brief Disable error interrupt - * @note This bit controls the generation of an interrupt when an error condition occurs (CRCERR, OVR, MODF in SPI mode, FRE at TI mode). - * @rmtoll CR2 ERRIE LL_SPI_DisableIT_ERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableIT_ERR(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_ERRIE); -} - -/** - * @brief Disable Rx buffer not empty interrupt - * @rmtoll CR2 RXNEIE LL_SPI_DisableIT_RXNE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableIT_RXNE(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_RXNEIE); -} - -/** - * @brief Disable Tx buffer empty interrupt - * @rmtoll CR2 TXEIE LL_SPI_DisableIT_TXE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableIT_TXE(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_TXEIE); -} - -/** - * @brief Check if error interrupt is enabled - * @rmtoll CR2 ERRIE LL_SPI_IsEnabledIT_ERR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_ERR(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_ERRIE) == (SPI_CR2_ERRIE)) ? 1UL : 0UL); -} - -/** - * @brief Check if Rx buffer not empty interrupt is enabled - * @rmtoll CR2 RXNEIE LL_SPI_IsEnabledIT_RXNE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_RXNE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_RXNEIE) == (SPI_CR2_RXNEIE)) ? 1UL : 0UL); -} - -/** - * @brief Check if Tx buffer empty interrupt - * @rmtoll CR2 TXEIE LL_SPI_IsEnabledIT_TXE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_TXE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_TXEIE) == (SPI_CR2_TXEIE)) ? 1UL : 0UL); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_DMA_Management DMA Management - * @{ - */ - -/** - * @brief Enable DMA Rx - * @rmtoll CR2 RXDMAEN LL_SPI_EnableDMAReq_RX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableDMAReq_RX(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_RXDMAEN); -} - -/** - * @brief Disable DMA Rx - * @rmtoll CR2 RXDMAEN LL_SPI_DisableDMAReq_RX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableDMAReq_RX(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_RXDMAEN); -} - -/** - * @brief Check if DMA Rx is enabled - * @rmtoll CR2 RXDMAEN LL_SPI_IsEnabledDMAReq_RX - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledDMAReq_RX(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_RXDMAEN) == (SPI_CR2_RXDMAEN)) ? 1UL : 0UL); -} - -/** - * @brief Enable DMA Tx - * @rmtoll CR2 TXDMAEN LL_SPI_EnableDMAReq_TX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableDMAReq_TX(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_TXDMAEN); -} - -/** - * @brief Disable DMA Tx - * @rmtoll CR2 TXDMAEN LL_SPI_DisableDMAReq_TX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableDMAReq_TX(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_TXDMAEN); -} - -/** - * @brief Check if DMA Tx is enabled - * @rmtoll CR2 TXDMAEN LL_SPI_IsEnabledDMAReq_TX - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledDMAReq_TX(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_TXDMAEN) == (SPI_CR2_TXDMAEN)) ? 1UL : 0UL); -} - -/** - * @brief Get the data register address used for DMA transfer - * @rmtoll DR DR LL_SPI_DMA_GetRegAddr - * @param SPIx SPI Instance - * @retval Address of data register - */ -__STATIC_INLINE uint32_t LL_SPI_DMA_GetRegAddr(const SPI_TypeDef *SPIx) -{ - return (uint32_t) &(SPIx->DR); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_DATA_Management DATA Management - * @{ - */ - -/** - * @brief Read 8-Bits in the data register - * @rmtoll DR DR LL_SPI_ReceiveData8 - * @param SPIx SPI Instance - * @retval RxData Value between Min_Data=0x00 and Max_Data=0xFF - */ -__STATIC_INLINE uint8_t LL_SPI_ReceiveData8(SPI_TypeDef *SPIx) -{ - return (*((__IO uint8_t *)&SPIx->DR)); -} - -/** - * @brief Read 16-Bits in the data register - * @rmtoll DR DR LL_SPI_ReceiveData16 - * @param SPIx SPI Instance - * @retval RxData Value between Min_Data=0x00 and Max_Data=0xFFFF - */ -__STATIC_INLINE uint16_t LL_SPI_ReceiveData16(SPI_TypeDef *SPIx) -{ - return (uint16_t)(READ_REG(SPIx->DR)); -} - -/** - * @brief Write 8-Bits in the data register - * @rmtoll DR DR LL_SPI_TransmitData8 - * @param SPIx SPI Instance - * @param TxData Value between Min_Data=0x00 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_SPI_TransmitData8(SPI_TypeDef *SPIx, uint8_t TxData) -{ -#if defined (__GNUC__) - __IO uint8_t *spidr = ((__IO uint8_t *)&SPIx->DR); - *spidr = TxData; -#else - *((__IO uint8_t *)&SPIx->DR) = TxData; -#endif /* __GNUC__ */ -} - -/** - * @brief Write 16-Bits in the data register - * @rmtoll DR DR LL_SPI_TransmitData16 - * @param SPIx SPI Instance - * @param TxData Value between Min_Data=0x00 and Max_Data=0xFFFF - * @retval None - */ -__STATIC_INLINE void LL_SPI_TransmitData16(SPI_TypeDef *SPIx, uint16_t TxData) -{ -#if defined (__GNUC__) - __IO uint16_t *spidr = ((__IO uint16_t *)&SPIx->DR); - *spidr = TxData; -#else - SPIx->DR = TxData; -#endif /* __GNUC__ */ -} - -/** - * @} - */ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup SPI_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -ErrorStatus LL_SPI_DeInit(const SPI_TypeDef *SPIx); -ErrorStatus LL_SPI_Init(SPI_TypeDef *SPIx, LL_SPI_InitTypeDef *SPI_InitStruct); -void LL_SPI_StructInit(LL_SPI_InitTypeDef *SPI_InitStruct); - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup I2S_LL I2S - * @{ - */ - -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2S_LL_ES_INIT I2S Exported Init structure - * @{ - */ - -/** - * @brief I2S Init structure definition - */ - -typedef struct -{ - uint32_t Mode; /*!< Specifies the I2S operating mode. - This parameter can be a value of @ref I2S_LL_EC_MODE - - This feature can be modified afterwards using unitary function @ref LL_I2S_SetTransferMode().*/ - - uint32_t Standard; /*!< Specifies the standard used for the I2S communication. - This parameter can be a value of @ref I2S_LL_EC_STANDARD - - This feature can be modified afterwards using unitary function @ref LL_I2S_SetStandard().*/ - - - uint32_t DataFormat; /*!< Specifies the data format for the I2S communication. - This parameter can be a value of @ref I2S_LL_EC_DATA_FORMAT - - This feature can be modified afterwards using unitary function @ref LL_I2S_SetDataFormat().*/ - - - uint32_t MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. - This parameter can be a value of @ref I2S_LL_EC_MCLK_OUTPUT - - This feature can be modified afterwards using unitary functions @ref LL_I2S_EnableMasterClock() or @ref LL_I2S_DisableMasterClock.*/ - - - uint32_t AudioFreq; /*!< Specifies the frequency selected for the I2S communication. - This parameter can be a value of @ref I2S_LL_EC_AUDIO_FREQ - - Audio Frequency can be modified afterwards using Reference manual formulas to calculate Prescaler Linear, Parity - and unitary functions @ref LL_I2S_SetPrescalerLinear() and @ref LL_I2S_SetPrescalerParity() to set it.*/ - - - uint32_t ClockPolarity; /*!< Specifies the idle state of the I2S clock. - This parameter can be a value of @ref I2S_LL_EC_POLARITY - - This feature can be modified afterwards using unitary function @ref LL_I2S_SetClockPolarity().*/ - -} LL_I2S_InitTypeDef; - -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2S_LL_Exported_Constants I2S Exported Constants - * @{ - */ - -/** @defgroup I2S_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_I2S_ReadReg function - * @{ - */ -#define LL_I2S_SR_RXNE LL_SPI_SR_RXNE /*!< Rx buffer not empty flag */ -#define LL_I2S_SR_TXE LL_SPI_SR_TXE /*!< Tx buffer empty flag */ -#define LL_I2S_SR_BSY LL_SPI_SR_BSY /*!< Busy flag */ -#define LL_I2S_SR_UDR SPI_SR_UDR /*!< Underrun flag */ -#define LL_I2S_SR_OVR LL_SPI_SR_OVR /*!< Overrun flag */ -#define LL_I2S_SR_FRE LL_SPI_SR_FRE /*!< TI mode frame format error flag */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions - * @{ - */ -#define LL_I2S_CR2_RXNEIE LL_SPI_CR2_RXNEIE /*!< Rx buffer not empty interrupt enable */ -#define LL_I2S_CR2_TXEIE LL_SPI_CR2_TXEIE /*!< Tx buffer empty interrupt enable */ -#define LL_I2S_CR2_ERRIE LL_SPI_CR2_ERRIE /*!< Error interrupt enable */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_DATA_FORMAT Data format - * @{ - */ -#define LL_I2S_DATAFORMAT_16B 0x00000000U /*!< Data length 16 bits, Channel length 16bit */ -#define LL_I2S_DATAFORMAT_16B_EXTENDED (SPI_I2SCFGR_CHLEN) /*!< Data length 16 bits, Channel length 32bit */ -#define LL_I2S_DATAFORMAT_24B (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_0) /*!< Data length 24 bits, Channel length 32bit */ -#define LL_I2S_DATAFORMAT_32B (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_1) /*!< Data length 16 bits, Channel length 32bit */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_POLARITY Clock Polarity - * @{ - */ -#define LL_I2S_POLARITY_LOW 0x00000000U /*!< Clock steady state is low level */ -#define LL_I2S_POLARITY_HIGH (SPI_I2SCFGR_CKPOL) /*!< Clock steady state is high level */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_STANDARD I2s Standard - * @{ - */ -#define LL_I2S_STANDARD_PHILIPS 0x00000000U /*!< I2S standard philips */ -#define LL_I2S_STANDARD_MSB (SPI_I2SCFGR_I2SSTD_0) /*!< MSB justified standard (left justified) */ -#define LL_I2S_STANDARD_LSB (SPI_I2SCFGR_I2SSTD_1) /*!< LSB justified standard (right justified) */ -#define LL_I2S_STANDARD_PCM_SHORT (SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1) /*!< PCM standard, short frame synchronization */ -#define LL_I2S_STANDARD_PCM_LONG (SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1 | SPI_I2SCFGR_PCMSYNC) /*!< PCM standard, long frame synchronization */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_MODE Operation Mode - * @{ - */ -#define LL_I2S_MODE_SLAVE_TX 0x00000000U /*!< Slave Tx configuration */ -#define LL_I2S_MODE_SLAVE_RX (SPI_I2SCFGR_I2SCFG_0) /*!< Slave Rx configuration */ -#define LL_I2S_MODE_MASTER_TX (SPI_I2SCFGR_I2SCFG_1) /*!< Master Tx configuration */ -#define LL_I2S_MODE_MASTER_RX (SPI_I2SCFGR_I2SCFG_0 | SPI_I2SCFGR_I2SCFG_1) /*!< Master Rx configuration */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_PRESCALER_FACTOR Prescaler Factor - * @{ - */ -#define LL_I2S_PRESCALER_PARITY_EVEN 0x00000000U /*!< Odd factor: Real divider value is = I2SDIV * 2 */ -#define LL_I2S_PRESCALER_PARITY_ODD (SPI_I2SPR_ODD >> 8U) /*!< Odd factor: Real divider value is = (I2SDIV * 2)+1 */ -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) - -/** @defgroup I2S_LL_EC_MCLK_OUTPUT MCLK Output - * @{ - */ -#define LL_I2S_MCLK_OUTPUT_DISABLE 0x00000000U /*!< Master clock output is disabled */ -#define LL_I2S_MCLK_OUTPUT_ENABLE (SPI_I2SPR_MCKOE) /*!< Master clock output is enabled */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_AUDIO_FREQ Audio Frequency - * @{ - */ - -#define LL_I2S_AUDIOFREQ_192K 192000U /*!< Audio Frequency configuration 192000 Hz */ -#define LL_I2S_AUDIOFREQ_96K 96000U /*!< Audio Frequency configuration 96000 Hz */ -#define LL_I2S_AUDIOFREQ_48K 48000U /*!< Audio Frequency configuration 48000 Hz */ -#define LL_I2S_AUDIOFREQ_44K 44100U /*!< Audio Frequency configuration 44100 Hz */ -#define LL_I2S_AUDIOFREQ_32K 32000U /*!< Audio Frequency configuration 32000 Hz */ -#define LL_I2S_AUDIOFREQ_22K 22050U /*!< Audio Frequency configuration 22050 Hz */ -#define LL_I2S_AUDIOFREQ_16K 16000U /*!< Audio Frequency configuration 16000 Hz */ -#define LL_I2S_AUDIOFREQ_11K 11025U /*!< Audio Frequency configuration 11025 Hz */ -#define LL_I2S_AUDIOFREQ_8K 8000U /*!< Audio Frequency configuration 8000 Hz */ -#define LL_I2S_AUDIOFREQ_DEFAULT 2U /*!< Audio Freq not specified. Register I2SDIV = 2 */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup I2S_LL_Exported_Macros I2S Exported Macros - * @{ - */ - -/** @defgroup I2S_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in I2S register - * @param __INSTANCE__ I2S Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_I2S_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in I2S register - * @param __INSTANCE__ I2S Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_I2S_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** - * @} - */ - - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup I2S_LL_Exported_Functions I2S Exported Functions - * @{ - */ - -/** @defgroup I2S_LL_EF_Configuration Configuration - * @{ - */ - -/** - * @brief Select I2S mode and Enable I2S peripheral - * @rmtoll I2SCFGR I2SMOD LL_I2S_Enable\n - * I2SCFGR I2SE LL_I2S_Enable - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_Enable(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD | SPI_I2SCFGR_I2SE); -} - -/** - * @brief Disable I2S peripheral - * @rmtoll I2SCFGR I2SE LL_I2S_Disable - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_Disable(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD | SPI_I2SCFGR_I2SE); -} - -/** - * @brief Check if I2S peripheral is enabled - * @rmtoll I2SCFGR I2SE LL_I2S_IsEnabled - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabled(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SE) == (SPI_I2SCFGR_I2SE)) ? 1UL : 0UL); -} - -/** - * @brief Set I2S data frame length - * @rmtoll I2SCFGR DATLEN LL_I2S_SetDataFormat\n - * I2SCFGR CHLEN LL_I2S_SetDataFormat - * @param SPIx SPI Instance - * @param DataFormat This parameter can be one of the following values: - * @arg @ref LL_I2S_DATAFORMAT_16B - * @arg @ref LL_I2S_DATAFORMAT_16B_EXTENDED - * @arg @ref LL_I2S_DATAFORMAT_24B - * @arg @ref LL_I2S_DATAFORMAT_32B - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetDataFormat(SPI_TypeDef *SPIx, uint32_t DataFormat) -{ - MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN, DataFormat); -} - -/** - * @brief Get I2S data frame length - * @rmtoll I2SCFGR DATLEN LL_I2S_GetDataFormat\n - * I2SCFGR CHLEN LL_I2S_GetDataFormat - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_DATAFORMAT_16B - * @arg @ref LL_I2S_DATAFORMAT_16B_EXTENDED - * @arg @ref LL_I2S_DATAFORMAT_24B - * @arg @ref LL_I2S_DATAFORMAT_32B - */ -__STATIC_INLINE uint32_t LL_I2S_GetDataFormat(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)); -} - -/** - * @brief Set I2S clock polarity - * @rmtoll I2SCFGR CKPOL LL_I2S_SetClockPolarity - * @param SPIx SPI Instance - * @param ClockPolarity This parameter can be one of the following values: - * @arg @ref LL_I2S_POLARITY_LOW - * @arg @ref LL_I2S_POLARITY_HIGH - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetClockPolarity(SPI_TypeDef *SPIx, uint32_t ClockPolarity) -{ - SET_BIT(SPIx->I2SCFGR, ClockPolarity); -} - -/** - * @brief Get I2S clock polarity - * @rmtoll I2SCFGR CKPOL LL_I2S_GetClockPolarity - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_POLARITY_LOW - * @arg @ref LL_I2S_POLARITY_HIGH - */ -__STATIC_INLINE uint32_t LL_I2S_GetClockPolarity(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_CKPOL)); -} - -/** - * @brief Set I2S standard protocol - * @rmtoll I2SCFGR I2SSTD LL_I2S_SetStandard\n - * I2SCFGR PCMSYNC LL_I2S_SetStandard - * @param SPIx SPI Instance - * @param Standard This parameter can be one of the following values: - * @arg @ref LL_I2S_STANDARD_PHILIPS - * @arg @ref LL_I2S_STANDARD_MSB - * @arg @ref LL_I2S_STANDARD_LSB - * @arg @ref LL_I2S_STANDARD_PCM_SHORT - * @arg @ref LL_I2S_STANDARD_PCM_LONG - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetStandard(SPI_TypeDef *SPIx, uint32_t Standard) -{ - MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC, Standard); -} - -/** - * @brief Get I2S standard protocol - * @rmtoll I2SCFGR I2SSTD LL_I2S_GetStandard\n - * I2SCFGR PCMSYNC LL_I2S_GetStandard - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_STANDARD_PHILIPS - * @arg @ref LL_I2S_STANDARD_MSB - * @arg @ref LL_I2S_STANDARD_LSB - * @arg @ref LL_I2S_STANDARD_PCM_SHORT - * @arg @ref LL_I2S_STANDARD_PCM_LONG - */ -__STATIC_INLINE uint32_t LL_I2S_GetStandard(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC)); -} - -/** - * @brief Set I2S transfer mode - * @rmtoll I2SCFGR I2SCFG LL_I2S_SetTransferMode - * @param SPIx SPI Instance - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_I2S_MODE_SLAVE_TX - * @arg @ref LL_I2S_MODE_SLAVE_RX - * @arg @ref LL_I2S_MODE_MASTER_TX - * @arg @ref LL_I2S_MODE_MASTER_RX - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetTransferMode(SPI_TypeDef *SPIx, uint32_t Mode) -{ - MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_I2SCFG, Mode); -} - -/** - * @brief Get I2S transfer mode - * @rmtoll I2SCFGR I2SCFG LL_I2S_GetTransferMode - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_MODE_SLAVE_TX - * @arg @ref LL_I2S_MODE_SLAVE_RX - * @arg @ref LL_I2S_MODE_MASTER_TX - * @arg @ref LL_I2S_MODE_MASTER_RX - */ -__STATIC_INLINE uint32_t LL_I2S_GetTransferMode(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SCFG)); -} - -/** - * @brief Set I2S linear prescaler - * @rmtoll I2SPR I2SDIV LL_I2S_SetPrescalerLinear - * @param SPIx SPI Instance - * @param PrescalerLinear Value between Min_Data=0x02 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetPrescalerLinear(SPI_TypeDef *SPIx, uint8_t PrescalerLinear) -{ - MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_I2SDIV, PrescalerLinear); -} - -/** - * @brief Get I2S linear prescaler - * @rmtoll I2SPR I2SDIV LL_I2S_GetPrescalerLinear - * @param SPIx SPI Instance - * @retval PrescalerLinear Value between Min_Data=0x02 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_I2S_GetPrescalerLinear(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SPR, SPI_I2SPR_I2SDIV)); -} - -/** - * @brief Set I2S parity prescaler - * @rmtoll I2SPR ODD LL_I2S_SetPrescalerParity - * @param SPIx SPI Instance - * @param PrescalerParity This parameter can be one of the following values: - * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN - * @arg @ref LL_I2S_PRESCALER_PARITY_ODD - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetPrescalerParity(SPI_TypeDef *SPIx, uint32_t PrescalerParity) -{ - MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_ODD, PrescalerParity << 8U); -} - -/** - * @brief Get I2S parity prescaler - * @rmtoll I2SPR ODD LL_I2S_GetPrescalerParity - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN - * @arg @ref LL_I2S_PRESCALER_PARITY_ODD - */ -__STATIC_INLINE uint32_t LL_I2S_GetPrescalerParity(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SPR, SPI_I2SPR_ODD) >> 8U); -} - -/** - * @brief Enable the master clock output (Pin MCK) - * @rmtoll I2SPR MCKOE LL_I2S_EnableMasterClock - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableMasterClock(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE); -} - -/** - * @brief Disable the master clock output (Pin MCK) - * @rmtoll I2SPR MCKOE LL_I2S_DisableMasterClock - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableMasterClock(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE); -} - -/** - * @brief Check if the master clock output (Pin MCK) is enabled - * @rmtoll I2SPR MCKOE LL_I2S_IsEnabledMasterClock - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledMasterClock(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE) == (SPI_I2SPR_MCKOE)) ? 1UL : 0UL); -} - -#if defined(SPI_I2SCFGR_ASTRTEN) -/** - * @brief Enable asynchronous start - * @rmtoll I2SCFGR ASTRTEN LL_I2S_EnableAsyncStart - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableAsyncStart(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN); -} - -/** - * @brief Disable asynchronous start - * @rmtoll I2SCFGR ASTRTEN LL_I2S_DisableAsyncStart - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableAsyncStart(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN); -} - -/** - * @brief Check if asynchronous start is enabled - * @rmtoll I2SCFGR ASTRTEN LL_I2S_IsEnabledAsyncStart - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledAsyncStart(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN) == (SPI_I2SCFGR_ASTRTEN)) ? 1UL : 0UL); -} -#endif /* SPI_I2SCFGR_ASTRTEN */ - -/** - * @} - */ - -/** @defgroup I2S_LL_EF_FLAG FLAG Management - * @{ - */ - -/** - * @brief Check if Rx buffer is not empty - * @rmtoll SR RXNE LL_I2S_IsActiveFlag_RXNE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_RXNE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_RXNE(SPIx); -} - -/** - * @brief Check if Tx buffer is empty - * @rmtoll SR TXE LL_I2S_IsActiveFlag_TXE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_TXE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_TXE(SPIx); -} - -/** - * @brief Get busy flag - * @rmtoll SR BSY LL_I2S_IsActiveFlag_BSY - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_BSY(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_BSY(SPIx); -} - -/** - * @brief Get overrun error flag - * @rmtoll SR OVR LL_I2S_IsActiveFlag_OVR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_OVR(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_OVR(SPIx); -} - -/** - * @brief Get underrun error flag - * @rmtoll SR UDR LL_I2S_IsActiveFlag_UDR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_UDR(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_UDR) == (SPI_SR_UDR)) ? 1UL : 0UL); -} - -/** - * @brief Get frame format error flag - * @rmtoll SR FRE LL_I2S_IsActiveFlag_FRE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_FRE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_FRE(SPIx); -} - -/** - * @brief Get channel side flag. - * @note 0: Channel Left has to be transmitted or has been received\n - * 1: Channel Right has to be transmitted or has been received\n - * It has no significance in PCM mode. - * @rmtoll SR CHSIDE LL_I2S_IsActiveFlag_CHSIDE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_CHSIDE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_CHSIDE) == (SPI_SR_CHSIDE)) ? 1UL : 0UL); -} - -/** - * @brief Clear overrun error flag - * @rmtoll SR OVR LL_I2S_ClearFlag_OVR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_ClearFlag_OVR(SPI_TypeDef *SPIx) -{ - LL_SPI_ClearFlag_OVR(SPIx); -} - -/** - * @brief Clear underrun error flag - * @rmtoll SR UDR LL_I2S_ClearFlag_UDR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_ClearFlag_UDR(SPI_TypeDef *SPIx) -{ - __IO uint32_t tmpreg; - tmpreg = SPIx->SR; - (void)tmpreg; -} - -/** - * @brief Clear frame format error flag - * @rmtoll SR FRE LL_I2S_ClearFlag_FRE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_ClearFlag_FRE(SPI_TypeDef *SPIx) -{ - LL_SPI_ClearFlag_FRE(SPIx); -} - -/** - * @} - */ - -/** @defgroup I2S_LL_EF_IT Interrupt Management - * @{ - */ - -/** - * @brief Enable error IT - * @note This bit controls the generation of an interrupt when an error condition occurs (OVR, UDR and FRE in I2S mode). - * @rmtoll CR2 ERRIE LL_I2S_EnableIT_ERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableIT_ERR(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableIT_ERR(SPIx); -} - -/** - * @brief Enable Rx buffer not empty IT - * @rmtoll CR2 RXNEIE LL_I2S_EnableIT_RXNE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableIT_RXNE(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableIT_RXNE(SPIx); -} - -/** - * @brief Enable Tx buffer empty IT - * @rmtoll CR2 TXEIE LL_I2S_EnableIT_TXE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableIT_TXE(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableIT_TXE(SPIx); -} - -/** - * @brief Disable error IT - * @note This bit controls the generation of an interrupt when an error condition occurs (OVR, UDR and FRE in I2S mode). - * @rmtoll CR2 ERRIE LL_I2S_DisableIT_ERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableIT_ERR(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableIT_ERR(SPIx); -} - -/** - * @brief Disable Rx buffer not empty IT - * @rmtoll CR2 RXNEIE LL_I2S_DisableIT_RXNE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableIT_RXNE(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableIT_RXNE(SPIx); -} - -/** - * @brief Disable Tx buffer empty IT - * @rmtoll CR2 TXEIE LL_I2S_DisableIT_TXE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableIT_TXE(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableIT_TXE(SPIx); -} - -/** - * @brief Check if ERR IT is enabled - * @rmtoll CR2 ERRIE LL_I2S_IsEnabledIT_ERR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_ERR(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledIT_ERR(SPIx); -} - -/** - * @brief Check if RXNE IT is enabled - * @rmtoll CR2 RXNEIE LL_I2S_IsEnabledIT_RXNE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_RXNE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledIT_RXNE(SPIx); -} - -/** - * @brief Check if TXE IT is enabled - * @rmtoll CR2 TXEIE LL_I2S_IsEnabledIT_TXE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_TXE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledIT_TXE(SPIx); -} - -/** - * @} - */ - -/** @defgroup I2S_LL_EF_DMA DMA Management - * @{ - */ - -/** - * @brief Enable DMA Rx - * @rmtoll CR2 RXDMAEN LL_I2S_EnableDMAReq_RX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableDMAReq_RX(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableDMAReq_RX(SPIx); -} - -/** - * @brief Disable DMA Rx - * @rmtoll CR2 RXDMAEN LL_I2S_DisableDMAReq_RX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableDMAReq_RX(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableDMAReq_RX(SPIx); -} - -/** - * @brief Check if DMA Rx is enabled - * @rmtoll CR2 RXDMAEN LL_I2S_IsEnabledDMAReq_RX - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledDMAReq_RX(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledDMAReq_RX(SPIx); -} - -/** - * @brief Enable DMA Tx - * @rmtoll CR2 TXDMAEN LL_I2S_EnableDMAReq_TX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableDMAReq_TX(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableDMAReq_TX(SPIx); -} - -/** - * @brief Disable DMA Tx - * @rmtoll CR2 TXDMAEN LL_I2S_DisableDMAReq_TX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableDMAReq_TX(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableDMAReq_TX(SPIx); -} - -/** - * @brief Check if DMA Tx is enabled - * @rmtoll CR2 TXDMAEN LL_I2S_IsEnabledDMAReq_TX - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledDMAReq_TX(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledDMAReq_TX(SPIx); -} - -/** - * @} - */ - -/** @defgroup I2S_LL_EF_DATA DATA Management - * @{ - */ - -/** - * @brief Read 16-Bits in data register - * @rmtoll DR DR LL_I2S_ReceiveData16 - * @param SPIx SPI Instance - * @retval RxData Value between Min_Data=0x0000 and Max_Data=0xFFFF - */ -__STATIC_INLINE uint16_t LL_I2S_ReceiveData16(SPI_TypeDef *SPIx) -{ - return LL_SPI_ReceiveData16(SPIx); -} - -/** - * @brief Write 16-Bits in data register - * @rmtoll DR DR LL_I2S_TransmitData16 - * @param SPIx SPI Instance - * @param TxData Value between Min_Data=0x0000 and Max_Data=0xFFFF - * @retval None - */ -__STATIC_INLINE void LL_I2S_TransmitData16(SPI_TypeDef *SPIx, uint16_t TxData) -{ - LL_SPI_TransmitData16(SPIx, TxData); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2S_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -ErrorStatus LL_I2S_DeInit(const SPI_TypeDef *SPIx); -ErrorStatus LL_I2S_Init(SPI_TypeDef *SPIx, LL_I2S_InitTypeDef *I2S_InitStruct); -void LL_I2S_StructInit(LL_I2S_InitTypeDef *I2S_InitStruct); -void LL_I2S_ConfigPrescaler(SPI_TypeDef *SPIx, uint32_t PrescalerLinear, uint32_t PrescalerParity); -#if defined (SPI_I2S_FULLDUPLEX_SUPPORT) -ErrorStatus LL_I2S_InitFullDuplex(SPI_TypeDef *I2Sxext, LL_I2S_InitTypeDef *I2S_InitStruct); -#endif /* SPI_I2S_FULLDUPLEX_SUPPORT */ - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined (SPI1) || defined (SPI2) || defined (SPI3) || defined (SPI4) || defined (SPI5) || defined(SPI6) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_LL_SPI_H */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h deleted file mode 100644 index 84ea5c4..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h +++ /dev/null @@ -1,1711 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_system.h - * @author MCD Application Team - * @brief Header file of SYSTEM LL module. - * - ****************************************************************************** - * @attention - * - *Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The LL SYSTEM driver contains a set of generic APIs that can be - used by user: - (+) Some of the FLASH features need to be handled in the SYSTEM file. - (+) Access to DBGCMU registers - (+) Access to SYSCFG registers - - @endverbatim - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_SYSTEM_H -#define __STM32F4xx_LL_SYSTEM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (FLASH) || defined (SYSCFG) || defined (DBGMCU) - -/** @defgroup SYSTEM_LL SYSTEM - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup SYSTEM_LL_Private_Constants SYSTEM Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SYSTEM_LL_Exported_Constants SYSTEM Exported Constants - * @{ - */ - -/** @defgroup SYSTEM_LL_EC_REMAP SYSCFG REMAP -* @{ -*/ -#define LL_SYSCFG_REMAP_FLASH (uint32_t)0x00000000 /*!< Main Flash memory mapped at 0x00000000 */ -#define LL_SYSCFG_REMAP_SYSTEMFLASH SYSCFG_MEMRMP_MEM_MODE_0 /*!< System Flash memory mapped at 0x00000000 */ -#if defined(FSMC_Bank1) -#define LL_SYSCFG_REMAP_FSMC SYSCFG_MEMRMP_MEM_MODE_1 /*!< FSMC(NOR/PSRAM 1 and 2) mapped at 0x00000000 */ -#endif /* FSMC_Bank1 */ -#if defined(FMC_Bank1) -#define LL_SYSCFG_REMAP_FMC SYSCFG_MEMRMP_MEM_MODE_1 /*!< FMC(NOR/PSRAM 1 and 2) mapped at 0x00000000 */ -#define LL_SYSCFG_REMAP_SDRAM SYSCFG_MEMRMP_MEM_MODE_2 /*!< FMC/SDRAM mapped at 0x00000000 */ -#endif /* FMC_Bank1 */ -#define LL_SYSCFG_REMAP_SRAM (SYSCFG_MEMRMP_MEM_MODE_1 | SYSCFG_MEMRMP_MEM_MODE_0) /*!< SRAM1 mapped at 0x00000000 */ - -/** - * @} - */ - -#if defined(SYSCFG_PMC_MII_RMII_SEL) - /** @defgroup SYSTEM_LL_EC_PMC SYSCFG PMC -* @{ -*/ -#define LL_SYSCFG_PMC_ETHMII (uint32_t)0x00000000 /*!< ETH Media MII interface */ -#define LL_SYSCFG_PMC_ETHRMII (uint32_t)SYSCFG_PMC_MII_RMII_SEL /*!< ETH Media RMII interface */ - -/** - * @} - */ -#endif /* SYSCFG_PMC_MII_RMII_SEL */ - - - -#if defined(SYSCFG_MEMRMP_UFB_MODE) -/** @defgroup SYSTEM_LL_EC_BANKMODE SYSCFG BANK MODE - * @{ - */ -#define LL_SYSCFG_BANKMODE_BANK1 (uint32_t)0x00000000 /*!< Flash Bank 1 base address mapped at 0x0800 0000 (AXI) and 0x0020 0000 (TCM) - and Flash Bank 2 base address mapped at 0x0810 0000 (AXI) and 0x0030 0000 (TCM)*/ -#define LL_SYSCFG_BANKMODE_BANK2 SYSCFG_MEMRMP_UFB_MODE /*!< Flash Bank 2 base address mapped at 0x0800 0000 (AXI) and 0x0020 0000(TCM) - and Flash Bank 1 base address mapped at 0x0810 0000 (AXI) and 0x0030 0000(TCM) */ -/** - * @} - */ -#endif /* SYSCFG_MEMRMP_UFB_MODE */ -/** @defgroup SYSTEM_LL_EC_I2C_FASTMODEPLUS SYSCFG I2C FASTMODEPLUS - * @{ - */ -#if defined(SYSCFG_CFGR_FMPI2C1_SCL) -#define LL_SYSCFG_I2C_FASTMODEPLUS_SCL SYSCFG_CFGR_FMPI2C1_SCL /*!< Enable Fast Mode Plus on FMPI2C_SCL pin */ -#define LL_SYSCFG_I2C_FASTMODEPLUS_SDA SYSCFG_CFGR_FMPI2C1_SDA /*!< Enable Fast Mode Plus on FMPI2C_SDA pin*/ -#endif /* SYSCFG_CFGR_FMPI2C1_SCL */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_EXTI_PORT SYSCFG EXTI PORT - * @{ - */ -#define LL_SYSCFG_EXTI_PORTA (uint32_t)0 /*!< EXTI PORT A */ -#define LL_SYSCFG_EXTI_PORTB (uint32_t)1 /*!< EXTI PORT B */ -#define LL_SYSCFG_EXTI_PORTC (uint32_t)2 /*!< EXTI PORT C */ -#define LL_SYSCFG_EXTI_PORTD (uint32_t)3 /*!< EXTI PORT D */ -#define LL_SYSCFG_EXTI_PORTE (uint32_t)4 /*!< EXTI PORT E */ -#if defined(GPIOF) -#define LL_SYSCFG_EXTI_PORTF (uint32_t)5 /*!< EXTI PORT F */ -#endif /* GPIOF */ -#if defined(GPIOG) -#define LL_SYSCFG_EXTI_PORTG (uint32_t)6 /*!< EXTI PORT G */ -#endif /* GPIOG */ -#define LL_SYSCFG_EXTI_PORTH (uint32_t)7 /*!< EXTI PORT H */ -#if defined(GPIOI) -#define LL_SYSCFG_EXTI_PORTI (uint32_t)8 /*!< EXTI PORT I */ -#endif /* GPIOI */ -#if defined(GPIOJ) -#define LL_SYSCFG_EXTI_PORTJ (uint32_t)9 /*!< EXTI PORT J */ -#endif /* GPIOJ */ -#if defined(GPIOK) -#define LL_SYSCFG_EXTI_PORTK (uint32_t)10 /*!< EXTI PORT k */ -#endif /* GPIOK */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_EXTI_LINE SYSCFG EXTI LINE - * @{ - */ -#define LL_SYSCFG_EXTI_LINE0 (uint32_t)(0x000FU << 16 | 0) /*!< EXTI_POSITION_0 | EXTICR[0] */ -#define LL_SYSCFG_EXTI_LINE1 (uint32_t)(0x00F0U << 16 | 0) /*!< EXTI_POSITION_4 | EXTICR[0] */ -#define LL_SYSCFG_EXTI_LINE2 (uint32_t)(0x0F00U << 16 | 0) /*!< EXTI_POSITION_8 | EXTICR[0] */ -#define LL_SYSCFG_EXTI_LINE3 (uint32_t)(0xF000U << 16 | 0) /*!< EXTI_POSITION_12 | EXTICR[0] */ -#define LL_SYSCFG_EXTI_LINE4 (uint32_t)(0x000FU << 16 | 1) /*!< EXTI_POSITION_0 | EXTICR[1] */ -#define LL_SYSCFG_EXTI_LINE5 (uint32_t)(0x00F0U << 16 | 1) /*!< EXTI_POSITION_4 | EXTICR[1] */ -#define LL_SYSCFG_EXTI_LINE6 (uint32_t)(0x0F00U << 16 | 1) /*!< EXTI_POSITION_8 | EXTICR[1] */ -#define LL_SYSCFG_EXTI_LINE7 (uint32_t)(0xF000U << 16 | 1) /*!< EXTI_POSITION_12 | EXTICR[1] */ -#define LL_SYSCFG_EXTI_LINE8 (uint32_t)(0x000FU << 16 | 2) /*!< EXTI_POSITION_0 | EXTICR[2] */ -#define LL_SYSCFG_EXTI_LINE9 (uint32_t)(0x00F0U << 16 | 2) /*!< EXTI_POSITION_4 | EXTICR[2] */ -#define LL_SYSCFG_EXTI_LINE10 (uint32_t)(0x0F00U << 16 | 2) /*!< EXTI_POSITION_8 | EXTICR[2] */ -#define LL_SYSCFG_EXTI_LINE11 (uint32_t)(0xF000U << 16 | 2) /*!< EXTI_POSITION_12 | EXTICR[2] */ -#define LL_SYSCFG_EXTI_LINE12 (uint32_t)(0x000FU << 16 | 3) /*!< EXTI_POSITION_0 | EXTICR[3] */ -#define LL_SYSCFG_EXTI_LINE13 (uint32_t)(0x00F0U << 16 | 3) /*!< EXTI_POSITION_4 | EXTICR[3] */ -#define LL_SYSCFG_EXTI_LINE14 (uint32_t)(0x0F00U << 16 | 3) /*!< EXTI_POSITION_8 | EXTICR[3] */ -#define LL_SYSCFG_EXTI_LINE15 (uint32_t)(0xF000U << 16 | 3) /*!< EXTI_POSITION_12 | EXTICR[3] */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_TIMBREAK SYSCFG TIMER BREAK - * @{ - */ -#if defined(SYSCFG_CFGR2_LOCKUP_LOCK) -#define LL_SYSCFG_TIMBREAK_LOCKUP SYSCFG_CFGR2_LOCKUP_LOCK /*!< Enables and locks the LOCKUP output of CortexM4 - with Break Input of TIM1/8 */ -#define LL_SYSCFG_TIMBREAK_PVD SYSCFG_CFGR2_PVD_LOCK /*!< Enables and locks the PVD connection with TIM1/8 Break Input - and also the PVDE and PLS bits of the Power Control Interface */ -#endif /* SYSCFG_CFGR2_CLL */ -/** - * @} - */ - -#if defined(SYSCFG_MCHDLYCR_BSCKSEL) -/** @defgroup SYSTEM_LL_DFSDM_BitStream_ClockSource SYSCFG MCHDLY BCKKSEL - * @{ - */ -#define LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 (uint32_t)0x00000000 -#define LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 SYSCFG_MCHDLYCR_BSCKSEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM_MCHDLYEN SYSCFG MCHDLY MCHDLYEN - * @{ - */ -#define LL_SYSCFG_DFSDM1_MCHDLYEN SYSCFG_MCHDLYCR_MCHDLY1EN -#define LL_SYSCFG_DFSDM2_MCHDLYEN SYSCFG_MCHDLYCR_MCHDLY2EN -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM_DataIn0_Source SYSCFG MCHDLY DFSDMD0SEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_DataIn0 SYSCFG_MCHDLYCR_DFSDM1D0SEL -#define LL_SYSCFG_DFSDM2_DataIn0 SYSCFG_MCHDLYCR_DFSDM2D0SEL - -#define LL_SYSCFG_DFSDM1_DataIn0_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D0SEL << 16) | 0x00000000) -#define LL_SYSCFG_DFSDM1_DataIn0_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D0SEL << 16) | SYSCFG_MCHDLYCR_DFSDM1D0SEL) -#define LL_SYSCFG_DFSDM2_DataIn0_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D0SEL << 16) | 0x00000000) -#define LL_SYSCFG_DFSDM2_DataIn0_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D0SEL << 16) | SYSCFG_MCHDLYCR_DFSDM2D0SEL) -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM_DataIn2_Source SYSCFG MCHDLY DFSDMD2SEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_DataIn2 SYSCFG_MCHDLYCR_DFSDM1D2SEL -#define LL_SYSCFG_DFSDM2_DataIn2 SYSCFG_MCHDLYCR_DFSDM2D2SEL - -#define LL_SYSCFG_DFSDM1_DataIn2_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D2SEL << 16) | 0x00000000) -#define LL_SYSCFG_DFSDM1_DataIn2_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D2SEL << 16) | SYSCFG_MCHDLYCR_DFSDM1D2SEL) -#define LL_SYSCFG_DFSDM2_DataIn2_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D2SEL << 16) | 0x00000000) -#define LL_SYSCFG_DFSDM2_DataIn2_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D2SEL << 16) | SYSCFG_MCHDLYCR_DFSDM2D2SEL) -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM1_TIM4OC2_BitstreamDistribution SYSCFG MCHDLY DFSDM1CK02SEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 SYSCFG_MCHDLYCR_DFSDM1CK02SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM1_TIM4OC1_BitstreamDistribution SYSCFG MCHDLY DFSDM1CK13SEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 SYSCFG_MCHDLYCR_DFSDM1CK13SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM1_CLKIN_SourceSelection SYSCFG MCHDLY DFSDMCFG - * @{ - */ -#define LL_SYSCFG_DFSDM1_CKIN_PAD (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM1_CKIN_DM SYSCFG_MCHDLYCR_DFSDM1CFG -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM1_CLKOUT_SourceSelection SYSCFG MCHDLY DFSDM1CKOSEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_CKOUT (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM1_CKOUT_M27 SYSCFG_MCHDLYCR_DFSDM1CKOSEL -/** - * @} - */ - -/** @defgroup SYSTEM_LL_DFSDM2_DataIn4_SourceSelection SYSCFG MCHDLY DFSDM2D4SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_DataIn4_PAD (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_DataIn4_DM SYSCFG_MCHDLYCR_DFSDM2D4SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_DataIn6_SourceSelection SYSCFG MCHDLY DFSDM2D6SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_DataIn6_PAD (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_DataIn6_DM SYSCFG_MCHDLYCR_DFSDM2D6SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC4_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK04SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 SYSCFG_MCHDLYCR_DFSDM2CK04SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC3_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK15SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 SYSCFG_MCHDLYCR_DFSDM2CK15SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC2_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK26SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 SYSCFG_MCHDLYCR_DFSDM2CK26SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC1_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK37SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 SYSCFG_MCHDLYCR_DFSDM2CK37SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_CLKIN_SourceSelection SYSCFG MCHDLY DFSDM2CFG - * @{ - */ -#define LL_SYSCFG_DFSDM2_CKIN_PAD (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_CKIN_DM SYSCFG_MCHDLYCR_DFSDM2CFG -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_CLKOUT_SourceSelection SYSCFG MCHDLY DFSDM2CKOSEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_CKOUT (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_CKOUT_M27 SYSCFG_MCHDLYCR_DFSDM2CKOSEL -/** - * @} - */ -#endif /* SYSCFG_MCHDLYCR_BSCKSEL */ - -/** @defgroup SYSTEM_LL_EC_TRACE DBGMCU TRACE Pin Assignment - * @{ - */ -#define LL_DBGMCU_TRACE_NONE 0x00000000U /*!< TRACE pins not assigned (default state) */ -#define LL_DBGMCU_TRACE_ASYNCH DBGMCU_CR_TRACE_IOEN /*!< TRACE pin assignment for Asynchronous Mode */ -#define LL_DBGMCU_TRACE_SYNCH_SIZE1 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE_0) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 1 */ -#define LL_DBGMCU_TRACE_SYNCH_SIZE2 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE_1) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 2 */ -#define LL_DBGMCU_TRACE_SYNCH_SIZE4 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 4 */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_APB1_GRP1_STOP_IP DBGMCU APB1 GRP1 STOP IP - * @{ - */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM2_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM2_STOP DBGMCU_APB1_FZ_DBG_TIM2_STOP /*!< TIM2 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM2_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM3_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM3_STOP DBGMCU_APB1_FZ_DBG_TIM3_STOP /*!< TIM3 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM3_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM4_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM4_STOP DBGMCU_APB1_FZ_DBG_TIM4_STOP /*!< TIM4 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM4_STOP */ -#define LL_DBGMCU_APB1_GRP1_TIM5_STOP DBGMCU_APB1_FZ_DBG_TIM5_STOP /*!< TIM5 counter stopped when core is halted */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM6_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM6_STOP DBGMCU_APB1_FZ_DBG_TIM6_STOP /*!< TIM6 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM6_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM7_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM7_STOP DBGMCU_APB1_FZ_DBG_TIM7_STOP /*!< TIM7 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM7_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM12_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM12_STOP DBGMCU_APB1_FZ_DBG_TIM12_STOP /*!< TIM12 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM12_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM13_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM13_STOP DBGMCU_APB1_FZ_DBG_TIM13_STOP /*!< TIM13 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM13_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM14_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM14_STOP DBGMCU_APB1_FZ_DBG_TIM14_STOP /*!< TIM14 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM14_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_LPTIM_STOP) -#define LL_DBGMCU_APB1_GRP1_LPTIM_STOP DBGMCU_APB1_FZ_DBG_LPTIM_STOP /*!< LPTIM counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_LPTIM_STOP */ -#define LL_DBGMCU_APB1_GRP1_RTC_STOP DBGMCU_APB1_FZ_DBG_RTC_STOP /*!< RTC counter stopped when core is halted */ -#define LL_DBGMCU_APB1_GRP1_WWDG_STOP DBGMCU_APB1_FZ_DBG_WWDG_STOP /*!< Debug Window Watchdog stopped when Core is halted */ -#define LL_DBGMCU_APB1_GRP1_IWDG_STOP DBGMCU_APB1_FZ_DBG_IWDG_STOP /*!< Debug Independent Watchdog stopped when Core is halted */ -#define LL_DBGMCU_APB1_GRP1_I2C1_STOP DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT /*!< I2C1 SMBUS timeout mode stopped when Core is halted */ -#define LL_DBGMCU_APB1_GRP1_I2C2_STOP DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT /*!< I2C2 SMBUS timeout mode stopped when Core is halted */ -#if defined(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT) -#define LL_DBGMCU_APB1_GRP1_I2C3_STOP DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT /*!< I2C3 SMBUS timeout mode stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT */ -#if defined(DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT) -#define LL_DBGMCU_APB1_GRP1_I2C4_STOP DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT /*!< I2C4 SMBUS timeout mode stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT */ -#if defined(DBGMCU_APB1_FZ_DBG_CAN1_STOP) -#define LL_DBGMCU_APB1_GRP1_CAN1_STOP DBGMCU_APB1_FZ_DBG_CAN1_STOP /*!< CAN1 debug stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_CAN1_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_CAN2_STOP) -#define LL_DBGMCU_APB1_GRP1_CAN2_STOP DBGMCU_APB1_FZ_DBG_CAN2_STOP /*!< CAN2 debug stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_CAN2_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_CAN3_STOP) -#define LL_DBGMCU_APB1_GRP1_CAN3_STOP DBGMCU_APB1_FZ_DBG_CAN3_STOP /*!< CAN3 debug stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_CAN3_STOP */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_APB2_GRP1_STOP_IP DBGMCU APB2 GRP1 STOP IP - * @{ - */ -#define LL_DBGMCU_APB2_GRP1_TIM1_STOP DBGMCU_APB2_FZ_DBG_TIM1_STOP /*!< TIM1 counter stopped when core is halted */ -#if defined(DBGMCU_APB2_FZ_DBG_TIM8_STOP) -#define LL_DBGMCU_APB2_GRP1_TIM8_STOP DBGMCU_APB2_FZ_DBG_TIM8_STOP /*!< TIM8 counter stopped when core is halted */ -#endif /* DBGMCU_APB2_FZ_DBG_TIM8_STOP */ -#define LL_DBGMCU_APB2_GRP1_TIM9_STOP DBGMCU_APB2_FZ_DBG_TIM9_STOP /*!< TIM9 counter stopped when core is halted */ -#if defined(DBGMCU_APB2_FZ_DBG_TIM10_STOP) -#define LL_DBGMCU_APB2_GRP1_TIM10_STOP DBGMCU_APB2_FZ_DBG_TIM10_STOP /*!< TIM10 counter stopped when core is halted */ -#endif /* DBGMCU_APB2_FZ_DBG_TIM10_STOP */ -#define LL_DBGMCU_APB2_GRP1_TIM11_STOP DBGMCU_APB2_FZ_DBG_TIM11_STOP /*!< TIM11 counter stopped when core is halted */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_LATENCY FLASH LATENCY - * @{ - */ -#define LL_FLASH_LATENCY_0 FLASH_ACR_LATENCY_0WS /*!< FLASH Zero wait state */ -#define LL_FLASH_LATENCY_1 FLASH_ACR_LATENCY_1WS /*!< FLASH One wait state */ -#define LL_FLASH_LATENCY_2 FLASH_ACR_LATENCY_2WS /*!< FLASH Two wait states */ -#define LL_FLASH_LATENCY_3 FLASH_ACR_LATENCY_3WS /*!< FLASH Three wait states */ -#define LL_FLASH_LATENCY_4 FLASH_ACR_LATENCY_4WS /*!< FLASH Four wait states */ -#define LL_FLASH_LATENCY_5 FLASH_ACR_LATENCY_5WS /*!< FLASH five wait state */ -#define LL_FLASH_LATENCY_6 FLASH_ACR_LATENCY_6WS /*!< FLASH six wait state */ -#define LL_FLASH_LATENCY_7 FLASH_ACR_LATENCY_7WS /*!< FLASH seven wait states */ -#define LL_FLASH_LATENCY_8 FLASH_ACR_LATENCY_8WS /*!< FLASH eight wait states */ -#define LL_FLASH_LATENCY_9 FLASH_ACR_LATENCY_9WS /*!< FLASH nine wait states */ -#define LL_FLASH_LATENCY_10 FLASH_ACR_LATENCY_10WS /*!< FLASH ten wait states */ -#define LL_FLASH_LATENCY_11 FLASH_ACR_LATENCY_11WS /*!< FLASH eleven wait states */ -#define LL_FLASH_LATENCY_12 FLASH_ACR_LATENCY_12WS /*!< FLASH twelve wait states */ -#define LL_FLASH_LATENCY_13 FLASH_ACR_LATENCY_13WS /*!< FLASH thirteen wait states */ -#define LL_FLASH_LATENCY_14 FLASH_ACR_LATENCY_14WS /*!< FLASH fourteen wait states */ -#define LL_FLASH_LATENCY_15 FLASH_ACR_LATENCY_15WS /*!< FLASH fifteen wait states */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SYSTEM_LL_Exported_Functions SYSTEM Exported Functions - * @{ - */ - -/** @defgroup SYSTEM_LL_EF_SYSCFG SYSCFG - * @{ - */ -/** - * @brief Set memory mapping at address 0x00000000 - * @rmtoll SYSCFG_MEMRMP MEM_MODE LL_SYSCFG_SetRemapMemory - * @param Memory This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_REMAP_FLASH - * @arg @ref LL_SYSCFG_REMAP_SYSTEMFLASH - * @arg @ref LL_SYSCFG_REMAP_SRAM - * @arg @ref LL_SYSCFG_REMAP_FSMC (*) - * @arg @ref LL_SYSCFG_REMAP_FMC (*) - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetRemapMemory(uint32_t Memory) -{ - MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE, Memory); -} - -/** - * @brief Get memory mapping at address 0x00000000 - * @rmtoll SYSCFG_MEMRMP MEM_MODE LL_SYSCFG_GetRemapMemory - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_REMAP_FLASH - * @arg @ref LL_SYSCFG_REMAP_SYSTEMFLASH - * @arg @ref LL_SYSCFG_REMAP_SRAM - * @arg @ref LL_SYSCFG_REMAP_FSMC (*) - * @arg @ref LL_SYSCFG_REMAP_FMC (*) - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetRemapMemory(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE)); -} - -#if defined(SYSCFG_MEMRMP_SWP_FMC) -/** - * @brief Enables the FMC Memory Mapping Swapping - * @rmtoll SYSCFG_MEMRMP SWP_FMC LL_SYSCFG_EnableFMCMemorySwapping - * @note SDRAM is accessible at 0x60000000 and NOR/RAM - * is accessible at 0xC0000000 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_EnableFMCMemorySwapping(void) -{ - SET_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FMC_0); -} - -/** - * @brief Disables the FMC Memory Mapping Swapping - * @rmtoll SYSCFG_MEMRMP SWP_FMC LL_SYSCFG_DisableFMCMemorySwapping - * @note SDRAM is accessible at 0xC0000000 (default mapping) - * and NOR/RAM is accessible at 0x60000000 (default mapping) - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DisableFMCMemorySwapping(void) -{ - CLEAR_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FMC); -} - -#endif /* SYSCFG_MEMRMP_SWP_FMC */ -/** - * @brief Enables the Compensation cell Power Down - * @rmtoll SYSCFG_CMPCR CMP_PD LL_SYSCFG_EnableCompensationCell - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_EnableCompensationCell(void) -{ - SET_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_CMP_PD); -} - -/** - * @brief Disables the Compensation cell Power Down - * @rmtoll SYSCFG_CMPCR CMP_PD LL_SYSCFG_DisableCompensationCell - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DisableCompensationCell(void) -{ - CLEAR_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_CMP_PD); -} - -/** - * @brief Get Compensation Cell ready Flag - * @rmtoll SYSCFG_CMPCR READY LL_SYSCFG_IsActiveFlag_CMPCR - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SYSCFG_IsActiveFlag_CMPCR(void) -{ - return (READ_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_READY) == (SYSCFG_CMPCR_READY)); -} - -#if defined(SYSCFG_PMC_MII_RMII_SEL) -/** - * @brief Select Ethernet PHY interface - * @rmtoll SYSCFG_PMC MII_RMII_SEL LL_SYSCFG_SetPHYInterface - * @param Interface This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_PMC_ETHMII - * @arg @ref LL_SYSCFG_PMC_ETHRMII - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetPHYInterface(uint32_t Interface) -{ - MODIFY_REG(SYSCFG->PMC, SYSCFG_PMC_MII_RMII_SEL, Interface); -} - -/** - * @brief Get Ethernet PHY interface - * @rmtoll SYSCFG_PMC MII_RMII_SEL LL_SYSCFG_GetPHYInterface - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_PMC_ETHMII - * @arg @ref LL_SYSCFG_PMC_ETHRMII - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetPHYInterface(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->PMC, SYSCFG_PMC_MII_RMII_SEL)); -} -#endif /* SYSCFG_PMC_MII_RMII_SEL */ - - - -#if defined(SYSCFG_MEMRMP_UFB_MODE) -/** - * @brief Select Flash bank mode (Bank flashed at 0x08000000) - * @rmtoll SYSCFG_MEMRMP UFB_MODE LL_SYSCFG_SetFlashBankMode - * @param Bank This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_BANKMODE_BANK1 - * @arg @ref LL_SYSCFG_BANKMODE_BANK2 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetFlashBankMode(uint32_t Bank) -{ - MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_UFB_MODE, Bank); -} - -/** - * @brief Get Flash bank mode (Bank flashed at 0x08000000) - * @rmtoll SYSCFG_MEMRMP UFB_MODE LL_SYSCFG_GetFlashBankMode - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_BANKMODE_BANK1 - * @arg @ref LL_SYSCFG_BANKMODE_BANK2 - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetFlashBankMode(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_UFB_MODE)); -} -#endif /* SYSCFG_MEMRMP_UFB_MODE */ - -#if defined(SYSCFG_CFGR_FMPI2C1_SCL) -/** - * @brief Enable the I2C fast mode plus driving capability. - * @rmtoll SYSCFG_CFGR FMPI2C1_SCL LL_SYSCFG_EnableFastModePlus\n - * SYSCFG_CFGR FMPI2C1_SDA LL_SYSCFG_EnableFastModePlus - * @param ConfigFastModePlus This parameter can be a combination of the following values: - * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SCL - * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SDA - * (*) value not defined in all devices - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_EnableFastModePlus(uint32_t ConfigFastModePlus) -{ - SET_BIT(SYSCFG->CFGR, ConfigFastModePlus); -} - -/** - * @brief Disable the I2C fast mode plus driving capability. - * @rmtoll SYSCFG_CFGR FMPI2C1_SCL LL_SYSCFG_DisableFastModePlus\n - * SYSCFG_CFGR FMPI2C1_SDA LL_SYSCFG_DisableFastModePlus\n - * @param ConfigFastModePlus This parameter can be a combination of the following values: - * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SCL - * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SDA - * (*) value not defined in all devices - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DisableFastModePlus(uint32_t ConfigFastModePlus) -{ - CLEAR_BIT(SYSCFG->CFGR, ConfigFastModePlus); -} -#endif /* SYSCFG_CFGR_FMPI2C1_SCL */ - -/** - * @brief Configure source input for the EXTI external interrupt. - * @rmtoll SYSCFG_EXTICR1 EXTIx LL_SYSCFG_SetEXTISource\n - * SYSCFG_EXTICR2 EXTIx LL_SYSCFG_SetEXTISource\n - * SYSCFG_EXTICR3 EXTIx LL_SYSCFG_SetEXTISource\n - * SYSCFG_EXTICR4 EXTIx LL_SYSCFG_SetEXTISource - * @param Port This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_EXTI_PORTA - * @arg @ref LL_SYSCFG_EXTI_PORTB - * @arg @ref LL_SYSCFG_EXTI_PORTC - * @arg @ref LL_SYSCFG_EXTI_PORTD - * @arg @ref LL_SYSCFG_EXTI_PORTE - * @arg @ref LL_SYSCFG_EXTI_PORTF (*) - * @arg @ref LL_SYSCFG_EXTI_PORTG (*) - * @arg @ref LL_SYSCFG_EXTI_PORTH - * - * (*) value not defined in all devices - * @param Line This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_EXTI_LINE0 - * @arg @ref LL_SYSCFG_EXTI_LINE1 - * @arg @ref LL_SYSCFG_EXTI_LINE2 - * @arg @ref LL_SYSCFG_EXTI_LINE3 - * @arg @ref LL_SYSCFG_EXTI_LINE4 - * @arg @ref LL_SYSCFG_EXTI_LINE5 - * @arg @ref LL_SYSCFG_EXTI_LINE6 - * @arg @ref LL_SYSCFG_EXTI_LINE7 - * @arg @ref LL_SYSCFG_EXTI_LINE8 - * @arg @ref LL_SYSCFG_EXTI_LINE9 - * @arg @ref LL_SYSCFG_EXTI_LINE10 - * @arg @ref LL_SYSCFG_EXTI_LINE11 - * @arg @ref LL_SYSCFG_EXTI_LINE12 - * @arg @ref LL_SYSCFG_EXTI_LINE13 - * @arg @ref LL_SYSCFG_EXTI_LINE14 - * @arg @ref LL_SYSCFG_EXTI_LINE15 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetEXTISource(uint32_t Port, uint32_t Line) -{ - MODIFY_REG(SYSCFG->EXTICR[Line & 0xFF], (Line >> 16), Port << POSITION_VAL((Line >> 16))); -} - -/** - * @brief Get the configured defined for specific EXTI Line - * @rmtoll SYSCFG_EXTICR1 EXTIx LL_SYSCFG_GetEXTISource\n - * SYSCFG_EXTICR2 EXTIx LL_SYSCFG_GetEXTISource\n - * SYSCFG_EXTICR3 EXTIx LL_SYSCFG_GetEXTISource\n - * SYSCFG_EXTICR4 EXTIx LL_SYSCFG_GetEXTISource - * @param Line This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_EXTI_LINE0 - * @arg @ref LL_SYSCFG_EXTI_LINE1 - * @arg @ref LL_SYSCFG_EXTI_LINE2 - * @arg @ref LL_SYSCFG_EXTI_LINE3 - * @arg @ref LL_SYSCFG_EXTI_LINE4 - * @arg @ref LL_SYSCFG_EXTI_LINE5 - * @arg @ref LL_SYSCFG_EXTI_LINE6 - * @arg @ref LL_SYSCFG_EXTI_LINE7 - * @arg @ref LL_SYSCFG_EXTI_LINE8 - * @arg @ref LL_SYSCFG_EXTI_LINE9 - * @arg @ref LL_SYSCFG_EXTI_LINE10 - * @arg @ref LL_SYSCFG_EXTI_LINE11 - * @arg @ref LL_SYSCFG_EXTI_LINE12 - * @arg @ref LL_SYSCFG_EXTI_LINE13 - * @arg @ref LL_SYSCFG_EXTI_LINE14 - * @arg @ref LL_SYSCFG_EXTI_LINE15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_EXTI_PORTA - * @arg @ref LL_SYSCFG_EXTI_PORTB - * @arg @ref LL_SYSCFG_EXTI_PORTC - * @arg @ref LL_SYSCFG_EXTI_PORTD - * @arg @ref LL_SYSCFG_EXTI_PORTE - * @arg @ref LL_SYSCFG_EXTI_PORTF (*) - * @arg @ref LL_SYSCFG_EXTI_PORTG (*) - * @arg @ref LL_SYSCFG_EXTI_PORTH - * (*) value not defined in all devices - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetEXTISource(uint32_t Line) -{ - return (uint32_t)(READ_BIT(SYSCFG->EXTICR[Line & 0xFF], (Line >> 16)) >> POSITION_VAL(Line >> 16)); -} - -#if defined(SYSCFG_CFGR2_LOCKUP_LOCK) -/** - * @brief Set connections to TIM1/8 break inputs - * @rmtoll SYSCFG_CFGR2 LockUp Lock LL_SYSCFG_SetTIMBreakInputs \n - * SYSCFG_CFGR2 PVD Lock LL_SYSCFG_SetTIMBreakInputs - * @param Break This parameter can be a combination of the following values: - * @arg @ref LL_SYSCFG_TIMBREAK_LOCKUP - * @arg @ref LL_SYSCFG_TIMBREAK_PVD - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetTIMBreakInputs(uint32_t Break) -{ - MODIFY_REG(SYSCFG->CFGR2, SYSCFG_CFGR2_LOCKUP_LOCK | SYSCFG_CFGR2_PVD_LOCK, Break); -} - -/** - * @brief Get connections to TIM1/8 Break inputs - * @rmtoll SYSCFG_CFGR2 LockUp Lock LL_SYSCFG_SetTIMBreakInputs \n - * SYSCFG_CFGR2 PVD Lock LL_SYSCFG_SetTIMBreakInputs - * @retval Returned value can be can be a combination of the following values: - * @arg @ref LL_SYSCFG_TIMBREAK_LOCKUP - * @arg @ref LL_SYSCFG_TIMBREAK_PVD - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetTIMBreakInputs(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->CFGR2, SYSCFG_CFGR2_LOCKUP_LOCK | SYSCFG_CFGR2_PVD_LOCK)); -} -#endif /* SYSCFG_CFGR2_LOCKUP_LOCK */ -#if defined(SYSCFG_MCHDLYCR_BSCKSEL) -/** - * @brief Select the DFSDM2 or TIM2_OC1 as clock source for the bitstream clock. - * @rmtoll SYSCFG_MCHDLYCR BSCKSEL LL_SYSCFG_DFSDM_SetBitstreamClockSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 - * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_SetBitstreamClockSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_BSCKSEL, ClockSource); -} -/** - * @brief Get the DFSDM2 or TIM2_OC1 as clock source for the bitstream clock. - * @rmtoll SYSCFG_MCHDLYCR BSCKSEL LL_SYSCFG_DFSDM_GetBitstreamClockSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 - * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetBitstreamClockSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_BSCKSEL)); -} -/** - * @brief Enables the DFSDM1 or DFSDM2 Delay clock - * @rmtoll SYSCFG_MCHDLYCR MCHDLYEN LL_SYSCFG_DFSDM_EnableDelayClock - * @param MCHDLY This parameter can be one of the following values - * @arg @ref LL_SYSCFG_DFSDM1_MCHDLYEN - * @arg @ref LL_SYSCFG_DFSDM2_MCHDLYEN - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_EnableDelayClock(uint32_t MCHDLY) -{ - SET_BIT(SYSCFG->MCHDLYCR, MCHDLY); -} - -/** - * @brief Disables the DFSDM1 or the DFSDM2 Delay clock - * @rmtoll SYSCFG_MCHDLYCR MCHDLY1EN LL_SYSCFG_DFSDM1_DisableDelayClock - * @param MCHDLY This parameter can be one of the following values - * @arg @ref LL_SYSCFG_DFSDM1_MCHDLYEN - * @arg @ref LL_SYSCFG_DFSDM2_MCHDLYEN - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_DisableDelayClock(uint32_t MCHDLY) -{ - CLEAR_BIT(SYSCFG->MCHDLYCR, MCHDLY); -} - -/** - * @brief Select the source for DFSDM1 or DFSDM2 DatIn0 - * @rmtoll SYSCFG_MCHDLYCR DFSDMD0SEL LL_SYSCFG_DFSDM_SetDataIn0Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_DM - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_SetDataIn0Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, (Source >> 16), (Source & 0x0000FFFF)); -} -/** - * @brief Get the source for DFSDM1 or DFSDM2 DatIn0. - * @rmtoll SYSCFG_MCHDLYCR DFSDMD0SEL LL_SYSCFG_DFSDM_GetDataIn0Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0 - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0 - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_DM - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetDataIn0Source(uint32_t Source) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, Source)); -} -/** - * @brief Select the source for DFSDM1 or DFSDM2 DatIn2 - * @rmtoll SYSCFG_MCHDLYCR DFSDMD2SEL LL_SYSCFG_DFSDM_SetDataIn2Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_DM - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_SetDataIn2Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, (Source >> 16), (Source & 0x0000FFFF)); -} -/** - * @brief Get the source for DFSDM1 or DFSDM2 DatIn2. - * @rmtoll SYSCFG_MCHDLYCR DFSDMD2SEL LL_SYSCFG_DFSDM_GetDataIn2Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2 - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2 - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_DM - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetDataIn2Source(uint32_t Source) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, Source)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM4 OC2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CK02SEL LL_SYSCFG_DFSDM1_SetTIM4OC2BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetTIM4OC2BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK02SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM4 OC2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM1D2SEL LL_SYSCFG_DFSDM1_GetTIM4OC2BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetTIM4OC2BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK02SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM4 OC1 - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CK13SEL LL_SYSCFG_DFSDM1_SetTIM4OC1BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetTIM4OC1BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK13SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM4 OC1 - * @rmtoll SYSCFG_MCHDLYCR DFSDM1D2SEL LL_SYSCFG_DFSDM1_GetTIM4OC1BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetTIM4OC1BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK13SEL)); -} - -/** - * @brief Select the DFSDM1 Clock In - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CFG LL_SYSCFG_DFSDM1_SetClockInSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_CKIN_PAD - * @arg @ref LL_SYSCFG_DFSDM1_CKIN_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetClockInSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CFG, ClockSource); -} -/** - * @brief GET the DFSDM1 Clock In - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CFG LL_SYSCFG_DFSDM1_GetClockInSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_CKIN_PAD - * @arg @ref LL_SYSCFG_DFSDM1_CKIN_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetClockInSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CFG)); -} - -/** - * @brief Select the DFSDM1 Clock Out - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CKOSEL LL_SYSCFG_DFSDM1_SetClockOutSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_CKOUT - * @arg @ref LL_SYSCFG_DFSDM1_CKOUT_M27 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetClockOutSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CKOSEL, ClockSource); -} -/** - * @brief GET the DFSDM1 Clock Out - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CKOSEL LL_SYSCFG_DFSDM1_GetClockOutSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_CKOUT - * @arg @ref LL_SYSCFG_DFSDM1_CKOUT_M27 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetClockOutSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CKOSEL)); -} - -/** - * @brief Enables the DFSDM2 Delay clock - * @rmtoll SYSCFG_MCHDLYCR MCHDLY2EN LL_SYSCFG_DFSDM2_EnableDelayClock - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_EnableDelayClock(void) -{ - SET_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_MCHDLY2EN); -} - -/** - * @brief Disables the DFSDM2 Delay clock - * @rmtoll SYSCFG_MCHDLYCR MCHDLY2EN LL_SYSCFG_DFSDM2_DisableDelayClock - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_DisableDelayClock(void) -{ - CLEAR_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_MCHDLY2EN); -} -/** - * @brief Select the source for DFSDM2 DatIn0 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D0SEL LL_SYSCFG_DFSDM2_SetDataIn0Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn0Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D0SEL, Source); -} -/** - * @brief Get the source for DFSDM2 DatIn0. - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D0SEL LL_SYSCFG_DFSDM2_GetDataIn0Source - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn0Source(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D0SEL)); -} - -/** - * @brief Select the source for DFSDM2 DatIn2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D2SEL LL_SYSCFG_DFSDM2_SetDataIn2Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn2Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D2SEL, Source); -} -/** - * @brief Get the source for DFSDM2 DatIn2. - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D2SEL LL_SYSCFG_DFSDM2_GetDataIn2Source - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn2Source(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D2SEL)); -} - -/** - * @brief Select the source for DFSDM2 DatIn4 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D4SEL LL_SYSCFG_DFSDM2_SetDataIn4Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn4Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D4SEL, Source); -} -/** - * @brief Get the source for DFSDM2 DatIn4. - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D4SEL LL_SYSCFG_DFSDM2_GetDataIn4Source - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn4Source(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D4SEL)); -} - -/** - * @brief Select the source for DFSDM2 DatIn6 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D6SEL LL_SYSCFG_DFSDM2_SetDataIn6Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn6Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D6SEL, Source); -} -/** - * @brief Get the source for DFSDM2 DatIn6. - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D6SEL LL_SYSCFG_DFSDM2_GetDataIn6Source - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn6Source(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D6SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM3 OC4 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_SetTIM3OC4BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC4BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK04SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM3 OC4 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC4BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC4BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK04SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM3 OC3 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK15SEL LL_SYSCFG_DFSDM2_SetTIM3OC3BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC3BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK15SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM3 OC4 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC3BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC3BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK15SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM3 OC2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK26SEL LL_SYSCFG_DFSDM2_SetTIM3OC2BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC2BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK26SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM3 OC2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC2BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC2BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK26SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM3 OC1 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK37SEL LL_SYSCFG_DFSDM2_SetTIM3OC1BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC1BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK37SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM3 OC1 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK37SEL LL_SYSCFG_DFSDM2_GetTIM3OC1BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC1BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK37SEL)); -} - -/** - * @brief Select the DFSDM2 Clock In - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CFG LL_SYSCFG_DFSDM2_SetClockInSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_CKIN_PAD - * @arg @ref LL_SYSCFG_DFSDM2_CKIN_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetClockInSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CFG, ClockSource); -} -/** - * @brief GET the DFSDM2 Clock In - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CFG LL_SYSCFG_DFSDM2_GetClockInSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_CKIN_PAD - * @arg @ref LL_SYSCFG_DFSDM2_CKIN_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetClockInSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CFG)); -} - -/** - * @brief Select the DFSDM2 Clock Out - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CKOSEL LL_SYSCFG_DFSDM2_SetClockOutSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_CKOUT - * @arg @ref LL_SYSCFG_DFSDM2_CKOUT_M27 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetClockOutSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CKOSEL, ClockSource); -} -/** - * @brief GET the DFSDM2 Clock Out - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CKOSEL LL_SYSCFG_DFSDM2_GetClockOutSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_CKOUT - * @arg @ref LL_SYSCFG_DFSDM2_CKOUT_M27 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetClockOutSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CKOSEL)); -} - -#endif /* SYSCFG_MCHDLYCR_BSCKSEL */ -/** - * @} - */ - - -/** @defgroup SYSTEM_LL_EF_DBGMCU DBGMCU - * @{ - */ - -/** - * @brief Return the device identifier - * @note For STM32F405/407xx and STM32F415/417xx devices, the device ID is 0x413 - * @note For STM32F42xxx and STM32F43xxx devices, the device ID is 0x419 - * @note For STM32F401xx devices, the device ID is 0x423 - * @note For STM32F401xx devices, the device ID is 0x433 - * @note For STM32F411xx devices, the device ID is 0x431 - * @note For STM32F410xx devices, the device ID is 0x458 - * @note For STM32F412xx devices, the device ID is 0x441 - * @note For STM32F413xx and STM32423xx devices, the device ID is 0x463 - * @note For STM32F446xx devices, the device ID is 0x421 - * @note For STM32F469xx and STM32F479xx devices, the device ID is 0x434 - * @rmtoll DBGMCU_IDCODE DEV_ID LL_DBGMCU_GetDeviceID - * @retval Values between Min_Data=0x00 and Max_Data=0xFFF - */ -__STATIC_INLINE uint32_t LL_DBGMCU_GetDeviceID(void) -{ - return (uint32_t)(READ_BIT(DBGMCU->IDCODE, DBGMCU_IDCODE_DEV_ID)); -} - -/** - * @brief Return the device revision identifier - * @note This field indicates the revision of the device. - For example, it is read as RevA -> 0x1000, Cat 2 revZ -> 0x1001, rev1 -> 0x1003, rev2 ->0x1007, revY -> 0x100F for STM32F405/407xx and STM32F415/417xx devices - For example, it is read as RevA -> 0x1000, Cat 2 revY -> 0x1003, rev1 -> 0x1007, rev3 ->0x2001 for STM32F42xxx and STM32F43xxx devices - For example, it is read as RevZ -> 0x1000, Cat 2 revA -> 0x1001 for STM32F401xB/C devices - For example, it is read as RevA -> 0x1000, Cat 2 revZ -> 0x1001 for STM32F401xD/E devices - For example, it is read as RevA -> 0x1000 for STM32F411xx,STM32F413/423xx,STM32F469/423xx, STM32F446xx and STM32F410xx devices - For example, it is read as RevZ -> 0x1001, Cat 2 revB -> 0x2000, revC -> 0x3000 for STM32F412xx devices - * @rmtoll DBGMCU_IDCODE REV_ID LL_DBGMCU_GetRevisionID - * @retval Values between Min_Data=0x00 and Max_Data=0xFFFF - */ -__STATIC_INLINE uint32_t LL_DBGMCU_GetRevisionID(void) -{ - return (uint32_t)(READ_BIT(DBGMCU->IDCODE, DBGMCU_IDCODE_REV_ID) >> DBGMCU_IDCODE_REV_ID_Pos); -} - -/** - * @brief Enable the Debug Module during SLEEP mode - * @rmtoll DBGMCU_CR DBG_SLEEP LL_DBGMCU_EnableDBGSleepMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_EnableDBGSleepMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Disable the Debug Module during SLEEP mode - * @rmtoll DBGMCU_CR DBG_SLEEP LL_DBGMCU_DisableDBGSleepMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_DisableDBGSleepMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Enable the Debug Module during STOP mode - * @rmtoll DBGMCU_CR DBG_STOP LL_DBGMCU_EnableDBGStopMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_EnableDBGStopMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Disable the Debug Module during STOP mode - * @rmtoll DBGMCU_CR DBG_STOP LL_DBGMCU_DisableDBGStopMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_DisableDBGStopMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Enable the Debug Module during STANDBY mode - * @rmtoll DBGMCU_CR DBG_STANDBY LL_DBGMCU_EnableDBGStandbyMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_EnableDBGStandbyMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Disable the Debug Module during STANDBY mode - * @rmtoll DBGMCU_CR DBG_STANDBY LL_DBGMCU_DisableDBGStandbyMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_DisableDBGStandbyMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Set Trace pin assignment control - * @rmtoll DBGMCU_CR TRACE_IOEN LL_DBGMCU_SetTracePinAssignment\n - * DBGMCU_CR TRACE_MODE LL_DBGMCU_SetTracePinAssignment - * @param PinAssignment This parameter can be one of the following values: - * @arg @ref LL_DBGMCU_TRACE_NONE - * @arg @ref LL_DBGMCU_TRACE_ASYNCH - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE1 - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE2 - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE4 - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_SetTracePinAssignment(uint32_t PinAssignment) -{ - MODIFY_REG(DBGMCU->CR, DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE, PinAssignment); -} - -/** - * @brief Get Trace pin assignment control - * @rmtoll DBGMCU_CR TRACE_IOEN LL_DBGMCU_GetTracePinAssignment\n - * DBGMCU_CR TRACE_MODE LL_DBGMCU_GetTracePinAssignment - * @retval Returned value can be one of the following values: - * @arg @ref LL_DBGMCU_TRACE_NONE - * @arg @ref LL_DBGMCU_TRACE_ASYNCH - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE1 - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE2 - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE4 - */ -__STATIC_INLINE uint32_t LL_DBGMCU_GetTracePinAssignment(void) -{ - return (uint32_t)(READ_BIT(DBGMCU->CR, DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE)); -} - -/** - * @brief Freeze APB1 peripherals (group1 peripherals) - * @rmtoll DBGMCU_APB1_FZ DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_LPTIM_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C3_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C4_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN1_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN2_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN3_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM2_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM3_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM4_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM5_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM6_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM7_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM12_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM13_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM14_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_LPTIM_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_RTC_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_WWDG_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_IWDG_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C1_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C2_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C3_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C4_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN1_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN2_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN3_STOP (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_APB1_GRP1_FreezePeriph(uint32_t Periphs) -{ - SET_BIT(DBGMCU->APB1FZ, Periphs); -} - -/** - * @brief Unfreeze APB1 peripherals (group1 peripherals) - * @rmtoll DBGMCU_APB1_FZ DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_LPTIM_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C3_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C4_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN1_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN2_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN3_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM2_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM3_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM4_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM5_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM6_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM7_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM12_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM13_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM14_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_LPTIM_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_RTC_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_WWDG_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_IWDG_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C1_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C2_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C3_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C4_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN1_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN2_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN3_STOP (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_APB1_GRP1_UnFreezePeriph(uint32_t Periphs) -{ - CLEAR_BIT(DBGMCU->APB1FZ, Periphs); -} - -/** - * @brief Freeze APB2 peripherals - * @rmtoll DBGMCU_APB2_FZ DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM9_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM10_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM11_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM1_STOP - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM8_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM9_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM10_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM11_STOP (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_APB2_GRP1_FreezePeriph(uint32_t Periphs) -{ - SET_BIT(DBGMCU->APB2FZ, Periphs); -} - -/** - * @brief Unfreeze APB2 peripherals - * @rmtoll DBGMCU_APB2_FZ DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM9_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM10_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM11_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM1_STOP - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM8_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM9_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM10_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM11_STOP (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_APB2_GRP1_UnFreezePeriph(uint32_t Periphs) -{ - CLEAR_BIT(DBGMCU->APB2FZ, Periphs); -} -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EF_FLASH FLASH - * @{ - */ - -/** - * @brief Set FLASH Latency - * @rmtoll FLASH_ACR LATENCY LL_FLASH_SetLatency - * @param Latency This parameter can be one of the following values: - * @arg @ref LL_FLASH_LATENCY_0 - * @arg @ref LL_FLASH_LATENCY_1 - * @arg @ref LL_FLASH_LATENCY_2 - * @arg @ref LL_FLASH_LATENCY_3 - * @arg @ref LL_FLASH_LATENCY_4 - * @arg @ref LL_FLASH_LATENCY_5 - * @arg @ref LL_FLASH_LATENCY_6 - * @arg @ref LL_FLASH_LATENCY_7 - * @arg @ref LL_FLASH_LATENCY_8 - * @arg @ref LL_FLASH_LATENCY_9 - * @arg @ref LL_FLASH_LATENCY_10 - * @arg @ref LL_FLASH_LATENCY_11 - * @arg @ref LL_FLASH_LATENCY_12 - * @arg @ref LL_FLASH_LATENCY_13 - * @arg @ref LL_FLASH_LATENCY_14 - * @arg @ref LL_FLASH_LATENCY_15 - * @retval None - */ -__STATIC_INLINE void LL_FLASH_SetLatency(uint32_t Latency) -{ - MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, Latency); -} - -/** - * @brief Get FLASH Latency - * @rmtoll FLASH_ACR LATENCY LL_FLASH_GetLatency - * @retval Returned value can be one of the following values: - * @arg @ref LL_FLASH_LATENCY_0 - * @arg @ref LL_FLASH_LATENCY_1 - * @arg @ref LL_FLASH_LATENCY_2 - * @arg @ref LL_FLASH_LATENCY_3 - * @arg @ref LL_FLASH_LATENCY_4 - * @arg @ref LL_FLASH_LATENCY_5 - * @arg @ref LL_FLASH_LATENCY_6 - * @arg @ref LL_FLASH_LATENCY_7 - * @arg @ref LL_FLASH_LATENCY_8 - * @arg @ref LL_FLASH_LATENCY_9 - * @arg @ref LL_FLASH_LATENCY_10 - * @arg @ref LL_FLASH_LATENCY_11 - * @arg @ref LL_FLASH_LATENCY_12 - * @arg @ref LL_FLASH_LATENCY_13 - * @arg @ref LL_FLASH_LATENCY_14 - * @arg @ref LL_FLASH_LATENCY_15 - */ -__STATIC_INLINE uint32_t LL_FLASH_GetLatency(void) -{ - return (uint32_t)(READ_BIT(FLASH->ACR, FLASH_ACR_LATENCY)); -} - -/** - * @brief Enable Prefetch - * @rmtoll FLASH_ACR PRFTEN LL_FLASH_EnablePrefetch - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnablePrefetch(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_PRFTEN); -} - -/** - * @brief Disable Prefetch - * @rmtoll FLASH_ACR PRFTEN LL_FLASH_DisablePrefetch - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisablePrefetch(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_PRFTEN); -} - -/** - * @brief Check if Prefetch buffer is enabled - * @rmtoll FLASH_ACR PRFTEN LL_FLASH_IsPrefetchEnabled - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_FLASH_IsPrefetchEnabled(void) -{ - return (READ_BIT(FLASH->ACR, FLASH_ACR_PRFTEN) == (FLASH_ACR_PRFTEN)); -} - -/** - * @brief Enable Instruction cache - * @rmtoll FLASH_ACR ICEN LL_FLASH_EnableInstCache - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnableInstCache(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_ICEN); -} - -/** - * @brief Disable Instruction cache - * @rmtoll FLASH_ACR ICEN LL_FLASH_DisableInstCache - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisableInstCache(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_ICEN); -} - -/** - * @brief Enable Data cache - * @rmtoll FLASH_ACR DCEN LL_FLASH_EnableDataCache - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnableDataCache(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_DCEN); -} - -/** - * @brief Disable Data cache - * @rmtoll FLASH_ACR DCEN LL_FLASH_DisableDataCache - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisableDataCache(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_DCEN); -} - -/** - * @brief Enable Instruction cache reset - * @note bit can be written only when the instruction cache is disabled - * @rmtoll FLASH_ACR ICRST LL_FLASH_EnableInstCacheReset - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnableInstCacheReset(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_ICRST); -} - -/** - * @brief Disable Instruction cache reset - * @rmtoll FLASH_ACR ICRST LL_FLASH_DisableInstCacheReset - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisableInstCacheReset(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_ICRST); -} - -/** - * @brief Enable Data cache reset - * @note bit can be written only when the data cache is disabled - * @rmtoll FLASH_ACR DCRST LL_FLASH_EnableDataCacheReset - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnableDataCacheReset(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_DCRST); -} - -/** - * @brief Disable Data cache reset - * @rmtoll FLASH_ACR DCRST LL_FLASH_DisableDataCacheReset - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisableDataCacheReset(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_DCRST); -} - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined (FLASH) || defined (SYSCFG) || defined (DBGMCU) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_SYSTEM_H */ - - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h deleted file mode 100644 index a11f561..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h +++ /dev/null @@ -1,4096 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_tim.h - * @author MCD Application Team - * @brief Header file of TIM LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_TIM_H -#define __STM32F4xx_LL_TIM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (TIM1) || defined (TIM2) || defined (TIM3) || defined (TIM4) || defined (TIM5) || defined (TIM6) || defined (TIM7) || defined (TIM8) || defined (TIM9) || defined (TIM10) || defined (TIM11) || defined (TIM12) || defined (TIM13) || defined (TIM14) - -/** @defgroup TIM_LL TIM - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup TIM_LL_Private_Variables TIM Private Variables - * @{ - */ -static const uint8_t OFFSET_TAB_CCMRx[] = -{ - 0x00U, /* 0: TIMx_CH1 */ - 0x00U, /* 1: TIMx_CH1N */ - 0x00U, /* 2: TIMx_CH2 */ - 0x00U, /* 3: TIMx_CH2N */ - 0x04U, /* 4: TIMx_CH3 */ - 0x04U, /* 5: TIMx_CH3N */ - 0x04U /* 6: TIMx_CH4 */ -}; - -static const uint8_t SHIFT_TAB_OCxx[] = -{ - 0U, /* 0: OC1M, OC1FE, OC1PE */ - 0U, /* 1: - NA */ - 8U, /* 2: OC2M, OC2FE, OC2PE */ - 0U, /* 3: - NA */ - 0U, /* 4: OC3M, OC3FE, OC3PE */ - 0U, /* 5: - NA */ - 8U /* 6: OC4M, OC4FE, OC4PE */ -}; - -static const uint8_t SHIFT_TAB_ICxx[] = -{ - 0U, /* 0: CC1S, IC1PSC, IC1F */ - 0U, /* 1: - NA */ - 8U, /* 2: CC2S, IC2PSC, IC2F */ - 0U, /* 3: - NA */ - 0U, /* 4: CC3S, IC3PSC, IC3F */ - 0U, /* 5: - NA */ - 8U /* 6: CC4S, IC4PSC, IC4F */ -}; - -static const uint8_t SHIFT_TAB_CCxP[] = -{ - 0U, /* 0: CC1P */ - 2U, /* 1: CC1NP */ - 4U, /* 2: CC2P */ - 6U, /* 3: CC2NP */ - 8U, /* 4: CC3P */ - 10U, /* 5: CC3NP */ - 12U /* 6: CC4P */ -}; - -static const uint8_t SHIFT_TAB_OISx[] = -{ - 0U, /* 0: OIS1 */ - 1U, /* 1: OIS1N */ - 2U, /* 2: OIS2 */ - 3U, /* 3: OIS2N */ - 4U, /* 4: OIS3 */ - 5U, /* 5: OIS3N */ - 6U /* 6: OIS4 */ -}; -/** - * @} - */ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup TIM_LL_Private_Constants TIM Private Constants - * @{ - */ - - -/* Remap mask definitions */ -#define TIMx_OR_RMP_SHIFT 16U -#define TIMx_OR_RMP_MASK 0x0000FFFFU -#define TIM2_OR_RMP_MASK (TIM_OR_ITR1_RMP << TIMx_OR_RMP_SHIFT) -#define TIM5_OR_RMP_MASK (TIM_OR_TI4_RMP << TIMx_OR_RMP_SHIFT) -#define TIM11_OR_RMP_MASK (TIM_OR_TI1_RMP << TIMx_OR_RMP_SHIFT) - -/* Mask used to set the TDG[x:0] of the DTG bits of the TIMx_BDTR register */ -#define DT_DELAY_1 ((uint8_t)0x7F) -#define DT_DELAY_2 ((uint8_t)0x3F) -#define DT_DELAY_3 ((uint8_t)0x1F) -#define DT_DELAY_4 ((uint8_t)0x1F) - -/* Mask used to set the DTG[7:5] bits of the DTG bits of the TIMx_BDTR register */ -#define DT_RANGE_1 ((uint8_t)0x00) -#define DT_RANGE_2 ((uint8_t)0x80) -#define DT_RANGE_3 ((uint8_t)0xC0) -#define DT_RANGE_4 ((uint8_t)0xE0) - - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup TIM_LL_Private_Macros TIM Private Macros - * @{ - */ -/** @brief Convert channel id into channel index. - * @param __CHANNEL__ This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval none - */ -#define TIM_GET_CHANNEL_INDEX( __CHANNEL__) \ - (((__CHANNEL__) == LL_TIM_CHANNEL_CH1) ? 0U :\ - ((__CHANNEL__) == LL_TIM_CHANNEL_CH1N) ? 1U :\ - ((__CHANNEL__) == LL_TIM_CHANNEL_CH2) ? 2U :\ - ((__CHANNEL__) == LL_TIM_CHANNEL_CH2N) ? 3U :\ - ((__CHANNEL__) == LL_TIM_CHANNEL_CH3) ? 4U :\ - ((__CHANNEL__) == LL_TIM_CHANNEL_CH3N) ? 5U : 6U) - -/** @brief Calculate the deadtime sampling period(in ps). - * @param __TIMCLK__ timer input clock frequency (in Hz). - * @param __CKD__ This parameter can be one of the following values: - * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 - * @retval none - */ -#define TIM_CALC_DTS(__TIMCLK__, __CKD__) \ - (((__CKD__) == LL_TIM_CLOCKDIVISION_DIV1) ? ((uint64_t)1000000000000U/(__TIMCLK__)) : \ - ((__CKD__) == LL_TIM_CLOCKDIVISION_DIV2) ? ((uint64_t)1000000000000U/((__TIMCLK__) >> 1U)) : \ - ((uint64_t)1000000000000U/((__TIMCLK__) >> 2U))) -/** - * @} - */ - - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup TIM_LL_ES_INIT TIM Exported Init structure - * @{ - */ - -/** - * @brief TIM Time Base configuration structure definition. - */ -typedef struct -{ - uint16_t Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. - This parameter can be a number between Min_Data=0x0000 and Max_Data=0xFFFF. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetPrescaler().*/ - - uint32_t CounterMode; /*!< Specifies the counter mode. - This parameter can be a value of @ref TIM_LL_EC_COUNTERMODE. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetCounterMode().*/ - - uint32_t Autoreload; /*!< Specifies the auto reload value to be loaded into the active - Auto-Reload Register at the next update event. - This parameter must be a number between Min_Data=0x0000 and Max_Data=0xFFFF. - Some timer instances may support 32 bits counters. In that case this parameter must - be a number between 0x0000 and 0xFFFFFFFF. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetAutoReload().*/ - - uint32_t ClockDivision; /*!< Specifies the clock division. - This parameter can be a value of @ref TIM_LL_EC_CLOCKDIVISION. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetClockDivision().*/ - - uint32_t RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter - reaches zero, an update event is generated and counting restarts - from the RCR value (N). - This means in PWM mode that (N+1) corresponds to: - - the number of PWM periods in edge-aligned mode - - the number of half PWM period in center-aligned mode - GP timers: this parameter must be a number between Min_Data = 0x00 and - Max_Data = 0xFF. - Advanced timers: this parameter must be a number between Min_Data = 0x0000 and - Max_Data = 0xFFFF. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetRepetitionCounter().*/ -} LL_TIM_InitTypeDef; - -/** - * @brief TIM Output Compare configuration structure definition. - */ -typedef struct -{ - uint32_t OCMode; /*!< Specifies the output mode. - This parameter can be a value of @ref TIM_LL_EC_OCMODE. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetMode().*/ - - uint32_t OCState; /*!< Specifies the TIM Output Compare state. - This parameter can be a value of @ref TIM_LL_EC_OCSTATE. - - This feature can be modified afterwards using unitary functions - @ref LL_TIM_CC_EnableChannel() or @ref LL_TIM_CC_DisableChannel().*/ - - uint32_t OCNState; /*!< Specifies the TIM complementary Output Compare state. - This parameter can be a value of @ref TIM_LL_EC_OCSTATE. - - This feature can be modified afterwards using unitary functions - @ref LL_TIM_CC_EnableChannel() or @ref LL_TIM_CC_DisableChannel().*/ - - uint32_t CompareValue; /*!< Specifies the Compare value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data=0x0000 and Max_Data=0xFFFF. - - This feature can be modified afterwards using unitary function - LL_TIM_OC_SetCompareCHx (x=1..6).*/ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_LL_EC_OCPOLARITY. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetPolarity().*/ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_LL_EC_OCPOLARITY. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetPolarity().*/ - - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_LL_EC_OCIDLESTATE. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetIdleState().*/ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_LL_EC_OCIDLESTATE. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetIdleState().*/ -} LL_TIM_OC_InitTypeDef; - -/** - * @brief TIM Input Capture configuration structure definition. - */ - -typedef struct -{ - - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPolarity().*/ - - uint32_t ICActiveInput; /*!< Specifies the input. - This parameter can be a value of @ref TIM_LL_EC_ACTIVEINPUT. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetActiveInput().*/ - - uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_LL_EC_ICPSC. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPrescaler().*/ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a value of @ref TIM_LL_EC_IC_FILTER. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetFilter().*/ -} LL_TIM_IC_InitTypeDef; - - -/** - * @brief TIM Encoder interface configuration structure definition. - */ -typedef struct -{ - uint32_t EncoderMode; /*!< Specifies the encoder resolution (x2 or x4). - This parameter can be a value of @ref TIM_LL_EC_ENCODERMODE. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetEncoderMode().*/ - - uint32_t IC1Polarity; /*!< Specifies the active edge of TI1 input. - This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPolarity().*/ - - uint32_t IC1ActiveInput; /*!< Specifies the TI1 input source - This parameter can be a value of @ref TIM_LL_EC_ACTIVEINPUT. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetActiveInput().*/ - - uint32_t IC1Prescaler; /*!< Specifies the TI1 input prescaler value. - This parameter can be a value of @ref TIM_LL_EC_ICPSC. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPrescaler().*/ - - uint32_t IC1Filter; /*!< Specifies the TI1 input filter. - This parameter can be a value of @ref TIM_LL_EC_IC_FILTER. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetFilter().*/ - - uint32_t IC2Polarity; /*!< Specifies the active edge of TI2 input. - This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPolarity().*/ - - uint32_t IC2ActiveInput; /*!< Specifies the TI2 input source - This parameter can be a value of @ref TIM_LL_EC_ACTIVEINPUT. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetActiveInput().*/ - - uint32_t IC2Prescaler; /*!< Specifies the TI2 input prescaler value. - This parameter can be a value of @ref TIM_LL_EC_ICPSC. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPrescaler().*/ - - uint32_t IC2Filter; /*!< Specifies the TI2 input filter. - This parameter can be a value of @ref TIM_LL_EC_IC_FILTER. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetFilter().*/ - -} LL_TIM_ENCODER_InitTypeDef; - -/** - * @brief TIM Hall sensor interface configuration structure definition. - */ -typedef struct -{ - - uint32_t IC1Polarity; /*!< Specifies the active edge of TI1 input. - This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPolarity().*/ - - uint32_t IC1Prescaler; /*!< Specifies the TI1 input prescaler value. - Prescaler must be set to get a maximum counter period longer than the - time interval between 2 consecutive changes on the Hall inputs. - This parameter can be a value of @ref TIM_LL_EC_ICPSC. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetPrescaler().*/ - - uint32_t IC1Filter; /*!< Specifies the TI1 input filter. - This parameter can be a value of - @ref TIM_LL_EC_IC_FILTER. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_IC_SetFilter().*/ - - uint32_t CommutationDelay; /*!< Specifies the compare value to be loaded into the Capture Compare Register. - A positive pulse (TRGO event) is generated with a programmable delay every time - a change occurs on the Hall inputs. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetCompareCH2().*/ -} LL_TIM_HALLSENSOR_InitTypeDef; - -/** - * @brief BDTR (Break and Dead Time) structure definition - */ -typedef struct -{ - uint32_t OSSRState; /*!< Specifies the Off-State selection used in Run mode. - This parameter can be a value of @ref TIM_LL_EC_OSSR - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetOffStates() - - @note This bit-field cannot be modified as long as LOCK level 2 has been - programmed. */ - - uint32_t OSSIState; /*!< Specifies the Off-State used in Idle state. - This parameter can be a value of @ref TIM_LL_EC_OSSI - - This feature can be modified afterwards using unitary function - @ref LL_TIM_SetOffStates() - - @note This bit-field cannot be modified as long as LOCK level 2 has been - programmed. */ - - uint32_t LockLevel; /*!< Specifies the LOCK level parameters. - This parameter can be a value of @ref TIM_LL_EC_LOCKLEVEL - - @note The LOCK bits can be written only once after the reset. Once the TIMx_BDTR - register has been written, their content is frozen until the next reset.*/ - - uint8_t DeadTime; /*!< Specifies the delay time between the switching-off and the - switching-on of the outputs. - This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF. - - This feature can be modified afterwards using unitary function - @ref LL_TIM_OC_SetDeadTime() - - @note This bit-field can not be modified as long as LOCK level 1, 2 or 3 has been - programmed. */ - - uint16_t BreakState; /*!< Specifies whether the TIM Break input is enabled or not. - This parameter can be a value of @ref TIM_LL_EC_BREAK_ENABLE - - This feature can be modified afterwards using unitary functions - @ref LL_TIM_EnableBRK() or @ref LL_TIM_DisableBRK() - - @note This bit-field can not be modified as long as LOCK level 1 has been - programmed. */ - - uint32_t BreakPolarity; /*!< Specifies the TIM Break Input pin polarity. - This parameter can be a value of @ref TIM_LL_EC_BREAK_POLARITY - - This feature can be modified afterwards using unitary function - @ref LL_TIM_ConfigBRK() - - @note This bit-field can not be modified as long as LOCK level 1 has been - programmed. */ - - uint32_t AutomaticOutput; /*!< Specifies whether the TIM Automatic Output feature is enabled or not. - This parameter can be a value of @ref TIM_LL_EC_AUTOMATICOUTPUT_ENABLE - - This feature can be modified afterwards using unitary functions - @ref LL_TIM_EnableAutomaticOutput() or @ref LL_TIM_DisableAutomaticOutput() - - @note This bit-field can not be modified as long as LOCK level 1 has been - programmed. */ -} LL_TIM_BDTR_InitTypeDef; - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIM_LL_Exported_Constants TIM Exported Constants - * @{ - */ - -/** @defgroup TIM_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_TIM_ReadReg function. - * @{ - */ -#define LL_TIM_SR_UIF TIM_SR_UIF /*!< Update interrupt flag */ -#define LL_TIM_SR_CC1IF TIM_SR_CC1IF /*!< Capture/compare 1 interrupt flag */ -#define LL_TIM_SR_CC2IF TIM_SR_CC2IF /*!< Capture/compare 2 interrupt flag */ -#define LL_TIM_SR_CC3IF TIM_SR_CC3IF /*!< Capture/compare 3 interrupt flag */ -#define LL_TIM_SR_CC4IF TIM_SR_CC4IF /*!< Capture/compare 4 interrupt flag */ -#define LL_TIM_SR_COMIF TIM_SR_COMIF /*!< COM interrupt flag */ -#define LL_TIM_SR_TIF TIM_SR_TIF /*!< Trigger interrupt flag */ -#define LL_TIM_SR_BIF TIM_SR_BIF /*!< Break interrupt flag */ -#define LL_TIM_SR_CC1OF TIM_SR_CC1OF /*!< Capture/Compare 1 overcapture flag */ -#define LL_TIM_SR_CC2OF TIM_SR_CC2OF /*!< Capture/Compare 2 overcapture flag */ -#define LL_TIM_SR_CC3OF TIM_SR_CC3OF /*!< Capture/Compare 3 overcapture flag */ -#define LL_TIM_SR_CC4OF TIM_SR_CC4OF /*!< Capture/Compare 4 overcapture flag */ -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup TIM_LL_EC_BREAK_ENABLE Break Enable - * @{ - */ -#define LL_TIM_BREAK_DISABLE 0x00000000U /*!< Break function disabled */ -#define LL_TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break function enabled */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_AUTOMATICOUTPUT_ENABLE Automatic output enable - * @{ - */ -#define LL_TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /*!< MOE can be set only by software */ -#define LL_TIM_AUTOMATICOUTPUT_ENABLE TIM_BDTR_AOE /*!< MOE can be set by software or automatically at the next update event */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** @defgroup TIM_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_TIM_ReadReg and LL_TIM_WriteReg functions. - * @{ - */ -#define LL_TIM_DIER_UIE TIM_DIER_UIE /*!< Update interrupt enable */ -#define LL_TIM_DIER_CC1IE TIM_DIER_CC1IE /*!< Capture/compare 1 interrupt enable */ -#define LL_TIM_DIER_CC2IE TIM_DIER_CC2IE /*!< Capture/compare 2 interrupt enable */ -#define LL_TIM_DIER_CC3IE TIM_DIER_CC3IE /*!< Capture/compare 3 interrupt enable */ -#define LL_TIM_DIER_CC4IE TIM_DIER_CC4IE /*!< Capture/compare 4 interrupt enable */ -#define LL_TIM_DIER_COMIE TIM_DIER_COMIE /*!< COM interrupt enable */ -#define LL_TIM_DIER_TIE TIM_DIER_TIE /*!< Trigger interrupt enable */ -#define LL_TIM_DIER_BIE TIM_DIER_BIE /*!< Break interrupt enable */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_UPDATESOURCE Update Source - * @{ - */ -#define LL_TIM_UPDATESOURCE_REGULAR 0x00000000U /*!< Counter overflow/underflow, Setting the UG bit or Update generation through the slave mode controller generates an update request */ -#define LL_TIM_UPDATESOURCE_COUNTER TIM_CR1_URS /*!< Only counter overflow/underflow generates an update request */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_ONEPULSEMODE One Pulse Mode - * @{ - */ -#define LL_TIM_ONEPULSEMODE_SINGLE TIM_CR1_OPM /*!< Counter stops counting at the next update event */ -#define LL_TIM_ONEPULSEMODE_REPETITIVE 0x00000000U /*!< Counter is not stopped at update event */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_COUNTERMODE Counter Mode - * @{ - */ -#define LL_TIM_COUNTERMODE_UP 0x00000000U /*!< Counter used as upcounter */ -#define LL_TIM_COUNTERMODE_DOWN TIM_CR1_DIR /*!< Counter used as downcounter */ -#define LL_TIM_COUNTERMODE_CENTER_DOWN TIM_CR1_CMS_0 /*!< The counter counts up and down alternatively. Output compare interrupt flags of output channels are set only when the counter is counting down. */ -#define LL_TIM_COUNTERMODE_CENTER_UP TIM_CR1_CMS_1 /*!< The counter counts up and down alternatively. Output compare interrupt flags of output channels are set only when the counter is counting up */ -#define LL_TIM_COUNTERMODE_CENTER_UP_DOWN TIM_CR1_CMS /*!< The counter counts up and down alternatively. Output compare interrupt flags of output channels are set only when the counter is counting up or down. */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_CLOCKDIVISION Clock Division - * @{ - */ -#define LL_TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< tDTS=tCK_INT */ -#define LL_TIM_CLOCKDIVISION_DIV2 TIM_CR1_CKD_0 /*!< tDTS=2*tCK_INT */ -#define LL_TIM_CLOCKDIVISION_DIV4 TIM_CR1_CKD_1 /*!< tDTS=4*tCK_INT */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_COUNTERDIRECTION Counter Direction - * @{ - */ -#define LL_TIM_COUNTERDIRECTION_UP 0x00000000U /*!< Timer counter counts up */ -#define LL_TIM_COUNTERDIRECTION_DOWN TIM_CR1_DIR /*!< Timer counter counts down */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_CCUPDATESOURCE Capture Compare Update Source - * @{ - */ -#define LL_TIM_CCUPDATESOURCE_COMG_ONLY 0x00000000U /*!< Capture/compare control bits are updated by setting the COMG bit only */ -#define LL_TIM_CCUPDATESOURCE_COMG_AND_TRGI TIM_CR2_CCUS /*!< Capture/compare control bits are updated by setting the COMG bit or when a rising edge occurs on trigger input (TRGI) */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_CCDMAREQUEST Capture Compare DMA Request - * @{ - */ -#define LL_TIM_CCDMAREQUEST_CC 0x00000000U /*!< CCx DMA request sent when CCx event occurs */ -#define LL_TIM_CCDMAREQUEST_UPDATE TIM_CR2_CCDS /*!< CCx DMA requests sent when update event occurs */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_LOCKLEVEL Lock Level - * @{ - */ -#define LL_TIM_LOCKLEVEL_OFF 0x00000000U /*!< LOCK OFF - No bit is write protected */ -#define LL_TIM_LOCKLEVEL_1 TIM_BDTR_LOCK_0 /*!< LOCK Level 1 */ -#define LL_TIM_LOCKLEVEL_2 TIM_BDTR_LOCK_1 /*!< LOCK Level 2 */ -#define LL_TIM_LOCKLEVEL_3 TIM_BDTR_LOCK /*!< LOCK Level 3 */ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_CHANNEL Channel - * @{ - */ -#define LL_TIM_CHANNEL_CH1 TIM_CCER_CC1E /*!< Timer input/output channel 1 */ -#define LL_TIM_CHANNEL_CH1N TIM_CCER_CC1NE /*!< Timer complementary output channel 1 */ -#define LL_TIM_CHANNEL_CH2 TIM_CCER_CC2E /*!< Timer input/output channel 2 */ -#define LL_TIM_CHANNEL_CH2N TIM_CCER_CC2NE /*!< Timer complementary output channel 2 */ -#define LL_TIM_CHANNEL_CH3 TIM_CCER_CC3E /*!< Timer input/output channel 3 */ -#define LL_TIM_CHANNEL_CH3N TIM_CCER_CC3NE /*!< Timer complementary output channel 3 */ -#define LL_TIM_CHANNEL_CH4 TIM_CCER_CC4E /*!< Timer input/output channel 4 */ -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup TIM_LL_EC_OCSTATE Output Configuration State - * @{ - */ -#define LL_TIM_OCSTATE_DISABLE 0x00000000U /*!< OCx is not active */ -#define LL_TIM_OCSTATE_ENABLE TIM_CCER_CC1E /*!< OCx signal is output on the corresponding output pin */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** @defgroup TIM_LL_EC_OCMODE Output Configuration Mode - * @{ - */ -#define LL_TIM_OCMODE_FROZEN 0x00000000U /*!TIMx_CCRy else active.*/ -#define LL_TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!TIMx_CCRy else inactive*/ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_OCPOLARITY Output Configuration Polarity - * @{ - */ -#define LL_TIM_OCPOLARITY_HIGH 0x00000000U /*!< OCxactive high*/ -#define LL_TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< OCxactive low*/ -/** - * @} - */ - -/** @defgroup TIM_LL_EC_OCIDLESTATE Output Configuration Idle State - * @{ - */ -#define LL_TIM_OCIDLESTATE_LOW 0x00000000U /*!__REG__, (__VALUE__)) - -/** - * @brief Read a value in TIM register. - * @param __INSTANCE__ TIM Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_TIM_ReadReg(__INSTANCE__, __REG__) READ_REG((__INSTANCE__)->__REG__) -/** - * @} - */ - -/** - * @brief HELPER macro calculating DTG[0:7] in the TIMx_BDTR register to achieve the requested dead time duration. - * @note ex: @ref __LL_TIM_CALC_DEADTIME (80000000, @ref LL_TIM_GetClockDivision (), 120); - * @param __TIMCLK__ timer input clock frequency (in Hz) - * @param __CKD__ This parameter can be one of the following values: - * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 - * @param __DT__ deadtime duration (in ns) - * @retval DTG[0:7] - */ -#define __LL_TIM_CALC_DEADTIME(__TIMCLK__, __CKD__, __DT__) \ - ( (((uint64_t)((__DT__)*1000U)) < ((DT_DELAY_1+1U) * TIM_CALC_DTS((__TIMCLK__), (__CKD__)))) ? \ - (uint8_t)(((uint64_t)((__DT__)*1000U) / TIM_CALC_DTS((__TIMCLK__), (__CKD__))) & DT_DELAY_1) : \ - (((uint64_t)((__DT__)*1000U)) < ((64U + (DT_DELAY_2+1U)) * 2U * TIM_CALC_DTS((__TIMCLK__), (__CKD__)))) ? \ - (uint8_t)(DT_RANGE_2 | ((uint8_t)((uint8_t)((((uint64_t)((__DT__)*1000U))/ TIM_CALC_DTS((__TIMCLK__), \ - (__CKD__))) >> 1U) - (uint8_t) 64) & DT_DELAY_2)) :\ - (((uint64_t)((__DT__)*1000U)) < ((32U + (DT_DELAY_3+1U)) * 8U * TIM_CALC_DTS((__TIMCLK__), (__CKD__)))) ? \ - (uint8_t)(DT_RANGE_3 | ((uint8_t)((uint8_t)(((((uint64_t)(__DT__)*1000U))/ TIM_CALC_DTS((__TIMCLK__), \ - (__CKD__))) >> 3U) - (uint8_t) 32) & DT_DELAY_3)) :\ - (((uint64_t)((__DT__)*1000U)) < ((32U + (DT_DELAY_4+1U)) * 16U * TIM_CALC_DTS((__TIMCLK__), (__CKD__)))) ? \ - (uint8_t)(DT_RANGE_4 | ((uint8_t)((uint8_t)(((((uint64_t)(__DT__)*1000U))/ TIM_CALC_DTS((__TIMCLK__), \ - (__CKD__))) >> 4U) - (uint8_t) 32) & DT_DELAY_4)) :\ - 0U) - -/** - * @brief HELPER macro calculating the prescaler value to achieve the required counter clock frequency. - * @note ex: @ref __LL_TIM_CALC_PSC (80000000, 1000000); - * @param __TIMCLK__ timer input clock frequency (in Hz) - * @param __CNTCLK__ counter clock frequency (in Hz) - * @retval Prescaler value (between Min_Data=0 and Max_Data=65535) - */ -#define __LL_TIM_CALC_PSC(__TIMCLK__, __CNTCLK__) \ - (((__TIMCLK__) >= (__CNTCLK__)) ? (uint32_t)((((__TIMCLK__) + (__CNTCLK__)/2U)/(__CNTCLK__)) - 1U) : 0U) - -/** - * @brief HELPER macro calculating the auto-reload value to achieve the required output signal frequency. - * @note ex: @ref __LL_TIM_CALC_ARR (1000000, @ref LL_TIM_GetPrescaler (), 10000); - * @param __TIMCLK__ timer input clock frequency (in Hz) - * @param __PSC__ prescaler - * @param __FREQ__ output signal frequency (in Hz) - * @retval Auto-reload value (between Min_Data=0 and Max_Data=65535) - */ -#define __LL_TIM_CALC_ARR(__TIMCLK__, __PSC__, __FREQ__) \ - ((((__TIMCLK__)/((__PSC__) + 1U)) >= (__FREQ__)) ? (((__TIMCLK__)/((__FREQ__) * ((__PSC__) + 1U))) - 1U) : 0U) - -/** - * @brief HELPER macro calculating the compare value required to achieve the required timer output compare - * active/inactive delay. - * @note ex: @ref __LL_TIM_CALC_DELAY (1000000, @ref LL_TIM_GetPrescaler (), 10); - * @param __TIMCLK__ timer input clock frequency (in Hz) - * @param __PSC__ prescaler - * @param __DELAY__ timer output compare active/inactive delay (in us) - * @retval Compare value (between Min_Data=0 and Max_Data=65535) - */ -#define __LL_TIM_CALC_DELAY(__TIMCLK__, __PSC__, __DELAY__) \ - ((uint32_t)(((uint64_t)(__TIMCLK__) * (uint64_t)(__DELAY__)) \ - / ((uint64_t)1000000U * (uint64_t)((__PSC__) + 1U)))) - -/** - * @brief HELPER macro calculating the auto-reload value to achieve the required pulse duration - * (when the timer operates in one pulse mode). - * @note ex: @ref __LL_TIM_CALC_PULSE (1000000, @ref LL_TIM_GetPrescaler (), 10, 20); - * @param __TIMCLK__ timer input clock frequency (in Hz) - * @param __PSC__ prescaler - * @param __DELAY__ timer output compare active/inactive delay (in us) - * @param __PULSE__ pulse duration (in us) - * @retval Auto-reload value (between Min_Data=0 and Max_Data=65535) - */ -#define __LL_TIM_CALC_PULSE(__TIMCLK__, __PSC__, __DELAY__, __PULSE__) \ - ((uint32_t)(__LL_TIM_CALC_DELAY((__TIMCLK__), (__PSC__), (__PULSE__)) \ - + __LL_TIM_CALC_DELAY((__TIMCLK__), (__PSC__), (__DELAY__)))) - -/** - * @brief HELPER macro retrieving the ratio of the input capture prescaler - * @note ex: @ref __LL_TIM_GET_ICPSC_RATIO (@ref LL_TIM_IC_GetPrescaler ()); - * @param __ICPSC__ This parameter can be one of the following values: - * @arg @ref LL_TIM_ICPSC_DIV1 - * @arg @ref LL_TIM_ICPSC_DIV2 - * @arg @ref LL_TIM_ICPSC_DIV4 - * @arg @ref LL_TIM_ICPSC_DIV8 - * @retval Input capture prescaler ratio (1, 2, 4 or 8) - */ -#define __LL_TIM_GET_ICPSC_RATIO(__ICPSC__) \ - ((uint32_t)(0x01U << (((__ICPSC__) >> 16U) >> TIM_CCMR1_IC1PSC_Pos))) - - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup TIM_LL_Exported_Functions TIM Exported Functions - * @{ - */ - -/** @defgroup TIM_LL_EF_Time_Base Time Base configuration - * @{ - */ -/** - * @brief Enable timer counter. - * @rmtoll CR1 CEN LL_TIM_EnableCounter - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableCounter(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->CR1, TIM_CR1_CEN); -} - -/** - * @brief Disable timer counter. - * @rmtoll CR1 CEN LL_TIM_DisableCounter - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableCounter(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->CR1, TIM_CR1_CEN); -} - -/** - * @brief Indicates whether the timer counter is enabled. - * @rmtoll CR1 CEN LL_TIM_IsEnabledCounter - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledCounter(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->CR1, TIM_CR1_CEN) == (TIM_CR1_CEN)) ? 1UL : 0UL); -} - -/** - * @brief Enable update event generation. - * @rmtoll CR1 UDIS LL_TIM_EnableUpdateEvent - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableUpdateEvent(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->CR1, TIM_CR1_UDIS); -} - -/** - * @brief Disable update event generation. - * @rmtoll CR1 UDIS LL_TIM_DisableUpdateEvent - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableUpdateEvent(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->CR1, TIM_CR1_UDIS); -} - -/** - * @brief Indicates whether update event generation is enabled. - * @rmtoll CR1 UDIS LL_TIM_IsEnabledUpdateEvent - * @param TIMx Timer instance - * @retval Inverted state of bit (0 or 1). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledUpdateEvent(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->CR1, TIM_CR1_UDIS) == (uint32_t)RESET) ? 1UL : 0UL); -} - -/** - * @brief Set update event source - * @note Update event source set to LL_TIM_UPDATESOURCE_REGULAR: any of the following events - * generate an update interrupt or DMA request if enabled: - * - Counter overflow/underflow - * - Setting the UG bit - * - Update generation through the slave mode controller - * @note Update event source set to LL_TIM_UPDATESOURCE_COUNTER: only counter - * overflow/underflow generates an update interrupt or DMA request if enabled. - * @rmtoll CR1 URS LL_TIM_SetUpdateSource - * @param TIMx Timer instance - * @param UpdateSource This parameter can be one of the following values: - * @arg @ref LL_TIM_UPDATESOURCE_REGULAR - * @arg @ref LL_TIM_UPDATESOURCE_COUNTER - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetUpdateSource(TIM_TypeDef *TIMx, uint32_t UpdateSource) -{ - MODIFY_REG(TIMx->CR1, TIM_CR1_URS, UpdateSource); -} - -/** - * @brief Get actual event update source - * @rmtoll CR1 URS LL_TIM_GetUpdateSource - * @param TIMx Timer instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_UPDATESOURCE_REGULAR - * @arg @ref LL_TIM_UPDATESOURCE_COUNTER - */ -__STATIC_INLINE uint32_t LL_TIM_GetUpdateSource(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_URS)); -} - -/** - * @brief Set one pulse mode (one shot v.s. repetitive). - * @rmtoll CR1 OPM LL_TIM_SetOnePulseMode - * @param TIMx Timer instance - * @param OnePulseMode This parameter can be one of the following values: - * @arg @ref LL_TIM_ONEPULSEMODE_SINGLE - * @arg @ref LL_TIM_ONEPULSEMODE_REPETITIVE - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetOnePulseMode(TIM_TypeDef *TIMx, uint32_t OnePulseMode) -{ - MODIFY_REG(TIMx->CR1, TIM_CR1_OPM, OnePulseMode); -} - -/** - * @brief Get actual one pulse mode. - * @rmtoll CR1 OPM LL_TIM_GetOnePulseMode - * @param TIMx Timer instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_ONEPULSEMODE_SINGLE - * @arg @ref LL_TIM_ONEPULSEMODE_REPETITIVE - */ -__STATIC_INLINE uint32_t LL_TIM_GetOnePulseMode(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_OPM)); -} - -/** - * @brief Set the timer counter counting mode. - * @note Macro IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx) can be used to - * check whether or not the counter mode selection feature is supported - * by a timer instance. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * @rmtoll CR1 DIR LL_TIM_SetCounterMode\n - * CR1 CMS LL_TIM_SetCounterMode - * @param TIMx Timer instance - * @param CounterMode This parameter can be one of the following values: - * @arg @ref LL_TIM_COUNTERMODE_UP - * @arg @ref LL_TIM_COUNTERMODE_DOWN - * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP - * @arg @ref LL_TIM_COUNTERMODE_CENTER_DOWN - * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP_DOWN - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetCounterMode(TIM_TypeDef *TIMx, uint32_t CounterMode) -{ - MODIFY_REG(TIMx->CR1, (TIM_CR1_DIR | TIM_CR1_CMS), CounterMode); -} - -/** - * @brief Get actual counter mode. - * @note Macro IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx) can be used to - * check whether or not the counter mode selection feature is supported - * by a timer instance. - * @rmtoll CR1 DIR LL_TIM_GetCounterMode\n - * CR1 CMS LL_TIM_GetCounterMode - * @param TIMx Timer instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_COUNTERMODE_UP - * @arg @ref LL_TIM_COUNTERMODE_DOWN - * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP - * @arg @ref LL_TIM_COUNTERMODE_CENTER_DOWN - * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP_DOWN - */ -__STATIC_INLINE uint32_t LL_TIM_GetCounterMode(const TIM_TypeDef *TIMx) -{ - uint32_t counter_mode; - - counter_mode = (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_CMS)); - - if (counter_mode == 0U) - { - counter_mode = (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_DIR)); - } - - return counter_mode; -} - -/** - * @brief Enable auto-reload (ARR) preload. - * @rmtoll CR1 ARPE LL_TIM_EnableARRPreload - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableARRPreload(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->CR1, TIM_CR1_ARPE); -} - -/** - * @brief Disable auto-reload (ARR) preload. - * @rmtoll CR1 ARPE LL_TIM_DisableARRPreload - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableARRPreload(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->CR1, TIM_CR1_ARPE); -} - -/** - * @brief Indicates whether auto-reload (ARR) preload is enabled. - * @rmtoll CR1 ARPE LL_TIM_IsEnabledARRPreload - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledARRPreload(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->CR1, TIM_CR1_ARPE) == (TIM_CR1_ARPE)) ? 1UL : 0UL); -} - -/** - * @brief Set the division ratio between the timer clock and the sampling clock used by the dead-time generators - * (when supported) and the digital filters. - * @note Macro IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx) can be used to check - * whether or not the clock division feature is supported by the timer - * instance. - * @rmtoll CR1 CKD LL_TIM_SetClockDivision - * @param TIMx Timer instance - * @param ClockDivision This parameter can be one of the following values: - * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetClockDivision(TIM_TypeDef *TIMx, uint32_t ClockDivision) -{ - MODIFY_REG(TIMx->CR1, TIM_CR1_CKD, ClockDivision); -} - -/** - * @brief Get the actual division ratio between the timer clock and the sampling clock used by the dead-time - * generators (when supported) and the digital filters. - * @note Macro IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx) can be used to check - * whether or not the clock division feature is supported by the timer - * instance. - * @rmtoll CR1 CKD LL_TIM_GetClockDivision - * @param TIMx Timer instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 - * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 - */ -__STATIC_INLINE uint32_t LL_TIM_GetClockDivision(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_CKD)); -} - -/** - * @brief Set the counter value. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @rmtoll CNT CNT LL_TIM_SetCounter - * @param TIMx Timer instance - * @param Counter Counter value (between Min_Data=0 and Max_Data=0xFFFF or 0xFFFFFFFF) - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetCounter(TIM_TypeDef *TIMx, uint32_t Counter) -{ - WRITE_REG(TIMx->CNT, Counter); -} - -/** - * @brief Get the counter value. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @rmtoll CNT CNT LL_TIM_GetCounter - * @param TIMx Timer instance - * @retval Counter value (between Min_Data=0 and Max_Data=0xFFFF or 0xFFFFFFFF) - */ -__STATIC_INLINE uint32_t LL_TIM_GetCounter(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CNT)); -} - -/** - * @brief Get the current direction of the counter - * @rmtoll CR1 DIR LL_TIM_GetDirection - * @param TIMx Timer instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_COUNTERDIRECTION_UP - * @arg @ref LL_TIM_COUNTERDIRECTION_DOWN - */ -__STATIC_INLINE uint32_t LL_TIM_GetDirection(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_DIR)); -} - -/** - * @brief Set the prescaler value. - * @note The counter clock frequency CK_CNT is equal to fCK_PSC / (PSC[15:0] + 1). - * @note The prescaler can be changed on the fly as this control register is buffered. The new - * prescaler ratio is taken into account at the next update event. - * @note Helper macro @ref __LL_TIM_CALC_PSC can be used to calculate the Prescaler parameter - * @rmtoll PSC PSC LL_TIM_SetPrescaler - * @param TIMx Timer instance - * @param Prescaler between Min_Data=0 and Max_Data=65535 - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetPrescaler(TIM_TypeDef *TIMx, uint32_t Prescaler) -{ - WRITE_REG(TIMx->PSC, Prescaler); -} - -/** - * @brief Get the prescaler value. - * @rmtoll PSC PSC LL_TIM_GetPrescaler - * @param TIMx Timer instance - * @retval Prescaler value between Min_Data=0 and Max_Data=65535 - */ -__STATIC_INLINE uint32_t LL_TIM_GetPrescaler(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->PSC)); -} - -/** - * @brief Set the auto-reload value. - * @note The counter is blocked while the auto-reload value is null. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Helper macro @ref __LL_TIM_CALC_ARR can be used to calculate the AutoReload parameter - * @rmtoll ARR ARR LL_TIM_SetAutoReload - * @param TIMx Timer instance - * @param AutoReload between Min_Data=0 and Max_Data=65535 - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetAutoReload(TIM_TypeDef *TIMx, uint32_t AutoReload) -{ - WRITE_REG(TIMx->ARR, AutoReload); -} - -/** - * @brief Get the auto-reload value. - * @rmtoll ARR ARR LL_TIM_GetAutoReload - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @param TIMx Timer instance - * @retval Auto-reload value - */ -__STATIC_INLINE uint32_t LL_TIM_GetAutoReload(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->ARR)); -} - -/** - * @brief Set the repetition counter value. - * @note Macro IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a repetition counter. - * @rmtoll RCR REP LL_TIM_SetRepetitionCounter - * @param TIMx Timer instance - * @param RepetitionCounter between Min_Data=0 and Max_Data=255 or 65535 for advanced timer. - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetRepetitionCounter(TIM_TypeDef *TIMx, uint32_t RepetitionCounter) -{ - WRITE_REG(TIMx->RCR, RepetitionCounter); -} - -/** - * @brief Get the repetition counter value. - * @note Macro IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a repetition counter. - * @rmtoll RCR REP LL_TIM_GetRepetitionCounter - * @param TIMx Timer instance - * @retval Repetition counter value - */ -__STATIC_INLINE uint32_t LL_TIM_GetRepetitionCounter(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->RCR)); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Capture_Compare Capture Compare configuration - * @{ - */ -/** - * @brief Enable the capture/compare control bits (CCxE, CCxNE and OCxM) preload. - * @note CCxE, CCxNE and OCxM bits are preloaded, after having been written, - * they are updated only when a commutation event (COM) occurs. - * @note Only on channels that have a complementary output. - * @note Macro IS_TIM_COMMUTATION_EVENT_INSTANCE(TIMx) can be used to check - * whether or not a timer instance is able to generate a commutation event. - * @rmtoll CR2 CCPC LL_TIM_CC_EnablePreload - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_EnablePreload(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->CR2, TIM_CR2_CCPC); -} - -/** - * @brief Disable the capture/compare control bits (CCxE, CCxNE and OCxM) preload. - * @note Macro IS_TIM_COMMUTATION_EVENT_INSTANCE(TIMx) can be used to check - * whether or not a timer instance is able to generate a commutation event. - * @rmtoll CR2 CCPC LL_TIM_CC_DisablePreload - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_DisablePreload(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->CR2, TIM_CR2_CCPC); -} - -/** - * @brief Indicates whether the capture/compare control bits (CCxE, CCxNE and OCxM) preload is enabled. - * @rmtoll CR2 CCPC LL_TIM_CC_IsEnabledPreload - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_CC_IsEnabledPreload(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->CR2, TIM_CR2_CCPC) == (TIM_CR2_CCPC)) ? 1UL : 0UL); -} - -/** - * @brief Set the updated source of the capture/compare control bits (CCxE, CCxNE and OCxM). - * @note Macro IS_TIM_COMMUTATION_EVENT_INSTANCE(TIMx) can be used to check - * whether or not a timer instance is able to generate a commutation event. - * @rmtoll CR2 CCUS LL_TIM_CC_SetUpdate - * @param TIMx Timer instance - * @param CCUpdateSource This parameter can be one of the following values: - * @arg @ref LL_TIM_CCUPDATESOURCE_COMG_ONLY - * @arg @ref LL_TIM_CCUPDATESOURCE_COMG_AND_TRGI - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_SetUpdate(TIM_TypeDef *TIMx, uint32_t CCUpdateSource) -{ - MODIFY_REG(TIMx->CR2, TIM_CR2_CCUS, CCUpdateSource); -} - -/** - * @brief Set the trigger of the capture/compare DMA request. - * @rmtoll CR2 CCDS LL_TIM_CC_SetDMAReqTrigger - * @param TIMx Timer instance - * @param DMAReqTrigger This parameter can be one of the following values: - * @arg @ref LL_TIM_CCDMAREQUEST_CC - * @arg @ref LL_TIM_CCDMAREQUEST_UPDATE - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_SetDMAReqTrigger(TIM_TypeDef *TIMx, uint32_t DMAReqTrigger) -{ - MODIFY_REG(TIMx->CR2, TIM_CR2_CCDS, DMAReqTrigger); -} - -/** - * @brief Get actual trigger of the capture/compare DMA request. - * @rmtoll CR2 CCDS LL_TIM_CC_GetDMAReqTrigger - * @param TIMx Timer instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_CCDMAREQUEST_CC - * @arg @ref LL_TIM_CCDMAREQUEST_UPDATE - */ -__STATIC_INLINE uint32_t LL_TIM_CC_GetDMAReqTrigger(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_BIT(TIMx->CR2, TIM_CR2_CCDS)); -} - -/** - * @brief Set the lock level to freeze the - * configuration of several capture/compare parameters. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * the lock mechanism is supported by a timer instance. - * @rmtoll BDTR LOCK LL_TIM_CC_SetLockLevel - * @param TIMx Timer instance - * @param LockLevel This parameter can be one of the following values: - * @arg @ref LL_TIM_LOCKLEVEL_OFF - * @arg @ref LL_TIM_LOCKLEVEL_1 - * @arg @ref LL_TIM_LOCKLEVEL_2 - * @arg @ref LL_TIM_LOCKLEVEL_3 - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_SetLockLevel(TIM_TypeDef *TIMx, uint32_t LockLevel) -{ - MODIFY_REG(TIMx->BDTR, TIM_BDTR_LOCK, LockLevel); -} - -/** - * @brief Enable capture/compare channels. - * @rmtoll CCER CC1E LL_TIM_CC_EnableChannel\n - * CCER CC1NE LL_TIM_CC_EnableChannel\n - * CCER CC2E LL_TIM_CC_EnableChannel\n - * CCER CC2NE LL_TIM_CC_EnableChannel\n - * CCER CC3E LL_TIM_CC_EnableChannel\n - * CCER CC3NE LL_TIM_CC_EnableChannel\n - * CCER CC4E LL_TIM_CC_EnableChannel - * @param TIMx Timer instance - * @param Channels This parameter can be a combination of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_EnableChannel(TIM_TypeDef *TIMx, uint32_t Channels) -{ - SET_BIT(TIMx->CCER, Channels); -} - -/** - * @brief Disable capture/compare channels. - * @rmtoll CCER CC1E LL_TIM_CC_DisableChannel\n - * CCER CC1NE LL_TIM_CC_DisableChannel\n - * CCER CC2E LL_TIM_CC_DisableChannel\n - * CCER CC2NE LL_TIM_CC_DisableChannel\n - * CCER CC3E LL_TIM_CC_DisableChannel\n - * CCER CC3NE LL_TIM_CC_DisableChannel\n - * CCER CC4E LL_TIM_CC_DisableChannel - * @param TIMx Timer instance - * @param Channels This parameter can be a combination of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_CC_DisableChannel(TIM_TypeDef *TIMx, uint32_t Channels) -{ - CLEAR_BIT(TIMx->CCER, Channels); -} - -/** - * @brief Indicate whether channel(s) is(are) enabled. - * @rmtoll CCER CC1E LL_TIM_CC_IsEnabledChannel\n - * CCER CC1NE LL_TIM_CC_IsEnabledChannel\n - * CCER CC2E LL_TIM_CC_IsEnabledChannel\n - * CCER CC2NE LL_TIM_CC_IsEnabledChannel\n - * CCER CC3E LL_TIM_CC_IsEnabledChannel\n - * CCER CC3NE LL_TIM_CC_IsEnabledChannel\n - * CCER CC4E LL_TIM_CC_IsEnabledChannel - * @param TIMx Timer instance - * @param Channels This parameter can be a combination of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_CC_IsEnabledChannel(const TIM_TypeDef *TIMx, uint32_t Channels) -{ - return ((READ_BIT(TIMx->CCER, Channels) == (Channels)) ? 1UL : 0UL); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Output_Channel Output channel configuration - * @{ - */ -/** - * @brief Configure an output channel. - * @rmtoll CCMR1 CC1S LL_TIM_OC_ConfigOutput\n - * CCMR1 CC2S LL_TIM_OC_ConfigOutput\n - * CCMR2 CC3S LL_TIM_OC_ConfigOutput\n - * CCMR2 CC4S LL_TIM_OC_ConfigOutput\n - * CCER CC1P LL_TIM_OC_ConfigOutput\n - * CCER CC2P LL_TIM_OC_ConfigOutput\n - * CCER CC3P LL_TIM_OC_ConfigOutput\n - * CCER CC4P LL_TIM_OC_ConfigOutput\n - * CR2 OIS1 LL_TIM_OC_ConfigOutput\n - * CR2 OIS2 LL_TIM_OC_ConfigOutput\n - * CR2 OIS3 LL_TIM_OC_ConfigOutput\n - * CR2 OIS4 LL_TIM_OC_ConfigOutput - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param Configuration This parameter must be a combination of all the following values: - * @arg @ref LL_TIM_OCPOLARITY_HIGH or @ref LL_TIM_OCPOLARITY_LOW - * @arg @ref LL_TIM_OCIDLESTATE_LOW or @ref LL_TIM_OCIDLESTATE_HIGH - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_ConfigOutput(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Configuration) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - CLEAR_BIT(*pReg, (TIM_CCMR1_CC1S << SHIFT_TAB_OCxx[iChannel])); - MODIFY_REG(TIMx->CCER, (TIM_CCER_CC1P << SHIFT_TAB_CCxP[iChannel]), - (Configuration & TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel]); - MODIFY_REG(TIMx->CR2, (TIM_CR2_OIS1 << SHIFT_TAB_OISx[iChannel]), - (Configuration & TIM_CR2_OIS1) << SHIFT_TAB_OISx[iChannel]); -} - -/** - * @brief Define the behavior of the output reference signal OCxREF from which - * OCx and OCxN (when relevant) are derived. - * @rmtoll CCMR1 OC1M LL_TIM_OC_SetMode\n - * CCMR1 OC2M LL_TIM_OC_SetMode\n - * CCMR2 OC3M LL_TIM_OC_SetMode\n - * CCMR2 OC4M LL_TIM_OC_SetMode - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_TIM_OCMODE_FROZEN - * @arg @ref LL_TIM_OCMODE_ACTIVE - * @arg @ref LL_TIM_OCMODE_INACTIVE - * @arg @ref LL_TIM_OCMODE_TOGGLE - * @arg @ref LL_TIM_OCMODE_FORCED_INACTIVE - * @arg @ref LL_TIM_OCMODE_FORCED_ACTIVE - * @arg @ref LL_TIM_OCMODE_PWM1 - * @arg @ref LL_TIM_OCMODE_PWM2 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetMode(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Mode) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - MODIFY_REG(*pReg, ((TIM_CCMR1_OC1M | TIM_CCMR1_CC1S) << SHIFT_TAB_OCxx[iChannel]), Mode << SHIFT_TAB_OCxx[iChannel]); -} - -/** - * @brief Get the output compare mode of an output channel. - * @rmtoll CCMR1 OC1M LL_TIM_OC_GetMode\n - * CCMR1 OC2M LL_TIM_OC_GetMode\n - * CCMR2 OC3M LL_TIM_OC_GetMode\n - * CCMR2 OC4M LL_TIM_OC_GetMode - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_OCMODE_FROZEN - * @arg @ref LL_TIM_OCMODE_ACTIVE - * @arg @ref LL_TIM_OCMODE_INACTIVE - * @arg @ref LL_TIM_OCMODE_TOGGLE - * @arg @ref LL_TIM_OCMODE_FORCED_INACTIVE - * @arg @ref LL_TIM_OCMODE_FORCED_ACTIVE - * @arg @ref LL_TIM_OCMODE_PWM1 - * @arg @ref LL_TIM_OCMODE_PWM2 - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetMode(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - return (READ_BIT(*pReg, ((TIM_CCMR1_OC1M | TIM_CCMR1_CC1S) << SHIFT_TAB_OCxx[iChannel])) >> SHIFT_TAB_OCxx[iChannel]); -} - -/** - * @brief Set the polarity of an output channel. - * @rmtoll CCER CC1P LL_TIM_OC_SetPolarity\n - * CCER CC1NP LL_TIM_OC_SetPolarity\n - * CCER CC2P LL_TIM_OC_SetPolarity\n - * CCER CC2NP LL_TIM_OC_SetPolarity\n - * CCER CC3P LL_TIM_OC_SetPolarity\n - * CCER CC3NP LL_TIM_OC_SetPolarity\n - * CCER CC4P LL_TIM_OC_SetPolarity - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param Polarity This parameter can be one of the following values: - * @arg @ref LL_TIM_OCPOLARITY_HIGH - * @arg @ref LL_TIM_OCPOLARITY_LOW - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetPolarity(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Polarity) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - MODIFY_REG(TIMx->CCER, (TIM_CCER_CC1P << SHIFT_TAB_CCxP[iChannel]), Polarity << SHIFT_TAB_CCxP[iChannel]); -} - -/** - * @brief Get the polarity of an output channel. - * @rmtoll CCER CC1P LL_TIM_OC_GetPolarity\n - * CCER CC1NP LL_TIM_OC_GetPolarity\n - * CCER CC2P LL_TIM_OC_GetPolarity\n - * CCER CC2NP LL_TIM_OC_GetPolarity\n - * CCER CC3P LL_TIM_OC_GetPolarity\n - * CCER CC3NP LL_TIM_OC_GetPolarity\n - * CCER CC4P LL_TIM_OC_GetPolarity - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_OCPOLARITY_HIGH - * @arg @ref LL_TIM_OCPOLARITY_LOW - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetPolarity(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - return (READ_BIT(TIMx->CCER, (TIM_CCER_CC1P << SHIFT_TAB_CCxP[iChannel])) >> SHIFT_TAB_CCxP[iChannel]); -} - -/** - * @brief Set the IDLE state of an output channel - * @note This function is significant only for the timer instances - * supporting the break feature. Macro IS_TIM_BREAK_INSTANCE(TIMx) - * can be used to check whether or not a timer instance provides - * a break input. - * @rmtoll CR2 OIS1 LL_TIM_OC_SetIdleState\n - * CR2 OIS1N LL_TIM_OC_SetIdleState\n - * CR2 OIS2 LL_TIM_OC_SetIdleState\n - * CR2 OIS2N LL_TIM_OC_SetIdleState\n - * CR2 OIS3 LL_TIM_OC_SetIdleState\n - * CR2 OIS3N LL_TIM_OC_SetIdleState\n - * CR2 OIS4 LL_TIM_OC_SetIdleState - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param IdleState This parameter can be one of the following values: - * @arg @ref LL_TIM_OCIDLESTATE_LOW - * @arg @ref LL_TIM_OCIDLESTATE_HIGH - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetIdleState(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t IdleState) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - MODIFY_REG(TIMx->CR2, (TIM_CR2_OIS1 << SHIFT_TAB_OISx[iChannel]), IdleState << SHIFT_TAB_OISx[iChannel]); -} - -/** - * @brief Get the IDLE state of an output channel - * @rmtoll CR2 OIS1 LL_TIM_OC_GetIdleState\n - * CR2 OIS1N LL_TIM_OC_GetIdleState\n - * CR2 OIS2 LL_TIM_OC_GetIdleState\n - * CR2 OIS2N LL_TIM_OC_GetIdleState\n - * CR2 OIS3 LL_TIM_OC_GetIdleState\n - * CR2 OIS3N LL_TIM_OC_GetIdleState\n - * CR2 OIS4 LL_TIM_OC_GetIdleState - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH1N - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH2N - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH3N - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_OCIDLESTATE_LOW - * @arg @ref LL_TIM_OCIDLESTATE_HIGH - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetIdleState(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - return (READ_BIT(TIMx->CR2, (TIM_CR2_OIS1 << SHIFT_TAB_OISx[iChannel])) >> SHIFT_TAB_OISx[iChannel]); -} - -/** - * @brief Enable fast mode for the output channel. - * @note Acts only if the channel is configured in PWM1 or PWM2 mode. - * @rmtoll CCMR1 OC1FE LL_TIM_OC_EnableFast\n - * CCMR1 OC2FE LL_TIM_OC_EnableFast\n - * CCMR2 OC3FE LL_TIM_OC_EnableFast\n - * CCMR2 OC4FE LL_TIM_OC_EnableFast - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_EnableFast(TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - SET_BIT(*pReg, (TIM_CCMR1_OC1FE << SHIFT_TAB_OCxx[iChannel])); - -} - -/** - * @brief Disable fast mode for the output channel. - * @rmtoll CCMR1 OC1FE LL_TIM_OC_DisableFast\n - * CCMR1 OC2FE LL_TIM_OC_DisableFast\n - * CCMR2 OC3FE LL_TIM_OC_DisableFast\n - * CCMR2 OC4FE LL_TIM_OC_DisableFast - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_DisableFast(TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - CLEAR_BIT(*pReg, (TIM_CCMR1_OC1FE << SHIFT_TAB_OCxx[iChannel])); - -} - -/** - * @brief Indicates whether fast mode is enabled for the output channel. - * @rmtoll CCMR1 OC1FE LL_TIM_OC_IsEnabledFast\n - * CCMR1 OC2FE LL_TIM_OC_IsEnabledFast\n - * CCMR2 OC3FE LL_TIM_OC_IsEnabledFast\n - * CCMR2 OC4FE LL_TIM_OC_IsEnabledFast\n - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_OC_IsEnabledFast(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - uint32_t bitfield = TIM_CCMR1_OC1FE << SHIFT_TAB_OCxx[iChannel]; - return ((READ_BIT(*pReg, bitfield) == bitfield) ? 1UL : 0UL); -} - -/** - * @brief Enable compare register (TIMx_CCRx) preload for the output channel. - * @rmtoll CCMR1 OC1PE LL_TIM_OC_EnablePreload\n - * CCMR1 OC2PE LL_TIM_OC_EnablePreload\n - * CCMR2 OC3PE LL_TIM_OC_EnablePreload\n - * CCMR2 OC4PE LL_TIM_OC_EnablePreload - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_EnablePreload(TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - SET_BIT(*pReg, (TIM_CCMR1_OC1PE << SHIFT_TAB_OCxx[iChannel])); -} - -/** - * @brief Disable compare register (TIMx_CCRx) preload for the output channel. - * @rmtoll CCMR1 OC1PE LL_TIM_OC_DisablePreload\n - * CCMR1 OC2PE LL_TIM_OC_DisablePreload\n - * CCMR2 OC3PE LL_TIM_OC_DisablePreload\n - * CCMR2 OC4PE LL_TIM_OC_DisablePreload - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_DisablePreload(TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - CLEAR_BIT(*pReg, (TIM_CCMR1_OC1PE << SHIFT_TAB_OCxx[iChannel])); -} - -/** - * @brief Indicates whether compare register (TIMx_CCRx) preload is enabled for the output channel. - * @rmtoll CCMR1 OC1PE LL_TIM_OC_IsEnabledPreload\n - * CCMR1 OC2PE LL_TIM_OC_IsEnabledPreload\n - * CCMR2 OC3PE LL_TIM_OC_IsEnabledPreload\n - * CCMR2 OC4PE LL_TIM_OC_IsEnabledPreload\n - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_OC_IsEnabledPreload(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - uint32_t bitfield = TIM_CCMR1_OC1PE << SHIFT_TAB_OCxx[iChannel]; - return ((READ_BIT(*pReg, bitfield) == bitfield) ? 1UL : 0UL); -} - -/** - * @brief Enable clearing the output channel on an external event. - * @note This function can only be used in Output compare and PWM modes. It does not work in Forced mode. - * @note Macro IS_TIM_OCXREF_CLEAR_INSTANCE(TIMx) can be used to check whether - * or not a timer instance can clear the OCxREF signal on an external event. - * @rmtoll CCMR1 OC1CE LL_TIM_OC_EnableClear\n - * CCMR1 OC2CE LL_TIM_OC_EnableClear\n - * CCMR2 OC3CE LL_TIM_OC_EnableClear\n - * CCMR2 OC4CE LL_TIM_OC_EnableClear - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_EnableClear(TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - SET_BIT(*pReg, (TIM_CCMR1_OC1CE << SHIFT_TAB_OCxx[iChannel])); -} - -/** - * @brief Disable clearing the output channel on an external event. - * @note Macro IS_TIM_OCXREF_CLEAR_INSTANCE(TIMx) can be used to check whether - * or not a timer instance can clear the OCxREF signal on an external event. - * @rmtoll CCMR1 OC1CE LL_TIM_OC_DisableClear\n - * CCMR1 OC2CE LL_TIM_OC_DisableClear\n - * CCMR2 OC3CE LL_TIM_OC_DisableClear\n - * CCMR2 OC4CE LL_TIM_OC_DisableClear - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_DisableClear(TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - CLEAR_BIT(*pReg, (TIM_CCMR1_OC1CE << SHIFT_TAB_OCxx[iChannel])); -} - -/** - * @brief Indicates clearing the output channel on an external event is enabled for the output channel. - * @note This function enables clearing the output channel on an external event. - * @note This function can only be used in Output compare and PWM modes. It does not work in Forced mode. - * @note Macro IS_TIM_OCXREF_CLEAR_INSTANCE(TIMx) can be used to check whether - * or not a timer instance can clear the OCxREF signal on an external event. - * @rmtoll CCMR1 OC1CE LL_TIM_OC_IsEnabledClear\n - * CCMR1 OC2CE LL_TIM_OC_IsEnabledClear\n - * CCMR2 OC3CE LL_TIM_OC_IsEnabledClear\n - * CCMR2 OC4CE LL_TIM_OC_IsEnabledClear\n - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_OC_IsEnabledClear(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - uint32_t bitfield = TIM_CCMR1_OC1CE << SHIFT_TAB_OCxx[iChannel]; - return ((READ_BIT(*pReg, bitfield) == bitfield) ? 1UL : 0UL); -} - -/** - * @brief Set the dead-time delay (delay inserted between the rising edge of the OCxREF signal and the rising edge of - * the Ocx and OCxN signals). - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * dead-time insertion feature is supported by a timer instance. - * @note Helper macro @ref __LL_TIM_CALC_DEADTIME can be used to calculate the DeadTime parameter - * @rmtoll BDTR DTG LL_TIM_OC_SetDeadTime - * @param TIMx Timer instance - * @param DeadTime between Min_Data=0 and Max_Data=255 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetDeadTime(TIM_TypeDef *TIMx, uint32_t DeadTime) -{ - MODIFY_REG(TIMx->BDTR, TIM_BDTR_DTG, DeadTime); -} - -/** - * @brief Set compare value for output channel 1 (TIMx_CCR1). - * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC1_INSTANCE(TIMx) can be used to check whether or not - * output channel 1 is supported by a timer instance. - * @rmtoll CCR1 CCR1 LL_TIM_OC_SetCompareCH1 - * @param TIMx Timer instance - * @param CompareValue between Min_Data=0 and Max_Data=65535 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetCompareCH1(TIM_TypeDef *TIMx, uint32_t CompareValue) -{ - WRITE_REG(TIMx->CCR1, CompareValue); -} - -/** - * @brief Set compare value for output channel 2 (TIMx_CCR2). - * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC2_INSTANCE(TIMx) can be used to check whether or not - * output channel 2 is supported by a timer instance. - * @rmtoll CCR2 CCR2 LL_TIM_OC_SetCompareCH2 - * @param TIMx Timer instance - * @param CompareValue between Min_Data=0 and Max_Data=65535 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetCompareCH2(TIM_TypeDef *TIMx, uint32_t CompareValue) -{ - WRITE_REG(TIMx->CCR2, CompareValue); -} - -/** - * @brief Set compare value for output channel 3 (TIMx_CCR3). - * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC3_INSTANCE(TIMx) can be used to check whether or not - * output channel is supported by a timer instance. - * @rmtoll CCR3 CCR3 LL_TIM_OC_SetCompareCH3 - * @param TIMx Timer instance - * @param CompareValue between Min_Data=0 and Max_Data=65535 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetCompareCH3(TIM_TypeDef *TIMx, uint32_t CompareValue) -{ - WRITE_REG(TIMx->CCR3, CompareValue); -} - -/** - * @brief Set compare value for output channel 4 (TIMx_CCR4). - * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC4_INSTANCE(TIMx) can be used to check whether or not - * output channel 4 is supported by a timer instance. - * @rmtoll CCR4 CCR4 LL_TIM_OC_SetCompareCH4 - * @param TIMx Timer instance - * @param CompareValue between Min_Data=0 and Max_Data=65535 - * @retval None - */ -__STATIC_INLINE void LL_TIM_OC_SetCompareCH4(TIM_TypeDef *TIMx, uint32_t CompareValue) -{ - WRITE_REG(TIMx->CCR4, CompareValue); -} - -/** - * @brief Get compare value (TIMx_CCR1) set for output channel 1. - * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC1_INSTANCE(TIMx) can be used to check whether or not - * output channel 1 is supported by a timer instance. - * @rmtoll CCR1 CCR1 LL_TIM_OC_GetCompareCH1 - * @param TIMx Timer instance - * @retval CompareValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH1(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR1)); -} - -/** - * @brief Get compare value (TIMx_CCR2) set for output channel 2. - * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC2_INSTANCE(TIMx) can be used to check whether or not - * output channel 2 is supported by a timer instance. - * @rmtoll CCR2 CCR2 LL_TIM_OC_GetCompareCH2 - * @param TIMx Timer instance - * @retval CompareValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH2(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR2)); -} - -/** - * @brief Get compare value (TIMx_CCR3) set for output channel 3. - * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC3_INSTANCE(TIMx) can be used to check whether or not - * output channel 3 is supported by a timer instance. - * @rmtoll CCR3 CCR3 LL_TIM_OC_GetCompareCH3 - * @param TIMx Timer instance - * @retval CompareValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH3(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR3)); -} - -/** - * @brief Get compare value (TIMx_CCR4) set for output channel 4. - * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC4_INSTANCE(TIMx) can be used to check whether or not - * output channel 4 is supported by a timer instance. - * @rmtoll CCR4 CCR4 LL_TIM_OC_GetCompareCH4 - * @param TIMx Timer instance - * @retval CompareValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH4(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR4)); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Input_Channel Input channel configuration - * @{ - */ -/** - * @brief Configure input channel. - * @rmtoll CCMR1 CC1S LL_TIM_IC_Config\n - * CCMR1 IC1PSC LL_TIM_IC_Config\n - * CCMR1 IC1F LL_TIM_IC_Config\n - * CCMR1 CC2S LL_TIM_IC_Config\n - * CCMR1 IC2PSC LL_TIM_IC_Config\n - * CCMR1 IC2F LL_TIM_IC_Config\n - * CCMR2 CC3S LL_TIM_IC_Config\n - * CCMR2 IC3PSC LL_TIM_IC_Config\n - * CCMR2 IC3F LL_TIM_IC_Config\n - * CCMR2 CC4S LL_TIM_IC_Config\n - * CCMR2 IC4PSC LL_TIM_IC_Config\n - * CCMR2 IC4F LL_TIM_IC_Config\n - * CCER CC1P LL_TIM_IC_Config\n - * CCER CC1NP LL_TIM_IC_Config\n - * CCER CC2P LL_TIM_IC_Config\n - * CCER CC2NP LL_TIM_IC_Config\n - * CCER CC3P LL_TIM_IC_Config\n - * CCER CC3NP LL_TIM_IC_Config\n - * CCER CC4P LL_TIM_IC_Config\n - * CCER CC4NP LL_TIM_IC_Config - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param Configuration This parameter must be a combination of all the following values: - * @arg @ref LL_TIM_ACTIVEINPUT_DIRECTTI or @ref LL_TIM_ACTIVEINPUT_INDIRECTTI or @ref LL_TIM_ACTIVEINPUT_TRC - * @arg @ref LL_TIM_ICPSC_DIV1 or ... or @ref LL_TIM_ICPSC_DIV8 - * @arg @ref LL_TIM_IC_FILTER_FDIV1 or ... or @ref LL_TIM_IC_FILTER_FDIV32_N8 - * @arg @ref LL_TIM_IC_POLARITY_RISING or @ref LL_TIM_IC_POLARITY_FALLING or @ref LL_TIM_IC_POLARITY_BOTHEDGE - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_Config(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Configuration) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - MODIFY_REG(*pReg, ((TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC | TIM_CCMR1_CC1S) << SHIFT_TAB_ICxx[iChannel]), - ((Configuration >> 16U) & (TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC | TIM_CCMR1_CC1S)) \ - << SHIFT_TAB_ICxx[iChannel]); - MODIFY_REG(TIMx->CCER, ((TIM_CCER_CC1NP | TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel]), - (Configuration & (TIM_CCER_CC1NP | TIM_CCER_CC1P)) << SHIFT_TAB_CCxP[iChannel]); -} - -/** - * @brief Set the active input. - * @rmtoll CCMR1 CC1S LL_TIM_IC_SetActiveInput\n - * CCMR1 CC2S LL_TIM_IC_SetActiveInput\n - * CCMR2 CC3S LL_TIM_IC_SetActiveInput\n - * CCMR2 CC4S LL_TIM_IC_SetActiveInput - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param ICActiveInput This parameter can be one of the following values: - * @arg @ref LL_TIM_ACTIVEINPUT_DIRECTTI - * @arg @ref LL_TIM_ACTIVEINPUT_INDIRECTTI - * @arg @ref LL_TIM_ACTIVEINPUT_TRC - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_SetActiveInput(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICActiveInput) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - MODIFY_REG(*pReg, ((TIM_CCMR1_CC1S) << SHIFT_TAB_ICxx[iChannel]), (ICActiveInput >> 16U) << SHIFT_TAB_ICxx[iChannel]); -} - -/** - * @brief Get the current active input. - * @rmtoll CCMR1 CC1S LL_TIM_IC_GetActiveInput\n - * CCMR1 CC2S LL_TIM_IC_GetActiveInput\n - * CCMR2 CC3S LL_TIM_IC_GetActiveInput\n - * CCMR2 CC4S LL_TIM_IC_GetActiveInput - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_ACTIVEINPUT_DIRECTTI - * @arg @ref LL_TIM_ACTIVEINPUT_INDIRECTTI - * @arg @ref LL_TIM_ACTIVEINPUT_TRC - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetActiveInput(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - return ((READ_BIT(*pReg, ((TIM_CCMR1_CC1S) << SHIFT_TAB_ICxx[iChannel])) >> SHIFT_TAB_ICxx[iChannel]) << 16U); -} - -/** - * @brief Set the prescaler of input channel. - * @rmtoll CCMR1 IC1PSC LL_TIM_IC_SetPrescaler\n - * CCMR1 IC2PSC LL_TIM_IC_SetPrescaler\n - * CCMR2 IC3PSC LL_TIM_IC_SetPrescaler\n - * CCMR2 IC4PSC LL_TIM_IC_SetPrescaler - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param ICPrescaler This parameter can be one of the following values: - * @arg @ref LL_TIM_ICPSC_DIV1 - * @arg @ref LL_TIM_ICPSC_DIV2 - * @arg @ref LL_TIM_ICPSC_DIV4 - * @arg @ref LL_TIM_ICPSC_DIV8 - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_SetPrescaler(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICPrescaler) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - MODIFY_REG(*pReg, ((TIM_CCMR1_IC1PSC) << SHIFT_TAB_ICxx[iChannel]), (ICPrescaler >> 16U) << SHIFT_TAB_ICxx[iChannel]); -} - -/** - * @brief Get the current prescaler value acting on an input channel. - * @rmtoll CCMR1 IC1PSC LL_TIM_IC_GetPrescaler\n - * CCMR1 IC2PSC LL_TIM_IC_GetPrescaler\n - * CCMR2 IC3PSC LL_TIM_IC_GetPrescaler\n - * CCMR2 IC4PSC LL_TIM_IC_GetPrescaler - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_ICPSC_DIV1 - * @arg @ref LL_TIM_ICPSC_DIV2 - * @arg @ref LL_TIM_ICPSC_DIV4 - * @arg @ref LL_TIM_ICPSC_DIV8 - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetPrescaler(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - return ((READ_BIT(*pReg, ((TIM_CCMR1_IC1PSC) << SHIFT_TAB_ICxx[iChannel])) >> SHIFT_TAB_ICxx[iChannel]) << 16U); -} - -/** - * @brief Set the input filter duration. - * @rmtoll CCMR1 IC1F LL_TIM_IC_SetFilter\n - * CCMR1 IC2F LL_TIM_IC_SetFilter\n - * CCMR2 IC3F LL_TIM_IC_SetFilter\n - * CCMR2 IC4F LL_TIM_IC_SetFilter - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param ICFilter This parameter can be one of the following values: - * @arg @ref LL_TIM_IC_FILTER_FDIV1 - * @arg @ref LL_TIM_IC_FILTER_FDIV1_N2 - * @arg @ref LL_TIM_IC_FILTER_FDIV1_N4 - * @arg @ref LL_TIM_IC_FILTER_FDIV1_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV2_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV2_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV4_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV4_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV8_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV8_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV16_N5 - * @arg @ref LL_TIM_IC_FILTER_FDIV16_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV16_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV32_N5 - * @arg @ref LL_TIM_IC_FILTER_FDIV32_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV32_N8 - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_SetFilter(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICFilter) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - MODIFY_REG(*pReg, ((TIM_CCMR1_IC1F) << SHIFT_TAB_ICxx[iChannel]), (ICFilter >> 16U) << SHIFT_TAB_ICxx[iChannel]); -} - -/** - * @brief Get the input filter duration. - * @rmtoll CCMR1 IC1F LL_TIM_IC_GetFilter\n - * CCMR1 IC2F LL_TIM_IC_GetFilter\n - * CCMR2 IC3F LL_TIM_IC_GetFilter\n - * CCMR2 IC4F LL_TIM_IC_GetFilter - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_IC_FILTER_FDIV1 - * @arg @ref LL_TIM_IC_FILTER_FDIV1_N2 - * @arg @ref LL_TIM_IC_FILTER_FDIV1_N4 - * @arg @ref LL_TIM_IC_FILTER_FDIV1_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV2_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV2_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV4_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV4_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV8_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV8_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV16_N5 - * @arg @ref LL_TIM_IC_FILTER_FDIV16_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV16_N8 - * @arg @ref LL_TIM_IC_FILTER_FDIV32_N5 - * @arg @ref LL_TIM_IC_FILTER_FDIV32_N6 - * @arg @ref LL_TIM_IC_FILTER_FDIV32_N8 - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetFilter(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); - return ((READ_BIT(*pReg, ((TIM_CCMR1_IC1F) << SHIFT_TAB_ICxx[iChannel])) >> SHIFT_TAB_ICxx[iChannel]) << 16U); -} - -/** - * @brief Set the input channel polarity. - * @rmtoll CCER CC1P LL_TIM_IC_SetPolarity\n - * CCER CC1NP LL_TIM_IC_SetPolarity\n - * CCER CC2P LL_TIM_IC_SetPolarity\n - * CCER CC2NP LL_TIM_IC_SetPolarity\n - * CCER CC3P LL_TIM_IC_SetPolarity\n - * CCER CC3NP LL_TIM_IC_SetPolarity\n - * CCER CC4P LL_TIM_IC_SetPolarity\n - * CCER CC4NP LL_TIM_IC_SetPolarity - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @param ICPolarity This parameter can be one of the following values: - * @arg @ref LL_TIM_IC_POLARITY_RISING - * @arg @ref LL_TIM_IC_POLARITY_FALLING - * @arg @ref LL_TIM_IC_POLARITY_BOTHEDGE - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_SetPolarity(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICPolarity) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - MODIFY_REG(TIMx->CCER, ((TIM_CCER_CC1NP | TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel]), - ICPolarity << SHIFT_TAB_CCxP[iChannel]); -} - -/** - * @brief Get the current input channel polarity. - * @rmtoll CCER CC1P LL_TIM_IC_GetPolarity\n - * CCER CC1NP LL_TIM_IC_GetPolarity\n - * CCER CC2P LL_TIM_IC_GetPolarity\n - * CCER CC2NP LL_TIM_IC_GetPolarity\n - * CCER CC3P LL_TIM_IC_GetPolarity\n - * CCER CC3NP LL_TIM_IC_GetPolarity\n - * CCER CC4P LL_TIM_IC_GetPolarity\n - * CCER CC4NP LL_TIM_IC_GetPolarity - * @param TIMx Timer instance - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_TIM_CHANNEL_CH1 - * @arg @ref LL_TIM_CHANNEL_CH2 - * @arg @ref LL_TIM_CHANNEL_CH3 - * @arg @ref LL_TIM_CHANNEL_CH4 - * @retval Returned value can be one of the following values: - * @arg @ref LL_TIM_IC_POLARITY_RISING - * @arg @ref LL_TIM_IC_POLARITY_FALLING - * @arg @ref LL_TIM_IC_POLARITY_BOTHEDGE - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetPolarity(const TIM_TypeDef *TIMx, uint32_t Channel) -{ - uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); - return (READ_BIT(TIMx->CCER, ((TIM_CCER_CC1NP | TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel])) >> - SHIFT_TAB_CCxP[iChannel]); -} - -/** - * @brief Connect the TIMx_CH1, CH2 and CH3 pins to the TI1 input (XOR combination). - * @note Macro IS_TIM_XOR_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides an XOR input. - * @rmtoll CR2 TI1S LL_TIM_IC_EnableXORCombination - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_EnableXORCombination(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->CR2, TIM_CR2_TI1S); -} - -/** - * @brief Disconnect the TIMx_CH1, CH2 and CH3 pins from the TI1 input. - * @note Macro IS_TIM_XOR_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides an XOR input. - * @rmtoll CR2 TI1S LL_TIM_IC_DisableXORCombination - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_IC_DisableXORCombination(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->CR2, TIM_CR2_TI1S); -} - -/** - * @brief Indicates whether the TIMx_CH1, CH2 and CH3 pins are connectected to the TI1 input. - * @note Macro IS_TIM_XOR_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides an XOR input. - * @rmtoll CR2 TI1S LL_TIM_IC_IsEnabledXORCombination - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IC_IsEnabledXORCombination(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->CR2, TIM_CR2_TI1S) == (TIM_CR2_TI1S)) ? 1UL : 0UL); -} - -/** - * @brief Get captured value for input channel 1. - * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC1_INSTANCE(TIMx) can be used to check whether or not - * input channel 1 is supported by a timer instance. - * @rmtoll CCR1 CCR1 LL_TIM_IC_GetCaptureCH1 - * @param TIMx Timer instance - * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH1(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR1)); -} - -/** - * @brief Get captured value for input channel 2. - * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC2_INSTANCE(TIMx) can be used to check whether or not - * input channel 2 is supported by a timer instance. - * @rmtoll CCR2 CCR2 LL_TIM_IC_GetCaptureCH2 - * @param TIMx Timer instance - * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH2(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR2)); -} - -/** - * @brief Get captured value for input channel 3. - * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC3_INSTANCE(TIMx) can be used to check whether or not - * input channel 3 is supported by a timer instance. - * @rmtoll CCR3 CCR3 LL_TIM_IC_GetCaptureCH3 - * @param TIMx Timer instance - * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH3(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR3)); -} - -/** - * @brief Get captured value for input channel 4. - * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. - * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports a 32 bits counter. - * @note Macro IS_TIM_CC4_INSTANCE(TIMx) can be used to check whether or not - * input channel 4 is supported by a timer instance. - * @rmtoll CCR4 CCR4 LL_TIM_IC_GetCaptureCH4 - * @param TIMx Timer instance - * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) - */ -__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH4(const TIM_TypeDef *TIMx) -{ - return (uint32_t)(READ_REG(TIMx->CCR4)); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Clock_Selection Counter clock selection - * @{ - */ -/** - * @brief Enable external clock mode 2. - * @note When external clock mode 2 is enabled the counter is clocked by any active edge on the ETRF signal. - * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports external clock mode2. - * @rmtoll SMCR ECE LL_TIM_EnableExternalClock - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableExternalClock(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->SMCR, TIM_SMCR_ECE); -} - -/** - * @brief Disable external clock mode 2. - * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports external clock mode2. - * @rmtoll SMCR ECE LL_TIM_DisableExternalClock - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableExternalClock(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->SMCR, TIM_SMCR_ECE); -} - -/** - * @brief Indicate whether external clock mode 2 is enabled. - * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports external clock mode2. - * @rmtoll SMCR ECE LL_TIM_IsEnabledExternalClock - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledExternalClock(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SMCR, TIM_SMCR_ECE) == (TIM_SMCR_ECE)) ? 1UL : 0UL); -} - -/** - * @brief Set the clock source of the counter clock. - * @note when selected clock source is external clock mode 1, the timer input - * the external clock is applied is selected by calling the @ref LL_TIM_SetTriggerInput() - * function. This timer input must be configured by calling - * the @ref LL_TIM_IC_Config() function. - * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports external clock mode1. - * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports external clock mode2. - * @rmtoll SMCR SMS LL_TIM_SetClockSource\n - * SMCR ECE LL_TIM_SetClockSource - * @param TIMx Timer instance - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_TIM_CLOCKSOURCE_INTERNAL - * @arg @ref LL_TIM_CLOCKSOURCE_EXT_MODE1 - * @arg @ref LL_TIM_CLOCKSOURCE_EXT_MODE2 - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetClockSource(TIM_TypeDef *TIMx, uint32_t ClockSource) -{ - MODIFY_REG(TIMx->SMCR, TIM_SMCR_SMS | TIM_SMCR_ECE, ClockSource); -} - -/** - * @brief Set the encoder interface mode. - * @note Macro IS_TIM_ENCODER_INTERFACE_INSTANCE(TIMx) can be used to check - * whether or not a timer instance supports the encoder mode. - * @rmtoll SMCR SMS LL_TIM_SetEncoderMode - * @param TIMx Timer instance - * @param EncoderMode This parameter can be one of the following values: - * @arg @ref LL_TIM_ENCODERMODE_X2_TI1 - * @arg @ref LL_TIM_ENCODERMODE_X2_TI2 - * @arg @ref LL_TIM_ENCODERMODE_X4_TI12 - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetEncoderMode(TIM_TypeDef *TIMx, uint32_t EncoderMode) -{ - MODIFY_REG(TIMx->SMCR, TIM_SMCR_SMS, EncoderMode); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Timer_Synchronization Timer synchronisation configuration - * @{ - */ -/** - * @brief Set the trigger output (TRGO) used for timer synchronization . - * @note Macro IS_TIM_MASTER_INSTANCE(TIMx) can be used to check - * whether or not a timer instance can operate as a master timer. - * @rmtoll CR2 MMS LL_TIM_SetTriggerOutput - * @param TIMx Timer instance - * @param TimerSynchronization This parameter can be one of the following values: - * @arg @ref LL_TIM_TRGO_RESET - * @arg @ref LL_TIM_TRGO_ENABLE - * @arg @ref LL_TIM_TRGO_UPDATE - * @arg @ref LL_TIM_TRGO_CC1IF - * @arg @ref LL_TIM_TRGO_OC1REF - * @arg @ref LL_TIM_TRGO_OC2REF - * @arg @ref LL_TIM_TRGO_OC3REF - * @arg @ref LL_TIM_TRGO_OC4REF - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetTriggerOutput(TIM_TypeDef *TIMx, uint32_t TimerSynchronization) -{ - MODIFY_REG(TIMx->CR2, TIM_CR2_MMS, TimerSynchronization); -} - -/** - * @brief Set the synchronization mode of a slave timer. - * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not - * a timer instance can operate as a slave timer. - * @rmtoll SMCR SMS LL_TIM_SetSlaveMode - * @param TIMx Timer instance - * @param SlaveMode This parameter can be one of the following values: - * @arg @ref LL_TIM_SLAVEMODE_DISABLED - * @arg @ref LL_TIM_SLAVEMODE_RESET - * @arg @ref LL_TIM_SLAVEMODE_GATED - * @arg @ref LL_TIM_SLAVEMODE_TRIGGER - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetSlaveMode(TIM_TypeDef *TIMx, uint32_t SlaveMode) -{ - MODIFY_REG(TIMx->SMCR, TIM_SMCR_SMS, SlaveMode); -} - -/** - * @brief Set the selects the trigger input to be used to synchronize the counter. - * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not - * a timer instance can operate as a slave timer. - * @rmtoll SMCR TS LL_TIM_SetTriggerInput - * @param TIMx Timer instance - * @param TriggerInput This parameter can be one of the following values: - * @arg @ref LL_TIM_TS_ITR0 - * @arg @ref LL_TIM_TS_ITR1 - * @arg @ref LL_TIM_TS_ITR2 - * @arg @ref LL_TIM_TS_ITR3 - * @arg @ref LL_TIM_TS_TI1F_ED - * @arg @ref LL_TIM_TS_TI1FP1 - * @arg @ref LL_TIM_TS_TI2FP2 - * @arg @ref LL_TIM_TS_ETRF - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetTriggerInput(TIM_TypeDef *TIMx, uint32_t TriggerInput) -{ - MODIFY_REG(TIMx->SMCR, TIM_SMCR_TS, TriggerInput); -} - -/** - * @brief Enable the Master/Slave mode. - * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not - * a timer instance can operate as a slave timer. - * @rmtoll SMCR MSM LL_TIM_EnableMasterSlaveMode - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableMasterSlaveMode(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->SMCR, TIM_SMCR_MSM); -} - -/** - * @brief Disable the Master/Slave mode. - * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not - * a timer instance can operate as a slave timer. - * @rmtoll SMCR MSM LL_TIM_DisableMasterSlaveMode - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableMasterSlaveMode(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->SMCR, TIM_SMCR_MSM); -} - -/** - * @brief Indicates whether the Master/Slave mode is enabled. - * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not - * a timer instance can operate as a slave timer. - * @rmtoll SMCR MSM LL_TIM_IsEnabledMasterSlaveMode - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledMasterSlaveMode(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SMCR, TIM_SMCR_MSM) == (TIM_SMCR_MSM)) ? 1UL : 0UL); -} - -/** - * @brief Configure the external trigger (ETR) input. - * @note Macro IS_TIM_ETR_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides an external trigger input. - * @rmtoll SMCR ETP LL_TIM_ConfigETR\n - * SMCR ETPS LL_TIM_ConfigETR\n - * SMCR ETF LL_TIM_ConfigETR - * @param TIMx Timer instance - * @param ETRPolarity This parameter can be one of the following values: - * @arg @ref LL_TIM_ETR_POLARITY_NONINVERTED - * @arg @ref LL_TIM_ETR_POLARITY_INVERTED - * @param ETRPrescaler This parameter can be one of the following values: - * @arg @ref LL_TIM_ETR_PRESCALER_DIV1 - * @arg @ref LL_TIM_ETR_PRESCALER_DIV2 - * @arg @ref LL_TIM_ETR_PRESCALER_DIV4 - * @arg @ref LL_TIM_ETR_PRESCALER_DIV8 - * @param ETRFilter This parameter can be one of the following values: - * @arg @ref LL_TIM_ETR_FILTER_FDIV1 - * @arg @ref LL_TIM_ETR_FILTER_FDIV1_N2 - * @arg @ref LL_TIM_ETR_FILTER_FDIV1_N4 - * @arg @ref LL_TIM_ETR_FILTER_FDIV1_N8 - * @arg @ref LL_TIM_ETR_FILTER_FDIV2_N6 - * @arg @ref LL_TIM_ETR_FILTER_FDIV2_N8 - * @arg @ref LL_TIM_ETR_FILTER_FDIV4_N6 - * @arg @ref LL_TIM_ETR_FILTER_FDIV4_N8 - * @arg @ref LL_TIM_ETR_FILTER_FDIV8_N6 - * @arg @ref LL_TIM_ETR_FILTER_FDIV8_N8 - * @arg @ref LL_TIM_ETR_FILTER_FDIV16_N5 - * @arg @ref LL_TIM_ETR_FILTER_FDIV16_N6 - * @arg @ref LL_TIM_ETR_FILTER_FDIV16_N8 - * @arg @ref LL_TIM_ETR_FILTER_FDIV32_N5 - * @arg @ref LL_TIM_ETR_FILTER_FDIV32_N6 - * @arg @ref LL_TIM_ETR_FILTER_FDIV32_N8 - * @retval None - */ -__STATIC_INLINE void LL_TIM_ConfigETR(TIM_TypeDef *TIMx, uint32_t ETRPolarity, uint32_t ETRPrescaler, - uint32_t ETRFilter) -{ - MODIFY_REG(TIMx->SMCR, TIM_SMCR_ETP | TIM_SMCR_ETPS | TIM_SMCR_ETF, ETRPolarity | ETRPrescaler | ETRFilter); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Break_Function Break function configuration - * @{ - */ -/** - * @brief Enable the break function. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR BKE LL_TIM_EnableBRK - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableBRK(TIM_TypeDef *TIMx) -{ - __IO uint32_t tmpreg; - SET_BIT(TIMx->BDTR, TIM_BDTR_BKE); - /* Note: Any write operation to this bit takes a delay of 1 APB clock cycle to become effective. */ - tmpreg = READ_REG(TIMx->BDTR); - (void)(tmpreg); -} - -/** - * @brief Disable the break function. - * @rmtoll BDTR BKE LL_TIM_DisableBRK - * @param TIMx Timer instance - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableBRK(TIM_TypeDef *TIMx) -{ - __IO uint32_t tmpreg; - CLEAR_BIT(TIMx->BDTR, TIM_BDTR_BKE); - /* Note: Any write operation to this bit takes a delay of 1 APB clock cycle to become effective. */ - tmpreg = READ_REG(TIMx->BDTR); - (void)(tmpreg); -} - -/** - * @brief Configure the break input. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR BKP LL_TIM_ConfigBRK - * @param TIMx Timer instance - * @param BreakPolarity This parameter can be one of the following values: - * @arg @ref LL_TIM_BREAK_POLARITY_LOW - * @arg @ref LL_TIM_BREAK_POLARITY_HIGH - * @retval None - */ -__STATIC_INLINE void LL_TIM_ConfigBRK(TIM_TypeDef *TIMx, uint32_t BreakPolarity) -{ - __IO uint32_t tmpreg; - MODIFY_REG(TIMx->BDTR, TIM_BDTR_BKP, BreakPolarity); - /* Note: Any write operation to BKP bit takes a delay of 1 APB clock cycle to become effective. */ - tmpreg = READ_REG(TIMx->BDTR); - (void)(tmpreg); -} - -/** - * @brief Select the outputs off state (enabled v.s. disabled) in Idle and Run modes. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR OSSI LL_TIM_SetOffStates\n - * BDTR OSSR LL_TIM_SetOffStates - * @param TIMx Timer instance - * @param OffStateIdle This parameter can be one of the following values: - * @arg @ref LL_TIM_OSSI_DISABLE - * @arg @ref LL_TIM_OSSI_ENABLE - * @param OffStateRun This parameter can be one of the following values: - * @arg @ref LL_TIM_OSSR_DISABLE - * @arg @ref LL_TIM_OSSR_ENABLE - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetOffStates(TIM_TypeDef *TIMx, uint32_t OffStateIdle, uint32_t OffStateRun) -{ - MODIFY_REG(TIMx->BDTR, TIM_BDTR_OSSI | TIM_BDTR_OSSR, OffStateIdle | OffStateRun); -} - -/** - * @brief Enable automatic output (MOE can be set by software or automatically when a break input is active). - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR AOE LL_TIM_EnableAutomaticOutput - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableAutomaticOutput(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->BDTR, TIM_BDTR_AOE); -} - -/** - * @brief Disable automatic output (MOE can be set only by software). - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR AOE LL_TIM_DisableAutomaticOutput - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableAutomaticOutput(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->BDTR, TIM_BDTR_AOE); -} - -/** - * @brief Indicate whether automatic output is enabled. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR AOE LL_TIM_IsEnabledAutomaticOutput - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledAutomaticOutput(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->BDTR, TIM_BDTR_AOE) == (TIM_BDTR_AOE)) ? 1UL : 0UL); -} - -/** - * @brief Enable the outputs (set the MOE bit in TIMx_BDTR register). - * @note The MOE bit in TIMx_BDTR register allows to enable /disable the outputs by - * software and is reset in case of break or break2 event - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR MOE LL_TIM_EnableAllOutputs - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableAllOutputs(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->BDTR, TIM_BDTR_MOE); -} - -/** - * @brief Disable the outputs (reset the MOE bit in TIMx_BDTR register). - * @note The MOE bit in TIMx_BDTR register allows to enable /disable the outputs by - * software and is reset in case of break or break2 event. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR MOE LL_TIM_DisableAllOutputs - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableAllOutputs(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->BDTR, TIM_BDTR_MOE); -} - -/** - * @brief Indicates whether outputs are enabled. - * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not - * a timer instance provides a break input. - * @rmtoll BDTR MOE LL_TIM_IsEnabledAllOutputs - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledAllOutputs(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->BDTR, TIM_BDTR_MOE) == (TIM_BDTR_MOE)) ? 1UL : 0UL); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_DMA_Burst_Mode DMA burst mode configuration - * @{ - */ -/** - * @brief Configures the timer DMA burst feature. - * @note Macro IS_TIM_DMABURST_INSTANCE(TIMx) can be used to check whether or - * not a timer instance supports the DMA burst mode. - * @rmtoll DCR DBL LL_TIM_ConfigDMABurst\n - * DCR DBA LL_TIM_ConfigDMABurst - * @param TIMx Timer instance - * @param DMABurstBaseAddress This parameter can be one of the following values: - * @arg @ref LL_TIM_DMABURST_BASEADDR_CR1 - * @arg @ref LL_TIM_DMABURST_BASEADDR_CR2 - * @arg @ref LL_TIM_DMABURST_BASEADDR_SMCR - * @arg @ref LL_TIM_DMABURST_BASEADDR_DIER - * @arg @ref LL_TIM_DMABURST_BASEADDR_SR - * @arg @ref LL_TIM_DMABURST_BASEADDR_EGR - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCMR1 - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCMR2 - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCER - * @arg @ref LL_TIM_DMABURST_BASEADDR_CNT - * @arg @ref LL_TIM_DMABURST_BASEADDR_PSC - * @arg @ref LL_TIM_DMABURST_BASEADDR_ARR - * @arg @ref LL_TIM_DMABURST_BASEADDR_RCR - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR1 - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR2 - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR3 - * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR4 - * @arg @ref LL_TIM_DMABURST_BASEADDR_BDTR - * @param DMABurstLength This parameter can be one of the following values: - * @arg @ref LL_TIM_DMABURST_LENGTH_1TRANSFER - * @arg @ref LL_TIM_DMABURST_LENGTH_2TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_3TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_4TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_5TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_6TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_7TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_8TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_9TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_10TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_11TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_12TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_13TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_14TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_15TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_16TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_17TRANSFERS - * @arg @ref LL_TIM_DMABURST_LENGTH_18TRANSFERS - * @retval None - */ -__STATIC_INLINE void LL_TIM_ConfigDMABurst(TIM_TypeDef *TIMx, uint32_t DMABurstBaseAddress, uint32_t DMABurstLength) -{ - MODIFY_REG(TIMx->DCR, (TIM_DCR_DBL | TIM_DCR_DBA), (DMABurstBaseAddress | DMABurstLength)); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_Timer_Inputs_Remapping Timer input remapping - * @{ - */ -/** - * @brief Remap TIM inputs (input channel, internal/external triggers). - * @note Macro IS_TIM_REMAP_INSTANCE(TIMx) can be used to check whether or not - * a some timer inputs can be remapped. - * @rmtoll TIM1_OR ITR2_RMP LL_TIM_SetRemap\n - * TIM2_OR ITR1_RMP LL_TIM_SetRemap\n - * TIM5_OR ITR1_RMP LL_TIM_SetRemap\n - * TIM5_OR TI4_RMP LL_TIM_SetRemap\n - * TIM9_OR ITR1_RMP LL_TIM_SetRemap\n - * TIM11_OR TI1_RMP LL_TIM_SetRemap\n - * LPTIM1_OR OR LL_TIM_SetRemap - * @param TIMx Timer instance - * @param Remap Remap param depends on the TIMx. Description available only - * in CHM version of the User Manual (not in .pdf). - * Otherwise see Reference Manual description of OR registers. - * - * Below description summarizes "Timer Instance" and "Remap" param combinations: - * - * TIM1: one of the following values - * - * ITR2_RMP can be one of the following values - * @arg @ref LL_TIM_TIM1_ITR2_RMP_TIM3_TRGO (*) - * @arg @ref LL_TIM_TIM1_ITR2_RMP_LPTIM (*) - * - * TIM2: one of the following values - * - * ITR1_RMP can be one of the following values - * @arg @ref LL_TIM_TIM2_ITR1_RMP_TIM8_TRGO - * @arg @ref LL_TIM_TIM2_ITR1_RMP_OTG_FS_SOF - * @arg @ref LL_TIM_TIM2_ITR1_RMP_OTG_HS_SOF - * - * TIM5: one of the following values - * - * @arg @ref LL_TIM_TIM5_TI4_RMP_GPIO - * @arg @ref LL_TIM_TIM5_TI4_RMP_LSI - * @arg @ref LL_TIM_TIM5_TI4_RMP_LSE - * @arg @ref LL_TIM_TIM5_TI4_RMP_RTC - * @arg @ref LL_TIM_TIM5_ITR1_RMP_TIM3_TRGO (*) - * @arg @ref LL_TIM_TIM5_ITR1_RMP_LPTIM (*) - * - * TIM9: one of the following values - * - * ITR1_RMP can be one of the following values - * @arg @ref LL_TIM_TIM9_ITR1_RMP_TIM3_TRGO (*) - * @arg @ref LL_TIM_TIM9_ITR1_RMP_LPTIM (*) - * - * TIM11: one of the following values - * - * @arg @ref LL_TIM_TIM11_TI1_RMP_GPIO - * @arg @ref LL_TIM_TIM11_TI1_RMP_GPIO1 (*) - * @arg @ref LL_TIM_TIM11_TI1_RMP_HSE_RTC - * @arg @ref LL_TIM_TIM11_TI1_RMP_GPIO2 - * @arg @ref LL_TIM_TIM11_TI1_RMP_SPDIFRX (*) - * - * (*) Value not defined in all devices. \n - * - * @retval None - */ -__STATIC_INLINE void LL_TIM_SetRemap(TIM_TypeDef *TIMx, uint32_t Remap) -{ -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM9_ITR1_RMP) - if ((Remap & LL_TIM_LPTIM_REMAP_MASK) == LL_TIM_LPTIM_REMAP_MASK) - { - /* Connect TIMx internal trigger to LPTIM1 output */ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN); - MODIFY_REG(LPTIM1->OR, - (LPTIM_OR_TIM1_ITR2_RMP | LPTIM_OR_TIM5_ITR1_RMP | LPTIM_OR_TIM9_ITR1_RMP), - Remap & ~(LL_TIM_LPTIM_REMAP_MASK)); - } - else - { - MODIFY_REG(TIMx->OR, (Remap >> TIMx_OR_RMP_SHIFT), (Remap & TIMx_OR_RMP_MASK)); - } -#else - MODIFY_REG(TIMx->OR, (Remap >> TIMx_OR_RMP_SHIFT), (Remap & TIMx_OR_RMP_MASK)); -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM9_ITR1_RMP */ -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_FLAG_Management FLAG-Management - * @{ - */ -/** - * @brief Clear the update interrupt flag (UIF). - * @rmtoll SR UIF LL_TIM_ClearFlag_UPDATE - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_UPDATE(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_UIF)); -} - -/** - * @brief Indicate whether update interrupt flag (UIF) is set (update interrupt is pending). - * @rmtoll SR UIF LL_TIM_IsActiveFlag_UPDATE - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_UPDATE(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_UIF) == (TIM_SR_UIF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 1 interrupt flag (CC1F). - * @rmtoll SR CC1IF LL_TIM_ClearFlag_CC1 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC1(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC1IF)); -} - -/** - * @brief Indicate whether Capture/Compare 1 interrupt flag (CC1F) is set (Capture/Compare 1 interrupt is pending). - * @rmtoll SR CC1IF LL_TIM_IsActiveFlag_CC1 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC1(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC1IF) == (TIM_SR_CC1IF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 2 interrupt flag (CC2F). - * @rmtoll SR CC2IF LL_TIM_ClearFlag_CC2 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC2(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC2IF)); -} - -/** - * @brief Indicate whether Capture/Compare 2 interrupt flag (CC2F) is set (Capture/Compare 2 interrupt is pending). - * @rmtoll SR CC2IF LL_TIM_IsActiveFlag_CC2 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC2(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC2IF) == (TIM_SR_CC2IF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 3 interrupt flag (CC3F). - * @rmtoll SR CC3IF LL_TIM_ClearFlag_CC3 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC3(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC3IF)); -} - -/** - * @brief Indicate whether Capture/Compare 3 interrupt flag (CC3F) is set (Capture/Compare 3 interrupt is pending). - * @rmtoll SR CC3IF LL_TIM_IsActiveFlag_CC3 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC3(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC3IF) == (TIM_SR_CC3IF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 4 interrupt flag (CC4F). - * @rmtoll SR CC4IF LL_TIM_ClearFlag_CC4 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC4(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC4IF)); -} - -/** - * @brief Indicate whether Capture/Compare 4 interrupt flag (CC4F) is set (Capture/Compare 4 interrupt is pending). - * @rmtoll SR CC4IF LL_TIM_IsActiveFlag_CC4 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC4(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC4IF) == (TIM_SR_CC4IF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the commutation interrupt flag (COMIF). - * @rmtoll SR COMIF LL_TIM_ClearFlag_COM - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_COM(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_COMIF)); -} - -/** - * @brief Indicate whether commutation interrupt flag (COMIF) is set (commutation interrupt is pending). - * @rmtoll SR COMIF LL_TIM_IsActiveFlag_COM - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_COM(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_COMIF) == (TIM_SR_COMIF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the trigger interrupt flag (TIF). - * @rmtoll SR TIF LL_TIM_ClearFlag_TRIG - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_TRIG(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_TIF)); -} - -/** - * @brief Indicate whether trigger interrupt flag (TIF) is set (trigger interrupt is pending). - * @rmtoll SR TIF LL_TIM_IsActiveFlag_TRIG - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_TRIG(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_TIF) == (TIM_SR_TIF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the break interrupt flag (BIF). - * @rmtoll SR BIF LL_TIM_ClearFlag_BRK - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_BRK(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_BIF)); -} - -/** - * @brief Indicate whether break interrupt flag (BIF) is set (break interrupt is pending). - * @rmtoll SR BIF LL_TIM_IsActiveFlag_BRK - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_BRK(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_BIF) == (TIM_SR_BIF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 1 over-capture interrupt flag (CC1OF). - * @rmtoll SR CC1OF LL_TIM_ClearFlag_CC1OVR - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC1OVR(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC1OF)); -} - -/** - * @brief Indicate whether Capture/Compare 1 over-capture interrupt flag (CC1OF) is set - * (Capture/Compare 1 interrupt is pending). - * @rmtoll SR CC1OF LL_TIM_IsActiveFlag_CC1OVR - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC1OVR(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC1OF) == (TIM_SR_CC1OF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 2 over-capture interrupt flag (CC2OF). - * @rmtoll SR CC2OF LL_TIM_ClearFlag_CC2OVR - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC2OVR(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC2OF)); -} - -/** - * @brief Indicate whether Capture/Compare 2 over-capture interrupt flag (CC2OF) is set - * (Capture/Compare 2 over-capture interrupt is pending). - * @rmtoll SR CC2OF LL_TIM_IsActiveFlag_CC2OVR - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC2OVR(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC2OF) == (TIM_SR_CC2OF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 3 over-capture interrupt flag (CC3OF). - * @rmtoll SR CC3OF LL_TIM_ClearFlag_CC3OVR - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC3OVR(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC3OF)); -} - -/** - * @brief Indicate whether Capture/Compare 3 over-capture interrupt flag (CC3OF) is set - * (Capture/Compare 3 over-capture interrupt is pending). - * @rmtoll SR CC3OF LL_TIM_IsActiveFlag_CC3OVR - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC3OVR(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC3OF) == (TIM_SR_CC3OF)) ? 1UL : 0UL); -} - -/** - * @brief Clear the Capture/Compare 4 over-capture interrupt flag (CC4OF). - * @rmtoll SR CC4OF LL_TIM_ClearFlag_CC4OVR - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_ClearFlag_CC4OVR(TIM_TypeDef *TIMx) -{ - WRITE_REG(TIMx->SR, ~(TIM_SR_CC4OF)); -} - -/** - * @brief Indicate whether Capture/Compare 4 over-capture interrupt flag (CC4OF) is set - * (Capture/Compare 4 over-capture interrupt is pending). - * @rmtoll SR CC4OF LL_TIM_IsActiveFlag_CC4OVR - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC4OVR(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->SR, TIM_SR_CC4OF) == (TIM_SR_CC4OF)) ? 1UL : 0UL); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_IT_Management IT-Management - * @{ - */ -/** - * @brief Enable update interrupt (UIE). - * @rmtoll DIER UIE LL_TIM_EnableIT_UPDATE - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_UPDATE(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_UIE); -} - -/** - * @brief Disable update interrupt (UIE). - * @rmtoll DIER UIE LL_TIM_DisableIT_UPDATE - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_UPDATE(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_UIE); -} - -/** - * @brief Indicates whether the update interrupt (UIE) is enabled. - * @rmtoll DIER UIE LL_TIM_IsEnabledIT_UPDATE - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_UPDATE(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_UIE) == (TIM_DIER_UIE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 1 interrupt (CC1IE). - * @rmtoll DIER CC1IE LL_TIM_EnableIT_CC1 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_CC1(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC1IE); -} - -/** - * @brief Disable capture/compare 1 interrupt (CC1IE). - * @rmtoll DIER CC1IE LL_TIM_DisableIT_CC1 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_CC1(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC1IE); -} - -/** - * @brief Indicates whether the capture/compare 1 interrupt (CC1IE) is enabled. - * @rmtoll DIER CC1IE LL_TIM_IsEnabledIT_CC1 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC1(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC1IE) == (TIM_DIER_CC1IE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 2 interrupt (CC2IE). - * @rmtoll DIER CC2IE LL_TIM_EnableIT_CC2 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_CC2(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC2IE); -} - -/** - * @brief Disable capture/compare 2 interrupt (CC2IE). - * @rmtoll DIER CC2IE LL_TIM_DisableIT_CC2 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_CC2(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC2IE); -} - -/** - * @brief Indicates whether the capture/compare 2 interrupt (CC2IE) is enabled. - * @rmtoll DIER CC2IE LL_TIM_IsEnabledIT_CC2 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC2(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC2IE) == (TIM_DIER_CC2IE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 3 interrupt (CC3IE). - * @rmtoll DIER CC3IE LL_TIM_EnableIT_CC3 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_CC3(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC3IE); -} - -/** - * @brief Disable capture/compare 3 interrupt (CC3IE). - * @rmtoll DIER CC3IE LL_TIM_DisableIT_CC3 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_CC3(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC3IE); -} - -/** - * @brief Indicates whether the capture/compare 3 interrupt (CC3IE) is enabled. - * @rmtoll DIER CC3IE LL_TIM_IsEnabledIT_CC3 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC3(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC3IE) == (TIM_DIER_CC3IE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 4 interrupt (CC4IE). - * @rmtoll DIER CC4IE LL_TIM_EnableIT_CC4 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_CC4(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC4IE); -} - -/** - * @brief Disable capture/compare 4 interrupt (CC4IE). - * @rmtoll DIER CC4IE LL_TIM_DisableIT_CC4 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_CC4(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC4IE); -} - -/** - * @brief Indicates whether the capture/compare 4 interrupt (CC4IE) is enabled. - * @rmtoll DIER CC4IE LL_TIM_IsEnabledIT_CC4 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC4(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC4IE) == (TIM_DIER_CC4IE)) ? 1UL : 0UL); -} - -/** - * @brief Enable commutation interrupt (COMIE). - * @rmtoll DIER COMIE LL_TIM_EnableIT_COM - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_COM(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_COMIE); -} - -/** - * @brief Disable commutation interrupt (COMIE). - * @rmtoll DIER COMIE LL_TIM_DisableIT_COM - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_COM(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_COMIE); -} - -/** - * @brief Indicates whether the commutation interrupt (COMIE) is enabled. - * @rmtoll DIER COMIE LL_TIM_IsEnabledIT_COM - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_COM(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_COMIE) == (TIM_DIER_COMIE)) ? 1UL : 0UL); -} - -/** - * @brief Enable trigger interrupt (TIE). - * @rmtoll DIER TIE LL_TIM_EnableIT_TRIG - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_TRIG(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_TIE); -} - -/** - * @brief Disable trigger interrupt (TIE). - * @rmtoll DIER TIE LL_TIM_DisableIT_TRIG - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_TRIG(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_TIE); -} - -/** - * @brief Indicates whether the trigger interrupt (TIE) is enabled. - * @rmtoll DIER TIE LL_TIM_IsEnabledIT_TRIG - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_TRIG(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_TIE) == (TIM_DIER_TIE)) ? 1UL : 0UL); -} - -/** - * @brief Enable break interrupt (BIE). - * @rmtoll DIER BIE LL_TIM_EnableIT_BRK - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableIT_BRK(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_BIE); -} - -/** - * @brief Disable break interrupt (BIE). - * @rmtoll DIER BIE LL_TIM_DisableIT_BRK - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableIT_BRK(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_BIE); -} - -/** - * @brief Indicates whether the break interrupt (BIE) is enabled. - * @rmtoll DIER BIE LL_TIM_IsEnabledIT_BRK - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_BRK(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_BIE) == (TIM_DIER_BIE)) ? 1UL : 0UL); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_DMA_Management DMA Management - * @{ - */ -/** - * @brief Enable update DMA request (UDE). - * @rmtoll DIER UDE LL_TIM_EnableDMAReq_UPDATE - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_UPDATE(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_UDE); -} - -/** - * @brief Disable update DMA request (UDE). - * @rmtoll DIER UDE LL_TIM_DisableDMAReq_UPDATE - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_UPDATE(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_UDE); -} - -/** - * @brief Indicates whether the update DMA request (UDE) is enabled. - * @rmtoll DIER UDE LL_TIM_IsEnabledDMAReq_UPDATE - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_UPDATE(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_UDE) == (TIM_DIER_UDE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 1 DMA request (CC1DE). - * @rmtoll DIER CC1DE LL_TIM_EnableDMAReq_CC1 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_CC1(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC1DE); -} - -/** - * @brief Disable capture/compare 1 DMA request (CC1DE). - * @rmtoll DIER CC1DE LL_TIM_DisableDMAReq_CC1 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_CC1(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC1DE); -} - -/** - * @brief Indicates whether the capture/compare 1 DMA request (CC1DE) is enabled. - * @rmtoll DIER CC1DE LL_TIM_IsEnabledDMAReq_CC1 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC1(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC1DE) == (TIM_DIER_CC1DE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 2 DMA request (CC2DE). - * @rmtoll DIER CC2DE LL_TIM_EnableDMAReq_CC2 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_CC2(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC2DE); -} - -/** - * @brief Disable capture/compare 2 DMA request (CC2DE). - * @rmtoll DIER CC2DE LL_TIM_DisableDMAReq_CC2 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_CC2(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC2DE); -} - -/** - * @brief Indicates whether the capture/compare 2 DMA request (CC2DE) is enabled. - * @rmtoll DIER CC2DE LL_TIM_IsEnabledDMAReq_CC2 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC2(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC2DE) == (TIM_DIER_CC2DE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 3 DMA request (CC3DE). - * @rmtoll DIER CC3DE LL_TIM_EnableDMAReq_CC3 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_CC3(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC3DE); -} - -/** - * @brief Disable capture/compare 3 DMA request (CC3DE). - * @rmtoll DIER CC3DE LL_TIM_DisableDMAReq_CC3 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_CC3(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC3DE); -} - -/** - * @brief Indicates whether the capture/compare 3 DMA request (CC3DE) is enabled. - * @rmtoll DIER CC3DE LL_TIM_IsEnabledDMAReq_CC3 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC3(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC3DE) == (TIM_DIER_CC3DE)) ? 1UL : 0UL); -} - -/** - * @brief Enable capture/compare 4 DMA request (CC4DE). - * @rmtoll DIER CC4DE LL_TIM_EnableDMAReq_CC4 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_CC4(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_CC4DE); -} - -/** - * @brief Disable capture/compare 4 DMA request (CC4DE). - * @rmtoll DIER CC4DE LL_TIM_DisableDMAReq_CC4 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_CC4(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_CC4DE); -} - -/** - * @brief Indicates whether the capture/compare 4 DMA request (CC4DE) is enabled. - * @rmtoll DIER CC4DE LL_TIM_IsEnabledDMAReq_CC4 - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC4(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_CC4DE) == (TIM_DIER_CC4DE)) ? 1UL : 0UL); -} - -/** - * @brief Enable commutation DMA request (COMDE). - * @rmtoll DIER COMDE LL_TIM_EnableDMAReq_COM - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_COM(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_COMDE); -} - -/** - * @brief Disable commutation DMA request (COMDE). - * @rmtoll DIER COMDE LL_TIM_DisableDMAReq_COM - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_COM(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_COMDE); -} - -/** - * @brief Indicates whether the commutation DMA request (COMDE) is enabled. - * @rmtoll DIER COMDE LL_TIM_IsEnabledDMAReq_COM - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_COM(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_COMDE) == (TIM_DIER_COMDE)) ? 1UL : 0UL); -} - -/** - * @brief Enable trigger interrupt (TDE). - * @rmtoll DIER TDE LL_TIM_EnableDMAReq_TRIG - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_EnableDMAReq_TRIG(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->DIER, TIM_DIER_TDE); -} - -/** - * @brief Disable trigger interrupt (TDE). - * @rmtoll DIER TDE LL_TIM_DisableDMAReq_TRIG - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_DisableDMAReq_TRIG(TIM_TypeDef *TIMx) -{ - CLEAR_BIT(TIMx->DIER, TIM_DIER_TDE); -} - -/** - * @brief Indicates whether the trigger interrupt (TDE) is enabled. - * @rmtoll DIER TDE LL_TIM_IsEnabledDMAReq_TRIG - * @param TIMx Timer instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_TRIG(const TIM_TypeDef *TIMx) -{ - return ((READ_BIT(TIMx->DIER, TIM_DIER_TDE) == (TIM_DIER_TDE)) ? 1UL : 0UL); -} - -/** - * @} - */ - -/** @defgroup TIM_LL_EF_EVENT_Management EVENT-Management - * @{ - */ -/** - * @brief Generate an update event. - * @rmtoll EGR UG LL_TIM_GenerateEvent_UPDATE - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_UPDATE(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_UG); -} - -/** - * @brief Generate Capture/Compare 1 event. - * @rmtoll EGR CC1G LL_TIM_GenerateEvent_CC1 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_CC1(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_CC1G); -} - -/** - * @brief Generate Capture/Compare 2 event. - * @rmtoll EGR CC2G LL_TIM_GenerateEvent_CC2 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_CC2(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_CC2G); -} - -/** - * @brief Generate Capture/Compare 3 event. - * @rmtoll EGR CC3G LL_TIM_GenerateEvent_CC3 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_CC3(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_CC3G); -} - -/** - * @brief Generate Capture/Compare 4 event. - * @rmtoll EGR CC4G LL_TIM_GenerateEvent_CC4 - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_CC4(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_CC4G); -} - -/** - * @brief Generate commutation event. - * @rmtoll EGR COMG LL_TIM_GenerateEvent_COM - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_COM(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_COMG); -} - -/** - * @brief Generate trigger event. - * @rmtoll EGR TG LL_TIM_GenerateEvent_TRIG - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_TRIG(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_TG); -} - -/** - * @brief Generate break event. - * @rmtoll EGR BG LL_TIM_GenerateEvent_BRK - * @param TIMx Timer instance - * @retval None - */ -__STATIC_INLINE void LL_TIM_GenerateEvent_BRK(TIM_TypeDef *TIMx) -{ - SET_BIT(TIMx->EGR, TIM_EGR_BG); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup TIM_LL_EF_Init Initialisation and deinitialisation functions - * @{ - */ - -ErrorStatus LL_TIM_DeInit(const TIM_TypeDef *TIMx); -void LL_TIM_StructInit(LL_TIM_InitTypeDef *TIM_InitStruct); -ErrorStatus LL_TIM_Init(TIM_TypeDef *TIMx, const LL_TIM_InitTypeDef *TIM_InitStruct); -void LL_TIM_OC_StructInit(LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct); -ErrorStatus LL_TIM_OC_Init(TIM_TypeDef *TIMx, uint32_t Channel, const LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct); -void LL_TIM_IC_StructInit(LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); -ErrorStatus LL_TIM_IC_Init(TIM_TypeDef *TIMx, uint32_t Channel, const LL_TIM_IC_InitTypeDef *TIM_IC_InitStruct); -void LL_TIM_ENCODER_StructInit(LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct); -ErrorStatus LL_TIM_ENCODER_Init(TIM_TypeDef *TIMx, const LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct); -void LL_TIM_HALLSENSOR_StructInit(LL_TIM_HALLSENSOR_InitTypeDef *TIM_HallSensorInitStruct); -ErrorStatus LL_TIM_HALLSENSOR_Init(TIM_TypeDef *TIMx, const LL_TIM_HALLSENSOR_InitTypeDef *TIM_HallSensorInitStruct); -void LL_TIM_BDTR_StructInit(LL_TIM_BDTR_InitTypeDef *TIM_BDTRInitStruct); -ErrorStatus LL_TIM_BDTR_Init(TIM_TypeDef *TIMx, const LL_TIM_BDTR_InitTypeDef *TIM_BDTRInitStruct); -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* TIM1 || TIM2 || TIM3 || TIM4 || TIM5 || TIM6 || TIM7 || TIM8 || TIM9 || TIM10 || TIM11 || TIM12 || TIM13 || TIM14 */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_TIM_H */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usb.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usb.h deleted file mode 100644 index caabcf3..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usb.h +++ /dev/null @@ -1,578 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_usb.h - * @author MCD Application Team - * @brief Header file of USB Low Layer HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_LL_USB_H -#define STM32F4xx_LL_USB_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup USB_LL - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -#ifndef HAL_USB_TIMEOUT -#define HAL_USB_TIMEOUT 0xF000000U -#endif /* define HAL_USB_TIMEOUT */ - -#ifndef HAL_USB_CURRENT_MODE_MAX_DELAY_MS -#define HAL_USB_CURRENT_MODE_MAX_DELAY_MS 200U -#endif /* define HAL_USB_CURRENT_MODE_MAX_DELAY_MS */ - -/** - * @brief USB Mode definition - */ - -typedef enum -{ - USB_DEVICE_MODE = 0, - USB_HOST_MODE = 1, - USB_DRD_MODE = 2 -} USB_ModeTypeDef; - -/** - * @brief URB States definition - */ -typedef enum -{ - URB_IDLE = 0, - URB_DONE, - URB_NOTREADY, - URB_NYET, - URB_ERROR, - URB_STALL -} USB_URBStateTypeDef; - -/** - * @brief Host channel States definition - */ -typedef enum -{ - HC_IDLE = 0, - HC_XFRC, - HC_HALTED, - HC_ACK, - HC_NAK, - HC_NYET, - HC_STALL, - HC_XACTERR, - HC_BBLERR, - HC_DATATGLERR -} USB_HCStateTypeDef; - - -/** - * @brief USB Instance Initialization Structure definition - */ -typedef struct -{ - uint8_t dev_endpoints; /*!< Device Endpoints number. - This parameter depends on the used USB core. - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint8_t Host_channels; /*!< Host Channels number. - This parameter Depends on the used USB core. - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint8_t dma_enable; /*!< USB DMA state. - If DMA is not supported this parameter shall be set by default to zero */ - - uint8_t speed; /*!< USB Core speed. - This parameter can be any value of @ref PCD_Speed/HCD_Speed - (HCD_SPEED_xxx, HCD_SPEED_xxx) */ - - uint8_t ep0_mps; /*!< Set the Endpoint 0 Max Packet size. */ - - uint8_t phy_itface; /*!< Select the used PHY interface. - This parameter can be any value of @ref PCD_PHY_Module/HCD_PHY_Module */ - - uint8_t Sof_enable; /*!< Enable or disable the output of the SOF signal. */ - - uint8_t low_power_enable; /*!< Enable or disable the low Power Mode. */ - - uint8_t lpm_enable; /*!< Enable or disable Link Power Management. */ - - uint8_t battery_charging_enable; /*!< Enable or disable Battery charging. */ - - uint8_t vbus_sensing_enable; /*!< Enable or disable the VBUS Sensing feature. */ - - uint8_t use_dedicated_ep1; /*!< Enable or disable the use of the dedicated EP1 interrupt. */ - - uint8_t use_external_vbus; /*!< Enable or disable the use of the external VBUS. */ - -} USB_CfgTypeDef; - -typedef struct -{ - uint8_t num; /*!< Endpoint number - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint8_t is_in; /*!< Endpoint direction - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t is_stall; /*!< Endpoint stall condition - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t is_iso_incomplete; /*!< Endpoint isoc condition - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t type; /*!< Endpoint type - This parameter can be any value of @ref USB_LL_EP_Type */ - - uint8_t data_pid_start; /*!< Initial data PID - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint32_t maxpacket; /*!< Endpoint Max packet size - This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */ - - uint8_t *xfer_buff; /*!< Pointer to transfer buffer */ - - uint32_t xfer_len; /*!< Current transfer length */ - - uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer */ - - uint8_t even_odd_frame; /*!< IFrame parity - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint16_t tx_fifo_num; /*!< Transmission FIFO number - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint32_t dma_addr; /*!< 32 bits aligned transfer buffer address */ - - uint32_t xfer_size; /*!< requested transfer size */ -} USB_EPTypeDef; - -typedef struct -{ - uint8_t dev_addr; /*!< USB device address. - This parameter must be a number between Min_Data = 1 and Max_Data = 255 */ - - uint8_t ch_num; /*!< Host channel number. - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint8_t ep_num; /*!< Endpoint number. - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint8_t ep_is_in; /*!< Endpoint direction - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t speed; /*!< USB Host Channel speed. - This parameter can be any value of @ref HCD_Device_Speed: - (HCD_DEVICE_SPEED_xxx) */ - - uint8_t do_ping; /*!< Enable or disable the use of the PING protocol for HS mode. */ - uint8_t do_ssplit; /*!< Enable start split transaction in HS mode. */ - uint8_t do_csplit; /*!< Enable complete split transaction in HS mode. */ - uint8_t ep_ss_schedule; /*!< Enable periodic endpoint start split schedule . */ - uint32_t iso_splt_xactPos; /*!< iso split transfer transaction position. */ - - uint8_t hub_port_nbr; /*!< USB HUB port number */ - uint8_t hub_addr; /*!< USB HUB address */ - - uint8_t ep_type; /*!< Endpoint Type. - This parameter can be any value of @ref USB_LL_EP_Type */ - - uint16_t max_packet; /*!< Endpoint Max packet size. - This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */ - - uint8_t data_pid; /*!< Initial data PID. - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t *xfer_buff; /*!< Pointer to transfer buffer. */ - - uint32_t XferSize; /*!< OTG Channel transfer size. */ - - uint32_t xfer_len; /*!< Current transfer length. */ - - uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer. */ - - uint8_t toggle_in; /*!< IN transfer current toggle flag. - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t toggle_out; /*!< OUT transfer current toggle flag - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint32_t dma_addr; /*!< 32 bits aligned transfer buffer address. */ - - uint32_t ErrCnt; /*!< Host channel error count. */ - uint32_t NyetErrCnt; /*!< Complete Split NYET Host channel error count. */ - - USB_URBStateTypeDef urb_state; /*!< URB state. - This parameter can be any value of @ref USB_URBStateTypeDef */ - - USB_HCStateTypeDef state; /*!< Host Channel state. - This parameter can be any value of @ref USB_HCStateTypeDef */ -} USB_HCTypeDef; - -typedef USB_ModeTypeDef USB_OTG_ModeTypeDef; -typedef USB_CfgTypeDef USB_OTG_CfgTypeDef; -typedef USB_EPTypeDef USB_OTG_EPTypeDef; -typedef USB_URBStateTypeDef USB_OTG_URBStateTypeDef; -typedef USB_HCStateTypeDef USB_OTG_HCStateTypeDef; -typedef USB_HCTypeDef USB_OTG_HCTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup PCD_Exported_Constants PCD Exported Constants - * @{ - */ - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** @defgroup USB_OTG_CORE VERSION ID - * @{ - */ -#define USB_OTG_CORE_ID_300A 0x4F54300AU -#define USB_OTG_CORE_ID_310A 0x4F54310AU -/** - * @} - */ - -/** @defgroup USB_Core_Mode_ USB Core Mode - * @{ - */ -#define USB_OTG_MODE_DEVICE 0U -#define USB_OTG_MODE_HOST 1U -#define USB_OTG_MODE_DRD 2U -/** - * @} - */ - -/** @defgroup USB_LL_Core_Speed USB Low Layer Core Speed - * @{ - */ -#define USB_OTG_SPEED_HIGH 0U -#define USB_OTG_SPEED_HIGH_IN_FULL 1U -#define USB_OTG_SPEED_FULL 3U -/** - * @} - */ - -/** @defgroup USB_LL_Core_PHY USB Low Layer Core PHY - * @{ - */ -#define USB_OTG_ULPI_PHY 1U -#define USB_OTG_EMBEDDED_PHY 2U -/** - * @} - */ - -/** @defgroup USB_LL_Turnaround_Timeout Turnaround Timeout Value - * @{ - */ -#ifndef USBD_HS_TRDT_VALUE -#define USBD_HS_TRDT_VALUE 9U -#endif /* USBD_HS_TRDT_VALUE */ -#ifndef USBD_FS_TRDT_VALUE -#define USBD_FS_TRDT_VALUE 5U -#define USBD_DEFAULT_TRDT_VALUE 9U -#endif /* USBD_HS_TRDT_VALUE */ -/** - * @} - */ - -/** @defgroup USB_LL_Core_MPS USB Low Layer Core MPS - * @{ - */ -#define USB_OTG_HS_MAX_PACKET_SIZE 512U -#define USB_OTG_FS_MAX_PACKET_SIZE 64U -#define USB_OTG_MAX_EP0_SIZE 64U -/** - * @} - */ - -/** @defgroup USB_LL_Core_PHY_Frequency USB Low Layer Core PHY Frequency - * @{ - */ -#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ (0U << 1) -#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ (1U << 1) -#define DSTS_ENUMSPD_FS_PHY_48MHZ (3U << 1) -/** - * @} - */ - -/** @defgroup USB_LL_CORE_Frame_Interval USB Low Layer Core Frame Interval - * @{ - */ -#define DCFG_FRAME_INTERVAL_80 0U -#define DCFG_FRAME_INTERVAL_85 1U -#define DCFG_FRAME_INTERVAL_90 2U -#define DCFG_FRAME_INTERVAL_95 3U -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -/** @defgroup USB_LL_EP0_MPS USB Low Layer EP0 MPS - * @{ - */ -#define EP_MPS_64 0U -#define EP_MPS_32 1U -#define EP_MPS_16 2U -#define EP_MPS_8 3U -/** - * @} - */ - -/** @defgroup USB_LL_EP_Type USB Low Layer EP Type - * @{ - */ -#define EP_TYPE_CTRL 0U -#define EP_TYPE_ISOC 1U -#define EP_TYPE_BULK 2U -#define EP_TYPE_INTR 3U -#define EP_TYPE_MSK 3U -/** - * @} - */ - -/** @defgroup USB_LL_EP_Speed USB Low Layer EP Speed - * @{ - */ -#define EP_SPEED_LOW 0U -#define EP_SPEED_FULL 1U -#define EP_SPEED_HIGH 2U -/** - * @} - */ - -/** @defgroup USB_LL_CH_PID_Type USB Low Layer Channel PID Type - * @{ - */ -#define HC_PID_DATA0 0U -#define HC_PID_DATA2 1U -#define HC_PID_DATA1 2U -#define HC_PID_SETUP 3U -/** - * @} - */ - -/** @defgroup USB_LL Device Speed - * @{ - */ -#define USBD_HS_SPEED 0U -#define USBD_HSINFS_SPEED 1U -#define USBH_HS_SPEED 0U -#define USBD_FS_SPEED 2U -#define USBH_FSLS_SPEED 1U -/** - * @} - */ - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** @defgroup USB_LL_STS_Defines USB Low Layer STS Defines - * @{ - */ -#define STS_GOUT_NAK 1U -#define STS_DATA_UPDT 2U -#define STS_XFER_COMP 3U -#define STS_SETUP_COMP 4U -#define STS_SETUP_UPDT 6U -/** - * @} - */ - -/** @defgroup USB_LL_HCFG_SPEED_Defines USB Low Layer HCFG Speed Defines - * @{ - */ -#define HCFG_30_60_MHZ 0U -#define HCFG_48_MHZ 1U -#define HCFG_6_MHZ 2U -/** - * @} - */ - -/** @defgroup USB_LL_HFIR_Defines USB Low Layer frame interval Defines - * @{ - */ -#define HFIR_6_MHZ 6000U -#define HFIR_60_MHZ 60000U -#define HFIR_48_MHZ 48000U -/** - * @} - */ - -/** @defgroup USB_LL_HPRT0_PRTSPD_SPEED_Defines USB Low Layer HPRT0 PRTSPD Speed Defines - * @{ - */ -#define HPRT0_PRTSPD_HIGH_SPEED 0U -#define HPRT0_PRTSPD_FULL_SPEED 1U -#define HPRT0_PRTSPD_LOW_SPEED 2U -/** - * @} - */ - -#define HCCHAR_CTRL 0U -#define HCCHAR_ISOC 1U -#define HCCHAR_BULK 2U -#define HCCHAR_INTR 3U - -#define GRXSTS_PKTSTS_IN 2U -#define GRXSTS_PKTSTS_IN_XFER_COMP 3U -#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5U -#define GRXSTS_PKTSTS_CH_HALTED 7U - -#define CLEAR_INTERRUPT_MASK 0xFFFFFFFFU - -#define HC_MAX_PKT_CNT 256U -#define ISO_SPLT_MPS 188U - -#define HCSPLT_BEGIN 1U -#define HCSPLT_MIDDLE 2U -#define HCSPLT_END 3U -#define HCSPLT_FULL 4U - -#define TEST_J 1U -#define TEST_K 2U -#define TEST_SE0_NAK 3U -#define TEST_PACKET 4U -#define TEST_FORCE_EN 5U - -#define USBx_PCGCCTL *(__IO uint32_t *)((uint32_t)USBx_BASE + USB_OTG_PCGCCTL_BASE) -#define USBx_HPRT0 *(__IO uint32_t *)((uint32_t)USBx_BASE + USB_OTG_HOST_PORT_BASE) - -#define USBx_DEVICE ((USB_OTG_DeviceTypeDef *)(USBx_BASE + USB_OTG_DEVICE_BASE)) -#define USBx_INEP(i) ((USB_OTG_INEndpointTypeDef *)(USBx_BASE\ - + USB_OTG_IN_ENDPOINT_BASE + ((i) * USB_OTG_EP_REG_SIZE))) - -#define USBx_OUTEP(i) ((USB_OTG_OUTEndpointTypeDef *)(USBx_BASE\ - + USB_OTG_OUT_ENDPOINT_BASE + ((i) * USB_OTG_EP_REG_SIZE))) - -#define USBx_DFIFO(i) *(__IO uint32_t *)(USBx_BASE + USB_OTG_FIFO_BASE + ((i) * USB_OTG_FIFO_SIZE)) - -#define USBx_HOST ((USB_OTG_HostTypeDef *)(USBx_BASE + USB_OTG_HOST_BASE)) -#define USBx_HC(i) ((USB_OTG_HostChannelTypeDef *)(USBx_BASE\ - + USB_OTG_HOST_CHANNEL_BASE\ - + ((i) * USB_OTG_HOST_CHANNEL_SIZE))) - - -#define EP_ADDR_MSK 0xFU -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup USB_LL_Exported_Macros USB Low Layer Exported Macros - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -#define USB_MASK_INTERRUPT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->GINTMSK &= ~(__INTERRUPT__)) -#define USB_UNMASK_INTERRUPT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->GINTMSK |= (__INTERRUPT__)) - -#define CLEAR_IN_EP_INTR(__EPNUM__, __INTERRUPT__) (USBx_INEP(__EPNUM__)->DIEPINT = (__INTERRUPT__)) -#define CLEAR_OUT_EP_INTR(__EPNUM__, __INTERRUPT__) (USBx_OUTEP(__EPNUM__)->DOEPINT = (__INTERRUPT__)) -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup USB_LL_Exported_Functions USB Low Layer Exported Functions - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg); -HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg); -HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, uint32_t hclk, uint8_t speed); -HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx, USB_OTG_ModeTypeDef mode); -HAL_StatusTypeDef USB_SetDevSpeed(const USB_OTG_GlobalTypeDef *USBx, uint8_t speed); -HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num); -HAL_StatusTypeDef USB_ActivateEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_DeactivateEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep, uint8_t dma); -HAL_StatusTypeDef USB_WritePacket(const USB_OTG_GlobalTypeDef *USBx, uint8_t *src, - uint8_t ch_ep_num, uint16_t len, uint8_t dma); - -void *USB_ReadPacket(const USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len); -HAL_StatusTypeDef USB_EPSetStall(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_EPClearStall(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_EPStopXfer(const USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_SetDevAddress(const USB_OTG_GlobalTypeDef *USBx, uint8_t address); -HAL_StatusTypeDef USB_DevConnect(const USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_DevDisconnect(const USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_ActivateSetup(const USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_EP0_OutStart(const USB_OTG_GlobalTypeDef *USBx, uint8_t dma, const uint8_t *psetup); -uint8_t USB_GetDevSpeed(const USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_GetMode(const USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_ReadInterrupts(USB_OTG_GlobalTypeDef const *USBx); -uint32_t USB_ReadChInterrupts(const USB_OTG_GlobalTypeDef *USBx, uint8_t chnum); -uint32_t USB_ReadDevAllOutEpInterrupt(const USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_ReadDevOutEPInterrupt(const USB_OTG_GlobalTypeDef *USBx, uint8_t epnum); -uint32_t USB_ReadDevAllInEpInterrupt(const USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_ReadDevInEPInterrupt(const USB_OTG_GlobalTypeDef *USBx, uint8_t epnum); -void USB_ClearInterrupts(USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt); - -HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg); -HAL_StatusTypeDef USB_InitFSLSPClkSel(const USB_OTG_GlobalTypeDef *USBx, uint8_t freq); -HAL_StatusTypeDef USB_ResetPort(const USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_DriveVbus(const USB_OTG_GlobalTypeDef *USBx, uint8_t state); -uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef const *USBx); -uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef const *USBx); -HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num, - uint8_t epnum, uint8_t dev_address, uint8_t speed, - uint8_t ep_type, uint16_t mps); -HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, - USB_OTG_HCTypeDef *hc, uint8_t dma); - -uint32_t USB_HC_ReadInterrupt(const USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_HC_Halt(const USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num); -HAL_StatusTypeDef USB_DoPing(const USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num); -HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_ActivateRemoteWakeup(const USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_DeActivateRemoteWakeup(const USB_OTG_GlobalTypeDef *USBx); -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* STM32F4xx_LL_USB_H */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h deleted file mode 100644 index accdac7..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h +++ /dev/null @@ -1,307 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_utils.h - * @author MCD Application Team - * @brief Header file of UTILS LL module. - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The LL UTILS driver contains a set of generic APIs that can be - used by user: - (+) Device electronic signature - (+) Timing functions - (+) PLL configuration functions - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_UTILS_H -#define __STM32F4xx_LL_UTILS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -/** @defgroup UTILS_LL UTILS - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup UTILS_LL_Private_Constants UTILS Private Constants - * @{ - */ - -/* Max delay can be used in LL_mDelay */ -#define LL_MAX_DELAY 0xFFFFFFFFU - -/** - * @brief Unique device ID register base address - */ -#define UID_BASE_ADDRESS UID_BASE - -/** - * @brief Flash size data register base address - */ -#define FLASHSIZE_BASE_ADDRESS FLASHSIZE_BASE - -/** - * @brief Package data register base address - */ -#define PACKAGE_BASE_ADDRESS PACKAGE_BASE - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup UTILS_LL_Private_Macros UTILS Private Macros - * @{ - */ -/** - * @} - */ -/* Exported types ------------------------------------------------------------*/ -/** @defgroup UTILS_LL_ES_INIT UTILS Exported structures - * @{ - */ -/** - * @brief UTILS PLL structure definition - */ -typedef struct -{ - uint32_t PLLM; /*!< Division factor for PLL VCO input clock. - This parameter can be a value of @ref RCC_LL_EC_PLLM_DIV - - This feature can be modified afterwards using unitary function - @ref LL_RCC_PLL_ConfigDomain_SYS(). */ - - uint32_t PLLN; /*!< Multiplication factor for PLL VCO output clock. - This parameter must be a number between Min_Data = @ref RCC_PLLN_MIN_VALUE - and Max_Data = @ref RCC_PLLN_MIN_VALUE - - This feature can be modified afterwards using unitary function - @ref LL_RCC_PLL_ConfigDomain_SYS(). */ - - uint32_t PLLP; /*!< Division for the main system clock. - This parameter can be a value of @ref RCC_LL_EC_PLLP_DIV - - This feature can be modified afterwards using unitary function - @ref LL_RCC_PLL_ConfigDomain_SYS(). */ -} LL_UTILS_PLLInitTypeDef; - -/** - * @brief UTILS System, AHB and APB buses clock configuration structure definition - */ -typedef struct -{ - uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). - This parameter can be a value of @ref RCC_LL_EC_SYSCLK_DIV - - This feature can be modified afterwards using unitary function - @ref LL_RCC_SetAHBPrescaler(). */ - - uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). - This parameter can be a value of @ref RCC_LL_EC_APB1_DIV - - This feature can be modified afterwards using unitary function - @ref LL_RCC_SetAPB1Prescaler(). */ - - uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). - This parameter can be a value of @ref RCC_LL_EC_APB2_DIV - - This feature can be modified afterwards using unitary function - @ref LL_RCC_SetAPB2Prescaler(). */ - -} LL_UTILS_ClkInitTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup UTILS_LL_Exported_Constants UTILS Exported Constants - * @{ - */ - -/** @defgroup UTILS_EC_HSE_BYPASS HSE Bypass activation - * @{ - */ -#define LL_UTILS_HSEBYPASS_OFF 0x00000000U /*!< HSE Bypass is not enabled */ -#define LL_UTILS_HSEBYPASS_ON 0x00000001U /*!< HSE Bypass is enabled */ -/** - * @} - */ - -/** @defgroup UTILS_EC_PACKAGETYPE PACKAGE TYPE - * @{ - */ -#define LL_UTILS_PACKAGETYPE_WLCSP36_UFQFPN48_LQFP64 0x00000000U /*!< WLCSP36 or UFQFPN48 or LQFP64 package type */ -#define LL_UTILS_PACKAGETYPE_WLCSP168_FBGA169_LQFP100_LQFP64_UFQFPN48 0x00000100U /*!< WLCSP168 or FBGA169 or LQFP100 or LQFP64 or UFQFPN48 package type */ -#define LL_UTILS_PACKAGETYPE_WLCSP64_WLCSP81_LQFP176_UFBGA176 0x00000200U /*!< WLCSP64 or WLCSP81 or LQFP176 or UFBGA176 package type */ -#define LL_UTILS_PACKAGETYPE_LQFP144_UFBGA144_UFBGA144_UFBGA100 0x00000300U /*!< LQFP144 or UFBGA144 or UFBGA144 or UFBGA100 package type */ -#define LL_UTILS_PACKAGETYPE_LQFP100_LQFP208_TFBGA216 0x00000400U /*!< LQFP100 or LQFP208 or TFBGA216 package type */ -#define LL_UTILS_PACKAGETYPE_LQFP208_TFBGA216 0x00000500U /*!< LQFP208 or TFBGA216 package type */ -#define LL_UTILS_PACKAGETYPE_TQFP64_UFBGA144_LQFP144 0x00000700U /*!< TQFP64 or UFBGA144 or LQFP144 package type */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup UTILS_LL_Exported_Functions UTILS Exported Functions - * @{ - */ - -/** @defgroup UTILS_EF_DEVICE_ELECTRONIC_SIGNATURE DEVICE ELECTRONIC SIGNATURE - * @{ - */ - -/** - * @brief Get Word0 of the unique device identifier (UID based on 96 bits) - * @retval UID[31:0] - */ -__STATIC_INLINE uint32_t LL_GetUID_Word0(void) -{ - return (uint32_t)(READ_REG(*((uint32_t *)UID_BASE_ADDRESS))); -} - -/** - * @brief Get Word1 of the unique device identifier (UID based on 96 bits) - * @retval UID[63:32] - */ -__STATIC_INLINE uint32_t LL_GetUID_Word1(void) -{ - return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 4U)))); -} - -/** - * @brief Get Word2 of the unique device identifier (UID based on 96 bits) - * @retval UID[95:64] - */ -__STATIC_INLINE uint32_t LL_GetUID_Word2(void) -{ - return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 8U)))); -} - -/** - * @brief Get Flash memory size - * @note This bitfield indicates the size of the device Flash memory expressed in - * Kbytes. As an example, 0x040 corresponds to 64 Kbytes. - * @retval FLASH_SIZE[15:0]: Flash memory size - */ -__STATIC_INLINE uint32_t LL_GetFlashSize(void) -{ - return (uint32_t)(READ_REG(*((uint32_t *)FLASHSIZE_BASE_ADDRESS)) & 0xFFFF); -} - -/** - * @brief Get Package type - * @retval Returned value can be one of the following values: - * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP36_UFQFPN48_LQFP64 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP168_FBGA169_LQFP100_LQFP64_UFQFPN48 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP64_WLCSP81_LQFP176_UFBGA176 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_LQFP144_UFBGA144_UFBGA144_UFBGA100 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_LQFP100_LQFP208_TFBGA216 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_LQFP208_TFBGA216 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_TQFP64_UFBGA144_LQFP144 (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_GetPackageType(void) -{ - return (uint32_t)(READ_REG(*((uint32_t *)PACKAGE_BASE_ADDRESS)) & 0x0700U); -} - -/** - * @} - */ - -/** @defgroup UTILS_LL_EF_DELAY DELAY - * @{ - */ - -/** - * @brief This function configures the Cortex-M SysTick source of the time base. - * @param HCLKFrequency HCLK frequency in Hz (can be calculated thanks to RCC helper macro) - * @note When a RTOS is used, it is recommended to avoid changing the SysTick - * configuration by calling this function, for a delay use rather osDelay RTOS service. - * @param Ticks Frequency of Ticks (Hz) - * @retval None - */ -__STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks) -{ - /* Configure the SysTick to have interrupt in 1ms time base */ - SysTick->LOAD = (uint32_t)((HCLKFrequency / Ticks) - 1UL); /* set reload register */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */ -} - -void LL_Init1msTick(uint32_t HCLKFrequency); -void LL_mDelay(uint32_t Delay); - -/** - * @} - */ - -/** @defgroup UTILS_EF_SYSTEM SYSTEM - * @{ - */ - -void LL_SetSystemCoreClock(uint32_t HCLKFrequency); -ErrorStatus LL_SetFlashLatency(uint32_t HCLK_Frequency); -ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, - LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); -ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass, - LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_UTILS_H */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt deleted file mode 100644 index 3edc4d1..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt +++ /dev/null @@ -1,6 +0,0 @@ -This software component is provided to you as part of a software package and -applicable license terms are in the Package_license file. If you received this -software component outside of a package or without applicable license terms, -the terms of the BSD-3-Clause license shall apply. -You may obtain a copy of the BSD-3-Clause at: -https://opensource.org/licenses/BSD-3-Clause diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c deleted file mode 100644 index 4497de6..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c +++ /dev/null @@ -1,616 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal.c - * @author MCD Application Team - * @brief HAL module driver. - * This is the common part of the HAL initialization - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The common HAL driver contains a set of generic and common APIs that can be - used by the PPP peripheral drivers and the user to start using the HAL. - [..] - The HAL contains two APIs' categories: - (+) Common HAL APIs - (+) Services HAL APIs - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup HAL HAL - * @brief HAL module driver. - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup HAL_Private_Constants - * @{ - */ -/** - * @brief STM32F4xx HAL Driver version number V1.8.3 - */ -#define __STM32F4xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ -#define __STM32F4xx_HAL_VERSION_SUB1 (0x08U) /*!< [23:16] sub1 version */ -#define __STM32F4xx_HAL_VERSION_SUB2 (0x03U) /*!< [15:8] sub2 version */ -#define __STM32F4xx_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */ -#define __STM32F4xx_HAL_VERSION ((__STM32F4xx_HAL_VERSION_MAIN << 24U)\ - |(__STM32F4xx_HAL_VERSION_SUB1 << 16U)\ - |(__STM32F4xx_HAL_VERSION_SUB2 << 8U )\ - |(__STM32F4xx_HAL_VERSION_RC)) - -#define IDCODE_DEVID_MASK 0x00000FFFU - -/* ------------ RCC registers bit address in the alias region ----------- */ -#define SYSCFG_OFFSET (SYSCFG_BASE - PERIPH_BASE) -/* --- MEMRMP Register ---*/ -/* Alias word address of UFB_MODE bit */ -#define MEMRMP_OFFSET SYSCFG_OFFSET -#define UFB_MODE_BIT_NUMBER SYSCFG_MEMRMP_UFB_MODE_Pos -#define UFB_MODE_BB (uint32_t)(PERIPH_BB_BASE + (MEMRMP_OFFSET * 32U) + (UFB_MODE_BIT_NUMBER * 4U)) - -/* --- CMPCR Register ---*/ -/* Alias word address of CMP_PD bit */ -#define CMPCR_OFFSET (SYSCFG_OFFSET + 0x20U) -#define CMP_PD_BIT_NUMBER SYSCFG_CMPCR_CMP_PD_Pos -#define CMPCR_CMP_PD_BB (uint32_t)(PERIPH_BB_BASE + (CMPCR_OFFSET * 32U) + (CMP_PD_BIT_NUMBER * 4U)) - -/* --- MCHDLYCR Register ---*/ -/* Alias word address of BSCKSEL bit */ -#define MCHDLYCR_OFFSET (SYSCFG_OFFSET + 0x30U) -#define BSCKSEL_BIT_NUMBER SYSCFG_MCHDLYCR_BSCKSEL_Pos -#define MCHDLYCR_BSCKSEL_BB (uint32_t)(PERIPH_BB_BASE + (MCHDLYCR_OFFSET * 32U) + (BSCKSEL_BIT_NUMBER * 4U)) -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup HAL_Private_Variables - * @{ - */ -__IO uint32_t uwTick; -uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */ -HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ -/** - * @} - */ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup HAL_Exported_Functions HAL Exported Functions - * @{ - */ - -/** @defgroup HAL_Exported_Functions_Group1 Initialization and de-initialization Functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initializes the Flash interface the NVIC allocation and initial clock - configuration. It initializes the systick also when timeout is needed - and the backup domain when enabled. - (+) De-Initializes common part of the HAL. - (+) Configure the time base source to have 1ms time base with a dedicated - Tick interrupt priority. - (++) SysTick timer is used by default as source of time base, but user - can eventually implement his proper time base source (a general purpose - timer for example or other time source), keeping in mind that Time base - duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and - handled in milliseconds basis. - (++) Time base configuration function (HAL_InitTick ()) is called automatically - at the beginning of the program after reset by HAL_Init() or at any time - when clock is configured, by HAL_RCC_ClockConfig(). - (++) Source of time base is configured to generate interrupts at regular - time intervals. Care must be taken if HAL_Delay() is called from a - peripheral ISR process, the Tick interrupt line must have higher priority - (numerically lower) than the peripheral interrupt. Otherwise the caller - ISR process will be blocked. - (++) functions affecting time base configurations are declared as __weak - to make override possible in case of other implementations in user file. -@endverbatim - * @{ - */ - -/** - * @brief This function is used to initialize the HAL Library; it must be the first - * instruction to be executed in the main program (before to call any other - * HAL function), it performs the following: - * Configure the Flash prefetch, instruction and Data caches. - * Configures the SysTick to generate an interrupt each 1 millisecond, - * which is clocked by the HSI (at this stage, the clock is not yet - * configured and thus the system is running from the internal HSI at 16 MHz). - * Set NVIC Group Priority to 4. - * Calls the HAL_MspInit() callback function defined in user file - * "stm32f4xx_hal_msp.c" to do the global low level hardware initialization - * - * @note SysTick is used as time base for the HAL_Delay() function, the application - * need to ensure that the SysTick time base is always set to 1 millisecond - * to have correct HAL operation. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_Init(void) -{ - /* Configure Flash prefetch, Instruction cache, Data cache */ -#if (INSTRUCTION_CACHE_ENABLE != 0U) - __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); -#endif /* INSTRUCTION_CACHE_ENABLE */ - -#if (DATA_CACHE_ENABLE != 0U) - __HAL_FLASH_DATA_CACHE_ENABLE(); -#endif /* DATA_CACHE_ENABLE */ - -#if (PREFETCH_ENABLE != 0U) - __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); -#endif /* PREFETCH_ENABLE */ - - /* Set Interrupt Group Priority */ - HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); - - /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ - HAL_InitTick(TICK_INT_PRIORITY); - - /* Init the low level hardware */ - HAL_MspInit(); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief This function de-Initializes common part of the HAL and stops the systick. - * This function is optional. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DeInit(void) -{ - /* Reset of all peripherals */ - __HAL_RCC_APB1_FORCE_RESET(); - __HAL_RCC_APB1_RELEASE_RESET(); - - __HAL_RCC_APB2_FORCE_RESET(); - __HAL_RCC_APB2_RELEASE_RESET(); - - __HAL_RCC_AHB1_FORCE_RESET(); - __HAL_RCC_AHB1_RELEASE_RESET(); - - __HAL_RCC_AHB2_FORCE_RESET(); - __HAL_RCC_AHB2_RELEASE_RESET(); - - __HAL_RCC_AHB3_FORCE_RESET(); - __HAL_RCC_AHB3_RELEASE_RESET(); - - /* De-Init the low level hardware */ - HAL_MspDeInit(); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initialize the MSP. - * @retval None - */ -__weak void HAL_MspInit(void) -{ - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes the MSP. - * @retval None - */ -__weak void HAL_MspDeInit(void) -{ - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief This function configures the source of the time base. - * The time source is configured to have 1ms time base with a dedicated - * Tick interrupt priority. - * @note This function is called automatically at the beginning of program after - * reset by HAL_Init() or at any time when clock is reconfigured by HAL_RCC_ClockConfig(). - * @note In the default implementation, SysTick timer is the source of time base. - * It is used to generate interrupts at regular time intervals. - * Care must be taken if HAL_Delay() is called from a peripheral ISR process, - * The SysTick interrupt must have higher priority (numerically lower) - * than the peripheral interrupt. Otherwise the caller ISR process will be blocked. - * The function is declared as __weak to be overwritten in case of other - * implementation in user file. - * @param TickPriority Tick interrupt priority. - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) -{ - /* Configure the SysTick to have interrupt in 1ms time basis*/ - if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) - { - return HAL_ERROR; - } - - /* Configure the SysTick IRQ priority */ - if (TickPriority < (1UL << __NVIC_PRIO_BITS)) - { - HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); - uwTickPrio = TickPriority; - } - else - { - return HAL_ERROR; - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup HAL_Exported_Functions_Group2 HAL Control functions - * @brief HAL Control functions - * -@verbatim - =============================================================================== - ##### HAL Control functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Provide a tick value in millisecond - (+) Provide a blocking delay in millisecond - (+) Suspend the time base source interrupt - (+) Resume the time base source interrupt - (+) Get the HAL API driver version - (+) Get the device identifier - (+) Get the device revision identifier - (+) Enable/Disable Debug module during SLEEP mode - (+) Enable/Disable Debug module during STOP mode - (+) Enable/Disable Debug module during STANDBY mode - -@endverbatim - * @{ - */ - -/** - * @brief This function is called to increment a global variable "uwTick" - * used as application time base. - * @note In the default implementation, this variable is incremented each 1ms - * in SysTick ISR. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_IncTick(void) -{ - uwTick += uwTickFreq; -} - -/** - * @brief Provides a tick value in millisecond. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval tick value - */ -__weak uint32_t HAL_GetTick(void) -{ - return uwTick; -} - -/** - * @brief This function returns a tick priority. - * @retval tick priority - */ -uint32_t HAL_GetTickPrio(void) -{ - return uwTickPrio; -} - -/** - * @brief Set new tick Freq. - * @retval Status - */ -HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) -{ - HAL_StatusTypeDef status = HAL_OK; - HAL_TickFreqTypeDef prevTickFreq; - - assert_param(IS_TICKFREQ(Freq)); - - if (uwTickFreq != Freq) - { - /* Back up uwTickFreq frequency */ - prevTickFreq = uwTickFreq; - - /* Update uwTickFreq global variable used by HAL_InitTick() */ - uwTickFreq = Freq; - - /* Apply the new tick Freq */ - status = HAL_InitTick(uwTickPrio); - - if (status != HAL_OK) - { - /* Restore previous tick frequency */ - uwTickFreq = prevTickFreq; - } - } - - return status; -} - -/** - * @brief Return tick frequency. - * @retval Tick frequency. - * Value of @ref HAL_TickFreqTypeDef. - */ -HAL_TickFreqTypeDef HAL_GetTickFreq(void) -{ - return uwTickFreq; -} - -/** - * @brief This function provides minimum delay (in milliseconds) based - * on variable incremented. - * @note In the default implementation , SysTick timer is the source of time base. - * It is used to generate interrupts at regular time intervals where uwTick - * is incremented. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @param Delay specifies the delay time length, in milliseconds. - * @retval None - */ -__weak void HAL_Delay(uint32_t Delay) -{ - uint32_t tickstart = HAL_GetTick(); - uint32_t wait = Delay; - - /* Add a freq to guarantee minimum wait */ - if (wait < HAL_MAX_DELAY) - { - wait += (uint32_t)(uwTickFreq); - } - - while((HAL_GetTick() - tickstart) < wait) - { - } -} - -/** - * @brief Suspend Tick increment. - * @note In the default implementation , SysTick timer is the source of time base. It is - * used to generate interrupts at regular time intervals. Once HAL_SuspendTick() - * is called, the SysTick interrupt will be disabled and so Tick increment - * is suspended. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_SuspendTick(void) -{ - /* Disable SysTick Interrupt */ - SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; -} - -/** - * @brief Resume Tick increment. - * @note In the default implementation , SysTick timer is the source of time base. It is - * used to generate interrupts at regular time intervals. Once HAL_ResumeTick() - * is called, the SysTick interrupt will be enabled and so Tick increment - * is resumed. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_ResumeTick(void) -{ - /* Enable SysTick Interrupt */ - SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; -} - -/** - * @brief Returns the HAL revision - * @retval version : 0xXYZR (8bits for each decimal, R for RC) - */ -uint32_t HAL_GetHalVersion(void) -{ - return __STM32F4xx_HAL_VERSION; -} - -/** - * @brief Returns the device revision identifier. - * @retval Device revision identifier - */ -uint32_t HAL_GetREVID(void) -{ - return((DBGMCU->IDCODE) >> 16U); -} - -/** - * @brief Returns the device identifier. - * @retval Device identifier - */ -uint32_t HAL_GetDEVID(void) -{ - return((DBGMCU->IDCODE) & IDCODE_DEVID_MASK); -} - -/** - * @brief Enable the Debug Module during SLEEP mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGSleepMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Disable the Debug Module during SLEEP mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGSleepMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Enable the Debug Module during STOP mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGStopMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Disable the Debug Module during STOP mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGStopMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Enable the Debug Module during STANDBY mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGStandbyMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Disable the Debug Module during STANDBY mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGStandbyMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Enables the I/O Compensation Cell. - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V. - * @retval None - */ -void HAL_EnableCompensationCell(void) -{ - *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)ENABLE; -} - -/** - * @brief Power-down the I/O Compensation Cell. - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V. - * @retval None - */ -void HAL_DisableCompensationCell(void) -{ - *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)DISABLE; -} - -/** - * @brief Returns first word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw0(void) -{ - return (READ_REG(*((uint32_t *)UID_BASE))); -} - -/** - * @brief Returns second word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw1(void) -{ - return (READ_REG(*((uint32_t *)(UID_BASE + 4U)))); -} - -/** - * @brief Returns third word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw2(void) -{ - return (READ_REG(*((uint32_t *)(UID_BASE + 8U)))); -} - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Enables the Internal FLASH Bank Swapping. - * - * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. - * - * @note Flash Bank2 mapped at 0x08000000 (and aliased @0x00000000) - * and Flash Bank1 mapped at 0x08100000 (and aliased at 0x00100000) - * - * @retval None - */ -void HAL_EnableMemorySwappingBank(void) -{ - *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Internal FLASH Bank Swapping. - * - * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. - * - * @note The default state : Flash Bank1 mapped at 0x08000000 (and aliased @0x00000000) - * and Flash Bank2 mapped at 0x08100000 (and aliased at 0x00100000) - * - * @retval None - */ -void HAL_DisableMemorySwappingBank(void) -{ - *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)DISABLE; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c deleted file mode 100644 index c3d2ba8..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c +++ /dev/null @@ -1,538 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_cortex.c - * @author MCD Application Team - * @brief CORTEX HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the CORTEX: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - - [..] - *** How to configure Interrupts using CORTEX HAL driver *** - =========================================================== - [..] - This section provides functions allowing to configure the NVIC interrupts (IRQ). - The Cortex-M4 exceptions are managed by CMSIS functions. - - (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() - function according to the following table. - (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority(). - (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ(). - (#) please refer to programming manual for details in how to configure priority. - - -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible. - The pending IRQ priority will be managed only by the sub priority. - - -@- IRQ priority order (sorted by highest to lowest priority): - (+@) Lowest preemption priority - (+@) Lowest sub priority - (+@) Lowest hardware priority (IRQ number) - - [..] - *** How to configure Systick using CORTEX HAL driver *** - ======================================================== - [..] - Setup SysTick Timer for time base. - - (+) The HAL_SYSTICK_Config() function calls the SysTick_Config() function which - is a CMSIS function that: - (++) Configures the SysTick Reload register with value passed as function parameter. - (++) Configures the SysTick IRQ priority to the lowest value 0x0F. - (++) Resets the SysTick Counter register. - (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). - (++) Enables the SysTick Interrupt. - (++) Starts the SysTick Counter. - - (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro - __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the - HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined - inside the stm32f4xx_hal_cortex.h file. - - (+) You can change the SysTick IRQ priority by calling the - HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function - call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function. - - (+) To adjust the SysTick time base, use the following formula: - - Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) - (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function - (++) Reload Value should not exceed 0xFFFFFF - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup CORTEX CORTEX - * @brief CORTEX HAL module driver - * @{ - */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions - * @{ - */ - - -/** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] - This section provides the CORTEX HAL driver functions allowing to configure Interrupts - Systick functionalities - -@endverbatim - * @{ - */ - - -/** - * @brief Sets the priority grouping field (preemption priority and subpriority) - * using the required unlock sequence. - * @param PriorityGroup The priority grouping bits length. - * This parameter can be one of the following values: - * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority - * 4 bits for subpriority - * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority - * 3 bits for subpriority - * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority - * 2 bits for subpriority - * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority - * 1 bits for subpriority - * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority - * 0 bits for subpriority - * @note When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible. - * The pending IRQ priority will be managed only by the subpriority. - * @retval None - */ -void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - /* Check the parameters */ - assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); - - /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ - NVIC_SetPriorityGrouping(PriorityGroup); -} - -/** - * @brief Sets the priority of an interrupt. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @param PreemptPriority The preemption priority for the IRQn channel. - * This parameter can be a value between 0 and 15 - * A lower priority value indicates a higher priority - * @param SubPriority the subpriority level for the IRQ channel. - * This parameter can be a value between 0 and 15 - * A lower priority value indicates a higher priority. - * @retval None - */ -void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t prioritygroup = 0x00U; - - /* Check the parameters */ - assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); - assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); - - prioritygroup = NVIC_GetPriorityGrouping(); - - NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); -} - -/** - * @brief Enables a device specific interrupt in the NVIC interrupt controller. - * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() - * function should be called before. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Enable interrupt */ - NVIC_EnableIRQ(IRQn); -} - -/** - * @brief Disables a device specific interrupt in the NVIC interrupt controller. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Disable interrupt */ - NVIC_DisableIRQ(IRQn); -} - -/** - * @brief Initiates a system reset request to reset the MCU. - * @retval None - */ -void HAL_NVIC_SystemReset(void) -{ - /* System Reset */ - NVIC_SystemReset(); -} - -/** - * @brief Initializes the System Timer and its interrupt, and starts the System Tick Timer. - * Counter is in free running mode to generate periodic interrupts. - * @param TicksNumb Specifies the ticks Number of ticks between two interrupts. - * @retval status: - 0 Function succeeded. - * - 1 Function failed. - */ -uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) -{ - return SysTick_Config(TicksNumb); -} -/** - * @} - */ - -/** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions - * @brief Cortex control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control the CORTEX - (NVIC, SYSTICK, MPU) functionalities. - - -@endverbatim - * @{ - */ - -#if (__MPU_PRESENT == 1U) -/** - * @brief Disables the MPU - * @retval None - */ -void HAL_MPU_Disable(void) -{ - /* Make sure outstanding transfers are done */ - __DMB(); - - /* Disable fault exceptions */ - SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; - - /* Disable the MPU and clear the control register*/ - MPU->CTRL = 0U; -} - -/** - * @brief Enable the MPU. - * @param MPU_Control Specifies the control mode of the MPU during hard fault, - * NMI, FAULTMASK and privileged access to the default memory - * This parameter can be one of the following values: - * @arg MPU_HFNMI_PRIVDEF_NONE - * @arg MPU_HARDFAULT_NMI - * @arg MPU_PRIVILEGED_DEFAULT - * @arg MPU_HFNMI_PRIVDEF - * @retval None - */ -void HAL_MPU_Enable(uint32_t MPU_Control) -{ - /* Enable the MPU */ - MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; - - /* Enable fault exceptions */ - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - /* Ensure MPU setting take effects */ - __DSB(); - __ISB(); -} - -/** - * @brief Enables the MPU Region. - * @retval None - */ -void HAL_MPU_EnableRegion(uint32_t RegionNumber) -{ - /* Check the parameters */ - assert_param(IS_MPU_REGION_NUMBER(RegionNumber)); - - /* Set the Region number */ - MPU->RNR = RegionNumber; - - /* Enable the Region */ - SET_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); -} - -/** - * @brief Disables the MPU Region. - * @retval None - */ -void HAL_MPU_DisableRegion(uint32_t RegionNumber) -{ - /* Check the parameters */ - assert_param(IS_MPU_REGION_NUMBER(RegionNumber)); - - /* Set the Region number */ - MPU->RNR = RegionNumber; - - /* Disable the Region */ - CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); -} - -/** - * @brief Initializes and configures the Region and the memory to be protected. - * @param MPU_Init Pointer to a MPU_Region_InitTypeDef structure that contains - * the initialization and configuration information. - * @retval None - */ -void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init) -{ - /* Check the parameters */ - assert_param(IS_MPU_REGION_NUMBER(MPU_Init->Number)); - assert_param(IS_MPU_REGION_ENABLE(MPU_Init->Enable)); - assert_param(IS_MPU_INSTRUCTION_ACCESS(MPU_Init->DisableExec)); - assert_param(IS_MPU_REGION_PERMISSION_ATTRIBUTE(MPU_Init->AccessPermission)); - assert_param(IS_MPU_TEX_LEVEL(MPU_Init->TypeExtField)); - assert_param(IS_MPU_ACCESS_SHAREABLE(MPU_Init->IsShareable)); - assert_param(IS_MPU_ACCESS_CACHEABLE(MPU_Init->IsCacheable)); - assert_param(IS_MPU_ACCESS_BUFFERABLE(MPU_Init->IsBufferable)); - assert_param(IS_MPU_SUB_REGION_DISABLE(MPU_Init->SubRegionDisable)); - assert_param(IS_MPU_REGION_SIZE(MPU_Init->Size)); - - /* Set the Region number */ - MPU->RNR = MPU_Init->Number; - - /* Disable the Region */ - CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); - - /* Apply configuration */ - MPU->RBAR = MPU_Init->BaseAddress; - MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) | - ((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) | - ((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) | - ((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) | - ((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) | - ((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) | - ((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) | - ((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) | - ((uint32_t)MPU_Init->Enable << MPU_RASR_ENABLE_Pos); -} -#endif /* __MPU_PRESENT */ - -/** - * @brief Clear pending events. - * @retval None - */ -void HAL_CORTEX_ClearEvent(void) -{ - __SEV(); - __WFE(); -} - -/** - * @brief Gets the priority grouping field from the NVIC Interrupt Controller. - * @retval Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field) - */ -uint32_t HAL_NVIC_GetPriorityGrouping(void) -{ - /* Get the PRIGROUP[10:8] field value */ - return NVIC_GetPriorityGrouping(); -} - -/** - * @brief Gets the priority of an interrupt. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @param PriorityGroup the priority grouping bits length. - * This parameter can be one of the following values: - * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority - * 4 bits for subpriority - * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority - * 3 bits for subpriority - * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority - * 2 bits for subpriority - * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority - * 1 bits for subpriority - * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority - * 0 bits for subpriority - * @param pPreemptPriority Pointer on the Preemptive priority value (starting from 0). - * @param pSubPriority Pointer on the Subpriority value (starting from 0). - * @retval None - */ -void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority) -{ - /* Check the parameters */ - assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); - /* Get priority for Cortex-M system or device specific interrupts */ - NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); -} - -/** - * @brief Sets Pending bit of an external interrupt. - * @param IRQn External interrupt number - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Set interrupt pending */ - NVIC_SetPendingIRQ(IRQn); -} - -/** - * @brief Gets Pending Interrupt (reads the pending register in the NVIC - * and returns the pending bit for the specified interrupt). - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval status: - 0 Interrupt status is not pending. - * - 1 Interrupt status is pending. - */ -uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Return 1 if pending else 0 */ - return NVIC_GetPendingIRQ(IRQn); -} - -/** - * @brief Clears the pending bit of an external interrupt. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Clear pending interrupt */ - NVIC_ClearPendingIRQ(IRQn); -} - -/** - * @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit). - * @param IRQn External interrupt number - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval status: - 0 Interrupt status is not pending. - * - 1 Interrupt status is pending. - */ -uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Return 1 if active else 0 */ - return NVIC_GetActive(IRQn); -} - -/** - * @brief Configures the SysTick clock source. - * @param CLKSource specifies the SysTick clock source. - * This parameter can be one of the following values: - * @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. - * @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. - * @retval None - */ -void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) -{ - /* Check the parameters */ - assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); - if (CLKSource == SYSTICK_CLKSOURCE_HCLK) - { - SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; - } - else - { - SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; - } -} - -/** - * @brief This function handles SYSTICK interrupt request. - * @retval None - */ -void HAL_SYSTICK_IRQHandler(void) -{ - HAL_SYSTICK_Callback(); -} - -/** - * @brief SYSTICK callback. - * @retval None - */ -__weak void HAL_SYSTICK_Callback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SYSTICK_Callback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_CORTEX_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.c deleted file mode 100644 index 9bd354a..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.c +++ /dev/null @@ -1,328 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_crc.c - * @author MCD Application Team - * @brief CRC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Cyclic Redundancy Check (CRC) peripheral: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * + Peripheral State functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] - (+) Enable CRC AHB clock using __HAL_RCC_CRC_CLK_ENABLE(); - (+) Initialize CRC calculator - (++) specify generating polynomial (peripheral default or non-default one) - (++) specify initialization value (peripheral default or non-default one) - (++) specify input data format - (++) specify input or output data inversion mode if any - (+) Use HAL_CRC_Accumulate() function to compute the CRC value of the - input data buffer starting with the previously computed CRC as - initialization value - (+) Use HAL_CRC_Calculate() function to compute the CRC value of the - input data buffer starting with the defined initialization value - (default or non-default) to initiate CRC calculation - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup CRC CRC - * @brief CRC HAL module driver. - * @{ - */ - -#ifdef HAL_CRC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup CRC_Exported_Functions CRC Exported Functions - * @{ - */ - -/** @defgroup CRC_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions. - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize the CRC according to the specified parameters - in the CRC_InitTypeDef and create the associated handle - (+) DeInitialize the CRC peripheral - (+) Initialize the CRC MSP (MCU Specific Package) - (+) DeInitialize the CRC MSP - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the CRC according to the specified - * parameters in the CRC_InitTypeDef and create the associated handle. - * @param hcrc CRC handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRC_Init(CRC_HandleTypeDef *hcrc) -{ - /* Check the CRC handle allocation */ - if (hcrc == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_CRC_ALL_INSTANCE(hcrc->Instance)); - - if (hcrc->State == HAL_CRC_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hcrc->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_CRC_MspInit(hcrc); - } - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief DeInitialize the CRC peripheral. - * @param hcrc CRC handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRC_DeInit(CRC_HandleTypeDef *hcrc) -{ - /* Check the CRC handle allocation */ - if (hcrc == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_CRC_ALL_INSTANCE(hcrc->Instance)); - - /* Check the CRC peripheral state */ - if (hcrc->State == HAL_CRC_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_BUSY; - - /* Reset CRC calculation unit */ - __HAL_CRC_DR_RESET(hcrc); - - /* Reset IDR register content */ - __HAL_CRC_SET_IDR(hcrc, 0); - - /* DeInit the low level hardware */ - HAL_CRC_MspDeInit(hcrc); - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_RESET; - - /* Process unlocked */ - __HAL_UNLOCK(hcrc); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRC MSP. - * @param hcrc CRC handle - * @retval None - */ -__weak void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hcrc); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_CRC_MspInit can be implemented in the user file - */ -} - -/** - * @brief DeInitialize the CRC MSP. - * @param hcrc CRC handle - * @retval None - */ -__weak void HAL_CRC_MspDeInit(CRC_HandleTypeDef *hcrc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hcrc); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_CRC_MspDeInit can be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup CRC_Exported_Functions_Group2 Peripheral Control functions - * @brief management functions. - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) compute the 32-bit CRC value of a 32-bit data buffer - using combination of the previous CRC value and the new one. - - [..] or - - (+) compute the 32-bit CRC value of a 32-bit data buffer - independently of the previous CRC value. - -@endverbatim - * @{ - */ - -/** - * @brief Compute the 32-bit CRC value of a 32-bit data buffer - * starting with the previously computed CRC as initialization value. - * @param hcrc CRC handle - * @param pBuffer pointer to the input data buffer. - * @param BufferLength input data buffer length (number of uint32_t words). - * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits) - */ -uint32_t HAL_CRC_Accumulate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength) -{ - uint32_t index; /* CRC input data buffer index */ - uint32_t temp = 0U; /* CRC output (read from hcrc->Instance->DR register) */ - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_BUSY; - - /* Enter Data to the CRC calculator */ - for (index = 0U; index < BufferLength; index++) - { - hcrc->Instance->DR = pBuffer[index]; - } - temp = hcrc->Instance->DR; - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_READY; - - /* Return the CRC computed value */ - return temp; -} - -/** - * @brief Compute the 32-bit CRC value of a 32-bit data buffer - * starting with hcrc->Instance->INIT as initialization value. - * @param hcrc CRC handle - * @param pBuffer pointer to the input data buffer. - * @param BufferLength input data buffer length (number of uint32_t words). - * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits) - */ -uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength) -{ - uint32_t index; /* CRC input data buffer index */ - uint32_t temp = 0U; /* CRC output (read from hcrc->Instance->DR register) */ - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_BUSY; - - /* Reset CRC Calculation Unit (hcrc->Instance->INIT is - * written in hcrc->Instance->DR) */ - __HAL_CRC_DR_RESET(hcrc); - - /* Enter 32-bit input data to the CRC calculator */ - for (index = 0U; index < BufferLength; index++) - { - hcrc->Instance->DR = pBuffer[index]; - } - temp = hcrc->Instance->DR; - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_READY; - - /* Return the CRC computed value */ - return temp; -} - -/** - * @} - */ - -/** @defgroup CRC_Exported_Functions_Group3 Peripheral State functions - * @brief Peripheral State functions. - * -@verbatim - =============================================================================== - ##### Peripheral State functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Return the CRC handle state. - * @param hcrc CRC handle - * @retval HAL state - */ -HAL_CRC_StateTypeDef HAL_CRC_GetState(const CRC_HandleTypeDef *hcrc) -{ - /* Return CRC handle state */ - return hcrc->State; -} - -/** - * @} - */ - -/** - * @} - */ - - -#endif /* HAL_CRC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c deleted file mode 100644 index 3dbb477..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c +++ /dev/null @@ -1,1305 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma.c - * @author MCD Application Team - * @brief DMA HAL module driver. - * - * This file provides firmware functions to manage the following - * functionalities of the Direct Memory Access (DMA) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral State and errors functions - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Enable and configure the peripheral to be connected to the DMA Stream - (except for internal SRAM/FLASH memories: no initialization is - necessary) please refer to Reference manual for connection between peripherals - and DMA requests. - - (#) For a given Stream, program the required configuration through the following parameters: - Transfer Direction, Source and Destination data formats, - Circular, Normal or peripheral flow control mode, Stream Priority level, - Source and Destination Increment mode, FIFO mode and its Threshold (if needed), - Burst mode for Source and/or Destination (if needed) using HAL_DMA_Init() function. - - -@- Prior to HAL_DMA_Init() the clock must be enabled for DMA through the following macros: - __HAL_RCC_DMA1_CLK_ENABLE() or __HAL_RCC_DMA2_CLK_ENABLE(). - - *** Polling mode IO operation *** - ================================= - [..] - (+) Use HAL_DMA_Start() to start DMA transfer after the configuration of Source - address and destination address and the Length of data to be transferred. - (+) Use HAL_DMA_PollForTransfer() to poll for the end of current transfer, in this - case a fixed Timeout can be configured by User depending from his application. - (+) Use HAL_DMA_Abort() function to abort the current transfer. - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Configure the DMA interrupt priority using HAL_NVIC_SetPriority() - (+) Enable the DMA IRQ handler using HAL_NVIC_EnableIRQ() - (+) Use HAL_DMA_Start_IT() to start DMA transfer after the configuration of - Source address and destination address and the Length of data to be transferred. In this - case the DMA interrupt is configured - (+) Use HAL_DMA_IRQHandler() called under DMA_IRQHandler() Interrupt subroutine - (+) At the end of data transfer HAL_DMA_IRQHandler() function is executed and user can - add his own function by customization of function pointer XferCpltCallback and - XferErrorCallback (i.e a member of DMA handle structure). - [..] - (#) Use HAL_DMA_GetState() function to return the DMA state and HAL_DMA_GetError() in case of error - detection. - - (#) Use HAL_DMA_Abort_IT() function to abort the current transfer - - -@- In Memory-to-Memory transfer mode, Circular mode is not allowed. - - -@- The FIFO is used mainly to reduce bus usage and to allow data packing/unpacking: it is - possible to set different Data Sizes for the Peripheral and the Memory (ie. you can set - Half-Word data size for the peripheral to access its data register and set Word data size - for the Memory to gain in access time. Each two half words will be packed and written in - a single access to a Word in the Memory). - - -@- When FIFO is disabled, it is not allowed to configure different Data Sizes for Source - and Destination. In this case the Peripheral Data Size will be applied to both Source - and Destination. - - *** DMA HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in DMA HAL driver. - - (+) __HAL_DMA_ENABLE: Enable the specified DMA Stream. - (+) __HAL_DMA_DISABLE: Disable the specified DMA Stream. - (+) __HAL_DMA_GET_IT_SOURCE: Check whether the specified DMA Stream interrupt has occurred or not. - - [..] - (@) You can refer to the DMA HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup DMA DMA - * @brief DMA HAL module driver - * @{ - */ - -#ifdef HAL_DMA_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -typedef struct -{ - __IO uint32_t ISR; /*!< DMA interrupt status register */ - __IO uint32_t Reserved0; - __IO uint32_t IFCR; /*!< DMA interrupt flag clear register */ -} DMA_Base_Registers; - -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @addtogroup DMA_Private_Constants - * @{ - */ - #define HAL_TIMEOUT_DMA_ABORT 5U /* 5 ms */ -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup DMA_Private_Functions - * @{ - */ -static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma); - -/** - * @} - */ - -/* Exported functions ---------------------------------------------------------*/ -/** @addtogroup DMA_Exported_Functions - * @{ - */ - -/** @addtogroup DMA_Exported_Functions_Group1 - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to initialize the DMA Stream source - and destination addresses, incrementation and data sizes, transfer direction, - circular/normal mode selection, memory-to-memory mode selection and Stream priority value. - [..] - The HAL_DMA_Init() function follows the DMA configuration procedures as described in - reference manual. - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the DMA according to the specified - * parameters in the DMA_InitTypeDef and create the associated handle. - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) -{ - uint32_t tmp = 0U; - uint32_t tickstart = HAL_GetTick(); - DMA_Base_Registers *regs; - - /* Check the DMA peripheral state */ - if(hdma == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); - assert_param(IS_DMA_CHANNEL(hdma->Init.Channel)); - assert_param(IS_DMA_DIRECTION(hdma->Init.Direction)); - assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc)); - assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc)); - assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment)); - assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment)); - assert_param(IS_DMA_MODE(hdma->Init.Mode)); - assert_param(IS_DMA_PRIORITY(hdma->Init.Priority)); - assert_param(IS_DMA_FIFO_MODE_STATE(hdma->Init.FIFOMode)); - /* Check the memory burst, peripheral burst and FIFO threshold parameters only - when FIFO mode is enabled */ - if(hdma->Init.FIFOMode != DMA_FIFOMODE_DISABLE) - { - assert_param(IS_DMA_FIFO_THRESHOLD(hdma->Init.FIFOThreshold)); - assert_param(IS_DMA_MEMORY_BURST(hdma->Init.MemBurst)); - assert_param(IS_DMA_PERIPHERAL_BURST(hdma->Init.PeriphBurst)); - } - - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Allocate lock resource */ - __HAL_UNLOCK(hdma); - - /* Disable the peripheral */ - __HAL_DMA_DISABLE(hdma); - - /* Check if the DMA Stream is effectively disabled */ - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_TIMEOUT; - - return HAL_TIMEOUT; - } - } - - /* Get the CR register value */ - tmp = hdma->Instance->CR; - - /* Clear CHSEL, MBURST, PBURST, PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR, CT and DBM bits */ - tmp &= ((uint32_t)~(DMA_SxCR_CHSEL | DMA_SxCR_MBURST | DMA_SxCR_PBURST | \ - DMA_SxCR_PL | DMA_SxCR_MSIZE | DMA_SxCR_PSIZE | \ - DMA_SxCR_MINC | DMA_SxCR_PINC | DMA_SxCR_CIRC | \ - DMA_SxCR_DIR | DMA_SxCR_CT | DMA_SxCR_DBM)); - - /* Prepare the DMA Stream configuration */ - tmp |= hdma->Init.Channel | hdma->Init.Direction | - hdma->Init.PeriphInc | hdma->Init.MemInc | - hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | - hdma->Init.Mode | hdma->Init.Priority; - - /* the Memory burst and peripheral burst are not used when the FIFO is disabled */ - if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) - { - /* Get memory burst and peripheral burst */ - tmp |= hdma->Init.MemBurst | hdma->Init.PeriphBurst; - } - - /* Write to DMA Stream CR register */ - hdma->Instance->CR = tmp; - - /* Get the FCR register value */ - tmp = hdma->Instance->FCR; - - /* Clear Direct mode and FIFO threshold bits */ - tmp &= (uint32_t)~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH); - - /* Prepare the DMA Stream FIFO configuration */ - tmp |= hdma->Init.FIFOMode; - - /* The FIFO threshold is not used when the FIFO mode is disabled */ - if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) - { - /* Get the FIFO threshold */ - tmp |= hdma->Init.FIFOThreshold; - - /* Check compatibility between FIFO threshold level and size of the memory burst */ - /* for INCR4, INCR8, INCR16 bursts */ - if (hdma->Init.MemBurst != DMA_MBURST_SINGLE) - { - if (DMA_CheckFifoParam(hdma) != HAL_OK) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_PARAM; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - return HAL_ERROR; - } - } - } - - /* Write to DMA Stream FCR */ - hdma->Instance->FCR = tmp; - - /* Initialize StreamBaseAddress and StreamIndex parameters to be used to calculate - DMA steam Base Address needed by HAL_DMA_IRQHandler() and HAL_DMA_PollForTransfer() */ - regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); - - /* Clear all interrupt flags */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Initialize the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the DMA peripheral - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma) -{ - DMA_Base_Registers *regs; - - /* Check the DMA peripheral state */ - if(hdma == NULL) - { - return HAL_ERROR; - } - - /* Check the DMA peripheral state */ - if(hdma->State == HAL_DMA_STATE_BUSY) - { - /* Return error status */ - return HAL_BUSY; - } - - /* Check the parameters */ - assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); - - /* Disable the selected DMA Streamx */ - __HAL_DMA_DISABLE(hdma); - - /* Reset DMA Streamx control register */ - hdma->Instance->CR = 0U; - - /* Reset DMA Streamx number of data to transfer register */ - hdma->Instance->NDTR = 0U; - - /* Reset DMA Streamx peripheral address register */ - hdma->Instance->PAR = 0U; - - /* Reset DMA Streamx memory 0 address register */ - hdma->Instance->M0AR = 0U; - - /* Reset DMA Streamx memory 1 address register */ - hdma->Instance->M1AR = 0U; - - /* Reset DMA Streamx FIFO control register */ - hdma->Instance->FCR = 0x00000021U; - - /* Get DMA steam Base Address */ - regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); - - /* Clean all callbacks */ - hdma->XferCpltCallback = NULL; - hdma->XferHalfCpltCallback = NULL; - hdma->XferM1CpltCallback = NULL; - hdma->XferM1HalfCpltCallback = NULL; - hdma->XferErrorCallback = NULL; - hdma->XferAbortCallback = NULL; - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Reset the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Reset the DMA state */ - hdma->State = HAL_DMA_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return HAL_OK; -} - -/** - * @} - */ - -/** @addtogroup DMA_Exported_Functions_Group2 - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the source, destination address and data length and Start DMA transfer - (+) Configure the source, destination address and data length and - Start DMA transfer with interrupt - (+) Abort DMA transfer - (+) Poll for transfer complete - (+) Handle DMA interrupt request - -@endverbatim - * @{ - */ - -/** - * @brief Starts the DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Configure the source, destination address and the data length */ - DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Enable the Peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - return status; -} - -/** - * @brief Start the DMA Transfer with interrupt enabled. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Configure the source, destination address and the data length */ - DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Enable Common interrupts*/ - hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; - - if(hdma->XferHalfCpltCallback != NULL) - { - hdma->Instance->CR |= DMA_IT_HT; - } - - /* Enable the Peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - - return status; -} - -/** - * @brief Aborts the DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * - * @note After disabling a DMA Stream, a check for wait until the DMA Stream is - * effectively disabled is added. If a Stream is disabled - * while a data transfer is ongoing, the current data will be transferred - * and the Stream will be effectively disabled only after the transfer of - * this single data is finished. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma) -{ - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - uint32_t tickstart = HAL_GetTick(); - - if(hdma->State != HAL_DMA_STATE_BUSY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_ERROR; - } - else - { - /* Disable all the transfer interrupts */ - hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); - hdma->Instance->FCR &= ~(DMA_IT_FE); - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - - /* Check if the DMA Stream is effectively disabled */ - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_TIMEOUT; - } - } - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Change the DMA state*/ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - } - return HAL_OK; -} - -/** - * @brief Aborts the DMA Transfer in Interrupt mode. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma) -{ - if(hdma->State != HAL_DMA_STATE_BUSY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - return HAL_ERROR; - } - else - { - /* Set Abort State */ - hdma->State = HAL_DMA_STATE_ABORT; - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - } - - return HAL_OK; -} - -/** - * @brief Polling for transfer complete. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CompleteLevel Specifies the DMA level complete. - * @note The polling mode is kept in this version for legacy. it is recommended to use the IT model instead. - * This model could be used for debug purpose. - * @note The HAL_DMA_PollForTransfer API cannot be used in circular and double buffering mode (automatic circular mode). - * @param Timeout Timeout duration. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t mask_cpltlevel; - uint32_t tickstart = HAL_GetTick(); - uint32_t tmpisr; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs; - - if(HAL_DMA_STATE_BUSY != hdma->State) - { - /* No transfer ongoing */ - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - __HAL_UNLOCK(hdma); - return HAL_ERROR; - } - - /* Polling mode not supported in circular mode and double buffering mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != RESET) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - return HAL_ERROR; - } - - /* Get the level transfer complete flag */ - if(CompleteLevel == HAL_DMA_FULL_TRANSFER) - { - /* Transfer Complete flag */ - mask_cpltlevel = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; - } - else - { - /* Half Transfer Complete flag */ - mask_cpltlevel = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; - } - - regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - tmpisr = regs->ISR; - - while(((tmpisr & mask_cpltlevel) == RESET) && ((hdma->ErrorCode & HAL_DMA_ERROR_TE) == RESET)) - { - /* Check for the Timeout (Not applicable in circular mode)*/ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_TIMEOUT; - } - } - - /* Get the ISR register value */ - tmpisr = regs->ISR; - - if((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_TE; - - /* Clear the transfer error flag */ - regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; - } - - if((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_FE; - - /* Clear the FIFO error flag */ - regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; - } - - if((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_DME; - - /* Clear the Direct Mode error flag */ - regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; - } - } - - if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) - { - if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) - { - HAL_DMA_Abort(hdma); - - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; - - /* Change the DMA state */ - hdma->State= HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_ERROR; - } - } - - /* Get the level transfer complete flag */ - if(CompleteLevel == HAL_DMA_FULL_TRANSFER) - { - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; - - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - } - else - { - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4) << hdma->StreamIndex; - } - - return status; -} - -/** - * @brief Handles DMA interrupt request. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval None - */ -void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) -{ - uint32_t tmpisr; - __IO uint32_t count = 0U; - uint32_t timeout = SystemCoreClock / 9600U; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - tmpisr = regs->ISR; - - /* Transfer Error Interrupt management ***************************************/ - if ((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != RESET) - { - /* Disable the transfer error interrupt */ - hdma->Instance->CR &= ~(DMA_IT_TE); - - /* Clear the transfer error flag */ - regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_TE; - } - } - /* FIFO Error Interrupt management ******************************************/ - if ((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_FE) != RESET) - { - /* Clear the FIFO error flag */ - regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_FE; - } - } - /* Direct Mode Error Interrupt management ***********************************/ - if ((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_DME) != RESET) - { - /* Clear the direct mode error flag */ - regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_DME; - } - } - /* Half Transfer Complete Interrupt management ******************************/ - if ((tmpisr & (DMA_FLAG_HTIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != RESET) - { - /* Clear the half transfer complete flag */ - regs->IFCR = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; - - /* Multi_Buffering mode enabled */ - if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) - { - /* Current memory buffer used is Memory 0 */ - if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) - { - if(hdma->XferHalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferHalfCpltCallback(hdma); - } - } - /* Current memory buffer used is Memory 1 */ - else - { - if(hdma->XferM1HalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferM1HalfCpltCallback(hdma); - } - } - } - else - { - /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */ - if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) - { - /* Disable the half transfer interrupt */ - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - if(hdma->XferHalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferHalfCpltCallback(hdma); - } - } - } - } - /* Transfer Complete Interrupt management ***********************************/ - if ((tmpisr & (DMA_FLAG_TCIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != RESET) - { - /* Clear the transfer complete flag */ - regs->IFCR = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; - - if(HAL_DMA_STATE_ABORT == hdma->State) - { - /* Disable all the transfer interrupts */ - hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); - hdma->Instance->FCR &= ~(DMA_IT_FE); - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - if(hdma->XferAbortCallback != NULL) - { - hdma->XferAbortCallback(hdma); - } - return; - } - - if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) - { - /* Current memory buffer used is Memory 0 */ - if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) - { - if(hdma->XferM1CpltCallback != NULL) - { - /* Transfer complete Callback for memory1 */ - hdma->XferM1CpltCallback(hdma); - } - } - /* Current memory buffer used is Memory 1 */ - else - { - if(hdma->XferCpltCallback != NULL) - { - /* Transfer complete Callback for memory0 */ - hdma->XferCpltCallback(hdma); - } - } - } - /* Disable the transfer complete interrupt if the DMA mode is not CIRCULAR */ - else - { - if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) - { - /* Disable the transfer complete interrupt */ - hdma->Instance->CR &= ~(DMA_IT_TC); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - } - - if(hdma->XferCpltCallback != NULL) - { - /* Transfer complete callback */ - hdma->XferCpltCallback(hdma); - } - } - } - } - - /* manage error case */ - if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) - { - if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) - { - hdma->State = HAL_DMA_STATE_ABORT; - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - - do - { - if (++count > timeout) - { - break; - } - } - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - } - - if(hdma->XferErrorCallback != NULL) - { - /* Transfer error callback */ - hdma->XferErrorCallback(hdma); - } - } -} - -/** - * @brief Register callbacks - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CallbackID User Callback identifier - * a DMA_HandleTypeDef structure as parameter. - * @param pCallback pointer to private callback function which has pointer to - * a DMA_HandleTypeDef structure as parameter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)) -{ - - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - switch (CallbackID) - { - case HAL_DMA_XFER_CPLT_CB_ID: - hdma->XferCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_HALFCPLT_CB_ID: - hdma->XferHalfCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_M1CPLT_CB_ID: - hdma->XferM1CpltCallback = pCallback; - break; - - case HAL_DMA_XFER_M1HALFCPLT_CB_ID: - hdma->XferM1HalfCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_ERROR_CB_ID: - hdma->XferErrorCallback = pCallback; - break; - - case HAL_DMA_XFER_ABORT_CB_ID: - hdma->XferAbortCallback = pCallback; - break; - - default: - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return status; -} - -/** - * @brief UnRegister callbacks - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CallbackID User Callback identifier - * a HAL_DMA_CallbackIDTypeDef ENUM as parameter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - switch (CallbackID) - { - case HAL_DMA_XFER_CPLT_CB_ID: - hdma->XferCpltCallback = NULL; - break; - - case HAL_DMA_XFER_HALFCPLT_CB_ID: - hdma->XferHalfCpltCallback = NULL; - break; - - case HAL_DMA_XFER_M1CPLT_CB_ID: - hdma->XferM1CpltCallback = NULL; - break; - - case HAL_DMA_XFER_M1HALFCPLT_CB_ID: - hdma->XferM1HalfCpltCallback = NULL; - break; - - case HAL_DMA_XFER_ERROR_CB_ID: - hdma->XferErrorCallback = NULL; - break; - - case HAL_DMA_XFER_ABORT_CB_ID: - hdma->XferAbortCallback = NULL; - break; - - case HAL_DMA_XFER_ALL_CB_ID: - hdma->XferCpltCallback = NULL; - hdma->XferHalfCpltCallback = NULL; - hdma->XferM1CpltCallback = NULL; - hdma->XferM1HalfCpltCallback = NULL; - hdma->XferErrorCallback = NULL; - hdma->XferAbortCallback = NULL; - break; - - default: - status = HAL_ERROR; - break; - } - } - else - { - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return status; -} - -/** - * @} - */ - -/** @addtogroup DMA_Exported_Functions_Group3 - * -@verbatim - =============================================================================== - ##### State and Errors functions ##### - =============================================================================== - [..] - This subsection provides functions allowing to - (+) Check the DMA state - (+) Get error code - -@endverbatim - * @{ - */ - -/** - * @brief Returns the DMA state. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL state - */ -HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma) -{ - return hdma->State; -} - -/** - * @brief Return the DMA error code - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval DMA Error Code - */ -uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma) -{ - return hdma->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup DMA_Private_Functions - * @{ - */ - -/** - * @brief Sets the DMA Transfer parameter. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - /* Clear DBM bit */ - hdma->Instance->CR &= (uint32_t)(~DMA_SxCR_DBM); - - /* Configure DMA Stream data length */ - hdma->Instance->NDTR = DataLength; - - /* Memory to Peripheral */ - if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) - { - /* Configure DMA Stream destination address */ - hdma->Instance->PAR = DstAddress; - - /* Configure DMA Stream source address */ - hdma->Instance->M0AR = SrcAddress; - } - /* Peripheral to Memory */ - else - { - /* Configure DMA Stream source address */ - hdma->Instance->PAR = SrcAddress; - - /* Configure DMA Stream destination address */ - hdma->Instance->M0AR = DstAddress; - } -} - -/** - * @brief Returns the DMA Stream base address depending on stream number - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval Stream base address - */ -static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma) -{ - uint32_t stream_number = (((uint32_t)hdma->Instance & 0xFFU) - 16U) / 24U; - - /* lookup table for necessary bitshift of flags within status registers */ - static const uint8_t flagBitshiftOffset[8U] = {0U, 6U, 16U, 22U, 0U, 6U, 16U, 22U}; - hdma->StreamIndex = flagBitshiftOffset[stream_number]; - - if (stream_number > 3U) - { - /* return pointer to HISR and HIFCR */ - hdma->StreamBaseAddress = (((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)) + 4U); - } - else - { - /* return pointer to LISR and LIFCR */ - hdma->StreamBaseAddress = ((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)); - } - - return hdma->StreamBaseAddress; -} - -/** - * @brief Check compatibility between FIFO threshold level and size of the memory burst - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmp = hdma->Init.FIFOThreshold; - - /* Memory Data size equal to Byte */ - if(hdma->Init.MemDataAlignment == DMA_MDATAALIGN_BYTE) - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_HALFFULL: - if (hdma->Init.MemBurst == DMA_MBURST_INC16) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_FULL: - break; - default: - break; - } - } - - /* Memory Data size equal to Half-Word */ - else if (hdma->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - status = HAL_ERROR; - break; - case DMA_FIFO_THRESHOLD_HALFFULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_FULL: - if (hdma->Init.MemBurst == DMA_MBURST_INC16) - { - status = HAL_ERROR; - } - break; - default: - break; - } - } - - /* Memory Data size equal to Word */ - else - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_HALFFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - status = HAL_ERROR; - break; - case DMA_FIFO_THRESHOLD_FULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - default: - break; - } - } - - return status; -} - -/** - * @} - */ - -#endif /* HAL_DMA_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c deleted file mode 100644 index 7167e77..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c +++ /dev/null @@ -1,313 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma_ex.c - * @author MCD Application Team - * @brief DMA Extension HAL module driver - * This file provides firmware functions to manage the following - * functionalities of the DMA Extension peripheral: - * + Extended features functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The DMA Extension HAL driver can be used as follows: - (#) Start a multi buffer transfer using the HAL_DMA_MultiBufferStart() function - for polling mode or HAL_DMA_MultiBufferStart_IT() for interrupt mode. - - -@- In Memory-to-Memory transfer mode, Multi (Double) Buffer mode is not allowed. - -@- When Multi (Double) Buffer mode is enabled the, transfer is circular by default. - -@- In Multi (Double) buffer mode, it is possible to update the base address for - the AHB memory port on the fly (DMA_SxM0AR or DMA_SxM1AR) when the stream is enabled. - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup DMAEx DMAEx - * @brief DMA Extended HAL module driver - * @{ - */ - -#ifdef HAL_DMA_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private Constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup DMAEx_Private_Functions - * @{ - */ -static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -/** - * @} - */ - -/* Exported functions ---------------------------------------------------------*/ - -/** @addtogroup DMAEx_Exported_Functions - * @{ - */ - - -/** @addtogroup DMAEx_Exported_Functions_Group1 - * -@verbatim - =============================================================================== - ##### Extended features functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the source, destination address and data length and - Start MultiBuffer DMA transfer - (+) Configure the source, destination address and data length and - Start MultiBuffer DMA transfer with interrupt - (+) Change on the fly the memory0 or memory1 address. - -@endverbatim - * @{ - */ - - -/** - * @brief Starts the multi_buffer DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Memory-to-memory transfer not supported in double buffering mode */ - if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - status = HAL_ERROR; - } - else - { - /* Process Locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Enable the double buffer mode */ - hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; - - /* Configure DMA Stream destination address */ - hdma->Instance->M1AR = SecondMemAddress; - - /* Configure the source, destination address and the data length */ - DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Enable the peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Return error status */ - status = HAL_BUSY; - } - } - return status; -} - -/** - * @brief Starts the multi_buffer DMA Transfer with interrupt enabled. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Memory-to-memory transfer not supported in double buffering mode */ - if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - return HAL_ERROR; - } - - /* Check callback functions */ - if ((NULL == hdma->XferCpltCallback) || (NULL == hdma->XferM1CpltCallback) || (NULL == hdma->XferErrorCallback)) - { - hdma->ErrorCode = HAL_DMA_ERROR_PARAM; - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Enable the Double buffer mode */ - hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; - - /* Configure DMA Stream destination address */ - hdma->Instance->M1AR = SecondMemAddress; - - /* Configure the source, destination address and the data length */ - DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Clear all flags */ - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_DME_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_FE_FLAG_INDEX(hdma)); - - /* Enable Common interrupts*/ - hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; - hdma->Instance->FCR |= DMA_IT_FE; - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR |= DMA_IT_HT; - } - - /* Enable the peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - return status; -} - -/** - * @brief Change the memory0 or memory1 address on the fly. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param Address The new address - * @param memory the memory to be changed, This parameter can be one of - * the following values: - * MEMORY0 / - * MEMORY1 - * @note The MEMORY0 address can be changed only when the current transfer use - * MEMORY1 and the MEMORY1 address can be changed only when the current - * transfer use MEMORY0. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory) -{ - if(memory == MEMORY0) - { - /* change the memory0 address */ - hdma->Instance->M0AR = Address; - } - else - { - /* change the memory1 address */ - hdma->Instance->M1AR = Address; - } - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup DMAEx_Private_Functions - * @{ - */ - -/** - * @brief Set the DMA Transfer parameter. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - /* Configure DMA Stream data length */ - hdma->Instance->NDTR = DataLength; - - /* Peripheral to Memory */ - if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) - { - /* Configure DMA Stream destination address */ - hdma->Instance->PAR = DstAddress; - - /* Configure DMA Stream source address */ - hdma->Instance->M0AR = SrcAddress; - } - /* Memory to Peripheral */ - else - { - /* Configure DMA Stream source address */ - hdma->Instance->PAR = SrcAddress; - - /* Configure DMA Stream destination address */ - hdma->Instance->M0AR = DstAddress; - } -} - -/** - * @} - */ - -#endif /* HAL_DMA_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c deleted file mode 100644 index 3e46312..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c +++ /dev/null @@ -1,553 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_exti.c - * @author MCD Application Team - * @brief EXTI HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Extended Interrupts and events controller (EXTI) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2018 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### EXTI Peripheral features ##### - ============================================================================== - [..] - (+) Each Exti line can be configured within this driver. - - (+) Exti line can be configured in 3 different modes - (++) Interrupt - (++) Event - (++) Both of them - - (+) Configurable Exti lines can be configured with 3 different triggers - (++) Rising - (++) Falling - (++) Both of them - - (+) When set in interrupt mode, configurable Exti lines have two different - interrupts pending registers which allow to distinguish which transition - occurs: - (++) Rising edge pending interrupt - (++) Falling - - (+) Exti lines 0 to 15 are linked to gpio pin number 0 to 15. Gpio port can - be selected through multiplexer. - - ##### How to use this driver ##### - ============================================================================== - [..] - - (#) Configure the EXTI line using HAL_EXTI_SetConfigLine(). - (++) Choose the interrupt line number by setting "Line" member from - EXTI_ConfigTypeDef structure. - (++) Configure the interrupt and/or event mode using "Mode" member from - EXTI_ConfigTypeDef structure. - (++) For configurable lines, configure rising and/or falling trigger - "Trigger" member from EXTI_ConfigTypeDef structure. - (++) For Exti lines linked to gpio, choose gpio port using "GPIOSel" - member from GPIO_InitTypeDef structure. - - (#) Get current Exti configuration of a dedicated line using - HAL_EXTI_GetConfigLine(). - (++) Provide exiting handle as parameter. - (++) Provide pointer on EXTI_ConfigTypeDef structure as second parameter. - - (#) Clear Exti configuration of a dedicated line using HAL_EXTI_ClearConfigLine(). - (++) Provide exiting handle as parameter. - - (#) Register callback to treat Exti interrupts using HAL_EXTI_RegisterCallback(). - (++) Provide exiting handle as first parameter. - (++) Provide which callback will be registered using one value from - EXTI_CallbackIDTypeDef. - (++) Provide callback function pointer. - - (#) Get interrupt pending bit using HAL_EXTI_GetPending(). - - (#) Clear interrupt pending bit using HAL_EXTI_ClearPending(). - - (#) Generate software interrupt using HAL_EXTI_GenerateSWI(). - - @endverbatim - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup EXTI - * @{ - */ -/** MISRA C:2012 deviation rule has been granted for following rule: - * Rule-18.1_b - Medium: Array `EXTICR' 1st subscript interval [0,7] may be out - * of bounds [0,3] in following API : - * HAL_EXTI_SetConfigLine - * HAL_EXTI_GetConfigLine - * HAL_EXTI_ClearConfigLine - */ - -#ifdef HAL_EXTI_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private defines -----------------------------------------------------------*/ -/** @defgroup EXTI_Private_Constants EXTI Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @addtogroup EXTI_Exported_Functions - * @{ - */ - -/** @addtogroup EXTI_Exported_Functions_Group1 - * @brief Configuration functions - * -@verbatim - =============================================================================== - ##### Configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Set configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @param pExtiConfig Pointer on EXTI configuration to be set. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if ((hexti == NULL) || (pExtiConfig == NULL)) - { - return HAL_ERROR; - } - - /* Check parameters */ - assert_param(IS_EXTI_LINE(pExtiConfig->Line)); - assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); - - /* Assign line number to handle */ - hexti->Line = pExtiConfig->Line; - - /* Compute line mask */ - linepos = (pExtiConfig->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* Configure triggers for configurable lines */ - if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) - { - assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); - - /* Configure rising trigger */ - /* Mask or set line */ - if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) - { - EXTI->RTSR |= maskline; - } - else - { - EXTI->RTSR &= ~maskline; - } - - /* Configure falling trigger */ - /* Mask or set line */ - if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) - { - EXTI->FTSR |= maskline; - } - else - { - EXTI->FTSR &= ~maskline; - } - - - /* Configure gpio port selection in case of gpio exti line */ - if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - SYSCFG->EXTICR[linepos >> 2u] = regval; - } - } - - /* Configure interrupt mode : read current mode */ - /* Mask or set line */ - if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) - { - EXTI->IMR |= maskline; - } - else - { - EXTI->IMR &= ~maskline; - } - - /* Configure event mode : read current mode */ - /* Mask or set line */ - if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) - { - EXTI->EMR |= maskline; - } - else - { - EXTI->EMR &= ~maskline; - } - - return HAL_OK; -} - -/** - * @brief Get configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @param pExtiConfig Pointer on structure to store Exti configuration. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if ((hexti == NULL) || (pExtiConfig == NULL)) - { - return HAL_ERROR; - } - - /* Check the parameter */ - assert_param(IS_EXTI_LINE(hexti->Line)); - - /* Store handle line number to configuration structure */ - pExtiConfig->Line = hexti->Line; - - /* Compute line mask */ - linepos = (pExtiConfig->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* 1] Get core mode : interrupt */ - - /* Check if selected line is enable */ - if ((EXTI->IMR & maskline) != 0x00u) - { - pExtiConfig->Mode = EXTI_MODE_INTERRUPT; - } - else - { - pExtiConfig->Mode = EXTI_MODE_NONE; - } - - /* Get event mode */ - /* Check if selected line is enable */ - if ((EXTI->EMR & maskline) != 0x00u) - { - pExtiConfig->Mode |= EXTI_MODE_EVENT; - } - - /* Get default Trigger and GPIOSel configuration */ - pExtiConfig->Trigger = EXTI_TRIGGER_NONE; - pExtiConfig->GPIOSel = 0x00u; - - /* 2] Get trigger for configurable lines : rising */ - if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) - { - /* Check if configuration of selected line is enable */ - if ((EXTI->RTSR & maskline) != 0x00u) - { - pExtiConfig->Trigger = EXTI_TRIGGER_RISING; - } - - /* Get falling configuration */ - /* Check if configuration of selected line is enable */ - if ((EXTI->FTSR & maskline) != 0x00u) - { - pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; - } - - /* Get Gpio port selection for gpio lines */ - if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - pExtiConfig->GPIOSel = (regval >> (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))) & SYSCFG_EXTICR1_EXTI0; - } - } - - return HAL_OK; -} - -/** - * @brief Clear whole configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if (hexti == NULL) - { - return HAL_ERROR; - } - - /* Check the parameter */ - assert_param(IS_EXTI_LINE(hexti->Line)); - - /* compute line mask */ - linepos = (hexti->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* 1] Clear interrupt mode */ - EXTI->IMR = (EXTI->IMR & ~maskline); - - /* 2] Clear event mode */ - EXTI->EMR = (EXTI->EMR & ~maskline); - - /* 3] Clear triggers in case of configurable lines */ - if ((hexti->Line & EXTI_CONFIG) != 0x00u) - { - EXTI->RTSR = (EXTI->RTSR & ~maskline); - EXTI->FTSR = (EXTI->FTSR & ~maskline); - - /* Get Gpio port selection for gpio lines */ - if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - SYSCFG->EXTICR[linepos >> 2u] = regval; - } - } - - return HAL_OK; -} - -/** - * @brief Register callback for a dedicated Exti line. - * @param hexti Exti handle. - * @param CallbackID User callback identifier. - * This parameter can be one of @arg @ref EXTI_CallbackIDTypeDef values. - * @param pPendingCbfn function pointer to be stored as callback. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)) -{ - HAL_StatusTypeDef status = HAL_OK; - - switch (CallbackID) - { - case HAL_EXTI_COMMON_CB_ID: - hexti->PendingCallback = pPendingCbfn; - break; - - default: - status = HAL_ERROR; - break; - } - - return status; -} - -/** - * @brief Store line number as handle private field. - * @param hexti Exti handle. - * @param ExtiLine Exti line number. - * This parameter can be from 0 to @ref EXTI_LINE_NB. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(ExtiLine)); - - /* Check null pointer */ - if (hexti == NULL) - { - return HAL_ERROR; - } - else - { - /* Store line number as handle private field */ - hexti->Line = ExtiLine; - - return HAL_OK; - } -} - -/** - * @} - */ - -/** @addtogroup EXTI_Exported_Functions_Group2 - * @brief EXTI IO functions. - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Handle EXTI interrupt request. - * @param hexti Exti handle. - * @retval none. - */ -void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) -{ - uint32_t regval; - uint32_t maskline; - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Get pending bit */ - regval = (EXTI->PR & maskline); - if (regval != 0x00u) - { - /* Clear pending bit */ - EXTI->PR = maskline; - - /* Call callback */ - if (hexti->PendingCallback != NULL) - { - hexti->PendingCallback(); - } - } -} - -/** - * @brief Get interrupt pending bit of a dedicated line. - * @param hexti Exti handle. - * @param Edge Specify which pending edge as to be checked. - * This parameter can be one of the following values: - * @arg @ref EXTI_TRIGGER_RISING_FALLING - * This parameter is kept for compatibility with other series. - * @retval 1 if interrupt is pending else 0. - */ -uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Prevent unused argument(s) compilation warning */ - UNUSED(Edge); - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - assert_param(IS_EXTI_PENDING_EDGE(Edge)); - - /* Compute line mask */ - linepos = (hexti->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* return 1 if bit is set else 0 */ - regval = ((EXTI->PR & maskline) >> linepos); - return regval; -} - -/** - * @brief Clear interrupt pending bit of a dedicated line. - * @param hexti Exti handle. - * @param Edge Specify which pending edge as to be clear. - * This parameter can be one of the following values: - * @arg @ref EXTI_TRIGGER_RISING_FALLING - * This parameter is kept for compatibility with other series. - * @retval None. - */ -void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) -{ - uint32_t maskline; - - /* Prevent unused argument(s) compilation warning */ - UNUSED(Edge); - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - assert_param(IS_EXTI_PENDING_EDGE(Edge)); - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Clear Pending bit */ - EXTI->PR = maskline; -} - -/** - * @brief Generate a software interrupt for a dedicated line. - * @param hexti Exti handle. - * @retval None. - */ -void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) -{ - uint32_t maskline; - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Generate Software interrupt */ - EXTI->SWIER = maskline; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_EXTI_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c deleted file mode 100644 index 39f19f2..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c +++ /dev/null @@ -1,769 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash.c - * @author MCD Application Team - * @brief FLASH HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the internal FLASH memory: - * + Program operations functions - * + Memory Control functions - * + Peripheral Errors functions - * - @verbatim - ============================================================================== - ##### FLASH peripheral features ##### - ============================================================================== - - [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses - to the Flash memory. It implements the erase and program Flash memory operations - and the read and write protection mechanisms. - - [..] The Flash memory interface accelerates code execution with a system of instruction - prefetch and cache lines. - - [..] The FLASH main features are: - (+) Flash memory read operations - (+) Flash memory program/erase operations - (+) Read / write protections - (+) Prefetch on I-Code - (+) 64 cache lines of 128 bits on I-Code - (+) 8 cache lines of 128 bits on D-Code - - - ##### How to use this driver ##### - ============================================================================== - [..] - This driver provides functions and macros to configure and program the FLASH - memory of all STM32F4xx devices. - - (#) FLASH Memory IO Programming functions: - (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and - HAL_FLASH_Lock() functions - (++) Program functions: byte, half word, word and double word - (++) There Two modes of programming : - (+++) Polling mode using HAL_FLASH_Program() function - (+++) Interrupt mode using HAL_FLASH_Program_IT() function - - (#) Interrupts and flags management functions : - (++) Handle FLASH interrupts by calling HAL_FLASH_IRQHandler() - (++) Wait for last FLASH operation according to its status - (++) Get error flag status by calling HAL_SetErrorCode() - - [..] - In addition to these functions, this driver includes a set of macros allowing - to handle the following operations: - (+) Set the latency - (+) Enable/Disable the prefetch buffer - (+) Enable/Disable the Instruction cache and the Data cache - (+) Reset the Instruction cache and the Data cache - (+) Enable/Disable the FLASH interrupts - (+) Monitor the FLASH flags status - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASH FLASH - * @brief FLASH HAL module driver - * @{ - */ - -#ifdef HAL_FLASH_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup FLASH_Private_Constants - * @{ - */ -#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup FLASH_Private_Variables - * @{ - */ -/* Variable used for Erase sectors under interruption */ -FLASH_ProcessTypeDef pFlash; -/** - * @} - */ - -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup FLASH_Private_Functions - * @{ - */ -/* Program operations */ -static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data); -static void FLASH_Program_Word(uint32_t Address, uint32_t Data); -static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data); -static void FLASH_Program_Byte(uint32_t Address, uint8_t Data); -static void FLASH_SetErrorCode(void); - -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Functions FLASH Exported Functions - * @{ - */ - -/** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions - * @brief Programming operation functions - * -@verbatim - =============================================================================== - ##### Programming operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the FLASH - program operations. - -@endverbatim - * @{ - */ - -/** - * @brief Program byte, halfword, word or double word at a specified address - * @param TypeProgram Indicate the way to program at a specified address. - * This parameter can be a value of @ref FLASH_Type_Program - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed - * - * @retval HAL_StatusTypeDef HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if (TypeProgram == FLASH_TYPEPROGRAM_BYTE) - { - /*Program byte (8-bit) at a specified address.*/ - FLASH_Program_Byte(Address, (uint8_t) Data); - } - else if (TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) - { - /*Program halfword (16-bit) at a specified address.*/ - FLASH_Program_HalfWord(Address, (uint16_t) Data); - } - else if (TypeProgram == FLASH_TYPEPROGRAM_WORD) - { - /*Program word (32-bit) at a specified address.*/ - FLASH_Program_Word(Address, (uint32_t) Data); - } - else - { - /*Program double word (64-bit) at a specified address.*/ - FLASH_Program_DoubleWord(Address, Data); - } - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* If the program operation is completed, disable the PG Bit */ - FLASH->CR &= (~FLASH_CR_PG); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Program byte, halfword, word or double word at a specified address with interrupt enabled. - * @param TypeProgram Indicate the way to program at a specified address. - * This parameter can be a value of @ref FLASH_Type_Program - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); - - /* Enable End of FLASH Operation interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); - - /* Enable Error source interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); - - pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM; - pFlash.Address = Address; - - if (TypeProgram == FLASH_TYPEPROGRAM_BYTE) - { - /*Program byte (8-bit) at a specified address.*/ - FLASH_Program_Byte(Address, (uint8_t) Data); - } - else if (TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) - { - /*Program halfword (16-bit) at a specified address.*/ - FLASH_Program_HalfWord(Address, (uint16_t) Data); - } - else if (TypeProgram == FLASH_TYPEPROGRAM_WORD) - { - /*Program word (32-bit) at a specified address.*/ - FLASH_Program_Word(Address, (uint32_t) Data); - } - else - { - /*Program double word (64-bit) at a specified address.*/ - FLASH_Program_DoubleWord(Address, Data); - } - - return status; -} - -/** - * @brief This function handles FLASH interrupt request. - * @retval None - */ -void HAL_FLASH_IRQHandler(void) -{ - uint32_t addresstmp = 0U; - - /* Check FLASH operation error flags */ -#if defined(FLASH_SR_RDERR) - if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) -#else - if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) -#endif /* FLASH_SR_RDERR */ - { - if (pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) - { - /*return the faulty sector*/ - addresstmp = pFlash.Sector; - pFlash.Sector = 0xFFFFFFFFU; - } - else if (pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) - { - /*return the faulty bank*/ - addresstmp = pFlash.Bank; - } - else - { - /*return the faulty address*/ - addresstmp = pFlash.Address; - } - - /*Save the Error code*/ - FLASH_SetErrorCode(); - - /* FLASH error interrupt user callback */ - HAL_FLASH_OperationErrorCallback(addresstmp); - - /*Stop the procedure ongoing*/ - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - } - - /* Check FLASH End of Operation flag */ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) - { - /* Clear FLASH End of Operation pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); - - if (pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) - { - /*Nb of sector to erased can be decreased*/ - pFlash.NbSectorsToErase--; - - /* Check if there are still sectors to erase*/ - if (pFlash.NbSectorsToErase != 0U) - { - addresstmp = pFlash.Sector; - /*Indicate user which sector has been erased*/ - HAL_FLASH_EndOfOperationCallback(addresstmp); - - /*Increment sector number*/ - pFlash.Sector++; - addresstmp = pFlash.Sector; - FLASH_Erase_Sector(addresstmp, pFlash.VoltageForErase); - } - else - { - /*No more sectors to Erase, user callback can be called.*/ - /*Reset Sector and stop Erase sectors procedure*/ - pFlash.Sector = addresstmp = 0xFFFFFFFFU; - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches(); - - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(addresstmp); - } - } - else - { - if (pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) - { - /* MassErase ended. Return the selected bank */ - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches(); - - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(pFlash.Bank); - } - else - { - /*Program ended. Return the selected address*/ - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(pFlash.Address); - } - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - } - } - - if (pFlash.ProcedureOnGoing == FLASH_PROC_NONE) - { - /* Operation is completed, disable the PG, SER, SNB and MER Bits */ - CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_SER | FLASH_CR_SNB | FLASH_MER_BIT)); - - /* Disable End of FLASH Operation interrupt */ - __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP); - - /* Disable Error source interrupt */ - __HAL_FLASH_DISABLE_IT(FLASH_IT_ERR); - } -} - -/** - * @brief FLASH end of operation interrupt callback - * @param ReturnValue The value saved in this parameter depends on the ongoing procedure - * Mass Erase: Bank number which has been requested to erase - * Sectors Erase: Sector which has been erased - * (if 0xFFFFFFFFU, it means that all the selected sectors have been erased) - * Program: Address which was selected for data program - * @retval None - */ -__weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(ReturnValue); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_FLASH_EndOfOperationCallback could be implemented in the user file - */ -} - -/** - * @brief FLASH operation error interrupt callback - * @param ReturnValue The value saved in this parameter depends on the ongoing procedure - * Mass Erase: Bank number which has been requested to erase - * Sectors Erase: Sector number which returned an error - * Program: Address which was selected for data program - * @retval None - */ -__weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(ReturnValue); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_FLASH_OperationErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions - * @brief management functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the FLASH - memory operations. - -@endverbatim - * @{ - */ - -/** - * @brief Unlock the FLASH control register access - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Unlock(void) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) - { - /* Authorize the FLASH Registers access */ - WRITE_REG(FLASH->KEYR, FLASH_KEY1); - WRITE_REG(FLASH->KEYR, FLASH_KEY2); - - /* Verify Flash is unlocked */ - if (READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) - { - status = HAL_ERROR; - } - } - - return status; -} - -/** - * @brief Locks the FLASH control register access - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Lock(void) -{ - /* Set the LOCK Bit to lock the FLASH Registers access */ - FLASH->CR |= FLASH_CR_LOCK; - - return HAL_OK; -} - -/** - * @brief Unlock the FLASH Option Control Registers access. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void) -{ - if ((FLASH->OPTCR & FLASH_OPTCR_OPTLOCK) != RESET) - { - /* Authorizes the Option Byte register programming */ - FLASH->OPTKEYR = FLASH_OPT_KEY1; - FLASH->OPTKEYR = FLASH_OPT_KEY2; - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Lock the FLASH Option Control Registers access. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Lock(void) -{ - /* Set the OPTLOCK Bit to lock the FLASH Option Byte Registers access */ - FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK; - - return HAL_OK; -} - -/** - * @brief Launch the option byte loading. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Launch(void) -{ - /* Set the OPTSTRT bit in OPTCR register */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT; - - /* Wait for last operation to be completed */ - return (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE)); -} - -/** - * @} - */ - -/** @defgroup FLASH_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief Peripheral Errors functions - * -@verbatim - =============================================================================== - ##### Peripheral Errors functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time Errors of the FLASH peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Get the specific FLASH error flag. - * @retval FLASH_ErrorCode: The returned value can be a combination of: - * @arg HAL_FLASH_ERROR_RD: FLASH Read Protection error flag (PCROP) - * @arg HAL_FLASH_ERROR_PGS: FLASH Programming Sequence error flag - * @arg HAL_FLASH_ERROR_PGP: FLASH Programming Parallelism error flag - * @arg HAL_FLASH_ERROR_PGA: FLASH Programming Alignment error flag - * @arg HAL_FLASH_ERROR_WRP: FLASH Write protected error flag - * @arg HAL_FLASH_ERROR_OPERATION: FLASH operation Error flag - */ -uint32_t HAL_FLASH_GetError(void) -{ - return pFlash.ErrorCode; -} - -/** - * @} - */ - -/** - * @brief Wait for a FLASH operation to complete. - * @param Timeout maximum flash operationtimeout - * @retval HAL Status - */ -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) -{ - uint32_t tickstart = 0U; - - /* Clear Error Code */ - pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; - - /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. - Even if the FLASH operation fails, the BUSY flag will be reset and an error - flag will be set */ - /* Get tick */ - tickstart = HAL_GetTick(); - - while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET) - { - if (Timeout != HAL_MAX_DELAY) - { - if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout)) - { - return HAL_TIMEOUT; - } - } - } - - /* Check FLASH End of Operation flag */ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) - { - /* Clear FLASH End of Operation pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); - } -#if defined(FLASH_SR_RDERR) - if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) -#else - if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) -#endif /* FLASH_SR_RDERR */ - { - /*Save the error code*/ - FLASH_SetErrorCode(); - return HAL_ERROR; - } - - /* If there is no error flag set */ - return HAL_OK; - -} - -/** - * @brief Program a double word (64-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.7V to 3.6V and Vpp in the range 7V to 9V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_DOUBLE_WORD; - FLASH->CR |= FLASH_CR_PG; - - /* Program first word */ - *(__IO uint32_t *)Address = (uint32_t)Data; - - /* Barrier to ensure programming is performed in 2 steps, in right order - (independently of compiler optimization behavior) */ - __ISB(); - - /* Program second word */ - *(__IO uint32_t *)(Address + 4) = (uint32_t)(Data >> 32); -} - - -/** - * @brief Program word (32-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.7V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_Word(uint32_t Address, uint32_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint32_t *)Address = Data; -} - -/** - * @brief Program a half-word (16-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.1V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_HALF_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint16_t *)Address = Data; -} - -/** - * @brief Program byte (8-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 1.8V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_Byte(uint32_t Address, uint8_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_BYTE; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint8_t *)Address = Data; -} - -/** - * @brief Set the specific FLASH error flag. - * @retval None - */ -static void FLASH_SetErrorCode(void) -{ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; - - /* Clear FLASH write protection error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR); - } - - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGA; - - /* Clear FLASH Programming alignment error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR); - } - - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGP; - - /* Clear FLASH Programming parallelism error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR); - } - - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGS; - - /* Clear FLASH Programming sequence error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR); - } -#if defined(FLASH_SR_RDERR) - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_RD; - - /* Clear FLASH Proprietary readout protection error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_RDERR); - } -#endif /* FLASH_SR_RDERR */ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_OPERATION; - - /* Clear FLASH Operation error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR); - } -} - -/** - * @} - */ - -#endif /* HAL_FLASH_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c deleted file mode 100644 index f919fea..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c +++ /dev/null @@ -1,1344 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ex.c - * @author MCD Application Team - * @brief Extended FLASH HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the FLASH extension peripheral: - * + Extended programming operations functions - * - @verbatim - ============================================================================== - ##### Flash Extension features ##### - ============================================================================== - - [..] Comparing to other previous devices, the FLASH interface for STM32F427xx/437xx and - STM32F429xx/439xx devices contains the following additional features - - (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write - capability (RWW) - (+) Dual bank memory organization - (+) PCROP protection for all banks - - ##### How to use this driver ##### - ============================================================================== - [..] This driver provides functions to configure and program the FLASH memory - of all STM32F427xx/437xx, STM32F429xx/439xx, STM32F469xx/479xx and STM32F446xx - devices. It includes - (#) FLASH Memory Erase functions: - (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and - HAL_FLASH_Lock() functions - (++) Erase function: Erase sector, erase all sectors - (++) There are two modes of erase : - (+++) Polling Mode using HAL_FLASHEx_Erase() - (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT() - - (#) Option Bytes Programming functions: Use HAL_FLASHEx_OBProgram() to : - (++) Set/Reset the write protection - (++) Set the Read protection Level - (++) Set the BOR level - (++) Program the user Option Bytes - (#) Advanced Option Bytes Programming functions: Use HAL_FLASHEx_AdvOBProgram() to : - (++) Extended space (bank 2) erase function - (++) Full FLASH space (2 Mo) erase (bank 1 and bank 2) - (++) Dual Boot activation - (++) Write protection configuration for bank 2 - (++) PCROP protection configuration and control for both banks - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASHEx FLASHEx - * @brief FLASH HAL Extension module driver - * @{ - */ - -#ifdef HAL_FLASH_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Constants - * @{ - */ -#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Variables - * @{ - */ -extern FLASH_ProcessTypeDef pFlash; -/** - * @} - */ - -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Functions - * @{ - */ -/* Option bytes control */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level); -static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby); -static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level); -static uint8_t FLASH_OB_GetUser(void); -static uint16_t FLASH_OB_GetWRP(void); -static uint8_t FLASH_OB_GetRDP(void); -static uint8_t FLASH_OB_GetBOR(void); - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector); -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions - * @{ - */ - -/** @defgroup FLASHEx_Exported_Functions_Group1 Extended IO operation functions - * @brief Extended IO operation functions - * -@verbatim - =============================================================================== - ##### Extended programming operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the Extension FLASH - programming operations. - -@endverbatim - * @{ - */ -/** - * @brief Perform a mass erase or erase the specified FLASH memory sectors - * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that - * contains the configuration information for the erasing. - * - * @param[out] SectorError pointer to variable that - * contains the configuration information on faulty sector in case of error - * (0xFFFFFFFFU means that all the sectors have been correctly erased) - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError) -{ - HAL_StatusTypeDef status = HAL_ERROR; - uint32_t index = 0U; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /*Initialization of SectorError variable*/ - *SectorError = 0xFFFFFFFFU; - - if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) - { - /*Mass erase to be done*/ - FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* if the erase operation is completed, disable the MER Bit */ - FLASH->CR &= (~FLASH_MER_BIT); - } - else - { - /* Check the parameters */ - assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); - - /* Erase by sector by sector to be done*/ - for (index = pEraseInit->Sector; index < (pEraseInit->NbSectors + pEraseInit->Sector); index++) - { - FLASH_Erase_Sector(index, (uint8_t) pEraseInit->VoltageRange); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* If the erase operation is completed, disable the SER and SNB Bits */ - CLEAR_BIT(FLASH->CR, (FLASH_CR_SER | FLASH_CR_SNB)); - - if (status != HAL_OK) - { - /* In case of error, stop erase procedure and return the faulty sector*/ - *SectorError = index; - break; - } - } - } - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches(); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Perform a mass erase or erase the specified FLASH memory sectors with interrupt enabled - * @param pEraseInit pointer to an FLASH_EraseInitTypeDef structure that - * contains the configuration information for the erasing. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); - - /* Enable End of FLASH Operation interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); - - /* Enable Error source interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); - - /* Clear pending flags (if any) */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \ - FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); - - if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) - { - /*Mass erase to be done*/ - pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE; - pFlash.Bank = pEraseInit->Banks; - FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); - } - else - { - /* Erase by sector to be done*/ - - /* Check the parameters */ - assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); - - pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE; - pFlash.NbSectorsToErase = pEraseInit->NbSectors; - pFlash.Sector = pEraseInit->Sector; - pFlash.VoltageForErase = (uint8_t)pEraseInit->VoltageRange; - - /*Erase 1st sector and wait for IT*/ - FLASH_Erase_Sector(pEraseInit->Sector, pEraseInit->VoltageRange); - } - - return status; -} - -/** - * @brief Program option bytes - * @param pOBInit pointer to an FLASH_OBInitStruct structure that - * contains the configuration information for the programming. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_OPTIONBYTE(pOBInit->OptionType)); - - /*Write protection configuration*/ - if ((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP) - { - assert_param(IS_WRPSTATE(pOBInit->WRPState)); - if (pOBInit->WRPState == OB_WRPSTATE_ENABLE) - { - /*Enable of Write protection on the selected Sector*/ - status = FLASH_OB_EnableWRP(pOBInit->WRPSector, pOBInit->Banks); - } - else - { - /*Disable of Write protection on the selected Sector*/ - status = FLASH_OB_DisableWRP(pOBInit->WRPSector, pOBInit->Banks); - } - } - - /*Read protection configuration*/ - if ((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP) - { - status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel); - } - - /*USER configuration*/ - if ((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER) - { - status = FLASH_OB_UserConfig(pOBInit->USERConfig & OB_IWDG_SW, - pOBInit->USERConfig & OB_STOP_NO_RST, - pOBInit->USERConfig & OB_STDBY_NO_RST); - } - - /*BOR Level configuration*/ - if ((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR) - { - status = FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Get the Option byte configuration - * @param pOBInit pointer to an FLASH_OBInitStruct structure that - * contains the configuration information for the programming. - * - * @retval None - */ -void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit) -{ - pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_BOR; - - /*Get WRP*/ - pOBInit->WRPSector = (uint32_t)FLASH_OB_GetWRP(); - - /*Get RDP Level*/ - pOBInit->RDPLevel = (uint32_t)FLASH_OB_GetRDP(); - - /*Get USER*/ - pOBInit->USERConfig = (uint8_t)FLASH_OB_GetUser(); - - /*Get BOR Level*/ - pOBInit->BORLevel = (uint32_t)FLASH_OB_GetBOR(); -} - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Program option bytes - * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that - * contains the configuration information for the programming. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_AdvOBProgram(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Check the parameters */ - assert_param(IS_OBEX(pAdvOBInit->OptionType)); - - /*Program PCROP option byte*/ - if (((pAdvOBInit->OptionType) & OPTIONBYTE_PCROP) == OPTIONBYTE_PCROP) - { - /* Check the parameters */ - assert_param(IS_PCROPSTATE(pAdvOBInit->PCROPState)); - if ((pAdvOBInit->PCROPState) == OB_PCROP_STATE_ENABLE) - { - /*Enable of Write protection on the selected Sector*/ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - status = FLASH_OB_EnablePCROP(pAdvOBInit->Sectors); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - status = FLASH_OB_EnablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - } - else - { - /*Disable of Write protection on the selected Sector*/ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - status = FLASH_OB_DisablePCROP(pAdvOBInit->Sectors); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - status = FLASH_OB_DisablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - } - } - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - /*Program BOOT config option byte*/ - if (((pAdvOBInit->OptionType) & OPTIONBYTE_BOOTCONFIG) == OPTIONBYTE_BOOTCONFIG) - { - status = FLASH_OB_BootConfig(pAdvOBInit->BootConfig); - } -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - - return status; -} - -/** - * @brief Get the OBEX byte configuration - * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that - * contains the configuration information for the programming. - * - * @retval None - */ -void HAL_FLASHEx_AdvOBGetConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) -{ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - /*Get Sector*/ - pAdvOBInit->Sectors = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - /*Get Sector for Bank1*/ - pAdvOBInit->SectorsBank1 = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); - - /*Get Sector for Bank2*/ - pAdvOBInit->SectorsBank2 = (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); - - /*Get Boot config OB*/ - pAdvOBInit->BootConfig = *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS; -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ -} - -/** - * @brief Select the Protection Mode - * - * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted - * Global Read Out Protection modification (from level1 to level0) - * @note Once SPRMOD bit is active unprotection of a protected sector is not possible - * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ - * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void) -{ - uint8_t optiontmp = 0xFF; - - /* Mask SPRMOD bit */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); - - /* Update Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_SELECTED | optiontmp); - - return HAL_OK; -} - -/** - * @brief Deselect the Protection Mode - * - * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted - * Global Read Out Protection modification (from level1 to level0) - * @note Once SPRMOD bit is active unprotection of a protected sector is not possible - * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ - * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OB_DeSelectPCROP(void) -{ - uint8_t optiontmp = 0xFF; - - /* Mask SPRMOD bit */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); - - /* Update Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_DESELECTED | optiontmp); - - return HAL_OK; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx ||\ - STM32F411xE || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Returns the FLASH Write Protection Option Bytes value for Bank 2 - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx devices. - * @retval The FLASH Write Protection Option Bytes value - */ -uint16_t HAL_FLASHEx_OB_GetBank2WRP(void) -{ - /* Return the FLASH write protection Register value */ - return (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Full erase of FLASH memory sectors - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @param Banks Banks to be erased - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * @arg FLASH_BANK_2: Bank2 to be erased - * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased - * - * @retval HAL Status - */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) -{ - /* Check the parameters */ - assert_param(IS_VOLTAGERANGE(VoltageRange)); - assert_param(IS_FLASH_BANK(Banks)); - - /* if the previous operation is completed, proceed to erase all sectors */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - - if (Banks == FLASH_BANK_BOTH) - { - /* bank1 & bank2 will be erased*/ - FLASH->CR |= FLASH_MER_BIT; - } - else if (Banks == FLASH_BANK_1) - { - /*Only bank1 will be erased*/ - FLASH->CR |= FLASH_CR_MER1; - } - else - { - /*Only bank2 will be erased*/ - FLASH->CR |= FLASH_CR_MER2; - } - FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange << 8U); -} - -/** - * @brief Erase the specified FLASH memory sector - * @param Sector FLASH sector to erase - * The value of this parameter depend on device used within the same series - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @retval None - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) -{ - uint32_t tmp_psize = 0U; - - /* Check the parameters */ - assert_param(IS_FLASH_SECTOR(Sector)); - assert_param(IS_VOLTAGERANGE(VoltageRange)); - - if (VoltageRange == FLASH_VOLTAGE_RANGE_1) - { - tmp_psize = FLASH_PSIZE_BYTE; - } - else if (VoltageRange == FLASH_VOLTAGE_RANGE_2) - { - tmp_psize = FLASH_PSIZE_HALF_WORD; - } - else if (VoltageRange == FLASH_VOLTAGE_RANGE_3) - { - tmp_psize = FLASH_PSIZE_WORD; - } - else - { - tmp_psize = FLASH_PSIZE_DOUBLE_WORD; - } - - /* Need to add offset of 4 when sector higher than FLASH_SECTOR_11 */ - if (Sector > FLASH_SECTOR_11) - { - Sector += 4U; - } - /* If the previous operation is completed, proceed to erase the sector */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= tmp_psize; - CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); - FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); - FLASH->CR |= FLASH_CR_STRT; -} - -/** - * @brief Enable the write protection of the desired bank1 or bank 2 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * This parameter can be one of the following values: - * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 - * @arg OB_WRP_SECTOR_All - * @note BANK2 starts from OB_WRP_SECTOR_12 - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL FLASH State - */ -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if (((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || - (WRPSector < OB_WRP_SECTOR_12)) - { - if (WRPSector == OB_WRP_SECTOR_All) - { - /*Write protection on all sector of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~(WRPSector >> 12)); - } - else - { - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~WRPSector); - } - } - else - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector >> 12)); - } - - /*Write protection on all sector of BANK2*/ - if ((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) - { - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector >> 12)); - } - } - - } - return status; -} - -/** - * @brief Disable the write protection of the desired bank1 or bank 2 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * This parameter can be one of the following values: - * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 - * @arg OB_WRP_Sector_All - * @note BANK2 starts from OB_WRP_SECTOR_12 - * - * @param Banks Disable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * @arg FLASH_BANK_2: Bank2 to be erased - * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if (((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || - (WRPSector < OB_WRP_SECTOR_12)) - { - if (WRPSector == OB_WRP_SECTOR_All) - { - /*Write protection on all sector of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)(WRPSector >> 12); - } - else - { - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; - } - } - else - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector >> 12); - } - - /*Write protection on all sector of BANK2*/ - if ((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) - { - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector >> 12); - } - } - - } - - return status; -} - -/** - * @brief Configure the Dual Bank Boot. - * - * @note This function can be used only for STM32F42xxx/43xxx devices. - * - * @param BootConfig specifies the Dual Bank Boot Option byte. - * This parameter can be one of the following values: - * @arg OB_Dual_BootEnabled: Dual Bank Boot Enable - * @arg OB_Dual_BootDisabled: Dual Bank Boot Disabled - * @retval None - */ -static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_BOOT(BootConfig)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /* Set Dual Bank Boot */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BFB2); - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= BootConfig; - } - - return status; -} - -/** - * @brief Enable the read/write protection (PCROP) of the desired - * sectors of Bank 1 and/or Bank 2. - * @note This function can be used only for STM32F42xxx/43xxx devices. - * @param SectorBank1 Specifies the sector(s) to be read/write protected or unprotected for bank1. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 - * @arg OB_PCROP_SECTOR__All - * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 - * @arg OB_PCROP_SECTOR__All - * @param Banks Enable PCROP protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) - { - assert_param(IS_OB_PCROP(SectorBank1)); - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)SectorBank1; - } - else - { - assert_param(IS_OB_PCROP(SectorBank2)); - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; - } - - /*Write protection on all sector of BANK2*/ - if (Banks == FLASH_BANK_BOTH) - { - assert_param(IS_OB_PCROP(SectorBank2)); - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; - } - } - - } - - return status; -} - - -/** - * @brief Disable the read/write protection (PCROP) of the desired - * sectors of Bank 1 and/or Bank 2. - * @note This function can be used only for STM32F42xxx/43xxx devices. - * @param SectorBank1 specifies the sector(s) to be read/write protected or unprotected for bank1. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 - * @arg OB_PCROP_SECTOR__All - * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 - * @arg OB_PCROP_SECTOR__All - * @param Banks Disable PCROP protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) - { - assert_param(IS_OB_PCROP(SectorBank1)); - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~SectorBank1); - } - else - { - /*Write protection done on sectors of BANK2*/ - assert_param(IS_OB_PCROP(SectorBank2)); - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); - } - - /*Write protection on all sector of BANK2*/ - if (Banks == FLASH_BANK_BOTH) - { - assert_param(IS_OB_PCROP(SectorBank2)); - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); - } - } - - } - - return status; - -} - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -/** - * @brief Mass erase of FLASH memory - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @param Banks Banks to be erased - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * - * @retval None - */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) -{ - /* Check the parameters */ - assert_param(IS_VOLTAGERANGE(VoltageRange)); - assert_param(IS_FLASH_BANK(Banks)); - - /* If the previous operation is completed, proceed to erase all sectors */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_CR_MER; - FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange << 8U); -} - -/** - * @brief Erase the specified FLASH memory sector - * @param Sector FLASH sector to erase - * The value of this parameter depend on device used within the same series - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @retval None - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) -{ - uint32_t tmp_psize = 0U; - - /* Check the parameters */ - assert_param(IS_FLASH_SECTOR(Sector)); - assert_param(IS_VOLTAGERANGE(VoltageRange)); - - if (VoltageRange == FLASH_VOLTAGE_RANGE_1) - { - tmp_psize = FLASH_PSIZE_BYTE; - } - else if (VoltageRange == FLASH_VOLTAGE_RANGE_2) - { - tmp_psize = FLASH_PSIZE_HALF_WORD; - } - else if (VoltageRange == FLASH_VOLTAGE_RANGE_3) - { - tmp_psize = FLASH_PSIZE_WORD; - } - else - { - tmp_psize = FLASH_PSIZE_DOUBLE_WORD; - } - - /* If the previous operation is completed, proceed to erase the sector */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= tmp_psize; - CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); - FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); - FLASH->CR |= FLASH_CR_STRT; -} - -/** - * @brief Enable the write protection of the desired bank 1 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * The value of this parameter depend on device used within the same series - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~WRPSector); - } - - return status; -} - -/** - * @brief Disable the write protection of the desired bank 1 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * The value of this parameter depend on device used within the same series - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; - } - - return status; -} -#endif /* STM32F40xxx || STM32F41xxx || STM32F401xx || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Enable the read/write protection (PCROP) of the desired sectors. - * @note This function can be used only for STM32F401xx devices. - * @param Sector specifies the sector(s) to be read/write protected or unprotected. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 - * @arg OB_PCROP_Sector_All - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_PCROP(Sector)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)Sector; - } - - return status; -} - - -/** - * @brief Disable the read/write protection (PCROP) of the desired sectors. - * @note This function can be used only for STM32F401xx devices. - * @param Sector specifies the sector(s) to be read/write protected or unprotected. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 - * @arg OB_PCROP_Sector_All - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_PCROP(Sector)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~Sector); - } - - return status; - -} -#endif /* STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -/** - * @brief Set the read protection level. - * @param Level specifies the read protection level. - * This parameter can be one of the following values: - * @arg OB_RDP_LEVEL_0: No protection - * @arg OB_RDP_LEVEL_1: Read protection of the memory - * @arg OB_RDP_LEVEL_2: Full chip protection - * - * @note WARNING: When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_RDP_LEVEL(Level)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint8_t *)OPTCR_BYTE1_ADDRESS = Level; - } - - return status; -} - -/** - * @brief Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. - * @param Iwdg Selects the IWDG mode - * This parameter can be one of the following values: - * @arg OB_IWDG_SW: Software IWDG selected - * @arg OB_IWDG_HW: Hardware IWDG selected - * @param Stop Reset event when entering STOP mode. - * This parameter can be one of the following values: - * @arg OB_STOP_NO_RST: No reset generated when entering in STOP - * @arg OB_STOP_RST: Reset generated when entering in STOP - * @param Stdby Reset event when entering Standby mode. - * This parameter can be one of the following values: - * @arg OB_STDBY_NO_RST: No reset generated when entering in STANDBY - * @arg OB_STDBY_RST: Reset generated when entering in STANDBY - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby) -{ - uint8_t optiontmp = 0xFF; - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_IWDG_SOURCE(Iwdg)); - assert_param(IS_OB_STOP_SOURCE(Stop)); - assert_param(IS_OB_STDBY_SOURCE(Stdby)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /* Mask OPTLOCK, OPTSTRT, BOR_LEV and BFB2 bits */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS) & (uint8_t)0x1F); - - /* Update User Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS = Iwdg | (uint8_t)(Stdby | (uint8_t)(Stop | ((uint8_t)optiontmp))); - } - - return status; -} - -/** - * @brief Set the BOR Level. - * @param Level specifies the Option Bytes BOR Reset Level. - * This parameter can be one of the following values: - * @arg OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V - * @arg OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V - * @arg OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V - * @arg OB_BOR_OFF: Supply voltage ranges from 1.62 to 2.1 V - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level) -{ - /* Check the parameters */ - assert_param(IS_OB_BOR_LEVEL(Level)); - - /* Set the BOR Level */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BOR_LEV); - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= Level; - - return HAL_OK; - -} - -/** - * @brief Return the FLASH User Option Byte value. - * @retval uint8_t FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1) - * and RST_STDBY(Bit2). - */ -static uint8_t FLASH_OB_GetUser(void) -{ - /* Return the User Option Byte */ - return ((uint8_t)(FLASH->OPTCR & 0xE0)); -} - -/** - * @brief Return the FLASH Write Protection Option Bytes value. - * @retval uint16_t FLASH Write Protection Option Bytes value - */ -static uint16_t FLASH_OB_GetWRP(void) -{ - /* Return the FLASH write protection Register value */ - return (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); -} - -/** - * @brief Returns the FLASH Read Protection level. - * @retval FLASH ReadOut Protection Status: - * This parameter can be one of the following values: - * @arg OB_RDP_LEVEL_0: No protection - * @arg OB_RDP_LEVEL_1: Read protection of the memory - * @arg OB_RDP_LEVEL_2: Full chip protection - */ -static uint8_t FLASH_OB_GetRDP(void) -{ - uint8_t readstatus = OB_RDP_LEVEL_0; - - if (*(__IO uint8_t *)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_2) - { - readstatus = OB_RDP_LEVEL_2; - } - else if (*(__IO uint8_t *)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_0) - { - readstatus = OB_RDP_LEVEL_0; - } - else - { - readstatus = OB_RDP_LEVEL_1; - } - - return readstatus; -} - -/** - * @brief Returns the FLASH BOR level. - * @retval uint8_t The FLASH BOR level: - * - OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V - * - OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V - * - OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V - * - OB_BOR_OFF : Supply voltage ranges from 1.62 to 2.1 V - */ -static uint8_t FLASH_OB_GetBOR(void) -{ - /* Return the FLASH BOR level */ - return (uint8_t)(*(__IO uint8_t *)(OPTCR_BYTE0_ADDRESS) & (uint8_t)0x0C); -} - -/** - * @brief Flush the instruction and data caches - * @retval None - */ -void FLASH_FlushCaches(void) -{ - /* Flush instruction cache */ - if (READ_BIT(FLASH->ACR, FLASH_ACR_ICEN) != RESET) - { - /* Disable instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_DISABLE(); - /* Reset instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_RESET(); - /* Enable instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); - } - - /* Flush data cache */ - if (READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != RESET) - { - /* Disable data cache */ - __HAL_FLASH_DATA_CACHE_DISABLE(); - /* Reset data cache */ - __HAL_FLASH_DATA_CACHE_RESET(); - /* Enable data cache */ - __HAL_FLASH_DATA_CACHE_ENABLE(); - } -} - -/** - * @} - */ - -#endif /* HAL_FLASH_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c deleted file mode 100644 index e6ab3ac..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c +++ /dev/null @@ -1,172 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ramfunc.c - * @author MCD Application Team - * @brief FLASH RAMFUNC module driver. - * This file provides a FLASH firmware functions which should be - * executed from internal SRAM - * + Stop/Start the flash interface while System Run - * + Enable/Disable the flash sleep while System Run - @verbatim - ============================================================================== - ##### APIs executed from Internal RAM ##### - ============================================================================== - [..] - *** ARM Compiler *** - -------------------- - [..] RAM functions are defined using the toolchain options. - Functions that are be executed in RAM should reside in a separate - source module. Using the 'Options for File' dialog you can simply change - the 'Code / Const' area of a module to a memory space in physical RAM. - Available memory areas are declared in the 'Target' tab of the - Options for Target' dialog. - - *** ICCARM Compiler *** - ----------------------- - [..] RAM functions are defined using a specific toolchain keyword "__ramfunc". - - *** GNU Compiler *** - -------------------- - [..] RAM functions are defined using a specific toolchain attribute - "__attribute__((section(".RamFunc")))". - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASH_RAMFUNC FLASH RAMFUNC - * @brief FLASH functions executed from RAM - * @{ - */ -#ifdef HAL_FLASH_MODULE_ENABLED -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASH_RAMFUNC_Exported_Functions FLASH RAMFUNC Exported Functions - * @{ - */ - -/** @defgroup FLASH_RAMFUNC_Exported_Functions_Group1 Peripheral features functions executed from internal RAM - * @brief Peripheral Extended features functions - * -@verbatim - - =============================================================================== - ##### ramfunc functions ##### - =============================================================================== - [..] - This subsection provides a set of functions that should be executed from RAM - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Stop the flash interface while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Stop the flash interface while System Run */ - SET_BIT(PWR->CR, PWR_CR_FISSR); - - return HAL_OK; -} - -/** - * @brief Start the flash interface while System Run - * @note This mode is only available for STM32F411xx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Start the flash interface while System Run */ - CLEAR_BIT(PWR->CR, PWR_CR_FISSR); - - return HAL_OK; -} - -/** - * @brief Enable the flash sleep while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode could n't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Enable the flash sleep while System Run */ - SET_BIT(PWR->CR, PWR_CR_FMSSR); - - return HAL_OK; -} - -/** - * @brief Disable the flash sleep while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Disable the flash sleep while System Run */ - CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#endif /* HAL_FLASH_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c deleted file mode 100644 index b3ce9bb..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c +++ /dev/null @@ -1,533 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio.c - * @author MCD Application Team - * @brief GPIO HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the General Purpose Input/Output (GPIO) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### GPIO Peripheral features ##### - ============================================================================== - [..] - Subject to the specific hardware characteristics of each I/O port listed in the datasheet, each - port bit of the General Purpose IO (GPIO) Ports, can be individually configured by software - in several modes: - (+) Input mode - (+) Analog mode - (+) Output mode - (+) Alternate function mode - (+) External interrupt/event lines - - [..] - During and just after reset, the alternate functions and external interrupt - lines are not active and the I/O ports are configured in input floating mode. - - [..] - All GPIO pins have weak internal pull-up and pull-down resistors, which can be - activated or not. - - [..] - In Output or Alternate mode, each IO can be configured on open-drain or push-pull - type and the IO speed can be selected depending on the VDD value. - - [..] - All ports have external interrupt/event capability. To use external interrupt - lines, the port must be configured in input mode. All available GPIO pins are - connected to the 16 external interrupt/event lines from EXTI0 to EXTI15. - - [..] - The external interrupt/event controller consists of up to 23 edge detectors - (16 lines are connected to GPIO) for generating event/interrupt requests (each - input line can be independently configured to select the type (interrupt or event) - and the corresponding trigger event (rising or falling or both). Each line can - also be masked independently. - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Enable the GPIO AHB clock using the following function: __HAL_RCC_GPIOx_CLK_ENABLE(). - - (#) Configure the GPIO pin(s) using HAL_GPIO_Init(). - (++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure - (++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef - structure. - (++) In case of Output or alternate function mode selection: the speed is - configured through "Speed" member from GPIO_InitTypeDef structure. - (++) In alternate mode is selection, the alternate function connected to the IO - is configured through "Alternate" member from GPIO_InitTypeDef structure. - (++) Analog mode is required when a pin is to be used as ADC channel - or DAC output. - (++) In case of external interrupt/event selection the "Mode" member from - GPIO_InitTypeDef structure select the type (interrupt or event) and - the corresponding trigger event (rising or falling or both). - - (#) In case of external interrupt/event mode selection, configure NVIC IRQ priority - mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using - HAL_NVIC_EnableIRQ(). - - (#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin(). - - (#) To set/reset the level of a pin configured in output mode use - HAL_GPIO_WritePin()/HAL_GPIO_TogglePin(). - - (#) To lock pin configuration until next reset use HAL_GPIO_LockPin(). - - - (#) During and just after reset, the alternate functions are not - active and the GPIO pins are configured in input floating mode (except JTAG - pins). - - (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose - (PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has - priority over the GPIO function. - - (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as - general purpose PH0 and PH1, respectively, when the HSE oscillator is off. - The HSE has priority over the GPIO function. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup GPIO GPIO - * @brief GPIO HAL module driver - * @{ - */ - -#ifdef HAL_GPIO_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup GPIO_Private_Constants GPIO Private Constants - * @{ - */ - -#define GPIO_NUMBER 16U -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Functions GPIO Exported Functions - * @{ - */ - -/** @defgroup GPIO_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to initialize and de-initialize the GPIOs - to be ready for use. - -@endverbatim - * @{ - */ - - -/** - * @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Init pointer to a GPIO_InitTypeDef structure that contains - * the configuration information for the specified GPIO peripheral. - * @retval None - */ -void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) -{ - uint32_t position; - uint32_t ioposition = 0x00U; - uint32_t iocurrent = 0x00U; - uint32_t temp = 0x00U; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); - assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); - - /* Configure the port pins */ - for(position = 0U; position < GPIO_NUMBER; position++) - { - /* Get the IO position */ - ioposition = 0x01U << position; - /* Get the current IO position */ - iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; - - if(iocurrent == ioposition) - { - /*--------------------- GPIO Mode Configuration ------------------------*/ - /* In case of Output or Alternate function mode selection */ - if(((GPIO_Init->Mode & GPIO_MODE) == MODE_OUTPUT) || \ - (GPIO_Init->Mode & GPIO_MODE) == MODE_AF) - { - /* Check the Speed parameter */ - assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); - /* Configure the IO Speed */ - temp = GPIOx->OSPEEDR; - temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); - temp |= (GPIO_Init->Speed << (position * 2U)); - GPIOx->OSPEEDR = temp; - - /* Configure the IO Output Type */ - temp = GPIOx->OTYPER; - temp &= ~(GPIO_OTYPER_OT_0 << position) ; - temp |= (((GPIO_Init->Mode & OUTPUT_TYPE) >> OUTPUT_TYPE_Pos) << position); - GPIOx->OTYPER = temp; - } - - if((GPIO_Init->Mode & GPIO_MODE) != MODE_ANALOG) - { - /* Check the parameters */ - assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); - - /* Activate the Pull-up or Pull down resistor for the current IO */ - temp = GPIOx->PUPDR; - temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); - temp |= ((GPIO_Init->Pull) << (position * 2U)); - GPIOx->PUPDR = temp; - } - - /* In case of Alternate function mode selection */ - if((GPIO_Init->Mode & GPIO_MODE) == MODE_AF) - { - /* Check the Alternate function parameter */ - assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); - /* Configure Alternate function mapped with the current IO */ - temp = GPIOx->AFR[position >> 3U]; - temp &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & 0x07U) * 4U)); - GPIOx->AFR[position >> 3U] = temp; - } - - /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ - temp = GPIOx->MODER; - temp &= ~(GPIO_MODER_MODER0 << (position * 2U)); - temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U)); - GPIOx->MODER = temp; - - /*--------------------- EXTI Mode Configuration ------------------------*/ - /* Configure the External Interrupt or event for the current IO */ - if((GPIO_Init->Mode & EXTI_MODE) != 0x00U) - { - /* Enable SYSCFG Clock */ - __HAL_RCC_SYSCFG_CLK_ENABLE(); - - temp = SYSCFG->EXTICR[position >> 2U]; - temp &= ~(0x0FU << (4U * (position & 0x03U))); - temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U))); - SYSCFG->EXTICR[position >> 2U] = temp; - - /* Clear Rising Falling edge configuration */ - temp = EXTI->RTSR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & TRIGGER_RISING) != 0x00U) - { - temp |= iocurrent; - } - EXTI->RTSR = temp; - - temp = EXTI->FTSR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & TRIGGER_FALLING) != 0x00U) - { - temp |= iocurrent; - } - EXTI->FTSR = temp; - - temp = EXTI->EMR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & EXTI_EVT) != 0x00U) - { - temp |= iocurrent; - } - EXTI->EMR = temp; - - /* Clear EXTI line configuration */ - temp = EXTI->IMR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & EXTI_IT) != 0x00U) - { - temp |= iocurrent; - } - EXTI->IMR = temp; - } - } - } -} - -/** - * @brief De-initializes the GPIOx peripheral registers to their default reset values. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to be written. - * This parameter can be one of GPIO_PIN_x where x can be (0..15). - * @retval None - */ -void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) -{ - uint32_t position; - uint32_t ioposition = 0x00U; - uint32_t iocurrent = 0x00U; - uint32_t tmp = 0x00U; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - - /* Configure the port pins */ - for(position = 0U; position < GPIO_NUMBER; position++) - { - /* Get the IO position */ - ioposition = 0x01U << position; - /* Get the current IO position */ - iocurrent = (GPIO_Pin) & ioposition; - - if(iocurrent == ioposition) - { - /*------------------------- EXTI Mode Configuration --------------------*/ - tmp = SYSCFG->EXTICR[position >> 2U]; - tmp &= (0x0FU << (4U * (position & 0x03U))); - if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U)))) - { - /* Clear EXTI line configuration */ - EXTI->IMR &= ~((uint32_t)iocurrent); - EXTI->EMR &= ~((uint32_t)iocurrent); - - /* Clear Rising Falling edge configuration */ - EXTI->FTSR &= ~((uint32_t)iocurrent); - EXTI->RTSR &= ~((uint32_t)iocurrent); - - /* Configure the External Interrupt or event for the current IO */ - tmp = 0x0FU << (4U * (position & 0x03U)); - SYSCFG->EXTICR[position >> 2U] &= ~tmp; - } - - /*------------------------- GPIO Mode Configuration --------------------*/ - /* Configure IO Direction in Input Floating Mode */ - GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2U)); - - /* Configure the default Alternate Function in current IO */ - GPIOx->AFR[position >> 3U] &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; - - /* Deactivate the Pull-up and Pull-down resistor for the current IO */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); - - /* Configure the default value IO Output Type */ - GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; - - /* Configure the default value for IO Speed */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); - } - } -} - -/** - * @} - */ - -/** @defgroup GPIO_Exported_Functions_Group2 IO operation functions - * @brief GPIO Read and Write - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Reads the specified input port pin. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to read. - * This parameter can be GPIO_PIN_x where x can be (0..15). - * @retval The input port pin value. - */ -GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - GPIO_PinState bitstatus; - - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET) - { - bitstatus = GPIO_PIN_SET; - } - else - { - bitstatus = GPIO_PIN_RESET; - } - return bitstatus; -} - -/** - * @brief Sets or clears the selected data port bit. - * - * @note This function uses GPIOx_BSRR register to allow atomic read/modify - * accesses. In this way, there is no risk of an IRQ occurring between - * the read and the modify access. - * - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to be written. - * This parameter can be one of GPIO_PIN_x where x can be (0..15). - * @param PinState specifies the value to be written to the selected bit. - * This parameter can be one of the GPIO_PinState enum values: - * @arg GPIO_PIN_RESET: to clear the port pin - * @arg GPIO_PIN_SET: to set the port pin - * @retval None - */ -void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) -{ - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - assert_param(IS_GPIO_PIN_ACTION(PinState)); - - if(PinState != GPIO_PIN_RESET) - { - GPIOx->BSRR = GPIO_Pin; - } - else - { - GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; - } -} - -/** - * @brief Toggles the specified GPIO pins. - * @param GPIOx Where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin Specifies the pins to be toggled. - * @retval None - */ -void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - uint32_t odr; - - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - /* get current Output Data Register value */ - odr = GPIOx->ODR; - - /* Set selected pins that were at low level, and reset ones that were high */ - GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin); -} - -/** - * @brief Locks GPIO Pins configuration registers. - * @note The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, - * GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. - * @note The configuration of the locked GPIO pins can no longer be modified - * until the next reset. - * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F4 family - * @param GPIO_Pin specifies the port bit to be locked. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15). - * @retval None - */ -HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - __IO uint32_t tmp = GPIO_LCKR_LCKK; - - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - /* Apply lock key write sequence */ - tmp |= GPIO_Pin; - /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ - GPIOx->LCKR = tmp; - /* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */ - GPIOx->LCKR = GPIO_Pin; - /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ - GPIOx->LCKR = tmp; - /* Read LCKR register. This read is mandatory to complete key lock sequence */ - tmp = GPIOx->LCKR; - - /* Read again in order to confirm lock is active */ - if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) - { - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief This function handles EXTI interrupt request. - * @param GPIO_Pin Specifies the pins connected EXTI line - * @retval None - */ -void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) -{ - /* EXTI line interrupt detected */ - if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) - { - __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); - HAL_GPIO_EXTI_Callback(GPIO_Pin); - } -} - -/** - * @brief EXTI line detection callbacks. - * @param GPIO_Pin Specifies the pins connected EXTI line - * @retval None - */ -__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(GPIO_Pin); - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_GPIO_EXTI_Callback could be implemented in the user file - */ -} - -/** - * @} - */ - - -/** - * @} - */ - -#endif /* HAL_GPIO_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c deleted file mode 100644 index dce9ab1..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c +++ /dev/null @@ -1,7571 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_i2c.c - * @author MCD Application Team - * @brief I2C HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Inter Integrated Circuit (I2C) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral State, Mode and Error functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The I2C HAL driver can be used as follows: - - (#) Declare a I2C_HandleTypeDef handle structure, for example: - I2C_HandleTypeDef hi2c; - - (#)Initialize the I2C low level resources by implementing the HAL_I2C_MspInit() API: - (##) Enable the I2Cx interface clock - (##) I2C pins configuration - (+++) Enable the clock for the I2C GPIOs - (+++) Configure I2C pins as alternate function open-drain - (##) NVIC configuration if you need to use interrupt process - (+++) Configure the I2Cx interrupt priority - (+++) Enable the NVIC I2C IRQ Channel - (##) DMA Configuration if you need to use DMA process - (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive stream - (+++) Enable the DMAx interface clock using - (+++) Configure the DMA handle parameters - (+++) Configure the DMA Tx or Rx stream - (+++) Associate the initialized DMA handle to the hi2c DMA Tx or Rx handle - (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on - the DMA Tx or Rx stream - - (#) Configure the Communication Speed, Duty cycle, Addressing mode, Own Address1, - Dual Addressing mode, Own Address2, General call and Nostretch mode in the hi2c Init structure. - - (#) Initialize the I2C registers by calling the HAL_I2C_Init(), configures also the low level Hardware - (GPIO, CLOCK, NVIC...etc) by calling the customized HAL_I2C_MspInit() API. - - (#) To check if target device is ready for communication, use the function HAL_I2C_IsDeviceReady() - - (#) For I2C IO and IO MEM operations, three operation modes are available within this driver : - - *** Polling mode IO operation *** - ================================= - [..] - (+) Transmit in master mode an amount of data in blocking mode using HAL_I2C_Master_Transmit() - (+) Receive in master mode an amount of data in blocking mode using HAL_I2C_Master_Receive() - (+) Transmit in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Transmit() - (+) Receive in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Receive() - - *** Polling mode IO MEM operation *** - ===================================== - [..] - (+) Write an amount of data in blocking mode to a specific memory address using HAL_I2C_Mem_Write() - (+) Read an amount of data in blocking mode from a specific memory address using HAL_I2C_Mem_Read() - - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Transmit in master mode an amount of data in non-blocking mode using HAL_I2C_Master_Transmit_IT() - (+) At transmission end of transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() - (+) Receive in master mode an amount of data in non-blocking mode using HAL_I2C_Master_Receive_IT() - (+) At reception end of transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() - (+) Transmit in slave mode an amount of data in non-blocking mode using HAL_I2C_Slave_Transmit_IT() - (+) At transmission end of transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() - (+) Receive in slave mode an amount of data in non-blocking mode using HAL_I2C_Slave_Receive_IT() - (+) At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - (+) Abort a master or memory I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() - (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_AbortCpltCallback() - - *** Interrupt mode or DMA mode IO sequential operation *** - ========================================================== - [..] - (@) These interfaces allow to manage a sequential transfer with a repeated start condition - when a direction change during transfer - [..] - (+) A specific option field manage the different steps of a sequential transfer - (+) Option field values are defined through I2C_XferOptions_definition and are listed below: - (++) I2C_FIRST_AND_LAST_FRAME: No sequential usage, functional is same as associated interfaces in no sequential mode - (++) I2C_FIRST_FRAME: Sequential usage, this option allow to manage a sequence with start condition, address - and data to transfer without a final stop condition - (++) I2C_FIRST_AND_NEXT_FRAME: Sequential usage (Master only), this option allow to manage a sequence with start condition, address - and data to transfer without a final stop condition, an then permit a call the same master sequential interface - several times (like HAL_I2C_Master_Seq_Transmit_IT() then HAL_I2C_Master_Seq_Transmit_IT() - or HAL_I2C_Master_Seq_Transmit_DMA() then HAL_I2C_Master_Seq_Transmit_DMA()) - (++) I2C_NEXT_FRAME: Sequential usage, this option allow to manage a sequence with a restart condition, address - and with new data to transfer if the direction change or manage only the new data to transfer - if no direction change and without a final stop condition in both cases - (++) I2C_LAST_FRAME: Sequential usage, this option allow to manage a sequance with a restart condition, address - and with new data to transfer if the direction change or manage only the new data to transfer - if no direction change and with a final stop condition in both cases - (++) I2C_LAST_FRAME_NO_STOP: Sequential usage (Master only), this option allow to manage a restart condition after several call of the same master sequential - interface several times (link with option I2C_FIRST_AND_NEXT_FRAME). - Usage can, transfer several bytes one by one using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) - or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) - or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) - or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME). - Then usage of this option I2C_LAST_FRAME_NO_STOP at the last Transmit or Receive sequence permit to call the opposite interface Receive or Transmit - without stopping the communication and so generate a restart condition. - (++) I2C_OTHER_FRAME: Sequential usage (Master only), this option allow to manage a restart condition after each call of the same master sequential - interface. - Usage can, transfer several bytes one by one with a restart with slave address between each bytes using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) - or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) - or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) - or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME). - Then usage of this option I2C_OTHER_AND_LAST_FRAME at the last frame to help automatic generation of STOP condition. - - (+) Different sequential I2C interfaces are listed below: - (++) Sequential transmit in master I2C mode an amount of data in non-blocking mode using HAL_I2C_Master_Seq_Transmit_IT() - or using HAL_I2C_Master_Seq_Transmit_DMA() - (+++) At transmission end of current frame transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() - (++) Sequential receive in master I2C mode an amount of data in non-blocking mode using HAL_I2C_Master_Seq_Receive_IT() - or using HAL_I2C_Master_Seq_Receive_DMA() - (+++) At reception end of current frame transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() - (++) Abort a master or memory IT or DMA I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() - (+++) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_AbortCpltCallback() - (++) Enable/disable the Address listen mode in slave I2C mode using HAL_I2C_EnableListen_IT() HAL_I2C_DisableListen_IT() - (+++) When address slave I2C match, HAL_I2C_AddrCallback() is executed and user can - add his own code to check the Address Match Code and the transmission direction request by master (Write/Read). - (+++) At Listen mode end HAL_I2C_ListenCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_ListenCpltCallback() - (++) Sequential transmit in slave I2C mode an amount of data in non-blocking mode using HAL_I2C_Slave_Seq_Transmit_IT() - or using HAL_I2C_Slave_Seq_Transmit_DMA() - (+++) At transmission end of current frame transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() - (++) Sequential receive in slave I2C mode an amount of data in non-blocking mode using HAL_I2C_Slave_Seq_Receive_IT() - or using HAL_I2C_Slave_Seq_Receive_DMA() - (+++) At reception end of current frame transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() - (++) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - - *** Interrupt mode IO MEM operation *** - ======================================= - [..] - (+) Write an amount of data in non-blocking mode with Interrupt to a specific memory address using - HAL_I2C_Mem_Write_IT() - (+) At Memory end of write transfer, HAL_I2C_MemTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback() - (+) Read an amount of data in non-blocking mode with Interrupt from a specific memory address using - HAL_I2C_Mem_Read_IT() - (+) At Memory end of read transfer, HAL_I2C_MemRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback() - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - - *** DMA mode IO operation *** - ============================== - [..] - (+) Transmit in master mode an amount of data in non-blocking mode (DMA) using - HAL_I2C_Master_Transmit_DMA() - (+) At transmission end of transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() - (+) Receive in master mode an amount of data in non-blocking mode (DMA) using - HAL_I2C_Master_Receive_DMA() - (+) At reception end of transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() - (+) Transmit in slave mode an amount of data in non-blocking mode (DMA) using - HAL_I2C_Slave_Transmit_DMA() - (+) At transmission end of transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() - (+) Receive in slave mode an amount of data in non-blocking mode (DMA) using - HAL_I2C_Slave_Receive_DMA() - (+) At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - (+) Abort a master or memory I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() - (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_AbortCpltCallback() - - *** DMA mode IO MEM operation *** - ================================= - [..] - (+) Write an amount of data in non-blocking mode with DMA to a specific memory address using - HAL_I2C_Mem_Write_DMA() - (+) At Memory end of write transfer, HAL_I2C_MemTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback() - (+) Read an amount of data in non-blocking mode with DMA from a specific memory address using - HAL_I2C_Mem_Read_DMA() - (+) At Memory end of read transfer, HAL_I2C_MemRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback() - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - - - *** I2C HAL driver macros list *** - ================================== - [..] - Below the list of most used macros in I2C HAL driver. - - (+) __HAL_I2C_ENABLE: Enable the I2C peripheral - (+) __HAL_I2C_DISABLE: Disable the I2C peripheral - (+) __HAL_I2C_GET_FLAG: Checks whether the specified I2C flag is set or not - (+) __HAL_I2C_CLEAR_FLAG: Clear the specified I2C pending flag - (+) __HAL_I2C_ENABLE_IT: Enable the specified I2C interrupt - (+) __HAL_I2C_DISABLE_IT: Disable the specified I2C interrupt - - *** Callback registration *** - ============================================= - [..] - The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - Use Functions HAL_I2C_RegisterCallback() or HAL_I2C_RegisterAddrCallback() - to register an interrupt callback. - [..] - Function HAL_I2C_RegisterCallback() allows to register following callbacks: - (+) MasterTxCpltCallback : callback for Master transmission end of transfer. - (+) MasterRxCpltCallback : callback for Master reception end of transfer. - (+) SlaveTxCpltCallback : callback for Slave transmission end of transfer. - (+) SlaveRxCpltCallback : callback for Slave reception end of transfer. - (+) ListenCpltCallback : callback for end of listen mode. - (+) MemTxCpltCallback : callback for Memory transmission end of transfer. - (+) MemRxCpltCallback : callback for Memory reception end of transfer. - (+) ErrorCallback : callback for error detection. - (+) AbortCpltCallback : callback for abort completion process. - (+) MspInitCallback : callback for Msp Init. - (+) MspDeInitCallback : callback for Msp DeInit. - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - [..] - For specific callback AddrCallback use dedicated register callbacks : HAL_I2C_RegisterAddrCallback(). - [..] - Use function HAL_I2C_UnRegisterCallback to reset a callback to the default - weak function. - HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle, - and the Callback ID. - This function allows to reset following callbacks: - (+) MasterTxCpltCallback : callback for Master transmission end of transfer. - (+) MasterRxCpltCallback : callback for Master reception end of transfer. - (+) SlaveTxCpltCallback : callback for Slave transmission end of transfer. - (+) SlaveRxCpltCallback : callback for Slave reception end of transfer. - (+) ListenCpltCallback : callback for end of listen mode. - (+) MemTxCpltCallback : callback for Memory transmission end of transfer. - (+) MemRxCpltCallback : callback for Memory reception end of transfer. - (+) ErrorCallback : callback for error detection. - (+) AbortCpltCallback : callback for abort completion process. - (+) MspInitCallback : callback for Msp Init. - (+) MspDeInitCallback : callback for Msp DeInit. - [..] - For callback AddrCallback use dedicated register callbacks : HAL_I2C_UnRegisterAddrCallback(). - [..] - By default, after the HAL_I2C_Init() and when the state is HAL_I2C_STATE_RESET - all callbacks are set to the corresponding weak functions: - examples HAL_I2C_MasterTxCpltCallback(), HAL_I2C_MasterRxCpltCallback(). - Exception done for MspInit and MspDeInit functions that are - reset to the legacy weak functions in the HAL_I2C_Init()/ HAL_I2C_DeInit() only when - these callbacks are null (not registered beforehand). - If MspInit or MspDeInit are not null, the HAL_I2C_Init()/ HAL_I2C_DeInit() - keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - [..] - Callbacks can be registered/unregistered in HAL_I2C_STATE_READY state only. - Exception done MspInit/MspDeInit functions that can be registered/unregistered - in HAL_I2C_STATE_READY or HAL_I2C_STATE_RESET state, - thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. - Then, the user first registers the MspInit/MspDeInit user callbacks - using HAL_I2C_RegisterCallback() before calling HAL_I2C_DeInit() - or HAL_I2C_Init() function. - [..] - When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available and all callbacks - are set to the corresponding weak functions. - - - - [..] - (@) You can refer to the I2C HAL driver header file for more useful macros - - @endverbatim - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup I2C I2C - * @brief I2C HAL module driver - * @{ - */ - -#ifdef HAL_I2C_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @defgroup I2C_Private_Define I2C Private Define - * @{ - */ -#define I2C_TIMEOUT_FLAG 35U /*!< Timeout 35 ms */ -#define I2C_TIMEOUT_BUSY_FLAG 25U /*!< Timeout 25 ms */ -#define I2C_TIMEOUT_STOP_FLAG 5U /*!< Timeout 5 ms */ -#define I2C_NO_OPTION_FRAME 0xFFFF0000U /*!< XferOptions default value */ - -/* Private define for @ref PreviousState usage */ -#define I2C_STATE_MSK ((uint32_t)((uint32_t)((uint32_t)HAL_I2C_STATE_BUSY_TX | (uint32_t)HAL_I2C_STATE_BUSY_RX) & (uint32_t)(~((uint32_t)HAL_I2C_STATE_READY)))) /*!< Mask State define, keep only RX and TX bits */ -#define I2C_STATE_NONE ((uint32_t)(HAL_I2C_MODE_NONE)) /*!< Default Value */ -#define I2C_STATE_MASTER_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER)) /*!< Master Busy TX, combinaison of State LSB and Mode enum */ -#define I2C_STATE_MASTER_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER)) /*!< Master Busy RX, combinaison of State LSB and Mode enum */ -#define I2C_STATE_SLAVE_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE)) /*!< Slave Busy TX, combinaison of State LSB and Mode enum */ -#define I2C_STATE_SLAVE_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE)) /*!< Slave Busy RX, combinaison of State LSB and Mode enum */ - -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/** @addtogroup I2C_Private_Macros - * @{ - */ -/* Macro to get remaining data to transfer on DMA side */ -#define I2C_GET_DMA_REMAIN_DATA(__HANDLE__) __HAL_DMA_GET_COUNTER(__HANDLE__) -/** - * @} - */ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ - -/** @defgroup I2C_Private_Functions I2C Private Functions - * @{ - */ -/* Private functions to handle DMA transfer */ -static void I2C_DMAXferCplt(DMA_HandleTypeDef *hdma); -static void I2C_DMAError(DMA_HandleTypeDef *hdma); -static void I2C_DMAAbort(DMA_HandleTypeDef *hdma); - -static void I2C_ITError(I2C_HandleTypeDef *hi2c); - -static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart); - -/* Private functions to handle flags during polling transfer */ -static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnSTOPRequestThroughIT(I2C_HandleTypeDef *hi2c); -static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c); - -/* Private functions for I2C transfer IRQ handler */ -static void I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c); -static void I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c); -static void I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c); -static void I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c); -static void I2C_Master_SB(I2C_HandleTypeDef *hi2c); -static void I2C_Master_ADD10(I2C_HandleTypeDef *hi2c); -static void I2C_Master_ADDR(I2C_HandleTypeDef *hi2c); - -static void I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c); -static void I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c); -static void I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c); -static void I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c); -static void I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c, uint32_t IT2Flags); -static void I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c); -static void I2C_Slave_AF(I2C_HandleTypeDef *hi2c); - -static void I2C_MemoryTransmit_TXE_BTF(I2C_HandleTypeDef *hi2c); - -/* Private function to Convert Specific options */ -static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c); - -/* Private function to flush DR register */ -static void I2C_Flush_DR(I2C_HandleTypeDef *hi2c); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup I2C_Exported_Functions I2C Exported Functions - * @{ - */ - -/** @defgroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - deinitialize the I2Cx peripheral: - - (+) User must Implement HAL_I2C_MspInit() function in which he configures - all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC). - - (+) Call the function HAL_I2C_Init() to configure the selected device with - the selected configuration: - (++) Communication Speed - (++) Duty cycle - (++) Addressing mode - (++) Own Address 1 - (++) Dual Addressing mode - (++) Own Address 2 - (++) General call mode - (++) Nostretch mode - - (+) Call the function HAL_I2C_DeInit() to restore the default configuration - of the selected I2Cx peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the I2C according to the specified parameters - * in the I2C_InitTypeDef and initialize the associated handle. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c) -{ - uint32_t freqrange; - uint32_t pclk1; - - /* Check the I2C handle allocation */ - if (hi2c == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - assert_param(IS_I2C_CLOCK_SPEED(hi2c->Init.ClockSpeed)); - assert_param(IS_I2C_DUTY_CYCLE(hi2c->Init.DutyCycle)); - assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1)); - assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode)); - assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode)); - assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2)); - assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode)); - assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode)); - - if (hi2c->State == HAL_I2C_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hi2c->Lock = HAL_UNLOCKED; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - /* Init the I2C Callback settings */ - hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */ - hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */ - hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallback */ - hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallback */ - hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback; /* Legacy weak ListenCpltCallback */ - hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback; /* Legacy weak MemTxCpltCallback */ - hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback; /* Legacy weak MemRxCpltCallback */ - hi2c->ErrorCallback = HAL_I2C_ErrorCallback; /* Legacy weak ErrorCallback */ - hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - hi2c->AddrCallback = HAL_I2C_AddrCallback; /* Legacy weak AddrCallback */ - - if (hi2c->MspInitCallback == NULL) - { - hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit */ - } - - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - hi2c->MspInitCallback(hi2c); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - HAL_I2C_MspInit(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the selected I2C peripheral */ - __HAL_I2C_DISABLE(hi2c); - - /*Reset I2C*/ - hi2c->Instance->CR1 |= I2C_CR1_SWRST; - hi2c->Instance->CR1 &= ~I2C_CR1_SWRST; - - /* Get PCLK1 frequency */ - pclk1 = HAL_RCC_GetPCLK1Freq(); - - /* Check the minimum allowed PCLK1 frequency */ - if (I2C_MIN_PCLK_FREQ(pclk1, hi2c->Init.ClockSpeed) == 1U) - { - return HAL_ERROR; - } - - /* Calculate frequency range */ - freqrange = I2C_FREQRANGE(pclk1); - - /*---------------------------- I2Cx CR2 Configuration ----------------------*/ - /* Configure I2Cx: Frequency range */ - MODIFY_REG(hi2c->Instance->CR2, I2C_CR2_FREQ, freqrange); - - /*---------------------------- I2Cx TRISE Configuration --------------------*/ - /* Configure I2Cx: Rise Time */ - MODIFY_REG(hi2c->Instance->TRISE, I2C_TRISE_TRISE, I2C_RISE_TIME(freqrange, hi2c->Init.ClockSpeed)); - - /*---------------------------- I2Cx CCR Configuration ----------------------*/ - /* Configure I2Cx: Speed */ - MODIFY_REG(hi2c->Instance->CCR, (I2C_CCR_FS | I2C_CCR_DUTY | I2C_CCR_CCR), I2C_SPEED(pclk1, hi2c->Init.ClockSpeed, hi2c->Init.DutyCycle)); - - /*---------------------------- I2Cx CR1 Configuration ----------------------*/ - /* Configure I2Cx: Generalcall and NoStretch mode */ - MODIFY_REG(hi2c->Instance->CR1, (I2C_CR1_ENGC | I2C_CR1_NOSTRETCH), (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode)); - - /*---------------------------- I2Cx OAR1 Configuration ---------------------*/ - /* Configure I2Cx: Own Address1 and addressing mode */ - MODIFY_REG(hi2c->Instance->OAR1, (I2C_OAR1_ADDMODE | I2C_OAR1_ADD8_9 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD0), (hi2c->Init.AddressingMode | hi2c->Init.OwnAddress1)); - - /*---------------------------- I2Cx OAR2 Configuration ---------------------*/ - /* Configure I2Cx: Dual mode and Own Address2 */ - MODIFY_REG(hi2c->Instance->OAR2, (I2C_OAR2_ENDUAL | I2C_OAR2_ADD2), (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2)); - - /* Enable the selected I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->Mode = HAL_I2C_MODE_NONE; - - return HAL_OK; -} - -/** - * @brief DeInitialize the I2C peripheral. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c) -{ - /* Check the I2C handle allocation */ - if (hi2c == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the I2C Peripheral Clock */ - __HAL_I2C_DISABLE(hi2c); - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - if (hi2c->MspDeInitCallback == NULL) - { - hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit */ - } - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - hi2c->MspDeInitCallback(hi2c); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_I2C_MspDeInit(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - hi2c->State = HAL_I2C_STATE_RESET; - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; -} - -/** - * @brief Initialize the I2C MSP. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitialize the I2C MSP. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MspDeInit could be implemented in the user file - */ -} - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User I2C Callback - * To be used instead of the weak predefined callback - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID - * @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID - * @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID - * @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID - * @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID - * @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID - * @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID - * @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID - * @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID - * @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID - * @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID - * @param pCallback pointer to the Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hi2c); - - if (HAL_I2C_STATE_READY == hi2c->State) - { - switch (CallbackID) - { - case HAL_I2C_MASTER_TX_COMPLETE_CB_ID : - hi2c->MasterTxCpltCallback = pCallback; - break; - - case HAL_I2C_MASTER_RX_COMPLETE_CB_ID : - hi2c->MasterRxCpltCallback = pCallback; - break; - - case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID : - hi2c->SlaveTxCpltCallback = pCallback; - break; - - case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID : - hi2c->SlaveRxCpltCallback = pCallback; - break; - - case HAL_I2C_LISTEN_COMPLETE_CB_ID : - hi2c->ListenCpltCallback = pCallback; - break; - - case HAL_I2C_MEM_TX_COMPLETE_CB_ID : - hi2c->MemTxCpltCallback = pCallback; - break; - - case HAL_I2C_MEM_RX_COMPLETE_CB_ID : - hi2c->MemRxCpltCallback = pCallback; - break; - - case HAL_I2C_ERROR_CB_ID : - hi2c->ErrorCallback = pCallback; - break; - - case HAL_I2C_ABORT_CB_ID : - hi2c->AbortCpltCallback = pCallback; - break; - - case HAL_I2C_MSPINIT_CB_ID : - hi2c->MspInitCallback = pCallback; - break; - - case HAL_I2C_MSPDEINIT_CB_ID : - hi2c->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_I2C_STATE_RESET == hi2c->State) - { - switch (CallbackID) - { - case HAL_I2C_MSPINIT_CB_ID : - hi2c->MspInitCallback = pCallback; - break; - - case HAL_I2C_MSPDEINIT_CB_ID : - hi2c->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - return status; -} - -/** - * @brief Unregister an I2C Callback - * I2C callback is redirected to the weak predefined callback - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * This parameter can be one of the following values: - * @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID - * @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID - * @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID - * @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID - * @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID - * @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID - * @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID - * @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID - * @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID - * @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID - * @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hi2c); - - if (HAL_I2C_STATE_READY == hi2c->State) - { - switch (CallbackID) - { - case HAL_I2C_MASTER_TX_COMPLETE_CB_ID : - hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */ - break; - - case HAL_I2C_MASTER_RX_COMPLETE_CB_ID : - hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */ - break; - - case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID : - hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallback */ - break; - - case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID : - hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallback */ - break; - - case HAL_I2C_LISTEN_COMPLETE_CB_ID : - hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback; /* Legacy weak ListenCpltCallback */ - break; - - case HAL_I2C_MEM_TX_COMPLETE_CB_ID : - hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback; /* Legacy weak MemTxCpltCallback */ - break; - - case HAL_I2C_MEM_RX_COMPLETE_CB_ID : - hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback; /* Legacy weak MemRxCpltCallback */ - break; - - case HAL_I2C_ERROR_CB_ID : - hi2c->ErrorCallback = HAL_I2C_ErrorCallback; /* Legacy weak ErrorCallback */ - break; - - case HAL_I2C_ABORT_CB_ID : - hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - break; - - case HAL_I2C_MSPINIT_CB_ID : - hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_I2C_MSPDEINIT_CB_ID : - hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_I2C_STATE_RESET == hi2c->State) - { - switch (CallbackID) - { - case HAL_I2C_MSPINIT_CB_ID : - hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_I2C_MSPDEINIT_CB_ID : - hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - return status; -} - -/** - * @brief Register the Slave Address Match I2C Callback - * To be used instead of the weak HAL_I2C_AddrCallback() predefined callback - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pCallback pointer to the Address Match Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hi2c); - - if (HAL_I2C_STATE_READY == hi2c->State) - { - hi2c->AddrCallback = pCallback; - } - else - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - return status; -} - -/** - * @brief UnRegister the Slave Address Match I2C Callback - * Info Ready I2C Callback is redirected to the weak HAL_I2C_AddrCallback() predefined callback - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hi2c); - - if (HAL_I2C_STATE_READY == hi2c->State) - { - hi2c->AddrCallback = HAL_I2C_AddrCallback; /* Legacy weak AddrCallback */ - } - else - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - return status; -} - -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - -/** - * @brief I2C data register flush process. - * @param hi2c I2C handle. - * @retval None - */ -static void I2C_Flush_DR(I2C_HandleTypeDef *hi2c) -{ - /* Write a dummy data in DR to clear TXE flag */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) != RESET) - { - hi2c->Instance->DR = 0x00U; - } -} - -/** - * @} - */ - -/** @defgroup I2C_Exported_Functions_Group2 Input and Output operation functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the I2C data - transfers. - - (#) There are two modes of transfer: - (++) Blocking mode : The communication is performed in the polling mode. - The status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode : The communication is performed using Interrupts - or DMA. These functions return the status of the transfer startup. - The end of the data processing will be indicated through the - dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - - (#) Blocking mode functions are : - (++) HAL_I2C_Master_Transmit() - (++) HAL_I2C_Master_Receive() - (++) HAL_I2C_Slave_Transmit() - (++) HAL_I2C_Slave_Receive() - (++) HAL_I2C_Mem_Write() - (++) HAL_I2C_Mem_Read() - (++) HAL_I2C_IsDeviceReady() - - (#) No-Blocking mode functions with Interrupt are : - (++) HAL_I2C_Master_Transmit_IT() - (++) HAL_I2C_Master_Receive_IT() - (++) HAL_I2C_Slave_Transmit_IT() - (++) HAL_I2C_Slave_Receive_IT() - (++) HAL_I2C_Mem_Write_IT() - (++) HAL_I2C_Mem_Read_IT() - (++) HAL_I2C_Master_Seq_Transmit_IT() - (++) HAL_I2C_Master_Seq_Receive_IT() - (++) HAL_I2C_Slave_Seq_Transmit_IT() - (++) HAL_I2C_Slave_Seq_Receive_IT() - (++) HAL_I2C_EnableListen_IT() - (++) HAL_I2C_DisableListen_IT() - (++) HAL_I2C_Master_Abort_IT() - - (#) No-Blocking mode functions with DMA are : - (++) HAL_I2C_Master_Transmit_DMA() - (++) HAL_I2C_Master_Receive_DMA() - (++) HAL_I2C_Slave_Transmit_DMA() - (++) HAL_I2C_Slave_Receive_DMA() - (++) HAL_I2C_Mem_Write_DMA() - (++) HAL_I2C_Mem_Read_DMA() - (++) HAL_I2C_Master_Seq_Transmit_DMA() - (++) HAL_I2C_Master_Seq_Receive_DMA() - (++) HAL_I2C_Slave_Seq_Transmit_DMA() - (++) HAL_I2C_Slave_Seq_Receive_DMA() - - (#) A set of Transfer Complete Callbacks are provided in non Blocking mode: - (++) HAL_I2C_MasterTxCpltCallback() - (++) HAL_I2C_MasterRxCpltCallback() - (++) HAL_I2C_SlaveTxCpltCallback() - (++) HAL_I2C_SlaveRxCpltCallback() - (++) HAL_I2C_MemTxCpltCallback() - (++) HAL_I2C_MemRxCpltCallback() - (++) HAL_I2C_AddrCallback() - (++) HAL_I2C_ListenCpltCallback() - (++) HAL_I2C_ErrorCallback() - (++) HAL_I2C_AbortCpltCallback() - -@endverbatim - * @{ - */ - -/** - * @brief Transmits in master mode an amount of data in blocking mode. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Send Slave Address */ - if (I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - while (hi2c->XferSize > 0U) - { - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - hi2c->XferSize--; - - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - hi2c->XferSize--; - } - - /* Wait until BTF flag is set */ - if (I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receives in master mode an amount of data in blocking mode. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Send Slave Address */ - if (I2C_MasterRequestRead(hi2c, DevAddress, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - if (hi2c->XferSize == 0U) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferSize == 1U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferSize == 2U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - while (hi2c->XferSize > 0U) - { - if (hi2c->XferSize <= 3U) - { - /* One byte */ - if (hi2c->XferSize == 1U) - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - /* Two bytes */ - else if (hi2c->XferSize == 2U) - { - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - /* 3 Last bytes */ - else - { - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - else - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) - { - - if (hi2c->XferSize == 3U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - } - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmits in slave mode an amount of data in blocking mode. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* If 10bit addressing mode is selected */ - if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT) - { - /* Wait until ADDR flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - while (hi2c->XferSize > 0U) - { - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - return HAL_ERROR; - } - - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - hi2c->XferSize--; - - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - hi2c->XferSize--; - } - } - - /* Wait until AF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in slave mode an amount of data in blocking mode - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == (uint16_t)0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - while (hi2c->XferSize > 0U) - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - - /* Wait until STOP flag is set */ - if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - return HAL_ERROR; - } - - /* Clear STOP flag */ - __HAL_I2C_CLEAR_STOPFLAG(hi2c); - - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in master mode an amount of data in non-blocking mode with Interrupt - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in master mode an amount of data in non-blocking mode with Interrupt - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in slave mode an amount of data in non-blocking mode with Interrupt - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in slave mode an amount of data in non-blocking mode with Interrupt - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in master mode an amount of data in non-blocking mode with DMA - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - HAL_StatusTypeDef dmaxferstatus; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferM1CpltCallback = NULL; - hi2c->hdmatx->XferM1HalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in master mode an amount of data in non-blocking mode with DMA - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - HAL_StatusTypeDef dmaxferstatus; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferM1CpltCallback = NULL; - hi2c->hdmarx->XferM1HalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in slave mode an amount of data in non-blocking mode with DMA - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - HAL_StatusTypeDef dmaxferstatus; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferM1CpltCallback = NULL; - hi2c->hdmatx->XferM1HalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_LISTEN; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in slave mode an amount of data in non-blocking mode with DMA - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - HAL_StatusTypeDef dmaxferstatus; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferM1CpltCallback = NULL; - hi2c->hdmarx->XferM1HalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_LISTEN; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Write an amount of data in blocking mode to a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - while (hi2c->XferSize > 0U) - { - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - - /* Wait until BTF flag is set */ - if (I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Read an amount of data in blocking mode from a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - if (hi2c->XferSize == 0U) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferSize == 1U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferSize == 2U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - while (hi2c->XferSize > 0U) - { - if (hi2c->XferSize <= 3U) - { - /* One byte */ - if (hi2c->XferSize == 1U) - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - /* Two bytes */ - else if (hi2c->XferSize == 2U) - { - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - /* 3 Last bytes */ - else - { - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - else - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) - { - if (hi2c->XferSize == 3U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - } - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Write an amount of data in non-blocking mode with Interrupt to a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - hi2c->Memaddress = MemAddress; - hi2c->MemaddSize = MemAddSize; - hi2c->EventCount = 0U; - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Read an amount of data in non-blocking mode with Interrupt from a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - hi2c->Memaddress = MemAddress; - hi2c->MemaddSize = MemAddSize; - hi2c->EventCount = 0U; - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - if (hi2c->XferSize > 0U) - { - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Write an amount of data in non-blocking mode with DMA to a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - HAL_StatusTypeDef dmaxferstatus; - - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - hi2c->Memaddress = MemAddress; - hi2c->MemaddSize = MemAddSize; - hi2c->EventCount = 0U; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferM1CpltCallback = NULL; - hi2c->hdmatx->XferM1HalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) - { - /* Abort the ongoing DMA */ - dmaxferstatus = HAL_DMA_Abort_IT(hi2c->hdmatx); - - /* Prevent unused argument(s) compilation and MISRA warning */ - UNUSED(dmaxferstatus); - - /* Set the unused I2C DMA transfer complete callback to NULL */ - hi2c->hdmatx->XferCpltCallback = NULL; - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->XferSize = 0U; - hi2c->XferCount = 0U; - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_SIZE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Reads an amount of data in non-blocking mode with DMA from a specific memory address. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be read - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - __IO uint32_t count = 0U; - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - hi2c->Memaddress = MemAddress; - hi2c->MemaddSize = MemAddSize; - hi2c->EventCount = 0U; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferM1CpltCallback = NULL; - hi2c->hdmarx->XferM1HalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) - { - /* Abort the ongoing DMA */ - dmaxferstatus = HAL_DMA_Abort_IT(hi2c->hdmarx); - - /* Prevent unused argument(s) compilation and MISRA warning */ - UNUSED(dmaxferstatus); - - /* Set the unused I2C DMA transfer complete callback to NULL */ - hi2c->hdmarx->XferCpltCallback = NULL; - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->XferSize = 0U; - hi2c->XferCount = 0U; - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - return HAL_ERROR; - } - - if (hi2c->XferSize == 1U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - else - { - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR); - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Checks if target device is ready for communication. - * @note This function is used with Memory devices - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param Trials Number of trials - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout) -{ - /* Get tick */ - uint32_t tickstart = HAL_GetTick(); - uint32_t I2C_Trials = 0U; - FlagStatus tmp1; - FlagStatus tmp2; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - do - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - - /* Wait until ADDR or AF flag are set */ - /* Get tick */ - tickstart = HAL_GetTick(); - - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR); - tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); - while ((hi2c->State != HAL_I2C_STATE_TIMEOUT) && (tmp1 == RESET) && (tmp2 == RESET)) - { - if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) - { - hi2c->State = HAL_I2C_STATE_TIMEOUT; - } - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR); - tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); - } - - hi2c->State = HAL_I2C_STATE_READY; - - /* Check if the ADDR flag has been set */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Clear ADDR Flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Clear AF Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - } - - /* Increment Trials */ - I2C_Trials++; - } - while (I2C_Trials < Trials); - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential transmit in master I2C mode an amount of data in non-blocking mode with Interrupt. - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - __IO uint32_t Prev_State = 0x00U; - __IO uint32_t count = 0x00U; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Check Busy Flag only if FIRST call of Master interface */ - if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - hi2c->Devaddress = DevAddress; - - Prev_State = hi2c->PreviousState; - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential transmit in master I2C mode an amount of data in non-blocking mode with DMA. - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - __IO uint32_t Prev_State = 0x00U; - __IO uint32_t count = 0x00U; - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Check Busy Flag only if FIRST call of Master interface */ - if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - hi2c->Devaddress = DevAddress; - - Prev_State = hi2c->PreviousState; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* If XferOptions is not associated to a new frame, mean no start bit is request, enable directly the DMA request */ - /* In other cases, DMA request is enabled after Slave address treatment in IRQHandler */ - if ((XferOptions == I2C_NEXT_FRAME) || (XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)) - { - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential receive in master I2C mode an amount of data in non-blocking mode with Interrupt - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - __IO uint32_t Prev_State = 0x00U; - __IO uint32_t count = 0U; - uint32_t enableIT = (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Check Busy Flag only if FIRST call of Master interface */ - if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - hi2c->Devaddress = DevAddress; - - Prev_State = hi2c->PreviousState; - - if ((hi2c->XferCount == 2U) && ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))) - { - if (Prev_State == I2C_STATE_MASTER_BUSY_RX) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Remove Enabling of IT_BUF, mean RXNE treatment, treat the 2 bytes through BTF */ - enableIT &= ~I2C_IT_BUF; - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable interrupts */ - __HAL_I2C_ENABLE_IT(hi2c, enableIT); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential receive in master mode an amount of data in non-blocking mode with DMA - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - __IO uint32_t Prev_State = 0x00U; - __IO uint32_t count = 0U; - uint32_t enableIT = (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Check Busy Flag only if FIRST call of Master interface */ - if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Clear Last DMA bit */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - hi2c->Devaddress = DevAddress; - - Prev_State = hi2c->PreviousState; - - if (hi2c->XferSize > 0U) - { - if ((hi2c->XferCount == 2U) && ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))) - { - if (Prev_State == I2C_STATE_MASTER_BUSY_RX) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - if ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_OTHER_AND_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)) - { - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - } - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - if (dmaxferstatus == HAL_OK) - { - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Update interrupt for only EVT and ERR */ - enableIT = (I2C_IT_EVT | I2C_IT_ERR); - } - else - { - /* Update interrupt for only ERR */ - enableIT = I2C_IT_ERR; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* If XferOptions is not associated to a new frame, mean no start bit is request, enable directly the DMA request */ - /* In other cases, DMA request is enabled after Slave address treatment in IRQHandler */ - if ((XferOptions == I2C_NEXT_FRAME) || (XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)) - { - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, enableIT); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable interrupts */ - __HAL_I2C_ENABLE_IT(hi2c, enableIT); - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential transmit in slave mode an amount of data in non-blocking mode with Interrupt - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential transmit in slave mode an amount of data in non-blocking mode with DMA - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ - /* and then toggle the HAL slave RX state to TX state */ - if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) - { - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - /* Abort DMA Xfer if any */ - if (hi2c->hdmarx != NULL) - { - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); - } - } - } - } - else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) - { - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Abort DMA Xfer if any */ - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA TX */ - if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); - } - } - } - } - else - { - /* Nothing to do */ - } - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_LISTEN; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential receive in slave mode an amount of data in non-blocking mode with Interrupt - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential receive in slave mode an amount of data in non-blocking mode with DMA - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ - /* and then toggle the HAL slave RX state to TX state */ - if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) - { - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - /* Abort DMA Xfer if any */ - if (hi2c->hdmarx != NULL) - { - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); - } - } - } - } - else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) - { - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Abort DMA Xfer if any */ - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA TX */ - if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); - } - } - } - } - else - { - /* Nothing to do */ - } - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_LISTEN; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Enable the Address listen mode with Interrupt. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->State == HAL_I2C_STATE_READY) - { - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Disable the Address listen mode with Interrupt. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of tmp to prevent undefined behavior of volatile usage */ - uint32_t tmp; - - /* Disable Address listen mode only if a transfer is not ongoing */ - if (hi2c->State == HAL_I2C_STATE_LISTEN) - { - tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK; - hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode); - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Disable EVT and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Abort a master or memory I2C IT or DMA process communication with Interrupt. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - - /* Prevent unused argument(s) compilation warning */ - UNUSED(DevAddress); - - /* Abort Master transfer during Receive or Transmit process */ - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET) && ((CurrentMode == HAL_I2C_MODE_MASTER) || - (CurrentMode == HAL_I2C_MODE_MEM))) - { - /* Process Locked */ - __HAL_LOCK(hi2c); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_ABORT; - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->XferCount = 0U; - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Call the corresponding callback to inform upper layer of End of Transfer */ - I2C_ITError(hi2c); - - return HAL_OK; - } - else - { - /* Wrong usage of abort function */ - /* This function should be used only in case of abort monitored by master device */ - /* Or periphal is not in busy state, mean there is no active sequence to be abort */ - return HAL_ERROR; - } -} - -/** - * @} - */ - -/** @defgroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @{ - */ - -/** - * @brief This function handles I2C event interrupt request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c) -{ - uint32_t sr1itflags; - uint32_t sr2itflags = 0U; - uint32_t itsources = READ_REG(hi2c->Instance->CR2); - uint32_t CurrentXferOptions = hi2c->XferOptions; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - /* Master or Memory mode selected */ - if ((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM)) - { - sr2itflags = READ_REG(hi2c->Instance->SR2); - sr1itflags = READ_REG(hi2c->Instance->SR1); - - /* Exit IRQ event until Start Bit detected in case of Other frame requested */ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) == RESET) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(CurrentXferOptions) == 1U)) - { - return; - } - - /* SB Set ----------------------------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - /* Convert OTHER_xxx XferOptions if any */ - I2C_ConvertOtherXferOptions(hi2c); - - I2C_Master_SB(hi2c); - } - /* ADD10 Set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADD10) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_Master_ADD10(hi2c); - } - /* ADDR Set --------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_Master_ADDR(hi2c); - } - /* I2C in mode Transmitter -----------------------------------------------*/ - else if (I2C_CHECK_FLAG(sr2itflags, I2C_FLAG_TRA) != RESET) - { - /* Do not check buffer and BTF flag if a Xfer DMA is on going */ - if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) - { - /* TXE set and BTF reset -----------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_TXE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) - { - I2C_MasterTransmit_TXE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - if (CurrentState == HAL_I2C_STATE_BUSY_TX) - { - I2C_MasterTransmit_BTF(hi2c); - } - else /* HAL_I2C_MODE_MEM */ - { - if (CurrentMode == HAL_I2C_MODE_MEM) - { - I2C_MemoryTransmit_TXE_BTF(hi2c); - } - } - } - else - { - /* Do nothing */ - } - } - } - /* I2C in mode Receiver --------------------------------------------------*/ - else - { - /* Do not check buffer and BTF flag if a Xfer DMA is on going */ - if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) - { - /* RXNE set and BTF reset -----------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) - { - I2C_MasterReceive_RXNE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_MasterReceive_BTF(hi2c); - } - else - { - /* Do nothing */ - } - } - } - } - /* Slave mode selected */ - else - { - /* If an error is detected, read only SR1 register to prevent */ - /* a clear of ADDR flags by reading SR2 after reading SR1 in Error treatment */ - if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - sr1itflags = READ_REG(hi2c->Instance->SR1); - } - else - { - sr2itflags = READ_REG(hi2c->Instance->SR2); - sr1itflags = READ_REG(hi2c->Instance->SR1); - } - - /* ADDR set --------------------------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - /* Now time to read SR2, this will clear ADDR flag automatically */ - if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - sr2itflags = READ_REG(hi2c->Instance->SR2); - } - I2C_Slave_ADDR(hi2c, sr2itflags); - } - /* STOPF set --------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_Slave_STOPF(hi2c); - } - /* I2C in mode Transmitter -----------------------------------------------*/ - else if ((CurrentState == HAL_I2C_STATE_BUSY_TX) || (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN)) - { - /* TXE set and BTF reset -----------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_TXE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) - { - I2C_SlaveTransmit_TXE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_SlaveTransmit_BTF(hi2c); - } - else - { - /* Do nothing */ - } - } - /* I2C in mode Receiver --------------------------------------------------*/ - else - { - /* RXNE set and BTF reset ----------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) - { - I2C_SlaveReceive_RXNE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_SlaveReceive_BTF(hi2c); - } - else - { - /* Do nothing */ - } - } - } -} - -/** - * @brief This function handles I2C error interrupt request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c) -{ - HAL_I2C_ModeTypeDef tmp1; - uint32_t tmp2; - HAL_I2C_StateTypeDef tmp3; - uint32_t tmp4; - uint32_t sr1itflags = READ_REG(hi2c->Instance->SR1); - uint32_t itsources = READ_REG(hi2c->Instance->CR2); - uint32_t error = HAL_I2C_ERROR_NONE; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - - /* I2C Bus error interrupt occurred ----------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BERR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) - { - error |= HAL_I2C_ERROR_BERR; - - /* Clear BERR flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR); - } - - /* I2C Arbitration Lost error interrupt occurred ---------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ARLO) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) - { - error |= HAL_I2C_ERROR_ARLO; - - /* Clear ARLO flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO); - } - - /* I2C Acknowledge failure error interrupt occurred ------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) - { - tmp1 = CurrentMode; - tmp2 = hi2c->XferCount; - tmp3 = hi2c->State; - tmp4 = hi2c->PreviousState; - if ((tmp1 == HAL_I2C_MODE_SLAVE) && (tmp2 == 0U) && \ - ((tmp3 == HAL_I2C_STATE_BUSY_TX) || (tmp3 == HAL_I2C_STATE_BUSY_TX_LISTEN) || \ - ((tmp3 == HAL_I2C_STATE_LISTEN) && (tmp4 == I2C_STATE_SLAVE_BUSY_TX)))) - { - I2C_Slave_AF(hi2c); - } - else - { - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - error |= HAL_I2C_ERROR_AF; - - /* Do not generate a STOP in case of Slave receive non acknowledge during transfer (mean not at the end of transfer) */ - if ((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM)) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - } - } - - /* I2C Over-Run/Under-Run interrupt occurred -------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_OVR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) - { - error |= HAL_I2C_ERROR_OVR; - /* Clear OVR flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR); - } - - /* Call the Error Callback in case of Error detected -----------------------*/ - if (error != HAL_I2C_ERROR_NONE) - { - hi2c->ErrorCode |= error; - I2C_ITError(hi2c); - } -} - -/** - * @brief Master Tx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MasterTxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Master Rx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MasterRxCpltCallback could be implemented in the user file - */ -} - -/** @brief Slave Tx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_SlaveTxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Slave Rx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_SlaveRxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Slave Address Match callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param TransferDirection Master request Transfer Direction (Write/Read), value of @ref I2C_XferDirection_definition - * @param AddrMatchCode Address Match Code - * @retval None - */ -__weak void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - UNUSED(TransferDirection); - UNUSED(AddrMatchCode); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_AddrCallback() could be implemented in the user file - */ -} - -/** - * @brief Listen Complete callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_ListenCpltCallback() could be implemented in the user file - */ -} - -/** - * @brief Memory Tx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MemTxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Memory Rx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MemRxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief I2C error callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_ErrorCallback could be implemented in the user file - */ -} - -/** - * @brief I2C abort callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_AbortCpltCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions - * @brief Peripheral State, Mode and Error functions - * -@verbatim - =============================================================================== - ##### Peripheral State, Mode and Error functions ##### - =============================================================================== - [..] - This subsection permit to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the I2C handle state. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL state - */ -HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c) -{ - /* Return I2C handle state */ - return hi2c->State; -} - -/** - * @brief Returns the I2C Master, Slave, Memory or no mode. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL mode - */ -HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c) -{ - return hi2c->Mode; -} - -/** - * @brief Return the I2C error code. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval I2C Error Code - */ -uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c) -{ - return hi2c->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup I2C_Private_Functions - * @{ - */ - -/** - * @brief Handle TXE flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - uint32_t CurrentXferOptions = hi2c->XferOptions; - - if ((hi2c->XferSize == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX)) - { - /* Call TxCpltCallback() directly if no stop mode is set */ - if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME)) - { - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterTxCpltCallback(hi2c); -#else - HAL_I2C_MasterTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else /* Generate Stop condition then Call TxCpltCallback() */ - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemTxCpltCallback(hi2c); -#else - HAL_I2C_MemTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterTxCpltCallback(hi2c); -#else - HAL_I2C_MasterTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - } - else if ((CurrentState == HAL_I2C_STATE_BUSY_TX) || \ - ((CurrentMode == HAL_I2C_MODE_MEM) && (CurrentState == HAL_I2C_STATE_BUSY_RX))) - { - if (hi2c->XferCount == 0U) - { - /* Disable BUF interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - } - else - { - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - I2C_MemoryTransmit_TXE_BTF(hi2c); - } - else - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - } - } - else - { - /* Do nothing */ - } -} - -/** - * @brief Handle BTF flag for Master transmitter - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - uint32_t CurrentXferOptions = hi2c->XferOptions; - - if (hi2c->State == HAL_I2C_STATE_BUSY_TX) - { - if (hi2c->XferCount != 0U) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - else - { - /* Call TxCpltCallback() directly if no stop mode is set */ - if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME)) - { - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterTxCpltCallback(hi2c); -#else - HAL_I2C_MasterTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else /* Generate Stop condition then Call TxCpltCallback() */ - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemTxCpltCallback(hi2c); -#else - HAL_I2C_MemTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterTxCpltCallback(hi2c); -#else - HAL_I2C_MasterTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - } - } - else - { - /* Do nothing */ - } -} - -/** - * @brief Handle TXE and BTF flag for Memory transmitter - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MemoryTransmit_TXE_BTF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - if (hi2c->EventCount == 0U) - { - /* If Memory address size is 8Bit */ - if (hi2c->MemaddSize == I2C_MEMADD_SIZE_8BIT) - { - /* Send Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress); - - hi2c->EventCount += 2U; - } - /* If Memory address size is 16Bit */ - else - { - /* Send MSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_MSB(hi2c->Memaddress); - - hi2c->EventCount++; - } - } - else if (hi2c->EventCount == 1U) - { - /* Send LSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress); - - hi2c->EventCount++; - } - else if (hi2c->EventCount == 2U) - { - if (CurrentState == HAL_I2C_STATE_BUSY_RX) - { - /* Generate Restart */ - hi2c->Instance->CR1 |= I2C_CR1_START; - - hi2c->EventCount++; - } - else if ((hi2c->XferCount > 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX)) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - else if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX)) - { - /* Generate Stop condition then Call TxCpltCallback() */ - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemTxCpltCallback(hi2c); -#else - HAL_I2C_MemTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Do nothing */ - } - } - else - { - /* Clear TXE and BTF flags */ - I2C_Flush_DR(hi2c); - } -} - -/** - * @brief Handle RXNE flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->State == HAL_I2C_STATE_BUSY_RX) - { - uint32_t tmp; - uint32_t CurrentXferOptions; - - CurrentXferOptions = hi2c->XferOptions; - tmp = hi2c->XferCount; - if (tmp > 3U) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - if (hi2c->XferCount == (uint16_t)3) - { - /* Disable BUF interrupt, this help to treat correctly the last 4 bytes - on BTF subroutine */ - /* Disable BUF interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - } - } - else if ((hi2c->XferOptions != I2C_FIRST_AND_NEXT_FRAME) && ((tmp == 1U) || (tmp == 0U))) - { - if (I2C_WaitOnSTOPRequestThroughIT(hi2c) == HAL_OK) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - hi2c->State = HAL_I2C_STATE_READY; - - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->PreviousState = I2C_STATE_NONE; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemRxCpltCallback(hi2c); -#else - HAL_I2C_MemRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) - { - hi2c->PreviousState = I2C_STATE_NONE; - } - else - { - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; - } - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterRxCpltCallback(hi2c); -#else - HAL_I2C_MasterRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - else - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Call user error callback */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - else - { - /* Disable BUF interrupt, this help to treat correctly the last 2 bytes - on BTF subroutine if there is a reception delay between N-1 and N byte */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - } - } -} - -/** - * @brief Handle BTF flag for Master receiver - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - uint32_t CurrentXferOptions = hi2c->XferOptions; - - if (hi2c->XferCount == 4U) - { - /* Disable BUF interrupt, this help to treat correctly the last 2 bytes - on BTF subroutine if there is a reception delay between N-1 and N byte */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - else if (hi2c->XferCount == 3U) - { - /* Disable BUF interrupt, this help to treat correctly the last 2 bytes - on BTF subroutine if there is a reception delay between N-1 and N byte */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - - if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME)) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - else if (hi2c->XferCount == 2U) - { - /* Prepare next transfer or stop current transfer */ - if ((CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP)) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - else if ((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_NEXT_FRAME)) - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - else if (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else - { - /* Do nothing */ - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - /* Disable EVT and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - hi2c->State = HAL_I2C_STATE_READY; - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->PreviousState = I2C_STATE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemRxCpltCallback(hi2c); -#else - HAL_I2C_MemRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) - { - hi2c->PreviousState = I2C_STATE_NONE; - } - else - { - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; - } -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterRxCpltCallback(hi2c); -#else - HAL_I2C_MasterRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - else - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } -} - -/** - * @brief Handle SB flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Master_SB(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - if (hi2c->EventCount == 0U) - { - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress); - } - else - { - hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress); - } - } - else - { - if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) - { - /* Send slave 7 Bits address */ - if (hi2c->State == HAL_I2C_STATE_BUSY_TX) - { - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress); - } - else - { - hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress); - } - - if (((hi2c->hdmatx != NULL) && (hi2c->hdmatx->XferCpltCallback != NULL)) - || ((hi2c->hdmarx != NULL) && (hi2c->hdmarx->XferCpltCallback != NULL))) - { - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } - } - else - { - if (hi2c->EventCount == 0U) - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(hi2c->Devaddress); - } - else if (hi2c->EventCount == 1U) - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_READ(hi2c->Devaddress); - } - else - { - /* Do nothing */ - } - } - } -} - -/** - * @brief Handle ADD10 flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Master_ADD10(I2C_HandleTypeDef *hi2c) -{ - /* Send slave address */ - hi2c->Instance->DR = I2C_10BIT_ADDRESS(hi2c->Devaddress); - - if (((hi2c->hdmatx != NULL) && (hi2c->hdmatx->XferCpltCallback != NULL)) - || ((hi2c->hdmarx != NULL) && (hi2c->hdmarx->XferCpltCallback != NULL))) - { - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } -} - -/** - * @brief Handle ADDR flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Master_ADDR(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - uint32_t CurrentXferOptions = hi2c->XferOptions; - uint32_t Prev_State = hi2c->PreviousState; - - if (hi2c->State == HAL_I2C_STATE_BUSY_RX) - { - if ((hi2c->EventCount == 0U) && (CurrentMode == HAL_I2C_MODE_MEM)) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else if ((hi2c->EventCount == 0U) && (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Restart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - hi2c->EventCount++; - } - else - { - if (hi2c->XferCount == 0U) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferCount == 1U) - { - if (CurrentXferOptions == I2C_NO_OPTION_FRAME) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - } - /* Prepare next transfer or stop current transfer */ - else if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) \ - && ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (CurrentXferOptions == I2C_FIRST_FRAME))) - { - if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP)) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - } - else if (hi2c->XferCount == 2U) - { - if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP)) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - if (((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) && ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP) || (CurrentXferOptions == I2C_LAST_FRAME))) - { - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - if (((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) && ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP) || (CurrentXferOptions == I2C_LAST_FRAME))) - { - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - /* Reset Event counter */ - hi2c->EventCount = 0U; - } - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } -} - -/** - * @brief Handle TXE flag for Slave - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - if (hi2c->XferCount != 0U) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN)) - { - /* Last Byte is received, disable Interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveTxCpltCallback(hi2c); -#else - HAL_I2C_SlaveTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } -} - -/** - * @brief Handle BTF flag for Slave transmitter - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->XferCount != 0U) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } -} - -/** - * @brief Handle RXNE flag for Slave - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - if (hi2c->XferCount != 0U) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN)) - { - /* Last Byte is received, disable Interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveRxCpltCallback(hi2c); -#else - HAL_I2C_SlaveRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } -} - -/** - * @brief Handle BTF flag for Slave receiver - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->XferCount != 0U) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } -} - -/** - * @brief Handle ADD flag for Slave - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param IT2Flags Interrupt2 flags to handle. - * @retval None - */ -static void I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c, uint32_t IT2Flags) -{ - uint8_t TransferDirection = I2C_DIRECTION_RECEIVE; - uint16_t SlaveAddrCode; - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - /* Disable BUF interrupt, BUF enabling is manage through slave specific interface */ - __HAL_I2C_DISABLE_IT(hi2c, (I2C_IT_BUF)); - - /* Transfer Direction requested by Master */ - if (I2C_CHECK_FLAG(IT2Flags, I2C_FLAG_TRA) == RESET) - { - TransferDirection = I2C_DIRECTION_TRANSMIT; - } - - if (I2C_CHECK_FLAG(IT2Flags, I2C_FLAG_DUALF) == RESET) - { - SlaveAddrCode = (uint16_t)hi2c->Init.OwnAddress1; - } - else - { - SlaveAddrCode = (uint16_t)hi2c->Init.OwnAddress2; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Call Slave Addr callback */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->AddrCallback(hi2c, TransferDirection, SlaveAddrCode); -#else - HAL_I2C_AddrCallback(hi2c, TransferDirection, SlaveAddrCode); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - } -} - -/** - * @brief Handle STOPF flag for Slave - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Clear STOPF flag */ - __HAL_I2C_CLEAR_STOPFLAG(hi2c); - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* If a DMA is ongoing, Update handle size context */ - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - if ((CurrentState == HAL_I2C_STATE_BUSY_RX) || (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN)) - { - hi2c->XferCount = (uint16_t)(I2C_GET_DMA_REMAIN_DATA(hi2c->hdmarx)); - - if (hi2c->XferCount != 0U) - { - /* Set ErrorCode corresponding to a Non-Acknowledge */ - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - } - - /* Disable, stop the current DMA */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Abort DMA Xfer if any */ - if (HAL_DMA_GetState(hi2c->hdmarx) != HAL_DMA_STATE_READY) - { - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); - } - } - } - else - { - hi2c->XferCount = (uint16_t)(I2C_GET_DMA_REMAIN_DATA(hi2c->hdmatx)); - - if (hi2c->XferCount != 0U) - { - /* Set ErrorCode corresponding to a Non-Acknowledge */ - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - } - - /* Disable, stop the current DMA */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Abort DMA Xfer if any */ - if (HAL_DMA_GetState(hi2c->hdmatx) != HAL_DMA_STATE_READY) - { - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA TX */ - if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); - } - } - } - } - - /* All data are not transferred, so set error code accordingly */ - if (hi2c->XferCount != 0U) - { - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - - if (hi2c->XferCount != 0U) - { - /* Set ErrorCode corresponding to a Non-Acknowledge */ - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - } - } - - if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - /* Call the corresponding callback to inform upper layer of End of Transfer */ - I2C_ITError(hi2c); - } - else - { - if (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN) - { - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveRxCpltCallback(hi2c); -#else - HAL_I2C_SlaveRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - - if (hi2c->State == HAL_I2C_STATE_LISTEN) - { - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ListenCpltCallback(hi2c); -#else - HAL_I2C_ListenCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - if ((hi2c->PreviousState == I2C_STATE_SLAVE_BUSY_RX) || (CurrentState == HAL_I2C_STATE_BUSY_RX)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveRxCpltCallback(hi2c); -#else - HAL_I2C_SlaveRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - } -} - -/** - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Slave_AF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - uint32_t CurrentXferOptions = hi2c->XferOptions; - - if (((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) && \ - (CurrentState == HAL_I2C_STATE_LISTEN)) - { - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ListenCpltCallback(hi2c); -#else - HAL_I2C_ListenCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else if (CurrentState == HAL_I2C_STATE_BUSY_TX) - { - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear TXE flag */ - I2C_Flush_DR(hi2c); - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveTxCpltCallback(hi2c); -#else - HAL_I2C_SlaveTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Clear AF flag only */ - /* State Listen, but XferOptions == FIRST or NEXT */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - } -} - -/** - * @brief I2C interrupts error process - * @param hi2c I2C handle. - * @retval None - */ -static void I2C_ITError(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - uint32_t CurrentError; - - if (((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM)) && (CurrentState == HAL_I2C_STATE_BUSY_RX)) - { - /* Disable Pos bit in I2C CR1 when error occurred in Master/Mem Receive IT Process */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - } - - if (((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - /* keep HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_LISTEN; - } - else - { - /* If state is an abort treatment on going, don't change state */ - /* This change will be do later */ - if ((READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) && (CurrentState != HAL_I2C_STATE_ABORT)) - { - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - } - hi2c->PreviousState = I2C_STATE_NONE; - } - - /* Abort DMA transfer */ - if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN; - - if (hi2c->hdmatx->State != HAL_DMA_STATE_READY) - { - /* Set the DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; - - if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) - { - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - hi2c->State = HAL_I2C_STATE_READY; - - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); - } - } - else - { - /* Set the DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; - - if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) - { - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - } - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - hi2c->State = HAL_I2C_STATE_READY; - - /* Call Directly hi2c->hdmarx->XferAbortCallback function in case of error */ - hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); - } - } - } - else if (hi2c->State == HAL_I2C_STATE_ABORT) - { - hi2c->State = HAL_I2C_STATE_READY; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - } - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->AbortCpltCallback(hi2c); -#else - HAL_I2C_AbortCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - } - - /* Call user error callback */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - - /* STOP Flag is not set after a NACK reception, BusError, ArbitrationLost, OverRun */ - CurrentError = hi2c->ErrorCode; - - if (((CurrentError & HAL_I2C_ERROR_BERR) == HAL_I2C_ERROR_BERR) || \ - ((CurrentError & HAL_I2C_ERROR_ARLO) == HAL_I2C_ERROR_ARLO) || \ - ((CurrentError & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF) || \ - ((CurrentError & HAL_I2C_ERROR_OVR) == HAL_I2C_ERROR_OVR)) - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - } - - /* So may inform upper layer that listen phase is stopped */ - /* during NACK error treatment */ - CurrentState = hi2c->State; - if (((hi2c->ErrorCode & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF) && (CurrentState == HAL_I2C_STATE_LISTEN)) - { - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ListenCpltCallback(hi2c); -#else - HAL_I2C_ListenCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } -} - -/** - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - uint32_t CurrentXferOptions = hi2c->XferOptions; - - /* Generate Start condition if first transfer */ - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else if (hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) - { - /* Generate ReStart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else - { - /* Do nothing */ - } - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) - { - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - } - else - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress); - - /* Wait until ADD10 flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress); - } - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Master sends target device address for read request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - uint32_t CurrentXferOptions = hi2c->XferOptions; - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start condition if first transfer */ - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else if (hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) - { - /* Generate ReStart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else - { - /* Do nothing */ - } - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) - { - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress); - } - else - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress); - - /* Wait until ADD10 flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Restart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_READ(DevAddress); - } - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Master sends target device address followed by internal memory address for write request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart) -{ - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* If Memory address size is 8Bit */ - if (MemAddSize == I2C_MEMADD_SIZE_8BIT) - { - /* Send Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - /* If Memory address size is 16Bit */ - else - { - /* Send MSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress); - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Send LSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - - return HAL_OK; -} - -/** - * @brief Master sends target device address followed by internal memory address for read request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart) -{ - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* If Memory address size is 8Bit */ - if (MemAddSize == I2C_MEMADD_SIZE_8BIT) - { - /* Send Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - /* If Memory address size is 16Bit */ - else - { - /* Send MSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress); - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Send LSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Generate Restart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief DMA I2C process complete callback. - * @param hdma DMA handle - * @retval None - */ -static void I2C_DMAXferCplt(DMA_HandleTypeDef *hdma) -{ - I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */ - - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - uint32_t CurrentXferOptions = hi2c->XferOptions; - - /* Disable EVT and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Clear Complete callback */ - if (hi2c->hdmatx != NULL) - { - hi2c->hdmatx->XferCpltCallback = NULL; - } - if (hi2c->hdmarx != NULL) - { - hi2c->hdmarx->XferCpltCallback = NULL; - } - - if ((((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_BUSY_TX) == (uint32_t)HAL_I2C_STATE_BUSY_TX) || ((((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_BUSY_RX) == (uint32_t)HAL_I2C_STATE_BUSY_RX) && (CurrentMode == HAL_I2C_MODE_SLAVE))) - { - /* Disable DMA Request */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - hi2c->XferCount = 0U; - - if (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN) - { - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveTxCpltCallback(hi2c); -#else - HAL_I2C_SlaveTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else if (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN) - { - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveRxCpltCallback(hi2c); -#else - HAL_I2C_SlaveRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Do nothing */ - } - - /* Enable EVT and ERR interrupt to treat end of transfer in IRQ handler */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - } - /* Check current Mode, in case of treatment DMA handler have been preempted by a prior interrupt */ - else if (hi2c->Mode != HAL_I2C_MODE_NONE) - { - if (hi2c->XferCount == (uint16_t)1) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* Disable EVT and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Prepare next transfer or stop current transfer */ - if ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_OTHER_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - - /* Disable Last DMA */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - - /* Disable DMA Request */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - hi2c->XferCount = 0U; - - /* Check if Errors has been detected during transfer */ - if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->State = HAL_I2C_STATE_READY; - - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->PreviousState = I2C_STATE_NONE; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemRxCpltCallback(hi2c); -#else - HAL_I2C_MemRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) - { - hi2c->PreviousState = I2C_STATE_NONE; - } - else - { - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; - } - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterRxCpltCallback(hi2c); -#else - HAL_I2C_MasterRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - } - else - { - /* Do nothing */ - } -} - -/** - * @brief DMA I2C communication error callback. - * @param hdma DMA handle - * @retval None - */ -static void I2C_DMAError(DMA_HandleTypeDef *hdma) -{ - I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */ - - /* Clear Complete callback */ - if (hi2c->hdmatx != NULL) - { - hi2c->hdmatx->XferCpltCallback = NULL; - } - if (hi2c->hdmarx != NULL) - { - hi2c->hdmarx->XferCpltCallback = NULL; - } - - /* Ignore DMA FIFO error */ - if (HAL_DMA_GetError(hdma) != HAL_DMA_ERROR_FE) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - hi2c->XferCount = 0U; - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } -} - -/** - * @brief DMA I2C communication abort callback - * (To be called at end of DMA Abort procedure). - * @param hdma DMA handle. - * @retval None - */ -static void I2C_DMAAbort(DMA_HandleTypeDef *hdma) -{ - __IO uint32_t count = 0U; - I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */ - - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - /* During abort treatment, check that there is no pending STOP request */ - /* Wait until STOP flag is reset */ - count = I2C_TIMEOUT_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - if (count == 0U) - { - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - break; - } - count--; - } - while (READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP); - - /* Clear Complete callback */ - if (hi2c->hdmatx != NULL) - { - hi2c->hdmatx->XferCpltCallback = NULL; - } - if (hi2c->hdmarx != NULL) - { - hi2c->hdmarx->XferCpltCallback = NULL; - } - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->XferCount = 0U; - - /* Reset XferAbortCallback */ - if (hi2c->hdmatx != NULL) - { - hi2c->hdmatx->XferAbortCallback = NULL; - } - if (hi2c->hdmarx != NULL) - { - hi2c->hdmarx->XferAbortCallback = NULL; - } - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - /* Check if come from abort from user */ - if (hi2c->State == HAL_I2C_STATE_ABORT) - { - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->AbortCpltCallback(hi2c); -#else - HAL_I2C_AbortCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - if (((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - /* Renable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* keep HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_LISTEN; - } - else - { - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - } - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } -} - -/** - * @brief This function handles I2C Communication Timeout. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param Flag specifies the I2C flag to check. - * @param Status The new Flag status (SET or RESET). - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart) -{ - /* Wait until flag is set */ - while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status) - { - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, Flag) == Status)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for Master addressing phase. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param Flag specifies the I2C flag to check. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart) -{ - while (__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET) - { - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Clear AF Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of TXE flag. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) -{ - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET) - { - /* Check if a NACK is detected */ - if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK) - { - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of BTF flag. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) -{ - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET) - { - /* Check if a NACK is detected */ - if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK) - { - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of STOP flag. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) -{ - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) - { - /* Check if a NACK is detected */ - if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK) - { - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of STOP request through Interrupt. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnSTOPRequestThroughIT(I2C_HandleTypeDef *hi2c) -{ - __IO uint32_t count = 0U; - - /* Wait until STOP flag is reset */ - count = I2C_TIMEOUT_STOP_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_ERROR; - } - } - while (READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP); - - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of RXNE flag. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) -{ - - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET) - { - /* Check if a STOPF is detected */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET) - { - /* Clear STOP Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles Acknowledge failed detection during an I2C Communication. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c) -{ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) - { - /* Clear NACKF Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - return HAL_OK; -} - -/** - * @brief Convert I2Cx OTHER_xxx XferOptions to functional XferOptions. - * @param hi2c I2C handle. - * @retval None - */ -static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c) -{ - /* if user set XferOptions to I2C_OTHER_FRAME */ - /* it request implicitly to generate a restart condition */ - /* set XferOptions to I2C_FIRST_FRAME */ - if (hi2c->XferOptions == I2C_OTHER_FRAME) - { - hi2c->XferOptions = I2C_FIRST_FRAME; - } - /* else if user set XferOptions to I2C_OTHER_AND_LAST_FRAME */ - /* it request implicitly to generate a restart condition */ - /* then generate a stop condition at the end of transfer */ - /* set XferOptions to I2C_FIRST_AND_LAST_FRAME */ - else if (hi2c->XferOptions == I2C_OTHER_AND_LAST_FRAME) - { - hi2c->XferOptions = I2C_FIRST_AND_LAST_FRAME; - } - else - { - /* Nothing to do */ - } -} - -/** - * @} - */ - -#endif /* HAL_I2C_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c deleted file mode 100644 index 64aabaa..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c +++ /dev/null @@ -1,182 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_i2c_ex.c - * @author MCD Application Team - * @brief I2C Extension HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of I2C extension peripheral: - * + Extension features functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### I2C peripheral extension features ##### - ============================================================================== - - [..] Comparing to other previous devices, the I2C interface for STM32F427xx/437xx/ - 429xx/439xx devices contains the following additional features : - - (+) Possibility to disable or enable Analog Noise Filter - (+) Use of a configured Digital Noise Filter - - ##### How to use this driver ##### - ============================================================================== - [..] This driver provides functions to configure Noise Filter - (#) Configure I2C Analog noise filter using the function HAL_I2C_AnalogFilter_Config() - (#) Configure I2C Digital noise filter using the function HAL_I2C_DigitalFilter_Config() - - @endverbatim - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup I2CEx I2CEx - * @brief I2C HAL module driver - * @{ - */ - -#ifdef HAL_I2C_MODULE_ENABLED - -#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup I2CEx_Exported_Functions I2C Exported Functions - * @{ - */ - - -/** @defgroup I2CEx_Exported_Functions_Group1 Extension features functions - * @brief Extension features functions - * -@verbatim - =============================================================================== - ##### Extension features functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure Noise Filters - -@endverbatim - * @{ - */ - -/** - * @brief Configures I2C Analog noise filter. - * @param hi2c pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2Cx peripheral. - * @param AnalogFilter new state of the Analog filter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t AnalogFilter) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - assert_param(IS_I2C_ANALOG_FILTER(AnalogFilter)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the selected I2C peripheral */ - __HAL_I2C_DISABLE(hi2c); - - /* Reset I2Cx ANOFF bit */ - hi2c->Instance->FLTR &= ~(I2C_FLTR_ANOFF); - - /* Disable the analog filter */ - hi2c->Instance->FLTR |= AnalogFilter; - - __HAL_I2C_ENABLE(hi2c); - - hi2c->State = HAL_I2C_STATE_READY; - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Configures I2C Digital noise filter. - * @param hi2c pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2Cx peripheral. - * @param DigitalFilter Coefficient of digital noise filter between 0x00 and 0x0F. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter) -{ - uint16_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - assert_param(IS_I2C_DIGITAL_FILTER(DigitalFilter)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the selected I2C peripheral */ - __HAL_I2C_DISABLE(hi2c); - - /* Get the old register value */ - tmpreg = hi2c->Instance->FLTR; - - /* Reset I2Cx DNF bit [3:0] */ - tmpreg &= ~(I2C_FLTR_DNF); - - /* Set I2Cx DNF coefficient */ - tmpreg |= DigitalFilter; - - /* Store the new register value */ - hi2c->Instance->FLTR = tmpreg; - - __HAL_I2C_ENABLE(hi2c); - - hi2c->State = HAL_I2C_STATE_READY; - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @} - */ - -/** - * @} - */ -#endif - -#endif /* HAL_I2C_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c deleted file mode 100644 index d53e0b1..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c +++ /dev/null @@ -1,2393 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pcd.c - * @author MCD Application Team - * @brief PCD HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the USB Peripheral Controller: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The PCD HAL driver can be used as follows: - - (#) Declare a PCD_HandleTypeDef handle structure, for example: - PCD_HandleTypeDef hpcd; - - (#) Fill parameters of Init structure in HCD handle - - (#) Call HAL_PCD_Init() API to initialize the PCD peripheral (Core, Device core, ...) - - (#) Initialize the PCD low level resources through the HAL_PCD_MspInit() API: - (##) Enable the PCD/USB Low Level interface clock using - (+++) __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); - (+++) __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); (For High Speed Mode) - - (##) Initialize the related GPIO clocks - (##) Configure PCD pin-out - (##) Configure PCD NVIC interrupt - - (#)Associate the Upper USB device stack to the HAL PCD Driver: - (##) hpcd.pData = pdev; - - (#)Enable PCD transmission and reception: - (##) HAL_PCD_Start(); - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PCD PCD - * @brief PCD HAL module driver - * @{ - */ - -#ifdef HAL_PCD_MODULE_ENABLED - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PCD_Private_Macros PCD Private Macros - * @{ - */ -#define PCD_MIN(a, b) (((a) < (b)) ? (a) : (b)) -#define PCD_MAX(a, b) (((a) > (b)) ? (a) : (b)) -/** - * @} - */ - -/* Private functions prototypes ----------------------------------------------*/ -/** @defgroup PCD_Private_Functions PCD Private Functions - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum); -static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum); -static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum); -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup PCD_Exported_Functions PCD Exported Functions - * @{ - */ - -/** @defgroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This section provides functions allowing to: - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the PCD according to the specified - * parameters in the PCD_InitTypeDef and initialize the associated handle. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) -{ -#if defined (USB_OTG_FS) - const USB_OTG_GlobalTypeDef *USBx; -#endif /* defined (USB_OTG_FS) */ - uint8_t i; - - /* Check the PCD handle allocation */ - if (hpcd == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance)); - -#if defined (USB_OTG_FS) - USBx = hpcd->Instance; -#endif /* defined (USB_OTG_FS) */ - - if (hpcd->State == HAL_PCD_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hpcd->Lock = HAL_UNLOCKED; - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SOFCallback = HAL_PCD_SOFCallback; - hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback; - hpcd->ResetCallback = HAL_PCD_ResetCallback; - hpcd->SuspendCallback = HAL_PCD_SuspendCallback; - hpcd->ResumeCallback = HAL_PCD_ResumeCallback; - hpcd->ConnectCallback = HAL_PCD_ConnectCallback; - hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback; - hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback; - hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback; - hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback; - hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback; - hpcd->LPMCallback = HAL_PCDEx_LPM_Callback; - hpcd->BCDCallback = HAL_PCDEx_BCD_Callback; - - if (hpcd->MspInitCallback == NULL) - { - hpcd->MspInitCallback = HAL_PCD_MspInit; - } - - /* Init the low level hardware */ - hpcd->MspInitCallback(hpcd); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC... */ - HAL_PCD_MspInit(hpcd); -#endif /* (USE_HAL_PCD_REGISTER_CALLBACKS) */ - } - - hpcd->State = HAL_PCD_STATE_BUSY; - -#if defined (USB_OTG_FS) - /* Disable DMA mode for FS instance */ - if (USBx == USB_OTG_FS) - { - hpcd->Init.dma_enable = 0U; - } -#endif /* defined (USB_OTG_FS) */ - - /* Disable the Interrupts */ - __HAL_PCD_DISABLE(hpcd); - - /*Init the Core (common init.) */ - if (USB_CoreInit(hpcd->Instance, hpcd->Init) != HAL_OK) - { - hpcd->State = HAL_PCD_STATE_ERROR; - return HAL_ERROR; - } - - /* Force Device Mode */ - if (USB_SetCurrentMode(hpcd->Instance, USB_DEVICE_MODE) != HAL_OK) - { - hpcd->State = HAL_PCD_STATE_ERROR; - return HAL_ERROR; - } - - /* Init endpoints structures */ - for (i = 0U; i < hpcd->Init.dev_endpoints; i++) - { - /* Init ep structure */ - hpcd->IN_ep[i].is_in = 1U; - hpcd->IN_ep[i].num = i; - hpcd->IN_ep[i].tx_fifo_num = i; - /* Control until ep is activated */ - hpcd->IN_ep[i].type = EP_TYPE_CTRL; - hpcd->IN_ep[i].maxpacket = 0U; - hpcd->IN_ep[i].xfer_buff = 0U; - hpcd->IN_ep[i].xfer_len = 0U; - } - - for (i = 0U; i < hpcd->Init.dev_endpoints; i++) - { - hpcd->OUT_ep[i].is_in = 0U; - hpcd->OUT_ep[i].num = i; - /* Control until ep is activated */ - hpcd->OUT_ep[i].type = EP_TYPE_CTRL; - hpcd->OUT_ep[i].maxpacket = 0U; - hpcd->OUT_ep[i].xfer_buff = 0U; - hpcd->OUT_ep[i].xfer_len = 0U; - } - - /* Init Device */ - if (USB_DevInit(hpcd->Instance, hpcd->Init) != HAL_OK) - { - hpcd->State = HAL_PCD_STATE_ERROR; - return HAL_ERROR; - } - - hpcd->USB_Address = 0U; - hpcd->State = HAL_PCD_STATE_READY; -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \ - || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \ - || defined(STM32F423xx) - /* Activate LPM */ - if (hpcd->Init.lpm_enable == 1U) - { - (void)HAL_PCDEx_ActivateLPM(hpcd); - } -#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || - defined(STM32F423xx) */ - (void)USB_DevDisconnect(hpcd->Instance); - - return HAL_OK; -} - -/** - * @brief DeInitializes the PCD peripheral. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd) -{ - /* Check the PCD handle allocation */ - if (hpcd == NULL) - { - return HAL_ERROR; - } - - hpcd->State = HAL_PCD_STATE_BUSY; - - /* Stop Device */ - if (USB_StopDevice(hpcd->Instance) != HAL_OK) - { - return HAL_ERROR; - } - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - if (hpcd->MspDeInitCallback == NULL) - { - hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; /* Legacy weak MspDeInit */ - } - - /* DeInit the low level hardware */ - hpcd->MspDeInitCallback(hpcd); -#else - /* DeInit the low level hardware: CLOCK, NVIC.*/ - HAL_PCD_MspDeInit(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - hpcd->State = HAL_PCD_STATE_RESET; - - return HAL_OK; -} - -/** - * @brief Initializes the PCD MSP. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes PCD MSP. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_MspDeInit could be implemented in the user file - */ -} - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -/** - * @brief Register a User USB PCD Callback - * To be used instead of the weak predefined callback - * @param hpcd USB PCD handle - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_PCD_SOF_CB_ID USB PCD SOF callback ID - * @arg @ref HAL_PCD_SETUPSTAGE_CB_ID USB PCD Setup callback ID - * @arg @ref HAL_PCD_RESET_CB_ID USB PCD Reset callback ID - * @arg @ref HAL_PCD_SUSPEND_CB_ID USB PCD Suspend callback ID - * @arg @ref HAL_PCD_RESUME_CB_ID USB PCD Resume callback ID - * @arg @ref HAL_PCD_CONNECT_CB_ID USB PCD Connect callback ID - * @arg @ref HAL_PCD_DISCONNECT_CB_ID USB PCD Disconnect callback ID - * @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID - * @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID - * @param pCallback pointer to the Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, - HAL_PCD_CallbackIDTypeDef CallbackID, - pPCD_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - switch (CallbackID) - { - case HAL_PCD_SOF_CB_ID : - hpcd->SOFCallback = pCallback; - break; - - case HAL_PCD_SETUPSTAGE_CB_ID : - hpcd->SetupStageCallback = pCallback; - break; - - case HAL_PCD_RESET_CB_ID : - hpcd->ResetCallback = pCallback; - break; - - case HAL_PCD_SUSPEND_CB_ID : - hpcd->SuspendCallback = pCallback; - break; - - case HAL_PCD_RESUME_CB_ID : - hpcd->ResumeCallback = pCallback; - break; - - case HAL_PCD_CONNECT_CB_ID : - hpcd->ConnectCallback = pCallback; - break; - - case HAL_PCD_DISCONNECT_CB_ID : - hpcd->DisconnectCallback = pCallback; - break; - - case HAL_PCD_MSPINIT_CB_ID : - hpcd->MspInitCallback = pCallback; - break; - - case HAL_PCD_MSPDEINIT_CB_ID : - hpcd->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (hpcd->State == HAL_PCD_STATE_RESET) - { - switch (CallbackID) - { - case HAL_PCD_MSPINIT_CB_ID : - hpcd->MspInitCallback = pCallback; - break; - - case HAL_PCD_MSPDEINIT_CB_ID : - hpcd->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - return status; -} - -/** - * @brief Unregister an USB PCD Callback - * USB PCD callback is redirected to the weak predefined callback - * @param hpcd USB PCD handle - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_PCD_SOF_CB_ID USB PCD SOF callback ID - * @arg @ref HAL_PCD_SETUPSTAGE_CB_ID USB PCD Setup callback ID - * @arg @ref HAL_PCD_RESET_CB_ID USB PCD Reset callback ID - * @arg @ref HAL_PCD_SUSPEND_CB_ID USB PCD Suspend callback ID - * @arg @ref HAL_PCD_RESUME_CB_ID USB PCD Resume callback ID - * @arg @ref HAL_PCD_CONNECT_CB_ID USB PCD Connect callback ID - * @arg @ref HAL_PCD_DISCONNECT_CB_ID USB PCD Disconnect callback ID - * @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID - * @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - /* Setup Legacy weak Callbacks */ - if (hpcd->State == HAL_PCD_STATE_READY) - { - switch (CallbackID) - { - case HAL_PCD_SOF_CB_ID : - hpcd->SOFCallback = HAL_PCD_SOFCallback; - break; - - case HAL_PCD_SETUPSTAGE_CB_ID : - hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback; - break; - - case HAL_PCD_RESET_CB_ID : - hpcd->ResetCallback = HAL_PCD_ResetCallback; - break; - - case HAL_PCD_SUSPEND_CB_ID : - hpcd->SuspendCallback = HAL_PCD_SuspendCallback; - break; - - case HAL_PCD_RESUME_CB_ID : - hpcd->ResumeCallback = HAL_PCD_ResumeCallback; - break; - - case HAL_PCD_CONNECT_CB_ID : - hpcd->ConnectCallback = HAL_PCD_ConnectCallback; - break; - - case HAL_PCD_DISCONNECT_CB_ID : - hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback; - break; - - case HAL_PCD_MSPINIT_CB_ID : - hpcd->MspInitCallback = HAL_PCD_MspInit; - break; - - case HAL_PCD_MSPDEINIT_CB_ID : - hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; - break; - - default : - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (hpcd->State == HAL_PCD_STATE_RESET) - { - switch (CallbackID) - { - case HAL_PCD_MSPINIT_CB_ID : - hpcd->MspInitCallback = HAL_PCD_MspInit; - break; - - case HAL_PCD_MSPDEINIT_CB_ID : - hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; - break; - - default : - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - return status; -} - -/** - * @brief Register USB PCD Data OUT Stage Callback - * To be used instead of the weak HAL_PCD_DataOutStageCallback() predefined callback - * @param hpcd PCD handle - * @param pCallback pointer to the USB PCD Data OUT Stage Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, - pPCD_DataOutStageCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->DataOutStageCallback = pCallback; - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Unregister the USB PCD Data OUT Stage Callback - * USB PCD Data OUT Stage Callback is redirected to the weak HAL_PCD_DataOutStageCallback() predefined callback - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback; /* Legacy weak DataOutStageCallback */ - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Register USB PCD Data IN Stage Callback - * To be used instead of the weak HAL_PCD_DataInStageCallback() predefined callback - * @param hpcd PCD handle - * @param pCallback pointer to the USB PCD Data IN Stage Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, - pPCD_DataInStageCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->DataInStageCallback = pCallback; - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Unregister the USB PCD Data IN Stage Callback - * USB PCD Data OUT Stage Callback is redirected to the weak HAL_PCD_DataInStageCallback() predefined callback - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback; /* Legacy weak DataInStageCallback */ - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Register USB PCD Iso OUT incomplete Callback - * To be used instead of the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback - * @param hpcd PCD handle - * @param pCallback pointer to the USB PCD Iso OUT incomplete Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, - pPCD_IsoOutIncpltCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->ISOOUTIncompleteCallback = pCallback; - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Unregister the USB PCD Iso OUT incomplete Callback - * USB PCD Iso OUT incomplete Callback is redirected - * to the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback; /* Legacy weak ISOOUTIncompleteCallback */ - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Register USB PCD Iso IN incomplete Callback - * To be used instead of the weak HAL_PCD_ISOINIncompleteCallback() predefined callback - * @param hpcd PCD handle - * @param pCallback pointer to the USB PCD Iso IN incomplete Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, - pPCD_IsoInIncpltCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->ISOINIncompleteCallback = pCallback; - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Unregister the USB PCD Iso IN incomplete Callback - * USB PCD Iso IN incomplete Callback is redirected - * to the weak HAL_PCD_ISOINIncompleteCallback() predefined callback - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback; /* Legacy weak ISOINIncompleteCallback */ - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Register USB PCD BCD Callback - * To be used instead of the weak HAL_PCDEx_BCD_Callback() predefined callback - * @param hpcd PCD handle - * @param pCallback pointer to the USB PCD BCD Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, pPCD_BcdCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->BCDCallback = pCallback; - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Unregister the USB PCD BCD Callback - * USB BCD Callback is redirected to the weak HAL_PCDEx_BCD_Callback() predefined callback - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterBcdCallback(PCD_HandleTypeDef *hpcd) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->BCDCallback = HAL_PCDEx_BCD_Callback; /* Legacy weak HAL_PCDEx_BCD_Callback */ - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Register USB PCD LPM Callback - * To be used instead of the weak HAL_PCDEx_LPM_Callback() predefined callback - * @param hpcd PCD handle - * @param pCallback pointer to the USB PCD LPM Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->LPMCallback = pCallback; - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} - -/** - * @brief Unregister the USB PCD LPM Callback - * USB LPM Callback is redirected to the weak HAL_PCDEx_LPM_Callback() predefined callback - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpcd); - - if (hpcd->State == HAL_PCD_STATE_READY) - { - hpcd->LPMCallback = HAL_PCDEx_LPM_Callback; /* Legacy weak HAL_PCDEx_LPM_Callback */ - } - else - { - /* Update the error code */ - hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpcd); - - return status; -} -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup PCD_Exported_Functions_Group2 Input and Output operation functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the PCD data - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Start the USB device - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - __HAL_LOCK(hpcd); - - if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) && - (hpcd->Init.battery_charging_enable == 1U)) - { - /* Enable USB Transceiver */ - USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN; - } - - __HAL_PCD_ENABLE(hpcd); - (void)USB_DevConnect(hpcd->Instance); - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Stop the USB device. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - __HAL_LOCK(hpcd); - __HAL_PCD_DISABLE(hpcd); - (void)USB_DevDisconnect(hpcd->Instance); - - (void)USB_FlushTxFifo(hpcd->Instance, 0x10U); - - if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) && - (hpcd->Init.battery_charging_enable == 1U)) - { - /* Disable USB Transceiver */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN); - } - - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** - * @brief Handles PCD interrupt request. - * @param hpcd PCD handle - * @retval HAL status - */ -void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - uint32_t USBx_BASE = (uint32_t)USBx; - USB_OTG_EPTypeDef *ep; - uint32_t i; - uint32_t ep_intr; - uint32_t epint; - uint32_t epnum; - uint32_t fifoemptymsk; - uint32_t RegVal; - - /* ensure that we are in device mode */ - if (USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE) - { - /* avoid spurious interrupt */ - if (__HAL_PCD_IS_INVALID_INTERRUPT(hpcd)) - { - return; - } - - /* store current frame number */ - hpcd->FrameNumber = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF_Msk) >> USB_OTG_DSTS_FNSOF_Pos; - - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_MMIS)) - { - /* incorrect mode, acknowledge the interrupt */ - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS); - } - - /* Handle RxQLevel Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL)) - { - USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - - RegVal = USBx->GRXSTSP; - - ep = &hpcd->OUT_ep[RegVal & USB_OTG_GRXSTSP_EPNUM]; - - if (((RegVal & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT) - { - if ((RegVal & USB_OTG_GRXSTSP_BCNT) != 0U) - { - (void)USB_ReadPacket(USBx, ep->xfer_buff, - (uint16_t)((RegVal & USB_OTG_GRXSTSP_BCNT) >> 4)); - - ep->xfer_buff += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4; - ep->xfer_count += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4; - } - } - else if (((RegVal & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT) - { - (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U); - ep->xfer_count += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4; - } - else - { - /* ... */ - } - - USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - } - - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT)) - { - epnum = 0U; - - /* Read in the device interrupt bits */ - ep_intr = USB_ReadDevAllOutEpInterrupt(hpcd->Instance); - - while (ep_intr != 0U) - { - if ((ep_intr & 0x1U) != 0U) - { - epint = USB_ReadDevOutEPInterrupt(hpcd->Instance, (uint8_t)epnum); - - if ((epint & USB_OTG_DOEPINT_XFRC) == USB_OTG_DOEPINT_XFRC) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_XFRC); - (void)PCD_EP_OutXfrComplete_int(hpcd, epnum); - } - - if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); - /* Class B setup phase done for previous decoded setup */ - (void)PCD_EP_OutSetupPacket_int(hpcd, epnum); - } - - if ((epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPDIS); - } - - /* Clear OUT Endpoint disable interrupt */ - if ((epint & USB_OTG_DOEPINT_EPDISD) == USB_OTG_DOEPINT_EPDISD) - { - if ((USBx->GINTSTS & USB_OTG_GINTSTS_BOUTNAKEFF) == USB_OTG_GINTSTS_BOUTNAKEFF) - { - USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGONAK; - } - - ep = &hpcd->OUT_ep[epnum]; - - if (ep->is_iso_incomplete == 1U) - { - ep->is_iso_incomplete = 0U; - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_EPDISD); - } - - /* Clear Status Phase Received interrupt */ - if ((epint & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR); - } - - /* Clear OUT NAK interrupt */ - if ((epint & USB_OTG_DOEPINT_NAK) == USB_OTG_DOEPINT_NAK) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_NAK); - } - } - epnum++; - ep_intr >>= 1U; - } - } - - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IEPINT)) - { - /* Read in the device interrupt bits */ - ep_intr = USB_ReadDevAllInEpInterrupt(hpcd->Instance); - - epnum = 0U; - - while (ep_intr != 0U) - { - if ((ep_intr & 0x1U) != 0U) /* In ITR */ - { - epint = USB_ReadDevInEPInterrupt(hpcd->Instance, (uint8_t)epnum); - - if ((epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC) - { - fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK)); - USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk; - - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_XFRC); - - if (hpcd->Init.dma_enable == 1U) - { - hpcd->IN_ep[epnum].xfer_buff += hpcd->IN_ep[epnum].maxpacket; - - /* this is ZLP, so prepare EP0 for next setup */ - if ((epnum == 0U) && (hpcd->IN_ep[epnum].xfer_len == 0U)) - { - /* prepare to rx more setup packets */ - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - } - } - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataInStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - if ((epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC) - { - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_TOC); - } - if ((epint & USB_OTG_DIEPINT_ITTXFE) == USB_OTG_DIEPINT_ITTXFE) - { - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_ITTXFE); - } - if ((epint & USB_OTG_DIEPINT_INEPNE) == USB_OTG_DIEPINT_INEPNE) - { - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_INEPNE); - } - if ((epint & USB_OTG_DIEPINT_EPDISD) == USB_OTG_DIEPINT_EPDISD) - { - (void)USB_FlushTxFifo(USBx, epnum); - - ep = &hpcd->IN_ep[epnum]; - - if (ep->is_iso_incomplete == 1U) - { - ep->is_iso_incomplete = 0U; - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->ISOINIncompleteCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_ISOINIncompleteCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_EPDISD); - } - if ((epint & USB_OTG_DIEPINT_TXFE) == USB_OTG_DIEPINT_TXFE) - { - (void)PCD_WriteEmptyTxFifo(hpcd, epnum); - } - } - epnum++; - ep_intr >>= 1U; - } - } - - /* Handle Resume Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT)) - { - /* Clear the Remote Wake-up Signaling */ - USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG; - - if (hpcd->LPM_State == LPM_L1) - { - hpcd->LPM_State = LPM_L0; - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->LPMCallback(hpcd, PCD_LPM_L0_ACTIVE); -#else - HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L0_ACTIVE); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - else - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->ResumeCallback(hpcd); -#else - HAL_PCD_ResumeCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT); - } - - /* Handle Suspend Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP)) - { - if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS) - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SuspendCallback(hpcd); -#else - HAL_PCD_SuspendCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP); - } -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \ - || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \ - || defined(STM32F423xx) - /* Handle LPM Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT)) - { - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT); - - if (hpcd->LPM_State == LPM_L0) - { - hpcd->LPM_State = LPM_L1; - hpcd->BESL = (hpcd->Instance->GLPMCFG & USB_OTG_GLPMCFG_BESL) >> 2U; - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->LPMCallback(hpcd, PCD_LPM_L1_ACTIVE); -#else - HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L1_ACTIVE); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - else - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SuspendCallback(hpcd); -#else - HAL_PCD_SuspendCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - } -#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || - defined(STM32F423xx) */ - /* Handle Reset Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBRST)) - { - USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG; - (void)USB_FlushTxFifo(hpcd->Instance, 0x10U); - - for (i = 0U; i < hpcd->Init.dev_endpoints; i++) - { - USBx_INEP(i)->DIEPINT = 0xFB7FU; - USBx_INEP(i)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; - USBx_OUTEP(i)->DOEPINT = 0xFB7FU; - USBx_OUTEP(i)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; - USBx_OUTEP(i)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; - } - USBx_DEVICE->DAINTMSK |= 0x10001U; - - if (hpcd->Init.use_dedicated_ep1 != 0U) - { - USBx_DEVICE->DOUTEP1MSK |= USB_OTG_DOEPMSK_STUPM | - USB_OTG_DOEPMSK_XFRCM | - USB_OTG_DOEPMSK_EPDM; - - USBx_DEVICE->DINEP1MSK |= USB_OTG_DIEPMSK_TOM | - USB_OTG_DIEPMSK_XFRCM | - USB_OTG_DIEPMSK_EPDM; - } - else - { - USBx_DEVICE->DOEPMSK |= USB_OTG_DOEPMSK_STUPM | - USB_OTG_DOEPMSK_XFRCM | - USB_OTG_DOEPMSK_EPDM | - USB_OTG_DOEPMSK_OTEPSPRM | - USB_OTG_DOEPMSK_NAKM; - - USBx_DEVICE->DIEPMSK |= USB_OTG_DIEPMSK_TOM | - USB_OTG_DIEPMSK_XFRCM | - USB_OTG_DIEPMSK_EPDM; - } - - /* Set Default Address to 0 */ - USBx_DEVICE->DCFG &= ~USB_OTG_DCFG_DAD; - - /* setup EP0 to receive SETUP packets */ - (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t)hpcd->Init.dma_enable, - (uint8_t *)hpcd->Setup); - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBRST); - } - - /* Handle Enumeration done Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE)) - { - (void)USB_ActivateSetup(hpcd->Instance); - hpcd->Init.speed = USB_GetDevSpeed(hpcd->Instance); - - /* Set USB Turnaround time */ - (void)USB_SetTurnaroundTime(hpcd->Instance, - HAL_RCC_GetHCLKFreq(), - (uint8_t)hpcd->Init.speed); - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->ResetCallback(hpcd); -#else - HAL_PCD_ResetCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE); - } - - /* Handle SOF Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF)) - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SOFCallback(hpcd); -#else - HAL_PCD_SOFCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SOF); - } - - /* Handle Global OUT NAK effective Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_BOUTNAKEFF)) - { - USBx->GINTMSK &= ~USB_OTG_GINTMSK_GONAKEFFM; - - for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++) - { - if (hpcd->OUT_ep[epnum].is_iso_incomplete == 1U) - { - /* Abort current transaction and disable the EP */ - (void)HAL_PCD_EP_Abort(hpcd, (uint8_t)epnum); - } - } - } - - /* Handle Incomplete ISO IN Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR)) - { - for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++) - { - RegVal = USBx_INEP(epnum)->DIEPCTL; - - if ((hpcd->IN_ep[epnum].type == EP_TYPE_ISOC) && - ((RegVal & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA)) - { - hpcd->IN_ep[epnum].is_iso_incomplete = 1U; - - /* Abort current transaction and disable the EP */ - (void)HAL_PCD_EP_Abort(hpcd, (uint8_t)(epnum | 0x80U)); - } - } - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR); - } - - /* Handle Incomplete ISO OUT Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT)) - { - for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++) - { - RegVal = USBx_OUTEP(epnum)->DOEPCTL; - - if ((hpcd->OUT_ep[epnum].type == EP_TYPE_ISOC) && - ((RegVal & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) && - ((RegVal & (0x1U << 16)) == (hpcd->FrameNumber & 0x1U))) - { - hpcd->OUT_ep[epnum].is_iso_incomplete = 1U; - - USBx->GINTMSK |= USB_OTG_GINTMSK_GONAKEFFM; - - if ((USBx->GINTSTS & USB_OTG_GINTSTS_BOUTNAKEFF) == 0U) - { - USBx_DEVICE->DCTL |= USB_OTG_DCTL_SGONAK; - break; - } - } - } - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT); - } - - /* Handle Connection event Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT)) - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->ConnectCallback(hpcd); -#else - HAL_PCD_ConnectCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT); - } - - /* Handle Disconnection event Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OTGINT)) - { - RegVal = hpcd->Instance->GOTGINT; - - if ((RegVal & USB_OTG_GOTGINT_SEDET) == USB_OTG_GOTGINT_SEDET) - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DisconnectCallback(hpcd); -#else - HAL_PCD_DisconnectCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - hpcd->Instance->GOTGINT |= RegVal; - } - } -} - - -/** - * @brief Handles PCD Wakeup interrupt request. - * @param hpcd PCD handle - * @retval HAL status - */ -void HAL_PCD_WKUP_IRQHandler(PCD_HandleTypeDef *hpcd) -{ -#if defined (USB_OTG_FS) - USB_OTG_GlobalTypeDef *USBx; - USBx = hpcd->Instance; - - if (USBx == USB_OTG_FS) - { - /* Clear EXTI pending Bit */ - __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG(); - } - else -#endif /* defined (USB_OTG_FS) */ - { - /* Clear EXTI pending Bit */ - __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG(); - } -} -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - - -/** - * @brief Data OUT stage callback. - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval None - */ -__weak void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - UNUSED(epnum); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_DataOutStageCallback could be implemented in the user file - */ -} - -/** - * @brief Data IN stage callback - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval None - */ -__weak void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - UNUSED(epnum); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_DataInStageCallback could be implemented in the user file - */ -} -/** - * @brief Setup stage callback - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_SetupStageCallback could be implemented in the user file - */ -} - -/** - * @brief USB Start Of Frame callback. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_SOFCallback could be implemented in the user file - */ -} - -/** - * @brief USB Reset callback. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_ResetCallback could be implemented in the user file - */ -} - -/** - * @brief Suspend event callback. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_SuspendCallback could be implemented in the user file - */ -} - -/** - * @brief Resume event callback. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_ResumeCallback could be implemented in the user file - */ -} - -/** - * @brief Incomplete ISO OUT callback. - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval None - */ -__weak void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - UNUSED(epnum); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_ISOOUTIncompleteCallback could be implemented in the user file - */ -} - -/** - * @brief Incomplete ISO IN callback. - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval None - */ -__weak void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - UNUSED(epnum); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_ISOINIncompleteCallback could be implemented in the user file - */ -} - -/** - * @brief Connection event callback. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_ConnectCallback could be implemented in the user file - */ -} - -/** - * @brief Disconnection event callback. - * @param hpcd PCD handle - * @retval None - */ -__weak void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCD_DisconnectCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup PCD_Exported_Functions_Group3 Peripheral Control functions - * @brief management functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the PCD data - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Connect the USB device - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - __HAL_LOCK(hpcd); - - if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) && - (hpcd->Init.battery_charging_enable == 1U)) - { - /* Enable USB Transceiver */ - USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN; - } - (void)USB_DevConnect(hpcd->Instance); - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Disconnect the USB device. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - __HAL_LOCK(hpcd); - (void)USB_DevDisconnect(hpcd->Instance); - - if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) && - (hpcd->Init.battery_charging_enable == 1U)) - { - /* Disable USB Transceiver */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN); - } - - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Set the USB Device address. - * @param hpcd PCD handle - * @param address new device address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address) -{ - __HAL_LOCK(hpcd); - hpcd->USB_Address = address; - (void)USB_SetDevAddress(hpcd->Instance, address); - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} -/** - * @brief Open and configure an endpoint. - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @param ep_mps endpoint max packet size - * @param ep_type endpoint type - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, - uint16_t ep_mps, uint8_t ep_type) -{ - HAL_StatusTypeDef ret = HAL_OK; - PCD_EPTypeDef *ep; - - if ((ep_addr & 0x80U) == 0x80U) - { - ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 1U; - } - else - { - ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 0U; - } - - ep->num = ep_addr & EP_ADDR_MSK; - ep->maxpacket = (uint32_t)ep_mps & 0x7FFU; - ep->type = ep_type; - - if (ep->is_in != 0U) - { - /* Assign a Tx FIFO */ - ep->tx_fifo_num = ep->num; - } - - /* Set initial data PID. */ - if (ep_type == EP_TYPE_BULK) - { - ep->data_pid_start = 0U; - } - - __HAL_LOCK(hpcd); - (void)USB_ActivateEndpoint(hpcd->Instance, ep); - __HAL_UNLOCK(hpcd); - - return ret; -} - -/** - * @brief Deactivate an endpoint. - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - PCD_EPTypeDef *ep; - - if ((ep_addr & 0x80U) == 0x80U) - { - ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 1U; - } - else - { - ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 0U; - } - ep->num = ep_addr & EP_ADDR_MSK; - - __HAL_LOCK(hpcd); - (void)USB_DeactivateEndpoint(hpcd->Instance, ep); - __HAL_UNLOCK(hpcd); - return HAL_OK; -} - - -/** - * @brief Receive an amount of data. - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @param pBuf pointer to the reception buffer - * @param len amount of data to be received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) -{ - PCD_EPTypeDef *ep; - - ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; - - /*setup and start the Xfer */ - ep->xfer_buff = pBuf; - ep->xfer_len = len; - ep->xfer_count = 0U; - ep->is_in = 0U; - ep->num = ep_addr & EP_ADDR_MSK; - - if (hpcd->Init.dma_enable == 1U) - { - ep->dma_addr = (uint32_t)pBuf; - } - - (void)USB_EPStartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable); - - return HAL_OK; -} - -/** - * @brief Get Received Data Size - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @retval Data Size - */ -uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef const *hpcd, uint8_t ep_addr) -{ - return hpcd->OUT_ep[ep_addr & EP_ADDR_MSK].xfer_count; -} -/** - * @brief Send an amount of data - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @param pBuf pointer to the transmission buffer - * @param len amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) -{ - PCD_EPTypeDef *ep; - - ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; - - /*setup and start the Xfer */ - ep->xfer_buff = pBuf; - ep->xfer_len = len; - ep->xfer_count = 0U; - ep->is_in = 1U; - ep->num = ep_addr & EP_ADDR_MSK; - - if (hpcd->Init.dma_enable == 1U) - { - ep->dma_addr = (uint32_t)pBuf; - } - - (void)USB_EPStartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable); - - return HAL_OK; -} - -/** - * @brief Set a STALL condition over an endpoint - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - PCD_EPTypeDef *ep; - - if (((uint32_t)ep_addr & EP_ADDR_MSK) > hpcd->Init.dev_endpoints) - { - return HAL_ERROR; - } - - if ((0x80U & ep_addr) == 0x80U) - { - ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 1U; - } - else - { - ep = &hpcd->OUT_ep[ep_addr]; - ep->is_in = 0U; - } - - ep->is_stall = 1U; - ep->num = ep_addr & EP_ADDR_MSK; - - __HAL_LOCK(hpcd); - - (void)USB_EPSetStall(hpcd->Instance, ep); - - if ((ep_addr & EP_ADDR_MSK) == 0U) - { - (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t)hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup); - } - - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Clear a STALL condition over in an endpoint - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - PCD_EPTypeDef *ep; - - if (((uint32_t)ep_addr & 0x0FU) > hpcd->Init.dev_endpoints) - { - return HAL_ERROR; - } - - if ((0x80U & ep_addr) == 0x80U) - { - ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 1U; - } - else - { - ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; - ep->is_in = 0U; - } - - ep->is_stall = 0U; - ep->num = ep_addr & EP_ADDR_MSK; - - __HAL_LOCK(hpcd); - (void)USB_EPClearStall(hpcd->Instance, ep); - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Abort an USB EP transaction. - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Abort(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - HAL_StatusTypeDef ret; - PCD_EPTypeDef *ep; - - if ((0x80U & ep_addr) == 0x80U) - { - ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; - } - else - { - ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; - } - - /* Stop Xfer */ - ret = USB_EPStopXfer(hpcd->Instance, ep); - - return ret; -} - -/** - * @brief Flush an endpoint - * @param hpcd PCD handle - * @param ep_addr endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - __HAL_LOCK(hpcd); - - if ((ep_addr & 0x80U) == 0x80U) - { - (void)USB_FlushTxFifo(hpcd->Instance, (uint32_t)ep_addr & EP_ADDR_MSK); - } - else - { - (void)USB_FlushRxFifo(hpcd->Instance); - } - - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Activate remote wakeup signalling - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd) -{ - return (USB_ActivateRemoteWakeup(hpcd->Instance)); -} - -/** - * @brief De-activate remote wakeup signalling. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd) -{ - return (USB_DeActivateRemoteWakeup(hpcd->Instance)); -} - -/** - * @} - */ - -/** @defgroup PCD_Exported_Functions_Group4 Peripheral State functions - * @brief Peripheral State functions - * -@verbatim - =============================================================================== - ##### Peripheral State functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the PCD handle state. - * @param hpcd PCD handle - * @retval HAL state - */ -PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef const *hpcd) -{ - return hpcd->State; -} - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** - * @brief Set the USB Device high speed test mode. - * @param hpcd PCD handle - * @param testmode USB Device high speed test mode - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_SetTestMode(const PCD_HandleTypeDef *hpcd, uint8_t testmode) -{ - const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - uint32_t USBx_BASE = (uint32_t)USBx; - - switch (testmode) - { - case TEST_J: - case TEST_K: - case TEST_SE0_NAK: - case TEST_PACKET: - case TEST_FORCE_EN: - USBx_DEVICE->DCTL |= (uint32_t)testmode << 4; - break; - - default: - break; - } - - return HAL_OK; -} -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup PCD_Private_Functions - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** - * @brief Check FIFO for the next packet to be loaded. - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval HAL status - */ -static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - uint32_t USBx_BASE = (uint32_t)USBx; - USB_OTG_EPTypeDef *ep; - uint32_t len; - uint32_t len32b; - uint32_t fifoemptymsk; - - ep = &hpcd->IN_ep[epnum]; - - if (ep->xfer_count > ep->xfer_len) - { - return HAL_ERROR; - } - - len = ep->xfer_len - ep->xfer_count; - - if (len > ep->maxpacket) - { - len = ep->maxpacket; - } - - len32b = (len + 3U) / 4U; - - while (((USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b) && - (ep->xfer_count < ep->xfer_len) && (ep->xfer_len != 0U)) - { - /* Write the FIFO */ - len = ep->xfer_len - ep->xfer_count; - - if (len > ep->maxpacket) - { - len = ep->maxpacket; - } - len32b = (len + 3U) / 4U; - - (void)USB_WritePacket(USBx, ep->xfer_buff, (uint8_t)epnum, (uint16_t)len, - (uint8_t)hpcd->Init.dma_enable); - - ep->xfer_buff += len; - ep->xfer_count += len; - } - - if (ep->xfer_len <= ep->xfer_count) - { - fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK)); - USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk; - } - - return HAL_OK; -} - - -/** - * @brief process EP OUT transfer complete interrupt. - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval HAL status - */ -static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum) -{ - USB_OTG_EPTypeDef *ep; - const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t gSNPSiD = *(__IO const uint32_t *)(&USBx->CID + 0x1U); - uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT; - - if (hpcd->Init.dma_enable == 1U) - { - if ((DoepintReg & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) /* Class C */ - { - /* StupPktRcvd = 1 this is a setup packet */ - if ((gSNPSiD > USB_OTG_CORE_ID_300A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } - } - else if ((DoepintReg & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) /* Class E */ - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR); - } - else if ((DoepintReg & (USB_OTG_DOEPINT_STUP | USB_OTG_DOEPINT_OTEPSPR)) == 0U) - { - /* StupPktRcvd = 1 this is a setup packet */ - if ((gSNPSiD > USB_OTG_CORE_ID_300A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } - else - { - ep = &hpcd->OUT_ep[epnum]; - - /* out data packet received over EP */ - ep->xfer_count = ep->xfer_size - (USBx_OUTEP(epnum)->DOEPTSIZ & USB_OTG_DOEPTSIZ_XFRSIZ); - - if (epnum == 0U) - { - if (ep->xfer_len == 0U) - { - /* this is ZLP, so prepare EP0 for next setup */ - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - } - else - { - ep->xfer_buff += ep->xfer_count; - } - } - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - } - else - { - /* ... */ - } - } - else - { - if (gSNPSiD == USB_OTG_CORE_ID_310A) - { - /* StupPktRcvd = 1 this is a setup packet */ - if ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } - else - { - if ((DoepintReg & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR); - } - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - } - else - { - if ((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U)) - { - /* this is ZLP, so prepare EP0 for next setup */ - (void)USB_EP0_OutStart(hpcd->Instance, 0U, (uint8_t *)hpcd->Setup); - } - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - } - - return HAL_OK; -} - - -/** - * @brief process EP OUT setup packet received interrupt. - * @param hpcd PCD handle - * @param epnum endpoint number - * @retval HAL status - */ -static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum) -{ - const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t gSNPSiD = *(__IO const uint32_t *)(&USBx->CID + 0x1U); - uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT; - - if ((gSNPSiD > USB_OTG_CORE_ID_300A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } - - /* Inform the upper layer that a setup packet is available */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SetupStageCallback(hpcd); -#else - HAL_PCD_SetupStageCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - if ((gSNPSiD > USB_OTG_CORE_ID_300A) && (hpcd->Init.dma_enable == 1U)) - { - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - } - - return HAL_OK; -} -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -#endif /* HAL_PCD_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c deleted file mode 100644 index b66be6a..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c +++ /dev/null @@ -1,347 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pcd_ex.c - * @author MCD Application Team - * @brief PCD Extended HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the USB Peripheral Controller: - * + Extended features functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PCDEx PCDEx - * @brief PCD Extended HAL module driver - * @{ - */ - -#ifdef HAL_PCD_MODULE_ENABLED - -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup PCDEx_Exported_Functions PCDEx Exported Functions - * @{ - */ - -/** @defgroup PCDEx_Exported_Functions_Group1 Peripheral Control functions - * @brief PCDEx control functions - * -@verbatim - =============================================================================== - ##### Extended features functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Update FIFO configuration - -@endverbatim - * @{ - */ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/** - * @brief Set Tx FIFO - * @param hpcd PCD handle - * @param fifo The number of Tx fifo - * @param size Fifo size - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size) -{ - uint8_t i; - uint32_t Tx_Offset; - - /* TXn min size = 16 words. (n : Transmit FIFO index) - When a TxFIFO is not used, the Configuration should be as follows: - case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes) - --> Txm can use the space allocated for Txn. - case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes) - --> Txn should be configured with the minimum space of 16 words - The FIFO is used optimally when used TxFIFOs are allocated in the top - of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones. - When DMA is used 3n * FIFO locations should be reserved for internal DMA registers */ - - Tx_Offset = hpcd->Instance->GRXFSIZ; - - if (fifo == 0U) - { - hpcd->Instance->DIEPTXF0_HNPTXFSIZ = ((uint32_t)size << 16) | Tx_Offset; - } - else - { - Tx_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16; - for (i = 0U; i < (fifo - 1U); i++) - { - Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16); - } - - /* Multiply Tx_Size by 2 to get higher performance */ - hpcd->Instance->DIEPTXF[fifo - 1U] = ((uint32_t)size << 16) | Tx_Offset; - } - - return HAL_OK; -} - -/** - * @brief Set Rx FIFO - * @param hpcd PCD handle - * @param size Size of Rx fifo - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size) -{ - hpcd->Instance->GRXFSIZ = size; - - return HAL_OK; -} -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \ - || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \ - || defined(STM32F423xx) -/** - * @brief Activate LPM feature. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - hpcd->lpm_active = 1U; - hpcd->LPM_State = LPM_L0; - USBx->GINTMSK |= USB_OTG_GINTMSK_LPMINTM; - USBx->GLPMCFG |= (USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL); - - return HAL_OK; -} - -/** - * @brief Deactivate LPM feature. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - hpcd->lpm_active = 0U; - USBx->GINTMSK &= ~USB_OTG_GINTMSK_LPMINTM; - USBx->GLPMCFG &= ~(USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL); - - return HAL_OK; -} -#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || - defined(STM32F423xx) */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) \ - || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Handle BatteryCharging Process. - * @param hpcd PCD handle - * @retval HAL status - */ -void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - uint32_t tickstart = HAL_GetTick(); - - /* Enable DCD : Data Contact Detect */ - USBx->GCCFG |= USB_OTG_GCCFG_DCDEN; - - /* Wait for Min DCD Timeout */ - HAL_Delay(300U); - - /* Check Detect flag */ - if ((USBx->GCCFG & USB_OTG_GCCFG_DCDET) == USB_OTG_GCCFG_DCDET) - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->BCDCallback(hpcd, PCD_BCD_CONTACT_DETECTION); -#else - HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CONTACT_DETECTION); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - - /* Primary detection: checks if connected to Standard Downstream Port - (without charging capability) */ - USBx->GCCFG &= ~USB_OTG_GCCFG_DCDEN; - HAL_Delay(50U); - USBx->GCCFG |= USB_OTG_GCCFG_PDEN; - HAL_Delay(50U); - - if ((USBx->GCCFG & USB_OTG_GCCFG_PDET) == 0U) - { - /* Case of Standard Downstream Port */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->BCDCallback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT); -#else - HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - else - { - /* start secondary detection to check connection to Charging Downstream - Port or Dedicated Charging Port */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN); - HAL_Delay(50U); - USBx->GCCFG |= USB_OTG_GCCFG_SDEN; - HAL_Delay(50U); - - if ((USBx->GCCFG & USB_OTG_GCCFG_SDET) == USB_OTG_GCCFG_SDET) - { - /* case Dedicated Charging Port */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->BCDCallback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT); -#else - HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - else - { - /* case Charging Downstream Port */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->BCDCallback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT); -#else - HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - } - - /* Battery Charging capability discovery finished */ - (void)HAL_PCDEx_DeActivateBCD(hpcd); - - /* Check for the Timeout, else start USB Device */ - if ((HAL_GetTick() - tickstart) > 1000U) - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->BCDCallback(hpcd, PCD_BCD_ERROR); -#else - HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_ERROR); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } - else - { -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->BCDCallback(hpcd, PCD_BCD_DISCOVERY_COMPLETED); -#else - HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DISCOVERY_COMPLETED); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - } -} - -/** - * @brief Activate BatteryCharging feature. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCDEx_ActivateBCD(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN); - USBx->GCCFG &= ~(USB_OTG_GCCFG_SDEN); - - /* Power Down USB transceiver */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN); - - /* Enable Battery charging */ - USBx->GCCFG |= USB_OTG_GCCFG_BCDEN; - - hpcd->battery_charging_active = 1U; - - return HAL_OK; -} - -/** - * @brief Deactivate BatteryCharging feature. - * @param hpcd PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCDEx_DeActivateBCD(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - USBx->GCCFG &= ~(USB_OTG_GCCFG_SDEN); - USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN); - - /* Disable Battery charging */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_BCDEN); - - hpcd->battery_charging_active = 0U; - - return HAL_OK; -} -#endif /* defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -/** - * @brief Send LPM message to user layer callback. - * @param hpcd PCD handle - * @param msg LPM message - * @retval HAL status - */ -__weak void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - UNUSED(msg); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCDEx_LPM_Callback could be implemented in the user file - */ -} - -/** - * @brief Send BatteryCharging message to user layer callback. - * @param hpcd PCD handle - * @param msg LPM message - * @retval HAL status - */ -__weak void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpcd); - UNUSED(msg); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_PCDEx_BCD_Callback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -#endif /* HAL_PCD_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c deleted file mode 100644 index 5ccde64..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c +++ /dev/null @@ -1,598 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr.c - * @author MCD Application Team - * @brief PWR HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Power Controller (PWR) peripheral: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PWR PWR - * @brief PWR HAL module driver - * @{ - */ - -#ifdef HAL_PWR_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup PWR_Private_Constants - * @{ - */ - -/** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask - * @{ - */ -#define PVD_MODE_IT 0x00010000U -#define PVD_MODE_EVT 0x00020000U -#define PVD_RISING_EDGE 0x00000001U -#define PVD_FALLING_EDGE 0x00000002U -/** - * @} - */ - -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup PWR_Exported_Functions PWR Exported Functions - * @{ - */ - -/** @defgroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - After reset, the backup domain (RTC registers, RTC backup data - registers and backup SRAM) is protected against possible unwanted - write accesses. - To enable access to the RTC Domain and RTC registers, proceed as follows: - (+) Enable the Power Controller (PWR) APB1 interface clock using the - __HAL_RCC_PWR_CLK_ENABLE() macro. - (+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the HAL PWR peripheral registers to their default reset values. - * @retval None - */ -void HAL_PWR_DeInit(void) -{ - __HAL_RCC_PWR_FORCE_RESET(); - __HAL_RCC_PWR_RELEASE_RESET(); -} - -/** - * @brief Enables access to the backup domain (RTC registers, RTC - * backup data registers and backup SRAM). - * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the - * Backup Domain Access should be kept enabled. - * @note The following sequence is required to bypass the delay between - * DBP bit programming and the effective enabling of the backup domain. - * Please check the Errata Sheet for more details under "Possible delay - * in backup domain protection disabling/enabling after programming the - * DBP bit" section. - * @retval None - */ -void HAL_PWR_EnableBkUpAccess(void) -{ - __IO uint32_t dummyread; - *(__IO uint32_t *) CR_DBP_BB = (uint32_t)ENABLE; - dummyread = PWR->CR; - UNUSED(dummyread); -} - -/** - * @brief Disables access to the backup domain (RTC registers, RTC - * backup data registers and backup SRAM). - * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the - * Backup Domain Access should be kept enabled. - * @note The following sequence is required to bypass the delay between - * DBP bit programming and the effective disabling of the backup domain. - * Please check the Errata Sheet for more details under "Possible delay - * in backup domain protection disabling/enabling after programming the - * DBP bit" section. - * @retval None - */ -void HAL_PWR_DisableBkUpAccess(void) -{ - __IO uint32_t dummyread; - *(__IO uint32_t *) CR_DBP_BB = (uint32_t)DISABLE; - dummyread = PWR->CR; - UNUSED(dummyread); -} - -/** - * @} - */ - -/** @defgroup PWR_Exported_Functions_Group2 Peripheral Control functions - * @brief Low Power modes configuration functions - * -@verbatim - - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - - *** PVD configuration *** - ========================= - [..] - (+) The PVD is used to monitor the VDD power supply by comparing it to a - threshold selected by the PVD Level (PLS[2:0] bits in the PWR_CR). - (+) A PVDO flag is available to indicate if VDD/VDDA is higher or lower - than the PVD threshold. This event is internally connected to the EXTI - line16 and can generate an interrupt if enabled. This is done through - __HAL_PWR_PVD_EXTI_ENABLE_IT() macro. - (+) The PVD is stopped in Standby mode. - - *** Wake-up pin configuration *** - ================================ - [..] - (+) Wake-up pin is used to wake up the system from Standby mode. This pin is - forced in input pull-down configuration and is active on rising edges. - (+) There is one Wake-up pin: Wake-up Pin 1 on PA.00. - (++) For STM32F446xx there are two Wake-Up pins: Pin1 on PA.00 and Pin2 on PC.13 - (++) For STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx there are three Wake-Up pins: Pin1 on PA.00, Pin2 on PC.00 and Pin3 on PC.01 - - *** Low Power modes configuration *** - ===================================== - [..] - The devices feature 3 low-power modes: - (+) Sleep mode: Cortex-M4 core stopped, peripherals kept running. - (+) Stop mode: all clocks are stopped, regulator running, regulator - in low power mode - (+) Standby mode: 1.2V domain powered off. - - *** Sleep mode *** - ================== - [..] - (+) Entry: - The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(Regulator, SLEEPEntry) - functions with - (++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction - (++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction - (++) PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR: Enter SLEEP mode with WFE instruction and - no clear of pending event before. - - -@@- The Regulator parameter is not used for the STM32F4 family - and is kept as parameter just to maintain compatibility with the - lower power families (STM32L). - (+) Exit: - Any peripheral interrupt acknowledged by the nested vectored interrupt - controller (NVIC) can wake up the device from Sleep mode. - - *** Stop mode *** - ================= - [..] - In Stop mode, all clocks in the 1.2V domain are stopped, the PLL, the HSI, - and the HSE RC oscillators are disabled. Internal SRAM and register contents - are preserved. - The voltage regulator can be configured either in normal or low-power mode. - To minimize the consumption In Stop mode, FLASH can be powered off before - entering the Stop mode using the HAL_PWREx_EnableFlashPowerDown() function. - It can be switched on again by software after exiting the Stop mode using - the HAL_PWREx_DisableFlashPowerDown() function. - - (+) Entry: - The Stop mode is entered using the HAL_PWR_EnterSTOPMode(Regulator, STOPEntry) - function with: - (++) Regulator: - (+++) Main regulator ON. - (+++) Low Power regulator ON. - (++) STOPEntry: - (+++) PWR_STOPENTRY_WFI : Enter STOP mode with WFI instruction. - (+++) PWR_STOPENTRY_WFE : Enter STOP mode with WFE instruction and - clear of pending events before. - (+++) PWR_STOPENTRY_WFE_NO_EVT_CLEAR : Enter STOP mode with WFE instruction and - no clear of pending event before. - (+) Exit: - Any EXTI Line (Internal or External) configured in Interrupt/Event mode. - - *** Standby mode *** - ==================== - [..] - (+) - The Standby mode allows to achieve the lowest power consumption. It is based - on the Cortex-M4 deep sleep mode, with the voltage regulator disabled. - The 1.2V domain is consequently powered off. The PLL, the HSI oscillator and - the HSE oscillator are also switched off. SRAM and register contents are lost - except for the RTC registers, RTC backup registers, backup SRAM and Standby - circuitry. - - The voltage regulator is OFF. - - (++) Entry: - (+++) The Standby mode is entered using the HAL_PWR_EnterSTANDBYMode() function. - (++) Exit: - (+++) WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wake-up, - tamper event, time-stamp event, external reset in NRST pin, IWDG reset. - - *** Auto-wake-up (AWU) from low-power mode *** - ============================================= - [..] - - (+) The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC - Wake-up event, a tamper event or a time-stamp event, without depending on - an external interrupt (Auto-wake-up mode). - - (+) RTC auto-wake-up (AWU) from the Stop and Standby modes - - (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to - configure the RTC to generate the RTC alarm using the HAL_RTC_SetAlarm_IT() function. - - (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it - is necessary to configure the RTC to detect the tamper or time stamp event using the - HAL_RTCEx_SetTimeStamp_IT() or HAL_RTCEx_SetTamper_IT() functions. - - (++) To wake up from the Stop mode with an RTC Wake-up event, it is necessary to - configure the RTC to generate the RTC Wake-up event using the HAL_RTCEx_SetWakeUpTimer_IT() function. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). - * @param sConfigPVD pointer to an PWR_PVDTypeDef structure that contains the configuration - * information for the PVD. - * @note Refer to the electrical characteristics of your device datasheet for - * more details about the voltage threshold corresponding to each - * detection level. - * @retval None - */ -void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD) -{ - /* Check the parameters */ - assert_param(IS_PWR_PVD_LEVEL(sConfigPVD->PVDLevel)); - assert_param(IS_PWR_PVD_MODE(sConfigPVD->Mode)); - - /* Set PLS[7:5] bits according to PVDLevel value */ - MODIFY_REG(PWR->CR, PWR_CR_PLS, sConfigPVD->PVDLevel); - - /* Clear any previous config. Keep it clear if no event or IT mode is selected */ - __HAL_PWR_PVD_EXTI_DISABLE_EVENT(); - __HAL_PWR_PVD_EXTI_DISABLE_IT(); - __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); - __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); - - /* Configure interrupt mode */ - if((sConfigPVD->Mode & PVD_MODE_IT) == PVD_MODE_IT) - { - __HAL_PWR_PVD_EXTI_ENABLE_IT(); - } - - /* Configure event mode */ - if((sConfigPVD->Mode & PVD_MODE_EVT) == PVD_MODE_EVT) - { - __HAL_PWR_PVD_EXTI_ENABLE_EVENT(); - } - - /* Configure the edge */ - if((sConfigPVD->Mode & PVD_RISING_EDGE) == PVD_RISING_EDGE) - { - __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE(); - } - - if((sConfigPVD->Mode & PVD_FALLING_EDGE) == PVD_FALLING_EDGE) - { - __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); - } -} - -/** - * @brief Enables the Power Voltage Detector(PVD). - * @retval None - */ -void HAL_PWR_EnablePVD(void) -{ - *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Power Voltage Detector(PVD). - * @retval None - */ -void HAL_PWR_DisablePVD(void) -{ - *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)DISABLE; -} - -/** - * @brief Enables the Wake-up PINx functionality. - * @param WakeUpPinx Specifies the Power Wake-Up pin to enable. - * This parameter can be one of the following values: - * @arg PWR_WAKEUP_PIN1 - * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @retval None - */ -void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx) -{ - /* Check the parameter */ - assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); - - /* Enable the wake up pin */ - SET_BIT(PWR->CSR, WakeUpPinx); -} - -/** - * @brief Disables the Wake-up PINx functionality. - * @param WakeUpPinx Specifies the Power Wake-Up pin to disable. - * This parameter can be one of the following values: - * @arg PWR_WAKEUP_PIN1 - * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @retval None - */ -void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) -{ - /* Check the parameter */ - assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); - - /* Disable the wake up pin */ - CLEAR_BIT(PWR->CSR, WakeUpPinx); -} - -/** - * @brief Enters Sleep mode. - * - * @note In Sleep mode, all I/O pins keep the same state as in Run mode. - * - * @note In Sleep mode, the systick is stopped to avoid exit from this mode with - * systick interrupt when used as time base for Timeout - * - * @param Regulator Specifies the regulator state in SLEEP mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_ON: SLEEP mode with regulator ON - * @arg PWR_LOWPOWERREGULATOR_ON: SLEEP mode with low power regulator ON - * @note This parameter is not used for the STM32F4 family and is kept as parameter - * just to maintain compatibility with the lower power families. - * @param SLEEPEntry Specifies if SLEEP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_SLEEPENTRY_WFI : Enter SLEEP mode with WFI instruction - * @arg PWR_SLEEPENTRY_WFE : Enter SLEEP mode with WFE instruction and - * clear of pending events before. - * @arg PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR : Enter SLEEP mode with WFE instruction and - * no clear of pending event before. - * @retval None - */ -void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(Regulator); - - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR(Regulator)); - assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); - - /* Clear SLEEPDEEP bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* Select SLEEP mode entry -------------------------------------------------*/ - if(SLEEPEntry == PWR_SLEEPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - if(SLEEPEntry != PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR) - { - /* Clear all pending event */ - __SEV(); - __WFE(); - } - - /* Request Wait For Event */ - __WFE(); - } -} - -/** - * @brief Enters Stop mode. - * @note In Stop mode, all I/O pins keep the same state as in Run mode. - * @note When exiting Stop mode by issuing an interrupt or a wake-up event, - * the HSI RC oscillator is selected as system clock. - * @note When the voltage regulator operates in low power mode, an additional - * startup delay is incurred when waking up from Stop mode. - * By keeping the internal regulator ON during Stop mode, the consumption - * is higher although the startup time is reduced. - * @param Regulator Specifies the regulator state in Stop mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_ON: Stop mode with regulator ON - * @arg PWR_LOWPOWERREGULATOR_ON: Stop mode with low power regulator ON - * @param STOPEntry Specifies if Stop mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_STOPENTRY_WFI : Enter Stop mode with WFI instruction - * @arg PWR_STOPENTRY_WFE : Enter Stop mode with WFE instruction and - * clear of pending events before. - * @arg PWR_STOPENTRY_WFE_NO_EVT_CLEAR : Enter STOP mode with WFE instruction and - * no clear of pending event before. - * @retval None - */ -void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) -{ - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR(Regulator)); - assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); - - /* Select the regulator state in Stop mode: Set PDDS and LPDS bits according to PWR_Regulator value */ - MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS), Regulator); - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* Select Stop mode entry --------------------------------------------------*/ - if(STOPEntry == PWR_STOPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - if(STOPEntry != PWR_STOPENTRY_WFE_NO_EVT_CLEAR) - { - /* Clear all pending event */ - __SEV(); - __WFE(); - } - /* Request Wait For Event */ - __WFE(); - } - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); -} - -/** - * @brief Enters Standby mode. - * @note In Standby mode, all I/O pins are high impedance except for: - * - Reset pad (still available) - * - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC - * Alarm out, or RTC clock calibration out. - * - RTC_AF2 pin (PI8) if configured for tamper or time-stamp. - * - WKUP pin 1 (PA0) if enabled. - * @retval None - */ -void HAL_PWR_EnterSTANDBYMode(void) -{ - /* Select Standby mode */ - SET_BIT(PWR->CR, PWR_CR_PDDS); - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* This option is used to ensure that store operations are completed */ -#if defined ( __CC_ARM) - __force_stores(); -#endif - /* Request Wait For Interrupt */ - __WFI(); -} - -/** - * @brief This function handles the PWR PVD interrupt request. - * @note This API should be called under the PVD_IRQHandler(). - * @retval None - */ -void HAL_PWR_PVD_IRQHandler(void) -{ - /* Check PWR Exti flag */ - if(__HAL_PWR_PVD_EXTI_GET_FLAG() != RESET) - { - /* PWR PVD interrupt user callback */ - HAL_PWR_PVDCallback(); - - /* Clear PWR Exti pending bit */ - __HAL_PWR_PVD_EXTI_CLEAR_FLAG(); - } -} - -/** - * @brief PWR PVD interrupt callback - * @retval None - */ -__weak void HAL_PWR_PVDCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PWR_PVDCallback could be implemented in the user file - */ -} - -/** - * @brief Indicates Sleep-On-Exit when returning from Handler mode to Thread mode. - * @note Set SLEEPONEXIT bit of SCR register. When this bit is set, the processor - * re-enters SLEEP mode when an interruption handling is over. - * Setting this bit is useful when the processor is expected to run only on - * interruptions handling. - * @retval None - */ -void HAL_PWR_EnableSleepOnExit(void) -{ - /* Set SLEEPONEXIT bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Disables Sleep-On-Exit feature when returning from Handler mode to Thread mode. - * @note Clears SLEEPONEXIT bit of SCR register. When this bit is set, the processor - * re-enters SLEEP mode when an interruption handling is over. - * @retval None - */ -void HAL_PWR_DisableSleepOnExit(void) -{ - /* Clear SLEEPONEXIT bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Enables CORTEX M4 SEVONPEND bit. - * @note Sets SEVONPEND bit of SCR register. When this bit is set, this causes - * WFE to wake up when an interrupt moves from inactive to pended. - * @retval None - */ -void HAL_PWR_EnableSEVOnPend(void) -{ - /* Set SEVONPEND bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @brief Disables CORTEX M4 SEVONPEND bit. - * @note Clears SEVONPEND bit of SCR register. When this bit is set, this causes - * WFE to wake up when an interrupt moves from inactive to pended. - * @retval None - */ -void HAL_PWR_DisableSEVOnPend(void) -{ - /* Clear SEVONPEND bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_PWR_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c deleted file mode 100644 index 77f9c35..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c +++ /dev/null @@ -1,600 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr_ex.c - * @author MCD Application Team - * @brief Extended PWR HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of PWR extension peripheral: - * + Peripheral Extended features functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PWREx PWREx - * @brief PWR HAL module driver - * @{ - */ - -#ifdef HAL_PWR_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup PWREx_Private_Constants - * @{ - */ -#define PWR_OVERDRIVE_TIMEOUT_VALUE 1000U -#define PWR_UDERDRIVE_TIMEOUT_VALUE 1000U -#define PWR_BKPREG_TIMEOUT_VALUE 1000U -#define PWR_VOSRDY_TIMEOUT_VALUE 1000U -/** - * @} - */ - - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Functions PWREx Exported Functions - * @{ - */ - -/** @defgroup PWREx_Exported_Functions_Group1 Peripheral Extended features functions - * @brief Peripheral Extended features functions - * -@verbatim - - =============================================================================== - ##### Peripheral extended features functions ##### - =============================================================================== - - *** Main and Backup Regulators configuration *** - ================================================ - [..] - (+) The backup domain includes 4 Kbytes of backup SRAM accessible only from - the CPU, and address in 32-bit, 16-bit or 8-bit mode. Its content is - retained even in Standby or VBAT mode when the low power backup regulator - is enabled. It can be considered as an internal EEPROM when VBAT is - always present. You can use the HAL_PWREx_EnableBkUpReg() function to - enable the low power backup regulator. - - (+) When the backup domain is supplied by VDD (analog switch connected to VDD) - the backup SRAM is powered from VDD which replaces the VBAT power supply to - save battery life. - - (+) The backup SRAM is not mass erased by a tamper event. It is read - protected to prevent confidential data, such as cryptographic private - key, from being accessed. The backup SRAM can be erased only through - the Flash interface when a protection level change from level 1 to - level 0 is requested. - -@- Refer to the description of Read protection (RDP) in the Flash - programming manual. - - (+) The main internal regulator can be configured to have a tradeoff between - performance and power consumption when the device does not operate at - the maximum frequency. This is done through __HAL_PWR_MAINREGULATORMODE_CONFIG() - macro which configure VOS bit in PWR_CR register - - Refer to the product datasheets for more details. - - *** FLASH Power Down configuration **** - ======================================= - [..] - (+) By setting the FPDS bit in the PWR_CR register by using the - HAL_PWREx_EnableFlashPowerDown() function, the Flash memory also enters power - down mode when the device enters Stop mode. When the Flash memory - is in power down mode, an additional startup delay is incurred when - waking up from Stop mode. - - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, the scale can be modified only when the PLL - is OFF and the HSI or HSE clock source is selected as system clock. - The new value programmed is active only when the PLL is ON. - When the PLL is OFF, the voltage scale 3 is automatically selected. - Refer to the datasheets for more details. - - *** Over-Drive and Under-Drive configuration **** - ================================================= - [..] - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Run mode: the main regulator has - 2 operating modes available: - (++) Normal mode: The CPU and core logic operate at maximum frequency at a given - voltage scaling (scale 1, scale 2 or scale 3) - (++) Over-drive mode: This mode allows the CPU and the core logic to operate at a - higher frequency than the normal mode for a given voltage scaling (scale 1, - scale 2 or scale 3). This mode is enabled through HAL_PWREx_EnableOverDrive() function and - disabled by HAL_PWREx_DisableOverDrive() function, to enter or exit from Over-drive mode please follow - the sequence described in Reference manual. - - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Stop mode: the main regulator or low power regulator - supplies a low power voltage to the 1.2V domain, thus preserving the content of registers - and internal SRAM. 2 operating modes are available: - (++) Normal mode: the 1.2V domain is preserved in nominal leakage mode. This mode is only - available when the main regulator or the low power regulator is used in Scale 3 or - low voltage mode. - (++) Under-drive mode: the 1.2V domain is preserved in reduced leakage mode. This mode is only - available when the main regulator or the low power regulator is in low voltage mode. - -@endverbatim - * @{ - */ - -/** - * @brief Enables the Backup Regulator. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void) -{ - uint32_t tickstart = 0U; - - *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)ENABLE; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till Backup regulator ready flag is set */ - while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) == RESET) - { - if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Disables the Backup Regulator. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void) -{ - uint32_t tickstart = 0U; - - *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)DISABLE; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till Backup regulator ready flag is set */ - while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) != RESET) - { - if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Enables the Flash Power Down in Stop mode. - * @retval None - */ -void HAL_PWREx_EnableFlashPowerDown(void) -{ - *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Flash Power Down in Stop mode. - * @retval None - */ -void HAL_PWREx_DisableFlashPowerDown(void) -{ - *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)DISABLE; -} - -/** - * @brief Return Voltage Scaling Range. - * @retval The configured scale for the regulator voltage(VOS bit field). - * The returned value can be one of the following: - * - @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * - @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * - @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode - */ -uint32_t HAL_PWREx_GetVoltageRange(void) -{ - return (PWR->CR & PWR_CR_VOS); -} - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -/** - * @brief Configures the main internal regulator output voltage. - * @param VoltageScaling specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption. - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, - * the maximum value of fHCLK = 168 MHz. - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, - * the maximum value of fHCLK = 144 MHz. - * @note When moving from Range 1 to Range 2, the system frequency must be decreased to - * a value below 144 MHz before calling HAL_PWREx_ConfigVoltageScaling() API. - * When moving from Range 2 to Range 1, the system frequency can be increased to - * a value up to 168 MHz after calling HAL_PWREx_ConfigVoltageScaling() API. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) -{ - uint32_t tickstart = 0U; - - assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); - - /* Enable PWR RCC Clock Peripheral */ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Set Range */ - __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) - { - if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || \ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || \ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || \ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Configures the main internal regulator output voltage. - * @param VoltageScaling specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption. - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, - * the maximum value of fHCLK is 168 MHz. It can be extended to - * 180 MHz by activating the over-drive mode. - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, - * the maximum value of fHCLK is 144 MHz. It can be extended to, - * 168 MHz by activating the over-drive mode. - * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output range 3 mode, - * the maximum value of fHCLK is 120 MHz. - * @note To update the system clock frequency(SYSCLK): - * - Set the HSI or HSE as system clock frequency using the HAL_RCC_ClockConfig(). - * - Call the HAL_RCC_OscConfig() to configure the PLL. - * - Call HAL_PWREx_ConfigVoltageScaling() API to adjust the voltage scale. - * - Set the new system clock frequency using the HAL_RCC_ClockConfig(). - * @note The scale can be modified only when the HSI or HSE clock source is selected - * as system clock source, otherwise the API returns HAL_ERROR. - * @note When the PLL is OFF, the voltage scale 3 is automatically selected and the VOS bits - * value in the PWR_CR1 register are not taken in account. - * @note This API forces the PLL state ON to allow the possibility to configure the voltage scale 1 or 2. - * @note The new voltage scale is active only when the PLL is ON. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) -{ - uint32_t tickstart = 0U; - - assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); - - /* Enable PWR RCC Clock Peripheral */ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - /* Disable the main PLL */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - /* Wait till PLL is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Set Range */ - __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); - - /* Enable the main PLL */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) - { - if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Enables Main Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_EnableMainRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables Main Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xxdevices. - * @retval None - */ -void HAL_PWREx_DisableMainRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)DISABLE; -} - -/** - * @brief Enables Low Power Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_EnableLowRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables Low Power Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_DisableLowRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)DISABLE; -} - -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F412Zx || STM32F412Rx || STM32F412Vx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Activates the Over-Drive mode. - * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * This mode allows the CPU and the core logic to operate at a higher frequency - * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). - * @note It is recommended to enter or exit Over-drive mode when the application is not running - * critical tasks and when the system clock source is either HSI or HSE. - * During the Over-drive switch activation, no peripheral clocks should be enabled. - * The peripheral clocks must be enabled once the Over-drive mode is activated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void) -{ - uint32_t tickstart = 0U; - - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable the Over-drive to extend the clock frequency to 180 Mhz */ - __HAL_PWR_OVERDRIVE_ENABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Enable the Over-drive switch */ - __HAL_PWR_OVERDRIVESWITCHING_ENABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) - { - if((HAL_GetTick() - tickstart ) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Deactivates the Over-Drive mode. - * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * This mode allows the CPU and the core logic to operate at a higher frequency - * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). - * @note It is recommended to enter or exit Over-drive mode when the application is not running - * critical tasks and when the system clock source is either HSI or HSE. - * During the Over-drive switch activation, no peripheral clocks should be enabled. - * The peripheral clocks must be enabled once the Over-drive mode is activated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void) -{ - uint32_t tickstart = 0U; - - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Disable the Over-drive switch */ - __HAL_PWR_OVERDRIVESWITCHING_DISABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Disable the Over-drive */ - __HAL_PWR_OVERDRIVE_DISABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Enters in Under-Drive STOP mode. - * - * @note This mode is only available for STM32F42xxx/STM32F43xxx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * - * @note This mode can be selected only when the Under-Drive is already active - * - * @note This mode is enabled only with STOP low power mode. - * In this mode, the 1.2V domain is preserved in reduced leakage mode. This - * mode is only available when the main regulator or the low power regulator - * is in low voltage mode - * - * @note If the Under-drive mode was enabled, it is automatically disabled after - * exiting Stop mode. - * When the voltage regulator operates in Under-drive mode, an additional - * startup delay is induced when waking up from Stop mode. - * - * @note In Stop mode, all I/O pins keep the same state as in Run mode. - * - * @note When exiting Stop mode by issuing an interrupt or a wake-up event, - * the HSI RC oscillator is selected as system clock. - * - * @note When the voltage regulator operates in low power mode, an additional - * startup delay is incurred when waking up from Stop mode. - * By keeping the internal regulator ON during Stop mode, the consumption - * is higher although the startup time is reduced. - * - * @param Regulator specifies the regulator state in STOP mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_UNDERDRIVE_ON: Main Regulator in under-drive mode - * and Flash memory in power-down when the device is in Stop under-drive mode - * @arg PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON: Low Power Regulator in under-drive mode - * and Flash memory in power-down when the device is in Stop under-drive mode - * @param STOPEntry specifies if STOP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_SLEEPENTRY_WFI: enter STOP mode with WFI instruction - * @arg PWR_SLEEPENTRY_WFE: enter STOP mode with WFE instruction - * @retval None - */ -HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry) -{ - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR_UNDERDRIVE(Regulator)); - assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); - - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Enable the Under-drive Mode ---------------------------------------------*/ - /* Clear Under-drive flag */ - __HAL_PWR_CLEAR_ODRUDR_FLAG(); - - /* Enable the Under-drive */ - __HAL_PWR_UNDERDRIVE_ENABLE(); - - /* Select the regulator state in STOP mode ---------------------------------*/ - tmpreg1 = PWR->CR; - /* Clear PDDS, LPDS, MRLUDS and LPLUDS bits */ - tmpreg1 &= (uint32_t)~(PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_MRUDS); - - /* Set LPDS, MRLUDS and LPLUDS bits according to PWR_Regulator value */ - tmpreg1 |= Regulator; - - /* Store the new value */ - PWR->CR = tmpreg1; - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - - /* Select STOP mode entry --------------------------------------------------*/ - if(STOPEntry == PWR_SLEEPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - /* Request Wait For Event */ - __WFE(); - } - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); - - return HAL_OK; -} - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_PWR_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c deleted file mode 100644 index c04d33a..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c +++ /dev/null @@ -1,1124 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc.c - * @author MCD Application Team - * @brief RCC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Reset and Clock Control (RCC) peripheral: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - @verbatim - ============================================================================== - ##### RCC specific features ##### - ============================================================================== - [..] - After reset the device is running from Internal High Speed oscillator - (HSI 16MHz) with Flash 0 wait state, Flash prefetch buffer, D-Cache - and I-Cache are disabled, and all peripherals are off except internal - SRAM, Flash and JTAG. - (+) There is no prescaler on High speed (AHB) and Low speed (APB) busses; - all peripherals mapped on these busses are running at HSI speed. - (+) The clock for all peripherals is switched off, except the SRAM and FLASH. - (+) All GPIOs are in input floating state, except the JTAG pins which - are assigned to be used for debug purpose. - - [..] - Once the device started from reset, the user application has to: - (+) Configure the clock source to be used to drive the System clock - (if the application needs higher frequency/performance) - (+) Configure the System clock frequency and Flash settings - (+) Configure the AHB and APB busses prescalers - (+) Enable the clock for the peripheral(s) to be used - (+) Configure the clock source(s) for peripherals which clocks are not - derived from the System clock (I2S, RTC, ADC, USB OTG FS/SDIO/RNG) - - ##### RCC Limitations ##### - ============================================================================== - [..] - A delay between an RCC peripheral clock enable and the effective peripheral - enabling should be taken into account in order to manage the peripheral read/write - from/to registers. - (+) This delay depends on the peripheral mapping. - (+) If peripheral is mapped on AHB: the delay is 2 AHB clock cycle - after the clock enable bit is set on the hardware register - (+) If peripheral is mapped on APB: the delay is 2 APB clock cycle - after the clock enable bit is set on the hardware register - - [..] - Implemented Workaround: - (+) For AHB & APB peripherals, a dummy read to the peripheral register has been - inserted in each __HAL_RCC_PPP_CLK_ENABLE() macro. - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup RCC RCC - * @brief RCC HAL module driver - * @{ - */ - -#ifdef HAL_RCC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup RCC_Private_Constants - * @{ - */ - -/* Private macro -------------------------------------------------------------*/ -#define __MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() -#define MCO1_GPIO_PORT GPIOA -#define MCO1_PIN GPIO_PIN_8 - -#define __MCO2_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() -#define MCO2_GPIO_PORT GPIOC -#define MCO2_PIN GPIO_PIN_9 -/** - * @} - */ - -/* Private variables ---------------------------------------------------------*/ -/** @defgroup RCC_Private_Variables RCC Private Variables - * @{ - */ -/** - * @} - */ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup RCC_Exported_Functions RCC Exported Functions - * @{ - */ - -/** @defgroup RCC_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to configure the internal/external oscillators - (HSE, HSI, LSE, LSI, PLL, CSS and MCO) and the System busses clocks (SYSCLK, AHB, APB1 - and APB2). - - [..] Internal/external clock and PLL configuration - (#) HSI (high-speed internal), 16 MHz factory-trimmed RC used directly or through - the PLL as System clock source. - - (#) LSI (low-speed internal), 32 KHz low consumption RC used as IWDG and/or RTC - clock source. - - (#) HSE (high-speed external), 4 to 26 MHz crystal oscillator used directly or - through the PLL as System clock source. Can be used also as RTC clock source. - - (#) LSE (low-speed external), 32 KHz oscillator used as RTC clock source. - - (#) PLL (clocked by HSI or HSE), featuring two different output clocks: - (++) The first output is used to generate the high speed system clock (up to 168 MHz) - (++) The second output is used to generate the clock for the USB OTG FS (48 MHz), - the random analog generator (<=48 MHz) and the SDIO (<= 48 MHz). - - (#) CSS (Clock security system), once enable using the macro __HAL_RCC_CSS_ENABLE() - and if a HSE clock failure occurs(HSE used directly or through PLL as System - clock source), the System clocks automatically switched to HSI and an interrupt - is generated if enabled. The interrupt is linked to the Cortex-M4 NMI - (Non-Maskable Interrupt) exception vector. - - (#) MCO1 (microcontroller clock output), used to output HSI, LSE, HSE or PLL - clock (through a configurable prescaler) on PA8 pin. - - (#) MCO2 (microcontroller clock output), used to output HSE, PLL, SYSCLK or PLLI2S - clock (through a configurable prescaler) on PC9 pin. - - [..] System, AHB and APB busses clocks configuration - (#) Several clock sources can be used to drive the System clock (SYSCLK): HSI, - HSE and PLL. - The AHB clock (HCLK) is derived from System clock through configurable - prescaler and used to clock the CPU, memory and peripherals mapped - on AHB bus (DMA, GPIO...). APB1 (PCLK1) and APB2 (PCLK2) clocks are derived - from AHB clock through configurable prescalers and used to clock - the peripherals mapped on these busses. You can use - "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks. - - (#) For the STM32F405xx/07xx and STM32F415xx/17xx devices, the maximum - frequency of the SYSCLK and HCLK is 168 MHz, PCLK2 84 MHz and PCLK1 42 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F42xxx, STM32F43xxx, STM32F446xx, STM32F469xx and STM32F479xx devices, - the maximum frequency of the SYSCLK and HCLK is 180 MHz, PCLK2 90 MHz and PCLK1 45 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F401xx, the maximum frequency of the SYSCLK and HCLK is 84 MHz, - PCLK2 84 MHz and PCLK1 42 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F41xxx, the maximum frequency of the SYSCLK and HCLK is 100 MHz, - PCLK2 100 MHz and PCLK1 50 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - -@endverbatim - * @{ - */ - -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * - HSI ON and used as system clock source - * - HSE and PLL OFF - * - AHB, APB1 and APB2 prescaler set to 1. - * - CSS, MCO1 and MCO2 OFF - * - All interrupts disabled - * @note This function doesn't modify the configuration of the - * - Peripheral clocks - * - LSI, LSE and RTC clocks - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_RCC_DeInit(void) -{ - return HAL_OK; -} - -/** - * @brief Initializes the RCC Oscillators according to the specified parameters in the - * RCC_OscInitTypeDef. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC Oscillators. - * @note The PLL is not disabled when used as system clock. - * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not - * supported by this API. User should request a transition to LSE Off - * first and then LSE On or LSE Bypass. - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not - * supported by this API. User should request a transition to HSE Off - * first and then HSE On or HSE Bypass. - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - uint32_t tickstart; - uint32_t pll_config; - /* Check Null pointer */ - if (RCC_OscInitStruct == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); - /*------------------------------- HSE Configuration ------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) - { - /* Check the parameters */ - assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); - /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) - { - if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) - { - return HAL_ERROR; - } - } - else - { - /* Set the new HSE configuration ---------------------------------------*/ - __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); - - /* Check the HSE State */ - if ((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till HSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till HSE is bypassed or disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*----------------------------- HSI Configuration --------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) - { - /* Check the parameters */ - assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); - assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); - - /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) - { - /* When HSI is used as system clock it will not disabled */ - if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) - { - return HAL_ERROR; - } - /* Otherwise, just the calibration is allowed */ - else - { - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - } - else - { - /* Check the HSI State */ - if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) - { - /* Enable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Adjusts the Internal High Speed oscillator (HSI) calibration value. */ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - else - { - /* Disable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*------------------------------ LSI Configuration -------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) - { - /* Check the parameters */ - assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); - - /* Check the LSI State */ - if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) - { - /* Enable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - /*------------------------------ LSE Configuration -------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) - { - FlagStatus pwrclkchanged = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); - - /* Update LSE configuration in Backup Domain control register */ - /* Requires to enable write access to Backup Domain of necessary */ - if (__HAL_RCC_PWR_IS_CLK_DISABLED()) - { - __HAL_RCC_PWR_CLK_ENABLE(); - pwrclkchanged = SET; - } - - if (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - /* Enable write access to Backup domain */ - SET_BIT(PWR->CR, PWR_CR_DBP); - - /* Wait for Backup domain Write protection disable */ - tickstart = HAL_GetTick(); - - while (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Set the new LSE configuration -----------------------------------------*/ - __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); - /* Check the LSE State */ - if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Restore clock configuration if changed */ - if (pwrclkchanged == SET) - { - __HAL_RCC_PWR_CLK_DISABLE(); - } - } - /*-------------------------------- PLL Configuration -----------------------*/ - /* Check the parameters */ - assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); - if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) - { - /* Check if the PLL is used as system clock or not */ - if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) - { - /* Check the parameters */ - assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); - assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); - assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); - assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); - assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); - - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Configure the main PLL clock source, multiplication and division factors. */ - WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ - RCC_OscInitStruct->PLL.PLLM | \ - (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ - (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ - (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))); - /* Enable the main PLL. */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - else - { - /* Check if there is a request to disable the PLL used as System clock source */ - if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) - { - return HAL_ERROR; - } - else - { - /* Do not return HAL_ERROR if request repeats the current configuration */ - pll_config = RCC->PLLCFGR; -#if defined (RCC_PLLCFGR_PLLR) - if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) -#else - if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) -#endif /* RCC_PLLCFGR_PLLR */ - { - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief Initializes the CPU, AHB and APB busses clocks according to the specified - * parameters in the RCC_ClkInitStruct. - * @param RCC_ClkInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC peripheral. - * @param FLatency FLASH Latency, this parameter depend on device selected - * - * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency - * and updated by HAL_RCC_GetHCLKFreq() function called within this function - * - * @note The HSI is used (enabled by hardware) as system clock source after - * startup from Reset, wake-up from STOP and STANDBY mode, or in case - * of failure of the HSE used directly or indirectly as system clock - * (if the Clock Security System CSS is enabled). - * - * @note A switch from one clock source to another occurs only if the target - * clock source is ready (clock stable after startup delay or PLL locked). - * If a clock source which is not yet ready is selected, the switch will - * occur when the clock source will be ready. - * - * @note Depending on the device voltage range, the software has to set correctly - * HPRE[3:0] bits to ensure that HCLK not exceed the maximum allowed frequency - * (for more details refer to section above "Initialization/de-initialization functions") - * @retval None - */ -HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency) -{ - uint32_t tickstart; - - /* Check Null pointer */ - if (RCC_ClkInitStruct == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType)); - assert_param(IS_FLASH_LATENCY(FLatency)); - - /* To correctly read data from FLASH memory, the number of wait states (LATENCY) - must be correctly programmed according to the frequency of the CPU clock - (HCLK) and the supply voltage of the device. */ - - /* Increasing the number of wait states because of higher CPU frequency */ - if (FLatency > __HAL_FLASH_GET_LATENCY()) - { - /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ - __HAL_FLASH_SET_LATENCY(FLatency); - - /* Check that the new number of wait states is taken into account to access the Flash - memory by reading the FLASH_ACR register */ - if (__HAL_FLASH_GET_LATENCY() != FLatency) - { - return HAL_ERROR; - } - } - - /*-------------------------- HCLK Configuration --------------------------*/ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) - { - /* Set the highest APBx dividers in order to ensure that we do not go through - a non-spec phase whatever we decrease or increase HCLK. */ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) - { - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); - } - - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) - { - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); - } - - assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); - } - - /*------------------------- SYSCLK Configuration ---------------------------*/ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) - { - assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); - - /* HSE is selected as System Clock Source */ - if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) - { - /* Check the HSE ready flag */ - if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - return HAL_ERROR; - } - } - /* PLL is selected as System Clock Source */ - else if ((RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) || - (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLRCLK)) - { - /* Check the PLL ready flag */ - if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - return HAL_ERROR; - } - } - /* HSI is selected as System Clock Source */ - else - { - /* Check the HSI ready flag */ - if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - return HAL_ERROR; - } - } - - __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) - { - if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Decreasing the number of wait states because of lower CPU frequency */ - if (FLatency < __HAL_FLASH_GET_LATENCY()) - { - /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ - __HAL_FLASH_SET_LATENCY(FLatency); - - /* Check that the new number of wait states is taken into account to access the Flash - memory by reading the FLASH_ACR register */ - if (__HAL_FLASH_GET_LATENCY() != FLatency) - { - return HAL_ERROR; - } - } - - /*-------------------------- PCLK1 Configuration ---------------------------*/ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) - { - assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); - } - - /*-------------------------- PCLK2 Configuration ---------------------------*/ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) - { - assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U)); - } - - /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]; - - /* Configure the source of time base considering new system clocks settings */ - HAL_InitTick(uwTickPrio); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup RCC_Exported_Functions_Group2 Peripheral Control functions - * @brief RCC clocks control functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the RCC Clocks - frequencies. - -@endverbatim - * @{ - */ - -/** - * @brief Selects the clock source to output on MCO1 pin(PA8) or on MCO2 pin(PC9). - * @note PA8/PC9 should be configured in alternate function mode. - * @param RCC_MCOx specifies the output direction for the clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO1: Clock source to output on MCO1 pin(PA8). - * @arg RCC_MCO2: Clock source to output on MCO2 pin(PC9). - * @param RCC_MCOSource specifies the clock source to output. - * This parameter can be one of the following values: - * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source - * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx - * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices - * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source - * @param RCC_MCODiv specifies the MCOx prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - * @note For STM32F410Rx devices to output I2SCLK clock on MCO2 you should have - * at last one of the SPI clocks enabled (SPI1, SPI2 or SPI5). - * @retval None - */ -void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv) -{ - GPIO_InitTypeDef GPIO_InitStruct; - /* Check the parameters */ - assert_param(IS_RCC_MCO(RCC_MCOx)); - assert_param(IS_RCC_MCODIV(RCC_MCODiv)); - /* RCC_MCO1 */ - if (RCC_MCOx == RCC_MCO1) - { - assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); - - /* MCO1 Clock Enable */ - __MCO1_CLK_ENABLE(); - - /* Configure the MCO1 pin in alternate function mode */ - GPIO_InitStruct.Pin = MCO1_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Alternate = GPIO_AF0_MCO; - HAL_GPIO_Init(MCO1_GPIO_PORT, &GPIO_InitStruct); - - /* Mask MCO1 and MCO1PRE[2:0] bits then Select MCO1 clock source and prescaler */ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), (RCC_MCOSource | RCC_MCODiv)); - - /* This RCC MCO1 enable feature is available only on STM32F410xx devices */ -#if defined(RCC_CFGR_MCO1EN) - __HAL_RCC_MCO1_ENABLE(); -#endif /* RCC_CFGR_MCO1EN */ - } -#if defined(RCC_CFGR_MCO2) - else - { - assert_param(IS_RCC_MCO2SOURCE(RCC_MCOSource)); - - /* MCO2 Clock Enable */ - __MCO2_CLK_ENABLE(); - - /* Configure the MCO2 pin in alternate function mode */ - GPIO_InitStruct.Pin = MCO2_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Alternate = GPIO_AF0_MCO; - HAL_GPIO_Init(MCO2_GPIO_PORT, &GPIO_InitStruct); - - /* Mask MCO2 and MCO2PRE[2:0] bits then Select MCO2 clock source and prescaler */ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), (RCC_MCOSource | (RCC_MCODiv << 3U))); - - /* This RCC MCO2 enable feature is available only on STM32F410Rx devices */ -#if defined(RCC_CFGR_MCO2EN) - __HAL_RCC_MCO2_ENABLE(); -#endif /* RCC_CFGR_MCO2EN */ - } -#endif /* RCC_CFGR_MCO2 */ -} - -/** - * @brief Enables the Clock Security System. - * @note If a failure is detected on the HSE oscillator clock, this oscillator - * is automatically disabled and an interrupt is generated to inform the - * software about the failure (Clock Security System Interrupt, CSSI), - * allowing the MCU to perform rescue operations. The CSSI is linked to - * the Cortex-M4 NMI (Non-Maskable Interrupt) exception vector. - * @retval None - */ -void HAL_RCC_EnableCSS(void) -{ - *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Clock Security System. - * @retval None - */ -void HAL_RCC_DisableCSS(void) -{ - *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)DISABLE; -} - -/** - * @brief Returns the SYSCLK frequency - * - * @note The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) - * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) - * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * @note The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @note This function can be used by the user application to compute the - * baudrate for the communication peripherals or configure other parameters. - * - * @note Each time SYSCLK changes, this function must be called to update the - * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * - * @retval SYSCLK frequency - */ -__weak uint32_t HAL_RCC_GetSysClockFreq(void) -{ - uint32_t pllm = 0U; - uint32_t pllvco = 0U; - uint32_t pllp = 0U; - uint32_t sysclockfreq = 0U; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) - { - case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ - { - sysclockfreq = HSI_VALUE; - break; - } - case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ - { - sysclockfreq = HSE_VALUE; - break; - } - case RCC_CFGR_SWS_PLL: /* PLL used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLP */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) * 2U); - - sysclockfreq = pllvco / pllp; - break; - } - default: - { - sysclockfreq = HSI_VALUE; - break; - } - } - return sysclockfreq; -} - -/** - * @brief Returns the HCLK frequency - * @note Each time HCLK changes, this function must be called to update the - * right HCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency - * and updated within this function - * @retval HCLK frequency - */ -uint32_t HAL_RCC_GetHCLKFreq(void) -{ - return SystemCoreClock; -} - -/** - * @brief Returns the PCLK1 frequency - * @note Each time PCLK1 changes, this function must be called to update the - * right PCLK1 value. Otherwise, any configuration based on this function will be incorrect. - * @retval PCLK1 frequency - */ -uint32_t HAL_RCC_GetPCLK1Freq(void) -{ - /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]); -} - -/** - * @brief Returns the PCLK2 frequency - * @note Each time PCLK2 changes, this function must be called to update the - * right PCLK2 value. Otherwise, any configuration based on this function will be incorrect. - * @retval PCLK2 frequency - */ -uint32_t HAL_RCC_GetPCLK2Freq(void) -{ - /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]); -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * will be configured. - * @retval None - */ -__weak void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - /* Set all possible values for the Oscillator type parameter ---------------*/ - RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; - - /* Get the HSE configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) - { - RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; - } - else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) - { - RCC_OscInitStruct->HSEState = RCC_HSE_ON; - } - else - { - RCC_OscInitStruct->HSEState = RCC_HSE_OFF; - } - - /* Get the HSI configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) - { - RCC_OscInitStruct->HSIState = RCC_HSI_ON; - } - else - { - RCC_OscInitStruct->HSIState = RCC_HSI_OFF; - } - - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); - - /* Get the LSE configuration -----------------------------------------------*/ - if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) - { - RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; - } - else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) - { - RCC_OscInitStruct->LSEState = RCC_LSE_ON; - } - else - { - RCC_OscInitStruct->LSEState = RCC_LSE_OFF; - } - - /* Get the LSI configuration -----------------------------------------------*/ - if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) - { - RCC_OscInitStruct->LSIState = RCC_LSI_ON; - } - else - { - RCC_OscInitStruct->LSIState = RCC_LSI_OFF; - } - - /* Get the PLL configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; - } - else - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; - } - RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); - RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); - RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); - RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); -} - -/** - * @brief Configures the RCC_ClkInitStruct according to the internal - * RCC configuration registers. - * @param RCC_ClkInitStruct pointer to an RCC_ClkInitTypeDef structure that - * will be configured. - * @param pFLatency Pointer on the Flash Latency. - * @retval None - */ -void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency) -{ - /* Set all possible values for the Clock type parameter --------------------*/ - RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - - /* Get the SYSCLK configuration --------------------------------------------*/ - RCC_ClkInitStruct->SYSCLKSource = (uint32_t)(RCC->CFGR & RCC_CFGR_SW); - - /* Get the HCLK configuration ----------------------------------------------*/ - RCC_ClkInitStruct->AHBCLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_HPRE); - - /* Get the APB1 configuration ----------------------------------------------*/ - RCC_ClkInitStruct->APB1CLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_PPRE1); - - /* Get the APB2 configuration ----------------------------------------------*/ - RCC_ClkInitStruct->APB2CLKDivider = (uint32_t)((RCC->CFGR & RCC_CFGR_PPRE2) >> 3U); - - /* Get the Flash Wait State (Latency) configuration ------------------------*/ - *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY); -} - -/** - * @brief This function handles the RCC CSS interrupt request. - * @note This API should be called under the NMI_Handler(). - * @retval None - */ -void HAL_RCC_NMI_IRQHandler(void) -{ - /* Check RCC CSSF flag */ - if (__HAL_RCC_GET_IT(RCC_IT_CSS)) - { - /* RCC Clock Security System interrupt user callback */ - HAL_RCC_CSSCallback(); - - /* Clear RCC CSS pending bit */ - __HAL_RCC_CLEAR_IT(RCC_IT_CSS); - } -} - -/** - * @brief RCC Clock Security System interrupt callback - * @retval None - */ -__weak void HAL_RCC_CSSCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_RCC_CSSCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_RCC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c deleted file mode 100644 index 7b3b20b..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c +++ /dev/null @@ -1,3833 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc_ex.c - * @author MCD Application Team - * @brief Extension RCC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities RCC extension peripheral: - * + Extended Peripheral Control functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup RCCEx RCCEx - * @brief RCCEx HAL module driver - * @{ - */ - -#ifdef HAL_RCC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup RCCEx_Private_Constants - * @{ - */ -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions - * @{ - */ - -/** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions - * @brief Extended Peripheral Control functions - * -@verbatim - =============================================================================== - ##### Extended Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the RCC Clocks - frequencies. - [..] - (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to - select the RTC clock source; in this case the Backup domain will be reset in - order to modify the RTC Clock source, as consequence RTC registers (including - the backup registers) and RCC_BDCR register are set to their reset values. - -@endverbatim - * @{ - */ - -#if defined(STM32F446xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - uint32_t plli2sp = 0U; - uint32_t plli2sq = 0U; - uint32_t plli2sr = 0U; - uint32_t pllsaip = 0U; - uint32_t pllsaiq = 0U; - uint32_t plli2sused = 0U; - uint32_t pllsaiused = 0U; - - /* Check the peripheral clock selection parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*------------------------ I2S APB1 configuration --------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- I2S APB2 configuration ----------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*--------------------------- SAI1 configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == (RCC_PERIPHCLK_SAI1)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*-------------------------- SAI2 configuration ----------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == (RCC_PERIPHCLK_SAI2)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection)); - - /* Configure SAI2 Clock source */ - __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection); - - /* Enable the PLLI2S when it's used as clock source for SAI */ - if (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- RTC configuration --------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - /* Configure Timer Prescaler */ - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- FMPI2C1 Configuration -----------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ CEC Configuration -------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC) - { - /* Check the parameters */ - assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection)); - - /* Configure the CEC clock source */ - __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- CLK48 Configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the CLK48 clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - - /* Enable the PLLSAI when it's used as clock source for CLK48 */ - if (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- SDIO Configuration -------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ SPDIFRX Configuration ---------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) - { - /* Check the parameters */ - assert_param(IS_RCC_SPDIFRXCLKSOURCE(PeriphClkInit->SpdifClockSelection)); - - /* Configure the SPDIFRX clock source */ - __HAL_RCC_SPDIFRX_CONFIG(PeriphClkInit->SpdifClockSelection); - /* Enable the PLLI2S when it's used as clock source for SPDIFRX */ - if (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- PLLI2S Configuration ------------------------*/ - /* PLLI2S is configured when a peripheral will use it as source clock : SAI1, SAI2, I2S on APB1, - I2S on APB2 or SPDIFRX */ - if ((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) - { - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* check for common PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /*------ In Case of PLLI2S is selected as source clock for I2S -----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) - && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S))) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Read PLLI2SP/PLLI2SQ value from PLLI2SCFGR register (this value is not needed for I2S configuration) */ - plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sp, plli2sq, - PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) - && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S))) - { - /* Check for PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - /* Check for PLLI2S/DIVQ parameters */ - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SP/PLLI2SR value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ - plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sp, - PeriphClkInit->PLLI2S.PLLI2SQ, plli2sr); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*------ In Case of PLLI2S is selected as source clock for SPDIFRX -------*/ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) - && (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - plli2sq = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SP, - plli2sq, plli2sr); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SP, - PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- PLLSAI Configuration -----------------------*/ - /* PLLSAI is configured when a peripheral will use it as source clock : SAI1, SAI2, CLK48 or SDIO */ - if (pllsaiused == 1U) - { - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIM_VALUE(PeriphClkInit->PLLSAI.PLLSAIM)); - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /*------ In Case of PLLSAI is selected as source clock for SAI -----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) - && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI))) - { - /* check for PLLSAIQ Parameter */ - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - /* check for PLLSAI/DIVQ Parameter */ - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, - PeriphClkInit->PLLSAI.PLLSAIQ, 0U); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*------ In Case of PLLSAI is selected as source clock for CLK48 ---------*/ - /* In Case of PLLI2S is selected as source clock for CLK48 */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); - /* Read PLLSAIQ value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Configure the PLLSAI division factors */ - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLI2SN/PLLSAIM) */ - /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIP, - pllsaiq, 0U); - } - - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - return HAL_OK; -} - -/** - * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 | \ - RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 | \ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ - RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_FMPI2C1 | \ - RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO | \ - RCC_PERIPHCLK_SPDIFRX; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SP = (uint32_t)((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Get the PLLSAI Clock configuration --------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIM = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM) >> RCC_PLLSAICFGR_PLLSAIM_Pos); - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIP = (uint32_t)((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - - /* Get the SAI1 clock configuration ----------------------------------------*/ - PeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE(); - - /* Get the SAI2 clock configuration ----------------------------------------*/ - PeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE(); - - /* Get the I2S APB1 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); - - /* Get the I2S APB2 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); - - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the CEC clock configuration -----------------------------------------*/ - PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); - - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the CLK48 clock configuration ----------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - /* Get the SPDIFRX clock configuration -------------------------------------*/ - PeriphClkInit->SpdifClockSelection = __HAL_RCC_GET_SPDIFRX_SOURCE(); - - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_SAI1: SAI1 peripheral clock - * @arg RCC_PERIPHCLK_SAI2: SAI2 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - uint32_t tmpreg1 = 0U; - /* This variable used to store the SAI clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - /* This variable used to store the SAI clock source */ - uint32_t saiclocksource = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_SAI1: - case RCC_PERIPHCLK_SAI2: - { - saiclocksource = RCC->DCKCFGR; - saiclocksource &= (RCC_DCKCFGR_SAI1SRC | RCC_DCKCFGR_SAI2SRC); - switch (saiclocksource) - { - case 0U: /* PLLSAI is the clock source for SAI*/ - { - /* Configure the PLLSAI division factor */ - /* PLLSAI_VCO Input = PLL_SOURCE/PLLSAIM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM))); - } - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - tmpreg1 = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U; - frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U)) / (tmpreg1); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - tmpreg1 = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U); - frequency = frequency / (tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC_0: /* PLLI2S is the clock source for SAI*/ - case RCC_DCKCFGR_SAI2SRC_0: /* PLLI2S is the clock source for SAI*/ - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM))); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - tmpreg1 = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U; - frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U)) / (tmpreg1); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - tmpreg1 = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U); - frequency = frequency / (tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC_1: /* PLLR is the clock source for SAI*/ - case RCC_DCKCFGR_SAI2SRC_1: /* PLLR is the clock source for SAI*/ - { - /* Configure the PLLI2S division factor */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - /* SAI_CLK_x = PLL_VCO Output/PLLR */ - tmpreg1 = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U; - frequency = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U)) / (tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC: /* External clock is the clock source for SAI*/ - { - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - case RCC_DCKCFGR_SAI2SRC: /* PLLSRC(HSE or HSI) is the clock source for SAI*/ - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - frequency = (uint32_t)(HSI_VALUE); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - frequency = (uint32_t)(HSE_VALUE); - } - break; - } - default : - { - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB1: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB1CLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB2: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB2CLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC, RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - uint32_t pllsaip = 0U; - uint32_t pllsaiq = 0U; - uint32_t pllsair = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*--------------------------- CLK48 Configuration --------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the CLK48 clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ SDIO Configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ - /*------------------- Common configuration SAI/I2S -------------------------*/ - /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division - factor is common parameters for both peripherals */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------- I2S configuration -------------------------------*/ - /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added - only for I2S configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must - be added only for SAI configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) - { - /* Check the PLLI2S division factors */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Configure the PLLI2S multiplication and division factors */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, - PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ - /*----------------------- Common configuration SAI/LTDC --------------------*/ - /* In Case of SAI, LTDC or CLK48 Clock Configuration through PLLSAI, PLLSAIN division - factor is common parameters for these peripherals */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && - (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP))) - { - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must - be added only for SAI configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) - { - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, pllsair); - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*---------------------------- LTDC configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) - { - assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); - assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, pllsaiq, PeriphClkInit->PLLSAI.PLLSAIR); - /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); - } - - /*---------------------------- CLK48 configuration ------------------------*/ - /* Configure the PLLSAI when it is used as clock source for CLK48 */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == (RCC_PERIPHCLK_CLK48)) && - (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) - { - assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); - - /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* CLK48_CLK(first level) = PLLSAI_VCO Output/PLLSAIP */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, pllsair); - } - - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - - /*--------------------------------------------------------------------------*/ - - /*---------------------------- RTC configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - return HAL_OK; -} - -/** - * @brief Configures the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI | \ - RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC | \ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ - RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Get the PLLSAI Clock configuration --------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the CLK48 clock configuration -------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t plli2sq = 0U; -#endif /* STM32F413xx || STM32F423xx */ - uint32_t plli2sused = 0U; - - /* Check the peripheral clock selection parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*----------------------------------- I2S APB1 configuration ---------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------------- I2S APB2 configuration ---------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*----------------------- SAI1 Block A configuration -----------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == (RCC_PERIPHCLK_SAIA)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAIACLKSOURCE(PeriphClkInit->SaiAClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(PeriphClkInit->SaiAClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLR) - { - /* Check for PLL/DIVR parameters */ - assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ - __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------- SAI1 Block B configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == (RCC_PERIPHCLK_SAIB)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAIBCLKSOURCE(PeriphClkInit->SaiBClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(PeriphClkInit->SaiBClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLR) - { - /* Check for PLL/DIVR parameters */ - assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ - __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); - } - } - /*--------------------------------------------------------------------------*/ -#endif /* STM32F413xx || STM32F423xx */ - - /*------------------------------------ RTC configuration -------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------ TIM configuration -------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - /* Configure Timer Prescaler */ - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- FMPI2C1 Configuration --------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- CLK48 Configuration ----------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - - /* Enable the PLLI2S when it's used as clock source for CLK48 */ - if (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- SDIO Configuration -----------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------------------------- PLLI2S Configuration --------------*/ - /* PLLI2S is configured when a peripheral will use it as source clock : I2S on APB1 or - I2S on APB2*/ - if ((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) - { - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* check for common PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SCLKSOURCE(PeriphClkInit->PLLI2SSelection)); - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - /*-------------------- Set the PLL I2S clock -----------------------------*/ - __HAL_RCC_PLL_I2S_CONFIG(PeriphClkInit->PLLI2SSelection); - - /*------- In Case of PLLI2S is selected as source clock for I2S ----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) - && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) && (PeriphClkInit->SdioClockSelection == RCC_SDIOCLKSOURCE_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ))) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, - PeriphClkInit->PLLI2S.PLLI2SR); - } - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == RCC_PERIPHCLK_SAIA) - && (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == RCC_PERIPHCLK_SAIB) && (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR))) - { - /* Check for PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Check for PLLI2S/DIVR parameters */ - assert_param(IS_RCC_PLLI2S_DIVR_VALUE(PeriphClkInit->PLLI2SDivR)); - - /* Read PLLI2SQ value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ - plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sq, - PeriphClkInit->PLLI2S.PLLI2SR); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVR */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLI2SDivR); - } -#endif /* STM32F413xx || STM32F423xx */ - - /*----------------- In Case of PLLI2S is just selected ------------------*/ - if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, - PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM1 clock source configuration -------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection)); - - /* Configure the DFSDM1 interface clock source */ - __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM1 Audio clock source configuration -------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1_AUDIO) == RCC_PERIPHCLK_DFSDM1_AUDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM1AUDIOCLKSOURCE(PeriphClkInit->Dfsdm1AudioClockSelection)); - - /* Configure the DFSDM1 Audio interface clock source */ - __HAL_RCC_DFSDM1AUDIO_CONFIG(PeriphClkInit->Dfsdm1AudioClockSelection); - } - /*--------------------------------------------------------------------------*/ - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*-------------------- DFSDM2 clock source configuration -------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2) == RCC_PERIPHCLK_DFSDM2) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM2CLKSOURCE(PeriphClkInit->Dfsdm2ClockSelection)); - - /* Configure the DFSDM1 interface clock source */ - __HAL_RCC_DFSDM2_CONFIG(PeriphClkInit->Dfsdm2ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM2 Audio clock source configuration -------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2_AUDIO) == RCC_PERIPHCLK_DFSDM2_AUDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM2AUDIOCLKSOURCE(PeriphClkInit->Dfsdm2AudioClockSelection)); - - /* Configure the DFSDM1 Audio interface clock source */ - __HAL_RCC_DFSDM2AUDIO_CONFIG(PeriphClkInit->Dfsdm2AudioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- LPTIM1 Configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) - { - /* Check the parameters */ - assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); - - /* Configure the LPTIM1 clock source */ - __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); - } - /*--------------------------------------------------------------------------*/ -#endif /* STM32F413xx || STM32F423xx */ - - return HAL_OK; -} - -/** - * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 | \ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ - RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 | \ - RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 | \ - RCC_PERIPHCLK_DFSDM1_AUDIO | RCC_PERIPHCLK_DFSDM2 | \ - RCC_PERIPHCLK_DFSDM2_AUDIO | RCC_PERIPHCLK_LPTIM1 | \ - RCC_PERIPHCLK_SAIA | RCC_PERIPHCLK_SAIB; -#else /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 | \ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ - RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 | \ - RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 | \ - RCC_PERIPHCLK_DFSDM1_AUDIO; -#endif /* STM32F413xx || STM32F423xx */ - - - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); -#if defined(STM32F413xx) || defined(STM32F423xx) - /* Get the PLL/PLLI2S division factors -------------------------------------*/ - PeriphClkInit->PLLI2SDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVR) >> RCC_DCKCFGR_PLLI2SDIVR_Pos); - PeriphClkInit->PLLDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLDIVR) >> RCC_DCKCFGR_PLLDIVR_Pos); -#endif /* STM32F413xx || STM32F423xx */ - - /* Get the I2S APB1 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); - - /* Get the I2S APB2 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); - - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the CLK48 clock configuration ---------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - /* Get the DFSDM1 clock configuration --------------------------------------*/ - PeriphClkInit->Dfsdm1ClockSelection = __HAL_RCC_GET_DFSDM1_SOURCE(); - - /* Get the DFSDM1 Audio clock configuration --------------------------------*/ - PeriphClkInit->Dfsdm1AudioClockSelection = __HAL_RCC_GET_DFSDM1AUDIO_SOURCE(); - -#if defined(STM32F413xx) || defined(STM32F423xx) - /* Get the DFSDM2 clock configuration --------------------------------------*/ - PeriphClkInit->Dfsdm2ClockSelection = __HAL_RCC_GET_DFSDM2_SOURCE(); - - /* Get the DFSDM2 Audio clock configuration --------------------------------*/ - PeriphClkInit->Dfsdm2AudioClockSelection = __HAL_RCC_GET_DFSDM2AUDIO_SOURCE(); - - /* Get the LPTIM1 clock configuration --------------------------------------*/ - PeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE(); - - /* Get the SAI1 Block Aclock configuration ---------------------------------*/ - PeriphClkInit->SaiAClockSelection = __HAL_RCC_GET_SAI_BLOCKA_SOURCE(); - - /* Get the SAI1 Block B clock configuration --------------------------------*/ - PeriphClkInit->SaiBClockSelection = __HAL_RCC_GET_SAI_BLOCKB_SOURCE(); -#endif /* STM32F413xx || STM32F423xx */ - - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(I2S..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S_APB1: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLI2S: - { - if ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - } - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB1CLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB2: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLI2S: - { - if ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - } - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB2CLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the - * RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). - * - * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case - * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup - * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*---------------------------- RTC configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- FMPI2C1 Configuration -----------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- LPTIM1 Configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) - { - /* Check the parameters */ - assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); - - /* Configure the LPTIM1 clock source */ - __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); - } - - /*---------------------------- I2S Configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPBCLKSOURCE(PeriphClkInit->I2SClockSelection)); - - /* Configure the I2S clock source */ - __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2SClockSelection); - } - - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; - - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the I2S clock configuration -----------------------------------------*/ - PeriphClkInit->I2SClockSelection = __HAL_RCC_GET_I2S_SOURCE(); - - -} -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPBCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPBCLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPBCLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ - /*----------------------- Common configuration SAI/I2S ---------------------*/ - /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division - factor is common parameters for both peripherals */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- I2S configuration -------------------------*/ - /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added - only for I2S configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must - be added only for SAI configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) - { - /* Check the PLLI2S division factors */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Configure the PLLI2S multiplication and division factors */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, - PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ - /*----------------------- Common configuration SAI/LTDC --------------------*/ - /* In Case of SAI or LTDC Clock Configuration through PLLSAI, PLLSAIN division - factor is common parameters for both peripherals */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC)) - { - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must - be added only for SAI configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) - { - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIQ, tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*---------------------------- LTDC configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) - { - assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); - assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); - - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, tmpreg1, PeriphClkInit->PLLSAI.PLLSAIR); - /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); - } - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- RTC configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - return HAL_OK; -} - -/** - * @brief Configures the PeriphClkInit according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI | RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; - - /* Get the PLLI2S Clock configuration -----------------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Get the PLLSAI Clock configuration -----------------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors -----------------------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); - /* Get the RTC Clock configuration -----------------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the - * RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). - * - * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case - * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup - * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*---------------------------- I2S configuration ---------------------------*/ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); -#if defined(STM32F411xE) - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); -#endif /* STM32F411xE */ - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - -#if defined(STM32F411xE) - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, - PeriphClkInit->PLLI2S.PLLI2SR); -#else - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); -#endif /* STM32F411xE */ - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - - /*---------------------------- RTC configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_RTC; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); -#if defined(STM32F411xE) - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM); -#endif /* STM32F411xE */ - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { -#if defined(STM32F411xE) - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } -#else - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } -#endif /* STM32F411xE */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Select LSE mode - * - * @note This mode is only available for STM32F410xx/STM32F411xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. - * - * @param Mode specifies the LSE mode. - * This parameter can be one of the following values: - * @arg RCC_LSE_LOWPOWER_MODE: LSE oscillator in low power mode selection - * @arg RCC_LSE_HIGHDRIVE_MODE: LSE oscillator in High Drive mode selection - * @retval None - */ -void HAL_RCCEx_SelectLSEMode(uint8_t Mode) -{ - /* Check the parameters */ - assert_param(IS_RCC_LSE_MODE(Mode)); - if (Mode == RCC_LSE_HIGHDRIVE_MODE) - { - SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); - } - else - { - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); - } -} - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/** @defgroup RCCEx_Exported_Functions_Group2 Extended Clock management functions - * @brief Extended Clock management functions - * -@verbatim - =============================================================================== - ##### Extended clock management functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the - activation or deactivation of PLLI2S, PLLSAI. -@endverbatim - * @{ - */ - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Enable PLLI2S. - * @param PLLI2SInit pointer to an RCC_PLLI2SInitTypeDef structure that - * contains the configuration information for the PLLI2S - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit) -{ - uint32_t tickstart; - - /* Check for parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PLLI2SInit->PLLI2SN)); - assert_param(IS_RCC_PLLI2SR_VALUE(PLLI2SInit->PLLI2SR)); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - assert_param(IS_RCC_PLLI2SM_VALUE(PLLI2SInit->PLLI2SM)); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ -#if defined(RCC_PLLI2SCFGR_PLLI2SP) - assert_param(IS_RCC_PLLI2SP_VALUE(PLLI2SInit->PLLI2SP)); -#endif /* RCC_PLLI2SCFGR_PLLI2SP */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) - assert_param(IS_RCC_PLLI2SQ_VALUE(PLLI2SInit->PLLI2SQ)); -#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - - /* Wait till PLLI2S is disabled */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Configure the PLLI2S division factors */ -#if defined(STM32F446xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SPCLK = PLLI2S_VCO / PLLI2SP */ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ - PLLI2SInit->PLLI2SP, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ - PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * PLLI2SN */ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F411xE) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); -#else - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x PLLI2SN */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); -#endif /* STM32F446xx */ - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - - /* Wait till PLLI2S is ready */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Disable PLLI2S. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void) -{ - uint32_t tickstart; - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - - /* Wait till PLLI2S is disabled */ - tickstart = HAL_GetTick(); - while (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Enable PLLSAI. - * @param PLLSAIInit pointer to an RCC_PLLSAIInitTypeDef structure that - * contains the configuration information for the PLLSAI - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit) -{ - uint32_t tickstart; - - /* Check for parameters */ - assert_param(IS_RCC_PLLSAIN_VALUE(PLLSAIInit->PLLSAIN)); - assert_param(IS_RCC_PLLSAIQ_VALUE(PLLSAIInit->PLLSAIQ)); -#if defined(RCC_PLLSAICFGR_PLLSAIM) - assert_param(IS_RCC_PLLSAIM_VALUE(PLLSAIInit->PLLSAIM)); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ -#if defined(RCC_PLLSAICFGR_PLLSAIP) - assert_param(IS_RCC_PLLSAIP_VALUE(PLLSAIInit->PLLSAIP)); -#endif /* RCC_PLLSAICFGR_PLLSAIP */ -#if defined(RCC_PLLSAICFGR_PLLSAIR) - assert_param(IS_RCC_PLLSAIR_VALUE(PLLSAIInit->PLLSAIR)); -#endif /* RCC_PLLSAICFGR_PLLSAIR */ - - /* Disable the PLLSAI */ - __HAL_RCC_PLLSAI_DISABLE(); - - /* Wait till PLLSAI is disabled */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Configure the PLLSAI division factors */ -#if defined(STM32F446xx) - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLSAIN/PLLSAIM) */ - /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIM, PLLSAIInit->PLLSAIN, \ - PLLSAIInit->PLLSAIP, PLLSAIInit->PLLSAIQ, 0U); -#elif defined(STM32F469xx) || defined(STM32F479xx) - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * PLLSAIN */ - /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIP, \ - PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); -#else - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) x PLLSAIN */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); -#endif /* STM32F446xx */ - - /* Enable the PLLSAI */ - __HAL_RCC_PLLSAI_ENABLE(); - - /* Wait till PLLSAI is ready */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Disable PLLSAI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void) -{ - uint32_t tickstart; - - /* Disable the PLLSAI */ - __HAL_RCC_PLLSAI_DISABLE(); - - /* Wait till PLLSAI is disabled */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @} - */ - -#if defined(STM32F446xx) -/** - * @brief Returns the SYSCLK frequency - * - * @note This function implementation is valid only for STM32F446xx devices. - * @note This function add the PLL/PLLR System clock source - * - * @note The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) - * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) - * @note If SYSCLK source is PLL or PLLR, function returns values based on HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * @note The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @note This function can be used by the user application to compute the - * baudrate for the communication peripherals or configure other parameters. - * - * @note Each time SYSCLK changes, this function must be called to update the - * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * - * @retval SYSCLK frequency - */ -uint32_t HAL_RCC_GetSysClockFreq(void) -{ - uint32_t pllm = 0U; - uint32_t pllvco = 0U; - uint32_t pllp = 0U; - uint32_t pllr = 0U; - uint32_t sysclockfreq = 0U; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) - { - case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ - { - sysclockfreq = HSI_VALUE; - break; - } - case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ - { - sysclockfreq = HSE_VALUE; - break; - } - case RCC_CFGR_SWS_PLL: /* PLL/PLLP used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLP */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) * 2U); - - sysclockfreq = pllvco / pllp; - break; - } - case RCC_CFGR_SWS_PLLR: /* PLL/PLLR used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLR */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllr = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); - - sysclockfreq = pllvco / pllr; - break; - } - default: - { - sysclockfreq = HSI_VALUE; - break; - } - } - return sysclockfreq; -} -#endif /* STM32F446xx */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * - HSI ON and used as system clock source - * - HSE, PLL, PLLI2S and PLLSAI OFF - * - AHB, APB1 and APB2 prescaler set to 1. - * - CSS, MCO1 and MCO2 OFF - * - All interrupts disabled - * @note This function doesn't modify the configuration of the - * - Peripheral clocks - * - LSI, LSE and RTC clocks - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCC_DeInit(void) -{ - uint32_t tickstart; - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Set HSION bit to the reset value */ - SET_BIT(RCC->CR, RCC_CR_HSION); - - /* Wait till HSI is ready */ - while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Set HSITRIM[4:0] bits to the reset value */ - SET_BIT(RCC->CR, RCC_CR_HSITRIM_4); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset CFGR register */ - CLEAR_REG(RCC->CFGR); - - /* Wait till clock switch is ready */ - while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RESET) - { - if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Clear HSEON, HSEBYP and CSSON bits */ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_CSSON); - - /* Wait till HSE is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_HSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Clear PLLON bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLON); - - /* Wait till PLL is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - -#if defined(RCC_PLLI2S_SUPPORT) - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset PLLI2SON bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); - - /* Wait till PLLI2S is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset PLLSAI bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); - - /* Wait till PLLSAI is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } -#endif /* RCC_PLLSAI_SUPPORT */ - - /* Once PLL, PLLI2S and PLLSAI are OFF, reset PLLCFGR register to default value */ -#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ - defined(STM32F423xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLR_1; -#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) - RCC->PLLCFGR = RCC_PLLCFGR_PLLR_0 | RCC_PLLCFGR_PLLR_1 | RCC_PLLCFGR_PLLR_2 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_0 | RCC_PLLCFGR_PLLQ_1 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLQ_3; -#else - RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2; -#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx || STM32F469xx || STM32F479xx */ - - /* Reset PLLI2SCFGR register to default value */ -#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ - defined(STM32F423xx) || defined(STM32F446xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F411xE) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; -#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx */ - - /* Reset PLLSAICFGR register */ -#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIR_1; -#elif defined(STM32F446xx) - RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2; -#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F469xx || STM32F479xx */ - - /* Disable all interrupts */ - CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE | RCC_CIR_LSERDYIE | RCC_CIR_HSIRDYIE | RCC_CIR_HSERDYIE | RCC_CIR_PLLRDYIE); - -#if defined(RCC_CIR_PLLI2SRDYIE) - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); -#endif /* RCC_CIR_PLLI2SRDYIE */ - -#if defined(RCC_CIR_PLLSAIRDYIE) - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); -#endif /* RCC_CIR_PLLSAIRDYIE */ - - /* Clear all interrupt flags */ - SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR_PLLRDYC | - RCC_CIR_CSSC); - -#if defined(RCC_CIR_PLLI2SRDYC) - SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); -#endif /* RCC_CIR_PLLI2SRDYC */ - -#if defined(RCC_CIR_PLLSAIRDYC) - SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); -#endif /* RCC_CIR_PLLSAIRDYC */ - - /* Clear LSION bit */ - CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); - - /* Reset all CSR flags */ - SET_BIT(RCC->CSR, RCC_CSR_RMVF); - - /* Update the SystemCoreClock global variable */ - SystemCoreClock = HSI_VALUE; - - /* Adapt Systick interrupt period */ - if (HAL_InitTick(uwTickPrio) != HAL_OK) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Initializes the RCC Oscillators according to the specified parameters in the - * RCC_OscInitTypeDef. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC Oscillators. - * @note The PLL is not disabled when used as system clock. - * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not - * supported by this API. User should request a transition to LSE Off - * first and then LSE On or LSE Bypass. - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not - * supported by this API. User should request a transition to HSE Off - * first and then HSE On or HSE Bypass. - * @note This function add the PLL/PLLR factor management during PLL configuration this feature - * is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - uint32_t tickstart; - uint32_t pll_config; - - /* Check Null pointer */ - if (RCC_OscInitStruct == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); - /*------------------------------- HSE Configuration ------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) - { - /* Check the parameters */ - assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); - /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ -#if defined(STM32F446xx) - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) - || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) -#else - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) - || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) -#endif /* STM32F446xx */ - { - if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) - { - return HAL_ERROR; - } - } - else - { - /* Set the new HSE configuration ---------------------------------------*/ - __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); - - /* Check the HSE State */ - if ((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSE is bypassed or disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*----------------------------- HSI Configuration --------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) - { - /* Check the parameters */ - assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); - assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); - - /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ -#if defined(STM32F446xx) - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) - || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) -#else - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) - || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) -#endif /* STM32F446xx */ - { - /* When HSI is used as system clock it will not disabled */ - if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) - { - return HAL_ERROR; - } - /* Otherwise, just the calibration is allowed */ - else - { - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - } - else - { - /* Check the HSI State */ - if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) - { - /* Enable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - else - { - /* Disable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*------------------------------ LSI Configuration -------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) - { - /* Check the parameters */ - assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); - - /* Check the LSI State */ - if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) - { - /* Enable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - /*------------------------------ LSE Configuration -------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) - { - FlagStatus pwrclkchanged = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); - - /* Update LSE configuration in Backup Domain control register */ - /* Requires to enable write access to Backup Domain of necessary */ - if (__HAL_RCC_PWR_IS_CLK_DISABLED()) - { - __HAL_RCC_PWR_CLK_ENABLE(); - pwrclkchanged = SET; - } - - if (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - /* Enable write access to Backup domain */ - SET_BIT(PWR->CR, PWR_CR_DBP); - - /* Wait for Backup domain Write protection disable */ - tickstart = HAL_GetTick(); - - while (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Set the new LSE configuration -----------------------------------------*/ - __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); - /* Check the LSE State */ - if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Restore clock configuration if changed */ - if (pwrclkchanged == SET) - { - __HAL_RCC_PWR_CLK_DISABLE(); - } - } - /*-------------------------------- PLL Configuration -----------------------*/ - /* Check the parameters */ - assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); - if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) - { - /* Check if the PLL is used as system clock or not */ - if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) - { - /* Check the parameters */ - assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); - assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); - assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); - assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); - assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); - assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR)); - - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Configure the main PLL clock source, multiplication and division factors. */ - WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ - RCC_OscInitStruct->PLL.PLLM | \ - (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ - (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ - (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos) | \ - (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))); - /* Enable the main PLL. */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - else - { - /* Check if there is a request to disable the PLL used as System clock source */ - if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) - { - return HAL_ERROR; - } - else - { - /* Do not return HAL_ERROR if request repeats the current configuration */ - pll_config = RCC->PLLCFGR; -#if defined (RCC_PLLCFGR_PLLR) - if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) -#else - if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) -#endif /* RCC_PLLCFGR_PLLR */ - { - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that will be configured. - * - * @note This function is only available in case of STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. - * @note This function add the PLL/PLLR factor management - * @retval None - */ -void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - /* Set all possible values for the Oscillator type parameter ---------------*/ - RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; - - /* Get the HSE configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) - { - RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; - } - else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) - { - RCC_OscInitStruct->HSEState = RCC_HSE_ON; - } - else - { - RCC_OscInitStruct->HSEState = RCC_HSE_OFF; - } - - /* Get the HSI configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) - { - RCC_OscInitStruct->HSIState = RCC_HSI_ON; - } - else - { - RCC_OscInitStruct->HSIState = RCC_HSI_OFF; - } - - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); - - /* Get the LSE configuration -----------------------------------------------*/ - if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) - { - RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; - } - else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) - { - RCC_OscInitStruct->LSEState = RCC_LSE_ON; - } - else - { - RCC_OscInitStruct->LSEState = RCC_LSE_OFF; - } - - /* Get the LSI configuration -----------------------------------------------*/ - if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) - { - RCC_OscInitStruct->LSIState = RCC_LSI_ON; - } - else - { - RCC_OscInitStruct->LSIState = RCC_LSI_OFF; - } - - /* Get the PLL configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; - } - else - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; - } - RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); - RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); - RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); - RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); - RCC_OscInitStruct->PLL.PLLR = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); -} -#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#endif /* HAL_RCC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c deleted file mode 100644 index 99b5549..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c +++ /dev/null @@ -1,3930 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_spi.c - * @author MCD Application Team - * @brief SPI HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Serial Peripheral Interface (SPI) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State functions - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The SPI HAL driver can be used as follows: - - (#) Declare a SPI_HandleTypeDef handle structure, for example: - SPI_HandleTypeDef hspi; - - (#)Initialize the SPI low level resources by implementing the HAL_SPI_MspInit() API: - (##) Enable the SPIx interface clock - (##) SPI pins configuration - (+++) Enable the clock for the SPI GPIOs - (+++) Configure these SPI pins as alternate function push-pull - (##) NVIC configuration if you need to use interrupt process - (+++) Configure the SPIx interrupt priority - (+++) Enable the NVIC SPI IRQ handle - (##) DMA Configuration if you need to use DMA process - (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive Stream/Channel - (+++) Enable the DMAx clock - (+++) Configure the DMA handle parameters - (+++) Configure the DMA Tx or Rx Stream/Channel - (+++) Associate the initialized hdma_tx(or _rx) handle to the hspi DMA Tx or Rx handle - (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream/Channel - - (#) Program the Mode, BidirectionalMode , Data size, Baudrate Prescaler, NSS - management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure. - - (#) Initialize the SPI registers by calling the HAL_SPI_Init() API: - (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) - by calling the customized HAL_SPI_MspInit() API. - [..] - Circular mode restriction: - (#) The DMA circular mode cannot be used when the SPI is configured in these modes: - (##) Master 2Lines RxOnly - (##) Master 1Line Rx - (#) The CRC feature is not managed when the DMA circular mode is enabled - (#) When the SPI DMA Pause/Stop features are used, we must use the following APIs - the HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() only under the SPI callbacks - [..] - Master Receive mode restriction: - (#) In Master unidirectional receive-only mode (MSTR =1, BIDIMODE=0, RXONLY=1) or - bidirectional receive mode (MSTR=1, BIDIMODE=1, BIDIOE=0), to ensure that the SPI - does not initiate a new transfer the following procedure has to be respected: - (##) HAL_SPI_DeInit() - (##) HAL_SPI_Init() - [..] - Callback registration: - - (#) The compilation flag USE_HAL_SPI_REGISTER_CALLBACKS when set to 1U - allows the user to configure dynamically the driver callbacks. - Use Functions HAL_SPI_RegisterCallback() to register an interrupt callback. - - Function HAL_SPI_RegisterCallback() allows to register following callbacks: - (++) TxCpltCallback : SPI Tx Completed callback - (++) RxCpltCallback : SPI Rx Completed callback - (++) TxRxCpltCallback : SPI TxRx Completed callback - (++) TxHalfCpltCallback : SPI Tx Half Completed callback - (++) RxHalfCpltCallback : SPI Rx Half Completed callback - (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback - (++) ErrorCallback : SPI Error callback - (++) AbortCpltCallback : SPI Abort callback - (++) MspInitCallback : SPI Msp Init callback - (++) MspDeInitCallback : SPI Msp DeInit callback - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - - - (#) Use function HAL_SPI_UnRegisterCallback to reset a callback to the default - weak function. - HAL_SPI_UnRegisterCallback takes as parameters the HAL peripheral handle, - and the Callback ID. - This function allows to reset following callbacks: - (++) TxCpltCallback : SPI Tx Completed callback - (++) RxCpltCallback : SPI Rx Completed callback - (++) TxRxCpltCallback : SPI TxRx Completed callback - (++) TxHalfCpltCallback : SPI Tx Half Completed callback - (++) RxHalfCpltCallback : SPI Rx Half Completed callback - (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback - (++) ErrorCallback : SPI Error callback - (++) AbortCpltCallback : SPI Abort callback - (++) MspInitCallback : SPI Msp Init callback - (++) MspDeInitCallback : SPI Msp DeInit callback - - [..] - By default, after the HAL_SPI_Init() and when the state is HAL_SPI_STATE_RESET - all callbacks are set to the corresponding weak functions: - examples HAL_SPI_MasterTxCpltCallback(), HAL_SPI_MasterRxCpltCallback(). - Exception done for MspInit and MspDeInit functions that are - reset to the legacy weak functions in the HAL_SPI_Init()/ HAL_SPI_DeInit() only when - these callbacks are null (not registered beforehand). - If MspInit or MspDeInit are not null, the HAL_SPI_Init()/ HAL_SPI_DeInit() - keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - - [..] - Callbacks can be registered/unregistered in HAL_SPI_STATE_READY state only. - Exception done MspInit/MspDeInit functions that can be registered/unregistered - in HAL_SPI_STATE_READY or HAL_SPI_STATE_RESET state, - thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. - Then, the user first registers the MspInit/MspDeInit user callbacks - using HAL_SPI_RegisterCallback() before calling HAL_SPI_DeInit() - or HAL_SPI_Init() function. - - [..] - When the compilation define USE_HAL_PPP_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registering feature is not available - and weak (surcharged) callbacks are used. - - [..] - Using the HAL it is not possible to reach all supported SPI frequency with the different SPI Modes, - the following table resume the max SPI frequency reached with data size 8bits/16bits, - according to frequency of the APBx Peripheral Clock (fPCLK) used by the SPI instance. - - @endverbatim - - Additional table : - - DataSize = SPI_DATASIZE_8BIT: - +----------------------------------------------------------------------------------------------+ - | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | - | Process | Transfer mode |---------------------|----------------------|----------------------| - | | | Master | Slave | Master | Slave | Master | Slave | - |==============================================================================================| - | T | Polling | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | / | Interrupt | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA | - | R |----------------|----------|----------|-----------|----------|-----------|----------| - | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | R | Interrupt | Fpclk/8 | Fpclk/8 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/128 | Fpclk/2 | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/2 | Fpclk/64 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/2 | Fpclk/64 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/128| - +----------------------------------------------------------------------------------------------+ - - DataSize = SPI_DATASIZE_16BIT: - +----------------------------------------------------------------------------------------------+ - | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | - | Process | Transfer mode |---------------------|----------------------|----------------------| - | | | Master | Slave | Master | Slave | Master | Slave | - |==============================================================================================| - | T | Polling | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | / | Interrupt | Fpclk/4 | Fpclk/4 | NA | NA | NA | NA | - | R |----------------|----------|----------|-----------|----------|-----------|----------| - | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/32 | Fpclk/2 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | R | Interrupt | Fpclk/4 | Fpclk/4 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/128 | Fpclk/2 | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/32 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | T | Interrupt | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/64 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/128| - +----------------------------------------------------------------------------------------------+ - @note The max SPI frequency depend on SPI data size (8bits, 16bits), - SPI mode(2 Lines fullduplex, 2 lines RxOnly, 1 line TX/RX) and Process mode (Polling, IT, DMA). - @note - (#) TX/RX processes are HAL_SPI_TransmitReceive(), HAL_SPI_TransmitReceive_IT() and HAL_SPI_TransmitReceive_DMA() - (#) RX processes are HAL_SPI_Receive(), HAL_SPI_Receive_IT() and HAL_SPI_Receive_DMA() - (#) TX processes are HAL_SPI_Transmit(), HAL_SPI_Transmit_IT() and HAL_SPI_Transmit_DMA() - - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup SPI SPI - * @brief SPI HAL module driver - * @{ - */ -#ifdef HAL_SPI_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private defines -----------------------------------------------------------*/ -/** @defgroup SPI_Private_Constants SPI Private Constants - * @{ - */ -#define SPI_DEFAULT_TIMEOUT 100U -#define SPI_BSY_FLAG_WORKAROUND_TIMEOUT 1000U /*!< Timeout 1000 µs */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @defgroup SPI_Private_Functions SPI Private Functions - * @{ - */ -static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAError(DMA_HandleTypeDef *hdma); -static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma); -static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma); -static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State, - uint32_t Timeout, uint32_t Tickstart); -static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi); -#if (USE_SPI_CRC != 0U) -static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi); -static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); -#endif /* USE_SPI_CRC */ -static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi); -static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi); -static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi); -static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi); -static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi); -static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SPI_Exported_Functions SPI Exported Functions - * @{ - */ - -/** @defgroup SPI_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the SPIx peripheral: - - (+) User must implement HAL_SPI_MspInit() function in which he configures - all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ). - - (+) Call the function HAL_SPI_Init() to configure the selected device with - the selected configuration: - (++) Mode - (++) Direction - (++) Data Size - (++) Clock Polarity and Phase - (++) NSS Management - (++) BaudRate Prescaler - (++) FirstBit - (++) TIMode - (++) CRC Calculation - (++) CRC Polynomial if CRC enabled - - (+) Call the function HAL_SPI_DeInit() to restore the default configuration - of the selected SPIx peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the SPI according to the specified parameters - * in the SPI_InitTypeDef and initialize the associated handle. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi) -{ - /* Check the SPI handle allocation */ - if (hspi == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance)); - assert_param(IS_SPI_MODE(hspi->Init.Mode)); - assert_param(IS_SPI_DIRECTION(hspi->Init.Direction)); - assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize)); - assert_param(IS_SPI_NSS(hspi->Init.NSS)); - assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); - assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit)); - assert_param(IS_SPI_TIMODE(hspi->Init.TIMode)); - if (hspi->Init.TIMode == SPI_TIMODE_DISABLE) - { - assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity)); - assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase)); - - if (hspi->Init.Mode == SPI_MODE_MASTER) - { - assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); - } - else - { - /* Baudrate prescaler not use in Motoraola Slave mode. force to default value */ - hspi->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - } - } - else - { - assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); - - /* Force polarity and phase to TI protocaol requirements */ - hspi->Init.CLKPolarity = SPI_POLARITY_LOW; - hspi->Init.CLKPhase = SPI_PHASE_1EDGE; - } -#if (USE_SPI_CRC != 0U) - assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation)); - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial)); - } -#else - hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; -#endif /* USE_SPI_CRC */ - - if (hspi->State == HAL_SPI_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hspi->Lock = HAL_UNLOCKED; - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - /* Init the SPI Callback settings */ - hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback */ - hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback */ - hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ - hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ - hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ - hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */ - hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback */ - hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - - if (hspi->MspInitCallback == NULL) - { - hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ - } - - /* Init the low level hardware : GPIO, CLOCK, NVIC... */ - hspi->MspInitCallback(hspi); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC... */ - HAL_SPI_MspInit(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - - hspi->State = HAL_SPI_STATE_BUSY; - - /* Disable the selected SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - - /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/ - /* Configure : SPI Mode, Communication Mode, Data size, Clock polarity and phase, NSS management, - Communication speed, First bit and CRC calculation state */ - WRITE_REG(hspi->Instance->CR1, ((hspi->Init.Mode & (SPI_CR1_MSTR | SPI_CR1_SSI)) | - (hspi->Init.Direction & (SPI_CR1_RXONLY | SPI_CR1_BIDIMODE)) | - (hspi->Init.DataSize & SPI_CR1_DFF) | - (hspi->Init.CLKPolarity & SPI_CR1_CPOL) | - (hspi->Init.CLKPhase & SPI_CR1_CPHA) | - (hspi->Init.NSS & SPI_CR1_SSM) | - (hspi->Init.BaudRatePrescaler & SPI_CR1_BR_Msk) | - (hspi->Init.FirstBit & SPI_CR1_LSBFIRST) | - (hspi->Init.CRCCalculation & SPI_CR1_CRCEN))); - - /* Configure : NSS management, TI Mode */ - WRITE_REG(hspi->Instance->CR2, (((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) | (hspi->Init.TIMode & SPI_CR2_FRF))); - -#if (USE_SPI_CRC != 0U) - /*---------------------------- SPIx CRCPOLY Configuration ------------------*/ - /* Configure : CRC Polynomial */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - WRITE_REG(hspi->Instance->CRCPR, (hspi->Init.CRCPolynomial & SPI_CRCPR_CRCPOLY_Msk)); - } -#endif /* USE_SPI_CRC */ - -#if defined(SPI_I2SCFGR_I2SMOD) - /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */ - CLEAR_BIT(hspi->Instance->I2SCFGR, SPI_I2SCFGR_I2SMOD); -#endif /* SPI_I2SCFGR_I2SMOD */ - - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->State = HAL_SPI_STATE_READY; - - return HAL_OK; -} - -/** - * @brief De-Initialize the SPI peripheral. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi) -{ - /* Check the SPI handle allocation */ - if (hspi == NULL) - { - return HAL_ERROR; - } - - /* Check SPI Instance parameter */ - assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance)); - - hspi->State = HAL_SPI_STATE_BUSY; - - /* Disable the SPI Peripheral Clock */ - __HAL_SPI_DISABLE(hspi); - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - if (hspi->MspDeInitCallback == NULL) - { - hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ - } - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ - hspi->MspDeInitCallback(hspi); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ - HAL_SPI_MspDeInit(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->State = HAL_SPI_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hspi); - - return HAL_OK; -} - -/** - * @brief Initialize the SPI MSP. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_MspInit should be implemented in the user file - */ -} - -/** - * @brief De-Initialize the SPI MSP. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_MspDeInit should be implemented in the user file - */ -} - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -/** - * @brief Register a User SPI Callback - * To be used instead of the weak predefined callback - * @param hspi Pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI. - * @param CallbackID ID of the callback to be registered - * @param pCallback pointer to the Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID, - pSPI_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hspi->ErrorCode |= HAL_SPI_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hspi); - - if (HAL_SPI_STATE_READY == hspi->State) - { - switch (CallbackID) - { - case HAL_SPI_TX_COMPLETE_CB_ID : - hspi->TxCpltCallback = pCallback; - break; - - case HAL_SPI_RX_COMPLETE_CB_ID : - hspi->RxCpltCallback = pCallback; - break; - - case HAL_SPI_TX_RX_COMPLETE_CB_ID : - hspi->TxRxCpltCallback = pCallback; - break; - - case HAL_SPI_TX_HALF_COMPLETE_CB_ID : - hspi->TxHalfCpltCallback = pCallback; - break; - - case HAL_SPI_RX_HALF_COMPLETE_CB_ID : - hspi->RxHalfCpltCallback = pCallback; - break; - - case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID : - hspi->TxRxHalfCpltCallback = pCallback; - break; - - case HAL_SPI_ERROR_CB_ID : - hspi->ErrorCallback = pCallback; - break; - - case HAL_SPI_ABORT_CB_ID : - hspi->AbortCpltCallback = pCallback; - break; - - case HAL_SPI_MSPINIT_CB_ID : - hspi->MspInitCallback = pCallback; - break; - - case HAL_SPI_MSPDEINIT_CB_ID : - hspi->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_SPI_STATE_RESET == hspi->State) - { - switch (CallbackID) - { - case HAL_SPI_MSPINIT_CB_ID : - hspi->MspInitCallback = pCallback; - break; - - case HAL_SPI_MSPDEINIT_CB_ID : - hspi->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hspi); - return status; -} - -/** - * @brief Unregister an SPI Callback - * SPI callback is redirected to the weak predefined callback - * @param hspi Pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI. - * @param CallbackID ID of the callback to be unregistered - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hspi); - - if (HAL_SPI_STATE_READY == hspi->State) - { - switch (CallbackID) - { - case HAL_SPI_TX_COMPLETE_CB_ID : - hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback */ - break; - - case HAL_SPI_RX_COMPLETE_CB_ID : - hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback */ - break; - - case HAL_SPI_TX_RX_COMPLETE_CB_ID : - hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ - break; - - case HAL_SPI_TX_HALF_COMPLETE_CB_ID : - hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ - break; - - case HAL_SPI_RX_HALF_COMPLETE_CB_ID : - hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ - break; - - case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID : - hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */ - break; - - case HAL_SPI_ERROR_CB_ID : - hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback */ - break; - - case HAL_SPI_ABORT_CB_ID : - hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - break; - - case HAL_SPI_MSPINIT_CB_ID : - hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_SPI_MSPDEINIT_CB_ID : - hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_SPI_STATE_RESET == hspi->State) - { - switch (CallbackID) - { - case HAL_SPI_MSPINIT_CB_ID : - hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_SPI_MSPDEINIT_CB_ID : - hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hspi); - return status; -} -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup SPI_Exported_Functions_Group2 IO operation functions - * @brief Data transfers functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the SPI - data transfers. - - [..] The SPI supports master and slave mode : - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode: The communication is performed using Interrupts - or DMA, These APIs return the HAL status. - The end of the data processing will be indicated through the - dedicated SPI IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The HAL_SPI_TxCpltCallback(), HAL_SPI_RxCpltCallback() and HAL_SPI_TxRxCpltCallback() user callbacks - will be executed respectively at the end of the transmit or Receive process - The HAL_SPI_ErrorCallback()user callback will be executed when a communication error is detected - - (#) APIs provided for these 2 transfer modes (Blocking mode or Non blocking mode using either Interrupt or DMA) - exist for 1Line (simplex) and 2Lines (full duplex) modes. - -@endverbatim - * @{ - */ - -/** - * @brief Transmit an amount of data in blocking mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer - * @param Size amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - uint32_t tickstart; - uint16_t initial_TxXferCount; - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - initial_TxXferCount = Size; - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_TX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->pRxBuffPtr = (uint8_t *)NULL; - hspi->RxXferSize = 0U; - hspi->RxXferCount = 0U; - hspi->TxISR = NULL; - hspi->RxISR = NULL; - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_TX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Transmit data in 16 Bit mode */ - if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) - { - if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) - { - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - } - /* Transmit data in 16 Bit mode */ - while (hspi->TxXferCount > 0U) - { - /* Wait until TXE flag is set to send data */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) - { - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - } - else - { - /* Timeout management */ - if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - } - /* Transmit data in 8 Bit mode */ - else - { - if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) - { - *((__IO uint8_t *)&hspi->Instance->DR) = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint8_t); - hspi->TxXferCount--; - } - while (hspi->TxXferCount > 0U) - { - /* Wait until TXE flag is set to send data */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) - { - *((__IO uint8_t *)&hspi->Instance->DR) = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint8_t); - hspi->TxXferCount--; - } - else - { - /* Timeout management */ - if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - } -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_FLAG; - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - hspi->State = HAL_SPI_STATE_READY; - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -/** - * @brief Receive an amount of data in blocking mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer - * @param Size amount of data to be received - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ -#if (USE_SPI_CRC != 0U) - __IO uint32_t tmpreg = 0U; -#endif /* USE_SPI_CRC */ - uint32_t tickstart; - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES)) - { - hspi->State = HAL_SPI_STATE_BUSY_RX; - /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ - return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout); - } - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_RX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pRxBuffPtr = (uint8_t *)pData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->pTxBuffPtr = (uint8_t *)NULL; - hspi->TxXferSize = 0U; - hspi->TxXferCount = 0U; - hspi->RxISR = NULL; - hspi->TxISR = NULL; - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - /* this is done to handle the CRCNEXT before the latest data */ - hspi->RxXferCount--; - } -#endif /* USE_SPI_CRC */ - - /* Configure communication direction: 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_RX(hspi); - } - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Receive data in 8 Bit mode */ - if (hspi->Init.DataSize == SPI_DATASIZE_8BIT) - { - /* Transfer loop */ - while (hspi->RxXferCount > 0U) - { - /* Check the RXNE flag */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) - { - /* read the received data */ - (* (uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; - hspi->pRxBuffPtr += sizeof(uint8_t); - hspi->RxXferCount--; - } - else - { - /* Timeout management */ - if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - } - else - { - /* Transfer loop */ - while (hspi->RxXferCount > 0U) - { - /* Check the RXNE flag */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) - { - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; - hspi->pRxBuffPtr += sizeof(uint16_t); - hspi->RxXferCount--; - } - else - { - /* Timeout management */ - if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - } - -#if (USE_SPI_CRC != 0U) - /* Handle the CRC Transmission */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* freeze the CRC before the latest data */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - - /* Read the latest data */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) - { - /* the latest data has not been received */ - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - - /* Receive last data in 16 Bit mode */ - if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) - { - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; - } - /* Receive last data in 8 Bit mode */ - else - { - (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; - } - - /* Wait the CRC data */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - - /* Read CRC to Flush DR and RXNE flag */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - } -#endif /* USE_SPI_CRC */ - - /* Check the end of the transaction */ - if (SPI_EndRxTransaction(hspi, Timeout, tickstart) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_FLAG; - } - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - } -#endif /* USE_SPI_CRC */ - - hspi->State = HAL_SPI_STATE_READY; - /* Unlock the process */ - __HAL_UNLOCK(hspi); - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -/** - * @brief Transmit and Receive an amount of data in blocking mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pTxData pointer to transmission data buffer - * @param pRxData pointer to reception data buffer - * @param Size amount of data to be sent and received - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size, uint32_t Timeout) -{ - uint16_t initial_TxXferCount; - uint32_t tmp_mode; - HAL_SPI_StateTypeDef tmp_state; - uint32_t tickstart; -#if (USE_SPI_CRC != 0U) - __IO uint32_t tmpreg = 0U; -#endif /* USE_SPI_CRC */ - - /* Variable used to alternate Rx and Tx during transfer */ - uint32_t txallowed = 1U; - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* Init temporary variables */ - tmp_state = hspi->State; - tmp_mode = hspi->Init.Mode; - initial_TxXferCount = Size; - - if (!((tmp_state == HAL_SPI_STATE_READY) || \ - ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX)))) - { - return HAL_BUSY; - } - - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ - if (hspi->State != HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; - } - - /* Set the transaction information */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pRxBuffPtr = (uint8_t *)pRxData; - hspi->RxXferCount = Size; - hspi->RxXferSize = Size; - hspi->pTxBuffPtr = (const uint8_t *)pTxData; - hspi->TxXferCount = Size; - hspi->TxXferSize = Size; - - /*Init field not used in handle to zero */ - hspi->RxISR = NULL; - hspi->TxISR = NULL; - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Transmit and Receive data in 16 Bit mode */ - if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) - { - if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) - { - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - - } - while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) - { - /* Check TXE flag */ - if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U)) - { - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - /* Next Data is a reception (Rx). Tx not allowed */ - txallowed = 0U; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - } - - /* Check RXNE flag */ - if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) - { - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; - hspi->pRxBuffPtr += sizeof(uint16_t); - hspi->RxXferCount--; - /* Next Data is a Transmission (Tx). Tx is allowed */ - txallowed = 1U; - } - if (((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - /* Transmit and Receive data in 8 Bit mode */ - else - { - if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) - { - *((__IO uint8_t *)&hspi->Instance->DR) = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint8_t); - hspi->TxXferCount--; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - } - while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) - { - /* Check TXE flag */ - if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U)) - { - *(__IO uint8_t *)&hspi->Instance->DR = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr++; - hspi->TxXferCount--; - /* Next Data is a reception (Rx). Tx not allowed */ - txallowed = 0U; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - } - - /* Wait until RXNE flag is reset */ - if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) - { - (*(uint8_t *)hspi->pRxBuffPtr) = hspi->Instance->DR; - hspi->pRxBuffPtr++; - hspi->RxXferCount--; - /* Next Data is a Transmission (Tx). Tx is allowed */ - txallowed = 1U; - } - if ((((HAL_GetTick() - tickstart) >= Timeout) && ((Timeout != HAL_MAX_DELAY))) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - -#if (USE_SPI_CRC != 0U) - /* Read CRC from DR to close CRC calculation process */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Wait until TXE flag */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) - { - /* Error on the CRC reception */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - /* Read CRC */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - } - - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - /* Clear CRC Flag */ - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } -#endif /* USE_SPI_CRC */ - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_FLAG; - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - - hspi->State = HAL_SPI_STATE_READY; - /* Unlock the process */ - __HAL_UNLOCK(hspi); - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -/** - * @brief Transmit an amount of data in non-blocking mode with Interrupt. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer - * @param Size amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size) -{ - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); - - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_TX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - /* Init field not used in handle to zero */ - hspi->pRxBuffPtr = (uint8_t *)NULL; - hspi->RxXferSize = 0U; - hspi->RxXferCount = 0U; - hspi->RxISR = NULL; - - /* Set the function for IT treatment */ - if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) - { - hspi->TxISR = SPI_TxISR_16BIT; - } - else - { - hspi->TxISR = SPI_TxISR_8BIT; - } - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_TX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - /* Enable TXE and ERR interrupt */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); - - return HAL_OK; -} - -/** - * @brief Receive an amount of data in non-blocking mode with Interrupt. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer - * @param Size amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) -{ - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) - { - hspi->State = HAL_SPI_STATE_BUSY_RX; - /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ - return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size); - } - - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_RX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pRxBuffPtr = (uint8_t *)pData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /* Init field not used in handle to zero */ - hspi->pTxBuffPtr = (uint8_t *)NULL; - hspi->TxXferSize = 0U; - hspi->TxXferCount = 0U; - hspi->TxISR = NULL; - - /* Set the function for IT treatment */ - if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) - { - hspi->RxISR = SPI_RxISR_16BIT; - } - else - { - hspi->RxISR = SPI_RxISR_8BIT; - } - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_RX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Note : The SPI must be enabled after unlocking current process - to avoid the risk of SPI interrupt handle execution before current - process unlock */ - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - /* Enable RXNE and ERR interrupt */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - return HAL_OK; -} - -/** - * @brief Transmit and Receive an amount of data in non-blocking mode with Interrupt. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pTxData pointer to transmission data buffer - * @param pRxData pointer to reception data buffer - * @param Size amount of data to be sent and received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size) -{ - uint32_t tmp_mode; - HAL_SPI_StateTypeDef tmp_state; - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); - - /* Init temporary variables */ - tmp_state = hspi->State; - tmp_mode = hspi->Init.Mode; - - if (!((tmp_state == HAL_SPI_STATE_READY) || \ - ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX)))) - { - return HAL_BUSY; - } - - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hspi); - - /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ - if (hspi->State != HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; - } - - /* Set the transaction information */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pTxData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - hspi->pRxBuffPtr = (uint8_t *)pRxData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /* Set the function for IT treatment */ - if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) - { - hspi->RxISR = SPI_2linesRxISR_16BIT; - hspi->TxISR = SPI_2linesTxISR_16BIT; - } - else - { - hspi->RxISR = SPI_2linesRxISR_8BIT; - hspi->TxISR = SPI_2linesTxISR_8BIT; - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - /* Enable TXE, RXNE and ERR interrupt */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); - - return HAL_OK; -} - -/** - * @brief Transmit an amount of data in non-blocking mode with DMA. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer - * @param Size amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size) -{ - - /* Check tx dma handle */ - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_TX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - /* Init field not used in handle to zero */ - hspi->pRxBuffPtr = (uint8_t *)NULL; - hspi->TxISR = NULL; - hspi->RxISR = NULL; - hspi->RxXferSize = 0U; - hspi->RxXferCount = 0U; - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_TX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Set the SPI TxDMA Half transfer complete callback */ - hspi->hdmatx->XferHalfCpltCallback = SPI_DMAHalfTransmitCplt; - - /* Set the SPI TxDMA transfer complete callback */ - hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt; - - /* Set the DMA error callback */ - hspi->hdmatx->XferErrorCallback = SPI_DMAError; - - /* Set the DMA AbortCpltCallback */ - hspi->hdmatx->XferAbortCallback = NULL; - - /* Enable the Tx DMA Stream/Channel */ - if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, - hspi->TxXferCount)) - { - /* Update SPI error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Enable the SPI Error Interrupt Bit */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); - - /* Enable Tx DMA Request */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); - - return HAL_OK; -} - -/** - * @brief Receive an amount of data in non-blocking mode with DMA. - * @note In case of MASTER mode and SPI_DIRECTION_2LINES direction, hdmatx shall be defined. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer - * @note When the CRC feature is enabled the pData Length must be Size + 1. - * @param Size amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) -{ - /* Check rx dma handle */ - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) - { - hspi->State = HAL_SPI_STATE_BUSY_RX; - - /* Check tx dma handle */ - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); - - /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ - return HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size); - } - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_RX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pRxBuffPtr = (uint8_t *)pData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->RxISR = NULL; - hspi->TxISR = NULL; - hspi->TxXferSize = 0U; - hspi->TxXferCount = 0U; - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_RX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Set the SPI RxDMA Half transfer complete callback */ - hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; - - /* Set the SPI Rx DMA transfer complete callback */ - hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; - - /* Set the DMA error callback */ - hspi->hdmarx->XferErrorCallback = SPI_DMAError; - - /* Set the DMA AbortCpltCallback */ - hspi->hdmarx->XferAbortCallback = NULL; - - /* Enable the Rx DMA Stream/Channel */ - if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, - hspi->RxXferCount)) - { - /* Update SPI error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Enable the SPI Error Interrupt Bit */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); - - /* Enable Rx DMA Request */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); - - return HAL_OK; -} - -/** - * @brief Transmit and Receive an amount of data in non-blocking mode with DMA. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pTxData pointer to transmission data buffer - * @param pRxData pointer to reception data buffer - * @note When the CRC feature is enabled the pRxData Length must be Size + 1 - * @param Size amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size) -{ - uint32_t tmp_mode; - HAL_SPI_StateTypeDef tmp_state; - - /* Check rx & tx dma handles */ - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); - - /* Init temporary variables */ - tmp_state = hspi->State; - tmp_mode = hspi->Init.Mode; - - if (!((tmp_state == HAL_SPI_STATE_READY) || - ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX)))) - { - return HAL_BUSY; - } - - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hspi); - - /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ - if (hspi->State != HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; - } - - /* Set the transaction information */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pTxData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - hspi->pRxBuffPtr = (uint8_t *)pRxData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /* Init field not used in handle to zero */ - hspi->RxISR = NULL; - hspi->TxISR = NULL; - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Check if we are in Rx only or in Rx/Tx Mode and configure the DMA transfer complete callback */ - if (hspi->State == HAL_SPI_STATE_BUSY_RX) - { - /* Set the SPI Rx DMA Half transfer complete callback */ - hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; - hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; - } - else - { - /* Set the SPI Tx/Rx DMA Half transfer complete callback */ - hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfTransmitReceiveCplt; - hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt; - } - - /* Set the DMA error callback */ - hspi->hdmarx->XferErrorCallback = SPI_DMAError; - - /* Set the DMA AbortCpltCallback */ - hspi->hdmarx->XferAbortCallback = NULL; - - /* Enable the Rx DMA Stream/Channel */ - if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, - hspi->RxXferCount)) - { - /* Update SPI error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Enable Rx DMA Request */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); - - /* Set the SPI Tx DMA transfer complete callback as NULL because the communication closing - is performed in DMA reception complete callback */ - hspi->hdmatx->XferHalfCpltCallback = NULL; - hspi->hdmatx->XferCpltCallback = NULL; - hspi->hdmatx->XferErrorCallback = NULL; - hspi->hdmatx->XferAbortCallback = NULL; - - /* Enable the Tx DMA Stream/Channel */ - if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, - hspi->TxXferCount)) - { - /* Update SPI error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Enable the SPI Error Interrupt Bit */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); - - /* Enable Tx DMA Request */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); - - return HAL_OK; -} - -/** - * @brief Abort ongoing transfer (blocking mode). - * @param hspi SPI handle. - * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), - * started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable SPI Interrupts (depending of transfer direction) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) - * - Set handle State to READY - * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi) -{ - HAL_StatusTypeDef errorcode; - __IO uint32_t count; - __IO uint32_t resetcount; - - /* Initialized local variable */ - errorcode = HAL_OK; - resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - count = resetcount; - - /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); - - /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) - { - hspi->TxISR = SPI_AbortTx_ISR; - /* Wait HAL_SPI_STATE_ABORT state */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while (hspi->State != HAL_SPI_STATE_ABORT); - /* Reset Timeout Counter */ - count = resetcount; - } - - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) - { - hspi->RxISR = SPI_AbortRx_ISR; - /* Wait HAL_SPI_STATE_ABORT state */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while (hspi->State != HAL_SPI_STATE_ABORT); - /* Reset Timeout Counter */ - count = resetcount; - } - - /* Disable the SPI DMA Tx request if enabled */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) - { - /* Abort the SPI DMA Tx Stream/Channel : use blocking DMA Abort API (no callback) */ - if (hspi->hdmatx != NULL) - { - /* Set the SPI DMA Abort callback : - will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ - hspi->hdmatx->XferAbortCallback = NULL; - - /* Abort DMA Tx Handle linked to SPI Peripheral */ - if (HAL_DMA_Abort(hspi->hdmatx) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_ABORT; - } - - /* Disable Tx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN)); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - } - } - - /* Disable the SPI DMA Rx request if enabled */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) - { - /* Abort the SPI DMA Rx Stream/Channel : use blocking DMA Abort API (no callback) */ - if (hspi->hdmarx != NULL) - { - /* Set the SPI DMA Abort callback : - will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ - hspi->hdmarx->XferAbortCallback = NULL; - - /* Abort DMA Rx Handle linked to SPI Peripheral */ - if (HAL_DMA_Abort(hspi->hdmarx) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_ABORT; - } - - /* Disable peripheral */ - __HAL_SPI_DISABLE(hspi); - - /* Disable Rx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXDMAEN)); - } - } - /* Reset Tx and Rx transfer counters */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Check error during Abort procedure */ - if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT) - { - /* return HAL_Error in case of error during Abort procedure */ - errorcode = HAL_ERROR; - } - else - { - /* Reset errorCode */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - } - - /* Clear the Error flags in the SR register */ - __HAL_SPI_CLEAR_OVRFLAG(hspi); - __HAL_SPI_CLEAR_FREFLAG(hspi); - - /* Restore hspi->state to ready */ - hspi->State = HAL_SPI_STATE_READY; - - return errorcode; -} - -/** - * @brief Abort ongoing transfer (Interrupt mode). - * @param hspi SPI handle. - * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), - * started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable SPI Interrupts (depending of transfer direction) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) - * - Set handle State to READY - * - At abort completion, call user abort complete callback - * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be - * considered as completed only when user abort complete callback is executed (not when exiting function). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi) -{ - HAL_StatusTypeDef errorcode; - uint32_t abortcplt ; - __IO uint32_t count; - __IO uint32_t resetcount; - - /* Initialized local variable */ - errorcode = HAL_OK; - abortcplt = 1U; - resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - count = resetcount; - - /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); - - /* Change Rx and Tx Irq Handler to Disable TXEIE, RXNEIE and ERRIE interrupts */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) - { - hspi->TxISR = SPI_AbortTx_ISR; - /* Wait HAL_SPI_STATE_ABORT state */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while (hspi->State != HAL_SPI_STATE_ABORT); - /* Reset Timeout Counter */ - count = resetcount; - } - - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) - { - hspi->RxISR = SPI_AbortRx_ISR; - /* Wait HAL_SPI_STATE_ABORT state */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while (hspi->State != HAL_SPI_STATE_ABORT); - /* Reset Timeout Counter */ - count = resetcount; - } - - /* If DMA Tx and/or DMA Rx Handles are associated to SPI Handle, DMA Abort complete callbacks should be initialised - before any call to DMA Abort functions */ - /* DMA Tx Handle is valid */ - if (hspi->hdmatx != NULL) - { - /* Set DMA Abort Complete callback if UART DMA Tx request if enabled. - Otherwise, set it to NULL */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) - { - hspi->hdmatx->XferAbortCallback = SPI_DMATxAbortCallback; - } - else - { - hspi->hdmatx->XferAbortCallback = NULL; - } - } - /* DMA Rx Handle is valid */ - if (hspi->hdmarx != NULL) - { - /* Set DMA Abort Complete callback if UART DMA Rx request if enabled. - Otherwise, set it to NULL */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) - { - hspi->hdmarx->XferAbortCallback = SPI_DMARxAbortCallback; - } - else - { - hspi->hdmarx->XferAbortCallback = NULL; - } - } - - /* Disable the SPI DMA Tx request if enabled */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) - { - /* Abort the SPI DMA Tx Stream/Channel */ - if (hspi->hdmatx != NULL) - { - /* Abort DMA Tx Handle linked to SPI Peripheral */ - if (HAL_DMA_Abort_IT(hspi->hdmatx) != HAL_OK) - { - hspi->hdmatx->XferAbortCallback = NULL; - hspi->ErrorCode = HAL_SPI_ERROR_ABORT; - } - else - { - abortcplt = 0U; - } - } - } - /* Disable the SPI DMA Rx request if enabled */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) - { - /* Abort the SPI DMA Rx Stream/Channel */ - if (hspi->hdmarx != NULL) - { - /* Abort DMA Rx Handle linked to SPI Peripheral */ - if (HAL_DMA_Abort_IT(hspi->hdmarx) != HAL_OK) - { - hspi->hdmarx->XferAbortCallback = NULL; - hspi->ErrorCode = HAL_SPI_ERROR_ABORT; - } - else - { - abortcplt = 0U; - } - } - } - - if (abortcplt == 1U) - { - /* Reset Tx and Rx transfer counters */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Check error during Abort procedure */ - if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT) - { - /* return HAL_Error in case of error during Abort procedure */ - errorcode = HAL_ERROR; - } - else - { - /* Reset errorCode */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - } - - /* Clear the Error flags in the SR register */ - __HAL_SPI_CLEAR_OVRFLAG(hspi); - __HAL_SPI_CLEAR_FREFLAG(hspi); - - /* Restore hspi->State to Ready */ - hspi->State = HAL_SPI_STATE_READY; - - /* As no DMA to be aborted, call directly user Abort complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->AbortCpltCallback(hspi); -#else - HAL_SPI_AbortCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - - return errorcode; -} - -/** - * @brief Pause the DMA Transfer. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi) -{ - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Disable the SPI DMA Tx & Rx requests */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_OK; -} - -/** - * @brief Resume the DMA Transfer. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi) -{ - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Enable the SPI DMA Tx & Rx requests */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_OK; -} - -/** - * @brief Stop the DMA Transfer. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi) -{ - HAL_StatusTypeDef errorcode = HAL_OK; - /* The Lock is not implemented on this API to allow the user application - to call the HAL SPI API under callbacks HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback(): - when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated - and the correspond call back is executed HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback() - */ - - /* Abort the SPI DMA tx Stream/Channel */ - if (hspi->hdmatx != NULL) - { - if (HAL_OK != HAL_DMA_Abort(hspi->hdmatx)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - errorcode = HAL_ERROR; - } - } - /* Abort the SPI DMA rx Stream/Channel */ - if (hspi->hdmarx != NULL) - { - if (HAL_OK != HAL_DMA_Abort(hspi->hdmarx)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - errorcode = HAL_ERROR; - } - } - - /* Disable the SPI DMA Tx & Rx requests */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - hspi->State = HAL_SPI_STATE_READY; - return errorcode; -} - -/** - * @brief Handle SPI interrupt request. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval None - */ -void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi) -{ - uint32_t itsource = hspi->Instance->CR2; - uint32_t itflag = hspi->Instance->SR; - - /* SPI in mode Receiver ----------------------------------------------------*/ - if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) == RESET) && - (SPI_CHECK_FLAG(itflag, SPI_FLAG_RXNE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_RXNE) != RESET)) - { - hspi->RxISR(hspi); - return; - } - - /* SPI in mode Transmitter -------------------------------------------------*/ - if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_TXE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_TXE) != RESET)) - { - hspi->TxISR(hspi); - return; - } - - /* SPI in Error Treatment --------------------------------------------------*/ - if (((SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) || (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET) - || (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_ERR) != RESET)) - { - /* SPI Overrun error interrupt occurred ----------------------------------*/ - if (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET) - { - if (hspi->State != HAL_SPI_STATE_BUSY_TX) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_OVR); - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - else - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - return; - } - } - - /* SPI Mode Fault error interrupt occurred -------------------------------*/ - if (SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_MODF); - __HAL_SPI_CLEAR_MODFFLAG(hspi); - } - - /* SPI Frame error interrupt occurred ------------------------------------*/ - if (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FRE); - __HAL_SPI_CLEAR_FREFLAG(hspi); - } - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Disable all interrupts */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE | SPI_IT_TXE | SPI_IT_ERR); - - hspi->State = HAL_SPI_STATE_READY; - /* Disable the SPI DMA requests if enabled */ - if ((HAL_IS_BIT_SET(itsource, SPI_CR2_TXDMAEN)) || (HAL_IS_BIT_SET(itsource, SPI_CR2_RXDMAEN))) - { - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN)); - - /* Abort the SPI DMA Rx channel */ - if (hspi->hdmarx != NULL) - { - /* Set the SPI DMA Abort callback : - will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */ - hspi->hdmarx->XferAbortCallback = SPI_DMAAbortOnError; - if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmarx)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - } - } - /* Abort the SPI DMA Tx channel */ - if (hspi->hdmatx != NULL) - { - /* Set the SPI DMA Abort callback : - will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */ - hspi->hdmatx->XferAbortCallback = SPI_DMAAbortOnError; - if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmatx)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - } - } - } - else - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - } - return; - } -} - -/** - * @brief Tx Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_TxCpltCallback should be implemented in the user file - */ -} - -/** - * @brief Rx Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_RxCpltCallback should be implemented in the user file - */ -} - -/** - * @brief Tx and Rx Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_TxRxCpltCallback should be implemented in the user file - */ -} - -/** - * @brief Tx Half Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_TxHalfCpltCallback should be implemented in the user file - */ -} - -/** - * @brief Rx Half Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_RxHalfCpltCallback() should be implemented in the user file - */ -} - -/** - * @brief Tx and Rx Half Transfer callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_TxRxHalfCpltCallback() should be implemented in the user file - */ -} - -/** - * @brief SPI error callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_ErrorCallback should be implemented in the user file - */ - /* NOTE : The ErrorCode parameter in the hspi handle is updated by the SPI processes - and user can use HAL_SPI_GetError() API to check the latest error occurred - */ -} - -/** - * @brief SPI Abort Complete callback. - * @param hspi SPI handle. - * @retval None - */ -__weak void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_AbortCpltCallback can be implemented in the user file. - */ -} - -/** - * @} - */ - -/** @defgroup SPI_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief SPI control functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the SPI. - (+) HAL_SPI_GetState() API can be helpful to check in run-time the state of the SPI peripheral - (+) HAL_SPI_GetError() check in run-time Errors occurring during communication -@endverbatim - * @{ - */ - -/** - * @brief Return the SPI handle state. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval SPI state - */ -HAL_SPI_StateTypeDef HAL_SPI_GetState(const SPI_HandleTypeDef *hspi) -{ - /* Return SPI handle state */ - return hspi->State; -} - -/** - * @brief Return the SPI error code. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval SPI error code in bitmap format - */ -uint32_t HAL_SPI_GetError(const SPI_HandleTypeDef *hspi) -{ - /* Return SPI ErrorCode */ - return hspi->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup SPI_Private_Functions - * @brief Private functions - * @{ - */ - -/** - * @brief DMA SPI transmit process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - uint32_t tickstart; - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* DMA Normal Mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != DMA_SxCR_CIRC) - { - /* Disable ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); - - /* Disable Tx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Clear overrun flag in 2 Lines communication mode because received data is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - hspi->TxXferCount = 0U; - hspi->State = HAL_SPI_STATE_READY; - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - return; - } - } - /* Call user Tx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxCpltCallback(hspi); -#else - HAL_SPI_TxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI receive process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - uint32_t tickstart; -#if (USE_SPI_CRC != 0U) - __IO uint32_t tmpreg = 0U; -#endif /* USE_SPI_CRC */ - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* DMA Normal Mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != DMA_SxCR_CIRC) - { - /* Disable ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); - -#if (USE_SPI_CRC != 0U) - /* CRC handling */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Wait until RXNE flag */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - /* Error on the CRC reception */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - } - /* Read CRC */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - } -#endif /* USE_SPI_CRC */ - - /* Check if we are in Master RX 2 line mode */ - if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) - { - /* Disable Rx/Tx DMA Request (done by default to handle the case master rx direction 2 lines) */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - } - else - { - /* Normal case */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); - } - - /* Check the end of the transaction */ - if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_FLAG; - } - - hspi->RxXferCount = 0U; - hspi->State = HAL_SPI_STATE_READY; - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - } -#endif /* USE_SPI_CRC */ - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - return; - } - } - /* Call user Rx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->RxCpltCallback(hspi); -#else - HAL_SPI_RxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI transmit receive process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - uint32_t tickstart; -#if (USE_SPI_CRC != 0U) - __IO uint32_t tmpreg = 0U; -#endif /* USE_SPI_CRC */ - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* DMA Normal Mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != DMA_SxCR_CIRC) - { - /* Disable ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); - -#if (USE_SPI_CRC != 0U) - /* CRC handling */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Wait the CRC data */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - } - /* Read CRC to Flush DR and RXNE flag */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - } -#endif /* USE_SPI_CRC */ - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Disable Rx/Tx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - - hspi->TxXferCount = 0U; - hspi->RxXferCount = 0U; - hspi->State = HAL_SPI_STATE_READY; - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - } -#endif /* USE_SPI_CRC */ - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - return; - } - } - /* Call user TxRx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxRxCpltCallback(hspi); -#else - HAL_SPI_TxRxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI half transmit process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - - /* Call user Tx half complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxHalfCpltCallback(hspi); -#else - HAL_SPI_TxHalfCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI half receive process complete callback - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - - /* Call user Rx half complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->RxHalfCpltCallback(hspi); -#else - HAL_SPI_RxHalfCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI half transmit receive process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - - /* Call user TxRx half complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxRxHalfCpltCallback(hspi); -#else - HAL_SPI_TxRxHalfCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI communication error callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAError(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - - /* Stop the disable DMA transfer on SPI side */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - hspi->State = HAL_SPI_STATE_READY; - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI communication abort callback, when initiated by HAL services on Error - * (To be called at end of DMA Abort procedure following error occurrence). - * @param hdma DMA handle. - * @retval None - */ -static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI Tx communication abort callback, when initiated by user - * (To be called at end of DMA Tx Abort procedure following user abort request). - * @note When this callback is executed, User Abort complete call back is called only if no - * Abort still ongoing for Rx DMA Handle. - * @param hdma DMA handle. - * @retval None - */ -static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - __IO uint32_t count; - - hspi->hdmatx->XferAbortCallback = NULL; - count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - - /* Disable Tx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - - /* Check if an Abort process is still ongoing */ - if (hspi->hdmarx != NULL) - { - if (hspi->hdmarx->XferAbortCallback != NULL) - { - return; - } - } - - /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Check no error during Abort procedure */ - if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT) - { - /* Reset errorCode */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - } - - /* Clear the Error flags in the SR register */ - __HAL_SPI_CLEAR_OVRFLAG(hspi); - __HAL_SPI_CLEAR_FREFLAG(hspi); - - /* Restore hspi->State to Ready */ - hspi->State = HAL_SPI_STATE_READY; - - /* Call user Abort complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->AbortCpltCallback(hspi); -#else - HAL_SPI_AbortCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI Rx communication abort callback, when initiated by user - * (To be called at end of DMA Rx Abort procedure following user abort request). - * @note When this callback is executed, User Abort complete call back is called only if no - * Abort still ongoing for Tx DMA Handle. - * @param hdma DMA handle. - * @retval None - */ -static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ - - /* Disable SPI Peripheral */ - __HAL_SPI_DISABLE(hspi); - - hspi->hdmarx->XferAbortCallback = NULL; - - /* Disable Rx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); - - /* Check Busy flag */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - } - - /* Check if an Abort process is still ongoing */ - if (hspi->hdmatx != NULL) - { - if (hspi->hdmatx->XferAbortCallback != NULL) - { - return; - } - } - - /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Check no error during Abort procedure */ - if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT) - { - /* Reset errorCode */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - } - - /* Clear the Error flags in the SR register */ - __HAL_SPI_CLEAR_OVRFLAG(hspi); - __HAL_SPI_CLEAR_FREFLAG(hspi); - - /* Restore hspi->State to Ready */ - hspi->State = HAL_SPI_STATE_READY; - - /* Call user Abort complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->AbortCpltCallback(hspi); -#else - HAL_SPI_AbortCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi) -{ - /* Receive data in 8bit mode */ - *hspi->pRxBuffPtr = *((__IO uint8_t *)&hspi->Instance->DR); - hspi->pRxBuffPtr++; - hspi->RxXferCount--; - - /* Check end of the reception */ - if (hspi->RxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->RxISR = SPI_2linesRxISR_8BITCRC; - return; - } -#endif /* USE_SPI_CRC */ - - /* Disable RXNE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - if (hspi->TxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } - } -} - -#if (USE_SPI_CRC != 0U) -/** - * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi) -{ - __IO uint8_t *ptmpreg8; - __IO uint8_t tmpreg8 = 0; - - /* Initialize the 8bit temporary pointer */ - ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; - /* Read 8bit CRC to flush Data Register */ - tmpreg8 = *ptmpreg8; - /* To avoid GCC warning */ - UNUSED(tmpreg8); - - /* Disable RXNE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - if (hspi->TxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } -} -#endif /* USE_SPI_CRC */ - -/** - * @brief Tx 8-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi) -{ - *(__IO uint8_t *)&hspi->Instance->DR = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr++; - hspi->TxXferCount--; - - /* Check the end of the transmission */ - if (hspi->TxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Set CRC Next Bit to send CRC */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - /* Disable TXE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); - return; - } -#endif /* USE_SPI_CRC */ - - /* Disable TXE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); - - if (hspi->RxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } - } -} - -/** - * @brief Rx 16-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi) -{ - /* Receive data in 16 Bit mode */ - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); - hspi->pRxBuffPtr += sizeof(uint16_t); - hspi->RxXferCount--; - - if (hspi->RxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->RxISR = SPI_2linesRxISR_16BITCRC; - return; - } -#endif /* USE_SPI_CRC */ - - /* Disable RXNE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE); - - if (hspi->TxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } - } -} - -#if (USE_SPI_CRC != 0U) -/** - * @brief Manage the CRC 16-bit receive for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi) -{ - __IO uint32_t tmpreg = 0U; - - /* Read 16bit CRC to flush Data Register */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - - /* Disable RXNE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE); - - SPI_CloseRxTx_ISR(hspi); -} -#endif /* USE_SPI_CRC */ - -/** - * @brief Tx 16-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi) -{ - /* Transmit data in 16 Bit mode */ - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - - /* Enable CRC Transmission */ - if (hspi->TxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Set CRC Next Bit to send CRC */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - /* Disable TXE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); - return; - } -#endif /* USE_SPI_CRC */ - - /* Disable TXE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); - - if (hspi->RxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } - } -} - -#if (USE_SPI_CRC != 0U) -/** - * @brief Manage the CRC 8-bit receive in Interrupt context. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi) -{ - __IO uint8_t *ptmpreg8; - __IO uint8_t tmpreg8 = 0; - - /* Initialize the 8bit temporary pointer */ - ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; - /* Read 8bit CRC to flush Data Register */ - tmpreg8 = *ptmpreg8; - /* To avoid GCC warning */ - UNUSED(tmpreg8); - - SPI_CloseRx_ISR(hspi); -} -#endif /* USE_SPI_CRC */ - -/** - * @brief Manage the receive 8-bit in Interrupt context. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi) -{ - *hspi->pRxBuffPtr = (*(__IO uint8_t *)&hspi->Instance->DR); - hspi->pRxBuffPtr++; - hspi->RxXferCount--; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - - if (hspi->RxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->RxISR = SPI_RxISR_8BITCRC; - return; - } -#endif /* USE_SPI_CRC */ - SPI_CloseRx_ISR(hspi); - } -} - -#if (USE_SPI_CRC != 0U) -/** - * @brief Manage the CRC 16-bit receive in Interrupt context. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi) -{ - __IO uint32_t tmpreg = 0U; - - /* Read 16bit CRC to flush Data Register */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - - /* Disable RXNE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - SPI_CloseRx_ISR(hspi); -} -#endif /* USE_SPI_CRC */ - -/** - * @brief Manage the 16-bit receive in Interrupt context. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi) -{ - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); - hspi->pRxBuffPtr += sizeof(uint16_t); - hspi->RxXferCount--; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - - if (hspi->RxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->RxISR = SPI_RxISR_16BITCRC; - return; - } -#endif /* USE_SPI_CRC */ - SPI_CloseRx_ISR(hspi); - } -} - -/** - * @brief Handle the data 8-bit transmit in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi) -{ - *(__IO uint8_t *)&hspi->Instance->DR = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr++; - hspi->TxXferCount--; - - if (hspi->TxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Enable CRC Transmission */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - SPI_CloseTx_ISR(hspi); - } -} - -/** - * @brief Handle the data 16-bit transmit in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi) -{ - /* Transmit data in 16 Bit mode */ - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - - if (hspi->TxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Enable CRC Transmission */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - SPI_CloseTx_ISR(hspi); - } -} - -/** - * @brief Handle SPI Communication Timeout. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param Flag SPI flag to check - * @param State flag state to check - * @param Timeout Timeout duration - * @param Tickstart tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State, - uint32_t Timeout, uint32_t Tickstart) -{ - __IO uint32_t count; - uint32_t tmp_timeout; - uint32_t tmp_tickstart; - - /* Adjust Timeout value in case of end of transfer */ - tmp_timeout = Timeout - (HAL_GetTick() - Tickstart); - tmp_tickstart = HAL_GetTick(); - - /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */ - count = tmp_timeout * ((SystemCoreClock * 32U) >> 20U); - - while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) != State) - { - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U)) - { - /* Disable the SPI and reset the CRC: the CRC value should be cleared - on both master and slave sides in order to resynchronize the master - and slave for their respective CRC calculation */ - - /* Disable TXE, RXNE and ERR interrupts for the interrupt process */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); - - if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) - || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) - { - /* Disable SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - } - - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - hspi->State = HAL_SPI_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_TIMEOUT; - } - /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop procedure */ - if (count == 0U) - { - tmp_timeout = 0U; - } - count--; - } - } - - return HAL_OK; -} - -/** - * @brief Handle the check of the RX transaction complete. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param Timeout Timeout duration - * @param Tickstart tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart) -{ - if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) - || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) - { - /* Disable SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - } - - /* Erratasheet: BSY bit may stay high at the end of a data transfer in Slave mode */ - if (hspi->Init.Mode == SPI_MODE_MASTER) - { - if (hspi->Init.Direction != SPI_DIRECTION_2LINES_RXONLY) - { - /* Control the BSY flag */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - } - else - { - /* Wait the RXNE reset */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - } - } - else - { - /* Wait the RXNE reset */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Handle the check of the RXTX or TX transaction complete. - * @param hspi SPI handle - * @param Timeout Timeout duration - * @param Tickstart tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart) -{ - /* Wait until TXE flag */ - if(SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_TXE, SET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - - /* Timeout in µs */ - __IO uint32_t count = SPI_BSY_FLAG_WORKAROUND_TIMEOUT * (SystemCoreClock / 24U / 1000000U); - /* Erratasheet: BSY bit may stay high at the end of a data transfer in Slave mode */ - if (hspi->Init.Mode == SPI_MODE_MASTER) - { - /* Control the BSY flag */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - } - else - { - /* Wait BSY flag during 1 Byte time transfer in case of Full-Duplex and Tx transfer - * If Timeout is reached, the transfer is considered as finish. - * User have to calculate the timeout value to fit with the time of 1 byte transfer. - * This time is directly link with the SPI clock from Master device. - */ - do - { - if (count == 0U) - { - break; - } - count--; - } while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_BSY) != RESET); - } - - return HAL_OK; -} - -/** - * @brief Handle the end of the RXTX transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi) -{ - uint32_t tickstart; - __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - /* Disable ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) - { - hspi->State = HAL_SPI_STATE_READY; - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { -#endif /* USE_SPI_CRC */ - if (hspi->ErrorCode == HAL_SPI_ERROR_NONE) - { - if (hspi->State == HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_READY; - /* Call user Rx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->RxCpltCallback(hspi); -#else - HAL_SPI_RxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { - hspi->State = HAL_SPI_STATE_READY; - /* Call user TxRx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxRxCpltCallback(hspi); -#else - HAL_SPI_TxRxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - } - else - { - hspi->State = HAL_SPI_STATE_READY; - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } -#if (USE_SPI_CRC != 0U) - } -#endif /* USE_SPI_CRC */ -} - -/** - * @brief Handle the end of the RX transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi) -{ - /* Disable RXNE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - /* Check the end of the transaction */ - if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - hspi->State = HAL_SPI_STATE_READY; - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { -#endif /* USE_SPI_CRC */ - if (hspi->ErrorCode == HAL_SPI_ERROR_NONE) - { - /* Call user Rx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->RxCpltCallback(hspi); -#else - HAL_SPI_RxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } -#if (USE_SPI_CRC != 0U) - } -#endif /* USE_SPI_CRC */ -} - -/** - * @brief Handle the end of the TX transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi) -{ - uint32_t tickstart; - __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - - /* Disable TXE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - hspi->State = HAL_SPI_STATE_READY; - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { - /* Call user Rx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxCpltCallback(hspi); -#else - HAL_SPI_TxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } -} - -/** - * @brief Handle abort a Rx transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi) -{ - __IO uint32_t tmpreg = 0U; - __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - - /* Disable SPI Peripheral */ - __HAL_SPI_DISABLE(hspi); - - /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */ - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE | SPI_CR2_RXNEIE | SPI_CR2_ERRIE)); - - /* Flush Data Register by a blank read */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - - hspi->State = HAL_SPI_STATE_ABORT; -} - -/** - * @brief Handle abort a Tx or Rx/Tx transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi) -{ - /* Disable TXEIE interrupt */ - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE)); - - /* Disable SPI Peripheral */ - __HAL_SPI_DISABLE(hspi); - - hspi->State = HAL_SPI_STATE_ABORT; -} - -/** - * @} - */ - -#endif /* HAL_SPI_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c deleted file mode 100644 index d5978cc..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c +++ /dev/null @@ -1,7632 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim.c - * @author MCD Application Team - * @brief TIM HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Timer (TIM) peripheral: - * + TIM Time Base Initialization - * + TIM Time Base Start - * + TIM Time Base Start Interruption - * + TIM Time Base Start DMA - * + TIM Output Compare/PWM Initialization - * + TIM Output Compare/PWM Channel Configuration - * + TIM Output Compare/PWM Start - * + TIM Output Compare/PWM Start Interruption - * + TIM Output Compare/PWM Start DMA - * + TIM Input Capture Initialization - * + TIM Input Capture Channel Configuration - * + TIM Input Capture Start - * + TIM Input Capture Start Interruption - * + TIM Input Capture Start DMA - * + TIM One Pulse Initialization - * + TIM One Pulse Channel Configuration - * + TIM One Pulse Start - * + TIM Encoder Interface Initialization - * + TIM Encoder Interface Start - * + TIM Encoder Interface Start Interruption - * + TIM Encoder Interface Start DMA - * + Commutation Event configuration with Interruption and DMA - * + TIM OCRef clear configuration - * + TIM External Clock configuration - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### TIMER Generic features ##### - ============================================================================== - [..] The Timer features include: - (#) 16-bit up, down, up/down auto-reload counter. - (#) 16-bit programmable prescaler allowing dividing (also on the fly) the - counter clock frequency either by any factor between 1 and 65536. - (#) Up to 4 independent channels for: - (++) Input Capture - (++) Output Compare - (++) PWM generation (Edge and Center-aligned Mode) - (++) One-pulse mode output - (#) Synchronization circuit to control the timer with external signals and to interconnect - several timers together. - (#) Supports incremental encoder for positioning purposes - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Initialize the TIM low level resources by implementing the following functions - depending on the selected feature: - (++) Time Base : HAL_TIM_Base_MspInit() - (++) Input Capture : HAL_TIM_IC_MspInit() - (++) Output Compare : HAL_TIM_OC_MspInit() - (++) PWM generation : HAL_TIM_PWM_MspInit() - (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit() - (++) Encoder mode output : HAL_TIM_Encoder_MspInit() - - (#) Initialize the TIM low level resources : - (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); - (##) TIM pins configuration - (+++) Enable the clock for the TIM GPIOs using the following function: - __HAL_RCC_GPIOx_CLK_ENABLE(); - (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); - - (#) The external Clock can be configured, if needed (the default clock is the - internal clock from the APBx), using the following function: - HAL_TIM_ConfigClockSource, the clock configuration should be done before - any start function. - - (#) Configure the TIM in the desired functioning mode using one of the - Initialization function of this driver: - (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base - (++) HAL_TIM_OC_Init and HAL_TIM_OC_ConfigChannel: to use the Timer to generate an - Output Compare signal. - (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a - PWM signal. - (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an - external signal. - (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer - in One Pulse Mode. - (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface. - - (#) Activate the TIM peripheral using one of the start functions depending from the feature used: - (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT() - (++) Input Capture : HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT() - (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT() - (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT() - (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT() - (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT(). - - (#) The DMA Burst is managed with the two following functions: - HAL_TIM_DMABurst_WriteStart() - HAL_TIM_DMABurst_ReadStart() - - *** Callback registration *** - ============================================= - - [..] - The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - - [..] - Use Function HAL_TIM_RegisterCallback() to register a callback. - HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, - the Callback ID and a pointer to the user callback function. - - [..] - Use function HAL_TIM_UnRegisterCallback() to reset a callback to the default - weak function. - HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, - and the Callback ID. - - [..] - These functions allow to register/unregister following callbacks: - (+) Base_MspInitCallback : TIM Base Msp Init Callback. - (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. - (+) IC_MspInitCallback : TIM IC Msp Init Callback. - (+) IC_MspDeInitCallback : TIM IC Msp DeInit Callback. - (+) OC_MspInitCallback : TIM OC Msp Init Callback. - (+) OC_MspDeInitCallback : TIM OC Msp DeInit Callback. - (+) PWM_MspInitCallback : TIM PWM Msp Init Callback. - (+) PWM_MspDeInitCallback : TIM PWM Msp DeInit Callback. - (+) OnePulse_MspInitCallback : TIM One Pulse Msp Init Callback. - (+) OnePulse_MspDeInitCallback : TIM One Pulse Msp DeInit Callback. - (+) Encoder_MspInitCallback : TIM Encoder Msp Init Callback. - (+) Encoder_MspDeInitCallback : TIM Encoder Msp DeInit Callback. - (+) HallSensor_MspInitCallback : TIM Hall Sensor Msp Init Callback. - (+) HallSensor_MspDeInitCallback : TIM Hall Sensor Msp DeInit Callback. - (+) PeriodElapsedCallback : TIM Period Elapsed Callback. - (+) PeriodElapsedHalfCpltCallback : TIM Period Elapsed half complete Callback. - (+) TriggerCallback : TIM Trigger Callback. - (+) TriggerHalfCpltCallback : TIM Trigger half complete Callback. - (+) IC_CaptureCallback : TIM Input Capture Callback. - (+) IC_CaptureHalfCpltCallback : TIM Input Capture half complete Callback. - (+) OC_DelayElapsedCallback : TIM Output Compare Delay Elapsed Callback. - (+) PWM_PulseFinishedCallback : TIM PWM Pulse Finished Callback. - (+) PWM_PulseFinishedHalfCpltCallback : TIM PWM Pulse Finished half complete Callback. - (+) ErrorCallback : TIM Error Callback. - (+) CommutationCallback : TIM Commutation Callback. - (+) CommutationHalfCpltCallback : TIM Commutation half complete Callback. - (+) BreakCallback : TIM Break Callback. - - [..] -By default, after the Init and when the state is HAL_TIM_STATE_RESET -all interrupt callbacks are set to the corresponding weak functions: - examples HAL_TIM_TriggerCallback(), HAL_TIM_ErrorCallback(). - - [..] - Exception done for MspInit and MspDeInit functions that are reset to the legacy weak - functionalities in the Init / DeInit only when these callbacks are null - (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit - keep and use the user MspInit / MspDeInit callbacks(registered beforehand) - - [..] - Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. - Exception done MspInit / MspDeInit that can be registered / unregistered - in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, - thus registered(user) MspInit / DeInit callbacks can be used during the Init / DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using HAL_TIM_RegisterCallback() before calling DeInit or Init function. - - [..] - When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available and all callbacks - are set to the corresponding weak functions. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup TIM TIM - * @brief TIM HAL module driver - * @{ - */ - -#ifdef HAL_TIM_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup TIM_Private_Functions - * @{ - */ -static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); -static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); -static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); -static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); -static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); -static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource); -static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - const TIM_SlaveConfigTypeDef *sSlaveConfig); -/** - * @} - */ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup TIM_Exported_Functions TIM Exported Functions - * @{ - */ - -/** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * -@verbatim - ============================================================================== - ##### Time Base functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM base. - (+) De-initialize the TIM base. - (+) Start the Time Base. - (+) Stop the Time Base. - (+) Start the Time Base and enable interrupt. - (+) Stop the Time Base and disable interrupt. - (+) Start the Time Base and enable DMA transfer. - (+) Stop the Time Base and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Time base Unit according to the specified - * parameters in the TIM_HandleTypeDef and initialize the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_Base_DeInit() before HAL_TIM_Base_Init() - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->Base_MspInitCallback == NULL) - { - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->Base_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - HAL_TIM_Base_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Set the Time Base configuration */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM Base peripheral - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->Base_MspDeInitCallback == NULL) - { - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; - } - /* DeInit the low level hardware */ - htim->Base_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_Base_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Base MSP. - * @param htim TIM Base handle - * @retval None - */ -__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Base_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Base MSP. - * @param htim TIM Base handle - * @retval None - */ -__weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Base_MspDeInit could be implemented in the user file - */ -} - - -/** - * @brief Starts the TIM Base generation. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Check the TIM state */ - if (htim->State != HAL_TIM_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Base generation in interrupt mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Check the TIM state */ - if (htim->State != HAL_TIM_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Enable the TIM Update interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation in interrupt mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Disable the TIM Update interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Base generation in DMA mode. - * @param htim TIM Base handle - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, const uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - - /* Set the TIM state */ - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - return HAL_ERROR; - } - - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)pData, (uint32_t)&htim->Instance->ARR, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Update DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation in DMA mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_UPDATE); - - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * -@verbatim - ============================================================================== - ##### TIM Output Compare functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Output Compare. - (+) De-initialize the TIM Output Compare. - (+) Start the TIM Output Compare. - (+) Stop the TIM Output Compare. - (+) Start the TIM Output Compare and enable interrupt. - (+) Stop the TIM Output Compare and disable interrupt. - (+) Start the TIM Output Compare and enable DMA transfer. - (+) Stop the TIM Output Compare and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Output Compare according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_OC_DeInit() before HAL_TIM_OC_Init() - * @param htim TIM Output Compare handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->OC_MspInitCallback == NULL) - { - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->OC_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OC_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the Output Compare */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM Output Compare handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->OC_MspDeInitCallback == NULL) - { - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; - } - /* DeInit the low level hardware */ - htim->OC_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OC_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Output Compare MSP. - * @param htim TIM Output Compare handle - * @retval None - */ -__weak void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Output Compare MSP. - * @param htim TIM Output Compare handle - * @retval None - */ -__weak void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Output Compare signal generation. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in interrupt mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Output Compare signal generation in interrupt mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM Output Compare signal generation in DMA mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Set the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) - { - return HAL_BUSY; - } - else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Output Compare signal generation in DMA mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * -@verbatim - ============================================================================== - ##### TIM PWM functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM PWM. - (+) De-initialize the TIM PWM. - (+) Start the TIM PWM. - (+) Stop the TIM PWM. - (+) Start the TIM PWM and enable interrupt. - (+) Stop the TIM PWM and disable interrupt. - (+) Start the TIM PWM and enable DMA transfer. - (+) Stop the TIM PWM and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM PWM Time Base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_PWM_DeInit() before HAL_TIM_PWM_Init() - * @param htim TIM PWM handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->PWM_MspInitCallback == NULL) - { - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->PWM_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_PWM_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the PWM */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM PWM handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->PWM_MspDeInitCallback == NULL) - { - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; - } - /* DeInit the low level hardware */ - htim->PWM_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_PWM_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM PWM MSP. - * @param htim TIM PWM handle - * @retval None - */ -__weak void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM PWM MSP. - * @param htim TIM PWM handle - * @retval None - */ -__weak void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the PWM signal generation. - * @param htim TIM handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the PWM signal generation in interrupt mode. - * @param htim TIM PWM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the PWM signal generation in interrupt mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM PWM signal generation in DMA mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Set the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) - { - return HAL_BUSY; - } - else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Output Capture/Compare 3 request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM PWM signal generation in DMA mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * -@verbatim - ============================================================================== - ##### TIM Input Capture functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Input Capture. - (+) De-initialize the TIM Input Capture. - (+) Start the TIM Input Capture. - (+) Stop the TIM Input Capture. - (+) Start the TIM Input Capture and enable interrupt. - (+) Stop the TIM Input Capture and disable interrupt. - (+) Start the TIM Input Capture and enable DMA transfer. - (+) Stop the TIM Input Capture and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Input Capture Time base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_IC_DeInit() before HAL_TIM_IC_Init() - * @param htim TIM Input Capture handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->IC_MspInitCallback == NULL) - { - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->IC_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_IC_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the input capture */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM Input Capture handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->IC_MspDeInitCallback == NULL) - { - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; - } - /* DeInit the low level hardware */ - htim->IC_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_IC_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Input Capture MSP. - * @param htim TIM Input Capture handle - * @retval None - */ -__weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Input Capture MSP. - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Input Capture measurement. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); - HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if ((channel_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Input Capture measurement. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Input Capture measurement in interrupt mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); - HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if ((channel_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Input Capture measurement in interrupt mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM Input Capture measurement in DMA mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The destination Buffer address. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); - HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - /* Set the TIM channel state */ - if ((channel_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->CCR3, (uint32_t)pData, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->CCR4, (uint32_t)pData, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Input Capture measurement in DMA mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * -@verbatim - ============================================================================== - ##### TIM One Pulse functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM One Pulse. - (+) De-initialize the TIM One Pulse. - (+) Start the TIM One Pulse. - (+) Stop the TIM One Pulse. - (+) Start the TIM One Pulse and enable interrupt. - (+) Stop the TIM One Pulse and disable interrupt. - (+) Start the TIM One Pulse and enable DMA transfer. - (+) Stop the TIM One Pulse and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM One Pulse Time Base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_OnePulse_DeInit() before HAL_TIM_OnePulse_Init() - * @note When the timer instance is initialized in One Pulse mode, timer - * channels 1 and channel 2 are reserved and cannot be used for other - * purpose. - * @param htim TIM One Pulse handle - * @param OnePulseMode Select the One pulse mode. - * This parameter can be one of the following values: - * @arg TIM_OPMODE_SINGLE: Only one pulse will be generated. - * @arg TIM_OPMODE_REPETITIVE: Repetitive pulses will be generated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_OPM_MODE(OnePulseMode)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->OnePulse_MspInitCallback == NULL) - { - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->OnePulse_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OnePulse_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Configure the Time base in the One Pulse Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Reset the OPM Bit */ - htim->Instance->CR1 &= ~TIM_CR1_OPM; - - /* Configure the OPM Mode */ - htim->Instance->CR1 |= OnePulseMode; - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM One Pulse - * @param htim TIM One Pulse handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->OnePulse_MspDeInitCallback == NULL) - { - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; - } - /* DeInit the low level hardware */ - htim->OnePulse_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_OnePulse_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM One Pulse MSP. - * @param htim TIM One Pulse handle - * @retval None - */ -__weak void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OnePulse_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM One Pulse MSP. - * @param htim TIM One Pulse handle - * @retval None - */ -__weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OnePulse_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM One Pulse signal generation. - * @note Though OutputChannel parameter is deprecated and ignored by the function - * it has been kept to avoid HAL_TIM API compatibility break. - * @note The pulse output channel is determined when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel See note above - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together - - No need to enable the counter, it's enabled automatically by hardware - (the counter starts in response to a stimulus and generate a pulse */ - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation. - * @note Though OutputChannel parameter is deprecated and ignored by the function - * it has been kept to avoid HAL_TIM API compatibility break. - * @note The pulse output channel is determined when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel See note above - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Disable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM One Pulse signal generation in interrupt mode. - * @note Though OutputChannel parameter is deprecated and ignored by the function - * it has been kept to avoid HAL_TIM API compatibility break. - * @note The pulse output channel is determined when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel See note above - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together - - No need to enable the counter, it's enabled automatically by hardware - (the counter starts in response to a stimulus and generate a pulse */ - - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation in interrupt mode. - * @note Though OutputChannel parameter is deprecated and ignored by the function - * it has been kept to avoid HAL_TIM API compatibility break. - * @note The pulse output channel is determined when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel See note above - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - - /* Disable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * -@verbatim - ============================================================================== - ##### TIM Encoder functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Encoder. - (+) De-initialize the TIM Encoder. - (+) Start the TIM Encoder. - (+) Stop the TIM Encoder. - (+) Start the TIM Encoder and enable interrupt. - (+) Stop the TIM Encoder and disable interrupt. - (+) Start the TIM Encoder and enable DMA transfer. - (+) Stop the TIM Encoder and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Encoder Interface and initialize the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_Encoder_DeInit() before HAL_TIM_Encoder_Init() - * @note Encoder mode and External clock mode 2 are not compatible and must not be selected together - * Ex: A call for @ref HAL_TIM_Encoder_Init will erase the settings of @ref HAL_TIM_ConfigClockSource - * using TIM_CLOCKSOURCE_ETRMODE2 and vice versa - * @note When the timer instance is initialized in Encoder mode, timer - * channels 1 and channel 2 are reserved and cannot be used for other - * purpose. - * @param htim TIM Encoder Interface handle - * @param sConfig TIM Encoder Interface configuration structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, const TIM_Encoder_InitTypeDef *sConfig) -{ - uint32_t tmpsmcr; - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); - assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); - assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC2Filter)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->Encoder_MspInitCallback == NULL) - { - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->Encoder_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_Encoder_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Reset the SMS and ECE bits */ - htim->Instance->SMCR &= ~(TIM_SMCR_SMS | TIM_SMCR_ECE); - - /* Configure the Time base in the Encoder Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = htim->Instance->CCMR1; - - /* Get the TIMx CCER register value */ - tmpccer = htim->Instance->CCER; - - /* Set the encoder Mode */ - tmpsmcr |= sConfig->EncoderMode; - - /* Select the Capture Compare 1 and the Capture Compare 2 as input */ - tmpccmr1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S); - tmpccmr1 |= (sConfig->IC1Selection | (sConfig->IC2Selection << 8U)); - - /* Set the Capture Compare 1 and the Capture Compare 2 prescalers and filters */ - tmpccmr1 &= ~(TIM_CCMR1_IC1PSC | TIM_CCMR1_IC2PSC); - tmpccmr1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC2F); - tmpccmr1 |= sConfig->IC1Prescaler | (sConfig->IC2Prescaler << 8U); - tmpccmr1 |= (sConfig->IC1Filter << 4U) | (sConfig->IC2Filter << 12U); - - /* Set the TI1 and the TI2 Polarities */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); - tmpccer &= ~(TIM_CCER_CC1NP | TIM_CCER_CC2NP); - tmpccer |= sConfig->IC1Polarity | (sConfig->IC2Polarity << 4U); - - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - - /* Write to TIMx CCMR1 */ - htim->Instance->CCMR1 = tmpccmr1; - - /* Write to TIMx CCER */ - htim->Instance->CCER = tmpccer; - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - - -/** - * @brief DeInitializes the TIM Encoder interface - * @param htim TIM Encoder Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->Encoder_MspDeInitCallback == NULL) - { - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; - } - /* DeInit the low level hardware */ - htim->Encoder_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_Encoder_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Encoder Interface MSP. - * @param htim TIM Encoder Interface handle - * @retval None - */ -__weak void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Encoder_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Encoder Interface MSP. - * @param htim TIM Encoder Interface handle - * @retval None - */ -__weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Encoder_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Encoder Interface. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Set the TIM channel(s) state */ - if (Channel == TIM_CHANNEL_1) - { - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else if (Channel == TIM_CHANNEL_2) - { - if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - - /* Enable the encoder interface channels */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - } - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - break; - } - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel(s) state */ - if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Encoder Interface in interrupt mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Set the TIM channel(s) state */ - if (Channel == TIM_CHANNEL_1) - { - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else if (Channel == TIM_CHANNEL_2) - { - if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - - /* Enable the encoder interface channels */ - /* Enable the capture compare Interrupts 1 and/or 2 */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - } - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface in interrupt mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - if (Channel == TIM_CHANNEL_1) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 1 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - } - else if (Channel == TIM_CHANNEL_2) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 2 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - else - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 1 and 2 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel(s) state */ - if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Encoder Interface in DMA mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @param pData1 The destination Buffer address for IC1. - * @param pData2 The destination Buffer address for IC2. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, - uint32_t *pData2, uint16_t Length) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Set the TIM channel(s) state */ - if (Channel == TIM_CHANNEL_1) - { - if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((pData1 == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - } - else if (Channel == TIM_CHANNEL_2) - { - if ((channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_2_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((pData2 == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - } - else - { - if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) - && (channel_2_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((((pData1 == NULL) || (pData2 == NULL))) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError; - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - break; - } - - default: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - break; - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface in DMA mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - if (Channel == TIM_CHANNEL_1) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 1 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - } - else if (Channel == TIM_CHANNEL_2) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 2 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - } - else - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 1 and 2 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel(s) state */ - if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ -/** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief TIM IRQ handler management - * -@verbatim - ============================================================================== - ##### IRQ handler management ##### - ============================================================================== - [..] - This section provides Timer IRQ handler function. - -@endverbatim - * @{ - */ -/** - * @brief This function handles TIM interrupts requests. - * @param htim TIM handle - * @retval None - */ -void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) -{ - uint32_t itsource = htim->Instance->DIER; - uint32_t itflag = htim->Instance->SR; - - /* Capture compare 1 event */ - if ((itflag & (TIM_FLAG_CC1)) == (TIM_FLAG_CC1)) - { - if ((itsource & (TIM_IT_CC1)) == (TIM_IT_CC1)) - { - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC1); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - /* Input capture event */ - if ((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - } - /* Capture compare 2 event */ - if ((itflag & (TIM_FLAG_CC2)) == (TIM_FLAG_CC2)) - { - if ((itsource & (TIM_IT_CC2)) == (TIM_IT_CC2)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC2); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - /* Input capture event */ - if ((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* Capture compare 3 event */ - if ((itflag & (TIM_FLAG_CC3)) == (TIM_FLAG_CC3)) - { - if ((itsource & (TIM_IT_CC3)) == (TIM_IT_CC3)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC3); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - /* Input capture event */ - if ((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* Capture compare 4 event */ - if ((itflag & (TIM_FLAG_CC4)) == (TIM_FLAG_CC4)) - { - if ((itsource & (TIM_IT_CC4)) == (TIM_IT_CC4)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC4); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - /* Input capture event */ - if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* TIM Update event */ - if ((itflag & (TIM_FLAG_UPDATE)) == (TIM_FLAG_UPDATE)) - { - if ((itsource & (TIM_IT_UPDATE)) == (TIM_IT_UPDATE)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_UPDATE); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedCallback(htim); -#else - HAL_TIM_PeriodElapsedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM Break input event */ - if ((itflag & (TIM_FLAG_BREAK)) == (TIM_FLAG_BREAK)) - { - if ((itsource & (TIM_IT_BREAK)) == (TIM_IT_BREAK)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_BREAK); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->BreakCallback(htim); -#else - HAL_TIMEx_BreakCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM Trigger detection event */ - if ((itflag & (TIM_FLAG_TRIGGER)) == (TIM_FLAG_TRIGGER)) - { - if ((itsource & (TIM_IT_TRIGGER)) == (TIM_IT_TRIGGER)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_TRIGGER); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerCallback(htim); -#else - HAL_TIM_TriggerCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM commutation event */ - if ((itflag & (TIM_FLAG_COM)) == (TIM_FLAG_COM)) - { - if ((itsource & (TIM_IT_COM)) == (TIM_IT_COM)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_COM); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationCallback(htim); -#else - HAL_TIMEx_CommutCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief TIM Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Configure The Input Output channels for OC, PWM, IC or One Pulse mode. - (+) Configure External Clock source. - (+) Configure Complementary channels, break features and dead time. - (+) Configure Master and the Slave synchronization. - (+) Configure the DMA Burst Mode. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the TIM Output Compare Channels according to the specified - * parameters in the TIM_OC_InitTypeDef. - * @param htim TIM Output Compare handle - * @param sConfig TIM Output Compare configuration structure - * @param Channel TIM Channels to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, - const TIM_OC_InitTypeDef *sConfig, - uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CHANNELS(Channel)); - assert_param(IS_TIM_OC_MODE(sConfig->OCMode)); - assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); - - /* Process Locked */ - __HAL_LOCK(htim); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 1 in Output Compare */ - TIM_OC1_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 2 in Output Compare */ - TIM_OC2_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 3 in Output Compare */ - TIM_OC3_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 4 in Output Compare */ - TIM_OC4_SetConfig(htim->Instance, sConfig); - break; - } - - default: - status = HAL_ERROR; - break; - } - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Initializes the TIM Input Capture Channels according to the specified - * parameters in the TIM_IC_InitTypeDef. - * @param htim TIM IC handle - * @param sConfig TIM Input Capture configuration structure - * @param Channel TIM Channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_IC_InitTypeDef *sConfig, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_IC_POLARITY(sConfig->ICPolarity)); - assert_param(IS_TIM_IC_SELECTION(sConfig->ICSelection)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->ICPrescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->ICFilter)); - - /* Process Locked */ - __HAL_LOCK(htim); - - if (Channel == TIM_CHANNEL_1) - { - /* TI1 Configuration */ - TIM_TI1_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - - /* Set the IC1PSC value */ - htim->Instance->CCMR1 |= sConfig->ICPrescaler; - } - else if (Channel == TIM_CHANNEL_2) - { - /* TI2 Configuration */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_TI2_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC2PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; - - /* Set the IC2PSC value */ - htim->Instance->CCMR1 |= (sConfig->ICPrescaler << 8U); - } - else if (Channel == TIM_CHANNEL_3) - { - /* TI3 Configuration */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - TIM_TI3_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC3PSC Bits */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC; - - /* Set the IC3PSC value */ - htim->Instance->CCMR2 |= sConfig->ICPrescaler; - } - else if (Channel == TIM_CHANNEL_4) - { - /* TI4 Configuration */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - TIM_TI4_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC4PSC Bits */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC; - - /* Set the IC4PSC value */ - htim->Instance->CCMR2 |= (sConfig->ICPrescaler << 8U); - } - else - { - status = HAL_ERROR; - } - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Initializes the TIM PWM channels according to the specified - * parameters in the TIM_OC_InitTypeDef. - * @param htim TIM PWM handle - * @param sConfig TIM PWM configuration structure - * @param Channel TIM Channels to be configured - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, - const TIM_OC_InitTypeDef *sConfig, - uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CHANNELS(Channel)); - assert_param(IS_TIM_PWM_MODE(sConfig->OCMode)); - assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); - assert_param(IS_TIM_FAST_STATE(sConfig->OCFastMode)); - - /* Process Locked */ - __HAL_LOCK(htim); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Configure the Channel 1 in PWM mode */ - TIM_OC1_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel1 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE; - htim->Instance->CCMR1 |= sConfig->OCFastMode; - break; - } - - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Configure the Channel 2 in PWM mode */ - TIM_OC2_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel2 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC2PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE; - htim->Instance->CCMR1 |= sConfig->OCFastMode << 8U; - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Configure the Channel 3 in PWM mode */ - TIM_OC3_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel3 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC3PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE; - htim->Instance->CCMR2 |= sConfig->OCFastMode; - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Configure the Channel 4 in PWM mode */ - TIM_OC4_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel4 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC4PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE; - htim->Instance->CCMR2 |= sConfig->OCFastMode << 8U; - break; - } - - default: - status = HAL_ERROR; - break; - } - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Initializes the TIM One Pulse Channels according to the specified - * parameters in the TIM_OnePulse_InitTypeDef. - * @param htim TIM One Pulse handle - * @param sConfig TIM One Pulse configuration structure - * @param OutputChannel TIM output channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @param InputChannel TIM input Channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @note To output a waveform with a minimum delay user can enable the fast - * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx - * output is forced in response to the edge detection on TIx input, - * without taking in account the comparison. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, - uint32_t OutputChannel, uint32_t InputChannel) -{ - HAL_StatusTypeDef status = HAL_OK; - TIM_OC_InitTypeDef temp1; - - /* Check the parameters */ - assert_param(IS_TIM_OPM_CHANNELS(OutputChannel)); - assert_param(IS_TIM_OPM_CHANNELS(InputChannel)); - - if (OutputChannel != InputChannel) - { - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Extract the Output compare configuration from sConfig structure */ - temp1.OCMode = sConfig->OCMode; - temp1.Pulse = sConfig->Pulse; - temp1.OCPolarity = sConfig->OCPolarity; - temp1.OCNPolarity = sConfig->OCNPolarity; - temp1.OCIdleState = sConfig->OCIdleState; - temp1.OCNIdleState = sConfig->OCNIdleState; - - switch (OutputChannel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - TIM_OC1_SetConfig(htim->Instance, &temp1); - break; - } - - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_OC2_SetConfig(htim->Instance, &temp1); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - switch (InputChannel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - TIM_TI1_SetConfig(htim->Instance, sConfig->ICPolarity, - sConfig->ICSelection, sConfig->ICFilter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - - /* Select the Trigger source */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI1FP1; - - /* Select the Slave Mode */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; - break; - } - - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_TI2_SetConfig(htim->Instance, sConfig->ICPolarity, - sConfig->ICSelection, sConfig->ICFilter); - - /* Reset the IC2PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; - - /* Select the Trigger source */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI2FP2; - - /* Select the Slave Mode */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; - break; - } - - default: - status = HAL_ERROR; - break; - } - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return status; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Configure the DMA Burst to transfer Data from the memory to the TIM peripheral - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @note This function should be used only when BurstLength is equal to DMA data transfer length. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, - uint32_t BurstLength) -{ - HAL_StatusTypeDef status; - - status = HAL_TIM_DMABurst_MultiWriteStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength, - ((BurstLength) >> 8U) + 1U); - - - - return status; -} - -/** - * @brief Configure the DMA Burst to transfer multiple Data from the memory to the TIM peripheral - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @param DataLength Data length. This parameter can be one value - * between 1 and 0xFFFF. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, - uint32_t BurstLength, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength)); - - if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY) - { - if ((BurstBuffer == NULL) && (BurstLength > 0U)) - { - return HAL_ERROR; - } - else - { - htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_COM: - { - /* Set the DMA commutation callbacks */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_TRIGGER: - { - /* Set the DMA trigger callbacks */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; - htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Configure the DMA Burst Mode */ - htim->Instance->DCR = (BurstBaseAddress | BurstLength); - /* Enable the TIM DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM DMA Burst mode - * @param htim TIM handle - * @param BurstRequestSrc TIM DMA Request sources to disable - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - - /* Abort the DMA transfer (at least disable the DMA stream) */ - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - break; - } - case TIM_DMA_CC1: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - case TIM_DMA_CC2: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - case TIM_DMA_CC3: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - case TIM_DMA_CC4: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - case TIM_DMA_COM: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); - break; - } - case TIM_DMA_TRIGGER: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); - break; - } - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - } - - /* Return function status */ - return status; -} - -/** - * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @note This function should be used only when BurstLength is equal to DMA data transfer length. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) -{ - HAL_StatusTypeDef status; - - status = HAL_TIM_DMABurst_MultiReadStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength, - ((BurstLength) >> 8U) + 1U); - - - return status; -} - -/** - * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @param DataLength Data length. This parameter can be one value - * between 1 and 0xFFFF. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, - uint32_t BurstLength, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength)); - - if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY) - { - if ((BurstBuffer == NULL) && (BurstLength > 0U)) - { - return HAL_ERROR; - } - else - { - htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC2: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC3: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC4: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_COM: - { - /* Set the DMA commutation callbacks */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_TRIGGER: - { - /* Set the DMA trigger callbacks */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; - htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Configure the DMA Burst Mode */ - htim->Instance->DCR = (BurstBaseAddress | BurstLength); - - /* Enable the TIM DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); - } - - /* Return function status */ - return status; -} - -/** - * @brief Stop the DMA burst reading - * @param htim TIM handle - * @param BurstRequestSrc TIM DMA Request sources to disable. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - - /* Abort the DMA transfer (at least disable the DMA stream) */ - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - break; - } - case TIM_DMA_CC1: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - case TIM_DMA_CC2: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - case TIM_DMA_CC3: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - case TIM_DMA_CC4: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - case TIM_DMA_COM: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); - break; - } - case TIM_DMA_TRIGGER: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); - break; - } - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - } - - /* Return function status */ - return status; -} - -/** - * @brief Generate a software event - * @param htim TIM handle - * @param EventSource specifies the event source. - * This parameter can be one of the following values: - * @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source - * @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source - * @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source - * @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source - * @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source - * @arg TIM_EVENTSOURCE_COM: Timer COM event source - * @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source - * @arg TIM_EVENTSOURCE_BREAK: Timer Break event source - * @note Basic timers can only generate an update event. - * @note TIM_EVENTSOURCE_COM is relevant only with advanced timer instances. - * @note TIM_EVENTSOURCE_BREAK are relevant only for timer instances - * supporting a break input. - * @retval HAL status - */ - -HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_EVENT_SOURCE(EventSource)); - - /* Process Locked */ - __HAL_LOCK(htim); - - /* Change the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Set the event sources */ - htim->Instance->EGR = EventSource; - - /* Change the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Configures the OCRef clear feature - * @param htim TIM handle - * @param sClearInputConfig pointer to a TIM_ClearInputConfigTypeDef structure that - * contains the OCREF clear feature and parameters for the TIM peripheral. - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @arg TIM_CHANNEL_4: TIM Channel 4 - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, - const TIM_ClearInputConfigTypeDef *sClearInputConfig, - uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_OCXREF_CLEAR_INSTANCE(htim->Instance)); - assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource)); - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - switch (sClearInputConfig->ClearInputSource) - { - case TIM_CLEARINPUTSOURCE_NONE: - { - /* Clear the OCREF clear selection bit and the the ETR Bits */ - CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP)); - break; - } - - case TIM_CLEARINPUTSOURCE_ETR: - { - /* Check the parameters */ - assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity)); - assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler)); - assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter)); - - /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ - if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - TIM_ETR_SetConfig(htim->Instance, - sClearInputConfig->ClearInputPrescaler, - sClearInputConfig->ClearInputPolarity, - sClearInputConfig->ClearInputFilter); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - switch (Channel) - { - case TIM_CHANNEL_1: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 1 */ - SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); - } - else - { - /* Disable the OCREF clear feature for Channel 1 */ - CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); - } - break; - } - case TIM_CHANNEL_2: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 2 */ - SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); - } - else - { - /* Disable the OCREF clear feature for Channel 2 */ - CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); - } - break; - } - case TIM_CHANNEL_3: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 3 */ - SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); - } - else - { - /* Disable the OCREF clear feature for Channel 3 */ - CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); - } - break; - } - case TIM_CHANNEL_4: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 4 */ - SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); - } - else - { - /* Disable the OCREF clear feature for Channel 4 */ - CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); - } - break; - } - default: - break; - } - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Configures the clock source to be used - * @param htim TIM handle - * @param sClockSourceConfig pointer to a TIM_ClockConfigTypeDef structure that - * contains the clock source information for the TIM peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, const TIM_ClockConfigTypeDef *sClockSourceConfig) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Check the parameters */ - assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource)); - - /* Reset the SMS, TS, ECE, ETPS and ETRF bits */ - tmpsmcr = htim->Instance->SMCR; - tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS); - tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); - htim->Instance->SMCR = tmpsmcr; - - switch (sClockSourceConfig->ClockSource) - { - case TIM_CLOCKSOURCE_INTERNAL: - { - assert_param(IS_TIM_INSTANCE(htim->Instance)); - break; - } - - case TIM_CLOCKSOURCE_ETRMODE1: - { - /* Check whether or not the timer instance supports external trigger input mode 1 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); - - /* Check ETR input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - /* Configure the ETR Clock source */ - TIM_ETR_SetConfig(htim->Instance, - sClockSourceConfig->ClockPrescaler, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - - /* Select the External clock mode1 and the ETRF trigger */ - tmpsmcr = htim->Instance->SMCR; - tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1); - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - break; - } - - case TIM_CLOCKSOURCE_ETRMODE2: - { - /* Check whether or not the timer instance supports external trigger input mode 2 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(htim->Instance)); - - /* Check ETR input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - /* Configure the ETR Clock source */ - TIM_ETR_SetConfig(htim->Instance, - sClockSourceConfig->ClockPrescaler, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - /* Enable the External clock mode2 */ - htim->Instance->SMCR |= TIM_SMCR_ECE; - break; - } - - case TIM_CLOCKSOURCE_TI1: - { - /* Check whether or not the timer instance supports external clock mode 1 */ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI1 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI1_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1); - break; - } - - case TIM_CLOCKSOURCE_TI2: - { - /* Check whether or not the timer instance supports external clock mode 1 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI2 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI2_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2); - break; - } - - case TIM_CLOCKSOURCE_TI1ED: - { - /* Check whether or not the timer instance supports external clock mode 1 */ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI1 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI1_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED); - break; - } - - case TIM_CLOCKSOURCE_ITR0: - case TIM_CLOCKSOURCE_ITR1: - case TIM_CLOCKSOURCE_ITR2: - case TIM_CLOCKSOURCE_ITR3: - { - /* Check whether or not the timer instance supports internal trigger input */ - assert_param(IS_TIM_CLOCKSOURCE_ITRX_INSTANCE(htim->Instance)); - - TIM_ITRx_SetConfig(htim->Instance, sClockSourceConfig->ClockSource); - break; - } - - default: - status = HAL_ERROR; - break; - } - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Selects the signal connected to the TI1 input: direct from CH1_input - * or a XOR combination between CH1_input, CH2_input & CH3_input - * @param htim TIM handle. - * @param TI1_Selection Indicate whether or not channel 1 is connected to the - * output of a XOR gate. - * This parameter can be one of the following values: - * @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input - * @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3 - * pins are connected to the TI1 input (XOR combination) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection) -{ - uint32_t tmpcr2; - - /* Check the parameters */ - assert_param(IS_TIM_XOR_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TI1SELECTION(TI1_Selection)); - - /* Get the TIMx CR2 register value */ - tmpcr2 = htim->Instance->CR2; - - /* Reset the TI1 selection */ - tmpcr2 &= ~TIM_CR2_TI1S; - - /* Set the TI1 selection */ - tmpcr2 |= TI1_Selection; - - /* Write to TIMxCR2 */ - htim->Instance->CR2 = tmpcr2; - - return HAL_OK; -} - -/** - * @brief Configures the TIM in Slave mode - * @param htim TIM handle. - * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that - * contains the selected trigger (internal trigger input, filtered - * timer input or external trigger input) and the Slave mode - * (Disable, Reset, Gated, Trigger, External clock mode 1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - /* Check the parameters */ - assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); - assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); - - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - /* Disable Trigger Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_TRIGGER); - - /* Disable Trigger DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIM in Slave mode in interrupt mode - * @param htim TIM handle. - * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that - * contains the selected trigger (internal trigger input, filtered - * timer input or external trigger input) and the Slave mode - * (Disable, Reset, Gated, Trigger, External clock mode 1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, - const TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - /* Check the parameters */ - assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); - assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); - - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - /* Enable Trigger Interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_TRIGGER); - - /* Disable Trigger DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Read the captured value from Capture Compare unit - * @param htim TIM handle. - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval Captured value - */ -uint32_t HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpreg = 0U; - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Return the capture 1 value */ - tmpreg = htim->Instance->CCR1; - - break; - } - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Return the capture 2 value */ - tmpreg = htim->Instance->CCR2; - - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Return the capture 3 value */ - tmpreg = htim->Instance->CCR3; - - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Return the capture 4 value */ - tmpreg = htim->Instance->CCR4; - - break; - } - - default: - break; - } - - return tmpreg; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * -@verbatim - ============================================================================== - ##### TIM Callbacks functions ##### - ============================================================================== - [..] - This section provides TIM callback functions: - (+) TIM Period elapsed callback - (+) TIM Output Compare callback - (+) TIM Input capture callback - (+) TIM Trigger callback - (+) TIM Error callback - -@endverbatim - * @{ - */ - -/** - * @brief Period elapsed callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PeriodElapsedCallback could be implemented in the user file - */ -} - -/** - * @brief Period elapsed half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PeriodElapsedHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Output Compare callback in non-blocking mode - * @param htim TIM OC handle - * @retval None - */ -__weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file - */ -} - -/** - * @brief Input Capture callback in non-blocking mode - * @param htim TIM IC handle - * @retval None - */ -__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_CaptureCallback could be implemented in the user file - */ -} - -/** - * @brief Input Capture half complete callback in non-blocking mode - * @param htim TIM IC handle - * @retval None - */ -__weak void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_CaptureHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief PWM Pulse finished callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file - */ -} - -/** - * @brief PWM Pulse finished half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_PulseFinishedHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Hall Trigger detection callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_TriggerCallback could be implemented in the user file - */ -} - -/** - * @brief Hall Trigger detection half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_TriggerHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Timer error callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_ErrorCallback could be implemented in the user file - */ -} - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User TIM callback to be used instead of the weak predefined callback - * @param htim tim handle - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID - * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID - * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID - * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID - * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID - * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID - * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID - * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID - * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID - * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID - * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID - * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID - * @param pCallback pointer to the callback function - * @retval status - */ -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, - pTIM_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - return HAL_ERROR; - } - - if (htim->State == HAL_TIM_STATE_READY) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = pCallback; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PERIOD_ELAPSED_CB_ID : - htim->PeriodElapsedCallback = pCallback; - break; - - case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : - htim->PeriodElapsedHalfCpltCallback = pCallback; - break; - - case HAL_TIM_TRIGGER_CB_ID : - htim->TriggerCallback = pCallback; - break; - - case HAL_TIM_TRIGGER_HALF_CB_ID : - htim->TriggerHalfCpltCallback = pCallback; - break; - - case HAL_TIM_IC_CAPTURE_CB_ID : - htim->IC_CaptureCallback = pCallback; - break; - - case HAL_TIM_IC_CAPTURE_HALF_CB_ID : - htim->IC_CaptureHalfCpltCallback = pCallback; - break; - - case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : - htim->OC_DelayElapsedCallback = pCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : - htim->PWM_PulseFinishedCallback = pCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : - htim->PWM_PulseFinishedHalfCpltCallback = pCallback; - break; - - case HAL_TIM_ERROR_CB_ID : - htim->ErrorCallback = pCallback; - break; - - case HAL_TIM_COMMUTATION_CB_ID : - htim->CommutationCallback = pCallback; - break; - - case HAL_TIM_COMMUTATION_HALF_CB_ID : - htim->CommutationHalfCpltCallback = pCallback; - break; - - case HAL_TIM_BREAK_CB_ID : - htim->BreakCallback = pCallback; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (htim->State == HAL_TIM_STATE_RESET) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = pCallback; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = pCallback; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Unregister a TIM callback - * TIM callback is redirected to the weak predefined callback - * @param htim tim handle - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID - * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID - * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID - * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID - * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID - * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID - * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID - * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID - * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID - * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID - * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID - * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID - * @retval status - */ -HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (htim->State == HAL_TIM_STATE_READY) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - /* Legacy weak Base MspInit Callback */ - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - /* Legacy weak Base Msp DeInit Callback */ - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - /* Legacy weak IC Msp Init Callback */ - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - /* Legacy weak IC Msp DeInit Callback */ - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - /* Legacy weak OC Msp Init Callback */ - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - /* Legacy weak OC Msp DeInit Callback */ - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - /* Legacy weak PWM Msp Init Callback */ - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - /* Legacy weak PWM Msp DeInit Callback */ - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - /* Legacy weak One Pulse Msp Init Callback */ - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - /* Legacy weak One Pulse Msp DeInit Callback */ - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - /* Legacy weak Encoder Msp Init Callback */ - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - /* Legacy weak Encoder Msp DeInit Callback */ - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - /* Legacy weak Hall Sensor Msp Init Callback */ - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - /* Legacy weak Hall Sensor Msp DeInit Callback */ - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; - break; - - case HAL_TIM_PERIOD_ELAPSED_CB_ID : - /* Legacy weak Period Elapsed Callback */ - htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; - break; - - case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : - /* Legacy weak Period Elapsed half complete Callback */ - htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; - break; - - case HAL_TIM_TRIGGER_CB_ID : - /* Legacy weak Trigger Callback */ - htim->TriggerCallback = HAL_TIM_TriggerCallback; - break; - - case HAL_TIM_TRIGGER_HALF_CB_ID : - /* Legacy weak Trigger half complete Callback */ - htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; - break; - - case HAL_TIM_IC_CAPTURE_CB_ID : - /* Legacy weak IC Capture Callback */ - htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; - break; - - case HAL_TIM_IC_CAPTURE_HALF_CB_ID : - /* Legacy weak IC Capture half complete Callback */ - htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; - break; - - case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : - /* Legacy weak OC Delay Elapsed Callback */ - htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : - /* Legacy weak PWM Pulse Finished Callback */ - htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : - /* Legacy weak PWM Pulse Finished half complete Callback */ - htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; - break; - - case HAL_TIM_ERROR_CB_ID : - /* Legacy weak Error Callback */ - htim->ErrorCallback = HAL_TIM_ErrorCallback; - break; - - case HAL_TIM_COMMUTATION_CB_ID : - /* Legacy weak Commutation Callback */ - htim->CommutationCallback = HAL_TIMEx_CommutCallback; - break; - - case HAL_TIM_COMMUTATION_HALF_CB_ID : - /* Legacy weak Commutation half complete Callback */ - htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; - break; - - case HAL_TIM_BREAK_CB_ID : - /* Legacy weak Break Callback */ - htim->BreakCallback = HAL_TIMEx_BreakCallback; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (htim->State == HAL_TIM_STATE_RESET) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - /* Legacy weak Base MspInit Callback */ - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - /* Legacy weak Base Msp DeInit Callback */ - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - /* Legacy weak IC Msp Init Callback */ - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - /* Legacy weak IC Msp DeInit Callback */ - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - /* Legacy weak OC Msp Init Callback */ - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - /* Legacy weak OC Msp DeInit Callback */ - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - /* Legacy weak PWM Msp Init Callback */ - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - /* Legacy weak PWM Msp DeInit Callback */ - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - /* Legacy weak One Pulse Msp Init Callback */ - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - /* Legacy weak One Pulse Msp DeInit Callback */ - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - /* Legacy weak Encoder Msp Init Callback */ - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - /* Legacy weak Encoder Msp DeInit Callback */ - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - /* Legacy weak Hall Sensor Msp Init Callback */ - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - /* Legacy weak Hall Sensor Msp DeInit Callback */ - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief TIM Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the TIM Base handle state. - * @param htim TIM Base handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM OC handle state. - * @param htim TIM Output Compare handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM PWM handle state. - * @param htim TIM handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Input Capture handle state. - * @param htim TIM IC handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM One Pulse Mode handle state. - * @param htim TIM OPM handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Encoder Mode handle state. - * @param htim TIM Encoder Interface handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Encoder Mode handle state. - * @param htim TIM handle - * @retval Active channel - */ -HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(const TIM_HandleTypeDef *htim) -{ - return htim->Channel; -} - -/** - * @brief Return actual state of the TIM channel. - * @param htim TIM handle - * @param Channel TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @arg TIM_CHANNEL_4: TIM Channel 4 - * @arg TIM_CHANNEL_5: TIM Channel 5 - * @arg TIM_CHANNEL_6: TIM Channel 6 - * @retval TIM Channel state - */ -HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(const TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_TIM_ChannelStateTypeDef channel_state; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); - - return channel_state; -} - -/** - * @brief Return actual state of a DMA burst operation. - * @param htim TIM handle - * @retval DMA burst state - */ -HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(const TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - - return htim->DMABurstState; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup TIM_Private_Functions TIM Private Functions - * @{ - */ - -/** - * @brief TIM DMA error callback - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMAError(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - htim->State = HAL_TIM_STATE_READY; - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->ErrorCallback(htim); -#else - HAL_TIM_ErrorCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Delay Pulse complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); - } - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Delay Pulse half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PWM_PulseFinishedHalfCpltCallback(htim); -#else - HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Capture complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); - } - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Capture half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureHalfCpltCallback(htim); -#else - HAL_TIM_IC_CaptureHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Period Elapse complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (htim->hdma[TIM_DMA_ID_UPDATE]->Init.Mode == DMA_NORMAL) - { - htim->State = HAL_TIM_STATE_READY; - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedCallback(htim); -#else - HAL_TIM_PeriodElapsedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Period Elapse half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedHalfCpltCallback(htim); -#else - HAL_TIM_PeriodElapsedHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Trigger callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (htim->hdma[TIM_DMA_ID_TRIGGER]->Init.Mode == DMA_NORMAL) - { - htim->State = HAL_TIM_STATE_READY; - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerCallback(htim); -#else - HAL_TIM_TriggerCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Trigger half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerHalfCpltCallback(htim); -#else - HAL_TIM_TriggerHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief Time Base configuration - * @param TIMx TIM peripheral - * @param Structure TIM Base configuration structure - * @retval None - */ -void TIM_Base_SetConfig(TIM_TypeDef *TIMx, const TIM_Base_InitTypeDef *Structure) -{ - uint32_t tmpcr1; - tmpcr1 = TIMx->CR1; - - /* Set TIM Time Base Unit parameters ---------------------------------------*/ - if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx)) - { - /* Select the Counter Mode */ - tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS); - tmpcr1 |= Structure->CounterMode; - } - - if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx)) - { - /* Set the clock division */ - tmpcr1 &= ~TIM_CR1_CKD; - tmpcr1 |= (uint32_t)Structure->ClockDivision; - } - - /* Set the auto-reload preload */ - MODIFY_REG(tmpcr1, TIM_CR1_ARPE, Structure->AutoReloadPreload); - - TIMx->CR1 = tmpcr1; - - /* Set the Autoreload value */ - TIMx->ARR = (uint32_t)Structure->Period ; - - /* Set the Prescaler value */ - TIMx->PSC = Structure->Prescaler; - - if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx)) - { - /* Set the Repetition Counter value */ - TIMx->RCR = Structure->RepetitionCounter; - } - - /* Generate an update event to reload the Prescaler - and the repetition counter (only for advanced timer) value immediately */ - TIMx->EGR = TIM_EGR_UG; - - /* Check if the update flag is set after the Update Generation, if so clear the UIF flag */ - if (HAL_IS_BIT_SET(TIMx->SR, TIM_FLAG_UPDATE)) - { - /* Clear the update flag */ - CLEAR_BIT(TIMx->SR, TIM_FLAG_UPDATE); - } -} - -/** - * @brief Timer Output Compare 1 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The output configuration structure - * @retval None - */ -static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= ~TIM_CCER_CC1E; - - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare Mode Bits */ - tmpccmrx &= ~TIM_CCMR1_OC1M; - tmpccmrx &= ~TIM_CCMR1_CC1S; - /* Select the Output Compare Mode */ - tmpccmrx |= OC_Config->OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC1P; - /* Set the Output Compare Polarity */ - tmpccer |= OC_Config->OCPolarity; - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_1)) - { - /* Check parameters */ - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC1NP; - /* Set the Output N Polarity */ - tmpccer |= OC_Config->OCNPolarity; - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC1NE; - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS1; - tmpcr2 &= ~TIM_CR2_OIS1N; - /* Set the Output Idle state */ - tmpcr2 |= OC_Config->OCIdleState; - /* Set the Output N Idle state */ - tmpcr2 |= OC_Config->OCNIdleState; - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR1 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 2 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The output configuration structure - * @retval None - */ -void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC2E; - - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR1_OC2M; - tmpccmrx &= ~TIM_CCMR1_CC2S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (OC_Config->OCMode << 8U); - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC2P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 4U); - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_2)) - { - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC2NP; - /* Set the Output N Polarity */ - tmpccer |= (OC_Config->OCNPolarity << 4U); - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC2NE; - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS2; - tmpcr2 &= ~TIM_CR2_OIS2N; - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 2U); - /* Set the Output N Idle state */ - tmpcr2 |= (OC_Config->OCNIdleState << 2U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR2 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 3 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The output configuration structure - * @retval None - */ -static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Disable the Channel 3: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC3E; - - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR2_OC3M; - tmpccmrx &= ~TIM_CCMR2_CC3S; - /* Select the Output Compare Mode */ - tmpccmrx |= OC_Config->OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC3P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 8U); - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_3)) - { - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC3NP; - /* Set the Output N Polarity */ - tmpccer |= (OC_Config->OCNPolarity << 8U); - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC3NE; - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS3; - tmpcr2 &= ~TIM_CR2_OIS3N; - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 4U); - /* Set the Output N Idle state */ - tmpcr2 |= (OC_Config->OCNIdleState << 4U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR3 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 4 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The output configuration structure - * @retval None - */ -static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Disable the Channel 4: Reset the CC4E Bit */ - TIMx->CCER &= ~TIM_CCER_CC4E; - - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR2_OC4M; - tmpccmrx &= ~TIM_CCMR2_CC4S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (OC_Config->OCMode << 8U); - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC4P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 12U); - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS4; - - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 6U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR4 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Slave Timer configuration function - * @param htim TIM handle - * @param sSlaveConfig Slave timer configuration - * @retval None - */ -static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - const TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Reset the Trigger Selection Bits */ - tmpsmcr &= ~TIM_SMCR_TS; - /* Set the Input Trigger source */ - tmpsmcr |= sSlaveConfig->InputTrigger; - - /* Reset the slave mode Bits */ - tmpsmcr &= ~TIM_SMCR_SMS; - /* Set the slave mode */ - tmpsmcr |= sSlaveConfig->SlaveMode; - - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - - /* Configure the trigger prescaler, filter, and polarity */ - switch (sSlaveConfig->InputTrigger) - { - case TIM_TS_ETRF: - { - /* Check the parameters */ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - /* Configure the ETR Trigger source */ - TIM_ETR_SetConfig(htim->Instance, - sSlaveConfig->TriggerPrescaler, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_TI1F_ED: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - if (sSlaveConfig->SlaveMode == TIM_SLAVEMODE_GATED) - { - return HAL_ERROR; - } - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = htim->Instance->CCER; - htim->Instance->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = htim->Instance->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4U); - - /* Write to TIMx CCMR1 and CCER registers */ - htim->Instance->CCMR1 = tmpccmr1; - htim->Instance->CCER = tmpccer; - break; - } - - case TIM_TS_TI1FP1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - /* Configure TI1 Filter and Polarity */ - TIM_TI1_ConfigInputStage(htim->Instance, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_TI2FP2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - /* Configure TI2 Filter and Polarity */ - TIM_TI2_ConfigInputStage(htim->Instance, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_ITR0: - case TIM_TS_ITR1: - case TIM_TS_ITR2: - case TIM_TS_ITR3: - { - /* Check the parameter */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - break; - } - - default: - status = HAL_ERROR; - break; - } - - return status; -} - -/** - * @brief Configure the TI1 as Input. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 1 is selected to be connected to IC1. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 1 is selected to be connected to IC2. - * @arg TIM_ICSELECTION_TRC: TIM Input 1 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI2FP1 - * (on channel2 path) is used as the input signal. Therefore CCMR1 must be - * protected against un-initialized filter and polarity values. - */ -void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = TIMx->CCMR1; - - /* Select the Input */ - if (IS_TIM_CC2_INSTANCE(TIMx) != RESET) - { - tmpccmr1 &= ~TIM_CCMR1_CC1S; - tmpccmr1 |= TIM_ICSelection; - } - else - { - tmpccmr1 |= TIM_CCMR1_CC1S_0; - } - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= ((TIM_ICFilter << 4U) & TIM_CCMR1_IC1F); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); - tmpccer |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP)); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the Polarity and Filter for TI1. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = TIMx->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= (TIM_ICFilter << 4U); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); - tmpccer |= TIM_ICPolarity; - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI2 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 2 is selected to be connected to IC2. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 2 is selected to be connected to IC1. - * @arg TIM_ICSELECTION_TRC: TIM Input 2 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI1FP2 - * (on channel1 path) is used as the input signal. Therefore CCMR1 must be - * protected against un-initialized filter and polarity values. - */ -static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 2: Reset the CC2E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC2E; - tmpccmr1 = TIMx->CCMR1; - - /* Select the Input */ - tmpccmr1 &= ~TIM_CCMR1_CC2S; - tmpccmr1 |= (TIM_ICSelection << 8U); - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC2F; - tmpccmr1 |= ((TIM_ICFilter << 12U) & TIM_CCMR1_IC2F); - - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); - tmpccer |= ((TIM_ICPolarity << 4U) & (TIM_CCER_CC2P | TIM_CCER_CC2NP)); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the Polarity and Filter for TI2. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 2: Reset the CC2E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC2E; - tmpccmr1 = TIMx->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC2F; - tmpccmr1 |= (TIM_ICFilter << 12U); - - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); - tmpccer |= (TIM_ICPolarity << 4U); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI3 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 3 is selected to be connected to IC3. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 3 is selected to be connected to IC4. - * @arg TIM_ICSELECTION_TRC: TIM Input 3 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI3FP4 - * (on channel1 path) is used as the input signal. Therefore CCMR2 must be - * protected against un-initialized filter and polarity values. - */ -static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr2; - uint32_t tmpccer; - - /* Disable the Channel 3: Reset the CC3E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC3E; - tmpccmr2 = TIMx->CCMR2; - - /* Select the Input */ - tmpccmr2 &= ~TIM_CCMR2_CC3S; - tmpccmr2 |= TIM_ICSelection; - - /* Set the filter */ - tmpccmr2 &= ~TIM_CCMR2_IC3F; - tmpccmr2 |= ((TIM_ICFilter << 4U) & TIM_CCMR2_IC3F); - - /* Select the Polarity and set the CC3E Bit */ - tmpccer &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP); - tmpccer |= ((TIM_ICPolarity << 8U) & (TIM_CCER_CC3P | TIM_CCER_CC3NP)); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI4 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 4 is selected to be connected to IC4. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 4 is selected to be connected to IC3. - * @arg TIM_ICSELECTION_TRC: TIM Input 4 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI4FP3 - * (on channel1 path) is used as the input signal. Therefore CCMR2 must be - * protected against un-initialized filter and polarity values. - * @retval None - */ -static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr2; - uint32_t tmpccer; - - /* Disable the Channel 4: Reset the CC4E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC4E; - tmpccmr2 = TIMx->CCMR2; - - /* Select the Input */ - tmpccmr2 &= ~TIM_CCMR2_CC4S; - tmpccmr2 |= (TIM_ICSelection << 8U); - - /* Set the filter */ - tmpccmr2 &= ~TIM_CCMR2_IC4F; - tmpccmr2 |= ((TIM_ICFilter << 12U) & TIM_CCMR2_IC4F); - - /* Select the Polarity and set the CC4E Bit */ - tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP); - tmpccer |= ((TIM_ICPolarity << 12U) & (TIM_CCER_CC4P | TIM_CCER_CC4NP)); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer ; -} - -/** - * @brief Selects the Input Trigger source - * @param TIMx to select the TIM peripheral - * @param InputTriggerSource The Input Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal Trigger 0 - * @arg TIM_TS_ITR1: Internal Trigger 1 - * @arg TIM_TS_ITR2: Internal Trigger 2 - * @arg TIM_TS_ITR3: Internal Trigger 3 - * @arg TIM_TS_TI1F_ED: TI1 Edge Detector - * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 - * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 - * @arg TIM_TS_ETRF: External Trigger input - * @retval None - */ -static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource) -{ - uint32_t tmpsmcr; - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - /* Reset the TS Bits */ - tmpsmcr &= ~TIM_SMCR_TS; - /* Set the Input Trigger source and the slave mode*/ - tmpsmcr |= (InputTriggerSource | TIM_SLAVEMODE_EXTERNAL1); - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} -/** - * @brief Configures the TIMx External Trigger (ETR). - * @param TIMx to select the TIM peripheral - * @param TIM_ExtTRGPrescaler The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ETRPRESCALER_DIV1: ETRP Prescaler OFF. - * @arg TIM_ETRPRESCALER_DIV2: ETRP frequency divided by 2. - * @arg TIM_ETRPRESCALER_DIV4: ETRP frequency divided by 4. - * @arg TIM_ETRPRESCALER_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ETRPOLARITY_INVERTED: active low or falling edge active. - * @arg TIM_ETRPOLARITY_NONINVERTED: active high or rising edge active. - * @param ExtTRGFilter External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, - uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) -{ - uint32_t tmpsmcr; - - tmpsmcr = TIMx->SMCR; - - /* Reset the ETR Bits */ - tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); - - /* Set the Prescaler, the Filter value and the Polarity */ - tmpsmcr |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << 8U))); - - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel x. - * @param TIMx to select the TIM peripheral - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @arg TIM_CHANNEL_4: TIM Channel 4 - * @param ChannelState specifies the TIM Channel CCxE bit new state. - * This parameter can be: TIM_CCx_ENABLE or TIM_CCx_DISABLE. - * @retval None - */ -void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState) -{ - uint32_t tmp; - - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(TIMx)); - assert_param(IS_TIM_CHANNELS(Channel)); - - tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ - - /* Reset the CCxE Bit */ - TIMx->CCER &= ~tmp; - - /* Set or reset the CCxE Bit */ - TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ -} - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief Reset interrupt callbacks to the legacy weak callbacks. - * @param htim pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -void TIM_ResetCallback(TIM_HandleTypeDef *htim) -{ - /* Reset the TIM callback to the legacy weak callbacks */ - htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; - htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; - htim->TriggerCallback = HAL_TIM_TriggerCallback; - htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; - htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; - htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; - htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; - htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; - htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; - htim->ErrorCallback = HAL_TIM_ErrorCallback; - htim->CommutationCallback = HAL_TIMEx_CommutCallback; - htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; - htim->BreakCallback = HAL_TIMEx_BreakCallback; -} -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -#endif /* HAL_TIM_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c deleted file mode 100644 index 889f8fb..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c +++ /dev/null @@ -1,2410 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim_ex.c - * @author MCD Application Team - * @brief TIM HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Timer Extended peripheral: - * + Time Hall Sensor Interface Initialization - * + Time Hall Sensor Interface Start - * + Time Complementary signal break and dead time configuration - * + Time Master and Slave synchronization configuration - * + Timer remapping capabilities configuration - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### TIMER Extended features ##### - ============================================================================== - [..] - The Timer Extended features include: - (#) Complementary outputs with programmable dead-time for : - (++) Output Compare - (++) PWM generation (Edge and Center-aligned Mode) - (++) One-pulse mode output - (#) Synchronization circuit to control the timer with external signals and to - interconnect several timers together. - (#) Break input to put the timer output signals in reset state or in a known state. - (#) Supports incremental (quadrature) encoder and hall-sensor circuitry for - positioning purposes - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Initialize the TIM low level resources by implementing the following functions - depending on the selected feature: - (++) Hall Sensor output : HAL_TIMEx_HallSensor_MspInit() - - (#) Initialize the TIM low level resources : - (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); - (##) TIM pins configuration - (+++) Enable the clock for the TIM GPIOs using the following function: - __HAL_RCC_GPIOx_CLK_ENABLE(); - (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); - - (#) The external Clock can be configured, if needed (the default clock is the - internal clock from the APBx), using the following function: - HAL_TIM_ConfigClockSource, the clock configuration should be done before - any start function. - - (#) Configure the TIM in the desired functioning mode using one of the - initialization function of this driver: - (++) HAL_TIMEx_HallSensor_Init() and HAL_TIMEx_ConfigCommutEvent(): to use the - Timer Hall Sensor Interface and the commutation event with the corresponding - Interrupt and DMA request if needed (Note that One Timer is used to interface - with the Hall sensor Interface and another Timer should be used to use - the commutation event). - - (#) Activate the TIM peripheral using one of the start functions: - (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), - HAL_TIMEx_OCN_Start_IT() - (++) Complementary PWM generation : HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(), - HAL_TIMEx_PWMN_Start_IT() - (++) Complementary One-pulse mode output : HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT() - (++) Hall Sensor output : HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(), - HAL_TIMEx_HallSensor_Start_IT(). - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup TIMEx TIMEx - * @brief TIM Extended HAL module driver - * @{ - */ - -#ifdef HAL_TIM_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma); -static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState); - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Functions TIM Extended Exported Functions - * @{ - */ - -/** @defgroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * -@verbatim - ============================================================================== - ##### Timer Hall Sensor functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure TIM HAL Sensor. - (+) De-initialize TIM HAL Sensor. - (+) Start the Hall Sensor Interface. - (+) Stop the Hall Sensor Interface. - (+) Start the Hall Sensor Interface and enable interrupts. - (+) Stop the Hall Sensor Interface and disable interrupts. - (+) Start the Hall Sensor Interface and enable DMA transfers. - (+) Stop the Hall Sensor Interface and disable DMA transfers. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Hall Sensor Interface and initialize the associated handle. - * @note When the timer instance is initialized in Hall Sensor Interface mode, - * timer channels 1 and channel 2 are reserved and cannot be used for - * other purpose. - * @param htim TIM Hall Sensor Interface handle - * @param sConfig TIM Hall Sensor configuration structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, const TIM_HallSensor_InitTypeDef *sConfig) -{ - TIM_OC_InitTypeDef OC_Config; - - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy week callbacks */ - TIM_ResetCallback(htim); - - if (htim->HallSensor_MspInitCallback == NULL) - { - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->HallSensor_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIMEx_HallSensor_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Configure the Time base in the Encoder Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Configure the Channel 1 as Input Channel to interface with the three Outputs of the Hall sensor */ - TIM_TI1_SetConfig(htim->Instance, sConfig->IC1Polarity, TIM_ICSELECTION_TRC, sConfig->IC1Filter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - /* Set the IC1PSC value */ - htim->Instance->CCMR1 |= sConfig->IC1Prescaler; - - /* Enable the Hall sensor interface (XOR function of the three inputs) */ - htim->Instance->CR2 |= TIM_CR2_TI1S; - - /* Select the TIM_TS_TI1F_ED signal as Input trigger for the TIM */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI1F_ED; - - /* Use the TIM_TS_TI1F_ED signal to reset the TIM counter each edge detection */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_RESET; - - /* Program channel 2 in PWM 2 mode with the desired Commutation_Delay*/ - OC_Config.OCFastMode = TIM_OCFAST_DISABLE; - OC_Config.OCIdleState = TIM_OCIDLESTATE_RESET; - OC_Config.OCMode = TIM_OCMODE_PWM2; - OC_Config.OCNIdleState = TIM_OCNIDLESTATE_RESET; - OC_Config.OCNPolarity = TIM_OCNPOLARITY_HIGH; - OC_Config.OCPolarity = TIM_OCPOLARITY_HIGH; - OC_Config.Pulse = sConfig->Commutation_Delay; - - TIM_OC2_SetConfig(htim->Instance, &OC_Config); - - /* Select OC2REF as trigger output on TRGO: write the MMS bits in the TIMx_CR2 - register to 101 */ - htim->Instance->CR2 &= ~TIM_CR2_MMS; - htim->Instance->CR2 |= TIM_TRGO_OC2REF; - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM Hall Sensor interface - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->HallSensor_MspDeInitCallback == NULL) - { - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; - } - /* DeInit the low level hardware */ - htim->HallSensor_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIMEx_HallSensor_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Hall Sensor MSP. - * @param htim TIM Hall Sensor Interface handle - * @retval None - */ -__weak void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_HallSensor_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Hall Sensor MSP. - * @param htim TIM Hall Sensor Interface handle - * @retval None - */ -__weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_HallSensor_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Hall Sensor Interface. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall sensor Interface. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1, 2 and 3 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Hall Sensor Interface in interrupt mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the capture compare Interrupts 1 event */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall Sensor Interface in interrupt mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts event */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Hall Sensor Interface in DMA mode. - * @param htim TIM Hall Sensor Interface handle - * @param pData The destination Buffer address. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Set the TIM channel state */ - if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Set the DMA Input Capture 1 Callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream for Capture 1*/ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the capture compare 1 Interrupt */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall Sensor Interface in DMA mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - - /* Disable the capture compare Interrupts 1 event */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * -@verbatim - ============================================================================== - ##### Timer Complementary Output Compare functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary Output Compare/PWM. - (+) Stop the Complementary Output Compare/PWM. - (+) Start the Complementary Output Compare/PWM and enable interrupts. - (+) Stop the Complementary Output Compare/PWM and disable interrupts. - (+) Start the Complementary Output Compare/PWM and enable DMA transfers. - (+) Stop the Complementary Output Compare/PWM and disable DMA transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the TIM Output Compare signal generation on the complementary - * output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation on the complementary - * output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in interrupt mode - * on the complementary output. - * @param htim TIM OC handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the TIM Break interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); - - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Output Compare signal generation in interrupt mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpccer; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the TIM Break interrupt (only if no more channel is active) */ - tmpccer = htim->Instance->CCER; - if ((tmpccer & TIM_CCER_CCxNE_MASK) == (uint32_t)RESET) - { - __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); - } - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM Output Compare signal generation in DMA mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Set the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) - { - return HAL_BUSY; - } - else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Output Compare signal generation in DMA mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * -@verbatim - ============================================================================== - ##### Timer Complementary PWM functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary PWM. - (+) Stop the Complementary PWM. - (+) Start the Complementary PWM and enable interrupts. - (+) Stop the Complementary PWM and disable interrupts. - (+) Start the Complementary PWM and enable DMA transfers. - (+) Stop the Complementary PWM and disable DMA transfers. -@endverbatim - * @{ - */ - -/** - * @brief Starts the PWM signal generation on the complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation on the complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the PWM signal generation in interrupt mode on the - * complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the TIM Break interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); - - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the PWM signal generation in interrupt mode on the - * complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpccer; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the TIM Break interrupt (only if no more channel is active) */ - tmpccer = htim->Instance->CCER; - if ((tmpccer & TIM_CCER_CCxNE_MASK) == (uint32_t)RESET) - { - __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); - } - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM PWM signal generation in DMA mode on the - * complementary output - * @param htim TIM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Set the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) - { - return HAL_BUSY; - } - else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM PWM signal generation in DMA mode on the complementary - * output - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * -@verbatim - ============================================================================== - ##### Timer Complementary One Pulse functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary One Pulse generation. - (+) Stop the Complementary One Pulse. - (+) Start the Complementary One Pulse and enable interrupts. - (+) Stop the Complementary One Pulse and disable interrupts. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the TIM One Pulse signal generation on the complementary - * output. - * @note OutputChannel must match the pulse output channel chosen when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel pulse output channel to enable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the complementary One Pulse output channel and the Input Capture channel */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); - TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation on the complementary - * output. - * @note OutputChannel must match the pulse output channel chosen when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel pulse output channel to disable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Disable the complementary One Pulse output channel and the Input Capture channel */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); - TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM One Pulse signal generation in interrupt mode on the - * complementary channel. - * @note OutputChannel must match the pulse output channel chosen when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel pulse output channel to enable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - - /* Enable the complementary One Pulse output channel and the Input Capture channel */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); - TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation in interrupt mode on the - * complementary channel. - * @note OutputChannel must match the pulse output channel chosen when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel pulse output channel to disable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - - /* Disable the complementary One Pulse output channel and the Input Capture channel */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); - TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Configure the commutation event in case of use of the Hall sensor interface. - (+) Configure Output channels for OC and PWM mode. - - (+) Configure Complementary channels, break features and dead time. - (+) Configure Master synchronization. - (+) Configure timer remapping capabilities. - -@endverbatim - * @{ - */ - -/** - * @brief Configure the TIM commutation event sequence. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Disable Commutation Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); - - /* Disable Commutation DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configure the TIM commutation event sequence with interrupt. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Disable Commutation DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); - - /* Enable the Commutation Interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configure the TIM commutation event sequence with DMA. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @note The user should configure the DMA in his own software, in This function only the COMDE bit is set - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Enable the Commutation DMA Request */ - /* Set the DMA Commutation Callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError; - - /* Disable Commutation Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); - - /* Enable the Commutation DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIM in master mode. - * @param htim TIM handle. - * @param sMasterConfig pointer to a TIM_MasterConfigTypeDef structure that - * contains the selected trigger output (TRGO) and the Master/Slave - * mode. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, - const TIM_MasterConfigTypeDef *sMasterConfig) -{ - uint32_t tmpcr2; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); - assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); - - /* Check input state */ - __HAL_LOCK(htim); - - /* Change the handler state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Get the TIMx CR2 register value */ - tmpcr2 = htim->Instance->CR2; - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Reset the MMS Bits */ - tmpcr2 &= ~TIM_CR2_MMS; - /* Select the TRGO source */ - tmpcr2 |= sMasterConfig->MasterOutputTrigger; - - /* Update TIMx CR2 */ - htim->Instance->CR2 = tmpcr2; - - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - /* Reset the MSM Bit */ - tmpsmcr &= ~TIM_SMCR_MSM; - /* Set master mode */ - tmpsmcr |= sMasterConfig->MasterSlaveMode; - - /* Update TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - } - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the Break feature, dead time, Lock level, OSSI/OSSR State - * and the AOE(automatic output enable). - * @param htim TIM handle - * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that - * contains the BDTR Register configuration information for the TIM peripheral. - * @note Interrupts can be generated when an active level is detected on the - * break input, the break 2 input or the system break input. Break - * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, - const TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig) -{ - /* Keep this variable initialized to 0 as it is used to configure BDTR register */ - uint32_t tmpbdtr = 0U; - - /* Check the parameters */ - assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); - assert_param(IS_TIM_OSSR_STATE(sBreakDeadTimeConfig->OffStateRunMode)); - assert_param(IS_TIM_OSSI_STATE(sBreakDeadTimeConfig->OffStateIDLEMode)); - assert_param(IS_TIM_LOCK_LEVEL(sBreakDeadTimeConfig->LockLevel)); - assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime)); - assert_param(IS_TIM_BREAK_STATE(sBreakDeadTimeConfig->BreakState)); - assert_param(IS_TIM_BREAK_POLARITY(sBreakDeadTimeConfig->BreakPolarity)); - assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(sBreakDeadTimeConfig->AutomaticOutput)); - - /* Check input state */ - __HAL_LOCK(htim); - - /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State, - the OSSI State, the dead time value and the Automatic Output Enable Bit */ - - /* Set the BDTR bits */ - MODIFY_REG(tmpbdtr, TIM_BDTR_DTG, sBreakDeadTimeConfig->DeadTime); - MODIFY_REG(tmpbdtr, TIM_BDTR_LOCK, sBreakDeadTimeConfig->LockLevel); - MODIFY_REG(tmpbdtr, TIM_BDTR_OSSI, sBreakDeadTimeConfig->OffStateIDLEMode); - MODIFY_REG(tmpbdtr, TIM_BDTR_OSSR, sBreakDeadTimeConfig->OffStateRunMode); - MODIFY_REG(tmpbdtr, TIM_BDTR_BKE, sBreakDeadTimeConfig->BreakState); - MODIFY_REG(tmpbdtr, TIM_BDTR_BKP, sBreakDeadTimeConfig->BreakPolarity); - MODIFY_REG(tmpbdtr, TIM_BDTR_AOE, sBreakDeadTimeConfig->AutomaticOutput); - - - /* Set TIMx_BDTR */ - htim->Instance->BDTR = tmpbdtr; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIMx Remapping input capabilities. - * @param htim TIM handle. - * @param Remap specifies the TIM remapping source. - * For TIM1, the parameter can have the following values: (**) - * @arg TIM_TIM1_TIM3_TRGO: TIM1 ITR2 is connected to TIM3 TRGO - * @arg TIM_TIM1_LPTIM: TIM1 ITR2 is connected to LPTIM1 output - * - * For TIM2, the parameter can have the following values: (**) - * @arg TIM_TIM2_TIM8_TRGO: TIM2 ITR1 is connected to TIM8 TRGO (*) - * @arg TIM_TIM2_ETH_PTP: TIM2 ITR1 is connected to PTP trigger output (*) - * @arg TIM_TIM2_USBFS_SOF: TIM2 ITR1 is connected to OTG FS SOF - * @arg TIM_TIM2_USBHS_SOF: TIM2 ITR1 is connected to OTG FS SOF - * - * For TIM5, the parameter can have the following values: - * @arg TIM_TIM5_GPIO: TIM5 TI4 is connected to GPIO - * @arg TIM_TIM5_LSI: TIM5 TI4 is connected to LSI - * @arg TIM_TIM5_LSE: TIM5 TI4 is connected to LSE - * @arg TIM_TIM5_RTC: TIM5 TI4 is connected to the RTC wakeup interrupt - * @arg TIM_TIM5_TIM3_TRGO: TIM5 ITR1 is connected to TIM3 TRGO (*) - * @arg TIM_TIM5_LPTIM: TIM5 ITR1 is connected to LPTIM1 output (*) - * - * For TIM9, the parameter can have the following values: (**) - * @arg TIM_TIM9_TIM3_TRGO: TIM9 ITR1 is connected to TIM3 TRGO - * @arg TIM_TIM9_LPTIM: TIM9 ITR1 is connected to LPTIM1 output - * - * For TIM11, the parameter can have the following values: - * @arg TIM_TIM11_GPIO: TIM11 TI1 is connected to GPIO - * @arg TIM_TIM11_HSE: TIM11 TI1 is connected to HSE_RTC clock - * @arg TIM_TIM11_SPDIFRX: TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC (*) - * - * (*) Value not defined in all devices. \n - * (**) Register not available in all devices. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap) -{ - /* Check parameters */ - assert_param(IS_TIM_REMAP(htim->Instance, Remap)); - - __HAL_LOCK(htim); - -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM9_ITR1_RMP) - if ((Remap & LPTIM_REMAP_MASK) == LPTIM_REMAP_MASK) - { - /* Connect TIMx internal trigger to LPTIM1 output */ - __HAL_RCC_LPTIM1_CLK_ENABLE(); - MODIFY_REG(LPTIM1->OR, - (LPTIM_OR_TIM1_ITR2_RMP | LPTIM_OR_TIM5_ITR1_RMP | LPTIM_OR_TIM9_ITR1_RMP), - Remap & ~(LPTIM_REMAP_MASK)); - } - else - { - /* Set the Timer remapping configuration */ - WRITE_REG(htim->Instance->OR, Remap); - } -#else - /* Set the Timer remapping configuration */ - WRITE_REG(htim->Instance->OR, Remap); -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM9_ITR1_RMP */ - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions - * @brief Extended Callbacks functions - * -@verbatim - ============================================================================== - ##### Extended Callbacks functions ##### - ============================================================================== - [..] - This section provides Extended TIM callback functions: - (+) Timer Commutation callback - (+) Timer Break callback - -@endverbatim - * @{ - */ - -/** - * @brief Commutation callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_CommutCallback could be implemented in the user file - */ -} -/** - * @brief Commutation half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_CommutHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Break detection callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_BreakCallback could be implemented in the user file - */ -} -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions - * @brief Extended Peripheral State functions - * -@verbatim - ============================================================================== - ##### Extended Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the TIM Hall Sensor interface handle state. - * @param htim TIM Hall Sensor handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return actual state of the TIM complementary channel. - * @param htim TIM handle - * @param ChannelN TIM Complementary channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @retval TIM Complementary channel state - */ -HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(const TIM_HandleTypeDef *htim, uint32_t ChannelN) -{ - HAL_TIM_ChannelStateTypeDef channel_state; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, ChannelN)); - - channel_state = TIM_CHANNEL_N_STATE_GET(htim, ChannelN); - - return channel_state; -} -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions - * @{ - */ - -/** - * @brief TIM DMA Commutation callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationCallback(htim); -#else - HAL_TIMEx_CommutCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Commutation half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationHalfCpltCallback(htim); -#else - HAL_TIMEx_CommutHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - - -/** - * @brief TIM DMA Delay Pulse complete callback (complementary channel). - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA error callback (complementary channel) - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->ErrorCallback(htim); -#else - HAL_TIM_ErrorCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel xN. - * @param TIMx to select the TIM peripheral - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @param ChannelNState specifies the TIM Channel CCxNE bit new state. - * This parameter can be: TIM_CCxN_ENABLE or TIM_CCxN_Disable. - * @retval None - */ -static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState) -{ - uint32_t tmp; - - tmp = TIM_CCER_CC1NE << (Channel & 0xFU); /* 0xFU = 15 bits max shift */ - - /* Reset the CCxNE Bit */ - TIMx->CCER &= ~tmp; - - /* Set or reset the CCxNE Bit */ - TIMx->CCER |= (uint32_t)(ChannelNState << (Channel & 0xFU)); /* 0xFU = 15 bits max shift */ -} -/** - * @} - */ - -#endif /* HAL_TIM_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c b/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c deleted file mode 100644 index 40b6d83..0000000 --- a/software/bootloader/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c +++ /dev/null @@ -1,2316 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_usb.c - * @author MCD Application Team - * @brief USB Low Layer HAL module driver. - * - * This file provides firmware functions to manage the following - * functionalities of the USB Peripheral Controller: - * + Initialization/de-initialization functions - * + I/O operation functions - * + Peripheral Control functions - * + Peripheral State functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Fill parameters of Init structure in USB_CfgTypeDef structure. - - (#) Call USB_CoreInit() API to initialize the USB Core peripheral. - - (#) The upper HAL HCD/PCD driver will call the right routines for its internal processes. - - @endverbatim - - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_LL_USB_DRIVER - * @{ - */ - -#if defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -#if defined (USB_OTG_FS) || defined (USB_OTG_HS) -static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx); - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup USB_LL_Exported_Functions USB Low Layer Exported Functions - * @{ - */ - -/** @defgroup USB_LL_Exported_Functions_Group1 Initialization/de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization/de-initialization functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the USB Core - * @param USBx USB Instance - * @param cfg pointer to a USB_OTG_CfgTypeDef structure that contains - * the configuration information for the specified USBx peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) -{ - HAL_StatusTypeDef ret; - if (cfg.phy_itface == USB_OTG_ULPI_PHY) - { - USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN); - - /* Init The ULPI Interface */ - USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL); - - /* Select vbus source */ - USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); - if (cfg.use_external_vbus == 1U) - { - USBx->GUSBCFG |= USB_OTG_GUSBCFG_ULPIEVBUSD; - } - - /* Reset after a PHY select */ - ret = USB_CoreReset(USBx); - } - else /* FS interface (embedded Phy) */ - { - /* Select FS Embedded PHY */ - USBx->GUSBCFG |= USB_OTG_GUSBCFG_PHYSEL; - - /* Reset after a PHY select */ - ret = USB_CoreReset(USBx); - - if (cfg.battery_charging_enable == 0U) - { - /* Activate the USB Transceiver */ - USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN; - } - else - { - /* Deactivate the USB Transceiver */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN); - } - } - - if (cfg.dma_enable == 1U) - { - USBx->GAHBCFG |= USB_OTG_GAHBCFG_HBSTLEN_2; - USBx->GAHBCFG |= USB_OTG_GAHBCFG_DMAEN; - } - - return ret; -} - - -/** - * @brief Set the USB turnaround time - * @param USBx USB Instance - * @param hclk: AHB clock frequency - * @retval USB turnaround time In PHY Clocks number - */ -HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, - uint32_t hclk, uint8_t speed) -{ - uint32_t UsbTrd; - - /* The USBTRD is configured according to the tables below, depending on AHB frequency - used by application. In the low AHB frequency range it is used to stretch enough the USB response - time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access - latency to the Data FIFO */ - if (speed == USBD_FS_SPEED) - { - if ((hclk >= 14200000U) && (hclk < 15000000U)) - { - /* hclk Clock Range between 14.2-15 MHz */ - UsbTrd = 0xFU; - } - else if ((hclk >= 15000000U) && (hclk < 16000000U)) - { - /* hclk Clock Range between 15-16 MHz */ - UsbTrd = 0xEU; - } - else if ((hclk >= 16000000U) && (hclk < 17200000U)) - { - /* hclk Clock Range between 16-17.2 MHz */ - UsbTrd = 0xDU; - } - else if ((hclk >= 17200000U) && (hclk < 18500000U)) - { - /* hclk Clock Range between 17.2-18.5 MHz */ - UsbTrd = 0xCU; - } - else if ((hclk >= 18500000U) && (hclk < 20000000U)) - { - /* hclk Clock Range between 18.5-20 MHz */ - UsbTrd = 0xBU; - } - else if ((hclk >= 20000000U) && (hclk < 21800000U)) - { - /* hclk Clock Range between 20-21.8 MHz */ - UsbTrd = 0xAU; - } - else if ((hclk >= 21800000U) && (hclk < 24000000U)) - { - /* hclk Clock Range between 21.8-24 MHz */ - UsbTrd = 0x9U; - } - else if ((hclk >= 24000000U) && (hclk < 27700000U)) - { - /* hclk Clock Range between 24-27.7 MHz */ - UsbTrd = 0x8U; - } - else if ((hclk >= 27700000U) && (hclk < 32000000U)) - { - /* hclk Clock Range between 27.7-32 MHz */ - UsbTrd = 0x7U; - } - else /* if(hclk >= 32000000) */ - { - /* hclk Clock Range between 32-200 MHz */ - UsbTrd = 0x6U; - } - } - else if (speed == USBD_HS_SPEED) - { - UsbTrd = USBD_HS_TRDT_VALUE; - } - else - { - UsbTrd = USBD_DEFAULT_TRDT_VALUE; - } - - USBx->GUSBCFG &= ~USB_OTG_GUSBCFG_TRDT; - USBx->GUSBCFG |= (uint32_t)((UsbTrd << 10) & USB_OTG_GUSBCFG_TRDT); - - return HAL_OK; -} - -/** - * @brief USB_EnableGlobalInt - * Enables the controller's Global Int in the AHB Config reg - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx) -{ - USBx->GAHBCFG |= USB_OTG_GAHBCFG_GINT; - return HAL_OK; -} - -/** - * @brief USB_DisableGlobalInt - * Disable the controller's Global Int in the AHB Config reg - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx) -{ - USBx->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT; - return HAL_OK; -} - -/** - * @brief USB_SetCurrentMode Set functional mode - * @param USBx Selected device - * @param mode current core mode - * This parameter can be one of these values: - * @arg USB_DEVICE_MODE Peripheral mode - * @arg USB_HOST_MODE Host mode - * @retval HAL status - */ -HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx, USB_OTG_ModeTypeDef mode) -{ - uint32_t ms = 0U; - - USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_FHMOD | USB_OTG_GUSBCFG_FDMOD); - - if (mode == USB_HOST_MODE) - { - USBx->GUSBCFG |= USB_OTG_GUSBCFG_FHMOD; - - do - { - HAL_Delay(10U); - ms += 10U; - } while ((USB_GetMode(USBx) != (uint32_t)USB_HOST_MODE) && (ms < HAL_USB_CURRENT_MODE_MAX_DELAY_MS)); - } - else if (mode == USB_DEVICE_MODE) - { - USBx->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD; - - do - { - HAL_Delay(10U); - ms += 10U; - } while ((USB_GetMode(USBx) != (uint32_t)USB_DEVICE_MODE) && (ms < HAL_USB_CURRENT_MODE_MAX_DELAY_MS)); - } - else - { - return HAL_ERROR; - } - - if (ms == HAL_USB_CURRENT_MODE_MAX_DELAY_MS) - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief USB_DevInit Initializes the USB_OTG controller registers - * for device mode - * @param USBx Selected device - * @param cfg pointer to a USB_OTG_CfgTypeDef structure that contains - * the configuration information for the specified USBx peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) -{ - HAL_StatusTypeDef ret = HAL_OK; - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t i; - - for (i = 0U; i < 15U; i++) - { - USBx->DIEPTXF[i] = 0U; - } - -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \ - || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \ - || defined(STM32F423xx) - /* VBUS Sensing setup */ - if (cfg.vbus_sensing_enable == 0U) - { - USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS; - - /* Deactivate VBUS Sensing B */ - USBx->GCCFG &= ~USB_OTG_GCCFG_VBDEN; - - /* B-peripheral session valid override enable */ - USBx->GOTGCTL |= USB_OTG_GOTGCTL_BVALOEN; - USBx->GOTGCTL |= USB_OTG_GOTGCTL_BVALOVAL; - } - else - { - /* Enable HW VBUS sensing */ - USBx->GCCFG |= USB_OTG_GCCFG_VBDEN; - } -#else - /* VBUS Sensing setup */ - if (cfg.vbus_sensing_enable == 0U) - { - /* - * Disable HW VBUS sensing. VBUS is internally considered to be always - * at VBUS-Valid level (5V). - */ - USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS; - USBx->GCCFG |= USB_OTG_GCCFG_NOVBUSSENS; - USBx->GCCFG &= ~USB_OTG_GCCFG_VBUSBSEN; - USBx->GCCFG &= ~USB_OTG_GCCFG_VBUSASEN; - } - else - { - /* Enable HW VBUS sensing */ - USBx->GCCFG &= ~USB_OTG_GCCFG_NOVBUSSENS; - USBx->GCCFG |= USB_OTG_GCCFG_VBUSBSEN; - } -#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || - defined(STM32F423xx) */ - - /* Restart the Phy Clock */ - USBx_PCGCCTL = 0U; - - if (cfg.phy_itface == USB_OTG_ULPI_PHY) - { - if (cfg.speed == USBD_HS_SPEED) - { - /* Set Core speed to High speed mode */ - (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH); - } - else - { - /* Set Core speed to Full speed mode */ - (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH_IN_FULL); - } - } - else - { - /* Set Core speed to Full speed mode */ - (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_FULL); - } - - /* Flush the FIFOs */ - if (USB_FlushTxFifo(USBx, 0x10U) != HAL_OK) /* all Tx FIFOs */ - { - ret = HAL_ERROR; - } - - if (USB_FlushRxFifo(USBx) != HAL_OK) - { - ret = HAL_ERROR; - } - - /* Clear all pending Device Interrupts */ - USBx_DEVICE->DIEPMSK = 0U; - USBx_DEVICE->DOEPMSK = 0U; - USBx_DEVICE->DAINTMSK = 0U; - - for (i = 0U; i < cfg.dev_endpoints; i++) - { - if ((USBx_INEP(i)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) - { - if (i == 0U) - { - USBx_INEP(i)->DIEPCTL = USB_OTG_DIEPCTL_SNAK; - } - else - { - USBx_INEP(i)->DIEPCTL = USB_OTG_DIEPCTL_EPDIS | USB_OTG_DIEPCTL_SNAK; - } - } - else - { - USBx_INEP(i)->DIEPCTL = 0U; - } - - USBx_INEP(i)->DIEPTSIZ = 0U; - USBx_INEP(i)->DIEPINT = 0xFB7FU; - } - - for (i = 0U; i < cfg.dev_endpoints; i++) - { - if ((USBx_OUTEP(i)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) - { - if (i == 0U) - { - USBx_OUTEP(i)->DOEPCTL = USB_OTG_DOEPCTL_SNAK; - } - else - { - USBx_OUTEP(i)->DOEPCTL = USB_OTG_DOEPCTL_EPDIS | USB_OTG_DOEPCTL_SNAK; - } - } - else - { - USBx_OUTEP(i)->DOEPCTL = 0U; - } - - USBx_OUTEP(i)->DOEPTSIZ = 0U; - USBx_OUTEP(i)->DOEPINT = 0xFB7FU; - } - - USBx_DEVICE->DIEPMSK &= ~(USB_OTG_DIEPMSK_TXFURM); - - /* Disable all interrupts. */ - USBx->GINTMSK = 0U; - - /* Clear any pending interrupts */ - USBx->GINTSTS = 0xBFFFFFFFU; - - /* Enable the common interrupts */ - if (cfg.dma_enable == 0U) - { - USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM; - } - - /* Enable interrupts matching to the Device mode ONLY */ - USBx->GINTMSK |= USB_OTG_GINTMSK_USBSUSPM | USB_OTG_GINTMSK_USBRST | - USB_OTG_GINTMSK_ENUMDNEM | USB_OTG_GINTMSK_IEPINT | - USB_OTG_GINTMSK_OEPINT | USB_OTG_GINTMSK_IISOIXFRM | - USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM; - - if (cfg.Sof_enable != 0U) - { - USBx->GINTMSK |= USB_OTG_GINTMSK_SOFM; - } - - if (cfg.vbus_sensing_enable == 1U) - { - USBx->GINTMSK |= (USB_OTG_GINTMSK_SRQIM | USB_OTG_GINTMSK_OTGINT); - } - - return ret; -} - -/** - * @brief USB_FlushTxFifo Flush a Tx FIFO - * @param USBx Selected device - * @param num FIFO number - * This parameter can be a value from 1 to 15 - 15 means Flush all Tx FIFOs - * @retval HAL status - */ -HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num) -{ - __IO uint32_t count = 0U; - - /* Wait for AHB master IDLE state. */ - do - { - count++; - - if (count > HAL_USB_TIMEOUT) - { - return HAL_TIMEOUT; - } - } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); - - /* Flush TX Fifo */ - count = 0U; - USBx->GRSTCTL = (USB_OTG_GRSTCTL_TXFFLSH | (num << 6)); - - do - { - count++; - - if (count > HAL_USB_TIMEOUT) - { - return HAL_TIMEOUT; - } - } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH); - - return HAL_OK; -} - -/** - * @brief USB_FlushRxFifo Flush Rx FIFO - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx) -{ - __IO uint32_t count = 0U; - - /* Wait for AHB master IDLE state. */ - do - { - count++; - - if (count > HAL_USB_TIMEOUT) - { - return HAL_TIMEOUT; - } - } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); - - /* Flush RX Fifo */ - count = 0U; - USBx->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH; - - do - { - count++; - - if (count > HAL_USB_TIMEOUT) - { - return HAL_TIMEOUT; - } - } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH); - - return HAL_OK; -} - -/** - * @brief USB_SetDevSpeed Initializes the DevSpd field of DCFG register - * depending the PHY type and the enumeration speed of the device. - * @param USBx Selected device - * @param speed device speed - * This parameter can be one of these values: - * @arg USB_OTG_SPEED_HIGH: High speed mode - * @arg USB_OTG_SPEED_HIGH_IN_FULL: High speed core in Full Speed mode - * @arg USB_OTG_SPEED_FULL: Full speed mode - * @retval Hal status - */ -HAL_StatusTypeDef USB_SetDevSpeed(const USB_OTG_GlobalTypeDef *USBx, uint8_t speed) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - USBx_DEVICE->DCFG |= speed; - return HAL_OK; -} - -/** - * @brief USB_GetDevSpeed Return the Dev Speed - * @param USBx Selected device - * @retval speed device speed - * This parameter can be one of these values: - * @arg USBD_HS_SPEED: High speed mode - * @arg USBD_FS_SPEED: Full speed mode - */ -uint8_t USB_GetDevSpeed(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint8_t speed; - uint32_t DevEnumSpeed = USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD; - - if (DevEnumSpeed == DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ) - { - speed = USBD_HS_SPEED; - } - else if ((DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ) || - (DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_48MHZ)) - { - speed = USBD_FS_SPEED; - } - else - { - speed = 0xFU; - } - - return speed; -} - -/** - * @brief Activate and configure an endpoint - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_ActivateEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - - if (ep->is_in == 1U) - { - USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK)); - - if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_USBAEP) == 0U) - { - USBx_INEP(epnum)->DIEPCTL |= (ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ) | - ((uint32_t)ep->type << 18) | (epnum << 22) | - USB_OTG_DIEPCTL_SD0PID_SEVNFRM | - USB_OTG_DIEPCTL_USBAEP; - } - } - else - { - USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16); - - if (((USBx_OUTEP(epnum)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0U) - { - USBx_OUTEP(epnum)->DOEPCTL |= (ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ) | - ((uint32_t)ep->type << 18) | - USB_OTG_DIEPCTL_SD0PID_SEVNFRM | - USB_OTG_DOEPCTL_USBAEP; - } - } - return HAL_OK; -} - -/** - * @brief Activate and configure a dedicated endpoint - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - - /* Read DEPCTLn register */ - if (ep->is_in == 1U) - { - if (((USBx_INEP(epnum)->DIEPCTL) & USB_OTG_DIEPCTL_USBAEP) == 0U) - { - USBx_INEP(epnum)->DIEPCTL |= (ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ) | - ((uint32_t)ep->type << 18) | (epnum << 22) | - USB_OTG_DIEPCTL_SD0PID_SEVNFRM | - USB_OTG_DIEPCTL_USBAEP; - } - - USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK)); - } - else - { - if (((USBx_OUTEP(epnum)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0U) - { - USBx_OUTEP(epnum)->DOEPCTL |= (ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ) | - ((uint32_t)ep->type << 18) | (epnum << 22) | - USB_OTG_DOEPCTL_USBAEP; - } - - USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16); - } - - return HAL_OK; -} - -/** - * @brief De-activate and de-initialize an endpoint - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_DeactivateEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - - /* Read DEPCTLn register */ - if (ep->is_in == 1U) - { - if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; - } - - USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); - USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_USBAEP | - USB_OTG_DIEPCTL_MPSIZ | - USB_OTG_DIEPCTL_TXFNUM | - USB_OTG_DIEPCTL_SD0PID_SEVNFRM | - USB_OTG_DIEPCTL_EPTYP); - } - else - { - if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) - { - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; - } - - USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); - USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_USBAEP | - USB_OTG_DOEPCTL_MPSIZ | - USB_OTG_DOEPCTL_SD0PID_SEVNFRM | - USB_OTG_DOEPCTL_EPTYP); - } - - return HAL_OK; -} - -/** - * @brief De-activate and de-initialize a dedicated endpoint - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - - /* Read DEPCTLn register */ - if (ep->is_in == 1U) - { - if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; - } - - USBx_INEP(epnum)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP; - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); - } - else - { - if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) - { - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; - } - - USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); - } - - return HAL_OK; -} - -/** - * @brief USB_EPStartXfer : setup and starts a transfer over an EP - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @param dma USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @retval HAL status - */ -HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep, uint8_t dma) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - uint16_t pktcnt; - - /* IN endpoint */ - if (ep->is_in == 1U) - { - /* Zero Length Packet? */ - if (ep->xfer_len == 0U) - { - USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); - USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); - USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); - } - else - { - /* Program the transfer size and packet count - * as follows: xfersize = N * maxpacket + - * short_packet pktcnt = N + (short_packet - * exist ? 1 : 0) - */ - USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); - USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); - - if (epnum == 0U) - { - if (ep->xfer_len > ep->maxpacket) - { - ep->xfer_len = ep->maxpacket; - } - - USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); - } - else - { - pktcnt = (uint16_t)((ep->xfer_len + ep->maxpacket - 1U) / ep->maxpacket); - USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (pktcnt << 19)); - - if (ep->type == EP_TYPE_ISOC) - { - USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_MULCNT); - USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & (pktcnt << 29)); - } - } - - USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len); - } - - if (dma == 1U) - { - if ((uint32_t)ep->dma_addr != 0U) - { - USBx_INEP(epnum)->DIEPDMA = (uint32_t)(ep->dma_addr); - } - - if (ep->type == EP_TYPE_ISOC) - { - if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; - } - else - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; - } - } - - /* EP enable, IN data in FIFO */ - USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); - } - else - { - /* EP enable, IN data in FIFO */ - USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); - - if (ep->type != EP_TYPE_ISOC) - { - /* Enable the Tx FIFO Empty Interrupt for this EP */ - if (ep->xfer_len > 0U) - { - USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK); - } - } - else - { - if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; - } - else - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; - } - - (void)USB_WritePacket(USBx, ep->xfer_buff, ep->num, (uint16_t)ep->xfer_len, dma); - } - } - } - else /* OUT endpoint */ - { - /* Program the transfer size and packet count as follows: - * pktcnt = N - * xfersize = N * maxpacket - */ - USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ); - USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT); - - if (epnum == 0U) - { - if (ep->xfer_len > 0U) - { - ep->xfer_len = ep->maxpacket; - } - - /* Store transfer size, for EP0 this is equal to endpoint max packet size */ - ep->xfer_size = ep->maxpacket; - - USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & ep->xfer_size); - USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); - } - else - { - if (ep->xfer_len == 0U) - { - USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & ep->maxpacket); - USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); - } - else - { - pktcnt = (uint16_t)((ep->xfer_len + ep->maxpacket - 1U) / ep->maxpacket); - ep->xfer_size = ep->maxpacket * pktcnt; - - USBx_OUTEP(epnum)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_PKTCNT & ((uint32_t)pktcnt << 19); - USBx_OUTEP(epnum)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_XFRSIZ & ep->xfer_size; - } - } - - if (dma == 1U) - { - if ((uint32_t)ep->xfer_buff != 0U) - { - USBx_OUTEP(epnum)->DOEPDMA = (uint32_t)(ep->xfer_buff); - } - } - - if (ep->type == EP_TYPE_ISOC) - { - if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) - { - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SODDFRM; - } - else - { - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; - } - } - /* EP enable */ - USBx_OUTEP(epnum)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA); - } - - return HAL_OK; -} - - -/** - * @brief USB_EPStoptXfer Stop transfer on an EP - * @param USBx usb device instance - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_EPStopXfer(const USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) -{ - __IO uint32_t count = 0U; - HAL_StatusTypeDef ret = HAL_OK; - uint32_t USBx_BASE = (uint32_t)USBx; - - /* IN endpoint */ - if (ep->is_in == 1U) - { - /* EP enable, IN data in FIFO */ - if (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) - { - USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_SNAK); - USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_EPDIS); - - do - { - count++; - - if (count > 10000U) - { - ret = HAL_ERROR; - break; - } - } while (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA); - } - } - else /* OUT endpoint */ - { - if (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) - { - USBx_OUTEP(ep->num)->DOEPCTL |= (USB_OTG_DOEPCTL_SNAK); - USBx_OUTEP(ep->num)->DOEPCTL |= (USB_OTG_DOEPCTL_EPDIS); - - do - { - count++; - - if (count > 10000U) - { - ret = HAL_ERROR; - break; - } - } while (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA); - } - } - - return ret; -} - - -/** - * @brief USB_WritePacket : Writes a packet into the Tx FIFO associated - * with the EP/channel - * @param USBx Selected device - * @param src pointer to source buffer - * @param ch_ep_num endpoint or host channel number - * @param len Number of bytes to write - * @param dma USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @retval HAL status - */ -HAL_StatusTypeDef USB_WritePacket(const USB_OTG_GlobalTypeDef *USBx, uint8_t *src, - uint8_t ch_ep_num, uint16_t len, uint8_t dma) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint8_t *pSrc = src; - uint32_t count32b; - uint32_t i; - - if (dma == 0U) - { - count32b = ((uint32_t)len + 3U) / 4U; - for (i = 0U; i < count32b; i++) - { - USBx_DFIFO((uint32_t)ch_ep_num) = __UNALIGNED_UINT32_READ(pSrc); - pSrc++; - pSrc++; - pSrc++; - pSrc++; - } - } - - return HAL_OK; -} - -/** - * @brief USB_ReadPacket : read a packet from the RX FIFO - * @param USBx Selected device - * @param dest source pointer - * @param len Number of bytes to read - * @retval pointer to destination buffer - */ -void *USB_ReadPacket(const USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint8_t *pDest = dest; - uint32_t pData; - uint32_t i; - uint32_t count32b = (uint32_t)len >> 2U; - uint16_t remaining_bytes = len % 4U; - - for (i = 0U; i < count32b; i++) - { - __UNALIGNED_UINT32_WRITE(pDest, USBx_DFIFO(0U)); - pDest++; - pDest++; - pDest++; - pDest++; - } - - /* When Number of data is not word aligned, read the remaining byte */ - if (remaining_bytes != 0U) - { - i = 0U; - __UNALIGNED_UINT32_WRITE(&pData, USBx_DFIFO(0U)); - - do - { - *(uint8_t *)pDest = (uint8_t)(pData >> (8U * (uint8_t)(i))); - i++; - pDest++; - remaining_bytes--; - } while (remaining_bytes != 0U); - } - - return ((void *)pDest); -} - -/** - * @brief USB_EPSetStall : set a stall condition over an EP - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_EPSetStall(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - - if (ep->is_in == 1U) - { - if (((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == 0U) && (epnum != 0U)) - { - USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_EPDIS); - } - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_STALL; - } - else - { - if (((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == 0U) && (epnum != 0U)) - { - USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_EPDIS); - } - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_STALL; - } - - return HAL_OK; -} - -/** - * @brief USB_EPClearStall : Clear a stall condition over an EP - * @param USBx Selected device - * @param ep pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_EPClearStall(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t epnum = (uint32_t)ep->num; - - if (ep->is_in == 1U) - { - USBx_INEP(epnum)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; - if ((ep->type == EP_TYPE_INTR) || (ep->type == EP_TYPE_BULK)) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; /* DATA0 */ - } - } - else - { - USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; - if ((ep->type == EP_TYPE_INTR) || (ep->type == EP_TYPE_BULK)) - { - USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; /* DATA0 */ - } - } - return HAL_OK; -} - -/** - * @brief USB_StopDevice : Stop the usb device mode - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx) -{ - HAL_StatusTypeDef ret; - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t i; - - /* Clear Pending interrupt */ - for (i = 0U; i < 15U; i++) - { - USBx_INEP(i)->DIEPINT = 0xFB7FU; - USBx_OUTEP(i)->DOEPINT = 0xFB7FU; - } - - /* Clear interrupt masks */ - USBx_DEVICE->DIEPMSK = 0U; - USBx_DEVICE->DOEPMSK = 0U; - USBx_DEVICE->DAINTMSK = 0U; - - /* Flush the FIFO */ - ret = USB_FlushRxFifo(USBx); - if (ret != HAL_OK) - { - return ret; - } - - ret = USB_FlushTxFifo(USBx, 0x10U); - if (ret != HAL_OK) - { - return ret; - } - - return ret; -} - -/** - * @brief USB_SetDevAddress : Stop the usb device mode - * @param USBx Selected device - * @param address new device address to be assigned - * This parameter can be a value from 0 to 255 - * @retval HAL status - */ -HAL_StatusTypeDef USB_SetDevAddress(const USB_OTG_GlobalTypeDef *USBx, uint8_t address) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - USBx_DEVICE->DCFG &= ~(USB_OTG_DCFG_DAD); - USBx_DEVICE->DCFG |= ((uint32_t)address << 4) & USB_OTG_DCFG_DAD; - - return HAL_OK; -} - -/** - * @brief USB_DevConnect : Connect the USB device by enabling Rpu - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_DevConnect(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - /* In case phy is stopped, ensure to ungate and restore the phy CLK */ - USBx_PCGCCTL &= ~(USB_OTG_PCGCCTL_STOPCLK | USB_OTG_PCGCCTL_GATECLK); - - USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_SDIS; - - return HAL_OK; -} - -/** - * @brief USB_DevDisconnect : Disconnect the USB device by disabling Rpu - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_DevDisconnect(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - /* In case phy is stopped, ensure to ungate and restore the phy CLK */ - USBx_PCGCCTL &= ~(USB_OTG_PCGCCTL_STOPCLK | USB_OTG_PCGCCTL_GATECLK); - - USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS; - - return HAL_OK; -} - -/** - * @brief USB_ReadInterrupts: return the global USB interrupt status - * @param USBx Selected device - * @retval USB Global Interrupt status - */ -uint32_t USB_ReadInterrupts(USB_OTG_GlobalTypeDef const *USBx) -{ - uint32_t tmpreg; - - tmpreg = USBx->GINTSTS; - tmpreg &= USBx->GINTMSK; - - return tmpreg; -} - -/** - * @brief USB_ReadChInterrupts: return USB channel interrupt status - * @param USBx Selected device - * @param chnum Channel number - * @retval USB Channel Interrupt status - */ -uint32_t USB_ReadChInterrupts(const USB_OTG_GlobalTypeDef *USBx, uint8_t chnum) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t tmpreg; - - tmpreg = USBx_HC(chnum)->HCINT; - tmpreg &= USBx_HC(chnum)->HCINTMSK; - - return tmpreg; -} - -/** - * @brief USB_ReadDevAllOutEpInterrupt: return the USB device OUT endpoints interrupt status - * @param USBx Selected device - * @retval USB Device OUT EP interrupt status - */ -uint32_t USB_ReadDevAllOutEpInterrupt(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t tmpreg; - - tmpreg = USBx_DEVICE->DAINT; - tmpreg &= USBx_DEVICE->DAINTMSK; - - return ((tmpreg & 0xffff0000U) >> 16); -} - -/** - * @brief USB_ReadDevAllInEpInterrupt: return the USB device IN endpoints interrupt status - * @param USBx Selected device - * @retval USB Device IN EP interrupt status - */ -uint32_t USB_ReadDevAllInEpInterrupt(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t tmpreg; - - tmpreg = USBx_DEVICE->DAINT; - tmpreg &= USBx_DEVICE->DAINTMSK; - - return ((tmpreg & 0xFFFFU)); -} - -/** - * @brief Returns Device OUT EP Interrupt register - * @param USBx Selected device - * @param epnum endpoint number - * This parameter can be a value from 0 to 15 - * @retval Device OUT EP Interrupt register - */ -uint32_t USB_ReadDevOutEPInterrupt(const USB_OTG_GlobalTypeDef *USBx, uint8_t epnum) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t tmpreg; - - tmpreg = USBx_OUTEP((uint32_t)epnum)->DOEPINT; - tmpreg &= USBx_DEVICE->DOEPMSK; - - return tmpreg; -} - -/** - * @brief Returns Device IN EP Interrupt register - * @param USBx Selected device - * @param epnum endpoint number - * This parameter can be a value from 0 to 15 - * @retval Device IN EP Interrupt register - */ -uint32_t USB_ReadDevInEPInterrupt(const USB_OTG_GlobalTypeDef *USBx, uint8_t epnum) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t tmpreg; - uint32_t msk; - uint32_t emp; - - msk = USBx_DEVICE->DIEPMSK; - emp = USBx_DEVICE->DIEPEMPMSK; - msk |= ((emp >> (epnum & EP_ADDR_MSK)) & 0x1U) << 7; - tmpreg = USBx_INEP((uint32_t)epnum)->DIEPINT & msk; - - return tmpreg; -} - -/** - * @brief USB_ClearInterrupts: clear a USB interrupt - * @param USBx Selected device - * @param interrupt flag - * @retval None - */ -void USB_ClearInterrupts(USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt) -{ - USBx->GINTSTS &= interrupt; -} - -/** - * @brief Returns USB core mode - * @param USBx Selected device - * @retval return core mode : Host or Device - * This parameter can be one of these values: - * 0 : Host - * 1 : Device - */ -uint32_t USB_GetMode(const USB_OTG_GlobalTypeDef *USBx) -{ - return ((USBx->GINTSTS) & 0x1U); -} - -/** - * @brief Activate EP0 for Setup transactions - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_ActivateSetup(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - /* Set the MPS of the IN EP0 to 64 bytes */ - USBx_INEP(0U)->DIEPCTL &= ~USB_OTG_DIEPCTL_MPSIZ; - - USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGINAK; - - return HAL_OK; -} - -/** - * @brief Prepare the EP0 to start the first control setup - * @param USBx Selected device - * @param dma USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @param psetup pointer to setup packet - * @retval HAL status - */ -HAL_StatusTypeDef USB_EP0_OutStart(const USB_OTG_GlobalTypeDef *USBx, uint8_t dma, const uint8_t *psetup) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t gSNPSiD = *(__IO const uint32_t *)(&USBx->CID + 0x1U); - - if (gSNPSiD > USB_OTG_CORE_ID_300A) - { - if ((USBx_OUTEP(0U)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) - { - return HAL_OK; - } - } - - USBx_OUTEP(0U)->DOEPTSIZ = 0U; - USBx_OUTEP(0U)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); - USBx_OUTEP(0U)->DOEPTSIZ |= (3U * 8U); - USBx_OUTEP(0U)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_STUPCNT; - - if (dma == 1U) - { - USBx_OUTEP(0U)->DOEPDMA = (uint32_t)psetup; - /* EP enable */ - USBx_OUTEP(0U)->DOEPCTL |= USB_OTG_DOEPCTL_EPENA | USB_OTG_DOEPCTL_USBAEP; - } - - return HAL_OK; -} - -/** - * @brief Reset the USB Core (needed after USB clock settings change) - * @param USBx Selected device - * @retval HAL status - */ -static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx) -{ - __IO uint32_t count = 0U; - - /* Wait for AHB master IDLE state. */ - do - { - count++; - - if (count > HAL_USB_TIMEOUT) - { - return HAL_TIMEOUT; - } - } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); - - /* Core Soft Reset */ - count = 0U; - USBx->GRSTCTL |= USB_OTG_GRSTCTL_CSRST; - - do - { - count++; - - if (count > HAL_USB_TIMEOUT) - { - return HAL_TIMEOUT; - } - } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST); - - return HAL_OK; -} - -/** - * @brief USB_HostInit : Initializes the USB OTG controller registers - * for Host mode - * @param USBx Selected device - * @param cfg pointer to a USB_OTG_CfgTypeDef structure that contains - * the configuration information for the specified USBx peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) -{ - HAL_StatusTypeDef ret = HAL_OK; - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t i; - - /* Restart the Phy Clock */ - USBx_PCGCCTL = 0U; - -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \ - || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \ - || defined(STM32F423xx) - /* Disable HW VBUS sensing */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_VBDEN); -#else - /* - * Disable HW VBUS sensing. VBUS is internally considered to be always - * at VBUS-Valid level (5V). - */ - USBx->GCCFG |= USB_OTG_GCCFG_NOVBUSSENS; - USBx->GCCFG &= ~USB_OTG_GCCFG_VBUSBSEN; - USBx->GCCFG &= ~USB_OTG_GCCFG_VBUSASEN; -#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || - defined(STM32F423xx) */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) \ - || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - /* Disable Battery chargin detector */ - USBx->GCCFG &= ~(USB_OTG_GCCFG_BCDEN); -#endif /* defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) */ - - if ((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) == 0U) - { - if (cfg.speed == USBH_FSLS_SPEED) - { - /* Force Device Enumeration to FS/LS mode only */ - USBx_HOST->HCFG |= USB_OTG_HCFG_FSLSS; - } - else - { - /* Set default Max speed support */ - USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSS); - } - } - else - { - /* Set default Max speed support */ - USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSS); - } - - /* Make sure the FIFOs are flushed. */ - if (USB_FlushTxFifo(USBx, 0x10U) != HAL_OK) /* all Tx FIFOs */ - { - ret = HAL_ERROR; - } - - if (USB_FlushRxFifo(USBx) != HAL_OK) - { - ret = HAL_ERROR; - } - - /* Clear all pending HC Interrupts */ - for (i = 0U; i < cfg.Host_channels; i++) - { - USBx_HC(i)->HCINT = CLEAR_INTERRUPT_MASK; - USBx_HC(i)->HCINTMSK = 0U; - } - - /* Disable all interrupts. */ - USBx->GINTMSK = 0U; - - /* Clear any pending interrupts */ - USBx->GINTSTS = CLEAR_INTERRUPT_MASK; -#if defined (USB_OTG_HS) - if (USBx == USB_OTG_HS) - { - /* set Rx FIFO size */ - USBx->GRXFSIZ = 0x200U; - USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t)(((0x100U << 16) & USB_OTG_NPTXFD) | 0x200U); - USBx->HPTXFSIZ = (uint32_t)(((0xE0U << 16) & USB_OTG_HPTXFSIZ_PTXFD) | 0x300U); - } - else -#endif /* defined (USB_OTG_HS) */ - { - /* set Rx FIFO size */ - USBx->GRXFSIZ = 0x80U; - USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t)(((0x60U << 16) & USB_OTG_NPTXFD) | 0x80U); - USBx->HPTXFSIZ = (uint32_t)(((0x40U << 16)& USB_OTG_HPTXFSIZ_PTXFD) | 0xE0U); - } - - /* Enable the common interrupts */ - if (cfg.dma_enable == 0U) - { - USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM; - } - - /* Enable interrupts matching to the Host mode ONLY */ - USBx->GINTMSK |= (USB_OTG_GINTMSK_PRTIM | USB_OTG_GINTMSK_HCIM | \ - USB_OTG_GINTMSK_SOFM | USB_OTG_GINTSTS_DISCINT | \ - USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM); - - return ret; -} - -/** - * @brief USB_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the - * HCFG register on the PHY type and set the right frame interval - * @param USBx Selected device - * @param freq clock frequency - * This parameter can be one of these values: - * HCFG_48_MHZ : Full Speed 48 MHz Clock - * HCFG_6_MHZ : Low Speed 6 MHz Clock - * @retval HAL status - */ -HAL_StatusTypeDef USB_InitFSLSPClkSel(const USB_OTG_GlobalTypeDef *USBx, uint8_t freq) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSPCS); - USBx_HOST->HCFG |= (uint32_t)freq & USB_OTG_HCFG_FSLSPCS; - - if (freq == HCFG_48_MHZ) - { - USBx_HOST->HFIR = HFIR_48_MHZ; - } - else if (freq == HCFG_6_MHZ) - { - USBx_HOST->HFIR = HFIR_6_MHZ; - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief USB_OTG_ResetPort : Reset Host Port - * @param USBx Selected device - * @retval HAL status - * @note (1)The application must wait at least 10 ms - * before clearing the reset bit. - */ -HAL_StatusTypeDef USB_ResetPort(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - __IO uint32_t hprt0 = 0U; - - hprt0 = USBx_HPRT0; - - hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | - USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG); - - USBx_HPRT0 = (USB_OTG_HPRT_PRST | hprt0); - HAL_Delay(100U); /* See Note #1 */ - USBx_HPRT0 = ((~USB_OTG_HPRT_PRST) & hprt0); - HAL_Delay(10U); - - return HAL_OK; -} - -/** - * @brief USB_DriveVbus : activate or de-activate vbus - * @param state VBUS state - * This parameter can be one of these values: - * 0 : Deactivate VBUS - * 1 : Activate VBUS - * @retval HAL status - */ -HAL_StatusTypeDef USB_DriveVbus(const USB_OTG_GlobalTypeDef *USBx, uint8_t state) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - __IO uint32_t hprt0 = 0U; - - hprt0 = USBx_HPRT0; - - hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | - USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG); - - if (((hprt0 & USB_OTG_HPRT_PPWR) == 0U) && (state == 1U)) - { - USBx_HPRT0 = (USB_OTG_HPRT_PPWR | hprt0); - } - if (((hprt0 & USB_OTG_HPRT_PPWR) == USB_OTG_HPRT_PPWR) && (state == 0U)) - { - USBx_HPRT0 = ((~USB_OTG_HPRT_PPWR) & hprt0); - } - return HAL_OK; -} - -/** - * @brief Return Host Core speed - * @param USBx Selected device - * @retval speed : Host speed - * This parameter can be one of these values: - * @arg HCD_SPEED_HIGH: High speed mode - * @arg HCD_SPEED_FULL: Full speed mode - * @arg HCD_SPEED_LOW: Low speed mode - */ -uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef const *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - __IO uint32_t hprt0 = 0U; - - hprt0 = USBx_HPRT0; - return ((hprt0 & USB_OTG_HPRT_PSPD) >> 17); -} - -/** - * @brief Return Host Current Frame number - * @param USBx Selected device - * @retval current frame number - */ -uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef const *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - return (USBx_HOST->HFNUM & USB_OTG_HFNUM_FRNUM); -} - -/** - * @brief Initialize a host channel - * @param USBx Selected device - * @param ch_num Channel number - * This parameter can be a value from 1 to 15 - * @param epnum Endpoint number - * This parameter can be a value from 1 to 15 - * @param dev_address Current device address - * This parameter can be a value from 0 to 255 - * @param speed Current device speed - * This parameter can be one of these values: - * @arg USB_OTG_SPEED_HIGH: High speed mode - * @arg USB_OTG_SPEED_FULL: Full speed mode - * @arg USB_OTG_SPEED_LOW: Low speed mode - * @param ep_type Endpoint Type - * This parameter can be one of these values: - * @arg EP_TYPE_CTRL: Control type - * @arg EP_TYPE_ISOC: Isochronous type - * @arg EP_TYPE_BULK: Bulk type - * @arg EP_TYPE_INTR: Interrupt type - * @param mps Max Packet Size - * This parameter can be a value from 0 to 32K - * @retval HAL state - */ -HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num, - uint8_t epnum, uint8_t dev_address, uint8_t speed, - uint8_t ep_type, uint16_t mps) -{ - HAL_StatusTypeDef ret = HAL_OK; - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t HCcharEpDir; - uint32_t HCcharLowSpeed; - uint32_t HostCoreSpeed; - - /* Clear old interrupt conditions for this host channel. */ - USBx_HC((uint32_t)ch_num)->HCINT = CLEAR_INTERRUPT_MASK; - - /* Enable channel interrupts required for this transfer. */ - switch (ep_type) - { - case EP_TYPE_CTRL: - case EP_TYPE_BULK: - USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM | - USB_OTG_HCINTMSK_STALLM | - USB_OTG_HCINTMSK_TXERRM | - USB_OTG_HCINTMSK_DTERRM | - USB_OTG_HCINTMSK_AHBERR | - USB_OTG_HCINTMSK_NAKM; - - if ((epnum & 0x80U) == 0x80U) - { - USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM; - } - else - { -#if defined (USB_OTG_HS) - if (USBx == USB_OTG_HS) - { - USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_NYET | - USB_OTG_HCINTMSK_ACKM; - } -#endif /* defined (USB_OTG_HS) */ - } - break; - - case EP_TYPE_INTR: - USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM | - USB_OTG_HCINTMSK_STALLM | - USB_OTG_HCINTMSK_TXERRM | - USB_OTG_HCINTMSK_DTERRM | - USB_OTG_HCINTMSK_NAKM | - USB_OTG_HCINTMSK_AHBERR | - USB_OTG_HCINTMSK_FRMORM; - - if ((epnum & 0x80U) == 0x80U) - { - USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM; - } - - break; - - case EP_TYPE_ISOC: - USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM | - USB_OTG_HCINTMSK_ACKM | - USB_OTG_HCINTMSK_AHBERR | - USB_OTG_HCINTMSK_FRMORM; - - if ((epnum & 0x80U) == 0x80U) - { - USBx_HC((uint32_t)ch_num)->HCINTMSK |= (USB_OTG_HCINTMSK_TXERRM | USB_OTG_HCINTMSK_BBERRM); - } - break; - - default: - ret = HAL_ERROR; - break; - } - - /* Clear Hub Start Split transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT = 0U; - - /* Enable host channel Halt interrupt */ - USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_CHHM; - - /* Enable the top level host channel interrupt. */ - USBx_HOST->HAINTMSK |= 1UL << (ch_num & 0xFU); - - /* Make sure host channel interrupts are enabled. */ - USBx->GINTMSK |= USB_OTG_GINTMSK_HCIM; - - /* Program the HCCHAR register */ - if ((epnum & 0x80U) == 0x80U) - { - HCcharEpDir = (0x1U << 15) & USB_OTG_HCCHAR_EPDIR; - } - else - { - HCcharEpDir = 0U; - } - - HostCoreSpeed = USB_GetHostSpeed(USBx); - - /* LS device plugged to HUB */ - if ((speed == HPRT0_PRTSPD_LOW_SPEED) && (HostCoreSpeed != HPRT0_PRTSPD_LOW_SPEED)) - { - HCcharLowSpeed = (0x1U << 17) & USB_OTG_HCCHAR_LSDEV; - } - else - { - HCcharLowSpeed = 0U; - } - - USBx_HC((uint32_t)ch_num)->HCCHAR = (((uint32_t)dev_address << 22) & USB_OTG_HCCHAR_DAD) | - ((((uint32_t)epnum & 0x7FU) << 11) & USB_OTG_HCCHAR_EPNUM) | - (((uint32_t)ep_type << 18) & USB_OTG_HCCHAR_EPTYP) | - ((uint32_t)mps & USB_OTG_HCCHAR_MPSIZ) | - USB_OTG_HCCHAR_MC_0 | HCcharEpDir | HCcharLowSpeed; - - if ((ep_type == EP_TYPE_INTR) || (ep_type == EP_TYPE_ISOC)) - { - USBx_HC((uint32_t)ch_num)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM; - } - - return ret; -} - -/** - * @brief Start a transfer over a host channel - * @param USBx Selected device - * @param hc pointer to host channel structure - * @param dma USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @retval HAL state - */ -HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t ch_num = (uint32_t)hc->ch_num; - __IO uint32_t tmpreg; - uint8_t is_oddframe; - uint16_t len_words; - uint16_t num_packets; - uint16_t max_hc_pkt_count = HC_MAX_PKT_CNT; - -#if defined (USB_OTG_HS) - if (USBx == USB_OTG_HS) - { - /* in DMA mode host Core automatically issues ping in case of NYET/NAK */ - if (dma == 1U) - { - if (((hc->ep_type == EP_TYPE_CTRL) || (hc->ep_type == EP_TYPE_BULK)) && (hc->do_ssplit == 0U)) - { - - USBx_HC((uint32_t)ch_num)->HCINTMSK &= ~(USB_OTG_HCINTMSK_NYET | - USB_OTG_HCINTMSK_ACKM | - USB_OTG_HCINTMSK_NAKM); - } - } - else - { - if ((hc->speed == USBH_HS_SPEED) && (hc->do_ping == 1U)) - { - (void)USB_DoPing(USBx, hc->ch_num); - return HAL_OK; - } - } - } -#endif /* defined (USB_OTG_HS) */ - - if (hc->do_ssplit == 1U) - { - /* Set number of packet to 1 for Split transaction */ - num_packets = 1U; - - if (hc->ep_is_in != 0U) - { - hc->XferSize = (uint32_t)num_packets * hc->max_packet; - } - else - { - if (hc->ep_type == EP_TYPE_ISOC) - { - if (hc->xfer_len > ISO_SPLT_MPS) - { - /* Isochrone Max Packet Size for Split mode */ - hc->XferSize = hc->max_packet; - hc->xfer_len = hc->XferSize; - - if ((hc->iso_splt_xactPos == HCSPLT_BEGIN) || (hc->iso_splt_xactPos == HCSPLT_MIDDLE)) - { - hc->iso_splt_xactPos = HCSPLT_MIDDLE; - } - else - { - hc->iso_splt_xactPos = HCSPLT_BEGIN; - } - } - else - { - hc->XferSize = hc->xfer_len; - - if ((hc->iso_splt_xactPos != HCSPLT_BEGIN) && (hc->iso_splt_xactPos != HCSPLT_MIDDLE)) - { - hc->iso_splt_xactPos = HCSPLT_FULL; - } - else - { - hc->iso_splt_xactPos = HCSPLT_END; - } - } - } - else - { - if ((dma == 1U) && (hc->xfer_len > hc->max_packet)) - { - hc->XferSize = (uint32_t)num_packets * hc->max_packet; - } - else - { - hc->XferSize = hc->xfer_len; - } - } - } - } - else - { - /* Compute the expected number of packets associated to the transfer */ - if (hc->xfer_len > 0U) - { - num_packets = (uint16_t)((hc->xfer_len + hc->max_packet - 1U) / hc->max_packet); - - if (num_packets > max_hc_pkt_count) - { - num_packets = max_hc_pkt_count; - hc->XferSize = (uint32_t)num_packets * hc->max_packet; - } - } - else - { - num_packets = 1U; - } - - /* - * For IN channel HCTSIZ.XferSize is expected to be an integer multiple of - * max_packet size. - */ - if (hc->ep_is_in != 0U) - { - hc->XferSize = (uint32_t)num_packets * hc->max_packet; - } - else - { - hc->XferSize = hc->xfer_len; - } - } - - /* Initialize the HCTSIZn register */ - USBx_HC(ch_num)->HCTSIZ = (hc->XferSize & USB_OTG_HCTSIZ_XFRSIZ) | - (((uint32_t)num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) | - (((uint32_t)hc->data_pid << 29) & USB_OTG_HCTSIZ_DPID); - - if (dma != 0U) - { - /* xfer_buff MUST be 32-bits aligned */ - USBx_HC(ch_num)->HCDMA = (uint32_t)hc->xfer_buff; - } - - is_oddframe = (((uint32_t)USBx_HOST->HFNUM & 0x01U) != 0U) ? 0U : 1U; - USBx_HC(ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM; - USBx_HC(ch_num)->HCCHAR |= (uint32_t)is_oddframe << 29; - - if (hc->do_ssplit == 1U) - { - /* Set Hub start Split transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT = ((uint32_t)hc->hub_addr << USB_OTG_HCSPLT_HUBADDR_Pos) | - (uint32_t)hc->hub_port_nbr | USB_OTG_HCSPLT_SPLITEN; - - /* unmask ack & nyet for IN/OUT transactions */ - USBx_HC((uint32_t)ch_num)->HCINTMSK |= (USB_OTG_HCINTMSK_ACKM | - USB_OTG_HCINTMSK_NYET); - - if ((hc->do_csplit == 1U) && (hc->ep_is_in == 0U)) - { - USBx_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_COMPLSPLT; - USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_NYET; - } - - if (((hc->ep_type == EP_TYPE_ISOC) || (hc->ep_type == EP_TYPE_INTR)) && - (hc->do_csplit == 1U) && (hc->ep_is_in == 1U)) - { - USBx_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_COMPLSPLT; - } - - /* Position management for iso out transaction on split mode */ - if ((hc->ep_type == EP_TYPE_ISOC) && (hc->ep_is_in == 0U)) - { - /* Set data payload position */ - switch (hc->iso_splt_xactPos) - { - case HCSPLT_BEGIN: - /* First data payload for OUT Transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_XACTPOS_1; - break; - - case HCSPLT_MIDDLE: - /* Middle data payload for OUT Transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_XACTPOS_Pos; - break; - - case HCSPLT_END: - /* End data payload for OUT Transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_XACTPOS_0; - break; - - case HCSPLT_FULL: - /* Entire data payload for OUT Transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_XACTPOS; - break; - - default: - break; - } - } - } - else - { - /* Clear Hub Start Split transaction */ - USBx_HC((uint32_t)ch_num)->HCSPLT = 0U; - } - - /* Set host channel enable */ - tmpreg = USBx_HC(ch_num)->HCCHAR; - tmpreg &= ~USB_OTG_HCCHAR_CHDIS; - - /* make sure to set the correct ep direction */ - if (hc->ep_is_in != 0U) - { - tmpreg |= USB_OTG_HCCHAR_EPDIR; - } - else - { - tmpreg &= ~USB_OTG_HCCHAR_EPDIR; - } - tmpreg |= USB_OTG_HCCHAR_CHENA; - USBx_HC(ch_num)->HCCHAR = tmpreg; - - if (dma != 0U) /* dma mode */ - { - return HAL_OK; - } - - if ((hc->ep_is_in == 0U) && (hc->xfer_len > 0U) && (hc->do_csplit == 0U)) - { - switch (hc->ep_type) - { - /* Non periodic transfer */ - case EP_TYPE_CTRL: - case EP_TYPE_BULK: - - len_words = (uint16_t)((hc->xfer_len + 3U) / 4U); - - /* check if there is enough space in FIFO space */ - if (len_words > (USBx->HNPTXSTS & 0xFFFFU)) - { - /* need to process data in nptxfempty interrupt */ - USBx->GINTMSK |= USB_OTG_GINTMSK_NPTXFEM; - } - break; - - /* Periodic transfer */ - case EP_TYPE_INTR: - case EP_TYPE_ISOC: - len_words = (uint16_t)((hc->xfer_len + 3U) / 4U); - /* check if there is enough space in FIFO space */ - if (len_words > (USBx_HOST->HPTXSTS & 0xFFFFU)) /* split the transfer */ - { - /* need to process data in ptxfempty interrupt */ - USBx->GINTMSK |= USB_OTG_GINTMSK_PTXFEM; - } - break; - - default: - break; - } - - /* Write packet into the Tx FIFO. */ - (void)USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, (uint16_t)hc->xfer_len, 0); - } - - return HAL_OK; -} - -/** - * @brief Read all host channel interrupts status - * @param USBx Selected device - * @retval HAL state - */ -uint32_t USB_HC_ReadInterrupt(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - return ((USBx_HOST->HAINT) & 0xFFFFU); -} - -/** - * @brief Halt a host channel - * @param USBx Selected device - * @param hc_num Host Channel number - * This parameter can be a value from 1 to 15 - * @retval HAL state - */ -HAL_StatusTypeDef USB_HC_Halt(const USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t hcnum = (uint32_t)hc_num; - __IO uint32_t count = 0U; - uint32_t HcEpType = (USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_EPTYP) >> 18; - uint32_t ChannelEna = (USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_CHENA) >> 31; - uint32_t SplitEna = (USBx_HC(hcnum)->HCSPLT & USB_OTG_HCSPLT_SPLITEN) >> 31; - - /* In buffer DMA, Channel disable must not be programmed for non-split periodic channels. - At the end of the next uframe/frame (in the worst case), the core generates a channel halted - and disables the channel automatically. */ - - if ((((USBx->GAHBCFG & USB_OTG_GAHBCFG_DMAEN) == USB_OTG_GAHBCFG_DMAEN) && (SplitEna == 0U)) && - ((ChannelEna == 0U) || (((HcEpType == HCCHAR_ISOC) || (HcEpType == HCCHAR_INTR))))) - { - return HAL_OK; - } - - /* Check for space in the request queue to issue the halt. */ - if ((HcEpType == HCCHAR_CTRL) || (HcEpType == HCCHAR_BULK)) - { - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHDIS; - - if ((USBx->GAHBCFG & USB_OTG_GAHBCFG_DMAEN) == 0U) - { - if ((USBx->HNPTXSTS & (0xFFU << 16)) == 0U) - { - USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA; - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - do - { - count++; - - if (count > 1000U) - { - break; - } - } while ((USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); - } - else - { - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - } - } - else - { - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - } - } - else - { - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHDIS; - - if ((USBx_HOST->HPTXSTS & (0xFFU << 16)) == 0U) - { - USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA; - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - do - { - count++; - - if (count > 1000U) - { - break; - } - } while ((USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); - } - else - { - USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - } - } - - return HAL_OK; -} - -/** - * @brief Initiate Do Ping protocol - * @param USBx Selected device - * @param hc_num Host Channel number - * This parameter can be a value from 1 to 15 - * @retval HAL state - */ -HAL_StatusTypeDef USB_DoPing(const USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t chnum = (uint32_t)ch_num; - uint32_t num_packets = 1U; - uint32_t tmpreg; - - USBx_HC(chnum)->HCTSIZ = ((num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) | - USB_OTG_HCTSIZ_DOPING; - - /* Set host channel enable */ - tmpreg = USBx_HC(chnum)->HCCHAR; - tmpreg &= ~USB_OTG_HCCHAR_CHDIS; - tmpreg |= USB_OTG_HCCHAR_CHENA; - USBx_HC(chnum)->HCCHAR = tmpreg; - - return HAL_OK; -} - -/** - * @brief Stop Host Core - * @param USBx Selected device - * @retval HAL state - */ -HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) -{ - HAL_StatusTypeDef ret = HAL_OK; - uint32_t USBx_BASE = (uint32_t)USBx; - __IO uint32_t count = 0U; - uint32_t value; - uint32_t i; - - (void)USB_DisableGlobalInt(USBx); - - /* Flush USB FIFO */ - if (USB_FlushTxFifo(USBx, 0x10U) != HAL_OK) /* all Tx FIFOs */ - { - ret = HAL_ERROR; - } - - if (USB_FlushRxFifo(USBx) != HAL_OK) - { - ret = HAL_ERROR; - } - - /* Flush out any leftover queued requests. */ - for (i = 0U; i <= 15U; i++) - { - value = USBx_HC(i)->HCCHAR; - value |= USB_OTG_HCCHAR_CHDIS; - value &= ~USB_OTG_HCCHAR_CHENA; - value &= ~USB_OTG_HCCHAR_EPDIR; - USBx_HC(i)->HCCHAR = value; - } - - /* Halt all channels to put them into a known state. */ - for (i = 0U; i <= 15U; i++) - { - value = USBx_HC(i)->HCCHAR; - value |= USB_OTG_HCCHAR_CHDIS; - value |= USB_OTG_HCCHAR_CHENA; - value &= ~USB_OTG_HCCHAR_EPDIR; - USBx_HC(i)->HCCHAR = value; - - do - { - count++; - - if (count > 1000U) - { - break; - } - } while ((USBx_HC(i)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); - } - - /* Clear any pending Host interrupts */ - USBx_HOST->HAINT = CLEAR_INTERRUPT_MASK; - USBx->GINTSTS = CLEAR_INTERRUPT_MASK; - - (void)USB_EnableGlobalInt(USBx); - - return ret; -} - -/** - * @brief USB_ActivateRemoteWakeup active remote wakeup signalling - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_ActivateRemoteWakeup(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS) - { - /* active Remote wakeup signalling */ - USBx_DEVICE->DCTL |= USB_OTG_DCTL_RWUSIG; - } - - return HAL_OK; -} - -/** - * @brief USB_DeActivateRemoteWakeup de-active remote wakeup signalling - * @param USBx Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_DeActivateRemoteWakeup(const USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t USBx_BASE = (uint32_t)USBx; - - /* active Remote wakeup signalling */ - USBx_DEVICE->DCTL &= ~(USB_OTG_DCTL_RWUSIG); - - return HAL_OK; -} -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ - -/** - * @} - */ - -/** - * @} - */ -#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -#endif /* defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) */ - -/** - * @} - */ diff --git a/software/bootloader/IAP_F411.ioc b/software/bootloader/IAP_F411.ioc deleted file mode 100644 index 0a1421b..0000000 --- a/software/bootloader/IAP_F411.ioc +++ /dev/null @@ -1,166 +0,0 @@ -#MicroXplorer Configuration settings - do not modify -CAD.formats= -CAD.pinconfig= -CAD.provider= -File.Version=6 -GPIO.groupedBy=Group By Peripherals -KeepUserPlacement=false -Mcu.CPN=STM32F411CEU6 -Mcu.Family=STM32F4 -Mcu.IP0=CRC -Mcu.IP1=I2C1 -Mcu.IP2=NVIC -Mcu.IP3=RCC -Mcu.IP4=SPI2 -Mcu.IP5=SYS -Mcu.IP6=TIM1 -Mcu.IP7=USB_DEVICE -Mcu.IP8=USB_OTG_FS -Mcu.IPNb=9 -Mcu.Name=STM32F411C(C-E)Ux -Mcu.Package=UFQFPN48 -Mcu.Pin0=PH0 - OSC_IN -Mcu.Pin1=PH1 - OSC_OUT -Mcu.Pin10=PB7 -Mcu.Pin11=VP_CRC_VS_CRC -Mcu.Pin12=VP_SYS_VS_Systick -Mcu.Pin13=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS -Mcu.Pin2=PB13 -Mcu.Pin3=PB15 -Mcu.Pin4=PA10 -Mcu.Pin5=PA11 -Mcu.Pin6=PA12 -Mcu.Pin7=PA13 -Mcu.Pin8=PA14 -Mcu.Pin9=PB6 -Mcu.PinsNb=14 -Mcu.ThirdPartyNb=0 -Mcu.UserConstants= -Mcu.UserName=STM32F411CEUx -MxCube.Version=6.14.1 -MxDb.Version=DB.6.0.141 -NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.ForceEnableDMAVector=true -NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.OTG_FS_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true -NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 -NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false -NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -PA10.Locked=true -PA10.Signal=S_TIM1_CH3 -PA11.Mode=Device_Only -PA11.Signal=USB_OTG_FS_DM -PA12.Mode=Device_Only -PA12.Signal=USB_OTG_FS_DP -PA13.Mode=Serial_Wire -PA13.Signal=SYS_JTMS-SWDIO -PA14.Mode=Serial_Wire -PA14.Signal=SYS_JTCK-SWCLK -PB13.Locked=true -PB13.Mode=TX_Only_Simplex_Unidirect_Master -PB13.Signal=SPI2_SCK -PB15.Locked=true -PB15.Mode=TX_Only_Simplex_Unidirect_Master -PB15.Signal=SPI2_MOSI -PB6.Mode=I2C -PB6.Signal=I2C1_SCL -PB7.Mode=I2C -PB7.Signal=I2C1_SDA -PH0\ -\ OSC_IN.Mode=HSE-External-Oscillator -PH0\ -\ OSC_IN.Signal=RCC_OSC_IN -PH1\ -\ OSC_OUT.Mode=HSE-External-Oscillator -PH1\ -\ OSC_OUT.Signal=RCC_OSC_OUT -PinOutPanel.RotationAngle=0 -ProjectManager.AskForMigrate=true -ProjectManager.BackupPrevious=false -ProjectManager.CompilerLinker=GCC -ProjectManager.CompilerOptimize=6 -ProjectManager.ComputerToolchain=false -ProjectManager.CoupleFile=true -ProjectManager.CustomerFirmwarePackage= -ProjectManager.DefaultFWLocation=true -ProjectManager.DeletePrevious=true -ProjectManager.DeviceId=STM32F411CEUx -ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.28.1 -ProjectManager.FreePins=false -ProjectManager.HalAssertFull=false -ProjectManager.HeapSize=0x200 -ProjectManager.KeepUserCode=true -ProjectManager.LastFirmware=true -ProjectManager.LibraryCopy=1 -ProjectManager.MainLocation=Core/Src -ProjectManager.NoMain=false -ProjectManager.PreviousToolchain= -ProjectManager.ProjectBuild=false -ProjectManager.ProjectFileName=IAP_F411.ioc -ProjectManager.ProjectName=IAP_F411 -ProjectManager.ProjectStructure= -ProjectManager.RegisterCallBack= -ProjectManager.StackSize=0x1000 -ProjectManager.TargetToolchain=MDK-ARM V5.27 -ProjectManager.ToolChainLocation= -ProjectManager.UAScriptAfterPath= -ProjectManager.UAScriptBeforePath= -ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_SPI2_Init-SPI2-false-HAL-true,4-MX_TIM1_Init-TIM1-false-HAL-true,5-MX_I2C1_Init-I2C1-false-HAL-true,6-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,7-MX_CRC_Init-CRC-false-HAL-true -RCC.48MHZClocksFreq_Value=48000000 -RCC.AHBFreq_Value=96000000 -RCC.APB1CLKDivider=RCC_HCLK_DIV2 -RCC.APB1Freq_Value=48000000 -RCC.APB1TimFreq_Value=96000000 -RCC.APB2Freq_Value=96000000 -RCC.APB2TimFreq_Value=96000000 -RCC.CortexFreq_Value=96000000 -RCC.EthernetFreq_Value=96000000 -RCC.FCLKCortexFreq_Value=96000000 -RCC.FamilyName=M -RCC.HCLKFreq_Value=96000000 -RCC.HSE_VALUE=25000000 -RCC.HSI_VALUE=16000000 -RCC.I2SClocksFreq_Value=150000000 -RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,PLLCLKFreq_Value,PLLM,PLLQCLKFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOInputMFreq_Value,VCOOutputFreq_Value,VcooutputI2S -RCC.LSE_VALUE=32768 -RCC.LSI_VALUE=32000 -RCC.PLLCLKFreq_Value=96000000 -RCC.PLLM=25 -RCC.PLLQCLKFreq_Value=48000000 -RCC.RTCFreq_Value=32000 -RCC.RTCHSEDivFreq_Value=12500000 -RCC.SYSCLKFreq_VALUE=96000000 -RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK -RCC.VCOI2SOutputFreq_Value=300000000 -RCC.VCOInputFreq_Value=1000000 -RCC.VCOInputMFreq_Value=1562500 -RCC.VCOOutputFreq_Value=192000000 -RCC.VcooutputI2S=150000000 -SH.S_TIM1_CH3.0=TIM1_CH3,PWM Generation3 CH3 -SH.S_TIM1_CH3.ConfNb=1 -SPI2.CLKPhase=SPI_PHASE_2EDGE -SPI2.CLKPolarity=SPI_POLARITY_HIGH -SPI2.CalculateBaudRate=24.0 MBits/s -SPI2.Direction=SPI_DIRECTION_2LINES -SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,CLKPolarity,CLKPhase -SPI2.Mode=SPI_MODE_MASTER -SPI2.VirtualType=VM_MASTER -TIM1.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 -TIM1.IPParameters=Channel-PWM Generation3 CH3,Prescaler,Period -TIM1.Period=250 -TIM1.Prescaler=99 -USB_DEVICE.CLASS_NAME_FS=CDC -USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS -USB_DEVICE.VirtualMode=Cdc -USB_DEVICE.VirtualModeFS=Cdc_FS -USB_OTG_FS.IPParameters=VirtualMode -USB_OTG_FS.VirtualMode=Device_Only -VP_CRC_VS_CRC.Mode=CRC_Activate -VP_CRC_VS_CRC.Signal=CRC_VS_CRC -VP_SYS_VS_Systick.Mode=SysTick -VP_SYS_VS_Systick.Signal=SYS_VS_Systick -VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS -VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_CDC_FS -board=custom diff --git a/software/bootloader/KeilClear.bat b/software/bootloader/KeilClear.bat deleted file mode 100644 index 3cb49c8..0000000 --- a/software/bootloader/KeilClear.bat +++ /dev/null @@ -1,50 +0,0 @@ -del *.bak /s - -del *.ddk /s - -del *.edk /s - -del *.lst /s - -del *.lnp /s - -del *.mpf /s - -del *.mpj /s - -del *.obj /s - -del *.omf /s - -del *.plg /s - -del *.rpt /s - -del *.tmp /s - -del *.__i /s - -del *.crf /s -del *.o /s - -del *.d /s - -del *.axf /s - -del *.tra /s - -del *.dep /s - -del JLinkLog.txt /s - -del *.iex /s - -del *.htm /s - -del *.sct /s - -del *.map /s - -del *.scvd /s - -exit diff --git a/software/bootloader/MDK-ARM/DebugConfig/IAP_F411_STM32F411CEUx.dbgconf b/software/bootloader/MDK-ARM/DebugConfig/IAP_F411_STM32F411CEUx.dbgconf deleted file mode 100644 index de9f9b9..0000000 --- a/software/bootloader/MDK-ARM/DebugConfig/IAP_F411_STM32F411CEUx.dbgconf +++ /dev/null @@ -1,41 +0,0 @@ -// File: STM32F401xBCDE_411xCE.dbgconf -// Version: 1.0.0 -// Note: refer to STM32F401xB/C STM32F401xD/E reference manual (RM0368) -// refer to STM32F401xB/C STM32F401xD/E datasheet -// refer to STM32F411xC/E reference manual (RM0383) -// refer to STM32F411xC/E datasheet - -// <<< Use Configuration Wizard in Context Menu >>> - -// Debug MCU configuration register (DBGMCU_CR) -// DBG_STANDBY Debug Standby Mode -// DBG_STOP Debug Stop Mode -// DBG_SLEEP Debug Sleep Mode -// -DbgMCU_CR = 0x00000007; - -// Debug MCU APB1 freeze register (DBGMCU_APB1_FZ) -// Reserved bits must be kept at reset value -// DBG_I2C3_SMBUS_TIMEOUT I2C3 SMBUS timeout mode stopped when core is halted -// DBG_I2C2_SMBUS_TIMEOUT I2C2 SMBUS timeout mode stopped when core is halted -// DBG_I2C1_SMBUS_TIMEOUT I2C1 SMBUS timeout mode stopped when core is halted -// DBG_IWDG_STOP Independent watchdog stopped when core is halted -// DBG_WWDG_STOP Window watchdog stopped when core is halted -// DBG_RTC_STOP RTC stopped when core is halted -// DBG_TIM5_STOP TIM5 counter stopped when core is halted -// DBG_TIM4_STOP TIM4 counter stopped when core is halted -// DBG_TIM3_STOP TIM3 counter stopped when core is halted -// DBG_TIM2_STOP TIM2 counter stopped when core is halted -// -DbgMCU_APB1_Fz = 0x00000000; - -// Debug MCU APB2 freeze register (DBGMCU_APB2_FZ) -// Reserved bits must be kept at reset value -// DBG_TIM11_STOP TIM11 counter stopped when core is halted -// DBG_TIM10_STOP TIM10 counter stopped when core is halted -// DBG_TIM9_STOP TIM9 counter stopped when core is halted -// DBG_TIM1_STOP TIM1 counter stopped when core is halted -// -DbgMCU_APB2_Fz = 0x00000000; - -// <<< end of configuration section >>> \ No newline at end of file diff --git a/software/bootloader/MDK-ARM/DebugConfig/IAP_F411_STM32F411RETx.dbgconf b/software/bootloader/MDK-ARM/DebugConfig/IAP_F411_STM32F411RETx.dbgconf deleted file mode 100644 index de9f9b9..0000000 --- a/software/bootloader/MDK-ARM/DebugConfig/IAP_F411_STM32F411RETx.dbgconf +++ /dev/null @@ -1,41 +0,0 @@ -// File: STM32F401xBCDE_411xCE.dbgconf -// Version: 1.0.0 -// Note: refer to STM32F401xB/C STM32F401xD/E reference manual (RM0368) -// refer to STM32F401xB/C STM32F401xD/E datasheet -// refer to STM32F411xC/E reference manual (RM0383) -// refer to STM32F411xC/E datasheet - -// <<< Use Configuration Wizard in Context Menu >>> - -// Debug MCU configuration register (DBGMCU_CR) -// DBG_STANDBY Debug Standby Mode -// DBG_STOP Debug Stop Mode -// DBG_SLEEP Debug Sleep Mode -// -DbgMCU_CR = 0x00000007; - -// Debug MCU APB1 freeze register (DBGMCU_APB1_FZ) -// Reserved bits must be kept at reset value -// DBG_I2C3_SMBUS_TIMEOUT I2C3 SMBUS timeout mode stopped when core is halted -// DBG_I2C2_SMBUS_TIMEOUT I2C2 SMBUS timeout mode stopped when core is halted -// DBG_I2C1_SMBUS_TIMEOUT I2C1 SMBUS timeout mode stopped when core is halted -// DBG_IWDG_STOP Independent watchdog stopped when core is halted -// DBG_WWDG_STOP Window watchdog stopped when core is halted -// DBG_RTC_STOP RTC stopped when core is halted -// DBG_TIM5_STOP TIM5 counter stopped when core is halted -// DBG_TIM4_STOP TIM4 counter stopped when core is halted -// DBG_TIM3_STOP TIM3 counter stopped when core is halted -// DBG_TIM2_STOP TIM2 counter stopped when core is halted -// -DbgMCU_APB1_Fz = 0x00000000; - -// Debug MCU APB2 freeze register (DBGMCU_APB2_FZ) -// Reserved bits must be kept at reset value -// DBG_TIM11_STOP TIM11 counter stopped when core is halted -// DBG_TIM10_STOP TIM10 counter stopped when core is halted -// DBG_TIM9_STOP TIM9 counter stopped when core is halted -// DBG_TIM1_STOP TIM1 counter stopped when core is halted -// -DbgMCU_APB2_Fz = 0x00000000; - -// <<< end of configuration section >>> \ No newline at end of file diff --git a/software/bootloader/MDK-ARM/IAP_F411.uvguix.kingham b/software/bootloader/MDK-ARM/IAP_F411.uvguix.kingham deleted file mode 100644 index 2af343d..0000000 --- a/software/bootloader/MDK-ARM/IAP_F411.uvguix.kingham +++ /dev/null @@ -1,3601 +0,0 @@ - - - - -6.1 - -
### uVision Project, (C) Keil Software
- - - E:\projects\Github_Projects\Power_Pico\bootloader\BSP\EEPROM - - - - - - - 38003 - Registers - 115 115 - - - 346 - Code Coverage - 1010 160 - - - 204 - Performance Analyzer - 1170 - - - - - - 35141 - Event Statistics - - 200 50 700 - - - 1506 - Symbols - - 64 64 64 - - - 1936 - Watch 1 - - 200 133 133 - - - 1937 - Watch 2 - - 200 133 133 - - - 1935 - Call Stack + Locals - - 200 133 133 - - - 2506 - Trace Data - - 75 135 130 95 70 230 200 150 - - - 466 - Source Browser - 500 - 166 - - - - - - - - 0 - 0 - 0 - 50 - 16 - - - - - - - 44 - 2 - 3 - - -32000 - -32000 - - - -1 - -1 - - - 125 - 125 - 1277 - 718 - - - - 0 - - 60 - 010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000000000000 - - - - 0 - Build - - -1 - -1 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F40000004F00000090050000DF000000 - - - 16 - F40000006600000090050000F6000000 - - - - 1005 - 1005 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000ED00000059020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 109 - 109 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000ED00000059020000 - - - 16 - A4000000BB000000C0010000FB020000 - - - - 1465 - 1465 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 1466 - 1466 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 1467 - 1467 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 1468 - 1468 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 1506 - 1506 - 0 - 0 - 0 - 0 - 32767 - 0 - 16384 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 1913 - 1913 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 1935 - 1935 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 1936 - 1936 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 1937 - 1937 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 1939 - 1939 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 1940 - 1940 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 1941 - 1941 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 1942 - 1942 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 195 - 195 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000ED00000059020000 - - - 16 - A4000000BB000000C0010000FB020000 - - - - 196 - 196 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000ED00000059020000 - - - 16 - A4000000BB000000C0010000FB020000 - - - - 197 - 197 - 1 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 000000008A0200000006000006030000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 198 - 198 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 000000001902000090050000BD020000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 199 - 199 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 030000008D020000FD050000ED020000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 203 - 203 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 204 - 204 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 221 - 221 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 00000000000000000000000000000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 2506 - 2506 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 2507 - 2507 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 343 - 343 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 346 - 346 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 35141 - 35141 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35824 - 35824 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 35885 - 35885 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35886 - 35886 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35887 - 35887 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35888 - 35888 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35889 - 35889 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35890 - 35890 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35891 - 35891 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35892 - 35892 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35893 - 35893 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35894 - 35894 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35895 - 35895 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35896 - 35896 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35897 - 35897 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35898 - 35898 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35899 - 35899 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35900 - 35900 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35901 - 35901 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35902 - 35902 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35903 - 35903 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35904 - 35904 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 35905 - 35905 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 38003 - 38003 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000ED00000059020000 - - - 16 - A4000000BB000000C0010000FB020000 - - - - 38007 - 38007 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 030000008D020000FD050000ED020000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 436 - 436 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 030000008D020000FD050000ED020000 - - - 16 - A4000000BB000000C0010000FB020000 - - - - 437 - 437 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 440 - 440 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 463 - 463 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 030000008D020000FD050000ED020000 - - - 16 - A4000000BB000000C0010000FB020000 - - - - 466 - 466 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 030000008D020000FD050000ED020000 - - - 16 - A4000000BB000000C0010000FB020000 - - - - 470 - 470 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - F7000000660000008D050000C6000000 - - - 16 - A4000000BB0000006C0300004B010000 - - - - 50000 - 50000 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50001 - 50001 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50002 - 50002 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50003 - 50003 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50004 - 50004 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50005 - 50005 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50006 - 50006 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50007 - 50007 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50008 - 50008 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50009 - 50009 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50010 - 50010 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50011 - 50011 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50012 - 50012 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50013 - 50013 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50014 - 50014 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50015 - 50015 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50016 - 50016 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50017 - 50017 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50018 - 50018 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 50019 - 50019 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - A3040000660000008D05000010020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 59392 - 59392 - 1 - 0 - 0 - 0 - 966 - 0 - 8192 - 0 - - 16 - 0000000000000000D10300001C000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59393 - 0 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 00000000060300000006000019030000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59399 - 59399 - 1 - 0 - 0 - 0 - 476 - 0 - 8192 - 1 - - 16 - 000000001C000000E701000038000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59400 - 59400 - 0 - 0 - 0 - 0 - 612 - 0 - 8192 - 2 - - 16 - 00000000380000006F02000054000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 824 - 824 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000300200008D050000A4020000 - - - 16 - A4000000BB0000009401000086010000 - - - - 3312 - 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000DF00000090050000E3000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000F40000006600000090050000F6000000F40000004F00000090050000DF0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A004000029020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000A0040000660000009005000040020000A00400004F000000900500002902000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFF00000004F000000F400000072020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000000000066000000F000000089020000000000004F000000F0000000720200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000015020000900500001902000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000000000000000000003002000090050000D4020000000000001902000090050000BD02000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFC802000019020000CC020000BD02000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF00000000720200000006000076020000010000000100001004000000010000000000000000000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000000000008D020000000600001D030000000000007602000000060000060300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 - - - 59392 - File - - 2977 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000400020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000004000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000004000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000040000000000000000000000000000000000000100000001000000960000000200205000000000124D585F5553425F4445564943455F496E6974960000000000000014000F48414C5F5043445F4D7370496E6974124D585F5553425F4445564943455F496E6974065F5F7765616B1C48414C5F4144435F436F6E7648616C6643706C7443616C6C6261636B1648414C5F5350495F547843706C7443616C6C6261636B067072696E74660E4344435F526563656976655F46530E50445F4556545F5345545F505053067374727563740B50445F4556545F53544F500C50445F4556545F53544152541250445F636F6D6D616E645F6576656E745F741350445F636D645F4D65737361676551756575651250445F55495F4D65737361676551756575650B50445F55495F4D53475F741C506167654D616E616765725F68616E646C655F6B65795F6576656E741C506167654D616E616765725F6765745F63757272656E745F7061676510506167654D616E616765725F676F746F10506167654D616E616765725F7072657610506167654D616E616765725F6E6578740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000004001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 - - - 1423 - 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 1423 - 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 - - - - 59399 - Build - - 976 - 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000002001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000000000000000000000000000000000000000000100000001000000960000000300205000000000084941505F4634313196000000000000000100084941505F46343131000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 - - - 583 - 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 583 - 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 - - - - 59400 - Debug - - 2373 - 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 - - - 898 - 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 898 - 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 - - - - 0 - 1536 - 864 - - - - 1 - Debug - - -1 - -1 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 1A0100004F00000080070000BE000000 - - - 16 - 1A0100006600000080070000D5000000 - - - - 1005 - 1005 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000660000001301000041020000 - - - 16 - 70000000870000003001000027010000 - - - - 109 - 109 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000660000001301000041020000 - - - 16 - 70000000870000005301000043020000 - - - - 1465 - 1465 - 1 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1466 - 1466 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1467 - 1467 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1468 - 1468 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1506 - 1506 - 0 - 0 - 0 - 0 - 32767 - 0 - 16384 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 1913 - 1913 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D010000660000007D070000A5000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1935 - 1935 - 1 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 70000000870000003001000027010000 - - - - 1936 - 1936 - 1 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 70000000870000003001000027010000 - - - - 1937 - 1937 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 70000000870000003001000027010000 - - - - 1939 - 1939 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1940 - 1940 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1941 - 1941 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 1942 - 1942 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 195 - 195 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000660000001301000041020000 - - - 16 - 70000000870000005301000043020000 - - - - 196 - 196 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000660000001301000041020000 - - - 16 - 70000000870000005301000043020000 - - - - 197 - 197 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 03000000C00100006D040000FE010000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 198 - 198 - 1 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 000000005E020000C0030000DE030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 199 - 199 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000C00100006D040000FE010000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 203 - 203 - 1 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1A0100006300000080070000BE000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 204 - 204 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D010000660000007D070000A5000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 221 - 221 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 00000000000000000000000000000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 2506 - 2506 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 2507 - 2507 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 343 - 343 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D010000660000007D070000A5000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 346 - 346 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D010000660000007D070000A5000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 35141 - 35141 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D010000660000007D070000A5000000 - - - 16 - 70000000870000003001000027010000 - - - - 35824 - 35824 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D010000660000007D070000A5000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 35885 - 35885 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35886 - 35886 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35887 - 35887 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35888 - 35888 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35889 - 35889 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35890 - 35890 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35891 - 35891 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35892 - 35892 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35893 - 35893 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35894 - 35894 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35895 - 35895 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35896 - 35896 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35897 - 35897 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35898 - 35898 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35899 - 35899 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35900 - 35900 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35901 - 35901 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35902 - 35902 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35903 - 35903 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35904 - 35904 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 35905 - 35905 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 38003 - 38003 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000660000001301000041020000 - - - 16 - 70000000870000005301000043020000 - - - - 38007 - 38007 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000C00100006D040000FE010000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 436 - 436 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000C00100006D040000FE010000 - - - 16 - 70000000870000005301000043020000 - - - - 437 - 437 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 70000000870000003001000027010000 - - - - 440 - 440 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 70000000870000003001000027010000 - - - - 463 - 463 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000C00100006D040000FE010000 - - - 16 - 70000000870000005301000043020000 - - - - 466 - 466 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 03000000C00100006D040000FE010000 - - - 16 - 70000000870000005301000043020000 - - - - 470 - 470 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 1D010000660000007D070000A5000000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 50000 - 50000 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50001 - 50001 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50002 - 50002 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50003 - 50003 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50004 - 50004 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 50005 - 50005 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50006 - 50006 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50007 - 50007 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50008 - 50008 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50009 - 50009 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50010 - 50010 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50011 - 50011 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50012 - 50012 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50013 - 50013 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50014 - 50014 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50015 - 50015 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 50016 - 50016 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50017 - 50017 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50018 - 50018 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 50019 - 50019 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B3030000660000006D0400008C010000 - - - 16 - 70000000870000003001000027010000 - - - - 59392 - 59392 - 1 - 0 - 0 - 0 - 966 - 0 - 8192 - 0 - - 16 - 0000000000000000D10300001C000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59393 - 0 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 00000000DE03000080070000F1030000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59399 - 59399 - 0 - 0 - 0 - 0 - 476 - 0 - 8192 - 1 - - 16 - 000000001C000000E701000038000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59400 - 59400 - 1 - 0 - 0 - 0 - 612 - 0 - 8192 - 2 - - 16 - 000000001C0000006F02000038000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 824 - 824 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - C7030000750200007D070000C5030000 - - - 16 - 70000000870000003001000027010000 - - - - 3311 - 000000000B000000000000000020000001000000FFFFFFFFFFFFFFFF1A010000BE00000080070000C20000000100000001000010040000000100000094FFFFFF9C010000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000010000001A0100006600000080070000D50000001A0100004F00000080070000BE0000000000000040280056080000000B446973617373656D626C7901000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFFAC0300004F000000B0030000A5010000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000B00300006600000070040000BC010000B00300004F00000070040000A501000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF160100004F0000001A0100005A0200000100000002000010040000000100000028FFFFFF9D060000FFFFFFFF05000000ED0300006D000000C3000000C4000000739400000180001000000100000000000000660000001601000071020000000000004F000000160100005A0200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73000000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7300000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657300000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273010000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000001000000FFFFFFFFFFFFFFFF000000005A020000800700005E02000001000000010000100400000001000000EDFDFFFFA400000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000001000000C40300007502000080070000F5030000C40300005E02000080070000DE03000000000000404100560F0000001343616C6C20537461636B202B204C6F63616C73010000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031010000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203101000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFF050000000000000001000000000000000100000001000000FFFFFFFFC00300005E020000C4030000DE03000001000000020000100400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000000000000FFFFFFFFFFFFFFFF00000000A501000070040000A9010000000000000100000004000000010000000000000000000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF010000779400000180008000000000000000000000C0010000700400002E02000000000000A901000070040000170200000000000040820046060000000C4275696C64204F757470757400000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0642726F777365000000007794000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 - - - 59392 - File - - 2537 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000096000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000300150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 - - - 1423 - 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 1423 - 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 - - - - 59399 - Build - - 955 - 00200000000000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0000000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000000002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050FFFFFFFF00960000000000000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000000240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 - - - 583 - 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 583 - 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 - - - - 59400 - Debug - - 2362 - 00200000010000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000004002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000020001002D0000000000000000000000000000000001000000010000000180F07F0000020001002E0000000000000000000000000000000001000000010000000180E8880000020000003700000000000000000000000000000000010000000100000001803B010000020001002F0000000000000000000000000000000001000000010000000180BB8A00000200010030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000002000100310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F0100000200010032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000002000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000002000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 - - - 898 - 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 898 - 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 - - - - 0 - 1920 - 1080 - - - - -
diff --git a/software/bootloader/MDK-ARM/IAP_F411.uvoptx b/software/bootloader/MDK-ARM/IAP_F411.uvoptx deleted file mode 100644 index e575c82..0000000 --- a/software/bootloader/MDK-ARM/IAP_F411.uvoptx +++ /dev/null @@ -1,929 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - IAP_F411 - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_512 -FL080000 -FS08000000 -FP0($$Device:STM32F411CEUx$CMSIS\Flash\STM32F4xx_512.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_512 -FL080000 -FS08000000 -FP0($$Device:STM32F411CEUx$CMSIS\Flash\STM32F4xx_512.FLM) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - - - 0 - 0 - 201 - 1 -
134242564
- 0 - 0 - 0 - 0 - 0 - 1 - ..\Ymodem\ymodem.c - - \\IAP_F411\../Ymodem/ymodem.c\201 -
- - 1 - 0 - 187 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ../Core/Src/main.c - - -
- - 2 - 0 - 192 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ../Core/Src/main.c - - -
-
- - 0 - - - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - -
-
- - - Application/MDK-ARM - 0 - 0 - 0 - 0 - - 1 - 1 - 2 - 0 - 0 - 0 - startup_stm32f411xe.s - startup_stm32f411xe.s - 0 - 0 - - - - - Application/User/Core - 0 - 0 - 0 - 0 - - 2 - 2 - 1 - 0 - 0 - 0 - ../Core/Src/main.c - main.c - 0 - 0 - - - 2 - 3 - 1 - 0 - 0 - 0 - ../Core/Src/gpio.c - gpio.c - 0 - 0 - - - 2 - 4 - 1 - 0 - 0 - 0 - ../Core/Src/crc.c - crc.c - 0 - 0 - - - 2 - 5 - 1 - 0 - 0 - 0 - ../Core/Src/i2c.c - i2c.c - 0 - 0 - - - 2 - 6 - 1 - 0 - 0 - 0 - ../Core/Src/spi.c - spi.c - 0 - 0 - - - 2 - 7 - 1 - 0 - 0 - 0 - ../Core/Src/tim.c - tim.c - 0 - 0 - - - 2 - 8 - 1 - 0 - 0 - 0 - ../Core/Src/stm32f4xx_it.c - stm32f4xx_it.c - 0 - 0 - - - 2 - 9 - 1 - 0 - 0 - 0 - ../Core/Src/stm32f4xx_hal_msp.c - stm32f4xx_hal_msp.c - 0 - 0 - - - - - Application/User/BSP - 0 - 0 - 0 - 0 - - 3 - 10 - 1 - 0 - 0 - 0 - ..\BSP\KEY\key.c - key.c - 0 - 0 - - - 3 - 11 - 1 - 0 - 0 - 0 - ..\BSP\LCD\lcd.c - lcd.c - 0 - 0 - - - 3 - 12 - 1 - 0 - 0 - 0 - ..\BSP\LCD\lcd_init.c - lcd_init.c - 0 - 0 - - - 3 - 13 - 1 - 0 - 0 - 0 - ..\BSP\EEPROM\BL24C02.c - BL24C02.c - 0 - 0 - - - - - Application/User/SYS - 0 - 0 - 0 - 0 - - 4 - 14 - 1 - 0 - 0 - 0 - ..\SYSTEM\delay.c - delay.c - 0 - 0 - - - - - Drivers/STM32F4xx_HAL_Driver - 0 - 0 - 0 - 0 - - 5 - 15 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c - stm32f4xx_hal_pcd.c - 0 - 0 - - - 5 - 16 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c - stm32f4xx_hal_pcd_ex.c - 0 - 0 - - - 5 - 17 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c - stm32f4xx_ll_usb.c - 0 - 0 - - - 5 - 18 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c - stm32f4xx_hal_rcc.c - 0 - 0 - - - 5 - 19 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c - stm32f4xx_hal_rcc_ex.c - 0 - 0 - - - 5 - 20 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c - stm32f4xx_hal_flash.c - 0 - 0 - - - 5 - 21 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c - stm32f4xx_hal_flash_ex.c - 0 - 0 - - - 5 - 22 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c - stm32f4xx_hal_flash_ramfunc.c - 0 - 0 - - - 5 - 23 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c - stm32f4xx_hal_gpio.c - 0 - 0 - - - 5 - 24 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c - stm32f4xx_hal_dma_ex.c - 0 - 0 - - - 5 - 25 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c - stm32f4xx_hal_dma.c - 0 - 0 - - - 5 - 26 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c - stm32f4xx_hal_pwr.c - 0 - 0 - - - 5 - 27 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c - stm32f4xx_hal_pwr_ex.c - 0 - 0 - - - 5 - 28 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c - stm32f4xx_hal_cortex.c - 0 - 0 - - - 5 - 29 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c - stm32f4xx_hal.c - 0 - 0 - - - 5 - 30 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c - stm32f4xx_hal_exti.c - 0 - 0 - - - 5 - 31 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.c - stm32f4xx_hal_crc.c - 0 - 0 - - - 5 - 32 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c - stm32f4xx_hal_i2c.c - 0 - 0 - - - 5 - 33 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c - stm32f4xx_hal_i2c_ex.c - 0 - 0 - - - 5 - 34 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c - stm32f4xx_hal_spi.c - 0 - 0 - - - 5 - 35 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c - stm32f4xx_hal_tim.c - 0 - 0 - - - 5 - 36 - 1 - 0 - 0 - 0 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c - stm32f4xx_hal_tim_ex.c - 0 - 0 - - - - - Drivers/CMSIS - 0 - 0 - 0 - 0 - - 6 - 37 - 1 - 0 - 0 - 0 - ../Core/Src/system_stm32f4xx.c - system_stm32f4xx.c - 0 - 0 - - - - - Ymodem - 0 - 0 - 0 - 0 - - 7 - 38 - 1 - 0 - 0 - 0 - ..\Ymodem\common.c - common.c - 0 - 0 - - - 7 - 39 - 1 - 0 - 0 - 0 - ..\Ymodem\flash_if.c - flash_if.c - 0 - 0 - - - 7 - 40 - 1 - 0 - 0 - 0 - ..\Ymodem\menu.c - menu.c - 0 - 0 - - - 7 - 41 - 1 - 0 - 0 - 0 - ..\Ymodem\ymodem.c - ymodem.c - 0 - 0 - - - - - Application/User/USB_DEVICE/App - 0 - 0 - 0 - 0 - - 8 - 42 - 1 - 0 - 0 - 0 - ../USB_DEVICE/App/usb_device.c - usb_device.c - 0 - 0 - - - 8 - 43 - 1 - 0 - 0 - 0 - ../USB_DEVICE/App/usbd_desc.c - usbd_desc.c - 0 - 0 - - - 8 - 44 - 1 - 0 - 0 - 0 - ../USB_DEVICE/App/usbd_cdc_if.c - usbd_cdc_if.c - 0 - 0 - - - - - Application/User/USB_DEVICE/Target - 0 - 0 - 0 - 0 - - 9 - 45 - 1 - 0 - 0 - 0 - ../USB_DEVICE/Target/usbd_conf.c - usbd_conf.c - 0 - 0 - - - - - Middlewares/USB_Device_Library - 0 - 0 - 0 - 0 - - 10 - 46 - 1 - 0 - 0 - 0 - ../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c - usbd_core.c - 0 - 0 - - - 10 - 47 - 1 - 0 - 0 - 0 - ../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c - usbd_ctlreq.c - 0 - 0 - - - 10 - 48 - 1 - 0 - 0 - 0 - ../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c - usbd_ioreq.c - 0 - 0 - - - 10 - 49 - 1 - 0 - 0 - 0 - ../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c - usbd_cdc.c - 0 - 0 - - - - - ::CMSIS - 0 - 0 - 0 - 1 - - -
diff --git a/software/bootloader/MDK-ARM/IAP_F411.uvprojx b/software/bootloader/MDK-ARM/IAP_F411.uvprojx deleted file mode 100644 index 2406f82..0000000 --- a/software/bootloader/MDK-ARM/IAP_F411.uvprojx +++ /dev/null @@ -1,1884 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - IAP_F411 - 0x4 - ARM-ADS - 5060960::V5.06 update 7 (build 960)::.\ARMCC - 0 - - - STM32F411CEUx - STMicroelectronics - Keil.STM32F4xx_DFP.2.17.1 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32F411CEUx$CMSIS\Flash\STM32F4xx_512.FLM)) - 0 - $$Device:STM32F411CEUx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h - - - - - - - - - - $$Device:STM32F411CEUx$CMSIS\SVD\STM32F411.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - IAP_F411\ - IAP_F411 - 1 - 0 - 1 - 1 - 1 - - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 0 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 4 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 5 - 3 - 1 - 1 - 0 - 0 - 0 - - - USE_HAL_DRIVER,STM32F411xE - - ../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../Ymodem;../BSP/KEY;../BSP/LCD;../BSP/EEPROM;../SYSTEM;../USB_DEVICE/App;../USB_DEVICE/Target;../Middlewares/ST/STM32_USB_Device_Library/Core/Inc;../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 4 - - - - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - - - - - - - - - - - - - - - Application/MDK-ARM - - - startup_stm32f411xe.s - 2 - startup_stm32f411xe.s - - - - - Application/User/Core - - - main.c - 1 - ../Core/Src/main.c - - - gpio.c - 1 - ../Core/Src/gpio.c - - - crc.c - 1 - ../Core/Src/crc.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - i2c.c - 1 - ../Core/Src/i2c.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - spi.c - 1 - ../Core/Src/spi.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - tim.c - 1 - ../Core/Src/tim.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_it.c - 1 - ../Core/Src/stm32f4xx_it.c - - - stm32f4xx_hal_msp.c - 1 - ../Core/Src/stm32f4xx_hal_msp.c - - - - - Application/User/BSP - - - key.c - 1 - ..\BSP\KEY\key.c - - - lcd.c - 1 - ..\BSP\LCD\lcd.c - - - lcd_init.c - 1 - ..\BSP\LCD\lcd_init.c - - - BL24C02.c - 1 - ..\BSP\EEPROM\BL24C02.c - - - - - Application/User/SYS - - - delay.c - 1 - ..\SYSTEM\delay.c - - - - - Drivers/STM32F4xx_HAL_Driver - - - stm32f4xx_hal_pcd.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_hal_pcd_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_ll_usb.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_hal_rcc.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c - - - stm32f4xx_hal_rcc_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c - - - stm32f4xx_hal_flash.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c - - - stm32f4xx_hal_flash_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c - - - stm32f4xx_hal_flash_ramfunc.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c - - - stm32f4xx_hal_gpio.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c - - - stm32f4xx_hal_dma_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c - - - stm32f4xx_hal_dma.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c - - - stm32f4xx_hal_pwr.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c - - - stm32f4xx_hal_pwr_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c - - - stm32f4xx_hal_cortex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c - - - stm32f4xx_hal.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c - - - stm32f4xx_hal_exti.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c - - - stm32f4xx_hal_crc.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_hal_i2c.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_hal_i2c_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_hal_spi.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - stm32f4xx_hal_tim.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c - - - stm32f4xx_hal_tim_ex.c - 1 - ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c - - - - - Drivers/CMSIS - - - system_stm32f4xx.c - 1 - ../Core/Src/system_stm32f4xx.c - - - - - Ymodem - - - common.c - 1 - ..\Ymodem\common.c - - - flash_if.c - 1 - ..\Ymodem\flash_if.c - - - menu.c - 1 - ..\Ymodem\menu.c - - - ymodem.c - 1 - ..\Ymodem\ymodem.c - - - - - Application/User/USB_DEVICE/App - - - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 4 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - usb_device.c - 1 - ../USB_DEVICE/App/usb_device.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - usbd_desc.c - 1 - ../USB_DEVICE/App/usbd_desc.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - usbd_cdc_if.c - 1 - ../USB_DEVICE/App/usbd_cdc_if.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - - - Application/User/USB_DEVICE/Target - - - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 4 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - usbd_conf.c - 1 - ../USB_DEVICE/Target/usbd_conf.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - - - Middlewares/USB_Device_Library - - - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 4 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - usbd_core.c - 1 - ../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - usbd_ctlreq.c - 1 - ../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - usbd_ioreq.c - 1 - ../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - usbd_cdc.c - 1 - ../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - - - ::CMSIS - - - - - - - - - - - - - - - - - - - - - - IAP_F411 - 1 - - - - -
diff --git a/software/bootloader/MDK-ARM/IAP_F411/IAP_F411.hex b/software/bootloader/MDK-ARM/IAP_F411/IAP_F411.hex deleted file mode 100644 index f246ffd..0000000 --- a/software/bootloader/MDK-ARM/IAP_F411/IAP_F411.hex +++ /dev/null @@ -1,2595 +0,0 @@ -:020000040800F2 -:10000000183B0020B10100085F3A0008652B00088A -:100010005D3A000889030008A9610008000000009B -:10002000000000000000000000000000B93D0008D2 -:100030006104000800000000DB3B0008813E00086E -:10004000CB010008CB010008CB010008CB01000860 -:10005000CB010008CB010008CB010008CB01000850 -:10006000CB010008CB010008CB010008CB01000840 -:10007000CB010008CB010008CB010008CB01000830 -:10008000CB010008CB010008CB01000800000000F4 -:10009000000000000000000000000000CB0100088C -:1000A000CB010008CB010008CB010008CB01000800 -:1000B000CB010008CB010008CB010008CB010008F0 -:1000C000CB010008CB010008CB010008CB010008E0 -:1000D000CB010008CB010008CB01000800000000A4 -:1000E000CB010008CB010008CB0100080000000094 -:1000F000000000000000000000000000CB0100082C -:1001000000000000CB010008CB010008CB01000873 -:1001100000000000000000000000000000000000DF -:10012000CB010008CB010008CB010008CB0100087F -:10013000CB010008000000000000000000000000EB -:10014000000000000000000000000000613A00080C -:10015000CB010008CB010008CB010008CB0100084F -:10016000CB010008CB0100080000000000000000E7 -:10017000000000000000000000000000000000007F -:1001800000000000CB01000800000000000000009B -:10019000CB010008CB010008DFF810D000F0A4F874 -:1001A0000048004725640008AFF30080183B00209A -:1001B0000648804706480047FEE7FEE7FEE7FEE701 -:1001C000FEE7FEE7FEE7FEE7FEE7FEE7153F000875 -:1001D000990100082DE9F05F0546002092469B46F4 -:1001E00088460646814640241BE02846414647464D -:1001F000224600F068F853465A46C01A914110D37F -:1002000011461846224600F04FF82D1A67EB0108F8 -:100210004F4622460120002100F046F817EB000966 -:100220004E41201EA4F10104DFDC484631462A4637 -:100230004346BDE8F09F40EA01039B0703D009E075 -:1002400008C9121F08C0042AFAD203E011F8013BC2 -:1002500000F8013B521EF9D27047D2B201E000F81B -:10026000012B491EFBD270470022F6E710B513465A -:100270000A4604461946FFF7F0FF204610BD421C0F -:1002800010F8011B0029FBD1801A704710B500221D -:1002900000E0521C835C8C5CA34201D1002BF8D19E -:1002A000D8B2E1B2401A10BD202A04DB203A00FA8D -:1002B00002F1002070479140C2F1200320FA03F3BD -:1002C000194390407047202A04DB203A21FA02F0BB -:1002D0000021704721FA02F3D040C2F12002914080 -:1002E0000843194670470000064C074D06E0E068D9 -:1002F00040F0010394E8070098471034AC42F6D36D -:10030000FFF74EFFC0A00008E0A000080EB50A23CA -:100310000092CDE9011302460123A021014800F01B -:1003200011FE0EBD200100200EB50A230092CDE97A -:10033000011302460123A021014800F005FF0EBD74 -:100340002001002008B500250BA005F091FD8DF8D7 -:1003500000500024684605F059FD28B19DF80000C2 -:10036000302801D103F0B2F90A2000F011FB641C1F -:10037000322CEFDBE8E7000023235049434F5F4274 -:100380004F4F5423230D0A00FEE700207047002042 -:100390007047000010B500220449054804F0A4F895 -:1003A0000449034804F093F8002010BD101C0020FD -:1003B000340700201014002070B500220B4C0C4BA9 -:1003C00008E0855C1E88A5551D886D1CC5F30A05CF -:1003D0001D80521C0D689542F3D80146054804F073 -:1003E00076F8044804F04CF8002070BD100C002092 -:1003F000760000203407002000207047094A10B51D -:10040000D2F8BC22D2F814220AB1012010BD0A464B -:100410000146044804F068F8BDE81040014804F0C3 -:10042000DDB80000340700203EB50B4A04460D46F7 -:10043000106840F480501060106800F48050029002 -:1004400006480090684600F05AFAAA082146684615 -:1004500000F03EFA3EBD000030380240003002405D -:10046000704708B50A2000F093FA6A46022100207E -:10047000FFF74CFF9DF80000552803D19DF80100BF -:10048000AA2821D055208DF80000AA208DF801005F -:100490000A2000F07DFA6A4602210020FFF744FF9F -:1004A000002000900A2000F073FA6A460221002022 -:1004B000FFF72CFF9DF80000552803D19DF801009F -:1004C000AA2801D0012008BD002008BD0EB50020DB -:1004D0000090019002906A4608212020FFF716FF45 -:1004E00004A16846FFF7D2FE08B100200EBD01202E -:1004F0000EBD00007570646174650D0A0000000097 -:100500000EB510B107A007C801E009A207CA8DE81F -:1005100007006846FFF7B3FE81B26A462020FFF766 -:1005200003FF0EBD7570646174650D0A0000000064 -:100530002D6E6F70652D0D0A0000000072B6FEE78B -:10054000002229B101291AD002291BD04FF4407290 -:100550000E490B6823F440730B600B6813430B6068 -:100560000A6822F0F8020A600A68022303EBC0005E -:1005700002430A60086840F48030086070474FF416 -:100580008072E5E74FF40072E2E70000103C0240A1 -:100590001348016889050FD5016821F400710160D5 -:1005A000016841F400610160016821F400610160AB -:1005B000016841F400710160016849050FD50168C7 -:1005C00021F480610160016841F48051016001689B -:1005D00021F480510160016841F48061016070473D -:1005E000003C024038B50220009001240A4800F087 -:1005F00031F9C0088440C4F58050009000F032FA10 -:100600000121009800F092F800F020FA08B10220D1 -:1006100038BD012038BD00000000010810B586B0CB -:100620000B4800F017F90446002000900294094896 -:1006300000F010F9001B401C03900220049005A953 -:10064000684600F0B7F9002800D0012006B010BDC0 -:1006500000000108FFFF070800B587B000210290E5 -:100660000120039002200091049005A9684600F043 -:10067000A1F9002800D0012007B000BD10B508483E -:1006800000F0E8F807490988C008C14040F6FF7249 -:10069000C240914201D1012010BD002010BD0000D8 -:1006A00000000108163C024010B500F0DBF90249D9 -:1006B000F320086010BD00000C3C02402DE9F04121 -:1006C00016468846054600240D4F11E058F82410C0 -:1006D000286800F03BF82868016858F82400814237 -:1006E00002D00220BDE8F0812868001D2860641C4B -:1006F000B44202D22868B842E8D90020F2E70000EC -:10070000FBFF070808490A6822F440720A600A6879 -:1007100042F004020A600A684FF4803343EA002082 -:1007200002430A6070470000103C024010B50446C6 -:100730004CF2503000F05AF8002803D102490A88E0 -:1007400022430A8010BD0000163C0240074A13688D -:1007500023F440731360136843F400731360136849 -:1007600043F001031360016070470000103C024039 -:100770001C490868C2061C4805D5C26942F010022F -:10078000C26110220A600A68920605D5C26942F069 -:100790000802C26120220A600A68520605D5C269B1 -:1007A00042F00402C26140220A600A68120605D5BE -:1007B000C26942F00202C26180220A600A68D20560 -:1007C00006D5C26942F00102C2614FF480720A602C -:1007D0000A68920705D5C26942F02002C261022070 -:1007E000086070470C3C02401402002070B51149AB -:1007F00004460020C86100F0DBFA06460E4D09E011 -:10080000601C07D024B100F0D3FA801BA04201D9AC -:10081000032070BD2868C003F2D42868C00701D047 -:1008200001202860286810F4F970F2D0FFF7A0FFCB -:10083000012070BD140200200C3C024008B50020CD -:100840008DF80000684605F0E1FA0028FAD09DF81E -:10085000000008BD01460020A1F100634FF4804272 -:10086000934204D314480844904201D201207047B7 -:1008700012480844904201D20220704710480844B0 -:10088000904201D2032070470E480844B0F5803FE3 -:1008900001D2042070470C480A184FF400308242FD -:1008A00001D205207047094A1144814201D2062035 -:1008B000704707207047000000C0FFF70080FFF777 -:1008C0000040FFF70000FFF70000FEF70000FCF714 -:1008D00030B50223437103689C6844F001049C60B6 -:1008E000002304E0056851F823402C605B1C934210 -:1008F000F8D30168096801224271084630BD10B57D -:10090000040002D0607910B106E0012010BD002083 -:100910002071204600F004F801206071002010BD15 -:1009200008B500680649884208D10648016841F4C4 -:1009300080510160006800F48050009008BD000004 -:1009400000300240303802400E4910B50C480860B3 -:1009500000200860091D0C4A0A60086009490B4A1A -:1009600010390A6008608022091D0A600860421E72 -:10097000091D0A60086000F0F5FC002010BD0000B1 -:100980000FC8E21020380240317917009F10600034 -:1009900070B5044600F00CFA0546601C02D004480D -:1009A0000078044400F004FA401BA042FAD370BD62 -:1009B000080000202DE9F047044622480F46017E3A -:1009C00001290AD00121804601764CF2503948466F -:1009D000FFF70CFF020003D02FE00220BDE8F087F4 -:1009E0004FF0FF3038602068174D012801D0A6680D -:1009F0001CE0207C6168FFF785FE4846FFF7F6FEA5 -:100A00000246286820F00400286014E0217C30466B -:100A1000FFF796FD4846FFF7E9FE0200286820F040 -:100A2000FA00286001D03E6005E0761CD4E902108F -:100A30000844B042EAD8FFF7ABFD002188F818104F -:100A40001046CBE714020020103C02400448017815 -:100A500041F0020101704CF25030FFF7C7BE0000B8 -:100A6000143C0240074900200A68002A09DA054AB6 -:100A7000054B0C3A1360054B13600968002900DA36 -:100A800001207047103C024023016745AB89EFCD40 -:100A90002DE9F04F0022DFF808B101264FF00F09D1 -:100AA00006FA02F401EA0403A34274D122F0030718 -:100AB0005F44D7F8088895074FEA157C09FA0CFAC5 -:100AC0000AEA0805DFF8DC80404502D14FF0000853 -:100AD0001DE0DFF8D480404502D14FF0010816E058 -:100AE000DFF8C880404502D14FF002080FE0DFF880 -:100AF000C080404502D14FF0030808E0DFF8B48021 -:100B0000404502D14FF0040801E04FF0070808FA11 -:100B10000CF8A84522D1284DD5F800C02CEA030CCA -:100B2000C5F800C02D1DD5F800C02CEA030CC5F88F -:100B300000C0214D0C35D5F800C02CEA030CC5F8D7 -:100B400000C02D1FD5F800C02CEA030CC5F800C06A -:100B5000D7F8085825EA0A05C7F808580568570065 -:100B60000323BB409D430560D50800EB8505D5F800 -:100B700020C057074FEAD76809FA08F72CEA070C94 -:100B8000C5F820C0C5689D43C5604568A54345605C -:100B900084689C438460521C102A81D3BDE8F08F86 -:100BA0000030014000000240000402400008024002 -:100BB000000C024000100240003C01402DE9F84FBB -:100BC000DFF8B8A10022012403254FF00F090AF134 -:100BD000040BAAF1040E00BF0B6804FA02F63340BE -:100BE000B34273D10F7907F00307012F01D0022F11 -:100BF00016D187684FEA420805FA08FC27EA0C0775 -:100C0000D1F80CC00CFA08FC4CEA070CC0F808C07C -:100C10004768B7430E79C6F3001696403E434660D8 -:100C20000E79F643B6070DD0C768560005FA06FCE4 -:100C300027EA0C07D1F808C00CFA06FC4CEA070CAE -:100C4000C0F80CC00E7906F00306022E10D1D608AB -:100C500000EB8608D8F8206057074FEAD76C09FAEE -:100C60000CF7BE430F6907FA0CF73743C8F820703A -:100C700006684FEA420C05FA0CF7BE430F7907F0FD -:100C8000030707FA0CF7374307604E6816F4403F36 -:100C90006DD03B4E376847F480473760366822F0A6 -:100CA000030706F480460096364E07EB060CDCF888 -:100CB000086897073F0F09FA07F826EA0806DFF8E1 -:100CC000C880404503D14FF000081EE04FE0DFF838 -:100CD000BC80404502D14FF0010816E0DFF8B0803B -:100CE000404502D14FF002080FE0DFF8A8804045F0 -:100CF00002D14FF0030808E0DFF89C80404502D1A4 -:100D00004FF0040801E04FF0070808FA07F848EA36 -:100D10000608CCF80888DAF800605746D1F804C015 -:100D20009E435FEACC2C00D51E433E60DBF800609A -:100D30005F46D1F804C09E435FEA8C2C00D51E4369 -:100D40003E60DEF800607746D1F804C09E435FEA5B -:100D50008C3C00D51E433E60084F083F3E68D1F8EA -:100D600004C09E435FEACC3C00D51E433E60521C4B -:100D7000102AFFF431AFBDE8F88F0000083C0140B5 -:100D800044380240003001400000024000040240AC -:100D900000080240000C02400010024000690840B8 -:100DA00000D0012070470AB1816170470904FBE758 -:100DB00001488068704700000800002070B50400FA -:100DC00025D094F83D00002520B984F83C502046F9 -:100DD00000F052FA242084F83D002068016821F0D8 -:100DE000010101602068016841F400410160206850 -:100DF000016821F40041016001F0C2F94D4A6168C7 -:100E0000914201D84C4900E04C49884201D201206E -:100E100070BD4B492368B0FBF1F15E6826F03F06D8 -:100E20000E435E606368934206D94FF4967359434C -:100E30004FF47A73B1FBF3F12368491C1E6A26F064 -:100E40003F06314319626168914210D84900401E43 -:100E5000B0FBF1F2521CC2F30B02042A01D20420AF -:100E600022E0B0FBF1F0401CC0F30B001CE0A268D4 -:100E7000F2B301EBC10303EB0116431EB3FBF6F320 -:100E80005B1C43F480431B0549D092B301EBC102C4 -:100E900002EB0111401EB0FBF1F0401CC0F30B004F -:100EA00040F4804040F400402168CA694CF6FF736A -:100EB0009A431043C861D4E90710014320680268CF -:100EC00022F0C00211430160D4E90301014320680C -:100ED000826848F2FF339A4311438160D4E90501E7 -:100EE00008432168CA6822F0FF021043C86001E08D -:100EF0000EE016E02068016841F001010160256400 -:100F0000202084F83D00256384F83E50002070BD09 -:100F100001EB4106431EB3FBF6F35B1CB3E7012074 -:100F2000C2E701EB4101401EB0FBF1F0401CC0F3F1 -:100F30000B00B7E7A086010080841E0000093D0079 -:100F400040420F002DE9FF4F83B09A46DDE911873B -:100F500093460446DDF84090FFF72AFF054694F8D3 -:100F60003D00202870D119230122744920460095A4 -:100F700001F00EFF0028F5D194F83C00012863D061 -:100F8000012084F83C0020680168C90703D101688A -:100F900041F0010101602068016821F400610160F5 -:100FA000222084F83D00402084F83E00002626647C -:100FB000C4F82490A4F82A80608D20856048E062FF -:100FC000CDE9007553465A462046049901F0E2FDEA -:100FD000002879D1208DD0B1012821D002282068A5 -:100FE00024D0416980690090208D032866D80128AB -:100FF0002BD0544902283B464FF00002009557D0B1 -:101000008846204601F0C4FE00285DD13AE0206801 -:10101000416981690091016841F4007101607DE0DE -:101020002068016821F480610160F0E7016821F423 -:10103000806101602068016841F4006101602068FE -:1010400041698069009069E075E02A46394620468A -:1010500001F044FF88BB54E02068016841F400714E -:10106000016020680069616A0870606A401C606203 -:10107000218D491E2185618D491E6185216809697F -:10108000017042E02068016821F4806101602068FD -:101090000069616A0870606A401C6062208D401EB1 -:1010A0002085608D401E60853B46002241460095AC -:1010B000204601F06DFE00B9CEE705E02A4639462C -:1010C000204601F00BFF18B1012007B0BDE8F08FFA -:1010D00020680069616A0870606A401C6062208D47 -:1010E000401E81B22185608D401E60852068426966 -:1010F000D243520712D4032903D1016821F480613D -:10110000016020680069616A0870606A401C606262 -:10111000208D401E2085608D401E6085208D00281A -:101120007FF462AF202084F83D0084F83E6084F8AC -:101130003C600020C9E70220C7E700000200100061 -:101140000000FFFF040001002DE9FF4F83B09A4625 -:10115000DDE9119793460446DDF84080FFF728FE4D -:10116000054694F83D0020287FD1192301224049EB -:101170002046009501F00CFE002876D194F83C0042 -:10118000012872D0012084F83C0020680168C9075A -:1011900003D1016841F0010101602068016821F478 -:1011A00000610160212084F83D00402084F83E0069 -:1011B00000262664C4F82480A4F82A90608D208537 -:1011C0002C48E062CDE9007553465A462046049902 -:1011D00001F05EFD70B930E02A463946204601F044 -:1011E000B5FE58B1206C042804D12068016841F490 -:1011F00000710160012007B0BDE8F08F606A2168CE -:1012000000780861606A401C6062218D491E89B2C5 -:101210002185628D521E628522685369DB435B071C -:101220000BD469B100781061606A401C6062208D47 -:10123000401E2085608D401E6085208D0028CBD10A -:101240002A463946204601F077FD0028CAD154F8D5 -:101250003D0B016841F400710160202004F81E0973 -:10126000E67766770020C6E7FFE70220C3E70000C5 -:10127000020010000000FFFF10B586B004461421E4 -:101280006846FEF7F1FF13492068884220D11248D2 -:101290000021026842F002020260006800F00200D1 -:1012A0000590C02000901220CDE901010320039099 -:1012B0000420049069460948FFF780FC0648103076 -:1012C000016841F400110160006800F4001005900D -:1012D00006B010BD00540040303802400004024007 -:1012E000024881680278114481607047080000203C -:1012F0000B4810B5016841F400710160016841F4C8 -:1013000080610160016841F480710160032000F098 -:1013100081F80F2000F006F800F026F8002010BD3C -:10132000003C024070B50D4D04464FF47A712878A8 -:10133000B1FBF0F00A490968B1FBF0F001F06BFA7B -:1013400048B9102C07D200222146501E00F042F866 -:1013500000206C6070BD012070BD000008000020FE -:1013600014000020704700000A4808B5016841F4E5 -:1013700080410160006800F4804000900548001F33 -:10138000016841F080510160006800F080500090D9 -:1013900008BD00004438024000280DDB00F01F02A9 -:1013A000012191404009800000F1E020C0F8801147 -:1013B000BFF34F8FBFF36F8F7047002809DB00F03A -:1013C0001F02012191404009800000F1E020C0F897 -:1013D00000117047F0B40E4B1B680C46C3F3022398 -:1013E000C3F10705042D00D90425191D072901D2D1 -:1013F000002300E0DB1E012606FA05F1491E21400C -:1014000099409E40761E16403143F0BC04F08CBFDC -:101410000CED00E0064900F0070208684FF6FF03F4 -:10142000184040EA0220034A104308607047000059 -:101430000CED00E00000FA057047006841620020F2 -:101440007047F0B50368586A39B19C6A4FF48276E8 -:1014500000EB144400204D1E0AE040EA024098626E -:101460000FE006EB8007DF59401C04EB1744C0B2C5 -:10147000A842F6D344EA02404FF4807202EB8101A5 -:1014800058500020F0BDD0F8E00403F05DBB01EB44 -:10149000C10200EB8202D0F8E004126A03F0A9BA9C -:1014A00001EBC10200EB8202D0F8E004D2F8602226 -:1014B00003F0FABA10B5040006D0032084F89504AE -:1014C000206804F0EDFD08B1012010BD204600F0B9 -:1014D0002DFC002084F8950410BDD0F8E00403F042 -:1014E00035BB0A0601F00F0101EBC10100EB8101E0 -:1014F00001D5143101E001F51571006804F0E6BB77 -:1015000070B504460B0601F00F0000EBC00104EBC0 -:1015100081014FF001024FF0000502D54A751431E8 -:1015200003E081F8555201F51571087094F89404A0 -:10153000012808D084F89424206803F025FF84F85B -:101540009454002070BD022070BD70B5044601F0B7 -:101550000F002279904201D9012070BD0B0601F0E5 -:101560000F0101EBC10104EB81014FF001024FF0CB -:10157000000502D54A75143103E081F8555201F592 -:1015800015718D70087094F89404012808D084F8BF -:101590009424206804F026FA84F89454002070BD46 -:1015A000022070BD01F00F0101EBC10100EB8100D1 -:1015B000D0F8680270472DE9F04104460F0601F0AB -:1015C0000F0000EBC00104EB81014FF001064FF06A -:1015D000000502D54E75143103E081F8555201F52E -:1015E0001571C2F30A0208708A600B714A7802B161 -:1015F0004883022B00D14D7194F89404012809D03E -:1016000084F89464206803F011FE284684F894540A -:10161000BDE8F0810220FBE710B501F00F0404EBF8 -:10162000C40100EB8101C1E998230023C1F86832AD -:1016300081F8553281F85442837901F51571012BF7 -:1016400000D1CA618279006804F024FA002010BD3C -:1016500070B504460D4601F00F002179884201D98A -:10166000012070BD29064FF000064FF0010206D59B -:1016700000EBC00104EB81014A75143107E005EB72 -:10168000C50104EB810181F8556201F515718A707D -:10169000087094F89404012807D084F894242068F2 -:1016A00004F0CCF9280702D007E0022070BDA17930 -:1016B00004F29C42206804F069F984F894640020E4 -:1016C00070BD10B501F00F0404EBC40100EB810103 -:1016D000C1E9082300238B6201234B7501F8144FE5 -:1016E0008379012B00D1CA618279006804F0D2F9B4 -:1016F000002010BD2DE9FC5F05680446284604F073 -:1017000081FB00287DD1206804F0F4FB002878D00C -:10171000D5F80808C0F30D20C4F8D404206804F0FC -:10172000E9FB800704D52068416901F002014161AD -:10173000206804F0DFFBC10604F29C40009034D521 -:101740002068816921F0100181612F6A07F00F0084 -:1017500000EBC00004EB8006C7F3434006F51576A6 -:10176000022802D0062811D01AE047F6F07007428E -:1017700016D0C7F30A1217462846F16804F0BEFBDC -:10178000F0683844F0607069384408E00822284660 -:10179000009904F0B3FB7069C7F30A110844706143 -:1017A0002068816941F010018161206804F0A2FB8A -:1017B00000034FF0080B4FF0000A4FF001097CD5F1 -:1017C0000026206804F075FB074674E0F80770D027 -:1017D000F1B2206804F086FB8046C00707D005EB15 -:1017E0004611C1F8089B3146204602F03FF95FEAF6 -:1017F000087024D505EB4611C1F808BB2068016CC0 -:1018000000E023E200EB46100191D0F8082BFB4BDF -:10181000994205D9110403D54FF40041C0F8081BC3 -:10182000204600F00DFBF5490198884207D9A079C0 -:10183000012804D120680121009A04F0A7F85FEA8A -:10184000C86004D505EB46111020C1F8080B5FEA0B -:1018500088701DD56869000605D5D5F8040840F4E0 -:101860008061C5F8041806EBC60004EB800090F810 -:10187000571200F51570012905D180F803A0F1B2C7 -:10188000204600F0E9F905EB46110220C1F8080BEB -:101890005FEA886004D505EB46102021C0F8081BDC -:1018A0005FEA884005D505EB46104FF40051C0F8BB -:1018B000081B7F08761C002F88D1206804F01AFBD3 -:1018C00040036ED5206804F0EDFA0746002666E076 -:1018D000F80762D0F1B2206804F0F2FA8046C0073F -:1018E00023D006F00F01D5F8342809FA01F18A4314 -:1018F000C5F8342805EB4611C1F80899A0790128EC -:101900000FD106EBC60004EB8000D0E9072111449B -:10191000016236B9606A20B920680121009A04F09A -:1019200035F8F1B22046FFF7B2FD5FEA087003D543 -:1019300005EB4611C1F808B95FEAC86004D505EBAC -:1019400046111020C1F808095FEA486004D505EB8C -:1019500046104021C0F808195FEA887016D5314654 -:10196000284604F024FA06EBC60004EB8000C17D93 -:101970001430012905D180F803A0F1B2204600F00F -:1019800067F905EB46110220C1F808095FEA086013 -:1019900003D53146204602F0CFF87F08761C002F91 -:1019A00096D1206804F0A6FA002811DAD5F80408C8 -:1019B00020F00101C5F8041894F8CC0401282BD0BC -:1019C000204600F022FA2068416901F0004141619F -:1019D000206804F08FFA00050BD5D5F80808C00779 -:1019E00002D0204600F07AFA2068416901F40061D3 -:1019F0004161206804F07EFAC00467D5D5F8040878 -:101A000020F00100C5F804081021206804F0CFF987 -:101A100000214FF67F3220E084F8CCA4002120463C -:101A2000FFF70AFDCFE700BF05EB4110C0F808291A -:101A3000D0F8003923F40013C0F80039C0F8082B9F -:101A4000D0F8003B23F40013C0F8003BD0F8003B73 -:101A500043F00063C0F8003B491C20798842E3D87A -:101A6000D5F81C0840F00111C5F81C18E07B0028CF -:101A700028460DD0D0F8840840F00B01C5F8841832 -:101A8000D5F8440840F00B012846C5F844180DE08D -:101A9000D0F8140842F22B010843C5F81408D5F811 -:101AA000100840F00B012846C5F81018D0F80008BF -:101AB00020F4FE61C5F80018A1792068009A03F0AF -:101AC00065FF2068416901F480514161206804F09C -:101AD00011FA800415D5206803F0E8FB206804F0B3 -:101AE00084F9E07100F046FB0146E279206804F0D9 -:101AF00063FA204600F076F92068416901F400514C -:101B00004161206804F0F6F9000707D5204600F08F -:101B100080F92068416901F008014161206804F002 -:101B2000E9F9000616D5A86920F08001A96101260F -:101B30000DE000BF06EBC60004EB800090F85702F2 -:101B4000012803D1F1B22046FFF7CBFC761C2079A7 -:101B5000B042EFD8206804F0CDF9C0021FD50126AD -:101B60004F4614E005EB4610D0F8001906EBC6000E -:101B700004EB8002107E012808D1002906DAF0B2B9 -:101B800040F08001D7752046FFF7ABFC761C20792A -:101B9000B042E7D82068416901F4801141612068B2 -:101BA00004F0A8F9800234D501204A4629E000BF9C -:101BB00005EB4011D1F8001B00EBC00304EB8303DD -:101BC00093F85862012E1BD1002919DA94F8D464D5 -:101BD00001F4803106F00106B14211D183F8572299 -:101BE000A96941F08003AB616969090608D4D5F899 -:101BF000040840F40070C5F8040805E00A30544FAA -:101C0000401C21798142D3D82068416901F4001138 -:101C10004161206804F06EF9400007D52046FFF7C7 -:101C200032FC2068416901F080414161206804F084 -:101C300061F940070AD520684568680702D5204643 -:101C4000FFF74BFC2068416829434160BDE8FC9FD9 -:101C5000D0F8E00402F0CDBFD0F8E00402F0DDBF20 -:101C6000F8B5040005D094F895042668002510B155 -:101C700006E00120F8BD84F89454204600F070F886 -:101C8000032084F89504B6F1A04F00D1A571206817 -:101C900003F0BAFC207C8DF8000094E80F0003F0FC -:101CA00013FB0226B8BB0021206804F046F990BB64 -:101CB000002001270DE000BF00EBC00104EB810113 -:101CC0004F750875C8850D76CD610D62401CC0B298 -:101CD0004D6221798142EFD8002011E000EBC00174 -:101CE00004EB810181F8555281F8540281F8585271 -:101CF000C1F85C52C1F86052401CC0B2C1F86452D5 -:101D000021798142EAD8207C8DF8000094E80F0008 -:101D100003F0BCFB10B184F89564AAE7657484F8FD -:101D20009574206803F0A4FB0020F8BD10B500688E -:101D3000B0F1A04F0ED10848016821F08001016088 -:101D40004FF4C0510548FEF7A3FEBDE81040432004 -:101D5000FFF722BB10BD00003438024000000240F3 -:101D600010B586B0044614216846FEF77DFA206857 -:101D7000B0F1A04F2FD119480021026842F00102B2 -:101D80000260006800F0010005904FF4C050009020 -:101D90000220CDE90101032003900A200490694646 -:101DA0000F48FEF70BFF0D48001D016841F0800150 -:101DB00001600A481430016841F480410160006804 -:101DC000002200F48040059011464320FFF702FBFB -:101DD0004320FFF7F2FA06B010BD00003038024091 -:101DE0000000024070B50446C0790125022801D0E8 -:101DF000FEF7A4FB2946D4F8E00402F07CFFD4F8F7 -:101E0000E004BDE8704002F031BFD0F8E00402F019 -:101E10005BBFD0F8E00402F061BF10B5044690F853 -:101E2000940401280AD0012084F894046174206885 -:101E300004F0B1F8002084F8940410BD022010BD15 -:101E4000D0F8E02400F29C41104602F060BF10B5CB -:101E50000446006894F89414012909D0012184F8FB -:101E60009414C168490609D5617B012902D005E0B7 -:101E7000022010BD816B41F480318163206803F042 -:101E800074FF206803F0E6FA002084F8940410BD83 -:101E900070B50446006894F894140546012912D0E0 -:101EA000012184F8941403F0AFFB206803F0E0FAFA -:101EB0001021206803F07BFFE868400609D5607BAD -:101EC000012802D005E0022070BDA86B20F480300C -:101ED000A863002084F8940470BD000010B5044687 -:101EE000D0F8E00402F05EFF2068D0F8001E41F058 -:101EF0000101C0F8001EE07A002804D00248016801 -:101F000041F00601016010BD10ED00E02DE9F04741 -:101F10000E46050065D0DFF81481D8F80000F7B24E -:101F200000F00700B04207D288F80070D8F800002F -:101F300000F00700B04254D128683D4C810712D50B -:101F4000400703D5206840F4E0502060287800075F -:101F500003D5206840F4604020602068A96820F024 -:101F6000F000084320602878C0072DD03049686809 -:101F70000839012812D0022813D0032811D009688B -:101F8000890700292DDA216821F00301014321602E -:101F9000FEF70EFF814641F2883A0EE00968890398 -:101FA000EFE709688901ECE7FEF702FFA0EB090102 -:101FB000514502D90320BDE8F0872068696800F028 -:101FC0000C00B0EB810FEFD1D8F80010404601F0C3 -:101FD0000701B14207D90770006800F00700B0425E -:101FE00001D00120E7E72878400705D52068E96897 -:101FF00020F4E050084320602878000706D52068C8 -:10200000296920F4604040EAC100206000F0C8F86F -:102010002168084AC1F30311515CC84006490860B1 -:1020200006480068FFF77EF90020C4E7003C024044 -:10203000083802402C9F0008140000200C000020EB -:102040002DE9F041FEF7B4FE444C0546206840F00F -:102050000100206005E000BFFEF7AAFE401B022839 -:1020600047D820688007F7D5206840F080002060BE -:10207000FEF79EFE0546394E00200836306041F2DC -:10208000883704E0FEF794FE401BB84231D8306830 -:1020900010F00C0FF6D1FEF78BFE0546206820F4F9 -:1020A0005020206005E000BFFEF782FE401B642840 -:1020B0001FD820688003F7D4FEF77AFE0546206813 -:1020C00020F08070206004E0FEF772FE401B0228C2 -:1020D0000FD820688001F7D4FEF76AFE0546206815 -:1020E00020F08060206007E0FEF762FE401B0228BF -:1020F00002D90320BDE8F08120680001F4D417491B -:102100001748091D086015491648843108601348AE -:102110000C30016821F4F8510160016821F400518C -:102120000160016841F41F010160016841F4001180 -:1021300001600A487430016821F001010160016802 -:1021400041F080710160094907480860084800684B -:10215000FFF7E8F80028CDD00120CBE70038024097 -:1021600010300004103000200024F400140000207F -:102170000C00002001480068704700001400002097 -:102180000448054900680968044AC1F38221515C8A -:10219000C840704714000020083802403C9F0008E7 -:1021A000154810B5006810F00C02144813D01449FB -:1021B000042A0FD0082A0ED10F4C241F226823684E -:1021C00002F03F025B0207D52068C0F38810A0FB35 -:1021D000010106E0084610BD2168C1F38811A1FB8A -:1021E00000010023FDF7F6FF2168C1F30141491CFE -:1021F0004900B0FBF1F010BD083802400024F400A3 -:1022000040787D012DE9F84F04006ED02078DFF88A -:102210004C93C007A9F104054AD009F104000168F4 -:10222000C1F38101012908D00068C0F381000228B0 -:102230000AD1D9F80000400206D52868800337D5B6 -:1022400060680028E1D033E06068B0F5803F10D0CE -:10225000B0F5A02F286810D020F4803028602868BE -:1022600020F4802028606068A8B1FEF7A1FD064632 -:102270000DE0286840F48030F4E740F480202860C6 -:10228000F7E700BFFEF794FD801B642873D8286829 -:102290008003F7D50CE0FEF78BFD064605E000BF96 -:1022A000FEF786FD801B6428F0D828688003F7D4E9 -:1022B0002078DFF8AC8280074FF0000A3ED5A748AF -:1022C000001D016811F00C0F08D00068C0F38100F8 -:1022D00002280BD1D9F80000400207D428688007F3 -:1022E00016D5E068012800D112E033E1E068B8B10A -:1022F0000120C8F80000FEF75BFD064605E000BFC0 -:10230000FEF756FD801B0228C0D828688007F7D545 -:102310002868216920F0F80040EAC10028600DE03B -:10232000C8F800A0FEF744FD064604E0FEF740FDB5 -:10233000801B02281FD828688007F7D42078000760 -:1023400022D5864F87486169703771B101210160DC -:10235000FEF72EFD064604E0FEF72AFD801B02284C -:1023600009D838688007F7D50EE0C0F800A0FEF75E -:102370001FFD064605E082E0FEF71AFD801B0228DD -:102380007DD838688007F7D42078400768D5DFF813 -:10239000CCB100270BF13C0BDBF80000C0000BD4E4 -:1023A000DBF8001041F08051CBF80010DBF80000A2 -:1023B000012700F0805000906B4E3068C00510D4AB -:1023C000306840F480703060FEF7F2FC009005E069 -:1023D000FEF7EEFC0099401A022850D83068C0057C -:1023E000F6D55E4EA0686C3601280FD005283068FF -:1023F00010D020F001003060306820F00400306020 -:10240000A068B8B1FEF7D4FC00900FE0306840F04F -:102410000100F4E740F004003060F7E7FEF7C8FC85 -:102420000099411A41F28830814266D830688007AD -:10243000F4D50EE0FEF7BCFC009007E0FEF7B8FC18 -:102440000099411A41F28830814256D8306880079D -:10245000F4D42FB1DBF8001021F08051CBF800103C -:10246000A069C8B33D49091D0968C1F3810102296A -:102470004AD00228504607D0C8F8600000E03CE08F -:10248000FEF796FC04463BE04746C8F86000FEF7BE -:102490008FFC064605E000BFFEF78AFC801B022881 -:1024A0002BD828688001F7D4D4E907010843A16A32 -:1024B0002E4A490802EB0141626A41EA821108434F -:1024C00094F82C1040EA0161C9F800100120386628 -:1024D000FEF76EFC044606E03EE000BFFEF768FC37 -:1024E000001B022809D828688001F7D534E000BF16 -:1024F000FEF75EFC001B022802D90320BDE8F88F1E -:1025000028688001F4D427E00128F7D0D9F800002A -:10251000E26900F4800191421CD1226A00F03F017F -:10252000914217D147F6C071626A0140B1EB821F38 -:1025300010D1A26A4FF0FF3300F4403103EB520296 -:10254000B1EB024F06D194F82C1000F07060B0EBA4 -:10255000016F01D00120D1E70020CFE7043802400D -:1025600000004742800E4742007000400000FFFF1D -:1025700070B5040009D0606A002540B1256165612D -:10258000A56294F8510040B10CE0012070BD606874 -:10259000B0F5827FF4D0E561F2E784F85050204630 -:1025A00000F044F8022084F851002068016821F00E -:1025B00040010160A088218900F4827001F4044187 -:1025C0000843A18901F400610843217C01F0020164 -:1025D0000843217D01F001010843218B01F40071C2 -:1025E0000843217F01F03801084394F8201001F0DE -:1025F00080010843218D01F40051084321680860DF -:10260000A069042101EA104094F8241001F010019F -:102610000843216848602068C16921F40061C161F4 -:102620006565012084F85100002070BD10B586B0AA -:10263000044614216846FDF717FE144920688842B5 -:1026400021D113480021026842F4804202600068F0 -:1026500000F4804005900E481038026842F00202F3 -:102660000260006800F0020005904FF420400090E6 -:102670000220CDE901010320039005200490694662 -:102680000448FEF79BFA06B010BD00000038004079 -:1026900040380240000402402DE9F84F98461646A3 -:1026A0008A460446FEF784FB814694F851000128CF -:1026B0001ED1BAF1000F73D0002E71D094F85000E3 -:1026C000012815D0012784F85070032084F85100A8 -:1026D00000256565C4F830A0A686E686A563A587B3 -:1026E000E58765642564A068B0F5004F03D00CE071 -:1026F0000220BDE8F88F2068016821F040010160E8 -:102700002068016841F48041016020680168490641 -:1027100003D4016841F040010160E068B0F5006F4A -:10272000606803D048B3012E27D047E008B1012EDE -:102730001FD1206B21680088C86006E0206881688E -:10274000890709D5216B0988C160206B801C206333 -:10275000E08E401EE0860CE0FEF72AFBA0EB0901AC -:10276000414503D3B8F1FF3F03D035E0B8F1000F86 -:1027700032D0E08E0028E1D123E0206B2168007880 -:10278000087306E02068816889070AD5216B0978FB -:102790000173206B401C2063E08E401EE0860DE03C -:1027A0002BE0FEF705FBA0EB0901414503D3B8F18F -:1027B000FF3F03D010E0B8F1000F0DD0E08E0028ED -:1027C000E0D14A464146204601F064FA08B1202093 -:1027D0006065A06830B109E084F8517084F8505009 -:1027E000032086E72068C1688068009084F85170F3 -:1027F00004F8505F60680028F3D0012079E74FF0BB -:10280000E0210428086903D020F004000861704723 -:1028100040F00400FAE710B5401EB0F1807F01D30C -:10282000012010BD4FF0E02460610F21601703F01C -:102830007BFD0020A06107202061002010BD10B5A5 -:1028400090F83C20012A22D0012280F83C20CA685E -:102850008C6822F4407222434C6822F48062224346 -:102860000C6822F4006222430C6922F48052224355 -:102870004C6922F400522243C969002322F48042A9 -:102880000A4301684A6480F83C30002010BD0220F1 -:1028900010BD000070B590F83C20012A2CD0012416 -:1028A00080F83C40022280F83D2003685A689D6809 -:1028B00022F070060A6832435A60104B02689A424E -:1028C0000ED0B2F1804F0BD00D4B9A4208D00D4B79 -:1028D0009A4205D00C4B9A4202D00C4B9A4204D13A -:1028E000496825F080031943916080F83D4000213C -:1028F00080F83C10084670BD022070BD0000014009 -:102900000004004000080040000C0040004001406E -:1029100010B586B0044614216846FDF7A5FC0E49A3 -:102920002068884216D10D480021026842F0010259 -:102930000260006800F0010005904FF48060009094 -:102940000220CDE901010120CDE9031069460448C8 -:10295000FEF734F906B010BD0000014030380240E7 -:102960000000024070B5044690F83C0000260D4679 -:1029700001280FD0012084F83C006AB1042A1DD040 -:10298000082A2FD00C2A3FD00126002084F83C00D2 -:10299000304670BD022070BD206801F023FB206826 -:1029A000816941F0080181612068816921F0040199 -:1029B0008161206881692A69114311E0206801F072 -:1029C00039FB2068816941F4006181612068816977 -:1029D00021F480618161206881692A6941EA0221CC -:1029E0008161D2E7206801F051FB2068C16941F0A4 -:1029F0000801C1612068C16921F00401C16120683A -:102A0000C1692A69114311E0206801F06BFB20685D -:102A1000C16941F40061C1612068C16921F480612C -:102A2000C1612068C1692A6941EA0221C161ACE73C -:102A300010B5040003D094F83D0010B107E0012068 -:102A400010BD002084F83C00204600F01FF8022052 -:102A500084F83D00211D206801F064FA012084F80B -:102A6000460084F83E0084F83F0084F8400084F873 -:102A7000410084F8420084F8430084F8440084F85C -:102A8000450084F83D00002010BD000008B5006836 -:102A90000649884208D10648016841F001010160F9 -:102AA000006800F00100009008BD00000000014037 -:102AB0004438024010B50446022249B104290ED020 -:102AC000082913D094F84100012816D0012010BD28 -:102AD00094F83E000128F9D184F83E200FE094F8E4 -:102AE0003F000128F2D184F83F2008E094F840002C -:102AF0000128EBD184F8402001E084F84120012234 -:102B0000206801F061FA12492068884203D1426CC2 -:102B100042F400424264206888420ED0B0F1804FF7 -:102B20000BD00C49884208D00B49884205D00B498C -:102B3000884202D00A49884204D1816801F0070125 -:102B4000062903D0016841F001010160002010BD99 -:102B5000000001400004004000080040000C00405C -:102B600000400140FEE701684A69D24352050FD494 -:102B70006FF480624A61002140F8301F20224273C6 -:102B80008173026942F004020261017301207047FF -:102B9000002070472DE9F84F0446006889460B9DD8 -:102BA00001689846174641F4806101602068016819 -:102BB00041F48071016000954FF0011B00225946DD -:102BC00020460A9B00F0E4F84FF4007A40B12068F8 -:102BD0000068C00501D5C4F840A00320BDE8F88F07 -:102BE000216809F0FE0008612B46284920460A9A10 -:102BF00000F016F9F0BB20684169806900902A4610 -:102C000020460A9900F0A2F940B1206C04283AD17C -:102C10002068016841F40071016034E0FEB2B8F14F -:102C2000010F09D02168380A08612A4620460A990E -:102C300000F08CF90028E8D1206806612A46204679 -:102C40000A9900F083F90028DFD12068016841F477 -:102C50008071016000950022594620460A9B00F0D1 -:102C600097F80028B3D1216809F0FF0040F0010077 -:102C7000086100E007E02B46044920460A9A00F06C -:102C8000CFF80028AAD00120A8E700000200010028 -:102C90002DE9F843044600680D46DDE90897016810 -:102CA0009846164641F4807101604B4600224FF071 -:102CB00001112046009700F06BF848B120680068C9 -:102CC000C00502D54FF4007020640320BDE8F883EE -:102CD000216805F0FE0008613B464A46154920463A -:102CE00000F09EF888B920684169806900903A46F2 -:102CF0004946204600F02AF948B1206C042804D146 -:102D00002068016841F4007101600120DEE7F5B23E -:102D1000B8F1010F09D02168300A08613A464946E6 -:102D2000204600F013F90028E7D120680561002053 -:102D3000CCE700000200010070B516460D460446BF -:102D40001EE02046FFF70FFF08B1012070BD681C90 -:102D500016D0FEF72DF8801BA84200D885B9206850 -:102D60004069C04340070BD5002044F8300F2021B4 -:102D70006173A073216941F0200121612073E4E7B0 -:102D800020684069C0434007DBD4002070BD0000CC -:102D90002DE9F047984617460D460446C1F307460D -:102DA000DDF820902AE000BFB8F1FF3F26D0FDF704 -:102DB000FFFFA0EB0901414502D8B8F1000F1DD17A -:102DC0002068012E16D0806925EA00000004000C5E -:102DD00012D00020B84211D1002044F8300F202139 -:102DE0006173A073216941F02001216120730120EA -:102DF000BDE8F0874069E7E70120EBE72068012E96 -:102E00000AD0806925EA00000004000C06D00020EA -:102E1000B842C9D00020EBE74069F3E70120F7E7AB -:102E20002DE9F047984616460D4604464FF0000936 -:102E30004FF0200AC1F3074723E020684069C043F0 -:102E4000400515D42068016841F4007101602168D3 -:102E50006FF480604861C4F8309084F83DA084F835 -:102E60003E90216C41F00401216484F83C9021E003 -:102E7000701C06D0FDF79CFFA0EB0800B04203D801 -:102E800016B1012F1FD021E02068012F15D08069D5 -:102E900025EA00000004000C18D000BF44F8309F61 -:102EA00084F80DA084F80E90216941F02001216181 -:102EB00084F80C900120BDE8F087406925EA000005 -:102EC0000004000CEAD12068406901E020688069B4 -:102ED00025EA00000004000CAFD1ECE72DE9F04139 -:102EE000002590460E460446202728E04069C0434E -:102EF000C0060CD454F8301B6FF01000486144F841 -:102F000010596777A577206A2062257714E0FDF7CE -:102F10004FFFA0EB0800B04200D886B92068406996 -:102F2000C04340060BD544F8305F6773A573206932 -:102F300040F02000206125730120BDE8F081206869 -:102F40004169C9434906D1D40020F6E770B5164659 -:102F50000D4604461EE02046FFF705FE08B101209D -:102F600070BD681C16D0FDF723FF801BA84200D857 -:102F700085B920684069C04300060BD5002044F89D -:102F8000300F20216173A073216941F0200121617C -:102F90002073E4E720684069C0430006DBD40020CA -:102FA00070BD0000F0B500220D4B154614460A27EF -:102FB000B1FBF3F630368654B1FBF3F603FB161182 -:102FC000B3FBF7F3521C861816F8016C302E00D1B3 -:102FD00025B16D1C641C0A2CEAD3F0BD0022F9E770 -:102FE00000CA9A3BF0B500230A24302537261F4635 -:102FF00011E000BFB4EB107F02D905EB107C01E0BB -:1030000006EB107C01F813C001EB430C00015B1CC4 -:103010008CF80170DBB29342ECD3F0BD00B587B001 -:1030200014216846FDF720F909480021026842F0A2 -:1030300001020260006800F0010005900120CDE966 -:103040000001029069460348FDF7B8FD07B000BDD6 -:1030500030380240000002402DE9F04104461D4690 -:1030600016460F462A2000F023FA204600F010FAF8 -:10307000304600F00DFA2B2000F01AFA384600F026 -:1030800007FA284600F004FABDE8F0412C2000F0D1 -:103090000FBA10B5503114468BB289B20246FFF711 -:1030A000DBFF2046BDE8104000F0F2B92DE9F04703 -:1030B00080461F4603F14F0083B21646501E82B26F -:1030C0000C4601F1500081B24046DDF82090FFF738 -:1030D000C3FF0AE0454604E0484600F0D9F96D1CFC -:1030E000ADB2B542F8D3641CA4B2BC42F2D3BDE881 -:1030F000F0870000F0B587B014216846FDF7B4F8FA -:103100001848016841F002010160016801F0020104 -:103110000591016841F00201016000684FF480569A -:1031200000F00200059001240F4FCDE90064032553 -:10313000694603953846FDF741FD01223146384680 -:10314000FDF731FE2E02CDE90064084C6946039577 -:103150002046FDF733FD012231462046FDF723FED0 -:1031600007B0F0BD303802400004024000000240C9 -:1031700070B5FFF7BFFF00224FF480716748FDF77D -:1031800012FE674D4FF48054002221462846FDF779 -:103190000AFE642003F0FEF8012221462846FDF7CE -:1031A00002FE642003F0F6F8112000F081F9782087 -:1031B00003F0F0F8362000F07BF9C02000F08EF923 -:1031C0003A2000F075F9052000F088F9B22000F0EF -:1031D0006FF90C2000F082F90C2000F07FF900203C -:1031E00000F07CF9332000F079F9332000F076F913 -:1031F000B72000F05DF9352000F070F9BB2000F039 -:1032000057F9192000F06AF9C02000F051F92C207C -:1032100000F064F9C22000F04BF9012000F05EF9E3 -:10322000C32000F045F9122000F058F9C42000F046 -:103230003FF9202000F052F9C62000F039F90F20A4 -:1032400000F04CF9D02000F033F9A42000F046F94A -:10325000A12000F043F9E02000F02AF9D02000F08E -:103260003DF9042000F03AF90D2000F037F9112063 -:1032700000F034F9132000F031F92B2000F02EF982 -:103280003F2000F02BF9542000F028F94C2000F0EA -:1032900025F9182000F022F90D2000F01FF90B206D -:1032A00000F01CF91F2000F019F9232000F016F996 -:1032B000E12000F0FDF8D02000F010F9042000F02B -:1032C0000DF90C2000F00AF9112000F007F9132085 -:1032D00000F004F92C2000F001F93F2000F0FEF886 -:1032E000442000F0FBF8512000F0F8F82F2000F007 -:1032F000F5F81F2000F0F2F81F2000F0EFF8202072 -:1033000000F0ECF8232000F0E9F8212000F0D0F8DC -:10331000BDE87040292000F0CBB80000000002405A -:1033200000040240411F5F2909D84FF4967110FB39 -:1033300001F06421B0FBF1F001490968C8637047EE -:10334000CC0100202DE9FF4F81B00446DDF83C9010 -:1033500000904FEA59074FF00008780700D001208D -:1033600000EBD70000FB09FB203AD0B20390029893 -:1033700048444F3083B2E019401E82B20298503068 -:1033800081B22046FFF768FE002553E0B9F10C0F2B -:103390002AD0B9F1100F2ED0B9F1180F2ED0B9F1F3 -:1033A000200F49D12749039801EB8010002610F81F -:1033B00005A0109800284FF0010000FA06F000EA7E -:1033C0000A0022D020B12046049A0299FFF761FE3C -:1033D000641C0098A4B2201AB84225D10298009C1F -:1033E000401C80B2029023E00398174900EB400094 -:1033F00001EB8000DAE71549039803E003981449CC -:1034000000EB400001EB0010D0E708B1049800E0A9 -:103410000E9800F03DF808F10100C0B2B0FBF7F1E2 -:10342000804607FB118050B1761CF6B2082EC0D33F -:103430006D1CADB25D45A9D305B0BDE8F08F4FF06E -:103440000008F5E74482000810660008846A000856 -:10345000747000082DE9FE4F9946DDE90D671446AA -:103460008A460546DDF830800CE0CDF800804B46FA -:1034700051462846CDE90167FFF764FF05EB56008A -:1034800085B2641C2278002AEFD1BDE8FE8F0000CF -:1034900008B5010A8DF800108DF801000123022201 -:1034A00069460248FFF7F8F808BD000074010020E3 -:1034B00070B5094D06464FF4007400222146284697 -:1034C000FDF771FC304600F009F821462846BDE8BA -:1034D00070400122FDF767BC0000024001B50123E6 -:1034E0001A4669460148FFF7D7F808BD7401002065 -:1034F000074910B5054808600846FDF700FA00289E -:1035000003D0BDE81040FDF719B810BD00300240EF -:10351000000000200D4808B5016841F080010160FD -:10352000016801F080010091016841F00201016031 -:10353000016801F002010091016841F001010160A0 -:10354000006800F00100009008BD00003038024023 -:103550000D4810B50B4901600C49416000214FF442 -:1035600080428160C0E9031241618161C1610162F1 -:10357000FDF724FC002803D0BDE81040FCF7DEBFB7 -:1035800010BD00000054004020010020A086010072 -:10359000104810B50E4901604FF48271416000215E -:1035A00002228160C0E90312012242615202C0E995 -:1035B00006210162416281620A21C162FEF7D8FFE1 -:1035C000002803D0BDE81040FCF7B8BF10BD0000D4 -:1035D000003800407401002010B592B000240F9410 -:1035E0001C2108A81094FCF73FFE20216846FCF738 -:1035F0003BFE20481E4901606321C0E90114FA2105 -:10360000C0E9031444618461FFF712FA08B1FCF7C2 -:1036100095FF0F940FA917481094FFF73BF908B1D5 -:10362000FCF78CFF6020CDE908040A940B940C94FD -:103630000D94082208A90F480E94FFF793F908B1DA -:10364000FCF77CFF00944FF40050CDE90440029455 -:1036500001940394694607480794FFF7F0F808B10E -:10366000FCF76CFF0348FFF753F912B010BD0000E0 -:1036700000000140CC01002010B500220F49104885 -:1036800001F092F908B1FCF759FF0E490C4801F01E -:10369000B5FB08B1FCF752FF0B49094800F00CFFDD -:1036A00008B1FCF74BFF064801F02CFC002803D0C2 -:1036B000BDE81040FCF742BF10BD0000280000200C -:1036C00034070020E80000207C000020334802F08E -:1036D000CFFB334802F0CCFB324802F0C9FB324842 -:1036E00002F0C6FB2F4802F0C3FB304802F0C0FBDB -:1036F0002A4802F0BDFB2EA002F0BAFBFCF7BEFF89 -:103700002D4C002510B90120206000E025602BA081 -:1037100002F0AEFB39A002F0ABFB48A002F0A8FB20 -:1037200056A002F0A5FB206810B164A002F0A0FB37 -:1037300072A002F09DFBFDF781F8312806D03228F7 -:1037400007D0332807D034280FD011E001F062FFF2 -:10375000DDE77AA010E084A002F08AFB4FF47A70D3 -:10376000FDF716F902F03CFED1E72068012806D0EB -:10377000206800280FD087A002F07AFBC7E7FCF78B -:1037800031FF012803D00228C1D192A0F4E79CA008 -:1037900002F06EFBBAE7A2A0EEE7000074A00008FA -:1037A000909F0008449F000828A00008DC9F0008A4 -:1037B0000D0A0D0A000000001C0000200D0A3D3D0E -:1037C0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D29 -:1037D000204D61696E204D656E75203D3D3D3D3D3E -:1037E0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D09 -:1037F0003D3D3D3D3D3D3D0D0A0A00002020446F0A -:10380000776E6C6F616420496D61676520546F202D -:103810007468652053544D33324634787820496EAD -:103820007465726E616C20466C617368202D2D2D5D -:103830002D2D2D2D20310D0A0A000000202055705D -:103840006C6F616420496D6167652046726F6D2001 -:103850007468652053544D33324634787820496E6D -:103860007465726E616C20466C617368202D2D2D1D -:103870002D2D2D2D20320D0A0A0000002020457824 -:10388000656375746520546865204E6577205072B5 -:103890006F6772616D202D2D2D2D2D2D2D2D2D2D30 -:1038A0002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D48 -:1038B0002D2D2D2D20330D0A0A00000020204469F3 -:1038C0007361626C65207468652077726974652025 -:1038D00070726F74656374696F6E202D2D2D2D2DA0 -:1038E0002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D08 -:1038F0002D2D2D2D20340D0A0A0000003D3D3D3DAB -:103900003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3DE7 -:103910003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3DD7 -:103920003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3DC7 -:103930003D3D3D3D3D3D0D0A0A0000005468697360 -:103940002066756E6374696F6E2069732064697395 -:1039500061626C65642120506C65617365205573EC -:103960006520310D00000000537461727420746F83 -:103970002065786563757465207468652075736566 -:1039800072206170706C69636174696F6E2E2E2E87 -:103990000D0A0000496E76616C6964204E756D6297 -:1039A00065722021203D3D3E20546865206E756D76 -:1039B0006265722073686F756C642062652065694A -:1039C0007468657220312C20322C2033206F7220D5 -:1039D000340D00004572726F723A20466C61736854 -:1039E00020777269746520756E70726F7465637488 -:1039F000696F6E206661696C65642E2E2E0D0A005B -:103A000057726974652050726F74656374696F6E64 -:103A10002064697361626C65642E2E2E0D0A0000AD -:103A2000496E76616C6964204E756D626572202105 -:103A3000203D3D3E20546865206E756D62657220A4 -:103A400073686F756C64206265206569746865725F -:103A500020312C2032206F7220330D00FEE7FEE76C -:103A60000148FDF747BE0000302600202DE9F04157 -:103A700003680D4604461E6C03EB4511D1F8080B94 -:103A800094F806E04FF400474FF0200C04F29C42FB -:103A9000BEF1010F09D0DFF898E0764539D1020474 -:103AA00032D500BFC1F8087B3FE0224B5FEA007EC1 -:103AB00004D59E4239D90004F4D436E05FEA806E22 -:103AC00002D5C1F808CB30E010F0280F2DD19E426E -:103AD00001D90004E6D405EBC50004EB8000D1F861 -:103AE000101BD0F87432C1F31201591AC0F86812D1 -:103AF00000F51570ADB903691BB1C2681144C1600E -:103B00000FE0012120680AE080060AD5C1F808CB41 -:103B100007E035B9D4F8640218B90021184601F05D -:103B200035FFE9B22046FDF7BBFC0020BDE8F0817F -:103B30000A31544F0A30544F2DE9F84F0E4601EB2D -:103B4000C60100EB810481460568D4E909101434EC -:103B5000884202D90120BDE8F88F081AA168814285 -:103B600000D20846C01C870805EB46181BE000BFC2 -:103B7000A0EB010AA068504500D282460AF103007A -:103B8000870899F8060000901FFA8AF3F2B22846D7 -:103B9000E16802F0A7FAE16801EB0A00E060616900 -:103BA00001EB0A006061D8F8180980B2B84205D369 -:103BB000D4E90401814201D20028D9D1D4E9040119 -:103BC000884208D806F00F0101208840D5F8341843 -:103BD0008143C5F834180020BDE7704770B50C4626 -:103BE000054604E0284602F011F9012804D0641EBD -:103BF000F8D24FF0FF3070BD002070BD2DE9F84FB6 -:103C0000884600210646C8F80010924611466846CC -:103C1000FFF7E4FF4FF0FF39B0BB9DF80000182814 -:103C200014D006DC012809D0022809D004282BD1A1 -:103C30002EE0412816D0612826D113E0802401E02F -:103C40004FF4806401253070671D15E051466846C9 -:103C5000FFF7C4FFC0B99DF80000182814D1C8F8B8 -:103C6000009015E00120BDE8F88F70195146FFF76C -:103C7000B5FF48B96D1CADB2BD42F6D3B1787078CE -:103C800081F0FF01884201D04846ECE7C8F80040C7 -:103C90000020E8E7F8B515460E460B4600920446AC -:103CA0000122022100F02CF8A0B913481349006842 -:103CB000B0FBF1F04FF47A71484300906068B0F5C2 -:103CC000827F0DD13346002280212046009500F0EE -:103CD00017F870B1606D40F0200060650320F8BDFA -:103CE000009830B1401E009020688068C0430006F4 -:103CF000F6D50020F8BD00001400002000366E014B -:103D00002DE9F8431E46914688460446089DFDF776 -:103D10004FF8401B351AFDF74BF807462548006859 -:103D2000C0F3CB30684338E0701C37D0FDF740F863 -:103D3000C01BA84203D215B1009860B32CE02068E4 -:103D4000416821F0E00141606068B0F5827F0BD1ED -:103D5000A068B0F5004F02D0B0F5806F04D12068A4 -:103D6000016821F040010160A06AB0F5005F09D14F -:103D70002068016821F4005101602068016841F465 -:103D800000510160012084F85100002084F85000A7 -:103D90000320BDE8F8830025401E0090206881685C -:103DA00038EA010004D000214945BDD10020F0E7E8 -:103DB0000121F9E71400002070470178407841EABA -:103DC0000020704770B5002204781346302C04D1CF -:103DD0004478782C0AD0582C08D06FF02F05845CDA -:103DE00074B36B2C2ED04B2C2CD030E082780AB3DD -:103DF0000224025D5AB1A2F14105052D0AD9A2F1B2 -:103E00006106052E06D91135092D07D913E00120C9 -:103E10000B6011E0A2F13006092E01D8303A04E01F -:103E2000052D01D8373A00E0573A641C02EB031322 -:103E30000B2CDED302E000200B2C00D3002070BD41 -:103E40000B6002E01AB1980207E0012015E06D2C2A -:103E500001D04D2C03D112B118050860F5E7A4F18B -:103E60003006092E08D803EB830305EB4303521CED -:103E700023440B2AB3D3E1E700200B2ADED270BD26 -:103E8000FDF72EBA30B593B030216846FCF7ECF957 -:103E900014210CA8FCF7E8F91C480025016841F042 -:103EA00080510160006800F080501190184801684E -:103EB00041F4404101600068022400F44040119048 -:103EC00001200090000401908001CDE906401920F6 -:103ED0000890C020CDE9090404200B906846FEF745 -:103EE00091F908B172B6FEE70CA90F2081E8310004 -:103EF0004FF48050CDE90F0503210CA8FEF706F81A -:103F0000002801D072B6FEE713B030BD4038024041 -:103F1000007000400248016841F470010160704780 -:103F200088ED00E0F0B50268204B214C9F03214D45 -:103F3000214E984207D0B84205D0A04203D0A842F3 -:103F400001D0B04204D122F0700C4A6842EA0C025F -:103F5000984210D0B8420ED0A0420CD0A8420AD04D -:103F6000B04208D0154CA04205D0154CA04202D05A -:103F7000144CA04203D122F44074CA6822434C6915 -:103F800022F08002224302608A68C2620A6882626A -:103F9000984201D109690163012141610169C907A1 -:103FA00003D0016921F001010161F0BD0000014071 -:103FB0000004004000080040000C004000400140A8 -:103FC000004401400048014010B501F01F030121E9 -:103FD000046A99408C430462016A9A401143016269 -:103FE00010BD000030B5036A026A22F001020262CD -:103FF0004268846924F073050C682C4323F00205A1 -:104000008B682B430A4DA8420BD123F00805CB68DF -:1040100022F440722B434D6923F0040315438A694F -:104020002A434260846149684163036230BD0000F5 -:104030000000014030B5026A036A23F010030362F6 -:10404000436884690D6824F4E64444EA05248D68D5 -:1040500022F0200242EA05120B4DA8420ED1CD6893 -:1040600022F0800242EA05124D6923F4406343EADC -:1040700085038D6922F0400243EA85034360846131 -:1040800049688163026230BD0000014030B5036AB7 -:10409000026A22F4807202624268C46923F40073E7 -:1040A00024F073050C682C438D6843EA05230C4DFE -:1040B000A8420ED1CD6823F4006343EA05234D697D -:1040C00022F4405242EA05128D6923F4806342EAE9 -:1040D00005124260C4614968C163036230BD0000DB -:1040E0000000014030B5046A026A22F48052026284 -:1040F0004268C3690D6823F4E64343EA05238D68EB -:1041000024F4005444EA0534064DA84204D14D6914 -:1041100022F4804242EA85124260C3614968016428 -:10412000046230BD000001402DE9F0410C46D0F89A -:10413000D412D0F8C82200EB8101D1F8C01229B303 -:1041400004F00F0606EB860300EB83050027AB693E -:104150004BB106EBC60602EB8602D269B3FBF2F660 -:1041600002FB1632A2B1C1F81472D0F8D42200EBCF -:104170008200D0F8C40203692BB1D1F808022246AC -:1041800001F5047198470020BDE8F0810320FBE7AA -:1041900000231A462146AF6100F011FEF3E770B527 -:1041A0000546D0F8D40205EB8000D0F8C04294B1A7 -:1041B000284600F0DAFCC4F80C02D5F8D412D4F882 -:1041C000040205EB8101D1F8C412CA6804F5037139 -:1041D0009047002070BD032070BD000070B5224DD7 -:1041E0000446297800F0FCFB2878002600F00F0038 -:1041F00000EB800004EB800086846978204600F0A4 -:10420000EFFB687800F00F0000EB800004EB80000B -:10421000A0F86461A978204600F0E2FBA87800F0DD -:104220000F0000EB800004EB80008684C684D4F885 -:10423000D40204EB8000D0F8C01299B1D0F8C402C7 -:1042400040688047D4F8D40204EB8000D0F8C00264 -:1042500000F0E6FFD4F8D40204EB8000C0F8C0629E -:10426000C4F8BC62002070BD9400002010B5D0F8E6 -:10427000D41200EB8100D0F8C04284B1D0F8C4124F -:1042800059B194F80002FF2807D08B6894F80122F6 -:1042900021469847FF2084F80002002010BD03202B -:1042A00010BD00000A2101800048704798000020DE -:1042B00070B5064682210C4800F015FB0546012129 -:1042C000094800F010FB04468121074800F00BFB71 -:1042D0000DB11021A971402104B1A18000B18180EC -:1042E00043203080004870BDA400002070B5064611 -:1042F00082210D4800F0F7FA054601210A4800F036 -:10430000F2FA04468121084800F0EDFA0DB11021BF -:10431000A9714FF4007104B1A18000B181804320E4 -:104320003080014870BD0000A400002070B5064632 -:1043300082210C4800F0D7FA05460121094800F017 -:10434000D2FA04468121074800F0CDFA0DB11021C0 -:10435000A971402104B1A18000B181804320308047 -:10436000004870BDA40000202DE9F04704464FF43A -:104370000775284600F056FF06004FF0000863D08E -:104380002946FBF771FFD4F8D4023C4D04EB8000C2 -:104390004FF01009C0F8C062C4F8BC62207C4FF432 -:1043A000007A0127F0B3402302222978204600F04A -:1043B00048FC2878402300F00F0000EB800004EB5D -:1043C0008000878402226978204600F03AFC6878F1 -:1043D000082300F00F0000EB800004EB80000322B4 -:1043E000A0F86471A978204601F00F0101EB81016A -:1043F00004EB8101A1F82690A97800F022FCA878AE -:1044000000F00F0000EB800004EB80008784C6F80A -:104410000482D4F8D402474604EB8000D0F8C402EA -:10442000006800E018E006F50176804737617761A3 -:1044300032687AB1207CF8B140236978204600F0D8 -:104440000CFC0020BDE8F087D4F8D41204EB810105 -:10445000C1F8C0820220F5E753460222297820469F -:1044600000F0EFFB2878534600F00F0000EB8000CF -:1044700004EB80008784A5E75346DEE79400002024 -:1044800010B5D0F8D41200EB8101D1F8C01259B1A7 -:10449000027C084C002AD1F8042207D0402361781E -:1044A00000F0DBFB002010BD032010BD4FF40073B3 -:1044B000F5E700009400002039B1D0F8D42200EBD9 -:1044C0008200C0F8C4120020704703207047D0F863 -:1044D000D42200EB8200D0F8C00218B1C0F8041258 -:1044E0000020704703207047D0F8D43200EB8300DF -:1044F000D0F8C00228B1C0F81022C0F8081200207D -:104500007047032070472DE9FC410646D0F8D402DD -:104510000C4606EB80000021D0F8C0728DF8001028 -:10452000ADF804100D4637B1217811F060022FD09C -:10453000202A4BD102E00320BDE8FC81E288F2B1E1 -:1045400009060DD5D0F8C40263783946D0F808C002 -:104550001846E047E288072A00D9072239462DE0AD -:10456000607887F80002E088402800D34020C2B27B -:1045700087F801223946304600F081F82BE0D0F868 -:10458000C40263780022866821461846B04722E0BC -:10459000607830B101281ED00A2809D00B2815D127 -:1045A00010E096F89C02032810D1022201A905E030 -:1045B00096F89C02032809D101226946304600F092 -:1045C00078F808E096F89C02032804D0214630468B -:1045D00000F04AF803252846AEE7000010B5D0F8F1 -:1045E000D41200EB8101D1F8C02201211AB1D2F816 -:1045F000143213B116E0032010BD0121C2F81412C9 -:104600000949D2F81032097801F00F0404EB840450 -:1046100000EB8404A361D2F81032D2F8082200F033 -:10462000CEFB0021084610BD9400002010B5D0F844 -:10463000B82200245268904700B10324204610BDE0 -:104640000020704700207047134610B50A4600212D -:1046500000F003FB002010BD134610B50A460021F0 -:1046600000F0ADFB002010BD10B50446802100F025 -:104670007EFB2046BDE81040002100F078BB10B55D -:104680000323C0F89432C0F858211346C0F85C21C7 -:104690000A46002100F0E1FA002010BD10B5052106 -:1046A000C0F8941200231A46194600F0D6FA0020EA -:1046B00010BD10B50223C0F8943282611346C26166 -:1046C0000A46002100F07BFB002010BD10B504213C -:1046D000C0F8941200231A46194600F070FB00201F -:1046E00010BD10B5044600F054FB012084F89C0274 -:1046F000D4F8B80218B142682179204690470020CA -:10470000C4F8C402C4F8B402C4F8D0022046BDE81C -:10471000104000F010BA000010B50A46024903A08C -:1047200000F00FF9004810BD100A00204344432058 -:10473000436F6E666967000012200880004870476A -:104740004800002010B50A46024903A000F0F9F81D -:10475000004810BD100A002043444320496E746590 -:10476000726661636500000004200880004870479D -:104770004400002010B50A46024903A000F0E1F809 -:10478000004810BD100A002053544D6963726F65D4 -:104790006C656374726F6E696373000010B50A46CE -:1047A000024903A000F0CDF8004810BD100A002017 -:1047B00053544D3332205669727475616C20436FC7 -:1047C0006D506F727400000010B51A2008800A48FE -:1047D0000168001D0468001D0068081809D008223F -:1047E0000649FEF7FFFB0549042210312046FEF77B -:1047F000F9FB0248801E10BD107AFF1F5E000020EA -:10480000F8B504460020ADF8000048880D46010ABE -:1048100008295FD2DFE801F05E0409175E5E3C45BF -:10482000D4F8B412207C0A6819E0207C0226002803 -:10483000D4F8B80205D0C16A684688470146467078 -:1048400039E0816AF8E7C0B2062843D2DFE800F019 -:10485000030A1014181CD4F8B402426805E0694633 -:1048600090471CE0D4F8B402826892B3207CF6E74B -:10487000D4F8B402C268F8E7D4F8B4020269F4E7E5 -:10488000D4F8B4024269F0E7D4F8B4028269ECE7E4 -:10489000207CF0B9D4F8B802416B684688470146DD -:1048A00009E0207CA8B9D4F8B802016B68468847B3 -:1048B000014607204870EA888AB1BDF8000040B17F -:1048C000824200D90246ADF800202046FFF7F1FEF3 -:1048D000F8BDFFE729462046FFF7C6FEF8E7204669 -:1048E000FFF7F4FEF4E778B50E464288017800251C -:1048F00004468A4212D9ADF800100AE0694600F079 -:1049000019F84178052904D181780546B14205D0CE -:1049100000256188BDF800209142EFD8284678BD77 -:104920000146002002E0401CC0B2491C0A78002A5F -:10493000F9D170470A8803781A440A80017808443C -:10494000704770B516460D46002820D00446FFF784 -:10495000E7FF022101EB40014FF40070814204D8CF -:104960002046FFF7DDFF4000801C30803078287043 -:10497000032068700220002206E02954401CC0B2C7 -:104980002A54401CC0B2641C21780029F5D170BDA6 -:1049900001004FF0000004D0012901D0022901D00C -:1049A000032070470120704778B10023C0F8B83267 -:1049B000C0F8C432C0F8D03209B1C0F8B412012135 -:1049C00080F89C12027000F0D5B80320704710B533 -:1049D000D0F8C802FCF7B9FDBDE81040FFF7D8BF1A -:1049E00010B5D0F8C802FCF78BFDBDE81040FFF70A -:1049F000CFBF2DE9F04117460446002521B194F8B8 -:104A00009C02032842D04CE0D4F8941204F1140024 -:104A1000022935D1D0E902639E4206D9F21A82609A -:104A200039462046FFF718FE0FE0B34214D1406824 -:104A3000984211D3D4F8981288420DD20022114620 -:104A40002046FFF709FEC4F8985200231A4619467B -:104A5000204600F002F913E094F89C02032808D1E4 -:104A6000D4F8B802C16821B1C4F8D452C168204654 -:104A700088478021204600F07AF92046FFF70EFE95 -:104A800094F8A00268B184F8A0520AE0D4F8B80201 -:104A9000426932B1C4F8D452426920469047002896 -:104AA00000D10020BDE8F08170B513460446002215 -:104AB00021B194F89C02032830D03AE0D4F8941243 -:104AC00004F5AA70032934D1D0E902518D420AD9E4 -:104AD0006A1A82600846824200D30246194620467E -:104AE000FFF7B2FD25E094F8AA0210F01F0003D0F2 -:104AF000012802D0022800D0002294F89C0203284A -:104B000008D1D4F8B802016921B1C4F8D4220169EE -:104B1000204688472046FFF7D9FD0AE0D4F8B802BE -:104B2000836933B1C4F8D4228269204690470028B3 -:104B300000D1002070BD10B5D0F8C802FCF7BAFC57 -:104B4000BDE81040FFF724BF0020704710B50024D7 -:104B5000012180F89C12D0F8B82222B15268017964 -:104B6000904700B10324204610BDD0F8C802FCF7DE -:104B700019BD000010B5017839BB15490222C1F8F2 -:104B8000E004C0F8C8124FF0A0400860042008718B -:104B9000CA71002088714A728872C872087388735B -:104BA000C8730846FDF75CF808B1FBF7C7FC802125 -:104BB0000748FCF742FC402200210548FCF741FC75 -:104BC000802201210248FCF73CFC002010BD0000BF -:104BD000302600200A0601F07F01D0F8C80201EB60 -:104BE000C10100EB810001D5807D704790F856022D -:104BF000704710B5D0F8D42200EB8202D2F8B82268 -:104C000022B190F89C32032B02D004E0032010BDA7 -:104C1000126A02B19047002010BD10B5D0F8D4221E -:104C200000EB8202D2F8B82222B190F89C32032B1A -:104C300002D004E0032010BD526A02B19047002068 -:104C400010BD10B51C461346D0F8C8022246FCF72A -:104C5000B2FCBDE81040FFF79BBE10B5D0F8C8020B -:104C6000FCF7DAFCBDE81040FFF792BE2DE9F041F9 -:104C700000260125044680F89C52C4F894626660C0 -:104C8000C4F8A46280F8A062D0F8B80230B14268DB -:104C900022B100212046904700B103260022402384 -:104CA00011462046FFF7CDFF4027A4F864513B464C -:104CB000002280212046C4F86071FFF7C2FFA5845E -:104CC00030462762BDE8F08190F89C12042903D198 -:104CD00090F89D1280F89C120020704710B590F853 -:104CE0009C12032905D1D0F8B81211B1C96901B1DC -:104CF0008847002010BD01740020704710B5D0F81F -:104D0000C802FDF78AF8BDE81040FFF741BE70B554 -:104D1000044600F2AA20054600F05AF80120C4F823 -:104D20009402B4F8B002C4F8980294F8AA0210F001 -:104D30001F010AD001290ED0022912D000F08001F3 -:104D40002046BDE8704000F012B829462046BDE874 -:104D5000704000F0D9B829462046BDE8704000F008 -:104D600019BA29462046BDE8704000F063B910B575 -:104D7000D0F8C802FCF76CFCBDE81040FFF708BE95 -:104D800010B5D0F8C802FDF762F8BDE81040FFF793 -:104D9000FFBD10B5D0F8C802FDF77AF8BDE81040A5 -:104DA000FFF7F6BD90F89C12042903D090F89C12EE -:104DB00080F89D12042180F89C120020704710B5E5 -:104DC000D0F8C802FCF77DFCBDE81040FFF7E0BD5D -:104DD00070B5054611F8010B2870087868704C1CF6 -:104DE0002046FEF7EAFF6880A41C2046FEF7E5FF98 -:104DF000A880A01CFEF7E1FFE88070BD38B504462E -:104E00000020ADF80000A1B1C4F8B812D4F8D40263 -:104E100004EB8000D0F8B802C16A19B1684688472F -:104E2000C4F8D002D4F8D802401CC4F8D80200203C -:104E300038BD032038BD02460020D2F8B832002B1E -:104E400002D01B6810461847704700002DE9F0415A -:104E500088462B4E8978002504463170012906D9F1 -:104E600041462046FFF700FC0320BDE8F08194F89E -:104E70009C02022702280CD003281DD04146204660 -:104E8000FFF7F2FB31782046FFF7D0FB03252846D9 -:104E9000EBE789B320466160FFF7CDFF050004D042 -:104EA00041462046FFF7E0FB1DE02046FFF70EFCE1 -:104EB000032084F89C02EAE7C1B1606888421BD0F5 -:104EC000C1B22046FFF7B2FB317820466160FFF7A0 -:104ED000B2FF050010D041462046FFF7C5FB2179FF -:104EE0002046FFF7A3FB84F89C72D0E784F89C72FD -:104EF00020466160FFF79AFB2046FFF7E7FBC6E715 -:104F000090000020FFF73CBF2DE9F0410A78002512 -:104F100012F060020CD0202A01D0402A7DD1D0F8B6 -:104F2000D42200EB8202D2F8B8229268904731E096 -:104F30004B78002201260A2B6FD2DFE803F041668E -:104F40006E586E08056E2D29FFF75AFC67E004467F -:104F50008888D8B9C888C8B94888802816D200F08F -:104F60007F0794F89C02032810D084F89E7239467B -:104F70002046FFF7C3FE2046FFF7A8FB1FB1022023 -:104F800084F89C024BE084F89C6248E0204644E0B0 -:104F9000FFF75CFF054642E0CB88012B3DD190F83E -:104FA0009C32012B04D0022B02D0032B35D104E01C -:104FB0008260012200F1080116E00122011D13E0C8 -:104FC00090F89C22012A03D0022A01D0032A24D17E -:104FD000CA88022A21D1C660D0F8A41209B10321DF -:104FE000C160022200F10C01FFF763FB17E04A8861 -:104FF000012A02D0022A03D00FE0C0F8A46216E012 -:105000008988090A80F8A01211E090F89C32012BDF -:1050100008D0022B06D0032B04D0FFF725FB28462F -:10502000BDE8F08149880129F9D1C0F8A422FFF731 -:105030004DFBF4E72DE9F041054608780C790E4662 -:105040004FF0000810F060000BD0202801D040285D -:105050006AD121462846FFF7F3FAFF2800D0D8B3DB -:1050600095E07078C8B3012824D003285CD195F866 -:105070009C02022802D0032856D10CE0002C53D009 -:10508000802C51D021462846FFF771FE802128460A -:10509000FFF76DFE7BE0708840B93CB1802C05D0F5 -:1050A000C88818B921462846FFF761FE2846FFF751 -:1050B0000DFB6CE095F89C020228DFD0032863D139 -:1050C000708880BB600603D021462846FFF77FFC2E -:1050D0002846FFF7FBFABCE700E00AE0C5F8D40277 -:1050E000D5F8B8028268F2B131462846904780462A -:1050F0004DE095F89C020027022802D0032843D1F6 -:1051000013E00CB1802C3FD1200604F07F0000EBAF -:10511000800005EB800101D5143101E001F5AA7191 -:1051200002220F602CE032E02EE0200604F00F0097 -:1051300000EB800005EB800009D5808C20B304F0E3 -:105140007F0000EB800005EB800614360AE0B0F823 -:105150006401C8B104F07F0000EB800005EB80061D -:1051600006F5AA764CB1802C07D021462846FFF7D9 -:1051700031FD10B10120306000E03760022231467D -:105180002846FFF796FA02E02846FFF76DFA4046F8 -:10519000BDE8F08170B50546087800240E4610F091 -:1051A000600003D0202801D0402827D195F89C0228 -:1051B000012803D0022801D003281FD1B088C1B232 -:1051C00001291AD8C1B22846FFF73CFAFF280CD0B3 -:1051D00058B9D5F8B8128A683AB1C5F8D4028A68C5 -:1051E000314628469047044600E00324F0882043D7 -:1051F00007D12846FFF76AFA03E031462846FFF751 -:1052000033FA204670BD10B50446FFF7C2FDD4F84E -:10521000B80218B14268217920469047002010BD9D -:1052200070470000004870471024002070B50A78CD -:10523000012302F00F054E78AB401B4CD0F81C58F0 -:10524000012E17D045EA0343C0F81C3800EB42108A -:10525000D0F8002B12040BD4D0F8002B0B8909795D -:10526000C3F30A031A4344EA81410A43C0F8002BFE -:10527000002070BD9BB21D43C0F81C5800EB4210CB -:10528000D0F800391B04F3D4D0F800390D8909791E -:10529000C5F30A0589042B4341EA82510B4323439A -:1052A000C0F80039E4E7000000800010D0F80019D1 -:1052B0006FF30A01C0F80019D0F8041841F48071A6 -:1052C000C0F804180020704770B50D460446C2F3BC -:1052D000072104981E4601291BD0E06840F04000D9 -:1052E000E060204600F032F8C6F307210029A16BE8 -:1052F00026D021F48031A163C5F30741012907D1EC -:10530000A16841F00601A160A16841F02001A160FF -:1053100070BDA16B21F48031A163E1680A4A11409C -:10532000E160E16821F44011E160C0B2012803D1DD -:10533000E06840F48010E060204600F007F8DBE70A -:1053400041F48031D7E70000BFFFBDFF08B5002161 -:105350004FF070620091009B5B1C009393420CD84D -:105360000369002BF7DA0091016941F00101016145 -:105370000099491C0091914201D9032008BD01699F -:10538000C907F5D1002008BD30B54C780A78012353 -:1053900000EB4212012C2CD0D2F8004B002C0BDA7F -:1053A000D2F8004B44F00064C2F8004BD2F8004B36 -:1053B00044F08044C2F8004BD0F83C580C7804F01C -:1053C0000F0403FA04F425EA0444C0F83C48D0F87A -:1053D0001C48097801F00F018B4024EA0341C0F812 -:1053E0001C18D2F8000B19490840C2F8000B002025 -:1053F00030BDD2F80049002C0BDAD2F8004944F055 -:105400000064C2F80049D2F8004944F08044C2F870 -:105410000049D0F83C480D7805F00F0503FA05F572 -:10542000ADB2AC43C0F83C48D0F81C48097801F054 -:105430000F018B4099B28C43C0F81C48D2F8000988 -:1054400003490840C2F80009D1E700000078F3EFF3 -:10545000007833ECD0F8001E21F00301C0F8001EE4 -:10546000D0F8041821F00201C0F804180020704799 -:10547000D0F8001E21F00301C0F8001ED0F8041877 -:1054800041F00201C0F80418002070472DE9F04FE8 -:1054900000250E46044617462846294604EB80029E -:1054A000C2F80411401C0F28F8D3C3F307405FEA89 -:1054B0000009204616D0806B20F40012A263A06B76 -:1054C00040F40022A263084688462146C4F8000E34 -:1054D000C7F30720012817D00846D1F8001841F07B -:1054E000030118E0D0F8040840F00202C4F80428D0 -:1054F000A06B40F40012A263A06B20F40022A26310 -:10550000A06B20F48022DDE7300E0846D1F80018A9 -:1055100001D041F00101C0F80018102100F047FC53 -:1055200000B10125204600F026FC00B101254046CF -:10553000C4F81088C4F81488C4F81C8800214FF0FF -:10554000006B4FF0904E4FF67F3AF2B215E000BF7D -:1055500004EB4113D3F800C9BCF1000F06DA11B116 -:10556000C3F800E904E0C4F800B901E0C3F8000999 -:10557000C3F81009C3F808A9491C8A42E8D80021D9 -:1055800015E000BF04EB4113D3F800CBBCF1000FD2 -:1055900006DA11B1C3F800EB04E0C4F800BB01E087 -:1055A000C3F8000BC3F8100BC3F808AB491C8A42C0 -:1055B000E8D8D4F8101821F48072C4F81028A0613B -:1055C0006FF080406061C6F3074018B9A06940F0F1 -:1055D0001000A061A0690A490843A061C7F3074011 -:1055E00018B1A06940F00800A061B9F1010F03D122 -:1055F000A06904490843A0612846BDE8F08F000077 -:1056000000383C8004000040816821F00101816085 -:105610000020704770B542A292B007CA06AB83E87B -:10562000070042A000F024FC4FA000F021FC564DE2 -:105630002846FAF7F3FF08B154A068E05EA000F036 -:1056400017FC62A000F014FC674800F0AFFD041ED8 -:105650004EDD66A000F00CFC21462846FAF7E4FE79 -:1056600005466D48029003A94FF05A3081E8310099 -:1056700002AE0320FAF7F0FF68480C90042231468E -:105680000CA8FBF71BF866A000F0F2FB6EA000F080 -:10569000EFFB784800F0ECFB214606A8FDF782FC02 -:1056A00075A000F0E5FB06A800F0E2FB75A000F095 -:1056B000DFFB77A000F0DCFB09AC142277A10CA87B -:1056C000FAF7B9FD00200CA905F00F02C0F107039D -:1056D0008A5C2D09401CE2540828F5DB002020726A -:1056E00009A800F0C5FB72A000F0C2FB76A00EE096 -:1056F0000320FAF7B1FF7BA000F0BAFB601C05D0D5 -:10570000A01C08D0E41C08D07BA000E082A000F020 -:10571000AFFB12B070BD90A0F9E796A0F7E70000CC -:1057200020202020202020202020000057616974A4 -:10573000696E6720666F72207468652066696C65A3 -:1057400020746F2062652073656E74202E2E2E20CB -:105750002870726573732027612720746F2061623F -:105760006F7274290A0D000045726173696E6720BB -:105770004170706C69636174696F6E20417265611C -:105780002E2E2E0D0A000000000001084572726FD7 -:10579000723A204661696C656420746F206572619D -:1057A0007365206170706C69636174696F6E2061EC -:1057B000726561210D0A0000457261736520436FB7 -:1057C0006D706C6574652E0D0A0000005374617273 -:1057D00074696E6720596D6F64656D2052656365ED -:1057E0006976650A0D000000340200200A0A0D20C7 -:1057F00046696C6520726563657074696F6E2063BD -:105800006F6D706C6574652E205665726966796976 -:105810006E672E2E2E0A0D00EFBEADDE00C0000812 -:10582000566572696669636174696F6E20616E6442 -:1058300020466C61672053657420737563636573DC -:105840007366756C210D0A002D2D2D2D2D2D2D2DFE -:105850002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D78 -:105860002D2D2D2D2D2D2D2D0D0A204E616D653ADE -:1058700020000000340600200A0D2053697A653AA2 -:10588000200000002042797465730D0A00000000BA -:105890002043524333323A203078000030313233E3 -:1058A000343536373839414243444546000000001C -:1058B0000D0A2D2D2D2D2D2D2D2D2D2D2D2D2D2D5B -:1058C0002D2D2D2D2D0A0000506C65617365207201 -:1058D00065626F6F742074686520646576696365BE -:1058E0002E0D0A000A0D55706772616465206661AD -:1058F000696C6564210D0A000A0D4661696C656476 -:1059000020746F2072656365697665207468652010 -:1059100066696C65210A0D000A0A0D5468652069E4 -:105920006D6167652073697A6520697320686967AE -:10593000686572207468616E2074686520616C6CA3 -:105940006F776564207370616365206D656D6F723C -:1059500079210A0D000000000A0A0D566572696679 -:1059600069636174696F6E206661696C6564210AA0 -:105970000D0000000D0A0A41626F727465642062B6 -:105980007920757365722E0A0D00000010B5036C46 -:10599000134CA34203D9D0F8003B002B1EDB00239D -:1059A000C0F8103BD0F8103B43F40023C0F8103B84 -:1059B000D0F8103B43F01803C0F8103BD0F8103B70 -:1059C00043F0C043C0F8103B012907D1C0F8142BA5 -:1059D000D0F8001B41F08021C0F8001B002010BD52 -:1059E0000A30544F4A780B78012A00EB43100BD051 -:1059F000D0F8002B22F40012C0F8002B09790329FB -:105A000014D0022912D017E0D0F8002922F4001295 -:105A1000C0F800290979032901D002290CD1D0F856 -:105A2000001941F08051C0F8001905E0D0F8001BC2 -:105A300041F08051C0F8001B002070470A784B7875 -:105A4000D1B200EB4110012B12D0D0F8001B00297D -:105A500006DB2AB1D0F8001B21F08041C0F8001B02 -:105A6000D0F8001B41F40011C0F8001B0020704763 -:105A7000D0F80019002906DB2AB1D0F8001921F06E -:105A80008041C0F80019D0F8001941F40011C0F8A5 -:105A90000019EBE7F8B50C784F788B4DE3B26FF057 -:105AA000604600EB4313012F29D0D3F8107B6FF32E -:105AB0001207C3F8107BD3F8107B2F40C3F8107B7C -:105AC000002C7DD00D69002D7BD08C6825446D1E87 -:105AD000B5FBF4F5ADB26C430C62D3F8104B06EA9B -:105AE000C5452C43C3F8104BD3F8104B0D6AC5F3D2 -:105AF00012052C43C3F8104B012A70D0CBE00F697C -:105B0000EFB1D3F810796FF31207C3F81079D3F817 -:105B100010792F40C3F810790CB30F698D682F44AA -:105B20007F1EB7FBF5F5D3F81079ADB206EAC5468E -:105B30003743C3F810790E79012E1CD02AE0D3F830 -:105B400010692E40C3F81069D3F8105945F40025A8 -:105B5000C3F81059D3F810596FF3120520E00E69FD -:105B60008D68AE4200D90D61D0F8105945F4002679 -:105B7000C0F810690EE0D3F8106926F0C046C3F8EB -:105B80001069D3F810694FF0C04707EA45752E43F6 -:105B9000C3F81069D3F810590E69C6F312063543DD -:105BA000C3F81059012A1BD000EB4413D3F8004965 -:105BB00044F00444C3F800490C79012C31D001E0D1 -:105BC00044E057E00A695AB3D0F83428097801F064 -:105BD0000F03012199400A43C0F8342871E056E0D0 -:105BE000CA691AB100EB4413C3F8142909790129D1 -:105BF0000ED1D0F80818C90500EB4411D1F80029DE -:105C000002D442F0005201E042F08052C1F8002973 -:105C100000EB4410D0F8001941F00441C0F800191D -:105C20004FE0D0F80848E405D3F8004902D444F026 -:105C3000005401E044F08054C3F8004900920A8AFD -:105C400093B20A78C96800F04DFA3AE00C690CB1D9 -:105C50008C680C618C680C62D0F8105BC4F3120481 -:105C60002543C0F8105BD0F8104B44F40024C0F872 -:105C7000104B41E7D3F8104B8D68C5F312052C4348 -:105C8000C3F8104BD3F8104B44F4002432E7CA6831 -:105C90000AB1C3F8142B097901290CD1D0F80808EE -:105CA000C005D3F8000B02D440F0005001E040F0F2 -:105CB0008050C3F8000BD3F8000B40F00440C3F849 -:105CC000000B0020F8BD0000FFFF07E038B5002200 -:105CD000009213464D780A7842F2107400EB42129B -:105CE000012D19D0D2F8005B002D3CDAD2F8005B10 -:105CF00045F00065C2F8005B0A7800EB4212D2F86A -:105D0000005B45F08045C2F8005B009A521C00928F -:105D1000A24221D9012326E0D2F80059002D22DA2F -:105D2000D2F8005945F00065C2F800590A7800EB36 -:105D30004212D2F8005945F08045C2F80059009A45 -:105D4000521C0092A242E5D80A7800EB4212D2F827 -:105D50000029002AF3DB06E00A7800EB4212D2F8B1 -:105D6000002B002AD1DB184638BD816841F00101C3 -:105D700081600020704708B500214FF070620091EB -:105D8000009B5B1C009393420AD80369002BF7DA4F -:105D90000091102101610099491C0091914201D9A3 -:105DA000032008BD0169C906F5D4002008BD18B557 -:105DB00000224FF070630092009C641C00949C428F -:105DC0000CD80469002CF7DA0092202242EA8111F3 -:105DD00001610099491C0091994201D9032018BD25 -:105DE00001698906F5D4002018BDD0F8080810F024 -:105DF000060004D0022803D0062801D00F207047E7 -:105E000002207047406900F00100704709490A8884 -:105E100009490B889A420AD0084A0B88D25C027062 -:105E20000888401CC0F30A00088001207047002049 -:105E3000704700007600002078000020100C002041 -:105E4000094991F89C22032A0CD1D1F8BC1200BF59 -:105E5000D1F81422002AFBD104490870012103481B -:105E6000FAF7CCBA70470000340700201800002071 -:105E700070B50B4D064695F89C0203280ED13046AE -:105E8000FAF7FDF9044603E095F89C02032805D1D2 -:105E9000A1B23046FAF7B2FA0128F5D070BD000081 -:105EA00034070020D0F81818D0F81C08084080B239 -:105EB0007047D0F81818D0F81C080840000C70473C -:105EC00010B5D0F81038D0F8342801F00F0400EBEA -:105ED0004110E24002F00102D0F8080943EAC21280 -:105EE000104010BD00EB4111D1F8081BD0F8140888 -:105EF00008407047416980690840704730B50346E3 -:105F00000846940802F00301002203F5805303E0E1 -:105F10001D6840F8045B521CA242F9D300290BD043 -:105F20001C680022D50024FA05F3491E521C0904FE -:105F300000F8013B090CF5D130BD70B50446C068CE -:105F4000002520F0C040E060012901D079B120E0B7 -:105F5000E06840F00050E0600A20FAF719FD60693F -:105F60000A3510F0010F10D1C82DF5D30DE0E0680F -:105F700040F08040E0600A20FAF70AFD60690A35C7 -:105F800010F0010F01D0C82DF5D3C82D01D000208D -:105F900070BD012070BDD0F8002822F4FE62C0F868 -:105FA0000028D0F800284FF4FE6303EA01110A43E9 -:105FB000C0F8002800207047022A3ED1264A274B0D -:105FC0000A449A4201D20F2138E0254A254B0A445F -:105FD0009A4201D20E2131E0234A244B0A449A42CC -:105FE00001D20D212AE0224A224B0A449A4201D2D0 -:105FF0000C2123E0204A214B0A449A4201D20B2172 -:106000001CE01F4A1F4B0A449A4201D20A2115E0A4 -:106010001D4A1E4B0A449A420FD31D4A1D4B0A4487 -:106020009A4201D2082109E01B4A11441B4A9142BD -:1060300001D2072102E0062100E00921C26822F412 -:106040007052C260C2684FF4705303EA81210A4360 -:10605000C260002070470000405327FF00350C004D -:10606000401E1BFF40420F0000DC0BFF804F120060 -:10607000808CF9FE20D6130060B6E5FE60E31600C2 -:1060800000D3CEFE40771B00C05BB3FEC091210061 -:1060900000CA91FE20753800E05459FEE09C410092 -:1060A00010B5044600214FF67F3000BF04EB4112CB -:1060B000C2F80809C2F8080B491C0F29F6D30020C2 -:1060C000C4F81008C4F81408C4F81C082046FFF7E8 -:1060D00052FE002805D12046BDE810401021FFF7F0 -:1060E00066BE10BD10B5029C74B9DB1C9C0800EBA9 -:1060F0000230002300F5805004E000BF51F8042B6B -:1061000002605B1CA342F9D3002010BD30B587B0FC -:1061100014216846FAF7A8F80E480021026842F0F8 -:106120000102026000684FF4805400F00100009406 -:1061300005900120CDE90101074D039169462846EC -:10614000FAF73CFD002221462846FAF72CFE07B05C -:1061500030BD0000303802400000024010B5104849 -:10616000FFF751F80E48FEF7BCFA0E4C206840F0DD -:10617000800020600A20FAF70BFC206820F08000E5 -:10618000206008482030016821F080010160044847 -:10619000D0F8C802FBF7CAFDBDE81040FFF7B6BF54 -:1061A0003407002014380240FEE700002DE9F04FCC -:1061B000ADF22C4D4FF0000ADFF864B10446CDF883 -:1061C00008A45546D0464FF480174FF0FF39CDF85C -:1061D00010B4CDF814A400263A460DF20C416846DE -:1061E000FDF70CFD98B1012875D0B8F1000F00DD66 -:1061F0006D1C052D71DD1820FFF722FE5FF01800E1 -:10620000FFF71EFE00200DF22C4DBDE8F08FDDF8EB -:106210000C2400254A4507D042B19DF80100F1B297 -:1062200088420BD0152078E00620E9E70620FFF72A -:1062300007FEDDF814040028CDD05AE0BEB1204698 -:106240000DF10301F9F7F7FFDDF80C042146C0F367 -:106250008D020DF58260FAF731FAD8B31820FFF7F6 -:10626000EFFD1820FFF7ECFD6FF00100CBE79DF884 -:10627000030088B300212B4A0DF1030002E05354C0 -:10628000401C491C03780BB1FF29F8DD02F801A07E -:1062900000210DF58362401C02E05354401C491C50 -:1062A0000378202B01D01029F7DB02F801A00DF5AF -:1062B00081611046FDF786FDDDF808046FF4E021EA -:1062C000C8420BD91820FFF7BBFD1820FFF7B8FD17 -:1062D000484698E710E016E008E01DE05846FAF757 -:1062E0009DF90620FFF7ACFD432006E00620FFF7EE -:1062F000A7FDDDF8080486E70620FFF7A1FD4FF0B3 -:106300000108761C68E71820FFF79AFD1820FFF7B0 -:1063100097FD6FF0020076E74320FFF791FD5BE702 -:1063200000000108340600200907090E002804DBDC -:1063300000F1E02080F80014704700F00F0000F139 -:10634000E02080F8141D704702E008C8121F08C141 -:10635000002AFAD170477047002001E001C1121FE6 -:10636000002AFBD17047000010B50420FCF747FA63 -:1063700006484FF47A710078B1FBF0F004490968DF -:10638000BDE81040B1FBF0F0FCF745BA0800002072 -:106390001400002070B5054600244FF47A7603E01F -:1063A000304600F004F8641CAC42F9D370BD70B5FF -:1063B0004FF0E02300215C6900EB40009A69450141 -:1063C00098699042FCD002D2A2EB000202E0A4EB5A -:1063D0000006324411440246A942F1D370BD0000C8 -:1063E00010B5FFF7BBFE4FF4FA70FAF7D1FAFBF7DE -:1063F00027FEFAF7A9FA4FF0E02100200861486172 -:10640000886172B605494868054A9060506009681D -:1064100081F30888BDE81040004700000000010833 -:106420001C0000200EB54B494FF000600860FAF7E1 -:106430005FFFFDF727FDFDF76DF8FDF7A9F8FDF704 -:10644000CBF8FDF785F8FDF717F9FDF751F8FFF7E1 -:106450008BFFFCF7E3FD08213F48FCF72BFBFCF723 -:1064600087FE0024F0231A46214620460094FCF7BC -:106470001DFE0A20FFF78EFF3220FCF753FF002598 -:10648000F9F7EFFF58B9FAF721F80546FAF71EF8C1 -:1064900028B132A0FFF7ECFC0020FAF731F8DFF862 -:1064A000DC9001214846FAF779FC18264FF6FF7870 -:1064B0004FF4FA7700B175B13846FFF76BFF012151 -:1064C0004846FAF76BFC08B1002D3FD0CDE90046F5 -:1064D0004346029427E02A4B04CB93E82300294B40 -:1064E0009A4202D1B0F15A3F26D027A0FFF7C0FC54 -:1064F000CDE90046454643462EA250214A2002944B -:10650000FCF7A8FFCDE900462B462CA280211820DD -:106510000294FCF79FFF4FF4FA60FAF739FACDE9DD -:1065200000462B4602942AA250214820FCF792FFF5 -:10653000FAF7BAF8F9F706FF2848F9F775FF854228 -:1065400004D127A0FFF794FCFFF74AFF3846FAF77B -:106550001FFAFBE708ED00E0CC010020656E7465D2 -:1065600072206669726D77617265207570646174FE -:1065700065206D6F64650D0A000000000000024098 -:1065800000C00008EFBEADDE4E6F20417070206687 -:106590006F756E642C20656E746572206669726D0D -:1065A0007761726520757064617465206D6F6465D4 -:1065B0000D0A00004E6F204170702100506C7A204F -:1065C000446F776E6C6F6164204150500000000092 -:1065D000426F6F746C6F616400000000000001087E -:1065E00056616C69642041505020666F756E642C52 -:1065F000206A756D70696E6720746F206170706CB1 -:1066000069636174696F6E2E2E2E0D0A0000000002 -:106610000000000000000000000000000000040472 -:10662000040404000004000014140A000000000028 -:106630000000000000000A0A1F0A0A1F0A0A0000E0 -:1066400000040E1505060C14150E040000001215AA -:106650000D152E2C2A1200000000040A0A3615150A -:1066600029160000020201000000000000000000E6 -:1066700010080804040404040808100002040408B4 -:10668000080808080404020000000004150E0E1596 -:106690000400000000000008083E08080000000098 -:1066A00000000000000000000202010000000000E5 -:1066B000003F00000000000000000000000000009B -:1066C000000200000020101008080404020201006B -:1066D00000000E1111111111110E0000000004062E -:1066E00004040404040E000000000E11110804024A -:1066F000011F000000000E11100C1010110E000000 -:106700000000080C0C0A091F081C000000001F01F3 -:10671000010F1110110E000000000C12010D1311D9 -:10672000110E000000001E100808040404040000FC -:1067300000000E11110E1111110E000000000E11BB -:1067400011191610090600000000000004000000E6 -:106750000004000000000000000400000004040029 -:1067600000001008040202040810000000000000ED -:106770003F003F0000000000000002040810100865 -:106780000402000000000E111108040400040000BF -:1067900000001C22292D2D1D221C000000000404D5 -:1067A0000C0A0A1E1233000000000F12120E121201 -:1067B000120F000000001E1101010101110E000066 -:1067C00000000F1212121212120F000000001F120E -:1067D0000A0E0A02121F000000001F120A0E0A020F -:1067E0000207000000001C1201013911120C000008 -:1067F00000003312121E12121233000000001F0498 -:1068000004040404041F000000003E0808080808EF -:1068100008080907000037120A060A12123700009A -:106820000000070202020202223F000000003B1BA0 -:106830001B1B15151535000000003B1216161A1A01 -:106840001217000000000E1111111111110E00009D -:1068500000000F12120E02020207000000000E11CB -:1068600011111117190E180000000F12120E0A1242 -:106870001237000000001E1101060810110F000061 -:1068800000001F1504040404040E0000000033126D -:1068900012121212120C000000003312120A0A0C1B -:1068A000040400000000151515150E0A0A0A000060 -:1068B00000001B0A0A04040A0A1B000000001B0A4D -:1068C0000A0A0404040E000000001F090804040260 -:1068D000121F00001C0404040404040404041C002B -:1068E0000002020404040808081010000E0808083A -:1068F0000808080808080E00040A0000000000004C -:106900000000000000000000000000000000003F48 -:106910000204000000000000000000000000000071 -:10692000000C121C123C000000030202020E1212A4 -:10693000120E000000000000001C1202120C0000E9 -:1069400000181010101C1212123C00000000000071 -:10695000000C121E021C000000182404041E040473 -:10696000041E000000000000003C120C021C221C4F -:1069700000030202020E121212370000000404008B -:1069800000060404040E000000080800000C0808BB -:106990000808080700030202021A0A060A13000088 -:1069A0000007040404040404041F000000000000A5 -:1069B000000F15151515000000000000000F121241 -:1069C0001237000000000000000C1212120C000030 -:1069D00000000000000F1212120E0207000000005B -:1069E000001C1212121C103800000000001B0602CE -:1069F0000207000000000000001E020C101E000034 -:106A000000000004041E0404041C00000000000038 -:106A1000001B1212123C000000000000001B0A0ABA -:106A200004040000000000000015150E0A0A000012 -:106A300000000000001B0A040A1B00000000000008 -:106A4000003312120C08040300000000001E0804AA -:106A5000041E000018080808080C08080808180098 -:106A600008080808080808080808080806040404B4 -:106A700004080404040406001609000000000000D5 -:106A80000000000000000000000000000000000006 -:106A900000000000000000080808080808080000BE -:106AA0001818000000486C241200000000000000CC -:106AB000000000000000002424247F1212127F1224 -:106AC000121200000000081C2A2A0A0C1828282A82 -:106AD0002A1C080800000022251515152A585454B0 -:106AE000542200000000000C1212120A762529110F -:106AF000916E000000060604030000000000000084 -:106B000000000000004020101008080808080810C5 -:106B10001020400000020408081010101010100887 -:106B2000080402000000000008086B1C1C6B080829 -:106B30000000000000000000080808087F0808089E -:106B4000080000000000000000000000000000003D -:106B5000060604030000000000000000FE00000024 -:106B60000000000000000000000000000000000025 -:106B70000606000000008040402020101008080495 -:106B800004020200000000182442424242424242F3 -:106B900024180000000000080E080808080808086B -:106BA000083E00000000003C424242202010080441 -:106BB000427E00000000003C42422018204040423B -:106BC000221C0000000000203028242422227E20E5 -:106BD000207800000000007E0202021A2640404297 -:106BE000221C0000000000382402021A2642424201 -:106BF000241800000000007E222210100808080857 -:106C0000080800000000003C42424224182442428E -:106C1000423C0000000000182442424264584040B8 -:106C2000241C0000000000000000181800000000F4 -:106C3000181800000000000000000008000000001C -:106C40000008080400000040201008040204081096 -:106C5000204000000000000000007F0000007F00D6 -:106C6000000000000000000204081020402010086E -:106C7000040200000000003C424246402010100088 -:106C8000181800000000001C225A555555552D4279 -:106C9000221C00000000000808181414243C2242A2 -:106CA00042E700000000001F2222221E2242424230 -:106CB000221F00000000007C42420101010101424C -:106CC000221C00000000001F224242424242424277 -:106CD000221F00000000003F4212121E1212024248 -:106CE000423F00000000003F4212121E1212020238 -:106CF000020700000000003C222201010171212254 -:106D0000221C0000000000E7424242427E42424212 -:106D100042E700000000003E0808080808080808CC -:106D2000083E00000000007C101010101010101021 -:106D30001010110F0000007722120A0E0A12122200 -:106D40002277000000000007020202020202020293 -:106D5000427F000000000077363636362A2A2A2A7B -:106D60002A6B0000000000E346464A4A5252526233 -:106D7000624700000000001C224141414141414165 -:106D8000221C00000000003F424242423E0202023A -:106D9000020700000000001C2241414141414D53C7 -:106DA000321C60000000003F4242423E121222228A -:106DB00042C700000000007C42420204182040420A -:106DC000423E00000000007F490808080808080843 -:106DD000081C0000000000E7424242424242424298 -:106DE000423C0000000000E7424222242414141810 -:106DF000080800000000006B4949494955553622F2 -:106E000022220000000000E742242418181824243D -:106E100042E7000000000077222214140808080846 -:106E2000081C00000000007E21201010080404420D -:106E3000423F000000780808080808080808080809 -:106E40000808780000000202040408080810102056 -:106E500020204040001E10101010101010101010B4 -:106E600010101E0000384400000000000000000068 -:106E70000000000000000000000000000000000012 -:106E8000000000FF000608000000000000000000F5 -:106E900000000000000000000000003C4278444276 -:106EA00042FC0000000000030202021A2642424295 -:106EB000261A000000000000000000384402020210 -:106EC00044380000000000604040407844424242A4 -:106ED00064D80000000000000000003C427E020276 -:106EE000423C0000000000F08808087E08080808FE -:106EF000083E0000000000000000007C22221C026E -:106F00003C42423C000000030202023A4642424236 -:106F100042E700000000000C0C00000E0808080802 -:106F2000083E000000000030300000382020202003 -:106F30002020221E0000000302020272120A161212 -:106F4000227700000000000E08080808080808085A -:106F5000083E0000000000000000007F9292929224 -:106F600092B70000000000000000003B4642424291 -:106F700042E70000000000000000003C42424242A4 -:106F8000423C0000000000000000001B264242427C -:106F9000221E020700000000000000784442424226 -:106FA000447840E000000000000000774C04040436 -:106FB000041F0000000000000000007C42023C4072 -:106FC000423E0000000000000008083E08080808D3 -:106FD000083000000000000000000063424242420E -:106FE00062DC000000000000000000E742242414DE -:106FF0000808000000000000000000EB494955555A -:10700000222200000000000000000076241818185A -:10701000246E000000000000000000E74224241459 -:1070200018080807000000000000007E2210080871 -:10703000447E000000C0202020202010202020209E -:107040002020C00010101010101010101010101080 -:107050001010101000060808080808100808080892 -:10706000080806000C32C20000000000000000000A -:107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 -:1070A0000000000000000000000000006000600020 -:1070B0006000600060006000600040002000200070 -:1070C0002000000000000000600060006000000080 -:1070D0000000000000000000600660063003980118 -:1070E00088004400000000000000000000000000D4 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000100210025B -:1071100010021002FE07FE0708020801080108011C -:107120000801FE07FE070401040104010401000038 -:107130000000000000000000000040004000F001DE -:1071400058034C03CC034C0058007000E000C00111 -:10715000C00140034C035C034C034801F0004000B5 -:107160004000000000000000000000000E010A01C5 -:10717000910091009100510051003A00AE03A0022D -:107180005004500448044804480484028403000066 -:1071900000000000000000000000000038006C004B -:1071A0006C006C006C006C002C0098071C011A012C -:1071B000330133016301E300C308C6093C07000043 -:1071C00000000000000000000C001C001000100077 -:1071D00008000400000000000000000000000000A3 -:1071E000000000000000000000000000000000009F -:1071F0000000000000000000000400020001800008 -:1072000080004000400020002000200020002000DE -:1072100020002000400040008000800000010002AB -:10722000000400000000000002000400080010003C -:1072300010002000200040004000400040004000BE -:107240004000400020002000100010000800040052 -:10725000020000000000000000000000000000002C -:107260004000C0004000460C4E0FD001F0015E0F00 -:10727000460C4000400040000000000000000000FC -:1072800000000000000000000000000000000000FE -:10729000000040004000400040004000FE0F400061 -:1072A00040004000400040000000000000000000DE -:1072B00000000000000000000000000000000000CE -:1072C00000000000000000000000000000000000BE -:1072D00000000000000000000C001C001000100066 -:1072E0000800040000000000000000000000000092 -:1072F000000000000000000000000000FE07000089 -:10730000000000000000000000000000000000007D -:10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D -:1073300000000000000000001C001C001C000000F9 -:10734000000000000000000000040006000200032E -:10735000000100018000800040004000600020002B -:10736000200010001000080008000C0004000600B7 -:107370000200000000000000000000000000F0001B -:1073800098010C030C03060606060606060606060A -:107390000606060606060C030C039801F000000022 -:1073A000000000000000000000000000000040009D -:1073B0007C006000600060006000600060006000B1 -:1073C000600060006000600060006000FC0300007E -:1073D0000000000000000000000000000000F800B5 -:1073E0008401020306030603000300018001C000BC -:1073F000600020001000080204020602FE030000E4 -:107400000000000000000000000000000000780004 -:10741000C6008601860180018001C00070008001E5 -:10742000000100030003060306038601F8000000C4 -:1074300000000000000000000000000000008001CB -:107440008001C001A001A001900188018801840190 -:107450008201FE0F8001800180018001E0070000B1 -:107460000000000000000000000000000000FC031D -:1074700004000400040004000400F4008C01040370 -:10748000000300030603060382018401F8000000E4 -:107490000000000000000000000000000000E0010B -:1074A00018030C030C0004000600E60116030E0688 -:1074B00006060606060604060C021803F000000085 -:1074C0000000000000000000000000000000F807BD -:1074D0000C0604020401000100018000800040004D -:1074E000400040006000600060006000600000003C -:1074F0000000000000000000000000000000F80193 -:107500000C030606060606060C021C03F000C80162 -:107510000C0306060606060606060C03F00100002C -:107520000000000000000000000000000000F0006B -:107530000C010C03060206060606060606078C0664 -:1075400078060006000300030C018C01780000009F -:10755000000000000000000000000000000000002B -:107560000000000000000000E000E000E00000007B -:107570000000000000000000E000E000E00000006B -:1075800000000000000000000000000000000000FB -:10759000000000000000000060006000000000002B -:1075A00000000000000000000000600060004000DB -:1075B0002000200000000000000000000004000285 -:1075C00000018000400020001000080004000800B6 -:1075D00010002000400080000001000200040000B4 -:1075E000000000000000000000000000000000009B -:1075F0000000000000000000FE0700000000000086 -:10760000FE07000000000000000000000000000075 -:10761000000000000000000000000000040008005E -:107620001000200040008000000100020004000261 -:10763000000180004000200010000800040000004D -:107640000000000000000000000000000000E00357 -:107650001806040C040C0C0C0C0C000780014000F4 -:107660004000400000000000E000E000E0000000FA -:10767000000000000000000000000000E00018030F -:107680000C02CC0564056605A605B604B604B6046E -:10769000B604B602E4010C040C021803F00000006A -:1076A000000000000000000000000000000060007A -:1076B00060005000D0009000900088008801080110 -:1076C000F801040304030402020202060F0F000083 -:1076D0000000000000000000000000000000FE00AC -:1076E0008C030C030C030C030C038C01FC000C0337 -:1076F0000C020C060C060C060C060C03FE01000026 -:107700000000000000000000000000000000E00396 -:1077100018030C060C04040406000600060006000C -:107720000600060006040C040C021803F00000001A -:1077300000000000000000000000000000007F00CA -:107740008C010C030C030C060C060C060C060C0634 -:107750000C060C060C060C030C038C017F000000C9 -:107760000000000000000000000000000000FF0317 -:10777000060306040604060086008600FE00860056 -:10778000860086000600060406040602FF030000C9 -:107790000000000000000000000000000000FF03E7 -:1077A000060306040604060086008600FE00860026 -:1077B0008600860006000600060006001F00000086 -:1077C0000000000000000000000000000000F000C9 -:1077D00018010C020C020402060006000600060056 -:1077E000C60F060306030C030C031803F000000089 -:1077F00000000000000000000000000000000F0F6B -:10780000060606060606060606060606FE0706061F -:107810000606060606060606060606060F0F000002 -:107820000000000000000000000000000000FC0359 -:107830006000600060006000600060006000600048 -:10784000600060006000600060006000FC030000F9 -:107850000000000000000000000000000000F80729 -:10786000C000C000C000C000C000C000C000C00018 -:10787000C000C000C000C000C000C000C000C60002 -:1078800066003C0000000000000000000000CF0384 -:107890008601C60046002600160036002E006E0047 -:1078A0004600C60086008601060106038F07000019 -:1078B00000000000000000000000000000001F00A9 -:1078C0000600060006000600060006000600060088 -:1078D000060006000600060406040602FF03000078 -:1078E000000000000000000000000000000007078A -:1078F000860386038E038E034E034E034A035A0308 -:107900005A033A033203320332031203870700009B -:1079100000000000000000000000000000008E0FCA -:107920000C021C021C02340234026402640244028F -:10793000C402840284038403040304031F020000BE -:107940000000000000000000000000000000F00047 -:1079500098010C030C020606060606060606060635 -:107960000606060606060C020C039801F00000004D -:107970000000000000000000000000000000FF0008 -:107980000603060606060606060606068603FE002B -:107990000600060006000600060006001F000000A4 -:1079A0000000000000000000000000000000F000E7 -:1079B00098010C030C0206060606060606060606D5 -:1079C0000606060676064C02CC039801F0008007F6 -:1079D0000003000000000000000000000000FF01A4 -:1079E000060306060606060606060603FE00460011 -:1079F000C600860086010603060306060F0E000079 -:107A00000000000000000000000000000000F8027C -:107A10000C030602060206000E003C00F800E0031C -:107A2000800300070206020606060C03F0010000B0 -:107A30000000000000000000000000000000FE0741 -:107A4000620461086108600060006000600060001E -:107A5000600060006000600060006000F8010000ED -:107A600000000000000000000000000000001E07F1 -:107A70000C020C020C020C020C020C020C020C0296 -:107A80000C020C020C020C020C021801F0000000A7 -:107A900000000000000000000000000000000F07D0 -:107AA0000602040104010C010C0188008800980002 -:107AB00098005000500070003000200020000000AE -:107AC0000000000000000000000000000000F70EB1 -:107AD000620442044604460464026402E402E402CE -:107AE0009C029C0198019801880188008800000090 -:107AF00000000000000000000000000000009E07E1 -:107B00000C01080118019000B00060002000600026 -:107B10006000D00090008801080104038E07000077 -:107B200000000000000000000000000000000F0F37 -:107B3000060404020C0208011801B800B00070002D -:107B4000600060006000600060006000F8010000FC -:107B50000000000000000000000000000000FC0722 -:107B60000C0206030201800180004000400020005A -:107B700020001000180008040C040402FE0300009A -:107B80000000000000000000E003200020002000B2 -:107B900020002000200020002000200020002000E5 -:107BA00020002000200020002000200020002000D5 -:107BB000E0030000000000000000000004000400DA -:107BC00008000800100010001000200020004000F5 -:107BD0004000C0008000800000010001000200029F -:107BE00000020004000000007C0040004000400053 -:107BF0004000400040004000400040004000400085 -:107C00004000400040004000400040004000400074 -:107C10007C000000000060009000080100000000EF -:107C20000000000000000000000000000000000054 -:107C30000000000000000000000000000000000044 -:107C40000000000000000000000000000000000034 -:107C50000000000000000000000000000000000024 -:107C60000000000000000000000000000000000014 -:107C70000000FF0F0000000018006000000000007E -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 -:107CB0000000000000000000F0010C030C030003B2 -:107CC000E0031C030E03060306038E0B7C0E00006C -:107CD00000000000000000000000000008000E008E -:107CE0000C000C000C000C00CC013C031C060C0624 -:107CF0000C060C060C060C060C021C03E40100002A -:107D00000000000000000000000000000000000073 -:107D10000000000000000000F0008C018C018601D2 -:107D200006000600060006020C020C01F00000002E -:107D30000000000000000000000000000002C0037E -:107D4000000300030003000378038C030C03060305 -:107D5000060306030603060304038C0778010000EC -:107D60000000000000000000000000000000000013 -:107D70000000000000000000E001180308020C06EB -:107D80000C06FC070C000C0018041802E0010000AF -:107D90000000000000000000000000000000C00320 -:107DA0006006300630003000FE0130003000300048 -:107DB000300030003000300030003000FC010000A6 -:107DC00000000000000000000000000000000000B3 -:107DD0000000000000000000F007D8068C018C01B4 -:107DE0008C019801F8000C00FC00CC03060306038C -:107DF0008E03F800000000000000000008000E00E4 -:107E00000C000C000C000C00EC011C030C030C0318 -:107E10000C030C030C030C030C030C039E07000063 -:107E200000000000000000000000000000006000F2 -:107E300060000000000040007C0060006000600006 -:107E4000600060006000600060006000FC030000F3 -:107E50000000000000000000000000000000C00161 -:107E6000C001000000000001F001800180018001DC -:107E700080018001800180018001800180018001FA -:107E8000CC007C00000000000000000008000E0094 -:107E90000C000C000C000C008C038C008C004C00BF -:107EA0006C005C008C008C010C010C039E07000030 -:107EB00000000000000000000000000040007C0006 -:107EC00060006000600060006000600060006000B2 -:107ED000600060006000600060006000FC03000063 -:107EE0000000000000000000000000000000000092 -:107EF00000000000000000003707EE066606660678 -:107F0000660666066606660666066606FF0F0000DB -:107F10000000000000000000000000000000000061 -:107F20000000000000000000EE011C030C030C0325 -:107F30000C030C030C030C030C030C039E07000042 -:107F40000000000000000000000000000000000031 -:107F50000000000000000000F00098010C0306067D -:107F600006060606060606060C030C03F0000000D3 -:107F70000000000000000000000000000000000001 -:107F80000000000000000000EE011C030C060C06BF -:107F90000C060C060C060C060C031C03EC010C0072 -:107FA0000C003E0000000000000000000000000087 -:107FB000000000000000000078028C030C030603A0 -:107FC000060306030603060304038C037803000379 -:107FD0000003C007000000000000000000000000D7 -:107FE00000000000000000009F035806380618003B -:107FF000180018001800180018001800FF000000F2 -:108000000000000000000000000000000000000070 -:108010000000000000000000F0031C030C020C0232 -:108020003800F000C003040304038C03FC010000CB -:108030000000000000000000000000000000000040 -:108040002000200030003000FE0130003000300001 -:10805000300030003000300030023002E00100001B -:108060000000000000000000000000000000000010 -:1080700000000000000008028E030C030C030C0338 -:108080000C030C030C030C030C039C077801000089 -:1080900000000000000000000000000000000000E0 -:1080A00000000000000000001E070C02080108018B -:1080B00018019000B000B0006000600020000000D7 -:1080C00000000000000000000000000000000000B0 -:1080D0000000000000000000F70E62044604640285 -:1080E0006402EC029C0198019801980108000000CC -:1080F0000000000000000000000000000000000080 -:108100000000000000000000BC0718011001B000D2 -:1081100060006000E0009000080108039E07000076 -:10812000000000000000000000000000000000004F -:1081300000000000000000009E070801080108017F -:1081400090009000B00060006000600020002000FF -:1081500024001C00000000000000000000000000DF -:108160000000000000000000FC018401C400440085 -:10817000600020003000180208020C03FC0100001F -:10818000000000000000000000038000800080006C -:1081900080008000800080008000400020004000BF -:1081A00080008000800080008000800080008000CF -:1081B000000300004000400040004000400040003C -:1081C00040004000400040004000400040004000AF -:1081D000400040004000400040004000400040009F -:1081E00040004000000000000C00100010001000D3 -:1081F00010001000100010001000200040002000AF -:1082000010001000100010001000100010001000EE -:108210000C00000000001C002204C20480030000C7 -:10822000000000000000000000000000000000004E -:10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E -:10826000000000000000000000000000000000000E -:1082700000000000000000000000000000000000FE -:108280000000000000000000000000000000C0012D -:10829000C001C001C001C001C001C0018000800058 -:1082A000800080008000800080000000000000004E -:1082B00000008001C003C003800100000000000036 -:1082C00000000000000000000000E01CE01CF01EA8 -:1082D000700E380718030801840000000000000039 -:1082E000000000000000000000000000000000008E -:1082F000000000000000000000000000000000007E -:10830000000000000000000000000000000000006D -:1083100020102010201020102010FE7FFE7F10085B -:10832000100810081008100810081008FE7FFE7FC3 -:108330000804080408040804080400000000000001 -:10834000000000000000000000000000000100012B -:10835000C007601910311831183918393801700107 -:10836000E001C0038007000F001D003900311C31FF -:108370001C310C310C11180DE00700010001000147 -:1083800000000000000000000000000000000000ED -:108390001C1036186308630C6304630463026302F1 -:1083A0006301361D9C3780228063406340632063F5 -:1083B0002063306310221836081C00000000000003 -:1083C00000000000000000000000000000000000AD -:1083D000F00098018C018C018C018C018C00CC0088 -:1083E0007800183E1C083608320863046304C3048E -:1083F000C303834306438E26781C00000000000060 -:10840000000000000000000000001C003C003C00D8 -:108410003000300010000C000600000000000000DA -:10842000000000000000000000000000000000004C -:10843000000000000000000000000000000000003C -:1084400000000000000000000000004000200010BC -:108450000008000C00040006000300030003800174 -:108460008001800180018001800180018001000382 -:108470000003000300060006000C000800100020A6 -:10848000004000000000000000000200040008009E -:108490001000300020006000C000C000C00080015B -:1084A0008001800180018001800180018001C00085 -:1084B000C000C00060006000300010000800040030 -:1084C00002000000000000000000000000000000AA -:1084D0000000000000018003800300011C713C7952 -:1084E000783DC0070001C007783D3C791C71000150 -:1084F00080038003800100000000000000000000F5 -:10850000000000000000000000000000000000006B -:108510000000000000000001000100010001000156 -:1085200000010001FC7F00010001000100010001C9 -:108530000001000100000000000000000000000039 -:10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:10857000000000001C003C003C00300030001000F7 -:108580000C000600000000000000000000000000D9 -:1085900000000000000000000000000000000000DB -:1085A00000000000FE7F000000000000000000004E -:1085B00000000000000000000000000000000000BB -:1085C00000000000000000000000000000000000AB -:1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B -:1085F000000018003C003C001800000000000000D3 -:1086000000000000000000000000004000600020AA -:108610000030001000180008000C000400060002E2 -:108620000003000180018000C000400060002000C5 -:1086300030001000180008000C00040006000200C2 -:10864000000000000000000000000000000000002A -:10865000C007600C30181830183018200C600C60FF -:108660000C600C600C600C600C600C600C601820DE -:10867000183018303018600CC007000000000000EF -:1086800000000000000000000000000000000000EA -:1086900000018001F80180018001800180018001DA -:1086A00080018001800180018001800180018001C2 -:1086B000800180018001C003F81F0000000000005D -:1086C00000000000000000000000000000000000AA -:1086D000E007101C0818043004300C300C30003057 -:1086E0000018000800040002000180004000202063 -:1086F000102008200430FC1FFC1F000000000000B8 -:108700000000000000000000000000000000000069 -:10871000E003180E0C0C0C180C180C180018000CA8 -:108720000006C003000E00180010003000300C30AE -:108730000C300C100C18180CE003000000000000B6 -:108740000000000000000000000000000000000029 -:10875000000C000E000E000F800E800E400E600E0A -:10876000200E100E100E080E040E040EFE7F000EDA -:10877000000E000E000E000E000EC07F0000000074 -:1087800000000000000000000000000000000000E9 -:10879000F03FF03F10001000100008000800C8076C -:1087A000280C1818081000300030003000300C3051 -:1087B0000C3004180418080CF0030000000000003E -:1087C00000000000000000000000000000000000A9 -:1087D000800FC010203010301800180008000C0066 -:1087E0008C0F6C183C301C600C600C600C600C60D2 -:1087F0001860182030306018C0070000000000002A -:108800000000000000000000000000000000000068 -:10881000F83FF83F1C100C08040804040004000290 -:108820000002000100010001800080008000C00003 -:10883000C000C000C000C000C00000000000000078 -:108840000000000000000000000000000000000028 -:10885000E007300C18180C300C300C301C30381875 -:108860007008E007B007180E0C1C063806300630FA -:10887000063006300C18180CE00300000000000061 -:1088800000000000000000000000000000000000E8 -:10889000E00318040C080C180610063006300630E9 -:1088A000063006380C3C1836F0310030001800183D -:1088B00000180C0C0C060C03F00100000000000076 -:1088C00000000000000000000000000000000000A8 -:1088D0000000000000000000000000000000800117 -:1088E000C003C00380010000000000000000000081 -:1088F00000008001C003C0038001000000000000F0 -:108900000000000000000000000000000000000067 -:108910000000000000000000000000000000C00097 -:10892000C000000000000000000000000000000087 -:10893000000000000000C000C00080008000400077 -:1089400040000000000000000000000000000020C7 -:10895000001000080004000600038001C000600051 -:10896000300018000C00180030006000C0008001CA -:1089700000030006000400080010002000000000B2 -:1089800000000000000000000000000000000000E7 -:108990000000000000000000000000000000FE7F5A -:1089A00000000000000000000000FE7F000000004A -:1089B00000000000000000000000000000000000B7 -:1089C00000000000000000000000000000000400A3 -:1089D0000800100020006000C000800100030006B5 -:1089E000000C001800300018000C00060003800185 -:1089F000C00060002000100008000400000000001B -:108A00000000000000000000000000000000C0079F -:108A10003018083008600C601C601C601C6000305E -:108A2000001C000600018000800080008000000023 -:108A300000008001C003C0038001000000000000AE -:108A40000000000000000000000000000000000026 -:108A5000C0076018103018200C2F8C4D864CC64C67 -:108A6000C64C664C66446644662666266615CC1C73 -:108A70000C40082018303018C0070000000000002B -:108A800000000000000000000000000000000001E5 -:108A9000C001C001C0014001600320032003200386 -:108AA0003006100610061006F80F080C080C080C0B -:108AB0000C0C0418041806181F7C000000000000AD -:108AC00000000000000000000000000000000000A6 -:108AD000FE07181C183818301830183018301818BD -:108AE000180CF8071818183018201860186018604B -:108AF0001860186018301818FE0F00000000000001 -:108B00000000000000000000000000000000000065 -:108B1000C0276038103018200C400C4004000600BC -:108B200006000600060006000600060006000C40CF -:108B30000C400C2018303018C00700000000000066 -:108B40000000000000000000000000000000000025 -:108B5000FE03180E181818301830183018601860F6 -:108B60001860186018601860186018601860183075 -:108B7000183018101818180EFE030000000000002E -:108B800000000000000000000000000000000000E5 -:108B9000FE3F1830182018601840180018081808F0 -:108BA000180CF80F180C18081808180018001800EE -:108BB0001840184018201830FE3F00000000000048 -:108BC00000000000000000000000000000000000A5 -:108BD000FE7F1870184018C0188018001810181060 -:108BE0001818F81F18181810181018001800180076 -:108BF00018001800180018007E0000000000000097 -:108C00000000000000000000000000000000000064 -:108C1000C013701C101018100C200C20040006004B -:108C2000060006000600060006FC063006300C3082 -:108C30000C30183018303008C00700000000000069 -:108C40000000000000000000000000000000000024 -:108C50003F7E0C180C180C180C180C180C180C185B -:108C60000C180C18FC1F0C180C180C180C180C18ED -:108C70000C180C180C180C183F7E000000000000A7 -:108C800000000000000000000000000000000000E4 -:108C9000F81F800180018001800180018001800136 -:108CA00080018001800180018001800180018001BC -:108CB0008001800180018001F81F00000000000099 -:108CC00000000000000000000000000000000000A4 -:108CD000E07F00060006000600060006000600060B -:108CE0000006000600060006000600060006000654 -:108CF0000006000600060006000600060E060E032B -:108D00008E01FC00000000000000000000000000D8 -:108D10007E7C181818081804180618021801980103 -:108D20009801D801B803380318071806180E180C54 -:108D3000181C1818183018307EFC000000000000C5 -:108D40000000000000000000000000000000000023 -:108D50007E001800180018001800180018001800ED -:108D60001800180018001800180018001800180043 -:108D70001840184018201830FE3F00000000000086 -:108D800000000000000000000000000000000000E3 -:108D90001FF81C381C381C381C3C34343434343430 -:108DA000343674326432643264326431C431C43172 -:108DB000C431C430C43084309FFC00000000000087 -:108DC00000000000000000000000000000000000A3 -:108DD0001F7C1C103C103410341074106410E4100C -:108DE000C410C41184118413041304170416041E40 -:108DF000041C041C041C04181F18000000000000C0 -:108E00000000000000000000000000000000000062 -:108E1000C003300C181808100C300C3006600660C7 -:108E200006600660066006600660066006600C204C -:108E30000C3008101818300CC003000000000000AF -:108E40000000000000000000000000000000000022 -:108E5000FE0F181818301860186018601860186035 -:108E600018301818F80F180018001800180018000B -:108E700018001800180018007E0000000000000014 -:108E800000000000000000000000000000000000E2 -:108E9000C003300C18180C100C300C200660066053 -:108EA0000660066006600660066006600660E461B3 -:108EB0002C331C321816300EC007004C007C0038D2 -:108EC00000000000000000000000000000000000A2 -:108ED000FE07181C183818301830183018301818B9 -:108EE000180CF80798031803180718061806180E28 -:108EF000180C180C181C18187E78000000000000D0 -:108F00000000000000000000000000000000000061 -:108F1000E027303818300C200C200C000C00180012 -:108F20007800E003800F001E0038007000600460CD -:108F30000460086018303818C80F000000000000F6 -:108F40000000000000000000000000000000000021 -:108F5000FC3F8C218461824182418001800180013B -:108F600080018001800180018001800180018001F9 -:108F70008001800180018001E00700000000000006 -:108F800000000000000000000000000000000000E1 -:108F90003F7C0C100C100C100C100C100C100C1052 -:108FA0000C100C100C100C100C100C100C100C10E1 -:108FB0000C100C1008083804E0030000000000004A -:108FC00000000000000000000000000000000000A1 -:108FD0003EF81820182018203010301030103010B3 -:108FE000600860086008E00CC004C004C00480038E -:108FF00080038003800300010001000000000000E6 -:109000000000000000000000000000000000000060 -:10901000DFF38661862186218C210C218C238C1321 -:109020008C138C134C1358125816580E380E380ED9 -:10903000380E300C10041004100400000000000072 -:109040000000000000000000000000000000000020 -:109050007E3E180838083004300470026002E001D7 -:10906000C001C001800180034003400720062006A4 -:10907000100C100C081808183E7C000000000000BE -:1090800000000000000000000000000000000000E0 -:109090007E7C1C10181018083008300C7004600416 -:1090A0006002C002C002C001800180018001800115 -:1090B0008001800180018001E007000000000000C5 -:1090C00000000000000000000000000000000000A0 -:1090D000F83F18180818040C040E000600070003D7 -:1090E00080038001C001C000E0006000700030001B -:1090F000382018201C100C18FE1F00000000000073 -:1091000000000000000000000000C03F40004000E0 -:10911000400040004000400040004000400040004F -:10912000400040004000400040004000400040003F -:109130004000400040004000400040004000C03F70 -:109140000000000000000000000000000000080017 -:10915000180018001000300020006000600040007F -:10916000C0008000800180010001000300020006B1 -:1091700000060004000C0008001800180010003061 -:1091800000200000000000000000FC0300020002BC -:1091900000020002000200020002000200020002BF -:1091A00000020002000200020002000200020002AF -:1091B0000002000200020002000200020002FC03A2 -:1091C000000000000000000000008007C00620082A -:1091D000101000000000000000000000000000006F -:1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E -:10923000000000000000000000000000000000002E -:109240000000FFFF0000000000007800C0000001E7 -:10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE -:1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE -:109290000000000000000000000000000000F003DB -:1092A00018060C0C0C0C000C800F700C1C0C0C0C19 -:1092B000060C060C064C0C4FF838000000000000AD -:1092C000000000000000000000000000000010008E -:1092D0001E00180018001800180018001800180FB9 -:1092E000D818383038601860186018601860186036 -:1092F0001860182038307818C807000000000000F7 -:10930000000000000000000000000000000000005D -:109310000000000000000000000000000000C00786 -:10932000700C181818180C180C000C000C000C000D -:109330000C20182018103008C007000000000000A2 -:10934000000000000000000000000000000000100D -:10935000001E001800180018001800180018E01B64 -:10936000301C181818180C180C180C180C180C189D -:109370000C180818181C307AE009000000000000E2 -:1093800000000000000000000000000000000000DD -:109390000000000000000000000000000000C00706 -:1093A000300C181808100C300C30FC3F0C000C006E -:1093B0000C00182018107018C007000000000000F2 -:1093C000000000000000000000000000000000009D -:1093D000003E80C380C0C0C0C000C000C000FC1FF1 -:1093E000C000C000C000C000C000C000C000C0007D -:1093F000C000C000C000C000F80F00000000000066 -:10940000000000000000000000000000000000005C -:109410000000000000000000000000000000C07715 -:10942000306C10181818181818181018300CF0078D -:1094300018001800F00FF03F08700C600C600C6012 -:109440003838E00F000000000000000000001000AD -:109450001E00180018001800180018001800980FB7 -:10946000D8183830183018301830183018301830F4 -:1094700018301830183018307EFC00000000000052 -:1094800000000000000000000000000000000000DC -:109490008003800380030000000000000001F80149 -:1094A00080018001800180018001800180018001B4 -:1094B0008001800180018001F81F00000000000091 -:1094C000000000000000000000000000000000009C -:1094D0000038003800380000000000000010801F35 -:1094E00000180018001800180018001800180018BC -:1094F0000018001800180018001800180018180CA0 -:109500001806F0030000000000000000000010003A -:109510001E00180018001800180018001800183E47 -:10952000180C1806180318019801D80138031807F9 -:109530001806180C181C18187E7C0000000000008B -:10954000000000000000000000000000000000011A -:10955000F80180018001800180018001800180018B -:1095600080018001800180018001800180018001F3 -:109570008001800180018001F81F000000000000D0 -:1095800000000000000000000000000000000000DB -:109590000000000000000000000000000800EE1CB9 -:1095A0009C338C318C318C318C318C318C318C31C1 -:1095B0008C318C318C318C31DE7B0000000000005E -:1095C000000000000000000000000000000000009B -:1095D00000000000000000000000000010001E0F4E -:1095E000D818383018301830183018301830183073 -:1095F00018301830183018307EFC000000000000D1 -:10960000000000000000000000000000000000005A -:109610000000000000000000000000000000C00783 -:10962000701C103018300C600C600C600C600C600A -:109630000C60183018303018C0070000000000001F -:10964000000000000000000000000000000000001A -:1096500000000000000000000000000010009E0F4D -:109660005818383018201860186018601860186092 -:10967000186018303830781898071800180018004B -:1096800018007E0000000000000000000000000044 -:109690000000000000000000000000000000C023E7 -:1096A000303C183818300C300C300C300C300C308A -:1096B0000C3008301838303CE033003000300030D7 -:1096C000003000FC0000000000000000000000006E -:1096D00000000000000000000000000060007E3C70 -:1096E00060666061E000E0006000600060006000B3 -:1096F0006000600060006000FE07000000000000E5 -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000E02742 -:1097200030381830182018007000E003800F001C3B -:10973000043004300C301C18EC0F00000000000056 -:109740000000000000000000000000000000000019 -:1097500000000000800080008000C000E000FC1FCE -:10976000C000C000C000C000C000C000C000C000F9 -:10977000C000C020C0208011000F000000000000C9 -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000010201E3C3F -:1097A0001830183018301830183018301830183079 -:1097B00018301830183830F4E013000000000000B2 -:1097C0000000000000000000000000000000000099 -:1097D00000000000000000000000000000007E3CCF -:1097E000181818083808300430047002600260024B -:1097F000E001C001C001C0008000000000000000C6 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000DFF772 -:109820008E630C238C238C23981398135816581688 -:10983000700E700E700E2004200400000000000066 -:109840000000000000000000000000000000000018 -:109850000000000000000000000000000000FC3ECE -:1098600070087004E004C002C00180038003400758 -:109870006006200C100C18183E7E0000000000004E -:1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000007E7CCE -:1098A0001818180830083008300460046004C0023A -:1098B000C002C00280018001800180008000800021 -:1098C0004C003C0000000000000000000000000010 -:1098D0000000000000000000000000000000FC1F6D -:1098E0000C0C040E0406000380038001C000E0009D -:1098F0007020302038301C18FC1F000000000000D1 -:10990000000000000000000000000030000800041B -:109910000004000400040004000400040004000427 -:10992000000400028001000200040004000400049E -:109930000004000400040004000400040004000803 -:1099400000300000000100010001000100010001E1 -:1099500000010001000100010001000100010001FF -:1099600000010001000100010001000100010001EF -:1099700000010001000100010001000100010001DF -:10998000000100010000000000000C001000200099 -:1099900020002000200020002000200020002000C7 -:1099A0002000400080014000200020002000200016 -:1099B00020002000200020002000200020001000B7 -:1099C0000C00000000003800C40086400261002244 -:1099D000001C00000000000000000000000000006B -:1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000000000067 -:109A000000000000D6D0200020002000FE0322022B -:109A100022022202FE032202200020002000BEB00B -:109A2000FC010401FC010401FC012000FF0704010A -:109A3000FC01200024013202D4B0FE070204FA0423 -:109A400002040204FE05520452044A05860502047B -:109A5000FE07B5E710001000FF0111011101FF0121 -:109A600011011101FF0111041004E007D7D3000018 -:109A7000FC018000400020002000FF0720002000A3 -:109A8000200020003800D6D08000800080008000B8 -:109A9000FC1F84108410841084108410FC1F841018 -:109AA0008000800080008000BEB0F80F0808F80F2A -:109AB0000808F80F8000FF7F0000F80F080808086A -:109AC000F80F80008410A2204000D4B00000FE3FB8 -:109AD0000220F22702200220FA2F22212221222115 -:109AE000122912290A2E0220FE3F0220B5E780002B -:109AF00080008000FC1F841084108410FC1F8410E0 -:109B000084108410FC1F845080408040007FD7D395 -:109B10000000FE1F00080004000280018000FF7F9B -:109B2000800080008000800080008000A000400055 -:109B3000D6D0000000000000001800000800000857 -:109B400000000800080818F8FF1F1808181808185F -:109B5000180818180818180818180818F8FF1F0807 -:109B600008080008000008000008000008000018AD -:109B700000001800001800000000BEB00000000047 -:109B80000000400006C0FF07400006C0FF0740007D -:109B900006C0FF07400802003000FEFF3F00000043 -:109BA000C0FF07C00002C00002C00002C0FF038067 -:109BB000100080110160100E3010180C1E30001CB7 -:109BC00000000000D4B0000000000000080030F8E1 -:109BD000FF1F08001008C010083F10080010080000 -:109BE00010080013C8FF10082210082210082210C5 -:109BF00008221008211208211488601648C0132872 -:109C00000010080010F8FF1F080010000000B5E762 -:109C1000000000000000001800000800000800001C -:109C20000800F0FF0F1008041008041008041008C2 -:109C300004F0FF07100804100804100804100804BA -:109C4000F0FF0710080000081000081000082000AE -:109C5000183000F01F000000D7D300000000000003 -:109C6000000004F0FF0F00000600000100C000002B -:109C70002800001800001800001830FEFF7F0018B0 -:109C8000000018000018000018000018000018005C -:109C9000001800001800001800001F00000C000051 -:109CA0000000D6D00000000000000000008000008E -:109CB00000800100008001000080010000800100A0 -:109CC000008001001080010CF0FFFF0F30800104C4 -:109CD00030800104308001043080010430800104B0 -:109CE000308001043080010430800104F0FFFF0760 -:109CF00030800104308001040080010000800100F8 -:109D0000008001000080010000800100008001004F -:109D10000080010000800100008001000080000040 -:109D200000000000BEB000000000000000000000C5 -:109D300000000001800100FFFF010003800100031B -:109D4000800100FFFF01000380010003800100FF8C -:109D5000FF0100818100000003000000031CFCFFE4 -:109D6000FF3F000040000003C00100FFFF010003AF -:109D7000C0000003C0000003C00000FFFF0000019E -:109D8000410000040100000E710000078101800104 -:109D900001076000010E1898011C04E0011800C0C2 -:109DA000000000000000D4B000000000000000002F -:109DB00000000008F0FFFF1F3000000C3000000C16 -:109DC0003000100C30FE3F0C3004000C3000000C52 -:109DD0003000000C3000000C3000C00CF0FFFF0D14 -:109DE0003030060E3030060C3010060C3010060CE9 -:109DF0003010060C3018860C3018860C3008060D12 -:109E0000300C860D3006EE0F3002FC0D3001000CD8 -:109E1000F000000C3000000CF0FFFF0F3000000CD1 -:109E20001000000400000000B5E700000000000082 -:109E3000000000C0000000C0010000C0000000C021 -:109E4000000000C0000000C00000E0FFFF0360C091 -:109E5000000360C0000360C0000360C0000360C076 -:109E6000000360C00003E0FFFF0360C0000360C0A8 -:109E7000000360C0000360C0000360C00003E0FF97 -:109E8000FF0360C0000160C0000000C0000800C007 -:109E9000001000C0001000C0001800C00138008091 -:109EA000FF1F0000000000000000D7D300000000EA -:109EB000000000000000000000000003C0FFFF07DA -:109EC000000080070000C0000000600000001800D3 -:109ED00000000C00008003000080030000800100EF -:109EE000008001080080011CFCFFFF3F0080010092 -:109EF000008001000080010000800100008001005E -:109F0000008001000080010000800100008001004D -:109F100000800100008001000080010000FC0100C1 -:109F200000E0000000400000000000000000000011 -:109F300000000000010203040607080900000000F9 -:109F4000010203040D0A3D20202020202020202093 -:109F50002020202020202020202020202020202001 -:109F600020202020202020202020202020202020F1 -:109F700020202020202020202020202020202020E1 -:109F800020202020202020202020203D0000000034 -:109F90000D0A3D20202020202020202020202020CD -:109FA0002028432920434F505952494748542032D2 -:109FB0003031312053544D6963726F656C65637441 -:109FC000726F6E69637320202020202020202020C3 -:109FD000202020202020203D000000000D0A3D20F0 -:109FE0002020202020202020202020202020202071 -:109FF0002020202020202020202020202020202061 -:10A0000020204279204D4344204170706C69636187 -:10A0100074696F6E205465616D20202020202020FF -:10A020002020203D000000000D0A3D202053544D0B -:10A0300033324634787820496E2D4170706C6963F4 -:10A040006174696F6E2050726F6772616D6D696EB9 -:10A0500067204170706C69636174696F6E2020289D -:10A0600056657273696F6E20312E302E3029203D77 -:10A07000000000000D0A3D3D3D3D3D3D3D3D3D3D67 -:10A080003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D00 -:10A090003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3DF0 -:10A0A0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3DE0 -:10A0B0003D3D3D3D3D3D3D3D3D3D3D3D00000000C4 -:10A0C000E0A0000800000020200100004863000814 -:10A0D00000A2000820010020F839000058630008A1 -:10A0E000000000000000000001000000100000005F -:10A0F000000000000024F400000000000000000048 -:10A10000000000000000000039470008694700080F -:10A11000754700089D470008C9470008194700080F -:10A12000454700080403090412010002020200402E -:10A130008304405700020102030100001A030000DB -:10A14000000000000000000000000000000000000F -:10A15000000000000000000000000000950300085F -:10A160008F0300088B030008B9030008F9030008F7 -:10A1700000000000810182000A0600020000004089 -:10A180000100000009024300020100C0320904007E -:10A190000001020201000524001001052401000154 -:10A1A00004240202052406000107058203080010AA -:10A1B00009040100020A0000000705010240000036 -:10A1C000070581024000000069430008DD410008E6 -:10A1D00007450008000000006D4200082941000802 -:10A1E0009F41000800000000000000000000000087 -:10A1F000ED420008B14200082D430008A5420008C6 -:040000050800019955 -:00000001FF diff --git a/software/bootloader/MDK-ARM/RTE/_IAP_F411/RTE_Components.h b/software/bootloader/MDK-ARM/RTE/_IAP_F411/RTE_Components.h deleted file mode 100644 index 78d87e4..0000000 --- a/software/bootloader/MDK-ARM/RTE/_IAP_F411/RTE_Components.h +++ /dev/null @@ -1,21 +0,0 @@ - -/* - * Auto generated Run-Time-Environment Configuration File - * *** Do not modify ! *** - * - * Project: 'IAP_F411' - * Target: 'IAP_F411' - */ - -#ifndef RTE_COMPONENTS_H -#define RTE_COMPONENTS_H - - -/* - * Define the Device Header File: - */ -#define CMSIS_device_header "stm32f4xx.h" - - - -#endif /* RTE_COMPONENTS_H */ diff --git a/software/bootloader/MDK-ARM/startup_stm32f411xe.s b/software/bootloader/MDK-ARM/startup_stm32f411xe.s deleted file mode 100644 index 9867a27..0000000 --- a/software/bootloader/MDK-ARM/startup_stm32f411xe.s +++ /dev/null @@ -1,377 +0,0 @@ -;******************************************************************************* -;* File Name : startup_stm32f411xe.s -;* Author : MCD Application Team -;* Description : STM32F411xExx devices vector table for MDK-ARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM4 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************* -;* @attention -;* -;* Copyright (c) 2017 STMicroelectronics. -;* All rights reserved. -;* -;* This software is licensed under terms that can be found in the LICENSE file -;* in the root directory of this software component. -;* If no LICENSE file comes with this software, it is provided AS-IS. -;* -;******************************************************************************* -;* <<< Use Configuration Wizard in Context Menu >>> -; -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; Stack Configuration -; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Stack_Size EQU 0x1000 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; Heap Configuration -; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Heap_Size EQU 0x200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window WatchDog - DCD PVD_IRQHandler ; PVD through EXTI Line detection - DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line - DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line0 - DCD EXTI1_IRQHandler ; EXTI Line1 - DCD EXTI2_IRQHandler ; EXTI Line2 - DCD EXTI3_IRQHandler ; EXTI Line3 - DCD EXTI4_IRQHandler ; EXTI Line4 - DCD DMA1_Stream0_IRQHandler ; DMA1 Stream 0 - DCD DMA1_Stream1_IRQHandler ; DMA1 Stream 1 - DCD DMA1_Stream2_IRQHandler ; DMA1 Stream 2 - DCD DMA1_Stream3_IRQHandler ; DMA1 Stream 3 - DCD DMA1_Stream4_IRQHandler ; DMA1 Stream 4 - DCD DMA1_Stream5_IRQHandler ; DMA1 Stream 5 - DCD DMA1_Stream6_IRQHandler ; DMA1 Stream 6 - DCD ADC_IRQHandler ; ADC1, ADC2 and ADC3s - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD EXTI9_5_IRQHandler ; External Line[9:5]s - DCD TIM1_BRK_TIM9_IRQHandler ; TIM1 Break and TIM9 - DCD TIM1_UP_TIM10_IRQHandler ; TIM1 Update and TIM10 - DCD TIM1_TRG_COM_TIM11_IRQHandler ; TIM1 Trigger and Commutation and TIM11 - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM4_IRQHandler ; TIM4 - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD I2C2_EV_IRQHandler ; I2C2 Event - DCD I2C2_ER_IRQHandler ; I2C2 Error - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD 0 ; Reserved - DCD EXTI15_10_IRQHandler ; External Line[15:10]s - DCD RTC_Alarm_IRQHandler ; RTC Alarm (A and B) through EXTI Line - DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD DMA1_Stream7_IRQHandler ; DMA1 Stream7 - DCD 0 ; Reserved - DCD SDIO_IRQHandler ; SDIO - DCD TIM5_IRQHandler ; TIM5 - DCD SPI3_IRQHandler ; SPI3 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD DMA2_Stream0_IRQHandler ; DMA2 Stream 0 - DCD DMA2_Stream1_IRQHandler ; DMA2 Stream 1 - DCD DMA2_Stream2_IRQHandler ; DMA2 Stream 2 - DCD DMA2_Stream3_IRQHandler ; DMA2 Stream 3 - DCD DMA2_Stream4_IRQHandler ; DMA2 Stream 4 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD OTG_FS_IRQHandler ; USB OTG FS - DCD DMA2_Stream5_IRQHandler ; DMA2 Stream 5 - DCD DMA2_Stream6_IRQHandler ; DMA2 Stream 6 - DCD DMA2_Stream7_IRQHandler ; DMA2 Stream 7 - DCD USART6_IRQHandler ; USART6 - DCD I2C3_EV_IRQHandler ; I2C3 event - DCD I2C3_ER_IRQHandler ; I2C3 error - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD FPU_IRQHandler ; FPU - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SPI4_IRQHandler ; SPI4 - DCD SPI5_IRQHandler ; SPI5 - -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT SystemInit - IMPORT __main - - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP -BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP -UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT TAMP_STAMP_IRQHandler [WEAK] - EXPORT RTC_WKUP_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_IRQHandler [WEAK] - EXPORT EXTI1_IRQHandler [WEAK] - EXPORT EXTI2_IRQHandler [WEAK] - EXPORT EXTI3_IRQHandler [WEAK] - EXPORT EXTI4_IRQHandler [WEAK] - EXPORT DMA1_Stream0_IRQHandler [WEAK] - EXPORT DMA1_Stream1_IRQHandler [WEAK] - EXPORT DMA1_Stream2_IRQHandler [WEAK] - EXPORT DMA1_Stream3_IRQHandler [WEAK] - EXPORT DMA1_Stream4_IRQHandler [WEAK] - EXPORT DMA1_Stream5_IRQHandler [WEAK] - EXPORT DMA1_Stream6_IRQHandler [WEAK] - EXPORT ADC_IRQHandler [WEAK] - EXPORT EXTI9_5_IRQHandler [WEAK] - EXPORT TIM1_BRK_TIM9_IRQHandler [WEAK] - EXPORT TIM1_UP_TIM10_IRQHandler [WEAK] - EXPORT TIM1_TRG_COM_TIM11_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM4_IRQHandler [WEAK] - EXPORT I2C1_EV_IRQHandler [WEAK] - EXPORT I2C1_ER_IRQHandler [WEAK] - EXPORT I2C2_EV_IRQHandler [WEAK] - EXPORT I2C2_ER_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT EXTI15_10_IRQHandler [WEAK] - EXPORT RTC_Alarm_IRQHandler [WEAK] - EXPORT OTG_FS_WKUP_IRQHandler [WEAK] - EXPORT DMA1_Stream7_IRQHandler [WEAK] - EXPORT SDIO_IRQHandler [WEAK] - EXPORT TIM5_IRQHandler [WEAK] - EXPORT SPI3_IRQHandler [WEAK] - EXPORT DMA2_Stream0_IRQHandler [WEAK] - EXPORT DMA2_Stream1_IRQHandler [WEAK] - EXPORT DMA2_Stream2_IRQHandler [WEAK] - EXPORT DMA2_Stream3_IRQHandler [WEAK] - EXPORT DMA2_Stream4_IRQHandler [WEAK] - EXPORT OTG_FS_IRQHandler [WEAK] - EXPORT DMA2_Stream5_IRQHandler [WEAK] - EXPORT DMA2_Stream6_IRQHandler [WEAK] - EXPORT DMA2_Stream7_IRQHandler [WEAK] - EXPORT USART6_IRQHandler [WEAK] - EXPORT I2C3_EV_IRQHandler [WEAK] - EXPORT I2C3_ER_IRQHandler [WEAK] - EXPORT FPU_IRQHandler [WEAK] - EXPORT SPI4_IRQHandler [WEAK] - EXPORT SPI5_IRQHandler [WEAK] - -WWDG_IRQHandler -PVD_IRQHandler -TAMP_STAMP_IRQHandler -RTC_WKUP_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_IRQHandler -EXTI1_IRQHandler -EXTI2_IRQHandler -EXTI3_IRQHandler -EXTI4_IRQHandler -DMA1_Stream0_IRQHandler -DMA1_Stream1_IRQHandler -DMA1_Stream2_IRQHandler -DMA1_Stream3_IRQHandler -DMA1_Stream4_IRQHandler -DMA1_Stream5_IRQHandler -DMA1_Stream6_IRQHandler -ADC_IRQHandler -EXTI9_5_IRQHandler -TIM1_BRK_TIM9_IRQHandler -TIM1_UP_TIM10_IRQHandler -TIM1_TRG_COM_TIM11_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -TIM4_IRQHandler -I2C1_EV_IRQHandler -I2C1_ER_IRQHandler -I2C2_EV_IRQHandler -I2C2_ER_IRQHandler -SPI1_IRQHandler -SPI2_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -EXTI15_10_IRQHandler -RTC_Alarm_IRQHandler -OTG_FS_WKUP_IRQHandler -DMA1_Stream7_IRQHandler -SDIO_IRQHandler -TIM5_IRQHandler -SPI3_IRQHandler -DMA2_Stream0_IRQHandler -DMA2_Stream1_IRQHandler -DMA2_Stream2_IRQHandler -DMA2_Stream3_IRQHandler -DMA2_Stream4_IRQHandler -OTG_FS_IRQHandler -DMA2_Stream5_IRQHandler -DMA2_Stream6_IRQHandler -DMA2_Stream7_IRQHandler -USART6_IRQHandler -I2C3_EV_IRQHandler -I2C3_ER_IRQHandler -FPU_IRQHandler -SPI4_IRQHandler -SPI5_IRQHandler - - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END diff --git a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc/usbd_cdc.h b/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc/usbd_cdc.h deleted file mode 100644 index aeac6bf..0000000 --- a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc/usbd_cdc.h +++ /dev/null @@ -1,184 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc.h - * @author MCD Application Team - * @brief header file for the usbd_cdc.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CDC_H -#define __USB_CDC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup usbd_cdc - * @brief This file is the Header file for usbd_cdc.c - * @{ - */ - - -/** @defgroup usbd_cdc_Exported_Defines - * @{ - */ -#ifndef CDC_IN_EP -#define CDC_IN_EP 0x81U /* EP1 for data IN */ -#endif /* CDC_IN_EP */ -#ifndef CDC_OUT_EP -#define CDC_OUT_EP 0x01U /* EP1 for data OUT */ -#endif /* CDC_OUT_EP */ -#ifndef CDC_CMD_EP -#define CDC_CMD_EP 0x82U /* EP2 for CDC commands */ -#endif /* CDC_CMD_EP */ - -#ifndef CDC_HS_BINTERVAL -#define CDC_HS_BINTERVAL 0x10U -#endif /* CDC_HS_BINTERVAL */ - -#ifndef CDC_FS_BINTERVAL -#define CDC_FS_BINTERVAL 0x10U -#endif /* CDC_FS_BINTERVAL */ - -/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ -#define CDC_DATA_HS_MAX_PACKET_SIZE 512U /* Endpoint IN & OUT Packet size */ -#define CDC_DATA_FS_MAX_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */ -#define CDC_CMD_PACKET_SIZE 8U /* Control Endpoint Packet size */ - -#define USB_CDC_CONFIG_DESC_SIZ 67U -#define CDC_DATA_HS_IN_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE -#define CDC_DATA_HS_OUT_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE - -#define CDC_DATA_FS_IN_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE -#define CDC_DATA_FS_OUT_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE - -#define CDC_REQ_MAX_DATA_SIZE 0x7U -/*---------------------------------------------------------------------*/ -/* CDC definitions */ -/*---------------------------------------------------------------------*/ -#define CDC_SEND_ENCAPSULATED_COMMAND 0x00U -#define CDC_GET_ENCAPSULATED_RESPONSE 0x01U -#define CDC_SET_COMM_FEATURE 0x02U -#define CDC_GET_COMM_FEATURE 0x03U -#define CDC_CLEAR_COMM_FEATURE 0x04U -#define CDC_SET_LINE_CODING 0x20U -#define CDC_GET_LINE_CODING 0x21U -#define CDC_SET_CONTROL_LINE_STATE 0x22U -#define CDC_SEND_BREAK 0x23U - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - -/** - * @} - */ -typedef struct -{ - uint32_t bitrate; - uint8_t format; - uint8_t paritytype; - uint8_t datatype; -} USBD_CDC_LineCodingTypeDef; - -typedef struct _USBD_CDC_Itf -{ - int8_t (* Init)(void); - int8_t (* DeInit)(void); - int8_t (* Control)(uint8_t cmd, uint8_t *pbuf, uint16_t length); - int8_t (* Receive)(uint8_t *Buf, uint32_t *Len); - int8_t (* TransmitCplt)(uint8_t *Buf, uint32_t *Len, uint8_t epnum); -} USBD_CDC_ItfTypeDef; - - -typedef struct -{ - uint32_t data[CDC_DATA_HS_MAX_PACKET_SIZE / 4U]; /* Force 32-bit alignment */ - uint8_t CmdOpCode; - uint8_t CmdLength; - uint8_t *RxBuffer; - uint8_t *TxBuffer; - uint32_t RxLength; - uint32_t TxLength; - - __IO uint32_t TxState; - __IO uint32_t RxState; -} USBD_CDC_HandleTypeDef; - - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_ClassTypeDef USBD_CDC; -#define USBD_CDC_CLASS &USBD_CDC -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CDC_ItfTypeDef *fops); - -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, - uint32_t length, uint8_t ClassId); -uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t ClassId); -#else -uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, - uint32_t length); -uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev); -#endif /* USE_USBD_COMPOSITE */ -uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff); -uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_CDC_H */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c b/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c deleted file mode 100644 index ad8da25..0000000 --- a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c +++ /dev/null @@ -1,893 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc.c - * @author MCD Application Team - * @brief This file provides the high layer firmware functions to manage the - * following functionalities of the USB CDC Class: - * - Initialization and Configuration of high and low layer - * - Enumeration as CDC Device (and enumeration for each implemented memory interface) - * - OUT/IN data transfer - * - Command IN transfer (class requests management) - * - Error management - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * CDC Class Driver Description - * =================================================================== - * This driver manages the "Universal Serial Bus Class Definitions for Communications Devices - * Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus - * Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007" - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN) - * - Requests management (as described in section 6.2 in specification) - * - Abstract Control Model compliant - * - Union Functional collection (using 1 IN endpoint for control) - * - Data interface class - * - * These aspects may be enriched or modified for a specific user application. - * - * This driver doesn't implement the following aspects of the specification - * (but it is possible to manage these features with some modifications on this driver): - * - Any class-specific aspect relative to communication classes should be managed by user application. - * - All communication classes other than PSTN are not managed - * - * @endverbatim - * - ****************************************************************************** - */ - -/* BSPDependencies -- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" -- "stm32xxxxx_{eval}{discovery}_io.c" -EndBSPDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc.h" -#include "usbd_ctlreq.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_CDC - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_CDC_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_CDC_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_CDC_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CDC_Private_FunctionPrototypes - * @{ - */ - -static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev); -#ifndef USE_USBD_COMPOSITE -static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length); -static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length); -static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length); -uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ - -#ifndef USE_USBD_COMPOSITE -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CDC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; -#endif /* USE_USBD_COMPOSITE */ -/** - * @} - */ - -/** @defgroup USBD_CDC_Private_Variables - * @{ - */ - - -/* CDC interface class callbacks structure */ -USBD_ClassTypeDef USBD_CDC = -{ - USBD_CDC_Init, - USBD_CDC_DeInit, - USBD_CDC_Setup, - NULL, /* EP0_TxSent */ - USBD_CDC_EP0_RxReady, - USBD_CDC_DataIn, - USBD_CDC_DataOut, - NULL, - NULL, - NULL, -#ifdef USE_USBD_COMPOSITE - NULL, - NULL, - NULL, - NULL, -#else - USBD_CDC_GetHSCfgDesc, - USBD_CDC_GetFSCfgDesc, - USBD_CDC_GetOtherSpeedCfgDesc, - USBD_CDC_GetDeviceQualifierDescriptor, -#endif /* USE_USBD_COMPOSITE */ -}; - -#ifndef USE_USBD_COMPOSITE -/* USB CDC device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CDC_CfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = -{ - /* Configuration Descriptor */ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength */ - 0x00, - 0x02, /* bNumInterfaces: 2 interfaces */ - 0x01, /* bConfigurationValue: Configuration value */ - 0x00, /* iConfiguration: Index of string descriptor - describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower (mA) */ - - /*---------------------------------------------------------------------------*/ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoint used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - 0x01, /* bDataInterface */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - 0x00, /* bMasterInterface: Communication class interface */ - 0x01, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - 0x01, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass */ - 0x00, /* bInterfaceProtocol */ - 0x00, /* iInterface */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00 /* bInterval */ -}; -#endif /* USE_USBD_COMPOSITE */ - -static uint8_t CDCInEpAdd = CDC_IN_EP; -static uint8_t CDCOutEpAdd = CDC_OUT_EP; -static uint8_t CDCCmdEpAdd = CDC_CMD_EP; - -/** - * @} - */ - -/** @defgroup USBD_CDC_Private_Functions - * @{ - */ - -/** - * @brief USBD_CDC_Init - * Initialize the CDC interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - USBD_CDC_HandleTypeDef *hcdc; - - hcdc = (USBD_CDC_HandleTypeDef *)USBD_malloc(sizeof(USBD_CDC_HandleTypeDef)); - - if (hcdc == NULL) - { - pdev->pClassDataCmsit[pdev->classId] = NULL; - return (uint8_t)USBD_EMEM; - } - - (void)USBD_memset(hcdc, 0, sizeof(USBD_CDC_HandleTypeDef)); - - pdev->pClassDataCmsit[pdev->classId] = (void *)hcdc; - pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - CDCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - CDCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - CDCCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, CDCInEpAdd, USBD_EP_TYPE_BULK, - CDC_DATA_HS_IN_PACKET_SIZE); - - pdev->ep_in[CDCInEpAdd & 0xFU].is_used = 1U; - - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, CDCOutEpAdd, USBD_EP_TYPE_BULK, - CDC_DATA_HS_OUT_PACKET_SIZE); - - pdev->ep_out[CDCOutEpAdd & 0xFU].is_used = 1U; - - /* Set bInterval for CDC CMD Endpoint */ - pdev->ep_in[CDCCmdEpAdd & 0xFU].bInterval = CDC_HS_BINTERVAL; - } - else - { - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, CDCInEpAdd, USBD_EP_TYPE_BULK, - CDC_DATA_FS_IN_PACKET_SIZE); - - pdev->ep_in[CDCInEpAdd & 0xFU].is_used = 1U; - - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, CDCOutEpAdd, USBD_EP_TYPE_BULK, - CDC_DATA_FS_OUT_PACKET_SIZE); - - pdev->ep_out[CDCOutEpAdd & 0xFU].is_used = 1U; - - /* Set bInterval for CMD Endpoint */ - pdev->ep_in[CDCCmdEpAdd & 0xFU].bInterval = CDC_FS_BINTERVAL; - } - - /* Open Command IN EP */ - (void)USBD_LL_OpenEP(pdev, CDCCmdEpAdd, USBD_EP_TYPE_INTR, CDC_CMD_PACKET_SIZE); - pdev->ep_in[CDCCmdEpAdd & 0xFU].is_used = 1U; - - hcdc->RxBuffer = NULL; - - /* Init physical Interface components */ - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Init(); - - /* Init Xfer states */ - hcdc->TxState = 0U; - hcdc->RxState = 0U; - - if (hcdc->RxBuffer == NULL) - { - return (uint8_t)USBD_EMEM; - } - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer, - CDC_DATA_HS_OUT_PACKET_SIZE); - } - else - { - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer, - CDC_DATA_FS_OUT_PACKET_SIZE); - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_Init - * DeInitialize the CDC layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this CDC class instance */ - CDCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - CDCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - CDCCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Close EP IN */ - (void)USBD_LL_CloseEP(pdev, CDCInEpAdd); - pdev->ep_in[CDCInEpAdd & 0xFU].is_used = 0U; - - /* Close EP OUT */ - (void)USBD_LL_CloseEP(pdev, CDCOutEpAdd); - pdev->ep_out[CDCOutEpAdd & 0xFU].is_used = 0U; - - /* Close Command IN EP */ - (void)USBD_LL_CloseEP(pdev, CDCCmdEpAdd); - pdev->ep_in[CDCCmdEpAdd & 0xFU].is_used = 0U; - pdev->ep_in[CDCCmdEpAdd & 0xFU].bInterval = 0U; - - /* DeInit physical Interface components */ - if (pdev->pClassDataCmsit[pdev->classId] != NULL) - { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->DeInit(); - (void)USBD_free(pdev->pClassDataCmsit[pdev->classId]); - pdev->pClassDataCmsit[pdev->classId] = NULL; - pdev->pClassData = NULL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_Setup - * Handle the CDC specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t len; - uint8_t ifalt = 0U; - uint16_t status_info = 0U; - USBD_StatusTypeDef ret = USBD_OK; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - if (req->wLength != 0U) - { - if ((req->bmRequest & 0x80U) != 0U) - { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(req->bRequest, - (uint8_t *)hcdc->data, - req->wLength); - - len = MIN(CDC_REQ_MAX_DATA_SIZE, req->wLength); - (void)USBD_CtlSendData(pdev, (uint8_t *)hcdc->data, len); - } - else - { - hcdc->CmdOpCode = req->bRequest; - hcdc->CmdLength = (uint8_t)MIN(req->wLength, USB_MAX_EP0_SIZE); - - (void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, hcdc->CmdLength); - } - } - else - { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(req->bRequest, - (uint8_t *)req, 0U); - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, &ifalt, 1U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_SET_INTERFACE: - if (pdev->dev_state != USBD_STATE_CONFIGURED) - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_CLEAR_FEATURE: - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - - return (uint8_t)ret; -} - -/** - * @brief USBD_CDC_DataIn - * Data sent on non-control IN endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_CDC_HandleTypeDef *hcdc; - PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef *)pdev->pData; - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if ((pdev->ep_in[epnum & 0xFU].total_length > 0U) && - ((pdev->ep_in[epnum & 0xFU].total_length % hpcd->IN_ep[epnum & 0xFU].maxpacket) == 0U)) - { - /* Update the packet total length */ - pdev->ep_in[epnum & 0xFU].total_length = 0U; - - /* Send ZLP */ - (void)USBD_LL_Transmit(pdev, epnum, NULL, 0U); - } - else - { - hcdc->TxState = 0U; - - if (((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->TransmitCplt != NULL) - { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->TransmitCplt(hcdc->TxBuffer, &hcdc->TxLength, epnum); - } - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_DataOut - * Data received on non-control Out endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - /* Get the received data length */ - hcdc->RxLength = USBD_LL_GetRxDataSize(pdev, epnum); - - /* USB data will be immediately processed, this allow next USB traffic being - NAKed till the end of the application Xfer */ - - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Receive(hcdc->RxBuffer, &hcdc->RxLength); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_EP0_RxReady - * Handle EP0 Rx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if ((pdev->pUserData[pdev->classId] != NULL) && (hcdc->CmdOpCode != 0xFFU)) - { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(hcdc->CmdOpCode, - (uint8_t *)hcdc->data, - (uint16_t)hcdc->CmdLength); - hcdc->CmdOpCode = 0xFFU; - } - - return (uint8_t)USBD_OK; -} -#ifndef USE_USBD_COMPOSITE -/** - * @brief USBD_CDC_GetFSCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_CMD_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_OUT_EP); - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_IN_EP); - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CDC_FS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE; - } - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE; - } - - *length = (uint16_t)sizeof(USBD_CDC_CfgDesc); - return USBD_CDC_CfgDesc; -} - -/** - * @brief USBD_CDC_GetHSCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_CMD_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_OUT_EP); - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_IN_EP); - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CDC_HS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CDC_DATA_HS_MAX_PACKET_SIZE; - } - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CDC_DATA_HS_MAX_PACKET_SIZE; - } - - *length = (uint16_t)sizeof(USBD_CDC_CfgDesc); - return USBD_CDC_CfgDesc; -} - -/** - * @brief USBD_CDC_GetOtherSpeedCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_CMD_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_OUT_EP); - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_IN_EP); - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CDC_FS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE; - } - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE; - } - - *length = (uint16_t)sizeof(USBD_CDC_CfgDesc); - return USBD_CDC_CfgDesc; -} - -/** - * @brief USBD_CDC_GetDeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_CDC_DeviceQualifierDesc); - - return USBD_CDC_DeviceQualifierDesc; -} -#endif /* USE_USBD_COMPOSITE */ -/** - * @brief USBD_CDC_RegisterInterface - * @param pdev: device instance - * @param fops: CD Interface callback - * @retval status - */ -uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CDC_ItfTypeDef *fops) -{ - if (fops == NULL) - { - return (uint8_t)USBD_FAIL; - } - - pdev->pUserData[pdev->classId] = fops; - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_SetTxBuffer - * @param pdev: device instance - * @param pbuff: Tx Buffer - * @param length: length of data to be sent - * @param ClassId: The Class ID - * @retval status - */ -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, - uint8_t *pbuff, uint32_t length, uint8_t ClassId) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[ClassId]; -#else -uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, - uint8_t *pbuff, uint32_t length) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#endif /* USE_USBD_COMPOSITE */ - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hcdc->TxBuffer = pbuff; - hcdc->TxLength = length; - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_SetRxBuffer - * @param pdev: device instance - * @param pbuff: Rx Buffer - * @retval status - */ -uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hcdc->RxBuffer = pbuff; - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_TransmitPacket - * Transmit packet on IN endpoint - * @param pdev: device instance - * @param ClassId: The Class ID - * @retval status - */ -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t ClassId) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[ClassId]; -#else -uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#endif /* USE_USBD_COMPOSITE */ - - USBD_StatusTypeDef ret = USBD_BUSY; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - CDCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, ClassId); -#endif /* USE_USBD_COMPOSITE */ - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if (hcdc->TxState == 0U) - { - /* Tx Transfer in progress */ - hcdc->TxState = 1U; - - /* Update the packet total length */ - pdev->ep_in[CDCInEpAdd & 0xFU].total_length = hcdc->TxLength; - - /* Transmit next packet */ - (void)USBD_LL_Transmit(pdev, CDCInEpAdd, hcdc->TxBuffer, hcdc->TxLength); - - ret = USBD_OK; - } - - return (uint8_t)ret; -} - -/** - * @brief USBD_CDC_ReceivePacket - * prepare OUT Endpoint for reception - * @param pdev: device instance - * @retval status - */ -uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev) -{ - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - CDCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer, - CDC_DATA_HS_OUT_PACKET_SIZE); - } - else - { - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer, - CDC_DATA_FS_OUT_PACKET_SIZE); - } - - return (uint8_t)USBD_OK; -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h b/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h deleted file mode 100644 index 4672921..0000000 --- a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h +++ /dev/null @@ -1,175 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_core.h - * @author MCD Application Team - * @brief Header file for usbd_core.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CORE_H -#define __USBD_CORE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" -#include "usbd_def.h" -#include "usbd_ioreq.h" -#include "usbd_ctlreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_CORE - * @brief This file is the Header file for usbd_core.c file - * @{ - */ - - -/** @defgroup USBD_CORE_Exported_Defines - * @{ - */ -#ifndef USBD_DEBUG_LEVEL -#define USBD_DEBUG_LEVEL 0U -#endif /* USBD_DEBUG_LEVEL */ -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ -#define USBD_SOF USBD_LL_SOF -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_FunctionsPrototype - * @{ - */ -USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id); -USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass); -#if (USBD_USER_REGISTER_CALLBACK == 1U) -USBD_StatusTypeDef USBD_RegisterDevStateCallback(USBD_HandleTypeDef *pdev, USBD_DevStateCallbackTypeDef pUserCallback); -#endif /* USBD_USER_REGISTER_CALLBACK */ - -#ifdef USE_USBD_COMPOSITE -USBD_StatusTypeDef USBD_RegisterClassComposite(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass, - USBD_CompositeClassTypeDef classtype, uint8_t *EpAddr); - -USBD_StatusTypeDef USBD_UnRegisterClassComposite(USBD_HandleTypeDef *pdev); -uint8_t USBD_CoreGetEPAdd(USBD_HandleTypeDef *pdev, uint8_t ep_dir, uint8_t ep_type, uint8_t ClassId); -#endif /* USE_USBD_COMPOSITE */ - -uint8_t USBD_CoreFindIF(USBD_HandleTypeDef *pdev, uint8_t index); -uint8_t USBD_CoreFindEP(USBD_HandleTypeDef *pdev, uint8_t index); - -USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); - -USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup); -USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); - -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); - -USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); - -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); - -/* USBD Low Level Driver */ -USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev); - -USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, - uint8_t ep_type, uint16_t ep_mps); - -USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr); - -USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, - uint8_t *pbuf, uint32_t size); - -USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, - uint8_t *pbuf, uint32_t size); - -#ifdef USBD_HS_TESTMODE_ENABLE -USBD_StatusTypeDef USBD_LL_SetTestMode(USBD_HandleTypeDef *pdev, uint8_t testmode); -#endif /* USBD_HS_TESTMODE_ENABLE */ - -uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); -uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr); - -void USBD_LL_Delay(uint32_t Delay); - -void *USBD_GetEpDesc(uint8_t *pConfDesc, uint8_t EpAddr); -USBD_DescHeaderTypeDef *USBD_GetNextDesc(uint8_t *pbuf, uint16_t *ptr); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CORE_H */ - -/** - * @} - */ - -/** - * @} - */ - - diff --git a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h b/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h deleted file mode 100644 index 6c45d6c..0000000 --- a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_req.h - * @author MCD Application Team - * @brief Header file for the usbd_req.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_REQUEST_H -#define __USB_REQUEST_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_REQ - * @brief header file for the usbd_req.c file - * @{ - */ - -/** @defgroup USBD_REQ_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_REQ_Exported_Types - * @{ - */ -/** - * @} - */ - - - -/** @defgroup USBD_REQ_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_REQ_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_REQ_Exported_FunctionsPrototype - * @{ - */ - -USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - -void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata); -void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_REQUEST_H */ - -/** - * @} - */ - -/** - * @} - */ - - diff --git a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h b/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h deleted file mode 100644 index 2a295d7..0000000 --- a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h +++ /dev/null @@ -1,523 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_def.h - * @author MCD Application Team - * @brief General defines for the usb device library - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_DEF_H -#define __USBD_DEF_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" - -/** @addtogroup STM32_USBD_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USB_DEF - * @brief general defines for the usb device library file - * @{ - */ - -/** @defgroup USB_DEF_Exported_Defines - * @{ - */ - -#ifndef NULL -#define NULL 0U -#endif /* NULL */ - -#ifndef USBD_MAX_NUM_INTERFACES -#define USBD_MAX_NUM_INTERFACES 1U -#endif /* USBD_MAX_NUM_CONFIGURATION */ - -#ifndef USBD_MAX_NUM_CONFIGURATION -#define USBD_MAX_NUM_CONFIGURATION 1U -#endif /* USBD_MAX_NUM_CONFIGURATION */ - -#ifdef USE_USBD_COMPOSITE -#ifndef USBD_MAX_SUPPORTED_CLASS -#define USBD_MAX_SUPPORTED_CLASS 4U -#endif /* USBD_MAX_SUPPORTED_CLASS */ -#else -#ifndef USBD_MAX_SUPPORTED_CLASS -#define USBD_MAX_SUPPORTED_CLASS 1U -#endif /* USBD_MAX_SUPPORTED_CLASS */ -#endif /* USE_USBD_COMPOSITE */ - -#ifndef USBD_MAX_CLASS_ENDPOINTS -#define USBD_MAX_CLASS_ENDPOINTS 5U -#endif /* USBD_MAX_CLASS_ENDPOINTS */ - -#ifndef USBD_MAX_CLASS_INTERFACES -#define USBD_MAX_CLASS_INTERFACES 5U -#endif /* USBD_MAX_CLASS_INTERFACES */ - -#ifndef USBD_LPM_ENABLED -#define USBD_LPM_ENABLED 0U -#endif /* USBD_LPM_ENABLED */ - -#ifndef USBD_SELF_POWERED -#define USBD_SELF_POWERED 1U -#endif /*USBD_SELF_POWERED */ - -#ifndef USBD_MAX_POWER -#define USBD_MAX_POWER 0x32U /* 100 mA */ -#endif /* USBD_MAX_POWER */ - -#ifndef USBD_SUPPORT_USER_STRING_DESC -#define USBD_SUPPORT_USER_STRING_DESC 0U -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - -#ifndef USBD_CLASS_USER_STRING_DESC -#define USBD_CLASS_USER_STRING_DESC 0U -#endif /* USBD_CLASS_USER_STRING_DESC */ - -#define USB_LEN_DEV_QUALIFIER_DESC 0x0AU -#define USB_LEN_DEV_DESC 0x12U -#define USB_LEN_CFG_DESC 0x09U -#define USB_LEN_IF_DESC 0x09U -#define USB_LEN_EP_DESC 0x07U -#define USB_LEN_OTG_DESC 0x03U -#define USB_LEN_LANGID_STR_DESC 0x04U -#define USB_LEN_OTHER_SPEED_DESC_SIZ 0x09U - -#define USBD_IDX_LANGID_STR 0x00U -#define USBD_IDX_MFC_STR 0x01U -#define USBD_IDX_PRODUCT_STR 0x02U -#define USBD_IDX_SERIAL_STR 0x03U -#define USBD_IDX_CONFIG_STR 0x04U -#define USBD_IDX_INTERFACE_STR 0x05U - -#define USB_REQ_TYPE_STANDARD 0x00U -#define USB_REQ_TYPE_CLASS 0x20U -#define USB_REQ_TYPE_VENDOR 0x40U -#define USB_REQ_TYPE_MASK 0x60U - -#define USB_REQ_RECIPIENT_DEVICE 0x00U -#define USB_REQ_RECIPIENT_INTERFACE 0x01U -#define USB_REQ_RECIPIENT_ENDPOINT 0x02U -#define USB_REQ_RECIPIENT_MASK 0x03U - -#define USB_REQ_GET_STATUS 0x00U -#define USB_REQ_CLEAR_FEATURE 0x01U -#define USB_REQ_SET_FEATURE 0x03U -#define USB_REQ_SET_ADDRESS 0x05U -#define USB_REQ_GET_DESCRIPTOR 0x06U -#define USB_REQ_SET_DESCRIPTOR 0x07U -#define USB_REQ_GET_CONFIGURATION 0x08U -#define USB_REQ_SET_CONFIGURATION 0x09U -#define USB_REQ_GET_INTERFACE 0x0AU -#define USB_REQ_SET_INTERFACE 0x0BU -#define USB_REQ_SYNCH_FRAME 0x0CU - -#define USB_DESC_TYPE_DEVICE 0x01U -#define USB_DESC_TYPE_CONFIGURATION 0x02U -#define USB_DESC_TYPE_STRING 0x03U -#define USB_DESC_TYPE_INTERFACE 0x04U -#define USB_DESC_TYPE_ENDPOINT 0x05U -#define USB_DESC_TYPE_DEVICE_QUALIFIER 0x06U -#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 0x07U -#define USB_DESC_TYPE_IAD 0x0BU -#define USB_DESC_TYPE_BOS 0x0FU - -#define USB_CONFIG_REMOTE_WAKEUP 0x02U -#define USB_CONFIG_SELF_POWERED 0x01U - -#define USB_FEATURE_EP_HALT 0x00U -#define USB_FEATURE_REMOTE_WAKEUP 0x01U -#define USB_FEATURE_TEST_MODE 0x02U - -#define USB_DEVICE_CAPABITY_TYPE 0x10U - -#define USB_CONF_DESC_SIZE 0x09U -#define USB_IF_DESC_SIZE 0x09U -#define USB_EP_DESC_SIZE 0x07U -#define USB_IAD_DESC_SIZE 0x08U - -#define USB_HS_MAX_PACKET_SIZE 512U -#define USB_FS_MAX_PACKET_SIZE 64U -#define USB_MAX_EP0_SIZE 64U - -/* Device Status */ -#define USBD_STATE_DEFAULT 0x01U -#define USBD_STATE_ADDRESSED 0x02U -#define USBD_STATE_CONFIGURED 0x03U -#define USBD_STATE_SUSPENDED 0x04U - - -/* EP0 State */ -#define USBD_EP0_IDLE 0x00U -#define USBD_EP0_SETUP 0x01U -#define USBD_EP0_DATA_IN 0x02U -#define USBD_EP0_DATA_OUT 0x03U -#define USBD_EP0_STATUS_IN 0x04U -#define USBD_EP0_STATUS_OUT 0x05U -#define USBD_EP0_STALL 0x06U - -#define USBD_EP_TYPE_CTRL 0x00U -#define USBD_EP_TYPE_ISOC 0x01U -#define USBD_EP_TYPE_BULK 0x02U -#define USBD_EP_TYPE_INTR 0x03U - -#ifdef USE_USBD_COMPOSITE -#define USBD_EP_IN 0x80U -#define USBD_EP_OUT 0x00U -#define USBD_FUNC_DESCRIPTOR_TYPE 0x24U -#define USBD_DESC_SUBTYPE_ACM 0x0FU -#define USBD_DESC_ECM_BCD_LOW 0x00U -#define USBD_DESC_ECM_BCD_HIGH 0x10U -#endif /* USE_USBD_COMPOSITE */ -/** - * @} - */ - - -/** @defgroup USBD_DEF_Exported_TypesDefinitions - * @{ - */ - -typedef struct usb_setup_req -{ - uint8_t bmRequest; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; -} USBD_SetupReqTypedef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t wTotalLength; - uint8_t bNumInterfaces; - uint8_t bConfigurationValue; - uint8_t iConfiguration; - uint8_t bmAttributes; - uint8_t bMaxPower; -} __PACKED USBD_ConfigDescTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t wTotalLength; - uint8_t bNumDeviceCaps; -} USBD_BosDescTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bEndpointAddress; - uint8_t bmAttributes; - uint16_t wMaxPacketSize; - uint8_t bInterval; -} __PACKED USBD_EpDescTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubType; -} USBD_DescHeaderTypeDef; - -struct _USBD_HandleTypeDef; - -typedef struct _Device_cb -{ - uint8_t (*Init)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); - uint8_t (*DeInit)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); - /* Control Endpoints*/ - uint8_t (*Setup)(struct _USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - uint8_t (*EP0_TxSent)(struct _USBD_HandleTypeDef *pdev); - uint8_t (*EP0_RxReady)(struct _USBD_HandleTypeDef *pdev); - /* Class Specific Endpoints*/ - uint8_t (*DataIn)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); - uint8_t (*DataOut)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); - uint8_t (*SOF)(struct _USBD_HandleTypeDef *pdev); - uint8_t (*IsoINIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); - uint8_t (*IsoOUTIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); - - uint8_t *(*GetHSConfigDescriptor)(uint16_t *length); - uint8_t *(*GetFSConfigDescriptor)(uint16_t *length); - uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length); - uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length); -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) - uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length); -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - -} USBD_ClassTypeDef; - -/* Following USB Device Speed */ -typedef enum -{ - USBD_SPEED_HIGH = 0U, - USBD_SPEED_FULL = 1U, - USBD_SPEED_LOW = 2U, -} USBD_SpeedTypeDef; - -/* Following USB Device status */ -typedef enum -{ - USBD_OK = 0U, - USBD_BUSY, - USBD_EMEM, - USBD_FAIL, -} USBD_StatusTypeDef; - -/* USB Device descriptors structure */ -typedef struct -{ - uint8_t *(*GetDeviceDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t *(*GetLangIDStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t *(*GetManufacturerStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t *(*GetProductStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t *(*GetSerialStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t *(*GetConfigurationStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t *(*GetInterfaceStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); -#if (USBD_CLASS_USER_STRING_DESC == 1) - uint8_t *(*GetUserStrDescriptor)(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); -#endif /* USBD_CLASS_USER_STRING_DESC */ -#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1)) - uint8_t *(*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); -#endif /* (USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1) */ -} USBD_DescriptorsTypeDef; - -/* USB Device handle structure */ -typedef struct -{ - uint32_t status; - uint32_t total_length; - uint32_t rem_length; - uint32_t maxpacket; - uint16_t is_used; - uint16_t bInterval; -} USBD_EndpointTypeDef; - -#ifdef USE_USBD_COMPOSITE -typedef enum -{ - CLASS_TYPE_NONE = 0, - CLASS_TYPE_HID = 1, - CLASS_TYPE_CDC = 2, - CLASS_TYPE_MSC = 3, - CLASS_TYPE_DFU = 4, - CLASS_TYPE_CHID = 5, - CLASS_TYPE_AUDIO = 6, - CLASS_TYPE_ECM = 7, - CLASS_TYPE_RNDIS = 8, - CLASS_TYPE_MTP = 9, - CLASS_TYPE_VIDEO = 10, - CLASS_TYPE_PRINTER = 11, - CLASS_TYPE_CCID = 12, -} USBD_CompositeClassTypeDef; - - -/* USB Device handle structure */ -typedef struct -{ - uint8_t add; - uint8_t type; - uint8_t size; - uint8_t is_used; -} USBD_EPTypeDef; - -/* USB Device handle structure */ -typedef struct -{ - USBD_CompositeClassTypeDef ClassType; - uint32_t ClassId; - uint32_t Active; - uint32_t NumEps; - USBD_EPTypeDef Eps[USBD_MAX_CLASS_ENDPOINTS]; - uint8_t *EpAdd; - uint32_t NumIf; - uint8_t Ifs[USBD_MAX_CLASS_INTERFACES]; - uint32_t CurrPcktSze; -} USBD_CompositeElementTypeDef; -#endif /* USE_USBD_COMPOSITE */ - -/* USB Device handle structure */ -typedef struct _USBD_HandleTypeDef -{ - uint8_t id; - uint32_t dev_config; - uint32_t dev_default_config; - uint32_t dev_config_status; - USBD_SpeedTypeDef dev_speed; - USBD_EndpointTypeDef ep_in[16]; - USBD_EndpointTypeDef ep_out[16]; - __IO uint32_t ep0_state; - uint32_t ep0_data_len; - __IO uint8_t dev_state; - __IO uint8_t dev_old_state; - uint8_t dev_address; - uint8_t dev_connection_status; - uint8_t dev_test_mode; - uint32_t dev_remote_wakeup; - uint8_t ConfIdx; - - USBD_SetupReqTypedef request; - USBD_DescriptorsTypeDef *pDesc; - USBD_ClassTypeDef *pClass[USBD_MAX_SUPPORTED_CLASS]; - void *pClassData; - void *pClassDataCmsit[USBD_MAX_SUPPORTED_CLASS]; - void *pUserData[USBD_MAX_SUPPORTED_CLASS]; - void *pData; - void *pBosDesc; - void *pConfDesc; - uint32_t classId; - uint32_t NumClasses; -#ifdef USE_USBD_COMPOSITE - USBD_CompositeElementTypeDef tclasslist[USBD_MAX_SUPPORTED_CLASS]; -#endif /* USE_USBD_COMPOSITE */ -#if (USBD_USER_REGISTER_CALLBACK == 1U) - void (* DevStateCallback)(uint8_t dev_state, uint8_t cfgidx); /*!< User Notification callback */ -#endif /* USBD_USER_REGISTER_CALLBACK */ -} USBD_HandleTypeDef; - -#if (USBD_USER_REGISTER_CALLBACK == 1U) -typedef void (*USBD_DevStateCallbackTypeDef)(uint8_t dev_state, uint8_t cfgidx); /*!< pointer to User callback function */ -#endif /* USBD_USER_REGISTER_CALLBACK */ - -/* USB Device endpoint direction */ -typedef enum -{ - OUT = 0x00, - IN = 0x80, -} USBD_EPDirectionTypeDef; - -typedef enum -{ - NETWORK_CONNECTION = 0x00, - RESPONSE_AVAILABLE = 0x01, - CONNECTION_SPEED_CHANGE = 0x2A -} USBD_CDC_NotifCodeTypeDef; -/** - * @} - */ - - - -/** @defgroup USBD_DEF_Exported_Macros - * @{ - */ -__STATIC_INLINE uint16_t SWAPBYTE(uint8_t *addr) -{ - uint16_t _SwapVal; - uint16_t _Byte1; - uint16_t _Byte2; - uint8_t *_pbuff = addr; - - _Byte1 = *(uint8_t *)_pbuff; - _pbuff++; - _Byte2 = *(uint8_t *)_pbuff; - - _SwapVal = (_Byte2 << 8) | _Byte1; - - return _SwapVal; -} - -#ifndef LOBYTE -#define LOBYTE(x) ((uint8_t)((x) & 0x00FFU)) -#endif /* LOBYTE */ - -#ifndef HIBYTE -#define HIBYTE(x) ((uint8_t)(((x) & 0xFF00U) >> 8U)) -#endif /* HIBYTE */ - -#ifndef MIN -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#endif /* MIN */ - -#ifndef MAX -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#endif /* MAX */ - -#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__ ) && !defined (__CC_ARM) /* GNU Compiler */ -#ifndef __ALIGN_END -#define __ALIGN_END __attribute__ ((aligned (4U))) -#endif /* __ALIGN_END */ -#ifndef __ALIGN_BEGIN -#define __ALIGN_BEGIN -#endif /* __ALIGN_BEGIN */ -#else -#ifndef __ALIGN_END -#define __ALIGN_END -#endif /* __ALIGN_END */ -#ifndef __ALIGN_BEGIN -#if defined (__CC_ARM) /* ARM Compiler */ -#define __ALIGN_BEGIN __align(4U) -#elif defined (__ICCARM__) /* IAR Compiler */ -#define __ALIGN_BEGIN -#endif /* __CC_ARM */ -#endif /* __ALIGN_BEGIN */ -#endif /* __GNUC__ */ - - -/** - * @} - */ - -/** @defgroup USBD_DEF_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_DEF_Exported_FunctionsPrototype - * @{ - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_DEF_H */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h b/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h deleted file mode 100644 index 15197b9..0000000 --- a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ioreq.h - * @author MCD Application Team - * @brief Header file for the usbd_ioreq.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_IOREQ_H -#define __USBD_IOREQ_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" -#include "usbd_core.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_IOREQ - * @brief header file for the usbd_ioreq.c file - * @{ - */ - -/** @defgroup USBD_IOREQ_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Exported_Types - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup USBD_IOREQ_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_IOREQ_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_IOREQ_Exported_FunctionsPrototype - * @{ - */ - -USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len); - -USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len); - -USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len); - -USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len); - -USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev); - -uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_IOREQ_H */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c b/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c deleted file mode 100644 index 0576c87..0000000 --- a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c +++ /dev/null @@ -1,1215 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_core.c - * @author MCD Application Team - * @brief This file provides all the USBD core functions. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" - -#ifdef USE_USBD_COMPOSITE -#include "usbd_composite_builder.h" -#endif /* USE_USBD_COMPOSITE */ - -/** @addtogroup STM32_USBD_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_CORE - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_CORE_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Private_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Private_Functions - * @{ - */ - -/** - * @brief USBD_Init - * Initialize the device stack and load the class driver - * @param pdev: device instance - * @param pdesc: Descriptor structure address - * @param id: Low level core index - * @retval status: USBD Status - */ -USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, - USBD_DescriptorsTypeDef *pdesc, uint8_t id) -{ - USBD_StatusTypeDef ret; - - /* Check whether the USB Host handle is valid */ - if (pdev == NULL) - { -#if (USBD_DEBUG_LEVEL > 1U) - USBD_ErrLog("Invalid Device handle"); -#endif /* (USBD_DEBUG_LEVEL > 1U) */ - return USBD_FAIL; - } - -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Unlink previous class*/ - pdev->pClass[i] = NULL; - pdev->pUserData[i] = NULL; - - /* Set class as inactive */ - pdev->tclasslist[i].Active = 0; - pdev->NumClasses = 0; - pdev->classId = 0; - } -#else - /* Unlink previous class*/ - pdev->pClass[0] = NULL; - pdev->pUserData[0] = NULL; -#endif /* USE_USBD_COMPOSITE */ - - pdev->pConfDesc = NULL; - - /* Assign USBD Descriptors */ - if (pdesc != NULL) - { - pdev->pDesc = pdesc; - } - - /* Set Device initial State */ - pdev->dev_state = USBD_STATE_DEFAULT; - pdev->id = id; - - /* Initialize low level driver */ - ret = USBD_LL_Init(pdev); - - return ret; -} - -/** - * @brief USBD_DeInit - * De-Initialize the device library - * @param pdev: device instance - * @retval status: USBD Status - */ -USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) -{ - USBD_StatusTypeDef ret; - - /* Disconnect the USB Device */ - (void)USBD_LL_Stop(pdev); - - /* Set Default State */ - pdev->dev_state = USBD_STATE_DEFAULT; - -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - pdev->classId = i; - /* Free Class Resources */ - pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config); - } - } - } -#else - /* Free Class Resources */ - if (pdev->pClass[0] != NULL) - { - pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config); - } - - pdev->pUserData[0] = NULL; - -#endif /* USE_USBD_COMPOSITE */ - - /* Free Device descriptors resources */ - pdev->pDesc = NULL; - pdev->pConfDesc = NULL; - - /* DeInitialize low level driver */ - ret = USBD_LL_DeInit(pdev); - - return ret; -} - -/** - * @brief USBD_RegisterClass - * Link class driver to Device Core. - * @param pdev: Device Handle - * @param pclass: Class handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) -{ - uint16_t len = 0U; - - if (pclass == NULL) - { -#if (USBD_DEBUG_LEVEL > 1U) - USBD_ErrLog("Invalid Class handle"); -#endif /* (USBD_DEBUG_LEVEL > 1U) */ - return USBD_FAIL; - } - - /* link the class to the USB Device handle */ - pdev->pClass[0] = pclass; - - /* Get Device Configuration Descriptor */ -#ifdef USE_USB_HS - if (pdev->pClass[pdev->classId]->GetHSConfigDescriptor != NULL) - { - pdev->pConfDesc = (void *)pdev->pClass[pdev->classId]->GetHSConfigDescriptor(&len); - } -#else /* Default USE_USB_FS */ - if (pdev->pClass[pdev->classId]->GetFSConfigDescriptor != NULL) - { - pdev->pConfDesc = (void *)pdev->pClass[pdev->classId]->GetFSConfigDescriptor(&len); - } -#endif /* USE_USB_FS */ - - /* Increment the NumClasses */ - pdev->NumClasses++; - - return USBD_OK; -} - -#ifdef USE_USBD_COMPOSITE -/** - * @brief USBD_RegisterClassComposite - * Link class driver to Device Core. - * @param pdev : Device Handle - * @param pclass: Class handle - * @param classtype: Class type - * @param EpAddr: Endpoint Address handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_RegisterClassComposite(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass, - USBD_CompositeClassTypeDef classtype, uint8_t *EpAddr) -{ - USBD_StatusTypeDef ret = USBD_OK; - uint16_t len = 0U; - - if ((pdev->classId < USBD_MAX_SUPPORTED_CLASS) && (pdev->NumClasses < USBD_MAX_SUPPORTED_CLASS)) - { - if ((uint32_t)pclass != 0U) - { - /* Link the class to the USB Device handle */ - pdev->pClass[pdev->classId] = pclass; - ret = USBD_OK; - - pdev->tclasslist[pdev->classId].EpAdd = EpAddr; - - /* Call the composite class builder */ - (void)USBD_CMPSIT_AddClass(pdev, pclass, classtype, 0); - - /* Increment the ClassId for the next occurrence */ - pdev->classId ++; - pdev->NumClasses ++; - } - else - { -#if (USBD_DEBUG_LEVEL > 1U) - USBD_ErrLog("Invalid Class handle"); -#endif /* (USBD_DEBUG_LEVEL > 1U) */ - ret = USBD_FAIL; - } - } - - if (ret == USBD_OK) - { - /* Get Device Configuration Descriptor */ -#ifdef USE_USB_HS - pdev->pConfDesc = USBD_CMPSIT.GetHSConfigDescriptor(&len); -#else /* Default USE_USB_FS */ - pdev->pConfDesc = USBD_CMPSIT.GetFSConfigDescriptor(&len); -#endif /* USE_USB_FS */ - } - - return ret; -} - -/** - * @brief USBD_UnRegisterClassComposite - * UnLink all composite class drivers from Device Core. - * @param pdev: Device Handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_UnRegisterClassComposite(USBD_HandleTypeDef *pdev) -{ - USBD_StatusTypeDef ret = USBD_FAIL; - uint8_t idx1; - uint8_t idx2; - - /* Unroll all activated classes */ - for (idx1 = 0; idx1 < pdev->NumClasses; idx1++) - { - /* Check if the class correspond to the requested type and if it is active */ - if (pdev->tclasslist[idx1].Active == 1U) - { - /* Set the new class ID */ - pdev->classId = idx1; - - /* Free resources used by the selected class */ - if (pdev->pClass[pdev->classId] != NULL) - { - /* Free Class Resources */ - if (pdev->pClass[pdev->classId]->DeInit(pdev, (uint8_t)pdev->dev_config) != 0U) - { -#if (USBD_DEBUG_LEVEL > 1U) - USBD_ErrLog("Class DeInit didn't succeed!, can't unregister selected class"); -#endif /* (USBD_DEBUG_LEVEL > 1U) */ - - ret = USBD_FAIL; - } - } - - /* Free the class pointer */ - pdev->pClass[pdev->classId] = NULL; - - /* Free the class location in classes table and reset its parameters to zero */ - pdev->tclasslist[pdev->classId].ClassType = CLASS_TYPE_NONE; - pdev->tclasslist[pdev->classId].ClassId = 0U; - pdev->tclasslist[pdev->classId].Active = 0U; - pdev->tclasslist[pdev->classId].NumEps = 0U; - pdev->tclasslist[pdev->classId].NumIf = 0U; - pdev->tclasslist[pdev->classId].CurrPcktSze = 0U; - - for (idx2 = 0U; idx2 < USBD_MAX_CLASS_ENDPOINTS; idx2++) - { - pdev->tclasslist[pdev->classId].Eps[idx2].add = 0U; - pdev->tclasslist[pdev->classId].Eps[idx2].type = 0U; - pdev->tclasslist[pdev->classId].Eps[idx2].size = 0U; - pdev->tclasslist[pdev->classId].Eps[idx2].is_used = 0U; - } - - for (idx2 = 0U; idx2 < USBD_MAX_CLASS_INTERFACES; idx2++) - { - pdev->tclasslist[pdev->classId].Ifs[idx2] = 0U; - } - } - } - - /* Reset the configuration descriptor */ - (void)USBD_CMPST_ClearConfDesc(pdev); - - /* Reset the class ID and number of classes */ - pdev->classId = 0U; - pdev->NumClasses = 0U; - - return ret; -} -#endif /* USE_USBD_COMPOSITE */ - -#if (USBD_USER_REGISTER_CALLBACK == 1U) -/** - * @brief USBD_RegisterDevStateCallback - * @param pdev : Device Handle - * @param pUserCallback: User Callback - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_RegisterDevStateCallback(USBD_HandleTypeDef *pdev, USBD_DevStateCallbackTypeDef pUserCallback) -{ - pdev->DevStateCallback = pUserCallback; - - return USBD_OK; -} -#endif /* USBD_USER_REGISTER_CALLBACK */ - -/** - * @brief USBD_Start - * Start the USB Device Core. - * @param pdev: Device Handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev) -{ -#ifdef USE_USBD_COMPOSITE - pdev->classId = 0U; -#endif /* USE_USBD_COMPOSITE */ - - /* Start the low level driver */ - return USBD_LL_Start(pdev); -} - -/** - * @brief USBD_Stop - * Stop the USB Device Core. - * @param pdev: Device Handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev) -{ - /* Disconnect USB Device */ - (void)USBD_LL_Stop(pdev); - - /* Free Class Resources */ -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - pdev->classId = i; - /* Free Class Resources */ - (void)pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config); - } - } - } - - /* Reset the class ID */ - pdev->classId = 0U; -#else - if (pdev->pClass[0] != NULL) - { - (void)pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config); - } -#endif /* USE_USBD_COMPOSITE */ - - return USBD_OK; -} - -/** - * @brief USBD_RunTestMode - * Launch test mode process - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev) -{ -#ifdef USBD_HS_TESTMODE_ENABLE - USBD_StatusTypeDef ret; - - /* Run USB HS test mode */ - ret = USBD_LL_SetTestMode(pdev, pdev->dev_test_mode); - - return ret; -#else - /* Prevent unused argument compilation warning */ - UNUSED(pdev); - - return USBD_OK; -#endif /* USBD_HS_TESTMODE_ENABLE */ -} - -/** - * @brief USBD_SetClassConfig - * Configure device and start the interface - * @param pdev: device instance - * @param cfgidx: configuration index - * @retval status - */ - -USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - USBD_StatusTypeDef ret = USBD_OK; - -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - pdev->classId = i; - /* Set configuration and Start the Class*/ - if (pdev->pClass[i]->Init(pdev, cfgidx) != 0U) - { - ret = USBD_FAIL; - } - } - } - } -#else - if (pdev->pClass[0] != NULL) - { - /* Set configuration and Start the Class */ - ret = (USBD_StatusTypeDef)pdev->pClass[0]->Init(pdev, cfgidx); - } -#endif /* USE_USBD_COMPOSITE */ - - return ret; -} - -/** - * @brief USBD_ClrClassConfig - * Clear current configuration - * @param pdev: device instance - * @param cfgidx: configuration index - * @retval status - */ -USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - USBD_StatusTypeDef ret = USBD_OK; - -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - pdev->classId = i; - /* Clear configuration and De-initialize the Class process */ - if (pdev->pClass[i]->DeInit(pdev, cfgidx) != 0U) - { - ret = USBD_FAIL; - } - } - } - } -#else - /* Clear configuration and De-initialize the Class process */ - if (pdev->pClass[0]->DeInit(pdev, cfgidx) != 0U) - { - ret = USBD_FAIL; - } -#endif /* USE_USBD_COMPOSITE */ - - return ret; -} - - -/** - * @brief USBD_LL_SetupStage - * Handle the setup stage - * @param pdev: device instance - * @param psetup: setup packet buffer pointer - * @retval status - */ -USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) -{ - USBD_StatusTypeDef ret; - - USBD_ParseSetupRequest(&pdev->request, psetup); - - pdev->ep0_state = USBD_EP0_SETUP; - - pdev->ep0_data_len = pdev->request.wLength; - - switch (pdev->request.bmRequest & 0x1FU) - { - case USB_REQ_RECIPIENT_DEVICE: - ret = USBD_StdDevReq(pdev, &pdev->request); - break; - - case USB_REQ_RECIPIENT_INTERFACE: - ret = USBD_StdItfReq(pdev, &pdev->request); - break; - - case USB_REQ_RECIPIENT_ENDPOINT: - ret = USBD_StdEPReq(pdev, &pdev->request); - break; - - default: - ret = USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U)); - break; - } - - return ret; -} - -/** - * @brief USBD_LL_DataOutStage - * Handle data OUT stage - * @param pdev: device instance - * @param epnum: endpoint index - * @param pdata: data pointer - * @retval status - */ -USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, - uint8_t epnum, uint8_t *pdata) -{ - USBD_EndpointTypeDef *pep; - USBD_StatusTypeDef ret = USBD_OK; - uint8_t idx; - - if (epnum == 0U) - { - pep = &pdev->ep_out[0]; - - if (pdev->ep0_state == USBD_EP0_DATA_OUT) - { - if (pep->rem_length > pep->maxpacket) - { - pep->rem_length -= pep->maxpacket; - - (void)USBD_CtlContinueRx(pdev, pdata, MIN(pep->rem_length, pep->maxpacket)); - } - else - { - /* Find the class ID relative to the current request */ - switch (pdev->request.bmRequest & 0x1FU) - { - case USB_REQ_RECIPIENT_DEVICE: - /* Device requests must be managed by the first instantiated class - (or duplicated by all classes for simplicity) */ - idx = 0U; - break; - - case USB_REQ_RECIPIENT_INTERFACE: - idx = USBD_CoreFindIF(pdev, LOBYTE(pdev->request.wIndex)); - break; - - case USB_REQ_RECIPIENT_ENDPOINT: - idx = USBD_CoreFindEP(pdev, LOBYTE(pdev->request.wIndex)); - break; - - default: - /* Back to the first class in case of doubt */ - idx = 0U; - break; - } - - if (idx < USBD_MAX_SUPPORTED_CLASS) - { - /* Setup the class ID and route the request to the relative class function */ - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass[idx]->EP0_RxReady != NULL) - { - pdev->classId = idx; - pdev->pClass[idx]->EP0_RxReady(pdev); - } - } - } - - (void)USBD_CtlSendStatus(pdev); - } - } - } - else - { - /* Get the class index relative to this interface */ - idx = USBD_CoreFindEP(pdev, (epnum & 0x7FU)); - - if (((uint16_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS)) - { - /* Call the class data out function to manage the request */ - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass[idx]->DataOut != NULL) - { - pdev->classId = idx; - ret = (USBD_StatusTypeDef)pdev->pClass[idx]->DataOut(pdev, epnum); - } - } - if (ret != USBD_OK) - { - return ret; - } - } - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_DataInStage - * Handle data in stage - * @param pdev: device instance - * @param epnum: endpoint index - * @param pdata: data pointer - * @retval status - */ -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, - uint8_t epnum, uint8_t *pdata) -{ - USBD_EndpointTypeDef *pep; - USBD_StatusTypeDef ret; - uint8_t idx; - - if (epnum == 0U) - { - pep = &pdev->ep_in[0]; - - if (pdev->ep0_state == USBD_EP0_DATA_IN) - { - if (pep->rem_length > pep->maxpacket) - { - pep->rem_length -= pep->maxpacket; - - (void)USBD_CtlContinueSendData(pdev, pdata, pep->rem_length); - - /* Prepare endpoint for premature end of transfer */ - (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); - } - else - { - /* last packet is MPS multiple, so send ZLP packet */ - if ((pep->maxpacket == pep->rem_length) && - (pep->total_length >= pep->maxpacket) && - (pep->total_length < pdev->ep0_data_len)) - { - (void)USBD_CtlContinueSendData(pdev, NULL, 0U); - pdev->ep0_data_len = 0U; - - /* Prepare endpoint for premature end of transfer */ - (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); - } - else - { - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass[0]->EP0_TxSent != NULL) - { - pdev->classId = 0U; - pdev->pClass[0]->EP0_TxSent(pdev); - } - } - (void)USBD_LL_StallEP(pdev, 0x80U); - (void)USBD_CtlReceiveStatus(pdev); - } - } - } - - if (pdev->dev_test_mode != 0U) - { - (void)USBD_RunTestMode(pdev); - pdev->dev_test_mode = 0U; - } - } - else - { - /* Get the class index relative to this interface */ - idx = USBD_CoreFindEP(pdev, ((uint8_t)epnum | 0x80U)); - - if (((uint16_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS)) - { - /* Call the class data out function to manage the request */ - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass[idx]->DataIn != NULL) - { - pdev->classId = idx; - ret = (USBD_StatusTypeDef)pdev->pClass[idx]->DataIn(pdev, epnum); - - if (ret != USBD_OK) - { - return ret; - } - } - } - } - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_Reset - * Handle Reset event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) -{ - USBD_StatusTypeDef ret = USBD_OK; - - /* Upon Reset call user call back */ - pdev->dev_state = USBD_STATE_DEFAULT; - pdev->ep0_state = USBD_EP0_IDLE; - pdev->dev_config = 0U; - pdev->dev_remote_wakeup = 0U; - pdev->dev_test_mode = 0U; - -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - pdev->classId = i; - /* Clear configuration and De-initialize the Class process*/ - - if (pdev->pClass[i]->DeInit != NULL) - { - if (pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config) != USBD_OK) - { - ret = USBD_FAIL; - } - } - } - } - } -#else - - if (pdev->pClass[0] != NULL) - { - if (pdev->pClass[0]->DeInit != NULL) - { - if (pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config) != USBD_OK) - { - ret = USBD_FAIL; - } - } - } -#endif /* USE_USBD_COMPOSITE */ - - /* Open EP0 OUT */ - (void)USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); - pdev->ep_out[0x00U & 0xFU].is_used = 1U; - - pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; - - /* Open EP0 IN */ - (void)USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); - pdev->ep_in[0x80U & 0xFU].is_used = 1U; - - pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; - - return ret; -} - -/** - * @brief USBD_LL_SetSpeed - * Handle Reset event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, - USBD_SpeedTypeDef speed) -{ - pdev->dev_speed = speed; - - return USBD_OK; -} - -/** - * @brief USBD_LL_Suspend - * Handle Suspend event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) -{ - if (pdev->dev_state != USBD_STATE_SUSPENDED) - { - pdev->dev_old_state = pdev->dev_state; - } - - pdev->dev_state = USBD_STATE_SUSPENDED; - - return USBD_OK; -} - -/** - * @brief USBD_LL_Resume - * Handle Resume event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) -{ - if (pdev->dev_state == USBD_STATE_SUSPENDED) - { - pdev->dev_state = pdev->dev_old_state; - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_SOF - * Handle SOF event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) -{ - /* The SOF event can be distributed for all classes that support it */ - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - if (pdev->pClass[i]->SOF != NULL) - { - pdev->classId = i; - (void)pdev->pClass[i]->SOF(pdev); - } - } - } - } -#else - if (pdev->pClass[0] != NULL) - { - if (pdev->pClass[0]->SOF != NULL) - { - (void)pdev->pClass[0]->SOF(pdev); - } - } -#endif /* USE_USBD_COMPOSITE */ - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_IsoINIncomplete - * Handle iso in incomplete event - * @param pdev: device instance - * @param epnum: Endpoint number - * @retval status - */ -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, - uint8_t epnum) -{ - if (pdev->pClass[pdev->classId] == NULL) - { - return USBD_FAIL; - } - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass[pdev->classId]->IsoINIncomplete != NULL) - { - (void)pdev->pClass[pdev->classId]->IsoINIncomplete(pdev, epnum); - } - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_IsoOUTIncomplete - * Handle iso out incomplete event - * @param pdev: device instance - * @param epnum: Endpoint number - * @retval status - */ -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, - uint8_t epnum) -{ - if (pdev->pClass[pdev->classId] == NULL) - { - return USBD_FAIL; - } - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass[pdev->classId]->IsoOUTIncomplete != NULL) - { - (void)pdev->pClass[pdev->classId]->IsoOUTIncomplete(pdev, epnum); - } - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_DevConnected - * Handle device connection event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) -{ - /* Prevent unused argument compilation warning */ - UNUSED(pdev); - - return USBD_OK; -} - -/** - * @brief USBD_LL_DevDisconnected - * Handle device disconnection event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) -{ - USBD_StatusTypeDef ret = USBD_OK; - - /* Free Class Resources */ - pdev->dev_state = USBD_STATE_DEFAULT; - -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - if (pdev->pClass[i] != NULL) - { - pdev->classId = i; - /* Clear configuration and De-initialize the Class process*/ - if (pdev->pClass[i]->DeInit(pdev, (uint8_t)pdev->dev_config) != 0U) - { - ret = USBD_FAIL; - } - } - } - } -#else - if (pdev->pClass[0] != NULL) - { - if (pdev->pClass[0]->DeInit(pdev, (uint8_t)pdev->dev_config) != 0U) - { - ret = USBD_FAIL; - } - } -#endif /* USE_USBD_COMPOSITE */ - - return ret; -} - -/** - * @brief USBD_CoreFindIF - * return the class index relative to the selected interface - * @param pdev: device instance - * @param index : selected interface number - * @retval index of the class using the selected interface number. OxFF if no class found. - */ -uint8_t USBD_CoreFindIF(USBD_HandleTypeDef *pdev, uint8_t index) -{ -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - /* Parse all interfaces listed in the current class */ - for (uint32_t j = 0U; j < pdev->tclasslist[i].NumIf; j++) - { - /* Check if requested Interface matches the current class interface */ - if (pdev->tclasslist[i].Ifs[j] == index) - { - if (pdev->pClass[i]->Setup != NULL) - { - return (uint8_t)i; - } - } - } - } - } - - return 0xFFU; -#else - UNUSED(pdev); - UNUSED(index); - - return 0x00U; -#endif /* USE_USBD_COMPOSITE */ -} - -/** - * @brief USBD_CoreFindEP - * return the class index relative to the selected endpoint - * @param pdev: device instance - * @param index : selected endpoint number - * @retval index of the class using the selected endpoint number. 0xFF if no class found. - */ -uint8_t USBD_CoreFindEP(USBD_HandleTypeDef *pdev, uint8_t index) -{ -#ifdef USE_USBD_COMPOSITE - /* Parse the table of classes in use */ - for (uint32_t i = 0U; i < USBD_MAX_SUPPORTED_CLASS; i++) - { - /* Check if current class is in use */ - if ((pdev->tclasslist[i].Active) == 1U) - { - /* Parse all endpoints listed in the current class */ - for (uint32_t j = 0U; j < pdev->tclasslist[i].NumEps; j++) - { - /* Check if requested endpoint matches the current class endpoint */ - if (pdev->tclasslist[i].Eps[j].add == index) - { - if (pdev->pClass[i]->Setup != NULL) - { - return (uint8_t)i; - } - } - } - } - } - - return 0xFFU; -#else - UNUSED(pdev); - UNUSED(index); - - return 0x00U; -#endif /* USE_USBD_COMPOSITE */ -} - -#ifdef USE_USBD_COMPOSITE -/** - * @brief USBD_CoreGetEPAdd - * Get the endpoint address relative to a selected class - * @param pdev: device instance - * @param ep_dir: USBD_EP_IN or USBD_EP_OUT - * @param ep_type: USBD_EP_TYPE_CTRL, USBD_EP_TYPE_ISOC, USBD_EP_TYPE_BULK or USBD_EP_TYPE_INTR - * @param ClassId: The Class ID - * @retval Address of the selected endpoint or 0xFFU if no endpoint found. - */ -uint8_t USBD_CoreGetEPAdd(USBD_HandleTypeDef *pdev, uint8_t ep_dir, uint8_t ep_type, uint8_t ClassId) -{ - uint8_t idx; - - /* Find the EP address in the selected class table */ - for (idx = 0; idx < pdev->tclasslist[ClassId].NumEps; idx++) - { - if (((pdev->tclasslist[ClassId].Eps[idx].add & USBD_EP_IN) == ep_dir) && \ - (pdev->tclasslist[ClassId].Eps[idx].type == ep_type) && \ - (pdev->tclasslist[ClassId].Eps[idx].is_used != 0U)) - { - return (pdev->tclasslist[ClassId].Eps[idx].add); - } - } - - /* If reaching this point, then no endpoint was found */ - return 0xFFU; -} -#endif /* USE_USBD_COMPOSITE */ - -/** - * @brief USBD_GetEpDesc - * This function return the Endpoint descriptor - * @param pdev: device instance - * @param pConfDesc: pointer to Bos descriptor - * @param EpAddr: endpoint address - * @retval pointer to video endpoint descriptor - */ -void *USBD_GetEpDesc(uint8_t *pConfDesc, uint8_t EpAddr) -{ - USBD_DescHeaderTypeDef *pdesc = (USBD_DescHeaderTypeDef *)(void *)pConfDesc; - USBD_ConfigDescTypeDef *desc = (USBD_ConfigDescTypeDef *)(void *)pConfDesc; - USBD_EpDescTypeDef *pEpDesc = NULL; - uint16_t ptr; - - if (desc->wTotalLength > desc->bLength) - { - ptr = desc->bLength; - - while (ptr < desc->wTotalLength) - { - pdesc = USBD_GetNextDesc((uint8_t *)pdesc, &ptr); - - if (pdesc->bDescriptorType == USB_DESC_TYPE_ENDPOINT) - { - pEpDesc = (USBD_EpDescTypeDef *)(void *)pdesc; - - if (pEpDesc->bEndpointAddress == EpAddr) - { - break; - } - else - { - pEpDesc = NULL; - } - } - } - } - - return (void *)pEpDesc; -} - -/** - * @brief USBD_GetNextDesc - * This function return the next descriptor header - * @param buf: Buffer where the descriptor is available - * @param ptr: data pointer inside the descriptor - * @retval next header - */ -USBD_DescHeaderTypeDef *USBD_GetNextDesc(uint8_t *pbuf, uint16_t *ptr) -{ - USBD_DescHeaderTypeDef *pnext = (USBD_DescHeaderTypeDef *)(void *)pbuf; - - *ptr += pnext->bLength; - pnext = (USBD_DescHeaderTypeDef *)(void *)(pbuf + pnext->bLength); - - return (pnext); -} - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - diff --git a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c b/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c deleted file mode 100644 index 814b810..0000000 --- a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c +++ /dev/null @@ -1,1058 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_req.c - * @author MCD Application Team - * @brief This file provides the standard USB requests following chapter 9. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ctlreq.h" -#include "usbd_ioreq.h" - -#ifdef USE_USBD_COMPOSITE -#include "usbd_composite_builder.h" -#endif /* USE_USBD_COMPOSITE */ - -/** @addtogroup STM32_USBD_STATE_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_REQ - * @brief USB standard requests module - * @{ - */ - -/** @defgroup USBD_REQ_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Defines - * @{ - */ -#ifndef USBD_MAX_STR_DESC_SIZ -#define USBD_MAX_STR_DESC_SIZ 64U -#endif /* USBD_MAX_STR_DESC_SIZ */ -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_FunctionPrototypes - * @{ - */ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_GetLen(uint8_t *buf); - -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Functions - * @{ - */ - - -/** - * @brief USBD_StdDevReq - * Handle standard usb device requests - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_StatusTypeDef ret = USBD_OK; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - case USB_REQ_TYPE_VENDOR: - ret = (USBD_StatusTypeDef)pdev->pClass[pdev->classId]->Setup(pdev, req); - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_DESCRIPTOR: - USBD_GetDescriptor(pdev, req); - break; - - case USB_REQ_SET_ADDRESS: - USBD_SetAddress(pdev, req); - break; - - case USB_REQ_SET_CONFIGURATION: - ret = USBD_SetConfig(pdev, req); - break; - - case USB_REQ_GET_CONFIGURATION: - USBD_GetConfig(pdev, req); - break; - - case USB_REQ_GET_STATUS: - USBD_GetStatus(pdev, req); - break; - - case USB_REQ_SET_FEATURE: - USBD_SetFeature(pdev, req); - break; - - case USB_REQ_CLEAR_FEATURE: - USBD_ClrFeature(pdev, req); - break; - - default: - USBD_CtlError(pdev, req); - break; - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } - - return ret; -} - -/** - * @brief USBD_StdItfReq - * Handle standard usb interface requests - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_StatusTypeDef ret = USBD_OK; - uint8_t idx; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - case USB_REQ_TYPE_VENDOR: - case USB_REQ_TYPE_STANDARD: - switch (pdev->dev_state) - { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - - if (LOBYTE(req->wIndex) <= USBD_MAX_NUM_INTERFACES) - { - /* Get the class index relative to this interface */ - idx = USBD_CoreFindIF(pdev, LOBYTE(req->wIndex)); - if (((uint8_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS)) - { - /* Call the class data out function to manage the request */ - if (pdev->pClass[idx]->Setup != NULL) - { - pdev->classId = idx; - ret = (USBD_StatusTypeDef)(pdev->pClass[idx]->Setup(pdev, req)); - } - else - { - /* should never reach this condition */ - ret = USBD_FAIL; - } - } - else - { - /* No relative interface found */ - ret = USBD_FAIL; - } - - if ((req->wLength == 0U) && (ret == USBD_OK)) - { - (void)USBD_CtlSendStatus(pdev); - } - } - else - { - USBD_CtlError(pdev, req); - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } - - return ret; -} - -/** - * @brief USBD_StdEPReq - * Handle standard usb endpoint requests - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_EndpointTypeDef *pep; - uint8_t ep_addr; - uint8_t idx; - USBD_StatusTypeDef ret = USBD_OK; - - ep_addr = LOBYTE(req->wIndex); - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - case USB_REQ_TYPE_VENDOR: - /* Get the class index relative to this endpoint */ - idx = USBD_CoreFindEP(pdev, ep_addr); - if (((uint8_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS)) - { - pdev->classId = idx; - /* Call the class data out function to manage the request */ - if (pdev->pClass[idx]->Setup != NULL) - { - ret = (USBD_StatusTypeDef)pdev->pClass[idx]->Setup(pdev, req); - } - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_SET_FEATURE: - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) - { - (void)USBD_LL_StallEP(pdev, ep_addr); - (void)USBD_LL_StallEP(pdev, 0x80U); - } - else - { - USBD_CtlError(pdev, req); - } - break; - - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_EP_HALT) - { - if ((ep_addr != 0x00U) && (ep_addr != 0x80U) && (req->wLength == 0x00U)) - { - (void)USBD_LL_StallEP(pdev, ep_addr); - } - } - (void)USBD_CtlSendStatus(pdev); - - break; - - default: - USBD_CtlError(pdev, req); - break; - } - break; - - case USB_REQ_CLEAR_FEATURE: - - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) - { - (void)USBD_LL_StallEP(pdev, ep_addr); - (void)USBD_LL_StallEP(pdev, 0x80U); - } - else - { - USBD_CtlError(pdev, req); - } - break; - - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_EP_HALT) - { - if ((ep_addr & 0x7FU) != 0x00U) - { - (void)USBD_LL_ClearStallEP(pdev, ep_addr); - } - (void)USBD_CtlSendStatus(pdev); - - /* Get the class index relative to this interface */ - idx = USBD_CoreFindEP(pdev, ep_addr); - if (((uint8_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS)) - { - pdev->classId = idx; - /* Call the class data out function to manage the request */ - if (pdev->pClass[idx]->Setup != NULL) - { - ret = (USBD_StatusTypeDef)(pdev->pClass[idx]->Setup(pdev, req)); - } - } - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } - break; - - case USB_REQ_GET_STATUS: - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) - { - USBD_CtlError(pdev, req); - break; - } - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ - &pdev->ep_out[ep_addr & 0x7FU]; - - pep->status = 0x0000U; - - (void)USBD_CtlSendData(pdev, (uint8_t *)&pep->status, 2U); - break; - - case USBD_STATE_CONFIGURED: - if ((ep_addr & 0x80U) == 0x80U) - { - if (pdev->ep_in[ep_addr & 0xFU].is_used == 0U) - { - USBD_CtlError(pdev, req); - break; - } - } - else - { - if (pdev->ep_out[ep_addr & 0xFU].is_used == 0U) - { - USBD_CtlError(pdev, req); - break; - } - } - - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ - &pdev->ep_out[ep_addr & 0x7FU]; - - if ((ep_addr == 0x00U) || (ep_addr == 0x80U)) - { - pep->status = 0x0000U; - } - else if (USBD_LL_IsStallEP(pdev, ep_addr) != 0U) - { - pep->status = 0x0001U; - } - else - { - pep->status = 0x0000U; - } - - (void)USBD_CtlSendData(pdev, (uint8_t *)&pep->status, 2U); - break; - - default: - USBD_CtlError(pdev, req); - break; - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } - - return ret; -} - - -/** - * @brief USBD_GetDescriptor - * Handle Get Descriptor requests - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - uint16_t len = 0U; - uint8_t *pbuf = NULL; - uint8_t err = 0U; - - switch (req->wValue >> 8) - { -#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1U)) - case USB_DESC_TYPE_BOS: - if (pdev->pDesc->GetBOSDescriptor != NULL) - { - pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; -#endif /* (USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1U) */ - case USB_DESC_TYPE_DEVICE: - pbuf = pdev->pDesc->GetDeviceDescriptor(pdev->dev_speed, &len); - break; - - case USB_DESC_TYPE_CONFIGURATION: - if (pdev->dev_speed == USBD_SPEED_HIGH) - { -#ifdef USE_USBD_COMPOSITE - if ((uint8_t)(pdev->NumClasses) > 0U) - { - pbuf = (uint8_t *)USBD_CMPSIT.GetHSConfigDescriptor(&len); - } - else -#endif /* USE_USBD_COMPOSITE */ - { - pbuf = (uint8_t *)pdev->pClass[0]->GetHSConfigDescriptor(&len); - } - pbuf[1] = USB_DESC_TYPE_CONFIGURATION; - } - else - { -#ifdef USE_USBD_COMPOSITE - if ((uint8_t)(pdev->NumClasses) > 0U) - { - pbuf = (uint8_t *)USBD_CMPSIT.GetFSConfigDescriptor(&len); - } - else -#endif /* USE_USBD_COMPOSITE */ - { - pbuf = (uint8_t *)pdev->pClass[0]->GetFSConfigDescriptor(&len); - } - pbuf[1] = USB_DESC_TYPE_CONFIGURATION; - } - break; - - case USB_DESC_TYPE_STRING: - switch ((uint8_t)(req->wValue)) - { - case USBD_IDX_LANGID_STR: - if (pdev->pDesc->GetLangIDStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - case USBD_IDX_MFC_STR: - if (pdev->pDesc->GetManufacturerStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - case USBD_IDX_PRODUCT_STR: - if (pdev->pDesc->GetProductStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - case USBD_IDX_SERIAL_STR: - if (pdev->pDesc->GetSerialStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - case USBD_IDX_CONFIG_STR: - if (pdev->pDesc->GetConfigurationStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - case USBD_IDX_INTERFACE_STR: - if (pdev->pDesc->GetInterfaceStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - default: -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) - pbuf = NULL; - - for (uint32_t idx = 0U; (idx < pdev->NumClasses); idx++) - { - if (pdev->pClass[idx]->GetUsrStrDescriptor != NULL) - { - pdev->classId = idx; - pbuf = pdev->pClass[idx]->GetUsrStrDescriptor(pdev, LOBYTE(req->wValue), &len); - - if (pbuf == NULL) /* This means that no class recognized the string index */ - { - continue; - } - else - { - break; - } - } - } -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - -#if (USBD_CLASS_USER_STRING_DESC == 1U) - if (pdev->pDesc->GetUserStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetUserStrDescriptor(pdev->dev_speed, LOBYTE(req->wValue), &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - -#if ((USBD_CLASS_USER_STRING_DESC == 0U) && (USBD_SUPPORT_USER_STRING_DESC == 0U)) - USBD_CtlError(pdev, req); - err++; -#endif /* (USBD_CLASS_USER_STRING_DESC == 0U) && (USBD_SUPPORT_USER_STRING_DESC == 0U) */ - break; - } - break; - - case USB_DESC_TYPE_DEVICE_QUALIFIER: - if (pdev->dev_speed == USBD_SPEED_HIGH) - { -#ifdef USE_USBD_COMPOSITE - if ((uint8_t)(pdev->NumClasses) > 0U) - { - pbuf = (uint8_t *)USBD_CMPSIT.GetDeviceQualifierDescriptor(&len); - } - else -#endif /* USE_USBD_COMPOSITE */ - { - pbuf = (uint8_t *)pdev->pClass[0]->GetDeviceQualifierDescriptor(&len); - } - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: - if (pdev->dev_speed == USBD_SPEED_HIGH) - { -#ifdef USE_USBD_COMPOSITE - if ((uint8_t)(pdev->NumClasses) > 0U) - { - pbuf = (uint8_t *)USBD_CMPSIT.GetOtherSpeedConfigDescriptor(&len); - } - else -#endif /* USE_USBD_COMPOSITE */ - { - pbuf = (uint8_t *)pdev->pClass[0]->GetOtherSpeedConfigDescriptor(&len); - } - pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; - - default: - USBD_CtlError(pdev, req); - err++; - break; - } - - if (err != 0U) - { - return; - } - - if (req->wLength != 0U) - { - if (len != 0U) - { - len = MIN(len, req->wLength); - (void)USBD_CtlSendData(pdev, pbuf, len); - } - else - { - USBD_CtlError(pdev, req); - } - } - else - { - (void)USBD_CtlSendStatus(pdev); - } -} - - -/** - * @brief USBD_SetAddress - * Set device address - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - uint8_t dev_addr; - - if ((req->wIndex == 0U) && (req->wLength == 0U) && (req->wValue < 128U)) - { - dev_addr = (uint8_t)(req->wValue) & 0x7FU; - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - USBD_CtlError(pdev, req); - } - else - { - pdev->dev_address = dev_addr; - (void)USBD_LL_SetUSBAddress(pdev, dev_addr); - (void)USBD_CtlSendStatus(pdev); - - if (dev_addr != 0U) - { - pdev->dev_state = USBD_STATE_ADDRESSED; - } - else - { - pdev->dev_state = USBD_STATE_DEFAULT; - } - } - } - else - { - USBD_CtlError(pdev, req); - } -} - -/** - * @brief USBD_SetConfig - * Handle Set device configuration request - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_StatusTypeDef ret = USBD_OK; - static uint8_t cfgidx; - - cfgidx = (uint8_t)(req->wValue); - - if (cfgidx > USBD_MAX_NUM_CONFIGURATION) - { - USBD_CtlError(pdev, req); - return USBD_FAIL; - } - - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if (cfgidx != 0U) - { - pdev->dev_config = cfgidx; - - ret = USBD_SetClassConfig(pdev, cfgidx); - - if (ret != USBD_OK) - { - USBD_CtlError(pdev, req); - pdev->dev_state = USBD_STATE_ADDRESSED; - } - else - { - (void)USBD_CtlSendStatus(pdev); - pdev->dev_state = USBD_STATE_CONFIGURED; - -#if (USBD_USER_REGISTER_CALLBACK == 1U) - if (pdev->DevStateCallback != NULL) - { - pdev->DevStateCallback(USBD_STATE_CONFIGURED, cfgidx); - } -#endif /* USBD_USER_REGISTER_CALLBACK */ - } - } - else - { - (void)USBD_CtlSendStatus(pdev); - } - break; - - case USBD_STATE_CONFIGURED: - if (cfgidx == 0U) - { - pdev->dev_state = USBD_STATE_ADDRESSED; - pdev->dev_config = cfgidx; - (void)USBD_ClrClassConfig(pdev, cfgidx); - (void)USBD_CtlSendStatus(pdev); - } - else if (cfgidx != pdev->dev_config) - { - /* Clear old configuration */ - (void)USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); - - /* set new configuration */ - pdev->dev_config = cfgidx; - - ret = USBD_SetClassConfig(pdev, cfgidx); - - if (ret != USBD_OK) - { - USBD_CtlError(pdev, req); - (void)USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); - pdev->dev_state = USBD_STATE_ADDRESSED; - } - else - { - (void)USBD_CtlSendStatus(pdev); - } - } - else - { - (void)USBD_CtlSendStatus(pdev); - } - break; - - default: - USBD_CtlError(pdev, req); - (void)USBD_ClrClassConfig(pdev, cfgidx); - ret = USBD_FAIL; - break; - } - - return ret; -} - -/** - * @brief USBD_GetConfig - * Handle Get device configuration request - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - if (req->wLength != 1U) - { - USBD_CtlError(pdev, req); - } - else - { - switch (pdev->dev_state) - { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - pdev->dev_default_config = 0U; - (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_default_config, 1U); - break; - - case USBD_STATE_CONFIGURED: - (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_config, 1U); - break; - - default: - USBD_CtlError(pdev, req); - break; - } - } -} - -/** - * @brief USBD_GetStatus - * Handle Get Status request - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - switch (pdev->dev_state) - { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - if (req->wLength != 0x2U) - { - USBD_CtlError(pdev, req); - break; - } - -#if (USBD_SELF_POWERED == 1U) - pdev->dev_config_status = USB_CONFIG_SELF_POWERED; -#else - pdev->dev_config_status = 0U; -#endif /* USBD_SELF_POWERED */ - - if (pdev->dev_remote_wakeup != 0U) - { - pdev->dev_config_status |= USB_CONFIG_REMOTE_WAKEUP; - } - - (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_config_status, 2U); - break; - - default: - USBD_CtlError(pdev, req); - break; - } -} - - -/** - * @brief USBD_SetFeature - * Handle Set device feature request - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev_remote_wakeup = 1U; - (void)USBD_CtlSendStatus(pdev); - } - else if (req->wValue == USB_FEATURE_TEST_MODE) - { - pdev->dev_test_mode = (uint8_t)(req->wIndex >> 8); - (void)USBD_CtlSendStatus(pdev); - } - else - { - USBD_CtlError(pdev, req); - } -} - - -/** - * @brief USBD_ClrFeature - * Handle clear device feature request - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - switch (pdev->dev_state) - { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev_remote_wakeup = 0U; - (void)USBD_CtlSendStatus(pdev); - } - break; - - default: - USBD_CtlError(pdev, req); - break; - } -} - - -/** - * @brief USBD_ParseSetupRequest - * Copy buffer into setup structure - * @param req: usb request - * @param pdata: setup data pointer - * @retval None - */ -void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) -{ - uint8_t *pbuff = pdata; - - req->bmRequest = *(uint8_t *)(pbuff); - - pbuff++; - req->bRequest = *(uint8_t *)(pbuff); - - pbuff++; - req->wValue = SWAPBYTE(pbuff); - - pbuff++; - pbuff++; - req->wIndex = SWAPBYTE(pbuff); - - pbuff++; - pbuff++; - req->wLength = SWAPBYTE(pbuff); -} - - -/** - * @brief USBD_CtlError - * Handle USB low level Error - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - UNUSED(req); - - (void)USBD_LL_StallEP(pdev, 0x80U); - (void)USBD_LL_StallEP(pdev, 0U); -} - - -/** - * @brief USBD_GetString - * Convert Ascii string into unicode one - * @param desc : descriptor buffer - * @param unicode : Formatted string buffer (unicode) - * @param len : descriptor length - * @retval None - */ -void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) -{ - uint8_t idx = 0U; - uint8_t *pdesc; - - if (desc == NULL) - { - return; - } - - pdesc = desc; - *len = MIN(USBD_MAX_STR_DESC_SIZ, ((uint16_t)USBD_GetLen(pdesc) * 2U) + 2U); - - unicode[idx] = *(uint8_t *)len; - idx++; - unicode[idx] = USB_DESC_TYPE_STRING; - idx++; - - while (*pdesc != (uint8_t)'\0') - { - unicode[idx] = *pdesc; - pdesc++; - idx++; - - unicode[idx] = 0U; - idx++; - } -} - - -/** - * @brief USBD_GetLen - * return the string length - * @param buf : pointer to the ascii string buffer - * @retval string length - */ -static uint8_t USBD_GetLen(uint8_t *buf) -{ - uint8_t len = 0U; - uint8_t *pbuff = buf; - - while (*pbuff != (uint8_t)'\0') - { - len++; - pbuff++; - } - - return len; -} -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - diff --git a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c b/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c deleted file mode 100644 index 7c8004a..0000000 --- a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c +++ /dev/null @@ -1,224 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ioreq.c - * @author MCD Application Team - * @brief This file provides the IO requests APIs for control endpoints. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_IOREQ - * @brief control I/O requests module - * @{ - */ - -/** @defgroup USBD_IOREQ_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_FunctionPrototypes - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_Functions - * @{ - */ - -/** - * @brief USBD_CtlSendData - * send data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be sent - * @retval status - */ -USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len) -{ - /* Set EP0 State */ - pdev->ep0_state = USBD_EP0_DATA_IN; - pdev->ep_in[0].total_length = len; - -#ifdef USBD_AVOID_PACKET_SPLIT_MPS - pdev->ep_in[0].rem_length = 0U; -#else - pdev->ep_in[0].rem_length = len; -#endif /* USBD_AVOID_PACKET_SPLIT_MPS */ - - /* Start the transfer */ - (void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); - - return USBD_OK; -} - -/** - * @brief USBD_CtlContinueSendData - * continue sending data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be sent - * @retval status - */ -USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len) -{ - /* Start the next transfer */ - (void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); - - return USBD_OK; -} - -/** - * @brief USBD_CtlPrepareRx - * receive data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be received - * @retval status - */ -USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len) -{ - /* Set EP0 State */ - pdev->ep0_state = USBD_EP0_DATA_OUT; - pdev->ep_out[0].total_length = len; - -#ifdef USBD_AVOID_PACKET_SPLIT_MPS - pdev->ep_out[0].rem_length = 0U; -#else - pdev->ep_out[0].rem_length = len; -#endif /* USBD_AVOID_PACKET_SPLIT_MPS */ - - /* Start the transfer */ - (void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); - - return USBD_OK; -} - -/** - * @brief USBD_CtlContinueRx - * continue receive data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be received - * @retval status - */ -USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint32_t len) -{ - (void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); - - return USBD_OK; -} - -/** - * @brief USBD_CtlSendStatus - * send zero lzngth packet on the ctl pipe - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev) -{ - /* Set EP0 State */ - pdev->ep0_state = USBD_EP0_STATUS_IN; - - /* Start the transfer */ - (void)USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); - - return USBD_OK; -} - -/** - * @brief USBD_CtlReceiveStatus - * receive zero lzngth packet on the ctl pipe - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev) -{ - /* Set EP0 State */ - pdev->ep0_state = USBD_EP0_STATUS_OUT; - - /* Start the transfer */ - (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); - - return USBD_OK; -} - -/** - * @brief USBD_GetRxCount - * returns the received data length - * @param pdev: device instance - * @param ep_addr: endpoint address - * @retval Rx Data blength - */ -uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - return USBD_LL_GetRxDataSize(pdev, ep_addr); -} - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - diff --git a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/LICENSE.txt b/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/LICENSE.txt deleted file mode 100644 index e66295c..0000000 --- a/software/bootloader/Middlewares/ST/STM32_USB_Device_Library/LICENSE.txt +++ /dev/null @@ -1,86 +0,0 @@ -This software component is provided to you as part of a software package and -applicable license terms are in the Package_license file. If you received this -software component outside of a package or without applicable license terms, -the terms of the SLA0044 license shall apply and are fully reproduced below: - -SLA0044 Rev5/February 2018 - -Software license agreement - -ULTIMATE LIBERTY SOFTWARE LICENSE AGREEMENT - -BY INSTALLING, COPYING, DOWNLOADING, ACCESSING OR OTHERWISE USING THIS SOFTWARE -OR ANY PART THEREOF (AND THE RELATED DOCUMENTATION) FROM STMICROELECTRONICS -INTERNATIONAL N.V, SWISS BRANCH AND/OR ITS AFFILIATED COMPANIES -(STMICROELECTRONICS), THE RECIPIENT, ON BEHALF OF HIMSELF OR HERSELF, OR ON -BEHALF OF ANY ENTITY BY WHICH SUCH RECIPIENT IS EMPLOYED AND/OR ENGAGED AGREES -TO BE BOUND BY THIS SOFTWARE LICENSE AGREEMENT. - -Under STMicroelectronics’ intellectual property rights, the redistribution, -reproduction and use in source and binary forms of the software or any part -thereof, with or without modification, are permitted provided that the following -conditions are met: - -1. Redistribution of source code (modified or not) must retain any copyright -notice, this list of conditions and the disclaimer set forth below as items 10 -and 11. - -2. Redistributions in binary form, except as embedded into microcontroller or -microprocessor device manufactured by or for STMicroelectronics or a software -update for such device, must reproduce any copyright notice provided with the -binary code, this list of conditions, and the disclaimer set forth below as -items 10 and 11, in documentation and/or other materials provided with the -distribution. - -3. Neither the name of STMicroelectronics nor the names of other contributors to -this software may be used to endorse or promote products derived from this -software or part thereof without specific written permission. - -4. This software or any part thereof, including modifications and/or derivative -works of this software, must be used and execute solely and exclusively on or in -combination with a microcontroller or microprocessor device manufactured by or -for STMicroelectronics. - -5. No use, reproduction or redistribution of this software partially or totally -may be done in any manner that would subject this software to any Open Source -Terms. “Open Source Terms” shall mean any open source license which requires as -part of distribution of software that the source code of such software is -distributed therewith or otherwise made available, or open source license that -substantially complies with the Open Source definition specified at -www.opensource.org and any other comparable open source license such as for -example GNU General Public License (GPL), Eclipse Public License (EPL), Apache -Software License, BSD license or MIT license. - -6. STMicroelectronics has no obligation to provide any maintenance, support or -updates for the software. - -7. The software is and will remain the exclusive property of STMicroelectronics -and its licensors. The recipient will not take any action that jeopardizes -STMicroelectronics and its licensors' proprietary rights or acquire any rights -in the software, except the limited rights specified hereunder. - -8. The recipient shall comply with all applicable laws and regulations affecting -the use of the software or any part thereof including any applicable export -control law or regulation. - -9. Redistribution and use of this software or any part thereof other than as -permitted under this license is void and will automatically terminate your -rights under this license. - -10. THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS, WHICH ARE -DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT SHALL -STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -11. EXCEPT AS EXPRESSLY PERMITTED HEREUNDER, NO LICENSE OR OTHER RIGHTS, WHETHER -EXPRESS OR IMPLIED, ARE GRANTED UNDER ANY PATENT OR OTHER INTELLECTUAL PROPERTY -RIGHTS OF STMICROELECTRONICS OR ANY THIRD PARTY. - diff --git a/software/bootloader/SYSTEM/delay.c b/software/bootloader/SYSTEM/delay.c deleted file mode 100644 index 5bc438a..0000000 --- a/software/bootloader/SYSTEM/delay.c +++ /dev/null @@ -1,92 +0,0 @@ -#include "delay.h" -#include "sys.h" - -/* -//roughly delay -void delay_us(u32 nus) -{ - u32 i; - u16 temp; - temp = nus*SYS_CLK/15; - for(i=0;iLOAD; - ticks=nus*SYS_CLK; - delay_osschedlock(); - told=SysTick->VAL; - while(1) - { - tnow=SysTick->VAL; - if(tnow!=told) - { - if(tnow=ticks)break; - } - }; - delay_osschedunlock(); -} - -void delay_ms(u16 nms) -{ - if(delay_osrunning&&delay_osintnesting==0) - { - if(nms>=fac_ms) - { - delay_ostimedly(nms/fac_ms); - } - nms%=fac_ms; - } - delay_us((u32)(nms*1000)); -} -#else - -void delay_us(u32 nus) -{ - u32 ticks; - u32 told,tnow,tcnt=0; - u32 reload=SysTick->LOAD; - ticks=nus*SYS_CLK; - told=SysTick->VAL; - while(1) - { - tnow=SysTick->VAL; - if(tnow!=told) - { - if(tnow=ticks)break; - } - } -} - -void delay_ms(u16 nms) -{ - u32 i; - for(i=0;iTxState != 0){ - return USBD_BUSY; - } - USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len); - result = USBD_CDC_TransmitPacket(&hUsbDeviceFS); - /* USER CODE END 7 */ - return result; -} - -/** - * @brief CDC_TransmitCplt_FS - * Data transmitted callback - * - * @note - * This function is IN transfer complete callback used to inform user that - * the submitted Data is successfully sent over USB. - * - * @param Buf: Buffer of data to be received - * @param Len: Number of data received (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum) -{ - uint8_t result = USBD_OK; - /* USER CODE BEGIN 13 */ - UNUSED(Buf); - UNUSED(Len); - UNUSED(epnum); - /* USER CODE END 13 */ - return result; -} - -/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */ - -/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/software/bootloader/USB_DEVICE/App/usbd_cdc_if.h b/software/bootloader/USB_DEVICE/App/usbd_cdc_if.h deleted file mode 100644 index 8ecf494..0000000 --- a/software/bootloader/USB_DEVICE/App/usbd_cdc_if.h +++ /dev/null @@ -1,132 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usbd_cdc_if.h - * @version : v1.0_Cube - * @brief : Header for usbd_cdc_if.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ - -#ifndef __USBD_CDC_IF_H__ -#define __USBD_CDC_IF_H__ - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc.h" - -/* USER CODE BEGIN INCLUDE */ - -/* USER CODE END INCLUDE */ - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @brief For Usb device. - * @{ - */ - -/** @defgroup USBD_CDC_IF USBD_CDC_IF - * @brief Usb VCP device module - * @{ - */ - -/** @defgroup USBD_CDC_IF_Exported_Defines USBD_CDC_IF_Exported_Defines - * @brief Defines. - * @{ - */ -/* Define size for the receive and transmit buffer over CDC */ -#define APP_RX_DATA_SIZE 2048 -#define APP_TX_DATA_SIZE 2048 -/* USER CODE BEGIN EXPORTED_DEFINES */ -#define RING_BUFFER_SIZE 2048 // 2KB 缓冲区,足够 -/* USER CODE END EXPORTED_DEFINES */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Exported_Types USBD_CDC_IF_Exported_Types - * @brief Types. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_TYPES */ - -/* USER CODE END EXPORTED_TYPES */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Exported_Macros USBD_CDC_IF_Exported_Macros - * @brief Aliases. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_MACRO */ - -/* USER CODE END EXPORTED_MACRO */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables - * @brief Public variables. - * @{ - */ - -/** CDC Interface callback. */ -extern USBD_CDC_ItfTypeDef USBD_Interface_fops_FS; - -/* USER CODE BEGIN EXPORTED_VARIABLES */ - -/* USER CODE END EXPORTED_VARIABLES */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Exported_FunctionsPrototype USBD_CDC_IF_Exported_FunctionsPrototype - * @brief Public functions declaration. - * @{ - */ - -uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len); - -/* USER CODE BEGIN EXPORTED_FUNCTIONS */ - -/* USER CODE END EXPORTED_FUNCTIONS */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CDC_IF_H__ */ - diff --git a/software/bootloader/USB_DEVICE/App/usbd_desc.c b/software/bootloader/USB_DEVICE/App/usbd_desc.c deleted file mode 100644 index fed3574..0000000 --- a/software/bootloader/USB_DEVICE/App/usbd_desc.c +++ /dev/null @@ -1,445 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : App/usbd_desc.c - * @version : v1.0_Cube - * @brief : This file implements the USB device descriptors. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" -#include "usbd_desc.h" -#include "usbd_conf.h" - -/* USER CODE BEGIN INCLUDE */ - -/* USER CODE END INCLUDE */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ - -/* USER CODE BEGIN PV */ -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE END PV */ - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @addtogroup USBD_DESC - * @{ - */ - -/** @defgroup USBD_DESC_Private_TypesDefinitions USBD_DESC_Private_TypesDefinitions - * @brief Private types. - * @{ - */ - -/* USER CODE BEGIN PRIVATE_TYPES */ - -/* USER CODE END PRIVATE_TYPES */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Defines USBD_DESC_Private_Defines - * @brief Private defines. - * @{ - */ - -#define USBD_VID 1155 -#define USBD_LANGID_STRING 1033 -#define USBD_MANUFACTURER_STRING "STMicroelectronics" -#define USBD_PID_FS 22336 -#define USBD_PRODUCT_STRING_FS "STM32 Virtual ComPort" -#define USBD_CONFIGURATION_STRING_FS "CDC Config" -#define USBD_INTERFACE_STRING_FS "CDC Interface" - -#define USB_SIZ_BOS_DESC 0x0C - -/* USER CODE BEGIN PRIVATE_DEFINES */ - -/* USER CODE END PRIVATE_DEFINES */ - -/** - * @} - */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/** @defgroup USBD_DESC_Private_Macros USBD_DESC_Private_Macros - * @brief Private macros. - * @{ - */ - -/* USER CODE BEGIN PRIVATE_MACRO */ - -/* USER CODE END PRIVATE_MACRO */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes - * @brief Private functions declaration. - * @{ - */ - -static void Get_SerialNum(void); -static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len); - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes - * @brief Private functions declaration for FS. - * @{ - */ - -uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -#if (USBD_LPM_ENABLED == 1) -uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); -#endif /* (USBD_LPM_ENABLED == 1) */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables - * @brief Private variables. - * @{ - */ - -USBD_DescriptorsTypeDef FS_Desc = -{ - USBD_FS_DeviceDescriptor -, USBD_FS_LangIDStrDescriptor -, USBD_FS_ManufacturerStrDescriptor -, USBD_FS_ProductStrDescriptor -, USBD_FS_SerialStrDescriptor -, USBD_FS_ConfigStrDescriptor -, USBD_FS_InterfaceStrDescriptor -#if (USBD_LPM_ENABLED == 1) -, USBD_FS_USR_BOSDescriptor -#endif /* (USBD_LPM_ENABLED == 1) */ -}; - -#if defined ( __ICCARM__ ) /* IAR Compiler */ - #pragma data_alignment=4 -#endif /* defined ( __ICCARM__ ) */ -/** USB standard device descriptor. */ -__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = -{ - 0x12, /*bLength */ - USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ -#if (USBD_LPM_ENABLED == 1) - 0x01, /*bcdUSB */ /* changed to USB version 2.01 - in order to support LPM L1 suspend - resume test of USBCV3.0*/ -#else - 0x00, /*bcdUSB */ -#endif /* (USBD_LPM_ENABLED == 1) */ - 0x02, - 0x02, /*bDeviceClass*/ - 0x02, /*bDeviceSubClass*/ - 0x00, /*bDeviceProtocol*/ - USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ - LOBYTE(USBD_VID), /*idVendor*/ - HIBYTE(USBD_VID), /*idVendor*/ - LOBYTE(USBD_PID_FS), /*idProduct*/ - HIBYTE(USBD_PID_FS), /*idProduct*/ - 0x00, /*bcdDevice rel. 2.00*/ - 0x02, - USBD_IDX_MFC_STR, /*Index of manufacturer string*/ - USBD_IDX_PRODUCT_STR, /*Index of product string*/ - USBD_IDX_SERIAL_STR, /*Index of serial number string*/ - USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/ -}; - -/* USB_DeviceDescriptor */ -/** BOS descriptor. */ -#if (USBD_LPM_ENABLED == 1) -#if defined ( __ICCARM__ ) /* IAR Compiler */ - #pragma data_alignment=4 -#endif /* defined ( __ICCARM__ ) */ -__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END = -{ - 0x5, - USB_DESC_TYPE_BOS, - 0xC, - 0x0, - 0x1, /* 1 device capability*/ - /* device capability*/ - 0x7, - USB_DEVICE_CAPABITY_TYPE, - 0x2, - 0x2, /* LPM capability bit set*/ - 0x0, - 0x0, - 0x0 -}; -#endif /* (USBD_LPM_ENABLED == 1) */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables - * @brief Private variables. - * @{ - */ - -#if defined ( __ICCARM__ ) /* IAR Compiler */ - #pragma data_alignment=4 -#endif /* defined ( __ICCARM__ ) */ - -/** USB lang identifier descriptor. */ -__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = -{ - USB_LEN_LANGID_STR_DESC, - USB_DESC_TYPE_STRING, - LOBYTE(USBD_LANGID_STRING), - HIBYTE(USBD_LANGID_STRING) -}; - -#if defined ( __ICCARM__ ) /* IAR Compiler */ - #pragma data_alignment=4 -#endif /* defined ( __ICCARM__ ) */ -/* Internal string descriptor. */ -__ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END; - -#if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 -#endif -__ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] __ALIGN_END = { - USB_SIZ_STRING_SERIAL, - USB_DESC_TYPE_STRING, -}; - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Functions USBD_DESC_Private_Functions - * @brief Private functions. - * @{ - */ - -/** - * @brief Return the device descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_FS_DeviceDesc); - return USBD_FS_DeviceDesc; -} - -/** - * @brief Return the LangID string descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_LangIDDesc); - return USBD_LangIDDesc; -} - -/** - * @brief Return the product string descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - if(speed == 0) - { - USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); - } - else - { - USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); - } - return USBD_StrDesc; -} - -/** - * @brief Return the manufacturer string descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); - return USBD_StrDesc; -} - -/** - * @brief Return the serial number string descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = USB_SIZ_STRING_SERIAL; - - /* Update the serial number string descriptor with the data from the unique - * ID */ - Get_SerialNum(); - /* USER CODE BEGIN USBD_FS_SerialStrDescriptor */ - - /* USER CODE END USBD_FS_SerialStrDescriptor */ - return (uint8_t *) USBD_StringSerial; -} - -/** - * @brief Return the configuration string descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - if(speed == USBD_SPEED_HIGH) - { - USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); - } - else - { - USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); - } - return USBD_StrDesc; -} - -/** - * @brief Return the interface string descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - if(speed == 0) - { - USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); - } - else - { - USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); - } - return USBD_StrDesc; -} - -#if (USBD_LPM_ENABLED == 1) -/** - * @brief Return the BOS descriptor - * @param speed : Current device speed - * @param length : Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_FS_BOSDesc); - return (uint8_t*)USBD_FS_BOSDesc; -} -#endif /* (USBD_LPM_ENABLED == 1) */ - -/** - * @brief Create the serial number string descriptor - * @param None - * @retval None - */ -static void Get_SerialNum(void) -{ - uint32_t deviceserial0; - uint32_t deviceserial1; - uint32_t deviceserial2; - - deviceserial0 = *(uint32_t *) DEVICE_ID1; - deviceserial1 = *(uint32_t *) DEVICE_ID2; - deviceserial2 = *(uint32_t *) DEVICE_ID3; - - deviceserial0 += deviceserial2; - - if (deviceserial0 != 0) - { - IntToUnicode(deviceserial0, &USBD_StringSerial[2], 8); - IntToUnicode(deviceserial1, &USBD_StringSerial[18], 4); - } -} - -/** - * @brief Convert Hex 32Bits value into char - * @param value: value to convert - * @param pbuf: pointer to the buffer - * @param len: buffer length - * @retval None - */ -static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len) -{ - uint8_t idx = 0; - - for (idx = 0; idx < len; idx++) - { - if (((value >> 28)) < 0xA) - { - pbuf[2 * idx] = (value >> 28) + '0'; - } - else - { - pbuf[2 * idx] = (value >> 28) + 'A' - 10; - } - - value = value << 4; - - pbuf[2 * idx + 1] = 0; - } -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/software/bootloader/USB_DEVICE/App/usbd_desc.h b/software/bootloader/USB_DEVICE/App/usbd_desc.h deleted file mode 100644 index fcef0ca..0000000 --- a/software/bootloader/USB_DEVICE/App/usbd_desc.h +++ /dev/null @@ -1,143 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usbd_desc.c - * @version : v1.0_Cube - * @brief : Header for usbd_conf.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_DESC__C__ -#define __USBD_DESC__C__ - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" - -/* USER CODE BEGIN INCLUDE */ - -/* USER CODE END INCLUDE */ - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_DESC USBD_DESC - * @brief Usb device descriptors module. - * @{ - */ - -/** @defgroup USBD_DESC_Exported_Constants USBD_DESC_Exported_Constants - * @brief Constants. - * @{ - */ -#define DEVICE_ID1 (UID_BASE) -#define DEVICE_ID2 (UID_BASE + 0x4) -#define DEVICE_ID3 (UID_BASE + 0x8) - -#define USB_SIZ_STRING_SERIAL 0x1A - -/* USER CODE BEGIN EXPORTED_CONSTANTS */ - -/* USER CODE END EXPORTED_CONSTANTS */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_Defines USBD_DESC_Exported_Defines - * @brief Defines. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_DEFINES */ - -/* USER CODE END EXPORTED_DEFINES */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_TypesDefinitions USBD_DESC_Exported_TypesDefinitions - * @brief Types. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_TYPES */ - -/* USER CODE END EXPORTED_TYPES */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_Macros USBD_DESC_Exported_Macros - * @brief Aliases. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_MACRO */ - -/* USER CODE END EXPORTED_MACRO */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_Variables USBD_DESC_Exported_Variables - * @brief Public variables. - * @{ - */ - -/** Descriptor for the Usb device. */ -extern USBD_DescriptorsTypeDef FS_Desc; - -/* USER CODE BEGIN EXPORTED_VARIABLES */ - -/* USER CODE END EXPORTED_VARIABLES */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_FunctionsPrototype USBD_DESC_Exported_FunctionsPrototype - * @brief Public functions declaration. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_FUNCTIONS */ - -/* USER CODE END EXPORTED_FUNCTIONS */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_DESC__C__ */ - diff --git a/software/bootloader/USB_DEVICE/Target/usbd_conf.c b/software/bootloader/USB_DEVICE/Target/usbd_conf.c deleted file mode 100644 index 7eb141b..0000000 --- a/software/bootloader/USB_DEVICE/Target/usbd_conf.c +++ /dev/null @@ -1,693 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : Target/usbd_conf.c - * @version : v1.0_Cube - * @brief : This file implements the board support package for the USB device library - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" -#include "stm32f4xx_hal.h" -#include "usbd_def.h" -#include "usbd_core.h" - -#include "usbd_cdc.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ - -/* USER CODE BEGIN PV */ -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE END PV */ - -PCD_HandleTypeDef hpcd_USB_OTG_FS; -void Error_Handler(void); - -/* External functions --------------------------------------------------------*/ -void SystemClock_Config(void); - -/* USER CODE BEGIN 0 */ - -/** - * @brief Manually simulates a USB device disconnection by pulling D+ low. - * @retval None - */ -void USER_USBD_LL_Simulate_Disconnect(void) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - // 1. 确保 GPIOA 时钟已使能 - __HAL_RCC_GPIOA_CLK_ENABLE(); - - // 2. 将 PA12 (USB_DP) 配置为推挽输出 - GPIO_InitStruct.Pin = GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - // 3. 强制将 PA12 输出低电平,拉低 D+ - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET); -} - -/* USER CODE END 0 */ - -/* USER CODE BEGIN PFP */ -/* Private function prototypes -----------------------------------------------*/ -USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status); - -/* USER CODE END PFP */ - -/* Private functions ---------------------------------------------------------*/ - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/******************************************************************************* - LL Driver Callbacks (PCD -> USB Device Library) -*******************************************************************************/ -/* MSP Init */ - -void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(pcdHandle->Instance==USB_OTG_FS) - { - /* USER CODE BEGIN USB_OTG_FS_MspInit 0 */ - - /* USER CODE END USB_OTG_FS_MspInit 0 */ - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**USB_OTG_FS GPIO Configuration - PA11 ------> USB_OTG_FS_DM - PA12 ------> USB_OTG_FS_DP - */ - GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* Peripheral clock enable */ - __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); - - /* Peripheral interrupt init */ - HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(OTG_FS_IRQn); - /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */ - - /* USER CODE END USB_OTG_FS_MspInit 1 */ - } -} - -void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle) -{ - if(pcdHandle->Instance==USB_OTG_FS) - { - /* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */ - - /* USER CODE END USB_OTG_FS_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_USB_OTG_FS_CLK_DISABLE(); - - /**USB_OTG_FS GPIO Configuration - PA11 ------> USB_OTG_FS_DM - PA12 ------> USB_OTG_FS_DP - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12); - - /* Peripheral interrupt Deinit*/ - HAL_NVIC_DisableIRQ(OTG_FS_IRQn); - - /* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */ - - /* USER CODE END USB_OTG_FS_MspDeInit 1 */ - } -} - -/** - * @brief Setup stage callback - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t *)hpcd->Setup); -} - -/** - * @brief Data Out stage callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint number - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#else -void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); -} - -/** - * @brief Data In stage callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint number - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#else -void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); -} - -/** - * @brief SOF callback. - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_SOFCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData); -} - -/** - * @brief Reset callback. - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ResetCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_SpeedTypeDef speed = USBD_SPEED_FULL; - - if ( hpcd->Init.speed != PCD_SPEED_FULL) - { - Error_Handler(); - } - /* Set Speed. */ - USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed); - - /* Reset Device. */ - USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData); -} - -/** - * @brief Suspend callback. - * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - /* Inform USB library that core enters in suspend Mode. */ - USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData); - __HAL_PCD_GATE_PHYCLOCK(hpcd); - /* Enter in STOP mode. */ - /* USER CODE BEGIN 2 */ - if (hpcd->Init.low_power_enable) - { - /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */ - SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); - } - /* USER CODE END 2 */ -} - -/** - * @brief Resume callback. - * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - /* USER CODE BEGIN 3 */ - - /* USER CODE END 3 */ - USBD_LL_Resume((USBD_HandleTypeDef*)hpcd->pData); -} - -/** - * @brief ISOOUTIncomplete callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint number - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#else -void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_IsoOUTIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); -} - -/** - * @brief ISOINIncomplete callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint number - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#else -void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_IsoINIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); -} - -/** - * @brief Connect callback. - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_DevConnected((USBD_HandleTypeDef*)hpcd->pData); -} - -/** - * @brief Disconnect callback. - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData); -} - -/******************************************************************************* - LL Driver Interface (USB Device Library --> PCD) -*******************************************************************************/ - -/** - * @brief Initializes the low level portion of the device driver. - * @param pdev: Device handle - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) -{ - /* Init USB Ip. */ - if (pdev->id == DEVICE_FS) { - /* Link the driver to the stack. */ - hpcd_USB_OTG_FS.pData = pdev; - pdev->pData = &hpcd_USB_OTG_FS; - - hpcd_USB_OTG_FS.Instance = USB_OTG_FS; - hpcd_USB_OTG_FS.Init.dev_endpoints = 4; - hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL; - hpcd_USB_OTG_FS.Init.dma_enable = DISABLE; - hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED; - hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE; - hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE; - hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE; - hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE; - hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE; - if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK) - { - Error_Handler( ); - } - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - /* Register USB PCD CallBacks */ - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SOF_CB_ID, PCD_SOFCallback); - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SETUPSTAGE_CB_ID, PCD_SetupStageCallback); - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_RESET_CB_ID, PCD_ResetCallback); - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SUSPEND_CB_ID, PCD_SuspendCallback); - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_RESUME_CB_ID, PCD_ResumeCallback); - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_CONNECT_CB_ID, PCD_ConnectCallback); - HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_DISCONNECT_CB_ID, PCD_DisconnectCallback); - - HAL_PCD_RegisterDataOutStageCallback(&hpcd_USB_OTG_FS, PCD_DataOutStageCallback); - HAL_PCD_RegisterDataInStageCallback(&hpcd_USB_OTG_FS, PCD_DataInStageCallback); - HAL_PCD_RegisterIsoOutIncpltCallback(&hpcd_USB_OTG_FS, PCD_ISOOUTIncompleteCallback); - HAL_PCD_RegisterIsoInIncpltCallback(&hpcd_USB_OTG_FS, PCD_ISOINIncompleteCallback); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x80); - HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40); - HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x80); - } - return USBD_OK; -} - -/** - * @brief De-Initializes the low level portion of the device driver. - * @param pdev: Device handle - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_DeInit(pdev->pData); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Starts the low level portion of the device driver. - * @param pdev: Device handle - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_Start(pdev->pData); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Stops the low level portion of the device driver. - * @param pdev: Device handle - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_Stop(pdev->pData); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Opens an endpoint of the low level driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @param ep_type: Endpoint type - * @param ep_mps: Endpoint max packet size - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Closes an endpoint of the low level driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_Close(pdev->pData, ep_addr); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Flushes an endpoint of the Low Level Driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_Flush(pdev->pData, ep_addr); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Sets a Stall condition on an endpoint of the Low Level Driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_SetStall(pdev->pData, ep_addr); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Clears a Stall condition on an endpoint of the Low Level Driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_ClrStall(pdev->pData, ep_addr); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Returns Stall condition. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @retval Stall (1: Yes, 0: No) - */ -uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef*) pdev->pData; - - if((ep_addr & 0x80) == 0x80) - { - return hpcd->IN_ep[ep_addr & 0x7F].is_stall; - } - else - { - return hpcd->OUT_ep[ep_addr & 0x7F].is_stall; - } -} - -/** - * @brief Assigns a USB address to the device. - * @param pdev: Device handle - * @param dev_addr: Device address - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_SetAddress(pdev->pData, dev_addr); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Transmits data over an endpoint. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @param pbuf: Pointer to data to be sent - * @param size: Data size - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Prepares an endpoint for reception. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @param pbuf: Pointer to data to be received - * @param size: Data size - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) -{ - HAL_StatusTypeDef hal_status = HAL_OK; - USBD_StatusTypeDef usb_status = USBD_OK; - - hal_status = HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size); - - usb_status = USBD_Get_USB_Status(hal_status); - - return usb_status; -} - -/** - * @brief Returns the last transferred packet size. - * @param pdev: Device handle - * @param ep_addr: Endpoint number - * @retval Received Data Size - */ -uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef*) pdev->pData, ep_addr); -} - -#ifdef USBD_HS_TESTMODE_ENABLE -/** - * @brief Set High speed Test mode. - * @param pdev: Device handle - * @param testmode: test mode - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_SetTestMode(USBD_HandleTypeDef *pdev, uint8_t testmode) -{ - UNUSED(pdev); - UNUSED(testmode); - - return USBD_OK; -} -#endif /* USBD_HS_TESTMODE_ENABLE */ - -/** - * @brief Static single allocation. - * @param size: Size of allocated memory - * @retval None - */ -void *USBD_static_malloc(uint32_t size) -{ - static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef)/4)+1];/* On 32-bit boundary */ - return mem; -} - -/** - * @brief Dummy memory free - * @param p: Pointer to allocated memory address - * @retval None - */ -void USBD_static_free(void *p) -{ - -} - -/** - * @brief Delays routine for the USB Device Library. - * @param Delay: Delay in ms - * @retval None - */ -void USBD_LL_Delay(uint32_t Delay) -{ - HAL_Delay(Delay); -} - -/** - * @brief Returns the USB status depending on the HAL status: - * @param hal_status: HAL status - * @retval USB status - */ -USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status) -{ - USBD_StatusTypeDef usb_status = USBD_OK; - - switch (hal_status) - { - case HAL_OK : - usb_status = USBD_OK; - break; - case HAL_ERROR : - usb_status = USBD_FAIL; - break; - case HAL_BUSY : - usb_status = USBD_BUSY; - break; - case HAL_TIMEOUT : - usb_status = USBD_FAIL; - break; - default : - usb_status = USBD_FAIL; - break; - } - return usb_status; -} diff --git a/software/bootloader/USB_DEVICE/Target/usbd_conf.h b/software/bootloader/USB_DEVICE/Target/usbd_conf.h deleted file mode 100644 index 70f1ee2..0000000 --- a/software/bootloader/USB_DEVICE/Target/usbd_conf.h +++ /dev/null @@ -1,175 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usbd_conf.h - * @version : v1.0_Cube - * @brief : Header for usbd_conf.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CONF__H__ -#define __USBD_CONF__H__ - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include -#include -#include -#include "main.h" -#include "stm32f4xx.h" -#include "stm32f4xx_hal.h" - -/* USER CODE BEGIN INCLUDE */ - -void USER_USBD_LL_Simulate_Disconnect(void); - -/* USER CODE END INCLUDE */ - -/** @addtogroup USBD_OTG_DRIVER - * @brief Driver for Usb device. - * @{ - */ - -/** @defgroup USBD_CONF USBD_CONF - * @brief Configuration file for Usb otg low level driver. - * @{ - */ - -/** @defgroup USBD_CONF_Exported_Variables USBD_CONF_Exported_Variables - * @brief Public variables. - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Defines USBD_CONF_Exported_Defines - * @brief Defines for configuration of the Usb device. - * @{ - */ - -/*---------- -----------*/ -#define USBD_MAX_NUM_INTERFACES 1U -/*---------- -----------*/ -#define USBD_MAX_NUM_CONFIGURATION 1U -/*---------- -----------*/ -#define USBD_MAX_STR_DESC_SIZ 512U -/*---------- -----------*/ -#define USBD_DEBUG_LEVEL 0U -/*---------- -----------*/ -#define USBD_LPM_ENABLED 0U -/*---------- -----------*/ -#define USBD_SELF_POWERED 1U - -/****************************************/ -/* #define for FS and HS identification */ -#define DEVICE_FS 0 -#define DEVICE_HS 1 - -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Macros USBD_CONF_Exported_Macros - * @brief Aliases. - * @{ - */ -/* Memory management macros make sure to use static memory allocation */ -/** Alias for memory allocation. */ - -#define USBD_malloc (void *)USBD_static_malloc - -/** Alias for memory release. */ -#define USBD_free USBD_static_free - -/** Alias for memory set. */ -#define USBD_memset memset - -/** Alias for memory copy. */ -#define USBD_memcpy memcpy - -/** Alias for delay. */ -#define USBD_Delay HAL_Delay - -/* DEBUG macros */ - -#if (USBD_DEBUG_LEVEL > 0) -#define USBD_UsrLog(...) printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBD_UsrLog(...) -#endif /* (USBD_DEBUG_LEVEL > 0U) */ - -#if (USBD_DEBUG_LEVEL > 1) - -#define USBD_ErrLog(...) printf("ERROR: ");\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBD_ErrLog(...) -#endif /* (USBD_DEBUG_LEVEL > 1U) */ - -#if (USBD_DEBUG_LEVEL > 2) -#define USBD_DbgLog(...) printf("DEBUG : ");\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBD_DbgLog(...) -#endif /* (USBD_DEBUG_LEVEL > 2U) */ - -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Types USBD_CONF_Exported_Types - * @brief Types. - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_FunctionsPrototype USBD_CONF_Exported_FunctionsPrototype - * @brief Declaration of public functions for Usb device. - * @{ - */ - -/* Exported functions -------------------------------------------------------*/ -void *USBD_static_malloc(uint32_t size); -void USBD_static_free(void *p); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CONF__H__ */ - diff --git a/software/bootloader/Ymodem/common.c b/software/bootloader/Ymodem/common.c deleted file mode 100644 index ff7c5ae..0000000 --- a/software/bootloader/Ymodem/common.c +++ /dev/null @@ -1,346 +0,0 @@ -/** - ****************************************************************************** - * @file STM32F4xx_IAP/src/common.c - * @author MCD Application Team - * @version V1.0.0 - * @date 10-October-2011 - * @brief This file provides all the common functions. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/** @addtogroup STM32F4xx_IAP - * @{ - */ - -/* Includes ------------------------------------------------------------------*/ -#include "common.h" -#include "usbd_cdc_if.h" -#include "usbd_core.h" // ?????????????? -#include "usb_device.h" // ?????? hUsbDeviceFS - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -// ?? usbd_cdc_if.c ???? -extern uint8_t USB_RxBuffer[]; -extern volatile uint16_t USB_RxHead; -extern volatile uint16_t USB_RxTail; - -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief Convert an Integer to a string - * @param str: The string - * @param intnum: The integer to be converted - * @retval None - */ -void Int2Str(uint8_t* str, int32_t intnum) -{ - uint32_t i, Div = 1000000000, j = 0, Status = 0; - - for (i = 0; i < 10; i++) - { - str[j++] = (intnum / Div) + 48; - - intnum = intnum % Div; - Div /= 10; - if ((str[j-1] == '0') & (Status == 0)) - { - j = 0; - } - else - { - Status++; - } - } -} - -/** - * @brief Convert a string to an integer - * @param inputstr: The string to be converted - * @param intnum: The integer value - * @retval 1: Correct - * 0: Error - */ -uint32_t Str2Int(uint8_t *inputstr, int32_t *intnum) -{ - uint32_t i = 0, res = 0; - uint32_t val = 0; - - if (inputstr[0] == '0' && (inputstr[1] == 'x' || inputstr[1] == 'X')) - { - if (inputstr[2] == '\0') - { - return 0; - } - for (i = 2; i < 11; i++) - { - if (inputstr[i] == '\0') - { - *intnum = val; - /* return 1; */ - res = 1; - break; - } - if (ISVALIDHEX(inputstr[i])) - { - val = (val << 4) + CONVERTHEX(inputstr[i]); - } - else - { - /* Return 0, Invalid input */ - res = 0; - break; - } - } - /* Over 8 digit hex --invalid */ - if (i >= 11) - { - res = 0; - } - } - else /* max 10-digit decimal input */ - { - for (i = 0;i < 11;i++) - { - if (inputstr[i] == '\0') - { - *intnum = val; - /* return 1 */ - res = 1; - break; - } - else if ((inputstr[i] == 'k' || inputstr[i] == 'K') && (i > 0)) - { - val = val << 10; - *intnum = val; - res = 1; - break; - } - else if ((inputstr[i] == 'm' || inputstr[i] == 'M') && (i > 0)) - { - val = val << 20; - *intnum = val; - res = 1; - break; - } - else if (ISVALIDDEC(inputstr[i])) - { - val = val * 10 + CONVERTDEC(inputstr[i]); - } - else - { - /* return 0, Invalid input */ - res = 0; - break; - } - } - /* Over 10 digit decimal --invalid */ - if (i >= 11) - { - res = 0; - } - } - - return res; -} - -/** - * @brief Get an integer from the USB VCP - * @param num: The integer - * @retval 1: Correct - * 0: Error - */ -uint32_t GetIntegerInput(int32_t * num) -{ - uint8_t inputstr[16]; - - while (1) - { - GetInputString(inputstr); - if (inputstr[0] == '\0') continue; - if ((inputstr[0] == 'a' || inputstr[0] == 'A') && inputstr[1] == '\0') - { - USB_PutString("User Cancelled \r\n"); - return 0; - } - - if (Str2Int(inputstr, num) == 0) - { - USB_PutString("Error, Input again: \r\n"); - } - else - { - return 1; - } - } -} - -/** - * @brief Test to see if a key has been pressed on the USB VCP - * @param key: The key pressed - * @retval 1: A key was received - * 0: No key was received - */ -uint32_t USB_KeyPressed(uint8_t *key) -{ - // Check if there is data in the USB receive ring buffer - if (USB_RxHead != USB_RxTail) - { - *key = USB_RxBuffer[USB_RxTail]; - USB_RxTail = (USB_RxTail + 1) % 2048; // APP_RX_DATA_SIZE - return 1; - } - else - { - return 0; - } -} - -/** - * @brief Get a key from the USB VCP - * @param None - * @retval The Key Pressed - */ -uint8_t GetKey(void) -{ - uint8_t key = 0; - - /* Waiting for user input */ - while (1) - { - if (USB_KeyPressed((uint8_t*)&key)) break; - } - return key; - -} - - -uint8_t USB_GetChar(uint8_t *c, uint32_t timeout) -{ - uint32_t tickstart = HAL_GetTick(); - - while (1) - { - if (USB_RxHead != USB_RxTail) - { - *c = USB_RxBuffer[USB_RxTail]; - USB_RxTail = (USB_RxTail + 1) % RING_BUFFER_SIZE; - return 0; - } - - if ((HAL_GetTick() - tickstart) > timeout) - { - return 1; - } - } -} - -/** - * @brief Send a char to the USB VCP - * @param c: The char to be sent - * @retval None - */ -void USB_PutChar(uint8_t c) -{ - static uint8_t temp_buf; - - if (hUsbDeviceFS.dev_state != USBD_STATE_CONFIGURED) return; - - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData; - while (hcdc->TxState != 0) {} - - temp_buf = c; - CDC_Transmit_FS(&temp_buf, 1); -} - -void USB_PutString(char *s) -{ - if (hUsbDeviceFS.dev_state != USBD_STATE_CONFIGURED) - { - return; - } - - uint32_t len = strlen(s); - while (CDC_Transmit_FS((uint8_t*)s, len) == USBD_BUSY) - { - if (hUsbDeviceFS.dev_state != USBD_STATE_CONFIGURED) - { - return; - } - } -} - -/** - * @brief Get Input string from the HyperTerminal - * @param buffP: The input string - * @retval None - */ -void GetInputString (uint8_t * buffP) -{ - uint32_t bytes_read = 0; - uint8_t c = 0; - do - { - c = GetKey(); - if (c == '\r') - break; - if (c == '\b') /* Backspace */ - { - if (bytes_read > 0) - { - USB_PutString("\b \b"); - bytes_read --; - } - continue; - } - if (bytes_read >= CMD_STRING_SIZE ) - { - USB_PutString("Command string size overflow\r\n"); - bytes_read = 0; - continue; - } - if (c >= 0x20 && c <= 0x7E) - { - buffP[bytes_read++] = c; - USB_PutChar(c); - } - } - while (1); - USB_PutString(("\n\r")); - buffP[bytes_read] = '\0'; -} - -/** - * @brief Calculates the CRC32 of a given memory area. - * @param start_address: Start address of the data - * @param size: Size of the data in bytes - * @retval Calculated CRC32 value - */ -uint32_t Calculate_CRC32(uint32_t start_address, uint32_t size) -{ - // ??CRC???? - __HAL_RCC_CRC_CLK_ENABLE(); - CRC_HandleTypeDef CrcHandle; - CrcHandle.Instance = CRC; - HAL_CRC_Init(&CrcHandle); - - return HAL_CRC_Calculate(&CrcHandle, (uint32_t*)start_address, size / 4); -} - - -/*******************(C)COPYRIGHT 2011 STMicroelectronics *****END OF FILE******/ diff --git a/software/bootloader/Ymodem/common.h b/software/bootloader/Ymodem/common.h deleted file mode 100644 index 7492c8d..0000000 --- a/software/bootloader/Ymodem/common.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - ****************************************************************************** - * @file STM32F4xx_IAP/inc/common.h - * @author MCD Application Team - * @version V1.0.0 - * @date 10-October-2011 - * @brief This file provides all the headers of the common functions. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __COMMON_H -#define __COMMON_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Constants used by Serial Command Line Mode */ -#define CMD_STRING_SIZE 128 - -/* Common routines */ -#define IS_AF(c) ((c >= 'A') && (c <= 'F')) -#define IS_af(c) ((c >= 'a') && (c <= 'f')) -#define IS_09(c) ((c >= '0') && (c <= '9')) -#define ISVALIDHEX(c) IS_AF(c) || IS_af(c) || IS_09(c) -#define ISVALIDDEC(c) IS_09(c) -#define CONVERTDEC(c) (c - '0') - -#define CONVERTHEX_alpha(c) (IS_AF(c) ? (c - 'A'+10) : (c - 'a'+10)) -#define CONVERTHEX(c) (IS_09(c) ? (c - '0') : CONVERTHEX_alpha(c)) - -#define USBPutString(x) USB_PutString((uint8_t*)(x)) - -// 定义升级信息结构体 -typedef struct { - uint32_t magic_word; // 魔法字,如 0xDEADBEEF,用于标识此结构体有效 - uint32_t upgrade_status; // 升级状态标志 - uint32_t new_app_size; // 新APP的固件大小 - uint32_t new_app_crc32; // 新APP的CRC32校验和 -} UpgradeInfo_t; - -// 定义升级状态 -#define UPGRADE_STATUS_NONE 0xFFFFFFFF -#define UPGRADE_STATUS_START 0xABCD1234 -#define UPGRADE_STATUS_COMPLETE 0x5A5A5A5A -#define MAGIC_WORD 0xDEADBEEF - -/* Exported functions ------------------------------------------------------- */ -void Int2Str(uint8_t* str,int32_t intnum); -uint32_t Str2Int(uint8_t *inputstr,int32_t *intnum); -uint32_t GetIntegerInput(int32_t * num); -uint32_t USB_KeyPressed(uint8_t *key); -uint8_t GetKey(void); -void USB_PutChar(uint8_t c); -void USB_PutString(char *s); -void GetInputString(uint8_t * buffP); -uint32_t Calculate_CRC32(uint32_t start_address, uint32_t size); - -#endif /* __COMMON_H */ - -/*******************(C)COPYRIGHT 2011 STMicroelectronics *****END OF FILE******/ diff --git a/software/bootloader/Ymodem/flash_if.c b/software/bootloader/Ymodem/flash_if.c deleted file mode 100644 index f97cf09..0000000 --- a/software/bootloader/Ymodem/flash_if.c +++ /dev/null @@ -1,299 +0,0 @@ -/** - ****************************************************************************** - * @file STM32F4xx_IAP/src/flash_if.c - * @author MCD Application Team - * @version V1.0.0 - * @date 10-October-2011 - * @brief This file provides all the memory related operation functions. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/** @addtogroup STM32F4xx_IAP - * @{ - */ - -/* Includes ------------------------------------------------------------------*/ -#include "flash_if.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static uint32_t GetSector(uint32_t Address); - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief Unlocks Flash for write access - * @param None - * @retval None - */ -void FLASH_If_Init(void) -{ - HAL_FLASH_Unlock(); - - /* Clear pending flags (if any) */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | - FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR); - -} -/** - * @brief This function does an erase of all user flash area - * @param StartSector: start of user flash area - * @retval 0: user flash area successfully erased - * 1: error occurred - */ -uint32_t FLASH_If_Erase(uint32_t StartSector) -{ - uint32_t UserStartSector; - uint32_t SectorError; - FLASH_EraseInitTypeDef pEraseInit; - - /* Unlock the Flash to enable the flash control register access *************/ - - /* Get the sector where start the user flash area */ - UserStartSector = GetSector(APPLICATION_ADDRESS); - - pEraseInit.TypeErase = TYPEERASE_SECTORS; - pEraseInit.Sector = UserStartSector; - pEraseInit.NbSectors = GetSector(USER_FLASH_END_ADDRESS)-UserStartSector+1 ; - pEraseInit.VoltageRange = VOLTAGE_RANGE_3; - - if (HAL_FLASHEx_Erase(&pEraseInit, &SectorError) != HAL_OK) - { - /* Error occurred while page erase */ - return (1); - } - return (0); - -} - -/** - * @brief This function erase one sector - * @param StartSector: start of user flash area - * @retval 0: user flash area successfully erased - * 1: error occurred - */ -uint32_t FLASH_If_Erase_One_Sector(uint32_t StartSector) -{ - uint32_t SectorError; - FLASH_EraseInitTypeDef pEraseInit; - - pEraseInit.TypeErase = TYPEERASE_SECTORS; - pEraseInit.Sector = StartSector; - pEraseInit.NbSectors = 1 ; - pEraseInit.VoltageRange = VOLTAGE_RANGE_3; - - if (HAL_FLASHEx_Erase(&pEraseInit, &SectorError) != HAL_OK) - { - /* Error occurred while page erase */ - return (1); - } - return (0); - -} - -/** - * @brief This function writes a data buffer in flash (data are 32-bit aligned). - * @note After writing data buffer, the flash content is checked. - * @param FlashAddress: start address for writing data buffer - * @param Data: pointer on data buffer - * @param DataLength: length of data buffer (unit is 32-bit word) - * @retval 0: Data successfully written to Flash memory - * 1: Error occurred while writing data in Flash memory - * 2: Written Data in flash memory is different from expected one - */ -uint32_t FLASH_If_Write(__IO uint32_t* FlashAddress, uint32_t* Data ,uint32_t DataLength) -{ - uint32_t i = 0; - - for (i = 0; (i < DataLength) && (*FlashAddress <= (USER_FLASH_END_ADDRESS-4)); i++) - { - /* Device voltage range supposed to be [2.7V to 3.6V], the operation will - be done by word */ - FLASH_ProgramWord(*FlashAddress, *(uint32_t*)(Data+i)); - /* Check the written value */ - if (*(uint32_t*)*FlashAddress != *(uint32_t*)(Data+i)) - { - /* Flash content doesn't match SRAM content */ - return(2); - } - /* Increment FLASH destination address */ - *FlashAddress += 4; - } - - return (0); -} - -/** - * @brief Returns the write protection status of user flash area. - * @param None - * @retval 0: No write protected sectors inside the user flash area - * 1: Some sectors inside the user flash area are write protected - */ -uint16_t FLASH_If_GetWriteProtectionStatus(void) -{ - uint32_t UserStartSector = FLASH_SECTOR_1; - - /* Get the sector where start the user flash area */ - UserStartSector = GetSector(APPLICATION_ADDRESS); - - /* Check if there are write protected sectors inside the user flash area */ - if ((*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS) >> (UserStartSector/8)) == (0xFFF >> (UserStartSector/8))) - { /* No write protected sectors inside the user flash area */ - return 1; - } - else - { /* Some sectors inside the user flash area are write protected */ - return 0; - } -} - -/** - * @brief Disables the write protection of user flash area. - * @param None - * @retval 1: Write Protection successfully disabled - * 2: Error: Flash write unprotection failed - */ -uint32_t FLASH_If_DisableWriteProtection(void) -{ - __IO uint32_t UserStartSector = FLASH_SECTOR_1, UserWrpSectors = OB_WRP_SECTOR_1; - - /* Get the sector where start the user flash area */ - UserStartSector = GetSector(APPLICATION_ADDRESS); - - /* Mark all sectors inside the user flash area as non protected */ - UserWrpSectors = 0xFFF-((1 << (UserStartSector/8))-1); - - /* Unlock the Option Bytes */ - - HAL_FLASH_Unlock(); - /* Disable the write protection for all sectors inside the user flash area */ - FLASH_OB_DisableWRP(UserWrpSectors, FLASH_BANK_1); - - /* Start the Option Bytes programming process. */ - if (HAL_FLASH_OB_Launch( ) != HAL_OK) - { - /* Error: Flash write unprotection failed */ - return (2); - } - - /* Write Protection successfully disabled */ - return (1); -} - -/** - * @brief Gets the sector of a given address - * @param Address: Flash address - * @retval The sector of a given address - */ - -static uint32_t GetSector(uint32_t Address) -{ - uint32_t sector = 0; - - if((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0)) - { - sector = FLASH_SECTOR_0; - } - else if((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1)) - { - sector = FLASH_SECTOR_1; - } - else if((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2)) - { - sector = FLASH_SECTOR_2; - } - else if((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3)) - { - sector = FLASH_SECTOR_3; - } - else if((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4)) - { - sector = FLASH_SECTOR_4; - } - else if((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5)) - { - sector = FLASH_SECTOR_5; - } - else if((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6)) - { - sector = FLASH_SECTOR_6; - } - else/*(Address < FLASH_END_ADDR) && (Address >= ADDR_FLASH_SECTOR_7))*/ - { - sector = FLASH_SECTOR_7; - } -// else if((Address < ADDR_FLASH_SECTOR_8) && (Address >= ADDR_FLASH_SECTOR_7)) -// { -// sector = FLASH_SECTOR_7; -// } -// else if((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8)) -// { -// sector = FLASH_SECTOR_8; -// } -// else if((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9)) -// { -// sector = FLASH_SECTOR_9; -// } -// else if((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10)) -// { -// sector = FLASH_SECTOR_10; -// } -// else/*(Address < FLASH_END_ADDR) && (Address >= ADDR_FLASH_SECTOR_11))*/ -// { -// sector = FLASH_SECTOR_11; -// } - return sector; -} - - -HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(50000); - - if(status == HAL_OK) - { - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; - } - - return status; -} - - -void FLASH_ProgramWord(uint32_t Address, uint32_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint32_t*)Address = Data; -} -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/software/bootloader/Ymodem/flash_if.h b/software/bootloader/Ymodem/flash_if.h deleted file mode 100644 index 14dde77..0000000 --- a/software/bootloader/Ymodem/flash_if.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - ****************************************************************************** - * @file STM32F4xx_IAP/inc/flash_if.h - * @author MCD Application Team - * @version V1.0.0 - * @date 10-October-2011 - * @brief This file provides all the headers of the flash_if functions. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __FLASH_IF_H -#define __FLASH_IF_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" -#include "main.h" -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Base address of the Flash sectors */ -#define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbyte */ -#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbyte */ -#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbyte */ -#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbyte */ -#define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbyte */ -#define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbyte */ -#define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbyte */ -#define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbyte */ -// #define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbyte */ -// #define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbyte */ -// #define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbyte */ -// #define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbyte */ - -/* End of the Flash address */ -#define USER_FLASH_END_ADDRESS 0x0807FFFF -/* Define the user application size */ -#define USER_FLASH_SIZE (USER_FLASH_END_ADDRESS - APPLICATION_ADDRESS + 1) - -/* Define the address from where user application will be loaded. - Note: the 1st sector 0x08000000-0x0800FFFF is reserved for the IAP code */ -#define APPLICATION_ADDRESS ADDR_FLASH_SECTOR_4 - -/* Sector 3 (16KB) 被保留用作升级校验区 */ -#define UPGRADE_INFO_SECTOR_ADDR ADDR_FLASH_SECTOR_3 -#define UPGRADE_INFO_SECTOR_NUM FLASH_SECTOR_3 -#define UPGRADE_INFO_ADDRESS UPGRADE_INFO_SECTOR_ADDR - -/* Exported types ------------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void FLASH_If_Init(void); -uint32_t FLASH_If_Erase(uint32_t StartSector); -uint32_t FLASH_If_Erase_One_Sector(uint32_t StartSector); -uint32_t FLASH_If_Write(__IO uint32_t* FlashAddress, uint32_t* Data, uint32_t DataLength); -uint16_t FLASH_If_GetWriteProtectionStatus(void); -uint32_t FLASH_If_DisableWriteProtection(void); - -// -void FLASH_ProgramWord(uint32_t Address, uint32_t Data); -HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks); - -#endif /* __FLASH_IF_H */ - -/*******************(C)COPYRIGHT 2011 STMicroelectronics *****END OF FILE******/ diff --git a/software/bootloader/Ymodem/menu.c b/software/bootloader/Ymodem/menu.c deleted file mode 100644 index c3ea23a..0000000 --- a/software/bootloader/Ymodem/menu.c +++ /dev/null @@ -1,302 +0,0 @@ -/** - ****************************************************************************** - * @file STM32F4xx_IAP/src/menu.c - * @author MCD Application Team - * @version V1.0.0 - * @date 10-October-2011 - * @brief This file provides the software which contains the main menu routine. - * The main menu gives the options of: - * - downloading a new binary file, - * - uploading internal flash memory, - * - executing the binary file already loaded - * - disabling the write protection of the Flash sectors where the - * user loads his binary file. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/** @addtogroup STM32F4xx_IAP - * @{ - */ - -/* Includes ------------------------------------------------------------------*/ -#include "common.h" -#include "flash_if.h" -#include "menu.h" -#include "ymodem.h" -#include "string.h" -#include "usb_device.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -pFunction Jump_To_Application; -uint32_t JumpAddress; -__IO uint32_t FlashProtection = 0; -uint8_t tab_1024[1024] = - { - 0 - }; -uint8_t FileName[FILE_NAME_LENGTH]; - -/* Private function prototypes -----------------------------------------------*/ -void USB_Download(void); - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief Writes the UpgradeInfo structure to the dedicated Flash sector. - * @param info: pointer to the UpgradeInfo_t structure - * @retval None - */ -static void Write_Upgrade_Info(UpgradeInfo_t* info) -{ - // 1. 擦除专门用于校验的 Sector 3 - FLASH_If_Erase_One_Sector(UPGRADE_INFO_SECTOR_NUM); - // 2. 写入升级信息 - uint32_t flash_address = UPGRADE_INFO_ADDRESS; - FLASH_If_Write((__IO uint32_t*)&flash_address, (uint32_t*)info, sizeof(UpgradeInfo_t) / 4); -} - -/** - * @brief Reads the UpgradeInfo structure from the dedicated Flash sector. - * @param info: pointer to the UpgradeInfo_t structure to be filled - * @retval None - */ -static void Read_Upgrade_Info(UpgradeInfo_t* info) -{ - memcpy(info, (void*)UPGRADE_INFO_ADDRESS, sizeof(UpgradeInfo_t)); -} - -// Int-to-Hex函数 -static void Int2Hex(uint8_t* str, uint32_t intnum) -{ - const char hex_chars[] = "0123456789ABCDEF"; - for (int i = 0; i < 8; i++) - { - str[7 - i] = hex_chars[intnum & 0x0F]; - intnum >>= 4; - } - str[8] = '\0'; -} - -/** - * @brief Download a file via serial port - * @param None - * @retval None - */ -void USB_Download(void) -{ - UpgradeInfo_t received_info; - uint8_t Number[10] = " "; - int32_t file_size = 0; - - // user operation - // 1. 接收元数据 - USB_PutString("Waiting for the file to be sent ... (press 'a' to abort)\n\r"); - // 2. 擦除整个APP区域 - USB_PutString("Erasing Application Area...\r\n"); - if (FLASH_If_Erase(APPLICATION_ADDRESS) != 0) - { - USB_PutString("Error: Failed to erase application area!\r\n"); - return; - } - USB_PutString("Erase Complete.\r\n"); - /* Waiting for file sent */ - USB_PutString("Starting Ymodem Receive\n\r"); - file_size = Ymodem_Receive(&tab_1024[0]); - if (file_size > 0) - { - - USB_PutString("\n\n\r File reception complete. Verifying...\n\r"); - // 4. 最终校验 - // 理想情况下,这里应该有一个从上位机获取的CRC32值进行对比, 此处不对比 - uint32_t calculated_crc = Calculate_CRC32(APPLICATION_ADDRESS, file_size); - - // 5. 写入校验信息到Flash末尾 - received_info.magic_word = MAGIC_WORD; - received_info.upgrade_status = UPGRADE_STATUS_COMPLETE; // 标记为升级完成 - received_info.new_app_size = file_size; - received_info.new_app_crc32 = calculated_crc; - Write_Upgrade_Info(&received_info); - USB_PutString("Verification and Flag Set successful!\r\n"); - USB_PutString("--------------------------------\r\n Name: "); - USB_PutString(FileName); - Int2Str(Number, file_size); - USB_PutString("\n\r Size: "); - USB_PutString(Number); - USB_PutString(" Bytes\r\n"); - USB_PutString(" CRC32: 0x"); - uint8_t calculated_crc_str[9]; - Int2Hex(calculated_crc_str, calculated_crc); - USB_PutString(calculated_crc_str); - USB_PutString("\r\n-------------------\n"); - USB_PutString("Please reboot the device.\r\n"); - } - else /* An error occurred while writing to Flash memory */ - { - FLASH_If_Erase_One_Sector(UPGRADE_INFO_SECTOR_NUM); // 擦除升级校验区,避免误跳转 - USB_PutString("\n\rUpgrade failed!\r\n"); - if (file_size == -1) - { - USB_PutString("\n\n\rThe image size is higher than the allowed space memory!\n\r"); - } - else if (file_size == -2) - { - USB_PutString("\n\n\rVerification failed!\n\r"); - } - else if (file_size == -3) - { - USB_PutString("\r\n\nAborted by user.\n\r"); - } - else - { - USB_PutString("\n\rFailed to receive the file!\n\r"); - } - - } -} - -/** - * @brief Display the Main Menu on HyperTerminal - * @param None - * @retval None - */ -void Main_Menu(void) -{ - uint8_t key = 0; - - USB_PutString("\r\n======================================================================"); - USB_PutString("\r\n= (C) COPYRIGHT 2011 STMicroelectronics ="); - USB_PutString("\r\n= ="); - USB_PutString("\r\n= STM32F4xx In-Application Programming Application (Version 1.0.0) ="); - USB_PutString("\r\n= ="); - USB_PutString("\r\n= By MCD Application Team ="); - USB_PutString("\r\n======================================================================"); - USB_PutString("\r\n\r\n"); - - /* Test if any sector of Flash memory where user application will be loaded is write protected */ - if (FLASH_If_GetWriteProtectionStatus() == 0) - { - FlashProtection = 1; - } - else - { - FlashProtection = 0; - } - - while (1) - { - USB_PutString("\r\n================== Main Menu ============================\r\n\n"); - USB_PutString(" Download Image To the STM32F4xx Internal Flash ------- 1\r\n\n"); - USB_PutString(" Upload Image From the STM32F4xx Internal Flash ------- 2\r\n\n"); - USB_PutString(" Execute The New Program ------------------------------ 3\r\n\n"); - - if(FlashProtection != 0) - { - USB_PutString(" Disable the write protection ------------------------- 4\r\n\n"); - } - - USB_PutString("==========================================================\r\n\n"); - - /* Receive key */ - key = GetKey(); - - if (key == 0x31) - { - /* Download user application in the Flash */ - USB_Download(); - } - else if (key == 0x32) - { - /* Upload user application from the Flash */ - // USB_Upload(); - USB_PutString("This function is disabled! Please Use 1\r"); - } - else if (key == 0x33) /* execute the new program */ - { - USB_PutString("Start to execute the user application...\r\n"); - HAL_Delay(1000); - jump_to_app(); - } - else if ((key == 0x34) && (FlashProtection == 1)) - { - /* Disable the write protection */ - switch (FLASH_If_DisableWriteProtection()) - { - case 1: - { - USB_PutString("Write Protection disabled...\r\n"); - FlashProtection = 0; - break; - } - case 2: - { - USB_PutString("Error: Flash write unprotection failed...\r\n"); - break; - } - default: - { - } - } - } - else - { - if (FlashProtection == 0) - { - USB_PutString("Invalid Number ! ==> The number should be either 1, 2 or 3\r"); - } - else - { - USB_PutString("Invalid Number ! ==> The number should be either 1, 2, 3 or 4\r"); - } - } - } -} - -/* Public functions ---------------------------------------------------------*/ - -/** - * @brief Jumps to the user application loaded in the Flash memory. - * @param None - * @retval None - */ -void jump_to_app(void) -{ - USER_USB_DEVICE_DeInit(); - // 给予PC足够的时间来识别设备断开 - HAL_Delay(500); - HAL_RCC_DeInit(); - HAL_DeInit(); - //user code here - SysTick->CTRL = 0X00;//禁止SysTick - SysTick->LOAD = 0; - SysTick->VAL = 0; - __disable_irq(); - - //set JumpAddress - JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4); - /* Jump to user application */ - Jump_To_Application = (pFunction) JumpAddress; - /* Initialize user application's Stack Pointer */ - __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); - Jump_To_Application(); -} - -/** - * @} - */ - -/*******************(C)COPYRIGHT 2011 STMicroelectronics *****END OF FILE******/ diff --git a/software/bootloader/Ymodem/menu.h b/software/bootloader/Ymodem/menu.h deleted file mode 100644 index 362f27b..0000000 --- a/software/bootloader/Ymodem/menu.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - ****************************************************************************** - * @file STM32F4xx_IAP/inc/menu.h - * @author MCD Application Team - * @version V1.0.0 - * @date 10-October-2011 - * @brief This file provides all the headers of the menu functions. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MENU_H -#define __MENU_H - -/* Includes ------------------------------------------------------------------*/ -#include "flash_if.h" - -/* Private variables ---------------------------------------------------------*/ -typedef void (*pFunction)(void); - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void Main_Menu(void); -void jump_to_app(void); - -#endif /* __MENU_H */ - -/*******************(C)COPYRIGHT 2011 STMicroelectronics *****END OF FILE******/ diff --git a/software/bootloader/Ymodem/ymodem.c b/software/bootloader/Ymodem/ymodem.c deleted file mode 100644 index 7c9bdf2..0000000 --- a/software/bootloader/Ymodem/ymodem.c +++ /dev/null @@ -1,671 +0,0 @@ -/** - ****************************************************************************** - * @file STM32F4xx_IAP/src/ymodem.c - * @author MCD Application Team - * @version V1.0.0 - * @date 10-October-2011 - * @brief This file provides all the software functions related to the ymodem - * protocol. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - - -/* Includes ------------------------------------------------------------------*/ -#include "flash_if.h" -#include "common.h" -#include "ymodem.h" -#include "string.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -extern uint8_t FileName[]; - -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief Receive byte from sender - * @param c: Character - * @param timeout: Timeout - * @retval 0: Byte received - * -1: Timeout - */ -static int32_t Receive_Byte (uint8_t *c, uint32_t timeout) -{ - while (timeout-- > 0) - { - if (USB_KeyPressed(c) == 1) - { - return 0; - } - } - return -1; -} - -/** - * @brief Send a byte - * @param c: Character - * @retval 0: Byte sent - */ -static uint32_t Send_Byte (uint8_t c) -{ - USB_PutChar(c); - return 0; -} - -/** - * @brief Receive a packet from sender - * @param data - * @param length - * @param timeout - * 0: end of transmission - * -1: abort by sender - * >0: packet length - * @retval 0: normally return - * -1: timeout or packet error - * 1: abort by user - */ -static int32_t Receive_Packet (uint8_t *data, int32_t *length, uint32_t timeout) -{ - uint16_t i, packet_size; - uint8_t c; - *length = 0; - if (Receive_Byte(&c, timeout) != 0) - { - return -1; - } - switch (c) - { - case SOH: - packet_size = PACKET_SIZE; - break; - case STX: - packet_size = PACKET_1K_SIZE; - break; - case EOT: - return 0; - case CA: - if ((Receive_Byte(&c, timeout) == 0) && (c == CA)) - { - *length = -1; - return 0; - } - else - { - return -1; - } - case ABORT1: - case ABORT2: - return 1; - default: - return -1; - } - *data = c; - for (i = 1; i < (packet_size + PACKET_OVERHEAD); i ++) - { - if (Receive_Byte(data + i, timeout) != 0) - { - return -1; - } - } - if (data[PACKET_SEQNO_INDEX] != ((data[PACKET_SEQNO_COMP_INDEX] ^ 0xff) & 0xff)) - { - return -1; - } - *length = packet_size; - return 0; -} - -/** - * @brief Receive a file using the ymodem protocol. - * @param buf: Address of the first byte. - * @retval The size of the file. - */ -int32_t Ymodem_Receive (uint8_t *buf) -{ - uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD], file_size[FILE_SIZE_LENGTH], *file_ptr, *buf_ptr; - int32_t i, packet_length, session_done, file_done, packets_received, errors, session_begin, size = 0; - uint32_t flashdestination, ramsource; - - /* Initialize flashdestination variable */ - flashdestination = APPLICATION_ADDRESS; - - for (session_done = 0, errors = 0, session_begin = 0; ;) - { - for (packets_received = 0, file_done = 0, buf_ptr = buf; ;) - { - switch (Receive_Packet(packet_data, &packet_length, NAK_TIMEOUT)) - { - case 0: - errors = 0; - switch (packet_length) - { - /* Abort by sender */ - case - 1: - Send_Byte(ACK); - return 0; - /* End of transmission */ - case 0: - Send_Byte(ACK); - file_done = 1; - break; - /* Normal packet */ - default: - if ((packet_data[PACKET_SEQNO_INDEX] & 0xff) != (packets_received & 0xff)) - { - Send_Byte(NAK); - } - else - { - if (packets_received == 0) - { - /* Filename packet */ - if (packet_data[PACKET_HEADER] != 0) - { - /* Filename packet has valid data */ - for (i = 0, file_ptr = packet_data + PACKET_HEADER; (*file_ptr != 0) && (i < FILE_NAME_LENGTH);) - { - FileName[i++] = *file_ptr++; - } - FileName[i++] = '\0'; - for (i = 0, file_ptr ++; (*file_ptr != ' ') && (i < FILE_SIZE_LENGTH);) - { - file_size[i++] = *file_ptr++; - } - file_size[i++] = '\0'; - Str2Int(file_size, &size); - - /* Test the size of the image to be sent */ - /* Image size is greater than Flash size */ - if (size > (USER_FLASH_SIZE + 1)) - { - /* End session */ - Send_Byte(CA); - Send_Byte(CA); - return -1; - } - /* erase user application area */ - FLASH_If_Erase(APPLICATION_ADDRESS); - Send_Byte(ACK); - Send_Byte(CRC16); - } - /* Filename packet is empty, end session */ - else - { - Send_Byte(ACK); - file_done = 1; - session_done = 1; - break; - } - } - /* Data packet */ - else - { - memcpy(buf_ptr, packet_data + PACKET_HEADER, packet_length); - ramsource = (uint32_t)buf; - - /* Write received data in Flash */ - if (FLASH_If_Write(&flashdestination, (uint32_t*) ramsource, (uint16_t) packet_length/4) == 0) - { - Send_Byte(ACK); - } - else /* An error occurred while writing to Flash memory */ - { - /* End session */ - Send_Byte(CA); - Send_Byte(CA); - return -2; - } - } - packets_received ++; - session_begin = 1; - } - } - break; - case 1: - Send_Byte(CA); - Send_Byte(CA); - return -3; - default: - if (session_begin > 0) - { - errors ++; - } - if (errors > MAX_ERRORS) - { - Send_Byte(CA); - Send_Byte(CA); - return 0; - } - Send_Byte(CRC16); - break; - } - if (file_done != 0) - { - break; - } - } - if (session_done != 0) - { - break; - } - } - return (int32_t)size; -} - -/** - * @brief check response using the ymodem protocol - * @param buf: Address of the first byte - * @retval The size of the file - */ -int32_t Ymodem_CheckResponse(uint8_t c) -{ - return 0; -} - -/** - * @brief Prepare the first block - * @param timeout - * 0: end of transmission - * @retval None - */ -void Ymodem_PrepareIntialPacket(uint8_t *data, const uint8_t* fileName, uint32_t *length) -{ - uint16_t i, j; - uint8_t file_ptr[10]; - - /* Make first three packet */ - data[0] = SOH; - data[1] = 0x00; - data[2] = 0xff; - - /* Filename packet has valid data */ - for (i = 0; (fileName[i] != '\0') && (i < FILE_NAME_LENGTH);i++) - { - data[i + PACKET_HEADER] = fileName[i]; - } - - data[i + PACKET_HEADER] = 0x00; - - Int2Str (file_ptr, *length); - for (j =0, i = i + PACKET_HEADER + 1; file_ptr[j] != '\0' ; ) - { - data[i++] = file_ptr[j++]; - } - - for (j = i; j < PACKET_SIZE + PACKET_HEADER; j++) - { - data[j] = 0; - } -} - -/** - * @brief Prepare the data packet - * @param timeout - * 0: end of transmission - * @retval None - */ -void Ymodem_PreparePacket(uint8_t *SourceBuf, uint8_t *data, uint8_t pktNo, uint32_t sizeBlk) -{ - uint16_t i, size, packetSize; - uint8_t* file_ptr; - - /* Make first three packet */ - packetSize = sizeBlk >= PACKET_1K_SIZE ? PACKET_1K_SIZE : PACKET_SIZE; - size = sizeBlk < packetSize ? sizeBlk :packetSize; - if (packetSize == PACKET_1K_SIZE) - { - data[0] = STX; - } - else - { - data[0] = SOH; - } - data[1] = pktNo; - data[2] = (~pktNo); - file_ptr = SourceBuf; - - /* Filename packet has valid data */ - for (i = PACKET_HEADER; i < size + PACKET_HEADER;i++) - { - data[i] = *file_ptr++; - } - if ( size <= packetSize) - { - for (i = size + PACKET_HEADER; i < packetSize + PACKET_HEADER; i++) - { - data[i] = 0x1A; /* EOF (0x1A) or 0x00 */ - } - } -} - -/** - * @brief Update CRC16 for input byte - * @param CRC input value - * @param input byte - * @retval None - */ -uint16_t UpdateCRC16(uint16_t crcIn, uint8_t byte) -{ - uint32_t crc = crcIn; - uint32_t in = byte | 0x100; - - do - { - crc <<= 1; - in <<= 1; - if(in & 0x100) - ++crc; - if(crc & 0x10000) - crc ^= 0x1021; - } - - while(!(in & 0x10000)); - - return crc & 0xffffu; -} - - -/** - * @brief Cal CRC16 for YModem Packet - * @param data - * @param length - * @retval None - */ -uint16_t Cal_CRC16(const uint8_t* data, uint32_t size) -{ - uint32_t crc = 0; - const uint8_t* dataEnd = data+size; - - while(data < dataEnd) - crc = UpdateCRC16(crc, *data++); - - crc = UpdateCRC16(crc, 0); - crc = UpdateCRC16(crc, 0); - - return crc&0xffffu; -} - -/** - * @brief Cal Check sum for YModem Packet - * @param data - * @param length - * @retval None - */ -uint8_t CalChecksum(const uint8_t* data, uint32_t size) -{ - uint32_t sum = 0; - const uint8_t* dataEnd = data+size; - - while(data < dataEnd ) - sum += *data++; - - return (sum & 0xffu); -} - -/** - * @brief Transmit a data packet using the ymodem protocol - * @param data - * @param length - * @retval None - */ -void Ymodem_SendPacket(uint8_t *data, uint16_t length) -{ - uint16_t i; - i = 0; - while (i < length) - { - Send_Byte(data[i]); - i++; - } -} - -/** - * @brief Transmit a file using the ymodem protocol - * @param buf: Address of the first byte - * @retval The size of the file - */ -uint8_t Ymodem_Transmit (uint8_t *buf, const uint8_t* sendFileName, uint32_t sizeFile) -{ - - uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD]; - uint8_t filename[FILE_NAME_LENGTH]; - uint8_t *buf_ptr, tempCheckSum; - uint16_t tempCRC; - uint16_t blkNumber; - uint8_t receivedC[2], CRC16_F = 0, i; - uint32_t errors, ackReceived, size = 0, pktSize; - - errors = 0; - ackReceived = 0; - for (i = 0; i < (FILE_NAME_LENGTH - 1); i++) - { - filename[i] = sendFileName[i]; - } - CRC16_F = 1; - - /* Prepare first block */ - Ymodem_PrepareIntialPacket(&packet_data[0], filename, &sizeFile); - - do - { - /* Send Packet */ - Ymodem_SendPacket(packet_data, PACKET_SIZE + PACKET_HEADER); - - /* Send CRC or Check Sum based on CRC16_F */ - if (CRC16_F) - { - tempCRC = Cal_CRC16(&packet_data[3], PACKET_SIZE); - Send_Byte(tempCRC >> 8); - Send_Byte(tempCRC & 0xFF); - } - else - { - tempCheckSum = CalChecksum (&packet_data[3], PACKET_SIZE); - Send_Byte(tempCheckSum); - } - - /* Wait for Ack and 'C' */ - if (Receive_Byte(&receivedC[0], 10000) == 0) - { - if (receivedC[0] == ACK) - { - /* Packet transferred correctly */ - ackReceived = 1; - } - } - else - { - errors++; - } - }while (!ackReceived && (errors < 0x0A)); - - if (errors >= 0x0A) - { - return errors; - } - buf_ptr = buf; - size = sizeFile; - blkNumber = 0x01; - /* Here 1024 bytes package is used to send the packets */ - - - /* Resend packet if NAK for a count of 10 else end of communication */ - while (size) - { - /* Prepare next packet */ - Ymodem_PreparePacket(buf_ptr, &packet_data[0], blkNumber, size); - ackReceived = 0; - receivedC[0]= 0; - errors = 0; - do - { - /* Send next packet */ - if (size >= PACKET_1K_SIZE) - { - pktSize = PACKET_1K_SIZE; - - } - else - { - pktSize = PACKET_SIZE; - } - Ymodem_SendPacket(packet_data, pktSize + PACKET_HEADER); - /* Send CRC or Check Sum based on CRC16_F */ - /* Send CRC or Check Sum based on CRC16_F */ - if (CRC16_F) - { - tempCRC = Cal_CRC16(&packet_data[3], pktSize); - Send_Byte(tempCRC >> 8); - Send_Byte(tempCRC & 0xFF); - } - else - { - tempCheckSum = CalChecksum (&packet_data[3], pktSize); - Send_Byte(tempCheckSum); - } - - /* Wait for Ack */ - if ((Receive_Byte(&receivedC[0], 100000) == 0) && (receivedC[0] == ACK)) - { - ackReceived = 1; - if (size > pktSize) - { - buf_ptr += pktSize; - size -= pktSize; - if (blkNumber == (USER_FLASH_SIZE/1024)) - { - return 0xFF; /* error */ - } - else - { - blkNumber++; - } - } - else - { - buf_ptr += pktSize; - size = 0; - } - } - else - { - errors++; - } - }while(!ackReceived && (errors < 0x0A)); - /* Resend packet if NAK for a count of 10 else end of communication */ - - if (errors >= 0x0A) - { - return errors; - } - - } - ackReceived = 0; - receivedC[0] = 0x00; - errors = 0; - do - { - Send_Byte(EOT); - /* Send (EOT); */ - /* Wait for Ack */ - if ((Receive_Byte(&receivedC[0], 10000) == 0) && receivedC[0] == ACK) - { - ackReceived = 1; - } - else - { - errors++; - } - }while (!ackReceived && (errors < 0x0A)); - - if (errors >= 0x0A) - { - return errors; - } - - /* Last packet preparation */ - ackReceived = 0; - receivedC[0] = 0x00; - errors = 0; - - packet_data[0] = SOH; - packet_data[1] = 0; - packet_data [2] = 0xFF; - - for (i = PACKET_HEADER; i < (PACKET_SIZE + PACKET_HEADER); i++) - { - packet_data [i] = 0x00; - } - - do - { - /* Send Packet */ - Ymodem_SendPacket(packet_data, PACKET_SIZE + PACKET_HEADER); - - /* Send CRC or Check Sum based on CRC16_F */ - tempCRC = Cal_CRC16(&packet_data[3], PACKET_SIZE); - Send_Byte(tempCRC >> 8); - Send_Byte(tempCRC & 0xFF); - - /* Wait for Ack and 'C' */ - if (Receive_Byte(&receivedC[0], 10000) == 0) - { - if (receivedC[0] == ACK) - { - /* Packet transferred correctly */ - ackReceived = 1; - } - } - else - { - errors++; - } - }while (!ackReceived && (errors < 0x0A)); - - /* Resend packet if NAK for a count of 10 else end of communication */ - if (errors >= 0x0A) - { - return errors; - } - - do - { - Send_Byte(EOT); - /* Send (EOT); */ - /* Wait for Ack */ - if ((Receive_Byte(&receivedC[0], 10000) == 0) && receivedC[0] == ACK) - { - ackReceived = 1; - } - else - { - errors++; - } - }while (!ackReceived && (errors < 0x0A)); - - if (errors >= 0x0A) - { - return errors; - } - return 0; /* file transmitted successfully */ -} - -/** - * @} - */ - -/*******************(C)COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/software/bootloader/Ymodem/ymodem.h b/software/bootloader/Ymodem/ymodem.h deleted file mode 100644 index 2192415..0000000 --- a/software/bootloader/Ymodem/ymodem.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - ****************************************************************************** - * @file STM32F4xx_IAP/inc/ymodem.h - * @author MCD Application Team - * @version V1.0.0 - * @date 10-October-2011 - * @brief This file provides all the software function headers of the ymodem.c - * file. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ -#include "stdint.h" -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __YMODEM_H_ -#define __YMODEM_H_ - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -#define PACKET_SEQNO_INDEX (1) -#define PACKET_SEQNO_COMP_INDEX (2) - -#define PACKET_HEADER (3) -#define PACKET_TRAILER (2) -#define PACKET_OVERHEAD (PACKET_HEADER + PACKET_TRAILER) -#define PACKET_SIZE (128) -#define PACKET_1K_SIZE (1024) - -#define FILE_NAME_LENGTH (256) -#define FILE_SIZE_LENGTH (16) - -#define SOH (0x01) /* start of 128-byte data packet */ -#define STX (0x02) /* start of 1024-byte data packet */ -#define EOT (0x04) /* end of transmission */ -#define ACK (0x06) /* acknowledge */ -#define NAK (0x15) /* negative acknowledge */ -#define CA (0x18) /* two of these in succession aborts transfer */ -#define CRC16 (0x43) /* 'C' == 0x43, request 16-bit CRC */ - -#define ABORT1 (0x41) /* 'A' == 0x41, abort by user */ -#define ABORT2 (0x61) /* 'a' == 0x61, abort by user */ - -#define NAK_TIMEOUT (0x100000) -#define MAX_ERRORS (5) - -/* Exported functions ------------------------------------------------------- */ -int32_t Ymodem_Receive (uint8_t *); -uint8_t Ymodem_Transmit (uint8_t *,const uint8_t* , uint32_t ); - -#endif /* __YMODEM_H_ */ - - -/*******************(C)COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/